diff --git a/.dockerignore b/.dockerignore index d280741c6062..0c013d18b13f 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,7 +1,3 @@ -**/.git -.git -!.git/HEAD -!.git/refs/heads **/*_test.go build/_workspace diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c03fa06c72d9..7ac7915f225c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -2,12 +2,22 @@ # Each line is a file pattern followed by one or more owners. accounts/usbwallet @karalabe +accounts/scwallet @gballet accounts/abi @gballet +cmd/clef @holiman +cmd/puppeth @karalabe consensus @karalabe -core/ @karalabe @holiman -eth/ @karalabe -les/ @zsfelfoldi -light/ @zsfelfoldi -mobile/ @karalabe +core/ @karalabe @holiman @rjl493456442 +dashboard/ @kurkomisi +eth/ @karalabe @holiman @rjl493456442 +graphql/ @gballet +les/ @zsfelfoldi @rjl493456442 +light/ @zsfelfoldi @rjl493456442 +mobile/ @karalabe @ligi p2p/ @fjl @zsfelfoldi +rpc/ @fjl @holiman +p2p/simulations @zelig @janos @justelad +p2p/protocols @zelig @janos @justelad +p2p/testing @zelig @janos @justelad +signer/ @holiman whisper/ @gballet @gluk256 diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index f915bf3a6ecf..f87996cdcb94 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -7,7 +7,7 @@ smallest of fixes! If you'd like to contribute to go-ethereum, please fork, fix, commit and send a pull request for the maintainers to review and merge into the main code base. If you wish to submit more complex changes though, please check up with the core -devs first on [our gitter channel](https://gitter.im/nebulaai/nbai-node) to +devs first on [our gitter channel](https://gitter.im/ethereum/go-ethereum) to ensure those changes are in line with the general philosophy of the project and/or get some early feedback which can make both your efforts much lighter as well as our review and merge procedures quick and simple. @@ -30,11 +30,11 @@ Please make sure your contributions adhere to our coding guidelines: Before you submit a feature request, please check and make sure that it isn't possible through some other means. The JavaScript-enabled console is a powerful feature in the right hands. Please check our -[Wiki page](https://github.com/nebulaai/nbai-node/wiki) for more info +[Wiki page](https://github.com/ethereum/go-ethereum/wiki) for more info and help. ## Configuration, dependencies, and tests -Please see the [Developers' Guide](https://github.com/nebulaai/nbai-node/wiki/Developers'-Guide) +Please see the [Developers' Guide](https://github.com/ethereum/go-ethereum/wiki/Developers'-Guide) for more details on configuring your environment, managing project dependencies and testing procedures. diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 7d80659b0d2e..4e638166ff71 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,6 +1,6 @@ Hi there, -please note that this is an issue tracker reserved for bug reports and feature requests. +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. diff --git a/.gitignore b/.gitignore index 3e0009e167f9..1ee8b83022ef 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,7 @@ build/_vendor/pkg # used by the Makefile /build/_workspace/ +/build/cache/ /build/bin/ /geth*.zip @@ -42,6 +43,7 @@ profile.cov /dashboard/assets/node_modules /dashboard/assets/stats.json /dashboard/assets/bundle.js +/dashboard/assets/bundle.js.map /dashboard/assets/package-lock.json **/yarn-error.log diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 000000000000..44fce8bea302 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,45 @@ +# This file configures github.com/golangci/golangci-lint. + +run: + timeout: 2m + tests: true + # default is true. Enables skipping of directories: + # vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ + skip-dirs-use-default: true + +linters: + disable-all: true + enable: + - deadcode + - goconst + - goimports + - gosimple + - govet + - ineffassign + - misspell + # - staticcheck + - unconvert + # - unused + - varcheck + +linters-settings: + gofmt: + simplify: true + goconst: + min-len: 3 # minimum length of string constant + min-occurrences: 6 # minimum number of occurrences + +issues: + exclude-rules: + - path: crypto/blake2b/ + linters: + - deadcode + - path: crypto/bn256/cloudflare + linters: + - deadcode + - path: p2p/discv5/ + linters: + - deadcode + - path: core/vm/instructions_test.go + linters: + - goconst diff --git a/.travis.yml b/.travis.yml index 0dec59631d93..9568c13ade7e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,33 +1,63 @@ language: go -go_import_path: github.com/nebulaai/nbai-node +go_import_path: github.com/ethereum/go-ethereum sudo: false -matrix: +jobs: include: - - os: linux - dist: trusty - sudo: required - go: 1.10.x + # This builder only tests code linters on latest version of Go + - stage: lint + os: linux + dist: xenial + go: 1.13.x + env: + - lint + git: + submodules: false # avoid cloning ethereum/tests 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 + - go run build/ci.go lint - # These are the latest Go versions. - - os: linux - dist: trusty - sudo: required + - stage: build + os: linux + dist: xenial go: 1.11.x + env: + - GO111MODULE=on 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 + - stage: build + os: linux + dist: xenial + go: 1.12.x + env: + - GO111MODULE=on + script: + - go run build/ci.go install + - go run build/ci.go test -coverage $TEST_PACKAGES + + # These are the latest Go versions. + - stage: build + os: linux + arch: amd64 + dist: xenial + go: 1.13.x + script: + - go run build/ci.go install + - go run build/ci.go test -coverage $TEST_PACKAGES + + - stage: build + if: type = pull_request + os: linux + arch: arm64 + dist: xenial + go: 1.13.x + script: + - go run build/ci.go install + - go run build/ci.go test -coverage $TEST_PACKAGES + + - stage: build + os: osx + go: 1.13.x script: - echo "Increase the maximum number of open file descriptors on macOS" - NOFILE=20480 @@ -41,22 +71,12 @@ matrix: - go run build/ci.go install - go run build/ci.go test -coverage $TEST_PACKAGES - # This builder only tests code linters on latest version of Go - - os: linux - dist: trusty - go: 1.11.x - env: - - lint - git: - submodules: false # avoid cloning ethereum/tests - script: - - go run build/ci.go lint - # This builder does the Ubuntu PPA upload - - if: type = push + - stage: build + if: type = push os: linux - dist: trusty - go: 1.11.x + dist: xenial + go: 1.13.x env: - ubuntu-ppa git: @@ -68,15 +88,19 @@ matrix: - debhelper - dput - fakeroot + - python-bzrlib + - python-paramiko script: - - go run build/ci.go debsrc -signer "Go Ethereum 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 -goversion 1.13.4 -upload ethereum/ethereum -sftp-user geth-ci -signer "Go Ethereum Linux Builder " # This builder does the Linux Azure uploads - - if: type = push + - stage: build + if: type = push os: linux - dist: trusty + dist: xenial sudo: required - go: 1.11.x + go: 1.13.x env: - azure-linux git: @@ -106,12 +130,13 @@ matrix: - go run build/ci.go archive -arch arm64 -type tar -signer LINUX_SIGNING_KEY -upload gethstore/builds # This builder does the Linux Azure MIPS xgo uploads - - if: type = push + - stage: build + if: type = push os: linux - dist: trusty + dist: xenial services: - docker - go: 1.11.x + go: 1.13.x env: - azure-linux-mips git: @@ -134,9 +159,10 @@ matrix: - go run build/ci.go archive -arch mips64le -type tar -signer LINUX_SIGNING_KEY -upload gethstore/builds # This builder does the Android Maven and Azure uploads - - if: type = push + - stage: build + if: type = push os: linux - dist: trusty + dist: xenial addons: apt: packages: @@ -156,25 +182,25 @@ matrix: git: submodules: false # avoid cloning ethereum/tests before_install: - - curl https://storage.googleapis.com/golang/go1.11.4.linux-amd64.tar.gz | tar -xz + - curl https://dl.google.com/go/go1.13.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 + - ln -s `pwd` $GOPATH/src/github.com/ethereum/go-ethereum - go run build/ci.go aar -signer ANDROID_SIGNING_KEY -deploy https://oss.sonatype.org -upload gethstore/builds # This builder does the OSX Azure, iOS CocoaPods and iOS Azure uploads - - if: type = push + - stage: build + if: type = push os: osx - go: 1.11.x + go: 1.13.x env: - azure-osx - azure-ios @@ -201,10 +227,11 @@ matrix: - go run build/ci.go xcode -signer IOS_SIGNING_KEY -deploy trunk -upload gethstore/builds # This builder does the Azure archive purges to avoid accumulating junk - - if: type = cron + - stage: build + if: type = cron os: linux - dist: trusty - go: 1.11.x + dist: xenial + go: 1.13.x env: - azure-purge git: diff --git a/AUTHORS b/AUTHORS index 609dc48c726b..526ea35c2f83 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,5 +1,11 @@ # This is the official list of go-ethereum authors for copyright purposes. +a e r t h +Abel Nieto +Abel Nieto +Adam Babik +Aditya +Adrià Cidre Afri Schoedon <5chdn@users.noreply.github.com> Agustin Armellini Fischer Airead @@ -10,165 +16,354 @@ Alex Leverington Alex Wu Alexandre Van de Sande Ali Hajimirza +am2rican5 +Andrea Franz +Andrey Petrov +Andrey Petrov +ANOTHEL +Antoine Rondelet Anton Evangelatov +Antonio Salazar Cardozo Arba Sasmoyo Armani Ferrante Armin Braun Aron Fischer +atsushi-ishibashi +ayeowch +b00ris +bailantaotao +baizhenxuan +Balint Gabor Bas van Kervel Benjamin Brent +benma Benoit Verkindt +bloonfield Bo Bo Ye Bob Glickstein +Brent Brian Schroeder +Bruno Škvorc +C. Brown +Caesar Chad Casey Detrio +CDsigma +changhong Chase Wright +Chen Quan +chenyufeng +Christian Muehlhaeuser Christoph Jentzsch +cong +Corey Lin <514971757@qq.com> +cpusoft +Crispin Flowerday +croath +cui <523516579@qq.com> +Dan Kinsley Daniel A. Nagy Daniel Sloof Darrel Herbst Dave Appleton +Dave McGregor +David Huie +Derek Gottfrid Diego Siqueira +Diep Pham +dipingxian2 <39109351+dipingxian2@users.noreply.github.com> +dm4 +Dmitrij Koniajev Dmitry Shulyak +Domino Valdano +Domino Valdano +Dragan Milic +dragonvslinux <35779158+dragononcrypto@users.noreply.github.com> Egon Elbre +Elad +Eli Elias Naur Elliot Shepherd +Emil +emile Enrique Fynn +Enrique Fynn +EOS Classic +Erichin Ernesto del Toro Ethan Buchman +ethersphere Eugene Valeyev Evangelos Pappas +Evgeny Evgeny Danilenko <6655321@bk.ru> +evgk Fabian Vogelsteller Fabio Barone Fabio Berger FaceHo Felix Lange +Ferenc Szabo +ferhat elmas Fiisio +Frank Szendzielarz <33515470+FrankSzendzielarz@users.noreply.github.com> Frank Wang +Franklin Furkan KAMACI +GagziW Gary Rong George Ornbo Gregg Dourgarian +Guilherme Salgado Guillaume Ballet Guillaume Nicolas +GuiltyMorishita +Gus Gustav Simonsson +Gísli Kristjánsson +Ha ĐANG +HackyMiner +hadv Hao Bryan Cheng +HAOYUatHZ <37070449+HAOYUatHZ@users.noreply.github.com> Henning Diedrich +holisticode +Hongbin Mao +Hsien-Tang Kao +Husam Ibrahim <39692071+HusamIbrahim@users.noreply.github.com> +hydai +Hyung-Kyu Hqueue Choi +Ian Macalinao +Ian Norden Isidoro Ghezzi +Iskander (Alex) Sharipov Ivan Daniluk +Ivo Georgiev Jae Kwon Jamie Pitts +Janos Guljas Janoš Guljaš Jason Carver +Javier Peletier +Javier Peletier +Javier Sagredo +Jay Jay Guo +Jaynti Kanani +Jeff Prestes Jeff R. Allen +Jeffery Robert Walsh Jeffrey Wilcke Jens Agerberg +Jeremy McNevin +Jeremy Schlatter +Jerzy Lasyk Jia Chenhui Jim McDonald +jkcomment Joel Burget +John C. Vernaleo +Johns Beharry +Jonas Jonathan Brown +JoranHonig +Jordan Krage Joseph Chow +jtakalai +JU HYEONG PARK Justin Clark-Casey Justin Drake +jwasinger +ken10100147 Kenji Siu +Kenso Trabing +Kenso Trabing +Kevin +kevin.xu +kiel barry +kimmylin <30611210+kimmylin@users.noreply.github.com> +Kitten King <53072918+kittenking@users.noreply.github.com> +knarfeh Kobi Gurkan Konrad Feldmeier +Kris Shinn Kurkó Mihály +Kushagra Sharma +Kwuaint <34888408+kwuaint@users.noreply.github.com> Kyuntae Ethan Kim +ledgerwatch Lefteris Karapetsas Leif Jurvetson Leo Shklovskii +LeoLiao Lewis Marshall +lhendre +Liang Ma +Liang Ma +Liang ZOU +libotony +ligi Lio李欧 +Lorenzo Manacorda Louis Holbrook Luca Zeug Magicking +manlio Maran Hidskes Marek Kotewicz +Marius van der Wijden Mark +Mark Rushakoff +mark.lin +Martin Alex Philip Dawson Martin Holst Swende +Martin Klepsch +Mats Julian Olsen +Matt K <1036969+mkrump@users.noreply.github.com> Matthew Di Ferrante +Matthew Halpern +Matthew Halpern Matthew Wampler-Doty +Max Sistemich Maximilian Meister Micah Zoltu Michael Ruminer Miguel Mota Miya Chen +Mohanson +mr_franklin +Mymskmkt <1847234666@qq.com> +Nalin Bhardwaj Nchinda Nchinda +necaremus +needkane <604476380@qq.com> +Nguyen Kien Trung +Nguyen Sy Thanh Son Nick Dodson Nick Johnson Nicolas Guillaume +Nilesh Trivedi +Nimrod Gutman +njupt-moon <1015041018@njupt.edu.cn> +nkbai +nobody Noman +Oleg Kovalov Oli Bye +Osuke +Paul Berg Paul Litvak Paulo L F Casaretto Paweł Bylica +Pedro Pombeiro +Peter Broadhurst Peter Pratscher Petr Mikusek +Philip Schlump +Pierre Neter +PilkyuJung +protolambda Péter Szilágyi -RJ Catalano +qd-ethan <31876119+qdgogogo@users.noreply.github.com> +Raghav Sood +Ralph Caraveo +Ralph Caraveo III Ramesh Nair +reinerRubin +rhaps107 Ricardo Catalinas Jiménez Ricardo Domingos Richard Hart +RJ Catalano Rob +Rob Mulholand Robert Zaremba +Roc Yu +Runchao Han Russ Cox +Ryan Schneider Rémy Roy S. Matthew English +salanfe +Samuel Marks +Sarlor +Sasuke1964 +Saulius Grigaitis +Sean +Sheldon <11510383@mail.sustc.edu.cn> +Sheldon <374662347@qq.com> Shintaro Kaneko +Shuai Qi +Shunsuke Watanabe +silence +Simon Jentzsch +slumber1122 +Smilenator Sorin Neacsu Stein Dekker +Steve Gattuso +Steve Ruckdashel Steve Waldman Steven Roose +stompesi +stormpang +sunxiaojun2014 +tamirms Taylor Gerring +TColl <38299499+TColl@users.noreply.github.com> +terasum Thomas Bocek +thomasmodeneis +thumb8432 Ti Zhou Tosh Camille +tsarpaul +tzapu +ult-bobonovski Valentin Wüstholz +Vedhavyas Singareddi Victor Farazdagi Victor Tran +Vie Viktor Trón Ville Sundell +vim88 Vincent G +Vincent Serpoul Vitalik Buterin +Vitaly Bogdanov Vitaly V Vivek Anand +Vlad +Vlad Bokov Vlad Gluhovsky +weimumu <934657014@qq.com> +Wenbiao Zheng +William Setzer +williambannas +Wuxiang +xiekeyang +xincaosu +yahtoo +YaoZengzeng +YH-Zhou Yohann Léon Yoichi Hirai Yondon Fu +YOSHIDA Masanori +yoza +Yusup Zach +zah Zahoor Mohamed +Zak Cole +zer0to0ne <36526113+zer0to0ne@users.noreply.github.com> +Zhenguo Niu Zoe Nolan Zsolt Felföldi -am2rican5 -ayeowch -b00ris -bailantaotao -baizhenxuan -bloonfield -changhong -evgk -ferhat elmas -holisticode -jtakalai -ken10100147 -ligi -mark.lin -necaremus -njupt-moon <1015041018@njupt.edu.cn> -nkbai -rhaps107 -slumber1122 -sunxiaojun2014 -terasum -tsarpaul -xiekeyang -yoza +Łukasz Kurowski ΞTHΞЯSPHΞЯΞ <{viktor.tron,nagydani,zsfelfoldi}@gmail.com> Максим Чусовлянов -Ralph Caraveo +大彬 +贺鹏飞 +유용환 <33824408+eric-yoo@users.noreply.github.com> diff --git a/Dockerfile b/Dockerfile index b982b42903cd..114e7620581e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ # Build Geth in a stock Go builder container -FROM golang:1.11-alpine as builder +FROM golang:1.13-alpine as builder -RUN apk add --no-cache make gcc musl-dev linux-headers +RUN apk add --no-cache make gcc musl-dev linux-headers git ADD . /go-ethereum RUN cd /go-ethereum && make geth @@ -12,5 +12,5 @@ FROM alpine:latest RUN apk add --no-cache ca-certificates COPY --from=builder /go-ethereum/build/bin/geth /usr/local/bin/ -EXPOSE 8545 8546 30332 30332/udp +EXPOSE 8545 8546 8547 30303 30303/udp ENTRYPOINT ["geth"] diff --git a/Dockerfile.alltools b/Dockerfile.alltools index 1a16a4475b21..2f661ba01c6f 100644 --- a/Dockerfile.alltools +++ b/Dockerfile.alltools @@ -1,7 +1,7 @@ # Build Geth in a stock Go builder container -FROM golang:1.11-alpine as builder +FROM golang:1.13-alpine as builder -RUN apk add --no-cache make gcc musl-dev linux-headers +RUN apk add --no-cache make gcc musl-dev linux-headers git ADD . /go-ethereum RUN cd /go-ethereum && make all @@ -12,4 +12,4 @@ FROM alpine:latest RUN apk add --no-cache ca-certificates COPY --from=builder /go-ethereum/build/bin/* /usr/local/bin/ -EXPOSE 8545 8546 30332 30332/udp +EXPOSE 8545 8546 8547 30303 30303/udp diff --git a/Makefile b/Makefile index 2e5733613340..474fe61ed52f 100644 --- a/Makefile +++ b/Makefile @@ -2,24 +2,19 @@ # with Go source code. If you know what GOPATH is then you probably # don't need to bother with make. -.PHONY: geth android ios geth-cross swarm evm all test clean +.PHONY: geth android ios geth-cross evm all test clean .PHONY: geth-linux geth-linux-386 geth-linux-amd64 geth-linux-mips64 geth-linux-mips64le .PHONY: geth-linux-arm geth-linux-arm-5 geth-linux-arm-6 geth-linux-arm-7 geth-linux-arm64 .PHONY: geth-darwin geth-darwin-386 geth-darwin-amd64 .PHONY: geth-windows geth-windows-386 geth-windows-amd64 -GOBIN = $(shell pwd)/build/bin +GOBIN = ./build/bin GO ?= latest -gnbai: - build/env.sh go run build/ci.go install ./cmd/gnbai +geth: + build/env.sh go run build/ci.go install ./cmd/geth @echo "Done building." - @echo "Run \"$(GOBIN)/gnbai\" to launch gnbai." - -swarm: - build/env.sh go run build/ci.go install ./cmd/swarm - @echo "Done building." - @echo "Run \"$(GOBIN)/swarm\" to launch swarm." + @echo "Run \"$(GOBIN)/geth\" to launch geth." all: build/env.sh go run build/ci.go install @@ -41,7 +36,7 @@ lint: ## Run linters. build/env.sh go run build/ci.go lint clean: - ./build/clean_go_build_cache.sh + go clean -cache rm -fr build/_workspace/pkg/ $(GOBIN)/* # The devtools target installs tools required for 'go generate'. @@ -57,9 +52,6 @@ devtools: @type "solc" 2> /dev/null || echo 'Please install solc' @type "protoc" 2> /dev/null || echo 'Please install protoc' -swarm-devtools: - env GOBIN= go install ./cmd/swarm/mimegen - # Cross Compilation Targets (xgo) geth-cross: geth-linux geth-darwin geth-windows geth-android geth-ios @@ -71,12 +63,12 @@ geth-linux: geth-linux-386 geth-linux-amd64 geth-linux-arm geth-linux-mips64 get @ls -ld $(GOBIN)/geth-linux-* geth-linux-386: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/386 -v ./cmd/gnbai + build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/386 -v ./cmd/geth @echo "Linux 386 cross compilation done:" @ls -ld $(GOBIN)/geth-linux-* | grep 386 geth-linux-amd64: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/amd64 -v ./cmd/gnbai + build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/amd64 -v ./cmd/geth @echo "Linux amd64 cross compilation done:" @ls -ld $(GOBIN)/geth-linux-* | grep amd64 @@ -85,42 +77,42 @@ geth-linux-arm: geth-linux-arm-5 geth-linux-arm-6 geth-linux-arm-7 geth-linux-ar @ls -ld $(GOBIN)/geth-linux-* | grep arm geth-linux-arm-5: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/arm-5 -v ./cmd/gnbai + build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/arm-5 -v ./cmd/geth @echo "Linux ARMv5 cross compilation done:" @ls -ld $(GOBIN)/geth-linux-* | grep arm-5 geth-linux-arm-6: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/arm-6 -v ./cmd/gnbai + build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/arm-6 -v ./cmd/geth @echo "Linux ARMv6 cross compilation done:" @ls -ld $(GOBIN)/geth-linux-* | grep arm-6 geth-linux-arm-7: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/arm-7 -v ./cmd/gnbai + build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/arm-7 -v ./cmd/geth @echo "Linux ARMv7 cross compilation done:" @ls -ld $(GOBIN)/geth-linux-* | grep arm-7 geth-linux-arm64: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/arm64 -v ./cmd/gnbai + build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/arm64 -v ./cmd/geth @echo "Linux ARM64 cross compilation done:" @ls -ld $(GOBIN)/geth-linux-* | grep arm64 geth-linux-mips: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/mips --ldflags '-extldflags "-static"' -v ./cmd/gnbai + build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/mips --ldflags '-extldflags "-static"' -v ./cmd/geth @echo "Linux MIPS cross compilation done:" @ls -ld $(GOBIN)/geth-linux-* | grep mips geth-linux-mipsle: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/mipsle --ldflags '-extldflags "-static"' -v ./cmd/gnbai + build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/mipsle --ldflags '-extldflags "-static"' -v ./cmd/geth @echo "Linux MIPSle cross compilation done:" @ls -ld $(GOBIN)/geth-linux-* | grep mipsle geth-linux-mips64: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/mips64 --ldflags '-extldflags "-static"' -v ./cmd/gnbai + build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/mips64 --ldflags '-extldflags "-static"' -v ./cmd/geth @echo "Linux MIPS64 cross compilation done:" @ls -ld $(GOBIN)/geth-linux-* | grep mips64 geth-linux-mips64le: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/mips64le --ldflags '-extldflags "-static"' -v ./cmd/gnbai + build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=linux/mips64le --ldflags '-extldflags "-static"' -v ./cmd/geth @echo "Linux MIPS64le cross compilation done:" @ls -ld $(GOBIN)/geth-linux-* | grep mips64le @@ -129,12 +121,12 @@ geth-darwin: geth-darwin-386 geth-darwin-amd64 @ls -ld $(GOBIN)/geth-darwin-* geth-darwin-386: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=darwin/386 -v ./cmd/gnbai + build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=darwin/386 -v ./cmd/geth @echo "Darwin 386 cross compilation done:" @ls -ld $(GOBIN)/geth-darwin-* | grep 386 geth-darwin-amd64: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=darwin/amd64 -v ./cmd/gnbai + build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=darwin/amd64 -v ./cmd/geth @echo "Darwin amd64 cross compilation done:" @ls -ld $(GOBIN)/geth-darwin-* | grep amd64 @@ -143,11 +135,11 @@ geth-windows: geth-windows-386 geth-windows-amd64 @ls -ld $(GOBIN)/geth-windows-* geth-windows-386: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=windows/386 -v ./cmd/gnbai + build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=windows/386 -v ./cmd/geth @echo "Windows 386 cross compilation done:" @ls -ld $(GOBIN)/geth-windows-* | grep 386 geth-windows-amd64: - build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=windows/amd64 -v ./cmd/gnbai + build/env.sh go run build/ci.go xgo -- --go=$(GO) --targets=windows/amd64 -v ./cmd/geth @echo "Windows amd64 cross compilation done:" @ls -ld $(GOBIN)/geth-windows-* | grep amd64 diff --git a/README.md b/README.md index a0d2309bb773..92a7125b4914 100644 --- a/README.md +++ b/README.md @@ -1,193 +1,348 @@ -## Go Nebula AI +## Go Ethereum -Fork from Official golang implementation of the Ethereum protocol. +Official Golang implementation of the Ethereum protocol. -Automated builds are available for stable releases and the unstable master branch. -Binary archives are published at https://github.com/nebulaai/nbai-node/releases. +[![API Reference]( +https://camo.githubusercontent.com/915b7be44ada53c290eb157634330494ebe3e30a/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f676f6c616e672f6764646f3f7374617475732e737667 +)](https://godoc.org/github.com/ethereum/go-ethereum) +[![Go Report Card](https://goreportcard.com/badge/github.com/ethereum/go-ethereum)](https://goreportcard.com/report/github.com/ethereum/go-ethereum) +[![Travis](https://travis-ci.org/ethereum/go-ethereum.svg?branch=master)](https://travis-ci.org/ethereum/go-ethereum) +[![Discord](https://img.shields.io/badge/discord-join%20chat-blue.svg)](https://discord.gg/nthXNEv) + +Automated builds are available for stable releases and the unstable master branch. Binary +archives are published at https://geth.ethereum.org/downloads/. ## Building the source -For prerequisites and detailed build instructions please read the -[Installation Instructions](https://github.com/nebulaai/nbai-node/wiki/Building-Nebula-AI) -on the wiki. +For prerequisites and detailed build instructions please read the [Installation Instructions](https://github.com/ethereum/go-ethereum/wiki/Building-Ethereum) on the wiki. -Building gnbai requires both a Go (version 1.7 or later) and a C compiler. -You can install them using your favourite package manager. -Once the dependencies are installed, run +Building `geth` requires both a Go (version 1.10 or later) and a C compiler. You can install +them using your favourite package manager. Once the dependencies are installed, run - make gnbai +```shell +make geth +``` or, to build the full suite of utilities: - make all +```shell +make all +``` ## Executables -The go-gnbai project comes with several wrappers/executables found in the `cmd` directory. +The go-ethereum project comes with several wrappers/executables found in the `cmd` +directory. -| Command | Description | -|:----------:|-------------| -| **`gnbai`** | Our main Nebula AI CLI client. It is the entry point into the Nebula AI network (main-, test- or private net), capable of running as a full node (default), archive node (retaining all historical state) or a light node (retrieving data live). It can be used by other processes as a gateway into the Ethereum network via JSON RPC endpoints exposed on top of HTTP, WebSocket and/or IPC transports. `gnbai --help` and the [CLI Wiki page](https://github.com/nebulaai/nbai-node/wiki/Command-Line-Options) for command line options. | -| `abigen` | Source code generator to convert Nebula AI contract definitions into easy to use, compile-time type-safe Go packages. It operates on plain [Ethereum contract ABIs](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI) with expanded functionality if the contract bytecode is also available. However it also accepts Solidity source files, making development much more streamlined. Please see our [Native DApps](https://github.com/nebulaai/nbai-node/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) wiki page for details. | -| `bootnode` | Stripped down version of our Nebula AI client implementation that only takes part in the network node discovery protocol, but does not run any of the higher level application protocols. It can be used as a lightweight bootstrap node to aid in finding peers in private networks. | -| `evm` | Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode. Its purpose is to allow isolated, fine-grained debugging of EVM opcodes (e.g. `evm --code 60ff60ff --debug`). | -| `swarm` | Swarm daemon and tools. This is the entrypoint for the Swarm network. `swarm --help` for command line options and subcommands. See [Swarm README](https://github.com/nebulaai/nbai-node/tree/master/swarm) for more information. | -| `puppeth` | a CLI wizard that aids in creating a new Nebula AI network. | +| Command | Description | +| :-----------: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **`geth`** | Our main Ethereum CLI client. It is the entry point into the Ethereum network (main-, test- or private net), capable of running as a full node (default), archive node (retaining all historical state) or a light node (retrieving data live). It can be used by other processes as a gateway into the Ethereum network via JSON RPC endpoints exposed on top of HTTP, WebSocket and/or IPC transports. `geth --help` and the [CLI Wiki page](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options) for command line options. | +| `abigen` | Source code generator to convert Ethereum contract definitions into easy to use, compile-time type-safe Go packages. It operates on plain [Ethereum contract ABIs](https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI) with expanded functionality if the contract bytecode is also available. However, it also accepts Solidity source files, making development much more streamlined. Please see our [Native DApps](https://github.com/ethereum/go-ethereum/wiki/Native-DApps:-Go-bindings-to-Ethereum-contracts) wiki page for details. | +| `bootnode` | Stripped down version of our Ethereum client implementation that only takes part in the network node discovery protocol, but does not run any of the higher level application protocols. It can be used as a lightweight bootstrap node to aid in finding peers in private networks. | +| `evm` | Developer utility version of the EVM (Ethereum Virtual Machine) that is capable of running bytecode snippets within a configurable environment and execution mode. Its purpose is to allow isolated, fine-grained debugging of EVM opcodes (e.g. `evm --code 60ff60ff --debug`). | +| `gethrpctest` | Developer utility tool to support our [ethereum/rpc-test](https://github.com/ethereum/rpc-tests) test suite which validates baseline conformity to the [Ethereum JSON RPC](https://github.com/ethereum/wiki/wiki/JSON-RPC) specs. Please see the [test suite's readme](https://github.com/ethereum/rpc-tests/blob/master/README.md) for details. | +| `rlpdump` | Developer utility tool to convert binary RLP ([Recursive Length Prefix](https://github.com/ethereum/wiki/wiki/RLP)) dumps (data encoding used by the Ethereum protocol both network as well as consensus wise) to user-friendlier hierarchical representation (e.g. `rlpdump --hex CE0183FFFFFFC4C304050583616263`). | +| `puppeth` | a CLI wizard that aids in creating a new Ethereum network. | -## Running gnbai +## Running `geth` Going through all the possible command line flags is out of scope here (please consult our -[CLI Wiki page](https://github.com/nebulaai/nbai-node/wiki/Command-Line-Options)), but we've -enumerated a few common parameter combos to get you up to speed quickly on how you can run your -own gnbai instance. +[CLI Wiki page](https://github.com/ethereum/go-ethereum/wiki/Command-Line-Options)), +but we've enumerated a few common parameter combos to get you up to speed quickly +on how you can run your own `geth` instance. -### Full node on the main Nebula AI network +### Full node on the main Ethereum network -By far the most common scenario is people wanting to simply interact with the Nebula AI network: -create accounts; transfer funds; deploy and interact with contracts. For this particular use-case -the user doesn't care about years-old historical data, so we can fast-sync quickly to the current -state of the network. To do so: +By far the most common scenario is people wanting to simply interact with the Ethereum +network: create accounts; transfer funds; deploy and interact with contracts. For this +particular use-case the user doesn't care about years-old historical data, so we can +fast-sync quickly to the current state of the network. To do so: -``` -$ gnbai console +```shell +$ geth console ``` This command will: + * Start `geth` in fast sync mode (default, can be changed with the `--syncmode` flag), + causing it to download more data in exchange for avoiding processing the entire history + of the Ethereum network, which is very CPU intensive. + * Start up `geth`'s built-in interactive [JavaScript console](https://github.com/ethereum/go-ethereum/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) + as well as `geth`'s own [management APIs](https://github.com/ethereum/go-ethereum/wiki/Management-APIs). + This tool is optional and if you leave it out you can always attach to an already running + `geth` instance with `geth attach`. + +### A Full node on the Ethereum test network + +Transitioning towards developers, if you'd like to play around with creating Ethereum +contracts, you almost certainly would like to do that without any real money involved until +you get the hang of the entire system. In other words, instead of attaching to the main +network, you want to join the **test** network with your node, which is fully equivalent to +the main network, but with play-Ether only. + +```shell +$ geth --testnet console +``` - * Start gnbai in fast sync mode (default, can be changed with the `--syncmode` flag), causing it to - download more data in exchange for avoiding processing the entire history of the Nebula AI network, - which is very CPU intensive. - * Start up gnbai's built-in interactive [JavaScript console](https://github.com/nebulaai/nbai-node/wiki/JavaScript-Console), - (via the trailing `console` subcommand) through which you can invoke all official [`web3` methods](https://github.com/nbaiai/wiki/wiki/JavaScript-API) - as well as gnbai's own [management APIs](https://github.com/nebulaai/nbai-node/wiki/Management-APIs). - This tool is optional and if you leave it out you can always attach to an already running gnbai instance - with `gnbai attach`. - +The `console` subcommand has the exact same meaning as above and they are equally +useful on the testnet too. Please see above for their explanations if you've skipped here. + +Specifying the `--testnet` flag, however, will reconfigure your `geth` instance a bit: + + * Instead of using the default data directory (`~/.ethereum` on Linux for example), `geth` + will nest itself one level deeper into a `testnet` subfolder (`~/.ethereum/testnet` on + Linux). Note, on OSX and Linux this also means that attaching to a running testnet node + requires the use of a custom endpoint since `geth attach` will try to attach to a + production node endpoint by default. E.g. + `geth attach /testnet/geth.ipc`. Windows users are not affected by + this. + * Instead of connecting the main Ethereum network, the client will connect to the test + network, which uses different P2P bootnodes, different network IDs and genesis states. + +*Note: Although there are some internal protective measures to prevent transactions from +crossing over between the main network and test network, you should make sure to always +use separate accounts for play-money and real-money. Unless you manually move +accounts, `geth` will by default correctly separate the two networks and will not make any +accounts available between them.* + +### Full node on the Rinkeby test network + +The above test network is a cross-client one based on the ethash proof-of-work consensus +algorithm. As such, it has certain extra overhead and is more susceptible to reorganization +attacks due to the network's low difficulty/security. Go Ethereum also supports connecting +to a proof-of-authority based test network called [*Rinkeby*](https://www.rinkeby.io) +(operated by members of the community). This network is lighter, more secure, but is only +supported by go-ethereum. + +```shell +$ geth --rinkeby console ``` ### Configuration -As an alternative to passing the numerous flags to the `gnbai` binary, you can also pass a configuration file via: +As an alternative to passing the numerous flags to the `geth` binary, you can also pass a +configuration file via: -``` -$ gnbai --config /path/to/your_config.toml +```shell +$ geth --config /path/to/your_config.toml ``` -To get an idea how the file should look like you can use the `dumpconfig` subcommand to export your existing configuration: +To get an idea how the file should look like you can use the `dumpconfig` subcommand to +export your existing configuration: +```shell +$ geth --your-favourite-flags dumpconfig ``` -$ gnbai --your-favourite-flags dumpconfig + +*Note: This works only with `geth` v1.6.0 and above.* + +#### Docker quick start + +One of the quickest ways to get Ethereum up and running on your machine is by using +Docker: + +```shell +docker run -d --name ethereum-node -v /Users/alice/ethereum:/root \ + -p 8545:8545 -p 30303:30303 \ + ethereum/client-go ``` -*Note: This works only with gnbai v0.0.1 and above.* +This will start `geth` in fast-sync mode with a DB memory allowance of 1GB just as the +above command does. It will also create a persistent volume in your home directory for +saving your blockchain as well as map the default ports. There is also an `alpine` tag +available for a slim version of the image. -### Programatically interfacing Gnbai nodes +Do not forget `--rpcaddr 0.0.0.0`, if you want to access RPC from other containers +and/or hosts. By default, `geth` binds to the local interface and RPC endpoints is not +accessible from the outside. -As a developer, sooner rather than later you'll want to start interacting with gnbai and the Nebula AI -network via your own programs and not manually through the console. To aid this, gnbai has built-in -support for a JSON-RPC based APIs ([standard APIs](https://github.com/nbaiai/wiki/wiki/JSON-RPC) and -[gnbai specific APIs](https://github.com/nebulaai/nbai-node/wiki/Management-APIs)). These can be -exposed via HTTP, WebSockets and IPC (unix sockets on unix based platforms, and named pipes on Windows). +### Programmatically interfacing `geth` nodes -The IPC interface is enabled by default and exposes all the APIs supported by gnbai, whereas the HTTP -and WS interfaces need to manually be enabled and only expose a subset of APIs due to security reasons. -These can be turned on/off and configured as you'd expect. +As a developer, sooner rather than later you'll want to start interacting with `geth` and the +Ethereum network via your own programs and not manually through the console. To aid +this, `geth` has built-in support for a JSON-RPC based APIs ([standard APIs](https://github.com/ethereum/wiki/wiki/JSON-RPC) +and [`geth` specific APIs](https://github.com/ethereum/go-ethereum/wiki/Management-APIs)). +These can be exposed via HTTP, WebSockets and IPC (UNIX sockets on UNIX based +platforms, and named pipes on Windows). + +The IPC interface is enabled by default and exposes all the APIs supported by `geth`, +whereas the HTTP and WS interfaces need to manually be enabled and only expose a +subset of APIs due to security reasons. These can be turned on/off and configured as +you'd expect. HTTP based JSON-RPC API options: * `--rpc` Enable the HTTP-RPC server - * `--rpcaddr` HTTP-RPC server listening interface (default: "localhost") - * `--rpcport` HTTP-RPC server listening port (default: 8545) - * `--rpcapi` API's offered over the HTTP-RPC interface (default: "eth,net,web3") + * `--rpcaddr` HTTP-RPC server listening interface (default: `localhost`) + * `--rpcport` HTTP-RPC server listening port (default: `8545`) + * `--rpcapi` API's offered over the HTTP-RPC interface (default: `eth,net,web3`) * `--rpccorsdomain` Comma separated list of domains from which to accept cross origin requests (browser enforced) * `--ws` Enable the WS-RPC server - * `--wsaddr` WS-RPC server listening interface (default: "localhost") - * `--wsport` WS-RPC server listening port (default: 8546) - * `--wsapi` API's offered over the WS-RPC interface (default: "eth,net,web3") + * `--wsaddr` WS-RPC server listening interface (default: `localhost`) + * `--wsport` WS-RPC server listening port (default: `8546`) + * `--wsapi` API's offered over the WS-RPC interface (default: `eth,net,web3`) * `--wsorigins` Origins from which to accept websockets requests * `--ipcdisable` Disable the IPC-RPC server - * `--ipcapi` API's offered over the IPC-RPC interface (default: "admin,debug,eth,miner,net,personal,shh,txpool,web3") + * `--ipcapi` API's offered over the IPC-RPC interface (default: `admin,debug,eth,miner,net,personal,shh,txpool,web3`) * `--ipcpath` Filename for IPC socket/pipe within the datadir (explicit paths escape it) -You'll need to use your own programming environments' capabilities (libraries, tools, etc) to connect -via HTTP, WS or IPC to a gnbai node configured with the above flags and you'll need to speak [JSON-RPC](http://www.jsonrpc.org/specification) -on all transports. You can reuse the same connection for multiple requests! +You'll need to use your own programming environments' capabilities (libraries, tools, etc) to +connect via HTTP, WS or IPC to a `geth` node configured with the above flags and you'll +need to speak [JSON-RPC](https://www.jsonrpc.org/specification) on all transports. You +can reuse the same connection for multiple requests! -**Note: Please understand the security implications of opening up an HTTP/WS based transport before -doing so! Hackers on the internet are actively trying to subvert Nebula AI nodes with exposed APIs! -Further, all browser tabs can access locally running webservers, so malicious webpages could try to -subvert locally available APIs!** +**Note: Please understand the security implications of opening up an HTTP/WS based +transport before doing so! Hackers on the internet are actively trying to subvert +Ethereum nodes with exposed APIs! Further, all browser tabs can access locally +running web servers, so malicious web pages could try to subvert locally available +APIs!** ### Operating a private network -Maintaining your own private network is more involved as a lot of configurations taken for granted in -the official networks need to be manually set up. +Maintaining your own private network is more involved as a lot of configurations taken for +granted in the official networks need to be manually set up. #### Defining the private genesis state -First, you'll need to create the genesis state of your networks, which all nodes need to be aware of -and agree upon. This consists of a small JSON file (e.g. call it `genesis.json`): +First, you'll need to create the genesis state of your networks, which all nodes need to be +aware of and agree upon. This consists of a small JSON file (e.g. call it `genesis.json`): ```json { "config": { - "chainId": 0, - "homesteadBlock": 0, - "eip155Block": 0, - "eip158Block": 0 - }, - "alloc" : {}, - "coinbase" : "0x0000000000000000000000000000000000000000", - "difficulty" : "0x20000", - "extraData" : "", - "gasLimit" : "0x2fefd8", - "nonce" : "0x0000000000000042", - "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000", - "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000", - "timestamp" : "0x00" + "chainId": , + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0 + }, + "alloc": {}, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x20000", + "extraData": "", + "gasLimit": "0x2fefd8", + "nonce": "0x0000000000000042", + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "0x00" } ``` -The above fields should be fine for most purposes, although we'd recommend changing the `nonce` to -some random value so you prevent unknown remote nodes from being able to connect to you. If you'd -like to pre-fund some accounts for easier testing, you can populate the `alloc` field with account -configs: +The above fields should be fine for most purposes, although we'd recommend changing +the `nonce` to some random value so you prevent unknown remote nodes from being able +to connect to you. If you'd like to pre-fund some accounts for easier testing, create +the accounts and populate the `alloc` field with their addresses. ```json "alloc": { - "0x0000000000000000000000000000000000000001": {"balance": "111111111"}, - "0x0000000000000000000000000000000000000002": {"balance": "222222222"} + "0x0000000000000000000000000000000000000001": { + "balance": "111111111" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "222222222" + } } ``` -With the genesis state defined in the above JSON file, you'll need to initialize **every** gnbai node -with it prior to starting it up to ensure all blockchain parameters are correctly set: +With the genesis state defined in the above JSON file, you'll need to initialize **every** +`geth` node with it prior to starting it up to ensure all blockchain parameters are correctly +set: +```shell +$ geth init path/to/genesis.json ``` -$ gnbai init path/to/genesis.json + +#### Creating the rendezvous point + +With all nodes that you want to run initialized to the desired genesis state, you'll need to +start a bootstrap node that others can use to find each other in your network and/or over +the internet. The clean way is to configure and run a dedicated bootnode: + +```shell +$ 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) +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. + +*Note: You could also use a full-fledged `geth` node as a bootnode, but it's the less +recommended way.* + #### Starting up your member nodes -With the bootnode operational and externally reachable (you can try `telnet ` to ensure -it's indeed reachable), start every subsequent gnbai node pointed to the bootnode for peer discovery -via the `--bootnodes` flag. It will probably also be desirable to keep the data directory of your -private network separated, so do also specify a custom `--datadir` flag. +With the bootnode operational and externally reachable (you can try +`telnet ` to ensure it's indeed reachable), start every subsequent `geth` +node pointed to the bootnode for peer discovery via the `--bootnodes` flag. It will +probably also be desirable to keep the data directory of your private network separated, so +do also specify a custom `--datadir` flag. +```shell +$ geth --datadir=path/to/custom/data/folder --bootnodes= ``` -$ gnbai --datadir=path/to/custom/data/folder --bootnodes= + +*Note: Since your network will be completely cut off from the main and test networks, you'll +also need to configure a miner to process transactions and create new blocks for you.* + +#### Running a private miner + +Mining on the public Ethereum network is a complex task as it's only feasible using GPUs, +requiring an OpenCL or CUDA enabled `ethminer` instance. For information on such a +setup, please consult the [EtherMining subreddit](https://www.reddit.com/r/EtherMining/) +and the [Genoil miner](https://github.com/Genoil/cpp-ethereum) repository. + +In a private network setting, however a single CPU miner instance is more than enough for +practical purposes as it can produce a stable stream of blocks at the correct intervals +without needing heavy resources (consider running on a single thread, no need for multiple +ones either). To start a `geth` instance for mining, run it with all your usual flags, extended +by: + +```shell +$ geth --mine --miner.threads=1 --etherbase=0x0000000000000000000000000000000000000000 ``` -*Note: Since your network will be completely cut off from the main and test networks, you'll also -need to configure a miner to process transactions and create new blocks for you.* +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 anyone on the internet, and are grateful for even the smallest of fixes! + +If you'd like to contribute to go-ethereum, please fork, fix, commit and send a pull request +for the maintainers to review and merge into the main code base. If you wish to submit +more complex changes though, please check up with the core devs first on [our gitter channel](https://gitter.im/ethereum/go-ethereum) +to ensure those changes are in line with the general philosophy of the project and/or get +some early feedback which can make both your efforts much lighter as well as our review +and merge procedures quick and simple. + +Please make sure your contributions adhere to our coding guidelines: + + * Code must adhere to the official Go [formatting](https://golang.org/doc/effective_go.html#formatting) + guidelines (i.e. uses [gofmt](https://golang.org/cmd/gofmt/)). + * Code must be documented adhering to the official Go [commentary](https://golang.org/doc/effective_go.html#commentary) + guidelines. + * Pull requests need to be based on and opened against the `master` branch. + * Commit messages should be prefixed with the package(s) they modify. + * E.g. "eth, rpc: make trace configs optional" +Please see the [Developers' Guide](https://github.com/ethereum/go-ethereum/wiki/Developers'-Guide) +for more details on configuring your environment, managing project dependencies, and +testing procedures. ## License -The go-gnbai library (i.e. all code outside of the `cmd` directory) is licensed under the -[GNU Lesser General Public License v3.0](https://www.gnu.org/licenses/lgpl-3.0.en.html), also -included in our repository in the `COPYING.LESSER` file. +The go-ethereum library (i.e. all code outside of the `cmd` directory) is licensed under the +[GNU Lesser General Public License v3.0](https://www.gnu.org/licenses/lgpl-3.0.en.html), +also included in our repository in the `COPYING.LESSER` file. -The go-gnbai binaries (i.e. all code inside of the `cmd` directory) is licensed under the -[GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.en.html), also included -in our repository in the `COPYING` file. +The go-ethereum binaries (i.e. all code inside of the `cmd` directory) is licensed under the +[GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.en.html), also +included in our repository in the `COPYING` file. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000000..bc54ede42fac --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,120 @@ +# Security Policy + +## Supported Versions + +Please see Releases. We recommend to use the most recent released version. + +## Audit reports + +Audit reports are published in the `docs` folder: https://github.com/ethereum/go-ethereum/tree/master/docs/audits + + +| Scope | Date | Report Link | +| ------- | ------- | ----------- | +| `geth` | 20170425 | [pdf](https://github.com/ethereum/go-ethereum/blob/master/docs/audits/2017-04-25_Geth-audit_Truesec.pdf) | +| `clef` | 20180914 | [pdf](https://github.com/ethereum/go-ethereum/blob/master/docs/audits/2018-09-14_Clef-audit_NCC.pdf) | + + + +## Reporting a Vulnerability + +**Please do not file a public ticket** mentioning the vulnerability. + +To find out how to disclose a vulnerability in Ethereum visit [https://bounty.ethereum.org](https://bounty.ethereum.org) or email bounty@ethereum.org. + +The following key may be used to communicate sensitive information to developers. + +Fingerprint: `AE96 ED96 9E47 9B00 84F3 E17F E88D 3334 FA5F 6A0A` + + +``` +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQINBFgl3tgBEAC8A1tUBkD9YV+eLrOmtgy+/JS/H9RoZvkg3K1WZ8IYfj6iIRaY +neAk3Bp182GUPVz/zhKr2g0tMXIScDR3EnaDsY+Qg+JqQl8NOG+Cikr1nnkG2on9 +L8c8yiqry1ZTCmYMqCa2acTFqnyuXJ482aZNtB4QG2BpzfhW4k8YThpegk/EoRUi +m+y7buJDtoNf7YILlhDQXN8qlHB02DWOVUihph9tUIFsPK6BvTr9SIr/eG6j6k0b +fUo9pexOn7LS4SojoJmsm/5dp6AoKlac48cZU5zwR9AYcq/nvkrfmf2WkObg/xRd +EvKZzn05jRopmAIwmoC3CiLmqCHPmT5a29vEob/yPFE335k+ujjZCPOu7OwjzDk7 +M0zMSfnNfDq8bXh16nn+ueBxJ0NzgD1oC6c2PhM+XRQCXChoyI8vbfp4dGvCvYqv +QAE1bWjqnumZ/7vUPgZN6gDfiAzG2mUxC2SeFBhacgzDvtQls+uuvm+FnQOUgg2H +h8x2zgoZ7kqV29wjaUPFREuew7e+Th5BxielnzOfVycVXeSuvvIn6cd3g/s8mX1c +2kLSXJR7+KdWDrIrR5Az0kwAqFZt6B6QTlDrPswu3mxsm5TzMbny0PsbL/HBM+GZ +EZCjMXxB8bqV2eSaktjnSlUNX1VXxyOxXA+ZG2jwpr51egi57riVRXokrQARAQAB +tDlFdGhlcmV1bSBGb3VuZGF0aW9uIFNlY3VyaXR5IFRlYW0gPHNlY3VyaXR5QGV0 +aGVyZXVtLm9yZz6JAj4EEwECACgCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheA +BQJaCWH6BQkFo2BYAAoJEOiNMzT6X2oK+DEP/3H6dxkm0hvHZKoHLVuuxcu3EHYo +k5sd3MMWPrZSN8qzZnY7ayEDMxnarWOizc+2jfOxfJlzX/g8lR1/fsHdWPFPhPoV +Qk8ygrHn1H8U8+rpw/U03BqmqHpYCDzJ+CIis9UWROniqXw1nuqu/FtWOsdWxNKh +jUo6k/0EsaXsxRPzgJv7fEUcVcQ7as/C3x9sy3muc2gvgA4/BKoGPb1/U0GuA8lV +fDIDshAggmnSUAg+TuYSAAdoFQ1sKwFMPigcLJF2eyKuK3iUyixJrec/c4LSf3wA +cGghbeuqI8INP0Y2zvXDQN2cByxsFAuoZG+m0cyKGaDH2MVUvOKKYqn/03qvrf15 +AWAsW0l0yQwOTCo3FbsNzemClm5Bj/xH0E4XuwXwChcMCMOWJrFoxyvCEI+keoQc +c08/a8/MtS7vBAABXwOziSmm6CNqmzpWrh/fDrjlJlba9U3MxzvqU3IFlTdMratv +6V+SgX+L25lCzW4NxxUavoB8fAlvo8lxpHKo24FP+RcLQ8XqkU3RiUsgRjQRFOqQ +TaJcsp8mimmiYyf24mNu6b48pi+a5c/eQR9w59emeEUZqsJU+nqv8BWIIp7o4Agh +NYnKjkhPlY5e1fLVfAHIADZFynWwRPkPMJSrBiP5EtcOFxQGHGjRxU/KjXkvE0hV +xYb1PB8pWMTu/beeiQI+BBMBAgAoBQJYJd7YAhsDBQkB4TOABgsJCAcDAgYVCAIJ +CgsEFgIDAQIeAQIXgAAKCRDojTM0+l9qCplDD/9IZ2i+m1cnqQKtiyHbyFGx32oL +fzqPylX2bOG5DPsSTorSUdJMGVfT04oVxXc4S/2DVnNvi7RAbSiLapCWSplgtBOj +j1xlblOoXxT3m7s1XHGCX5tENxI9fVSSPVKJn+fQaWpPB2MhBA+1lUI6GJ+11T7K +J8LrP/fiw1/nOb7rW61HW44Gtyox23sA/d1+DsFVaF8hxJlNj5coPKr8xWzQ8pQl +juzdjHDukjevuw4rRmRq9vozvj9keEU9XJ5dldyEVXFmdDk7KT0p0Rla9nxYhzf/ +r/Bv8Bzy0HCWRb2D31BjXXGG05oVnYmNGxGFxYja4MwgrMmne3ilEVjfUJsapsqi +w41BAyQgIdfREulYN7ahsF5PrjVAqBd9IGtE8ULelF2SQxEBQBngEkP0ahP6tRAL +i7/CBjPKOyKijtqVny7qrGOnU2ygcA88/WDibexDhrjz0Gx8WmErU7rIWZiZ5u4Y +vJYVRo0+6rBCXRPeSJfiP5h1p17Anr2l42boAYslfcrzquB8MHtrNcyn650OLtHG +nbxgIdniKrpuzGN6Opw+O2id2JhD1/1p4SOemwAmthplr1MIyOHNP3q93rEj2J7h +5zPS/AJuKkMDFUpslPNLQjCOwPXtdzL7/kUZGBSyez1T3TaW1uY6l9XaJJRaSn+v +1zPgfp4GJ3lPs4AlAbQ0RXRoZXJldW0gRm91bmRhdGlvbiBCdWcgQm91bnR5IDxi +b3VudHlAZXRoZXJldW0ub3JnPokCPgQTAQIAKAIbAwYLCQgHAwIGFQgCCQoLBBYC +AwECHgECF4AFAloJYfoFCQWjYFgACgkQ6I0zNPpfagoENg/+LnSaVeMxiGVtcjWl +b7Xd73yrEy4uxiESS1AalW9mMf7oZzfI05f7QIQlaLAkNac74vZDJbPKjtb7tpMO +RFhRZMCveq6CPKU6pd1SI8IUVUKwpEe6AJP3lHdVP57dquieFE2HlYKm6uHbCGWU +0cjyTA+uu2KbgCHGmofsPY/xOcZLGEHTHqa5w60JJAQm+BSDKnw8wTyrxGvA3EK/ +ePSvOZMYa+iw6vYuZeBIMbdiXR/A2keBi3GuvqB8tDMj7P22TrH5mVDm3zNqGYD6 +amDPeiWp4cztY3aZyLcgYotqXPpDceZzDn+HopBPzAb/llCdE7bVswKRhphVMw4b +bhL0R/TQY7Sf6TK2LKSBrjv0DWOSijikE71SJcBnJvHU7EpKrQQ0lMGclm3ynyji +Nf0YTPXQt4I+fwTmOew2GFeK3UytNWbWI7oXX7Nm4bj9bhf3IJ0kmZb/Gs73+xII +e7Rz52Mby436tWyQIQiF9ITYNGvNf53TwBBZMn0pKPiTyr3Ur7FHEotkEOFNh1// +4zQY10XxuBdLrYGyZ4V8xHJM+oKre8Eg2R9qHXVbjvErHE+7CvgnV7YUip0criPr +BlKRvuoJaSliH2JFhSjWVrkPmFGrWN0BAx10yIqMnEplfKeHf4P9Elek3oInS8WP +G1zJG6s/t5+hQK0X37+TB+6rd3GJAj4EEwECACgFAlgl4TsCGwMFCQHhM4AGCwkI +BwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEOiNMzT6X2oKzf8P/iIKd77WHTbp4pMN +8h52HyZJtDJmjA1DPZrbGl1TesW/Z9uTd12txlgqZnbG2GfN9+LSP6EOPzR6v2xC +OVhR+RdWhZDJJuQCVS7lJIqQrZgmeTZG0TyQPZdLjVFBOrrhVwYX+HXbu429IzHr +URf5InyR1QgqOXyElDYS6e28HFqvaoA0DWTWDDqOLPVl+U5fuceIE2XXdv3AGLeP +Yf8J5MPobjPiZtBqI6S6iENY2Yn35qLX+axeC/iYSCHVtFuCCIdb/QYR1ZZV8Ps/ +aI9DwC7LU+YfPw7iqCIoqxSeA3o1PORkdSigEg3jtfRv5UqVo9a0oBb9jdoADsat +F/gW0E7mto3XGOiaR0eB9SSdsM3x7Bz4A0HIGNaxpZo1RWqlO91leP4c13Px7ISv +5OGXfLg+M8qb+qxbGd1HpitGi9s1y1aVfEj1kOtZ0tN8eu+Upg5WKwPNBDX3ar7J +9NCULgVSL+E79FG+zXw62gxiQrLfKzm4wU/9L5wVkwQnm29hLJ0tokrSBZFnc/1l +7OC+GM63tYicKkY4rqmoWUeYx7IwFH9mtDtvR1RxO85RbQhZizwpZpdpRkH0DqZu +ZJRmRa5r7rPqmfa7d+VIFhz2Xs8pJMLVqxTsLKcLglmjw7aOrYG0SWeH7YraXWGD +N3SlvSBiVwcK7QUKzLLvpadLwxfsuQINBFgl3tgBEACbgq6HTN5gEBi0lkD/MafI +nmNi+59U5gRGYqk46WlfRjhHudXjDpgD0lolGb4hYontkMaKRlCg2Rvgjvk3Zve0 +PKWjKw7gr8YBa9fMFY8BhAXI32OdyI9rFhxEZFfWAfwKVmT19BdeAQRFvcfd+8w8 +f1XVc+zddULMJFBTr+xKDlIRWwTkdLPQeWbjo0eHl/g4tuLiLrTxVbnj26bf+2+1 +DbM/w5VavzPrkviHqvKe/QP/gay4QDViWvFgLb90idfAHIdsPgflp0VDS5rVHFL6 +D73rSRdIRo3I8c8mYoNjSR4XDuvgOkAKW9LR3pvouFHHjp6Fr0GesRbrbb2EG66i +PsR99MQ7FqIL9VMHPm2mtR+XvbnKkH2rYyEqaMbSdk29jGapkAWle4sIhSKk749A +4tGkHl08KZ2N9o6GrfUehP/V2eJLaph2DioFL1HxRryrKy80QQKLMJRekxigq8gr +eW8xB4zuf9Mkuou+RHNmo8PebHjFstLigiD6/zP2e+4tUmrT0/JTGOShoGMl8Rt0 +VRxdPImKun+4LOXbfOxArOSkY6i35+gsgkkSy1gTJE0BY3S9auT6+YrglY/TWPQ9 +IJxWVOKlT+3WIp5wJu2bBKQ420VLqDYzkoWytel/bM1ACUtipMiIVeUs2uFiRjpz +A1Wy0QHKPTdSuGlJPRrfcQARAQABiQIlBBgBAgAPAhsMBQJaCWIIBQkFo2BYAAoJ +EOiNMzT6X2oKgSwQAKKs7BGF8TyZeIEO2EUK7R2bdQDCdSGZY06tqLFg3IHMGxDM +b/7FVoa2AEsFgv6xpoebxBB5zkhUk7lslgxvKiSLYjxfNjTBltfiFJ+eQnf+OTs8 +KeR51lLa66rvIH2qUzkNDCCTF45H4wIDpV05AXhBjKYkrDCrtey1rQyFp5fxI+0I +Q1UKKXvzZK4GdxhxDbOUSd38MYy93nqcmclGSGK/gF8XiyuVjeifDCM6+T1NQTX0 +K9lneidcqtBDvlggJTLJtQPO33o5EHzXSiud+dKth1uUhZOFEaYRZoye1YE3yB0T +NOOE8fXlvu8iuIAMBSDL9ep6sEIaXYwoD60I2gHdWD0lkP0DOjGQpi4ouXM3Edsd +5MTi0MDRNTij431kn8T/D0LCgmoUmYYMBgbwFhXr67axPZlKjrqR0z3F/Elv0ZPP +cVg1tNznsALYQ9Ovl6b5M3cJ5GapbbvNWC7yEE1qScl9HiMxjt/H6aPastH63/7w +cN0TslW+zRBy05VNJvpWGStQXcngsSUeJtI1Gd992YNjUJq4/Lih6Z1TlwcFVap+ +cTcDptoUvXYGg/9mRNNPZwErSfIJ0Ibnx9wPVuRN6NiCLOt2mtKp2F1pM6AOQPpZ +85vEh6I8i6OaO0w/Z0UHBwvpY6jDUliaROsWUQsqz78Z34CVj4cy6vPW2EF4 +=r6KK +-----END PGP PUBLIC KEY BLOCK----- +``` diff --git a/accounts/abi/abi.go b/accounts/abi/abi.go index 08d5db979861..603e956b9df4 100644 --- a/accounts/abi/abi.go +++ b/accounts/abi/abi.go @@ -21,6 +21,8 @@ import ( "encoding/json" "fmt" "io" + + "github.com/ethereum/go-ethereum/common" ) // The ABI holds information about a contract's context and available @@ -68,23 +70,37 @@ func (abi ABI) Pack(name string, args ...interface{}) ([]byte, error) { return nil, err } // Pack up the method ID too if not a constructor and return - return append(method.Id(), arguments...), nil + return append(method.ID(), arguments...), nil } // Unpack output in v according to the abi specification -func (abi ABI) Unpack(v interface{}, name string, output []byte) (err error) { - if len(output) == 0 { - return fmt.Errorf("abi: unmarshalling empty output") +func (abi ABI) Unpack(v interface{}, name string, data []byte) (err error) { + // since there can't be naming collisions with contracts and events, + // we need to decide whether we're calling a method or an event + if method, ok := abi.Methods[name]; ok { + if len(data)%32 != 0 { + return fmt.Errorf("abi: improperly formatted output: %s - Bytes: [%+v]", string(data), data) + } + return method.Outputs.Unpack(v, data) } + if event, ok := abi.Events[name]; ok { + return event.Inputs.Unpack(v, data) + } + return fmt.Errorf("abi: could not locate named method or event") +} + +// UnpackIntoMap unpacks a log into the provided map[string]interface{} +func (abi ABI) UnpackIntoMap(v map[string]interface{}, name string, data []byte) (err error) { // since there can't be naming collisions with contracts and events, // we need to decide whether we're calling a method or an event if method, ok := abi.Methods[name]; ok { - if len(output)%32 != 0 { - return fmt.Errorf("abi: improperly formatted output: %s - Bytes: [%+v]", string(output), output) + if len(data)%32 != 0 { + return fmt.Errorf("abi: improperly formatted output") } - return method.Outputs.Unpack(v, output) - } else if event, ok := abi.Events[name]; ok { - return event.Inputs.Unpack(v, output) + return method.Outputs.UnpackIntoMap(v, data) + } + if event, ok := abi.Events[name]; ok { + return event.Inputs.UnpackIntoMap(v, data) } return fmt.Errorf("abi: could not locate named method or event") } @@ -99,11 +115,9 @@ func (abi *ABI) UnmarshalJSON(data []byte) error { Inputs []Argument Outputs []Argument } - if err := json.Unmarshal(data, &fields); err != nil { return err } - abi.Methods = make(map[string]Method) abi.Events = make(map[string]Event) for _, field := range fields { @@ -114,15 +128,29 @@ func (abi *ABI) UnmarshalJSON(data []byte) error { } // empty defaults to function according to the abi spec case "function", "": - abi.Methods[field.Name] = Method{ - Name: field.Name, + name := field.Name + _, ok := abi.Methods[name] + for idx := 0; ok; idx++ { + name = fmt.Sprintf("%s%d", field.Name, idx) + _, ok = abi.Methods[name] + } + abi.Methods[name] = Method{ + Name: name, + RawName: field.Name, Const: field.Constant, Inputs: field.Inputs, Outputs: field.Outputs, } case "event": - abi.Events[field.Name] = Event{ - Name: field.Name, + name := field.Name + _, ok := abi.Events[name] + for idx := 0; ok; idx++ { + name = fmt.Sprintf("%s%d", field.Name, idx) + _, ok = abi.Events[name] + } + abi.Events[name] = Event{ + Name: name, + RawName: field.Name, Anonymous: field.Anonymous, Inputs: field.Inputs, } @@ -136,12 +164,23 @@ func (abi *ABI) UnmarshalJSON(data []byte) error { // returns nil if none found func (abi *ABI) MethodById(sigdata []byte) (*Method, error) { if len(sigdata) < 4 { - return nil, fmt.Errorf("data too short (% bytes) for abi method lookup", len(sigdata)) + return nil, fmt.Errorf("data too short (%d bytes) for abi method lookup", len(sigdata)) } for _, method := range abi.Methods { - if bytes.Equal(method.Id(), sigdata[:4]) { + if bytes.Equal(method.ID(), sigdata[:4]) { return &method, nil } } return nil, fmt.Errorf("no method with id: %#x", sigdata[:4]) } + +// EventByID looks an event up by its topic hash in the +// ABI and returns nil if none found. +func (abi *ABI) EventByID(topic common.Hash) (*Event, error) { + for _, event := range abi.Events { + if bytes.Equal(event.ID().Bytes(), topic.Bytes()) { + return &event, nil + } + } + return nil, fmt.Errorf("no event with id: %#x", topic.Hex()) +} diff --git a/accounts/abi/abi_test.go b/accounts/abi/abi_test.go index 750dbe6d9fbd..61ab70eb83ad 100644 --- a/accounts/abi/abi_test.go +++ b/accounts/abi/abi_test.go @@ -20,14 +20,13 @@ import ( "bytes" "encoding/hex" "fmt" - "log" "math/big" "reflect" "strings" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" ) const jsondata = ` @@ -58,14 +57,14 @@ const jsondata2 = ` ]` func TestReader(t *testing.T) { - Uint256, _ := NewType("uint256", nil) + Uint256, _ := NewType("uint256", "", nil) exp := ABI{ Methods: map[string]Method{ "balance": { - "balance", true, nil, nil, + "balance", "balance", true, nil, nil, }, "send": { - "send", false, []Argument{ + "send", "send", false, []Argument{ {"amount", Uint256, false}, }, nil, }, @@ -102,8 +101,7 @@ func TestReader(t *testing.T) { func TestTestNumbers(t *testing.T) { abi, err := JSON(strings.NewReader(jsondata2)) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } if _, err := abi.Pack("balance"); err != nil { @@ -140,8 +138,7 @@ func TestTestNumbers(t *testing.T) { func TestTestString(t *testing.T) { abi, err := JSON(strings.NewReader(jsondata2)) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } if _, err := abi.Pack("string", "hello world"); err != nil { @@ -152,8 +149,7 @@ func TestTestString(t *testing.T) { func TestTestBool(t *testing.T) { abi, err := JSON(strings.NewReader(jsondata2)) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } if _, err := abi.Pack("bool", true); err != nil { @@ -164,42 +160,39 @@ func TestTestBool(t *testing.T) { func TestTestSlice(t *testing.T) { abi, err := JSON(strings.NewReader(jsondata2)) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } - slice := make([]uint64, 2) if _, err := abi.Pack("uint64[2]", slice); err != nil { t.Error(err) } - if _, err := abi.Pack("uint64[]", slice); err != nil { t.Error(err) } } func TestMethodSignature(t *testing.T) { - String, _ := NewType("string", nil) - m := Method{"foo", false, []Argument{{"bar", String, false}, {"baz", String, false}}, nil} + String, _ := NewType("string", "", nil) + m := Method{"foo", "foo", false, []Argument{{"bar", String, false}, {"baz", String, false}}, nil} exp := "foo(string,string)" if m.Sig() != exp { t.Error("signature mismatch", exp, "!=", m.Sig()) } idexp := crypto.Keccak256([]byte(exp))[:4] - if !bytes.Equal(m.Id(), idexp) { - t.Errorf("expected ids to match %x != %x", m.Id(), idexp) + if !bytes.Equal(m.ID(), idexp) { + t.Errorf("expected ids to match %x != %x", m.ID(), idexp) } - uintt, _ := NewType("uint256", nil) - m = Method{"foo", false, []Argument{{"bar", uintt, false}}, nil} + uintt, _ := NewType("uint256", "", nil) + m = Method{"foo", "foo", false, []Argument{{"bar", uintt, false}}, nil} exp = "foo(uint256)" if m.Sig() != exp { t.Error("signature mismatch", exp, "!=", m.Sig()) } // Method with tuple arguments - s, _ := NewType("tuple", []ArgumentMarshaling{ + s, _ := NewType("tuple", "", []ArgumentMarshaling{ {Name: "a", Type: "int256"}, {Name: "b", Type: "int256[]"}, {Name: "c", Type: "tuple[]", Components: []ArgumentMarshaling{ @@ -211,18 +204,40 @@ func TestMethodSignature(t *testing.T) { {Name: "y", Type: "int256"}, }}, }) - m = Method{"foo", false, []Argument{{"s", s, false}, {"bar", String, false}}, nil} + m = Method{"foo", "foo", false, []Argument{{"s", s, false}, {"bar", String, false}}, nil} exp = "foo((int256,int256[],(int256,int256)[],(int256,int256)[2]),string)" if m.Sig() != exp { t.Error("signature mismatch", exp, "!=", m.Sig()) } } +func TestOverloadedMethodSignature(t *testing.T) { + json := `[{"constant":true,"inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"i","type":"uint256"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"pure","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"i","type":"uint256"}],"name":"bar","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"i","type":"uint256"},{"indexed":false,"name":"j","type":"uint256"}],"name":"bar","type":"event"}]` + abi, err := JSON(strings.NewReader(json)) + if err != nil { + t.Fatal(err) + } + check := func(name string, expect string, method bool) { + if method { + if abi.Methods[name].Sig() != expect { + t.Fatalf("The signature of overloaded method mismatch, want %s, have %s", expect, abi.Methods[name].Sig()) + } + } else { + if abi.Events[name].Sig() != expect { + t.Fatalf("The signature of overloaded event mismatch, want %s, have %s", expect, abi.Events[name].Sig()) + } + } + } + check("foo", "foo(uint256,uint256)", true) + check("foo0", "foo(uint256)", true) + check("bar", "bar(uint256)", false) + check("bar0", "bar(uint256,uint256)", false) +} + func TestMultiPack(t *testing.T) { abi, err := JSON(strings.NewReader(jsondata2)) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } sig := crypto.Keccak256([]byte("bar(uint32,uint16)"))[:4] @@ -232,10 +247,8 @@ func TestMultiPack(t *testing.T) { packed, err := abi.Pack("bar", uint32(10), uint16(11)) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } - if !bytes.Equal(packed, sig) { t.Errorf("expected %x got %x", sig, packed) } @@ -246,11 +259,11 @@ func ExampleJSON() { abi, err := JSON(strings.NewReader(definition)) if err != nil { - log.Fatalln(err) + panic(err) } out, err := abi.Pack("isBar", common.HexToAddress("01")) if err != nil { - log.Fatalln(err) + panic(err) } fmt.Printf("%x\n", out) @@ -589,9 +602,9 @@ func TestBareEvents(t *testing.T) { { "type" : "event", "name" : "tuple", "inputs" : [{ "indexed":false, "name":"t", "type":"tuple", "components":[{"name":"a", "type":"uint256"}] }, { "indexed":true, "name":"arg1", "type":"address" }] } ]` - arg0, _ := NewType("uint256", nil) - arg1, _ := NewType("address", nil) - tuple, _ := NewType("tuple", []ArgumentMarshaling{{Name: "a", Type: "uint256"}}) + arg0, _ := NewType("uint256", "", nil) + arg1, _ := NewType("address", "", nil) + tuple, _ := NewType("tuple", "", []ArgumentMarshaling{{Name: "a", Type: "uint256"}}) expectedEvents := map[string]struct { Anonymous bool @@ -694,6 +707,189 @@ func TestUnpackEvent(t *testing.T) { } } +func TestUnpackEventIntoMap(t *testing.T) { + const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"receivedAddr","type":"event"}]` + abi, err := JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + + const hexdata = `000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158` + data, err := hex.DecodeString(hexdata) + if err != nil { + t.Fatal(err) + } + if len(data)%32 == 0 { + t.Errorf("len(data) is %d, want a non-multiple of 32", len(data)) + } + + receivedMap := map[string]interface{}{} + expectedReceivedMap := map[string]interface{}{ + "sender": common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2"), + "amount": big.NewInt(1), + "memo": []byte{88}, + } + if err := abi.UnpackIntoMap(receivedMap, "received", data); err != nil { + t.Error(err) + } + if len(receivedMap) != 3 { + t.Error("unpacked `received` map expected to have length 3") + } + if receivedMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked `received` map does not match expected map") + } + if receivedMap["amount"].(*big.Int).Cmp(expectedReceivedMap["amount"].(*big.Int)) != 0 { + t.Error("unpacked `received` map does not match expected map") + } + if !bytes.Equal(receivedMap["memo"].([]byte), expectedReceivedMap["memo"].([]byte)) { + t.Error("unpacked `received` map does not match expected map") + } + + receivedAddrMap := map[string]interface{}{} + if err = abi.UnpackIntoMap(receivedAddrMap, "receivedAddr", data); err != nil { + t.Error(err) + } + if len(receivedAddrMap) != 1 { + t.Error("unpacked `receivedAddr` map expected to have length 1") + } + if receivedAddrMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked `receivedAddr` map does not match expected map") + } +} + +func TestUnpackMethodIntoMap(t *testing.T) { + const abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"send","outputs":[{"name":"amount","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"get","outputs":[{"name":"hash","type":"bytes"}],"payable":true,"stateMutability":"payable","type":"function"}]` + abi, err := JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + const hexdata = `00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000015800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000158000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000001580000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000015800000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000158` + data, err := hex.DecodeString(hexdata) + if err != nil { + t.Fatal(err) + } + if len(data)%32 != 0 { + t.Errorf("len(data) is %d, want a multiple of 32", len(data)) + } + + // Tests a method with no outputs + receiveMap := map[string]interface{}{} + if err = abi.UnpackIntoMap(receiveMap, "receive", data); err != nil { + t.Error(err) + } + if len(receiveMap) > 0 { + t.Error("unpacked `receive` map expected to have length 0") + } + + // Tests a method with only outputs + sendMap := map[string]interface{}{} + if err = abi.UnpackIntoMap(sendMap, "send", data); err != nil { + t.Error(err) + } + if len(sendMap) != 1 { + t.Error("unpacked `send` map expected to have length 1") + } + if sendMap["amount"].(*big.Int).Cmp(big.NewInt(1)) != 0 { + t.Error("unpacked `send` map expected `amount` value of 1") + } + + // Tests a method with outputs and inputs + getMap := map[string]interface{}{} + if err = abi.UnpackIntoMap(getMap, "get", data); err != nil { + t.Error(err) + } + if len(getMap) != 1 { + t.Error("unpacked `get` map expected to have length 1") + } + expectedBytes := []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, 96, 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, 88, 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, 96, 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, 88, 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, 96, 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, 88, 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, 96, 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, 88, 0} + if !bytes.Equal(getMap["hash"].([]byte), expectedBytes) { + t.Errorf("unpacked `get` map expected `hash` value of %v", expectedBytes) + } +} + +func TestUnpackIntoMapNamingConflict(t *testing.T) { + // Two methods have the same name + var abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"get","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"send","outputs":[{"name":"amount","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"get","outputs":[{"name":"hash","type":"bytes"}],"payable":true,"stateMutability":"payable","type":"function"}]` + abi, err := JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + var hexdata = `00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158` + data, err := hex.DecodeString(hexdata) + if err != nil { + t.Fatal(err) + } + if len(data)%32 == 0 { + t.Errorf("len(data) is %d, want a non-multiple of 32", len(data)) + } + getMap := map[string]interface{}{} + if err = abi.UnpackIntoMap(getMap, "get", data); err == nil { + t.Error("naming conflict between two methods; error expected") + } + + // Two events have the same name + abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"receive","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"received","type":"event"}]` + abi, err = JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + hexdata = `000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158` + data, err = hex.DecodeString(hexdata) + if err != nil { + t.Fatal(err) + } + if len(data)%32 == 0 { + t.Errorf("len(data) is %d, want a non-multiple of 32", len(data)) + } + receivedMap := map[string]interface{}{} + if err = abi.UnpackIntoMap(receivedMap, "received", data); err != nil { + t.Error("naming conflict between two events; no error expected") + } + + // Method and event have the same name + abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"received","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"receivedAddr","type":"event"}]` + abi, err = JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + if len(data)%32 == 0 { + t.Errorf("len(data) is %d, want a non-multiple of 32", len(data)) + } + if err = abi.UnpackIntoMap(receivedMap, "received", data); err == nil { + t.Error("naming conflict between an event and a method; error expected") + } + + // Conflict is case sensitive + abiJSON = `[{"constant":false,"inputs":[{"name":"memo","type":"bytes"}],"name":"received","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"sender","type":"address"}],"name":"receivedAddr","type":"event"}]` + abi, err = JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + if len(data)%32 == 0 { + t.Errorf("len(data) is %d, want a non-multiple of 32", len(data)) + } + expectedReceivedMap := map[string]interface{}{ + "sender": common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2"), + "amount": big.NewInt(1), + "memo": []byte{88}, + } + if err = abi.UnpackIntoMap(receivedMap, "Received", data); err != nil { + t.Error(err) + } + if len(receivedMap) != 3 { + t.Error("unpacked `received` map expected to have length 3") + } + if receivedMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked `received` map does not match expected map") + } + if receivedMap["amount"].(*big.Int).Cmp(expectedReceivedMap["amount"].(*big.Int)) != 0 { + t.Error("unpacked `received` map does not match expected map") + } + if !bytes.Equal(receivedMap["memo"].([]byte), expectedReceivedMap["memo"].([]byte)) { + t.Error("unpacked `received` map does not match expected map") + } +} + func TestABI_MethodById(t *testing.T) { const abiJSON = `[ {"type":"function","name":"receive","constant":false,"inputs":[{"name":"memo","type":"bytes"}],"outputs":[],"payable":true,"stateMutability":"payable"}, @@ -725,13 +921,13 @@ func TestABI_MethodById(t *testing.T) { } for name, m := range abi.Methods { a := fmt.Sprintf("%v", m) - m2, err := abi.MethodById(m.Id()) + m2, err := abi.MethodById(m.ID()) if err != nil { t.Fatalf("Failed to look up ABI method: %v", err) } b := fmt.Sprintf("%v", m2) if a != b { - t.Errorf("Method %v (id %v) not 'findable' by id in ABI", name, common.ToHex(m.Id())) + t.Errorf("Method %v (id %x) not 'findable' by id in ABI", name, m.ID()) } } // Also test empty @@ -745,3 +941,113 @@ func TestABI_MethodById(t *testing.T) { t.Errorf("Expected error, nil is short to decode data") } } + +func TestABI_EventById(t *testing.T) { + tests := []struct { + name string + json string + event string + }{ + { + name: "", + json: `[ + {"type":"event","name":"received","anonymous":false,"inputs":[ + {"indexed":false,"name":"sender","type":"address"}, + {"indexed":false,"name":"amount","type":"uint256"}, + {"indexed":false,"name":"memo","type":"bytes"} + ] + }]`, + event: "received(address,uint256,bytes)", + }, { + name: "", + json: `[ + { "constant": true, "inputs": [], "name": "name", "outputs": [ { "name": "", "type": "string" } ], "payable": false, "stateMutability": "view", "type": "function" }, + { "constant": false, "inputs": [ { "name": "_spender", "type": "address" }, { "name": "_value", "type": "uint256" } ], "name": "approve", "outputs": [ { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, + { "constant": true, "inputs": [], "name": "totalSupply", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, + { "constant": false, "inputs": [ { "name": "_from", "type": "address" }, { "name": "_to", "type": "address" }, { "name": "_value", "type": "uint256" } ], "name": "transferFrom", "outputs": [ { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, + { "constant": true, "inputs": [], "name": "decimals", "outputs": [ { "name": "", "type": "uint8" } ], "payable": false, "stateMutability": "view", "type": "function" }, + { "constant": true, "inputs": [ { "name": "_owner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "name": "balance", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, + { "constant": true, "inputs": [], "name": "symbol", "outputs": [ { "name": "", "type": "string" } ], "payable": false, "stateMutability": "view", "type": "function" }, + { "constant": false, "inputs": [ { "name": "_to", "type": "address" }, { "name": "_value", "type": "uint256" } ], "name": "transfer", "outputs": [ { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "nonpayable", "type": "function" }, + { "constant": true, "inputs": [ { "name": "_owner", "type": "address" }, { "name": "_spender", "type": "address" } ], "name": "allowance", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, + { "payable": true, "stateMutability": "payable", "type": "fallback" }, + { "anonymous": false, "inputs": [ { "indexed": true, "name": "owner", "type": "address" }, { "indexed": true, "name": "spender", "type": "address" }, { "indexed": false, "name": "value", "type": "uint256" } ], "name": "Approval", "type": "event" }, + { "anonymous": false, "inputs": [ { "indexed": true, "name": "from", "type": "address" }, { "indexed": true, "name": "to", "type": "address" }, { "indexed": false, "name": "value", "type": "uint256" } ], "name": "Transfer", "type": "event" } + ]`, + event: "Transfer(address,address,uint256)", + }, + } + + for testnum, test := range tests { + abi, err := JSON(strings.NewReader(test.json)) + if err != nil { + t.Error(err) + } + + topic := test.event + topicID := crypto.Keccak256Hash([]byte(topic)) + + event, err := abi.EventByID(topicID) + if err != nil { + t.Fatalf("Failed to look up ABI method: %v, test #%d", err, testnum) + } + if event == nil { + t.Errorf("We should find a event for topic %s, test #%d", topicID.Hex(), testnum) + } + + if event.ID() != topicID { + t.Errorf("Event id %s does not match topic %s, test #%d", event.ID().Hex(), topicID.Hex(), testnum) + } + + unknowntopicID := crypto.Keccak256Hash([]byte("unknownEvent")) + unknownEvent, err := abi.EventByID(unknowntopicID) + if err == nil { + t.Errorf("EventByID should return an error if a topic is not found, test #%d", testnum) + } + if unknownEvent != nil { + t.Errorf("We should not find any event for topic %s, test #%d", unknowntopicID.Hex(), testnum) + } + } +} + +func TestDuplicateMethodNames(t *testing.T) { + abiJSON := `[{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"},{"name":"customFallback","type":"string"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]` + contractAbi, err := JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + if _, ok := contractAbi.Methods["transfer"]; !ok { + t.Fatalf("Could not find original method") + } + if _, ok := contractAbi.Methods["transfer0"]; !ok { + t.Fatalf("Could not find duplicate method") + } + if _, ok := contractAbi.Methods["transfer1"]; !ok { + t.Fatalf("Could not find duplicate method") + } + if _, ok := contractAbi.Methods["transfer2"]; ok { + t.Fatalf("Should not have found extra method") + } +} + +// TestDoubleDuplicateMethodNames checks that if transfer0 already exists, there won't be a name +// conflict and that the second transfer method will be renamed transfer1. +func TestDoubleDuplicateMethodNames(t *testing.T) { + abiJSON := `[{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"}],"name":"transfer0","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"data","type":"bytes"},{"name":"customFallback","type":"string"}],"name":"transfer","outputs":[{"name":"ok","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]` + contractAbi, err := JSON(strings.NewReader(abiJSON)) + if err != nil { + t.Fatal(err) + } + if _, ok := contractAbi.Methods["transfer"]; !ok { + t.Fatalf("Could not find original method") + } + if _, ok := contractAbi.Methods["transfer0"]; !ok { + t.Fatalf("Could not find duplicate method") + } + if _, ok := contractAbi.Methods["transfer1"]; !ok { + t.Fatalf("Could not find duplicate method") + } + if _, ok := contractAbi.Methods["transfer2"]; ok { + t.Fatalf("Should not have found extra method") + } +} diff --git a/accounts/abi/argument.go b/accounts/abi/argument.go index d0a6b035c66a..f8ec11b9fa89 100644 --- a/accounts/abi/argument.go +++ b/accounts/abi/argument.go @@ -34,10 +34,11 @@ type Argument struct { type Arguments []Argument type ArgumentMarshaling struct { - Name string - Type string - Components []ArgumentMarshaling - Indexed bool + Name string + Type string + InternalType string + Components []ArgumentMarshaling + Indexed bool } // UnmarshalJSON implements json.Unmarshaler interface @@ -48,7 +49,7 @@ func (argument *Argument) UnmarshalJSON(data []byte) error { return fmt.Errorf("argument json err: %v", err) } - argument.Type, err = NewType(arg.Type, arg.Components) + argument.Type, err = NewType(arg.Type, arg.InternalType, arg.Components) if err != nil { return err } @@ -88,6 +89,13 @@ func (arguments Arguments) isTuple() bool { // Unpack performs the operation hexdata -> Go format func (arguments Arguments) Unpack(v interface{}, data []byte) error { + if len(data) == 0 { + if len(arguments) != 0 { + return fmt.Errorf("abi: attempting to unmarshall an empty string while arguments are expected") + } else { + return nil // Nothing to unmarshal, return + } + } // make sure the passed value is arguments pointer if reflect.Ptr != reflect.ValueOf(v).Kind() { return fmt.Errorf("abi: Unpack(non-pointer %T)", v) @@ -102,6 +110,22 @@ func (arguments Arguments) Unpack(v interface{}, data []byte) error { return arguments.unpackAtomic(v, marshalledValues[0]) } +// UnpackIntoMap performs the operation hexdata -> mapping of argument name to argument value +func (arguments Arguments) UnpackIntoMap(v map[string]interface{}, data []byte) error { + if len(data) == 0 { + if len(arguments) != 0 { + return fmt.Errorf("abi: attempting to unmarshall an empty string while arguments are expected") + } else { + return nil // Nothing to unmarshal, return + } + } + marshalledValues, err := arguments.UnpackValues(data) + if err != nil { + return err + } + return arguments.unpackIntoMap(v, marshalledValues) +} + // unpack sets the unmarshalled value to go format. // Note the dst here must be settable. func unpack(t *Type, dst interface{}, src interface{}) error { @@ -109,11 +133,22 @@ func unpack(t *Type, dst interface{}, src interface{}) error { dstVal = reflect.ValueOf(dst).Elem() srcVal = reflect.ValueOf(src) ) - - if t.T != TupleTy && !((t.T == SliceTy || t.T == ArrayTy) && t.Elem.T == TupleTy) { + tuple, typ := false, t + for { + if typ.T == SliceTy || typ.T == ArrayTy { + typ = typ.Elem + continue + } + tuple = typ.T == TupleTy + break + } + if !tuple { return set(dstVal, srcVal) } + // Dereferences interface or pointer wrapper + dstVal = indirectInterfaceOrPtr(dstVal) + switch t.T { case TupleTy: if dstVal.Kind() != reflect.Struct { @@ -160,6 +195,19 @@ func unpack(t *Type, dst interface{}, src interface{}) error { return nil } +// unpackIntoMap unpacks marshalledValues into the provided map[string]interface{} +func (arguments Arguments) unpackIntoMap(v map[string]interface{}, marshalledValues []interface{}) error { + // Make sure map is not nil + if v == nil { + return fmt.Errorf("abi: cannot unpack into a nil map") + } + + for i, arg := range arguments.NonIndexed() { + v[arg.Name] = marshalledValues[i] + } + return nil +} + // unpackAtomic unpacks ( hexdata -> go ) a single value func (arguments Arguments) unpackAtomic(v interface{}, marshalledValues interface{}) error { if arguments.LengthNonIndexed() == 0 { @@ -168,7 +216,7 @@ func (arguments Arguments) unpackAtomic(v interface{}, marshalledValues interfac argument := arguments.NonIndexed()[0] elem := reflect.ValueOf(v).Elem() - if elem.Kind() == reflect.Struct { + if elem.Kind() == reflect.Struct && argument.Type.T != TupleTy { fieldmap, err := mapArgNamesToStructFields([]string{argument.Name}, elem) if err != nil { return err diff --git a/accounts/abi/bind/auth.go b/accounts/abi/bind/auth.go index c797a493c801..e51f0bd8ead5 100644 --- a/accounts/abi/bind/auth.go +++ b/accounts/abi/bind/auth.go @@ -22,10 +22,12 @@ import ( "io" "io/ioutil" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/external" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" ) // NewTransactor is a utility method to easily create a transaction signer from @@ -42,6 +44,24 @@ func NewTransactor(keyin io.Reader, passphrase string) (*TransactOpts, error) { return NewKeyedTransactor(key.PrivateKey), nil } +// NewKeyStoreTransactor is a utility method to easily create a transaction signer from +// an decrypted key from a keystore +func NewKeyStoreTransactor(keystore *keystore.KeyStore, account accounts.Account) (*TransactOpts, error) { + return &TransactOpts{ + From: account.Address, + Signer: func(signer types.Signer, address common.Address, tx *types.Transaction) (*types.Transaction, error) { + if address != account.Address { + return nil, errors.New("not authorized to sign this account") + } + signature, err := keystore.SignHash(account, signer.Hash(tx).Bytes()) + if err != nil { + return nil, err + } + return tx.WithSignature(signer, signature) + }, + }, nil +} + // NewKeyedTransactor is a utility method to easily create a transaction signer // from a single private key. func NewKeyedTransactor(key *ecdsa.PrivateKey) *TransactOpts { @@ -60,3 +80,17 @@ func NewKeyedTransactor(key *ecdsa.PrivateKey) *TransactOpts { }, } } + +// NewClefTransactor is a utility method to easily create a transaction signer +// with a clef backend. +func NewClefTransactor(clef *external.ExternalSigner, account accounts.Account) *TransactOpts { + return &TransactOpts{ + From: account.Address, + Signer: func(signer types.Signer, address common.Address, transaction *types.Transaction) (*types.Transaction, error) { + if address != account.Address { + return nil, errors.New("not authorized to sign this account") + } + return clef.SignTx(account, transaction, nil) // Clef enforces its own chain id + }, + } +} diff --git a/accounts/abi/bind/backend.go b/accounts/abi/bind/backend.go index 66e41a6a6a75..ca60cc1b4320 100644 --- a/accounts/abi/bind/backend.go +++ b/accounts/abi/bind/backend.go @@ -21,9 +21,9 @@ import ( "errors" "math/big" - "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" ) var ( diff --git a/accounts/abi/bind/backends/simulated.go b/accounts/abi/bind/backends/simulated.go index bf77bc387e70..e30572e0a111 100644 --- a/accounts/abi/bind/backends/simulated.go +++ b/accounts/abi/bind/backends/simulated.go @@ -24,29 +24,31 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/bloombits" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/eth/filters" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/filters" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" ) // This nil assignment ensures compile time that SimulatedBackend implements bind.ContractBackend. 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") +var ( + errBlockNumberUnsupported = errors.New("simulatedBackend cannot access blocks other than the latest block") + 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. @@ -63,10 +65,9 @@ type SimulatedBackend struct { config *params.ChainConfig } -// NewSimulatedBackend creates a new binding backend using a simulated blockchain -// for testing purposes. -func NewSimulatedBackend(alloc core.GenesisAlloc, gasLimit uint64) *SimulatedBackend { - database := ethdb.NewMemDatabase() +// NewSimulatedBackendWithDatabase creates a new binding backend based on the given database +// and uses a simulated blockchain for testing purposes. +func NewSimulatedBackendWithDatabase(database ethdb.Database, alloc core.GenesisAlloc, gasLimit uint64) *SimulatedBackend { genesis := core.Genesis{Config: params.AllEthashProtocolChanges, GasLimit: gasLimit, Alloc: alloc} genesis.MustCommit(database) blockchain, _ := core.NewBlockChain(database, nil, genesis.Config, ethash.NewFaker(), vm.Config{}, nil) @@ -81,6 +82,18 @@ func NewSimulatedBackend(alloc core.GenesisAlloc, gasLimit uint64) *SimulatedBac return backend } +// NewSimulatedBackend creates a new binding backend using a simulated blockchain +// for testing purposes. +func NewSimulatedBackend(alloc core.GenesisAlloc, gasLimit uint64) *SimulatedBackend { + return NewSimulatedBackendWithDatabase(rawdb.NewMemoryDatabase(), alloc, gasLimit) +} + +// Close terminates the underlying blockchain's update loop. +func (b *SimulatedBackend) Close() error { + b.blockchain.Stop() + return nil +} + // Commit imports all the pending transactions as a single block and starts a // fresh new state. func (b *SimulatedBackend) Commit() { @@ -160,10 +173,29 @@ func (b *SimulatedBackend) StorageAt(ctx context.Context, contract common.Addres // TransactionReceipt returns the receipt of a transaction. func (b *SimulatedBackend) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) { - receipt, _, _, _ := rawdb.ReadReceipt(b.database, txHash) + receipt, _, _, _ := rawdb.ReadReceipt(b.database, txHash, b.config) return receipt, nil } +// TransactionByHash checks the pool of pending transactions in addition to the +// blockchain. The isPending return value indicates whether the transaction has been +// mined yet. Note that the transaction may not be part of the canonical chain even if +// it's not pending. +func (b *SimulatedBackend) TransactionByHash(ctx context.Context, txHash common.Hash) (*types.Transaction, bool, error) { + b.mu.Lock() + defer b.mu.Unlock() + + tx := b.pendingBlock.Transaction(txHash) + if tx != nil { + return tx, true, nil + } + tx, _, _, _ = rawdb.ReadTransaction(b.database, txHash) + if tx != nil { + return tx, false, nil + } + return nil, false, ethereum.NotFound +} + // PendingCodeAt returns the code associated with an account in the pending state. func (b *SimulatedBackend) PendingCodeAt(ctx context.Context, contract common.Address) ([]byte, error) { b.mu.Lock() @@ -297,7 +329,7 @@ func (b *SimulatedBackend) SendTransaction(ctx context.Context, tx *types.Transa b.mu.Lock() defer b.mu.Unlock() - sender, err := types.Sender(types.HomesteadSigner{}, tx) + sender, err := types.Sender(types.NewEIP155Signer(b.config.ChainID), tx) if err != nil { panic(fmt.Errorf("invalid transaction: %v", err)) } @@ -405,6 +437,11 @@ func (b *SimulatedBackend) AdjustTime(adjustment time.Duration) error { return nil } +// Blockchain returns the underlying blockchain. +func (b *SimulatedBackend) Blockchain() *core.BlockChain { + return b.blockchain +} + // callmsg implements core.Message to allow passing it as a transaction simulator. type callmsg struct { ethereum.CallMsg @@ -445,7 +482,7 @@ func (fb *filterBackend) GetReceipts(ctx context.Context, hash common.Hash) (typ if number == nil { return nil, nil } - return rawdb.ReadReceipts(fb.db, hash, *number), nil + return rawdb.ReadReceipts(fb.db, hash, *number, fb.bc.Config()), nil } func (fb *filterBackend) GetLogs(ctx context.Context, hash common.Hash) ([][]*types.Log, error) { @@ -453,7 +490,7 @@ func (fb *filterBackend) GetLogs(ctx context.Context, hash common.Hash) ([][]*ty if number == nil { return nil, nil } - receipts := rawdb.ReadReceipts(fb.db, hash, *number) + receipts := rawdb.ReadReceipts(fb.db, hash, *number, fb.bc.Config()) if receipts == nil { return nil, nil } diff --git a/accounts/abi/bind/backends/simulated_test.go b/accounts/abi/bind/backends/simulated_test.go new file mode 100644 index 000000000000..785b25d10fe2 --- /dev/null +++ b/accounts/abi/bind/backends/simulated_test.go @@ -0,0 +1,83 @@ +// Copyright 2019 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 backends_test + +import ( + "context" + "math/big" + "testing" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" +) + +func TestSimulatedBackend(t *testing.T) { + var gasLimit uint64 = 8000029 + key, _ := crypto.GenerateKey() // nolint: gosec + auth := bind.NewKeyedTransactor(key) + genAlloc := make(core.GenesisAlloc) + genAlloc[auth.From] = core.GenesisAccount{Balance: big.NewInt(9223372036854775807)} + + sim := backends.NewSimulatedBackend(genAlloc, gasLimit) + defer sim.Close() + + // should return an error if the tx is not found + txHash := common.HexToHash("2") + _, isPending, err := sim.TransactionByHash(context.Background(), txHash) + + if isPending { + t.Fatal("transaction should not be pending") + } + if err != ethereum.NotFound { + t.Fatalf("err should be `ethereum.NotFound` but received %v", err) + } + + // generate a transaction and confirm you can retrieve it + code := `6060604052600a8060106000396000f360606040526008565b00` + var gas uint64 = 3000000 + tx := types.NewContractCreation(0, big.NewInt(0), gas, big.NewInt(1), common.FromHex(code)) + tx, _ = types.SignTx(tx, types.HomesteadSigner{}, key) + + err = sim.SendTransaction(context.Background(), tx) + if err != nil { + t.Fatal("error sending transaction") + } + + txHash = tx.Hash() + _, isPending, err = sim.TransactionByHash(context.Background(), txHash) + if err != nil { + t.Fatalf("error getting transaction with hash: %v", txHash.String()) + } + if !isPending { + t.Fatal("transaction should have pending status") + } + + sim.Commit() + _, isPending, err = sim.TransactionByHash(context.Background(), txHash) + if err != nil { + t.Fatalf("error getting transaction with hash: %v", txHash.String()) + } + if isPending { + t.Fatal("transaction should not have pending status") + } + +} diff --git a/accounts/abi/bind/base.go b/accounts/abi/bind/base.go index c8d829f85e9e..499b4bda07d4 100644 --- a/accounts/abi/bind/base.go +++ b/accounts/abi/bind/base.go @@ -22,12 +22,12 @@ import ( "fmt" "math/big" - "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/accounts/abi" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/event" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/event" ) // SignerFn is a signer function callback when a contract requires a method to @@ -218,7 +218,7 @@ func (c *BoundContract) transact(opts *TransactOpts, contract *common.Address, i } } // If the contract surely has code (or code is not needed), estimate the transaction - msg := ethereum.CallMsg{From: opts.From, To: contract, Value: value, Data: input} + msg := ethereum.CallMsg{From: opts.From, To: contract, GasPrice: gasPrice, Value: value, Data: input} gasLimit, err = c.transactor.EstimateGas(ensureContext(opts.Context), msg) if err != nil { return nil, fmt.Errorf("failed to estimate gas needed: %v", err) @@ -252,7 +252,7 @@ func (c *BoundContract) FilterLogs(opts *FilterOpts, name string, query ...[]int opts = new(FilterOpts) } // Append the event selector to the query parameters and construct the topic set - query = append([][]interface{}{{c.abi.Events[name].Id()}}, query...) + query = append([][]interface{}{{c.abi.Events[name].ID()}}, query...) topics, err := makeTopics(query...) if err != nil { @@ -301,7 +301,7 @@ func (c *BoundContract) WatchLogs(opts *WatchOpts, name string, query ...[]inter opts = new(WatchOpts) } // Append the event selector to the query parameters and construct the topic set - query = append([][]interface{}{{c.abi.Events[name].Id()}}, query...) + query = append([][]interface{}{{c.abi.Events[name].ID()}}, query...) topics, err := makeTopics(query...) if err != nil { @@ -340,6 +340,22 @@ func (c *BoundContract) UnpackLog(out interface{}, event string, log types.Log) return parseTopics(out, indexed, log.Topics[1:]) } +// UnpackLogIntoMap unpacks a retrieved log into the provided map. +func (c *BoundContract) UnpackLogIntoMap(out map[string]interface{}, event string, log types.Log) error { + if len(log.Data) > 0 { + if err := c.abi.UnpackIntoMap(out, event, log.Data); err != nil { + return err + } + } + var indexed abi.Arguments + for _, arg := range c.abi.Events[event].Inputs { + if arg.Indexed { + indexed = append(indexed, arg) + } + } + return parseTopicsIntoMap(out, indexed, log.Topics[1:]) +} + // ensureContext is a helper method to ensure a context is not nil, even if the // user specified it as such. func ensureContext(ctx context.Context) context.Context { diff --git a/accounts/abi/bind/base_test.go b/accounts/abi/bind/base_test.go index 8adff8b59b5f..3ae685e00f0a 100644 --- a/accounts/abi/bind/base_test.go +++ b/accounts/abi/bind/base_test.go @@ -1,14 +1,36 @@ +// Copyright 2019 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 bind_test import ( + "bytes" "context" "math/big" + "strings" "testing" - ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/rlp" ) type mockCaller struct { @@ -25,7 +47,6 @@ func (mc *mockCaller) CallContract(ctx context.Context, call ethereum.CallMsg, b mc.callContractBlockNumber = blockNumber return nil, nil } - func TestPassingBlockNumber(t *testing.T) { mc := &mockCaller{} @@ -62,3 +83,265 @@ func TestPassingBlockNumber(t *testing.T) { t.Fatalf("CodeAt() was passed a block number when it should not have been") } } + +const hexData = "0x000000000000000000000000376c47978271565f56deb45495afa69e59c16ab200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000158" + +func TestUnpackIndexedStringTyLogIntoMap(t *testing.T) { + hash := crypto.Keccak256Hash([]byte("testName")) + mockLog := types.Log{ + Address: common.HexToAddress("0x0"), + Topics: []common.Hash{ + common.HexToHash("0x0"), + hash, + }, + Data: hexutil.MustDecode(hexData), + BlockNumber: uint64(26), + TxHash: common.HexToHash("0x0"), + TxIndex: 111, + BlockHash: common.BytesToHash([]byte{1, 2, 3, 4, 5}), + Index: 7, + Removed: false, + } + + abiString := `[{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"string"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"}]` + parsedAbi, _ := abi.JSON(strings.NewReader(abiString)) + bc := bind.NewBoundContract(common.HexToAddress("0x0"), parsedAbi, nil, nil, nil) + + receivedMap := make(map[string]interface{}) + expectedReceivedMap := map[string]interface{}{ + "name": hash, + "sender": common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2"), + "amount": big.NewInt(1), + "memo": []byte{88}, + } + if err := bc.UnpackLogIntoMap(receivedMap, "received", mockLog); err != nil { + t.Error(err) + } + + if len(receivedMap) != 4 { + t.Fatal("unpacked map expected to have length 4") + } + if receivedMap["name"] != expectedReceivedMap["name"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["amount"].(*big.Int).Cmp(expectedReceivedMap["amount"].(*big.Int)) != 0 { + t.Error("unpacked map does not match expected map") + } + if !bytes.Equal(receivedMap["memo"].([]byte), expectedReceivedMap["memo"].([]byte)) { + t.Error("unpacked map does not match expected map") + } +} + +func TestUnpackIndexedSliceTyLogIntoMap(t *testing.T) { + sliceBytes, err := rlp.EncodeToBytes([]string{"name1", "name2", "name3", "name4"}) + if err != nil { + t.Fatal(err) + } + hash := crypto.Keccak256Hash(sliceBytes) + mockLog := types.Log{ + Address: common.HexToAddress("0x0"), + Topics: []common.Hash{ + common.HexToHash("0x0"), + hash, + }, + Data: hexutil.MustDecode(hexData), + BlockNumber: uint64(26), + TxHash: common.HexToHash("0x0"), + TxIndex: 111, + BlockHash: common.BytesToHash([]byte{1, 2, 3, 4, 5}), + Index: 7, + Removed: false, + } + + abiString := `[{"anonymous":false,"inputs":[{"indexed":true,"name":"names","type":"string[]"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"}]` + parsedAbi, _ := abi.JSON(strings.NewReader(abiString)) + bc := bind.NewBoundContract(common.HexToAddress("0x0"), parsedAbi, nil, nil, nil) + + receivedMap := make(map[string]interface{}) + expectedReceivedMap := map[string]interface{}{ + "names": hash, + "sender": common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2"), + "amount": big.NewInt(1), + "memo": []byte{88}, + } + if err := bc.UnpackLogIntoMap(receivedMap, "received", mockLog); err != nil { + t.Error(err) + } + + if len(receivedMap) != 4 { + t.Fatal("unpacked map expected to have length 4") + } + if receivedMap["names"] != expectedReceivedMap["names"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["amount"].(*big.Int).Cmp(expectedReceivedMap["amount"].(*big.Int)) != 0 { + t.Error("unpacked map does not match expected map") + } + if !bytes.Equal(receivedMap["memo"].([]byte), expectedReceivedMap["memo"].([]byte)) { + t.Error("unpacked map does not match expected map") + } +} + +func TestUnpackIndexedArrayTyLogIntoMap(t *testing.T) { + arrBytes, err := rlp.EncodeToBytes([2]common.Address{common.HexToAddress("0x0"), common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2")}) + if err != nil { + t.Fatal(err) + } + hash := crypto.Keccak256Hash(arrBytes) + mockLog := types.Log{ + Address: common.HexToAddress("0x0"), + Topics: []common.Hash{ + common.HexToHash("0x0"), + hash, + }, + Data: hexutil.MustDecode(hexData), + BlockNumber: uint64(26), + TxHash: common.HexToHash("0x0"), + TxIndex: 111, + BlockHash: common.BytesToHash([]byte{1, 2, 3, 4, 5}), + Index: 7, + Removed: false, + } + + abiString := `[{"anonymous":false,"inputs":[{"indexed":true,"name":"addresses","type":"address[2]"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"}]` + parsedAbi, _ := abi.JSON(strings.NewReader(abiString)) + bc := bind.NewBoundContract(common.HexToAddress("0x0"), parsedAbi, nil, nil, nil) + + receivedMap := make(map[string]interface{}) + expectedReceivedMap := map[string]interface{}{ + "addresses": hash, + "sender": common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2"), + "amount": big.NewInt(1), + "memo": []byte{88}, + } + if err := bc.UnpackLogIntoMap(receivedMap, "received", mockLog); err != nil { + t.Error(err) + } + + if len(receivedMap) != 4 { + t.Fatal("unpacked map expected to have length 4") + } + if receivedMap["addresses"] != expectedReceivedMap["addresses"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["amount"].(*big.Int).Cmp(expectedReceivedMap["amount"].(*big.Int)) != 0 { + t.Error("unpacked map does not match expected map") + } + if !bytes.Equal(receivedMap["memo"].([]byte), expectedReceivedMap["memo"].([]byte)) { + t.Error("unpacked map does not match expected map") + } +} + +func TestUnpackIndexedFuncTyLogIntoMap(t *testing.T) { + mockAddress := common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2") + addrBytes := mockAddress.Bytes() + hash := crypto.Keccak256Hash([]byte("mockFunction(address,uint)")) + functionSelector := hash[:4] + functionTyBytes := append(addrBytes, functionSelector...) + var functionTy [24]byte + copy(functionTy[:], functionTyBytes[0:24]) + mockLog := types.Log{ + Address: common.HexToAddress("0x0"), + Topics: []common.Hash{ + common.HexToHash("0x99b5620489b6ef926d4518936cfec15d305452712b88bd59da2d9c10fb0953e8"), + common.BytesToHash(functionTyBytes), + }, + Data: hexutil.MustDecode(hexData), + BlockNumber: uint64(26), + TxHash: common.HexToHash("0x5c698f13940a2153440c6d19660878bc90219d9298fdcf37365aa8d88d40fc42"), + TxIndex: 111, + BlockHash: common.BytesToHash([]byte{1, 2, 3, 4, 5}), + Index: 7, + Removed: false, + } + + abiString := `[{"anonymous":false,"inputs":[{"indexed":true,"name":"function","type":"function"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"}]` + parsedAbi, _ := abi.JSON(strings.NewReader(abiString)) + bc := bind.NewBoundContract(common.HexToAddress("0x0"), parsedAbi, nil, nil, nil) + + receivedMap := make(map[string]interface{}) + expectedReceivedMap := map[string]interface{}{ + "function": functionTy, + "sender": common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2"), + "amount": big.NewInt(1), + "memo": []byte{88}, + } + if err := bc.UnpackLogIntoMap(receivedMap, "received", mockLog); err != nil { + t.Error(err) + } + + if len(receivedMap) != 4 { + t.Fatal("unpacked map expected to have length 4") + } + if receivedMap["function"] != expectedReceivedMap["function"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["amount"].(*big.Int).Cmp(expectedReceivedMap["amount"].(*big.Int)) != 0 { + t.Error("unpacked map does not match expected map") + } + if !bytes.Equal(receivedMap["memo"].([]byte), expectedReceivedMap["memo"].([]byte)) { + t.Error("unpacked map does not match expected map") + } +} + +func TestUnpackIndexedBytesTyLogIntoMap(t *testing.T) { + byts := []byte{1, 2, 3, 4, 5} + hash := crypto.Keccak256Hash(byts) + mockLog := types.Log{ + Address: common.HexToAddress("0x0"), + Topics: []common.Hash{ + common.HexToHash("0x99b5620489b6ef926d4518936cfec15d305452712b88bd59da2d9c10fb0953e8"), + hash, + }, + Data: hexutil.MustDecode(hexData), + BlockNumber: uint64(26), + TxHash: common.HexToHash("0x5c698f13940a2153440c6d19660878bc90219d9298fdcf37365aa8d88d40fc42"), + TxIndex: 111, + BlockHash: common.BytesToHash([]byte{1, 2, 3, 4, 5}), + Index: 7, + Removed: false, + } + + abiString := `[{"anonymous":false,"inputs":[{"indexed":true,"name":"content","type":"bytes"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"memo","type":"bytes"}],"name":"received","type":"event"}]` + parsedAbi, _ := abi.JSON(strings.NewReader(abiString)) + bc := bind.NewBoundContract(common.HexToAddress("0x0"), parsedAbi, nil, nil, nil) + + receivedMap := make(map[string]interface{}) + expectedReceivedMap := map[string]interface{}{ + "content": hash, + "sender": common.HexToAddress("0x376c47978271565f56DEB45495afa69E59c16Ab2"), + "amount": big.NewInt(1), + "memo": []byte{88}, + } + if err := bc.UnpackLogIntoMap(receivedMap, "received", mockLog); err != nil { + t.Error(err) + } + + if len(receivedMap) != 4 { + t.Fatal("unpacked map expected to have length 4") + } + if receivedMap["content"] != expectedReceivedMap["content"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["sender"] != expectedReceivedMap["sender"] { + t.Error("unpacked map does not match expected map") + } + if receivedMap["amount"].(*big.Int).Cmp(expectedReceivedMap["amount"].(*big.Int)) != 0 { + t.Error("unpacked map does not match expected map") + } + if !bytes.Equal(receivedMap["memo"].([]byte), expectedReceivedMap["memo"].([]byte)) { + t.Error("unpacked map does not match expected map") + } +} diff --git a/accounts/abi/bind/bind.go b/accounts/abi/bind/bind.go index 0af99050b458..13ac286b4552 100644 --- a/accounts/abi/bind/bind.go +++ b/accounts/abi/bind/bind.go @@ -22,6 +22,7 @@ package bind import ( "bytes" + "errors" "fmt" "go/format" "regexp" @@ -29,7 +30,8 @@ import ( "text/template" "unicode" - "github.com/nebulaai/nbai-node/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/log" ) // Lang is a target programming language selector to generate bindings for. @@ -45,10 +47,17 @@ const ( // to be used as is in client code, but rather as an intermediate struct which // enforces compile time type safety and naming convention opposed to having to // manually maintain hard coded strings that break on runtime. -func Bind(types []string, abis []string, bytecodes []string, pkg string, lang Lang) (string, error) { - // Process each individual contract requested binding - contracts := make(map[string]*tmplContract) +func Bind(types []string, abis []string, bytecodes []string, fsigs []map[string]string, pkg string, lang Lang, libs map[string]string, aliases map[string]string) (string, error) { + var ( + // contracts is the map of each individual contract requested binding + contracts = make(map[string]*tmplContract) + // structs is the map of all reclared structs shared by passed contracts. + structs = make(map[string]*tmplStruct) + + // isLib is the map used to flag each encountered library as such + isLib = make(map[string]struct{}) + ) for i := 0; i < len(types); i++ { // Parse the actual ABI to generate the binding for evmABI, err := abi.JSON(strings.NewReader(abis[i])) @@ -63,23 +72,43 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La return r }, abis[i]) - // Extract the call and transact methods; events; and sort them alphabetically + // Extract the call and transact methods; events, struct definitions; and sort them alphabetically var ( calls = make(map[string]*tmplMethod) transacts = make(map[string]*tmplMethod) events = make(map[string]*tmplEvent) + + // identifiers are used to detect duplicated identifier of function + // and event. For all calls, transacts and events, abigen will generate + // corresponding bindings. However we have to ensure there is no + // identifier coliision in the bindings of these categories. + callIdentifiers = make(map[string]bool) + transactIdentifiers = make(map[string]bool) + eventIdentifiers = make(map[string]bool) ) for _, original := range evmABI.Methods { // Normalize the method for capital cases and non-anonymous inputs/outputs normalized := original - normalized.Name = methodNormalizer[lang](original.Name) - + normalizedName := methodNormalizer[lang](alias(aliases, original.Name)) + // Ensure there is no duplicated identifier + var identifiers = callIdentifiers + if !original.Const { + identifiers = transactIdentifiers + } + if identifiers[normalizedName] { + return "", fmt.Errorf("duplicated identifier \"%s\"(normalized \"%s\"), use --alias for renaming", original.Name, normalizedName) + } + identifiers[normalizedName] = true + normalized.Name = normalizedName normalized.Inputs = make([]abi.Argument, len(original.Inputs)) copy(normalized.Inputs, original.Inputs) for j, input := range normalized.Inputs { if input.Name == "" { normalized.Inputs[j].Name = fmt.Sprintf("arg%d", j) } + if hasStruct(input.Type) { + bindStructType[lang](input.Type, structs) + } } normalized.Outputs = make([]abi.Argument, len(original.Outputs)) copy(normalized.Outputs, original.Outputs) @@ -87,6 +116,9 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La if output.Name != "" { normalized.Outputs[j].Name = capitalise(output.Name) } + if hasStruct(output.Type) { + bindStructType[lang](output.Type, structs) + } } // Append the methods to the call or transact lists if original.Const { @@ -102,35 +134,75 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La } // Normalize the event for capital cases and non-anonymous outputs normalized := original - normalized.Name = methodNormalizer[lang](original.Name) + + // Ensure there is no duplicated identifier + normalizedName := methodNormalizer[lang](alias(aliases, original.Name)) + if eventIdentifiers[normalizedName] { + return "", fmt.Errorf("duplicated identifier \"%s\"(normalized \"%s\"), use --alias for renaming", original.Name, normalizedName) + } + eventIdentifiers[normalizedName] = true + normalized.Name = normalizedName normalized.Inputs = make([]abi.Argument, len(original.Inputs)) copy(normalized.Inputs, original.Inputs) for j, input := range normalized.Inputs { - // Indexed fields are input, non-indexed ones are outputs - if input.Indexed { - if input.Name == "" { - normalized.Inputs[j].Name = fmt.Sprintf("arg%d", j) - } + if input.Name == "" { + normalized.Inputs[j].Name = fmt.Sprintf("arg%d", j) + } + if hasStruct(input.Type) { + bindStructType[lang](input.Type, structs) } } // Append the event to the accumulator list events[original.Name] = &tmplEvent{Original: original, Normalized: normalized} } + + // There is no easy way to pass arbitrary java objects to the Go side. + if len(structs) > 0 && lang == LangJava { + return "", errors.New("java binding for tuple arguments is not supported yet") + } + contracts[types[i]] = &tmplContract{ Type: capitalise(types[i]), InputABI: strings.Replace(strippedABI, "\"", "\\\"", -1), - InputBin: strings.TrimSpace(bytecodes[i]), + InputBin: strings.TrimPrefix(strings.TrimSpace(bytecodes[i]), "0x"), Constructor: evmABI.Constructor, Calls: calls, Transacts: transacts, Events: events, + Libraries: make(map[string]string), } + // Function 4-byte signatures are stored in the same sequence + // as types, if available. + if len(fsigs) > i { + contracts[types[i]].FuncSigs = fsigs[i] + } + // Parse library references. + for pattern, name := range libs { + matched, err := regexp.Match("__\\$"+pattern+"\\$__", []byte(contracts[types[i]].InputBin)) + if err != nil { + log.Error("Could not search for pattern", "pattern", pattern, "contract", contracts[types[i]], "err", err) + } + if matched { + contracts[types[i]].Libraries[pattern] = name + // keep track that this type is a library + if _, ok := isLib[name]; !ok { + isLib[name] = struct{}{} + } + } + } + } + // Check if that type has already been identified as a library + for i := 0; i < len(types); i++ { + _, ok := isLib[types[i]] + contracts[types[i]].Library = ok } // Generate the contract template data content and render it data := &tmplData{ Package: pkg, Contracts: contracts, + Libraries: libs, + Structs: structs, } buffer := new(bytes.Buffer) @@ -138,6 +210,8 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La "bindtype": bindType[lang], "bindtopictype": bindTopicType[lang], "namedtype": namedType[lang], + "formatmethod": formatMethod, + "formatevent": formatEvent, "capitalise": capitalise, "decapitalise": decapitalise, } @@ -159,129 +233,67 @@ func Bind(types []string, abis []string, bytecodes []string, pkg string, lang La // bindType is a set of type binders that convert Solidity types to some supported // programming language types. -var bindType = map[Lang]func(kind abi.Type) string{ +var bindType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct) string{ LangGo: bindTypeGo, LangJava: bindTypeJava, } -// Helper function for the binding generators. -// It reads the unmatched characters after the inner type-match, -// (since the inner type is a prefix of the total type declaration), -// looks for valid arrays (possibly a dynamic one) wrapping the inner type, -// and returns the sizes of these arrays. -// -// Returned array sizes are in the same order as solidity signatures; inner array size first. -// Array sizes may also be "", indicating a dynamic array. -func wrapArray(stringKind string, innerLen int, innerMapping string) (string, []string) { - remainder := stringKind[innerLen:] - //find all the sizes - matches := regexp.MustCompile(`\[(\d*)\]`).FindAllStringSubmatch(remainder, -1) - parts := make([]string, 0, len(matches)) - for _, match := range matches { - //get group 1 from the regex match - parts = append(parts, match[1]) - } - return innerMapping, parts -} - -// Translates the array sizes to a Go-lang declaration of a (nested) array of the inner type. -// Simply returns the inner type if arraySizes is empty. -func arrayBindingGo(inner string, arraySizes []string) string { - out := "" - //prepend all array sizes, from outer (end arraySizes) to inner (start arraySizes) - for i := len(arraySizes) - 1; i >= 0; i-- { - out += "[" + arraySizes[i] + "]" - } - out += inner - return out -} - -// bindTypeGo converts a Solidity type to a Go one. Since there is no clear mapping -// from all Solidity types to Go ones (e.g. uint17), those that cannot be exactly -// mapped will use an upscaled type (e.g. *big.Int). -func bindTypeGo(kind abi.Type) string { - stringKind := kind.String() - innerLen, innerMapping := bindUnnestedTypeGo(stringKind) - return arrayBindingGo(wrapArray(stringKind, innerLen, innerMapping)) -} - -// The inner function of bindTypeGo, this finds the inner type of stringKind. -// (Or just the type itself if it is not an array or slice) -// The length of the matched part is returned, with the translated type. -func bindUnnestedTypeGo(stringKind string) (int, string) { - - switch { - case strings.HasPrefix(stringKind, "address"): - return len("address"), "common.Address" - - case strings.HasPrefix(stringKind, "bytes"): - parts := regexp.MustCompile(`bytes([0-9]*)`).FindStringSubmatch(stringKind) - return len(parts[0]), fmt.Sprintf("[%s]byte", parts[1]) - - case strings.HasPrefix(stringKind, "int") || strings.HasPrefix(stringKind, "uint"): - parts := regexp.MustCompile(`(u)?int([0-9]*)`).FindStringSubmatch(stringKind) +// bindBasicTypeGo converts basic solidity types(except array, slice and tuple) to Go one. +func bindBasicTypeGo(kind abi.Type) string { + switch kind.T { + case abi.AddressTy: + return "common.Address" + case abi.IntTy, abi.UintTy: + parts := regexp.MustCompile(`(u)?int([0-9]*)`).FindStringSubmatch(kind.String()) switch parts[2] { case "8", "16", "32", "64": - return len(parts[0]), fmt.Sprintf("%sint%s", parts[1], parts[2]) + return fmt.Sprintf("%sint%s", parts[1], parts[2]) } - return len(parts[0]), "*big.Int" - - case strings.HasPrefix(stringKind, "bool"): - return len("bool"), "bool" - - case strings.HasPrefix(stringKind, "string"): - return len("string"), "string" - + return "*big.Int" + case abi.FixedBytesTy: + return fmt.Sprintf("[%d]byte", kind.Size) + case abi.BytesTy: + return "[]byte" + case abi.FunctionTy: + return "[24]byte" default: - return len(stringKind), stringKind + // string, bool types + return kind.String() } } -// Translates the array sizes to a Java declaration of a (nested) array of the inner type. -// Simply returns the inner type if arraySizes is empty. -func arrayBindingJava(inner string, arraySizes []string) string { - // Java array type declarations do not include the length. - return inner + strings.Repeat("[]", len(arraySizes)) -} - -// bindTypeJava converts a Solidity type to a Java one. Since there is no clear mapping -// from all Solidity types to Java ones (e.g. uint17), those that cannot be exactly +// bindTypeGo converts solidity types to Go ones. Since there is no clear mapping +// from all Solidity types to Go ones (e.g. uint17), those that cannot be exactly // mapped will use an upscaled type (e.g. BigDecimal). -func bindTypeJava(kind abi.Type) string { - stringKind := kind.String() - innerLen, innerMapping := bindUnnestedTypeJava(stringKind) - return arrayBindingJava(wrapArray(stringKind, innerLen, innerMapping)) +func bindTypeGo(kind abi.Type, structs map[string]*tmplStruct) string { + switch kind.T { + case abi.TupleTy: + return structs[kind.TupleRawName+kind.String()].Name + case abi.ArrayTy: + return fmt.Sprintf("[%d]", kind.Size) + bindTypeGo(*kind.Elem, structs) + case abi.SliceTy: + return "[]" + bindTypeGo(*kind.Elem, structs) + default: + return bindBasicTypeGo(kind) + } } -// The inner function of bindTypeJava, this finds the inner type of stringKind. -// (Or just the type itself if it is not an array or slice) -// The length of the matched part is returned, with the translated type. -func bindUnnestedTypeJava(stringKind string) (int, string) { - - switch { - case strings.HasPrefix(stringKind, "address"): - parts := regexp.MustCompile(`address(\[[0-9]*\])?`).FindStringSubmatch(stringKind) - if len(parts) != 2 { - return len(stringKind), stringKind - } - if parts[1] == "" { - return len("address"), "Address" - } - return len(parts[0]), "Addresses" - - case strings.HasPrefix(stringKind, "bytes"): - parts := regexp.MustCompile(`bytes([0-9]*)`).FindStringSubmatch(stringKind) - if len(parts) != 2 { - return len(stringKind), stringKind - } - return len(parts[0]), "byte[]" - - case strings.HasPrefix(stringKind, "int") || strings.HasPrefix(stringKind, "uint"): - //Note that uint and int (without digits) are also matched, +// bindBasicTypeJava converts basic solidity types(except array, slice and tuple) to Java one. +func bindBasicTypeJava(kind abi.Type) string { + switch kind.T { + case abi.AddressTy: + return "Address" + case abi.IntTy, abi.UintTy: + // Note that uint and int (without digits) are also matched, // these are size 256, and will translate to BigInt (the default). - parts := regexp.MustCompile(`(u)?int([0-9]*)`).FindStringSubmatch(stringKind) + parts := regexp.MustCompile(`(u)?int([0-9]*)`).FindStringSubmatch(kind.String()) if len(parts) != 3 { - return len(stringKind), stringKind + return kind.String() + } + // All unsigned integers should be translated to BigInt since gomobile doesn't + // support them. + if parts[1] == "u" { + return "BigInt" } namedSize := map[string]string{ @@ -291,50 +303,180 @@ func bindUnnestedTypeJava(stringKind string) (int, string) { "64": "long", }[parts[2]] - //default to BigInt + // default to BigInt if namedSize == "" { namedSize = "BigInt" } - return len(parts[0]), namedSize - - case strings.HasPrefix(stringKind, "bool"): - return len("bool"), "boolean" + return namedSize + case abi.FixedBytesTy, abi.BytesTy: + return "byte[]" + case abi.BoolTy: + return "boolean" + case abi.StringTy: + return "String" + case abi.FunctionTy: + return "byte[24]" + default: + return kind.String() + } +} - case strings.HasPrefix(stringKind, "string"): - return len("string"), "String" +// pluralizeJavaType explicitly converts multidimensional types to predefined +// type in go side. +func pluralizeJavaType(typ string) string { + switch typ { + case "boolean": + return "Bools" + case "String": + return "Strings" + case "Address": + return "Addresses" + case "byte[]": + return "Binaries" + case "BigInt": + return "BigInts" + } + return typ + "[]" +} +// bindTypeJava converts a Solidity type to a Java one. Since there is no clear mapping +// from all Solidity types to Java ones (e.g. uint17), those that cannot be exactly +// mapped will use an upscaled type (e.g. BigDecimal). +func bindTypeJava(kind abi.Type, structs map[string]*tmplStruct) string { + switch kind.T { + case abi.TupleTy: + return structs[kind.TupleRawName+kind.String()].Name + case abi.ArrayTy, abi.SliceTy: + return pluralizeJavaType(bindTypeJava(*kind.Elem, structs)) default: - return len(stringKind), stringKind + return bindBasicTypeJava(kind) } } // bindTopicType is a set of type binders that convert Solidity types to some // supported programming language topic types. -var bindTopicType = map[Lang]func(kind abi.Type) string{ +var bindTopicType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct) string{ LangGo: bindTopicTypeGo, LangJava: bindTopicTypeJava, } -// bindTypeGo converts a Solidity topic type to a Go one. It is almost the same +// bindTopicTypeGo converts a Solidity topic type to a Go one. It is almost the same // funcionality as for simple types, but dynamic types get converted to hashes. -func bindTopicTypeGo(kind abi.Type) string { - bound := bindTypeGo(kind) +func bindTopicTypeGo(kind abi.Type, structs map[string]*tmplStruct) string { + bound := bindTypeGo(kind, structs) + + // todo(rjl493456442) according solidity documentation, indexed event + // parameters that are not value types i.e. arrays and structs are not + // stored directly but instead a keccak256-hash of an encoding is stored. + // + // We only convert stringS and bytes to hash, still need to deal with + // array(both fixed-size and dynamic-size) and struct. if bound == "string" || bound == "[]byte" { bound = "common.Hash" } return bound } -// bindTypeGo converts a Solidity topic type to a Java one. It is almost the same +// bindTopicTypeJava converts a Solidity topic type to a Java one. It is almost the same // funcionality as for simple types, but dynamic types get converted to hashes. -func bindTopicTypeJava(kind abi.Type) string { - bound := bindTypeJava(kind) - if bound == "String" || bound == "Bytes" { +func bindTopicTypeJava(kind abi.Type, structs map[string]*tmplStruct) string { + bound := bindTypeJava(kind, structs) + + // todo(rjl493456442) according solidity documentation, indexed event + // parameters that are not value types i.e. arrays and structs are not + // stored directly but instead a keccak256-hash of an encoding is stored. + // + // We only convert stringS and bytes to hash, still need to deal with + // array(both fixed-size and dynamic-size) and struct. + if bound == "String" || bound == "byte[]" { bound = "Hash" } return bound } +// bindStructType is a set of type binders that convert Solidity tuple types to some supported +// programming language struct definition. +var bindStructType = map[Lang]func(kind abi.Type, structs map[string]*tmplStruct) string{ + LangGo: bindStructTypeGo, + LangJava: bindStructTypeJava, +} + +// bindStructTypeGo converts a Solidity tuple type to a Go one and records the mapping +// in the given map. +// Notably, this function will resolve and record nested struct recursively. +func bindStructTypeGo(kind abi.Type, structs map[string]*tmplStruct) string { + switch kind.T { + case abi.TupleTy: + // We compose raw struct name and canonical parameter expression + // together here. The reason is before solidity v0.5.11, kind.TupleRawName + // is empty, so we use canonical parameter expression to distinguish + // different struct definition. From the consideration of backward + // compatibility, we concat these two together so that if kind.TupleRawName + // is not empty, it can have unique id. + id := kind.TupleRawName + kind.String() + if s, exist := structs[id]; exist { + return s.Name + } + var fields []*tmplField + for i, elem := range kind.TupleElems { + field := bindStructTypeGo(*elem, structs) + fields = append(fields, &tmplField{Type: field, Name: capitalise(kind.TupleRawNames[i]), SolKind: *elem}) + } + name := kind.TupleRawName + if name == "" { + name = fmt.Sprintf("Struct%d", len(structs)) + } + structs[id] = &tmplStruct{ + Name: name, + Fields: fields, + } + return name + case abi.ArrayTy: + return fmt.Sprintf("[%d]", kind.Size) + bindStructTypeGo(*kind.Elem, structs) + case abi.SliceTy: + return "[]" + bindStructTypeGo(*kind.Elem, structs) + default: + return bindBasicTypeGo(kind) + } +} + +// bindStructTypeJava converts a Solidity tuple type to a Java one and records the mapping +// in the given map. +// Notably, this function will resolve and record nested struct recursively. +func bindStructTypeJava(kind abi.Type, structs map[string]*tmplStruct) string { + switch kind.T { + case abi.TupleTy: + // We compose raw struct name and canonical parameter expression + // together here. The reason is before solidity v0.5.11, kind.TupleRawName + // is empty, so we use canonical parameter expression to distinguish + // different struct definition. From the consideration of backward + // compatibility, we concat these two together so that if kind.TupleRawName + // is not empty, it can have unique id. + id := kind.TupleRawName + kind.String() + if s, exist := structs[id]; exist { + return s.Name + } + var fields []*tmplField + for i, elem := range kind.TupleElems { + field := bindStructTypeJava(*elem, structs) + fields = append(fields, &tmplField{Type: field, Name: decapitalise(kind.TupleRawNames[i]), SolKind: *elem}) + } + name := kind.TupleRawName + if name == "" { + name = fmt.Sprintf("Class%d", len(structs)) + } + structs[id] = &tmplStruct{ + Name: name, + Fields: fields, + } + return name + case abi.ArrayTy, abi.SliceTy: + return pluralizeJavaType(bindStructTypeJava(*kind.Elem, structs)) + default: + return bindBasicTypeJava(kind) + } +} + // namedType is a set of functions that transform language specific types to // named versions that my be used inside method names. var namedType = map[Lang]func(string, abi.Type) string{ @@ -348,18 +490,8 @@ func namedTypeJava(javaKind string, solKind abi.Type) string { switch javaKind { case "byte[]": return "Binary" - case "byte[][]": - return "Binaries" - case "string": - return "String" - case "string[]": - return "Strings" case "boolean": return "Bool" - case "boolean[]": - return "Bools" - case "BigInt[]": - return "BigInts" default: parts := regexp.MustCompile(`(u)?int([0-9]*)(\[[0-9]*\])?`).FindStringSubmatch(solKind.String()) if len(parts) != 4 { @@ -378,6 +510,15 @@ func namedTypeJava(javaKind string, solKind abi.Type) string { } } +// alias returns an alias of the given string based on the aliasing rules +// or returns itself if no rule is matched. +func alias(aliases map[string]string, n string) string { + if alias, exist := aliases[n]; exist { + return alias + } + return n +} + // methodNormalizer is a name transformer that modifies Solidity method names to // conform to target language naming concentions. var methodNormalizer = map[Lang]func(string) string{ @@ -422,3 +563,78 @@ func structured(args abi.Arguments) bool { } return true } + +// hasStruct returns an indicator whether the given type is struct, struct slice +// or struct array. +func hasStruct(t abi.Type) bool { + switch t.T { + case abi.SliceTy: + return hasStruct(*t.Elem) + case abi.ArrayTy: + return hasStruct(*t.Elem) + case abi.TupleTy: + return true + default: + return false + } +} + +// resolveArgName converts a raw argument representation into a user friendly format. +func resolveArgName(arg abi.Argument, structs map[string]*tmplStruct) string { + var ( + prefix string + embedded string + typ = &arg.Type + ) +loop: + for { + switch typ.T { + case abi.SliceTy: + prefix += "[]" + case abi.ArrayTy: + prefix += fmt.Sprintf("[%d]", typ.Size) + default: + embedded = typ.TupleRawName + typ.String() + break loop + } + typ = typ.Elem + } + if s, exist := structs[embedded]; exist { + return prefix + s.Name + } else { + return arg.Type.String() + } +} + +// formatMethod transforms raw method representation into a user friendly one. +func formatMethod(method abi.Method, structs map[string]*tmplStruct) string { + inputs := make([]string, len(method.Inputs)) + for i, input := range method.Inputs { + inputs[i] = fmt.Sprintf("%v %v", resolveArgName(input, structs), input.Name) + } + outputs := make([]string, len(method.Outputs)) + for i, output := range method.Outputs { + outputs[i] = resolveArgName(output, structs) + if len(output.Name) > 0 { + outputs[i] += fmt.Sprintf(" %v", output.Name) + } + } + constant := "" + if method.Const { + constant = "constant " + } + return fmt.Sprintf("function %v(%v) %sreturns(%v)", method.RawName, strings.Join(inputs, ", "), constant, strings.Join(outputs, ", ")) +} + +// formatEvent transforms raw event representation into a user friendly one. +func formatEvent(event abi.Event, structs map[string]*tmplStruct) string { + inputs := make([]string, len(event.Inputs)) + for i, input := range event.Inputs { + if input.Indexed { + inputs[i] = fmt.Sprintf("%v indexed %v", resolveArgName(input, structs), input.Name) + } else { + inputs[i] = fmt.Sprintf("%v %v", resolveArgName(input, structs), input.Name) + } + } + return fmt.Sprintf("event %v(%v)", event.RawName, strings.Join(inputs, ", ")) +} diff --git a/accounts/abi/bind/bind_test.go b/accounts/abi/bind/bind_test.go index 7606747cb3b0..7594af775e8b 100644 --- a/accounts/abi/bind/bind_test.go +++ b/accounts/abi/bind/bind_test.go @@ -26,24 +26,28 @@ import ( "strings" "testing" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) var bindTests = []struct { name string contract string - bytecode string - abi string + bytecode []string + abi []string imports string tester string + fsigs []map[string]string + libs map[string]string + aliases map[string]string + types []string }{ // Test that the binding is available in combined and separate forms too { `Empty`, `contract NilContract {}`, - `606060405260068060106000396000f3606060405200`, - `[]`, - `"github.com/nebulaai/nbai-node/common"`, + []string{`606060405260068060106000396000f3606060405200`}, + []string{`[]`}, + `"github.com/ethereum/go-ethereum/common"`, ` if b, err := NewEmpty(common.Address{}, nil); b == nil || err != nil { t.Fatalf("combined binding (%v) nil or error (%v) not nil", b, nil) @@ -55,48 +59,64 @@ var bindTests = []struct { t.Fatalf("transactor binding (%v) nil or error (%v) not nil", b, nil) } `, + nil, + nil, + nil, + nil, }, // Test that all the official sample contracts bind correctly { `Token`, `https://ethereum.org/token`, - `60606040526040516107fd3803806107fd83398101604052805160805160a05160c051929391820192909101600160a060020a0333166000908152600360209081526040822086905581548551838052601f6002600019610100600186161502019093169290920482018390047f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390810193919290918801908390106100e857805160ff19168380011785555b506101189291505b8082111561017157600081556001016100b4565b50506002805460ff19168317905550505050610658806101a56000396000f35b828001600101855582156100ac579182015b828111156100ac5782518260005055916020019190600101906100fa565b50508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017557805160ff19168380011785555b506100c89291506100b4565b5090565b82800160010185558215610165579182015b8281111561016557825182600050559160200191906001019061018756606060405236156100775760e060020a600035046306fdde03811461007f57806323b872dd146100dc578063313ce5671461010e57806370a082311461011a57806395d89b4114610132578063a9059cbb1461018e578063cae9ca51146101bd578063dc3080f21461031c578063dd62ed3e14610341575b610365610002565b61036760008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b6103d5600435602435604435600160a060020a038316600090815260036020526040812054829010156104f357610002565b6103e760025460ff1681565b6103d560043560036020526000908152604090205481565b610367600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b610365600435602435600160a060020a033316600090815260036020526040902054819010156103f157610002565b60806020604435600481810135601f8101849004909302840160405260608381526103d5948235946024803595606494939101919081908382808284375094965050505050505060006000836004600050600033600160a060020a03168152602001908152602001600020600050600087600160a060020a031681526020019081526020016000206000508190555084905080600160a060020a0316638f4ffcb1338630876040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156102f25780820380516001836020036101000a031916815260200191505b50955050505050506000604051808303816000876161da5a03f11561000257505050509392505050565b6005602090815260043560009081526040808220909252602435815220546103d59081565b60046020818152903560009081526040808220909252602435815220546103d59081565b005b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156103c75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60408051918252519081900360200190f35b6060908152602090f35b600160a060020a03821660009081526040902054808201101561041357610002565b806003600050600033600160a060020a03168152602001908152602001600020600082828250540392505081905550806003600050600084600160a060020a0316815260200190815260200160002060008282825054019250508190555081600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b820191906000526020600020905b8154815290600101906020018083116104ce57829003601f168201915b505050505081565b600160a060020a03831681526040812054808301101561051257610002565b600160a060020a0380851680835260046020908152604080852033949094168086529382528085205492855260058252808520938552929052908220548301111561055c57610002565b816003600050600086600160a060020a03168152602001908152602001600020600082828250540392505081905550816003600050600085600160a060020a03168152602001908152602001600020600082828250540192505081905550816005600050600086600160a060020a03168152602001908152602001600020600050600033600160a060020a0316815260200190815260200160002060008282825054019250508190555082600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3939250505056`, - `[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"approveAndCall","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"spentAllowance","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"inputs":[{"name":"initialSupply","type":"uint256"},{"name":"tokenName","type":"string"},{"name":"decimalUnits","type":"uint8"},{"name":"tokenSymbol","type":"string"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]`, - `"github.com/nebulaai/nbai-node/common"`, + []string{`60606040526040516107fd3803806107fd83398101604052805160805160a05160c051929391820192909101600160a060020a0333166000908152600360209081526040822086905581548551838052601f6002600019610100600186161502019093169290920482018390047f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390810193919290918801908390106100e857805160ff19168380011785555b506101189291505b8082111561017157600081556001016100b4565b50506002805460ff19168317905550505050610658806101a56000396000f35b828001600101855582156100ac579182015b828111156100ac5782518260005055916020019190600101906100fa565b50508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017557805160ff19168380011785555b506100c89291506100b4565b5090565b82800160010185558215610165579182015b8281111561016557825182600050559160200191906001019061018756606060405236156100775760e060020a600035046306fdde03811461007f57806323b872dd146100dc578063313ce5671461010e57806370a082311461011a57806395d89b4114610132578063a9059cbb1461018e578063cae9ca51146101bd578063dc3080f21461031c578063dd62ed3e14610341575b610365610002565b61036760008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b6103d5600435602435604435600160a060020a038316600090815260036020526040812054829010156104f357610002565b6103e760025460ff1681565b6103d560043560036020526000908152604090205481565b610367600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b610365600435602435600160a060020a033316600090815260036020526040902054819010156103f157610002565b60806020604435600481810135601f8101849004909302840160405260608381526103d5948235946024803595606494939101919081908382808284375094965050505050505060006000836004600050600033600160a060020a03168152602001908152602001600020600050600087600160a060020a031681526020019081526020016000206000508190555084905080600160a060020a0316638f4ffcb1338630876040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156102f25780820380516001836020036101000a031916815260200191505b50955050505050506000604051808303816000876161da5a03f11561000257505050509392505050565b6005602090815260043560009081526040808220909252602435815220546103d59081565b60046020818152903560009081526040808220909252602435815220546103d59081565b005b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156103c75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60408051918252519081900360200190f35b6060908152602090f35b600160a060020a03821660009081526040902054808201101561041357610002565b806003600050600033600160a060020a03168152602001908152602001600020600082828250540392505081905550806003600050600084600160a060020a0316815260200190815260200160002060008282825054019250508190555081600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b820191906000526020600020905b8154815290600101906020018083116104ce57829003601f168201915b505050505081565b600160a060020a03831681526040812054808301101561051257610002565b600160a060020a0380851680835260046020908152604080852033949094168086529382528085205492855260058252808520938552929052908220548301111561055c57610002565b816003600050600086600160a060020a03168152602001908152602001600020600082828250540392505081905550816003600050600085600160a060020a03168152602001908152602001600020600082828250540192505081905550816005600050600086600160a060020a03168152602001908152602001600020600050600033600160a060020a0316815260200190815260200160002060008282825054019250508190555082600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3939250505056`}, + []string{`[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"approveAndCall","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"spentAllowance","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"inputs":[{"name":"initialSupply","type":"uint256"},{"name":"tokenName","type":"string"},{"name":"decimalUnits","type":"uint8"},{"name":"tokenSymbol","type":"string"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]`}, + `"github.com/ethereum/go-ethereum/common"`, ` if b, err := NewToken(common.Address{}, nil); b == nil || err != nil { t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil) } `, + nil, + nil, + nil, + nil, }, { `Crowdsale`, `https://ethereum.org/crowdsale`, - `606060408190526007805460ff1916905560a0806105a883396101006040529051608051915160c05160e05160008054600160a060020a03199081169095178155670de0b6b3a7640000958602600155603c9093024201600355930260045560058054909216909217905561052f90819061007990396000f36060604052361561006c5760e060020a600035046301cb3b20811461008257806329dcb0cf1461014457806338af3eed1461014d5780636e66f6e91461015f5780637a3a0e84146101715780637b3e5e7b1461017a578063a035b1fe14610183578063dc0d3dff1461018c575b61020060075460009060ff161561032357610002565b61020060035460009042106103205760025460015490106103cb576002548154600160a060020a0316908290606082818181858883f150915460025460408051600160a060020a039390931683526020830191909152818101869052517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6945090819003909201919050a15b60405160008054600160a060020a039081169230909116319082818181858883f150506007805460ff1916600117905550505050565b6103a160035481565b6103ab600054600160a060020a031681565b6103ab600554600160a060020a031681565b6103a160015481565b6103a160025481565b6103a160045481565b6103be60043560068054829081101561000257506000526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f8101547ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d409190910154600160a060020a03919091169082565b005b505050815481101561000257906000526020600020906002020160005060008201518160000160006101000a815481600160a060020a030219169083021790555060208201518160010160005055905050806002600082828250540192505081905550600560009054906101000a9004600160a060020a0316600160a060020a031663a9059cbb3360046000505484046040518360e060020a0281526004018083600160a060020a03168152602001828152602001925050506000604051808303816000876161da5a03f11561000257505060408051600160a060020a03331681526020810184905260018183015290517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf692509081900360600190a15b50565b5060a0604052336060908152346080819052600680546001810180835592939282908280158290116102025760020281600202836000526020600020918201910161020291905b8082111561039d57805473ffffffffffffffffffffffffffffffffffffffff19168155600060019190910190815561036a565b5090565b6060908152602090f35b600160a060020a03166060908152602090f35b6060918252608052604090f35b5b60065481101561010e576006805482908110156100025760009182526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0190600680549254600160a060020a0316928490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460405190915082818181858883f19350505050507fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf660066000508281548110156100025760008290526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01548154600160a060020a039190911691908490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460408051600160a060020a0394909416845260208401919091526000838201525191829003606001919050a16001016103cc56`, - `[{"constant":false,"inputs":[],"name":"checkGoalReached","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"deadline","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"beneficiary","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"tokenReward","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"fundingGoal","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"amountRaised","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"price","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"funders","outputs":[{"name":"addr","type":"address"},{"name":"amount","type":"uint256"}],"type":"function"},{"inputs":[{"name":"ifSuccessfulSendTo","type":"address"},{"name":"fundingGoalInEthers","type":"uint256"},{"name":"durationInMinutes","type":"uint256"},{"name":"etherCostOfEachToken","type":"uint256"},{"name":"addressOfTokenUsedAsReward","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"backer","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"isContribution","type":"bool"}],"name":"FundTransfer","type":"event"}]`, - `"github.com/nebulaai/nbai-node/common"`, + []string{`606060408190526007805460ff1916905560a0806105a883396101006040529051608051915160c05160e05160008054600160a060020a03199081169095178155670de0b6b3a7640000958602600155603c9093024201600355930260045560058054909216909217905561052f90819061007990396000f36060604052361561006c5760e060020a600035046301cb3b20811461008257806329dcb0cf1461014457806338af3eed1461014d5780636e66f6e91461015f5780637a3a0e84146101715780637b3e5e7b1461017a578063a035b1fe14610183578063dc0d3dff1461018c575b61020060075460009060ff161561032357610002565b61020060035460009042106103205760025460015490106103cb576002548154600160a060020a0316908290606082818181858883f150915460025460408051600160a060020a039390931683526020830191909152818101869052517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6945090819003909201919050a15b60405160008054600160a060020a039081169230909116319082818181858883f150506007805460ff1916600117905550505050565b6103a160035481565b6103ab600054600160a060020a031681565b6103ab600554600160a060020a031681565b6103a160015481565b6103a160025481565b6103a160045481565b6103be60043560068054829081101561000257506000526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f8101547ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d409190910154600160a060020a03919091169082565b005b505050815481101561000257906000526020600020906002020160005060008201518160000160006101000a815481600160a060020a030219169083021790555060208201518160010160005055905050806002600082828250540192505081905550600560009054906101000a9004600160a060020a0316600160a060020a031663a9059cbb3360046000505484046040518360e060020a0281526004018083600160a060020a03168152602001828152602001925050506000604051808303816000876161da5a03f11561000257505060408051600160a060020a03331681526020810184905260018183015290517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf692509081900360600190a15b50565b5060a0604052336060908152346080819052600680546001810180835592939282908280158290116102025760020281600202836000526020600020918201910161020291905b8082111561039d57805473ffffffffffffffffffffffffffffffffffffffff19168155600060019190910190815561036a565b5090565b6060908152602090f35b600160a060020a03166060908152602090f35b6060918252608052604090f35b5b60065481101561010e576006805482908110156100025760009182526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0190600680549254600160a060020a0316928490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460405190915082818181858883f19350505050507fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf660066000508281548110156100025760008290526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01548154600160a060020a039190911691908490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460408051600160a060020a0394909416845260208401919091526000838201525191829003606001919050a16001016103cc56`}, + []string{`[{"constant":false,"inputs":[],"name":"checkGoalReached","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"deadline","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"beneficiary","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"tokenReward","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"fundingGoal","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"amountRaised","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"price","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"funders","outputs":[{"name":"addr","type":"address"},{"name":"amount","type":"uint256"}],"type":"function"},{"inputs":[{"name":"ifSuccessfulSendTo","type":"address"},{"name":"fundingGoalInEthers","type":"uint256"},{"name":"durationInMinutes","type":"uint256"},{"name":"etherCostOfEachToken","type":"uint256"},{"name":"addressOfTokenUsedAsReward","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"backer","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"isContribution","type":"bool"}],"name":"FundTransfer","type":"event"}]`}, + `"github.com/ethereum/go-ethereum/common"`, ` if b, err := NewCrowdsale(common.Address{}, nil); b == nil || err != nil { t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil) } `, + nil, + nil, + nil, + nil, }, { `DAO`, `https://ethereum.org/dao`, - `606060405260405160808061145f833960e06040529051905160a05160c05160008054600160a060020a03191633179055600184815560028490556003839055600780549182018082558280158290116100b8576003028160030283600052602060002091820191016100b891906101c8565b50506060919091015160029190910155600160a060020a0381166000146100a65760008054600160a060020a031916821790555b505050506111f18061026e6000396000f35b505060408051608081018252600080825260208281018290528351908101845281815292820192909252426060820152600780549194509250811015610002579081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889050815181546020848101517401000000000000000000000000000000000000000002600160a060020a03199290921690921760a060020a60ff021916178255604083015180516001848101805460008281528690209195600293821615610100026000190190911692909204601f9081018390048201949192919091019083901061023e57805160ff19168380011785555b50610072929150610226565b5050600060028201556001015b8082111561023a578054600160a860020a031916815560018181018054600080835592600290821615610100026000190190911604601f81901061020c57506101bb565b601f0160209004906000526020600020908101906101bb91905b8082111561023a5760008155600101610226565b5090565b828001600101855582156101af579182015b828111156101af57825182600050559160200191906001019061025056606060405236156100b95760e060020a6000350463013cf08b81146100bb578063237e9492146101285780633910682114610281578063400e3949146102995780635daf08ca146102a257806369bd34361461032f5780638160f0b5146103385780638da5cb5b146103415780639644fcbd14610353578063aa02a90f146103be578063b1050da5146103c7578063bcca1fd3146104b5578063d3c0715b146104dc578063eceb29451461058d578063f2fde38b1461067b575b005b61069c6004356004805482908110156100025790600052602060002090600a02016000506005810154815460018301546003840154600485015460068601546007870154600160a060020a03959095169750929560020194919360ff828116946101009093041692919089565b60408051602060248035600481810135601f81018590048502860185019096528585526107759581359591946044949293909201918190840183828082843750949650505050505050600060006004600050848154811015610002575090527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e600a8402908101547f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909101904210806101e65750600481015460ff165b8061026757508060000160009054906101000a9004600160a060020a03168160010160005054846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f15090500193505050506040518091039020816007016000505414155b8061027757506001546005820154105b1561109257610002565b61077560043560066020526000908152604090205481565b61077560055481565b61078760043560078054829081101561000257506000526003026000805160206111d18339815191528101547fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a820154600160a060020a0382169260a060020a90920460ff16917fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689019084565b61077560025481565b61077560015481565b610830600054600160a060020a031681565b604080516020604435600481810135601f81018490048402850184019095528484526100b9948135946024803595939460649492939101918190840183828082843750949650505050505050600080548190600160a060020a03908116339091161461084d57610002565b61077560035481565b604080516020604435600481810135601f8101849004840285018401909552848452610775948135946024803595939460649492939101918190840183828082843750506040805160209735808a0135601f81018a90048a0283018a019093528282529698976084979196506024909101945090925082915084018382808284375094965050505050505033600160a060020a031660009081526006602052604081205481908114806104ab5750604081205460078054909190811015610002579082526003026000805160206111d1833981519152015460a060020a900460ff16155b15610ce557610002565b6100b960043560243560443560005433600160a060020a03908116911614610b1857610002565b604080516020604435600481810135601f810184900484028501840190955284845261077594813594602480359593946064949293910191819084018382808284375094965050505050505033600160a060020a031660009081526006602052604081205481908114806105835750604081205460078054909190811015610002579082526003026000805160206111d18339815191520181505460a060020a900460ff16155b15610f1d57610002565b604080516020606435600481810135601f81018490048402850184019095528484526107759481359460248035956044359560849492019190819084018382808284375094965050505050505060006000600460005086815481101561000257908252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01815090508484846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f150905001935050505060405180910390208160070160005054149150610cdc565b6100b960043560005433600160a060020a03908116911614610f0857610002565b604051808a600160a060020a031681526020018981526020018060200188815260200187815260200186815260200185815260200184815260200183815260200182810382528981815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561075e5780601f106107335761010080835404028352916020019161075e565b820191906000526020600020905b81548152906001019060200180831161074157829003601f168201915b50509a505050505050505050505060405180910390f35b60408051918252519081900360200190f35b60408051600160a060020a038616815260208101859052606081018390526080918101828152845460026001821615610100026000190190911604928201839052909160a08301908590801561081e5780601f106107f35761010080835404028352916020019161081e565b820191906000526020600020905b81548152906001019060200180831161080157829003601f168201915b50509550505050505060405180910390f35b60408051600160a060020a03929092168252519081900360200190f35b600160a060020a03851660009081526006602052604081205414156108a957604060002060078054918290556001820180825582801582901161095c5760030281600302836000526020600020918201910161095c9190610a4f565b600160a060020a03851660009081526006602052604090205460078054919350908390811015610002575060005250600381026000805160206111d183398151915201805474ff0000000000000000000000000000000000000000191660a060020a85021781555b60408051600160a060020a03871681526020810186905281517f27b022af4a8347100c7a041ce5ccf8e14d644ff05de696315196faae8cd50c9b929181900390910190a15050505050565b505050915081506080604051908101604052808681526020018581526020018481526020014281526020015060076000508381548110156100025790600052602060002090600302016000508151815460208481015160a060020a02600160a060020a03199290921690921774ff00000000000000000000000000000000000000001916178255604083015180516001848101805460008281528690209195600293821615610100026000190190911692909204601f90810183900482019491929190910190839010610ad357805160ff19168380011785555b50610b03929150610abb565b5050600060028201556001015b80821115610acf57805474ffffffffffffffffffffffffffffffffffffffffff1916815560018181018054600080835592600290821615610100026000190190911604601f819010610aa15750610a42565b601f016020900490600052602060002090810190610a4291905b80821115610acf5760008155600101610abb565b5090565b82800160010185558215610a36579182015b82811115610a36578251826000505591602001919060010190610ae5565b50506060919091015160029190910155610911565b600183905560028290556003819055604080518481526020810184905280820183905290517fa439d3fa452be5e0e1e24a8145e715f4fd8b9c08c96a42fd82a855a85e5d57de9181900360600190a1505050565b50508585846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f150905001935050505060405180910390208160070160005081905550600260005054603c024201816003016000508190555060008160040160006101000a81548160ff0219169083021790555060008160040160016101000a81548160ff02191690830217905550600081600501600050819055507f646fec02522b41e7125cfc859a64fd4f4cefd5dc3b6237ca0abe251ded1fa881828787876040518085815260200184600160a060020a03168152602001838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f168015610cc45780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1600182016005555b50949350505050565b6004805460018101808355909190828015829011610d1c57600a0281600a028360005260206000209182019101610d1c9190610db8565b505060048054929450918491508110156100025790600052602060002090600a02016000508054600160a060020a031916871781556001818101879055855160028381018054600082815260209081902096975091959481161561010002600019011691909104601f90810182900484019391890190839010610ed857805160ff19168380011785555b50610b6c929150610abb565b50506001015b80821115610acf578054600160a060020a03191681556000600182810182905560028381018054848255909281161561010002600019011604601f819010610e9c57505b5060006003830181905560048301805461ffff191690556005830181905560068301819055600783018190556008830180548282559082526020909120610db2916002028101905b80821115610acf57805474ffffffffffffffffffffffffffffffffffffffffff1916815560018181018054600080835592600290821615610100026000190190911604601f819010610eba57505b5050600101610e44565b601f016020900490600052602060002090810190610dfc9190610abb565b601f016020900490600052602060002090810190610e929190610abb565b82800160010185558215610da6579182015b82811115610da6578251826000505591602001919060010190610eea565b60008054600160a060020a0319168217905550565b600480548690811015610002576000918252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01905033600160a060020a0316600090815260098201602052604090205490915060ff1660011415610f8457610002565b33600160a060020a031660009081526009820160205260409020805460ff1916600190811790915560058201805490910190558315610fcd576006810180546001019055610fda565b6006810180546000190190555b7fc34f869b7ff431b034b7b9aea9822dac189a685e0b015c7d1be3add3f89128e8858533866040518085815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f16801561107a5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1509392505050565b6006810154600354901315611158578060000160009054906101000a9004600160a060020a0316600160a060020a03168160010160005054670de0b6b3a76400000284604051808280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156111225780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876185025a03f15050505060048101805460ff191660011761ff00191661010017905561116d565b60048101805460ff191660011761ff00191690555b60068101546005820154600483015460408051888152602081019490945283810192909252610100900460ff166060830152517fd220b7272a8b6d0d7d6bcdace67b936a8f175e6d5c1b3ee438b72256b32ab3af9181900360800190a1509291505056a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688`, - `[{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"proposals","outputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"},{"name":"description","type":"string"},{"name":"votingDeadline","type":"uint256"},{"name":"executed","type":"bool"},{"name":"proposalPassed","type":"bool"},{"name":"numberOfVotes","type":"uint256"},{"name":"currentResult","type":"int256"},{"name":"proposalHash","type":"bytes32"}],"type":"function"},{"constant":false,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"transactionBytecode","type":"bytes"}],"name":"executeProposal","outputs":[{"name":"result","type":"int256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"memberId","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"numProposals","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"members","outputs":[{"name":"member","type":"address"},{"name":"canVote","type":"bool"},{"name":"name","type":"string"},{"name":"memberSince","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"debatingPeriodInMinutes","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"minimumQuorum","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"targetMember","type":"address"},{"name":"canVote","type":"bool"},{"name":"memberName","type":"string"}],"name":"changeMembership","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"majorityMargin","outputs":[{"name":"","type":"int256"}],"type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"etherAmount","type":"uint256"},{"name":"JobDescription","type":"string"},{"name":"transactionBytecode","type":"bytes"}],"name":"newProposal","outputs":[{"name":"proposalID","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"minimumQuorumForProposals","type":"uint256"},{"name":"minutesForDebate","type":"uint256"},{"name":"marginOfVotesForMajority","type":"int256"}],"name":"changeVotingRules","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"supportsProposal","type":"bool"},{"name":"justificationText","type":"string"}],"name":"vote","outputs":[{"name":"voteID","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"beneficiary","type":"address"},{"name":"etherAmount","type":"uint256"},{"name":"transactionBytecode","type":"bytes"}],"name":"checkProposalCode","outputs":[{"name":"codeChecksOut","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"type":"function"},{"inputs":[{"name":"minimumQuorumForProposals","type":"uint256"},{"name":"minutesForDebate","type":"uint256"},{"name":"marginOfVotesForMajority","type":"int256"},{"name":"congressLeader","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"recipient","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"description","type":"string"}],"name":"ProposalAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"position","type":"bool"},{"indexed":false,"name":"voter","type":"address"},{"indexed":false,"name":"justification","type":"string"}],"name":"Voted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"result","type":"int256"},{"indexed":false,"name":"quorum","type":"uint256"},{"indexed":false,"name":"active","type":"bool"}],"name":"ProposalTallied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"member","type":"address"},{"indexed":false,"name":"isMember","type":"bool"}],"name":"MembershipChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"minimumQuorum","type":"uint256"},{"indexed":false,"name":"debatingPeriodInMinutes","type":"uint256"},{"indexed":false,"name":"majorityMargin","type":"int256"}],"name":"ChangeOfRules","type":"event"}]`, - `"github.com/nebulaai/nbai-node/common"`, + []string{`606060405260405160808061145f833960e06040529051905160a05160c05160008054600160a060020a03191633179055600184815560028490556003839055600780549182018082558280158290116100b8576003028160030283600052602060002091820191016100b891906101c8565b50506060919091015160029190910155600160a060020a0381166000146100a65760008054600160a060020a031916821790555b505050506111f18061026e6000396000f35b505060408051608081018252600080825260208281018290528351908101845281815292820192909252426060820152600780549194509250811015610002579081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889050815181546020848101517401000000000000000000000000000000000000000002600160a060020a03199290921690921760a060020a60ff021916178255604083015180516001848101805460008281528690209195600293821615610100026000190190911692909204601f9081018390048201949192919091019083901061023e57805160ff19168380011785555b50610072929150610226565b5050600060028201556001015b8082111561023a578054600160a860020a031916815560018181018054600080835592600290821615610100026000190190911604601f81901061020c57506101bb565b601f0160209004906000526020600020908101906101bb91905b8082111561023a5760008155600101610226565b5090565b828001600101855582156101af579182015b828111156101af57825182600050559160200191906001019061025056606060405236156100b95760e060020a6000350463013cf08b81146100bb578063237e9492146101285780633910682114610281578063400e3949146102995780635daf08ca146102a257806369bd34361461032f5780638160f0b5146103385780638da5cb5b146103415780639644fcbd14610353578063aa02a90f146103be578063b1050da5146103c7578063bcca1fd3146104b5578063d3c0715b146104dc578063eceb29451461058d578063f2fde38b1461067b575b005b61069c6004356004805482908110156100025790600052602060002090600a02016000506005810154815460018301546003840154600485015460068601546007870154600160a060020a03959095169750929560020194919360ff828116946101009093041692919089565b60408051602060248035600481810135601f81018590048502860185019096528585526107759581359591946044949293909201918190840183828082843750949650505050505050600060006004600050848154811015610002575090527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e600a8402908101547f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909101904210806101e65750600481015460ff165b8061026757508060000160009054906101000a9004600160a060020a03168160010160005054846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f15090500193505050506040518091039020816007016000505414155b8061027757506001546005820154105b1561109257610002565b61077560043560066020526000908152604090205481565b61077560055481565b61078760043560078054829081101561000257506000526003026000805160206111d18339815191528101547fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a820154600160a060020a0382169260a060020a90920460ff16917fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689019084565b61077560025481565b61077560015481565b610830600054600160a060020a031681565b604080516020604435600481810135601f81018490048402850184019095528484526100b9948135946024803595939460649492939101918190840183828082843750949650505050505050600080548190600160a060020a03908116339091161461084d57610002565b61077560035481565b604080516020604435600481810135601f8101849004840285018401909552848452610775948135946024803595939460649492939101918190840183828082843750506040805160209735808a0135601f81018a90048a0283018a019093528282529698976084979196506024909101945090925082915084018382808284375094965050505050505033600160a060020a031660009081526006602052604081205481908114806104ab5750604081205460078054909190811015610002579082526003026000805160206111d1833981519152015460a060020a900460ff16155b15610ce557610002565b6100b960043560243560443560005433600160a060020a03908116911614610b1857610002565b604080516020604435600481810135601f810184900484028501840190955284845261077594813594602480359593946064949293910191819084018382808284375094965050505050505033600160a060020a031660009081526006602052604081205481908114806105835750604081205460078054909190811015610002579082526003026000805160206111d18339815191520181505460a060020a900460ff16155b15610f1d57610002565b604080516020606435600481810135601f81018490048402850184019095528484526107759481359460248035956044359560849492019190819084018382808284375094965050505050505060006000600460005086815481101561000257908252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01815090508484846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f150905001935050505060405180910390208160070160005054149150610cdc565b6100b960043560005433600160a060020a03908116911614610f0857610002565b604051808a600160a060020a031681526020018981526020018060200188815260200187815260200186815260200185815260200184815260200183815260200182810382528981815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561075e5780601f106107335761010080835404028352916020019161075e565b820191906000526020600020905b81548152906001019060200180831161074157829003601f168201915b50509a505050505050505050505060405180910390f35b60408051918252519081900360200190f35b60408051600160a060020a038616815260208101859052606081018390526080918101828152845460026001821615610100026000190190911604928201839052909160a08301908590801561081e5780601f106107f35761010080835404028352916020019161081e565b820191906000526020600020905b81548152906001019060200180831161080157829003601f168201915b50509550505050505060405180910390f35b60408051600160a060020a03929092168252519081900360200190f35b600160a060020a03851660009081526006602052604081205414156108a957604060002060078054918290556001820180825582801582901161095c5760030281600302836000526020600020918201910161095c9190610a4f565b600160a060020a03851660009081526006602052604090205460078054919350908390811015610002575060005250600381026000805160206111d183398151915201805474ff0000000000000000000000000000000000000000191660a060020a85021781555b60408051600160a060020a03871681526020810186905281517f27b022af4a8347100c7a041ce5ccf8e14d644ff05de696315196faae8cd50c9b929181900390910190a15050505050565b505050915081506080604051908101604052808681526020018581526020018481526020014281526020015060076000508381548110156100025790600052602060002090600302016000508151815460208481015160a060020a02600160a060020a03199290921690921774ff00000000000000000000000000000000000000001916178255604083015180516001848101805460008281528690209195600293821615610100026000190190911692909204601f90810183900482019491929190910190839010610ad357805160ff19168380011785555b50610b03929150610abb565b5050600060028201556001015b80821115610acf57805474ffffffffffffffffffffffffffffffffffffffffff1916815560018181018054600080835592600290821615610100026000190190911604601f819010610aa15750610a42565b601f016020900490600052602060002090810190610a4291905b80821115610acf5760008155600101610abb565b5090565b82800160010185558215610a36579182015b82811115610a36578251826000505591602001919060010190610ae5565b50506060919091015160029190910155610911565b600183905560028290556003819055604080518481526020810184905280820183905290517fa439d3fa452be5e0e1e24a8145e715f4fd8b9c08c96a42fd82a855a85e5d57de9181900360600190a1505050565b50508585846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f150905001935050505060405180910390208160070160005081905550600260005054603c024201816003016000508190555060008160040160006101000a81548160ff0219169083021790555060008160040160016101000a81548160ff02191690830217905550600081600501600050819055507f646fec02522b41e7125cfc859a64fd4f4cefd5dc3b6237ca0abe251ded1fa881828787876040518085815260200184600160a060020a03168152602001838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f168015610cc45780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1600182016005555b50949350505050565b6004805460018101808355909190828015829011610d1c57600a0281600a028360005260206000209182019101610d1c9190610db8565b505060048054929450918491508110156100025790600052602060002090600a02016000508054600160a060020a031916871781556001818101879055855160028381018054600082815260209081902096975091959481161561010002600019011691909104601f90810182900484019391890190839010610ed857805160ff19168380011785555b50610b6c929150610abb565b50506001015b80821115610acf578054600160a060020a03191681556000600182810182905560028381018054848255909281161561010002600019011604601f819010610e9c57505b5060006003830181905560048301805461ffff191690556005830181905560068301819055600783018190556008830180548282559082526020909120610db2916002028101905b80821115610acf57805474ffffffffffffffffffffffffffffffffffffffffff1916815560018181018054600080835592600290821615610100026000190190911604601f819010610eba57505b5050600101610e44565b601f016020900490600052602060002090810190610dfc9190610abb565b601f016020900490600052602060002090810190610e929190610abb565b82800160010185558215610da6579182015b82811115610da6578251826000505591602001919060010190610eea565b60008054600160a060020a0319168217905550565b600480548690811015610002576000918252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01905033600160a060020a0316600090815260098201602052604090205490915060ff1660011415610f8457610002565b33600160a060020a031660009081526009820160205260409020805460ff1916600190811790915560058201805490910190558315610fcd576006810180546001019055610fda565b6006810180546000190190555b7fc34f869b7ff431b034b7b9aea9822dac189a685e0b015c7d1be3add3f89128e8858533866040518085815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f16801561107a5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1509392505050565b6006810154600354901315611158578060000160009054906101000a9004600160a060020a0316600160a060020a03168160010160005054670de0b6b3a76400000284604051808280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156111225780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876185025a03f15050505060048101805460ff191660011761ff00191661010017905561116d565b60048101805460ff191660011761ff00191690555b60068101546005820154600483015460408051888152602081019490945283810192909252610100900460ff166060830152517fd220b7272a8b6d0d7d6bcdace67b936a8f175e6d5c1b3ee438b72256b32ab3af9181900360800190a1509291505056a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688`}, + []string{`[{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"proposals","outputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"},{"name":"description","type":"string"},{"name":"votingDeadline","type":"uint256"},{"name":"executed","type":"bool"},{"name":"proposalPassed","type":"bool"},{"name":"numberOfVotes","type":"uint256"},{"name":"currentResult","type":"int256"},{"name":"proposalHash","type":"bytes32"}],"type":"function"},{"constant":false,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"transactionBytecode","type":"bytes"}],"name":"executeProposal","outputs":[{"name":"result","type":"int256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"memberId","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"numProposals","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"members","outputs":[{"name":"member","type":"address"},{"name":"canVote","type":"bool"},{"name":"name","type":"string"},{"name":"memberSince","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"debatingPeriodInMinutes","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"minimumQuorum","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"targetMember","type":"address"},{"name":"canVote","type":"bool"},{"name":"memberName","type":"string"}],"name":"changeMembership","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"majorityMargin","outputs":[{"name":"","type":"int256"}],"type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"etherAmount","type":"uint256"},{"name":"JobDescription","type":"string"},{"name":"transactionBytecode","type":"bytes"}],"name":"newProposal","outputs":[{"name":"proposalID","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"minimumQuorumForProposals","type":"uint256"},{"name":"minutesForDebate","type":"uint256"},{"name":"marginOfVotesForMajority","type":"int256"}],"name":"changeVotingRules","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"supportsProposal","type":"bool"},{"name":"justificationText","type":"string"}],"name":"vote","outputs":[{"name":"voteID","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"beneficiary","type":"address"},{"name":"etherAmount","type":"uint256"},{"name":"transactionBytecode","type":"bytes"}],"name":"checkProposalCode","outputs":[{"name":"codeChecksOut","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"type":"function"},{"inputs":[{"name":"minimumQuorumForProposals","type":"uint256"},{"name":"minutesForDebate","type":"uint256"},{"name":"marginOfVotesForMajority","type":"int256"},{"name":"congressLeader","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"recipient","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"description","type":"string"}],"name":"ProposalAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"position","type":"bool"},{"indexed":false,"name":"voter","type":"address"},{"indexed":false,"name":"justification","type":"string"}],"name":"Voted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"result","type":"int256"},{"indexed":false,"name":"quorum","type":"uint256"},{"indexed":false,"name":"active","type":"bool"}],"name":"ProposalTallied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"member","type":"address"},{"indexed":false,"name":"isMember","type":"bool"}],"name":"MembershipChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"minimumQuorum","type":"uint256"},{"indexed":false,"name":"debatingPeriodInMinutes","type":"uint256"},{"indexed":false,"name":"majorityMargin","type":"int256"}],"name":"ChangeOfRules","type":"event"}]`}, + `"github.com/ethereum/go-ethereum/common"`, ` if b, err := NewDAO(common.Address{}, nil); b == nil || err != nil { t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil) } `, + nil, + nil, + nil, + nil, }, // Test that named and anonymous inputs are handled correctly { - `InputChecker`, ``, ``, - ` + `InputChecker`, ``, []string{``}, + []string{` [ {"type":"function","name":"noInput","constant":true,"inputs":[],"outputs":[]}, {"type":"function","name":"namedInput","constant":true,"inputs":[{"name":"str","type":"string"}],"outputs":[]}, @@ -105,11 +125,11 @@ var bindTests = []struct { {"type":"function","name":"anonInputs","constant":true,"inputs":[{"name":"","type":"string"},{"name":"","type":"string"}],"outputs":[]}, {"type":"function","name":"mixedInputs","constant":true,"inputs":[{"name":"","type":"string"},{"name":"str","type":"string"}],"outputs":[]} ] - `, + `}, ` "fmt" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" `, `if b, err := NewInputChecker(common.Address{}, nil); b == nil || err != nil { t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil) @@ -125,11 +145,15 @@ var bindTests = []struct { fmt.Println(err) }`, + nil, + nil, + nil, + nil, }, // Test that named and anonymous outputs are handled correctly { - `OutputChecker`, ``, ``, - ` + `OutputChecker`, ``, []string{``}, + []string{` [ {"type":"function","name":"noOutput","constant":true,"inputs":[],"outputs":[]}, {"type":"function","name":"namedOutput","constant":true,"inputs":[],"outputs":[{"name":"str","type":"string"}]}, @@ -139,11 +163,11 @@ var bindTests = []struct { {"type":"function","name":"anonOutputs","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"},{"name":"","type":"string"}]}, {"type":"function","name":"mixedOutputs","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"},{"name":"str","type":"string"}]} ] - `, + `}, ` "fmt" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" `, `if b, err := NewOutputChecker(common.Address{}, nil); b == nil || err != nil { t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil) @@ -161,11 +185,15 @@ var bindTests = []struct { fmt.Println(str1, str2, res.Str1, res.Str2, err) }`, + nil, + nil, + nil, + nil, }, // Tests that named, anonymous and indexed events are handled correctly { - `EventChecker`, ``, ``, - ` + `EventChecker`, ``, []string{``}, + []string{` [ {"type":"event","name":"empty","inputs":[]}, {"type":"event","name":"indexed","inputs":[{"name":"addr","type":"address","indexed":true},{"name":"num","type":"int256","indexed":true}]}, @@ -173,13 +201,13 @@ var bindTests = []struct { {"type":"event","name":"anonymous","anonymous":true,"inputs":[]}, {"type":"event","name":"dynamic","inputs":[{"name":"idxStr","type":"string","indexed":true},{"name":"idxDat","type":"bytes","indexed":true},{"name":"str","type":"string"},{"name":"dat","type":"bytes"}]} ] - `, + `}, ` "fmt" "math/big" "reflect" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" `, `if e, err := NewEventChecker(common.Address{}, nil); e == nil || err != nil { t.Fatalf("binding (%v) nil or error (%v) not nil", e, nil) @@ -226,6 +254,10 @@ var bindTests = []struct { if _, ok := reflect.TypeOf(&EventChecker{}).MethodByName("FilterAnonymous"); ok { t.Errorf("binding has disallowed method (FilterAnonymous)") }`, + nil, + nil, + nil, + nil, }, // Test that contract interactions (deploy, transact and call) generate working code { @@ -244,21 +276,23 @@ var bindTests = []struct { } } `, - `6060604052604051610328380380610328833981016040528051018060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10608d57805160ff19168380011785555b50607c9291505b8082111560ba57838155600101606b565b50505061026a806100be6000396000f35b828001600101855582156064579182015b828111156064578251826000505591602001919060010190609e565b509056606060405260e060020a60003504630d86a0e181146100315780636874e8091461008d578063d736c513146100ea575b005b610190600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b61019060008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b60206004803580820135601f81018490049093026080908101604052606084815261002f946024939192918401918190838280828437509496505050505050508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061023157805160ff19168380011785555b506102619291505b808211156102665760008155830161017d565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156101f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b820191906000526020600020905b81548152906001019060200180831161020c57829003601f168201915b505050505081565b82800160010185558215610175579182015b82811115610175578251826000505591602001919060010190610243565b505050565b509056`, - `[{"constant":true,"inputs":[],"name":"transactString","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":true,"inputs":[],"name":"deployString","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"str","type":"string"}],"name":"transact","outputs":[],"type":"function"},{"inputs":[{"name":"str","type":"string"}],"type":"constructor"}]`, + []string{`6060604052604051610328380380610328833981016040528051018060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10608d57805160ff19168380011785555b50607c9291505b8082111560ba57838155600101606b565b50505061026a806100be6000396000f35b828001600101855582156064579182015b828111156064578251826000505591602001919060010190609e565b509056606060405260e060020a60003504630d86a0e181146100315780636874e8091461008d578063d736c513146100ea575b005b610190600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b61019060008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b60206004803580820135601f81018490049093026080908101604052606084815261002f946024939192918401918190838280828437509496505050505050508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061023157805160ff19168380011785555b506102619291505b808211156102665760008155830161017d565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156101f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b820191906000526020600020905b81548152906001019060200180831161020c57829003601f168201915b505050505081565b82800160010185558215610175579182015b82811115610175578251826000505591602001919060010190610243565b505050565b509056`}, + []string{`[{"constant":true,"inputs":[],"name":"transactString","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":true,"inputs":[],"name":"deployString","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"str","type":"string"}],"name":"transact","outputs":[],"type":"function"},{"inputs":[{"name":"str","type":"string"}],"type":"constructor"}]`}, ` "math/big" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/accounts/abi/bind/backends" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy an interaction tester contract and call a transaction on it _, _, interactor, err := DeployInteractor(auth, sim, "Deploy string") @@ -282,6 +316,10 @@ var bindTests = []struct { t.Fatalf("Transact string mismatch: have '%s', want 'Transact string'", str) } `, + nil, + nil, + nil, + nil, }, // Tests that plain values can be properly returned and deserialized { @@ -293,21 +331,23 @@ var bindTests = []struct { } } `, - `606060405260dc8060106000396000f3606060405260e060020a6000350463993a04b78114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`, - `[{"constant":true,"inputs":[],"name":"getter","outputs":[{"name":"","type":"string"},{"name":"","type":"int256"},{"name":"","type":"bytes32"}],"type":"function"}]`, + []string{`606060405260dc8060106000396000f3606060405260e060020a6000350463993a04b78114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`}, + []string{`[{"constant":true,"inputs":[],"name":"getter","outputs":[{"name":"","type":"string"},{"name":"","type":"int256"},{"name":"","type":"bytes32"}],"type":"function"}]`}, ` "math/big" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/accounts/abi/bind/backends" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy a tuple tester contract and execute a structured call on it _, _, getter, err := DeployGetter(auth, sim) @@ -322,6 +362,10 @@ var bindTests = []struct { t.Fatalf("Retrieved value mismatch: have %v/%v, want %v/%v", str, num, "Hi", 1) } `, + nil, + nil, + nil, + nil, }, // Tests that tuples can be properly returned and deserialized { @@ -333,21 +377,23 @@ var bindTests = []struct { } } `, - `606060405260dc8060106000396000f3606060405260e060020a60003504633175aae28114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`, - `[{"constant":true,"inputs":[],"name":"tuple","outputs":[{"name":"a","type":"string"},{"name":"b","type":"int256"},{"name":"c","type":"bytes32"}],"type":"function"}]`, + []string{`606060405260dc8060106000396000f3606060405260e060020a60003504633175aae28114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`}, + []string{`[{"constant":true,"inputs":[],"name":"tuple","outputs":[{"name":"a","type":"string"},{"name":"b","type":"int256"},{"name":"c","type":"bytes32"}],"type":"function"}]`}, ` "math/big" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/accounts/abi/bind/backends" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy a tuple tester contract and execute a structured call on it _, _, tupler, err := DeployTupler(auth, sim) @@ -362,6 +408,10 @@ var bindTests = []struct { t.Fatalf("Retrieved value mismatch: have %v/%v, want %v/%v", res.A, res.B, "Hi", 1) } `, + nil, + nil, + nil, + nil, }, // Tests that arrays/slices can be properly returned and deserialized. // Only addresses are tested, remainder just compiled to keep the test small. @@ -383,23 +433,25 @@ var bindTests = []struct { } } `, - `606060405261015c806100126000396000f3606060405260e060020a6000350463be1127a3811461003c578063d88becc014610092578063e15a3db71461003c578063f637e5891461003c575b005b604080516020600480358082013583810285810185019096528085526100ee959294602494909392850192829185019084908082843750949650505050505050604080516020810190915260009052805b919050565b604080516102e0818101909252610138916004916102e491839060179083908390808284375090955050505050506102e0604051908101604052806017905b60008152602001906001900390816100d15790505081905061008d565b60405180806020018281038252838181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050019250505060405180910390f35b60405180826102e0808381846000600461015cf15090500191505060405180910390f3`, - `[{"constant":true,"inputs":[{"name":"input","type":"address[]"}],"name":"echoAddresses","outputs":[{"name":"output","type":"address[]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"uint24[23]"}],"name":"echoFancyInts","outputs":[{"name":"output","type":"uint24[23]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"int256[]"}],"name":"echoInts","outputs":[{"name":"output","type":"int256[]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"bool[]"}],"name":"echoBools","outputs":[{"name":"output","type":"bool[]"}],"type":"function"}]`, + []string{`606060405261015c806100126000396000f3606060405260e060020a6000350463be1127a3811461003c578063d88becc014610092578063e15a3db71461003c578063f637e5891461003c575b005b604080516020600480358082013583810285810185019096528085526100ee959294602494909392850192829185019084908082843750949650505050505050604080516020810190915260009052805b919050565b604080516102e0818101909252610138916004916102e491839060179083908390808284375090955050505050506102e0604051908101604052806017905b60008152602001906001900390816100d15790505081905061008d565b60405180806020018281038252838181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050019250505060405180910390f35b60405180826102e0808381846000600461015cf15090500191505060405180910390f3`}, + []string{`[{"constant":true,"inputs":[{"name":"input","type":"address[]"}],"name":"echoAddresses","outputs":[{"name":"output","type":"address[]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"uint24[23]"}],"name":"echoFancyInts","outputs":[{"name":"output","type":"uint24[23]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"int256[]"}],"name":"echoInts","outputs":[{"name":"output","type":"int256[]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"bool[]"}],"name":"echoBools","outputs":[{"name":"output","type":"bool[]"}],"type":"function"}]`}, ` "math/big" "reflect" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/accounts/abi/bind/backends" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy a slice tester contract and execute a n array call on it _, _, slicer, err := DeploySlicer(auth, sim) @@ -414,6 +466,10 @@ var bindTests = []struct { t.Fatalf("Slice return mismatch: have %v, want %v", out, []common.Address{auth.From, common.Address{}}) } `, + nil, + nil, + nil, + nil, }, // Tests that anonymous default methods can be correctly invoked { @@ -427,21 +483,23 @@ var bindTests = []struct { } } `, - `6060604052606a8060106000396000f360606040523615601d5760e060020a6000350463fc9c8d3981146040575b605e6000805473ffffffffffffffffffffffffffffffffffffffff191633179055565b606060005473ffffffffffffffffffffffffffffffffffffffff1681565b005b6060908152602090f3`, - `[{"constant":true,"inputs":[],"name":"caller","outputs":[{"name":"","type":"address"}],"type":"function"}]`, + []string{`6060604052606a8060106000396000f360606040523615601d5760e060020a6000350463fc9c8d3981146040575b605e6000805473ffffffffffffffffffffffffffffffffffffffff191633179055565b606060005473ffffffffffffffffffffffffffffffffffffffff1681565b005b6060908152602090f3`}, + []string{`[{"constant":true,"inputs":[],"name":"caller","outputs":[{"name":"","type":"address"}],"type":"function"}]`}, ` "math/big" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/accounts/abi/bind/backends" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy a default method invoker contract and execute its default method _, _, defaulter, err := DeployDefaulter(auth, sim) @@ -459,6 +517,10 @@ var bindTests = []struct { t.Fatalf("Address mismatch: have %v, want %v", caller, auth.From) } `, + nil, + nil, + nil, + nil, }, // Tests that non-existent contracts are reported as such (though only simulator test) { @@ -470,16 +532,19 @@ var bindTests = []struct { } } `, - `6060604052609f8060106000396000f3606060405260e060020a6000350463f97a60058114601a575b005b600060605260c0604052600d60809081527f4920646f6e27742065786973740000000000000000000000000000000000000060a052602060c0908152600d60e081905281906101009060a09080838184600060046012f15050815172ffffffffffffffffffffffffffffffffffffff1916909152505060405161012081900392509050f3`, - `[{"constant":true,"inputs":[],"name":"String","outputs":[{"name":"","type":"string"}],"type":"function"}]`, + []string{`6060604052609f8060106000396000f3606060405260e060020a6000350463f97a60058114601a575b005b600060605260c0604052600d60809081527f4920646f6e27742065786973740000000000000000000000000000000000000060a052602060c0908152600d60e081905281906101009060a09080838184600060046012f15050815172ffffffffffffffffffffffffffffffffffffff1916909152505060405161012081900392509050f3`}, + []string{`[{"constant":true,"inputs":[],"name":"String","outputs":[{"name":"","type":"string"}],"type":"function"}]`}, ` - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/accounts/abi/bind/backends" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" `, ` // Create a simulator and wrap a non-deployed contract - sim := backends.NewSimulatedBackend(nil, uint64(10000000000)) + + sim := backends.NewSimulatedBackend(core.GenesisAlloc{}, uint64(10000000000)) + defer sim.Close() nonexistent, err := NewNonExistent(common.Address{}, sim) if err != nil { @@ -492,6 +557,10 @@ var bindTests = []struct { t.Fatalf("Error mismatch: have %v, want %v", err, bind.ErrNoCode) } `, + nil, + nil, + nil, + nil, }, // Tests that gas estimation works for contracts with weird gas mechanics too. { @@ -509,21 +578,23 @@ var bindTests = []struct { } } `, - `606060405261021c806100126000396000f3606060405260e060020a600035046323fcf32a81146100265780634f28bf0e1461007b575b005b6040805160206004803580820135601f8101849004840285018401909552848452610024949193602493909291840191908190840183828082843750949650505050505050620186a05a101561014e57610002565b6100db60008054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529291908301828280156102145780601f106101e957610100808354040283529160200191610214565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f16801561013b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b505050565b8060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106101b557805160ff19168380011785555b506101499291505b808211156101e557600081556001016101a1565b82800160010185558215610199579182015b828111156101995782518260005055916020019190600101906101c7565b5090565b820191906000526020600020905b8154815290600101906020018083116101f757829003601f168201915b50505050508156`, - `[{"constant":false,"inputs":[{"name":"value","type":"string"}],"name":"SetField","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"field","outputs":[{"name":"","type":"string"}],"type":"function"}]`, + []string{`606060405261021c806100126000396000f3606060405260e060020a600035046323fcf32a81146100265780634f28bf0e1461007b575b005b6040805160206004803580820135601f8101849004840285018401909552848452610024949193602493909291840191908190840183828082843750949650505050505050620186a05a101561014e57610002565b6100db60008054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529291908301828280156102145780601f106101e957610100808354040283529160200191610214565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f16801561013b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b505050565b8060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106101b557805160ff19168380011785555b506101499291505b808211156101e557600081556001016101a1565b82800160010185558215610199579182015b828111156101995782518260005055916020019190600101906101c7565b5090565b820191906000526020600020905b8154815290600101906020018083116101f757829003601f168201915b50505050508156`}, + []string{`[{"constant":false,"inputs":[{"name":"value","type":"string"}],"name":"SetField","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"field","outputs":[{"name":"","type":"string"}],"type":"function"}]`}, ` "math/big" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/accounts/abi/bind/backends" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy a funky gas pattern contract _, _, limiter, err := DeployFunkyGasPattern(auth, sim) @@ -542,6 +613,10 @@ var bindTests = []struct { t.Fatalf("Field mismatch: have %v, want %v", field, "automatic") } `, + nil, + nil, + nil, + nil, }, // Test that constant functions can be called from an (optional) specified address { @@ -552,22 +627,24 @@ var bindTests = []struct { return msg.sender; } } - `, `6060604052346000575b6086806100176000396000f300606060405263ffffffff60e060020a60003504166349f8e98281146022575b6000565b34600057602c6055565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b335b905600a165627a7a72305820aef6b7685c0fa24ba6027e4870404a57df701473fe4107741805c19f5138417c0029`, - `[{"constant":true,"inputs":[],"name":"callFrom","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"}]`, + `, []string{`6060604052346000575b6086806100176000396000f300606060405263ffffffff60e060020a60003504166349f8e98281146022575b6000565b34600057602c6055565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b335b905600a165627a7a72305820aef6b7685c0fa24ba6027e4870404a57df701473fe4107741805c19f5138417c0029`}, + []string{`[{"constant":true,"inputs":[],"name":"callFrom","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"}]`}, ` "math/big" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/accounts/abi/bind/backends" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy a sender tester contract and execute a structured call on it _, _, callfrom, err := DeployCallFrom(auth, sim) @@ -590,6 +667,10 @@ var bindTests = []struct { } } `, + nil, + nil, + nil, + nil, }, // Tests that methods and returns with underscores inside work correctly. { @@ -621,22 +702,24 @@ var bindTests = []struct { return 0; } } - `, `6060604052341561000f57600080fd5b6103858061001e6000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a592131461009357806346546dbe146100c357806367e6633d146100ec5780639df4848514610181578063af7486ab146101b1578063b564b34d146101e1578063e02ab24d14610211578063e409ca4514610241575b600080fd5b341561009e57600080fd5b6100a6610271565b604051808381526020018281526020019250505060405180910390f35b34156100ce57600080fd5b6100d6610286565b6040518082815260200191505060405180910390f35b34156100f757600080fd5b6100ff61028e565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561014557808201518184015260208101905061012a565b50505050905090810190601f1680156101725780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561018c57600080fd5b6101946102dc565b604051808381526020018281526020019250505060405180910390f35b34156101bc57600080fd5b6101c46102f1565b604051808381526020018281526020019250505060405180910390f35b34156101ec57600080fd5b6101f4610306565b604051808381526020018281526020019250505060405180910390f35b341561021c57600080fd5b61022461031b565b604051808381526020018281526020019250505060405180910390f35b341561024c57600080fd5b610254610330565b604051808381526020018281526020019250505060405180910390f35b60008060016002819150809050915091509091565b600080905090565b6000610298610345565b61013a8090506040805190810160405280600281526020017f7069000000000000000000000000000000000000000000000000000000000000815250915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b6020604051908101604052806000815250905600a165627a7a72305820d1a53d9de9d1e3d55cb3dc591900b63c4f1ded79114f7b79b332684840e186a40029`, - `[{"constant":true,"inputs":[],"name":"LowerUpperCollision","outputs":[{"name":"_res","type":"int256"},{"name":"Res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_under_scored_func","outputs":[{"name":"_int","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UnderscoredOutput","outputs":[{"name":"_int","type":"int256"},{"name":"_string","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PurelyUnderscoredOutput","outputs":[{"name":"_","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UpperLowerCollision","outputs":[{"name":"_Res","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"AllPurelyUnderscoredOutput","outputs":[{"name":"_","type":"int256"},{"name":"__","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UpperUpperCollision","outputs":[{"name":"_Res","type":"int256"},{"name":"Res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LowerLowerCollision","outputs":[{"name":"_res","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"}]`, + `, []string{`6060604052341561000f57600080fd5b6103858061001e6000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a592131461009357806346546dbe146100c357806367e6633d146100ec5780639df4848514610181578063af7486ab146101b1578063b564b34d146101e1578063e02ab24d14610211578063e409ca4514610241575b600080fd5b341561009e57600080fd5b6100a6610271565b604051808381526020018281526020019250505060405180910390f35b34156100ce57600080fd5b6100d6610286565b6040518082815260200191505060405180910390f35b34156100f757600080fd5b6100ff61028e565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561014557808201518184015260208101905061012a565b50505050905090810190601f1680156101725780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561018c57600080fd5b6101946102dc565b604051808381526020018281526020019250505060405180910390f35b34156101bc57600080fd5b6101c46102f1565b604051808381526020018281526020019250505060405180910390f35b34156101ec57600080fd5b6101f4610306565b604051808381526020018281526020019250505060405180910390f35b341561021c57600080fd5b61022461031b565b604051808381526020018281526020019250505060405180910390f35b341561024c57600080fd5b610254610330565b604051808381526020018281526020019250505060405180910390f35b60008060016002819150809050915091509091565b600080905090565b6000610298610345565b61013a8090506040805190810160405280600281526020017f7069000000000000000000000000000000000000000000000000000000000000815250915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b6020604051908101604052806000815250905600a165627a7a72305820d1a53d9de9d1e3d55cb3dc591900b63c4f1ded79114f7b79b332684840e186a40029`}, + []string{`[{"constant":true,"inputs":[],"name":"LowerUpperCollision","outputs":[{"name":"_res","type":"int256"},{"name":"Res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_under_scored_func","outputs":[{"name":"_int","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UnderscoredOutput","outputs":[{"name":"_int","type":"int256"},{"name":"_string","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PurelyUnderscoredOutput","outputs":[{"name":"_","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UpperLowerCollision","outputs":[{"name":"_Res","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"AllPurelyUnderscoredOutput","outputs":[{"name":"_","type":"int256"},{"name":"__","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UpperUpperCollision","outputs":[{"name":"_Res","type":"int256"},{"name":"Res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LowerLowerCollision","outputs":[{"name":"_res","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"}]`}, ` "fmt" "math/big" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/accounts/abi/bind/backends" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy a underscorer tester contract and execute a structured call on it _, _, underscorer, err := DeployUnderscorer(auth, sim) @@ -664,13 +747,17 @@ var bindTests = []struct { fmt.Println(a, b, err) `, + nil, + nil, + nil, + nil, }, // Tests that logs can be successfully filtered and decoded. { `Eventer`, ` contract Eventer { - event SimpleEvent ( + event SimpleEvent ( address indexed Addr, bytes32 indexed Id, bool indexed Flag, @@ -698,25 +785,35 @@ var bindTests = []struct { function raiseDynamicEvent(string str, bytes blob) { DynamicEvent(str, blob, str, blob); } + + event FixedBytesEvent ( + bytes24 indexed IndexedBytes, + bytes24 NonIndexedBytes + ); + function raiseFixedBytesEvent(bytes24 blob) { + FixedBytesEvent(blob, blob); + } } `, - `6060604052341561000f57600080fd5b61042c8061001e6000396000f300606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063528300ff1461005c578063630c31e2146100fc578063c7d116dd14610156575b600080fd5b341561006757600080fd5b6100fa600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610194565b005b341561010757600080fd5b610154600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035600019169060200190919080351515906020019091908035906020019091905050610367565b005b341561016157600080fd5b610192600480803590602001909190803560010b90602001909190803563ffffffff169060200190919050506103c3565b005b806040518082805190602001908083835b6020831015156101ca57805182526020820191506020810190506020830392506101a5565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020826040518082805190602001908083835b60208310151561022d5780518252602082019150602081019050602083039250610208565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390207f3281fd4f5e152dd3385df49104a3f633706e21c9e80672e88d3bcddf33101f008484604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156102c15780820151818401526020810190506102a6565b50505050905090810190601f1680156102ee5780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b8381101561032757808201518184015260208101905061030c565b50505050905090810190601f1680156103545780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a35050565b81151583600019168573ffffffffffffffffffffffffffffffffffffffff167f1f097de4289df643bd9c11011cc61367aa12983405c021056e706eb5ba1250c8846040518082815260200191505060405180910390a450505050565b8063ffffffff168260010b847f3ca7f3a77e5e6e15e781850bc82e32adfa378a2a609370db24b4d0fae10da2c960405160405180910390a45050505600a165627a7a72305820d1f8a8bbddbc5bb29f285891d6ae1eef8420c52afdc05e1573f6114d8e1714710029`, - `[{"constant":false,"inputs":[{"name":"str","type":"string"},{"name":"blob","type":"bytes"}],"name":"raiseDynamicEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"id","type":"bytes32"},{"name":"flag","type":"bool"},{"name":"value","type":"uint256"}],"name":"raiseSimpleEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"number","type":"uint256"},{"name":"short","type":"int16"},{"name":"long","type":"uint32"}],"name":"raiseNodataEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"Addr","type":"address"},{"indexed":true,"name":"Id","type":"bytes32"},{"indexed":true,"name":"Flag","type":"bool"},{"indexed":false,"name":"Value","type":"uint256"}],"name":"SimpleEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"Number","type":"uint256"},{"indexed":true,"name":"Short","type":"int16"},{"indexed":true,"name":"Long","type":"uint32"}],"name":"NodataEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"IndexedString","type":"string"},{"indexed":true,"name":"IndexedBytes","type":"bytes"},{"indexed":false,"name":"NonIndexedString","type":"string"},{"indexed":false,"name":"NonIndexedBytes","type":"bytes"}],"name":"DynamicEvent","type":"event"}]`, + []string{`608060405234801561001057600080fd5b5061043f806100206000396000f3006080604052600436106100615763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663528300ff8114610066578063630c31e2146100ff5780636cc6b94014610138578063c7d116dd1461015b575b600080fd5b34801561007257600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526100fd94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506101829650505050505050565b005b34801561010b57600080fd5b506100fd73ffffffffffffffffffffffffffffffffffffffff60043516602435604435151560643561033c565b34801561014457600080fd5b506100fd67ffffffffffffffff1960043516610394565b34801561016757600080fd5b506100fd60043560243560010b63ffffffff604435166103d6565b806040518082805190602001908083835b602083106101b25780518252601f199092019160209182019101610193565b51815160209384036101000a6000190180199092169116179052604051919093018190038120875190955087945090928392508401908083835b6020831061020b5780518252601f1990920191602091820191016101ec565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390207f3281fd4f5e152dd3385df49104a3f633706e21c9e80672e88d3bcddf33101f008484604051808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561029c578181015183820152602001610284565b50505050905090810190601f1680156102c95780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156102fc5781810151838201526020016102e4565b50505050905090810190601f1680156103295780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a35050565b60408051828152905183151591859173ffffffffffffffffffffffffffffffffffffffff8816917f1f097de4289df643bd9c11011cc61367aa12983405c021056e706eb5ba1250c8919081900360200190a450505050565b6040805167ffffffffffffffff19831680825291517fcdc4c1b1aed5524ffb4198d7a5839a34712baef5fa06884fac7559f4a5854e0a9181900360200190a250565b8063ffffffff168260010b847f3ca7f3a77e5e6e15e781850bc82e32adfa378a2a609370db24b4d0fae10da2c960405160405180910390a45050505600a165627a7a72305820468b5843bf653145bd924b323c64ef035d3dd922c170644b44d61aa666ea6eee0029`}, + []string{`[{"constant":false,"inputs":[{"name":"str","type":"string"},{"name":"blob","type":"bytes"}],"name":"raiseDynamicEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"id","type":"bytes32"},{"name":"flag","type":"bool"},{"name":"value","type":"uint256"}],"name":"raiseSimpleEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"blob","type":"bytes24"}],"name":"raiseFixedBytesEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"number","type":"uint256"},{"name":"short","type":"int16"},{"name":"long","type":"uint32"}],"name":"raiseNodataEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"Addr","type":"address"},{"indexed":true,"name":"Id","type":"bytes32"},{"indexed":true,"name":"Flag","type":"bool"},{"indexed":false,"name":"Value","type":"uint256"}],"name":"SimpleEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"Number","type":"uint256"},{"indexed":true,"name":"Short","type":"int16"},{"indexed":true,"name":"Long","type":"uint32"}],"name":"NodataEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"IndexedString","type":"string"},{"indexed":true,"name":"IndexedBytes","type":"bytes"},{"indexed":false,"name":"NonIndexedString","type":"string"},{"indexed":false,"name":"NonIndexedBytes","type":"bytes"}],"name":"DynamicEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"IndexedBytes","type":"bytes24"},{"indexed":false,"name":"NonIndexedBytes","type":"bytes24"}],"name":"FixedBytesEvent","type":"event"}]`}, ` "math/big" "time" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/accounts/abi/bind/backends" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() // Deploy an eventer contract _, _, eventer, err := DeployEventer(auth, sim) @@ -812,6 +909,33 @@ var bindTests = []struct { if err = dit.Error(); err != nil { t.Fatalf("dynamic event iteration failed: %v", err) } + // Test raising and filtering for events with fixed bytes components + var fblob [24]byte + copy(fblob[:], []byte("Fixed Bytes")) + + if _, err := eventer.RaiseFixedBytesEvent(auth, fblob); err != nil { + t.Fatalf("failed to raise fixed bytes event: %v", err) + } + sim.Commit() + + fit, err := eventer.FilterFixedBytesEvent(nil, [][24]byte{fblob}) + if err != nil { + t.Fatalf("failed to filter for fixed bytes events: %v", err) + } + defer fit.Close() + + if !fit.Next() { + t.Fatalf("fixed bytes log not found: %v", fit.Error()) + } + if fit.Event.NonIndexedBytes != fblob || fit.Event.IndexedBytes != fblob { + t.Errorf("fixed bytes log content mismatch: have %v, want {'%x', '%x'}", fit.Event, fblob, fblob) + } + if fit.Next() { + t.Errorf("unexpected fixed bytes event found: %+v", fit.Event) + } + if err = fit.Error(); err != nil { + t.Fatalf("fixed bytes event iteration failed: %v", err) + } // Test subscribing to an event and raising it afterwards ch := make(chan *EventerSimpleEvent, 16) sub, err := eventer.WatchSimpleEvent(nil, ch, nil, nil, nil) @@ -845,6 +969,10 @@ var bindTests = []struct { case <-time.After(250 * time.Millisecond): } `, + nil, + nil, + nil, + nil, }, { `DeeplyNestedArray`, @@ -859,21 +987,23 @@ var bindTests = []struct { } } `, - `6060604052341561000f57600080fd5b6106438061001e6000396000f300606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063344248551461005c5780638ed4573a1461011457806398ed1856146101ab575b600080fd5b341561006757600080fd5b610112600480806107800190600580602002604051908101604052809291906000905b828210156101055783826101800201600480602002604051908101604052809291906000905b828210156100f25783826060020160038060200260405190810160405280929190826003602002808284378201915050505050815260200190600101906100b0565b505050508152602001906001019061008a565b5050505091905050610208565b005b341561011f57600080fd5b61012761021d565b604051808260056000925b8184101561019b578284602002015160046000925b8184101561018d5782846020020151600360200280838360005b8381101561017c578082015181840152602081019050610161565b505050509050019260010192610147565b925050509260010192610132565b9250505091505060405180910390f35b34156101b657600080fd5b6101de6004808035906020019091908035906020019091908035906020019091905050610309565b604051808267ffffffffffffffff1667ffffffffffffffff16815260200191505060405180910390f35b80600090600561021992919061035f565b5050565b6102256103b0565b6000600580602002604051908101604052809291906000905b8282101561030057838260040201600480602002604051908101604052809291906000905b828210156102ed578382016003806020026040519081016040528092919082600380156102d9576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116102945790505b505050505081526020019060010190610263565b505050508152602001906001019061023e565b50505050905090565b60008360058110151561031857fe5b600402018260048110151561032957fe5b018160038110151561033757fe5b6004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b826005600402810192821561039f579160200282015b8281111561039e5782518290600461038e9291906103df565b5091602001919060040190610375565b5b5090506103ac919061042d565b5090565b610780604051908101604052806005905b6103c9610459565b8152602001906001900390816103c15790505090565b826004810192821561041c579160200282015b8281111561041b5782518290600361040b929190610488565b50916020019190600101906103f2565b5b5090506104299190610536565b5090565b61045691905b8082111561045257600081816104499190610562565b50600401610433565b5090565b90565b610180604051908101604052806004905b6104726105a7565b81526020019060019003908161046a5790505090565b82600380016004900481019282156105255791602002820160005b838211156104ef57835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555092602001926008016020816007010492830192600103026104a3565b80156105235782816101000a81549067ffffffffffffffff02191690556008016020816007010492830192600103026104ef565b505b50905061053291906105d9565b5090565b61055f91905b8082111561055b57600081816105529190610610565b5060010161053c565b5090565b90565b50600081816105719190610610565b50600101600081816105839190610610565b50600101600081816105959190610610565b5060010160006105a59190610610565b565b6060604051908101604052806003905b600067ffffffffffffffff168152602001906001900390816105b75790505090565b61060d91905b8082111561060957600081816101000a81549067ffffffffffffffff0219169055506001016105df565b5090565b90565b50600090555600a165627a7a7230582087e5a43f6965ab6ef7a4ff056ab80ed78fd8c15cff57715a1bf34ec76a93661c0029`, - `[{"constant":false,"inputs":[{"name":"arr","type":"uint64[3][4][5]"}],"name":"storeDeepUintArray","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"retrieveDeepArray","outputs":[{"name":"","type":"uint64[3][4][5]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"deepUint64Array","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"}]`, + []string{`6060604052341561000f57600080fd5b6106438061001e6000396000f300606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063344248551461005c5780638ed4573a1461011457806398ed1856146101ab575b600080fd5b341561006757600080fd5b610112600480806107800190600580602002604051908101604052809291906000905b828210156101055783826101800201600480602002604051908101604052809291906000905b828210156100f25783826060020160038060200260405190810160405280929190826003602002808284378201915050505050815260200190600101906100b0565b505050508152602001906001019061008a565b5050505091905050610208565b005b341561011f57600080fd5b61012761021d565b604051808260056000925b8184101561019b578284602002015160046000925b8184101561018d5782846020020151600360200280838360005b8381101561017c578082015181840152602081019050610161565b505050509050019260010192610147565b925050509260010192610132565b9250505091505060405180910390f35b34156101b657600080fd5b6101de6004808035906020019091908035906020019091908035906020019091905050610309565b604051808267ffffffffffffffff1667ffffffffffffffff16815260200191505060405180910390f35b80600090600561021992919061035f565b5050565b6102256103b0565b6000600580602002604051908101604052809291906000905b8282101561030057838260040201600480602002604051908101604052809291906000905b828210156102ed578382016003806020026040519081016040528092919082600380156102d9576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116102945790505b505050505081526020019060010190610263565b505050508152602001906001019061023e565b50505050905090565b60008360058110151561031857fe5b600402018260048110151561032957fe5b018160038110151561033757fe5b6004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b826005600402810192821561039f579160200282015b8281111561039e5782518290600461038e9291906103df565b5091602001919060040190610375565b5b5090506103ac919061042d565b5090565b610780604051908101604052806005905b6103c9610459565b8152602001906001900390816103c15790505090565b826004810192821561041c579160200282015b8281111561041b5782518290600361040b929190610488565b50916020019190600101906103f2565b5b5090506104299190610536565b5090565b61045691905b8082111561045257600081816104499190610562565b50600401610433565b5090565b90565b610180604051908101604052806004905b6104726105a7565b81526020019060019003908161046a5790505090565b82600380016004900481019282156105255791602002820160005b838211156104ef57835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555092602001926008016020816007010492830192600103026104a3565b80156105235782816101000a81549067ffffffffffffffff02191690556008016020816007010492830192600103026104ef565b505b50905061053291906105d9565b5090565b61055f91905b8082111561055b57600081816105529190610610565b5060010161053c565b5090565b90565b50600081816105719190610610565b50600101600081816105839190610610565b50600101600081816105959190610610565b5060010160006105a59190610610565b565b6060604051908101604052806003905b600067ffffffffffffffff168152602001906001900390816105b75790505090565b61060d91905b8082111561060957600081816101000a81549067ffffffffffffffff0219169055506001016105df565b5090565b90565b50600090555600a165627a7a7230582087e5a43f6965ab6ef7a4ff056ab80ed78fd8c15cff57715a1bf34ec76a93661c0029`}, + []string{`[{"constant":false,"inputs":[{"name":"arr","type":"uint64[3][4][5]"}],"name":"storeDeepUintArray","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"retrieveDeepArray","outputs":[{"name":"","type":"uint64[3][4][5]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"deepUint64Array","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"}]`}, ` "math/big" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/accounts/abi/bind/backends" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" `, ` // Generate a new random account and a funded simulator key, _ := crypto.GenerateKey() auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() //deploy the test contract _, _, testContract, err := DeployDeeplyNestedArray(auth, sim) @@ -920,12 +1050,491 @@ var bindTests = []struct { t.Fatalf("Retrieved value does not match expected value! got: %d, expected: %d. %v", retrievedArr[4][3][2], testArr[4][3][2], err) } `, + nil, + nil, + nil, + nil, + }, + { + `CallbackParam`, + ` + contract FunctionPointerTest { + function test(function(uint256) external callback) external { + callback(1); + } + } + `, + []string{`608060405234801561001057600080fd5b5061015e806100206000396000f3fe60806040526004361061003b576000357c010000000000000000000000000000000000000000000000000000000090048063d7a5aba214610040575b600080fd5b34801561004c57600080fd5b506100be6004803603602081101561006357600080fd5b810190808035806c0100000000000000000000000090049068010000000000000000900463ffffffff1677ffffffffffffffffffffffffffffffffffffffffffffffff169091602001919093929190939291905050506100c0565b005b818160016040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561011657600080fd5b505af115801561012a573d6000803e3d6000fd5b50505050505056fea165627a7a7230582062f87455ff84be90896dbb0c4e4ddb505c600d23089f8e80a512548440d7e2580029`}, + []string{`[ + { + "constant": false, + "inputs": [ + { + "name": "callback", + "type": "function" + } + ], + "name": "test", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + } + ]`}, ` + "strings" + `, + ` + if strings.Compare("test(function)", CallbackParamFuncSigs["d7a5aba2"]) != 0 { + t.Fatalf("") + } + `, + []map[string]string{ + { + "test(function)": "d7a5aba2", + }, + }, + nil, + nil, + nil, + }, { + `Tuple`, + ` + pragma solidity >=0.4.19 <0.6.0; + pragma experimental ABIEncoderV2; + + contract Tuple { + struct S { uint a; uint[] b; T[] c; } + struct T { uint x; uint y; } + struct P { uint8 x; uint8 y; } + struct Q { uint16 x; uint16 y; } + event TupleEvent(S a, T[2][] b, T[][2] c, S[] d, uint[] e); + event TupleEvent2(P[]); + + function func1(S memory a, T[2][] memory b, T[][2] memory c, S[] memory d, uint[] memory e) public pure returns (S memory, T[2][] memory, T[][2] memory, S[] memory, uint[] memory) { + return (a, b, c, d, e); + } + function func2(S memory a, T[2][] memory b, T[][2] memory c, S[] memory d, uint[] memory e) public { + emit TupleEvent(a, b, c, d, e); + } + function func3(Q[] memory) public pure {} // call function, nothing to return + } + `, + []string{`60806040523480156100115760006000fd5b50610017565b6110b2806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100465760003560e01c8063443c79b41461004c578063d0062cdd14610080578063e4d9a43b1461009c57610046565b60006000fd5b610066600480360361006191908101906107b8565b6100b8565b604051610077959493929190610ccb565b60405180910390f35b61009a600480360361009591908101906107b8565b6100ef565b005b6100b660048036036100b19190810190610775565b610136565b005b6100c061013a565b60606100ca61015e565b606060608989898989945094509450945094506100e2565b9550955095509550959050565b7f18d6e66efa53739ca6d13626f35ebc700b31cced3eddb50c70bbe9c082c6cd008585858585604051610126959493929190610ccb565b60405180910390a15b5050505050565b5b50565b60405180606001604052806000815260200160608152602001606081526020015090565b60405180604001604052806002905b606081526020019060019003908161016d57905050905661106e565b600082601f830112151561019d5760006000fd5b81356101b06101ab82610d6f565b610d41565b915081818352602084019350602081019050838560808402820111156101d65760006000fd5b60005b8381101561020757816101ec888261037a565b8452602084019350608083019250505b6001810190506101d9565b5050505092915050565b600082601f83011215156102255760006000fd5b600261023861023382610d98565b610d41565b9150818360005b83811015610270578135860161025588826103f3565b8452602084019350602083019250505b60018101905061023f565b5050505092915050565b600082601f830112151561028e5760006000fd5b81356102a161029c82610dbb565b610d41565b915081818352602084019350602081019050838560408402820111156102c75760006000fd5b60005b838110156102f857816102dd888261058b565b8452602084019350604083019250505b6001810190506102ca565b5050505092915050565b600082601f83011215156103165760006000fd5b813561032961032482610de4565b610d41565b9150818183526020840193506020810190508360005b83811015610370578135860161035588826105d8565b8452602084019350602083019250505b60018101905061033f565b5050505092915050565b600082601f830112151561038e5760006000fd5b60026103a161039c82610e0d565b610d41565b915081838560408402820111156103b85760006000fd5b60005b838110156103e957816103ce88826106fe565b8452602084019350604083019250505b6001810190506103bb565b5050505092915050565b600082601f83011215156104075760006000fd5b813561041a61041582610e30565b610d41565b915081818352602084019350602081019050838560408402820111156104405760006000fd5b60005b83811015610471578161045688826106fe565b8452602084019350604083019250505b600181019050610443565b5050505092915050565b600082601f830112151561048f5760006000fd5b81356104a261049d82610e59565b610d41565b915081818352602084019350602081019050838560208402820111156104c85760006000fd5b60005b838110156104f957816104de8882610760565b8452602084019350602083019250505b6001810190506104cb565b5050505092915050565b600082601f83011215156105175760006000fd5b813561052a61052582610e82565b610d41565b915081818352602084019350602081019050838560208402820111156105505760006000fd5b60005b8381101561058157816105668882610760565b8452602084019350602083019250505b600181019050610553565b5050505092915050565b60006040828403121561059e5760006000fd5b6105a86040610d41565b905060006105b88482850161074b565b60008301525060206105cc8482850161074b565b60208301525092915050565b6000606082840312156105eb5760006000fd5b6105f56060610d41565b9050600061060584828501610760565b600083015250602082013567ffffffffffffffff8111156106265760006000fd5b6106328482850161047b565b602083015250604082013567ffffffffffffffff8111156106535760006000fd5b61065f848285016103f3565b60408301525092915050565b60006060828403121561067e5760006000fd5b6106886060610d41565b9050600061069884828501610760565b600083015250602082013567ffffffffffffffff8111156106b95760006000fd5b6106c58482850161047b565b602083015250604082013567ffffffffffffffff8111156106e65760006000fd5b6106f2848285016103f3565b60408301525092915050565b6000604082840312156107115760006000fd5b61071b6040610d41565b9050600061072b84828501610760565b600083015250602061073f84828501610760565b60208301525092915050565b60008135905061075a8161103a565b92915050565b60008135905061076f81611054565b92915050565b6000602082840312156107885760006000fd5b600082013567ffffffffffffffff8111156107a35760006000fd5b6107af8482850161027a565b91505092915050565b6000600060006000600060a086880312156107d35760006000fd5b600086013567ffffffffffffffff8111156107ee5760006000fd5b6107fa8882890161066b565b955050602086013567ffffffffffffffff8111156108185760006000fd5b61082488828901610189565b945050604086013567ffffffffffffffff8111156108425760006000fd5b61084e88828901610211565b935050606086013567ffffffffffffffff81111561086c5760006000fd5b61087888828901610302565b925050608086013567ffffffffffffffff8111156108965760006000fd5b6108a288828901610503565b9150509295509295909350565b60006108bb8383610a6a565b60808301905092915050565b60006108d38383610ac2565b905092915050565b60006108e78383610c36565b905092915050565b60006108fb8383610c8d565b60408301905092915050565b60006109138383610cbc565b60208301905092915050565b600061092a82610f0f565b6109348185610fb7565b935061093f83610eab565b8060005b8381101561097157815161095788826108af565b975061096283610f5c565b9250505b600181019050610943565b5085935050505092915050565b600061098982610f1a565b6109938185610fc8565b9350836020820285016109a585610ebb565b8060005b858110156109e257848403895281516109c285826108c7565b94506109cd83610f69565b925060208a019950505b6001810190506109a9565b50829750879550505050505092915050565b60006109ff82610f25565b610a098185610fd3565b935083602082028501610a1b85610ec5565b8060005b85811015610a585784840389528151610a3885826108db565b9450610a4383610f76565b925060208a019950505b600181019050610a1f565b50829750879550505050505092915050565b610a7381610f30565b610a7d8184610fe4565b9250610a8882610ed5565b8060005b83811015610aba578151610aa087826108ef565b9650610aab83610f83565b9250505b600181019050610a8c565b505050505050565b6000610acd82610f3b565b610ad78185610fef565b9350610ae283610edf565b8060005b83811015610b14578151610afa88826108ef565b9750610b0583610f90565b9250505b600181019050610ae6565b5085935050505092915050565b6000610b2c82610f51565b610b368185611011565b9350610b4183610eff565b8060005b83811015610b73578151610b598882610907565b9750610b6483610faa565b9250505b600181019050610b45565b5085935050505092915050565b6000610b8b82610f46565b610b958185611000565b9350610ba083610eef565b8060005b83811015610bd2578151610bb88882610907565b9750610bc383610f9d565b9250505b600181019050610ba4565b5085935050505092915050565b6000606083016000830151610bf76000860182610cbc565b5060208301518482036020860152610c0f8282610b80565b91505060408301518482036040860152610c298282610ac2565b9150508091505092915050565b6000606083016000830151610c4e6000860182610cbc565b5060208301518482036020860152610c668282610b80565b91505060408301518482036040860152610c808282610ac2565b9150508091505092915050565b604082016000820151610ca36000850182610cbc565b506020820151610cb66020850182610cbc565b50505050565b610cc581611030565b82525050565b600060a0820190508181036000830152610ce58188610bdf565b90508181036020830152610cf9818761091f565b90508181036040830152610d0d818661097e565b90508181036060830152610d2181856109f4565b90508181036080830152610d358184610b21565b90509695505050505050565b6000604051905081810181811067ffffffffffffffff82111715610d655760006000fd5b8060405250919050565b600067ffffffffffffffff821115610d875760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610db05760006000fd5b602082029050919050565b600067ffffffffffffffff821115610dd35760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610dfc5760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e255760006000fd5b602082029050919050565b600067ffffffffffffffff821115610e485760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e715760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e9a5760006000fd5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061ffff82169050919050565b6000819050919050565b61104381611022565b811415156110515760006000fd5b50565b61105d81611030565b8114151561106b5760006000fd5b50565bfea365627a7a72315820d78c6ba7ee332581e6c4d9daa5fc07941841230f7ce49edf6e05b1b63853e8746c6578706572696d656e74616cf564736f6c634300050c0040`}, + []string{` +[{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"indexed":false,"internalType":"struct Tuple.S","name":"a","type":"tuple"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"indexed":false,"internalType":"struct Tuple.T[2][]","name":"b","type":"tuple[2][]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"indexed":false,"internalType":"struct Tuple.T[][2]","name":"c","type":"tuple[][2]"},{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"indexed":false,"internalType":"struct Tuple.S[]","name":"d","type":"tuple[]"},{"indexed":false,"internalType":"uint256[]","name":"e","type":"uint256[]"}],"name":"TupleEvent","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint8","name":"x","type":"uint8"},{"internalType":"uint8","name":"y","type":"uint8"}],"indexed":false,"internalType":"struct Tuple.P[]","name":"","type":"tuple[]"}],"name":"TupleEvent2","type":"event"},{"constant":true,"inputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S","name":"a","type":"tuple"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[2][]","name":"b","type":"tuple[2][]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[][2]","name":"c","type":"tuple[][2]"},{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S[]","name":"d","type":"tuple[]"},{"internalType":"uint256[]","name":"e","type":"uint256[]"}],"name":"func1","outputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[2][]","name":"","type":"tuple[2][]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[][2]","name":"","type":"tuple[][2]"},{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S[]","name":"","type":"tuple[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S","name":"a","type":"tuple"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[2][]","name":"b","type":"tuple[2][]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[][2]","name":"c","type":"tuple[][2]"},{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S[]","name":"d","type":"tuple[]"},{"internalType":"uint256[]","name":"e","type":"uint256[]"}],"name":"func2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"components":[{"internalType":"uint16","name":"x","type":"uint16"},{"internalType":"uint16","name":"y","type":"uint16"}],"internalType":"struct Tuple.Q[]","name":"","type":"tuple[]"}],"name":"func3","outputs":[],"payable":false,"stateMutability":"pure","type":"function"}] + `}, + ` + "math/big" + "reflect" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + `, + + ` + key, _ := crypto.GenerateKey() + auth := bind.NewKeyedTransactor(key) + + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() + + _, _, contract, err := DeployTuple(auth, sim) + if err != nil { + t.Fatalf("deploy contract failed %v", err) + } + sim.Commit() + + check := func(a, b interface{}, errMsg string) { + if !reflect.DeepEqual(a, b) { + t.Fatal(errMsg) + } + } + + a := TupleS{ + A: big.NewInt(1), + B: []*big.Int{big.NewInt(2), big.NewInt(3)}, + C: []TupleT{ + { + X: big.NewInt(4), + Y: big.NewInt(5), + }, + { + X: big.NewInt(6), + Y: big.NewInt(7), + }, + }, + } + + b := [][2]TupleT{ + { + { + X: big.NewInt(8), + Y: big.NewInt(9), + }, + { + X: big.NewInt(10), + Y: big.NewInt(11), + }, + }, + } + + c := [2][]TupleT{ + { + { + X: big.NewInt(12), + Y: big.NewInt(13), + }, + { + X: big.NewInt(14), + Y: big.NewInt(15), + }, + }, + { + { + X: big.NewInt(16), + Y: big.NewInt(17), + }, + }, + } + + d := []TupleS{a} + + e := []*big.Int{big.NewInt(18), big.NewInt(19)} + ret1, ret2, ret3, ret4, ret5, err := contract.Func1(nil, a, b, c, d, e) + if err != nil { + t.Fatalf("invoke contract failed, err %v", err) + } + check(ret1, a, "ret1 mismatch") + check(ret2, b, "ret2 mismatch") + check(ret3, c, "ret3 mismatch") + check(ret4, d, "ret4 mismatch") + check(ret5, e, "ret5 mismatch") + + _, err = contract.Func2(auth, a, b, c, d, e) + if err != nil { + t.Fatalf("invoke contract failed, err %v", err) + } + sim.Commit() + + iter, err := contract.FilterTupleEvent(nil) + if err != nil { + t.Fatalf("failed to create event filter, err %v", err) + } + defer iter.Close() + + iter.Next() + check(iter.Event.A, a, "field1 mismatch") + check(iter.Event.B, b, "field2 mismatch") + check(iter.Event.C, c, "field3 mismatch") + check(iter.Event.D, d, "field4 mismatch") + check(iter.Event.E, e, "field5 mismatch") + + err = contract.Func3(nil, nil) + if err != nil { + t.Fatalf("failed to call function which has no return, err %v", err) + } + `, + nil, + nil, + nil, + nil, + }, + { + `UseLibrary`, + ` + library Math { + function add(uint a, uint b) public view returns(uint) { + return a + b; + } + } + + contract UseLibrary { + function add (uint c, uint d) public view returns(uint) { + return Math.add(c,d); + } + } + `, + []string{ + // Bytecode for the UseLibrary contract + `608060405234801561001057600080fd5b5061011d806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063771602f714602d575b600080fd5b604d60048036036040811015604157600080fd5b5080359060200135605f565b60408051918252519081900360200190f35b600073__$b98c933f0a6ececcd167bd4f9d3299b1a0$__63771602f784846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801560b757600080fd5b505af415801560ca573d6000803e3d6000fd5b505050506040513d602081101560df57600080fd5b5051939250505056fea265627a7a72305820eb5c38f42445604cfa43d85e3aa5ecc48b0a646456c902dd48420ae7241d06f664736f6c63430005090032`, + // Bytecode for the Math contract + `60a3610024600b82828239805160001a607314601757fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060335760003560e01c8063771602f7146038575b600080fd5b605860048036036040811015604c57600080fd5b5080359060200135606a565b60408051918252519081900360200190f35b019056fea265627a7a723058206fc6c05f3078327f9c763edffdb5ab5f8bd212e293a1306c7d0ad05af3ad35f464736f6c63430005090032`, + }, + []string{ + `[{"constant":true,"inputs":[{"name":"c","type":"uint256"},{"name":"d","type":"uint256"}],"name":"add","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`, + `[{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"add","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`, + }, + ` + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + `, + ` + // Generate a new random account and a funded simulator + key, _ := crypto.GenerateKey() + auth := bind.NewKeyedTransactor(key) + + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() + + //deploy the test contract + _, _, testContract, err := DeployUseLibrary(auth, sim) + if err != nil { + t.Fatalf("Failed to deploy test contract: %v", err) + } + + // Finish deploy. + sim.Commit() + + // Check that the library contract has been deployed + // by calling the contract's add function. + res, err := testContract.Add(&bind.CallOpts{ + From: auth.From, + Pending: false, + }, big.NewInt(1), big.NewInt(2)) + if err != nil { + t.Fatalf("Failed to call linked contract: %v", err) + } + if res.Cmp(big.NewInt(3)) != 0 { + t.Fatalf("Add did not return the correct result: %d != %d", res, 3) + } + `, + nil, + map[string]string{ + "b98c933f0a6ececcd167bd4f9d3299b1a0": "Math", + }, + nil, + []string{"UseLibrary", "Math"}, + }, { + "Overload", + ` + pragma solidity ^0.5.10; + + contract overload { + mapping(address => uint256) balances; + + event bar(uint256 i); + event bar(uint256 i, uint256 j); + + function foo(uint256 i) public { + emit bar(i); + } + function foo(uint256 i, uint256 j) public { + emit bar(i, j); + } + } + `, + []string{`608060405234801561001057600080fd5b50610153806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806304bc52f81461003b5780632fbebd3814610073575b600080fd5b6100716004803603604081101561005157600080fd5b8101908080359060200190929190803590602001909291905050506100a1565b005b61009f6004803603602081101561008957600080fd5b81019080803590602001909291905050506100e4565b005b7fae42e9514233792a47a1e4554624e83fe852228e1503f63cd383e8a431f4f46d8282604051808381526020018281526020019250505060405180910390a15050565b7f0423a1321222a0a8716c22b92fac42d85a45a612b696a461784d9fa537c81e5c816040518082815260200191505060405180910390a15056fea265627a7a72305820e22b049858b33291cbe67eeaece0c5f64333e439d27032ea8337d08b1de18fe864736f6c634300050a0032`}, + []string{`[{"constant":false,"inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i","type":"uint256"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"i","type":"uint256"}],"name":"bar","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"i","type":"uint256"},{"indexed":false,"name":"j","type":"uint256"}],"name":"bar","type":"event"}]`}, + ` + "math/big" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + `, + ` + // Initialize test accounts + key, _ := crypto.GenerateKey() + auth := bind.NewKeyedTransactor(key) + sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(10000000000)}}, 10000000) + defer sim.Close() + + // deploy the test contract + _, _, contract, err := DeployOverload(auth, sim) + if err != nil { + t.Fatalf("Failed to deploy contract: %v", err) + } + // Finish deploy. + sim.Commit() + + resCh, stopCh := make(chan uint64), make(chan struct{}) + + go func() { + barSink := make(chan *OverloadBar) + sub, _ := contract.WatchBar(nil, barSink) + defer sub.Unsubscribe() + + bar0Sink := make(chan *OverloadBar0) + sub0, _ := contract.WatchBar0(nil, bar0Sink) + defer sub0.Unsubscribe() + + for { + select { + case ev := <-barSink: + resCh <- ev.I.Uint64() + case ev := <-bar0Sink: + resCh <- ev.I.Uint64() + ev.J.Uint64() + case <-stopCh: + return + } + } + }() + contract.Foo(auth, big.NewInt(1), big.NewInt(2)) + sim.Commit() + select { + case n := <-resCh: + if n != 3 { + t.Fatalf("Invalid bar0 event") + } + case <-time.NewTimer(100 * time.Millisecond).C: + t.Fatalf("Wait bar0 event timeout") + } + + contract.Foo0(auth, big.NewInt(1)) + sim.Commit() + select { + case n := <-resCh: + if n != 1 { + t.Fatalf("Invalid bar event") + } + case <-time.NewTimer(100 * time.Millisecond).C: + t.Fatalf("Wait bar event timeout") + } + close(stopCh) + `, + nil, + nil, + nil, + nil, + }, + { + "IdentifierCollision", + ` + pragma solidity >=0.4.19 <0.6.0; + + contract IdentifierCollision { + uint public _myVar; + + function MyVar() public view returns (uint) { + return _myVar; + } + } + `, + []string{"60806040523480156100115760006000fd5b50610017565b60c3806100256000396000f3fe608060405234801560105760006000fd5b506004361060365760003560e01c806301ad4d8714603c5780634ef1f0ad146058576036565b60006000fd5b60426074565b6040518082815260200191505060405180910390f35b605e607d565b6040518082815260200191505060405180910390f35b60006000505481565b60006000600050549050608b565b9056fea265627a7a7231582067c8d84688b01c4754ba40a2a871cede94ea1f28b5981593ab2a45b46ac43af664736f6c634300050c0032"}, + []string{`[{"constant":true,"inputs":[],"name":"MyVar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_myVar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`}, + ` + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/core" + `, + ` + // Initialize test accounts + key, _ := crypto.GenerateKey() + addr := crypto.PubkeyToAddress(key.PublicKey) + + // Deploy registrar contract + sim := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(1000000000)}}, 10000000) + defer sim.Close() + + transactOpts := bind.NewKeyedTransactor(key) + _, _, _, err := DeployIdentifierCollision(transactOpts, sim) + if err != nil { + t.Fatalf("failed to deploy contract: %v", err) + } + `, + nil, + nil, + map[string]string{"_myVar": "pubVar"}, // alias MyVar to PubVar + nil, + }, + { + "MultiContracts", + ` + pragma solidity ^0.5.11; + pragma experimental ABIEncoderV2; + + library ExternalLib { + struct SharedStruct{ + uint256 f1; + bytes32 f2; + } + } + + contract ContractOne { + function foo(ExternalLib.SharedStruct memory s) pure public { + // Do stuff + } + } + + contract ContractTwo { + function bar(ExternalLib.SharedStruct memory s) pure public { + // Do stuff + } + } + `, + []string{ + `60806040523480156100115760006000fd5b50610017565b6101b5806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100305760003560e01c80639d8a8ba81461003657610030565b60006000fd5b610050600480360361004b91908101906100d1565b610052565b005b5b5056610171565b6000813590506100698161013d565b92915050565b6000604082840312156100825760006000fd5b61008c60406100fb565b9050600061009c848285016100bc565b60008301525060206100b08482850161005a565b60208301525092915050565b6000813590506100cb81610157565b92915050565b6000604082840312156100e45760006000fd5b60006100f28482850161006f565b91505092915050565b6000604051905081810181811067ffffffffffffffff8211171561011f5760006000fd5b8060405250919050565b6000819050919050565b6000819050919050565b61014681610129565b811415156101545760006000fd5b50565b61016081610133565b8114151561016e5760006000fd5b50565bfea365627a7a72315820749274eb7f6c01010d5322af4e1668b0a154409eb7968bd6cae5524c7ed669bb6c6578706572696d656e74616cf564736f6c634300050c0040`, + `60806040523480156100115760006000fd5b50610017565b6101b5806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100305760003560e01c8063db8ba08c1461003657610030565b60006000fd5b610050600480360361004b91908101906100d1565b610052565b005b5b5056610171565b6000813590506100698161013d565b92915050565b6000604082840312156100825760006000fd5b61008c60406100fb565b9050600061009c848285016100bc565b60008301525060206100b08482850161005a565b60208301525092915050565b6000813590506100cb81610157565b92915050565b6000604082840312156100e45760006000fd5b60006100f28482850161006f565b91505092915050565b6000604051905081810181811067ffffffffffffffff8211171561011f5760006000fd5b8060405250919050565b6000819050919050565b6000819050919050565b61014681610129565b811415156101545760006000fd5b50565b61016081610133565b8114151561016e5760006000fd5b50565bfea365627a7a723158209bc28ee7ea97c131a13330d77ec73b4493b5c59c648352da81dd288b021192596c6578706572696d656e74616cf564736f6c634300050c0040`, + `606c6026600b82828239805160001a6073141515601857fe5b30600052607381538281f350fe73000000000000000000000000000000000000000030146080604052600436106023575b60006000fdfea365627a7a72315820518f0110144f5b3de95697d05e456a064656890d08e6f9cff47f3be710cc46a36c6578706572696d656e74616cf564736f6c634300050c0040`, + }, + []string{ + `[{"constant":true,"inputs":[{"components":[{"internalType":"uint256","name":"f1","type":"uint256"},{"internalType":"bytes32","name":"f2","type":"bytes32"}],"internalType":"struct ExternalLib.SharedStruct","name":"s","type":"tuple"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"pure","type":"function"}]`, + `[{"constant":true,"inputs":[{"components":[{"internalType":"uint256","name":"f1","type":"uint256"},{"internalType":"bytes32","name":"f2","type":"bytes32"}],"internalType":"struct ExternalLib.SharedStruct","name":"s","type":"tuple"}],"name":"bar","outputs":[],"payable":false,"stateMutability":"pure","type":"function"}]`, + `[]`, + }, + ` + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/core" + `, + ` + key, _ := crypto.GenerateKey() + addr := crypto.PubkeyToAddress(key.PublicKey) + + // Deploy registrar contract + sim := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(1000000000)}}, 10000000) + defer sim.Close() + + transactOpts := bind.NewKeyedTransactor(key) + _, _, c1, err := DeployContractOne(transactOpts, sim) + if err != nil { + t.Fatal("Failed to deploy contract") + } + sim.Commit() + err = c1.Foo(nil, ExternalLibSharedStruct{ + F1: big.NewInt(100), + F2: [32]byte{0x01, 0x02, 0x03}, + }) + if err != nil { + t.Fatal("Failed to invoke function") + } + _, _, c2, err := DeployContractTwo(transactOpts, sim) + if err != nil { + t.Fatal("Failed to deploy contract") + } + sim.Commit() + err = c2.Bar(nil, ExternalLibSharedStruct{ + F1: big.NewInt(100), + F2: [32]byte{0x01, 0x02, 0x03}, + }) + if err != nil { + t.Fatal("Failed to invoke function") + } + `, + nil, + nil, + nil, + []string{"ContractOne", "ContractTwo", "ExternalLib"}, }, } // Tests that packages generated by the binder can be successfully compiled and // the requested tester run against it. -func TestBindings(t *testing.T) { +func TestGolangBindings(t *testing.T) { // Skip the test if no Go command can be found gocmd := runtime.GOROOT() + "/bin/go" if !common.FileExist(gocmd) { @@ -944,8 +1553,14 @@ func TestBindings(t *testing.T) { } // Generate the test suite for all the contracts for i, tt := range bindTests { + var types []string + if tt.types != nil { + types = tt.types + } else { + types = []string{tt.name} + } // Generate the binding and create a Go source file in the workspace - bind, err := Bind([]string{tt.name}, []string{tt.abi}, []string{tt.bytecode}, "bindtest", LangGo) + bind, err := Bind(types, tt.abi, tt.bytecode, tt.fsigs, "bindtest", LangGo, tt.libs, tt.aliases) if err != nil { t.Fatalf("test %d: failed to generate binding: %v", i, err) } @@ -969,6 +1584,18 @@ func TestBindings(t *testing.T) { t.Fatalf("test %d: failed to write tests: %v", i, err) } } + // Convert the package to go modules and use the current source for go-ethereum + moder := exec.Command(gocmd, "mod", "init", "bindtest") + moder.Dir = pkg + if out, err := moder.CombinedOutput(); err != nil { + t.Fatalf("failed to convert binding test to modules: %v\n%s", err, out) + } + pwd, _ := os.Getwd() + replacer := exec.Command(gocmd, "mod", "edit", "-replace", "github.com/ethereum/go-ethereum="+filepath.Join(pwd, "..", "..", "..")) // Repo root + replacer.Dir = pkg + if out, err := replacer.CombinedOutput(); err != nil { + t.Fatalf("failed to replace binding test dependency to current source tree: %v\n%s", err, out) + } // Test the entire package and report any failures cmd := exec.Command(gocmd, "test", "-v", "-count", "1") cmd.Dir = pkg @@ -976,3 +1603,404 @@ func TestBindings(t *testing.T) { t.Fatalf("failed to run binding test: %v\n%s", err, out) } } + +// Tests that java binding generated by the binder is exactly matched. +func TestJavaBindings(t *testing.T) { + var cases = []struct { + name string + contract string + abi string + bytecode string + expected string + }{ + { + "test", + ` + pragma experimental ABIEncoderV2; + pragma solidity ^0.5.2; + + contract test { + function setAddress(address a) public returns(address){} + function setAddressList(address[] memory a_l) public returns(address[] memory){} + function setAddressArray(address[2] memory a_a) public returns(address[2] memory){} + + function setUint8(uint8 u8) public returns(uint8){} + function setUint16(uint16 u16) public returns(uint16){} + function setUint32(uint32 u32) public returns(uint32){} + function setUint64(uint64 u64) public returns(uint64){} + function setUint256(uint256 u256) public returns(uint256){} + function setUint256List(uint256[] memory u256_l) public returns(uint256[] memory){} + function setUint256Array(uint256[2] memory u256_a) public returns(uint256[2] memory){} + + function setInt8(int8 i8) public returns(int8){} + function setInt16(int16 i16) public returns(int16){} + function setInt32(int32 i32) public returns(int32){} + function setInt64(int64 i64) public returns(int64){} + function setInt256(int256 i256) public returns(int256){} + function setInt256List(int256[] memory i256_l) public returns(int256[] memory){} + function setInt256Array(int256[2] memory i256_a) public returns(int256[2] memory){} + + function setBytes1(bytes1 b1) public returns(bytes1) {} + function setBytes32(bytes32 b32) public returns(bytes32) {} + function setBytes(bytes memory bs) public returns(bytes memory) {} + function setBytesList(bytes[] memory bs_l) public returns(bytes[] memory) {} + function setBytesArray(bytes[2] memory bs_a) public returns(bytes[2] memory) {} + + function setString(string memory s) public returns(string memory) {} + function setStringList(string[] memory s_l) public returns(string[] memory) {} + function setStringArray(string[2] memory s_a) public returns(string[2] memory) {} + + function setBool(bool b) public returns(bool) {} + function setBoolList(bool[] memory b_l) public returns(bool[] memory) {} + function setBoolArray(bool[2] memory b_a) public returns(bool[2] memory) {} + }`, + `[{"constant":false,"inputs":[{"name":"u16","type":"uint16"}],"name":"setUint16","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"b_a","type":"bool[2]"}],"name":"setBoolArray","outputs":[{"name":"","type":"bool[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a_a","type":"address[2]"}],"name":"setAddressArray","outputs":[{"name":"","type":"address[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"bs_l","type":"bytes[]"}],"name":"setBytesList","outputs":[{"name":"","type":"bytes[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u8","type":"uint8"}],"name":"setUint8","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u32","type":"uint32"}],"name":"setUint32","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"b","type":"bool"}],"name":"setBool","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i256_l","type":"int256[]"}],"name":"setInt256List","outputs":[{"name":"","type":"int256[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u256_a","type":"uint256[2]"}],"name":"setUint256Array","outputs":[{"name":"","type":"uint256[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"b_l","type":"bool[]"}],"name":"setBoolList","outputs":[{"name":"","type":"bool[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"bs_a","type":"bytes[2]"}],"name":"setBytesArray","outputs":[{"name":"","type":"bytes[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a_l","type":"address[]"}],"name":"setAddressList","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i256_a","type":"int256[2]"}],"name":"setInt256Array","outputs":[{"name":"","type":"int256[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"s_a","type":"string[2]"}],"name":"setStringArray","outputs":[{"name":"","type":"string[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"s","type":"string"}],"name":"setString","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u64","type":"uint64"}],"name":"setUint64","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i16","type":"int16"}],"name":"setInt16","outputs":[{"name":"","type":"int16"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i8","type":"int8"}],"name":"setInt8","outputs":[{"name":"","type":"int8"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u256_l","type":"uint256[]"}],"name":"setUint256List","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i256","type":"int256"}],"name":"setInt256","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i32","type":"int32"}],"name":"setInt32","outputs":[{"name":"","type":"int32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"b32","type":"bytes32"}],"name":"setBytes32","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"s_l","type":"string[]"}],"name":"setStringList","outputs":[{"name":"","type":"string[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u256","type":"uint256"}],"name":"setUint256","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"bs","type":"bytes"}],"name":"setBytes","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"address"}],"name":"setAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i64","type":"int64"}],"name":"setInt64","outputs":[{"name":"","type":"int64"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"b1","type":"bytes1"}],"name":"setBytes1","outputs":[{"name":"","type":"bytes1"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]`, + `608060405234801561001057600080fd5b5061265a806100206000396000f3fe608060405234801561001057600080fd5b50600436106101e1576000357c0100000000000000000000000000000000000000000000000000000000900480637fcaf66611610116578063c2b12a73116100b4578063da359dc81161008e578063da359dc814610666578063e30081a014610696578063e673eb32146106c6578063fba1a1c3146106f6576101e1565b8063c2b12a73146105d6578063c577796114610606578063d2282dc514610636576101e1565b80639a19a953116100f05780639a19a95314610516578063a0709e1914610546578063a53b1c1e14610576578063b7d5df31146105a6576101e1565b80637fcaf66614610486578063822cba69146104b657806386114cea146104e6576101e1565b806322722302116101835780635119655d1161015d5780635119655d146103c65780635be6b37e146103f65780636aa482fc146104265780637173b69514610456576101e1565b806322722302146103365780632766a755146103665780634d5ee6da14610396576101e1565b806316c105e2116101bf57806316c105e2146102765780631774e646146102a65780631c9352e2146102d65780631e26fd3314610306576101e1565b80630477988a146101e6578063118a971814610216578063151f547114610246575b600080fd5b61020060048036036101fb9190810190611599565b610726565b60405161020d9190611f01565b60405180910390f35b610230600480360361022b919081019061118d565b61072d565b60405161023d9190611ca6565b60405180910390f35b610260600480360361025b9190810190611123565b61073a565b60405161026d9190611c69565b60405180910390f35b610290600480360361028b9190810190611238565b610747565b60405161029d9190611d05565b60405180910390f35b6102c060048036036102bb919081019061163d565b61074e565b6040516102cd9190611f6d565b60405180910390f35b6102f060048036036102eb91908101906115eb565b610755565b6040516102fd9190611f37565b60405180910390f35b610320600480360361031b91908101906113cf565b61075c565b60405161032d9190611de5565b60405180910390f35b610350600480360361034b91908101906112a2565b610763565b60405161035d9190611d42565b60405180910390f35b610380600480360361037b9190810190611365565b61076a565b60405161038d9190611da8565b60405180910390f35b6103b060048036036103ab91908101906111b6565b610777565b6040516103bd9190611cc1565b60405180910390f35b6103e060048036036103db91908101906111f7565b61077e565b6040516103ed9190611ce3565b60405180910390f35b610410600480360361040b919081019061114c565b61078b565b60405161041d9190611c84565b60405180910390f35b610440600480360361043b9190810190611279565b610792565b60405161044d9190611d27565b60405180910390f35b610470600480360361046b91908101906112e3565b61079f565b60405161047d9190611d64565b60405180910390f35b6104a0600480360361049b9190810190611558565b6107ac565b6040516104ad9190611edf565b60405180910390f35b6104d060048036036104cb9190810190611614565b6107b3565b6040516104dd9190611f52565b60405180910390f35b61050060048036036104fb919081019061148b565b6107ba565b60405161050d9190611e58565b60405180910390f35b610530600480360361052b919081019061152f565b6107c1565b60405161053d9190611ec4565b60405180910390f35b610560600480360361055b919081019061138e565b6107c8565b60405161056d9190611dc3565b60405180910390f35b610590600480360361058b91908101906114b4565b6107cf565b60405161059d9190611e73565b60405180910390f35b6105c060048036036105bb91908101906114dd565b6107d6565b6040516105cd9190611e8e565b60405180910390f35b6105f060048036036105eb9190810190611421565b6107dd565b6040516105fd9190611e1b565b60405180910390f35b610620600480360361061b9190810190611324565b6107e4565b60405161062d9190611d86565b60405180910390f35b610650600480360361064b91908101906115c2565b6107eb565b60405161065d9190611f1c565b60405180910390f35b610680600480360361067b919081019061144a565b6107f2565b60405161068d9190611e36565b60405180910390f35b6106b060048036036106ab91908101906110fa565b6107f9565b6040516106bd9190611c4e565b60405180910390f35b6106e060048036036106db9190810190611506565b610800565b6040516106ed9190611ea9565b60405180910390f35b610710600480360361070b91908101906113f8565b610807565b60405161071d9190611e00565b60405180910390f35b6000919050565b61073561080e565b919050565b610742610830565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b610772610852565b919050565b6060919050565b610786610874565b919050565b6060919050565b61079a61089b565b919050565b6107a76108bd565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108835790505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108cc5790505090565b60006108f082356124f2565b905092915050565b600082601f830112151561090b57600080fd5b600261091e61091982611fb5565b611f88565b9150818385602084028201111561093457600080fd5b60005b83811015610964578161094a88826108e4565b845260208401935060208301925050600181019050610937565b5050505092915050565b600082601f830112151561098157600080fd5b813561099461098f82611fd7565b611f88565b915081818352602084019350602081019050838560208402820111156109b957600080fd5b60005b838110156109e957816109cf88826108e4565b8452602084019350602083019250506001810190506109bc565b5050505092915050565b600082601f8301121515610a0657600080fd5b6002610a19610a1482611fff565b611f88565b91508183856020840282011115610a2f57600080fd5b60005b83811015610a5f5781610a458882610e9e565b845260208401935060208301925050600181019050610a32565b5050505092915050565b600082601f8301121515610a7c57600080fd5b8135610a8f610a8a82612021565b611f88565b91508181835260208401935060208101905083856020840282011115610ab457600080fd5b60005b83811015610ae45781610aca8882610e9e565b845260208401935060208301925050600181019050610ab7565b5050505092915050565b600082601f8301121515610b0157600080fd5b6002610b14610b0f82612049565b611f88565b9150818360005b83811015610b4b5781358601610b318882610eda565b845260208401935060208301925050600181019050610b1b565b5050505092915050565b600082601f8301121515610b6857600080fd5b8135610b7b610b768261206b565b611f88565b9150818183526020840193506020810190508360005b83811015610bc15781358601610ba78882610eda565b845260208401935060208301925050600181019050610b91565b5050505092915050565b600082601f8301121515610bde57600080fd5b6002610bf1610bec82612093565b611f88565b91508183856020840282011115610c0757600080fd5b60005b83811015610c375781610c1d8882610f9a565b845260208401935060208301925050600181019050610c0a565b5050505092915050565b600082601f8301121515610c5457600080fd5b8135610c67610c62826120b5565b611f88565b91508181835260208401935060208101905083856020840282011115610c8c57600080fd5b60005b83811015610cbc5781610ca28882610f9a565b845260208401935060208301925050600181019050610c8f565b5050505092915050565b600082601f8301121515610cd957600080fd5b6002610cec610ce7826120dd565b611f88565b9150818360005b83811015610d235781358601610d098882610fea565b845260208401935060208301925050600181019050610cf3565b5050505092915050565b600082601f8301121515610d4057600080fd5b8135610d53610d4e826120ff565b611f88565b9150818183526020840193506020810190508360005b83811015610d995781358601610d7f8882610fea565b845260208401935060208301925050600181019050610d69565b5050505092915050565b600082601f8301121515610db657600080fd5b6002610dc9610dc482612127565b611f88565b91508183856020840282011115610ddf57600080fd5b60005b83811015610e0f5781610df588826110aa565b845260208401935060208301925050600181019050610de2565b5050505092915050565b600082601f8301121515610e2c57600080fd5b8135610e3f610e3a82612149565b611f88565b91508181835260208401935060208101905083856020840282011115610e6457600080fd5b60005b83811015610e945781610e7a88826110aa565b845260208401935060208301925050600181019050610e67565b5050505092915050565b6000610eaa8235612504565b905092915050565b6000610ebe8235612510565b905092915050565b6000610ed2823561253c565b905092915050565b600082601f8301121515610eed57600080fd5b8135610f00610efb82612171565b611f88565b91508082526020830160208301858383011115610f1c57600080fd5b610f278382846125cd565b50505092915050565b600082601f8301121515610f4357600080fd5b8135610f56610f518261219d565b611f88565b91508082526020830160208301858383011115610f7257600080fd5b610f7d8382846125cd565b50505092915050565b6000610f928235612546565b905092915050565b6000610fa68235612553565b905092915050565b6000610fba823561255d565b905092915050565b6000610fce823561256a565b905092915050565b6000610fe28235612577565b905092915050565b600082601f8301121515610ffd57600080fd5b813561101061100b826121c9565b611f88565b9150808252602083016020830185838301111561102c57600080fd5b6110378382846125cd565b50505092915050565b600082601f830112151561105357600080fd5b8135611066611061826121f5565b611f88565b9150808252602083016020830185838301111561108257600080fd5b61108d8382846125cd565b50505092915050565b60006110a28235612584565b905092915050565b60006110b68235612592565b905092915050565b60006110ca823561259c565b905092915050565b60006110de82356125ac565b905092915050565b60006110f282356125c0565b905092915050565b60006020828403121561110c57600080fd5b600061111a848285016108e4565b91505092915050565b60006040828403121561113557600080fd5b6000611143848285016108f8565b91505092915050565b60006020828403121561115e57600080fd5b600082013567ffffffffffffffff81111561117857600080fd5b6111848482850161096e565b91505092915050565b60006040828403121561119f57600080fd5b60006111ad848285016109f3565b91505092915050565b6000602082840312156111c857600080fd5b600082013567ffffffffffffffff8111156111e257600080fd5b6111ee84828501610a69565b91505092915050565b60006020828403121561120957600080fd5b600082013567ffffffffffffffff81111561122357600080fd5b61122f84828501610aee565b91505092915050565b60006020828403121561124a57600080fd5b600082013567ffffffffffffffff81111561126457600080fd5b61127084828501610b55565b91505092915050565b60006040828403121561128b57600080fd5b600061129984828501610bcb565b91505092915050565b6000602082840312156112b457600080fd5b600082013567ffffffffffffffff8111156112ce57600080fd5b6112da84828501610c41565b91505092915050565b6000602082840312156112f557600080fd5b600082013567ffffffffffffffff81111561130f57600080fd5b61131b84828501610cc6565b91505092915050565b60006020828403121561133657600080fd5b600082013567ffffffffffffffff81111561135057600080fd5b61135c84828501610d2d565b91505092915050565b60006040828403121561137757600080fd5b600061138584828501610da3565b91505092915050565b6000602082840312156113a057600080fd5b600082013567ffffffffffffffff8111156113ba57600080fd5b6113c684828501610e19565b91505092915050565b6000602082840312156113e157600080fd5b60006113ef84828501610e9e565b91505092915050565b60006020828403121561140a57600080fd5b600061141884828501610eb2565b91505092915050565b60006020828403121561143357600080fd5b600061144184828501610ec6565b91505092915050565b60006020828403121561145c57600080fd5b600082013567ffffffffffffffff81111561147657600080fd5b61148284828501610f30565b91505092915050565b60006020828403121561149d57600080fd5b60006114ab84828501610f86565b91505092915050565b6000602082840312156114c657600080fd5b60006114d484828501610f9a565b91505092915050565b6000602082840312156114ef57600080fd5b60006114fd84828501610fae565b91505092915050565b60006020828403121561151857600080fd5b600061152684828501610fc2565b91505092915050565b60006020828403121561154157600080fd5b600061154f84828501610fd6565b91505092915050565b60006020828403121561156a57600080fd5b600082013567ffffffffffffffff81111561158457600080fd5b61159084828501611040565b91505092915050565b6000602082840312156115ab57600080fd5b60006115b984828501611096565b91505092915050565b6000602082840312156115d457600080fd5b60006115e2848285016110aa565b91505092915050565b6000602082840312156115fd57600080fd5b600061160b848285016110be565b91505092915050565b60006020828403121561162657600080fd5b6000611634848285016110d2565b91505092915050565b60006020828403121561164f57600080fd5b600061165d848285016110e6565b91505092915050565b61166f816123f7565b82525050565b61167e816122ab565b61168782612221565b60005b828110156116b95761169d858351611666565b6116a68261235b565b915060208501945060018101905061168a565b5050505050565b60006116cb826122b6565b8084526020840193506116dd8361222b565b60005b8281101561170f576116f3868351611666565b6116fc82612368565b91506020860195506001810190506116e0565b50849250505092915050565b611724816122c1565b61172d82612238565b60005b8281101561175f57611743858351611ab3565b61174c82612375565b9150602085019450600181019050611730565b5050505050565b6000611771826122cc565b80845260208401935061178383612242565b60005b828110156117b557611799868351611ab3565b6117a282612382565b9150602086019550600181019050611786565b50849250505092915050565b60006117cc826122d7565b836020820285016117dc8561224f565b60005b848110156118155783830388526117f7838351611b16565b92506118028261238f565b91506020880197506001810190506117df565b508196508694505050505092915050565b6000611831826122e2565b8084526020840193508360208202850161184a85612259565b60005b84811015611883578383038852611865838351611b16565b92506118708261239c565b915060208801975060018101905061184d565b508196508694505050505092915050565b61189d816122ed565b6118a682612266565b60005b828110156118d8576118bc858351611b5b565b6118c5826123a9565b91506020850194506001810190506118a9565b5050505050565b60006118ea826122f8565b8084526020840193506118fc83612270565b60005b8281101561192e57611912868351611b5b565b61191b826123b6565b91506020860195506001810190506118ff565b50849250505092915050565b600061194582612303565b836020820285016119558561227d565b60005b8481101561198e578383038852611970838351611bcd565b925061197b826123c3565b9150602088019750600181019050611958565b508196508694505050505092915050565b60006119aa8261230e565b808452602084019350836020820285016119c385612287565b60005b848110156119fc5783830388526119de838351611bcd565b92506119e9826123d0565b91506020880197506001810190506119c6565b508196508694505050505092915050565b611a1681612319565b611a1f82612294565b60005b82811015611a5157611a35858351611c12565b611a3e826123dd565b9150602085019450600181019050611a22565b5050505050565b6000611a6382612324565b808452602084019350611a758361229e565b60005b82811015611aa757611a8b868351611c12565b611a94826123ea565b9150602086019550600181019050611a78565b50849250505092915050565b611abc81612409565b82525050565b611acb81612415565b82525050565b611ada81612441565b82525050565b6000611aeb8261233a565b808452611aff8160208601602086016125dc565b611b088161260f565b602085010191505092915050565b6000611b218261232f565b808452611b358160208601602086016125dc565b611b3e8161260f565b602085010191505092915050565b611b558161244b565b82525050565b611b6481612458565b82525050565b611b7381612462565b82525050565b611b828161246f565b82525050565b611b918161247c565b82525050565b6000611ba282612350565b808452611bb68160208601602086016125dc565b611bbf8161260f565b602085010191505092915050565b6000611bd882612345565b808452611bec8160208601602086016125dc565b611bf58161260f565b602085010191505092915050565b611c0c81612489565b82525050565b611c1b816124b7565b82525050565b611c2a816124c1565b82525050565b611c39816124d1565b82525050565b611c48816124e5565b82525050565b6000602082019050611c636000830184611666565b92915050565b6000604082019050611c7e6000830184611675565b92915050565b60006020820190508181036000830152611c9e81846116c0565b905092915050565b6000604082019050611cbb600083018461171b565b92915050565b60006020820190508181036000830152611cdb8184611766565b905092915050565b60006020820190508181036000830152611cfd81846117c1565b905092915050565b60006020820190508181036000830152611d1f8184611826565b905092915050565b6000604082019050611d3c6000830184611894565b92915050565b60006020820190508181036000830152611d5c81846118df565b905092915050565b60006020820190508181036000830152611d7e818461193a565b905092915050565b60006020820190508181036000830152611da0818461199f565b905092915050565b6000604082019050611dbd6000830184611a0d565b92915050565b60006020820190508181036000830152611ddd8184611a58565b905092915050565b6000602082019050611dfa6000830184611ab3565b92915050565b6000602082019050611e156000830184611ac2565b92915050565b6000602082019050611e306000830184611ad1565b92915050565b60006020820190508181036000830152611e508184611ae0565b905092915050565b6000602082019050611e6d6000830184611b4c565b92915050565b6000602082019050611e886000830184611b5b565b92915050565b6000602082019050611ea36000830184611b6a565b92915050565b6000602082019050611ebe6000830184611b79565b92915050565b6000602082019050611ed96000830184611b88565b92915050565b60006020820190508181036000830152611ef98184611b97565b905092915050565b6000602082019050611f166000830184611c03565b92915050565b6000602082019050611f316000830184611c12565b92915050565b6000602082019050611f4c6000830184611c21565b92915050565b6000602082019050611f676000830184611c30565b92915050565b6000602082019050611f826000830184611c3f565b92915050565b6000604051905081810181811067ffffffffffffffff82111715611fab57600080fd5b8060405250919050565b600067ffffffffffffffff821115611fcc57600080fd5b602082029050919050565b600067ffffffffffffffff821115611fee57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561201657600080fd5b602082029050919050565b600067ffffffffffffffff82111561203857600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561206057600080fd5b602082029050919050565b600067ffffffffffffffff82111561208257600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120aa57600080fd5b602082029050919050565b600067ffffffffffffffff8211156120cc57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120f457600080fd5b602082029050919050565b600067ffffffffffffffff82111561211657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561213e57600080fd5b602082029050919050565b600067ffffffffffffffff82111561216057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561218857600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121b457600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121e057600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561220c57600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600061240282612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60006124fd82612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156125fa5780820151818401526020810190506125df565b83811115612609576000848401525b50505050565b6000601f19601f830116905091905056fea265627a7a723058206fe37171cf1b10ebd291cfdca61d67e7fc3c208795e999c833c42a14d86cf00d6c6578706572696d656e74616cf50037`, + ` +// This file is an automatically generated Java binding. Do not modify as any +// change will likely be lost upon the next re-generation! + +package bindtest; + +import org.ethereum.geth.*; +import java.util.*; + + + +public class Test { + // ABI is the input ABI used to generate the binding from. + public final static String ABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"u16\",\"type\":\"uint16\"}],\"name\":\"setUint16\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b_a\",\"type\":\"bool[2]\"}],\"name\":\"setBoolArray\",\"outputs\":[{\"name\":\"\",\"type\":\"bool[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a_a\",\"type\":\"address[2]\"}],\"name\":\"setAddressArray\",\"outputs\":[{\"name\":\"\",\"type\":\"address[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bs_l\",\"type\":\"bytes[]\"}],\"name\":\"setBytesList\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u8\",\"type\":\"uint8\"}],\"name\":\"setUint8\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u32\",\"type\":\"uint32\"}],\"name\":\"setUint32\",\"outputs\":[{\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b\",\"type\":\"bool\"}],\"name\":\"setBool\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i256_l\",\"type\":\"int256[]\"}],\"name\":\"setInt256List\",\"outputs\":[{\"name\":\"\",\"type\":\"int256[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u256_a\",\"type\":\"uint256[2]\"}],\"name\":\"setUint256Array\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b_l\",\"type\":\"bool[]\"}],\"name\":\"setBoolList\",\"outputs\":[{\"name\":\"\",\"type\":\"bool[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bs_a\",\"type\":\"bytes[2]\"}],\"name\":\"setBytesArray\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a_l\",\"type\":\"address[]\"}],\"name\":\"setAddressList\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i256_a\",\"type\":\"int256[2]\"}],\"name\":\"setInt256Array\",\"outputs\":[{\"name\":\"\",\"type\":\"int256[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"s_a\",\"type\":\"string[2]\"}],\"name\":\"setStringArray\",\"outputs\":[{\"name\":\"\",\"type\":\"string[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"s\",\"type\":\"string\"}],\"name\":\"setString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u64\",\"type\":\"uint64\"}],\"name\":\"setUint64\",\"outputs\":[{\"name\":\"\",\"type\":\"uint64\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i16\",\"type\":\"int16\"}],\"name\":\"setInt16\",\"outputs\":[{\"name\":\"\",\"type\":\"int16\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i8\",\"type\":\"int8\"}],\"name\":\"setInt8\",\"outputs\":[{\"name\":\"\",\"type\":\"int8\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u256_l\",\"type\":\"uint256[]\"}],\"name\":\"setUint256List\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i256\",\"type\":\"int256\"}],\"name\":\"setInt256\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i32\",\"type\":\"int32\"}],\"name\":\"setInt32\",\"outputs\":[{\"name\":\"\",\"type\":\"int32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b32\",\"type\":\"bytes32\"}],\"name\":\"setBytes32\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"s_l\",\"type\":\"string[]\"}],\"name\":\"setStringList\",\"outputs\":[{\"name\":\"\",\"type\":\"string[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u256\",\"type\":\"uint256\"}],\"name\":\"setUint256\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bs\",\"type\":\"bytes\"}],\"name\":\"setBytes\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i64\",\"type\":\"int64\"}],\"name\":\"setInt64\",\"outputs\":[{\"name\":\"\",\"type\":\"int64\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b1\",\"type\":\"bytes1\"}],\"name\":\"setBytes1\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes1\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"; + + + // BYTECODE is the compiled bytecode used for deploying new contracts. + public final static String BYTECODE = "0x608060405234801561001057600080fd5b5061265a806100206000396000f3fe608060405234801561001057600080fd5b50600436106101e1576000357c0100000000000000000000000000000000000000000000000000000000900480637fcaf66611610116578063c2b12a73116100b4578063da359dc81161008e578063da359dc814610666578063e30081a014610696578063e673eb32146106c6578063fba1a1c3146106f6576101e1565b8063c2b12a73146105d6578063c577796114610606578063d2282dc514610636576101e1565b80639a19a953116100f05780639a19a95314610516578063a0709e1914610546578063a53b1c1e14610576578063b7d5df31146105a6576101e1565b80637fcaf66614610486578063822cba69146104b657806386114cea146104e6576101e1565b806322722302116101835780635119655d1161015d5780635119655d146103c65780635be6b37e146103f65780636aa482fc146104265780637173b69514610456576101e1565b806322722302146103365780632766a755146103665780634d5ee6da14610396576101e1565b806316c105e2116101bf57806316c105e2146102765780631774e646146102a65780631c9352e2146102d65780631e26fd3314610306576101e1565b80630477988a146101e6578063118a971814610216578063151f547114610246575b600080fd5b61020060048036036101fb9190810190611599565b610726565b60405161020d9190611f01565b60405180910390f35b610230600480360361022b919081019061118d565b61072d565b60405161023d9190611ca6565b60405180910390f35b610260600480360361025b9190810190611123565b61073a565b60405161026d9190611c69565b60405180910390f35b610290600480360361028b9190810190611238565b610747565b60405161029d9190611d05565b60405180910390f35b6102c060048036036102bb919081019061163d565b61074e565b6040516102cd9190611f6d565b60405180910390f35b6102f060048036036102eb91908101906115eb565b610755565b6040516102fd9190611f37565b60405180910390f35b610320600480360361031b91908101906113cf565b61075c565b60405161032d9190611de5565b60405180910390f35b610350600480360361034b91908101906112a2565b610763565b60405161035d9190611d42565b60405180910390f35b610380600480360361037b9190810190611365565b61076a565b60405161038d9190611da8565b60405180910390f35b6103b060048036036103ab91908101906111b6565b610777565b6040516103bd9190611cc1565b60405180910390f35b6103e060048036036103db91908101906111f7565b61077e565b6040516103ed9190611ce3565b60405180910390f35b610410600480360361040b919081019061114c565b61078b565b60405161041d9190611c84565b60405180910390f35b610440600480360361043b9190810190611279565b610792565b60405161044d9190611d27565b60405180910390f35b610470600480360361046b91908101906112e3565b61079f565b60405161047d9190611d64565b60405180910390f35b6104a0600480360361049b9190810190611558565b6107ac565b6040516104ad9190611edf565b60405180910390f35b6104d060048036036104cb9190810190611614565b6107b3565b6040516104dd9190611f52565b60405180910390f35b61050060048036036104fb919081019061148b565b6107ba565b60405161050d9190611e58565b60405180910390f35b610530600480360361052b919081019061152f565b6107c1565b60405161053d9190611ec4565b60405180910390f35b610560600480360361055b919081019061138e565b6107c8565b60405161056d9190611dc3565b60405180910390f35b610590600480360361058b91908101906114b4565b6107cf565b60405161059d9190611e73565b60405180910390f35b6105c060048036036105bb91908101906114dd565b6107d6565b6040516105cd9190611e8e565b60405180910390f35b6105f060048036036105eb9190810190611421565b6107dd565b6040516105fd9190611e1b565b60405180910390f35b610620600480360361061b9190810190611324565b6107e4565b60405161062d9190611d86565b60405180910390f35b610650600480360361064b91908101906115c2565b6107eb565b60405161065d9190611f1c565b60405180910390f35b610680600480360361067b919081019061144a565b6107f2565b60405161068d9190611e36565b60405180910390f35b6106b060048036036106ab91908101906110fa565b6107f9565b6040516106bd9190611c4e565b60405180910390f35b6106e060048036036106db9190810190611506565b610800565b6040516106ed9190611ea9565b60405180910390f35b610710600480360361070b91908101906113f8565b610807565b60405161071d9190611e00565b60405180910390f35b6000919050565b61073561080e565b919050565b610742610830565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b610772610852565b919050565b6060919050565b610786610874565b919050565b6060919050565b61079a61089b565b919050565b6107a76108bd565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108835790505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108cc5790505090565b60006108f082356124f2565b905092915050565b600082601f830112151561090b57600080fd5b600261091e61091982611fb5565b611f88565b9150818385602084028201111561093457600080fd5b60005b83811015610964578161094a88826108e4565b845260208401935060208301925050600181019050610937565b5050505092915050565b600082601f830112151561098157600080fd5b813561099461098f82611fd7565b611f88565b915081818352602084019350602081019050838560208402820111156109b957600080fd5b60005b838110156109e957816109cf88826108e4565b8452602084019350602083019250506001810190506109bc565b5050505092915050565b600082601f8301121515610a0657600080fd5b6002610a19610a1482611fff565b611f88565b91508183856020840282011115610a2f57600080fd5b60005b83811015610a5f5781610a458882610e9e565b845260208401935060208301925050600181019050610a32565b5050505092915050565b600082601f8301121515610a7c57600080fd5b8135610a8f610a8a82612021565b611f88565b91508181835260208401935060208101905083856020840282011115610ab457600080fd5b60005b83811015610ae45781610aca8882610e9e565b845260208401935060208301925050600181019050610ab7565b5050505092915050565b600082601f8301121515610b0157600080fd5b6002610b14610b0f82612049565b611f88565b9150818360005b83811015610b4b5781358601610b318882610eda565b845260208401935060208301925050600181019050610b1b565b5050505092915050565b600082601f8301121515610b6857600080fd5b8135610b7b610b768261206b565b611f88565b9150818183526020840193506020810190508360005b83811015610bc15781358601610ba78882610eda565b845260208401935060208301925050600181019050610b91565b5050505092915050565b600082601f8301121515610bde57600080fd5b6002610bf1610bec82612093565b611f88565b91508183856020840282011115610c0757600080fd5b60005b83811015610c375781610c1d8882610f9a565b845260208401935060208301925050600181019050610c0a565b5050505092915050565b600082601f8301121515610c5457600080fd5b8135610c67610c62826120b5565b611f88565b91508181835260208401935060208101905083856020840282011115610c8c57600080fd5b60005b83811015610cbc5781610ca28882610f9a565b845260208401935060208301925050600181019050610c8f565b5050505092915050565b600082601f8301121515610cd957600080fd5b6002610cec610ce7826120dd565b611f88565b9150818360005b83811015610d235781358601610d098882610fea565b845260208401935060208301925050600181019050610cf3565b5050505092915050565b600082601f8301121515610d4057600080fd5b8135610d53610d4e826120ff565b611f88565b9150818183526020840193506020810190508360005b83811015610d995781358601610d7f8882610fea565b845260208401935060208301925050600181019050610d69565b5050505092915050565b600082601f8301121515610db657600080fd5b6002610dc9610dc482612127565b611f88565b91508183856020840282011115610ddf57600080fd5b60005b83811015610e0f5781610df588826110aa565b845260208401935060208301925050600181019050610de2565b5050505092915050565b600082601f8301121515610e2c57600080fd5b8135610e3f610e3a82612149565b611f88565b91508181835260208401935060208101905083856020840282011115610e6457600080fd5b60005b83811015610e945781610e7a88826110aa565b845260208401935060208301925050600181019050610e67565b5050505092915050565b6000610eaa8235612504565b905092915050565b6000610ebe8235612510565b905092915050565b6000610ed2823561253c565b905092915050565b600082601f8301121515610eed57600080fd5b8135610f00610efb82612171565b611f88565b91508082526020830160208301858383011115610f1c57600080fd5b610f278382846125cd565b50505092915050565b600082601f8301121515610f4357600080fd5b8135610f56610f518261219d565b611f88565b91508082526020830160208301858383011115610f7257600080fd5b610f7d8382846125cd565b50505092915050565b6000610f928235612546565b905092915050565b6000610fa68235612553565b905092915050565b6000610fba823561255d565b905092915050565b6000610fce823561256a565b905092915050565b6000610fe28235612577565b905092915050565b600082601f8301121515610ffd57600080fd5b813561101061100b826121c9565b611f88565b9150808252602083016020830185838301111561102c57600080fd5b6110378382846125cd565b50505092915050565b600082601f830112151561105357600080fd5b8135611066611061826121f5565b611f88565b9150808252602083016020830185838301111561108257600080fd5b61108d8382846125cd565b50505092915050565b60006110a28235612584565b905092915050565b60006110b68235612592565b905092915050565b60006110ca823561259c565b905092915050565b60006110de82356125ac565b905092915050565b60006110f282356125c0565b905092915050565b60006020828403121561110c57600080fd5b600061111a848285016108e4565b91505092915050565b60006040828403121561113557600080fd5b6000611143848285016108f8565b91505092915050565b60006020828403121561115e57600080fd5b600082013567ffffffffffffffff81111561117857600080fd5b6111848482850161096e565b91505092915050565b60006040828403121561119f57600080fd5b60006111ad848285016109f3565b91505092915050565b6000602082840312156111c857600080fd5b600082013567ffffffffffffffff8111156111e257600080fd5b6111ee84828501610a69565b91505092915050565b60006020828403121561120957600080fd5b600082013567ffffffffffffffff81111561122357600080fd5b61122f84828501610aee565b91505092915050565b60006020828403121561124a57600080fd5b600082013567ffffffffffffffff81111561126457600080fd5b61127084828501610b55565b91505092915050565b60006040828403121561128b57600080fd5b600061129984828501610bcb565b91505092915050565b6000602082840312156112b457600080fd5b600082013567ffffffffffffffff8111156112ce57600080fd5b6112da84828501610c41565b91505092915050565b6000602082840312156112f557600080fd5b600082013567ffffffffffffffff81111561130f57600080fd5b61131b84828501610cc6565b91505092915050565b60006020828403121561133657600080fd5b600082013567ffffffffffffffff81111561135057600080fd5b61135c84828501610d2d565b91505092915050565b60006040828403121561137757600080fd5b600061138584828501610da3565b91505092915050565b6000602082840312156113a057600080fd5b600082013567ffffffffffffffff8111156113ba57600080fd5b6113c684828501610e19565b91505092915050565b6000602082840312156113e157600080fd5b60006113ef84828501610e9e565b91505092915050565b60006020828403121561140a57600080fd5b600061141884828501610eb2565b91505092915050565b60006020828403121561143357600080fd5b600061144184828501610ec6565b91505092915050565b60006020828403121561145c57600080fd5b600082013567ffffffffffffffff81111561147657600080fd5b61148284828501610f30565b91505092915050565b60006020828403121561149d57600080fd5b60006114ab84828501610f86565b91505092915050565b6000602082840312156114c657600080fd5b60006114d484828501610f9a565b91505092915050565b6000602082840312156114ef57600080fd5b60006114fd84828501610fae565b91505092915050565b60006020828403121561151857600080fd5b600061152684828501610fc2565b91505092915050565b60006020828403121561154157600080fd5b600061154f84828501610fd6565b91505092915050565b60006020828403121561156a57600080fd5b600082013567ffffffffffffffff81111561158457600080fd5b61159084828501611040565b91505092915050565b6000602082840312156115ab57600080fd5b60006115b984828501611096565b91505092915050565b6000602082840312156115d457600080fd5b60006115e2848285016110aa565b91505092915050565b6000602082840312156115fd57600080fd5b600061160b848285016110be565b91505092915050565b60006020828403121561162657600080fd5b6000611634848285016110d2565b91505092915050565b60006020828403121561164f57600080fd5b600061165d848285016110e6565b91505092915050565b61166f816123f7565b82525050565b61167e816122ab565b61168782612221565b60005b828110156116b95761169d858351611666565b6116a68261235b565b915060208501945060018101905061168a565b5050505050565b60006116cb826122b6565b8084526020840193506116dd8361222b565b60005b8281101561170f576116f3868351611666565b6116fc82612368565b91506020860195506001810190506116e0565b50849250505092915050565b611724816122c1565b61172d82612238565b60005b8281101561175f57611743858351611ab3565b61174c82612375565b9150602085019450600181019050611730565b5050505050565b6000611771826122cc565b80845260208401935061178383612242565b60005b828110156117b557611799868351611ab3565b6117a282612382565b9150602086019550600181019050611786565b50849250505092915050565b60006117cc826122d7565b836020820285016117dc8561224f565b60005b848110156118155783830388526117f7838351611b16565b92506118028261238f565b91506020880197506001810190506117df565b508196508694505050505092915050565b6000611831826122e2565b8084526020840193508360208202850161184a85612259565b60005b84811015611883578383038852611865838351611b16565b92506118708261239c565b915060208801975060018101905061184d565b508196508694505050505092915050565b61189d816122ed565b6118a682612266565b60005b828110156118d8576118bc858351611b5b565b6118c5826123a9565b91506020850194506001810190506118a9565b5050505050565b60006118ea826122f8565b8084526020840193506118fc83612270565b60005b8281101561192e57611912868351611b5b565b61191b826123b6565b91506020860195506001810190506118ff565b50849250505092915050565b600061194582612303565b836020820285016119558561227d565b60005b8481101561198e578383038852611970838351611bcd565b925061197b826123c3565b9150602088019750600181019050611958565b508196508694505050505092915050565b60006119aa8261230e565b808452602084019350836020820285016119c385612287565b60005b848110156119fc5783830388526119de838351611bcd565b92506119e9826123d0565b91506020880197506001810190506119c6565b508196508694505050505092915050565b611a1681612319565b611a1f82612294565b60005b82811015611a5157611a35858351611c12565b611a3e826123dd565b9150602085019450600181019050611a22565b5050505050565b6000611a6382612324565b808452602084019350611a758361229e565b60005b82811015611aa757611a8b868351611c12565b611a94826123ea565b9150602086019550600181019050611a78565b50849250505092915050565b611abc81612409565b82525050565b611acb81612415565b82525050565b611ada81612441565b82525050565b6000611aeb8261233a565b808452611aff8160208601602086016125dc565b611b088161260f565b602085010191505092915050565b6000611b218261232f565b808452611b358160208601602086016125dc565b611b3e8161260f565b602085010191505092915050565b611b558161244b565b82525050565b611b6481612458565b82525050565b611b7381612462565b82525050565b611b828161246f565b82525050565b611b918161247c565b82525050565b6000611ba282612350565b808452611bb68160208601602086016125dc565b611bbf8161260f565b602085010191505092915050565b6000611bd882612345565b808452611bec8160208601602086016125dc565b611bf58161260f565b602085010191505092915050565b611c0c81612489565b82525050565b611c1b816124b7565b82525050565b611c2a816124c1565b82525050565b611c39816124d1565b82525050565b611c48816124e5565b82525050565b6000602082019050611c636000830184611666565b92915050565b6000604082019050611c7e6000830184611675565b92915050565b60006020820190508181036000830152611c9e81846116c0565b905092915050565b6000604082019050611cbb600083018461171b565b92915050565b60006020820190508181036000830152611cdb8184611766565b905092915050565b60006020820190508181036000830152611cfd81846117c1565b905092915050565b60006020820190508181036000830152611d1f8184611826565b905092915050565b6000604082019050611d3c6000830184611894565b92915050565b60006020820190508181036000830152611d5c81846118df565b905092915050565b60006020820190508181036000830152611d7e818461193a565b905092915050565b60006020820190508181036000830152611da0818461199f565b905092915050565b6000604082019050611dbd6000830184611a0d565b92915050565b60006020820190508181036000830152611ddd8184611a58565b905092915050565b6000602082019050611dfa6000830184611ab3565b92915050565b6000602082019050611e156000830184611ac2565b92915050565b6000602082019050611e306000830184611ad1565b92915050565b60006020820190508181036000830152611e508184611ae0565b905092915050565b6000602082019050611e6d6000830184611b4c565b92915050565b6000602082019050611e886000830184611b5b565b92915050565b6000602082019050611ea36000830184611b6a565b92915050565b6000602082019050611ebe6000830184611b79565b92915050565b6000602082019050611ed96000830184611b88565b92915050565b60006020820190508181036000830152611ef98184611b97565b905092915050565b6000602082019050611f166000830184611c03565b92915050565b6000602082019050611f316000830184611c12565b92915050565b6000602082019050611f4c6000830184611c21565b92915050565b6000602082019050611f676000830184611c30565b92915050565b6000602082019050611f826000830184611c3f565b92915050565b6000604051905081810181811067ffffffffffffffff82111715611fab57600080fd5b8060405250919050565b600067ffffffffffffffff821115611fcc57600080fd5b602082029050919050565b600067ffffffffffffffff821115611fee57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561201657600080fd5b602082029050919050565b600067ffffffffffffffff82111561203857600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561206057600080fd5b602082029050919050565b600067ffffffffffffffff82111561208257600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120aa57600080fd5b602082029050919050565b600067ffffffffffffffff8211156120cc57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120f457600080fd5b602082029050919050565b600067ffffffffffffffff82111561211657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561213e57600080fd5b602082029050919050565b600067ffffffffffffffff82111561216057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561218857600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121b457600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121e057600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561220c57600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600061240282612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60006124fd82612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156125fa5780820151818401526020810190506125df565b83811115612609576000848401525b50505050565b6000601f19601f830116905091905056fea265627a7a723058206fe37171cf1b10ebd291cfdca61d67e7fc3c208795e999c833c42a14d86cf00d6c6578706572696d656e74616cf50037"; + + // deploy deploys a new Ethereum contract, binding an instance of Test to it. + public static Test deploy(TransactOpts auth, EthereumClient client) throws Exception { + Interfaces args = Geth.newInterfaces(0); + String bytecode = BYTECODE; + + + return new Test(Geth.deployContract(auth, ABI, Geth.decodeFromHex(bytecode), client, args)); + } + + // Internal constructor used by contract deployment. + private Test(BoundContract deployment) { + this.Address = deployment.getAddress(); + this.Deployer = deployment.getDeployer(); + this.Contract = deployment; + } + + + // Ethereum address where this contract is located at. + public final Address Address; + + // Ethereum transaction in which this contract was deployed (if known!). + public final Transaction Deployer; + + // Contract instance bound to a blockchain address. + private final BoundContract Contract; + + // Creates a new instance of Test, bound to a specific deployed contract. + public Test(Address address, EthereumClient client) throws Exception { + this(Geth.bindContract(address, ABI, client)); + } + + + + + // setAddress is a paid mutator transaction binding the contract method 0xe30081a0. + // + // Solidity: function setAddress(address a) returns(address) + public Transaction setAddress(TransactOpts opts, Address a) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setAddress(a);args.set(0,arg0); + + return this.Contract.transact(opts, "setAddress" , args); + } + + // setAddressArray is a paid mutator transaction binding the contract method 0x151f5471. + // + // Solidity: function setAddressArray(address[2] a_a) returns(address[2]) + public Transaction setAddressArray(TransactOpts opts, Addresses a_a) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setAddresses(a_a);args.set(0,arg0); + + return this.Contract.transact(opts, "setAddressArray" , args); + } + + // setAddressList is a paid mutator transaction binding the contract method 0x5be6b37e. + // + // Solidity: function setAddressList(address[] a_l) returns(address[]) + public Transaction setAddressList(TransactOpts opts, Addresses a_l) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setAddresses(a_l);args.set(0,arg0); + + return this.Contract.transact(opts, "setAddressList" , args); + } + + // setBool is a paid mutator transaction binding the contract method 0x1e26fd33. + // + // Solidity: function setBool(bool b) returns(bool) + public Transaction setBool(TransactOpts opts, boolean b) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBool(b);args.set(0,arg0); + + return this.Contract.transact(opts, "setBool" , args); + } + + // setBoolArray is a paid mutator transaction binding the contract method 0x118a9718. + // + // Solidity: function setBoolArray(bool[2] b_a) returns(bool[2]) + public Transaction setBoolArray(TransactOpts opts, Bools b_a) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBools(b_a);args.set(0,arg0); + + return this.Contract.transact(opts, "setBoolArray" , args); + } + + // setBoolList is a paid mutator transaction binding the contract method 0x4d5ee6da. + // + // Solidity: function setBoolList(bool[] b_l) returns(bool[]) + public Transaction setBoolList(TransactOpts opts, Bools b_l) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBools(b_l);args.set(0,arg0); + + return this.Contract.transact(opts, "setBoolList" , args); + } + + // setBytes is a paid mutator transaction binding the contract method 0xda359dc8. + // + // Solidity: function setBytes(bytes bs) returns(bytes) + public Transaction setBytes(TransactOpts opts, byte[] bs) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBinary(bs);args.set(0,arg0); + + return this.Contract.transact(opts, "setBytes" , args); + } + + // setBytes1 is a paid mutator transaction binding the contract method 0xfba1a1c3. + // + // Solidity: function setBytes1(bytes1 b1) returns(bytes1) + public Transaction setBytes1(TransactOpts opts, byte[] b1) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBinary(b1);args.set(0,arg0); + + return this.Contract.transact(opts, "setBytes1" , args); + } + + // setBytes32 is a paid mutator transaction binding the contract method 0xc2b12a73. + // + // Solidity: function setBytes32(bytes32 b32) returns(bytes32) + public Transaction setBytes32(TransactOpts opts, byte[] b32) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBinary(b32);args.set(0,arg0); + + return this.Contract.transact(opts, "setBytes32" , args); + } + + // setBytesArray is a paid mutator transaction binding the contract method 0x5119655d. + // + // Solidity: function setBytesArray(bytes[2] bs_a) returns(bytes[2]) + public Transaction setBytesArray(TransactOpts opts, Binaries bs_a) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBinaries(bs_a);args.set(0,arg0); + + return this.Contract.transact(opts, "setBytesArray" , args); + } + + // setBytesList is a paid mutator transaction binding the contract method 0x16c105e2. + // + // Solidity: function setBytesList(bytes[] bs_l) returns(bytes[]) + public Transaction setBytesList(TransactOpts opts, Binaries bs_l) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBinaries(bs_l);args.set(0,arg0); + + return this.Contract.transact(opts, "setBytesList" , args); + } + + // setInt16 is a paid mutator transaction binding the contract method 0x86114cea. + // + // Solidity: function setInt16(int16 i16) returns(int16) + public Transaction setInt16(TransactOpts opts, short i16) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setInt16(i16);args.set(0,arg0); + + return this.Contract.transact(opts, "setInt16" , args); + } + + // setInt256 is a paid mutator transaction binding the contract method 0xa53b1c1e. + // + // Solidity: function setInt256(int256 i256) returns(int256) + public Transaction setInt256(TransactOpts opts, BigInt i256) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBigInt(i256);args.set(0,arg0); + + return this.Contract.transact(opts, "setInt256" , args); + } + + // setInt256Array is a paid mutator transaction binding the contract method 0x6aa482fc. + // + // Solidity: function setInt256Array(int256[2] i256_a) returns(int256[2]) + public Transaction setInt256Array(TransactOpts opts, BigInts i256_a) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBigInts(i256_a);args.set(0,arg0); + + return this.Contract.transact(opts, "setInt256Array" , args); + } + + // setInt256List is a paid mutator transaction binding the contract method 0x22722302. + // + // Solidity: function setInt256List(int256[] i256_l) returns(int256[]) + public Transaction setInt256List(TransactOpts opts, BigInts i256_l) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBigInts(i256_l);args.set(0,arg0); + + return this.Contract.transact(opts, "setInt256List" , args); + } + + // setInt32 is a paid mutator transaction binding the contract method 0xb7d5df31. + // + // Solidity: function setInt32(int32 i32) returns(int32) + public Transaction setInt32(TransactOpts opts, int i32) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setInt32(i32);args.set(0,arg0); + + return this.Contract.transact(opts, "setInt32" , args); + } + + // setInt64 is a paid mutator transaction binding the contract method 0xe673eb32. + // + // Solidity: function setInt64(int64 i64) returns(int64) + public Transaction setInt64(TransactOpts opts, long i64) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setInt64(i64);args.set(0,arg0); + + return this.Contract.transact(opts, "setInt64" , args); + } + + // setInt8 is a paid mutator transaction binding the contract method 0x9a19a953. + // + // Solidity: function setInt8(int8 i8) returns(int8) + public Transaction setInt8(TransactOpts opts, byte i8) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setInt8(i8);args.set(0,arg0); + + return this.Contract.transact(opts, "setInt8" , args); + } + + // setString is a paid mutator transaction binding the contract method 0x7fcaf666. + // + // Solidity: function setString(string s) returns(string) + public Transaction setString(TransactOpts opts, String s) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setString(s);args.set(0,arg0); + + return this.Contract.transact(opts, "setString" , args); + } + + // setStringArray is a paid mutator transaction binding the contract method 0x7173b695. + // + // Solidity: function setStringArray(string[2] s_a) returns(string[2]) + public Transaction setStringArray(TransactOpts opts, Strings s_a) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setStrings(s_a);args.set(0,arg0); + + return this.Contract.transact(opts, "setStringArray" , args); + } + + // setStringList is a paid mutator transaction binding the contract method 0xc5777961. + // + // Solidity: function setStringList(string[] s_l) returns(string[]) + public Transaction setStringList(TransactOpts opts, Strings s_l) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setStrings(s_l);args.set(0,arg0); + + return this.Contract.transact(opts, "setStringList" , args); + } + + // setUint16 is a paid mutator transaction binding the contract method 0x0477988a. + // + // Solidity: function setUint16(uint16 u16) returns(uint16) + public Transaction setUint16(TransactOpts opts, BigInt u16) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setUint16(u16);args.set(0,arg0); + + return this.Contract.transact(opts, "setUint16" , args); + } + + // setUint256 is a paid mutator transaction binding the contract method 0xd2282dc5. + // + // Solidity: function setUint256(uint256 u256) returns(uint256) + public Transaction setUint256(TransactOpts opts, BigInt u256) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBigInt(u256);args.set(0,arg0); + + return this.Contract.transact(opts, "setUint256" , args); + } + + // setUint256Array is a paid mutator transaction binding the contract method 0x2766a755. + // + // Solidity: function setUint256Array(uint256[2] u256_a) returns(uint256[2]) + public Transaction setUint256Array(TransactOpts opts, BigInts u256_a) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBigInts(u256_a);args.set(0,arg0); + + return this.Contract.transact(opts, "setUint256Array" , args); + } + + // setUint256List is a paid mutator transaction binding the contract method 0xa0709e19. + // + // Solidity: function setUint256List(uint256[] u256_l) returns(uint256[]) + public Transaction setUint256List(TransactOpts opts, BigInts u256_l) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setBigInts(u256_l);args.set(0,arg0); + + return this.Contract.transact(opts, "setUint256List" , args); + } + + // setUint32 is a paid mutator transaction binding the contract method 0x1c9352e2. + // + // Solidity: function setUint32(uint32 u32) returns(uint32) + public Transaction setUint32(TransactOpts opts, BigInt u32) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setUint32(u32);args.set(0,arg0); + + return this.Contract.transact(opts, "setUint32" , args); + } + + // setUint64 is a paid mutator transaction binding the contract method 0x822cba69. + // + // Solidity: function setUint64(uint64 u64) returns(uint64) + public Transaction setUint64(TransactOpts opts, BigInt u64) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setUint64(u64);args.set(0,arg0); + + return this.Contract.transact(opts, "setUint64" , args); + } + + // setUint8 is a paid mutator transaction binding the contract method 0x1774e646. + // + // Solidity: function setUint8(uint8 u8) returns(uint8) + public Transaction setUint8(TransactOpts opts, BigInt u8) throws Exception { + Interfaces args = Geth.newInterfaces(1); + Interface arg0 = Geth.newInterface();arg0.setUint8(u8);args.set(0,arg0); + + return this.Contract.transact(opts, "setUint8" , args); + } + +} + +`, + }, + } + for i, c := range cases { + binding, err := Bind([]string{c.name}, []string{c.abi}, []string{c.bytecode}, nil, "bindtest", LangJava, nil, nil) + if err != nil { + t.Fatalf("test %d: failed to generate binding: %v", i, err) + } + if binding != c.expected { + t.Fatalf("test %d: generated binding mismatch, has %s, want %s", i, binding, c.expected) + } + } +} diff --git a/accounts/abi/bind/template.go b/accounts/abi/bind/template.go index 7bfe62cf099b..c96dd1b9955d 100644 --- a/accounts/abi/bind/template.go +++ b/accounts/abi/bind/template.go @@ -16,12 +16,14 @@ package bind -import "github.com/nebulaai/nbai-node/accounts/abi" +import "github.com/ethereum/go-ethereum/accounts/abi" // tmplData is the data structure required to fill the binding template. type tmplData struct { Package string // Name of the package to place the generated file in Contracts map[string]*tmplContract // List of contracts to generate into this file + Libraries map[string]string // Map the bytecode's link pattern to the library name + Structs map[string]*tmplStruct // Contract struct type definitions } // tmplContract contains the data needed to generate an individual contract binding. @@ -29,10 +31,13 @@ type tmplContract struct { Type string // Type name of the main contract binding InputABI string // JSON ABI used as the input to generate the binding from InputBin string // Optional EVM bytecode used to denetare deploy code from + FuncSigs map[string]string // Optional map: string signature -> 4-byte signature Constructor abi.Method // Contract constructor for deploy parametrization Calls map[string]*tmplMethod // Contract calls that only read state data Transacts map[string]*tmplMethod // Contract calls that write state data Events map[string]*tmplEvent // Contract events accessors + Libraries map[string]string // Same as tmplData, but filtered to only keep what the contract needs + Library bool // Indicator whether the contract is a library } // tmplMethod is a wrapper around an abi.Method that contains a few preprocessed @@ -49,6 +54,21 @@ type tmplEvent struct { Normalized abi.Event // Normalized version of the parsed fields } +// tmplField is a wrapper around a struct field with binding language +// struct type definition and relative filed name. +type tmplField struct { + Type string // Field type representation depends on target binding language + Name string // Field name converted from the raw user-defined field name + SolKind abi.Type // Raw abi type information +} + +// tmplStruct is a wrapper around an abi.tuple contains a auto-generated +// struct name. +type tmplStruct struct { + Name string // Auto-generated struct name(before solidity v0.5.11) or raw name. + Fields []*tmplField // Struct fields definition depends on the binding language. +} + // tmplSource is language to template mapping containing all the supported // programming languages the package can generate to. var tmplSource = map[Lang]string{ @@ -68,12 +88,12 @@ import ( "math/big" "strings" - ethereum "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/accounts/abi" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/event" + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" ) // Reference imports to suppress errors if they are not otherwise used. @@ -88,20 +108,41 @@ var ( _ = event.NewSubscription ) +{{$structs := .Structs}} +{{range $structs}} + // {{.Name}} is an auto generated low-level Go binding around an user-defined struct. + type {{.Name}} struct { + {{range $field := .Fields}} + {{$field.Name}} {{$field.Type}}{{end}} + } +{{end}} + {{range $contract := .Contracts}} // {{.Type}}ABI is the input ABI used to generate the binding from. const {{.Type}}ABI = "{{.InputABI}}" + {{if $contract.FuncSigs}} + // {{.Type}}FuncSigs maps the 4-byte function signature to its string representation. + var {{.Type}}FuncSigs = map[string]string{ + {{range $strsig, $binsig := .FuncSigs}}"{{$binsig}}": "{{$strsig}}", + {{end}} + } + {{end}} + {{if .InputBin}} // {{.Type}}Bin is the compiled bytecode used for deploying new contracts. - const {{.Type}}Bin = ` + "`" + `{{.InputBin}}` + "`" + ` + var {{.Type}}Bin = "0x{{.InputBin}}" // Deploy{{.Type}} deploys a new Ethereum contract, binding an instance of {{.Type}} to it. - func Deploy{{.Type}}(auth *bind.TransactOpts, backend bind.ContractBackend {{range .Constructor.Inputs}}, {{.Name}} {{bindtype .Type}}{{end}}) (common.Address, *types.Transaction, *{{.Type}}, error) { + func Deploy{{.Type}}(auth *bind.TransactOpts, backend bind.ContractBackend {{range .Constructor.Inputs}}, {{.Name}} {{bindtype .Type $structs}}{{end}}) (common.Address, *types.Transaction, *{{.Type}}, error) { parsed, err := abi.JSON(strings.NewReader({{.Type}}ABI)) if err != nil { return common.Address{}, nil, nil, err } + {{range $pattern, $name := .Libraries}} + {{decapitalise $name}}Addr, _, _, _ := Deploy{{capitalise $name}}(auth, backend) + {{$contract.Type}}Bin = strings.Replace({{$contract.Type}}Bin, "__${{$pattern}}$__", {{decapitalise $name}}Addr.String()[2:], -1) + {{end}} address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex({{.Type}}Bin), backend {{range .Constructor.Inputs}}, {{.Name}}{{end}}) if err != nil { return common.Address{}, nil, nil, err @@ -114,7 +155,7 @@ var ( type {{.Type}} struct { {{.Type}}Caller // Read-only binding to the contract {{.Type}}Transactor // Write-only binding to the contract - {{.Type}}Filterer // Log filterer for contract events + {{.Type}}Filterer // Log filterer for contract events } // {{.Type}}Caller is an auto generated read-only Go binding around an Ethereum contract. @@ -253,15 +294,15 @@ var ( } {{range .Calls}} - // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.Id}}. + // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.ID}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}Caller) {{.Normalized.Name}}(opts *bind.CallOpts {{range .Normalized.Inputs}}, {{.Name}} {{bindtype .Type}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type}};{{end}} },{{else}}{{range .Normalized.Outputs}}{{bindtype .Type}},{{end}}{{end}} error) { + // Solidity: {{formatmethod .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}Caller) {{.Normalized.Name}}(opts *bind.CallOpts {{range .Normalized.Inputs}}, {{.Name}} {{bindtype .Type $structs}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs}};{{end}} },{{else}}{{range .Normalized.Outputs}}{{bindtype .Type $structs}},{{end}}{{end}} error) { {{if .Structured}}ret := new(struct{ - {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type}} + {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs}} {{end}} }){{else}}var ( - {{range $i, $_ := .Normalized.Outputs}}ret{{$i}} = new({{bindtype .Type}}) + {{range $i, $_ := .Normalized.Outputs}}ret{{$i}} = new({{bindtype .Type $structs}}) {{end}} ){{end}} out := {{if .Structured}}ret{{else}}{{if eq (len .Normalized.Outputs) 1}}ret0{{else}}&[]interface{}{ @@ -272,40 +313,40 @@ var ( return {{if .Structured}}*ret,{{else}}{{range $i, $_ := .Normalized.Outputs}}*ret{{$i}},{{end}}{{end}} err } - // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.Id}}. + // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.ID}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}Session) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type}};{{end}} }, {{else}} {{range .Normalized.Outputs}}{{bindtype .Type}},{{end}} {{end}} error) { + // Solidity: {{formatmethod .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}Session) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs}};{{end}} }, {{else}} {{range .Normalized.Outputs}}{{bindtype .Type $structs}},{{end}} {{end}} error) { return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.CallOpts {{range .Normalized.Inputs}}, {{.Name}}{{end}}) } - // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.Id}}. + // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.ID}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}CallerSession) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type}};{{end}} }, {{else}} {{range .Normalized.Outputs}}{{bindtype .Type}},{{end}} {{end}} error) { + // Solidity: {{formatmethod .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}CallerSession) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs}} {{end}}) ({{if .Structured}}struct{ {{range .Normalized.Outputs}}{{.Name}} {{bindtype .Type $structs}};{{end}} }, {{else}} {{range .Normalized.Outputs}}{{bindtype .Type $structs}},{{end}} {{end}} error) { return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.CallOpts {{range .Normalized.Inputs}}, {{.Name}}{{end}}) } {{end}} {{range .Transacts}} - // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.Id}}. + // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.ID}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}Transactor) {{.Normalized.Name}}(opts *bind.TransactOpts {{range .Normalized.Inputs}}, {{.Name}} {{bindtype .Type}} {{end}}) (*types.Transaction, error) { + // Solidity: {{formatmethod .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}Transactor) {{.Normalized.Name}}(opts *bind.TransactOpts {{range .Normalized.Inputs}}, {{.Name}} {{bindtype .Type $structs}} {{end}}) (*types.Transaction, error) { return _{{$contract.Type}}.contract.Transact(opts, "{{.Original.Name}}" {{range .Normalized.Inputs}}, {{.Name}}{{end}}) } - // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.Id}}. + // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.ID}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}Session) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type}} {{end}}) (*types.Transaction, error) { + // Solidity: {{formatmethod .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}Session) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs}} {{end}}) (*types.Transaction, error) { return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.TransactOpts {{range $i, $_ := .Normalized.Inputs}}, {{.Name}}{{end}}) } - // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.Id}}. + // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.ID}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}TransactorSession) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type}} {{end}}) (*types.Transaction, error) { + // Solidity: {{formatmethod .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}TransactorSession) {{.Normalized.Name}}({{range $i, $_ := .Normalized.Inputs}}{{if ne $i 0}},{{end}} {{.Name}} {{bindtype .Type $structs}} {{end}}) (*types.Transaction, error) { return _{{$contract.Type}}.Contract.{{.Normalized.Name}}(&_{{$contract.Type}}.TransactOpts {{range $i, $_ := .Normalized.Inputs}}, {{.Name}}{{end}}) } {{end}} @@ -377,14 +418,14 @@ var ( // {{$contract.Type}}{{.Normalized.Name}} represents a {{.Normalized.Name}} event raised by the {{$contract.Type}} contract. type {{$contract.Type}}{{.Normalized.Name}} struct { {{range .Normalized.Inputs}} - {{capitalise .Name}} {{if .Indexed}}{{bindtopictype .Type}}{{else}}{{bindtype .Type}}{{end}}; {{end}} + {{capitalise .Name}} {{if .Indexed}}{{bindtopictype .Type $structs}}{{else}}{{bindtype .Type $structs}}{{end}}; {{end}} Raw types.Log // Blockchain specific contextual infos } - // Filter{{.Normalized.Name}} is a free log retrieval operation binding the contract event 0x{{printf "%x" .Original.Id}}. + // Filter{{.Normalized.Name}} is a free log retrieval operation binding the contract event 0x{{printf "%x" .Original.ID}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}Filterer) Filter{{.Normalized.Name}}(opts *bind.FilterOpts{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}} []{{bindtype .Type}}{{end}}{{end}}) (*{{$contract.Type}}{{.Normalized.Name}}Iterator, error) { + // Solidity: {{formatevent .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}Filterer) Filter{{.Normalized.Name}}(opts *bind.FilterOpts{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}} []{{bindtype .Type $structs}}{{end}}{{end}}) (*{{$contract.Type}}{{.Normalized.Name}}Iterator, error) { {{range .Normalized.Inputs}} {{if .Indexed}}var {{.Name}}Rule []interface{} for _, {{.Name}}Item := range {{.Name}} { @@ -398,10 +439,10 @@ var ( return &{{$contract.Type}}{{.Normalized.Name}}Iterator{contract: _{{$contract.Type}}.contract, event: "{{.Original.Name}}", logs: logs, sub: sub}, nil } - // Watch{{.Normalized.Name}} is a free log subscription operation binding the contract event 0x{{printf "%x" .Original.Id}}. + // Watch{{.Normalized.Name}} is a free log subscription operation binding the contract event 0x{{printf "%x" .Original.ID}}. // - // Solidity: {{.Original.String}} - func (_{{$contract.Type}} *{{$contract.Type}}Filterer) Watch{{.Normalized.Name}}(opts *bind.WatchOpts, sink chan<- *{{$contract.Type}}{{.Normalized.Name}}{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}} []{{bindtype .Type}}{{end}}{{end}}) (event.Subscription, error) { + // Solidity: {{formatevent .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}Filterer) Watch{{.Normalized.Name}}(opts *bind.WatchOpts, sink chan<- *{{$contract.Type}}{{.Normalized.Name}}{{range .Normalized.Inputs}}{{if .Indexed}}, {{.Name}} []{{bindtype .Type $structs}}{{end}}{{end}}) (event.Subscription, error) { {{range .Normalized.Inputs}} {{if .Indexed}}var {{.Name}}Rule []interface{} for _, {{.Name}}Item := range {{.Name}} { @@ -439,6 +480,18 @@ var ( } }), nil } + + // Parse{{.Normalized.Name}} is a log parse operation binding the contract event 0x{{printf "%x" .Original.ID}}. + // + // Solidity: {{formatevent .Original $structs}} + func (_{{$contract.Type}} *{{$contract.Type}}Filterer) Parse{{.Normalized.Name}}(log types.Log) (*{{$contract.Type}}{{.Normalized.Name}}, error) { + event := new({{$contract.Type}}{{.Normalized.Name}}) + if err := _{{$contract.Type}}.contract.UnpackLog(event, "{{.Original.Name}}", log); err != nil { + return nil, err + } + return event, nil + } + {{end}} {{end}} ` @@ -452,95 +505,112 @@ const tmplSourceJava = ` package {{.Package}}; import org.ethereum.geth.*; -import org.ethereum.geth.internal.*; +import java.util.*; +{{$structs := .Structs}} {{range $contract := .Contracts}} - public class {{.Type}} { - // ABI is the input ABI used to generate the binding from. - public final static String ABI = "{{.InputABI}}"; - - {{if .InputBin}} - // BYTECODE is the compiled bytecode used for deploying new contracts. - public final static byte[] BYTECODE = "{{.InputBin}}".getBytes(); - - // deploy deploys a new Ethereum contract, binding an instance of {{.Type}} to it. - public static {{.Type}} deploy(TransactOpts auth, EthereumClient client{{range .Constructor.Inputs}}, {{bindtype .Type}} {{.Name}}{{end}}) throws Exception { - Interfaces args = Geth.newInterfaces({{(len .Constructor.Inputs)}}); - {{range $index, $element := .Constructor.Inputs}} - args.set({{$index}}, Geth.newInterface()); args.get({{$index}}).set{{namedtype (bindtype .Type) .Type}}({{.Name}}); - {{end}} - return new {{.Type}}(Geth.deployContract(auth, ABI, BYTECODE, client, args)); - } - - // Internal constructor used by contract deployment. - private {{.Type}}(BoundContract deployment) { - this.Address = deployment.getAddress(); - this.Deployer = deployment.getDeployer(); - this.Contract = deployment; - } +{{if not .Library}}public {{end}}class {{.Type}} { + // ABI is the input ABI used to generate the binding from. + public final static String ABI = "{{.InputABI}}"; + {{if $contract.FuncSigs}} + // {{.Type}}FuncSigs maps the 4-byte function signature to its string representation. + public final static Map {{.Type}}FuncSigs; + static { + Hashtable temp = new Hashtable(); + {{range $strsig, $binsig := .FuncSigs}}temp.put("{{$binsig}}", "{{$strsig}}"); + {{end}} + {{.Type}}FuncSigs = Collections.unmodifiableMap(temp); + } + {{end}} + {{if .InputBin}} + // BYTECODE is the compiled bytecode used for deploying new contracts. + public final static String BYTECODE = "0x{{.InputBin}}"; + + // deploy deploys a new Ethereum contract, binding an instance of {{.Type}} to it. + public static {{.Type}} deploy(TransactOpts auth, EthereumClient client{{range .Constructor.Inputs}}, {{bindtype .Type $structs}} {{.Name}}{{end}}) throws Exception { + Interfaces args = Geth.newInterfaces({{(len .Constructor.Inputs)}}); + String bytecode = BYTECODE; + {{if .Libraries}} + + // "link" contract to dependent libraries by deploying them first. + {{range $pattern, $name := .Libraries}} + {{capitalise $name}} {{decapitalise $name}}Inst = {{capitalise $name}}.deploy(auth, client); + bytecode = bytecode.replace("__${{$pattern}}$__", {{decapitalise $name}}Inst.Address.getHex().substring(2)); {{end}} + {{end}} + {{range $index, $element := .Constructor.Inputs}}Interface arg{{$index}} = Geth.newInterface();arg{{$index}}.set{{namedtype (bindtype .Type $structs) .Type}}({{.Name}});args.set({{$index}},arg{{$index}}); + {{end}} + return new {{.Type}}(Geth.deployContract(auth, ABI, Geth.decodeFromHex(bytecode), client, args)); + } - // Ethereum address where this contract is located at. - public final Address Address; + // Internal constructor used by contract deployment. + private {{.Type}}(BoundContract deployment) { + this.Address = deployment.getAddress(); + this.Deployer = deployment.getDeployer(); + this.Contract = deployment; + } + {{end}} - // Ethereum transaction in which this contract was deployed (if known!). - public final Transaction Deployer; + // Ethereum address where this contract is located at. + public final Address Address; - // Contract instance bound to a blockchain address. - private final BoundContract Contract; + // Ethereum transaction in which this contract was deployed (if known!). + public final Transaction Deployer; - // Creates a new instance of {{.Type}}, bound to a specific deployed contract. - public {{.Type}}(Address address, EthereumClient client) throws Exception { - this(Geth.bindContract(address, ABI, client)); - } + // Contract instance bound to a blockchain address. + private final BoundContract Contract; - {{range .Calls}} - {{if gt (len .Normalized.Outputs) 1}} - // {{capitalise .Normalized.Name}}Results is the output of a call to {{.Normalized.Name}}. - public class {{capitalise .Normalized.Name}}Results { - {{range $index, $item := .Normalized.Outputs}}public {{bindtype .Type}} {{if ne .Name ""}}{{.Name}}{{else}}Return{{$index}}{{end}}; - {{end}} - } - {{end}} + // Creates a new instance of {{.Type}}, bound to a specific deployed contract. + public {{.Type}}(Address address, EthereumClient client) throws Exception { + this(Geth.bindContract(address, ABI, client)); + } - // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.Id}}. - // - // Solidity: {{.Original.String}} - public {{if gt (len .Normalized.Outputs) 1}}{{capitalise .Normalized.Name}}Results{{else}}{{range .Normalized.Outputs}}{{bindtype .Type}}{{end}}{{end}} {{.Normalized.Name}}(CallOpts opts{{range .Normalized.Inputs}}, {{bindtype .Type}} {{.Name}}{{end}}) throws Exception { - Interfaces args = Geth.newInterfaces({{(len .Normalized.Inputs)}}); - {{range $index, $item := .Normalized.Inputs}}args.set({{$index}}, Geth.newInterface()); args.get({{$index}}).set{{namedtype (bindtype .Type) .Type}}({{.Name}}); - {{end}} + {{range .Calls}} + {{if gt (len .Normalized.Outputs) 1}} + // {{capitalise .Normalized.Name}}Results is the output of a call to {{.Normalized.Name}}. + public class {{capitalise .Normalized.Name}}Results { + {{range $index, $item := .Normalized.Outputs}}public {{bindtype .Type $structs}} {{if ne .Name ""}}{{.Name}}{{else}}Return{{$index}}{{end}}; + {{end}} + } + {{end}} - Interfaces results = Geth.newInterfaces({{(len .Normalized.Outputs)}}); - {{range $index, $item := .Normalized.Outputs}}Interface result{{$index}} = Geth.newInterface(); result{{$index}}.setDefault{{namedtype (bindtype .Type) .Type}}(); results.set({{$index}}, result{{$index}}); - {{end}} + // {{.Normalized.Name}} is a free data retrieval call binding the contract method 0x{{printf "%x" .Original.ID}}. + // + // Solidity: {{.Original.String}} + public {{if gt (len .Normalized.Outputs) 1}}{{capitalise .Normalized.Name}}Results{{else}}{{range .Normalized.Outputs}}{{bindtype .Type $structs}}{{end}}{{end}} {{.Normalized.Name}}(CallOpts opts{{range .Normalized.Inputs}}, {{bindtype .Type $structs}} {{.Name}}{{end}}) throws Exception { + Interfaces args = Geth.newInterfaces({{(len .Normalized.Inputs)}}); + {{range $index, $item := .Normalized.Inputs}}Interface arg{{$index}} = Geth.newInterface();arg{{$index}}.set{{namedtype (bindtype .Type $structs) .Type}}({{.Name}});args.set({{$index}},arg{{$index}}); + {{end}} - if (opts == null) { - opts = Geth.newCallOpts(); - } - this.Contract.call(opts, results, "{{.Original.Name}}", args); - {{if gt (len .Normalized.Outputs) 1}} - {{capitalise .Normalized.Name}}Results result = new {{capitalise .Normalized.Name}}Results(); - {{range $index, $item := .Normalized.Outputs}}result.{{if ne .Name ""}}{{.Name}}{{else}}Return{{$index}}{{end}} = results.get({{$index}}).get{{namedtype (bindtype .Type) .Type}}(); - {{end}} - return result; - {{else}}{{range .Normalized.Outputs}}return results.get(0).get{{namedtype (bindtype .Type) .Type}}();{{end}} - {{end}} - } + Interfaces results = Geth.newInterfaces({{(len .Normalized.Outputs)}}); + {{range $index, $item := .Normalized.Outputs}}Interface result{{$index}} = Geth.newInterface(); result{{$index}}.setDefault{{namedtype (bindtype .Type $structs) .Type}}(); results.set({{$index}}, result{{$index}}); {{end}} - {{range .Transacts}} - // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.Id}}. - // - // Solidity: {{.Original.String}} - public Transaction {{.Normalized.Name}}(TransactOpts opts{{range .Normalized.Inputs}}, {{bindtype .Type}} {{.Name}}{{end}}) throws Exception { - Interfaces args = Geth.newInterfaces({{(len .Normalized.Inputs)}}); - {{range $index, $item := .Normalized.Inputs}}args.set({{$index}}, Geth.newInterface()); args.get({{$index}}).set{{namedtype (bindtype .Type) .Type}}({{.Name}}); - {{end}} + if (opts == null) { + opts = Geth.newCallOpts(); + } + this.Contract.call(opts, results, "{{.Original.Name}}", args); + {{if gt (len .Normalized.Outputs) 1}} + {{capitalise .Normalized.Name}}Results result = new {{capitalise .Normalized.Name}}Results(); + {{range $index, $item := .Normalized.Outputs}}result.{{if ne .Name ""}}{{.Name}}{{else}}Return{{$index}}{{end}} = results.get({{$index}}).get{{namedtype (bindtype .Type $structs) .Type}}(); + {{end}} + return result; + {{else}}{{range .Normalized.Outputs}}return results.get(0).get{{namedtype (bindtype .Type $structs) .Type}}();{{end}} + {{end}} + } + {{end}} - return this.Contract.transact(opts, "{{.Original.Name}}" , args); - } + {{range .Transacts}} + // {{.Normalized.Name}} is a paid mutator transaction binding the contract method 0x{{printf "%x" .Original.ID}}. + // + // Solidity: {{.Original.String}} + public Transaction {{.Normalized.Name}}(TransactOpts opts{{range .Normalized.Inputs}}, {{bindtype .Type $structs}} {{.Name}}{{end}}) throws Exception { + Interfaces args = Geth.newInterfaces({{(len .Normalized.Inputs)}}); + {{range $index, $item := .Normalized.Inputs}}Interface arg{{$index}} = Geth.newInterface();arg{{$index}}.set{{namedtype (bindtype .Type $structs) .Type}}({{.Name}});args.set({{$index}},arg{{$index}}); {{end}} + return this.Contract.transact(opts, "{{.Original.Name}}" , args); } + {{end}} +} {{end}} ` diff --git a/accounts/abi/bind/topics.go b/accounts/abi/bind/topics.go index e3969c26f14b..e27fa5484204 100644 --- a/accounts/abi/bind/topics.go +++ b/accounts/abi/bind/topics.go @@ -17,14 +17,15 @@ package bind import ( + "encoding/binary" "errors" "fmt" "math/big" "reflect" - "github.com/nebulaai/nbai-node/accounts/abi" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" ) // makeTopics converts a filter query argument list into a filter topic set. @@ -79,13 +80,19 @@ func makeTopics(query ...[]interface{}) ([][]common.Hash, error) { copy(topic[:], hash[:]) default: + // todo(rjl493456442) according solidity documentation, indexed event + // parameters that are not value types i.e. arrays and structs are not + // stored directly but instead a keccak256-hash of an encoding is stored. + // + // We only convert stringS and bytes to hash, still need to deal with + // array(both fixed-size and dynamic-size) and struct. + // Attempt to generate the topic from funky types val := reflect.ValueOf(rule) - switch { + // static byte array case val.Kind() == reflect.Array && reflect.TypeOf(rule).Elem().Kind() == reflect.Uint8: - reflect.Copy(reflect.ValueOf(topic[common.HashLength-val.Len():]), val) - + reflect.Copy(reflect.ValueOf(topic[:val.Len()]), val) default: return nil, fmt.Errorf("unsupported indexed type: %T", rule) } @@ -159,6 +166,7 @@ func parseTopics(out interface{}, fields abi.Arguments, topics []common.Hash) er default: // Ran out of plain primitive types, try custom types + switch field.Type() { case reflectHash: // Also covers all dynamic types field.Set(reflect.ValueOf(topics[0])) @@ -175,9 +183,9 @@ func parseTopics(out interface{}, fields abi.Arguments, topics []common.Hash) er default: // Ran out of custom types, try the crazies switch { + // static byte array case arg.Type.T == abi.FixedBytesTy: - reflect.Copy(field, reflect.ValueOf(topics[0][common.HashLength-arg.Type.Size:])) - + reflect.Copy(field, reflect.ValueOf(topics[0][:arg.Type.Size])) default: return fmt.Errorf("unsupported indexed type: %v", arg.Type) } @@ -187,3 +195,50 @@ func parseTopics(out interface{}, fields abi.Arguments, topics []common.Hash) er } return nil } + +// parseTopicsIntoMap converts the indexed topic field-value pairs into map key-value pairs +func parseTopicsIntoMap(out map[string]interface{}, fields abi.Arguments, topics []common.Hash) error { + // Sanity check that the fields and topics match up + if len(fields) != len(topics) { + return errors.New("topic/field count mismatch") + } + // Iterate over all the fields and reconstruct them from topics + for _, arg := range fields { + if !arg.Indexed { + return errors.New("non-indexed field in topic reconstruction") + } + + switch arg.Type.T { + case abi.BoolTy: + out[arg.Name] = topics[0][common.HashLength-1] == 1 + case abi.IntTy, abi.UintTy: + num := new(big.Int).SetBytes(topics[0][:]) + out[arg.Name] = num + case abi.AddressTy: + var addr common.Address + copy(addr[:], topics[0][common.HashLength-common.AddressLength:]) + out[arg.Name] = addr + case abi.HashTy: + out[arg.Name] = topics[0] + case abi.FixedBytesTy: + out[arg.Name] = topics[0][:] + case abi.StringTy, abi.BytesTy, abi.SliceTy, abi.ArrayTy: + // Array types (including strings and bytes) have their keccak256 hashes stored in the topic- not a hash + // whose bytes can be decoded to the actual value- so the best we can do is retrieve that hash + out[arg.Name] = topics[0] + case abi.FunctionTy: + if garbage := binary.BigEndian.Uint64(topics[0][0:8]); garbage != 0 { + return fmt.Errorf("bind: got improperly encoded function type, got %v", topics[0].Bytes()) + } + var tmp [24]byte + copy(tmp[:], topics[0][8:32]) + out[arg.Name] = tmp + default: // Not handling tuples + return fmt.Errorf("unsupported indexed type: %v", arg.Type) + } + + topics = topics[1:] + } + + return nil +} diff --git a/accounts/abi/bind/topics_test.go b/accounts/abi/bind/topics_test.go new file mode 100644 index 000000000000..f18e2d1bd25e --- /dev/null +++ b/accounts/abi/bind/topics_test.go @@ -0,0 +1,103 @@ +// Copyright 2019 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 bind + +import ( + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" +) + +func TestMakeTopics(t *testing.T) { + type args struct { + query [][]interface{} + } + tests := []struct { + name string + args args + want [][]common.Hash + wantErr bool + }{ + { + "support fixed byte types, right padded to 32 bytes", + args{[][]interface{}{{[5]byte{1, 2, 3, 4, 5}}}}, + [][]common.Hash{{common.Hash{1, 2, 3, 4, 5}}}, + false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := makeTopics(tt.args.query...) + if (err != nil) != tt.wantErr { + t.Errorf("makeTopics() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.want) { + t.Errorf("makeTopics() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestParseTopics(t *testing.T) { + type bytesStruct struct { + StaticBytes [5]byte + } + bytesType, _ := abi.NewType("bytes5", "", nil) + type args struct { + createObj func() interface{} + resultObj func() interface{} + fields abi.Arguments + topics []common.Hash + } + tests := []struct { + name string + args args + wantErr bool + }{ + { + name: "support fixed byte types, right padded to 32 bytes", + args: args{ + createObj: func() interface{} { return &bytesStruct{} }, + resultObj: func() interface{} { return &bytesStruct{StaticBytes: [5]byte{1, 2, 3, 4, 5}} }, + fields: abi.Arguments{abi.Argument{ + Name: "staticBytes", + Type: bytesType, + Indexed: true, + }}, + topics: []common.Hash{ + {1, 2, 3, 4, 5}, + }, + }, + wantErr: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + createObj := tt.args.createObj() + if err := parseTopics(createObj, tt.args.fields, tt.args.topics); (err != nil) != tt.wantErr { + t.Errorf("parseTopics() error = %v, wantErr %v", err, tt.wantErr) + } + resultObj := tt.args.resultObj() + if !reflect.DeepEqual(createObj, resultObj) { + t.Errorf("parseTopics() = %v, want %v", createObj, resultObj) + } + }) + } +} diff --git a/accounts/abi/bind/util.go b/accounts/abi/bind/util.go index 096a4c4f1506..d129993ca12f 100644 --- a/accounts/abi/bind/util.go +++ b/accounts/abi/bind/util.go @@ -21,9 +21,9 @@ import ( "fmt" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" ) // WaitMined waits for tx to be mined on the blockchain. diff --git a/accounts/abi/bind/util_test.go b/accounts/abi/bind/util_test.go index b13322431964..e0141f46e06f 100644 --- a/accounts/abi/bind/util_test.go +++ b/accounts/abi/bind/util_test.go @@ -22,12 +22,12 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/accounts/abi/bind/backends" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" ) var testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") @@ -56,8 +56,10 @@ func TestWaitDeployed(t *testing.T) { backend := backends.NewSimulatedBackend( core.GenesisAlloc{ crypto.PubkeyToAddress(testKey.PublicKey): {Balance: big.NewInt(10000000000)}, - }, 10000000, + }, + 10000000, ) + defer backend.Close() // Create the transaction. tx := types.NewContractCreation(0, big.NewInt(0), test.gas, big.NewInt(1), common.FromHex(test.code)) diff --git a/accounts/abi/event.go b/accounts/abi/event.go index 759bce7a496d..f1474813afe4 100644 --- a/accounts/abi/event.go +++ b/accounts/abi/event.go @@ -20,15 +20,26 @@ import ( "fmt" "strings" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" ) // Event is an event potentially triggered by the EVM's LOG mechanism. The Event // holds type information (inputs) about the yielded output. Anonymous events // don't get the signature canonical representation as the first LOG topic. type Event struct { - Name string + // Name is the event name used for internal representation. It's derived from + // the raw name and a suffix will be added in the case of a event overload. + // + // e.g. + // There are two events have same name: + // * foo(int,int) + // * foo(uint,uint) + // The event name of the first one wll be resolved as foo while the second one + // will be resolved as foo0. + Name string + // RawName is the raw event name parsed from ABI. + RawName string Anonymous bool Inputs Arguments } @@ -41,17 +52,26 @@ func (e Event) String() string { inputs[i] = fmt.Sprintf("%v indexed %v", input.Type, input.Name) } } - return fmt.Sprintf("event %v(%v)", e.Name, strings.Join(inputs, ", ")) + return fmt.Sprintf("event %v(%v)", e.RawName, strings.Join(inputs, ", ")) } -// Id returns the canonical representation of the event's signature used by the -// abi definition to identify event names and types. -func (e Event) Id() common.Hash { +// Sig returns the event string signature according to the ABI spec. +// +// Example +// +// event foo(uint32 a, int b) = "foo(uint32,int256)" +// +// Please note that "int" is substitute for its canonical representation "int256" +func (e Event) Sig() string { types := make([]string, len(e.Inputs)) - i := 0 - for _, input := range e.Inputs { + for i, input := range e.Inputs { types[i] = input.Type.String() - i++ } - return common.BytesToHash(crypto.Keccak256([]byte(fmt.Sprintf("%v(%v)", e.Name, strings.Join(types, ","))))) + return fmt.Sprintf("%v(%v)", e.RawName, strings.Join(types, ",")) +} + +// ID returns the canonical representation of the event's signature used by the +// abi definition to identify event names and types. +func (e Event) ID() common.Hash { + return common.BytesToHash(crypto.Keccak256([]byte(e.Sig()))) } diff --git a/accounts/abi/event_test.go b/accounts/abi/event_test.go index 4b448784cee3..090b9217dbdd 100644 --- a/accounts/abi/event_test.go +++ b/accounts/abi/event_test.go @@ -25,8 +25,8 @@ import ( "strings" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -104,8 +104,8 @@ func TestEventId(t *testing.T) { } for name, event := range abi.Events { - if event.Id() != test.expectations[name] { - t.Errorf("expected id to be %x, got %x", test.expectations[name], event.Id()) + if event.ID() != test.expectations[name] { + t.Errorf("expected id to be %x, got %x", test.expectations[name], event.ID()) } } } @@ -173,7 +173,7 @@ func TestEventTupleUnpack(t *testing.T) { type EventTransferWithTag struct { // this is valid because `value` is not exportable, // so value is only unmarshalled into `Value1`. - value *big.Int + value *big.Int //lint:ignore U1000 unused field is part of test Value1 *big.Int `abi:"value"` } @@ -354,40 +354,6 @@ func unpackTestEventData(dest interface{}, hexData string, jsonEvent []byte, ass return a.Unpack(dest, "e", data) } -/* -Taken from -https://github.com/ethereum/go-ethereum/pull/15568 -*/ - -type testResult struct { - Values [2]*big.Int - Value1 *big.Int - Value2 *big.Int -} - -type testCase struct { - definition string - want testResult -} - -func (tc testCase) encoded(intType, arrayType Type) []byte { - var b bytes.Buffer - if tc.want.Value1 != nil { - val, _ := intType.pack(reflect.ValueOf(tc.want.Value1)) - b.Write(val) - } - - if !reflect.DeepEqual(tc.want.Values, [2]*big.Int{nil, nil}) { - val, _ := arrayType.pack(reflect.ValueOf(tc.want.Values)) - b.Write(val) - } - if tc.want.Value2 != nil { - val, _ := intType.pack(reflect.ValueOf(tc.want.Value2)) - b.Write(val) - } - return b.Bytes() -} - // TestEventUnpackIndexed verifies that indexed field will be skipped by event decoder. func TestEventUnpackIndexed(t *testing.T) { definition := `[{"name": "test", "type": "event", "inputs": [{"indexed": true, "name":"value1", "type":"uint8"},{"indexed": false, "name":"value2", "type":"uint8"}]}]` diff --git a/accounts/abi/method.go b/accounts/abi/method.go index efa550c9a07d..7da2e18fc61a 100644 --- a/accounts/abi/method.go +++ b/accounts/abi/method.go @@ -20,19 +20,30 @@ import ( "fmt" "strings" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/crypto" ) // Method represents a callable given a `Name` and whether the method is a constant. // If the method is `Const` no transaction needs to be created for this // particular Method call. It can easily be simulated using a local VM. // For example a `Balance()` method only needs to retrieve something -// from the storage and therefor requires no Tx to be send to the +// from the storage and therefore requires no Tx to be send to the // network. A method such as `Transact` does require a Tx and thus will -// be flagged `true`. +// be flagged `false`. // Input specifies the required input parameters for this gives method. type Method struct { - Name string + // Name is the method name used for internal representation. It's derived from + // the raw name and a suffix will be added in the case of a function overload. + // + // e.g. + // There are two functions have same name: + // * foo(int,int) + // * foo(uint,uint) + // The method name of the first one will be resolved as foo while the second one + // will be resolved as foo0. + Name string + // RawName is the raw method name parsed from ABI. + RawName string Const bool Inputs Arguments Outputs Arguments @@ -42,7 +53,7 @@ type Method struct { // // Example // -// function foo(uint32 a, int b) = "foo(uint32,int256)" +// function foo(uint32 a, int b) = "foo(uint32,int256)" // // Please note that "int" is substitute for its canonical representation "int256" func (method Method) Sig() string { @@ -50,7 +61,7 @@ func (method Method) Sig() string { for i, input := range method.Inputs { types[i] = input.Type.String() } - return fmt.Sprintf("%v(%v)", method.Name, strings.Join(types, ",")) + return fmt.Sprintf("%v(%v)", method.RawName, strings.Join(types, ",")) } func (method Method) String() string { @@ -69,9 +80,11 @@ func (method Method) String() string { if method.Const { constant = "constant " } - return fmt.Sprintf("function %v(%v) %sreturns(%v)", method.Name, strings.Join(inputs, ", "), constant, strings.Join(outputs, ", ")) + return fmt.Sprintf("function %v(%v) %sreturns(%v)", method.RawName, strings.Join(inputs, ", "), constant, strings.Join(outputs, ", ")) } -func (method Method) Id() []byte { +// ID returns the canonical representation of the method's signature used by the +// abi definition to identify method names and types. +func (method Method) ID() []byte { return crypto.Keccak256([]byte(method.Sig()))[:4] } diff --git a/accounts/abi/method_test.go b/accounts/abi/method_test.go index a98f1cd31f7d..3ffdb702b35b 100644 --- a/accounts/abi/method_test.go +++ b/accounts/abi/method_test.go @@ -1,4 +1,4 @@ -// Copyright 2016 The go-ethereum Authors +// Copyright 2018 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 @@ -23,9 +23,13 @@ import ( const methoddata = ` [ - { "type" : "function", "name" : "balance", "constant" : true }, - { "type" : "function", "name" : "send", "constant" : false, "inputs" : [ { "name" : "amount", "type" : "uint256" } ] }, - { "type" : "function", "name" : "transfer", "constant" : false, "inputs" : [ { "name" : "from", "type" : "address" }, { "name" : "to", "type" : "address" }, { "name" : "value", "type" : "uint256" } ], "outputs" : [ { "name" : "success", "type" : "bool" } ] } + {"type": "function", "name": "balance", "constant": true }, + {"type": "function", "name": "send", "constant": false, "inputs": [{ "name": "amount", "type": "uint256" }]}, + {"type": "function", "name": "transfer", "constant": false, "inputs": [{"name": "from", "type": "address"}, {"name": "to", "type": "address"}, {"name": "value", "type": "uint256"}], "outputs": [{"name": "success", "type": "bool"}]}, + {"constant":false,"inputs":[{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"a","type":"tuple"}],"name":"tuple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}, + {"constant":false,"inputs":[{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"a","type":"tuple[]"}],"name":"tupleSlice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}, + {"constant":false,"inputs":[{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"a","type":"tuple[5]"}],"name":"tupleArray","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}, + {"constant":false,"inputs":[{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"a","type":"tuple[5][]"}],"name":"complexTuple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"} ]` func TestMethodString(t *testing.T) { @@ -45,6 +49,22 @@ func TestMethodString(t *testing.T) { method: "transfer", expectation: "function transfer(address from, address to, uint256 value) returns(bool success)", }, + { + method: "tuple", + expectation: "function tuple((uint256,uint256) a) returns()", + }, + { + method: "tupleArray", + expectation: "function tupleArray((uint256,uint256)[5] a) returns()", + }, + { + method: "tupleSlice", + expectation: "function tupleSlice((uint256,uint256)[] a) returns()", + }, + { + method: "complexTuple", + expectation: "function complexTuple((uint256,uint256)[5][] a) returns()", + }, } abi, err := JSON(strings.NewReader(methoddata)) @@ -59,3 +79,50 @@ func TestMethodString(t *testing.T) { } } } + +func TestMethodSig(t *testing.T) { + var cases = []struct { + method string + expect string + }{ + { + method: "balance", + expect: "balance()", + }, + { + method: "send", + expect: "send(uint256)", + }, + { + method: "transfer", + expect: "transfer(address,address,uint256)", + }, + { + method: "tuple", + expect: "tuple((uint256,uint256))", + }, + { + method: "tupleArray", + expect: "tupleArray((uint256,uint256)[5])", + }, + { + method: "tupleSlice", + expect: "tupleSlice((uint256,uint256)[])", + }, + { + method: "complexTuple", + expect: "complexTuple((uint256,uint256)[5][])", + }, + } + abi, err := JSON(strings.NewReader(methoddata)) + if err != nil { + t.Fatal(err) + } + + for _, test := range cases { + got := abi.Methods[test.method].Sig() + if got != test.expect { + t.Errorf("expected string to be %s, got %s", test.expect, got) + } + } +} diff --git a/accounts/abi/numbers.go b/accounts/abi/numbers.go index 7b84f46ab8a9..4d706846dacd 100644 --- a/accounts/abi/numbers.go +++ b/accounts/abi/numbers.go @@ -20,8 +20,8 @@ import ( "math/big" "reflect" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" ) var ( diff --git a/accounts/abi/pack.go b/accounts/abi/pack.go index 962fb1e756cf..dd1c9a5df84f 100644 --- a/accounts/abi/pack.go +++ b/accounts/abi/pack.go @@ -20,8 +20,8 @@ import ( "math/big" "reflect" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" ) // packBytesSlice packs the given bytes as [L, V] as the canonical representation @@ -73,7 +73,7 @@ func packNum(value reflect.Value) []byte { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: return U256(big.NewInt(value.Int())) case reflect.Ptr: - return U256(value.Interface().(*big.Int)) + return U256(new(big.Int).Set(value.Interface().(*big.Int))) default: panic("abi: fatal error") } diff --git a/accounts/abi/pack_test.go b/accounts/abi/pack_test.go index 9e8428a29c5a..cf649b480734 100644 --- a/accounts/abi/pack_test.go +++ b/accounts/abi/pack_test.go @@ -24,7 +24,7 @@ import ( "strings" "testing" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) func TestPack(t *testing.T) { @@ -613,7 +613,7 @@ func TestPack(t *testing.T) { "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), // tuple[1].A[1] }, } { - typ, err := NewType(test.typ, test.components) + typ, err := NewType(test.typ, "", test.components) if err != nil { t.Fatalf("%v failed. Unexpected parse error: %v", i, err) } @@ -634,7 +634,7 @@ func TestMethodPack(t *testing.T) { t.Fatal(err) } - sig := abi.Methods["slice"].Id() + sig := abi.Methods["slice"].ID() sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) @@ -648,7 +648,7 @@ func TestMethodPack(t *testing.T) { } var addrA, addrB = common.Address{1}, common.Address{2} - sig = abi.Methods["sliceAddress"].Id() + sig = abi.Methods["sliceAddress"].ID() sig = append(sig, common.LeftPadBytes([]byte{32}, 32)...) sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) sig = append(sig, common.LeftPadBytes(addrA[:], 32)...) @@ -663,7 +663,7 @@ func TestMethodPack(t *testing.T) { } var addrC, addrD = common.Address{3}, common.Address{4} - sig = abi.Methods["sliceMultiAddress"].Id() + sig = abi.Methods["sliceMultiAddress"].ID() sig = append(sig, common.LeftPadBytes([]byte{64}, 32)...) sig = append(sig, common.LeftPadBytes([]byte{160}, 32)...) sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) @@ -681,7 +681,7 @@ func TestMethodPack(t *testing.T) { t.Errorf("expected %x got %x", sig, packed) } - sig = abi.Methods["slice256"].Id() + sig = abi.Methods["slice256"].ID() sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) @@ -695,7 +695,7 @@ func TestMethodPack(t *testing.T) { } a := [2][2]*big.Int{{big.NewInt(1), big.NewInt(1)}, {big.NewInt(2), big.NewInt(0)}} - sig = abi.Methods["nestedArray"].Id() + sig = abi.Methods["nestedArray"].ID() sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) sig = append(sig, common.LeftPadBytes([]byte{1}, 32)...) sig = append(sig, common.LeftPadBytes([]byte{2}, 32)...) @@ -712,7 +712,7 @@ func TestMethodPack(t *testing.T) { t.Errorf("expected %x got %x", sig, packed) } - sig = abi.Methods["nestedArray2"].Id() + sig = abi.Methods["nestedArray2"].ID() sig = append(sig, common.LeftPadBytes([]byte{0x20}, 32)...) sig = append(sig, common.LeftPadBytes([]byte{0x40}, 32)...) sig = append(sig, common.LeftPadBytes([]byte{0x80}, 32)...) @@ -728,7 +728,7 @@ func TestMethodPack(t *testing.T) { t.Errorf("expected %x got %x", sig, packed) } - sig = abi.Methods["nestedSlice"].Id() + sig = abi.Methods["nestedSlice"].ID() sig = append(sig, common.LeftPadBytes([]byte{0x20}, 32)...) sig = append(sig, common.LeftPadBytes([]byte{0x02}, 32)...) sig = append(sig, common.LeftPadBytes([]byte{0x40}, 32)...) diff --git a/accounts/abi/reflect.go b/accounts/abi/reflect.go index 1b0bb0049625..73ca8fa2bd7d 100644 --- a/accounts/abi/reflect.go +++ b/accounts/abi/reflect.go @@ -31,6 +31,14 @@ func indirect(v reflect.Value) reflect.Value { return v } +// indirectInterfaceOrPtr recursively dereferences the value until value is not interface. +func indirectInterfaceOrPtr(v reflect.Value) reflect.Value { + if (v.Kind() == reflect.Interface || v.Kind() == reflect.Ptr) && v.Elem().IsValid() { + return indirect(v.Elem()) + } + return v +} + // reflectIntKind returns the reflect using the given size and // unsignedness. func reflectIntKindAndType(unsigned bool, size int) (reflect.Kind, reflect.Type) { @@ -74,7 +82,7 @@ func mustArrayToByteSlice(value reflect.Value) reflect.Value { func set(dst, src reflect.Value) error { dstType, srcType := dst.Type(), src.Type() switch { - case dstType.Kind() == reflect.Interface: + case dstType.Kind() == reflect.Interface && dst.Elem().IsValid(): return set(dst.Elem(), src) case dstType.Kind() == reflect.Ptr && dstType.Elem() != derefbigT: return set(dst.Elem(), src) diff --git a/accounts/abi/type.go b/accounts/abi/type.go index 26151dbd3e7e..4792283ee8ef 100644 --- a/accounts/abi/type.go +++ b/accounts/abi/type.go @@ -53,6 +53,7 @@ type Type struct { stringKind string // holds the unparsed string for deriving signatures // Tuple relative fields + TupleRawName string // Raw struct name defined in source code, may be empty. TupleElems []*Type // Type information of all tuple fields TupleRawNames []string // Raw field name of all tuple fields } @@ -63,20 +64,24 @@ var ( ) // NewType creates a new reflection type of abi type given in t. -func NewType(t string, components []ArgumentMarshaling) (typ Type, err error) { +func NewType(t string, internalType string, components []ArgumentMarshaling) (typ Type, err error) { // 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") } - 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, "[") + // Note internalType can be empty here. + subInternal := internalType + if i := strings.LastIndex(internalType, "["); i != -1 { + subInternal = subInternal[:i] + } // recursively embed the type - embeddedType, err := NewType(t[:i], components) + i := strings.LastIndex(t, "[") + embeddedType, err := NewType(t[:i], subInternal, components) if err != nil { return Type{}, err } @@ -92,9 +97,7 @@ func NewType(t string, components []ArgumentMarshaling) (typ Type, err error) { typ.Kind = reflect.Slice typ.Elem = &embeddedType typ.Type = reflect.SliceOf(embeddedType.Type) - if embeddedType.T == TupleTy { - typ.stringKind = embeddedType.stringKind + sliced - } + typ.stringKind = embeddedType.stringKind + sliced } else if len(intz) == 1 { // is a array typ.T = ArrayTy @@ -105,9 +108,7 @@ func NewType(t string, components []ArgumentMarshaling) (typ Type, err error) { return Type{}, fmt.Errorf("abi: error parsing variable size: %v", err) } typ.Type = reflect.ArrayOf(typ.Size, embeddedType.Type) - if embeddedType.T == TupleTy { - typ.stringKind = embeddedType.stringKind + sliced - } + typ.stringKind = embeddedType.stringKind + sliced } else { return Type{}, fmt.Errorf("invalid formatting of array type") } @@ -178,7 +179,7 @@ func NewType(t string, components []ArgumentMarshaling) (typ Type, err error) { ) expression += "(" for idx, c := range components { - cType, err := NewType(c.Type, c.Components) + cType, err := NewType(c.Type, c.InternalType, c.Components) if err != nil { return Type{}, err } @@ -188,6 +189,7 @@ func NewType(t string, components []ArgumentMarshaling) (typ Type, err error) { fields = append(fields, reflect.StructField{ Name: ToCamelCase(c.Name), // reflect.StructOf will panic for any exported field. Type: cType.Type, + Tag: reflect.StructTag("json:\"" + c.Name + "\""), }) elems = append(elems, &cType) names = append(names, c.Name) @@ -203,6 +205,17 @@ func NewType(t string, components []ArgumentMarshaling) (typ Type, err error) { typ.TupleRawNames = names typ.T = TupleTy typ.stringKind = expression + + const structPrefix = "struct " + // After solidity 0.5.10, a new field of abi "internalType" + // is introduced. From that we can obtain the struct name + // user defined in the source code. + if internalType != "" && strings.HasPrefix(internalType, structPrefix) { + // Foo.Bar type definition is not allowed in golang, + // convert the format to FooBar + typ.TupleRawName = strings.Replace(internalType[len(structPrefix):], ".", "", -1) + } + case "function": typ.Kind = reflect.Array typ.T = FunctionTy diff --git a/accounts/abi/type_test.go b/accounts/abi/type_test.go index 9fb68377a011..a2c78dc2e020 100644 --- a/accounts/abi/type_test.go +++ b/accounts/abi/type_test.go @@ -22,7 +22,7 @@ import ( "testing" "github.com/davecgh/go-spew/spew" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) // typeWithoutStringer is a alias for the Type type which simply doesn't implement @@ -95,12 +95,18 @@ func TestTypeRegexp(t *testing.T) { // {"fixed[2]", nil, Type{}}, // {"fixed128x128[]", nil, Type{}}, // {"fixed128x128[2]", nil, Type{}}, - {"tuple", []ArgumentMarshaling{{Name: "a", Type: "int64"}}, Type{Kind: reflect.Struct, T: TupleTy, Type: reflect.TypeOf(struct{ A int64 }{}), stringKind: "(int64)", + {"tuple", []ArgumentMarshaling{{Name: "a", Type: "int64"}}, Type{Kind: reflect.Struct, T: TupleTy, Type: reflect.TypeOf(struct { + A int64 `json:"a"` + }{}), stringKind: "(int64)", TupleElems: []*Type{{Kind: reflect.Int64, T: IntTy, Type: reflect.TypeOf(int64(0)), Size: 64, stringKind: "int64"}}, TupleRawNames: []string{"a"}}}, + {"tuple with long name", []ArgumentMarshaling{{Name: "aTypicalParamName", Type: "int64"}}, Type{Kind: reflect.Struct, T: TupleTy, Type: reflect.TypeOf(struct { + ATypicalParamName int64 `json:"aTypicalParamName"` + }{}), stringKind: "(int64)", + TupleElems: []*Type{{Kind: reflect.Int64, T: IntTy, Type: reflect.TypeOf(int64(0)), Size: 64, stringKind: "int64"}}, TupleRawNames: []string{"aTypicalParamName"}}}, } for _, tt := range tests { - typ, err := NewType(tt.blob, tt.components) + typ, err := NewType(tt.blob, "", tt.components) if err != nil { t.Errorf("type %q: failed to parse type string: %v", tt.blob, err) } @@ -275,7 +281,7 @@ func TestTypeCheck(t *testing.T) { B *big.Int }{{big.NewInt(0), big.NewInt(0)}, {big.NewInt(0), big.NewInt(0)}}, ""}, } { - typ, err := NewType(test.typ, test.components) + typ, err := NewType(test.typ, "", test.components) if err != nil && len(test.err) == 0 { t.Fatal("unexpected parse error:", err) } else if err != nil && len(test.err) != 0 { diff --git a/accounts/abi/unpack.go b/accounts/abi/unpack.go index fcb34768ac76..b2e61d06c416 100644 --- a/accounts/abi/unpack.go +++ b/accounts/abi/unpack.go @@ -22,7 +22,7 @@ import ( "math/big" "reflect" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) var ( @@ -269,7 +269,7 @@ func lengthPrefixPointsTo(index int, output []byte) (start int, length int, err totalSize.Add(totalSize, bigOffsetEnd) totalSize.Add(totalSize, lengthBig) if totalSize.BitLen() > 63 { - return 0, 0, fmt.Errorf("abi length larger than int64: %v", totalSize) + return 0, 0, fmt.Errorf("abi: length larger than int64: %v", totalSize) } if totalSize.Cmp(outputLength) > 0 { diff --git a/accounts/abi/unpack_test.go b/accounts/abi/unpack_test.go index cce4d1a543b8..dfea8db671d8 100644 --- a/accounts/abi/unpack_test.go +++ b/accounts/abi/unpack_test.go @@ -26,7 +26,7 @@ import ( "strings" "testing" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" ) @@ -51,6 +51,7 @@ func (test unpackTest) checkError(err error) error { } var unpackTests = []unpackTest{ + // Bools { def: `[{ "type": "bool" }]`, enc: "0000000000000000000000000000000000000000000000000000000000000001", @@ -73,6 +74,7 @@ var unpackTests = []unpackTest{ want: false, err: "abi: improperly encoded boolean value", }, + // Integers { def: `[{"type": "uint32"}]`, enc: "0000000000000000000000000000000000000000000000000000000000000001", @@ -122,11 +124,13 @@ var unpackTests = []unpackTest{ enc: "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", want: big.NewInt(-1), }, + // Address { def: `[{"type": "address"}]`, enc: "0000000000000000000000000100000000000000000000000000000000000000", want: common.Address{1}, }, + // Bytes { def: `[{"type": "bytes32"}]`, enc: "0100000000000000000000000000000000000000000000000000000000000000", @@ -154,23 +158,39 @@ var unpackTests = []unpackTest{ 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}, }, + // Functions { def: `[{"type": "function"}]`, enc: "0100000000000000000000000000000000000000000000000000000000000000", want: [24]byte{1}, }, - // slices + // Slice and Array { def: `[{"type": "uint8[]"}]`, enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", want: []uint8{1, 2}, }, + { + def: `[{"type": "uint8[]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", + want: []uint8{}, + }, + { + def: `[{"type": "uint256[]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", + want: []*big.Int{}, + }, { 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: "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", + want: [][]uint8{}, + }, { def: `[{"type": "uint8[][]"}]`, enc: "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", @@ -186,11 +206,21 @@ var unpackTests = []unpackTest{ enc: "0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", want: [2][2]uint8{{1, 2}, {1, 2}}, }, + { + def: `[{"type": "uint8[][2]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + want: [2][]uint8{{}, {}}, + }, { def: `[{"type": "uint8[][2]"}]`, enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", want: [2][]uint8{{1}, {1}}, }, + { + def: `[{"type": "uint8[2][]"}]`, + enc: "00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000", + want: [][2]uint8{}, + }, { def: `[{"type": "uint8[2][]"}]`, enc: "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", @@ -420,7 +450,7 @@ func TestUnpack(t *testing.T) { } encb, err := hex.DecodeString(test.enc) if err != nil { - t.Fatalf("invalid hex: %s" + test.enc) + t.Fatalf("invalid hex %s: %v", test.enc, err) } outptr := reflect.New(reflect.TypeOf(test.want)) err = abi.Unpack(outptr.Interface(), "method", encb) @@ -512,6 +542,11 @@ func TestMethodMultiReturn(t *testing.T) { Int *big.Int } + newInterfaceSlice := func(len int) interface{} { + slice := make([]interface{}, len) + return &slice + } + abi, data, expected := methodMultiReturn(require.New(t)) bigint := new(big.Int) var testCases = []struct { @@ -539,6 +574,16 @@ func TestMethodMultiReturn(t *testing.T) { &[2]interface{}{&expected.Int, &expected.String}, "", "Can unpack into an array", + }, { + &[2]interface{}{}, + &[2]interface{}{expected.Int, expected.String}, + "", + "Can unpack into interface array", + }, { + newInterfaceSlice(2), + &[]interface{}{expected.Int, expected.String}, + "", + "Can unpack into interface slice", }, { &[]interface{}{new(int), new(int)}, &[]interface{}{&expected.Int, &expected.String}, @@ -950,25 +995,21 @@ func TestUnpackTuple(t *testing.T) { buff.Write(common.Hex2Bytes("0000000000000000000000000000000000000000000000000000000000000001")) // ret[a] = 1 buff.Write(common.Hex2Bytes("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")) // ret[b] = -1 + // If the result is single tuple, use struct as return value container directly. v := struct { - Ret struct { - A *big.Int - B *big.Int - } - }{Ret: struct { A *big.Int B *big.Int - }{new(big.Int), new(big.Int)}} + }{new(big.Int), new(big.Int)} err = abi.Unpack(&v, "tuple", buff.Bytes()) if err != nil { t.Error(err) } else { - if v.Ret.A.Cmp(big.NewInt(1)) != 0 { - t.Errorf("unexpected value unpacked: want %x, got %x", 1, v.Ret.A) + if v.A.Cmp(big.NewInt(1)) != 0 { + t.Errorf("unexpected value unpacked: want %x, got %x", 1, v.A) } - if v.Ret.B.Cmp(big.NewInt(-1)) != 0 { - t.Errorf("unexpected value unpacked: want %x, got %x", v.Ret.B, -1) + if v.B.Cmp(big.NewInt(-1)) != 0 { + t.Errorf("unexpected value unpacked: want %x, got %x", v.B, -1) } } diff --git a/accounts/accounts.go b/accounts/accounts.go index aba32364178c..bf5190ad98f7 100644 --- a/accounts/accounts.go +++ b/accounts/accounts.go @@ -18,12 +18,14 @@ package accounts import ( + "fmt" "math/big" - ethereum "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/event" + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + "golang.org/x/crypto/sha3" ) // Account represents an Ethereum account located at a specific location defined @@ -33,6 +35,13 @@ type Account struct { URL URL `json:"url"` // Optional resource locator within a backend } +const ( + MimetypeDataWithValidator = "data/validator" + MimetypeTypedData = "data/typed" + MimetypeClique = "application/x-clique-header" + MimetypeTextPlain = "text/plain" +) + // Wallet represents a software or hardware wallet that might contain one or more // accounts (derived from the same seed). type Wallet interface { @@ -83,12 +92,34 @@ type Wallet interface { // opposed to decending into a child path to allow discovering accounts starting // from non zero components. // + // Some hardware wallets switched derivation paths through their evolution, so + // this method supports providing multiple bases to discover old user accounts + // too. Only the last base will be used to derive the next empty account. + // // You can disable automatic account discovery by calling SelfDerive with a nil // chain state reader. - SelfDerive(base DerivationPath, chain ethereum.ChainStateReader) + SelfDerive(bases []DerivationPath, chain ethereum.ChainStateReader) - // SignHash requests the wallet to sign the given hash. + // SignData requests the wallet to sign the hash of the given data + // It looks up the account specified either solely via its address contained within, + // or optionally with the aid of any location metadata from the embedded URL field. // + // If the wallet requires additional authentication to sign the request (e.g. + // a password to decrypt the account, or a PIN code o verify the transaction), + // an AuthNeededError instance will be returned, containing infos for the user + // about which fields or actions are needed. The user may retry by providing + // the needed details via SignDataWithPassphrase, or by other means (e.g. unlock + // the account in a keystore). + SignData(account Account, mimeType string, data []byte) ([]byte, error) + + // SignDataWithPassphrase is identical to SignData, but also takes a password + // NOTE: there's an chance that an erroneous call might mistake the two strings, and + // supply password in the mimetype field, or vice versa. Thus, an implementation + // should never echo the mimetype or return the mimetype in the error-response + SignDataWithPassphrase(account Account, passphrase, mimeType string, data []byte) ([]byte, error) + + // SignText requests the wallet to sign the hash of a given piece of data, prefixed + // by the Ethereum prefix scheme // It looks up the account specified either solely via its address contained within, // or optionally with the aid of any location metadata from the embedded URL field. // @@ -98,7 +129,10 @@ type Wallet interface { // about which fields or actions are needed. The user may retry by providing // the needed details via SignHashWithPassphrase, or by other means (e.g. unlock // the account in a keystore). - SignHash(account Account, hash []byte) ([]byte, error) + SignText(account Account, text []byte) ([]byte, error) + + // SignTextWithPassphrase is identical to Signtext, but also takes a password + SignTextWithPassphrase(account Account, passphrase string, hash []byte) ([]byte, error) // SignTx requests the wallet to sign the given transaction. // @@ -113,18 +147,7 @@ type Wallet interface { // the account in a keystore). SignTx(account Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) - // SignHashWithPassphrase requests the wallet to sign the given hash with the - // given passphrase as extra authentication information. - // - // It looks up the account specified either solely via its address contained within, - // or optionally with the aid of any location metadata from the embedded URL field. - SignHashWithPassphrase(account Account, passphrase string, hash []byte) ([]byte, error) - - // SignTxWithPassphrase requests the wallet to sign the given transaction, with the - // given passphrase as extra authentication information. - // - // It looks up the account specified either solely via its address contained within, - // or optionally with the aid of any location metadata from the embedded URL field. + // SignTxWithPassphrase is identical to SignTx, but also takes a password SignTxWithPassphrase(account Account, passphrase string, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) } @@ -148,6 +171,32 @@ type Backend interface { Subscribe(sink chan<- WalletEvent) event.Subscription } +// TextHash is a helper function that calculates a hash for the given message that can be +// safely used to calculate a signature from. +// +// The hash is calulcated as +// keccak256("\x19Ethereum Signed Message:\n"${message length}${message}). +// +// This gives context to the signed message and prevents signing of transactions. +func TextHash(data []byte) []byte { + hash, _ := TextAndHash(data) + return hash +} + +// TextAndHash is a helper function that calculates a hash for the given message that can be +// safely used to calculate a signature from. +// +// The hash is calulcated as +// keccak256("\x19Ethereum Signed Message:\n"${message length}${message}). +// +// This gives context to the signed message and prevents signing of transactions. +func TextAndHash(data []byte) ([]byte, string) { + msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), string(data)) + hasher := sha3.NewLegacyKeccak256() + hasher.Write([]byte(msg)) + return hasher.Sum(nil), msg +} + // WalletEventType represents the different event types that can be fired by // the wallet subscription subsystem. type WalletEventType int diff --git a/accounts/accounts_test.go b/accounts/accounts_test.go new file mode 100644 index 000000000000..e8274f9f0408 --- /dev/null +++ b/accounts/accounts_test.go @@ -0,0 +1,32 @@ +// 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 accounts + +import ( + "bytes" + "testing" + + "github.com/ethereum/go-ethereum/common/hexutil" +) + +func TestTextHash(t *testing.T) { + hash := TextHash([]byte("Hello Joe")) + want := hexutil.MustDecode("0xa080337ae51c4e064c189e113edd0ba391df9206e2f49db658bb32cf2911730b") + if !bytes.Equal(hash, want) { + t.Fatalf("wrong hash: %x", hash) + } +} diff --git a/accounts/errors.go b/accounts/errors.go index 40b21ed179c0..2fed35f9d074 100644 --- a/accounts/errors.go +++ b/accounts/errors.go @@ -35,7 +35,7 @@ var ErrNotSupported = errors.New("not supported") // ErrInvalidPassphrase is returned when a decryption operation receives a bad // passphrase. -var ErrInvalidPassphrase = errors.New("invalid passphrase") +var ErrInvalidPassphrase = errors.New("invalid password") // ErrWalletAlreadyOpen is returned if a wallet is attempted to be opened the // second time. diff --git a/accounts/external/backend.go b/accounts/external/backend.go new file mode 100644 index 000000000000..6089ca984446 --- /dev/null +++ b/accounts/external/backend.go @@ -0,0 +1,231 @@ +// Copyright 2019 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 external + +import ( + "fmt" + "math/big" + "sync" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/signer/core" +) + +type ExternalBackend struct { + signers []accounts.Wallet +} + +func (eb *ExternalBackend) Wallets() []accounts.Wallet { + return eb.signers +} + +func NewExternalBackend(endpoint string) (*ExternalBackend, error) { + signer, err := NewExternalSigner(endpoint) + if err != nil { + return nil, err + } + return &ExternalBackend{ + signers: []accounts.Wallet{signer}, + }, nil +} + +func (eb *ExternalBackend) Subscribe(sink chan<- accounts.WalletEvent) event.Subscription { + return event.NewSubscription(func(quit <-chan struct{}) error { + <-quit + return nil + }) +} + +// ExternalSigner provides an API to interact with an external signer (clef) +// It proxies request to the external signer while forwarding relevant +// request headers +type ExternalSigner struct { + client *rpc.Client + endpoint string + status string + cacheMu sync.RWMutex + cache []accounts.Account +} + +func NewExternalSigner(endpoint string) (*ExternalSigner, error) { + client, err := rpc.Dial(endpoint) + if err != nil { + return nil, err + } + extsigner := &ExternalSigner{ + client: client, + endpoint: endpoint, + } + // Check if reachable + version, err := extsigner.pingVersion() + if err != nil { + return nil, err + } + extsigner.status = fmt.Sprintf("ok [version=%v]", version) + return extsigner, nil +} + +func (api *ExternalSigner) URL() accounts.URL { + return accounts.URL{ + Scheme: "extapi", + Path: api.endpoint, + } +} + +func (api *ExternalSigner) Status() (string, error) { + return api.status, nil +} + +func (api *ExternalSigner) Open(passphrase string) error { + return fmt.Errorf("operation not supported on external signers") +} + +func (api *ExternalSigner) Close() error { + return fmt.Errorf("operation not supported on external signers") +} + +func (api *ExternalSigner) Accounts() []accounts.Account { + var accnts []accounts.Account + res, err := api.listAccounts() + if err != nil { + log.Error("account listing failed", "error", err) + return accnts + } + for _, addr := range res { + accnts = append(accnts, accounts.Account{ + URL: accounts.URL{ + Scheme: "extapi", + Path: api.endpoint, + }, + Address: addr, + }) + } + api.cacheMu.Lock() + api.cache = accnts + api.cacheMu.Unlock() + return accnts +} + +func (api *ExternalSigner) Contains(account accounts.Account) bool { + api.cacheMu.RLock() + defer api.cacheMu.RUnlock() + for _, a := range api.cache { + if a.Address == account.Address && (account.URL == (accounts.URL{}) || account.URL == api.URL()) { + return true + } + } + return false +} + +func (api *ExternalSigner) Derive(path accounts.DerivationPath, pin bool) (accounts.Account, error) { + return accounts.Account{}, fmt.Errorf("operation not supported on external signers") +} + +func (api *ExternalSigner) SelfDerive(bases []accounts.DerivationPath, chain ethereum.ChainStateReader) { + log.Error("operation SelfDerive not supported on external signers") +} + +func (api *ExternalSigner) signHash(account accounts.Account, hash []byte) ([]byte, error) { + return []byte{}, fmt.Errorf("operation not supported on external signers") +} + +// SignData signs keccak256(data). The mimetype parameter describes the type of data being signed +func (api *ExternalSigner) SignData(account accounts.Account, mimeType string, data []byte) ([]byte, error) { + var res hexutil.Bytes + var signAddress = common.NewMixedcaseAddress(account.Address) + if err := api.client.Call(&res, "account_signData", + mimeType, + &signAddress, // Need to use the pointer here, because of how MarshalJSON is defined + hexutil.Encode(data)); err != nil { + return nil, err + } + // If V is on 27/28-form, convert to to 0/1 for Clique + if mimeType == accounts.MimetypeClique && (res[64] == 27 || res[64] == 28) { + res[64] -= 27 // Transform V from 27/28 to 0/1 for Clique use + } + return res, nil +} + +func (api *ExternalSigner) SignText(account accounts.Account, text []byte) ([]byte, error) { + var res hexutil.Bytes + var signAddress = common.NewMixedcaseAddress(account.Address) + if err := api.client.Call(&res, "account_signData", + accounts.MimetypeTextPlain, + &signAddress, // Need to use the pointer here, because of how MarshalJSON is defined + hexutil.Encode(text)); err != nil { + return nil, err + } + return res, nil +} + +func (api *ExternalSigner) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + res := ethapi.SignTransactionResult{} + data := hexutil.Bytes(tx.Data()) + var to *common.MixedcaseAddress + if tx.To() != nil { + t := common.NewMixedcaseAddress(*tx.To()) + to = &t + } + args := &core.SendTxArgs{ + Data: &data, + Nonce: hexutil.Uint64(tx.Nonce()), + Value: hexutil.Big(*tx.Value()), + Gas: hexutil.Uint64(tx.Gas()), + GasPrice: hexutil.Big(*tx.GasPrice()), + To: to, + From: common.NewMixedcaseAddress(account.Address), + } + if err := api.client.Call(&res, "account_signTransaction", args); err != nil { + return nil, err + } + return res.Tx, nil +} + +func (api *ExternalSigner) SignTextWithPassphrase(account accounts.Account, passphrase string, text []byte) ([]byte, error) { + return []byte{}, fmt.Errorf("password-operations not supported on external signers") +} + +func (api *ExternalSigner) SignTxWithPassphrase(account accounts.Account, passphrase string, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + return nil, fmt.Errorf("password-operations not supported on external signers") +} +func (api *ExternalSigner) SignDataWithPassphrase(account accounts.Account, passphrase, mimeType string, data []byte) ([]byte, error) { + return nil, fmt.Errorf("password-operations not supported on external signers") +} + +func (api *ExternalSigner) listAccounts() ([]common.Address, error) { + var res []common.Address + if err := api.client.Call(&res, "account_list"); err != nil { + return nil, err + } + return res, nil +} + +func (api *ExternalSigner) pingVersion() (string, error) { + var v string + if err := api.client.Call(&v, "account_version"); err != nil { + return "", err + } + return v, nil +} diff --git a/accounts/hd.go b/accounts/hd.go index 6ed6318078d6..75c47611061c 100644 --- a/accounts/hd.go +++ b/accounts/hd.go @@ -17,6 +17,7 @@ package accounts import ( + "encoding/json" "errors" "fmt" "math" @@ -34,10 +35,10 @@ var DefaultRootDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, // at m/44'/60'/0'/0/1, etc. var DefaultBaseDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0, 0} -// DefaultLedgerBaseDerivationPath is the base path from which custom derivation endpoints -// are incremented. As such, the first account will be at m/44'/60'/0'/0, the second -// at m/44'/60'/0'/1, etc. -var DefaultLedgerBaseDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0} +// LegacyLedgerBaseDerivationPath is the legacy base path from which custom derivation +// endpoints are incremented. As such, the first account will be at m/44'/60'/0'/0, the +// second at m/44'/60'/0'/1, etc. +var LegacyLedgerBaseDerivationPath = DerivationPath{0x80000000 + 44, 0x80000000 + 60, 0x80000000 + 0, 0} // DerivationPath represents the computer friendly version of a hierarchical // deterministic wallet account derivaion path. @@ -133,3 +134,19 @@ func (path DerivationPath) String() string { } return result } + +// MarshalJSON turns a derivation path into its json-serialized string +func (path DerivationPath) MarshalJSON() ([]byte, error) { + return json.Marshal(path.String()) +} + +// UnmarshalJSON a json-serialized string back into a derivation path +func (path *DerivationPath) UnmarshalJSON(b []byte) error { + var dp string + var err error + if err = json.Unmarshal(b, &dp); err != nil { + return err + } + *path, err = ParseDerivationPath(dp) + return err +} diff --git a/accounts/keystore/account_cache.go b/accounts/keystore/account_cache.go index 577be4adf7d9..8f660e282f57 100644 --- a/accounts/keystore/account_cache.go +++ b/accounts/keystore/account_cache.go @@ -28,9 +28,9 @@ import ( "time" mapset "github.com/deckarep/golang-set" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" ) // Minimum amount of time between cache reloads. This limit applies if the platform does diff --git a/accounts/keystore/account_cache_test.go b/accounts/keystore/account_cache_test.go index c6a2bf8d6c8e..fe9233c046e7 100644 --- a/accounts/keystore/account_cache_test.go +++ b/accounts/keystore/account_cache_test.go @@ -29,8 +29,8 @@ import ( "github.com/cespare/cp" "github.com/davecgh/go-spew/spew" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" ) var ( diff --git a/accounts/keystore/file_cache.go b/accounts/keystore/file_cache.go index 56b8b7af9444..73ff6ae9ee6f 100644 --- a/accounts/keystore/file_cache.go +++ b/accounts/keystore/file_cache.go @@ -25,7 +25,7 @@ import ( "time" mapset "github.com/deckarep/golang-set" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // fileCache is a cache of files seen during scan of keystore. diff --git a/accounts/keystore/key.go b/accounts/keystore/key.go index e7de84d5272b..84d8df0c5aab 100644 --- a/accounts/keystore/key.go +++ b/accounts/keystore/key.go @@ -29,9 +29,9 @@ import ( "strings" "time" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "github.com/pborman/uuid" ) diff --git a/accounts/keystore/keystore.go b/accounts/keystore/keystore.go index f9b6dadeba66..5b55175b1f3e 100644 --- a/accounts/keystore/keystore.go +++ b/accounts/keystore/keystore.go @@ -33,17 +33,17 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/event" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/event" ) var ( ErrLocked = accounts.NewAuthNeededError("password or unlock") ErrNoMatch = errors.New("no key for given address or file") - ErrDecrypt = errors.New("could not decrypt key with given passphrase") + ErrDecrypt = errors.New("could not decrypt key with given password") ) // KeyStoreType is the reflect type of a keystore backend. @@ -137,8 +137,10 @@ func (ks *KeyStore) refreshWallets() { accs := ks.cache.accounts() // Transform the current list of wallets into the new one - wallets := make([]accounts.Wallet, 0, len(accs)) - events := []accounts.WalletEvent{} + var ( + wallets = make([]accounts.Wallet, 0, len(accs)) + events []accounts.WalletEvent + ) for _, account := range accs { // Drop wallets while they were in front of the next account diff --git a/accounts/keystore/keystore_test.go b/accounts/keystore/keystore_test.go index e6a687f5f542..a691c5062706 100644 --- a/accounts/keystore/keystore_test.go +++ b/accounts/keystore/keystore_test.go @@ -26,9 +26,9 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/event" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" ) var testSigData = make([]byte, 32) @@ -379,9 +379,9 @@ func tmpKeyStore(t *testing.T, encrypted bool) (string, *KeyStore) { if err != nil { t.Fatal(err) } - new := NewPlaintextKeyStore + newKs := NewPlaintextKeyStore if encrypted { - new = func(kd string) *KeyStore { return NewKeyStore(kd, veryLightScryptN, veryLightScryptP) } + newKs = func(kd string) *KeyStore { return NewKeyStore(kd, veryLightScryptN, veryLightScryptP) } } - return d, new(d) + return d, newKs(d) } diff --git a/accounts/keystore/passphrase.go b/accounts/keystore/passphrase.go index 54eb42b27058..89cdf0bfca14 100644 --- a/accounts/keystore/passphrase.go +++ b/accounts/keystore/passphrase.go @@ -38,9 +38,10 @@ import ( "os" "path/filepath" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" "github.com/pborman/uuid" "golang.org/x/crypto/pbkdf2" "golang.org/x/crypto/scrypt" @@ -97,9 +98,9 @@ func (ks keyStorePassphrase) GetKey(addr common.Address, filename, auth string) } // StoreKey generates a key, encrypts with 'auth' and stores in the given directory -func StoreKey(dir, auth string, scryptN, scryptP int) (common.Address, error) { +func StoreKey(dir, auth string, scryptN, scryptP int) (accounts.Account, error) { _, a, err := storeNewKey(&keyStorePassphrase{dir, scryptN, scryptP, false}, rand.Reader, auth) - return a.Address, err + return a, err } func (ks keyStorePassphrase) StoreKey(filename string, key *Key, auth string) error { @@ -120,8 +121,9 @@ func (ks keyStorePassphrase) StoreKey(filename string, key *Key, auth string) er "This indicates that the keystore is corrupted. \n" + "The corrupted file is stored at \n%v\n" + "Please file a ticket at:\n\n" + - "https://github.com/nebulaai/nbai-node/issues." + + "https://github.com/ethereum/go-ethereum/issues." + "The error was : %s" + //lint:ignore ST1005 This is a message for the user return fmt.Errorf(msg, tmpName, err) } } @@ -236,7 +238,7 @@ func DecryptKey(keyjson []byte, auth string) (*Key, error) { func DecryptDataV3(cryptoJson CryptoJSON, auth string) ([]byte, error) { if cryptoJson.Cipher != "aes-128-ctr" { - return nil, fmt.Errorf("Cipher not supported: %v", cryptoJson.Cipher) + return nil, fmt.Errorf("cipher not supported: %v", cryptoJson.Cipher) } mac, err := hex.DecodeString(cryptoJson.MAC) if err != nil { @@ -272,7 +274,7 @@ func DecryptDataV3(cryptoJson CryptoJSON, auth string) ([]byte, error) { func decryptKeyV3(keyProtected *encryptedKeyJSONV3, auth string) (keyBytes []byte, keyId []byte, err error) { if keyProtected.Version != version { - return nil, nil, fmt.Errorf("Version not supported: %v", keyProtected.Version) + return nil, nil, fmt.Errorf("version not supported: %v", keyProtected.Version) } keyId = uuid.Parse(keyProtected.Id) plainText, err := DecryptDataV3(keyProtected.Crypto, auth) @@ -334,13 +336,13 @@ func getKDFKey(cryptoJSON CryptoJSON, auth string) ([]byte, error) { c := ensureInt(cryptoJSON.KDFParams["c"]) prf := cryptoJSON.KDFParams["prf"].(string) if prf != "hmac-sha256" { - return nil, fmt.Errorf("Unsupported PBKDF2 PRF: %s", prf) + return nil, fmt.Errorf("unsupported PBKDF2 PRF: %s", prf) } key := pbkdf2.Key(authArray, salt, c, dkLen, sha256.New) return key, nil } - return nil, fmt.Errorf("Unsupported KDF: %s", cryptoJSON.KDF) + return nil, fmt.Errorf("unsupported KDF: %s", cryptoJSON.KDF) } // TODO: can we do without this when unmarshalling dynamic JSON? diff --git a/accounts/keystore/passphrase_test.go b/accounts/keystore/passphrase_test.go index bed6dcdcad33..630682cebdb1 100644 --- a/accounts/keystore/passphrase_test.go +++ b/accounts/keystore/passphrase_test.go @@ -20,7 +20,7 @@ import ( "io/ioutil" "testing" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) const ( diff --git a/accounts/keystore/plain.go b/accounts/keystore/plain.go index ffc3a1868ee6..f62a133ce169 100644 --- a/accounts/keystore/plain.go +++ b/accounts/keystore/plain.go @@ -22,7 +22,7 @@ import ( "os" "path/filepath" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) type keyStorePlain struct { diff --git a/accounts/keystore/plain_test.go b/accounts/keystore/plain_test.go index ab97119a2a9c..b831925838a4 100644 --- a/accounts/keystore/plain_test.go +++ b/accounts/keystore/plain_test.go @@ -27,8 +27,8 @@ import ( "strings" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" ) func tmpKeyStoreIface(t *testing.T, encrypted bool) (dir string, ks keyStore) { @@ -96,7 +96,7 @@ func TestKeyStorePassphraseDecryptionFail(t *testing.T) { t.Fatal(err) } if _, err = ks.GetKey(k1.Address, account.URL.Path, "bar"); err != ErrDecrypt { - t.Fatalf("wrong error for invalid passphrase\ngot %q\nwant %q", err, ErrDecrypt) + t.Fatalf("wrong error for invalid password\ngot %q\nwant %q", err, ErrDecrypt) } } diff --git a/accounts/keystore/presale.go b/accounts/keystore/presale.go index 26fdbab816f7..03055245f5e7 100644 --- a/accounts/keystore/presale.go +++ b/accounts/keystore/presale.go @@ -25,8 +25,8 @@ import ( "errors" "fmt" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/crypto" "github.com/pborman/uuid" "golang.org/x/crypto/pbkdf2" ) diff --git a/accounts/keystore/testdata/keystore/README b/accounts/keystore/testdata/keystore/README index a5a86f964d2c..6af9ac3f1ba0 100644 --- a/accounts/keystore/testdata/keystore/README +++ b/accounts/keystore/testdata/keystore/README @@ -1,5 +1,5 @@ This directory contains accounts for testing. -The passphrase that unlocks them is "foobar". +The password that unlocks them is "foobar". The "good" key files which are supposed to be loadable are: diff --git a/accounts/keystore/wallet.go b/accounts/keystore/wallet.go index 2a07b059d1c6..498067d49730 100644 --- a/accounts/keystore/wallet.go +++ b/accounts/keystore/wallet.go @@ -19,9 +19,10 @@ package keystore import ( "math/big" - ethereum "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/core/types" + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" ) // keystoreWallet implements the accounts.Wallet interface for the original @@ -76,13 +77,14 @@ func (w *keystoreWallet) Derive(path accounts.DerivationPath, pin bool) (account // SelfDerive implements accounts.Wallet, but is a noop for plain wallets since // there is no notion of hierarchical account derivation for plain keystore accounts. -func (w *keystoreWallet) SelfDerive(base accounts.DerivationPath, chain ethereum.ChainStateReader) {} +func (w *keystoreWallet) SelfDerive(bases []accounts.DerivationPath, chain ethereum.ChainStateReader) { +} -// SignHash implements accounts.Wallet, attempting to sign the given hash with +// signHash attempts to sign the given hash with // the given account. If the wallet does not wrap this particular account, an // error is returned to avoid account leakage (even though in theory we may be // able to sign via our shared keystore backend). -func (w *keystoreWallet) SignHash(account accounts.Account, hash []byte) ([]byte, error) { +func (w *keystoreWallet) signHash(account accounts.Account, hash []byte) ([]byte, error) { // Make sure the requested account is contained within if !w.Contains(account) { return nil, accounts.ErrUnknownAccount @@ -91,28 +93,47 @@ func (w *keystoreWallet) SignHash(account accounts.Account, hash []byte) ([]byte return w.keystore.SignHash(account, hash) } -// SignTx implements accounts.Wallet, attempting to sign the given transaction -// with the given account. If the wallet does not wrap this particular account, -// an error is returned to avoid account leakage (even though in theory we may -// be able to sign via our shared keystore backend). -func (w *keystoreWallet) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { +// SignData signs keccak256(data). The mimetype parameter describes the type of data being signed +func (w *keystoreWallet) SignData(account accounts.Account, mimeType string, data []byte) ([]byte, error) { + return w.signHash(account, crypto.Keccak256(data)) +} + +// SignDataWithPassphrase signs keccak256(data). The mimetype parameter describes the type of data being signed +func (w *keystoreWallet) SignDataWithPassphrase(account accounts.Account, passphrase, mimeType string, data []byte) ([]byte, error) { // Make sure the requested account is contained within if !w.Contains(account) { return nil, accounts.ErrUnknownAccount } // Account seems valid, request the keystore to sign - return w.keystore.SignTx(account, tx, chainID) + return w.keystore.SignHashWithPassphrase(account, passphrase, crypto.Keccak256(data)) } -// SignHashWithPassphrase implements accounts.Wallet, attempting to sign the +func (w *keystoreWallet) SignText(account accounts.Account, text []byte) ([]byte, error) { + return w.signHash(account, accounts.TextHash(text)) +} + +// SignTextWithPassphrase implements accounts.Wallet, attempting to sign the // given hash with the given account using passphrase as extra authentication. -func (w *keystoreWallet) SignHashWithPassphrase(account accounts.Account, passphrase string, hash []byte) ([]byte, error) { +func (w *keystoreWallet) SignTextWithPassphrase(account accounts.Account, passphrase string, text []byte) ([]byte, error) { + // Make sure the requested account is contained within + if !w.Contains(account) { + return nil, accounts.ErrUnknownAccount + } + // Account seems valid, request the keystore to sign + return w.keystore.SignHashWithPassphrase(account, passphrase, accounts.TextHash(text)) +} + +// SignTx implements accounts.Wallet, attempting to sign the given transaction +// with the given account. If the wallet does not wrap this particular account, +// an error is returned to avoid account leakage (even though in theory we may +// be able to sign via our shared keystore backend). +func (w *keystoreWallet) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { // Make sure the requested account is contained within if !w.Contains(account) { return nil, accounts.ErrUnknownAccount } // Account seems valid, request the keystore to sign - return w.keystore.SignHashWithPassphrase(account, passphrase, hash) + return w.keystore.SignTx(account, tx, chainID) } // SignTxWithPassphrase implements accounts.Wallet, attempting to sign the given diff --git a/accounts/keystore/watch.go b/accounts/keystore/watch.go index fdf5a110f9f8..d6ef53327d43 100644 --- a/accounts/keystore/watch.go +++ b/accounts/keystore/watch.go @@ -14,14 +14,14 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build darwin,!ios freebsd linux,!arm64 netbsd solaris +// +build darwin,!ios,cgo freebsd linux,!arm64 netbsd solaris package keystore import ( "time" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" "github.com/rjeczalik/notify" ) diff --git a/accounts/keystore/watch_fallback.go b/accounts/keystore/watch_fallback.go index 7c5e9cb2e214..de0e87f8a5a7 100644 --- a/accounts/keystore/watch_fallback.go +++ b/accounts/keystore/watch_fallback.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build ios linux,arm64 windows !darwin,!freebsd,!linux,!netbsd,!solaris +// +build darwin,!cgo ios linux,arm64 windows !darwin,!freebsd,!linux,!netbsd,!solaris // This is the fallback implementation of directory watching. // It is used on unsupported platforms. diff --git a/accounts/manager.go b/accounts/manager.go index dee6f43ff672..731d12ea30a9 100644 --- a/accounts/manager.go +++ b/accounts/manager.go @@ -21,12 +21,22 @@ import ( "sort" "sync" - "github.com/nebulaai/nbai-node/event" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" ) +// Config contains the settings of the global account manager. +// +// TODO(rjl493456442, karalabe, holiman): Get rid of this when account management +// is removed in favor of Clef. +type Config struct { + InsecureUnlockAllowed bool // Whether account unlocking in insecure environment is allowed +} + // Manager is an overarching account manager that can communicate with various // backends for signing transactions. type Manager struct { + config *Config // Global account manager configurations backends map[reflect.Type][]Backend // Index of backends currently registered updaters []event.Subscription // Wallet update subscriptions for all backends updates chan WalletEvent // Subscription sink for backend wallet changes @@ -40,7 +50,7 @@ type Manager struct { // NewManager creates a generic account manager to sign transaction via various // supported backends. -func NewManager(backends ...Backend) *Manager { +func NewManager(config *Config, backends ...Backend) *Manager { // Retrieve the initial list of wallets from the backends and sort by URL var wallets []Wallet for _, backend := range backends { @@ -55,6 +65,7 @@ func NewManager(backends ...Backend) *Manager { } // Assemble the account manager and return am := &Manager{ + config: config, backends: make(map[reflect.Type][]Backend), updaters: subs, updates: updates, @@ -77,6 +88,11 @@ func (am *Manager) Close() error { return <-errc } +// Config returns the configuration of account manager. +func (am *Manager) Config() *Config { + return am.config +} + // update is the wallet event loop listening for notifications from the backends // and updating the cache of wallets. func (am *Manager) update() { @@ -147,6 +163,20 @@ func (am *Manager) Wallet(url string) (Wallet, error) { return nil, ErrUnknownWallet } +// Accounts returns all account addresses of all wallets within the account manager +func (am *Manager) Accounts() []common.Address { + am.lock.RLock() + defer am.lock.RUnlock() + + addresses := make([]common.Address, 0) // return [] instead of nil if empty + for _, wallet := range am.wallets { + for _, account := range wallet.Accounts() { + addresses = append(addresses, account.Address) + } + } + return addresses +} + // Find attempts to locate the wallet corresponding to a specific account. Since // accounts can be dynamically added to and removed from wallets, this method has // a linear runtime in the number of wallets. diff --git a/accounts/scwallet/README.md b/accounts/scwallet/README.md new file mode 100644 index 000000000000..cfca916b3ae8 --- /dev/null +++ b/accounts/scwallet/README.md @@ -0,0 +1,102 @@ +# Using the smartcard wallet + +## Requirements + + * A USB smartcard reader + * A keycard that supports the status app + * PCSCD version 4.3 running on your system **Only version 4.3 is currently supported** + +## Preparing the smartcard + + **WARNING: FOILLOWING THESE INSTRUCTIONS WILL DESTROY THE MASTER KEY ON YOUR CARD. ONLY PROCEED IF NO FUNDS ARE ASSOCIATED WITH THESE ACCOUNTS** + + You can use status' [keycard-cli](https://github.com/status-im/keycard-cli) and you should get _at least_ version 2.1.1 of their [smartcard application](https://github.com/status-im/status-keycard/releases/download/2.2.1/keycard_v2.2.1.cap) + + You also need to make sure that the PCSC daemon is running on your system. + + Then, you can install the application to the card by typing: + + ``` + keycard install -a keycard_v2.2.1.cap && keycard init + ``` + + At the end of this process, you will be provided with a PIN, a PUK and a pairing password. Write them down, you'll need them shortly. + + Start `geth` with the `console` command. You will notice the following warning: + + ``` + WARN [04-09|16:58:38.898] Failed to open wallet url=keycard://044def09 err="smartcard: pairing password needed" + ``` + + Write down the URL (`keycard://044def09` in this example). Then ask `geth` to open the wallet: + + ``` + > personal.openWallet("keycard://044def09") + Please enter the pairing password: + ``` + + Enter the pairing password that you have received during card initialization. Same with the PIN that you will subsequently be + asked for. + + If everything goes well, you should see your new account when typing `personal` on the console: + + ``` + > personal + WARN [04-09|17:02:07.330] Smartcard wallet account derivation failed url=keycard://044def09 err="Unexpected response status Cla=0x80, Ins=0xd1, Sw=0x6985" + { + listAccounts: [], + listWallets: [{ + status: "Empty, waiting for initialization", + url: "keycard://044def09" + }], + ... + } + ``` + + So the communication with the card is working, but there is no key associated with this wallet. Let's create it: + + ``` + > personal.initializeWallet("keycard://044def09") + "tilt ... impact" + ``` + + You should get a list of words, this is your seed so write them down. Your wallet should now be initialized: + + ``` + > personal.listWallets + [{ + accounts: [{ + address: "0x678b7cd55c61917defb23546a41803c5bfefbc7a", + url: "keycard://044d/m/44'/60'/0'/0/0" + }], + status: "Online", + url: "keycard://044def09" + }] + ``` + + You're all set! + +## Usage + + 1. Start `geth` with the `console` command + 2. Check the card's URL by checking `personal.listWallets`: + +``` + listWallets: [{ + status: "Online, can derive public keys", + url: "keycard://a4d73015" + }] +``` + + 3. Open the wallet, you will be prompted for your pairing password, then PIN: + +``` +personal.openWallet("keycard://a4d73015") +``` + + 4. Check that creation was successful by typing e.g. `personal`. Then use it like a regular wallet. + +## Known issues + + * Starting geth with a valid card seems to make firefox crash. + * PCSC version 4.4 should work, but is currently untested diff --git a/accounts/scwallet/apdu.go b/accounts/scwallet/apdu.go new file mode 100644 index 000000000000..bd3660604e1f --- /dev/null +++ b/accounts/scwallet/apdu.go @@ -0,0 +1,87 @@ +// Copyright 2018 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 scwallet + +import ( + "bytes" + "encoding/binary" + "fmt" +) + +// commandAPDU represents an application data unit sent to a smartcard. +type commandAPDU struct { + Cla, Ins, P1, P2 uint8 // Class, Instruction, Parameter 1, Parameter 2 + Data []byte // Command data + Le uint8 // Command data length +} + +// serialize serializes a command APDU. +func (ca commandAPDU) serialize() ([]byte, error) { + buf := new(bytes.Buffer) + + if err := binary.Write(buf, binary.BigEndian, ca.Cla); err != nil { + return nil, err + } + if err := binary.Write(buf, binary.BigEndian, ca.Ins); err != nil { + return nil, err + } + if err := binary.Write(buf, binary.BigEndian, ca.P1); err != nil { + return nil, err + } + if err := binary.Write(buf, binary.BigEndian, ca.P2); err != nil { + return nil, err + } + if len(ca.Data) > 0 { + if err := binary.Write(buf, binary.BigEndian, uint8(len(ca.Data))); err != nil { + return nil, err + } + if err := binary.Write(buf, binary.BigEndian, ca.Data); err != nil { + return nil, err + } + } + if err := binary.Write(buf, binary.BigEndian, ca.Le); err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +// responseAPDU represents an application data unit received from a smart card. +type responseAPDU struct { + Data []byte // response data + Sw1, Sw2 uint8 // status words 1 and 2 +} + +// deserialize deserializes a response APDU. +func (ra *responseAPDU) deserialize(data []byte) error { + if len(data) < 2 { + return fmt.Errorf("can not deserialize data: payload too short (%d < 2)", len(data)) + } + + ra.Data = make([]byte, len(data)-2) + + buf := bytes.NewReader(data) + if err := binary.Read(buf, binary.BigEndian, &ra.Data); err != nil { + return err + } + if err := binary.Read(buf, binary.BigEndian, &ra.Sw1); err != nil { + return err + } + if err := binary.Read(buf, binary.BigEndian, &ra.Sw2); err != nil { + return err + } + return nil +} diff --git a/accounts/scwallet/hub.go b/accounts/scwallet/hub.go new file mode 100644 index 000000000000..5f939c658627 --- /dev/null +++ b/accounts/scwallet/hub.go @@ -0,0 +1,302 @@ +// Copyright 2018 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 package implements support for smartcard-based hardware wallets such as +// the one written by Status: https://github.com/status-im/hardware-wallet +// +// This implementation of smartcard wallets have a different interaction process +// to other types of hardware wallet. The process works like this: +// +// 1. (First use with a given client) Establish a pairing between hardware +// wallet and client. This requires a secret value called a 'pairing password'. +// You can pair with an unpaired wallet with `personal.openWallet(URI, pairing password)`. +// 2. (First use only) Initialize the wallet, which generates a keypair, stores +// it on the wallet, and returns it so the user can back it up. You can +// initialize a wallet with `personal.initializeWallet(URI)`. +// 3. Connect to the wallet using the pairing information established in step 1. +// You can connect to a paired wallet with `personal.openWallet(URI, PIN)`. +// 4. Interact with the wallet as normal. + +package scwallet + +import ( + "encoding/json" + "io/ioutil" + "os" + "path/filepath" + "sort" + "sync" + "time" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + pcsc "github.com/gballet/go-libpcsclite" +) + +// Scheme is the URI prefix for smartcard wallets. +const Scheme = "keycard" + +// refreshCycle is the maximum time between wallet refreshes (if USB hotplug +// notifications don't work). +const refreshCycle = time.Second + +// refreshThrottling is the minimum time between wallet refreshes to avoid thrashing. +const refreshThrottling = 500 * time.Millisecond + +// smartcardPairing contains information about a smart card we have paired with +// or might pair with the hub. +type smartcardPairing struct { + PublicKey []byte `json:"publicKey"` + PairingIndex uint8 `json:"pairingIndex"` + PairingKey []byte `json:"pairingKey"` + Accounts map[common.Address]accounts.DerivationPath `json:"accounts"` +} + +// Hub is a accounts.Backend that can find and handle generic PC/SC hardware wallets. +type Hub struct { + scheme string // Protocol scheme prefixing account and wallet URLs. + + context *pcsc.Client + datadir string + pairings map[string]smartcardPairing + + refreshed time.Time // Time instance when the list of wallets was last refreshed + wallets map[string]*Wallet // Mapping from reader names to wallet instances + updateFeed event.Feed // Event feed to notify wallet additions/removals + updateScope event.SubscriptionScope // Subscription scope tracking current live listeners + updating bool // Whether the event notification loop is running + + quit chan chan error + + stateLock sync.RWMutex // Protects the internals of the hub from racey access +} + +func (hub *Hub) readPairings() error { + hub.pairings = make(map[string]smartcardPairing) + pairingFile, err := os.Open(filepath.Join(hub.datadir, "smartcards.json")) + if err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + + pairingData, err := ioutil.ReadAll(pairingFile) + if err != nil { + return err + } + var pairings []smartcardPairing + if err := json.Unmarshal(pairingData, &pairings); err != nil { + return err + } + + for _, pairing := range pairings { + hub.pairings[string(pairing.PublicKey)] = pairing + } + return nil +} + +func (hub *Hub) writePairings() error { + pairingFile, err := os.OpenFile(filepath.Join(hub.datadir, "smartcards.json"), os.O_RDWR|os.O_CREATE, 0755) + if err != nil { + return err + } + defer pairingFile.Close() + + pairings := make([]smartcardPairing, 0, len(hub.pairings)) + for _, pairing := range hub.pairings { + pairings = append(pairings, pairing) + } + + pairingData, err := json.Marshal(pairings) + if err != nil { + return err + } + + if _, err := pairingFile.Write(pairingData); err != nil { + return err + } + + return nil +} + +func (hub *Hub) pairing(wallet *Wallet) *smartcardPairing { + if pairing, ok := hub.pairings[string(wallet.PublicKey)]; ok { + return &pairing + } + return nil +} + +func (hub *Hub) setPairing(wallet *Wallet, pairing *smartcardPairing) error { + if pairing == nil { + delete(hub.pairings, string(wallet.PublicKey)) + } else { + hub.pairings[string(wallet.PublicKey)] = *pairing + } + return hub.writePairings() +} + +// NewHub creates a new hardware wallet manager for smartcards. +func NewHub(daemonPath string, scheme string, datadir string) (*Hub, error) { + context, err := pcsc.EstablishContext(daemonPath, pcsc.ScopeSystem) + if err != nil { + return nil, err + } + hub := &Hub{ + scheme: scheme, + context: context, + datadir: datadir, + wallets: make(map[string]*Wallet), + quit: make(chan chan error), + } + if err := hub.readPairings(); err != nil { + return nil, err + } + hub.refreshWallets() + return hub, nil +} + +// Wallets implements accounts.Backend, returning all the currently tracked smart +// cards that appear to be hardware wallets. +func (hub *Hub) Wallets() []accounts.Wallet { + // Make sure the list of wallets is up to date + hub.refreshWallets() + + hub.stateLock.RLock() + defer hub.stateLock.RUnlock() + + cpy := make([]accounts.Wallet, 0, len(hub.wallets)) + for _, wallet := range hub.wallets { + cpy = append(cpy, wallet) + } + sort.Sort(accounts.WalletsByURL(cpy)) + return cpy +} + +// refreshWallets scans the devices attached to the machine and updates the +// list of wallets based on the found devices. +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 < refreshThrottling { + return + } + // Retrieve all the smart card reader to check for cards + readers, err := hub.context.ListReaders() + if err != nil { + // This is a perverted hack, the scard library returns an error if no card + // readers are present instead of simply returning an empty list. We don't + // want to fill the user's log with errors, so filter those out. + if err.Error() != "scard: Cannot find a smart card reader." { + log.Error("Failed to enumerate smart card readers", "err", err) + return + } + } + // Transform the current list of wallets into the new one + hub.stateLock.Lock() + + events := []accounts.WalletEvent{} + seen := make(map[string]struct{}) + + for _, reader := range readers { + // Mark the reader as present + seen[reader] = struct{}{} + + // If we alreay know about this card, skip to the next reader, otherwise clean up + if wallet, ok := hub.wallets[reader]; ok { + if err := wallet.ping(); err == nil { + continue + } + wallet.Close() + events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletDropped}) + delete(hub.wallets, reader) + } + // New card detected, try to connect to it + card, err := hub.context.Connect(reader, pcsc.ShareShared, pcsc.ProtocolAny) + if err != nil { + log.Debug("Failed to open smart card", "reader", reader, "err", err) + continue + } + wallet := NewWallet(hub, card) + if err = wallet.connect(); err != nil { + log.Debug("Failed to connect to smart card", "reader", reader, "err", err) + card.Disconnect(pcsc.LeaveCard) + continue + } + // Card connected, start tracking in amongs the wallets + hub.wallets[reader] = wallet + events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletArrived}) + } + // Remove any wallets no longer present + for reader, wallet := range hub.wallets { + if _, ok := seen[reader]; !ok { + wallet.Close() + events = append(events, accounts.WalletEvent{Wallet: wallet, Kind: accounts.WalletDropped}) + delete(hub.wallets, reader) + } + } + hub.refreshed = time.Now() + hub.stateLock.Unlock() + + for _, event := range events { + hub.updateFeed.Send(event) + } +} + +// Subscribe implements accounts.Backend, creating an async subscription to +// receive notifications on the addition or removal of smart card 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() + + // Subscribe the caller and track the subscriber count + sub := hub.updateScope.Track(hub.updateFeed.Subscribe(sink)) + + // Subscribers require an active notification loop, start it + if !hub.updating { + hub.updating = true + go hub.updater() + } + return sub +} + +// updater is responsible for maintaining an up-to-date list of wallets managed +// by the smart card hub, and for firing wallet addition/removal events. +func (hub *Hub) updater() { + for { + // TODO: Wait for a USB hotplug event (not supported yet) or a refresh timeout + // <-hub.changes + time.Sleep(refreshCycle) + + // Run the wallet refresher + hub.refreshWallets() + + // If all our subscribers left, stop the updater + hub.stateLock.Lock() + if hub.updateScope.Count() == 0 { + hub.updating = false + hub.stateLock.Unlock() + return + } + hub.stateLock.Unlock() + } +} diff --git a/accounts/scwallet/securechannel.go b/accounts/scwallet/securechannel.go new file mode 100644 index 000000000000..9b70c69dccdd --- /dev/null +++ b/accounts/scwallet/securechannel.go @@ -0,0 +1,346 @@ +// Copyright 2018 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 scwallet + +import ( + "bytes" + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "crypto/sha256" + "crypto/sha512" + "fmt" + + "github.com/ethereum/go-ethereum/crypto" + pcsc "github.com/gballet/go-libpcsclite" + "github.com/wsddn/go-ecdh" + "golang.org/x/crypto/pbkdf2" + "golang.org/x/text/unicode/norm" +) + +const ( + maxPayloadSize = 223 + pairP1FirstStep = 0 + pairP1LastStep = 1 + + scSecretLength = 32 + scBlockSize = 16 + + insOpenSecureChannel = 0x10 + insMutuallyAuthenticate = 0x11 + insPair = 0x12 + insUnpair = 0x13 + + pairingSalt = "Keycard Pairing Password Salt" +) + +// SecureChannelSession enables secure communication with a hardware wallet. +type SecureChannelSession struct { + card *pcsc.Card // A handle to the smartcard for communication + secret []byte // A shared secret generated from our ECDSA keys + publicKey []byte // Our own ephemeral public key + PairingKey []byte // A permanent shared secret for a pairing, if present + sessionEncKey []byte // The current session encryption key + sessionMacKey []byte // The current session MAC key + iv []byte // The current IV + PairingIndex uint8 // The pairing index +} + +// NewSecureChannelSession creates a new secure channel for the given card and public key. +func NewSecureChannelSession(card *pcsc.Card, keyData []byte) (*SecureChannelSession, error) { + // Generate an ECDSA keypair for ourselves + gen := ecdh.NewEllipticECDH(crypto.S256()) + private, public, err := gen.GenerateKey(rand.Reader) + if err != nil { + return nil, err + } + + cardPublic, ok := gen.Unmarshal(keyData) + if !ok { + return nil, fmt.Errorf("could not unmarshal public key from card") + } + + secret, err := gen.GenerateSharedSecret(private, cardPublic) + if err != nil { + return nil, err + } + + return &SecureChannelSession{ + card: card, + secret: secret, + publicKey: gen.Marshal(public), + }, nil +} + +// Pair establishes a new pairing with the smartcard. +func (s *SecureChannelSession) Pair(pairingPassword []byte) error { + secretHash := pbkdf2.Key(norm.NFKD.Bytes(pairingPassword), norm.NFKD.Bytes([]byte(pairingSalt)), 50000, 32, sha256.New) + + challenge := make([]byte, 32) + if _, err := rand.Read(challenge); err != nil { + return err + } + + response, err := s.pair(pairP1FirstStep, challenge) + if err != nil { + return err + } + + md := sha256.New() + md.Write(secretHash[:]) + md.Write(challenge) + + expectedCryptogram := md.Sum(nil) + cardCryptogram := response.Data[:32] + cardChallenge := response.Data[32:64] + + if !bytes.Equal(expectedCryptogram, cardCryptogram) { + return fmt.Errorf("invalid card cryptogram %v != %v", expectedCryptogram, cardCryptogram) + } + + md.Reset() + md.Write(secretHash[:]) + md.Write(cardChallenge) + response, err = s.pair(pairP1LastStep, md.Sum(nil)) + if err != nil { + return err + } + + md.Reset() + md.Write(secretHash[:]) + md.Write(response.Data[1:]) + s.PairingKey = md.Sum(nil) + s.PairingIndex = response.Data[0] + + return nil +} + +// Unpair disestablishes an existing pairing. +func (s *SecureChannelSession) Unpair() error { + if s.PairingKey == nil { + return fmt.Errorf("cannot unpair: not paired") + } + + _, err := s.transmitEncrypted(claSCWallet, insUnpair, s.PairingIndex, 0, []byte{}) + if err != nil { + return err + } + s.PairingKey = nil + // Close channel + s.iv = nil + return nil +} + +// Open initializes the secure channel. +func (s *SecureChannelSession) Open() error { + if s.iv != nil { + return fmt.Errorf("session already opened") + } + + response, err := s.open() + if err != nil { + return err + } + + // Generate the encryption/mac key by hashing our shared secret, + // pairing key, and the first bytes returned from the Open APDU. + md := sha512.New() + md.Write(s.secret) + md.Write(s.PairingKey) + md.Write(response.Data[:scSecretLength]) + keyData := md.Sum(nil) + s.sessionEncKey = keyData[:scSecretLength] + s.sessionMacKey = keyData[scSecretLength : scSecretLength*2] + + // The IV is the last bytes returned from the Open APDU. + s.iv = response.Data[scSecretLength:] + + return s.mutuallyAuthenticate() +} + +// mutuallyAuthenticate is an internal method to authenticate both ends of the +// connection. +func (s *SecureChannelSession) mutuallyAuthenticate() error { + data := make([]byte, scSecretLength) + if _, err := rand.Read(data); err != nil { + return err + } + + response, err := s.transmitEncrypted(claSCWallet, insMutuallyAuthenticate, 0, 0, data) + if err != nil { + return err + } + if response.Sw1 != 0x90 || response.Sw2 != 0x00 { + return fmt.Errorf("got unexpected response from MUTUALLY_AUTHENTICATE: 0x%x%x", response.Sw1, response.Sw2) + } + + if len(response.Data) != scSecretLength { + return fmt.Errorf("response from MUTUALLY_AUTHENTICATE was %d bytes, expected %d", len(response.Data), scSecretLength) + } + + return nil +} + +// open is an internal method that sends an open APDU. +func (s *SecureChannelSession) open() (*responseAPDU, error) { + return transmit(s.card, &commandAPDU{ + Cla: claSCWallet, + Ins: insOpenSecureChannel, + P1: s.PairingIndex, + P2: 0, + Data: s.publicKey, + Le: 0, + }) +} + +// pair is an internal method that sends a pair APDU. +func (s *SecureChannelSession) pair(p1 uint8, data []byte) (*responseAPDU, error) { + return transmit(s.card, &commandAPDU{ + Cla: claSCWallet, + Ins: insPair, + P1: p1, + P2: 0, + Data: data, + Le: 0, + }) +} + +// transmitEncrypted sends an encrypted message, and decrypts and returns the response. +func (s *SecureChannelSession) transmitEncrypted(cla, ins, p1, p2 byte, data []byte) (*responseAPDU, error) { + if s.iv == nil { + return nil, fmt.Errorf("channel not open") + } + + data, err := s.encryptAPDU(data) + if err != nil { + return nil, err + } + meta := [16]byte{cla, ins, p1, p2, byte(len(data) + scBlockSize)} + if err = s.updateIV(meta[:], data); err != nil { + return nil, err + } + + fulldata := make([]byte, len(s.iv)+len(data)) + copy(fulldata, s.iv) + copy(fulldata[len(s.iv):], data) + + response, err := transmit(s.card, &commandAPDU{ + Cla: cla, + Ins: ins, + P1: p1, + P2: p2, + Data: fulldata, + }) + if err != nil { + return nil, err + } + + rmeta := [16]byte{byte(len(response.Data))} + rmac := response.Data[:len(s.iv)] + rdata := response.Data[len(s.iv):] + plainData, err := s.decryptAPDU(rdata) + if err != nil { + return nil, err + } + + if err = s.updateIV(rmeta[:], rdata); err != nil { + return nil, err + } + if !bytes.Equal(s.iv, rmac) { + return nil, fmt.Errorf("invalid MAC in response") + } + + rapdu := &responseAPDU{} + rapdu.deserialize(plainData) + + if rapdu.Sw1 != sw1Ok { + return nil, fmt.Errorf("unexpected response status Cla=0x%x, Ins=0x%x, Sw=0x%x%x", cla, ins, rapdu.Sw1, rapdu.Sw2) + } + + return rapdu, nil +} + +// encryptAPDU is an internal method that serializes and encrypts an APDU. +func (s *SecureChannelSession) encryptAPDU(data []byte) ([]byte, error) { + if len(data) > maxPayloadSize { + return nil, fmt.Errorf("payload of %d bytes exceeds maximum of %d", len(data), maxPayloadSize) + } + data = pad(data, 0x80) + + ret := make([]byte, len(data)) + + a, err := aes.NewCipher(s.sessionEncKey) + if err != nil { + return nil, err + } + crypter := cipher.NewCBCEncrypter(a, s.iv) + crypter.CryptBlocks(ret, data) + return ret, nil +} + +// pad applies message padding to a 16 byte boundary. +func pad(data []byte, terminator byte) []byte { + padded := make([]byte, (len(data)/16+1)*16) + copy(padded, data) + padded[len(data)] = terminator + return padded +} + +// decryptAPDU is an internal method that decrypts and deserializes an APDU. +func (s *SecureChannelSession) decryptAPDU(data []byte) ([]byte, error) { + a, err := aes.NewCipher(s.sessionEncKey) + if err != nil { + return nil, err + } + + ret := make([]byte, len(data)) + + crypter := cipher.NewCBCDecrypter(a, s.iv) + crypter.CryptBlocks(ret, data) + return unpad(ret, 0x80) +} + +// unpad strips padding from a message. +func unpad(data []byte, terminator byte) ([]byte, error) { + for i := 1; i <= 16; i++ { + switch data[len(data)-i] { + case 0: + continue + case terminator: + return data[:len(data)-i], nil + default: + return nil, fmt.Errorf("expected end of padding, got %d", data[len(data)-i]) + } + } + return nil, fmt.Errorf("expected end of padding, got 0") +} + +// updateIV is an internal method that updates the initialization vector after +// each message exchanged. +func (s *SecureChannelSession) updateIV(meta, data []byte) error { + data = pad(data, 0) + a, err := aes.NewCipher(s.sessionMacKey) + if err != nil { + return err + } + crypter := cipher.NewCBCEncrypter(a, make([]byte, 16)) + crypter.CryptBlocks(meta, meta) + crypter.CryptBlocks(data, data) + // The first 16 bytes of the last block is the MAC + s.iv = data[len(data)-32 : len(data)-16] + return nil +} diff --git a/accounts/scwallet/wallet.go b/accounts/scwallet/wallet.go new file mode 100644 index 000000000000..dd9266cb3124 --- /dev/null +++ b/accounts/scwallet/wallet.go @@ -0,0 +1,1085 @@ +// Copyright 2018 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 scwallet + +import ( + "bytes" + "context" + "crypto/hmac" + "crypto/sha256" + "crypto/sha512" + "encoding/asn1" + "encoding/binary" + "errors" + "fmt" + "math/big" + "regexp" + "sort" + "strings" + "sync" + "time" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + pcsc "github.com/gballet/go-libpcsclite" + "github.com/status-im/keycard-go/derivationpath" +) + +// ErrPairingPasswordNeeded is returned if opening the smart card requires pairing with a pairing +// password. In this case, the calling application should request user input to enter +// the pairing password and send it back. +var ErrPairingPasswordNeeded = errors.New("smartcard: pairing password needed") + +// ErrPINNeeded is returned if opening the smart card requires a PIN code. In +// this case, the calling application should request user input to enter the PIN +// and send it back. +var ErrPINNeeded = errors.New("smartcard: pin needed") + +// ErrPINUnblockNeeded is returned if opening the smart card requires a PIN code, +// but all PIN attempts have already been exhausted. In this case the calling +// application should request user input for the PUK and a new PIN code to set +// fo the card. +var ErrPINUnblockNeeded = errors.New("smartcard: pin unblock needed") + +// ErrAlreadyOpen is returned if the smart card is attempted to be opened, but +// there is already a paired and unlocked session. +var ErrAlreadyOpen = errors.New("smartcard: already open") + +// ErrPubkeyMismatch is returned if the public key recovered from a signature +// does not match the one expected by the user. +var ErrPubkeyMismatch = errors.New("smartcard: recovered public key mismatch") + +var ( + appletAID = []byte{0xA0, 0x00, 0x00, 0x08, 0x04, 0x00, 0x01, 0x01, 0x01} + // DerivationSignatureHash is used to derive the public key from the signature of this hash + DerivationSignatureHash = sha256.Sum256(common.Hash{}.Bytes()) +) + +// List of APDU command-related constants +const ( + claISO7816 = 0 + claSCWallet = 0x80 + + insSelect = 0xA4 + insGetResponse = 0xC0 + sw1GetResponse = 0x61 + sw1Ok = 0x90 + + insVerifyPin = 0x20 + insUnblockPin = 0x22 + insExportKey = 0xC2 + insSign = 0xC0 + insLoadKey = 0xD0 + insDeriveKey = 0xD1 + insStatus = 0xF2 +) + +// List of ADPU command parameters +const ( + P1DeriveKeyFromMaster = uint8(0x00) + P1DeriveKeyFromParent = uint8(0x01) + P1DeriveKeyFromCurrent = uint8(0x10) + statusP1WalletStatus = uint8(0x00) + statusP1Path = uint8(0x01) + signP1PrecomputedHash = uint8(0x01) + signP2OnlyBlock = uint8(0x81) + exportP1Any = uint8(0x00) + exportP2Pubkey = uint8(0x01) +) + +// Minimum time to wait between self derivation attempts, even it the user is +// requesting accounts like crazy. +const selfDeriveThrottling = time.Second + +// Wallet represents a smartcard wallet instance. +type Wallet struct { + Hub *Hub // A handle to the Hub that instantiated this wallet. + PublicKey []byte // The wallet's public key (used for communication and identification, not signing!) + + lock sync.Mutex // Lock that gates access to struct fields and communication with the card + card *pcsc.Card // A handle to the smartcard interface for the wallet. + session *Session // The secure communication session with the card + log log.Logger // Contextual logger to tag the base with its id + + deriveNextPaths []accounts.DerivationPath // Next derivation paths for account auto-discovery (multiple bases supported) + deriveNextAddrs []common.Address // Next derived account addresses for auto-discovery (multiple bases supported) + 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 +} + +// NewWallet constructs and returns a new Wallet instance. +func NewWallet(hub *Hub, card *pcsc.Card) *Wallet { + wallet := &Wallet{ + Hub: hub, + card: card, + } + return wallet +} + +// transmit sends an APDU to the smartcard and receives and decodes the response. +// It automatically handles requests by the card to fetch the return data separately, +// and returns an error if the response status code is not success. +func transmit(card *pcsc.Card, command *commandAPDU) (*responseAPDU, error) { + data, err := command.serialize() + if err != nil { + return nil, err + } + + responseData, _, err := card.Transmit(data) + if err != nil { + return nil, err + } + + response := new(responseAPDU) + if err = response.deserialize(responseData); err != nil { + return nil, err + } + + // Are we being asked to fetch the response separately? + if response.Sw1 == sw1GetResponse && (command.Cla != claISO7816 || command.Ins != insGetResponse) { + return transmit(card, &commandAPDU{ + Cla: claISO7816, + Ins: insGetResponse, + P1: 0, + P2: 0, + Data: nil, + Le: response.Sw2, + }) + } + + if response.Sw1 != sw1Ok { + return nil, fmt.Errorf("unexpected insecure response status Cla=0x%x, Ins=0x%x, Sw=0x%x%x", command.Cla, command.Ins, response.Sw1, response.Sw2) + } + + return response, nil +} + +// applicationInfo encodes information about the smartcard application - its +// instance UID and public key. +type applicationInfo struct { + InstanceUID []byte `asn1:"tag:15"` + PublicKey []byte `asn1:"tag:0"` +} + +// connect connects to the wallet application and establishes a secure channel with it. +// must be called before any other interaction with the wallet. +func (w *Wallet) connect() error { + w.lock.Lock() + defer w.lock.Unlock() + + appinfo, err := w.doselect() + if err != nil { + return err + } + + channel, err := NewSecureChannelSession(w.card, appinfo.PublicKey) + if err != nil { + return err + } + + w.PublicKey = appinfo.PublicKey + w.log = log.New("url", w.URL()) + w.session = &Session{ + Wallet: w, + Channel: channel, + } + return nil +} + +// doselect is an internal (unlocked) function to send a SELECT APDU to the card. +func (w *Wallet) doselect() (*applicationInfo, error) { + response, err := transmit(w.card, &commandAPDU{ + Cla: claISO7816, + Ins: insSelect, + P1: 4, + P2: 0, + Data: appletAID, + }) + if err != nil { + return nil, err + } + + appinfo := new(applicationInfo) + if _, err := asn1.UnmarshalWithParams(response.Data, appinfo, "tag:4"); err != nil { + return nil, err + } + return appinfo, nil +} + +// ping checks the card's status and returns an error if unsuccessful. +func (w *Wallet) ping() error { + w.lock.Lock() + defer w.lock.Unlock() + + // We can't ping if not paired + if !w.session.paired() { + return nil + } + if _, err := w.session.walletStatus(); err != nil { + return err + } + return nil +} + +// release releases any resources held by an open wallet instance. +func (w *Wallet) release() error { + if w.session != nil { + return w.session.release() + } + return nil +} + +// pair is an internal (unlocked) function for establishing a new pairing +// with the wallet. +func (w *Wallet) pair(puk []byte) error { + if w.session.paired() { + return fmt.Errorf("wallet already paired") + } + pairing, err := w.session.pair(puk) + if err != nil { + return err + } + if err = w.Hub.setPairing(w, &pairing); err != nil { + return err + } + return w.session.authenticate(pairing) +} + +// Unpair deletes an existing wallet pairing. +func (w *Wallet) Unpair(pin []byte) error { + w.lock.Lock() + defer w.lock.Unlock() + + if !w.session.paired() { + return fmt.Errorf("wallet %x not paired", w.PublicKey) + } + if err := w.session.verifyPin(pin); err != nil { + return fmt.Errorf("failed to verify pin: %s", err) + } + if err := w.session.unpair(); err != nil { + return fmt.Errorf("failed to unpair: %s", err) + } + if err := w.Hub.setPairing(w, nil); err != nil { + return err + } + return nil +} + +// URL retrieves the canonical path under which this wallet is reachable. It is +// user by upper layers to define a sorting order over all wallets from multiple +// backends. +func (w *Wallet) URL() accounts.URL { + return accounts.URL{ + Scheme: w.Hub.scheme, + Path: fmt.Sprintf("%x", w.PublicKey[1:5]), // Byte #0 isn't unique; 1:5 covers << 64K cards, bump to 1:9 for << 4M + } +} + +// 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. +func (w *Wallet) Status() (string, error) { + w.lock.Lock() + defer w.lock.Unlock() + + // If the card is not paired, we can only wait + if !w.session.paired() { + return "Unpaired, waiting for pairing password", nil + } + // Yay, we have an encrypted session, retrieve the actual status + status, err := w.session.walletStatus() + if err != nil { + return fmt.Sprintf("Failed: %v", err), err + } + switch { + case !w.session.verified && status.PinRetryCount == 0 && status.PukRetryCount == 0: + return fmt.Sprintf("Bricked, waiting for full wipe"), nil + case !w.session.verified && status.PinRetryCount == 0: + return fmt.Sprintf("Blocked, waiting for PUK (%d attempts left) and new PIN", status.PukRetryCount), nil + case !w.session.verified: + return fmt.Sprintf("Locked, waiting for PIN (%d attempts left)", status.PinRetryCount), nil + case !status.Initialized: + return fmt.Sprintf("Empty, waiting for initialization"), nil + default: + return fmt.Sprintf("Online"), nil + } +} + +// 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 +// wallets and/or to access derivation seeds. +// +// The passphrase parameter may or may not be used by the implementation of a +// particular wallet instance. The reason there is no passwordless open method +// is to strive towards a uniform wallet handling, oblivious to the different +// backend providers. +// +// Please note, if you open a wallet, you must close it to release any allocated +// resources (especially important when working with hardware wallets). +func (w *Wallet) Open(passphrase string) error { + w.lock.Lock() + defer w.lock.Unlock() + + // If the session is already open, bail out + if w.session.verified { + return ErrAlreadyOpen + } + // If the smart card is not yet paired, attempt to do so either from a previous + // pairing key or form the supplied PUK code. + if !w.session.paired() { + // If a previous pairing exists, only ever try to use that + if pairing := w.Hub.pairing(w); pairing != nil { + if err := w.session.authenticate(*pairing); err != nil { + return fmt.Errorf("failed to authenticate card %x: %s", w.PublicKey[:4], err) + } + // Pairing still ok, fall through to PIN checks + } else { + // If no passphrase was supplied, request the PUK from the user + if passphrase == "" { + return ErrPairingPasswordNeeded + } + // Attempt to pair the smart card with the user supplied PUK + if err := w.pair([]byte(passphrase)); err != nil { + return err + } + // Pairing succeeded, fall through to PIN checks. This will of course fail, + // but we can't return ErrPINNeeded directly here becase we don't know whether + // a PIN check or a PIN reset is needed. + passphrase = "" + } + } + // The smart card was successfully paired, retrieve its status to check whether + // PIN verification or unblocking is needed. + status, err := w.session.walletStatus() + if err != nil { + return err + } + // Request the appropriate next authentication data, or use the one supplied + switch { + case passphrase == "" && status.PinRetryCount > 0: + return ErrPINNeeded + case passphrase == "": + return ErrPINUnblockNeeded + case status.PinRetryCount > 0: + if !regexp.MustCompile(`^[0-9]{6,}$`).MatchString(passphrase) { + w.log.Error("PIN needs to be at least 6 digits") + return ErrPINNeeded + } + if err := w.session.verifyPin([]byte(passphrase)); err != nil { + return err + } + default: + if !regexp.MustCompile(`^[0-9]{12,}$`).MatchString(passphrase) { + w.log.Error("PUK needs to be at least 12 digits") + return ErrPINUnblockNeeded + } + if err := w.session.unblockPin([]byte(passphrase)); err != nil { + return err + } + } + // Smart card paired and unlocked, initialize and register + w.deriveReq = make(chan chan struct{}) + w.deriveQuit = make(chan chan error) + + 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 +} + +// Close stops and closes the wallet, freeing any resources. +func (w *Wallet) Close() error { + // Ensure the wallet was opened + w.lock.Lock() + dQuit := w.deriveQuit + w.lock.Unlock() + + // 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.lock.Lock() + defer w.lock.Unlock() + + w.deriveQuit = nil + w.deriveReq = nil + + if err := w.release(); err != nil { + return err + } + return derr +} + +// selfDerive is an account derivation loop that upon request attempts to find +// new non-zero accounts. +func (w *Wallet) selfDerive() { + w.log.Debug("Smart card wallet self-derivation started") + defer w.log.Debug("Smart card 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.lock.Lock() + if w.session == nil || w.deriveChain == nil { + w.lock.Unlock() + reqc <- struct{}{} + continue + } + pairing := w.Hub.pairing(w) + + // Device lock obtained, derive the next batch of accounts + var ( + paths []accounts.DerivationPath + nextAcc accounts.Account + + nextPaths = append([]accounts.DerivationPath{}, w.deriveNextPaths...) + nextAddrs = append([]common.Address{}, w.deriveNextAddrs...) + + context = context.Background() + ) + for i := 0; i < len(nextAddrs); i++ { + for empty := false; !empty; { + // Retrieve the next derived Ethereum account + if nextAddrs[i] == (common.Address{}) { + if nextAcc, err = w.session.derive(nextPaths[i]); err != nil { + w.log.Warn("Smartcard wallet account derivation failed", "err", err) + break + } + nextAddrs[i] = nextAcc.Address + } + // Check the account's status against the current chain state + var ( + balance *big.Int + nonce uint64 + ) + balance, err = w.deriveChain.BalanceAt(context, nextAddrs[i], nil) + if err != nil { + w.log.Warn("Smartcard wallet balance retrieval failed", "err", err) + break + } + nonce, err = w.deriveChain.NonceAt(context, nextAddrs[i], nil) + if err != nil { + w.log.Warn("Smartcard wallet nonce retrieval failed", "err", err) + break + } + // If the next account is empty, stop self-derivation, but add for the last base path + if balance.Sign() == 0 && nonce == 0 { + empty = true + if i < len(nextAddrs)-1 { + break + } + } + // We've just self-derived a new account, start tracking it locally + path := make(accounts.DerivationPath, len(nextPaths[i])) + copy(path[:], nextPaths[i][:]) + paths = append(paths, path) + + // Display a log message to the user for new (or previously empty accounts) + if _, known := pairing.Accounts[nextAddrs[i]]; !known || !empty || nextAddrs[i] != w.deriveNextAddrs[i] { + w.log.Info("Smartcard wallet discovered new account", "address", nextAddrs[i], "path", path, "balance", balance, "nonce", nonce) + } + pairing.Accounts[nextAddrs[i]] = path + + // Fetch the next potential account + if !empty { + nextAddrs[i] = common.Address{} + nextPaths[i][len(nextPaths[i])-1]++ + } + } + } + // If there are new accounts, write them out + if len(paths) > 0 { + err = w.Hub.setPairing(w, pairing) + } + // Shift the self-derivation forward + w.deriveNextAddrs = nextAddrs + w.deriveNextPaths = nextPaths + + // Self derivation complete, release device lock + w.lock.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("Smartcard wallet self-derivation failed", "err", err) + errc = <-w.deriveQuit + } + errc <- err +} + +// Accounts retrieves the list of signing accounts the wallet is currently aware +// of. For hierarchical deterministic wallets, the list will not be exhaustive, +// rather only contain the accounts explicitly pinned during account derivation. +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 + } + + w.lock.Lock() + defer w.lock.Unlock() + + if pairing := w.Hub.pairing(w); pairing != nil { + ret := make([]accounts.Account, 0, len(pairing.Accounts)) + for address, path := range pairing.Accounts { + ret = append(ret, w.makeAccount(address, path)) + } + sort.Sort(accounts.AccountsByURL(ret)) + return ret + } + return nil +} + +func (w *Wallet) makeAccount(address common.Address, path accounts.DerivationPath) accounts.Account { + return accounts.Account{ + Address: address, + URL: accounts.URL{ + Scheme: w.Hub.scheme, + Path: fmt.Sprintf("%x/%s", w.PublicKey[1:3], path.String()), + }, + } +} + +// Contains returns whether an account is part of this particular wallet or not. +func (w *Wallet) Contains(account accounts.Account) bool { + if pairing := w.Hub.pairing(w); pairing != nil { + _, ok := pairing.Accounts[account.Address] + return ok + } + return false +} + +// Initialize installs a keypair generated from the provided key into the wallet. +func (w *Wallet) Initialize(seed []byte) error { + go w.selfDerive() + // DO NOT lock at this stage, as the initialize + // function relies on Status() + return w.session.initialize(seed) +} + +// Derive attempts to explicitly derive a hierarchical deterministic account at +// the specified derivation path. If requested, the derived account will be added +// to the wallet's tracked account list. +func (w *Wallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Account, error) { + w.lock.Lock() + defer w.lock.Unlock() + + account, err := w.session.derive(path) + if err != nil { + return accounts.Account{}, err + } + + if pin { + pairing := w.Hub.pairing(w) + pairing.Accounts[account.Address] = path + if err := w.Hub.setPairing(w, pairing); err != nil { + return accounts.Account{}, err + } + } + + return account, nil +} + +// SelfDerive sets a base account derivation path from which the wallet attempts +// to discover non zero accounts and automatically add them to list of tracked +// accounts. +// +// Note, self derivaton will increment the last component of the specified path +// opposed to decending into a child path to allow discovering accounts starting +// from non zero components. +// +// Some hardware wallets switched derivation paths through their evolution, so +// this method supports providing multiple bases to discover old user accounts +// too. Only the last base will be used to derive the next empty account. +// +// You can disable automatic account discovery by calling SelfDerive with a nil +// chain state reader. +func (w *Wallet) SelfDerive(bases []accounts.DerivationPath, chain ethereum.ChainStateReader) { + w.lock.Lock() + defer w.lock.Unlock() + + w.deriveNextPaths = make([]accounts.DerivationPath, len(bases)) + for i, base := range bases { + w.deriveNextPaths[i] = make(accounts.DerivationPath, len(base)) + copy(w.deriveNextPaths[i][:], base[:]) + } + w.deriveNextAddrs = make([]common.Address, len(bases)) + w.deriveChain = chain +} + +// SignData requests the wallet to sign the hash of the given data. +// +// It looks up the account specified either solely via its address contained within, +// or optionally with the aid of any location metadata from the embedded URL field. +// +// If the wallet requires additional authentication to sign the request (e.g. +// a password to decrypt the account, or a PIN code o verify the transaction), +// an AuthNeededError instance will be returned, containing infos for the user +// about which fields or actions are needed. The user may retry by providing +// the needed details via SignDataWithPassphrase, or by other means (e.g. unlock +// the account in a keystore). +func (w *Wallet) SignData(account accounts.Account, mimeType string, data []byte) ([]byte, error) { + return w.signHash(account, crypto.Keccak256(data)) +} + +func (w *Wallet) signHash(account accounts.Account, hash []byte) ([]byte, error) { + w.lock.Lock() + defer w.lock.Unlock() + + path, err := w.findAccountPath(account) + if err != nil { + return nil, err + } + + return w.session.sign(path, hash) +} + +// SignTx requests the wallet to sign the given transaction. +// +// It looks up the account specified either solely via its address contained within, +// or optionally with the aid of any location metadata from the embedded URL field. +// +// If the wallet requires additional authentication to sign the request (e.g. +// a password to decrypt the account, or a PIN code o verify the transaction), +// an AuthNeededError instance will be returned, containing infos for the user +// about which fields or actions are needed. The user may retry by providing +// the needed details via SignTxWithPassphrase, or by other means (e.g. unlock +// the account in a keystore). +func (w *Wallet) SignTx(account accounts.Account, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + signer := types.NewEIP155Signer(chainID) + hash := signer.Hash(tx) + sig, err := w.signHash(account, hash[:]) + if err != nil { + return nil, err + } + return tx.WithSignature(signer, sig) +} + +// SignDataWithPassphrase requests the wallet to sign the given hash with the +// given passphrase as extra authentication information. +// +// It looks up the account specified either solely via its address contained within, +// or optionally with the aid of any location metadata from the embedded URL field. +func (w *Wallet) SignDataWithPassphrase(account accounts.Account, passphrase, mimeType string, data []byte) ([]byte, error) { + return w.signHashWithPassphrase(account, passphrase, crypto.Keccak256(data)) +} + +func (w *Wallet) signHashWithPassphrase(account accounts.Account, passphrase string, hash []byte) ([]byte, error) { + if !w.session.verified { + if err := w.Open(passphrase); err != nil { + return nil, err + } + } + + return w.signHash(account, hash) +} + +// SignText requests the wallet to sign the hash of a given piece of data, prefixed +// by the Ethereum prefix scheme +// It looks up the account specified either solely via its address contained within, +// or optionally with the aid of any location metadata from the embedded URL field. +// +// If the wallet requires additional authentication to sign the request (e.g. +// a password to decrypt the account, or a PIN code o verify the transaction), +// an AuthNeededError instance will be returned, containing infos for the user +// about which fields or actions are needed. The user may retry by providing +// the needed details via SignHashWithPassphrase, or by other means (e.g. unlock +// the account in a keystore). +func (w *Wallet) SignText(account accounts.Account, text []byte) ([]byte, error) { + return w.signHash(account, accounts.TextHash(text)) +} + +// SignTextWithPassphrase implements accounts.Wallet, attempting to sign the +// given hash with the given account using passphrase as extra authentication +func (w *Wallet) SignTextWithPassphrase(account accounts.Account, passphrase string, text []byte) ([]byte, error) { + return w.signHashWithPassphrase(account, passphrase, crypto.Keccak256(accounts.TextHash(text))) +} + +// SignTxWithPassphrase requests the wallet to sign the given transaction, with the +// given passphrase as extra authentication information. +// +// It looks up the account specified either solely via its address contained within, +// or optionally with the aid of any location metadata from the embedded URL field. +func (w *Wallet) SignTxWithPassphrase(account accounts.Account, passphrase string, tx *types.Transaction, chainID *big.Int) (*types.Transaction, error) { + if !w.session.verified { + if err := w.Open(passphrase); err != nil { + return nil, err + } + } + return w.SignTx(account, tx, chainID) +} + +// findAccountPath returns the derivation path for the provided account. +// It first checks for the address in the list of pinned accounts, and if it is +// not found, attempts to parse the derivation path from the account's URL. +func (w *Wallet) findAccountPath(account accounts.Account) (accounts.DerivationPath, error) { + pairing := w.Hub.pairing(w) + if path, ok := pairing.Accounts[account.Address]; ok { + return path, nil + } + + // Look for the path in the URL + if account.URL.Scheme != w.Hub.scheme { + return nil, fmt.Errorf("scheme %s does not match wallet scheme %s", account.URL.Scheme, w.Hub.scheme) + } + + parts := strings.SplitN(account.URL.Path, "/", 2) + if len(parts) != 2 { + return nil, fmt.Errorf("invalid URL format: %s", account.URL) + } + + if parts[0] != fmt.Sprintf("%x", w.PublicKey[1:3]) { + return nil, fmt.Errorf("URL %s is not for this wallet", account.URL) + } + + return accounts.ParseDerivationPath(parts[1]) +} + +// Session represents a secured communication session with the wallet. +type Session struct { + Wallet *Wallet // A handle to the wallet that opened the session + Channel *SecureChannelSession // A secure channel for encrypted messages + verified bool // Whether the pin has been verified in this session. +} + +// pair establishes a new pairing over this channel, using the provided secret. +func (s *Session) pair(secret []byte) (smartcardPairing, error) { + err := s.Channel.Pair(secret) + if err != nil { + return smartcardPairing{}, err + } + + return smartcardPairing{ + PublicKey: s.Wallet.PublicKey, + PairingIndex: s.Channel.PairingIndex, + PairingKey: s.Channel.PairingKey, + Accounts: make(map[common.Address]accounts.DerivationPath), + }, nil +} + +// unpair deletes an existing pairing. +func (s *Session) unpair() error { + if !s.verified { + return fmt.Errorf("unpair requires that the PIN be verified") + } + return s.Channel.Unpair() +} + +// verifyPin unlocks a wallet with the provided pin. +func (s *Session) verifyPin(pin []byte) error { + if _, err := s.Channel.transmitEncrypted(claSCWallet, insVerifyPin, 0, 0, pin); err != nil { + return err + } + s.verified = true + return nil +} + +// unblockPin unblocks a wallet with the provided puk and resets the pin to the +// new one specified. +func (s *Session) unblockPin(pukpin []byte) error { + if _, err := s.Channel.transmitEncrypted(claSCWallet, insUnblockPin, 0, 0, pukpin); err != nil { + return err + } + s.verified = true + return nil +} + +// release releases resources associated with the channel. +func (s *Session) release() error { + return s.Wallet.card.Disconnect(pcsc.LeaveCard) +} + +// paired returns true if a valid pairing exists. +func (s *Session) paired() bool { + return s.Channel.PairingKey != nil +} + +// authenticate uses an existing pairing to establish a secure channel. +func (s *Session) authenticate(pairing smartcardPairing) error { + if !bytes.Equal(s.Wallet.PublicKey, pairing.PublicKey) { + return fmt.Errorf("cannot pair using another wallet's pairing; %x != %x", s.Wallet.PublicKey, pairing.PublicKey) + } + s.Channel.PairingKey = pairing.PairingKey + s.Channel.PairingIndex = pairing.PairingIndex + return s.Channel.Open() +} + +// walletStatus describes a smartcard wallet's status information. +type walletStatus struct { + PinRetryCount int // Number of remaining PIN retries + PukRetryCount int // Number of remaining PUK retries + Initialized bool // Whether the card has been initialized with a private key +} + +// walletStatus fetches the wallet's status from the card. +func (s *Session) walletStatus() (*walletStatus, error) { + response, err := s.Channel.transmitEncrypted(claSCWallet, insStatus, statusP1WalletStatus, 0, nil) + if err != nil { + return nil, err + } + + status := new(walletStatus) + if _, err := asn1.UnmarshalWithParams(response.Data, status, "tag:3"); err != nil { + return nil, err + } + return status, nil +} + +// derivationPath fetches the wallet's current derivation path from the card. +//lint:ignore U1000 needs to be added to the console interface +func (s *Session) derivationPath() (accounts.DerivationPath, error) { + response, err := s.Channel.transmitEncrypted(claSCWallet, insStatus, statusP1Path, 0, nil) + if err != nil { + return nil, err + } + buf := bytes.NewReader(response.Data) + path := make(accounts.DerivationPath, len(response.Data)/4) + return path, binary.Read(buf, binary.BigEndian, &path) +} + +// initializeData contains data needed to initialize the smartcard wallet. +type initializeData struct { + PublicKey []byte `asn1:"tag:0"` + PrivateKey []byte `asn1:"tag:1"` + ChainCode []byte `asn1:"tag:2"` +} + +// initialize initializes the card with new key data. +func (s *Session) initialize(seed []byte) error { + // Check that the wallet isn't currently initialized, + // otherwise the key would be overwritten. + status, err := s.Wallet.Status() + if err != nil { + return err + } + if status == "Online" { + return fmt.Errorf("card is already initialized, cowardly refusing to proceed") + } + + s.Wallet.lock.Lock() + defer s.Wallet.lock.Unlock() + + // HMAC the seed to produce the private key and chain code + mac := hmac.New(sha512.New, []byte("Bitcoin seed")) + mac.Write(seed) + seed = mac.Sum(nil) + + key, err := crypto.ToECDSA(seed[:32]) + if err != nil { + return err + } + + id := initializeData{} + id.PublicKey = crypto.FromECDSAPub(&key.PublicKey) + id.PrivateKey = seed[:32] + id.ChainCode = seed[32:] + data, err := asn1.Marshal(id) + if err != nil { + return err + } + + // Nasty hack to force the top-level struct tag to be context-specific + data[0] = 0xA1 + + _, err = s.Channel.transmitEncrypted(claSCWallet, insLoadKey, 0x02, 0, data) + return err +} + +// derive derives a new HD key path on the card. +func (s *Session) derive(path accounts.DerivationPath) (accounts.Account, error) { + startingPoint, path, err := derivationpath.Decode(path.String()) + if err != nil { + return accounts.Account{}, err + } + + var p1 uint8 + switch startingPoint { + case derivationpath.StartingPointMaster: + p1 = P1DeriveKeyFromMaster + case derivationpath.StartingPointParent: + p1 = P1DeriveKeyFromParent + case derivationpath.StartingPointCurrent: + p1 = P1DeriveKeyFromCurrent + default: + return accounts.Account{}, fmt.Errorf("invalid startingPoint %d", startingPoint) + } + + data := new(bytes.Buffer) + for _, segment := range path { + if err := binary.Write(data, binary.BigEndian, segment); err != nil { + return accounts.Account{}, err + } + } + + _, err = s.Channel.transmitEncrypted(claSCWallet, insDeriveKey, p1, 0, data.Bytes()) + if err != nil { + return accounts.Account{}, err + } + + response, err := s.Channel.transmitEncrypted(claSCWallet, insSign, 0, 0, DerivationSignatureHash[:]) + if err != nil { + return accounts.Account{}, err + } + + sigdata := new(signatureData) + if _, err := asn1.UnmarshalWithParams(response.Data, sigdata, "tag:0"); err != nil { + return accounts.Account{}, err + } + rbytes, sbytes := sigdata.Signature.R.Bytes(), sigdata.Signature.S.Bytes() + sig := make([]byte, 65) + copy(sig[32-len(rbytes):32], rbytes) + copy(sig[64-len(sbytes):64], sbytes) + + if err := confirmPublicKey(sig, sigdata.PublicKey); err != nil { + return accounts.Account{}, err + } + pub, err := crypto.UnmarshalPubkey(sigdata.PublicKey) + if err != nil { + return accounts.Account{}, err + } + return s.Wallet.makeAccount(crypto.PubkeyToAddress(*pub), path), nil +} + +// keyExport contains information on an exported keypair. +//lint:ignore U1000 needs to be added to the console interface +type keyExport struct { + PublicKey []byte `asn1:"tag:0"` + PrivateKey []byte `asn1:"tag:1,optional"` +} + +// publicKey returns the public key for the current derivation path. +//lint:ignore U1000 needs to be added to the console interface +func (s *Session) publicKey() ([]byte, error) { + response, err := s.Channel.transmitEncrypted(claSCWallet, insExportKey, exportP1Any, exportP2Pubkey, nil) + if err != nil { + return nil, err + } + keys := new(keyExport) + if _, err := asn1.UnmarshalWithParams(response.Data, keys, "tag:1"); err != nil { + return nil, err + } + return keys.PublicKey, nil +} + +// signatureData contains information on a signature - the signature itself and +// the corresponding public key. +type signatureData struct { + PublicKey []byte `asn1:"tag:0"` + Signature struct { + R *big.Int + S *big.Int + } +} + +// sign asks the card to sign a message, and returns a valid signature after +// recovering the v value. +func (s *Session) sign(path accounts.DerivationPath, hash []byte) ([]byte, error) { + startTime := time.Now() + _, err := s.derive(path) + if err != nil { + return nil, err + } + deriveTime := time.Now() + + response, err := s.Channel.transmitEncrypted(claSCWallet, insSign, signP1PrecomputedHash, signP2OnlyBlock, hash) + if err != nil { + return nil, err + } + sigdata := new(signatureData) + if _, err := asn1.UnmarshalWithParams(response.Data, sigdata, "tag:0"); err != nil { + return nil, err + } + // Serialize the signature + rbytes, sbytes := sigdata.Signature.R.Bytes(), sigdata.Signature.S.Bytes() + sig := make([]byte, 65) + copy(sig[32-len(rbytes):32], rbytes) + copy(sig[64-len(sbytes):64], sbytes) + + // Recover the V value. + sig, err = makeRecoverableSignature(hash, sig, sigdata.PublicKey) + if err != nil { + return nil, err + } + log.Debug("Signed using smartcard", "deriveTime", deriveTime.Sub(startTime), "signingTime", time.Since(deriveTime)) + + return sig, nil +} + +// confirmPublicKey confirms that the given signature belongs to the specified key. +func confirmPublicKey(sig, pubkey []byte) error { + _, err := makeRecoverableSignature(DerivationSignatureHash[:], sig, pubkey) + return err +} + +// makeRecoverableSignature uses a signature and an expected public key to +// recover the v value and produce a recoverable signature. +func makeRecoverableSignature(hash, sig, expectedPubkey []byte) ([]byte, error) { + var libraryError error + for v := 0; v < 2; v++ { + sig[64] = byte(v) + if pubkey, err := crypto.Ecrecover(hash, sig); err == nil { + if bytes.Equal(pubkey, expectedPubkey) { + return sig, nil + } + } else { + libraryError = err + } + } + if libraryError != nil { + return nil, libraryError + } + return nil, ErrPubkeyMismatch +} diff --git a/accounts/sort.go b/accounts/sort.go new file mode 100644 index 000000000000..f46762114af4 --- /dev/null +++ b/accounts/sort.go @@ -0,0 +1,31 @@ +// Copyright 2018 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 accounts + +// AccountsByURL implements sort.Interface for []Account based on the URL field. +type AccountsByURL []Account + +func (a AccountsByURL) Len() int { return len(a) } +func (a AccountsByURL) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a AccountsByURL) Less(i, j int) bool { return a[i].URL.Cmp(a[j].URL) < 0 } + +// WalletsByURL implements sort.Interface for []Wallet based on the URL field. +type WalletsByURL []Wallet + +func (w WalletsByURL) Len() int { return len(w) } +func (w WalletsByURL) Swap(i, j int) { w[i], w[j] = w[j], w[i] } +func (w WalletsByURL) Less(i, j int) bool { return w[i].URL().Cmp(w[j].URL()) < 0 } diff --git a/accounts/url_test.go b/accounts/url_test.go index 802772871947..bd6f35fa2a0e 100644 --- a/accounts/url_test.go +++ b/accounts/url_test.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2018 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 diff --git a/accounts/usbwallet/hub.go b/accounts/usbwallet/hub.go index a12488cb8a8c..23be98a08483 100644 --- a/accounts/usbwallet/hub.go +++ b/accounts/usbwallet/hub.go @@ -20,12 +20,13 @@ import ( "errors" "runtime" "sync" + "sync/atomic" "time" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/karalabe/hid" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/karalabe/usb" ) // LedgerScheme is the protocol scheme prefixing account and wallet URLs. @@ -64,21 +65,41 @@ type Hub struct { // TODO(karalabe): remove if hotplug lands on Windows commsPend int // Number of operations blocking enumeration commsLock sync.Mutex // Lock protecting the pending counter and enumeration + enumFails uint32 // Number of times enumeration has failed } // NewLedgerHub creates a new hardware wallet manager for Ledger devices. func NewLedgerHub() (*Hub, error) { - return newHub(LedgerScheme, 0x2c97, []uint16{0x0000 /* Ledger Blue */, 0x0001 /* Ledger Nano S */}, 0xffa0, 0, newLedgerDriver) + return newHub(LedgerScheme, 0x2c97, []uint16{ + // Original product IDs + 0x0000, /* Ledger Blue */ + 0x0001, /* Ledger Nano S */ + 0x0004, /* Ledger Nano X */ + + // Upcoming product IDs: https://www.ledger.com/2019/05/17/windows-10-update-sunsetting-u2f-tunnel-transport-for-ledger-devices/ + 0x0015, /* HID + U2F + WebUSB Ledger Blue */ + 0x1015, /* HID + U2F + WebUSB Ledger Nano S */ + 0x4015, /* HID + U2F + WebUSB Ledger Nano X */ + 0x0011, /* HID + WebUSB Ledger Blue */ + 0x1011, /* HID + WebUSB Ledger Nano S */ + 0x4011, /* HID + WebUSB Ledger Nano X */ + }, 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) +// NewTrezorHubWithHID creates a new hardware wallet manager for Trezor devices. +func NewTrezorHubWithHID() (*Hub, error) { + return newHub(TrezorScheme, 0x534c, []uint16{0x0001 /* Trezor HID */}, 0xff00, 0, newTrezorDriver) +} + +// NewTrezorHubWithWebUSB creates a new hardware wallet manager for Trezor devices with +// firmware version > 1.8.0 +func NewTrezorHubWithWebUSB() (*Hub, error) { + return newHub(TrezorScheme, 0x1209, []uint16{0x53c1 /* Trezor WebUSB */}, 0xffff /* No usage id on webusb, don't match unset (0) */, 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() { + if !usb.Supported() { return nil, errors.New("unsupported platform") } hub := &Hub{ @@ -119,8 +140,12 @@ func (hub *Hub) refreshWallets() { if elapsed < refreshThrottling { return } + // If USB enumeration is continually failing, don't keep trying indefinitely + if atomic.LoadUint32(&hub.enumFails) > 2 { + return + } // Retrieve the current list of USB wallet devices - var devices []hid.DeviceInfo + var devices []usb.DeviceInfo if runtime.GOOS == "linux" { // hidapi on Linux opens the device during enumeration to retrieve some infos, @@ -135,8 +160,22 @@ func (hub *Hub) refreshWallets() { return } } - for _, info := range hid.Enumerate(hub.vendorID, 0) { + infos, err := usb.Enumerate(hub.vendorID, 0) + if err != nil { + failcount := atomic.AddUint32(&hub.enumFails, 1) + if runtime.GOOS == "linux" { + // See rationale before the enumeration why this is needed and only on Linux. + hub.commsLock.Unlock() + } + log.Error("Failed to enumerate USB devices", "hub", hub.scheme, + "vendor", hub.vendorID, "failcount", failcount, "err", err) + return + } + atomic.StoreUint32(&hub.enumFails, 0) + + for _, info := range infos { for _, id := range hub.productIDs { + // Windows and Macos use UsageID matching, Linux uses Interface matching if info.ProductID == id && (info.UsagePage == hub.usageID || info.Interface == hub.endpointID) { devices = append(devices, info) break @@ -150,8 +189,10 @@ func (hub *Hub) refreshWallets() { // Transform the current list of wallets into the new one hub.stateLock.Lock() - wallets := make([]accounts.Wallet, 0, len(devices)) - events := []accounts.WalletEvent{} + var ( + wallets = make([]accounts.Wallet, 0, len(devices)) + events []accounts.WalletEvent + ) for _, device := range devices { url := accounts.URL{Scheme: hub.scheme, Path: device.Path} diff --git a/accounts/usbwallet/internal/trezor/messages.pb.go b/accounts/usbwallet/internal/trezor/messages.pb.go deleted file mode 100644 index 15bb6fb73bc7..000000000000 --- a/accounts/usbwallet/internal/trezor/messages.pb.go +++ /dev/null @@ -1,3081 +0,0 @@ -// 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 deleted file mode 100644 index 8cb9c8cc25ca..000000000000 --- a/accounts/usbwallet/internal/trezor/messages.proto +++ /dev/null @@ -1,905 +0,0 @@ -// 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. - -syntax = "proto2"; - -/** - * 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 deleted file mode 100644 index 80cc75efc420..000000000000 --- a/accounts/usbwallet/internal/trezor/trezor.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// This file contains the implementation for interacting with the Trezor hardware -// wallets. The wire protocol spec can be found on the SatoshiLabs website: -// https://doc.satoshilabs.com/trezor-tech/api-protobuf.html - -//go:generate protoc --go_out=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 number. -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 deleted file mode 100644 index 25b7672d231c..000000000000 --- a/accounts/usbwallet/internal/trezor/types.pb.go +++ /dev/null @@ -1,1333 +0,0 @@ -// 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 deleted file mode 100644 index acbe79e3ffd0..000000000000 --- a/accounts/usbwallet/internal/trezor/types.proto +++ /dev/null @@ -1,278 +0,0 @@ -// 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. - -syntax = "proto2"; - -/** - * 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 index 528b0c99c00e..64eae64f689a 100644 --- a/accounts/usbwallet/ledger.go +++ b/accounts/usbwallet/ledger.go @@ -28,12 +28,13 @@ import ( "io" "math/big" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" ) // ledgerOpcode is an enumeration encoding the supported Ledger opcodes. @@ -161,7 +162,8 @@ func (w *ledgerDriver) SignTx(path accounts.DerivationPath, tx *types.Transactio 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 { + if chainID != nil && w.version[0] <= 1 && w.version[2] <= 2 { + //lint:ignore ST1005 brand name displayed on the console 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 @@ -341,7 +343,7 @@ func (w *ledgerDriver) ledgerSign(derivationPath []uint32, tx *types.Transaction op = ledgerP1ContTransactionData } // Extract the Ethereum signature and do a sanity validation - if len(reply) != 65 { + if len(reply) != crypto.SignatureLength { return common.Address{}, nil, errors.New("reply lacks signature") } signature := append(reply[1:], reply[0]) diff --git a/accounts/usbwallet/trezor.go b/accounts/usbwallet/trezor.go index 10cc95034052..1892097baf65 100644 --- a/accounts/usbwallet/trezor.go +++ b/accounts/usbwallet/trezor.go @@ -27,12 +27,12 @@ import ( "io" "math/big" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/accounts/usbwallet/internal/trezor" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/usbwallet/trezor" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" "github.com/golang/protobuf/proto" ) @@ -41,6 +41,9 @@ import ( // encoded passphrase. var ErrTrezorPINNeeded = errors.New("trezor: pin needed") +// ErrTrezorPassphraseNeeded is returned if opening the trezor requires a passphrase +var ErrTrezorPassphraseNeeded = errors.New("trezor: passphrase 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. @@ -48,12 +51,13 @@ 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 + 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 + passphrasewait bool // Flags whether the device is waiting for passphrase 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. @@ -79,19 +83,21 @@ func (w *trezorDriver) Status() (string, error) { } // Open implements usbwallet.driver, attempting to initialize the connection to -// the Trezor hardware wallet. Initializing the Trezor is a two phase operation: +// the Trezor hardware wallet. Initializing the Trezor is a two or three 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 +// features. This phase is invoked if 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). +// * If needed the device will ask for passphrase which will require calling +// open again with the actual passphrase (3rd phase) 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 passphrase == "" && !w.passphrasewait { // If we're already waiting for a PIN entry, insta-return if w.pinwait { return ErrTrezorPINNeeded @@ -104,26 +110,46 @@ func (w *trezorDriver) Open(device io.ReadWriter, passphrase string) error { 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 + // Do a manual ping, forcing the device to ask for its PIN and Passphrase askPin := true - res, err := w.trezorExchange(&trezor.Ping{PinProtection: &askPin}, new(trezor.PinMatrixRequest), new(trezor.Success)) + askPassphrase := true + res, err := w.trezorExchange(&trezor.Ping{PinProtection: &askPin, PassphraseProtection: &askPassphrase}, new(trezor.PinMatrixRequest), new(trezor.PassphraseRequest), 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 + switch res { + case 0: + w.pinwait = true + return ErrTrezorPINNeeded + case 1: + w.pinwait = false + w.passphrasewait = true + return ErrTrezorPassphraseNeeded + case 2: + return nil // 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 + if w.pinwait { + w.pinwait = false + res, err := w.trezorExchange(&trezor.PinMatrixAck{Pin: &passphrase}, new(trezor.Success), new(trezor.PassphraseRequest)) + if err != nil { + w.failure = err + return err + } + if res == 1 { + w.passphrasewait = true + return ErrTrezorPassphraseNeeded + } + } else if w.passphrasewait { + w.passphrasewait = false + if _, err := w.trezorExchange(&trezor.PassphraseAck{Passphrase: &passphrase}, new(trezor.Success)); err != nil { + w.failure = err + return err + } } + return nil } @@ -166,7 +192,13 @@ func (w *trezorDriver) trezorDerive(derivationPath []uint32) (common.Address, er if _, err := w.trezorExchange(&trezor.EthereumGetAddress{AddressN: derivationPath}, address); err != nil { return common.Address{}, err } - return common.BytesToAddress(address.GetAddress()), nil + if addr := address.GetAddressBin(); len(addr) > 0 { // Older firmwares use binary fomats + return common.BytesToAddress(addr), nil + } + if addr := address.GetAddressHex(); len(addr) > 0 { // Newer firmwares use hexadecimal fomats + return common.HexToAddress(addr), nil + } + return common.Address{}, errors.New("missing derived address") } // trezorSign sends the transaction to the Trezor wallet, and waits for the user @@ -185,7 +217,10 @@ func (w *trezorDriver) trezorSign(derivationPath []uint32, tx *types.Transaction DataLength: &length, } if to := tx.To(); to != nil { - request.To = (*to)[:] // Non contract deploy, set recipient explicitly + // Non contract deploy, set recipient explicitly + hex := to.Hex() + request.ToHex = &hex // Newer firmwares (old will ignore) + request.ToBin = (*to)[:] // Older firmwares (new will ignore) } if length > 1024 { // Send the data chunked if that was requested request.DataInitialChunk, data = data[:1024], data[1024:] diff --git a/accounts/usbwallet/trezor/messages-common.pb.go b/accounts/usbwallet/trezor/messages-common.pb.go new file mode 100644 index 000000000000..304bec0e360a --- /dev/null +++ b/accounts/usbwallet/trezor/messages-common.pb.go @@ -0,0 +1,811 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: messages-common.proto + +package trezor + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" +) + +// 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.ProtoPackageIsVersion3 // please upgrade the proto package + +type Failure_FailureType int32 + +const ( + Failure_Failure_UnexpectedMessage Failure_FailureType = 1 + Failure_Failure_ButtonExpected Failure_FailureType = 2 + Failure_Failure_DataError Failure_FailureType = 3 + Failure_Failure_ActionCancelled Failure_FailureType = 4 + Failure_Failure_PinExpected Failure_FailureType = 5 + Failure_Failure_PinCancelled Failure_FailureType = 6 + Failure_Failure_PinInvalid Failure_FailureType = 7 + Failure_Failure_InvalidSignature Failure_FailureType = 8 + Failure_Failure_ProcessError Failure_FailureType = 9 + Failure_Failure_NotEnoughFunds Failure_FailureType = 10 + Failure_Failure_NotInitialized Failure_FailureType = 11 + Failure_Failure_PinMismatch Failure_FailureType = 12 + Failure_Failure_FirmwareError Failure_FailureType = 99 +) + +var Failure_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", + 12: "Failure_PinMismatch", + 99: "Failure_FirmwareError", +} + +var Failure_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_PinMismatch": 12, + "Failure_FirmwareError": 99, +} + +func (x Failure_FailureType) Enum() *Failure_FailureType { + p := new(Failure_FailureType) + *p = x + return p +} + +func (x Failure_FailureType) String() string { + return proto.EnumName(Failure_FailureType_name, int32(x)) +} + +func (x *Failure_FailureType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Failure_FailureType_value, data, "Failure_FailureType") + if err != nil { + return err + } + *x = Failure_FailureType(value) + return nil +} + +func (Failure_FailureType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{1, 0} +} + +//* +// Type of button request +type ButtonRequest_ButtonRequestType int32 + +const ( + ButtonRequest_ButtonRequest_Other ButtonRequest_ButtonRequestType = 1 + ButtonRequest_ButtonRequest_FeeOverThreshold ButtonRequest_ButtonRequestType = 2 + ButtonRequest_ButtonRequest_ConfirmOutput ButtonRequest_ButtonRequestType = 3 + ButtonRequest_ButtonRequest_ResetDevice ButtonRequest_ButtonRequestType = 4 + ButtonRequest_ButtonRequest_ConfirmWord ButtonRequest_ButtonRequestType = 5 + ButtonRequest_ButtonRequest_WipeDevice ButtonRequest_ButtonRequestType = 6 + ButtonRequest_ButtonRequest_ProtectCall ButtonRequest_ButtonRequestType = 7 + ButtonRequest_ButtonRequest_SignTx ButtonRequest_ButtonRequestType = 8 + ButtonRequest_ButtonRequest_FirmwareCheck ButtonRequest_ButtonRequestType = 9 + ButtonRequest_ButtonRequest_Address ButtonRequest_ButtonRequestType = 10 + ButtonRequest_ButtonRequest_PublicKey ButtonRequest_ButtonRequestType = 11 + ButtonRequest_ButtonRequest_MnemonicWordCount ButtonRequest_ButtonRequestType = 12 + ButtonRequest_ButtonRequest_MnemonicInput ButtonRequest_ButtonRequestType = 13 + ButtonRequest_ButtonRequest_PassphraseType ButtonRequest_ButtonRequestType = 14 + ButtonRequest_ButtonRequest_UnknownDerivationPath ButtonRequest_ButtonRequestType = 15 +) + +var ButtonRequest_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", + 12: "ButtonRequest_MnemonicWordCount", + 13: "ButtonRequest_MnemonicInput", + 14: "ButtonRequest_PassphraseType", + 15: "ButtonRequest_UnknownDerivationPath", +} + +var ButtonRequest_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, + "ButtonRequest_MnemonicWordCount": 12, + "ButtonRequest_MnemonicInput": 13, + "ButtonRequest_PassphraseType": 14, + "ButtonRequest_UnknownDerivationPath": 15, +} + +func (x ButtonRequest_ButtonRequestType) Enum() *ButtonRequest_ButtonRequestType { + p := new(ButtonRequest_ButtonRequestType) + *p = x + return p +} + +func (x ButtonRequest_ButtonRequestType) String() string { + return proto.EnumName(ButtonRequest_ButtonRequestType_name, int32(x)) +} + +func (x *ButtonRequest_ButtonRequestType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(ButtonRequest_ButtonRequestType_value, data, "ButtonRequest_ButtonRequestType") + if err != nil { + return err + } + *x = ButtonRequest_ButtonRequestType(value) + return nil +} + +func (ButtonRequest_ButtonRequestType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{2, 0} +} + +//* +// Type of PIN request +type PinMatrixRequest_PinMatrixRequestType int32 + +const ( + PinMatrixRequest_PinMatrixRequestType_Current PinMatrixRequest_PinMatrixRequestType = 1 + PinMatrixRequest_PinMatrixRequestType_NewFirst PinMatrixRequest_PinMatrixRequestType = 2 + PinMatrixRequest_PinMatrixRequestType_NewSecond PinMatrixRequest_PinMatrixRequestType = 3 +) + +var PinMatrixRequest_PinMatrixRequestType_name = map[int32]string{ + 1: "PinMatrixRequestType_Current", + 2: "PinMatrixRequestType_NewFirst", + 3: "PinMatrixRequestType_NewSecond", +} + +var PinMatrixRequest_PinMatrixRequestType_value = map[string]int32{ + "PinMatrixRequestType_Current": 1, + "PinMatrixRequestType_NewFirst": 2, + "PinMatrixRequestType_NewSecond": 3, +} + +func (x PinMatrixRequest_PinMatrixRequestType) Enum() *PinMatrixRequest_PinMatrixRequestType { + p := new(PinMatrixRequest_PinMatrixRequestType) + *p = x + return p +} + +func (x PinMatrixRequest_PinMatrixRequestType) String() string { + return proto.EnumName(PinMatrixRequest_PinMatrixRequestType_name, int32(x)) +} + +func (x *PinMatrixRequest_PinMatrixRequestType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(PinMatrixRequest_PinMatrixRequestType_value, data, "PinMatrixRequest_PinMatrixRequestType") + if err != nil { + return err + } + *x = PinMatrixRequest_PinMatrixRequestType(value) + return nil +} + +func (PinMatrixRequest_PinMatrixRequestType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{4, 0} +} + +//* +// Response: Success of the previous request +// @end +type Success struct { + Message *string `protobuf:"bytes,1,opt,name=message" json:"message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_aaf30d059fdbc38d, []int{0} +} + +func (m *Success) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Success.Unmarshal(m, b) +} +func (m *Success) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Success.Marshal(b, m, deterministic) +} +func (m *Success) XXX_Merge(src proto.Message) { + xxx_messageInfo_Success.Merge(m, src) +} +func (m *Success) XXX_Size() int { + return xxx_messageInfo_Success.Size(m) +} +func (m *Success) XXX_DiscardUnknown() { + xxx_messageInfo_Success.DiscardUnknown(m) +} + +var xxx_messageInfo_Success proto.InternalMessageInfo + +func (m *Success) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +//* +// Response: Failure of the previous request +// @end +type Failure struct { + Code *Failure_FailureType `protobuf:"varint,1,opt,name=code,enum=hw.trezor.messages.common.Failure_FailureType" json:"code,omitempty"` + Message *string `protobuf:"bytes,2,opt,name=message" json:"message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_aaf30d059fdbc38d, []int{1} +} + +func (m *Failure) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Failure.Unmarshal(m, b) +} +func (m *Failure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Failure.Marshal(b, m, deterministic) +} +func (m *Failure) XXX_Merge(src proto.Message) { + xxx_messageInfo_Failure.Merge(m, src) +} +func (m *Failure) XXX_Size() int { + return xxx_messageInfo_Failure.Size(m) +} +func (m *Failure) XXX_DiscardUnknown() { + xxx_messageInfo_Failure.DiscardUnknown(m) +} + +var xxx_messageInfo_Failure proto.InternalMessageInfo + +func (m *Failure) GetCode() Failure_FailureType { + if m != nil && m.Code != nil { + return *m.Code + } + return Failure_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. +// @auxstart +// @next ButtonAck +type ButtonRequest struct { + Code *ButtonRequest_ButtonRequestType `protobuf:"varint,1,opt,name=code,enum=hw.trezor.messages.common.ButtonRequest_ButtonRequestType" json:"code,omitempty"` + Data *string `protobuf:"bytes,2,opt,name=data" json:"data,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_aaf30d059fdbc38d, []int{2} +} + +func (m *ButtonRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ButtonRequest.Unmarshal(m, b) +} +func (m *ButtonRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ButtonRequest.Marshal(b, m, deterministic) +} +func (m *ButtonRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ButtonRequest.Merge(m, src) +} +func (m *ButtonRequest) XXX_Size() int { + return xxx_messageInfo_ButtonRequest.Size(m) +} +func (m *ButtonRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ButtonRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ButtonRequest proto.InternalMessageInfo + +func (m *ButtonRequest) GetCode() ButtonRequest_ButtonRequestType { + if m != nil && m.Code != nil { + return *m.Code + } + return ButtonRequest_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 +// @auxend +type ButtonAck struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_aaf30d059fdbc38d, []int{3} +} + +func (m *ButtonAck) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ButtonAck.Unmarshal(m, b) +} +func (m *ButtonAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ButtonAck.Marshal(b, m, deterministic) +} +func (m *ButtonAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_ButtonAck.Merge(m, src) +} +func (m *ButtonAck) XXX_Size() int { + return xxx_messageInfo_ButtonAck.Size(m) +} +func (m *ButtonAck) XXX_DiscardUnknown() { + xxx_messageInfo_ButtonAck.DiscardUnknown(m) +} + +var xxx_messageInfo_ButtonAck proto.InternalMessageInfo + +//* +// Response: Device is asking computer to show PIN matrix and awaits PIN encoded using this matrix scheme +// @auxstart +// @next PinMatrixAck +type PinMatrixRequest struct { + Type *PinMatrixRequest_PinMatrixRequestType `protobuf:"varint,1,opt,name=type,enum=hw.trezor.messages.common.PinMatrixRequest_PinMatrixRequestType" json:"type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_aaf30d059fdbc38d, []int{4} +} + +func (m *PinMatrixRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PinMatrixRequest.Unmarshal(m, b) +} +func (m *PinMatrixRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PinMatrixRequest.Marshal(b, m, deterministic) +} +func (m *PinMatrixRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PinMatrixRequest.Merge(m, src) +} +func (m *PinMatrixRequest) XXX_Size() int { + return xxx_messageInfo_PinMatrixRequest.Size(m) +} +func (m *PinMatrixRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PinMatrixRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PinMatrixRequest proto.InternalMessageInfo + +func (m *PinMatrixRequest) GetType() PinMatrixRequest_PinMatrixRequestType { + if m != nil && m.Type != nil { + return *m.Type + } + return PinMatrixRequest_PinMatrixRequestType_Current +} + +//* +// Request: Computer responds with encoded PIN +// @auxend +type PinMatrixAck struct { + Pin *string `protobuf:"bytes,1,req,name=pin" json:"pin,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_aaf30d059fdbc38d, []int{5} +} + +func (m *PinMatrixAck) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PinMatrixAck.Unmarshal(m, b) +} +func (m *PinMatrixAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PinMatrixAck.Marshal(b, m, deterministic) +} +func (m *PinMatrixAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_PinMatrixAck.Merge(m, src) +} +func (m *PinMatrixAck) XXX_Size() int { + return xxx_messageInfo_PinMatrixAck.Size(m) +} +func (m *PinMatrixAck) XXX_DiscardUnknown() { + xxx_messageInfo_PinMatrixAck.DiscardUnknown(m) +} + +var xxx_messageInfo_PinMatrixAck proto.InternalMessageInfo + +func (m *PinMatrixAck) GetPin() string { + if m != nil && m.Pin != nil { + return *m.Pin + } + return "" +} + +//* +// Response: Device awaits encryption passphrase +// @auxstart +// @next PassphraseAck +type PassphraseRequest struct { + OnDevice *bool `protobuf:"varint,1,opt,name=on_device,json=onDevice" json:"on_device,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_aaf30d059fdbc38d, []int{6} +} + +func (m *PassphraseRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PassphraseRequest.Unmarshal(m, b) +} +func (m *PassphraseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PassphraseRequest.Marshal(b, m, deterministic) +} +func (m *PassphraseRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PassphraseRequest.Merge(m, src) +} +func (m *PassphraseRequest) XXX_Size() int { + return xxx_messageInfo_PassphraseRequest.Size(m) +} +func (m *PassphraseRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PassphraseRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PassphraseRequest proto.InternalMessageInfo + +func (m *PassphraseRequest) GetOnDevice() bool { + if m != nil && m.OnDevice != nil { + return *m.OnDevice + } + return false +} + +//* +// Request: Send passphrase back +// @next PassphraseStateRequest +type PassphraseAck struct { + Passphrase *string `protobuf:"bytes,1,opt,name=passphrase" json:"passphrase,omitempty"` + State []byte `protobuf:"bytes,2,opt,name=state" json:"state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_aaf30d059fdbc38d, []int{7} +} + +func (m *PassphraseAck) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PassphraseAck.Unmarshal(m, b) +} +func (m *PassphraseAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PassphraseAck.Marshal(b, m, deterministic) +} +func (m *PassphraseAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_PassphraseAck.Merge(m, src) +} +func (m *PassphraseAck) XXX_Size() int { + return xxx_messageInfo_PassphraseAck.Size(m) +} +func (m *PassphraseAck) XXX_DiscardUnknown() { + xxx_messageInfo_PassphraseAck.DiscardUnknown(m) +} + +var xxx_messageInfo_PassphraseAck proto.InternalMessageInfo + +func (m *PassphraseAck) GetPassphrase() string { + if m != nil && m.Passphrase != nil { + return *m.Passphrase + } + return "" +} + +func (m *PassphraseAck) GetState() []byte { + if m != nil { + return m.State + } + return nil +} + +//* +// Response: Device awaits passphrase state +// @next PassphraseStateAck +type PassphraseStateRequest struct { + State []byte `protobuf:"bytes,1,opt,name=state" json:"state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PassphraseStateRequest) Reset() { *m = PassphraseStateRequest{} } +func (m *PassphraseStateRequest) String() string { return proto.CompactTextString(m) } +func (*PassphraseStateRequest) ProtoMessage() {} +func (*PassphraseStateRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{8} +} + +func (m *PassphraseStateRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PassphraseStateRequest.Unmarshal(m, b) +} +func (m *PassphraseStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PassphraseStateRequest.Marshal(b, m, deterministic) +} +func (m *PassphraseStateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PassphraseStateRequest.Merge(m, src) +} +func (m *PassphraseStateRequest) XXX_Size() int { + return xxx_messageInfo_PassphraseStateRequest.Size(m) +} +func (m *PassphraseStateRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PassphraseStateRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PassphraseStateRequest proto.InternalMessageInfo + +func (m *PassphraseStateRequest) GetState() []byte { + if m != nil { + return m.State + } + return nil +} + +//* +// Request: Send passphrase state back +// @auxend +type PassphraseStateAck struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PassphraseStateAck) Reset() { *m = PassphraseStateAck{} } +func (m *PassphraseStateAck) String() string { return proto.CompactTextString(m) } +func (*PassphraseStateAck) ProtoMessage() {} +func (*PassphraseStateAck) Descriptor() ([]byte, []int) { + return fileDescriptor_aaf30d059fdbc38d, []int{9} +} + +func (m *PassphraseStateAck) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PassphraseStateAck.Unmarshal(m, b) +} +func (m *PassphraseStateAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PassphraseStateAck.Marshal(b, m, deterministic) +} +func (m *PassphraseStateAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_PassphraseStateAck.Merge(m, src) +} +func (m *PassphraseStateAck) XXX_Size() int { + return xxx_messageInfo_PassphraseStateAck.Size(m) +} +func (m *PassphraseStateAck) XXX_DiscardUnknown() { + xxx_messageInfo_PassphraseStateAck.DiscardUnknown(m) +} + +var xxx_messageInfo_PassphraseStateAck proto.InternalMessageInfo + +//* +// Structure representing BIP32 (hierarchical deterministic) node +// Used for imports of private key into the device and exporting public key out of device +// @embed +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_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_aaf30d059fdbc38d, []int{10} +} + +func (m *HDNodeType) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_HDNodeType.Unmarshal(m, b) +} +func (m *HDNodeType) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_HDNodeType.Marshal(b, m, deterministic) +} +func (m *HDNodeType) XXX_Merge(src proto.Message) { + xxx_messageInfo_HDNodeType.Merge(m, src) +} +func (m *HDNodeType) XXX_Size() int { + return xxx_messageInfo_HDNodeType.Size(m) +} +func (m *HDNodeType) XXX_DiscardUnknown() { + xxx_messageInfo_HDNodeType.DiscardUnknown(m) +} + +var xxx_messageInfo_HDNodeType proto.InternalMessageInfo + +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 +} + +func init() { + proto.RegisterEnum("hw.trezor.messages.common.Failure_FailureType", Failure_FailureType_name, Failure_FailureType_value) + proto.RegisterEnum("hw.trezor.messages.common.ButtonRequest_ButtonRequestType", ButtonRequest_ButtonRequestType_name, ButtonRequest_ButtonRequestType_value) + proto.RegisterEnum("hw.trezor.messages.common.PinMatrixRequest_PinMatrixRequestType", PinMatrixRequest_PinMatrixRequestType_name, PinMatrixRequest_PinMatrixRequestType_value) + proto.RegisterType((*Success)(nil), "hw.trezor.messages.common.Success") + proto.RegisterType((*Failure)(nil), "hw.trezor.messages.common.Failure") + proto.RegisterType((*ButtonRequest)(nil), "hw.trezor.messages.common.ButtonRequest") + proto.RegisterType((*ButtonAck)(nil), "hw.trezor.messages.common.ButtonAck") + proto.RegisterType((*PinMatrixRequest)(nil), "hw.trezor.messages.common.PinMatrixRequest") + proto.RegisterType((*PinMatrixAck)(nil), "hw.trezor.messages.common.PinMatrixAck") + proto.RegisterType((*PassphraseRequest)(nil), "hw.trezor.messages.common.PassphraseRequest") + proto.RegisterType((*PassphraseAck)(nil), "hw.trezor.messages.common.PassphraseAck") + proto.RegisterType((*PassphraseStateRequest)(nil), "hw.trezor.messages.common.PassphraseStateRequest") + proto.RegisterType((*PassphraseStateAck)(nil), "hw.trezor.messages.common.PassphraseStateAck") + proto.RegisterType((*HDNodeType)(nil), "hw.trezor.messages.common.HDNodeType") +} + +func init() { proto.RegisterFile("messages-common.proto", fileDescriptor_aaf30d059fdbc38d) } + +var fileDescriptor_aaf30d059fdbc38d = []byte{ + // 846 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x54, 0xcd, 0x52, 0x23, 0x37, + 0x10, 0x2e, 0xff, 0x80, 0xed, 0xb6, 0xd9, 0x08, 0xc5, 0x80, 0x09, 0xb0, 0x38, 0xc3, 0x21, 0x5c, + 0xe2, 0x4a, 0xe5, 0x98, 0x53, 0x58, 0x83, 0x2b, 0xd4, 0x16, 0x86, 0x1a, 0xd8, 0xda, 0xa3, 0x4b, + 0xd1, 0xf4, 0x32, 0x2a, 0xcf, 0x48, 0x13, 0x8d, 0x06, 0xf0, 0x5e, 0xf2, 0x6a, 0x79, 0x89, 0xbc, + 0x42, 0xaa, 0x52, 0xb9, 0xe4, 0x11, 0xb6, 0x34, 0x3f, 0x78, 0xc6, 0x66, 0x39, 0xcd, 0xe8, 0xfb, + 0xbe, 0xee, 0x96, 0xba, 0x3f, 0x09, 0x76, 0x42, 0x8c, 0x63, 0x76, 0x8f, 0xf1, 0x8f, 0x5c, 0x85, + 0xa1, 0x92, 0xa3, 0x48, 0x2b, 0xa3, 0xe8, 0xbe, 0xff, 0x38, 0x32, 0x1a, 0x3f, 0x2b, 0x3d, 0x2a, + 0x04, 0xa3, 0x4c, 0xe0, 0x9c, 0x40, 0xeb, 0x36, 0xe1, 0x1c, 0xe3, 0x98, 0x0e, 0xa0, 0x95, 0xb3, + 0x83, 0xda, 0xb0, 0x76, 0xda, 0x71, 0x8b, 0xa5, 0xf3, 0x77, 0x03, 0x5a, 0x13, 0x26, 0x82, 0x44, + 0x23, 0x7d, 0x07, 0x4d, 0xae, 0xbc, 0x4c, 0xf2, 0xe6, 0xe7, 0xd1, 0xe8, 0xab, 0xa9, 0x47, 0x79, + 0x44, 0xf1, 0xbd, 0x5b, 0x44, 0xe8, 0xa6, 0xb1, 0xe5, 0x4a, 0xf5, 0x6a, 0xa5, 0xff, 0xea, 0xd0, + 0x2d, 0xe9, 0xe9, 0x11, 0xec, 0xe7, 0xcb, 0xd9, 0x07, 0x89, 0x4f, 0x11, 0x72, 0x83, 0xde, 0x55, + 0x26, 0x26, 0x35, 0xfa, 0x1d, 0xec, 0x16, 0xf4, 0xbb, 0xc4, 0x18, 0x25, 0x2f, 0x72, 0x09, 0xa9, + 0xd3, 0x1d, 0xd8, 0x2e, 0xb8, 0x73, 0x66, 0xd8, 0x85, 0xd6, 0x4a, 0x93, 0x06, 0x3d, 0x80, 0xbd, + 0x02, 0x3e, 0xe3, 0x46, 0x28, 0x39, 0x66, 0x92, 0x63, 0x10, 0xa0, 0x47, 0x9a, 0x74, 0x0f, 0xbe, + 0x2d, 0xc8, 0x1b, 0xb1, 0x4c, 0xb6, 0x41, 0x07, 0xd0, 0x2f, 0x11, 0xcb, 0x90, 0x4d, 0xba, 0x0b, + 0xb4, 0xc4, 0x5c, 0xca, 0x07, 0x16, 0x08, 0x8f, 0xb4, 0xe8, 0x21, 0x0c, 0x0a, 0x3c, 0x07, 0x6f, + 0xc5, 0xbd, 0x64, 0x26, 0xd1, 0x48, 0xda, 0x95, 0x7c, 0x5a, 0xd9, 0xf6, 0x67, 0xfb, 0xeb, 0x94, + 0x8f, 0x34, 0x55, 0xe6, 0x42, 0xaa, 0xe4, 0xde, 0x9f, 0x24, 0xd2, 0x8b, 0x09, 0xac, 0x70, 0x97, + 0x52, 0x18, 0xc1, 0x02, 0xf1, 0x19, 0x3d, 0xd2, 0x5d, 0xd9, 0xfa, 0x95, 0x88, 0x43, 0x66, 0xb8, + 0x4f, 0x7a, 0x74, 0x1f, 0x76, 0x0a, 0x62, 0x22, 0x74, 0xf8, 0xc8, 0x34, 0x66, 0xb5, 0xb8, 0xf3, + 0x4f, 0x13, 0xb6, 0xb2, 0xbe, 0xb9, 0xf8, 0x47, 0x82, 0xb1, 0xa1, 0xd3, 0xca, 0x74, 0x7f, 0x79, + 0x65, 0xba, 0x95, 0xb8, 0xea, 0xaa, 0x34, 0x69, 0x0a, 0x4d, 0x8f, 0x19, 0x96, 0x8f, 0x39, 0xfd, + 0x77, 0xfe, 0x6f, 0xc0, 0xf6, 0x9a, 0xde, 0xee, 0xbf, 0x02, 0xce, 0xae, 0x8d, 0x8f, 0x9a, 0xd4, + 0xa8, 0x03, 0x6f, 0xab, 0xc4, 0x04, 0xf1, 0xfa, 0x01, 0xf5, 0x9d, 0xaf, 0x31, 0xf6, 0x55, 0x60, + 0x67, 0x7d, 0x0c, 0x07, 0x55, 0xcd, 0x58, 0xc9, 0x4f, 0x42, 0x87, 0xd7, 0x89, 0x89, 0x12, 0x43, + 0x1a, 0xd6, 0x47, 0x55, 0x81, 0x8b, 0x31, 0x9a, 0x73, 0x7c, 0x10, 0x1c, 0x49, 0x73, 0x9d, 0xce, + 0xe3, 0x3f, 0x2a, 0x6d, 0xa7, 0x7f, 0x08, 0x83, 0x2a, 0xfd, 0x51, 0x44, 0x98, 0x07, 0x6f, 0xae, + 0x07, 0xdf, 0x68, 0x65, 0x90, 0x9b, 0x31, 0x0b, 0x02, 0xd2, 0xb2, 0xa3, 0xae, 0xd2, 0xd6, 0x07, + 0x77, 0x4f, 0xa4, 0xbd, 0xbe, 0xeb, 0x62, 0x3e, 0x63, 0x1f, 0xf9, 0x9c, 0x74, 0xec, 0xe8, 0xaa, + 0x82, 0x33, 0xcf, 0xd3, 0x18, 0x5b, 0x2b, 0x1c, 0xc0, 0xde, 0x4a, 0xd1, 0xe4, 0xf7, 0x40, 0xf0, + 0xf7, 0xb8, 0x20, 0x5d, 0x7a, 0x02, 0xc7, 0x55, 0xf2, 0x4a, 0x62, 0xa8, 0xa4, 0xe0, 0xf6, 0x3c, + 0x63, 0x95, 0x48, 0x43, 0x7a, 0xeb, 0xd5, 0x0b, 0xd1, 0xa5, 0xb4, 0x3d, 0xdb, 0xa2, 0x43, 0x38, + 0x5c, 0x29, 0xc1, 0xe2, 0x38, 0xf2, 0x35, 0x8b, 0xd3, 0xbb, 0x49, 0xde, 0xd0, 0x1f, 0xe0, 0xa4, + 0xaa, 0xf8, 0x20, 0xe7, 0x52, 0x3d, 0xca, 0x73, 0xd4, 0xe2, 0x81, 0xd9, 0xcb, 0x75, 0xc3, 0x8c, + 0x4f, 0xbe, 0x71, 0xba, 0xd0, 0xc9, 0x84, 0x67, 0x7c, 0xee, 0xfc, 0x5b, 0x03, 0x62, 0x2d, 0xca, + 0x8c, 0x16, 0x4f, 0x85, 0xf1, 0xee, 0xa0, 0x69, 0x16, 0x51, 0x61, 0xbc, 0x5f, 0x5f, 0x31, 0xde, + 0x6a, 0xe8, 0x1a, 0x90, 0xd9, 0xcf, 0x66, 0x73, 0xfe, 0x84, 0xfe, 0x4b, 0xac, 0x3d, 0xda, 0x4b, + 0xf8, 0x6c, 0x9c, 0x68, 0x8d, 0xd2, 0x90, 0x1a, 0xfd, 0x1e, 0x8e, 0x5e, 0x54, 0x4c, 0xf1, 0x71, + 0x22, 0x74, 0x6c, 0x48, 0xdd, 0x1a, 0xf3, 0x6b, 0x92, 0x5b, 0xe4, 0x4a, 0x7a, 0xa4, 0xe1, 0x0c, + 0xa1, 0xf7, 0xac, 0x39, 0xe3, 0x73, 0x4a, 0xa0, 0x11, 0x09, 0x39, 0xa8, 0x0d, 0xeb, 0xa7, 0x1d, + 0xd7, 0xfe, 0x3a, 0x3f, 0xc1, 0xf6, 0xb2, 0xaf, 0x45, 0x37, 0x0e, 0xa0, 0xa3, 0xe4, 0xcc, 0x4b, + 0x1d, 0x96, 0xb6, 0xa4, 0xed, 0xb6, 0x95, 0xcc, 0x1c, 0xe7, 0x5c, 0xc0, 0xd6, 0x32, 0xc2, 0x26, + 0x7d, 0x0b, 0x10, 0x3d, 0x03, 0xf9, 0xdb, 0x5d, 0x42, 0x68, 0x1f, 0x36, 0x62, 0xc3, 0x4c, 0xf6, + 0xd8, 0xf6, 0xdc, 0x6c, 0xe1, 0x8c, 0x60, 0x77, 0x99, 0xe6, 0xd6, 0x42, 0x45, 0xf5, 0x67, 0x7d, + 0xad, 0xac, 0xef, 0x03, 0x5d, 0xd1, 0xdb, 0x61, 0xfe, 0x55, 0x03, 0xf8, 0xed, 0x7c, 0xaa, 0xbc, + 0xec, 0xbd, 0xee, 0xc3, 0x86, 0x87, 0x91, 0xf1, 0xd3, 0x13, 0x6e, 0xb9, 0xd9, 0x82, 0x0e, 0xa1, + 0xfb, 0x49, 0xc8, 0x7b, 0xd4, 0x91, 0x16, 0xd2, 0x0c, 0xea, 0x29, 0x57, 0x86, 0xec, 0x81, 0xb9, + 0x2f, 0x02, 0x6f, 0x26, 0x93, 0x70, 0xd0, 0x48, 0xf9, 0x76, 0x0a, 0x4c, 0x93, 0x90, 0x1e, 0x01, + 0x70, 0x9f, 0x09, 0x39, 0x4b, 0x9f, 0xa6, 0xe6, 0xb0, 0x7e, 0xda, 0x73, 0x3b, 0x29, 0x32, 0xb6, + 0x6f, 0xcc, 0x31, 0x74, 0xa3, 0xd4, 0x6f, 0x38, 0x9b, 0xe3, 0x62, 0xb0, 0x91, 0x6e, 0x1a, 0x72, + 0xe8, 0x3d, 0x2e, 0x6c, 0x7c, 0x94, 0xde, 0x8e, 0x94, 0xdf, 0x4c, 0xf9, 0x4e, 0x54, 0xdc, 0x97, + 0x2f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xb2, 0x7d, 0x20, 0xa6, 0x35, 0x07, 0x00, 0x00, +} diff --git a/accounts/usbwallet/trezor/messages-common.proto b/accounts/usbwallet/trezor/messages-common.proto new file mode 100644 index 000000000000..75a983b0a3e5 --- /dev/null +++ b/accounts/usbwallet/trezor/messages-common.proto @@ -0,0 +1,147 @@ +// This file originates from the SatoshiLabs Trezor `common` repository at: +// https://github.com/trezor/trezor-common/blob/master/protob/messages-common.proto +// dated 28.05.2019, commit 893fd219d4a01bcffa0cd9cfa631856371ec5aa9. + +syntax = "proto2"; +package hw.trezor.messages.common; + +/** + * Response: Success of the previous request + * @end + */ +message Success { + optional string message = 1; // human readable description of action or request-specific payload +} + +/** + * Response: Failure of the previous request + * @end + */ +message Failure { + optional FailureType code = 1; // computer-readable definition of the error state + optional string message = 2; // human-readable message of the error state + 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_PinMismatch = 12; + Failure_FirmwareError = 99; + } +} + +/** + * Response: Device is waiting for HW button press. + * @auxstart + * @next ButtonAck + */ +message ButtonRequest { + optional ButtonRequestType code = 1; + optional string data = 2; + /** + * Type of button request + */ + 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; + ButtonRequest_MnemonicWordCount = 12; + ButtonRequest_MnemonicInput = 13; + ButtonRequest_PassphraseType = 14; + ButtonRequest_UnknownDerivationPath = 15; + } +} + +/** + * Request: Computer agrees to wait for HW button press + * @auxend + */ +message ButtonAck { +} + +/** + * Response: Device is asking computer to show PIN matrix and awaits PIN encoded using this matrix scheme + * @auxstart + * @next PinMatrixAck + */ +message PinMatrixRequest { + optional PinMatrixRequestType type = 1; + /** + * Type of PIN request + */ + enum PinMatrixRequestType { + PinMatrixRequestType_Current = 1; + PinMatrixRequestType_NewFirst = 2; + PinMatrixRequestType_NewSecond = 3; + } +} + +/** + * Request: Computer responds with encoded PIN + * @auxend + */ +message PinMatrixAck { + required string pin = 1; // matrix encoded PIN entered by user +} + +/** + * Response: Device awaits encryption passphrase + * @auxstart + * @next PassphraseAck + */ +message PassphraseRequest { + optional bool on_device = 1; // passphrase is being entered on the device +} + +/** + * Request: Send passphrase back + * @next PassphraseStateRequest + */ +message PassphraseAck { + optional string passphrase = 1; + optional bytes state = 2; // expected device state +} + +/** + * Response: Device awaits passphrase state + * @next PassphraseStateAck + */ +message PassphraseStateRequest { + optional bytes state = 1; // actual device state +} + +/** + * Request: Send passphrase state back + * @auxend + */ +message PassphraseStateAck { +} + +/** + * Structure representing BIP32 (hierarchical deterministic) node + * Used for imports of private key into the device and exporting public key out of device + * @embed + */ +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; +} diff --git a/accounts/usbwallet/trezor/messages-ethereum.pb.go b/accounts/usbwallet/trezor/messages-ethereum.pb.go new file mode 100644 index 000000000000..5d664f5ba447 --- /dev/null +++ b/accounts/usbwallet/trezor/messages-ethereum.pb.go @@ -0,0 +1,698 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: messages-ethereum.proto + +package trezor + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" +) + +// 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.ProtoPackageIsVersion3 // please upgrade the proto package + +//* +// Request: Ask device for public key corresponding to address_n path +// @start +// @next EthereumPublicKey +// @next Failure +type EthereumGetPublicKey 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_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EthereumGetPublicKey) Reset() { *m = EthereumGetPublicKey{} } +func (m *EthereumGetPublicKey) String() string { return proto.CompactTextString(m) } +func (*EthereumGetPublicKey) ProtoMessage() {} +func (*EthereumGetPublicKey) Descriptor() ([]byte, []int) { + return fileDescriptor_cb33f46ba915f15c, []int{0} +} + +func (m *EthereumGetPublicKey) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumGetPublicKey.Unmarshal(m, b) +} +func (m *EthereumGetPublicKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumGetPublicKey.Marshal(b, m, deterministic) +} +func (m *EthereumGetPublicKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumGetPublicKey.Merge(m, src) +} +func (m *EthereumGetPublicKey) XXX_Size() int { + return xxx_messageInfo_EthereumGetPublicKey.Size(m) +} +func (m *EthereumGetPublicKey) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumGetPublicKey.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumGetPublicKey proto.InternalMessageInfo + +func (m *EthereumGetPublicKey) GetAddressN() []uint32 { + if m != nil { + return m.AddressN + } + return nil +} + +func (m *EthereumGetPublicKey) GetShowDisplay() bool { + if m != nil && m.ShowDisplay != nil { + return *m.ShowDisplay + } + return false +} + +//* +// Response: Contains public key derived from device private seed +// @end +type EthereumPublicKey struct { + Node *HDNodeType `protobuf:"bytes,1,opt,name=node" json:"node,omitempty"` + Xpub *string `protobuf:"bytes,2,opt,name=xpub" json:"xpub,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EthereumPublicKey) Reset() { *m = EthereumPublicKey{} } +func (m *EthereumPublicKey) String() string { return proto.CompactTextString(m) } +func (*EthereumPublicKey) ProtoMessage() {} +func (*EthereumPublicKey) Descriptor() ([]byte, []int) { + return fileDescriptor_cb33f46ba915f15c, []int{1} +} + +func (m *EthereumPublicKey) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumPublicKey.Unmarshal(m, b) +} +func (m *EthereumPublicKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumPublicKey.Marshal(b, m, deterministic) +} +func (m *EthereumPublicKey) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumPublicKey.Merge(m, src) +} +func (m *EthereumPublicKey) XXX_Size() int { + return xxx_messageInfo_EthereumPublicKey.Size(m) +} +func (m *EthereumPublicKey) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumPublicKey.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumPublicKey proto.InternalMessageInfo + +func (m *EthereumPublicKey) GetNode() *HDNodeType { + if m != nil { + return m.Node + } + return nil +} + +func (m *EthereumPublicKey) GetXpub() string { + if m != nil && m.Xpub != nil { + return *m.Xpub + } + return "" +} + +//* +// Request: Ask device for Ethereum address corresponding to address_n path +// @start +// @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_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_cb33f46ba915f15c, []int{2} +} + +func (m *EthereumGetAddress) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumGetAddress.Unmarshal(m, b) +} +func (m *EthereumGetAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumGetAddress.Marshal(b, m, deterministic) +} +func (m *EthereumGetAddress) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumGetAddress.Merge(m, src) +} +func (m *EthereumGetAddress) XXX_Size() int { + return xxx_messageInfo_EthereumGetAddress.Size(m) +} +func (m *EthereumGetAddress) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumGetAddress.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumGetAddress proto.InternalMessageInfo + +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 an Ethereum address derived from device private seed +// @end +type EthereumAddress struct { + AddressBin []byte `protobuf:"bytes,1,opt,name=addressBin" json:"addressBin,omitempty"` + AddressHex *string `protobuf:"bytes,2,opt,name=addressHex" json:"addressHex,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_cb33f46ba915f15c, []int{3} +} + +func (m *EthereumAddress) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumAddress.Unmarshal(m, b) +} +func (m *EthereumAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumAddress.Marshal(b, m, deterministic) +} +func (m *EthereumAddress) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumAddress.Merge(m, src) +} +func (m *EthereumAddress) XXX_Size() int { + return xxx_messageInfo_EthereumAddress.Size(m) +} +func (m *EthereumAddress) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumAddress.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumAddress proto.InternalMessageInfo + +func (m *EthereumAddress) GetAddressBin() []byte { + if m != nil { + return m.AddressBin + } + return nil +} + +func (m *EthereumAddress) GetAddressHex() string { + if m != nil && m.AddressHex != nil { + return *m.AddressHex + } + return "" +} + +//* +// 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. +// @start +// @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"` + ToBin []byte `protobuf:"bytes,5,opt,name=toBin" json:"toBin,omitempty"` + ToHex *string `protobuf:"bytes,11,opt,name=toHex" json:"toHex,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"` + TxType *uint32 `protobuf:"varint,10,opt,name=tx_type,json=txType" json:"tx_type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_cb33f46ba915f15c, []int{4} +} + +func (m *EthereumSignTx) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumSignTx.Unmarshal(m, b) +} +func (m *EthereumSignTx) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumSignTx.Marshal(b, m, deterministic) +} +func (m *EthereumSignTx) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumSignTx.Merge(m, src) +} +func (m *EthereumSignTx) XXX_Size() int { + return xxx_messageInfo_EthereumSignTx.Size(m) +} +func (m *EthereumSignTx) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumSignTx.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumSignTx proto.InternalMessageInfo + +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) GetToBin() []byte { + if m != nil { + return m.ToBin + } + return nil +} + +func (m *EthereumSignTx) GetToHex() string { + if m != nil && m.ToHex != nil { + return *m.ToHex + } + return "" +} + +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 +} + +func (m *EthereumSignTx) GetTxType() uint32 { + if m != nil && m.TxType != nil { + return *m.TxType + } + 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. +// @end +// @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_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_cb33f46ba915f15c, []int{5} +} + +func (m *EthereumTxRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumTxRequest.Unmarshal(m, b) +} +func (m *EthereumTxRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumTxRequest.Marshal(b, m, deterministic) +} +func (m *EthereumTxRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumTxRequest.Merge(m, src) +} +func (m *EthereumTxRequest) XXX_Size() int { + return xxx_messageInfo_EthereumTxRequest.Size(m) +} +func (m *EthereumTxRequest) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumTxRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumTxRequest proto.InternalMessageInfo + +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. +// @next EthereumTxRequest +type EthereumTxAck struct { + DataChunk []byte `protobuf:"bytes,1,opt,name=data_chunk,json=dataChunk" json:"data_chunk,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_cb33f46ba915f15c, []int{6} +} + +func (m *EthereumTxAck) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumTxAck.Unmarshal(m, b) +} +func (m *EthereumTxAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumTxAck.Marshal(b, m, deterministic) +} +func (m *EthereumTxAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumTxAck.Merge(m, src) +} +func (m *EthereumTxAck) XXX_Size() int { + return xxx_messageInfo_EthereumTxAck.Size(m) +} +func (m *EthereumTxAck) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumTxAck.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumTxAck proto.InternalMessageInfo + +func (m *EthereumTxAck) GetDataChunk() []byte { + if m != nil { + return m.DataChunk + } + return nil +} + +//* +// Request: Ask device to sign message +// @start +// @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,opt,name=message" json:"message,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_cb33f46ba915f15c, []int{7} +} + +func (m *EthereumSignMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumSignMessage.Unmarshal(m, b) +} +func (m *EthereumSignMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumSignMessage.Marshal(b, m, deterministic) +} +func (m *EthereumSignMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumSignMessage.Merge(m, src) +} +func (m *EthereumSignMessage) XXX_Size() int { + return xxx_messageInfo_EthereumSignMessage.Size(m) +} +func (m *EthereumSignMessage) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumSignMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumSignMessage proto.InternalMessageInfo + +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 +} + +//* +// Response: Signed message +// @end +type EthereumMessageSignature struct { + AddressBin []byte `protobuf:"bytes,1,opt,name=addressBin" json:"addressBin,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` + AddressHex *string `protobuf:"bytes,3,opt,name=addressHex" json:"addressHex,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_cb33f46ba915f15c, []int{8} +} + +func (m *EthereumMessageSignature) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumMessageSignature.Unmarshal(m, b) +} +func (m *EthereumMessageSignature) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumMessageSignature.Marshal(b, m, deterministic) +} +func (m *EthereumMessageSignature) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumMessageSignature.Merge(m, src) +} +func (m *EthereumMessageSignature) XXX_Size() int { + return xxx_messageInfo_EthereumMessageSignature.Size(m) +} +func (m *EthereumMessageSignature) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumMessageSignature.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumMessageSignature proto.InternalMessageInfo + +func (m *EthereumMessageSignature) GetAddressBin() []byte { + if m != nil { + return m.AddressBin + } + return nil +} + +func (m *EthereumMessageSignature) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +func (m *EthereumMessageSignature) GetAddressHex() string { + if m != nil && m.AddressHex != nil { + return *m.AddressHex + } + return "" +} + +//* +// Request: Ask device to verify message +// @start +// @next Success +// @next Failure +type EthereumVerifyMessage struct { + AddressBin []byte `protobuf:"bytes,1,opt,name=addressBin" json:"addressBin,omitempty"` + Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` + Message []byte `protobuf:"bytes,3,opt,name=message" json:"message,omitempty"` + AddressHex *string `protobuf:"bytes,4,opt,name=addressHex" json:"addressHex,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_cb33f46ba915f15c, []int{9} +} + +func (m *EthereumVerifyMessage) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EthereumVerifyMessage.Unmarshal(m, b) +} +func (m *EthereumVerifyMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EthereumVerifyMessage.Marshal(b, m, deterministic) +} +func (m *EthereumVerifyMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_EthereumVerifyMessage.Merge(m, src) +} +func (m *EthereumVerifyMessage) XXX_Size() int { + return xxx_messageInfo_EthereumVerifyMessage.Size(m) +} +func (m *EthereumVerifyMessage) XXX_DiscardUnknown() { + xxx_messageInfo_EthereumVerifyMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_EthereumVerifyMessage proto.InternalMessageInfo + +func (m *EthereumVerifyMessage) GetAddressBin() []byte { + if m != nil { + return m.AddressBin + } + 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 +} + +func (m *EthereumVerifyMessage) GetAddressHex() string { + if m != nil && m.AddressHex != nil { + return *m.AddressHex + } + return "" +} + +func init() { + proto.RegisterType((*EthereumGetPublicKey)(nil), "hw.trezor.messages.ethereum.EthereumGetPublicKey") + proto.RegisterType((*EthereumPublicKey)(nil), "hw.trezor.messages.ethereum.EthereumPublicKey") + proto.RegisterType((*EthereumGetAddress)(nil), "hw.trezor.messages.ethereum.EthereumGetAddress") + proto.RegisterType((*EthereumAddress)(nil), "hw.trezor.messages.ethereum.EthereumAddress") + proto.RegisterType((*EthereumSignTx)(nil), "hw.trezor.messages.ethereum.EthereumSignTx") + proto.RegisterType((*EthereumTxRequest)(nil), "hw.trezor.messages.ethereum.EthereumTxRequest") + proto.RegisterType((*EthereumTxAck)(nil), "hw.trezor.messages.ethereum.EthereumTxAck") + proto.RegisterType((*EthereumSignMessage)(nil), "hw.trezor.messages.ethereum.EthereumSignMessage") + proto.RegisterType((*EthereumMessageSignature)(nil), "hw.trezor.messages.ethereum.EthereumMessageSignature") + proto.RegisterType((*EthereumVerifyMessage)(nil), "hw.trezor.messages.ethereum.EthereumVerifyMessage") +} + +func init() { proto.RegisterFile("messages-ethereum.proto", fileDescriptor_cb33f46ba915f15c) } + +var fileDescriptor_cb33f46ba915f15c = []byte{ + // 593 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0x4d, 0x6f, 0xd3, 0x40, + 0x10, 0x95, 0x9b, 0xb4, 0x49, 0x26, 0x0d, 0x1f, 0xa6, 0x55, 0x17, 0x0a, 0x34, 0x18, 0x21, 0xe5, + 0x00, 0x3e, 0x70, 0x43, 0xe2, 0xd2, 0x52, 0x44, 0x2b, 0x4a, 0x55, 0xdc, 0xa8, 0x57, 0x6b, 0x63, + 0x6f, 0xe3, 0x55, 0x9d, 0xdd, 0xe0, 0x5d, 0xb7, 0x0e, 0x7f, 0x82, 0x23, 0xff, 0x87, 0x5f, 0x86, + 0xf6, 0x2b, 0x71, 0x52, 0x54, 0x0e, 0xbd, 0x65, 0xde, 0xbc, 0x7d, 0xf3, 0x66, 0xf4, 0x62, 0xd8, + 0x99, 0x10, 0x21, 0xf0, 0x98, 0x88, 0x77, 0x44, 0x66, 0xa4, 0x20, 0xe5, 0x24, 0x9c, 0x16, 0x5c, + 0x72, 0x7f, 0x37, 0xbb, 0x09, 0x65, 0x41, 0x7e, 0xf2, 0x22, 0x74, 0x94, 0xd0, 0x51, 0x9e, 0x6d, + 0xcf, 0x5f, 0x25, 0x7c, 0x32, 0xe1, 0xcc, 0xbc, 0x09, 0x2e, 0x60, 0xeb, 0xb3, 0xa5, 0x7c, 0x21, + 0xf2, 0xac, 0x1c, 0xe5, 0x34, 0xf9, 0x4a, 0x66, 0xfe, 0x2e, 0x74, 0x70, 0x9a, 0x16, 0x44, 0x88, + 0x98, 0x21, 0xaf, 0xdf, 0x18, 0xf4, 0xa2, 0xb6, 0x05, 0x4e, 0xfd, 0x57, 0xb0, 0x29, 0x32, 0x7e, + 0x13, 0xa7, 0x54, 0x4c, 0x73, 0x3c, 0x43, 0x6b, 0x7d, 0x6f, 0xd0, 0x8e, 0xba, 0x0a, 0x3b, 0x34, + 0x50, 0x30, 0x82, 0xc7, 0x4e, 0x77, 0x21, 0xfa, 0x01, 0x9a, 0x8c, 0xa7, 0x04, 0x79, 0x7d, 0x6f, + 0xd0, 0x7d, 0xff, 0x26, 0xfc, 0x87, 0x5f, 0x6b, 0xee, 0xe8, 0xf0, 0x94, 0xa7, 0x64, 0x38, 0x9b, + 0x92, 0x48, 0x3f, 0xf1, 0x7d, 0x68, 0x56, 0xd3, 0x72, 0xa4, 0x47, 0x75, 0x22, 0xfd, 0x3b, 0x18, + 0x82, 0x5f, 0xf3, 0xbe, 0x6f, 0xdc, 0xdd, 0xdb, 0xf9, 0x77, 0x78, 0xe8, 0x54, 0x9d, 0xe4, 0x4b, + 0x00, 0xab, 0x70, 0x40, 0x99, 0x76, 0xbf, 0x19, 0xd5, 0x90, 0x5a, 0xff, 0x88, 0x54, 0xd6, 0x62, + 0x0d, 0x09, 0xfe, 0xac, 0xc1, 0x03, 0xa7, 0x79, 0x4e, 0xc7, 0x6c, 0x58, 0xdd, 0xed, 0x72, 0x0b, + 0xd6, 0x19, 0x67, 0x09, 0xd1, 0x52, 0x9b, 0x91, 0x29, 0xd4, 0x93, 0x31, 0x16, 0xf1, 0xb4, 0xa0, + 0x09, 0x41, 0x0d, 0xdd, 0x69, 0x8f, 0xb1, 0x38, 0x53, 0xb5, 0x6b, 0xe6, 0x74, 0x42, 0x25, 0x6a, + 0xce, 0x9b, 0x27, 0xaa, 0x56, 0x7a, 0x92, 0x2b, 0xeb, 0xeb, 0x46, 0x4f, 0x17, 0x06, 0x55, 0x86, + 0xbb, 0xda, 0xb0, 0x29, 0x14, 0x7a, 0x8d, 0xf3, 0x92, 0xa0, 0x0d, 0xc3, 0xd5, 0x85, 0xff, 0x16, + 0xfc, 0x14, 0x4b, 0x1c, 0x53, 0x46, 0x25, 0xc5, 0x79, 0x9c, 0x64, 0x25, 0xbb, 0x42, 0x2d, 0x4d, + 0x79, 0xa4, 0x3a, 0xc7, 0xa6, 0xf1, 0x49, 0xe1, 0xfe, 0x1e, 0x74, 0x35, 0x3b, 0x27, 0x6c, 0x2c, + 0x33, 0xd4, 0xee, 0x7b, 0x83, 0x5e, 0x04, 0x0a, 0x3a, 0xd1, 0x88, 0xff, 0x14, 0xda, 0x49, 0x86, + 0x29, 0x8b, 0x69, 0x8a, 0x3a, 0xba, 0xdb, 0xd2, 0xf5, 0x71, 0xea, 0xef, 0x40, 0x4b, 0x56, 0xb1, + 0x9c, 0x4d, 0x09, 0x02, 0xdd, 0xd9, 0x90, 0x95, 0xca, 0x41, 0xf0, 0xdb, 0x5b, 0x44, 0x6a, 0x58, + 0x45, 0xe4, 0x47, 0x49, 0x84, 0x5c, 0x1d, 0xe5, 0xdd, 0x1a, 0xb5, 0x07, 0x5d, 0x41, 0xc7, 0x0c, + 0xcb, 0xb2, 0x20, 0xf1, 0xb5, 0xbe, 0x68, 0x2f, 0x82, 0x39, 0x74, 0xb1, 0x4c, 0x28, 0xec, 0x61, + 0x17, 0x84, 0x68, 0x99, 0x20, 0xec, 0x71, 0x17, 0x84, 0xf3, 0x20, 0x84, 0xde, 0xc2, 0xd8, 0x7e, + 0x72, 0xe5, 0xbf, 0x00, 0xed, 0xc0, 0x5e, 0xc9, 0xe4, 0xa5, 0xa3, 0x10, 0x7d, 0x9e, 0xe0, 0x04, + 0x9e, 0xd4, 0xd3, 0xf0, 0xcd, 0x64, 0xff, 0xee, 0x48, 0x20, 0x68, 0xd9, 0xff, 0x88, 0x0d, 0x85, + 0x2b, 0x83, 0x0a, 0x90, 0x53, 0xb3, 0x4a, 0xe7, 0xce, 0xda, 0x7f, 0x83, 0xfb, 0x1c, 0x3a, 0xf3, + 0x3d, 0xac, 0xee, 0x02, 0x58, 0x89, 0x75, 0xe3, 0x56, 0xac, 0x7f, 0x79, 0xb0, 0xed, 0x46, 0x5f, + 0x90, 0x82, 0x5e, 0xce, 0xdc, 0x2a, 0xf7, 0x9b, 0x5b, 0xdb, 0xb5, 0xb1, 0xb4, 0xeb, 0x8a, 0xa3, + 0xe6, 0xaa, 0xa3, 0x83, 0x8f, 0xf0, 0x3a, 0xe1, 0x93, 0x50, 0x60, 0xc9, 0x45, 0x46, 0x73, 0x3c, + 0x12, 0xee, 0x03, 0x93, 0xd3, 0x91, 0xf9, 0xe2, 0x8d, 0xca, 0xcb, 0x83, 0xed, 0xa1, 0x06, 0xad, + 0x5b, 0xb7, 0xc2, 0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8a, 0xce, 0x81, 0xc8, 0x59, 0x05, 0x00, + 0x00, +} diff --git a/accounts/usbwallet/trezor/messages-ethereum.proto b/accounts/usbwallet/trezor/messages-ethereum.proto new file mode 100644 index 000000000000..096bed2e4ae1 --- /dev/null +++ b/accounts/usbwallet/trezor/messages-ethereum.proto @@ -0,0 +1,131 @@ +// This file originates from the SatoshiLabs Trezor `common` repository at: +// https://github.com/trezor/trezor-common/blob/master/protob/messages-ethereum.proto +// dated 28.05.2019, commit 893fd219d4a01bcffa0cd9cfa631856371ec5aa9. + +syntax = "proto2"; +package hw.trezor.messages.ethereum; + +// Sugar for easier handling in Java +option java_package = "com.satoshilabs.trezor.lib.protobuf"; +option java_outer_classname = "TrezorMessageEthereum"; + +import "messages-common.proto"; + + +/** + * Request: Ask device for public key corresponding to address_n path + * @start + * @next EthereumPublicKey + * @next Failure + */ +message EthereumGetPublicKey { + 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 public key derived from device private seed + * @end + */ +message EthereumPublicKey { + optional hw.trezor.messages.common.HDNodeType node = 1; // BIP32 public node + optional string xpub = 2; // serialized form of public node +} + +/** + * Request: Ask device for Ethereum address corresponding to address_n path + * @start + * @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 an Ethereum address derived from device private seed + * @end + */ +message EthereumAddress { + optional bytes addressBin = 1; // Ethereum address as 20 bytes (legacy firmwares) + optional string addressHex = 2; // Ethereum address as hex string (newer firmwares) +} + +/** + * 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. + * @start + * @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 toBin = 5; // recipient address (20 bytes, legacy firmware) + optional string toHex = 11; // recipient address (hex string, newer firmware) + 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 + optional uint32 tx_type = 10; // (only for Wanchain) +} + +/** + * 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. + * @end + * @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. + * @next EthereumTxRequest + */ +message EthereumTxAck { + optional bytes data_chunk = 1; // Bytes from transaction payload (<= 1024 bytes) +} + +/** + * Request: Ask device to sign message + * @start + * @next EthereumMessageSignature + * @next Failure + */ +message EthereumSignMessage { + repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node + optional bytes message = 2; // message to be signed +} + +/** + * Response: Signed message + * @end + */ +message EthereumMessageSignature { + optional bytes addressBin = 1; // address used to sign the message (20 bytes, legacy firmware) + optional bytes signature = 2; // signature of the message + optional string addressHex = 3; // address used to sign the message (hex string, newer firmware) +} + +/** + * Request: Ask device to verify message + * @start + * @next Success + * @next Failure + */ +message EthereumVerifyMessage { + optional bytes addressBin = 1; // address to verify (20 bytes, legacy firmware) + optional bytes signature = 2; // signature to verify + optional bytes message = 3; // message to verify + optional string addressHex = 4; // address to verify (hex string, newer firmware) +} diff --git a/accounts/usbwallet/trezor/messages-management.pb.go b/accounts/usbwallet/trezor/messages-management.pb.go new file mode 100644 index 000000000000..f5c872f1fb5b --- /dev/null +++ b/accounts/usbwallet/trezor/messages-management.pb.go @@ -0,0 +1,1621 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: messages-management.proto + +package trezor + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" +) + +// 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.ProtoPackageIsVersion3 // please upgrade the proto package + +//* +// Structure representing passphrase source +type ApplySettings_PassphraseSourceType int32 + +const ( + ApplySettings_ASK ApplySettings_PassphraseSourceType = 0 + ApplySettings_DEVICE ApplySettings_PassphraseSourceType = 1 + ApplySettings_HOST ApplySettings_PassphraseSourceType = 2 +) + +var ApplySettings_PassphraseSourceType_name = map[int32]string{ + 0: "ASK", + 1: "DEVICE", + 2: "HOST", +} + +var ApplySettings_PassphraseSourceType_value = map[string]int32{ + "ASK": 0, + "DEVICE": 1, + "HOST": 2, +} + +func (x ApplySettings_PassphraseSourceType) Enum() *ApplySettings_PassphraseSourceType { + p := new(ApplySettings_PassphraseSourceType) + *p = x + return p +} + +func (x ApplySettings_PassphraseSourceType) String() string { + return proto.EnumName(ApplySettings_PassphraseSourceType_name, int32(x)) +} + +func (x *ApplySettings_PassphraseSourceType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(ApplySettings_PassphraseSourceType_value, data, "ApplySettings_PassphraseSourceType") + if err != nil { + return err + } + *x = ApplySettings_PassphraseSourceType(value) + return nil +} + +func (ApplySettings_PassphraseSourceType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{4, 0} +} + +//* +// 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. +type RecoveryDevice_RecoveryDeviceType int32 + +const ( + // use powers of two when extending this field + RecoveryDevice_RecoveryDeviceType_ScrambledWords RecoveryDevice_RecoveryDeviceType = 0 + RecoveryDevice_RecoveryDeviceType_Matrix RecoveryDevice_RecoveryDeviceType = 1 +) + +var RecoveryDevice_RecoveryDeviceType_name = map[int32]string{ + 0: "RecoveryDeviceType_ScrambledWords", + 1: "RecoveryDeviceType_Matrix", +} + +var RecoveryDevice_RecoveryDeviceType_value = map[string]int32{ + "RecoveryDeviceType_ScrambledWords": 0, + "RecoveryDeviceType_Matrix": 1, +} + +func (x RecoveryDevice_RecoveryDeviceType) Enum() *RecoveryDevice_RecoveryDeviceType { + p := new(RecoveryDevice_RecoveryDeviceType) + *p = x + return p +} + +func (x RecoveryDevice_RecoveryDeviceType) String() string { + return proto.EnumName(RecoveryDevice_RecoveryDeviceType_name, int32(x)) +} + +func (x *RecoveryDevice_RecoveryDeviceType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(RecoveryDevice_RecoveryDeviceType_value, data, "RecoveryDevice_RecoveryDeviceType") + if err != nil { + return err + } + *x = RecoveryDevice_RecoveryDeviceType(value) + return nil +} + +func (RecoveryDevice_RecoveryDeviceType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{17, 0} +} + +//* +// Type of Recovery Word request +type WordRequest_WordRequestType int32 + +const ( + WordRequest_WordRequestType_Plain WordRequest_WordRequestType = 0 + WordRequest_WordRequestType_Matrix9 WordRequest_WordRequestType = 1 + WordRequest_WordRequestType_Matrix6 WordRequest_WordRequestType = 2 +) + +var WordRequest_WordRequestType_name = map[int32]string{ + 0: "WordRequestType_Plain", + 1: "WordRequestType_Matrix9", + 2: "WordRequestType_Matrix6", +} + +var WordRequest_WordRequestType_value = map[string]int32{ + "WordRequestType_Plain": 0, + "WordRequestType_Matrix9": 1, + "WordRequestType_Matrix6": 2, +} + +func (x WordRequest_WordRequestType) Enum() *WordRequest_WordRequestType { + p := new(WordRequest_WordRequestType) + *p = x + return p +} + +func (x WordRequest_WordRequestType) String() string { + return proto.EnumName(WordRequest_WordRequestType_name, int32(x)) +} + +func (x *WordRequest_WordRequestType) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(WordRequest_WordRequestType_value, data, "WordRequest_WordRequestType") + if err != nil { + return err + } + *x = WordRequest_WordRequestType(value) + return nil +} + +func (WordRequest_WordRequestType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_0c720c20d27aa029, []int{18, 0} +} + +//* +// Request: Reset device to default state and ask for device details +// @start +// @next Features +type Initialize struct { + State []byte `protobuf:"bytes,1,opt,name=state" json:"state,omitempty"` + SkipPassphrase *bool `protobuf:"varint,2,opt,name=skip_passphrase,json=skipPassphrase" json:"skip_passphrase,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{0} +} + +func (m *Initialize) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Initialize.Unmarshal(m, b) +} +func (m *Initialize) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Initialize.Marshal(b, m, deterministic) +} +func (m *Initialize) XXX_Merge(src proto.Message) { + xxx_messageInfo_Initialize.Merge(m, src) +} +func (m *Initialize) XXX_Size() int { + return xxx_messageInfo_Initialize.Size(m) +} +func (m *Initialize) XXX_DiscardUnknown() { + xxx_messageInfo_Initialize.DiscardUnknown(m) +} + +var xxx_messageInfo_Initialize proto.InternalMessageInfo + +func (m *Initialize) GetState() []byte { + if m != nil { + return m.State + } + return nil +} + +func (m *Initialize) GetSkipPassphrase() bool { + if m != nil && m.SkipPassphrase != nil { + return *m.SkipPassphrase + } + return false +} + +//* +// Request: Ask for device details (no device reset) +// @start +// @next Features +type GetFeatures struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{1} +} + +func (m *GetFeatures) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetFeatures.Unmarshal(m, b) +} +func (m *GetFeatures) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetFeatures.Marshal(b, m, deterministic) +} +func (m *GetFeatures) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetFeatures.Merge(m, src) +} +func (m *GetFeatures) XXX_Size() int { + return xxx_messageInfo_GetFeatures.Size(m) +} +func (m *GetFeatures) XXX_DiscardUnknown() { + xxx_messageInfo_GetFeatures.DiscardUnknown(m) +} + +var xxx_messageInfo_GetFeatures proto.InternalMessageInfo + +//* +// Response: Reports various information about the device +// @end +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"` + 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"` + Model *string `protobuf:"bytes,21,opt,name=model" json:"model,omitempty"` + FwMajor *uint32 `protobuf:"varint,22,opt,name=fw_major,json=fwMajor" json:"fw_major,omitempty"` + FwMinor *uint32 `protobuf:"varint,23,opt,name=fw_minor,json=fwMinor" json:"fw_minor,omitempty"` + FwPatch *uint32 `protobuf:"varint,24,opt,name=fw_patch,json=fwPatch" json:"fw_patch,omitempty"` + FwVendor *string `protobuf:"bytes,25,opt,name=fw_vendor,json=fwVendor" json:"fw_vendor,omitempty"` + FwVendorKeys []byte `protobuf:"bytes,26,opt,name=fw_vendor_keys,json=fwVendorKeys" json:"fw_vendor_keys,omitempty"` + UnfinishedBackup *bool `protobuf:"varint,27,opt,name=unfinished_backup,json=unfinishedBackup" json:"unfinished_backup,omitempty"` + NoBackup *bool `protobuf:"varint,28,opt,name=no_backup,json=noBackup" json:"no_backup,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{2} +} + +func (m *Features) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Features.Unmarshal(m, b) +} +func (m *Features) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Features.Marshal(b, m, deterministic) +} +func (m *Features) XXX_Merge(src proto.Message) { + xxx_messageInfo_Features.Merge(m, src) +} +func (m *Features) XXX_Size() int { + return xxx_messageInfo_Features.Size(m) +} +func (m *Features) XXX_DiscardUnknown() { + xxx_messageInfo_Features.DiscardUnknown(m) +} + +var xxx_messageInfo_Features proto.InternalMessageInfo + +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) 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 +} + +func (m *Features) GetModel() string { + if m != nil && m.Model != nil { + return *m.Model + } + return "" +} + +func (m *Features) GetFwMajor() uint32 { + if m != nil && m.FwMajor != nil { + return *m.FwMajor + } + return 0 +} + +func (m *Features) GetFwMinor() uint32 { + if m != nil && m.FwMinor != nil { + return *m.FwMinor + } + return 0 +} + +func (m *Features) GetFwPatch() uint32 { + if m != nil && m.FwPatch != nil { + return *m.FwPatch + } + return 0 +} + +func (m *Features) GetFwVendor() string { + if m != nil && m.FwVendor != nil { + return *m.FwVendor + } + return "" +} + +func (m *Features) GetFwVendorKeys() []byte { + if m != nil { + return m.FwVendorKeys + } + return nil +} + +func (m *Features) GetUnfinishedBackup() bool { + if m != nil && m.UnfinishedBackup != nil { + return *m.UnfinishedBackup + } + return false +} + +func (m *Features) GetNoBackup() bool { + if m != nil && m.NoBackup != nil { + return *m.NoBackup + } + return false +} + +//* +// Request: clear session (removes cached PIN, passphrase, etc). +// @start +// @next Success +type ClearSession struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{3} +} + +func (m *ClearSession) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ClearSession.Unmarshal(m, b) +} +func (m *ClearSession) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ClearSession.Marshal(b, m, deterministic) +} +func (m *ClearSession) XXX_Merge(src proto.Message) { + xxx_messageInfo_ClearSession.Merge(m, src) +} +func (m *ClearSession) XXX_Size() int { + return xxx_messageInfo_ClearSession.Size(m) +} +func (m *ClearSession) XXX_DiscardUnknown() { + xxx_messageInfo_ClearSession.DiscardUnknown(m) +} + +var xxx_messageInfo_ClearSession proto.InternalMessageInfo + +//* +// Request: change language and/or label of the device +// @start +// @next Success +// @next Failure +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"` + PassphraseSource *ApplySettings_PassphraseSourceType `protobuf:"varint,5,opt,name=passphrase_source,json=passphraseSource,enum=hw.trezor.messages.management.ApplySettings_PassphraseSourceType" json:"passphrase_source,omitempty"` + AutoLockDelayMs *uint32 `protobuf:"varint,6,opt,name=auto_lock_delay_ms,json=autoLockDelayMs" json:"auto_lock_delay_ms,omitempty"` + DisplayRotation *uint32 `protobuf:"varint,7,opt,name=display_rotation,json=displayRotation" json:"display_rotation,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{4} +} + +func (m *ApplySettings) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ApplySettings.Unmarshal(m, b) +} +func (m *ApplySettings) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ApplySettings.Marshal(b, m, deterministic) +} +func (m *ApplySettings) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplySettings.Merge(m, src) +} +func (m *ApplySettings) XXX_Size() int { + return xxx_messageInfo_ApplySettings.Size(m) +} +func (m *ApplySettings) XXX_DiscardUnknown() { + xxx_messageInfo_ApplySettings.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplySettings proto.InternalMessageInfo + +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 +} + +func (m *ApplySettings) GetPassphraseSource() ApplySettings_PassphraseSourceType { + if m != nil && m.PassphraseSource != nil { + return *m.PassphraseSource + } + return ApplySettings_ASK +} + +func (m *ApplySettings) GetAutoLockDelayMs() uint32 { + if m != nil && m.AutoLockDelayMs != nil { + return *m.AutoLockDelayMs + } + return 0 +} + +func (m *ApplySettings) GetDisplayRotation() uint32 { + if m != nil && m.DisplayRotation != nil { + return *m.DisplayRotation + } + return 0 +} + +//* +// Request: set flags of the device +// @start +// @next Success +// @next Failure +type ApplyFlags struct { + Flags *uint32 `protobuf:"varint,1,opt,name=flags" json:"flags,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{5} +} + +func (m *ApplyFlags) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ApplyFlags.Unmarshal(m, b) +} +func (m *ApplyFlags) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ApplyFlags.Marshal(b, m, deterministic) +} +func (m *ApplyFlags) XXX_Merge(src proto.Message) { + xxx_messageInfo_ApplyFlags.Merge(m, src) +} +func (m *ApplyFlags) XXX_Size() int { + return xxx_messageInfo_ApplyFlags.Size(m) +} +func (m *ApplyFlags) XXX_DiscardUnknown() { + xxx_messageInfo_ApplyFlags.DiscardUnknown(m) +} + +var xxx_messageInfo_ApplyFlags proto.InternalMessageInfo + +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 +// @start +// @next Success +// @next Failure +type ChangePin struct { + Remove *bool `protobuf:"varint,1,opt,name=remove" json:"remove,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{6} +} + +func (m *ChangePin) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ChangePin.Unmarshal(m, b) +} +func (m *ChangePin) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ChangePin.Marshal(b, m, deterministic) +} +func (m *ChangePin) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChangePin.Merge(m, src) +} +func (m *ChangePin) XXX_Size() int { + return xxx_messageInfo_ChangePin.Size(m) +} +func (m *ChangePin) XXX_DiscardUnknown() { + xxx_messageInfo_ChangePin.DiscardUnknown(m) +} + +var xxx_messageInfo_ChangePin proto.InternalMessageInfo + +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 +// @start +// @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_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{7} +} + +func (m *Ping) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Ping.Unmarshal(m, b) +} +func (m *Ping) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Ping.Marshal(b, m, deterministic) +} +func (m *Ping) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ping.Merge(m, src) +} +func (m *Ping) XXX_Size() int { + return xxx_messageInfo_Ping.Size(m) +} +func (m *Ping) XXX_DiscardUnknown() { + xxx_messageInfo_Ping.DiscardUnknown(m) +} + +var xxx_messageInfo_Ping proto.InternalMessageInfo + +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 +} + +//* +// Request: Abort last operation that required user interaction +// @start +// @next Failure +type Cancel struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{8} +} + +func (m *Cancel) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Cancel.Unmarshal(m, b) +} +func (m *Cancel) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Cancel.Marshal(b, m, deterministic) +} +func (m *Cancel) XXX_Merge(src proto.Message) { + xxx_messageInfo_Cancel.Merge(m, src) +} +func (m *Cancel) XXX_Size() int { + return xxx_messageInfo_Cancel.Size(m) +} +func (m *Cancel) XXX_DiscardUnknown() { + xxx_messageInfo_Cancel.DiscardUnknown(m) +} + +var xxx_messageInfo_Cancel proto.InternalMessageInfo + +//* +// Request: Request a sample of random data generated by hardware RNG. May be used for testing. +// @start +// @next Entropy +// @next Failure +type GetEntropy struct { + Size *uint32 `protobuf:"varint,1,req,name=size" json:"size,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{9} +} + +func (m *GetEntropy) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetEntropy.Unmarshal(m, b) +} +func (m *GetEntropy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetEntropy.Marshal(b, m, deterministic) +} +func (m *GetEntropy) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEntropy.Merge(m, src) +} +func (m *GetEntropy) XXX_Size() int { + return xxx_messageInfo_GetEntropy.Size(m) +} +func (m *GetEntropy) XXX_DiscardUnknown() { + xxx_messageInfo_GetEntropy.DiscardUnknown(m) +} + +var xxx_messageInfo_GetEntropy proto.InternalMessageInfo + +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 +// @end +type Entropy struct { + Entropy []byte `protobuf:"bytes,1,req,name=entropy" json:"entropy,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{10} +} + +func (m *Entropy) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Entropy.Unmarshal(m, b) +} +func (m *Entropy) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Entropy.Marshal(b, m, deterministic) +} +func (m *Entropy) XXX_Merge(src proto.Message) { + xxx_messageInfo_Entropy.Merge(m, src) +} +func (m *Entropy) XXX_Size() int { + return xxx_messageInfo_Entropy.Size(m) +} +func (m *Entropy) XXX_DiscardUnknown() { + xxx_messageInfo_Entropy.DiscardUnknown(m) +} + +var xxx_messageInfo_Entropy proto.InternalMessageInfo + +func (m *Entropy) GetEntropy() []byte { + if m != nil { + return m.Entropy + } + return nil +} + +//* +// Request: Request device to wipe all sensitive data and settings +// @start +// @next Success +// @next Failure +type WipeDevice struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{11} +} + +func (m *WipeDevice) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_WipeDevice.Unmarshal(m, b) +} +func (m *WipeDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_WipeDevice.Marshal(b, m, deterministic) +} +func (m *WipeDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_WipeDevice.Merge(m, src) +} +func (m *WipeDevice) XXX_Size() int { + return xxx_messageInfo_WipeDevice.Size(m) +} +func (m *WipeDevice) XXX_DiscardUnknown() { + xxx_messageInfo_WipeDevice.DiscardUnknown(m) +} + +var xxx_messageInfo_WipeDevice proto.InternalMessageInfo + +//* +// Request: Load seed and related internal settings from the computer +// @start +// @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_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{12} +} + +func (m *LoadDevice) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_LoadDevice.Unmarshal(m, b) +} +func (m *LoadDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_LoadDevice.Marshal(b, m, deterministic) +} +func (m *LoadDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_LoadDevice.Merge(m, src) +} +func (m *LoadDevice) XXX_Size() int { + return xxx_messageInfo_LoadDevice.Size(m) +} +func (m *LoadDevice) XXX_DiscardUnknown() { + xxx_messageInfo_LoadDevice.DiscardUnknown(m) +} + +var xxx_messageInfo_LoadDevice proto.InternalMessageInfo + +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 +// @start +// @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"` + NoBackup *bool `protobuf:"varint,9,opt,name=no_backup,json=noBackup" json:"no_backup,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{13} +} + +func (m *ResetDevice) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ResetDevice.Unmarshal(m, b) +} +func (m *ResetDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ResetDevice.Marshal(b, m, deterministic) +} +func (m *ResetDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResetDevice.Merge(m, src) +} +func (m *ResetDevice) XXX_Size() int { + return xxx_messageInfo_ResetDevice.Size(m) +} +func (m *ResetDevice) XXX_DiscardUnknown() { + xxx_messageInfo_ResetDevice.DiscardUnknown(m) +} + +var xxx_messageInfo_ResetDevice proto.InternalMessageInfo + +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 +} + +func (m *ResetDevice) GetNoBackup() bool { + if m != nil && m.NoBackup != nil { + return *m.NoBackup + } + return false +} + +//* +// Request: Perform backup of the device seed if not backed up using ResetDevice +// @start +// @next Success +type BackupDevice struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{14} +} + +func (m *BackupDevice) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_BackupDevice.Unmarshal(m, b) +} +func (m *BackupDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_BackupDevice.Marshal(b, m, deterministic) +} +func (m *BackupDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_BackupDevice.Merge(m, src) +} +func (m *BackupDevice) XXX_Size() int { + return xxx_messageInfo_BackupDevice.Size(m) +} +func (m *BackupDevice) XXX_DiscardUnknown() { + xxx_messageInfo_BackupDevice.DiscardUnknown(m) +} + +var xxx_messageInfo_BackupDevice proto.InternalMessageInfo + +//* +// Response: Ask for additional entropy from host computer +// @next EntropyAck +type EntropyRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{15} +} + +func (m *EntropyRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EntropyRequest.Unmarshal(m, b) +} +func (m *EntropyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EntropyRequest.Marshal(b, m, deterministic) +} +func (m *EntropyRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_EntropyRequest.Merge(m, src) +} +func (m *EntropyRequest) XXX_Size() int { + return xxx_messageInfo_EntropyRequest.Size(m) +} +func (m *EntropyRequest) XXX_DiscardUnknown() { + xxx_messageInfo_EntropyRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_EntropyRequest proto.InternalMessageInfo + +//* +// Request: Provide additional entropy for seed generation function +// @next Success +type EntropyAck struct { + Entropy []byte `protobuf:"bytes,1,opt,name=entropy" json:"entropy,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{16} +} + +func (m *EntropyAck) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EntropyAck.Unmarshal(m, b) +} +func (m *EntropyAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EntropyAck.Marshal(b, m, deterministic) +} +func (m *EntropyAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_EntropyAck.Merge(m, src) +} +func (m *EntropyAck) XXX_Size() int { + return xxx_messageInfo_EntropyAck.Size(m) +} +func (m *EntropyAck) XXX_DiscardUnknown() { + xxx_messageInfo_EntropyAck.DiscardUnknown(m) +} + +var xxx_messageInfo_EntropyAck proto.InternalMessageInfo + +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. +// @start +// @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 *RecoveryDevice_RecoveryDeviceType `protobuf:"varint,8,opt,name=type,enum=hw.trezor.messages.management.RecoveryDevice_RecoveryDeviceType" 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_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{17} +} + +func (m *RecoveryDevice) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RecoveryDevice.Unmarshal(m, b) +} +func (m *RecoveryDevice) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RecoveryDevice.Marshal(b, m, deterministic) +} +func (m *RecoveryDevice) XXX_Merge(src proto.Message) { + xxx_messageInfo_RecoveryDevice.Merge(m, src) +} +func (m *RecoveryDevice) XXX_Size() int { + return xxx_messageInfo_RecoveryDevice.Size(m) +} +func (m *RecoveryDevice) XXX_DiscardUnknown() { + xxx_messageInfo_RecoveryDevice.DiscardUnknown(m) +} + +var xxx_messageInfo_RecoveryDevice proto.InternalMessageInfo + +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() RecoveryDevice_RecoveryDeviceType { + if m != nil && m.Type != nil { + return *m.Type + } + return RecoveryDevice_RecoveryDeviceType_ScrambledWords +} + +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. +// @next WordAck +type WordRequest struct { + Type *WordRequest_WordRequestType `protobuf:"varint,1,opt,name=type,enum=hw.trezor.messages.management.WordRequest_WordRequestType" json:"type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{18} +} + +func (m *WordRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_WordRequest.Unmarshal(m, b) +} +func (m *WordRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_WordRequest.Marshal(b, m, deterministic) +} +func (m *WordRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_WordRequest.Merge(m, src) +} +func (m *WordRequest) XXX_Size() int { + return xxx_messageInfo_WordRequest.Size(m) +} +func (m *WordRequest) XXX_DiscardUnknown() { + xxx_messageInfo_WordRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_WordRequest proto.InternalMessageInfo + +func (m *WordRequest) GetType() WordRequest_WordRequestType { + if m != nil && m.Type != nil { + return *m.Type + } + return WordRequest_WordRequestType_Plain +} + +//* +// Request: Computer replies with word from the mnemonic +// @next WordRequest +// @next Success +// @next Failure +type WordAck struct { + Word *string `protobuf:"bytes,1,req,name=word" json:"word,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{19} +} + +func (m *WordAck) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_WordAck.Unmarshal(m, b) +} +func (m *WordAck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_WordAck.Marshal(b, m, deterministic) +} +func (m *WordAck) XXX_Merge(src proto.Message) { + xxx_messageInfo_WordAck.Merge(m, src) +} +func (m *WordAck) XXX_Size() int { + return xxx_messageInfo_WordAck.Size(m) +} +func (m *WordAck) XXX_DiscardUnknown() { + xxx_messageInfo_WordAck.DiscardUnknown(m) +} + +var xxx_messageInfo_WordAck proto.InternalMessageInfo + +func (m *WordAck) GetWord() string { + if m != nil && m.Word != nil { + return *m.Word + } + return "" +} + +//* +// Request: Set U2F counter +// @start +// @next Success +type SetU2FCounter struct { + U2FCounter *uint32 `protobuf:"varint,1,opt,name=u2f_counter,json=u2fCounter" json:"u2f_counter,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `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 fileDescriptor_0c720c20d27aa029, []int{20} +} + +func (m *SetU2FCounter) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_SetU2FCounter.Unmarshal(m, b) +} +func (m *SetU2FCounter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_SetU2FCounter.Marshal(b, m, deterministic) +} +func (m *SetU2FCounter) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetU2FCounter.Merge(m, src) +} +func (m *SetU2FCounter) XXX_Size() int { + return xxx_messageInfo_SetU2FCounter.Size(m) +} +func (m *SetU2FCounter) XXX_DiscardUnknown() { + xxx_messageInfo_SetU2FCounter.DiscardUnknown(m) +} + +var xxx_messageInfo_SetU2FCounter proto.InternalMessageInfo + +func (m *SetU2FCounter) GetU2FCounter() uint32 { + if m != nil && m.U2FCounter != nil { + return *m.U2FCounter + } + return 0 +} + +func init() { + proto.RegisterEnum("hw.trezor.messages.management.ApplySettings_PassphraseSourceType", ApplySettings_PassphraseSourceType_name, ApplySettings_PassphraseSourceType_value) + proto.RegisterEnum("hw.trezor.messages.management.RecoveryDevice_RecoveryDeviceType", RecoveryDevice_RecoveryDeviceType_name, RecoveryDevice_RecoveryDeviceType_value) + proto.RegisterEnum("hw.trezor.messages.management.WordRequest_WordRequestType", WordRequest_WordRequestType_name, WordRequest_WordRequestType_value) + proto.RegisterType((*Initialize)(nil), "hw.trezor.messages.management.Initialize") + proto.RegisterType((*GetFeatures)(nil), "hw.trezor.messages.management.GetFeatures") + proto.RegisterType((*Features)(nil), "hw.trezor.messages.management.Features") + proto.RegisterType((*ClearSession)(nil), "hw.trezor.messages.management.ClearSession") + proto.RegisterType((*ApplySettings)(nil), "hw.trezor.messages.management.ApplySettings") + proto.RegisterType((*ApplyFlags)(nil), "hw.trezor.messages.management.ApplyFlags") + proto.RegisterType((*ChangePin)(nil), "hw.trezor.messages.management.ChangePin") + proto.RegisterType((*Ping)(nil), "hw.trezor.messages.management.Ping") + proto.RegisterType((*Cancel)(nil), "hw.trezor.messages.management.Cancel") + proto.RegisterType((*GetEntropy)(nil), "hw.trezor.messages.management.GetEntropy") + proto.RegisterType((*Entropy)(nil), "hw.trezor.messages.management.Entropy") + proto.RegisterType((*WipeDevice)(nil), "hw.trezor.messages.management.WipeDevice") + proto.RegisterType((*LoadDevice)(nil), "hw.trezor.messages.management.LoadDevice") + proto.RegisterType((*ResetDevice)(nil), "hw.trezor.messages.management.ResetDevice") + proto.RegisterType((*BackupDevice)(nil), "hw.trezor.messages.management.BackupDevice") + proto.RegisterType((*EntropyRequest)(nil), "hw.trezor.messages.management.EntropyRequest") + proto.RegisterType((*EntropyAck)(nil), "hw.trezor.messages.management.EntropyAck") + proto.RegisterType((*RecoveryDevice)(nil), "hw.trezor.messages.management.RecoveryDevice") + proto.RegisterType((*WordRequest)(nil), "hw.trezor.messages.management.WordRequest") + proto.RegisterType((*WordAck)(nil), "hw.trezor.messages.management.WordAck") + proto.RegisterType((*SetU2FCounter)(nil), "hw.trezor.messages.management.SetU2FCounter") +} + +func init() { proto.RegisterFile("messages-management.proto", fileDescriptor_0c720c20d27aa029) } + +var fileDescriptor_0c720c20d27aa029 = []byte{ + // 1393 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0xdd, 0x6e, 0xdb, 0xc8, + 0x15, 0x8e, 0x7e, 0x62, 0x49, 0xc7, 0xfa, 0xcb, 0xd4, 0x8e, 0xe9, 0xb8, 0x6e, 0x1c, 0xba, 0x6e, + 0x12, 0x04, 0x15, 0x0a, 0x17, 0x09, 0x90, 0x5c, 0x14, 0x75, 0xec, 0xfc, 0x21, 0x71, 0x6a, 0xd0, + 0x6e, 0x02, 0xf4, 0x86, 0x18, 0x91, 0x47, 0xd2, 0xd4, 0xe4, 0x0c, 0xcb, 0x19, 0xda, 0x55, 0x5e, + 0x60, 0x6f, 0xf6, 0x45, 0x16, 0xfb, 0x1c, 0x7b, 0xb5, 0xcf, 0xb0, 0xef, 0xb2, 0x98, 0x19, 0x52, + 0xa2, 0x65, 0x3b, 0x46, 0x76, 0xef, 0xe6, 0x7c, 0xe7, 0xe3, 0x68, 0xce, 0x77, 0xbe, 0x39, 0x63, + 0xc3, 0x7a, 0x8c, 0x52, 0xd2, 0x31, 0xca, 0xbf, 0xc6, 0x94, 0xd3, 0x31, 0xc6, 0xc8, 0xd5, 0x20, + 0x49, 0x85, 0x12, 0x64, 0x73, 0x72, 0x3e, 0x50, 0x29, 0x7e, 0x11, 0xe9, 0xa0, 0x20, 0x0d, 0xe6, + 0xa4, 0x7b, 0xab, 0xb3, 0x2f, 0x03, 0x11, 0xc7, 0x82, 0xdb, 0xaf, 0xdc, 0xf7, 0x00, 0xef, 0x38, + 0x53, 0x8c, 0x46, 0xec, 0x0b, 0x92, 0x15, 0xb8, 0x2d, 0x15, 0x55, 0xe8, 0x54, 0xb6, 0x2a, 0x8f, + 0xda, 0x9e, 0x0d, 0xc8, 0x43, 0xe8, 0xc9, 0x53, 0x96, 0xf8, 0x09, 0x95, 0x32, 0x99, 0xa4, 0x54, + 0xa2, 0x53, 0xdd, 0xaa, 0x3c, 0x6a, 0x7a, 0x5d, 0x0d, 0x1f, 0xcd, 0x50, 0xb7, 0x03, 0xcb, 0x6f, + 0x50, 0xbd, 0x46, 0xaa, 0xb2, 0x14, 0xa5, 0xfb, 0x7d, 0x03, 0x9a, 0x45, 0x40, 0xee, 0xc2, 0xd2, + 0x19, 0xf2, 0x50, 0xa4, 0x66, 0xef, 0x96, 0x97, 0x47, 0x64, 0x1b, 0x3a, 0x31, 0xfd, 0xaf, 0x48, + 0xfd, 0x33, 0x4c, 0x25, 0x13, 0xdc, 0x6c, 0xdd, 0xf1, 0xda, 0x06, 0xfc, 0x64, 0x31, 0x43, 0x62, + 0xbc, 0x44, 0xaa, 0xe5, 0x24, 0x0d, 0x96, 0x48, 0x09, 0x55, 0xc1, 0x64, 0x46, 0xaa, 0x5b, 0x92, + 0x01, 0x0b, 0xd2, 0x43, 0xe8, 0x0d, 0x85, 0x50, 0x91, 0xa0, 0x21, 0xa6, 0x7e, 0x2c, 0x42, 0x74, + 0x6e, 0xdb, 0x5a, 0xe6, 0xf0, 0xa1, 0x08, 0x91, 0x6c, 0x40, 0x2b, 0xc4, 0x33, 0x16, 0xa0, 0xcf, + 0x42, 0x67, 0xc9, 0x1c, 0xb9, 0x69, 0x81, 0x77, 0x21, 0xd9, 0x81, 0x6e, 0xc2, 0xb8, 0xaf, 0x25, + 0xc4, 0x40, 0xe9, 0xdf, 0x6a, 0x98, 0x4d, 0x3a, 0x09, 0xe3, 0x47, 0x33, 0x90, 0xfc, 0x1d, 0x56, + 0xe7, 0x9a, 0x95, 0xd9, 0x4d, 0xc3, 0x5e, 0x99, 0x27, 0x4b, 0x1f, 0xdd, 0x83, 0x66, 0x44, 0xf9, + 0x38, 0xa3, 0x63, 0x74, 0x5a, 0xf6, 0x77, 0x8b, 0x58, 0xf7, 0x27, 0xa2, 0x43, 0x8c, 0x1c, 0x30, + 0x09, 0x1b, 0x90, 0x2d, 0x58, 0x66, 0xb3, 0x1e, 0x86, 0x4e, 0xdb, 0x6c, 0x5e, 0x86, 0xf4, 0x9e, + 0x29, 0x9e, 0x31, 0xa3, 0x4a, 0xc7, 0xb4, 0x76, 0x16, 0x2f, 0x28, 0x32, 0xa1, 0x72, 0xe2, 0x74, + 0x0d, 0xa5, 0xa4, 0xc8, 0x5b, 0x2a, 0x27, 0x7a, 0x13, 0x16, 0x27, 0x22, 0x55, 0x18, 0x3a, 0x3d, + 0xf3, 0x1b, 0xb3, 0x98, 0x6c, 0x02, 0x68, 0x41, 0x02, 0x1a, 0x4c, 0x30, 0x74, 0xfa, 0x26, 0xdb, + 0x4a, 0x18, 0xdf, 0x37, 0x00, 0x79, 0x02, 0x77, 0x4a, 0x42, 0xe4, 0xac, 0x3b, 0x86, 0xd5, 0x9f, + 0x27, 0x72, 0xf2, 0x63, 0xe8, 0x8f, 0x58, 0x1a, 0x9f, 0xd3, 0x54, 0x6b, 0x86, 0x12, 0xb9, 0x72, + 0x88, 0xe1, 0xf6, 0x0a, 0xfc, 0xc8, 0xc2, 0xe4, 0x01, 0xb4, 0x39, 0x62, 0x28, 0xfd, 0x21, 0x0d, + 0x4e, 0xb3, 0xc4, 0xf9, 0x83, 0x2d, 0xdd, 0x60, 0x2f, 0x0d, 0xa4, 0x25, 0x1b, 0x45, 0x74, 0x2c, + 0x9d, 0x15, 0xe3, 0x06, 0x1b, 0x68, 0x54, 0xf7, 0x3e, 0x72, 0x56, 0xad, 0x90, 0x26, 0x20, 0xeb, + 0xd0, 0x1c, 0x9d, 0xfb, 0xc6, 0x79, 0xce, 0x5d, 0x43, 0x6f, 0x8c, 0xce, 0x0f, 0x75, 0x58, 0xa4, + 0xb4, 0xdf, 0x9c, 0xb5, 0x59, 0x4a, 0x87, 0x79, 0xca, 0xb8, 0xcc, 0x71, 0x8a, 0xd4, 0x91, 0x0e, + 0xb5, 0x89, 0x46, 0xe7, 0x7e, 0xee, 0xfb, 0x75, 0xdb, 0xcc, 0xd1, 0xf9, 0x27, 0xeb, 0xfc, 0x3f, + 0x43, 0x77, 0x96, 0xf4, 0x4f, 0x71, 0x2a, 0x9d, 0x7b, 0x46, 0xf7, 0x76, 0xc1, 0x78, 0x8f, 0x53, + 0xa9, 0xa5, 0xcb, 0xf8, 0x88, 0x71, 0x26, 0x27, 0x18, 0x16, 0x75, 0x6e, 0x58, 0xe9, 0xe6, 0x89, + 0xbc, 0xd8, 0x0d, 0x68, 0x71, 0x51, 0x90, 0xfe, 0x68, 0x7b, 0xc4, 0x85, 0x4d, 0xba, 0x5d, 0x68, + 0xef, 0x47, 0x48, 0xd3, 0x63, 0x94, 0xba, 0xf1, 0xee, 0x77, 0x35, 0xe8, 0xec, 0x25, 0x49, 0x34, + 0x3d, 0x46, 0xa5, 0x18, 0x1f, 0xcb, 0x0b, 0xd6, 0xab, 0x5c, 0x67, 0xbd, 0x6a, 0xd9, 0x7a, 0x3b, + 0xd0, 0xcd, 0xb4, 0xb5, 0xe7, 0x93, 0xa1, 0x66, 0x2f, 0x42, 0x26, 0x71, 0x3e, 0x18, 0xc8, 0x9f, + 0x00, 0x26, 0x22, 0x46, 0x19, 0xa4, 0x88, 0xf6, 0x5e, 0xb6, 0xbd, 0x12, 0x42, 0xf8, 0x05, 0x7f, + 0x48, 0x91, 0xa5, 0x81, 0xbd, 0x97, 0xdd, 0xdd, 0xbd, 0xc1, 0x57, 0xe7, 0xda, 0xe0, 0x42, 0x05, + 0x83, 0xf9, 0x6f, 0x1e, 0x9b, 0x4d, 0x4e, 0xa6, 0x09, 0x96, 0x2d, 0x66, 0x51, 0xf2, 0x04, 0x08, + 0xcd, 0x94, 0xf0, 0x23, 0x11, 0x9c, 0xfa, 0x21, 0x46, 0x74, 0xea, 0xc7, 0xd2, 0xdc, 0xf2, 0x8e, + 0xd7, 0xd3, 0x99, 0x0f, 0x22, 0x38, 0x3d, 0xd0, 0xf8, 0xa1, 0xd4, 0x7e, 0x0c, 0x99, 0x4c, 0x34, + 0x29, 0x15, 0x8a, 0xce, 0xae, 0x7b, 0xc7, 0xeb, 0xe5, 0xb8, 0x97, 0xc3, 0xee, 0x53, 0x58, 0xb9, + 0xea, 0x04, 0xa4, 0x01, 0xb5, 0xbd, 0xe3, 0xf7, 0xfd, 0x5b, 0x04, 0x60, 0xe9, 0xe0, 0xd5, 0xa7, + 0x77, 0xfb, 0xaf, 0xfa, 0x15, 0xd2, 0x84, 0xfa, 0xdb, 0x7f, 0x1d, 0x9f, 0xf4, 0xab, 0xae, 0x0b, + 0x60, 0xca, 0x78, 0x5d, 0x78, 0xd3, 0x3a, 0xb6, 0x52, 0x72, 0xac, 0xbb, 0x0d, 0xad, 0xfd, 0x09, + 0xe5, 0x63, 0x3c, 0x62, 0x5c, 0x0f, 0xd3, 0x14, 0x63, 0x71, 0x66, 0xdb, 0xd4, 0xf4, 0xf2, 0xc8, + 0xfd, 0xa1, 0x02, 0xf5, 0x23, 0xc6, 0xc7, 0xc4, 0x81, 0x46, 0x2e, 0x56, 0xde, 0xc8, 0x22, 0xd4, + 0x7e, 0x1a, 0x66, 0x4a, 0x89, 0x0b, 0xd3, 0xcb, 0x8e, 0xf3, 0xbe, 0x4d, 0x94, 0x66, 0xd1, 0xe5, + 0x39, 0x57, 0xfb, 0xa6, 0x39, 0x57, 0xbf, 0x7e, 0xce, 0xb9, 0x4d, 0x58, 0xda, 0xa7, 0x3c, 0xc0, + 0xc8, 0xdd, 0x02, 0x78, 0x83, 0xea, 0x15, 0x57, 0xa9, 0x48, 0xa6, 0x84, 0x40, 0x5d, 0xb2, 0x2f, + 0xfa, 0xdc, 0xd5, 0x47, 0x1d, 0xcf, 0xac, 0xdd, 0x6d, 0x68, 0x14, 0x69, 0x07, 0x1a, 0x68, 0x97, + 0x86, 0xd1, 0xf6, 0x8a, 0xd0, 0x6d, 0x03, 0x7c, 0x66, 0x09, 0x1e, 0x98, 0x21, 0xed, 0xfe, 0x58, + 0x05, 0xf8, 0x20, 0x68, 0x68, 0x43, 0x6d, 0xed, 0x98, 0x63, 0x2c, 0x38, 0x0b, 0x0a, 0x6b, 0x17, + 0x31, 0x79, 0x0e, 0x75, 0xae, 0x1f, 0x02, 0xad, 0xc2, 0xf2, 0xee, 0xce, 0x55, 0x86, 0xcb, 0xdf, + 0xcc, 0xb7, 0x07, 0x1f, 0x45, 0x68, 0x4d, 0x65, 0x3e, 0x21, 0x7d, 0xa8, 0x25, 0xcc, 0xaa, 0xd2, + 0xf2, 0xf4, 0xf2, 0x37, 0x69, 0x41, 0xb6, 0x4b, 0x17, 0x4f, 0xdb, 0xbe, 0xf5, 0xa2, 0x81, 0x7c, + 0x1c, 0x31, 0x39, 0xb9, 0xea, 0x06, 0x2e, 0x95, 0x6f, 0xe0, 0x36, 0x74, 0xcc, 0xe3, 0x1c, 0x4c, + 0x30, 0x38, 0x95, 0x59, 0x9c, 0xbf, 0x44, 0x6d, 0x0d, 0xee, 0xe7, 0x18, 0xb9, 0x0f, 0xcb, 0xd9, + 0xee, 0xc8, 0x0f, 0x44, 0xc6, 0x15, 0xa6, 0xe6, 0xf9, 0xe9, 0x78, 0x90, 0xed, 0x8e, 0xf6, 0x2d, + 0xe2, 0xfe, 0x5c, 0x85, 0x65, 0x0f, 0x25, 0xaa, 0x5c, 0xae, 0x1d, 0xe8, 0xce, 0x3c, 0x4f, 0x79, + 0x28, 0xe2, 0xdc, 0x68, 0x9d, 0xc2, 0xf1, 0x06, 0x24, 0xf7, 0xa1, 0x29, 0x55, 0x8a, 0x7c, 0xac, + 0x26, 0xf6, 0xdd, 0x7e, 0x51, 0xdb, 0x7d, 0xfa, 0xcc, 0x9b, 0x81, 0xd7, 0xab, 0x51, 0xfb, 0x8a, + 0x1a, 0x97, 0x5d, 0x57, 0xbf, 0xca, 0x75, 0xbf, 0x43, 0xb4, 0x05, 0x3d, 0x1a, 0x8b, 0x7a, 0x68, + 0x82, 0x51, 0x35, 0x1f, 0xa5, 0xf6, 0xbd, 0x06, 0x0d, 0x5d, 0x35, 0x69, 0x5b, 0x97, 0x27, 0xad, + 0x5d, 0xe5, 0x5e, 0xec, 0x43, 0x37, 0xb7, 0xaf, 0x87, 0xff, 0xcb, 0x50, 0x2a, 0xf7, 0x2f, 0x00, + 0x39, 0xb2, 0x17, 0x9c, 0x5e, 0xf4, 0x74, 0xa5, 0xec, 0xe9, 0x5f, 0x6a, 0xd0, 0xf5, 0x30, 0x10, + 0x67, 0x98, 0x4e, 0xf3, 0xd6, 0x6c, 0x02, 0x9c, 0x8b, 0x34, 0xb4, 0x87, 0xcf, 0x67, 0x44, 0x4b, + 0x23, 0xe6, 0xec, 0xd7, 0x2b, 0x5e, 0xfd, 0x26, 0xc5, 0x6b, 0x37, 0x29, 0x5e, 0xbf, 0x51, 0xf1, + 0xdb, 0x65, 0xc5, 0x1f, 0x43, 0x1f, 0xf9, 0x48, 0xa4, 0x01, 0xfa, 0xfa, 0xac, 0x11, 0x93, 0xca, + 0xb4, 0xa4, 0xe9, 0xf5, 0x72, 0xfc, 0x73, 0x0e, 0x93, 0x13, 0xa8, 0xab, 0x69, 0x82, 0x46, 0xf4, + 0xee, 0xee, 0x3f, 0x6f, 0x98, 0xff, 0x17, 0xd5, 0x59, 0x08, 0xed, 0x4d, 0xd5, 0xbb, 0x2d, 0xb6, + 0xbc, 0x75, 0xa9, 0xe5, 0x6b, 0xd0, 0x08, 0xd3, 0xa9, 0x9f, 0x66, 0xdc, 0xfc, 0x75, 0xd5, 0xf4, + 0x96, 0xc2, 0x74, 0xea, 0x65, 0xdc, 0xfd, 0x0f, 0x90, 0xcb, 0xbb, 0x92, 0x1d, 0x78, 0x70, 0x19, + 0xf5, 0x8f, 0x83, 0x94, 0xc6, 0xc3, 0x08, 0x43, 0x5d, 0x8d, 0xec, 0xdf, 0x22, 0x9b, 0xb0, 0x7e, + 0x05, 0xed, 0x90, 0xaa, 0x94, 0xfd, 0xbf, 0x5f, 0x71, 0x7f, 0xaa, 0xc0, 0xb2, 0xa6, 0xe6, 0xbe, + 0x20, 0x1f, 0xf3, 0xda, 0x2b, 0xa6, 0xf6, 0x17, 0x37, 0xd4, 0x5e, 0xfa, 0xb2, 0xbc, 0x9e, 0x57, + 0xed, 0x8e, 0xa0, 0xb7, 0x90, 0x20, 0xeb, 0xb0, 0xba, 0x00, 0xf9, 0x47, 0x11, 0x65, 0xbc, 0x7f, + 0x8b, 0x6c, 0xc0, 0xda, 0x62, 0xca, 0x9e, 0xf4, 0x79, 0xbf, 0x72, 0x7d, 0xf2, 0x59, 0xbf, 0xea, + 0x6e, 0x42, 0x43, 0x27, 0xb5, 0x99, 0x09, 0xd4, 0x75, 0x87, 0xcd, 0x74, 0x6e, 0x79, 0x66, 0xed, + 0xfe, 0x0d, 0x3a, 0xc7, 0xa8, 0xfe, 0xbd, 0xfb, 0xba, 0x74, 0xbf, 0xca, 0xdd, 0xa8, 0x2c, 0x76, + 0xe3, 0xe5, 0x3f, 0x60, 0x3b, 0x10, 0xf1, 0x40, 0x52, 0x25, 0xe4, 0x84, 0x45, 0x74, 0x28, 0x0b, + 0x21, 0x22, 0x36, 0xb4, 0xff, 0xbb, 0x0c, 0xb3, 0xd1, 0xcb, 0xb5, 0x13, 0x03, 0x1e, 0x5a, 0x71, + 0x0e, 0x67, 0xd2, 0xfc, 0x1a, 0x00, 0x00, 0xff, 0xff, 0xd7, 0x6e, 0xfc, 0x59, 0x29, 0x0d, 0x00, + 0x00, +} diff --git a/accounts/usbwallet/trezor/messages-management.proto b/accounts/usbwallet/trezor/messages-management.proto new file mode 100644 index 000000000000..0ab825a1bcca --- /dev/null +++ b/accounts/usbwallet/trezor/messages-management.proto @@ -0,0 +1,289 @@ +// This file originates from the SatoshiLabs Trezor `common` repository at: +// https://github.com/trezor/trezor-common/blob/master/protob/messages-management.proto +// dated 28.05.2019, commit 893fd219d4a01bcffa0cd9cfa631856371ec5aa9. + +syntax = "proto2"; +package hw.trezor.messages.management; + +// Sugar for easier handling in Java +option java_package = "com.satoshilabs.trezor.lib.protobuf"; +option java_outer_classname = "TrezorMessageManagement"; + +import "messages-common.proto"; + +/** + * Request: Reset device to default state and ask for device details + * @start + * @next Features + */ +message Initialize { + optional bytes state = 1; // assumed device state, clear session if set and different + optional bool skip_passphrase = 2; // this session should always assume empty passphrase +} + +/** + * Request: Ask for device details (no device reset) + * @start + * @next Features + */ +message GetFeatures { +} + +/** + * Response: Reports various information about the device + * @end + */ +message Features { + optional string vendor = 1; // name of the manufacturer, e.g. "trezor.io" + optional uint32 major_version = 2; // major version of the firmware/bootloader, e.g. 1 + optional uint32 minor_version = 3; // minor version of the firmware/bootloader, e.g. 0 + optional uint32 patch_version = 4; // patch version of the firmware/bootloader, 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 + 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) + optional string model = 21; // device hardware model + optional uint32 fw_major = 22; // reported firmware version if in bootloader mode + optional uint32 fw_minor = 23; // reported firmware version if in bootloader mode + optional uint32 fw_patch = 24; // reported firmware version if in bootloader mode + optional string fw_vendor = 25; // reported firmware vendor if in bootloader mode + optional bytes fw_vendor_keys = 26; // reported firmware vendor keys (their hash) + optional bool unfinished_backup = 27; // report unfinished backup (equals to Storage.unfinished_backup) + optional bool no_backup = 28; // report no backup (equals to Storage.no_backup) +} + +/** + * Request: clear session (removes cached PIN, passphrase, etc). + * @start + * @next Success + */ +message ClearSession { +} + +/** + * Request: change language and/or label of the device + * @start + * @next Success + * @next Failure + */ +message ApplySettings { + optional string language = 1; + optional string label = 2; + optional bool use_passphrase = 3; + optional bytes homescreen = 4; + optional PassphraseSourceType passphrase_source = 5; + optional uint32 auto_lock_delay_ms = 6; + optional uint32 display_rotation = 7; // in degrees from North + /** + * Structure representing passphrase source + */ + enum PassphraseSourceType { + ASK = 0; + DEVICE = 1; + HOST = 2; + } +} + +/** + * Request: set flags of the device + * @start + * @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 + * @start + * @next Success + * @next Failure + */ +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 + * @start + * @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 +} + +/** + * Request: Abort last operation that required user interaction + * @start + * @next Failure + */ +message Cancel { +} + +/** + * Request: Request a sample of random data generated by hardware RNG. May be used for testing. + * @start + * @next Entropy + * @next Failure + */ +message GetEntropy { + required uint32 size = 1; // size of requested entropy +} + +/** + * Response: Reply with random data generated by internal RNG + * @end + */ +message Entropy { + required bytes entropy = 1; // chunk of random generated bytes +} + +/** + * Request: Request device to wipe all sensitive data and settings + * @start + * @next Success + * @next Failure + */ +message WipeDevice { +} + +/** + * Request: Load seed and related internal settings from the computer + * @start + * @next Success + * @next Failure + */ +message LoadDevice { + optional string mnemonic = 1; // seed encoded as BIP-39 mnemonic (12, 18 or 24 words) + optional hw.trezor.messages.common.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 + * @start + * @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 + optional bool no_backup = 9; // indicate that no backup is going to be made +} + +/** + * Request: Perform backup of the device seed if not backed up using ResetDevice + * @start + * @next Success + */ +message BackupDevice { +} + +/** + * Response: Ask for additional entropy from host computer + * @next EntropyAck + */ +message EntropyRequest { +} + +/** + * Request: Provide additional entropy for seed generation function + * @next Success + */ +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. + * @start + * @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 RecoveryDeviceType type = 8; // supported recovery type + optional uint32 u2f_counter = 9; // U2F counter + optional bool dry_run = 10; // perform dry-run recovery workflow (for safe mnemonic validation) + /** + * 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. + */ + enum RecoveryDeviceType { + // use powers of two when extending this field + RecoveryDeviceType_ScrambledWords = 0; // words in scrambled order + RecoveryDeviceType_Matrix = 1; // matrix recovery type + } +} + +/** + * Response: Device is waiting for user to enter word of the mnemonic + * Its position is shown only on device's internal display. + * @next WordAck + */ +message WordRequest { + optional WordRequestType type = 1; + /** + * Type of Recovery Word request + */ + enum WordRequestType { + WordRequestType_Plain = 0; + WordRequestType_Matrix9 = 1; + WordRequestType_Matrix6 = 2; + } +} + +/** + * Request: Computer replies with word from the mnemonic + * @next WordRequest + * @next Success + * @next Failure + */ +message WordAck { + required string word = 1; // one word of mnemonic on asked position +} + +/** + * Request: Set U2F counter + * @start + * @next Success + */ +message SetU2FCounter { + optional uint32 u2f_counter = 1; // counter +} diff --git a/accounts/usbwallet/trezor/messages.pb.go b/accounts/usbwallet/trezor/messages.pb.go new file mode 100644 index 000000000000..6278bd8ee02c --- /dev/null +++ b/accounts/usbwallet/trezor/messages.pb.go @@ -0,0 +1,889 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: messages.proto + +package trezor + +import ( + fmt "fmt" + math "math" + + proto "github.com/golang/protobuf/proto" + descriptor "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.ProtoPackageIsVersion3 // please upgrade the proto package + +//* +// Mapping between TREZOR wire identifier (uint) and a protobuf message +type MessageType int32 + +const ( + // Management + 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_GetEntropy MessageType = 9 + MessageType_MessageType_Entropy MessageType = 10 + MessageType_MessageType_LoadDevice MessageType = 13 + MessageType_MessageType_ResetDevice MessageType = 14 + MessageType_MessageType_Features MessageType = 17 + MessageType_MessageType_PinMatrixRequest MessageType = 18 + MessageType_MessageType_PinMatrixAck MessageType = 19 + MessageType_MessageType_Cancel MessageType = 20 + 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_BackupDevice MessageType = 34 + MessageType_MessageType_EntropyRequest MessageType = 35 + MessageType_MessageType_EntropyAck MessageType = 36 + MessageType_MessageType_PassphraseRequest MessageType = 41 + MessageType_MessageType_PassphraseAck MessageType = 42 + MessageType_MessageType_PassphraseStateRequest MessageType = 77 + MessageType_MessageType_PassphraseStateAck MessageType = 78 + MessageType_MessageType_RecoveryDevice MessageType = 45 + MessageType_MessageType_WordRequest MessageType = 46 + MessageType_MessageType_WordAck MessageType = 47 + MessageType_MessageType_GetFeatures MessageType = 55 + MessageType_MessageType_SetU2FCounter MessageType = 63 + // Bootloader + MessageType_MessageType_FirmwareErase MessageType = 6 + MessageType_MessageType_FirmwareUpload MessageType = 7 + MessageType_MessageType_FirmwareRequest MessageType = 8 + MessageType_MessageType_SelfTest MessageType = 32 + // Bitcoin + MessageType_MessageType_GetPublicKey MessageType = 11 + MessageType_MessageType_PublicKey MessageType = 12 + MessageType_MessageType_SignTx MessageType = 15 + MessageType_MessageType_TxRequest MessageType = 21 + MessageType_MessageType_TxAck MessageType = 22 + MessageType_MessageType_GetAddress MessageType = 29 + MessageType_MessageType_Address MessageType = 30 + MessageType_MessageType_SignMessage MessageType = 38 + MessageType_MessageType_VerifyMessage MessageType = 39 + MessageType_MessageType_MessageSignature MessageType = 40 + // Crypto + MessageType_MessageType_CipherKeyValue MessageType = 23 + MessageType_MessageType_CipheredKeyValue MessageType = 48 + MessageType_MessageType_SignIdentity MessageType = 53 + MessageType_MessageType_SignedIdentity MessageType = 54 + MessageType_MessageType_GetECDHSessionKey MessageType = 61 + MessageType_MessageType_ECDHSessionKey MessageType = 62 + MessageType_MessageType_CosiCommit MessageType = 71 + MessageType_MessageType_CosiCommitment MessageType = 72 + MessageType_MessageType_CosiSign MessageType = 73 + MessageType_MessageType_CosiSignature MessageType = 74 + // Debug + 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 + // Ethereum + MessageType_MessageType_EthereumGetPublicKey MessageType = 450 + MessageType_MessageType_EthereumPublicKey MessageType = 451 + 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_EthereumSignMessage MessageType = 64 + MessageType_MessageType_EthereumVerifyMessage MessageType = 65 + MessageType_MessageType_EthereumMessageSignature MessageType = 66 + // NEM + MessageType_MessageType_NEMGetAddress MessageType = 67 + MessageType_MessageType_NEMAddress MessageType = 68 + MessageType_MessageType_NEMSignTx MessageType = 69 + MessageType_MessageType_NEMSignedTx MessageType = 70 + MessageType_MessageType_NEMDecryptMessage MessageType = 75 + MessageType_MessageType_NEMDecryptedMessage MessageType = 76 + // Lisk + MessageType_MessageType_LiskGetAddress MessageType = 114 + MessageType_MessageType_LiskAddress MessageType = 115 + MessageType_MessageType_LiskSignTx MessageType = 116 + MessageType_MessageType_LiskSignedTx MessageType = 117 + MessageType_MessageType_LiskSignMessage MessageType = 118 + MessageType_MessageType_LiskMessageSignature MessageType = 119 + MessageType_MessageType_LiskVerifyMessage MessageType = 120 + MessageType_MessageType_LiskGetPublicKey MessageType = 121 + MessageType_MessageType_LiskPublicKey MessageType = 122 + // Tezos + MessageType_MessageType_TezosGetAddress MessageType = 150 + MessageType_MessageType_TezosAddress MessageType = 151 + MessageType_MessageType_TezosSignTx MessageType = 152 + MessageType_MessageType_TezosSignedTx MessageType = 153 + MessageType_MessageType_TezosGetPublicKey MessageType = 154 + MessageType_MessageType_TezosPublicKey MessageType = 155 + // Stellar + MessageType_MessageType_StellarSignTx MessageType = 202 + MessageType_MessageType_StellarTxOpRequest MessageType = 203 + MessageType_MessageType_StellarGetAddress MessageType = 207 + MessageType_MessageType_StellarAddress MessageType = 208 + MessageType_MessageType_StellarCreateAccountOp MessageType = 210 + MessageType_MessageType_StellarPaymentOp MessageType = 211 + MessageType_MessageType_StellarPathPaymentOp MessageType = 212 + MessageType_MessageType_StellarManageOfferOp MessageType = 213 + MessageType_MessageType_StellarCreatePassiveOfferOp MessageType = 214 + MessageType_MessageType_StellarSetOptionsOp MessageType = 215 + MessageType_MessageType_StellarChangeTrustOp MessageType = 216 + MessageType_MessageType_StellarAllowTrustOp MessageType = 217 + MessageType_MessageType_StellarAccountMergeOp MessageType = 218 + // omitted: StellarInflationOp is not a supported operation, would be 219 + MessageType_MessageType_StellarManageDataOp MessageType = 220 + MessageType_MessageType_StellarBumpSequenceOp MessageType = 221 + MessageType_MessageType_StellarSignedTx MessageType = 230 + // TRON + MessageType_MessageType_TronGetAddress MessageType = 250 + MessageType_MessageType_TronAddress MessageType = 251 + MessageType_MessageType_TronSignTx MessageType = 252 + MessageType_MessageType_TronSignedTx MessageType = 253 + // Cardano + // dropped Sign/VerifyMessage ids 300-302 + MessageType_MessageType_CardanoSignTx MessageType = 303 + MessageType_MessageType_CardanoTxRequest MessageType = 304 + MessageType_MessageType_CardanoGetPublicKey MessageType = 305 + MessageType_MessageType_CardanoPublicKey MessageType = 306 + MessageType_MessageType_CardanoGetAddress MessageType = 307 + MessageType_MessageType_CardanoAddress MessageType = 308 + MessageType_MessageType_CardanoTxAck MessageType = 309 + MessageType_MessageType_CardanoSignedTx MessageType = 310 + // Ontology + MessageType_MessageType_OntologyGetAddress MessageType = 350 + MessageType_MessageType_OntologyAddress MessageType = 351 + MessageType_MessageType_OntologyGetPublicKey MessageType = 352 + MessageType_MessageType_OntologyPublicKey MessageType = 353 + MessageType_MessageType_OntologySignTransfer MessageType = 354 + MessageType_MessageType_OntologySignedTransfer MessageType = 355 + MessageType_MessageType_OntologySignWithdrawOng MessageType = 356 + MessageType_MessageType_OntologySignedWithdrawOng MessageType = 357 + MessageType_MessageType_OntologySignOntIdRegister MessageType = 358 + MessageType_MessageType_OntologySignedOntIdRegister MessageType = 359 + MessageType_MessageType_OntologySignOntIdAddAttributes MessageType = 360 + MessageType_MessageType_OntologySignedOntIdAddAttributes MessageType = 361 + // Ripple + MessageType_MessageType_RippleGetAddress MessageType = 400 + MessageType_MessageType_RippleAddress MessageType = 401 + MessageType_MessageType_RippleSignTx MessageType = 402 + MessageType_MessageType_RippleSignedTx MessageType = 403 + // Monero + MessageType_MessageType_MoneroTransactionInitRequest MessageType = 501 + MessageType_MessageType_MoneroTransactionInitAck MessageType = 502 + MessageType_MessageType_MoneroTransactionSetInputRequest MessageType = 503 + MessageType_MessageType_MoneroTransactionSetInputAck MessageType = 504 + MessageType_MessageType_MoneroTransactionInputsPermutationRequest MessageType = 505 + MessageType_MessageType_MoneroTransactionInputsPermutationAck MessageType = 506 + MessageType_MessageType_MoneroTransactionInputViniRequest MessageType = 507 + MessageType_MessageType_MoneroTransactionInputViniAck MessageType = 508 + MessageType_MessageType_MoneroTransactionAllInputsSetRequest MessageType = 509 + MessageType_MessageType_MoneroTransactionAllInputsSetAck MessageType = 510 + MessageType_MessageType_MoneroTransactionSetOutputRequest MessageType = 511 + MessageType_MessageType_MoneroTransactionSetOutputAck MessageType = 512 + MessageType_MessageType_MoneroTransactionAllOutSetRequest MessageType = 513 + MessageType_MessageType_MoneroTransactionAllOutSetAck MessageType = 514 + MessageType_MessageType_MoneroTransactionSignInputRequest MessageType = 515 + MessageType_MessageType_MoneroTransactionSignInputAck MessageType = 516 + MessageType_MessageType_MoneroTransactionFinalRequest MessageType = 517 + MessageType_MessageType_MoneroTransactionFinalAck MessageType = 518 + MessageType_MessageType_MoneroKeyImageExportInitRequest MessageType = 530 + MessageType_MessageType_MoneroKeyImageExportInitAck MessageType = 531 + MessageType_MessageType_MoneroKeyImageSyncStepRequest MessageType = 532 + MessageType_MessageType_MoneroKeyImageSyncStepAck MessageType = 533 + MessageType_MessageType_MoneroKeyImageSyncFinalRequest MessageType = 534 + MessageType_MessageType_MoneroKeyImageSyncFinalAck MessageType = 535 + MessageType_MessageType_MoneroGetAddress MessageType = 540 + MessageType_MessageType_MoneroAddress MessageType = 541 + MessageType_MessageType_MoneroGetWatchKey MessageType = 542 + MessageType_MessageType_MoneroWatchKey MessageType = 543 + MessageType_MessageType_DebugMoneroDiagRequest MessageType = 546 + MessageType_MessageType_DebugMoneroDiagAck MessageType = 547 + MessageType_MessageType_MoneroGetTxKeyRequest MessageType = 550 + MessageType_MessageType_MoneroGetTxKeyAck MessageType = 551 + MessageType_MessageType_MoneroLiveRefreshStartRequest MessageType = 552 + MessageType_MessageType_MoneroLiveRefreshStartAck MessageType = 553 + MessageType_MessageType_MoneroLiveRefreshStepRequest MessageType = 554 + MessageType_MessageType_MoneroLiveRefreshStepAck MessageType = 555 + MessageType_MessageType_MoneroLiveRefreshFinalRequest MessageType = 556 + MessageType_MessageType_MoneroLiveRefreshFinalAck MessageType = 557 + // EOS + MessageType_MessageType_EosGetPublicKey MessageType = 600 + MessageType_MessageType_EosPublicKey MessageType = 601 + MessageType_MessageType_EosSignTx MessageType = 602 + MessageType_MessageType_EosTxActionRequest MessageType = 603 + MessageType_MessageType_EosTxActionAck MessageType = 604 + MessageType_MessageType_EosSignedTx MessageType = 605 + // Binance + MessageType_MessageType_BinanceGetAddress MessageType = 700 + MessageType_MessageType_BinanceAddress MessageType = 701 + MessageType_MessageType_BinanceGetPublicKey MessageType = 702 + MessageType_MessageType_BinancePublicKey MessageType = 703 + MessageType_MessageType_BinanceSignTx MessageType = 704 + MessageType_MessageType_BinanceTxRequest MessageType = 705 + MessageType_MessageType_BinanceTransferMsg MessageType = 706 + MessageType_MessageType_BinanceOrderMsg MessageType = 707 + MessageType_MessageType_BinanceCancelMsg MessageType = 708 + MessageType_MessageType_BinanceSignedTx MessageType = 709 +) + +var MessageType_name = map[int32]string{ + 0: "MessageType_Initialize", + 1: "MessageType_Ping", + 2: "MessageType_Success", + 3: "MessageType_Failure", + 4: "MessageType_ChangePin", + 5: "MessageType_WipeDevice", + 9: "MessageType_GetEntropy", + 10: "MessageType_Entropy", + 13: "MessageType_LoadDevice", + 14: "MessageType_ResetDevice", + 17: "MessageType_Features", + 18: "MessageType_PinMatrixRequest", + 19: "MessageType_PinMatrixAck", + 20: "MessageType_Cancel", + 24: "MessageType_ClearSession", + 25: "MessageType_ApplySettings", + 26: "MessageType_ButtonRequest", + 27: "MessageType_ButtonAck", + 28: "MessageType_ApplyFlags", + 34: "MessageType_BackupDevice", + 35: "MessageType_EntropyRequest", + 36: "MessageType_EntropyAck", + 41: "MessageType_PassphraseRequest", + 42: "MessageType_PassphraseAck", + 77: "MessageType_PassphraseStateRequest", + 78: "MessageType_PassphraseStateAck", + 45: "MessageType_RecoveryDevice", + 46: "MessageType_WordRequest", + 47: "MessageType_WordAck", + 55: "MessageType_GetFeatures", + 63: "MessageType_SetU2FCounter", + 6: "MessageType_FirmwareErase", + 7: "MessageType_FirmwareUpload", + 8: "MessageType_FirmwareRequest", + 32: "MessageType_SelfTest", + 11: "MessageType_GetPublicKey", + 12: "MessageType_PublicKey", + 15: "MessageType_SignTx", + 21: "MessageType_TxRequest", + 22: "MessageType_TxAck", + 29: "MessageType_GetAddress", + 30: "MessageType_Address", + 38: "MessageType_SignMessage", + 39: "MessageType_VerifyMessage", + 40: "MessageType_MessageSignature", + 23: "MessageType_CipherKeyValue", + 48: "MessageType_CipheredKeyValue", + 53: "MessageType_SignIdentity", + 54: "MessageType_SignedIdentity", + 61: "MessageType_GetECDHSessionKey", + 62: "MessageType_ECDHSessionKey", + 71: "MessageType_CosiCommit", + 72: "MessageType_CosiCommitment", + 73: "MessageType_CosiSign", + 74: "MessageType_CosiSignature", + 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", + 450: "MessageType_EthereumGetPublicKey", + 451: "MessageType_EthereumPublicKey", + 56: "MessageType_EthereumGetAddress", + 57: "MessageType_EthereumAddress", + 58: "MessageType_EthereumSignTx", + 59: "MessageType_EthereumTxRequest", + 60: "MessageType_EthereumTxAck", + 64: "MessageType_EthereumSignMessage", + 65: "MessageType_EthereumVerifyMessage", + 66: "MessageType_EthereumMessageSignature", + 67: "MessageType_NEMGetAddress", + 68: "MessageType_NEMAddress", + 69: "MessageType_NEMSignTx", + 70: "MessageType_NEMSignedTx", + 75: "MessageType_NEMDecryptMessage", + 76: "MessageType_NEMDecryptedMessage", + 114: "MessageType_LiskGetAddress", + 115: "MessageType_LiskAddress", + 116: "MessageType_LiskSignTx", + 117: "MessageType_LiskSignedTx", + 118: "MessageType_LiskSignMessage", + 119: "MessageType_LiskMessageSignature", + 120: "MessageType_LiskVerifyMessage", + 121: "MessageType_LiskGetPublicKey", + 122: "MessageType_LiskPublicKey", + 150: "MessageType_TezosGetAddress", + 151: "MessageType_TezosAddress", + 152: "MessageType_TezosSignTx", + 153: "MessageType_TezosSignedTx", + 154: "MessageType_TezosGetPublicKey", + 155: "MessageType_TezosPublicKey", + 202: "MessageType_StellarSignTx", + 203: "MessageType_StellarTxOpRequest", + 207: "MessageType_StellarGetAddress", + 208: "MessageType_StellarAddress", + 210: "MessageType_StellarCreateAccountOp", + 211: "MessageType_StellarPaymentOp", + 212: "MessageType_StellarPathPaymentOp", + 213: "MessageType_StellarManageOfferOp", + 214: "MessageType_StellarCreatePassiveOfferOp", + 215: "MessageType_StellarSetOptionsOp", + 216: "MessageType_StellarChangeTrustOp", + 217: "MessageType_StellarAllowTrustOp", + 218: "MessageType_StellarAccountMergeOp", + 220: "MessageType_StellarManageDataOp", + 221: "MessageType_StellarBumpSequenceOp", + 230: "MessageType_StellarSignedTx", + 250: "MessageType_TronGetAddress", + 251: "MessageType_TronAddress", + 252: "MessageType_TronSignTx", + 253: "MessageType_TronSignedTx", + 303: "MessageType_CardanoSignTx", + 304: "MessageType_CardanoTxRequest", + 305: "MessageType_CardanoGetPublicKey", + 306: "MessageType_CardanoPublicKey", + 307: "MessageType_CardanoGetAddress", + 308: "MessageType_CardanoAddress", + 309: "MessageType_CardanoTxAck", + 310: "MessageType_CardanoSignedTx", + 350: "MessageType_OntologyGetAddress", + 351: "MessageType_OntologyAddress", + 352: "MessageType_OntologyGetPublicKey", + 353: "MessageType_OntologyPublicKey", + 354: "MessageType_OntologySignTransfer", + 355: "MessageType_OntologySignedTransfer", + 356: "MessageType_OntologySignWithdrawOng", + 357: "MessageType_OntologySignedWithdrawOng", + 358: "MessageType_OntologySignOntIdRegister", + 359: "MessageType_OntologySignedOntIdRegister", + 360: "MessageType_OntologySignOntIdAddAttributes", + 361: "MessageType_OntologySignedOntIdAddAttributes", + 400: "MessageType_RippleGetAddress", + 401: "MessageType_RippleAddress", + 402: "MessageType_RippleSignTx", + 403: "MessageType_RippleSignedTx", + 501: "MessageType_MoneroTransactionInitRequest", + 502: "MessageType_MoneroTransactionInitAck", + 503: "MessageType_MoneroTransactionSetInputRequest", + 504: "MessageType_MoneroTransactionSetInputAck", + 505: "MessageType_MoneroTransactionInputsPermutationRequest", + 506: "MessageType_MoneroTransactionInputsPermutationAck", + 507: "MessageType_MoneroTransactionInputViniRequest", + 508: "MessageType_MoneroTransactionInputViniAck", + 509: "MessageType_MoneroTransactionAllInputsSetRequest", + 510: "MessageType_MoneroTransactionAllInputsSetAck", + 511: "MessageType_MoneroTransactionSetOutputRequest", + 512: "MessageType_MoneroTransactionSetOutputAck", + 513: "MessageType_MoneroTransactionAllOutSetRequest", + 514: "MessageType_MoneroTransactionAllOutSetAck", + 515: "MessageType_MoneroTransactionSignInputRequest", + 516: "MessageType_MoneroTransactionSignInputAck", + 517: "MessageType_MoneroTransactionFinalRequest", + 518: "MessageType_MoneroTransactionFinalAck", + 530: "MessageType_MoneroKeyImageExportInitRequest", + 531: "MessageType_MoneroKeyImageExportInitAck", + 532: "MessageType_MoneroKeyImageSyncStepRequest", + 533: "MessageType_MoneroKeyImageSyncStepAck", + 534: "MessageType_MoneroKeyImageSyncFinalRequest", + 535: "MessageType_MoneroKeyImageSyncFinalAck", + 540: "MessageType_MoneroGetAddress", + 541: "MessageType_MoneroAddress", + 542: "MessageType_MoneroGetWatchKey", + 543: "MessageType_MoneroWatchKey", + 546: "MessageType_DebugMoneroDiagRequest", + 547: "MessageType_DebugMoneroDiagAck", + 550: "MessageType_MoneroGetTxKeyRequest", + 551: "MessageType_MoneroGetTxKeyAck", + 552: "MessageType_MoneroLiveRefreshStartRequest", + 553: "MessageType_MoneroLiveRefreshStartAck", + 554: "MessageType_MoneroLiveRefreshStepRequest", + 555: "MessageType_MoneroLiveRefreshStepAck", + 556: "MessageType_MoneroLiveRefreshFinalRequest", + 557: "MessageType_MoneroLiveRefreshFinalAck", + 600: "MessageType_EosGetPublicKey", + 601: "MessageType_EosPublicKey", + 602: "MessageType_EosSignTx", + 603: "MessageType_EosTxActionRequest", + 604: "MessageType_EosTxActionAck", + 605: "MessageType_EosSignedTx", + 700: "MessageType_BinanceGetAddress", + 701: "MessageType_BinanceAddress", + 702: "MessageType_BinanceGetPublicKey", + 703: "MessageType_BinancePublicKey", + 704: "MessageType_BinanceSignTx", + 705: "MessageType_BinanceTxRequest", + 706: "MessageType_BinanceTransferMsg", + 707: "MessageType_BinanceOrderMsg", + 708: "MessageType_BinanceCancelMsg", + 709: "MessageType_BinanceSignedTx", +} + +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_GetEntropy": 9, + "MessageType_Entropy": 10, + "MessageType_LoadDevice": 13, + "MessageType_ResetDevice": 14, + "MessageType_Features": 17, + "MessageType_PinMatrixRequest": 18, + "MessageType_PinMatrixAck": 19, + "MessageType_Cancel": 20, + "MessageType_ClearSession": 24, + "MessageType_ApplySettings": 25, + "MessageType_ButtonRequest": 26, + "MessageType_ButtonAck": 27, + "MessageType_ApplyFlags": 28, + "MessageType_BackupDevice": 34, + "MessageType_EntropyRequest": 35, + "MessageType_EntropyAck": 36, + "MessageType_PassphraseRequest": 41, + "MessageType_PassphraseAck": 42, + "MessageType_PassphraseStateRequest": 77, + "MessageType_PassphraseStateAck": 78, + "MessageType_RecoveryDevice": 45, + "MessageType_WordRequest": 46, + "MessageType_WordAck": 47, + "MessageType_GetFeatures": 55, + "MessageType_SetU2FCounter": 63, + "MessageType_FirmwareErase": 6, + "MessageType_FirmwareUpload": 7, + "MessageType_FirmwareRequest": 8, + "MessageType_SelfTest": 32, + "MessageType_GetPublicKey": 11, + "MessageType_PublicKey": 12, + "MessageType_SignTx": 15, + "MessageType_TxRequest": 21, + "MessageType_TxAck": 22, + "MessageType_GetAddress": 29, + "MessageType_Address": 30, + "MessageType_SignMessage": 38, + "MessageType_VerifyMessage": 39, + "MessageType_MessageSignature": 40, + "MessageType_CipherKeyValue": 23, + "MessageType_CipheredKeyValue": 48, + "MessageType_SignIdentity": 53, + "MessageType_SignedIdentity": 54, + "MessageType_GetECDHSessionKey": 61, + "MessageType_ECDHSessionKey": 62, + "MessageType_CosiCommit": 71, + "MessageType_CosiCommitment": 72, + "MessageType_CosiSign": 73, + "MessageType_CosiSignature": 74, + "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, + "MessageType_EthereumGetPublicKey": 450, + "MessageType_EthereumPublicKey": 451, + "MessageType_EthereumGetAddress": 56, + "MessageType_EthereumAddress": 57, + "MessageType_EthereumSignTx": 58, + "MessageType_EthereumTxRequest": 59, + "MessageType_EthereumTxAck": 60, + "MessageType_EthereumSignMessage": 64, + "MessageType_EthereumVerifyMessage": 65, + "MessageType_EthereumMessageSignature": 66, + "MessageType_NEMGetAddress": 67, + "MessageType_NEMAddress": 68, + "MessageType_NEMSignTx": 69, + "MessageType_NEMSignedTx": 70, + "MessageType_NEMDecryptMessage": 75, + "MessageType_NEMDecryptedMessage": 76, + "MessageType_LiskGetAddress": 114, + "MessageType_LiskAddress": 115, + "MessageType_LiskSignTx": 116, + "MessageType_LiskSignedTx": 117, + "MessageType_LiskSignMessage": 118, + "MessageType_LiskMessageSignature": 119, + "MessageType_LiskVerifyMessage": 120, + "MessageType_LiskGetPublicKey": 121, + "MessageType_LiskPublicKey": 122, + "MessageType_TezosGetAddress": 150, + "MessageType_TezosAddress": 151, + "MessageType_TezosSignTx": 152, + "MessageType_TezosSignedTx": 153, + "MessageType_TezosGetPublicKey": 154, + "MessageType_TezosPublicKey": 155, + "MessageType_StellarSignTx": 202, + "MessageType_StellarTxOpRequest": 203, + "MessageType_StellarGetAddress": 207, + "MessageType_StellarAddress": 208, + "MessageType_StellarCreateAccountOp": 210, + "MessageType_StellarPaymentOp": 211, + "MessageType_StellarPathPaymentOp": 212, + "MessageType_StellarManageOfferOp": 213, + "MessageType_StellarCreatePassiveOfferOp": 214, + "MessageType_StellarSetOptionsOp": 215, + "MessageType_StellarChangeTrustOp": 216, + "MessageType_StellarAllowTrustOp": 217, + "MessageType_StellarAccountMergeOp": 218, + "MessageType_StellarManageDataOp": 220, + "MessageType_StellarBumpSequenceOp": 221, + "MessageType_StellarSignedTx": 230, + "MessageType_TronGetAddress": 250, + "MessageType_TronAddress": 251, + "MessageType_TronSignTx": 252, + "MessageType_TronSignedTx": 253, + "MessageType_CardanoSignTx": 303, + "MessageType_CardanoTxRequest": 304, + "MessageType_CardanoGetPublicKey": 305, + "MessageType_CardanoPublicKey": 306, + "MessageType_CardanoGetAddress": 307, + "MessageType_CardanoAddress": 308, + "MessageType_CardanoTxAck": 309, + "MessageType_CardanoSignedTx": 310, + "MessageType_OntologyGetAddress": 350, + "MessageType_OntologyAddress": 351, + "MessageType_OntologyGetPublicKey": 352, + "MessageType_OntologyPublicKey": 353, + "MessageType_OntologySignTransfer": 354, + "MessageType_OntologySignedTransfer": 355, + "MessageType_OntologySignWithdrawOng": 356, + "MessageType_OntologySignedWithdrawOng": 357, + "MessageType_OntologySignOntIdRegister": 358, + "MessageType_OntologySignedOntIdRegister": 359, + "MessageType_OntologySignOntIdAddAttributes": 360, + "MessageType_OntologySignedOntIdAddAttributes": 361, + "MessageType_RippleGetAddress": 400, + "MessageType_RippleAddress": 401, + "MessageType_RippleSignTx": 402, + "MessageType_RippleSignedTx": 403, + "MessageType_MoneroTransactionInitRequest": 501, + "MessageType_MoneroTransactionInitAck": 502, + "MessageType_MoneroTransactionSetInputRequest": 503, + "MessageType_MoneroTransactionSetInputAck": 504, + "MessageType_MoneroTransactionInputsPermutationRequest": 505, + "MessageType_MoneroTransactionInputsPermutationAck": 506, + "MessageType_MoneroTransactionInputViniRequest": 507, + "MessageType_MoneroTransactionInputViniAck": 508, + "MessageType_MoneroTransactionAllInputsSetRequest": 509, + "MessageType_MoneroTransactionAllInputsSetAck": 510, + "MessageType_MoneroTransactionSetOutputRequest": 511, + "MessageType_MoneroTransactionSetOutputAck": 512, + "MessageType_MoneroTransactionAllOutSetRequest": 513, + "MessageType_MoneroTransactionAllOutSetAck": 514, + "MessageType_MoneroTransactionSignInputRequest": 515, + "MessageType_MoneroTransactionSignInputAck": 516, + "MessageType_MoneroTransactionFinalRequest": 517, + "MessageType_MoneroTransactionFinalAck": 518, + "MessageType_MoneroKeyImageExportInitRequest": 530, + "MessageType_MoneroKeyImageExportInitAck": 531, + "MessageType_MoneroKeyImageSyncStepRequest": 532, + "MessageType_MoneroKeyImageSyncStepAck": 533, + "MessageType_MoneroKeyImageSyncFinalRequest": 534, + "MessageType_MoneroKeyImageSyncFinalAck": 535, + "MessageType_MoneroGetAddress": 540, + "MessageType_MoneroAddress": 541, + "MessageType_MoneroGetWatchKey": 542, + "MessageType_MoneroWatchKey": 543, + "MessageType_DebugMoneroDiagRequest": 546, + "MessageType_DebugMoneroDiagAck": 547, + "MessageType_MoneroGetTxKeyRequest": 550, + "MessageType_MoneroGetTxKeyAck": 551, + "MessageType_MoneroLiveRefreshStartRequest": 552, + "MessageType_MoneroLiveRefreshStartAck": 553, + "MessageType_MoneroLiveRefreshStepRequest": 554, + "MessageType_MoneroLiveRefreshStepAck": 555, + "MessageType_MoneroLiveRefreshFinalRequest": 556, + "MessageType_MoneroLiveRefreshFinalAck": 557, + "MessageType_EosGetPublicKey": 600, + "MessageType_EosPublicKey": 601, + "MessageType_EosSignTx": 602, + "MessageType_EosTxActionRequest": 603, + "MessageType_EosTxActionAck": 604, + "MessageType_EosSignedTx": 605, + "MessageType_BinanceGetAddress": 700, + "MessageType_BinanceAddress": 701, + "MessageType_BinanceGetPublicKey": 702, + "MessageType_BinancePublicKey": 703, + "MessageType_BinanceSignTx": 704, + "MessageType_BinanceTxRequest": 705, + "MessageType_BinanceTransferMsg": 706, + "MessageType_BinanceOrderMsg": 707, + "MessageType_BinanceCancelMsg": 708, + "MessageType_BinanceSignedTx": 709, +} + +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 fileDescriptor_4dc296cbfe5ffcd5, []int{0} +} + +var E_WireIn = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50002, + Name: "hw.trezor.messages.wire_in", + Tag: "varint,50002,opt,name=wire_in", + Filename: "messages.proto", +} + +var E_WireOut = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50003, + Name: "hw.trezor.messages.wire_out", + Tag: "varint,50003,opt,name=wire_out", + Filename: "messages.proto", +} + +var E_WireDebugIn = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50004, + Name: "hw.trezor.messages.wire_debug_in", + Tag: "varint,50004,opt,name=wire_debug_in", + Filename: "messages.proto", +} + +var E_WireDebugOut = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50005, + Name: "hw.trezor.messages.wire_debug_out", + Tag: "varint,50005,opt,name=wire_debug_out", + Filename: "messages.proto", +} + +var E_WireTiny = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50006, + Name: "hw.trezor.messages.wire_tiny", + Tag: "varint,50006,opt,name=wire_tiny", + Filename: "messages.proto", +} + +var E_WireBootloader = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50007, + Name: "hw.trezor.messages.wire_bootloader", + Tag: "varint,50007,opt,name=wire_bootloader", + Filename: "messages.proto", +} + +var E_WireNoFsm = &proto.ExtensionDesc{ + ExtendedType: (*descriptor.EnumValueOptions)(nil), + ExtensionType: (*bool)(nil), + Field: 50008, + Name: "hw.trezor.messages.wire_no_fsm", + Tag: "varint,50008,opt,name=wire_no_fsm", + Filename: "messages.proto", +} + +func init() { + proto.RegisterEnum("hw.trezor.messages.MessageType", MessageType_name, MessageType_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) + proto.RegisterExtension(E_WireNoFsm) +} + +func init() { proto.RegisterFile("messages.proto", fileDescriptor_4dc296cbfe5ffcd5) } + +var fileDescriptor_4dc296cbfe5ffcd5 = []byte{ + // 2430 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x9a, 0xd9, 0x73, 0x1c, 0xc5, + 0x1d, 0xc7, 0xb3, 0xab, 0x11, 0x88, 0xf6, 0x41, 0x23, 0xb0, 0x2d, 0xaf, 0x2f, 0xf9, 0xc0, 0x96, + 0x2f, 0xd9, 0x10, 0x0c, 0x44, 0x38, 0x60, 0x69, 0xb5, 0x12, 0x8a, 0xb5, 0x5a, 0x97, 0x76, 0xb1, + 0x1f, 0x5d, 0xa3, 0x9d, 0xd6, 0x6e, 0x97, 0x67, 0x67, 0x86, 0x9e, 0x1e, 0x49, 0xeb, 0xa7, 0x9c, + 0x3c, 0x13, 0x48, 0xc0, 0xb9, 0xa9, 0xa4, 0x2a, 0x21, 0x57, 0x85, 0x1c, 0x4e, 0x25, 0x55, 0x39, + 0x08, 0x24, 0x2f, 0xc9, 0x43, 0x52, 0x9c, 0x86, 0x40, 0xee, 0x90, 0xe4, 0x0f, 0xc8, 0xc5, 0x91, + 0xa4, 0x7a, 0xa6, 0xbb, 0xe7, 0xd8, 0xdf, 0xae, 0x36, 0x6f, 0x58, 0xf3, 0xf9, 0x7d, 0x7f, 0x47, + 0xff, 0xfa, 0x37, 0xdd, 0xb3, 0xa0, 0xcd, 0x2d, 0xe2, 0xfb, 0x66, 0x83, 0xf8, 0xe3, 0x1e, 0x73, + 0xb9, 0x3b, 0x3c, 0xdc, 0x5c, 0x1d, 0xe7, 0x8c, 0x5c, 0x76, 0xd9, 0xb8, 0x7a, 0x52, 0x18, 0x6d, + 0xb8, 0x6e, 0xc3, 0x26, 0x27, 0x42, 0x62, 0x29, 0x58, 0x3e, 0x61, 0x11, 0xbf, 0xce, 0xa8, 0xc7, + 0x5d, 0x16, 0x59, 0x1d, 0xf9, 0xfe, 0x7d, 0x68, 0x43, 0x39, 0xc2, 0x6b, 0x6d, 0x8f, 0x0c, 0x1f, + 0x40, 0x5b, 0x13, 0xff, 0xbc, 0x38, 0xe7, 0x50, 0x4e, 0x4d, 0x9b, 0x5e, 0x26, 0xf8, 0x5d, 0x85, + 0xa1, 0x87, 0xaf, 0x8e, 0xe4, 0x9e, 0xba, 0x3a, 0x92, 0x1b, 0x2e, 0x20, 0x9c, 0xa4, 0xce, 0x51, + 0xa7, 0x81, 0x73, 0x05, 0x43, 0x3c, 0x1f, 0xde, 0x85, 0x6e, 0x4e, 0x3e, 0xab, 0x06, 0xf5, 0x3a, + 0xf1, 0x7d, 0x9c, 0x2f, 0x18, 0x57, 0x80, 0xc7, 0x33, 0x26, 0xb5, 0x03, 0x46, 0xf0, 0x80, 0x7c, + 0xbc, 0x07, 0x6d, 0x49, 0x3e, 0x2e, 0x36, 0x4d, 0xa7, 0x41, 0xce, 0x51, 0x07, 0x1b, 0x52, 0x7e, + 0x34, 0x1d, 0xe0, 0x05, 0xea, 0x91, 0x69, 0xb2, 0x42, 0xeb, 0x04, 0x0f, 0xc2, 0xc4, 0x2c, 0xe1, + 0x25, 0x87, 0x33, 0xd7, 0x6b, 0xe3, 0x1b, 0xe0, 0x10, 0xd5, 0x63, 0x24, 0x63, 0xc8, 0x08, 0xcc, + 0xbb, 0xa6, 0x25, 0x5d, 0x6c, 0x92, 0x02, 0x7b, 0xd1, 0xb6, 0x24, 0xb1, 0x48, 0x7c, 0xc2, 0x25, + 0xb2, 0x59, 0x22, 0xbb, 0xd1, 0x2d, 0xa9, 0x3c, 0x89, 0xc9, 0x03, 0x46, 0x7c, 0x7c, 0x93, 0x74, + 0x72, 0x10, 0xed, 0xcc, 0x94, 0xb0, 0x6c, 0x72, 0x46, 0xd7, 0x16, 0xc9, 0x83, 0x01, 0xf1, 0x39, + 0x1e, 0x96, 0xdc, 0x11, 0x34, 0x02, 0x72, 0x93, 0xf5, 0x4b, 0xf8, 0xe6, 0xc2, 0x46, 0xb5, 0x24, + 0x4f, 0x47, 0x81, 0x0f, 0xa7, 0x8a, 0x67, 0x3a, 0x75, 0x62, 0xe3, 0x5b, 0x12, 0x0b, 0xb7, 0x2f, + 0xad, 0x56, 0xb4, 0x89, 0xc9, 0xaa, 0xc4, 0xf7, 0xa9, 0xeb, 0xe0, 0x11, 0x19, 0xf9, 0x7e, 0xb4, + 0x3d, 0xc9, 0x4c, 0x7a, 0x9e, 0xdd, 0xae, 0x12, 0xce, 0xa9, 0xd3, 0xf0, 0xf1, 0x76, 0x18, 0x9a, + 0x0a, 0x38, 0x77, 0x1d, 0x15, 0x7b, 0x41, 0xc6, 0x7e, 0x28, 0xbd, 0x98, 0x11, 0x24, 0x02, 0xdf, + 0xd1, 0x11, 0xf8, 0xd6, 0x0e, 0x97, 0x33, 0xb6, 0xd9, 0xf0, 0xf1, 0x4e, 0xe9, 0x2f, 0x13, 0xf8, + 0x94, 0x59, 0xbf, 0x14, 0x78, 0xb2, 0xe4, 0xfb, 0x24, 0x73, 0x00, 0x15, 0x80, 0x65, 0x55, 0x41, + 0xed, 0x87, 0x57, 0x57, 0x52, 0x22, 0xaa, 0x03, 0x52, 0xe7, 0x10, 0xda, 0x95, 0x2a, 0xb9, 0xe9, + 0xfb, 0x5e, 0x93, 0x99, 0x3e, 0x51, 0x52, 0x87, 0xa5, 0xd4, 0xd1, 0x74, 0x11, 0x62, 0x50, 0xa8, + 0x1d, 0xc9, 0xe4, 0x78, 0x0c, 0xed, 0x83, 0xe1, 0x2a, 0x37, 0xb9, 0x96, 0x2e, 0x4b, 0xe9, 0x93, + 0x68, 0x77, 0x0f, 0x5a, 0xe8, 0x2f, 0x64, 0xf4, 0x33, 0xd9, 0x2f, 0x92, 0xba, 0xbb, 0x42, 0x58, + 0x5b, 0xd6, 0xe8, 0x38, 0xdc, 0xb9, 0x17, 0x5c, 0x66, 0x29, 0xd7, 0xe3, 0xf0, 0x0e, 0x15, 0x88, + 0xf0, 0x77, 0x02, 0x56, 0x98, 0x25, 0x5c, 0xf7, 0xf6, 0x5d, 0x70, 0x73, 0x54, 0x09, 0x7f, 0xe0, + 0xf6, 0x99, 0xa2, 0x1b, 0x38, 0x9c, 0x30, 0x7c, 0x9f, 0xae, 0x72, 0x0a, 0x9a, 0xa1, 0xac, 0xb5, + 0x6a, 0x32, 0x52, 0x12, 0x49, 0xe2, 0xeb, 0xa2, 0x9e, 0xfd, 0x9e, 0x00, 0xc7, 0xd2, 0x89, 0x29, + 0xf0, 0x01, 0xcf, 0x76, 0x4d, 0x0b, 0x5f, 0x9f, 0x20, 0x0f, 0xa3, 0x1d, 0x10, 0xa9, 0x12, 0x1c, + 0x2a, 0x0c, 0x5d, 0x51, 0xe8, 0xbe, 0xf4, 0xf6, 0xac, 0x12, 0x7b, 0xb9, 0x26, 0x98, 0xd1, 0x84, + 0x5c, 0xa6, 0xe7, 0x66, 0x09, 0x3f, 0x17, 0x2c, 0xd9, 0xb4, 0x7e, 0x96, 0xb4, 0xf1, 0x06, 0x99, + 0x45, 0x66, 0x5e, 0xc5, 0xc0, 0x46, 0x59, 0xcd, 0x9d, 0xe9, 0x3d, 0x59, 0xa5, 0x0d, 0xa7, 0xb6, + 0x86, 0x6f, 0x84, 0xcd, 0x6b, 0x7a, 0xfb, 0x6f, 0x91, 0xe6, 0x3b, 0xd0, 0x4d, 0x69, 0x40, 0x2c, + 0xc5, 0xd6, 0xae, 0x93, 0x6e, 0xd2, 0xb2, 0x98, 0x98, 0xb6, 0xbb, 0xe0, 0x49, 0xa7, 0x1e, 0xef, + 0x96, 0xea, 0x99, 0xb5, 0x14, 0xc1, 0xc9, 0x7f, 0xe3, 0x83, 0xf0, 0x5a, 0x9e, 0x27, 0x8c, 0x2e, + 0xb7, 0x15, 0x74, 0x48, 0x42, 0x99, 0x61, 0x26, 0xff, 0x5b, 0xc8, 0x85, 0x9d, 0x81, 0xc7, 0xa4, + 0xbf, 0x4c, 0x8f, 0x16, 0xa9, 0xd7, 0x24, 0xec, 0x2c, 0x69, 0x9f, 0x37, 0xed, 0x80, 0xe0, 0x6d, + 0xb0, 0x5a, 0x44, 0x11, 0x4b, 0x73, 0x27, 0xa5, 0x5a, 0x66, 0x7d, 0x84, 0xbb, 0x39, 0x8b, 0x38, + 0x9c, 0xf2, 0x36, 0x3e, 0x05, 0xcf, 0x04, 0xc1, 0x10, 0x4b, 0x53, 0x77, 0xea, 0x41, 0xb5, 0x2b, + 0xfb, 0xca, 0x28, 0x4e, 0xdf, 0x2f, 0x07, 0xa3, 0x58, 0xcd, 0xf7, 0x76, 0x19, 0x31, 0x69, 0xea, + 0x5e, 0x78, 0xc4, 0x14, 0x5d, 0x9f, 0x16, 0xdd, 0x56, 0x8b, 0x72, 0x3c, 0x0b, 0xeb, 0xc4, 0x44, + 0x8b, 0x38, 0x1c, 0xdf, 0x2f, 0x75, 0x32, 0xef, 0x10, 0x41, 0x89, 0x04, 0xf0, 0x1c, 0xbc, 0x36, + 0xea, 0x79, 0x54, 0xf3, 0xf7, 0x49, 0x91, 0x13, 0xe9, 0xdc, 0xa6, 0xc9, 0x52, 0xd0, 0x98, 0xa7, + 0xce, 0xa5, 0x69, 0x52, 0xa7, 0xe1, 0xdc, 0xb7, 0x0a, 0x1b, 0x9f, 0x48, 0x0e, 0x92, 0xa3, 0x5d, + 0x0c, 0x66, 0x09, 0x0f, 0x87, 0x0f, 0x26, 0x85, 0x21, 0x65, 0x90, 0x4d, 0x44, 0xc3, 0x11, 0xb9, + 0x5c, 0x30, 0x9e, 0x04, 0x02, 0x4d, 0x50, 0xae, 0x87, 0x1b, 0x05, 0xe3, 0x09, 0x60, 0x39, 0x35, + 0x34, 0xef, 0x36, 0x70, 0x53, 0x0a, 0x1d, 0x46, 0x7b, 0x40, 0xa6, 0x4c, 0x5a, 0x2e, 0x6b, 0x2f, + 0x12, 0xd3, 0xc2, 0x8e, 0x94, 0xbb, 0x35, 0x3d, 0x0c, 0x32, 0x28, 0x76, 0xa5, 0xe2, 0x11, 0x34, + 0xda, 0x03, 0xbb, 0xc0, 0x28, 0x27, 0xd8, 0x93, 0x92, 0xdd, 0xbc, 0xcf, 0xd8, 0xa6, 0xdf, 0x8c, + 0x06, 0xd7, 0x83, 0x12, 0x3d, 0x9a, 0x96, 0x2d, 0x71, 0xd1, 0xc2, 0x41, 0x2b, 0x35, 0x43, 0x9e, + 0x19, 0x90, 0xeb, 0x38, 0x96, 0xae, 0xb8, 0x82, 0x63, 0xf2, 0x59, 0x75, 0x3c, 0x1a, 0x4b, 0xbf, + 0x16, 0x12, 0xb2, 0x6a, 0x6b, 0xdf, 0x2d, 0x35, 0x33, 0xe9, 0x2b, 0x52, 0x61, 0xef, 0x81, 0x77, + 0xa4, 0xc2, 0xe4, 0x98, 0x9a, 0x80, 0xdf, 0x88, 0x8a, 0x8a, 0xc7, 0xd5, 0x3d, 0x52, 0x2e, 0xb3, + 0xd0, 0x31, 0x28, 0xc6, 0xd6, 0x69, 0xa9, 0x96, 0x29, 0x63, 0xd2, 0xa7, 0x1a, 0x2c, 0x67, 0x24, + 0x7a, 0x14, 0xed, 0x85, 0xd0, 0xf4, 0x14, 0x9a, 0x94, 0xf0, 0x38, 0x3a, 0x00, 0xc1, 0x1d, 0xd3, + 0x68, 0x0a, 0x0e, 0x76, 0xa1, 0x54, 0x4e, 0xd4, 0xb1, 0x08, 0xcf, 0xd8, 0x85, 0x52, 0x59, 0x11, + 0xd3, 0xf0, 0x91, 0x75, 0xa1, 0x54, 0x96, 0xd5, 0x2b, 0xc1, 0x6f, 0x4c, 0x09, 0x10, 0xab, 0xb6, + 0x86, 0x67, 0xe0, 0x01, 0xb4, 0x50, 0x2a, 0x4f, 0x93, 0x3a, 0x6b, 0x7b, 0x5c, 0xe5, 0x78, 0x16, + 0xae, 0x5d, 0x0c, 0x12, 0x4b, 0xa1, 0xf3, 0xf0, 0xd2, 0xce, 0x53, 0xff, 0x52, 0x22, 0x3f, 0x06, + 0x07, 0x27, 0x28, 0x85, 0xf8, 0x5d, 0xce, 0xc3, 0xd4, 0xbf, 0x24, 0x33, 0xe4, 0xf0, 0xe9, 0x4c, + 0x11, 0x61, 0x8a, 0x81, 0x54, 0xc9, 0x34, 0xa4, 0x62, 0x54, 0xd4, 0x2b, 0x52, 0x2a, 0xb3, 0x1f, + 0x05, 0xd6, 0xb1, 0x80, 0xab, 0x70, 0xd5, 0x04, 0x9b, 0xee, 0x8c, 0x35, 0xf8, 0x8d, 0x22, 0x4b, + 0x11, 0xef, 0xaf, 0x36, 0x3c, 0x50, 0x05, 0x17, 0x43, 0x97, 0xf5, 0xc9, 0x3d, 0x95, 0x48, 0x8d, + 0x5c, 0x76, 0xfd, 0x44, 0x61, 0x1f, 0xcb, 0x69, 0xb1, 0x91, 0x0e, 0x4e, 0x41, 0x8f, 0xe7, 0xf4, + 0x3b, 0x6c, 0x5b, 0x07, 0x24, 0x8b, 0x7b, 0x25, 0xa7, 0x5f, 0x16, 0xdb, 0x41, 0x26, 0x2c, 0xef, + 0x27, 0x72, 0x7a, 0x34, 0xec, 0x82, 0xc2, 0x8a, 0xe3, 0xff, 0x64, 0x4e, 0x8f, 0x86, 0x42, 0x07, + 0x19, 0x63, 0x9f, 0xca, 0xe9, 0xfe, 0x49, 0x9f, 0xe2, 0x38, 0xb1, 0x6d, 0x93, 0xc9, 0xe0, 0x7e, + 0x9e, 0xd3, 0x0d, 0xb9, 0x1b, 0xa0, 0x6a, 0x6b, 0x15, 0x4f, 0xcd, 0x86, 0x5f, 0x74, 0x89, 0x50, + 0xa2, 0x89, 0xd2, 0xfd, 0xb2, 0x4b, 0x84, 0x92, 0x54, 0xd8, 0xaf, 0x94, 0xe0, 0xf1, 0xf4, 0x91, + 0x5a, 0x62, 0x45, 0x46, 0xc2, 0x23, 0x72, 0x5d, 0x1c, 0x38, 0x2b, 0x1e, 0x7e, 0x2e, 0xa7, 0xa7, + 0xd8, 0x4e, 0x00, 0x3f, 0x67, 0xb6, 0xc5, 0x4b, 0xb7, 0xe2, 0xe1, 0xe7, 0x73, 0x7a, 0xea, 0x8c, + 0x82, 0x20, 0x6f, 0xc6, 0xf0, 0x0b, 0xbd, 0xe1, 0xb2, 0xe9, 0x98, 0x0d, 0x52, 0x59, 0x5e, 0x26, + 0xac, 0xe2, 0xe1, 0x17, 0x15, 0x7c, 0x3b, 0x3a, 0xd4, 0x35, 0x62, 0x71, 0xc6, 0xa7, 0x2b, 0xda, + 0xe6, 0xa5, 0x9c, 0xde, 0x11, 0x7b, 0xa0, 0x75, 0x20, 0xbc, 0xe2, 0x71, 0xea, 0x3a, 0x7e, 0xc5, + 0xc3, 0x2f, 0xf7, 0x0e, 0x26, 0xba, 0x45, 0xd7, 0x58, 0xe0, 0x8b, 0xc8, 0xaf, 0xf5, 0x16, 0x9e, + 0xb4, 0x6d, 0x77, 0x55, 0xb1, 0xaf, 0x28, 0xf6, 0x58, 0x7a, 0x10, 0x2b, 0x36, 0x2a, 0x72, 0x99, + 0xb0, 0x06, 0xa9, 0x78, 0xf8, 0xd5, 0xde, 0xca, 0x51, 0x4d, 0xa6, 0x4d, 0x6e, 0x56, 0x3c, 0xfc, + 0x5a, 0x6f, 0xe5, 0xa9, 0xa0, 0xe5, 0x55, 0x45, 0x03, 0x39, 0x75, 0xa1, 0xfc, 0x7a, 0x4e, 0xef, + 0xe4, 0x1d, 0x5d, 0x9a, 0x32, 0xdc, 0x0d, 0x6f, 0xe4, 0xf4, 0xb4, 0x49, 0xf7, 0x38, 0x73, 0x9d, + 0x44, 0xa3, 0xbd, 0x99, 0xd3, 0x83, 0x6b, 0x5b, 0x16, 0x53, 0xcc, 0x5b, 0x39, 0x7d, 0x48, 0xde, + 0x9a, 0x65, 0xe4, 0x26, 0x78, 0xbb, 0xdb, 0x56, 0x97, 0x48, 0x18, 0xd2, 0x3b, 0x5d, 0xf6, 0x53, + 0xd1, 0x64, 0x96, 0xe9, 0xb8, 0x52, 0xea, 0x1b, 0x79, 0xb8, 0x49, 0x25, 0x15, 0xbf, 0x69, 0x9f, + 0xca, 0xeb, 0x0f, 0x03, 0x7b, 0x00, 0x30, 0xb5, 0xe3, 0xbf, 0xd9, 0x5b, 0x34, 0x06, 0xbf, 0x95, + 0x87, 0xb7, 0x68, 0x2c, 0xaa, 0xaa, 0xf2, 0xed, 0x3c, 0xbc, 0x45, 0x25, 0xa9, 0xb0, 0xef, 0xe4, + 0xf5, 0x3b, 0x76, 0x04, 0x4c, 0x47, 0x9c, 0x07, 0xae, 0xe6, 0xe1, 0x45, 0x4d, 0x54, 0x26, 0xac, + 0xe0, 0x77, 0x95, 0x58, 0x66, 0xd6, 0x54, 0x1c, 0xee, 0xda, 0x6e, 0xa3, 0x9d, 0x08, 0xef, 0x37, + 0x5d, 0x24, 0x15, 0xaa, 0xb8, 0xdf, 0xe6, 0xf5, 0x15, 0x7e, 0xb4, 0x8b, 0x64, 0x5c, 0x9d, 0xdf, + 0xe5, 0xe1, 0x73, 0x9a, 0x82, 0x63, 0xf2, 0xf7, 0xeb, 0xc8, 0x86, 0x8b, 0xcd, 0x4c, 0xc7, 0x5f, + 0x26, 0x0c, 0xff, 0x41, 0xc9, 0x66, 0xc6, 0x58, 0x12, 0x26, 0x96, 0xc6, 0xff, 0xa8, 0xb4, 0xc7, + 0xd1, 0xfe, 0x6e, 0xf8, 0x05, 0xca, 0x9b, 0x16, 0x33, 0x57, 0x2b, 0x4e, 0x03, 0xff, 0x49, 0xc9, + 0x9f, 0x44, 0xb7, 0x76, 0x97, 0x4f, 0x5a, 0xfc, 0x39, 0xaf, 0x3f, 0x3e, 0x74, 0xb5, 0xa8, 0x38, + 0x7c, 0xce, 0x5a, 0x24, 0x0d, 0xea, 0x8b, 0xbb, 0xfc, 0x1b, 0x79, 0x78, 0xae, 0xa5, 0x7d, 0xa4, + 0x6d, 0xfe, 0xa2, 0xbc, 0x9c, 0x42, 0x47, 0x7a, 0x7a, 0x99, 0xb4, 0xac, 0x49, 0xce, 0x19, 0x5d, + 0x0a, 0x38, 0xf1, 0xf1, 0x5f, 0x95, 0xab, 0xbb, 0xd0, 0xb1, 0x75, 0x5c, 0xa5, 0x0d, 0xff, 0x96, + 0xd7, 0xa7, 0x85, 0xd4, 0x26, 0x58, 0xa4, 0x9e, 0x67, 0x93, 0x44, 0xef, 0x3c, 0x3c, 0x00, 0xbf, + 0x6f, 0x23, 0x50, 0x51, 0x1f, 0x1d, 0x80, 0x3b, 0x3b, 0xa2, 0xe4, 0x6e, 0x7e, 0x64, 0x00, 0xde, + 0x25, 0x31, 0x14, 0x36, 0xf6, 0xa3, 0x0a, 0x7b, 0x37, 0x1a, 0x4b, 0xdd, 0x9f, 0x5d, 0x87, 0x30, + 0x37, 0x5c, 0x79, 0xb3, 0x2e, 0x66, 0xfc, 0x9c, 0x43, 0xb9, 0x1a, 0x00, 0x7f, 0x1f, 0xd0, 0x17, + 0xbb, 0x03, 0xeb, 0x1a, 0x89, 0x6d, 0xf6, 0x0f, 0x65, 0x90, 0xa9, 0x5c, 0x87, 0x41, 0x95, 0xf0, + 0x39, 0xc7, 0x0b, 0xb4, 0xa7, 0x7f, 0x2a, 0xc3, 0xf5, 0xc2, 0x53, 0x86, 0xc2, 0xdb, 0xbf, 0x94, + 0xd1, 0x19, 0x74, 0x6a, 0x9d, 0xf0, 0xbc, 0x80, 0xfb, 0xe7, 0x08, 0x6b, 0x05, 0xdc, 0x14, 0x7f, + 0x50, 0x6e, 0xff, 0xad, 0x14, 0x4e, 0xa3, 0xdb, 0xfe, 0x3f, 0x05, 0xe1, 0xff, 0x4d, 0x65, 0x7d, + 0x37, 0x3a, 0xbe, 0xbe, 0xf5, 0x79, 0xea, 0x50, 0xe5, 0xf7, 0x2d, 0x65, 0x79, 0x07, 0x3a, 0xdc, + 0x9f, 0xa5, 0xf0, 0xf7, 0xb6, 0xb2, 0xba, 0x07, 0x9d, 0xec, 0x69, 0x35, 0x69, 0xdb, 0x51, 0xc0, + 0x55, 0xa2, 0x2b, 0xfc, 0x4e, 0xbf, 0x4b, 0x93, 0x34, 0x16, 0x5e, 0xff, 0xd3, 0x6f, 0x96, 0xe2, + 0x98, 0x10, 0xf0, 0xc4, 0xa2, 0xfe, 0xb7, 0xdf, 0x2c, 0xb5, 0xa5, 0xf0, 0xf7, 0x7e, 0xa3, 0x4f, + 0x7f, 0x93, 0xb6, 0x5d, 0x09, 0x78, 0x22, 0xc5, 0x0f, 0x18, 0x7d, 0xfa, 0xd3, 0x96, 0xc2, 0xdf, + 0x07, 0xfb, 0xf5, 0x17, 0x7e, 0xf4, 0x49, 0x36, 0xed, 0x87, 0xfa, 0xf5, 0xa7, 0x2d, 0x85, 0xbf, + 0x0f, 0xf7, 0x6b, 0x35, 0x43, 0x1d, 0xd3, 0x56, 0xbe, 0x3e, 0x62, 0xc0, 0x03, 0x13, 0xb6, 0x12, + 0x7e, 0x1e, 0x52, 0x16, 0x77, 0xa2, 0xa3, 0x9d, 0x16, 0x67, 0x49, 0x7b, 0xae, 0x65, 0x36, 0x48, + 0x69, 0xcd, 0x73, 0x19, 0x4f, 0x6e, 0xfa, 0x47, 0x94, 0x5d, 0x66, 0xd0, 0x76, 0xb3, 0x13, 0xbe, + 0x1e, 0xed, 0x99, 0x93, 0xb2, 0xa9, 0xb6, 0x9d, 0x7a, 0x95, 0x13, 0x7d, 0x5a, 0xff, 0x58, 0xcf, + 0x9c, 0xb2, 0x56, 0xc2, 0xcf, 0xc7, 0x0d, 0x78, 0xa0, 0x77, 0x5a, 0xa4, 0x8a, 0xf7, 0x98, 0x32, + 0xbb, 0x0d, 0x1d, 0xec, 0xc3, 0x4c, 0x78, 0x7a, 0xdc, 0x80, 0x47, 0x79, 0x64, 0x92, 0x18, 0xe5, + 0x9f, 0x36, 0xe0, 0x51, 0x1e, 0x81, 0x8a, 0xfa, 0x8c, 0x01, 0x9f, 0x7a, 0xb4, 0xdc, 0x05, 0x93, + 0xd7, 0x9b, 0xe2, 0xbd, 0xfe, 0x59, 0x03, 0x9e, 0xe7, 0x11, 0xa9, 0xb1, 0xcf, 0x19, 0xf0, 0xc5, + 0x24, 0xfc, 0x50, 0x14, 0xb1, 0xd3, 0xd4, 0x6c, 0xa8, 0x0a, 0x7c, 0xde, 0x80, 0xef, 0x50, 0x19, + 0x5c, 0x64, 0xfe, 0x05, 0xa5, 0x9c, 0x39, 0x2d, 0xeb, 0x50, 0x6b, 0x6b, 0x67, 0x89, 0xfe, 0xa9, + 0xe3, 0x8b, 0x06, 0x7c, 0x60, 0x49, 0xd3, 0x42, 0xf7, 0x4b, 0x3d, 0x7b, 0x64, 0x9e, 0xae, 0x90, + 0x45, 0xb2, 0xcc, 0x88, 0xdf, 0xac, 0x72, 0x93, 0xe9, 0x6e, 0x7c, 0xd2, 0x80, 0x8f, 0x16, 0xb0, + 0x95, 0xf0, 0xf3, 0x65, 0xa3, 0xd7, 0xab, 0x24, 0x65, 0x11, 0xb7, 0xe2, 0x57, 0x94, 0x1b, 0xf0, + 0x4d, 0x97, 0x31, 0x12, 0x5e, 0xbe, 0xda, 0x6f, 0x36, 0xa9, 0x46, 0xfc, 0x5a, 0xbf, 0xd9, 0xe8, + 0x3e, 0xfc, 0xba, 0x01, 0x7f, 0x0a, 0x28, 0x65, 0x6e, 0xdc, 0xd7, 0x0c, 0xf8, 0x7e, 0x50, 0x4a, + 0xde, 0xb7, 0x5f, 0x31, 0xf4, 0x67, 0x96, 0x2d, 0x19, 0x48, 0x9e, 0x26, 0x5e, 0xed, 0xd2, 0x27, + 0x25, 0xd7, 0x17, 0x07, 0xe9, 0xe4, 0xbb, 0xf3, 0xd7, 0x06, 0x7c, 0xff, 0x49, 0xa0, 0x22, 0x81, + 0xd7, 0x0c, 0xf8, 0xfe, 0x53, 0x4a, 0x7c, 0x58, 0x78, 0xbd, 0xcb, 0xee, 0x98, 0xa2, 0x8e, 0xe9, + 0xd4, 0x93, 0x07, 0xa7, 0x1f, 0x0c, 0xc2, 0xbb, 0x43, 0x92, 0x0a, 0xfb, 0xe1, 0x20, 0x7c, 0x73, + 0x89, 0x05, 0xe3, 0xa2, 0xfc, 0x68, 0x10, 0xbe, 0xb9, 0x48, 0x36, 0x06, 0x7f, 0x3c, 0x08, 0xdf, + 0xae, 0x24, 0x28, 0x2b, 0xf8, 0x74, 0x6f, 0xb9, 0xf8, 0x76, 0xf5, 0x93, 0x41, 0xf8, 0xaa, 0xa1, + 0x40, 0x79, 0x18, 0x2f, 0xfb, 0x0d, 0xfc, 0xcc, 0x20, 0x7c, 0xd5, 0x90, 0x68, 0x85, 0x59, 0x11, + 0xf7, 0x6c, 0x6f, 0xdf, 0xd1, 0x8f, 0xb4, 0x02, 0xfc, 0x69, 0x6f, 0x41, 0xbd, 0x30, 0x3f, 0x93, + 0x31, 0x4e, 0x9c, 0x46, 0xd7, 0xaf, 0x52, 0x46, 0x2e, 0x52, 0x67, 0x78, 0xef, 0x78, 0xf4, 0x4b, + 0xff, 0xb8, 0xfa, 0xa5, 0x7f, 0xbc, 0xe4, 0x04, 0xad, 0xf0, 0xe7, 0x12, 0xf9, 0x95, 0x60, 0xe4, + 0xb9, 0x87, 0x06, 0x46, 0x73, 0x63, 0x43, 0x8b, 0xd7, 0x09, 0x9b, 0x39, 0x67, 0xe2, 0x5e, 0x34, + 0x14, 0x5a, 0xbb, 0x01, 0xef, 0xc7, 0xfc, 0x79, 0x69, 0x1e, 0xba, 0xac, 0x04, 0x7c, 0x62, 0x16, + 0x6d, 0x0a, 0xed, 0x2d, 0x31, 0xad, 0xfa, 0x8c, 0xe1, 0x05, 0x29, 0xb2, 0x41, 0x58, 0x86, 0x63, + 0x6e, 0xce, 0x99, 0x98, 0x43, 0x9b, 0x13, 0x42, 0x7d, 0x86, 0xf3, 0xa2, 0x54, 0xda, 0xa8, 0x95, + 0x44, 0x4c, 0x67, 0xd0, 0x0d, 0xa1, 0x14, 0xa7, 0x4e, 0xbb, 0x1f, 0x95, 0x97, 0xa4, 0x4a, 0x58, + 0x89, 0x1a, 0x75, 0xda, 0x13, 0xf3, 0xe8, 0xc6, 0x50, 0x61, 0xc9, 0x75, 0xb9, 0xed, 0x9a, 0x16, + 0x61, 0xfd, 0xe8, 0xbc, 0x2c, 0x75, 0xc2, 0x44, 0xa6, 0xb4, 0xe9, 0x44, 0x11, 0x85, 0x99, 0x5e, + 0x74, 0xdc, 0x8b, 0xcb, 0x7e, 0xab, 0x1f, 0xa5, 0x6b, 0x52, 0x29, 0xcc, 0x63, 0xc1, 0x9d, 0xf1, + 0x5b, 0x53, 0x77, 0xa0, 0xfd, 0x75, 0xb7, 0x35, 0xee, 0x9b, 0xdc, 0xf5, 0x9b, 0xd4, 0x36, 0x97, + 0x7c, 0xf5, 0xff, 0x79, 0xd8, 0x74, 0x49, 0x4b, 0x4d, 0x6d, 0xaa, 0x85, 0x7f, 0x94, 0x9d, 0xf3, + 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xa3, 0x69, 0x67, 0x5d, 0x1f, 0x22, 0x00, 0x00, +} diff --git a/accounts/usbwallet/trezor/messages.proto b/accounts/usbwallet/trezor/messages.proto new file mode 100644 index 000000000000..3e0482e3446f --- /dev/null +++ b/accounts/usbwallet/trezor/messages.proto @@ -0,0 +1,264 @@ +// This file originates from the SatoshiLabs Trezor `common` repository at: +// https://github.com/trezor/trezor-common/blob/master/protob/messages.proto +// dated 28.05.2019, commit 893fd219d4a01bcffa0cd9cfa631856371ec5aa9. + +syntax = "proto2"; +package hw.trezor.messages; + +/** + * Messages for TREZOR communication + */ + +// Sugar for easier handling in Java +option java_package = "com.satoshilabs.trezor.lib.protobuf"; +option java_outer_classname = "TrezorMessage"; + +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 + optional bool wire_no_fsm = 50008; // message is not handled by TREZOR unless the USB stack is in tiny mode +} + +/** + * Mapping between TREZOR wire identifier (uint) and a protobuf message + */ +enum MessageType { + + // Management + MessageType_Initialize = 0 [(wire_in) = true, (wire_tiny) = 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_GetEntropy = 9 [(wire_in) = true]; + MessageType_Entropy = 10 [(wire_out) = true]; + MessageType_LoadDevice = 13 [(wire_in) = true]; + MessageType_ResetDevice = 14 [(wire_in) = true]; + MessageType_Features = 17 [(wire_out) = true]; + MessageType_PinMatrixRequest = 18 [(wire_out) = true]; + MessageType_PinMatrixAck = 19 [(wire_in) = true, (wire_tiny) = true, (wire_no_fsm) = true]; + MessageType_Cancel = 20 [(wire_in) = true, (wire_tiny) = 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, (wire_no_fsm) = true]; + MessageType_ApplyFlags = 28 [(wire_in) = true]; + MessageType_BackupDevice = 34 [(wire_in) = true]; + MessageType_EntropyRequest = 35 [(wire_out) = true]; + MessageType_EntropyAck = 36 [(wire_in) = true]; + MessageType_PassphraseRequest = 41 [(wire_out) = true]; + MessageType_PassphraseAck = 42 [(wire_in) = true, (wire_tiny) = true, (wire_no_fsm) = true]; + MessageType_PassphraseStateRequest = 77 [(wire_out) = true]; + MessageType_PassphraseStateAck = 78 [(wire_in) = true, (wire_tiny) = true, (wire_no_fsm) = true]; + MessageType_RecoveryDevice = 45 [(wire_in) = true]; + MessageType_WordRequest = 46 [(wire_out) = true]; + MessageType_WordAck = 47 [(wire_in) = true]; + MessageType_GetFeatures = 55 [(wire_in) = true]; + MessageType_SetU2FCounter = 63 [(wire_in) = true]; + + // Bootloader + 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_SelfTest = 32 [(wire_in) = true, (wire_bootloader) = true]; + + // Bitcoin + MessageType_GetPublicKey = 11 [(wire_in) = true]; + MessageType_PublicKey = 12 [(wire_out) = true]; + MessageType_SignTx = 15 [(wire_in) = true]; + MessageType_TxRequest = 21 [(wire_out) = true]; + MessageType_TxAck = 22 [(wire_in) = true]; + MessageType_GetAddress = 29 [(wire_in) = true]; + MessageType_Address = 30 [(wire_out) = true]; + MessageType_SignMessage = 38 [(wire_in) = true]; + MessageType_VerifyMessage = 39 [(wire_in) = true]; + MessageType_MessageSignature = 40 [(wire_out) = true]; + + // Crypto + MessageType_CipherKeyValue = 23 [(wire_in) = true]; + MessageType_CipheredKeyValue = 48 [(wire_out) = true]; + MessageType_SignIdentity = 53 [(wire_in) = true]; + MessageType_SignedIdentity = 54 [(wire_out) = true]; + MessageType_GetECDHSessionKey = 61 [(wire_in) = true]; + MessageType_ECDHSessionKey = 62 [(wire_out) = true]; + MessageType_CosiCommit = 71 [(wire_in) = true]; + MessageType_CosiCommitment = 72 [(wire_out) = true]; + MessageType_CosiSign = 73 [(wire_in) = true]; + MessageType_CosiSignature = 74 [(wire_out) = true]; + + // Debug + MessageType_DebugLinkDecision = 100 [(wire_debug_in) = true, (wire_tiny) = true, (wire_no_fsm) = true]; + MessageType_DebugLinkGetState = 101 [(wire_debug_in) = true, (wire_tiny) = 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]; + + // Ethereum + MessageType_EthereumGetPublicKey = 450 [(wire_in) = true]; + MessageType_EthereumPublicKey = 451 [(wire_out) = 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_EthereumSignMessage = 64 [(wire_in) = true]; + MessageType_EthereumVerifyMessage = 65 [(wire_in) = true]; + MessageType_EthereumMessageSignature = 66 [(wire_out) = true]; + + // NEM + MessageType_NEMGetAddress = 67 [(wire_in) = true]; + MessageType_NEMAddress = 68 [(wire_out) = true]; + MessageType_NEMSignTx = 69 [(wire_in) = true]; + MessageType_NEMSignedTx = 70 [(wire_out) = true]; + MessageType_NEMDecryptMessage = 75 [(wire_in) = true]; + MessageType_NEMDecryptedMessage = 76 [(wire_out) = true]; + + // Lisk + MessageType_LiskGetAddress = 114 [(wire_in) = true]; + MessageType_LiskAddress = 115 [(wire_out) = true]; + MessageType_LiskSignTx = 116 [(wire_in) = true]; + MessageType_LiskSignedTx = 117 [(wire_out) = true]; + MessageType_LiskSignMessage = 118 [(wire_in) = true]; + MessageType_LiskMessageSignature = 119 [(wire_out) = true]; + MessageType_LiskVerifyMessage = 120 [(wire_in) = true]; + MessageType_LiskGetPublicKey = 121 [(wire_in) = true]; + MessageType_LiskPublicKey = 122 [(wire_out) = true]; + + // Tezos + MessageType_TezosGetAddress = 150 [(wire_in) = true]; + MessageType_TezosAddress = 151 [(wire_out) = true]; + MessageType_TezosSignTx = 152 [(wire_in) = true]; + MessageType_TezosSignedTx = 153 [(wire_out) = true]; + MessageType_TezosGetPublicKey = 154 [(wire_in) = true]; + MessageType_TezosPublicKey = 155 [(wire_out) = true]; + + // Stellar + MessageType_StellarSignTx = 202 [(wire_in) = true]; + MessageType_StellarTxOpRequest = 203 [(wire_out) = true]; + MessageType_StellarGetAddress = 207 [(wire_in) = true]; + MessageType_StellarAddress = 208 [(wire_out) = true]; + MessageType_StellarCreateAccountOp = 210 [(wire_in) = true]; + MessageType_StellarPaymentOp = 211 [(wire_in) = true]; + MessageType_StellarPathPaymentOp = 212 [(wire_in) = true]; + MessageType_StellarManageOfferOp = 213 [(wire_in) = true]; + MessageType_StellarCreatePassiveOfferOp = 214 [(wire_in) = true]; + MessageType_StellarSetOptionsOp = 215 [(wire_in) = true]; + MessageType_StellarChangeTrustOp = 216 [(wire_in) = true]; + MessageType_StellarAllowTrustOp = 217 [(wire_in) = true]; + MessageType_StellarAccountMergeOp = 218 [(wire_in) = true]; + // omitted: StellarInflationOp is not a supported operation, would be 219 + MessageType_StellarManageDataOp = 220 [(wire_in) = true]; + MessageType_StellarBumpSequenceOp = 221 [(wire_in) = true]; + MessageType_StellarSignedTx = 230 [(wire_out) = true]; + + // TRON + MessageType_TronGetAddress = 250 [(wire_in) = true]; + MessageType_TronAddress = 251 [(wire_out) = true]; + MessageType_TronSignTx = 252 [(wire_in) = true]; + MessageType_TronSignedTx = 253 [(wire_out) = true]; + + // Cardano + // dropped Sign/VerifyMessage ids 300-302 + MessageType_CardanoSignTx = 303 [(wire_in) = true]; + MessageType_CardanoTxRequest = 304 [(wire_out) = true]; + MessageType_CardanoGetPublicKey = 305 [(wire_in) = true]; + MessageType_CardanoPublicKey = 306 [(wire_out) = true]; + MessageType_CardanoGetAddress = 307 [(wire_in) = true]; + MessageType_CardanoAddress = 308 [(wire_out) = true]; + MessageType_CardanoTxAck = 309 [(wire_in) = true]; + MessageType_CardanoSignedTx = 310 [(wire_out) = true]; + + // Ontology + MessageType_OntologyGetAddress = 350 [(wire_in) = true]; + MessageType_OntologyAddress = 351 [(wire_out) = true]; + MessageType_OntologyGetPublicKey = 352 [(wire_in) = true]; + MessageType_OntologyPublicKey = 353 [(wire_out) = true]; + MessageType_OntologySignTransfer = 354 [(wire_in) = true]; + MessageType_OntologySignedTransfer = 355 [(wire_out) = true]; + MessageType_OntologySignWithdrawOng = 356 [(wire_in) = true]; + MessageType_OntologySignedWithdrawOng = 357 [(wire_out) = true]; + MessageType_OntologySignOntIdRegister = 358 [(wire_in) = true]; + MessageType_OntologySignedOntIdRegister = 359 [(wire_out) = true]; + MessageType_OntologySignOntIdAddAttributes = 360 [(wire_in) = true]; + MessageType_OntologySignedOntIdAddAttributes = 361 [(wire_out) = true]; + + // Ripple + MessageType_RippleGetAddress = 400 [(wire_in) = true]; + MessageType_RippleAddress = 401 [(wire_out) = true]; + MessageType_RippleSignTx = 402 [(wire_in) = true]; + MessageType_RippleSignedTx = 403 [(wire_in) = true]; + + // Monero + MessageType_MoneroTransactionInitRequest = 501 [(wire_out) = true]; + MessageType_MoneroTransactionInitAck = 502 [(wire_out) = true]; + MessageType_MoneroTransactionSetInputRequest = 503 [(wire_out) = true]; + MessageType_MoneroTransactionSetInputAck = 504 [(wire_out) = true]; + MessageType_MoneroTransactionInputsPermutationRequest = 505 [(wire_out) = true]; + MessageType_MoneroTransactionInputsPermutationAck = 506 [(wire_out) = true]; + MessageType_MoneroTransactionInputViniRequest = 507 [(wire_out) = true]; + MessageType_MoneroTransactionInputViniAck = 508 [(wire_out) = true]; + MessageType_MoneroTransactionAllInputsSetRequest = 509 [(wire_out) = true]; + MessageType_MoneroTransactionAllInputsSetAck = 510 [(wire_out) = true]; + MessageType_MoneroTransactionSetOutputRequest = 511 [(wire_out) = true]; + MessageType_MoneroTransactionSetOutputAck = 512 [(wire_out) = true]; + MessageType_MoneroTransactionAllOutSetRequest = 513 [(wire_out) = true]; + MessageType_MoneroTransactionAllOutSetAck = 514 [(wire_out) = true]; + MessageType_MoneroTransactionSignInputRequest = 515 [(wire_out) = true]; + MessageType_MoneroTransactionSignInputAck = 516 [(wire_out) = true]; + MessageType_MoneroTransactionFinalRequest = 517 [(wire_out) = true]; + MessageType_MoneroTransactionFinalAck = 518 [(wire_out) = true]; + MessageType_MoneroKeyImageExportInitRequest = 530 [(wire_out) = true]; + MessageType_MoneroKeyImageExportInitAck = 531 [(wire_out) = true]; + MessageType_MoneroKeyImageSyncStepRequest = 532 [(wire_out) = true]; + MessageType_MoneroKeyImageSyncStepAck = 533 [(wire_out) = true]; + MessageType_MoneroKeyImageSyncFinalRequest = 534 [(wire_out) = true]; + MessageType_MoneroKeyImageSyncFinalAck = 535 [(wire_out) = true]; + MessageType_MoneroGetAddress = 540 [(wire_in) = true]; + MessageType_MoneroAddress = 541 [(wire_out) = true]; + MessageType_MoneroGetWatchKey = 542 [(wire_in) = true]; + MessageType_MoneroWatchKey = 543 [(wire_out) = true]; + MessageType_DebugMoneroDiagRequest = 546 [(wire_in) = true]; + MessageType_DebugMoneroDiagAck = 547 [(wire_out) = true]; + MessageType_MoneroGetTxKeyRequest = 550 [(wire_in) = true]; + MessageType_MoneroGetTxKeyAck = 551 [(wire_out) = true]; + MessageType_MoneroLiveRefreshStartRequest = 552 [(wire_in) = true]; + MessageType_MoneroLiveRefreshStartAck = 553 [(wire_out) = true]; + MessageType_MoneroLiveRefreshStepRequest = 554 [(wire_in) = true]; + MessageType_MoneroLiveRefreshStepAck = 555 [(wire_out) = true]; + MessageType_MoneroLiveRefreshFinalRequest = 556 [(wire_in) = true]; + MessageType_MoneroLiveRefreshFinalAck = 557 [(wire_out) = true]; + + // EOS + MessageType_EosGetPublicKey = 600 [(wire_in) = true]; + MessageType_EosPublicKey = 601 [(wire_out) = true]; + MessageType_EosSignTx = 602 [(wire_in) = true]; + MessageType_EosTxActionRequest = 603 [(wire_out) = true]; + MessageType_EosTxActionAck = 604 [(wire_in) = true]; + MessageType_EosSignedTx = 605 [(wire_out) = true]; + + // Binance + MessageType_BinanceGetAddress = 700 [(wire_in) = true]; + MessageType_BinanceAddress = 701 [(wire_out) = true]; + MessageType_BinanceGetPublicKey = 702 [(wire_in) = true]; + MessageType_BinancePublicKey = 703 [(wire_out) = true]; + MessageType_BinanceSignTx = 704 [(wire_in) = true]; + MessageType_BinanceTxRequest = 705 [(wire_out) = true]; + MessageType_BinanceTransferMsg = 706 [(wire_in) = true]; + MessageType_BinanceOrderMsg = 707 [(wire_in) = true]; + MessageType_BinanceCancelMsg = 708 [(wire_in) = true]; + MessageType_BinanceSignedTx = 709 [(wire_out) = true]; +} diff --git a/accounts/usbwallet/trezor/trezor.go b/accounts/usbwallet/trezor/trezor.go new file mode 100644 index 000000000000..7e756e609b0c --- /dev/null +++ b/accounts/usbwallet/trezor/trezor.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 . + +// This file contains the implementation for interacting with the Trezor hardware +// wallets. The wire protocol spec can be found on the SatoshiLabs website: +// https://wiki.trezor.io/Developers_guide-Message_Workflows + +// !!! STAHP !!! +// +// Before you touch the protocol files, you need to be aware of a breaking change +// that occurred between firmware versions 1.7.3->1.8.0 (Model One) and 2.0.10-> +// 2.1.0 (Model T). The Ethereum address representation was changed from the 20 +// byte binary blob to a 42 byte hex string. The upstream protocol buffer files +// only support the new format, so blindly pulling in a new spec will break old +// devices! +// +// The Trezor devs had the foresight to add the string version as a new message +// code instead of replacing the binary one. This means that the proto file can +// actually define both the old and the new versions as optional. Please ensure +// that you add back the old addresses everywhere (to avoid name clash. use the +// addressBin and addressHex names). +// +// If in doubt, reach out to @karalabe. + +// To regenerate the protocol files in this package: +// - Download the latest protoc https://github.com/protocolbuffers/protobuf/releases +// - Build with the usual `./configure && make` and ensure it's on your $PATH +// - Delete all the .proto and .pb.go files, pull in fresh ones from Trezor +// - Grab the latest Go plugin `go get -u github.com/golang/protobuf/protoc-gen-go` +// - Vendor in the latest Go plugin `govendor fetch github.com/golang/protobuf/...` + +//go:generate protoc -I/usr/local/include:. --go_out=import_path=trezor:. messages.proto messages-common.proto messages-management.proto messages-ethereum.proto + +// Package trezor contains the wire protocol. +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 number. +func Name(kind uint16) string { + name := MessageType_name[int32(kind)] + if len(name) < 12 { + return name + } + return name[12:] +} diff --git a/accounts/usbwallet/wallet.go b/accounts/usbwallet/wallet.go index c89950bd77fc..ee539d96535d 100644 --- a/accounts/usbwallet/wallet.go +++ b/accounts/usbwallet/wallet.go @@ -25,12 +25,13 @@ import ( "sync" "time" - ethereum "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/log" - "github.com/karalabe/hid" + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/karalabe/usb" ) // Maximum time between wallet health checks to detect USB unplugs. @@ -76,17 +77,17 @@ type wallet struct { 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 + info usb.DeviceInfo // Known USB device infos about the wallet + device usb.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 + deriveNextPaths []accounts.DerivationPath // Next derivation paths for account auto-discovery (multiple bases supported) + deriveNextAddrs []common.Address // Next derived account addresses for auto-discovery (multiple bases supported) + 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 @@ -273,9 +274,7 @@ func (w *wallet) close() error { w.device = nil w.accounts, w.paths = nil, nil - w.driver.Close() - - return nil + return w.driver.Close() } // Accounts implements accounts.Wallet, returning the list of accounts pinned to @@ -340,57 +339,62 @@ func (w *wallet) selfDerive() { accs []accounts.Account paths []accounts.DerivationPath - nextAddr = w.deriveNextAddr - nextPath = w.deriveNextPath + nextPaths = append([]accounts.DerivationPath{}, w.deriveNextPaths...) + nextAddrs = append([]common.Address{}, w.deriveNextAddrs...) 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) + for i := 0; i < len(nextAddrs); i++ { + for empty := false; !empty; { + // Retrieve the next derived Ethereum account + if nextAddrs[i] == (common.Address{}) { + if nextAddrs[i], err = w.driver.Derive(nextPaths[i]); 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, nextAddrs[i], nil) + if err != nil { + w.log.Warn("USB wallet balance retrieval 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) + nonce, err = w.deriveChain.NonceAt(context, nextAddrs[i], 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 for the last base path + if balance.Sign() == 0 && nonce == 0 { + empty = true + if i < len(nextAddrs)-1 { + break + } + } + // We've just self-derived a new account, start tracking it locally + path := make(accounts.DerivationPath, len(nextPaths[i])) + copy(path[:], nextPaths[i][:]) + paths = append(paths, path) + + account := accounts.Account{ + Address: nextAddrs[i], + 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]++ + // Display a log message to the user for new (or previously empty accounts) + if _, known := w.paths[nextAddrs[i]]; !known || (!empty && nextAddrs[i] == w.deriveNextAddrs[i]) { + w.log.Info("USB wallet discovered new account", "address", nextAddrs[i], "path", path, "balance", balance, "nonce", nonce) + } + // Fetch the next potential account + if !empty { + nextAddrs[i] = common.Address{} + nextPaths[i][len(nextPaths[i])-1]++ + } } } // Self derivation complete, release device lock @@ -407,8 +411,8 @@ func (w *wallet) selfDerive() { } // Shift the self-derivation forward // TODO(karalabe): don't overwrite changes from wallet.SelfDerive - w.deriveNextAddr = nextAddr - w.deriveNextPath = nextPath + w.deriveNextAddrs = nextAddrs + w.deriveNextPaths = nextPaths w.stateLock.Unlock() // Notify the user of termination and loop after a bit of time (to avoid trashing) @@ -475,32 +479,61 @@ func (w *wallet) Derive(path accounts.DerivationPath, pin bool) (accounts.Accoun if _, ok := w.paths[address]; !ok { w.accounts = append(w.accounts, account) - w.paths[address] = path + w.paths[address] = make(accounts.DerivationPath, len(path)) + copy(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) { +// SelfDerive sets a base account derivation path from which the wallet attempts +// to discover non zero accounts and automatically add them to list of tracked +// accounts. +// +// Note, self derivaton will increment the last component of the specified path +// opposed to decending into a child path to allow discovering accounts starting +// from non zero components. +// +// Some hardware wallets switched derivation paths through their evolution, so +// this method supports providing multiple bases to discover old user accounts +// too. Only the last base will be used to derive the next empty account. +// +// You can disable automatic account discovery by calling SelfDerive with a nil +// chain state reader. +func (w *wallet) SelfDerive(bases []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.deriveNextPaths = make([]accounts.DerivationPath, len(bases)) + for i, base := range bases { + w.deriveNextPaths[i] = make(accounts.DerivationPath, len(base)) + copy(w.deriveNextPaths[i][:], base[:]) + } + w.deriveNextAddrs = make([]common.Address, len(bases)) w.deriveChain = chain } -// SignHash implements accounts.Wallet, however signing arbitrary data is not +// 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) { +func (w *wallet) signHash(account accounts.Account, hash []byte) ([]byte, error) { return nil, accounts.ErrNotSupported } +// SignData signs keccak256(data). The mimetype parameter describes the type of data being signed +func (w *wallet) SignData(account accounts.Account, mimeType string, data []byte) ([]byte, error) { + return w.signHash(account, crypto.Keccak256(data)) +} + +// SignDataWithPassphrase implements accounts.Wallet, attempting to sign the given +// data with the given account using passphrase as extra authentication. +// Since USB wallets don't rely on passphrases, these are silently ignored. +func (w *wallet) SignDataWithPassphrase(account accounts.Account, passphrase, mimeType string, data []byte) ([]byte, error) { + return w.SignData(account, mimeType, data) +} + +func (w *wallet) SignText(account accounts.Account, text []byte) ([]byte, error) { + return w.signHash(account, accounts.TextHash(text)) +} + // 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. @@ -550,8 +583,8 @@ func (w *wallet) SignTx(account accounts.Account, tx *types.Transaction, 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 *wallet) SignHashWithPassphrase(account accounts.Account, passphrase string, hash []byte) ([]byte, error) { - return w.SignHash(account, hash) +func (w *wallet) SignTextWithPassphrase(account accounts.Account, passphrase string, text []byte) ([]byte, error) { + return w.SignText(account, accounts.TextHash(text)) } // SignTxWithPassphrase implements accounts.Wallet, attempting to sign the given diff --git a/appveyor.yml b/appveyor.yml index defad29cd2af..0f230bac1457 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -23,8 +23,8 @@ environment: install: - git submodule update --init - rmdir C:\go /s /q - - appveyor DownloadFile https://storage.googleapis.com/golang/go1.11.4.windows-%GETH_ARCH%.zip - - 7z x go1.11.4.windows-%GETH_ARCH%.zip -y -oC:\ > NUL + - appveyor DownloadFile https://dl.google.com/go/go1.13.4.windows-%GETH_ARCH%.zip + - 7z x go1.13.4.windows-%GETH_ARCH%.zip -y -oC:\ > NUL - go version - gcc --version diff --git a/build/checksums.txt b/build/checksums.txt new file mode 100644 index 000000000000..bb814e33926b --- /dev/null +++ b/build/checksums.txt @@ -0,0 +1,19 @@ +# This file contains sha256 checksums of optional build dependencies. + +95dbeab442ee2746b9acf0934c8e2fc26414a0565c008631b04addb8c02e7624 go1.13.4.src.tar.gz + +1fcbc9e36f4319eeed02beb8cfd1b3d425ffc2f90ddf09a80f18d5064c51e0cb golangci-lint-1.21.0-linux-386.tar.gz +267b4066e67139a38d29499331a002d6a29ad5be7aafc83db3b1e88f1b027f90 golangci-lint-1.21.0-linux-armv6.tar.gz +a602c1f25f90e46e621019cff0a8cb3f4e1837011f3537f15e730d6a9ebf507b golangci-lint-1.21.0-freebsd-armv7.tar.gz +2c861f8dc56b560474aa27cab0c075991628cc01af3451e27ac82f5d10d5106b golangci-lint-1.21.0-linux-amd64.tar.gz +a1c39e055280e755acaa906e7abfc20b99a5c28be8af541c57fbc44abbb20dde golangci-lint-1.21.0-linux-arm64.tar.gz +a8f8bda8c6a4136acf858091077830b1e83ad5612606cb69d5dced869ce00bd8 golangci-lint-1.21.0-linux-ppc64le.tar.gz +0a8a8c3bc660ccbca668897ab520f7ee9878f16cc8e4dd24fe46236ceec97ba3 golangci-lint-1.21.0-freebsd-armv6.tar.gz +699b07f45e216571f54002bcbd83b511c4801464a422162158e299587b095b18 golangci-lint-1.21.0-freebsd-amd64.tar.gz +980fb4993942154bb5c8129ea3b86de09574fe81b24384ebb58cd7a9d2f04483 golangci-lint-1.21.0-linux-armv7.tar.gz +f15b689088a47f20d5d3c1d945e9ee7c6238f2b84ea468b5f886cf8713dce62e golangci-lint-1.21.0-windows-386.zip +2e40ded7adcf11e59013cb15c24438b15a86526ca241edfcfdf1abd73a5280a8 golangci-lint-1.21.0-windows-amd64.zip +6052c7cfea4d6dc2fc722f6c12792a5ec087420198db495afffbc22052653bf7 golangci-lint-1.21.0-freebsd-386.tar.gz +ca00b8eacf9af14a71b908b4149606c762aa5c0eac781e74ca0abedfdfdf6c8c golangci-lint-1.21.0-linux-s390x.tar.gz +1365455940c342f95718159d89d66ad2eef19f0846c3e87023e915a3527b929f golangci-lint-1.21.0-darwin-386.tar.gz +2b2713ec5007e67883aa501eebb81f22abfab0cf0909134ba90f60a066db3760 golangci-lint-1.21.0-darwin-amd64.tar.gz diff --git a/build/ci-notes.md b/build/ci-notes.md index f5b0e869d63e..edd9adc1c283 100644 --- a/build/ci-notes.md +++ b/build/ci-notes.md @@ -7,27 +7,33 @@ Canonical. Packages of develop branch commits have suffix -unstable and cannot be installed alongside the stable version. Switching between release streams requires user intervention. +## Launchpad + The packages are built and served by launchpad.net. We generate a Debian source package for each distribution and upload it. Their builder picks up the source package, builds it and installs the new version into the PPA repository. Launchpad requires a valid signature -by a team member for source package uploads. The signing key is stored in an environment -variable which Travis CI makes available to certain builds. +by a team member for source package uploads. + +The signing key is stored in an environment variable which Travis CI makes available to +certain builds. Since Travis CI doesn't support FTP, SFTP is used to transfer the +packages. To set this up yourself, you need to create a Launchpad user and add a GPG key +and SSH key to it. Then encode both keys as base64 and configure 'secret' environment +variables `PPA_SIGNING_KEY` and `PPA_SSH_KEY` on Travis. We want to build go-ethereum with the most recent version of Go, irrespective of the Go version that is available in the main Ubuntu repository. In order to make this possible, -our PPA depends on the ~gophers/ubuntu/archive PPA. Our source package build-depends on -golang-1.10, which is co-installable alongside the regular golang package. PPA dependencies -can be edited at https://launchpad.net/%7Eethereum/+archive/ubuntu/ethereum/+edit-dependencies +we bundle the entire Go sources into our own source archive and start the built job by +compiling Go and then using that to build go-ethereum. On Trusty we have a special case +requiring the `~gophers/ubuntu/archive` PPA since Trusty can't even build Go itself. PPA +deps are set 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.10 and Debian packaging tools: +Install any version of Go and Debian packaging tools: - $ sudo apt-add-repository ppa:gophers/ubuntu/archive - $ sudo apt-get update - $ sudo apt-get install build-essential golang-1.10 devscripts debhelper + $ sudo apt-get install build-essential golang-go devscripts debhelper python-bzrlib python-paramiko Create the source packages: @@ -35,10 +41,10 @@ Create the source packages: Then go into the source package directory for your running distribution and build the package: - $ cd dist/ethereum-unstable-1.6.0+xenial + $ cd dist/ethereum-unstable-1.9.6+bionic $ dpkg-buildpackage Built packages are placed in the dist/ directory. $ cd .. - $ dpkg-deb -c geth-unstable_1.6.0+xenial_amd64.deb + $ dpkg-deb -c geth-unstable_1.9.6+bionic_amd64.deb diff --git a/build/ci.go b/build/ci.go index 509c93225086..1ec8e018324b 100644 --- a/build/ci.go +++ b/build/ci.go @@ -58,16 +58,16 @@ import ( "strings" "time" - "github.com/nebulaai/nbai-node/internal/build" - "github.com/nebulaai/nbai-node/params" - sv "github.com/nebulaai/nbai-node/swarm/version" + "github.com/cespare/cp" + "github.com/ethereum/go-ethereum/internal/build" + "github.com/ethereum/go-ethereum/params" ) var ( // Files that end up in the geth*.zip archive. gethArchiveFiles = []string{ "COPYING", - executablePath("gnbai"), + executablePath("geth"), } // Files that end up in the geth-alltools*.zip archive. @@ -80,12 +80,7 @@ var ( executablePath("puppeth"), executablePath("rlpdump"), executablePath("wnode"), - } - - // Files that end up in the swarm*.zip archive. - swarmArchiveFiles = []string{ - "COPYING", - executablePath("swarm"), + executablePath("clef"), } // A debian package is created for all executables listed here. @@ -118,45 +113,44 @@ var ( BinaryName: "wnode", Description: "Ethereum Whisper diagnostic tool", }, - } - - // A debian package is created for all executables listed here. - debSwarmExecutables = []debExecutable{ { - BinaryName: "swarm", - PackageName: "ethereum-swarm", - Description: "Ethereum Swarm daemon and tools", + BinaryName: "clef", + Description: "Ethereum account management tool.", }, } + // A debian package is created for all executables listed here. + debEthereum = debPackage{ Name: "ethereum", Version: params.Version, Executables: debExecutables, } - debSwarm = debPackage{ - Name: "ethereum-swarm", - Version: sv.Version, - Executables: debSwarmExecutables, - } - // Debian meta packages to build and push to Ubuntu PPA debPackages = []debPackage{ - debSwarm, debEthereum, } - // Packages to be cross-compiled by the xgo command - allCrossCompiledArchiveFiles = append(allToolsArchiveFiles, swarmArchiveFiles...) - // 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. - // Note: yakkety is unsupported because it was officially deprecated on lanchpad. - // Note: zesty is unsupported because it was officially deprecated on lanchpad. - // Note: artful is unsupported because it was officially deprecated on lanchpad. - debDistros = []string{"trusty", "xenial", "bionic", "cosmic"} + // Note: wily is unsupported because it was officially deprecated on Launchpad. + // Note: yakkety is unsupported because it was officially deprecated on Launchpad. + // Note: zesty is unsupported because it was officially deprecated on Launchpad. + // Note: artful is unsupported because it was officially deprecated on Launchpad. + // Note: cosmic is unsupported because it was officially deprecated on Launchpad. + debDistroGoBoots = map[string]string{ + "trusty": "golang-1.11", + "xenial": "golang-go", + "bionic": "golang-go", + "disco": "golang-go", + "eoan": "golang-go", + } + + debGoBootPaths = map[string]string{ + "golang-1.11": "/usr/lib/go-1.11", + "golang-go": "/usr/lib/go", + } ) var GOBIN, _ = filepath.Abs(filepath.Join("build", "bin")) @@ -232,10 +226,12 @@ func doInstall(cmdline []string) { if flag.NArg() > 0 { packages = flag.Args() } - packages = build.ExpandPackagesNoVendor(packages) if *arch == "" || *arch == runtime.GOARCH { goinstall := goTool("install", buildFlags(env)...) + if runtime.GOARCH == "arm64" { + goinstall.Args = append(goinstall.Args, "-p", "1") + } goinstall.Args = append(goinstall.Args, "-v") goinstall.Args = append(goinstall.Args, packages...) build.MustRun(goinstall) @@ -248,6 +244,7 @@ func doInstall(cmdline []string) { os.RemoveAll(filepath.Join(path, "pkg", runtime.GOOS+"_arm")) } } + // Seems we are cross compiling, work around forbidden GOBIN goinstall := goToolArch(*arch, *cc, "install", buildFlags(env)...) goinstall.Args = append(goinstall.Args, "-v") @@ -279,6 +276,7 @@ func buildFlags(env build.Environment) (flags []string) { var ld []string if env.Commit != "" { ld = append(ld, "-X", "main.gitCommit="+env.Commit) + ld = append(ld, "-X", "main.gitDate="+env.Date) } if runtime.GOOS == "darwin" { ld = append(ld, "-s") @@ -321,6 +319,7 @@ func goToolArch(arch string, cc string, subcmd string, args ...string) *exec.Cmd func doTest(cmdline []string) { coverage := flag.Bool("coverage", false, "Whether to record code coverage") + verbose := flag.Bool("v", false, "Whether to log verbosely") flag.CommandLine.Parse(cmdline) env := build.Env() @@ -328,7 +327,6 @@ func doTest(cmdline []string) { if len(flag.CommandLine.Args()) > 0 { packages = flag.CommandLine.Args() } - packages = build.ExpandPackagesNoVendor(packages) // Run the actual tests. // Test a single package at a time. CI builders are slow @@ -338,44 +336,46 @@ func doTest(cmdline []string) { if *coverage { gotest.Args = append(gotest.Args, "-covermode=atomic", "-cover") } + if *verbose { + gotest.Args = append(gotest.Args, "-v") + } gotest.Args = append(gotest.Args, packages...) build.MustRun(gotest) } -// runs gometalinter on requested packages +// doLint runs golangci-lint on requested packages. func doLint(cmdline []string) { + var ( + cachedir = flag.String("cachedir", "./build/cache", "directory for caching golangci-lint binary.") + ) flag.CommandLine.Parse(cmdline) - 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.v2")) - build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v2"), "--install") - - // Run fast linters batched together - configs := []string{ - "--vendor", - "--tests", - "--deadline=2m", - "--disable-all", - "--enable=goimports", - "--enable=varcheck", - "--enable=vet", - "--enable=gofmt", - "--enable=misspell", - "--enable=goconst", - "--min-occurrences=6", // for goconst - } - build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v2"), append(configs, packages...)...) - - // Run slow linters one by one - for _, linter := range []string{"unconvert", "gosimple"} { - configs = []string{"--vendor", "--tests", "--deadline=10m", "--disable-all", "--enable=" + linter} - build.MustRunCommand(filepath.Join(GOBIN, "gometalinter.v2"), append(configs, packages...)...) + + linter := downloadLinter(*cachedir) + lflags := []string{"run", "--config", ".golangci.yml"} + build.MustRunCommand(linter, append(lflags, packages...)...) + fmt.Println("You have achieved perfection.") +} + +// downloadLinter downloads and unpacks golangci-lint. +func downloadLinter(cachedir string) string { + const version = "1.21.0" + + csdb := build.MustLoadChecksums("build/checksums.txt") + base := fmt.Sprintf("golangci-lint-%s-%s-%s", version, runtime.GOOS, runtime.GOARCH) + url := fmt.Sprintf("https://github.com/golangci/golangci-lint/releases/download/v%s/%s.tar.gz", version, base) + archivePath := filepath.Join(cachedir, base+".tar.gz") + if err := csdb.DownloadFile(url, archivePath); err != nil { + log.Fatal(err) } + if err := build.ExtractTarballArchive(archivePath, cachedir); err != nil { + log.Fatal(err) + } + return filepath.Join(cachedir, base, "golangci-lint") } // Release Packaging @@ -403,9 +403,6 @@ func doArchive(cmdline []string) { basegeth = archiveBasename(*arch, params.ArchiveVersion(env.Commit)) geth = "geth-" + basegeth + ext alltools = "geth-alltools-" + basegeth + ext - - baseswarm = archiveBasename(*arch, sv.ArchiveVersion(env.Commit)) - swarm = "swarm-" + baseswarm + ext ) maybeSkipArchive(env) if err := build.WriteArchive(geth, gethArchiveFiles); err != nil { @@ -414,10 +411,7 @@ func doArchive(cmdline []string) { if err := build.WriteArchive(alltools, allToolsArchiveFiles); err != nil { log.Fatal(err) } - if err := build.WriteArchive(swarm, swarmArchiveFiles); err != nil { - log.Fatal(err) - } - for _, archive := range []string{geth, alltools, swarm} { + for _, archive := range []string{geth, alltools} { if err := archiveUpload(archive, *upload, *signer); err != nil { log.Fatal(err) } @@ -441,11 +435,8 @@ func archiveBasename(arch string, archiveVersion string) string { func archiveUpload(archive string, blobstore string, signer string) error { // If signing was requested, generate the signature files if signer != "" { - pgpkey, err := base64.StdEncoding.DecodeString(os.Getenv(signer)) - if err != nil { - return fmt.Errorf("invalid base64 %s", signer) - } - if err := build.PGPSignFile(archive, archive+".asc", string(pgpkey)); err != nil { + key := getenvBase64(signer) + if err := build.PGPSignFile(archive, archive+".asc", string(key)); err != nil { return err } } @@ -487,10 +478,13 @@ func maybeSkipArchive(env build.Environment) { // Debian Packaging func doDebianSource(cmdline []string) { var ( - signer = flag.String("signer", "", `Signing key name, also used as package author`) - upload = flag.String("upload", "", `Where to upload the source package (usually "ppa:ethereum/ethereum")`) - workdir = flag.String("workdir", "", `Output directory for packages (uses temp dir if unset)`) - now = time.Now() + goversion = flag.String("goversion", "", `Go version to build with (will be included in the source package)`) + cachedir = flag.String("cachedir", "./build/cache", `Filesystem path to cache the downloaded Go bundles at`) + signer = flag.String("signer", "", `Signing key name, also used as package author`) + upload = flag.String("upload", "", `Where to upload the source package (usually "ethereum/ethereum")`) + sshUser = flag.String("sftp-user", "", `Username for SFTP upload (usually "geth-ci")`) + workdir = flag.String("workdir", "", `Output directory for packages (uses temp dir if unset)`) + now = time.Now() ) flag.CommandLine.Parse(cmdline) *workdir = makeWorkdir(*workdir) @@ -498,37 +492,107 @@ func doDebianSource(cmdline []string) { maybeSkipArchive(env) // Import the signing key. - if b64key := os.Getenv("PPA_SIGNING_KEY"); b64key != "" { - key, err := base64.StdEncoding.DecodeString(b64key) - if err != nil { - log.Fatal("invalid base64 PPA_SIGNING_KEY") - } + if key := getenvBase64("PPA_SIGNING_KEY"); len(key) > 0 { gpg := exec.Command("gpg", "--import") gpg.Stdin = bytes.NewReader(key) build.MustRun(gpg) } - // Create Debian packages and upload them + // Download and verify the Go source package. + gobundle := downloadGoSources(*goversion, *cachedir) + + // Download all the dependencies needed to build the sources and run the ci script + srcdepfetch := goTool("install", "-n", "./...") + srcdepfetch.Env = append(os.Environ(), "GOPATH="+filepath.Join(*workdir, "modgopath")) + build.MustRun(srcdepfetch) + + cidepfetch := goTool("run", "./build/ci.go") + cidepfetch.Env = append(os.Environ(), "GOPATH="+filepath.Join(*workdir, "modgopath")) + cidepfetch.Run() // Command fails, don't care, we only need the deps to start it + + // Create Debian packages and upload them. for _, pkg := range debPackages { - for _, distro := range debDistros { - meta := newDebMetadata(distro, *signer, env, now, pkg.Name, pkg.Version, pkg.Executables) + for distro, goboot := range debDistroGoBoots { + // Prepare the debian package with the go-ethereum sources. + meta := newDebMetadata(distro, goboot, *signer, env, now, pkg.Name, pkg.Version, pkg.Executables) pkgdir := stageDebianSource(*workdir, meta) - debuild := exec.Command("debuild", "-S", "-sa", "-us", "-uc") + + // Add Go source code + if err := build.ExtractTarballArchive(gobundle, pkgdir); err != nil { + log.Fatalf("Failed to extract Go sources: %v", err) + } + if err := os.Rename(filepath.Join(pkgdir, "go"), filepath.Join(pkgdir, ".go")); err != nil { + log.Fatalf("Failed to rename Go source folder: %v", err) + } + // Add all dependency modules in compressed form + os.MkdirAll(filepath.Join(pkgdir, ".mod", "cache"), 0755) + if err := cp.CopyAll(filepath.Join(pkgdir, ".mod", "cache", "download"), filepath.Join(*workdir, "modgopath", "pkg", "mod", "cache", "download")); err != nil { + log.Fatalf("Failed to copy Go module dependencies: %v", err) + } + // Run the packaging and upload to the PPA + debuild := exec.Command("debuild", "-S", "-sa", "-us", "-uc", "-d", "-Zxz", "-nc") debuild.Dir = pkgdir build.MustRun(debuild) - changes := fmt.Sprintf("%s_%s_source.changes", meta.Name(), meta.VersionString()) - changes = filepath.Join(*workdir, changes) + var ( + basename = fmt.Sprintf("%s_%s", meta.Name(), meta.VersionString()) + source = filepath.Join(*workdir, basename+".tar.xz") + dsc = filepath.Join(*workdir, basename+".dsc") + changes = filepath.Join(*workdir, basename+"_source.changes") + ) if *signer != "" { build.MustRunCommand("debsign", changes) } if *upload != "" { - build.MustRunCommand("dput", *upload, changes) + ppaUpload(*workdir, *upload, *sshUser, []string{source, dsc, changes}) } } } } +func downloadGoSources(version string, cachedir string) string { + csdb := build.MustLoadChecksums("build/checksums.txt") + file := fmt.Sprintf("go%s.src.tar.gz", version) + url := "https://dl.google.com/go/" + file + dst := filepath.Join(cachedir, file) + if err := csdb.DownloadFile(url, dst); err != nil { + log.Fatal(err) + } + return dst +} + +func ppaUpload(workdir, ppa, sshUser string, files []string) { + p := strings.Split(ppa, "/") + if len(p) != 2 { + log.Fatal("-upload PPA name must contain single /") + } + if sshUser == "" { + sshUser = p[0] + } + incomingDir := fmt.Sprintf("~%s/ubuntu/%s", p[0], p[1]) + // Create the SSH identity file if it doesn't exist. + var idfile string + if sshkey := getenvBase64("PPA_SSH_KEY"); len(sshkey) > 0 { + idfile = filepath.Join(workdir, "sshkey") + if _, err := os.Stat(idfile); os.IsNotExist(err) { + ioutil.WriteFile(idfile, sshkey, 0600) + } + } + // Upload + dest := sshUser + "@ppa.launchpad.net" + if err := build.UploadSFTP(idfile, dest, incomingDir, files); err != nil { + log.Fatal(err) + } +} + +func getenvBase64(variable string) []byte { + dec, err := base64.StdEncoding.DecodeString(os.Getenv(variable)) + if err != nil { + log.Fatal("invalid base64 " + variable) + } + return []byte(dec) +} + func makeWorkdir(wdflag string) string { var err error if wdflag != "" { @@ -550,13 +614,15 @@ func isUnstableBuild(env build.Environment) bool { } type debPackage struct { - Name string // the name of the Debian package to produce, e.g. "ethereum", or "ethereum-swarm" - Version string // the clean version of the debPackage, e.g. 1.8.12 or 0.3.0, without any metadata + Name string // the name of the Debian package to produce, e.g. "ethereum" + Version string // the clean version of the debPackage, e.g. 1.8.12, without any metadata Executables []debExecutable // executables to be included in the package } type debMetadata struct { - Env build.Environment + Env build.Environment + GoBootPackage string + GoBootPath string PackageName string @@ -585,19 +651,21 @@ func (d debExecutable) Package() string { return d.BinaryName } -func newDebMetadata(distro, author string, env build.Environment, t time.Time, name string, version string, exes []debExecutable) debMetadata { +func newDebMetadata(distro, goboot, author string, env build.Environment, t time.Time, name string, version string, exes []debExecutable) debMetadata { if author == "" { // No signing key, use default author. author = "Ethereum Builds " } return debMetadata{ - PackageName: name, - Env: env, - Author: author, - Distro: distro, - Version: version, - Time: t.Format(time.RFC1123Z), - Executables: exes, + GoBootPackage: goboot, + GoBootPath: debGoBootPaths[goboot], + PackageName: name, + Env: env, + Author: author, + Distro: distro, + Version: version, + Time: t.Format(time.RFC1123Z), + Executables: exes, } } @@ -662,7 +730,6 @@ func stageDebianSource(tmpdir string, meta debMetadata) (pkgdir string) { if err := os.Mkdir(pkgdir, 0755); err != nil { log.Fatal(err) } - // Copy the source code. build.MustRunCommand("git", "checkout-index", "-a", "--prefix", pkgdir+string(filepath.Separator)) @@ -680,7 +747,6 @@ func stageDebianSource(tmpdir string, meta debMetadata) (pkgdir string) { build.Render("build/deb/"+meta.PackageName+"/deb.install", install, 0644, exe) build.Render("build/deb/"+meta.PackageName+"/deb.docs", docs, 0644, exe) } - return pkgdir } @@ -728,9 +794,12 @@ func doWindowsInstaller(cmdline []string) { build.Render("build/nsis.uninstall.nsh", filepath.Join(*workdir, "uninstall.nsh"), 0644, allTools) build.Render("build/nsis.pathupdate.nsh", filepath.Join(*workdir, "PathUpdate.nsh"), 0644, nil) build.Render("build/nsis.envvarupdate.nsh", filepath.Join(*workdir, "EnvVarUpdate.nsh"), 0644, nil) - build.CopyFile(filepath.Join(*workdir, "SimpleFC.dll"), "build/nsis.simplefc.dll", 0755) - build.CopyFile(filepath.Join(*workdir, "COPYING"), "COPYING", 0755) - + if err := cp.CopyFile(filepath.Join(*workdir, "SimpleFC.dll"), "build/nsis.simplefc.dll"); err != nil { + log.Fatal("Failed to copy SimpleFC.dll: %v", err) + } + if err := cp.CopyFile(filepath.Join(*workdir, "COPYING"), "COPYING"); err != nil { + log.Fatal("Failed to copy copyright note: %v", err) + } // Build the installer. This assumes that all the needed files have been previously // built (don't mix building and packaging to keep cross compilation complexity to a // minimum). @@ -747,7 +816,6 @@ func doWindowsInstaller(cmdline []string) { "/DARCH="+*arch, filepath.Join(*workdir, "geth.nsi"), ) - // Sign and publish installer. if err := archiveUpload(installer, *upload, *signer); err != nil { log.Fatal(err) @@ -770,12 +838,8 @@ func doAndroidArchive(cmdline []string) { if os.Getenv("ANDROID_HOME") == "" { log.Fatal("Please ensure ANDROID_HOME points to your Android SDK") } - if os.Getenv("ANDROID_NDK") == "" { - log.Fatal("Please ensure ANDROID_NDK points to your Android NDK") - } // Build the Android archive and Maven resources build.MustRun(goTool("get", "golang.org/x/mobile/cmd/gomobile", "golang.org/x/mobile/cmd/gobind")) - build.MustRun(gomobileTool("init", "--ndk", os.Getenv("ANDROID_NDK"))) build.MustRun(gomobileTool("bind", "-ldflags", "-s -w", "--target", "android", "--javapkg", "org.ethereum", "-v", "github.com/ethereum/go-ethereum/mobile")) if *local { @@ -800,15 +864,10 @@ func doAndroidArchive(cmdline []string) { os.Rename(archive, meta.Package+".aar") if *signer != "" && *deploy != "" { // Import the signing key into the local GPG instance - b64key := os.Getenv(*signer) - key, err := base64.StdEncoding.DecodeString(b64key) - if err != nil { - log.Fatalf("invalid base64 %s", *signer) - } + key := getenvBase64(*signer) gpg := exec.Command("gpg", "--import") gpg.Stdin = bytes.NewReader(key) build.MustRun(gpg) - keyID, err := build.PGPKeyID(string(key)) if err != nil { log.Fatal(err) @@ -902,7 +961,7 @@ func doXCodeFramework(cmdline []string) { // Build the iOS XCode framework build.MustRun(goTool("get", "golang.org/x/mobile/cmd/gomobile", "golang.org/x/mobile/cmd/gobind")) build.MustRun(gomobileTool("init")) - bind := gomobileTool("bind", "-ldflags", "-s -w", "--target", "ios", "--tags", "ios", "-v", "github.com/ethereum/go-ethereum/mobile") + bind := gomobileTool("bind", "-ldflags", "-s -w", "--target", "ios", "-v", "github.com/ethereum/go-ethereum/mobile") if *local { // If we're building locally, use the build folder and stop afterwards @@ -996,7 +1055,7 @@ func doXgo(cmdline []string) { if *alltools { args = append(args, []string{"--dest", GOBIN}...) - for _, res := range allCrossCompiledArchiveFiles { + for _, res := range allToolsArchiveFiles { if strings.HasPrefix(res, GOBIN) { // Binary tool found, cross build it explicitly args = append(args, "./"+filepath.Join("cmd", filepath.Base(res))) @@ -1017,16 +1076,11 @@ func doXgo(cmdline []string) { func xgoTool(args []string) *exec.Cmd { cmd := exec.Command(filepath.Join(GOBIN, "xgo"), args...) - cmd.Env = []string{ + cmd.Env = os.Environ() + cmd.Env = append(cmd.Env, []string{ "GOPATH=" + build.GOPATH(), "GOBIN=" + GOBIN, - } - for _, e := range os.Environ() { - if strings.HasPrefix(e, "GOPATH=") || strings.HasPrefix(e, "GOBIN=") { - continue - } - cmd.Env = append(cmd.Env, e) - } + }...) return cmd } diff --git a/build/clean_go_build_cache.sh b/build/clean_go_build_cache.sh deleted file mode 100755 index 1666381d982d..000000000000 --- a/build/clean_go_build_cache.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -# Cleaning the Go cache only makes sense if we actually have Go installed... or -# if Go is actually callable. This does not hold true during deb packaging, so -# we need an explicit check to avoid build failures. -if ! command -v go > /dev/null; then - exit -fi - -version_gt() { - test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1" -} - -golang_version=$(go version |cut -d' ' -f3 |sed 's/go//') - -# Clean go build cache when go version is greater than or equal to 1.10 -if !(version_gt 1.10 $golang_version); then - go clean -cache -fi diff --git a/build/deb/ethereum-swarm/deb.changelog b/build/deb/ethereum-swarm/deb.changelog deleted file mode 100644 index 83f804a83384..000000000000 --- a/build/deb/ethereum-swarm/deb.changelog +++ /dev/null @@ -1,5 +0,0 @@ -{{.Name}} ({{.VersionString}}) {{.Distro}}; urgency=low - - * git build of {{.Env.Commit}} - - -- {{.Author}} {{.Time}} diff --git a/build/deb/ethereum-swarm/deb.control b/build/deb/ethereum-swarm/deb.control deleted file mode 100644 index 8cd325bf55ac..000000000000 --- a/build/deb/ethereum-swarm/deb.control +++ /dev/null @@ -1,19 +0,0 @@ -Source: {{.Name}} -Section: science -Priority: extra -Maintainer: {{.Author}} -Build-Depends: debhelper (>= 8.0.0), golang-1.10 -Standards-Version: 3.9.5 -Homepage: https://ethereum.org -Vcs-Git: git://github.com/ethereum/go-ethereum.git -Vcs-Browser: https://github.com/ethereum/go-ethereum - -{{range .Executables}} -Package: {{$.ExeName .}} -Conflicts: {{$.ExeConflicts .}} -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends} -Built-Using: ${misc:Built-Using} -Description: {{.Description}} - {{.Description}} -{{end}} diff --git a/build/deb/ethereum-swarm/deb.copyright b/build/deb/ethereum-swarm/deb.copyright deleted file mode 100644 index fe6e36ad9d76..000000000000 --- a/build/deb/ethereum-swarm/deb.copyright +++ /dev/null @@ -1,14 +0,0 @@ -Copyright 2018 The go-ethereum Authors - -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 . diff --git a/build/deb/ethereum-swarm/deb.docs b/build/deb/ethereum-swarm/deb.docs deleted file mode 100644 index 62deb04972da..000000000000 --- a/build/deb/ethereum-swarm/deb.docs +++ /dev/null @@ -1 +0,0 @@ -AUTHORS diff --git a/build/deb/ethereum-swarm/deb.install b/build/deb/ethereum-swarm/deb.install deleted file mode 100644 index e7666ce5fb6b..000000000000 --- a/build/deb/ethereum-swarm/deb.install +++ /dev/null @@ -1 +0,0 @@ -build/bin/{{.BinaryName}} usr/bin diff --git a/build/deb/ethereum-swarm/deb.rules b/build/deb/ethereum-swarm/deb.rules deleted file mode 100644 index 7f286569ea6e..000000000000 --- a/build/deb/ethereum-swarm/deb.rules +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/make -f -# -*- makefile -*- - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -override_dh_auto_build: - build/env.sh /usr/lib/go-1.10/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: - -%: - dh $@ diff --git a/build/deb/ethereum/deb.control b/build/deb/ethereum/deb.control index defb106fe367..501a32cb45b3 100644 --- a/build/deb/ethereum/deb.control +++ b/build/deb/ethereum/deb.control @@ -2,7 +2,7 @@ Source: {{.Name}} Section: science Priority: extra Maintainer: {{.Author}} -Build-Depends: debhelper (>= 8.0.0), golang-1.10 +Build-Depends: debhelper (>= 8.0.0), {{.GoBootPackage}} Standards-Version: 3.9.5 Homepage: https://ethereum.org Vcs-Git: git://github.com/ethereum/go-ethereum.git @@ -11,8 +11,8 @@ Vcs-Browser: https://github.com/ethereum/go-ethereum Package: {{.Name}} Architecture: any Depends: ${misc:Depends}, {{.ExeList}} -Description: Meta-package to install geth, swarm, and other tools - Meta-package to install geth, swarm and other tools +Description: Meta-package to install geth and other tools + Meta-package to install geth and other tools {{range .Executables}} Package: {{$.ExeName .}} diff --git a/build/deb/ethereum/deb.rules b/build/deb/ethereum/deb.rules index 7f286569ea6e..983b87af1639 100644 --- a/build/deb/ethereum/deb.rules +++ b/build/deb/ethereum/deb.rules @@ -4,8 +4,25 @@ # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 +# Launchpad rejects Go's access to $HOME, use custom folders +export GOCACHE=/tmp/go-build +export GOROOT_BOOTSTRAP={{.GoBootPath}} + +override_dh_auto_clean: + # Don't try to be smart Launchpad, we know our build rules better than you + override_dh_auto_build: - build/env.sh /usr/lib/go-1.10/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}} + # We can't download a fresh Go within Launchpad, so we're shipping and building + # one on the fly. However, we can't build it inside the go-ethereum folder as + # bootstrapping clashes with go modules, so build in a sibling folder. + (mv .go ../ && cd ../.go/src && ./make.bash) + + # We can't download external go modules within Launchpad, so we're shipping the + # entire dependency source cache with go-ethereum. + (mkdir -p build/_workspace/pkg/mod && mv .mod/* build/_workspace/pkg/mod) + + # A fresh Go was built, all dependency downloads faked, hope build works now + build/env.sh ../.go/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/env.sh b/build/env.sh index d182ac39fdb0..3914555d1bbd 100755 --- a/build/env.sh +++ b/build/env.sh @@ -10,11 +10,11 @@ fi # Create fake Go workspace if it doesn't exist yet. workspace="$PWD/build/_workspace" root="$PWD" -ethdir="$workspace/src/github.com/nebulaai" -if [ ! -L "$ethdir/nbai-node" ]; then +ethdir="$workspace/src/github.com/ethereum" +if [ ! -L "$ethdir/go-ethereum" ]; then mkdir -p "$ethdir" cd "$ethdir" - ln -s ../../../../../. nbai-node + ln -s ../../../../../. go-ethereum cd "$root" fi @@ -23,8 +23,8 @@ GOPATH="$workspace" export GOPATH # Run the command inside the workspace. -cd "$ethdir/nbai-node" -PWD="$ethdir/nbai-node" +cd "$ethdir/go-ethereum" +PWD="$ethdir/go-ethereum" # Launch the arguments with the configured environment. exec "$@" diff --git a/build/mvn.pom b/build/mvn.pom index 03c6638af54f..7670246ba9f1 100644 --- a/build/mvn.pom +++ b/build/mvn.pom @@ -11,7 +11,7 @@ Android Ethereum Client Android port of the go-ethereum libraries and node - https://github.com/nebulaai/nbai-node + https://github.com/ethereum/go-ethereum 2015 @@ -48,10 +48,10 @@ GitHub Issues - https://github.com/nebulaai/nbai-node/issues/ + https://github.com/ethereum/go-ethereum/issues/ - https://github.com/nebulaai/nbai-node + https://github.com/ethereum/go-ethereum diff --git a/build/nsis.install.nsh b/build/nsis.install.nsh index 3a1904d1d3d1..57ef5a37c6a4 100644 --- a/build/nsis.install.nsh +++ b/build/nsis.install.nsh @@ -3,9 +3,9 @@ InstallDir "$InstDir" OutFile "${OUTPUTFILE}" # set through command line arguments # Links for "Add/Remove Programs" -!define HELPURL "https://github.com/nebulaai/nbai-node/issues" -!define UPDATEURL "https://github.com/nebulaai/nbai-node/releases" -!define ABOUTURL "https://github.com/nebulaai/nbai-node#ethereum-go" +!define HELPURL "https://github.com/ethereum/go-ethereum/issues" +!define UPDATEURL "https://github.com/ethereum/go-ethereum/releases" +!define ABOUTURL "https://github.com/ethereum/go-ethereum#ethereum-go" !define /date NOW "%Y%m%d" PageEx license @@ -24,14 +24,14 @@ Section "Geth" GETH_IDX createShortCut "$SMPROGRAMS\${APPNAME}\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "" "" # Firewall - remove rules (if exists) - SimpleFC::AdvRemoveRule "Geth incoming peers (TCP:30332)" - SimpleFC::AdvRemoveRule "Geth outgoing peers (TCP:30332)" - SimpleFC::AdvRemoveRule "Geth UDP discovery (UDP:30332)" + SimpleFC::AdvRemoveRule "Geth incoming peers (TCP:30303)" + SimpleFC::AdvRemoveRule "Geth outgoing peers (TCP:30303)" + SimpleFC::AdvRemoveRule "Geth UDP discovery (UDP:30303)" # Firewall - add rules - SimpleFC::AdvAddRule "Geth incoming peers (TCP:30332)" "" 6 1 1 2147483647 1 "$INSTDIR\geth.exe" "" "" "Ethereum" 30332 "" "" "" - SimpleFC::AdvAddRule "Geth outgoing peers (TCP:30332)" "" 6 2 1 2147483647 1 "$INSTDIR\geth.exe" "" "" "Ethereum" "" 30332 "" "" - SimpleFC::AdvAddRule "Geth UDP discovery (UDP:30332)" "" 17 2 1 2147483647 1 "$INSTDIR\geth.exe" "" "" "Ethereum" "" 30332 "" "" + SimpleFC::AdvAddRule "Geth incoming peers (TCP:30303)" "" 6 1 1 2147483647 1 "$INSTDIR\geth.exe" "" "" "Ethereum" 30303 "" "" "" + SimpleFC::AdvAddRule "Geth outgoing peers (TCP:30303)" "" 6 2 1 2147483647 1 "$INSTDIR\geth.exe" "" "" "Ethereum" "" 30303 "" "" + SimpleFC::AdvAddRule "Geth UDP discovery (UDP:30303)" "" 17 2 1 2147483647 1 "$INSTDIR\geth.exe" "" "" "Ethereum" "" 30303 "" "" # Set default IPC endpoint (https://github.com/ethereum/EIPs/issues/147) ${EnvVarUpdate} $0 "ETHEREUM_SOCKET" "R" "HKLM" "\\.\pipe\geth.ipc" diff --git a/build/nsis.uninstall.nsh b/build/nsis.uninstall.nsh index aa8131637425..6358faa74ec0 100644 --- a/build/nsis.uninstall.nsh +++ b/build/nsis.uninstall.nsh @@ -17,9 +17,9 @@ Section "Uninstall" rmDir "$SMPROGRAMS\${APPNAME}" # Firewall - remove rules if exists - SimpleFC::AdvRemoveRule "Geth incoming peers (TCP:30332)" - SimpleFC::AdvRemoveRule "Geth outgoing peers (TCP:30332)" - SimpleFC::AdvRemoveRule "Geth UDP discovery (UDP:30332)" + SimpleFC::AdvRemoveRule "Geth incoming peers (TCP:30303)" + SimpleFC::AdvRemoveRule "Geth outgoing peers (TCP:30303)" + SimpleFC::AdvRemoveRule "Geth UDP discovery (UDP:30303)" # Remove IPC endpoint (https://github.com/ethereum/EIPs/issues/147) ${un.EnvVarUpdate} $0 "ETHEREUM_SOCKET" "R" "HKLM" "\\.\pipe\geth.ipc" diff --git a/build/pod.podspec b/build/pod.podspec index 977b2db2b172..2c14c280c7c9 100644 --- a/build/pod.podspec +++ b/build/pod.podspec @@ -2,12 +2,12 @@ Pod::Spec.new do |spec| spec.name = 'Geth' spec.version = '{{.Version}}' spec.license = { :type => 'GNU Lesser General Public License, Version 3.0' } - spec.homepage = 'https://github.com/nebulaai/nbai-node' + spec.homepage = 'https://github.com/ethereum/go-ethereum' spec.authors = { {{range .Contributors}} '{{.Name}}' => '{{.Email}}',{{end}} } spec.summary = 'iOS Ethereum Client' - spec.source = { :git => 'https://github.com/nebulaai/nbai-node.git', :commit => '{{.Commit}}' } + spec.source = { :git => 'https://github.com/ethereum/go-ethereum.git', :commit => '{{.Commit}}' } spec.platform = :ios spec.ios.deployment_target = '9.0' diff --git a/build/travis_keepalive.sh b/build/travis_keepalive.sh new file mode 100755 index 000000000000..77cc623eaf5f --- /dev/null +++ b/build/travis_keepalive.sh @@ -0,0 +1,46 @@ +#!/usr/bin/env bash + +# travis_keepalive runs the given command and preserves its return value, +# while it forks a child process what periodically produces a log line, +# so that Travis won't abort the build after 10 minutes. + +# Why? +# `t.Log()` in Go holds the buffer until the test does not pass or fail, +# and `-race` can increase the execution time by 2-20x. + +set -euo pipefail + +readonly KEEPALIVE_INTERVAL=300 # seconds => 5m + +main() { + keepalive + $@ +} + +# Keepalive produces a log line in each KEEPALIVE_INTERVAL. +keepalive() { + local child_pid + # Note: We fork here! + repeat "keepalive" & + child_pid=$! + ensureChildOnEXIT "${child_pid}" +} + +repeat() { + local this="$1" + while true; do + echo "${this}" + sleep "${KEEPALIVE_INTERVAL}" + done +} + +# Ensures that the child gets killed on normal program exit. +ensureChildOnEXIT() { + # Note: SIGINT and SIGTERM are forwarded to the child process by Bash + # automatically, so we don't have to deal with signals. + + local child_pid="$1" + trap "kill ${child_pid}" EXIT +} + +main "$@" diff --git a/build/update-license.go b/build/update-license.go index e3e00d4cc0cf..aa4d6100d78d 100644 --- a/build/update-license.go +++ b/build/update-license.go @@ -62,18 +62,22 @@ var ( skipPrefixes = []string{ // boring stuff "vendor/", "tests/testdata/", "build/", + // don't relicense vendored sources "cmd/internal/browser", + "common/bitutil/bitutil", + "common/prque/", "consensus/ethash/xor.go", "crypto/bn256/", "crypto/ecies/", - "crypto/secp256k1/curve.go", - "crypto/sha3/", + "graphql/graphiql.go", "internal/jsre/deps", "log/", - "common/bitutil/bitutil", - // don't license generated files - "contracts/chequebook/contract/code.go", + "metrics/", + "signer/rules/deps", + + // skip special licenses + "crypto/secp256k1", // Relicensed to BSD-3 via https://github.com/ethereum/go-ethereum/pull/17225 } // paths with this prefix are licensed as GPL. all other files are LGPL. @@ -146,6 +150,13 @@ func (i info) gpl() bool { return false } +// authors implements the sort.Interface for strings in case-insensitive mode. +type authors []string + +func (as authors) Len() int { return len(as) } +func (as authors) Less(i, j int) bool { return strings.ToLower(as[i]) < strings.ToLower(as[j]) } +func (as authors) Swap(i, j int) { as[i], as[j] = as[j], as[i] } + func main() { var ( files = getFiles() @@ -264,27 +275,32 @@ func mailmapLookup(authors []string) []string { } func writeAuthors(files []string) { - merge := make(map[string]bool) - // Add authors that Git reports as contributorxs. + var ( + dedup = make(map[string]bool) + list []string + ) + // Add authors that Git reports as contributors. // This is the primary source of author information. for _, a := range gitAuthors(files) { - merge[a] = true + if la := strings.ToLower(a); !dedup[la] { + list = append(list, a) + dedup[la] = true + } } // Add existing authors from the file. This should ensure that we // never lose authors, even if Git stops listing them. We can also // add authors manually this way. for _, a := range readAuthors() { - merge[a] = true + if la := strings.ToLower(a); !dedup[la] { + list = append(list, a) + dedup[la] = true + } } // Write sorted list of authors back to the file. - var result []string - for a := range merge { - result = append(result, a) - } - sort.Strings(result) + sort.Sort(authors(list)) content := new(bytes.Buffer) content.WriteString(authorsFileHeader) - for _, a := range result { + for _, a := range list { content.WriteString(a) content.WriteString("\n") } diff --git a/cmd/abigen/main.go b/cmd/abigen/main.go index cb433f717c42..252d8ef80002 100644 --- a/cmd/abigen/main.go +++ b/cmd/abigen/main.go @@ -18,83 +18,193 @@ package main import ( "encoding/json" - "flag" "fmt" "io/ioutil" "os" + "regexp" "strings" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/common/compiler" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common/compiler" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "gopkg.in/urfave/cli.v1" ) var ( - abiFlag = flag.String("abi", "", "Path to the Ethereum contract ABI json to bind, - for STDIN") - binFlag = flag.String("bin", "", "Path to the Ethereum contract bytecode (generate deploy method)") - typFlag = flag.String("type", "", "Struct name for the binding (default = package name)") + // Git SHA1 commit hash of the release (set via linker flags) + gitCommit = "" + gitDate = "" - solFlag = flag.String("sol", "", "Path to the Ethereum contract Solidity source to build and bind") - solcFlag = flag.String("solc", "solc", "Solidity compiler to use if source builds are requested") - excFlag = flag.String("exc", "", "Comma separated types to exclude from binding") + app *cli.App - pkgFlag = flag.String("pkg", "", "Package name to generate the binding into") - outFlag = flag.String("out", "", "Output file for the generated binding (default = stdout)") - langFlag = flag.String("lang", "go", "Destination language for the bindings (go, java, objc)") + // Flags needed by abigen + abiFlag = cli.StringFlag{ + Name: "abi", + Usage: "Path to the Ethereum contract ABI json to bind, - for STDIN", + } + binFlag = cli.StringFlag{ + Name: "bin", + Usage: "Path to the Ethereum contract bytecode (generate deploy method)", + } + typeFlag = cli.StringFlag{ + Name: "type", + Usage: "Struct name for the binding (default = package name)", + } + jsonFlag = cli.StringFlag{ + Name: "combined-json", + Usage: "Path to the combined-json file generated by compiler", + } + solFlag = cli.StringFlag{ + Name: "sol", + Usage: "Path to the Ethereum contract Solidity source to build and bind", + } + solcFlag = cli.StringFlag{ + Name: "solc", + Usage: "Solidity compiler to use if source builds are requested", + Value: "solc", + } + vyFlag = cli.StringFlag{ + Name: "vy", + Usage: "Path to the Ethereum contract Vyper source to build and bind", + } + vyperFlag = cli.StringFlag{ + Name: "vyper", + Usage: "Vyper compiler to use if source builds are requested", + Value: "vyper", + } + excFlag = cli.StringFlag{ + Name: "exc", + Usage: "Comma separated types to exclude from binding", + } + pkgFlag = cli.StringFlag{ + Name: "pkg", + Usage: "Package name to generate the binding into", + } + outFlag = cli.StringFlag{ + Name: "out", + Usage: "Output file for the generated binding (default = stdout)", + } + langFlag = cli.StringFlag{ + Name: "lang", + Usage: "Destination language for the bindings (go, java, objc)", + Value: "go", + } + aliasFlag = cli.StringFlag{ + Name: "alias", + Usage: "Comma separated aliases for function and event renaming, e.g. foo=bar", + } ) -func main() { - // Parse and ensure all needed inputs are specified - flag.Parse() - - if *abiFlag == "" && *solFlag == "" { - fmt.Printf("No contract ABI (--abi) or Solidity source (--sol) specified\n") - os.Exit(-1) - } else if (*abiFlag != "" || *binFlag != "" || *typFlag != "") && *solFlag != "" { - fmt.Printf("Contract ABI (--abi), bytecode (--bin) and type (--type) flags are mutually exclusive with the Solidity source (--sol) flag\n") - os.Exit(-1) +func init() { + app = utils.NewApp(gitCommit, gitDate, "ethereum checkpoint helper tool") + app.Flags = []cli.Flag{ + abiFlag, + binFlag, + typeFlag, + jsonFlag, + solFlag, + solcFlag, + vyFlag, + vyperFlag, + excFlag, + pkgFlag, + outFlag, + langFlag, + aliasFlag, } - if *pkgFlag == "" { - fmt.Printf("No destination package specified (--pkg)\n") - os.Exit(-1) + app.Action = utils.MigrateFlags(abigen) + cli.CommandHelpTemplate = utils.OriginCommandHelpTemplate +} + +func abigen(c *cli.Context) error { + utils.CheckExclusive(c, abiFlag, jsonFlag, solFlag, vyFlag) // Only one source can be selected. + if c.GlobalString(pkgFlag.Name) == "" { + utils.Fatalf("No destination package specified (--pkg)") } var lang bind.Lang - switch *langFlag { + switch c.GlobalString(langFlag.Name) { case "go": lang = bind.LangGo case "java": lang = bind.LangJava case "objc": lang = bind.LangObjC + utils.Fatalf("Objc binding generation is uncompleted") default: - fmt.Printf("Unsupported destination language \"%s\" (--lang)\n", *langFlag) - os.Exit(-1) + utils.Fatalf("Unsupported destination language \"%s\" (--lang)", c.GlobalString(langFlag.Name)) } // If the entire solidity code was specified, build and bind based on that var ( - abis []string - bins []string - types []string + abis []string + bins []string + types []string + sigs []map[string]string + libs = make(map[string]string) + aliases = make(map[string]string) ) - if *solFlag != "" || (*abiFlag == "-" && *pkgFlag == "") { + if c.GlobalString(abiFlag.Name) != "" { + // Load up the ABI, optional bytecode and type name from the parameters + var ( + abi []byte + err error + ) + input := c.GlobalString(abiFlag.Name) + if input == "-" { + abi, err = ioutil.ReadAll(os.Stdin) + } else { + abi, err = ioutil.ReadFile(input) + } + if err != nil { + utils.Fatalf("Failed to read input ABI: %v", err) + } + abis = append(abis, string(abi)) + + var bin []byte + if binFile := c.GlobalString(binFlag.Name); binFile != "" { + if bin, err = ioutil.ReadFile(binFile); err != nil { + utils.Fatalf("Failed to read input bytecode: %v", err) + } + if strings.Contains(string(bin), "//") { + utils.Fatalf("Contract has additional library references, please use other mode(e.g. --combined-json) to catch library infos") + } + } + bins = append(bins, string(bin)) + + kind := c.GlobalString(typeFlag.Name) + if kind == "" { + kind = c.GlobalString(pkgFlag.Name) + } + types = append(types, kind) + } else { // Generate the list of types to exclude from binding exclude := make(map[string]bool) - for _, kind := range strings.Split(*excFlag, ",") { + for _, kind := range strings.Split(c.GlobalString(excFlag.Name), ",") { exclude[strings.ToLower(kind)] = true } - - var contracts map[string]*compiler.Contract var err error - if *solFlag != "" { - contracts, err = compiler.CompileSolidity(*solcFlag, *solFlag) + var contracts map[string]*compiler.Contract + + switch { + case c.GlobalIsSet(solFlag.Name): + contracts, err = compiler.CompileSolidity(c.GlobalString(solcFlag.Name), c.GlobalString(solFlag.Name)) if err != nil { - fmt.Printf("Failed to build Solidity contract: %v\n", err) - os.Exit(-1) + utils.Fatalf("Failed to build Solidity contract: %v", err) } - } else { - contracts, err = contractsFromStdin() + case c.GlobalIsSet(vyFlag.Name): + contracts, err = compiler.CompileVyper(c.GlobalString(vyperFlag.Name), c.GlobalString(vyFlag.Name)) + if err != nil { + utils.Fatalf("Failed to build Vyper contract: %v", err) + } + case c.GlobalIsSet(jsonFlag.Name): + jsonOutput, err := ioutil.ReadFile(c.GlobalString(jsonFlag.Name)) if err != nil { - fmt.Printf("Failed to read input ABIs from STDIN: %v\n", err) - os.Exit(-1) + utils.Fatalf("Failed to read combined-json from compiler: %v", err) + } + contracts, err = compiler.ParseCombinedJSON(jsonOutput, "", "", "", "") + if err != nil { + utils.Fatalf("Failed to read contract information from json output: %v", err) } } // Gather all non-excluded contract for binding @@ -102,64 +212,53 @@ func main() { if exclude[strings.ToLower(name)] { continue } - abi, _ := json.Marshal(contract.Info.AbiDefinition) // Flatten the compiler parse + abi, err := json.Marshal(contract.Info.AbiDefinition) // Flatten the compiler parse + if err != nil { + utils.Fatalf("Failed to parse ABIs from compiler output: %v", err) + } abis = append(abis, string(abi)) bins = append(bins, contract.Code) - + sigs = append(sigs, contract.Hashes) nameParts := strings.Split(name, ":") types = append(types, nameParts[len(nameParts)-1]) - } - } else { - // Otherwise load up the ABI, optional bytecode and type name from the parameters - var abi []byte - var err error - if *abiFlag == "-" { - abi, err = ioutil.ReadAll(os.Stdin) - } else { - abi, err = ioutil.ReadFile(*abiFlag) - } - if err != nil { - fmt.Printf("Failed to read input ABI: %v\n", err) - os.Exit(-1) - } - abis = append(abis, string(abi)) - bin := []byte{} - if *binFlag != "" { - if bin, err = ioutil.ReadFile(*binFlag); err != nil { - fmt.Printf("Failed to read input bytecode: %v\n", err) - os.Exit(-1) - } + libPattern := crypto.Keccak256Hash([]byte(name)).String()[2:36] + libs[libPattern] = nameParts[len(nameParts)-1] } - bins = append(bins, string(bin)) - - kind := *typFlag - if kind == "" { - kind = *pkgFlag + } + // Extract all aliases from the flags + if c.GlobalIsSet(aliasFlag.Name) { + // We support multi-versions for aliasing + // e.g. + // foo=bar,foo2=bar2 + // foo:bar,foo2:bar2 + re := regexp.MustCompile(`(?:(\w+)[:=](\w+))`) + submatches := re.FindAllStringSubmatch(c.GlobalString(aliasFlag.Name), -1) + for _, match := range submatches { + aliases[match[1]] = match[2] } - types = append(types, kind) } // Generate the contract binding - code, err := bind.Bind(types, abis, bins, *pkgFlag, lang) + code, err := bind.Bind(types, abis, bins, sigs, c.GlobalString(pkgFlag.Name), lang, libs, aliases) if err != nil { - fmt.Printf("Failed to generate ABI binding: %v\n", err) - os.Exit(-1) + utils.Fatalf("Failed to generate ABI binding: %v", err) } // Either flush it out to a file or display on the standard output - if *outFlag == "" { + if !c.GlobalIsSet(outFlag.Name) { fmt.Printf("%s\n", code) - return + return nil } - if err := ioutil.WriteFile(*outFlag, []byte(code), 0600); err != nil { - fmt.Printf("Failed to write ABI binding: %v\n", err) - os.Exit(-1) + if err := ioutil.WriteFile(c.GlobalString(outFlag.Name), []byte(code), 0600); err != nil { + utils.Fatalf("Failed to write ABI binding: %v", err) } + return nil } -func contractsFromStdin() (map[string]*compiler.Contract, error) { - bytes, err := ioutil.ReadAll(os.Stdin) - if err != nil { - return nil, err +func main() { + log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StreamHandler(os.Stderr, log.TerminalFormat(true)))) + + if err := app.Run(os.Args); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) } - return compiler.ParseCombinedJSON(bytes, "", "", "", "") } diff --git a/cmd/bootnode/main.go b/cmd/bootnode/main.go index c04f9e0d952f..f6e2a14c3bd2 100644 --- a/cmd/bootnode/main.go +++ b/cmd/bootnode/main.go @@ -24,14 +24,14 @@ import ( "net" "os" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/discover" - "github.com/nebulaai/nbai-node/p2p/discv5" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/nat" - "github.com/nebulaai/nbai-node/p2p/netutil" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/discv5" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/nat" + "github.com/ethereum/go-ethereum/p2p/netutil" ) func main() { @@ -70,7 +70,9 @@ func main() { if err = crypto.SaveECDSA(*genKey, nodeKey); err != nil { utils.Fatalf("%v", err) } - return + if !*writeAddr { + return + } case *nodeKeyFile == "" && *nodeKeyHex == "": utils.Fatalf("Use -nodekey or -nodekeyhex to specify a private key") case *nodeKeyFile != "" && *nodeKeyHex != "": @@ -112,12 +114,13 @@ func main() { if !realaddr.IP.IsLoopback() { go nat.Map(natm, nil, "udp", realaddr.Port, realaddr.Port, "ethereum discovery") } - // TODO: react to external IP changes over time. if ext, err := natm.ExternalIP(); err == nil { realaddr = &net.UDPAddr{IP: ext, Port: realaddr.Port} } } + printNotice(&nodeKey.PublicKey, *realaddr) + if *runv5 { if _, err := discv5.ListenUDP(nodeKey, conn, "", restrictList); err != nil { utils.Fatalf("%v", err) @@ -136,3 +139,13 @@ func main() { select {} } + +func printNotice(nodeKey *ecdsa.PublicKey, addr net.UDPAddr) { + if addr.IP.IsUnspecified() { + addr.IP = net.IP{127, 0, 0, 1} + } + n := enode.NewV4(nodeKey, addr.IP, 0, addr.Port) + fmt.Println(n.URLv4()) + fmt.Println("Note: you're using cmd/bootnode, a developer tool.") + fmt.Println("We recommend using a regular node as bootstrap node for production deployments.") +} diff --git a/cmd/checkpoint-admin/common.go b/cmd/checkpoint-admin/common.go new file mode 100644 index 000000000000..05a45dfbf997 --- /dev/null +++ b/cmd/checkpoint-admin/common.go @@ -0,0 +1,120 @@ +// Copyright 2019 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 ( + "strconv" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/external" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/contracts/checkpointoracle" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" + "gopkg.in/urfave/cli.v1" +) + +// newClient creates a client with specified remote URL. +func newClient(ctx *cli.Context) *ethclient.Client { + client, err := ethclient.Dial(ctx.GlobalString(nodeURLFlag.Name)) + if err != nil { + utils.Fatalf("Failed to connect to Ethereum node: %v", err) + } + return client +} + +// newRPCClient creates a rpc client with specified node URL. +func newRPCClient(url string) *rpc.Client { + client, err := rpc.Dial(url) + if err != nil { + utils.Fatalf("Failed to connect to Ethereum node: %v", err) + } + return client +} + +// getContractAddr retrieves the register contract address through +// rpc request. +func getContractAddr(client *rpc.Client) common.Address { + var addr string + if err := client.Call(&addr, "les_getCheckpointContractAddress"); err != nil { + utils.Fatalf("Failed to fetch checkpoint oracle address: %v", err) + } + return common.HexToAddress(addr) +} + +// getCheckpoint retrieves the specified checkpoint or the latest one +// through rpc request. +func getCheckpoint(ctx *cli.Context, client *rpc.Client) *params.TrustedCheckpoint { + var checkpoint *params.TrustedCheckpoint + + if ctx.GlobalIsSet(indexFlag.Name) { + var result [3]string + index := uint64(ctx.GlobalInt64(indexFlag.Name)) + if err := client.Call(&result, "les_getCheckpoint", index); err != nil { + utils.Fatalf("Failed to get local checkpoint %v, please ensure the les API is exposed", err) + } + checkpoint = ¶ms.TrustedCheckpoint{ + SectionIndex: index, + SectionHead: common.HexToHash(result[0]), + CHTRoot: common.HexToHash(result[1]), + BloomRoot: common.HexToHash(result[2]), + } + } else { + var result [4]string + err := client.Call(&result, "les_latestCheckpoint") + if err != nil { + utils.Fatalf("Failed to get local checkpoint %v, please ensure the les API is exposed", err) + } + index, err := strconv.ParseUint(result[0], 0, 64) + if err != nil { + utils.Fatalf("Failed to parse checkpoint index %v", err) + } + checkpoint = ¶ms.TrustedCheckpoint{ + SectionIndex: index, + SectionHead: common.HexToHash(result[1]), + CHTRoot: common.HexToHash(result[2]), + BloomRoot: common.HexToHash(result[3]), + } + } + return checkpoint +} + +// newContract creates a registrar contract instance with specified +// contract address or the default contracts for mainnet or testnet. +func newContract(client *rpc.Client) (common.Address, *checkpointoracle.CheckpointOracle) { + addr := getContractAddr(client) + if addr == (common.Address{}) { + utils.Fatalf("No specified registrar contract address") + } + contract, err := checkpointoracle.NewCheckpointOracle(addr, ethclient.NewClient(client)) + if err != nil { + utils.Fatalf("Failed to setup registrar contract %s: %v", addr, err) + } + return addr, contract +} + +// newClefSigner sets up a clef backend and returns a clef transaction signer. +func newClefSigner(ctx *cli.Context) *bind.TransactOpts { + clef, err := external.NewExternalSigner(ctx.String(clefURLFlag.Name)) + if err != nil { + utils.Fatalf("Failed to create clef signer %v", err) + } + return bind.NewClefTransactor(clef, accounts.Account{Address: common.HexToAddress(ctx.String(signerFlag.Name))}) +} diff --git a/cmd/checkpoint-admin/exec.go b/cmd/checkpoint-admin/exec.go new file mode 100644 index 000000000000..352a96d9e6f0 --- /dev/null +++ b/cmd/checkpoint-admin/exec.go @@ -0,0 +1,311 @@ +// Copyright 2019 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 ( + "bytes" + "context" + "encoding/binary" + "fmt" + "math/big" + "strings" + "time" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/contracts/checkpointoracle" + "github.com/ethereum/go-ethereum/contracts/checkpointoracle/contract" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" + "gopkg.in/urfave/cli.v1" +) + +var commandDeploy = cli.Command{ + Name: "deploy", + Usage: "Deploy a new checkpoint oracle contract", + Flags: []cli.Flag{ + nodeURLFlag, + clefURLFlag, + signerFlag, + signersFlag, + thresholdFlag, + }, + Action: utils.MigrateFlags(deploy), +} + +var commandSign = cli.Command{ + Name: "sign", + Usage: "Sign the checkpoint with the specified key", + Flags: []cli.Flag{ + nodeURLFlag, + clefURLFlag, + signerFlag, + indexFlag, + hashFlag, + oracleFlag, + }, + Action: utils.MigrateFlags(sign), +} + +var commandPublish = cli.Command{ + Name: "publish", + Usage: "Publish a checkpoint into the oracle", + Flags: []cli.Flag{ + nodeURLFlag, + clefURLFlag, + signerFlag, + indexFlag, + signaturesFlag, + }, + Action: utils.MigrateFlags(publish), +} + +// deploy deploys the checkpoint registrar contract. +// +// Note the network where the contract is deployed depends on +// the network where the connected node is located. +func deploy(ctx *cli.Context) error { + // Gather all the addresses that should be permitted to sign + var addrs []common.Address + for _, account := range strings.Split(ctx.String(signersFlag.Name), ",") { + if trimmed := strings.TrimSpace(account); !common.IsHexAddress(trimmed) { + utils.Fatalf("Invalid account in --signers: '%s'", trimmed) + } + addrs = append(addrs, common.HexToAddress(account)) + } + // Retrieve and validate the signing threshold + needed := ctx.Int(thresholdFlag.Name) + if needed == 0 || needed > len(addrs) { + utils.Fatalf("Invalid signature threshold %d", needed) + } + // Print a summary to ensure the user understands what they're signing + fmt.Printf("Deploying new checkpoint oracle:\n\n") + for i, addr := range addrs { + fmt.Printf("Admin %d => %s\n", i+1, addr.Hex()) + } + fmt.Printf("\nSignatures needed to publish: %d\n", needed) + + // setup clef signer, create an abigen transactor and an RPC client + transactor, client := newClefSigner(ctx), newClient(ctx) + + // Deploy the checkpoint oracle + fmt.Println("Sending deploy request to Clef...") + oracle, tx, _, err := contract.DeployCheckpointOracle(transactor, client, addrs, big.NewInt(int64(params.CheckpointFrequency)), + big.NewInt(int64(params.CheckpointProcessConfirmations)), big.NewInt(int64(needed))) + if err != nil { + utils.Fatalf("Failed to deploy checkpoint oracle %v", err) + } + log.Info("Deployed checkpoint oracle", "address", oracle, "tx", tx.Hash().Hex()) + + return nil +} + +// sign creates the signature for specific checkpoint +// with local key. Only contract admins have the permission to +// sign checkpoint. +func sign(ctx *cli.Context) error { + var ( + offline bool // The indicator whether we sign checkpoint by offline. + chash common.Hash + cindex uint64 + address common.Address + + node *rpc.Client + oracle *checkpointoracle.CheckpointOracle + ) + if !ctx.GlobalIsSet(nodeURLFlag.Name) { + // Offline mode signing + offline = true + if !ctx.IsSet(hashFlag.Name) { + utils.Fatalf("Please specify the checkpoint hash (--hash) to sign in offline mode") + } + chash = common.HexToHash(ctx.String(hashFlag.Name)) + + if !ctx.IsSet(indexFlag.Name) { + utils.Fatalf("Please specify checkpoint index (--index) to sign in offline mode") + } + cindex = ctx.Uint64(indexFlag.Name) + + if !ctx.IsSet(oracleFlag.Name) { + utils.Fatalf("Please specify oracle address (--oracle) to sign in offline mode") + } + address = common.HexToAddress(ctx.String(oracleFlag.Name)) + } else { + // Interactive mode signing, retrieve the data from the remote node + node = newRPCClient(ctx.GlobalString(nodeURLFlag.Name)) + + checkpoint := getCheckpoint(ctx, node) + chash, cindex, address = checkpoint.Hash(), checkpoint.SectionIndex, getContractAddr(node) + + // Check the validity of checkpoint + reqCtx, cancelFn := context.WithTimeout(context.Background(), 10*time.Second) + defer cancelFn() + + head, err := ethclient.NewClient(node).HeaderByNumber(reqCtx, nil) + if err != nil { + return err + } + num := head.Number.Uint64() + if num < ((cindex+1)*params.CheckpointFrequency + params.CheckpointProcessConfirmations) { + utils.Fatalf("Invalid future checkpoint") + } + _, oracle = newContract(node) + latest, _, h, err := oracle.Contract().GetLatestCheckpoint(nil) + if err != nil { + return err + } + if cindex < latest { + utils.Fatalf("Checkpoint is too old") + } + if cindex == latest && (latest != 0 || h.Uint64() != 0) { + utils.Fatalf("Stale checkpoint, latest registered %d, given %d", latest, cindex) + } + } + var ( + signature string + signer string + ) + // isAdmin checks whether the specified signer is admin. + isAdmin := func(addr common.Address) error { + signers, err := oracle.Contract().GetAllAdmin(nil) + if err != nil { + return err + } + for _, s := range signers { + if s == addr { + return nil + } + } + return fmt.Errorf("signer %v is not the admin", addr.Hex()) + } + // Print to the user the data thy are about to sign + fmt.Printf("Oracle => %s\n", address.Hex()) + fmt.Printf("Index %4d => %s\n", cindex, chash.Hex()) + + // Sign checkpoint in clef mode. + signer = ctx.String(signerFlag.Name) + + if !offline { + if err := isAdmin(common.HexToAddress(signer)); err != nil { + return err + } + } + clef := newRPCClient(ctx.String(clefURLFlag.Name)) + p := make(map[string]string) + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, cindex) + p["address"] = address.Hex() + p["message"] = hexutil.Encode(append(buf, chash.Bytes()...)) + + fmt.Println("Sending signing request to Clef...") + if err := clef.Call(&signature, "account_signData", accounts.MimetypeDataWithValidator, signer, p); err != nil { + utils.Fatalf("Failed to sign checkpoint, err %v", err) + } + fmt.Printf("Signer => %s\n", signer) + fmt.Printf("Signature => %s\n", signature) + return nil +} + +// sighash calculates the hash of the data to sign for the checkpoint oracle. +func sighash(index uint64, oracle common.Address, hash common.Hash) []byte { + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, index) + + data := append([]byte{0x19, 0x00}, append(oracle[:], append(buf, hash[:]...)...)...) + return crypto.Keccak256(data) +} + +// ecrecover calculates the sender address from a sighash and signature combo. +func ecrecover(sighash []byte, sig []byte) common.Address { + sig[64] -= 27 + defer func() { sig[64] += 27 }() + + signer, err := crypto.SigToPub(sighash, sig) + if err != nil { + utils.Fatalf("Failed to recover sender from signature %x: %v", sig, err) + } + return crypto.PubkeyToAddress(*signer) +} + +// publish registers the specified checkpoint which generated by connected node +// with a authorised private key. +func publish(ctx *cli.Context) error { + // Print the checkpoint oracle's current status to make sure we're interacting + // with the correct network and contract. + status(ctx) + + // Gather the signatures from the CLI + var sigs [][]byte + for _, sig := range strings.Split(ctx.String(signaturesFlag.Name), ",") { + trimmed := strings.TrimPrefix(strings.TrimSpace(sig), "0x") + if len(trimmed) != 130 { + utils.Fatalf("Invalid signature in --signature: '%s'", trimmed) + } else { + sigs = append(sigs, common.Hex2Bytes(trimmed)) + } + } + // Retrieve the checkpoint we want to sign to sort the signatures + var ( + client = newRPCClient(ctx.GlobalString(nodeURLFlag.Name)) + addr, oracle = newContract(client) + checkpoint = getCheckpoint(ctx, client) + sighash = sighash(checkpoint.SectionIndex, addr, checkpoint.Hash()) + ) + for i := 0; i < len(sigs); i++ { + for j := i + 1; j < len(sigs); j++ { + signerA := ecrecover(sighash, sigs[i]) + signerB := ecrecover(sighash, sigs[j]) + if bytes.Compare(signerA.Bytes(), signerB.Bytes()) > 0 { + sigs[i], sigs[j] = sigs[j], sigs[i] + } + } + } + // Retrieve recent header info to protect replay attack + reqCtx, cancelFn := context.WithTimeout(context.Background(), 10*time.Second) + defer cancelFn() + + head, err := ethclient.NewClient(client).HeaderByNumber(reqCtx, nil) + if err != nil { + return err + } + num := head.Number.Uint64() + recent, err := ethclient.NewClient(client).HeaderByNumber(reqCtx, big.NewInt(int64(num-128))) + if err != nil { + return err + } + // Print a summary of the operation that's going to be performed + fmt.Printf("Publishing %d => %s:\n\n", checkpoint.SectionIndex, checkpoint.Hash().Hex()) + for i, sig := range sigs { + fmt.Printf("Signer %d => %s\n", i+1, ecrecover(sighash, sig).Hex()) + } + fmt.Println() + fmt.Printf("Sentry number => %d\nSentry hash => %s\n", recent.Number, recent.Hash().Hex()) + + // Publish the checkpoint into the oracle + fmt.Println("Sending publish request to Clef...") + tx, err := oracle.RegisterCheckpoint(newClefSigner(ctx), checkpoint.SectionIndex, checkpoint.Hash().Bytes(), recent.Number, recent.Hash(), sigs) + if err != nil { + utils.Fatalf("Register contract failed %v", err) + } + log.Info("Successfully registered checkpoint", "tx", tx.Hash().Hex()) + return nil +} diff --git a/cmd/checkpoint-admin/main.go b/cmd/checkpoint-admin/main.go new file mode 100644 index 000000000000..b4d8e0db5acf --- /dev/null +++ b/cmd/checkpoint-admin/main.go @@ -0,0 +1,104 @@ +// Copyright 2019 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 . + +// checkpoint-admin is a utility that can be used to query checkpoint information +// and register stable checkpoints into an oracle contract. +package main + +import ( + "fmt" + "os" + + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common/fdlimit" + "github.com/ethereum/go-ethereum/log" + "gopkg.in/urfave/cli.v1" +) + +var ( + // Git SHA1 commit hash of the release (set via linker flags) + gitCommit = "" + gitDate = "" +) + +var app *cli.App + +func init() { + app = utils.NewApp(gitCommit, gitDate, "ethereum checkpoint helper tool") + app.Commands = []cli.Command{ + commandStatus, + commandDeploy, + commandSign, + commandPublish, + } + app.Flags = []cli.Flag{ + oracleFlag, + nodeURLFlag, + } + cli.CommandHelpTemplate = utils.OriginCommandHelpTemplate +} + +// Commonly used command line flags. +var ( + indexFlag = cli.Int64Flag{ + Name: "index", + Usage: "Checkpoint index (query latest from remote node if not specified)", + } + hashFlag = cli.StringFlag{ + Name: "hash", + Usage: "Checkpoint hash (query latest from remote node if not specified)", + } + oracleFlag = cli.StringFlag{ + Name: "oracle", + Usage: "Checkpoint oracle address (query from remote node if not specified)", + } + thresholdFlag = cli.Int64Flag{ + Name: "threshold", + Usage: "Minimal number of signatures required to approve a checkpoint", + } + nodeURLFlag = cli.StringFlag{ + Name: "rpc", + Value: "http://localhost:8545", + Usage: "The rpc endpoint of a local or remote geth node", + } + clefURLFlag = cli.StringFlag{ + Name: "clef", + Value: "http://localhost:8550", + Usage: "The rpc endpoint of clef", + } + signerFlag = cli.StringFlag{ + Name: "signer", + Usage: "Signer address for clef signing", + } + signersFlag = cli.StringFlag{ + Name: "signers", + Usage: "Comma separated accounts of trusted checkpoint signers", + } + signaturesFlag = cli.StringFlag{ + Name: "signatures", + Usage: "Comma separated checkpoint signatures to submit", + } +) + +func main() { + log.Root().SetHandler(log.LvlFilterHandler(log.LvlInfo, log.StreamHandler(os.Stderr, log.TerminalFormat(true)))) + fdlimit.Raise(2048) + + if err := app.Run(os.Args); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/cmd/checkpoint-admin/status.go b/cmd/checkpoint-admin/status.go new file mode 100644 index 000000000000..f613501eb35d --- /dev/null +++ b/cmd/checkpoint-admin/status.go @@ -0,0 +1,61 @@ +// Copyright 2019 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" + + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common" + "gopkg.in/urfave/cli.v1" +) + +var commandStatus = cli.Command{ + Name: "status", + Usage: "Fetches the signers and checkpoint status of the oracle contract", + Flags: []cli.Flag{ + nodeURLFlag, + }, + Action: utils.MigrateFlags(status), +} + +// status fetches the admin list of specified registrar contract. +func status(ctx *cli.Context) error { + // Create a wrapper around the checkpoint oracle contract + addr, oracle := newContract(newRPCClient(ctx.GlobalString(nodeURLFlag.Name))) + fmt.Printf("Oracle => %s\n", addr.Hex()) + fmt.Println() + + // Retrieve the list of authorized signers (admins) + admins, err := oracle.Contract().GetAllAdmin(nil) + if err != nil { + return err + } + for i, admin := range admins { + fmt.Printf("Admin %d => %s\n", i+1, admin.Hex()) + } + fmt.Println() + + // Retrieve the latest checkpoint + index, checkpoint, height, err := oracle.Contract().GetLatestCheckpoint(nil) + if err != nil { + return err + } + fmt.Printf("Checkpoint (published at #%d) %d => %s\n", height, index, common.Hash(checkpoint).Hex()) + + return nil +} diff --git a/cmd/clef/4byte.json b/cmd/clef/4byte.json deleted file mode 100644 index 5603d5931d78..000000000000 --- a/cmd/clef/4byte.json +++ /dev/null @@ -1 +0,0 @@ -{"0x22ec1244": "shaBid(bytes32,address,uint256,bytes32)", "0xcae9ca51": "approveAndCall(address,uint256,bytes)", "0x4fb2e45d": "transferOwner(address)", "0x7741b4ec": "RandomNumberFromSeed(uint256)", "0x267127ec": "getTokenSettings()", "0xb7213bd4": "readLog(uint256)", "0x3018205f": "getController()", "0xc8edf65e": "GetAndReduceFeesByFraction(uint256)", "0xeec2b628": "beforeExecute(address)", "0xfc0c546a": "token()", "0x40a3d246": "toggle()", "0x70983e91": "startBoardProposal(uint256,address)", "0x6b5caec4": "setBot(address)", "0x78524b2e": "halveMinQuorum()", "0x2c60a055": "MapTest()", "0xc2fb8f36": "TinyHuman(address,address,address)", "0x6822abae": "getMinimumCallCost(uint256)", "0x6f9fb98a": "getContractBalance()", "0x5c17f9f4": "approve(address,uint256,bytes)", "0x504ac982": "transfer(string,string)", "0x06e53f47": "whichChainIsThis()", "0xf359671c": "withdrawWithReference(address,uint256,string)", "0xf97d0591": "parseTimestamp(uint256)", "0xd3c0715b": "vote(uint256,bool,string)", "0x6b069710": "scheduleCall(address,bytes,uint256,uint256,uint8)", "0x37ae43a3": "BetOnHashV81()", "0xab519020": "calcShare(uint256,uint256)", "0x6572ae13": "calculateWinner(uint256,uint256)", "0x6aaba012": "ErrorGenerator()", "0xfe05e8b1": "assertFact(uint256,string)", "0x6e940a29": "changeHost(address)", "0x669ee827": "RegisterDevice()", "0x6f4dd69c": "testSetBalanceUpdatesSupply()", "0x4401a6e4": "safeSend(address)", "0x27dc297e": "__callback(bytes32,string)", "0xe4dedc7f": "DeleteContract()", "0x7fef036e": "totalEntries()", "0x64325ddb": "currentClaimPrice()", "0x2fc0aad3": "isNumericString(string)", "0xbc45d789": "setConfigUint(int256,bytes32,uint256)", "0xee95feaf": "isSeller(address)", "0x358d5dc2": "getIsCashed(uint256,uint256)", "0x1397fdbd": "getShares(address,bytes,int256[])", "0x2d8c1c35": "level_up()", "0x24600fc3": "withdrawFunds()", "0x05f8b6f5": "_rewireIdentities(bytes32[],uint256,uint256,uint32)", "0x1840f0ca": "countVotes(uint256)", "0xd44aadf7": "initROS()", "0xca1d209d": "fund(uint256)", "0x5fa513d5": "findPtr(uint256,uint256,uint256,uint256)", "0x3c314a91": "playerGetPendingTxByAddress(address)", "0xd5582205": "getCertifiedStudentAtIndex(uint256)", "0xe45ebe93": "checkVoteStatus()", "0xcd9380d5": "testSetBalanceSetsSupplyCumulatively()", "0x637e86eb": "totBOTs()", "0x5bb47808": "setFactory(address)", "0x674cc1f5": "getMarketHashes(bytes32[])", "0x648bf774": "recover(address,address)", "0x0221038a": "payOut(address,uint256)", "0x4016535a": "parseBlock(bytes,uint256)", "0xa3908e1b": "convert(uint256)", "0xd9e7ee1c": "new_game(uint256,uint256)", "0x929e626e": "getShareDistribution(bytes32)", "0xa20495d3": "Managed()", "0xd409ddda": "EtherizationUtils()", "0xcb2b9031": "addressToBytes(address,address)", "0xfff3c457": "readMessages(uint256)", "0x043753ba": "makeDecision(uint256,bool)", "0x85b4bb53": "getSettings()", "0x60726abb": "copy()", "0xe50d0473": "SetRank(uint8,address,uint16)", "0x54ae8492": "CustodialForward()", "0xd6d02c51": "whois(string)", "0xcb712535": "_transferFrom(address,address,uint256)", "0xb152f19e": "getFirstSchedulableBlock()", "0x9334ab61": "Infos()", "0x88a49164": "testErrorUnauthorizedTransfer()", "0x17db59a4": "dEthereumlotteryNet(address,address,address)", "0xf85aefba": "testBitsSetFailIndexOOB()", "0xae99847b": "daylimit(uint256)", "0xd93e7573": "disown(bytes32)", "0xa5468081": "Pyramid(address)", "0x00e7d289": "registerListening(address)", "0x57ee24af": "getNum(bytes32,uint256)", "0xdaea85c5": "approve(address)", "0x36ffa905": "getMyProposals()", "0x7143059f": "getParticipant(address)", "0x55ff440a": "castStringToUInt(string)", "0x6a4a6b6e": "_myAddressHelper()", "0xb67fabdf": "scheduleTransaction(address,uint256,uint256,bytes)", "0xbcca1fd3": "changeVotingRules(uint256,uint256,int256)", "0x1d3390a1": "carefulSendWithFixedGas(address,uint256,uint256)", "0x45104b16": "EXECUTION_GAS_OVERHEAD()", "0xa26759cb": "addFunds()", "0x232523e8": "forceDivestOfAllInvestors()", "0x7e904a48": "getNumContents(uint256)", "0xb69c0896": "BaseScheduler(address,address,uint256)", "0xc6ed8e1b": "getApprovedProxys()", "0x4d1f8c31": "owner(uint64)", "0x17c65aa7": "getMaxLossAfterTrade(address,uint256,int256,int256)", "0x2c02d622": "precalculate()", "0xa035b1fe": "price()", "0x43b0e8df": "set(uint256,uint256,uint256)", "0x9b5fde7d": "payOut(uint256,string)", "0x89fcd099": "getApproval(address,address)", "0x4c0eceb5": "plusOnePonzi()", "0x880cdc31": "updateOwner(address)", "0xdab80d6f": "addSponsor(address)", "0x0fcda174": "getAccountTokenBalance(address,address)", "0xa55cab95": "getName(uint8,uint8)", "0x934db458": "Big()", "0xeb782d8c": "ContentSeries(address)", "0xdbfef710": "getDefaultRequiredGas()", "0x4f09eba7": "proxyApprove(address,uint256,bytes32)", "0xf4c5ab7c": "validateCallGas(uint256,uint256)", "0x376fe102": "userId(address)", "0x922dd59a": "icapTransfer(bytes,address,bytes,uint256)", "0x7318b453": "setVotetUntil(uint8)", "0xb8c86aa6": "getArraySettingResult()", "0x37bdc99b": "release(uint256)", "0x7cbcc254": "__reset__()", "0x37664643": "retractLatestRevision(bytes32)", "0x4b031d0f": "shortSellShares(bytes,uint8,uint256,uint256)", "0xad8d5f48": "exec(address,bytes,uint256)", "0x2f95b833": "requiredStackDepth()", "0xe3848e5b": "thing(string,string,string)", "0xaa272d4b": "getNodeIndexId(bytes)", "0xd7f746ce": "tickingBomb()", "0x3b84edbd": "setRNG(address)", "0x1fb2f2a0": "testUpdateLatestRevision()", "0xb7fba4d3": "getProxy(address)", "0x4b8e1ba8": "isMinter(int256,address)", "0xba4c206e": "removeCertificationDocumentInternal(address,bytes32)", "0x884b5dc2": "fill(uint256[])", "0x88017e05": "setContribution(uint256)", "0x1ff517ff": "totalDebt(address)", "0xd0315658": "getShareDistributionWithTimestamp(bytes)", "0x7d03f5f3": "newGame()", "0xb7538f3e": "ChangeClient(address)", "0xbf4d89b5": "parseInt(string,uint256)", "0x7b55c8b5": "scheduleCall(address,bytes4,bytes,uint8,uint256[4])", "0x350d141e": "getWasApprovedBeforeDeadline()", "0x27960c5f": "validateEndowment(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", "0xb774d3d7": "BankOwner_GetDonationsBalance()", "0x267b6922": "entries(bytes32)", "0x08b7c13b": "getExists(bytes20)", "0x7e7a2fbf": "contribute_toTheGame()", "0x5b86914d": "bet_value()", "0x0e1087c3": "getMarketMakerFunds()", "0xf7149220": "RNG()", "0x345006b6": "getGenerationForCall(address)", "0xc4b14e0b": "getSignature(bytes32)", "0x419945f8": "ExpiringMarket(uint256)", "0x41868769": "CallAborted(address,bytes)", "0x29092d0e": "remove(address)", "0x746c9171": "m_required()", "0x5020dcf4": "convertToEach(uint256,string,uint256)", "0xa06db7dc": "gracePeriod()", "0xbf8fc670": "sendToAggregation(uint256)", "0xf14fcbc8": "commit(bytes32)", "0xa538d287": "getMinMax()", "0xcae523c1": "testOwnedTryAuthUnauthorized()", "0x04d10f1c": "isValidChainyJson(string)", "0x9ba5b4e9": "getEventHashes(bytes32[])", "0xfedfd535": "Config()", "0x42ce0f30": "testThrowUpdateLatestRevisionNotOwner()", "0x31be6985": "testBitXorSuccess()", "0x173cb7de": "getNumReleasesForNameHash(bytes32)", "0xd90a88cd": "getContentReplies(uint256,uint256)", "0x92eefe9b": "setController(address)", "0x052b81c7": "releaseBadges()", "0xb2855b4f": "setFeeAddr(address)", "0x19a9c2f1": "generateId(string)", "0xfa9acb05": "addressInArray(address,address)", "0x3da5c3ce": "puzzle(address,bytes32)", "0x7a427d98": "forceReturn()", "0x70e71ea3": "etherandomSeedWithGasLimit(uint256)", "0xd7a58658": "changeHouseedge(uint8)", "0x72b75585": "getOriginalClient()", "0xf802075f": "requiredEndowment()", "0x7997b997": "doMelt(uint256,uint256)", "0x6d5433e6": "max(uint256,uint256)", "0xb651cbaf": "add_level(address,bytes)", "0xb4d6d4c7": "getPackageData(bytes32)", "0x90e3c278": "getShares(uint256[128])", "0x179b73da": "killBoardProposal(uint256,address)", "0xc944a38e": "CharlyLifeLog(string,int256)", "0xe1c66292": "Create(uint32,address)", "0x69c8b344": "ownedToken(address)", "0xabcf1328": "InterestBank()", "0x532e7e6a": "calcEarningsSelling(bytes,uint256,uint256[],uint8,uint256)", "0x43d24a5e": "addUpdater(address)", "0xd1feca67": "addSpendingRequest(address)", "0x2d34ba79": "setup(address,address)", "0xcb14d93b": "getHash(bytes,address,uint256)", "0x309424fe": "get_all_names()", "0x96c52fc3": "____forward(address,uint256,uint256,bytes)", "0xde39acea": "get32(bytes,uint256)", "0xf3dd3d8a": "newCurrency(string,string,uint8)", "0x2432eb23": "testThrowRetractLatestRevisionNotUpdatable()", "0x7fcf3a2f": "throwFooBar()", "0xabe9f569": "oraclize_getPrice(string,uint256)", "0x41ee903e": "clear(uint256,uint256)", "0xd249a52e": "update(bytes,uint256[],uint256[])", "0xc3d014d6": "setContent(bytes32,bytes32)", "0x3ac5cb73": "GeometricPonzi()", "0x4a1aa767": "claim_victory(uint256,uint8,uint8,uint8)", "0xce592586": "setThresold(uint256,uint256)", "0x63deb2c5": "changeMemberAddress(address)", "0x2e6e504a": "trusteeWithdraw()", "0xcfed9199": "timePassed(uint256)", "0xb782fc9b": "getFirstActiveDuel2()", "0x35b28153": "addAuthorization(address)", "0x46f7a883": "BuyTicket(uint8,uint8,uint8)", "0x83c51a38": "thesimplegame()", "0xfa28ba0d": "validateReleaseLockfileURI(string)", "0xa7b2d4cb": "remove(int256,address)", "0x010731c0": "sendCryptedHand(bytes32)", "0xe9e99d81": "getChannelFeed(address,uint256,uint256,uint256)", "0x4e30a66c": "safeToAdd(uint256,uint256)", "0x2c4e591b": "totalGames()", "0xa3221c8e": "step8()", "0x783ce458": "expmod(uint256,uint256,uint256)", "0xe417291b": "undelegateDAOTokens(uint256)", "0x8e5d97a2": "releasePendingTransfer(uint256)", "0xbc5ff5e1": "oraclize_query(string,string[4],uint256)", "0x38f77d69": "getDistributeProfitsInfo()", "0xbb510a77": "createChannel(address,uint256)", "0x650955d4": "HashToken()", "0xa8484938": "doApprove(address,uint256)", "0x64ed31fe": "authVotes(address)", "0xf7ae9421": "checkInvestorBalance(address)", "0xba904eed": "removeRegistrar(address)", "0xdce4a447": "at(address)", "0xdb4cacec": "Other()", "0x3647b87a": "buildFactory()", "0xa51aea2d": "changeMaxMultiplier(uint256)", "0x4974bc27": "download()", "0xf8a8fd6d": "test()", "0xd8c90762": "addTrustedIssuer(address,string)", "0xdf6c13c3": "getMinFunding()", "0x867904b4": "issue(address,uint256)", "0x1531c267": "fipsRegisterMulti(uint256,address,bytes)", "0x40a49a96": "searchSmallestInvestor()", "0x61bffe01": "addIdentities(bytes32[],bytes32[])", "0xf77a0923": "BitcoinProcessor(address)", "0xd02528e6": "GetGameIndexesToProcess()", "0x9f927be7": "getNextCall(uint256)", "0xd8162db7": "lockedUntilBlock()", "0x36dfe260": "payOneTimeReward()", "0xc5b1a53c": "deposit(bytes16[],uint64)", "0xc2b6b58c": "isClosed()", "0xc88cc6ac": "getCertification(address)", "0x77ac3da5": "oraclize_query(uint256,string,string[1],uint256)", "0x70ab8ba8": "creditUpdate()", "0xd3ea3322": "testBuildTokenSystemCost()", "0x72388610": "paybackAll()", "0xca6d56dc": "addMember(address)", "0x0994a0a0": "DSTokenTest()", "0xe53e04a5": "refillGas()", "0xc1d5e84f": "addNewUser(address)", "0x89ed0b30": "setOraclizeGas(uint32)", "0x02ba8742": "sendCoins(address,uint256)", "0xb0de1cb7": "publish(uint64,bytes,uint64)", "0x0e13b9af": "getValue(uint8,uint8)", "0xb3dfcdc3": "Contribution(uint256)", "0xa9b35240": "packageExists(bytes32)", "0xd1d3bb92": "testSetPkg()", "0x97297467": "checkAndVerify(bytes)", "0xe31bfa00": "next_id()", "0x9948e493": "calcMarketFee(bytes,uint256)", "0xd148288f": "setHoldingPeriod(uint256)", "0xc032dc30": "execute(uint256,address)", "0xdad99989": "burnCoins(address)", "0xb1999937": "leapYearsBefore(uint256)", "0xa6cbcdd5": "numSignatures(bytes4)", "0xaca66aec": "DVIP()", "0x20bf0c52": "Derived(uint256)", "0x693ec85e": "get(string)", "0x0411bca8": "getChallengeAnswerResult(uint256)", "0x61584936": "sealedBids(bytes32)", "0x2f1927cb": "prepareRoll(uint256,uint256,uint256)", "0xeaa1f9fe": "reqisterListening(address)", "0xb623f5e5": "checkSetCosignerAddress(address)", "0xa88c5ef7": "NextPayout()", "0x66ad484c": "newfirst_player(address)", "0xb4022950": "collectFeesInEther(uint256)", "0xbff0fbb8": "calculateMeat(uint256)", "0xd62b255b": "setOwner(address,string)", "0x2fd6d40b": "getBetValueByGamble(uint8)", "0x3b0506f7": "getVoteByAddress(address,uint256)", "0xbddd3a6b": "step7()", "0x67fbd289": "destroyTokens(uint256)", "0x9844347b": "createCertificate(bytes,bytes,uint256,bytes)", "0x5e68ac2c": "Kingdom(string,address,address,address,uint256,uint256,uint256,uint256,uint256)", "0x8ba9f354": "testClearBitSuccess()", "0x48027610": "transferPaidOut(address,address,uint256)", "0x912de8de": "fixBalance()", "0x04509918": "scheduleCall(address)", "0x7cf0ffcb": "forceDivestAll()", "0x3b3b57de": "addr(bytes32)", "0xeb7c6f72": "step6()", "0xfe6f0d82": "testConstructorEvent()", "0x55b62dcf": "getThresold(uint256)", "0xfbae5e7d": "Investors(uint256)", "0x29e206bd": "forceDivestAll(bool)", "0x6a226a49": "addMessage(string)", "0x8e2a6470": "allocateShares(address,uint256)", "0xe6e7237f": "claim_time_victory(uint256)", "0x17a601b5": "MAX_STACK_DEPTH_REQUIREMENT()", "0x87fd0421": "TheEthereumLottery()", "0xc17e6817": "sendSafe(address,uint256)", "0xa5dfee67": "testThrowsCreateNewRevisionNotUpdatable()", "0xb35893f3": "setExporter()", "0x1ceea715": "GetMyInvestFee()", "0xb78bd4a5": "breakCookie(string)", "0x05215b2f": "createStandardToken(uint256)", "0x2632bf20": "unblockMe()", "0x5292af1f": "sendBalance(address)", "0xc2e9fab3": "SubUser()", "0x6493d7fc": "CircuitBreaker(address,address,uint256,uint256)", "0x4f896d4f": "resolve(uint256)", "0x16870257": "getTileDescription(uint8,uint8)", "0x3ef87414": "getRevisionCount(bytes20)", "0x747586b8": "setInt(int256)", "0x5714f6a1": "getTotalAvailableRelays()", "0x99154b49": "ARK()", "0x1efb17ee": "changeHouseAddress(address)", "0x354d7e40": "Payout()", "0x2da0d1ea": "etherSold()", "0xea46193e": "getEtherBalance()", "0x11fe773d": "memcpy(uint256,uint256,uint256)", "0x1e701780": "MICRODAO(address,uint256,uint256,uint256,address)", "0x1c31f710": "setBeneficiary(address)", "0x0a4caed0": "getChannelByRank(address,uint256)", "0xf3125a1f": "deposit(address,uint256,bytes,uint256)", "0x00e46700": "setMinimumPassPercentage(uint8)", "0x92d282c1": "Send()", "0x89d59ee5": "createPersonalDepositAddress()", "0xbe1c766b": "getLength()", "0x70a08231": "balanceOf(address)", "0xae0a6b28": "signature(string,bytes32)", "0xb3485dca": "UpdatePrice(uint8,uint32)", "0xf8ec4bf2": "setAllowTransactions(bool)", "0x53d97e65": "setPrizes(uint32[])", "0xd1b1a22b": "set(string,uint256[],uint256[],uint256[],bool[],uint256[])", "0x96286cc9": "isTokenOwner(address)", "0x154af6b1": "sendShares(uint256,uint8,uint256,address)", "0xbe2430fe": "sendValues()", "0x57a373a1": "uintInArray(uint256,uint256,int256,uint256[],uint256)", "0x8fd28bcf": "testFailAuthorityAuth()", "0x89ef40e7": "numberOfHealthyGenerations()", "0x23e9c216": "setBounty(address,string,uint256)", "0x71dd99fe": "BigRisk()", "0x1e9fcc77": "activateAllowance(address,address)", "0x561e91a1": "makeBet()", "0x32d2fb9f": "getRefRemainingTime(uint256)", "0x992c870d": "transferName(bytes,address)", "0x6b3fdc5a": "oraclize_setNetwork(uint8)", "0x2ea459b8": "claimThrone(bytes)", "0x33a99e04": "selectWinner()", "0x3b49a77b": "hasConfirmed(bytes,address)", "0xa352f1a8": "calcSHA3(bytes)", "0x4bb4b260": "cashAllOut()", "0xb89a73cb": "isShareholder(address)", "0xba5a2d33": "exitPool(address)", "0xddd41ef6": "transferDirector(address)", "0xa06cab79": "Registrar(address,bytes32)", "0x871113c3": "oraclize_query(string,string[1],uint256)", "0x1f0f711f": "discontinue()", "0x632f0ba6": "descriptionHashes(bytes)", "0x980e8c81": "FutureBlockCall(address,uint256,uint8,address,bytes,uint256,uint256,uint256)", "0x4ae8c55f": "getWwLength()", "0x82fc49b8": "setCosignerAddress(address)", "0xc4bd8ebc": "num_monsters()", "0x0381cb3b": "setRowcol(uint256,uint256[2])", "0x124eaee6": "Identity()", "0x3f4be889": "callContractAddress()", "0xef3a6031": "testBaseToken()", "0x954ab4b2": "say()", "0x1b855044": "getHash(uint256,uint256)", "0xd9d73887": "Diana()", "0x5103a5a3": "certify(address,bytes32)", "0x51560da9": "topDogInfo()", "0xf3ee6305": "removeCertificationDocument(address,bytes32)", "0x049ae734": "scheduleCall(address,bytes4,uint256,uint256,uint8)", "0xd8a8e03a": "move(uint256,address)", "0xc3c5a547": "isRegistered(address)", "0x06005754": "nameRegAddress()", "0xbe592488": "validateName(bytes)", "0x0eecae21": "draw()", "0xac3e7d24": "addChainyData(string)", "0xfd83f3e3": "QueueUserMayBeDeliveryDroneCotnrol()", "0x7772a380": "isInGeneration(address,uint256)", "0xeb1ff845": "changeId(uint256,uint256,uint256)", "0x9cc9299e": "killSwap()", "0x1e2ca0f3": "updateLeftLottery(address)", "0x998446a8": "acceptRequest(uint256,bytes)", "0x8e1ffb19": "testThrowsRetractLatestRevisionEnforceRevisions()", "0x9935935f": "setResolveHandler(bytes,address)", "0xcd4b6914": "getRandom(uint256)", "0xc08dd1dc": "IOU(string,string,uint8)", "0xbe4054b9": "commitReading(address,uint256,uint256,string)", "0xbc21ce9d": "Aggregation()", "0x6e173a7f": "storeBlockHeader(bytes,bytes)", "0x114d69b2": "setCRLaddr(address)", "0x3fa4f245": "value()", "0x69573648": "remove(bytes,bytes)", "0x7fee4ecb": "GAS_PER_DEPTH()", "0x591c515f": "append(string,string)", "0x727b1cd6": "next_draw(bytes32,uint256,uint256,uint256,uint256,uint256)", "0xc60ce271": "findNextMinute(uint256,bytes)", "0xd337616e": "resetLottery()", "0xdacaeb07": "pledge(bool,uint256)", "0xb29c2493": "token(uint256,string,uint8,string)", "0x61047ff4": "fibonacci(uint256)", "0x8f367001": "numTokensAbleToPurchase()", "0x12cc08f2": "getPackageReleaseHashes(string,uint256,uint256)", "0x67a59d91": "scheduleCall(address,bytes,bytes,uint256,uint256,uint8)", "0xe6c3b4ab": "testBalanceAuth()", "0xd526b9bd": "_allow()", "0x29de91db": "setMsg(address,uint256)", "0xd1cf113e": "multiAccessSetRecipient(address)", "0xc2412676": "Token()", "0x391f2e96": "InvestCancel()", "0xc0ae6a3a": "ultimateOutcomes(bytes)", "0x202d6eaf": "addInvestorsValue(uint256)", "0x30b9af98": "withdrawFunding()", "0xe80bd3e5": "addCertificationDocumentToSelf(bytes32)", "0xf4e36afd": "findThroneByNameHash(uint256)", "0x30677b83": "multiplierFactor()", "0x590528a9": "sellShares(uint256,uint8,uint256,uint256)", "0x01cceb38": "setExpiry(uint256)", "0x779beca0": "getNumOfSalesWithSameId(bytes)", "0xac940823": "betOnLowHigh(bool)", "0x06961560": "DAO(address,uint256,uint256,uint256,address)", "0xd42bf301": "doTriggerTryAuth()", "0xfa566ddd": "doAllowance(address,address)", "0x6677febe": "get_all_accepted()", "0xaa67c919": "depositFor(address)", "0xf28386bf": "Nexium()", "0x77e4fb04": "testFailNotEnoughValue()", "0x12b58349": "getTotalBalance()", "0xc0d2834b": "DataSource()", "0x3e82055a": "addSignature(uint256,bytes16,bytes)", "0xcff2fa42": "_returnFee(address,uint256)", "0xa056469a": "extractFeeLength()", "0xc98031be": "hintURL(int256,bytes32,string)", "0x6ebbe863": "updatePublishContract(address)", "0x08216c0f": "createHumanStandardToken(uint256,string,uint8,string)", "0xc36af460": "getLatest()", "0xdb5b4183": "oracleOutcomes(bytes,address)", "0x0b5ab3d5": "destroyDeed()", "0xe1c7392a": "init()", "0x4ca1fad8": "addRequest(uint256)", "0x305b73d9": "configure(address,address,uint256,uint8,bytes32,bytes32)", "0x9077dcfd": "submitCoding(string,uint256)", "0x38fff2d0": "getPoolId()", "0x07bc6fad": "withdraw(address,uint256,bytes32,uint256)", "0xfbf58b3e": "transfer(string,address)", "0x1d8b70da": "order_received(string)", "0x0b3ed536": "claimDonations(uint256)", "0x6f374a12": "setBool()", "0x0ca35682": "recover(uint256)", "0x3ae7cdfa": "fipsLegacyRegister(bytes20[],address)", "0xe6c1beb4": "prepend(address)", "0x776d62f6": "costs()", "0xe4690a0b": "popRequest()", "0x74eb9b68": "isAccountLocked(address)", "0x7d32e7bd": "transfer(address,bytes32)", "0xdf2f0a4a": "getDecisionBlockNumber(uint256,uint256)", "0xc494f71a": "LedgerFund(uint32,uint32,uint64,uint64)", "0x446d5aa4": "getAttributes(address)", "0x4cdc6a73": "Marriage()", "0x677cee54": "SafeConditionalHFTransfer()", "0x7b48ba20": "testThrowDisownNotOwner()", "0x1288c42a": "Prism()", "0xe8b13c44": "getChainyTimestamp(string)", "0xe4c2db06": "getPreviousFile(bytes)", "0xf0586f0d": "doThrow(bool)", "0xc1b06513": "registerEvent(bytes32[])", "0x521eb273": "wallet()", "0x32254992": "getPrevHash(int256)", "0x1fd96b69": "ManagedAccount(address,bool)", "0xabf74a93": "pitFee()", "0xa480ca79": "collectFees(address)", "0xa0bde7e8": "getShareDistributionWithTimestamp(bytes32)", "0xff27c476": "shiftBitsRight(bytes,uint256)", "0x172d8a30": "setDirectorLock(uint256,uint256)", "0xf262de8c": "add_staircase(uint16)", "0x990f3f53": "computeResponseSecondHalf(uint256,uint16)", "0x26745909": "PRNG_Challenge()", "0xcacc24eb": "transferFromViaProxy(address,address,address,uint256)", "0x94f3f81d": "removeAuthorization(address)", "0x3f0ec70b": "RequestFactory(address)", "0xa2a8336f": "claimEtherSigner(uint256)", "0xaa5d4719": "getTransferable(bytes20)", "0x23cd7cd5": "Model()", "0x3fb0b2c9": "CancelRoundAndRefundAll()", "0xd5fa2b00": "setAddr(bytes32,address)", "0xa0f61310": "FakeRelay(bytes)", "0x4ea66c38": "buyinInternal(address,uint256)", "0xbe040fb0": "redeem()", "0xb845c9a2": "WEI()", "0x26a7985a": "getMaximumCallGas()", "0x06661abd": "count()", "0xc89f8f08": "testGetController()", "0x81baf820": "BlockScheduler(address)", "0x9801cb8e": "ProofOfExistence()", "0xeb7492d1": "testTotalSupply()", "0x3dfb4843": "renewDeed(bytes32)", "0xc3fa5f93": "BlockScheduler(address,address)", "0x7958533a": "meta(uint256,bytes32)", "0xa1a66e56": "deductFunds(uint256)", "0xaf92a693": "addRegistrar(address)", "0xb2aac51f": "lookupUser(string)", "0xd70cf105": "moveBalance(address,address,uint256)", "0x2afb21bc": "InvestWithdraw()", "0x6d09e2ec": "commitCurrency(address,uint256,uint256)", "0x7b1a4909": "transferETH(address,uint256)", "0x96c824a8": "createAccountFundContract()", "0xe0a70811": "restart(bytes20,bytes)", "0x22057bc7": "getAllRevisionBlockNumbers(bytes20)", "0x6af2da2f": "testKeyedHash()", "0x7f6d8955": "RegisterOne(uint32,address,address)", "0x65f27bea": "testSubBalanceFailsBelowZero()", "0xa2f16d80": "dexWithdrawCollectedFees()", "0xc179520c": "ManageAccount()", "0x2672b3e2": "SplitterEtcToEth()", "0xe839e65e": "query2(string,string,string)", "0x39f64b52": "calcTokenPrice()", "0x4ef5710a": "WatchNumberOfPlayerInCurrentRound()", "0x3017fe24": "callAPIVersion()", "0x2977b1b1": "testAllowanceStartsAtZero()", "0x531c1b33": "getOperatingBudget()", "0xb7f2f33c": "transferRightIfApproved(address,bytes)", "0x00873367": "comparisonchr(string)", "0x2a0d79ef": "totalSupply(bytes)", "0xa715ff59": "EtherandomProxy()", "0xd6ca8ccb": "disown(bytes20)", "0x6ad2a0b3": "buildContract(address)", "0x45596e2e": "setFeeRate(uint256)", "0x0e97cfdf": "placeOrder(uint256,uint256,uint256)", "0x9549355e": "oracalizeReading(uint256)", "0x8d7af473": "numberOfProposals()", "0x728af7ec": "getInterest(uint256,uint256)", "0x11b9fee8": "ForkChecker(uint256,bytes32)", "0xd850288b": "etherlist_top()", "0xf4dc2d21": "Deed(uint256)", "0xf8b11853": "getGenerationStartAt(uint256)", "0x7c7a52bf": "newChallenge(uint256,address)", "0xd2d4bd72": "getCrossRate(bytes,bytes)", "0xe9b93569": "OwnerGetFee()", "0xfb72d24e": "shift_right(uint64,uint256)", "0x112e39a8": "scheduleCall(uint256)", "0x6c494843": "multiAccessChangeOwnerD(address,address,address)", "0x313ce567": "decimals()", "0x9bac8602": "testFailAddBalanceAboveOverflow()", "0xa70a9ad7": "switchDeity(address)", "0x6a61e5fc": "setTokenPrice(uint256)", "0x990c8f79": "returnValue()", "0xa4136862": "setGreeting(string)", "0x0af4626d": "testRetract()", "0x5e11544b": "newPeriod()", "0xdc206e5f": "oraclize_query(uint256,string,string[])", "0xcaa648b4": "getTotalValue()", "0x20bfec70": "WatchFees()", "0x62a0b56b": "testUnset()", "0x42f6e389": "isModule(address)", "0x769796fe": "resetAction(uint256)", "0x402e6230": "getTotalGambles()", "0xe8a1c08f": "nibbleToChar(uint256)", "0x1aa3a008": "register()", "0x96d02099": "rsplit()", "0x83324e8c": "numGroups()", "0x72c7c85a": "minority()", "0xb8d94b95": "buildDSNullMap()", "0xe039e4a1": "getOwner(uint8,uint8)", "0x625cc465": "baseDonation()", "0x77372213": "setName(bytes32,string)", "0xa7dfc874": "unregister(bytes,address,uint256,bytes)", "0x37f4c00e": "anchorGasPrice()", "0xb2bfd948": "checkNumbers(uint8[3])", "0x512f1e64": "orderBookLength()", "0xafed762b": "toSlice(string)", "0xbb6a1427": "testThrowRestartEnforceRevisions()", "0x734d8287": "unclaimedFees()", "0xf295206f": "_unsafeSend(address,uint256)", "0x69d01268": "concatUInt(uint256)", "0x0494630f": "oraclize_query(uint256,string,string[4],uint256)", "0x13fc6ac2": "getEventData(bytes32)", "0xbff974e8": "getContentReplies(uint256)", "0x18921de4": "addSignature(string,uint256[],uint256[],uint256[],bool[],uint256[])", "0xa87e7552": "isValid(bytes,bytes)", "0xb8d3bfe3": "MeatGrindersAssociation(address,address,uint256,uint256,uint256,address)", "0x61461954": "execute()", "0xecb0256b": "relayTx(bytes,int256,int256[],int256,int256,bytes,int256,int256[],int256,int256)", "0x7cdbae63": "addRegistryIntoTagsIndex(address)", "0x1f4e996b": "challenge(bool)", "0x0eb0afa6": "createDebt(address,address,uint256)", "0x5f6a1301": "clearPending()", "0x305a762a": "getTicketsCountByBuyer(uint256,address)", "0x724ae9d0": "getMinInvestment()", "0x1e39499d": "scheduleCall(address,bytes,uint256)", "0x4f197ee7": "transferPackageOwner(string,address)", "0x7e3faec1": "GoldTxFeePool(address,address,bytes)", "0x8d68cf59": "sendFunds()", "0x83eed3d5": "queryN(uint256,string,bytes)", "0x15c91115": "pbkdf2(bytes,bytes,uint256)", "0xeb121e2f": "update(uint256,uint256[101][])", "0x5e44daf3": "vote(uint256,int256)", "0xac562666": "freezeCoin()", "0xb0166b04": "testTransferringMkr()", "0x631de4d6": "replace(address,address)", "0x4bd70ea3": "testFailGetUnset()", "0xf738e5ca": "ownerTakeProfit()", "0xc6236a5c": "scheduleCall(bytes,uint256,uint256,uint8,uint256)", "0x119aa5c8": "checkForward(bytes)", "0x541aea0f": "put(uint256,uint256)", "0x6386c1c7": "getUserInfo(address)", "0x4e209678": "testFailBreach()", "0xe9fe799e": "registrantRemove(address)", "0x2aee19c7": "testCreateWithNonce()", "0xa0ec4e09": "getUltimateOutcomes(bytes32[])", "0x4d9e4e22": "Etheria()", "0xa6b513ee": "finalPrice()", "0x82f0d875": "makeHash()", "0x78ae88d1": "newDeal(uint256,uint256,uint256,uint256,uint256)", "0x177766e6": "getOptionChain(uint256)", "0xf1173928": "RemovedFromGeneration(address,uint256)", "0xea2ea847": "testChallengeFinalize()", "0xbd35d570": "GAS_TO_COMPLETE_EXECUTION()", "0x364ea9e7": "set(uint256,uint256,bool[],uint256[])", "0x17ff0caa": "WeatherBet(uint256,address,address,address)", "0x4e23a144": "fundUser(address,uint256)", "0x144267e0": "refundSecurity(address,uint256,uint256)", "0x31c6c4cf": "transferFromWithReference(address,address,uint256,bytes32,string)", "0x2eb5c61f": "testThrowsUpdateLatestRevisionEnforceRevisions()", "0xde640e19": "Investment(uint256)", "0x9cb8a26a": "selfDestruct()", "0x9c43d950": "registration(uint256,uint256,uint256)", "0xe2fdcc17": "escrow()", "0xc618d15f": "ConvertNumbers(bytes5)", "0x8c98117c": "getBill(uint256,uint256)", "0x2d7788db": "rejectRequest(uint256)", "0xfaab9d39": "setRegistrar(address)", "0xa289673b": "fipsChangeOwner(bytes20,address,address)", "0x54d9d6f8": "findNextDay(uint256,bytes)", "0x008a745d": "claimDividendShare(uint256)", "0x6f4812e2": "testFailControllerInsufficientFundsTransfer()", "0x5e983d08": "setPrices()", "0x798974dd": "getNumProposals()", "0x4ca168cf": "register(bytes,uint256,address,string,uint256)", "0xa1e4d3c2": "MembershipRoster()", "0xd4065763": "returnRemainingMoney()", "0x0c4326a0": "getMajorMinorPatch(bytes32)", "0xeece1e1f": "scheduleShuffling()", "0x226685ee": "Visit()", "0x323082d7": "Vote(string)", "0x0b15650b": "randInt(uint256,uint256)", "0xc9cfac55": "refundCurrency(address,uint256,uint256)", "0xfe4a3ac9": "setExecPrice(uint256)", "0x6a0e605f": "MyToken(uint256,string,uint8,string,address)", "0xb549793d": "scheduleCall(bytes4,bytes,uint256,uint256,uint8,uint256)", "0x85e68531": "revokeAccess(address)", "0x01991313": "scheduleCall(address,bytes4,uint256)", "0x0a6be0e7": "BalancedPonzi()", "0xf463edd1": "createDocument(uint256)", "0xa20c404f": "ModifySettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", "0x560bb612": "SignatureValidator(address)", "0xf7654176": "split()", "0x48f05187": "scheduleCall(address,bytes4,bytes,uint256)", "0xf2b904c3": "checkBetColumn(uint8,address,bytes32,bytes32)", "0x7bc0ff20": "setupExportFee(address,uint256)", "0xeb06e65e": "allowanceFromProxy(address,address,address)", "0xfe757fb5": "lastClaimPrice()", "0xa5d0bab1": "buyPartial(uint256,uint256)", "0xda7d0082": "isCertification(address,bytes32)", "0xe570be18": "DVIPBackend(address,address)", "0x54738157": "OwnerCloseContract()", "0xc1e5304a": "CreateNewDraw(uint256,bytes)", "0x0c26e42e": "getReleaseHashForNameHash(bytes32,uint256)", "0x0f7d6673": "Channel()", "0x54ea4000": "identify(address[])", "0x69307c80": "rotateBits(bytes,int256)", "0x78f0161a": "setGreyGreenPrice(uint8)", "0x23b872dd": "transferFrom(address,address,uint256)", "0x578bcc20": "reduceDebt(address,address,uint256)", "0x59e148fc": "getLastOfferId()", "0xb5299ca6": "giveMeat()", "0xae30d35d": "ARK_TROGLOg_1_00()", "0x2d2c44f2": "Vault()", "0xce19419b": "testThrowsSetNotUpdatableNotOwner()", "0xffcf21a9": "eventOracles(bytes,uint256)", "0xf46c50dc": "doFail()", "0x73b55eaf": "registerData(address,int256,bytes32,address)", "0x53770f9a": "isStateless()", "0x4d47feaa": "ShareholderDB(uint256)", "0x40b31937": "pledgeDecline(uint256)", "0x01cb3b20": "checkGoalReached()", "0x62e05175": "setMotionDB(address)", "0xf362d78f": "testBitNotEqualSuccess()", "0xd2531590": "CANCEL_EXTRA_GAS()", "0x9a92b7e7": "EthVenturesFinal()", "0x79b0797c": "AmIPlayer1()", "0x6241bfd1": "Token(uint256)", "0x94a1710d": "testNonOwnerCantBreach()", "0xb466b76f": "fresh()", "0x4a5dddd2": "proxyPurchase(address)", "0xc0a1a949": "x15()", "0xc3b8bfe5": "transferIfNoHF(address)", "0x4a7e049e": "getFullCompany(address,uint256)", "0x481b659d": "permitPermanentApproval(address)", "0x16ce8a69": "setBuilding(uint256,uint256)", "0x1593a8c7": "endLottery()", "0x078c3fa4": "_transferToICAPWithReference(bytes32,uint256,string)", "0xfa3f1e99": "testBlobStoreRegistered()", "0x0b9e9817": "CanaryV7FastTestnet()", "0x6663bbec": "orderMatch(uint256,uint256,int256,uint256,uint256,address,uint8,bytes,bytes,int256)", "0x273bc3c9": "numberOfThrones()", "0x3c84f868": "set(int256,address,uint256)", "0x1ac61e8c": "testBlobCreate()", "0x5ccc3eaa": "roundMoneyUpToWholeFinney(uint256)", "0x0ccec396": "getNumReleases()", "0x6ac6205c": "addDataPoint(int256,uint256,bool,string)", "0x1d124fe4": "setUtils2(address)", "0x4c471cde": "scheduleCall(address,bytes4,bytes,uint256,uint256,uint8,uint256)", "0x52a554a1": "voteBoardProposal(uint256,address,bool)", "0x745a8be2": "flip32(bytes)", "0xbac1e2e0": "testBitsAndSuccess()", "0x25fda176": "notify(address,uint256)", "0x3b8e6f2e": "balanceAt(address,uint256)", "0x60585358": "getByte()", "0xc853c03d": "newDraw(uint256,uint8[3],uint256,uint256,uint256,uint256)", "0x741273d6": "testThrowRegisterContractAgain()", "0x8f2c44a2": "UnicornMilker()", "0x59d96db5": "terminate(uint256,string)", "0x483ba09e": "setBitcoinBridge(address)", "0x74fbbc86": "rate(uint256,uint256,string)", "0x83ea0620": "packageExists(string)", "0xd917deb5": "Donate()", "0x3fc6bc94": "payDAO()", "0x6558488a": "scheduleSetBool(address,uint256,bool)", "0x83e78b31": "bet(uint8,bool,uint8)", "0xeccb15bc": "SatPosition(int256,int256)", "0x7daa10ce": "getMyInfo()", "0x3e4565d2": "testErrorUnauthorizedNameRegister2()", "0x2143da91": "GameOfThrones()", "0xb29f0835": "doIt()", "0xdcc0ccf3": "Dao(address)", "0x70d53be5": "find()", "0x9a828a71": "oracalizeReading(uint256,string)", "0x6a6d31db": "externalEnter()", "0xf8b71c64": "rewardTo(address,uint256)", "0x0399c357": "assignFreeReadings(address,uint8)", "0x81ade307": "query(string,string)", "0xdb83694c": "getSaleInfo()", "0xa6bf3df0": "oraclize_query(string,string[2],uint256)", "0x29605e77": "transferOperator(address)", "0xf29d2f28": "setTokenHolder(address)", "0xa96f8668": "releaseTokens()", "0x8a3bc2bc": "iPropose(bytes,uint256,bool)", "0xd18611d6": "reactivate()", "0x7620a65b": "Publisher()", "0xa268b332": "testBitXorFailIndexOOB()", "0x6b1781b6": "Emergency()", "0x1003e2d2": "add(uint256)", "0x1209b1f6": "ticketPrice()", "0xe5a27038": "Pluton(uint256,string,uint8,string)", "0x22bc3b8e": "getArgument(uint256)", "0x47bdb7f4": "transferDisable(bytes20)", "0x13137731": "testThrowsUpdateLatestRevisionNotUpdatable()", "0x3f3935d1": "confirmReverse(string)", "0xecb4136e": "NotAnotherPonzi()", "0x49e347ae": "getContents(uint256[],uint256)", "0x669dafe8": "toWei(uint256)", "0xc233e870": "isLatestPatchTree(bytes32,bytes32)", "0x7b789b3d": "agreement(bytes,bytes,bytes)", "0x682d3bb0": "pdfCertificateProof(bytes)", "0x42346c5e": "parseInt(string)", "0x3177029f": "approveAndCall(address,uint256)", "0x71ffcb16": "changeFeeAccount(address)", "0xc971442c": "getDBs()", "0x362e2565": "returnDeposits()", "0xe10e274a": "CrazyEarning()", "0x6d705ebb": "register(address,uint256)", "0xbe9a6555": "start()", "0x1ce624d6": "Crypted_RPS()", "0x2c4cb4be": "removeRegistryFromNameIndex(address)", "0x68742da6": "withdrawFunds(address)", "0x18f3fae1": "setOversight(address)", "0x061ea8cc": "countByOwner(address)", "0xd6d22fa4": "MetaCoin()", "0x85654c9c": "setMembershipRoster(address)", "0x8aa33776": "setMsgPrice(uint256)", "0x4dd850fb": "UfoPonzi()", "0x07e00bcb": "kissBTCCallback(uint256,uint256)", "0xa1b7ae62": "setdirectorName(string)", "0xb4d9cc3a": "profitDisperser()", "0x0f24f5c8": "doTransfer(address,uint256)", "0x8d72a473": "deductFunds(address,uint256)", "0x28f03554": "ProcessDividend()", "0x98391c94": "muteMe(bool)", "0x346cabbc": "scheduleCall(address,bytes4,uint256,bytes,uint256)", "0xa42e36c6": "scheduleTransaction(address,bytes,uint8,uint256[5],uint256)", "0x21b36a08": "setFee(uint64,uint256)", "0xd94073d4": "PT()", "0xe8580dd4": "Survey(address,uint256,string,bytes32[])", "0x1f0c1e0c": "getEventTokenAddress(bytes32,uint256)", "0xce8b7151": "isHF()", "0x9bee757b": "requestExecution(bytes,uint256)", "0x775dec49": "keccak()", "0x6673ce2b": "Results_of_the_last_round()", "0x9f87acd0": "exec(bytes32,bytes32,uint256)", "0x02394872": "getLastBlockHeight()", "0x615664ba": "Market()", "0x0d7af726": "addGame(address,string,string)", "0xf4aa1291": "withdrawFundsAdvanced(address,uint256,uint256)", "0x8ed67a44": "setPrice(uint16)", "0x84ebde52": "Under_the_Hood()", "0x5a28340a": "accessOperatingBudget(uint256)", "0x9a89ad65": "within6Confirms(int256,int256)", "0xdfce8ac3": "fipsLegacyRegister(bytes20,address,bytes)", "0x73f310df": "multiAccessRemoveOwner(address)", "0x4cbee813": "logout(string)", "0xd992bd5b": "testResultNotZero()", "0x05b34410": "creationDate()", "0xfed4614b": "funeral(bytes,int256)", "0x58cb7323": "MainnetETCSurvey()", "0xbb504317": "divest(address,uint256)", "0x82381c96": "WatchCurrentMultiplier()", "0xcce81927": "EtherDice(address,address)", "0x70961774": "getBlockCreatedOn()", "0x84a7b223": "Canary(address)", "0x9378a9e2": "setUInt(uint256)", "0xe4360fc8": "getFileListElement(bytes)", "0xe597f402": "create(bytes1,bytes32,bytes)", "0x95d5a1be": "SignatureReg()", "0x33ce7787": "transferInvestorAccount(address,address)", "0x46c52b1a": "blockHexCoordsValid(int8,int8)", "0x3092afd5": "removeMinter(address)", "0x30945443": "update(address,string,string)", "0xc37ff3d9": "sha(uint256,uint256)", "0x29a6f31b": "oraclize_query(uint256,string,string[2],uint256)", "0x227f9633": "addOption(string,address,uint256)", "0x38eaf913": "setDirectorNode(string)", "0xab67aa58": "transferFrom(address,address,uint256,bytes)", "0x0ce3151c": "personUpdateRelation(uint256,string)", "0x216ef940": "proxyUpgrade(address,address,bytes)", "0x76bc21d9": "fireEventLog2Anonym()", "0xf004073a": "performAction(uint256)", "0xdba7ef7d": "Bookie(address,address)", "0xa0469b02": "inputToDigit(uint256)", "0x1d007f5f": "changeDAO(address)", "0x9dcb5c65": "resultsWeightedByEther()", "0x14ab9038": "setTTL(bytes32,uint64)", "0xf4d94699": "EndowmentRetriever()", "0xe74b9d11": "safeToSubtract(uint256,uint256)", "0xd7504385": "validateToAddress(address)", "0x57e2880d": "scheduleTransaction(uint256,uint256)", "0xe73a914c": "setDAO(address)", "0xc47bc007": "add_funds()", "0x37881810": "setCallbackAddress(address)", "0x686f2c90": "collectAllFees()", "0x278b8c0e": "cancelOrder(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", "0xfac34ff6": "throwFoo()", "0x6d98e9fc": "totalWei()", "0xb0bcc610": "scheduleTransaction(address)", "0x665bcc32": "ProcessGames(uint256[],bool)", "0x3fd1f232": "LookAtAllTheseTastyFees()", "0xdd727ea6": "runJackpot()", "0x0acc4382": "getMinDailyWithdrawLimit()", "0x46b207b8": "checkExpiry()", "0xde5d953a": "logSingleIndex(bytes,bytes,uint256)", "0xf504e0da": "load_level(uint16)", "0x4b63e601": "scheduleCall(address,uint256,bytes)", "0x4a71d469": "collectRev()", "0x80db79d9": "StructAndFor()", "0x090637a1": "GetPart(bytes,uint256)", "0xc003b082": "getMyPlayerID()", "0x00a7d6b3": "checkTransferFromToICAP(address,bytes32,uint256)", "0xdcf8113e": "campaignEndedSuccessfully()", "0xd1af8a5a": "LinkerExample()", "0x01fd89a4": "getFlags(bytes20)", "0xa39a45b7": "replaceOwner(address)", "0x0a3b1cd2": "setHotwallet(address)", "0x075fe877": "scheduleCall(address,bytes,uint256,uint256)", "0x3e5fd9b5": "dEthereumlotteryNet(address,address,bool,address)", "0xa6403636": "resolve(uint8,bytes32,bytes32,bytes32)", "0x0b2acb3f": "add(address,bytes)", "0x6d522b19": "multiAccessChangeRequirementD(uint256,address)", "0x4311de8f": "ownerWithdraw()", "0xa99e7e29": "register(bytes,address)", "0x1ed6f423": "changeDescription(address,string)", "0xcd50d44f": "CheckRepresentment()", "0x4c0e207a": "__outputCallback(uint256)", "0xea8a1af0": "cancel()", "0x67387d6b": "testThrowCreateWithNonceExistingNonce()", "0xdc583801": "doubleyour5()", "0xb8077e28": "getTxOrigin()", "0xbfbc793c": "computeNameFuzzyHash(string)", "0x79baa8a9": "BasicIncome_CoFund()", "0xf4dbeb9d": "getCredRanksByContents(address,uint256[])", "0x227185d6": "Send1Get2()", "0x75c4aaa6": "addUnderDog(uint256)", "0xa7abc124": "activate(bool,bool)", "0x8df554b3": "Dividend()", "0x092b25e9": "setOwner(string,address)", "0x67af26fb": "transferOtherFrom(address,address,address,uint256)", "0x4bb278f3": "finalize()", "0xd1e15045": "sendBack()", "0xa4699cad": "resetWithdrawls()", "0xb61d27f6": "execute(address,uint256,bytes)", "0x9772c982": "scheduleCall(address,bytes4,bytes,uint256,uint256)", "0x1b3a8e6f": "directionCount(int256,int256,int256,int256)", "0xd499555b": "getFirstActiveDuel()", "0xb738169c": "betOnOddEven(bool,bool)", "0x411c4e72": "ModifyFeeFraction(uint256)", "0x06f36cc9": "helpBlue()", "0x9e65c7e5": "updateLatestRevision(bytes20,bytes)", "0xb47fa7e0": "DepositLimit(uint256)", "0xf1736d86": "m_dailyLimit()", "0x62ea82db": "bids(address)", "0x4166c1fd": "getElevation(uint8,uint8)", "0x8702735c": "setCapitol(uint256,uint256)", "0x3cc7790a": "GSI()", "0x83f6d9a4": "validateNameInternal(string)", "0x8d99b2eb": "endPoll()", "0x8bbda7e3": "setContent(string,bytes)", "0x52efea6e": "clear()", "0x2581c674": "testBitsOrFailIndexOOB()", "0x05d87fe2": "issueLetterOfCredit(uint256,uint256,uint256)", "0xcbf0b0c0": "kill(address)", "0xf83d96c1": "InsuranceAgent()", "0x8dd5e298": "canEnterPool(address)", "0x2d580ef6": "add(address,bytes32)", "0xeeda149c": "Register(address)", "0xcc25decd": "SampleOffer(address,bytes,uint256,uint256,uint256,uint256,uint256)", "0x428d64bd": "getShares(address,bytes32[])", "0x3c9a4baa": "requestOutput(bytes)", "0x8cae1374": "editBlock(uint8,uint8,uint256,int8[5])", "0x419db07b": "generousFee()", "0x202e3924": "getOperation(uint256)", "0x5ee345e4": "computeEndowment(uint256,uint256,uint256,uint256,uint256,uint256)", "0x7df23b6a": "ReleaseOracle(address[])", "0x9b2ea4bd": "setAddress(string,address)", "0x65093661": "newCommunity(address)", "0x33637d5a": "getPendingBlock(uint256)", "0x7910085d": "fipsIsRegistered(bytes20)", "0x730720b8": "testControllerValidTransfers()", "0xb0c80972": "setBalance(uint256,bool)", "0xdcf537b1": "multiply7(int256)", "0xdf5cc291": "get4(bytes,uint256)", "0x9ae4e388": "ChangeClientTokenAccount(address,bool)", "0x3121369d": "validateRequiredStackDepth(uint256)", "0x1747dfd4": "ContractPlay()", "0x598647f8": "bid(uint256,uint256)", "0xc368109c": "monster_hp(uint256)", "0x7fa22001": "assertEq0(bytes,bytes,bytes)", "0x8e280dce": "findNextYear(uint256,bytes)", "0x39d1f908": "actualBalance()", "0x8143f8a8": "totalGas(bytes)", "0xfe55932a": "setName(uint256,string)", "0x0fbf7151": "startsWith()", "0x4f20f35a": "payExpenses(address,uint256)", "0x705eeb90": "MultipleConstructorTest(bool)", "0x2df8e00d": "becomeMortal(uint256)", "0x645dce72": "updateRelease(uint32,uint32,uint32,bytes20,bool)", "0x1f6e5117": "getCallbackAddress()", "0xf51cbc72": "Level()", "0x64edfbf0": "purchase()", "0x35930e13": "setMinimalRewardedBalance(uint256)", "0x015e4f3a": "getConfigUint(int256,bytes)", "0x2c329e99": "Last_block_number_and_bloctime_used()", "0x6f3a7561": "SimpleAuction(address)", "0x6de00927": "GetUserRank(uint8,address)", "0xbe600276": "move(uint16)", "0x27d6c032": "unregister(bytes)", "0x4188d79c": "releaseExists(string,uint32,uint32,uint32,string,string)", "0x7ba38916": "changeAdminFromBoard(address)", "0x3369dace": "flipTheCoinAndWin()", "0xfa8dc33a": "checkRecordExists(bytes)", "0xebaf7f2f": "returnReward(uint256)", "0xc88961da": "createKingdom(string,address,address,address)", "0x21970c0c": "pay_royalty()", "0xb4a5ef58": "updateDefaultTimeoutPeriod(uint256)", "0x57bcccb6": "revokePermanentApproval(address)", "0xd1d1c8ae": "ConvertNumbers(bytes)", "0xc1c0e9c4": "exec()", "0xcc131be1": "CreateNewDraw(uint256)", "0x75f96ead": "Guess(uint256)", "0x8a5fb3ca": "currentFeePercentage()", "0x550bcd8d": "testThrowUpdateLatestRevisionEnforceRevisions()", "0xa6780857": "fireEventLog0Anonym()", "0x2d0104a5": "updateFirstDuel1(uint256)", "0xcbf1304d": "balances(address,uint256)", "0xdda9939c": "Store(address[])", "0xf41bfa9e": "mint(int256,uint256,string)", "0x044215c6": "token(uint256)", "0x1f903037": "getBytes32()", "0xa6f9dae1": "changeOwner(address)", "0xf9391d24": "AllPayAuction()", "0xabebb7f3": "MarketsContract()", "0x9e1e6528": "uncertify(address)", "0x81788e2b": "addAllowedAddress(address)", "0x4f44728d": "ownerChangeOwner(address)", "0x3da0ac79": "compare()", "0x96e438a1": "reclaimDeposit(uint256)", "0x5fe22c8b": "testFailTransferWithoutApproval()", "0x6835f32c": "build(bytes)", "0x5cac8b27": "amazing()", "0xad605729": "getParticipantCount()", "0xb6294bde": "AdminGetFee()", "0xec81e22e": "returnmoneycreator(uint8,uint256)", "0xc535165f": "revealAndPayout(bytes,bytes)", "0x6e0bd282": "destroy(bytes32)", "0xdda44b10": "buyRecipient(address,uint8,bytes32,bytes32)", "0xd4859dbc": "UniversalFunctionSecure(uint8,bytes32,bytes32,bytes32,bytes32,bytes32)", "0xd2602930": "RockPaperScissors()", "0xa08b3367": "EC()", "0x92d66313": "getYear(uint256)", "0xe49dcee9": "fixTokens()", "0x36555b85": "add(string,uint256)", "0x25010816": "get_length(uint256,uint256)", "0x610d5de8": "validateEndowment(uint256,uint256,uint256,uint256,uint256)", "0x79ce9fac": "transfer(bytes32,address)", "0x3ced516c": "descriptionHashes(bytes32)", "0xcf69df28": "getDataRequestLength()", "0x706dfe54": "getIssueState(uint256,bytes32)", "0x5af77fff": "Contract()", "0x66e5cb50": "stopTransfer(uint256)", "0x5f72f450": "check(uint256)", "0xf3b50c04": "rescind()", "0x57aee888": "_eraseNodeHierarchy(uint256,bytes32[],bytes32)", "0xaacc5a17": "getRandom()", "0x40275f85": "getPersonalDepositAddress(address)", "0x75700437": "query1_withGasLimit(uint256,string,string,uint256)", "0x6eb7b4c2": "underdogInfo(uint256)", "0x0f3eb785": "add(string,uint256,uint256,uint256)", "0xdc19266f": "Total_of_Players()", "0x9743dfc1": "jesterAutomaticCollectFee()", "0x6618b008": "cancelSellOrder(address)", "0x65538c73": "fireEventLog0()", "0xa4502cb8": "setExportFee(address,uint256)", "0x97bb2a63": "newvow(uint256,address)", "0xb400d149": "betOnNumber(uint8)", "0x030d406b": "entryPayout(uint256)", "0x1d71a1cd": "newIncome(string)", "0x85dd2148": "getSaleDate(bytes16)", "0x29917954": "exitPool()", "0xa25057de": "_transferToICAP(bytes32,uint256)", "0x24fc65ed": "getId(uint256,uint256)", "0x938199a5": "getDateOfLastPayment()", "0x04bb754c": "TradeFinancing()", "0xe37aa618": "distributeValue()", "0x547916ea": "finishRound()", "0xed01bf29": "budget()", "0x95ee1221": "isCancelled()", "0xfe777bcd": "etherForSale()", "0xffe302d1": "setPlz(string)", "0x891de9ed": "fromTLA(string)", "0x84734476": "copyBytes(bytes,uint256,uint256,bytes,uint256)", "0xfb114f57": "oraclize_query(uint256,string,string[3],uint256)", "0xceebe28d": "repoInterfaceVersion()", "0xb0ad38c4": "buildCity(string,uint256[2],uint256[2])", "0xefa7e56b": "GameEnds()", "0xcc3471af": "maxClaimBlock()", "0xa7c5052e": "buildDSTokenRegistry()", "0x6831c169": "totalPayedOut()", "0x98f3b81a": "getShares(address,bytes32[],int256[])", "0x2d077ad0": "Latch()", "0x0ac28725": "requestTradeDeal(uint256,uint256,string)", "0xb311ee0c": "refundClaimDeposit()", "0xadd82871": "strEqual(string,string)", "0x7879e19e": "CollectAllFees()", "0x5bd74490": "regProxy(address,address)", "0xd2b0d554": "getDisclaimer()", "0x0b74edc6": "testFinalHash()", "0x6cf761d4": "getMinConfirmationsByAddr(address)", "0x4cedf74e": "get_party1()", "0x4adcbd19": "isThisHardforkedVersion()", "0xefdecd9b": "check_withdrawdao()", "0x996a8046": "__callback(bytes32,string,bool)", "0x7c9cd7df": "changeDeveloper_only_Dev(address)", "0x3f77b560": "newDocument(bytes)", "0x06b5f02d": "calcWinnings(uint256,uint256)", "0x0a2282ae": "JackPot()", "0x378a2178": "tallyVotes()", "0xd8915fc5": "DCAssetBackend(bytes32,bytes32)", "0x0f590c36": "emergencyFixGameResult(uint64,uint256)", "0xea4af029": "ConferenceCertification()", "0x769dc523": "GetCategoryNumber(bytes4)", "0xd5df7559": "removeDocument(uint256)", "0x749aa2d9": "endRound()", "0xd8e5ae6a": "Etheramid()", "0xc0576b73": "monsters(uint256)", "0x32fefb4c": "add_account(address,address)", "0x7d619d9b": "holdCoin(address,address)", "0x5b067cce": "testCreateCostMain()", "0x384b1393": "follow(uint256)", "0x4162169f": "dao()", "0x5d8227e6": "FactoryBase(string,string,string)", "0x6bf52ffa": "Vote()", "0xeb5904c0": "setProfitDistributionContract(address)", "0x366a68dc": "setBlockLock(uint256)", "0x80d9eaa6": "refCount()", "0x89b8b492": "read(uint64)", "0x46b5e202": "set_num_levels(uint256,uint256)", "0xd96de4ce": "AdminDrawError()", "0x47b47102": "bakeCookie(string)", "0x1d7b5baf": "setUint(int256,bytes32,string,uint256)", "0x0699d07d": "updateMaxVal()", "0xfa544161": "getOwner(address)", "0x638560cf": "registerBool(address,bool)", "0x7c25f260": "Government()", "0x24a852c6": "unset(bytes)", "0xa32f0f41": "testFailControllerUnapprovedTransferFrom()", "0x0968f264": "withdraw(bytes)", "0x5f52e9fd": "WithdrawCashForHardwareReturn(uint256)", "0xc0f68859": "getMinimumGracePeriod()", "0x1bf6c21b": "USD()", "0x0fe234ed": "testSetController()", "0x05a17fc6": "getAccountFeed(address,uint256,uint256,uint256)", "0x673448dd": "isApproved(address)", "0x59dac714": "hashTo256(bytes)", "0x5a09f2f4": "setHouseFee(uint256)", "0x013cf08b": "proposals(uint256)", "0xeebf9808": "PiggyBank()", "0xadd43c59": "EtherTopDog()", "0xf909d60d": "getMinimumGasLimit()", "0xeb045789": "ChannelSeries(address)", "0x66d38203": "setup(address)", "0xe8641652": "strCompare(string,string)", "0x1959a002": "userInfo(address)", "0x737c8ea1": "_getRevisionBlockNumber(bytes32,uint256)", "0x127714c7": "getBudget()", "0x97daa043": "register(bytes,address,address,uint256,bytes)", "0xb5784f6f": "testMultiplePackages()", "0x0ce46c43": "scheduleCall(address,bytes4,bytes,uint16,uint8,uint256[5])", "0xe5782fd5": "setFeeStructure(uint256,uint256,uint256)", "0xa9f6def0": "HonestDice()", "0xeb7cdb56": "rankDown(uint256,uint256)", "0xb17b94c1": "testSystem()", "0xdd36e18b": "ContractStatus()", "0xee0dc478": "testSetEnforceRevisions()", "0x918359c6": "needsBirth()", "0xa5b1e13d": "settle(address,address,uint256,uint256)", "0x6b76484e": "swap(address,address)", "0x68402460": "scheduleCall(address,bytes4,uint256,uint256,uint8,uint256)", "0x733480b7": "transferToICAP(bytes32,uint256)", "0x567dbf18": "__forward(address,uint256,uint256,bytes)", "0x73e1743a": "buildDSBasicAuthority()", "0x482961e1": "updateReading(uint256,uint256)", "0x4e6ba0a9": "testCreateCostMultisig()", "0x8d7108e5": "isValidLocation(uint8,uint8,int8[5],int8[24])", "0x10142785": "assign(bytes,uint256,bytes1)", "0xfe97ee88": "hasPhone(address)", "0xe2861c8d": "cashOutProfit()", "0x0fa9ced4": "emergencyFuneral()", "0x8389f353": "setNumCities(uint256)", "0xdba1ac3d": "getEnforceRevisions(bytes20)", "0x1b4fa6ab": "getDefaultStackCheck()", "0x79be02af": "Read(address)", "0x70844f7a": "sendBadge(address,uint256)", "0x7bfaad96": "addNode(bytes,address)", "0x4d782cbc": "executeSellOrder()", "0xbe71248a": "payWinner()", "0x41304fac": "log(string)", "0x4f059a43": "getClaimAmountForBlock()", "0x6d2cb794": "airaTransfer(address,address,uint256)", "0x5a5383ac": "canExitPool()", "0xcabd27de": "Motion(address)", "0x433d4aab": "resolve(uint8,uint8)", "0x7d89ae63": "__findRef(string)", "0x4e1053cc": "RobinHoodPonzi()", "0x0220a5b4": "terminate(string)", "0x419ffa03": "fipsRegister(address)", "0x77a7e6be": "getRefTotal(uint256)", "0xed64bea4": "JamCoin()", "0x3cf885c4": "isBitSet(uint256,uint8)", "0xf2da67db": "setMany(uint256,int256,uint256,bytes20,address,bytes)", "0xe26c8434": "AdminStartDraw(string,bytes)", "0x13df7091": "mintAll(int256)", "0x8a46bf6d": "testFallback()", "0x29bed3bf": "EthereumRoulette()", "0xf869b11a": "declareVictor(uint256,uint256)", "0x45c41478": "getMarkets(bytes,address)", "0x90cf581c": "voteYes()", "0x9ec35352": "returnRandom()", "0x5025b9ae": "expire(uint256,uint256,uint8,bytes,bytes,bytes)", "0x338a1379": "_setPackedBlockNumber(bytes20,uint256)", "0xdb641ab4": "Game_balance_in_Ethers()", "0xbc0e7adb": "testThrowsDisownNotOwner()", "0x302d350e": "firstChainedCallback(uint256)", "0x5af73f3f": "getMinimalBalance(uint256,address)", "0x4c488dac": "getChannelValidUntil(bytes)", "0xa1616429": "testBitOrSuccess()", "0xaa64c43b": "transferPool(address,address,uint256)", "0x78e97925": "startTime()", "0xa0355f4e": "decline(uint256)", "0x02556de3": "updateMajorTree(bytes32)", "0x01984892": "name(address)", "0xfad4b99a": "updateChannelMinimum(address,uint256)", "0x4f39ca59": "drop(bytes32)", "0x61591a7c": "personUpdateDOB(uint256,int256)", "0x17b3a34b": "_addIdentities(uint256,bytes32[])", "0x91d8b14e": "BuyTickets()", "0x1aadcc34": "convertGreyGreen(uint8,uint8)", "0x9a863892": "NewProposal(uint256)", "0xc5487661": "proxyTransferToICAPWithReference(bytes32,uint256,string)", "0x85f8c16d": "claimHours(int256)", "0xa71f94c8": "scheduleSetUInt(address,uint256,uint256)", "0x7ef09476": "transfer(uint64,address)", "0x94bcdb4c": "Example2()", "0x37930615": "extend(bytes16[],uint64)", "0xfb09b1ac": "testBalanceOfReflectsTransfer()", "0x19a278b9": "getBAddress()", "0xc0a239e3": "valuePerShare()", "0xa039e3c7": "testSetNotTransferable()", "0x22593300": "Small(address)", "0xe21608be": "ReserveToken()", "0xc2985578": "foo()", "0xb463bcde": "testThrowsSetNotTransferableNotOwner()", "0x88d695b2": "batchTransfer(address[],uint256[])", "0x37b0574a": "isClassic()", "0x1da6822c": "testThrowsTransferEnableNotTransferable()", "0xdcfa9cc0": "testProxyCall()", "0x478aa69e": "unauthorizeUser(address)", "0x102accc1": "fireEventLog2()", "0xed62cf1f": "setCanCall(address,address,bytes,bool)", "0x15f73331": "invalidateName(string)", "0x73e30e49": "majorEventFunc(uint256,bytes,bytes)", "0x00c721ab": "setHand(uint256)", "0xf9e27106": "investmentEntryCost()", "0x4c7f74df": "EtherDelta(address,address,address,uint256,uint256,uint256)", "0xb74e452b": "today()", "0xd3118a5a": "addDoc(string,string)", "0xc204f9f1": "_transferFromToICAP(address,bytes32,uint256)", "0xf50d3914": "resetFoundationtList()", "0xe67cdfb7": "moveOldUser(uint256)", "0x98eaca94": "inKissBTC(uint256)", "0xc633084f": "sendGreeting(address,string)", "0xde10f04b": "eraseNode(bytes32[])", "0xd50495f4": "addTransaction(bytes)", "0x96cff3df": "getMinimumCallCost(uint256,uint256)", "0xce373b95": "heroOfThePit()", "0x39e525f9": "resolveCallback(uint256)", "0x942b90d3": "getRewardTable()", "0xedca914c": "buyTicket()", "0x5fcb568c": "release(string,uint32,uint32,uint32,string,string,string)", "0x6c9c2faf": "getSupply()", "0xf1448e10": "requestExecution(bytes)", "0x0c08bf88": "terminate()", "0x08aba5aa": "setAccountBalance(uint256)", "0x2c46d8d5": "EndRound(uint256)", "0x3d5db1c2": "incrUserOnholdBal(address,uint256,bool)", "0xf2f254c7": "getLatestMinorTree(bytes32,uint32)", "0x373a1bc3": "scheduleCall(address,bytes4)", "0x3a96fdd7": "compare(string,string)", "0x738ddabe": "getContentIndexedAccountCred(uint256,address,address)", "0x5acce36b": "getEndowmentBalance()", "0x1ca60aeb": "setMeltingContract(address)", "0x52375093": "m_lastDay()", "0x565a2e2c": "getBeneficiary()", "0x9d5c6061": "getMsgGas()", "0x41d31feb": "get_read_only_keys()", "0x796b89b9": "getBlockTimestamp()", "0x4a41e045": "getUint8(int8)", "0x38e48f06": "save(string)", "0x1cda37f2": "eraseRecords(bytes32)", "0xae978f08": "getLatestTweet()", "0x20909fa0": "communityCurrency()", "0xafbec8df": "TheGrid()", "0x1c14179a": "GavCoin()", "0x0b6142fc": "breach()", "0x3ab1e703": "roundMoneyDown3SF(uint256)", "0x414ceac0": "investorAddFee(uint256)", "0x82a62137": "activateAccount(address)", "0x4ca7fbd0": "updateTokenPriceWeekTwo()", "0x2551858e": "getFlags(bytes32)", "0x4ad07b0e": "oracleOutcomes(bytes32,address)", "0x60b431a4": "testGetSig()", "0xa5f8cdbb": "buyTicket(address)", "0x64aabe92": "tryExec(address,bytes,uint256)", "0xa6c01cfd": "isInGeneration(uint256)", "0x149c5066": "ChanceOfWinning(uint256)", "0xc068eae0": "player_collect_winnings(uint256)", "0x8129fc1c": "initialize()", "0xcf832ce2": "ownerRefundPlayer(bytes32,address,uint256,uint256)", "0x3517a740": "getNodeParent(bytes)", "0xec6afc22": "oraclize_query(uint256,string,string[3])", "0x50944a8f": "setMembership(address)", "0x85b1423e": "returnAll()", "0xd95a2d42": "lendGovernmentMoney(address)", "0x347632e8": "getShareholderAdressByID(uint256)", "0xbb39a960": "trade(address,uint256,address,uint256)", "0x8abadb6b": "setAccountLevel(address,uint256)", "0xa502aae8": "getNextGenerationId()", "0xb5bfdd73": "addDSource(string,bytes1,uint256)", "0x28d3ad3f": "getPot(uint256)", "0x08933d11": "getJoinBlock(address)", "0x8383bfc8": "EscrowFoundry()", "0x2ca15122": "sign()", "0xf340fa01": "deposit(address)", "0x9ed93318": "create(address)", "0xa1c0539d": "scheduleCall(address,bytes4,bytes)", "0xced92670": "changeMultiplier(uint256)", "0xb2c652f3": "getMarkets(uint256[128])", "0x69b144eb": "testThrowsCreateNewRevisionNotOwner()", "0x16c72721": "forked()", "0x712ca0f8": "getOrder(string)", "0x0cf45ba5": "updateFirstDuel2(uint256)", "0x4173b181": "setWeiPrice(uint256)", "0x689b3e2d": "Moonraker(address,address)", "0x8691162a": "TlcCoin()", "0x432ced04": "reserve(bytes32)", "0x38178fbe": "addString(string,string)", "0x8f1327c0": "getRound(uint256)", "0xa9eed530": "reduceOrderQty(uint256,uint256)", "0x408938d0": "testUpdatePackageDb()", "0x56105a08": "DgxSwap()", "0xc43d0575": "scheduleCall(bytes4,uint256)", "0xdba21657": "askForEther(uint256)", "0xca3b5c91": "hasRelation(bytes,bytes,address)", "0xc71cbcf3": "recoverAccount(address,address)", "0xb010d94a": "canExitPool(address)", "0x0a16697a": "targetBlock()", "0xff1f7046": "requiresAuction(string)", "0x0b811cb6": "executeProposal(uint256,bytes32)", "0xbb8be064": "HardwareToken()", "0xe2b05077": "getSaleDate(bytes,uint256)", "0x1e9a6950": "redeem(address,uint256)", "0xd21b84ac": "createNewDAO(address)", "0xd644e356": "index(uint256,address,uint256,uint256)", "0xea27a881": "getMinimumEndowment(uint256,uint256,uint256,uint256)", "0x99a88ec4": "upgrade(address,address)", "0xc8e4acef": "playerByAddress(address)", "0x0b7abf77": "TOTAL_TOKENS()", "0xfb5d7376": "step4()", "0xc0aa18e7": "History()", "0xe2233ada": "smartDoor(address[])", "0xd6006e88": "send(address[],uint256[],uint256)", "0x95671958": "getFileListTail()", "0x16bac350": "overthrow(string)", "0x5cb18a6d": "fipsLegacyRegisterMulti(bytes20[],address,bytes)", "0x60116397": "Registrar(address,bytes32,uint256)", "0x60fe47b1": "set(uint256)", "0x5f8f0483": "buyBankerAgreementFromImporterBank()", "0x4c8cc20b": "toContentID(address,string,string,address,uint256)", "0x45ca25ed": "changeName(address,string)", "0xb21bce4c": "vote(bytes,bool)", "0x334dc700": "CanaryV7Testnet()", "0xc31d0031": "CrowdFundDAO(string,uint8,string)", "0xf3d91708": "isEligibleForUpgrade(address)", "0x0ee07836": "adjustDifficulty(uint256)", "0xf6232556": "Security_GetNumberOfAttemptsToConnectBankAccountToANewOwnerAddress()", "0xb2d37e95": "remove_order(uint32)", "0x691d58e7": "_applyRefund(uint256)", "0x1c2353e1": "isCertifier(address)", "0xcf158fe9": "scheduleTransaction(uint256,uint256,uint256)", "0x5d96ec65": "setAdministrator(address,string,bool)", "0x0651844e": "activateBalance(address)", "0x217311ac": "getWords(uint64)", "0xc127c247": "addMember(address,string)", "0x40c0bcb9": "checkBetNumber(uint8,address,bytes32,bytes32)", "0xb633620c": "getTimestamp(uint256)", "0x5b764811": "_jMul(uint256,uint256,uint256,uint256)", "0xfe029156": "swap(address,address,uint256,uint256)", "0x31db4b95": "doTriggerAuth()", "0x203c03fa": "Coinflip()", "0x209a5b8a": "moneySumAtSettlement(address,uint256,int256,uint256)", "0xf10ae2ab": "__dig_then_proxy(uint256,address,bytes)", "0xd532e481": "activateFrozenAccount(address)", "0xe9a9c1b4": "get_party1_balance()", "0x8fcc9cfb": "setMinDeposit(uint256)", "0xe5c7e509": "testThrowTransferDisableNotEnabled()", "0x4e077f2a": "addGasEther()", "0xb7c93330": "ResourcePoolTester()", "0x82661dc4": "splitDAO(uint256,address)", "0x0e554bd8": "scheduleCall(bytes,uint256,uint256,uint8)", "0x49041903": "getGame(uint64)", "0x0e1da6c3": "claimTimeout()", "0xc53ad76f": "Kardashian()", "0x8b7bcc86": "numWinners()", "0x1043dcdf": "LastIsMe(uint256,uint256)", "0x6cd22eaf": "updateAuthority(address,bool)", "0xb796a339": "addRegistryIntoOwnerIndex(address,address)", "0x308d6613": "getSignData(uint256,uint8)", "0xed88c68e": "donate()", "0xb719d1d0": "getRegInfo(address)", "0xac8d6030": "removeRequest(address)", "0x46f0975a": "signers()", "0x434cb64c": "startNextGeneration()", "0x6cb3d30a": "triggerTryAuth()", "0x3c067945": "fundBalance()", "0x26c7edaa": "flip4(bytes)", "0xf76f950e": "uint2str(uint256)", "0x860e9960": "BetPriceLimit()", "0xb0ecca8f": "LookAtLastTimePerZone(uint256)", "0xa35cfa22": "make_move(uint256,uint8,uint8,uint8,uint8)", "0x3f74fecb": "DSTrueFallbackTest()", "0xdd2ad311": "scheduleCall(bytes,uint256)", "0x0ae5e739": "grantAccess(address)", "0x7d5fec5a": "setOwner(uint8,uint8,address)", "0x6a4b6aa5": "untrustedChildWithdraw()", "0x332f93a9": "nextPayoutGoal()", "0xc5ae6e0e": "Kernal()", "0x75438e49": "fillGas()", "0x51404cbe": "forceDivestOfOneInvestor(address)", "0xeacfc0ae": "Authorized()", "0xe59d843a": "Replicator(bytes,uint256,uint256,address)", "0xf00e8651": "createRequest(address[2],address,uint256[11],uint256,bytes)", "0x02acdb44": "setAnyoneCanCall(address,bytes4,bool)", "0x2a24f46c": "auctionEnd()", "0x7ef1925b": "getShareRange(uint256,uint8)", "0x2fac1a54": "newOrder(bool,uint256,uint256,uint256,uint256)", "0x56b8c724": "transfer(address,uint256,string)", "0x33fd066d": "doBalanceFor(address)", "0xf29617da": "registrationDeposit(address)", "0x2b297f9e": "registerDao(address)", "0x79cce1c5": "getReleaseHashes(uint256,uint256)", "0xbed1b8b9": "convertToInt(string)", "0xef5daf01": "_dumpToCompany()", "0x23dc42e7": "query1(uint256,string,string)", "0xa53b1c1e": "setInt256(int256)", "0xb8cf14e7": "updateStatusPlayer()", "0x61aa8d93": "processFee()", "0x10f41715": "updateMintingData(uint256,uint256)", "0x048e2e94": "getAccountSize(address,uint256)", "0x7c47965e": "isInCurrentGeneration()", "0x420a8ac8": "NanoPyramid()", "0xe56556a9": "getPlayerID(address)", "0x5cd2f4d3": "approve(address,bytes32)", "0x8da4d776": "newCommune(address)", "0x4d30b6be": "balanceOf(address,bytes32)", "0x4a606c53": "_db()", "0x4956eaf0": "deploy(address,uint256)", "0xf1fe42b8": "TransactionRequest(address[3],address,uint256[11],uint256,bytes)", "0x63e38ff3": "id_for_nym(uint256)", "0x0e757a2e": "testSetAndGet()", "0x3facd57c": "registerBill(uint256,address,address,uint256,uint256,uint256)", "0xe548cf13": "betOnColumn(bool,bool,bool)", "0x2f1e4968": "makeNewProposal(string,uint256)", "0x0b467b9b": "revoke(bytes)", "0x74bfb965": "addNewProxy(address)", "0x02de2cf3": "isLatestPreReleaseTree(bytes32,bytes32)", "0xfc1f7652": "_isBoardMember(address)", "0xefef39a1": "purchase(uint256)", "0x3ae9b510": "getLatestMajorTree(bytes32)", "0xc24924d6": "setQueryFee(uint256)", "0x839930ba": "getMinimumBet()", "0x8f5e9ca7": "acceptTOS(address,bool)", "0xd1100691": "BookCafe()", "0x839849c0": "changeBaseMultiplier(uint256)", "0x758971e8": "ownerTakeProfit(bool)", "0x2b785960": "testBitAndSuccess()", "0xd96a094a": "buy(uint256)", "0x379607f5": "claim(uint256)", "0x88e072b2": "checkTransfer(address,uint256)", "0x05fefda7": "setPrices(uint256,uint256)", "0xfc63d4fb": "order(bool,uint32,uint128)", "0x5718b994": "checkEvent(address,bytes,bytes,uint256)", "0x0c0662a8": "getLastWithdrawal()", "0xeb947f19": "ExampleResourcePool()", "0xb51c4f96": "getCodeSize(address)", "0x702fc7da": "ReviewModel()", "0xc6cb7a96": "orderMatchTest(uint256,uint256,int256,uint256,uint256,address,address,uint256,int256)", "0xb7760c8f": "transfer(uint256,address)", "0x32b12eac": "setFallback(address)", "0x0a4d564c": "TieUpLooseEnds()", "0xc3ad5ecb": "getTweet(uint256)", "0xe86afde0": "description(uint64)", "0xd0549602": "scheduleTransaction(address,uint256,uint256,uint256)", "0xbf2e694f": "getPreviousRequest(address,address)", "0x2525f5c1": "cancelBid(address,bytes32)", "0x19f02ceb": "set(address,address,uint256)", "0xf00acc47": "prepareRoll(uint256,uint256)", "0x29d28aad": "Broker(address)", "0x041d0c0b": "MyTokenLoad(uint256,string,uint8,string,address)", "0xd81ab0c1": "invoke(uint256,address,address,bytes)", "0xab09ee80": "respond(uint256,uint256,uint256,uint256)", "0xd985f122": "RelayToolsTest()", "0xbe0638e4": "WealthShare()", "0x5263ba87": "getLatestPatchTree(bytes32,uint32,uint32)", "0xb7bae9b7": "exists(bytes,bytes)", "0x0b80f8d3": "invmod(uint256,uint256)", "0xbb4d7cd1": "tag(uint256,string)", "0xadf54e0c": "betOnLowHigh(bool,bool)", "0xed54746e": "lastAuction()", "0xf158458c": "getMinimumEndowment(uint256,uint256)", "0x5fcc2edb": "IndividualityTokenRoot(address)", "0x7cc48875": "Slots()", "0x2885b593": "extractMasterKeyIndexLength()", "0x8940aebe": "publicKey(uint256)", "0x0aece23c": "getFeeAmount(int256)", "0x72c3015c": "mint(int256,address,string)", "0xd6a619e3": "transferIfPuritanical(address)", "0xe30443bc": "setBalance(address,uint256)", "0x1277e24f": "payOneTimeFee()", "0xb958a5e1": "getPhoneByAddress(address)", "0x4e71d92d": "claim()", "0x3e0d4f4a": "ApproveContractorProposal()", "0x18160ddd": "totalSupply()", "0x150ad2a8": "owner_transfer_ownership(address)", "0xa2b5591c": "oraclize_query(uint256,string,string[],uint256)", "0x8d227fc0": "getPeriodInfo()", "0x1c0b6367": "processTransaction(bytes,uint256)", "0xf245b9e4": "DVIP(address)", "0x392327b5": "owner_set_fraction(uint256)", "0xadaccd74": "getNickname(address)", "0x2e0ef395": "voteOnNewEntryFees_only_VIP(uint8)", "0x89c19ddb": "concat(string,string)", "0xcef8d343": "buyShare(uint256,bool)", "0xd224118f": "PrepareDraw()", "0x4269d8ef": "_safeSend(address,uint256)", "0xda1441cd": "KudosBank(uint256)", "0x7ccfd45a": "removeSubUser(address)", "0xcc70bb1a": "publish(string,string,string,address)", "0x708f29a6": "getTotalPayments()", "0x05459f42": "WeeklyLotteryB(address)", "0x452d44dc": "checkBothNotNull()", "0x659fb968": "getOracleOutcomes(bytes32[],address[])", "0x3570c2ee": "PosRewards()", "0xbca86986": "testSetup()", "0xff49b26e": "createEvent(uint256,uint256,uint8,uint32,address,uint256,uint8)", "0x541d920c": "commit(bytes,string)", "0xa6a20ff6": "DSEasyMultisig(uint256,uint256,uint256,uint256)", "0x0f5381f1": "testUserCanIncreaseVersionNumber()", "0xf8f46b5f": "getCurrentMinerAddress()", "0xfcfff16f": "open()", "0x5a9b0b89": "getInfo()", "0xb8017221": "get_party2_balance()", "0x514dcfe3": "seller_accept()", "0x2004dff6": "Basics()", "0x0b6d8d52": "createDAO(address,uint256,uint256)", "0xf18d20be": "adminWithdraw()", "0x8f9df278": "newEntry(int256,bool,uint256,int256,string,bytes32,address,uint256[])", "0x75949c13": "sendHalf(address)", "0x64ac2c4a": "WavesPresale()", "0x8946d33f": "SplitterEthToEtc()", "0x11400d8e": "priv_fastGetBlockHash__(int256,int256)", "0x7266f4a4": "X3()", "0xb189ad2a": "testErrorUnauthorizedAfterTransfer()", "0x31c2bd0b": "propose(address,bytes,uint256)", "0x100c8ada": "setCAmodulus(bytes)", "0x296ed88f": "testFailControllerInsufficientFundsTransferFrom()", "0xd5dbb1ad": "solveBet(address,uint8,bool,uint8,bytes32,bytes32)", "0x8a9ffb90": "transfer(string,string,bool)", "0x968908a3": "createMarketMaker(uint256,uint16,uint256)", "0x7b02b2c9": "sendMsg(address,string)", "0xa33dd801": "setTreasuryBalance(uint256)", "0x2f553d31": "isCreated(bytes32)", "0xf712d7ff": "testFailControllerTransferFromWithoutApproval()", "0xe51ff1fc": "iterateOverThings()", "0x60fd902c": "gnosisToken()", "0x2ef875fb": "div10(uint256,uint8)", "0x640f244b": "findSuitableGen()", "0x16cb9a01": "assertFalse(bool,bytes)", "0xe671f510": "onEtherandomExec(bytes32,bytes32,uint256)", "0x758b5172": "setPlayersPerRound(uint256)", "0x6423db34": "Reset()", "0x21958a50": "AddressSeries(address)", "0xfb87d5ea": "TransactionRequest(address[4],address,uint256[11],uint256,bytes)", "0xfb279ef3": "tip(uint256,address,uint256)", "0x338cdca1": "request()", "0x4e7ad367": "fireEventLog1Anonym()", "0xbd9335c0": "scheduleHangouts()", "0x4cb85356": "BranchSender(uint256,bytes32)", "0x1d7e1f68": "getContentRank(address,uint256)", "0x1a1df394": "Play(bool)", "0x468129a5": "setUnit(uint256,uint256,uint256)", "0xecb70fb7": "hasEnded()", "0x2d49ffcd": "getLocked()", "0x2e06c756": "post(string,string,string,uint256,uint256,address)", "0x73f93a48": "getAccountContentTip(address,uint256)", "0xf6a3d24e": "exists(address)", "0x5fbddcf3": "isLivingMonarch()", "0x6d568c43": "weiToCents(uint256)", "0xacf4280c": "buildDSApprovalDB()", "0xf3541901": "execute(address,bytes,uint256,uint256)", "0x88eb7af7": "_isHuman()", "0x48a490fb": "transferFromTreasury(address,uint256)", "0x5e03d393": "setAccountFrozenStatus(address,bool)", "0xfc687311": "betOn(int8)", "0x5bbfe9b6": "_myGroupHelper()", "0x5629c6d9": "doExecution(address)", "0xe3a9b508": "EnableDisableTokenProxy()", "0x9229c504": "new_mainPlayer(address)", "0x6f6c0244": "generateShortLink()", "0x33613cbe": "getBondBalance(address)", "0x4229616d": "collectPercentOfFees(uint256)", "0x4ed3885e": "set(string)", "0x043bb5e7": "getIdentities(address[])", "0xad2fea7c": "removeMinter(int256,address)", "0x0b7e9c44": "payout(address)", "0x17f5de95": "MAX_TOKENS_SOLD()", "0x50ea1932": "lookupISO3116_1_alpha_2(bytes)", "0x96f7807a": "getDuel2(uint256)", "0xa97ffd5e": "safeToSell(uint256)", "0x2f4ee5d4": "registerThrone(bytes,uint256,address,uint256,uint256)", "0x4c0bcfe5": "getTransferableBalance(address)", "0x0d17bc2e": "_disallow()", "0x0ca7395f": "returnFund(address,uint256)", "0x69fe0e2d": "setFee(uint256)", "0xfaf27bca": "greeter(string)", "0x0c7de59d": "edit(address,bytes,bool)", "0x16e27349": "getFeeRecipient(int256,int256)", "0x37751b35": "doTransfer(address,address,uint256)", "0x67fc1c6a": "validateProposedMonarchName(string)", "0xf59f99ee": "createNextGeneration()", "0x6be505f5": "selectWinner(bytes32)", "0xf6bd5893": "getGas(uint256)", "0x35b09a6e": "someFunction()", "0xb3aaa277": "validate(address[4],address,uint256[11],uint256,bytes,uint256)", "0x4f052648": "XaurumDataContract()", "0x117b4705": "retract(bytes32)", "0x2145e36c": "testBitSetFailIndexOOB()", "0x3d750b28": "found()", "0x1334a5e2": "eventCallback(uint8,address,address,uint256)", "0x3c2c21a0": "scheduleCall(address,uint256,bytes4)", "0x82996d9f": "rent()", "0xaf640d0f": "id()", "0xdaf22f4d": "identify(bytes32)", "0xfe4667e9": "getMaxLossAfterTrade(address,uint256,uint256,int256,int256)", "0xfc108f70": "GamblerPerAddress(address)", "0x89f4ed7a": "getLastTag(uint256)", "0xfcc11241": "addOrder(uint256,uint256,uint256,uint256,uint256,uint8)", "0x43243797": "fundsOf(address)", "0x892c0214": "NumberOfCurrentBlockMiners()", "0xb5a6c525": "extractFrozenAccountLength()", "0x1acb2719": "getNextRequest(address,address)", "0xa89a4f09": "creatorBalanceChecker()", "0x1e83409a": "claim(address)", "0x5e1d7ae4": "changeFeeRebate(uint256)", "0xb7482509": "deposit(address,string)", "0xfb47a067": "_getRevisionBlockNumber(bytes20,uint256)", "0x5dcdddd1": "testSafeToAddFix()", "0x9aa26f06": "registerBytes32(address,bytes)", "0xd085e66e": "GetPart(bytes32,uint256)", "0x2cd78450": "activateExportFeeChargeRecord(address)", "0x35d129f6": "untag(string)", "0x1a7a98e2": "getDomain(uint256)", "0x877653f0": "_storeBalanceRecord(address)", "0x446fbcd1": "CredSign()", "0xfae8f9a2": "setInitialParent(int256,int256,int256,int256,int256,int256)", "0xc1b056b0": "getNodeLeftChild(bytes)", "0x71f297cc": "XaurumToken(address)", "0xe3ffc9a3": "sendEtherToOwner()", "0xeccf1b29": "CrystalDoubler()", "0x57f4d5ec": "processDividends(address,uint256)", "0x75c589a0": "getMinimumCallCost()", "0x66772438": "computeResponse(uint16)", "0x7fefde53": "WillRegistry()", "0x8f4fb958": "calculateRandomNumberByBlockhash(uint256,address)", "0xed498fa8": "userTokens(address)", "0x5601eaea": "execute(uint256,uint256)", "0x8dd8596c": "sendDonation()", "0x15a0df43": "testThrowCreateNewRevisionNotOwner()", "0x0382c254": "CheckHash(uint8,uint8,uint8,uint8,bytes32)", "0x157f8f51": "feePaid(int256,int256,int256,int256)", "0xf00aac7f": "ArrayRR()", "0x7b7d7225": "_approve(address,uint256)", "0x54ed7b6e": "addHash(bytes)", "0x235c002d": "transferOther(address,address,uint256)", "0x7057c20d": "CFD(address)", "0xd5563f31": "createAuction(uint256)", "0x46c3166f": "testThrowRetractLatestRevisionNotOwner()", "0x4420e486": "register(address)", "0x9a969768": "distributeProfits(uint256)", "0x464f37c9": "trustedChildRefund()", "0x5d495aea": "pickWinner()", "0xdf55b41a": "owner(string)", "0x10e6e06c": "vote(bool,uint256)", "0xe7faecec": "testFailInsufficientFundsTransfers()", "0xea98e540": "proxyTransferFromToICAPWithReference(address,bytes32,uint256,string)", "0xfff78f9c": "doThrow()", "0x9bb01b5f": "ElcoinDb(address)", "0xdc6dd152": "playerRollDice(uint256)", "0x5d0be9de": "softWithdrawRevenueFor(address)", "0xcd591822": "CanaryV7Fast()", "0x36e6b92e": "taskProcessedWithCosting(uint256,uint256)", "0x7bb6a4c6": "uno(uint256)", "0x03427656": "getDefaultSoftResolutionBlocks()", "0xc1fd4339": "createMarket(bytes32,uint256,uint256,address)", "0xeb95b7d5": "Bounty(address,address)", "0x4dd49ab4": "get(bytes,uint256)", "0xfa6d373c": "LeaderHash()", "0x8c8d98a0": "toTimestamp(uint16,uint8,uint8)", "0x9a79f4a8": "testFailHeaderInsufficientFee()", "0xdd90c403": "getAccountFeed(address,uint256,uint256)", "0x58e59c32": "get_entry(uint256,uint256,uint256)", "0xfd747c0b": "rsaVerify(bytes,bytes,uint256,bytes)", "0x0f4cf692": "numMessages()", "0x18433bb7": "DrawPrepare()", "0x1dea0c57": "getRealBet(uint256)", "0x7d60e343": "getFileListSize()", "0xd24ddcfe": "buyKissBTC()", "0xa055fe64": "_projectCommitNew(address)", "0x5f17114e": "TimeDeposit()", "0x85fe0448": "testThrowRestartNotUpdatable()", "0x901717d1": "one()", "0x528fd7b0": "manualPayExpiredDuel()", "0x85952454": "newOwner(address)", "0xf34c7010": "commitSecurity(address,uint256,uint256)", "0x3bf2313d": "__transferToICAPWithReference(bytes32,uint256,string)", "0x67b830ad": "fillOrder(uint256)", "0x73fac6f0": "confirmReceived()", "0xf1b3f968": "getRaceEndBlock()", "0xf99fc046": "dEthereumlotteryNet()", "0xb409da05": "logDoubleIndex(bytes,bytes,bytes,uint256)", "0x9e920587": "testOwnedAuth()", "0x8e7cb6e1": "getIndex(uint256)", "0xe2f8a017": "payInstallment(uint256)", "0xac3e6b2f": "testSetNotRetractable()", "0x8fbc3ecd": "BUFFER()", "0x4b729aff": "buyNumber(uint256)", "0x166c4b85": "len(bytes32)", "0x6299f8cf": "stop(uint256)", "0xd767aee0": "bbb()", "0x29090202": "Resolver(address)", "0xcc2c2bcf": "MotionFactory(string,string,string)", "0xfd260dfc": "getCertificationDbStatus(address)", "0x30aceb89": "validateRequestParams(address[3],address,uint256[11],uint256,bytes,uint256)", "0xd11f13df": "numberOfParticipantsWaitingForPayout()", "0xd05c78da": "safeMul(uint256,uint256)", "0x69953501": "setUtils(address)", "0xff7f5f2a": "EtherizationUtils2()", "0xde4b3262": "setBasePrice(uint256)", "0x6cf9cc58": "registerResource(bytes,uint256,bytes,string)", "0x7ac37d58": "ownerTransferEther(address,uint256)", "0x0121b93f": "vote(uint256)", "0x07b6f631": "testTestHarnessAuth()", "0x869b3f6a": "testThrowsRetractNotOwner()", "0x18253234": "ticketsAvailable()", "0x5581004d": "createThrone(bytes,uint256,uint256,uint256,uint256)", "0x7102c138": "Standard_Token(uint256)", "0xce5566c5": "cash(uint256,uint256)", "0x16a25cbd": "ttl(bytes32)", "0x0c9fcec9": "setApproval(address,address,uint256)", "0xe6d95eb8": "DSAuthorized()", "0x34c0d654": "setPackageDb(address)", "0x0ee79fb3": "closeReferendums()", "0xe2cdd42a": "vote(uint256,address,bool)", "0xd3f297d6": "claimLiquidityReward()", "0xf37b437b": "scheduleCall(address,bytes,uint256,uint256,uint8,uint256,uint256)", "0x2090cf8b": "consultBalance(address)", "0xc9296d14": "scheduleTransaction(address,uint256,uint256,uint256,bytes)", "0x7993e5c2": "Devcon2TokenForTesting()", "0x268bb78e": "propose(address,bytes,uint256,uint256)", "0x2b16b56a": "setIndex(uint256,uint256)", "0x6d15f208": "reject(string,uint256,uint16,address,uint256)", "0xc4ff3614": "Wallet(address[],uint256,uint256)", "0xb47d89ad": "Details()", "0x0ae08793": "confirmAndCheck(bytes32)", "0x061e494f": "getBet(uint256)", "0x314e99a2": "abdicate()", "0xe487eb58": "getOwner(bytes20)", "0x7ee65635": "LookAtDepositsToPlay()", "0x9e9d3aa4": "FirstBloodToken(address,address,uint256,uint256)", "0x4dfd1b02": "setUint8(int8,uint8)", "0x82fbdc9c": "register(bytes)", "0xa8b60b93": "ackMsg(uint256,string)", "0x081e806d": "PayOut(uint256)", "0x8bab8791": "testPkgUpdate()", "0xc262df45": "isKnownRequest(address,address)", "0x4123cb6b": "m_numOwners()", "0x62be3172": "Message(address,address,address,string)", "0x0d368fee": "deverify(address)", "0x5f1231ea": "getMemberInfo(address)", "0xa07daa65": "newRequest(uint256)", "0xa4406bcd": "placeSellOrder(uint256,uint256)", "0x5b7d47a9": "betOnColor(bool,bool)", "0x9c6034a7": "sendIfNotForked()", "0x26a4861c": "CROWDFUNDING_PERIOD()", "0xbaac5300": "createTokenProxy(address)", "0xfc72c1ef": "ERC20Base(uint256)", "0x316b08a0": "scheduleTransaction(address,bytes,uint256[7],uint256)", "0x0b590c6b": "SingularDTVToken()", "0x750e443a": "voteAgainst(uint256)", "0xfc7b9c18": "totalDebt()", "0x7ff9b596": "tokenPrice()", "0xd67cbec9": "release(uint32,uint32,uint32,bytes20)", "0x553cc48d": "Player(string)", "0x579cdf17": "getAdminName(address)", "0x7e1c4205": "query2(uint256,string,string,string,uint256)", "0x54107401": "declareLove(string,string)", "0xea4ba8eb": "getOutcome(bytes)", "0x9b5adea2": "setMinter()", "0x185061da": "undoIt()", "0x90c3a370": "AuctionMaster()", "0xbd02e4f6": "calcRandomNumberAndGetPreliminaryGameResult(uint256,uint64)", "0xbc126ba1": "totalCents()", "0xa3747fef": "register(bytes,bytes)", "0x805210b7": "AmIPlayer2()", "0x4e05ded6": "ClassicCheck()", "0xec2ac54e": "deposit(address,uint256,bytes32,uint256)", "0x49c15bd9": "Purchase()", "0x87bb7ae0": "getTicketPrice()", "0xf2f03877": "commit(uint256,bytes32)", "0x167d3e9c": "SetOwner(address)", "0x5c634241": "CanaryV6()", "0xba15e52e": "getInfo(bytes20)", "0x06c1df7b": "checkBetColumn(uint8)", "0xf7bc39bf": "owns(address)", "0x27b752b8": "sha3HexAddress(address)", "0x5ac801fe": "setName(bytes32)", "0x1ae460e5": "isInPool()", "0x85c7a953": "WithdrawFullBalanceFromBankAccount()", "0x755b5b75": "setNumUnits(uint256,uint256)", "0xaefc8c72": "unsealBid(bytes32,address,uint256,bytes32)", "0xfab43cb1": "getPongAddress()", "0x9e997121": "getConfigAddress(bytes)", "0xda2b7416": "testBitsAndFailIndexOOB()", "0xd0e30db0": "deposit()", "0x4a0d89ba": "getSwap(uint256)", "0x63a9c3d7": "verify(address)", "0x337b1cf9": "setIpfsHash(bytes)", "0xbaf00f76": "removeAllSubUsers()", "0x1b370abb": "getPreviousNode(bytes)", "0x741e2345": "registerMany(address,uint256,int256,uint256,bytes20,address,bytes)", "0xb3760c80": "orderMatch(uint256,uint256,uint256,int256,uint256,uint256,address,uint8,bytes,bytes,int256)", "0x73ffd969": "setMap(uint256,uint256,uint256)", "0x50b44712": "tickets(uint256)", "0x6a9d2afd": "playToWinTest(uint256)", "0x644998ae": "maintain(int256,uint256,uint256)", "0x2203ab56": "ABI(bytes32,uint256)", "0x9c67f06f": "registryStarted()", "0x93423e9c": "getAccountBalance(address)", "0x524e4e61": "testDistribution()", "0xa17042cc": "getMsgValue()", "0x4f9d719e": "testEvent()", "0xcbcaacab": "checkTransferWithReference(address,uint256,string)", "0x1bcf5758": "getOccupies(uint8)", "0x1d4b0796": "updateTxStats()", "0xd173707d": "hasPhysicalAddress(address)", "0xa54a2b8b": "testBlockHashFetch()", "0xc51bf934": "CEILING()", "0x0e54b872": "registerUser(string,address)", "0xba51a6df": "changeRequirement(uint256)", "0x6bd92f7c": "activateAllowanceRecord(address,address)", "0x90daaf67": "getMinimalDeposit()", "0x85d5c971": "logTransfer(address,address,bytes32)", "0x8b9e5385": "MeterSlock(uint256,uint256,address)", "0x7bcd7fad": "getRecordAtIndex(uint256)", "0x8e035ac1": "BetOnHashV82()", "0x5dbe47e8": "contains(address)", "0x21bb79fe": "luckyDogInfo()", "0xdd467064": "lock(uint256)", "0xa4beffa7": "increaseInvestment()", "0x8400c307": "isRecipientAllowed(address)", "0x0965bf7d": "processProposals()", "0x4b5dc8cb": "roundMoneyDown3SFExt(uint256)", "0x777feff5": "getCertificationDbAtIndex(uint256)", "0x9462eae5": "ChangeContractor(address)", "0x4c6d1d9e": "checkOutTag(string)", "0x09a399a7": "personAdd(string,int256,int256,string)", "0x31380c89": "TokenSale()", "0xd0bff051": "testSetBalanceDb()", "0x4c738909": "getMyBalance()", "0xb2310cc5": "payRequstedSum(uint256,uint256)", "0xda3c300d": "currentFee()", "0x6ed7c013": "move_monsters()", "0x4f073130": "takeOrder(bool,uint256,uint256)", "0x6860fd58": "Fees(uint256)", "0x214c9d50": "WritedrawStatus()", "0xf314bf46": "setReleaseDb(address)", "0x561a4873": "buyAd(string,string,string,uint256,uint8,address)", "0xf249cf19": "get_all_challenges()", "0xbbed7177": "getContentTimestamp(uint256)", "0xc864e760": "recordCommissionEarned(uint256)", "0x1896f70a": "setResolver(bytes32,address)", "0xfd35e71b": "entryPayoutDue(uint256)", "0x5a58cd4c": "deleteContract()", "0xb29b5366": "setRentable(bool)", "0xad5c613d": "purchase(bytes)", "0x6949a058": "sendOwnerEther()", "0xc03e382f": "calculateShare()", "0xf5bade66": "setDeposit(uint256)", "0x384e5018": "etherandomCallbackAddress()", "0xf06186c7": "testReality()", "0x677342ce": "sqrt(uint256)", "0x10e89b22": "remove_deal(uint32)", "0xf2b445ad": "rowround(uint256,uint256)", "0xd7ed7453": "redeemWinnings(uint256)", "0x92b4bb50": "rps()", "0x089327de": "MyToken()", "0x87ebd76c": "initContract(string,string,uint256,uint256)", "0xdbc45228": "newProposal(address,uint256,bytes,bytes)", "0x6b1feeeb": "get_my_sig()", "0x6837ff1e": "newContract(address)", "0x9f181b5e": "tokenCount()", "0x92ba4ba6": "GridMember(string,uint256,bool,address,address)", "0x45755dd6": "returnFunds(uint256)", "0xb4b9d1f1": "lookup(uint256,uint256)", "0x98024f18": "testThrowsTransferDisableNotEnabled()", "0x9e7b8d61": "giveRightToVote(address)", "0x8112821f": "EthVentures()", "0xe65d6b49": "getCommission()", "0x068c966b": "DrawDetails(uint256)", "0x9bb5239a": "CheckPrize(address,uint256)", "0xff08d2b0": "PayMiners()", "0x9be1fcee": "BankOwner_DisableConnectBankAccountToNewOwnerAddress()", "0x5f972df8": "_jDiv(uint256,uint256,uint256,uint256)", "0xfe8b6642": "setEnforceRevisions(bytes32)", "0xe4cc1161": "seedWithGasLimit(uint256)", "0x5fd4b08a": "getName(address)", "0xaa51793c": "isLosingBet(uint256)", "0x31757f2e": "collisionCount()", "0xe1f5ebc5": "_projectAddNew(address,uint256)", "0x64228857": "getRevisionCount(bytes32)", "0x5ca3400c": "WithBeneficiary(address)", "0x39f4debc": "fillOrderAuto()", "0xcc2c5453": "add_sword(uint16)", "0x0a19b14a": "trade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256)", "0x4d207d9a": "identify(address)", "0x3e83fe36": "getMyShares()", "0x8bb0faee": "setRef(string,string)", "0x38bbfa50": "__callback(bytes32,string,bytes)", "0xcee6f93c": "getResultOfLastFlip()", "0xbbba3333": "safer_ecrecover(bytes32,uint8,bytes32,bytes32)", "0x8e19899e": "withdraw(bytes32)", "0xd8389dc5": "hash(bytes32)", "0x8a4068dd": "transfer()", "0xea9e107a": "acceptRegistrarTransfer(bytes32,address,uint256)", "0x8f4ffcb1": "receiveApproval(address,uint256,address,bytes)", "0xf67abd87": "entryDetails(uint256)", "0x67acd805": "lowerMinWager(uint256)", "0xec035393": "_getAllRevisionBlockNumbers(bytes20)", "0xbd858288": "orderMatch(uint256,uint256,int256,uint256,uint256,address,uint8,bytes32,bytes32,int256)", "0x112c7075": "ManualDeposit()", "0xd81a91e9": "get_party2()", "0xc52bd836": "setDappOwner(bytes32,address)", "0xf84f420b": "getRandomNumber(address,uint256)", "0xcfe9a7b8": "getPackageName(uint256)", "0xe97dcb62": "enter()", "0x48db5f89": "player()", "0x6bdbf8e6": "concat()", "0x3c959aca": "CheckTickets()", "0x3aa5f4f7": "changeTokenSettings(uint16,uint256,uint256)", "0xac20902e": "NormalizeMoney()", "0x2fac1d36": "isReadyFor(address)", "0xdcaa5620": "findNextWeekday(uint256,bytes)", "0xf9909915": "bulkStoreHeader(bytes,int256,bytes,int256)", "0xcd2cdd5b": "claimOwnershi()", "0xcfae3217": "greet()", "0xf5c8d71b": "forceMove(address,address,uint256)", "0x9718b524": "newTreasury(address)", "0xd0679d34": "send(address,uint256)", "0x1301ee02": "transferringETC(address)", "0x60eb2826": "Badge()", "0x0d0c2008": "TwoAndAHalfPonzi()", "0x17e1bfb7": "addInstitution(address,string)", "0x06394c9b": "changeOperator(address)", "0x80c951bf": "currentClaimPriceInFinney()", "0xd063f55f": "toLittleEndian(uint64)", "0x53f818d6": "checkBetValue()", "0x9205fbc2": "testAuthorityAuth()", "0x3e4c0c82": "player_1(uint256)", "0xe571c35e": "ReverseRegistrar(address,bytes32)", "0x24804cef": "Deed()", "0x622e88cb": "testBitsXorSuccess()", "0xdfca2f53": "LookAtPrizes()", "0xafa293d4": "getSource()", "0x755f99c2": "AddNewSmallContract(address)", "0x7137ed47": "setProxyContract(address)", "0x835b42fc": "testThrowUpdateLatestRevisionNotUpdatable()", "0xdd34e129": "PriceTest()", "0xedb27f4e": "switchWizard(address)", "0x1c5d9faa": "setNickname(string)", "0x4746cef8": "_confirmAndCheck(address,bytes32)", "0x189c94ae": "testFallbackStaticSig()", "0x0cb749b6": "FutureBlockCall(address,uint256,uint8,address,bytes,bytes,uint256,uint256,uint16,uint256,uint256)", "0x2b25a7e4": "giveKudos(address,uint256)", "0x294f3d4d": "setUpLimit(uint256)", "0x2cce81aa": "getBlockHash(int256)", "0x4cd11943": "NewManualInvestor(address,uint256)", "0x7eaef50c": "over()", "0x8ac4e1d8": "TemperatureOracle()", "0xf108a7d2": "withdraw(uint256,address,string)", "0x00a676f9": "getExists(bytes32)", "0xb8d4efb5": "validate_percent(uint8)", "0xc7489441": "closeMarketMaker(uint256)", "0x3def449b": "FipsNotary()", "0x5687f2b8": "emitApproval(address,address,uint256)", "0xa9f8ec6c": "AlarmClockTipFaucet()", "0xd8e5c048": "scheduleCall(address,uint256,uint256)", "0x135217e7": "requires_depth()", "0x0aa46c12": "testClearBitFailIndexOOB()", "0x77d32e94": "ecrecovery(bytes32,bytes)", "0xace523c4": "createReferendum(string,string,uint256,uint256)", "0x5ca8bc52": "returnIt()", "0xdb318833": "_ecAdd(uint256,uint256,uint256,uint256,uint256,uint256)", "0x623195b0": "setABI(bytes32,uint256,bytes)", "0xd7bb99ba": "contribute()", "0x2880ebe7": "underdogPayoutMarkup()", "0x4ce01d86": "totalBetValue()", "0x837a7ba5": "testThrowTransferDisabled()", "0x386fcda8": "testCreateCostToken()", "0x0e850239": "scheduleCall(bytes4,bytes)", "0x163aba3c": "getQueryFee()", "0x9941e3d0": "setCallAddress(address)", "0x23637e60": "votePrice(uint256,bool)", "0xde78e78a": "tokenLaunched()", "0xe3579ea5": "publish(string,string,address,uint256)", "0x59a547b0": "recordCommission(uint256)", "0x1aa86370": "updateXIPFSPublicKey(string)", "0x97fcb54e": "transfer_eth(address,uint256)", "0x05d2f92a": "check_depth(address,uint256)", "0xdfcbb794": "TrustFund(address,uint256,address)", "0xb7dd1d17": "getAllRevisionBlockNumbers(bytes32)", "0x75862df4": "TokenWithEStop(address)", "0xd22057a9": "register(bytes32,address)", "0x29d017b5": "TestWithConstructor(address,uint256[])", "0xd216d55d": "etherandomExec(bytes32,bytes32,uint256)", "0xfba06849": "fipsPublishDataMulti(bytes20[],bytes)", "0xa37fd390": "setHomeAdv(uint256,string)", "0xcf2e3efc": "GetBankAccountBalance()", "0x423e7e79": "_dispatchEarnings()", "0x74087040": "testBitsNotEqualSuccess()", "0x61d585da": "state(bytes32)", "0xcfb3a493": "getMyBounty(uint256)", "0x5afeb106": "Sqrt()", "0xf9e84395": "unexempt(address)", "0x5669c94f": "issueToken(address,string)", "0x19b05f49": "accept(uint256)", "0x3ae01f84": "USDOracle()", "0x8c172fa2": "getEvent(bytes32)", "0x4671e65e": "proposeEmergencyWithdrawal(address)", "0xc27d7721": "create(uint256[101][])", "0x5c52e51e": "processPayout()", "0xf7a0fa0a": "getShareDistribution(bytes)", "0x31a3a506": "closeFunding()", "0x465e759b": "testRestart()", "0xb60d4288": "fund()", "0x52200a13": "getNumHolders(uint256)", "0xf2c298be": "register(string)", "0x7bc25372": "UserCheckBalance(address)", "0x104d5fdd": "getPriceProxy()", "0x447cd682": "scheduleTransaction(address,uint256)", "0xa045fdff": "scheduleCall(address,bytes)", "0x4757f1d2": "redeemAllOutcomes(uint256,uint256)", "0x5e855f14": "Dice(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", "0x5d3c1d4c": "_getRequest(uint256)", "0x416c8701": "beyond()", "0x63aea3e0": "PlayerInfo(uint256)", "0xa163a624": "Test()", "0xedede601": "testBalance()", "0x13651124": "WithdrawAmountFromBankAccount(uint256)", "0x893d20e8": "getOwner()", "0x90b5561d": "insert(uint256)", "0xf9983a12": "GetMyInvestmentBalance()", "0xb71c47a2": "surrender()", "0xf2a75fe4": "empty()", "0x804ba97a": "tryGet(bytes)", "0x6506b623": "rotateBitsLeft(bytes,uint256)", "0x3ef8ec78": "announce_numbers(uint8,uint8,uint8,uint8,uint32,bytes32)", "0x73abecbb": "kill1()", "0xd5171523": "euroteambet()", "0x8e52cb51": "getRecordKey(bytes,bytes,bytes)", "0x7adbf973": "setOracle(address)", "0x4aa16737": "enter(uint8)", "0xf0cb556c": "updateLatestRevision(bytes32,bytes)", "0xbc8fbbf8": "nuke()", "0xc8e55708": "oraclize_query(string,string[1])", "0x7332b520": "getRewardsCount(uint256)", "0xf7c2b38c": "seconds_left()", "0xba344743": "_rawTransfer(address,address,uint256)", "0xcab5c0f1": "_incrementState()", "0xe044c2de": "newLoan(bytes,address,uint256,uint256,uint256,uint256,uint256,uint256)", "0x76abc03b": "getShareDistribution(uint256)", "0xf0da84f8": "getTransferable(bytes32)", "0xcde99727": "calculateROI()", "0x155dd5ee": "withdrawFunds(uint256)", "0x8b543b80": "maximumCredit(address)", "0x340ddda6": "MeatConversionCalculator(uint256,uint256)", "0x524f3889": "getPrice(string)", "0x84054d3d": "cashout()", "0x856f3080": "WhatWasMyHash(bytes32)", "0x0386a016": "closeProposal(uint256)", "0xcebce72d": "token(uint64)", "0x7f480f9d": "processDividends(address)", "0x11d12402": "testEasyPropose()", "0x2f695053": "getCertifierAtIndex(uint256)", "0xd9fcb31f": "comm_channel()", "0x141c4e60": "challenge(uint256,address)", "0x4ff13571": "x2()", "0xa01bc729": "monster_attack(uint256)", "0x2fe9541f": "addIssueBounty(string,uint256)", "0x5503a659": "smallponzi()", "0xdfc765dc": "getMatchers_by_index(uint256)", "0x0b7623ba": "abs(int8)", "0xcde0a4f8": "setRegulator(address)", "0xf95b5a58": "getInitialAnswer(uint256)", "0x66b42dcb": "register(address,string,uint256,string)", "0x9f2ce678": "vote(bytes32,bool)", "0xb3559460": "getGenerationSize(uint256)", "0x5ddae283": "transferRegistrars(bytes32)", "0x59dc735c": "getClient()", "0xc258ff74": "List()", "0x4fb4bcec": "step5()", "0xed684cc6": "trigger(uint256)", "0x09405164": "getOpenCandidates()", "0x5c5d625e": "getProof()", "0x9f5f7c7f": "tokenSplit(address,address,address,uint256)", "0x0e38901a": "unvault(uint256)", "0x75160a20": "pay_royalties()", "0x15398afe": "compareNumericStrings(string,string)", "0xbbd8b602": "getOracleOutcomes(bytes,address[])", "0xebae35a6": "DAOTokenCreationProxyTransferer(address,address)", "0x15abc160": "createValidatedRequest(address[3],address,uint256[11],uint256,bytes)", "0x830953ab": "claimAmount()", "0x26b916b4": "Set_Interest_Rate(uint256)", "0x1fb291cb": "registerInt(address,int256)", "0x505fb46c": "add(uint256,uint256,uint256)", "0xf00d4b5d": "changeOwner(address,address)", "0x034187fd": "setEthToCents(uint256)", "0x94d9cf8f": "CreateProxyWithControllerAndRecovery(address,address[],uint256,uint256)", "0xacbf98a7": "endsWith()", "0xfc2c3e08": "getIteration()", "0x6d7da0b1": "MyContract()", "0x1558ae4d": "Etheroll()", "0x42cbb15c": "getBlockNumber()", "0x29cd62ea": "setPubkey(bytes32,bytes32,bytes32)", "0x2030f721": "num_objects()", "0xbc08afd9": "WebOfTrustToken(address,uint256)", "0x8cdfb1e6": "transferIfHF(address)", "0xa0bd3c0f": "scheduleCall(address,bytes,bytes,uint256)", "0x4e71e0c8": "claimOwnership()", "0xc1cc0775": "calculateFeeDynamic(uint256,uint256)", "0x50c42921": "replicate()", "0x25495998": "getMinimumConsumerDeposit()", "0x3d8e2947": "getFileAddress(bytes)", "0x1f794436": "getBlockHeader(int256)", "0x7d380265": "addOptionChain(uint256,string,uint256,uint256,bytes32,address,int256[])", "0xec0b4153": "getMoneyness(int256,uint256,uint256)", "0x01775f23": "_closeBooks()", "0x9d063ed8": "FIFSRegistrar(address,bytes32)", "0x083b2732": "callback()", "0xa1920586": "offer(uint256,uint256)", "0x19c47214": "getBlockVersion(bytes)", "0xa293d1e8": "safeSub(uint256,uint256)", "0xfe73e3ec": "preliminaryGameResult(uint64)", "0xf004b12b": "CrowdFund(uint256,uint256,address)", "0x54d03b5c": "changeFeeMake(uint256)", "0x9dbc4f9b": "participantDetails(uint256)", "0xd002462b": "setDeploymentFee(uint256)", "0xed2b8e0b": "getPoolRotationDelay()", "0xf697a0ed": "ppb(uint256,uint256)", "0x964c836c": "receiveExecutionNotification()", "0x5e0e2957": "dumpOut()", "0x33232609": "blake2b(uint64[],uint64[],uint64)", "0x88f53db1": "getDataRequest(uint256)", "0x0caf9d39": "testFailTooManyMembers()", "0x1f2e886c": "testControllerTransferTriggersEvent()", "0x586a69fa": "getMaximumStackCheck()", "0xf64fca2e": "getNodeId(bytes)", "0x8b95ec0c": "testAddBalance()", "0x32e7c5bf": "B()", "0x57e6c2f4": "isAuthorized()", "0xb2f2588b": "sortNumbers(uint8[3])", "0xe95bee59": "checkFormat(string)", "0xcef887b0": "storeBlockWithFee(bytes,int256)", "0xbe26733c": "Kill()", "0xe82f7dd4": "testThrowsRetractLatestRevisionNotUpdatable()", "0xfd7ac203": "TestToken()", "0x6d052f56": "testBitsSetSuccess()", "0xf65c4d42": "Participate(uint256)", "0x432c685f": "trustClient(address)", "0xb0171fa4": "getCurrentGenerationId()", "0x03251a08": "setMin(uint256,uint256)", "0x58d3b617": "Notifier(string)", "0x15dacbea": "transferFrom(address,address,address,uint256)", "0x83f7b8e1": "getNumberOfPhotos()", "0xf1076703": "getVerificationId(address,bytes,bytes)", "0x752a3df6": "transferIfHardForked(address)", "0xaf93afdd": "Shipment(bytes,bytes,bytes,bytes,string,bytes,uint256,uint256,bytes,bytes,uint256,uint256,string,bytes,bytes,bytes)", "0x7fcf532c": "Withdrawal(address,uint256)", "0x72ea4b8c": "getNumInvestors()", "0x7df52ba8": "Arbitrate(uint32,uint32,bool)", "0xea25f24a": "TokenCreation(uint256,uint256,address)", "0xf74100e3": "getBits(bytes)", "0x63bfe3d8": "SkillBeatsLuck()", "0x80599e4b": "remove(string)", "0x6c050eae": "look()", "0xf9a794ad": "EtherLovers()", "0x501e8428": "getPart(bytes,uint256)", "0xf446c1d0": "A()", "0x2d67bb91": "World()", "0xeef547d7": "deal_details(uint32)", "0xa6cb9e64": "scheduleCall(address,bytes,bytes)", "0x659010e7": "m_spentToday()", "0x9b0b9c07": "acceptBankDraft()", "0x315e2f1b": "setTestString(string)", "0x69bcdb7d": "getCommitment(uint256)", "0xe1376da2": "updateFirstActiveGamble(uint256)", "0xc70d169d": "answerRequest(uint256,bytes)", "0xa094a031": "isReady()", "0x74e60a48": "cancelOrder(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", "0x1b5ee6ae": "mintToken(int256,address,uint256)", "0x7f791833": "toTimestamp(uint16,uint8,uint8,uint8)", "0x5e6ad49d": "_setCosignerAddress(address)", "0xb2e85b67": "getPlayerStatus(address,uint256)", "0x30a24abd": "create(bytes4,bytes)", "0x9f0e3107": "get_timestamp(bytes32)", "0x33397816": "withdrawAccountBalance(address)", "0x0da3e613": "EthFactory()", "0xa5f3c23b": "add(int256,int256)", "0xc1829a14": "testFailTooFewConfirms()", "0x5322f0c5": "getChannelOwner(bytes)", "0x0fd1f94e": "firstClaimBlock()", "0x639d57f2": "testGetBitSuccess()", "0xd3aa22c7": "transferTLA(string,address)", "0x86314af9": "BetOnHashV84()", "0x3059ac30": "Escrow(address,address)", "0x0efafd01": "getPlayerGainLossOnLastFlip()", "0x49bf66d3": "addRegistryIntoNameIndex(address)", "0x3af39c21": "undefined()", "0xb660d77c": "switchMPO(address,address)", "0x0fdb468f": "fee(uint64)", "0x72479140": "CreateTicket(address,uint8,uint8,uint8)", "0xe79a198f": "unregister()", "0x688dcfd7": "setProofType(bytes1)", "0xfb9a4595": "GitHubBounty()", "0xd02a9889": "getDateOfFirstPayment()", "0xca35271c": "numDebtors(address)", "0x08714bfa": "TestContract()", "0x16d960b5": "createThing(bytes32[],bytes32[],uint88)", "0x17961d0f": "ord()", "0x62ba9687": "toTimestamp(uint16,uint8,uint8,uint8,uint8)", "0xbba91ea7": "getHomeadvIndex(uint256)", "0xb45105b2": "post(string,address,string)", "0xa7e25683": "testShortOutput()", "0xa068e8d3": "convict(uint256,uint256,uint256,uint256)", "0x09a69f57": "getRewardAmount()", "0xe7334156": "processNextDeposit(address)", "0x62ee6d29": "changeHashtoLowOrHigh(uint256)", "0xa80d4e9a": "EtherAuction(uint256)", "0x18489f50": "thingExist(bytes32[])", "0x5323c6cf": "calcCostsBuying(bytes,uint256,uint256[],uint8,uint256)", "0x9a777d5d": "buyCoins()", "0x36344022": "testAuthorizedTransfer()", "0x8b863095": "setContractorProposal(uint256,bytes)", "0xd10e99fe": "mint(int256,bytes32)", "0x12c82bcc": "sendRobust(address,uint256)", "0x0bf75567": "voteSuperQuorum(uint256,bool)", "0xf5f6ea26": "EthOne()", "0x14918f5e": "performInitialWithdrawal()", "0xdf32754b": "owned()", "0x1632070c": "setRewardDivisor(uint256)", "0xe50a3bb1": "oraclize_query(string,string[],uint256)", "0x9b619d3b": "_deleteAllPackedRevisionBlockNumbers(bytes32)", "0x3b751f7f": "claimThroneRP(string)", "0xd55ec697": "upgrade()", "0x43703b0e": "getEventData(bytes)", "0xd1bf9aba": "nextRune()", "0x76849376": "addNode(bytes32,address)", "0xfd958695": "isAlphaNumeric(bytes1)", "0x9fa5e5d5": "setARKowner(address)", "0x6e2cde85": "drawPot(string,string)", "0x4d5b080c": "scheduleTransaction(uint256,address,uint256)", "0xf1e4a540": "unsetCoordinator()", "0x364f4896": "emission(address,address,uint256,uint16,uint16)", "0x9183fd01": "getSeedPrice()", "0x9832ee65": "resultsWeightedByTokens()", "0xdd5244b4": "testTryProxyCallWithValue()", "0xec2ec781": "testFailGetUnsetToken()", "0x7db9743b": "Registry()", "0x1adf2d1a": "Offer(address,address,bytes,uint256,uint256,uint128,uint256)", "0x1ba326c4": "calcShare(uint256,uint256,uint256)", "0x3ced842b": "make_offer()", "0xea295ec2": "calcRevenue(address)", "0x3c894475": "scheduleTransaction(address,bytes,uint8,uint256[6],uint256)", "0x477bddaa": "setContractAddress(address)", "0xed180443": "getUint256(int256)", "0xee725d44": "toChannelID(string)", "0xa4898fd5": "deployContract(address)", "0x75ee85bd": "salsa20_8(uint256,uint256)", "0xbe7c29c1": "getNewDAOAddress(uint256)", "0xfe01f1ff": "TokenTester()", "0x6103d915": "Winners(uint256)", "0xa30b5c69": "AttributeModel()", "0x81064e2d": "getCreditorAmounts()", "0x23584a21": "initStats(string,address,uint256)", "0xe2894a8a": "OwnerAnnounce(string)", "0xa84c5330": "createNewRevision(bytes20,bytes)", "0xb742398b": "trade(address,uint256,bytes,address,uint256,bytes)", "0x3211bb90": "OwnerAddFunds()", "0xa0befa94": "getStake(uint256,uint256)", "0x6dc3edcf": "executeExecutable(uint256,uint256)", "0x17e875e3": "Transparancy()", "0x6939864b": "lotteryState()", "0x3b107682": "DualIndex()", "0x51b3d7b9": "_transferWithReference(address,uint256,string)", "0xdf7cec28": "cancelBid(bytes32)", "0x1e74a2d3": "getMinimumEndowment()", "0x39b333d9": "Play(uint8,uint8,uint8,uint8)", "0xcbd08c8c": "config(uint256,uint256,uint256,uint256)", "0xca6ad1e4": "setCustomGasPrice(uint256)", "0x510f44cb": "TestFactoryUser()", "0xcee6ee38": "aEthereumlotteryNet()", "0x11610c25": "bet()", "0xb73405a9": "roundMoneyDownNicely(uint256)", "0xb8851fea": "endDateStart()", "0xa4325485": "getCreatorBalance()", "0x2c181929": "getChainWork()", "0xffb4c857": "_confirmAndCheck(bytes32)", "0x9e66cd38": "free(uint64)", "0x44e43cb8": "depositRevenue()", "0xa553a597": "configure(uint256,uint256,uint8,address)", "0xc47f0027": "setName(string)", "0x565a2ecf": "classicTransfer(address)", "0x1da0fb1b": "updateSettings(uint256,uint256,uint256,uint256,uint256,bool)", "0xa5ebf389": "getMoneyTotals()", "0x7f445c24": "subRegistrar(string)", "0x9ad4f98e": "BlocksureInfo()", "0xd6b4ec12": "getDailyWithdrawalLimit()", "0xe0886f90": "at(uint256)", "0x5dc77e26": "andThen(string,address)", "0xe7d50e5c": "FarmShare()", "0x3f2965f0": "registerSeller(address)", "0x85b73d3c": "testCreateNewRevision()", "0x49437210": "getUpdatable(bytes32)", "0xe1a9109d": "setSeedPrice(uint256)", "0x95978868": "strConcat(string,string,string,string,string)", "0x511b1df9": "addr(string)", "0xc5b1d9aa": "newRound()", "0xecf6eb22": "setConfigAddress(bytes,address)", "0x9a9c9c53": "DepositToBankAccount()", "0x27ea6f2b": "setLimit(uint256)", "0xd2dc0869": "add(string,uint256,string,string,address)", "0xc86a90fe": "sendCoin(uint256,address)", "0x5dfc2e4a": "noop()", "0xd81e8423": "get(address,address)", "0x4cad42d3": "testWager()", "0xd120a284": "getBytesFromNumbers(uint8[3])", "0x991ffd4e": "scheduleCall(address,bytes,bytes,uint256,uint256,uint8,uint256)", "0x60c311fd": "doBurnFromContract(address,uint256)", "0xbb6a0853": "GreedPit()", "0xc27b2c2d": "collectEarnings()", "0x446294ad": "multiAccessGetOwners()", "0x5bec9e67": "infinite()", "0x47e7ef24": "deposit(address,uint256)", "0x8d216186": "roll(uint256,bytes32)", "0xdf300b46": "getThing(bytes32[])", "0x5a6c787e": "updateWithMPO()", "0x1f2dc5ef": "divisor()", "0x421aeda6": "Set_your_game_number(string)", "0xba1162d7": "getFmLength()", "0x853255cc": "sum()", "0x20768ee8": "getProposalID()", "0xf5c57382": "nameOf(address)", "0x4e417a98": "callData()", "0xc90d080a": "registerEvent(bytes)", "0x0b1e400a": "_transferFromToICAPWithReference(address,bytes32,uint256,string)", "0xe420264a": "g(uint256)", "0x8a00a82f": "withdrawRewardFor(address)", "0x06638e92": "GetNumbersFromHash(bytes32)", "0xf63da25b": "Emailer()", "0xc01706dd": "getContentByRank(address,uint256,uint256)", "0xe1108706": "rfind()", "0xffd10e07": "enterPool(address)", "0xc4254c7b": "CoreWallet()", "0x30e0789e": "_transfer(address,address,uint256)", "0x992ae976": "isSafePunctuation(bytes1)", "0x4afce471": "test_requires_depth(uint16)", "0xda7fc24f": "setBackend(address)", "0xeb7402f5": "multiAccessHasConfirmed(bytes32,address)", "0x6c1a5b8c": "TOKEN_TARGET()", "0xb3a2a999": "nextWithdrawal(bytes16)", "0x4a420138": "scheduleHeartbeat()", "0xb1233451": "setTerm(uint256,string)", "0x266710ca": "manualUpdateBalances_only_Dev()", "0x98866c1a": "personUpdateDOD(uint256,int256)", "0xaa6be303": "debtors(address)", "0xda5c0a7c": "testDisown()", "0x8757a2cd": "test_depth(uint256,uint256)", "0xe1bedf2a": "AlarmTester(address)", "0x5dcbac7a": "registerBytes(address,bytes)", "0xa587da29": "setPackage(bytes,uint8,uint8,uint8,bytes)", "0xc3da42b8": "c()", "0x4b8772c1": "buyUnit(uint256,uint256)", "0x67f12ecf": "validate(address,uint256,uint256[101][])", "0x0bd089ab": "MyAdvancedToken(uint256,string,uint8,string,address)", "0x32829a23": "OpenBankAccount()", "0xdea06188": "NumberOfBlockAlreadyMined()", "0x61e539da": "testFailWrongAccountTransfers()", "0x8a3e44d4": "assetMoveInformation(address,address)", "0x1327d3d8": "setValidator(address)", "0x207c64fb": "validate(address)", "0x80acaafb": "profitDistribution()", "0x90b98a11": "sendCoin(address,uint256)", "0x8b147245": "update(bytes32)", "0x920c94df": "BuyTicketForOther(address,uint8,uint8,uint8)", "0x6f698fb5": "setMinimumQuorum(uint256)", "0xac5e81a9": "historyPayout(address)", "0x70d084c0": "SingularDTVCrowdfunding()", "0x67ce940d": "getOverhead()", "0x7a791524": "setNextFeePercentage(uint8)", "0xd6d902c4": "claimThroneFor(bytes,address)", "0xc71e48d6": "setOutcome(bytes32,bytes32[])", "0xef41e06f": "testThrowSetEnforceRevisionsNotOwner()", "0x70be4ffa": "testErrorUnauthorizedSetPackage()", "0x6d12301c": "getBetValue(bytes32,uint8)", "0x4e69d560": "getStatus()", "0x55234ec0": "remaining()", "0x5cfd8c24": "ResetPonzi()", "0xe29fb547": "scheduleCall(bytes4,uint256,uint256,uint8,uint256)", "0xbd119967": "add_rating(uint256,uint256)", "0x966acb38": "testThrowTransferNotTransferable()", "0x5c665f89": "getFunds(address,bool)", "0xa59d6986": "recoverLostFunds()", "0x403abbc7": "updateFirstActiveGamble()", "0x0230a07c": "releaseDeed(bytes32)", "0x2d116186": "deityBalance()", "0x602acca1": "InchainICO(address[],uint256)", "0xd393c871": "register(string,address,uint256)", "0xe0fe075e": "payoutReady()", "0xf3e3c629": "testBalanceOfStartsAtZero()", "0x48cd4cb1": "startBlock()", "0x669459a7": "removeRegistryFromOwnerIndex(address)", "0x74d89c47": "testUpdateNameDb()", "0x182db370": "getWhatHappened()", "0xf363441f": "getCreatorDotBalance()", "0x6896fabf": "getAccountBalance()", "0xb29a0308": "logAnonymous(bytes,bytes,bytes,uint256)", "0x3023d0c4": "Ethstick()", "0x1077f06c": "makeClaim(uint256)", "0x8a519fb9": "BlockChainEnterprise()", "0xbffbe61c": "node(address)", "0xe20bbd8d": "RecoveryWithTenant()", "0x03bda14e": "raiseMaxNumBets(uint256)", "0xe1041d86": "__throw()", "0x3d79d1c8": "bal()", "0xbd3f0965": "AiraEtherFunds(string,string)", "0xc388cca6": "testBitAndFailIndexOOB()", "0x921f98bb": "resolveFailVote()", "0x4bbb216c": "_target(address)", "0x10922cc1": "testTransferCost()", "0xeceb2945": "checkProposalCode(uint256,address,uint256,bytes)", "0x3df4ddf4": "first()", "0x21a49ec2": "LCoin()", "0x6d1f00a6": "ThroneMaker(uint256)", "0xcaed4f9f": "DataService()", "0x5cff876b": "carrotsCaught()", "0x3a7fb796": "mintGreen(int256,address,uint256)", "0x370b6939": "AdminSetDrawer(address)", "0x2d9a37d3": "getMaxPayout()", "0x739f888c": "setNewEstimate(int256,int256)", "0x04dd69fa": "getGenerationIdForCall(address)", "0xb764e273": "failSend()", "0xd4dfadbf": "getMarket(address)", "0xa0e67e2b": "getOwners()", "0x2d592a34": "sellKissBTC(uint256)", "0x8a341c83": "testErrorRootAuthorityChangeUnownedPackage()", "0xfcc6b5d5": "fillTheirOrder(address)", "0x61649472": "getPoolFreezePeriod()", "0x3dd297da": "safeMultiply(uint256,uint256)", "0x5d3278f0": "LooneyFifty()", "0x7399646a": "theRun()", "0x3e450fff": "adminDeleteAccount()", "0x93cc9162": "taskRejected(uint256,uint256)", "0xbc5d0f65": "beginExecution()", "0x1934d55a": "isPermanentlyApproved(address,address)", "0xf1cff4b5": "testBitsNotSetSuccess()", "0xf240f7c3": "dispute()", "0xf6d5959b": "getActionStatus(uint256)", "0x0f23cbaa": "recycle()", "0x74f8d96e": "getRevisionBlockNumber(bytes20,uint256)", "0x0bad342a": "EscrowContract(address,address,address,address,uint256,uint256,uint256,uint256)", "0xa6afd5fd": "getBets()", "0x84ad6ff3": "ReversibleDemo()", "0x62b3b833": "createCoupon(string)", "0x523ccfa8": "isKnownCall(address)", "0xacc8cb18": "pushTerm(string)", "0xa753d6f2": "CreateProposal(string,string,string,string,string,string,uint32,uint32)", "0xc5699d68": "_compare(int256,bytes,int256)", "0xe2faf044": "createDAO(address,uint256,uint256,uint256)", "0xa15afb48": "Replicator()", "0x352d2790": "UUID4()", "0x7dee2cad": "CancelMyInvestment()", "0xbeabacc8": "transfer(address,address,uint256)", "0x674f220f": "previousOwner()", "0x4b3b6168": "SetNewBigContract(address)", "0x54ba7daa": "enter(bytes,bytes)", "0x06fdde03": "name()", "0x5944427b": "getRequestResult(uint256)", "0x983ef725": "getDifficulty(uint256)", "0x9287c877": "getNavLength()", "0xa987d654": "restoreItem(uint256)", "0x05433a26": "GetNumbersFromHash(bytes)", "0xd04bfc9c": "buyer_pay()", "0x4a9b3f95": "personUpdateName(uint256,string)", "0xe6b972f5": "userName(address)", "0x88782386": "UnicornMilk()", "0x74580e2f": "changeCreator(address)", "0x1785f53c": "removeAdmin(address)", "0xad544dcb": "testSetNotUpdatable()", "0xafd09bab": "quadrupler()", "0x77bc222c": "_eraseSingleNode(bytes32)", "0x09957e69": "newSale(bytes,uint256,uint256)", "0xa21931ea": "CreateProposal(string,string,string,uint32,string,string,string,uint32,uint32)", "0xbb6b4619": "SendETC(address)", "0x3aa94b1d": "getCoinStats(uint256)", "0x9e2262f5": "testCreateCostData()", "0x2bf4e53d": "getCurrentShareholders()", "0x6111dd02": "calcCostsSelling(uint256,uint8,uint8,uint256)", "0x6b9b1006": "TransactionRecorder()", "0x83b23b40": "cEthereumlotteryNet()", "0x770c6cbb": "WithDrawPreForkChildDAO()", "0x67080f6e": "testThrowsSetEnforceRevisionsNotOwner()", "0xa10bee85": "_transferFromWithReference(address,address,uint256,string)", "0x49cc954b": "twoYearsPassed()", "0x88c3ba85": "ParallelGambling()", "0x03985426": "getMode(bytes32)", "0xad8ed335": "__proxy(address)", "0x306387a4": "dealStatus(uint256)", "0x0343dfa0": "checkInvariants()", "0x23df9df5": "_refund(uint256)", "0x837e7cc6": "rollDice()", "0x98b1e06a": "deposit(bytes)", "0xa0440426": "purchaseProduct(uint256,uint256)", "0x4cb71b9b": "getAllReleaseHashes()", "0x3a7d280c": "login(string)", "0xb9a904f9": "testUnauthorizedSetBetaPackage()", "0xe94a4db1": "isSuitableGen(uint256,uint256)", "0x60f8af90": "refundRound()", "0x43bf718e": "getHashOfTheProposalDocument()", "0x4a30f976": "censorship(uint256,bool,bool)", "0x47e46806": "toString()", "0x8d59cc02": "register(address,string,string)", "0xb3fb14ad": "getGameResult()", "0x4a23dc52": "FileStore()", "0x8da5cb5b": "owner()", "0x3cc8daf7": "setNameOwner(bytes,address)", "0x14cbdb54": "EspCoin()", "0xc47cf5de": "getAddress(bytes)", "0x71e11354": "updateRegistration(string,string)", "0x8b2e6dcf": "publish(bytes32)", "0x12d00c2e": "soloWithdraw(uint256)", "0xd68199dc": "gameStats()", "0xf0f967e8": "canCall(address,address,bytes)", "0xe0c7c117": "Randao()", "0xddeae033": "claimFor(address)", "0xcec7260b": "move_monster(uint16,uint16)", "0xe51ace16": "record(string)", "0x4f76cb02": "testGetBitFailIndexOOB()", "0x942385eb": "getPayroll()", "0x46d667db": "setBytes32(bytes)", "0x35a063b4": "abort()", "0xb1d51d31": "pay(uint64,address)", "0x7140bdf3": "get_all_best_offers()", "0x0380e2f3": "getHashOfTheSignedDocument()", "0x2feda2fa": "POI()", "0x3c0870ae": "challenge(uint256,uint256,uint256,bool)", "0x27a5c7c6": "voteDecline(uint256)", "0xafd8c8c4": "GasProxy(address,address)", "0x8de93222": "purchase(address,uint256)", "0x087e055a": "getConfigBool(bytes)", "0xbaccc92b": "RegulatorIfc(address)", "0x8c546f81": "GNT()", "0x57cb2fc4": "getInt8()", "0xe3083fb5": "removeFromContribution(uint256)", "0x1a092541": "getDescription()", "0x7486a8e3": "get_publisher(bytes32)", "0x089e0ad0": "buildDSMap()", "0x29161820": "Base(uint256)", "0xe2f8feb2": "internal_tester(int256)", "0x1d2dbb22": "CancelMyInvest()", "0x726ab4ef": "getParentHash(bytes)", "0x83d8a90f": "theDonkeyKing()", "0x9babdad6": "removeShareholder(address)", "0xdeb931a2": "getOwner(bytes32)", "0x90cb04e1": "buy(string,uint256,uint16)", "0x2ff92323": "oraclize_query(uint256,string,string[4])", "0xf91a792e": "decryptHand(string,uint256,uint256,uint256)", "0xebf6e91d": "hit(uint256)", "0xb085b9a5": "Example()", "0x07b2779f": "BasicRegulator(address,uint256,uint256)", "0xe10e5dce": "_build(bytes)", "0x3e239e1a": "getHour(uint256)", "0xacc5a0dc": "GetPrize()", "0xa79deb4f": "acceptTradeDeal()", "0xd7c26adb": "oraclize_setProof(bytes1)", "0xc6a17d2b": "pow10(uint256,uint8)", "0xa87d942c": "getCount()", "0xe706918c": "testToggleBitSuccess()", "0xc1812b15": "reorganizeOwners()", "0x7c7c7695": "getAccountID(address)", "0x1a26ed1c": "validateReservedWindowSize(uint256,uint256)", "0x87393bc6": "verifyFirstHalf(uint256[4],uint256[4])", "0x2e52d606": "n()", "0x2037fcbf": "withdrawInvestment(uint256)", "0x77228659": "query2(uint256,string,string,string)", "0xf67a1d37": "BlockChainChallenge()", "0xc67146a5": "check_bet(uint256,address,uint8)", "0xc89f2ce4": "funds()", "0x58e29e17": "initiateProof()", "0xf0e10c0d": "play(address,uint256)", "0x480b70bd": "scheduleCall(address,bytes4,uint256,uint256)", "0x5294157f": "sendWithAllOurGasExceptExt(address,uint256,uint256)", "0xad447a19": "getBalanceDB()", "0x41095b60": "voteForUltimateOutcome(bytes,uint16)", "0x5521d17b": "betOnColor(bool)", "0xc8f8d75d": "Config(uint8,address)", "0x10ae4ce2": "setReleaseValidator(address)", "0x9fd4f7d1": "replaceWizard(address)", "0x77c78df9": "getCurrentLevel()", "0x1dda5c7d": "testFailSubBalanceBelowZero()", "0x21e5383a": "addBalance(address,uint256)", "0xb0414a2d": "setMinimumGasLimit(uint256)", "0x919840ad": "check()", "0xf651bf44": "move_to(uint16)", "0x0b97bc86": "startDate()", "0x29f1bff4": "withdrawFromChildDAO(uint256)", "0x7a02dc06": "getInfo(bytes32)", "0xe5bf93b9": "balanceEther(uint256)", "0x288c6ed2": "getSeedCost(uint256)", "0x4db3da83": "scheduleCall(bytes4)", "0x270cfee1": "getTokenAccount()", "0xb5d03751": "YoutubeViews()", "0x27e056a5": "addMinter(int256,address)", "0xfa7d68f1": "getAccountInfo(uint256,uint256)", "0x09fc8f6d": "isTokenUpgraded(bytes32)", "0xa5b9e922": "getContentTimetamp(uint256)", "0x1f8947c1": "extractUint(int256,bytes,uint256,uint256)", "0xbcc941b6": "totalWinners()", "0x1db71ffb": "doLoops(uint256)", "0x35ae41c9": "godAutomaticCollectFee()", "0x42cf0e72": "searchByOwner(address)", "0x69f18967": "testSetBitFailIndexOOB()", "0x57b07cd9": "getReleaseHash(uint256)", "0x2baf4f22": "_safeFalse()", "0x3133f2a7": "outstandingBalance()", "0x773c84ee": "exec(address,bytes,uint256,uint256)", "0x9070b18d": "_getAllRevisionBlockNumbers(bytes32)", "0x476e04c7": "NewMessage(string)", "0x3b91ceef": "setMax(uint256,uint256)", "0xe6cb9013": "safeAdd(uint256,uint256)", "0xc2038560": "setOutcome(bytes,bytes)", "0xbed34bba": "compareStrings(string,string)", "0xba8661a2": "TimestampScheduler(address)", "0x4c4aea87": "getReleaseData(bytes32)", "0x1177892f": "getBalanceByAdress(address)", "0x126a710e": "dnsrr(bytes32)", "0x60913244": "botOnSale(uint256,uint256)", "0x5731f357": "oraclize_query(uint256,string,string,string)", "0x3e58c58c": "send(address)", "0x2187a833": "setGreenToken()", "0x5f09952e": "voteAllowTransactions(bool)", "0xf2b26d8f": "nextEtherForSale()", "0x1f201e39": "etherandomExecWithGasLimit(bytes32,bytes32,uint256,uint256)", "0x43d726d6": "close()", "0x6cdf4c90": "ownerSetMinBet(uint256)", "0xe6e8c692": "computeResponseFirstHalf(uint256,uint16)", "0xd1d80fdf": "setAddr(address)", "0x6da1833c": "getInstitutionByName(string)", "0x7682e6ff": "getTrustSetting(address)", "0x8f6f988c": "setUltimateOutcome(bytes)", "0xe299beb3": "SimpleIndex()", "0xa2bb5d48": "get_username(address)", "0x780900dc": "create(uint256)", "0x78710d37": "seven()", "0x2b20e397": "registrar()", "0x4094ef5e": "addDataRequest(string)", "0xc630f92b": "canEnterPool()", "0xdd114c22": "publish(address,uint256,address,uint256)", "0x57006864": "checkBetParity(uint8)", "0x45788ce2": "prev(address)", "0xee8ff562": "setMaxProfit()", "0xdc63a62c": "getFileListHead()", "0x9447fd0a": "until()", "0xb303dcbd": "Owned()", "0x0ecaea73": "create(address,uint256)", "0x20339891": "addGridMember(address)", "0xc8c01a55": "request(address,uint256)", "0x76f10ad0": "getSnapshot(uint256)", "0xc06c4474": "get_burned(bytes32)", "0x67cb61b6": "getChoice()", "0xca708230": "funnel()", "0x08b7fa31": "PriceFeed()", "0xac6bc853": "startSpin()", "0xf4bbfd6a": "scheduleCall(bytes,bytes)", "0xab73e316": "next(address)", "0xba0179b5": "confirm(uint256)", "0x1e62be25": "Bytes32Passer()", "0xb950556a": "setThingValid(bytes32[],bool)", "0xb61c0503": "fireEventLog1()", "0x79a85e6c": "getProductInfo(uint256)", "0x959ac484": "push(uint256)", "0x78e80b39": "UserGetPrize()", "0xff74927b": "strConcat(string,string)", "0xd207e757": "ownerSetOraclizeSafeGas(uint32)", "0x5819dde2": "getNumbersFromBytes(bytes3)", "0xf34ed4e6": "RanDAOPlus(address)", "0x3943807b": "insert(bytes,bytes,int256)", "0x38cc4831": "getAddress()", "0x12a7b914": "getBool()", "0xa4fd6f56": "isEnded()", "0x6c86888b": "testTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address)", "0x0bebd0f9": "addAddressToGeneration(address,uint256)", "0x003074ff": "getFrontend()", "0x2776a859": "computeResponseSecondHalf(uint16)", "0xadfe6b80": "InvestAdd()", "0x6981b5f4": "getLength(string)", "0x4a994eef": "setDelegate(address,bool)", "0xbac1e9f6": "getChannelSize(address,uint256)", "0xbdfdb519": "accept(string,uint256,uint16)", "0x68f5aa0f": "setShareholderDB(address)", "0xafb95eed": "logApproval(address,address,bytes32)", "0xae152cf4": "oraclize_query(string,string,uint256)", "0xe3b26a8c": "SocialNetwork()", "0x54204ad4": "triple()", "0xbc8f3bcb": "ZeroDollarHomePage()", "0xf0350c04": "transfer_ownership(address)", "0xfde9ba41": "transfer(bytes,address,uint256)", "0xfa2acd87": "G(uint64[16],uint256,uint256,uint256,uint256,uint64,uint64)", "0x3a76abff": "_eraseNode(uint256,bytes32[],bytes32)", "0x0acf473b": "AdminCloseContract()", "0x299e7318": "resolveVoting()", "0xb414d4b6": "frozenAccount(address)", "0x8d375da2": "testMakeItFail()", "0x6e8dad74": "retrieveAccountBalance(bytes,bytes)", "0xd3aa831f": "testOwnedTryAuth()", "0x13220305": "doTransferOther(address,address,address,uint256)", "0xb0c7f709": "kingAutomaticCollectFee()", "0x2dabbeed": "reclaim(uint256)", "0x5c19a95c": "delegate(address)", "0xbc2a4dd6": "doBalanceOf(address)", "0x8e7ea5b2": "getWinner()", "0xdb37e42f": "multisetProofType(uint256[],address[])", "0xa6b197aa": "Order(address,uint256)", "0x8cf4dbfb": "collectBalance()", "0xd0821b0e": "bet(uint8)", "0xa02b161e": "unregister(uint256)", "0x09dd0e81": "getBlockchainHead()", "0x8a0807b7": "indexOf(string,string)", "0xe3914699": "dEthereumlotteryNetWinners(address)", "0x44d75fa9": "updateMinorTree(bytes32)", "0x3c21db0a": "theGames(uint256)", "0xf0e959f9": "TokenSales(address)", "0x696bda86": "submitProposal(uint256,bytes)", "0x3b343a13": "getNodeAddress(bytes)", "0x2812f8b8": "FutureCall(address,uint256,uint16,address,bytes4,bytes,uint256,uint256,uint256)", "0xbf32bf97": "FailGuyTax()", "0x89ced196": "setNotUpdatable(bytes32)", "0xb94e962a": "allocateTickets(uint256)", "0x7a479160": "getRequestArgs(uint256)", "0x5a825cbb": "getPayment(uint256,uint256)", "0x4ca8b0d0": "registerExistingThrone(bytes,address,uint256,uint256)", "0x82afd23b": "isActive(uint256)", "0x6ebf10fe": "storeHeader(bytes,address)", "0x1437f9a3": "Set_your_game_number(uint16)", "0xd98d011d": "getCandidateKey(bytes,bytes,bytes,bytes)", "0x8b676ae8": "scheduleCall(address,bytes4,uint256,uint256,uint8,uint256,uint256)", "0x90fd53ec": "farmTile(uint8,uint8,int8)", "0x46e44f63": "getCheckRecordTS(bytes)", "0x1de38038": "makercoin(uint256)", "0xc038a38e": "totals()", "0xfa80918b": "computeNodeId(bytes,bytes)", "0xc76a4bfb": "relayReceiveApproval(address,address,uint256,bytes)", "0x2406cedb": "setPackageOwner(bytes32,address)", "0xb7297cf3": "gameSettings()", "0xe94acf0e": "TinyRouter(address)", "0x4a2b0c38": "DividendProfit()", "0x0e3f732a": "TheGame()", "0xd62457f6": "callValue()", "0x4961b40c": "getReleaseValidator()", "0x540cafe0": "storeHeaderWithFee(bytes,int256,address)", "0x7ff729fc": "fillUpProject(uint256,uint256)", "0x253459e3": "feesSeperateFromBalanceApproximately()", "0x930a80b4": "testAuthorizedSetPackage()", "0xb3cb8885": "nextUnderdogPayout()", "0x62c7855b": "getConfigBytes(bytes32)", "0x4f28af6a": "handleBet(uint256)", "0x103f9251": "transferFrom(address,address)", "0x9b19251a": "whitelist(address)", "0x9928811b": "testBroken()", "0xb33a8a11": "setTokenReference(address)", "0x27f06fff": "requestFillUp(uint256)", "0x2f570a23": "test(bytes)", "0x96ef7aa0": "cash_transfered(string)", "0x3983d5c4": "calcBaseFee(uint256)", "0xec0f1025": "testBitsOrSuccess()", "0xd35f4a99": "mint(int256,address,uint256)", "0x09dfdc71": "currentPyramidBalanceApproximately()", "0xac4e73f9": "proposeReverse(string,address)", "0xac4bd53a": "currentLeader()", "0x5a2ee019": "m()", "0xeba36dbd": "setAddr(uint256,address)", "0x0358d965": "addPayout(uint256)", "0xd7206124": "setInvestorLock(bool)", "0xe916d0f0": "doBalance(address)", "0x67c2a360": "authorizeUser(address)", "0x828d671c": "dyn_sig()", "0xaf6fe8e2": "testGetToken()", "0x283a4576": "Tomeka()", "0x8ac0ca36": "buyViaJohan()", "0xcc872b66": "issue(uint256)", "0xd826f88f": "reset()", "0x2aa3177a": "self_store()", "0x53b7b2e9": "cEthereumlotteryNet(bytes)", "0xce88b145": "getAccount(uint256)", "0x1fa03a2b": "isApprovedFor(address,address)", "0xe42d5be0": "getPaymentOf(address)", "0xb722a9ef": "getPreviousShareholder(address)", "0xfadf87b1": "testGetBitsSuccess()", "0xd26c8a8a": "coinBalance()", "0x30ccebb5": "getStatus(address)", "0x47799da8": "last()", "0x4a5db3b5": "authorizeAddress(address)", "0x22686250": "index(int256,uint256)", "0x07ef99a0": "demintTokens(int256,address,uint8)", "0xea2d4cf8": "__DeployerFunctions(address,address,uint256)", "0x092a2e37": "multiAccessAddOwnerD(address,address)", "0x671fa0a0": "Inscription(string)", "0xa10edc55": "GeneralPurposeProfitSplitter()", "0xd9c67404": "getMerkleRoot(bytes)", "0xdc419fd8": "cancelOrder(bool,uint256)", "0xc9734ebd": "WatchLastPayout()", "0xc7d6faf1": "easyPropose(address,uint256)", "0xfe63300a": "registerExternalBill(uint256,address,address,uint256,uint256,uint256)", "0xd3437fe0": "assertFact(uint256,bytes)", "0x5fb3e119": "Auction()", "0x665beae7": "ExecutableBase(bytes)", "0xc8bb73ef": "testGetBitsFailIndexOOB()", "0xc1d4f708": "getMwLength()", "0x22b0f6ee": "getStatusOfPayout(uint256)", "0x21520c5f": "calculatePayout(uint8,bool,uint256)", "0x66e98c31": "createCoin(string,uint256,uint256,string,string,address)", "0x7b352962": "isFinished()", "0x48d9614d": "GetFee()", "0xfe0d94c1": "execute(uint256)", "0xe4547f98": "documentExists(bytes)", "0x4e10c3ee": "transferWithoutReward(address,uint256)", "0x58ae8bcf": "voteInMasterKey(address)", "0x1dcb304b": "fipsGenerate()", "0xb595181f": "ShapeshiftBot()", "0xe02426c1": "getSignatureHash(bytes4,uint256)", "0x67546967": "EthBtcEscrow()", "0x85b31d7b": "myInfo()", "0xaa677354": "register(address,address)", "0x1d2e2cc4": "ENS()", "0x1097e579": "Enter()", "0x13a396d8": "getRequiredDeposit(bytes)", "0x6df3edef": "getSavedBytes()", "0x09b30ed5": "afterExecute(address)", "0x718e6302": "play(string)", "0x8e46fbb2": "testBitsXorFailIndexOOB()", "0x0d87a7c0": "WLBDrawsDB()", "0xbbe42771": "closeDeed(uint256)", "0xedfbf7b6": "setVotingDeadline(uint256)", "0x299e6b07": "Wallet(address)", "0x5cbc85d0": "returnBounty(uint256)", "0xe5225381": "collect()", "0x94f60a63": "getKudosLeft(address)", "0xd6960697": "confirmPurchase()", "0x4a1f0bf6": "inheritToNextGeneration(address)", "0x244ded7a": "ChangeOwnership(address)", "0x39b35753": "authCancel(address)", "0x75cb2672": "configure(address)", "0x938ae4cc": "testThrowDisownNotTransferable()", "0x04fc11d5": "getActual()", "0xacab021c": "getTOS(address)", "0x812cddf2": "getSavedString()", "0x8ae475a9": "notorize(string)", "0xb1d05422": "SendEmail(string,string)", "0x0fffbb54": "changeRankingSize(uint256)", "0xb6ed9f15": "PFOffer(address,address,bytes,uint256,uint256,uint128)", "0xda333ca6": "payOut(uint256)", "0x652f1f16": "addSignature(string)", "0x983b2d56": "addMinter(address)", "0x5e1936d4": "testThrowSetNotTransferableNotOwner()", "0x4ac1ad78": "getWeekday(uint256)", "0x6ba0b4f2": "isKnownSelector(bytes4)", "0x7c4c27c8": "isThisPuritanicalVersion()", "0x7ae2b5c7": "min(uint256,uint256)", "0x63bd1d4a": "payout()", "0x3fd94686": "changeEligibleDonkeys(uint256)", "0x7fe0518a": "asyncSend(address,uint256)", "0x5a8dd79f": "getDesignatedCaller(address,uint256)", "0x2635f4de": "registerLibrary(bytes,address)", "0x1335ff36": "createEventAndMarketMaker(uint256,uint256,uint8,uint32,address,uint256,uint8,uint16,uint256)", "0x181be00d": "getValue(uint8)", "0x9c1500f0": "registerMany(address,uint256,int256,uint256,bytes,address,bytes)", "0x16f9ce49": "_slotCommitNew(address)", "0x8ca4eef6": "getBuild(bytes32)", "0x8ee21b8e": "get_default_keys()", "0xa66f7ad6": "signRelease(uint256)", "0x414053be": "best_adjustment_for(bool,uint128)", "0x83a51ad0": "oraclize_setConfig(bytes32)", "0x262c0b72": "getPayoutFreezePeriod()", "0x499af77c": "current_spin_number()", "0x4209fff1": "isUser(address)", "0x6e1b6bcc": "checkMyBet(address)", "0xb46300ec": "send()", "0x6b1cb549": "orderMatch(uint256,uint256,uint256,int256,uint256,uint256,address,uint8,bytes32,bytes32,int256)", "0x58d9fa04": "addUser(uint256,address)", "0x24c93343": "error(string)", "0xa95d017d": "getRevisionBlockNumber(bytes32,uint256)", "0x46af23f5": "InstantLottery(address,address,bool,address)", "0x29ef56b1": "getAskOrderBookStats()", "0xe97db66e": "setJackpot()", "0x4b59e880": "puzzle(address,bytes32,bytes32)", "0xc7f86c37": "withdrawFundsRP()", "0x57d4021b": "nextPayoutWhenPyramidBalanceTotalsApproximately()", "0xf1c760ae": "fixBalanceInternal(address)", "0x0908178f": "NoFeePonzi()", "0x22ebb3ac": "DieselPricePeg()", "0xb39a64cd": "getNumCalled()", "0x1c02708d": "killContract()", "0x65228934": "setOperationsCallGas(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", "0x3397ca17": "numBalanceRecords(address)", "0xe436bdf3": "Draws(uint256)", "0xaf55bba0": "removeRegistryFromTagsIndex(address)", "0x11103599": "Token_Offer(address,address,uint16)", "0xb3a2a6c0": "setOfficialWebsite(string)", "0xb06eb03f": "DSEasyMultisig(uint256,uint256,uint256)", "0x775c300c": "deploy()", "0xb1c6517a": "LookAtNumberOfPlayers()", "0xc19d93fb": "state()", "0xac9873c7": "CanaryV7()", "0x750cae6a": "enableBetting_only_Dev()", "0xdf3c8620": "num_challenges()", "0xbb00fc55": "bookEarnings()", "0x0bd2ae1c": "ERW()", "0x580bdf3c": "disableBetting_only_Dev()", "0x5c3f9765": "endDateClose()", "0xc4128b6d": "upgradeCount()", "0x140b4465": "executeSpendingRequests()", "0xfaa1a8ff": "getOwnedBot(address,uint256)", "0x40e58ee5": "cancel(uint256)", "0xf4ea95b9": "validateReleaseVersion(uint32[3])", "0x2ba0b09f": "AddNewCategory(bytes4,uint8,uint8,address)", "0x55db4092": "setTOS(address,bool)", "0xf9cc0605": "getAvailable()", "0x3f2f46b4": "revealRock(string)", "0x2af7ceff": "testPrice(uint256)", "0xcaaf2dd7": "getInitialAnswerResult(uint256)", "0x6f36ce79": "insert_deal(address,address,uint64,uint128,uint32)", "0xa18c751e": "set(bytes,bytes)", "0x4d536fe3": "doit()", "0x3197cbb6": "endTime()", "0xb83069c5": "getStemPrice()", "0x3f15457f": "ens()", "0x81ebdeea": "testThrowCreateWithNonceRetracted()", "0x249b4d0b": "removeTrustedIssuer(address,bytes)", "0xe7b48f74": "get(int256,address)", "0x089d5c4a": "repr()", "0x3a9e7433": "scheduleCall(bytes4,uint256,uint256,uint8)", "0x504f1671": "getSize(address)", "0xf3a44fe1": "withdrawForWorkshop()", "0x7a837213": "setAllowedAccount(address)", "0x4551b1d7": "ProxyPayment(address,address)", "0x5dac1601": "SimpleStablecoin()", "0x87914c6f": "prolongateContract()", "0xe3ceb06d": "YesNo(bytes32,address,string,address,uint256)", "0x42a745cb": "testBitEqualSuccess()", "0xaa8dea8c": "fipsAddToLedger(bytes20,address,bytes)", "0x986dcd4d": "setCycleLimit(uint256)", "0x1e44c112": "find_strike(uint64,uint32,uint32)", "0x1ecfe64d": "_jSub(uint256,uint256,uint256,uint256)", "0x4ae85627": "grindUnicorns(uint256)", "0x200ebe34": "addTokensToGive(address)", "0x7b632c41": "TimestampScheduler(address,address)", "0x979b6f6f": "RoundInfo()", "0xb3ea3924": "PointlessCoin(int256,uint256,string,uint8,string,address)", "0x1d834a1b": "insert(uint256,uint256)", "0x931df75f": "validateProposedThroneName(bytes)", "0x6189be15": "columnround(uint256,uint256)", "0xdf5dd1a5": "addOracle(address)", "0x22d8cf5b": "CheckUserVote(uint8,uint8)", "0xdd62ed3e": "allowance(address,address)", "0xc0eb2325": "scheduleTransaction(address,bytes,uint256)", "0x038461ea": "getCertifiedStudentsCount()", "0x9ee035c9": "lookupCanonicalFormat(bytes)", "0x0ab58ead": "SingularDTVFund()", "0x550ed1f0": "getMaxBetAmount()", "0x6e63015c": "getCertifiersCount()", "0xbbd4f854": "buyShares(bytes32,uint8,uint256,uint256)", "0x306b031d": "getGenerationEndAt(uint256)", "0x1bd9c46e": "setImporter()", "0xc80c28a2": "getNumberOfParticipants()", "0xcb553ac9": "sweepWizardCommission(uint256)", "0x6389654e": "changeDailyWithdrawalLimit(uint256)", "0xc0a963c9": "notifyWinner(address,uint256)", "0x3c335b0e": "getRetractable(bytes20)", "0x017972af": "getNumbersFromHash(bytes32)", "0x07da68f5": "stop()", "0x1e8c72b4": "incrUserAvailBal(address,uint256,bool)", "0x0df71602": "setWinner(uint256)", "0x85e5bb3a": "Security_AddPasswordSha3HashToBankAccount(bytes32)", "0x2ade6c36": "getNodeAddress(bytes32)", "0xb33926cb": "owner_withdraw(uint256)", "0x57764094": "getRate(uint256)", "0x13827950": "getShareholderDB()", "0x26826bf8": "setImage(bytes)", "0x76d438b0": "sendReward(uint256,uint256)", "0x51d6e547": "getNonce(bytes)", "0x4f24186a": "newProposal(string)", "0x1a695230": "transfer(address)", "0xe820a32f": "vetoPayout(uint256,uint256)", "0xfb3a1fb2": "getReleaseDb()", "0x6bae05cf": "preRegister(address)", "0xae2df7b3": "setImporterBank()", "0x56d73ad1": "getCertifierDb()", "0x8396392d": "add(string,string,string,address)", "0xeb08b304": "changeMeatProvider(address)", "0xb60e72cc": "log(string,uint256)", "0x76999896": "KingOfTheEtherThrone()", "0xea851885": "buyStake(bool)", "0xa5982885": "assertFalse(bool)", "0xfbf1f78a": "unapprove(address)", "0xc2ba5b40": "getPackageData(string)", "0x83d51a38": "concatString(string)", "0x68af4971": "registerListening()", "0x14ba5c09": "getDay()", "0xe4849b32": "sell(uint256)", "0x44dd4b3b": "lookupGeneration(uint256)", "0x3fda1281": "get_keys()", "0x09241200": "wasSuccessful()", "0xbc9147a4": "Foundation()", "0xe33734fd": "changeProposalDeposit(uint256)", "0x2cce4abe": "_finishNoCallback()", "0x45e965cd": "strConcat(string,string,string,string)", "0xd4245e5b": "transferringETH(address)", "0x10082bff": "getActorBillXdetail(address,uint256,bool)", "0xc831391d": "getPoolOverlapSize()", "0x15e33901": "digest(bytes,uint256)", "0x5f0edfb8": "create(bytes,bytes32,bytes1)", "0xadd4c784": "getResult(bytes32)", "0x3233c686": "claimerDeposit()", "0x187a62d5": "voteEmergencyWithdrawal(bool)", "0x5404bbf7": "getEntropy()", "0x3f5b7675": "periodTwo()", "0x7ec0f30d": "ack(string)", "0xd30a512e": "betOnColumnOrDozen(bool,bool,bool)", "0x9fcbc738": "setIntermediate(address)", "0x539e2bfb": "secondChainedCallback(uint256)", "0xe724529c": "freezeAccount(address,bool)", "0x5aa97eeb": "getMarkets(bytes32[],address)", "0xc51be90f": "query_withGasLimit(uint256,string,string,uint256)", "0x531b97d7": "oneCentOfWei()", "0xeace4827": "player_make_bet(uint8)", "0x9c851ebc": "new_entry()", "0x98c9cdf4": "getMinimumCallGas()", "0xd8f012c6": "StatelessFactory(string,string,string)", "0xceeafd9d": "withdrawFundsAdvancedRP(address,uint256,uint256)", "0xd6d7d525": "get(bytes)", "0xbf55486b": "Tanya()", "0xd35ada32": "addParticipant(address,address)", "0xa8239d0b": "getPrice(string,address)", "0x12514bba": "transfer(uint256)", "0xb00140aa": "getHash(bytes)", "0x36f66528": "EtherDelta(address,uint256,uint256)", "0x279e0912": "getDownloadPrice()", "0x8173b813": "setNumCities(uint256,uint256)", "0xb98fdc36": "IconomiToken(uint256,string,uint8,string,uint256)", "0x3c7a3aff": "commit()", "0xcac77df7": "__transferFromToICAPWithReference(address,bytes32,uint256,string)", "0xfbeaebc6": "murder()", "0x2fa7cbfb": "getExecCost(uint256)", "0xe44d3084": "testFailure()", "0xede8acdb": "startAuction(bytes32)", "0xd5544f94": "getFundsAndAvailable(address)", "0x3824d8ee": "buy100DaoFor1Eth()", "0xbe3945e4": "getFee(address,address,uint256)", "0x1917ab5c": "activate(string)", "0x23509e69": "donkeysEligibleForFees()", "0xf460590b": "updateSigner(address,bool)", "0xc55c1cb6": "queryN_withGasLimit(uint256,string,bytes,uint256)", "0xd96d7ea2": "PRE_EXECUTION_GAS()", "0x1f7b6d32": "length()", "0xacf8bf2a": "channelCount()", "0x18968a03": "finalize(uint256,address,address)", "0x5674a3ed": "runLottery()", "0xe3280126": "addOrder(string,bool)", "0x32afa2f9": "claimEtherOwner(uint256)", "0x355474d2": "commitReading(address)", "0x00601d6c": "board(uint256,uint8,uint8)", "0x2667f407": "__proxy(address,bytes)", "0x79716e43": "confirmTransaction(bytes32)", "0x272cda88": "EternalDB()", "0x76ca0c77": "scheduleCall(address,bytes,uint256,bytes,uint256)", "0x338b5dea": "depositToken(address,uint256)", "0xfa93f883": "getMinute(uint256)", "0xafc4a982": "PathCost(uint16,uint32)", "0xf7d97577": "setPrice(uint256,uint256)", "0x842bc37b": "GetSmallCotractIndex(address)", "0x75f40f40": "underdogPayoutFund()", "0x23a1c271": "setPongval(int8)", "0x02571be3": "owner(bytes32)", "0xf79b22e0": "betOnATeam(uint256)", "0x10cf5d47": "awaitingPayout()", "0x1b00fe51": "testHypothesis()", "0xd449ce7c": "Administered()", "0x455259cb": "getGasPrice()", "0x975057e7": "store()", "0xdfdb5f17": "doBurn(address,uint256)", "0xaa497b9d": "scheduleCall(address,uint256,bytes,uint256,uint256,uint8)", "0xcabfb934": "replace(address)", "0x1f1f5e76": "addValueToContribution(uint256)", "0xa0eda9f2": "_transferFee(address,uint256,string)", "0xa8d95fb2": "claim(address,string)", "0x03ee8f08": "getCoeff(uint16)", "0x9872a20a": "registerUInt(address,uint256)", "0xb20d30a9": "setDailyLimit(uint256)", "0xe116b17e": "getKudosLeftForProject(address,address)", "0xf7c9f74a": "insert_contribution(address,uint256)", "0xc7a1865b": "play(bytes32)", "0x356594ab": "EtherTransfer()", "0xe22b0c46": "verify(uint256,uint256,uint8,bytes,bytes)", "0x2fea7b81": "getIdentity(address)", "0x6fa8de90": "changeMeatParameters(uint256,uint256)", "0x37c390e3": "allow_move(uint16)", "0xd22c391a": "validateProposedThroneRules(uint256,uint256,uint256,uint256,uint256)", "0xf6d339e4": "setAddress(bytes32,string,address)", "0xd7cc8362": "isLatestMajorTree(bytes32,bytes32)", "0xdd012a15": "setIt(uint256)", "0x254c91b3": "testBitNotSetSuccess()", "0x47e40553": "nextRound()", "0xa6b206bf": "doSomething(uint256)", "0xac996e7e": "resolvePledging()", "0x71e2d919": "lol()", "0x07d5b826": "buyAllOutcomes(bytes32,uint256)", "0x5f68804e": "SimpleLotto()", "0xa510f776": "setCompany()", "0x0d48e8d0": "doBalance()", "0xd21d7950": "changeGasLimitOfSafeSend(uint256)", "0x3358d2d3": "buildDSTokenFrontend()", "0xec93cfae": "FountainOfWealth()", "0x65b1fdf4": "scheduleIssuePOIs()", "0xdc3080f2": "spentAllowance(address,address)", "0xd1f0bb2d": "populateAllowedFreeExchanges()", "0xd591221f": "testTransfer()", "0xf24b5779": "removeTrustedIssuer(address,string)", "0xed4b1d0d": "scheduleTransaction(uint256)", "0xa83627de": "updatePeriod()", "0xf597a499": "UserDatabase(uint256)", "0x21f8a721": "getAddress(bytes32)", "0x5548c837": "Deposit(address,address,uint256)", "0x55b775ea": "setFeed(address)", "0x01b869f1": "release(uint32,uint32,uint32,bytes)", "0x609ff1bd": "winningProposal()", "0xdf98ef33": "getResource(bytes,uint256,bytes)", "0xd39eb301": "getStatus(uint8,uint8)", "0x2cc0b254": "init(address,bytes32)", "0x4228974c": "Videos()", "0xc431f885": "addToContribution()", "0x00e43ee9": "setMigrationStatus(uint256,address)", "0xd9f8a4e2": "calcCurrentTokenPrice()", "0xb9e6f1d9": "get_amount()", "0x6b3a87d2": "WatchWinningPot()", "0xef4592fb": "getResult(bytes)", "0x41b9dc2b": "has(bytes32,bytes32)", "0x3b9901cc": "getChannelsByRanks(address,uint256,uint256)", "0x83876bc9": "newProposalInWei(address,uint256,string,bytes)", "0x50a3bd39": "enterPool()", "0xc976bbbb": "_compare(int256,bytes2,int256)", "0x0e47c76f": "rotate(uint64,uint256)", "0x6f85c7e4": "WAITING_PERIOD()", "0x7075b1d8": "latestMonarchInternal()", "0x9209b3c0": "getCrtDetails(bytes)", "0x305075db": "NormalizeRanks()", "0xb6b55f25": "deposit(uint256)", "0xf09ea2a6": "offer(uint256,address,uint256,address)", "0xf1320af2": "exempt(address)", "0xc813c30e": "testThrowSomething()", "0x4faa2d54": "getTimeElapsed()", "0x22017c5f": "DSTokenBase(uint256)", "0x6637b882": "setDao(address)", "0xd0b52156": "getIpfsHash(address,address)", "0x13bd4e2c": "_prepareAndSendReward()", "0xdb7ca38a": "XaurmProxyContract()", "0x1bad1d2e": "monitorWallet(address)", "0x691f3431": "name(bytes32)", "0x3169ff3e": "LooneyLottery()", "0x446a7974": "Fokitol()", "0xdc3ab866": "checkEarnings(address)", "0xfad9bf9e": "storeBlockWithFeeAndRecipient(bytes,int256,int256,bytes,int256,int256)", "0xaf408d89": "setStatus(bytes)", "0xd02bf162": "spinTheWheel()", "0x9a36f932": "feeDivisor()", "0xca77ab8a": "getNextFile(bytes)", "0xc8e49707": "activateExportFee(address)", "0x502414e4": "marketMaker(string)", "0x78ec81a0": "sendEarnings(address)", "0x14167bf0": "oraclize_query(string,string[])", "0xba13a572": "lottery()", "0x299ed37a": "emergencyCall()", "0x6ec3af26": "addTrustedIssuer(address,bytes)", "0x3d69b403": "isOutcomeSet(bytes)", "0x9a19a953": "setInt8(int8)", "0x7817a60f": "acceptMember(address,string)", "0x1e223143": "getFirst()", "0x5437b39b": "hasUnprocessedDividends(address)", "0x8f0c724c": "setOperationsCallGas(uint256)", "0x3c925f16": "getAccountHolder()", "0x477801b1": "getLastRoundResults_by_index(uint256)", "0x3d21aa42": "sendApproval(address,uint256,address)", "0xd2b8035a": "draw(uint256,uint256)", "0x19c32e0b": "hmacsha256(bytes,bytes)", "0x28f90e4b": "Etheramid2()", "0xe87df70e": "fivetimes()", "0xc028df06": "offer()", "0xacb6c69b": "setTrustedClient(address)", "0xac7ffae3": "updt(uint256,string,uint256,uint256,string,string,address)", "0x0e5ffb3c": "hashVersion(uint32,uint32,uint32,string,string)", "0x4ac6b2be": "getCheckRecordCreator(bytes)", "0x93dafba2": "getSubpot(uint256)", "0x592685d5": "getWindowStart(address,address)", "0xc24a0f8b": "endDate()", "0x3f9b250a": "getDocument(uint256)", "0xd845a4b3": "request(uint256)", "0xa5bfa9a9": "claimToken(bytes32)", "0x8e3957d9": "RandomNumber()", "0x62fb09b2": "getRefDescr(uint256)", "0x9f35d3b2": "start(string,string,uint256,uint256,uint256,uint256)", "0xea1bf386": "getNextSellerBOTdata(uint256)", "0xe27fe50f": "startAuctions(bytes32[])", "0x031d973e": "closeMarket(bytes32)", "0x754dea40": "setBackendOwner(address)", "0xd83a8d11": "testProposing()", "0xf24a534e": "Oracle()", "0xd08275f1": "WolframAlpha()", "0x932db761": "profitsFromBitnationDebitCard()", "0xd96aee49": "MultipleConstructorTest()", "0x4594d06a": "delMinter(int256,address)", "0xb9f256cd": "newProposalInEther(address,uint256,string,bytes)", "0x1d2bca17": "MyToken(uint256,string,uint8,string)", "0x6edbd134": "hasHash()", "0x847f8a10": "Refund(uint32)", "0xb0604a26": "schedule()", "0x6676871d": "reserved_funds()", "0x05888fcd": "tradeBalances(address,uint256,address,uint256,address,uint256)", "0xe771066f": "marriageProof(bytes)", "0x7e32a592": "repairTheCastle()", "0xbab2f552": "currentCycle()", "0x45a3b0bf": "resolveFailPledge()", "0x070a888f": "updateRewardDuration(uint256)", "0x20d9822e": "setAnyoneCanCall(address,string,bool)", "0x224993c2": "setTimeBlock(uint256)", "0x01bd4051": "disown(string)", "0x4bc2a657": "setVoter(address)", "0x522103fa": "changeUnicorn(uint256,address)", "0xc988d70f": "getDailyWithdrawLimit()", "0x2f7f3ecf": "findNextHour(uint256,bytes)", "0x1b769e74": "testThrowsRestartNotUpdatable()", "0x4d561721": "etherandomSetNetwork()", "0x92a781d8": "changeBaseValue(uint256)", "0xf0a78538": "scheduleTransaction(uint256,bytes)", "0x64ef212e": "proxyTransferWithReference(address,uint256,bytes32,string)", "0x97c3ccd8": "ban(address)", "0xdeb6930c": "PriceTicker()", "0x6cc5fdaa": "setBytes32(bytes,bytes)", "0x92c8eb96": "DSFalseFallbackTest()", "0x6534b4e2": "IsPayoutReady__InfoFunction(bytes32)", "0x15e812ad": "getBaseFee()", "0xf5b53e17": "getInt256()", "0x081bf263": "isOOB(uint8,uint8)", "0xd2fb8787": "recordExists(bytes)", "0x86c57fcc": "b32ToBytes(bytes)", "0xe3a199d6": "testThrowCreateNewRevisionNotUpdatable()", "0x57cfeeee": "transfer(address,uint256,bytes32)", "0xb72e717d": "fromAddress(address)", "0x61b20d8c": "retrieveFunds()", "0xf4b103d4": "SimpleStorage(uint256)", "0xe2056c46": "ExtraBalToken()", "0xc3ee6311": "lockAndCall(string)", "0x136af582": "next(bytes,bytes,bytes,bytes,bytes,bytes,bytes)", "0xc5d5997c": "changeSubUser(address,address)", "0xf8018a79": "prepend(address,address)", "0xf6b4dfb4": "contractAddress()", "0x9450b1c8": "addCharityFundation(string,string,string)", "0xd1a8d447": "get_all_bet_values()", "0x66d8c463": "reveal(bytes32,string)", "0xbb963c8a": "transferLibOwnership(bytes,address)", "0xd56b2889": "finish()", "0x9fb25d9e": "LeaderMessage()", "0x6ad50ed4": "investmentEntryInfos()", "0xa4d575ce": "_forward(address,bytes)", "0xa3ec5616": "next(bytes,bytes,bytes,bytes,bytes,bytes,bytes,uint256)", "0x0db73c72": "noevent()", "0xf449619e": "collectPrize(uint256)", "0x1afccfa5": "Proposal(address,address,address,bytes,bool)", "0x4788cabf": "getContractId()", "0x4112987c": "strConcat(string,string,string)", "0x928a00d2": "deleteCoin(uint256)", "0xd9ec0508": "testThrowTransferNotEnabled()", "0x9aaf442c": "applyCensorship(uint256)", "0x49407a44": "claimEther(uint256)", "0x4fcf8210": "eraseRecord(bytes32)", "0x5ed84aa6": "getNymCenterAPIURL()", "0xa3c2c462": "totalReceived()", "0x5938748e": "changeVotingRules(address,address,uint256,uint256,uint256)", "0x6fc9d5e4": "changeCompareTo(uint256)", "0xe2ee9941": "tap(bytes20)", "0x0ff4f160": "oraclize_query(uint256,string,string[1])", "0x43ec3f38": "toSliceB32(bytes32)", "0x3288eb0b": "ChineseCookies()", "0x373c98a2": "authCall(address,bytes32)", "0x6ea056a9": "sweep(address,uint256)", "0x8dc45377": "getDuel1(uint256)", "0xd4625a3a": "equals()", "0x616fca9b": "adopt(address)", "0x32cea83e": "birth(bytes)", "0x002a5cc9": "getTicketHolders(uint256)", "0x31119b4d": "changeDeveloper(address)", "0x69569a51": "setFrontend(address)", "0xb7e24979": "addThing(bytes)", "0x164e68de": "withdrawFees(address)", "0x42bf4431": "orderMatchTest(uint256,uint256,uint256,int256,uint256,uint256,address,address,int256)", "0x5dd672ec": "latestBid()", "0x45fe6e2a": "Scheduler()", "0x55cc4e57": "setIssuer(address)", "0x1df5e755": "Etherandom()", "0x8f70009d": "id_for_address(address,address)", "0x39b50688": "cancelSellOrder()", "0x40953102": "scheduleCall(address,uint256,bytes,uint256,uint256,uint8,uint256)", "0x677913e9": "setAmount(int32)", "0x66671c71": "BaseScheduler(address,address)", "0xfe71aec5": "LittleCactus()", "0x879d46fd": "DAOTrust(address,address,bytes,uint256,uint256,uint128)", "0x3b143184": "Congress(uint256,uint256,int256,address)", "0x7370a38d": "getNumPackages()", "0xfee35ff8": "newInvest(uint256,address,uint256)", "0x57dc9760": "DaoChallenge()", "0x8ac78c80": "Docsign()", "0x76d66f5d": "_Transfer(address,address,bytes32)", "0x9dc2c8f5": "fireEventLog4Anonym()", "0x43114842": "acceptChallenge(uint256,uint256,uint256)", "0x2043285d": "getMarketMakers()", "0xfb32f4f5": "ARK_FLAGGER_1_00()", "0x69431ab6": "TokenCreation(uint256,uint256,address,string,string,uint8)", "0x045c6ce0": "voteForProposal(uint256)", "0xa140e79c": "setMinimumDebatePeriod(uint256)", "0x331a72d1": "getRetractable(bytes32)", "0x87cc1e1c": "setExporterBank()", "0x7183616c": "notarize(string)", "0xce79add1": "givableBalanceOf(address)", "0x6f0cfab6": "DNSResolver()", "0x1c2f38ff": "paid(uint64)", "0xb7de47d3": "getIndex(uint256,uint256)", "0x04a2b2c2": "testOwnerCanBreach()", "0x65a4dfb3": "oraclize_query(uint256,string,string,string,uint256)", "0xf2ddc772": "confirm(bytes)", "0xa00ce377": "getIsContractValid()", "0xfe9fbb80": "isAuthorized(address)", "0xbbd39ac0": "coinBalanceOf(address)", "0xa4fde8bc": "player_declare_taking_too_long()", "0xd052fbf6": "getHistory(string,uint256)", "0xd205ad7d": "proposeDissolve(bytes)", "0x5a3b7e42": "standard()", "0xf27197ab": "getIsAvailable()", "0x00a94b6e": "oraclize_query(uint256,string,string[5],uint256)", "0x971c803f": "getMinimumStackCheck()", "0x5168afa4": "getPackageHash(bytes,uint8,uint8,uint8)", "0xaef99eef": "Game()", "0x7f924c4e": "testDeposit()", "0xb1adc241": "BalanceDB()", "0x6a704d7b": "AddedToGeneration(address,uint256)", "0xb9f37c86": "Registrar()", "0xc631b292": "closeVoting()", "0x19350aea": "nameFor(address)", "0x85dee34c": "query2_withGasLimit(uint256,string,string,string,uint256)", "0xbf187478": "shift_left(uint64,uint256)", "0x5b6b431d": "Withdraw(uint256)", "0xe5dd90a5": "HumanStandardToken(uint256,string,uint8,string)", "0xbf8c50ff": "scheduleTransaction()", "0x013d64bd": "setCanCall(address,address,string,bool)", "0xb870ecbb": "testNormalWhitelistAdd()", "0xbcd3d8ca": "Collector(address,address,uint256)", "0x4401ff5c": "sellShares(bytes,uint8,uint256,uint256)", "0x3e0dfbdf": "getInvestorByAddress(address)", "0xcb3e64fd": "unhalt()", "0xafc24e3d": "getChallengeAnswer(uint256)", "0xa36c8ec2": "UpdateContractorAddress(address)", "0xd5a4a3c6": "findRecentBet(address)", "0xb028ee13": "s2b(string)", "0x692ad3a9": "round(uint256,uint256,uint256,uint256)", "0x0a7493b4": "Etheropt(uint256,string,uint256,uint256,bytes,address,int256[])", "0x60689557": "Rock()", "0x717fedf0": "getFirstActiveDuel1()", "0xe837ab59": "getParticipantByAddress(address)", "0x32d5fe98": "revealCampaign(uint256,uint256)", "0x0178b8bf": "resolver(bytes32)", "0x44faa139": "Withdraw(uint32)", "0x418cf199": "setEstimateCost(uint256,uint256)", "0xae45850b": "schedulerAddress()", "0xd4871517": "BTCLotto(address,uint256)", "0xfbffb355": "testBitsEqualFailIndexOOB()", "0x2be6d43c": "ARKTagger_1_00()", "0x1df47aad": "ReplayProtection()", "0xb36a0b15": "getSignDetails(uint256,uint8)", "0x9c4baf27": "Skywalker(address,address)", "0xfb34fc6f": "WatchNextBlockReward()", "0xceba30b5": "scheduleTransaction(address,bytes,uint256[4],uint256)", "0xfc94dd18": "verifyHumanStandardToken(address)", "0x1ff13086": "size(int256)", "0xce92dced": "newBid(bytes32)", "0x231944e2": "moveUnits(uint256,uint256,uint256[])", "0x784813e0": "lookupBet(uint256,uint256)", "0xe0e3ba5a": "getLosesShare(address)", "0x5c1b3ca1": "getConfigUint(int256,bytes32)", "0x91060168": "fetchString(address,bytes4,bytes32)", "0x354b2735": "testDeploy()", "0xb88eef53": "registryCreated()", "0x8e3d4e5e": "Fibonacci(bytes)", "0x64bd87d6": "scheduleCall(address,bytes,bytes,uint256,uint256)", "0x5c3d005d": "demote(address)", "0xb6509c12": "Ethereum_twelve_bagger()", "0xe87508be": "investorDeposit()", "0xcb96012e": "hashTo256(bytes32)", "0x314e0fb6": "scheduleTransaction(address,bytes,uint256[3],uint256)", "0x5b6a54bc": "adjustTransactionFee(uint256)", "0x5f515226": "checkBalance(address)", "0x76cd7cbc": "sign(bytes)", "0xce220ecf": "testAddBalanceFailsAboveOverflow()", "0x922fc84b": "taskProcessedNoCosting(uint256)", "0xf8b2cb4f": "getBalance(address)", "0x7a29332d": "buyAllOutcomes(uint256,uint256)", "0x04106c8b": "startGeneration()", "0x8eaa1e29": "getContentByData(address,uint256,string,string)", "0x5a7a8850": "rollWithSeed(bytes32)", "0x2facc4e8": "depositGovernance(uint256,address)", "0xf2561a43": "voteSuicide(address)", "0xee1b4828": "closeBooks()", "0x18f303a1": "SetInternalValues(uint8,uint256)", "0xce60f78d": "createMarriage(bytes,bytes,uint256,bytes,bytes)", "0x18b749c4": "payEther(uint256)", "0xbbc6eb1f": "getDefaultDonation()", "0x0b1ca49a": "removeMember(address)", "0xccf4f413": "setSubRegistrar(string,address)", "0x4616caa9": "pushCoin(uint256,address,string)", "0xd69450d5": "setUUID4Bytes(bytes)", "0xc98165b6": "createTarget()", "0x8c79a24d": "refName(uint256)", "0x56d88e27": "len()", "0xbfc3d84b": "CT()", "0xc7f2e6af": "Contribute(bytes20)", "0xd7e11e9d": "AddTicket(bytes)", "0x2d06177a": "addManager(address)", "0xd588acc4": "claimMiningReward()", "0x2ffb9e64": "updateGasForXaurData(uint256,uint256)", "0xf896503a": "getConfigAddress(bytes32)", "0x9af8c4ba": "respond(uint256,address,bytes)", "0x82a5285d": "getMinBetAmount()", "0x3ead67b5": "changeContractOwner(address)", "0xb29d7914": "getRefResults(uint256)", "0x135128c2": "CounterPartyDeposit()", "0x795b9a6f": "scheduleCall(address,bytes4,uint256,bytes)", "0x83197ef0": "destroy()", "0x433836dc": "scheduleTransaction(address,bytes,uint8,uint256[3],uint256)", "0xf009347d": "KudosProxy(address)", "0xf2fde38b": "transferOwnership(address)", "0x62c99e84": "_Approval(address,address,bytes32)", "0x1b83b823": "notifyPlayer(uint256)", "0xe56c8552": "spinTheWheel(address)", "0x93eec1fb": "setName(uint8,uint8,string)", "0x11af3c68": "divest(address)", "0x8279c7db": "setReceiverAddress(address)", "0x44691f7e": "hasStarted()", "0x349501b7": "checkDepth(uint256)", "0xe8beef5b": "fireEventLog3Anonym()", "0x0870607b": "addSubUser(address)", "0x063925c8": "scheduleCall(bytes,uint256,uint256)", "0xa23744f0": "tryCreateCheckRecord(bytes)", "0x35d79fad": "CertificationDb(address,uint256,address)", "0x44691f2b": "Dispute()", "0xd7ccc2c3": "getLastPayment()", "0x152583de": "getAttributes()", "0x1a9360dd": "checkDate()", "0x420ef2b3": "TargetHash()", "0xf0caea2b": "SmartRoulette()", "0x5d268629": "Refund()", "0x23385089": "emitApprove(address,address,uint256)", "0x7648c929": "returnRemainingEther()", "0x5d5bc4cb": "BetOnRed()", "0xde8fa431": "getSize()", "0xda6b31b9": "testErrorTransferToNullAuthority()", "0x444dd6f3": "Elcoin()", "0xe1fa8e84": "register(bytes32)", "0x3e0a322d": "setStartTime(uint256)", "0x21bacf28": "getDefaultFee()", "0xb1662d58": "setModule(address,bool)", "0x5b0fc9c3": "setOwner(bytes32,address)", "0x40193d17": "getPongvalConstant()", "0xfb95adeb": "testFailBlockhashInsuffiecientFee()", "0x8ecc0950": "returnToOwner()", "0x34b7ac9b": "END_MINTING()", "0xeaa37394": "create(bytes,bytes32,bool,bool,bool,bool,bool)", "0xd7bc23af": "newParameters(int256,uint256,uint256,uint256)", "0x97709cde": "ARK_VOTER_1_00(uint256,uint256,uint256,uint256,uint256,uint256)", "0xcf4a1612": "scheduleTransaction(uint256,address,bytes,uint256)", "0x40695625": "testRetractLatestRevision()", "0x90c3f38f": "setDescription(string)", "0x5fdf05d7": "two()", "0xaaac50bd": "transferDisable(bytes32)", "0x206a44f3": "getNum(bytes,uint256)", "0x7ac26aeb": "getTag(string,uint256)", "0xdc3f65d3": "createdByMe()", "0xe99543aa": "Trash(uint256)", "0x1bcad37a": "getTotalCost()", "0xa7f43779": "remove()", "0x3416f9d4": "subtractSafely(uint256,uint256)", "0x3bcf7d22": "newBribedCitizen(address)", "0x918f1bb5": "ProjectKudos()", "0xcf09e6e1": "SetBigContract(address)", "0x23add736": "claim(uint256,uint256,uint8,bytes,bytes)", "0x8ac6a869": "isObsolete()", "0x2324c67c": "getAllSignatureHashes(bytes4)", "0x981a60f5": "extractNameFromData(bytes)", "0xc018d0e6": "getFeeAmount(int256,int256)", "0x50e06b57": "Etherization()", "0x49e65440": "setSymbol(bytes32)", "0xfaee13b9": "set(int8)", "0x01ffc9a7": "supportsInterface(bytes4)", "0xc0b92612": "changePig(address)", "0x3f9f5b68": "setPreviousID(uint256,int256)", "0x2e9c5e77": "doStackExtension(uint256)", "0xc83be888": "single_move(uint256,uint8,uint8)", "0xef19c332": "_checkSigned(bytes32,uint256,uint8,bytes32,bytes32)", "0x2f30c6f6": "set(uint256,address)", "0x62986e27": "Canary(address,uint16)", "0x44dfdce0": "getNameOwner(bytes)", "0x4b7fcee7": "ownerPausePayouts(bool)", "0x84dac46e": "Fucksign()", "0x0878bc51": "getAttachesto(uint8)", "0x42d16748": "getMinDailyWithdrawalLimit()", "0x4ecd73e2": "DistributeDividends(uint256)", "0x03750d94": "serverSeed(address,bytes32)", "0xea0a5237": "announce(string)", "0x611daa7e": "EmergencyBalanceReset(uint256)", "0x2ae87a70": "getNumContents(address,uint256)", "0x5ec01e4d": "random()", "0xfd735602": "executeN()", "0xfebefd61": "startAuctionsAndBid(bytes32[],bytes32)", "0x8b64d70e": "owner_set_time_limit(uint256)", "0x2839e928": "ackermann(uint256,uint256)", "0xaf29e720": "remainingGasFund(uint256)", "0x9eee85fe": "bookEarnings(address,uint256)", "0x3733ffca": "convertTo(uint256,string,string)", "0xdbde1988": "transferFromWithoutReward(address,address,uint256)", "0xd3edcb5b": "getCreditorAddresses()", "0x77fcb91d": "forward(address,bool)", "0xf062e26b": "check_darkdao()", "0xdef2489b": "convert(address)", "0xccbda1af": "getChannelByName(string)", "0x267c8507": "authorizeManager(address)", "0xf1c30ec0": "reclaim(bytes)", "0xe6470fbe": "updateDefaultPayment()", "0x8fe58eb9": "Triger()", "0xd6b44859": "scheduleUndoIt(uint256)", "0x0eb8ed07": "transferEnable(bytes32)", "0xfc1f2a70": "Add(uint256,string,string)", "0x058026d0": "checkTransferToICAPWithReference(bytes32,uint256,string)", "0xaf27c7b3": "Security_HasPasswordSha3HashBeenAddedToBankAccount()", "0x5b151fd2": "fifty_fifty()", "0x531d1974": "testThrowRetractLatestRevisionEnforceRevisions()", "0x60213b88": "getInitialWithdrawal()", "0x29e94503": "VersionedBlob()", "0x9c5d7030": "reimburseGas(uint256,address,uint256,uint256)", "0xcd9a3c98": "any(bool[7])", "0xb484e532": "getMyMsg()", "0xd1f59db9": "isLatestMinorTree(bytes32,bytes32)", "0xe0c6190d": "checkTime()", "0xaf5610dd": "isThisPreforkVersion()", "0xfa968eea": "minBetAmount()", "0x003538c5": "TestRegistrar(address,bytes32)", "0x71c59097": "MainnetSurvey(uint256,string,bytes32[])", "0xc82aac47": "searchByTag(bytes32)", "0xeca5c793": "testErrorUnauthorizedNameRegister()", "0xdc75f2db": "multiowned(address[],uint256)", "0x4c9ed763": "requestTokensBack()", "0xbd9a5673": "oraclize_query(string,string[5])", "0xb11e3b82": "createEvent(bytes32,bool,int256,int256,uint8,address,address,bytes32[])", "0x86e4e178": "CheckTickets(address,uint256,uint256)", "0x53c84526": "setSmartAffiliateContract(address)", "0x89029d8c": "get_all(uint256,uint256)", "0xc25e6908": "ultimateOutcomes(bytes32)", "0x6b1e564a": "challengeWinningOutcome(bytes32,uint16)", "0x1c895915": "getNumberOfPayments(uint256)", "0x244fcd03": "removeRelease(bytes32,string)", "0x2ca6d2c0": "getAccountSize(address)", "0xfe67a54b": "endAuction()", "0x756fb8c9": "getOptionChain()", "0x88102583": "safeCastSigned(uint256)", "0x60063887": "transferDebt(address,address,address,uint256)", "0x16216f39": "return13()", "0x8089d001": "getHashOfBlock(uint256)", "0x27bc39c0": "submitCanonicalCandidate(bytes,bytes,bytes,bytes)", "0xb29ae23f": "getDateOfSignature()", "0xdd729530": "add_shield(uint16)", "0x38557648": "executeSellOrder(address)", "0xe2a71f12": "accountDelete()", "0xce869a64": "fails()", "0x69bdfd3a": "toContractDie(bytes,bytes,uint256)", "0x99aeade3": "iterateTable(uint256,uint256)", "0x46bdca9a": "equal(string,string)", "0x5e07f240": "shiftBitsLeft(bytes,uint256)", "0x76285b5b": "_is360thDay()", "0x594151e0": "Dice()", "0x4dc43eaf": "setTreasury(uint256,uint256)", "0xec727000": "getApprovalDB()", "0xb144adfb": "balance_of(address)", "0x63052d82": "getOwnersIndex(address)", "0x833b4596": "testApproveSetsAllowance()", "0xc67d376d": "getClosedCandidates()", "0xcf03f5f4": "activateMasterKey(address)", "0x7ca55e00": "etherandomVerify(bytes32,bytes32,bytes32,uint256,uint256)", "0xd92ebe46": "createDAO(address,uint256,uint256,uint256,string,string,uint8)", "0x3773930e": "ConfigureFunction(address,uint256,uint16,uint16,uint16)", "0xfee6d28c": "addSnapshot(string)", "0xe71264fa": "addNewTokens(uint256)", "0xc4d9102f": "setNextID(uint256,int256)", "0xa6f0e577": "isLeapYear(uint16)", "0xc7102df7": "__stopBlock()", "0xfa93019c": "getBlocks(uint8,uint8)", "0xe9794dc1": "CreateHash(uint8,string)", "0x5460ef10": "sendWithExtraGas(address,uint256,uint256)", "0x2f62a6ff": "fipsRegister(uint256,address,bytes)", "0xd630bd53": "pledgeApprove(uint256)", "0x3448c7d6": "createHistory(bytes,address,address)", "0xdda3342b": "ReplicatorFactory()", "0x0cd865ec": "recover(address)", "0xb9f28076": "historyIdx(address)", "0x4dda1764": "CafeMaker()", "0x883ba26b": "getIsSettled()", "0x3f5e268f": "convictInitial(uint256,uint256)", "0x4a3b0eec": "authorizeOpen(uint256,bool,string)", "0xee6d2641": "sendWithExtraGasExt(address,uint256,uint256)", "0xde14bbf7": "randomGen(uint256,uint256)", "0x7f3bd56e": "disburse(address,uint256)", "0x20d8741f": "Feed()", "0x60c6b3a5": "claim(bytes,address,uint256,uint8,bytes,bytes)", "0xda4b5e29": "contains()", "0xb3c25835": "addUser(address,string,string,uint256)", "0xee2af3fb": "set_factory(address)", "0xb821f815": "pay_winner(uint256)", "0x138cc941": "testErrorTransferToRejectAuthority()", "0xc0b6f0c2": "NextRoundAndEvents()", "0xc7e67360": "GAS_BUFFER()", "0x058d7433": "setAlliesContract(address)", "0xd810f298": "computeSettlementAmount()", "0xa24d23eb": "ProcessGame(uint256,uint256)", "0x7ac91cc2": "testFailOwnedAuth()", "0x79c3ddc1": "isPackageOwner(string,address,address)", "0x478ae93c": "playToWin(uint256)", "0x6632a507": "testSetupPrecondition()", "0xb6013cef": "finalize(uint256,uint256)", "0x37b7bf11": "Tile(int256,int256)", "0xecfc7ecc": "placeBid()", "0x70b1d9d4": "requestCanonicalFormat(bytes)", "0x315fdea3": "TreasureChest()", "0xc5575ef0": "checkTransferFrom(address,address,uint256)", "0x65c72840": "getDay(uint256)", "0xd6eafd08": "scheduleCall(address,bytes,bytes,uint8,uint256[4])", "0x350fbe2e": "calcNextDrawTime()", "0x8af784dc": "expectEventsExact(address)", "0x2db89533": "Auth(uint8,address)", "0x9f203255": "setAuditor(address)", "0x2526d960": "clawback()", "0x3fbd40fd": "ProcessDraw()", "0xface030b": "SpinTheWheel(address)", "0x648621ec": "xnotify(string)", "0x22dc36e2": "processed(uint64)", "0x6f52167d": "payDuel(address,string,address,string)", "0x8f70bfa0": "processDeposit()", "0x25ea269e": "Scissors()", "0x93feb13b": "ForceSendHelper(address)", "0xb688a363": "join()", "0x89859b50": "updateLatestTree(bytes32)", "0xf83d08ba": "lock()", "0x7d287697": "testTryGetUnset()", "0x98d5fdca": "getPrice()", "0xfe72e717": "toDie(bytes)", "0xb3c06f50": "transferFrom(address,address,bytes32)", "0x1465aa97": "testingContract()", "0x069d6d1c": "closeOrder(uint256)", "0xa79f26dc": "force()", "0xf2371fb3": "grantGiveableKudos(address,uint256)", "0xaa7dcd84": "testUpdateAuthorityEvent()", "0x0d8b5fa2": "testControllerValidTransferFrom()", "0x0e0f55d0": "RewardOrder(uint256,uint256)", "0x9ea1b79d": "getContentChannel(uint256)", "0x4a67fa7d": "setLotteryFee(uint256)", "0xdb006a75": "redeem(uint256)", "0x8f4ed333": "step2()", "0x1a10cfc3": "delete_entry(uint256,uint256,uint256)", "0xd422e4e0": "takeFee(address,uint256,string)", "0x61a00f6d": "Ballot(bytes32[])", "0x9c30936f": "removeCertificationDocumentFromSelf(bytes32)", "0xa5f4af33": "playerWithdrawPendingTransactions()", "0x07ad9ecb": "safeSend(address,uint256)", "0x8f99ea43": "setDividendDB(address)", "0x1df473bc": "newContract(bytes)", "0xea5ea470": "payFunding(uint256)", "0x743e0c9b": "receiveTokens(uint256)", "0x21835af6": "__dig(uint256)", "0x47448e8a": "set(bytes32,string,bytes32)", "0x9b1ad792": "destroyToken(address,uint256)", "0xf765088f": "UpdateClientAddress(address)", "0xddbbc35c": "searchByName(string)", "0x5ed7ca5b": "halt()", "0x97950740": "roomForBirth()", "0xfc01abbe": "stringToBytes32(string,string)", "0xea3d508a": "selector()", "0x8c88752a": "ContributorList(uint256)", "0x5837e083": "move_history(uint256)", "0xf7c3ee7a": "immortality()", "0x1b9f9647": "accessMyWallet(address)", "0xc8691b2a": "getHistory(uint256)", "0x91e8d3dc": "testBitOrFailIndexOOB()", "0x5c89c10d": "setBannedCycles(uint256[])", "0x4500054f": "isCancellable()", "0x334ef224": "testThrowsUpdateLatestRevisionNotOwner()", "0x763a738c": "allNames()", "0x45590ec8": "addTag(uint256,string)", "0xe7740cf9": "revealPaper(string)", "0xd9d2d058": "Splitter()", "0xb412d4d6": "CafeDelivered()", "0x8365172c": "num_levels()", "0x41c0e1b5": "kill()", "0x3106fea0": "voteOnProposal(uint256,bool,uint256)", "0x82ab890a": "update(uint256)", "0x4636a159": "newPhoneToAddr(address,uint256)", "0x2f29d8c5": "elapsed()", "0x1bf20668": "testAdminTransfer()", "0xf709dd51": "getTrademark()", "0x8b859409": "setRelease(bytes32,bytes32,string)", "0x03959bb7": "setDataContract(address)", "0x4247f52d": "DoRoll()", "0x31ab4066": "testAuthorityTryAuth()", "0xac4b2bae": "newParameters(int256,uint256,int256,uint256)", "0x57eaeddf": "_isContract()", "0x4a3a87e2": "CreateProxyWithControllerAndRecoveryKey(address,address,uint256,uint256)", "0xd116c8c4": "releasePayment()", "0x6615dd83": "setSeedSourceB(address)", "0xb8aca90b": "CurrentGame()", "0xc124e2ea": "checkBetDozen(uint8)", "0x4b0bbf84": "addEntropy()", "0x452fbc41": "USN(address,address,bytes,uint256,uint256,uint128)", "0xcdb6753b": "setNav(uint32)", "0xbb5d40eb": "isValid()", "0xd6f42038": "PhoneToAddress()", "0x6bc3e0f0": "verifySecondHalf(uint256[4],uint256[4],uint256[4])", "0x33893071": "checkMyWithdraw(address)", "0xfb46d4c5": "tweet(string)", "0x248582b0": "receivePaymentForGoodsSoldEarly()", "0x766a3f2e": "Security_ConnectBankAccountToNewOwnerAddress(uint32,string)", "0x1c8d5d38": "allowance(address,address,bytes32)", "0x6b256f57": "DAOSecurity(address,address,bytes,uint256,uint256,uint128)", "0xe8d1e961": "lockAccount(uint256)", "0x152fb125": "SimpleMixer()", "0xf72457af": "CertifierDb()", "0xe8a5282d": "setConfig(bytes32)", "0xbeb92f55": "setCaller(address)", "0x9a571d9f": "isAlphaLower(bytes1)", "0x46a2679a": "getSubpotsCount(uint256)", "0xd62d3115": "testCreate()", "0xb6ed0632": "cancelOrder(uint256,uint256)", "0xc95e81cb": "MyBet(uint8,address)", "0x1d5a9f3f": "object_types(uint256)", "0xa49d53a1": "SmartRevshare()", "0x5b65b9ab": "setFee(uint256,uint256,uint256)", "0x116c6eab": "getProfitShare(address)", "0x8e46afa9": "getDefaultGracePeriod()", "0xdabc706e": "getProposalCost()", "0x3fbb539d": "scheduleCall(address,bytes,uint256,bytes)", "0x86269a88": "checkBetNumber(uint8)", "0xb6ac24df": "updatePatchTree(bytes32)", "0x4637d827": "trust(address)", "0x1c1b8772": "update(address)", "0x5a9f2def": "scheduleCall(bytes4,bytes,uint256,uint256)", "0x81a60c0d": "getResults(uint256)", "0xd1b4ff7e": "multiAccessRevokeD(bytes32,address)", "0x92b7d5b9": "getCurrentGaslimit()", "0x77ceded8": "mintGrey(int256,address,uint256)", "0x2a095fbe": "unlinkEID(bytes,bytes,address)", "0xa6e16ba2": "testThrowsRetractLatestRevisionNotOwner()", "0x4579268a": "getOffer(uint256)", "0xcabb3a3a": "isAlphaNumeric(string)", "0xfadc51cf": "isAlpha(bytes1)", "0xf2022905": "toldYouItWouldWork()", "0x686e8aaa": "GetMoney()", "0x07718a3b": "BankOwner_WithdrawDonations()", "0xc58343ef": "getRequest(uint256)", "0x7b1a547c": "registerAs(address,string,uint256,string,address)", "0x213b9eb8": "setAddr(string,address)", "0x75090ebf": "changeDomain(uint256,uint256,uint256,address)", "0xdbbdf083": "register(uint256,address)", "0xfa4e5e5a": "notify(uint8,string,string)", "0x86a5ff97": "changeStatus(string)", "0xb8f71f26": "scheduleTransaction(uint256,address)", "0xa2ec191a": "addDSource(string,uint256)", "0x18b31f94": "registerLengthFunction(string,string,address)", "0x7b395487": "voteForUltimateOutcome(bytes32,uint16)", "0x39246d75": "VersionModel()", "0xd500dd6a": "challengeTimeout(uint256,bool,address)", "0xd1da09ee": "extractImportFeeChargeLength()", "0xc74e907b": "commit(address,uint256,uint256)", "0x4b09ebb2": "e_exp(uint256)", "0xec3af4a9": "getProjectKudos(address)", "0x714064f3": "BreakableBond(address,address,uint256)", "0xc4bc5da5": "resumeContract()", "0xf7888aec": "balanceOf(address,address)", "0x2f597e71": "testLongInput()", "0x7212b67e": "add_potion(uint16)", "0x9a15f4f3": "getBlockHeader(int256,int256)", "0x6eacd48a": "ownerPauseGame(bool)", "0xf739ed4c": "id_for_user_version(uint256,uint256)", "0xfaf0952b": "testThrowRestartNotOwner()", "0x88a1e895": "test2Fails()", "0x237e9492": "executeProposal(uint256,bytes)", "0x7cb97b2b": "set_owner(address)", "0x2bb685bc": "kill2()", "0xdc52696f": "tokenSupplyChanged()", "0x83d852d9": "shutdownTransactions()", "0x525b25b1": "getDeploymentReward()", "0xeac116c4": "createKingdom(string,address,address,address,address)", "0x014e5fde": "ARKController_1_00()", "0xc6ae3b57": "dEthereumlotteryNet(address,address)", "0xcddbe729": "game(uint256)", "0x8823a9c0": "changeFeeTake(uint256)", "0x021991e7": "getBetsLocked()", "0x3015394c": "cancelRequest(uint256)", "0x9d118770": "destroy(uint256)", "0xe854dfb4": "Order(address,uint256,uint256)", "0x8435be4b": "getLastFarm(uint8,uint8)", "0x27fbcac5": "getChannelFeed(address,uint256,uint256)", "0xc1be4031": "XaurumProxyERC20()", "0x8e25071a": "setProxyCurrator(address)", "0x4f139314": "compensateLatestMonarch(uint256)", "0x85c78fac": "retryOraclizeRequest(uint256)", "0x478e25bf": "resetAction(bytes32)", "0xc74c251f": "addSafely(uint256,uint256)", "0x058aace1": "divest()", "0x6d1da953": "createWithNonce(bytes32,bytes)", "0x30c0f8d6": "scheduleTransaction(address,bytes)", "0x69a5e902": "multiAccessCall(address,uint256,bytes)", "0x6f8b44b0": "setMaxSupply(uint256)", "0x919edc7c": "getChainySender(string)", "0x0b7ad54c": "getContent(uint256)", "0x5bfdc700": "registerData(address,int256,bytes,address)", "0x0d1fce42": "getBankroll()", "0x739b47ca": "recordWin(address)", "0xa5ea11da": "getParameters()", "0xf8af9e6f": "setAdv(uint256,string,string)", "0xe32e9f22": "setDeploymentReward(uint256)", "0x0baaaed9": "setConfigBytes(bytes,bytes)", "0x99f4b251": "mine()", "0x362af076": "createRequest(address[3],address,uint256[11],uint256,bytes)", "0x7fd238ba": "doCoinage(address[],uint256[],uint256,uint256,uint256)", "0x3adb2de7": "bet_this_spin()", "0xa311dd70": "setArray(uint8[10])", "0xc5bf339c": "getLastNonPublished()", "0x9d1bbd7e": "CancelRoundAndRefundAll(uint256)", "0x89790192": "WithFee(address,uint256)", "0x1c879c47": "getMarketHashes(bytes)", "0xbb84d362": "splitProfitVIP_only_Dev()", "0xffb1a6cb": "getWins(address)", "0x3b355af6": "baseData()", "0xb181a8fc": "resetContract()", "0x7d3d6522": "goalReached()", "0xd4c2b6b1": "scheduleTransaction(address,bytes,uint256[5],uint256)", "0xd65ab5f2": "startGame()", "0x4c4766e8": "KittenRegistry()", "0x77e5bf84": "getTxGasprice()", "0xff981099": "getVotes(uint256)", "0x4a7b26ec": "join_game(uint256)", "0xcccf7a8e": "has(uint256)", "0xa525f42c": "transferFromToICAP(address,bytes32,uint256)", "0xeef8e35f": "setChainyURL(string)", "0x557ed1ba": "getTime()", "0x595da94d": "has_owners(uint256)", "0x12511c14": "transferEnable(bytes20)", "0x2b291eb6": "UserAddTicket(bytes)", "0x50baa622": "withdrawToken(uint256)", "0xc01a8c84": "confirmTransaction(uint256)", "0x671dacdc": "CalculateSqrt(uint256)", "0xe74ffbd5": "getPart(bytes32,uint256)", "0xdd54a62f": "content(string)", "0x4025b293": "redeemAllOutcomes(bytes32,uint256)", "0xa8659216": "setInitialLockinDays(uint256)", "0x00b5b223": "computeResponse(uint256,uint16)", "0x2ef761d3": "buyTile(uint8,uint8)", "0x0a874df6": "lookup(uint256)", "0x42c69566": "get_address(address,string)", "0x02dc2e1d": "queuePayment(bytes)", "0x86bb7121": "getBlocksPerRound()", "0xacfdfd1c": "deploy(uint256,string,string,address)", "0x7d298ee3": "beforeExecute(address,uint256)", "0x5023d124": "TestFactory()", "0x827ef325": "_parseMsgData(bytes)", "0xd35b9d83": "codeAt(address)", "0x26161670": "donkeyRanking(uint256)", "0xe0834ea4": "WatchBalanceInEther()", "0xd44f2d3d": "getInitialWithdrawalDone()", "0x4f223fe3": "StatefulFactory(string,string,string)", "0x91cd242d": "setMeta(bytes32,bytes32,bytes32)", "0x9a97043b": "depositIdx(address)", "0x85db2dda": "PayoutQueueSize()", "0x423e1298": "setDoNotAutoRefundTo(bool)", "0xb7a97a2b": "isValidChannel(uint256)", "0xc1441172": "setBlackFlagRequest(uint256,uint256)", "0x53d9d910": "create(address[],uint256,uint256)", "0x64d905c0": "awaitingParticipants()", "0x718bd6dd": "setRequestUntil(uint8)", "0x5a353193": "KrakenPriceTicker()", "0xfb099c84": "newInvestor()", "0xd264e05e": "forward()", "0xcd9f05b8": "balanceEtherAddress(address)", "0xa1da2fb9": "retrieveDAOReward(bool)", "0x60708ae3": "issueAndCommit(address,address,uint256,uint256)", "0x109df68e": "rotateBitsRight(bytes,uint256)", "0x793cd71e": "cashOut()", "0xd3017193": "addUser(address,uint256)", "0xaacf5328": "setVideoID(string,uint256)", "0xb56e1bca": "setExchangeToken()", "0x9341231c": "sendOrThrow(address,uint256)", "0xaed8f3da": "partsPerBillion(uint256,uint256)", "0xdcff5581": "NewFeeAddress(address)", "0xbbe4fd50": "getNow()", "0x3df16377": "make_move_and_claim_victory(uint256,uint8,uint8,uint8,uint8,uint8,uint8,uint8)", "0x5ae5df8f": "deleteRef(string)", "0x6d853ab6": "isSubUser(address)", "0x28472c6c": "claimComputation(bytes,bytes)", "0x2c215998": "updateStatus(string)", "0x7eff1465": "setAccountAllowance(address,address,uint256)", "0xd5089396": "Token(string,string,uint8,uint256)", "0xd1f7a4e4": "createCertificate(bytes)", "0x8c0e2a31": "regProxy(address)", "0xa819819b": "sweepDeityCommission(uint256)", "0x2b861629": "storeBlockHeader(bytes)", "0x25d4bdeb": "LookAtCollectedFees()", "0x5dddea66": "updateState(uint256,uint8,uint256)", "0x3ccfd60b": "withdraw()", "0x6795dbcd": "getAddress(bytes32,string)", "0x9b9ba572": "oraclize_query(string,string[3])", "0xa925d85e": "Exchange(address,address)", "0xbfe8c107": "betOnDozen(bool,bool,bool)", "0x1af716ba": "transferFrom(address,address,uint256,string)", "0x67eae672": "sendCoinFrom(address,uint256,address)", "0x311d5a2a": "recordBalance(address)", "0x7ca823d5": "getAverageChainWork()", "0x19483cd1": "checkHash()", "0xd366fbab": "startLottery(bytes32,uint256,uint256,uint256,uint256,bool)", "0x4d70d1d7": "generateId(uint256)", "0xe13dc28b": "testValidTransfers()", "0x12065fe0": "getBalance()", "0xdd67a360": "OrderLifeCycle()", "0xd7c23572": "historyTimesPlayed(address)", "0x2675c123": "CloseContract()", "0x1381e400": "cancel(uint32)", "0xa48a663c": "transferFromToICAPWithReference(address,bytes32,uint256,string)", "0xb03260be": "scheduleTransaction(uint256,address,bytes)", "0xb37217a4": "getRandomNumber(uint256)", "0x5c54305e": "InsufficientFunds(address,uint256,uint256)", "0x17e1b09b": "minimumDeposit(uint256)", "0x10c4e8b0": "all()", "0xa31d5580": "Registrar(address,bytes32,address)", "0xbe6307c8": "getDraw(uint256)", "0xc985c221": "get_all_levels()", "0x91b7f5ed": "setPrice(uint256)", "0xe42def21": "CryptoHill()", "0x738486bd": "BeerCoin(uint256)", "0xe422ebe9": "getBot()", "0x67dd74ca": "buyTicket(uint256)", "0x276b94e1": "copypaste()", "0x39aaba25": "get_status()", "0x7ed19af9": "multiAccessRevoke(bytes32)", "0x4c1b2446": "transmitInteger(address,bytes,bytes,uint256,uint16)", "0xd014c01f": "enter(address)", "0x1d49e081": "EXECUTE_EXTRA_GAS()", "0x9dafbc13": "initBlock(uint256)", "0xc7e22ac4": "setOracleGas(uint256)", "0xa3053236": "SafeInvestments()", "0xf42ac1de": "minQuorum(uint256)", "0x04d91c6a": "testFail()", "0x0e662cf0": "buyTokens(uint16)", "0x1ef0625b": "player_2(uint256)", "0xcec1365a": "ShortLimit(uint256)", "0x340f5e4e": "get_all_num_levels()", "0x3e2729bf": "isRevocated(bytes)", "0x5a1cc358": "getChannelRank(address,uint256)", "0x4d366398": "runPeerBalance()", "0xaf9a3f9b": "hashName(string)", "0x33298e25": "invoke(uint256,uint256)", "0x63def590": "untrustClient(address)", "0x836d6d66": "WeeklyLotteryB(address,uint256)", "0x7f497550": "scheduleTransfer(address,uint256,uint256)", "0xf9e05ed9": "sha(uint128)", "0xf6458c6a": "toZ1(uint256[3],uint256)", "0xf41017fc": "finalize(uint24)", "0xeeb57139": "CollectMoney(uint256)", "0xfdacd576": "setCompleted(uint256)", "0xb7266456": "StandardToken()", "0x6a8c2437": "totalRescues()", "0x1fdf6e0c": "protectKingdom()", "0xcf31e9fe": "getOutputHash()", "0xc8117b5b": "extractBalanceOfLength()", "0x0674763c": "assert(bool)", "0x87def081": "getFeeRecipient(int256)", "0xc63ff8dd": "claim(bytes)", "0x329bfc33": "getCurrentWinner()", "0x3d6a3664": "setNewOracle(address)", "0xdaa21e0e": "testBitSetSuccess()", "0xbf8783e0": "callAndGetReturn(address,bytes,uint256)", "0xb06df18e": "transfer(bytes20,address)", "0x00100a18": "NewPoll(string,string,uint256,uint256)", "0x2ffb8631": "getReleaseLockfileURI(bytes32)", "0x6716a692": "setDVIP(address)", "0xe8223468": "sha3clone(bytes)", "0x0aeacb5e": "getTotalRecords()", "0x29e30910": "testThrowCreateExistingNonce()", "0x240ecad5": "transferViaProxy(address,address,uint256)", "0xa33d4968": "Tripler()", "0x8caaaae6": "totalWeiPrice()", "0xf28a7912": "quick2()", "0xcbe9ef39": "BasicCoin(uint256,address)", "0xea3d2827": "selectWinner(string)", "0x92e9fd5e": "ColdWallet(address,address)", "0xcd5e3c5d": "roll()", "0x4a82534b": "create(address,address,address,uint256,uint8,uint8,uint256)", "0x5ccd2f9b": "_deleteAllPackedRevisionBlockNumbers(bytes20)", "0x9380b8e7": "testFailAddingMembers()", "0x31b0795c": "registerAddress(address,address)", "0xb76e4890": "Tester()", "0x29c08ba2": "payPremium()", "0xd7f31eb9": "forward(address,uint256,bytes)", "0xd7ef1356": "best_adjustment(bool)", "0x48d9a374": "blockTransfer(address,uint256)", "0x88b9e10e": "seizeTokens(address,uint256)", "0x8736fd16": "getRefStatus(uint256)", "0x2b30d2b8": "invoke(uint256)", "0xd4e78272": "Draw()", "0x0257c48c": "meta(bytes32,bytes32)", "0xc1246d39": "simulatePathwayFromBeneficiary()", "0x699b328a": "randomize()", "0xa200dc73": "getNextShareholder(address)", "0x9a7a7c11": "makeRoll(uint256)", "0x2bf1f9da": "restart(bytes32,bytes)", "0x943a32bc": "Relay(address)", "0x93503337": "isAllowed(bytes32,uint256)", "0xe97b2190": "add_wall(uint16)", "0x0448f79f": "addOptionChain(uint256,string,uint256,uint256,bytes,address,int256[])", "0xc0df77d0": "getRefName(uint256)", "0x27121069": "verify(bytes,uint8,bytes,bytes)", "0xb7009613": "canCall(address,address,bytes4)", "0x0295d71b": "currentDepositLimit()", "0x35ee2783": "Alarm()", "0x71b6663e": "play1(address,uint256)", "0x0178fe3f": "getData(uint256)", "0x489306eb": "oraclize_query(string,string)", "0xfce59d0c": "MangoRepo()", "0x8efc777f": "isBeta(bytes)", "0x1f7b8622": "getVotingDeadline()", "0x76da5667": "admin_kill()", "0x152cf9db": "getDataPoint(int256,uint256,uint256)", "0xd09de08a": "increment()", "0x64ee49fe": "scheduleCall(address,uint256,bytes4,uint256,uint256,uint8)", "0xd9fe60f3": "DTHPool(address,address,uint256,string,string,string)", "0x6b4dd158": "getPrice(bytes)", "0x0a80ef45": "getIsClosed()", "0x51fdaf92": "checkExpiredfunds()", "0x694e0d5b": "StringPasser(uint8[])", "0x0e1d88fc": "addTender(uint256,uint256,address,uint256)", "0x53850db3": "getParticipantById(uint256)", "0xb6cb405b": "getContractor()", "0x4c6b25b1": "results(bytes32)", "0x1c4e6cd0": "NameReg()", "0x53aab434": "buyIn()", "0x1ebe5c0f": "sendWithAllOurGasExcept(address,uint256,uint256)", "0xd98b9bb5": "placeBid(address,uint256)", "0x02e8d8c0": "scheduleTransaction(address,uint256,uint256)", "0x8a120dc9": "testBitEqualFailIndexOOB()", "0x33f707d1": "ownerWithdraw(uint256)", "0x98e00e54": "getCallWindowSize()", "0x4da74ee6": "setVoteIntention(uint256,bool,bool,string)", "0x6617e11a": "NiceGuyTax()", "0xfe13a823": "computeResponseFirstHalf(uint16)", "0xf7bd2361": "LookAtBalance()", "0xb09bc3bf": "try_to_get()", "0x0cee22e9": "testSetBalanceSetsSupply()", "0xae404996": "oraclize_query(string,string[3],uint256)", "0x2ad95786": "winner(address)", "0xe5fe4f31": "buy(uint8,bytes32,bytes32)", "0xe23941bc": "testDepositWithdraw()", "0xfc89aff6": "submitVerifiedUsers(address[])", "0xddf187b0": "dogFight()", "0xb5f5962a": "CALL_GAS_CEILING(uint256)", "0x92093dd6": "getLastResult()", "0xbfad16f4": "new_offer(uint256,uint256)", "0x01df7f30": "validateProposedThroneConfig(uint256,uint256,uint256,uint256)", "0x4054f5de": "EthVentures3()", "0x244c23ee": "Token(uint256,string,uint8,string)", "0xc3daab96": "withdrawBond(uint256)", "0x5fa21f1f": "enableBetting()", "0x3b591ea7": "AmountToForgeTheNextBlock()", "0x8c3c4b34": "getSaleStatus()", "0x7429f1eb": "multiAccessSetRecipientD(address,address)", "0xf99ff4df": "paged(uint256,uint256)", "0x2a64fb63": "getSaleDate(bytes)", "0x749f9889": "changeAllowedRecipients(address,bool)", "0x053c351b": "oraclize_getPrice(string)", "0x19663f7f": "TransferAmountFromBankAccountToAddress(uint256,address)", "0x5292c1a9": "testThrowsRestartEnforceRevisions()", "0x68f2ab8e": "Currency(string,string)", "0xd6e0bf29": "OwnerDeposit()", "0x94c3fa2e": "getLastBlockHashUsed()", "0x45362978": "query1(string,string)", "0xaff21c65": "getMinimumEndowment(uint256)", "0xe33c7ae2": "scheduleTransaction(uint256,uint256,bytes)", "0x9eb9dd3b": "getBetsProcessed()", "0x3807ba1b": "poi()", "0x7281854d": "GetCategoryValue(uint8)", "0x45ee49b9": "getUltimateOutcomes(bytes)", "0x0109f22e": "CrowdSale()", "0x98596726": "note(uint224)", "0x06900c41": "ZeroPonzi()", "0x3df76482": "fipsPublishData(bytes20,bytes)", "0xe0429b6c": "ShinySquirrels()", "0xa4a7cf5c": "redeemWinnings(bytes32)", "0x2e898ddc": "validateTemporalUnit(uint256)", "0x3af75ee1": "storeBlockWithFee(bytes,int256,bytes,int256)", "0x43e6125d": "Badge(address)", "0x75a6a332": "testThrowRetractNotRetractable()", "0xbed411a0": "CheckPrize(address)", "0x16f3cb5e": "__kill()", "0xe8efc1a0": "updatedValue(bytes32)", "0x9c7264d7": "fillOrder(address,uint256)", "0x9a0af2ec": "getStLength()", "0xf62cce34": "_clearRecordHierarchy(uint256,bytes32[],bytes32)", "0x940f851c": "Ballot(uint8)", "0xd96e5565": "testThrowsRetractNotRetractable()", "0x3a314b24": "SendETH(address)", "0xbd8c1d33": "checkTransferFromToICAPWithReference(address,bytes32,uint256,string)", "0x01da73ff": "isValidChannel(bytes)", "0x8f8bde82": "MicroDAO()", "0x2973e372": "isAlphaUpper(bytes1)", "0x1d2b7155": "activateImportFeeChargeRecord(address)", "0x06ab5923": "setSubnodeOwner(bytes32,bytes32,address)", "0x9d7d6667": "multipliers()", "0x8af49ab7": "maintain(uint256,uint256)", "0x1f3a3a53": "mint(int256,uint256)", "0x74389991": "breakit()", "0x64371977": "set(uint256,string)", "0x3fa6497f": "AdminAddFunds()", "0xba7dc45f": "_removeOperation(bytes32)", "0xf81d087d": "prepareLottery()", "0xd239ea8b": "getSchemasLenght()", "0xa2f3ede2": "computeNameHash(bytes)", "0xa28ecf0b": "sendCryptedHand(bytes)", "0x003b9d88": "setLowerFeePercentage(uint8)", "0x98ea5fca": "depositEther()", "0xb9a0a708": "testChargesAmountApproved()", "0x55291dbd": "claimEther()", "0x2d2800f1": "react()", "0xa9d2293d": "lastClaimBlock()", "0xc45aa04c": "queryShareholders(bytes,uint256)", "0x67af1c81": "getRoundIndex()", "0x50b7b7a2": "setRating(bytes32,uint256)", "0x0aa7881a": "MintableToken(int256,uint256)", "0x0eb3f5a0": "sweepCommission(uint256)", "0x97d47a60": "registerAccountant(bytes,address)", "0xe2c61114": "setImportFee(address,uint256)", "0x6dbe31eb": "testSubBalance()", "0xf5c98aff": "GreeterB(bytes)", "0x79216f5f": "add_monster(uint16,uint16,uint16)", "0x023c23db": "getSize(uint256)", "0x0e1ca8a5": "Oraclize()", "0xa05e822a": "howManyOwners()", "0x313b7b19": "finance()", "0x51a5f2f2": "ConsultingHalf(address,address)", "0x1fb6e99d": "paymentNeeded(uint64)", "0x2bffc7ed": "add(string,address)", "0x5c52c2f5": "resetSpentToday()", "0x39cdde32": "ecverify(bytes32,bytes,address)", "0x64e24f4b": "UpdateClientTokenAccount(address)", "0x0d2560ee": "addMe()", "0xd8589be3": "CoinFlipper()", "0x3b46a7df": "ivote(bool)", "0xa6823189": "parseAddr(string)", "0xd0c24e93": "setNotUpdatable(bytes20)", "0x1f13de92": "inEther(uint256)", "0xb6ce5581": "oraclize_query(string,string[5],uint256)", "0x31ae0019": "KissBTC()", "0xdabf7dc8": "PayoutDividendEarly(uint256,bool)", "0xe3da41b5": "sortWinningNumbers(uint8[5])", "0x8ea98117": "setCoordinator(address)", "0xeff6be2f": "changeBaseFee(uint256)", "0x483a83df": "setKYC(address)", "0xf98a4eca": "executeVote(uint256)", "0x776d1a01": "unvest(uint256,uint256,uint256,uint256,uint256,bool)", "0x1cf52f2b": "isActiveRegistrant(address)", "0x24c9bf5e": "Prizes()", "0xb3822da8": "getContents(uint256[])", "0x999a9965": "setMany(uint256,int256,uint256,bytes,address,bytes)", "0xbade6033": "propose(bytes,uint256)", "0xd38159b8": "testPass()", "0xdabf7ec4": "helper(uint256)", "0xf4993bbd": "executeEmergencyWithdrawal()", "0x46ddb7db": "setAccountBalance(address,uint256)", "0xc12af1ce": "fipsRegister(uint256,bytes)", "0x8f420866": "DEFAULT_SEND_GAS()", "0x62770252": "needsFuneral(uint256)", "0x32921690": "checkDepth(address,uint256)", "0xb3c1a588": "parseMsgData(bytes)", "0x29cd5777": "_tryEraseSingleNode(bytes32)", "0xc6e0c908": "checkTransferFromWithReference(address,address,uint256,string)", "0x9bd99195": "multiAccessChangeOwner(address,address)", "0xa360b26f": "Migrations()", "0x6c6f1d93": "getContractCreationValue()", "0x5445e38c": "_isCycleValid(uint256)", "0x2c85f8e0": "oraclize_query(string,string,string,uint256)", "0xcdda62ad": "FutureBlockCall(address,uint256,uint8,address,bytes4,bytes,uint256,uint256,uint16,uint256,uint256)", "0xc8fdc891": "numberOfMonarchs()", "0xf578fd85": "assertEq0(bytes,bytes)", "0xda311588": "getCoin(uint256)", "0x9a35f886": "__dig_then_proxy(uint256)", "0xfa14df6b": "getChangeRecipientFee()", "0x95f0684b": "getPackageNameHash(uint256)", "0x42909a9e": "create_game()", "0x51582ef3": "sendProxyTransaction(address,uint256,uint256,bytes)", "0xc4e41b22": "getTotalSupply()", "0x110df916": "getChannelID(uint256)", "0x4dc3141b": "CalcAll()", "0xb88a802f": "claimReward()", "0x82b2e257": "getTokenBalance()", "0x9bb0e4df": "getUint(int256,bytes32,string)", "0xc1ae4044": "checkBetColor(uint8)", "0x4a8b5389": "allocateBountyAndEcosystemTokens()", "0xdf06f906": "numBets()", "0xdeb80111": "transfer_asset(address,uint256)", "0x5216aeec": "totalInvested()", "0xe2deaa81": "set_reference(uint256,uint256,uint256)", "0x2ffda1e0": "setBlackflag(uint256,bool)", "0xba45b0b8": "transfer(address,address)", "0x7d7c2a1c": "rebalance()", "0xf32efd3c": "recoverUser(address,address,uint256,uint8,bytes32,bytes32)", "0x4571d4c4": "FutureCall(address,uint256,uint16,address,bytes,bytes,uint256,uint256,uint256)", "0x5fc5d48b": "burnUnsoldCoins(address)", "0x4da47ba0": "TokenSale(address,uint256)", "0x3d9ce89b": "scheduleCall(bytes4,bytes,uint256)", "0x6662e4be": "isWinningBet(uint256)", "0xa501e88d": "Content()", "0x4b70cec4": "getTime(address)", "0x12253a6c": "stopContract()", "0x173825d9": "removeOwner(address)", "0x26121ff0": "f()", "0x7b647652": "LittleEthereumDoubler()", "0x0c5c2ca3": "getIndexName(bytes)", "0x90f2c86d": "convertToWei(uint256,string)", "0x83f95f13": "openClaim(string)", "0xe8b5e51f": "invest()", "0xfdc4b338": "authorizeExtension(uint256,bool,string)", "0x4e116eb8": "unRegisterCertificationDb(address)", "0x5c8a1053": "extend(string)", "0xa932ed0d": "whitelistRemove(address)", "0xa1188e56": "getCurrentDifficulty()", "0xbf1fe420": "setGasPrice(uint256)", "0xead710c4": "greet(string)", "0x144fa6d7": "setToken(address)", "0x42402c2c": "fipsTransferMulti(bytes20[],address)", "0x93e84cd9": "play()", "0x741b3c39": "depositBond()", "0x23306ed6": "getMinimumBond()", "0x5f2e686d": "Ethereum_eight_bagger()", "0x9890220b": "drain()", "0x233120aa": "getChainyURL()", "0xe9dc0614": "vote(bytes)", "0x4df53a0f": "testSetApprovalDb()", "0x5fe27ab0": "createHKG(address)", "0xb56b2627": "add_owner(uint256,address)", "0x6f9a023c": "theultimatepyramid()", "0xc8796572": "collectFees()", "0xea3ebae6": "getConfigBool(bytes32)", "0x213ac932": "addUser(address,uint256,uint8,bytes32,bytes32)", "0xfae9d06d": "calculateTxFee(uint256,address)", "0x45d27edf": "forward_method(bytes,address,uint256,bytes)", "0x8e9ccd04": "computeIndexId(address,bytes)", "0x2f6ae467": "transferDocument(bytes,address)", "0x6e353a1d": "emergencyWithdrawal(address)", "0x7dd56411": "ownerOf(bytes32)", "0x9dc35799": "updateReading(uint256)", "0x246c02e6": "check_depth(uint16)", "0x03d22885": "scheduleCall(address,uint256,bytes4,uint256,uint256,uint8,uint256)", "0x881be8f7": "undo()", "0x953307d8": "revealScissors(string)", "0x7af30442": "testToggleBitFailIndexOOB()", "0x1e0c7ed4": "setConfigBool(bytes32,bool)", "0x2e3be78d": "setPrecisionDirect(uint8)", "0x95a078e8": "hasAccess(address)", "0x245a03ec": "scheduleSetIt(uint256,uint256)", "0xb863bd37": "random(uint256)", "0xa5e62f02": "fallbackRP()", "0x618fa9ce": "getBotBillingIndex(uint256,uint256)", "0x06909f69": "cancel(string,uint256)", "0x2b198366": "addCertifier(address)", "0x57e871e7": "blockNumber()", "0x2b98222e": "getInstitutionByAddress(address)", "0x89eedf00": "setPdfHash(bytes,bytes)", "0x7ac4b05e": "returnMyMoney(uint256)", "0x7fc90182": "Pool(uint256)", "0x291e6777": "sendVote(uint256,uint256)", "0x579badf6": "UniversalFunction(uint8,bytes32,bytes32,bytes32,bytes32,bytes32)", "0xe1f21c67": "approve(address,address,uint256)", "0xa1b9af31": "unlockBets()", "0x92d0d153": "t()", "0x095ea7b3": "approve(address,uint256)", "0x9cb31079": "setLowLimit(uint256)", "0xb971b4e5": "setNotTransferable(bytes20)", "0x2a745971": "BlockKing()", "0x582ca57b": "get_associations()", "0xa0d605c6": "addCertificationDocumentInternal(address,bytes32)", "0x85233869": "NumberOfMiners()", "0xb0349184": "clearRecords(bytes32[])", "0x3e8f5b90": "setConfig(string,uint256)", "0x7c73f846": "getMinimumEndowment(uint256,uint256,uint256)", "0xcc9ae3f6": "getMyReward()", "0xac900c2d": "unregisterSeller(address)", "0x306df22d": "GPSDestination(int256,int256,uint256)", "0x5e968a49": "ownerSetMaxProfitAsPercentOfHouse(uint256)", "0x80dcaf27": "getRefNumber()", "0x4245b0f7": "Lottery()", "0xe46164c5": "waitingForPayout()", "0xa8c3ec48": "oraclize_query(uint256,string,string[2])", "0x58ea80e5": "setThroneCreationPrice(uint256)", "0x8a4fb16a": "getWithdrawal(uint256)", "0x4464aec7": "testTryGet()", "0xf3c37bd5": "Verifier(address,uint256,uint8)", "0xb4c4e005": "testTransferToAcceptAuthority()", "0x346b306a": "oraclize_query(string,string,string)", "0x24032866": "checkExecutionAuthorization(address,uint256)", "0x509f8633": "create_account()", "0x26da8e17": "ownerUpdateCostToCallOraclize(uint256)", "0x74a93e6c": "setTokenHolder(address,address)", "0x1baaeb91": "getSignature(bytes4,uint256)", "0x337c1e28": "getIndexRoot(bytes)", "0xac92fdb5": "getSaleDate(bytes16,uint256)", "0x13b2663b": "cash_received(string)", "0x68e4bd99": "testSetBitSuccess()", "0x20620f37": "onAuctionEnd(string)", "0x85528394": "currentClaimPriceWei()", "0x1995333b": "burnFunds(uint256)", "0x5184ffc9": "setAmbiAddress(address,bytes)", "0x269975d0": "GameDetails(uint256)", "0x29274fe1": "buyBOTx(uint256,string,string,address,uint256)", "0x720c4798": "workshop()", "0x6f9a5eab": "createTx(uint256,address,uint256)", "0xb66a323c": "claimThrone(string)", "0x14cabddb": "joinProof(uint256)", "0x76e4ca0d": "voteQuorum(uint256,bool)", "0xbcb3b5d2": "getGamblesList(uint256)", "0xf2080ba6": "Pong(int8)", "0xab470f05": "getCaller()", "0xe0b1cccb": "updateBalance(address,uint256)", "0x4889ca88": "receiveApproval(address,uint256,address)", "0xbc4b3365": "addFunds(address,uint256)", "0x5d1a3b82": "getOutcome(bytes32)", "0x8204ecdd": "getFee(bytes)", "0x49aa4ee2": "removeVote()", "0x9131d803": "testSetFrontend()", "0x72929b56": "getKudosPerProject(address)", "0x287418e7": "query(uint256,uint16)", "0xbb7859b5": "periodThree()", "0x7dc5cd32": "_patternToNumber(bytes)", "0xf7ea7a3d": "setTotalSupply(uint256)", "0xb3f98adc": "vote(uint8)", "0x655388be": "walkTowardsBlock()", "0x856deacf": "findTag(string)", "0xcaab0acc": "testThrowCreateRetracted()", "0xede8ebf3": "checkApprove(address,uint256)", "0x4296a9cb": "getNodeRightChild(bytes)", "0x03cf4fd6": "expire(uint256,uint256,uint8,bytes32,bytes32,bytes32)", "0x87045369": "setCanCall(address,address,bytes4,bool)", "0x0ed21029": "getIssueAssignee(uint256,bytes32)", "0xc5958bda": "removeFile(bytes)", "0xa8026912": "setSource(address)", "0x05a5b8c6": "verifyTx(bytes,int256,int256[],int256,bytes,int256,int256[],int256)", "0xed3058e0": "transferRight(address,bytes)", "0xba487e62": "newCampaign(uint32,uint96,uint16,uint16)", "0xd6c19fe0": "build(bytes,uint256,uint256,address)", "0xebb741cb": "getChannelSize(uint256)", "0x3b996f40": "quarter(uint32,uint32,uint32,uint32)", "0x0b7373d6": "giveAllBack()", "0x3f887fad": "buyShares(uint256,uint8,uint256,uint256)", "0xb5deeca7": "BaseRegistry()", "0x6dd6e87b": "checkOut(int256)", "0x90a85119": "checkBetResult(uint8)", "0x724121ae": "contentExists(uint256)", "0x67bd69a6": "getLastDuel2()", "0x821e9169": "testFailControllerChargeMoreThanApproved()", "0x083ae1fe": "setPackage(string)", "0x8eaa6ac0": "get(bytes32)", "0xf42aa287": "getBlobStore(bytes12)", "0x32a2c5d0": "getContractAddress()", "0x69d89575": "releaseFunds()", "0x984ac378": "lotteryTitle()", "0x3baf4e1e": "newPayment(uint256,uint256)", "0x938c4307": "scheduleCall(bytes4,bytes,uint16,uint8,uint256,uint256,uint256,uint256,uint256)", "0x47372325": "getChannelSize(address)", "0xcb10e0c5": "getLastDuel1()", "0x1a0919dc": "unregister(bytes32)", "0x6a3c1198": "_projectCancelNew()", "0x976b01c0": "setNotRetractable(bytes20)", "0x44d03ac6": "BlockhashFetch(address)", "0xb0fd935b": "registerCertificationDb(address)", "0x2c7c4549": "PurchasableToken(uint256)", "0x3e0a51b4": "TweetAccount()", "0xc5f310c0": "register(bytes12)", "0xc10dd4c6": "getEvents(bytes32[],address)", "0x37a6b9f8": "recordCallback(address,uint256,bytes,bytes)", "0x1b9265b8": "pay()", "0xc91d7e9c": "getFee(bytes32[])", "0xf6c5c80d": "cleanUp()", "0x590e1ae3": "refund()", "0x9c709343": "split(bool,address)", "0xe68d3ae3": "escrow(uint256,string,address,uint256)", "0xa1cb31b7": "_state()", "0xfbac3951": "isBlocked(address)", "0x29dfdded": "addNewDonkey(address)", "0x7bc49a95": "play(uint256,uint256)", "0x5329c681": "checkTimeout(uint256)", "0x7c05caf3": "testCreateCostAuth()", "0x8606f905": "balanceOf(address,bytes)", "0xbe45fd62": "transfer(address,uint256,bytes)", "0xd7130651": "getCity(uint256)", "0xb2353d69": "updateRightLottery(address)", "0x01bb85a4": "__startBlock(string)", "0x4316abbb": "newJester(address)", "0x5c3e426c": "adminRetrieveDonations(address)", "0x293ffca3": "AddressReg()", "0x4156fdb7": "createSwap(uint256)", "0x2852b71c": "accept()", "0x027a5e3f": "getLastVersion(bytes)", "0x3d90d44d": "addPowerSource(address,uint256,uint256)", "0x1ab06ee5": "set(uint256,uint256)", "0x50f07cf9": "setReadingDelay(uint256)", "0x669e48aa": "get(uint256,uint256)", "0xdea9c72b": "getLatestPreReleaseTree(bytes32,uint32,uint32,uint32)", "0x60f66701": "useCoupon(string)", "0x2431f164": "process_payment()", "0x17623e5b": "unauthorizeManager(address)", "0x367bbd78": "strlen(string)", "0xbab86ea8": "test(string,string)", "0x25f3da52": "GetBankAccountNumber()", "0xebb045fa": "PublicResolver(address)", "0xdd57d5c5": "setTrust(address)", "0x22e803c2": "transferBounty()", "0x12c8052f": "won()", "0x3535cd52": "setDailyCosts(uint256)", "0x92d8c8cf": "setupImportFee(address,uint256)", "0x53caf582": "testThrowSetNotUpdatableNotOwner()", "0xb3ade772": "shipProducts(string,string)", "0x61472fd4": "CSGOBets()", "0x5c7c9aa4": "checkAccountState(address)", "0x6560a307": "suggestedGas()", "0xd0d552dd": "setAsset(address)", "0xc02f081a": "shiftBits(bytes,int256)", "0x9348cef7": "reveal(uint256,uint256)", "0x5ca1c5a0": "getNodeValue(bytes)", "0x34c1b4ba": "sha(bytes)", "0xe0117441": "setRegistrationPrice(uint256)", "0x92698814": "reserved(bytes32)", "0xaa1e84de": "hash(bytes)", "0x2125b65b": "transfer(uint32,address,uint224)", "0x9f9eac67": "ChangeName(string)", "0x7eb69ba1": "hint(int256,bytes32,string,bytes20)", "0xc6888fa1": "multiply(uint256)", "0xa9059cbb": "transfer(address,uint256)", "0x84c344fe": "_register(bytes4,string)", "0x744d8b4f": "recordWin(uint256,uint256)", "0xad1ef61e": "donkeyInvested(address)", "0xb4787dc5": "linkEID(bytes,bytes)", "0x7b1cbb13": "getChannelValue(bytes)", "0xd0febe4c": "buyTokens()", "0x74f519db": "setLastTimestamp(uint256,uint256)", "0xe30081a0": "setAddress(address)", "0x6fd902e1": "getCurrentBlockNumber()", "0x25d8dcf2": "betAndFlip()", "0xc062f578": "updateStage()", "0xe0cfc05c": "testThrowsRetractLatestRevisionDoesntHaveAdditionalRevisions()", "0x854f4817": "buyKissBTCWithCallback(address,uint256)", "0x58b1f29c": "refundBounty(uint256)", "0x0645b5d5": "getMyShareholderID()", "0xe9c63b9c": "requestPeerBalance()", "0x1b03316f": "getSecond()", "0xbcc6092a": "MyEtherBank()", "0x1cf43b63": "extractExportFeeChargeLength()", "0x5e58f141": "shares(address,bytes,int256)", "0x6103d70b": "withdrawPayments()", "0x3e0663e0": "AdminDrawProcess()", "0xa0f029fc": "ContractorInterface(address,address,address)", "0xe604cf9f": "get_all_squares()", "0xd13d1ace": "scheduleCall(bytes,bytes,uint16,uint8,uint256,uint256,uint256,uint256,uint256)", "0xb74bc710": "LuckyDoubler()", "0x611f69de": "__proxy_motion(address,uint256,uint256,bytes)", "0xbb814e9e": "versionExists(bytes32)", "0x545e7c61": "deploy(address,address)", "0x1b437d0c": "compareLastCalldata(bytes)", "0x845051d3": "testContractsNotNull()", "0x23de6651": "emitTransfer(address,address,uint256)", "0xd78c20ff": "voteApprove(uint256)", "0x6f13e01b": "EthVenturePlugin()", "0x1f6b0a9d": "getReleaseLockfileURI(string,uint32,uint32,uint32,string,string)", "0x13d4bc24": "buyTokenProxy(address)", "0xd509b16c": "testWithdraw()", "0x2f54bf6e": "isOwner(address)", "0xf60381a1": "stra2cbor(string[])", "0x34dbe44d": "getLastBlockNumberUsed()", "0x28dcfdac": "getSignsCount(uint256)", "0x2888f9d0": "updateMaxBet()", "0xc3b2556d": "lookup(bytes)", "0x6fbaaa1e": "currentMultiplier()", "0xe241c1d9": "deriveKey(uint256,uint256,uint256)", "0x5b37e150": "create(bytes32,bytes)", "0xa1c95ac2": "GSIToken(uint256,string,uint8,string,address)", "0xfc9e53df": "setNextRegistrar(address)", "0x34e8980f": "bootUpHangouts()", "0x457dd8b3": "setMasterKey(address)", "0xdb833e3a": "sellShares(bytes32,uint8,uint256,uint256)", "0x1e5330ca": "checkBetResult(uint8,address,bytes32,bytes32)", "0x4a00a522": "homebase(int256,int256)", "0xb938bf42": "sendBounty(bytes32)", "0x46be96c3": "amountFilled(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", "0x2fa00e58": "fipsTransfer(bytes20,address)", "0x95669952": "debtor(address,uint256)", "0x3f19d043": "getContributions(address)", "0xeb455dc6": "sendBitcoin(string,uint256)", "0x034cb28e": "addressOf(address,bytes)", "0x1e26fd33": "setBool(bool)", "0x1b55ba3a": "Start()", "0x6f3fe404": "updateBalances()", "0xc45b415e": "createRequest(address[4],address,uint256[11],uint256,bytes)", "0x180aadb7": "underLimit(uint256)", "0xb44bd51d": "getConfig(string)", "0x93d79105": "hashRelease(bytes32,bytes32)", "0x9f8a13d7": "isActive(address)", "0x257bcd6a": "placeBet(uint256,bytes32,bytes32)", "0xdd10d97e": "getPlayerWaiting()", "0x6d16f79c": "__transferWithReference(address,uint256,string)", "0x6ce1417e": "Fund()", "0x67beaccb": "scheduleCall(bytes)", "0x4b0697e4": "Manager(address)", "0x6a7fc8b7": "setDailyWithdrawLimit(uint128)", "0x7a6e9df7": "getTimestamp(bytes)", "0x797af627": "confirm(bytes32)", "0x81183633": "setStandard(bytes32)", "0x6a1db1bf": "changeFee(uint256)", "0x4e6ab570": "insert_order(address,bool,uint32,uint128)", "0xa4e2d634": "isLocked()", "0x7c79ebce": "expired(uint64)", "0x20965255": "getValue()", "0xfd408767": "fireEventLog4()", "0xcf6b3822": "WatchCollectedFeesInSzabo()", "0x8f7fe231": "ValidetherOracle()", "0xbf12165e": "fillUpSlot(uint256,uint256)", "0xdabdc1f2": "ChangeActiveDigger(address)", "0xe9e7a667": "get_stake(bytes32)", "0x0ad95b44": "bribery()", "0xdb6fcf01": "is_destroyed(uint256)", "0x4378a6e3": "getAttributes(uint256)", "0x71589d6b": "newponzi()", "0x47274dbe": "disableUser(address,address)", "0xb40a5627": "bidCount()", "0xf1eae25c": "mortal()", "0x13af4035": "setOwner(address)", "0xaf030d2c": "setResult(uint256,uint256,bytes32)", "0x098ab6a1": "snapshotCount()", "0x27cca148": "lastClaimedBlock()", "0x940c154b": "lockBet(uint256)", "0x378c0605": "buyTickets(address)", "0xbcfcb03e": "allocateFounderTokens()", "0x0138e31b": "_jAdd(uint256,uint256,uint256,uint256)", "0x0a7f4239": "getAccountFundContract(address)", "0xc96593a0": "The10ETHPyramid()", "0x22beb9b9": "scheduleDoIt(uint256)", "0xdb0e127a": "openDoor()", "0x3dc02266": "fipsRegister(uint256)", "0x7d242ae5": "setBasePrice(uint256,bytes)", "0xe82b7cb2": "proxySetCosignerAddress(address,bytes32)", "0xa60bbcd3": "ModelCoordinator()", "0xc26aa3c9": "lockUnicorn(uint256)", "0x96ff7e97": "requestIdentity()", "0x99753de7": "clear_level()", "0x69d79ad5": "moneySumAtSettlement(address,uint256,uint256,int256,uint256,uint256)", "0xda359dc8": "setBytes(bytes)", "0x6edb4cf6": "testThrowRetractLatestRevisionDoesntHaveAdditionalRevisions()", "0x9d170c5d": "getRef(string)", "0x11cd98ed": "convertToAllTable(uint256,string)", "0x67f809e9": "DynamicPyramid()", "0xd5f37f95": "sign(uint256,uint256,address)", "0xf5562753": "getClaimAmountForBlock(uint256)", "0xc9bbc8c0": "donkeyName(address)", "0x5858ef10": "testErrorNonOwnerCantBreach()", "0x74388347": "checkBetDozen(uint8,address,bytes32,bytes32)", "0xee564544": "_slotCancelNew()", "0xf3bb9741": "commitmentCampaign(uint256,bytes32)", "0x2b68b9c6": "destruct()", "0xa9b8f7b8": "ProtectTheCastle()", "0x16181bb7": "shortSellShares(bytes32,uint8,uint256,uint256)", "0xb524abcf": "totalSupply(bytes32)", "0x8006745b": "getPayout(address)", "0x137c638b": "getExtraGas()", "0x824d5603": "getIndex(uint16,uint16)", "0x245a6f74": "isProxyLegit(address)", "0x9eded57a": "paybackLast()", "0x7b1aa45f": "ownerDeposit()", "0x974654f4": "requiredGas()", "0x76d690bb": "BountyList()", "0xf4b2dfea": "Matching_Finneys()", "0xbd66528a": "claim(bytes32)", "0x85eac05f": "changeOwnerAddress(address)", "0xa69df4b5": "unlock()", "0xe6d9bb0f": "secondsUntilEnd()", "0xcd57a448": "SwapContract(address,uint256)", "0xb245fc92": "findNextMonth(uint256,bytes)", "0x7620f4bb": "fipsNotaryLegacy68b4()", "0x61886014": "combineDice(uint8,uint8)", "0xdf4ec249": "step3()", "0x2262cd94": "wroom()", "0x1099d3ec": "scheduleTransaction(uint256,uint256,uint256,bytes)", "0xd8c34127": "isKnownSignature(string)", "0x8afa08bd": "setDrawDate(uint256)", "0xdb18c972": "play4(address,uint256)", "0x2f30283e": "testSomething()", "0x8ca17995": "divest(uint256)", "0x1ef3755d": "restart()", "0x99bb875c": "funeralAndBirth(bytes,int256,bytes)", "0x157ad5a1": "canWithdrawBond(address,uint256)", "0xfd8055d2": "updateBOTBillingInfo(uint256,string,address,string,string,uint256)", "0xa10889fa": "setVersion(uint32,uint32,uint32,string,string)", "0x51cff8d9": "withdraw(address)", "0xbe999705": "addFunds(uint256)", "0x2e5d1042": "requestPayout(uint256,uint256,bytes32,uint256,uint256)", "0xb50954b6": "cancelWaitingForOpponent()", "0xc42cd8cf": "etherSplit(address,address)", "0x42ce1488": "upload(string)", "0xad04592e": "owner_deposit()", "0xc2cf7326": "hasConfirmed(bytes32,address)", "0x1dbf3bc7": "spend(uint256)", "0x36b81feb": "Deed(address)", "0xf47289e1": "_ecDouble(uint256,uint256,uint256)", "0x026993e0": "Midas(address,address)", "0x5e404de3": "setMaximumCredit(uint256)", "0x0194db8e": "sum(uint256[])", "0xa04a0908": "execute(address,bytes,uint256)", "0x2b4a3b31": "doTransferFrom(address,address,uint256)", "0x96ed10a4": "issuePOIs()", "0xb75c7dc6": "revoke(bytes32)", "0x6056969b": "announce(bytes32)", "0xd63547e6": "GetFreeCnt()", "0x788e26e7": "sponsorDeposit()", "0x550dd006": "calcCostsBuying(uint256,uint8,uint8,uint256)", "0xd4b1d19f": "testThrowsTransferDisabled()", "0x04706fdf": "giveContributionsBackProfitBugged()", "0x5d5483b3": "WatchAppliedFeePercentage()", "0x6bf8f85a": "forceFinish()", "0x3edd90e7": "NewOwner(address)", "0x7c69b5d1": "NewDeposit(uint256)", "0x866f6736": "trustedChildWithdraw()", "0xcdcb7c8f": "chase()", "0x60dccd89": "getContentAccount(uint256)", "0xbff1f9e1": "totalUsers()", "0x1aca00fd": "variable(uint256)", "0x6e658fbe": "myFundsExpireIn(uint256)", "0xddb1bdc8": "credit(address,uint256,uint256)", "0x934bc29d": "exampleFunction(uint256)", "0x113e6b66": "fipsAddToLedger(bytes20,address)", "0x1a88bc66": "slot()", "0xec97cff7": "addCertificationDocument(address,bytes32)", "0x0790e880": "setBlockappsAddr(address)", "0xe0ad411d": "assets(bytes)", "0x791b51f1": "Consulting(address,address)", "0xa26dbf26": "totalParticipants()", "0xb78b52df": "allocate(address,uint256)", "0xdb29fe12": "addShareholder(address)", "0x06459119": "testThrowsTransferNotTransferable()", "0xbadbaa3c": "setCallData()", "0x2c6b2c92": "checkProfitLossSinceInvestorChange()", "0x8aa6f1b1": "setUltimateOutcome(bytes32)", "0xecb98714": "random_damage(uint256)", "0x506e106c": "setToS(string)", "0xf0d474f9": "underdogCount()", "0x2212dbc3": "get_timestamp()", "0xd504ea1d": "getArray()", "0x9b29cb23": "getDailyPayment()", "0x9d3e069c": "StartDraw()", "0x12494160": "isHolder()", "0xbbd4e8c9": "numDeposits()", "0xfea2920e": "createNewDraw()", "0xff556ecb": "releaseUnicorn(uint256)", "0x3bed33ce": "withdrawEther(uint256)", "0xaa9669c1": "roll(uint256,bytes)", "0xa00aede9": "scheduleCall(uint256,address)", "0xc0819961": "Invest()", "0x1ed24195": "getPeriod()", "0x5babb758": "testSetUp()", "0xaaf9d13e": "buyTopDog(uint256,uint256)", "0x7c45ef6c": "stringToSig(string,string)", "0x7353f62b": "testGetApprovalDb()", "0xef7507c8": "testWinner(uint256)", "0x7ef95c6f": "extractAccountAllowanceRecordLength(address)", "0x66099706": "getChannelCred(address,uint256)", "0x5c242c59": "query1(uint256,string,string,uint256)", "0x299a7bcc": "setOwner(address,address)", "0xe1152343": "payout(uint256)", "0xd40a71fb": "step1()", "0xda9c6a46": "getReplyCount(uint256)", "0xffb7bfba": "watchProposal(uint256)", "0x2e1a7d4d": "withdraw(uint256)", "0x03da8902": "transfearDBOwner(address)", "0xc9bd2893": "fines()", "0xfdd3a879": "quick()", "0xda0774ad": "getCallFeeScalar(uint256,uint256)", "0x0f2c9329": "split(address,address)", "0xa3912ec8": "receiveEther()", "0xfd6f5430": "setContent(string,bytes32)", "0x99e0021f": "mergencyCall()", "0xb7aec6a5": "scheduleCall(address,bytes,uint256,uint256,uint8,uint256)", "0x23145ca0": "forceCheck()", "0xc7cf28fe": "canClaimTimeout()", "0x26db7648": "proposedVersion()", "0x60a60fd8": "testProxyCallWithValue()", "0x044d0b06": "oraclize_query(string,string[2])", "0x4f013184": "investInTheSystem()", "0x0c9fd581": "assertTrue(bool)", "0x09574810": "getOperationsNumber()", "0x6e2edf30": "ETCSurvey(address)", "0x3cc86b80": "GetMoney(uint256,address)", "0xf7b89a3e": "getTotalCosts()", "0xb18c6847": "manualUpdateBalances()", "0x8a65d874": "userStats(address)", "0xf80b3cfa": "checkBetLowhigh(uint8)", "0xc2def3b9": "getOrganizer()", "0x2dae9878": "BankOwner_EnableConnectBankAccountToNewOwnerAddress()", "0x1998aeef": "bid()", "0xc64e8bc0": "executeN(uint256)", "0xd4088e33": "setPrice(uint256,uint256,uint64)", "0xd263b7eb": "ownerkill()", "0xc478fc37": "EtherWheel(uint256,uint256,uint8)", "0x05b765ea": "getCertifierStatus(address)", "0x93c32e06": "changeFounder(address)", "0xf207564e": "register(uint256)", "0xae6c0b03": "canWithdrawBond(uint256)", "0x2b1071c9": "testTransferToNullAuthority()", "0xd9feeeb6": "fillMyOrder(uint256)", "0x9fb755d7": "setHotWallet(address)", "0x7f98444f": "randomEnd()", "0xf3fef3a3": "withdraw(address,uint256)", "0x48a0d754": "available()", "0x3af94817": "getPongvalRemote()", "0xec21a913": "setUint256(int256,uint256)", "0x6099af40": "setConfigBool(bytes,bool)", "0xf0cbe059": "proxyTransferFromWithReference(address,address,uint256,bytes32,string)", "0xf93589ce": "didWin(bytes)", "0x1eb5ea2e": "returnFunds()", "0xa6027d53": "IconomiTokenTest(uint256,string,uint8,string,uint256)", "0x8a323b38": "Contract(uint256,string,uint8,string)", "0xb0f07e44": "registerData()", "0xc9d27afe": "vote(uint256,bool)", "0x64265b1a": "share_transfered(string)", "0x78205f67": "testThrowTransferEnableNotTransferable()", "0x081780f4": "clearRecord(bytes32)", "0xdd137b5d": "toBase58(uint256,uint8)", "0x9483e91a": "withdraw(address,uint256,bytes,uint256)", "0xc6502da8": "basePayment()", "0xe17e1274": "testTransferToRejectAuthority()", "0x9af605cb": "__proxy(address,bytes,uint256)", "0x7a8df1b9": "getAffiliateInfo(address)", "0x46b305d6": "lockBetsForWithdraw()", "0x7d4cf602": "buildDSBalanceDB()", "0xce87f626": "replaceWizardRP(address)", "0x125b8f06": "isInNextGeneration()", "0xd0068f80": "getClient(uint256)", "0x7f0899f2": "AddTicket(bytes5[])", "0xb15dcc25": "query(address,bytes2,uint256)", "0x07a9574a": "changeLeaderMessage(string)", "0x16e55626": "getDogName(address)", "0xbc058968": "updateThingData(bytes32[],bytes32[],uint88)", "0x02aa274b": "setForward(bytes4,address)", "0x08f235ec": "getDefaultPayment()", "0x1dd4914b": "withdrawEtherOrThrow(uint256)", "0x7ca31724": "tokenId(address)", "0x0c4f65bd": "getOwnerAddress()", "0xeec3cb41": "placeBet(bool[],uint256,uint256)", "0x9054bdec": "toTimestamp(uint16,uint8,uint8,uint8,uint8,uint8)", "0x468f02d2": "getUnderlyingPrice()", "0x74331be7": "sete(address)", "0xb05e390a": "TokenEther(string,string)", "0x89cc5ea8": "bid(string,address,uint256)", "0xa8893a6e": "getNumOfSalesWithSameId(bytes16)", "0x3defb962": "heartbeat()", "0x15a03930": "TossMyCoin()", "0x1d8ae626": "Security(string,string)", "0xf1bca7a4": "doCall(uint256)", "0xae6215d8": "getBlockHeight(bytes)", "0x8124bb0f": "continueExecution()", "0xc1cbbca7": "contribute(uint256)", "0xa48566ba": "serverSeed(address,bytes)", "0xc0f5a9cb": "deleteThing(bytes32[])", "0x4136aa35": "isAlive()", "0x6fe665e9": "SlotMachine()", "0xfaff50a8": "rootNode()", "0xaf769eff": "Paper()", "0x77863b61": "CrossWhitehatWithdraw(uint256,address)", "0x2bed55b0": "buildDSEasyMultisig(uint256,uint256,uint256)", "0xd2ef7398": "challenge()", "0x96e4ee3d": "convert(uint256,uint256)", "0x2dff6941": "content(bytes32)", "0x4d536f9f": "validateNameExt(bytes)", "0xd4d5d32a": "collectFee()", "0x6620a935": "sendToOwner()", "0x5084da18": "fipsOwner(bytes20)", "0xe419f189": "multiAccessIsOwner(address)", "0xa9fbc614": "lookupTicketHolder(uint256)", "0x11f72496": "testT()", "0x7365870b": "bet(uint256)", "0x09861b81": "flooredSub(uint256,uint256)", "0xe28fed1e": "userRescues(address)", "0x28cc413a": "getProof(uint256,uint256,uint256)", "0x9a8f09bd": "newKing(address)", "0x5d068051": "sendFees(address)", "0x49cbe338": "tryRead(uint64)", "0x691bfc89": "goods(uint16,uint256)", "0xfc36e15b": "vote(string)", "0x48107843": "getNextCallSibling(address)", "0x6461fe39": "transferFromWithReference(address,address,uint256,string)", "0x804e11dc": "testThrowsDisownNotTransferable()", "0x76f30ca1": "toContentID(address,uint256,string,bytes)", "0xa77b2e37": "Coin()", "0x3f2f1596": "setupTreasury(address,uint256)", "0x3de9e4c6": "__transferFromWithReference(address,address,uint256,string)", "0x612e45a3": "newProposal(address,uint256,string,bytes,uint256,bool)", "0x4cdb48e4": "isValidNym(address)", "0x5afa5036": "isCertified(address)", "0x9a1b420b": "OraclizeAddrResolver()", "0xec5c9036": "Crowdsale(address,uint256,uint256)", "0x01095962": "oraclize_setCustomGasPrice(uint256)", "0xe7e2aa0e": "buyer_cancel()", "0x2da8f764": "submitVideo(string,string)", "0x3395dc70": "acceptTransfer(address,address,uint256)", "0xdf143fb7": "HackerGold(address)", "0x63334c58": "transferETC(address)", "0x6a5da6e5": "followCampaign(uint256)", "0x49fb2dc5": "add_to_association(uint256,uint256,uint256)", "0x953aa435": "GetPrice(uint8)", "0xc1257bad": "testPassingAProposal()", "0x3bc5de30": "getData()", "0x4abb9d39": "depletable()", "0x129484b6": "changeFeeRecipient(int256,int256,int256,int256,int256,int256)", "0x902e64e5": "Oath()", "0x8c4dd5cd": "Democracy()", "0xbea124a6": "query(bytes,bytes,int256)", "0x69347990": "ownerWithdrawl()", "0x606deecd": "requestData()", "0x6720ceb1": "sendPayment()", "0xb1050da5": "newProposal(address,uint256,string,bytes)", "0xfeaa29d8": "insertProfitHere()", "0x36f9f49c": "etherandomSeed()", "0xae815843": "query(uint256,string,string,uint256)", "0x752d349c": "depthCheck(int256,int256)", "0xa24835d1": "destroy(address,uint256)", "0x26070774": "Token(address)", "0x6e0d98fe": "setProbabilities(uint32[])", "0x0761a004": "step(uint256,bytes)", "0xad82dcac": "testBlockhashCorrectFee()", "0x0900f010": "upgrade(address)", "0xa288fb1f": "setConfigUint(int256,bytes,uint256)", "0xe88b8ac6": "confirmAndCheck(bytes)", "0xf1a00a53": "unregisterListening(address)", "0xb17acdcd": "collectFees(uint256)", "0xb5d0f16e": "getGasScalar(uint256,uint256)", "0xae999ece": "reserve(string)", "0x95ceb4b3": "winningProtocal()", "0x1a93fa4b": "reorganizeSubUsers()", "0x9243e088": "setEnforceRevisions(bytes20)", "0x342454c7": "isDigit(bytes1)", "0x8e2c6f4d": "initiateVerification(address,bytes,bytes)", "0xddb5b3ac": "SellTokens()", "0xd18dfdc9": "parrot(uint256)", "0xd3732642": "FastRealisticPyramid()", "0x37ab8f20": "notifyPlayer(uint256,uint256,uint256,uint256)", "0xfb6e155f": "availableVolume(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", "0x50ab6f7f": "getMsgs()", "0x6b6a53fa": "testThrowsRestartNotOwner()", "0x4dc7cc55": "terminateAlt()", "0x8b9726c1": "multiAccessCallD(address,uint256,bytes,address)", "0x5a74dee5": "multiAccessRemoveOwnerD(address,address)", "0xfd339d18": "testAuthorityTryAuthUnauthorized()", "0xd3d6a975": "testThrowsTransferNotEnabled()", "0x8aa001fc": "getSecond(uint256)", "0x2ec2c246": "unregister(address)", "0xbbdb31cb": "challenge(uint256,address,bool)", "0x635cfda2": "Incrementer()", "0x704b6c02": "setAdmin(address)", "0xc1c723f4": "validateProposedMonarchName(bytes)", "0xadf5e565": "verify(bytes,address,uint256,uint8,bytes,bytes)", "0xbe7cddf8": "TwoD()", "0xc71b583b": "closeRequest()", "0x9cbf9e36": "createToken()", "0x69c4113d": "setNewBudget(uint256,uint256,uint256,uint256)", "0xd4649fde": "expire(uint256,uint8,bytes32,bytes32,bytes32)", "0xf9a7a2ef": "named(bytes)", "0xdbf45aa3": "EthBank()", "0xbb3ce7fe": "DepositHolder()", "0xfb5d5729": "getPongvalTransactional()", "0x2f0b15f6": "testGetUnset()", "0x62891b5d": "multiAccessChangeRequirement(uint256)", "0x538e0759": "refill()", "0x24c65f35": "updateRefundGas()", "0x62b24189": "DepositToBankAccountFromDifferentAddress(uint32)", "0xd81f53fd": "EtherId()", "0xcea943ee": "getSaleConfig()", "0x23647398": "testThrowRetractNotOwner()", "0xcdcd77c0": "baz(uint32,bool)", "0xa677fbd9": "example2Func()", "0xa02b9aac": "getPaymentDataByAddress(address)", "0x268eb055": "setDescription(uint64,bytes)", "0x09d2d0b9": "setServiceAccount(address,bool)", "0x5f70d9ac": "getBot(uint256)", "0x63f80de3": "issueCoin(address,uint256,uint256)", "0x8570153e": "publish(string,string,bytes,address[])", "0x7975c56e": "oraclize_query(uint256,string,string)", "0x7c3064f1": "refundStake()", "0xef4ffee2": "Honestgamble()", "0xfdc193a4": "test3Fails()", "0x0eb495c2": "pushCity()", "0x6a357465": "payHours(address,uint256)", "0x93f0bb51": "order(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", "0x0a9254e4": "setUp()", "0xc490a266": "toUInt(bytes)", "0xf666323e": "UUIDProvider()", "0x857d4c07": "throwScraps(uint256)", "0x7fd8ee68": "computeNameHashExt(bytes)", "0x7bd703e8": "getBalanceInEth(address)", "0x68f65f02": "ChangeShownDenomination(bool,bool,bool,bool)", "0xc7f758a8": "getProposal(uint256)", "0x824dbc9a": "changeMembership(address,uint256,bool,string)", "0x2a228fc2": "processWithdrawals()", "0xe0457884": "betResolution(uint8,uint8,uint8,bool)", "0x550538f6": "getOneTimeCosts()", "0xf3e84cf3": "createNewRevision(bytes32,bytes)", "0x77fe38a4": "transferToICAPWithReference(bytes32,uint256,string)", "0xcc189d00": "Vault(address,uint256)", "0x9e281a98": "withdrawToken(address,uint256)", "0x7b12df39": "userProfits()", "0xa843c97f": "attack(uint256,uint256,uint256[])", "0x9da680f3": "adjustRegistrationFee(uint256)", "0x3ea3f6c5": "activateRegistrar()", "0xb36df681": "ExecutableBase()", "0x0f3a1412": "getArrlist(uint256,uint256)", "0x8b7f0ddd": "register(address,address,string,string,bytes32[],uint256,string)", "0xb5d3a379": "CanaryTestnet()", "0x9894221a": "SendCashForHardwareReturn()", "0xc2b12a73": "setBytes32(bytes32)", "0xff1b4341": "easyPropose(address,uint256,uint256)", "0x927ed13a": "newClient(uint256,address)", "0x9b9d0364": "_setFeeStructure(uint256,uint256,uint256)", "0x01518d76": "sendQuery(uint256)", "0x4112b7f1": "tryGetNameOwner(bytes)", "0xb759f954": "approve(uint256)", "0x810a882f": "setConfigBytes(bytes32,bytes32)", "0xea7a7184": "testGetBalanceDb()", "0xb0c8f9dc": "add(string)", "0xe59f611f": "InputLimit(uint256)", "0xdce293a7": "minLength(uint256)", "0xf509b627": "confirm(address,uint224,uint32,address)", "0xd48bfca7": "addToken(address)", "0x044f9ac8": "findThroneCalled(bytes)", "0x1d57bcf7": "ProofLibInterface()", "0x75830463": "checkBetLowhigh(uint8,address,bytes32,bytes32)", "0x2a45a39a": "Post(address)", "0x29cbdc86": "buyin(address,uint256)", "0x3cbfed74": "getBondBalance()", "0x80a23ddf": "mintBadge(int256,address,uint256)", "0x96b76c23": "stand(uint256)", "0xc392f5a0": "getAllPackageReleaseHashes(string)", "0x4847a79c": "_transfer(address,uint256)", "0x905e6e42": "JSON_Test()", "0x9f489e4e": "getDeposit(uint256,address)", "0x4f8e624e": "Greeter(string)", "0x96013c9c": "testLatestPkgGetter()", "0xe4fc6b6d": "distribute()", "0x423d4ef2": "createChannel()", "0x24d7806c": "isAdmin(address)", "0x691fb8ea": "jumpIn()", "0xd50f6bf0": "transferETH(address)", "0xd0e0813a": "promote(address)", "0x528eedcb": "sendSafe(address,address,uint256)", "0x00faf4dd": "getTokenDivisor()", "0x46a1d95f": "closeMarket(bytes)", "0x318a3fee": "relayTx(bytes,int256,int256[],int256,int256)", "0x49d55d9d": "receiveTransfer(uint256)", "0x4fa99dd0": "Matching_Ethers()", "0x99a5d747": "calculateFee(uint256)", "0x3c67c51e": "testLogs()", "0x12ab7242": "setupStackDepthLib(address)", "0xad9ec17e": "setGreyToken()", "0xc37e8cb2": "testExportAuthorized()", "0x43046844": "placeBet(uint8)", "0xc6e1c178": "TheLuckyOne(bytes)", "0x13d1aa2e": "f(uint256,uint256)", "0x64a4a5d7": "testBitsEqualSuccess()", "0xfb1669ca": "setBalance(uint256)", "0x40fdef80": "administration(uint256,string,uint256,uint256,address)", "0xcf7315c6": "retract(bytes20)", "0x76196c88": "setDnsrr(bytes32,bytes)", "0x08bf2d0d": "getOrderBook(uint256,uint256)", "0x021c309a": "solveBet(address,uint8,bool,uint8)", "0x4de162e4": "extractAccountLength()", "0x56fa47f0": "split(address)", "0xb3a0b1ef": "basicInfoGetter()", "0x26066ad5": "offer(uint256,bytes,uint256,bytes)", "0x99c724ef": "skipInLine(uint256,uint256)", "0x838445e8": "EtherAds(address,address,address)", "0xe06174e4": "settings()", "0xfac5bb92": "getPreRelease(bytes32)", "0x93c94acb": "calculateRewards(uint256[3][3])", "0xd7fa1007": "setHash(bytes32,bytes32)", "0x2a714078": "triggerAuth()", "0x4cd995da": "registerCompany(address,string)", "0xf6469342": "_setPackedBlockNumber(bytes32,uint256)", "0x8e7fd292": "trySetSubnodeOwner(bytes32,address)", "0x4f573cb2": "withdrawRevenue()", "0x924c28c1": "ContractInterface(address,address,address)", "0x4fc9c91a": "identityOf(bytes32)", "0x19901f1d": "TokenSale(uint256,uint256)", "0xaf8b7525": "CollectAndReduceFees(uint256)", "0x3ccb7dc9": "CrowdFund(uint256,uint256)", "0xaeeb96af": "Highlander()", "0xa126c5df": "GAS_TO_AUTHORIZE_EXECUTION()", "0x13c89a8f": "getAllowedTime(bytes32)", "0xf38b0600": "fireEventLog3()", "0xc7144269": "changeSettings_only_Dev(uint256,uint256,uint256,uint256,uint16,uint256,uint256,uint256,uint8,uint8)", "0xefc81a8c": "create()", "0x7429c086": "repeat()", "0x9c0a4bbc": "AlwaysFail()", "0xc3d23e10": "checkBet()", "0x28a45038": "testTryProxyCall()", "0xa668d7c9": "NiceGuyPonzi()", "0x06fe1fd7": "getPackageName(bytes32)", "0x29f27577": "InvestorList(uint256)", "0x57e25a79": "PullPaymentCapable()", "0x6d1669e1": "approveAndCall(address,address,uint256,bytes)", "0xa7e93e87": "retractLatestRevision(bytes20)", "0x9c7e8a03": "addParticipant(address,address,uint256)", "0xc6ab4514": "sendRobust(address,uint256,uint256)", "0xe8f6bc2e": "changeAccountLevelsAddr(address)", "0xb5d1990d": "numRecords()", "0x3e853128": "getGasForXau(address)", "0xa1add510": "hasRelation(bytes32,bytes32,address)", "0x31e3e2fe": "WithDraw()", "0x86723215": "createMarket(bytes,uint256,uint256,address)", "0xce845d1d": "currentBalance()", "0xc3a2c0c3": "scheduleCall()", "0xcf8eeb7e": "subBalance(address,uint256)", "0xaeb4f0d3": "RegisterTwo(address,address)", "0x3c716e08": "updateAuthority(address)", "0x9919b1cc": "getContentsByRanks(address,uint256,uint256,uint256)", "0x0f06670a": "didWin(bytes32)", "0x74e4435f": "getUserAddress(uint256,bytes32)", "0x4664b235": "bytes32_to_bytes(bytes,bytes,bytes)", "0x2ac9bf09": "bid(uint256,uint256,uint256)", "0xf11c4482": "approveFromProxy(address,address,uint256)", "0xfe992c98": "balanceOfAll(address)", "0x43e332c5": "Last_block_number_and_blockhash_used()", "0x0066753e": "removeCertifier(address)", "0xd299dac0": "blake2b(bytes,bytes,uint64)", "0x41395efa": "dgxBalance()", "0xac1b14ff": "proxyCall(uint256)", "0x7a6ce2e1": "getMsgSender()", "0x3855dcd6": "getContrarians_by_index(uint256)", "0xe6febc9b": "investorWithdraw(uint256)", "0xe6e91cfc": "voidFailedPayment(uint256)", "0x547eeac1": "acceptTransfer()", "0x9824425a": "takeOrder(uint256,uint256,uint256,uint256)", "0xdf25ee23": "getIndexId(address,bytes)", "0x0f3d7c3e": "release(string,uint32[3],string,string,string)", "0x15cff546": "isOperationBlocked()", "0x0b927666": "order(address,uint256,address,uint256,uint256,uint256)", "0x00ce2057": "triggerPayment()", "0x9a9c29f6": "settle(uint256,uint256)", "0x0f096163": "Chainy()", "0x2f5a5c5b": "timegame()", "0x900d85fa": "updatePreReleaseTree(bytes32)", "0x1cbd0519": "accountLevel(address)", "0x29a065bd": "getLOg(uint256)", "0xcec95aa1": "getReleaseHashForPackage(string,uint256)", "0x41524433": "sellKissBTCWithCallback(uint256,address,uint256)", "0x5e431709": "sealedBids(address,bytes32)", "0xf55b23c0": "externalLeave()", "0x31375242": "ownerSetTreasury(address)", "0x51b42b00": "deactivate()", "0x5af36e3e": "refund(uint256,uint256)", "0xc5096a69": "feeFor(address,address,uint256)", "0x059a500c": "makeDeposit(uint256)", "0x3c2e7d54": "priv_inMainChain__(int256,int256)", "0x9431f5f0": "withdrawFees(bytes)", "0x91b4a0e7": "Difficulty()", "0x268d50fe": "ownerSetHouseEdge(uint256)", "0x9644fcbd": "changeMembership(address,bool,string)", "0x66aa6f26": "payFee(bytes)", "0x353928d8": "helpRed()", "0x9c1193ea": "GreeterA(bytes)", "0xdd79e33e": "splitIdentifiers(string)", "0x4d268ddd": "payImporterBankForGoodsBought()", "0x656d2f63": "ManagedAccount(address)", "0x1216e771": "expiration(uint64)", "0x36f7cd70": "setPricePerStake(uint256)", "0x7842a3a4": "payReward()", "0x0ae50a39": "GetOwner()", "0xc81caae7": "acceptMember(address,string,string)", "0xe50dce71": "testControllerApproveSetsAllowance()", "0x4b64e492": "execute(address)", "0xd9e947f3": "kickOutMember(address)", "0x35cc59a9": "createSchema(bytes)", "0x2530c905": "rand(uint256)", "0x4894e37f": "__callback(bytes,string,bytes)", "0x70480275": "addAdmin(address)", "0x969cb7c3": "getPublisher(uint256)", "0x4ed4831a": "all(bool[7])", "0x2ef3accc": "getPrice(string,uint256)", "0x67854643": "getGenerationMemberLength(uint256)", "0xe6690fb1": "nextAuction(uint256)", "0x5829d310": "entries(int256)", "0x7fe1dc7e": "getToken(bytes)", "0xe7329e71": "scheduleCall(bytes,bytes,uint256,uint256,uint8,uint256)", "0x41c12a70": "voteNo()", "0x6a28db13": "getQrLength()", "0xdd93890b": "setMeta(uint256,bytes32,bytes32)", "0xa48bdb7c": "results()", "0x9d888e86": "currentVersion()", "0xff81fb91": "unhint(int256,bytes32)", "0x9ec32d45": "challengeWinningOutcome(bytes,uint16)", "0xa0a2f629": "setReferralId(uint256,address)", "0x76577eae": "distributeEarnings()", "0x3e5cee05": "issueIOU(string,uint256,address)", "0xf3c7d275": "prenup(string,string,string,string,string,address,address)", "0x7154ae61": "CheckNumbers(uint8[5])", "0x05de4f07": "getContentParent(uint256)", "0xb81e43fc": "getEventName()", "0xa7eeea37": "NewContributor(uint256)", "0xe816a515": "takeFlight()", "0x05b2b03a": "CertificationCentre(address)", "0x74d4ab27": "fipsRegister()", "0x65fa2f7f": "getLastPrice(uint256)", "0xcc8b34ab": "CrowdCoin()", "0xe2b178a0": "getAuthority()", "0x5fb64fd6": "checkMembership(address)", "0x7948f523": "setAmbiAddress(address,bytes32)", "0xebb71194": "withdrawFees(bytes32)", "0x6545bed3": "Dice(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", "0x7065cb48": "addOwner(address)", "0x913f424c": "_ecMul(uint256,uint256,uint256,uint256)", "0xdbecc372": "Example(uint256)", "0x9f7f760c": "SimpleDice()", "0xca94692d": "abiSignature()", "0x61ba3377": "WatchLastTime()", "0x20e647e1": "checkBetColor(uint8,address,bytes32,bytes32)", "0x0a3b0a4f": "add(address)", "0xc51cf179": "calcBaseFeeForShares(uint256)", "0x8baced64": "isInPool(address)", "0x4dc415de": "reject()", "0x1555e337": "ConferenceCertificate()", "0x9555a942": "withdrawFrom(address,address,uint256)", "0xe1efda6d": "airaSend(address,address,uint256)", "0x8bfc2f33": "delegateDAOTokens(uint256)", "0xb964608d": "get_return_by_level(uint256)", "0x0c1fad51": "setSeedSourceA(address)", "0x98688a95": "Ai()", "0xd930a90b": "testFailMoveBalanceDueToInsufficientFunds()", "0x337b5988": "testSimpleNameRegister()", "0xf06d335e": "_recoverAccount(address,address)", "0x025bbbe5": "newSale(bytes16,uint256,uint256)", "0x984413b8": "_eraseNode(bytes32)", "0x5ea187c9": "BuildByteArray(bytes)", "0xc2a95cc9": "updateTrustSettings(address,uint256)", "0xde0ff7c5": "getEther()", "0x4ac7becf": "SimpleSign()", "0x252786e4": "WatchBlockSizeInEther()", "0xf2016a4f": "updateMinEthPerNotification(uint256)", "0xd743ca38": "newWinner(uint256,address,uint256,uint256,uint256)", "0x9eab5253": "getMembers()", "0x51d38d5f": "addDeveloper(address,string)", "0x930ed251": "getSavedVar()", "0x715ef4ff": "resendFailedPayment(uint256)", "0xb1418cf4": "payHouse()", "0xe1569f6b": "testThrowsSetNotRetractableNotOwner()", "0x4ae9af61": "getBotStats(uint256,uint256)", "0xbf8ecf9c": "authProposals()", "0xc00ca383": "getByOwner(address,uint256)", "0xc8e7ca2e": "getMsgData()", "0x711953ef": "setGameAddress(address)", "0x63a8dac2": "changeSettings(uint256,uint256,uint256,uint8,uint256,uint256,uint8,uint8)", "0x72c87075": "testBlockHeaderFetch()", "0x4c7a2254": "checkMyWithdraw()", "0xab91c7b0": "queueLength()", "0x25209260": "PrepareRoll(uint256)", "0x58150c8b": "GameRegistry()", "0x75608264": "get_hash(uint8,bytes32)", "0x6510ef4d": "oraclize_query(uint256,string,string[5])", "0xd57a12f5": "testCheckSigs()", "0x3f415772": "releaseExists(bytes32)", "0xda25c0cd": "ThisExternalAssembly()", "0xf239e528": "sendOneEtherHome()", "0xc4321adb": "investInTheSystem(uint256)", "0x4fab2ca4": "testGetFrontend()", "0x05261aea": "finalize(uint256)", "0x576eac66": "setFundingGoal(uint256)", "0xe75528cc": "buyBuilding(uint256,uint256)", "0x6ed43eb0": "getInvestorList(uint256)", "0xb38415f3": "getConfigBytes(bytes)", "0x771ad635": "getContentCred(address,uint256)", "0x93c166ec": "computeEndowment(uint256,uint256,uint256,uint256)", "0xac35caee": "transferWithReference(address,uint256,string)", "0xc6803622": "wasCalled()", "0x8cfd8901": "_incBlock()", "0xfcf0f55b": "eventOracles(bytes32,uint256)", "0x505ff574": "register(address,uint256,bool)", "0xf824384a": "addInvestorAtID(uint256)", "0x6b9f96ea": "flush()", "0xc3d0a564": "getAccountBalance(bytes)", "0x30fd300f": "registerBytes32(address,bytes32)", "0xc3169ef2": "respond(uint256,uint256[4])", "0xcf1cd249": "secureSend(address)", "0x62c335c1": "checkCallback(address,uint256,bytes,bytes)", "0xb599afc8": "totalBetCount()", "0x69433e12": "setExchange(uint256)", "0x899942b8": "Devcon2Token()", "0x4c2d71b3": "setConfigAddress(bytes32,address)", "0xb974b0a3": "allData()", "0x27e8c2d8": "burnUnicornShares()", "0xf639365d": "testSetGet()", "0x2f5d3916": "testControllerApproveTriggersEvent()", "0x938b5f32": "origin()", "0xd60dcb5d": "Switch()", "0xde629235": "getCertificationDocumentAtIndex(address,uint256)", "0x329ce29e": "buyTile(uint256)", "0x59e2d30e": "testThrowBlobStoreNotRegistered()", "0xa005b87b": "NullMapTest()", "0xc13afa91": "object_locations(uint256)", "0x4848b1a5": "setData(uint256,uint256)", "0x80ede329": "getDocumentDetails(uint256)", "0x35d13969": "SendAllMoney()", "0x8040cac4": "testOverflow()", "0x9507d39a": "get(uint256)", "0xc040e6b8": "stage()", "0x18178358": "poke()", "0xfd782de5": "Proxy()", "0xfd68a422": "returnmoneycreator(uint8,uint128)", "0x86a50535": "voteFor(uint256)", "0x44602a7d": "testFallbackReturn()", "0xa230c524": "isMember(address)", "0x3ffbd47f": "register(string,string)", "0x8cecf66e": "_inverse(uint256)", "0x51017702": "isOutcomeSet(bytes32)", "0xd408746a": "GetContractAddr()", "0x20130753": "testThrowSetNotRetractableNotOwner()", "0xa0e2abf7": "getFirstActiveGamble()", "0x7c582304": "updateInvestmentTotal(address,uint256)", "0x95d89b41": "symbol()", "0x1768b436": "ETCSurvey()", "0x6d4ce63c": "get()", "0xc41a360a": "getOwner(uint256)", "0x49942ccb": "scheduleCall(bytes,bytes,uint256,uint256)", "0x6b64c769": "startAuction()", "0x084d72f4": "getWinningOutcome(uint256)", "0xd379be23": "claimer()", "0x41fa4876": "multiBlockRandomGen(uint256,uint256)", "0x5bc7e259": "updateRelease(uint32,uint32,uint32,bytes,bool)", "0x47f3d794": "configure(uint256,uint8,uint256,uint256,uint256,uint256)", "0xe2bbb158": "deposit(uint256,uint256)", "0x953a7fab": "testMoveBalance()", "0xeacc5b3b": "safeSend(address,uint256,uint256)", "0x96f0aa8f": "findNextSecond(uint256,bytes)", "0xc8690233": "pubkey(bytes32)", "0x459f93f7": "getBuyers(uint256,address)", "0xf714de9c": "MultiAccess()", "0xf4a81d08": "getKudosGiven(address)", "0x5aa94a68": "computeResultVoteExtraInvestFeesRate()", "0xdb2a0cb7": "HumanStandardTokenFactory()", "0xdf3a6b10": "testMemberAddedEvent()", "0xce8d054e": "_setupNoCallback()", "0x8ea822d8": "createThings(bytes32[],uint16[],bytes32[],uint16[],uint88)", "0x24fb563f": "PlayerTickets(address,uint256,uint256)", "0x8c0e156d": "scheduleCall(bytes4,uint256,uint256)", "0xef04fdb7": "buyShares(bytes,uint8,uint256,uint256)", "0xa0afd731": "dividendBalance(address)", "0xc3c95c7b": "getMarket(bytes32)", "0x94ed9b77": "append(address,address)", "0xc87b36ed": "disableBetting()", "0x566735d8": "PreVNK(uint256,string,string,uint8)", "0x400aae08": "isInCurrentGeneration(address)", "0x44dd4b5e": "scheduleTransaction(address,uint256,bytes)", "0x48c54b9d": "claimTokens()", "0xe8930efd": "Investors(address)", "0xa6f2ae3a": "buy()", "0x12819817": "setXauForGasCurrator(address)", "0x056e1059": "oraclize_query(uint256,string,string,uint256)", "0x7824407f": "tokenSupply()", "0x7f0c949c": "setJurisdication(string)", "0x2e817963": "set_sdl(address)", "0xaee84f6b": "setTime(address,uint256)", "0x3c0dde1c": "_addPools(address,address)", "0xf8bd526e": "setCoinageContract(address)", "0x04b07a5e": "removeUpdater(address)", "0x11149ada": "getProof(uint256)", "0x4306cc3f": "queryEarnings(address)", "0x55241077": "setValue(uint256)", "0x492b67ea": "Etherdoc()", "0xadf59f99": "query(uint256,string,string)", "0x951b01c5": "setCertifierDb(address)", "0x8ae986cf": "registrantApprove(address)", "0xfa68b4ce": "lookupISO3116_1_alpha_3(bytes)", "0x7fdc8290": "isUnderscore(bytes1)", "0x89495172": "convictFinal(uint256,uint256)", "0x93e02d13": "FallenLeaders()", "0x3e476053": "moveFunds(address,uint256)", "0x8894dd2b": "addEther()", "0x8f03850b": "numContributors()", "0xbfc3cd2f": "testFailChargeMoreThanApproved()", "0x1d82e9c7": "EXTRA_GAS()", "0x278ecde1": "refund(uint256)", "0x0f825673": "deleteCoupon(string)", "0xa324ad24": "getMonth(uint256)", "0xd628e0a6": "WatchBalance()", "0xb238ad0e": "getDaysInMonth(uint8,uint16)", "0xd6febde8": "buy(uint256,uint256)", "0x370ec1c5": "_fillOrder(address,uint256)", "0x4c33fe94": "cancel(address)", "0xcdd13701": "getEventHashes(uint256[256])", "0xe1bc3003": "reveal(bytes,string)", "0xa2e62045": "update()", "0x75f45878": "scheduleCall(bytes,bytes,uint256)", "0xd2756e11": "finalizeNumber(uint256)", "0x48519189": "MonedaAlcala(string,string)", "0x009b9369": "getVoteNumber(uint256)", "0xdaa283c8": "__callback(bytes,string)", "0xfcce2622": "challengeAnswer(uint256,bytes)", "0xac18de43": "removeManager(address)", "0x16d9356f": "oraclize_query(string,string[4])", "0xd1734eac": "isInNextGeneration(address)", "0x524fa7b9": "whitelistAdd(address)", "0xa5eb7a4e": "operated()", "0xb0aab296": "getNextNode(bytes)", "0x1982ed58": "ChangeReuseCashInHarware(bool,uint16,uint16)", "0xdf811d7d": "numberOfPlayersInCurrentRound()", "0xca7dc5b1": "getNumberOfTweets()", "0x488b3538": "shares(address,bytes32,int256)", "0xebd83378": "get_blocks_for(uint256)", "0x399fdb86": "testFailNormalWhitelistReset()", "0xca0c1e62": "computeMerkle(int256,int256,int256[],int256,int256,int256[])", "0x8963dab4": "getNodeId(bytes,bytes)", "0x7d94792a": "seed()", "0xbcf175c8": "oraclize_cbAddress()", "0x38eee93e": "scheduleCall(address,bytes,bytes,uint16,uint8,uint256[5])", "0xa08d3f83": "Etheropt(uint256,string,uint256,uint256,bytes32,address,int256[])", "0xae47a290": "changeMaxBet(uint256)", "0xd12c1e28": "badgesOf(address)", "0x001f8d11": "removePackage(bytes32,string)", "0x54fd4d50": "version()", "0x89abeb19": "ProcessGameExt(uint256)", "0x3dd7c1b9": "newProduct(string,string,uint256,uint256)", "0xa396541e": "getPongvalTxRetrievalAttempted()", "0xcc8af0fe": "bytesToUInt(bytes,bytes)", "0x983b94fb": "finalizeAuction(bytes32)", "0x3df91162": "getUpdatable(bytes20)", "0x045236b4": "getChainyData(string)", "0x9c172f87": "EthVentures4()", "0x996a4be3": "uintToBytes(uint256,uint256)", "0x775a8f5e": "toBytes(uint256)", "0xb6db75a0": "isAdmin()", "0x0b6fcdb0": "getEnforceRevisions(bytes32)", "0x29d6f899": "BetOnBlue()", "0xe6cbcba9": "PlusOnePonzi()", "0xc9030ea0": "addMember(address,bool)", "0x8f283970": "changeAdmin(address)", "0x670c884e": "setup(address,uint256,uint256,uint256,address)", "0x808ab1d6": "getCertificationDbCount()", "0x018f5472": "isAUser(address)", "0x59c87d70": "request(bytes32)", "0x407cfe5e": "get_all_players()", "0x33f472b9": "MPO()", "0x662dbe96": "getNodeHeight(bytes)", "0x60b1e173": "getProof(uint256,address,address)", "0xf25eb5c1": "removeReverse()", "0x1d065dde": "_transferWithReward(address,address,uint256)", "0x65343fcb": "TrustEth()", "0xaa237e21": "set(bool,uint256)", "0x60e519c0": "computeMarginAmount()", "0xd9597016": "multisetCustomGasPrice(uint256[],address[])", "0x4f10acc1": "updateGoldFeeData(uint256)", "0x1e9ea66a": "balanceEther10000000(uint256)", "0xffe34512": "getNumChannels(address)", "0x71dd8862": "IndexOf()", "0xdd9dd688": "calcStopPrice()", "0x934354e7": "finishSpin()", "0x26881518": "setupFee(address)", "0x5eb3f639": "assertTrue(bool,bytes)", "0xe9540395": "getRewardDivisor()", "0x8e4afa51": "checkTransferToICAP(bytes32,uint256)", "0xb5b33eda": "scheduleCall(address,uint256)", "0x3d6a32bd": "createTradeContract(address,uint256,uint256,uint256,bool,bool)", "0x5fd9dff6": "allowance(address,address,bytes)", "0x0d244d68": "setNotRetractable(bytes32)", "0xe63697c8": "withdraw(uint256,address,uint256)", "0x3e5087cc": "testBasicThing()", "0xee77fe86": "scheduleCall(address,bytes4,bytes,uint256,uint256,uint8)", "0xb1cc4348": "placeWager()", "0xb95594e5": "lineOfPlayers(uint256)", "0xa9cc4718": "fail()", "0x54385526": "setStatus(uint8,uint8,string)", "0xb45c48dc": "Security_AddPasswordSha3HashToBankAccount(bytes)", "0xace51abc": "helperVerifyHash__(uint256,int256,int256[],int256,uint256,int256,int256[],int256)", "0x1f5d0b4c": "address(address,address,uint256)", "0x7acbfb65": "setOwner(uint256,uint256)", "0x3462f32d": "execWithGasLimit(bytes32,bytes32,uint256,uint256)", "0xac04f5a7": "append(address)", "0x2fcb6628": "_stringGas(string,string)", "0xe977992d": "Doubler()", "0xc57a050e": "fairandeasy()", "0x412664ae": "sendToken(address,uint256)", "0x0afa9fb9": "contains(int256,address)", "0xb69ef8a8": "balance()", "0x264c8e9a": "whatWasTheVal()", "0x255016c8": "checkIfExploded()", "0xd716222c": "is_owner(uint256,address)", "0xc398f030": "expire(uint256,uint8,bytes,bytes,bytes)", "0xb7d454a4": "setNotTransferable(bytes32)", "0x4789aaef": "EthereumDice()", "0xc0171112": "timestamp(uint64)", "0x4f60f334": "multiAccessAddOwner(address)", "0x80aed05f": "LooneyDice()", "0x55ba343f": "getMarket(bytes)", "0x943b0747": "RewardOffer(address,address,bytes,uint256,uint256,uint128,uint256)", "0xa27c672a": "owner_reveal_and_commit(uint8,bytes32,bytes32)", "0x8f731077": "extractAllowanceRecordLength(address)", "0xc3d345c4": "getHangoutAddress()", "0xa8978434": "softResolveAnswer(uint256)", "0x7cef6047": "getNavHistory(uint256)", "0xfae14192": "changeFeePercentage(uint256)", "0x2ddbc04a": "play2(address,uint256)", "0x3fb27b85": "seal()", "0xe8038e25": "TokenSale(uint256,uint256,address)", "0x8d92fdf3": "withdrawAsset(uint256)", "0x8579cbde": "getPrice(string,uint256,address)", "0x0d61b519": "executeProposal(uint256)", "0x63a599a4": "emergencyStop()", "0x661e3605": "ConstructorContract(uint256)", "0xfd7c460d": "ciberLottery()", "0x1f83f440": "getPaymentByAddress(address)", "0xdcf73856": "generateGroups()", "0x3c6e03d7": "thewhalegame()", "0x271cd760": "getPackageDb()", "0x53fefd7d": "changeMaxDeposit(uint256)", "0xae169a50": "claimReward(uint256)", "0x6da84ec0": "calcMarketFee(bytes32,uint256)", "0xb16562fe": "fipsRegister(address,bytes)", "0x041fe13d": "onEtherandomSeed(bytes32,bytes32)", "0x4a617faa": "shaBid(bytes32,uint256,bytes32)", "0x052b2aa7": "getRegistrants()", "0x0ff0a4df": "reFund()", "0xe56b9dce": "GetPrize(uint256)", "0x8eec99c8": "setNewAdmin(address)", "0xffcce369": "changeIPFSHash(string)", "0x40fdf515": "issuetender(address,uint256,uint256)", "0xef4bdfdd": "Set_your_game_number_between_1_15(string)", "0xa991cb0e": "respond(uint256)", "0x617fba04": "getRecord(address)", "0x475a9fa9": "issueTokens(address,uint256)", "0xd30fbd0d": "safeSubtract(uint256,uint256)", "0xe54d4051": "receiveInteger(bytes,uint256,uint16)", "0x8023ffbd": "getOverallSize()", "0x8390b02a": "rfindPtr(uint256,uint256,uint256,uint256)", "0x11e99c22": "arrival()", "0x10c1952f": "setLocked()", "0x039a21b8": "tryExecute(address,bytes,uint256)", "0x201dcd7a": "newChallenge(uint256,uint256)", "0x5aebfd14": "createFile(bytes)", "0xa6b1caa3": "gasScalar(uint256)", "0x200538c6": "DTE()", "0xd1738b72": "wroomWroom()", "0x22f607f6": "Escrow()", "0x7e81b6aa": "KingdomFactory()", "0x901d7775": "voteOutMasterKey(address)", "0xd6af9411": "Rouleth()", "0x7b0383b2": "initializeDispute(uint256)", "0x70c9edb7": "BTCRelayTools(address)", "0xe9c31315": "checkBetParity(uint8,address,bytes32,bytes32)", "0xee82ac5e": "getBlockHash(uint256)", "0x727089f1": "extractAllowanceLength()", "0x8bbb5af7": "test1Fails()", "0x47872b42": "unsealBid(bytes32,uint256,bytes32)", "0x46b04e53": "PlayerInfoPerZone(uint256,uint256)", "0x752bacce": "getExecPrice()", "0x89d8ca67": "drawPot(bytes32,bytes32)", "0xc23697a8": "check(address)", "0x0af658ca": "personUpdateActivity(uint256,bool)", "0x24d4e90a": "ln(uint256)", "0x09d33f1d": "addRequest(address,uint256)", "0xc913b552": "getVersions(bytes)", "0xbb3b8dca": "getCertificateHash(bytes)", "0x3809c0bf": "doInfinite()", "0x853552d7": "_slotAddNew(address)", "0xccf1ab9b": "usurpation()", "0xe7dafdb6": "transfer_token(address,address,uint256)", "0x0c77a697": "claimFounders()", "0xda82a035": "sweepCommission()"} \ No newline at end of file diff --git a/cmd/clef/README.md b/cmd/clef/README.md index c9461be10194..90afe8c8c8e7 100644 --- a/cmd/clef/README.md +++ b/cmd/clef/README.md @@ -1,95 +1,87 @@ -Clef ----- -Clef can be used to sign transactions and data and is meant as a replacement for geth's account management. -This allows DApps not to depend on geth's account management. When a DApp wants to sign data it can send the data to -the signer, the signer will then provide the user with context and asks the user for permission to sign the data. If -the users grants the signing request the signer will send the signature back to the DApp. - -This setup allows a DApp to connect to a remote Ethereum node and send transactions that are locally signed. This can -help in situations when a DApp is connected to a remote node because a local Ethereum node is not available, not -synchronised with the chain or a particular Ethereum node that has no built-in (or limited) account management. - -Clef can run as a daemon on the same machine, or off a usb-stick like [usb armory](https://inversepath.com/usbarmory), -or a separate VM in a [QubesOS](https://www.qubes-os.org/) type os setup. - -Check out - -* the [tutorial](tutorial.md) for some concrete examples on how the signer works. -* the [setup docs](docs/setup.md) for some information on how to configure it to work on QubesOS or USBArmory. +# Clef +Clef can be used to sign transactions and data and is meant as a(n eventual) replacement for Geth's account management. This allows DApps to not depend on Geth's account management. When a DApp wants to sign data (or a transaction), it can send the content to Clef, which will then provide the user with context and asks for permission to sign the content. If the users grants the signing request, Clef will send the signature back to the DApp. + +This setup allows a DApp to connect to a remote Ethereum node and send transactions that are locally signed. This can help in situations when a DApp is connected to an untrusted remote Ethereum node, because a local one is not available, not synchronised with the chain, or is a node that has no built-in (or limited) account management. + +Clef can run as a daemon on the same machine, off a usb-stick like [USB armory](https://inversepath.com/usbarmory), or even a separate VM in a [QubesOS](https://www.qubes-os.org/) type setup. + +Check out the + +* [CLI tutorial](tutorial.md) for some concrete examples on how Clef works. +* [Setup docs](docs/setup.md) for infos on how to configure Clef on QubesOS or USB Armory. +* [Data types](datatypes.md) for details on the communication messages between Clef and an external UI. ## Command line flags + Clef accepts the following command line options: + ``` COMMANDS: init Initialize the signer, generate secret storage attest Attest that a js-file is to be used - addpw Store a credential for a keystore file + setpw Store a credential for a keystore file + delpw Remove a credential for a keystore file + gendoc Generate documentation about json-rpc format help Shows a list of commands or help for one command GLOBAL OPTIONS: --loglevel value log level to emit to the screen (default: 4) --keystore value Directory for the keystore (default: "$HOME/.ethereum/keystore") - --configdir value Directory for clef configuration (default: "$HOME/.clef") - --networkid value Network identifier (integer, 1=Frontier, 2=Morden (disused), 3=Ropsten, 4=Rinkeby) (default: 1) + --configdir value Directory for Clef configuration (default: "$HOME/.clef") + --chainid value Chain id to use for signing (1=mainnet, 3=Ropsten, 4=Rinkeby, 5=Goerli) (default: 1) --lightkdf Reduce key-derivation RAM & CPU usage at some expense of KDF strength --nousb Disables monitoring for and managing USB hardware wallets + --pcscdpath value Path to the smartcard daemon (pcscd) socket file (default: "/run/pcscd/pcscd.comm") --rpcaddr value HTTP-RPC server listening interface (default: "localhost") + --rpcvhosts value Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard. (default: "localhost") + --ipcdisable Disable the IPC-RPC server + --ipcpath Filename for IPC socket/pipe within the datadir (explicit paths escape it) + --rpc Enable the HTTP-RPC server --rpcport value HTTP-RPC server listening port (default: 8550) - --signersecret value A file containing the password used to encrypt signer credentials, e.g. keystore credentials and ruleset hash - --4bytedb value File containing 4byte-identifiers (default: "./4byte.json") + --signersecret value A file containing the (encrypted) master seed to encrypt Clef data, e.g. keystore credentials and ruleset hash --4bytedb-custom value File used for writing new 4byte-identifiers submitted via API (default: "./4byte-custom.json") --auditlog value File used to emit audit logs. Set to "" to disable (default: "audit.log") - --rules value Enable rule-engine (default: "rules.json") - --stdio-ui Use STDIN/STDOUT as a channel for an external UI. This means that an STDIN/STDOUT is used for RPC-communication with a e.g. a graphical user interface, and can be used when the signer is started by an external process. - --stdio-ui-test Mechanism to test interface between signer and UI. Requires 'stdio-ui'. + --rules value Path to the rule file to auto-authorize requests with + --stdio-ui Use STDIN/STDOUT as a channel for an external UI. This means that an STDIN/STDOUT is used for RPC-communication with a e.g. a graphical user interface, and can be used when Clef is started by an external process. + --stdio-ui-test Mechanism to test interface between Clef and UI. Requires 'stdio-ui'. + --advanced If enabled, issues warnings instead of rejections for suspicious requests. Default off --help, -h show help --version, -v print the version - ``` - Example: + ``` -signer -keystore /my/keystore -chainid 4 +$ clef -keystore /my/keystore -chainid 4 ``` - ## Security model -The security model of the signer is as follows: +The security model of Clef is as follows: -* One critical component (the signer binary / daemon) is responsible for handling cryptographic operations: signing, private keys, encryption/decryption of keystore files. -* The signer binary has a well-defined 'external' API. +* One critical component (the Clef binary / daemon) is responsible for handling cryptographic operations: signing, private keys, encryption/decryption of keystore files. +* Clef has a well-defined 'external' API. * The 'external' API is considered UNTRUSTED. -* The signer binary also communicates with whatever process that invoked the binary, via stdin/stdout. +* Clef also communicates with whatever process that invoked the binary, via stdin/stdout. * This channel is considered 'trusted'. Over this channel, approvals and passwords are communicated. -The general flow for signing a transaction using e.g. geth is as follows: +The general flow for signing a transaction using e.g. Geth is as follows: ![image](sign_flow.png) -In this case, `geth` would be started with `--externalsigner=http://localhost:8550` and would relay requests to `eth.sendTransaction`. +In this case, `geth` would be started with `--signer http://localhost:8550` and would relay requests to `eth.sendTransaction`. ## TODOs Some snags and todos -* [ ] The signer should take a startup param "--no-change", for UIs that do not contain the capability - to perform changes to things, only approve/deny. Such a UI should be able to start the signer in - a more secure mode by telling it that it only wants approve/deny capabilities. - -* [x] It would be nice if the signer could collect new 4byte-id:s/method selectors, and have a -secondary database for those (`4byte_custom.json`). Users could then (optionally) submit their collections for -inclusion upstream. - -* It should be possible to configure the signer to check if an account is indeed known to it, before -passing on to the UI. The reason it currently does not, is that it would make it possible to enumerate -accounts if it immediately returned "unknown account". -* [x] It should be possible to configure the signer to auto-allow listing (certain) accounts, instead of asking every time. -* [x] Done Upon startup, the signer should spit out some info to the caller (particularly important when executed in `stdio-ui`-mode), -invoking methods with the following info: +* [ ] Clef should take a startup param "--no-change", for UIs that do not contain the capability to perform changes to things, only approve/deny. Such a UI should be able to start the signer in a more secure mode by telling it that it only wants approve/deny capabilities. +* [x] It would be nice if Clef could collect new 4byte-id:s/method selectors, and have a secondary database for those (`4byte_custom.json`). Users could then (optionally) submit their collections for inclusion upstream. +* [ ] It should be possible to configure Clef to check if an account is indeed known to it, before passing on to the UI. The reason it currently does not, is that it would make it possible to enumerate accounts if it immediately returned "unknown account" (side channel attack). +* [x] It should be possible to configure Clef to auto-allow listing (certain) accounts, instead of asking every time. +* [x] Done Upon startup, Clef should spit out some info to the caller (particularly important when executed in `stdio-ui`-mode), invoking methods with the following info: * [x] Version info about the signer - * [x] Address of API (http/ipc) + * [x] Address of API (HTTP/IPC) * [ ] List of known accounts * [ ] Have a default timeout on signing operations, so that if the user has not answered within e.g. 60 seconds, the request is rejected. * [ ] `account_signRawTransaction` @@ -102,21 +94,16 @@ invoking methods with the following info: * the number of unique recipients * Geth todos - - The signer should pass the `Origin` header as call-info to the UI. As of right now, the way that info about the request is -put together is a bit of a hack into the http server. This could probably be greatly improved - - Relay: Geth should be started in `geth --external_signer localhost:8550`. - - Currently, the Geth APIs use `common.Address` in the arguments to transaction submission (e.g `to` field). This - type is 20 `bytes`, and is incapable of carrying checksum information. The signer uses `common.MixedcaseAddress`, which - retains the original input. - - The Geth api should switch to use the same type, and relay `to`-account verbatim to the external api. - + - The signer should pass the `Origin` header as call-info to the UI. As of right now, the way that info about the request is put together is a bit of a hack into the HTTP server. This could probably be greatly improved. + - Relay: Geth should be started in `geth --signer localhost:8550`. + - Currently, the Geth APIs use `common.Address` in the arguments to transaction submission (e.g `to` field). This type is 20 `bytes`, and is incapable of carrying checksum information. The signer uses `common.MixedcaseAddress`, which retains the original input. + - The Geth API should switch to use the same type, and relay `to`-account verbatim to the external API. * [x] Storage - * [x] An encrypted key-value storage should be implemented + * [x] An encrypted key-value storage should be implemented. * See [rules.md](rules.md) for more info about this. - * Another potential thing to introduce is pairing. * To prevent spurious requests which users just accept, implement a way to "pair" the caller with the signer (external API). - * Thus geth/mist/cpp would cryptographically handshake and afterwards the caller would be allowed to make signing requests. + * Thus Geth/cpp would cryptographically handshake and afterwards the caller would be allowed to make signing requests. * This feature would make the addition of rules less dangerous. * Wallets / accounts. Add API methods for wallets. @@ -125,37 +112,31 @@ put together is a bit of a hack into the http server. This could probably be gre ### External API -The signer listens to HTTP requests on `rpcaddr`:`rpcport`, with the same JSONRPC standard as Geth. The messages are -expected to be JSON [jsonrpc 2.0 standard](http://www.jsonrpc.org/specification). +Clef listens to HTTP requests on `rpcaddr`:`rpcport` (or to IPC on `ipcpath`), with the same JSON-RPC standard as Geth. The messages are expected to be [JSON-RPC 2.0 standard](https://www.jsonrpc.org/specification). -Some of these call can require user interaction. Clients must be aware that responses -may be delayed significantly or may never be received if a users decides to ignore the confirmation request. +Some of these call can require user interaction. Clients must be aware that responses may be delayed significantly or may never be received if a users decides to ignore the confirmation request. -The External API is **untrusted** : it does not accept credentials over this api, nor does it expect -that requests have any authority. +The External API is **untrusted**: it does not accept credentials over this API, nor does it expect that requests have any authority. -### UI API +### Internal UI API -The signer has one native console-based UI, for operation without any standalone tools. -However, there is also an API to communicate with an external UI. To enable that UI, -the signer needs to be executed with the `--stdio-ui` option, which allocates the -`stdin`/`stdout` for the UI-api. +Clef has one native console-based UI, for operation without any standalone tools. However, there is also an API to communicate with an external UI. To enable that UI, the signer needs to be executed with the `--stdio-ui` option, which allocates `stdin` / `stdout` for the UI API. An example (insecure) proof-of-concept of has been implemented in `pythonsigner.py`. The model is as follows: * The user starts the UI app (`pythonsigner.py`). -* The UI app starts the `signer` with `--stdio-ui`, and listens to the +* The UI app starts `clef` with `--stdio-ui`, and listens to the process output for confirmation-requests. -* The `signer` opens the external http api. -* When the `signer` receives requests, it sends a `jsonrpc` request via `stdout`. -* The UI app prompts the user accordingly, and responds to the `signer` -* The `signer` signs (or not), and responds to the original request. +* `clef` opens the external HTTP API. +* When the `signer` receives requests, it sends a JSON-RPC request via `stdout`. +* The UI app prompts the user accordingly, and responds to `clef`. +* `clef` signs (or not), and responds to the original request. ## External API -See the [external api changelog](extapi_changelog.md) for information about changes to this API. +See the [external API changelog](extapi_changelog.md) for information about changes to this API. ### Encoding - number: positive integers that are hex encoded @@ -180,7 +161,7 @@ None #### Result - address [string]: account address that is derived from the generated key - url [string]: location of the keyfile - + #### Sample call ```json { @@ -189,7 +170,9 @@ None "method": "account_new", "params": [] } - +``` +Response +``` { "id": 0, "jsonrpc": "2.0", @@ -212,9 +195,9 @@ None #### Result - array with account records: - account.address [string]: account address that is derived from the generated key - - account.type [string]: type of the + - account.type [string]: type of the - account.url [string]: location of the account - + #### Sample call ```json { @@ -222,7 +205,9 @@ None "jsonrpc": "2.0", "method": "account_list" } - +``` +Response +``` { "id": 1, "jsonrpc": "2.0", @@ -261,7 +246,7 @@ None #### Result - signed transaction in RLP encoded form [data] - + #### Sample call ```json { @@ -285,8 +270,8 @@ Response ```json { + "id": 2, "jsonrpc": "2.0", - "id": 67, "error": { "code": -32000, "message": "Request denied" @@ -298,6 +283,7 @@ Response ```json { + "id": 67, "jsonrpc": "2.0", "method": "account_signTransaction", "params": [ @@ -311,8 +297,7 @@ Response "data": "0x4401a6e40000000000000000000000000000000000000000000000000000000000000012" }, "safeSend(address)" - ], - "id": 67 + ] } ``` Response @@ -346,26 +331,30 @@ Bash example: {"jsonrpc":"2.0","id":67,"result":{"raw":"0xf88380018203339407a565b7ed7d7a678680a4c162885bedbb695fe080a44401a6e4000000000000000000000000000000000000000000000000000000000000001226a0223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20ea02aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663","tx":{"nonce":"0x0","gasPrice":"0x1","gas":"0x333","to":"0x07a565b7ed7d7a678680a4c162885bedbb695fe0","value":"0x0","input":"0x4401a6e40000000000000000000000000000000000000000000000000000000000000012","v":"0x26","r":"0x223a7c9bcf5531c99be5ea7082183816eb20cfe0bbc322e97cc5c7f71ab8b20e","s":"0x2aadee6b34b45bb15bc42d9c09de4a6754e7000908da72d48cc7704971491663","hash":"0xeba2df809e7a612a0a0d444ccfa5c839624bdc00dd29e3340d46df3870f8a30e"}}} ``` - -### account_sign +### account_signData #### Sign data Signs a chunk of data and returns the calculated signature. #### Arguments + - content type [string]: type of signed data + - `text/validator`: hex data with custom validator defined in a contract + - `application/clique`: [clique](https://github.com/ethereum/EIPs/issues/225) headers + - `text/plain`: simple hex data validated by `account_ecRecover` - account [address]: account to sign with - - data [data]: data to sign + - data [object]: data to sign #### Result - calculated signature [data] - + #### Sample call ```json { "id": 3, "jsonrpc": "2.0", - "method": "account_sign", + "method": "account_signData", "params": [ + "data/plain", "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db", "0xaabbccdd" ] @@ -381,18 +370,116 @@ Response } ``` +### account_signTypedData + +#### Sign data + Signs a chunk of structured data conformant to [EIP712]([EIP-712](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md)) and returns the calculated signature. + +#### Arguments + - account [address]: account to sign with + - data [object]: data to sign + +#### Result + - calculated signature [data] + +#### Sample call +```json +{ + "id": 68, + "jsonrpc": "2.0", + "method": "account_signTypedData", + "params": [ + "0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826", + { + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": 1, + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } + } + ] +} +``` +Response + +```json +{ + "id": 1, + "jsonrpc": "2.0", + "result": "0x4355c47d63924e8a72e509b65029052eb6c299d53a04e167c5775fd466751c9d07299936d304c153f6443dfa05f40ff007d72911b6f72307f996231605b915621c" +} +``` + ### account_ecRecover -#### Recover address - Derive the address from the account that was used to sign data from the data and signature. - +#### Sign data + +Derive the address from the account that was used to sign data with content type `text/plain` and the signature. + #### Arguments - data [data]: data that was signed - signature [data]: the signature to verify #### Result - derived account [address] - + #### Sample call ```json { @@ -400,6 +487,7 @@ Response "jsonrpc": "2.0", "method": "account_ecRecover", "params": [ + "data/plain", "0xaabbccdd", "0x5b6693f153b48ec1c706ba4169960386dbaa6903e249cc79a8e6ddc434451d417e1e57327872c7f538beeb323c300afa9999a3d4a5de6caf3be0d5ef832b67ef1c" ] @@ -413,7 +501,6 @@ Response "jsonrpc": "2.0", "result": "0x1923f626bb8dc025849e00f99c25fe2b2f7fb0db" } - ``` ### account_import @@ -421,16 +508,16 @@ Response #### Import account Import a private key into the keystore. The imported key is expected to be encrypted according to the web3 keystore format. - + #### Arguments - - account [object]: key in [web3 keystore format](https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition) (retrieved with account_export) + - account [object]: key in [web3 keystore format](https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition) (retrieved with account_export) #### Result - imported key [object]: - key.address [address]: address of the imported key - key.type [string]: type of the account - key.url [string]: key URL - + #### Sample call ```json { @@ -458,7 +545,7 @@ Response }, "id": "09bccb61-b8d3-4e93-bf4f-205a8194f0b9", "version": 3 - }, + } ] } ``` @@ -479,16 +566,16 @@ Response ### account_export #### Export account from keystore - Export a private key from the keystore. The exported private key is encrypted with the original passphrase. When the - key is imported later this passphrase is required. - + Export a private key from the keystore. The exported private key is encrypted with the original password. When the + key is imported later this password is required. + #### Arguments - account [address]: export private key that is associated with this account #### Result - exported key, see [web3 keystore format](https://github.com/ethereum/wiki/wiki/Web3-Secret-Storage-Definition) for more information - + #### Sample call ```json { @@ -530,8 +617,6 @@ Response } ``` - - ## UI API These methods needs to be implemented by a UI listener. @@ -542,13 +627,13 @@ See `pythonsigner`, which can be invoked via `python3 pythonsigner.py test` to p All methods in this API uses object-based parameters, so that there can be no mixups of parameters: each piece of data is accessed by key. -See the [ui api changelog](intapi_changelog.md) for information about changes to this API. +See the [ui API changelog](intapi_changelog.md) for information about changes to this API. OBS! A slight deviation from `json` standard is in place: every request and response should be confined to a single line. Whereas the `json` specification allows for linebreaks, linebreaks __should not__ be used in this communication channel, to make things simpler for both parties. -### ApproveTx +### ApproveTx / `ui_approveTx` Invoked when there's a transaction for approval. @@ -560,13 +645,13 @@ Here's a method invocation: curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_signTransaction","params":[{"from":"0x694267f14675d7e1b9494fd8d72fefe1755710fa","gas":"0x333","gasPrice":"0x1","nonce":"0x0","to":"0x07a565b7ed7d7a678680a4c162885bedbb695fe0", "value":"0x0", "data":"0x4401a6e40000000000000000000000000000000000000000000000000000000000000012"},"safeSend(address)"],"id":67}' http://localhost:8550/ ``` - +Results in the following invocation on the UI: ```json { "jsonrpc": "2.0", "id": 1, - "method": "ApproveTx", + "method": "ui_approveTx", "params": [ { "transaction": { @@ -611,7 +696,7 @@ curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","me { "jsonrpc": "2.0", "id": 1, - "method": "ApproveTx", + "method": "ui_approveTx", "params": [ { "transaction": { @@ -654,7 +739,7 @@ One which has missing `to`, but with no `data`: { "jsonrpc": "2.0", "id": 3, - "method": "ApproveTx", + "method": "ui_approveTx", "params": [ { "transaction": { @@ -683,33 +768,7 @@ One which has missing `to`, but with no `data`: } ``` -### ApproveExport - -Invoked when a request to export an account has been made. - -#### Sample call - -```json - -{ - "jsonrpc": "2.0", - "id": 7, - "method": "ApproveExport", - "params": [ - { - "address": "0x0000000000000000000000000000000000000000", - "meta": { - "remote": "signer binary", - "local": "main", - "scheme": "in-proc" - } - } - ] -} - -``` - -### ApproveListing +### ApproveListing / `ui_approveListing` Invoked when a request for account listing has been made. @@ -720,7 +779,7 @@ Invoked when a request for account listing has been made. { "jsonrpc": "2.0", "id": 5, - "method": "ApproveListing", + "method": "ui_approveListing", "params": [ { "accounts": [ @@ -747,7 +806,7 @@ Invoked when a request for account listing has been made. ``` -### ApproveSignData +### ApproveSignData / `ui_approveSignData` #### Sample call @@ -755,7 +814,7 @@ Invoked when a request for account listing has been made. { "jsonrpc": "2.0", "id": 4, - "method": "ApproveSignData", + "method": "ui_approveSignData", "params": [ { "address": "0x123409812340981234098123409812deadbeef42", @@ -773,7 +832,7 @@ Invoked when a request for account listing has been made. ``` -### ShowInfo +### ShowInfo / `ui_showInfo` The UI should show the info to the user. Does not expect response. @@ -783,7 +842,7 @@ The UI should show the info to the user. Does not expect response. { "jsonrpc": "2.0", "id": 9, - "method": "ShowInfo", + "method": "ui_showInfo", "params": [ { "text": "Tests completed" @@ -793,7 +852,7 @@ The UI should show the info to the user. Does not expect response. ``` -### ShowError +### ShowError / `ui_showError` The UI should show the info to the user. Does not expect response. @@ -812,7 +871,7 @@ The UI should show the info to the user. Does not expect response. ``` -### OnApproved +### OnApprovedTx / `ui_onApprovedTx` `OnApprovedTx` is called when a transaction has been approved and signed. The call contains the return value that will be sent to the external caller. The return value from this method is ignored - the reason for having this callback is to allow the ruleset to keep track of approved transactions. @@ -820,9 +879,9 @@ When implementing rate-limited rules, this callback should be used. TLDR; Use this method to keep track of signed transactions, instead of using the data in `ApproveTx`. -### OnSignerStartup +### OnSignerStartup / `ui_onSignerStartup` -This method provide the UI with information about what API version the signer uses (both internal and external) aswell as build-info and external api, +This method provide the UI with information about what API version the signer uses (both internal and external) aswell as build-info and external API, in k/v-form. Example call: @@ -831,7 +890,7 @@ Example call: { "jsonrpc": "2.0", "id": 1, - "method": "OnSignerStartup", + "method": "ui_onSignerStartup", "params": [ { "info": { @@ -855,7 +914,7 @@ A UI should conform to the following rules. * For example, not load icons, stylesheets from the internet * Not load files from the filesystem, unless they reside in the same local directory (e.g. config files) * A Graphical UI MUST show the blocky-identicon for ethereum addresses. -* A UI MUST warn display approproate warning if the destination-account is formatted with invalid checksum. +* A UI MUST warn display appropriate warning if the destination-account is formatted with invalid checksum. * A UI MUST NOT open any ports or services * The signer opens the public port * A UI SHOULD verify the permissions on the signer binary, and refuse to execute or warn if permissions allow non-user write. @@ -866,9 +925,9 @@ A UI should conform to the following rules. along with the UI. -### UI Implementations +### UI Implementations -There are a couple of implementation for a UI. We'll try to keep this list up to date. +There are a couple of implementation for a UI. We'll try to keep this list up to date. | Name | Repo | UI type| No external resources| Blocky support| Verifies permissions | Hash information | No secondary storage | Statically linked| Can modify parameters| | ---- | ---- | -------| ---- | ---- | ---- |---- | ---- | ---- | ---- | diff --git a/cmd/clef/datatypes.md b/cmd/clef/datatypes.md new file mode 100644 index 000000000000..5ebf9adc9712 --- /dev/null +++ b/cmd/clef/datatypes.md @@ -0,0 +1,224 @@ +## UI Client interface + +These data types are defined in the channel between clef and the UI +### SignDataRequest + +SignDataRequest contains information about a pending request to sign some data. The data to be signed can be of various types, defined by content-type. Clef has done most of the work in canonicalizing and making sense of the data, and it's up to the UI to presentthe user with the contents of the `message` + +Example: +```json +{ + "content_type": "text/plain", + "address": "0xDEADbEeF000000000000000000000000DeaDbeEf", + "raw_data": "GUV0aGVyZXVtIFNpZ25lZCBNZXNzYWdlOgoxMWhlbGxvIHdvcmxk", + "messages": [ + { + "name": "message", + "value": "\u0019Ethereum Signed Message:\n11hello world", + "type": "text/plain" + } + ], + "hash": "0xd9eba16ed0ecae432b71fe008c98cc872bb4cc214d3220a36f365326cf807d68", + "meta": { + "remote": "localhost:9999", + "local": "localhost:8545", + "scheme": "http", + "User-Agent": "Firefox 3.2", + "Origin": "www.malicious.ru" + } +} +``` +### SignDataResponse - approve + +Response to SignDataRequest + +Example: +```json +{ + "approved": true +} +``` +### SignDataResponse - deny + +Response to SignDataRequest + +Example: +```json +{ + "approved": false +} +``` +### SignTxRequest + +SignTxRequest contains information about a pending request to sign a transaction. Aside from the transaction itself, there is also a `call_info`-struct. That struct contains messages of various types, that the user should be informed of. + +As in any request, it's important to consider that the `meta` info also contains untrusted data. + +The `transaction` (on input into clef) can have either `data` or `input` -- if both are set, they must be identical, otherwise an error is generated. However, Clef will always use `data` when passing this struct on (if Clef does otherwise, please file a ticket) + +Example: +```json +{ + "transaction": { + "from": "0xDEADbEeF000000000000000000000000DeaDbeEf", + "to": null, + "gas": "0x3e8", + "gasPrice": "0x5", + "value": "0x6", + "nonce": "0x1", + "data": "0x01020304" + }, + "call_info": [ + { + "type": "Warning", + "message": "Something looks odd, show this message as a warning" + }, + { + "type": "Info", + "message": "User should see this aswell" + } + ], + "meta": { + "remote": "localhost:9999", + "local": "localhost:8545", + "scheme": "http", + "User-Agent": "Firefox 3.2", + "Origin": "www.malicious.ru" + } +} +``` +### SignTxResponse - approve + +Response to request to sign a transaction. This response needs to contain the `transaction`, because the UI is free to make modifications to the transaction. + +Example: +```json +{ + "transaction": { + "from": "0xDEADbEeF000000000000000000000000DeaDbeEf", + "to": null, + "gas": "0x3e8", + "gasPrice": "0x5", + "value": "0x6", + "nonce": "0x4", + "data": "0x04030201" + }, + "approved": true +} +``` +### SignTxResponse - deny + +Response to SignTxRequest. When denying a request, there's no need to provide the transaction in return + +Example: +```json +{ + "transaction": { + "from": "0x", + "to": null, + "gas": "0x0", + "gasPrice": "0x0", + "value": "0x0", + "nonce": "0x0", + "data": null + }, + "approved": false +} +``` +### OnApproved - SignTransactionResult + +SignTransactionResult is used in the call `clef` -> `OnApprovedTx(result)` + +This occurs _after_ successful completion of the entire signing procedure, but right before the signed transaction is passed to the external caller. This method (and data) can be used by the UI to signal to the user that the transaction was signed, but it is primarily useful for ruleset implementations. + +A ruleset that implements a rate limitation needs to know what transactions are sent out to the external interface. By hooking into this methods, the ruleset can maintain track of that count. + +**OBS:** Note that if an attacker can restore your `clef` data to a previous point in time (e.g through a backup), the attacker can reset such windows, even if he/she is unable to decrypt the content. + +The `OnApproved` method cannot be responded to, it's purely informative + +Example: +```json +{ + "raw": "0xf85d640101948a8eafb1cf62bfbeb1741769dae1a9dd47996192018026a0716bd90515acb1e68e5ac5867aa11a1e65399c3349d479f5fb698554ebc6f293a04e8a4ebfff434e971e0ef12c5bf3a881b06fd04fc3f8b8a7291fb67a26a1d4ed", + "tx": { + "nonce": "0x64", + "gasPrice": "0x1", + "gas": "0x1", + "to": "0x8a8eafb1cf62bfbeb1741769dae1a9dd47996192", + "value": "0x1", + "input": "0x", + "v": "0x26", + "r": "0x716bd90515acb1e68e5ac5867aa11a1e65399c3349d479f5fb698554ebc6f293", + "s": "0x4e8a4ebfff434e971e0ef12c5bf3a881b06fd04fc3f8b8a7291fb67a26a1d4ed", + "hash": "0x662f6d772692dd692f1b5e8baa77a9ff95bbd909362df3fc3d301aafebde5441" + } +} +``` +### UserInputRequest + +Sent when clef needs the user to provide data. If 'password' is true, the input field should be treated accordingly (echo-free) + +Example: +```json +{ + "prompt": "The question to ask the user", + "title": "The title here", + "isPassword": true +} +``` +### UserInputResponse + +Response to UserInputRequest + +Example: +```json +{ + "text": "The textual response from user" +} +``` +### ListRequest + +Sent when a request has been made to list addresses. The UI is provided with the full `account`s, including local directory names. Note: this information is not passed back to the external caller, who only sees the `address`es. + +Example: +```json +{ + "accounts": [ + { + "address": "0xdeadbeef000000000000000000000000deadbeef", + "url": "keystore:///path/to/keyfile/a" + }, + { + "address": "0x1111111122222222222233333333334444444444", + "url": "keystore:///path/to/keyfile/b" + } + ], + "meta": { + "remote": "localhost:9999", + "local": "localhost:8545", + "scheme": "http", + "User-Agent": "Firefox 3.2", + "Origin": "www.malicious.ru" + } +} +``` +### ListResponse + +Response to list request. The response contains a list of all addresses to show to the caller. Note: the UI is free to respond with any address the caller, regardless of whether it exists or not + +Example: +```json +{ + "accounts": [ + { + "address": "0x0000000000000000000000000000000000000000", + "url": ".. ignored .." + }, + { + "address": "0xffffffffffffffffffffffffffffffffffffffff", + "url": "" + } + ] +} +``` diff --git a/cmd/clef/docs/clef_architecture_pt1.png b/cmd/clef/docs/clef_architecture_pt1.png new file mode 100644 index 000000000000..e40e532f3051 Binary files /dev/null and b/cmd/clef/docs/clef_architecture_pt1.png differ diff --git a/cmd/clef/docs/clef_architecture_pt2.png b/cmd/clef/docs/clef_architecture_pt2.png new file mode 100644 index 000000000000..f617d755e2e7 Binary files /dev/null and b/cmd/clef/docs/clef_architecture_pt2.png differ diff --git a/cmd/clef/docs/clef_architecture_pt3.png b/cmd/clef/docs/clef_architecture_pt3.png new file mode 100644 index 000000000000..b9d695447308 Binary files /dev/null and b/cmd/clef/docs/clef_architecture_pt3.png differ diff --git a/cmd/clef/docs/clef_architecture_pt4.png b/cmd/clef/docs/clef_architecture_pt4.png new file mode 100644 index 000000000000..a6cb3b4df24d Binary files /dev/null and b/cmd/clef/docs/clef_architecture_pt4.png differ diff --git a/cmd/clef/extapi_changelog.md b/cmd/clef/extapi_changelog.md index 6c2c3e819430..dbc302631bc1 100644 --- a/cmd/clef/extapi_changelog.md +++ b/cmd/clef/extapi_changelog.md @@ -1,13 +1,39 @@ -### Changelog for external API +## Changelog for external API + +The API uses [semantic versioning](https://semver.org/). + +TL;DR: Given a version number MAJOR.MINOR.PATCH, increment the: + +* MAJOR version when you make incompatible API changes, +* MINOR version when you add functionality in a backwards-compatible manner, and +* PATCH version when you make backwards-compatible bug fixes. + +Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format. + + +### 6.0.0 + +* `New` was changed to deliver only an address, not the full `Account` data +* `Export` was moved from External API to the UI Server API + +#### 5.0.0 + +* The external `account_EcRecover`-method was reimplemented. +* The external method `account_sign(address, data)` was replaced with `account_signData(contentType, address, data)`. +The addition of `contentType` makes it possible to use the method for different types of objects, such as: + * signing data with an intended validator (not yet implemented) + * signing clique headers, + * signing plain personal messages, +* The external method `account_signTypedData` implements [EIP-712](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-712.md) and makes it possible to sign typed data. #### 4.0.0 -* The external `account_Ecrecover`-method was removed. +* The external `account_Ecrecover`-method was removed. * The external `account_Import`-method was removed. #### 3.0.0 -* The external `account_List`-method was changed to not expose `url`, which contained info about the local filesystem. It now returns only a list of addresses. +* The external `account_List`-method was changed to not expose `url`, which contained info about the local filesystem. It now returns only a list of addresses. #### 2.0.0 @@ -18,15 +44,3 @@ makes the `accounts_signTransaction` identical to the old `eth_signTransaction`. #### 1.0.0 Initial release. - -### Versioning - -The API uses [semantic versioning](https://semver.org/). - -TLDR; Given a version number MAJOR.MINOR.PATCH, increment the: - -* MAJOR version when you make incompatible API changes, -* MINOR version when you add functionality in a backwards-compatible manner, and -* PATCH version when you make backwards-compatible bug fixes. - -Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format. diff --git a/cmd/clef/intapi_changelog.md b/cmd/clef/intapi_changelog.md index 92a39a268fd3..38424f06b9fd 100644 --- a/cmd/clef/intapi_changelog.md +++ b/cmd/clef/intapi_changelog.md @@ -1,4 +1,89 @@ -### Changelog for internal API (ui-api) +## Changelog for internal API (ui-api) + +The API uses [semantic versioning](https://semver.org/). + +TL;DR: Given a version number MAJOR.MINOR.PATCH, increment the: + +* MAJOR version when you make incompatible API changes, +* MINOR version when you add functionality in a backwards-compatible manner, and +* PATCH version when you make backwards-compatible bug fixes. + +Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format. + +### 7.0.0 + +- The `message` field was renamed to `messages` in all data signing request methods to better reflect that it's a list, not a value. +- The `storage.Put` and `storage.Get` methods in the rule execution engine were lower-cased to `storage.put` and `storage.get` to be consistent with JavaScript call conventions. + +### 6.0.0 + +Removed `password` from responses to operations which require them. This is for two reasons, + +- Consistency between how rulesets operate and how manual processing works. A rule can `Approve` but require the actual password to be stored in the clef storage. +With this change, the same stored password can be used even if rulesets are not enabled, but storage is. +- It also removes the usability-shortcut that a UI might otherwise want to implement; remembering passwords. Since we now will not require the +password on every `Approve`, there's no need for the UI to cache it locally. + - In a future update, we'll likely add `clef_storePassword` to the internal API, so the user can store it via his UI (currently only CLI works). + +Affected datatypes: +- `SignTxResponse` +- `SignDataResponse` +- `NewAccountResponse` + +If `clef` requires a password, the `OnInputRequired` will be used to collect it. + + +### 5.0.0 + +Changed the namespace format to adhere to the legacy ethereum format: `name_methodName`. Changes: + +* `ApproveTx` -> `ui_approveTx` +* `ApproveSignData` -> `ui_approveSignData` +* `ApproveExport` -> `removed` +* `ApproveImport` -> `removed` +* `ApproveListing` -> `ui_approveListing` +* `ApproveNewAccount` -> `ui_approveNewAccount` +* `ShowError` -> `ui_showError` +* `ShowInfo` -> `ui_showInfo` +* `OnApprovedTx` -> `ui_onApprovedTx` +* `OnSignerStartup` -> `ui_onSignerStartup` +* `OnInputRequired` -> `ui_onInputRequired` + + +### 4.0.0 + +* Bidirectional communication implemented, so the UI can query `clef` via the stdin/stdout RPC channel. Methods implemented are: + - `clef_listWallets` + - `clef_listAccounts` + - `clef_listWallets` + - `clef_deriveAccount` + - `clef_importRawKey` + - `clef_openWallet` + - `clef_chainId` + - `clef_setChainId` + - `clef_export` + - `clef_import` + +* The type `Account` was modified (the json-field `type` was removed), to consist of + +```go +type Account struct { + Address common.Address `json:"address"` // Ethereum account address derived from the key + URL URL `json:"url"` // Optional resource locator within a backend +} +``` + + +### 3.2.0 + +* Make `ShowError`, `OnApprovedTx`, `OnSignerStartup` be json-rpc [notifications](https://www.jsonrpc.org/specification#notification): + +> A Notification is a Request object without an "id" member. A Request object that is a Notification signifies the Client's lack of interest in the corresponding Response object, and as such no Response object needs to be returned to the client. The Server MUST NOT reply to a Notification, including those that are within a batch request. +> +> Notifications are not confirmable by definition, since they do not have a Response object to be returned. As such, the Client would not be aware of any errors (like e.g. "Invalid params","Internal error" +### 3.1.0 + +* Add `ContentType` `string` to `SignDataRequest` to accommodate the latest EIP-191 and EIP-712 implementations. ### 3.0.0 @@ -9,15 +94,17 @@ * Add `OnInputRequired(info UserInputRequest)` to internal API. This method is used when Clef needs user input, e.g. passwords. The following structures are used: -```golang - UserInputRequest struct { - Prompt string `json:"prompt"` - Title string `json:"title"` - IsPassword bool `json:"isPassword"` - } - UserInputResponse struct { - Text string `json:"text"` - } + +```go +UserInputRequest struct { + Prompt string `json:"prompt"` + Title string `json:"title"` + IsPassword bool `json:"isPassword"` +} +UserInputResponse struct { + Text string `json:"text"` +} +``` ### 2.0.0 @@ -91,15 +178,3 @@ Example call: #### 1.0.0 Initial release. - -### Versioning - -The API uses [semantic versioning](https://semver.org/). - -TLDR; Given a version number MAJOR.MINOR.PATCH, increment the: - -* MAJOR version when you make incompatible API changes, -* MINOR version when you add functionality in a backwards-compatible manner, and -* PATCH version when you make backwards-compatible bug fixes. - -Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format. diff --git a/cmd/clef/main.go b/cmd/clef/main.go index b0fdefff0d91..b2c8812ab269 100644 --- a/cmd/clef/main.go +++ b/cmd/clef/main.go @@ -14,8 +14,6 @@ // You should have received a copy of the GNU General Public License // along with go-ethereum. If not, see . -// signer is a utility that can be used so sign transactions and -// arbitrary data. package main import ( @@ -28,42 +26,50 @@ import ( "fmt" "io" "io/ioutil" + "math/big" "os" "os/signal" "os/user" "path/filepath" "runtime" "strings" - - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/console" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/signer/core" - "github.com/nebulaai/nbai-node/signer/rules" - "github.com/nebulaai/nbai-node/signer/storage" + "time" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/console" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/signer/core" + "github.com/ethereum/go-ethereum/signer/fourbyte" + "github.com/ethereum/go-ethereum/signer/rules" + "github.com/ethereum/go-ethereum/signer/storage" + colorable "github.com/mattn/go-colorable" + "github.com/mattn/go-isatty" "gopkg.in/urfave/cli.v1" ) -// ExternalAPIVersion -- see extapi_changelog.md -const ExternalAPIVersion = "4.0.0" - -// InternalAPIVersion -- see intapi_changelog.md -const InternalAPIVersion = "3.0.0" - const legalWarning = ` -WARNING! +WARNING! -Clef is alpha software, and not yet publically released. This software has _not_ been audited, and there -are no guarantees about the workings of this software. It may contain severe flaws. You should not use this software -unless you agree to take full responsibility for doing so, and know what you are doing. +Clef is an account management tool. It may, like any software, contain bugs. -TLDR; THIS IS NOT PRODUCTION-READY SOFTWARE! +Please take care to +- backup your keystore files, +- verify that the keystore(s) can be opened with your password. +Clef 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. ` var ( @@ -86,6 +92,11 @@ var ( Value: DefaultConfigDir(), Usage: "Directory for Clef configuration", } + chainIdFlag = cli.Int64Flag{ + Name: "chainid", + Value: params.MainnetChainConfig.ChainID.Int64(), + Usage: "Chain id to use for signing (1=mainnet, 3=Ropsten, 4=Rinkeby, 5=Goerli)", + } rpcPortFlag = cli.IntFlag{ Name: "rpcport", Usage: "HTTP-RPC server listening port", @@ -95,11 +106,6 @@ var ( Name: "signersecret", Usage: "A file containing the (encrypted) master seed to encrypt Clef data, e.g. keystore credentials and ruleset hash", } - dBFlag = cli.StringFlag{ - Name: "4bytedb", - Usage: "File containing 4byte-identifiers", - Value: "./4byte.json", - } customDBFlag = cli.StringFlag{ Name: "4bytedb-custom", Usage: "File used for writing new 4byte-identifiers submitted via API", @@ -112,8 +118,7 @@ var ( } ruleFlag = cli.StringFlag{ Name: "rules", - Usage: "Enable rule-engine", - Value: "rules.json", + Usage: "Path to the rule file to auto-authorize requests with", } stdiouiFlag = cli.BoolFlag{ Name: "stdio-ui", @@ -136,7 +141,7 @@ var ( configdirFlag, }, Description: ` -The init command generates a master seed which Clef can use to store credentials and data needed for +The init command generates a master seed which Clef can use to store credentials and data needed for the rule-engine to work.`, } attestCommand = cli.Command{ @@ -150,13 +155,12 @@ the rule-engine to work.`, signerSecretFlag, }, Description: ` -The attest command stores the sha256 of the rule.js-file that you want to use for automatic processing of -incoming requests. +The attest command stores the sha256 of the rule.js-file that you want to use for automatic processing of +incoming requests. -Whenever you make an edit to the rule file, you need to use attestation to tell +Whenever you make an edit to the rule file, you need to use attestation to tell Clef that the file is 'safe' to execute.`, } - setCredentialCommand = cli.Command{ Action: utils.MigrateFlags(setCredential), Name: "setpw", @@ -168,10 +172,28 @@ Clef that the file is 'safe' to execute.`, signerSecretFlag, }, Description: ` - The setpw command stores a password for a given address (keyfile). If you enter a blank passphrase, it will -remove any stored credential for that address (keyfile) -`, - } +The setpw command stores a password for a given address (keyfile). +`} + delCredentialCommand = cli.Command{ + Action: utils.MigrateFlags(removeCredential), + Name: "delpw", + Usage: "Remove a credential for a keystore file", + ArgsUsage: "
", + Flags: []cli.Flag{ + logLevelFlag, + configdirFlag, + signerSecretFlag, + }, + Description: ` +The delpw command removes a password for a given address (keyfile). +`} + gendocCommand = cli.Command{ + Action: GenDoc, + Name: "gendoc", + Usage: "Generate documentation about json-rpc format", + Description: ` +The gendoc generates example structures of the json-rpc communication types. +`} ) func init() { @@ -181,9 +203,10 @@ func init() { logLevelFlag, keystoreFlag, configdirFlag, - utils.NetworkIdFlag, + chainIdFlag, utils.LightKDFFlag, utils.NoUSBFlag, + utils.SmartCardDaemonPathFlag, utils.RPCListenAddrFlag, utils.RPCVirtualHostsFlag, utils.IPCDisabledFlag, @@ -191,7 +214,6 @@ func init() { utils.RPCEnabledFlag, rpcPortFlag, signerSecretFlag, - dBFlag, customDBFlag, auditLogFlag, ruleFlag, @@ -200,9 +222,10 @@ func init() { advancedMode, } app.Action = signer - app.Commands = []cli.Command{initCommand, attestCommand, setCredentialCommand} - + app.Commands = []cli.Command{initCommand, attestCommand, setCredentialCommand, delCredentialCommand, gendocCommand} + cli.CommandHelpTemplate = utils.OriginCommandHelpTemplate } + func main() { if err := app.Run(os.Args); err != nil { fmt.Fprintln(os.Stderr, err) @@ -211,11 +234,20 @@ func main() { } func initializeSecrets(c *cli.Context) error { + // Get past the legal message if err := initialize(c); err != nil { return err } + // Ensure the master key does not yet exist, we're not willing to overwrite configDir := c.GlobalString(configdirFlag.Name) - + if err := os.Mkdir(configDir, 0700); err != nil && !os.IsExist(err) { + return err + } + location := filepath.Join(configDir, "masterseed.json") + if _, err := os.Stat(location); err == nil { + return fmt.Errorf("master key %v already exists, will not overwrite", location) + } + // Key file does not exist yet, generate a new one and encrypt it masterSeed := make([]byte, 256) num, err := io.ReadFull(rand.Reader, masterSeed) if err != nil { @@ -224,18 +256,18 @@ func initializeSecrets(c *cli.Context) error { if num != len(masterSeed) { return fmt.Errorf("failed to read enough random") } - n, p := keystore.StandardScryptN, keystore.StandardScryptP if c.GlobalBool(utils.LightKDFFlag.Name) { n, p = keystore.LightScryptN, keystore.LightScryptP } - text := "The master seed of clef is locked with a password. Please give a password. Do not forget this password." + text := "The master seed of clef will be locked with a password.\nPlease specify a password. Do not forget this password!" var password string for { password = getPassPhrase(text, true) if err := core.ValidatePasswordFormat(password); err != nil { fmt.Printf("invalid password: %v\n", err) } else { + fmt.Println() break } } @@ -243,28 +275,27 @@ func initializeSecrets(c *cli.Context) error { if err != nil { return fmt.Errorf("failed to encrypt master seed: %v", err) } - - err = os.Mkdir(configDir, 0700) - if err != nil && !os.IsExist(err) { + // Double check the master key path to ensure nothing wrote there in between + if err = os.Mkdir(configDir, 0700); err != nil && !os.IsExist(err) { return err } - location := filepath.Join(configDir, "masterseed.json") if _, err := os.Stat(location); err == nil { - return fmt.Errorf("file %v already exists, will not overwrite", location) + return fmt.Errorf("master key %v already exists, will not overwrite", location) } - err = ioutil.WriteFile(location, cipherSeed, 0400) - if err != nil { + // Write the file and print the usual warning message + if err = ioutil.WriteFile(location, cipherSeed, 0400); err != nil { return err } fmt.Printf("A master seed has been generated into %s\n", location) fmt.Printf(` -This is required to be able to store credentials, such as : +This is required to be able to store credentials, such as: * Passwords for keystores (used by rule engine) -* Storage for javascript rules -* Hash of rule-file +* Storage for JavaScript auto-signing rules +* Hash of JavaScript rule-file -You should treat that file with utmost secrecy, and make a backup of it. -NOTE: This file does not contain your accounts. Those need to be backed up separately! +You should treat 'masterseed.json' with utmost secrecy and make a backup of it! +* The password is necessary but not enough, you need to back up the master seed too! +* The master seed does not contain your accounts, those need to be backed up separately! `) return nil @@ -295,14 +326,46 @@ func attestFile(ctx *cli.Context) error { func setCredential(ctx *cli.Context) error { if len(ctx.Args()) < 1 { - utils.Fatalf("This command requires an address to be passed as an argument.") + utils.Fatalf("This command requires an address to be passed as an argument") } if err := initialize(ctx); err != nil { return err } + addr := ctx.Args().First() + if !common.IsHexAddress(addr) { + utils.Fatalf("Invalid address specified: %s", addr) + } + address := common.HexToAddress(addr) + password := getPassPhrase("Please enter a password to store for this address:", true) + fmt.Println() + + stretchedKey, err := readMasterKey(ctx, nil) + if err != nil { + utils.Fatalf(err.Error()) + } + configDir := ctx.GlobalString(configdirFlag.Name) + vaultLocation := filepath.Join(configDir, common.Bytes2Hex(crypto.Keccak256([]byte("vault"), stretchedKey)[:10])) + pwkey := crypto.Keccak256([]byte("credentials"), stretchedKey) + + pwStorage := storage.NewAESEncryptedStorage(filepath.Join(vaultLocation, "credentials.json"), pwkey) + pwStorage.Put(address.Hex(), password) + + log.Info("Credential store updated", "set", address) + return nil +} - address := ctx.Args().First() - password := getPassPhrase("Enter a passphrase to store with this address.", true) +func removeCredential(ctx *cli.Context) error { + if len(ctx.Args()) < 1 { + utils.Fatalf("This command requires an address to be passed as an argument") + } + if err := initialize(ctx); err != nil { + return err + } + addr := ctx.Args().First() + if !common.IsHexAddress(addr) { + utils.Fatalf("Invalid address specified: %s", addr) + } + address := common.HexToAddress(addr) stretchedKey, err := readMasterKey(ctx, nil) if err != nil { @@ -312,10 +375,10 @@ func setCredential(ctx *cli.Context) error { vaultLocation := filepath.Join(configDir, common.Bytes2Hex(crypto.Keccak256([]byte("vault"), stretchedKey)[:10])) pwkey := crypto.Keccak256([]byte("credentials"), stretchedKey) - // Initialize the encrypted storages pwStorage := storage.NewAESEncryptedStorage(filepath.Join(vaultLocation, "credentials.json"), pwkey) - pwStorage.Put(address, password) - log.Info("Credential store updated", "key", address) + pwStorage.Del(address.Hex()) + + log.Info("Credential store updated", "unset", address) return nil } @@ -325,23 +388,54 @@ func initialize(c *cli.Context) error { if c.GlobalBool(stdiouiFlag.Name) { logOutput = os.Stderr // If using the stdioui, we can't do the 'confirm'-flow - fmt.Fprintf(logOutput, legalWarning) + fmt.Fprint(logOutput, legalWarning) } else { if !confirm(legalWarning) { return fmt.Errorf("aborted by user") } + fmt.Println() + } + usecolor := (isatty.IsTerminal(os.Stderr.Fd()) || isatty.IsCygwinTerminal(os.Stderr.Fd())) && os.Getenv("TERM") != "dumb" + output := io.Writer(logOutput) + if usecolor { + output = colorable.NewColorable(logOutput) } + log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(c.Int(logLevelFlag.Name)), log.StreamHandler(output, log.TerminalFormat(usecolor)))) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(c.Int(logLevelFlag.Name)), log.StreamHandler(logOutput, log.TerminalFormat(true)))) return nil } +// ipcEndpoint resolves an IPC endpoint based on a configured value, taking into +// account the set data folders as well as the designated platform we're currently +// running on. +func ipcEndpoint(ipcPath, datadir string) string { + // On windows we can only use plain top-level pipes + if runtime.GOOS == "windows" { + if strings.HasPrefix(ipcPath, `\\.\pipe\`) { + return ipcPath + } + return `\\.\pipe\` + ipcPath + } + // Resolve names into the data directory full paths otherwise + if filepath.Base(ipcPath) == ipcPath { + if datadir == "" { + return filepath.Join(os.TempDir(), ipcPath) + } + return filepath.Join(datadir, ipcPath) + } + return ipcPath +} + func signer(c *cli.Context) error { + // If we have some unrecognized command, bail out + if args := c.Args(); len(args) > 0 { + return fmt.Errorf("invalid command: %q", args[0]) + } if err := initialize(c); err != nil { return err } var ( - ui core.SignerUI + ui core.UIClientAPI ) if c.GlobalBool(stdiouiFlag.Name) { log.Info("Using stdin/stdout as UI-channel") @@ -350,26 +444,24 @@ func signer(c *cli.Context) error { log.Info("Using CLI as UI-channel") ui = core.NewCommandlineUI() } - fourByteDb := c.GlobalString(dBFlag.Name) + // 4bytedb data fourByteLocal := c.GlobalString(customDBFlag.Name) - db, err := core.NewAbiDBFromFiles(fourByteDb, fourByteLocal) + db, err := fourbyte.NewWithFile(fourByteLocal) if err != nil { utils.Fatalf(err.Error()) } - log.Info("Loaded 4byte db", "signatures", db.Size(), "file", fourByteDb, "local", fourByteLocal) + embeds, locals := db.Size() + log.Info("Loaded 4byte database", "embeds", embeds, "locals", locals, "local", fourByteLocal) var ( - api core.ExternalAPI + api core.ExternalAPI + pwStorage storage.Storage = &storage.NoStorage{} ) configDir := c.GlobalString(configdirFlag.Name) if stretchedKey, err := readMasterKey(c, ui); err != nil { - log.Info("No master seed provided, rules disabled", "error", err) + log.Warn("Failed to open master, rules disabled", "err", err) } else { - - if err != nil { - utils.Fatalf(err.Error()) - } vaultLocation := filepath.Join(configDir, common.Bytes2Hex(crypto.Keccak256([]byte("vault"), stretchedKey)[:10])) // Generate domain specific keys @@ -378,41 +470,50 @@ func signer(c *cli.Context) error { confkey := crypto.Keccak256([]byte("config"), stretchedKey) // Initialize the encrypted storages - pwStorage := storage.NewAESEncryptedStorage(filepath.Join(vaultLocation, "credentials.json"), pwkey) + pwStorage = storage.NewAESEncryptedStorage(filepath.Join(vaultLocation, "credentials.json"), pwkey) jsStorage := storage.NewAESEncryptedStorage(filepath.Join(vaultLocation, "jsstorage.json"), jskey) configStorage := storage.NewAESEncryptedStorage(filepath.Join(vaultLocation, "config.json"), confkey) - //Do we have a rule-file? - ruleJS, err := ioutil.ReadFile(c.GlobalString(ruleFlag.Name)) - if err != nil { - log.Info("Could not load rulefile, rules not enabled", "file", "rulefile") - } else { - hasher := sha256.New() - hasher.Write(ruleJS) - shasum := hasher.Sum(nil) - storedShasum := configStorage.Get("ruleset_sha256") - if storedShasum != hex.EncodeToString(shasum) { - log.Info("Could not validate ruleset hash, rules not enabled", "got", hex.EncodeToString(shasum), "expected", storedShasum) + // Do we have a rule-file? + if ruleFile := c.GlobalString(ruleFlag.Name); ruleFile != "" { + ruleJS, err := ioutil.ReadFile(ruleFile) + if err != nil { + log.Warn("Could not load rules, disabling", "file", ruleFile, "err", err) } else { - // Initialize rules - ruleEngine, err := rules.NewRuleEvaluator(ui, jsStorage, pwStorage) - if err != nil { - utils.Fatalf(err.Error()) + shasum := sha256.Sum256(ruleJS) + foundShaSum := hex.EncodeToString(shasum[:]) + storedShasum, _ := configStorage.Get("ruleset_sha256") + if storedShasum != foundShaSum { + log.Warn("Rule hash not attested, disabling", "hash", foundShaSum, "attested", storedShasum) + } else { + // Initialize rules + ruleEngine, err := rules.NewRuleEvaluator(ui, jsStorage) + if err != nil { + utils.Fatalf(err.Error()) + } + ruleEngine.Init(string(ruleJS)) + ui = ruleEngine + log.Info("Rule engine configured", "file", c.String(ruleFlag.Name)) } - ruleEngine.Init(string(ruleJS)) - ui = ruleEngine - log.Info("Rule engine configured", "file", c.String(ruleFlag.Name)) } } } - - apiImpl := core.NewSignerAPI( - c.GlobalInt64(utils.NetworkIdFlag.Name), - c.GlobalString(keystoreFlag.Name), - c.GlobalBool(utils.NoUSBFlag.Name), - ui, db, - c.GlobalBool(utils.LightKDFFlag.Name), - c.GlobalBool(advancedMode.Name)) + var ( + chainId = c.GlobalInt64(chainIdFlag.Name) + ksLoc = c.GlobalString(keystoreFlag.Name) + lightKdf = c.GlobalBool(utils.LightKDFFlag.Name) + advanced = c.GlobalBool(advancedMode.Name) + nousb = c.GlobalBool(utils.NoUSBFlag.Name) + scpath = c.GlobalString(utils.SmartCardDaemonPathFlag.Name) + ) + log.Info("Starting signer", "chainid", chainId, "keystore", ksLoc, + "light-kdf", lightKdf, "advanced", advanced) + am := core.StartClefAccountManager(ksLoc, nousb, lightKdf, scpath) + apiImpl := core.NewSignerAPI(am, chainId, nousb, ui, db, advanced, pwStorage) + + // Establish the bidirectional communication, by creating a new UI backend and registering + // it with the UI. + ui.RegisterUIServer(core.NewUIServerAPI(apiImpl)) api = apiImpl // Audit logging if logfile := c.GlobalString(auditLogFlag.Name); logfile != "" { @@ -435,7 +536,6 @@ func signer(c *cli.Context) error { Version: "1.0"}, } if c.GlobalBool(utils.RPCEnabledFlag.Name) { - vhosts := splitAndTrim(c.GlobalString(utils.RPCVirtualHostsFlag.Name)) cors := splitAndTrim(c.GlobalString(utils.RPCCORSDomainFlag.Name)) @@ -452,15 +552,10 @@ func signer(c *cli.Context) error { listener.Close() log.Info("HTTP endpoint closed", "url", httpEndpoint) }() - } if !c.GlobalBool(utils.IPCDisabledFlag.Name) { - if c.IsSet(utils.IPCPathFlag.Name) { - ipcapiURL = c.GlobalString(utils.IPCPathFlag.Name) - } else { - ipcapiURL = filepath.Join(configDir, "clef.ipc") - } - + givenPath := c.GlobalString(utils.IPCPathFlag.Name) + ipcapiURL = ipcEndpoint(filepath.Join(givenPath, "clef.ipc"), configDir) listener, _, err := rpc.StartIPCEndpoint(ipcapiURL, rpcAPI) if err != nil { utils.Fatalf("Could not start IPC api: %v", err) @@ -470,7 +565,6 @@ func signer(c *cli.Context) error { listener.Close() log.Info("IPC endpoint closed", "url", ipcapiURL) }() - } if c.GlobalBool(testFlag.Name) { @@ -479,14 +573,14 @@ func signer(c *cli.Context) error { } ui.OnSignerStartup(core.StartupInfo{ Info: map[string]interface{}{ - "extapi_version": ExternalAPIVersion, - "intapi_version": InternalAPIVersion, + "intapi_version": core.InternalAPIVersion, + "extapi_version": core.ExternalAPIVersion, "extapi_http": extapiURL, "extapi_ipc": ipcapiURL, }, }) - abortChan := make(chan os.Signal) + abortChan := make(chan os.Signal, 1) signal.Notify(abortChan, os.Interrupt) sig := <-abortChan @@ -514,7 +608,12 @@ func DefaultConfigDir() string { if runtime.GOOS == "darwin" { return filepath.Join(home, "Library", "Signer") } else if runtime.GOOS == "windows" { - return filepath.Join(home, "AppData", "Roaming", "Signer") + appdata := os.Getenv("APPDATA") + if appdata != "" { + return filepath.Join(appdata, "Signer") + } else { + return filepath.Join(home, "AppData", "Roaming", "Signer") + } } else { return filepath.Join(home, ".clef") } @@ -532,7 +631,7 @@ func homeDir() string { } return "" } -func readMasterKey(ctx *cli.Context, ui core.SignerUI) ([]byte, error) { +func readMasterKey(ctx *cli.Context, ui core.UIClientAPI) ([]byte, error) { var ( file string configDir = ctx.GlobalString(configdirFlag.Name) @@ -570,7 +669,6 @@ func readMasterKey(ctx *cli.Context, ui core.SignerUI) ([]byte, error) { if len(masterSeed) < 256 { return nil, fmt.Errorf("master seed of insufficient length, expected >255 bytes, got %d", len(masterSeed)) } - // Create vault location vaultLocation := filepath.Join(configDir, common.Bytes2Hex(crypto.Keccak256([]byte("vault"), masterSeed)[:10])) err = os.Mkdir(vaultLocation, 0700) @@ -597,14 +695,13 @@ func checkFile(filename string) error { // confirm displays a text and asks for user confirmation func confirm(text string) bool { - fmt.Printf(text) - fmt.Printf("\nEnter 'ok' to proceed:\n>") + fmt.Print(text) + fmt.Printf("\nEnter 'ok' to proceed:\n> ") text, err := bufio.NewReader(os.Stdin).ReadString('\n') if err != nil { log.Crit("Failed to read user input", "err", err) } - if text := strings.TrimSpace(text); text == "ok" { return true } @@ -616,42 +713,145 @@ func testExternalUI(api *core.SignerAPI) { ctx := context.WithValue(context.Background(), "remote", "clef binary") ctx = context.WithValue(ctx, "scheme", "in-proc") ctx = context.WithValue(ctx, "local", "main") - errs := make([]string, 0) - api.UI.ShowInfo("Testing 'ShowInfo'") - api.UI.ShowError("Testing 'ShowError'") + a := common.HexToAddress("0xdeadbeef000000000000000000000000deadbeef") + addErr := func(errStr string) { + log.Info("Test error", "err", errStr) + errs = append(errs, errStr) + } - checkErr := func(method string, err error) { - if err != nil && err != core.ErrRequestDenied { - errs = append(errs, fmt.Sprintf("%v: %v", method, err.Error())) + queryUser := func(q string) string { + resp, err := api.UI.OnInputRequired(core.UserInputRequest{ + Title: "Testing", + Prompt: q, + }) + if err != nil { + addErr(err.Error()) } + return resp.Text } - var err error - - _, err = api.SignTransaction(ctx, core.SendTxArgs{From: common.MixedcaseAddress{}}, nil) - checkErr("SignTransaction", err) - _, err = api.Sign(ctx, common.MixedcaseAddress{}, common.Hex2Bytes("01020304")) - checkErr("Sign", err) - _, err = api.List(ctx) - checkErr("List", err) - _, err = api.New(ctx) - checkErr("New", err) - _, err = api.Export(ctx, common.Address{}) - checkErr("Export", err) - _, err = api.Import(ctx, json.RawMessage{}) - checkErr("Import", err) - - api.UI.ShowInfo("Tests completed") - - if len(errs) > 0 { - log.Error("Got errors") - for _, e := range errs { - log.Error(e) + expectResponse := func(testcase, question, expect string) { + if got := queryUser(question); got != expect { + addErr(fmt.Sprintf("%s: got %v, expected %v", testcase, got, expect)) } - } else { - log.Info("No errors") } + expectApprove := func(testcase string, err error) { + if err == nil || err == accounts.ErrUnknownAccount { + return + } + addErr(fmt.Sprintf("%v: expected no error, got %v", testcase, err.Error())) + } + expectDeny := func(testcase string, err error) { + if err == nil || err != core.ErrRequestDenied { + addErr(fmt.Sprintf("%v: expected ErrRequestDenied, got %v", testcase, err)) + } + } + var delay = 1 * time.Second + // Test display of info and error + { + api.UI.ShowInfo("If you see this message, enter 'yes' to next question") + time.Sleep(delay) + expectResponse("showinfo", "Did you see the message? [yes/no]", "yes") + api.UI.ShowError("If you see this message, enter 'yes' to the next question") + time.Sleep(delay) + expectResponse("showerror", "Did you see the message? [yes/no]", "yes") + } + { // Sign data test - clique header + api.UI.ShowInfo("Please approve the next request for signing a clique header") + time.Sleep(delay) + cliqueHeader := types.Header{ + ParentHash: common.HexToHash("0000H45H"), + UncleHash: common.HexToHash("0000H45H"), + Coinbase: common.HexToAddress("0000H45H"), + Root: common.HexToHash("0000H00H"), + TxHash: common.HexToHash("0000H45H"), + ReceiptHash: common.HexToHash("0000H45H"), + Difficulty: big.NewInt(1337), + Number: big.NewInt(1337), + GasLimit: 1338, + GasUsed: 1338, + Time: 1338, + Extra: []byte("Extra data Extra data Extra data Extra data Extra data Extra data Extra data Extra data"), + MixDigest: common.HexToHash("0x0000H45H"), + } + cliqueRlp, err := rlp.EncodeToBytes(cliqueHeader) + if err != nil { + utils.Fatalf("Should not error: %v", err) + } + addr, _ := common.NewMixedcaseAddressFromString("0x0011223344556677889900112233445566778899") + _, err = api.SignData(ctx, accounts.MimetypeClique, *addr, hexutil.Encode(cliqueRlp)) + expectApprove("signdata - clique header", err) + } + { // Sign data test - typed data + api.UI.ShowInfo("Please approve the next request for signing EIP-712 typed data") + time.Sleep(delay) + addr, _ := common.NewMixedcaseAddressFromString("0x0011223344556677889900112233445566778899") + data := `{"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"Person":[{"name":"name","type":"string"},{"name":"test","type":"uint8"},{"name":"wallet","type":"address"}],"Mail":[{"name":"from","type":"Person"},{"name":"to","type":"Person"},{"name":"contents","type":"string"}]},"primaryType":"Mail","domain":{"name":"Ether Mail","version":"1","chainId":"1","verifyingContract":"0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"},"message":{"from":{"name":"Cow","test":"3","wallet":"0xcD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826"},"to":{"name":"Bob","wallet":"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB","test":"2"},"contents":"Hello, Bob!"}}` + //_, err := api.SignData(ctx, accounts.MimetypeTypedData, *addr, hexutil.Encode([]byte(data))) + var typedData core.TypedData + json.Unmarshal([]byte(data), &typedData) + _, err := api.SignTypedData(ctx, *addr, typedData) + expectApprove("sign 712 typed data", err) + } + { // Sign data test - plain text + api.UI.ShowInfo("Please approve the next request for signing text") + time.Sleep(delay) + addr, _ := common.NewMixedcaseAddressFromString("0x0011223344556677889900112233445566778899") + _, err := api.SignData(ctx, accounts.MimetypeTextPlain, *addr, hexutil.Encode([]byte("hello world"))) + expectApprove("signdata - text", err) + } + { // Sign data test - plain text reject + api.UI.ShowInfo("Please deny the next request for signing text") + time.Sleep(delay) + addr, _ := common.NewMixedcaseAddressFromString("0x0011223344556677889900112233445566778899") + _, err := api.SignData(ctx, accounts.MimetypeTextPlain, *addr, hexutil.Encode([]byte("hello world"))) + expectDeny("signdata - text", err) + } + { // Sign transaction + + api.UI.ShowInfo("Please reject next transaction") + time.Sleep(delay) + data := hexutil.Bytes([]byte{}) + to := common.NewMixedcaseAddress(a) + tx := core.SendTxArgs{ + Data: &data, + Nonce: 0x1, + Value: hexutil.Big(*big.NewInt(6)), + From: common.NewMixedcaseAddress(a), + To: &to, + GasPrice: hexutil.Big(*big.NewInt(5)), + Gas: 1000, + Input: nil, + } + _, err := api.SignTransaction(ctx, tx, nil) + expectDeny("signtransaction [1]", err) + expectResponse("signtransaction [2]", "Did you see any warnings for the last transaction? (yes/no)", "no") + } + { // Listing + api.UI.ShowInfo("Please reject listing-request") + time.Sleep(delay) + _, err := api.List(ctx) + expectDeny("list", err) + } + { // Import + api.UI.ShowInfo("Please reject new account-request") + time.Sleep(delay) + _, err := api.New(ctx) + expectDeny("newaccount", err) + } + { // Metadata + api.UI.ShowInfo("Please check if you see the Origin in next listing (approve or deny)") + time.Sleep(delay) + api.List(context.WithValue(ctx, "Origin", "origin.com")) + expectResponse("metadata - origin", "Did you see origin (origin.com)? [yes/no] ", "yes") + } + + for _, e := range errs { + log.Error(e) + } + result := fmt.Sprintf("Tests completed. %d errors:\n%s\n", len(errs), strings.Join(errs, "\n")) + api.UI.ShowInfo(result) } @@ -660,17 +860,17 @@ func testExternalUI(api *core.SignerAPI) { // TODO: there are many `getPassPhrase` functions, it will be better to abstract them into one. func getPassPhrase(prompt string, confirmation bool) string { fmt.Println(prompt) - password, err := console.Stdin.PromptPassword("Passphrase: ") + password, err := console.Stdin.PromptPassword("Password: ") if err != nil { - utils.Fatalf("Failed to read passphrase: %v", err) + utils.Fatalf("Failed to read password: %v", err) } if confirmation { - confirm, err := console.Stdin.PromptPassword("Repeat passphrase: ") + confirm, err := console.Stdin.PromptPassword("Repeat password: ") if err != nil { - utils.Fatalf("Failed to read passphrase confirmation: %v", err) + utils.Fatalf("Failed to read password confirmation: %v", err) } if password != confirm { - utils.Fatalf("Passphrases do not match") + utils.Fatalf("Passwords do not match") } } return password @@ -708,28 +908,155 @@ func decryptSeed(keyjson []byte, auth string) ([]byte, error) { return seed, err } -/** -//Create Account - -curl -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_new","params":["test"],"id":67}' localhost:8550 - -// List accounts - -curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_list","params":[""],"id":67}' http://localhost:8550/ - -// Make Transaction -// safeSend(0x12) -// 4401a6e40000000000000000000000000000000000000000000000000000000000000012 - -// supplied abi -curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_signTransaction","params":[{"from":"0x82A2A876D39022B3019932D30Cd9c97ad5616813","gas":"0x333","gasPrice":"0x123","nonce":"0x0","to":"0x07a565b7ed7d7a678680a4c162885bedbb695fe0", "value":"0x10", "data":"0x4401a6e40000000000000000000000000000000000000000000000000000000000000012"},"test"],"id":67}' http://localhost:8550/ - -// Not supplied -curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_signTransaction","params":[{"from":"0x82A2A876D39022B3019932D30Cd9c97ad5616813","gas":"0x333","gasPrice":"0x123","nonce":"0x0","to":"0x07a565b7ed7d7a678680a4c162885bedbb695fe0", "value":"0x10", "data":"0x4401a6e40000000000000000000000000000000000000000000000000000000000000012"}],"id":67}' http://localhost:8550/ - -// Sign data - -curl -i -H "Content-Type: application/json" -X POST --data '{"jsonrpc":"2.0","method":"account_sign","params":["0x694267f14675d7e1b9494fd8d72fefe1755710fa","bazonk gaz baz"],"id":67}' http://localhost:8550/ +// GenDoc outputs examples of all structures used in json-rpc communication +func GenDoc(ctx *cli.Context) { + var ( + a = common.HexToAddress("0xdeadbeef000000000000000000000000deadbeef") + b = common.HexToAddress("0x1111111122222222222233333333334444444444") + meta = core.Metadata{ + Scheme: "http", + Local: "localhost:8545", + Origin: "www.malicious.ru", + Remote: "localhost:9999", + UserAgent: "Firefox 3.2", + } + output []string + add = func(name, desc string, v interface{}) { + if data, err := json.MarshalIndent(v, "", " "); err == nil { + output = append(output, fmt.Sprintf("### %s\n\n%s\n\nExample:\n```json\n%s\n```", name, desc, data)) + } else { + log.Error("Error generating output", err) + } + } + ) -**/ + { // Sign plain text request + desc := "SignDataRequest contains information about a pending request to sign some data. " + + "The data to be signed can be of various types, defined by content-type. Clef has done most " + + "of the work in canonicalizing and making sense of the data, and it's up to the UI to present" + + "the user with the contents of the `message`" + sighash, msg := accounts.TextAndHash([]byte("hello world")) + messages := []*core.NameValueType{{Name: "message", Value: msg, Typ: accounts.MimetypeTextPlain}} + + add("SignDataRequest", desc, &core.SignDataRequest{ + Address: common.NewMixedcaseAddress(a), + Meta: meta, + ContentType: accounts.MimetypeTextPlain, + Rawdata: []byte(msg), + Messages: messages, + Hash: sighash}) + } + { // Sign plain text response + add("SignDataResponse - approve", "Response to SignDataRequest", + &core.SignDataResponse{Approved: true}) + add("SignDataResponse - deny", "Response to SignDataRequest", + &core.SignDataResponse{}) + } + { // Sign transaction request + desc := "SignTxRequest contains information about a pending request to sign a transaction. " + + "Aside from the transaction itself, there is also a `call_info`-struct. That struct contains " + + "messages of various types, that the user should be informed of." + + "\n\n" + + "As in any request, it's important to consider that the `meta` info also contains untrusted data." + + "\n\n" + + "The `transaction` (on input into clef) can have either `data` or `input` -- if both are set, " + + "they must be identical, otherwise an error is generated. " + + "However, Clef will always use `data` when passing this struct on (if Clef does otherwise, please file a ticket)" + + data := hexutil.Bytes([]byte{0x01, 0x02, 0x03, 0x04}) + add("SignTxRequest", desc, &core.SignTxRequest{ + Meta: meta, + Callinfo: []core.ValidationInfo{ + {Typ: "Warning", Message: "Something looks odd, show this message as a warning"}, + {Typ: "Info", Message: "User should see this as well"}, + }, + Transaction: core.SendTxArgs{ + Data: &data, + Nonce: 0x1, + Value: hexutil.Big(*big.NewInt(6)), + From: common.NewMixedcaseAddress(a), + To: nil, + GasPrice: hexutil.Big(*big.NewInt(5)), + Gas: 1000, + Input: nil, + }}) + } + { // Sign tx response + data := hexutil.Bytes([]byte{0x04, 0x03, 0x02, 0x01}) + add("SignTxResponse - approve", "Response to request to sign a transaction. This response needs to contain the `transaction`"+ + ", because the UI is free to make modifications to the transaction.", + &core.SignTxResponse{Approved: true, + Transaction: core.SendTxArgs{ + Data: &data, + Nonce: 0x4, + Value: hexutil.Big(*big.NewInt(6)), + From: common.NewMixedcaseAddress(a), + To: nil, + GasPrice: hexutil.Big(*big.NewInt(5)), + Gas: 1000, + Input: nil, + }}) + add("SignTxResponse - deny", "Response to SignTxRequest. When denying a request, there's no need to "+ + "provide the transaction in return", + &core.SignTxResponse{}) + } + { // WHen a signed tx is ready to go out + desc := "SignTransactionResult is used in the call `clef` -> `OnApprovedTx(result)`" + + "\n\n" + + "This occurs _after_ successful completion of the entire signing procedure, but right before the signed " + + "transaction is passed to the external caller. This method (and data) can be used by the UI to signal " + + "to the user that the transaction was signed, but it is primarily useful for ruleset implementations." + + "\n\n" + + "A ruleset that implements a rate limitation needs to know what transactions are sent out to the external " + + "interface. By hooking into this methods, the ruleset can maintain track of that count." + + "\n\n" + + "**OBS:** Note that if an attacker can restore your `clef` data to a previous point in time" + + " (e.g through a backup), the attacker can reset such windows, even if he/she is unable to decrypt the content. " + + "\n\n" + + "The `OnApproved` method cannot be responded to, it's purely informative" + + rlpdata := common.FromHex("0xf85d640101948a8eafb1cf62bfbeb1741769dae1a9dd47996192018026a0716bd90515acb1e68e5ac5867aa11a1e65399c3349d479f5fb698554ebc6f293a04e8a4ebfff434e971e0ef12c5bf3a881b06fd04fc3f8b8a7291fb67a26a1d4ed") + var tx types.Transaction + rlp.DecodeBytes(rlpdata, &tx) + add("OnApproved - SignTransactionResult", desc, ðapi.SignTransactionResult{Raw: rlpdata, Tx: &tx}) + + } + { // User input + add("UserInputRequest", "Sent when clef needs the user to provide data. If 'password' is true, the input field should be treated accordingly (echo-free)", + &core.UserInputRequest{IsPassword: true, Title: "The title here", Prompt: "The question to ask the user"}) + add("UserInputResponse", "Response to UserInputRequest", + &core.UserInputResponse{Text: "The textual response from user"}) + } + { // List request + add("ListRequest", "Sent when a request has been made to list addresses. The UI is provided with the "+ + "full `account`s, including local directory names. Note: this information is not passed back to the external caller, "+ + "who only sees the `address`es. ", + &core.ListRequest{ + Meta: meta, + Accounts: []accounts.Account{ + {Address: a, URL: accounts.URL{Scheme: "keystore", Path: "/path/to/keyfile/a"}}, + {Address: b, URL: accounts.URL{Scheme: "keystore", Path: "/path/to/keyfile/b"}}}, + }) + + add("ListResponse", "Response to list request. The response contains a list of all addresses to show to the caller. "+ + "Note: the UI is free to respond with any address the caller, regardless of whether it exists or not", + &core.ListResponse{ + Accounts: []accounts.Account{ + { + Address: common.HexToAddress("0xcowbeef000000cowbeef00000000000000000c0w"), + URL: accounts.URL{Path: ".. ignored .."}, + }, + { + Address: common.HexToAddress("0xffffffffffffffffffffffffffffffffffffffff"), + }, + }}) + } + + fmt.Println(`## UI Client interface + +These data types are defined in the channel between clef and the UI`) + for _, elem := range output { + fmt.Println(elem) + } +} diff --git a/cmd/clef/pythonsigner.py b/cmd/clef/pythonsigner.py index 46fa23bd8c1b..315aabd73fdb 100644 --- a/cmd/clef/pythonsigner.py +++ b/cmd/clef/pythonsigner.py @@ -42,7 +42,6 @@ def send_reply(self, context, reply): self.output.write("\n") class StdIOHandler(): - def __init__(self): pass @@ -76,7 +75,7 @@ def ApproveTx(self,req): :param transaction: transaction info :param call_info: info abou the call, e.g. if ABI info could not be :param meta: metadata about the request, e.g. where the call comes from - :return: + :return: """ transaction = req.get('transaction') _from = req.get('from') @@ -158,8 +157,7 @@ def ShowInfo(self,message = {}): return def main(args): - - cmd = ["./clef", "--stdio-ui"] + cmd = ["clef", "--stdio-ui"] if len(args) > 0 and args[0] == "test": cmd.extend(["--stdio-ui-test"]) print("cmd: {}".format(" ".join(cmd))) diff --git a/cmd/clef/rules.md b/cmd/clef/rules.md index 327ba765c5fb..112dae651220 100644 --- a/cmd/clef/rules.md +++ b/cmd/clef/rules.md @@ -19,32 +19,30 @@ The section below deals with both of them A ruleset file is implemented as a `js` file. Under the hood, the ruleset-engine is a `SignerUI`, implementing the same methods as the `json-rpc` methods defined in the UI protocol. Example: -```javascript - -function asBig(str){ - if(str.slice(0,2) == "0x"){ return new BigNumber(str.slice(2),16)} - return new BigNumber(str) +```js +function asBig(str) { + if (str.slice(0, 2) == "0x") { + return new BigNumber(str.slice(2), 16) + } + return new BigNumber(str) } // Approve transactions to a certain contract if value is below a certain limit -function ApproveTx(req){ - - var limit = big.Newint("0xb1a2bc2ec50000") +function ApproveTx(req) { + var limit = big.Newint("0xb1a2bc2ec50000") var value = asBig(req.transaction.value); - if(req.transaction.to.toLowerCase()=="0xae967917c465db8578ca9024c205720b1a3651a9") - && value.lt(limit) ){ - return "Approve" - } - // If we return "Reject", it will be rejected. - // By not returning anything, it will be passed to the next UI, for manual processing + if (req.transaction.to.toLowerCase() == "0xae967917c465db8578ca9024c205720b1a3651a9") && value.lt(limit)) { + return "Approve" + } + // If we return "Reject", it will be rejected. + // By not returning anything, it will be passed to the next UI, for manual processing } -//Approve listings if request made from IPC +// Approve listings if request made from IPC function ApproveListing(req){ if (req.metadata.scheme == "ipc"){ return "Approve"} } - ``` Whenever the external API is called (and the ruleset is enabled), the `signer` calls the UI, which is an instance of a ruleset-engine. The ruleset-engine @@ -72,7 +70,7 @@ The Otto vm has a few [caveats](https://github.com/robertkrimen/otto): Additionally, a few more have been added * The rule execution cannot load external javascript files. -* The only preloaded libary is [`bignumber.js`](https://github.com/MikeMcl/bignumber.js) version `2.0.3`. This one is fairly old, and is not aligned with the documentation at the github repository. +* The only preloaded library is [`bignumber.js`](https://github.com/MikeMcl/bignumber.js) version `2.0.3`. This one is fairly old, and is not aligned with the documentation at the github repository. * Each invocation is made in a fresh virtual machine. This means that you cannot store data in global variables between invocations. This is a deliberate choice -- if you want to store data, use the disk-backed `storage`, since rules should not rely on ephemeral data. * Javascript API parameters are _always_ an object. This is also a design choice, to ensure that parameters are accessed by _key_ and not by order. This is to prevent mistakes due to missing parameters or parameter changes. * The JS engine has access to `storage` and `console`. @@ -140,97 +138,97 @@ This is now implemented (with ephemeral non-encrypted storage for now, so not ye ## Example 1: ruleset for a rate-limited window -```javascript - - function big(str){ - if(str.slice(0,2) == "0x"){ return new BigNumber(str.slice(2),16)} - return new BigNumber(str) +```js +function big(str) { + if (str.slice(0, 2) == "0x") { + return new BigNumber(str.slice(2), 16) } + return new BigNumber(str) +} - // Time window: 1 week - var window = 1000* 3600*24*7; +// Time window: 1 week +var window = 1000* 3600*24*7; - // Limit : 1 ether - var limit = new BigNumber("1e18"); +// Limit : 1 ether +var limit = new BigNumber("1e18"); - function isLimitOk(transaction){ - var value = big(transaction.value) - // Start of our window function - var windowstart = new Date().getTime() - window; +function isLimitOk(transaction) { + var value = big(transaction.value) + // Start of our window function + var windowstart = new Date().getTime() - window; - var txs = []; - var stored = storage.Get('txs'); + var txs = []; + var stored = storage.get('txs'); - if(stored != ""){ - txs = JSON.parse(stored) - } - // First, remove all that have passed out of the time-window - var newtxs = txs.filter(function(tx){return tx.tstamp > windowstart}); - console.log(txs, newtxs.length); + if (stored != "") { + txs = JSON.parse(stored) + } + // First, remove all that have passed out of the time-window + var newtxs = txs.filter(function(tx){return tx.tstamp > windowstart}); + console.log(txs, newtxs.length); - // Secondly, aggregate the current sum - sum = new BigNumber(0) + // Secondly, aggregate the current sum + sum = new BigNumber(0) - sum = newtxs.reduce(function(agg, tx){ return big(tx.value).plus(agg)}, sum); - console.log("ApproveTx > Sum so far", sum); - console.log("ApproveTx > Requested", value.toNumber()); + sum = newtxs.reduce(function(agg, tx){ return big(tx.value).plus(agg)}, sum); + console.log("ApproveTx > Sum so far", sum); + console.log("ApproveTx > Requested", value.toNumber()); - // Would we exceed weekly limit ? - return sum.plus(value).lt(limit) + // Would we exceed weekly limit ? + return sum.plus(value).lt(limit) +} +function ApproveTx(r) { + if (isLimitOk(r.transaction)) { + return "Approve" } - function ApproveTx(r){ - if (isLimitOk(r.transaction)){ - return "Approve" - } - return "Nope" - } + return "Nope" +} - /** - * OnApprovedTx(str) is called when a transaction has been approved and signed. The parameter - * 'response_str' contains the return value that will be sent to the external caller. - * The return value from this method is ignore - the reason for having this callback is to allow the - * ruleset to keep track of approved transactions. - * - * When implementing rate-limited rules, this callback should be used. - * If a rule responds with neither 'Approve' nor 'Reject' - the tx goes to manual processing. If the user - * then accepts the transaction, this method will be called. - * - * TLDR; Use this method to keep track of signed transactions, instead of using the data in ApproveTx. - */ - function OnApprovedTx(resp){ - var value = big(resp.tx.value) - var txs = [] - // Load stored transactions - var stored = storage.Get('txs'); - if(stored != ""){ - txs = JSON.parse(stored) - } - // Add this to the storage - txs.push({tstamp: new Date().getTime(), value: value}); - storage.Put("txs", JSON.stringify(txs)); +/** +* OnApprovedTx(str) is called when a transaction has been approved and signed. The parameter + * 'response_str' contains the return value that will be sent to the external caller. +* The return value from this method is ignore - the reason for having this callback is to allow the +* ruleset to keep track of approved transactions. +* +* When implementing rate-limited rules, this callback should be used. +* If a rule responds with neither 'Approve' nor 'Reject' - the tx goes to manual processing. If the user +* then accepts the transaction, this method will be called. +* +* TLDR; Use this method to keep track of signed transactions, instead of using the data in ApproveTx. +*/ +function OnApprovedTx(resp) { + var value = big(resp.tx.value) + var txs = [] + // Load stored transactions + var stored = storage.get('txs'); + if (stored != "") { + txs = JSON.parse(stored) } - + // Add this to the storage + txs.push({tstamp: new Date().getTime(), value: value}); + storage.put("txs", JSON.stringify(txs)); +} ``` ## Example 2: allow destination -```javascript - - function ApproveTx(r){ - if(r.transaction.from.toLowerCase()=="0x0000000000000000000000000000000000001337"){ return "Approve"} - if(r.transaction.from.toLowerCase()=="0x000000000000000000000000000000000000dead"){ return "Reject"} - // Otherwise goes to manual processing +```js +function ApproveTx(r) { + if (r.transaction.from.toLowerCase() == "0x0000000000000000000000000000000000001337") { + return "Approve" } - + if (r.transaction.from.toLowerCase() == "0x000000000000000000000000000000000000dead") { + return "Reject" + } + // Otherwise goes to manual processing +} ``` ## Example 3: Allow listing -```javascript - - function ApproveListing(){ - return "Approve" - } - -``` \ No newline at end of file +```js +function ApproveListing() { + return "Approve" +} +``` diff --git a/cmd/clef/tests/testsigner.js b/cmd/clef/tests/testsigner.js new file mode 100644 index 000000000000..258679de5073 --- /dev/null +++ b/cmd/clef/tests/testsigner.js @@ -0,0 +1,89 @@ +// Copyright 2019 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 . + +// This file is a test-utility for testing clef-functionality +// +// Start clef with +// +// build/bin/clef --4bytedb=./cmd/clef/4byte.json --rpc +// +// Start geth with +// +// build/bin/geth --nodiscover --maxpeers 0 --signer http://localhost:8550 console --preload=cmd/clef/tests/testsigner.js +// +// and in the console simply invoke +// +// > test() +// +// You can reload the file via `reload()` + +function reload(){ + loadScript("./cmd/clef/tests/testsigner.js"); +} + +function init(){ + if (typeof accts == 'undefined' || accts.length == 0){ + accts = eth.accounts + console.log("Got accounts ", accts); + } +} +init() +function testTx(){ + if( accts && accts.length > 0) { + var a = accts[0] + var txdata = eth.signTransaction({from: a, to: a, value: 1, nonce: 1, gas: 1, gasPrice: 1}) + var v = parseInt(txdata.tx.v) + console.log("V value: ", v) + if (v == 37 || v == 38){ + console.log("Mainnet 155-protected chainid was used") + } + if (v == 27 || v == 28){ + throw new Error("Mainnet chainid was used, but without replay protection!") + } + } +} +function testSignText(){ + if( accts && accts.length > 0){ + var a = accts[0] + var r = eth.sign(a, "0x68656c6c6f20776f726c64"); //hello world + console.log("signing response", r) + } +} +function testClique(){ + if( accts && accts.length > 0){ + var a = accts[0] + var r = debug.testSignCliqueBlock(a, 0); // Sign genesis + console.log("signing response", r) + if( a != r){ + throw new Error("Requested signing by "+a+ " but got sealer "+r) + } + } +} + +function test(){ + var tests = [ + testTx, + testSignText, + testClique, + ] + for( i in tests){ + try{ + tests[i]() + }catch(err){ + console.log(err) + } + } + } diff --git a/cmd/clef/tutorial.md b/cmd/clef/tutorial.md index 3c589e8e4806..4453472e2d1c 100644 --- a/cmd/clef/tutorial.md +++ b/cmd/clef/tutorial.md @@ -1,200 +1,278 @@ -## Initializing the signer +## Initializing Clef -First, initialize the master seed. +First thing's first, Clef needs to store some data itself. Since that data might be sensitive (passwords, signing rules, accounts), Clef's entire storage is encrypted. To support encrypting data, the first step is to initialize Clef with a random master seed, itself too encrypted with your chosen password: ```text -#./signer init +$ clef init WARNING! -The signer is alpha software, and not yet publically released. This software has _not_ been audited, and there -are no guarantees about the workings of this software. It may contain severe flaws. You should not use this software -unless you agree to take full responsibility for doing so, and know what you are doing. +Clef is an account management tool. It may, like any software, contain bugs. -TLDR; THIS IS NOT PRODUCTION-READY SOFTWARE! +Please take care to +- backup your keystore files, +- verify that the keystore(s) can be opened with your password. +Clef 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. Enter 'ok' to proceed: ->ok -A master seed has been generated into /home/martin/.signer/secrets.dat +> ok -This is required to be able to store credentials, such as : +The master seed of clef will be locked with a password. +Please specify a password. Do not forget this password! +Password: +Repeat password: + +A master seed has been generated into /home/martin/.clef/masterseed.json + +This is required to be able to store credentials, such as: * Passwords for keystores (used by rule engine) -* Storage for javascript rules -* Hash of rule-file +* Storage for JavaScript auto-signing rules +* Hash of JavaScript rule-file -You should treat that file with utmost secrecy, and make a backup of it. -NOTE: This file does not contain your accounts. Those need to be backed up separately! +You should treat 'masterseed.json' with utmost secrecy and make a backup of it! +* The password is necessary but not enough, you need to back up the master seed too! +* The master seed does not contain your accounts, those need to be backed up separately! ``` -(for readability purposes, we'll remove the WARNING printout in the rest of this document) +*For readability purposes, we'll remove the WARNING printout, user confirmation and the unlocking of the master seed in the rest of this document.* -## Creating rules +## Remote interactions -Now, you can create a rule-file. Note that it is not mandatory to use predefined rules, but it's really handy. +Clef is capable of managing both key-file based accounts as well as hardware wallets. To evaluate clef, we're going to point it to our Rinkeby testnet keystore and specify the Rinkeby chain ID for signing (Clef doesn't have a backing chain, so it doesn't know what network it runs on). -```javascript -function ApproveListing(){ - return "Approve" -} +```text +$ clef --keystore ~/.ethereum/rinkeby/keystore --chainid 4 + +INFO [07-01|11:00:46.385] Starting signer chainid=4 keystore=$HOME/.ethereum/rinkeby/keystore light-kdf=false advanced=false +DEBUG[07-01|11:00:46.389] FS scan times list=3.521941ms set=9.017µs diff=4.112µs +DEBUG[07-01|11:00:46.391] Ledger support enabled +DEBUG[07-01|11:00:46.391] Trezor support enabled via HID +DEBUG[07-01|11:00:46.391] Trezor support enabled via WebUSB +INFO [07-01|11:00:46.391] Audit logs configured file=audit.log +DEBUG[07-01|11:00:46.392] IPC registered namespace=account +INFO [07-01|11:00:46.392] IPC endpoint opened url=$HOME/.clef/clef.ipc +------- Signer info ------- +* intapi_version : 7.0.0 +* extapi_version : 6.0.0 +* extapi_http : n/a +* extapi_ipc : $HOME/.clef/clef.ipc ``` -Get the `sha256` hash. If you have openssl, you can do `openssl sha256 rules.js`... +By default, Clef starts up in CLI (Command Line Interface) mode. Arbitrary remote processes may *request* account interactions (e.g. sign a transaction), which the user will need to individually *confirm*. + +To test this out, we can *request* Clef to list all account via its *External API endpoint*: + ```text -#sha256sum rules.js -6c21d1737429d6d4f2e55146da0797782f3c0a0355227f19d702df377c165d72 rules.js +echo '{"id": 1, "jsonrpc": "2.0", "method": "account_list"}' | nc -U ~/.clef/clef.ipc ``` -...now `attest` the file... -```text -#./signer attest 6c21d1737429d6d4f2e55146da0797782f3c0a0355227f19d702df377c165d72 -INFO [02-21|12:14:38] Ruleset attestation updated sha256=6c21d1737429d6d4f2e55146da0797782f3c0a0355227f19d702df377c165d72 +This will prompt the user within the Clef CLI to confirm or deny the request: + +```text +-------- List Account request-------------- +A request has been made to list all accounts. +You can select which accounts the caller can see + [x] 0xD9C9Cd5f6779558b6e0eD4e6Acf6b1947E7fA1F3 + URL: keystore://$HOME/.ethereum/rinkeby/keystore/UTC--2017-04-14T15-15-00.327614556Z--d9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3 + [x] 0x086278A6C067775F71d6B2BB1856Db6E28c30418 + URL: keystore://$HOME/.ethereum/rinkeby/keystore/UTC--2018-02-06T22-53-11.211657239Z--086278a6c067775f71d6b2bb1856db6e28c30418 +------------------------------------------- +Request context: + NA -> NA -> NA + +Additional HTTP header data, provided by the external caller: + User-Agent: + Origin: +Approve? [y/N]: +> ``` -...and (this is required only for non-production versions) load a mock-up `4byte.json` by copying the file from the source to your current working directory: +Depending on whether we approve or deny the request, the original NetCat process will get: + ```text -#cp $GOPATH/src/github.com/nebulaai/nbai-node/cmd/clef/4byte.json $PWD +{"jsonrpc":"2.0","id":1,"result":["0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3","0x086278a6c067775f71d6b2bb1856db6e28c30418"]} + +or + +{"jsonrpc":"2.0","id":1,"error":{"code":-32000,"message":"Request denied"}} ``` -At this point, we can start the signer with the rule-file: +Apart from listing accounts, you can also *request* creating a new account; signing transactions and data; and recovering signatures. You can find the available methods in the Clef [External API Spec](https://github.com/ethereum/go-ethereum/tree/master/cmd/clef#external-api-1) and the [External API Changelog](https://github.com/ethereum/go-ethereum/blob/master/cmd/clef/extapi_changelog.md). + +*Note, the number of things you can do from the External API is deliberately small, since we want to limit the power of remote calls by as much as possible! Clef has an [Internal API](https://github.com/ethereum/go-ethereum/tree/master/cmd/clef#ui-api-1) too for the UI (User Interface) which is much richer and can support custom interfaces on top. But that's out of scope here.* + +## Automatic rules + +For most users, manually confirming every transaction is the way to go. However, there are cases when it makes sense to set up some rules which permit Clef to sign a transaction without prompting the user. One such example would be running a signer on Rinkeby or other PoA networks. + +For starters, we can create a rule file that automatically permits anyone to list our available accounts without user confirmation. The rule file is a tiny JavaScript snippet that you can program however you want: + +```js +function ApproveListing() { + return "Approve" +} +``` + +Of course, Clef isn't going to just accept and run arbitrary scripts you give it, that would be dangerous if someone changes your rule file! Instead, you need to explicitly *attest* the rule file, which entails injecting its hash into Clef's secure store. + ```text -#./signer --rules rules.js --rpc +$ sha256sum rules.js +645b58e4f945e24d0221714ff29f6aa8e860382ced43490529db1695f5fcc71c rules.js -INFO [09-25|20:28:11.866] Using CLI as UI-channel -INFO [09-25|20:28:11.876] Loaded 4byte db signatures=5509 file=./4byte.json -INFO [09-25|20:28:11.877] Rule engine configured file=./rules.js -DEBUG[09-25|20:28:11.877] FS scan times list=100.781µs set=13.253µs diff=5.761µs -DEBUG[09-25|20:28:11.884] Ledger support enabled -DEBUG[09-25|20:28:11.888] Trezor support enabled -INFO [09-25|20:28:11.888] Audit logs configured file=audit.log -DEBUG[09-25|20:28:11.888] HTTP registered namespace=account -INFO [09-25|20:28:11.890] HTTP endpoint opened url=http://localhost:8550 -DEBUG[09-25|20:28:11.890] IPC registered namespace=account -INFO [09-25|20:28:11.890] IPC endpoint opened url= +$ clef attest 645b58e4f945e24d0221714ff29f6aa8e860382ced43490529db1695f5fcc71c +Decrypt master seed of clef +Password: +INFO [07-01|13:25:03.290] Ruleset attestation updated sha256=645b58e4f945e24d0221714ff29f6aa8e860382ced43490529db1695f5fcc71c +``` + +At this point, we can start Clef with the rule file: + +```text +$ clef --keystore ~/.ethereum/rinkeby/keystore --chainid 4 --rules rules.js + +INFO [07-01|13:39:49.726] Rule engine configured file=rules.js +INFO [07-01|13:39:49.726] Starting signer chainid=4 keystore=$HOME/.ethereum/rinkeby/keystore light-kdf=false advanced=false +DEBUG[07-01|13:39:49.726] FS scan times list=35.15µs set=4.251µs diff=2.766µs +DEBUG[07-01|13:39:49.727] Ledger support enabled +DEBUG[07-01|13:39:49.727] Trezor support enabled via HID +DEBUG[07-01|13:39:49.727] Trezor support enabled via WebUSB +INFO [07-01|13:39:49.728] Audit logs configured file=audit.log +DEBUG[07-01|13:39:49.728] IPC registered namespace=account +INFO [07-01|13:39:49.728] IPC endpoint opened url=$HOME/.clef/clef.ipc ------- Signer info ------- -* extapi_version : 2.0.0 -* intapi_version : 2.0.0 -* extapi_http : http://localhost:8550 -* extapi_ipc : +* intapi_version : 7.0.0 +* extapi_version : 6.0.0 +* extapi_http : n/a +* extapi_ipc : $HOME/.clef/clef.ipc ``` -Any list-requests will now be auto-approved by our rule-file. +Any account listing *request* will now be auto-approved by the rule file: + +```text +$ echo '{"id": 1, "jsonrpc": "2.0", "method": "account_list"}' | nc -U ~/.clef/clef.ipc +{"jsonrpc":"2.0","id":1,"result":["0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3","0x086278a6c067775f71d6b2bb1856db6e28c30418"]} +``` ## Under the hood While doing the operations above, these files have been created: ```text -#ls -laR ~/.signer/ -/home/martin/.signer/: -total 16 -drwx------ 3 martin martin 4096 feb 21 12:14 . -drwxr-xr-x 71 martin martin 4096 feb 21 12:12 .. -drwx------ 2 martin martin 4096 feb 21 12:14 43f73718397aa54d1b22 --rwx------ 1 martin martin 256 feb 21 12:12 secrets.dat +$ ls -laR ~/.clef/ -/home/martin/.signer/43f73718397aa54d1b22: -total 12 -drwx------ 2 martin martin 4096 feb 21 12:14 . -drwx------ 3 martin martin 4096 feb 21 12:14 .. --rw------- 1 martin martin 159 feb 21 12:14 config.json +$HOME/.clef/: +total 24 +drwxr-x--x 3 user user 4096 Jul 1 13:45 . +drwxr-xr-x 102 user user 12288 Jul 1 13:39 .. +drwx------ 2 user user 4096 Jul 1 13:25 02f90c0603f4f2f60188 +-r-------- 1 user user 868 Jun 28 13:55 masterseed.json -#cat /home/martin/.signer/43f73718397aa54d1b22/config.json -{"ruleset_sha256":{"iv":"6v4W4tfJxj3zZFbl","c":"6dt5RTDiTq93yh1qDEjpsat/tsKG7cb+vr3sza26IPL2fvsQ6ZoqFx++CPUa8yy6fD9Bbq41L01ehkKHTG3pOAeqTW6zc/+t0wv3AB6xPmU="}} +$HOME/.clef/02f90c0603f4f2f60188: +total 12 +drwx------ 2 user user 4096 Jul 1 13:25 . +drwxr-x--x 3 user user 4096 Jul 1 13:45 .. +-rw------- 1 user user 159 Jul 1 13:25 config.json +$ cat ~/.clef/02f90c0603f4f2f60188/config.json +{"ruleset_sha256":{"iv":"SWWEtnl+R+I+wfG7","c":"I3fjmwmamxVcfGax7D0MdUOL29/rBWcs73WBILmYK0o1CrX7wSMc3y37KsmtlZUAjp0oItYq01Ow8VGUOzilG91tDHInB5YHNtm/YkufEbo="}} ``` -In `~/.signer`, the `secrets.dat` file was created, containing the `master_seed`. -The `master_seed` was then used to derive a few other things: +In `$HOME/.clef`, the `masterseed.json` file was created, containing the master seed. This seed was then used to derive a few other things: -- `vault_location` : in this case `43f73718397aa54d1b22` . - - Thus, if you use a different `master_seed`, another `vault_location` will be used that does not conflict with each other. - - Example: `signer --signersecret /path/to/afile ...` -- `config.json` which is the encrypted key/value storage for configuration data, containing the key `ruleset_sha256`. +- **Vault location**: in this case `02f90c0603f4f2f60188`. + - If you use a different master seed, a different vault location will be used that does not conflict with each other (e.g. `clef --signersecret /path/to/file`). This allows you to run multiple instances of Clef, each with its own rules (e.g. mainnet + testnet). +- **`config.json`**: the encrypted key/value storage for configuration data, currently only containing the key `ruleset_sha256`, the attested hash of the automatic rules to use. +## Advanced rules -## Adding credentials - -In order to make more useful rules like signing transactions, the signer needs access to the passwords needed to unlock keystores. +In order to make more useful rules - like signing transactions - the signer needs access to the passwords needed to unlock keys from the keystore. You can inject an unlock password via `clef setpw`. ```text -#./signer addpw "0x694267f14675d7e1b9494fd8d72fefe1755710fa" "test_password" +$ clef setpw 0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3 + +Please enter a password to store for this address: +Password: +Repeat password: -INFO [02-21|13:43:21] Credential store updated key=0x694267f14675d7e1b9494fd8d72fefe1755710fa +Decrypt master seed of clef +Password: +INFO [07-01|14:05:56.031] Credential store updated key=0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3 ``` -## More advanced rules -Now let's update the rules to make use of credentials: +Now let's update the rules to make use of the new credentials: -```javascript -function ApproveListing(){ +```js +function ApproveListing() { return "Approve" } -function ApproveSignData(r){ - if( r.address.toLowerCase() == "0x694267f14675d7e1b9494fd8d72fefe1755710fa") - { - if(r.message.indexOf("bazonk") >= 0){ + +function ApproveSignData(req) { + if (req.address.toLowerCase() == "0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3") { + if (req.messages[0].value.indexOf("bazonk") >= 0) { return "Approve" } return "Reject" } // Otherwise goes to manual processing } - ``` + In this example: -* Any requests to sign data with the account `0x694...` will be - * auto-approved if the message contains with `bazonk` - * auto-rejected if it does not. -* Any other signing-requests will be passed along for manual approve/reject. -_Note: make sure that `0x694...` is an account you have access to. You can create it either via the clef or the traditional account cli tool. If the latter was chosen, make sure both clef and geth use the same keystore by specifing `--keystore path/to/your/keystore` when running clef._ +- Any requests to sign data with the account `0xd9c9...` will be: + - Auto-approved if the message contains `bazonk`, + - Auto-rejected if the message does not contain `bazonk`, +- Any other requests will be passed along for manual confirmation. -Attest the new file... -```text -#sha256sum rules.js -2a0cb661dacfc804b6e95d935d813fd17c0997a7170e4092ffbc34ca976acd9f rules.js +*Note, to make this example work, please use you own accounts. You can create a new account either via Clef or the traditional account CLI tools. If the latter was chosen, make sure both Clef and Geth use the same keystore by specifying `--keystore path/to/your/keystore` when running Clef.* -#./signer attest 2a0cb661dacfc804b6e95d935d813fd17c0997a7170e4092ffbc34ca976acd9f +Attest the new rule file so that Clef will accept loading it: -INFO [02-21|14:36:30] Ruleset attestation updated sha256=2a0cb661dacfc804b6e95d935d813fd17c0997a7170e4092ffbc34ca976acd9f +```text +$ sha256sum rules.js +f163a1738b649259bb9b369c593fdc4c6b6f86cc87e343c3ba58faee03c2a178 rules.js + +$ clef attest f163a1738b649259bb9b369c593fdc4c6b6f86cc87e343c3ba58faee03c2a178 +Decrypt master seed of clef +Password: +INFO [07-01|14:11:28.509] Ruleset attestation updated sha256=f163a1738b649259bb9b369c593fdc4c6b6f86cc87e343c3ba58faee03c2a178 ``` -And start the signer: +Restart Clef with the new rules in place: ``` -#./signer --rules rules.js --rpc - -INFO [09-25|21:02:16.450] Using CLI as UI-channel -INFO [09-25|21:02:16.466] Loaded 4byte db signatures=5509 file=./4byte.json -INFO [09-25|21:02:16.467] Rule engine configured file=./rules.js -DEBUG[09-25|21:02:16.468] FS scan times list=1.45262ms set=21.926µs diff=6.944µs -DEBUG[09-25|21:02:16.473] Ledger support enabled -DEBUG[09-25|21:02:16.475] Trezor support enabled -INFO [09-25|21:02:16.476] Audit logs configured file=audit.log -DEBUG[09-25|21:02:16.476] HTTP registered namespace=account -INFO [09-25|21:02:16.478] HTTP endpoint opened url=http://localhost:8550 -DEBUG[09-25|21:02:16.478] IPC registered namespace=account -INFO [09-25|21:02:16.478] IPC endpoint opened url= +$ clef --keystore ~/.ethereum/rinkeby/keystore --chainid 4 --rules rules.js + +INFO [07-01|14:12:41.636] Rule engine configured file=rules.js +INFO [07-01|14:12:41.636] Starting signer chainid=4 keystore=$HOME/.ethereum/rinkeby/keystore light-kdf=false advanced=false +DEBUG[07-01|14:12:41.636] FS scan times list=46.722µs set=4.47µs diff=2.157µs +DEBUG[07-01|14:12:41.637] Ledger support enabled +DEBUG[07-01|14:12:41.637] Trezor support enabled via HID +DEBUG[07-01|14:12:41.638] Trezor support enabled via WebUSB +INFO [07-01|14:12:41.638] Audit logs configured file=audit.log +DEBUG[07-01|14:12:41.638] IPC registered namespace=account +INFO [07-01|14:12:41.638] IPC endpoint opened url=$HOME/.clef/clef.ipc ------- Signer info ------- -* extapi_version : 2.0.0 -* intapi_version : 2.0.0 -* extapi_http : http://localhost:8550 -* extapi_ipc : +* intapi_version : 7.0.0 +* extapi_version : 6.0.0 +* extapi_http : n/a +* extapi_ipc : $HOME/.clef/clef.ipc ``` -And then test signing, once with `bazonk` and once without: +Then test signing, once with `bazonk` and once without: ``` -#curl -H "Content-Type: application/json" -X POST --data "{\"jsonrpc\":\"2.0\",\"method\":\"account_sign\",\"params\":[\"0x694267f14675d7e1b9494fd8d72fefe1755710fa\",\"0x$(xxd -pu <<< ' bazonk baz gaz')\"],\"id\":67}" http://localhost:8550/ -{"jsonrpc":"2.0","id":67,"result":"0x93e6161840c3ae1efc26dc68dedab6e8fc233bb3fefa1b4645dbf6609b93dace160572ea4ab33240256bb6d3dadb60dcd9c515d6374d3cf614ee897408d41d541c"} - -#curl -H "Content-Type: application/json" -X POST --data "{\"jsonrpc\":\"2.0\",\"method\":\"account_sign\",\"params\":[\"0x694267f14675d7e1b9494fd8d72fefe1755710fa\",\"0x$(xxd -pu <<< ' bonk baz gaz')\"],\"id\":67}" http://localhost:8550/ -{"jsonrpc":"2.0","id":67,"error":{"code":-32000,"message":"Request denied"}} +$ echo '{"id": 1, "jsonrpc":"2.0", "method":"account_signData", "params":["data/plain", "0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3", "0x202062617a6f6e6b2062617a2067617a0a"]}' | nc -U ~/.clef/clef.ipc +{"jsonrpc":"2.0","id":1,"result":"0x4f93e3457027f6be99b06b3392d0ebc60615ba448bb7544687ef1248dea4f5317f789002df783979c417d969836b6fda3710f5bffb296b4d51c8aaae6e2ac4831c"} +$ echo '{"id": 1, "jsonrpc":"2.0", "method":"account_signData", "params":["data/plain", "0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3", "0x2020626f6e6b2062617a2067617a0a"]}' | nc -U ~/.clef/clef.ipc +{"jsonrpc":"2.0","id":1,"error":{"code":-32000,"message":"Request denied"}} ``` -Meanwhile, in the signer output: +Meanwhile, in the Clef output log you can see: ```text INFO [02-21|14:42:41] Op approved INFO [02-21|14:42:56] Op rejected @@ -203,9 +281,73 @@ INFO [02-21|14:42:56] Op rejected The signer also stores all traffic over the external API in a log file. The last 4 lines shows the two requests and their responses: ```text -#tail -n 4 audit.log -t=2018-02-21T14:42:41+0100 lvl=info msg=Sign api=signer type=request metadata="{\"remote\":\"127.0.0.1:49706\",\"local\":\"localhost:8550\",\"scheme\":\"HTTP/1.1\"}" addr="0x694267f14675d7e1b9494fd8d72fefe1755710fa [chksum INVALID]" data=202062617a6f6e6b2062617a2067617a0a -t=2018-02-21T14:42:42+0100 lvl=info msg=Sign api=signer type=response data=93e6161840c3ae1efc26dc68dedab6e8fc233bb3fefa1b4645dbf6609b93dace160572ea4ab33240256bb6d3dadb60dcd9c515d6374d3cf614ee897408d41d541c error=nil -t=2018-02-21T14:42:56+0100 lvl=info msg=Sign api=signer type=request metadata="{\"remote\":\"127.0.0.1:49708\",\"local\":\"localhost:8550\",\"scheme\":\"HTTP/1.1\"}" addr="0x694267f14675d7e1b9494fd8d72fefe1755710fa [chksum INVALID]" data=2020626f6e6b2062617a2067617a0a -t=2018-02-21T14:42:56+0100 lvl=info msg=Sign api=signer type=response data= error="Request denied" -``` \ No newline at end of file +$ tail -n 4 audit.log +t=2019-07-01T15:52:14+0300 lvl=info msg=SignData api=signer type=request metadata="{\"remote\":\"NA\",\"local\":\"NA\",\"scheme\":\"NA\",\"User-Agent\":\"\",\"Origin\":\"\"}" addr="0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3 [chksum INVALID]" data=0x202062617a6f6e6b2062617a2067617a0a content-type=data/plain +t=2019-07-01T15:52:14+0300 lvl=info msg=SignData api=signer type=response data=4f93e3457027f6be99b06b3392d0ebc60615ba448bb7544687ef1248dea4f5317f789002df783979c417d969836b6fda3710f5bffb296b4d51c8aaae6e2ac4831c error=nil +t=2019-07-01T15:52:23+0300 lvl=info msg=SignData api=signer type=request metadata="{\"remote\":\"NA\",\"local\":\"NA\",\"scheme\":\"NA\",\"User-Agent\":\"\",\"Origin\":\"\"}" addr="0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3 [chksum INVALID]" data=0x2020626f6e6b2062617a2067617a0a content-type=data/plain +t=2019-07-01T15:52:23+0300 lvl=info msg=SignData api=signer type=response data= error="Request denied" +``` + +For more details on writing automatic rules, please see the [rules spec](https://github.com/ethereum/go-ethereum/blob/master/cmd/clef/rules.md). + +## Geth integration + +Of course, as awesome as Clef is, it's not feasible to interact with it via JSON RPC by hand. Long term, we're hoping to convince the general Ethereum community to support Clef as a general signer (it's only 3-5 methods), thus allowing your favorite DApp, Metamask, MyCrypto, etc to request signatures directly. + +Until then however, we're trying to pave the way via Geth. Geth v1.9.0 has built in support via `--signer ` for using a local or remote Clef instance as an account backend! + +We can try this by running Clef with our previous rules on Rinkeby (for now it's a good idea to allow auto-listing accounts, since Geth likes to retrieve them once in a while). + +```text +$ clef --keystore ~/.ethereum/rinkeby/keystore --chainid 4 --rules rules.js +``` + +In a different window we can start Geth, list our accounts, even list our wallets to see where the accounts originate from: + +```text +$ geth --rinkeby --signer=~/.clef/clef.ipc console + +> eth.accounts +["0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3", "0x086278a6c067775f71d6b2bb1856db6e28c30418"] + +> personal.listWallets +[{ + accounts: [{ + address: "0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3", + url: "extapi://$HOME/.clef/clef.ipc" + }, { + address: "0x086278a6c067775f71d6b2bb1856db6e28c30418", + url: "extapi://$HOME/.clef/clef.ipc" + }], + status: "ok [version=6.0.0]", + url: "extapi://$HOME/.clef/clef.ipc" +}] + +> eth.sendTransaction({from: eth.accounts[0], to: eth.accounts[0]}) +``` + +Lastly, when we requested a transaction to be sent, Clef prompted us in the original window to approve it: + +```text +--------- Transaction request------------- +to: 0xD9C9Cd5f6779558b6e0eD4e6Acf6b1947E7fA1F3 +from: 0xD9C9Cd5f6779558b6e0eD4e6Acf6b1947E7fA1F3 [chksum ok] +value: 0 wei +gas: 0x5208 (21000) +gasprice: 1000000000 wei +nonce: 0x2366 (9062) + +Request context: + NA -> NA -> NA + +Additional HTTP header data, provided by the external caller: + User-Agent: + Origin: +------------------------------------------- +Approve? [y/N]: +> y +``` + +:boom: + +*Note, if you enable the external signer backend in Geth, all other account management is disabled. This is because long term we want to remove account management from Geth.* diff --git a/cmd/devp2p/crawl.go b/cmd/devp2p/crawl.go new file mode 100644 index 000000000000..92aaad72a372 --- /dev/null +++ b/cmd/devp2p/crawl.go @@ -0,0 +1,152 @@ +// Copyright 2019 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 ( + "time" + + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/enode" +) + +type crawler struct { + input nodeSet + output nodeSet + disc *discover.UDPv4 + iters []enode.Iterator + inputIter enode.Iterator + ch chan *enode.Node + closed chan struct{} + + // settings + revalidateInterval time.Duration +} + +func newCrawler(input nodeSet, disc *discover.UDPv4, iters ...enode.Iterator) *crawler { + c := &crawler{ + input: input, + output: make(nodeSet, len(input)), + disc: disc, + iters: iters, + inputIter: enode.IterNodes(input.nodes()), + ch: make(chan *enode.Node), + closed: make(chan struct{}), + } + c.iters = append(c.iters, c.inputIter) + // Copy input to output initially. Any nodes that fail validation + // will be dropped from output during the run. + for id, n := range input { + c.output[id] = n + } + return c +} + +func (c *crawler) run(timeout time.Duration) nodeSet { + var ( + timeoutTimer = time.NewTimer(timeout) + timeoutCh <-chan time.Time + doneCh = make(chan enode.Iterator, len(c.iters)) + liveIters = len(c.iters) + ) + for _, it := range c.iters { + go c.runIterator(doneCh, it) + } + +loop: + for { + select { + case n := <-c.ch: + c.updateNode(n) + case it := <-doneCh: + if it == c.inputIter { + // Enable timeout when we're done revalidating the input nodes. + log.Info("Revalidation of input set is done", "len", len(c.input)) + if timeout > 0 { + timeoutCh = timeoutTimer.C + } + } + if liveIters--; liveIters == 0 { + break loop + } + case <-timeoutCh: + break loop + } + } + + close(c.closed) + for _, it := range c.iters { + it.Close() + } + for ; liveIters > 0; liveIters-- { + <-doneCh + } + return c.output +} + +func (c *crawler) runIterator(done chan<- enode.Iterator, it enode.Iterator) { + defer func() { done <- it }() + for it.Next() { + select { + case c.ch <- it.Node(): + case <-c.closed: + return + } + } +} + +func (c *crawler) updateNode(n *enode.Node) { + node, ok := c.output[n.ID()] + + // Skip validation of recently-seen nodes. + if ok && time.Since(node.LastCheck) < c.revalidateInterval { + return + } + + // Request the node record. + nn, err := c.disc.RequestENR(n) + node.LastCheck = truncNow() + if err != nil { + if node.Score == 0 { + // Node doesn't implement EIP-868. + log.Debug("Skipping node", "id", n.ID()) + return + } + node.Score /= 2 + } else { + node.N = nn + node.Seq = nn.Seq() + node.Score++ + if node.FirstResponse.IsZero() { + node.FirstResponse = node.LastCheck + } + node.LastResponse = node.LastCheck + } + + // Store/update node in output set. + if node.Score <= 0 { + log.Info("Removing node", "id", n.ID()) + delete(c.output, n.ID()) + } else { + log.Info("Updating node", "id", n.ID(), "seq", n.Seq(), "score", node.Score) + c.output[n.ID()] = node + } +} + +func truncNow() time.Time { + return time.Now().UTC().Truncate(1 * time.Second) +} diff --git a/cmd/devp2p/discv4cmd.go b/cmd/devp2p/discv4cmd.go new file mode 100644 index 000000000000..9525bec66817 --- /dev/null +++ b/cmd/devp2p/discv4cmd.go @@ -0,0 +1,226 @@ +// Copyright 2019 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" + "net" + "strings" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" + "gopkg.in/urfave/cli.v1" +) + +var ( + discv4Command = cli.Command{ + Name: "discv4", + Usage: "Node Discovery v4 tools", + Subcommands: []cli.Command{ + discv4PingCommand, + discv4RequestRecordCommand, + discv4ResolveCommand, + discv4ResolveJSONCommand, + discv4CrawlCommand, + }, + } + discv4PingCommand = cli.Command{ + Name: "ping", + Usage: "Sends ping to a node", + Action: discv4Ping, + ArgsUsage: "", + } + discv4RequestRecordCommand = cli.Command{ + Name: "requestenr", + Usage: "Requests a node record using EIP-868 enrRequest", + Action: discv4RequestRecord, + ArgsUsage: "", + } + discv4ResolveCommand = cli.Command{ + Name: "resolve", + Usage: "Finds a node in the DHT", + Action: discv4Resolve, + ArgsUsage: "", + Flags: []cli.Flag{bootnodesFlag}, + } + discv4ResolveJSONCommand = cli.Command{ + Name: "resolve-json", + Usage: "Re-resolves nodes in a nodes.json file", + Action: discv4ResolveJSON, + Flags: []cli.Flag{bootnodesFlag}, + ArgsUsage: "", + } + discv4CrawlCommand = cli.Command{ + Name: "crawl", + Usage: "Updates a nodes.json file with random nodes found in the DHT", + Action: discv4Crawl, + Flags: []cli.Flag{bootnodesFlag, crawlTimeoutFlag}, + } +) + +var ( + bootnodesFlag = cli.StringFlag{ + Name: "bootnodes", + Usage: "Comma separated nodes used for bootstrapping", + } + crawlTimeoutFlag = cli.DurationFlag{ + Name: "timeout", + Usage: "Time limit for the crawl.", + Value: 30 * time.Minute, + } +) + +func discv4Ping(ctx *cli.Context) error { + n := getNodeArg(ctx) + disc := startV4(ctx) + defer disc.Close() + + start := time.Now() + if err := disc.Ping(n); err != nil { + return fmt.Errorf("node didn't respond: %v", err) + } + fmt.Printf("node responded to ping (RTT %v).\n", time.Since(start)) + return nil +} + +func discv4RequestRecord(ctx *cli.Context) error { + n := getNodeArg(ctx) + disc := startV4(ctx) + defer disc.Close() + + respN, err := disc.RequestENR(n) + if err != nil { + return fmt.Errorf("can't retrieve record: %v", err) + } + fmt.Println(respN.String()) + return nil +} + +func discv4Resolve(ctx *cli.Context) error { + n := getNodeArg(ctx) + disc := startV4(ctx) + defer disc.Close() + + fmt.Println(disc.Resolve(n).String()) + return nil +} + +func discv4ResolveJSON(ctx *cli.Context) error { + if ctx.NArg() < 1 { + return fmt.Errorf("need nodes file as argument") + } + nodesFile := ctx.Args().Get(0) + inputSet := make(nodeSet) + if common.FileExist(nodesFile) { + inputSet = loadNodesJSON(nodesFile) + } + + // Add extra nodes from command line arguments. + var nodeargs []*enode.Node + for i := 1; i < ctx.NArg(); i++ { + n, err := parseNode(ctx.Args().Get(i)) + if err != nil { + exit(err) + } + nodeargs = append(nodeargs, n) + } + + // Run the crawler. + disc := startV4(ctx) + defer disc.Close() + c := newCrawler(inputSet, disc, enode.IterNodes(nodeargs)) + c.revalidateInterval = 0 + output := c.run(0) + writeNodesJSON(nodesFile, output) + return nil +} + +func discv4Crawl(ctx *cli.Context) error { + if ctx.NArg() < 1 { + return fmt.Errorf("need nodes file as argument") + } + nodesFile := ctx.Args().First() + var inputSet nodeSet + if common.FileExist(nodesFile) { + inputSet = loadNodesJSON(nodesFile) + } + + disc := startV4(ctx) + defer disc.Close() + c := newCrawler(inputSet, disc, disc.RandomNodes()) + c.revalidateInterval = 10 * time.Minute + output := c.run(ctx.Duration(crawlTimeoutFlag.Name)) + writeNodesJSON(nodesFile, output) + return nil +} + +func parseBootnodes(ctx *cli.Context) ([]*enode.Node, error) { + s := params.RinkebyBootnodes + if ctx.IsSet(bootnodesFlag.Name) { + s = strings.Split(ctx.String(bootnodesFlag.Name), ",") + } + nodes := make([]*enode.Node, len(s)) + var err error + for i, record := range s { + nodes[i], err = parseNode(record) + if err != nil { + return nil, fmt.Errorf("invalid bootstrap node: %v", err) + } + } + return nodes, nil +} + +// startV4 starts an ephemeral discovery V4 node. +func startV4(ctx *cli.Context) *discover.UDPv4 { + socket, ln, cfg, err := listen() + if err != nil { + exit(err) + } + if commandHasFlag(ctx, bootnodesFlag) { + bn, err := parseBootnodes(ctx) + if err != nil { + exit(err) + } + cfg.Bootnodes = bn + } + disc, err := discover.ListenV4(socket, ln, cfg) + if err != nil { + exit(err) + } + return disc +} + +func listen() (*net.UDPConn, *enode.LocalNode, discover.Config, error) { + var cfg discover.Config + cfg.PrivateKey, _ = crypto.GenerateKey() + db, _ := enode.OpenDB("") + ln := enode.NewLocalNode(db, cfg.PrivateKey) + + socket, err := net.ListenUDP("udp4", &net.UDPAddr{IP: net.IP{0, 0, 0, 0}}) + if err != nil { + db.Close() + return nil, nil, cfg, err + } + addr := socket.LocalAddr().(*net.UDPAddr) + ln.SetFallbackIP(net.IP{127, 0, 0, 1}) + ln.SetFallbackUDP(addr.Port) + return socket, ln, cfg, nil +} diff --git a/cmd/devp2p/dns_cloudflare.go b/cmd/devp2p/dns_cloudflare.go new file mode 100644 index 000000000000..83279168ccae --- /dev/null +++ b/cmd/devp2p/dns_cloudflare.go @@ -0,0 +1,163 @@ +// Copyright 2019 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" + "strings" + + "github.com/cloudflare/cloudflare-go" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/dnsdisc" + "gopkg.in/urfave/cli.v1" +) + +var ( + cloudflareTokenFlag = cli.StringFlag{ + Name: "token", + Usage: "CloudFlare API token", + EnvVar: "CLOUDFLARE_API_TOKEN", + } + cloudflareZoneIDFlag = cli.StringFlag{ + Name: "zoneid", + Usage: "CloudFlare Zone ID (optional)", + } +) + +type cloudflareClient struct { + *cloudflare.API + zoneID string +} + +// newCloudflareClient sets up a CloudFlare API client from command line flags. +func newCloudflareClient(ctx *cli.Context) *cloudflareClient { + token := ctx.String(cloudflareTokenFlag.Name) + if token == "" { + exit(fmt.Errorf("need cloudflare API token to proceed")) + } + api, err := cloudflare.NewWithAPIToken(token) + if err != nil { + exit(fmt.Errorf("can't create Cloudflare client: %v", err)) + } + return &cloudflareClient{ + API: api, + zoneID: ctx.String(cloudflareZoneIDFlag.Name), + } +} + +// deploy uploads the given tree to CloudFlare DNS. +func (c *cloudflareClient) deploy(name string, t *dnsdisc.Tree) error { + if err := c.checkZone(name); err != nil { + return err + } + records := t.ToTXT(name) + return c.uploadRecords(name, records) +} + +// checkZone verifies permissions on the CloudFlare DNS Zone for name. +func (c *cloudflareClient) checkZone(name string) error { + if c.zoneID == "" { + log.Info(fmt.Sprintf("Finding CloudFlare zone ID for %s", name)) + id, err := c.ZoneIDByName(name) + if err != nil { + return err + } + c.zoneID = id + } + log.Info(fmt.Sprintf("Checking Permissions on zone %s", c.zoneID)) + zone, err := c.ZoneDetails(c.zoneID) + if err != nil { + return err + } + if !strings.HasSuffix(name, "."+zone.Name) { + return fmt.Errorf("CloudFlare zone name %q does not match name %q to be deployed", zone.Name, name) + } + needPerms := map[string]bool{"#zone:edit": false, "#zone:read": false} + for _, perm := range zone.Permissions { + if _, ok := needPerms[perm]; ok { + needPerms[perm] = true + } + } + for _, ok := range needPerms { + if !ok { + return fmt.Errorf("wrong permissions on zone %s: %v", c.zoneID, needPerms) + } + } + return nil +} + +// uploadRecords updates the TXT records at a particular subdomain. All non-root records +// will have a TTL of "infinity" and all existing records not in the new map will be +// nuked! +func (c *cloudflareClient) uploadRecords(name string, records map[string]string) error { + // Convert all names to lowercase. + lrecords := make(map[string]string, len(records)) + for name, r := range records { + lrecords[strings.ToLower(name)] = r + } + records = lrecords + + log.Info(fmt.Sprintf("Retrieving existing TXT records on %s", name)) + entries, err := c.DNSRecords(c.zoneID, cloudflare.DNSRecord{Type: "TXT"}) + if err != nil { + return err + } + existing := make(map[string]cloudflare.DNSRecord) + for _, entry := range entries { + if !strings.HasSuffix(entry.Name, name) { + continue + } + existing[strings.ToLower(entry.Name)] = entry + } + + // Iterate over the new records and inject anything missing. + for path, val := range records { + old, exists := existing[path] + if !exists { + // Entry is unknown, push a new one to Cloudflare. + log.Info(fmt.Sprintf("Creating %s = %q", path, val)) + ttl := 1 + if path != name { + ttl = 2147483647 // Max TTL permitted by Cloudflare + } + _, err = c.CreateDNSRecord(c.zoneID, cloudflare.DNSRecord{Type: "TXT", Name: path, Content: val, TTL: ttl}) + } else if old.Content != val { + // Entry already exists, only change its content. + log.Info(fmt.Sprintf("Updating %s from %q to %q", path, old.Content, val)) + old.Content = val + err = c.UpdateDNSRecord(c.zoneID, old.ID, old) + } else { + log.Info(fmt.Sprintf("Skipping %s = %q", path, val)) + } + if err != nil { + return fmt.Errorf("failed to publish %s: %v", path, err) + } + } + + // Iterate over the old records and delete anything stale. + for path, entry := range existing { + if _, ok := records[path]; ok { + continue + } + // Stale entry, nuke it. + log.Info(fmt.Sprintf("Deleting %s = %q", path, entry.Content)) + if err := c.DeleteDNSRecord(c.zoneID, entry.ID); err != nil { + return fmt.Errorf("failed to delete %s: %v", path, err) + } + } + return nil +} diff --git a/cmd/devp2p/dnscmd.go b/cmd/devp2p/dnscmd.go new file mode 100644 index 000000000000..eb15764b04e2 --- /dev/null +++ b/cmd/devp2p/dnscmd.go @@ -0,0 +1,361 @@ +// Copyright 2018 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 ( + "crypto/ecdsa" + "encoding/json" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "time" + + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/console" + "github.com/ethereum/go-ethereum/p2p/dnsdisc" + "github.com/ethereum/go-ethereum/p2p/enode" + cli "gopkg.in/urfave/cli.v1" +) + +var ( + dnsCommand = cli.Command{ + Name: "dns", + Usage: "DNS Discovery Commands", + Subcommands: []cli.Command{ + dnsSyncCommand, + dnsSignCommand, + dnsTXTCommand, + dnsCloudflareCommand, + }, + } + dnsSyncCommand = cli.Command{ + Name: "sync", + Usage: "Download a DNS discovery tree", + ArgsUsage: " [ ]", + Action: dnsSync, + Flags: []cli.Flag{dnsTimeoutFlag}, + } + dnsSignCommand = cli.Command{ + Name: "sign", + Usage: "Sign a DNS discovery tree", + ArgsUsage: " ", + Action: dnsSign, + Flags: []cli.Flag{dnsDomainFlag, dnsSeqFlag}, + } + dnsTXTCommand = cli.Command{ + Name: "to-txt", + Usage: "Create a DNS TXT records for a discovery tree", + ArgsUsage: " ", + Action: dnsToTXT, + } + dnsCloudflareCommand = cli.Command{ + Name: "to-cloudflare", + Usage: "Deploy DNS TXT records to cloudflare", + ArgsUsage: "", + Action: dnsToCloudflare, + Flags: []cli.Flag{cloudflareTokenFlag, cloudflareZoneIDFlag}, + } +) + +var ( + dnsTimeoutFlag = cli.DurationFlag{ + Name: "timeout", + Usage: "Timeout for DNS lookups", + } + dnsDomainFlag = cli.StringFlag{ + Name: "domain", + Usage: "Domain name of the tree", + } + dnsSeqFlag = cli.UintFlag{ + Name: "seq", + Usage: "New sequence number of the tree", + } +) + +// dnsSync performs dnsSyncCommand. +func dnsSync(ctx *cli.Context) error { + var ( + c = dnsClient(ctx) + url = ctx.Args().Get(0) + outdir = ctx.Args().Get(1) + ) + domain, _, err := dnsdisc.ParseURL(url) + if err != nil { + return err + } + if outdir == "" { + outdir = domain + } + + t, err := c.SyncTree(url) + if err != nil { + return err + } + def := treeToDefinition(url, t) + def.Meta.LastModified = time.Now() + writeTreeMetadata(outdir, def) + writeTreeNodes(outdir, def) + return nil +} + +func dnsSign(ctx *cli.Context) error { + if ctx.NArg() < 2 { + return fmt.Errorf("need tree definition directory and key file as arguments") + } + var ( + defdir = ctx.Args().Get(0) + keyfile = ctx.Args().Get(1) + def = loadTreeDefinition(defdir) + domain = directoryName(defdir) + ) + if def.Meta.URL != "" { + d, _, err := dnsdisc.ParseURL(def.Meta.URL) + if err != nil { + return fmt.Errorf("invalid 'url' field: %v", err) + } + domain = d + } + if ctx.IsSet(dnsDomainFlag.Name) { + domain = ctx.String(dnsDomainFlag.Name) + } + if ctx.IsSet(dnsSeqFlag.Name) { + def.Meta.Seq = ctx.Uint(dnsSeqFlag.Name) + } else { + def.Meta.Seq++ // Auto-bump sequence number if not supplied via flag. + } + t, err := dnsdisc.MakeTree(def.Meta.Seq, def.Nodes, def.Meta.Links) + if err != nil { + return err + } + + key := loadSigningKey(keyfile) + url, err := t.Sign(key, domain) + if err != nil { + return fmt.Errorf("can't sign: %v", err) + } + + def = treeToDefinition(url, t) + def.Meta.LastModified = time.Now() + writeTreeMetadata(defdir, def) + return nil +} + +func directoryName(dir string) string { + abs, err := filepath.Abs(dir) + if err != nil { + exit(err) + } + return filepath.Base(abs) +} + +// dnsToTXT peforms dnsTXTCommand. +func dnsToTXT(ctx *cli.Context) error { + if ctx.NArg() < 1 { + return fmt.Errorf("need tree definition directory as argument") + } + output := ctx.Args().Get(1) + if output == "" { + output = "-" // default to stdout + } + domain, t, err := loadTreeDefinitionForExport(ctx.Args().Get(0)) + if err != nil { + return err + } + writeTXTJSON(output, t.ToTXT(domain)) + return nil +} + +// dnsToCloudflare peforms dnsCloudflareCommand. +func dnsToCloudflare(ctx *cli.Context) error { + if ctx.NArg() < 1 { + return fmt.Errorf("need tree definition directory as argument") + } + domain, t, err := loadTreeDefinitionForExport(ctx.Args().Get(0)) + if err != nil { + return err + } + client := newCloudflareClient(ctx) + return client.deploy(domain, t) +} + +// loadSigningKey loads a private key in Ethereum keystore format. +func loadSigningKey(keyfile string) *ecdsa.PrivateKey { + keyjson, err := ioutil.ReadFile(keyfile) + if err != nil { + exit(fmt.Errorf("failed to read the keyfile at '%s': %v", keyfile, err)) + } + password, _ := console.Stdin.PromptPassword("Please enter the password for '" + keyfile + "': ") + key, err := keystore.DecryptKey(keyjson, password) + if err != nil { + exit(fmt.Errorf("error decrypting key: %v", err)) + } + return key.PrivateKey +} + +// dnsClient configures the DNS discovery client from command line flags. +func dnsClient(ctx *cli.Context) *dnsdisc.Client { + var cfg dnsdisc.Config + if commandHasFlag(ctx, dnsTimeoutFlag) { + cfg.Timeout = ctx.Duration(dnsTimeoutFlag.Name) + } + c, _ := dnsdisc.NewClient(cfg) // cannot fail because no URLs given + return c +} + +// There are two file formats for DNS node trees on disk: +// +// The 'TXT' format is a single JSON file containing DNS TXT records +// as a JSON object where the keys are names and the values are objects +// containing the value of the record. +// +// The 'definition' format is a directory containing two files: +// +// enrtree-info.json -- contains sequence number & links to other trees +// nodes.json -- contains the nodes as a JSON array. +// +// This format exists because it's convenient to edit. nodes.json can be generated +// in multiple ways: it may be written by a DHT crawler or compiled by a human. + +type dnsDefinition struct { + Meta dnsMetaJSON + Nodes []*enode.Node +} + +type dnsMetaJSON struct { + URL string `json:"url,omitempty"` + Seq uint `json:"seq"` + Sig string `json:"signature,omitempty"` + Links []string `json:"links"` + LastModified time.Time `json:"lastModified"` +} + +func treeToDefinition(url string, t *dnsdisc.Tree) *dnsDefinition { + meta := dnsMetaJSON{ + URL: url, + Seq: t.Seq(), + Sig: t.Signature(), + Links: t.Links(), + } + if meta.Links == nil { + meta.Links = []string{} + } + return &dnsDefinition{Meta: meta, Nodes: t.Nodes()} +} + +// loadTreeDefinition loads a directory in 'definition' format. +func loadTreeDefinition(directory string) *dnsDefinition { + metaFile, nodesFile := treeDefinitionFiles(directory) + var def dnsDefinition + err := common.LoadJSON(metaFile, &def.Meta) + if err != nil && !os.IsNotExist(err) { + exit(err) + } + if def.Meta.Links == nil { + def.Meta.Links = []string{} + } + // Check link syntax. + for _, link := range def.Meta.Links { + if _, _, err := dnsdisc.ParseURL(link); err != nil { + exit(fmt.Errorf("invalid link %q: %v", link, err)) + } + } + // Check/convert nodes. + nodes := loadNodesJSON(nodesFile) + if err := nodes.verify(); err != nil { + exit(err) + } + def.Nodes = nodes.nodes() + return &def +} + +// loadTreeDefinitionForExport loads a DNS tree and ensures it is signed. +func loadTreeDefinitionForExport(dir string) (domain string, t *dnsdisc.Tree, err error) { + metaFile, _ := treeDefinitionFiles(dir) + def := loadTreeDefinition(dir) + if def.Meta.URL == "" { + return "", nil, fmt.Errorf("missing 'url' field in %v", metaFile) + } + domain, pubkey, err := dnsdisc.ParseURL(def.Meta.URL) + if err != nil { + return "", nil, fmt.Errorf("invalid 'url' field in %v: %v", metaFile, err) + } + if t, err = dnsdisc.MakeTree(def.Meta.Seq, def.Nodes, def.Meta.Links); err != nil { + return "", nil, err + } + if err := ensureValidTreeSignature(t, pubkey, def.Meta.Sig); err != nil { + return "", nil, err + } + return domain, t, nil +} + +// ensureValidTreeSignature checks that sig is valid for tree and assigns it as the +// tree's signature if valid. +func ensureValidTreeSignature(t *dnsdisc.Tree, pubkey *ecdsa.PublicKey, sig string) error { + if sig == "" { + return fmt.Errorf("missing signature, run 'devp2p dns sign' first") + } + if err := t.SetSignature(pubkey, sig); err != nil { + return fmt.Errorf("invalid signature on tree, run 'devp2p dns sign' to update it") + } + return nil +} + +// writeTreeMetadata writes a DNS node tree metadata file to the given directory. +func writeTreeMetadata(directory string, def *dnsDefinition) { + metaJSON, err := json.MarshalIndent(&def.Meta, "", jsonIndent) + if err != nil { + exit(err) + } + if err := os.Mkdir(directory, 0744); err != nil && !os.IsExist(err) { + exit(err) + } + metaFile, _ := treeDefinitionFiles(directory) + if err := ioutil.WriteFile(metaFile, metaJSON, 0644); err != nil { + exit(err) + } +} + +func writeTreeNodes(directory string, def *dnsDefinition) { + ns := make(nodeSet, len(def.Nodes)) + ns.add(def.Nodes...) + _, nodesFile := treeDefinitionFiles(directory) + writeNodesJSON(nodesFile, ns) +} + +func treeDefinitionFiles(directory string) (string, string) { + meta := filepath.Join(directory, "enrtree-info.json") + nodes := filepath.Join(directory, "nodes.json") + return meta, nodes +} + +// writeTXTJSON writes TXT records in JSON format. +func writeTXTJSON(file string, txt map[string]string) { + txtJSON, err := json.MarshalIndent(txt, "", jsonIndent) + if err != nil { + exit(err) + } + if file == "-" { + os.Stdout.Write(txtJSON) + fmt.Println() + return + } + if err := ioutil.WriteFile(file, txtJSON, 0644); err != nil { + exit(err) + } +} diff --git a/cmd/devp2p/enrcmd.go b/cmd/devp2p/enrcmd.go new file mode 100644 index 000000000000..15d77dd011a8 --- /dev/null +++ b/cmd/devp2p/enrcmd.go @@ -0,0 +1,198 @@ +// Copyright 2019 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 ( + "bytes" + "encoding/base64" + "encoding/hex" + "fmt" + "io/ioutil" + "net" + "os" + "strconv" + "strings" + + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/rlp" + "gopkg.in/urfave/cli.v1" +) + +var enrdumpCommand = cli.Command{ + Name: "enrdump", + Usage: "Pretty-prints node records", + Action: enrdump, + Flags: []cli.Flag{ + cli.StringFlag{Name: "file"}, + }, +} + +func enrdump(ctx *cli.Context) error { + var source string + if file := ctx.String("file"); file != "" { + if ctx.NArg() != 0 { + return fmt.Errorf("can't dump record from command-line argument in -file mode") + } + var b []byte + var err error + if file == "-" { + b, err = ioutil.ReadAll(os.Stdin) + } else { + b, err = ioutil.ReadFile(file) + } + if err != nil { + return err + } + source = string(b) + } else if ctx.NArg() == 1 { + source = ctx.Args()[0] + } else { + return fmt.Errorf("need record as argument") + } + + r, err := parseRecord(source) + if err != nil { + return fmt.Errorf("INVALID: %v", err) + } + fmt.Print(dumpRecord(r)) + return nil +} + +// dumpRecord creates a human-readable description of the given node record. +func dumpRecord(r *enr.Record) string { + out := new(bytes.Buffer) + if n, err := enode.New(enode.ValidSchemes, r); err != nil { + fmt.Fprintf(out, "INVALID: %v\n", err) + } else { + fmt.Fprintf(out, "Node ID: %v\n", n.ID()) + } + kv := r.AppendElements(nil)[1:] + fmt.Fprintf(out, "Record has sequence number %d and %d key/value pairs.\n", r.Seq(), len(kv)/2) + fmt.Fprint(out, dumpRecordKV(kv, 2)) + return out.String() +} + +func dumpRecordKV(kv []interface{}, indent int) string { + // Determine the longest key name for alignment. + var out string + var longestKey = 0 + for i := 0; i < len(kv); i += 2 { + key := kv[i].(string) + if len(key) > longestKey { + longestKey = len(key) + } + } + // Print the keys, invoking formatters for known keys. + for i := 0; i < len(kv); i += 2 { + key := kv[i].(string) + val := kv[i+1].(rlp.RawValue) + pad := longestKey - len(key) + out += strings.Repeat(" ", indent) + strconv.Quote(key) + strings.Repeat(" ", pad+1) + formatter := attrFormatters[key] + if formatter == nil { + formatter = formatAttrRaw + } + fmtval, ok := formatter(val) + if ok { + out += fmtval + "\n" + } else { + out += hex.EncodeToString(val) + " (!)\n" + } + } + return out +} + +// parseNode parses a node record and verifies its signature. +func parseNode(source string) (*enode.Node, error) { + if strings.HasPrefix(source, "enode://") { + return enode.ParseV4(source) + } + r, err := parseRecord(source) + if err != nil { + return nil, err + } + return enode.New(enode.ValidSchemes, r) +} + +// parseRecord parses a node record from hex, base64, or raw binary input. +func parseRecord(source string) (*enr.Record, error) { + bin := []byte(source) + if d, ok := decodeRecordHex(bytes.TrimSpace(bin)); ok { + bin = d + } else if d, ok := decodeRecordBase64(bytes.TrimSpace(bin)); ok { + bin = d + } + var r enr.Record + err := rlp.DecodeBytes(bin, &r) + return &r, err +} + +func decodeRecordHex(b []byte) ([]byte, bool) { + if bytes.HasPrefix(b, []byte("0x")) { + b = b[2:] + } + dec := make([]byte, hex.DecodedLen(len(b))) + _, err := hex.Decode(dec, b) + return dec, err == nil +} + +func decodeRecordBase64(b []byte) ([]byte, bool) { + if bytes.HasPrefix(b, []byte("enr:")) { + b = b[4:] + } + dec := make([]byte, base64.RawURLEncoding.DecodedLen(len(b))) + n, err := base64.RawURLEncoding.Decode(dec, b) + return dec[:n], err == nil +} + +// attrFormatters contains formatting functions for well-known ENR keys. +var attrFormatters = map[string]func(rlp.RawValue) (string, bool){ + "id": formatAttrString, + "ip": formatAttrIP, + "ip6": formatAttrIP, + "tcp": formatAttrUint, + "tcp6": formatAttrUint, + "udp": formatAttrUint, + "udp6": formatAttrUint, +} + +func formatAttrRaw(v rlp.RawValue) (string, bool) { + s := hex.EncodeToString(v) + return s, true +} + +func formatAttrString(v rlp.RawValue) (string, bool) { + content, _, err := rlp.SplitString(v) + return strconv.Quote(string(content)), err == nil +} + +func formatAttrIP(v rlp.RawValue) (string, bool) { + content, _, err := rlp.SplitString(v) + if err != nil || len(content) != 4 && len(content) != 6 { + return "", false + } + return net.IP(content).String(), true +} + +func formatAttrUint(v rlp.RawValue) (string, bool) { + var x uint64 + if err := rlp.DecodeBytes(v, &x); err != nil { + return "", false + } + return strconv.FormatUint(x, 10), true +} diff --git a/cmd/devp2p/main.go b/cmd/devp2p/main.go new file mode 100644 index 000000000000..6faa65093737 --- /dev/null +++ b/cmd/devp2p/main.go @@ -0,0 +1,97 @@ +// Copyright 2019 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" + "os" + "path/filepath" + "sort" + + "github.com/ethereum/go-ethereum/internal/debug" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" + "gopkg.in/urfave/cli.v1" +) + +var ( + // Git information set by linker when building with ci.go. + gitCommit string + gitDate string + app = &cli.App{ + Name: filepath.Base(os.Args[0]), + Usage: "go-ethereum devp2p tool", + Version: params.VersionWithCommit(gitCommit, gitDate), + Writer: os.Stdout, + HideVersion: true, + } +) + +func init() { + // Set up the CLI app. + app.Flags = append(app.Flags, debug.Flags...) + app.Before = func(ctx *cli.Context) error { + return debug.Setup(ctx, "") + } + app.After = func(ctx *cli.Context) error { + debug.Exit() + return nil + } + app.CommandNotFound = func(ctx *cli.Context, cmd string) { + fmt.Fprintf(os.Stderr, "No such command: %s\n", cmd) + os.Exit(1) + } + // Add subcommands. + app.Commands = []cli.Command{ + enrdumpCommand, + discv4Command, + dnsCommand, + nodesetCommand, + } +} + +func main() { + exit(app.Run(os.Args)) +} + +// commandHasFlag returns true if the current command supports the given flag. +func commandHasFlag(ctx *cli.Context, flag cli.Flag) bool { + flags := ctx.FlagNames() + sort.Strings(flags) + i := sort.SearchStrings(flags, flag.GetName()) + return i != len(flags) && flags[i] == flag.GetName() +} + +// getNodeArg handles the common case of a single node descriptor argument. +func getNodeArg(ctx *cli.Context) *enode.Node { + if ctx.NArg() != 1 { + exit("missing node as command-line argument") + } + n, err := parseNode(ctx.Args()[0]) + if err != nil { + exit(err) + } + return n +} + +func exit(err interface{}) { + if err == nil { + os.Exit(0) + } + fmt.Fprintln(os.Stderr, err) + os.Exit(1) +} diff --git a/cmd/devp2p/nodeset.go b/cmd/devp2p/nodeset.go new file mode 100644 index 000000000000..2d86c3f65aba --- /dev/null +++ b/cmd/devp2p/nodeset.go @@ -0,0 +1,102 @@ +// Copyright 2019 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 ( + "bytes" + "encoding/json" + "fmt" + "io/ioutil" + "os" + "sort" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/p2p/enode" +) + +const jsonIndent = " " + +// nodeSet is the nodes.json file format. It holds a set of node records +// as a JSON object. +type nodeSet map[enode.ID]nodeJSON + +type nodeJSON struct { + Seq uint64 `json:"seq"` + N *enode.Node `json:"record"` + + // The score tracks how many liveness checks were performed. It is incremented by one + // every time the node passes a check, and halved every time it doesn't. + Score int `json:"score,omitempty"` + // These two track the time of last successful contact. + FirstResponse time.Time `json:"firstResponse,omitempty"` + LastResponse time.Time `json:"lastResponse,omitempty"` + // This one tracks the time of our last attempt to contact the node. + LastCheck time.Time `json:"lastCheck,omitempty"` +} + +func loadNodesJSON(file string) nodeSet { + var nodes nodeSet + if err := common.LoadJSON(file, &nodes); err != nil { + exit(err) + } + return nodes +} + +func writeNodesJSON(file string, nodes nodeSet) { + nodesJSON, err := json.MarshalIndent(nodes, "", jsonIndent) + if err != nil { + exit(err) + } + if file == "-" { + os.Stdout.Write(nodesJSON) + return + } + if err := ioutil.WriteFile(file, nodesJSON, 0644); err != nil { + exit(err) + } +} + +func (ns nodeSet) nodes() []*enode.Node { + result := make([]*enode.Node, 0, len(ns)) + for _, n := range ns { + result = append(result, n.N) + } + // Sort by ID. + sort.Slice(result, func(i, j int) bool { + return bytes.Compare(result[i].ID().Bytes(), result[j].ID().Bytes()) < 0 + }) + return result +} + +func (ns nodeSet) add(nodes ...*enode.Node) { + for _, n := range nodes { + ns[n.ID()] = nodeJSON{Seq: n.Seq(), N: n} + } +} + +func (ns nodeSet) verify() error { + for id, n := range ns { + if n.N.ID() != id { + return fmt.Errorf("invalid node %v: ID does not match ID %v in record", id, n.N.ID()) + } + if n.N.Seq() != n.Seq { + return fmt.Errorf("invalid node %v: 'seq' does not match seq %d from record", id, n.N.Seq()) + } + } + return nil +} diff --git a/cmd/devp2p/nodesetcmd.go b/cmd/devp2p/nodesetcmd.go new file mode 100644 index 000000000000..de8e6d45ee6c --- /dev/null +++ b/cmd/devp2p/nodesetcmd.go @@ -0,0 +1,193 @@ +// Copyright 2019 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" + "net" + "time" + + "github.com/ethereum/go-ethereum/core/forkid" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "gopkg.in/urfave/cli.v1" +) + +var ( + nodesetCommand = cli.Command{ + Name: "nodeset", + Usage: "Node set tools", + Subcommands: []cli.Command{ + nodesetInfoCommand, + nodesetFilterCommand, + }, + } + nodesetInfoCommand = cli.Command{ + Name: "info", + Usage: "Shows statistics about a node set", + Action: nodesetInfo, + ArgsUsage: "", + } + nodesetFilterCommand = cli.Command{ + Name: "filter", + Usage: "Filters a node set", + Action: nodesetFilter, + ArgsUsage: " filters..", + + SkipFlagParsing: true, + } +) + +func nodesetInfo(ctx *cli.Context) error { + if ctx.NArg() < 1 { + return fmt.Errorf("need nodes file as argument") + } + + ns := loadNodesJSON(ctx.Args().First()) + fmt.Printf("Set contains %d nodes.\n", len(ns)) + return nil +} + +func nodesetFilter(ctx *cli.Context) error { + if ctx.NArg() < 1 { + return fmt.Errorf("need nodes file as argument") + } + ns := loadNodesJSON(ctx.Args().First()) + filter, err := andFilter(ctx.Args().Tail()) + if err != nil { + return err + } + + result := make(nodeSet) + for id, n := range ns { + if filter(n) { + result[id] = n + } + } + writeNodesJSON("-", result) + return nil +} + +type nodeFilter func(nodeJSON) bool + +type nodeFilterC struct { + narg int + fn func([]string) (nodeFilter, error) +} + +var filterFlags = map[string]nodeFilterC{ + "-ip": {1, ipFilter}, + "-min-age": {1, minAgeFilter}, + "-eth-network": {1, ethFilter}, + "-les-server": {0, lesFilter}, +} + +func parseFilters(args []string) ([]nodeFilter, error) { + var filters []nodeFilter + for len(args) > 0 { + fc, ok := filterFlags[args[0]] + if !ok { + return nil, fmt.Errorf("invalid filter %q", args[0]) + } + if len(args) < fc.narg { + return nil, fmt.Errorf("filter %q wants %d arguments, have %d", args[0], fc.narg, len(args)) + } + filter, err := fc.fn(args[1:]) + if err != nil { + return nil, fmt.Errorf("%s: %v", args[0], err) + } + filters = append(filters, filter) + args = args[fc.narg+1:] + } + return filters, nil +} + +func andFilter(args []string) (nodeFilter, error) { + checks, err := parseFilters(args) + if err != nil { + return nil, err + } + f := func(n nodeJSON) bool { + for _, filter := range checks { + if !filter(n) { + return false + } + } + return true + } + return f, nil +} + +func ipFilter(args []string) (nodeFilter, error) { + _, cidr, err := net.ParseCIDR(args[0]) + if err != nil { + return nil, err + } + f := func(n nodeJSON) bool { return cidr.Contains(n.N.IP()) } + return f, nil +} + +func minAgeFilter(args []string) (nodeFilter, error) { + minage, err := time.ParseDuration(args[0]) + if err != nil { + return nil, err + } + f := func(n nodeJSON) bool { + age := n.LastResponse.Sub(n.FirstResponse) + return age >= minage + } + return f, nil +} + +func ethFilter(args []string) (nodeFilter, error) { + var filter forkid.Filter + switch args[0] { + case "mainnet": + filter = forkid.NewStaticFilter(params.MainnetChainConfig, params.MainnetGenesisHash) + case "rinkeby": + filter = forkid.NewStaticFilter(params.RinkebyChainConfig, params.RinkebyGenesisHash) + case "goerli": + filter = forkid.NewStaticFilter(params.GoerliChainConfig, params.GoerliGenesisHash) + case "ropsten": + filter = forkid.NewStaticFilter(params.TestnetChainConfig, params.TestnetGenesisHash) + default: + return nil, fmt.Errorf("unknown network %q", args[0]) + } + + f := func(n nodeJSON) bool { + var eth struct { + ForkID forkid.ID + _ []rlp.RawValue `rlp:"tail"` + } + if n.N.Load(enr.WithEntry("eth", ð)) != nil { + return false + } + return filter(eth.ForkID) == nil + } + return f, nil +} + +func lesFilter(args []string) (nodeFilter, error) { + f := func(n nodeJSON) bool { + var les struct { + _ []rlp.RawValue `rlp:"tail"` + } + return n.N.Load(enr.WithEntry("les", &les)) == nil + } + return f, nil +} diff --git a/cmd/ethkey/README.md b/cmd/ethkey/README.md index 48d3c9e9b775..bfddd146775c 100644 --- a/cmd/ethkey/README.md +++ b/cmd/ethkey/README.md @@ -35,18 +35,18 @@ It is possible to refer to a file containing the message. To sign a message contained in a file, use the --msgfile flag. -### `ethkey changepassphrase ` +### `ethkey changepassword ` -Change the passphrase of a keyfile. +Change the password of a keyfile. use the `--newpasswordfile` to point to the new password file. -## Passphrases +## Passwords For every command that uses a keyfile, you will be prompted to provide the -passphrase for decrypting the keyfile. To avoid this message, it is possible -to pass the passphrase by using the `--passwordfile` flag pointing to a file that -contains the passphrase. +password for decrypting the keyfile. To avoid this message, it is possible +to pass the password by using the `--passwordfile` flag pointing to a file that +contains the password. ## JSON diff --git a/cmd/ethkey/changepassphrase.go b/cmd/ethkey/changepassphrase.go deleted file mode 100644 index 57ba481928b3..000000000000 --- a/cmd/ethkey/changepassphrase.go +++ /dev/null @@ -1,72 +0,0 @@ -package main - -import ( - "fmt" - "io/ioutil" - "strings" - - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/cmd/utils" - "gopkg.in/urfave/cli.v1" -) - -var newPassphraseFlag = cli.StringFlag{ - Name: "newpasswordfile", - Usage: "the file that contains the new passphrase for the keyfile", -} - -var commandChangePassphrase = cli.Command{ - Name: "changepassphrase", - Usage: "change the passphrase on a keyfile", - ArgsUsage: "", - Description: ` -Change the passphrase of a keyfile.`, - Flags: []cli.Flag{ - passphraseFlag, - newPassphraseFlag, - }, - Action: func(ctx *cli.Context) error { - keyfilepath := ctx.Args().First() - - // Read key from file. - keyjson, err := ioutil.ReadFile(keyfilepath) - if err != nil { - utils.Fatalf("Failed to read the keyfile at '%s': %v", keyfilepath, err) - } - - // Decrypt key with passphrase. - passphrase := getPassphrase(ctx) - key, err := keystore.DecryptKey(keyjson, passphrase) - if err != nil { - utils.Fatalf("Error decrypting key: %v", err) - } - - // Get a new passphrase. - fmt.Println("Please provide a new passphrase") - var newPhrase string - if passFile := ctx.String(newPassphraseFlag.Name); passFile != "" { - content, err := ioutil.ReadFile(passFile) - if err != nil { - utils.Fatalf("Failed to read new passphrase file '%s': %v", passFile, err) - } - newPhrase = strings.TrimRight(string(content), "\r\n") - } else { - newPhrase = promptPassphrase(true) - } - - // Encrypt the key with the new passphrase. - newJson, err := keystore.EncryptKey(key, newPhrase, keystore.StandardScryptN, keystore.StandardScryptP) - if err != nil { - utils.Fatalf("Error encrypting with new passphrase: %v", err) - } - - // Then write the new keyfile in place of the old one. - if err := ioutil.WriteFile(keyfilepath, newJson, 600); err != nil { - utils.Fatalf("Error writing new keyfile to disk: %v", err) - } - - // Don't print anything. Just return successfully, - // producing a positive exit code. - return nil - }, -} diff --git a/cmd/ethkey/changepassword.go b/cmd/ethkey/changepassword.go new file mode 100644 index 000000000000..32fde4ed6daf --- /dev/null +++ b/cmd/ethkey/changepassword.go @@ -0,0 +1,88 @@ +// Copyright 2018 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/ioutil" + "strings" + + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/cmd/utils" + "gopkg.in/urfave/cli.v1" +) + +var newPassphraseFlag = cli.StringFlag{ + Name: "newpasswordfile", + Usage: "the file that contains the new password for the keyfile", +} + +var commandChangePassphrase = cli.Command{ + Name: "changepassword", + Usage: "change the password on a keyfile", + ArgsUsage: "", + Description: ` +Change the password of a keyfile.`, + Flags: []cli.Flag{ + passphraseFlag, + newPassphraseFlag, + }, + Action: func(ctx *cli.Context) error { + keyfilepath := ctx.Args().First() + + // Read key from file. + keyjson, err := ioutil.ReadFile(keyfilepath) + if err != nil { + utils.Fatalf("Failed to read the keyfile at '%s': %v", keyfilepath, err) + } + + // Decrypt key with passphrase. + passphrase := getPassphrase(ctx) + key, err := keystore.DecryptKey(keyjson, passphrase) + if err != nil { + utils.Fatalf("Error decrypting key: %v", err) + } + + // Get a new passphrase. + fmt.Println("Please provide a new password") + var newPhrase string + if passFile := ctx.String(newPassphraseFlag.Name); passFile != "" { + content, err := ioutil.ReadFile(passFile) + if err != nil { + utils.Fatalf("Failed to read new password file '%s': %v", passFile, err) + } + newPhrase = strings.TrimRight(string(content), "\r\n") + } else { + newPhrase = promptPassphrase(true) + } + + // Encrypt the key with the new passphrase. + newJson, err := keystore.EncryptKey(key, newPhrase, keystore.StandardScryptN, keystore.StandardScryptP) + if err != nil { + utils.Fatalf("Error encrypting with new password: %v", err) + } + + // Then write the new keyfile in place of the old one. + if err := ioutil.WriteFile(keyfilepath, newJson, 0600); err != nil { + utils.Fatalf("Error writing new keyfile to disk: %v", err) + } + + // Don't print anything. Just return successfully, + // producing a positive exit code. + return nil + }, +} diff --git a/cmd/ethkey/generate.go b/cmd/ethkey/generate.go index 0f925fc1a6e7..fe9a0c15192e 100644 --- a/cmd/ethkey/generate.go +++ b/cmd/ethkey/generate.go @@ -23,9 +23,9 @@ import ( "os" "path/filepath" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/crypto" "github.com/pborman/uuid" "gopkg.in/urfave/cli.v1" ) diff --git a/cmd/ethkey/inspect.go b/cmd/ethkey/inspect.go index 4985820eb665..ba03d4d93692 100644 --- a/cmd/ethkey/inspect.go +++ b/cmd/ethkey/inspect.go @@ -21,9 +21,9 @@ import ( "fmt" "io/ioutil" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/crypto" "gopkg.in/urfave/cli.v1" ) diff --git a/cmd/ethkey/main.go b/cmd/ethkey/main.go index e636e67ab6fa..dbc49605888a 100644 --- a/cmd/ethkey/main.go +++ b/cmd/ethkey/main.go @@ -20,7 +20,7 @@ import ( "fmt" "os" - "github.com/nebulaai/nbai-node/cmd/utils" + "github.com/ethereum/go-ethereum/cmd/utils" "gopkg.in/urfave/cli.v1" ) @@ -30,11 +30,12 @@ const ( // Git SHA1 commit hash of the release (set via linker flags) var gitCommit = "" +var gitDate = "" var app *cli.App func init() { - app = utils.NewApp(gitCommit, "an Ethereum key manager") + app = utils.NewApp(gitCommit, gitDate, "an Ethereum key manager") app.Commands = []cli.Command{ commandGenerate, commandInspect, @@ -42,13 +43,14 @@ func init() { commandSignMessage, commandVerifyMessage, } + cli.CommandHelpTemplate = utils.OriginCommandHelpTemplate } // Commonly used command line flags. var ( passphraseFlag = cli.StringFlag{ Name: "passwordfile", - Usage: "the file that contains the passphrase for the keyfile", + Usage: "the file that contains the password for the keyfile", } jsonFlag = cli.BoolFlag{ Name: "json", diff --git a/cmd/ethkey/message.go b/cmd/ethkey/message.go index 04c27b9cc7a8..5caea69ff653 100644 --- a/cmd/ethkey/message.go +++ b/cmd/ethkey/message.go @@ -21,10 +21,10 @@ import ( "fmt" "io/ioutil" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" "gopkg.in/urfave/cli.v1" ) diff --git a/cmd/ethkey/message_test.go b/cmd/ethkey/message_test.go index 39352b1d22dd..e9e8eeeafb88 100644 --- a/cmd/ethkey/message_test.go +++ b/cmd/ethkey/message_test.go @@ -37,8 +37,8 @@ func TestMessageSignVerify(t *testing.T) { generate := runEthkey(t, "generate", keyfile) generate.Expect(` !! Unsupported terminal, password will be echoed. -Passphrase: {{.InputLine "foobar"}} -Repeat passphrase: {{.InputLine "foobar"}} +Password: {{.InputLine "foobar"}} +Repeat password: {{.InputLine "foobar"}} `) _, matches := generate.ExpectRegexp(`Address: (0x[0-9a-fA-F]{40})\n`) address := matches[1] @@ -48,7 +48,7 @@ Repeat passphrase: {{.InputLine "foobar"}} sign := runEthkey(t, "signmessage", keyfile, message) sign.Expect(` !! Unsupported terminal, password will be echoed. -Passphrase: {{.InputLine "foobar"}} +Password: {{.InputLine "foobar"}} `) _, matches = sign.ExpectRegexp(`Signature: ([0-9a-f]+)\n`) signature := matches[1] diff --git a/cmd/ethkey/run_test.go b/cmd/ethkey/run_test.go index ca9546346a09..6006f6b5bb70 100644 --- a/cmd/ethkey/run_test.go +++ b/cmd/ethkey/run_test.go @@ -22,7 +22,7 @@ import ( "testing" "github.com/docker/docker/pkg/reexec" - "github.com/nebulaai/nbai-node/internal/cmdtest" + "github.com/ethereum/go-ethereum/internal/cmdtest" ) type testEthkey struct { diff --git a/cmd/ethkey/utils.go b/cmd/ethkey/utils.go index e642d36a7fc5..c6cf5c25a3ba 100644 --- a/cmd/ethkey/utils.go +++ b/cmd/ethkey/utils.go @@ -22,27 +22,27 @@ import ( "io/ioutil" "strings" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/console" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/console" + "github.com/ethereum/go-ethereum/crypto" "gopkg.in/urfave/cli.v1" ) // promptPassphrase prompts the user for a passphrase. Set confirmation to true // to require the user to confirm the passphrase. func promptPassphrase(confirmation bool) string { - passphrase, err := console.Stdin.PromptPassword("Passphrase: ") + passphrase, err := console.Stdin.PromptPassword("Password: ") if err != nil { - utils.Fatalf("Failed to read passphrase: %v", err) + utils.Fatalf("Failed to read password: %v", err) } if confirmation { - confirm, err := console.Stdin.PromptPassword("Repeat passphrase: ") + confirm, err := console.Stdin.PromptPassword("Repeat password: ") if err != nil { - utils.Fatalf("Failed to read passphrase confirmation: %v", err) + utils.Fatalf("Failed to read password confirmation: %v", err) } if passphrase != confirm { - utils.Fatalf("Passphrases do not match") + utils.Fatalf("Passwords do not match") } } @@ -58,7 +58,7 @@ func getPassphrase(ctx *cli.Context) string { if passphraseFile != "" { content, err := ioutil.ReadFile(passphraseFile) if err != nil { - utils.Fatalf("Failed to read passphrase file '%s': %v", + utils.Fatalf("Failed to read password file '%s': %v", passphraseFile, err) } return strings.TrimRight(string(content), "\r\n") diff --git a/cmd/evm/compiler.go b/cmd/evm/compiler.go index e491e959adb4..c019a2fe70b7 100644 --- a/cmd/evm/compiler.go +++ b/cmd/evm/compiler.go @@ -21,7 +21,7 @@ import ( "fmt" "io/ioutil" - "github.com/nebulaai/nbai-node/cmd/evm/internal/compiler" + "github.com/ethereum/go-ethereum/cmd/evm/internal/compiler" cli "gopkg.in/urfave/cli.v1" ) diff --git a/cmd/evm/disasm.go b/cmd/evm/disasm.go index a47fb6235d72..69f611e39b11 100644 --- a/cmd/evm/disasm.go +++ b/cmd/evm/disasm.go @@ -22,7 +22,7 @@ import ( "io/ioutil" "strings" - "github.com/nebulaai/nbai-node/core/asm" + "github.com/ethereum/go-ethereum/core/asm" cli "gopkg.in/urfave/cli.v1" ) diff --git a/cmd/evm/internal/compiler/compiler.go b/cmd/evm/internal/compiler/compiler.go index f5591139ebb7..54981b669768 100644 --- a/cmd/evm/internal/compiler/compiler.go +++ b/cmd/evm/internal/compiler/compiler.go @@ -20,12 +20,12 @@ import ( "errors" "fmt" - "github.com/nebulaai/nbai-node/core/asm" + "github.com/ethereum/go-ethereum/core/asm" ) func Compile(fn string, src []byte, debug bool) (string, error) { compiler := asm.NewCompiler(debug) - compiler.Feed(asm.Lex(fn, src, debug)) + compiler.Feed(asm.Lex(src, debug)) bin, compileErrors := compiler.Compile() if len(compileErrors) > 0 { diff --git a/cmd/evm/main.go b/cmd/evm/main.go index c0ff50b95fc5..67447d58ae63 100644 --- a/cmd/evm/main.go +++ b/cmd/evm/main.go @@ -22,14 +22,15 @@ import ( "math/big" "os" - "github.com/nebulaai/nbai-node/cmd/utils" + "github.com/ethereum/go-ethereum/cmd/utils" "gopkg.in/urfave/cli.v1" ) var gitCommit = "" // Git SHA1 commit hash of the release (set via linker flags) +var gitDate = "" var ( - app = utils.NewApp(gitCommit, "the evm command line interface") + app = utils.NewApp(gitCommit, gitDate, "the evm command line interface") DebugFlag = cli.BoolFlag{ Name: "debug", @@ -78,6 +79,10 @@ var ( Name: "input", Usage: "input for the EVM", } + InputFileFlag = cli.StringFlag{ + Name: "inputfile", + Usage: "file containing input for the EVM", + } VerbosityFlag = cli.IntFlag{ Name: "verbosity", Usage: "sets the verbosity level", @@ -110,6 +115,11 @@ var ( Name: "nostack", Usage: "disable stack output", } + EVMInterpreterFlag = cli.StringFlag{ + Name: "vm.evm", + Usage: "External EVM configuration (default = built-in interpreter)", + Value: "", + } ) func init() { @@ -124,6 +134,7 @@ func init() { ValueFlag, DumpFlag, InputFlag, + InputFileFlag, MemProfileFlag, CPUProfileFlag, StatDumpFlag, @@ -133,6 +144,7 @@ func init() { ReceiverFlag, DisableMemoryFlag, DisableStackFlag, + EVMInterpreterFlag, } app.Commands = []cli.Command{ compileCommand, @@ -140,6 +152,7 @@ func init() { runCommand, stateTestCommand, } + cli.CommandHelpTemplate = utils.OriginCommandHelpTemplate } func main() { diff --git a/cmd/evm/runner.go b/cmd/evm/runner.go index 413746a48fd0..cecbf360639a 100644 --- a/cmd/evm/runner.go +++ b/cmd/evm/runner.go @@ -27,16 +27,16 @@ import ( "runtime/pprof" "time" - "github.com/nebulaai/nbai-node/cmd/evm/internal/compiler" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/core/vm/runtime" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/cmd/evm/internal/compiler" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/core/vm/runtime" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" cli "gopkg.in/urfave/cli.v1" ) @@ -99,12 +99,12 @@ func runCmd(ctx *cli.Context) error { if ctx.GlobalString(GenesisFlag.Name) != "" { gen := readGenesis(ctx.GlobalString(GenesisFlag.Name)) genesisConfig = gen - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() genesis := gen.ToBlock(db) statedb, _ = state.New(genesis.Root(), state.NewDatabase(db)) chainConfig = gen.Config } else { - statedb, _ = state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ = state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) genesisConfig = new(core.Genesis) } if ctx.GlobalString(SenderFlag.Name) != "" { @@ -121,28 +121,37 @@ func runCmd(ctx *cli.Context) error { ret []byte err error ) + codeFileFlag := ctx.GlobalString(CodeFileFlag.Name) + codeFlag := ctx.GlobalString(CodeFlag.Name) + // The '--code' or '--codefile' flag overrides code in state - if ctx.GlobalString(CodeFileFlag.Name) != "" { + if codeFileFlag != "" || codeFlag != "" { 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) + if codeFileFlag != "" { + var err error + // If - is specified, it means that code comes from stdin + if codeFileFlag == "-" { + //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(codeFileFlag); err != nil { + fmt.Printf("Could not load code from file: %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) - } + hexcode = []byte(codeFlag) } - code = common.Hex2Bytes(string(bytes.TrimRight(hexcode, "\n"))) - - } else if ctx.GlobalString(CodeFlag.Name) != "" { - code = common.Hex2Bytes(ctx.GlobalString(CodeFlag.Name)) + hexcode = bytes.TrimSpace(hexcode) + if len(hexcode)%2 != 0 { + fmt.Printf("Invalid input length for hex data (%d)\n", len(hexcode)) + os.Exit(1) + } + code = common.FromHex(string(hexcode)) } else if fn := ctx.Args().First(); len(fn) > 0 { // EASM-file to compile src, err := ioutil.ReadFile(fn) @@ -155,7 +164,6 @@ func runCmd(ctx *cli.Context) error { } code = common.Hex2Bytes(bin) } - initialGas := ctx.GlobalUint64(GasFlag.Name) if genesisConfig.GasLimit != 0 { initialGas = genesisConfig.GasLimit @@ -171,8 +179,9 @@ func runCmd(ctx *cli.Context) error { Coinbase: genesisConfig.Coinbase, BlockNumber: new(big.Int).SetUint64(genesisConfig.Number), EVMConfig: vm.Config{ - Tracer: tracer, - Debug: ctx.GlobalBool(DebugFlag.Name) || ctx.GlobalBool(MachineFlag.Name), + Tracer: tracer, + Debug: ctx.GlobalBool(DebugFlag.Name) || ctx.GlobalBool(MachineFlag.Name), + EVMInterpreter: ctx.GlobalString(EVMInterpreterFlag.Name), }, } @@ -191,24 +200,36 @@ func runCmd(ctx *cli.Context) error { if chainConfig != nil { runtimeConfig.ChainConfig = chainConfig + } else { + runtimeConfig.ChainConfig = params.AllEthashProtocolChanges } tstart := time.Now() var leftOverGas uint64 + var hexInput []byte + if inputFileFlag := ctx.GlobalString(InputFileFlag.Name); inputFileFlag != "" { + if hexInput, err = ioutil.ReadFile(inputFileFlag); err != nil { + fmt.Printf("could not load input from file: %v\n", err) + os.Exit(1) + } + } else { + hexInput = []byte(ctx.GlobalString(InputFlag.Name)) + } + input := common.FromHex(string(bytes.TrimSpace(hexInput))) if ctx.GlobalBool(CreateFlag.Name) { - input := append(code, common.Hex2Bytes(ctx.GlobalString(InputFlag.Name))...) + input = append(code, input...) ret, _, leftOverGas, err = runtime.Create(input, &runtimeConfig) } else { if len(code) > 0 { statedb.SetCode(receiver, code) } - ret, leftOverGas, err = runtime.Call(receiver, common.Hex2Bytes(ctx.GlobalString(InputFlag.Name)), &runtimeConfig) + ret, leftOverGas, err = runtime.Call(receiver, input, &runtimeConfig) } execTime := time.Since(tstart) if ctx.GlobalBool(DumpFlag.Name) { statedb.Commit(true) statedb.IntermediateRoot(true) - fmt.Println(string(statedb.Dump())) + fmt.Println(string(statedb.Dump(false, false, true))) } if memProfilePath := ctx.GlobalString(MemProfileFlag.Name); memProfilePath != "" { diff --git a/cmd/evm/staterunner.go b/cmd/evm/staterunner.go index 52c073c4807c..cef2aedb5e68 100644 --- a/cmd/evm/staterunner.go +++ b/cmd/evm/staterunner.go @@ -23,10 +23,10 @@ import ( "io/ioutil" "os" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/tests" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/tests" cli "gopkg.in/urfave/cli.v1" ) @@ -105,7 +105,7 @@ func stateTestCmd(ctx *cli.Context) error { // 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() + dump := state.RawDump(false, false, true) result.State = &dump } } diff --git a/cmd/faucet/faucet.go b/cmd/faucet/faucet.go index d5534a8e2e3e..77938efabd90 100644 --- a/cmd/faucet/faucet.go +++ b/cmd/faucet/faucet.go @@ -41,30 +41,30 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/eth" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/ethclient" - "github.com/nebulaai/nbai-node/ethstats" - "github.com/nebulaai/nbai-node/les" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/discv5" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/nat" - "github.com/nebulaai/nbai-node/params" - "golang.org/x/net/websocket" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/ethstats" + "github.com/ethereum/go-ethereum/les" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/discv5" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/nat" + "github.com/ethereum/go-ethereum/params" + "github.com/gorilla/websocket" ) var ( genesisFlag = flag.String("genesis", "", "Genesis json file to seed the chain with") apiPortFlag = flag.Int("apiport", 8080, "Listener port for the HTTP API connection") - ethPortFlag = flag.Int("ethport", 30332, "Listener port for the devp2p connection") + ethPortFlag = flag.Int("ethport", 30303, "Listener port for the devp2p connection") bootFlag = flag.String("bootnodes", "", "Comma separated bootnode enode URLs to seed with") netFlag = flag.Uint64("network", 0, "Network ID to use for the Ethereum protocol") statsFlag = flag.String("ethstats", "", "Ethstats network monitoring auth string") @@ -88,6 +88,11 @@ var ( ether = new(big.Int).Exp(big.NewInt(10), big.NewInt(18), nil) ) +var ( + gitCommit = "" // Git SHA1 commit hash of the release (set via linker flags) + gitDate = "" // Git commit date YYYYMMDD of the release (set via linker flags) +) + func main() { // Parse the flags and set up the logger to print everything requested flag.Parse() @@ -216,7 +221,7 @@ func newFaucet(genesis *core.Genesis, port int, enodes []*discv5.Node, network u // Assemble the raw devp2p protocol stack stack, err := node.New(&node.Config{ Name: "geth", - Version: params.VersionWithMeta, + Version: params.VersionWithCommit(gitCommit, gitDate), DataDir: filepath.Join(os.Getenv("HOME"), ".faucet"), P2P: p2p.Config{ NAT: nat.Any(), @@ -255,7 +260,7 @@ func newFaucet(genesis *core.Genesis, port int, enodes []*discv5.Node, network u return nil, err } for _, boot := range enodes { - old, err := enode.ParseV4(boot.String()) + old, err := enode.Parse(enode.ValidSchemes, boot.String()) if err == nil { stack.Server().AddPeer(old) } @@ -282,7 +287,7 @@ func newFaucet(genesis *core.Genesis, port int, enodes []*discv5.Node, network u // close terminates the Ethereum connection and tears down the faucet. func (f *faucet) close() error { - return f.stack.Stop() + return f.stack.Close() } // listenAndServe registers the HTTP handlers for the faucet and boots it up @@ -291,8 +296,7 @@ func (f *faucet) listenAndServe(port int) error { go f.loop() http.HandleFunc("/", f.webHandler) - http.Handle("/api", websocket.Handler(f.apiHandler)) - + http.HandleFunc("/api", f.apiHandler) return http.ListenAndServe(fmt.Sprintf(":%d", port), nil) } @@ -303,7 +307,13 @@ 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) { +func (f *faucet) apiHandler(w http.ResponseWriter, r *http.Request) { + upgrader := websocket.Upgrader{} + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + return + } + // Start tracking the connection and drop at the end defer conn.Close() @@ -326,7 +336,6 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { head *types.Header balance *big.Int nonce uint64 - err error ) for head == nil || balance == nil { // Retrieve the current stats cached by the faucet @@ -342,6 +351,7 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { if head == nil || balance == nil { // Report the faucet offline until initial stats are ready + //lint:ignore ST1005 This error is to be displayed in the browser if err = sendError(conn, errors.New("Faucet offline")); err != nil { log.Warn("Failed to send faucet error to client", "err", err) return @@ -371,7 +381,7 @@ 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 = conn.ReadJSON(&msg); err != nil { return } if !*noauthFlag && !strings.HasPrefix(msg.URL, "https://gist.github.com/") && !strings.HasPrefix(msg.URL, "https://twitter.com/") && @@ -383,6 +393,7 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { continue } if msg.Tier >= uint(*tiersFlag) { + //lint:ignore ST1005 This error is to be displayed in the browser if err = sendError(conn, errors.New("Invalid funding tier requested")); err != nil { log.Warn("Failed to send tier error to client", "err", err) return @@ -420,6 +431,7 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { } if !result.Success { log.Warn("Captcha verification failed", "err", string(result.Errors)) + //lint:ignore ST1005 it's funny and the robot won't mind 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 @@ -440,16 +452,22 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { return } continue + case strings.HasPrefix(msg.URL, "https://plus.google.com/"): + //lint:ignore ST1005 Google is a company name and should be capitalized. + if err = sendError(conn, errors.New("Google+ authentication discontinued as the service was sunset")); err != nil { + log.Warn("Failed to send Google+ deprecation to client", "err", err) + return + } + continue 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) case *noauthFlag: username, avatar, address, err = authNoAuth(msg.URL) default: - err = errors.New("Something funky happened, please open an issue at https://github.com/nebulaai/nbai-node/issues") + //lint:ignore ST1005 This error is to be displayed in the browser + err = errors.New("Something funky happened, please open an issue at https://github.com/ethereum/go-ethereum/issues") } if err != nil { if err = sendError(conn, err); err != nil { @@ -497,14 +515,17 @@ func (f *faucet) apiHandler(conn *websocket.Conn) { Time: time.Now(), Tx: signed, }) - f.timeouts[username] = time.Now().Add(time.Duration(*minutesFlag*int(math.Pow(3, float64(msg.Tier)))) * time.Minute) + timeout := time.Duration(*minutesFlag*int(math.Pow(3, float64(msg.Tier)))) * time.Minute + grace := timeout / 288 // 24h timeout => 5m grace + + f.timeouts[username] = time.Now().Add(timeout - grace) fund = true } f.lock.Unlock() // Send an error if too frequent funding, othewise a success if !fund { - if err = sendError(conn, fmt.Errorf("%s left until next allowance", common.PrettyDuration(timeout.Sub(time.Now())))); err != nil { // nolint: gosimple + if err = sendError(conn, fmt.Errorf("%s left until next allowance", common.PrettyDuration(time.Until(timeout)))); err != nil { // nolint: gosimple log.Warn("Failed to send funding error to client", "err", err) return } @@ -579,7 +600,7 @@ func (f *faucet) loop() { go func() { for head := range update { // New chain head arrived, query the current stats and stream to clients - timestamp := time.Unix(head.Time.Int64(), 0) + timestamp := time.Unix(int64(head.Time), 0) if time.Since(timestamp) > time.Hour { log.Warn("Skipping faucet refresh, head too old", "number", head.Number, "hash", head.Hash(), "age", common.PrettyAge(timestamp)) continue @@ -645,7 +666,7 @@ func send(conn *websocket.Conn, value interface{}, timeout time.Duration) error timeout = 60 * time.Second } conn.SetWriteDeadline(time.Now().Add(timeout)) - return websocket.JSON.Send(conn, value) + return conn.WriteJSON(value) } // sendError transmits an error to the remote end of the websocket, also setting @@ -666,6 +687,7 @@ 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" { + //lint:ignore ST1005 This error is to be displayed in the browser return "", "", common.Address{}, errors.New("Invalid Twitter status URL") } // Twitter's API isn't really friendly with direct links. Still, we don't @@ -680,6 +702,7 @@ func authTwitter(url string) (string, string, common.Address, error) { // Resolve the username from the final redirect, no intermediate junk parts = strings.Split(res.Request.URL.String(), "/") if len(parts) < 4 || parts[len(parts)-2] != "status" { + //lint:ignore ST1005 This error is to be displayed in the browser return "", "", common.Address{}, errors.New("Invalid Twitter status URL") } username := parts[len(parts)-3] @@ -690,6 +713,7 @@ func authTwitter(url string) (string, string, common.Address, error) { } address := common.HexToAddress(string(regexp.MustCompile("0x[0-9a-fA-F]{40}").Find(body))) if address == (common.Address{}) { + //lint:ignore ST1005 This error is to be displayed in the browser return "", "", common.Address{}, errors.New("No Ethereum address found to fund") } var avatar string @@ -699,46 +723,13 @@ func authTwitter(url string) (string, string, common.Address, error) { 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" { + //lint:ignore ST1005 This error is to be displayed in the browser return "", "", common.Address{}, errors.New("Invalid Facebook post URL") } username := parts[len(parts)-3] @@ -758,6 +749,7 @@ func authFacebook(url string) (string, string, common.Address, error) { } address := common.HexToAddress(string(regexp.MustCompile("0x[0-9a-fA-F]{40}").Find(body))) if address == (common.Address{}) { + //lint:ignore ST1005 This error is to be displayed in the browser return "", "", common.Address{}, errors.New("No Ethereum address found to fund") } var avatar string @@ -773,6 +765,7 @@ func authFacebook(url string) (string, string, common.Address, error) { func authNoAuth(url string) (string, string, common.Address, error) { address := common.HexToAddress(regexp.MustCompile("0x[0-9a-fA-F]{40}").FindString(url)) if address == (common.Address{}) { + //lint:ignore ST1005 This error is to be displayed in the browser return "", "", common.Address{}, errors.New("No Ethereum address found to fund") } return address.Hex() + "@noauth", "", address, nil diff --git a/cmd/faucet/faucet.html b/cmd/faucet/faucet.html index ab41b2c87178..314b19e1232d 100644 --- a/cmd/faucet/faucet.html +++ b/cmd/faucet/faucet.html @@ -80,14 +80,11 @@

{{

How does this work?

-

This Ether faucet is running on the {{.Network}} network. To prevent malicious actors from exhausting all available funds or accumulating enough Ether to mount long running spam attacks, requests are tied to common 3rd party social network accounts. Anyone having a Twitter, Google+ or Facebook account may request funds within the permitted limits.

+

This Ether faucet is running on the {{.Network}} network. To prevent malicious actors from exhausting all available funds or accumulating enough Ether to mount long running spam attacks, requests are tied to common 3rd party social network accounts. Anyone having a Twitter or Facebook account may request funds within the permitted limits.

To request funds via Twitter, make a tweet with your Ethereum address pasted into the contents (surrounding text doesn't matter).
Copy-paste the tweets URL into the above input box and fire away!
-
-
To request funds via Google Plus, publish a new public post with your Ethereum address embedded into the content (surrounding text doesn't matter).
Copy-paste the posts URL into the above input box and fire away!
-
To request funds via Facebook, publish a new public post with your Ethereum address embedded into the content (surrounding text doesn't matter).
Copy-paste the posts URL into the above input box and fire away!
diff --git a/cmd/faucet/website.go b/cmd/faucet/website.go index fab1d43460bf..a091d249196e 100644 --- a/cmd/faucet/website.go +++ b/cmd/faucet/website.go @@ -1,12 +1,13 @@ // Code generated by go-bindata. DO NOT EDIT. // sources: -// faucet.html +// faucet.html (11.27kB) package main import ( "bytes" "compress/gzip" + "crypto/sha256" "fmt" "io" "io/ioutil" @@ -19,7 +20,7 @@ import ( 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) + return nil, fmt.Errorf("read %q: %v", name, err) } var buf bytes.Buffer @@ -27,7 +28,7 @@ func bindataRead(data []byte, name string) ([]byte, error) { clErr := gz.Close() if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) + return nil, fmt.Errorf("read %q: %v", name, err) } if clErr != nil { return nil, err @@ -37,8 +38,9 @@ func bindataRead(data []byte, name string) ([]byte, error) { } type asset struct { - bytes []byte - info os.FileInfo + bytes []byte + info os.FileInfo + digest [sha256.Size]byte } type bindataFileInfo struct { @@ -67,7 +69,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5a\x71\x73\xdb\xb6\x92\xff\xdb\xf9\x14\x5b\x5e\xfc\x24\x9d\x4d\x52\xb6\x93\x3c\x9f\x44\xaa\x93\x97\xd7\xd7\xcb\xcd\x5d\xdb\x69\xd3\xb9\x7b\xd3\xd7\xb9\x01\x89\x95\x88\x18\x04\x58\x00\x94\xac\x7a\xf4\xdd\x6f\x00\x90\x14\x29\xc9\x6e\xd2\xe4\xde\x34\x7f\x38\x24\xb0\xd8\x5d\xec\xfe\x16\xbb\x58\x2a\xf9\xe2\xaf\xdf\xbe\x79\xf7\xf7\xef\xbe\x82\xc2\x94\x7c\xf1\x2c\xb1\xff\x01\x27\x62\x95\x06\x28\x82\xc5\xb3\xb3\xa4\x40\x42\x17\xcf\xce\xce\x92\x12\x0d\x81\xbc\x20\x4a\xa3\x49\x83\xda\x2c\xc3\xdb\x60\x3f\x51\x18\x53\x85\xf8\x4b\xcd\xd6\x69\xf0\x3f\xe1\x8f\xaf\xc3\x37\xb2\xac\x88\x61\x19\xc7\x00\x72\x29\x0c\x0a\x93\x06\x6f\xbf\x4a\x91\xae\xb0\xb7\x4e\x90\x12\xd3\x60\xcd\x70\x53\x49\x65\x7a\xa4\x1b\x46\x4d\x91\x52\x5c\xb3\x1c\x43\xf7\x72\x09\x4c\x30\xc3\x08\x0f\x75\x4e\x38\xa6\x57\xc1\xe2\x99\xe5\x63\x98\xe1\xb8\x78\x78\x88\xbe\x41\xb3\x91\xea\x6e\xb7\x9b\xc1\xeb\xda\x14\x28\x0c\xcb\x89\x41\x0a\x7f\x23\x75\x8e\x26\x89\x3d\xa5\x5b\xc4\x99\xb8\x83\x42\xe1\x32\x0d\xac\xea\x7a\x16\xc7\x39\x15\xef\x75\x94\x73\x59\xd3\x25\x27\x0a\xa3\x5c\x96\x31\x79\x4f\xee\x63\xce\x32\x1d\x9b\x0d\x33\x06\x55\x98\x49\x69\xb4\x51\xa4\x8a\x6f\xa2\x9b\xe8\xcf\x71\xae\x75\xdc\x8d\x45\x25\x13\x51\xae\x75\x00\x0a\x79\x1a\x68\xb3\xe5\xa8\x0b\x44\x13\x40\xbc\xf8\x7d\x72\x97\x52\x98\x90\x6c\x50\xcb\x12\xe3\x17\xd1\x9f\xa3\xa9\x13\xd9\x1f\x7e\x5a\xaa\x15\xab\x73\xc5\x2a\x03\x5a\xe5\x1f\x2c\xf7\xfd\x2f\x35\xaa\x6d\x7c\x13\x5d\x45\x57\xcd\x8b\x93\xf3\x5e\x07\x8b\x24\xf6\x0c\x17\x9f\xc4\x3b\x14\xd2\x6c\xe3\xeb\xe8\x45\x74\x15\x57\x24\xbf\x23\x2b\xa4\xad\x24\x3b\x15\xb5\x83\x9f\x4d\xee\x63\x3e\x7c\x7f\xe8\xc2\xcf\x21\xac\x94\x25\x0a\x13\xbd\xd7\xf1\x75\x74\x75\x1b\x4d\xdb\x81\x63\xfe\x4e\x80\x75\x9a\x15\x75\x16\xad\x51\x59\xe4\xf2\x30\x47\x61\x50\xc1\x83\x1d\x3d\x2b\x99\x08\x0b\x64\xab\xc2\xcc\xe0\x6a\x3a\x3d\x9f\x9f\x1a\x5d\x17\x7e\x98\x32\x5d\x71\xb2\x9d\xc1\x92\xe3\xbd\x1f\x22\x9c\xad\x44\xc8\x0c\x96\x7a\x06\x9e\xb3\x9b\xd8\x39\x99\x95\x92\x2b\x85\x5a\x37\xc2\x2a\xa9\x99\x61\x52\xcc\x2c\xa2\x88\x61\x6b\x3c\x45\xab\x2b\x22\x8e\x16\x90\x4c\x4b\x5e\x1b\x3c\x50\x24\xe3\x32\xbf\xf3\x63\x2e\x9a\xfb\x9b\xc8\x25\x97\x6a\x06\x9b\x82\x35\xcb\xc0\x09\x82\x4a\x61\xc3\x1e\x2a\x42\x29\x13\xab\x19\xbc\xaa\x9a\xfd\x40\x49\xd4\x8a\x89\x19\x4c\xf7\x4b\x92\xb8\x35\x63\x12\xfb\x83\xeb\xd9\x59\x92\x49\xba\x75\x3e\xa4\x6c\x0d\x39\x27\x5a\xa7\xc1\x81\x89\xdd\x81\x34\x20\xb0\xe7\x10\x61\xa2\x9d\x1a\xcc\x29\xb9\x09\xc0\x09\x4a\x03\xaf\x44\x98\x49\x63\x64\x39\x83\x2b\xab\x5e\xb3\xe4\x80\x1f\x0f\xf9\x2a\xbc\xba\x6e\x27\xcf\x92\xe2\xaa\x65\x62\xf0\xde\x84\xce\x3f\x9d\x67\x82\x45\xc2\xda\xb5\x4b\x02\x4b\x12\x66\xc4\x14\x01\x10\xc5\x48\x58\x30\x4a\x51\xa4\x81\x51\x35\x5a\x1c\xb1\x05\xf4\x8f\xbf\x47\x4e\xbf\xe2\xaa\xd5\x2b\xa6\x6c\xdd\x6c\xab\xf7\x78\xb0\xc3\xc7\x37\x71\x0b\xcd\x83\x5c\x2e\x35\x9a\xb0\xb7\xa7\x1e\x31\x13\x55\x6d\xc2\x95\x92\x75\xd5\xcd\x9f\x25\x6e\x14\x18\x4d\x83\x5a\xf1\xa0\x39\xfe\xdd\xa3\xd9\x56\x8d\x29\x82\x6e\xe3\x52\x95\xa1\xf5\x84\x92\x3c\x80\x8a\x93\x1c\x0b\xc9\x29\xaa\x34\xf8\x41\xe6\x8c\x70\x10\x7e\xcf\xf0\xe3\xf7\xff\x09\x8d\xcb\x98\x58\xc1\x56\xd6\x0a\xbe\x32\x05\x2a\xac\x4b\x20\x94\x5a\xb8\x46\x51\xd4\x53\xc4\x61\xf7\x58\xd5\x30\x33\x62\x4f\x75\x96\x64\xb5\x31\xb2\x23\xcc\x8c\x80\xcc\x88\x90\xe2\x92\xd4\xdc\x00\x55\xb2\xa2\x72\x23\x42\x23\x57\x2b\x9b\xe9\xfc\x26\xfc\xa2\x00\x28\x31\xa4\x99\x4a\x83\x96\xb6\xf5\x21\xd1\x95\xac\xea\xaa\xf1\xa2\x1f\xc4\xfb\x8a\x08\x8a\xd4\xfa\x9c\x6b\x0c\x16\x5f\xb3\x35\x42\x89\x7e\x2f\x67\x87\x90\xc8\x89\x42\x13\xf6\x99\x1e\x01\x23\x89\xbd\x32\x7e\x4b\xd0\xfc\x4b\x6a\xde\x72\xea\xb6\x50\xa2\xa8\x61\xf0\x16\x2a\x7b\xae\x04\x8b\x87\x07\x45\xc4\x0a\xe1\x39\xa3\xf7\x97\xf0\x9c\x94\xb2\x16\x06\x66\x29\x44\xaf\xdd\xa3\xde\xed\x06\xdc\x01\x12\xce\x16\x09\x79\x0a\xde\x20\x45\xce\x59\x7e\x97\x06\x86\xa1\x4a\x1f\x1e\x2c\xf3\xdd\x6e\x0e\x0f\x0f\x6c\x09\xcf\xa3\xef\x31\x27\x95\xc9\x0b\xb2\xdb\xad\x54\xfb\x1c\xe1\x3d\xe6\xb5\xc1\xf1\xe4\xe1\x01\xb9\xc6\xdd\x4e\xd7\x59\xc9\xcc\xb8\x5d\x6e\xc7\x05\xdd\xed\xac\xce\x8d\x9e\xbb\x1d\xc4\x96\xa9\xa0\x78\x0f\xcf\xa3\xef\x50\x31\x49\x35\x78\xfa\x24\x26\x8b\x24\xe6\x6c\xd1\xac\x1b\x1a\x29\xae\xf9\x1e\x2f\xb1\x05\x4c\x87\x73\x17\x36\x4e\xd5\xbe\xa6\x27\xa2\x60\x15\x76\xda\x37\x78\xd0\xcc\xe0\x1d\x6e\xd3\xe0\xe1\xa1\xbf\xb6\x99\xcd\x09\xe7\x19\xb1\x76\xf1\x5b\xeb\x16\xfd\x8a\x16\xa7\x6b\xa6\x5d\x49\xb5\x68\x35\xd8\xab\xfd\x81\x61\x7d\x70\x70\x19\x59\xcd\xe0\xe6\xba\x77\x6a\x9d\x8a\xf8\x57\x07\x11\x7f\x73\x92\xb8\x22\x02\x39\xb8\xbf\xa1\x2e\x09\x6f\x9f\x9b\x68\xe9\x05\xdf\xe1\xa2\xd0\x9e\xd1\x9d\x6a\xdd\x59\x3f\x9d\x83\x5c\xa3\x5a\x72\xb9\x99\x01\xa9\x8d\x9c\x43\x49\xee\xbb\x7c\x77\x33\x9d\xf6\xf5\xb6\xa5\x20\xc9\x38\xba\xd3\x45\xe1\x2f\x35\x6a\xa3\xbb\xb3\xc4\x4f\xb9\xbf\xf6\x48\xa1\x28\x34\xd2\x03\x6b\x58\x89\xd6\xb4\x8e\xaa\xe7\xfa\xce\x98\x27\x75\x5f\x4a\xd9\xa5\x90\xbe\x1a\x0d\xeb\x5e\xb6\x0b\x16\x89\x51\x7b\xba\xb3\xc4\xd0\x8f\x4a\x01\xca\x96\x78\x8f\x65\x00\x7f\xa2\xd9\xbd\x57\x88\xca\xd7\x17\x16\xb2\xe0\x5e\x93\xd8\xd0\x4f\x90\x6c\x41\x98\x11\x8d\x1f\x22\xde\x65\xfa\xbd\x78\xf7\xfa\xa9\xf2\x0b\x24\xca\x64\x48\xcc\x87\x28\xb0\xac\x05\xed\xed\xdf\x9d\x9d\x9f\xaa\x40\x2d\xd8\x1a\x95\x66\x66\xfb\xa1\x1a\x20\xdd\xab\xe0\xdf\x87\x2a\x24\xb1\x51\x4f\x63\xad\xff\xf2\x99\x82\xfb\xb7\x4a\x92\x9b\xc5\xbf\xcb\x0d\x50\x89\x1a\x4c\xc1\x34\xd8\xe4\xfa\x65\x12\x17\x37\x1d\x49\xb5\x78\x67\x27\x9c\x51\x61\xe9\x4a\x0b\x60\x1a\x54\x2d\x5c\xe6\x95\x02\x4c\x81\xc3\x72\xa4\x49\xd2\x11\xbc\x93\xb6\xa4\x5b\xa3\x30\x50\x12\xce\x72\x26\x6b\x0d\x24\x37\x52\x69\x58\x2a\x59\x02\xde\x17\xa4\xd6\xc6\x32\xb2\xc7\x07\x59\x13\xc6\x5d\x2c\x39\x97\x82\x54\x40\xf2\xbc\x2e\x6b\x5b\x92\x8a\x15\xa0\x90\xf5\xaa\x68\x74\x31\x12\x7c\x62\xe2\x52\xac\x3a\x7d\x74\x45\x4a\x20\xc6\x90\xfc\x4e\x5f\x42\x7b\x2a\x00\x51\x08\x86\x21\xb5\xab\x72\x59\x96\x52\xc0\x8d\xa2\x50\x11\x65\xb6\xa0\x87\xb5\x05\xc9\x73\x97\xe5\x22\x78\x2d\xb6\x52\x20\x14\x64\xed\x34\x84\x77\xfe\x3a\x71\x09\x5f\x4b\xb9\xe2\x78\x61\x15\xfc\x1b\xc9\x31\x93\xb2\x5b\x06\x25\xd9\xb6\x72\x9b\x6d\x6c\x98\x29\x98\xb7\x53\x85\xaa\xb4\x3c\x28\x70\x56\x32\xa3\xa3\x24\xae\xf6\x47\xeb\x3e\x49\xf3\xb0\x90\x8a\xfd\x6a\x2b\x1c\xde\x3f\x47\xcd\xc1\x29\xd3\x1e\x92\xce\xfd\x1c\x97\x66\x06\x2f\xfc\x21\x79\x08\xe8\xe6\x2a\x74\x0a\xcd\x2d\x4f\x77\xc5\xb4\x99\x67\x06\x37\xbe\xae\xf5\x15\x05\x35\x3d\x0d\xe8\x01\xe6\xbc\xd0\xdb\xdb\xea\xbe\xd3\xa3\x2b\x8e\xa7\x1d\x13\x0b\x85\xa1\x51\xd6\xac\x67\xcf\x92\xdc\x21\x10\x48\xc8\xc1\x55\xb9\x51\xda\x5d\xb4\x98\x6b\x14\xc4\x66\x83\x68\xbe\xb4\x31\x9c\x7e\xef\x19\x32\xb1\x3a\xbf\x9e\x7a\x68\xda\x07\xcb\xfe\xfc\x7a\xca\x84\x91\xe7\xd7\xd3\xe9\xfd\xf4\x03\xff\x9d\x5f\x4f\xa5\x38\xbf\x9e\x9a\x02\xcf\xaf\xa7\xe7\xd7\x37\x7d\x50\xfb\x91\xb6\xc4\xb4\x54\xa8\xad\xb4\x16\xeb\x01\x18\xa2\x56\x68\xd2\xe0\x7f\x49\x26\x6b\x33\xcb\x38\x11\x77\xc1\xc2\xa9\x6b\xcb\x0e\x87\x82\xd3\x85\x2a\x54\x44\x5b\x48\x58\x8d\x1d\x4a\x9a\xa6\x88\x86\xb1\xae\x95\x92\xb5\xb0\xe9\x11\xec\x9e\x5d\xa8\x8a\x91\x45\x99\x35\xcc\x24\x4a\x32\x15\x2f\xde\xc8\x6a\x1b\x3a\x26\x6e\xf9\x91\x19\x75\x5d\x55\x52\x99\xa8\x6f\x4e\x62\x2f\x44\x1c\x75\x7c\x3b\x7d\x79\xfb\xea\x49\xf5\xb5\x2d\xb7\xdd\x1e\x3a\x0d\x49\x26\xd7\x08\xbe\xb8\xcf\xe4\x3d\x10\x41\x61\xc9\x14\x02\xd9\x90\xed\x17\x49\x4c\xdd\x55\xec\xd3\x51\xbb\x72\x81\x16\x56\xbc\xd6\xb6\x16\x61\x36\x50\xff\x50\x10\xf6\x27\x01\x7c\xc7\x6b\x7d\x09\x55\x9d\x71\xa6\x0b\x20\x20\x70\x03\x89\x36\x4a\x8a\xd5\xc2\x8d\xe6\xf6\xaa\xea\x5e\xa1\x92\xda\x3c\x85\x06\x2c\x33\xa4\xf4\x04\x1e\x7e\x27\x1c\xac\x3c\xe7\xc2\x7f\xbe\xfb\x96\xcd\xe1\xf8\x87\x72\x59\x7b\x62\xff\x51\xfd\x75\x14\xbe\x9b\xcd\x26\x6a\x2d\xe9\x62\xb7\x40\x5e\xc5\x36\x8d\xd5\x82\x99\x6d\xec\x4f\x41\x29\xe2\x2f\x19\x4d\xaf\x6f\xaf\x5f\xbd\xba\x7e\xf1\x6f\xb7\x2f\x5f\x5e\xdf\xbe\x78\xf9\x58\x60\x77\xa0\xf8\xfd\x71\xed\xaf\x43\xdf\xc8\xd7\xb5\x29\xba\xbb\x90\xc7\x4b\x5b\x83\xdb\x4a\x8b\xda\xbb\xa4\x0a\x7e\x37\x86\x6a\x61\x0b\xca\x90\xf0\x93\xb5\xe0\x47\xa0\xc8\xc1\xe8\x09\xcd\x3e\x11\x5a\x2d\x7c\x2c\x52\x64\x6d\xec\x0e\xdb\xa6\x0c\x93\xa2\x83\xd3\x25\x68\x56\x56\x7c\x0b\xf9\xde\xeb\xa7\x71\xf5\xa8\x53\x7e\x13\x56\x43\xb7\x79\x90\xb9\x2a\xae\x94\x14\x6d\xf5\xa6\x6b\x9d\x63\xe5\xba\xf5\xb6\x22\xfa\xcb\xf6\x57\x22\x0c\x13\xd8\x56\x4e\x11\x7c\x2b\xf8\x16\x6a\x8d\xb0\x94\x0a\x28\x66\xf5\x6a\xe5\xca\x3d\x05\x95\x62\x6b\x62\xb0\x2d\x97\x74\x83\x8a\x0e\x14\xbd\x1b\xaa\x2d\x5d\x79\xaf\x92\xfc\xbb\xac\x21\x27\x02\x8c\x22\xf9\x9d\x8f\x94\x5a\x29\x1b\x29\x15\xfa\xdd\x74\x05\x5b\x86\x5c\x6e\x1c\x89\xdf\xf7\x92\x21\x77\xd5\x9b\x46\x84\x42\x6e\xa0\xac\x73\x17\x90\xb6\x3a\x73\x9b\xd8\x10\x66\xa0\x16\x86\x71\x6f\x4f\x53\x2b\x61\x6b\x3d\x1c\x14\x59\x47\x77\xf8\x04\xcb\xc5\xbb\x02\x4f\x94\xb6\xdd\xed\x1b\x14\xbe\xf1\xe4\x50\x29\x69\x30\xb7\x0e\x05\xb2\x22\x4c\x68\xeb\x11\x57\xc6\x61\xf9\x01\xb7\xf3\xee\xa9\x79\xd8\x77\x9a\xdd\x74\x1c\xc3\xd7\x5c\x66\x84\xc3\xda\x22\x3d\xe3\xb6\x2c\x97\x50\x48\xbb\xf5\x9e\xb5\xb4\x21\xa6\xd6\x20\x97\x6e\xd4\x6b\x6e\xd7\xaf\x89\xb2\x1e\xc4\xb2\x32\x90\x36\x7d\x52\x3b\xa6\x51\xad\x9b\xee\xaf\x7d\x35\x0c\xd5\x60\xbe\xb3\x7a\x0a\x3f\xfd\x3c\x7f\xd6\xa8\xf2\x57\x5c\x3a\x48\x58\x7c\xfb\x2d\x9b\x82\x18\xc8\x15\x12\x83\x1a\x72\x2e\x75\xad\xbc\x86\x54\xc9\x0a\xac\x96\x2d\xa7\x96\xb3\x9d\xa8\x9c\xb4\x96\xc9\xb8\x20\xba\x98\x34\x6d\x5e\x85\xce\x4b\xdd\x5c\x3b\x7e\x66\x51\x37\xb6\x0c\x58\x3a\x9d\x03\x4b\x5a\xbe\x11\x47\xb1\x32\xc5\x1c\xd8\xc5\x45\x47\x7c\xc6\x96\x30\x6e\x29\x7e\x62\x3f\x47\xe6\x3e\xb2\x52\x20\x4d\xa1\x2f\xcd\x09\x6c\xf8\xe8\x8a\xb3\x1c\xc7\xec\x12\xae\x26\xf3\x76\x36\x53\x48\xee\xda\xb7\xc6\x8f\xfe\x3f\xf7\x77\x37\x1f\x5a\xc6\x19\x7f\x60\x1b\xdf\xc3\xd1\x40\x60\xc5\xb4\x81\x5a\x71\x68\x62\xd8\xbb\xa0\x73\x88\xa3\xeb\x5b\xe5\x08\x97\xcd\x43\x83\xa9\x76\x0b\x9e\x4d\xa4\x51\xd0\xf1\x7f\xfc\xf0\xed\x37\x91\x36\x8a\x89\x15\x5b\x6e\xc7\x0f\xb5\xe2\x33\x78\x3e\x0e\xfe\xa5\x56\x3c\x98\xfc\x34\xfd\x39\x5a\x13\x5e\xe3\xa5\xf3\xf7\xcc\xfd\x3d\x92\x72\x09\xcd\xe3\x0c\x86\x02\x77\x93\xc9\xfc\x74\xbf\xab\xd7\x9e\x53\xa8\xd1\x8c\x2d\x61\x07\xfc\x43\x1b\x11\x28\xd1\x14\xd2\x85\xae\xc2\x5c\x0a\x81\xb9\x81\xba\x92\xa2\x31\x09\x70\xa9\xf5\x1e\x88\x2d\x45\x7a\x0c\x8a\x86\x3e\x75\xc9\xfa\xbf\x31\xfb\x41\xe6\x77\x68\xc6\xe3\xf1\x86\x09\x2a\x37\x11\x97\xfe\xa8\x8d\x6c\x90\xca\x5c\x72\x48\xd3\x14\x9a\x2c\x1a\x4c\xe0\x4b\x08\x36\xda\xe6\xd3\x00\x66\xf6\xd1\x3e\x4d\xe0\x02\x0e\x97\x17\x36\xdf\x5f\x40\x10\x93\x8a\x05\x13\x1f\x0e\xad\xe1\xa5\x28\x51\x6b\xb2\xc2\xbe\x82\xee\x86\xdb\x81\xcc\xee\xa3\xd4\x2b\x48\xc1\x39\xa8\x22\x4a\xa3\x27\x89\x28\x31\xa4\x45\x9b\xc5\xac\x23\x4b\x53\x10\x35\xe7\x7b\x90\xfa\xa0\x98\xb7\xf0\x1b\x90\x47\x3e\xd7\x7c\x91\xa6\x50\x0b\xea\x4c\x4c\xf7\x2b\xad\xf3\x7d\x33\x64\x12\xd9\xbc\xb0\x5f\x31\x99\xf7\xd1\x3c\xe0\x86\xf4\xb7\xd8\x21\x3d\xe4\x87\xf4\x11\x86\xae\xf7\xf4\x14\x3f\xdf\xab\xea\xb1\x73\x03\x8f\x70\x13\x75\x99\xa1\x7a\x8a\x9d\xef\x3d\x35\xec\x9c\xa9\xdf\x0a\xd3\x5b\x7b\x09\x57\xaf\x26\x8f\x70\x47\xa5\xe4\xa3\xcc\x85\x34\xdb\xf1\x03\x27\x5b\x5b\x33\xc1\xc8\xc8\xea\x8d\x6b\x15\x8d\x2e\x5d\xc6\x9d\x41\xc7\xe1\xd2\x7d\x04\x98\xc1\xc8\xbd\xd9\x79\x56\xa2\x5b\xf5\x72\x3a\x9d\x5e\x42\xfb\xf5\xec\x2f\xc4\x06\xa1\xaa\x71\xf7\x88\x3e\xba\xce\x73\x9b\xf7\x3f\x45\xa3\x86\x47\xa7\x53\xf3\xfe\x09\x5a\x75\xb9\x61\xa0\x16\xfc\xe9\x4f\x70\x34\x3b\x84\x71\x1c\xc3\x7f\x11\x75\xe7\x1a\x3b\x95\xc2\xb5\x6b\xfe\x74\xf4\x25\xd3\xda\x35\x55\x34\x50\x29\xb0\x59\xf3\x71\xc7\xfe\x91\x8e\x0d\x19\x2c\x60\x7a\xa8\xa0\x3d\x0e\x7b\x69\xe1\x44\xb6\xe8\xf1\x1d\x26\x82\xb3\x5d\x5f\xde\x60\x25\x2b\x11\xbe\x48\x21\x08\xfa\x8b\x8f\x28\x2c\x41\xc7\xec\x4c\xa3\x79\xe7\x7d\x31\x6e\xb2\xe3\xa9\xdc\x35\xb9\x84\x9b\xe9\x74\x3a\x39\x52\x62\xb7\x37\xef\xeb\xca\x96\x4d\x40\xc4\xd6\x1d\x89\x9d\x6d\x5d\xe1\x68\x4b\x20\x7b\xa4\x71\xc8\x25\xe7\xbe\x66\x69\x96\x5a\x03\x37\x4d\xb0\x14\xc2\xab\xf9\x89\x2c\xda\xb3\x64\x6f\x6b\x87\xee\x39\x61\xfb\x43\x17\x0d\x6d\x76\x40\x1c\x5e\x0d\x9c\x32\xf0\xd7\x69\xc7\x9c\x75\x7a\xb3\xbd\x45\x0f\xdc\xb5\xf7\xd7\xa1\xcd\x7a\xfa\x7b\x3e\x17\x57\x1f\xb8\x8d\x6e\xba\xaa\x75\x31\x3e\x50\x74\x32\x3f\xf6\xcd\x5b\x83\xca\x56\xc9\xd2\xa6\x2c\xeb\x0b\x7b\x15\x50\x78\xe4\x12\x57\xaa\x2b\x0c\x15\x0a\x8a\xaa\x2d\x29\x7c\x65\x6f\x0b\xc0\x81\xcb\xfc\xad\xb2\x0f\xa7\x8f\x0c\x18\x57\x92\x49\x81\x00\x00\x07\x41\xe0\x80\x3a\x40\xaa\x25\x46\x4e\x2a\x8d\x14\x52\xf0\x3f\x66\x18\x4f\xa2\x5a\xb0\xfb\xf1\x24\x6c\xde\x0f\x79\xb4\xf3\xf3\xee\x9a\xd8\xaa\x7d\x91\x42\x90\x18\x05\x8c\xa6\xa3\x00\x2e\x4e\x85\xa0\xcd\xba\xa3\xc5\x5e\x83\xfe\x52\x80\xc4\xd0\x85\xeb\x67\xfb\xfb\xda\x3f\x82\x8c\xe4\x77\x2b\x77\x11\x9a\xd9\x52\x6b\x7c\xc4\x96\xac\x89\x21\xca\x71\x9d\xcc\x61\x4f\xde\x5c\x14\x73\xeb\x9c\x39\xf8\x1b\xa9\x6b\x9b\x43\xf7\xa9\xc9\xbd\x65\x52\x51\x54\xa1\x22\x94\xd5\x7a\x06\x2f\xaa\xfb\xf9\x3f\xda\x4f\x71\xae\xb9\xff\xa4\xaa\x95\xc2\xc5\x91\x46\x4d\x93\xf8\x02\x82\x24\xb6\x04\xbf\xc5\xa6\xdb\x6c\xff\x47\x14\x70\xe2\x13\x06\x74\x3f\x71\x68\xc6\x4b\x46\x29\x47\xab\xf0\x9e\xbd\x0d\x46\xeb\xff\x7e\x48\x0d\x45\x42\xf3\xed\x62\xbf\x66\x07\xc8\x35\x3e\xb1\xa0\xfb\x0c\x32\xb2\x00\x08\xed\x96\x99\xb3\x79\x73\xd9\x76\xc3\x6a\xe4\x6c\xd1\xfc\x24\x86\xd6\xca\xd5\x5a\xe3\xb0\x01\xd8\x25\x8c\xb4\xad\xfd\xa8\x1e\x4d\xa2\xa2\x2e\x89\x60\xbf\xe2\xd8\xe6\xa5\x89\xb7\x95\xfb\xae\x12\x1c\x1f\xc9\x47\xca\xec\x3f\x78\x8c\xda\x1c\x37\x6a\x8c\x38\x6a\xbd\xfb\x62\x7f\xb7\x9f\xc1\x74\x3e\xfa\x48\x0b\x9d\x96\x12\x66\x44\x41\xff\x25\x6c\x93\x2f\x28\x69\xa5\xb7\x73\x19\x51\x23\xdf\xc9\x70\xf5\xb9\x90\x9b\x74\x74\x33\xed\x94\xf4\x8e\x76\x7e\x1e\x35\x58\x3b\x72\x86\xd5\xb2\x0d\xcd\x05\xdc\x4c\x3f\x87\xb6\xbe\x1b\x72\xb0\x03\xa3\x58\x85\x14\x48\x6e\xd8\x1a\xff\x1f\x36\xf2\x19\x8c\xfc\xd1\x2a\x5a\x1c\xb6\xc6\x73\x30\x1d\xe8\x6b\x67\x3b\xdb\xfe\xab\x8d\x37\x88\x9d\x85\x2f\x20\x38\xb9\x91\x47\x91\x78\x40\x78\x10\xda\x8f\xc7\xbd\xfb\x50\x18\x1c\xe6\x14\x5b\xed\x76\x1f\xb9\x27\x51\x61\x4a\x3e\x0e\x12\xe3\x7e\xec\x64\x75\xee\x38\x38\x06\x7e\x78\x58\xd2\xed\x86\x17\x19\x7b\x7f\xc7\x83\x7b\x16\xf4\x8a\x93\xee\x2e\xd6\x56\x22\xb0\xdb\xff\x26\x2c\x8e\xe1\x07\x43\x94\x01\x02\x3f\xbe\x85\xba\xa2\xc4\xf8\x4f\x72\x36\x3f\xfa\xae\x73\xfb\xa3\xb1\x8c\x28\x0d\x4b\xa9\x36\x44\xd1\xa6\x3f\x63\x0a\xdc\xba\x4f\x72\x6d\xe9\xa7\xd1\xbc\xb5\xa7\xd8\x9a\xf0\xf1\xd1\xbd\xef\xf9\x78\x14\xf5\x5d\x3e\x9a\x44\x48\xf2\xe2\x98\xd0\x65\xac\x4e\x6e\x0a\xdf\xb8\x2b\xc0\xf8\xf9\xd8\x14\x4c\x4f\x22\x62\x8c\x1a\x8f\x06\x60\x18\x4d\xac\x5f\xaf\x7a\x57\xb2\x6e\x79\x32\x08\xab\xa7\x78\xec\x8b\xe9\xae\x10\x68\xc9\x73\xad\xc7\x1e\x57\xa3\xcb\x1e\xef\x21\xac\x46\xe7\xa3\xce\x51\xfb\xf0\xde\xef\x23\x3d\xa9\xc9\x80\xf5\xc8\x46\xd9\xe8\x48\x3c\xa1\xf4\x8d\x8d\x9f\x71\x70\x22\xd2\x0f\xd1\x31\xe9\x8c\xed\xcf\xeb\x27\xad\xec\x7f\x5e\xf3\x88\x89\x19\x1d\x4d\x22\x5d\x67\xbe\x37\x31\x7e\xd9\x5d\xc0\x5a\x32\x07\xde\xc3\x54\x70\x54\x50\x58\x11\xc3\xa2\x22\x3c\x28\x42\x9e\xc8\x1a\x8d\x48\xbf\xab\xdd\xa5\x35\xf8\x74\xd2\xb5\xb6\xbe\xd2\xb6\xb8\xf2\xad\xff\x0d\x66\xda\x75\x12\xa0\xc1\xbb\xeb\xe6\xf8\xae\xcd\xeb\xef\xde\xf6\x3a\x37\x5d\x44\x8c\x1d\xf7\xee\xf7\x9c\xa7\xfa\x24\x27\x7f\x40\xba\xd9\x6c\x22\xff\x45\xcb\xb5\xf1\xbb\x46\x4a\x4c\x2a\x16\xbd\xd7\x01\x10\xbd\x15\x39\x50\x5c\xa2\x5a\xf4\xd8\x37\xdd\x95\x24\xf6\x3f\x6d\x4c\x62\xff\xeb\xed\xff\x0b\x00\x00\xff\xff\x56\xf8\xb5\xef\xce\x2d\x00\x00") +var _faucetHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x5a\x6d\x93\xdb\x36\x92\xfe\x3c\xfe\x15\x1d\x9e\xbd\x92\xce\x43\x52\x33\x63\x7b\x7d\x12\xa9\x94\xd7\x9b\xdd\xf3\xd5\x5d\x92\x4a\x9c\xba\xdb\xca\xa6\xae\x40\xb2\x25\xc2\x03\x02\x0c\x00\x4a\xa3\x4c\xe9\xbf\x5f\x35\x40\x52\xd4\xcb\x4c\xec\xb5\xaf\x6a\xfd\x61\x4c\x02\x8d\x46\xa3\xfb\x69\xf4\x0b\x95\x7c\xf5\xe7\xef\xde\xbe\xff\xdb\xf7\xdf\x40\x69\x2b\xb1\x78\x92\xd0\x7f\x20\x98\x5c\xa5\x01\xca\x60\xf1\xe4\x22\x29\x91\x15\x8b\x27\x17\x17\x49\x85\x96\x41\x5e\x32\x6d\xd0\xa6\x41\x63\x97\xe1\xeb\x60\x3f\x51\x5a\x5b\x87\xf8\x6b\xc3\xd7\x69\xf0\x3f\xe1\x4f\x6f\xc2\xb7\xaa\xaa\x99\xe5\x99\xc0\x00\x72\x25\x2d\x4a\x9b\x06\xef\xbe\x49\xb1\x58\xe1\x60\x9d\x64\x15\xa6\xc1\x9a\xe3\xa6\x56\xda\x0e\x48\x37\xbc\xb0\x65\x5a\xe0\x9a\xe7\x18\xba\x97\x4b\xe0\x92\x5b\xce\x44\x68\x72\x26\x30\xbd\x0a\x16\x4f\x88\x8f\xe5\x56\xe0\xe2\xfe\x3e\xfa\x16\xed\x46\xe9\xdb\xdd\x6e\x06\x6f\x1a\x5b\xa2\xb4\x3c\x67\x16\x0b\xf8\x0b\x6b\x72\xb4\x49\xec\x29\xdd\x22\xc1\xe5\x2d\x94\x1a\x97\x69\x40\xa2\x9b\x59\x1c\xe7\x85\xfc\x60\xa2\x5c\xa8\xa6\x58\x0a\xa6\x31\xca\x55\x15\xb3\x0f\xec\x2e\x16\x3c\x33\xb1\xdd\x70\x6b\x51\x87\x99\x52\xd6\x58\xcd\xea\xf8\x26\xba\x89\xfe\x18\xe7\xc6\xc4\xfd\x58\x54\x71\x19\xe5\xc6\x04\xa0\x51\xa4\x81\xb1\x5b\x81\xa6\x44\xb4\x01\xc4\x8b\x7f\x6c\xdf\xa5\x92\x36\x64\x1b\x34\xaa\xc2\xf8\x45\xf4\xc7\x68\xea\xb6\x1c\x0e\x3f\xbe\x2b\x6d\x6b\x72\xcd\x6b\x0b\x46\xe7\x1f\xbd\xef\x87\x5f\x1b\xd4\xdb\xf8\x26\xba\x8a\xae\xda\x17\xb7\xcf\x07\x13\x2c\x92\xd8\x33\x5c\x7c\x16\xef\x50\x2a\xbb\x8d\xaf\xa3\x17\xd1\x55\x5c\xb3\xfc\x96\xad\xb0\xe8\x76\xa2\xa9\xa8\x1b\xfc\x62\xfb\x3e\x64\xc3\x0f\xc7\x26\xfc\x12\x9b\x55\xaa\x42\x69\xa3\x0f\x26\xbe\x8e\xae\x5e\x47\xd3\x6e\xe0\x94\xbf\xdb\x80\x8c\x46\x5b\x5d\x44\x6b\xd4\x84\x5c\x11\xe6\x28\x2d\x6a\xb8\xa7\xd1\x8b\x8a\xcb\xb0\x44\xbe\x2a\xed\x0c\xae\xa6\xd3\x67\xf3\x73\xa3\xeb\xd2\x0f\x17\xdc\xd4\x82\x6d\x67\xb0\x14\x78\xe7\x87\x98\xe0\x2b\x19\x72\x8b\x95\x99\x81\xe7\xec\x26\x76\x6e\xcf\x5a\xab\x95\x46\x63\xda\xcd\x6a\x65\xb8\xe5\x4a\xce\x08\x51\xcc\xf2\x35\x9e\xa3\x35\x35\x93\x27\x0b\x58\x66\x94\x68\x2c\x1e\x09\x92\x09\x95\xdf\xfa\x31\xe7\xcd\xc3\x43\xe4\x4a\x28\x3d\x83\x4d\xc9\xdb\x65\xe0\x36\x82\x5a\x63\xcb\x1e\x6a\x56\x14\x5c\xae\x66\xf0\xaa\x6e\xcf\x03\x15\xd3\x2b\x2e\x67\x30\xdd\x2f\x49\xe2\x4e\x8d\x49\xec\x2f\xae\x27\x17\x49\xa6\x8a\xad\xb3\x61\xc1\xd7\x90\x0b\x66\x4c\x1a\x1c\xa9\xd8\x5d\x48\x07\x04\x74\x0f\x31\x2e\xbb\xa9\x83\x39\xad\x36\x01\xb8\x8d\xd2\xc0\x0b\x11\x66\xca\x5a\x55\xcd\xe0\x8a\xc4\x6b\x97\x1c\xf1\x13\xa1\x58\x85\x57\xd7\xdd\xe4\x45\x52\x5e\x75\x4c\x2c\xde\xd9\xd0\xd9\xa7\xb7\x4c\xb0\x48\x78\xb7\x76\xc9\x60\xc9\xc2\x8c\xd9\x32\x00\xa6\x39\x0b\x4b\x5e\x14\x28\xd3\xc0\xea\x06\x09\x47\x7c\x01\xc3\xeb\xef\x81\xdb\xaf\xbc\xea\xe4\x8a\x0b\xbe\x6e\x8f\x35\x78\x3c\x3a\xe1\xc3\x87\x78\x0d\xed\x83\x5a\x2e\x0d\xda\x70\x70\xa6\x01\x31\x97\x75\x63\xc3\x95\x56\x4d\xdd\xcf\x5f\x24\x6e\x14\x78\x91\x06\x8d\x16\x41\x7b\xfd\xbb\x47\xbb\xad\x5b\x55\x04\xfd\xc1\x95\xae\x42\xb2\x84\x56\x22\x80\x5a\xb0\x1c\x4b\x25\x0a\xd4\x69\xf0\xa3\xca\x39\x13\x20\xfd\x99\xe1\xa7\x1f\xfe\x13\x5a\x93\x71\xb9\x82\xad\x6a\x34\x7c\x63\x4b\xd4\xd8\x54\xc0\x8a\x82\xe0\x1a\x45\xd1\x40\x10\x87\xdd\x53\x51\xc3\xcc\xca\x3d\xd5\x45\x92\x35\xd6\xaa\x9e\x30\xb3\x12\x32\x2b\xc3\x02\x97\xac\x11\x16\x0a\xad\xea\x42\x6d\x64\x68\xd5\x6a\x45\x91\xce\x1f\xc2\x2f\x0a\xa0\x60\x96\xb5\x53\x69\xd0\xd1\x76\x36\x64\xa6\x56\x75\x53\xb7\x56\xf4\x83\x78\x57\x33\x59\x60\x41\x36\x17\x06\x83\xc5\x5f\xf9\x1a\xa1\x42\x7f\x96\x8b\x63\x48\xe4\x4c\xa3\x0d\x87\x4c\x4f\x80\x91\xc4\x5e\x18\x7f\x24\x68\xff\x25\x8d\xe8\x38\xf5\x47\xa8\x50\x36\x70\xf0\x16\x6a\xba\x57\x82\xc5\xfd\xbd\x66\x72\x85\xf0\x94\x17\x77\x97\xf0\x94\x55\xaa\x91\x16\x66\x29\x44\x6f\xdc\xa3\xd9\xed\x0e\xb8\x03\x24\x82\x2f\x12\xf6\x18\xbc\x41\xc9\x5c\xf0\xfc\x36\x0d\x2c\x47\x9d\xde\xdf\x13\xf3\xdd\x6e\x0e\xf7\xf7\x7c\x09\x4f\xa3\x1f\x30\x67\xb5\xcd\x4b\xb6\xdb\xad\x74\xf7\x1c\xe1\x1d\xe6\x8d\xc5\xf1\xe4\xfe\x1e\x85\xc1\xdd\xce\x34\x59\xc5\xed\xb8\x5b\x4e\xe3\xb2\xd8\xed\x48\xe6\x56\xce\xdd\x0e\x62\x62\x2a\x0b\xbc\x83\xa7\xd1\xf7\xa8\xb9\x2a\x0c\x78\xfa\x24\x66\x8b\x24\x16\x7c\xd1\xae\x3b\x54\x52\xdc\x88\x3d\x5e\x62\x02\x4c\x8f\x73\xe7\x36\x4e\xd4\xa1\xa4\x67\xbc\x60\x15\xf6\xd2\xb7\x78\x30\xdc\xe2\x2d\x6e\xd3\xe0\xfe\x7e\xb8\xb6\x9d\xcd\x99\x10\x19\x23\xbd\xf8\xa3\xf5\x8b\x7e\x43\xc2\xe9\x9a\x1b\x97\x52\x2d\x3a\x09\xf6\x62\x7f\xa4\x5b\x1f\x5d\x5c\x56\xd5\x33\xb8\xb9\x1e\xdc\x5a\xe7\x3c\xfe\xd5\x91\xc7\xdf\x9c\x25\xae\x99\x44\x01\xee\x6f\x68\x2a\x26\xba\xe7\xd6\x5b\x06\xce\x77\xbc\x28\xa4\x3b\xba\x17\xad\xbf\xeb\xa7\x73\x50\x6b\xd4\x4b\xa1\x36\x33\x60\x8d\x55\x73\xa8\xd8\x5d\x1f\xef\x6e\xa6\xd3\xa1\xdc\x94\x0a\xb2\x4c\xa0\xbb\x5d\x34\xfe\xda\xa0\xb1\xa6\xbf\x4b\xfc\x94\xfb\x4b\x57\x4a\x81\xd2\x60\x71\xa4\x0d\xda\x91\x54\xeb\xa8\x06\xa6\xef\x95\x79\x56\xf6\xa5\x52\x7d\x08\x19\x8a\xd1\xb2\x1e\x44\xbb\x60\x91\x58\xbd\xa7\xbb\x48\x6c\xf1\x49\x21\x40\x53\x8a\xf7\x50\x04\xf0\x37\x1a\x9d\xbd\x46\xd4\x3e\xbf\x20\xc8\x82\x7b\x4d\x62\x5b\x7c\xc6\xce\x04\xc2\x8c\x19\xfc\x98\xed\x5d\xa4\xdf\x6f\xef\x5e\x3f\x77\xff\x12\x99\xb6\x19\x32\xfb\x31\x02\x2c\x1b\x59\x0c\xce\xef\xee\xce\xcf\x15\xa0\x91\x7c\x8d\xda\x70\xbb\xfd\x58\x09\xb0\xd8\x8b\xe0\xdf\x0f\x45\x48\x62\xab\x1f\xc7\xda\xf0\xe5\x0b\x39\xf7\xef\xa5\x24\x37\x8b\x7f\x57\x1b\x28\x14\x1a\xb0\x25\x37\x40\xc1\xf5\xeb\x24\x2e\x6f\x7a\x92\x7a\xf1\x9e\x26\x9c\x52\x61\xe9\x52\x0b\xe0\x06\x74\x23\x5d\xe4\x55\x12\x6c\x89\x87\xe9\x48\x1b\xa4\x23\x78\xaf\x28\xa5\x5b\xa3\xb4\x50\x31\xc1\x73\xae\x1a\x03\x2c\xb7\x4a\x1b\x58\x6a\x55\x01\xde\x95\xac\x31\x96\x18\xd1\xf5\xc1\xd6\x8c\x0b\xe7\x4b\xce\xa4\xa0\x34\xb0\x3c\x6f\xaa\x86\x52\x52\xb9\x02\x94\xaa\x59\x95\xad\x2c\x56\x81\x0f\x4c\x42\xc9\x55\x2f\x8f\xa9\x59\x05\xcc\x5a\x96\xdf\x9a\x4b\xe8\x6e\x05\x60\x1a\xc1\x72\x2c\x68\x55\xae\xaa\x4a\x49\xb8\xd1\x05\xd4\x4c\xdb\x2d\x98\xc3\xdc\x82\xe5\xb9\x8b\x72\x11\xbc\x91\x5b\x25\x11\x4a\xb6\x76\x12\xc2\x7b\x5f\x4e\x90\x5c\x7f\x61\x39\x66\x4a\xf5\xd4\x50\xb1\x6d\xb7\x5d\x2b\xfd\x86\xdb\x92\x7b\xf5\xd4\xa8\x2b\x5a\x5a\x80\xe0\x15\xb7\x26\x4a\xe2\x7a\x7f\xa3\xee\x63\xb3\x08\x4b\xa5\xf9\x6f\x94\xd8\x88\xe1\xf5\x69\x8f\x2e\x97\xee\x6e\x74\x56\x17\xb8\xb4\x33\x78\xe1\xef\xc6\x63\x1c\xb7\x15\xd0\x39\x10\x77\x3c\x5d\x65\x49\x01\x67\x06\x37\x3e\x9d\xf5\x89\x44\x61\x07\x12\x14\x47\x50\xf3\x9b\xbe\x7e\x5d\xdf\xf5\x72\xf4\x39\xf1\xb4\x67\x42\x08\x38\x54\xca\x9a\xf7\x6a\xbc\x84\x8a\xdd\x22\x30\x48\xd8\x51\x85\xdc\x0a\xed\xea\x2b\xee\xfa\x03\xb1\xdd\x20\xda\xaf\xc9\x75\xd3\x1f\x3c\x43\x2e\x57\xcf\xae\xa7\x1e\x91\xf4\x40\xec\x9f\x5d\x4f\xb9\xb4\xea\xd9\xf5\x74\x7a\x37\xfd\xc8\x7f\xcf\xae\xa7\x4a\x3e\xbb\x9e\xda\x12\x9f\x5d\x4f\x9f\x5d\xdf\x0c\xb1\xec\x47\xba\xcc\x92\xa8\xd0\xd0\x6e\x1d\xc4\x03\xb0\x4c\xaf\xd0\xa6\xc1\xff\xb2\x4c\x35\x76\x96\x09\x26\x6f\x83\x85\x13\x97\xb2\x0d\x87\x82\xf3\xf9\x29\xd4\xcc\x10\x24\x48\x62\x87\x92\xb6\x17\x62\x60\x6c\x1a\xad\x55\x23\x29\x2a\x02\x9d\xd9\x79\xa8\x1c\x11\xca\x48\x31\x93\x28\xc9\x74\xbc\x78\xab\xea\x6d\xe8\x98\xb8\xe5\x27\x6a\x34\x4d\x5d\x2b\x6d\xa3\xa1\x3a\x19\xd5\x41\x02\x4d\xfc\x7a\xfa\xf2\xf5\xab\x47\xc5\x37\x94\x65\xbb\x33\xf4\x12\xb2\x4c\xad\x11\x7c\x4e\x9f\xa9\x3b\x60\xb2\x80\x25\xd7\x08\x6c\xc3\xb6\x5f\x25\x71\xe1\x2a\xb0\xcf\x47\xed\xb2\xf5\xae\x7f\x2a\xd8\x76\x2e\x7f\x09\x75\x93\x09\x6e\x4a\x60\x20\x71\x03\x89\xb1\x5a\xc9\xd5\xc2\x8d\xe6\x54\x92\xba\x57\xa8\x95\xb1\x8f\x99\x1f\xab\x0c\x8b\xe2\x0c\x00\xbe\x94\xfd\x37\x9b\x4d\xd4\x69\xd2\x19\xbf\x44\x51\xc7\x74\xfd\x35\x92\xdb\x6d\xec\xdd\x48\xc9\xf8\x6b\x5e\xa4\xd7\xaf\xaf\x5f\xbd\xba\x7e\xf1\x6f\xaf\x5f\xbe\xbc\x7e\xfd\xe2\xe5\x43\xc8\xa0\x43\x7d\x26\x30\x7c\x1a\xfd\xad\xa2\xaa\xb5\xcf\xa1\x3d\x5e\xba\xdc\x8d\x22\x74\x41\x35\x88\x0e\xfe\x61\x0c\x35\x92\x12\x91\x90\x89\xb3\x39\xc4\x27\xa0\xc8\xc1\xe8\x11\xc9\x3e\x13\x5a\x1d\x7c\x08\x29\xaa\xb1\x74\xc2\xae\x98\xe7\x4a\xf6\x70\xba\x04\xc3\xab\x5a\x6c\x21\xdf\x5b\xfd\x3c\xae\x1e\x34\xca\xef\xc2\xea\xd0\x6c\x1e\x64\x2e\xfa\x57\xaa\x40\x8a\xfa\xa6\x31\x39\xd6\xae\xcb\x4b\x91\xf4\x4f\xdb\xdf\x98\xb4\x5c\x62\x17\x71\x23\xf8\x4e\x8a\x2d\x34\x06\x61\xa9\x34\x14\x98\x35\xab\x95\x4b\x13\x34\xd4\x9a\xaf\x99\xc5\x2e\xcc\x9a\x16\x15\x3d\x28\x06\x95\x0d\xa5\x3c\x62\x90\x81\xfc\x4d\x35\x90\x33\x09\x56\xb3\xfc\xd6\x7b\x4a\xa3\x35\x79\x4a\x8d\xfe\x34\x7d\xa0\xcf\x50\xa8\x8d\x23\xf1\xe7\x5e\x72\x14\x2e\xea\x1b\x44\x28\xd5\x06\xaa\x26\x77\x0e\x49\x51\xdd\x1d\x62\xc3\xb8\x85\x46\x5a\x2e\xbc\x3e\x6d\xa3\x25\xe5\x08\x78\x10\xa5\x4f\x6a\xbf\x04\xab\xc5\xfb\x12\xcf\xa4\x44\x7d\xd5\x06\x1a\xdf\x7a\x72\xa8\xb5\xb2\x98\x93\x41\x81\xad\x18\x97\x86\x2c\xe2\xf2\x00\xac\x3e\xa2\xaa\xeb\x9f\xda\x87\x7d\x87\xd2\x4d\xc7\x31\xfc\x55\xa8\x8c\x09\x58\x13\xd2\x33\x41\xe9\x9c\x82\x52\xd1\xd1\x07\xda\x32\x96\xd9\xc6\x80\x5a\xba\x51\x2f\x39\xad\x5f\x33\x4d\x16\xc4\xaa\xb6\x90\xb6\xfd\x35\x1a\x33\xa8\xd7\x6d\xd7\x90\x5e\xa9\x72\x3f\x98\xef\xb5\x9e\xc2\xcf\xbf\xcc\x9f\xb4\xa2\xfc\x19\x97\x0e\x12\x84\x6f\x7f\x64\x5b\x32\x0b\xb9\x46\x66\xd1\x40\x2e\x94\x69\xb4\x97\xb0\xd0\xaa\x06\x92\xb2\xe3\xd4\x71\xa6\x89\xda\xed\xd6\x31\x19\x97\xcc\x94\x93\xb6\x3d\xa8\xd1\x59\xa9\x9f\xeb\xc6\x2f\x08\x75\x63\x62\xc0\xd3\xe9\x1c\x78\xd2\xf1\x8d\x04\xca\x95\x2d\xe7\xc0\x9f\x3f\xef\x89\x2f\xf8\x12\xc6\x1d\xc5\xcf\xfc\x97\xc8\xde\x45\xb4\x0b\xa4\x29\x0c\x77\x73\x1b\xb6\x7c\x4c\x2d\x78\x8e\x63\x7e\x09\x57\x93\x79\x37\x9b\x69\x64\xb7\xdd\x5b\x6b\x47\xff\x9f\xfb\xbb\x9b\x1f\x6a\xc6\x29\xff\x40\x37\xbe\xf6\x37\xc0\x60\xc5\x8d\x85\x46\x0b\x68\x7d\xd8\x9b\xa0\x37\x88\xa3\x1b\x6a\xe5\x04\x97\xed\x43\x8b\xa9\xee\x08\x9e\x4d\x64\x50\x16\xe3\xff\xf8\xf1\xbb\x6f\x23\x63\x35\x97\x2b\xbe\xdc\x8e\xef\x1b\x2d\x66\xf0\x74\x1c\xfc\x4b\xa3\x45\x30\xf9\x79\xfa\x4b\xb4\x66\xa2\xc1\x4b\x67\xef\x99\xfb\x7b\xb2\xcb\x25\xb4\x8f\x33\x38\xdc\x70\x37\x99\xcc\xcf\xf7\x49\x06\x6d\x1d\x8d\x06\xed\x98\x08\x7b\xe0\x1f\xeb\x88\x41\x85\xb6\x54\xce\x75\x35\xe6\x4a\x4a\xcc\x2d\x34\xb5\x92\xad\x4a\x40\x28\x63\xf6\x40\xec\x28\xd2\x53\x50\xb4\xf4\xa9\x0b\xd6\xff\x8d\xd9\x8f\x2a\xbf\x45\x3b\x1e\x8f\x37\x5c\x16\x6a\x13\x09\xe5\xaf\xda\x88\x9c\x54\xe5\x4a\x40\x9a\xa6\xd0\x46\xd1\x60\x02\x5f\x43\xb0\x31\x14\x4f\x03\x98\xd1\x23\x3d\x4d\xe0\x39\x1c\x2f\x2f\x29\xde\x3f\x87\x20\x66\x35\x0f\x26\xde\x1d\x3a\xc5\x2b\x59\xa1\x31\x6c\x85\x43\x01\x5d\x65\xd4\x83\x8c\xce\x51\x99\x15\xa4\xe0\x0c\x54\x33\x6d\xd0\x93\x44\x54\x8d\x77\x68\x23\xcc\x3a\xb2\x34\x05\xd9\x08\xb1\x07\xa9\x77\x8a\x79\x07\xbf\x03\xf2\xc8\xc7\x9a\xaf\xd2\x14\xa8\x34\x25\x15\x17\xfb\x95\x64\x7c\x5f\x44\x4f\x22\x8a\x0b\xfb\x15\x93\xf9\x10\xcd\x07\xdc\xb0\xf8\x3d\x76\x58\x1c\xf3\xc3\xe2\x01\x86\xae\x67\xf1\x18\x3f\xdf\xe3\x18\xb0\x73\x03\x0f\x70\x93\x4d\x95\xa1\x7e\x8c\x9d\xef\x59\xb4\xec\x9c\xaa\xdf\x49\x3b\x58\x7b\x09\x57\xaf\x26\x0f\x70\x47\xad\xd5\x83\xcc\xa5\xb2\xdb\xf1\xbd\x60\x5b\xca\x99\x60\x64\x55\xfd\xd6\xb5\x18\x46\x97\x2e\xe2\xce\xa0\xe7\x70\xe9\x9a\xc7\x33\x18\xb9\x37\x9a\xe7\x15\xba\x55\x2f\xa7\xd3\xe9\x25\x74\x5f\x5d\xfe\xc4\xc8\x09\x75\x83\xbb\x07\xe4\x31\x4d\x9e\x53\xdc\xff\x1c\x89\x5a\x1e\xbd\x4c\xed\xfb\x67\x48\xd5\xc7\x86\x03\xb1\xe0\x0f\x7f\x80\x93\xd9\x43\x18\xc7\x31\xfc\x17\xa3\x32\x5c\x08\xd7\x3d\x70\x4d\x83\x9e\xbe\xe2\xc6\xb8\x62\xdc\x40\xa1\x24\xb6\x6b\x3e\xed\xda\x3f\x91\xb1\x25\x83\x05\x4c\x8f\x05\xa4\xeb\x70\x10\x16\xce\x44\x8b\x01\xdf\xc3\x40\x70\xb1\x1b\xee\x77\xb0\x92\x57\x08\x5f\xa5\x10\x04\xc3\xc5\x27\x14\x44\xd0\x33\xbb\x30\x68\xdf\x7b\x5b\x8c\xdb\xe8\x78\x2e\x76\x4d\x2e\xe1\x66\x3a\x9d\x4e\x4e\x84\xd8\xed\xd5\xfb\xa6\xa6\xb4\x09\x98\xdc\xba\x2b\xb1\xd7\xad\x4b\x1c\x29\x05\xa2\x2b\x4d\x40\xae\x84\xf0\x39\x4b\xbb\x94\x14\xdc\x36\x4f\x52\x08\xaf\xe6\x67\xa2\xe8\x40\x93\x83\xa3\x1d\x9b\xe7\x8c\xee\x8f\x4d\x74\xa8\xb3\x23\xe2\xf0\xea\xc0\x28\x07\xf6\x3a\x6f\x98\x8b\x5e\x6e\xbe\xd7\xe8\x91\xb9\xf6\xf6\x3a\xd6\xd9\x40\x7e\xcf\xe7\xf9\xd5\x47\x1e\xa3\x9f\xae\x1b\x53\x8e\x8f\x04\x9d\xcc\x4f\x6d\xf3\xce\xa2\xa6\x2c\x59\x51\xc8\x22\x5b\x50\x29\xa0\xf1\xc4\x24\x2e\x55\xd7\x18\x6a\x94\x05\xea\x2e\xa5\xf0\x99\x3d\x25\x80\x07\x26\xf3\x55\xe5\x10\x4e\x9f\xe8\x30\x2e\x25\x53\x12\x01\x00\x8e\x9c\xc0\x01\xf5\x00\xa9\x44\x8c\x82\xd5\x06\x0b\x48\xc1\x7f\x04\x1f\x4f\xa2\x46\xf2\xbb\xf1\x24\x6c\xdf\x8f\x79\x74\xf3\xf3\xbe\x4c\xec\xc4\x7e\x9e\x42\x90\x58\x0d\xbc\x48\x47\x01\x3c\x3f\xe7\x82\x14\x75\x47\x8b\xbd\x04\xc3\xa5\x00\x89\x2d\x16\xae\x0f\xea\xeb\xb5\xbf\x07\x19\xcb\x6f\x57\xae\x10\x9a\x51\xaa\x35\x3e\x61\xcb\xd6\xcc\x32\xed\xb8\x4e\xe6\xb0\x27\x6f\x0b\xc5\x9c\x8c\x33\x07\x5f\x91\xba\x76\x2b\xf4\x9f\x28\xdc\x5b\xa6\x74\x81\x3a\xd4\xac\xe0\x8d\x99\xc1\x8b\xfa\x6e\xfe\xf7\xee\x13\x8e\x6b\x0a\x3f\x2a\x6a\xad\x71\x71\x22\x51\xdb\x65\x7c\x0e\x41\x12\x13\xc1\xef\xb1\xe9\x0f\x3b\xfc\xf8\x0e\x67\x5a\xdf\xd0\x7f\x1a\x6f\xc7\x2b\x5e\x14\x02\x49\xe0\x3d\x7b\x72\x46\xb2\xff\xd0\xa5\x0e\xb7\x84\xb6\xe7\xbd\x5f\xb3\x03\x14\x06\x1f\x59\xd0\xb7\xcf\x47\x04\x80\x90\x8e\xcc\x9d\xce\xdb\x62\xdb\x0d\xeb\x91\xd3\x45\xfb\x53\x8a\xa2\xd1\x2e\xd7\x1a\x87\x2d\xc0\x2e\x61\x64\x28\xf7\x2b\xcc\x68\x12\x95\x4d\xc5\x24\xff\x0d\xc7\x14\x97\x26\x5e\x57\xae\x1f\x1f\x9c\x5e\xc9\x27\xc2\xec\x1b\xe5\xa3\x2e\xc6\x8d\x5a\x25\x8e\x3a\xeb\xbe\xd8\xd7\xf6\x33\x98\xce\x47\x9f\xa8\xa1\xf3\xbb\x84\x19\xd3\x30\x7c\x09\xbb\xe0\x0b\x5a\xd1\xee\xdd\x5c\xc6\xf4\xc8\x77\x32\x5c\x7e\x2e\xd5\x26\x1d\xdd\x4c\x7b\x21\xbd\xa1\x9d\x9d\x47\x2d\xd6\x4e\x8c\x41\x52\x76\xae\xb9\x80\x9b\xe9\x97\x90\xd6\x77\x43\x8e\x4e\x60\x35\xaf\xb1\x00\x96\x5b\xbe\xc6\xff\x87\x83\x7c\x01\x25\x7f\xb2\x88\x84\xc3\x4e\x79\x0e\xa6\x07\xf2\xd2\x6c\xaf\xdb\x7f\x25\x7f\x83\xd8\x69\xf8\x39\x04\x67\x0f\xf2\x20\x12\x8f\x08\x8f\x5c\xfb\x61\xbf\x77\x1f\x98\x82\xe3\x98\x42\xd9\x6e\xff\x71\x74\x12\x95\xb6\x12\xe3\x20\xb1\xee\x47\x32\x24\x73\xcf\xc1\x31\xf0\xc3\x87\x29\xdd\xee\xb0\x90\xa1\xfa\x1d\x8f\xea\x2c\x18\x24\x27\x7d\x2d\xd6\x65\x22\xb0\xdb\xff\x96\x28\x8e\xe1\x47\xcb\xb4\x05\x06\x3f\xbd\x83\xa6\x2e\x98\xf5\x9f\x72\x28\x3e\xfa\x4f\x25\xdd\x8f\x8d\x32\xa6\x0d\x2c\x95\xde\x30\x5d\xb4\xfd\x19\x5b\xe2\xd6\x7d\xca\xe9\x52\x3f\x83\xf6\x1d\xdd\x62\x6b\x26\xc6\x27\x75\xdf\xd3\xf1\x28\x1a\x9a\x7c\x34\x89\x90\xe5\xe5\x29\xa1\x8b\x58\xfd\xbe\x29\x7c\xeb\x4a\x80\xf1\xd3\xb1\x2d\xb9\x99\x44\xcc\x5a\x3d\x1e\x1d\x80\x61\x34\x21\xbb\x5e\x0d\x4a\xb2\x7e\x79\x72\xe0\x56\x8f\xf1\xd8\x27\xd3\x7d\x22\xd0\x91\xe7\xc6\x8c\x3d\xae\x46\x97\x03\xde\x87\xb0\x1a\x3d\x1b\xf5\x86\xda\xbb\xf7\xfe\x1c\xe9\x59\x49\x0e\x58\x8f\xc8\xcb\x46\x27\xdb\xb3\xa2\x78\x4b\xfe\x33\x0e\xce\x78\xfa\x31\x3a\x26\xbd\xb2\xfd\x7d\xfd\xa8\x96\xfd\xcf\x32\x1e\x50\x31\x2f\x46\x93\xc8\x34\x99\xef\x4d\x8c\x5f\xf6\x05\x58\x47\xe6\xc0\x7b\x1c\x0a\x4e\x12\x0a\xda\xe2\x30\xa9\x08\x8f\x92\x90\x47\xa2\x46\xbb\xa5\x3f\xd5\xee\x92\x14\x3e\x9d\xf4\xad\xad\x6f\x0c\x25\x57\xbe\xf5\xbf\xc1\xcc\xb8\x4e\x02\xb4\x78\x77\xdd\x1c\xdf\xb5\x79\xf3\xfd\xbb\x41\xe7\xa6\xf7\x88\xb1\xe3\xde\xff\x0e\xf0\x5c\x9f\xe4\xec\x0f\x0f\x37\x9b\x4d\xb4\x52\x6a\x25\xfc\x4f\x0e\xfb\x46\x4a\xcc\x6a\x1e\x7d\x30\x01\x30\xb3\x95\x39\x14\xb8\x44\xbd\x18\xb0\x6f\xbb\x2b\x49\xec\x7f\x12\x97\xc4\xfe\x57\xbf\xff\x17\x00\x00\xff\xff\x31\x9f\x54\x5e\x06\x2c\x00\x00") func faucetHtmlBytes() ([]byte, error) { return bindataRead( @@ -83,7 +85,7 @@ func faucetHtml() (*asset, error) { } info := bindataFileInfo{name: "faucet.html", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdb, 0xa2, 0x98, 0x44, 0x4b, 0x50, 0xf8, 0xa1, 0xac, 0x4a, 0x76, 0x2e, 0xcc, 0x3d, 0xcb, 0x81, 0x9e, 0x2a, 0xaa, 0x87, 0xf5, 0x9d, 0x53, 0x4, 0x8a, 0xdd, 0x5a, 0xfe, 0xd3, 0xc3, 0xf, 0x11}} return a, nil } @@ -102,6 +104,12 @@ func Asset(name string) ([]byte, error) { return nil, fmt.Errorf("Asset %s not found", name) } +// AssetString returns the asset contents as a string (instead of a []byte). +func AssetString(name string) (string, error) { + data, err := Asset(name) + return string(data), err +} + // MustAsset is like Asset but panics when Asset would return an error. // It simplifies safe initialization of global variables. func MustAsset(name string) []byte { @@ -113,6 +121,12 @@ func MustAsset(name string) []byte { return a } +// MustAssetString is like AssetString but panics when Asset would return an +// error. It simplifies safe initialization of global variables. +func MustAssetString(name string) string { + return string(MustAsset(name)) +} + // 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. @@ -128,6 +142,33 @@ func AssetInfo(name string) (os.FileInfo, error) { return nil, fmt.Errorf("AssetInfo %s not found", name) } +// AssetDigest returns the digest of the file with the given name. It returns an +// error if the asset could not be found or the digest could not be loaded. +func AssetDigest(name string) ([sha256.Size]byte, error) { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; ok { + a, err := f() + if err != nil { + return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err) + } + return a.digest, nil + } + return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name) +} + +// Digests returns a map of all known files and their checksums. +func Digests() (map[string][sha256.Size]byte, error) { + mp := make(map[string][sha256.Size]byte, len(_bindata)) + for name := range _bindata { + a, err := _bindata[name]() + if err != nil { + return nil, err + } + mp[name] = a.digest + } + return mp, nil +} + // AssetNames returns the names of the assets. func AssetNames() []string { names := make([]string, 0, len(_bindata)) @@ -151,9 +192,9 @@ var _bindata = map[string]func() (*asset, error){ // 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 +// 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, and // AssetDir("") will return []string{"data"}. func AssetDir(name string) ([]string, error) { node := _bintree @@ -186,7 +227,7 @@ var _bintree = &bintree{nil, map[string]*bintree{ "faucet.html": {faucetHtml, map[string]*bintree{}}, }} -// RestoreAsset restores an asset under the given directory +// RestoreAsset restores an asset under the given directory. func RestoreAsset(dir, name string) error { data, err := Asset(name) if err != nil { @@ -207,7 +248,7 @@ func RestoreAsset(dir, name string) error { return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) } -// RestoreAssets restores an asset under the given directory recursively +// RestoreAssets restores an asset under the given directory recursively. func RestoreAssets(dir, name string) error { children, err := AssetDir(name) // File diff --git a/cmd/gnbai/accountcmd.go b/cmd/geth/accountcmd.go similarity index 84% rename from cmd/gnbai/accountcmd.go rename to cmd/geth/accountcmd.go index 9903704b23cb..bf0e58318763 100644 --- a/cmd/gnbai/accountcmd.go +++ b/cmd/geth/accountcmd.go @@ -20,12 +20,12 @@ import ( "fmt" "io/ioutil" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/console" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/console" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" "gopkg.in/urfave/cli.v1" ) @@ -116,11 +116,11 @@ Print a short summary of all accounts`, Creates a new account and prints the address. -The account is saved in encrypted format, you are prompted for a passphrase. +The account is saved in encrypted format, you are prompted for a password. -You must remember this passphrase to unlock your account in the future. +You must remember this password to unlock your account in the future. -For non-interactive use the passphrase can be specified with the --password flag: +For non-interactive use the password can be specified with the --password flag: Note, this is meant to be used for testing only, it is a bad idea to save your password to file or expose in any other way. @@ -142,12 +142,12 @@ password to file or expose in any other way. Update an existing account. The account is saved in the newest version in encrypted format, you are prompted -for a passphrase to unlock the account and another to save the updated file. +for a password to unlock the account and another to save the updated file. This same command can therefore be used to migrate an account of a deprecated format to the newest format or change the password for an account. -For non-interactive use the passphrase can be specified with the --password flag: +For non-interactive use the password can be specified with the --password flag: geth account update [options]
@@ -174,11 +174,11 @@ Prints the address. The keyfile is assumed to contain an unencrypted private key in hexadecimal format. -The account is saved in encrypted format, you are prompted for a passphrase. +The account is saved in encrypted format, you are prompted for a password. -You must remember this passphrase to unlock your account in the future. +You must remember this password to unlock your account in the future. -For non-interactive use the passphrase can be specified with the -password flag: +For non-interactive use the password can be specified with the -password flag: geth account import [options] @@ -205,7 +205,7 @@ func accountList(ctx *cli.Context) error { } // tries unlocking the specified account a few times. -func unlockAccount(ctx *cli.Context, ks *keystore.KeyStore, address string, i int, passwords []string) (accounts.Account, string) { +func unlockAccount(ks *keystore.KeyStore, address string, i int, passwords []string) (accounts.Account, string) { account, err := utils.MakeAddress(ks, address) if err != nil { utils.Fatalf("Could not list accounts: %v", err) @@ -247,17 +247,17 @@ func getPassPhrase(prompt string, confirmation bool, i int, passwords []string) if prompt != "" { fmt.Println(prompt) } - password, err := console.Stdin.PromptPassword("Passphrase: ") + password, err := console.Stdin.PromptPassword("Password: ") if err != nil { - utils.Fatalf("Failed to read passphrase: %v", err) + utils.Fatalf("Failed to read password: %v", err) } if confirmation { - confirm, err := console.Stdin.PromptPassword("Repeat passphrase: ") + confirm, err := console.Stdin.PromptPassword("Repeat password: ") if err != nil { - utils.Fatalf("Failed to read passphrase confirmation: %v", err) + utils.Fatalf("Failed to read password confirmation: %v", err) } if password != confirm { - utils.Fatalf("Passphrases do not match") + utils.Fatalf("Passwords do not match") } } return password @@ -268,7 +268,7 @@ func ambiguousAddrRecovery(ks *keystore.KeyStore, err *keystore.AmbiguousAddrErr for _, a := range err.Matches { fmt.Println(" ", a.URL) } - fmt.Println("Testing your passphrase against all of them...") + fmt.Println("Testing your password against all of them...") var match *accounts.Account for _, a := range err.Matches { if err := ks.Unlock(a, auth); err == nil { @@ -279,7 +279,7 @@ func ambiguousAddrRecovery(ks *keystore.KeyStore, err *keystore.AmbiguousAddrErr if match == nil { utils.Fatalf("None of the listed files could be unlocked.") } - fmt.Printf("Your passphrase unlocked %s\n", match.URL) + fmt.Printf("Your password unlocked %s\n", match.URL) fmt.Println("In order to avoid this warning, you need to remove the following duplicate key files:") for _, a := range err.Matches { if a != *match { @@ -307,12 +307,18 @@ func accountCreate(ctx *cli.Context) error { password := getPassPhrase("Your new account is locked with a password. Please give a password. Do not forget this password.", true, 0, utils.MakePasswordList(ctx)) - address, err := keystore.StoreKey(keydir, password, scryptN, scryptP) + account, err := keystore.StoreKey(keydir, password, scryptN, scryptP) if err != nil { utils.Fatalf("Failed to create account: %v", err) } - fmt.Printf("Address: {%x}\n", address) + fmt.Printf("\nYour new key was generated\n\n") + fmt.Printf("Public address of the key: %s\n", account.Address.Hex()) + fmt.Printf("Path of the secret key file: %s\n\n", account.URL.Path) + fmt.Printf("- You can share your public address with anyone. Others need it to interact with you.\n") + fmt.Printf("- You must NEVER share the secret key with anyone! The key controls access to your funds!\n") + fmt.Printf("- You must BACKUP your key file! Without the key, it's impossible to access account funds!\n") + fmt.Printf("- You must REMEMBER your password! Without the password, it's impossible to decrypt the key!\n\n") return nil } @@ -326,7 +332,7 @@ func accountUpdate(ctx *cli.Context) error { ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) for _, addr := range ctx.Args() { - account, oldPassword := unlockAccount(ctx, ks, addr, 0, nil) + account, oldPassword := unlockAccount(ks, addr, 0, nil) newPassword := getPassPhrase("Please give a new password. Do not forget this password.", true, 0, nil) if err := ks.Update(account, oldPassword, newPassword); err != nil { utils.Fatalf("Could not update the account: %v", err) diff --git a/cmd/gnbai/accountcmd_test.go b/cmd/geth/accountcmd_test.go similarity index 86% rename from cmd/gnbai/accountcmd_test.go rename to cmd/geth/accountcmd_test.go index 3ea22ccfab60..186db3c6bea1 100644 --- a/cmd/gnbai/accountcmd_test.go +++ b/cmd/geth/accountcmd_test.go @@ -72,10 +72,20 @@ func TestAccountNew(t *testing.T) { geth.Expect(` Your new account is locked with a password. Please give a password. Do not forget this password. !! Unsupported terminal, password will be echoed. -Passphrase: {{.InputLine "foobar"}} -Repeat passphrase: {{.InputLine "foobar"}} +Password: {{.InputLine "foobar"}} +Repeat password: {{.InputLine "foobar"}} + +Your new key was generated +`) + geth.ExpectRegexp(` +Public address of the key: 0x[0-9a-fA-F]{40} +Path of the secret key file: .*UTC--.+--[0-9a-f]{40} + +- You can share your public address with anyone. Others need it to interact with you. +- You must NEVER share the secret key with anyone! The key controls access to your funds! +- You must BACKUP your key file! Without the key, it's impossible to access account funds! +- You must REMEMBER your password! Without the password, it's impossible to decrypt the key! `) - geth.ExpectRegexp(`Address: \{[0-9a-f]{40}\}\n`) } func TestAccountNewBadRepeat(t *testing.T) { @@ -84,9 +94,9 @@ func TestAccountNewBadRepeat(t *testing.T) { geth.Expect(` Your new account is locked with a password. Please give a password. Do not forget this password. !! Unsupported terminal, password will be echoed. -Passphrase: {{.InputLine "something"}} -Repeat passphrase: {{.InputLine "something else"}} -Fatal: Passphrases do not match +Password: {{.InputLine "something"}} +Repeat password: {{.InputLine "something else"}} +Fatal: Passwords do not match `) } @@ -99,10 +109,10 @@ func TestAccountUpdate(t *testing.T) { geth.Expect(` Unlocking account f466859ead1932d743d622cb74fc058882e8648a | Attempt 1/3 !! Unsupported terminal, password will be echoed. -Passphrase: {{.InputLine "foobar"}} +Password: {{.InputLine "foobar"}} Please give a new password. Do not forget this password. -Passphrase: {{.InputLine "foobar2"}} -Repeat passphrase: {{.InputLine "foobar2"}} +Password: {{.InputLine "foobar2"}} +Repeat password: {{.InputLine "foobar2"}} `) } @@ -111,7 +121,7 @@ func TestWalletImport(t *testing.T) { defer geth.ExpectExit() geth.Expect(` !! Unsupported terminal, password will be echoed. -Passphrase: {{.InputLine "foo"}} +Password: {{.InputLine "foo"}} Address: {d4584b5f6229b7be90727b0fc8c6b91bb427821f} `) @@ -126,8 +136,8 @@ func TestWalletImportBadPassword(t *testing.T) { defer geth.ExpectExit() geth.Expect(` !! Unsupported terminal, password will be echoed. -Passphrase: {{.InputLine "wrong"}} -Fatal: could not decrypt key with given passphrase +Password: {{.InputLine "wrong"}} +Fatal: could not decrypt key with given password `) } @@ -140,7 +150,7 @@ func TestUnlockFlag(t *testing.T) { geth.Expect(` Unlocking account f466859ead1932d743d622cb74fc058882e8648a | Attempt 1/3 !! Unsupported terminal, password will be echoed. -Passphrase: {{.InputLine "foobar"}} +Password: {{.InputLine "foobar"}} `) geth.ExpectExit() @@ -164,12 +174,12 @@ func TestUnlockFlagWrongPassword(t *testing.T) { geth.Expect(` Unlocking account f466859ead1932d743d622cb74fc058882e8648a | Attempt 1/3 !! Unsupported terminal, password will be echoed. -Passphrase: {{.InputLine "wrong1"}} +Password: {{.InputLine "wrong1"}} Unlocking account f466859ead1932d743d622cb74fc058882e8648a | Attempt 2/3 -Passphrase: {{.InputLine "wrong2"}} +Password: {{.InputLine "wrong2"}} Unlocking account f466859ead1932d743d622cb74fc058882e8648a | Attempt 3/3 -Passphrase: {{.InputLine "wrong3"}} -Fatal: Failed to unlock account f466859ead1932d743d622cb74fc058882e8648a (could not decrypt key with given passphrase) +Password: {{.InputLine "wrong3"}} +Fatal: Failed to unlock account f466859ead1932d743d622cb74fc058882e8648a (could not decrypt key with given password) `) } @@ -183,9 +193,9 @@ func TestUnlockFlagMultiIndex(t *testing.T) { geth.Expect(` Unlocking account 0 | Attempt 1/3 !! Unsupported terminal, password will be echoed. -Passphrase: {{.InputLine "foobar"}} +Password: {{.InputLine "foobar"}} Unlocking account 2 | Attempt 1/3 -Passphrase: {{.InputLine "foobar"}} +Password: {{.InputLine "foobar"}} `) geth.ExpectExit() @@ -228,7 +238,7 @@ func TestUnlockFlagPasswordFileWrongPassword(t *testing.T) { "--password", "testdata/wrong-passwords.txt", "--unlock", "0,2") defer geth.ExpectExit() geth.Expect(` -Fatal: Failed to unlock account 0 (could not decrypt key with given passphrase) +Fatal: Failed to unlock account 0 (could not decrypt key with given password) `) } @@ -248,12 +258,12 @@ func TestUnlockFlagAmbiguous(t *testing.T) { geth.Expect(` Unlocking account f466859ead1932d743d622cb74fc058882e8648a | Attempt 1/3 !! Unsupported terminal, password will be echoed. -Passphrase: {{.InputLine "foobar"}} +Password: {{.InputLine "foobar"}} Multiple key files exist for address f466859ead1932d743d622cb74fc058882e8648a: keystore://{{keypath "1"}} keystore://{{keypath "2"}} -Testing your passphrase against all of them... -Your passphrase unlocked keystore://{{keypath "1"}} +Testing your password against all of them... +Your password unlocked keystore://{{keypath "1"}} In order to avoid this warning, you need to remove the following duplicate key files: keystore://{{keypath "2"}} `) @@ -285,11 +295,11 @@ func TestUnlockFlagAmbiguousWrongPassword(t *testing.T) { geth.Expect(` Unlocking account f466859ead1932d743d622cb74fc058882e8648a | Attempt 1/3 !! Unsupported terminal, password will be echoed. -Passphrase: {{.InputLine "wrong"}} +Password: {{.InputLine "wrong"}} Multiple key files exist for address f466859ead1932d743d622cb74fc058882e8648a: keystore://{{keypath "1"}} keystore://{{keypath "2"}} -Testing your passphrase against all of them... +Testing your password against all of them... Fatal: None of the listed files could be unlocked. `) geth.ExpectExit() diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go new file mode 100644 index 000000000000..49e6a0594933 --- /dev/null +++ b/cmd/geth/chaincmd.go @@ -0,0 +1,559 @@ +// Copyright 2015 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" + "fmt" + "os" + "path/filepath" + "runtime" + "strconv" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/console" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/trie" + "gopkg.in/urfave/cli.v1" +) + +var ( + initCommand = cli.Command{ + Action: utils.MigrateFlags(initGenesis), + Name: "init", + Usage: "Bootstrap and initialize a new genesis block", + ArgsUsage: "", + Flags: []cli.Flag{ + utils.DataDirFlag, + }, + Category: "BLOCKCHAIN COMMANDS", + Description: ` +The init command initializes a new genesis block and definition for the network. +This is a destructive action and changes the network in which you will be +participating. + +It expects the genesis file as argument.`, + } + importCommand = cli.Command{ + Action: utils.MigrateFlags(importChain), + Name: "import", + Usage: "Import a blockchain file", + ArgsUsage: " ( ... ) ", + Flags: []cli.Flag{ + utils.DataDirFlag, + utils.CacheFlag, + utils.SyncModeFlag, + utils.GCModeFlag, + utils.CacheDatabaseFlag, + utils.CacheGCFlag, + }, + Category: "BLOCKCHAIN COMMANDS", + Description: ` +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, +processing will proceed even if an individual RLP-file import failure occurs.`, + } + exportCommand = cli.Command{ + Action: utils.MigrateFlags(exportChain), + Name: "export", + Usage: "Export blockchain into file", + ArgsUsage: " [ ]", + Flags: []cli.Flag{ + utils.DataDirFlag, + utils.CacheFlag, + utils.SyncModeFlag, + }, + Category: "BLOCKCHAIN COMMANDS", + Description: ` +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. If the file ends with .gz, the output will +be gzipped.`, + } + importPreimagesCommand = cli.Command{ + Action: utils.MigrateFlags(importPreimages), + Name: "import-preimages", + Usage: "Import the preimage database from an RLP stream", + ArgsUsage: "", + Flags: []cli.Flag{ + utils.DataDirFlag, + utils.CacheFlag, + utils.SyncModeFlag, + }, + Category: "BLOCKCHAIN COMMANDS", + Description: ` + The import-preimages command imports hash preimages from an RLP encoded stream.`, + } + exportPreimagesCommand = cli.Command{ + Action: utils.MigrateFlags(exportPreimages), + Name: "export-preimages", + Usage: "Export the preimage database into an RLP stream", + ArgsUsage: "", + Flags: []cli.Flag{ + utils.DataDirFlag, + utils.CacheFlag, + utils.SyncModeFlag, + }, + Category: "BLOCKCHAIN COMMANDS", + Description: ` +The export-preimages command export hash preimages to an RLP encoded stream`, + } + 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, + utils.RinkebyFlag, + }, + Category: "BLOCKCHAIN COMMANDS", + Description: ` +The first argument must be the directory containing the blockchain to download from`, + } + removedbCommand = cli.Command{ + Action: utils.MigrateFlags(removeDB), + Name: "removedb", + Usage: "Remove blockchain and state databases", + ArgsUsage: " ", + Flags: []cli.Flag{ + utils.DataDirFlag, + }, + Category: "BLOCKCHAIN COMMANDS", + Description: ` +Remove blockchain and state databases`, + } + dumpCommand = cli.Command{ + Action: utils.MigrateFlags(dump), + Name: "dump", + Usage: "Dump a specific block from storage", + ArgsUsage: "[ | ]...", + Flags: []cli.Flag{ + utils.DataDirFlag, + utils.CacheFlag, + utils.SyncModeFlag, + utils.IterativeOutputFlag, + utils.ExcludeCodeFlag, + utils.ExcludeStorageFlag, + utils.IncludeIncompletesFlag, + }, + Category: "BLOCKCHAIN COMMANDS", + Description: ` +The arguments are interpreted as block numbers or hashes. +Use "ethereum dump 0" to dump the genesis block.`, + } + inspectCommand = cli.Command{ + Action: utils.MigrateFlags(inspect), + Name: "inspect", + Usage: "Inspect the storage size for each type of data in the database", + ArgsUsage: " ", + Flags: []cli.Flag{ + utils.DataDirFlag, + utils.AncientFlag, + utils.CacheFlag, + utils.TestnetFlag, + utils.RinkebyFlag, + utils.GoerliFlag, + utils.SyncModeFlag, + }, + Category: "BLOCKCHAIN COMMANDS", + } +) + +// initGenesis will initialise the given JSON format genesis file and writes it as +// the zero'd block (i.e. genesis) or will fail hard if it can't succeed. +func initGenesis(ctx *cli.Context) error { + // Make sure we have a valid genesis JSON + genesisPath := ctx.Args().First() + if len(genesisPath) == 0 { + utils.Fatalf("Must supply path to genesis JSON file") + } + file, err := os.Open(genesisPath) + if err != nil { + utils.Fatalf("Failed to read genesis file: %v", err) + } + defer file.Close() + + genesis := new(core.Genesis) + if err := json.NewDecoder(file).Decode(genesis); err != nil { + utils.Fatalf("invalid genesis file: %v", err) + } + // Open an initialise both full and light databases + stack := makeFullNode(ctx) + defer stack.Close() + + for _, name := range []string{"chaindata", "lightchaindata"} { + chaindb, err := stack.OpenDatabase(name, 0, 0, "") + if err != nil { + utils.Fatalf("Failed to open database: %v", err) + } + _, hash, err := core.SetupGenesisBlock(chaindb, genesis) + if err != nil { + utils.Fatalf("Failed to write genesis block: %v", err) + } + chaindb.Close() + log.Info("Successfully wrote genesis state", "database", name, "hash", hash) + } + return nil +} + +func importChain(ctx *cli.Context) error { + if len(ctx.Args()) < 1 { + utils.Fatalf("This command requires an argument.") + } + stack := makeFullNode(ctx) + defer stack.Close() + + chain, db := utils.MakeChain(ctx, stack) + defer db.Close() + + // Start periodically gathering memory profiles + var peakMemAlloc, peakMemSys uint64 + go func() { + stats := new(runtime.MemStats) + for { + runtime.ReadMemStats(stats) + if atomic.LoadUint64(&peakMemAlloc) < stats.Alloc { + atomic.StoreUint64(&peakMemAlloc, stats.Alloc) + } + if atomic.LoadUint64(&peakMemSys) < stats.Sys { + atomic.StoreUint64(&peakMemSys, stats.Sys) + } + time.Sleep(5 * time.Second) + } + }() + // Import the chain + start := time.Now() + + if len(ctx.Args()) == 1 { + if err := utils.ImportChain(chain, ctx.Args().First()); err != nil { + log.Error("Import error", "err", err) + } + } else { + for _, arg := range ctx.Args() { + if err := utils.ImportChain(chain, arg); err != nil { + log.Error("Import error", "file", arg, "err", err) + } + } + } + chain.Stop() + fmt.Printf("Import done in %v.\n\n", time.Since(start)) + + // Output pre-compaction stats mostly to see the import trashing + stats, err := db.Stat("leveldb.stats") + if err != nil { + utils.Fatalf("Failed to read database stats: %v", err) + } + fmt.Println(stats) + + ioStats, err := db.Stat("leveldb.iostats") + if err != nil { + utils.Fatalf("Failed to read database iostats: %v", err) + } + fmt.Println(ioStats) + + // Print the memory statistics used by the importing + mem := new(runtime.MemStats) + runtime.ReadMemStats(mem) + + fmt.Printf("Object memory: %.3f MB current, %.3f MB peak\n", float64(mem.Alloc)/1024/1024, float64(atomic.LoadUint64(&peakMemAlloc))/1024/1024) + fmt.Printf("System memory: %.3f MB current, %.3f MB peak\n", float64(mem.Sys)/1024/1024, float64(atomic.LoadUint64(&peakMemSys))/1024/1024) + fmt.Printf("Allocations: %.3f million\n", float64(mem.Mallocs)/1000000) + fmt.Printf("GC pause: %v\n\n", time.Duration(mem.PauseTotalNs)) + + if ctx.GlobalBool(utils.NoCompactionFlag.Name) { + return nil + } + + // Compact the entire database to more accurately measure disk io and print the stats + start = time.Now() + fmt.Println("Compacting entire database...") + if err = db.Compact(nil, nil); err != nil { + utils.Fatalf("Compaction failed: %v", err) + } + fmt.Printf("Compaction done in %v.\n\n", time.Since(start)) + + stats, err = db.Stat("leveldb.stats") + if err != nil { + utils.Fatalf("Failed to read database stats: %v", err) + } + fmt.Println(stats) + + ioStats, err = db.Stat("leveldb.iostats") + if err != nil { + utils.Fatalf("Failed to read database iostats: %v", err) + } + fmt.Println(ioStats) + return nil +} + +func exportChain(ctx *cli.Context) error { + if len(ctx.Args()) < 1 { + utils.Fatalf("This command requires an argument.") + } + stack := makeFullNode(ctx) + defer stack.Close() + + chain, _ := utils.MakeChain(ctx, stack) + start := time.Now() + + var err error + fp := ctx.Args().First() + if len(ctx.Args()) < 3 { + err = utils.ExportChain(chain, fp) + } else { + // This can be improved to allow for numbers larger than 9223372036854775807 + first, ferr := strconv.ParseInt(ctx.Args().Get(1), 10, 64) + last, lerr := strconv.ParseInt(ctx.Args().Get(2), 10, 64) + if ferr != nil || lerr != nil { + utils.Fatalf("Export error in parsing parameters: block number not an integer\n") + } + if first < 0 || last < 0 { + utils.Fatalf("Export error: block number must be greater than 0\n") + } + err = utils.ExportAppendChain(chain, fp, uint64(first), uint64(last)) + } + + if err != nil { + utils.Fatalf("Export error: %v\n", err) + } + fmt.Printf("Export done in %v\n", time.Since(start)) + return nil +} + +// importPreimages imports preimage data from the specified file. +func importPreimages(ctx *cli.Context) error { + if len(ctx.Args()) < 1 { + utils.Fatalf("This command requires an argument.") + } + stack := makeFullNode(ctx) + defer stack.Close() + + db := utils.MakeChainDatabase(ctx, stack) + start := time.Now() + + if err := utils.ImportPreimages(db, ctx.Args().First()); err != nil { + utils.Fatalf("Import error: %v\n", err) + } + fmt.Printf("Import done in %v\n", time.Since(start)) + return nil +} + +// exportPreimages dumps the preimage data to specified json file in streaming way. +func exportPreimages(ctx *cli.Context) error { + if len(ctx.Args()) < 1 { + utils.Fatalf("This command requires an argument.") + } + stack := makeFullNode(ctx) + defer stack.Close() + + db := utils.MakeChainDatabase(ctx, stack) + start := time.Now() + + if err := utils.ExportPreimages(db, ctx.Args().First()); err != nil { + utils.Fatalf("Export error: %v\n", err) + } + fmt.Printf("Export done in %v\n", time.Since(start)) + 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") + } + if len(ctx.Args()) < 2 { + utils.Fatalf("Source ancient chain directory path argument missing") + } + // Initialize a new chain for the running node to sync into + stack := makeFullNode(ctx) + defer stack.Close() + + chain, chainDb := utils.MakeChain(ctx, stack) + syncMode := *utils.GlobalTextMarshaler(ctx, utils.SyncModeFlag.Name).(*downloader.SyncMode) + + var syncBloom *trie.SyncBloom + if syncMode == downloader.FastSync { + syncBloom = trie.NewSyncBloom(uint64(ctx.GlobalInt(utils.CacheFlag.Name)/2), chainDb) + } + dl := downloader.New(0, chainDb, syncBloom, new(event.TypeMux), chain, nil, nil) + + // Create a source peer to satisfy downloader requests from + db, err := rawdb.NewLevelDBDatabaseWithFreezer(ctx.Args().First(), ctx.GlobalInt(utils.CacheFlag.Name)/2, 256, ctx.Args().Get(1), "") + 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 = db.Compact(nil, nil); 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, config := makeConfigNode(ctx) + + // Remove the full node state database + path := stack.ResolvePath("chaindata") + if common.FileExist(path) { + confirmAndRemoveDB(path, "full node state database") + } else { + log.Info("Full node state database missing", "path", path) + } + // Remove the full node ancient database + path = config.Eth.DatabaseFreezer + switch { + case path == "": + path = filepath.Join(stack.ResolvePath("chaindata"), "ancient") + case !filepath.IsAbs(path): + path = config.Node.ResolvePath(path) + } + if common.FileExist(path) { + confirmAndRemoveDB(path, "full node ancient database") + } else { + log.Info("Full node ancient database missing", "path", path) + } + // Remove the light node database + path = stack.ResolvePath("lightchaindata") + if common.FileExist(path) { + confirmAndRemoveDB(path, "light node database") + } else { + log.Info("Light node database missing", "path", path) + } + return nil +} + +// confirmAndRemoveDB prompts the user for a last confirmation and removes the +// folder if accepted. +func confirmAndRemoveDB(database string, kind string) { + confirm, err := console.Stdin.PromptConfirm(fmt.Sprintf("Remove %s (%s)?", kind, database)) + switch { + case err != nil: + utils.Fatalf("%v", err) + case !confirm: + log.Info("Database deletion skipped", "path", database) + default: + start := time.Now() + filepath.Walk(database, func(path string, info os.FileInfo, err error) error { + // If we're at the top level folder, recurse into + if path == database { + return nil + } + // Delete all the files, but not subfolders + if !info.IsDir() { + os.Remove(path) + return nil + } + return filepath.SkipDir + }) + log.Info("Database successfully deleted", "path", database, "elapsed", common.PrettyDuration(time.Since(start))) + } +} + +func dump(ctx *cli.Context) error { + stack := makeFullNode(ctx) + defer stack.Close() + + chain, chainDb := utils.MakeChain(ctx, stack) + defer chainDb.Close() + for _, arg := range ctx.Args() { + var block *types.Block + if hashish(arg) { + block = chain.GetBlockByHash(common.HexToHash(arg)) + } else { + num, _ := strconv.Atoi(arg) + block = chain.GetBlockByNumber(uint64(num)) + } + if block == nil { + fmt.Println("{}") + utils.Fatalf("block not found") + } else { + state, err := state.New(block.Root(), state.NewDatabase(chainDb)) + if err != nil { + utils.Fatalf("could not create new state: %v", err) + } + excludeCode := ctx.Bool(utils.ExcludeCodeFlag.Name) + excludeStorage := ctx.Bool(utils.ExcludeStorageFlag.Name) + includeMissing := ctx.Bool(utils.IncludeIncompletesFlag.Name) + if ctx.Bool(utils.IterativeOutputFlag.Name) { + state.IterativeDump(excludeCode, excludeStorage, !includeMissing, json.NewEncoder(os.Stdout)) + } else { + if includeMissing { + fmt.Printf("If you want to include accounts with missing preimages, you need iterative output, since" + + " otherwise the accounts will overwrite each other in the resulting mapping.") + } + fmt.Printf("%v %s\n", includeMissing, state.Dump(excludeCode, excludeStorage, false)) + } + } + } + return nil +} + +func inspect(ctx *cli.Context) error { + node, _ := makeConfigNode(ctx) + defer node.Close() + + _, chainDb := utils.MakeChain(ctx, node) + defer chainDb.Close() + + return rawdb.InspectDatabase(chainDb) +} + +// hashish returns true for strings that look like hashes. +func hashish(x string) bool { + _, err := strconv.Atoi(x) + return err != nil +} diff --git a/cmd/geth/config.go b/cmd/geth/config.go new file mode 100644 index 000000000000..b450dd9c8bd4 --- /dev/null +++ b/cmd/geth/config.go @@ -0,0 +1,211 @@ +// 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 ( + "bufio" + "errors" + "fmt" + "math/big" + "os" + "reflect" + "unicode" + + cli "gopkg.in/urfave/cli.v1" + + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/params" + whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" + "github.com/naoina/toml" +) + +var ( + dumpConfigCommand = cli.Command{ + Action: utils.MigrateFlags(dumpConfig), + Name: "dumpconfig", + Usage: "Show configuration values", + ArgsUsage: "", + Flags: append(append(nodeFlags, rpcFlags...), whisperFlags...), + Category: "MISCELLANEOUS COMMANDS", + Description: `The dumpconfig command shows configuration values.`, + } + + configFileFlag = cli.StringFlag{ + Name: "config", + Usage: "TOML configuration file", + } +) + +// These settings ensure that TOML keys use the same names as Go struct fields. +var tomlSettings = toml.Config{ + NormFieldName: func(rt reflect.Type, key string) string { + return key + }, + FieldToKey: func(rt reflect.Type, field string) string { + return field + }, + MissingField: func(rt reflect.Type, field string) error { + link := "" + if unicode.IsUpper(rune(rt.Name()[0])) && rt.PkgPath() != "main" { + link = fmt.Sprintf(", see https://godoc.org/%s#%s for available fields", rt.PkgPath(), rt.Name()) + } + return fmt.Errorf("field '%s' is not defined in %s%s", field, rt.String(), link) + }, +} + +type ethstatsConfig struct { + URL string `toml:",omitempty"` +} + +type gethConfig struct { + Eth eth.Config + Shh whisper.Config + Node node.Config + Ethstats ethstatsConfig +} + +func loadConfig(file string, cfg *gethConfig) error { + f, err := os.Open(file) + if err != nil { + return err + } + defer f.Close() + + err = tomlSettings.NewDecoder(bufio.NewReader(f)).Decode(cfg) + // Add file name to errors that have a line number. + if _, ok := err.(*toml.LineError); ok { + err = errors.New(file + ", " + err.Error()) + } + return err +} + +func defaultNodeConfig() node.Config { + cfg := node.DefaultConfig + cfg.Name = clientIdentifier + cfg.Version = params.VersionWithCommit(gitCommit, gitDate) + cfg.HTTPModules = append(cfg.HTTPModules, "eth", "shh") + cfg.WSModules = append(cfg.WSModules, "eth", "shh") + cfg.IPCPath = "geth.ipc" + return cfg +} + +func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) { + // Load defaults. + cfg := gethConfig{ + Eth: eth.DefaultConfig, + Shh: whisper.DefaultConfig, + Node: defaultNodeConfig(), + } + + // Load config file. + if file := ctx.GlobalString(configFileFlag.Name); file != "" { + if err := loadConfig(file, &cfg); err != nil { + utils.Fatalf("%v", err) + } + } + + // Apply flags. + utils.SetNodeConfig(ctx, &cfg.Node) + stack, err := node.New(&cfg.Node) + if err != nil { + utils.Fatalf("Failed to create the protocol stack: %v", err) + } + utils.SetEthConfig(ctx, stack, &cfg.Eth) + if ctx.GlobalIsSet(utils.EthStatsURLFlag.Name) { + cfg.Ethstats.URL = ctx.GlobalString(utils.EthStatsURLFlag.Name) + } + utils.SetShhConfig(ctx, stack, &cfg.Shh) + + return stack, cfg +} + +// enableWhisper returns true in case one of the whisper flags is set. +func enableWhisper(ctx *cli.Context) bool { + for _, flag := range whisperFlags { + if ctx.GlobalIsSet(flag.GetName()) { + return true + } + } + return false +} + +func makeFullNode(ctx *cli.Context) *node.Node { + stack, cfg := makeConfigNode(ctx) + if ctx.GlobalIsSet(utils.OverrideIstanbulFlag.Name) { + cfg.Eth.OverrideIstanbul = new(big.Int).SetUint64(ctx.GlobalUint64(utils.OverrideIstanbulFlag.Name)) + } + if ctx.GlobalIsSet(utils.OverrideMuirGlacierFlag.Name) { + cfg.Eth.OverrideMuirGlacier = new(big.Int).SetUint64(ctx.GlobalUint64(utils.OverrideMuirGlacierFlag.Name)) + } + utils.RegisterEthService(stack, &cfg.Eth) + + // Whisper must be explicitly enabled by specifying at least 1 whisper flag or in dev mode + shhEnabled := enableWhisper(ctx) + shhAutoEnabled := !ctx.GlobalIsSet(utils.WhisperEnabledFlag.Name) && ctx.GlobalIsSet(utils.DeveloperFlag.Name) + if shhEnabled || shhAutoEnabled { + if ctx.GlobalIsSet(utils.WhisperMaxMessageSizeFlag.Name) { + cfg.Shh.MaxMessageSize = uint32(ctx.Int(utils.WhisperMaxMessageSizeFlag.Name)) + } + if ctx.GlobalIsSet(utils.WhisperMinPOWFlag.Name) { + cfg.Shh.MinimumAcceptedPOW = ctx.Float64(utils.WhisperMinPOWFlag.Name) + } + if ctx.GlobalIsSet(utils.WhisperRestrictConnectionBetweenLightClientsFlag.Name) { + cfg.Shh.RestrictConnectionBetweenLightClients = true + } + utils.RegisterShhService(stack, &cfg.Shh) + } + // Configure GraphQL if requested + if ctx.GlobalIsSet(utils.GraphQLEnabledFlag.Name) { + utils.RegisterGraphQLService(stack, cfg.Node.GraphQLEndpoint(), cfg.Node.GraphQLCors, cfg.Node.GraphQLVirtualHosts, cfg.Node.HTTPTimeouts) + } + // Add the Ethereum Stats daemon if requested. + if cfg.Ethstats.URL != "" { + utils.RegisterEthStatsService(stack, cfg.Ethstats.URL) + } + return stack +} + +// dumpConfig is the dumpconfig command. +func dumpConfig(ctx *cli.Context) error { + _, cfg := makeConfigNode(ctx) + comment := "" + + if cfg.Eth.Genesis != nil { + cfg.Eth.Genesis = nil + comment += "# Note: this config doesn't contain the genesis block.\n\n" + } + + out, err := tomlSettings.Marshal(&cfg) + if err != nil { + return err + } + + dump := os.Stdout + if ctx.NArg() > 0 { + dump, err = os.OpenFile(ctx.Args().Get(0), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) + if err != nil { + return err + } + defer dump.Close() + } + dump.WriteString(comment) + dump.Write(out) + + return nil +} diff --git a/cmd/gnbai/consolecmd.go b/cmd/geth/consolecmd.go similarity index 93% rename from cmd/gnbai/consolecmd.go rename to cmd/geth/consolecmd.go index 677acd3a62b3..83614f60e18e 100644 --- a/cmd/gnbai/consolecmd.go +++ b/cmd/geth/consolecmd.go @@ -24,10 +24,10 @@ import ( "strings" "syscall" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/console" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/console" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/rpc" "gopkg.in/urfave/cli.v1" ) @@ -43,7 +43,7 @@ var ( Description: ` The Geth console is an interactive shell for the JavaScript runtime environment which exposes a node admin interface as well as the Ðapp JavaScript API. -See https://github.com/nebulaai/nbai-node/wiki/JavaScript-Console.`, +See https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console.`, } attachCommand = cli.Command{ @@ -56,7 +56,7 @@ See https://github.com/nebulaai/nbai-node/wiki/JavaScript-Console.`, Description: ` The Geth console is an interactive shell for the JavaScript runtime environment which exposes a node admin interface as well as the Ðapp JavaScript API. -See https://github.com/nebulaai/nbai-node/wiki/JavaScript-Console. +See https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console. This command allows to open a console on a running geth node.`, } @@ -69,7 +69,7 @@ This command allows to open a console on a running geth node.`, Category: "CONSOLE COMMANDS", Description: ` The JavaScript VM exposes a node admin interface as well as the Ðapp -JavaScript API. See https://github.com/nebulaai/nbai-node/wiki/JavaScript-Console`, +JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/JavaScript-Console`, } ) @@ -77,9 +77,10 @@ JavaScript API. See https://github.com/nebulaai/nbai-node/wiki/JavaScript-Consol // same time. func localConsole(ctx *cli.Context) error { // Create and start the node based on the CLI flags + prepare(ctx) node := makeFullNode(ctx) startNode(ctx, node) - defer node.Stop() + defer node.Close() // Attach to the newly started node and start the JavaScript console client, err := node.Attach() @@ -180,7 +181,7 @@ func ephemeralConsole(ctx *cli.Context) error { // Create and start the node based on the CLI flags node := makeFullNode(ctx) startNode(ctx, node) - defer node.Stop() + defer node.Close() // Attach to the newly started node and start the JavaScript console client, err := node.Attach() diff --git a/cmd/gnbai/consolecmd_test.go b/cmd/geth/consolecmd_test.go similarity index 92% rename from cmd/gnbai/consolecmd_test.go rename to cmd/geth/consolecmd_test.go index 6c13d90b5346..33c83b7ede82 100644 --- a/cmd/gnbai/consolecmd_test.go +++ b/cmd/geth/consolecmd_test.go @@ -27,7 +27,7 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/params" ) const ( @@ -50,7 +50,7 @@ func TestConsoleWelcome(t *testing.T) { geth.SetTemplateFunc("goos", func() string { return runtime.GOOS }) geth.SetTemplateFunc("goarch", func() string { return runtime.GOARCH }) geth.SetTemplateFunc("gover", runtime.Version) - geth.SetTemplateFunc("gethver", func() string { return params.VersionWithMeta }) + geth.SetTemplateFunc("gethver", func() string { return params.VersionWithCommit("", "") }) geth.SetTemplateFunc("niltime", func() string { return time.Unix(0, 0).Format(time.RFC1123) }) geth.SetTemplateFunc("apis", func() string { return ipcAPIs }) @@ -87,7 +87,7 @@ func TestIPCAttachWelcome(t *testing.T) { "--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none", "--etherbase", coinbase, "--shh", "--ipcpath", ipc) - time.Sleep(2 * time.Second) // Simple way to wait for the RPC endpoint to open + waitForEndpoint(t, ipc, 3*time.Second) testAttachWelcome(t, geth, "ipc:"+ipc, ipcAPIs) geth.Interrupt() @@ -101,8 +101,9 @@ func TestHTTPAttachWelcome(t *testing.T) { "--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none", "--etherbase", coinbase, "--rpc", "--rpcport", port) - time.Sleep(2 * time.Second) // Simple way to wait for the RPC endpoint to open - testAttachWelcome(t, geth, "http://localhost:"+port, httpAPIs) + endpoint := "http://127.0.0.1:" + port + waitForEndpoint(t, endpoint, 3*time.Second) + testAttachWelcome(t, geth, endpoint, httpAPIs) geth.Interrupt() geth.ExpectExit() @@ -116,8 +117,9 @@ func TestWSAttachWelcome(t *testing.T) { "--port", "0", "--maxpeers", "0", "--nodiscover", "--nat", "none", "--etherbase", coinbase, "--ws", "--wsport", port) - time.Sleep(2 * time.Second) // Simple way to wait for the RPC endpoint to open - testAttachWelcome(t, geth, "ws://localhost:"+port, httpAPIs) + endpoint := "ws://127.0.0.1:" + port + waitForEndpoint(t, endpoint, 3*time.Second) + testAttachWelcome(t, geth, endpoint, httpAPIs) geth.Interrupt() geth.ExpectExit() @@ -133,7 +135,7 @@ func testAttachWelcome(t *testing.T, geth *testgeth, endpoint, apis string) { attach.SetTemplateFunc("goos", func() string { return runtime.GOOS }) attach.SetTemplateFunc("goarch", func() string { return runtime.GOARCH }) attach.SetTemplateFunc("gover", runtime.Version) - attach.SetTemplateFunc("gethver", func() string { return params.VersionWithMeta }) + attach.SetTemplateFunc("gethver", func() string { return params.VersionWithCommit("", "") }) attach.SetTemplateFunc("etherbase", func() string { return geth.Etherbase }) attach.SetTemplateFunc("niltime", func() string { return time.Unix(0, 0).Format(time.RFC1123) }) attach.SetTemplateFunc("ipc", func() bool { return strings.HasPrefix(endpoint, "ipc") }) diff --git a/cmd/gnbai/dao_test.go b/cmd/geth/dao_test.go similarity index 96% rename from cmd/gnbai/dao_test.go rename to cmd/geth/dao_test.go index cb16cf5e5882..cb06038ec8bc 100644 --- a/cmd/gnbai/dao_test.go +++ b/cmd/geth/dao_test.go @@ -23,10 +23,9 @@ import ( "path/filepath" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/params" ) // Genesis block for nodes which don't care about the DAO fork (i.e. not configured) @@ -121,7 +120,7 @@ func testDAOForkBlockNewChain(t *testing.T, test int, genesis string, expectBloc } // Retrieve the DAO config flag from the database path := filepath.Join(datadir, "geth", "chaindata") - db, err := ethdb.NewLDBDatabase(path, 0, 0) + db, err := rawdb.NewLevelDBDatabase(path, 0, 0, "") if err != nil { t.Fatalf("test %d: failed to open test database: %v", test, err) } diff --git a/cmd/gnbai/genesis_test.go b/cmd/geth/genesis_test.go similarity index 100% rename from cmd/gnbai/genesis_test.go rename to cmd/geth/genesis_test.go diff --git a/cmd/geth/main.go b/cmd/geth/main.go new file mode 100644 index 000000000000..80ab0a44d86c --- /dev/null +++ b/cmd/geth/main.go @@ -0,0 +1,460 @@ +// Copyright 2014 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 . + +// geth is the official command-line client for Ethereum. +package main + +import ( + "fmt" + "math" + "os" + "runtime" + godebug "runtime/debug" + "sort" + "strconv" + "strings" + "time" + + "github.com/elastic/gosigar" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/console" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/internal/debug" + "github.com/ethereum/go-ethereum/les" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/node" + cli "gopkg.in/urfave/cli.v1" +) + +const ( + clientIdentifier = "geth" // Client identifier to advertise over the network +) + +var ( + // Git SHA1 commit hash of the release (set via linker flags) + gitCommit = "" + gitDate = "" + // The app that holds all commands and flags. + app = utils.NewApp(gitCommit, gitDate, "the go-ethereum command line interface") + // flags that configure the node + nodeFlags = []cli.Flag{ + utils.IdentityFlag, + utils.UnlockedAccountFlag, + utils.PasswordFileFlag, + utils.BootnodesFlag, + utils.BootnodesV4Flag, + utils.BootnodesV5Flag, + utils.DataDirFlag, + utils.AncientFlag, + utils.KeyStoreDirFlag, + utils.ExternalSignerFlag, + utils.NoUSBFlag, + utils.SmartCardDaemonPathFlag, + utils.OverrideIstanbulFlag, + utils.OverrideMuirGlacierFlag, + utils.EthashCacheDirFlag, + utils.EthashCachesInMemoryFlag, + utils.EthashCachesOnDiskFlag, + utils.EthashDatasetDirFlag, + utils.EthashDatasetsInMemoryFlag, + utils.EthashDatasetsOnDiskFlag, + utils.TxPoolLocalsFlag, + utils.TxPoolNoLocalsFlag, + utils.TxPoolJournalFlag, + utils.TxPoolRejournalFlag, + utils.TxPoolPriceLimitFlag, + utils.TxPoolPriceBumpFlag, + utils.TxPoolAccountSlotsFlag, + utils.TxPoolGlobalSlotsFlag, + utils.TxPoolAccountQueueFlag, + utils.TxPoolGlobalQueueFlag, + utils.TxPoolLifetimeFlag, + utils.SyncModeFlag, + utils.ExitWhenSyncedFlag, + utils.GCModeFlag, + utils.LightServeFlag, + utils.LightLegacyServFlag, + utils.LightIngressFlag, + utils.LightEgressFlag, + utils.LightMaxPeersFlag, + utils.LightLegacyPeersFlag, + utils.LightKDFFlag, + utils.UltraLightServersFlag, + utils.UltraLightFractionFlag, + utils.UltraLightOnlyAnnounceFlag, + utils.WhitelistFlag, + utils.CacheFlag, + utils.CacheDatabaseFlag, + utils.CacheTrieFlag, + utils.CacheGCFlag, + utils.CacheNoPrefetchFlag, + utils.ListenPortFlag, + utils.MaxPeersFlag, + utils.MaxPendingPeersFlag, + utils.MiningEnabledFlag, + utils.MinerThreadsFlag, + utils.MinerLegacyThreadsFlag, + utils.MinerNotifyFlag, + utils.MinerGasTargetFlag, + utils.MinerLegacyGasTargetFlag, + utils.MinerGasLimitFlag, + utils.MinerGasPriceFlag, + utils.MinerLegacyGasPriceFlag, + utils.MinerEtherbaseFlag, + utils.MinerLegacyEtherbaseFlag, + utils.MinerExtraDataFlag, + utils.MinerLegacyExtraDataFlag, + utils.MinerRecommitIntervalFlag, + utils.MinerNoVerfiyFlag, + utils.NATFlag, + utils.NoDiscoverFlag, + utils.DiscoveryV5Flag, + utils.NetrestrictFlag, + utils.NodeKeyFileFlag, + utils.NodeKeyHexFlag, + utils.DeveloperFlag, + utils.DeveloperPeriodFlag, + utils.TestnetFlag, + utils.RinkebyFlag, + utils.GoerliFlag, + utils.VMEnableDebugFlag, + utils.NetworkIdFlag, + utils.EthStatsURLFlag, + utils.FakePoWFlag, + utils.NoCompactionFlag, + utils.GpoBlocksFlag, + utils.GpoPercentileFlag, + utils.EWASMInterpreterFlag, + utils.EVMInterpreterFlag, + configFileFlag, + } + + rpcFlags = []cli.Flag{ + utils.RPCEnabledFlag, + utils.RPCListenAddrFlag, + utils.RPCPortFlag, + utils.RPCCORSDomainFlag, + utils.RPCVirtualHostsFlag, + utils.GraphQLEnabledFlag, + utils.GraphQLListenAddrFlag, + utils.GraphQLPortFlag, + utils.GraphQLCORSDomainFlag, + utils.GraphQLVirtualHostsFlag, + utils.RPCApiFlag, + utils.WSEnabledFlag, + utils.WSListenAddrFlag, + utils.WSPortFlag, + utils.WSApiFlag, + utils.WSAllowedOriginsFlag, + utils.IPCDisabledFlag, + utils.IPCPathFlag, + utils.InsecureUnlockAllowedFlag, + utils.RPCGlobalGasCap, + } + + whisperFlags = []cli.Flag{ + utils.WhisperEnabledFlag, + utils.WhisperMaxMessageSizeFlag, + utils.WhisperMinPOWFlag, + utils.WhisperRestrictConnectionBetweenLightClientsFlag, + } + + metricsFlags = []cli.Flag{ + utils.MetricsEnabledFlag, + utils.MetricsEnabledExpensiveFlag, + utils.MetricsEnableInfluxDBFlag, + utils.MetricsInfluxDBEndpointFlag, + utils.MetricsInfluxDBDatabaseFlag, + utils.MetricsInfluxDBUsernameFlag, + utils.MetricsInfluxDBPasswordFlag, + utils.MetricsInfluxDBTagsFlag, + } +) + +func init() { + // Initialize the CLI app and start Geth + app.Action = geth + app.HideVersion = true // we have a command to print the version + app.Copyright = "Copyright 2013-2019 The go-ethereum Authors" + app.Commands = []cli.Command{ + // See chaincmd.go: + initCommand, + importCommand, + exportCommand, + importPreimagesCommand, + exportPreimagesCommand, + copydbCommand, + removedbCommand, + dumpCommand, + inspectCommand, + // See accountcmd.go: + accountCommand, + walletCommand, + // See consolecmd.go: + consoleCommand, + attachCommand, + javascriptCommand, + // See misccmd.go: + makecacheCommand, + makedagCommand, + versionCommand, + licenseCommand, + // See config.go + dumpConfigCommand, + // See retesteth.go + retestethCommand, + } + sort.Sort(cli.CommandsByName(app.Commands)) + + app.Flags = append(app.Flags, nodeFlags...) + app.Flags = append(app.Flags, rpcFlags...) + app.Flags = append(app.Flags, consoleFlags...) + app.Flags = append(app.Flags, debug.Flags...) + app.Flags = append(app.Flags, whisperFlags...) + app.Flags = append(app.Flags, metricsFlags...) + + app.Before = func(ctx *cli.Context) error { + return debug.Setup(ctx, "") + } + app.After = func(ctx *cli.Context) error { + debug.Exit() + console.Stdin.Close() // Resets terminal mode. + return nil + } +} + +func main() { + if err := app.Run(os.Args); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} + +// prepare manipulates memory cache allowance and setups metric system. +// This function should be called before launching devp2p stack. +func prepare(ctx *cli.Context) { + // If we're a full node on mainnet without --cache specified, bump default cache allowance + if ctx.GlobalString(utils.SyncModeFlag.Name) != "light" && !ctx.GlobalIsSet(utils.CacheFlag.Name) && !ctx.GlobalIsSet(utils.NetworkIdFlag.Name) { + // Make sure we're not on any supported preconfigured testnet either + if !ctx.GlobalIsSet(utils.TestnetFlag.Name) && !ctx.GlobalIsSet(utils.RinkebyFlag.Name) && !ctx.GlobalIsSet(utils.GoerliFlag.Name) && !ctx.GlobalIsSet(utils.DeveloperFlag.Name) { + // Nope, we're really on mainnet. Bump that cache up! + log.Info("Bumping default cache on mainnet", "provided", ctx.GlobalInt(utils.CacheFlag.Name), "updated", 4096) + ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(4096)) + } + } + // If we're running a light client on any network, drop the cache to some meaningfully low amount + if ctx.GlobalString(utils.SyncModeFlag.Name) == "light" && !ctx.GlobalIsSet(utils.CacheFlag.Name) { + log.Info("Dropping default light client cache", "provided", ctx.GlobalInt(utils.CacheFlag.Name), "updated", 128) + ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(128)) + } + // Cap the cache allowance and tune the garbage collector + var mem gosigar.Mem + // Workaround until OpenBSD support lands into gosigar + // Check https://github.com/elastic/gosigar#supported-platforms + if runtime.GOOS != "openbsd" { + if err := mem.Get(); err == nil { + allowance := int(mem.Total / 1024 / 1024 / 3) + if cache := ctx.GlobalInt(utils.CacheFlag.Name); cache > allowance { + log.Warn("Sanitizing cache to Go's GC limits", "provided", cache, "updated", allowance) + ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(allowance)) + } + } + } + // Ensure Go's GC ignores the database cache for trigger percentage + cache := ctx.GlobalInt(utils.CacheFlag.Name) + gogc := math.Max(20, math.Min(100, 100/(float64(cache)/1024))) + + log.Debug("Sanitizing Go's GC trigger", "percent", int(gogc)) + godebug.SetGCPercent(int(gogc)) + + // Start metrics export if enabled + utils.SetupMetrics(ctx) + + // Start system runtime metrics collection + go metrics.CollectProcessMetrics(3 * time.Second) +} + +// geth is the main entry point into the system if no special subcommand is ran. +// It creates a default node based on the command line arguments and runs it in +// blocking mode, waiting for it to be shut down. +func geth(ctx *cli.Context) error { + if args := ctx.Args(); len(args) > 0 { + return fmt.Errorf("invalid command: %q", args[0]) + } + prepare(ctx) + node := makeFullNode(ctx) + defer node.Close() + startNode(ctx, node) + node.Wait() + return nil +} + +// startNode boots up the system node and all registered protocols, after which +// it unlocks any requested accounts, and starts the RPC/IPC interfaces and the +// miner. +func startNode(ctx *cli.Context, stack *node.Node) { + debug.Memsize.Add("node", stack) + + // Start up the node itself + utils.StartNode(stack) + + // Unlock any account specifically requested + unlockAccounts(ctx, stack) + + // Register wallet event handlers to open and auto-derive wallets + events := make(chan accounts.WalletEvent, 16) + stack.AccountManager().Subscribe(events) + + // Create a client to interact with local geth node. + rpcClient, err := stack.Attach() + if err != nil { + utils.Fatalf("Failed to attach to self: %v", err) + } + ethClient := ethclient.NewClient(rpcClient) + + // Set contract backend for ethereum service if local node + // is serving LES requests. + if ctx.GlobalInt(utils.LightLegacyServFlag.Name) > 0 || ctx.GlobalInt(utils.LightServeFlag.Name) > 0 { + var ethService *eth.Ethereum + if err := stack.Service(ðService); err != nil { + utils.Fatalf("Failed to retrieve ethereum service: %v", err) + } + ethService.SetContractBackend(ethClient) + } + // Set contract backend for les service if local node is + // running as a light client. + if ctx.GlobalString(utils.SyncModeFlag.Name) == "light" { + var lesService *les.LightEthereum + if err := stack.Service(&lesService); err != nil { + utils.Fatalf("Failed to retrieve light ethereum service: %v", err) + } + lesService.SetContractBackend(ethClient) + } + + go func() { + // 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) + } + } + // Listen for wallet event till termination + for event := range events { + 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) + + var derivationPaths []accounts.DerivationPath + if event.Wallet.URL().Scheme == "ledger" { + derivationPaths = append(derivationPaths, accounts.LegacyLedgerBaseDerivationPath) + } + derivationPaths = append(derivationPaths, accounts.DefaultBaseDerivationPath) + + event.Wallet.SelfDerive(derivationPaths, ethClient) + + case accounts.WalletDropped: + log.Info("Old wallet dropped", "url", event.Wallet.URL()) + event.Wallet.Close() + } + } + }() + + // Spawn a standalone goroutine for status synchronization monitoring, + // close the node when synchronization is complete if user required. + if ctx.GlobalBool(utils.ExitWhenSyncedFlag.Name) { + go func() { + sub := stack.EventMux().Subscribe(downloader.DoneEvent{}) + defer sub.Unsubscribe() + for { + event := <-sub.Chan() + if event == nil { + continue + } + done, ok := event.Data.(downloader.DoneEvent) + if !ok { + continue + } + if timestamp := time.Unix(int64(done.Latest.Time), 0); time.Since(timestamp) < 10*time.Minute { + log.Info("Synchronisation completed", "latestnum", done.Latest.Number, "latesthash", done.Latest.Hash(), + "age", common.PrettyAge(timestamp)) + stack.Stop() + } + } + }() + } + + // Start auxiliary services if enabled + if ctx.GlobalBool(utils.MiningEnabledFlag.Name) || ctx.GlobalBool(utils.DeveloperFlag.Name) { + // Mining only makes sense if a full Ethereum node is running + if ctx.GlobalString(utils.SyncModeFlag.Name) == "light" { + utils.Fatalf("Light clients do not support mining") + } + var ethereum *eth.Ethereum + if err := stack.Service(ðereum); err != nil { + utils.Fatalf("Ethereum service not running: %v", err) + } + // Set the gas price to the limits from the CLI and start mining + gasprice := utils.GlobalBig(ctx, utils.MinerLegacyGasPriceFlag.Name) + if ctx.IsSet(utils.MinerGasPriceFlag.Name) { + gasprice = utils.GlobalBig(ctx, utils.MinerGasPriceFlag.Name) + } + ethereum.TxPool().SetGasPrice(gasprice) + + threads := ctx.GlobalInt(utils.MinerLegacyThreadsFlag.Name) + if ctx.GlobalIsSet(utils.MinerThreadsFlag.Name) { + threads = ctx.GlobalInt(utils.MinerThreadsFlag.Name) + } + if err := ethereum.StartMining(threads); err != nil { + utils.Fatalf("Failed to start mining: %v", err) + } + } +} + +// unlockAccounts unlocks any account specifically requested. +func unlockAccounts(ctx *cli.Context, stack *node.Node) { + var unlocks []string + inputs := strings.Split(ctx.GlobalString(utils.UnlockedAccountFlag.Name), ",") + for _, input := range inputs { + if trimmed := strings.TrimSpace(input); trimmed != "" { + unlocks = append(unlocks, trimmed) + } + } + // Short circuit if there is no account to unlock. + if len(unlocks) == 0 { + return + } + // If insecure account unlocking is not allowed if node's APIs are exposed to external. + // Print warning log to user and skip unlocking. + if !stack.Config().InsecureUnlockAllowed && stack.Config().ExtRPCEnabled() { + utils.Fatalf("Account unlock with HTTP access is forbidden!") + } + ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) + passwords := utils.MakePasswordList(ctx) + for i, account := range unlocks { + unlockAccount(ks, account, i, passwords) + } +} diff --git a/cmd/gnbai/misccmd.go b/cmd/geth/misccmd.go similarity index 94% rename from cmd/gnbai/misccmd.go rename to cmd/geth/misccmd.go index ed786cde510a..0e7ee965133c 100644 --- a/cmd/gnbai/misccmd.go +++ b/cmd/geth/misccmd.go @@ -23,10 +23,10 @@ import ( "strconv" "strings" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/eth" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/params" "gopkg.in/urfave/cli.v1" ) @@ -112,9 +112,11 @@ func version(ctx *cli.Context) error { if gitCommit != "" { fmt.Println("Git Commit:", gitCommit) } + if gitDate != "" { + fmt.Println("Git Commit Date:", gitDate) + } fmt.Println("Architecture:", runtime.GOARCH) fmt.Println("Protocol Versions:", eth.ProtocolVersions) - fmt.Println("Network Id:", eth.DefaultConfig.NetworkId) fmt.Println("Go Version:", runtime.Version()) fmt.Println("Operating System:", runtime.GOOS) fmt.Printf("GOPATH=%s\n", os.Getenv("GOPATH")) diff --git a/cmd/geth/retesteth.go b/cmd/geth/retesteth.go new file mode 100644 index 000000000000..2c3f8be78d12 --- /dev/null +++ b/cmd/geth/retesteth.go @@ -0,0 +1,890 @@ +// Copyright 2019 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 ( + "bytes" + "context" + "fmt" + "math/big" + "os" + "os/signal" + "strings" + "time" + + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/consensus/misc" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/trie" + + cli "gopkg.in/urfave/cli.v1" +) + +var ( + rpcPortFlag = cli.IntFlag{ + Name: "rpcport", + Usage: "HTTP-RPC server listening port", + Value: node.DefaultHTTPPort, + } + retestethCommand = cli.Command{ + Action: utils.MigrateFlags(retesteth), + Name: "retesteth", + Usage: "Launches geth in retesteth mode", + ArgsUsage: "", + Flags: []cli.Flag{rpcPortFlag}, + Category: "MISCELLANEOUS COMMANDS", + Description: `Launches geth in retesteth mode (no database, no network, only retesteth RPC interface)`, + } +) + +type RetestethTestAPI interface { + SetChainParams(ctx context.Context, chainParams ChainParams) (bool, error) + MineBlocks(ctx context.Context, number uint64) (bool, error) + ModifyTimestamp(ctx context.Context, interval uint64) (bool, error) + ImportRawBlock(ctx context.Context, rawBlock hexutil.Bytes) (common.Hash, error) + RewindToBlock(ctx context.Context, number uint64) (bool, error) + GetLogHash(ctx context.Context, txHash common.Hash) (common.Hash, error) +} + +type RetestethEthAPI interface { + SendRawTransaction(ctx context.Context, rawTx hexutil.Bytes) (common.Hash, error) + BlockNumber(ctx context.Context) (uint64, error) + GetBlockByNumber(ctx context.Context, blockNr math.HexOrDecimal64, fullTx bool) (map[string]interface{}, error) + GetBalance(ctx context.Context, address common.Address, blockNr math.HexOrDecimal64) (*math.HexOrDecimal256, error) + GetCode(ctx context.Context, address common.Address, blockNr math.HexOrDecimal64) (hexutil.Bytes, error) + GetTransactionCount(ctx context.Context, address common.Address, blockNr math.HexOrDecimal64) (uint64, error) +} + +type RetestethDebugAPI interface { + AccountRange(ctx context.Context, + blockHashOrNumber *math.HexOrDecimal256, txIndex uint64, + addressHash *math.HexOrDecimal256, maxResults uint64, + ) (AccountRangeResult, error) + StorageRangeAt(ctx context.Context, + blockHashOrNumber *math.HexOrDecimal256, txIndex uint64, + address common.Address, + begin *math.HexOrDecimal256, maxResults uint64, + ) (StorageRangeResult, error) +} + +type RetestWeb3API interface { + ClientVersion(ctx context.Context) (string, error) +} + +type RetestethAPI struct { + ethDb ethdb.Database + db state.Database + chainConfig *params.ChainConfig + author common.Address + extraData []byte + genesisHash common.Hash + engine *NoRewardEngine + blockchain *core.BlockChain + blockNumber uint64 + txMap map[common.Address]map[uint64]*types.Transaction // Sender -> Nonce -> Transaction + txSenders map[common.Address]struct{} // Set of transaction senders + blockInterval uint64 +} + +type ChainParams struct { + SealEngine string `json:"sealEngine"` + Params CParamsParams `json:"params"` + Genesis CParamsGenesis `json:"genesis"` + Accounts map[common.Address]CParamsAccount `json:"accounts"` +} + +type CParamsParams struct { + AccountStartNonce math.HexOrDecimal64 `json:"accountStartNonce"` + HomesteadForkBlock *math.HexOrDecimal64 `json:"homesteadForkBlock"` + EIP150ForkBlock *math.HexOrDecimal64 `json:"EIP150ForkBlock"` + EIP158ForkBlock *math.HexOrDecimal64 `json:"EIP158ForkBlock"` + DaoHardforkBlock *math.HexOrDecimal64 `json:"daoHardforkBlock"` + ByzantiumForkBlock *math.HexOrDecimal64 `json:"byzantiumForkBlock"` + ConstantinopleForkBlock *math.HexOrDecimal64 `json:"constantinopleForkBlock"` + ConstantinopleFixForkBlock *math.HexOrDecimal64 `json:"constantinopleFixForkBlock"` + IstanbulBlock *math.HexOrDecimal64 `json:"istanbulForkBlock"` + ChainID *math.HexOrDecimal256 `json:"chainID"` + MaximumExtraDataSize math.HexOrDecimal64 `json:"maximumExtraDataSize"` + TieBreakingGas bool `json:"tieBreakingGas"` + MinGasLimit math.HexOrDecimal64 `json:"minGasLimit"` + MaxGasLimit math.HexOrDecimal64 `json:"maxGasLimit"` + GasLimitBoundDivisor math.HexOrDecimal64 `json:"gasLimitBoundDivisor"` + MinimumDifficulty math.HexOrDecimal256 `json:"minimumDifficulty"` + DifficultyBoundDivisor math.HexOrDecimal256 `json:"difficultyBoundDivisor"` + DurationLimit math.HexOrDecimal256 `json:"durationLimit"` + BlockReward math.HexOrDecimal256 `json:"blockReward"` + NetworkID math.HexOrDecimal256 `json:"networkID"` +} + +type CParamsGenesis struct { + Nonce math.HexOrDecimal64 `json:"nonce"` + Difficulty *math.HexOrDecimal256 `json:"difficulty"` + MixHash *math.HexOrDecimal256 `json:"mixHash"` + Author common.Address `json:"author"` + Timestamp math.HexOrDecimal64 `json:"timestamp"` + ParentHash common.Hash `json:"parentHash"` + ExtraData hexutil.Bytes `json:"extraData"` + GasLimit math.HexOrDecimal64 `json:"gasLimit"` +} + +type CParamsAccount struct { + Balance *math.HexOrDecimal256 `json:"balance"` + Precompiled *CPAccountPrecompiled `json:"precompiled"` + Code hexutil.Bytes `json:"code"` + Storage map[string]string `json:"storage"` + Nonce *math.HexOrDecimal64 `json:"nonce"` +} + +type CPAccountPrecompiled struct { + Name string `json:"name"` + StartingBlock math.HexOrDecimal64 `json:"startingBlock"` + Linear *CPAPrecompiledLinear `json:"linear"` +} + +type CPAPrecompiledLinear struct { + Base uint64 `json:"base"` + Word uint64 `json:"word"` +} + +type AccountRangeResult struct { + AddressMap map[common.Hash]common.Address `json:"addressMap"` + NextKey common.Hash `json:"nextKey"` +} + +type StorageRangeResult struct { + Complete bool `json:"complete"` + Storage map[common.Hash]SRItem `json:"storage"` +} + +type SRItem struct { + Key string `json:"key"` + Value string `json:"value"` +} + +type NoRewardEngine struct { + inner consensus.Engine + rewardsOn bool +} + +func (e *NoRewardEngine) Author(header *types.Header) (common.Address, error) { + return e.inner.Author(header) +} + +func (e *NoRewardEngine) VerifyHeader(chain consensus.ChainReader, header *types.Header, seal bool) error { + return e.inner.VerifyHeader(chain, header, seal) +} + +func (e *NoRewardEngine) VerifyHeaders(chain consensus.ChainReader, headers []*types.Header, seals []bool) (chan<- struct{}, <-chan error) { + return e.inner.VerifyHeaders(chain, headers, seals) +} + +func (e *NoRewardEngine) VerifyUncles(chain consensus.ChainReader, block *types.Block) error { + return e.inner.VerifyUncles(chain, block) +} + +func (e *NoRewardEngine) VerifySeal(chain consensus.ChainReader, header *types.Header) error { + return e.inner.VerifySeal(chain, header) +} + +func (e *NoRewardEngine) Prepare(chain consensus.ChainReader, header *types.Header) error { + return e.inner.Prepare(chain, header) +} + +func (e *NoRewardEngine) accumulateRewards(config *params.ChainConfig, state *state.StateDB, header *types.Header, uncles []*types.Header) { + // Simply touch miner and uncle coinbase accounts + reward := big.NewInt(0) + for _, uncle := range uncles { + state.AddBalance(uncle.Coinbase, reward) + } + state.AddBalance(header.Coinbase, reward) +} + +func (e *NoRewardEngine) Finalize(chain consensus.ChainReader, header *types.Header, statedb *state.StateDB, txs []*types.Transaction, + uncles []*types.Header) { + if e.rewardsOn { + e.inner.Finalize(chain, header, statedb, txs, uncles) + } else { + e.accumulateRewards(chain.Config(), statedb, header, uncles) + header.Root = statedb.IntermediateRoot(chain.Config().IsEIP158(header.Number)) + } +} + +func (e *NoRewardEngine) FinalizeAndAssemble(chain consensus.ChainReader, header *types.Header, statedb *state.StateDB, txs []*types.Transaction, + uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { + if e.rewardsOn { + return e.inner.FinalizeAndAssemble(chain, header, statedb, txs, uncles, receipts) + } else { + e.accumulateRewards(chain.Config(), statedb, header, uncles) + header.Root = statedb.IntermediateRoot(chain.Config().IsEIP158(header.Number)) + + // Header seems complete, assemble into a block and return + return types.NewBlock(header, txs, uncles, receipts), nil + } +} + +func (e *NoRewardEngine) Seal(chain consensus.ChainReader, block *types.Block, results chan<- *types.Block, stop <-chan struct{}) error { + return e.inner.Seal(chain, block, results, stop) +} + +func (e *NoRewardEngine) SealHash(header *types.Header) common.Hash { + return e.inner.SealHash(header) +} + +func (e *NoRewardEngine) CalcDifficulty(chain consensus.ChainReader, time uint64, parent *types.Header) *big.Int { + return e.inner.CalcDifficulty(chain, time, parent) +} + +func (e *NoRewardEngine) APIs(chain consensus.ChainReader) []rpc.API { + return e.inner.APIs(chain) +} + +func (e *NoRewardEngine) Close() error { + return e.inner.Close() +} + +func (api *RetestethAPI) SetChainParams(ctx context.Context, chainParams ChainParams) (bool, error) { + // Clean up + if api.blockchain != nil { + api.blockchain.Stop() + } + if api.engine != nil { + api.engine.Close() + } + if api.ethDb != nil { + api.ethDb.Close() + } + ethDb := rawdb.NewMemoryDatabase() + accounts := make(core.GenesisAlloc) + for address, account := range chainParams.Accounts { + balance := big.NewInt(0) + if account.Balance != nil { + balance.Set((*big.Int)(account.Balance)) + } + var nonce uint64 + if account.Nonce != nil { + nonce = uint64(*account.Nonce) + } + if account.Precompiled == nil || account.Balance != nil { + storage := make(map[common.Hash]common.Hash) + for k, v := range account.Storage { + storage[common.HexToHash(k)] = common.HexToHash(v) + } + accounts[address] = core.GenesisAccount{ + Balance: balance, + Code: account.Code, + Nonce: nonce, + Storage: storage, + } + } + } + chainId := big.NewInt(1) + if chainParams.Params.ChainID != nil { + chainId.Set((*big.Int)(chainParams.Params.ChainID)) + } + var ( + homesteadBlock *big.Int + daoForkBlock *big.Int + eip150Block *big.Int + eip155Block *big.Int + eip158Block *big.Int + byzantiumBlock *big.Int + constantinopleBlock *big.Int + petersburgBlock *big.Int + istanbulBlock *big.Int + ) + if chainParams.Params.HomesteadForkBlock != nil { + homesteadBlock = big.NewInt(int64(*chainParams.Params.HomesteadForkBlock)) + } + if chainParams.Params.DaoHardforkBlock != nil { + daoForkBlock = big.NewInt(int64(*chainParams.Params.DaoHardforkBlock)) + } + if chainParams.Params.EIP150ForkBlock != nil { + eip150Block = big.NewInt(int64(*chainParams.Params.EIP150ForkBlock)) + } + if chainParams.Params.EIP158ForkBlock != nil { + eip158Block = big.NewInt(int64(*chainParams.Params.EIP158ForkBlock)) + eip155Block = eip158Block + } + if chainParams.Params.ByzantiumForkBlock != nil { + byzantiumBlock = big.NewInt(int64(*chainParams.Params.ByzantiumForkBlock)) + } + if chainParams.Params.ConstantinopleForkBlock != nil { + constantinopleBlock = big.NewInt(int64(*chainParams.Params.ConstantinopleForkBlock)) + } + if chainParams.Params.ConstantinopleFixForkBlock != nil { + petersburgBlock = big.NewInt(int64(*chainParams.Params.ConstantinopleFixForkBlock)) + } + if constantinopleBlock != nil && petersburgBlock == nil { + petersburgBlock = big.NewInt(100000000000) + } + if chainParams.Params.IstanbulBlock != nil { + istanbulBlock = big.NewInt(int64(*chainParams.Params.IstanbulBlock)) + } + + genesis := &core.Genesis{ + Config: ¶ms.ChainConfig{ + ChainID: chainId, + HomesteadBlock: homesteadBlock, + DAOForkBlock: daoForkBlock, + DAOForkSupport: false, + EIP150Block: eip150Block, + EIP155Block: eip155Block, + EIP158Block: eip158Block, + ByzantiumBlock: byzantiumBlock, + ConstantinopleBlock: constantinopleBlock, + PetersburgBlock: petersburgBlock, + IstanbulBlock: istanbulBlock, + }, + Nonce: uint64(chainParams.Genesis.Nonce), + Timestamp: uint64(chainParams.Genesis.Timestamp), + ExtraData: chainParams.Genesis.ExtraData, + GasLimit: uint64(chainParams.Genesis.GasLimit), + Difficulty: big.NewInt(0).Set((*big.Int)(chainParams.Genesis.Difficulty)), + Mixhash: common.BigToHash((*big.Int)(chainParams.Genesis.MixHash)), + Coinbase: chainParams.Genesis.Author, + ParentHash: chainParams.Genesis.ParentHash, + Alloc: accounts, + } + chainConfig, genesisHash, err := core.SetupGenesisBlock(ethDb, genesis) + if err != nil { + return false, err + } + fmt.Printf("Chain config: %v\n", chainConfig) + + var inner consensus.Engine + switch chainParams.SealEngine { + case "NoProof", "NoReward": + inner = ethash.NewFaker() + case "Ethash": + inner = ethash.New(ethash.Config{ + CacheDir: "ethash", + CachesInMem: 2, + CachesOnDisk: 3, + DatasetsInMem: 1, + DatasetsOnDisk: 2, + }, nil, false) + default: + return false, fmt.Errorf("unrecognised seal engine: %s", chainParams.SealEngine) + } + engine := &NoRewardEngine{inner: inner, rewardsOn: chainParams.SealEngine != "NoReward"} + + blockchain, err := core.NewBlockChain(ethDb, nil, chainConfig, engine, vm.Config{}, nil) + if err != nil { + return false, err + } + + api.chainConfig = chainConfig + api.genesisHash = genesisHash + api.author = chainParams.Genesis.Author + api.extraData = chainParams.Genesis.ExtraData + api.ethDb = ethDb + api.engine = engine + api.blockchain = blockchain + api.db = state.NewDatabase(api.ethDb) + api.blockNumber = 0 + api.txMap = make(map[common.Address]map[uint64]*types.Transaction) + api.txSenders = make(map[common.Address]struct{}) + api.blockInterval = 0 + return true, nil +} + +func (api *RetestethAPI) SendRawTransaction(ctx context.Context, rawTx hexutil.Bytes) (common.Hash, error) { + tx := new(types.Transaction) + if err := rlp.DecodeBytes(rawTx, tx); err != nil { + // Return nil is not by mistake - some tests include sending transaction where gasLimit overflows uint64 + return common.Hash{}, nil + } + signer := types.MakeSigner(api.chainConfig, big.NewInt(int64(api.blockNumber))) + sender, err := types.Sender(signer, tx) + if err != nil { + return common.Hash{}, err + } + if nonceMap, ok := api.txMap[sender]; ok { + nonceMap[tx.Nonce()] = tx + } else { + nonceMap = make(map[uint64]*types.Transaction) + nonceMap[tx.Nonce()] = tx + api.txMap[sender] = nonceMap + } + api.txSenders[sender] = struct{}{} + return tx.Hash(), nil +} + +func (api *RetestethAPI) MineBlocks(ctx context.Context, number uint64) (bool, error) { + for i := 0; i < int(number); i++ { + if err := api.mineBlock(); err != nil { + return false, err + } + } + fmt.Printf("Mined %d blocks\n", number) + return true, nil +} + +func (api *RetestethAPI) mineBlock() error { + parentHash := rawdb.ReadCanonicalHash(api.ethDb, api.blockNumber) + parent := rawdb.ReadBlock(api.ethDb, parentHash, api.blockNumber) + var timestamp uint64 + if api.blockInterval == 0 { + timestamp = uint64(time.Now().Unix()) + } else { + timestamp = parent.Time() + api.blockInterval + } + gasLimit := core.CalcGasLimit(parent, 9223372036854775807, 9223372036854775807) + header := &types.Header{ + ParentHash: parent.Hash(), + Number: big.NewInt(int64(api.blockNumber + 1)), + GasLimit: gasLimit, + Extra: api.extraData, + Time: timestamp, + } + header.Coinbase = api.author + if api.engine != nil { + api.engine.Prepare(api.blockchain, header) + } + // If we are care about TheDAO hard-fork check whether to override the extra-data or not + if daoBlock := api.chainConfig.DAOForkBlock; daoBlock != nil { + // Check whether the block is among the fork extra-override range + limit := new(big.Int).Add(daoBlock, params.DAOForkExtraRange) + if header.Number.Cmp(daoBlock) >= 0 && header.Number.Cmp(limit) < 0 { + // Depending whether we support or oppose the fork, override differently + if api.chainConfig.DAOForkSupport { + header.Extra = common.CopyBytes(params.DAOForkBlockExtra) + } else if bytes.Equal(header.Extra, params.DAOForkBlockExtra) { + header.Extra = []byte{} // If miner opposes, don't let it use the reserved extra-data + } + } + } + statedb, err := api.blockchain.StateAt(parent.Root()) + if err != nil { + return err + } + if api.chainConfig.DAOForkSupport && api.chainConfig.DAOForkBlock != nil && api.chainConfig.DAOForkBlock.Cmp(header.Number) == 0 { + misc.ApplyDAOHardFork(statedb) + } + gasPool := new(core.GasPool).AddGas(header.GasLimit) + txCount := 0 + var txs []*types.Transaction + var receipts []*types.Receipt + var blockFull = gasPool.Gas() < params.TxGas + for address := range api.txSenders { + if blockFull { + break + } + m := api.txMap[address] + for nonce := statedb.GetNonce(address); ; nonce++ { + if tx, ok := m[nonce]; ok { + // Try to apply transactions to the state + statedb.Prepare(tx.Hash(), common.Hash{}, txCount) + snap := statedb.Snapshot() + + receipt, err := core.ApplyTransaction( + api.chainConfig, + api.blockchain, + &api.author, + gasPool, + statedb, + header, tx, &header.GasUsed, *api.blockchain.GetVMConfig(), + ) + if err != nil { + statedb.RevertToSnapshot(snap) + break + } + txs = append(txs, tx) + receipts = append(receipts, receipt) + delete(m, nonce) + if len(m) == 0 { + // Last tx for the sender + delete(api.txMap, address) + delete(api.txSenders, address) + } + txCount++ + if gasPool.Gas() < params.TxGas { + blockFull = true + break + } + } else { + break // Gap in the nonces + } + } + } + block, err := api.engine.FinalizeAndAssemble(api.blockchain, header, statedb, txs, []*types.Header{}, receipts) + if err != nil { + return err + } + return api.importBlock(block) +} + +func (api *RetestethAPI) importBlock(block *types.Block) error { + if _, err := api.blockchain.InsertChain([]*types.Block{block}); err != nil { + return err + } + api.blockNumber = block.NumberU64() + fmt.Printf("Imported block %d\n", block.NumberU64()) + return nil +} + +func (api *RetestethAPI) ModifyTimestamp(ctx context.Context, interval uint64) (bool, error) { + api.blockInterval = interval + return true, nil +} + +func (api *RetestethAPI) ImportRawBlock(ctx context.Context, rawBlock hexutil.Bytes) (common.Hash, error) { + block := new(types.Block) + if err := rlp.DecodeBytes(rawBlock, block); err != nil { + return common.Hash{}, err + } + fmt.Printf("Importing block %d with parent hash: %x, genesisHash: %x\n", block.NumberU64(), block.ParentHash(), api.genesisHash) + if err := api.importBlock(block); err != nil { + return common.Hash{}, err + } + return block.Hash(), nil +} + +func (api *RetestethAPI) RewindToBlock(ctx context.Context, newHead uint64) (bool, error) { + if err := api.blockchain.SetHead(newHead); err != nil { + return false, err + } + api.blockNumber = newHead + return true, nil +} + +var emptyListHash common.Hash = common.HexToHash("0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347") + +func (api *RetestethAPI) GetLogHash(ctx context.Context, txHash common.Hash) (common.Hash, error) { + receipt, _, _, _ := rawdb.ReadReceipt(api.ethDb, txHash, api.chainConfig) + if receipt == nil { + return emptyListHash, nil + } else { + if logListRlp, err := rlp.EncodeToBytes(receipt.Logs); err != nil { + return common.Hash{}, err + } else { + return common.BytesToHash(crypto.Keccak256(logListRlp)), nil + } + } +} + +func (api *RetestethAPI) BlockNumber(ctx context.Context) (uint64, error) { + //fmt.Printf("BlockNumber, response: %d\n", api.blockNumber) + return api.blockNumber, nil +} + +func (api *RetestethAPI) GetBlockByNumber(ctx context.Context, blockNr math.HexOrDecimal64, fullTx bool) (map[string]interface{}, error) { + block := api.blockchain.GetBlockByNumber(uint64(blockNr)) + if block != nil { + response, err := RPCMarshalBlock(block, true, fullTx) + if err != nil { + return nil, err + } + response["author"] = response["miner"] + response["totalDifficulty"] = (*hexutil.Big)(api.blockchain.GetTd(block.Hash(), uint64(blockNr))) + return response, err + } + return nil, fmt.Errorf("block %d not found", blockNr) +} + +func (api *RetestethAPI) AccountRange(ctx context.Context, + blockHashOrNumber *math.HexOrDecimal256, txIndex uint64, + addressHash *math.HexOrDecimal256, maxResults uint64, +) (AccountRangeResult, error) { + var ( + header *types.Header + block *types.Block + ) + if (*big.Int)(blockHashOrNumber).Cmp(big.NewInt(math.MaxInt64)) > 0 { + blockHash := common.BigToHash((*big.Int)(blockHashOrNumber)) + header = api.blockchain.GetHeaderByHash(blockHash) + block = api.blockchain.GetBlockByHash(blockHash) + //fmt.Printf("Account range: %x, txIndex %d, start: %x, maxResults: %d\n", blockHash, txIndex, common.BigToHash((*big.Int)(addressHash)), maxResults) + } else { + blockNumber := (*big.Int)(blockHashOrNumber).Uint64() + header = api.blockchain.GetHeaderByNumber(blockNumber) + block = api.blockchain.GetBlockByNumber(blockNumber) + //fmt.Printf("Account range: %d, txIndex %d, start: %x, maxResults: %d\n", blockNumber, txIndex, common.BigToHash((*big.Int)(addressHash)), maxResults) + } + parentHeader := api.blockchain.GetHeaderByHash(header.ParentHash) + var root common.Hash + var statedb *state.StateDB + var err error + if parentHeader == nil || int(txIndex) >= len(block.Transactions()) { + root = header.Root + statedb, err = api.blockchain.StateAt(root) + if err != nil { + return AccountRangeResult{}, err + } + } else { + root = parentHeader.Root + statedb, err = api.blockchain.StateAt(root) + if err != nil { + return AccountRangeResult{}, err + } + // Recompute transactions up to the target index. + signer := types.MakeSigner(api.blockchain.Config(), block.Number()) + for idx, tx := range block.Transactions() { + // Assemble the transaction call message and return if the requested offset + msg, _ := tx.AsMessage(signer) + context := core.NewEVMContext(msg, block.Header(), api.blockchain, nil) + // Not yet the searched for transaction, execute on top of the current state + vmenv := vm.NewEVM(context, statedb, api.blockchain.Config(), vm.Config{}) + if _, _, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())); err != nil { + return AccountRangeResult{}, fmt.Errorf("transaction %#x failed: %v", tx.Hash(), err) + } + // Ensure any modifications are committed to the state + // Only delete empty objects if EIP158/161 (a.k.a Spurious Dragon) is in effect + root = statedb.IntermediateRoot(vmenv.ChainConfig().IsEIP158(block.Number())) + if idx == int(txIndex) { + // This is to make sure root can be opened by OpenTrie + root, err = statedb.Commit(api.chainConfig.IsEIP158(block.Number())) + if err != nil { + return AccountRangeResult{}, err + } + break + } + } + } + accountTrie, err := statedb.Database().OpenTrie(root) + if err != nil { + return AccountRangeResult{}, err + } + it := trie.NewIterator(accountTrie.NodeIterator(common.BigToHash((*big.Int)(addressHash)).Bytes())) + result := AccountRangeResult{AddressMap: make(map[common.Hash]common.Address)} + for i := 0; i < int(maxResults) && it.Next(); i++ { + if preimage := accountTrie.GetKey(it.Key); preimage != nil { + result.AddressMap[common.BytesToHash(it.Key)] = common.BytesToAddress(preimage) + } + } + //fmt.Printf("Number of entries returned: %d\n", len(result.AddressMap)) + // Add the 'next key' so clients can continue downloading. + if it.Next() { + next := common.BytesToHash(it.Key) + result.NextKey = next + } + return result, nil +} + +func (api *RetestethAPI) GetBalance(ctx context.Context, address common.Address, blockNr math.HexOrDecimal64) (*math.HexOrDecimal256, error) { + //fmt.Printf("GetBalance %x, block %d\n", address, blockNr) + header := api.blockchain.GetHeaderByNumber(uint64(blockNr)) + statedb, err := api.blockchain.StateAt(header.Root) + if err != nil { + return nil, err + } + return (*math.HexOrDecimal256)(statedb.GetBalance(address)), nil +} + +func (api *RetestethAPI) GetCode(ctx context.Context, address common.Address, blockNr math.HexOrDecimal64) (hexutil.Bytes, error) { + header := api.blockchain.GetHeaderByNumber(uint64(blockNr)) + statedb, err := api.blockchain.StateAt(header.Root) + if err != nil { + return nil, err + } + return statedb.GetCode(address), nil +} + +func (api *RetestethAPI) GetTransactionCount(ctx context.Context, address common.Address, blockNr math.HexOrDecimal64) (uint64, error) { + header := api.blockchain.GetHeaderByNumber(uint64(blockNr)) + statedb, err := api.blockchain.StateAt(header.Root) + if err != nil { + return 0, err + } + return statedb.GetNonce(address), nil +} + +func (api *RetestethAPI) StorageRangeAt(ctx context.Context, + blockHashOrNumber *math.HexOrDecimal256, txIndex uint64, + address common.Address, + begin *math.HexOrDecimal256, maxResults uint64, +) (StorageRangeResult, error) { + var ( + header *types.Header + block *types.Block + ) + if (*big.Int)(blockHashOrNumber).Cmp(big.NewInt(math.MaxInt64)) > 0 { + blockHash := common.BigToHash((*big.Int)(blockHashOrNumber)) + header = api.blockchain.GetHeaderByHash(blockHash) + block = api.blockchain.GetBlockByHash(blockHash) + //fmt.Printf("Storage range: %x, txIndex %d, addr: %x, start: %x, maxResults: %d\n", + // blockHash, txIndex, address, common.BigToHash((*big.Int)(begin)), maxResults) + } else { + blockNumber := (*big.Int)(blockHashOrNumber).Uint64() + header = api.blockchain.GetHeaderByNumber(blockNumber) + block = api.blockchain.GetBlockByNumber(blockNumber) + //fmt.Printf("Storage range: %d, txIndex %d, addr: %x, start: %x, maxResults: %d\n", + // blockNumber, txIndex, address, common.BigToHash((*big.Int)(begin)), maxResults) + } + parentHeader := api.blockchain.GetHeaderByHash(header.ParentHash) + var root common.Hash + var statedb *state.StateDB + var err error + if parentHeader == nil || int(txIndex) >= len(block.Transactions()) { + root = header.Root + statedb, err = api.blockchain.StateAt(root) + if err != nil { + return StorageRangeResult{}, err + } + } else { + root = parentHeader.Root + statedb, err = api.blockchain.StateAt(root) + if err != nil { + return StorageRangeResult{}, err + } + // Recompute transactions up to the target index. + signer := types.MakeSigner(api.blockchain.Config(), block.Number()) + for idx, tx := range block.Transactions() { + // Assemble the transaction call message and return if the requested offset + msg, _ := tx.AsMessage(signer) + context := core.NewEVMContext(msg, block.Header(), api.blockchain, nil) + // Not yet the searched for transaction, execute on top of the current state + vmenv := vm.NewEVM(context, statedb, api.blockchain.Config(), vm.Config{}) + if _, _, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())); err != nil { + return StorageRangeResult{}, fmt.Errorf("transaction %#x failed: %v", tx.Hash(), err) + } + // Ensure any modifications are committed to the state + // Only delete empty objects if EIP158/161 (a.k.a Spurious Dragon) is in effect + _ = statedb.IntermediateRoot(vmenv.ChainConfig().IsEIP158(block.Number())) + if idx == int(txIndex) { + // This is to make sure root can be opened by OpenTrie + _, err = statedb.Commit(vmenv.ChainConfig().IsEIP158(block.Number())) + if err != nil { + return StorageRangeResult{}, err + } + } + } + } + storageTrie := statedb.StorageTrie(address) + it := trie.NewIterator(storageTrie.NodeIterator(common.BigToHash((*big.Int)(begin)).Bytes())) + result := StorageRangeResult{Storage: make(map[common.Hash]SRItem)} + for i := 0; /*i < int(maxResults) && */ it.Next(); i++ { + if preimage := storageTrie.GetKey(it.Key); preimage != nil { + key := (*math.HexOrDecimal256)(big.NewInt(0).SetBytes(preimage)) + v, _, err := rlp.SplitString(it.Value) + if err != nil { + return StorageRangeResult{}, err + } + value := (*math.HexOrDecimal256)(big.NewInt(0).SetBytes(v)) + ks, _ := key.MarshalText() + vs, _ := value.MarshalText() + if len(ks)%2 != 0 { + ks = append(append(append([]byte{}, ks[:2]...), byte('0')), ks[2:]...) + } + if len(vs)%2 != 0 { + vs = append(append(append([]byte{}, vs[:2]...), byte('0')), vs[2:]...) + } + result.Storage[common.BytesToHash(it.Key)] = SRItem{ + Key: string(ks), + Value: string(vs), + } + } + } + if it.Next() { + result.Complete = false + } else { + result.Complete = true + } + return result, nil +} + +func (api *RetestethAPI) ClientVersion(ctx context.Context) (string, error) { + return "Geth-" + params.VersionWithCommit(gitCommit, gitDate), nil +} + +// splitAndTrim splits input separated by a comma +// and trims excessive white space from the substrings. +func splitAndTrim(input string) []string { + result := strings.Split(input, ",") + for i, r := range result { + result[i] = strings.TrimSpace(r) + } + return result +} + +func retesteth(ctx *cli.Context) error { + log.Info("Welcome to retesteth!") + // register signer API with server + var ( + extapiURL string + ) + apiImpl := &RetestethAPI{} + var testApi RetestethTestAPI = apiImpl + var ethApi RetestethEthAPI = apiImpl + var debugApi RetestethDebugAPI = apiImpl + var web3Api RetestWeb3API = apiImpl + rpcAPI := []rpc.API{ + { + Namespace: "test", + Public: true, + Service: testApi, + Version: "1.0", + }, + { + Namespace: "eth", + Public: true, + Service: ethApi, + Version: "1.0", + }, + { + Namespace: "debug", + Public: true, + Service: debugApi, + Version: "1.0", + }, + { + Namespace: "web3", + Public: true, + Service: web3Api, + Version: "1.0", + }, + } + vhosts := splitAndTrim(ctx.GlobalString(utils.RPCVirtualHostsFlag.Name)) + cors := splitAndTrim(ctx.GlobalString(utils.RPCCORSDomainFlag.Name)) + + // start http server + httpEndpoint := fmt.Sprintf("%s:%d", ctx.GlobalString(utils.RPCListenAddrFlag.Name), ctx.Int(rpcPortFlag.Name)) + listener, _, err := rpc.StartHTTPEndpoint(httpEndpoint, rpcAPI, []string{"test", "eth", "debug", "web3"}, cors, vhosts, rpc.DefaultHTTPTimeouts) + if err != nil { + utils.Fatalf("Could not start RPC api: %v", err) + } + extapiURL = fmt.Sprintf("http://%s", httpEndpoint) + log.Info("HTTP endpoint opened", "url", extapiURL) + + defer func() { + listener.Close() + log.Info("HTTP endpoint closed", "url", httpEndpoint) + }() + + abortChan := make(chan os.Signal, 11) + signal.Notify(abortChan, os.Interrupt) + + sig := <-abortChan + log.Info("Exiting...", "signal", sig) + return nil +} diff --git a/cmd/geth/retesteth_copypaste.go b/cmd/geth/retesteth_copypaste.go new file mode 100644 index 000000000000..e2795af7f968 --- /dev/null +++ b/cmd/geth/retesteth_copypaste.go @@ -0,0 +1,148 @@ +// Copyright 2019 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 ( + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" +) + +// RPCTransaction represents a transaction that will serialize to the RPC representation of a transaction +type RPCTransaction struct { + BlockHash common.Hash `json:"blockHash"` + BlockNumber *hexutil.Big `json:"blockNumber"` + From common.Address `json:"from"` + Gas hexutil.Uint64 `json:"gas"` + GasPrice *hexutil.Big `json:"gasPrice"` + Hash common.Hash `json:"hash"` + Input hexutil.Bytes `json:"input"` + Nonce hexutil.Uint64 `json:"nonce"` + To *common.Address `json:"to"` + TransactionIndex hexutil.Uint `json:"transactionIndex"` + Value *hexutil.Big `json:"value"` + V *hexutil.Big `json:"v"` + R *hexutil.Big `json:"r"` + S *hexutil.Big `json:"s"` +} + +// newRPCTransaction returns a transaction that will serialize to the RPC +// representation, with the given location metadata set (if available). +func newRPCTransaction(tx *types.Transaction, blockHash common.Hash, blockNumber uint64, index uint64) *RPCTransaction { + var signer types.Signer = types.FrontierSigner{} + if tx.Protected() { + signer = types.NewEIP155Signer(tx.ChainId()) + } + from, _ := types.Sender(signer, tx) + v, r, s := tx.RawSignatureValues() + + result := &RPCTransaction{ + From: from, + Gas: hexutil.Uint64(tx.Gas()), + GasPrice: (*hexutil.Big)(tx.GasPrice()), + Hash: tx.Hash(), + Input: hexutil.Bytes(tx.Data()), + Nonce: hexutil.Uint64(tx.Nonce()), + To: tx.To(), + Value: (*hexutil.Big)(tx.Value()), + V: (*hexutil.Big)(v), + R: (*hexutil.Big)(r), + S: (*hexutil.Big)(s), + } + if blockHash != (common.Hash{}) { + result.BlockHash = blockHash + result.BlockNumber = (*hexutil.Big)(new(big.Int).SetUint64(blockNumber)) + result.TransactionIndex = hexutil.Uint(index) + } + return result +} + +// newRPCTransactionFromBlockIndex returns a transaction that will serialize to the RPC representation. +func newRPCTransactionFromBlockIndex(b *types.Block, index uint64) *RPCTransaction { + txs := b.Transactions() + if index >= uint64(len(txs)) { + return nil + } + return newRPCTransaction(txs[index], b.Hash(), b.NumberU64(), index) +} + +// newRPCTransactionFromBlockHash returns a transaction that will serialize to the RPC representation. +func newRPCTransactionFromBlockHash(b *types.Block, hash common.Hash) *RPCTransaction { + for idx, tx := range b.Transactions() { + if tx.Hash() == hash { + return newRPCTransactionFromBlockIndex(b, uint64(idx)) + } + } + return nil +} + +// RPCMarshalBlock converts the given block to the RPC output which depends on fullTx. If inclTx is true transactions are +// returned. When fullTx is true the returned block contains full transaction details, otherwise it will only contain +// transaction hashes. +func RPCMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]interface{}, error) { + head := b.Header() // copies the header once + fields := map[string]interface{}{ + "number": (*hexutil.Big)(head.Number), + "hash": b.Hash(), + "parentHash": head.ParentHash, + "nonce": head.Nonce, + "mixHash": head.MixDigest, + "sha3Uncles": head.UncleHash, + "logsBloom": head.Bloom, + "stateRoot": head.Root, + "miner": head.Coinbase, + "difficulty": (*hexutil.Big)(head.Difficulty), + "extraData": hexutil.Bytes(head.Extra), + "size": hexutil.Uint64(b.Size()), + "gasLimit": hexutil.Uint64(head.GasLimit), + "gasUsed": hexutil.Uint64(head.GasUsed), + "timestamp": hexutil.Uint64(head.Time), + "transactionsRoot": head.TxHash, + "receiptsRoot": head.ReceiptHash, + } + + if inclTx { + formatTx := func(tx *types.Transaction) (interface{}, error) { + return tx.Hash(), nil + } + if fullTx { + formatTx = func(tx *types.Transaction) (interface{}, error) { + return newRPCTransactionFromBlockHash(b, tx.Hash()), nil + } + } + txs := b.Transactions() + transactions := make([]interface{}, len(txs)) + var err error + for i, tx := range txs { + if transactions[i], err = formatTx(tx); err != nil { + return nil, err + } + } + fields["transactions"] = transactions + } + + uncles := b.Uncles() + uncleHashes := make([]common.Hash, len(uncles)) + for i, uncle := range uncles { + uncleHashes[i] = uncle.Hash() + } + fields["uncles"] = uncleHashes + + return fields, nil +} diff --git a/cmd/geth/run_test.go b/cmd/geth/run_test.go new file mode 100644 index 000000000000..f7b735b84c14 --- /dev/null +++ b/cmd/geth/run_test.go @@ -0,0 +1,126 @@ +// Copyright 2016 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 ( + "context" + "fmt" + "io/ioutil" + "os" + "testing" + "time" + + "github.com/docker/docker/pkg/reexec" + "github.com/ethereum/go-ethereum/internal/cmdtest" + "github.com/ethereum/go-ethereum/rpc" +) + +func tmpdir(t *testing.T) string { + dir, err := ioutil.TempDir("", "geth-test") + if err != nil { + t.Fatal(err) + } + return dir +} + +type testgeth struct { + *cmdtest.TestCmd + + // template variables for expect + Datadir string + Etherbase string +} + +func init() { + // Run the app if we've been exec'd as "geth-test" in runGeth. + reexec.Register("geth-test", func() { + if err := app.Run(os.Args); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } + os.Exit(0) + }) +} + +func TestMain(m *testing.M) { + // check if we have been reexec'd + if reexec.Init() { + return + } + os.Exit(m.Run()) +} + +// spawns geth with the given command line args. If the args don't set --datadir, the +// child g gets a temporary data directory. +func runGeth(t *testing.T, args ...string) *testgeth { + tt := &testgeth{} + tt.TestCmd = cmdtest.NewTestCmd(t, tt) + for i, arg := range args { + switch { + case arg == "-datadir" || arg == "--datadir": + if i < len(args)-1 { + tt.Datadir = args[i+1] + } + case arg == "-etherbase" || arg == "--etherbase": + if i < len(args)-1 { + tt.Etherbase = args[i+1] + } + } + } + if tt.Datadir == "" { + tt.Datadir = tmpdir(t) + tt.Cleanup = func() { os.RemoveAll(tt.Datadir) } + args = append([]string{"-datadir", tt.Datadir}, args...) + // Remove the temporary datadir if something fails below. + defer func() { + if t.Failed() { + tt.Cleanup() + } + }() + } + + // Boot "geth". This actually runs the test binary but the TestMain + // function will prevent any tests from running. + tt.Run("geth-test", args...) + + return tt +} + +// waitForEndpoint attempts to connect to an RPC endpoint until it succeeds. +func waitForEndpoint(t *testing.T, endpoint string, timeout time.Duration) { + probe := func() bool { + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + c, err := rpc.DialContext(ctx, endpoint) + if c != nil { + _, err = c.SupportedModules() + c.Close() + } + return err == nil + } + + start := time.Now() + for { + if probe() { + return + } + if time.Since(start) > timeout { + t.Fatal("endpoint", endpoint, "did not open within", timeout) + } + time.Sleep(200 * time.Millisecond) + } +} diff --git a/cmd/gnbai/testdata/empty.js b/cmd/geth/testdata/empty.js similarity index 100% rename from cmd/gnbai/testdata/empty.js rename to cmd/geth/testdata/empty.js diff --git a/cmd/gnbai/testdata/guswallet.json b/cmd/geth/testdata/guswallet.json similarity index 100% rename from cmd/gnbai/testdata/guswallet.json rename to cmd/geth/testdata/guswallet.json diff --git a/cmd/gnbai/testdata/passwords.txt b/cmd/geth/testdata/passwords.txt similarity index 100% rename from cmd/gnbai/testdata/passwords.txt rename to cmd/geth/testdata/passwords.txt diff --git a/cmd/gnbai/testdata/wrong-passwords.txt b/cmd/geth/testdata/wrong-passwords.txt similarity index 100% rename from cmd/gnbai/testdata/wrong-passwords.txt rename to cmd/geth/testdata/wrong-passwords.txt diff --git a/cmd/gnbai/usage.go b/cmd/geth/usage.go similarity index 89% rename from cmd/gnbai/usage.go rename to cmd/geth/usage.go index 2f07e0c07002..b3b6b5f93d1c 100644 --- a/cmd/gnbai/usage.go +++ b/cmd/geth/usage.go @@ -22,18 +22,16 @@ import ( "io" "sort" - "strings" - - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/internal/debug" - "gopkg.in/urfave/cli.v1" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/internal/debug" + cli "gopkg.in/urfave/cli.v1" ) // AppHelpTemplate is the test template for the default, global app help topic. var AppHelpTemplate = `NAME: {{.App.Name}} - {{.App.Usage}} - Copyright 2017-2018 The go-nbai Authors + Copyright 2013-2019 The go-ethereum Authors USAGE: {{.App.HelpName}} [options]{{if .App.Commands}} command [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}} @@ -69,21 +67,35 @@ var AppHelpFlagGroups = []flagGroup{ Flags: []cli.Flag{ configFileFlag, utils.DataDirFlag, + utils.AncientFlag, utils.KeyStoreDirFlag, utils.NoUSBFlag, + utils.SmartCardDaemonPathFlag, utils.NetworkIdFlag, utils.TestnetFlag, utils.RinkebyFlag, + utils.GoerliFlag, utils.SyncModeFlag, + utils.ExitWhenSyncedFlag, utils.GCModeFlag, utils.EthStatsURLFlag, utils.IdentityFlag, - utils.LightServFlag, - utils.LightPeersFlag, utils.LightKDFFlag, utils.WhitelistFlag, }, }, + { + Name: "LIGHT CLIENT", + Flags: []cli.Flag{ + utils.LightServeFlag, + utils.LightIngressFlag, + utils.LightEgressFlag, + utils.LightMaxPeersFlag, + utils.UltraLightServersFlag, + utils.UltraLightFractionFlag, + utils.UltraLightOnlyAnnounceFlag, + }, + }, { Name: "DEVELOPER CHAIN", Flags: []cli.Flag{ @@ -102,16 +114,6 @@ var AppHelpFlagGroups = []flagGroup{ utils.EthashDatasetsOnDiskFlag, }, }, - //{ - // Name: "DASHBOARD", - // Flags: []cli.Flag{ - // utils.DashboardEnabledFlag, - // utils.DashboardAddrFlag, - // utils.DashboardPortFlag, - // utils.DashboardRefreshFlag, - // utils.DashboardAssetsFlag, - // }, - //}, { Name: "TRANSACTION POOL", Flags: []cli.Flag{ @@ -135,7 +137,7 @@ var AppHelpFlagGroups = []flagGroup{ utils.CacheDatabaseFlag, utils.CacheTrieFlag, utils.CacheGCFlag, - utils.TrieCacheGenFlag, + utils.CacheNoPrefetchFlag, }, }, { @@ -143,24 +145,32 @@ var AppHelpFlagGroups = []flagGroup{ Flags: []cli.Flag{ utils.UnlockedAccountFlag, utils.PasswordFileFlag, + utils.ExternalSignerFlag, + utils.InsecureUnlockAllowedFlag, }, }, { Name: "API AND CONSOLE", Flags: []cli.Flag{ + utils.IPCDisabledFlag, + utils.IPCPathFlag, utils.RPCEnabledFlag, utils.RPCListenAddrFlag, utils.RPCPortFlag, utils.RPCApiFlag, + utils.RPCGlobalGasCap, + utils.RPCCORSDomainFlag, + utils.RPCVirtualHostsFlag, utils.WSEnabledFlag, utils.WSListenAddrFlag, utils.WSPortFlag, utils.WSApiFlag, utils.WSAllowedOriginsFlag, - utils.IPCDisabledFlag, - utils.IPCPathFlag, - utils.RPCCORSDomainFlag, - utils.RPCVirtualHostsFlag, + utils.GraphQLEnabledFlag, + utils.GraphQLListenAddrFlag, + utils.GraphQLPortFlag, + utils.GraphQLCORSDomainFlag, + utils.GraphQLVirtualHostsFlag, utils.JSpathFlag, utils.ExecFlag, utils.PreloadJSFlag, @@ -221,16 +231,8 @@ var AppHelpFlagGroups = []flagGroup{ }, debug.Flags...), }, { - Name: "METRICS AND STATS", - Flags: []cli.Flag{ - utils.MetricsEnabledFlag, - utils.MetricsEnableInfluxDBFlag, - utils.MetricsInfluxDBEndpointFlag, - utils.MetricsInfluxDBDatabaseFlag, - utils.MetricsInfluxDBUsernameFlag, - utils.MetricsInfluxDBPasswordFlag, - utils.MetricsInfluxDBHostTagFlag, - }, + Name: "METRICS AND STATS", + Flags: metricsFlags, }, { Name: "WHISPER (EXPERIMENTAL)", @@ -239,6 +241,8 @@ var AppHelpFlagGroups = []flagGroup{ { Name: "DEPRECATED", Flags: []cli.Flag{ + utils.LightLegacyServFlag, + utils.LightLegacyPeersFlag, utils.MinerLegacyThreadsFlag, utils.MinerLegacyGasTargetFlag, utils.MinerLegacyGasPriceFlag, @@ -305,12 +309,9 @@ func init() { categorized[flag.String()] = struct{}{} } } - uncategorized := []cli.Flag{} + var 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/gnbai/bugcmd.go b/cmd/gnbai/bugcmd.go deleted file mode 100644 index d226ab0a38d9..000000000000 --- a/cmd/gnbai/bugcmd.go +++ /dev/null @@ -1,113 +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 ( - "bytes" - "fmt" - "io" - "io/ioutil" - "net/url" - "os/exec" - "runtime" - "strings" - - "github.com/nebulaai/nbai-node/cmd/internal/browser" - "github.com/nebulaai/nbai-node/params" - - "github.com/nebulaai/nbai-node/cmd/utils" - cli "gopkg.in/urfave/cli.v1" -) - -var bugCommand = cli.Command{ - Action: utils.MigrateFlags(reportBug), - Name: "bug", - Usage: "opens a window to report a bug on the geth repo", - ArgsUsage: " ", - Category: "MISCELLANEOUS COMMANDS", -} - -const issueURL = "https://github.com/nebulaai/nbai-node/issues/new" - -// reportBug reports a bug by opening a new URL to the go-ethereum GH issue -// tracker and setting default values as the issue body. -func reportBug(ctx *cli.Context) error { - // execute template and write contents to buff - var buff bytes.Buffer - - fmt.Fprintln(&buff, "#### System information") - fmt.Fprintln(&buff) - fmt.Fprintln(&buff, "Version:", params.VersionWithMeta) - fmt.Fprintln(&buff, "Go Version:", runtime.Version()) - fmt.Fprintln(&buff, "OS:", runtime.GOOS) - printOSDetails(&buff) - fmt.Fprintln(&buff, header) - - // open a new GH issue - if !browser.Open(issueURL + "?body=" + url.QueryEscape(buff.String())) { - fmt.Printf("Please file a new issue at %s using this template:\n\n%s", issueURL, buff.String()) - } - return nil -} - -// copied from the Go source. Copyright 2017 The Go Authors -func printOSDetails(w io.Writer) { - switch runtime.GOOS { - case "darwin": - printCmdOut(w, "uname -v: ", "uname", "-v") - printCmdOut(w, "", "sw_vers") - case "linux": - printCmdOut(w, "uname -sr: ", "uname", "-sr") - printCmdOut(w, "", "lsb_release", "-a") - case "openbsd", "netbsd", "freebsd", "dragonfly": - printCmdOut(w, "uname -v: ", "uname", "-v") - case "solaris": - out, err := ioutil.ReadFile("/etc/release") - if err == nil { - fmt.Fprintf(w, "/etc/release: %s\n", out) - } else { - fmt.Printf("failed to read /etc/release: %v\n", err) - } - } -} - -// printCmdOut prints the output of running the given command. -// It ignores failures; 'go bug' is best effort. -// -// copied from the Go source. Copyright 2017 The Go Authors -func printCmdOut(w io.Writer, prefix, path string, args ...string) { - cmd := exec.Command(path, args...) - out, err := cmd.Output() - if err != nil { - fmt.Printf("%s %s: %v\n", path, strings.Join(args, " "), err) - return - } - fmt.Fprintf(w, "%s%s\n", prefix, bytes.TrimSpace(out)) -} - -const header = ` -#### Expected behaviour - - -#### Actual behaviour - - -#### Steps to reproduce the behaviour - - -#### Backtrace -` diff --git a/cmd/gnbai/chaincmd.go b/cmd/gnbai/chaincmd.go deleted file mode 100644 index af91b5f33bd3..000000000000 --- a/cmd/gnbai/chaincmd.go +++ /dev/null @@ -1,472 +0,0 @@ -// Copyright 2015 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" - "fmt" - "os" - "runtime" - "strconv" - "sync/atomic" - "time" - - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/console" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/trie" - "github.com/syndtr/goleveldb/leveldb/util" - "gopkg.in/urfave/cli.v1" -) - -var ( - initCommand = cli.Command{ - Action: utils.MigrateFlags(initGenesis), - Name: "init", - Usage: "Bootstrap and initialize a new genesis block", - ArgsUsage: "", - Flags: []cli.Flag{ - utils.DataDirFlag, - }, - Category: "BLOCKCHAIN COMMANDS", - Description: ` -The init command initializes a new genesis block and definition for the network. -This is a destructive action and changes the network in which you will be -participating. - -It expects the genesis file as argument.`, - } - importCommand = cli.Command{ - Action: utils.MigrateFlags(importChain), - Name: "import", - Usage: "Import a blockchain file", - ArgsUsage: " ( ... ) ", - Flags: []cli.Flag{ - utils.DataDirFlag, - utils.CacheFlag, - utils.SyncModeFlag, - utils.GCModeFlag, - utils.CacheDatabaseFlag, - utils.CacheGCFlag, - }, - Category: "BLOCKCHAIN COMMANDS", - Description: ` -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, -processing will proceed even if an individual RLP-file import failure occurs.`, - } - exportCommand = cli.Command{ - Action: utils.MigrateFlags(exportChain), - Name: "export", - Usage: "Export blockchain into file", - ArgsUsage: " [ ]", - Flags: []cli.Flag{ - utils.DataDirFlag, - utils.CacheFlag, - utils.SyncModeFlag, - }, - Category: "BLOCKCHAIN COMMANDS", - Description: ` -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. If the file ends with .gz, the output will -be gzipped.`, - } - importPreimagesCommand = cli.Command{ - Action: utils.MigrateFlags(importPreimages), - Name: "import-preimages", - Usage: "Import the preimage database from an RLP stream", - ArgsUsage: "", - Flags: []cli.Flag{ - utils.DataDirFlag, - utils.CacheFlag, - utils.SyncModeFlag, - }, - Category: "BLOCKCHAIN COMMANDS", - Description: ` - The import-preimages command imports hash preimages from an RLP encoded stream.`, - } - exportPreimagesCommand = cli.Command{ - Action: utils.MigrateFlags(exportPreimages), - Name: "export-preimages", - Usage: "Export the preimage database into an RLP stream", - ArgsUsage: "", - Flags: []cli.Flag{ - utils.DataDirFlag, - utils.CacheFlag, - utils.SyncModeFlag, - }, - Category: "BLOCKCHAIN COMMANDS", - Description: ` -The export-preimages command export hash preimages to an RLP encoded stream`, - } - 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, - utils.RinkebyFlag, - }, - Category: "BLOCKCHAIN COMMANDS", - Description: ` -The first argument must be the directory containing the blockchain to download from`, - } - removedbCommand = cli.Command{ - Action: utils.MigrateFlags(removeDB), - Name: "removedb", - Usage: "Remove blockchain and state databases", - ArgsUsage: " ", - Flags: []cli.Flag{ - utils.DataDirFlag, - }, - Category: "BLOCKCHAIN COMMANDS", - Description: ` -Remove blockchain and state databases`, - } - dumpCommand = cli.Command{ - Action: utils.MigrateFlags(dump), - Name: "dump", - Usage: "Dump a specific block from storage", - ArgsUsage: "[ | ]...", - Flags: []cli.Flag{ - utils.DataDirFlag, - utils.CacheFlag, - utils.SyncModeFlag, - }, - Category: "BLOCKCHAIN COMMANDS", - Description: ` -The arguments are interpreted as block numbers or hashes. -Use "ethereum dump 0" to dump the genesis block.`, - } -) - -// initGenesis will initialise the given JSON format genesis file and writes it as -// the zero'd block (i.e. genesis) or will fail hard if it can't succeed. -func initGenesis(ctx *cli.Context) error { - // Make sure we have a valid genesis JSON - genesisPath := ctx.Args().First() - if len(genesisPath) == 0 { - utils.Fatalf("Must supply path to genesis JSON file") - } - file, err := os.Open(genesisPath) - if err != nil { - utils.Fatalf("Failed to read genesis file: %v", err) - } - defer file.Close() - - genesis := new(core.Genesis) - if err := json.NewDecoder(file).Decode(genesis); err != nil { - utils.Fatalf("invalid genesis file: %v", err) - } - // Open an initialise both full and light databases - stack := makeFullNode(ctx) - for _, name := range []string{"chaindata", "lightchaindata"} { - chaindb, err := stack.OpenDatabase(name, 0, 0) - if err != nil { - utils.Fatalf("Failed to open database: %v", err) - } - _, hash, err := core.SetupGenesisBlock(chaindb, genesis) - if err != nil { - utils.Fatalf("Failed to write genesis block: %v", err) - } - log.Info("Successfully wrote genesis state", "database", name, "hash", hash) - } - return nil -} - -func importChain(ctx *cli.Context) error { - if len(ctx.Args()) < 1 { - utils.Fatalf("This command requires an argument.") - } - stack := makeFullNode(ctx) - chain, chainDb := utils.MakeChain(ctx, stack) - defer chainDb.Close() - - // Start periodically gathering memory profiles - var peakMemAlloc, peakMemSys uint64 - go func() { - stats := new(runtime.MemStats) - for { - runtime.ReadMemStats(stats) - if atomic.LoadUint64(&peakMemAlloc) < stats.Alloc { - atomic.StoreUint64(&peakMemAlloc, stats.Alloc) - } - if atomic.LoadUint64(&peakMemSys) < stats.Sys { - atomic.StoreUint64(&peakMemSys, stats.Sys) - } - time.Sleep(5 * time.Second) - } - }() - // Import the chain - start := time.Now() - - if len(ctx.Args()) == 1 { - if err := utils.ImportChain(chain, ctx.Args().First()); err != nil { - log.Error("Import error", "err", err) - } - } else { - for _, arg := range ctx.Args() { - if err := utils.ImportChain(chain, arg); err != nil { - log.Error("Import error", "file", arg, "err", err) - } - } - } - chain.Stop() - fmt.Printf("Import done in %v.\n\n", time.Since(start)) - - // Output pre-compaction stats mostly to see the import trashing - db := chainDb.(*ethdb.LDBDatabase) - - stats, err := db.LDB().GetProperty("leveldb.stats") - if err != nil { - utils.Fatalf("Failed to read database stats: %v", err) - } - fmt.Println(stats) - - ioStats, err := db.LDB().GetProperty("leveldb.iostats") - if err != nil { - utils.Fatalf("Failed to read database iostats: %v", err) - } - fmt.Println(ioStats) - - fmt.Printf("Trie cache misses: %d\n", trie.CacheMisses()) - fmt.Printf("Trie cache unloads: %d\n\n", trie.CacheUnloads()) - - // Print the memory statistics used by the importing - mem := new(runtime.MemStats) - runtime.ReadMemStats(mem) - - fmt.Printf("Object memory: %.3f MB current, %.3f MB peak\n", float64(mem.Alloc)/1024/1024, float64(atomic.LoadUint64(&peakMemAlloc))/1024/1024) - fmt.Printf("System memory: %.3f MB current, %.3f MB peak\n", float64(mem.Sys)/1024/1024, float64(atomic.LoadUint64(&peakMemSys))/1024/1024) - fmt.Printf("Allocations: %.3f million\n", float64(mem.Mallocs)/1000000) - fmt.Printf("GC pause: %v\n\n", time.Duration(mem.PauseTotalNs)) - - if ctx.GlobalIsSet(utils.NoCompactionFlag.Name) { - return nil - } - - // Compact the entire database to more accurately measure disk io and print the stats - start = time.Now() - fmt.Println("Compacting entire database...") - if err = db.LDB().CompactRange(util.Range{}); err != nil { - utils.Fatalf("Compaction failed: %v", err) - } - fmt.Printf("Compaction done in %v.\n\n", time.Since(start)) - - stats, err = db.LDB().GetProperty("leveldb.stats") - if err != nil { - utils.Fatalf("Failed to read database stats: %v", err) - } - fmt.Println(stats) - - ioStats, err = db.LDB().GetProperty("leveldb.iostats") - if err != nil { - utils.Fatalf("Failed to read database iostats: %v", err) - } - fmt.Println(ioStats) - - return nil -} - -func exportChain(ctx *cli.Context) error { - if len(ctx.Args()) < 1 { - utils.Fatalf("This command requires an argument.") - } - stack := makeFullNode(ctx) - chain, _ := utils.MakeChain(ctx, stack) - start := time.Now() - - var err error - fp := ctx.Args().First() - if len(ctx.Args()) < 3 { - err = utils.ExportChain(chain, fp) - } else { - // This can be improved to allow for numbers larger than 9223372036854775807 - first, ferr := strconv.ParseInt(ctx.Args().Get(1), 10, 64) - last, lerr := strconv.ParseInt(ctx.Args().Get(2), 10, 64) - if ferr != nil || lerr != nil { - utils.Fatalf("Export error in parsing parameters: block number not an integer\n") - } - if first < 0 || last < 0 { - utils.Fatalf("Export error: block number must be greater than 0\n") - } - err = utils.ExportAppendChain(chain, fp, uint64(first), uint64(last)) - } - - if err != nil { - utils.Fatalf("Export error: %v\n", err) - } - fmt.Printf("Export done in %v\n", time.Since(start)) - return nil -} - -// importPreimages imports preimage data from the specified file. -func importPreimages(ctx *cli.Context) error { - if len(ctx.Args()) < 1 { - utils.Fatalf("This command requires an argument.") - } - stack := makeFullNode(ctx) - diskdb := utils.MakeChainDatabase(ctx, stack).(*ethdb.LDBDatabase) - - start := time.Now() - if err := utils.ImportPreimages(diskdb, ctx.Args().First()); err != nil { - utils.Fatalf("Import error: %v\n", err) - } - fmt.Printf("Import done in %v\n", time.Since(start)) - return nil -} - -// exportPreimages dumps the preimage data to specified json file in streaming way. -func exportPreimages(ctx *cli.Context) error { - if len(ctx.Args()) < 1 { - utils.Fatalf("This command requires an argument.") - } - stack := makeFullNode(ctx) - diskdb := utils.MakeChainDatabase(ctx, stack).(*ethdb.LDBDatabase) - - start := time.Now() - if err := utils.ExportPreimages(diskdb, ctx.Args().First()); err != nil { - utils.Fatalf("Export error: %v\n", err) - } - fmt.Printf("Export done in %v\n", time.Since(start)) - 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) - - for _, name := range []string{"chaindata", "lightchaindata"} { - // Ensure the database exists in the first place - logger := log.New("database", name) - - dbdir := stack.ResolvePath(name) - if !common.FileExist(dbdir) { - logger.Info("Database doesn't exist, skipping", "path", dbdir) - continue - } - // Confirm removal and execute - fmt.Println(dbdir) - confirm, err := console.Stdin.PromptConfirm("Remove this database?") - switch { - case err != nil: - utils.Fatalf("%v", err) - case !confirm: - logger.Warn("Database deletion aborted") - default: - start := time.Now() - os.RemoveAll(dbdir) - logger.Info("Database successfully deleted", "elapsed", common.PrettyDuration(time.Since(start))) - } - } - return nil -} - -func dump(ctx *cli.Context) error { - stack := makeFullNode(ctx) - chain, chainDb := utils.MakeChain(ctx, stack) - for _, arg := range ctx.Args() { - var block *types.Block - if hashish(arg) { - block = chain.GetBlockByHash(common.HexToHash(arg)) - } else { - num, _ := strconv.Atoi(arg) - block = chain.GetBlockByNumber(uint64(num)) - } - if block == nil { - fmt.Println("{}") - utils.Fatalf("block not found") - } else { - state, err := state.New(block.Root(), state.NewDatabase(chainDb)) - if err != nil { - utils.Fatalf("could not create new state: %v", err) - } - fmt.Printf("%s\n", state.Dump()) - } - } - chainDb.Close() - return nil -} - -// hashish returns true for strings that look like hashes. -func hashish(x string) bool { - _, err := strconv.Atoi(x) - return err != nil -} diff --git a/cmd/gnbai/config.go b/cmd/gnbai/config.go deleted file mode 100644 index 971c617b2264..000000000000 --- a/cmd/gnbai/config.go +++ /dev/null @@ -1,213 +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 ( - "bufio" - "errors" - "fmt" - "math/big" - "os" - "reflect" - "unicode" - - cli "gopkg.in/urfave/cli.v1" - - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/dashboard" - "github.com/nebulaai/nbai-node/eth" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/params" - whisper "github.com/nebulaai/nbai-node/whisper/whisperv6" - "github.com/naoina/toml" -) - -var ( - dumpConfigCommand = cli.Command{ - Action: utils.MigrateFlags(dumpConfig), - Name: "dumpconfig", - Usage: "Show configuration values", - ArgsUsage: "", - Flags: append(append(nodeFlags, rpcFlags...), whisperFlags...), - Category: "MISCELLANEOUS COMMANDS", - Description: `The dumpconfig command shows configuration values.`, - } - - configFileFlag = cli.StringFlag{ - Name: "config", - Usage: "TOML configuration file", - } -) - -// These settings ensure that TOML keys use the same names as Go struct fields. -var tomlSettings = toml.Config{ - NormFieldName: func(rt reflect.Type, key string) string { - return key - }, - FieldToKey: func(rt reflect.Type, field string) string { - return field - }, - MissingField: func(rt reflect.Type, field string) error { - link := "" - if unicode.IsUpper(rune(rt.Name()[0])) && rt.PkgPath() != "main" { - link = fmt.Sprintf(", see https://godoc.org/%s#%s for available fields", rt.PkgPath(), rt.Name()) - } - return fmt.Errorf("field '%s' is not defined in %s%s", field, rt.String(), link) - }, -} - -type ethstatsConfig struct { - URL string `toml:",omitempty"` -} - -type gethConfig struct { - Eth eth.Config - Shh whisper.Config - Node node.Config - Ethstats ethstatsConfig - Dashboard dashboard.Config -} - -func loadConfig(file string, cfg *gethConfig) error { - f, err := os.Open(file) - if err != nil { - return err - } - defer f.Close() - - err = tomlSettings.NewDecoder(bufio.NewReader(f)).Decode(cfg) - // Add file name to errors that have a line number. - if _, ok := err.(*toml.LineError); ok { - err = errors.New(file + ", " + err.Error()) - } - return err -} - -func defaultNodeConfig() node.Config { - cfg := node.DefaultConfig - cfg.Name = clientIdentifier - cfg.Version = params.VersionWithCommit(gitCommit) - cfg.HTTPModules = append(cfg.HTTPModules, "eth", "shh") - cfg.WSModules = append(cfg.WSModules, "eth", "shh") - cfg.IPCPath = "geth.ipc" - return cfg -} - -func makeConfigNode(ctx *cli.Context) (*node.Node, gethConfig) { - // Load defaults. - cfg := gethConfig{ - Eth: eth.DefaultConfig, - Shh: whisper.DefaultConfig, - Node: defaultNodeConfig(), - Dashboard: dashboard.DefaultConfig, - } - - // Load config file. - if file := ctx.GlobalString(configFileFlag.Name); file != "" { - if err := loadConfig(file, &cfg); err != nil { - utils.Fatalf("%v", err) - } - } - - // Apply flags. - utils.SetNodeConfig(ctx, &cfg.Node) - stack, err := node.New(&cfg.Node) - if err != nil { - utils.Fatalf("Failed to create the protocol stack: %v", err) - } - utils.SetEthConfig(ctx, stack, &cfg.Eth) - if ctx.GlobalIsSet(utils.EthStatsURLFlag.Name) { - cfg.Ethstats.URL = ctx.GlobalString(utils.EthStatsURLFlag.Name) - } - - utils.SetShhConfig(ctx, stack, &cfg.Shh) - utils.SetDashboardConfig(ctx, &cfg.Dashboard) - - return stack, cfg -} - -// enableWhisper returns true in case one of the whisper flags is set. -func enableWhisper(ctx *cli.Context) bool { - for _, flag := range whisperFlags { - if ctx.GlobalIsSet(flag.GetName()) { - return true - } - } - return false -} - -func makeFullNode(ctx *cli.Context) *node.Node { - stack, cfg := makeConfigNode(ctx) - if ctx.GlobalIsSet(utils.ConstantinopleOverrideFlag.Name) { - cfg.Eth.ConstantinopleOverride = new(big.Int).SetUint64(ctx.GlobalUint64(utils.ConstantinopleOverrideFlag.Name)) - } - utils.RegisterEthService(stack, &cfg.Eth) - - if ctx.GlobalBool(utils.DashboardEnabledFlag.Name) { - utils.RegisterDashboardService(stack, &cfg.Dashboard, gitCommit) - } - // Whisper must be explicitly enabled by specifying at least 1 whisper flag or in dev mode - shhEnabled := enableWhisper(ctx) - shhAutoEnabled := !ctx.GlobalIsSet(utils.WhisperEnabledFlag.Name) && ctx.GlobalIsSet(utils.DeveloperFlag.Name) - if shhEnabled || shhAutoEnabled { - if ctx.GlobalIsSet(utils.WhisperMaxMessageSizeFlag.Name) { - cfg.Shh.MaxMessageSize = uint32(ctx.Int(utils.WhisperMaxMessageSizeFlag.Name)) - } - if ctx.GlobalIsSet(utils.WhisperMinPOWFlag.Name) { - cfg.Shh.MinimumAcceptedPOW = ctx.Float64(utils.WhisperMinPOWFlag.Name) - } - if ctx.GlobalIsSet(utils.WhisperRestrictConnectionBetweenLightClientsFlag.Name) { - cfg.Shh.RestrictConnectionBetweenLightClients = true - } - utils.RegisterShhService(stack, &cfg.Shh) - } - - // Add the Ethereum Stats daemon if requested. - if cfg.Ethstats.URL != "" { - utils.RegisterEthStatsService(stack, cfg.Ethstats.URL) - } - return stack -} - -// dumpConfig is the dumpconfig command. -func dumpConfig(ctx *cli.Context) error { - _, cfg := makeConfigNode(ctx) - comment := "" - - if cfg.Eth.Genesis != nil { - cfg.Eth.Genesis = nil - comment += "# Note: this config doesn't contain the genesis block.\n\n" - } - - out, err := tomlSettings.Marshal(&cfg) - if err != nil { - return err - } - - dump := os.Stdout - if ctx.NArg() > 0 { - dump, err = os.OpenFile(ctx.Args().Get(0), os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) - if err != nil { - return err - } - defer dump.Close() - } - dump.WriteString(comment) - dump.Write(out) - - return nil -} diff --git a/cmd/gnbai/main.go b/cmd/gnbai/main.go deleted file mode 100644 index 3ff1d6636b84..000000000000 --- a/cmd/gnbai/main.go +++ /dev/null @@ -1,358 +0,0 @@ -// Copyright 2014 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 . - -// geth is the official command-line client for Ethereum. -package main - -import ( - "fmt" - "math" - "os" - godebug "runtime/debug" - "sort" - "strconv" - "strings" - "time" - - "github.com/elastic/gosigar" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/console" - "github.com/nebulaai/nbai-node/eth" - "github.com/nebulaai/nbai-node/ethclient" - "github.com/nebulaai/nbai-node/internal/debug" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/node" - "gopkg.in/urfave/cli.v1" -) - -const ( - clientIdentifier = "gnbai" // Client identifier to advertise over the network -) - -var ( - // Git SHA1 commit hash of the release (set via linker flags) - gitCommit = "" - // The app that holds all commands and flags. - app = utils.NewApp(gitCommit, "the go-nbai command line interface") - // flags that configure the node - nodeFlags = []cli.Flag{ - utils.IdentityFlag, - utils.UnlockedAccountFlag, - utils.PasswordFileFlag, - utils.BootnodesFlag, - utils.BootnodesV4Flag, - utils.BootnodesV5Flag, - utils.DataDirFlag, - utils.KeyStoreDirFlag, - utils.NoUSBFlag, - utils.DashboardEnabledFlag, - utils.DashboardAddrFlag, - utils.DashboardPortFlag, - utils.DashboardRefreshFlag, - utils.EthashCacheDirFlag, - utils.EthashCachesInMemoryFlag, - utils.EthashCachesOnDiskFlag, - utils.EthashDatasetDirFlag, - utils.EthashDatasetsInMemoryFlag, - utils.EthashDatasetsOnDiskFlag, - utils.TxPoolLocalsFlag, - utils.TxPoolNoLocalsFlag, - utils.TxPoolJournalFlag, - utils.TxPoolRejournalFlag, - utils.TxPoolPriceLimitFlag, - utils.TxPoolPriceBumpFlag, - utils.TxPoolAccountSlotsFlag, - utils.TxPoolGlobalSlotsFlag, - utils.TxPoolAccountQueueFlag, - utils.TxPoolGlobalQueueFlag, - utils.TxPoolLifetimeFlag, - utils.SyncModeFlag, - utils.GCModeFlag, - utils.LightServFlag, - utils.LightPeersFlag, - utils.LightKDFFlag, - utils.WhitelistFlag, - utils.CacheFlag, - utils.CacheDatabaseFlag, - utils.CacheTrieFlag, - utils.CacheGCFlag, - utils.TrieCacheGenFlag, - utils.ListenPortFlag, - utils.MaxPeersFlag, - utils.MaxPendingPeersFlag, - utils.MiningEnabledFlag, - utils.MinerThreadsFlag, - utils.MinerLegacyThreadsFlag, - utils.MinerNotifyFlag, - utils.MinerGasTargetFlag, - utils.MinerLegacyGasTargetFlag, - utils.MinerGasLimitFlag, - utils.MinerGasPriceFlag, - utils.MinerLegacyGasPriceFlag, - utils.MinerEtherbaseFlag, - utils.MinerLegacyEtherbaseFlag, - utils.MinerExtraDataFlag, - utils.MinerLegacyExtraDataFlag, - utils.MinerRecommitIntervalFlag, - utils.MinerNoVerfiyFlag, - utils.NATFlag, - utils.NoDiscoverFlag, - utils.DiscoveryV5Flag, - utils.NetrestrictFlag, - utils.NodeKeyFileFlag, - utils.NodeKeyHexFlag, - utils.DeveloperFlag, - utils.DeveloperPeriodFlag, - utils.TestnetFlag, - utils.RinkebyFlag, - utils.VMEnableDebugFlag, - utils.NetworkIdFlag, - utils.ConstantinopleOverrideFlag, - utils.RPCCORSDomainFlag, - utils.RPCVirtualHostsFlag, - utils.EthStatsURLFlag, - utils.MetricsEnabledFlag, - utils.FakePoWFlag, - utils.NoCompactionFlag, - utils.GpoBlocksFlag, - utils.GpoPercentileFlag, - utils.EWASMInterpreterFlag, - utils.EVMInterpreterFlag, - configFileFlag, - } - - rpcFlags = []cli.Flag{ - utils.RPCEnabledFlag, - utils.RPCListenAddrFlag, - utils.RPCPortFlag, - utils.RPCApiFlag, - utils.WSEnabledFlag, - utils.WSListenAddrFlag, - utils.WSPortFlag, - utils.WSApiFlag, - utils.WSAllowedOriginsFlag, - utils.IPCDisabledFlag, - utils.IPCPathFlag, - } - - whisperFlags = []cli.Flag{ - utils.WhisperEnabledFlag, - utils.WhisperMaxMessageSizeFlag, - utils.WhisperMinPOWFlag, - utils.WhisperRestrictConnectionBetweenLightClientsFlag, - } - - metricsFlags = []cli.Flag{ - utils.MetricsEnableInfluxDBFlag, - utils.MetricsInfluxDBEndpointFlag, - utils.MetricsInfluxDBDatabaseFlag, - utils.MetricsInfluxDBUsernameFlag, - utils.MetricsInfluxDBPasswordFlag, - utils.MetricsInfluxDBHostTagFlag, - } -) - -func init() { - // Initialize the CLI app and start Geth - app.Action = geth - app.HideVersion = true // we have a command to print the version - app.Copyright = "Copyright 2017-2018 The go-nbai Authors" - app.Commands = []cli.Command{ - // See chaincmd.go: - initCommand, - importCommand, - exportCommand, - importPreimagesCommand, - exportPreimagesCommand, - copydbCommand, - removedbCommand, - dumpCommand, - // See monitorcmd.go: - monitorCommand, - // See accountcmd.go: - accountCommand, - walletCommand, - // See consolecmd.go: - consoleCommand, - attachCommand, - javascriptCommand, - // See misccmd.go: - makecacheCommand, - makedagCommand, - versionCommand, - bugCommand, - licenseCommand, - // See config.go - dumpConfigCommand, - } - sort.Sort(cli.CommandsByName(app.Commands)) - - app.Flags = append(app.Flags, nodeFlags...) - app.Flags = append(app.Flags, rpcFlags...) - app.Flags = append(app.Flags, consoleFlags...) - app.Flags = append(app.Flags, debug.Flags...) - app.Flags = append(app.Flags, whisperFlags...) - app.Flags = append(app.Flags, metricsFlags...) - - app.Before = func(ctx *cli.Context) error { - logdir := "" - if ctx.GlobalBool(utils.DashboardEnabledFlag.Name) { - logdir = (&node.Config{DataDir: utils.MakeDataDir(ctx)}).ResolvePath("logs") - } - if err := debug.Setup(ctx, logdir); err != nil { - return err - } - // Cap the cache allowance and tune the garbage collector - var mem gosigar.Mem - if err := mem.Get(); err == nil { - allowance := int(mem.Total / 1024 / 1024 / 3) - if cache := ctx.GlobalInt(utils.CacheFlag.Name); cache > allowance { - log.Warn("Sanitizing cache to Go's GC limits", "provided", cache, "updated", allowance) - ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(allowance)) - } - } - // Ensure Go's GC ignores the database cache for trigger percentage - cache := ctx.GlobalInt(utils.CacheFlag.Name) - gogc := math.Max(20, math.Min(100, 100/(float64(cache)/1024))) - - log.Debug("Sanitizing Go's GC trigger", "percent", int(gogc)) - godebug.SetGCPercent(int(gogc)) - - // Start metrics export if enabled - utils.SetupMetrics(ctx) - - // Start system runtime metrics collection - go metrics.CollectProcessMetrics(3 * time.Second) - - return nil - } - - app.After = func(ctx *cli.Context) error { - debug.Exit() - console.Stdin.Close() // Resets terminal mode. - return nil - } -} - -func main() { - if err := app.Run(os.Args); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -// geth is the main entry point into the system if no special subcommand is ran. -// It creates a default node based on the command line arguments and runs it in -// blocking mode, waiting for it to be shut down. -func geth(ctx *cli.Context) error { - if args := ctx.Args(); len(args) > 0 { - return fmt.Errorf("invalid command: %q", args[0]) - } - node := makeFullNode(ctx) - startNode(ctx, node) - node.Wait() - return nil -} - -// startNode boots up the system node and all registered protocols, after which -// it unlocks any requested accounts, and starts the RPC/IPC interfaces and the -// miner. -func startNode(ctx *cli.Context, stack *node.Node) { - debug.Memsize.Add("node", stack) - - // Start up the node itself - utils.StartNode(stack) - - // Unlock any account specifically requested - ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) - - passwords := utils.MakePasswordList(ctx) - unlocks := strings.Split(ctx.GlobalString(utils.UnlockedAccountFlag.Name), ",") - for i, account := range unlocks { - if trimmed := strings.TrimSpace(account); trimmed != "" { - unlockAccount(ctx, ks, trimmed, i, passwords) - } - } - // Register wallet event handlers to open and auto-derive wallets - events := make(chan accounts.WalletEvent, 16) - stack.AccountManager().Subscribe(events) - - go func() { - // Create a chain state reader for self-derivation - rpcClient, err := stack.Attach() - if err != nil { - utils.Fatalf("Failed to attach to self: %v", err) - } - stateReader := ethclient.NewClient(rpcClient) - - // 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) - } - } - // Listen for wallet event till termination - for event := range events { - 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) - - derivationPath := accounts.DefaultBaseDerivationPath - if event.Wallet.URL().Scheme == "ledger" { - derivationPath = accounts.DefaultLedgerBaseDerivationPath - } - event.Wallet.SelfDerive(derivationPath, stateReader) - - 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) || ctx.GlobalBool(utils.DeveloperFlag.Name) { - // Mining only makes sense if a full Ethereum node is running - if ctx.GlobalString(utils.SyncModeFlag.Name) == "light" { - utils.Fatalf("Light clients do not support mining") - } - var ethereum *eth.Ethereum - if err := stack.Service(ðereum); err != nil { - utils.Fatalf("NBAI service not running: %v", err) - } - // Set the gas price to the limits from the CLI and start mining - gasprice := utils.GlobalBig(ctx, utils.MinerLegacyGasPriceFlag.Name) - if ctx.IsSet(utils.MinerGasPriceFlag.Name) { - gasprice = utils.GlobalBig(ctx, utils.MinerGasPriceFlag.Name) - } - ethereum.TxPool().SetGasPrice(gasprice) - - threads := ctx.GlobalInt(utils.MinerLegacyThreadsFlag.Name) - if ctx.GlobalIsSet(utils.MinerThreadsFlag.Name) { - threads = ctx.GlobalInt(utils.MinerThreadsFlag.Name) - } - if err := ethereum.StartMining(threads); err != nil { - utils.Fatalf("Failed to start mining: %v", err) - } - } -} diff --git a/cmd/gnbai/monitorcmd.go b/cmd/gnbai/monitorcmd.go deleted file mode 100644 index 8d82d3b5cf0d..000000000000 --- a/cmd/gnbai/monitorcmd.go +++ /dev/null @@ -1,351 +0,0 @@ -// Copyright 2015 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" - "math" - "reflect" - "runtime" - "sort" - "strings" - "time" - - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/rpc" - "github.com/gizak/termui" - "gopkg.in/urfave/cli.v1" -) - -var ( - monitorCommandAttachFlag = cli.StringFlag{ - Name: "attach", - Value: node.DefaultIPCEndpoint(clientIdentifier), - Usage: "API endpoint to attach to", - } - monitorCommandRowsFlag = cli.IntFlag{ - Name: "rows", - Value: 5, - Usage: "Maximum rows in the chart grid", - } - monitorCommandRefreshFlag = cli.IntFlag{ - Name: "refresh", - Value: 3, - Usage: "Refresh interval in seconds", - } - monitorCommand = cli.Command{ - Action: utils.MigrateFlags(monitor), // keep track of migration progress - Name: "monitor", - Usage: "Monitor and visualize node metrics", - ArgsUsage: " ", - Category: "MONITOR COMMANDS", - Description: ` -The Geth monitor is a tool to collect and visualize various internal metrics -gathered by the node, supporting different chart types as well as the capacity -to display multiple metrics simultaneously. -`, - Flags: []cli.Flag{ - monitorCommandAttachFlag, - monitorCommandRowsFlag, - monitorCommandRefreshFlag, - }, - } -) - -// monitor starts a terminal UI based monitoring tool for the requested metrics. -func monitor(ctx *cli.Context) error { - var ( - client *rpc.Client - err error - ) - // Attach to an Ethereum node over IPC or RPC - endpoint := ctx.String(monitorCommandAttachFlag.Name) - if client, err = dialRPC(endpoint); err != nil { - utils.Fatalf("Unable to attach to geth node: %v", err) - } - defer client.Close() - - // Retrieve all the available metrics and resolve the user pattens - metrics, err := retrieveMetrics(client) - if err != nil { - utils.Fatalf("Failed to retrieve system metrics: %v", err) - } - monitored := resolveMetrics(metrics, ctx.Args()) - if len(monitored) == 0 { - list := expandMetrics(metrics, "") - sort.Strings(list) - - if len(list) > 0 { - utils.Fatalf("No metrics specified.\n\nAvailable:\n - %s", strings.Join(list, "\n - ")) - } else { - utils.Fatalf("No metrics collected by geth (--%s).\n", utils.MetricsEnabledFlag.Name) - } - } - sort.Strings(monitored) - if cols := len(monitored) / ctx.Int(monitorCommandRowsFlag.Name); cols > 6 { - utils.Fatalf("Requested metrics (%d) spans more that 6 columns:\n - %s", len(monitored), strings.Join(monitored, "\n - ")) - } - // Create and configure the chart UI defaults - if err := termui.Init(); err != nil { - utils.Fatalf("Unable to initialize terminal UI: %v", err) - } - defer termui.Close() - - rows := len(monitored) - if max := ctx.Int(monitorCommandRowsFlag.Name); rows > max { - rows = max - } - cols := (len(monitored) + rows - 1) / rows - for i := 0; i < rows; i++ { - termui.Body.AddRows(termui.NewRow()) - } - // Create each individual data chart - footer := termui.NewPar("") - footer.Block.Border = true - footer.Height = 3 - - charts := make([]*termui.LineChart, len(monitored)) - units := make([]int, len(monitored)) - data := make([][]float64, len(monitored)) - for i := 0; i < len(monitored); i++ { - charts[i] = createChart((termui.TermHeight() - footer.Height) / rows) - row := termui.Body.Rows[i%rows] - row.Cols = append(row.Cols, termui.NewCol(12/cols, 0, charts[i])) - } - termui.Body.AddRows(termui.NewRow(termui.NewCol(12, 0, footer))) - - refreshCharts(client, monitored, data, units, charts, ctx, footer) - termui.Body.Align() - termui.Render(termui.Body) - - // Watch for various system events, and periodically refresh the charts - termui.Handle("/sys/kbd/C-c", func(termui.Event) { - termui.StopLoop() - }) - termui.Handle("/sys/wnd/resize", func(termui.Event) { - termui.Body.Width = termui.TermWidth() - for _, chart := range charts { - chart.Height = (termui.TermHeight() - footer.Height) / rows - } - termui.Body.Align() - termui.Render(termui.Body) - }) - go func() { - tick := time.NewTicker(time.Duration(ctx.Int(monitorCommandRefreshFlag.Name)) * time.Second) - for range tick.C { - if refreshCharts(client, monitored, data, units, charts, ctx, footer) { - termui.Body.Align() - } - termui.Render(termui.Body) - } - }() - termui.Loop() - return nil -} - -// retrieveMetrics contacts the attached geth node and retrieves the entire set -// of collected system metrics. -func retrieveMetrics(client *rpc.Client) (map[string]interface{}, error) { - var metrics map[string]interface{} - err := client.Call(&metrics, "debug_metrics", true) - return metrics, err -} - -// resolveMetrics takes a list of input metric patterns, and resolves each to one -// or more canonical metric names. -func resolveMetrics(metrics map[string]interface{}, patterns []string) []string { - res := []string{} - for _, pattern := range patterns { - res = append(res, resolveMetric(metrics, pattern, "")...) - } - return res -} - -// resolveMetrics takes a single of input metric pattern, and resolves it to one -// or more canonical metric names. -func resolveMetric(metrics map[string]interface{}, pattern string, path string) []string { - results := []string{} - - // If a nested metric was requested, recurse optionally branching (via comma) - parts := strings.SplitN(pattern, "/", 2) - if len(parts) > 1 { - for _, variation := range strings.Split(parts[0], ",") { - submetrics, ok := metrics[variation].(map[string]interface{}) - if !ok { - utils.Fatalf("Failed to retrieve system metrics: %s", path+variation) - return nil - } - results = append(results, resolveMetric(submetrics, parts[1], path+variation+"/")...) - } - return results - } - // Depending what the last link is, return or expand - for _, variation := range strings.Split(pattern, ",") { - switch metric := metrics[variation].(type) { - case float64: - // Final metric value found, return as singleton - results = append(results, path+variation) - - case map[string]interface{}: - results = append(results, expandMetrics(metric, path+variation+"/")...) - - default: - utils.Fatalf("Metric pattern resolved to unexpected type: %v", reflect.TypeOf(metric)) - return nil - } - } - return results -} - -// expandMetrics expands the entire tree of metrics into a flat list of paths. -func expandMetrics(metrics map[string]interface{}, path string) []string { - // Iterate over all fields and expand individually - list := []string{} - for name, metric := range metrics { - switch metric := metric.(type) { - case float64: - // Final metric value found, append to list - list = append(list, path+name) - - case map[string]interface{}: - // Tree of metrics found, expand recursively - list = append(list, expandMetrics(metric, path+name+"/")...) - - default: - utils.Fatalf("Metric pattern %s resolved to unexpected type: %v", path+name, reflect.TypeOf(metric)) - return nil - } - } - return list -} - -// fetchMetric iterates over the metrics map and retrieves a specific one. -func fetchMetric(metrics map[string]interface{}, metric string) float64 { - parts := strings.Split(metric, "/") - for _, part := range parts[:len(parts)-1] { - var found bool - metrics, found = metrics[part].(map[string]interface{}) - if !found { - return 0 - } - } - if v, ok := metrics[parts[len(parts)-1]].(float64); ok { - return v - } - return 0 -} - -// refreshCharts retrieves a next batch of metrics, and inserts all the new -// values into the active datasets and charts -func refreshCharts(client *rpc.Client, metrics []string, data [][]float64, units []int, charts []*termui.LineChart, ctx *cli.Context, footer *termui.Par) (realign bool) { - values, err := retrieveMetrics(client) - for i, metric := range metrics { - if len(data) < 512 { - data[i] = append([]float64{fetchMetric(values, metric)}, data[i]...) - } else { - data[i] = append([]float64{fetchMetric(values, metric)}, data[i][:len(data[i])-1]...) - } - if updateChart(metric, data[i], &units[i], charts[i], err) { - realign = true - } - } - updateFooter(ctx, err, footer) - return -} - -// updateChart inserts a dataset into a line chart, scaling appropriately as to -// not display weird labels, also updating the chart label accordingly. -func updateChart(metric string, data []float64, base *int, chart *termui.LineChart, err error) (realign bool) { - dataUnits := []string{"", "K", "M", "G", "T", "E"} - timeUnits := []string{"ns", "µs", "ms", "s", "ks", "ms"} - colors := []termui.Attribute{termui.ColorBlue, termui.ColorCyan, termui.ColorGreen, termui.ColorYellow, termui.ColorRed, termui.ColorRed} - - // Extract only part of the data that's actually visible - if chart.Width*2 < len(data) { - data = data[:chart.Width*2] - } - // Find the maximum value and scale under 1K - high := 0.0 - if len(data) > 0 { - high = data[0] - for _, value := range data[1:] { - high = math.Max(high, value) - } - } - unit, scale := 0, 1.0 - for high >= 1000 && unit+1 < len(dataUnits) { - high, unit, scale = high/1000, unit+1, scale*1000 - } - // If the unit changes, re-create the chart (hack to set max height...) - if unit != *base { - realign, *base, *chart = true, unit, *createChart(chart.Height) - } - // Update the chart's data points with the scaled values - if cap(chart.Data) < len(data) { - chart.Data = make([]float64, len(data)) - } - chart.Data = chart.Data[:len(data)] - for i, value := range data { - chart.Data[i] = value / scale - } - // Update the chart's label with the scale units - units := dataUnits - if strings.Contains(metric, "/Percentiles/") || strings.Contains(metric, "/pauses/") || strings.Contains(metric, "/time/") { - units = timeUnits - } - chart.BorderLabel = metric - if len(units[unit]) > 0 { - chart.BorderLabel += " [" + units[unit] + "]" - } - chart.LineColor = colors[unit] | termui.AttrBold - if err != nil { - chart.LineColor = termui.ColorRed | termui.AttrBold - } - return -} - -// createChart creates an empty line chart with the default configs. -func createChart(height int) *termui.LineChart { - chart := termui.NewLineChart() - if runtime.GOOS == "windows" { - chart.Mode = "dot" - } - chart.DataLabels = []string{""} - chart.Height = height - chart.AxesColor = termui.ColorWhite - chart.PaddingBottom = -2 - - chart.BorderLabelFg = chart.BorderFg | termui.AttrBold - chart.BorderFg = chart.BorderBg - - return chart -} - -// updateFooter updates the footer contents based on any encountered errors. -func updateFooter(ctx *cli.Context, err error, footer *termui.Par) { - // Generate the basic footer - refresh := time.Duration(ctx.Int(monitorCommandRefreshFlag.Name)) * time.Second - footer.Text = fmt.Sprintf("Press Ctrl+C to quit. Refresh interval: %v.", refresh) - footer.TextFgColor = termui.ThemeAttr("par.fg") | termui.AttrBold - - // Append any encountered errors - if err != nil { - footer.Text = fmt.Sprintf("Error: %v.", err) - footer.TextFgColor = termui.ColorRed | termui.AttrBold - } -} diff --git a/cmd/gnbai/run_test.go b/cmd/gnbai/run_test.go deleted file mode 100644 index 0e4d03716ab6..000000000000 --- a/cmd/gnbai/run_test.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2016 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/ioutil" - "os" - "testing" - - "github.com/docker/docker/pkg/reexec" - "github.com/nebulaai/nbai-node/internal/cmdtest" -) - -func tmpdir(t *testing.T) string { - dir, err := ioutil.TempDir("", "geth-test") - if err != nil { - t.Fatal(err) - } - return dir -} - -type testgeth struct { - *cmdtest.TestCmd - - // template variables for expect - Datadir string - Etherbase string -} - -func init() { - // Run the app if we've been exec'd as "geth-test" in runGeth. - reexec.Register("geth-test", func() { - if err := app.Run(os.Args); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - os.Exit(0) - }) -} - -func TestMain(m *testing.M) { - // check if we have been reexec'd - if reexec.Init() { - return - } - os.Exit(m.Run()) -} - -// spawns geth with the given command line args. If the args don't set --datadir, the -// child g gets a temporary data directory. -func runGeth(t *testing.T, args ...string) *testgeth { - tt := &testgeth{} - tt.TestCmd = cmdtest.NewTestCmd(t, tt) - for i, arg := range args { - switch { - case arg == "-datadir" || arg == "--datadir": - if i < len(args)-1 { - tt.Datadir = args[i+1] - } - case arg == "-etherbase" || arg == "--etherbase": - if i < len(args)-1 { - tt.Etherbase = args[i+1] - } - } - } - if tt.Datadir == "" { - tt.Datadir = tmpdir(t) - tt.Cleanup = func() { os.RemoveAll(tt.Datadir) } - args = append([]string{"-datadir", tt.Datadir}, args...) - // Remove the temporary datadir if something fails below. - defer func() { - if t.Failed() { - tt.Cleanup() - } - }() - } - - // Boot "geth". This actually runs the test binary but the TestMain - // function will prevent any tests from running. - tt.Run("geth-test", args...) - - return tt -} diff --git a/cmd/internal/browser/browser.go b/cmd/internal/browser/browser.go deleted file mode 100644 index 897086f47177..000000000000 --- a/cmd/internal/browser/browser.go +++ /dev/null @@ -1,46 +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. - -// Package browser provides utilities for interacting with users' browsers. -package browser - -import ( - "os" - "os/exec" - "runtime" -) - -// Commands returns a list of possible commands to use to open a url. -func Commands() [][]string { - var cmds [][]string - if exe := os.Getenv("BROWSER"); exe != "" { - cmds = append(cmds, []string{exe}) - } - switch runtime.GOOS { - case "darwin": - cmds = append(cmds, []string{"/usr/bin/open"}) - case "windows": - cmds = append(cmds, []string{"cmd", "/c", "start"}) - default: - cmds = append(cmds, []string{"xdg-open"}) - } - cmds = append(cmds, - []string{"chrome"}, - []string{"google-chrome"}, - []string{"chromium"}, - []string{"firefox"}, - ) - return cmds -} - -// Open tries to open url in a browser and reports whether it succeeded. -func Open(url string) bool { - for _, args := range Commands() { - cmd := exec.Command(args[0], append(args[1:], url)...) - if cmd.Start() == nil { - return true - } - } - return false -} diff --git a/cmd/p2psim/main.go b/cmd/p2psim/main.go index 8ebeaa2614d7..f2c1bf970350 100644 --- a/cmd/p2psim/main.go +++ b/cmd/p2psim/main.go @@ -45,12 +45,12 @@ import ( "strings" "text/tabwriter" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/simulations" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" + "github.com/ethereum/go-ethereum/rpc" "gopkg.in/urfave/cli.v1" ) diff --git a/cmd/puppeth/genesis.go b/cmd/puppeth/genesis.go index 3626adbf2b74..b3e1709dbf4f 100644 --- a/cmd/puppeth/genesis.go +++ b/cmd/puppeth/genesis.go @@ -17,18 +17,18 @@ package main import ( - "encoding/binary" "errors" "math" "math/big" "strings" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - math2 "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + math2 "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" ) // alethGenesisSpec represents the genesis specification format used by the @@ -36,36 +36,38 @@ import ( type alethGenesisSpec struct { SealEngine string `json:"sealEngine"` Params struct { - AccountStartNonce math2.HexOrDecimal64 `json:"accountStartNonce"` - MaximumExtraDataSize hexutil.Uint64 `json:"maximumExtraDataSize"` - HomesteadForkBlock hexutil.Uint64 `json:"homesteadForkBlock"` - DaoHardforkBlock math2.HexOrDecimal64 `json:"daoHardforkBlock"` - EIP150ForkBlock hexutil.Uint64 `json:"EIP150ForkBlock"` - EIP158ForkBlock hexutil.Uint64 `json:"EIP158ForkBlock"` - ByzantiumForkBlock hexutil.Uint64 `json:"byzantiumForkBlock"` - ConstantinopleForkBlock hexutil.Uint64 `json:"constantinopleForkBlock"` - MinGasLimit hexutil.Uint64 `json:"minGasLimit"` - MaxGasLimit hexutil.Uint64 `json:"maxGasLimit"` - TieBreakingGas bool `json:"tieBreakingGas"` - GasLimitBoundDivisor math2.HexOrDecimal64 `json:"gasLimitBoundDivisor"` - MinimumDifficulty *hexutil.Big `json:"minimumDifficulty"` - DifficultyBoundDivisor *math2.HexOrDecimal256 `json:"difficultyBoundDivisor"` - DurationLimit *math2.HexOrDecimal256 `json:"durationLimit"` - BlockReward *hexutil.Big `json:"blockReward"` - NetworkID hexutil.Uint64 `json:"networkID"` - ChainID hexutil.Uint64 `json:"chainID"` - AllowFutureBlocks bool `json:"allowFutureBlocks"` + AccountStartNonce math2.HexOrDecimal64 `json:"accountStartNonce"` + MaximumExtraDataSize hexutil.Uint64 `json:"maximumExtraDataSize"` + HomesteadForkBlock *hexutil.Big `json:"homesteadForkBlock,omitempty"` + DaoHardforkBlock math2.HexOrDecimal64 `json:"daoHardforkBlock"` + EIP150ForkBlock *hexutil.Big `json:"EIP150ForkBlock,omitempty"` + EIP158ForkBlock *hexutil.Big `json:"EIP158ForkBlock,omitempty"` + ByzantiumForkBlock *hexutil.Big `json:"byzantiumForkBlock,omitempty"` + ConstantinopleForkBlock *hexutil.Big `json:"constantinopleForkBlock,omitempty"` + ConstantinopleFixForkBlock *hexutil.Big `json:"constantinopleFixForkBlock,omitempty"` + IstanbulForkBlock *hexutil.Big `json:"istanbulForkBlock,omitempty"` + MinGasLimit hexutil.Uint64 `json:"minGasLimit"` + MaxGasLimit hexutil.Uint64 `json:"maxGasLimit"` + TieBreakingGas bool `json:"tieBreakingGas"` + GasLimitBoundDivisor math2.HexOrDecimal64 `json:"gasLimitBoundDivisor"` + MinimumDifficulty *hexutil.Big `json:"minimumDifficulty"` + DifficultyBoundDivisor *math2.HexOrDecimal256 `json:"difficultyBoundDivisor"` + DurationLimit *math2.HexOrDecimal256 `json:"durationLimit"` + BlockReward *hexutil.Big `json:"blockReward"` + NetworkID hexutil.Uint64 `json:"networkID"` + ChainID hexutil.Uint64 `json:"chainID"` + AllowFutureBlocks bool `json:"allowFutureBlocks"` } `json:"params"` Genesis struct { - Nonce hexutil.Bytes `json:"nonce"` - Difficulty *hexutil.Big `json:"difficulty"` - MixHash common.Hash `json:"mixHash"` - Author common.Address `json:"author"` - Timestamp hexutil.Uint64 `json:"timestamp"` - ParentHash common.Hash `json:"parentHash"` - ExtraData hexutil.Bytes `json:"extraData"` - GasLimit hexutil.Uint64 `json:"gasLimit"` + Nonce types.BlockNonce `json:"nonce"` + Difficulty *hexutil.Big `json:"difficulty"` + MixHash common.Hash `json:"mixHash"` + Author common.Address `json:"author"` + Timestamp hexutil.Uint64 `json:"timestamp"` + ParentHash common.Hash `json:"parentHash"` + ExtraData hexutil.Bytes `json:"extraData"` + GasLimit hexutil.Uint64 `json:"gasLimit"` } `json:"genesis"` Accounts map[common.UnprefixedAddress]*alethGenesisSpecAccount `json:"accounts"` @@ -74,7 +76,7 @@ type alethGenesisSpec struct { // alethGenesisSpecAccount is the prefunded genesis account and/or precompiled // contract definition. type alethGenesisSpecAccount struct { - Balance *math2.HexOrDecimal256 `json:"balance"` + Balance *math2.HexOrDecimal256 `json:"balance,omitempty"` Nonce uint64 `json:"nonce,omitempty"` Precompiled *alethGenesisSpecBuiltin `json:"precompiled,omitempty"` } @@ -82,7 +84,7 @@ type alethGenesisSpecAccount struct { // alethGenesisSpecBuiltin is the precompiled contract definition. type alethGenesisSpecBuiltin struct { Name string `json:"name,omitempty"` - StartingBlock hexutil.Uint64 `json:"startingBlock,omitempty"` + StartingBlock *hexutil.Big `json:"startingBlock,omitempty"` Linear *alethGenesisSpecLinearPricing `json:"linear,omitempty"` } @@ -106,21 +108,33 @@ func newAlethGenesisSpec(network string, genesis *core.Genesis) (*alethGenesisSp spec.Params.AccountStartNonce = 0 spec.Params.TieBreakingGas = false spec.Params.AllowFutureBlocks = false - spec.Params.DaoHardforkBlock = 0 - spec.Params.HomesteadForkBlock = (hexutil.Uint64)(genesis.Config.HomesteadBlock.Uint64()) - spec.Params.EIP150ForkBlock = (hexutil.Uint64)(genesis.Config.EIP150Block.Uint64()) - spec.Params.EIP158ForkBlock = (hexutil.Uint64)(genesis.Config.EIP158Block.Uint64()) + // Dao hardfork block is a special one. The fork block is listed as 0 in the + // config but aleth will sync with ETC clients up until the actual dao hard + // fork block. + spec.Params.DaoHardforkBlock = 0 - // Byzantium + if num := genesis.Config.HomesteadBlock; num != nil { + spec.Params.HomesteadForkBlock = (*hexutil.Big)(num) + } + if num := genesis.Config.EIP150Block; num != nil { + spec.Params.EIP150ForkBlock = (*hexutil.Big)(num) + } + if num := genesis.Config.EIP158Block; num != nil { + spec.Params.EIP158ForkBlock = (*hexutil.Big)(num) + } if num := genesis.Config.ByzantiumBlock; num != nil { - spec.setByzantium(num) + spec.Params.ByzantiumForkBlock = (*hexutil.Big)(num) } - // Constantinople if num := genesis.Config.ConstantinopleBlock; num != nil { - spec.setConstantinople(num) + spec.Params.ConstantinopleForkBlock = (*hexutil.Big)(num) + } + if num := genesis.Config.PetersburgBlock; num != nil { + spec.Params.ConstantinopleFixForkBlock = (*hexutil.Big)(num) + } + if num := genesis.Config.IstanbulBlock; num != nil { + spec.Params.IstanbulForkBlock = (*hexutil.Big)(num) } - spec.Params.NetworkID = (hexutil.Uint64)(genesis.Config.ChainID.Uint64()) spec.Params.ChainID = (hexutil.Uint64)(genesis.Config.ChainID.Uint64()) spec.Params.MaximumExtraDataSize = (hexutil.Uint64)(params.MaximumExtraDataSize) @@ -132,9 +146,7 @@ func newAlethGenesisSpec(network string, genesis *core.Genesis) (*alethGenesisSp spec.Params.DurationLimit = (*math2.HexOrDecimal256)(params.DurationLimit) spec.Params.BlockReward = (*hexutil.Big)(ethash.FrontierBlockReward) - spec.Genesis.Nonce = (hexutil.Bytes)(make([]byte, 8)) - binary.LittleEndian.PutUint64(spec.Genesis.Nonce[:], genesis.Nonce) - + spec.Genesis.Nonce = types.EncodeNonce(genesis.Nonce) spec.Genesis.MixHash = genesis.Mixhash spec.Genesis.Difficulty = (*hexutil.Big)(genesis.Difficulty) spec.Genesis.Author = genesis.Coinbase @@ -157,15 +169,32 @@ func newAlethGenesisSpec(network string, genesis *core.Genesis) (*alethGenesisSp Linear: &alethGenesisSpecLinearPricing{Base: 15, Word: 3}}) if genesis.Config.ByzantiumBlock != nil { spec.setPrecompile(5, &alethGenesisSpecBuiltin{Name: "modexp", - StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64())}) + StartingBlock: (*hexutil.Big)(genesis.Config.ByzantiumBlock)}) spec.setPrecompile(6, &alethGenesisSpecBuiltin{Name: "alt_bn128_G1_add", - StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64()), + StartingBlock: (*hexutil.Big)(genesis.Config.ByzantiumBlock), Linear: &alethGenesisSpecLinearPricing{Base: 500}}) spec.setPrecompile(7, &alethGenesisSpecBuiltin{Name: "alt_bn128_G1_mul", - StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64()), + StartingBlock: (*hexutil.Big)(genesis.Config.ByzantiumBlock), Linear: &alethGenesisSpecLinearPricing{Base: 40000}}) spec.setPrecompile(8, &alethGenesisSpecBuiltin{Name: "alt_bn128_pairing_product", - StartingBlock: (hexutil.Uint64)(genesis.Config.ByzantiumBlock.Uint64())}) + StartingBlock: (*hexutil.Big)(genesis.Config.ByzantiumBlock)}) + } + if genesis.Config.IstanbulBlock != nil { + if genesis.Config.ByzantiumBlock == nil { + return nil, errors.New("invalid genesis, istanbul fork is enabled while byzantium is not") + } + spec.setPrecompile(6, &alethGenesisSpecBuiltin{ + Name: "alt_bn128_G1_add", + StartingBlock: (*hexutil.Big)(genesis.Config.ByzantiumBlock), + }) // Aleth hardcoded the gas policy + spec.setPrecompile(7, &alethGenesisSpecBuiltin{ + Name: "alt_bn128_G1_mul", + StartingBlock: (*hexutil.Big)(genesis.Config.ByzantiumBlock), + }) // Aleth hardcoded the gas policy + spec.setPrecompile(9, &alethGenesisSpecBuiltin{ + Name: "blake2_compression", + StartingBlock: (*hexutil.Big)(genesis.Config.IstanbulBlock), + }) } return spec, nil } @@ -196,14 +225,6 @@ func (spec *alethGenesisSpec) setAccount(address common.Address, account core.Ge } -func (spec *alethGenesisSpec) setByzantium(num *big.Int) { - spec.Params.ByzantiumForkBlock = hexutil.Uint64(num.Uint64()) -} - -func (spec *alethGenesisSpec) setConstantinople(num *big.Int) { - spec.Params.ConstantinopleForkBlock = hexutil.Uint64(num.Uint64()) -} - // parityChainSpec is the chain specification format used by Parity. type parityChainSpec struct { Name string `json:"name"` @@ -223,35 +244,40 @@ type parityChainSpec struct { } `json:"engine"` Params struct { - AccountStartNonce hexutil.Uint64 `json:"accountStartNonce"` - MaximumExtraDataSize hexutil.Uint64 `json:"maximumExtraDataSize"` - MinGasLimit hexutil.Uint64 `json:"minGasLimit"` - GasLimitBoundDivisor math2.HexOrDecimal64 `json:"gasLimitBoundDivisor"` - NetworkID hexutil.Uint64 `json:"networkID"` - ChainID hexutil.Uint64 `json:"chainID"` - MaxCodeSize hexutil.Uint64 `json:"maxCodeSize"` - MaxCodeSizeTransition hexutil.Uint64 `json:"maxCodeSizeTransition"` - EIP98Transition hexutil.Uint64 `json:"eip98Transition"` - EIP150Transition hexutil.Uint64 `json:"eip150Transition"` - EIP160Transition hexutil.Uint64 `json:"eip160Transition"` - EIP161abcTransition hexutil.Uint64 `json:"eip161abcTransition"` - EIP161dTransition hexutil.Uint64 `json:"eip161dTransition"` - EIP155Transition hexutil.Uint64 `json:"eip155Transition"` - EIP140Transition hexutil.Uint64 `json:"eip140Transition"` - EIP211Transition hexutil.Uint64 `json:"eip211Transition"` - EIP214Transition hexutil.Uint64 `json:"eip214Transition"` - EIP658Transition hexutil.Uint64 `json:"eip658Transition"` - EIP145Transition hexutil.Uint64 `json:"eip145Transition"` - EIP1014Transition hexutil.Uint64 `json:"eip1014Transition"` - EIP1052Transition hexutil.Uint64 `json:"eip1052Transition"` - EIP1283Transition hexutil.Uint64 `json:"eip1283Transition"` + AccountStartNonce hexutil.Uint64 `json:"accountStartNonce"` + MaximumExtraDataSize hexutil.Uint64 `json:"maximumExtraDataSize"` + MinGasLimit hexutil.Uint64 `json:"minGasLimit"` + GasLimitBoundDivisor math2.HexOrDecimal64 `json:"gasLimitBoundDivisor"` + NetworkID hexutil.Uint64 `json:"networkID"` + ChainID hexutil.Uint64 `json:"chainID"` + MaxCodeSize hexutil.Uint64 `json:"maxCodeSize"` + MaxCodeSizeTransition hexutil.Uint64 `json:"maxCodeSizeTransition"` + EIP98Transition hexutil.Uint64 `json:"eip98Transition"` + EIP150Transition hexutil.Uint64 `json:"eip150Transition"` + EIP160Transition hexutil.Uint64 `json:"eip160Transition"` + EIP161abcTransition hexutil.Uint64 `json:"eip161abcTransition"` + EIP161dTransition hexutil.Uint64 `json:"eip161dTransition"` + EIP155Transition hexutil.Uint64 `json:"eip155Transition"` + EIP140Transition hexutil.Uint64 `json:"eip140Transition"` + EIP211Transition hexutil.Uint64 `json:"eip211Transition"` + EIP214Transition hexutil.Uint64 `json:"eip214Transition"` + EIP658Transition hexutil.Uint64 `json:"eip658Transition"` + EIP145Transition hexutil.Uint64 `json:"eip145Transition"` + EIP1014Transition hexutil.Uint64 `json:"eip1014Transition"` + EIP1052Transition hexutil.Uint64 `json:"eip1052Transition"` + EIP1283Transition hexutil.Uint64 `json:"eip1283Transition"` + EIP1283DisableTransition hexutil.Uint64 `json:"eip1283DisableTransition"` + EIP1283ReenableTransition hexutil.Uint64 `json:"eip1283ReenableTransition"` + EIP1344Transition hexutil.Uint64 `json:"eip1344Transition"` + EIP1884Transition hexutil.Uint64 `json:"eip1884Transition"` + EIP2028Transition hexutil.Uint64 `json:"eip2028Transition"` } `json:"params"` Genesis struct { Seal struct { Ethereum struct { - Nonce hexutil.Bytes `json:"nonce"` - MixHash hexutil.Bytes `json:"mixHash"` + Nonce types.BlockNonce `json:"nonce"` + MixHash hexutil.Bytes `json:"mixHash"` } `json:"ethereum"` } `json:"seal"` @@ -277,17 +303,23 @@ type parityChainSpecAccount struct { // parityChainSpecBuiltin is the precompiled contract definition. type parityChainSpecBuiltin struct { - Name string `json:"name,omitempty"` - ActivateAt math2.HexOrDecimal64 `json:"activate_at,omitempty"` - Pricing *parityChainSpecPricing `json:"pricing,omitempty"` + Name string `json:"name"` // Each builtin should has it own name + Pricing interface{} `json:"pricing"` // Each builtin should has it own price strategy + ActivateAt *hexutil.Big `json:"activate_at,omitempty"` // ActivateAt can't be omitted if empty, default means no fork } // parityChainSpecPricing represents the different pricing models that builtin // contracts might advertise using. type parityChainSpecPricing struct { - Linear *parityChainSpecLinearPricing `json:"linear,omitempty"` - ModExp *parityChainSpecModExpPricing `json:"modexp,omitempty"` - AltBnPairing *parityChainSpecAltBnPairingPricing `json:"alt_bn128_pairing,omitempty"` + Linear *parityChainSpecLinearPricing `json:"linear,omitempty"` + ModExp *parityChainSpecModExpPricing `json:"modexp,omitempty"` + + // Before the https://github.com/paritytech/parity-ethereum/pull/11039, + // Parity uses this format to config bn pairing price policy. + AltBnPairing *parityChainSepcAltBnPairingPricing `json:"alt_bn128_pairing,omitempty"` + + // Blake2F is the price per round of Blake2 compression + Blake2F *parityChainSpecBlakePricing `json:"blake2_f,omitempty"` } type parityChainSpecLinearPricing struct { @@ -299,11 +331,36 @@ type parityChainSpecModExpPricing struct { Divisor uint64 `json:"divisor"` } -type parityChainSpecAltBnPairingPricing struct { +// parityChainSpecAltBnConstOperationPricing defines the price +// policy for bn const operation(used after istanbul) +type parityChainSpecAltBnConstOperationPricing struct { + Price uint64 `json:"price"` +} + +// parityChainSepcAltBnPairingPricing defines the price policy +// for bn pairing. +type parityChainSepcAltBnPairingPricing struct { Base uint64 `json:"base"` Pair uint64 `json:"pair"` } +// parityChainSpecBlakePricing defines the price policy for blake2 f +// compression. +type parityChainSpecBlakePricing struct { + GasPerRound uint64 `json:"gas_per_round"` +} + +type parityChainSpecAlternativePrice struct { + AltBnConstOperationPrice *parityChainSpecAltBnConstOperationPricing `json:"alt_bn128_const_operations,omitempty"` + AltBnPairingPrice *parityChainSepcAltBnPairingPricing `json:"alt_bn128_pairing,omitempty"` +} + +// parityChainSpecVersionedPricing represents a single version price policy. +type parityChainSpecVersionedPricing struct { + Price *parityChainSpecAlternativePrice `json:"price,omitempty"` + Info string `json:"info,omitempty"` +} + // newParityChainSpec converts a go-ethereum genesis block into a Parity specific // chain specification format. func newParityChainSpec(network string, genesis *core.Genesis, bootnodes []string) (*parityChainSpec, error) { @@ -347,6 +404,14 @@ func newParityChainSpec(network string, genesis *core.Genesis, bootnodes []strin if num := genesis.Config.ConstantinopleBlock; num != nil { spec.setConstantinople(num) } + // ConstantinopleFix (remove eip-1283) + if num := genesis.Config.PetersburgBlock; num != nil { + spec.setConstantinopleFix(num) + } + // Istanbul + if num := genesis.Config.IstanbulBlock; num != nil { + spec.setIstanbul(num) + } spec.Params.MaximumExtraDataSize = (hexutil.Uint64)(params.MaximumExtraDataSize) spec.Params.MinGasLimit = (hexutil.Uint64)(params.MinGasLimit) spec.Params.GasLimitBoundDivisor = (math2.HexOrDecimal64)(params.GasLimitBoundDivisor) @@ -359,10 +424,8 @@ func newParityChainSpec(network string, genesis *core.Genesis, bootnodes []strin // Disable this one spec.Params.EIP98Transition = math.MaxInt64 - spec.Genesis.Seal.Ethereum.Nonce = (hexutil.Bytes)(make([]byte, 8)) - binary.LittleEndian.PutUint64(spec.Genesis.Seal.Ethereum.Nonce[:], genesis.Nonce) - - spec.Genesis.Seal.Ethereum.MixHash = (hexutil.Bytes)(genesis.Mixhash[:]) + spec.Genesis.Seal.Ethereum.Nonce = types.EncodeNonce(genesis.Nonce) + spec.Genesis.Seal.Ethereum.MixHash = (genesis.Mixhash[:]) spec.Genesis.Difficulty = (*hexutil.Big)(genesis.Difficulty) spec.Genesis.Author = genesis.Coinbase spec.Genesis.Timestamp = (hexutil.Uint64)(genesis.Timestamp) @@ -392,18 +455,93 @@ func newParityChainSpec(network string, genesis *core.Genesis, bootnodes []strin Name: "identity", Pricing: &parityChainSpecPricing{Linear: &parityChainSpecLinearPricing{Base: 15, Word: 3}}, }) if genesis.Config.ByzantiumBlock != nil { - blnum := math2.HexOrDecimal64(genesis.Config.ByzantiumBlock.Uint64()) spec.setPrecompile(5, &parityChainSpecBuiltin{ - Name: "modexp", ActivateAt: blnum, Pricing: &parityChainSpecPricing{ModExp: &parityChainSpecModExpPricing{Divisor: 20}}, + Name: "modexp", + ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock), + Pricing: &parityChainSpecPricing{ + ModExp: &parityChainSpecModExpPricing{Divisor: 20}, + }, + }) + spec.setPrecompile(6, &parityChainSpecBuiltin{ + Name: "alt_bn128_add", + ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock), + Pricing: &parityChainSpecPricing{ + Linear: &parityChainSpecLinearPricing{Base: 500, Word: 0}, + }, + }) + spec.setPrecompile(7, &parityChainSpecBuiltin{ + Name: "alt_bn128_mul", + ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock), + Pricing: &parityChainSpecPricing{ + Linear: &parityChainSpecLinearPricing{Base: 40000, Word: 0}, + }, }) + spec.setPrecompile(8, &parityChainSpecBuiltin{ + Name: "alt_bn128_pairing", + ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock), + Pricing: &parityChainSpecPricing{ + AltBnPairing: &parityChainSepcAltBnPairingPricing{Base: 100000, Pair: 80000}, + }, + }) + } + if genesis.Config.IstanbulBlock != nil { + if genesis.Config.ByzantiumBlock == nil { + return nil, errors.New("invalid genesis, istanbul fork is enabled while byzantium is not") + } spec.setPrecompile(6, &parityChainSpecBuiltin{ - Name: "alt_bn128_add", ActivateAt: blnum, Pricing: &parityChainSpecPricing{Linear: &parityChainSpecLinearPricing{Base: 500}}, + Name: "alt_bn128_add", + ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock), + Pricing: map[*hexutil.Big]*parityChainSpecVersionedPricing{ + (*hexutil.Big)(big.NewInt(0)): { + Price: &parityChainSpecAlternativePrice{ + AltBnConstOperationPrice: &parityChainSpecAltBnConstOperationPricing{Price: 500}, + }, + }, + (*hexutil.Big)(genesis.Config.IstanbulBlock): { + Price: &parityChainSpecAlternativePrice{ + AltBnConstOperationPrice: &parityChainSpecAltBnConstOperationPricing{Price: 150}, + }, + }, + }, }) spec.setPrecompile(7, &parityChainSpecBuiltin{ - Name: "alt_bn128_mul", ActivateAt: blnum, Pricing: &parityChainSpecPricing{Linear: &parityChainSpecLinearPricing{Base: 40000}}, + Name: "alt_bn128_mul", + ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock), + Pricing: map[*hexutil.Big]*parityChainSpecVersionedPricing{ + (*hexutil.Big)(big.NewInt(0)): { + Price: &parityChainSpecAlternativePrice{ + AltBnConstOperationPrice: &parityChainSpecAltBnConstOperationPricing{Price: 40000}, + }, + }, + (*hexutil.Big)(genesis.Config.IstanbulBlock): { + Price: &parityChainSpecAlternativePrice{ + AltBnConstOperationPrice: &parityChainSpecAltBnConstOperationPricing{Price: 6000}, + }, + }, + }, }) spec.setPrecompile(8, &parityChainSpecBuiltin{ - Name: "alt_bn128_pairing", ActivateAt: blnum, Pricing: &parityChainSpecPricing{AltBnPairing: &parityChainSpecAltBnPairingPricing{Base: 100000, Pair: 80000}}, + Name: "alt_bn128_pairing", + ActivateAt: (*hexutil.Big)(genesis.Config.ByzantiumBlock), + Pricing: map[*hexutil.Big]*parityChainSpecVersionedPricing{ + (*hexutil.Big)(big.NewInt(0)): { + Price: &parityChainSpecAlternativePrice{ + AltBnPairingPrice: &parityChainSepcAltBnPairingPricing{Base: 100000, Pair: 80000}, + }, + }, + (*hexutil.Big)(genesis.Config.IstanbulBlock): { + Price: &parityChainSpecAlternativePrice{ + AltBnPairingPrice: &parityChainSepcAltBnPairingPricing{Base: 45000, Pair: 34000}, + }, + }, + }, + }) + spec.setPrecompile(9, &parityChainSpecBuiltin{ + Name: "blake2_f", + ActivateAt: (*hexutil.Big)(genesis.Config.IstanbulBlock), + Pricing: &parityChainSpecPricing{ + Blake2F: &parityChainSpecBlakePricing{GasPerRound: 1}, + }, }) } return spec, nil @@ -441,10 +579,21 @@ func (spec *parityChainSpec) setConstantinople(num *big.Int) { spec.Params.EIP1283Transition = n } +func (spec *parityChainSpec) setConstantinopleFix(num *big.Int) { + spec.Params.EIP1283DisableTransition = hexutil.Uint64(num.Uint64()) +} + +func (spec *parityChainSpec) setIstanbul(num *big.Int) { + spec.Params.EIP1344Transition = hexutil.Uint64(num.Uint64()) + spec.Params.EIP1884Transition = hexutil.Uint64(num.Uint64()) + spec.Params.EIP2028Transition = hexutil.Uint64(num.Uint64()) + spec.Params.EIP1283ReenableTransition = hexutil.Uint64(num.Uint64()) +} + // pyEthereumGenesisSpec represents the genesis specification format used by the // Python Ethereum implementation. type pyEthereumGenesisSpec struct { - Nonce hexutil.Bytes `json:"nonce"` + Nonce types.BlockNonce `json:"nonce"` Timestamp hexutil.Uint64 `json:"timestamp"` ExtraData hexutil.Bytes `json:"extraData"` GasLimit hexutil.Uint64 `json:"gasLimit"` @@ -463,6 +612,7 @@ func newPyEthereumGenesisSpec(network string, genesis *core.Genesis) (*pyEthereu return nil, errors.New("unsupported consensus engine") } spec := &pyEthereumGenesisSpec{ + Nonce: types.EncodeNonce(genesis.Nonce), Timestamp: (hexutil.Uint64)(genesis.Timestamp), ExtraData: genesis.ExtraData, GasLimit: (hexutil.Uint64)(genesis.GasLimit), @@ -472,8 +622,5 @@ func newPyEthereumGenesisSpec(network string, genesis *core.Genesis) (*pyEthereu Alloc: genesis.Alloc, ParentHash: genesis.ParentHash, } - spec.Nonce = (hexutil.Bytes)(make([]byte, 8)) - binary.LittleEndian.PutUint64(spec.Nonce[:], genesis.Nonce) - return spec, nil } diff --git a/cmd/puppeth/genesis_test.go b/cmd/puppeth/genesis_test.go index 83e738360572..aaa72d73cb02 100644 --- a/cmd/puppeth/genesis_test.go +++ b/cmd/puppeth/genesis_test.go @@ -17,8 +17,8 @@ package main import ( + "bytes" "encoding/json" - "fmt" "io/ioutil" "reflect" "strings" @@ -61,7 +61,7 @@ func TestAlethSturebyConverter(t *testing.T) { got := strings.Split(c.Sdump(spec), "\n") for i := 0; i < len(exp) && i < len(got); i++ { if exp[i] != got[i] { - fmt.Printf("got: %v\nexp: %v\n", exp[i], got[i]) + t.Logf("got: %v\nexp: %v\n", exp[i], got[i]) } } } @@ -77,33 +77,19 @@ func TestParitySturebyConverter(t *testing.T) { if err := json.Unmarshal(blob, &genesis); err != nil { t.Fatalf("failed parsing genesis: %v", err) } - spec, err := newParityChainSpec("Stureby", &genesis, []string{}) + spec, err := newParityChainSpec("stureby", &genesis, []string{}) if err != nil { t.Fatalf("failed creating chainspec: %v", err) } - + enc, err := json.MarshalIndent(spec, "", " ") + if err != nil { + t.Fatalf("failed encoding chainspec: %v", err) + } expBlob, err := ioutil.ReadFile("testdata/stureby_parity.json") if err != nil { t.Fatalf("could not read file: %v", err) } - expspec := &parityChainSpec{} - if err := json.Unmarshal(expBlob, expspec); err != nil { - t.Fatalf("failed parsing genesis: %v", err) - } - expspec.Nodes = []string{} - - if !reflect.DeepEqual(expspec, spec) { - t.Errorf("chainspec mismatch") - c := spew.ConfigState{ - DisablePointerAddresses: true, - SortKeys: true, - } - exp := strings.Split(c.Sdump(expspec), "\n") - got := strings.Split(c.Sdump(spec), "\n") - for i := 0; i < len(exp) && i < len(got); i++ { - if exp[i] != got[i] { - fmt.Printf("got: %v\nexp: %v\n", exp[i], got[i]) - } - } + if !bytes.Equal(expBlob, enc) { + t.Fatalf("chainspec mismatch") } } diff --git a/cmd/puppeth/module.go b/cmd/puppeth/module.go index 263ec8d25c67..b6a029a01a48 100644 --- a/cmd/puppeth/module.go +++ b/cmd/puppeth/module.go @@ -25,7 +25,7 @@ import ( "strings" "time" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) var ( diff --git a/cmd/puppeth/module_dashboard.go b/cmd/puppeth/module_dashboard.go index ebd75cee1630..9a77587b4a85 100644 --- a/cmd/puppeth/module_dashboard.go +++ b/cmd/puppeth/module_dashboard.go @@ -26,7 +26,7 @@ import ( "strconv" "strings" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // dashboardContent is the actual dashboard HTML content to serve up when users @@ -256,7 +256,7 @@ var dashboardContent = `

Starting with the 1.5 release of go-ethereum, we've transitioned away from shipping only full blown Ethereum 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 Ethereum network can nonetheless be accessed from Android too.

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. +

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 Ethereum network, download the {{.GethGenesis}} 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.

Inside your Java code you can now import the geth archive and connect to Ethereum:

import org.ethereum.geth.*;
@@ -287,7 +287,7 @@ node.start();

Starting with the 1.5 release of go-ethereum, we've transitioned away from shipping only full blown Ethereum 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 Ethereum network can nonetheless be accessed from iOS too.

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. +

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 Ethereum network, download the {{.GethGenesis}} 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.

Inside your Swift code you can now import the geth framework and connect to Ethereum (ObjC should be analogous):

import Geth
@@ -419,7 +419,7 @@ try! node?.start();

Puppeth is a tool to aid you in creating a new Ethereum network down to the genesis block, bootnodes, signers, ethstats server, crypto faucet, wallet browsers, block explorer, dashboard and more; without the hassle that it would normally entail to manually configure all these services one by one.

Puppeth uses ssh to dial in to remote servers, and builds its network components out of docker containers using docker-compose. The user is guided through the process via a command line wizard that does the heavy lifting and topology configuration automatically behind the scenes.


-

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

go get github.com/nebulaai/nbai-node/cmd/puppeth

+

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

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


Copyright 2017. The go-ethereum Authors.

@@ -608,30 +608,31 @@ func deployDashboard(client *sshClient, network string, conf *config, config *da bootPython[i] = "'" + boot + "'" } template.Must(template.New("").Parse(dashboardContent)).Execute(indexfile, map[string]interface{}{ - "Network": network, - "NetworkID": conf.Genesis.Config.ChainID, - "NetworkTitle": strings.Title(network), - "EthstatsPage": config.ethstats, - "ExplorerPage": config.explorer, - "WalletPage": config.wallet, - "FaucetPage": config.faucet, - "GethGenesis": network + ".json", - "Bootnodes": conf.bootnodes, - "BootnodesFlat": strings.Join(conf.bootnodes, ","), - "Ethstats": statsLogin, - "Ethash": conf.Genesis.Config.Ethash != nil, - "CppGenesis": network + "-cpp.json", - "CppBootnodes": strings.Join(bootCpp, " "), - "HarmonyGenesis": network + "-harmony.json", - "HarmonyBootnodes": strings.Join(bootHarmony, " "), - "ParityGenesis": network + "-parity.json", - "PythonGenesis": network + "-python.json", - "PythonBootnodes": strings.Join(bootPython, ","), - "Homestead": conf.Genesis.Config.HomesteadBlock, - "Tangerine": conf.Genesis.Config.EIP150Block, - "Spurious": conf.Genesis.Config.EIP155Block, - "Byzantium": conf.Genesis.Config.ByzantiumBlock, - "Constantinople": conf.Genesis.Config.ConstantinopleBlock, + "Network": network, + "NetworkID": conf.Genesis.Config.ChainID, + "NetworkTitle": strings.Title(network), + "EthstatsPage": config.ethstats, + "ExplorerPage": config.explorer, + "WalletPage": config.wallet, + "FaucetPage": config.faucet, + "GethGenesis": network + ".json", + "Bootnodes": conf.bootnodes, + "BootnodesFlat": strings.Join(conf.bootnodes, ","), + "Ethstats": statsLogin, + "Ethash": conf.Genesis.Config.Ethash != nil, + "CppGenesis": network + "-cpp.json", + "CppBootnodes": strings.Join(bootCpp, " "), + "HarmonyGenesis": network + "-harmony.json", + "HarmonyBootnodes": strings.Join(bootHarmony, " "), + "ParityGenesis": network + "-parity.json", + "PythonGenesis": network + "-python.json", + "PythonBootnodes": strings.Join(bootPython, ","), + "Homestead": conf.Genesis.Config.HomesteadBlock, + "Tangerine": conf.Genesis.Config.EIP150Block, + "Spurious": conf.Genesis.Config.EIP155Block, + "Byzantium": conf.Genesis.Config.ByzantiumBlock, + "Constantinople": conf.Genesis.Config.ConstantinopleBlock, + "ConstantinopleFix": conf.Genesis.Config.PetersburgBlock, }) files[filepath.Join(workdir, "index.html")] = indexfile.Bytes() diff --git a/cmd/puppeth/module_ethstats.go b/cmd/puppeth/module_ethstats.go index 294340d3e272..58ecb83951e0 100644 --- a/cmd/puppeth/module_ethstats.go +++ b/cmd/puppeth/module_ethstats.go @@ -25,7 +25,7 @@ import ( "strings" "text/template" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // ethstatsDockerfile is the Dockerfile required to build an ethstats backend diff --git a/cmd/puppeth/module_explorer.go b/cmd/puppeth/module_explorer.go index 7adea5ed582c..8fffe1a1c468 100644 --- a/cmd/puppeth/module_explorer.go +++ b/cmd/puppeth/module_explorer.go @@ -25,113 +25,91 @@ import ( "strconv" "strings" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // explorerDockerfile is the Dockerfile required to run a block explorer. var explorerDockerfile = ` -FROM puppeth/explorer:latest - -ADD ethstats.json /ethstats.json -ADD chain.json /chain.json +FROM puppeth/blockscout:latest +ADD genesis.json /genesis.json RUN \ - echo '(cd ../eth-net-intelligence-api && pm2 start /ethstats.json)' > explorer.sh && \ - echo '(cd ../etherchain-light && npm start &)' >> explorer.sh && \ - echo 'exec /parity/parity --chain=/chain.json --port={{.NodePort}} --tracing=on --fat-db=on --pruning=archive' >> explorer.sh + echo 'geth --cache 512 init /genesis.json' > explorer.sh && \ + echo $'geth --networkid {{.NetworkID}} --syncmode "full" --gcmode "archive" --port {{.EthPort}} --bootnodes {{.Bootnodes}} --ethstats \'{{.Ethstats}}\' --cache=512 --rpc --rpcapi "net,web3,eth,shh,debug" --rpccorsdomain "*" --rpcvhosts "*" --ws --wsorigins "*" --exitwhensynced' >> explorer.sh && \ + echo $'exec geth --networkid {{.NetworkID}} --syncmode "full" --gcmode "archive" --port {{.EthPort}} --bootnodes {{.Bootnodes}} --ethstats \'{{.Ethstats}}\' --cache=512 --rpc --rpcapi "net,web3,eth,shh,debug" --rpccorsdomain "*" --rpcvhosts "*" --ws --wsorigins "*" &' >> explorer.sh && \ + echo '/usr/local/bin/docker-entrypoint.sh postgres &' >> explorer.sh && \ + echo 'sleep 5' >> explorer.sh && \ + echo 'mix do ecto.drop --force, ecto.create, ecto.migrate' >> explorer.sh && \ + echo 'mix phx.server' >> explorer.sh ENTRYPOINT ["/bin/sh", "explorer.sh"] ` -// explorerEthstats is the configuration file for the ethstats javascript client. -var explorerEthstats = `[ - { - "name" : "node-app", - "script" : "app.js", - "log_date_format" : "YYYY-MM-DD HH:mm Z", - "merge_logs" : false, - "watch" : false, - "max_restarts" : 10, - "exec_interpreter" : "node", - "exec_mode" : "fork_mode", - "env": - { - "NODE_ENV" : "production", - "RPC_HOST" : "localhost", - "RPC_PORT" : "8545", - "LISTENING_PORT" : "{{.Port}}", - "INSTANCE_NAME" : "{{.Name}}", - "CONTACT_DETAILS" : "", - "WS_SERVER" : "{{.Host}}", - "WS_SECRET" : "{{.Secret}}", - "VERBOSITY" : 2 - } - } -]` - // explorerComposefile is the docker-compose.yml file required to deploy and // maintain a block explorer. var explorerComposefile = ` version: '2' services: - explorer: - build: . - image: {{.Network}}/explorer - container_name: {{.Network}}_explorer_1 - ports: - - "{{.NodePort}}:{{.NodePort}}" - - "{{.NodePort}}:{{.NodePort}}/udp"{{if not .VHost}} - - "{{.WebPort}}:3000"{{end}} - volumes: - - {{.Datadir}}:/root/.local/share/io.parity.ethereum - environment: - - NODE_PORT={{.NodePort}}/tcp - - STATS={{.Ethstats}}{{if .VHost}} - - VIRTUAL_HOST={{.VHost}} - - VIRTUAL_PORT=3000{{end}} - logging: - driver: "json-file" - options: - max-size: "1m" - max-file: "10" - restart: always + explorer: + build: . + image: {{.Network}}/explorer + container_name: {{.Network}}_explorer_1 + ports: + - "{{.EthPort}}:{{.EthPort}}" + - "{{.EthPort}}:{{.EthPort}}/udp"{{if not .VHost}} + - "{{.WebPort}}:4000"{{end}} + environment: + - ETH_PORT={{.EthPort}} + - ETH_NAME={{.EthName}} + - BLOCK_TRANSFORMER={{.Transformer}}{{if .VHost}} + - VIRTUAL_HOST={{.VHost}} + - VIRTUAL_PORT=4000{{end}} + volumes: + - {{.Datadir}}:/opt/app/.ethereum + - {{.DBDir}}:/var/lib/postgresql/data + logging: + driver: "json-file" + options: + max-size: "1m" + max-file: "10" + restart: always ` // deployExplorer deploys a new block explorer 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 deployExplorer(client *sshClient, network string, chainspec []byte, config *explorerInfos, nocache bool) ([]byte, error) { +func deployExplorer(client *sshClient, network string, bootnodes []string, config *explorerInfos, nocache bool, isClique bool) ([]byte, error) { // Generate the content to upload to the server workdir := fmt.Sprintf("%d", rand.Int63()) files := make(map[string][]byte) dockerfile := new(bytes.Buffer) template.Must(template.New("").Parse(explorerDockerfile)).Execute(dockerfile, map[string]interface{}{ - "NodePort": config.nodePort, + "NetworkID": config.node.network, + "Bootnodes": strings.Join(bootnodes, ","), + "Ethstats": config.node.ethstats, + "EthPort": config.node.port, }) files[filepath.Join(workdir, "Dockerfile")] = dockerfile.Bytes() - ethstats := new(bytes.Buffer) - template.Must(template.New("").Parse(explorerEthstats)).Execute(ethstats, map[string]interface{}{ - "Port": config.nodePort, - "Name": config.ethstats[:strings.Index(config.ethstats, ":")], - "Secret": config.ethstats[strings.Index(config.ethstats, ":")+1 : strings.Index(config.ethstats, "@")], - "Host": config.ethstats[strings.Index(config.ethstats, "@")+1:], - }) - files[filepath.Join(workdir, "ethstats.json")] = ethstats.Bytes() - + transformer := "base" + if isClique { + transformer = "clique" + } composefile := new(bytes.Buffer) template.Must(template.New("").Parse(explorerComposefile)).Execute(composefile, map[string]interface{}{ - "Datadir": config.datadir, - "Network": network, - "NodePort": config.nodePort, - "VHost": config.webHost, - "WebPort": config.webPort, - "Ethstats": config.ethstats[:strings.Index(config.ethstats, ":")], + "Network": network, + "VHost": config.host, + "Ethstats": config.node.ethstats, + "Datadir": config.node.datadir, + "DBDir": config.dbdir, + "EthPort": config.node.port, + "EthName": config.node.ethstats[:strings.Index(config.node.ethstats, ":")], + "WebPort": config.port, + "Transformer": transformer, }) files[filepath.Join(workdir, "docker-compose.yaml")] = composefile.Bytes() - - files[filepath.Join(workdir, "chain.json")] = chainspec + files[filepath.Join(workdir, "genesis.json")] = config.node.genesis // Upload the deployment files to the remote server (and clean up afterwards) if out, err := client.Upload(files); err != nil { @@ -149,22 +127,20 @@ func deployExplorer(client *sshClient, network string, chainspec []byte, config // explorerInfos is returned from a block explorer status check to allow reporting // various configuration parameters. type explorerInfos struct { - datadir string - ethstats string - nodePort int - webHost string - webPort int + node *nodeInfos + dbdir string + host string + port int } // Report converts the typed struct into a plain string->string map, containing // most - but not all - fields for reporting to the user. func (info *explorerInfos) Report() map[string]string { report := map[string]string{ - "Data directory": info.datadir, - "Node listener port ": strconv.Itoa(info.nodePort), - "Ethstats username": info.ethstats, - "Website address ": info.webHost, - "Website listener port ": strconv.Itoa(info.webPort), + "Website address ": info.host, + "Website listener port ": strconv.Itoa(info.port), + "Ethereum listener port ": strconv.Itoa(info.node.port), + "Ethstats username": info.node.ethstats, } return report } @@ -172,7 +148,7 @@ func (info *explorerInfos) Report() map[string]string { // checkExplorer does a health-check against a block explorer server to verify // whether it's running, and if yes, whether it's responsive. func checkExplorer(client *sshClient, network string) (*explorerInfos, error) { - // Inspect a possible block explorer container on the host + // Inspect a possible explorer container on the host infos, err := inspectContainer(client, fmt.Sprintf("%s_explorer_1", network)) if err != nil { return nil, err @@ -181,13 +157,13 @@ func checkExplorer(client *sshClient, network string) (*explorerInfos, error) { return nil, ErrServiceOffline } // Resolve the port from the host, or the reverse proxy - webPort := infos.portmap["3000/tcp"] - if webPort == 0 { + port := infos.portmap["4000/tcp"] + if port == 0 { if proxy, _ := checkNginx(client, network); proxy != nil { - webPort = proxy.port + port = proxy.port } } - if webPort == 0 { + if port == 0 { return nil, ErrNotExposed } // Resolve the host from the reverse-proxy and the config values @@ -196,17 +172,23 @@ func checkExplorer(client *sshClient, network string) (*explorerInfos, error) { host = client.server } // Run a sanity check to see if the devp2p is reachable - nodePort := infos.portmap[infos.envvars["NODE_PORT"]] - if err = checkPort(client.server, nodePort); err != nil { - log.Warn(fmt.Sprintf("Explorer devp2p port seems unreachable"), "server", client.server, "port", nodePort, "err", err) + p2pPort := infos.portmap[infos.envvars["ETH_PORT"]+"/tcp"] + if err = checkPort(host, p2pPort); err != nil { + log.Warn("Explorer node seems unreachable", "server", host, "port", p2pPort, "err", err) + } + if err = checkPort(host, port); err != nil { + log.Warn("Explorer service seems unreachable", "server", host, "port", port, "err", err) } // Assemble and return the useful infos stats := &explorerInfos{ - datadir: infos.volumes["/root/.local/share/io.parity.ethereum"], - nodePort: nodePort, - webHost: host, - webPort: webPort, - ethstats: infos.envvars["STATS"], + node: &nodeInfos{ + datadir: infos.volumes["/opt/app/.ethereum"], + port: infos.portmap[infos.envvars["ETH_PORT"]+"/tcp"], + ethstats: infos.envvars["ETH_NAME"], + }, + dbdir: infos.volumes["/var/lib/postgresql/data"], + host: host, + port: port, } return stats, nil } diff --git a/cmd/puppeth/module_faucet.go b/cmd/puppeth/module_faucet.go index 1c4971b39841..177b3ddc45fc 100644 --- a/cmd/puppeth/module_faucet.go +++ b/cmd/puppeth/module_faucet.go @@ -26,8 +26,8 @@ import ( "strconv" "strings" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" ) // faucetDockerfile is the Dockerfile required to build a faucet container to diff --git a/cmd/puppeth/module_nginx.go b/cmd/puppeth/module_nginx.go index 1238d41e2c6d..1b1ae61ff598 100644 --- a/cmd/puppeth/module_nginx.go +++ b/cmd/puppeth/module_nginx.go @@ -24,7 +24,7 @@ import ( "path/filepath" "strconv" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // nginxDockerfile is theis the Dockerfile required to build an nginx reverse- diff --git a/cmd/puppeth/module_node.go b/cmd/puppeth/module_node.go index bbcf53c7b46f..5d9ef46523e0 100644 --- a/cmd/puppeth/module_node.go +++ b/cmd/puppeth/module_node.go @@ -26,8 +26,8 @@ import ( "strings" "text/template" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" ) // nodeDockerfile is the Dockerfile required to run an Ethereum node. diff --git a/cmd/puppeth/module_wallet.go b/cmd/puppeth/module_wallet.go index 1bf87c387b42..ebaa5b6ae1a5 100644 --- a/cmd/puppeth/module_wallet.go +++ b/cmd/puppeth/module_wallet.go @@ -25,7 +25,7 @@ import ( "strconv" "strings" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // walletDockerfile is the Dockerfile required to run a web wallet. diff --git a/cmd/puppeth/puppeth.go b/cmd/puppeth/puppeth.go index 418cae32536f..c3de5f936024 100644 --- a/cmd/puppeth/puppeth.go +++ b/cmd/puppeth/puppeth.go @@ -23,7 +23,7 @@ import ( "strings" "time" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" "gopkg.in/urfave/cli.v1" ) diff --git a/cmd/puppeth/ssh.go b/cmd/puppeth/ssh.go index 86edcf68f289..da2862db2f10 100644 --- a/cmd/puppeth/ssh.go +++ b/cmd/puppeth/ssh.go @@ -28,7 +28,7 @@ import ( "path/filepath" "strings" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" "golang.org/x/crypto/ssh" "golang.org/x/crypto/ssh/terminal" ) @@ -129,15 +129,20 @@ func dial(server string, pubkey []byte) (*sshClient, error) { fmt.Printf("SSH key fingerprint is %s [MD5]\n", ssh.FingerprintLegacyMD5(key)) fmt.Printf("Are you sure you want to continue connecting (yes/no)? ") - text, err := bufio.NewReader(os.Stdin).ReadString('\n') - switch { - case err != nil: - return err - case strings.TrimSpace(text) == "yes": - pubkey = key.Marshal() - return nil - default: - return fmt.Errorf("unknown auth choice: %v", text) + for { + text, err := bufio.NewReader(os.Stdin).ReadString('\n') + switch { + case err != nil: + return err + case strings.TrimSpace(text) == "yes": + pubkey = key.Marshal() + return nil + case strings.TrimSpace(text) == "no": + return errors.New("users says no") + default: + fmt.Println("Please answer 'yes' or 'no'") + continue + } } } // If a public key exists for this SSH server, check that it matches diff --git a/cmd/puppeth/testdata/stureby_aleth.json b/cmd/puppeth/testdata/stureby_aleth.json index 1ef1d8ae1866..d18ba3854aa5 100644 --- a/cmd/puppeth/testdata/stureby_aleth.json +++ b/cmd/puppeth/testdata/stureby_aleth.json @@ -1,112 +1,113 @@ { - "sealEngine":"Ethash", - "params":{ - "accountStartNonce":"0x00", - "maximumExtraDataSize":"0x20", - "homesteadForkBlock":"0x2710", - "daoHardforkBlock":"0x00", - "EIP150ForkBlock":"0x3a98", - "EIP158ForkBlock":"0x59d8", - "byzantiumForkBlock":"0x7530", - "constantinopleForkBlock":"0x9c40", - "minGasLimit":"0x1388", - "maxGasLimit":"0x7fffffffffffffff", - "tieBreakingGas":false, - "gasLimitBoundDivisor":"0x0400", - "minimumDifficulty":"0x20000", - "difficultyBoundDivisor":"0x0800", - "durationLimit":"0x0d", - "blockReward":"0x4563918244F40000", - "networkID":"0x4cb2e", - "chainID":"0x4cb2e", - "allowFutureBlocks":false + "sealEngine": "Ethash", + "params": { + "accountStartNonce": "0x0", + "maximumExtraDataSize": "0x20", + "homesteadForkBlock": "0x2710", + "daoHardforkBlock": "0x0", + "EIP150ForkBlock": "0x3a98", + "EIP158ForkBlock": "0x59d8", + "byzantiumForkBlock": "0x7530", + "constantinopleForkBlock": "0x9c40", + "constantinopleFixForkBlock": "0x9c40", + "istanbulForkBlock": "0xc350", + "minGasLimit": "0x1388", + "maxGasLimit": "0x7fffffffffffffff", + "tieBreakingGas": false, + "gasLimitBoundDivisor": "0x400", + "minimumDifficulty": "0x20000", + "difficultyBoundDivisor": "0x800", + "durationLimit": "0xd", + "blockReward": "0x4563918244f40000", + "networkID": "0x4cb2e", + "chainID": "0x4cb2e", + "allowFutureBlocks": false }, - "genesis":{ - "nonce":"0x0000000000000000", - "difficulty":"0x20000", - "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000", - "author":"0x0000000000000000000000000000000000000000", - "timestamp":"0x59a4e76d", - "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000", - "extraData":"0x0000000000000000000000000000000000000000000000000000000b4dc0ffee", - "gasLimit":"0x47b760" + "genesis": { + "nonce": "0x0000000000000000", + "difficulty": "0x20000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "author": "0x0000000000000000000000000000000000000000", + "timestamp": "0x59a4e76d", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "extraData": "0x0000000000000000000000000000000000000000000000000000000b4dc0ffee", + "gasLimit": "0x47b760" }, - "accounts":{ - "0000000000000000000000000000000000000001":{ - "balance":"1", - "precompiled":{ - "name":"ecrecover", - "linear":{ - "base":3000, - "word":0 + "accounts": { + "0000000000000000000000000000000000000001": { + "balance": "0x1", + "precompiled": { + "name": "ecrecover", + "linear": { + "base": 3000, + "word": 0 } } }, - "0000000000000000000000000000000000000002":{ - "balance":"1", - "precompiled":{ - "name":"sha256", - "linear":{ - "base":60, - "word":12 + "0000000000000000000000000000000000000002": { + "balance": "0x1", + "precompiled": { + "name": "sha256", + "linear": { + "base": 60, + "word": 12 } } }, - "0000000000000000000000000000000000000003":{ - "balance":"1", - "precompiled":{ - "name":"ripemd160", - "linear":{ - "base":600, - "word":120 + "0000000000000000000000000000000000000003": { + "balance": "0x1", + "precompiled": { + "name": "ripemd160", + "linear": { + "base": 600, + "word": 120 } } }, - "0000000000000000000000000000000000000004":{ - "balance":"1", - "precompiled":{ - "name":"identity", - "linear":{ - "base":15, - "word":3 + "0000000000000000000000000000000000000004": { + "balance": "0x1", + "precompiled": { + "name": "identity", + "linear": { + "base": 15, + "word": 3 } } }, - "0000000000000000000000000000000000000005":{ - "balance":"1", - "precompiled":{ - "name":"modexp", - "startingBlock":"0x7530" + "0000000000000000000000000000000000000005": { + "balance": "0x1", + "precompiled": { + "name": "modexp", + "startingBlock": "0x7530" } }, - "0000000000000000000000000000000000000006":{ - "balance":"1", - "precompiled":{ - "name":"alt_bn128_G1_add", - "startingBlock":"0x7530", - "linear":{ - "base":500, - "word":0 - } + "0000000000000000000000000000000000000006": { + "balance": "0x1", + "precompiled": { + "name": "alt_bn128_G1_add", + "startingBlock": "0x7530" } }, - "0000000000000000000000000000000000000007":{ - "balance":"1", - "precompiled":{ - "name":"alt_bn128_G1_mul", - "startingBlock":"0x7530", - "linear":{ - "base":40000, - "word":0 - } + "0000000000000000000000000000000000000007": { + "balance": "0x1", + "precompiled": { + "name": "alt_bn128_G1_mul", + "startingBlock": "0x7530" + } + }, + "0000000000000000000000000000000000000008": { + "balance": "0x1", + "precompiled": { + "name": "alt_bn128_pairing_product", + "startingBlock": "0x7530" } }, - "0000000000000000000000000000000000000008":{ - "balance":"1", - "precompiled":{ - "name":"alt_bn128_pairing_product", - "startingBlock":"0x7530" + "0000000000000000000000000000000000000009": { + "balance": "0x1", + "precompiled": { + "name": "blake2_compression", + "startingBlock": "0xc350" } } } -} +} \ No newline at end of file diff --git a/cmd/puppeth/testdata/stureby_geth.json b/cmd/puppeth/testdata/stureby_geth.json index c8c3b3c9564c..79f03469af8c 100644 --- a/cmd/puppeth/testdata/stureby_geth.json +++ b/cmd/puppeth/testdata/stureby_geth.json @@ -1,6 +1,5 @@ { "config": { - "ethash":{}, "chainId": 314158, "homesteadBlock": 10000, "eip150Block": 15000, @@ -8,11 +7,13 @@ "eip155Block": 23000, "eip158Block": 23000, "byzantiumBlock": 30000, - "constantinopleBlock": 40000 + "constantinopleBlock": 40000, + "petersburgBlock": 40000, + "istanbulBlock": 50000, + "ethash": {} }, "nonce": "0x0", "timestamp": "0x59a4e76d", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "0x0000000000000000000000000000000000000000000000000000000b4dc0ffee", "gasLimit": "0x47b760", "difficulty": "0x20000", @@ -20,28 +21,34 @@ "coinbase": "0x0000000000000000000000000000000000000000", "alloc": { "0000000000000000000000000000000000000001": { - "balance": "0x01" + "balance": "0x1" }, "0000000000000000000000000000000000000002": { - "balance": "0x01" + "balance": "0x1" }, "0000000000000000000000000000000000000003": { - "balance": "0x01" + "balance": "0x1" }, "0000000000000000000000000000000000000004": { - "balance": "0x01" + "balance": "0x1" }, "0000000000000000000000000000000000000005": { - "balance": "0x01" + "balance": "0x1" }, "0000000000000000000000000000000000000006": { - "balance": "0x01" + "balance": "0x1" }, "0000000000000000000000000000000000000007": { - "balance": "0x01" + "balance": "0x1" }, "0000000000000000000000000000000000000008": { - "balance": "0x01" + "balance": "0x1" + }, + "0000000000000000000000000000000000000009": { + "balance": "0x1" } - } -} + }, + "number": "0x0", + "gasUsed": "0x0", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000" +} \ No newline at end of file diff --git a/cmd/puppeth/testdata/stureby_parity.json b/cmd/puppeth/testdata/stureby_parity.json index f3fa8386a061..e9229f99b7ea 100644 --- a/cmd/puppeth/testdata/stureby_parity.json +++ b/cmd/puppeth/testdata/stureby_parity.json @@ -1,181 +1,213 @@ { - "name":"Stureby", - "dataDir":"stureby", - "engine":{ - "Ethash":{ - "params":{ - "minimumDifficulty":"0x20000", - "difficultyBoundDivisor":"0x800", - "durationLimit":"0xd", - "blockReward":{ - "0x0":"0x4563918244f40000", - "0x7530":"0x29a2241af62c0000", - "0x9c40":"0x1bc16d674ec80000" + "name": "stureby", + "dataDir": "stureby", + "engine": { + "Ethash": { + "params": { + "minimumDifficulty": "0x20000", + "difficultyBoundDivisor": "0x800", + "durationLimit": "0xd", + "blockReward": { + "0x0": "0x4563918244f40000", + "0x7530": "0x29a2241af62c0000", + "0x9c40": "0x1bc16d674ec80000" }, - "homesteadTransition":"0x2710", - "eip100bTransition":"0x7530", - "difficultyBombDelays":{ - "0x7530":"0x2dc6c0", - "0x9c40":"0x1e8480" - } + "difficultyBombDelays": { + "0x7530": "0x2dc6c0", + "0x9c40": "0x1e8480" + }, + "homesteadTransition": "0x2710", + "eip100bTransition": "0x7530" } } }, - "params":{ - "accountStartNonce":"0x0", - "maximumExtraDataSize":"0x20", - "gasLimitBoundDivisor":"0x400", - "minGasLimit":"0x1388", - "networkID":"0x4cb2e", - "chainID":"0x4cb2e", - "maxCodeSize":"0x6000", - "maxCodeSizeTransition":"0x0", + "params": { + "accountStartNonce": "0x0", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0x1388", + "gasLimitBoundDivisor": "0x400", + "networkID": "0x4cb2e", + "chainID": "0x4cb2e", + "maxCodeSize": "0x6000", + "maxCodeSizeTransition": "0x0", "eip98Transition": "0x7fffffffffffffff", - "eip150Transition":"0x3a98", - "eip160Transition":"0x59d8", - "eip161abcTransition":"0x59d8", - "eip161dTransition":"0x59d8", - "eip155Transition":"0x59d8", - "eip140Transition":"0x7530", - "eip211Transition":"0x7530", - "eip214Transition":"0x7530", - "eip658Transition":"0x7530", - "eip145Transition":"0x9c40", - "eip1014Transition":"0x9c40", - "eip1052Transition":"0x9c40", - "eip1283Transition":"0x9c40" + "eip150Transition": "0x3a98", + "eip160Transition": "0x59d8", + "eip161abcTransition": "0x59d8", + "eip161dTransition": "0x59d8", + "eip155Transition": "0x59d8", + "eip140Transition": "0x7530", + "eip211Transition": "0x7530", + "eip214Transition": "0x7530", + "eip658Transition": "0x7530", + "eip145Transition": "0x9c40", + "eip1014Transition": "0x9c40", + "eip1052Transition": "0x9c40", + "eip1283Transition": "0x9c40", + "eip1283DisableTransition": "0x9c40", + "eip1283ReenableTransition": "0xc350", + "eip1344Transition": "0xc350", + "eip1884Transition": "0xc350", + "eip2028Transition": "0xc350" }, - "genesis":{ - "seal":{ - "ethereum":{ - "nonce":"0x0000000000000000", - "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000" + "genesis": { + "seal": { + "ethereum": { + "nonce": "0x0000000000000000", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000" } }, - "difficulty":"0x20000", - "author":"0x0000000000000000000000000000000000000000", - "timestamp":"0x59a4e76d", - "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000", - "extraData":"0x0000000000000000000000000000000000000000000000000000000b4dc0ffee", - "gasLimit":"0x47b760" + "difficulty": "0x20000", + "author": "0x0000000000000000000000000000000000000000", + "timestamp": "0x59a4e76d", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "extraData": "0x0000000000000000000000000000000000000000000000000000000b4dc0ffee", + "gasLimit": "0x47b760" }, - "nodes":[ - "enode://dfa7aca3f5b635fbfe7d0b20575f25e40d9e27b4bfbb3cf74364a42023ad9f25c1a4383bcc8cced86ee511a7d03415345a4df05be37f1dff040e4c780699f1c0@168.61.153.255:31303", - "enode://ef441b20dd70aeabf0eac35c3b8a2854e5ce04db0e30be9152ea9fd129359dcbb3f803993303ff5781c755dfd7223f3fe43505f583cccb740949407677412ba9@40.74.91.252:31303", - "enode://953b5ea1c8987cf46008232a0160324fd00d41320ecf00e23af86ec8f5396b19eb57ddab37c78141be56f62e9077de4f4dfa0747fa768ed8c8531bbfb1046237@40.70.214.166:31303", - "enode://276e613dd4b277a66591e565711e6c8bb107f0905248a9f8f8228c1a87992e156e5114bb9937c02824a9d9d25f76340442cf86e2028bf5293cae19904fb2b98e@35.178.251.52:30303", - "enode://064c820d41e52ed7d426ac64b60506c2998235bedc7e67cb497c6faf7bb4fc54fe56fc82d0add3180b747c0c4f40a1108a6f84d7d0629ed606d504528e61cc57@3.8.5.3:30303", - "enode://90069fdabcc5e684fa5d59430bebbb12755d9362dfe5006a1485b13d71a78a3812d36e74dd7d88e50b51add01e097ea80f16263aeaa4f0230db6c79e2a97e7ca@217.29.191.142:30303", - "enode://0aac74b7fd28726275e466acb5e03bc88a95927e9951eb66b5efb239b2f798ada0690853b2f2823fe4efa408f0f3d4dd258430bc952a5ff70677b8625b3e3b14@40.115.33.57:40404", - "enode://0b96415a10f835106d83e090a0528eed5e7887e5c802a6d084e9f1993a9d0fc713781e6e4101f6365e9b91259712f291acc0a9e6e667e22023050d602c36fbe2@40.115.33.57:40414" - ], - "accounts":{ - "0000000000000000000000000000000000000001":{ - "balance":"1", - "nonce":"0", - "builtin":{ - "name":"ecrecover", - "pricing":{ - "linear":{ - "base":3000, - "word":0 + "nodes": [], + "accounts": { + "0000000000000000000000000000000000000001": { + "balance": "0x1", + "builtin": { + "name": "ecrecover", + "pricing": { + "linear": { + "base": 3000, + "word": 0 } } } }, - "0000000000000000000000000000000000000002":{ - "balance":"1", - "nonce":"0", - "builtin":{ - "name":"sha256", - "pricing":{ - "linear":{ - "base":60, - "word":12 + "0000000000000000000000000000000000000002": { + "balance": "0x1", + "builtin": { + "name": "sha256", + "pricing": { + "linear": { + "base": 60, + "word": 12 } } } }, - "0000000000000000000000000000000000000003":{ - "balance":"1", - "nonce":"0", - "builtin":{ - "name":"ripemd160", - "pricing":{ - "linear":{ - "base":600, - "word":120 + "0000000000000000000000000000000000000003": { + "balance": "0x1", + "builtin": { + "name": "ripemd160", + "pricing": { + "linear": { + "base": 600, + "word": 120 } } } }, - "0000000000000000000000000000000000000004":{ - "balance":"1", - "nonce":"0", - "builtin":{ - "name":"identity", - "pricing":{ - "linear":{ - "base":15, - "word":3 + "0000000000000000000000000000000000000004": { + "balance": "0x1", + "builtin": { + "name": "identity", + "pricing": { + "linear": { + "base": 15, + "word": 3 } } } }, - "0000000000000000000000000000000000000005":{ - "balance":"1", - "nonce":"0", - "builtin":{ - "name":"modexp", - "activate_at":"0x7530", - "pricing":{ - "modexp":{ - "divisor":20 + "0000000000000000000000000000000000000005": { + "balance": "0x1", + "builtin": { + "name": "modexp", + "pricing": { + "modexp": { + "divisor": 20 } - } + }, + "activate_at": "0x7530" } }, - "0000000000000000000000000000000000000006":{ - "balance":"1", - "nonce":"0", - "builtin":{ - "name":"alt_bn128_add", - "activate_at":"0x7530", - "pricing":{ - "linear":{ - "base":500, - "word":0 + "0000000000000000000000000000000000000006": { + "balance": "0x1", + "builtin": { + "name": "alt_bn128_add", + "pricing": { + "0x0": { + "price": { + "alt_bn128_const_operations": { + "price": 500 + } + } + }, + "0xc350": { + "price": { + "alt_bn128_const_operations": { + "price": 150 + } + } } - } + }, + "activate_at": "0x7530" } }, - "0000000000000000000000000000000000000007":{ - "balance":"1", - "nonce":"0", - "builtin":{ - "name":"alt_bn128_mul", - "activate_at":"0x7530", - "pricing":{ - "linear":{ - "base":40000, - "word":0 + "0000000000000000000000000000000000000007": { + "balance": "0x1", + "builtin": { + "name": "alt_bn128_mul", + "pricing": { + "0x0": { + "price": { + "alt_bn128_const_operations": { + "price": 40000 + } + } + }, + "0xc350": { + "price": { + "alt_bn128_const_operations": { + "price": 6000 + } + } } - } + }, + "activate_at": "0x7530" } }, - "0000000000000000000000000000000000000008":{ - "balance":"1", - "nonce":"0", - "builtin":{ - "name":"alt_bn128_pairing", - "activate_at":"0x7530", - "pricing":{ - "alt_bn128_pairing":{ - "base":100000, - "pair":80000 + "0000000000000000000000000000000000000008": { + "balance": "0x1", + "builtin": { + "name": "alt_bn128_pairing", + "pricing": { + "0x0": { + "price": { + "alt_bn128_pairing": { + "base": 100000, + "pair": 80000 + } + } + }, + "0xc350": { + "price": { + "alt_bn128_pairing": { + "base": 45000, + "pair": 34000 + } + } } - } + }, + "activate_at": "0x7530" + } + }, + "0000000000000000000000000000000000000009": { + "balance": "0x1", + "builtin": { + "name": "blake2_f", + "pricing": { + "blake2_f": { + "gas_per_round": 1 + } + }, + "activate_at": "0xc350" } } } -} +} \ No newline at end of file diff --git a/cmd/puppeth/wizard.go b/cmd/puppeth/wizard.go index e59654b46649..83536506c4cb 100644 --- a/cmd/puppeth/wizard.go +++ b/cmd/puppeth/wizard.go @@ -31,9 +31,9 @@ import ( "strings" "sync" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/log" "golang.org/x/crypto/ssh/terminal" ) diff --git a/cmd/puppeth/wizard_dashboard.go b/cmd/puppeth/wizard_dashboard.go index 703b22b05eb6..b699d7617d00 100644 --- a/cmd/puppeth/wizard_dashboard.go +++ b/cmd/puppeth/wizard_dashboard.go @@ -19,7 +19,7 @@ package main import ( "fmt" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // deployDashboard queries the user for various input on deploying a web-service @@ -77,7 +77,7 @@ func (w *wizard) deployDashboard() { } case "explorer": if infos, err := checkExplorer(client, w.network); err == nil { - port = infos.webPort + port = infos.port } case "wallet": if infos, err := checkWallet(client, w.network); err == nil { diff --git a/cmd/puppeth/wizard_ethstats.go b/cmd/puppeth/wizard_ethstats.go index 58b78f443499..58ff3efbe986 100644 --- a/cmd/puppeth/wizard_ethstats.go +++ b/cmd/puppeth/wizard_ethstats.go @@ -20,7 +20,7 @@ import ( "fmt" "sort" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // deployEthstats queries the user for various input on deploying an ethstats diff --git a/cmd/puppeth/wizard_explorer.go b/cmd/puppeth/wizard_explorer.go index 6fb72fe8111c..1df9cbc0f322 100644 --- a/cmd/puppeth/wizard_explorer.go +++ b/cmd/puppeth/wizard_explorer.go @@ -21,7 +21,7 @@ import ( "fmt" "time" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // deployExplorer creates a new block explorer based on some user input. @@ -35,10 +35,6 @@ func (w *wizard) deployExplorer() { log.Error("No ethstats server configured") return } - if w.conf.Genesis.Config.Ethash == nil { - log.Error("Only ethash network supported") - return - } // Select the server to interact with server := w.selectServer() if server == "" { @@ -50,50 +46,57 @@ func (w *wizard) deployExplorer() { infos, err := checkExplorer(client, w.network) if err != nil { infos = &explorerInfos{ - nodePort: 30332, webPort: 80, webHost: client.server, + node: &nodeInfos{port: 30303}, + port: 80, + host: client.server, } } existed := err == nil - chainspec, err := newParityChainSpec(w.network, w.conf.Genesis, w.conf.bootnodes) - if err != nil { - log.Error("Failed to create chain spec for explorer", "err", err) - return - } - chain, _ := json.MarshalIndent(chainspec, "", " ") + infos.node.genesis, _ = json.MarshalIndent(w.conf.Genesis, "", " ") + infos.node.network = w.conf.Genesis.Config.ChainID.Int64() // Figure out which port to listen on fmt.Println() - fmt.Printf("Which port should the explorer listen on? (default = %d)\n", infos.webPort) - infos.webPort = w.readDefaultInt(infos.webPort) + fmt.Printf("Which port should the explorer listen on? (default = %d)\n", infos.port) + infos.port = w.readDefaultInt(infos.port) // Figure which virtual-host to deploy ethstats on - if infos.webHost, err = w.ensureVirtualHost(client, infos.webPort, infos.webHost); err != nil { + if infos.host, err = w.ensureVirtualHost(client, infos.port, infos.host); err != nil { log.Error("Failed to decide on explorer host", "err", err) return } // Figure out where the user wants to store the persistent data fmt.Println() - if infos.datadir == "" { - fmt.Printf("Where should data be stored on the remote machine?\n") - infos.datadir = w.readString() + if infos.node.datadir == "" { + fmt.Printf("Where should node data be stored on the remote machine?\n") + infos.node.datadir = w.readString() + } else { + fmt.Printf("Where should node data be stored on the remote machine? (default = %s)\n", infos.node.datadir) + infos.node.datadir = w.readDefaultString(infos.node.datadir) + } + // Figure out where the user wants to store the persistent data for backend database + fmt.Println() + if infos.dbdir == "" { + fmt.Printf("Where should postgres data be stored on the remote machine?\n") + infos.dbdir = w.readString() } else { - fmt.Printf("Where should data be stored on the remote machine? (default = %s)\n", infos.datadir) - infos.datadir = w.readDefaultString(infos.datadir) + fmt.Printf("Where should postgres data be stored on the remote machine? (default = %s)\n", infos.dbdir) + infos.dbdir = w.readDefaultString(infos.dbdir) } // Figure out which port to listen on fmt.Println() - fmt.Printf("Which TCP/UDP port should the archive node listen on? (default = %d)\n", infos.nodePort) - infos.nodePort = w.readDefaultInt(infos.nodePort) + fmt.Printf("Which TCP/UDP port should the archive node listen on? (default = %d)\n", infos.node.port) + infos.node.port = w.readDefaultInt(infos.node.port) // Set a proper name to report on the stats page fmt.Println() - if infos.ethstats == "" { + if infos.node.ethstats == "" { fmt.Printf("What should the explorer be called on the stats page?\n") - infos.ethstats = w.readString() + ":" + w.conf.ethstats + infos.node.ethstats = w.readString() + ":" + w.conf.ethstats } else { - fmt.Printf("What should the explorer be called on the stats page? (default = %s)\n", infos.ethstats) - infos.ethstats = w.readDefaultString(infos.ethstats) + ":" + w.conf.ethstats + fmt.Printf("What should the explorer be called on the stats page? (default = %s)\n", infos.node.ethstats) + infos.node.ethstats = w.readDefaultString(infos.node.ethstats) + ":" + w.conf.ethstats } // Try to deploy the explorer on the host nocache := false @@ -102,7 +105,7 @@ func (w *wizard) deployExplorer() { fmt.Printf("Should the explorer be built from scratch (y/n)? (default = no)\n") nocache = w.readDefaultYesNo(false) } - if out, err := deployExplorer(client, w.network, chain, infos, nocache); err != nil { + if out, err := deployExplorer(client, w.network, w.conf.bootnodes, infos, nocache, w.conf.Genesis.Config.Clique != nil); err != nil { log.Error("Failed to deploy explorer container", "err", err) if len(out) > 0 { fmt.Printf("%s\n", out) diff --git a/cmd/puppeth/wizard_faucet.go b/cmd/puppeth/wizard_faucet.go index c4e674a8553b..b6ab36eddc2b 100644 --- a/cmd/puppeth/wizard_faucet.go +++ b/cmd/puppeth/wizard_faucet.go @@ -20,8 +20,8 @@ import ( "encoding/json" "fmt" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/log" ) // deployFaucet queries the user for various input on deploying a faucet, after @@ -147,7 +147,7 @@ func (w *wizard) deployFaucet() { infos.node.keyPass = w.readPassword() if _, err := keystore.DecryptKey([]byte(infos.node.keyJSON), infos.node.keyPass); err != nil { - log.Error("Failed to decrypt key with given passphrase") + log.Error("Failed to decrypt key with given password") infos.node.keyJSON = "" infos.node.keyPass = "" } diff --git a/cmd/puppeth/wizard_genesis.go b/cmd/puppeth/wizard_genesis.go index ce26a3b6a7d8..ab3e2247b6ec 100644 --- a/cmd/puppeth/wizard_genesis.go +++ b/cmd/puppeth/wizard_genesis.go @@ -29,10 +29,10 @@ import ( "path/filepath" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" ) // makeGenesis creates a new genesis struct based on some user input. @@ -44,12 +44,14 @@ func (w *wizard) makeGenesis() { Difficulty: big.NewInt(524288), Alloc: make(core.GenesisAlloc), Config: ¶ms.ChainConfig{ - HomesteadBlock: big.NewInt(1), - EIP150Block: big.NewInt(2), - EIP155Block: big.NewInt(3), - EIP158Block: big.NewInt(3), - ByzantiumBlock: big.NewInt(4), - ConstantinopleBlock: big.NewInt(5), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), }, } // Figure out which consensus engine to choose @@ -191,7 +193,7 @@ func (w *wizard) importGenesis() { func (w *wizard) manageGenesis() { // Figure out whether to modify or export the genesis fmt.Println() - fmt.Println(" 1. Modify existing fork rules") + fmt.Println(" 1. Modify existing configurations") fmt.Println(" 2. Export genesis configurations") fmt.Println(" 3. Remove genesis configuration") @@ -222,10 +224,22 @@ func (w *wizard) manageGenesis() { fmt.Println() fmt.Printf("Which block should Constantinople come into effect? (default = %v)\n", w.conf.Genesis.Config.ConstantinopleBlock) w.conf.Genesis.Config.ConstantinopleBlock = w.readDefaultBigInt(w.conf.Genesis.Config.ConstantinopleBlock) + if w.conf.Genesis.Config.PetersburgBlock == nil { + w.conf.Genesis.Config.PetersburgBlock = w.conf.Genesis.Config.ConstantinopleBlock + } + fmt.Println() + fmt.Printf("Which block should Petersburg come into effect? (default = %v)\n", w.conf.Genesis.Config.PetersburgBlock) + w.conf.Genesis.Config.PetersburgBlock = w.readDefaultBigInt(w.conf.Genesis.Config.PetersburgBlock) + + fmt.Println() + fmt.Printf("Which block should Istanbul come into effect? (default = %v)\n", w.conf.Genesis.Config.IstanbulBlock) + w.conf.Genesis.Config.IstanbulBlock = w.readDefaultBigInt(w.conf.Genesis.Config.IstanbulBlock) out, _ := json.MarshalIndent(w.conf.Genesis.Config, "", " ") fmt.Printf("Chain configuration updated:\n\n%s\n", out) + w.conf.flush() + case "2": // Save whatever genesis configuration we currently have fmt.Println() @@ -259,7 +273,7 @@ func (w *wizard) manageGenesis() { } else { saveGenesis(folder, w.network, "parity", spec) } - // Export the genesis spec used by Harmony (formerly EthereumJ + // Export the genesis spec used by Harmony (formerly EthereumJ) saveGenesis(folder, w.network, "harmony", w.conf.Genesis) case "3": @@ -282,7 +296,7 @@ func (w *wizard) manageGenesis() { func saveGenesis(folder, network, client string, spec interface{}) { path := filepath.Join(folder, fmt.Sprintf("%s-%s.json", network, client)) - out, _ := json.Marshal(spec) + out, _ := json.MarshalIndent(spec, "", " ") if err := ioutil.WriteFile(path, out, 0644); err != nil { log.Error("Failed to save genesis file", "client", client, "err", err) return diff --git a/cmd/puppeth/wizard_intro.go b/cmd/puppeth/wizard_intro.go index 1ee6860c3d0e..75fb04b76f70 100644 --- a/cmd/puppeth/wizard_intro.go +++ b/cmd/puppeth/wizard_intro.go @@ -26,7 +26,7 @@ import ( "strings" "sync" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // makeWizard creates and returns a new puppeth wizard. diff --git a/cmd/puppeth/wizard_netstats.go b/cmd/puppeth/wizard_netstats.go index 6c86ae34d1e2..99ca11bb1776 100644 --- a/cmd/puppeth/wizard_netstats.go +++ b/cmd/puppeth/wizard_netstats.go @@ -23,8 +23,8 @@ import ( "strings" "sync" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/log" "github.com/olekukonko/tablewriter" ) diff --git a/cmd/puppeth/wizard_network.go b/cmd/puppeth/wizard_network.go index 28e042930be0..97302c0df8bb 100644 --- a/cmd/puppeth/wizard_network.go +++ b/cmd/puppeth/wizard_network.go @@ -20,7 +20,7 @@ import ( "fmt" "strings" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // manageServers displays a list of servers the user can disconnect from, and an @@ -174,7 +174,7 @@ func (w *wizard) deployComponent() { fmt.Println(" 1. Ethstats - Network monitoring tool") fmt.Println(" 2. Bootnode - Entry point of the network") fmt.Println(" 3. Sealer - Full node minting new blocks") - fmt.Println(" 4. Explorer - Chain analysis webservice (ethash only)") + fmt.Println(" 4. Explorer - Chain analysis webservice") fmt.Println(" 5. Wallet - Browser wallet for quick sends") fmt.Println(" 6. Faucet - Crypto faucet to give away funds") fmt.Println(" 7. Dashboard - Website listing above web-services") diff --git a/cmd/puppeth/wizard_nginx.go b/cmd/puppeth/wizard_nginx.go index 27f9abb4b1e0..8397b7fd57ff 100644 --- a/cmd/puppeth/wizard_nginx.go +++ b/cmd/puppeth/wizard_nginx.go @@ -19,7 +19,7 @@ package main import ( "fmt" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // ensureVirtualHost checks whether a reverse-proxy is running on the specified diff --git a/cmd/puppeth/wizard_node.go b/cmd/puppeth/wizard_node.go index 71f51cd724fa..eab143739b99 100644 --- a/cmd/puppeth/wizard_node.go +++ b/cmd/puppeth/wizard_node.go @@ -21,9 +21,9 @@ import ( "fmt" "time" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" ) // deployNode creates a new node configuration based on some user input. @@ -142,7 +142,7 @@ func (w *wizard) deployNode(boot bool) { infos.keyPass = w.readPassword() if _, err := keystore.DecryptKey([]byte(infos.keyJSON), infos.keyPass); err != nil { - log.Error("Failed to decrypt key with given passphrase") + log.Error("Failed to decrypt key with given password") return } } diff --git a/cmd/puppeth/wizard_wallet.go b/cmd/puppeth/wizard_wallet.go index 02f4e5833e8a..723d53f91657 100644 --- a/cmd/puppeth/wizard_wallet.go +++ b/cmd/puppeth/wizard_wallet.go @@ -21,7 +21,7 @@ import ( "fmt" "time" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // deployWallet creates a new web wallet based on some user input. diff --git a/cmd/rlpdump/main.go b/cmd/rlpdump/main.go index aed9322c03b6..d0f993c5b88d 100644 --- a/cmd/rlpdump/main.go +++ b/cmd/rlpdump/main.go @@ -26,7 +26,7 @@ import ( "os" "strings" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/rlp" ) var ( diff --git a/cmd/swarm/access.go b/cmd/swarm/access.go deleted file mode 100644 index 62e972013ad1..000000000000 --- a/cmd/swarm/access.go +++ /dev/null @@ -1,297 +0,0 @@ -// Copyright 2018 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 ( - "crypto/rand" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "strings" - - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/swarm/api" - "github.com/nebulaai/nbai-node/swarm/api/client" - "gopkg.in/urfave/cli.v1" -) - -var ( - salt = make([]byte, 32) - accessCommand = cli.Command{ - CustomHelpTemplate: helpTemplate, - Name: "access", - Usage: "encrypts a reference and embeds it into a root manifest", - ArgsUsage: "", - Description: "encrypts a reference and embeds it into a root manifest", - Subcommands: []cli.Command{ - { - CustomHelpTemplate: helpTemplate, - Name: "new", - Usage: "encrypts a reference and embeds it into a root manifest", - ArgsUsage: "", - Description: "encrypts a reference and embeds it into a root access manifest and prints the resulting manifest", - Subcommands: []cli.Command{ - { - Action: accessNewPass, - CustomHelpTemplate: helpTemplate, - Flags: []cli.Flag{ - utils.PasswordFileFlag, - SwarmDryRunFlag, - }, - Name: "pass", - Usage: "encrypts a reference with a password and embeds it into a root manifest", - ArgsUsage: "", - Description: "encrypts a reference and embeds it into a root access manifest and prints the resulting manifest", - }, - { - Action: accessNewPK, - CustomHelpTemplate: helpTemplate, - Flags: []cli.Flag{ - utils.PasswordFileFlag, - SwarmDryRunFlag, - SwarmAccessGrantKeyFlag, - }, - Name: "pk", - Usage: "encrypts a reference with the node's private key and a given grantee's public key and embeds it into a root manifest", - ArgsUsage: "", - Description: "encrypts a reference and embeds it into a root access manifest and prints the resulting manifest", - }, - { - Action: accessNewACT, - CustomHelpTemplate: helpTemplate, - Flags: []cli.Flag{ - SwarmAccessGrantKeysFlag, - SwarmDryRunFlag, - utils.PasswordFileFlag, - }, - Name: "act", - Usage: "encrypts a reference with the node's private key and a given grantee's public key and embeds it into a root manifest", - ArgsUsage: "", - Description: "encrypts a reference and embeds it into a root access manifest and prints the resulting manifest", - }, - }, - }, - }, - } -) - -func init() { - if _, err := io.ReadFull(rand.Reader, salt); err != nil { - panic("reading from crypto/rand failed: " + err.Error()) - } -} - -func accessNewPass(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 1 { - utils.Fatalf("Expected 1 argument - the ref") - } - - var ( - ae *api.AccessEntry - accessKey []byte - err error - ref = args[0] - password = getPassPhrase("", 0, makePasswordList(ctx)) - dryRun = ctx.Bool(SwarmDryRunFlag.Name) - ) - accessKey, ae, err = api.DoPassword(ctx, password, salt) - if err != nil { - utils.Fatalf("error getting session key: %v", err) - } - m, err := api.GenerateAccessControlManifest(ctx, ref, accessKey, ae) - if err != nil { - utils.Fatalf("had an error generating the manifest: %v", err) - } - if dryRun { - err = printManifests(m, nil) - if err != nil { - utils.Fatalf("had an error printing the manifests: %v", err) - } - } else { - err = uploadManifests(ctx, m, nil) - if err != nil { - utils.Fatalf("had an error uploading the manifests: %v", err) - } - } -} - -func accessNewPK(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 1 { - utils.Fatalf("Expected 1 argument - the ref") - } - - var ( - ae *api.AccessEntry - sessionKey []byte - err error - ref = args[0] - privateKey = getPrivKey(ctx) - granteePublicKey = ctx.String(SwarmAccessGrantKeyFlag.Name) - dryRun = ctx.Bool(SwarmDryRunFlag.Name) - ) - sessionKey, ae, err = api.DoPK(ctx, privateKey, granteePublicKey, salt) - if err != nil { - utils.Fatalf("error getting session key: %v", err) - } - m, err := api.GenerateAccessControlManifest(ctx, ref, sessionKey, ae) - if err != nil { - utils.Fatalf("had an error generating the manifest: %v", err) - } - if dryRun { - err = printManifests(m, nil) - if err != nil { - utils.Fatalf("had an error printing the manifests: %v", err) - } - } else { - err = uploadManifests(ctx, m, nil) - if err != nil { - utils.Fatalf("had an error uploading the manifests: %v", err) - } - } -} - -func accessNewACT(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 1 { - utils.Fatalf("Expected 1 argument - the ref") - } - - var ( - ae *api.AccessEntry - actManifest *api.Manifest - accessKey []byte - err error - ref = args[0] - pkGrantees = []string{} - passGrantees = []string{} - pkGranteesFilename = ctx.String(SwarmAccessGrantKeysFlag.Name) - passGranteesFilename = ctx.String(utils.PasswordFileFlag.Name) - privateKey = getPrivKey(ctx) - dryRun = ctx.Bool(SwarmDryRunFlag.Name) - ) - if pkGranteesFilename == "" && passGranteesFilename == "" { - utils.Fatalf("you have to provide either a grantee public-keys file or an encryption passwords file (or both)") - } - - if pkGranteesFilename != "" { - bytes, err := ioutil.ReadFile(pkGranteesFilename) - if err != nil { - utils.Fatalf("had an error reading the grantee public key list") - } - pkGrantees = strings.Split(strings.Trim(string(bytes), "\n"), "\n") - } - - if passGranteesFilename != "" { - bytes, err := ioutil.ReadFile(passGranteesFilename) - if err != nil { - utils.Fatalf("could not read password filename: %v", err) - } - passGrantees = strings.Split(strings.Trim(string(bytes), "\n"), "\n") - } - accessKey, ae, actManifest, err = api.DoACT(ctx, privateKey, salt, pkGrantees, passGrantees) - if err != nil { - utils.Fatalf("error generating ACT manifest: %v", err) - } - - if err != nil { - utils.Fatalf("error getting session key: %v", err) - } - m, err := api.GenerateAccessControlManifest(ctx, ref, accessKey, ae) - if err != nil { - utils.Fatalf("error generating root access manifest: %v", err) - } - - if dryRun { - err = printManifests(m, actManifest) - if err != nil { - utils.Fatalf("had an error printing the manifests: %v", err) - } - } else { - err = uploadManifests(ctx, m, actManifest) - if err != nil { - utils.Fatalf("had an error uploading the manifests: %v", err) - } - } -} - -func printManifests(rootAccessManifest, actManifest *api.Manifest) error { - js, err := json.Marshal(rootAccessManifest) - if err != nil { - return err - } - fmt.Println(string(js)) - - if actManifest != nil { - js, err := json.Marshal(actManifest) - if err != nil { - return err - } - fmt.Println(string(js)) - } - return nil -} - -func uploadManifests(ctx *cli.Context, rootAccessManifest, actManifest *api.Manifest) error { - bzzapi := strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client := client.NewClient(bzzapi) - - var ( - key string - err error - ) - if actManifest != nil { - key, err = client.UploadManifest(actManifest, false) - if err != nil { - return err - } - - rootAccessManifest.Entries[0].Access.Act = key - } - key, err = client.UploadManifest(rootAccessManifest, false) - if err != nil { - return err - } - fmt.Println(key) - return nil -} - -// makePasswordList reads password lines from the file specified by the global --password flag -// and also by the same subcommand --password flag. -// This function ia a fork of utils.MakePasswordList to lookup cli context for subcommand. -// Function ctx.SetGlobal is not setting the global flag value that can be accessed -// by ctx.GlobalString using the current version of cli package. -func makePasswordList(ctx *cli.Context) []string { - path := ctx.GlobalString(utils.PasswordFileFlag.Name) - if path == "" { - path = ctx.String(utils.PasswordFileFlag.Name) - if path == "" { - return nil - } - } - text, err := ioutil.ReadFile(path) - if err != nil { - utils.Fatalf("Failed to read password file: %v", err) - } - lines := strings.Split(string(text), "\n") - // Sanitise DOS line endings. - for i := range lines { - lines[i] = strings.TrimRight(lines[i], "\r") - } - return lines -} diff --git a/cmd/swarm/access_test.go b/cmd/swarm/access_test.go deleted file mode 100644 index c026c266e5f2..000000000000 --- a/cmd/swarm/access_test.go +++ /dev/null @@ -1,614 +0,0 @@ -// Copyright 2018 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 ( - "bytes" - "crypto/rand" - "encoding/hex" - "encoding/json" - "io" - "io/ioutil" - gorand "math/rand" - "net/http" - "os" - "runtime" - "strings" - "testing" - "time" - - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/crypto/ecies" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/swarm/api" - swarmapi "github.com/nebulaai/nbai-node/swarm/api/client" - "github.com/nebulaai/nbai-node/swarm/testutil" - "golang.org/x/crypto/sha3" -) - -const ( - hashRegexp = `[a-f\d]{128}` - data = "notsorandomdata" -) - -var DefaultCurve = crypto.S256() - -func TestACT(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip() - } - - initCluster(t) - - cases := []struct { - name string - f func(t *testing.T) - }{ - {"Password", testPassword}, - {"PK", testPK}, - {"ACTWithoutBogus", testACTWithoutBogus}, - {"ACTWithBogus", testACTWithBogus}, - } - - for _, tc := range cases { - t.Run(tc.name, tc.f) - } -} - -// testPassword tests for the correct creation of an ACT manifest protected by a password. -// The test creates bogus content, uploads it encrypted, then creates the wrapping manifest with the Access entry -// The parties participating - node (publisher), uploads to second node then disappears. Content which was uploaded -// is then fetched through 2nd node. since the tested code is not key-aware - we can just -// fetch from the 2nd node using HTTP BasicAuth -func testPassword(t *testing.T) { - dataFilename := testutil.TempFileWithContent(t, data) - defer os.RemoveAll(dataFilename) - - // upload the file with 'swarm up' and expect a hash - up := runSwarm(t, - "--bzzapi", - cluster.Nodes[0].URL, - "up", - "--encrypt", - dataFilename) - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - - if len(matches) < 1 { - t.Fatal("no matches found") - } - - ref := matches[0] - tmp, err := ioutil.TempDir("", "swarm-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - password := "smth" - passwordFilename := testutil.TempFileWithContent(t, "smth") - defer os.RemoveAll(passwordFilename) - - up = runSwarm(t, - "access", - "new", - "pass", - "--dry-run", - "--password", - passwordFilename, - ref, - ) - - _, matches = up.ExpectRegexp(".+") - up.ExpectExit() - - if len(matches) == 0 { - t.Fatalf("stdout not matched") - } - - var m api.Manifest - - err = json.Unmarshal([]byte(matches[0]), &m) - if err != nil { - t.Fatalf("unmarshal manifest: %v", err) - } - - if len(m.Entries) != 1 { - t.Fatalf("expected one manifest entry, got %v", len(m.Entries)) - } - - e := m.Entries[0] - - ct := "application/bzz-manifest+json" - if e.ContentType != ct { - t.Errorf("expected %q content type, got %q", ct, e.ContentType) - } - - if e.Access == nil { - t.Fatal("manifest access is nil") - } - - a := e.Access - - if a.Type != "pass" { - t.Errorf(`got access type %q, expected "pass"`, a.Type) - } - if len(a.Salt) < 32 { - t.Errorf(`got salt with length %v, expected not less the 32 bytes`, len(a.Salt)) - } - if a.KdfParams == nil { - t.Fatal("manifest access kdf params is nil") - } - if a.Publisher != "" { - t.Fatal("should be empty") - } - - client := swarmapi.NewClient(cluster.Nodes[0].URL) - - hash, err := client.UploadManifest(&m, false) - if err != nil { - t.Fatal(err) - } - - url := cluster.Nodes[0].URL + "/" + "bzz:/" + hash - - httpClient := &http.Client{} - response, err := httpClient.Get(url) - if err != nil { - t.Fatal(err) - } - if response.StatusCode != http.StatusUnauthorized { - t.Fatal("should be a 401") - } - authHeader := response.Header.Get("WWW-Authenticate") - if authHeader == "" { - t.Fatal("should be something here") - } - - req, err := http.NewRequest(http.MethodGet, url, nil) - if err != nil { - t.Fatal(err) - } - req.SetBasicAuth("", password) - - response, err = http.DefaultClient.Do(req) - if err != nil { - t.Fatal(err) - } - defer response.Body.Close() - - if response.StatusCode != http.StatusOK { - t.Errorf("expected status %v, got %v", http.StatusOK, response.StatusCode) - } - d, err := ioutil.ReadAll(response.Body) - if err != nil { - t.Fatal(err) - } - if string(d) != data { - t.Errorf("expected decrypted data %q, got %q", data, string(d)) - } - - wrongPasswordFilename := testutil.TempFileWithContent(t, "just wr0ng") - defer os.RemoveAll(wrongPasswordFilename) - - //download file with 'swarm down' with wrong password - up = runSwarm(t, - "--bzzapi", - cluster.Nodes[0].URL, - "down", - "bzz:/"+hash, - tmp, - "--password", - wrongPasswordFilename) - - _, matches = up.ExpectRegexp("unauthorized") - if len(matches) != 1 && matches[0] != "unauthorized" { - t.Fatal(`"unauthorized" not found in output"`) - } - up.ExpectExit() -} - -// testPK tests for the correct creation of an ACT manifest between two parties (publisher and grantee). -// The test creates bogus content, uploads it encrypted, then creates the wrapping manifest with the Access entry -// The parties participating - node (publisher), uploads to second node (which is also the grantee) then disappears. -// Content which was uploaded is then fetched through the grantee's http proxy. Since the tested code is private-key aware, -// the test will fail if the proxy's given private key is not granted on the ACT. -func testPK(t *testing.T) { - dataFilename := testutil.TempFileWithContent(t, data) - defer os.RemoveAll(dataFilename) - - // upload the file with 'swarm up' and expect a hash - up := runSwarm(t, - "--bzzapi", - cluster.Nodes[0].URL, - "up", - "--encrypt", - dataFilename) - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - - if len(matches) < 1 { - t.Fatal("no matches found") - } - - ref := matches[0] - pk := cluster.Nodes[0].PrivateKey - granteePubKey := crypto.CompressPubkey(&pk.PublicKey) - - publisherDir, err := ioutil.TempDir("", "swarm-account-dir-temp") - if err != nil { - t.Fatal(err) - } - - passwordFilename := testutil.TempFileWithContent(t, testPassphrase) - defer os.RemoveAll(passwordFilename) - - _, publisherAccount := getTestAccount(t, publisherDir) - up = runSwarm(t, - "--bzzaccount", - publisherAccount.Address.String(), - "--password", - passwordFilename, - "--datadir", - publisherDir, - "--bzzapi", - cluster.Nodes[0].URL, - "access", - "new", - "pk", - "--dry-run", - "--grant-key", - hex.EncodeToString(granteePubKey), - ref, - ) - - _, matches = up.ExpectRegexp(".+") - up.ExpectExit() - - if len(matches) == 0 { - t.Fatalf("stdout not matched") - } - - //get the public key from the publisher directory - publicKeyFromDataDir := runSwarm(t, - "--bzzaccount", - publisherAccount.Address.String(), - "--password", - passwordFilename, - "--datadir", - publisherDir, - "print-keys", - "--compressed", - ) - _, publicKeyString := publicKeyFromDataDir.ExpectRegexp(".+") - publicKeyFromDataDir.ExpectExit() - pkComp := strings.Split(publicKeyString[0], "=")[1] - var m api.Manifest - - err = json.Unmarshal([]byte(matches[0]), &m) - if err != nil { - t.Fatalf("unmarshal manifest: %v", err) - } - - if len(m.Entries) != 1 { - t.Fatalf("expected one manifest entry, got %v", len(m.Entries)) - } - - e := m.Entries[0] - - ct := "application/bzz-manifest+json" - if e.ContentType != ct { - t.Errorf("expected %q content type, got %q", ct, e.ContentType) - } - - if e.Access == nil { - t.Fatal("manifest access is nil") - } - - a := e.Access - - if a.Type != "pk" { - t.Errorf(`got access type %q, expected "pk"`, a.Type) - } - if len(a.Salt) < 32 { - t.Errorf(`got salt with length %v, expected not less the 32 bytes`, len(a.Salt)) - } - if a.KdfParams != nil { - t.Fatal("manifest access kdf params should be nil") - } - if a.Publisher != pkComp { - t.Fatal("publisher key did not match") - } - client := swarmapi.NewClient(cluster.Nodes[0].URL) - - hash, err := client.UploadManifest(&m, false) - if err != nil { - t.Fatal(err) - } - - httpClient := &http.Client{} - - url := cluster.Nodes[0].URL + "/" + "bzz:/" + hash - response, err := httpClient.Get(url) - if err != nil { - t.Fatal(err) - } - if response.StatusCode != http.StatusOK { - t.Fatal("should be a 200") - } - d, err := ioutil.ReadAll(response.Body) - if err != nil { - t.Fatal(err) - } - if string(d) != data { - t.Errorf("expected decrypted data %q, got %q", data, string(d)) - } -} - -// testACTWithoutBogus tests the creation of the ACT manifest end-to-end, without any bogus entries (i.e. default scenario = 3 nodes 1 unauthorized) -func testACTWithoutBogus(t *testing.T) { - testACT(t, 0) -} - -// testACTWithBogus tests the creation of the ACT manifest end-to-end, with 100 bogus entries (i.e. 100 EC keys + default scenario = 3 nodes 1 unauthorized = 103 keys in the ACT manifest) -func testACTWithBogus(t *testing.T) { - testACT(t, 100) -} - -// testACT tests the e2e creation, uploading and downloading of an ACT access control with both EC keys AND password protection -// the test fires up a 3 node cluster, then randomly picks 2 nodes which will be acting as grantees to the data -// set and also protects the ACT with a password. the third node should fail decoding the reference as it will not be granted access. -// the third node then then tries to download using a correct password (and succeeds) then uses a wrong password and fails. -// the publisher uploads through one of the nodes then disappears. -func testACT(t *testing.T, bogusEntries int) { - var uploadThroughNode = cluster.Nodes[0] - client := swarmapi.NewClient(uploadThroughNode.URL) - - r1 := gorand.New(gorand.NewSource(time.Now().UnixNano())) - nodeToSkip := r1.Intn(clusterSize) // a number between 0 and 2 (node indices in `cluster`) - dataFilename := testutil.TempFileWithContent(t, data) - defer os.RemoveAll(dataFilename) - - // upload the file with 'swarm up' and expect a hash - up := runSwarm(t, - "--bzzapi", - cluster.Nodes[0].URL, - "up", - "--encrypt", - dataFilename) - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - - if len(matches) < 1 { - t.Fatal("no matches found") - } - - ref := matches[0] - grantees := []string{} - for i, v := range cluster.Nodes { - if i == nodeToSkip { - continue - } - pk := v.PrivateKey - granteePubKey := crypto.CompressPubkey(&pk.PublicKey) - grantees = append(grantees, hex.EncodeToString(granteePubKey)) - } - - if bogusEntries > 0 { - bogusGrantees := []string{} - - for i := 0; i < bogusEntries; i++ { - prv, err := ecies.GenerateKey(rand.Reader, DefaultCurve, nil) - if err != nil { - t.Fatal(err) - } - bogusGrantees = append(bogusGrantees, hex.EncodeToString(crypto.CompressPubkey(&prv.ExportECDSA().PublicKey))) - } - r2 := gorand.New(gorand.NewSource(time.Now().UnixNano())) - for i := 0; i < len(grantees); i++ { - insertAtIdx := r2.Intn(len(bogusGrantees)) - bogusGrantees = append(bogusGrantees[:insertAtIdx], append([]string{grantees[i]}, bogusGrantees[insertAtIdx:]...)...) - } - grantees = bogusGrantees - } - granteesPubkeyListFile := testutil.TempFileWithContent(t, strings.Join(grantees, "\n")) - defer os.RemoveAll(granteesPubkeyListFile) - - publisherDir, err := ioutil.TempDir("", "swarm-account-dir-temp") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(publisherDir) - - passwordFilename := testutil.TempFileWithContent(t, testPassphrase) - defer os.RemoveAll(passwordFilename) - actPasswordFilename := testutil.TempFileWithContent(t, "smth") - defer os.RemoveAll(actPasswordFilename) - _, publisherAccount := getTestAccount(t, publisherDir) - up = runSwarm(t, - "--bzzaccount", - publisherAccount.Address.String(), - "--password", - passwordFilename, - "--datadir", - publisherDir, - "--bzzapi", - cluster.Nodes[0].URL, - "access", - "new", - "act", - "--grant-keys", - granteesPubkeyListFile, - "--password", - actPasswordFilename, - ref, - ) - - _, matches = up.ExpectRegexp(`[a-f\d]{64}`) - up.ExpectExit() - - if len(matches) == 0 { - t.Fatalf("stdout not matched") - } - - //get the public key from the publisher directory - publicKeyFromDataDir := runSwarm(t, - "--bzzaccount", - publisherAccount.Address.String(), - "--password", - passwordFilename, - "--datadir", - publisherDir, - "print-keys", - "--compressed", - ) - _, publicKeyString := publicKeyFromDataDir.ExpectRegexp(".+") - publicKeyFromDataDir.ExpectExit() - pkComp := strings.Split(publicKeyString[0], "=")[1] - - hash := matches[0] - m, _, err := client.DownloadManifest(hash) - if err != nil { - t.Fatalf("unmarshal manifest: %v", err) - } - - if len(m.Entries) != 1 { - t.Fatalf("expected one manifest entry, got %v", len(m.Entries)) - } - - e := m.Entries[0] - - ct := "application/bzz-manifest+json" - if e.ContentType != ct { - t.Errorf("expected %q content type, got %q", ct, e.ContentType) - } - - if e.Access == nil { - t.Fatal("manifest access is nil") - } - - a := e.Access - - if a.Type != "act" { - t.Fatalf(`got access type %q, expected "act"`, a.Type) - } - if len(a.Salt) < 32 { - t.Fatalf(`got salt with length %v, expected not less the 32 bytes`, len(a.Salt)) - } - - if a.Publisher != pkComp { - t.Fatal("publisher key did not match") - } - httpClient := &http.Client{} - - // all nodes except the skipped node should be able to decrypt the content - for i, node := range cluster.Nodes { - log.Debug("trying to fetch from node", "node index", i) - - url := node.URL + "/" + "bzz:/" + hash - response, err := httpClient.Get(url) - if err != nil { - t.Fatal(err) - } - log.Debug("got response from node", "response code", response.StatusCode) - - if i == nodeToSkip { - log.Debug("reached node to skip", "status code", response.StatusCode) - - if response.StatusCode != http.StatusUnauthorized { - t.Fatalf("should be a 401") - } - - // try downloading using a password instead, using the unauthorized node - passwordUrl := strings.Replace(url, "http://", "http://:smth@", -1) - response, err = httpClient.Get(passwordUrl) - if err != nil { - t.Fatal(err) - } - if response.StatusCode != http.StatusOK { - t.Fatal("should be a 200") - } - - // now try with the wrong password, expect 401 - passwordUrl = strings.Replace(url, "http://", "http://:smthWrong@", -1) - response, err = httpClient.Get(passwordUrl) - if err != nil { - t.Fatal(err) - } - if response.StatusCode != http.StatusUnauthorized { - t.Fatal("should be a 401") - } - continue - } - - if response.StatusCode != http.StatusOK { - t.Fatal("should be a 200") - } - d, err := ioutil.ReadAll(response.Body) - if err != nil { - t.Fatal(err) - } - if string(d) != data { - t.Errorf("expected decrypted data %q, got %q", data, string(d)) - } - } -} - -// TestKeypairSanity is a sanity test for the crypto scheme for ACT. it asserts the correct shared secret according to -// the specs at https://github.com/ethersphere/swarm-docs/blob/eb857afda906c6e7bb90d37f3f334ccce5eef230/act.md -func TestKeypairSanity(t *testing.T) { - salt := make([]byte, 32) - if _, err := io.ReadFull(rand.Reader, salt); err != nil { - t.Fatalf("reading from crypto/rand failed: %v", err.Error()) - } - sharedSecret := "a85586744a1ddd56a7ed9f33fa24f40dd745b3a941be296a0d60e329dbdb896d" - - for i, v := range []struct { - publisherPriv string - granteePub string - }{ - { - publisherPriv: "ec5541555f3bc6376788425e9d1a62f55a82901683fd7062c5eddcc373a73459", - granteePub: "0226f213613e843a413ad35b40f193910d26eb35f00154afcde9ded57479a6224a", - }, - { - publisherPriv: "70c7a73011aa56584a0009ab874794ee7e5652fd0c6911cd02f8b6267dd82d2d", - granteePub: "02e6f8d5e28faaa899744972bb847b6eb805a160494690c9ee7197ae9f619181db", - }, - } { - b, _ := hex.DecodeString(v.granteePub) - granteePub, _ := crypto.DecompressPubkey(b) - publisherPrivate, _ := crypto.HexToECDSA(v.publisherPriv) - - ssKey, err := api.NewSessionKeyPK(publisherPrivate, granteePub, salt) - if err != nil { - t.Fatal(err) - } - - hasher := sha3.NewLegacyKeccak256() - hasher.Write(salt) - shared, err := hex.DecodeString(sharedSecret) - if err != nil { - t.Fatal(err) - } - hasher.Write(shared) - sum := hasher.Sum(nil) - - if !bytes.Equal(ssKey, sum) { - t.Fatalf("%d: got a session key mismatch", i) - } - } -} diff --git a/cmd/swarm/bootnodes.go b/cmd/swarm/bootnodes.go deleted file mode 100644 index cbba9970da0e..000000000000 --- a/cmd/swarm/bootnodes.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2018 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 - -var SwarmBootnodes = []string{ - // Foundation Swarm Gateway Cluster - "enode://e5c6f9215c919a5450a7b8c14c22535607b69f2c8e1e7f6f430cb25d7a2c27cd1df4c4f18ad7c1d7e5162e271ffcd3f20b1a1467fb6e790e7d727f3b2193de97@52.232.7.187:30399", - "enode://9b2fe07e69ccc7db5fef15793dab7d7d2e697ed92132d6e9548218e68a34613a8671ad03a6658d862b468ed693cae8a0f8f8d37274e4a657ffb59ca84676e45b@52.232.7.187:30400", - "enode://76c1059162c93ef9df0f01097c824d17c492634df211ef4c806935b349082233b63b90c23970254b3b7138d630400f7cf9b71e80355a446a8b733296cb04169a@52.232.7.187:30401", - "enode://ce46bbe2a8263145d65252d52da06e000ad350ed09c876a71ea9544efa42f63c1e1b6cc56307373aaad8f9dd069c90d0ed2dd1530106200e16f4ca681dd8ae2d@52.232.7.187:30402", - "enode://f431e0d6008a6c35c6e670373d828390c8323e53da8158e7bfc43cf07e632cc9e472188be8df01decadea2d4a068f1428caba769b632554a8fb0607bc296988f@52.232.7.187:30403", - "enode://174720abfff83d7392f121108ae50ea54e04889afe020df883655c0f6cb95414db945a0228d8982fe000d86fc9f4b7669161adc89cd7cd56f78f01489ab2b99b@52.232.7.187:30404", - "enode://2ae89be4be61a689b6f9ecee4360a59e185e010ab750f14b63b4ae43d4180e872e18e3437d4386ce44875dc7cc6eb761acba06412fe3178f3dac1dab3b65703e@52.232.7.187:30405", - "enode://24abebe1c0e6d75d6052ce3219a87be8573fd6397b4cb51f0773b83abba9b3d872bfb273cdc07389715b87adfac02f5235f5241442c5089802cbd8d42e310fce@52.232.7.187:30406", - "enode://d08dfa46bfbbdbcaafbb6e34abee4786610f6c91e0b76d7881f0334ac10dda41d8c1f2b6eedffb4493293c335c0ad46776443b2208d1fbbb9e1a90b25ee4eef2@52.232.7.187:30407", - "enode://8d95eb0f837d27581a43668ed3b8783d69dc4e84aa3edd7a0897e026155c8f59c8702fdc0375ee7bac15757c9c78e1315d9b73e4ce59c936db52ea4ae2f501c7@52.232.7.187:30408", - "enode://a5967cc804aebd422baaaba9f06f27c9e695ccab335b61088130f8cbe64e3cdf78793868c7051dfc06eecfe844fad54bc7f6dfaed9db3c7ecef279cb829c25fb@52.232.7.187:30409", - "enode://5f00134d81a8f2ebcc46f8766f627f492893eda48138f811b7de2168308171968f01710bca6da05764e74f14bae41652f554e6321f1aed85fa3461e89d075dbf@52.232.7.187:30410", - "enode://b2142b79b01a5aa66a5e23cc35e78219a8e97bc2412a6698cee24ae02e87078b725d71730711bd62e25ff1aa8658c6633778af8ac14c63814a337c3dd0ebda9f@52.232.7.187:30411", - "enode://1ffa7651094867d6486ce3ef46d27a052c2cb968b618346c6df7040322c7efc3337547ba85d4cbba32e8b31c42c867202554735c06d4c664b9afada2ed0c4b3c@52.232.7.187:30412", - "enode://129e0c3d5f5df12273754f6f703d2424409fa4baa599e0b758c55600169313887855e75b082028d2302ec034b303898cd697cc7ae8256ba924ce927510da2c8d@52.232.7.187:30413", - "enode://419e2dc0d2f5b022cf16b0e28842658284909fa027a0fbbb5e2b755e7f846ea02a8f0b66a7534981edf6a7bcf8a14855344c6668e2cd4476ccd35a11537c9144@52.232.7.187:30414", - "enode://23d55ad900583231b91f2f62e3f72eb498b342afd58b682be3af052eed62b5651094471065981de33d8786f075f05e3cca499503b0ac8ae84b2a06e99f5b0723@52.232.7.187:30415", - "enode://bc56e4158c00e9f616d7ea533def20a89bef959df4e62a768ff238ff4e1e9223f57ecff969941c20921bad98749baae311c0fbebce53bf7bbb9d3dc903640990@52.232.7.187:30416", - "enode://433ce15199c409875e7e72fffd69fdafe746f17b20f0d5555281722a65fde6c80328fab600d37d8624509adc072c445ce0dad4a1c01cff6acf3132c11d429d4d@52.232.7.187:30417", - "enode://632ee95b8f0eac51ef89ceb29313fef3a60050181d66a6b125583b1a225a7694b252edc016efb58aa3b251da756cb73280842a022c658ed405223b2f58626343@52.232.7.187:30418", - "enode://4a0f9bcff7a4b9ee453fb298d0fb222592efe121512e30cd72fef631beb8c6a15153a1456eb073ee18551c0e003c569651a101892dc4124e90b933733a498bb5@52.232.7.187:30419", - "enode://f0d80fbc72d16df30e19aac3051eb56a7aff0c8367686702e01ea132d8b0b3ee00cadd6a859d2cca98ec68d3d574f8a8a87dba2347ec1e2818dc84bc3fa34fae@52.232.7.187:30420", - "enode://a199146906e4f9f2b94b195a8308d9a59a3564b92efaab898a4243fe4c2ad918b7a8e4853d9d901d94fad878270a2669d644591299c3d43de1b298c00b92b4a7@52.232.7.187:30421", - "enode://052036ea8736b37adbfb684d90ce43e11b3591b51f31489d7c726b03618dea4f73b1e659deb928e6bf40564edcdcf08351643f42db3d4ca1c2b5db95dad59e94@52.232.7.187:30422", - "enode://460e2b8c6da8f12fac96c836e7d108f4b7ec55a1c64631bb8992339e117e1c28328fee83af863196e20af1487a655d13e5ceba90e980e92502d5bac5834c1f71@52.232.7.187:30423", - "enode://6d2cdd13741b2e72e9031e1b93c6d9a4e68de2844aa4e939f6a8a8498a7c1d7e2ee4c64217e92a6df08c9a32c6764d173552810ef1bd2ecb356532d389dd2136@52.232.7.187:30424", - "enode://62105fc25ce2cd5b299647f47eaa9211502dc76f0e9f461df915782df7242ac3223e3db04356ae6ed2977ccac20f0b16864406e9ca514a40a004cb6a5d0402aa@52.232.7.187:30425", - "enode://e0e388fc520fd493c33f0ce16685e6f98fb6aec28f2edc14ee6b179594ee519a896425b0025bb6f0e182dd3e468443f19c70885fbc66560d000093a668a86aa8@52.232.7.187:30426", - "enode://63f3353a72521ea10022127a4fe6b4acbef197c3fe668fd9f4805542d8a6fcf79f6335fbab62d180a35e19b739483e740858b113fdd7c13a26ad7b4e318a5aef@52.232.7.187:30427", - "enode://33a42b927085678d4aefd4e70b861cfca6ef5f6c143696c4f755973fd29e64c9e658cad57a66a687a7a156da1e3688b1fbdd17bececff2ee009fff038fa5666b@52.232.7.187:30428", - "enode://259ab5ab5c1daee3eab7e3819ab3177b82d25c29e6c2444fdd3f956e356afae79a72840ccf2d0665fe82c81ebc3b3734da1178ac9fd5d62c67e674b69f86b6be@52.232.7.187:30429", - "enode://558bccad7445ce3fd8db116ed6ab4aed1324fdbdac2348417340c1764dc46d46bffe0728e5b7d5c36f12e794c289f18f57f08f085d2c65c9910a5c7a65b6a66a@52.232.7.187:30430", - "enode://abe60937a0657ffded718e3f84a32987286983be257bdd6004775c4b525747c2b598f4fac49c8de324de5ce75b22673fa541a7ce2d555fb7f8ca325744ae3577@52.232.7.187:30431", - "enode://bce6f0aaa5b230742680084df71d4f026b3eff7f564265599216a1b06b765303fdc9325de30ffd5dfdaf302ce4b14322891d2faea50ce2ca298d7409f5858339@52.232.7.187:30432", - "enode://21b957c4e03277d42be6660730ec1b93f540764f26c6abdb54d006611139c7081248486206dfbf64fcaffd62589e9c6b8ea77a5297e4b21a605f1bcf49483ed0@52.232.7.187:30433", - "enode://ff104e30e64f24c3d7328acee8b13354e5551bc8d60bb25ecbd9632d955c7e34bb2d969482d173355baad91c8282f8b592624eb3929151090da3b4448d4d58fb@52.232.7.187:30434", - "enode://c76e2b5f81a521bceaec1518926a21380a345df9cf463461562c6845795512497fb67679e155fc96a74350f8b78de8f4c135dd52b106dbbb9795452021d09ea5@52.232.7.187:30435", - "enode://3288fd860105164f3e9b69934c4eb18f7146cfab31b5a671f994e21a36e9287766e5f9f075aefbc404538c77f7c2eb2a4495020a7633a1c3970d94e9fa770aeb@52.232.7.187:30436", - "enode://6cea859c7396d46b20cfcaa80f9a11cd112f8684f2f782f7b4c0e1e0af9212113429522075101923b9b957603e6c32095a6a07b5e5e35183c521952ee108dfaf@52.232.7.187:30437", - "enode://f628ec56e4ca8317cc24cc4ac9b27b95edcce7b96e1c7f3b53e30de4a8580fe44f2f0694a513bdb0a431acaf2824074d6ace4690247bbc34c14f426af8c056ea@52.232.7.187:30438", - "enode://055ec8b26fc105c4f97970a1cce9773a5e34c03f511b839db742198a1c571e292c54aa799e9afb991cc8a560529b8cdf3e0c344bc6c282aff2f68eec59361ddf@52.232.7.187:30439", - "enode://48cb0d430c328974226aa33a931d8446cd5a8d40f3ead8f4ce7ad60faa1278192eb6d58bed91258d63e81f255fc107eec2425ce2ae8b22350dd556076e160610@52.232.7.187:30440", - "enode://3fadb7af7f770d5ffc6b073b8d42834bebb18ce1fe8a4fe270d2b799e7051327093960dc61d9a18870db288f7746a0e6ea2a013cd6ab0e5f97ca08199473aace@52.232.7.187:30441", - "enode://a5d7168024c9992769cf380ffa559a64b4f39a29d468f579559863814eb0ae0ed689ac0871a3a2b4c78b03297485ec322d578281131ef5d5c09a4beb6200a97a@52.232.7.187:30442", - "enode://9c57744c5b2c2d71abcbe80512652f9234d4ab041b768a2a886ab390fe6f184860f40e113290698652d7e20a8ac74d27ac8671db23eb475b6c5e6253e4693bf8@52.232.7.187:30443", - "enode://daca9ff0c3176045a0e0ed228dee00ec86bc0939b135dc6b1caa23745d20fd0332e1ee74ad04020e89df56c7146d831a91b89d15ca3df05ba7618769fefab376@52.232.7.187:30444", - "enode://a3f6af59428cb4b9acb198db15ef5554fa43c2b0c18e468a269722d64a27218963a2975eaf82750b6262e42192b5e3669ea51337b4cda62b33987981bc5e0c1a@52.232.7.187:30445", - "enode://fe571422fa4651c3354c85dac61911a6a6520dd3c0332967a49d4133ca30e16a8a4946fa73ca2cb5de77917ea701a905e1c3015b2f4defcd53132b61cc84127a@52.232.7.187:30446", - - // Mainframe - "enode://ee9a5a571ea6c8a59f9a8bb2c569c865e922b41c91d09b942e8c1d4dd2e1725bd2c26149da14de1f6321a2c6fdf1e07c503c3e093fb61696daebf74d6acd916b@54.186.219.160:30399", - "enode://a03f0562ecb8a992ad5242345535e73483cdc18ab934d36bf24b567d43447c2cea68f89f1d51d504dd13acc30f24ebce5a150bea2ccb1b722122ce4271dc199d@52.67.248.147:30399", - "enode://e2cbf9eafd85903d3b1c56743035284320695e0072bc8d7396e0542aa5e1c321b236f67eab66b79c2f15d4447fa4bbe74dd67d0467da23e7eb829f60ec8a812b@13.58.169.1:30399", - "enode://8b8c6bda6047f1cad9fab2db4d3d02b7aa26279902c32879f7bcd4a7d189fee77fdc36ee151ce6b84279b4792e72578fd529d2274d014132465758fbfee51cee@13.209.13.15:30399", - "enode://63f6a8818927e429585287cf2ca0cb9b11fa990b7b9b331c2962cdc6f21807a2473b26e8256225c26caff70d7218e59586d704d49061452c6852e382c885d03c@35.154.106.174:30399", - "enode://ed4bd3b794ed73f18e6dcc70c6624dfec63b5654f6ab54e8f40b16eff8afbd342d4230e099ddea40e84423f81b2d2ea79799dc345257b1fec6f6c422c9d008f7@52.213.20.99:30399", -} diff --git a/cmd/swarm/config.go b/cmd/swarm/config.go deleted file mode 100644 index 420cac7a1380..000000000000 --- a/cmd/swarm/config.go +++ /dev/null @@ -1,427 +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 ( - "errors" - "fmt" - "io" - "os" - "reflect" - "strconv" - "strings" - "time" - "unicode" - - cli "gopkg.in/urfave/cli.v1" - - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/naoina/toml" - - bzzapi "github.com/nebulaai/nbai-node/swarm/api" -) - -var ( - //flag definition for the dumpconfig command - DumpConfigCommand = cli.Command{ - Action: utils.MigrateFlags(dumpConfig), - Name: "dumpconfig", - Usage: "Show configuration values", - ArgsUsage: "", - Flags: app.Flags, - Category: "MISCELLANEOUS COMMANDS", - Description: `The dumpconfig command shows configuration values.`, - } - - //flag definition for the config file command - SwarmTomlConfigPathFlag = cli.StringFlag{ - Name: "config", - Usage: "TOML configuration file", - } -) - -//constants for environment variables -const ( - SWARM_ENV_CHEQUEBOOK_ADDR = "SWARM_CHEQUEBOOK_ADDR" - SWARM_ENV_ACCOUNT = "SWARM_ACCOUNT" - SWARM_ENV_LISTEN_ADDR = "SWARM_LISTEN_ADDR" - SWARM_ENV_PORT = "SWARM_PORT" - SWARM_ENV_NETWORK_ID = "SWARM_NETWORK_ID" - SWARM_ENV_SWAP_ENABLE = "SWARM_SWAP_ENABLE" - SWARM_ENV_SWAP_API = "SWARM_SWAP_API" - SWARM_ENV_SYNC_DISABLE = "SWARM_SYNC_DISABLE" - SWARM_ENV_SYNC_UPDATE_DELAY = "SWARM_ENV_SYNC_UPDATE_DELAY" - SWARM_ENV_MAX_STREAM_PEER_SERVERS = "SWARM_ENV_MAX_STREAM_PEER_SERVERS" - SWARM_ENV_LIGHT_NODE_ENABLE = "SWARM_LIGHT_NODE_ENABLE" - SWARM_ENV_DELIVERY_SKIP_CHECK = "SWARM_DELIVERY_SKIP_CHECK" - SWARM_ENV_ENS_API = "SWARM_ENS_API" - SWARM_ENV_ENS_ADDR = "SWARM_ENS_ADDR" - SWARM_ENV_CORS = "SWARM_CORS" - SWARM_ENV_BOOTNODES = "SWARM_BOOTNODES" - SWARM_ENV_PSS_ENABLE = "SWARM_PSS_ENABLE" - SWARM_ENV_STORE_PATH = "SWARM_STORE_PATH" - SWARM_ENV_STORE_CAPACITY = "SWARM_STORE_CAPACITY" - SWARM_ENV_STORE_CACHE_CAPACITY = "SWARM_STORE_CACHE_CAPACITY" - SWARM_ACCESS_PASSWORD = "SWARM_ACCESS_PASSWORD" - SWARM_AUTO_DEFAULTPATH = "SWARM_AUTO_DEFAULTPATH" - GETH_ENV_DATADIR = "GETH_DATADIR" -) - -// These settings ensure that TOML keys use the same names as Go struct fields. -var tomlSettings = toml.Config{ - NormFieldName: func(rt reflect.Type, key string) string { - return key - }, - FieldToKey: func(rt reflect.Type, field string) string { - return field - }, - MissingField: func(rt reflect.Type, field string) error { - link := "" - if unicode.IsUpper(rune(rt.Name()[0])) && rt.PkgPath() != "main" { - link = fmt.Sprintf(", check github.com/nebulaai/nbai-node/swarm/api/config.go for available fields") - } - return fmt.Errorf("field '%s' is not defined in %s%s", field, rt.String(), link) - }, -} - -//before booting the swarm node, build the configuration -func buildConfig(ctx *cli.Context) (config *bzzapi.Config, err error) { - //start by creating a default config - config = bzzapi.NewConfig() - //first load settings from config file (if provided) - config, err = configFileOverride(config, ctx) - if err != nil { - return nil, err - } - //override settings provided by environment variables - config = envVarsOverride(config) - //override settings provided by command line - config = cmdLineOverride(config, ctx) - //validate configuration parameters - err = validateConfig(config) - - return -} - -//finally, after the configuration build phase is finished, initialize -func initSwarmNode(config *bzzapi.Config, stack *node.Node, ctx *cli.Context) { - //at this point, all vars should be set in the Config - //get the account for the provided swarm account - prvkey := getAccount(config.BzzAccount, ctx, stack) - //set the resolved config path (geth --datadir) - config.Path = expandPath(stack.InstanceDir()) - //finally, initialize the configuration - config.Init(prvkey) - //configuration phase completed here - log.Debug("Starting Swarm with the following parameters:") - //after having created the config, print it to screen - log.Debug(printConfig(config)) -} - -//configFileOverride overrides the current config with the config file, if a config file has been provided -func configFileOverride(config *bzzapi.Config, ctx *cli.Context) (*bzzapi.Config, error) { - var err error - - //only do something if the -config flag has been set - if ctx.GlobalIsSet(SwarmTomlConfigPathFlag.Name) { - var filepath string - if filepath = ctx.GlobalString(SwarmTomlConfigPathFlag.Name); filepath == "" { - utils.Fatalf("Config file flag provided with invalid file path") - } - var f *os.File - f, err = os.Open(filepath) - if err != nil { - return nil, err - } - defer f.Close() - - //decode the TOML file into a Config struct - //note that we are decoding into the existing defaultConfig; - //if an entry is not present in the file, the default entry is kept - err = tomlSettings.NewDecoder(f).Decode(&config) - // Add file name to errors that have a line number. - if _, ok := err.(*toml.LineError); ok { - err = errors.New(filepath + ", " + err.Error()) - } - } - return config, err -} - -//override the current config with whatever is provided through the command line -//most values are not allowed a zero value (empty string), if not otherwise noted -func cmdLineOverride(currentConfig *bzzapi.Config, ctx *cli.Context) *bzzapi.Config { - - if keyid := ctx.GlobalString(SwarmAccountFlag.Name); keyid != "" { - currentConfig.BzzAccount = keyid - } - - if chbookaddr := ctx.GlobalString(ChequebookAddrFlag.Name); chbookaddr != "" { - currentConfig.Contract = common.HexToAddress(chbookaddr) - } - - if networkid := ctx.GlobalString(SwarmNetworkIdFlag.Name); networkid != "" { - id, err := strconv.ParseUint(networkid, 10, 64) - if err != nil { - utils.Fatalf("invalid cli flag %s: %v", SwarmNetworkIdFlag.Name, err) - } - if id != 0 { - currentConfig.NetworkID = id - } - } - - if ctx.GlobalIsSet(utils.DataDirFlag.Name) { - if datadir := ctx.GlobalString(utils.DataDirFlag.Name); datadir != "" { - currentConfig.Path = expandPath(datadir) - } - } - - bzzport := ctx.GlobalString(SwarmPortFlag.Name) - if len(bzzport) > 0 { - currentConfig.Port = bzzport - } - - if bzzaddr := ctx.GlobalString(SwarmListenAddrFlag.Name); bzzaddr != "" { - currentConfig.ListenAddr = bzzaddr - } - - if ctx.GlobalIsSet(SwarmSwapEnabledFlag.Name) { - currentConfig.SwapEnabled = true - } - - if ctx.GlobalIsSet(SwarmSyncDisabledFlag.Name) { - currentConfig.SyncEnabled = false - } - - if d := ctx.GlobalDuration(SwarmSyncUpdateDelay.Name); d > 0 { - currentConfig.SyncUpdateDelay = d - } - - // any value including 0 is acceptable - currentConfig.MaxStreamPeerServers = ctx.GlobalInt(SwarmMaxStreamPeerServersFlag.Name) - - if ctx.GlobalIsSet(SwarmLightNodeEnabled.Name) { - currentConfig.LightNodeEnabled = true - } - - if ctx.GlobalIsSet(SwarmDeliverySkipCheckFlag.Name) { - currentConfig.DeliverySkipCheck = true - } - - currentConfig.SwapAPI = ctx.GlobalString(SwarmSwapAPIFlag.Name) - if currentConfig.SwapEnabled && currentConfig.SwapAPI == "" { - utils.Fatalf(SWARM_ERR_SWAP_SET_NO_API) - } - - if ctx.GlobalIsSet(EnsAPIFlag.Name) { - ensAPIs := ctx.GlobalStringSlice(EnsAPIFlag.Name) - // preserve backward compatibility to disable ENS with --ens-api="" - if len(ensAPIs) == 1 && ensAPIs[0] == "" { - ensAPIs = nil - } - for i := range ensAPIs { - ensAPIs[i] = expandPath(ensAPIs[i]) - } - - currentConfig.EnsAPIs = ensAPIs - } - - if cors := ctx.GlobalString(CorsStringFlag.Name); cors != "" { - currentConfig.Cors = cors - } - - if storePath := ctx.GlobalString(SwarmStorePath.Name); storePath != "" { - currentConfig.LocalStoreParams.ChunkDbPath = storePath - } - - if storeCapacity := ctx.GlobalUint64(SwarmStoreCapacity.Name); storeCapacity != 0 { - currentConfig.LocalStoreParams.DbCapacity = storeCapacity - } - - if storeCacheCapacity := ctx.GlobalUint(SwarmStoreCacheCapacity.Name); storeCacheCapacity != 0 { - currentConfig.LocalStoreParams.CacheCapacity = storeCacheCapacity - } - - return currentConfig - -} - -//override the current config with whatver is provided in environment variables -//most values are not allowed a zero value (empty string), if not otherwise noted -func envVarsOverride(currentConfig *bzzapi.Config) (config *bzzapi.Config) { - - if keyid := os.Getenv(SWARM_ENV_ACCOUNT); keyid != "" { - currentConfig.BzzAccount = keyid - } - - if chbookaddr := os.Getenv(SWARM_ENV_CHEQUEBOOK_ADDR); chbookaddr != "" { - currentConfig.Contract = common.HexToAddress(chbookaddr) - } - - if networkid := os.Getenv(SWARM_ENV_NETWORK_ID); networkid != "" { - id, err := strconv.ParseUint(networkid, 10, 64) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SWARM_ENV_NETWORK_ID, err) - } - if id != 0 { - currentConfig.NetworkID = id - } - } - - if datadir := os.Getenv(GETH_ENV_DATADIR); datadir != "" { - currentConfig.Path = expandPath(datadir) - } - - bzzport := os.Getenv(SWARM_ENV_PORT) - if len(bzzport) > 0 { - currentConfig.Port = bzzport - } - - if bzzaddr := os.Getenv(SWARM_ENV_LISTEN_ADDR); bzzaddr != "" { - currentConfig.ListenAddr = bzzaddr - } - - if swapenable := os.Getenv(SWARM_ENV_SWAP_ENABLE); swapenable != "" { - swap, err := strconv.ParseBool(swapenable) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SWARM_ENV_SWAP_ENABLE, err) - } - currentConfig.SwapEnabled = swap - } - - if syncdisable := os.Getenv(SWARM_ENV_SYNC_DISABLE); syncdisable != "" { - sync, err := strconv.ParseBool(syncdisable) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SWARM_ENV_SYNC_DISABLE, err) - } - currentConfig.SyncEnabled = !sync - } - - if v := os.Getenv(SWARM_ENV_DELIVERY_SKIP_CHECK); v != "" { - skipCheck, err := strconv.ParseBool(v) - if err != nil { - currentConfig.DeliverySkipCheck = skipCheck - } - } - - if v := os.Getenv(SWARM_ENV_SYNC_UPDATE_DELAY); v != "" { - d, err := time.ParseDuration(v) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SWARM_ENV_SYNC_UPDATE_DELAY, err) - } - currentConfig.SyncUpdateDelay = d - } - - if max := os.Getenv(SWARM_ENV_MAX_STREAM_PEER_SERVERS); max != "" { - m, err := strconv.Atoi(max) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SWARM_ENV_MAX_STREAM_PEER_SERVERS, err) - } - currentConfig.MaxStreamPeerServers = m - } - - if lne := os.Getenv(SWARM_ENV_LIGHT_NODE_ENABLE); lne != "" { - lightnode, err := strconv.ParseBool(lne) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SWARM_ENV_LIGHT_NODE_ENABLE, err) - } - currentConfig.LightNodeEnabled = lightnode - } - - if swapapi := os.Getenv(SWARM_ENV_SWAP_API); swapapi != "" { - currentConfig.SwapAPI = swapapi - } - - if currentConfig.SwapEnabled && currentConfig.SwapAPI == "" { - utils.Fatalf(SWARM_ERR_SWAP_SET_NO_API) - } - - if ensapi := os.Getenv(SWARM_ENV_ENS_API); ensapi != "" { - currentConfig.EnsAPIs = strings.Split(ensapi, ",") - } - - if ensaddr := os.Getenv(SWARM_ENV_ENS_ADDR); ensaddr != "" { - currentConfig.EnsRoot = common.HexToAddress(ensaddr) - } - - if cors := os.Getenv(SWARM_ENV_CORS); cors != "" { - currentConfig.Cors = cors - } - - return currentConfig -} - -// dumpConfig is the dumpconfig command. -// writes a default config to STDOUT -func dumpConfig(ctx *cli.Context) error { - cfg, err := buildConfig(ctx) - if err != nil { - utils.Fatalf(fmt.Sprintf("Uh oh - dumpconfig triggered an error %v", err)) - } - comment := "" - out, err := tomlSettings.Marshal(&cfg) - if err != nil { - return err - } - io.WriteString(os.Stdout, comment) - os.Stdout.Write(out) - return nil -} - -//validate configuration parameters -func validateConfig(cfg *bzzapi.Config) (err error) { - for _, ensAPI := range cfg.EnsAPIs { - if ensAPI != "" { - if err := validateEnsAPIs(ensAPI); err != nil { - return fmt.Errorf("invalid format [tld:][contract-addr@]url for ENS API endpoint configuration %q: %v", ensAPI, err) - } - } - } - return nil -} - -//validate EnsAPIs configuration parameter -func validateEnsAPIs(s string) (err error) { - // missing contract address - if strings.HasPrefix(s, "@") { - return errors.New("missing contract address") - } - // missing url - if strings.HasSuffix(s, "@") { - return errors.New("missing url") - } - // missing tld - if strings.HasPrefix(s, ":") { - return errors.New("missing tld") - } - // missing url - if strings.HasSuffix(s, ":") { - return errors.New("missing url") - } - return nil -} - -//print a Config as string -func printConfig(config *bzzapi.Config) string { - out, err := tomlSettings.Marshal(&config) - if err != nil { - return fmt.Sprintf("Something is not right with the configuration: %v", err) - } - return string(out) -} diff --git a/cmd/swarm/config_test.go b/cmd/swarm/config_test.go deleted file mode 100644 index 87c48e8344fa..000000000000 --- a/cmd/swarm/config_test.go +++ /dev/null @@ -1,575 +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 ( - "fmt" - "io" - "io/ioutil" - "net" - "os" - "os/exec" - "testing" - "time" - - "github.com/docker/docker/pkg/reexec" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/swarm" - "github.com/nebulaai/nbai-node/swarm/api" -) - -func TestConfigDump(t *testing.T) { - swarm := runSwarm(t, "dumpconfig") - defaultConf := api.NewConfig() - out, err := tomlSettings.Marshal(&defaultConf) - if err != nil { - t.Fatal(err) - } - swarm.Expect(string(out)) - swarm.ExpectExit() -} - -func TestConfigFailsSwapEnabledNoSwapApi(t *testing.T) { - flags := []string{ - fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "42", - fmt.Sprintf("--%s", SwarmPortFlag.Name), "54545", - fmt.Sprintf("--%s", SwarmSwapEnabledFlag.Name), - } - - swarm := runSwarm(t, flags...) - swarm.Expect("Fatal: " + SWARM_ERR_SWAP_SET_NO_API + "\n") - swarm.ExpectExit() -} - -func TestConfigFailsNoBzzAccount(t *testing.T) { - flags := []string{ - fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "42", - fmt.Sprintf("--%s", SwarmPortFlag.Name), "54545", - } - - swarm := runSwarm(t, flags...) - swarm.Expect("Fatal: " + SWARM_ERR_NO_BZZACCOUNT + "\n") - swarm.ExpectExit() -} - -func TestConfigCmdLineOverrides(t *testing.T) { - dir, err := ioutil.TempDir("", "bzztest") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - - conf, account := getTestAccount(t, dir) - node := &testNode{Dir: dir} - - // assign ports - httpPort, err := assignTCPPort() - if err != nil { - t.Fatal(err) - } - - flags := []string{ - fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "42", - fmt.Sprintf("--%s", SwarmPortFlag.Name), httpPort, - fmt.Sprintf("--%s", SwarmSyncDisabledFlag.Name), - fmt.Sprintf("--%s", CorsStringFlag.Name), "*", - fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), - fmt.Sprintf("--%s", SwarmDeliverySkipCheckFlag.Name), - fmt.Sprintf("--%s", EnsAPIFlag.Name), "", - fmt.Sprintf("--%s", utils.DataDirFlag.Name), dir, - fmt.Sprintf("--%s", utils.IPCPathFlag.Name), conf.IPCPath, - } - node.Cmd = runSwarm(t, flags...) - node.Cmd.InputLine(testPassphrase) - defer func() { - if t.Failed() { - node.Shutdown() - } - }() - // wait for the node to start - for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { - node.Client, err = rpc.Dial(conf.IPCEndpoint()) - if err == nil { - break - } - } - if node.Client == nil { - t.Fatal(err) - } - - // load info - var info swarm.Info - if err := node.Client.Call(&info, "bzz_info"); err != nil { - t.Fatal(err) - } - - if info.Port != httpPort { - t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) - } - - if info.NetworkID != 42 { - t.Fatalf("Expected network ID to be %d, got %d", 42, info.NetworkID) - } - - if info.SyncEnabled { - t.Fatal("Expected Sync to be disabled, but is true") - } - - if !info.DeliverySkipCheck { - t.Fatal("Expected DeliverySkipCheck to be enabled, but it is not") - } - - if info.Cors != "*" { - t.Fatalf("Expected Cors flag to be set to %s, got %s", "*", info.Cors) - } - - node.Shutdown() -} - -func TestConfigFileOverrides(t *testing.T) { - - // assign ports - httpPort, err := assignTCPPort() - if err != nil { - t.Fatal(err) - } - - //create a config file - //first, create a default conf - defaultConf := api.NewConfig() - //change some values in order to test if they have been loaded - defaultConf.SyncEnabled = false - defaultConf.DeliverySkipCheck = true - defaultConf.NetworkID = 54 - defaultConf.Port = httpPort - defaultConf.DbCapacity = 9000000 - defaultConf.HiveParams.KeepAliveInterval = 6000000000 - defaultConf.Swap.Params.Strategy.AutoCashInterval = 600 * time.Second - //defaultConf.SyncParams.KeyBufferSize = 512 - //create a TOML string - out, err := tomlSettings.Marshal(&defaultConf) - if err != nil { - t.Fatalf("Error creating TOML file in TestFileOverride: %v", err) - } - //create file - f, err := ioutil.TempFile("", "testconfig.toml") - if err != nil { - t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) - } - //write file - _, err = f.WriteString(string(out)) - if err != nil { - t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) - } - f.Sync() - - dir, err := ioutil.TempDir("", "bzztest") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - conf, account := getTestAccount(t, dir) - node := &testNode{Dir: dir} - - flags := []string{ - fmt.Sprintf("--%s", SwarmTomlConfigPathFlag.Name), f.Name(), - fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), - fmt.Sprintf("--%s", EnsAPIFlag.Name), "", - fmt.Sprintf("--%s", utils.DataDirFlag.Name), dir, - fmt.Sprintf("--%s", utils.IPCPathFlag.Name), conf.IPCPath, - } - node.Cmd = runSwarm(t, flags...) - node.Cmd.InputLine(testPassphrase) - defer func() { - if t.Failed() { - node.Shutdown() - } - }() - // wait for the node to start - for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { - node.Client, err = rpc.Dial(conf.IPCEndpoint()) - if err == nil { - break - } - } - if node.Client == nil { - t.Fatal(err) - } - - // load info - var info swarm.Info - if err := node.Client.Call(&info, "bzz_info"); err != nil { - t.Fatal(err) - } - - if info.Port != httpPort { - t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) - } - - if info.NetworkID != 54 { - t.Fatalf("Expected network ID to be %d, got %d", 54, info.NetworkID) - } - - if info.SyncEnabled { - t.Fatal("Expected Sync to be disabled, but is true") - } - - if !info.DeliverySkipCheck { - t.Fatal("Expected DeliverySkipCheck to be enabled, but it is not") - } - - if info.DbCapacity != 9000000 { - t.Fatalf("Expected network ID to be %d, got %d", 54, info.NetworkID) - } - - if info.HiveParams.KeepAliveInterval != 6000000000 { - t.Fatalf("Expected HiveParams KeepAliveInterval to be %d, got %d", uint64(6000000000), uint64(info.HiveParams.KeepAliveInterval)) - } - - if info.Swap.Params.Strategy.AutoCashInterval != 600*time.Second { - t.Fatalf("Expected SwapParams AutoCashInterval to be %ds, got %d", 600, info.Swap.Params.Strategy.AutoCashInterval) - } - - // if info.SyncParams.KeyBufferSize != 512 { - // t.Fatalf("Expected info.SyncParams.KeyBufferSize to be %d, got %d", 512, info.SyncParams.KeyBufferSize) - // } - - node.Shutdown() -} - -func TestConfigEnvVars(t *testing.T) { - // assign ports - httpPort, err := assignTCPPort() - if err != nil { - t.Fatal(err) - } - - envVars := os.Environ() - envVars = append(envVars, fmt.Sprintf("%s=%s", SwarmPortFlag.EnvVar, httpPort)) - envVars = append(envVars, fmt.Sprintf("%s=%s", SwarmNetworkIdFlag.EnvVar, "999")) - envVars = append(envVars, fmt.Sprintf("%s=%s", CorsStringFlag.EnvVar, "*")) - envVars = append(envVars, fmt.Sprintf("%s=%s", SwarmSyncDisabledFlag.EnvVar, "true")) - envVars = append(envVars, fmt.Sprintf("%s=%s", SwarmDeliverySkipCheckFlag.EnvVar, "true")) - - dir, err := ioutil.TempDir("", "bzztest") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - conf, account := getTestAccount(t, dir) - node := &testNode{Dir: dir} - flags := []string{ - fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), - "--ens-api", "", - "--datadir", dir, - "--ipcpath", conf.IPCPath, - } - - //node.Cmd = runSwarm(t,flags...) - //node.Cmd.cmd.Env = envVars - //the above assignment does not work, so we need a custom Cmd here in order to pass envVars: - cmd := &exec.Cmd{ - Path: reexec.Self(), - Args: append([]string{"swarm-test"}, flags...), - Stderr: os.Stderr, - Stdout: os.Stdout, - } - cmd.Env = envVars - //stdout, err := cmd.StdoutPipe() - //if err != nil { - // t.Fatal(err) - //} - //stdout = bufio.NewReader(stdout) - var stdin io.WriteCloser - if stdin, err = cmd.StdinPipe(); err != nil { - t.Fatal(err) - } - if err := cmd.Start(); err != nil { - t.Fatal(err) - } - - //cmd.InputLine(testPassphrase) - io.WriteString(stdin, testPassphrase+"\n") - defer func() { - if t.Failed() { - node.Shutdown() - cmd.Process.Kill() - } - }() - // wait for the node to start - for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { - node.Client, err = rpc.Dial(conf.IPCEndpoint()) - if err == nil { - break - } - } - - if node.Client == nil { - t.Fatal(err) - } - - // load info - var info swarm.Info - if err := node.Client.Call(&info, "bzz_info"); err != nil { - t.Fatal(err) - } - - if info.Port != httpPort { - t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) - } - - if info.NetworkID != 999 { - t.Fatalf("Expected network ID to be %d, got %d", 999, info.NetworkID) - } - - if info.Cors != "*" { - t.Fatalf("Expected Cors flag to be set to %s, got %s", "*", info.Cors) - } - - if info.SyncEnabled { - t.Fatal("Expected Sync to be disabled, but is true") - } - - if !info.DeliverySkipCheck { - t.Fatal("Expected DeliverySkipCheck to be enabled, but it is not") - } - - node.Shutdown() - cmd.Process.Kill() -} - -func TestConfigCmdLineOverridesFile(t *testing.T) { - - // assign ports - httpPort, err := assignTCPPort() - if err != nil { - t.Fatal(err) - } - - //create a config file - //first, create a default conf - defaultConf := api.NewConfig() - //change some values in order to test if they have been loaded - defaultConf.SyncEnabled = true - defaultConf.NetworkID = 54 - defaultConf.Port = "8588" - defaultConf.DbCapacity = 9000000 - defaultConf.HiveParams.KeepAliveInterval = 6000000000 - defaultConf.Swap.Params.Strategy.AutoCashInterval = 600 * time.Second - //defaultConf.SyncParams.KeyBufferSize = 512 - //create a TOML file - out, err := tomlSettings.Marshal(&defaultConf) - if err != nil { - t.Fatalf("Error creating TOML file in TestFileOverride: %v", err) - } - //write file - fname := "testconfig.toml" - f, err := ioutil.TempFile("", fname) - if err != nil { - t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) - } - defer os.Remove(fname) - //write file - _, err = f.WriteString(string(out)) - if err != nil { - t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) - } - f.Sync() - - dir, err := ioutil.TempDir("", "bzztest") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - conf, account := getTestAccount(t, dir) - node := &testNode{Dir: dir} - - expectNetworkId := uint64(77) - - flags := []string{ - fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "77", - fmt.Sprintf("--%s", SwarmPortFlag.Name), httpPort, - fmt.Sprintf("--%s", SwarmSyncDisabledFlag.Name), - fmt.Sprintf("--%s", SwarmTomlConfigPathFlag.Name), f.Name(), - fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), - fmt.Sprintf("--%s", EnsAPIFlag.Name), "", - fmt.Sprintf("--%s", utils.DataDirFlag.Name), dir, - fmt.Sprintf("--%s", utils.IPCPathFlag.Name), conf.IPCPath, - } - node.Cmd = runSwarm(t, flags...) - node.Cmd.InputLine(testPassphrase) - defer func() { - if t.Failed() { - node.Shutdown() - } - }() - // wait for the node to start - for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { - node.Client, err = rpc.Dial(conf.IPCEndpoint()) - if err == nil { - break - } - } - if node.Client == nil { - t.Fatal(err) - } - - // load info - var info swarm.Info - if err := node.Client.Call(&info, "bzz_info"); err != nil { - t.Fatal(err) - } - - if info.Port != httpPort { - t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) - } - - if info.NetworkID != expectNetworkId { - t.Fatalf("Expected network ID to be %d, got %d", expectNetworkId, info.NetworkID) - } - - if info.SyncEnabled { - t.Fatal("Expected Sync to be disabled, but is true") - } - - if info.LocalStoreParams.DbCapacity != 9000000 { - t.Fatalf("Expected Capacity to be %d, got %d", 9000000, info.LocalStoreParams.DbCapacity) - } - - if info.HiveParams.KeepAliveInterval != 6000000000 { - t.Fatalf("Expected HiveParams KeepAliveInterval to be %d, got %d", uint64(6000000000), uint64(info.HiveParams.KeepAliveInterval)) - } - - if info.Swap.Params.Strategy.AutoCashInterval != 600*time.Second { - t.Fatalf("Expected SwapParams AutoCashInterval to be %ds, got %d", 600, info.Swap.Params.Strategy.AutoCashInterval) - } - - // if info.SyncParams.KeyBufferSize != 512 { - // t.Fatalf("Expected info.SyncParams.KeyBufferSize to be %d, got %d", 512, info.SyncParams.KeyBufferSize) - // } - - node.Shutdown() -} - -func TestConfigValidate(t *testing.T) { - for _, c := range []struct { - cfg *api.Config - err string - }{ - { - cfg: &api.Config{EnsAPIs: []string{ - "/data/testnet/geth.ipc", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "http://127.0.0.1:1234", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "ws://127.0.0.1:1234", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "test:/data/testnet/geth.ipc", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "test:ws://127.0.0.1:1234", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "314159265dD8dbb310642f98f50C066173C1259b@/data/testnet/geth.ipc", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "314159265dD8dbb310642f98f50C066173C1259b@http://127.0.0.1:1234", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "314159265dD8dbb310642f98f50C066173C1259b@ws://127.0.0.1:1234", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "test:314159265dD8dbb310642f98f50C066173C1259b@/data/testnet/geth.ipc", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "eth:314159265dD8dbb310642f98f50C066173C1259b@http://127.0.0.1:1234", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "eth:314159265dD8dbb310642f98f50C066173C1259b@ws://127.0.0.1:12344", - }}, - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "eth:", - }}, - err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \"eth:\": missing url", - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "314159265dD8dbb310642f98f50C066173C1259b@", - }}, - err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \"314159265dD8dbb310642f98f50C066173C1259b@\": missing url", - }, - { - cfg: &api.Config{EnsAPIs: []string{ - ":314159265dD8dbb310642f98f50C066173C1259", - }}, - err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \":314159265dD8dbb310642f98f50C066173C1259\": missing tld", - }, - { - cfg: &api.Config{EnsAPIs: []string{ - "@/data/testnet/geth.ipc", - }}, - err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \"@/data/testnet/geth.ipc\": missing contract address", - }, - } { - err := validateConfig(c.cfg) - if c.err != "" && err.Error() != c.err { - t.Errorf("expected error %q, got %q", c.err, err) - } - if c.err == "" && err != nil { - t.Errorf("unexpected error %q", err) - } - } -} - -func assignTCPPort() (string, error) { - l, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - return "", err - } - l.Close() - _, port, err := net.SplitHostPort(l.Addr().String()) - if err != nil { - return "", err - } - return port, nil -} diff --git a/cmd/swarm/db.go b/cmd/swarm/db.go deleted file mode 100644 index 24431237356c..000000000000 --- a/cmd/swarm/db.go +++ /dev/null @@ -1,147 +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 ( - "fmt" - "io" - "os" - "path/filepath" - - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/swarm/storage" - "gopkg.in/urfave/cli.v1" -) - -var dbCommand = cli.Command{ - Name: "db", - CustomHelpTemplate: helpTemplate, - Usage: "manage the local chunk database", - ArgsUsage: "db COMMAND", - Description: "Manage the local chunk database", - Subcommands: []cli.Command{ - { - Action: dbExport, - CustomHelpTemplate: helpTemplate, - Name: "export", - Usage: "export a local chunk database as a tar archive (use - to send to stdout)", - ArgsUsage: " ", - Description: ` -Export a local chunk database as a tar archive (use - to send to stdout). - - swarm db export ~/.ethereum/swarm/bzz-KEY/chunks chunks.tar - -The export may be quite large, consider piping the output through the Unix -pv(1) tool to get a progress bar: - - swarm db export ~/.ethereum/swarm/bzz-KEY/chunks - | pv > chunks.tar -`, - }, - { - Action: dbImport, - CustomHelpTemplate: helpTemplate, - Name: "import", - Usage: "import chunks from a tar archive into a local chunk database (use - to read from stdin)", - ArgsUsage: " ", - Description: `Import chunks from a tar archive into a local chunk database (use - to read from stdin). - - swarm db import ~/.ethereum/swarm/bzz-KEY/chunks chunks.tar - -The import may be quite large, consider piping the input through the Unix -pv(1) tool to get a progress bar: - - pv chunks.tar | swarm db import ~/.ethereum/swarm/bzz-KEY/chunks -`, - }, - }, -} - -func dbExport(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 3 { - utils.Fatalf("invalid arguments, please specify both (path to a local chunk database), (path to write the tar archive to, - for stdout) and the base key") - } - - store, err := openLDBStore(args[0], common.Hex2Bytes(args[2])) - 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) != 3 { - utils.Fatalf("invalid arguments, please specify both (path to a local chunk database), (path to read the tar archive from, - for stdin) and the base key") - } - - store, err := openLDBStore(args[0], common.Hex2Bytes(args[2])) - 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 openLDBStore(path string, basekey []byte) (*storage.LDBStore, error) { - if _, err := os.Stat(filepath.Join(path, "CURRENT")); err != nil { - return nil, fmt.Errorf("invalid chunkdb path: %s", err) - } - - storeparams := storage.NewDefaultStoreParams() - ldbparams := storage.NewLDBStoreParams(storeparams, path) - ldbparams.BaseKey = basekey - return storage.NewLDBStore(ldbparams) -} diff --git a/cmd/swarm/download.go b/cmd/swarm/download.go deleted file mode 100644 index 7708947a02fc..000000000000 --- a/cmd/swarm/download.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2018 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" - "os" - "path/filepath" - "strings" - - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/swarm/api" - swarm "github.com/nebulaai/nbai-node/swarm/api/client" - "gopkg.in/urfave/cli.v1" -) - -var downloadCommand = cli.Command{ - Action: download, - Name: "down", - Flags: []cli.Flag{SwarmRecursiveFlag, SwarmAccessPasswordFlag}, - Usage: "downloads a swarm manifest or a file inside a manifest", - ArgsUsage: " []", - Description: `Downloads a swarm bzz uri to the given dir. When no dir is provided, working directory is assumed. --recursive flag is expected when downloading a manifest with multiple entries.`, -} - -func download(ctx *cli.Context) { - log.Debug("downloading content using swarm down") - args := ctx.Args() - dest := "." - - switch len(args) { - case 0: - utils.Fatalf("Usage: swarm down [options] []") - case 1: - log.Trace(fmt.Sprintf("swarm down: no destination path - assuming working dir")) - default: - log.Trace(fmt.Sprintf("destination path arg: %s", args[1])) - if absDest, err := filepath.Abs(args[1]); err == nil { - dest = absDest - } else { - utils.Fatalf("could not get download path: %v", err) - } - } - - var ( - bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - isRecursive = ctx.Bool(SwarmRecursiveFlag.Name) - client = swarm.NewClient(bzzapi) - ) - - if fi, err := os.Stat(dest); err == nil { - if isRecursive && !fi.Mode().IsDir() { - utils.Fatalf("destination path is not a directory!") - } - } else { - if !os.IsNotExist(err) { - utils.Fatalf("could not stat path: %v", err) - } - } - - uri, err := api.Parse(args[0]) - if err != nil { - utils.Fatalf("could not parse uri argument: %v", err) - } - - dl := func(credentials string) error { - // assume behaviour according to --recursive switch - if isRecursive { - if err := client.DownloadDirectory(uri.Addr, uri.Path, dest, credentials); err != nil { - if err == swarm.ErrUnauthorized { - return err - } - return fmt.Errorf("directory %s: %v", uri.Path, err) - } - } else { - // we are downloading a file - log.Debug("downloading file/path from a manifest", "uri.Addr", uri.Addr, "uri.Path", uri.Path) - - err := client.DownloadFile(uri.Addr, uri.Path, dest, credentials) - if err != nil { - if err == swarm.ErrUnauthorized { - return err - } - return fmt.Errorf("file %s from address: %s: %v", uri.Path, uri.Addr, err) - } - } - return nil - } - if passwords := makePasswordList(ctx); passwords != nil { - password := getPassPhrase(fmt.Sprintf("Downloading %s is restricted", uri), 0, passwords) - err = dl(password) - } else { - err = dl("") - } - if err != nil { - utils.Fatalf("download: %v", err) - } -} diff --git a/cmd/swarm/export_test.go b/cmd/swarm/export_test.go deleted file mode 100644 index 3ccd01ad6b0b..000000000000 --- a/cmd/swarm/export_test.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2018 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 ( - "bytes" - "crypto/md5" - "io" - "net/http" - "os" - "runtime" - "strings" - "testing" - - "github.com/nebulaai/nbai-node/swarm" - "github.com/nebulaai/nbai-node/swarm/testutil" -) - -// TestCLISwarmExportImport perform the following test: -// 1. runs swarm node -// 2. uploads a random file -// 3. runs an export of the local datastore -// 4. runs a second swarm node -// 5. imports the exported datastore -// 6. fetches the uploaded random file from the second node -func TestCLISwarmExportImport(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip() - } - cluster := newTestCluster(t, 1) - - // generate random 1mb file - content := testutil.RandomBytes(1, 1000000) - fileName := testutil.TempFileWithContent(t, string(content)) - defer os.Remove(fileName) - - // upload the file with 'swarm up' and expect a hash - up := runSwarm(t, "--bzzapi", cluster.Nodes[0].URL, "up", fileName) - _, matches := up.ExpectRegexp(`[a-f\d]{64}`) - up.ExpectExit() - hash := matches[0] - - var info swarm.Info - if err := cluster.Nodes[0].Client.Call(&info, "bzz_info"); err != nil { - t.Fatal(err) - } - - cluster.Stop() - defer cluster.Cleanup() - - // generate an export.tar - exportCmd := runSwarm(t, "db", "export", info.Path+"/chunks", info.Path+"/export.tar", strings.TrimPrefix(info.BzzKey, "0x")) - exportCmd.ExpectExit() - - // start second cluster - cluster2 := newTestCluster(t, 1) - - var info2 swarm.Info - if err := cluster2.Nodes[0].Client.Call(&info2, "bzz_info"); err != nil { - t.Fatal(err) - } - - // stop second cluster, so that we close LevelDB - cluster2.Stop() - defer cluster2.Cleanup() - - // import the export.tar - importCmd := runSwarm(t, "db", "import", info2.Path+"/chunks", info.Path+"/export.tar", strings.TrimPrefix(info2.BzzKey, "0x")) - importCmd.ExpectExit() - - // spin second cluster back up - cluster2.StartExistingNodes(t, 1, strings.TrimPrefix(info2.BzzAccount, "0x")) - - // try to fetch imported file - res, err := http.Get(cluster2.Nodes[0].URL + "/bzz:/" + hash) - if err != nil { - t.Fatal(err) - } - - if res.StatusCode != 200 { - t.Fatalf("expected HTTP status %d, got %s", 200, res.Status) - } - - // compare downloaded file with the generated random file - mustEqualFiles(t, bytes.NewReader(content), res.Body) -} - -func mustEqualFiles(t *testing.T, up io.Reader, down io.Reader) { - h := md5.New() - upLen, err := io.Copy(h, up) - if err != nil { - t.Fatal(err) - } - upHash := h.Sum(nil) - h.Reset() - downLen, err := io.Copy(h, down) - if err != nil { - t.Fatal(err) - } - downHash := h.Sum(nil) - - if !bytes.Equal(upHash, downHash) || upLen != downLen { - t.Fatalf("downloaded imported file md5=%x (length %v) is not the same as the generated one mp5=%x (length %v)", downHash, downLen, upHash, upLen) - } -} diff --git a/cmd/swarm/feeds.go b/cmd/swarm/feeds.go deleted file mode 100644 index a57222bc860d..000000000000 --- a/cmd/swarm/feeds.go +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright 2016 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 . - -// Command feed allows the user to create and update signed Swarm feeds -package main - -import ( - "fmt" - "strings" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/crypto" - - "github.com/nebulaai/nbai-node/cmd/utils" - swarm "github.com/nebulaai/nbai-node/swarm/api/client" - "github.com/nebulaai/nbai-node/swarm/storage/feed" - "gopkg.in/urfave/cli.v1" -) - -var feedCommand = cli.Command{ - CustomHelpTemplate: helpTemplate, - Name: "feed", - Usage: "(Advanced) Create and update Swarm Feeds", - ArgsUsage: "", - Description: "Works with Swarm Feeds", - Subcommands: []cli.Command{ - { - Action: feedCreateManifest, - CustomHelpTemplate: helpTemplate, - Name: "create", - Usage: "creates and publishes a new feed manifest", - Description: `creates and publishes a new feed manifest pointing to a specified user's updates about a particular topic. - The feed topic can be built in the following ways: - * use --topic to set the topic to an arbitrary binary hex string. - * use --name to set the topic to a human-readable name. - For example --name could be set to "profile-picture", meaning this feed allows to get this user's current profile picture. - * use both --topic and --name to create named subtopics. - For example, --topic could be set to an Ethereum contract address and --name could be set to "comments", meaning - this feed tracks a discussion about that contract. - The --user flag allows to have this manifest refer to a user other than yourself. If not specified, - it will then default to your local account (--bzzaccount)`, - Flags: []cli.Flag{SwarmFeedNameFlag, SwarmFeedTopicFlag, SwarmFeedUserFlag}, - }, - { - Action: feedUpdate, - CustomHelpTemplate: helpTemplate, - Name: "update", - Usage: "updates the content of an existing Swarm Feed", - ArgsUsage: "<0x Hex data>", - Description: `publishes a new update on the specified topic - The feed topic can be built in the following ways: - * use --topic to set the topic to an arbitrary binary hex string. - * use --name to set the topic to a human-readable name. - For example --name could be set to "profile-picture", meaning this feed allows to get this user's current profile picture. - * use both --topic and --name to create named subtopics. - For example, --topic could be set to an Ethereum contract address and --name could be set to "comments", meaning - this feed tracks a discussion about that contract. - - If you have a manifest, you can specify it with --manifest to refer to the feed, - instead of using --topic / --name - `, - Flags: []cli.Flag{SwarmFeedManifestFlag, SwarmFeedNameFlag, SwarmFeedTopicFlag}, - }, - { - Action: feedInfo, - CustomHelpTemplate: helpTemplate, - Name: "info", - Usage: "obtains information about an existing Swarm feed", - Description: `obtains information about an existing Swarm feed - The topic can be specified directly with the --topic flag as an hex string - If no topic is specified, the default topic (zero) will be used - The --name flag can be used to specify subtopics with a specific name. - The --user flag allows to refer to a user other than yourself. If not specified, - it will then default to your local account (--bzzaccount) - If you have a manifest, you can specify it with --manifest instead of --topic / --name / ---user - to refer to the feed`, - Flags: []cli.Flag{SwarmFeedManifestFlag, SwarmFeedNameFlag, SwarmFeedTopicFlag, SwarmFeedUserFlag}, - }, - }, -} - -func NewGenericSigner(ctx *cli.Context) feed.Signer { - return feed.NewGenericSigner(getPrivKey(ctx)) -} - -func getTopic(ctx *cli.Context) (topic feed.Topic) { - var name = ctx.String(SwarmFeedNameFlag.Name) - var relatedTopic = ctx.String(SwarmFeedTopicFlag.Name) - var relatedTopicBytes []byte - var err error - - if relatedTopic != "" { - relatedTopicBytes, err = hexutil.Decode(relatedTopic) - if err != nil { - utils.Fatalf("Error parsing topic: %s", err) - } - } - - topic, err = feed.NewTopic(name, relatedTopicBytes) - if err != nil { - utils.Fatalf("Error parsing topic: %s", err) - } - return topic -} - -// swarm feed create [--name ] [--data <0x Hexdata> [--multihash=false]] -// swarm feed update <0x Hexdata> [--multihash=false] -// swarm feed info - -func feedCreateManifest(ctx *cli.Context) { - var ( - bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client = swarm.NewClient(bzzapi) - ) - - newFeedUpdateRequest := feed.NewFirstRequest(getTopic(ctx)) - newFeedUpdateRequest.Feed.User = feedGetUser(ctx) - - manifestAddress, err := client.CreateFeedWithManifest(newFeedUpdateRequest) - if err != nil { - utils.Fatalf("Error creating feed manifest: %s", err.Error()) - return - } - fmt.Println(manifestAddress) // output manifest address to the user in a single line (useful for other commands to pick up) - -} - -func feedUpdate(ctx *cli.Context) { - args := ctx.Args() - - var ( - bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client = swarm.NewClient(bzzapi) - manifestAddressOrDomain = ctx.String(SwarmFeedManifestFlag.Name) - ) - - if len(args) < 1 { - fmt.Println("Incorrect number of arguments") - cli.ShowCommandHelpAndExit(ctx, "update", 1) - return - } - - signer := NewGenericSigner(ctx) - - data, err := hexutil.Decode(args[0]) - if err != nil { - utils.Fatalf("Error parsing data: %s", err.Error()) - return - } - - var updateRequest *feed.Request - var query *feed.Query - - if manifestAddressOrDomain == "" { - query = new(feed.Query) - query.User = signer.Address() - query.Topic = getTopic(ctx) - } - - // Retrieve a feed update request - updateRequest, err = client.GetFeedRequest(query, manifestAddressOrDomain) - if err != nil { - utils.Fatalf("Error retrieving feed status: %s", err.Error()) - } - - // Check that the provided signer matches the request to sign - if updateRequest.User != signer.Address() { - utils.Fatalf("Signer address does not match the update request") - } - - // set the new data - updateRequest.SetData(data) - - // sign update - if err = updateRequest.Sign(signer); err != nil { - utils.Fatalf("Error signing feed update: %s", err.Error()) - } - - // post update - err = client.UpdateFeed(updateRequest) - if err != nil { - utils.Fatalf("Error updating feed: %s", err.Error()) - return - } -} - -func feedInfo(ctx *cli.Context) { - var ( - bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client = swarm.NewClient(bzzapi) - manifestAddressOrDomain = ctx.String(SwarmFeedManifestFlag.Name) - ) - - var query *feed.Query - if manifestAddressOrDomain == "" { - query = new(feed.Query) - query.Topic = getTopic(ctx) - query.User = feedGetUser(ctx) - } - - metadata, err := client.GetFeedRequest(query, manifestAddressOrDomain) - if err != nil { - utils.Fatalf("Error retrieving feed metadata: %s", err.Error()) - return - } - encodedMetadata, err := metadata.MarshalJSON() - if err != nil { - utils.Fatalf("Error encoding metadata to JSON for display:%s", err) - } - fmt.Println(string(encodedMetadata)) -} - -func feedGetUser(ctx *cli.Context) common.Address { - var user = ctx.String(SwarmFeedUserFlag.Name) - if user != "" { - return common.HexToAddress(user) - } - pk := getPrivKey(ctx) - if pk == nil { - utils.Fatalf("Cannot read private key. Must specify --user or --bzzaccount") - } - return crypto.PubkeyToAddress(pk.PublicKey) - -} diff --git a/cmd/swarm/feeds_test.go b/cmd/swarm/feeds_test.go deleted file mode 100644 index d48877543eff..000000000000 --- a/cmd/swarm/feeds_test.go +++ /dev/null @@ -1,196 +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 ( - "bytes" - "encoding/json" - "io/ioutil" - "os" - "testing" - - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/swarm/api" - swarm "github.com/nebulaai/nbai-node/swarm/api/client" - swarmhttp "github.com/nebulaai/nbai-node/swarm/api/http" - "github.com/nebulaai/nbai-node/swarm/storage/feed" - "github.com/nebulaai/nbai-node/swarm/storage/feed/lookup" - "github.com/nebulaai/nbai-node/swarm/testutil" -) - -func TestCLIFeedUpdate(t *testing.T) { - srv := swarmhttp.NewTestSwarmServer(t, func(api *api.API) swarmhttp.TestServer { - return swarmhttp.NewServer(api, "") - }, nil) - log.Info("starting a test swarm server") - defer srv.Close() - - // create a private key file for signing - privkeyHex := "0000000000000000000000000000000000000000000000000000000000001979" - privKey, _ := crypto.HexToECDSA(privkeyHex) - address := crypto.PubkeyToAddress(privKey.PublicKey) - - pkFileName := testutil.TempFileWithContent(t, privkeyHex) - defer os.Remove(pkFileName) - - // compose a topic. We'll be doing quotes about Miguel de Cervantes - var topic feed.Topic - subject := []byte("Miguel de Cervantes") - copy(topic[:], subject[:]) - name := "quotes" - - // prepare some data for the update - data := []byte("En boca cerrada no entran moscas") - hexData := hexutil.Encode(data) - - flags := []string{ - "--bzzapi", srv.URL, - "--bzzaccount", pkFileName, - "feed", "update", - "--topic", topic.Hex(), - "--name", name, - hexData} - - // create an update and expect an exit without errors - log.Info("updating a feed with 'swarm feed update'") - cmd := runSwarm(t, flags...) - cmd.ExpectExit() - - // now try to get the update using the client - client := swarm.NewClient(srv.URL) - - // build the same topic as before, this time - // we use NewTopic to create a topic automatically. - topic, err := feed.NewTopic(name, subject) - if err != nil { - t.Fatal(err) - } - - // Feed configures whose updates we will be looking up. - fd := feed.Feed{ - Topic: topic, - User: address, - } - - // Build a query to get the latest update - query := feed.NewQueryLatest(&fd, lookup.NoClue) - - // retrieve content! - reader, err := client.QueryFeed(query, "") - if err != nil { - t.Fatal(err) - } - - retrieved, err := ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err) - } - - // check we retrieved the sent information - if !bytes.Equal(data, retrieved) { - t.Fatalf("Received %s, expected %s", retrieved, data) - } - - // Now retrieve info for the next update - flags = []string{ - "--bzzapi", srv.URL, - "feed", "info", - "--topic", topic.Hex(), - "--user", address.Hex(), - } - - log.Info("getting feed info with 'swarm feed info'") - cmd = runSwarm(t, flags...) - _, matches := cmd.ExpectRegexp(`.*`) // regex hack to extract stdout - cmd.ExpectExit() - - // verify we can deserialize the result as a valid JSON - var request feed.Request - err = json.Unmarshal([]byte(matches[0]), &request) - if err != nil { - t.Fatal(err) - } - - // make sure the retrieved feed is the same - if request.Feed != fd { - t.Fatalf("Expected feed to be: %s, got %s", fd, request.Feed) - } - - // test publishing a manifest - flags = []string{ - "--bzzapi", srv.URL, - "--bzzaccount", pkFileName, - "feed", "create", - "--topic", topic.Hex(), - } - - log.Info("Publishing manifest with 'swarm feed create'") - cmd = runSwarm(t, flags...) - _, matches = cmd.ExpectRegexp(`[a-f\d]{64}`) - cmd.ExpectExit() - - manifestAddress := matches[0] // read the received feed manifest - - // now attempt to lookup the latest update using a manifest instead - reader, err = client.QueryFeed(nil, manifestAddress) - if err != nil { - t.Fatal(err) - } - - retrieved, err = ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(data, retrieved) { - t.Fatalf("Received %s, expected %s", retrieved, data) - } - - // test publishing a manifest for a different user - flags = []string{ - "--bzzapi", srv.URL, - "feed", "create", - "--topic", topic.Hex(), - "--user", "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", // different user - } - - log.Info("Publishing manifest with 'swarm feed create' for a different user") - cmd = runSwarm(t, flags...) - _, matches = cmd.ExpectRegexp(`[a-f\d]{64}`) - cmd.ExpectExit() - - manifestAddress = matches[0] // read the received feed manifest - - // now let's try to update that user's manifest which we don't have the private key for - flags = []string{ - "--bzzapi", srv.URL, - "--bzzaccount", pkFileName, - "feed", "update", - "--manifest", manifestAddress, - hexData} - - // create an update and expect an error given there is a user mismatch - log.Info("updating a feed with 'swarm feed update'") - cmd = runSwarm(t, flags...) - cmd.ExpectRegexp("Fatal:.*") // best way so far to detect a failure. - cmd.ExpectExit() - if cmd.ExitStatus() == 0 { - t.Fatal("Expected nonzero exit code when updating a manifest with the wrong user. Got 0.") - } -} diff --git a/cmd/swarm/flags.go b/cmd/swarm/flags.go deleted file mode 100644 index 12edc8cc9800..000000000000 --- a/cmd/swarm/flags.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2018 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 . - -// Command feed allows the user to create and update signed Swarm feeds -package main - -import cli "gopkg.in/urfave/cli.v1" - -var ( - ChequebookAddrFlag = cli.StringFlag{ - Name: "chequebook", - Usage: "chequebook contract address", - EnvVar: SWARM_ENV_CHEQUEBOOK_ADDR, - } - SwarmAccountFlag = cli.StringFlag{ - Name: "bzzaccount", - Usage: "Swarm account key file", - EnvVar: SWARM_ENV_ACCOUNT, - } - SwarmListenAddrFlag = cli.StringFlag{ - Name: "httpaddr", - Usage: "Swarm HTTP API listening interface", - EnvVar: SWARM_ENV_LISTEN_ADDR, - } - SwarmPortFlag = cli.StringFlag{ - Name: "bzzport", - Usage: "Swarm local http api port", - EnvVar: SWARM_ENV_PORT, - } - SwarmNetworkIdFlag = cli.IntFlag{ - Name: "bzznetworkid", - Usage: "Network identifier (integer, default 3=swarm testnet)", - EnvVar: SWARM_ENV_NETWORK_ID, - } - SwarmSwapEnabledFlag = cli.BoolFlag{ - Name: "swap", - Usage: "Swarm SWAP enabled (default false)", - EnvVar: SWARM_ENV_SWAP_ENABLE, - } - SwarmSwapAPIFlag = cli.StringFlag{ - Name: "swap-api", - Usage: "URL of the Ethereum API provider to use to settle SWAP payments", - EnvVar: SWARM_ENV_SWAP_API, - } - SwarmSyncDisabledFlag = cli.BoolTFlag{ - Name: "nosync", - Usage: "Disable swarm syncing", - EnvVar: SWARM_ENV_SYNC_DISABLE, - } - SwarmSyncUpdateDelay = cli.DurationFlag{ - Name: "sync-update-delay", - Usage: "Duration for sync subscriptions update after no new peers are added (default 15s)", - EnvVar: SWARM_ENV_SYNC_UPDATE_DELAY, - } - SwarmMaxStreamPeerServersFlag = cli.IntFlag{ - Name: "max-stream-peer-servers", - Usage: "Limit of Stream peer servers, 0 denotes unlimited", - EnvVar: SWARM_ENV_MAX_STREAM_PEER_SERVERS, - Value: 10000, // A very large default value is possible as stream servers have very small memory footprint - } - SwarmLightNodeEnabled = cli.BoolFlag{ - Name: "lightnode", - Usage: "Enable Swarm LightNode (default false)", - EnvVar: SWARM_ENV_LIGHT_NODE_ENABLE, - } - SwarmDeliverySkipCheckFlag = cli.BoolFlag{ - Name: "delivery-skip-check", - Usage: "Skip chunk delivery check (default false)", - EnvVar: SWARM_ENV_DELIVERY_SKIP_CHECK, - } - EnsAPIFlag = cli.StringSliceFlag{ - Name: "ens-api", - Usage: "ENS API endpoint for a TLD and with contract address, can be repeated, format [tld:][contract-addr@]url", - EnvVar: SWARM_ENV_ENS_API, - } - SwarmApiFlag = cli.StringFlag{ - Name: "bzzapi", - Usage: "Specifies the Swarm HTTP endpoint to connect to", - Value: "http://127.0.0.1:8500", - } - SwarmRecursiveFlag = cli.BoolFlag{ - Name: "recursive", - Usage: "Upload directories recursively", - } - SwarmWantManifestFlag = cli.BoolTFlag{ - Name: "manifest", - Usage: "Automatic manifest upload (default true)", - } - SwarmUploadDefaultPath = cli.StringFlag{ - Name: "defaultpath", - Usage: "path to file served for empty url path (none)", - } - SwarmAccessGrantKeyFlag = cli.StringFlag{ - Name: "grant-key", - Usage: "grants a given public key access to an ACT", - } - SwarmAccessGrantKeysFlag = cli.StringFlag{ - Name: "grant-keys", - Usage: "grants a given list of public keys in the following file (separated by line breaks) access to an ACT", - } - SwarmUpFromStdinFlag = cli.BoolFlag{ - Name: "stdin", - Usage: "reads data to be uploaded from stdin", - } - SwarmUploadMimeType = cli.StringFlag{ - Name: "mime", - Usage: "Manually specify MIME type", - } - SwarmEncryptedFlag = cli.BoolFlag{ - Name: "encrypt", - Usage: "use encrypted upload", - } - SwarmAccessPasswordFlag = cli.StringFlag{ - Name: "password", - Usage: "Password", - EnvVar: SWARM_ACCESS_PASSWORD, - } - SwarmDryRunFlag = cli.BoolFlag{ - Name: "dry-run", - Usage: "dry-run", - } - CorsStringFlag = cli.StringFlag{ - Name: "corsdomain", - Usage: "Domain on which to send Access-Control-Allow-Origin header (multiple domains can be supplied separated by a ',')", - EnvVar: SWARM_ENV_CORS, - } - SwarmStorePath = cli.StringFlag{ - Name: "store.path", - Usage: "Path to leveldb chunk DB (default <$GETH_ENV_DIR>/swarm/bzz-<$BZZ_KEY>/chunks)", - EnvVar: SWARM_ENV_STORE_PATH, - } - SwarmStoreCapacity = cli.Uint64Flag{ - Name: "store.size", - Usage: "Number of chunks (5M is roughly 20-25GB) (default 5000000)", - EnvVar: SWARM_ENV_STORE_CAPACITY, - } - SwarmStoreCacheCapacity = cli.UintFlag{ - Name: "store.cache.size", - Usage: "Number of recent chunks cached in memory (default 5000)", - EnvVar: SWARM_ENV_STORE_CACHE_CAPACITY, - } - SwarmCompressedFlag = cli.BoolFlag{ - Name: "compressed", - Usage: "Prints encryption keys in compressed form", - } - SwarmFeedNameFlag = cli.StringFlag{ - Name: "name", - Usage: "User-defined name for the new feed, limited to 32 characters. If combined with topic, it will refer to a subtopic with this name", - } - SwarmFeedTopicFlag = cli.StringFlag{ - Name: "topic", - Usage: "User-defined topic this feed is tracking, hex encoded. Limited to 64 hexadecimal characters", - } - SwarmFeedManifestFlag = cli.StringFlag{ - Name: "manifest", - Usage: "Refers to the feed through a manifest", - } - SwarmFeedUserFlag = cli.StringFlag{ - Name: "user", - Usage: "Indicates the user who updates the feed", - } -) diff --git a/cmd/swarm/fs.go b/cmd/swarm/fs.go deleted file mode 100644 index 9e8526e611fe..000000000000 --- a/cmd/swarm/fs.go +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright 2018 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 ( - "context" - "fmt" - "path/filepath" - "strings" - "time" - - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/swarm/fuse" - "gopkg.in/urfave/cli.v1" -) - -var fsCommand = cli.Command{ - Name: "fs", - CustomHelpTemplate: helpTemplate, - Usage: "perform FUSE operations", - ArgsUsage: "fs COMMAND", - Description: "Performs FUSE operations by mounting/unmounting/listing mount points. This assumes you already have a Swarm node running locally. For all operation you must reference the correct path to bzzd.ipc in order to communicate with the node", - Subcommands: []cli.Command{ - { - Action: mount, - CustomHelpTemplate: helpTemplate, - Name: "mount", - Usage: "mount a swarm hash to a mount point", - ArgsUsage: "swarm fs mount ", - Description: "Mounts a Swarm manifest hash to a given mount point. This assumes you already have a Swarm node running locally. You must reference the correct path to your bzzd.ipc file", - }, - { - Action: unmount, - CustomHelpTemplate: helpTemplate, - Name: "unmount", - Usage: "unmount a swarmfs mount", - ArgsUsage: "swarm fs unmount ", - Description: "Unmounts a swarmfs mount residing at . This assumes you already have a Swarm node running locally. You must reference the correct path to your bzzd.ipc file", - }, - { - Action: listMounts, - CustomHelpTemplate: helpTemplate, - Name: "list", - Usage: "list swarmfs mounts", - ArgsUsage: "swarm fs list", - Description: "Lists all mounted swarmfs volumes. This assumes you already have a Swarm node running locally. You must reference the correct path to your bzzd.ipc file", - }, - }, -} - -func mount(cliContext *cli.Context) { - args := cliContext.Args() - if len(args) < 2 { - utils.Fatalf("Usage: swarm fs mount ") - } - - client, err := dialRPC(cliContext) - if err != nil { - utils.Fatalf("had an error dailing to RPC endpoint: %v", err) - } - defer client.Close() - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - mf := &fuse.MountInfo{} - mountPoint, err := filepath.Abs(filepath.Clean(args[1])) - if err != nil { - utils.Fatalf("error expanding path for mount point: %v", err) - } - err = client.CallContext(ctx, mf, "swarmfs_mount", args[0], mountPoint) - if err != nil { - utils.Fatalf("had an error calling the RPC endpoint while mounting: %v", err) - } -} - -func unmount(cliContext *cli.Context) { - args := cliContext.Args() - - if len(args) < 1 { - utils.Fatalf("Usage: swarm fs unmount ") - } - client, err := dialRPC(cliContext) - if err != nil { - utils.Fatalf("had an error dailing to RPC endpoint: %v", err) - } - defer client.Close() - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - mf := fuse.MountInfo{} - err = client.CallContext(ctx, &mf, "swarmfs_unmount", args[0]) - if err != nil { - utils.Fatalf("encountered an error calling the RPC endpoint while unmounting: %v", err) - } - fmt.Printf("%s\n", mf.LatestManifest) //print the latest manifest hash for user reference -} - -func listMounts(cliContext *cli.Context) { - client, err := dialRPC(cliContext) - if err != nil { - utils.Fatalf("had an error dailing to RPC endpoint: %v", err) - } - defer client.Close() - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - mf := []fuse.MountInfo{} - err = client.CallContext(ctx, &mf, "swarmfs_listmounts") - if err != nil { - utils.Fatalf("encountered an error calling the RPC endpoint while listing mounts: %v", err) - } - if len(mf) == 0 { - fmt.Print("Could not found any swarmfs mounts. Please make sure you've specified the correct RPC endpoint\n") - } else { - fmt.Printf("Found %d swarmfs mount(s):\n", len(mf)) - for i, mountInfo := range mf { - fmt.Printf("%d:\n", i) - fmt.Printf("\tMount point: %s\n", mountInfo.MountPoint) - fmt.Printf("\tLatest Manifest: %s\n", mountInfo.LatestManifest) - fmt.Printf("\tStart Manifest: %s\n", mountInfo.StartManifest) - } - } -} - -func dialRPC(ctx *cli.Context) (*rpc.Client, error) { - endpoint := getIPCEndpoint(ctx) - log.Info("IPC endpoint", "path", endpoint) - return rpc.Dial(endpoint) -} - -func getIPCEndpoint(ctx *cli.Context) string { - cfg := defaultNodeConfig - utils.SetNodeConfig(ctx, &cfg) - - endpoint := cfg.IPCEndpoint() - - if strings.HasPrefix(endpoint, "rpc:") || strings.HasPrefix(endpoint, "ipc:") { - // Backwards compatibility with geth < 1.5 which required - // these prefixes. - endpoint = endpoint[4:] - } - return endpoint -} diff --git a/cmd/swarm/fs_test.go b/cmd/swarm/fs_test.go deleted file mode 100644 index 2d15a4536e88..000000000000 --- a/cmd/swarm/fs_test.go +++ /dev/null @@ -1,260 +0,0 @@ -// Copyright 2018 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 . - -// +build linux freebsd - -package main - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" - "testing" - "time" - - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/log" -) - -type testFile struct { - filePath string - content string -} - -// TestCLISwarmFsDefaultIPCPath tests if the most basic fs command, i.e., list -// can find and correctly connect to a running Swarm node on the default -// IPCPath. -func TestCLISwarmFsDefaultIPCPath(t *testing.T) { - cluster := newTestCluster(t, 1) - defer cluster.Shutdown() - - handlingNode := cluster.Nodes[0] - list := runSwarm(t, []string{ - "--datadir", handlingNode.Dir, - "fs", - "list", - }...) - - list.WaitExit() - if list.Err != nil { - t.Fatal(list.Err) - } -} - -// TestCLISwarmFs is a high-level test of swarmfs -// -// This test fails on travis for macOS as this executable exits with code 1 -// and without any log messages in the log: -// /Library/Filesystems/osxfuse.fs/Contents/Resources/load_osxfuse. -// This is the reason for this file not being built on darwin architecture. -func TestCLISwarmFs(t *testing.T) { - cluster := newTestCluster(t, 3) - defer cluster.Shutdown() - - // create a tmp dir - mountPoint, err := ioutil.TempDir("", "swarm-test") - log.Debug("swarmfs cli test", "1st mount", mountPoint) - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(mountPoint) - - handlingNode := cluster.Nodes[0] - mhash := doUploadEmptyDir(t, handlingNode) - log.Debug("swarmfs cli test: mounting first run", "ipc path", filepath.Join(handlingNode.Dir, handlingNode.IpcPath)) - - mount := runSwarm(t, []string{ - fmt.Sprintf("--%s", utils.IPCPathFlag.Name), filepath.Join(handlingNode.Dir, handlingNode.IpcPath), - "fs", - "mount", - mhash, - mountPoint, - }...) - mount.ExpectExit() - - filesToAssert := []*testFile{} - - dirPath, err := createDirInDir(mountPoint, "testSubDir") - if err != nil { - t.Fatal(err) - } - dirPath2, err := createDirInDir(dirPath, "AnotherTestSubDir") - if err != nil { - t.Fatal(err) - } - - dummyContent := "somerandomtestcontentthatshouldbeasserted" - dirs := []string{ - mountPoint, - dirPath, - dirPath2, - } - files := []string{"f1.tmp", "f2.tmp"} - for _, d := range dirs { - for _, entry := range files { - tFile, err := createTestFileInPath(d, entry, dummyContent) - if err != nil { - t.Fatal(err) - } - filesToAssert = append(filesToAssert, tFile) - } - } - if len(filesToAssert) != len(dirs)*len(files) { - t.Fatalf("should have %d files to assert now, got %d", len(dirs)*len(files), len(filesToAssert)) - } - hashRegexp := `[a-f\d]{64}` - log.Debug("swarmfs cli test: unmounting first run...", "ipc path", filepath.Join(handlingNode.Dir, handlingNode.IpcPath)) - - unmount := runSwarm(t, []string{ - fmt.Sprintf("--%s", utils.IPCPathFlag.Name), filepath.Join(handlingNode.Dir, handlingNode.IpcPath), - "fs", - "unmount", - mountPoint, - }...) - _, matches := unmount.ExpectRegexp(hashRegexp) - unmount.ExpectExit() - - hash := matches[0] - if hash == mhash { - t.Fatal("this should not be equal") - } - log.Debug("swarmfs cli test: asserting no files in mount point") - - //check that there's nothing in the mount folder - filesInDir, err := ioutil.ReadDir(mountPoint) - if err != nil { - t.Fatalf("had an error reading the directory: %v", err) - } - - if len(filesInDir) != 0 { - t.Fatal("there shouldn't be anything here") - } - - secondMountPoint, err := ioutil.TempDir("", "swarm-test") - log.Debug("swarmfs cli test", "2nd mount point at", secondMountPoint) - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(secondMountPoint) - - log.Debug("swarmfs cli test: remounting at second mount point", "ipc path", filepath.Join(handlingNode.Dir, handlingNode.IpcPath)) - - //remount, check files - newMount := runSwarm(t, []string{ - fmt.Sprintf("--%s", utils.IPCPathFlag.Name), filepath.Join(handlingNode.Dir, handlingNode.IpcPath), - "fs", - "mount", - hash, // the latest hash - secondMountPoint, - }...) - - newMount.ExpectExit() - time.Sleep(1 * time.Second) - - filesInDir, err = ioutil.ReadDir(secondMountPoint) - if err != nil { - t.Fatal(err) - } - - if len(filesInDir) == 0 { - t.Fatal("there should be something here") - } - - log.Debug("swarmfs cli test: traversing file tree to see it matches previous mount") - - for _, file := range filesToAssert { - file.filePath = strings.Replace(file.filePath, mountPoint, secondMountPoint, -1) - fileBytes, err := ioutil.ReadFile(file.filePath) - - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(fileBytes, bytes.NewBufferString(file.content).Bytes()) { - t.Fatal("this should be equal") - } - } - - log.Debug("swarmfs cli test: unmounting second run", "ipc path", filepath.Join(handlingNode.Dir, handlingNode.IpcPath)) - - unmountSec := runSwarm(t, []string{ - fmt.Sprintf("--%s", utils.IPCPathFlag.Name), filepath.Join(handlingNode.Dir, handlingNode.IpcPath), - "fs", - "unmount", - secondMountPoint, - }...) - - _, matches = unmountSec.ExpectRegexp(hashRegexp) - unmountSec.ExpectExit() - - if matches[0] != hash { - t.Fatal("these should be equal - no changes made") - } -} - -func doUploadEmptyDir(t *testing.T, node *testNode) string { - // create a tmp dir - tmpDir, err := ioutil.TempDir("", "swarm-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpDir) - - hashRegexp := `[a-f\d]{64}` - - flags := []string{ - "--bzzapi", node.URL, - "--recursive", - "up", - tmpDir} - - log.Info("swarmfs cli test: uploading dir with 'swarm up'") - up := runSwarm(t, flags...) - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - hash := matches[0] - log.Info("swarmfs cli test: dir uploaded", "hash", hash) - return hash -} - -func createDirInDir(createInDir string, dirToCreate string) (string, error) { - fullpath := filepath.Join(createInDir, dirToCreate) - err := os.MkdirAll(fullpath, 0777) - if err != nil { - return "", err - } - return fullpath, nil -} - -func createTestFileInPath(dir, filename, content string) (*testFile, error) { - tFile := &testFile{} - filePath := filepath.Join(dir, filename) - if file, err := os.Create(filePath); err == nil { - tFile.content = content - tFile.filePath = filePath - - _, err = io.WriteString(file, content) - if err != nil { - return nil, err - } - file.Close() - } - - return tFile, nil -} diff --git a/cmd/swarm/hash.go b/cmd/swarm/hash.go deleted file mode 100644 index 8560464d932f..000000000000 --- a/cmd/swarm/hash.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2016 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 . - -// Command bzzhash computes a swarm tree hash. -package main - -import ( - "context" - "fmt" - "os" - - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/swarm/storage" - "gopkg.in/urfave/cli.v1" -) - -var hashCommand = cli.Command{ - Action: hash, - CustomHelpTemplate: helpTemplate, - Name: "hash", - Usage: "print the swarm hash of a file or directory", - ArgsUsage: "", - Description: "Prints the swarm hash of file or directory", -} - -func hash(ctx *cli.Context) { - args := ctx.Args() - if len(args) < 1 { - utils.Fatalf("Usage: swarm hash ") - } - f, err := os.Open(args[0]) - if err != nil { - utils.Fatalf("Error opening file " + args[1]) - } - defer f.Close() - - stat, _ := f.Stat() - fileStore := storage.NewFileStore(&storage.FakeChunkStore{}, storage.NewFileStoreParams()) - addr, _, err := fileStore.Store(context.TODO(), f, stat.Size(), false) - if err != nil { - utils.Fatalf("%v\n", err) - } else { - fmt.Printf("%v\n", addr) - } -} diff --git a/cmd/swarm/list.go b/cmd/swarm/list.go deleted file mode 100644 index b8a4701ee8a5..000000000000 --- a/cmd/swarm/list.go +++ /dev/null @@ -1,70 +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 ( - "fmt" - "os" - "strings" - "text/tabwriter" - - "github.com/nebulaai/nbai-node/cmd/utils" - swarm "github.com/nebulaai/nbai-node/swarm/api/client" - "gopkg.in/urfave/cli.v1" -) - -var listCommand = cli.Command{ - Action: list, - CustomHelpTemplate: helpTemplate, - Name: "ls", - Usage: "list files and directories contained in a manifest", - ArgsUsage: " []", - Description: "Lists files and directories contained in a manifest", -} - -func list(ctx *cli.Context) { - args := ctx.Args() - - if len(args) < 1 { - utils.Fatalf("Please supply a manifest reference as the first argument") - } else if len(args) > 2 { - utils.Fatalf("Too many arguments - usage 'swarm ls manifest [prefix]'") - } - manifest := args[0] - - var prefix string - if len(args) == 2 { - prefix = args[1] - } - - bzzapi := strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client := swarm.NewClient(bzzapi) - list, err := client.List(manifest, prefix, "") - if err != nil { - utils.Fatalf("Failed to generate file and directory list: %s", err) - } - - w := tabwriter.NewWriter(os.Stdout, 1, 2, 2, ' ', 0) - defer w.Flush() - fmt.Fprintln(w, "HASH\tCONTENT TYPE\tPATH") - for _, prefix := range list.CommonPrefixes { - fmt.Fprintf(w, "%s\t%s\t%s\n", "", "DIR", prefix) - } - for _, entry := range list.Entries { - fmt.Fprintf(w, "%s\t%s\t%s\n", entry.Hash, entry.ContentType, entry.Path) - } -} diff --git a/cmd/swarm/main.go b/cmd/swarm/main.go deleted file mode 100644 index 8c6e172e5e69..000000000000 --- a/cmd/swarm/main.go +++ /dev/null @@ -1,432 +0,0 @@ -// Copyright 2016 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 ( - "crypto/ecdsa" - "encoding/hex" - "fmt" - "io/ioutil" - "os" - "os/signal" - "runtime" - "sort" - "strconv" - "strings" - "syscall" - - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/console" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/internal/debug" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/swarm" - bzzapi "github.com/nebulaai/nbai-node/swarm/api" - swarmmetrics "github.com/nebulaai/nbai-node/swarm/metrics" - "github.com/nebulaai/nbai-node/swarm/tracing" - sv "github.com/nebulaai/nbai-node/swarm/version" - - "gopkg.in/urfave/cli.v1" -) - -const clientIdentifier = "swarm" -const helpTemplate = `NAME: -{{.HelpName}} - {{.Usage}} - -USAGE: -{{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Category}} - -CATEGORY: -{{.Category}}{{end}}{{if .Description}} - -DESCRIPTION: -{{.Description}}{{end}}{{if .VisibleFlags}} - -OPTIONS: -{{range .VisibleFlags}}{{.}} -{{end}}{{end}} -` - -var ( - gitCommit string // Git SHA1 commit hash of the release (set via linker flags) -) - -//declare a few constant error messages, useful for later error check comparisons in test -var ( - SWARM_ERR_NO_BZZACCOUNT = "bzzaccount option is required but not set; check your config file, command line or environment variables" - SWARM_ERR_SWAP_SET_NO_API = "SWAP is enabled but --swap-api is not set" -) - -// this help command gets added to any subcommand that does not define it explicitly -var defaultSubcommandHelp = cli.Command{ - Action: func(ctx *cli.Context) { cli.ShowCommandHelpAndExit(ctx, "", 1) }, - CustomHelpTemplate: helpTemplate, - Name: "help", - Usage: "shows this help", - Hidden: true, -} - -var defaultNodeConfig = node.DefaultConfig - -// This init function sets defaults so cmd/swarm can run alongside geth. -func init() { - defaultNodeConfig.Name = clientIdentifier - defaultNodeConfig.Version = sv.VersionWithCommit(gitCommit) - defaultNodeConfig.P2P.ListenAddr = ":30399" - defaultNodeConfig.IPCPath = "bzzd.ipc" - // Set flag defaults for --help display. - utils.ListenPortFlag.Value = 30399 -} - -var app = utils.NewApp("", "Ethereum Swarm") - -// This init function creates the cli.App. -func init() { - app.Action = bzzd - app.Version = sv.ArchiveVersion(gitCommit) - app.Copyright = "Copyright 2013-2016 The go-ethereum Authors" - app.Commands = []cli.Command{ - { - Action: version, - CustomHelpTemplate: helpTemplate, - Name: "version", - Usage: "Print version numbers", - Description: "The output of this command is supposed to be machine-readable", - }, - { - Action: keys, - CustomHelpTemplate: helpTemplate, - Name: "print-keys", - Flags: []cli.Flag{SwarmCompressedFlag}, - Usage: "Print public key information", - Description: "The output of this command is supposed to be machine-readable", - }, - // See upload.go - upCommand, - // See access.go - accessCommand, - // See feeds.go - feedCommand, - // See list.go - listCommand, - // See hash.go - hashCommand, - // See download.go - downloadCommand, - // See manifest.go - manifestCommand, - // See fs.go - fsCommand, - // See db.go - dbCommand, - // See config.go - DumpConfigCommand, - } - - // append a hidden help subcommand to all commands that have subcommands - // if a help command was already defined above, that one will take precedence. - addDefaultHelpSubcommands(app.Commands) - - sort.Sort(cli.CommandsByName(app.Commands)) - - app.Flags = []cli.Flag{ - utils.IdentityFlag, - utils.DataDirFlag, - utils.BootnodesFlag, - utils.KeyStoreDirFlag, - utils.ListenPortFlag, - utils.NoDiscoverFlag, - utils.DiscoveryV5Flag, - utils.NetrestrictFlag, - utils.NodeKeyFileFlag, - utils.NodeKeyHexFlag, - utils.MaxPeersFlag, - utils.NATFlag, - utils.IPCDisabledFlag, - utils.IPCPathFlag, - utils.PasswordFileFlag, - // bzzd-specific flags - CorsStringFlag, - EnsAPIFlag, - SwarmTomlConfigPathFlag, - SwarmSwapEnabledFlag, - SwarmSwapAPIFlag, - SwarmSyncDisabledFlag, - SwarmSyncUpdateDelay, - SwarmMaxStreamPeerServersFlag, - SwarmLightNodeEnabled, - SwarmDeliverySkipCheckFlag, - SwarmListenAddrFlag, - SwarmPortFlag, - SwarmAccountFlag, - SwarmNetworkIdFlag, - ChequebookAddrFlag, - // upload flags - SwarmApiFlag, - SwarmRecursiveFlag, - SwarmWantManifestFlag, - SwarmUploadDefaultPath, - SwarmUpFromStdinFlag, - SwarmUploadMimeType, - // storage flags - SwarmStorePath, - SwarmStoreCapacity, - SwarmStoreCacheCapacity, - } - rpcFlags := []cli.Flag{ - utils.WSEnabledFlag, - utils.WSListenAddrFlag, - utils.WSPortFlag, - utils.WSApiFlag, - utils.WSAllowedOriginsFlag, - } - app.Flags = append(app.Flags, rpcFlags...) - app.Flags = append(app.Flags, debug.Flags...) - app.Flags = append(app.Flags, swarmmetrics.Flags...) - app.Flags = append(app.Flags, tracing.Flags...) - app.Before = func(ctx *cli.Context) error { - runtime.GOMAXPROCS(runtime.NumCPU()) - if err := debug.Setup(ctx, ""); err != nil { - return err - } - swarmmetrics.Setup(ctx) - tracing.Setup(ctx) - return nil - } - app.After = func(ctx *cli.Context) error { - debug.Exit() - return nil - } -} - -func main() { - if err := app.Run(os.Args); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -func keys(ctx *cli.Context) error { - privateKey := getPrivKey(ctx) - pub := hex.EncodeToString(crypto.FromECDSAPub(&privateKey.PublicKey)) - pubCompressed := hex.EncodeToString(crypto.CompressPubkey(&privateKey.PublicKey)) - if !ctx.Bool(SwarmCompressedFlag.Name) { - fmt.Println(fmt.Sprintf("publicKey=%s", pub)) - } - fmt.Println(fmt.Sprintf("publicKeyCompressed=%s", pubCompressed)) - return nil -} - -func version(ctx *cli.Context) error { - fmt.Println(strings.Title(clientIdentifier)) - fmt.Println("Version:", sv.VersionWithMeta) - if gitCommit != "" { - fmt.Println("Git Commit:", gitCommit) - } - fmt.Println("Go Version:", runtime.Version()) - fmt.Println("OS:", runtime.GOOS) - return nil -} - -func bzzd(ctx *cli.Context) error { - //build a valid bzzapi.Config from all available sources: - //default config, file config, command line and env vars - - bzzconfig, err := buildConfig(ctx) - if err != nil { - utils.Fatalf("unable to configure swarm: %v", err) - } - - cfg := defaultNodeConfig - - //pss operates on ws - cfg.WSModules = append(cfg.WSModules, "pss") - - //geth only supports --datadir via command line - //in order to be consistent within swarm, if we pass --datadir via environment variable - //or via config file, we get the same directory for geth and swarm - if _, err := os.Stat(bzzconfig.Path); err == nil { - cfg.DataDir = bzzconfig.Path - } - - //optionally set the bootnodes before configuring the node - setSwarmBootstrapNodes(ctx, &cfg) - //setup the ethereum node - utils.SetNodeConfig(ctx, &cfg) - stack, err := node.New(&cfg) - if err != nil { - utils.Fatalf("can't create node: %v", err) - } - - //a few steps need to be done after the config phase is completed, - //due to overriding behavior - initSwarmNode(bzzconfig, stack, ctx) - //register BZZ as node.Service in the ethereum node - registerBzzService(bzzconfig, stack) - //start the node - utils.StartNode(stack) - - go func() { - sigc := make(chan os.Signal, 1) - signal.Notify(sigc, syscall.SIGTERM) - defer signal.Stop(sigc) - <-sigc - log.Info("Got sigterm, shutting swarm down...") - stack.Stop() - }() - - stack.Wait() - return nil -} - -func registerBzzService(bzzconfig *bzzapi.Config, stack *node.Node) { - //define the swarm service boot function - boot := func(_ *node.ServiceContext) (node.Service, error) { - // In production, mockStore must be always nil. - return swarm.NewSwarm(bzzconfig, nil) - } - //register within the ethereum node - if err := stack.Register(boot); err != nil { - utils.Fatalf("Failed to register the Swarm service: %v", err) - } -} - -func getAccount(bzzaccount string, ctx *cli.Context, stack *node.Node) *ecdsa.PrivateKey { - //an account is mandatory - if bzzaccount == "" { - utils.Fatalf(SWARM_ERR_NO_BZZACCOUNT) - } - // Try to load the arg as a hex key file. - if key, err := crypto.LoadECDSA(bzzaccount); err == nil { - log.Info("Swarm account key loaded", "address", crypto.PubkeyToAddress(key.PublicKey)) - return key - } - // Otherwise try getting it from the keystore. - am := stack.AccountManager() - ks := am.Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) - - return decryptStoreAccount(ks, bzzaccount, utils.MakePasswordList(ctx)) -} - -// getPrivKey returns the private key of the specified bzzaccount -// Used only by client commands, such as `feed` -func getPrivKey(ctx *cli.Context) *ecdsa.PrivateKey { - // booting up the swarm node just as we do in bzzd action - bzzconfig, err := buildConfig(ctx) - if err != nil { - utils.Fatalf("unable to configure swarm: %v", err) - } - cfg := defaultNodeConfig - if _, err := os.Stat(bzzconfig.Path); err == nil { - cfg.DataDir = bzzconfig.Path - } - utils.SetNodeConfig(ctx, &cfg) - stack, err := node.New(&cfg) - if err != nil { - utils.Fatalf("can't create node: %v", err) - } - return getAccount(bzzconfig.BzzAccount, ctx, stack) -} - -func decryptStoreAccount(ks *keystore.KeyStore, account string, passwords []string) *ecdsa.PrivateKey { - var a accounts.Account - var err error - if common.IsHexAddress(account) { - a, err = ks.Find(accounts.Account{Address: common.HexToAddress(account)}) - } else if ix, ixerr := strconv.Atoi(account); ixerr == nil && ix > 0 { - if accounts := ks.Accounts(); len(accounts) > ix { - a = accounts[ix] - } else { - err = fmt.Errorf("index %d higher than number of accounts %d", ix, len(accounts)) - } - } else { - utils.Fatalf("Can't find swarm account key %s", account) - } - if err != nil { - utils.Fatalf("Can't find swarm account key: %v - Is the provided bzzaccount(%s) from the right datadir/Path?", err, account) - } - keyjson, err := ioutil.ReadFile(a.URL.Path) - if err != nil { - utils.Fatalf("Can't load swarm account key: %v", err) - } - for i := 0; i < 3; i++ { - password := getPassPhrase(fmt.Sprintf("Unlocking swarm account %s [%d/3]", a.Address.Hex(), i+1), i, passwords) - key, err := keystore.DecryptKey(keyjson, password) - if err == nil { - return key.PrivateKey - } - } - utils.Fatalf("Can't decrypt swarm account key") - return nil -} - -// getPassPhrase retrieves the password associated with bzz account, either by fetching -// from a list of pre-loaded passwords, or by requesting it interactively from user. -func getPassPhrase(prompt string, i int, passwords []string) string { - // non-interactive - if len(passwords) > 0 { - if i < len(passwords) { - return passwords[i] - } - return passwords[len(passwords)-1] - } - - // fallback to interactive mode - if prompt != "" { - fmt.Println(prompt) - } - password, err := console.Stdin.PromptPassword("Passphrase: ") - if err != nil { - utils.Fatalf("Failed to read passphrase: %v", err) - } - return password -} - -// addDefaultHelpSubcommand scans through defined CLI commands and adds -// a basic help subcommand to each -// if a help command is already defined, it will take precedence over the default. -func addDefaultHelpSubcommands(commands []cli.Command) { - for i := range commands { - cmd := &commands[i] - if cmd.Subcommands != nil { - cmd.Subcommands = append(cmd.Subcommands, defaultSubcommandHelp) - addDefaultHelpSubcommands(cmd.Subcommands) - } - } -} - -func setSwarmBootstrapNodes(ctx *cli.Context, cfg *node.Config) { - if ctx.GlobalIsSet(utils.BootnodesFlag.Name) || ctx.GlobalIsSet(utils.BootnodesV4Flag.Name) { - return - } - - cfg.P2P.BootstrapNodes = []*enode.Node{} - - for _, url := range SwarmBootnodes { - node, err := enode.ParseV4(url) - if err != nil { - log.Error("Bootstrap URL invalid", "enode", url, "err", err) - } - cfg.P2P.BootstrapNodes = append(cfg.P2P.BootstrapNodes, node) - } - log.Debug("added default swarm bootnodes", "length", len(cfg.P2P.BootstrapNodes)) -} diff --git a/cmd/swarm/manifest.go b/cmd/swarm/manifest.go deleted file mode 100644 index 18405d6875ae..000000000000 --- a/cmd/swarm/manifest.go +++ /dev/null @@ -1,353 +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 . - -// Command MANIFEST update -package main - -import ( - "fmt" - "os" - "strings" - - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/swarm/api" - swarm "github.com/nebulaai/nbai-node/swarm/api/client" - "gopkg.in/urfave/cli.v1" -) - -var manifestCommand = cli.Command{ - Name: "manifest", - CustomHelpTemplate: helpTemplate, - Usage: "perform operations on swarm manifests", - ArgsUsage: "COMMAND", - Description: "Updates a MANIFEST by adding/removing/updating the hash of a path.\nCOMMAND could be: add, update, remove", - Subcommands: []cli.Command{ - { - Action: manifestAdd, - CustomHelpTemplate: helpTemplate, - Name: "add", - Usage: "add a new path to the manifest", - ArgsUsage: " ", - Description: "Adds a new path to the manifest", - }, - { - Action: manifestUpdate, - CustomHelpTemplate: helpTemplate, - Name: "update", - Usage: "update the hash for an already existing path in the manifest", - ArgsUsage: " ", - Description: "Update the hash for an already existing path in the manifest", - }, - { - Action: manifestRemove, - CustomHelpTemplate: helpTemplate, - Name: "remove", - Usage: "removes a path from the manifest", - ArgsUsage: " ", - Description: "Removes a path from the manifest", - }, - }, -} - -// manifestAdd adds a new entry to the manifest at the given path. -// New entry hash, the last argument, must be the hash of a manifest -// with only one entry, which meta-data will be added to the original manifest. -// On success, this function will print new (updated) manifest's hash. -func manifestAdd(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 3 { - utils.Fatalf("Need exactly three arguments ") - } - - var ( - mhash = args[0] - path = args[1] - hash = args[2] - ) - - bzzapi := strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client := swarm.NewClient(bzzapi) - - m, _, err := client.DownloadManifest(hash) - if err != nil { - utils.Fatalf("Error downloading manifest to add: %v", err) - } - l := len(m.Entries) - if l == 0 { - utils.Fatalf("No entries in manifest %s", hash) - } else if l > 1 { - utils.Fatalf("Too many entries in manifest %s", hash) - } - - newManifest := addEntryToManifest(client, mhash, path, m.Entries[0]) - fmt.Println(newManifest) -} - -// manifestUpdate replaces an existing entry of the manifest at the given path. -// New entry hash, the last argument, must be the hash of a manifest -// with only one entry, which meta-data will be added to the original manifest. -// On success, this function will print hash of the updated manifest. -func manifestUpdate(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 3 { - utils.Fatalf("Need exactly three arguments ") - } - - var ( - mhash = args[0] - path = args[1] - hash = args[2] - ) - - bzzapi := strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client := swarm.NewClient(bzzapi) - - m, _, err := client.DownloadManifest(hash) - if err != nil { - utils.Fatalf("Error downloading manifest to update: %v", err) - } - l := len(m.Entries) - if l == 0 { - utils.Fatalf("No entries in manifest %s", hash) - } else if l > 1 { - utils.Fatalf("Too many entries in manifest %s", hash) - } - - newManifest, _, defaultEntryUpdated := updateEntryInManifest(client, mhash, path, m.Entries[0], true) - if defaultEntryUpdated { - // Print informational message to stderr - // allowing the user to get the new manifest hash from stdout - // without the need to parse the complete output. - fmt.Fprintln(os.Stderr, "Manifest default entry is updated, too") - } - fmt.Println(newManifest) -} - -// manifestRemove removes an existing entry of the manifest at the given path. -// On success, this function will print hash of the manifest which does not -// contain the path. -func manifestRemove(ctx *cli.Context) { - args := ctx.Args() - if len(args) != 2 { - utils.Fatalf("Need exactly two arguments ") - } - - var ( - mhash = args[0] - path = args[1] - ) - - bzzapi := strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - client := swarm.NewClient(bzzapi) - - newManifest := removeEntryFromManifest(client, mhash, path) - fmt.Println(newManifest) -} - -func addEntryToManifest(client *swarm.Client, mhash, path string, entry api.ManifestEntry) string { - var longestPathEntry = api.ManifestEntry{} - - mroot, isEncrypted, err := client.DownloadManifest(mhash) - if err != nil { - utils.Fatalf("Manifest download failed: %v", err) - } - - // See if we path is in this Manifest or do we have to dig deeper - for _, e := range mroot.Entries { - if path == e.Path { - utils.Fatalf("Path %s already present, not adding anything", path) - } else { - if e.ContentType == api.ManifestType { - prfxlen := strings.HasPrefix(path, e.Path) - if prfxlen && len(path) > len(longestPathEntry.Path) { - longestPathEntry = e - } - } - } - } - - if longestPathEntry.Path != "" { - // Load the child Manifest add the entry there - newPath := path[len(longestPathEntry.Path):] - newHash := addEntryToManifest(client, longestPathEntry.Hash, newPath, entry) - - // Replace the hash for parent Manifests - newMRoot := &api.Manifest{} - for _, e := range mroot.Entries { - if longestPathEntry.Path == e.Path { - e.Hash = newHash - } - newMRoot.Entries = append(newMRoot.Entries, e) - } - mroot = newMRoot - } else { - // Add the entry in the leaf Manifest - entry.Path = path - mroot.Entries = append(mroot.Entries, entry) - } - - newManifestHash, err := client.UploadManifest(mroot, isEncrypted) - if err != nil { - utils.Fatalf("Manifest upload failed: %v", err) - } - return newManifestHash -} - -// updateEntryInManifest updates an existing entry o path with a new one in the manifest with provided mhash -// finding the path recursively through all nested manifests. Argument isRoot is used for default -// entry update detection. If the updated entry has the same hash as the default entry, then the -// default entry in root manifest will be updated too. -// Returned values are the new manifest hash, hash of the entry that was replaced by the new entry and -// a a bool that is true if default entry is updated. -func updateEntryInManifest(client *swarm.Client, mhash, path string, entry api.ManifestEntry, isRoot bool) (newManifestHash, oldHash string, defaultEntryUpdated bool) { - var ( - newEntry = api.ManifestEntry{} - longestPathEntry = api.ManifestEntry{} - ) - - mroot, isEncrypted, err := client.DownloadManifest(mhash) - if err != nil { - utils.Fatalf("Manifest download failed: %v", err) - } - - // See if we path is in this Manifest or do we have to dig deeper - for _, e := range mroot.Entries { - if path == e.Path { - newEntry = e - // keep the reference of the hash of the entry that should be replaced - // for default entry detection - oldHash = e.Hash - } else { - if e.ContentType == api.ManifestType { - prfxlen := strings.HasPrefix(path, e.Path) - if prfxlen && len(path) > len(longestPathEntry.Path) { - longestPathEntry = e - } - } - } - } - - if longestPathEntry.Path == "" && newEntry.Path == "" { - utils.Fatalf("Path %s not present in the Manifest, not setting anything", path) - } - - if longestPathEntry.Path != "" { - // Load the child Manifest add the entry there - newPath := path[len(longestPathEntry.Path):] - var newHash string - newHash, oldHash, _ = updateEntryInManifest(client, longestPathEntry.Hash, newPath, entry, false) - - // Replace the hash for parent Manifests - newMRoot := &api.Manifest{} - for _, e := range mroot.Entries { - if longestPathEntry.Path == e.Path { - e.Hash = newHash - } - newMRoot.Entries = append(newMRoot.Entries, e) - - } - mroot = newMRoot - } - - // update the manifest if the new entry is found and - // check if default entry should be updated - if newEntry.Path != "" || isRoot { - // Replace the hash for leaf Manifest - newMRoot := &api.Manifest{} - for _, e := range mroot.Entries { - if newEntry.Path == e.Path { - entry.Path = e.Path - newMRoot.Entries = append(newMRoot.Entries, entry) - } else if isRoot && e.Path == "" && e.Hash == oldHash { - entry.Path = e.Path - newMRoot.Entries = append(newMRoot.Entries, entry) - defaultEntryUpdated = true - } else { - newMRoot.Entries = append(newMRoot.Entries, e) - } - } - mroot = newMRoot - } - - newManifestHash, err = client.UploadManifest(mroot, isEncrypted) - if err != nil { - utils.Fatalf("Manifest upload failed: %v", err) - } - return newManifestHash, oldHash, defaultEntryUpdated -} - -func removeEntryFromManifest(client *swarm.Client, mhash, path string) string { - var ( - entryToRemove = api.ManifestEntry{} - longestPathEntry = api.ManifestEntry{} - ) - - mroot, isEncrypted, err := client.DownloadManifest(mhash) - if err != nil { - utils.Fatalf("Manifest download failed: %v", err) - } - - // See if we path is in this Manifest or do we have to dig deeper - for _, entry := range mroot.Entries { - if path == entry.Path { - entryToRemove = entry - } else { - if entry.ContentType == api.ManifestType { - prfxlen := strings.HasPrefix(path, entry.Path) - if prfxlen && len(path) > len(longestPathEntry.Path) { - longestPathEntry = entry - } - } - } - } - - if longestPathEntry.Path == "" && entryToRemove.Path == "" { - utils.Fatalf("Path %s not present in the Manifest, not removing anything", path) - } - - if longestPathEntry.Path != "" { - // Load the child Manifest remove the entry there - newPath := path[len(longestPathEntry.Path):] - newHash := removeEntryFromManifest(client, longestPathEntry.Hash, newPath) - - // Replace the hash for parent Manifests - newMRoot := &api.Manifest{} - for _, entry := range mroot.Entries { - if longestPathEntry.Path == entry.Path { - entry.Hash = newHash - } - newMRoot.Entries = append(newMRoot.Entries, entry) - } - mroot = newMRoot - } - - if entryToRemove.Path != "" { - // remove the entry in this Manifest - newMRoot := &api.Manifest{} - for _, entry := range mroot.Entries { - if entryToRemove.Path != entry.Path { - newMRoot.Entries = append(newMRoot.Entries, entry) - } - } - mroot = newMRoot - } - - newManifestHash, err := client.UploadManifest(mroot, isEncrypted) - if err != nil { - utils.Fatalf("Manifest upload failed: %v", err) - } - return newManifestHash -} diff --git a/cmd/swarm/manifest_test.go b/cmd/swarm/manifest_test.go deleted file mode 100644 index 88cc5ca73368..000000000000 --- a/cmd/swarm/manifest_test.go +++ /dev/null @@ -1,597 +0,0 @@ -// Copyright 2018 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 ( - "bytes" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "testing" - - "github.com/nebulaai/nbai-node/swarm/api" - swarm "github.com/nebulaai/nbai-node/swarm/api/client" - swarmhttp "github.com/nebulaai/nbai-node/swarm/api/http" -) - -// TestManifestChange tests manifest add, update and remove -// cli commands without encryption. -func TestManifestChange(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip() - } - - testManifestChange(t, false) -} - -// TestManifestChange tests manifest add, update and remove -// cli commands with encryption enabled. -func TestManifestChangeEncrypted(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip() - } - - testManifestChange(t, true) -} - -// testManifestChange performs cli commands: -// - manifest add -// - manifest update -// - manifest remove -// on a manifest, testing the functionality of this -// comands on paths that are in root manifest or a nested one. -// Argument encrypt controls whether to use encryption or not. -func testManifestChange(t *testing.T, encrypt bool) { - t.Parallel() - srv := swarmhttp.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - tmp, err := ioutil.TempDir("", "swarm-manifest-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - origDir := filepath.Join(tmp, "orig") - if err := os.Mkdir(origDir, 0777); err != nil { - t.Fatal(err) - } - - indexDataFilename := filepath.Join(origDir, "index.html") - err = ioutil.WriteFile(indexDataFilename, []byte("

Test

"), 0666) - if err != nil { - t.Fatal(err) - } - // Files paths robots.txt and robots.html share the same prefix "robots." - // which will result a manifest with a nested manifest under path "robots.". - // This will allow testing manifest changes on both root and nested manifest. - err = ioutil.WriteFile(filepath.Join(origDir, "robots.txt"), []byte("Disallow: /"), 0666) - if err != nil { - t.Fatal(err) - } - err = ioutil.WriteFile(filepath.Join(origDir, "robots.html"), []byte("No Robots Allowed"), 0666) - if err != nil { - t.Fatal(err) - } - err = ioutil.WriteFile(filepath.Join(origDir, "mutants.txt"), []byte("Frank\nMarcus"), 0666) - if err != nil { - t.Fatal(err) - } - - args := []string{ - "--bzzapi", - srv.URL, - "--recursive", - "--defaultpath", - indexDataFilename, - "up", - origDir, - } - if encrypt { - args = append(args, "--encrypt") - } - - origManifestHash := runSwarmExpectHash(t, args...) - - checkHashLength(t, origManifestHash, encrypt) - - client := swarm.NewClient(srv.URL) - - // upload a new file and use its manifest to add it the original manifest. - t.Run("add", func(t *testing.T) { - humansData := []byte("Ann\nBob") - humansDataFilename := filepath.Join(tmp, "humans.txt") - err = ioutil.WriteFile(humansDataFilename, humansData, 0666) - if err != nil { - t.Fatal(err) - } - - humansManifestHash := runSwarmExpectHash(t, - "--bzzapi", - srv.URL, - "up", - humansDataFilename, - ) - - newManifestHash := runSwarmExpectHash(t, - "--bzzapi", - srv.URL, - "manifest", - "add", - origManifestHash, - "humans.txt", - humansManifestHash, - ) - - checkHashLength(t, newManifestHash, encrypt) - - newManifest := downloadManifest(t, client, newManifestHash, encrypt) - - var found bool - for _, e := range newManifest.Entries { - if e.Path == "humans.txt" { - found = true - if e.Size != int64(len(humansData)) { - t.Errorf("expected humans.txt size %v, got %v", len(humansData), e.Size) - } - if e.ModTime.IsZero() { - t.Errorf("got zero mod time for humans.txt") - } - ct := "text/plain; charset=utf-8" - if e.ContentType != ct { - t.Errorf("expected content type %q, got %q", ct, e.ContentType) - } - break - } - } - if !found { - t.Fatal("no humans.txt in new manifest") - } - - checkFile(t, client, newManifestHash, "humans.txt", humansData) - }) - - // upload a new file and use its manifest to add it the original manifest, - // but ensure that the file will be in the nested manifest of the original one. - t.Run("add nested", func(t *testing.T) { - robotsData := []byte(`{"disallow": "/"}`) - robotsDataFilename := filepath.Join(tmp, "robots.json") - err = ioutil.WriteFile(robotsDataFilename, robotsData, 0666) - if err != nil { - t.Fatal(err) - } - - robotsManifestHash := runSwarmExpectHash(t, - "--bzzapi", - srv.URL, - "up", - robotsDataFilename, - ) - - newManifestHash := runSwarmExpectHash(t, - "--bzzapi", - srv.URL, - "manifest", - "add", - origManifestHash, - "robots.json", - robotsManifestHash, - ) - - checkHashLength(t, newManifestHash, encrypt) - - newManifest := downloadManifest(t, client, newManifestHash, encrypt) - - var found bool - loop: - for _, e := range newManifest.Entries { - if e.Path == "robots." { - nestedManifest := downloadManifest(t, client, e.Hash, encrypt) - for _, e := range nestedManifest.Entries { - if e.Path == "json" { - found = true - if e.Size != int64(len(robotsData)) { - t.Errorf("expected robots.json size %v, got %v", len(robotsData), e.Size) - } - if e.ModTime.IsZero() { - t.Errorf("got zero mod time for robots.json") - } - ct := "application/json" - if e.ContentType != ct { - t.Errorf("expected content type %q, got %q", ct, e.ContentType) - } - break loop - } - } - } - } - if !found { - t.Fatal("no robots.json in new manifest") - } - - checkFile(t, client, newManifestHash, "robots.json", robotsData) - }) - - // upload a new file and use its manifest to change the file it the original manifest. - t.Run("update", func(t *testing.T) { - indexData := []byte("

Ethereum Swarm

") - indexDataFilename := filepath.Join(tmp, "index.html") - err = ioutil.WriteFile(indexDataFilename, indexData, 0666) - if err != nil { - t.Fatal(err) - } - - indexManifestHash := runSwarmExpectHash(t, - "--bzzapi", - srv.URL, - "up", - indexDataFilename, - ) - - newManifestHash := runSwarmExpectHash(t, - "--bzzapi", - srv.URL, - "manifest", - "update", - origManifestHash, - "index.html", - indexManifestHash, - ) - - checkHashLength(t, newManifestHash, encrypt) - - newManifest := downloadManifest(t, client, newManifestHash, encrypt) - - var found bool - for _, e := range newManifest.Entries { - if e.Path == "index.html" { - found = true - if e.Size != int64(len(indexData)) { - t.Errorf("expected index.html size %v, got %v", len(indexData), e.Size) - } - if e.ModTime.IsZero() { - t.Errorf("got zero mod time for index.html") - } - ct := "text/html; charset=utf-8" - if e.ContentType != ct { - t.Errorf("expected content type %q, got %q", ct, e.ContentType) - } - break - } - } - if !found { - t.Fatal("no index.html in new manifest") - } - - checkFile(t, client, newManifestHash, "index.html", indexData) - - // check default entry change - checkFile(t, client, newManifestHash, "", indexData) - }) - - // upload a new file and use its manifest to change the file it the original manifest, - // but ensure that the file is in the nested manifest of the original one. - t.Run("update nested", func(t *testing.T) { - robotsData := []byte(`Only humans allowed!!!`) - robotsDataFilename := filepath.Join(tmp, "robots.html") - err = ioutil.WriteFile(robotsDataFilename, robotsData, 0666) - if err != nil { - t.Fatal(err) - } - - humansManifestHash := runSwarmExpectHash(t, - "--bzzapi", - srv.URL, - "up", - robotsDataFilename, - ) - - newManifestHash := runSwarmExpectHash(t, - "--bzzapi", - srv.URL, - "manifest", - "update", - origManifestHash, - "robots.html", - humansManifestHash, - ) - - checkHashLength(t, newManifestHash, encrypt) - - newManifest := downloadManifest(t, client, newManifestHash, encrypt) - - var found bool - loop: - for _, e := range newManifest.Entries { - if e.Path == "robots." { - nestedManifest := downloadManifest(t, client, e.Hash, encrypt) - for _, e := range nestedManifest.Entries { - if e.Path == "html" { - found = true - if e.Size != int64(len(robotsData)) { - t.Errorf("expected robots.html size %v, got %v", len(robotsData), e.Size) - } - if e.ModTime.IsZero() { - t.Errorf("got zero mod time for robots.html") - } - ct := "text/html; charset=utf-8" - if e.ContentType != ct { - t.Errorf("expected content type %q, got %q", ct, e.ContentType) - } - break loop - } - } - } - } - if !found { - t.Fatal("no robots.html in new manifest") - } - - checkFile(t, client, newManifestHash, "robots.html", robotsData) - }) - - // remove a file from the manifest. - t.Run("remove", func(t *testing.T) { - newManifestHash := runSwarmExpectHash(t, - "--bzzapi", - srv.URL, - "manifest", - "remove", - origManifestHash, - "mutants.txt", - ) - - checkHashLength(t, newManifestHash, encrypt) - - newManifest := downloadManifest(t, client, newManifestHash, encrypt) - - var found bool - for _, e := range newManifest.Entries { - if e.Path == "mutants.txt" { - found = true - break - } - } - if found { - t.Fatal("mutants.txt is not removed") - } - }) - - // remove a file from the manifest, but ensure that the file is in - // the nested manifest of the original one. - t.Run("remove nested", func(t *testing.T) { - newManifestHash := runSwarmExpectHash(t, - "--bzzapi", - srv.URL, - "manifest", - "remove", - origManifestHash, - "robots.html", - ) - - checkHashLength(t, newManifestHash, encrypt) - - newManifest := downloadManifest(t, client, newManifestHash, encrypt) - - var found bool - loop: - for _, e := range newManifest.Entries { - if e.Path == "robots." { - nestedManifest := downloadManifest(t, client, e.Hash, encrypt) - for _, e := range nestedManifest.Entries { - if e.Path == "html" { - found = true - break loop - } - } - } - } - if found { - t.Fatal("robots.html in not removed") - } - }) -} - -// TestNestedDefaultEntryUpdate tests if the default entry is updated -// if the file in nested manifest used for it is also updated. -func TestNestedDefaultEntryUpdate(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip() - } - - testNestedDefaultEntryUpdate(t, false) -} - -// TestNestedDefaultEntryUpdateEncrypted tests if the default entry -// of encrypted upload is updated if the file in nested manifest -// used for it is also updated. -func TestNestedDefaultEntryUpdateEncrypted(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip() - } - - testNestedDefaultEntryUpdate(t, true) -} - -func testNestedDefaultEntryUpdate(t *testing.T, encrypt bool) { - t.Parallel() - srv := swarmhttp.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - tmp, err := ioutil.TempDir("", "swarm-manifest-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - origDir := filepath.Join(tmp, "orig") - if err := os.Mkdir(origDir, 0777); err != nil { - t.Fatal(err) - } - - indexData := []byte("

Test

") - indexDataFilename := filepath.Join(origDir, "index.html") - err = ioutil.WriteFile(indexDataFilename, indexData, 0666) - if err != nil { - t.Fatal(err) - } - // Add another file with common prefix as the default entry to test updates of - // default entry with nested manifests. - err = ioutil.WriteFile(filepath.Join(origDir, "index.txt"), []byte("Test"), 0666) - if err != nil { - t.Fatal(err) - } - - args := []string{ - "--bzzapi", - srv.URL, - "--recursive", - "--defaultpath", - indexDataFilename, - "up", - origDir, - } - if encrypt { - args = append(args, "--encrypt") - } - - origManifestHash := runSwarmExpectHash(t, args...) - - checkHashLength(t, origManifestHash, encrypt) - - client := swarm.NewClient(srv.URL) - - newIndexData := []byte("

Ethereum Swarm

") - newIndexDataFilename := filepath.Join(tmp, "index.html") - err = ioutil.WriteFile(newIndexDataFilename, newIndexData, 0666) - if err != nil { - t.Fatal(err) - } - - newIndexManifestHash := runSwarmExpectHash(t, - "--bzzapi", - srv.URL, - "up", - newIndexDataFilename, - ) - - newManifestHash := runSwarmExpectHash(t, - "--bzzapi", - srv.URL, - "manifest", - "update", - origManifestHash, - "index.html", - newIndexManifestHash, - ) - - checkHashLength(t, newManifestHash, encrypt) - - newManifest := downloadManifest(t, client, newManifestHash, encrypt) - - var found bool - for _, e := range newManifest.Entries { - if e.Path == "index." { - found = true - newManifest = downloadManifest(t, client, e.Hash, encrypt) - break - } - } - if !found { - t.Fatal("no index. path in new manifest") - } - - found = false - for _, e := range newManifest.Entries { - if e.Path == "html" { - found = true - if e.Size != int64(len(newIndexData)) { - t.Errorf("expected index.html size %v, got %v", len(newIndexData), e.Size) - } - if e.ModTime.IsZero() { - t.Errorf("got zero mod time for index.html") - } - ct := "text/html; charset=utf-8" - if e.ContentType != ct { - t.Errorf("expected content type %q, got %q", ct, e.ContentType) - } - break - } - } - if !found { - t.Fatal("no html in new manifest") - } - - checkFile(t, client, newManifestHash, "index.html", newIndexData) - - // check default entry change - checkFile(t, client, newManifestHash, "", newIndexData) -} - -func runSwarmExpectHash(t *testing.T, args ...string) (hash string) { - t.Helper() - hashRegexp := `[a-f\d]{64,128}` - up := runSwarm(t, args...) - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - - if len(matches) < 1 { - t.Fatal("no matches found") - } - return matches[0] -} - -func checkHashLength(t *testing.T, hash string, encrypted bool) { - t.Helper() - l := len(hash) - if encrypted && l != 128 { - t.Errorf("expected hash length 128, got %v", l) - } - if !encrypted && l != 64 { - t.Errorf("expected hash length 64, got %v", l) - } -} - -func downloadManifest(t *testing.T, client *swarm.Client, hash string, encrypted bool) (manifest *api.Manifest) { - t.Helper() - m, isEncrypted, err := client.DownloadManifest(hash) - if err != nil { - t.Fatal(err) - } - - if encrypted != isEncrypted { - t.Error("new manifest encryption flag is not correct") - } - return m -} - -func checkFile(t *testing.T, client *swarm.Client, hash, path string, expected []byte) { - t.Helper() - f, err := client.Download(hash, path) - if err != nil { - t.Fatal(err) - } - - got, err := ioutil.ReadAll(f) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(got, expected) { - t.Errorf("expected file content %q, got %q", expected, got) - } -} diff --git a/cmd/swarm/mimegen/generator.go b/cmd/swarm/mimegen/generator.go deleted file mode 100644 index dda0442a3bf4..000000000000 --- a/cmd/swarm/mimegen/generator.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2018 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 - -// Standard "mime" package rely on system-settings, see mime.osInitMime -// Swarm will run on many OS/Platform/Docker and must behave similar -// This command generates code to add common mime types based on mime.types file -// -// mime.types file provided by mailcap, which follow https://www.iana.org/assignments/media-types/media-types.xhtml -// -// Get last version of mime.types file by: -// docker run --rm -v $(pwd):/tmp alpine:edge /bin/sh -c "apk add -U mailcap; mv /etc/mime.types /tmp" - -import ( - "bufio" - "bytes" - "flag" - "html/template" - "io/ioutil" - "strings" - - "log" -) - -var ( - typesFlag = flag.String("types", "", "Input mime.types file") - packageFlag = flag.String("package", "", "Golang package in output file") - outFlag = flag.String("out", "", "Output file name for the generated mime types") -) - -type mime struct { - Name string - Exts []string -} - -type templateParams struct { - PackageName string - Mimes []mime -} - -func main() { - // Parse and ensure all needed inputs are specified - flag.Parse() - if *typesFlag == "" { - log.Fatalf("--types is required") - } - if *packageFlag == "" { - log.Fatalf("--types is required") - } - if *outFlag == "" { - log.Fatalf("--out is required") - } - - params := templateParams{ - PackageName: *packageFlag, - } - - types, err := ioutil.ReadFile(*typesFlag) - if err != nil { - log.Fatal(err) - } - - scanner := bufio.NewScanner(bytes.NewReader(types)) - for scanner.Scan() { - txt := scanner.Text() - if strings.HasPrefix(txt, "#") || len(txt) == 0 { - continue - } - parts := strings.Fields(txt) - if len(parts) == 1 { - continue - } - params.Mimes = append(params.Mimes, mime{parts[0], parts[1:]}) - } - - if err = scanner.Err(); err != nil { - log.Fatal(err) - } - - result := bytes.NewBuffer([]byte{}) - - if err := template.Must(template.New("_").Parse(tpl)).Execute(result, params); err != nil { - log.Fatal(err) - } - - if err := ioutil.WriteFile(*outFlag, result.Bytes(), 0600); err != nil { - log.Fatal(err) - } -} - -var tpl = `// Code generated by github.com/nebulaai/nbai-node/cmd/swarm/mimegen. DO NOT EDIT. - -package {{ .PackageName }} - -import "mime" -func init() { - var mimeTypes = map[string]string{ -{{- range .Mimes -}} - {{ $name := .Name -}} - {{- range .Exts }} - ".{{ . }}": "{{ $name | html }}", - {{- end }} -{{- end }} - } - for ext, name := range mimeTypes { - if err := mime.AddExtensionType(ext, name); err != nil { - panic(err) - } - } -} -` diff --git a/cmd/swarm/mimegen/mime.types b/cmd/swarm/mimegen/mime.types deleted file mode 100644 index 1bdf211490d9..000000000000 --- a/cmd/swarm/mimegen/mime.types +++ /dev/null @@ -1,1828 +0,0 @@ -# This is a comment. I love comments. -*- indent-tabs-mode: t -*- - -# This file controls what Internet media types are sent to the client for -# given file extension(s). Sending the correct media type to the client -# is important so they know how to handle the content of the file. -# Extra types can either be added here or by using an AddType directive -# in your config files. For more information about Internet media types, -# please read RFC 2045, 2046, 2047, 2048, and 2077. The Internet media type -# registry is at . - -# IANA types - -# MIME type Extensions -application/1d-interleaved-parityfec -application/3gpdash-qoe-report+xml -application/3gpp-ims+xml -application/A2L a2l -application/activemessage -application/alto-costmap+json -application/alto-costmapfilter+json -application/alto-directory+json -application/alto-endpointcost+json -application/alto-endpointcostparams+json -application/alto-endpointprop+json -application/alto-endpointpropparams+json -application/alto-error+json -application/alto-networkmap+json -application/alto-networkmapfilter+json -application/AML aml -application/andrew-inset ez -application/applefile -application/ATF atf -application/ATFX atfx -application/ATXML atxml -application/atom+xml atom -application/atomcat+xml atomcat -application/atomdeleted+xml atomdeleted -application/atomicmail -application/atomsvc+xml atomsvc -application/auth-policy+xml apxml -application/bacnet-xdd+zip xdd -application/batch-SMTP -application/beep+xml -application/calendar+json -application/calendar+xml xcs -application/call-completion -application/cals-1840 -application/cbor cbor -application/ccmp+xml ccmp -application/ccxml+xml ccxml -application/CDFX+XML cdfx -application/cdmi-capability cdmia -application/cdmi-container cdmic -application/cdmi-domain cdmid -application/cdmi-object cdmio -application/cdmi-queue cdmiq -application/cdni -application/CEA cea -application/cea-2018+xml -application/cellml+xml cellml cml -application/cfw -application/clue_info+xml clue -application/cms cmsc -application/cnrp+xml -application/coap-group+json -application/coap-payload -application/commonground -application/conference-info+xml -application/cpl+xml cpl -application/cose -application/cose-key -application/cose-key-set -application/csrattrs csrattrs -application/csta+xml -application/CSTAdata+xml -application/csvm+json -application/cybercash -application/dash+xml mpd -application/dashdelta mpdd -application/davmount+xml davmount -application/dca-rft -application/DCD dcd -application/dec-dx -application/dialog-info+xml -application/dicom dcm -application/dicom+json -application/dicom+xml -application/DII dii -application/DIT dit -application/dns -application/dskpp+xml xmls -application/dssc+der dssc -application/dssc+xml xdssc -application/dvcs dvc -application/ecmascript es -application/EDI-Consent -application/EDI-X12 -application/EDIFACT -application/efi efi -application/EmergencyCallData.Comment+xml -application/EmergencyCallData.Control+xml -application/EmergencyCallData.DeviceInfo+xml -application/EmergencyCallData.eCall.MSD -application/EmergencyCallData.ProviderInfo+xml -application/EmergencyCallData.ServiceInfo+xml -application/EmergencyCallData.SubscriberInfo+xml -application/EmergencyCallData.VEDS+xml -application/emma+xml emma -application/emotionml+xml emotionml -application/encaprtp -application/epp+xml -application/epub+zip epub -application/eshop -application/exi exi -application/fastinfoset finf -application/fastsoap -application/fdt+xml fdt -# fits, fit, fts: image/fits -application/fits -# application/font-sfnt deprecated in favor of font/sfnt -application/font-tdpfr pfr -# application/font-woff deprecated in favor of font/woff -application/framework-attributes+xml -application/geo+json geojson -application/geo+json-seq -application/gml+xml gml -application/gzip gz tgz -application/H224 -application/held+xml -application/http -application/hyperstudio stk -application/ibe-key-request+xml -application/ibe-pkg-reply+xml -application/ibe-pp-data -application/iges -application/im-iscomposing+xml -application/index -application/index.cmd -application/index.obj -application/index.response -application/index.vnd -application/inkml+xml ink inkml -application/iotp -application/ipfix ipfix -application/ipp -application/isup -application/its+xml its -application/javascript js -application/jose -application/jose+json -application/jrd+json jrd -application/json json -application/json-patch+json json-patch -application/json-seq -application/jwk+json -application/jwk-set+json -application/jwt -application/kpml-request+xml -application/kpml-response+xml -application/ld+json jsonld -application/lgr+xml lgr -application/link-format wlnk -application/load-control+xml -application/lost+xml lostxml -application/lostsync+xml lostsyncxml -application/LXF lxf -application/mac-binhex40 hqx -application/macwriteii -application/mads+xml mads -application/marc mrc -application/marcxml+xml mrcx -application/mathematica nb ma mb -application/mathml-content+xml -application/mathml-presentation+xml -application/mathml+xml mml -application/mbms-associated-procedure-description+xml -application/mbms-deregister+xml -application/mbms-envelope+xml -application/mbms-msk-response+xml -application/mbms-msk+xml -application/mbms-protection-description+xml -application/mbms-reception-report+xml -application/mbms-register-response+xml -application/mbms-register+xml -application/mbms-schedule+xml -application/mbms-user-service-description+xml -application/mbox mbox -application/media_control+xml -# mpf: text/vnd.ms-mediapackage -application/media-policy-dataset+xml -application/mediaservercontrol+xml -application/merge-patch+json -application/metalink4+xml meta4 -application/mets+xml mets -application/MF4 mf4 -application/mikey -application/mods+xml mods -application/moss-keys -application/moss-signature -application/mosskey-data -application/mosskey-request -application/mp21 m21 mp21 -# mp4, mpg4: video/mp4, see RFC 4337 -application/mp4 -application/mpeg4-generic -application/mpeg4-iod -application/mpeg4-iod-xmt -# xdf: application/xcap-diff+xml -application/mrb-consumer+xml -application/mrb-publish+xml -application/msc-ivr+xml -application/msc-mixer+xml -application/msword doc -application/mud+json -application/mxf mxf -application/n-quads nq -application/n-triples nt -application/nasdata -application/news-checkgroups -application/news-groupinfo -application/news-transmission -application/nlsml+xml -application/nss -application/ocsp-request orq -application/ocsp-response ors -application/octet-stream bin lha lzh exe class so dll img iso -application/oda oda -application/ODX odx -application/oebps-package+xml opf -application/ogg ogx -application/oxps oxps -application/p2p-overlay+xml relo -application/parityfec -# xer: application/xcap-error+xml -application/patch-ops-error+xml -application/pdf pdf -application/PDX pdx -application/pgp-encrypted pgp -application/pgp-keys -application/pgp-signature sig -application/pidf-diff+xml -application/pidf+xml -application/pkcs10 p10 -application/pkcs12 p12 pfx -application/pkcs7-mime p7m p7c -application/pkcs7-signature p7s -application/pkcs8 p8 -# ac: application/vnd.nokia.n-gage.ac+xml -application/pkix-attr-cert -application/pkix-cert cer -application/pkix-crl crl -application/pkix-pkipath pkipath -application/pkixcmp pki -application/pls+xml pls -application/poc-settings+xml -application/postscript ps eps ai -application/ppsp-tracker+json -application/problem+json -application/problem+xml -application/provenance+xml provx -application/prs.alvestrand.titrax-sheet -application/prs.cww cw cww -application/prs.hpub+zip hpub -application/prs.nprend rnd rct -application/prs.plucker -application/prs.rdf-xml-crypt rdf-crypt -application/prs.xsf+xml xsf -application/pskc+xml pskcxml -application/qsig -application/raptorfec -application/rdap+json -application/rdf+xml rdf -application/reginfo+xml rif -application/relax-ng-compact-syntax rnc -application/remote-printing -application/reputon+json -application/resource-lists-diff+xml rld -application/resource-lists+xml rl -application/rfc+xml rfcxml -application/riscos -application/rlmi+xml -application/rls-services+xml rs -application/rpki-ghostbusters gbr -application/rpki-manifest mft -application/rpki-publication -application/rpki-roa roa -application/rpki-updown -application/rtf rtf -application/rtploopback -application/rtx -application/samlassertion+xml -application/samlmetadata+xml -application/sbml+xml -application/scaip+xml -# scm: application/vnd.lotus-screencam -application/scim+json scim -application/scvp-cv-request scq -application/scvp-cv-response scs -application/scvp-vp-request spq -application/scvp-vp-response spp -application/sdp sdp -application/sep+xml -application/sep-exi -application/session-info -application/set-payment -application/set-payment-initiation -application/set-registration -application/set-registration-initiation -application/sgml -application/sgml-open-catalog soc -application/shf+xml shf -application/sieve siv sieve -application/simple-filter+xml cl -application/simple-message-summary -application/simpleSymbolContainer -application/slate -# application/smil obsoleted by application/smil+xml -application/smil+xml smil smi sml -application/smpte336m -application/soap+fastinfoset -application/soap+xml -application/sparql-query rq -application/sparql-results+xml srx -application/spirits-event+xml -application/sql sql -application/srgs gram -application/srgs+xml grxml -application/sru+xml sru -application/ssml+xml ssml -application/tamp-apex-update tau -application/tamp-apex-update-confirm auc -application/tamp-community-update tcu -application/tamp-community-update-confirm cuc -application/tamp-error ter -application/tamp-sequence-adjust tsa -application/tamp-sequence-adjust-confirm sac -# tsq: application/timestamp-query -application/tamp-status-query -# tsr: application/timestamp-reply -application/tamp-status-response -application/tamp-update tur -application/tamp-update-confirm tuc -application/tei+xml tei teiCorpus odd -application/thraud+xml tfi -application/timestamp-query tsq -application/timestamp-reply tsr -application/timestamped-data tsd -application/trig trig -application/ttml+xml ttml -application/tve-trigger -application/ulpfec -application/urc-grpsheet+xml gsheet -application/urc-ressheet+xml rsheet -application/urc-targetdesc+xml td -application/urc-uisocketdesc+xml uis -application/vcard+json -application/vcard+xml -application/vemmi -application/vnd.3gpp.access-transfer-events+xml -application/vnd.3gpp.bsf+xml -application/vnd.3gpp.mid-call+xml -application/vnd.3gpp.pic-bw-large plb -application/vnd.3gpp.pic-bw-small psb -application/vnd.3gpp.pic-bw-var pvb -application/vnd.3gpp-prose+xml -application/vnd.3gpp-prose-pc3ch+xml -# sms: application/vnd.3gpp2.sms -application/vnd.3gpp.sms -application/vnd.3gpp.sms+xml -application/vnd.3gpp.srvcc-ext+xml -application/vnd.3gpp.SRVCC-info+xml -application/vnd.3gpp.state-and-event-info+xml -application/vnd.3gpp.ussd+xml -application/vnd.3gpp2.bcmcsinfo+xml -application/vnd.3gpp2.sms sms -application/vnd.3gpp2.tcap tcap -application/vnd.3lightssoftware.imagescal imgcal -application/vnd.3M.Post-it-Notes pwn -application/vnd.accpac.simply.aso aso -application/vnd.accpac.simply.imp imp -application/vnd.acucobol acu -application/vnd.acucorp atc acutc -application/vnd.adobe.flash.movie swf -application/vnd.adobe.formscentral.fcdt fcdt -application/vnd.adobe.fxp fxp fxpl -application/vnd.adobe.partial-upload -application/vnd.adobe.xdp+xml xdp -application/vnd.adobe.xfdf xfdf -application/vnd.aether.imp -application/vnd.ah-barcode -application/vnd.ahead.space ahead -application/vnd.airzip.filesecure.azf azf -application/vnd.airzip.filesecure.azs azs -application/vnd.amazon.mobi8-ebook azw3 -application/vnd.americandynamics.acc acc -application/vnd.amiga.ami ami -application/vnd.amundsen.maze+xml -application/vnd.anki apkg -application/vnd.anser-web-certificate-issue-initiation cii -# Not in IANA listing, but is on FTP site? -application/vnd.anser-web-funds-transfer-initiation fti -# atx: audio/ATRAC-X -application/vnd.antix.game-component -application/vnd.apache.thrift.binary -application/vnd.apache.thrift.compact -application/vnd.apache.thrift.json -application/vnd.api+json -application/vnd.apothekende.reservation+json -application/vnd.apple.installer+xml dist distz pkg mpkg -# m3u: audio/x-mpegurl for now -application/vnd.apple.mpegurl m3u8 -# application/vnd.arastra.swi obsoleted by application/vnd.aristanetworks.swi -application/vnd.aristanetworks.swi swi -application/vnd.artsquare -application/vnd.astraea-software.iota iota -application/vnd.audiograph aep -application/vnd.autopackage package -application/vnd.avistar+xml -application/vnd.balsamiq.bmml+xml bmml -application/vnd.balsamiq.bmpr bmpr -application/vnd.bekitzur-stech+json -application/vnd.bint.med-content -application/vnd.biopax.rdf+xml -application/vnd.blueice.multipass mpm -application/vnd.bluetooth.ep.oob ep -application/vnd.bluetooth.le.oob le -application/vnd.bmi bmi -application/vnd.businessobjects rep -application/vnd.cab-jscript -application/vnd.canon-cpdl -application/vnd.canon-lips -application/vnd.capasystems-pg+json -application/vnd.cendio.thinlinc.clientconf tlclient -application/vnd.century-systems.tcp_stream -application/vnd.chemdraw+xml cdxml -application/vnd.chess-pgn pgn -application/vnd.chipnuts.karaoke-mmd mmd -application/vnd.cinderella cdy -application/vnd.cirpack.isdn-ext -application/vnd.citationstyles.style+xml csl -application/vnd.claymore cla -application/vnd.cloanto.rp9 rp9 -application/vnd.clonk.c4group c4g c4d c4f c4p c4u -application/vnd.cluetrust.cartomobile-config c11amc -application/vnd.cluetrust.cartomobile-config-pkg c11amz -application/vnd.coffeescript coffee -application/vnd.collection+json -application/vnd.collection.doc+json -application/vnd.collection.next+json -application/vnd.comicbook+zip cbz -# icc: application/vnd.iccprofile -application/vnd.commerce-battelle ica icf icd ic0 ic1 ic2 ic3 ic4 ic5 ic6 ic7 ic8 -application/vnd.commonspace csp cst -application/vnd.contact.cmsg cdbcmsg -application/vnd.coreos.ignition+json ign ignition -application/vnd.cosmocaller cmc -application/vnd.crick.clicker clkx -application/vnd.crick.clicker.keyboard clkk -application/vnd.crick.clicker.palette clkp -application/vnd.crick.clicker.template clkt -application/vnd.crick.clicker.wordbank clkw -application/vnd.criticaltools.wbs+xml wbs -application/vnd.ctc-posml pml -application/vnd.ctct.ws+xml -application/vnd.cups-pdf -application/vnd.cups-postscript -application/vnd.cups-ppd ppd -application/vnd.cups-raster -application/vnd.cups-raw -application/vnd.curl curl -application/vnd.cyan.dean.root+xml -application/vnd.cybank -application/vnd.d2l.coursepackage1p0+zip -application/vnd.dart dart -application/vnd.data-vision.rdz rdz -application/vnd.datapackage+json -application/vnd.dataresource+json -application/vnd.debian.binary-package deb udeb -application/vnd.dece.data uvf uvvf uvd uvvd -application/vnd.dece.ttml+xml uvt uvvt -application/vnd.dece.unspecified uvx uvvx -application/vnd.dece.zip uvz uvvz -application/vnd.denovo.fcselayout-link fe_launch -application/vnd.desmume.movie dsm -application/vnd.dir-bi.plate-dl-nosuffix -application/vnd.dm.delegation+xml -application/vnd.dna dna -application/vnd.document+json docjson -application/vnd.dolby.mobile.1 -application/vnd.dolby.mobile.2 -application/vnd.doremir.scorecloud-binary-document scld -application/vnd.dpgraph dpg mwc dpgraph -application/vnd.dreamfactory dfac -application/vnd.drive+json -application/vnd.dtg.local -application/vnd.dtg.local.flash fla -application/vnd.dtg.local.html -application/vnd.dvb.ait ait -# class: application/octet-stream -application/vnd.dvb.dvbj -application/vnd.dvb.esgcontainer -application/vnd.dvb.ipdcdftnotifaccess -application/vnd.dvb.ipdcesgaccess -application/vnd.dvb.ipdcesgaccess2 -application/vnd.dvb.ipdcesgpdd -application/vnd.dvb.ipdcroaming -application/vnd.dvb.iptv.alfec-base -application/vnd.dvb.iptv.alfec-enhancement -application/vnd.dvb.notif-aggregate-root+xml -application/vnd.dvb.notif-container+xml -application/vnd.dvb.notif-generic+xml -application/vnd.dvb.notif-ia-msglist+xml -application/vnd.dvb.notif-ia-registration-request+xml -application/vnd.dvb.notif-ia-registration-response+xml -application/vnd.dvb.notif-init+xml -# pfr: application/font-tdpfr -application/vnd.dvb.pfr -application/vnd.dvb.service svc -# dxr: application/x-director -application/vnd.dxr -application/vnd.dynageo geo -application/vnd.dzr dzr -application/vnd.easykaraoke.cdgdownload -application/vnd.ecdis-update -application/vnd.ecowin.chart mag -application/vnd.ecowin.filerequest -application/vnd.ecowin.fileupdate -application/vnd.ecowin.series -application/vnd.ecowin.seriesrequest -application/vnd.ecowin.seriesupdate -# img: application/octet-stream -application/vnd.efi-img -# iso: application/octet-stream -application/vnd.efi-iso -application/vnd.enliven nml -application/vnd.enphase.envoy -application/vnd.eprints.data+xml -application/vnd.epson.esf esf -application/vnd.epson.msf msf -application/vnd.epson.quickanime qam -application/vnd.epson.salt slt -application/vnd.epson.ssf ssf -application/vnd.ericsson.quickcall qcall qca -application/vnd.espass-espass+zip espass -application/vnd.eszigno3+xml es3 et3 -application/vnd.etsi.aoc+xml -application/vnd.etsi.asic-e+zip asice sce -# scs: application/scvp-cv-response -application/vnd.etsi.asic-s+zip asics -application/vnd.etsi.cug+xml -application/vnd.etsi.iptvcommand+xml -application/vnd.etsi.iptvdiscovery+xml -application/vnd.etsi.iptvprofile+xml -application/vnd.etsi.iptvsad-bc+xml -application/vnd.etsi.iptvsad-cod+xml -application/vnd.etsi.iptvsad-npvr+xml -application/vnd.etsi.iptvservice+xml -application/vnd.etsi.iptvsync+xml -application/vnd.etsi.iptvueprofile+xml -application/vnd.etsi.mcid+xml -application/vnd.etsi.mheg5 -application/vnd.etsi.overload-control-policy-dataset+xml -application/vnd.etsi.pstn+xml -application/vnd.etsi.sci+xml -application/vnd.etsi.simservs+xml -application/vnd.etsi.timestamp-token tst -application/vnd.etsi.tsl.der -application/vnd.etsi.tsl+xml -application/vnd.eudora.data -application/vnd.ezpix-album ez2 -application/vnd.ezpix-package ez3 -application/vnd.f-secure.mobile -application/vnd.fastcopy-disk-image dim -application/vnd.fdf fdf -application/vnd.fdsn.mseed msd mseed -application/vnd.fdsn.seed seed dataless -application/vnd.ffsns -application/vnd.filmit.zfc zfc -# all extensions: application/vnd.hbci -application/vnd.fints -application/vnd.firemonkeys.cloudcell -application/vnd.FloGraphIt gph -application/vnd.fluxtime.clip ftc -application/vnd.font-fontforge-sfd sfd -application/vnd.framemaker fm -application/vnd.frogans.fnc fnc -application/vnd.frogans.ltf ltf -application/vnd.fsc.weblaunch fsc -application/vnd.fujitsu.oasys oas -application/vnd.fujitsu.oasys2 oa2 -application/vnd.fujitsu.oasys3 oa3 -application/vnd.fujitsu.oasysgp fg5 -application/vnd.fujitsu.oasysprs bh2 -application/vnd.fujixerox.ART-EX -application/vnd.fujixerox.ART4 -application/vnd.fujixerox.ddd ddd -application/vnd.fujixerox.docuworks xdw -application/vnd.fujixerox.docuworks.binder xbd -application/vnd.fujixerox.docuworks.container xct -application/vnd.fujixerox.HBPL -application/vnd.fut-misnet -application/vnd.fuzzysheet fzs -application/vnd.genomatix.tuxedo txd -# application/vnd.geo+json obsoleted by application/geo+json -application/vnd.geocube+xml g3 g³ -application/vnd.geogebra.file ggb -application/vnd.geogebra.tool ggt -application/vnd.geometry-explorer gex gre -application/vnd.geonext gxt -application/vnd.geoplan g2w -application/vnd.geospace g3w -# gbr: application/rpki-ghostbusters -application/vnd.gerber -application/vnd.globalplatform.card-content-mgt -application/vnd.globalplatform.card-content-mgt-response -application/vnd.gmx gmx -application/vnd.google-earth.kml+xml kml -application/vnd.google-earth.kmz kmz -application/vnd.gov.sk.e-form+xml -application/vnd.gov.sk.e-form+zip -application/vnd.gov.sk.xmldatacontainer+xml -application/vnd.grafeq gqf gqs -application/vnd.gridmp -application/vnd.groove-account gac -application/vnd.groove-help ghf -application/vnd.groove-identity-message gim -application/vnd.groove-injector grv -application/vnd.groove-tool-message gtm -application/vnd.groove-tool-template tpl -application/vnd.groove-vcard vcg -application/vnd.hal+json -application/vnd.hal+xml hal -application/vnd.HandHeld-Entertainment+xml zmm -application/vnd.hbci hbci hbc kom upa pkd bpd -application/vnd.hc+json -# rep: application/vnd.businessobjects -application/vnd.hcl-bireports -application/vnd.hdt hdt -application/vnd.heroku+json -application/vnd.hhe.lesson-player les -application/vnd.hp-HPGL hpgl -application/vnd.hp-hpid hpi hpid -application/vnd.hp-hps hps -application/vnd.hp-jlyt jlt -application/vnd.hp-PCL pcl -application/vnd.hp-PCLXL -application/vnd.httphone -application/vnd.hydrostatix.sof-data sfd-hdstx -application/vnd.hyperdrive+json -application/vnd.hzn-3d-crossword x3d -application/vnd.ibm.afplinedata -application/vnd.ibm.electronic-media emm -application/vnd.ibm.MiniPay mpy -application/vnd.ibm.modcap list3820 listafp afp pseg3820 -application/vnd.ibm.rights-management irm -application/vnd.ibm.secure-container sc -application/vnd.iccprofile icc icm -application/vnd.ieee.1905 1905.1 -application/vnd.igloader igl -application/vnd.imagemeter.folder+zip imf -application/vnd.imagemeter.image+zip imi -application/vnd.immervision-ivp ivp -application/vnd.immervision-ivu ivu -application/vnd.ims.imsccv1p1 imscc -application/vnd.ims.imsccv1p2 -application/vnd.ims.imsccv1p3 -application/vnd.ims.lis.v2.result+json -application/vnd.ims.lti.v2.toolconsumerprofile+json -application/vnd.ims.lti.v2.toolproxy.id+json -application/vnd.ims.lti.v2.toolproxy+json -application/vnd.ims.lti.v2.toolsettings+json -application/vnd.ims.lti.v2.toolsettings.simple+json -application/vnd.informedcontrol.rms+xml -# application/vnd.informix-visionary obsoleted by application/vnd.visionary -application/vnd.infotech.project -application/vnd.infotech.project+xml -application/vnd.innopath.wamp.notification -application/vnd.insors.igm igm -application/vnd.intercon.formnet xpw xpx -application/vnd.intergeo i2g -application/vnd.intertrust.digibox -application/vnd.intertrust.nncp -application/vnd.intu.qbo qbo -application/vnd.intu.qfx qfx -application/vnd.iptc.g2.catalogitem+xml -application/vnd.iptc.g2.conceptitem+xml -application/vnd.iptc.g2.knowledgeitem+xml -application/vnd.iptc.g2.newsitem+xml -application/vnd.iptc.g2.newsmessage+xml -application/vnd.iptc.g2.packageitem+xml -application/vnd.iptc.g2.planningitem+xml -application/vnd.ipunplugged.rcprofile rcprofile -application/vnd.irepository.package+xml irp -application/vnd.is-xpr xpr -application/vnd.isac.fcs fcs -application/vnd.jam jam -application/vnd.japannet-directory-service -application/vnd.japannet-jpnstore-wakeup -application/vnd.japannet-payment-wakeup -application/vnd.japannet-registration -application/vnd.japannet-registration-wakeup -application/vnd.japannet-setstore-wakeup -application/vnd.japannet-verification -application/vnd.japannet-verification-wakeup -application/vnd.jcp.javame.midlet-rms rms -application/vnd.jisp jisp -application/vnd.joost.joda-archive joda -application/vnd.jsk.isdn-ngn -application/vnd.kahootz ktz ktr -application/vnd.kde.karbon karbon -application/vnd.kde.kchart chrt -application/vnd.kde.kformula kfo -application/vnd.kde.kivio flw -application/vnd.kde.kontour kon -application/vnd.kde.kpresenter kpr kpt -application/vnd.kde.kspread ksp -application/vnd.kde.kword kwd kwt -application/vnd.kenameaapp htke -application/vnd.kidspiration kia -application/vnd.Kinar kne knp sdf -application/vnd.koan skp skd skm skt -application/vnd.kodak-descriptor sse -application/vnd.las.las+json lasjson -application/vnd.las.las+xml lasxml -application/vnd.liberty-request+xml -application/vnd.llamagraphics.life-balance.desktop lbd -application/vnd.llamagraphics.life-balance.exchange+xml lbe -application/vnd.lotus-1-2-3 123 wk4 wk3 wk1 -application/vnd.lotus-approach apr vew -application/vnd.lotus-freelance prz pre -application/vnd.lotus-notes nsf ntf ndl ns4 ns3 ns2 nsh nsg -application/vnd.lotus-organizer or3 or2 org -application/vnd.lotus-screencam scm -application/vnd.lotus-wordpro lwp sam -application/vnd.macports.portpkg portpkg -application/vnd.mapbox-vector-tile mvt -application/vnd.marlin.drm.actiontoken+xml -application/vnd.marlin.drm.conftoken+xml -application/vnd.marlin.drm.license+xml -application/vnd.marlin.drm.mdcf mdc -application/vnd.mason+json -application/vnd.maxmind.maxmind-db mmdb -application/vnd.mcd mcd -application/vnd.medcalcdata mc1 -application/vnd.mediastation.cdkey cdkey -application/vnd.meridian-slingshot -application/vnd.MFER mwf -application/vnd.mfmp mfm -application/vnd.micro+json -application/vnd.micrografx.flo flo -application/vnd.micrografx.igx igx -application/vnd.microsoft.portable-executable -application/vnd.microsoft.windows.thumbnail-cache -application/vnd.miele+json -application/vnd.mif mif -application/vnd.minisoft-hp3000-save -application/vnd.mitsubishi.misty-guard.trustweb -application/vnd.Mobius.DAF daf -application/vnd.Mobius.DIS dis -application/vnd.Mobius.MBK mbk -application/vnd.Mobius.MQY mqy -application/vnd.Mobius.MSL msl -application/vnd.Mobius.PLC plc -application/vnd.Mobius.TXF txf -application/vnd.mophun.application mpn -application/vnd.mophun.certificate mpc -application/vnd.motorola.flexsuite -application/vnd.motorola.flexsuite.adsi -application/vnd.motorola.flexsuite.fis -application/vnd.motorola.flexsuite.gotap -application/vnd.motorola.flexsuite.kmr -application/vnd.motorola.flexsuite.ttc -application/vnd.motorola.flexsuite.wem -application/vnd.motorola.iprm -application/vnd.mozilla.xul+xml xul -application/vnd.ms-3mfdocument 3mf -application/vnd.ms-artgalry cil -application/vnd.ms-asf asf -application/vnd.ms-cab-compressed cab -application/vnd.ms-excel xls xlm xla xlc xlt xlw -application/vnd.ms-excel.template.macroEnabled.12 xltm -application/vnd.ms-excel.addin.macroEnabled.12 xlam -application/vnd.ms-excel.sheet.binary.macroEnabled.12 xlsb -application/vnd.ms-excel.sheet.macroEnabled.12 xlsm -application/vnd.ms-fontobject eot -application/vnd.ms-htmlhelp chm -application/vnd.ms-ims ims -application/vnd.ms-lrm lrm -application/vnd.ms-office.activeX+xml -application/vnd.ms-officetheme thmx -application/vnd.ms-playready.initiator+xml -application/vnd.ms-powerpoint ppt pps pot -application/vnd.ms-powerpoint.addin.macroEnabled.12 ppam -application/vnd.ms-powerpoint.presentation.macroEnabled.12 pptm -application/vnd.ms-powerpoint.slide.macroEnabled.12 sldm -application/vnd.ms-powerpoint.slideshow.macroEnabled.12 ppsm -application/vnd.ms-powerpoint.template.macroEnabled.12 potm -application/vnd.ms-PrintDeviceCapabilities+xml -application/vnd.ms-PrintSchemaTicket+xml -application/vnd.ms-project mpp mpt -application/vnd.ms-tnef tnef tnf -application/vnd.ms-windows.devicepairing -application/vnd.ms-windows.nwprinting.oob -application/vnd.ms-windows.printerpairing -application/vnd.ms-windows.wsd.oob -application/vnd.ms-wmdrm.lic-chlg-req -application/vnd.ms-wmdrm.lic-resp -application/vnd.ms-wmdrm.meter-chlg-req -application/vnd.ms-wmdrm.meter-resp -application/vnd.ms-word.document.macroEnabled.12 docm -application/vnd.ms-word.template.macroEnabled.12 dotm -application/vnd.ms-works wcm wdb wks wps -application/vnd.ms-wpl wpl -application/vnd.ms-xpsdocument xps -application/vnd.msa-disk-image msa -application/vnd.mseq mseq -application/vnd.msign -application/vnd.multiad.creator crtr -application/vnd.multiad.creator.cif cif -application/vnd.music-niff -application/vnd.musician mus -application/vnd.muvee.style msty -application/vnd.mynfc taglet -application/vnd.ncd.control -application/vnd.ncd.reference -application/vnd.nearst.inv+json -application/vnd.nervana entity request bkm kcm -application/vnd.netfpx -# ntf: application/vnd.lotus-notes -application/vnd.nitf nitf -application/vnd.neurolanguage.nlu nlu -application/vnd.nintendo.nitro.rom nds -application/vnd.nintendo.snes.rom sfc smc -application/vnd.noblenet-directory nnd -application/vnd.noblenet-sealer nns -application/vnd.noblenet-web nnw -application/vnd.nokia.catalogs -application/vnd.nokia.conml+wbxml -application/vnd.nokia.conml+xml -application/vnd.nokia.iptv.config+xml -application/vnd.nokia.iSDS-radio-presets -application/vnd.nokia.landmark+wbxml -application/vnd.nokia.landmark+xml -application/vnd.nokia.landmarkcollection+xml -application/vnd.nokia.n-gage.ac+xml ac -application/vnd.nokia.n-gage.data ngdat -application/vnd.nokia.n-gage.symbian.install n-gage -application/vnd.nokia.ncd -application/vnd.nokia.pcd+wbxml -application/vnd.nokia.pcd+xml -application/vnd.nokia.radio-preset rpst -application/vnd.nokia.radio-presets rpss -application/vnd.novadigm.EDM edm -application/vnd.novadigm.EDX edx -application/vnd.novadigm.EXT ext -application/vnd.ntt-local.content-share -application/vnd.ntt-local.file-transfer -application/vnd.ntt-local.ogw_remote-access -application/vnd.ntt-local.sip-ta_remote -application/vnd.ntt-local.sip-ta_tcp_stream -application/vnd.oasis.opendocument.chart odc -application/vnd.oasis.opendocument.chart-template otc -application/vnd.oasis.opendocument.database odb -application/vnd.oasis.opendocument.formula odf -# otf: font/otf -application/vnd.oasis.opendocument.formula-template -application/vnd.oasis.opendocument.graphics odg -application/vnd.oasis.opendocument.graphics-template otg -application/vnd.oasis.opendocument.image odi -application/vnd.oasis.opendocument.image-template oti -application/vnd.oasis.opendocument.presentation odp -application/vnd.oasis.opendocument.presentation-template otp -application/vnd.oasis.opendocument.spreadsheet ods -application/vnd.oasis.opendocument.spreadsheet-template ots -application/vnd.oasis.opendocument.text odt -application/vnd.oasis.opendocument.text-master odm -application/vnd.oasis.opendocument.text-template ott -application/vnd.oasis.opendocument.text-web oth -application/vnd.obn -application/vnd.ocf+cbor -application/vnd.oftn.l10n+json -application/vnd.oipf.contentaccessdownload+xml -application/vnd.oipf.contentaccessstreaming+xml -application/vnd.oipf.cspg-hexbinary -application/vnd.oipf.dae.svg+xml -application/vnd.oipf.dae.xhtml+xml -application/vnd.oipf.mippvcontrolmessage+xml -application/vnd.oipf.pae.gem -application/vnd.oipf.spdiscovery+xml -application/vnd.oipf.spdlist+xml -application/vnd.oipf.ueprofile+xml -application/vnd.olpc-sugar xo -application/vnd.oma.bcast.associated-procedure-parameter+xml -application/vnd.oma.bcast.drm-trigger+xml -application/vnd.oma.bcast.imd+xml -application/vnd.oma.bcast.ltkm -application/vnd.oma.bcast.notification+xml -application/vnd.oma.bcast.provisioningtrigger -application/vnd.oma.bcast.sgboot -application/vnd.oma.bcast.sgdd+xml -application/vnd.oma.bcast.sgdu -application/vnd.oma.bcast.simple-symbol-container -application/vnd.oma.bcast.smartcard-trigger+xml -application/vnd.oma.bcast.sprov+xml -application/vnd.oma.bcast.stkm -application/vnd.oma.cab-address-book+xml -application/vnd.oma.cab-feature-handler+xml -application/vnd.oma.cab-pcc+xml -application/vnd.oma.cab-subs-invite+xml -application/vnd.oma.cab-user-prefs+xml -application/vnd.oma.dcd -application/vnd.oma.dcdc -application/vnd.oma.dd2+xml dd2 -application/vnd.oma.drm.risd+xml -application/vnd.oma.group-usage-list+xml -application/vnd.oma.lwm2m+json -application/vnd.oma.lwm2m+tlv -application/vnd.oma.pal+xml -application/vnd.oma.poc.detailed-progress-report+xml -application/vnd.oma.poc.final-report+xml -application/vnd.oma.poc.groups+xml -application/vnd.oma.poc.invocation-descriptor+xml -application/vnd.oma.poc.optimized-progress-report+xml -application/vnd.oma.push -application/vnd.oma.scidm.messages+xml -application/vnd.oma.xcap-directory+xml -application/vnd.oma-scws-config -application/vnd.oma-scws-http-request -application/vnd.oma-scws-http-response -application/vnd.omads-email+xml -application/vnd.omads-file+xml -application/vnd.omads-folder+xml -application/vnd.omaloc-supl-init -application/vnd.onepager tam -application/vnd.onepagertamp tamp -application/vnd.onepagertamx tamx -application/vnd.onepagertat tat -application/vnd.onepagertatp tatp -application/vnd.onepagertatx tatx -application/vnd.openblox.game+xml obgx -application/vnd.openblox.game-binary obg -application/vnd.openeye.oeb oeb -application/vnd.openofficeorg.extension oxt -application/vnd.openstreetmap.data+xml osm -application/vnd.openxmlformats-officedocument.custom-properties+xml -application/vnd.openxmlformats-officedocument.customXmlProperties+xml -application/vnd.openxmlformats-officedocument.drawing+xml -application/vnd.openxmlformats-officedocument.drawingml.chart+xml -application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml -application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml -application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml -application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml -application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml -application/vnd.openxmlformats-officedocument.extended-properties+xml -application/vnd.openxmlformats-officedocument.presentationml.commentAuthors+xml -application/vnd.openxmlformats-officedocument.presentationml.comments+xml -application/vnd.openxmlformats-officedocument.presentationml.handoutMaster+xml -application/vnd.openxmlformats-officedocument.presentationml.notesMaster+xml -application/vnd.openxmlformats-officedocument.presentationml.notesSlide+xml -application/vnd.openxmlformats-officedocument.presentationml.presProps+xml -application/vnd.openxmlformats-officedocument.presentationml.presentation pptx -application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml -application/vnd.openxmlformats-officedocument.presentationml.slide sldx -application/vnd.openxmlformats-officedocument.presentationml.slide+xml -application/vnd.openxmlformats-officedocument.presentationml.slideLayout+xml -application/vnd.openxmlformats-officedocument.presentationml.slideMaster+xml -application/vnd.openxmlformats-officedocument.presentationml.slideUpdateInfo+xml -application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx -application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml -application/vnd.openxmlformats-officedocument.presentationml.tableStyles+xml -application/vnd.openxmlformats-officedocument.presentationml.tags+xml -application/vnd.openxmlformats-officedocument.presentationml.template potx -application/vnd.openxmlformats-officedocument.presentationml.template.main+xml -application/vnd.openxmlformats-officedocument.presentationml.viewProps+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx -application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx -application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml -application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml -application/vnd.openxmlformats-officedocument.theme+xml -application/vnd.openxmlformats-officedocument.themeOverride+xml -application/vnd.openxmlformats-officedocument.vmlDrawing -application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document docx -application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx -application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml -application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml -application/vnd.openxmlformats-package.core-properties+xml -application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml -application/vnd.openxmlformats-package.relationships+xml -application/vnd.oracle.resource+json -application/vnd.orange.indata -application/vnd.osa.netdeploy ndc -application/vnd.osgeo.mapguide.package mgp -# jar: application/x-java-archive -application/vnd.osgi.bundle -application/vnd.osgi.dp dp -application/vnd.osgi.subsystem esa -application/vnd.otps.ct-kip+xml -application/vnd.oxli.countgraph oxlicg -application/vnd.pagerduty+json -application/vnd.palm prc pdb pqa oprc -application/vnd.panoply plp -application/vnd.paos+xml -application/vnd.pawaafile paw -application/vnd.pcos -application/vnd.pg.format str -application/vnd.pg.osasli ei6 -application/vnd.piaccess.application-license pil -application/vnd.picsel efif -application/vnd.pmi.widget wg -application/vnd.poc.group-advertisement+xml -application/vnd.pocketlearn plf -application/vnd.powerbuilder6 pbd -application/vnd.powerbuilder6-s -application/vnd.powerbuilder7 -application/vnd.powerbuilder7-s -application/vnd.powerbuilder75 -application/vnd.powerbuilder75-s -application/vnd.preminet preminet -application/vnd.previewsystems.box box vbox -application/vnd.proteus.magazine mgz -application/vnd.publishare-delta-tree qps -# pti: image/prs.pti -application/vnd.pvi.ptid1 ptid -application/vnd.pwg-multiplexed -application/vnd.pwg-xhtml-print+xml -application/vnd.qualcomm.brew-app-res bar -application/vnd.quarantainenet -application/vnd.Quark.QuarkXPress qxd qxt qwd qwt qxl qxb -application/vnd.quobject-quoxdocument quox quiz -application/vnd.radisys.moml+xml -application/vnd.radisys.msml-audit-conf+xml -application/vnd.radisys.msml-audit-conn+xml -application/vnd.radisys.msml-audit-dialog+xml -application/vnd.radisys.msml-audit-stream+xml -application/vnd.radisys.msml-audit+xml -application/vnd.radisys.msml-conf+xml -application/vnd.radisys.msml-dialog-base+xml -application/vnd.radisys.msml-dialog-fax-detect+xml -application/vnd.radisys.msml-dialog-fax-sendrecv+xml -application/vnd.radisys.msml-dialog-group+xml -application/vnd.radisys.msml-dialog-speech+xml -application/vnd.radisys.msml-dialog-transform+xml -application/vnd.radisys.msml-dialog+xml -application/vnd.radisys.msml+xml -application/vnd.rainstor.data tree -application/vnd.rapid -application/vnd.rar rar -application/vnd.realvnc.bed bed -application/vnd.recordare.musicxml mxl -application/vnd.recordare.musicxml+xml -application/vnd.RenLearn.rlprint -application/vnd.rig.cryptonote cryptonote -application/vnd.route66.link66+xml link66 -# gbr: application/rpki-ghostbusters -application/vnd.rs-274x -application/vnd.ruckus.download -application/vnd.s3sms -application/vnd.sailingtracker.track st -application/vnd.sbm.cid -application/vnd.sbm.mid2 -application/vnd.scribus scd sla slaz -application/vnd.sealed.3df s3df -application/vnd.sealed.csf scsf -application/vnd.sealed.doc sdoc sdo s1w -application/vnd.sealed.eml seml sem -application/vnd.sealed.mht smht smh -application/vnd.sealed.net -# spp: application/scvp-vp-response -application/vnd.sealed.ppt sppt s1p -application/vnd.sealed.tiff stif -application/vnd.sealed.xls sxls sxl s1e -# stm: audio/x-stm -application/vnd.sealedmedia.softseal.html stml s1h -application/vnd.sealedmedia.softseal.pdf spdf spd s1a -application/vnd.seemail see -application/vnd.sema sema -application/vnd.semd semd -application/vnd.semf semf -application/vnd.shana.informed.formdata ifm -application/vnd.shana.informed.formtemplate itp -application/vnd.shana.informed.interchange iif -application/vnd.shana.informed.package ipk -application/vnd.SimTech-MindMapper twd twds -application/vnd.siren+json -application/vnd.smaf mmf -application/vnd.smart.notebook notebook -application/vnd.smart.teacher teacher -application/vnd.software602.filler.form+xml fo -application/vnd.software602.filler.form-xml-zip zfo -application/vnd.solent.sdkm+xml sdkm sdkd -application/vnd.spotfire.dxp dxp -application/vnd.spotfire.sfs sfs -application/vnd.sss-cod -application/vnd.sss-dtf -application/vnd.sss-ntf -application/vnd.stepmania.package smzip -application/vnd.stepmania.stepchart sm -application/vnd.street-stream -application/vnd.sun.wadl+xml wadl -application/vnd.sus-calendar sus susp -application/vnd.svd -application/vnd.swiftview-ics -application/vnd.syncml+xml xsm -application/vnd.syncml.dm+wbxml bdm -application/vnd.syncml.dm+xml xdm -application/vnd.syncml.dm.notification -application/vnd.syncml.dmddf+wbxml -application/vnd.syncml.dmddf+xml ddf -application/vnd.syncml.dmtnds+wbxml -application/vnd.syncml.dmtnds+xml -application/vnd.syncml.ds.notification -application/vnd.tableschema+json -application/vnd.tao.intent-module-archive tao -application/vnd.tcpdump.pcap pcap cap dmp -application/vnd.theqvd qvd -application/vnd.tmd.mediaflex.api+xml -application/vnd.tml vfr viaframe -application/vnd.tmobile-livetv tmo -application/vnd.tri.onesource -application/vnd.trid.tpt tpt -application/vnd.triscape.mxs mxs -application/vnd.trueapp tra -application/vnd.truedoc -# cab: application/vnd.ms-cab-compressed -application/vnd.ubisoft.webplayer -application/vnd.ufdl ufdl ufd frm -application/vnd.uiq.theme utz -application/vnd.umajin umj -application/vnd.unity unityweb -application/vnd.uoml+xml uoml uo -application/vnd.uplanet.alert -application/vnd.uplanet.alert-wbxml -application/vnd.uplanet.bearer-choice -application/vnd.uplanet.bearer-choice-wbxml -application/vnd.uplanet.cacheop -application/vnd.uplanet.cacheop-wbxml -application/vnd.uplanet.channel -application/vnd.uplanet.channel-wbxml -application/vnd.uplanet.list -application/vnd.uplanet.list-wbxml -application/vnd.uplanet.listcmd -application/vnd.uplanet.listcmd-wbxml -application/vnd.uplanet.signal -application/vnd.uri-map urim urimap -application/vnd.valve.source.material vmt -application/vnd.vcx vcx -# sxi: application/vnd.sun.xml.impress -application/vnd.vd-study mxi study-inter model-inter -# mcd: application/vnd.mcd -application/vnd.vectorworks vwx -application/vnd.vel+json -application/vnd.verimatrix.vcas -application/vnd.vidsoft.vidconference vsc -application/vnd.visio vsd vst vsw vss -application/vnd.visionary vis -# vsc: application/vnd.vidsoft.vidconference -application/vnd.vividence.scriptfile -application/vnd.vsf vsf -application/vnd.wap.sic sic -application/vnd.wap.slc slc -application/vnd.wap.wbxml wbxml -application/vnd.wap.wmlc wmlc -application/vnd.wap.wmlscriptc wmlsc -application/vnd.webturbo wtb -application/vnd.wfa.p2p p2p -application/vnd.wfa.wsc wsc -application/vnd.windows.devicepairing -application/vnd.wmc wmc -application/vnd.wmf.bootstrap -# nb: application/mathematica for now -application/vnd.wolfram.mathematica -application/vnd.wolfram.mathematica.package m -application/vnd.wolfram.player nbp -application/vnd.wordperfect wpd -application/vnd.wqd wqd -application/vnd.wrq-hp3000-labelled -application/vnd.wt.stf stf -application/vnd.wv.csp+xml -application/vnd.wv.csp+wbxml wv -application/vnd.wv.ssp+xml -application/vnd.xacml+json -application/vnd.xara xar -application/vnd.xfdl xfdl xfd -application/vnd.xfdl.webform -application/vnd.xmi+xml -application/vnd.xmpie.cpkg cpkg -application/vnd.xmpie.dpkg dpkg -# dpkg: application/vnd.xmpie.dpkg -application/vnd.xmpie.plan -application/vnd.xmpie.ppkg ppkg -application/vnd.xmpie.xlim xlim -application/vnd.yamaha.hv-dic hvd -application/vnd.yamaha.hv-script hvs -application/vnd.yamaha.hv-voice hvp -application/vnd.yamaha.openscoreformat osf -application/vnd.yamaha.openscoreformat.osfpvg+xml -application/vnd.yamaha.remote-setup -application/vnd.yamaha.smaf-audio saf -application/vnd.yamaha.smaf-phrase spf -application/vnd.yamaha.through-ngn -application/vnd.yamaha.tunnel-udpencap -application/vnd.yaoweme yme -application/vnd.yellowriver-custom-menu cmp -application/vnd.zul zir zirz -application/vnd.zzazz.deck+xml zaz -application/voicexml+xml vxml -application/vq-rtcp-xr -application/watcherinfo+xml wif -application/whoispp-query -application/whoispp-response -application/widget wgt -application/wita -application/wordperfect5.1 -application/wsdl+xml wsdl -application/wspolicy+xml wspolicy -# yes, this *is* IANA registered despite of x- -application/x-www-form-urlencoded -application/x400-bp -application/xacml+xml -application/xcap-att+xml xav -application/xcap-caps+xml xca -application/xcap-diff+xml xdf -application/xcap-el+xml xel -application/xcap-error+xml xer -application/xcap-ns+xml xns -application/xcon-conference-info-diff+xml -application/xcon-conference-info+xml -application/xenc+xml -application/xhtml+xml xhtml xhtm xht -# xml, xsd, rng: text/xml -application/xml -# mod: audio/x-mod -application/xml-dtd dtd -# ent: text/xml-external-parsed-entity -application/xml-external-parsed-entity -application/xml-patch+xml -application/xmpp+xml -application/xop+xml xop -application/xslt+xml xsl xslt -application/xv+xml mxml xhvml xvml xvm -application/yang yang -application/yang-data+json -application/yang-data+xml -application/yang-patch+json -application/yang-patch+xml -application/yin+xml yin -application/zip zip -application/zlib -audio/1d-interleaved-parityfec -audio/32kadpcm 726 -# 3gp, 3gpp: video/3gpp -audio/3gpp -# 3g2, 3gpp2: video/3gpp2 -audio/3gpp2 -audio/ac3 ac3 -audio/AMR amr -audio/AMR-WB awb -audio/amr-wb+ -audio/aptx -audio/asc acn -# aa3, omg: audio/ATRAC3 -audio/ATRAC-ADVANCED-LOSSLESS aal -# aa3, omg: audio/ATRAC3 -audio/ATRAC-X atx -audio/ATRAC3 at3 aa3 omg -audio/basic au snd -audio/BV16 -audio/BV32 -audio/clearmode -audio/CN -audio/DAT12 -audio/dls dls -audio/dsr-es201108 -audio/dsr-es202050 -audio/dsr-es202211 -audio/dsr-es202212 -audio/DV -audio/DVI4 -audio/eac3 -audio/encaprtp -audio/EVRC evc -# qcp: audio/qcelp -audio/EVRC-QCP -audio/EVRC0 -audio/EVRC1 -audio/EVRCB evb -audio/EVRCB0 -audio/EVRCB1 -audio/EVRCNW enw -audio/EVRCNW0 -audio/EVRCNW1 -audio/EVRCWB evw -audio/EVRCWB0 -audio/EVRCWB1 -audio/EVS -audio/example -audio/fwdred -audio/G711-0 -audio/G719 -audio/G722 -audio/G7221 -audio/G723 -audio/G726-16 -audio/G726-24 -audio/G726-32 -audio/G726-40 -audio/G728 -audio/G729 -audio/G7291 -audio/G729D -audio/G729E -audio/GSM -audio/GSM-EFR -audio/GSM-HR-08 -audio/iLBC lbc -audio/ip-mr_v2.5 -# wav: audio/x-wav -audio/L16 l16 -audio/L20 -audio/L24 -audio/L8 -audio/LPC -audio/MELP -audio/MELP600 -audio/MELP1200 -audio/MELP2400 -audio/mobile-xmf mxmf -# mp4, mpg4: video/mp4, see RFC 4337 -audio/mp4 m4a -audio/MP4A-LATM -audio/MPA -audio/mpa-robust -audio/mpeg mp3 mpga mp1 mp2 -audio/mpeg4-generic -audio/ogg oga ogg opus spx -audio/opus -audio/parityfec -audio/PCMA -audio/PCMA-WB -audio/PCMU -audio/PCMU-WB -audio/prs.sid sid psid -audio/qcelp qcp -audio/raptorfec -audio/RED -audio/rtp-enc-aescm128 -audio/rtp-midi -audio/rtploopback -audio/rtx -audio/SMV smv -# qcp: audio/qcelp, see RFC 3625 -audio/SMV-QCP -audio/SMV0 -# mid: audio/midi -audio/sp-midi -audio/speex -audio/t140c -audio/t38 -audio/telephone-event -audio/tone -audio/UEMCLIP -audio/ulpfec -audio/VDVI -audio/VMR-WB -audio/vnd.3gpp.iufp -audio/vnd.4SB -audio/vnd.audikoz koz -audio/vnd.CELP -audio/vnd.cisco.nse -audio/vnd.cmles.radio-events -audio/vnd.cns.anp1 -audio/vnd.cns.inf1 -audio/vnd.dece.audio uva uvva -audio/vnd.digital-winds eol -audio/vnd.dlna.adts -audio/vnd.dolby.heaac.1 -audio/vnd.dolby.heaac.2 -audio/vnd.dolby.mlp mlp -audio/vnd.dolby.mps -audio/vnd.dolby.pl2 -audio/vnd.dolby.pl2x -audio/vnd.dolby.pl2z -audio/vnd.dolby.pulse.1 -audio/vnd.dra -# wav: audio/x-wav, cpt: application/mac-compactpro -audio/vnd.dts dts -audio/vnd.dts.hd dtshd -# dvb: video/vnd.dvb.file -audio/vnd.dvb.file -audio/vnd.everad.plj plj -# rm: audio/x-pn-realaudio -audio/vnd.hns.audio -audio/vnd.lucent.voice lvp -audio/vnd.ms-playready.media.pya pya -# mxmf: audio/mobile-xmf -audio/vnd.nokia.mobile-xmf -audio/vnd.nortel.vbk vbk -audio/vnd.nuera.ecelp4800 ecelp4800 -audio/vnd.nuera.ecelp7470 ecelp7470 -audio/vnd.nuera.ecelp9600 ecelp9600 -audio/vnd.octel.sbc -# audio/vnd.qcelp deprecated in favour of audio/qcelp -audio/vnd.rhetorex.32kadpcm -audio/vnd.rip rip -audio/vnd.sealedmedia.softseal.mpeg smp3 smp s1m -audio/vnd.vmx.cvsd -audio/vorbis -audio/vorbis-config -font/collection ttc -font/otf otf -font/sfnt -font/ttf ttf -font/woff woff -font/woff2 woff2 -image/bmp bmp dib -image/cgm cgm -image/dicom-rle drle -image/emf emf -image/example -image/fits fits fit fts -image/g3fax -image/gif gif -image/ief ief -image/jls jls -image/jp2 jp2 jpg2 -image/jpeg jpg jpeg jpe jfif -image/jpm jpm jpgm -image/jpx jpx jpf -image/ktx ktx -image/naplps -image/png png -image/prs.btif btif btf -image/prs.pti pti -image/pwg-raster -image/svg+xml svg svgz -image/t38 t38 -image/tiff tiff tif -image/tiff-fx tfx -image/vnd.adobe.photoshop psd -image/vnd.airzip.accelerator.azv azv -image/vnd.cns.inf2 -image/vnd.dece.graphic uvi uvvi uvg uvvg -image/vnd.djvu djvu djv -# sub: text/vnd.dvb.subtitle -image/vnd.dvb.subtitle -image/vnd.dwg dwg -image/vnd.dxf dxf -image/vnd.fastbidsheet fbs -image/vnd.fpx fpx -image/vnd.fst fst -image/vnd.fujixerox.edmics-mmr mmr -image/vnd.fujixerox.edmics-rlc rlc -image/vnd.globalgraphics.pgb pgb -image/vnd.microsoft.icon ico -image/vnd.mix -image/vnd.mozilla.apng apng -image/vnd.ms-modi mdi -image/vnd.net-fpx -image/vnd.radiance hdr rgbe xyze -image/vnd.sealed.png spng spn s1n -image/vnd.sealedmedia.softseal.gif sgif sgi s1g -image/vnd.sealedmedia.softseal.jpg sjpg sjp s1j -image/vnd.svf -image/vnd.tencent.tap tap -image/vnd.valve.source.texture vtf -image/vnd.wap.wbmp wbmp -image/vnd.xiff xif -image/vnd.zbrush.pcx pcx -image/wmf wmf -message/CPIM -message/delivery-status -message/disposition-notification -message/example -message/external-body -message/feedback-report -message/global u8msg -message/global-delivery-status u8dsn -message/global-disposition-notification u8mdn -message/global-headers u8hdr -message/http -# cl: application/simple-filter+xml -message/imdn+xml -# message/news obsoleted by message/rfc822 -message/partial -message/rfc822 eml mail art -message/s-http -message/sip -message/sipfrag -message/tracking-status -message/vnd.si.simp -# wsc: application/vnd.wfa.wsc -message/vnd.wfa.wsc -model/example -model/gltf+json gltf -model/iges igs iges -model/mesh msh mesh silo -model/vnd.collada+xml dae -model/vnd.dwf dwf -# 3dml, 3dm: text/vnd.in3d.3dml -model/vnd.flatland.3dml -model/vnd.gdl gdl gsm win dor lmp rsm msm ism -model/vnd.gs-gdl -model/vnd.gtw gtw -model/vnd.moml+xml moml -model/vnd.mts mts -model/vnd.opengex ogex -model/vnd.parasolid.transmit.binary x_b xmt_bin -model/vnd.parasolid.transmit.text x_t xmt_txt -model/vnd.rosette.annotated-data-model -model/vnd.valve.source.compiled-map bsp -model/vnd.vtu vtu -model/vrml wrl vrml -# x3db: model/x3d+xml -model/x3d+fastinfoset -# x3d: application/vnd.hzn-3d-crossword -model/x3d+xml x3db -model/x3d-vrml x3dv x3dvz -multipart/alternative -multipart/appledouble -multipart/byteranges -multipart/digest -multipart/encrypted -multipart/form-data -multipart/header-set -multipart/mixed -multipart/parallel -multipart/related -multipart/report -multipart/signed -multipart/vnd.bint.med-plus bmed -multipart/voice-message vpm -multipart/x-mixed-replace -text/1d-interleaved-parityfec -text/cache-manifest appcache manifest -text/calendar ics ifb -text/css css -text/csv csv -text/csv-schema csvs -text/directory -text/dns soa zone -text/encaprtp -# text/ecmascript obsoleted by application/ecmascript -text/enriched -text/example -text/fwdred -text/grammar-ref-list -text/html html htm -# text/javascript obsoleted by application/javascript -text/jcr-cnd cnd -text/markdown markdown md -text/mizar miz -text/n3 n3 -text/parameters -text/parityfec -text/plain txt asc text pm el c h cc hh cxx hxx f90 conf log -text/provenance-notation provn -text/prs.fallenstein.rst rst -text/prs.lines.tag tag dsc -text/prs.prop.logic -text/raptorfec -text/RED -text/rfc822-headers -text/richtext rtx -# rtf: application/rtf -text/rtf -text/rtp-enc-aescm128 -text/rtploopback -text/rtx -text/sgml sgml sgm -text/strings -text/t140 -text/tab-separated-values tsv -text/troff t tr roff -text/turtle ttl -text/ulpfec -text/uri-list uris uri -text/vcard vcf vcard -text/vnd.a a -text/vnd.abc abc -text/vnd.ascii-art ascii -# curl: application/vnd.curl -text/vnd.curl -text/vnd.debian.copyright copyright -text/vnd.DMClientScript dms -text/vnd.dvb.subtitle sub -text/vnd.esmertec.theme-descriptor jtd -text/vnd.fly fly -text/vnd.fmi.flexstor flx -text/vnd.graphviz gv dot -text/vnd.in3d.3dml 3dml 3dm -text/vnd.in3d.spot spot spo -text/vnd.IPTC.NewsML -text/vnd.IPTC.NITF -text/vnd.latex-z -text/vnd.motorola.reflex -text/vnd.ms-mediapackage mpf -text/vnd.net2phone.commcenter.command ccc -text/vnd.radisys.msml-basic-layout -text/vnd.si.uricatalogue uric -text/vnd.sun.j2me.app-descriptor jad -text/vnd.trolltech.linguist ts -text/vnd.wap.si si -text/vnd.wap.sl sl -text/vnd.wap.wml wml -text/vnd.wap.wmlscript wmls -text/xml xml xsd rng -text/xml-external-parsed-entity ent -video/1d-interleaved-parityfec -video/3gpp 3gp 3gpp -video/3gpp2 3g2 3gpp2 -video/3gpp-tt -video/BMPEG -video/BT656 -video/CelB -video/DV -video/encaprtp -video/example -video/H261 -video/H263 -video/H263-1998 -video/H263-2000 -video/H264 -video/H264-RCDO -video/H264-SVC -video/H265 -video/iso.segment m4s -video/JPEG -video/jpeg2000 -video/mj2 mj2 mjp2 -video/MP1S -video/MP2P -video/MP2T -video/mp4 mp4 mpg4 m4v -video/MP4V-ES -video/mpeg mpeg mpg mpe m1v m2v -video/mpeg4-generic -video/MPV -video/nv -video/ogg ogv -video/parityfec -video/pointer -video/quicktime mov qt -video/raptorfec -video/raw -video/rtp-enc-aescm128 -video/rtploopback -video/rtx -video/SMPTE292M -video/ulpfec -video/vc1 -video/vnd.CCTV -video/vnd.dece.hd uvh uvvh -video/vnd.dece.mobile uvm uvvm -video/vnd.dece.mp4 uvu uvvu -video/vnd.dece.pd uvp uvvp -video/vnd.dece.sd uvs uvvs -video/vnd.dece.video uvv uvvv -video/vnd.directv.mpeg -video/vnd.directv.mpeg-tts -video/vnd.dlna.mpeg-tts -video/vnd.dvb.file dvb -video/vnd.fvt fvt -# rm: audio/x-pn-realaudio -video/vnd.hns.video -video/vnd.iptvforum.1dparityfec-1010 -video/vnd.iptvforum.1dparityfec-2005 -video/vnd.iptvforum.2dparityfec-1010 -video/vnd.iptvforum.2dparityfec-2005 -video/vnd.iptvforum.ttsavc -video/vnd.iptvforum.ttsmpeg2 -video/vnd.motorola.video -video/vnd.motorola.videop -video/vnd.mpegurl mxu m4u -video/vnd.ms-playready.media.pyv pyv -video/vnd.nokia.interleaved-multimedia nim -video/vnd.nokia.videovoip -# mp4: video/mp4 -video/vnd.objectvideo -video/vnd.radgamettools.bink bik bk2 -video/vnd.radgamettools.smacker smk -video/vnd.sealed.mpeg1 smpg s11 -# smpg: video/vnd.sealed.mpeg1 -video/vnd.sealed.mpeg4 s14 -video/vnd.sealed.swf sswf ssw -video/vnd.sealedmedia.softseal.mov smov smo s1q -# uvu, uvvu: video/vnd.dece.mp4 -video/vnd.uvvu.mp4 -video/vnd.vivo viv -video/VP8 - -# Non-IANA types - -application/mac-compactpro cpt -application/metalink+xml metalink -application/owl+xml owx -application/rss+xml rss -application/vnd.android.package-archive apk -application/vnd.oma.dd+xml dd -application/vnd.oma.drm.content dcf -# odf: application/vnd.oasis.opendocument.formula -application/vnd.oma.drm.dcf o4a o4v -application/vnd.oma.drm.message dm -application/vnd.oma.drm.rights+wbxml drc -application/vnd.oma.drm.rights+xml dr -application/vnd.sun.xml.calc sxc -application/vnd.sun.xml.calc.template stc -application/vnd.sun.xml.draw sxd -application/vnd.sun.xml.draw.template std -application/vnd.sun.xml.impress sxi -application/vnd.sun.xml.impress.template sti -application/vnd.sun.xml.math sxm -application/vnd.sun.xml.writer sxw -application/vnd.sun.xml.writer.global sxg -application/vnd.sun.xml.writer.template stw -application/vnd.symbian.install sis -application/vnd.wap.mms-message mms -application/x-annodex anx -application/x-bcpio bcpio -application/x-bittorrent torrent -application/x-bzip2 bz2 -application/x-cdlink vcd -application/x-chrome-extension crx -application/x-cpio cpio -application/x-csh csh -application/x-director dcr dir dxr -application/x-dvi dvi -application/x-futuresplash spl -application/x-gtar gtar -application/x-hdf hdf -application/x-java-archive jar -application/x-java-jnlp-file jnlp -application/x-java-pack200 pack -application/x-killustrator kil -application/x-latex latex -application/x-netcdf nc cdf -application/x-perl pl -application/x-rpm rpm -application/x-sh sh -application/x-shar shar -application/x-stuffit sit -application/x-sv4cpio sv4cpio -application/x-sv4crc sv4crc -application/x-tar tar -application/x-tcl tcl -application/x-tex tex -application/x-texinfo texinfo texi -application/x-troff-man man 1 2 3 4 5 6 7 8 -application/x-troff-me me -application/x-troff-ms ms -application/x-ustar ustar -application/x-wais-source src -application/x-xpinstall xpi -application/x-xspf+xml xspf -application/x-xz xz -audio/midi mid midi kar -audio/x-aiff aif aiff aifc -audio/x-annodex axa -audio/x-flac flac -audio/x-matroska mka -audio/x-mod mod ult uni m15 mtm 669 med -audio/x-mpegurl m3u -audio/x-ms-wax wax -audio/x-ms-wma wma -audio/x-pn-realaudio ram rm -audio/x-realaudio ra -audio/x-s3m s3m -audio/x-stm stm -audio/x-wav wav -chemical/x-xyz xyz -image/webp webp -image/x-cmu-raster ras -image/x-portable-anymap pnm -image/x-portable-bitmap pbm -image/x-portable-graymap pgm -image/x-portable-pixmap ppm -image/x-rgb rgb -image/x-targa tga -image/x-xbitmap xbm -image/x-xpixmap xpm -image/x-xwindowdump xwd -text/html-sandboxed sandboxed -text/x-pod pod -text/x-setext etx -video/webm webm -video/x-annodex axv -video/x-flv flv -video/x-javafx fxm -video/x-matroska mkv -video/x-matroska-3d mk3d -video/x-ms-asf asx -video/x-ms-wm wm -video/x-ms-wmv wmv -video/x-ms-wmx wmx -video/x-ms-wvx wvx -video/x-msvideo avi -video/x-sgi-movie movie -x-conference/x-cooltalk ice -x-epoc/x-sisx-app sisx diff --git a/cmd/swarm/run_test.go b/cmd/swarm/run_test.go deleted file mode 100644 index 4303bbe1129d..000000000000 --- a/cmd/swarm/run_test.go +++ /dev/null @@ -1,482 +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 ( - "context" - "crypto/ecdsa" - "flag" - "fmt" - "io/ioutil" - "net" - "os" - "path" - "path/filepath" - "runtime" - "sync" - "syscall" - "testing" - "time" - - "github.com/docker/docker/pkg/reexec" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/internal/cmdtest" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/swarm" - "github.com/nebulaai/nbai-node/swarm/api" - swarmhttp "github.com/nebulaai/nbai-node/swarm/api/http" -) - -var loglevel = flag.Int("loglevel", 3, "verbosity of logs") - -func init() { - // Run the app if we've been exec'd as "swarm-test" in runSwarm. - reexec.Register("swarm-test", func() { - if err := app.Run(os.Args); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - os.Exit(0) - }) -} - -const clusterSize = 3 - -var clusteronce sync.Once -var cluster *testCluster - -func initCluster(t *testing.T) { - clusteronce.Do(func() { - cluster = newTestCluster(t, clusterSize) - }) -} - -func serverFunc(api *api.API) swarmhttp.TestServer { - return swarmhttp.NewServer(api, "") -} -func TestMain(m *testing.M) { - // check if we have been reexec'd - if reexec.Init() { - return - } - os.Exit(m.Run()) -} - -func runSwarm(t *testing.T, args ...string) *cmdtest.TestCmd { - tt := cmdtest.NewTestCmd(t, nil) - - // Boot "swarm". This actually runs the test binary but the TestMain - // function will prevent any tests from running. - tt.Run("swarm-test", args...) - - return tt -} - -type testCluster struct { - Nodes []*testNode - TmpDir string -} - -// newTestCluster starts a test swarm cluster of the given size. -// -// A temporary directory is created and each node gets a data directory inside -// it. -// -// Each node listens on 127.0.0.1 with random ports for both the HTTP and p2p -// ports (assigned by first listening on 127.0.0.1:0 and then passing the ports -// as flags). -// -// When starting more than one node, they are connected together using the -// admin SetPeer RPC method. - -func newTestCluster(t *testing.T, size int) *testCluster { - cluster := &testCluster{} - defer func() { - if t.Failed() { - cluster.Shutdown() - } - }() - - tmpdir, err := ioutil.TempDir("", "swarm-test") - if err != nil { - t.Fatal(err) - } - cluster.TmpDir = tmpdir - - // start the nodes - cluster.StartNewNodes(t, size) - - if size == 1 { - return cluster - } - - // connect the nodes together - for _, node := range cluster.Nodes { - if err := node.Client.Call(nil, "admin_addPeer", cluster.Nodes[0].Enode); err != nil { - t.Fatal(err) - } - } - - // wait until all nodes have the correct number of peers -outer: - for _, node := range cluster.Nodes { - var peers []*p2p.PeerInfo - for start := time.Now(); time.Since(start) < time.Minute; time.Sleep(50 * time.Millisecond) { - if err := node.Client.Call(&peers, "admin_peers"); err != nil { - t.Fatal(err) - } - if len(peers) == len(cluster.Nodes)-1 { - continue outer - } - } - t.Fatalf("%s only has %d / %d peers", node.Name, len(peers), len(cluster.Nodes)-1) - } - - return cluster -} - -func (c *testCluster) Shutdown() { - for _, node := range c.Nodes { - node.Shutdown() - } - os.RemoveAll(c.TmpDir) -} - -func (c *testCluster) Stop() { - for _, node := range c.Nodes { - node.Shutdown() - } -} - -func (c *testCluster) StartNewNodes(t *testing.T, size int) { - c.Nodes = make([]*testNode, 0, size) - for i := 0; i < size; i++ { - dir := filepath.Join(c.TmpDir, fmt.Sprintf("swarm%02d", i)) - if err := os.Mkdir(dir, 0700); err != nil { - t.Fatal(err) - } - - node := newTestNode(t, dir) - node.Name = fmt.Sprintf("swarm%02d", i) - - c.Nodes = append(c.Nodes, node) - } -} - -func (c *testCluster) StartExistingNodes(t *testing.T, size int, bzzaccount string) { - c.Nodes = make([]*testNode, 0, size) - for i := 0; i < size; i++ { - dir := filepath.Join(c.TmpDir, fmt.Sprintf("swarm%02d", i)) - node := existingTestNode(t, dir, bzzaccount) - node.Name = fmt.Sprintf("swarm%02d", i) - - c.Nodes = append(c.Nodes, node) - } -} - -func (c *testCluster) Cleanup() { - os.RemoveAll(c.TmpDir) -} - -type testNode struct { - Name string - Addr string - URL string - Enode string - Dir string - IpcPath string - PrivateKey *ecdsa.PrivateKey - Client *rpc.Client - Cmd *cmdtest.TestCmd -} - -const testPassphrase = "swarm-test-passphrase" - -func getTestAccount(t *testing.T, dir string) (conf *node.Config, account accounts.Account) { - // create key - conf = &node.Config{ - DataDir: dir, - IPCPath: "bzzd.ipc", - NoUSB: true, - } - n, err := node.New(conf) - if err != nil { - t.Fatal(err) - } - account, err = n.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore).NewAccount(testPassphrase) - if err != nil { - t.Fatal(err) - } - - // use a unique IPCPath when running tests on Windows - if runtime.GOOS == "windows" { - conf.IPCPath = fmt.Sprintf("bzzd-%s.ipc", account.Address.String()) - } - - return conf, account -} - -func existingTestNode(t *testing.T, dir string, bzzaccount string) *testNode { - conf, _ := getTestAccount(t, dir) - node := &testNode{Dir: dir} - - // use a unique IPCPath when running tests on Windows - if runtime.GOOS == "windows" { - conf.IPCPath = fmt.Sprintf("bzzd-%s.ipc", bzzaccount) - } - - // assign ports - ports, err := getAvailableTCPPorts(2) - if err != nil { - t.Fatal(err) - } - p2pPort := ports[0] - httpPort := ports[1] - - // start the node - node.Cmd = runSwarm(t, - "--port", p2pPort, - "--nat", "extip:127.0.0.1", - "--nodiscover", - "--datadir", dir, - "--ipcpath", conf.IPCPath, - "--ens-api", "", - "--bzzaccount", bzzaccount, - "--bzznetworkid", "321", - "--bzzport", httpPort, - "--verbosity", fmt.Sprint(*loglevel), - ) - node.Cmd.InputLine(testPassphrase) - defer func() { - if t.Failed() { - node.Shutdown() - } - }() - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - // ensure that all ports have active listeners - // so that the next node will not get the same - // when calling getAvailableTCPPorts - err = waitTCPPorts(ctx, ports...) - if err != nil { - t.Fatal(err) - } - - // wait for the node to start - for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { - node.Client, err = rpc.Dial(conf.IPCEndpoint()) - if err == nil { - break - } - } - if node.Client == nil { - t.Fatal(err) - } - - // load info - var info swarm.Info - if err := node.Client.Call(&info, "bzz_info"); err != nil { - t.Fatal(err) - } - node.Addr = net.JoinHostPort("127.0.0.1", info.Port) - node.URL = "http://" + node.Addr - - var nodeInfo p2p.NodeInfo - if err := node.Client.Call(&nodeInfo, "admin_nodeInfo"); err != nil { - t.Fatal(err) - } - node.Enode = nodeInfo.Enode - node.IpcPath = conf.IPCPath - return node -} - -func newTestNode(t *testing.T, dir string) *testNode { - - conf, account := getTestAccount(t, dir) - ks := keystore.NewKeyStore(path.Join(dir, "keystore"), 1<<18, 1) - - pk := decryptStoreAccount(ks, account.Address.Hex(), []string{testPassphrase}) - - node := &testNode{Dir: dir, PrivateKey: pk} - - // assign ports - ports, err := getAvailableTCPPorts(2) - if err != nil { - t.Fatal(err) - } - p2pPort := ports[0] - httpPort := ports[1] - - // start the node - node.Cmd = runSwarm(t, - "--port", p2pPort, - "--nat", "extip:127.0.0.1", - "--nodiscover", - "--datadir", dir, - "--ipcpath", conf.IPCPath, - "--ens-api", "", - "--bzzaccount", account.Address.String(), - "--bzznetworkid", "321", - "--bzzport", httpPort, - "--verbosity", fmt.Sprint(*loglevel), - ) - node.Cmd.InputLine(testPassphrase) - defer func() { - if t.Failed() { - node.Shutdown() - } - }() - - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - - // ensure that all ports have active listeners - // so that the next node will not get the same - // when calling getAvailableTCPPorts - err = waitTCPPorts(ctx, ports...) - if err != nil { - t.Fatal(err) - } - - // wait for the node to start - for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { - node.Client, err = rpc.Dial(conf.IPCEndpoint()) - if err == nil { - break - } - } - if node.Client == nil { - t.Fatal(err) - } - - // load info - var info swarm.Info - if err := node.Client.Call(&info, "bzz_info"); err != nil { - t.Fatal(err) - } - node.Addr = net.JoinHostPort("127.0.0.1", info.Port) - node.URL = "http://" + node.Addr - - var nodeInfo p2p.NodeInfo - if err := node.Client.Call(&nodeInfo, "admin_nodeInfo"); err != nil { - t.Fatal(err) - } - node.Enode = nodeInfo.Enode - node.IpcPath = conf.IPCPath - return node -} - -func (n *testNode) Shutdown() { - if n.Cmd != nil { - n.Cmd.Kill() - } -} - -// getAvailableTCPPorts returns a set of ports that -// nothing is listening on at the time. -// -// Function assignTCPPort cannot be called in sequence -// and guardantee that the same port will be returned in -// different calls as the listener is closed within the function, -// not after all listeners are started and selected unique -// available ports. -func getAvailableTCPPorts(count int) (ports []string, err error) { - for i := 0; i < count; i++ { - l, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - return nil, err - } - // defer close in the loop to be sure the same port will not - // be selected in the next iteration - defer l.Close() - - _, port, err := net.SplitHostPort(l.Addr().String()) - if err != nil { - return nil, err - } - ports = append(ports, port) - } - return ports, nil -} - -// waitTCPPorts blocks until tcp connections can be -// established on all provided ports. It runs all -// ports dialers in parallel, and returns the first -// encountered error. -// See waitTCPPort also. -func waitTCPPorts(ctx context.Context, ports ...string) error { - var err error - // mu locks err variable that is assigned in - // other goroutines - var mu sync.Mutex - - // cancel is canceling all goroutines - // when the firs error is returned - // to prevent unnecessary waiting - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - var wg sync.WaitGroup - for _, port := range ports { - wg.Add(1) - go func(port string) { - defer wg.Done() - - e := waitTCPPort(ctx, port) - - mu.Lock() - defer mu.Unlock() - if e != nil && err == nil { - err = e - cancel() - } - }(port) - } - wg.Wait() - - return err -} - -// waitTCPPort blocks until tcp connection can be established -// ona provided port. It has a 3 minute timeout as maximum, -// to prevent long waiting, but it can be shortened with -// a provided context instance. Dialer has a 10 second timeout -// in every iteration, and connection refused error will be -// retried in 100 milliseconds periods. -func waitTCPPort(ctx context.Context, port string) error { - ctx, cancel := context.WithTimeout(ctx, 3*time.Minute) - defer cancel() - - for { - c, err := (&net.Dialer{Timeout: 10 * time.Second}).DialContext(ctx, "tcp", "127.0.0.1:"+port) - if err != nil { - if operr, ok := err.(*net.OpError); ok { - if syserr, ok := operr.Err.(*os.SyscallError); ok && syserr.Err == syscall.ECONNREFUSED { - time.Sleep(100 * time.Millisecond) - continue - } - } - return err - } - return c.Close() - } -} diff --git a/cmd/swarm/swarm-smoke/feed_upload_and_sync.go b/cmd/swarm/swarm-smoke/feed_upload_and_sync.go deleted file mode 100644 index a99a349a6cf9..000000000000 --- a/cmd/swarm/swarm-smoke/feed_upload_and_sync.go +++ /dev/null @@ -1,366 +0,0 @@ -package main - -import ( - "bytes" - "context" - "crypto/md5" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/http/httptrace" - "os" - "os/exec" - "strings" - "sync" - "time" - - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/swarm/api/client" - "github.com/nebulaai/nbai-node/swarm/spancontext" - "github.com/nebulaai/nbai-node/swarm/storage/feed" - "github.com/nebulaai/nbai-node/swarm/testutil" - colorable "github.com/mattn/go-colorable" - opentracing "github.com/opentracing/opentracing-go" - "github.com/pborman/uuid" - cli "gopkg.in/urfave/cli.v1" -) - -const ( - feedRandomDataLength = 8 -) - -func cliFeedUploadAndSync(c *cli.Context) error { - metrics.GetOrRegisterCounter("feed-and-sync", nil).Inc(1) - log.Root().SetHandler(log.CallerFileHandler(log.LvlFilterHandler(log.Lvl(verbosity), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true))))) - - errc := make(chan error) - go func() { - errc <- feedUploadAndSync(c) - }() - - select { - case err := <-errc: - if err != nil { - metrics.GetOrRegisterCounter("feed-and-sync.fail", nil).Inc(1) - } - return err - case <-time.After(time.Duration(timeout) * time.Second): - metrics.GetOrRegisterCounter("feed-and-sync.timeout", nil).Inc(1) - return fmt.Errorf("timeout after %v sec", timeout) - } -} - -// TODO: retrieve with manifest + extract repeating code -func feedUploadAndSync(c *cli.Context) error { - defer func(now time.Time) { log.Info("total time", "time", time.Since(now), "size (kb)", filesize) }(time.Now()) - - generateEndpoints(scheme, cluster, appName, from, to) - - log.Info("generating and uploading feeds to " + endpoints[0] + " and syncing") - - // create a random private key to sign updates with and derive the address - pkFile, err := ioutil.TempFile("", "swarm-feed-smoke-test") - if err != nil { - return err - } - defer pkFile.Close() - defer os.Remove(pkFile.Name()) - - privkeyHex := "0000000000000000000000000000000000000000000000000000000000001976" - privKey, err := crypto.HexToECDSA(privkeyHex) - if err != nil { - return err - } - user := crypto.PubkeyToAddress(privKey.PublicKey) - userHex := hexutil.Encode(user.Bytes()) - - // save the private key to a file - _, err = io.WriteString(pkFile, privkeyHex) - if err != nil { - return err - } - - // keep hex strings for topic and subtopic - var topicHex string - var subTopicHex string - - // and create combination hex topics for bzz-feed retrieval - // xor'ed with topic (zero-value topic if no topic) - var subTopicOnlyHex string - var mergedSubTopicHex string - - // generate random topic and subtopic and put a hex on them - topicBytes, err := generateRandomData(feed.TopicLength) - topicHex = hexutil.Encode(topicBytes) - subTopicBytes, err := generateRandomData(8) - subTopicHex = hexutil.Encode(subTopicBytes) - if err != nil { - return err - } - mergedSubTopic, err := feed.NewTopic(subTopicHex, topicBytes) - if err != nil { - return err - } - mergedSubTopicHex = hexutil.Encode(mergedSubTopic[:]) - subTopicOnlyBytes, err := feed.NewTopic(subTopicHex, nil) - if err != nil { - return err - } - subTopicOnlyHex = hexutil.Encode(subTopicOnlyBytes[:]) - - // create feed manifest, topic only - var out bytes.Buffer - cmd := exec.Command("swarm", "--bzzapi", endpoints[0], "feed", "create", "--topic", topicHex, "--user", userHex) - cmd.Stdout = &out - log.Debug("create feed manifest topic cmd", "cmd", cmd) - err = cmd.Run() - if err != nil { - return err - } - manifestWithTopic := strings.TrimRight(out.String(), string([]byte{0x0a})) - if len(manifestWithTopic) != 64 { - return fmt.Errorf("unknown feed create manifest hash format (topic): (%d) %s", len(out.String()), manifestWithTopic) - } - log.Debug("create topic feed", "manifest", manifestWithTopic) - out.Reset() - - // create feed manifest, subtopic only - cmd = exec.Command("swarm", "--bzzapi", endpoints[0], "feed", "create", "--name", subTopicHex, "--user", userHex) - cmd.Stdout = &out - log.Debug("create feed manifest subtopic cmd", "cmd", cmd) - err = cmd.Run() - if err != nil { - return err - } - manifestWithSubTopic := strings.TrimRight(out.String(), string([]byte{0x0a})) - if len(manifestWithSubTopic) != 64 { - return fmt.Errorf("unknown feed create manifest hash format (subtopic): (%d) %s", len(out.String()), manifestWithSubTopic) - } - log.Debug("create subtopic feed", "manifest", manifestWithTopic) - out.Reset() - - // create feed manifest, merged topic - cmd = exec.Command("swarm", "--bzzapi", endpoints[0], "feed", "create", "--topic", topicHex, "--name", subTopicHex, "--user", userHex) - cmd.Stdout = &out - log.Debug("create feed manifest mergetopic cmd", "cmd", cmd) - err = cmd.Run() - if err != nil { - log.Error(err.Error()) - return err - } - manifestWithMergedTopic := strings.TrimRight(out.String(), string([]byte{0x0a})) - if len(manifestWithMergedTopic) != 64 { - return fmt.Errorf("unknown feed create manifest hash format (mergedtopic): (%d) %s", len(out.String()), manifestWithMergedTopic) - } - log.Debug("create mergedtopic feed", "manifest", manifestWithMergedTopic) - out.Reset() - - // create test data - data, err := generateRandomData(feedRandomDataLength) - if err != nil { - return err - } - h := md5.New() - h.Write(data) - dataHash := h.Sum(nil) - dataHex := hexutil.Encode(data) - - // update with topic - cmd = exec.Command("swarm", "--bzzaccount", pkFile.Name(), "--bzzapi", endpoints[0], "feed", "update", "--topic", topicHex, dataHex) - cmd.Stdout = &out - log.Debug("update feed manifest topic cmd", "cmd", cmd) - err = cmd.Run() - if err != nil { - return err - } - log.Debug("feed update topic", "out", out) - out.Reset() - - // update with subtopic - cmd = exec.Command("swarm", "--bzzaccount", pkFile.Name(), "--bzzapi", endpoints[0], "feed", "update", "--name", subTopicHex, dataHex) - cmd.Stdout = &out - log.Debug("update feed manifest subtopic cmd", "cmd", cmd) - err = cmd.Run() - if err != nil { - return err - } - log.Debug("feed update subtopic", "out", out) - out.Reset() - - // update with merged topic - cmd = exec.Command("swarm", "--bzzaccount", pkFile.Name(), "--bzzapi", endpoints[0], "feed", "update", "--topic", topicHex, "--name", subTopicHex, dataHex) - cmd.Stdout = &out - log.Debug("update feed manifest merged topic cmd", "cmd", cmd) - err = cmd.Run() - if err != nil { - return err - } - log.Debug("feed update mergedtopic", "out", out) - out.Reset() - - time.Sleep(3 * time.Second) - - // retrieve the data - wg := sync.WaitGroup{} - for _, endpoint := range endpoints { - // raw retrieve, topic only - for _, hex := range []string{topicHex, subTopicOnlyHex, mergedSubTopicHex} { - wg.Add(1) - ruid := uuid.New()[:8] - go func(hex string, endpoint string, ruid string) { - for { - err := fetchFeed(hex, userHex, endpoint, dataHash, ruid) - if err != nil { - continue - } - - wg.Done() - return - } - }(hex, endpoint, ruid) - - } - } - wg.Wait() - log.Info("all endpoints synced random data successfully") - - // upload test file - seed := int(time.Now().UnixNano() / 1e6) - log.Info("feed uploading to "+endpoints[0]+" and syncing", "seed", seed) - - randomBytes := testutil.RandomBytes(seed, filesize*1000) - - hash, err := upload(&randomBytes, endpoints[0]) - if err != nil { - return err - } - hashBytes, err := hexutil.Decode("0x" + hash) - if err != nil { - return err - } - multihashHex := hexutil.Encode(hashBytes) - fileHash, err := digest(bytes.NewReader(randomBytes)) - if err != nil { - return err - } - - log.Info("uploaded successfully", "hash", hash, "digest", fmt.Sprintf("%x", fileHash)) - - // update file with topic - cmd = exec.Command("swarm", "--bzzaccount", pkFile.Name(), "--bzzapi", endpoints[0], "feed", "update", "--topic", topicHex, multihashHex) - cmd.Stdout = &out - err = cmd.Run() - if err != nil { - return err - } - log.Debug("feed update topic", "out", out) - out.Reset() - - // update file with subtopic - cmd = exec.Command("swarm", "--bzzaccount", pkFile.Name(), "--bzzapi", endpoints[0], "feed", "update", "--name", subTopicHex, multihashHex) - cmd.Stdout = &out - err = cmd.Run() - if err != nil { - return err - } - log.Debug("feed update subtopic", "out", out) - out.Reset() - - // update file with merged topic - cmd = exec.Command("swarm", "--bzzaccount", pkFile.Name(), "--bzzapi", endpoints[0], "feed", "update", "--topic", topicHex, "--name", subTopicHex, multihashHex) - cmd.Stdout = &out - err = cmd.Run() - if err != nil { - return err - } - log.Debug("feed update mergedtopic", "out", out) - out.Reset() - - time.Sleep(3 * time.Second) - - for _, endpoint := range endpoints { - - // manifest retrieve, topic only - for _, url := range []string{manifestWithTopic, manifestWithSubTopic, manifestWithMergedTopic} { - wg.Add(1) - ruid := uuid.New()[:8] - go func(url string, endpoint string, ruid string) { - for { - err := fetch(url, endpoint, fileHash, ruid) - if err != nil { - continue - } - - wg.Done() - return - } - }(url, endpoint, ruid) - } - - } - wg.Wait() - log.Info("all endpoints synced random file successfully") - - return nil -} - -func fetchFeed(topic string, user string, endpoint string, original []byte, ruid string) error { - ctx, sp := spancontext.StartSpan(context.Background(), "feed-and-sync.fetch") - defer sp.Finish() - - log.Trace("sleeping", "ruid", ruid) - time.Sleep(3 * time.Second) - - log.Trace("http get request (feed)", "ruid", ruid, "api", endpoint, "topic", topic, "user", user) - - var tn time.Time - reqUri := endpoint + "/bzz-feed:/?topic=" + topic + "&user=" + user - req, _ := http.NewRequest("GET", reqUri, nil) - - opentracing.GlobalTracer().Inject( - sp.Context(), - opentracing.HTTPHeaders, - opentracing.HTTPHeadersCarrier(req.Header)) - - trace := client.GetClientTrace("feed-and-sync - http get", "feed-and-sync", ruid, &tn) - - req = req.WithContext(httptrace.WithClientTrace(ctx, trace)) - transport := http.DefaultTransport - - //transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} - - tn = time.Now() - res, err := transport.RoundTrip(req) - if err != nil { - log.Error(err.Error(), "ruid", ruid) - return err - } - - log.Trace("http get response (feed)", "ruid", ruid, "api", endpoint, "topic", topic, "user", user, "code", res.StatusCode, "len", res.ContentLength) - - if res.StatusCode != 200 { - return fmt.Errorf("expected status code %d, got %v (ruid %v)", 200, res.StatusCode, ruid) - } - - defer res.Body.Close() - - rdigest, err := digest(res.Body) - if err != nil { - log.Warn(err.Error(), "ruid", ruid) - return err - } - - if !bytes.Equal(rdigest, original) { - err := fmt.Errorf("downloaded imported file md5=%x is not the same as the generated one=%x", rdigest, original) - log.Warn(err.Error(), "ruid", ruid) - return err - } - - log.Trace("downloaded file matches random file", "ruid", ruid, "len", res.ContentLength) - - return nil -} diff --git a/cmd/swarm/swarm-smoke/main.go b/cmd/swarm/swarm-smoke/main.go deleted file mode 100644 index 615f1f6d11a3..000000000000 --- a/cmd/swarm/swarm-smoke/main.go +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright 2018 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" - "os" - "sort" - - "github.com/nebulaai/nbai-node/cmd/utils" - gethmetrics "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/metrics/influxdb" - swarmmetrics "github.com/nebulaai/nbai-node/swarm/metrics" - "github.com/nebulaai/nbai-node/swarm/tracing" - - "github.com/nebulaai/nbai-node/log" - - cli "gopkg.in/urfave/cli.v1" -) - -var ( - gitCommit string // Git SHA1 commit hash of the release (set via linker flags) -) - -var ( - endpoints []string - includeLocalhost bool - cluster string - appName string - scheme string - filesize int - syncDelay int - from int - to int - verbosity int - timeout int - single bool -) - -func main() { - - app := cli.NewApp() - app.Name = "smoke-test" - app.Usage = "" - - app.Flags = []cli.Flag{ - cli.StringFlag{ - Name: "cluster-endpoint", - Value: "prod", - Usage: "cluster to point to (prod or a given namespace)", - Destination: &cluster, - }, - cli.StringFlag{ - Name: "app", - Value: "swarm", - Usage: "application to point to (swarm or swarm-private)", - Destination: &appName, - }, - cli.IntFlag{ - Name: "cluster-from", - Value: 8501, - Usage: "swarm node (from)", - Destination: &from, - }, - cli.IntFlag{ - Name: "cluster-to", - Value: 8512, - Usage: "swarm node (to)", - Destination: &to, - }, - cli.StringFlag{ - Name: "cluster-scheme", - Value: "http", - Usage: "http or https", - Destination: &scheme, - }, - cli.BoolFlag{ - Name: "include-localhost", - Usage: "whether to include localhost:8500 as an endpoint", - Destination: &includeLocalhost, - }, - cli.IntFlag{ - Name: "filesize", - Value: 1024, - Usage: "file size for generated random file in KB", - Destination: &filesize, - }, - cli.IntFlag{ - Name: "sync-delay", - Value: 5, - Usage: "duration of delay in seconds to wait for content to be synced", - Destination: &syncDelay, - }, - cli.IntFlag{ - Name: "verbosity", - Value: 1, - Usage: "verbosity", - Destination: &verbosity, - }, - cli.IntFlag{ - Name: "timeout", - Value: 120, - Usage: "timeout in seconds after which kill the process", - Destination: &timeout, - }, - cli.BoolFlag{ - Name: "single", - Usage: "whether to fetch content from a single node or from all nodes", - Destination: &single, - }, - } - - app.Flags = append(app.Flags, []cli.Flag{ - utils.MetricsEnabledFlag, - swarmmetrics.MetricsInfluxDBEndpointFlag, - swarmmetrics.MetricsInfluxDBDatabaseFlag, - swarmmetrics.MetricsInfluxDBUsernameFlag, - swarmmetrics.MetricsInfluxDBPasswordFlag, - swarmmetrics.MetricsInfluxDBHostTagFlag, - }...) - - app.Flags = append(app.Flags, tracing.Flags...) - - app.Commands = []cli.Command{ - { - Name: "upload_and_sync", - Aliases: []string{"c"}, - Usage: "upload and sync", - Action: cliUploadAndSync, - }, - { - Name: "feed_sync", - Aliases: []string{"f"}, - Usage: "feed update generate, upload and sync", - Action: cliFeedUploadAndSync, - }, - } - - sort.Sort(cli.FlagsByName(app.Flags)) - sort.Sort(cli.CommandsByName(app.Commands)) - - app.Before = func(ctx *cli.Context) error { - tracing.Setup(ctx) - return nil - } - - app.After = func(ctx *cli.Context) error { - return emitMetrics(ctx) - } - - err := app.Run(os.Args) - if err != nil { - log.Error(err.Error()) - - os.Exit(1) - } -} - -func emitMetrics(ctx *cli.Context) error { - if gethmetrics.Enabled { - var ( - endpoint = ctx.GlobalString(swarmmetrics.MetricsInfluxDBEndpointFlag.Name) - database = ctx.GlobalString(swarmmetrics.MetricsInfluxDBDatabaseFlag.Name) - username = ctx.GlobalString(swarmmetrics.MetricsInfluxDBUsernameFlag.Name) - password = ctx.GlobalString(swarmmetrics.MetricsInfluxDBPasswordFlag.Name) - hosttag = ctx.GlobalString(swarmmetrics.MetricsInfluxDBHostTagFlag.Name) - ) - return influxdb.InfluxDBWithTagsOnce(gethmetrics.DefaultRegistry, endpoint, database, username, password, "swarm-smoke.", map[string]string{ - "host": hosttag, - "version": gitCommit, - "filesize": fmt.Sprintf("%v", filesize), - }) - } - - return nil -} diff --git a/cmd/swarm/swarm-smoke/upload_and_sync.go b/cmd/swarm/swarm-smoke/upload_and_sync.go deleted file mode 100644 index 9d24a278f916..000000000000 --- a/cmd/swarm/swarm-smoke/upload_and_sync.go +++ /dev/null @@ -1,257 +0,0 @@ -// Copyright 2018 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 ( - "bytes" - "context" - "crypto/md5" - crand "crypto/rand" - "errors" - "fmt" - "io" - "io/ioutil" - "math/rand" - "net/http" - "net/http/httptrace" - "os" - "sync" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/swarm/api" - "github.com/nebulaai/nbai-node/swarm/api/client" - "github.com/nebulaai/nbai-node/swarm/spancontext" - "github.com/nebulaai/nbai-node/swarm/testutil" - opentracing "github.com/opentracing/opentracing-go" - "github.com/pborman/uuid" - - cli "gopkg.in/urfave/cli.v1" -) - -func generateEndpoints(scheme string, cluster string, app string, from int, to int) { - if cluster == "prod" { - for port := from; port < to; port++ { - endpoints = append(endpoints, fmt.Sprintf("%s://%v.swarm-gateways.net", scheme, port)) - } - } else { - for port := from; port < to; port++ { - endpoints = append(endpoints, fmt.Sprintf("%s://%s-%v-%s.stg.swarm-gateways.net", scheme, app, port, cluster)) - } - } - - if includeLocalhost { - endpoints = append(endpoints, "http://localhost:8500") - } -} - -func cliUploadAndSync(c *cli.Context) error { - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(verbosity), log.StreamHandler(os.Stdout, log.TerminalFormat(true)))) - - metrics.GetOrRegisterCounter("upload-and-sync", nil).Inc(1) - - errc := make(chan error) - go func() { - errc <- uploadAndSync(c) - }() - - select { - case err := <-errc: - if err != nil { - metrics.GetOrRegisterCounter("upload-and-sync.fail", nil).Inc(1) - } - return err - case <-time.After(time.Duration(timeout) * time.Second): - metrics.GetOrRegisterCounter("upload-and-sync.timeout", nil).Inc(1) - return fmt.Errorf("timeout after %v sec", timeout) - } -} - -func uploadAndSync(c *cli.Context) error { - defer func(now time.Time) { - totalTime := time.Since(now) - - log.Info("total time", "time", totalTime, "kb", filesize) - metrics.GetOrRegisterCounter("upload-and-sync.total-time", nil).Inc(int64(totalTime)) - }(time.Now()) - - generateEndpoints(scheme, cluster, appName, from, to) - seed := int(time.Now().UnixNano() / 1e6) - log.Info("uploading to "+endpoints[0]+" and syncing", "seed", seed) - - randomBytes := testutil.RandomBytes(seed, filesize*1000) - - t1 := time.Now() - hash, err := upload(&randomBytes, endpoints[0]) - if err != nil { - log.Error(err.Error()) - return err - } - metrics.GetOrRegisterCounter("upload-and-sync.upload-time", nil).Inc(int64(time.Since(t1))) - - fhash, err := digest(bytes.NewReader(randomBytes)) - if err != nil { - log.Error(err.Error()) - return err - } - - log.Info("uploaded successfully", "hash", hash, "digest", fmt.Sprintf("%x", fhash)) - - time.Sleep(time.Duration(syncDelay) * time.Second) - - wg := sync.WaitGroup{} - if single { - rand.Seed(time.Now().UTC().UnixNano()) - randIndex := 1 + rand.Intn(len(endpoints)-1) - ruid := uuid.New()[:8] - wg.Add(1) - go func(endpoint string, ruid string) { - for { - start := time.Now() - err := fetch(hash, endpoint, fhash, ruid) - fetchTime := time.Since(start) - if err != nil { - continue - } - - metrics.GetOrRegisterMeter("upload-and-sync.single.fetch-time", nil).Mark(int64(fetchTime)) - wg.Done() - return - } - }(endpoints[randIndex], ruid) - } else { - for _, endpoint := range endpoints { - ruid := uuid.New()[:8] - wg.Add(1) - go func(endpoint string, ruid string) { - for { - start := time.Now() - err := fetch(hash, endpoint, fhash, ruid) - fetchTime := time.Since(start) - if err != nil { - continue - } - - metrics.GetOrRegisterMeter("upload-and-sync.each.fetch-time", nil).Mark(int64(fetchTime)) - wg.Done() - return - } - }(endpoint, ruid) - } - } - wg.Wait() - log.Info("all endpoints synced random file successfully") - - return nil -} - -// fetch is getting the requested `hash` from the `endpoint` and compares it with the `original` file -func fetch(hash string, endpoint string, original []byte, ruid string) error { - ctx, sp := spancontext.StartSpan(context.Background(), "upload-and-sync.fetch") - defer sp.Finish() - - log.Trace("sleeping", "ruid", ruid) - time.Sleep(3 * time.Second) - log.Trace("http get request", "ruid", ruid, "api", endpoint, "hash", hash) - - var tn time.Time - reqUri := endpoint + "/bzz:/" + hash + "/" - req, _ := http.NewRequest("GET", reqUri, nil) - - opentracing.GlobalTracer().Inject( - sp.Context(), - opentracing.HTTPHeaders, - opentracing.HTTPHeadersCarrier(req.Header)) - - trace := client.GetClientTrace("upload-and-sync - http get", "upload-and-sync", ruid, &tn) - - req = req.WithContext(httptrace.WithClientTrace(ctx, trace)) - transport := http.DefaultTransport - - //transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} - - tn = time.Now() - res, err := transport.RoundTrip(req) - if err != nil { - log.Error(err.Error(), "ruid", ruid) - return err - } - log.Trace("http get response", "ruid", ruid, "api", endpoint, "hash", hash, "code", res.StatusCode, "len", res.ContentLength) - - if res.StatusCode != 200 { - err := fmt.Errorf("expected status code %d, got %v", 200, res.StatusCode) - log.Warn(err.Error(), "ruid", ruid) - return err - } - - defer res.Body.Close() - - rdigest, err := digest(res.Body) - if err != nil { - log.Warn(err.Error(), "ruid", ruid) - return err - } - - if !bytes.Equal(rdigest, original) { - err := fmt.Errorf("downloaded imported file md5=%x is not the same as the generated one=%x", rdigest, original) - log.Warn(err.Error(), "ruid", ruid) - return err - } - - log.Trace("downloaded file matches random file", "ruid", ruid, "len", res.ContentLength) - - return nil -} - -// upload is uploading a file `f` to `endpoint` via the `swarm up` cmd -func upload(dataBytes *[]byte, endpoint string) (string, error) { - swarm := client.NewClient(endpoint) - f := &client.File{ - ReadCloser: ioutil.NopCloser(bytes.NewReader(*dataBytes)), - ManifestEntry: api.ManifestEntry{ - ContentType: "text/plain", - Mode: 0660, - Size: int64(len(*dataBytes)), - }, - } - - // upload data to bzz:// and retrieve the content-addressed manifest hash, hex-encoded. - return swarm.Upload(f, "", false) -} - -func digest(r io.Reader) ([]byte, error) { - h := md5.New() - _, err := io.Copy(h, r) - if err != nil { - return nil, err - } - return h.Sum(nil), nil -} - -// generates random data in heap buffer -func generateRandomData(datasize int) ([]byte, error) { - b := make([]byte, datasize) - c, err := crand.Read(b) - if err != nil { - return nil, err - } else if c != datasize { - return nil, errors.New("short read") - } - return b, nil -} diff --git a/cmd/swarm/upload.go b/cmd/swarm/upload.go deleted file mode 100644 index b739414e1c30..000000000000 --- a/cmd/swarm/upload.go +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright 2016 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 . - -// Command bzzup uploads files to the swarm HTTP API. -package main - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "os/user" - "path" - "path/filepath" - "strconv" - "strings" - - "github.com/nebulaai/nbai-node/log" - swarm "github.com/nebulaai/nbai-node/swarm/api/client" - - "github.com/nebulaai/nbai-node/cmd/utils" - "gopkg.in/urfave/cli.v1" -) - -var upCommand = cli.Command{ - Action: upload, - CustomHelpTemplate: helpTemplate, - Name: "up", - Usage: "uploads a file or directory to swarm using the HTTP API", - ArgsUsage: "", - Flags: []cli.Flag{SwarmEncryptedFlag}, - Description: "uploads a file or directory to swarm using the HTTP API and prints the root hash", -} - -func upload(ctx *cli.Context) { - args := ctx.Args() - var ( - bzzapi = strings.TrimRight(ctx.GlobalString(SwarmApiFlag.Name), "/") - recursive = ctx.GlobalBool(SwarmRecursiveFlag.Name) - wantManifest = ctx.GlobalBoolT(SwarmWantManifestFlag.Name) - defaultPath = ctx.GlobalString(SwarmUploadDefaultPath.Name) - fromStdin = ctx.GlobalBool(SwarmUpFromStdinFlag.Name) - mimeType = ctx.GlobalString(SwarmUploadMimeType.Name) - client = swarm.NewClient(bzzapi) - toEncrypt = ctx.Bool(SwarmEncryptedFlag.Name) - autoDefaultPath = false - file string - ) - if autoDefaultPathString := os.Getenv(SWARM_AUTO_DEFAULTPATH); autoDefaultPathString != "" { - b, err := strconv.ParseBool(autoDefaultPathString) - if err != nil { - utils.Fatalf("invalid environment variable %s: %v", SWARM_AUTO_DEFAULTPATH, err) - } - autoDefaultPath = b - } - if len(args) != 1 { - if fromStdin { - tmp, err := ioutil.TempFile("", "swarm-stdin") - if err != nil { - utils.Fatalf("error create tempfile: %s", err) - } - defer os.Remove(tmp.Name()) - n, err := io.Copy(tmp, os.Stdin) - if err != nil { - utils.Fatalf("error copying stdin to tempfile: %s", err) - } else if n == 0 { - utils.Fatalf("error reading from stdin: zero length") - } - file = tmp.Name() - } else { - utils.Fatalf("Need filename as the first and only argument") - } - } else { - file = expandPath(args[0]) - } - - if !wantManifest { - f, err := swarm.Open(file) - if err != nil { - utils.Fatalf("Error opening file: %s", err) - } - defer f.Close() - hash, err := client.UploadRaw(f, f.Size, toEncrypt) - if err != nil { - utils.Fatalf("Upload failed: %s", err) - } - fmt.Println(hash) - return - } - - stat, err := os.Stat(file) - if err != nil { - utils.Fatalf("Error opening file: %s", err) - } - - // define a function which either uploads a directory or single file - // based on the type of the file being uploaded - var doUpload func() (hash string, err error) - if stat.IsDir() { - doUpload = func() (string, error) { - if !recursive { - return "", errors.New("Argument is a directory and recursive upload is disabled") - } - if autoDefaultPath && defaultPath == "" { - defaultEntryCandidate := path.Join(file, "index.html") - log.Debug("trying to find default path", "path", defaultEntryCandidate) - defaultEntryStat, err := os.Stat(defaultEntryCandidate) - if err == nil && !defaultEntryStat.IsDir() { - log.Debug("setting auto detected default path", "path", defaultEntryCandidate) - defaultPath = defaultEntryCandidate - } - } - if defaultPath != "" { - // construct absolute default path - absDefaultPath, _ := filepath.Abs(defaultPath) - absFile, _ := filepath.Abs(file) - // make sure absolute directory ends with only one "/" - // to trim it from absolute default path and get relative default path - absFile = strings.TrimRight(absFile, "/") + "/" - if absDefaultPath != "" && absFile != "" && strings.HasPrefix(absDefaultPath, absFile) { - defaultPath = strings.TrimPrefix(absDefaultPath, absFile) - } - } - return client.UploadDirectory(file, defaultPath, "", toEncrypt) - } - } else { - doUpload = func() (string, error) { - f, err := swarm.Open(file) - if err != nil { - return "", fmt.Errorf("error opening file: %s", err) - } - defer f.Close() - if mimeType != "" { - f.ContentType = mimeType - } - return client.Upload(f, "", toEncrypt) - } - } - hash, err := doUpload() - if err != nil { - utils.Fatalf("Upload failed: %s", err) - } - fmt.Println(hash) -} - -// Expands a file path -// 1. replace tilde with users home dir -// 2. expands embedded environment variables -// 3. cleans the path, e.g. /a/b/../c -> /a/c -// Note, it has limitations, e.g. ~someuser/tmp will not be expanded -func expandPath(p string) string { - if i := strings.Index(p, ":"); i > 0 { - return p - } - if i := strings.Index(p, "@"); i > 0 { - return p - } - if strings.HasPrefix(p, "~/") || strings.HasPrefix(p, "~\\") { - if home := homeDir(); home != "" { - p = home + p[1:] - } - } - return path.Clean(os.ExpandEnv(p)) -} - -func homeDir() string { - if home := os.Getenv("HOME"); home != "" { - return home - } - if usr, err := user.Current(); err == nil { - return usr.HomeDir - } - return "" -} diff --git a/cmd/swarm/upload_test.go b/cmd/swarm/upload_test.go deleted file mode 100644 index fd72d4a01d0b..000000000000 --- a/cmd/swarm/upload_test.go +++ /dev/null @@ -1,356 +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 ( - "bytes" - "fmt" - "io" - "io/ioutil" - "net/http" - "os" - "path" - "path/filepath" - "runtime" - "strings" - "testing" - "time" - - "github.com/nebulaai/nbai-node/log" - swarmapi "github.com/nebulaai/nbai-node/swarm/api/client" - "github.com/nebulaai/nbai-node/swarm/testutil" - "github.com/mattn/go-colorable" -) - -func init() { - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) -} - -func TestSwarmUp(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip() - } - - initCluster(t) - - cases := []struct { - name string - f func(t *testing.T) - }{ - {"NoEncryption", testNoEncryption}, - {"Encrypted", testEncrypted}, - {"RecursiveNoEncryption", testRecursiveNoEncryption}, - {"RecursiveEncrypted", testRecursiveEncrypted}, - {"DefaultPathAll", testDefaultPathAll}, - } - - for _, tc := range cases { - t.Run(tc.name, tc.f) - } -} - -// testNoEncryption tests that running 'swarm up' makes the resulting file -// available from all nodes via the HTTP API -func testNoEncryption(t *testing.T) { - testDefault(false, t) -} - -// testEncrypted tests that running 'swarm up --encrypted' makes the resulting file -// available from all nodes via the HTTP API -func testEncrypted(t *testing.T) { - testDefault(true, t) -} - -func testRecursiveNoEncryption(t *testing.T) { - testRecursive(false, t) -} - -func testRecursiveEncrypted(t *testing.T) { - testRecursive(true, t) -} - -func testDefault(toEncrypt bool, t *testing.T) { - tmpFileName := testutil.TempFileWithContent(t, data) - defer os.Remove(tmpFileName) - - // write data to file - hashRegexp := `[a-f\d]{64}` - flags := []string{ - "--bzzapi", cluster.Nodes[0].URL, - "up", - tmpFileName} - if toEncrypt { - hashRegexp = `[a-f\d]{128}` - flags = []string{ - "--bzzapi", cluster.Nodes[0].URL, - "up", - "--encrypt", - tmpFileName} - } - // upload the file with 'swarm up' and expect a hash - log.Info(fmt.Sprintf("uploading file with 'swarm up'")) - up := runSwarm(t, flags...) - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - hash := matches[0] - log.Info("file uploaded", "hash", hash) - - // get the file from the HTTP API of each node - for _, node := range cluster.Nodes { - log.Info("getting file from node", "node", node.Name) - - res, err := http.Get(node.URL + "/bzz:/" + hash) - if err != nil { - t.Fatal(err) - } - defer res.Body.Close() - - reply, err := ioutil.ReadAll(res.Body) - if err != nil { - t.Fatal(err) - } - if res.StatusCode != 200 { - t.Fatalf("expected HTTP status 200, got %s", res.Status) - } - if string(reply) != data { - t.Fatalf("expected HTTP body %q, got %q", data, reply) - } - log.Debug("verifying uploaded file using `swarm down`") - //try to get the content with `swarm down` - tmpDownload, err := ioutil.TempDir("", "swarm-test") - tmpDownload = path.Join(tmpDownload, "tmpfile.tmp") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpDownload) - - bzzLocator := "bzz:/" + hash - flags = []string{ - "--bzzapi", cluster.Nodes[0].URL, - "down", - bzzLocator, - tmpDownload, - } - - down := runSwarm(t, flags...) - down.ExpectExit() - - fi, err := os.Stat(tmpDownload) - if err != nil { - t.Fatalf("could not stat path: %v", err) - } - - switch mode := fi.Mode(); { - case mode.IsRegular(): - downloadedBytes, err := ioutil.ReadFile(tmpDownload) - if err != nil { - t.Fatalf("had an error reading the downloaded file: %v", err) - } - if !bytes.Equal(downloadedBytes, bytes.NewBufferString(data).Bytes()) { - t.Fatalf("retrieved data and posted data not equal!") - } - - default: - t.Fatalf("expected to download regular file, got %s", fi.Mode()) - } - } - - timeout := time.Duration(2 * time.Second) - httpClient := http.Client{ - Timeout: timeout, - } - - // try to squeeze a timeout by getting an non-existent hash from each node - for _, node := range cluster.Nodes { - _, err := httpClient.Get(node.URL + "/bzz:/1023e8bae0f70be7d7b5f74343088ba408a218254391490c85ae16278e230340") - // we're speeding up the timeout here since netstore has a 60 seconds timeout on a request - if err != nil && !strings.Contains(err.Error(), "Client.Timeout exceeded while awaiting headers") { - t.Fatal(err) - } - // this is disabled since it takes 60s due to netstore timeout - // if res.StatusCode != 404 { - // t.Fatalf("expected HTTP status 404, got %s", res.Status) - // } - } -} - -func testRecursive(toEncrypt bool, t *testing.T) { - tmpUploadDir, err := ioutil.TempDir("", "swarm-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpUploadDir) - // create tmp files - for _, path := range []string{"tmp1", "tmp2"} { - if err := ioutil.WriteFile(filepath.Join(tmpUploadDir, path), bytes.NewBufferString(data).Bytes(), 0644); err != nil { - t.Fatal(err) - } - } - - hashRegexp := `[a-f\d]{64}` - flags := []string{ - "--bzzapi", cluster.Nodes[0].URL, - "--recursive", - "up", - tmpUploadDir} - if toEncrypt { - hashRegexp = `[a-f\d]{128}` - flags = []string{ - "--bzzapi", cluster.Nodes[0].URL, - "--recursive", - "up", - "--encrypt", - tmpUploadDir} - } - // upload the file with 'swarm up' and expect a hash - log.Info(fmt.Sprintf("uploading file with 'swarm up'")) - up := runSwarm(t, flags...) - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - hash := matches[0] - log.Info("dir uploaded", "hash", hash) - - // get the file from the HTTP API of each node - for _, node := range cluster.Nodes { - log.Info("getting file from node", "node", node.Name) - //try to get the content with `swarm down` - tmpDownload, err := ioutil.TempDir("", "swarm-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmpDownload) - bzzLocator := "bzz:/" + hash - flagss := []string{ - "--bzzapi", cluster.Nodes[0].URL, - "down", - "--recursive", - bzzLocator, - tmpDownload, - } - - fmt.Println("downloading from swarm with recursive") - down := runSwarm(t, flagss...) - down.ExpectExit() - - files, err := ioutil.ReadDir(tmpDownload) - for _, v := range files { - fi, err := os.Stat(path.Join(tmpDownload, v.Name())) - if err != nil { - t.Fatalf("got an error: %v", err) - } - - switch mode := fi.Mode(); { - case mode.IsRegular(): - if file, err := swarmapi.Open(path.Join(tmpDownload, v.Name())); err != nil { - t.Fatalf("encountered an error opening the file returned from the CLI: %v", err) - } else { - ff := make([]byte, len(data)) - io.ReadFull(file, ff) - buf := bytes.NewBufferString(data) - - if !bytes.Equal(ff, buf.Bytes()) { - t.Fatalf("retrieved data and posted data not equal!") - } - } - default: - t.Fatalf("this shouldnt happen") - } - } - if err != nil { - t.Fatalf("could not list files at: %v", files) - } - } -} - -// testDefaultPathAll tests swarm recursive upload with relative and absolute -// default paths and with encryption. -func testDefaultPathAll(t *testing.T) { - testDefaultPath(false, false, t) - testDefaultPath(false, true, t) - testDefaultPath(true, false, t) - testDefaultPath(true, true, t) -} - -func testDefaultPath(toEncrypt bool, absDefaultPath bool, t *testing.T) { - tmp, err := ioutil.TempDir("", "swarm-defaultpath-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - - err = ioutil.WriteFile(filepath.Join(tmp, "index.html"), []byte("

Test

"), 0666) - if err != nil { - t.Fatal(err) - } - err = ioutil.WriteFile(filepath.Join(tmp, "robots.txt"), []byte("Disallow: /"), 0666) - if err != nil { - t.Fatal(err) - } - - defaultPath := "index.html" - if absDefaultPath { - defaultPath = filepath.Join(tmp, defaultPath) - } - - args := []string{ - "--bzzapi", - cluster.Nodes[0].URL, - "--recursive", - "--defaultpath", - defaultPath, - "up", - tmp, - } - if toEncrypt { - args = append(args, "--encrypt") - } - - up := runSwarm(t, args...) - hashRegexp := `[a-f\d]{64,128}` - _, matches := up.ExpectRegexp(hashRegexp) - up.ExpectExit() - hash := matches[0] - - client := swarmapi.NewClient(cluster.Nodes[0].URL) - - m, isEncrypted, err := client.DownloadManifest(hash) - if err != nil { - t.Fatal(err) - } - - if toEncrypt != isEncrypted { - t.Error("downloaded manifest is not encrypted") - } - - var found bool - var entriesCount int - for _, e := range m.Entries { - entriesCount++ - if e.Path == "" { - found = true - } - } - - if !found { - t.Error("manifest default entry was not found") - } - - if entriesCount != 3 { - t.Errorf("manifest contains %v entries, expected %v", entriesCount, 3) - } -} diff --git a/cmd/utils/cmd.go b/cmd/utils/cmd.go index 67394ef19a41..a3ee45ba7f06 100644 --- a/cmd/utils/cmd.go +++ b/cmd/utils/cmd.go @@ -27,16 +27,16 @@ import ( "strings" "syscall" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/internal/debug" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/internal/debug" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/rlp" ) const ( @@ -238,7 +238,7 @@ func ExportAppendChain(blockchain *core.BlockChain, fn string, first uint64, las } // ImportPreimages imports a batch of exported hash preimages into the database. -func ImportPreimages(db *ethdb.LDBDatabase, fn string) error { +func ImportPreimages(db ethdb.Database, fn string) error { log.Info("Importing preimages", "file", fn) // Open the file handle and potentially unwrap the gzip stream @@ -285,7 +285,7 @@ func ImportPreimages(db *ethdb.LDBDatabase, fn string) error { // ExportPreimages exports all known hash preimages into the specified file, // truncating any data already present in the file. -func ExportPreimages(db *ethdb.LDBDatabase, fn string) error { +func ExportPreimages(db ethdb.Database, fn string) error { log.Info("Exporting preimages", "file", fn) // Open the file handle and potentially wrap with a gzip stream @@ -302,6 +302,8 @@ func ExportPreimages(db *ethdb.LDBDatabase, fn string) error { } // Iterate over the preimages and export them it := db.NewIteratorWithPrefix([]byte("secure-key-")) + defer it.Release() + for it.Next() { if err := rlp.Encode(writer, it.Value()); err != nil { return err diff --git a/cmd/utils/customflags.go b/cmd/utils/customflags.go index 83b7be937d4e..17dcba5f74fe 100644 --- a/cmd/utils/customflags.go +++ b/cmd/utils/customflags.go @@ -20,47 +20,57 @@ import ( "encoding" "errors" "flag" - "fmt" "math/big" "os" "os/user" "path" "strings" - "github.com/nebulaai/nbai-node/common/math" + "github.com/ethereum/go-ethereum/common/math" "gopkg.in/urfave/cli.v1" ) // Custom type which is registered in the flags library which cli uses for // argument parsing. This allows us to expand Value to an absolute path when // the argument is parsed -type DirectoryString struct { - Value string -} +type DirectoryString string -func (self *DirectoryString) String() string { - return self.Value +func (s *DirectoryString) String() string { + return string(*s) } -func (self *DirectoryString) Set(value string) error { - self.Value = expandPath(value) +func (s *DirectoryString) Set(value string) error { + *s = DirectoryString(expandPath(value)) return nil } // Custom cli.Flag type which expand the received string to an absolute path. // e.g. ~/.ethereum -> /home/username/.ethereum type DirectoryFlag struct { - Name string - Value DirectoryString - Usage string + Name string + Value DirectoryString + Usage string + EnvVar string } -func (self DirectoryFlag) String() string { - fmtString := "%s %v\t%v" - if len(self.Value.Value) > 0 { - fmtString = "%s \"%v\"\t%v" - } - return fmt.Sprintf(fmtString, prefixedNames(self.Name), self.Value.Value, self.Usage) +func (f DirectoryFlag) String() string { + return cli.FlagStringer(f) +} + +// called by cli library, grabs variable from environment (if in env) +// and adds variable to flag set for parsing. +func (f DirectoryFlag) Apply(set *flag.FlagSet) { + eachName(f.Name, func(name string) { + set.Var(&f.Value, f.Name, f.Usage) + }) +} + +func (f DirectoryFlag) GetName() string { + return f.Name +} + +func (f *DirectoryFlag) Set(value string) { + f.Value.Set(value) } func eachName(longName string, fn func(string)) { @@ -71,14 +81,6 @@ func eachName(longName string, fn func(string)) { } } -// called by cli library, grabs variable from environment (if in env) -// and adds variable to flag set for parsing. -func (self DirectoryFlag) Apply(set *flag.FlagSet) { - eachName(self.Name, func(name string) { - set.Var(&self.Value, self.Name, self.Usage) - }) -} - type TextMarshaler interface { encoding.TextMarshaler encoding.TextUnmarshaler @@ -103,9 +105,10 @@ func (v textMarshalerVal) Set(s string) error { // TextMarshalerFlag wraps a TextMarshaler value. type TextMarshalerFlag struct { - Name string - Value TextMarshaler - Usage string + Name string + Value TextMarshaler + Usage string + EnvVar string } func (f TextMarshalerFlag) GetName() string { @@ -113,7 +116,7 @@ func (f TextMarshalerFlag) GetName() string { } func (f TextMarshalerFlag) String() string { - return fmt.Sprintf("%s \"%v\"\t%v", prefixedNames(f.Name), f.Value, f.Usage) + return cli.FlagStringer(f) } func (f TextMarshalerFlag) Apply(set *flag.FlagSet) { @@ -134,9 +137,10 @@ func GlobalTextMarshaler(ctx *cli.Context, name string) TextMarshaler { // BigFlag is a command line flag that accepts 256 bit big integers in decimal or // hexadecimal syntax. type BigFlag struct { - Name string - Value *big.Int - Usage string + Name string + Value *big.Int + Usage string + EnvVar string } // bigValue turns *big.Int into a flag.Value @@ -163,11 +167,7 @@ func (f BigFlag) GetName() string { } func (f BigFlag) String() string { - fmtString := "%s %v\t%v" - if f.Value != nil { - fmtString = "%s \"%v\"\t%v" - } - return fmt.Sprintf(fmtString, prefixedNames(f.Name), f.Value, f.Usage) + return cli.FlagStringer(f) } func (f BigFlag) Apply(set *flag.FlagSet) { @@ -185,36 +185,6 @@ func GlobalBig(ctx *cli.Context, name string) *big.Int { return (*big.Int)(val.(*bigValue)) } -func prefixFor(name string) (prefix string) { - if len(name) == 1 { - prefix = "-" - } else { - prefix = "--" - } - - return -} - -func prefixedNames(fullName string) (prefixed string) { - parts := strings.Split(fullName, ",") - for i, name := range parts { - name = strings.Trim(name, " ") - prefixed += prefixFor(name) + name - if i < len(parts)-1 { - prefixed += ", " - } - } - return -} - -func (self DirectoryFlag) GetName() string { - return self.Name -} - -func (self *DirectoryFlag) Set(value string) { - self.Value.Value = value -} - // Expands a file path // 1. replace tilde with users home dir // 2. expands embedded environment variables diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index ae0582022ee0..537548835d9c 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -19,45 +19,51 @@ package utils import ( "crypto/ecdsa" + "errors" "fmt" + "io" "io/ioutil" "math/big" "os" "path/filepath" "strconv" "strings" + "text/tabwriter" + "text/template" "time" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/fdlimit" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/consensus/clique" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/dashboard" - "github.com/nebulaai/nbai-node/eth" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/eth/gasprice" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/ethstats" - "github.com/nebulaai/nbai-node/les" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/metrics/influxdb" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/discv5" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/nat" - "github.com/nebulaai/nbai-node/p2p/netutil" - "github.com/nebulaai/nbai-node/params" - whisper "github.com/nebulaai/nbai-node/whisper/whisperv6" - "gopkg.in/urfave/cli.v1" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/fdlimit" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/clique" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/eth/gasprice" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethstats" + "github.com/ethereum/go-ethereum/graphql" + "github.com/ethereum/go-ethereum/les" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/metrics/influxdb" + "github.com/ethereum/go-ethereum/miner" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/discv5" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/nat" + "github.com/ethereum/go-ethereum/p2p/netutil" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" + whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" + pcsclite "github.com/gballet/go-libpcsclite" + cli "gopkg.in/urfave/cli.v1" ) var ( @@ -71,6 +77,17 @@ SUBCOMMANDS: {{range $categorized.Flags}}{{"\t"}}{{.}} {{end}} {{end}}{{end}}` + + OriginCommandHelpTemplate = `{{.Name}}{{if .Subcommands}} command{{end}}{{if .Flags}} [command options]{{end}} [arguments...] +{{if .Description}}{{.Description}} +{{end}}{{if .Subcommands}} +SUBCOMMANDS: + {{range .Subcommands}}{{.Name}}{{with .ShortName}}, {{.}}{{end}}{{ "\t" }}{{.Usage}} + {{end}}{{end}}{{if .Flags}} +OPTIONS: +{{range $.Flags}}{{"\t"}}{{.}} +{{end}} +{{end}}` ) func init() { @@ -86,25 +103,32 @@ GLOBAL OPTIONS: {{range .Flags}}{{.}} {{end}}{{end}} ` - cli.CommandHelpTemplate = CommandHelpTemplate + cli.HelpPrinter = printHelp } // NewApp creates an app with sane defaults. -func NewApp(gitCommit, usage string) *cli.App { +func NewApp(gitCommit, gitDate, usage string) *cli.App { app := cli.NewApp() app.Name = filepath.Base(os.Args[0]) app.Author = "" - //app.Authors = nil app.Email = "" - app.Version = params.VersionWithMeta - if len(gitCommit) >= 8 { - app.Version += "-" + gitCommit[:8] - } + app.Version = params.VersionWithCommit(gitCommit, gitDate) app.Usage = usage return app } +func printHelp(out io.Writer, templ string, data interface{}) { + funcMap := template.FuncMap{"join": strings.Join} + t := template.Must(template.New("help").Funcs(funcMap).Parse(templ)) + w := tabwriter.NewWriter(out, 38, 8, 2, ' ', 0) + err := t.Execute(w, data) + if err != nil { + panic(err) + } + w.Flush() +} + // These are all the command line flags we support. // If you add to this list, please remember to include the // flag in the appropriate command definition. @@ -117,7 +141,11 @@ var ( DataDirFlag = DirectoryFlag{ Name: "datadir", Usage: "Data directory for the databases and keystore", - Value: DirectoryString{node.DefaultDataDir()}, + Value: DirectoryString(node.DefaultDataDir()), + } + AncientFlag = DirectoryFlag{ + Name: "datadir.ancient", + Usage: "Data directory for ancient chain segments (default = inside chaindata)", } KeyStoreDirFlag = DirectoryFlag{ Name: "keystore", @@ -127,6 +155,11 @@ var ( Name: "nousb", Usage: "Disables monitoring for and managing USB hardware wallets", } + SmartCardDaemonPathFlag = cli.StringFlag{ + Name: "pcscdpath", + Usage: "Path to the smartcard daemon (pcscd) socket file", + Value: pcsclite.PCSCDSockName, + } NetworkIdFlag = cli.Uint64Flag{ Name: "networkid", Usage: "Network identifier (integer, 1=Frontier, 2=Morden (disused), 3=Ropsten, 4=Rinkeby)", @@ -140,9 +173,9 @@ var ( Name: "rinkeby", Usage: "Rinkeby network: pre-configured proof-of-authority test network", } - ConstantinopleOverrideFlag = cli.Uint64Flag{ - Name: "override.constantinople", - Usage: "Manually specify constantinople fork-block, overriding the bundled setting", + GoerliFlag = cli.BoolFlag{ + Name: "goerli", + Usage: "Görli network: pre-configured proof-of-authority test network", } DeveloperFlag = cli.BoolFlag{ Name: "dev", @@ -159,7 +192,27 @@ var ( DocRootFlag = DirectoryFlag{ Name: "docroot", Usage: "Document Root for HTTPClient file scheme", - Value: DirectoryString{homeDir()}, + Value: DirectoryString(homeDir()), + } + ExitWhenSyncedFlag = cli.BoolFlag{ + Name: "exitwhensynced", + Usage: "Exits after block synchronisation completes", + } + IterativeOutputFlag = cli.BoolFlag{ + Name: "iterative", + Usage: "Print streaming JSON iteratively, delimited by newlines", + } + ExcludeStorageFlag = cli.BoolFlag{ + Name: "nostorage", + Usage: "Exclude storage entries (save db lookups)", + } + IncludeIncompletesFlag = cli.BoolFlag{ + Name: "incompletes", + Usage: "Include accounts for which we don't have the address (missing preimage)", + } + ExcludeCodeFlag = cli.BoolFlag{ + Name: "nocode", + Usage: "Exclude contract code (save db lookups)", } defaultSyncMode = eth.DefaultConfig.SyncMode SyncModeFlag = TextMarshalerFlag{ @@ -172,16 +225,6 @@ var ( Usage: `Blockchain garbage collection mode ("full", "archive")`, Value: "full", } - LightServFlag = cli.IntFlag{ - Name: "lightserv", - Usage: "Maximum percentage of time allowed for serving LES requests (0-90)", - Value: 0, - } - LightPeersFlag = cli.IntFlag{ - Name: "lightpeers", - Usage: "Maximum number of LES client peers", - Value: eth.DefaultConfig.LightPeers, - } LightKDFFlag = cli.BoolFlag{ Name: "lightkdf", Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength", @@ -190,25 +233,58 @@ var ( Name: "whitelist", Usage: "Comma separated block number-to-hash mappings to enforce (=)", } - // Dashboard settings - DashboardEnabledFlag = cli.BoolFlag{ - Name: metrics.DashboardEnabledFlag, - Usage: "Enable the dashboard", + OverrideIstanbulFlag = cli.Uint64Flag{ + Name: "override.istanbul", + Usage: "Manually specify Istanbul fork-block, overriding the bundled setting", + } + OverrideMuirGlacierFlag = cli.Uint64Flag{ + Name: "override.muirglacier", + Usage: "Manually specify Muir Glacier fork-block, overriding the bundled setting", + } + // Light server and client settings + LightLegacyServFlag = cli.IntFlag{ // Deprecated in favor of light.serve, remove in 2021 + Name: "lightserv", + Usage: "Maximum percentage of time allowed for serving LES requests (deprecated, use --light.serve)", + Value: eth.DefaultConfig.LightServ, } - DashboardAddrFlag = cli.StringFlag{ - Name: "dashboard.addr", - Usage: "Dashboard listening interface", - Value: dashboard.DefaultConfig.Host, + LightServeFlag = cli.IntFlag{ + Name: "light.serve", + Usage: "Maximum percentage of time allowed for serving LES requests (multi-threaded processing allows values over 100)", + Value: eth.DefaultConfig.LightServ, } - DashboardPortFlag = cli.IntFlag{ - Name: "dashboard.host", - Usage: "Dashboard listening port", - Value: dashboard.DefaultConfig.Port, + LightIngressFlag = cli.IntFlag{ + Name: "light.ingress", + Usage: "Incoming bandwidth limit for serving light clients (kilobytes/sec, 0 = unlimited)", + Value: eth.DefaultConfig.LightIngress, } - DashboardRefreshFlag = cli.DurationFlag{ - Name: "dashboard.refresh", - Usage: "Dashboard metrics collection refresh rate", - Value: dashboard.DefaultConfig.Refresh, + LightEgressFlag = cli.IntFlag{ + Name: "light.egress", + Usage: "Outgoing bandwidth limit for serving light clients (kilobytes/sec, 0 = unlimited)", + Value: eth.DefaultConfig.LightEgress, + } + LightLegacyPeersFlag = cli.IntFlag{ // Deprecated in favor of light.maxpeers, remove in 2021 + Name: "lightpeers", + Usage: "Maximum number of light clients to serve, or light servers to attach to (deprecated, use --light.maxpeers)", + Value: eth.DefaultConfig.LightPeers, + } + LightMaxPeersFlag = cli.IntFlag{ + Name: "light.maxpeers", + Usage: "Maximum number of light clients to serve, or light servers to attach to", + Value: eth.DefaultConfig.LightPeers, + } + UltraLightServersFlag = cli.StringFlag{ + Name: "ulc.servers", + Usage: "List of trusted ultra-light servers", + Value: strings.Join(eth.DefaultConfig.UltraLightServers, ","), + } + UltraLightFractionFlag = cli.IntFlag{ + Name: "ulc.fraction", + Usage: "Minimum % of trusted ultra-light servers required to announce a new head", + Value: eth.DefaultConfig.UltraLightFraction, + } + UltraLightOnlyAnnounceFlag = cli.BoolFlag{ + Name: "ulc.onlyannounce", + Usage: "Ultra light server sends announcements only", } // Ethash settings EthashCacheDirFlag = DirectoryFlag{ @@ -227,8 +303,8 @@ var ( } EthashDatasetDirFlag = DirectoryFlag{ Name: "ethash.dagdir", - Usage: "Directory to store the ethash mining DAGs (default = inside home folder)", - Value: DirectoryString{eth.DefaultConfig.Ethash.DatasetDir}, + Usage: "Directory to store the ethash mining DAGs", + Value: DirectoryString(eth.DefaultConfig.Ethash.DatasetDir), } EthashDatasetsInMemoryFlag = cli.IntFlag{ Name: "ethash.dagsinmem", @@ -297,7 +373,7 @@ var ( // Performance tuning settings CacheFlag = cli.IntFlag{ Name: "cache", - Usage: "Megabytes of memory allocated to internal caching", + Usage: "Megabytes of memory allocated to internal caching (default = 4096 mainnet full node, 128 light mode)", Value: 1024, } CacheDatabaseFlag = cli.IntFlag{ @@ -307,18 +383,17 @@ var ( } CacheTrieFlag = cli.IntFlag{ Name: "cache.trie", - Usage: "Percentage of cache memory allowance to use for trie caching", + Usage: "Percentage of cache memory allowance to use for trie caching (default = 25% full mode, 50% archive mode)", Value: 25, } CacheGCFlag = cli.IntFlag{ Name: "cache.gc", - Usage: "Percentage of cache memory allowance to use for trie pruning", + Usage: "Percentage of cache memory allowance to use for trie pruning (default = 25% full mode, 0% archive mode)", Value: 25, } - TrieCacheGenFlag = cli.IntFlag{ - Name: "trie-cache-gens", - Usage: "Number of trie node generations to keep in memory", - Value: int(state.MaxTrieCacheGen), + CacheNoPrefetchFlag = cli.BoolFlag{ + Name: "cache.noprefetch", + Usage: "Disable heuristic state prefetch during block import (less CPU and disk IO, more time waiting for data)", } // Miner settings MiningEnabledFlag = cli.BoolFlag{ @@ -342,27 +417,27 @@ var ( MinerGasTargetFlag = cli.Uint64Flag{ Name: "miner.gastarget", Usage: "Target gas floor for mined blocks", - Value: eth.DefaultConfig.MinerGasFloor, + Value: eth.DefaultConfig.Miner.GasFloor, } MinerLegacyGasTargetFlag = cli.Uint64Flag{ Name: "targetgaslimit", Usage: "Target gas floor for mined blocks (deprecated, use --miner.gastarget)", - Value: eth.DefaultConfig.MinerGasFloor, + Value: eth.DefaultConfig.Miner.GasFloor, } MinerGasLimitFlag = cli.Uint64Flag{ Name: "miner.gaslimit", Usage: "Target gas ceiling for mined blocks", - Value: eth.DefaultConfig.MinerGasCeil, + Value: eth.DefaultConfig.Miner.GasCeil, } MinerGasPriceFlag = BigFlag{ Name: "miner.gasprice", Usage: "Minimum gas price for mining a transaction", - Value: eth.DefaultConfig.MinerGasPrice, + Value: eth.DefaultConfig.Miner.GasPrice, } MinerLegacyGasPriceFlag = BigFlag{ Name: "gasprice", Usage: "Minimum gas price for mining a transaction (deprecated, use --miner.gasprice)", - Value: eth.DefaultConfig.MinerGasPrice, + Value: eth.DefaultConfig.Miner.GasPrice, } MinerEtherbaseFlag = cli.StringFlag{ Name: "miner.nbaibase", @@ -385,7 +460,7 @@ var ( MinerRecommitIntervalFlag = cli.DurationFlag{ Name: "miner.recommit", Usage: "Time interval to recreate the block being mined", - Value: eth.DefaultConfig.MinerRecommit, + Value: eth.DefaultConfig.Miner.Recommit, } MinerNoVerfiyFlag = cli.BoolFlag{ Name: "miner.noverify", @@ -402,11 +477,23 @@ var ( Usage: "Password file to use for non-interactive password input", Value: "", } - + ExternalSignerFlag = cli.StringFlag{ + Name: "signer", + Usage: "External signer (url or path to ipc file)", + Value: "", + } VMEnableDebugFlag = cli.BoolFlag{ Name: "vmdebug", Usage: "Record information useful for VM and contract debugging", } + InsecureUnlockAllowedFlag = cli.BoolFlag{ + Name: "allow-insecure-unlock", + Usage: "Allow insecure account unlocking when account-related RPCs are exposed by http", + } + RPCGlobalGasCap = cli.Uint64Flag{ + Name: "rpc.gascap", + Usage: "Sets a cap on gas that can be used in eth_call/estimateGas", + } // Logging and debug settings EthStatsURLFlag = cli.StringFlag{ Name: "ethstats", @@ -421,6 +508,14 @@ var ( Usage: "Disables db compaction after import", } // RPC settings + IPCDisabledFlag = cli.BoolFlag{ + Name: "ipcdisable", + Usage: "Disable the IPC-RPC server", + } + IPCPathFlag = DirectoryFlag{ + Name: "ipcpath", + Usage: "Filename for IPC socket/pipe within the datadir (explicit paths escape it)", + } RPCEnabledFlag = cli.BoolFlag{ Name: "rpc", Usage: "Enable the HTTP-RPC server", @@ -450,14 +545,6 @@ var ( Usage: "API's offered over the HTTP-RPC interface", Value: "", } - IPCDisabledFlag = cli.BoolFlag{ - Name: "ipcdisable", - Usage: "Disable the IPC-RPC server", - } - IPCPathFlag = DirectoryFlag{ - Name: "ipcpath", - Usage: "Filename for IPC socket/pipe within the datadir (explicit paths escape it)", - } WSEnabledFlag = cli.BoolFlag{ Name: "ws", Usage: "Enable the WS-RPC server", @@ -482,6 +569,30 @@ var ( Usage: "Origins from which to accept websockets requests", Value: "", } + GraphQLEnabledFlag = cli.BoolFlag{ + Name: "graphql", + Usage: "Enable the GraphQL server", + } + GraphQLListenAddrFlag = cli.StringFlag{ + Name: "graphql.addr", + Usage: "GraphQL server listening interface", + Value: node.DefaultGraphQLHost, + } + GraphQLPortFlag = cli.IntFlag{ + Name: "graphql.port", + Usage: "GraphQL server listening port", + Value: node.DefaultGraphQLPort, + } + GraphQLCORSDomainFlag = cli.StringFlag{ + Name: "graphql.corsdomain", + Usage: "Comma separated list of domains from which to accept cross origin requests (browser enforced)", + Value: "", + } + GraphQLVirtualHostsFlag = cli.StringFlag{ + Name: "graphql.vhosts", + Usage: "Comma separated list of virtual hostnames from which to accept requests (server enforced). Accepts '*' wildcard.", + Value: strings.Join(node.DefaultConfig.GraphQLVirtualHosts, ","), + } ExecFlag = cli.StringFlag{ Name: "exec", Usage: "Execute JavaScript statement", @@ -495,12 +606,12 @@ var ( MaxPeersFlag = cli.IntFlag{ Name: "maxpeers", Usage: "Maximum number of network peers (network disabled if set to 0)", - Value: 25, + Value: node.DefaultConfig.P2P.MaxPeers, } MaxPendingPeersFlag = cli.IntFlag{ Name: "maxpendpeers", Usage: "Maximum number of pending connection attempts (defaults used if set to 0)", - Value: 0, + Value: node.DefaultConfig.P2P.MaxPendingPeers, } ListenPortFlag = cli.IntFlag{ Name: "port", @@ -587,9 +698,13 @@ var ( // Metrics flags MetricsEnabledFlag = cli.BoolFlag{ - Name: metrics.MetricsEnabledFlag, + Name: "metrics", Usage: "Enable metrics collection and reporting", } + MetricsEnabledExpensiveFlag = cli.BoolFlag{ + Name: "metrics.expensive", + Usage: "Enable expensive metrics collection and reporting", + } MetricsEnableInfluxDBFlag = cli.BoolFlag{ Name: "metrics.influxdb", Usage: "Enable metrics export/push to an external InfluxDB database", @@ -614,14 +729,14 @@ var ( Usage: "Password to authorize access to the database", Value: "test", } - // The `host` tag is part of every measurement sent to InfluxDB. Queries on tags are faster in InfluxDB. - // It is used so that we can group all nodes and average a measurement across all of them, but also so - // that we can select a specific node and inspect its measurements. + // Tags are part of every measurement sent to InfluxDB. Queries on tags are faster in InfluxDB. + // For example `host` tag could be used so that we can group all nodes and average a measurement + // across all of them, but also so that we can select a specific node and inspect its measurements. // https://docs.influxdata.com/influxdb/v1.4/concepts/key_concepts/#tag-key - MetricsInfluxDBHostTagFlag = cli.StringFlag{ - Name: "metrics.influxdb.host.tag", - Usage: "InfluxDB `host` tag attached to all measurements", - Value: "localhost", + MetricsInfluxDBTagsFlag = cli.StringFlag{ + Name: "metrics.influxdb.tags", + Usage: "Comma-separated InfluxDB tags (key/values) attached to all measurements", + Value: "host=localhost", } EWASMInterpreterFlag = cli.StringFlag{ @@ -647,6 +762,9 @@ func MakeDataDir(ctx *cli.Context) string { if ctx.GlobalBool(RinkebyFlag.Name) { return filepath.Join(path, "rinkeby") } + if ctx.GlobalBool(GoerliFlag.Name) { + return filepath.Join(path, "goerli") + } return path } Fatalf("Cannot determine default data directory, please set manually (--datadir)") @@ -701,17 +819,22 @@ func setBootstrapNodes(ctx *cli.Context, cfg *p2p.Config) { urls = params.TestnetBootnodes case ctx.GlobalBool(RinkebyFlag.Name): urls = params.RinkebyBootnodes + case ctx.GlobalBool(GoerliFlag.Name): + urls = params.GoerliBootnodes case cfg.BootstrapNodes != nil: return // already set, don't apply defaults. } cfg.BootstrapNodes = make([]*enode.Node, 0, len(urls)) for _, url := range urls { - node, err := enode.ParseV4(url) - if err != nil { - log.Crit("Bootstrap URL invalid", "enode", url, "err", err) + if url != "" { + node, err := enode.Parse(enode.ValidSchemes, url) + if err != nil { + log.Crit("Bootstrap URL invalid", "enode", url, "err", err) + continue + } + cfg.BootstrapNodes = append(cfg.BootstrapNodes, node) } - cfg.BootstrapNodes = append(cfg.BootstrapNodes, node) } } @@ -728,18 +851,22 @@ func setBootstrapNodesV5(ctx *cli.Context, cfg *p2p.Config) { } case ctx.GlobalBool(RinkebyFlag.Name): urls = params.RinkebyBootnodes + case ctx.GlobalBool(GoerliFlag.Name): + urls = params.GoerliBootnodes case cfg.BootstrapNodesV5 != nil: return // already set, don't apply defaults. } cfg.BootstrapNodesV5 = make([]*discv5.Node, 0, len(urls)) for _, url := range urls { - node, err := discv5.ParseNode(url) - if err != nil { - log.Error("Bootstrap URL invalid", "enode", url, "err", err) - continue + if url != "" { + node, err := discv5.ParseNode(url) + if err != nil { + log.Error("Bootstrap URL invalid", "enode", url, "err", err) + continue + } + cfg.BootstrapNodesV5 = append(cfg.BootstrapNodesV5, node) } - cfg.BootstrapNodesV5 = append(cfg.BootstrapNodesV5, node) } } @@ -781,7 +908,6 @@ func setHTTP(ctx *cli.Context, cfg *node.Config) { cfg.HTTPHost = ctx.GlobalString(RPCListenAddrFlag.Name) } } - if ctx.GlobalIsSet(RPCPortFlag.Name) { cfg.HTTPPort = ctx.GlobalInt(RPCPortFlag.Name) } @@ -796,6 +922,24 @@ func setHTTP(ctx *cli.Context, cfg *node.Config) { } } +// setGraphQL creates the GraphQL listener interface string from the set +// command line flags, returning empty if the GraphQL endpoint is disabled. +func setGraphQL(ctx *cli.Context, cfg *node.Config) { + if ctx.GlobalBool(GraphQLEnabledFlag.Name) && cfg.GraphQLHost == "" { + cfg.GraphQLHost = "127.0.0.1" + if ctx.GlobalIsSet(GraphQLListenAddrFlag.Name) { + cfg.GraphQLHost = ctx.GlobalString(GraphQLListenAddrFlag.Name) + } + } + cfg.GraphQLPort = ctx.GlobalInt(GraphQLPortFlag.Name) + if ctx.GlobalIsSet(GraphQLCORSDomainFlag.Name) { + cfg.GraphQLCors = splitAndTrim(ctx.GlobalString(GraphQLCORSDomainFlag.Name)) + } + if ctx.GlobalIsSet(GraphQLVirtualHostsFlag.Name) { + cfg.GraphQLVirtualHosts = splitAndTrim(ctx.GlobalString(GraphQLVirtualHostsFlag.Name)) + } +} + // setWS creates the WebSocket RPC listener interface string from the set // command line flags, returning empty if the HTTP endpoint is disabled. func setWS(ctx *cli.Context, cfg *node.Config) { @@ -805,7 +949,6 @@ func setWS(ctx *cli.Context, cfg *node.Config) { cfg.WSHost = ctx.GlobalString(WSListenAddrFlag.Name) } } - if ctx.GlobalIsSet(WSPortFlag.Name) { cfg.WSPort = ctx.GlobalInt(WSPortFlag.Name) } @@ -820,7 +963,7 @@ func setWS(ctx *cli.Context, cfg *node.Config) { // setIPC creates an IPC path configuration from the set command line flags, // returning an empty string if IPC was explicitly disabled, or the set path. func setIPC(ctx *cli.Context, cfg *node.Config) { - checkExclusive(ctx, IPCDisabledFlag, IPCPathFlag) + CheckExclusive(ctx, IPCDisabledFlag, IPCPathFlag) switch { case ctx.GlobalBool(IPCDisabledFlag.Name): cfg.IPCPath = "" @@ -829,6 +972,41 @@ func setIPC(ctx *cli.Context, cfg *node.Config) { } } +// setLes configures the les server and ultra light client settings from the command line flags. +func setLes(ctx *cli.Context, cfg *eth.Config) { + if ctx.GlobalIsSet(LightLegacyServFlag.Name) { + cfg.LightServ = ctx.GlobalInt(LightLegacyServFlag.Name) + } + if ctx.GlobalIsSet(LightServeFlag.Name) { + cfg.LightServ = ctx.GlobalInt(LightServeFlag.Name) + } + if ctx.GlobalIsSet(LightIngressFlag.Name) { + cfg.LightIngress = ctx.GlobalInt(LightIngressFlag.Name) + } + if ctx.GlobalIsSet(LightEgressFlag.Name) { + cfg.LightEgress = ctx.GlobalInt(LightEgressFlag.Name) + } + if ctx.GlobalIsSet(LightLegacyPeersFlag.Name) { + cfg.LightPeers = ctx.GlobalInt(LightLegacyPeersFlag.Name) + } + if ctx.GlobalIsSet(LightMaxPeersFlag.Name) { + cfg.LightPeers = ctx.GlobalInt(LightMaxPeersFlag.Name) + } + if ctx.GlobalIsSet(UltraLightServersFlag.Name) { + cfg.UltraLightServers = strings.Split(ctx.GlobalString(UltraLightServersFlag.Name), ",") + } + if ctx.GlobalIsSet(UltraLightFractionFlag.Name) { + cfg.UltraLightFraction = ctx.GlobalInt(UltraLightFractionFlag.Name) + } + if cfg.UltraLightFraction <= 0 && cfg.UltraLightFraction > 100 { + log.Error("Ultra light fraction is invalid", "had", cfg.UltraLightFraction, "updated", eth.DefaultConfig.UltraLightFraction) + cfg.UltraLightFraction = eth.DefaultConfig.UltraLightFraction + } + if ctx.GlobalIsSet(UltraLightOnlyAnnounceFlag.Name) { + cfg.UltraLightOnlyAnnounce = ctx.GlobalBool(UltraLightOnlyAnnounceFlag.Name) + } +} + // makeDatabaseHandles raises out the number of allowed file handles per process // for Geth and returns half of the allowance to assign to the database. func makeDatabaseHandles() int { @@ -836,10 +1014,11 @@ func makeDatabaseHandles() int { if err != nil { Fatalf("Failed to retrieve file descriptor allowance: %v", err) } - if err := fdlimit.Raise(uint64(limit)); err != nil { + raised, err := fdlimit.Raise(uint64(limit)) + if err != nil { Fatalf("Failed to raise file descriptor allowance: %v", err) } - return limit / 2 // Leave half for networking and other stuff + return int(raised / 2) // Leave half for networking and other stuff } // MakeAddress converts an account specified directly as a hex encoded string or @@ -880,11 +1059,15 @@ func setEtherbase(ctx *cli.Context, ks *keystore.KeyStore, cfg *eth.Config) { } // Convert the etherbase into an address and configure it if etherbase != "" { - account, err := MakeAddress(ks, etherbase) - if err != nil { - Fatalf("Invalid miner etherbase: %v", err) + if ks != nil { + account, err := MakeAddress(ks, etherbase) + if err != nil { + Fatalf("Invalid miner etherbase: %v", err) + } + cfg.Miner.Etherbase = account.Address + } else { + Fatalf("No etherbase configured") } - cfg.Etherbase = account.Address } } @@ -914,19 +1097,27 @@ func SetP2PConfig(ctx *cli.Context, cfg *p2p.Config) { setBootstrapNodesV5(ctx, cfg) lightClient := ctx.GlobalString(SyncModeFlag.Name) == "light" - lightServer := ctx.GlobalInt(LightServFlag.Name) != 0 - lightPeers := ctx.GlobalInt(LightPeersFlag.Name) + lightServer := (ctx.GlobalInt(LightLegacyServFlag.Name) != 0 || ctx.GlobalInt(LightServeFlag.Name) != 0) + + lightPeers := ctx.GlobalInt(LightLegacyPeersFlag.Name) + if ctx.GlobalIsSet(LightMaxPeersFlag.Name) { + lightPeers = ctx.GlobalInt(LightMaxPeersFlag.Name) + } + if lightClient && !ctx.GlobalIsSet(LightLegacyPeersFlag.Name) && !ctx.GlobalIsSet(LightMaxPeersFlag.Name) { + // dynamic default - for clients we use 1/10th of the default for servers + lightPeers /= 10 + } if ctx.GlobalIsSet(MaxPeersFlag.Name) { cfg.MaxPeers = ctx.GlobalInt(MaxPeersFlag.Name) - if lightServer && !ctx.GlobalIsSet(LightPeersFlag.Name) { + if lightServer && !ctx.GlobalIsSet(LightLegacyPeersFlag.Name) && !ctx.GlobalIsSet(LightMaxPeersFlag.Name) { cfg.MaxPeers += lightPeers } } else { if lightServer { cfg.MaxPeers += lightPeers } - if lightClient && ctx.GlobalIsSet(LightPeersFlag.Name) && cfg.MaxPeers < lightPeers { + if lightClient && (ctx.GlobalIsSet(LightLegacyPeersFlag.Name) || ctx.GlobalIsSet(LightMaxPeersFlag.Name)) && cfg.MaxPeers < lightPeers { cfg.MaxPeers = lightPeers } } @@ -978,10 +1169,15 @@ func SetNodeConfig(ctx *cli.Context, cfg *node.Config) { SetP2PConfig(ctx, &cfg.P2P) setIPC(ctx, cfg) setHTTP(ctx, cfg) + setGraphQL(ctx, cfg) setWS(ctx, cfg) setNodeUserIdent(ctx, cfg) - setDataDir(ctx, cfg) + setSmartCard(ctx, cfg) + + if ctx.GlobalIsSet(ExternalSignerFlag.Name) { + cfg.ExternalSigner = ctx.GlobalString(ExternalSignerFlag.Name) + } if ctx.GlobalIsSet(KeyStoreDirFlag.Name) { cfg.KeyStoreDir = ctx.GlobalString(KeyStoreDirFlag.Name) @@ -992,6 +1188,29 @@ func SetNodeConfig(ctx *cli.Context, cfg *node.Config) { if ctx.GlobalIsSet(NoUSBFlag.Name) { cfg.NoUSB = ctx.GlobalBool(NoUSBFlag.Name) } + if ctx.GlobalIsSet(InsecureUnlockAllowedFlag.Name) { + cfg.InsecureUnlockAllowed = ctx.GlobalBool(InsecureUnlockAllowedFlag.Name) + } +} + +func setSmartCard(ctx *cli.Context, cfg *node.Config) { + // Skip enabling smartcards if no path is set + path := ctx.GlobalString(SmartCardDaemonPathFlag.Name) + if path == "" { + return + } + // Sanity check that the smartcard path is valid + fi, err := os.Stat(path) + if err != nil { + log.Info("Smartcard socket not found, disabling", "err", err) + return + } + if fi.Mode()&os.ModeType != os.ModeSocket { + log.Error("Invalid smartcard daemon path", "path", path, "type", fi.Mode().String()) + return + } + // Smartcard daemon path exists and is a socket, enable it + cfg.SmartCardDaemonPath = path } func setDataDir(ctx *cli.Context, cfg *node.Config) { @@ -1000,10 +1219,12 @@ func setDataDir(ctx *cli.Context, cfg *node.Config) { cfg.DataDir = ctx.GlobalString(DataDirFlag.Name) case ctx.GlobalBool(DeveloperFlag.Name): cfg.DataDir = "" // unless explicitly requested, use memory databases - case ctx.GlobalBool(TestnetFlag.Name): + case ctx.GlobalBool(TestnetFlag.Name) && cfg.DataDir == node.DefaultDataDir(): cfg.DataDir = filepath.Join(node.DefaultDataDir(), "testnet") - case ctx.GlobalBool(RinkebyFlag.Name): + case ctx.GlobalBool(RinkebyFlag.Name) && cfg.DataDir == node.DefaultDataDir(): cfg.DataDir = filepath.Join(node.DefaultDataDir(), "rinkeby") + case ctx.GlobalBool(GoerliFlag.Name) && cfg.DataDir == node.DefaultDataDir(): + cfg.DataDir = filepath.Join(node.DefaultDataDir(), "goerli") } } @@ -1080,6 +1301,39 @@ func setEthash(ctx *cli.Context, cfg *eth.Config) { } } +func setMiner(ctx *cli.Context, cfg *miner.Config) { + if ctx.GlobalIsSet(MinerNotifyFlag.Name) { + cfg.Notify = strings.Split(ctx.GlobalString(MinerNotifyFlag.Name), ",") + } + if ctx.GlobalIsSet(MinerLegacyExtraDataFlag.Name) { + cfg.ExtraData = []byte(ctx.GlobalString(MinerLegacyExtraDataFlag.Name)) + } + if ctx.GlobalIsSet(MinerExtraDataFlag.Name) { + cfg.ExtraData = []byte(ctx.GlobalString(MinerExtraDataFlag.Name)) + } + if ctx.GlobalIsSet(MinerLegacyGasTargetFlag.Name) { + cfg.GasFloor = ctx.GlobalUint64(MinerLegacyGasTargetFlag.Name) + } + if ctx.GlobalIsSet(MinerGasTargetFlag.Name) { + cfg.GasFloor = ctx.GlobalUint64(MinerGasTargetFlag.Name) + } + if ctx.GlobalIsSet(MinerGasLimitFlag.Name) { + cfg.GasCeil = ctx.GlobalUint64(MinerGasLimitFlag.Name) + } + if ctx.GlobalIsSet(MinerLegacyGasPriceFlag.Name) { + cfg.GasPrice = GlobalBig(ctx, MinerLegacyGasPriceFlag.Name) + } + if ctx.GlobalIsSet(MinerGasPriceFlag.Name) { + cfg.GasPrice = GlobalBig(ctx, MinerGasPriceFlag.Name) + } + if ctx.GlobalIsSet(MinerRecommitIntervalFlag.Name) { + cfg.Recommit = ctx.Duration(MinerRecommitIntervalFlag.Name) + } + if ctx.GlobalIsSet(MinerNoVerfiyFlag.Name) { + cfg.Noverify = ctx.Bool(MinerNoVerfiyFlag.Name) + } +} + func setWhitelist(ctx *cli.Context, cfg *eth.Config) { whitelist := ctx.GlobalString(WhitelistFlag.Name) if whitelist == "" { @@ -1103,10 +1357,10 @@ func setWhitelist(ctx *cli.Context, cfg *eth.Config) { } } -// checkExclusive verifies that only a single instance of the provided flags was +// CheckExclusive verifies that only a single instance of the provided flags was // set by the user. Each flag might optionally be followed by a string type to // specialize it further. -func checkExclusive(ctx *cli.Context, args ...interface{}) { +func CheckExclusive(ctx *cli.Context, args ...interface{}) { set := make([]string, 0, 1) for i := 0; i < len(args); i++ { // Make sure the next argument is a flag and skip if not set @@ -1160,25 +1414,25 @@ 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, DeveloperFlag, TestnetFlag, RinkebyFlag) - checkExclusive(ctx, LightServFlag, SyncModeFlag, "light") + CheckExclusive(ctx, DeveloperFlag, TestnetFlag, RinkebyFlag, GoerliFlag) + CheckExclusive(ctx, LightLegacyServFlag, LightServeFlag, SyncModeFlag, "light") + CheckExclusive(ctx, DeveloperFlag, ExternalSignerFlag) // Can't use both ephemeral unlocked and external signer - ks := stack.AccountManager().Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) + var ks *keystore.KeyStore + if keystores := stack.AccountManager().Backends(keystore.KeyStoreType); len(keystores) > 0 { + ks = keystores[0].(*keystore.KeyStore) + } setEtherbase(ctx, ks, cfg) setGPO(ctx, &cfg.GPO) setTxPool(ctx, &cfg.TxPool) setEthash(ctx, cfg) + setMiner(ctx, &cfg.Miner) setWhitelist(ctx, cfg) + setLes(ctx, cfg) if ctx.GlobalIsSet(SyncModeFlag.Name) { cfg.SyncMode = *GlobalTextMarshaler(ctx, SyncModeFlag.Name).(*downloader.SyncMode) } - if ctx.GlobalIsSet(LightServFlag.Name) { - cfg.LightServ = ctx.GlobalInt(LightServFlag.Name) - } - if ctx.GlobalIsSet(LightPeersFlag.Name) { - cfg.LightPeers = ctx.GlobalInt(LightPeersFlag.Name) - } if ctx.GlobalIsSet(NetworkIdFlag.Name) { cfg.NetworkId = ctx.GlobalUint64(NetworkIdFlag.Name) } @@ -1186,51 +1440,28 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { cfg.DatabaseCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheDatabaseFlag.Name) / 100 } cfg.DatabaseHandles = makeDatabaseHandles() + if ctx.GlobalIsSet(AncientFlag.Name) { + cfg.DatabaseFreezer = ctx.GlobalString(AncientFlag.Name) + } if gcmode := ctx.GlobalString(GCModeFlag.Name); gcmode != "full" && gcmode != "archive" { Fatalf("--%s must be either 'full' or 'archive'", GCModeFlag.Name) } - cfg.NoPruning = ctx.GlobalString(GCModeFlag.Name) == "archive" - + if ctx.GlobalIsSet(GCModeFlag.Name) { + cfg.NoPruning = ctx.GlobalString(GCModeFlag.Name) == "archive" + } + if ctx.GlobalIsSet(CacheNoPrefetchFlag.Name) { + cfg.NoPrefetch = ctx.GlobalBool(CacheNoPrefetchFlag.Name) + } if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheTrieFlag.Name) { cfg.TrieCleanCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheTrieFlag.Name) / 100 } if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheGCFlag.Name) { cfg.TrieDirtyCache = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheGCFlag.Name) / 100 } - if ctx.GlobalIsSet(MinerNotifyFlag.Name) { - cfg.MinerNotify = strings.Split(ctx.GlobalString(MinerNotifyFlag.Name), ",") - } if ctx.GlobalIsSet(DocRootFlag.Name) { cfg.DocRoot = ctx.GlobalString(DocRootFlag.Name) } - if ctx.GlobalIsSet(MinerLegacyExtraDataFlag.Name) { - cfg.MinerExtraData = []byte(ctx.GlobalString(MinerLegacyExtraDataFlag.Name)) - } - if ctx.GlobalIsSet(MinerExtraDataFlag.Name) { - cfg.MinerExtraData = []byte(ctx.GlobalString(MinerExtraDataFlag.Name)) - } - if ctx.GlobalIsSet(MinerLegacyGasTargetFlag.Name) { - cfg.MinerGasFloor = ctx.GlobalUint64(MinerLegacyGasTargetFlag.Name) - } - if ctx.GlobalIsSet(MinerGasTargetFlag.Name) { - cfg.MinerGasFloor = ctx.GlobalUint64(MinerGasTargetFlag.Name) - } - if ctx.GlobalIsSet(MinerGasLimitFlag.Name) { - cfg.MinerGasCeil = ctx.GlobalUint64(MinerGasLimitFlag.Name) - } - if ctx.GlobalIsSet(MinerLegacyGasPriceFlag.Name) { - cfg.MinerGasPrice = GlobalBig(ctx, MinerLegacyGasPriceFlag.Name) - } - if ctx.GlobalIsSet(MinerGasPriceFlag.Name) { - cfg.MinerGasPrice = GlobalBig(ctx, MinerGasPriceFlag.Name) - } - if ctx.GlobalIsSet(MinerRecommitIntervalFlag.Name) { - cfg.MinerRecommit = ctx.Duration(MinerRecommitIntervalFlag.Name) - } - if ctx.GlobalIsSet(MinerNoVerfiyFlag.Name) { - cfg.MinerNoverify = ctx.Bool(MinerNoVerfiyFlag.Name) - } if ctx.GlobalIsSet(VMEnableDebugFlag.Name) { // TODO(fjl): force-enable this in --dev mode cfg.EnablePreimageRecording = ctx.GlobalBool(VMEnableDebugFlag.Name) @@ -1243,6 +1474,9 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { if ctx.GlobalIsSet(EVMInterpreterFlag.Name) { cfg.EVMInterpreter = ctx.GlobalString(EVMInterpreterFlag.Name) } + if ctx.GlobalIsSet(RPCGlobalGasCap.Name) { + cfg.RPCGasCap = new(big.Int).SetUint64(ctx.GlobalUint64(RPCGlobalGasCap.Name)) + } // Override any default configs for hard coded networks. switch { @@ -1256,6 +1490,11 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { cfg.NetworkId = 4 } cfg.Genesis = core.DefaultRinkebyGenesisBlock() + case ctx.GlobalBool(GoerliFlag.Name): + if !ctx.GlobalIsSet(NetworkIdFlag.Name) { + cfg.NetworkId = 5 + } + cfg.Genesis = core.DefaultGoerliGenesisBlock() case ctx.GlobalBool(DeveloperFlag.Name): if !ctx.GlobalIsSet(NetworkIdFlag.Name) { cfg.NetworkId = 1337 @@ -1280,20 +1519,9 @@ func SetEthConfig(ctx *cli.Context, stack *node.Node, cfg *eth.Config) { cfg.Genesis = core.DeveloperGenesisBlock(uint64(ctx.GlobalInt(DeveloperPeriodFlag.Name)), developer.Address) if !ctx.GlobalIsSet(MinerGasPriceFlag.Name) && !ctx.GlobalIsSet(MinerLegacyGasPriceFlag.Name) { - cfg.MinerGasPrice = big.NewInt(1) + cfg.Miner.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) } // RegisterEthService adds an Ethereum client to the stack. @@ -1318,13 +1546,6 @@ func RegisterEthService(stack *node.Node, cfg *eth.Config) { } } -// RegisterDashboardService adds a dashboard to the stack. -func RegisterDashboardService(stack *node.Node, cfg *dashboard.Config, commit string) { - stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { - return dashboard.New(cfg, commit, ctx.ResolvePath("logs")), nil - }) -} - // 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) { @@ -1345,12 +1566,33 @@ func RegisterEthStatsService(stack *node.Node, url string) { var lesServ *les.LightEthereum ctx.Service(&lesServ) + // Let ethstats use whichever is not nil return ethstats.New(url, ethServ, lesServ) }); err != nil { Fatalf("Failed to register the Ethereum Stats service: %v", err) } } +// RegisterGraphQLService is a utility function to construct a new service and register it against a node. +func RegisterGraphQLService(stack *node.Node, endpoint string, cors, vhosts []string, timeouts rpc.HTTPTimeouts) { + if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { + // Try to construct the GraphQL service backed by a full node + var ethServ *eth.Ethereum + if err := ctx.Service(ðServ); err == nil { + return graphql.New(ethServ.APIBackend, endpoint, cors, vhosts, timeouts) + } + // Try to construct the GraphQL service backed by a light node + var lesServ *les.LightEthereum + if err := ctx.Service(&lesServ); err == nil { + return graphql.New(lesServ.ApiBackend, endpoint, cors, vhosts, timeouts) + } + // Well, this should not have happened, bail out + return nil, errors.New("no Ethereum service") + }); err != nil { + Fatalf("Failed to register the GraphQL service: %v", err) + } +} + func SetupMetrics(ctx *cli.Context) { if metrics.Enabled { log.Info("Enabling metrics collection") @@ -1360,16 +1602,33 @@ func SetupMetrics(ctx *cli.Context) { database = ctx.GlobalString(MetricsInfluxDBDatabaseFlag.Name) username = ctx.GlobalString(MetricsInfluxDBUsernameFlag.Name) password = ctx.GlobalString(MetricsInfluxDBPasswordFlag.Name) - hosttag = ctx.GlobalString(MetricsInfluxDBHostTagFlag.Name) ) if enableExport { + tagsMap := SplitTagsFlag(ctx.GlobalString(MetricsInfluxDBTagsFlag.Name)) + log.Info("Enabling metrics export to InfluxDB") - go influxdb.InfluxDBWithTags(metrics.DefaultRegistry, 10*time.Second, endpoint, database, username, password, "geth.", map[string]string{ - "host": hosttag, - }) + + go influxdb.InfluxDBWithTags(metrics.DefaultRegistry, 10*time.Second, endpoint, database, username, password, "geth.", tagsMap) + } + } +} + +func SplitTagsFlag(tagsFlag string) map[string]string { + tags := strings.Split(tagsFlag, ",") + tagsMap := map[string]string{} + + for _, t := range tags { + if t != "" { + kv := strings.Split(t, "=") + + if len(kv) == 2 { + tagsMap[kv[0]] = kv[1] + } } } + + return tagsMap } // MakeChainDatabase open an LevelDB using the flags passed to the client and will hard crash if it fails. @@ -1382,7 +1641,7 @@ func MakeChainDatabase(ctx *cli.Context, stack *node.Node) ethdb.Database { if ctx.GlobalString(SyncModeFlag.Name) == "light" { name = "lightchaindata" } - chainDb, err := stack.OpenDatabase(name, cache, handles) + chainDb, err := stack.OpenDatabaseWithFreezer(name, cache, handles, ctx.GlobalString(AncientFlag.Name), "") if err != nil { Fatalf("Could not open database: %v", err) } @@ -1396,6 +1655,8 @@ func MakeGenesis(ctx *cli.Context) *core.Genesis { genesis = core.DefaultTestnetGenesisBlock() case ctx.GlobalBool(RinkebyFlag.Name): genesis = core.DefaultRinkebyGenesisBlock() + case ctx.GlobalBool(GoerliFlag.Name): + genesis = core.DefaultGoerliGenesisBlock() case ctx.GlobalBool(DeveloperFlag.Name): Fatalf("Developer chains are ephemeral") } @@ -1430,10 +1691,11 @@ func MakeChain(ctx *cli.Context, stack *node.Node) (chain *core.BlockChain, chai Fatalf("--%s must be either 'full' or 'archive'", GCModeFlag.Name) } cache := &core.CacheConfig{ - Disabled: ctx.GlobalString(GCModeFlag.Name) == "archive", - TrieCleanLimit: eth.DefaultConfig.TrieCleanCache, - TrieDirtyLimit: eth.DefaultConfig.TrieDirtyCache, - TrieTimeLimit: eth.DefaultConfig.TrieTimeout, + TrieCleanLimit: eth.DefaultConfig.TrieCleanCache, + TrieCleanNoPrefetch: ctx.GlobalBool(CacheNoPrefetchFlag.Name), + TrieDirtyLimit: eth.DefaultConfig.TrieDirtyCache, + TrieDirtyDisabled: ctx.GlobalString(GCModeFlag.Name) == "archive", + TrieTimeLimit: eth.DefaultConfig.TrieTimeout, } if ctx.GlobalIsSet(CacheFlag.Name) || ctx.GlobalIsSet(CacheTrieFlag.Name) { cache.TrieCleanLimit = ctx.GlobalInt(CacheFlag.Name) * ctx.GlobalInt(CacheTrieFlag.Name) / 100 @@ -1457,7 +1719,7 @@ func MakeConsolePreloads(ctx *cli.Context) []string { return nil } // Otherwise resolve absolute paths and return them - preloads := []string{} + var preloads []string assets := ctx.GlobalString(JSpathFlag.Name) for _, file := range strings.Split(ctx.GlobalString(PreloadJSFlag.Name), ",") { diff --git a/cmd/utils/flags_test.go b/cmd/utils/flags_test.go new file mode 100644 index 000000000000..adfdd0903e8d --- /dev/null +++ b/cmd/utils/flags_test.go @@ -0,0 +1,64 @@ +// Copyright 2019 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 utils contains internal helper functions for go-ethereum commands. +package utils + +import ( + "reflect" + "testing" +) + +func Test_SplitTagsFlag(t *testing.T) { + tests := []struct { + name string + args string + want map[string]string + }{ + { + "2 tags case", + "host=localhost,bzzkey=123", + map[string]string{ + "host": "localhost", + "bzzkey": "123", + }, + }, + { + "1 tag case", + "host=localhost123", + map[string]string{ + "host": "localhost123", + }, + }, + { + "empty case", + "", + map[string]string{}, + }, + { + "garbage", + "smth=smthelse=123", + map[string]string{}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := SplitTagsFlag(tt.args); !reflect.DeepEqual(got, tt.want) { + t.Errorf("splitTagsFlag() = %v, want %v", got, tt.want) + } + }) + } +} diff --git a/cmd/wnode/main.go b/cmd/wnode/main.go index 88a7cab86ac3..968f1fd49f6f 100644 --- a/cmd/wnode/main.go +++ b/cmd/wnode/main.go @@ -35,16 +35,17 @@ import ( "strings" "time" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/console" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/nat" - "github.com/nebulaai/nbai-node/whisper/mailserver" - whisper "github.com/nebulaai/nbai-node/whisper/whisperv6" + "github.com/ethereum/go-ethereum/cmd/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/console" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/nat" + "github.com/ethereum/go-ethereum/whisper/mailserver" + whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" "golang.org/x/crypto/pbkdf2" ) @@ -97,7 +98,7 @@ var ( argPoW = flag.Float64("pow", whisper.DefaultMinimumPoW, "PoW for normal messages in float format (e.g. 2.7)") argServerPoW = flag.Float64("mspow", whisper.DefaultMinimumPoW, "PoW requirement for Mail Server request") - argIP = flag.String("ip", "", "IP address and port of this node (e.g. 127.0.0.1:30332)") + argIP = flag.String("ip", "", "IP address and port of this node (e.g. 127.0.0.1:30303)") argPub = flag.String("pub", "", "public key for asymmetric encryption") argDBPath = flag.String("dbpath", "", "path to the server's DB directory") argIDFile = flag.String("idfile", "", "file name with node id (private key)") @@ -165,7 +166,7 @@ func echo() { fmt.Printf("pow = %f \n", *argPoW) fmt.Printf("mspow = %f \n", *argServerPoW) fmt.Printf("ip = %s \n", *argIP) - fmt.Printf("pub = %s \n", common.ToHex(crypto.FromECDSAPub(pub))) + fmt.Printf("pub = %s \n", hexutil.Encode(crypto.FromECDSAPub(pub))) fmt.Printf("idfile = %s \n", *argIDFile) fmt.Printf("dbpath = %s \n", *argDBPath) fmt.Printf("boot = %s \n", *argEnode) @@ -203,7 +204,7 @@ func initialize() { if len(*argEnode) == 0 { argEnode = scanLineA("Please enter the peer's enode: ") } - peer := enode.MustParseV4(*argEnode) + peer := enode.MustParse(*argEnode) peers = append(peers, peer) } @@ -298,7 +299,7 @@ func startServer() error { return err } - fmt.Printf("my public key: %s \n", common.ToHex(crypto.FromECDSAPub(&asymKey.PublicKey))) + fmt.Printf("my public key: %s \n", hexutil.Encode(crypto.FromECDSAPub(&asymKey.PublicKey))) fmt.Println(server.NodeInfo().Enode) if *bootstrapMode { @@ -356,7 +357,7 @@ func configureNode() { if len(symPass) == 0 { symPass, err = console.Stdin.PromptPassword("Please enter the password for symmetric encryption: ") if err != nil { - utils.Fatalf("Failed to read passphrase: %v", err) + utils.Fatalf("Failed to read password: %v", err) } } @@ -747,9 +748,9 @@ func requestExpiredMessagesLoop() { } func extractIDFromEnode(s string) []byte { - n, err := enode.ParseV4(s) + n, err := enode.Parse(enode.ValidSchemes, s) if err != nil { - utils.Fatalf("Failed to parse enode: %s", err) + utils.Fatalf("Failed to parse node: %s", err) } return n.ID().Bytes() } diff --git a/common/bitutil/bitutil_test.go b/common/bitutil/bitutil_test.go index 93647031ef84..307bf731f765 100644 --- a/common/bitutil/bitutil_test.go +++ b/common/bitutil/bitutil_test.go @@ -190,6 +190,8 @@ func benchmarkBaseOR(b *testing.B, size int) { } } +var GloBool bool // Exported global will not be dead-code eliminated, at least not yet. + // Benchmarks the potentially optimized bit testing performance. func BenchmarkFastTest1KB(b *testing.B) { benchmarkFastTest(b, 1024) } func BenchmarkFastTest2KB(b *testing.B) { benchmarkFastTest(b, 2048) } @@ -197,9 +199,11 @@ func BenchmarkFastTest4KB(b *testing.B) { benchmarkFastTest(b, 4096) } func benchmarkFastTest(b *testing.B, size int) { p := make([]byte, size) + a := false for i := 0; i < b.N; i++ { - TestBytes(p) + a = a != TestBytes(p) } + GloBool = a // Use of benchmark "result" to prevent total dead code elimination. } // Benchmarks the baseline bit testing performance. @@ -209,7 +213,9 @@ func BenchmarkBaseTest4KB(b *testing.B) { benchmarkBaseTest(b, 4096) } func benchmarkBaseTest(b *testing.B, size int) { p := make([]byte, size) + a := false for i := 0; i < b.N; i++ { - safeTestBytes(p) + a = a != safeTestBytes(p) } + GloBool = a // Use of benchmark "result" to prevent total dead code elimination. } diff --git a/common/bitutil/compress_test.go b/common/bitutil/compress_test.go index ed2482d716f4..13a13011dcb8 100644 --- a/common/bitutil/compress_test.go +++ b/common/bitutil/compress_test.go @@ -21,7 +21,7 @@ import ( "math/rand" "testing" - "github.com/nebulaai/nbai-node/common/hexutil" + "github.com/ethereum/go-ethereum/common/hexutil" ) // Tests that data bitset encoding and decoding works and is bijective. diff --git a/common/bytes.go b/common/bytes.go index c82e61624187..fa457b92cf3a 100644 --- a/common/bytes.go +++ b/common/bytes.go @@ -43,10 +43,8 @@ func ToHexArray(b [][]byte) []string { // FromHex returns the bytes represented by the hexadecimal string s. // s may be prefixed with "0x". func FromHex(s string) []byte { - if len(s) > 1 { - if s[0:2] == "0x" || s[0:2] == "0X" { - s = s[2:] - } + if has0xPrefix(s) { + s = s[2:] } if len(s)%2 == 1 { s = "0" + s @@ -65,8 +63,8 @@ func CopyBytes(b []byte) (copiedBytes []byte) { return } -// hasHexPrefix validates str begins with '0x' or '0X'. -func hasHexPrefix(str string) bool { +// has0xPrefix validates str begins with '0x' or '0X'. +func has0xPrefix(str string) bool { return len(str) >= 2 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X') } @@ -136,3 +134,14 @@ func LeftPadBytes(slice []byte, l int) []byte { return padded } + +// TrimLeftZeroes returns a subslice of s without leading zeroes +func TrimLeftZeroes(s []byte) []byte { + idx := 0 + for ; idx < len(s); idx++ { + if s[idx] != 0 { + break + } + } + return s[idx:] +} diff --git a/common/bytes_test.go b/common/bytes_test.go index 97dd34d159de..7cf6553377fd 100644 --- a/common/bytes_test.go +++ b/common/bytes_test.go @@ -19,41 +19,43 @@ package common import ( "bytes" "testing" - - checker "gopkg.in/check.v1" ) -type BytesSuite struct{} - -var _ = checker.Suite(&BytesSuite{}) +func TestCopyBytes(t *testing.T) { + input := []byte{1, 2, 3, 4} -func (s *BytesSuite) TestCopyBytes(c *checker.C) { - data1 := []byte{1, 2, 3, 4} - exp1 := []byte{1, 2, 3, 4} - res1 := CopyBytes(data1) - c.Assert(res1, checker.DeepEquals, exp1) + v := CopyBytes(input) + if !bytes.Equal(v, []byte{1, 2, 3, 4}) { + t.Fatal("not equal after copy") + } + v[0] = 99 + if bytes.Equal(v, input) { + t.Fatal("result is not a copy") + } } -func (s *BytesSuite) TestLeftPadBytes(c *checker.C) { - val1 := []byte{1, 2, 3, 4} - exp1 := []byte{0, 0, 0, 0, 1, 2, 3, 4} - - res1 := LeftPadBytes(val1, 8) - res2 := LeftPadBytes(val1, 2) +func TestLeftPadBytes(t *testing.T) { + val := []byte{1, 2, 3, 4} + padded := []byte{0, 0, 0, 0, 1, 2, 3, 4} - c.Assert(res1, checker.DeepEquals, exp1) - c.Assert(res2, checker.DeepEquals, val1) + if r := LeftPadBytes(val, 8); !bytes.Equal(r, padded) { + t.Fatalf("LeftPadBytes(%v, 8) == %v", val, r) + } + if r := LeftPadBytes(val, 2); !bytes.Equal(r, val) { + t.Fatalf("LeftPadBytes(%v, 2) == %v", val, r) + } } -func (s *BytesSuite) TestRightPadBytes(c *checker.C) { +func TestRightPadBytes(t *testing.T) { val := []byte{1, 2, 3, 4} - exp := []byte{1, 2, 3, 4, 0, 0, 0, 0} - - resstd := RightPadBytes(val, 8) - resshrt := RightPadBytes(val, 2) + padded := []byte{1, 2, 3, 4, 0, 0, 0, 0} - c.Assert(resstd, checker.DeepEquals, exp) - c.Assert(resshrt, checker.DeepEquals, val) + if r := RightPadBytes(val, 8); !bytes.Equal(r, padded) { + t.Fatalf("RightPadBytes(%v, 8) == %v", val, r) + } + if r := RightPadBytes(val, 2); !bytes.Equal(r, val) { + t.Fatalf("RightPadBytes(%v, 2) == %v", val, r) + } } func TestFromHex(t *testing.T) { diff --git a/common/compiler/helpers.go b/common/compiler/helpers.go new file mode 100644 index 000000000000..5ed640de8f0e --- /dev/null +++ b/common/compiler/helpers.go @@ -0,0 +1,65 @@ +// Copyright 2019 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 compiler wraps the Solidity and Vyper compiler executables (solc; vyper). +package compiler + +import ( + "bytes" + "io/ioutil" + "regexp" +) + +var versionRegexp = regexp.MustCompile(`([0-9]+)\.([0-9]+)\.([0-9]+)`) + +// Contract contains information about a compiled contract, alongside its code and runtime code. +type Contract struct { + Code string `json:"code"` + RuntimeCode string `json:"runtime-code"` + Info ContractInfo `json:"info"` + Hashes map[string]string `json:"hashes"` +} + +// ContractInfo contains information about a compiled contract, including access +// to the ABI definition, source mapping, user and developer docs, and metadata. +// +// Depending on the source, language version, compiler version, and compiler +// options will provide information about how the contract was compiled. +type ContractInfo struct { + Source string `json:"source"` + Language string `json:"language"` + LanguageVersion string `json:"languageVersion"` + CompilerVersion string `json:"compilerVersion"` + CompilerOptions string `json:"compilerOptions"` + SrcMap interface{} `json:"srcMap"` + SrcMapRuntime string `json:"srcMapRuntime"` + AbiDefinition interface{} `json:"abiDefinition"` + UserDoc interface{} `json:"userDoc"` + DeveloperDoc interface{} `json:"developerDoc"` + Metadata string `json:"metadata"` +} + +func slurpFiles(files []string) (string, error) { + var concat bytes.Buffer + for _, file := range files { + content, err := ioutil.ReadFile(file) + if err != nil { + return "", err + } + concat.Write(content) + } + return concat.String(), nil +} diff --git a/common/compiler/solidity.go b/common/compiler/solidity.go index b7c8ec5638b4..b689f258a369 100644 --- a/common/compiler/solidity.go +++ b/common/compiler/solidity.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package compiler wraps the Solidity compiler executable (solc). +// Package compiler wraps the Solidity and Vyper compiler executables (solc; vyper). package compiler import ( @@ -22,41 +22,11 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" "os/exec" - "regexp" "strconv" "strings" ) -var versionRegexp = regexp.MustCompile(`([0-9]+)\.([0-9]+)\.([0-9]+)`) - -// Contract contains information about a compiled contract, alongside its code and runtime code. -type Contract struct { - Code string `json:"code"` - RuntimeCode string `json:"runtime-code"` - Info ContractInfo `json:"info"` -} - -// ContractInfo contains information about a compiled contract, including access -// to the ABI definition, source mapping, user and developer docs, and metadata. -// -// Depending on the source, language version, compiler version, and compiler -// options will provide information about how the contract was compiled. -type ContractInfo struct { - Source string `json:"source"` - Language string `json:"language"` - LanguageVersion string `json:"languageVersion"` - CompilerVersion string `json:"compilerVersion"` - CompilerOptions string `json:"compilerOptions"` - SrcMap string `json:"srcMap"` - SrcMapRuntime string `json:"srcMapRuntime"` - AbiDefinition interface{} `json:"abiDefinition"` - UserDoc interface{} `json:"userDoc"` - DeveloperDoc interface{} `json:"developerDoc"` - Metadata string `json:"metadata"` -} - // Solidity contains information about the solidity compiler. type Solidity struct { Path, Version, FullVersion string @@ -69,6 +39,7 @@ type solcOutput struct { BinRuntime string `json:"bin-runtime"` SrcMapRuntime string `json:"srcmap-runtime"` Bin, SrcMap, Abi, Devdoc, Userdoc, Metadata string + Hashes map[string]string } Version string } @@ -76,10 +47,11 @@ type solcOutput struct { func (s *Solidity) makeArgs() []string { p := []string{ "--combined-json", "bin,bin-runtime,srcmap,srcmap-runtime,abi,userdoc,devdoc", - "--optimize", // code optimizer switched on + "--optimize", // code optimizer switched on + "--allow-paths", "., ./, ../", // default to support relative paths } if s.Major > 0 || s.Minor > 4 || s.Patch > 6 { - p[1] += ",metadata" + p[1] += ",metadata,hashes" } return p } @@ -171,7 +143,6 @@ func ParseCombinedJSON(combinedJSON []byte, source string, languageVersion strin if err := json.Unmarshal(combinedJSON, &output); err != nil { return nil, err } - // Compilation succeeded, assemble and return the contracts. contracts := make(map[string]*Contract) for name, info := range output.Contracts { @@ -180,17 +151,14 @@ func ParseCombinedJSON(combinedJSON []byte, source string, languageVersion strin if err := json.Unmarshal([]byte(info.Abi), &abi); err != nil { return nil, fmt.Errorf("solc: error reading abi definition (%v)", err) } - var userdoc interface{} - if err := json.Unmarshal([]byte(info.Userdoc), &userdoc); err != nil { - return nil, fmt.Errorf("solc: error reading user doc: %v", err) - } - var devdoc interface{} - if err := json.Unmarshal([]byte(info.Devdoc), &devdoc); err != nil { - return nil, fmt.Errorf("solc: error reading dev doc: %v", err) - } + var userdoc, devdoc interface{} + json.Unmarshal([]byte(info.Userdoc), &userdoc) + json.Unmarshal([]byte(info.Devdoc), &devdoc) + contracts[name] = &Contract{ Code: "0x" + info.Bin, RuntimeCode: "0x" + info.BinRuntime, + Hashes: info.Hashes, Info: ContractInfo{ Source: source, Language: "Solidity", @@ -208,15 +176,3 @@ func ParseCombinedJSON(combinedJSON []byte, source string, languageVersion strin } return contracts, nil } - -func slurpFiles(files []string) (string, error) { - var concat bytes.Buffer - for _, file := range files { - content, err := ioutil.ReadFile(file) - if err != nil { - return "", err - } - concat.Write(content) - } - return concat.String(), nil -} diff --git a/common/compiler/solidity_test.go b/common/compiler/solidity_test.go index 0da3bb337e89..491e3665e2c0 100644 --- a/common/compiler/solidity_test.go +++ b/common/compiler/solidity_test.go @@ -23,9 +23,10 @@ import ( const ( testSource = ` +pragma solidity >0.0.0; contract test { /// @notice Will multiply ` + "`a`" + ` by 7. - function multiply(uint a) returns(uint d) { + function multiply(uint a) public returns(uint d) { return a * 7; } } @@ -38,7 +39,7 @@ func skipWithoutSolc(t *testing.T) { } } -func TestCompiler(t *testing.T) { +func TestSolidityCompiler(t *testing.T) { skipWithoutSolc(t) contracts, err := CompileSolidityString("", testSource) @@ -66,7 +67,7 @@ func TestCompiler(t *testing.T) { } } -func TestCompileError(t *testing.T) { +func TestSolidityCompileError(t *testing.T) { skipWithoutSolc(t) contracts, err := CompileSolidityString("", testSource[4:]) diff --git a/common/compiler/test.v.py b/common/compiler/test.v.py new file mode 100644 index 000000000000..35af56c8f6ef --- /dev/null +++ b/common/compiler/test.v.py @@ -0,0 +1,3 @@ +@public +def test(): + hello: int128 diff --git a/common/compiler/test_bad.v.py b/common/compiler/test_bad.v.py new file mode 100644 index 000000000000..443ef7826325 --- /dev/null +++ b/common/compiler/test_bad.v.py @@ -0,0 +1,3 @@ +lic +def test(): + hello: int128 diff --git a/common/compiler/vyper.go b/common/compiler/vyper.go new file mode 100644 index 000000000000..a9bca95e5901 --- /dev/null +++ b/common/compiler/vyper.go @@ -0,0 +1,144 @@ +// Copyright 2019 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 compiler wraps the Solidity and Vyper compiler executables (solc; vyper). +package compiler + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "os/exec" + "strconv" + "strings" +) + +// Vyper contains information about the vyper compiler. +type Vyper struct { + Path, Version, FullVersion string + Major, Minor, Patch int +} + +func (s *Vyper) makeArgs() []string { + p := []string{ + "-f", "combined_json", + } + return p +} + +// VyperVersion runs vyper and parses its version output. +func VyperVersion(vyper string) (*Vyper, error) { + if vyper == "" { + vyper = "vyper" + } + var out bytes.Buffer + cmd := exec.Command(vyper, "--version") + cmd.Stdout = &out + err := cmd.Run() + if err != nil { + return nil, err + } + matches := versionRegexp.FindStringSubmatch(out.String()) + if len(matches) != 4 { + return nil, fmt.Errorf("can't parse vyper version %q", out.String()) + } + s := &Vyper{Path: cmd.Path, FullVersion: out.String(), Version: matches[0]} + if s.Major, err = strconv.Atoi(matches[1]); err != nil { + return nil, err + } + if s.Minor, err = strconv.Atoi(matches[2]); err != nil { + return nil, err + } + if s.Patch, err = strconv.Atoi(matches[3]); err != nil { + return nil, err + } + return s, nil +} + +// CompileVyper compiles all given Vyper source files. +func CompileVyper(vyper string, sourcefiles ...string) (map[string]*Contract, error) { + if len(sourcefiles) == 0 { + return nil, errors.New("vyper: no source files") + } + source, err := slurpFiles(sourcefiles) + if err != nil { + return nil, err + } + s, err := VyperVersion(vyper) + if err != nil { + return nil, err + } + args := s.makeArgs() + cmd := exec.Command(s.Path, append(args, sourcefiles...)...) + return s.run(cmd, source) +} + +func (s *Vyper) run(cmd *exec.Cmd, source string) (map[string]*Contract, error) { + var stderr, stdout bytes.Buffer + cmd.Stderr = &stderr + cmd.Stdout = &stdout + if err := cmd.Run(); err != nil { + return nil, fmt.Errorf("vyper: %v\n%s", err, stderr.Bytes()) + } + + return ParseVyperJSON(stdout.Bytes(), source, s.Version, s.Version, strings.Join(s.makeArgs(), " ")) +} + +// ParseVyperJSON takes the direct output of a vyper --f combined_json run and +// parses it into a map of string contract name to Contract structs. The +// provided source, language and compiler version, and compiler options are all +// passed through into the Contract structs. +// +// The vyper output is expected to contain ABI and source mapping. +// +// Returns an error if the JSON is malformed or missing data, or if the JSON +// embedded within the JSON is malformed. +func ParseVyperJSON(combinedJSON []byte, source string, languageVersion string, compilerVersion string, compilerOptions string) (map[string]*Contract, error) { + var output map[string]interface{} + if err := json.Unmarshal(combinedJSON, &output); err != nil { + return nil, err + } + + // Compilation succeeded, assemble and return the contracts. + contracts := make(map[string]*Contract) + for name, info := range output { + // Parse the individual compilation results. + if name == "version" { + continue + } + c := info.(map[string]interface{}) + + contracts[name] = &Contract{ + Code: c["bytecode"].(string), + RuntimeCode: c["bytecode_runtime"].(string), + Info: ContractInfo{ + Source: source, + Language: "Vyper", + LanguageVersion: languageVersion, + CompilerVersion: compilerVersion, + CompilerOptions: compilerOptions, + SrcMap: c["source_map"], + SrcMapRuntime: "", + AbiDefinition: c["abi"], + UserDoc: "", + DeveloperDoc: "", + Metadata: "", + }, + } + } + return contracts, nil +} diff --git a/common/compiler/vyper_test.go b/common/compiler/vyper_test.go new file mode 100644 index 000000000000..7761c92affc5 --- /dev/null +++ b/common/compiler/vyper_test.go @@ -0,0 +1,71 @@ +// Copyright 2019 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 compiler + +import ( + "os/exec" + "testing" +) + +func skipWithoutVyper(t *testing.T) { + if _, err := exec.LookPath("vyper"); err != nil { + t.Skip(err) + } +} + +func TestVyperCompiler(t *testing.T) { + skipWithoutVyper(t) + + testSource := []string{"test.v.py"} + source, err := slurpFiles(testSource) + if err != nil { + t.Error("couldn't read test files") + } + contracts, err := CompileVyper("", testSource...) + if err != nil { + t.Fatalf("error compiling test.v.py. result %v: %v", contracts, err) + } + if len(contracts) != 1 { + t.Errorf("one contract expected, got %d", len(contracts)) + } + c, ok := contracts["test.v.py"] + if !ok { + c, ok = contracts[":test"] + if !ok { + t.Fatal("info for contract 'test.v.py' not present in result") + } + } + if c.Code == "" { + t.Error("empty code") + } + if c.Info.Source != source { + t.Error("wrong source") + } + if c.Info.CompilerVersion == "" { + t.Error("empty version") + } +} + +func TestVyperCompileError(t *testing.T) { + skipWithoutVyper(t) + + contracts, err := CompileVyper("", "test_bad.v.py") + if err == nil { + t.Errorf("error expected compiling test_bad.v.py. got none. result %v", contracts) + } + t.Logf("error: %v", err) +} diff --git a/common/debug.go b/common/debug.go index 9b2d329136be..61acd8ce70f8 100644 --- a/common/debug.go +++ b/common/debug.go @@ -26,7 +26,7 @@ import ( // Report gives off a warning requesting the user to submit an issue to the github tracker. func Report(extra ...interface{}) { - fmt.Fprintln(os.Stderr, "You've encountered a sought after, hard to reproduce bug. Please report this to the developers <3 https://github.com/nebulaai/nbai-node/issues") + fmt.Fprintln(os.Stderr, "You've encountered a sought after, hard to reproduce bug. Please report this to the developers <3 https://github.com/ethereum/go-ethereum/issues") fmt.Fprintln(os.Stderr, extra...) _, file, line, _ := runtime.Caller(1) diff --git a/common/fdlimit/fdlimit_darwin.go b/common/fdlimit/fdlimit_darwin.go new file mode 100644 index 000000000000..6b26fa00f12c --- /dev/null +++ b/common/fdlimit/fdlimit_darwin.go @@ -0,0 +1,71 @@ +// 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 fdlimit + +import "syscall" + +// hardlimit is the number of file descriptors allowed at max by the kernel. +const hardlimit = 10240 + +// Raise tries to maximize the file descriptor allowance of this process +// to the maximum hard-limit allowed by the OS. +// Returns the size it was set to (may differ from the desired 'max') +func Raise(max uint64) (uint64, error) { + // Get the current limit + var limit syscall.Rlimit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err + } + // Try to update the limit to the max allowance + limit.Cur = limit.Max + if limit.Cur > max { + limit.Cur = max + } + if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err + } + // MacOS can silently apply further caps, so retrieve the actually set limit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err + } + return limit.Cur, nil +} + +// Current retrieves the number of file descriptors allowed to be opened by this +// process. +func Current() (int, error) { + var limit syscall.Rlimit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err + } + return int(limit.Cur), nil +} + +// Maximum retrieves the maximum number of file descriptors this process is +// allowed to request for itself. +func Maximum() (int, error) { + // Retrieve the maximum allowed by dynamic OS limits + var limit syscall.Rlimit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err + } + // Cap it to OPEN_MAX (10240) because macos is a special snowflake + if limit.Max > hardlimit { + limit.Max = hardlimit + } + return int(limit.Max), nil +} diff --git a/common/fdlimit/fdlimit_freebsd.go b/common/fdlimit/fdlimit_freebsd.go index c126b0c26583..0d8727138e6d 100644 --- a/common/fdlimit/fdlimit_freebsd.go +++ b/common/fdlimit/fdlimit_freebsd.go @@ -26,11 +26,11 @@ import "syscall" // Raise tries to maximize the file descriptor allowance of this process // to the maximum hard-limit allowed by the OS. -func Raise(max uint64) error { +func Raise(max uint64) (uint64, error) { // Get the current limit var limit syscall.Rlimit if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { - return err + return 0, err } // Try to update the limit to the max allowance limit.Cur = limit.Max @@ -38,9 +38,12 @@ func Raise(max uint64) error { limit.Cur = int64(max) } if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { - return err + return 0, err + } + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err } - return nil + return uint64(limit.Cur), nil } // Current retrieves the number of file descriptors allowed to be opened by this diff --git a/common/fdlimit/fdlimit_test.go b/common/fdlimit/fdlimit_test.go index a9ee9ab36a9b..21362b8463a3 100644 --- a/common/fdlimit/fdlimit_test.go +++ b/common/fdlimit/fdlimit_test.go @@ -36,7 +36,7 @@ func TestFileDescriptorLimits(t *testing.T) { if limit, err := Current(); err != nil || limit <= 0 { t.Fatalf("failed to retrieve file descriptor limit (%d): %v", limit, err) } - if err := Raise(uint64(target)); err != nil { + if _, err := Raise(uint64(target)); err != nil { t.Fatalf("failed to raise file allowance") } if limit, err := Current(); err != nil || limit < target { diff --git a/common/fdlimit/fdlimit_unix.go b/common/fdlimit/fdlimit_unix.go index a258132353cd..e5a575f7a79d 100644 --- a/common/fdlimit/fdlimit_unix.go +++ b/common/fdlimit/fdlimit_unix.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build linux darwin netbsd openbsd solaris +// +build linux netbsd openbsd solaris package fdlimit @@ -22,11 +22,12 @@ import "syscall" // Raise tries to maximize the file descriptor allowance of this process // to the maximum hard-limit allowed by the OS. -func Raise(max uint64) error { +// Returns the size it was set to (may differ from the desired 'max') +func Raise(max uint64) (uint64, error) { // Get the current limit var limit syscall.Rlimit if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { - return err + return 0, err } // Try to update the limit to the max allowance limit.Cur = limit.Max @@ -34,9 +35,13 @@ func Raise(max uint64) error { limit.Cur = max } if err := syscall.Setrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { - return err + return 0, err + } + // MacOS can silently apply further caps, so retrieve the actually set limit + if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &limit); err != nil { + return 0, err } - return nil + return limit.Cur, nil } // Current retrieves the number of file descriptors allowed to be opened by this diff --git a/common/fdlimit/fdlimit_windows.go b/common/fdlimit/fdlimit_windows.go index 863c58bedfab..f472153662e6 100644 --- a/common/fdlimit/fdlimit_windows.go +++ b/common/fdlimit/fdlimit_windows.go @@ -16,28 +16,31 @@ package fdlimit -import "errors" +import "fmt" + +// hardlimit is the number of file descriptors allowed at max by the kernel. +const hardlimit = 16384 // Raise tries to maximize the file descriptor allowance of this process // to the maximum hard-limit allowed by the OS. -func Raise(max uint64) error { +func Raise(max uint64) (uint64, error) { // This method is NOP by design: // * Linux/Darwin counterparts need to manually increase per process limits // * On Windows Go uses the CreateFile API, which is limited to 16K files, non // changeable from within a running process // This way we can always "request" raising the limits, which will either have // or not have effect based on the platform we're running on. - if max > 16384 { - return errors.New("file descriptor limit (16384) reached") + if max > hardlimit { + return hardlimit, fmt.Errorf("file descriptor limit (%d) reached", hardlimit) } - return nil + return max, nil } // Current retrieves the number of file descriptors allowed to be opened by this // process. func Current() (int, error) { // Please see Raise for the reason why we use hard coded 16K as the limit - return 16384, nil + return hardlimit, nil } // Maximum retrieves the maximum number of file descriptors this process is diff --git a/common/hexutil/json.go b/common/hexutil/json.go index fbc21241c8ad..50db208118ee 100644 --- a/common/hexutil/json.go +++ b/common/hexutil/json.go @@ -72,6 +72,25 @@ func (b Bytes) String() string { return Encode(b) } +// ImplementsGraphQLType returns true if Bytes implements the specified GraphQL type. +func (b Bytes) ImplementsGraphQLType(name string) bool { return name == "Bytes" } + +// UnmarshalGraphQL unmarshals the provided GraphQL query data. +func (b *Bytes) UnmarshalGraphQL(input interface{}) error { + var err error + switch input := input.(type) { + case string: + data, err := Decode(input) + if err != nil { + return err + } + *b = data + default: + err = fmt.Errorf("unexpected type %T for Bytes", input) + } + return err +} + // UnmarshalFixedJSON decodes the input as a string with 0x prefix. The length of out // determines the required input length. This function is commonly used to implement the // UnmarshalJSON method for fixed-size types. @@ -187,6 +206,25 @@ func (b *Big) String() string { return EncodeBig(b.ToInt()) } +// ImplementsGraphQLType returns true if Big implements the provided GraphQL type. +func (b Big) ImplementsGraphQLType(name string) bool { return name == "BigInt" } + +// UnmarshalGraphQL unmarshals the provided GraphQL query data. +func (b *Big) UnmarshalGraphQL(input interface{}) error { + var err error + switch input := input.(type) { + case string: + return b.UnmarshalText([]byte(input)) + case int32: + var num big.Int + num.SetInt64(int64(input)) + *b = Big(num) + default: + err = fmt.Errorf("unexpected type %T for BigInt", input) + } + return err +} + // Uint64 marshals/unmarshals as a JSON string with 0x prefix. // The zero value marshals as "0x0". type Uint64 uint64 @@ -234,6 +272,23 @@ func (b Uint64) String() string { return EncodeUint64(uint64(b)) } +// ImplementsGraphQLType returns true if Uint64 implements the provided GraphQL type. +func (b Uint64) ImplementsGraphQLType(name string) bool { return name == "Long" } + +// UnmarshalGraphQL unmarshals the provided GraphQL query data. +func (b *Uint64) UnmarshalGraphQL(input interface{}) error { + var err error + switch input := input.(type) { + case string: + return b.UnmarshalText([]byte(input)) + case int32: + *b = Uint64(input) + default: + err = fmt.Errorf("unexpected type %T for Long", input) + } + return err +} + // Uint marshals/unmarshals as a JSON string with 0x prefix. // The zero value marshals as "0x0". type Uint uint diff --git a/common/hexutil/json_example_test.go b/common/hexutil/json_example_test.go index c1f3065650c0..80180d918686 100644 --- a/common/hexutil/json_example_test.go +++ b/common/hexutil/json_example_test.go @@ -20,7 +20,7 @@ import ( "encoding/json" "fmt" - "github.com/nebulaai/nbai-node/common/hexutil" + "github.com/ethereum/go-ethereum/common/hexutil" ) type MyType [5]byte diff --git a/common/main_test.go b/common/main_test.go deleted file mode 100644 index 149d09928a9c..000000000000 --- a/common/main_test.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package common - -import ( - "testing" - - checker "gopkg.in/check.v1" -) - -func Test(t *testing.T) { checker.TestingT(t) } diff --git a/common/math/big.go b/common/math/big.go index 9d2e7946d155..d31c59af10ab 100644 --- a/common/math/big.go +++ b/common/math/big.go @@ -42,6 +42,13 @@ const ( // HexOrDecimal256 marshals big.Int as hex or decimal. type HexOrDecimal256 big.Int +// NewHexOrDecimal256 creates a new HexOrDecimal256 +func NewHexOrDecimal256(x int64) *HexOrDecimal256 { + b := big.NewInt(x) + h := HexOrDecimal256(*b) + return &h +} + // UnmarshalText implements encoding.TextUnmarshaler. func (i *HexOrDecimal256) UnmarshalText(input []byte) error { bigint, ok := ParseBig256(string(input)) diff --git a/common/math/big_test.go b/common/math/big_test.go index 177c63daae81..be9810dc8cf5 100644 --- a/common/math/big_test.go +++ b/common/math/big_test.go @@ -22,7 +22,7 @@ import ( "math/big" "testing" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) func TestHexOrDecimal256(t *testing.T) { diff --git a/common/mclock/mclock.go b/common/mclock/mclock.go index dcac59c6ceaa..d0e0cd78be96 100644 --- a/common/mclock/mclock.go +++ b/common/mclock/mclock.go @@ -36,28 +36,39 @@ func (t AbsTime) Add(d time.Duration) AbsTime { return t + AbsTime(d) } -// Clock interface makes it possible to replace the monotonic system clock with +// The Clock interface makes it possible to replace the monotonic system clock with // a simulated clock. type Clock interface { Now() AbsTime Sleep(time.Duration) After(time.Duration) <-chan time.Time + AfterFunc(d time.Duration, f func()) Timer +} + +// Timer represents a cancellable event returned by AfterFunc +type Timer interface { + Stop() bool } // System implements Clock using the system clock. type System struct{} -// Now implements Clock. +// Now returns the current monotonic time. func (System) Now() AbsTime { return AbsTime(monotime.Now()) } -// Sleep implements Clock. +// Sleep blocks for the given duration. func (System) Sleep(d time.Duration) { time.Sleep(d) } -// After implements Clock. +// After returns a channel which receives the current time after d has elapsed. func (System) After(d time.Duration) <-chan time.Time { return time.After(d) } + +// AfterFunc runs f on a new goroutine after the duration has elapsed. +func (System) AfterFunc(d time.Duration, f func()) Timer { + return time.AfterFunc(d, f) +} diff --git a/common/mclock/simclock.go b/common/mclock/simclock.go index e014f56150ea..4d351252ff32 100644 --- a/common/mclock/simclock.go +++ b/common/mclock/simclock.go @@ -32,35 +32,45 @@ import ( // the timeout using a channel or semaphore. type Simulated struct { now AbsTime - scheduled []event + scheduled []*simTimer mu sync.RWMutex cond *sync.Cond + lastId uint64 } -type event struct { +// simTimer implements Timer on the virtual clock. +type simTimer struct { do func() at AbsTime + id uint64 + s *Simulated } // Run moves the clock by the given duration, executing all timers before that duration. func (s *Simulated) Run(d time.Duration) { s.mu.Lock() - defer s.mu.Unlock() s.init() end := s.now + AbsTime(d) + var do []func() for len(s.scheduled) > 0 { ev := s.scheduled[0] if ev.at > end { break } s.now = ev.at - ev.do() + do = append(do, ev.do) s.scheduled = s.scheduled[1:] } s.now = end + s.mu.Unlock() + + for _, fn := range do { + fn() + } } +// ActiveTimers returns the number of timers that haven't fired. func (s *Simulated) ActiveTimers() int { s.mu.RLock() defer s.mu.RUnlock() @@ -68,6 +78,7 @@ func (s *Simulated) ActiveTimers() int { return len(s.scheduled) } +// WaitForTimers waits until the clock has at least n scheduled timers. func (s *Simulated) WaitForTimers(n int) { s.mu.Lock() defer s.mu.Unlock() @@ -78,7 +89,7 @@ func (s *Simulated) WaitForTimers(n int) { } } -// Now implements Clock. +// Now returns the current virtual time. func (s *Simulated) Now() AbsTime { s.mu.RLock() defer s.mu.RUnlock() @@ -86,40 +97,62 @@ func (s *Simulated) Now() AbsTime { return s.now } -// Sleep implements Clock. +// Sleep blocks until the clock has advanced by d. func (s *Simulated) Sleep(d time.Duration) { <-s.After(d) } -// After implements Clock. +// After returns a channel which receives the current time after the clock +// has advanced by d. func (s *Simulated) After(d time.Duration) <-chan time.Time { after := make(chan time.Time, 1) - s.insert(d, func() { + s.AfterFunc(d, func() { after <- (time.Time{}).Add(time.Duration(s.now)) }) return after } -func (s *Simulated) insert(d time.Duration, do func()) { +// AfterFunc runs fn after the clock has advanced by d. Unlike with the system +// clock, fn runs on the goroutine that calls Run. +func (s *Simulated) AfterFunc(d time.Duration, fn func()) Timer { s.mu.Lock() defer s.mu.Unlock() s.init() at := s.now + AbsTime(d) + s.lastId++ + id := s.lastId l, h := 0, len(s.scheduled) ll := h for l != h { m := (l + h) / 2 - if at < s.scheduled[m].at { + if (at < s.scheduled[m].at) || ((at == s.scheduled[m].at) && (id < s.scheduled[m].id)) { h = m } else { l = m + 1 } } - s.scheduled = append(s.scheduled, event{}) + ev := &simTimer{do: fn, at: at, s: s} + s.scheduled = append(s.scheduled, nil) copy(s.scheduled[l+1:], s.scheduled[l:ll]) - s.scheduled[l] = event{do: do, at: at} + s.scheduled[l] = ev s.cond.Broadcast() + return ev +} + +func (ev *simTimer) Stop() bool { + s := ev.s + s.mu.Lock() + defer s.mu.Unlock() + + for i := 0; i < len(s.scheduled); i++ { + if s.scheduled[i] == ev { + s.scheduled = append(s.scheduled[:i], s.scheduled[i+1:]...) + s.cond.Broadcast() + return true + } + } + return false } func (s *Simulated) init() { diff --git a/common/mclock/simclock_test.go b/common/mclock/simclock_test.go new file mode 100644 index 000000000000..09e4391c1c09 --- /dev/null +++ b/common/mclock/simclock_test.go @@ -0,0 +1,115 @@ +// Copyright 2018 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 mclock + +import ( + "testing" + "time" +) + +var _ Clock = System{} +var _ Clock = new(Simulated) + +func TestSimulatedAfter(t *testing.T) { + const timeout = 30 * time.Minute + const adv = time.Minute + + var ( + c Simulated + end = c.Now().Add(timeout) + ch = c.After(timeout) + ) + for c.Now() < end.Add(-adv) { + c.Run(adv) + select { + case <-ch: + t.Fatal("Timer fired early") + default: + } + } + + c.Run(adv) + select { + case stamp := <-ch: + want := time.Time{}.Add(timeout) + if !stamp.Equal(want) { + t.Errorf("Wrong time sent on timer channel: got %v, want %v", stamp, want) + } + default: + t.Fatal("Timer didn't fire") + } +} + +func TestSimulatedAfterFunc(t *testing.T) { + var c Simulated + + called1 := false + timer1 := c.AfterFunc(100*time.Millisecond, func() { called1 = true }) + if c.ActiveTimers() != 1 { + t.Fatalf("%d active timers, want one", c.ActiveTimers()) + } + if fired := timer1.Stop(); !fired { + t.Fatal("Stop returned false even though timer didn't fire") + } + if c.ActiveTimers() != 0 { + t.Fatalf("%d active timers, want zero", c.ActiveTimers()) + } + if called1 { + t.Fatal("timer 1 called") + } + if fired := timer1.Stop(); fired { + t.Fatal("Stop returned true after timer was already stopped") + } + + called2 := false + timer2 := c.AfterFunc(100*time.Millisecond, func() { called2 = true }) + c.Run(50 * time.Millisecond) + if called2 { + t.Fatal("timer 2 called") + } + c.Run(51 * time.Millisecond) + if !called2 { + t.Fatal("timer 2 not called") + } + if fired := timer2.Stop(); fired { + t.Fatal("Stop returned true after timer has fired") + } +} + +func TestSimulatedSleep(t *testing.T) { + var ( + c Simulated + timeout = 1 * time.Hour + done = make(chan AbsTime) + ) + go func() { + c.Sleep(timeout) + done <- c.Now() + }() + + c.WaitForTimers(1) + c.Run(2 * timeout) + select { + case stamp := <-done: + want := AbsTime(2 * timeout) + if stamp != want { + t.Errorf("Wrong time after sleep: got %v, want %v", stamp, want) + } + case <-time.After(5 * time.Second): + t.Fatal("Sleep didn't return in time") + } +} diff --git a/common/prque/lazyqueue.go b/common/prque/lazyqueue.go new file mode 100644 index 000000000000..92ddd77f677a --- /dev/null +++ b/common/prque/lazyqueue.go @@ -0,0 +1,182 @@ +// Copyright 2019 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 prque + +import ( + "container/heap" + "time" + + "github.com/ethereum/go-ethereum/common/mclock" +) + +// LazyQueue is a priority queue data structure where priorities can change over +// time and are only evaluated on demand. +// Two callbacks are required: +// - priority evaluates the actual priority of an item +// - maxPriority gives an upper estimate for the priority in any moment between +// now and the given absolute time +// If the upper estimate is exceeded then Update should be called for that item. +// A global Refresh function should also be called periodically. +type LazyQueue struct { + clock mclock.Clock + // Items are stored in one of two internal queues ordered by estimated max + // priority until the next and the next-after-next refresh. Update and Refresh + // always places items in queue[1]. + queue [2]*sstack + popQueue *sstack + period time.Duration + maxUntil mclock.AbsTime + indexOffset int + setIndex SetIndexCallback + priority PriorityCallback + maxPriority MaxPriorityCallback +} + +type ( + PriorityCallback func(data interface{}, now mclock.AbsTime) int64 // actual priority callback + MaxPriorityCallback func(data interface{}, until mclock.AbsTime) int64 // estimated maximum priority callback +) + +// NewLazyQueue creates a new lazy queue +func NewLazyQueue(setIndex SetIndexCallback, priority PriorityCallback, maxPriority MaxPriorityCallback, clock mclock.Clock, refreshPeriod time.Duration) *LazyQueue { + q := &LazyQueue{ + popQueue: newSstack(nil), + setIndex: setIndex, + priority: priority, + maxPriority: maxPriority, + clock: clock, + period: refreshPeriod} + q.Reset() + q.Refresh() + return q +} + +// Reset clears the contents of the queue +func (q *LazyQueue) Reset() { + q.queue[0] = newSstack(q.setIndex0) + q.queue[1] = newSstack(q.setIndex1) +} + +// Refresh should be called at least with the frequency specified by the refreshPeriod parameter +func (q *LazyQueue) Refresh() { + q.maxUntil = q.clock.Now() + mclock.AbsTime(q.period) + for q.queue[0].Len() != 0 { + q.Push(heap.Pop(q.queue[0]).(*item).value) + } + q.queue[0], q.queue[1] = q.queue[1], q.queue[0] + q.indexOffset = 1 - q.indexOffset + q.maxUntil += mclock.AbsTime(q.period) +} + +// Push adds an item to the queue +func (q *LazyQueue) Push(data interface{}) { + heap.Push(q.queue[1], &item{data, q.maxPriority(data, q.maxUntil)}) +} + +// Update updates the upper priority estimate for the item with the given queue index +func (q *LazyQueue) Update(index int) { + q.Push(q.Remove(index)) +} + +// Pop removes and returns the item with the greatest actual priority +func (q *LazyQueue) Pop() (interface{}, int64) { + var ( + resData interface{} + resPri int64 + ) + q.MultiPop(func(data interface{}, priority int64) bool { + resData = data + resPri = priority + return false + }) + return resData, resPri +} + +// peekIndex returns the index of the internal queue where the item with the +// highest estimated priority is or -1 if both are empty +func (q *LazyQueue) peekIndex() int { + if q.queue[0].Len() != 0 { + if q.queue[1].Len() != 0 && q.queue[1].blocks[0][0].priority > q.queue[0].blocks[0][0].priority { + return 1 + } + return 0 + } + if q.queue[1].Len() != 0 { + return 1 + } + return -1 +} + +// MultiPop pops multiple items from the queue and is more efficient than calling +// Pop multiple times. Popped items are passed to the callback. MultiPop returns +// when the callback returns false or there are no more items to pop. +func (q *LazyQueue) MultiPop(callback func(data interface{}, priority int64) bool) { + now := q.clock.Now() + nextIndex := q.peekIndex() + for nextIndex != -1 { + data := heap.Pop(q.queue[nextIndex]).(*item).value + heap.Push(q.popQueue, &item{data, q.priority(data, now)}) + nextIndex = q.peekIndex() + for q.popQueue.Len() != 0 && (nextIndex == -1 || q.queue[nextIndex].blocks[0][0].priority < q.popQueue.blocks[0][0].priority) { + i := heap.Pop(q.popQueue).(*item) + if !callback(i.value, i.priority) { + for q.popQueue.Len() != 0 { + q.Push(heap.Pop(q.popQueue).(*item).value) + } + return + } + } + } +} + +// PopItem pops the item from the queue only, dropping the associated priority value. +func (q *LazyQueue) PopItem() interface{} { + i, _ := q.Pop() + return i +} + +// Remove removes removes the item with the given index. +func (q *LazyQueue) Remove(index int) interface{} { + if index < 0 { + return nil + } + return heap.Remove(q.queue[index&1^q.indexOffset], index>>1).(*item).value +} + +// Empty checks whether the priority queue is empty. +func (q *LazyQueue) Empty() bool { + return q.queue[0].Len() == 0 && q.queue[1].Len() == 0 +} + +// Size returns the number of items in the priority queue. +func (q *LazyQueue) Size() int { + return q.queue[0].Len() + q.queue[1].Len() +} + +// setIndex0 translates internal queue item index to the virtual index space of LazyQueue +func (q *LazyQueue) setIndex0(data interface{}, index int) { + if index == -1 { + q.setIndex(data, -1) + } else { + q.setIndex(data, index+index) + } +} + +// setIndex1 translates internal queue item index to the virtual index space of LazyQueue +func (q *LazyQueue) setIndex1(data interface{}, index int) { + q.setIndex(data, index+index+1) +} diff --git a/common/prque/lazyqueue_test.go b/common/prque/lazyqueue_test.go new file mode 100644 index 000000000000..0bd4fc65972e --- /dev/null +++ b/common/prque/lazyqueue_test.go @@ -0,0 +1,119 @@ +// Copyright 2019 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 prque + +import ( + "math/rand" + "sync" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common/mclock" +) + +const ( + testItems = 1000 + testPriorityStep = 100 + testSteps = 1000000 + testStepPeriod = time.Millisecond + testQueueRefresh = time.Second + testAvgRate = float64(testPriorityStep) / float64(testItems) / float64(testStepPeriod) +) + +type lazyItem struct { + p, maxp int64 + last mclock.AbsTime + index int +} + +func testPriority(a interface{}, now mclock.AbsTime) int64 { + return a.(*lazyItem).p +} + +func testMaxPriority(a interface{}, until mclock.AbsTime) int64 { + i := a.(*lazyItem) + dt := until - i.last + i.maxp = i.p + int64(float64(dt)*testAvgRate) + return i.maxp +} + +func testSetIndex(a interface{}, i int) { + a.(*lazyItem).index = i +} + +func TestLazyQueue(t *testing.T) { + rand.Seed(time.Now().UnixNano()) + clock := &mclock.Simulated{} + q := NewLazyQueue(testSetIndex, testPriority, testMaxPriority, clock, testQueueRefresh) + + var ( + items [testItems]lazyItem + maxPri int64 + ) + + for i := range items[:] { + items[i].p = rand.Int63n(testPriorityStep * 10) + if items[i].p > maxPri { + maxPri = items[i].p + } + items[i].index = -1 + q.Push(&items[i]) + } + + var lock sync.Mutex + stopCh := make(chan chan struct{}) + go func() { + for { + select { + case <-clock.After(testQueueRefresh): + lock.Lock() + q.Refresh() + lock.Unlock() + case stop := <-stopCh: + close(stop) + return + } + } + }() + + for c := 0; c < testSteps; c++ { + i := rand.Intn(testItems) + lock.Lock() + items[i].p += rand.Int63n(testPriorityStep*2-1) + 1 + if items[i].p > maxPri { + maxPri = items[i].p + } + items[i].last = clock.Now() + if items[i].p > items[i].maxp { + q.Update(items[i].index) + } + if rand.Intn(100) == 0 { + p := q.PopItem().(*lazyItem) + if p.p != maxPri { + t.Fatalf("incorrect item (best known priority %d, popped %d)", maxPri, p.p) + } + q.Push(p) + } + lock.Unlock() + clock.Run(testStepPeriod) + clock.WaitForTimers(1) + } + + stop := make(chan struct{}) + stopCh <- stop + <-stop +} diff --git a/common/prque/prque.go b/common/prque/prque.go index 9fd31a2e5d1f..3cc5a1adaf15 100755 --- a/common/prque/prque.go +++ b/common/prque/prque.go @@ -1,5 +1,20 @@ +// CookieJar - A contestant's algorithm toolbox +// Copyright (c) 2013 Peter Szilagyi. All rights reserved. +// +// CookieJar is dual licensed: use of this source code is governed by a BSD +// license that can be found in the LICENSE file. Alternatively, the CookieJar +// toolbox may be used in accordance with the terms and conditions contained +// in a signed written agreement between you and the author(s). + // This is a duplicated and slightly modified version of "gopkg.in/karalabe/cookiejar.v2/collections/prque". +// Package prque implements a priority queue data structure supporting arbitrary +// value types and int64 priorities. +// +// If you would like to use a min-priority queue, simply negate the priorities. +// +// Internally the queue is based on the standard heap package working on a +// sortable version of the block based stack. package prque import ( @@ -11,8 +26,8 @@ type Prque struct { cont *sstack } -// Creates a new priority queue. -func New(setIndex setIndexCallback) *Prque { +// New creates a new priority queue. +func New(setIndex SetIndexCallback) *Prque { return &Prque{newSstack(setIndex)} } @@ -21,6 +36,12 @@ func (p *Prque) Push(data interface{}, priority int64) { heap.Push(p.cont, &item{data, priority}) } +// Peek returns the value with the greates priority but does not pop it off. +func (p *Prque) Peek() (interface{}, int64) { + item := p.cont.blocks[0][0] + return item.value, item.priority +} + // Pops the value with the greates priority off the stack and returns it. // Currently no shrinking is done. func (p *Prque) Pop() (interface{}, int64) { diff --git a/common/prque/sstack.go b/common/prque/sstack.go index 4875dae99d96..8518af54ff1a 100755 --- a/common/prque/sstack.go +++ b/common/prque/sstack.go @@ -1,3 +1,11 @@ +// CookieJar - A contestant's algorithm toolbox +// Copyright (c) 2013 Peter Szilagyi. All rights reserved. +// +// CookieJar is dual licensed: use of this source code is governed by a BSD +// license that can be found in the LICENSE file. Alternatively, the CookieJar +// toolbox may be used in accordance with the terms and conditions contained +// in a signed written agreement between you and the author(s). + // This is a duplicated and slightly modified version of "gopkg.in/karalabe/cookiejar.v2/collections/prque". package prque @@ -14,16 +22,16 @@ type item struct { priority int64 } -// setIndexCallback is called when the element is moved to a new index. -// Providing setIndexCallback is optional, it is needed only if the application needs +// SetIndexCallback is called when the element is moved to a new index. +// Providing SetIndexCallback is optional, it is needed only if the application needs // to delete elements other than the top one. -type setIndexCallback func(a interface{}, i int) +type SetIndexCallback func(data interface{}, index int) // Internal sortable stack data structure. Implements the Push and Pop ops for // the stack (heap) functionality and the Len, Less and Swap methods for the // sortability requirements of the heaps. type sstack struct { - setIndex setIndexCallback + setIndex SetIndexCallback size int capacity int offset int @@ -33,7 +41,7 @@ type sstack struct { } // Creates a new, empty stack. -func newSstack(setIndex setIndexCallback) *sstack { +func newSstack(setIndex SetIndexCallback) *sstack { result := new(sstack) result.setIndex = setIndex result.active = make([]*item, blockSize) diff --git a/common/size.go b/common/size.go index bd0fc85c7dcc..097b6304a8d0 100644 --- a/common/size.go +++ b/common/size.go @@ -26,10 +26,14 @@ type StorageSize float64 // String implements the stringer interface. func (s StorageSize) String() string { - if s > 1000000 { - return fmt.Sprintf("%.2f mB", s/1000000) - } else if s > 1000 { - return fmt.Sprintf("%.2f kB", s/1000) + if s > 1099511627776 { + return fmt.Sprintf("%.2f TiB", s/1099511627776) + } else if s > 1073741824 { + return fmt.Sprintf("%.2f GiB", s/1073741824) + } else if s > 1048576 { + return fmt.Sprintf("%.2f MiB", s/1048576) + } else if s > 1024 { + return fmt.Sprintf("%.2f KiB", s/1024) } else { return fmt.Sprintf("%.2f B", s) } @@ -38,10 +42,14 @@ func (s StorageSize) String() string { // TerminalString implements log.TerminalStringer, formatting a string for console // output during logging. func (s StorageSize) TerminalString() string { - if s > 1000000 { - return fmt.Sprintf("%.2fmB", s/1000000) - } else if s > 1000 { - return fmt.Sprintf("%.2fkB", s/1000) + if s > 1099511627776 { + return fmt.Sprintf("%.2fTiB", s/1099511627776) + } else if s > 1073741824 { + return fmt.Sprintf("%.2fGiB", s/1073741824) + } else if s > 1048576 { + return fmt.Sprintf("%.2fMiB", s/1048576) + } else if s > 1024 { + return fmt.Sprintf("%.2fKiB", s/1024) } else { return fmt.Sprintf("%.2fB", s) } diff --git a/common/size_test.go b/common/size_test.go index f5b6c725e237..0938d483c4bb 100644 --- a/common/size_test.go +++ b/common/size_test.go @@ -25,8 +25,8 @@ func TestStorageSizeString(t *testing.T) { size StorageSize str string }{ - {2381273, "2.38 mB"}, - {2192, "2.19 kB"}, + {2381273, "2.27 MiB"}, + {2192, "2.14 KiB"}, {12, "12.00 B"}, } diff --git a/common/types.go b/common/types.go index 71de1c2c75cf..cdcc6c20ad53 100644 --- a/common/types.go +++ b/common/types.go @@ -20,13 +20,14 @@ import ( "database/sql/driver" "encoding/hex" "encoding/json" + "errors" "fmt" "math/big" "math/rand" "reflect" "strings" - "github.com/nebulaai/nbai-node/common/hexutil" + "github.com/ethereum/go-ethereum/common/hexutil" "golang.org/x/crypto/sha3" ) @@ -141,6 +142,21 @@ func (h Hash) Value() (driver.Value, error) { return h[:], nil } +// ImplementsGraphQLType returns true if Hash implements the specified GraphQL type. +func (Hash) ImplementsGraphQLType(name string) bool { return name == "Bytes32" } + +// UnmarshalGraphQL unmarshals the provided GraphQL query data. +func (h *Hash) UnmarshalGraphQL(input interface{}) error { + var err error + switch input := input.(type) { + case string: + err = h.UnmarshalText([]byte(input)) + default: + err = fmt.Errorf("unexpected type %T for Hash", input) + } + return err +} + // UnprefixedHash allows marshaling a Hash without 0x prefix. type UnprefixedHash Hash @@ -178,7 +194,7 @@ func HexToAddress(s string) Address { return BytesToAddress(FromHex(s)) } // IsHexAddress verifies whether a string can represent a valid hex-encoded // Ethereum address or not. func IsHexAddress(s string) bool { - if hasHexPrefix(s) { + if has0xPrefix(s) { s = s[2:] } return len(s) == 2*AddressLength && isHex(s) @@ -187,9 +203,6 @@ func IsHexAddress(s string) bool { // Bytes gets the string representation of the underlying address. func (a Address) Bytes() []byte { return a[:] } -// Big converts an address to a big integer. -func (a Address) Big() *big.Int { return new(big.Int).SetBytes(a[:]) } - // Hash converts an address to a hash by left-padding it with zeros. func (a Address) Hash() Hash { return BytesToHash(a[:]) } @@ -268,6 +281,21 @@ func (a Address) Value() (driver.Value, error) { return a[:], nil } +// ImplementsGraphQLType returns true if Hash implements the specified GraphQL type. +func (a Address) ImplementsGraphQLType(name string) bool { return name == "Address" } + +// UnmarshalGraphQL unmarshals the provided GraphQL query data. +func (a *Address) UnmarshalGraphQL(input interface{}) error { + var err error + switch input := input.(type) { + case string: + err = a.UnmarshalText([]byte(input)) + default: + err = fmt.Errorf("unexpected type %T for Address", input) + } + return err +} + // UnprefixedAddress allows marshaling an Address without 0x prefix. type UnprefixedAddress Address @@ -296,7 +324,7 @@ func NewMixedcaseAddress(addr Address) MixedcaseAddress { // NewMixedcaseAddressFromString is mainly meant for unit-testing func NewMixedcaseAddressFromString(hexaddr string) (*MixedcaseAddress, error) { if !IsHexAddress(hexaddr) { - return nil, fmt.Errorf("Invalid address") + return nil, errors.New("invalid address") } a := FromHex(hexaddr) return &MixedcaseAddress{addr: BytesToAddress(a), original: hexaddr}, nil diff --git a/common/types_test.go b/common/types_test.go index 7095ccd0191b..fffd673c6ee2 100644 --- a/common/types_test.go +++ b/common/types_test.go @@ -114,8 +114,8 @@ func TestAddressUnmarshalJSON(t *testing.T) { if test.ShouldErr { t.Errorf("test #%d: expected error, got none", i) } - if v.Big().Cmp(test.Output) != 0 { - t.Errorf("test #%d: address mismatch: have %v, want %v", i, v.Big(), test.Output) + if got := new(big.Int).SetBytes(v.Bytes()); got.Cmp(test.Output) != 0 { + t.Errorf("test #%d: address mismatch: have %v, want %v", i, got, test.Output) } } } diff --git a/consensus/clique/api.go b/consensus/clique/api.go index 0d6621f8c83c..4739a403afb7 100644 --- a/consensus/clique/api.go +++ b/consensus/clique/api.go @@ -17,10 +17,12 @@ package clique import ( - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/rpc" + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rpc" ) // API is a user facing RPC API to allow controlling the signer and voting @@ -117,3 +119,59 @@ func (api *API) Discard(address common.Address) { delete(api.clique.proposals, address) } + +type status struct { + InturnPercent float64 `json:"inturnPercent"` + SigningStatus map[common.Address]int `json:"sealerActivity"` + NumBlocks uint64 `json:"numBlocks"` +} + +// Status returns the status of the last N blocks, +// - the number of active signers, +// - the number of signers, +// - the percentage of in-turn blocks +func (api *API) Status() (*status, error) { + var ( + numBlocks = uint64(64) + header = api.chain.CurrentHeader() + diff = uint64(0) + optimals = 0 + ) + snap, err := api.clique.snapshot(api.chain, header.Number.Uint64(), header.Hash(), nil) + if err != nil { + return nil, err + } + var ( + signers = snap.signers() + end = header.Number.Uint64() + start = end - numBlocks + ) + if numBlocks > end { + start = 1 + numBlocks = end - start + } + signStatus := make(map[common.Address]int) + for _, s := range signers { + signStatus[s] = 0 + } + for n := start; n < end; n++ { + h := api.chain.GetHeaderByNumber(n) + if h == nil { + return nil, fmt.Errorf("missing block %d", n) + } + if h.Difficulty.Cmp(diffInTurn) == 0 { + optimals++ + } + diff += h.Difficulty.Uint64() + sealer, err := api.clique.Author(h) + if err != nil { + return nil, err + } + signStatus[sealer]++ + } + return &status{ + InturnPercent: float64((100 * optimals)) / float64(numBlocks), + SigningStatus: signStatus, + NumBlocks: numBlocks, + }, nil +} diff --git a/consensus/clique/clique.go b/consensus/clique/clique.go index 92e61423c7f7..100c205292b4 100644 --- a/consensus/clique/clique.go +++ b/consensus/clique/clique.go @@ -20,24 +20,25 @@ package clique import ( "bytes" "errors" + "io" "math/big" "math/rand" "sync" "time" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/consensus/misc" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/misc" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" lru "github.com/hashicorp/golang-lru" "golang.org/x/crypto/sha3" ) @@ -54,8 +55,8 @@ const ( var ( epochLength = uint64(30000) // Default number of blocks after which to checkpoint and reset the pending votes - extraVanity = 32 // Fixed number of extra-data prefix bytes reserved for signer vanity - extraSeal = 65 // Fixed number of extra-data suffix bytes reserved for signer seal + extraVanity = 32 // Fixed number of extra-data prefix bytes reserved for signer vanity + extraSeal = crypto.SignatureLength // Fixed number of extra-data suffix bytes reserved for signer seal nonceAuthVote = hexutil.MustDecode("0xffffffffffffffff") // Magic nonce number to vote on adding a new signer nonceDropVote = hexutil.MustDecode("0x0000000000000000") // Magic nonce number to vote on removing a signer. @@ -136,40 +137,9 @@ var ( errRecentlySigned = errors.New("recently signed") ) -// SignerFn is a signer callback function to request a hash to be signed by a +// SignerFn is a signer callback function to request a header to be signed by a // backing account. -type SignerFn func(accounts.Account, []byte) ([]byte, error) - -// sigHash returns the hash which is used as input for the proof-of-authority -// signing. It is the hash of the entire header apart from the 65 byte signature -// contained at the end of the extra data. -// -// Note, the method requires the extra data to be at least 65 bytes, otherwise it -// panics. This is done to avoid accidentally using both forms (signature present -// or not), which could be abused to produce different hashes for the same header. -func sigHash(header *types.Header) (hash common.Hash) { - hasher := sha3.NewLegacyKeccak256() - - rlp.Encode(hasher, []interface{}{ - header.ParentHash, - header.UncleHash, - header.Coinbase, - header.Root, - header.TxHash, - header.ReceiptHash, - header.Bloom, - header.Difficulty, - header.Number, - header.GasLimit, - header.GasUsed, - header.Time, - header.Extra[:len(header.Extra)-65], // Yes, this will panic if extra is too short - header.MixDigest, - header.Nonce, - }) - hasher.Sum(hash[:0]) - return hash -} +type SignerFn func(accounts.Account, string, []byte) ([]byte, error) // ecrecover extracts the Ethereum account address from a signed header. func ecrecover(header *types.Header, sigcache *lru.ARCCache) (common.Address, error) { @@ -185,7 +155,7 @@ func ecrecover(header *types.Header, sigcache *lru.ARCCache) (common.Address, er signature := header.Extra[len(header.Extra)-extraSeal:] // Recover the public key and the Ethereum address - pubkey, err := crypto.Ecrecover(sigHash(header).Bytes(), signature) + pubkey, err := crypto.Ecrecover(SealHash(header).Bytes(), signature) if err != nil { return common.Address{}, err } @@ -279,7 +249,7 @@ func (c *Clique) verifyHeader(chain consensus.ChainReader, header *types.Header, number := header.Number.Uint64() // Don't waste time checking blocks from the future - if header.Time.Cmp(big.NewInt(time.Now().Unix())) > 0 { + if header.Time > uint64(time.Now().Unix()) { return consensus.ErrFutureBlock } // Checkpoint blocks need to enforce zero beneficiary @@ -341,7 +311,7 @@ func (c *Clique) verifyCascadingFields(chain consensus.ChainReader, header *type if number == 0 { return nil } - // Ensure that the block's timestamp isn't too close to it's parent + // Ensure that the block's timestamp isn't too close to its parent var parent *types.Header if len(parents) > 0 { parent = parents[len(parents)-1] @@ -351,7 +321,7 @@ func (c *Clique) verifyCascadingFields(chain consensus.ChainReader, header *type if parent == nil || parent.Number.Uint64() != number-1 || parent.Hash() != header.ParentHash { return consensus.ErrUnknownAncestor } - if parent.Time.Uint64()+c.config.Period > header.Time.Uint64() { + if parent.Time+c.config.Period > header.Time { return ErrInvalidTimestamp } // Retrieve the snapshot needed to verify this header and cache it @@ -395,8 +365,11 @@ func (c *Clique) snapshot(chain consensus.ChainReader, number uint64, hash commo break } } - // If we're at an checkpoint block, make a snapshot if it's known - if number == 0 || (number%c.config.Epoch == 0 && chain.GetHeaderByNumber(number-1) == nil) { + // If we're at the genesis, snapshot the initial state. Alternatively if we're + // at a checkpoint block without a parent (light client CHT), or we have piled + // up more headers than allowed to be reorged (chain reinit from a freezer), + // consider the checkpoint trusted and snapshot it. + if number == 0 || (number%c.config.Epoch == 0 && (len(headers) > params.ImmutabilityThreshold || chain.GetHeaderByNumber(number-1) == nil)) { checkpoint := chain.GetHeaderByNumber(number) if checkpoint != nil { hash := checkpoint.Hash() @@ -549,7 +522,7 @@ func (c *Clique) Prepare(chain consensus.ChainReader, header *types.Header) erro // Set the correct difficulty header.Difficulty = CalcDifficulty(snap, c.signer) - // Ensure the extra data has all it's components + // Ensure the extra data has all its components if len(header.Extra) < extraVanity { header.Extra = append(header.Extra, bytes.Repeat([]byte{0x00}, extraVanity-len(header.Extra))...) } @@ -570,16 +543,24 @@ func (c *Clique) Prepare(chain consensus.ChainReader, header *types.Header) erro if parent == nil { return consensus.ErrUnknownAncestor } - header.Time = new(big.Int).Add(parent.Time, new(big.Int).SetUint64(c.config.Period)) - if header.Time.Int64() < time.Now().Unix() { - header.Time = big.NewInt(time.Now().Unix()) + header.Time = parent.Time + c.config.Period + if header.Time < uint64(time.Now().Unix()) { + header.Time = uint64(time.Now().Unix()) } return nil } // Finalize implements consensus.Engine, ensuring no uncles are set, nor block -// rewards given, and returns the final block. -func (c *Clique) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { +// rewards given. +func (c *Clique) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header) { + // No block rewards in PoA, so the state remains as is and uncles are dropped + header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) + header.UncleHash = types.CalcUncleHash(nil) +} + +// FinalizeAndAssemble implements consensus.Engine, ensuring no uncles are set, +// nor block rewards given, and returns the final block. +func (c *Clique) FinalizeAndAssemble(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { // No block rewards in PoA, so the state remains as is and uncles are dropped header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) header.UncleHash = types.CalcUncleHash(nil) @@ -637,7 +618,7 @@ func (c *Clique) Seal(chain consensus.ChainReader, block *types.Block, results c } } // Sweet, the protocol permits us to sign the block, wait for our time - delay := time.Unix(header.Time.Int64(), 0).Sub(time.Now()) // nolint: gosimple + delay := time.Unix(int64(header.Time), 0).Sub(time.Now()) // nolint: gosimple if header.Difficulty.Cmp(diffNoTurn) == 0 { // It's not our turn explicitly to sign, delay it a bit wiggle := time.Duration(len(snap.Signers)/2+1) * wiggleTime @@ -646,7 +627,7 @@ func (c *Clique) Seal(chain consensus.ChainReader, block *types.Block, results c log.Trace("Out-of-turn signing requested", "wiggle", common.PrettyDuration(wiggle)) } // Sign all the things! - sighash, err := signFn(accounts.Account{Address: signer}, sigHash(header).Bytes()) + sighash, err := signFn(accounts.Account{Address: signer}, accounts.MimetypeClique, CliqueRLP(header)) if err != nil { return err } @@ -663,7 +644,7 @@ func (c *Clique) Seal(chain consensus.ChainReader, block *types.Block, results c select { case results <- block.WithSeal(header): default: - log.Warn("Sealing result is not read by miner", "sealhash", c.SealHash(header)) + log.Warn("Sealing result is not read by miner", "sealhash", SealHash(header)) } }() @@ -693,7 +674,7 @@ func CalcDifficulty(snap *Snapshot, signer common.Address) *big.Int { // SealHash returns the hash of a block prior to it being sealed. func (c *Clique) SealHash(header *types.Header) common.Hash { - return sigHash(header) + return SealHash(header) } // Close implements consensus.Engine. It's a noop for clique as there are no background threads. @@ -711,3 +692,47 @@ func (c *Clique) APIs(chain consensus.ChainReader) []rpc.API { Public: false, }} } + +// SealHash returns the hash of a block prior to it being sealed. +func SealHash(header *types.Header) (hash common.Hash) { + hasher := sha3.NewLegacyKeccak256() + encodeSigHeader(hasher, header) + hasher.Sum(hash[:0]) + return hash +} + +// CliqueRLP returns the rlp bytes which needs to be signed for the proof-of-authority +// sealing. The RLP to sign consists of the entire header apart from the 65 byte signature +// contained at the end of the extra data. +// +// Note, the method requires the extra data to be at least 65 bytes, otherwise it +// panics. This is done to avoid accidentally using both forms (signature present +// or not), which could be abused to produce different hashes for the same header. +func CliqueRLP(header *types.Header) []byte { + b := new(bytes.Buffer) + encodeSigHeader(b, header) + return b.Bytes() +} + +func encodeSigHeader(w io.Writer, header *types.Header) { + err := rlp.Encode(w, []interface{}{ + header.ParentHash, + header.UncleHash, + header.Coinbase, + header.Root, + header.TxHash, + header.ReceiptHash, + header.Bloom, + header.Difficulty, + header.Number, + header.GasLimit, + header.GasUsed, + header.Time, + header.Extra[:len(header.Extra)-crypto.SignatureLength], // Yes, this will panic if extra is too short + header.MixDigest, + header.Nonce, + }) + if err != nil { + panic("can't encode: " + err.Error()) + } +} diff --git a/consensus/clique/clique_test.go b/consensus/clique/clique_test.go new file mode 100644 index 000000000000..710f44805555 --- /dev/null +++ b/consensus/clique/clique_test.go @@ -0,0 +1,113 @@ +// Copyright 2019 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 clique + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" +) + +// This test case is a repro of an annoying bug that took us forever to catch. +// In Clique PoA networks (Rinkeby, Görli, etc), consecutive blocks might have +// the same state root (no block subsidy, empty block). If a node crashes, the +// chain ends up losing the recent state and needs to regenerate it from blocks +// already in the database. The bug was that processing the block *prior* to an +// empty one **also completes** the empty one, ending up in a known-block error. +func TestReimportMirroredState(t *testing.T) { + // Initialize a Clique chain with a single signer + var ( + db = rawdb.NewMemoryDatabase() + key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + addr = crypto.PubkeyToAddress(key.PublicKey) + engine = New(params.AllCliqueProtocolChanges.Clique, db) + signer = new(types.HomesteadSigner) + ) + genspec := &core.Genesis{ + ExtraData: make([]byte, extraVanity+common.AddressLength+extraSeal), + Alloc: map[common.Address]core.GenesisAccount{ + addr: {Balance: big.NewInt(1)}, + }, + } + copy(genspec.ExtraData[extraVanity:], addr[:]) + genesis := genspec.MustCommit(db) + + // Generate a batch of blocks, each properly signed + chain, _ := core.NewBlockChain(db, nil, params.AllCliqueProtocolChanges, engine, vm.Config{}, nil) + defer chain.Stop() + + blocks, _ := core.GenerateChain(params.AllCliqueProtocolChanges, genesis, engine, db, 3, func(i int, block *core.BlockGen) { + // The chain maker doesn't have access to a chain, so the difficulty will be + // lets unset (nil). Set it here to the correct value. + block.SetDifficulty(diffInTurn) + + // We want to simulate an empty middle block, having the same state as the + // first one. The last is needs a state change again to force a reorg. + if i != 1 { + tx, err := types.SignTx(types.NewTransaction(block.TxNonce(addr), common.Address{0x00}, new(big.Int), params.TxGas, nil, nil), signer, key) + if err != nil { + panic(err) + } + block.AddTxWithChain(chain, tx) + } + }) + for i, block := range blocks { + header := block.Header() + if i > 0 { + header.ParentHash = blocks[i-1].Hash() + } + header.Extra = make([]byte, extraVanity+extraSeal) + header.Difficulty = diffInTurn + + sig, _ := crypto.Sign(SealHash(header).Bytes(), key) + copy(header.Extra[len(header.Extra)-extraSeal:], sig) + blocks[i] = block.WithSeal(header) + } + // Insert the first two blocks and make sure the chain is valid + db = rawdb.NewMemoryDatabase() + genspec.MustCommit(db) + + chain, _ = core.NewBlockChain(db, nil, params.AllCliqueProtocolChanges, engine, vm.Config{}, nil) + defer chain.Stop() + + if _, err := chain.InsertChain(blocks[:2]); err != nil { + t.Fatalf("failed to insert initial blocks: %v", err) + } + if head := chain.CurrentBlock().NumberU64(); head != 2 { + t.Fatalf("chain head mismatch: have %d, want %d", head, 2) + } + + // Simulate a crash by creating a new chain on top of the database, without + // flushing the dirty states out. Insert the last block, trigerring a sidechain + // reimport. + chain, _ = core.NewBlockChain(db, nil, params.AllCliqueProtocolChanges, engine, vm.Config{}, nil) + defer chain.Stop() + + if _, err := chain.InsertChain(blocks[2:]); err != nil { + t.Fatalf("failed to insert final block: %v", err) + } + if head := chain.CurrentBlock().NumberU64(); head != 3 { + t.Fatalf("chain head mismatch: have %d, want %d", head, 3) + } +} diff --git a/consensus/clique/snapshot.go b/consensus/clique/snapshot.go index f1d00bae030e..4ee731a90821 100644 --- a/consensus/clique/snapshot.go +++ b/consensus/clique/snapshot.go @@ -20,11 +20,13 @@ import ( "bytes" "encoding/json" "sort" + "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" lru "github.com/hashicorp/golang-lru" ) @@ -197,7 +199,11 @@ func (s *Snapshot) apply(headers []*types.Header) (*Snapshot, error) { // Iterate through the headers and create a new snapshot snap := s.copy() - for _, header := range headers { + var ( + start = time.Now() + logged = time.Now() + ) + for i, header := range headers { // Remove any votes on checkpoint blocks number := header.Number.Uint64() if number%s.config.Epoch == 0 { @@ -285,6 +291,14 @@ func (s *Snapshot) apply(headers []*types.Header) (*Snapshot, error) { } delete(snap.Tally, header.Coinbase) } + // If we're taking too much time (ecrecover), notify the user once a while + if time.Since(logged) > 8*time.Second { + log.Info("Reconstructing voting history", "processed", i, "total", len(headers), "elapsed", common.PrettyDuration(time.Since(start))) + logged = time.Now() + } + } + if time.Since(start) > 8*time.Second { + log.Info("Reconstructed voting history", "processed", len(headers), "elapsed", common.PrettyDuration(time.Since(start))) } snap.Number += uint64(len(headers)) snap.Hash = headers[len(headers)-1].Hash() diff --git a/consensus/clique/snapshot_test.go b/consensus/clique/snapshot_test.go index 7135586ee0d9..fc08722efd63 100644 --- a/consensus/clique/snapshot_test.go +++ b/consensus/clique/snapshot_test.go @@ -22,13 +22,13 @@ import ( "sort" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" ) // testerAccountPool is a pool to maintain currently active tester accounts, @@ -80,7 +80,7 @@ func (ap *testerAccountPool) sign(header *types.Header, signer string) { ap.accounts[signer], _ = crypto.GenerateKey() } // Sign the header and embed the signature in extra data - sig, _ := crypto.Sign(sigHash(header).Bytes(), ap.accounts[signer]) + sig, _ := crypto.Sign(SealHash(header).Bytes(), ap.accounts[signer]) copy(header.Extra[len(header.Extra)-extraSeal:], sig) } @@ -246,10 +246,10 @@ func TestClique(t *testing.T) { // Votes from deauthorized signers are discarded immediately (auth votes) signers: []string{"A", "B", "C"}, votes: []testerVote{ - {signer: "C", voted: "B", auth: false}, + {signer: "C", voted: "D", auth: true}, {signer: "A", voted: "C", auth: false}, {signer: "B", voted: "C", auth: false}, - {signer: "A", voted: "B", auth: false}, + {signer: "A", voted: "D", auth: true}, }, results: []string{"A", "B"}, }, { @@ -400,7 +400,7 @@ func TestClique(t *testing.T) { copy(genesis.ExtraData[extraVanity+j*common.AddressLength:], signer[:]) } // Create a pristine blockchain with the genesis injected - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() genesis.Commit(db) // Assemble a chain of headers from the cast votes diff --git a/consensus/consensus.go b/consensus/consensus.go index 0dc0a79ee8dc..f753af550ca0 100644 --- a/consensus/consensus.go +++ b/consensus/consensus.go @@ -20,11 +20,11 @@ package consensus import ( "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" ) // ChainReader defines a small collection of methods needed to access the local @@ -80,10 +80,19 @@ type Engine interface { Prepare(chain ChainReader, header *types.Header) error // Finalize runs any post-transaction state modifications (e.g. block rewards) - // and assembles the final block. + // but does not assemble the block. + // // Note: The block header and state database might be updated to reflect any // consensus rules that happen at finalization (e.g. block rewards). Finalize(chain ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, + uncles []*types.Header) + + // FinalizeAndAssemble runs any post-transaction state modifications (e.g. block + // rewards) and assembles the final block. + // + // Note: The block header and state database might be updated to reflect any + // consensus rules that happen at finalization (e.g. block rewards). + FinalizeAndAssemble(chain ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) // Seal generates a new sealing request for the given input block and pushes diff --git a/consensus/errors.go b/consensus/errors.go index a005c5f63de8..ac5242fb54c5 100644 --- a/consensus/errors.go +++ b/consensus/errors.go @@ -31,7 +31,7 @@ var ( // to the current node. ErrFutureBlock = errors.New("block in the future") - // ErrInvalidNumber is returned if a block's number doesn't equal it's parent's + // ErrInvalidNumber is returned if a block's number doesn't equal its parent's // plus one. ErrInvalidNumber = errors.New("invalid block number") ) diff --git a/consensus/ethash/algorithm.go b/consensus/ethash/algorithm.go index c2972d76e73d..d6c871092ed3 100644 --- a/consensus/ethash/algorithm.go +++ b/consensus/ethash/algorithm.go @@ -27,10 +27,10 @@ import ( "time" "unsafe" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/bitutil" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/bitutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" "golang.org/x/crypto/sha3" ) diff --git a/consensus/ethash/algorithm_test.go b/consensus/ethash/algorithm_test.go index 433584c1c46c..f4f65047bebc 100644 --- a/consensus/ethash/algorithm_test.go +++ b/consensus/ethash/algorithm_test.go @@ -26,9 +26,9 @@ import ( "sync" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" ) // prepare converts an ethash cache or dataset from a byte stream into the internal @@ -716,7 +716,7 @@ func TestConcurrentDiskCacheGeneration(t *testing.T) { Difficulty: big.NewInt(167925187834220), GasLimit: 4015682, GasUsed: 0, - Time: big.NewInt(1488928920), + Time: 1488928920, Extra: []byte("www.bw.com"), MixDigest: common.HexToHash("0x3e140b0784516af5e5ec6730f2fb20cca22f32be399b9e4ad77d32541f798cd0"), Nonce: types.EncodeNonce(0xf400cd0006070c49), @@ -729,7 +729,7 @@ func TestConcurrentDiskCacheGeneration(t *testing.T) { go func(idx int) { defer pend.Done() - ethash := New(Config{cachedir, 0, 1, "", 0, 0, ModeNormal}, nil, false) + ethash := New(Config{cachedir, 0, 1, "", 0, 0, ModeNormal, nil}, nil, false) defer ethash.Close() if err := ethash.VerifySeal(nil, block.Header()); err != nil { t.Errorf("proc %d: block verification failed: %v", idx, err) diff --git a/consensus/ethash/api.go b/consensus/ethash/api.go index 0eae1b4d510b..68b3a84b0957 100644 --- a/consensus/ethash/api.go +++ b/consensus/ethash/api.go @@ -19,16 +19,16 @@ package ethash import ( "errors" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" ) var errEthashStopped = errors.New("ethash stopped") // API exposes ethash related methods for the RPC interface. type API struct { - ethash *Ethash // Make sure the mode of ethash is normal. + ethash *Ethash } // GetWork returns a work package for external miner. @@ -39,7 +39,7 @@ type API struct { // result[2] - 32 bytes hex encoded boundary condition ("target"), 2^256/difficulty // result[3] - hex encoded block number func (api *API) GetWork() ([4]string, error) { - if api.ethash.config.PowMode != ModeNormal && api.ethash.config.PowMode != ModeTest { + if api.ethash.remote == nil { return [4]string{}, errors.New("not supported") } @@ -47,13 +47,11 @@ func (api *API) GetWork() ([4]string, error) { workCh = make(chan [4]string, 1) errc = make(chan error, 1) ) - select { - case api.ethash.fetchWorkCh <- &sealWork{errc: errc, res: workCh}: - case <-api.ethash.exitCh: + case api.ethash.remote.fetchWorkCh <- &sealWork{errc: errc, res: workCh}: + case <-api.ethash.remote.exitCh: return [4]string{}, errEthashStopped } - select { case work := <-workCh: return work, nil @@ -66,23 +64,21 @@ func (api *API) GetWork() ([4]string, error) { // It returns an indication if the work was accepted. // Note either an invalid solution, a stale work a non-existent work will return false. func (api *API) SubmitWork(nonce types.BlockNonce, hash, digest common.Hash) bool { - if api.ethash.config.PowMode != ModeNormal && api.ethash.config.PowMode != ModeTest { + if api.ethash.remote == nil { return false } var errc = make(chan error, 1) - select { - case api.ethash.submitWorkCh <- &mineResult{ + case api.ethash.remote.submitWorkCh <- &mineResult{ nonce: nonce, mixDigest: digest, hash: hash, errc: errc, }: - case <-api.ethash.exitCh: + case <-api.ethash.remote.exitCh: return false } - err := <-errc return err == nil } @@ -94,21 +90,19 @@ func (api *API) SubmitWork(nonce types.BlockNonce, hash, digest common.Hash) boo // It accepts the miner hash rate and an identifier which must be unique // between nodes. func (api *API) SubmitHashRate(rate hexutil.Uint64, id common.Hash) bool { - if api.ethash.config.PowMode != ModeNormal && api.ethash.config.PowMode != ModeTest { + if api.ethash.remote == nil { return false } var done = make(chan struct{}, 1) - select { - case api.ethash.submitRateCh <- &hashrate{done: done, rate: uint64(rate), id: id}: - case <-api.ethash.exitCh: + case api.ethash.remote.submitRateCh <- &hashrate{done: done, rate: uint64(rate), id: id}: + case <-api.ethash.remote.exitCh: return false } // Block until hash rate submitted successfully. <-done - return true } diff --git a/consensus/ethash/consensus.go b/consensus/ethash/consensus.go index 498bcd98da96..c49514c41d92 100644 --- a/consensus/ethash/consensus.go +++ b/consensus/ethash/consensus.go @@ -25,14 +25,14 @@ import ( "time" mapset "github.com/deckarep/golang-set" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/consensus/misc" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/misc" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" "golang.org/x/crypto/sha3" ) @@ -45,6 +45,11 @@ var ( maxUncles = 2 // Maximum number of uncles allowed in a single block allowedFutureBlockTime = 15 * time.Second // Max time from current time allowed for blocks, before they're considered future blocks + // calcDifficultyEip2384 is the difficulty adjustment algorithm as specified by EIP 2384. + // It offsets the bomb 4M blocks from Constantinople, so in total 9M blocks. + // Specification EIP-2384: https://eips.ethereum.org/EIPS/eip-2384 + calcDifficultyEip2384 = makeDifficultyCalculator(big.NewInt(9000000)) + // calcDifficultyConstantinople is the difficulty adjustment algorithm for Constantinople. // It returns the difficulty that a new block should have when created at time given the // parent block's time and difficulty. The calculation uses the Byzantium rules, but with @@ -64,7 +69,6 @@ var ( // codebase, inherently breaking if the engine is swapped out. Please put common // error types into the consensus package. var ( - errLargeBlockTime = errors.New("timestamp too big") errZeroBlockTime = errors.New("timestamp equals parent's") errTooManyUncles = errors.New("too many uncles") errDuplicateUncle = errors.New("duplicate uncle") @@ -88,7 +92,7 @@ func (ethash *Ethash) VerifyHeader(chain consensus.ChainReader, header *types.He if ethash.config.PowMode == ModeFullFake { return nil } - // Short circuit if the header is known, or it's parent not + // Short circuit if the header is known, or its parent not number := header.Number.Uint64() if chain.GetHeader(header.Hash(), number) != nil { return nil @@ -193,6 +197,9 @@ func (ethash *Ethash) VerifyUncles(chain consensus.ChainReader, block *types.Blo if len(block.Uncles()) > maxUncles { return errTooManyUncles } + if len(block.Uncles()) == 0 { + return nil + } // Gather the set of past uncles and ancestors uncles, ancestors := mapset.NewSet(), make(map[common.Hash]*types.Header) @@ -243,20 +250,16 @@ func (ethash *Ethash) verifyHeader(chain consensus.ChainReader, header, parent * return fmt.Errorf("extra-data too long: %d > %d", len(header.Extra), params.MaximumExtraDataSize) } // Verify the header's timestamp - if uncle { - if header.Time.Cmp(math.MaxBig256) > 0 { - return errLargeBlockTime - } - } else { - if header.Time.Cmp(big.NewInt(time.Now().Add(allowedFutureBlockTime).Unix())) > 0 { + if !uncle { + if header.Time > uint64(time.Now().Add(allowedFutureBlockTime).Unix()) { return consensus.ErrFutureBlock } } - if header.Time.Cmp(parent.Time) <= 0 { + if header.Time <= parent.Time { return errZeroBlockTime } - // Verify the block's difficulty based in it's timestamp and parent's difficulty - expected := ethash.CalcDifficulty(chain, header.Time.Uint64(), parent) + // Verify the block's difficulty based in its timestamp and parent's difficulty + expected := ethash.CalcDifficulty(chain, header.Time, parent) if expected.Cmp(header.Difficulty) != 0 { return fmt.Errorf("invalid difficulty: have %v, want %v", header.Difficulty, expected) @@ -314,6 +317,8 @@ func (ethash *Ethash) CalcDifficulty(chain consensus.ChainReader, time uint64, p func CalcDifficulty(config *params.ChainConfig, time uint64, parent *types.Header) *big.Int { next := new(big.Int).Add(parent.Number, big1) switch { + case config.IsMuirGlacier(next): + return calcDifficultyEip2384(time, parent) case config.IsConstantinople(next): return calcDifficultyConstantinople(time, parent) case config.IsByzantium(next): @@ -350,7 +355,7 @@ func makeDifficultyCalculator(bombDelay *big.Int) func(time uint64, parent *type // ) + 2^(periodCount - 2) bigTime := new(big.Int).SetUint64(time) - bigParentTime := new(big.Int).Set(parent.Time) + bigParentTime := new(big.Int).SetUint64(parent.Time) // holds intermediate values to make the algo easier to read & audit x := new(big.Int) @@ -409,7 +414,7 @@ func calcDifficultyHomestead(time uint64, parent *types.Header) *big.Int { // ) + 2^(periodCount - 2) bigTime := new(big.Int).SetUint64(time) - bigParentTime := new(big.Int).Set(parent.Time) + bigParentTime := new(big.Int).SetUint64(parent.Time) // holds intermediate values to make the algo easier to read & audit x := new(big.Int) @@ -457,7 +462,7 @@ func calcDifficultyFrontier(time uint64, parent *types.Header) *big.Int { bigParentTime := new(big.Int) bigTime.SetUint64(time) - bigParentTime.Set(parent.Time) + bigParentTime.SetUint64(parent.Time) if bigTime.Sub(bigTime, bigParentTime).Cmp(params.DurationLimit) < 0 { diff.Add(parent.Difficulty, adjust) @@ -559,13 +564,21 @@ func (ethash *Ethash) Prepare(chain consensus.ChainReader, header *types.Header) if parent == nil { return consensus.ErrUnknownAncestor } - header.Difficulty = ethash.CalcDifficulty(chain, header.Time.Uint64(), parent) + header.Difficulty = ethash.CalcDifficulty(chain, header.Time, parent) return nil } // Finalize implements consensus.Engine, accumulating the block and uncle rewards, -// setting the final state and assembling the block. -func (ethash *Ethash) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { +// setting the final state on the header +func (ethash *Ethash) Finalize(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header) { + // Accumulate any block and uncle rewards and commit the final state root + accumulateRewards(chain.Config(), state, header, uncles) + header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) +} + +// FinalizeAndAssemble implements consensus.Engine, accumulating the block and +// uncle rewards, setting the final state and assembling the block. +func (ethash *Ethash) FinalizeAndAssemble(chain consensus.ChainReader, header *types.Header, state *state.StateDB, txs []*types.Transaction, uncles []*types.Header, receipts []*types.Receipt) (*types.Block, error) { // Accumulate any block and uncle rewards and commit the final state root accumulateRewards(chain.Config(), state, header, uncles) header.Root = state.IntermediateRoot(chain.Config().IsEIP158(header.Number)) diff --git a/consensus/ethash/consensus_test.go b/consensus/ethash/consensus_test.go index d2b2e77d64fc..675737d9e1aa 100644 --- a/consensus/ethash/consensus_test.go +++ b/consensus/ethash/consensus_test.go @@ -23,9 +23,9 @@ import ( "path/filepath" "testing" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" ) type diffTest struct { @@ -76,7 +76,7 @@ func TestCalcDifficulty(t *testing.T) { number := new(big.Int).Sub(test.CurrentBlocknumber, big.NewInt(1)) diff := CalcDifficulty(config, test.CurrentTimestamp, &types.Header{ Number: number, - Time: new(big.Int).SetUint64(test.ParentTimestamp), + Time: test.ParentTimestamp, Difficulty: test.ParentDifficulty, }) if diff.Cmp(test.CurrentDifficulty) != 0 { diff --git a/consensus/ethash/ethash.go b/consensus/ethash/ethash.go index 287efa0b69ba..4bf78b0a1d88 100644 --- a/consensus/ethash/ethash.go +++ b/consensus/ethash/ethash.go @@ -34,12 +34,10 @@ import ( "unsafe" mmap "github.com/edsrzf/mmap-go" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/rpc" "github.com/hashicorp/golang-lru/simplelru" ) @@ -50,7 +48,7 @@ var ( two256 = new(big.Int).Exp(big.NewInt(2), big.NewInt(256), big.NewInt(0)) // sharedEthash is a full instance that can be shared between multiple users. - sharedEthash = New(Config{"", 3, 0, "", 1, 0, ModeNormal}, nil, false) + sharedEthash = New(Config{"", 3, 0, "", 1, 0, ModeNormal, nil}, nil, false) // algorithmRevision is the data structure version used for file naming. algorithmRevision = 23 @@ -403,36 +401,8 @@ type Config struct { DatasetsInMem int DatasetsOnDisk int PowMode Mode -} - -// sealTask wraps a seal block with relative result channel for remote sealer thread. -type sealTask struct { - block *types.Block - results chan<- *types.Block -} - -// mineResult wraps the pow solution parameters for the specified block. -type mineResult struct { - nonce types.BlockNonce - mixDigest common.Hash - hash common.Hash - - errc chan error -} - -// hashrate wraps the hash rate submitted by the remote sealer. -type hashrate struct { - id common.Hash - ping time.Time - rate uint64 - done chan struct{} -} - -// sealWork wraps a seal work package for remote sealer. -type sealWork struct { - errc chan error - res chan [4]string + Log log.Logger `toml:"-"` } // Ethash is a consensus engine based on proof-of-work implementing the ethash @@ -448,52 +418,42 @@ type Ethash struct { threads int // Number of threads to mine on if mining update chan struct{} // Notification channel to update mining parameters hashrate metrics.Meter // Meter tracking the average hashrate - - // Remote sealer related fields - workCh chan *sealTask // Notification channel to push new work and relative result channel to remote sealer - fetchWorkCh chan *sealWork // Channel used for remote sealer to fetch mining work - submitWorkCh chan *mineResult // Channel used for remote sealer to submit their mining result - fetchRateCh chan chan uint64 // Channel used to gather submitted hash rate for local or remote sealer. - submitRateCh chan *hashrate // Channel used for remote sealer to submit their mining hashrate + remote *remoteSealer // The fields below are hooks for testing shared *Ethash // Shared PoW verifier to avoid cache regeneration fakeFail uint64 // Block number which fails PoW check even in fake mode fakeDelay time.Duration // Time delay to sleep for before returning from verify - lock sync.Mutex // Ensures thread safety for the in-memory caches and mining fields - closeOnce sync.Once // Ensures exit channel will not be closed twice. - exitCh chan chan error // Notification channel to exiting backend threads + lock sync.Mutex // Ensures thread safety for the in-memory caches and mining fields + closeOnce sync.Once // Ensures exit channel will not be closed twice. } // New creates a full sized ethash PoW scheme and starts a background thread for // remote mining, also optionally notifying a batch of remote services of new work // packages. func New(config Config, notify []string, noverify bool) *Ethash { + if config.Log == nil { + config.Log = log.Root() + } if config.CachesInMem <= 0 { - log.Warn("One ethash cache must always be in memory", "requested", config.CachesInMem) + config.Log.Warn("One ethash cache must always be in memory", "requested", config.CachesInMem) config.CachesInMem = 1 } if config.CacheDir != "" && config.CachesOnDisk > 0 { - log.Info("Disk storage enabled for ethash caches", "dir", config.CacheDir, "count", config.CachesOnDisk) + config.Log.Info("Disk storage enabled for ethash caches", "dir", config.CacheDir, "count", config.CachesOnDisk) } if config.DatasetDir != "" && config.DatasetsOnDisk > 0 { - log.Info("Disk storage enabled for ethash DAGs", "dir", config.DatasetDir, "count", config.DatasetsOnDisk) + config.Log.Info("Disk storage enabled for ethash DAGs", "dir", config.DatasetDir, "count", config.DatasetsOnDisk) } ethash := &Ethash{ - config: config, - caches: newlru("cache", config.CachesInMem, newCache), - datasets: newlru("dataset", config.DatasetsInMem, newDataset), - update: make(chan struct{}), - hashrate: metrics.NewMeterForced(), - workCh: make(chan *sealTask), - fetchWorkCh: make(chan *sealWork), - submitWorkCh: make(chan *mineResult), - fetchRateCh: make(chan chan uint64), - submitRateCh: make(chan *hashrate), - exitCh: make(chan chan error), - } - go ethash.remote(notify, noverify) + config: config, + caches: newlru("cache", config.CachesInMem, newCache), + datasets: newlru("dataset", config.DatasetsInMem, newDataset), + update: make(chan struct{}), + hashrate: metrics.NewMeterForced(), + } + ethash.remote = startRemoteSealer(ethash, notify, noverify) return ethash } @@ -501,19 +461,13 @@ func New(config Config, notify []string, noverify bool) *Ethash { // purposes. func NewTester(notify []string, noverify bool) *Ethash { ethash := &Ethash{ - config: Config{PowMode: ModeTest}, - caches: newlru("cache", 1, newCache), - datasets: newlru("dataset", 1, newDataset), - update: make(chan struct{}), - hashrate: metrics.NewMeterForced(), - workCh: make(chan *sealTask), - fetchWorkCh: make(chan *sealWork), - submitWorkCh: make(chan *mineResult), - fetchRateCh: make(chan chan uint64), - submitRateCh: make(chan *hashrate), - exitCh: make(chan chan error), - } - go ethash.remote(notify, noverify) + config: Config{PowMode: ModeTest, Log: log.Root()}, + caches: newlru("cache", 1, newCache), + datasets: newlru("dataset", 1, newDataset), + update: make(chan struct{}), + hashrate: metrics.NewMeterForced(), + } + ethash.remote = startRemoteSealer(ethash, notify, noverify) return ethash } @@ -524,6 +478,7 @@ func NewFaker() *Ethash { return &Ethash{ config: Config{ PowMode: ModeFake, + Log: log.Root(), }, } } @@ -535,6 +490,7 @@ func NewFakeFailer(fail uint64) *Ethash { return &Ethash{ config: Config{ PowMode: ModeFake, + Log: log.Root(), }, fakeFail: fail, } @@ -547,6 +503,7 @@ func NewFakeDelayer(delay time.Duration) *Ethash { return &Ethash{ config: Config{ PowMode: ModeFake, + Log: log.Root(), }, fakeDelay: delay, } @@ -558,6 +515,7 @@ func NewFullFaker() *Ethash { return &Ethash{ config: Config{ PowMode: ModeFullFake, + Log: log.Root(), }, } } @@ -573,13 +531,11 @@ func (ethash *Ethash) Close() error { var err error ethash.closeOnce.Do(func() { // Short circuit if the exit channel is not allocated. - if ethash.exitCh == nil { + if ethash.remote == nil { return } - errc := make(chan error) - ethash.exitCh <- errc - err = <-errc - close(ethash.exitCh) + close(ethash.remote.requestExit) + <-ethash.remote.exitCh }) return err } @@ -680,8 +636,8 @@ func (ethash *Ethash) Hashrate() float64 { var res = make(chan uint64, 1) select { - case ethash.fetchRateCh <- res: - case <-ethash.exitCh: + case ethash.remote.fetchRateCh <- res: + case <-ethash.remote.exitCh: // Return local hashrate only if ethash is stopped. return ethash.hashrate.Rate1() } diff --git a/consensus/ethash/ethash_test.go b/consensus/ethash/ethash_test.go index d1b00425a997..fdfd81320f96 100644 --- a/consensus/ethash/ethash_test.go +++ b/consensus/ethash/ethash_test.go @@ -25,9 +25,9 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" ) // Tests that ethash works correctly in test mode. @@ -49,7 +49,7 @@ func TestTestMode(t *testing.T) { if err := ethash.VerifySeal(nil, header); err != nil { t.Fatalf("unexpected verification error: %v", err) } - case <-time.NewTimer(time.Second).C: + case <-time.NewTimer(2 * time.Second).C: t.Error("sealing result timeout") } } diff --git a/consensus/ethash/sealer.go b/consensus/ethash/sealer.go index 42271023b3ca..52c4ed46dc9e 100644 --- a/consensus/ethash/sealer.go +++ b/consensus/ethash/sealer.go @@ -18,6 +18,7 @@ package ethash import ( "bytes" + "context" crand "crypto/rand" "encoding/json" "errors" @@ -29,11 +30,10 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core/types" ) const ( @@ -56,7 +56,7 @@ func (ethash *Ethash) Seal(chain consensus.ChainReader, block *types.Block, resu select { case results <- block.WithSeal(header): default: - log.Warn("Sealing result is not read by miner", "mode", "fake", "sealhash", ethash.SealHash(block.Header())) + ethash.config.Log.Warn("Sealing result is not read by miner", "mode", "fake", "sealhash", ethash.SealHash(block.Header())) } return nil } @@ -85,8 +85,8 @@ func (ethash *Ethash) Seal(chain consensus.ChainReader, block *types.Block, resu threads = 0 // Allows disabling local mining without extra logic around local/remote } // Push new work to remote sealer - if ethash.workCh != nil { - ethash.workCh <- &sealTask{block: block, results: results} + if ethash.remote != nil { + ethash.remote.workCh <- &sealTask{block: block, results: results} } var ( pend sync.WaitGroup @@ -111,14 +111,14 @@ func (ethash *Ethash) Seal(chain consensus.ChainReader, block *types.Block, resu select { case results <- result: default: - log.Warn("Sealing result is not read by miner", "mode", "local", "sealhash", ethash.SealHash(block.Header())) + ethash.config.Log.Warn("Sealing result is not read by miner", "mode", "local", "sealhash", ethash.SealHash(block.Header())) } close(abort) case <-ethash.update: // Thread count was changed on user request, restart close(abort) if err := ethash.Seal(chain, block, results, stop); err != nil { - log.Error("Failed to restart sealing after update", "err", err) + ethash.config.Log.Error("Failed to restart sealing after update", "err", err) } } // Wait for all miners to terminate and return the block @@ -143,7 +143,7 @@ func (ethash *Ethash) mine(block *types.Block, id int, seed uint64, abort chan s attempts = int64(0) nonce = seed ) - logger := log.New("miner", id) + logger := ethash.config.Log.New("miner", id) logger.Trace("Started ethash search for new nonces", "seed", seed) search: for { @@ -186,160 +186,128 @@ search: runtime.KeepAlive(dataset) } -// remote is a standalone goroutine to handle remote mining related stuff. -func (ethash *Ethash) remote(notify []string, noverify bool) { - var ( - works = make(map[common.Hash]*types.Block) - rates = make(map[common.Hash]hashrate) +// This is the timeout for HTTP requests to notify external miners. +const remoteSealerTimeout = 1 * time.Second - results chan<- *types.Block - currentBlock *types.Block - currentWork [4]string +type remoteSealer struct { + works map[common.Hash]*types.Block + rates map[common.Hash]hashrate + currentBlock *types.Block + currentWork [4]string + notifyCtx context.Context + cancelNotify context.CancelFunc // cancels all notification requests + reqWG sync.WaitGroup // tracks notification request goroutines - notifyTransport = &http.Transport{} - notifyClient = &http.Client{ - Transport: notifyTransport, - Timeout: time.Second, - } - notifyReqs = make([]*http.Request, len(notify)) - ) - // notifyWork notifies all the specified mining endpoints of the availability of - // new work to be processed. - notifyWork := func() { - work := currentWork - blob, _ := json.Marshal(work) - - for i, url := range notify { - // Terminate any previously pending request and create the new work - if notifyReqs[i] != nil { - notifyTransport.CancelRequest(notifyReqs[i]) - } - notifyReqs[i], _ = http.NewRequest("POST", url, bytes.NewReader(blob)) - notifyReqs[i].Header.Set("Content-Type", "application/json") - - // Push the new work concurrently to all the remote nodes - go func(req *http.Request, url string) { - res, err := notifyClient.Do(req) - if err != nil { - log.Warn("Failed to notify remote miner", "err", err) - } else { - log.Trace("Notified remote miner", "miner", url, "hash", log.Lazy{Fn: func() common.Hash { return common.HexToHash(work[0]) }}, "target", work[2]) - res.Body.Close() - } - }(notifyReqs[i], url) - } - } - // makeWork creates a work package for external miner. - // - // The work package consists of 3 strings: - // result[0], 32 bytes hex encoded current block header pow-hash - // result[1], 32 bytes hex encoded seed hash used for DAG - // result[2], 32 bytes hex encoded boundary condition ("target"), 2^256/difficulty - // result[3], hex encoded block number - makeWork := func(block *types.Block) { - hash := ethash.SealHash(block.Header()) - - currentWork[0] = hash.Hex() - currentWork[1] = common.BytesToHash(SeedHash(block.NumberU64())).Hex() - currentWork[2] = common.BytesToHash(new(big.Int).Div(two256, block.Difficulty()).Bytes()).Hex() - currentWork[3] = hexutil.EncodeBig(block.Number()) - - // Trace the seal work fetched by remote sealer. - currentBlock = block - works[hash] = block - } - // submitWork verifies the submitted pow solution, returning - // whether the solution was accepted or not (not can be both a bad pow as well as - // any other error, like no pending work or stale mining result). - submitWork := func(nonce types.BlockNonce, mixDigest common.Hash, sealhash common.Hash) bool { - if currentBlock == nil { - log.Error("Pending work without block", "sealhash", sealhash) - return false - } - // Make sure the work submitted is present - block := works[sealhash] - if block == nil { - log.Warn("Work submitted but none pending", "sealhash", sealhash, "curnumber", currentBlock.NumberU64()) - return false - } - // Verify the correctness of submitted result. - header := block.Header() - header.Nonce = nonce - header.MixDigest = mixDigest - - start := time.Now() - if !noverify { - if err := ethash.verifySeal(nil, header, true); err != nil { - log.Warn("Invalid proof-of-work submitted", "sealhash", sealhash, "elapsed", time.Since(start), "err", err) - return false - } - } - // Make sure the result channel is assigned. - if results == nil { - log.Warn("Ethash result channel is empty, submitted mining result is rejected") - return false - } - log.Trace("Verified correct proof-of-work", "sealhash", sealhash, "elapsed", time.Since(start)) + ethash *Ethash + noverify bool + notifyURLs []string + results chan<- *types.Block + workCh chan *sealTask // Notification channel to push new work and relative result channel to remote sealer + fetchWorkCh chan *sealWork // Channel used for remote sealer to fetch mining work + submitWorkCh chan *mineResult // Channel used for remote sealer to submit their mining result + fetchRateCh chan chan uint64 // Channel used to gather submitted hash rate for local or remote sealer. + submitRateCh chan *hashrate // Channel used for remote sealer to submit their mining hashrate + requestExit chan struct{} + exitCh chan struct{} +} - // Solutions seems to be valid, return to the miner and notify acceptance. - solution := block.WithSeal(header) +// sealTask wraps a seal block with relative result channel for remote sealer thread. +type sealTask struct { + block *types.Block + results chan<- *types.Block +} - // The submitted solution is within the scope of acceptance. - if solution.NumberU64()+staleThreshold > currentBlock.NumberU64() { - select { - case results <- solution: - log.Debug("Work submitted is acceptable", "number", solution.NumberU64(), "sealhash", sealhash, "hash", solution.Hash()) - return true - default: - log.Warn("Sealing result is not read by miner", "mode", "remote", "sealhash", sealhash) - return false - } - } - // The submitted block is too old to accept, drop it. - log.Warn("Work submitted is too old", "number", solution.NumberU64(), "sealhash", sealhash, "hash", solution.Hash()) - return false +// mineResult wraps the pow solution parameters for the specified block. +type mineResult struct { + nonce types.BlockNonce + mixDigest common.Hash + hash common.Hash + + errc chan error +} + +// hashrate wraps the hash rate submitted by the remote sealer. +type hashrate struct { + id common.Hash + ping time.Time + rate uint64 + + done chan struct{} +} + +// sealWork wraps a seal work package for remote sealer. +type sealWork struct { + errc chan error + res chan [4]string +} + +func startRemoteSealer(ethash *Ethash, urls []string, noverify bool) *remoteSealer { + ctx, cancel := context.WithCancel(context.Background()) + s := &remoteSealer{ + ethash: ethash, + noverify: noverify, + notifyURLs: urls, + notifyCtx: ctx, + cancelNotify: cancel, + works: make(map[common.Hash]*types.Block), + rates: make(map[common.Hash]hashrate), + workCh: make(chan *sealTask), + fetchWorkCh: make(chan *sealWork), + submitWorkCh: make(chan *mineResult), + fetchRateCh: make(chan chan uint64), + submitRateCh: make(chan *hashrate), + requestExit: make(chan struct{}), + exitCh: make(chan struct{}), } + go s.loop() + return s +} + +func (s *remoteSealer) loop() { + defer func() { + s.ethash.config.Log.Trace("Ethash remote sealer is exiting") + s.cancelNotify() + s.reqWG.Wait() + close(s.exitCh) + }() ticker := time.NewTicker(5 * time.Second) defer ticker.Stop() for { select { - case work := <-ethash.workCh: + case work := <-s.workCh: // Update current work with new received block. // Note same work can be past twice, happens when changing CPU threads. - results = work.results + s.results = work.results + s.makeWork(work.block) + s.notifyWork() - makeWork(work.block) - - // Notify and requested URLs of the new work availability - notifyWork() - - case work := <-ethash.fetchWorkCh: + case work := <-s.fetchWorkCh: // Return current mining work to remote miner. - if currentBlock == nil { + if s.currentBlock == nil { work.errc <- errNoMiningWork } else { - work.res <- currentWork + work.res <- s.currentWork } - case result := <-ethash.submitWorkCh: + case result := <-s.submitWorkCh: // Verify submitted PoW solution based on maintained mining blocks. - if submitWork(result.nonce, result.mixDigest, result.hash) { + if s.submitWork(result.nonce, result.mixDigest, result.hash) { result.errc <- nil } else { result.errc <- errInvalidSealResult } - case result := <-ethash.submitRateCh: + case result := <-s.submitRateCh: // Trace remote sealer's hash rate by submitted value. - rates[result.id] = hashrate{rate: result.rate, ping: time.Now()} + s.rates[result.id] = hashrate{rate: result.rate, ping: time.Now()} close(result.done) - case req := <-ethash.fetchRateCh: + case req := <-s.fetchRateCh: // Gather all hash rate submitted by remote sealer. var total uint64 - for _, rate := range rates { + for _, rate := range s.rates { // this could overflow total += rate.rate } @@ -347,25 +315,126 @@ func (ethash *Ethash) remote(notify []string, noverify bool) { case <-ticker.C: // Clear stale submitted hash rate. - for id, rate := range rates { + for id, rate := range s.rates { if time.Since(rate.ping) > 10*time.Second { - delete(rates, id) + delete(s.rates, id) } } // Clear stale pending blocks - if currentBlock != nil { - for hash, block := range works { - if block.NumberU64()+staleThreshold <= currentBlock.NumberU64() { - delete(works, hash) + if s.currentBlock != nil { + for hash, block := range s.works { + if block.NumberU64()+staleThreshold <= s.currentBlock.NumberU64() { + delete(s.works, hash) } } } - case errc := <-ethash.exitCh: - // Exit remote loop if ethash is closed and return relevant error. - errc <- nil - log.Trace("Ethash remote sealer is exiting") + case <-s.requestExit: return } } } + +// makeWork creates a work package for external miner. +// +// The work package consists of 3 strings: +// result[0], 32 bytes hex encoded current block header pow-hash +// result[1], 32 bytes hex encoded seed hash used for DAG +// result[2], 32 bytes hex encoded boundary condition ("target"), 2^256/difficulty +// result[3], hex encoded block number +func (s *remoteSealer) makeWork(block *types.Block) { + hash := s.ethash.SealHash(block.Header()) + s.currentWork[0] = hash.Hex() + s.currentWork[1] = common.BytesToHash(SeedHash(block.NumberU64())).Hex() + s.currentWork[2] = common.BytesToHash(new(big.Int).Div(two256, block.Difficulty()).Bytes()).Hex() + s.currentWork[3] = hexutil.EncodeBig(block.Number()) + + // Trace the seal work fetched by remote sealer. + s.currentBlock = block + s.works[hash] = block +} + +// notifyWork notifies all the specified mining endpoints of the availability of +// new work to be processed. +func (s *remoteSealer) notifyWork() { + work := s.currentWork + blob, _ := json.Marshal(work) + s.reqWG.Add(len(s.notifyURLs)) + for _, url := range s.notifyURLs { + go s.sendNotification(s.notifyCtx, url, blob, work) + } +} + +func (s *remoteSealer) sendNotification(ctx context.Context, url string, json []byte, work [4]string) { + defer s.reqWG.Done() + + req, err := http.NewRequest("POST", url, bytes.NewReader(json)) + if err != nil { + s.ethash.config.Log.Warn("Can't create remote miner notification", "err", err) + return + } + ctx, cancel := context.WithTimeout(ctx, remoteSealerTimeout) + defer cancel() + req = req.WithContext(ctx) + req.Header.Set("Content-Type", "application/json") + + resp, err := http.DefaultClient.Do(req) + if err != nil { + s.ethash.config.Log.Warn("Failed to notify remote miner", "err", err) + } else { + s.ethash.config.Log.Trace("Notified remote miner", "miner", url, "hash", work[0], "target", work[2]) + resp.Body.Close() + } +} + +// submitWork verifies the submitted pow solution, returning +// whether the solution was accepted or not (not can be both a bad pow as well as +// any other error, like no pending work or stale mining result). +func (s *remoteSealer) submitWork(nonce types.BlockNonce, mixDigest common.Hash, sealhash common.Hash) bool { + if s.currentBlock == nil { + s.ethash.config.Log.Error("Pending work without block", "sealhash", sealhash) + return false + } + // Make sure the work submitted is present + block := s.works[sealhash] + if block == nil { + s.ethash.config.Log.Warn("Work submitted but none pending", "sealhash", sealhash, "curnumber", s.currentBlock.NumberU64()) + return false + } + // Verify the correctness of submitted result. + header := block.Header() + header.Nonce = nonce + header.MixDigest = mixDigest + + start := time.Now() + if !s.noverify { + if err := s.ethash.verifySeal(nil, header, true); err != nil { + s.ethash.config.Log.Warn("Invalid proof-of-work submitted", "sealhash", sealhash, "elapsed", common.PrettyDuration(time.Since(start)), "err", err) + return false + } + } + // Make sure the result channel is assigned. + if s.results == nil { + s.ethash.config.Log.Warn("Ethash result channel is empty, submitted mining result is rejected") + return false + } + s.ethash.config.Log.Trace("Verified correct proof-of-work", "sealhash", sealhash, "elapsed", common.PrettyDuration(time.Since(start))) + + // Solutions seems to be valid, return to the miner and notify acceptance. + solution := block.WithSeal(header) + + // The submitted solution is within the scope of acceptance. + if solution.NumberU64()+staleThreshold > s.currentBlock.NumberU64() { + select { + case s.results <- solution: + s.ethash.config.Log.Debug("Work submitted is acceptable", "number", solution.NumberU64(), "sealhash", sealhash, "hash", solution.Hash()) + return true + default: + s.ethash.config.Log.Warn("Sealing result is not read by miner", "mode", "remote", "sealhash", sealhash) + return false + } + } + // The submitted block is too old to accept, drop it. + s.ethash.config.Log.Warn("Work submitted is too old", "number", solution.NumberU64(), "sealhash", sealhash, "hash", solution.Hash()) + return false +} diff --git a/consensus/ethash/sealer_test.go b/consensus/ethash/sealer_test.go index 42b407f866e9..7f83def072f1 100644 --- a/consensus/ethash/sealer_test.go +++ b/consensus/ethash/sealer_test.go @@ -1,62 +1,58 @@ +// Copyright 2018 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 ethash import ( "encoding/json" "io/ioutil" "math/big" - "net" "net/http" + "net/http/httptest" "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/internal/testlog" + "github.com/ethereum/go-ethereum/log" ) // Tests whether remote HTTP servers are correctly notified of new work. func TestRemoteNotify(t *testing.T) { - // Start a simple webserver to capture notifications + // Start a simple web server to capture notifications. sink := make(chan [3]string) - - server := &http.Server{ - Handler: http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - blob, err := ioutil.ReadAll(req.Body) - if err != nil { - t.Fatalf("failed to read miner notification: %v", err) - } - var work [3]string - if err := json.Unmarshal(blob, &work); err != nil { - t.Fatalf("failed to unmarshal miner notification: %v", err) - } - sink <- work - }), - } - // Open a custom listener to extract its local address - listener, err := net.Listen("tcp", "localhost:0") - if err != nil { - t.Fatalf("failed to open notification server: %v", err) - } - defer listener.Close() - - go server.Serve(listener) - - // Wait for server to start listening - var tries int - for tries = 0; tries < 10; tries++ { - conn, _ := net.DialTimeout("tcp", listener.Addr().String(), 1*time.Second) - if conn != nil { - break + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + blob, err := ioutil.ReadAll(req.Body) + if err != nil { + t.Errorf("failed to read miner notification: %v", err) } - } - if tries == 10 { - t.Fatal("tcp listener not ready for more than 10 seconds") - } + var work [3]string + if err := json.Unmarshal(blob, &work); err != nil { + t.Errorf("failed to unmarshal miner notification: %v", err) + } + sink <- work + })) + defer server.Close() - // Create the custom ethash engine - ethash := NewTester([]string{"http://" + listener.Addr().String()}, false) + // Create the custom ethash engine. + ethash := NewTester([]string{server.URL}, false) defer ethash.Close() - // Stream a work task and ensure the notification bubbles out + // Stream a work task and ensure the notification bubbles out. header := &types.Header{Number: big.NewInt(1), Difficulty: big.NewInt(100)} block := types.NewBlockWithHeader(header) @@ -81,46 +77,37 @@ func TestRemoteNotify(t *testing.T) { // Tests that pushing work packages fast to the miner doesn't cause any data race // issues in the notifications. func TestRemoteMultiNotify(t *testing.T) { - // Start a simple webserver to capture notifications + // Start a simple web server to capture notifications. sink := make(chan [3]string, 64) + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + blob, err := ioutil.ReadAll(req.Body) + if err != nil { + t.Errorf("failed to read miner notification: %v", err) + } + var work [3]string + if err := json.Unmarshal(blob, &work); err != nil { + t.Errorf("failed to unmarshal miner notification: %v", err) + } + sink <- work + })) + defer server.Close() - server := &http.Server{ - Handler: http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - blob, err := ioutil.ReadAll(req.Body) - if err != nil { - t.Fatalf("failed to read miner notification: %v", err) - } - var work [3]string - if err := json.Unmarshal(blob, &work); err != nil { - t.Fatalf("failed to unmarshal miner notification: %v", err) - } - sink <- work - }), - } - // Open a custom listener to extract its local address - listener, err := net.Listen("tcp", "localhost:0") - if err != nil { - t.Fatalf("failed to open notification server: %v", err) - } - defer listener.Close() - - go server.Serve(listener) - - // Create the custom ethash engine - ethash := NewTester([]string{"http://" + listener.Addr().String()}, false) + // Create the custom ethash engine. + ethash := NewTester([]string{server.URL}, false) + ethash.config.Log = testlog.Logger(t, log.LvlWarn) defer ethash.Close() - // Stream a lot of work task and ensure all the notifications bubble out + // Stream a lot of work task and ensure all the notifications bubble out. for i := 0; i < cap(sink); i++ { header := &types.Header{Number: big.NewInt(int64(i)), Difficulty: big.NewInt(100)} block := types.NewBlockWithHeader(header) - ethash.Seal(nil, block, nil, nil) } + for i := 0; i < cap(sink); i++ { select { case <-sink: - case <-time.After(3 * time.Second): + case <-time.After(10 * time.Second): t.Fatalf("notification %d timed out", i) } } @@ -190,10 +177,10 @@ func TestStaleSubmission(t *testing.T) { select { case res := <-results: if res.Header().Nonce != fakeNonce { - t.Errorf("case %d block nonce mismatch, want %s, get %s", id+1, fakeNonce, res.Header().Nonce) + t.Errorf("case %d block nonce mismatch, want %x, get %x", id+1, fakeNonce, res.Header().Nonce) } if res.Header().MixDigest != fakeDigest { - t.Errorf("case %d block digest mismatch, want %s, get %s", id+1, fakeDigest, res.Header().MixDigest) + t.Errorf("case %d block digest mismatch, want %x, get %x", id+1, fakeDigest, res.Header().MixDigest) } if res.Header().Difficulty.Uint64() != c.headers[c.submitIndex].Difficulty.Uint64() { t.Errorf("case %d block difficulty mismatch, want %d, get %d", id+1, c.headers[c.submitIndex].Difficulty, res.Header().Difficulty) diff --git a/consensus/misc/dao.go b/consensus/misc/dao.go index c1755d6363dc..9b22bd7a52ab 100644 --- a/consensus/misc/dao.go +++ b/consensus/misc/dao.go @@ -21,9 +21,9 @@ import ( "errors" "math/big" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" ) var ( diff --git a/consensus/misc/forks.go b/consensus/misc/forks.go index 09384b595a69..4a5e7c37e03c 100644 --- a/consensus/misc/forks.go +++ b/consensus/misc/forks.go @@ -19,9 +19,9 @@ package misc import ( "fmt" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" ) // VerifyForkHashes verifies that blocks conforming to network hard-forks do have diff --git a/console/bridge.go b/console/bridge.go index def387b378fc..c7a67a68503d 100644 --- a/console/bridge.go +++ b/console/bridge.go @@ -23,9 +23,10 @@ import ( "strings" "time" - "github.com/nebulaai/nbai-node/accounts/usbwallet" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/accounts/scwallet" + "github.com/ethereum/go-ethereum/accounts/usbwallet" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rpc" "github.com/robertkrimen/otto" ) @@ -58,14 +59,14 @@ func (b *bridge) NewAccount(call otto.FunctionCall) (response otto.Value) { switch { // No password was specified, prompt the user for it case len(call.ArgumentList) == 0: - if password, err = b.prompter.PromptPassword("Passphrase: "); err != nil { + if password, err = b.prompter.PromptPassword("Password: "); err != nil { throwJSException(err.Error()) } - if confirm, err = b.prompter.PromptPassword("Repeat passphrase: "); err != nil { + if confirm, err = b.prompter.PromptPassword("Repeat password: "); err != nil { throwJSException(err.Error()) } if password != confirm { - throwJSException("passphrases don't match!") + throwJSException("passwords don't match!") } // A single string password was specified, use that @@ -104,10 +105,92 @@ func (b *bridge) OpenWallet(call otto.FunctionCall) (response otto.Value) { if err == nil { return val } - // Wallet open failed, report error unless it's a PIN entry - if !strings.HasSuffix(err.Error(), usbwallet.ErrTrezorPINNeeded.Error()) { + + // Wallet open failed, report error unless it's a PIN or PUK entry + switch { + case strings.HasSuffix(err.Error(), usbwallet.ErrTrezorPINNeeded.Error()): + val, err = b.readPinAndReopenWallet(call) + if err == nil { + return val + } + val, err = b.readPassphraseAndReopenWallet(call) + if err != nil { + throwJSException(err.Error()) + } + + case strings.HasSuffix(err.Error(), scwallet.ErrPairingPasswordNeeded.Error()): + // PUK input requested, fetch from the user and call open again + if input, err := b.prompter.PromptPassword("Please enter the pairing password: "); err != nil { + throwJSException(err.Error()) + } else { + passwd, _ = otto.ToValue(input) + } + if val, err = call.Otto.Call("jeth.openWallet", nil, wallet, passwd); err != nil { + if !strings.HasSuffix(err.Error(), scwallet.ErrPINNeeded.Error()) { + throwJSException(err.Error()) + } else { + // PIN input requested, fetch from the user and call open again + 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()) + } + } + } + + case strings.HasSuffix(err.Error(), scwallet.ErrPINUnblockNeeded.Error()): + // PIN unblock requested, fetch PUK and new PIN from the user + var pukpin string + if input, err := b.prompter.PromptPassword("Please enter current PUK: "); err != nil { + throwJSException(err.Error()) + } else { + pukpin = input + } + if input, err := b.prompter.PromptPassword("Please enter new PIN: "); err != nil { + throwJSException(err.Error()) + } else { + pukpin += input + } + passwd, _ = otto.ToValue(pukpin) + if val, err = call.Otto.Call("jeth.openWallet", nil, wallet, passwd); err != nil { + throwJSException(err.Error()) + } + + case strings.HasSuffix(err.Error(), scwallet.ErrPINNeeded.Error()): + // PIN input requested, fetch from the user and call open again + 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()) + } + + default: + // Unknown error occurred, drop to the user throwJSException(err.Error()) } + return val +} + +func (b *bridge) readPassphraseAndReopenWallet(call otto.FunctionCall) (otto.Value, error) { + var passwd otto.Value + wallet := call.Argument(0) + if input, err := b.prompter.PromptPassword("Please enter your password: "); err != nil { + throwJSException(err.Error()) + } else { + passwd, _ = otto.ToValue(input) + } + return call.Otto.Call("jeth.openWallet", nil, wallet, passwd) +} + +func (b *bridge) readPinAndReopenWallet(call otto.FunctionCall) (otto.Value, error) { + var passwd otto.Value + wallet := call.Argument(0) // 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") @@ -121,10 +204,7 @@ func (b *bridge) OpenWallet(call otto.FunctionCall) (response otto.Value) { } else { passwd, _ = otto.ToValue(input) } - if val, err = call.Otto.Call("jeth.openWallet", nil, wallet, passwd); err != nil { - throwJSException(err.Error()) - } - return val + return call.Otto.Call("jeth.openWallet", nil, wallet, passwd) } // UnlockAccount is a wrapper around the personal.unlockAccount RPC method that @@ -143,7 +223,7 @@ func (b *bridge) UnlockAccount(call otto.FunctionCall) (response otto.Value) { if call.Argument(1).IsUndefined() || call.Argument(1).IsNull() { fmt.Fprintf(b.printer, "Unlock account %s\n", account) - if input, err := b.prompter.PromptPassword("Passphrase: "); err != nil { + if input, err := b.prompter.PromptPassword("Password: "); err != nil { throwJSException(err.Error()) } else { passwd, _ = otto.ToValue(input) @@ -190,7 +270,7 @@ func (b *bridge) Sign(call otto.FunctionCall) (response otto.Value) { // if the password is not given or null ask the user and ensure password is a string if passwd.IsUndefined() || passwd.IsNull() { fmt.Fprintf(b.printer, "Give password for account %s\n", account) - if input, err := b.prompter.PromptPassword("Passphrase: "); err != nil { + if input, err := b.prompter.PromptPassword("Password: "); err != nil { throwJSException(err.Error()) } else { passwd, _ = otto.ToValue(input) diff --git a/console/console.go b/console/console.go index e3226fa96281..5326ed2c8791 100644 --- a/console/console.go +++ b/console/console.go @@ -28,9 +28,9 @@ import ( "strings" "syscall" - "github.com/nebulaai/nbai-node/internal/jsre" - "github.com/nebulaai/nbai-node/internal/web3ext" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/internal/jsre" + "github.com/ethereum/go-ethereum/internal/web3ext" + "github.com/ethereum/go-ethereum/rpc" "github.com/mattn/go-colorable" "github.com/peterh/liner" "github.com/robertkrimen/otto" @@ -120,10 +120,10 @@ func (c *Console) init(preload []string) error { consoleObj.Object().Set("error", c.consoleOutput) // Load all the internal utility JavaScript libraries - if err := c.jsre.Compile("bignumber.js", jsre.BigNumber_JS); err != nil { + if err := c.jsre.Compile("bignumber.js", jsre.BignumberJs); err != nil { return fmt.Errorf("bignumber.js: %v", err) } - if err := c.jsre.Compile("web3.js", jsre.Web3_JS); err != nil { + if err := c.jsre.Compile("web3.js", jsre.Web3Js); err != nil { return fmt.Errorf("web3.js: %v", err) } if _, err := c.jsre.Run("var Web3 = require('web3');"); err != nil { @@ -236,7 +236,7 @@ func (c *Console) clearHistory() { // consoleOutput is an override for the console.log and console.error methods to // stream the output into the configured output stream instead of stdout. func (c *Console) consoleOutput(call otto.FunctionCall) otto.Value { - output := []string{} + var output []string for _, argument := range call.ArgumentList { output = append(output, fmt.Sprintf("%v", argument)) } @@ -274,14 +274,22 @@ func (c *Console) AutoCompleteInput(line string, pos int) (string, []string, str // Welcome show summary of current Geth instance and some metadata about the // console's available modules. func (c *Console) Welcome() { + message := "Welcome to the Geth JavaScript console!\n\n" + // Print some generic Geth metadata - fmt.Fprintf(c.printer, "Welcome to the Geth JavaScript console!\n\n") - c.jsre.Run(` - console.log("instance: " + web3.version.node); - console.log("coinbase: " + eth.coinbase); - console.log("at block: " + eth.blockNumber + " (" + new Date(1000 * eth.getBlock(eth.blockNumber).timestamp) + ")"); - console.log(" datadir: " + admin.datadir); - `) + if res, err := c.jsre.Run(` + var message = "instance: " + web3.version.node + "\n"; + try { + message += "coinbase: " + eth.coinbase + "\n"; + } catch (err) {} + message += "at block: " + eth.blockNumber + " (" + new Date(1000 * eth.getBlock(eth.blockNumber).timestamp) + ")\n"; + try { + message += " datadir: " + admin.datadir + "\n"; + } catch (err) {} + message + `); err == nil { + message += res.String() + } // List all the supported modules for the user to call if apis, err := c.client.SupportedModules(); err == nil { modules := make([]string, 0, len(apis)) @@ -289,9 +297,9 @@ func (c *Console) Welcome() { modules = append(modules, fmt.Sprintf("%s:%s", api, version)) } sort.Strings(modules) - fmt.Fprintln(c.printer, " modules:", strings.Join(modules, " ")) + message += " modules: " + strings.Join(modules, " ") + "\n" } - fmt.Fprintln(c.printer) + fmt.Fprintln(c.printer, message) } // Evaluate executes code and pretty prints the result to the specified output diff --git a/console/console_test.go b/console/console_test.go index a450134cff11..89dd7cd838a8 100644 --- a/console/console_test.go +++ b/console/console_test.go @@ -26,12 +26,13 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/eth" - "github.com/nebulaai/nbai-node/internal/jsre" - "github.com/nebulaai/nbai-node/node" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/internal/jsre" + "github.com/ethereum/go-ethereum/miner" + "github.com/ethereum/go-ethereum/node" ) const ( @@ -96,8 +97,10 @@ func newTester(t *testing.T, confOverride func(*eth.Config)) *tester { t.Fatalf("failed to create node: %v", err) } ethConf := ð.Config{ - Genesis: core.DeveloperGenesisBlock(15, common.Address{}), - Etherbase: common.HexToAddress(testAddress), + Genesis: core.DeveloperGenesisBlock(15, common.Address{}), + Miner: miner.Config{ + Etherbase: common.HexToAddress(testAddress), + }, Ethash: ethash.Config{ PowMode: ethash.ModeTest, }, @@ -149,8 +152,8 @@ func (env *tester) Close(t *testing.T) { if err := env.console.Stop(false); err != nil { t.Errorf("failed to stop embedded console: %v", err) } - if err := env.stack.Stop(); err != nil { - t.Errorf("failed to stop embedded node: %v", err) + if err := env.stack.Close(); err != nil { + t.Errorf("failed to tear down embedded node: %v", err) } os.RemoveAll(env.workspace) } diff --git a/console/prompter.go b/console/prompter.go index 29a53aeadda3..65675061a768 100644 --- a/console/prompter.go +++ b/console/prompter.go @@ -142,7 +142,7 @@ func (p *terminalPrompter) PromptPassword(prompt string) (passwd string, err err // PromptConfirm displays the given prompt to the user and requests a boolean // choice to be made, returning that choice. func (p *terminalPrompter) PromptConfirm(prompt string) (bool, error) { - input, err := p.Prompt(prompt + " [y/N] ") + input, err := p.Prompt(prompt + " [y/n] ") if len(input) > 0 && strings.ToUpper(input[:1]) == "Y" { return true, nil } diff --git a/containers/docker/develop-alpine/Dockerfile b/containers/docker/develop-alpine/Dockerfile deleted file mode 100644 index 7c87e095f817..000000000000 --- a/containers/docker/develop-alpine/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM alpine:3.7 - -RUN \ - apk add --update go git make gcc musl-dev linux-headers ca-certificates && \ - git clone --depth 1 https://github.com/nebulaai/nbai-node && \ - (cd go-ethereum && make geth) && \ - cp go-ethereum/build/bin/geth /geth && \ - apk del go git make gcc musl-dev linux-headers && \ - rm -rf /go-ethereum && rm -rf /var/cache/apk/* - -EXPOSE 8545 -EXPOSE 30332 - -ENTRYPOINT ["/geth"] diff --git a/containers/docker/develop-ubuntu/Dockerfile b/containers/docker/develop-ubuntu/Dockerfile deleted file mode 100644 index bea5729226c1..000000000000 --- a/containers/docker/develop-ubuntu/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM ubuntu:xenial - -ENV PATH=/usr/lib/go-1.9/bin:$PATH - -RUN \ - apt-get update && apt-get upgrade -q -y && \ - apt-get install -y --no-install-recommends golang-1.9 git make gcc libc-dev ca-certificates && \ - git clone --depth 1 https://github.com/nebulaai/nbai-node && \ - (cd go-ethereum && make geth) && \ - cp go-ethereum/build/bin/geth /geth && \ - apt-get remove -y golang-1.9 git make gcc libc-dev && apt autoremove -y && apt-get clean && \ - rm -rf /go-ethereum - -EXPOSE 8545 -EXPOSE 30332 - -ENTRYPOINT ["/geth"] diff --git a/containers/docker/master-alpine/Dockerfile b/containers/docker/master-alpine/Dockerfile deleted file mode 100644 index f87c64b89436..000000000000 --- a/containers/docker/master-alpine/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM alpine:3.7 - -RUN \ - apk add --update go git make gcc musl-dev linux-headers ca-certificates && \ - git clone --depth 1 --branch release/1.8 https://github.com/nebulaai/nbai-node && \ - (cd go-ethereum && make geth) && \ - cp go-ethereum/build/bin/geth /geth && \ - apk del go git make gcc musl-dev linux-headers && \ - rm -rf /go-ethereum && rm -rf /var/cache/apk/* - -EXPOSE 8545 -EXPOSE 30332 - -ENTRYPOINT ["/geth"] diff --git a/containers/docker/master-ubuntu/Dockerfile b/containers/docker/master-ubuntu/Dockerfile deleted file mode 100644 index 8347a022fff3..000000000000 --- a/containers/docker/master-ubuntu/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM ubuntu:xenial - -ENV PATH=/usr/lib/go-1.9/bin:$PATH - -RUN \ - apt-get update && apt-get upgrade -q -y && \ - apt-get install -y --no-install-recommends golang-1.9 git make gcc libc-dev ca-certificates && \ - git clone --depth 1 --branch release/1.8 https://github.com/nebulaai/nbai-node && \ - (cd go-ethereum && make geth) && \ - cp go-ethereum/build/bin/geth /geth && \ - apt-get remove -y golang-1.9 git make gcc libc-dev && apt autoremove -y && apt-get clean && \ - rm -rf /go-ethereum - -EXPOSE 8545 -EXPOSE 30332 - -ENTRYPOINT ["/geth"] diff --git a/contracts/checkpointoracle/contract/oracle.go b/contracts/checkpointoracle/contract/oracle.go new file mode 100644 index 000000000000..3bb351792f7a --- /dev/null +++ b/contracts/checkpointoracle/contract/oracle.go @@ -0,0 +1,415 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package contract + +import ( + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = abi.U256 + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription +) + +// CheckpointOracleABI is the input ABI used to generate the binding from. +const CheckpointOracleABI = "[{\"constant\":true,\"inputs\":[],\"name\":\"GetAllAdmin\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"GetLatestCheckpoint\",\"outputs\":[{\"name\":\"\",\"type\":\"uint64\"},{\"name\":\"\",\"type\":\"bytes32\"},{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_recentNumber\",\"type\":\"uint256\"},{\"name\":\"_recentHash\",\"type\":\"bytes32\"},{\"name\":\"_hash\",\"type\":\"bytes32\"},{\"name\":\"_sectionIndex\",\"type\":\"uint64\"},{\"name\":\"v\",\"type\":\"uint8[]\"},{\"name\":\"r\",\"type\":\"bytes32[]\"},{\"name\":\"s\",\"type\":\"bytes32[]\"}],\"name\":\"SetCheckpoint\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_adminlist\",\"type\":\"address[]\"},{\"name\":\"_sectionSize\",\"type\":\"uint256\"},{\"name\":\"_processConfirms\",\"type\":\"uint256\"},{\"name\":\"_threshold\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"index\",\"type\":\"uint64\"},{\"indexed\":false,\"name\":\"checkpointHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"v\",\"type\":\"uint8\"},{\"indexed\":false,\"name\":\"r\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"NewCheckpointVote\",\"type\":\"event\"}]" + +// CheckpointOracleBin is the compiled bytecode used for deploying new contracts. +const CheckpointOracleBin = `0x608060405234801561001057600080fd5b506040516108153803806108158339818101604052608081101561003357600080fd5b81019080805164010000000081111561004b57600080fd5b8201602081018481111561005e57600080fd5b815185602082028301116401000000008211171561007b57600080fd5b505060208201516040830151606090930151919450925060005b84518110156101415760016000808784815181106100af57fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555060018582815181106100fc57fe5b60209081029190910181015182546001808201855560009485529290932090920180546001600160a01b0319166001600160a01b039093169290921790915501610095565b50600592909255600655600755506106b78061015e6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806345848dfc146100465780634d6a304c1461009e578063d459fc46146100cf575b600080fd5b61004e6102b0565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561008a578181015183820152602001610072565b505050509050019250505060405180910390f35b6100a661034f565b6040805167ffffffffffffffff9094168452602084019290925282820152519081900360600190f35b61029c600480360360e08110156100e557600080fd5b81359160208101359160408201359167ffffffffffffffff6060820135169181019060a08101608082013564010000000081111561012257600080fd5b82018360208201111561013457600080fd5b8035906020019184602083028401116401000000008311171561015657600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156101a657600080fd5b8201836020820111156101b857600080fd5b803590602001918460208302840111640100000000831117156101da57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561022a57600080fd5b82018360208201111561023c57600080fd5b8035906020019184602083028401116401000000008311171561025e57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061036a945050505050565b604080519115158252519081900360200190f35b6060806001805490506040519080825280602002602001820160405280156102e2578160200160208202803883390190505b50905060005b60015481101561034957600181815481106102ff57fe5b9060005260206000200160009054906101000a90046001600160a01b031682828151811061032957fe5b6001600160a01b03909216602092830291909101909101526001016102e8565b50905090565b60025460045460035467ffffffffffffffff90921691909192565b3360009081526020819052604081205460ff1661038657600080fd5b8688401461039357600080fd5b82518451146103a157600080fd5b81518451146103af57600080fd5b6006546005548660010167ffffffffffffffff1602014310156103d457506000610677565b60025467ffffffffffffffff90811690861610156103f457506000610677565b60025467ffffffffffffffff8681169116148015610426575067ffffffffffffffff8516151580610426575060035415155b1561043357506000610677565b8561044057506000610677565b60408051601960f81b6020808301919091526000602183018190523060601b60228401526001600160c01b031960c08a901b166036840152603e8084018b905284518085039091018152605e909301909352815191012090805b86518110156106715760006001848984815181106104b457fe5b60200260200101518985815181106104c857fe5b60200260200101518986815181106104dc57fe5b602002602001015160405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa15801561053b573d6000803e3d6000fd5b505060408051601f1901516001600160a01b03811660009081526020819052919091205490925060ff16905061057057600080fd5b826001600160a01b0316816001600160a01b03161161058e57600080fd5b8092508867ffffffffffffffff167fce51ffa16246bcaf0899f6504f473cd0114f430f566cef71ab7e03d3dde42a418b8a85815181106105ca57fe5b60200260200101518a86815181106105de57fe5b60200260200101518a87815181106105f257fe5b6020026020010151604051808581526020018460ff1660ff16815260200183815260200182815260200194505050505060405180910390a260075482600101106106685750505060048790555050436003556002805467ffffffffffffffff191667ffffffffffffffff86161790556001610677565b5060010161049a565b50600080fd5b97965050505050505056fea265627a7a723058207f6a191ce575596a2f1e907c8c0a01003d16b69fb2c4f432d10878e8c0a99a0264736f6c634300050a0032` + +// DeployCheckpointOracle deploys a new Ethereum contract, binding an instance of CheckpointOracle to it. +func DeployCheckpointOracle(auth *bind.TransactOpts, backend bind.ContractBackend, _adminlist []common.Address, _sectionSize *big.Int, _processConfirms *big.Int, _threshold *big.Int) (common.Address, *types.Transaction, *CheckpointOracle, error) { + parsed, err := abi.JSON(strings.NewReader(CheckpointOracleABI)) + if err != nil { + return common.Address{}, nil, nil, err + } + address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(CheckpointOracleBin), backend, _adminlist, _sectionSize, _processConfirms, _threshold) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &CheckpointOracle{CheckpointOracleCaller: CheckpointOracleCaller{contract: contract}, CheckpointOracleTransactor: CheckpointOracleTransactor{contract: contract}, CheckpointOracleFilterer: CheckpointOracleFilterer{contract: contract}}, nil +} + +// CheckpointOracle is an auto generated Go binding around an Ethereum contract. +type CheckpointOracle struct { + CheckpointOracleCaller // Read-only binding to the contract + CheckpointOracleTransactor // Write-only binding to the contract + CheckpointOracleFilterer // Log filterer for contract events +} + +// CheckpointOracleCaller is an auto generated read-only Go binding around an Ethereum contract. +type CheckpointOracleCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CheckpointOracleTransactor is an auto generated write-only Go binding around an Ethereum contract. +type CheckpointOracleTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CheckpointOracleFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type CheckpointOracleFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// CheckpointOracleSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type CheckpointOracleSession struct { + Contract *CheckpointOracle // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// CheckpointOracleCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type CheckpointOracleCallerSession struct { + Contract *CheckpointOracleCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// CheckpointOracleTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type CheckpointOracleTransactorSession struct { + Contract *CheckpointOracleTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// CheckpointOracleRaw is an auto generated low-level Go binding around an Ethereum contract. +type CheckpointOracleRaw struct { + Contract *CheckpointOracle // Generic contract binding to access the raw methods on +} + +// CheckpointOracleCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type CheckpointOracleCallerRaw struct { + Contract *CheckpointOracleCaller // Generic read-only contract binding to access the raw methods on +} + +// CheckpointOracleTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type CheckpointOracleTransactorRaw struct { + Contract *CheckpointOracleTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewCheckpointOracle creates a new instance of CheckpointOracle, bound to a specific deployed contract. +func NewCheckpointOracle(address common.Address, backend bind.ContractBackend) (*CheckpointOracle, error) { + contract, err := bindCheckpointOracle(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &CheckpointOracle{CheckpointOracleCaller: CheckpointOracleCaller{contract: contract}, CheckpointOracleTransactor: CheckpointOracleTransactor{contract: contract}, CheckpointOracleFilterer: CheckpointOracleFilterer{contract: contract}}, nil +} + +// NewCheckpointOracleCaller creates a new read-only instance of CheckpointOracle, bound to a specific deployed contract. +func NewCheckpointOracleCaller(address common.Address, caller bind.ContractCaller) (*CheckpointOracleCaller, error) { + contract, err := bindCheckpointOracle(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &CheckpointOracleCaller{contract: contract}, nil +} + +// NewCheckpointOracleTransactor creates a new write-only instance of CheckpointOracle, bound to a specific deployed contract. +func NewCheckpointOracleTransactor(address common.Address, transactor bind.ContractTransactor) (*CheckpointOracleTransactor, error) { + contract, err := bindCheckpointOracle(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &CheckpointOracleTransactor{contract: contract}, nil +} + +// NewCheckpointOracleFilterer creates a new log filterer instance of CheckpointOracle, bound to a specific deployed contract. +func NewCheckpointOracleFilterer(address common.Address, filterer bind.ContractFilterer) (*CheckpointOracleFilterer, error) { + contract, err := bindCheckpointOracle(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &CheckpointOracleFilterer{contract: contract}, nil +} + +// bindCheckpointOracle binds a generic wrapper to an already deployed contract. +func bindCheckpointOracle(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := abi.JSON(strings.NewReader(CheckpointOracleABI)) + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_CheckpointOracle *CheckpointOracleRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _CheckpointOracle.Contract.CheckpointOracleCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_CheckpointOracle *CheckpointOracleRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CheckpointOracle.Contract.CheckpointOracleTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_CheckpointOracle *CheckpointOracleRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CheckpointOracle.Contract.CheckpointOracleTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_CheckpointOracle *CheckpointOracleCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { + return _CheckpointOracle.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_CheckpointOracle *CheckpointOracleTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _CheckpointOracle.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_CheckpointOracle *CheckpointOracleTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _CheckpointOracle.Contract.contract.Transact(opts, method, params...) +} + +// GetAllAdmin is a free data retrieval call binding the contract method 0x45848dfc. +// +// Solidity: function GetAllAdmin() constant returns(address[]) +func (_CheckpointOracle *CheckpointOracleCaller) GetAllAdmin(opts *bind.CallOpts) ([]common.Address, error) { + var ( + ret0 = new([]common.Address) + ) + out := ret0 + err := _CheckpointOracle.contract.Call(opts, out, "GetAllAdmin") + return *ret0, err +} + +// GetAllAdmin is a free data retrieval call binding the contract method 0x45848dfc. +// +// Solidity: function GetAllAdmin() constant returns(address[]) +func (_CheckpointOracle *CheckpointOracleSession) GetAllAdmin() ([]common.Address, error) { + return _CheckpointOracle.Contract.GetAllAdmin(&_CheckpointOracle.CallOpts) +} + +// GetAllAdmin is a free data retrieval call binding the contract method 0x45848dfc. +// +// Solidity: function GetAllAdmin() constant returns(address[]) +func (_CheckpointOracle *CheckpointOracleCallerSession) GetAllAdmin() ([]common.Address, error) { + return _CheckpointOracle.Contract.GetAllAdmin(&_CheckpointOracle.CallOpts) +} + +// GetLatestCheckpoint is a free data retrieval call binding the contract method 0x4d6a304c. +// +// Solidity: function GetLatestCheckpoint() constant returns(uint64, bytes32, uint256) +func (_CheckpointOracle *CheckpointOracleCaller) GetLatestCheckpoint(opts *bind.CallOpts) (uint64, [32]byte, *big.Int, error) { + var ( + ret0 = new(uint64) + ret1 = new([32]byte) + ret2 = new(*big.Int) + ) + out := &[]interface{}{ + ret0, + ret1, + ret2, + } + err := _CheckpointOracle.contract.Call(opts, out, "GetLatestCheckpoint") + return *ret0, *ret1, *ret2, err +} + +// GetLatestCheckpoint is a free data retrieval call binding the contract method 0x4d6a304c. +// +// Solidity: function GetLatestCheckpoint() constant returns(uint64, bytes32, uint256) +func (_CheckpointOracle *CheckpointOracleSession) GetLatestCheckpoint() (uint64, [32]byte, *big.Int, error) { + return _CheckpointOracle.Contract.GetLatestCheckpoint(&_CheckpointOracle.CallOpts) +} + +// GetLatestCheckpoint is a free data retrieval call binding the contract method 0x4d6a304c. +// +// Solidity: function GetLatestCheckpoint() constant returns(uint64, bytes32, uint256) +func (_CheckpointOracle *CheckpointOracleCallerSession) GetLatestCheckpoint() (uint64, [32]byte, *big.Int, error) { + return _CheckpointOracle.Contract.GetLatestCheckpoint(&_CheckpointOracle.CallOpts) +} + +// SetCheckpoint is a paid mutator transaction binding the contract method 0xd459fc46. +// +// Solidity: function SetCheckpoint(uint256 _recentNumber, bytes32 _recentHash, bytes32 _hash, uint64 _sectionIndex, uint8[] v, bytes32[] r, bytes32[] s) returns(bool) +func (_CheckpointOracle *CheckpointOracleTransactor) SetCheckpoint(opts *bind.TransactOpts, _recentNumber *big.Int, _recentHash [32]byte, _hash [32]byte, _sectionIndex uint64, v []uint8, r [][32]byte, s [][32]byte) (*types.Transaction, error) { + return _CheckpointOracle.contract.Transact(opts, "SetCheckpoint", _recentNumber, _recentHash, _hash, _sectionIndex, v, r, s) +} + +// SetCheckpoint is a paid mutator transaction binding the contract method 0xd459fc46. +// +// Solidity: function SetCheckpoint(uint256 _recentNumber, bytes32 _recentHash, bytes32 _hash, uint64 _sectionIndex, uint8[] v, bytes32[] r, bytes32[] s) returns(bool) +func (_CheckpointOracle *CheckpointOracleSession) SetCheckpoint(_recentNumber *big.Int, _recentHash [32]byte, _hash [32]byte, _sectionIndex uint64, v []uint8, r [][32]byte, s [][32]byte) (*types.Transaction, error) { + return _CheckpointOracle.Contract.SetCheckpoint(&_CheckpointOracle.TransactOpts, _recentNumber, _recentHash, _hash, _sectionIndex, v, r, s) +} + +// SetCheckpoint is a paid mutator transaction binding the contract method 0xd459fc46. +// +// Solidity: function SetCheckpoint(uint256 _recentNumber, bytes32 _recentHash, bytes32 _hash, uint64 _sectionIndex, uint8[] v, bytes32[] r, bytes32[] s) returns(bool) +func (_CheckpointOracle *CheckpointOracleTransactorSession) SetCheckpoint(_recentNumber *big.Int, _recentHash [32]byte, _hash [32]byte, _sectionIndex uint64, v []uint8, r [][32]byte, s [][32]byte) (*types.Transaction, error) { + return _CheckpointOracle.Contract.SetCheckpoint(&_CheckpointOracle.TransactOpts, _recentNumber, _recentHash, _hash, _sectionIndex, v, r, s) +} + +// CheckpointOracleNewCheckpointVoteIterator is returned from FilterNewCheckpointVote and is used to iterate over the raw logs and unpacked data for NewCheckpointVote events raised by the CheckpointOracle contract. +type CheckpointOracleNewCheckpointVoteIterator struct { + Event *CheckpointOracleNewCheckpointVote // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *CheckpointOracleNewCheckpointVoteIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(CheckpointOracleNewCheckpointVote) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(CheckpointOracleNewCheckpointVote) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *CheckpointOracleNewCheckpointVoteIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *CheckpointOracleNewCheckpointVoteIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// CheckpointOracleNewCheckpointVote represents a NewCheckpointVote event raised by the CheckpointOracle contract. +type CheckpointOracleNewCheckpointVote struct { + Index uint64 + CheckpointHash [32]byte + V uint8 + R [32]byte + S [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNewCheckpointVote is a free log retrieval operation binding the contract event 0xce51ffa16246bcaf0899f6504f473cd0114f430f566cef71ab7e03d3dde42a41. +// +// Solidity: event NewCheckpointVote(uint64 indexed index, bytes32 checkpointHash, uint8 v, bytes32 r, bytes32 s) +func (_CheckpointOracle *CheckpointOracleFilterer) FilterNewCheckpointVote(opts *bind.FilterOpts, index []uint64) (*CheckpointOracleNewCheckpointVoteIterator, error) { + + var indexRule []interface{} + for _, indexItem := range index { + indexRule = append(indexRule, indexItem) + } + + logs, sub, err := _CheckpointOracle.contract.FilterLogs(opts, "NewCheckpointVote", indexRule) + if err != nil { + return nil, err + } + return &CheckpointOracleNewCheckpointVoteIterator{contract: _CheckpointOracle.contract, event: "NewCheckpointVote", logs: logs, sub: sub}, nil +} + +// WatchNewCheckpointVote is a free log subscription operation binding the contract event 0xce51ffa16246bcaf0899f6504f473cd0114f430f566cef71ab7e03d3dde42a41. +// +// Solidity: event NewCheckpointVote(uint64 indexed index, bytes32 checkpointHash, uint8 v, bytes32 r, bytes32 s) +func (_CheckpointOracle *CheckpointOracleFilterer) WatchNewCheckpointVote(opts *bind.WatchOpts, sink chan<- *CheckpointOracleNewCheckpointVote, index []uint64) (event.Subscription, error) { + + var indexRule []interface{} + for _, indexItem := range index { + indexRule = append(indexRule, indexItem) + } + + logs, sub, err := _CheckpointOracle.contract.WatchLogs(opts, "NewCheckpointVote", indexRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(CheckpointOracleNewCheckpointVote) + if err := _CheckpointOracle.contract.UnpackLog(event, "NewCheckpointVote", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNewCheckpointVote is a log parse operation binding the contract event 0xce51ffa16246bcaf0899f6504f473cd0114f430f566cef71ab7e03d3dde42a41. +// +// Solidity: event NewCheckpointVote(uint64 indexed index, bytes32 checkpointHash, uint8 v, bytes32 r, bytes32 s) +func (_CheckpointOracle *CheckpointOracleFilterer) ParseNewCheckpointVote(log types.Log) (*CheckpointOracleNewCheckpointVote, error) { + event := new(CheckpointOracleNewCheckpointVote) + if err := _CheckpointOracle.contract.UnpackLog(event, "NewCheckpointVote", log); err != nil { + return nil, err + } + return event, nil +} diff --git a/contracts/checkpointoracle/contract/oracle.sol b/contracts/checkpointoracle/contract/oracle.sol new file mode 100644 index 000000000000..010644727374 --- /dev/null +++ b/contracts/checkpointoracle/contract/oracle.sol @@ -0,0 +1,174 @@ +pragma solidity ^0.5.10; + +/** + * @title CheckpointOracle + * @author Gary Rong, Martin Swende + * @dev Implementation of the blockchain checkpoint registrar. + */ +contract CheckpointOracle { + /* + Events + */ + + // NewCheckpointVote is emitted when a new checkpoint proposal receives a vote. + event NewCheckpointVote(uint64 indexed index, bytes32 checkpointHash, uint8 v, bytes32 r, bytes32 s); + + /* + Public Functions + */ + constructor(address[] memory _adminlist, uint _sectionSize, uint _processConfirms, uint _threshold) public { + for (uint i = 0; i < _adminlist.length; i++) { + admins[_adminlist[i]] = true; + adminList.push(_adminlist[i]); + } + sectionSize = _sectionSize; + processConfirms = _processConfirms; + threshold = _threshold; + } + + /** + * @dev Get latest stable checkpoint information. + * @return section index + * @return checkpoint hash + * @return block height associated with checkpoint + */ + function GetLatestCheckpoint() + view + public + returns(uint64, bytes32, uint) { + return (sectionIndex, hash, height); + } + + // SetCheckpoint sets a new checkpoint. It accepts a list of signatures + // @_recentNumber: a recent blocknumber, for replay protection + // @_recentHash : the hash of `_recentNumber` + // @_hash : the hash to set at _sectionIndex + // @_sectionIndex : the section index to set + // @v : the list of v-values + // @r : the list or r-values + // @s : the list of s-values + function SetCheckpoint( + uint _recentNumber, + bytes32 _recentHash, + bytes32 _hash, + uint64 _sectionIndex, + uint8[] memory v, + bytes32[] memory r, + bytes32[] memory s) + public + returns (bool) + { + // Ensure the sender is authorized. + require(admins[msg.sender]); + + // These checks replay protection, so it cannot be replayed on forks, + // accidentally or intentionally + require(blockhash(_recentNumber) == _recentHash); + + // Ensure the batch of signatures are valid. + require(v.length == r.length); + require(v.length == s.length); + + // Filter out "future" checkpoint. + if (block.number < (_sectionIndex+1)*sectionSize+processConfirms) { + return false; + } + // Filter out "old" announcement + if (_sectionIndex < sectionIndex) { + return false; + } + // Filter out "stale" announcement + if (_sectionIndex == sectionIndex && (_sectionIndex != 0 || height != 0)) { + return false; + } + // Filter out "invalid" announcement + if (_hash == ""){ + return false; + } + + // EIP 191 style signatures + // + // Arguments when calculating hash to validate + // 1: byte(0x19) - the initial 0x19 byte + // 2: byte(0) - the version byte (data with intended validator) + // 3: this - the validator address + // -- Application specific data + // 4 : checkpoint section_index(uint64) + // 5 : checkpoint hash (bytes32) + // hash = keccak256(checkpoint_index, section_head, cht_root, bloom_root) + bytes32 signedHash = keccak256(abi.encodePacked(byte(0x19), byte(0), this, _sectionIndex, _hash)); + + address lastVoter = address(0); + + // In order for us not to have to maintain a mapping of who has already + // voted, and we don't want to count a vote twice, the signatures must + // be submitted in strict ordering. + for (uint idx = 0; idx < v.length; idx++){ + address signer = ecrecover(signedHash, v[idx], r[idx], s[idx]); + require(admins[signer]); + require(uint256(signer) > uint256(lastVoter)); + lastVoter = signer; + emit NewCheckpointVote(_sectionIndex, _hash, v[idx], r[idx], s[idx]); + + // Sufficient signatures present, update latest checkpoint. + if (idx+1 >= threshold){ + hash = _hash; + height = block.number; + sectionIndex = _sectionIndex; + return true; + } + } + // We shouldn't wind up here, reverting un-emits the events + revert(); + } + + /** + * @dev Get all admin addresses + * @return address list + */ + function GetAllAdmin() + public + view + returns(address[] memory) + { + address[] memory ret = new address[](adminList.length); + for (uint i = 0; i < adminList.length; i++) { + ret[i] = adminList[i]; + } + return ret; + } + + /* + Fields + */ + // A map of admin users who have the permission to update CHT and bloom Trie root + mapping(address => bool) admins; + + // A list of admin users so that we can obtain all admin users. + address[] adminList; + + // Latest stored section id + uint64 sectionIndex; + + // The block height associated with latest registered checkpoint. + uint height; + + // The hash of latest registered checkpoint. + bytes32 hash; + + // The frequency for creating a checkpoint + // + // The default value should be the same as the checkpoint size(32768) in the ethereum. + uint sectionSize; + + // The number of confirmations needed before a checkpoint can be registered. + // We have to make sure the checkpoint registered will not be invalid due to + // chain reorg. + // + // The default value should be the same as the checkpoint process confirmations(256) + // in the ethereum. + uint processConfirms; + + // The required signatures to finalize a stable checkpoint. + uint threshold; +} diff --git a/contracts/checkpointoracle/oracle.go b/contracts/checkpointoracle/oracle.go new file mode 100644 index 000000000000..2d725397bdf0 --- /dev/null +++ b/contracts/checkpointoracle/oracle.go @@ -0,0 +1,90 @@ +// Copyright 2019 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 checkpointoracle is a an on-chain light client checkpoint oracle. +package checkpointoracle + +//go:generate abigen --sol contract/oracle.sol --pkg contract --out contract/oracle.go + +import ( + "errors" + "math/big" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/contracts/checkpointoracle/contract" + "github.com/ethereum/go-ethereum/core/types" +) + +// CheckpointOracle is a Go wrapper around an on-chain light client checkpoint oracle. +type CheckpointOracle struct { + contract *contract.CheckpointOracle +} + +// NewCheckpointOracle binds checkpoint contract and returns a registrar instance. +func NewCheckpointOracle(contractAddr common.Address, backend bind.ContractBackend) (*CheckpointOracle, error) { + c, err := contract.NewCheckpointOracle(contractAddr, backend) + if err != nil { + return nil, err + } + return &CheckpointOracle{contract: c}, nil +} + +// Contract returns the underlying contract instance. +func (oracle *CheckpointOracle) Contract() *contract.CheckpointOracle { + return oracle.contract +} + +// LookupCheckpointEvents searches checkpoint event for specific section in the +// given log batches. +func (oracle *CheckpointOracle) LookupCheckpointEvents(blockLogs [][]*types.Log, section uint64, hash common.Hash) []*contract.CheckpointOracleNewCheckpointVote { + var votes []*contract.CheckpointOracleNewCheckpointVote + + for _, logs := range blockLogs { + for _, log := range logs { + event, err := oracle.contract.ParseNewCheckpointVote(*log) + if err != nil { + continue + } + if event.Index == section && common.Hash(event.CheckpointHash) == hash { + votes = append(votes, event) + } + } + } + return votes +} + +// RegisterCheckpoint registers the checkpoint with a batch of associated signatures +// that are collected off-chain and sorted by lexicographical order. +// +// Notably all signatures given should be transformed to "ethereum style" which transforms +// v from 0/1 to 27/28 according to the yellow paper. +func (oracle *CheckpointOracle) RegisterCheckpoint(opts *bind.TransactOpts, index uint64, hash []byte, rnum *big.Int, rhash [32]byte, sigs [][]byte) (*types.Transaction, error) { + var ( + r [][32]byte + s [][32]byte + v []uint8 + ) + for i := 0; i < len(sigs); i++ { + if len(sigs[i]) != 65 { + return nil, errors.New("invalid signature") + } + r = append(r, common.BytesToHash(sigs[i][:32])) + s = append(s, common.BytesToHash(sigs[i][32:64])) + v = append(v, sigs[i][64]) + } + return oracle.contract.SetCheckpoint(opts, rnum, rhash, common.BytesToHash(hash), index, v, r, s) +} diff --git a/contracts/checkpointoracle/oracle_test.go b/contracts/checkpointoracle/oracle_test.go new file mode 100644 index 000000000000..817954d11abe --- /dev/null +++ b/contracts/checkpointoracle/oracle_test.go @@ -0,0 +1,336 @@ +// Copyright 2019 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 checkpointoracle + +import ( + "bytes" + "crypto/ecdsa" + "encoding/binary" + "errors" + "math/big" + "reflect" + "sort" + "testing" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/contracts/checkpointoracle/contract" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" +) + +var ( + emptyHash = [32]byte{} + + checkpoint0 = params.TrustedCheckpoint{ + SectionIndex: 0, + SectionHead: common.HexToHash("0x7fa3c32f996c2bfb41a1a65b3d8ea3e0a33a1674cde43678ad6f4235e764d17d"), + CHTRoot: common.HexToHash("0x98fc5d3de23a0fecebad236f6655533c157d26a1aedcd0852a514dc1169e6350"), + BloomRoot: common.HexToHash("0x99b5adb52b337fe25e74c1c6d3835b896bd638611b3aebddb2317cce27a3f9fa"), + } + checkpoint1 = params.TrustedCheckpoint{ + SectionIndex: 1, + SectionHead: common.HexToHash("0x2d4dee68102125e59b0cc61b176bd89f0d12b3b91cfaf52ef8c2c82fb920c2d2"), + CHTRoot: common.HexToHash("0x7d428008ece3b4c4ef5439f071930aad0bb75108d381308df73beadcd01ded95"), + BloomRoot: common.HexToHash("0x652571f7736de17e7bbb427ac881474da684c6988a88bf51b10cca9a2ee148f4"), + } + checkpoint2 = params.TrustedCheckpoint{ + SectionIndex: 2, + SectionHead: common.HexToHash("0x61c0de578c0115b1dff8ef39aa600588c7c6ecb8a2f102003d7cf4c4146e9291"), + CHTRoot: common.HexToHash("0x407a08a407a2bc3838b74ca3eb206903c9c8a186ccf5ef14af07794efff1970b"), + BloomRoot: common.HexToHash("0x058b4161f558ce295a92925efc57f34f9210d5a30088d7475c183e0d3e58f5ac"), + } +) + +var ( + // The block frequency for creating checkpoint(only used in test) + sectionSize = big.NewInt(512) + + // The number of confirmations needed to generate a checkpoint(only used in test). + processConfirms = big.NewInt(4) +) + +// validateOperation executes the operation, watches and delivers all events fired by the backend and ensures the +// correctness by assert function. +func validateOperation(t *testing.T, c *contract.CheckpointOracle, backend *backends.SimulatedBackend, operation func(), + assert func(<-chan *contract.CheckpointOracleNewCheckpointVote) error, opName string) { + // Watch all events and deliver them to assert function + var ( + sink = make(chan *contract.CheckpointOracleNewCheckpointVote) + sub, _ = c.WatchNewCheckpointVote(nil, sink, nil) + ) + defer func() { + // Close all subscribers + sub.Unsubscribe() + }() + operation() + + // flush pending block + backend.Commit() + if err := assert(sink); err != nil { + t.Errorf("operation {%s} failed, err %s", opName, err) + } +} + +// validateEvents checks that the correct number of contract events +// fired by contract backend. +func validateEvents(target int, sink interface{}) (bool, []reflect.Value) { + chanval := reflect.ValueOf(sink) + chantyp := chanval.Type() + if chantyp.Kind() != reflect.Chan || chantyp.ChanDir()&reflect.RecvDir == 0 { + return false, nil + } + count := 0 + var recv []reflect.Value + timeout := time.After(1 * time.Second) + cases := []reflect.SelectCase{{Chan: chanval, Dir: reflect.SelectRecv}, {Chan: reflect.ValueOf(timeout), Dir: reflect.SelectRecv}} + for { + chose, v, _ := reflect.Select(cases) + if chose == 1 { + // Not enough event received + return false, nil + } + count += 1 + recv = append(recv, v) + if count == target { + break + } + } + done := time.After(50 * time.Millisecond) + cases = cases[:1] + cases = append(cases, reflect.SelectCase{Chan: reflect.ValueOf(done), Dir: reflect.SelectRecv}) + chose, _, _ := reflect.Select(cases) + // If chose equal 0, it means receiving redundant events. + return chose == 1, recv +} + +func signCheckpoint(addr common.Address, privateKey *ecdsa.PrivateKey, index uint64, hash common.Hash) []byte { + // EIP 191 style signatures + // + // Arguments when calculating hash to validate + // 1: byte(0x19) - the initial 0x19 byte + // 2: byte(0) - the version byte (data with intended validator) + // 3: this - the validator address + // -- Application specific data + // 4 : checkpoint section_index(uint64) + // 5 : checkpoint hash (bytes32) + // hash = keccak256(checkpoint_index, section_head, cht_root, bloom_root) + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, index) + data := append([]byte{0x19, 0x00}, append(addr.Bytes(), append(buf, hash.Bytes()...)...)...) + sig, _ := crypto.Sign(crypto.Keccak256(data), privateKey) + sig[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper + return sig +} + +// assertSignature verifies whether the recovered signers are equal with expected. +func assertSignature(addr common.Address, index uint64, hash [32]byte, r, s [32]byte, v uint8, expect common.Address) bool { + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, index) + data := append([]byte{0x19, 0x00}, append(addr.Bytes(), append(buf, hash[:]...)...)...) + pubkey, err := crypto.Ecrecover(crypto.Keccak256(data), append(r[:], append(s[:], v-27)...)) + if err != nil { + return false + } + var signer common.Address + copy(signer[:], crypto.Keccak256(pubkey[1:])[12:]) + return bytes.Equal(signer.Bytes(), expect.Bytes()) +} + +type Account struct { + key *ecdsa.PrivateKey + addr common.Address +} +type Accounts []Account + +func (a Accounts) Len() int { return len(a) } +func (a Accounts) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a Accounts) Less(i, j int) bool { return bytes.Compare(a[i].addr.Bytes(), a[j].addr.Bytes()) < 0 } + +func TestCheckpointRegister(t *testing.T) { + // Initialize test accounts + var accounts Accounts + for i := 0; i < 3; i++ { + key, _ := crypto.GenerateKey() + addr := crypto.PubkeyToAddress(key.PublicKey) + accounts = append(accounts, Account{key: key, addr: addr}) + } + sort.Sort(accounts) + + // Deploy registrar contract + contractBackend := backends.NewSimulatedBackend(core.GenesisAlloc{accounts[0].addr: {Balance: big.NewInt(1000000000)}, accounts[1].addr: {Balance: big.NewInt(1000000000)}, accounts[2].addr: {Balance: big.NewInt(1000000000)}}, 10000000) + defer contractBackend.Close() + + transactOpts := bind.NewKeyedTransactor(accounts[0].key) + + // 3 trusted signers, threshold 2 + contractAddr, _, c, err := contract.DeployCheckpointOracle(transactOpts, contractBackend, []common.Address{accounts[0].addr, accounts[1].addr, accounts[2].addr}, sectionSize, processConfirms, big.NewInt(2)) + if err != nil { + t.Error("Failed to deploy registrar contract", err) + } + contractBackend.Commit() + + // getRecent returns block height and hash of the head parent. + getRecent := func() (*big.Int, common.Hash) { + parentNumber := new(big.Int).Sub(contractBackend.Blockchain().CurrentHeader().Number, big.NewInt(1)) + parentHash := contractBackend.Blockchain().CurrentHeader().ParentHash + return parentNumber, parentHash + } + // collectSig generates specified number signatures. + collectSig := func(index uint64, hash common.Hash, n int, unauthorized *ecdsa.PrivateKey) (v []uint8, r [][32]byte, s [][32]byte) { + for i := 0; i < n; i++ { + sig := signCheckpoint(contractAddr, accounts[i].key, index, hash) + if unauthorized != nil { + sig = signCheckpoint(contractAddr, unauthorized, index, hash) + } + r = append(r, common.BytesToHash(sig[:32])) + s = append(s, common.BytesToHash(sig[32:64])) + v = append(v, sig[64]) + } + return v, r, s + } + // insertEmptyBlocks inserts a batch of empty blocks to blockchain. + insertEmptyBlocks := func(number int) { + for i := 0; i < number; i++ { + contractBackend.Commit() + } + } + // assert checks whether the current contract status is same with + // the expected. + assert := func(index uint64, hash [32]byte, height *big.Int) error { + lindex, lhash, lheight, err := c.GetLatestCheckpoint(nil) + if err != nil { + return err + } + if lindex != index { + return errors.New("latest checkpoint index mismatch") + } + if !bytes.Equal(lhash[:], hash[:]) { + return errors.New("latest checkpoint hash mismatch") + } + if lheight.Cmp(height) != 0 { + return errors.New("latest checkpoint height mismatch") + } + return nil + } + + // Test future checkpoint registration + validateOperation(t, c, contractBackend, func() { + number, hash := getRecent() + v, r, s := collectSig(0, checkpoint0.Hash(), 2, nil) + c.SetCheckpoint(transactOpts, number, hash, checkpoint0.Hash(), 0, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + return assert(0, emptyHash, big.NewInt(0)) + }, "test future checkpoint registration") + + insertEmptyBlocks(int(sectionSize.Uint64() + processConfirms.Uint64())) + + // Test transaction replay protection + validateOperation(t, c, contractBackend, func() { + number, _ := getRecent() + v, r, s := collectSig(0, checkpoint0.Hash(), 2, nil) + hash := common.HexToHash("deadbeef") + c.SetCheckpoint(transactOpts, number, hash, checkpoint0.Hash(), 0, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + return assert(0, emptyHash, big.NewInt(0)) + }, "test transaction replay protection") + + // Test unauthorized signature checking + validateOperation(t, c, contractBackend, func() { + number, hash := getRecent() + u, _ := crypto.GenerateKey() + v, r, s := collectSig(0, checkpoint0.Hash(), 2, u) + c.SetCheckpoint(transactOpts, number, hash, checkpoint0.Hash(), 0, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + return assert(0, emptyHash, big.NewInt(0)) + }, "test unauthorized signature checking") + + // Test un-multi-signature checkpoint registration + validateOperation(t, c, contractBackend, func() { + number, hash := getRecent() + v, r, s := collectSig(0, checkpoint0.Hash(), 1, nil) + c.SetCheckpoint(transactOpts, number, hash, checkpoint0.Hash(), 0, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + return assert(0, emptyHash, big.NewInt(0)) + }, "test un-multi-signature checkpoint registration") + + // Test valid checkpoint registration + validateOperation(t, c, contractBackend, func() { + number, hash := getRecent() + v, r, s := collectSig(0, checkpoint0.Hash(), 2, nil) + c.SetCheckpoint(transactOpts, number, hash, checkpoint0.Hash(), 0, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + if valid, recv := validateEvents(2, events); !valid { + return errors.New("receive incorrect number of events") + } else { + for i := 0; i < len(recv); i++ { + event := recv[i].Interface().(*contract.CheckpointOracleNewCheckpointVote) + if !assertSignature(contractAddr, event.Index, event.CheckpointHash, event.R, event.S, event.V, accounts[i].addr) { + return errors.New("recover signer failed") + } + } + } + number, _ := getRecent() + return assert(0, checkpoint0.Hash(), number.Add(number, big.NewInt(1))) + }, "test valid checkpoint registration") + + distance := 3*sectionSize.Uint64() + processConfirms.Uint64() - contractBackend.Blockchain().CurrentHeader().Number.Uint64() + insertEmptyBlocks(int(distance)) + + // Test uncontinuous checkpoint registration + validateOperation(t, c, contractBackend, func() { + number, hash := getRecent() + v, r, s := collectSig(2, checkpoint2.Hash(), 2, nil) + c.SetCheckpoint(transactOpts, number, hash, checkpoint2.Hash(), 2, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + if valid, recv := validateEvents(2, events); !valid { + return errors.New("receive incorrect number of events") + } else { + for i := 0; i < len(recv); i++ { + event := recv[i].Interface().(*contract.CheckpointOracleNewCheckpointVote) + if !assertSignature(contractAddr, event.Index, event.CheckpointHash, event.R, event.S, event.V, accounts[i].addr) { + return errors.New("recover signer failed") + } + } + } + number, _ := getRecent() + return assert(2, checkpoint2.Hash(), number.Add(number, big.NewInt(1))) + }, "test uncontinuous checkpoint registration") + + // Test old checkpoint registration + validateOperation(t, c, contractBackend, func() { + number, hash := getRecent() + v, r, s := collectSig(1, checkpoint1.Hash(), 2, nil) + c.SetCheckpoint(transactOpts, number, hash, checkpoint1.Hash(), 1, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + number, _ := getRecent() + return assert(2, checkpoint2.Hash(), number) + }, "test uncontinuous checkpoint registration") + + // Test stale checkpoint registration + validateOperation(t, c, contractBackend, func() { + number, hash := getRecent() + v, r, s := collectSig(2, checkpoint2.Hash(), 2, nil) + c.SetCheckpoint(transactOpts, number, hash, checkpoint2.Hash(), 2, v, r, s) + }, func(events <-chan *contract.CheckpointOracleNewCheckpointVote) error { + number, _ := getRecent() + return assert(2, checkpoint2.Hash(), number.Sub(number, big.NewInt(1))) + }, "test stale checkpoint registration") +} diff --git a/contracts/chequebook/api.go b/contracts/chequebook/api.go deleted file mode 100644 index 2a79692246d0..000000000000 --- a/contracts/chequebook/api.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package chequebook - -import ( - "errors" - "math/big" - - "github.com/nebulaai/nbai-node/common" -) - -const Version = "1.0" - -var errNoChequebook = errors.New("no chequebook") - -type Api struct { - chequebookf func() *Chequebook -} - -func NewApi(ch func() *Chequebook) *Api { - return &Api{ch} -} - -func (self *Api) Balance() (string, error) { - ch := self.chequebookf() - if ch == nil { - return "", errNoChequebook - } - return ch.Balance().String(), nil -} - -func (self *Api) Issue(beneficiary common.Address, amount *big.Int) (cheque *Cheque, err error) { - ch := self.chequebookf() - if ch == nil { - return nil, errNoChequebook - } - return ch.Issue(beneficiary, amount) -} - -func (self *Api) Cash(cheque *Cheque) (txhash string, err error) { - ch := self.chequebookf() - if ch == nil { - return "", errNoChequebook - } - return ch.Cash(cheque) -} - -func (self *Api) Deposit(amount *big.Int) (txhash string, err error) { - ch := self.chequebookf() - if ch == nil { - return "", errNoChequebook - } - return ch.Deposit(amount) -} diff --git a/contracts/chequebook/cheque.go b/contracts/chequebook/cheque.go deleted file mode 100644 index 6844b48608b4..000000000000 --- a/contracts/chequebook/cheque.go +++ /dev/null @@ -1,641 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package chequebook package wraps the 'chequebook' Ethereum smart contract. -// -// The functions in this package allow using chequebook for -// issuing, receiving, verifying cheques in ether; (auto)cashing cheques in ether -// as well as (auto)depositing ether to the chequebook contract. -package chequebook - -//go:generate abigen --sol contract/chequebook.sol --exc contract/mortal.sol:mortal,contract/owned.sol:owned --pkg contract --out contract/chequebook.go -//go:generate go run ./gencode.go - -import ( - "bytes" - "context" - "crypto/ecdsa" - "encoding/json" - "fmt" - "io/ioutil" - "math/big" - "os" - "sync" - "time" - - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/contracts/chequebook/contract" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/swarm/services/swap/swap" -) - -// TODO(zelig): watch peer solvency and notify of bouncing cheques -// TODO(zelig): enable paying with cheque by signing off - -// Some functionality requires interacting with the blockchain: -// * setting current balance on peer's chequebook -// * sending the transaction to cash the cheque -// * depositing ether to the chequebook -// * watching incoming ether - -var ( - gasToCash = uint64(2000000) // gas cost of a cash transaction using chequebook - // gasToDeploy = uint64(3000000) -) - -// Backend wraps all methods required for chequebook operation. -type Backend interface { - bind.ContractBackend - TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) - BalanceAt(ctx context.Context, address common.Address, blockNum *big.Int) (*big.Int, error) -} - -// Cheque represents a payment promise to a single beneficiary. -type Cheque struct { - Contract common.Address // address of chequebook, needed to avoid cross-contract submission - Beneficiary common.Address - Amount *big.Int // cumulative amount of all funds sent - Sig []byte // signature Sign(Keccak256(contract, beneficiary, amount), prvKey) -} - -func (self *Cheque) String() string { - return fmt.Sprintf("contract: %s, beneficiary: %s, amount: %v, signature: %x", self.Contract.Hex(), self.Beneficiary.Hex(), self.Amount, self.Sig) -} - -type Params struct { - ContractCode, ContractAbi string -} - -var ContractParams = &Params{contract.ChequebookBin, contract.ChequebookABI} - -// Chequebook can create and sign cheques from a single contract to multiple beneficiaries. -// It is the outgoing payment handler for peer to peer micropayments. -type Chequebook struct { - path string // path to chequebook file - prvKey *ecdsa.PrivateKey // private key to sign cheque with - lock sync.Mutex // - backend Backend // blockchain API - quit chan bool // when closed causes autodeposit to stop - owner common.Address // owner address (derived from pubkey) - contract *contract.Chequebook // abigen binding - session *contract.ChequebookSession // abigen binding with Tx Opts - - // persisted fields - balance *big.Int // not synced with blockchain - contractAddr common.Address // contract address - sent map[common.Address]*big.Int //tallies for beneficiaries - - txhash string // tx hash of last deposit tx - threshold *big.Int // threshold that triggers autodeposit if not nil - buffer *big.Int // buffer to keep on top of balance for fork protection - - log log.Logger // contextual logger with the contract address embedded -} - -func (self *Chequebook) String() string { - return fmt.Sprintf("contract: %s, owner: %s, balance: %v, signer: %x", self.contractAddr.Hex(), self.owner.Hex(), self.balance, self.prvKey.PublicKey) -} - -// NewChequebook creates a new Chequebook. -func NewChequebook(path string, contractAddr common.Address, prvKey *ecdsa.PrivateKey, backend Backend) (self *Chequebook, err error) { - balance := new(big.Int) - sent := make(map[common.Address]*big.Int) - - chbook, err := contract.NewChequebook(contractAddr, backend) - if err != nil { - return nil, err - } - transactOpts := bind.NewKeyedTransactor(prvKey) - session := &contract.ChequebookSession{ - Contract: chbook, - TransactOpts: *transactOpts, - } - - self = &Chequebook{ - prvKey: prvKey, - balance: balance, - contractAddr: contractAddr, - sent: sent, - path: path, - backend: backend, - owner: transactOpts.From, - contract: chbook, - session: session, - log: log.New("contract", contractAddr), - } - - if (contractAddr != common.Address{}) { - self.setBalanceFromBlockChain() - self.log.Trace("New chequebook initialised", "owner", self.owner, "balance", self.balance) - } - return -} - -func (self *Chequebook) setBalanceFromBlockChain() { - balance, err := self.backend.BalanceAt(context.TODO(), self.contractAddr, nil) - if err != nil { - log.Error("Failed to retrieve chequebook balance", "err", err) - } else { - self.balance.Set(balance) - } -} - -// LoadChequebook loads a chequebook from disk (file path). -func LoadChequebook(path string, prvKey *ecdsa.PrivateKey, backend Backend, checkBalance bool) (self *Chequebook, err error) { - var data []byte - data, err = ioutil.ReadFile(path) - if err != nil { - return - } - self, _ = NewChequebook(path, common.Address{}, prvKey, backend) - - err = json.Unmarshal(data, self) - if err != nil { - return nil, err - } - if checkBalance { - self.setBalanceFromBlockChain() - } - log.Trace("Loaded chequebook from disk", "path", path) - - return -} - -// chequebookFile is the JSON representation of a chequebook. -type chequebookFile struct { - Balance string - Contract string - Owner string - Sent map[string]string -} - -// UnmarshalJSON deserialises a chequebook. -func (self *Chequebook) UnmarshalJSON(data []byte) error { - var file chequebookFile - err := json.Unmarshal(data, &file) - if err != nil { - return err - } - _, ok := self.balance.SetString(file.Balance, 10) - if !ok { - return fmt.Errorf("cumulative amount sent: unable to convert string to big integer: %v", file.Balance) - } - self.contractAddr = common.HexToAddress(file.Contract) - for addr, sent := range file.Sent { - self.sent[common.HexToAddress(addr)], ok = new(big.Int).SetString(sent, 10) - if !ok { - return fmt.Errorf("beneficiary %v cumulative amount sent: unable to convert string to big integer: %v", addr, sent) - } - } - return nil -} - -// MarshalJSON serialises a chequebook. -func (self *Chequebook) MarshalJSON() ([]byte, error) { - var file = &chequebookFile{ - Balance: self.balance.String(), - Contract: self.contractAddr.Hex(), - Owner: self.owner.Hex(), - Sent: make(map[string]string), - } - for addr, sent := range self.sent { - file.Sent[addr.Hex()] = sent.String() - } - return json.Marshal(file) -} - -// Save persists the chequebook on disk, remembering balance, contract address and -// cumulative amount of funds sent for each beneficiary. -func (self *Chequebook) Save() (err error) { - data, err := json.MarshalIndent(self, "", " ") - if err != nil { - return err - } - self.log.Trace("Saving chequebook to disk", self.path) - - return ioutil.WriteFile(self.path, data, os.ModePerm) -} - -// Stop quits the autodeposit go routine to terminate -func (self *Chequebook) Stop() { - defer self.lock.Unlock() - self.lock.Lock() - if self.quit != nil { - close(self.quit) - self.quit = nil - } -} - -// Issue creates a cheque signed by the chequebook owner's private key. The -// signer commits to a contract (one that they own), a beneficiary and amount. -func (self *Chequebook) Issue(beneficiary common.Address, amount *big.Int) (ch *Cheque, err error) { - defer self.lock.Unlock() - self.lock.Lock() - - if amount.Sign() <= 0 { - return nil, fmt.Errorf("amount must be greater than zero (%v)", amount) - } - if self.balance.Cmp(amount) < 0 { - err = fmt.Errorf("insufficient funds to issue cheque for amount: %v. balance: %v", amount, self.balance) - } else { - var sig []byte - sent, found := self.sent[beneficiary] - if !found { - sent = new(big.Int) - self.sent[beneficiary] = sent - } - sum := new(big.Int).Set(sent) - sum.Add(sum, amount) - - sig, err = crypto.Sign(sigHash(self.contractAddr, beneficiary, sum), self.prvKey) - if err == nil { - ch = &Cheque{ - Contract: self.contractAddr, - Beneficiary: beneficiary, - Amount: sum, - Sig: sig, - } - sent.Set(sum) - self.balance.Sub(self.balance, amount) // subtract amount from balance - } - } - - // auto deposit if threshold is set and balance is less then threshold - // note this is called even if issuing cheque fails - // so we reattempt depositing - if self.threshold != nil { - if self.balance.Cmp(self.threshold) < 0 { - send := new(big.Int).Sub(self.buffer, self.balance) - self.deposit(send) - } - } - - return -} - -// Cash is a convenience method to cash any cheque. -func (self *Chequebook) Cash(ch *Cheque) (txhash string, err error) { - return ch.Cash(self.session) -} - -// data to sign: contract address, beneficiary, cumulative amount of funds ever sent -func sigHash(contract, beneficiary common.Address, sum *big.Int) []byte { - bigamount := sum.Bytes() - if len(bigamount) > 32 { - return nil - } - var amount32 [32]byte - copy(amount32[32-len(bigamount):32], bigamount) - input := append(contract.Bytes(), beneficiary.Bytes()...) - input = append(input, amount32[:]...) - return crypto.Keccak256(input) -} - -// Balance returns the current balance of the chequebook. -func (self *Chequebook) Balance() *big.Int { - defer self.lock.Unlock() - self.lock.Lock() - return new(big.Int).Set(self.balance) -} - -// Owner returns the owner account of the chequebook. -func (self *Chequebook) Owner() common.Address { - return self.owner -} - -// Address returns the on-chain contract address of the chequebook. -func (self *Chequebook) Address() common.Address { - return self.contractAddr -} - -// Deposit deposits money to the chequebook account. -func (self *Chequebook) Deposit(amount *big.Int) (string, error) { - defer self.lock.Unlock() - self.lock.Lock() - return self.deposit(amount) -} - -// deposit deposits amount to the chequebook account. -// The caller must hold self.lock. -func (self *Chequebook) deposit(amount *big.Int) (string, error) { - // since the amount is variable here, we do not use sessions - depositTransactor := bind.NewKeyedTransactor(self.prvKey) - depositTransactor.Value = amount - chbookRaw := &contract.ChequebookRaw{Contract: self.contract} - tx, err := chbookRaw.Transfer(depositTransactor) - if err != nil { - self.log.Warn("Failed to fund chequebook", "amount", amount, "balance", self.balance, "target", self.buffer, "err", err) - return "", err - } - // assume that transaction is actually successful, we add the amount to balance right away - self.balance.Add(self.balance, amount) - self.log.Trace("Deposited funds to chequebook", "amount", amount, "balance", self.balance, "target", self.buffer) - return tx.Hash().Hex(), nil -} - -// AutoDeposit (re)sets interval time and amount which triggers sending funds to the -// chequebook. Contract backend needs to be set if threshold is not less than buffer, then -// deposit will be triggered on every new cheque issued. -func (self *Chequebook) AutoDeposit(interval time.Duration, threshold, buffer *big.Int) { - defer self.lock.Unlock() - self.lock.Lock() - self.threshold = threshold - self.buffer = buffer - self.autoDeposit(interval) -} - -// autoDeposit starts a goroutine that periodically sends funds to the chequebook -// contract caller holds the lock the go routine terminates if Chequebook.quit is closed. -func (self *Chequebook) autoDeposit(interval time.Duration) { - if self.quit != nil { - close(self.quit) - self.quit = nil - } - // if threshold >= balance autodeposit after every cheque issued - if interval == time.Duration(0) || self.threshold != nil && self.buffer != nil && self.threshold.Cmp(self.buffer) >= 0 { - return - } - - ticker := time.NewTicker(interval) - self.quit = make(chan bool) - quit := self.quit - - go func() { - for { - select { - case <-quit: - return - case <-ticker.C: - self.lock.Lock() - if self.balance.Cmp(self.buffer) < 0 { - amount := new(big.Int).Sub(self.buffer, self.balance) - txhash, err := self.deposit(amount) - if err == nil { - self.txhash = txhash - } - } - self.lock.Unlock() - } - } - }() -} - -// Outbox can issue cheques from a single contract to a single beneficiary. -type Outbox struct { - chequeBook *Chequebook - beneficiary common.Address -} - -// NewOutbox creates an outbox. -func NewOutbox(chbook *Chequebook, beneficiary common.Address) *Outbox { - return &Outbox{chbook, beneficiary} -} - -// Issue creates cheque. -func (self *Outbox) Issue(amount *big.Int) (swap.Promise, error) { - return self.chequeBook.Issue(self.beneficiary, amount) -} - -// AutoDeposit enables auto-deposits on the underlying chequebook. -func (self *Outbox) AutoDeposit(interval time.Duration, threshold, buffer *big.Int) { - self.chequeBook.AutoDeposit(interval, threshold, buffer) -} - -// Stop helps satisfy the swap.OutPayment interface. -func (self *Outbox) Stop() {} - -// String implements fmt.Stringer. -func (self *Outbox) String() string { - return fmt.Sprintf("chequebook: %v, beneficiary: %s, balance: %v", self.chequeBook.Address().Hex(), self.beneficiary.Hex(), self.chequeBook.Balance()) -} - -// Inbox can deposit, verify and cash cheques from a single contract to a single -// beneficiary. It is the incoming payment handler for peer to peer micropayments. -type Inbox struct { - lock sync.Mutex - contract common.Address // peer's chequebook contract - beneficiary common.Address // local peer's receiving address - 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 - 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 - cashed *big.Int // cumulative amount cashed - cheque *Cheque // last cheque, nil if none yet received - log log.Logger // contextual logger with the contract address embedded -} - -// NewInbox creates an Inbox. An Inboxes is not persisted, the cumulative sum is updated -// from blockchain when first cheque is received. -func NewInbox(prvKey *ecdsa.PrivateKey, contractAddr, beneficiary common.Address, signer *ecdsa.PublicKey, abigen bind.ContractBackend) (self *Inbox, err error) { - if signer == nil { - return nil, fmt.Errorf("signer is null") - } - chbook, err := contract.NewChequebook(contractAddr, abigen) - if err != nil { - return nil, err - } - transactOpts := bind.NewKeyedTransactor(prvKey) - transactOpts.GasLimit = gasToCash - session := &contract.ChequebookSession{ - Contract: chbook, - TransactOpts: *transactOpts, - } - sender := transactOpts.From - - self = &Inbox{ - contract: contractAddr, - beneficiary: beneficiary, - sender: sender, - signer: signer, - session: session, - cashed: new(big.Int).Set(common.Big0), - log: log.New("contract", contractAddr), - } - self.log.Trace("New chequebook inbox initialized", "beneficiary", self.beneficiary, "signer", hexutil.Bytes(crypto.FromECDSAPub(signer))) - return -} - -func (self *Inbox) String() string { - return fmt.Sprintf("chequebook: %v, beneficiary: %s, balance: %v", self.contract.Hex(), self.beneficiary.Hex(), self.cheque.Amount) -} - -// Stop quits the autocash goroutine. -func (self *Inbox) Stop() { - defer self.lock.Unlock() - self.lock.Lock() - if self.quit != nil { - close(self.quit) - self.quit = nil - } -} - -// Cash attempts to cash the current cheque. -func (self *Inbox) Cash() (txhash string, err error) { - if self.cheque != nil { - txhash, err = self.cheque.Cash(self.session) - self.log.Trace("Cashing in chequebook cheque", "amount", self.cheque.Amount, "beneficiary", self.beneficiary) - self.cashed = self.cheque.Amount - } - return -} - -// AutoCash (re)sets maximum time and amount which triggers cashing of the last uncashed -// cheque if maxUncashed is set to 0, then autocash on receipt. -func (self *Inbox) AutoCash(cashInterval time.Duration, maxUncashed *big.Int) { - defer self.lock.Unlock() - self.lock.Lock() - self.maxUncashed = maxUncashed - self.autoCash(cashInterval) -} - -// autoCash starts a loop that periodically clears the last cheque -// if the peer is trusted. Clearing period could be 24h or a week. -// The caller must hold self.lock. -func (self *Inbox) autoCash(cashInterval time.Duration) { - if self.quit != nil { - close(self.quit) - self.quit = nil - } - // if maxUncashed is set to 0, then autocash on receipt - if cashInterval == time.Duration(0) || self.maxUncashed != nil && self.maxUncashed.Sign() == 0 { - return - } - - ticker := time.NewTicker(cashInterval) - self.quit = make(chan bool) - quit := self.quit - - go func() { - for { - select { - case <-quit: - return - case <-ticker.C: - self.lock.Lock() - if self.cheque != nil && self.cheque.Amount.Cmp(self.cashed) != 0 { - txhash, err := self.Cash() - if err == nil { - self.txhash = txhash - } - } - self.lock.Unlock() - } - } - }() -} - -// Receive is called to deposit the latest cheque to the incoming Inbox. -// The given promise must be a *Cheque. -func (self *Inbox) Receive(promise swap.Promise) (*big.Int, error) { - ch := promise.(*Cheque) - - defer self.lock.Unlock() - self.lock.Lock() - - var sum *big.Int - if self.cheque == nil { - // the sum is checked against the blockchain once a cheque is received - tally, err := self.session.Sent(self.beneficiary) - if err != nil { - return nil, fmt.Errorf("inbox: error calling backend to set amount: %v", err) - } - sum = tally - } else { - sum = self.cheque.Amount - } - - amount, err := ch.Verify(self.signer, self.contract, self.beneficiary, sum) - var uncashed *big.Int - if err == nil { - self.cheque = ch - - if self.maxUncashed != nil { - uncashed = new(big.Int).Sub(ch.Amount, self.cashed) - if self.maxUncashed.Cmp(uncashed) < 0 { - self.Cash() - } - } - self.log.Trace("Received cheque in chequebook inbox", "amount", amount, "uncashed", uncashed) - } - - return amount, err -} - -// Verify verifies cheque for signer, contract, beneficiary, amount, valid signature. -func (self *Cheque) Verify(signerKey *ecdsa.PublicKey, contract, beneficiary common.Address, sum *big.Int) (*big.Int, error) { - log.Trace("Verifying chequebook cheque", "cheque", self, "sum", sum) - if sum == nil { - return nil, fmt.Errorf("invalid amount") - } - - if self.Beneficiary != beneficiary { - return nil, fmt.Errorf("beneficiary mismatch: %v != %v", self.Beneficiary.Hex(), beneficiary.Hex()) - } - if self.Contract != contract { - return nil, fmt.Errorf("contract mismatch: %v != %v", self.Contract.Hex(), contract.Hex()) - } - - amount := new(big.Int).Set(self.Amount) - if sum != nil { - amount.Sub(amount, sum) - if amount.Sign() <= 0 { - return nil, fmt.Errorf("incorrect amount: %v <= 0", amount) - } - } - - pubKey, err := crypto.SigToPub(sigHash(self.Contract, beneficiary, self.Amount), self.Sig) - if err != nil { - return nil, fmt.Errorf("invalid signature: %v", err) - } - if !bytes.Equal(crypto.FromECDSAPub(pubKey), crypto.FromECDSAPub(signerKey)) { - return nil, fmt.Errorf("signer mismatch: %x != %x", crypto.FromECDSAPub(pubKey), crypto.FromECDSAPub(signerKey)) - } - return amount, nil -} - -// v/r/s representation of signature -func sig2vrs(sig []byte) (v byte, r, s [32]byte) { - v = sig[64] + 27 - copy(r[:], sig[:32]) - copy(s[:], sig[32:64]) - return -} - -// Cash cashes the cheque by sending an Ethereum transaction. -func (self *Cheque) Cash(session *contract.ChequebookSession) (string, error) { - v, r, s := sig2vrs(self.Sig) - tx, err := session.Cash(self.Beneficiary, self.Amount, v, r, s) - if err != nil { - return "", err - } - return tx.Hash().Hex(), nil -} - -// ValidateCode checks that the on-chain code at address matches the expected chequebook -// contract code. This is used to detect suicided chequebooks. -func ValidateCode(ctx context.Context, b Backend, address common.Address) (ok bool, err error) { - code, err := b.CodeAt(ctx, address, nil) - if err != nil { - return false, err - } - return bytes.Equal(code, common.FromHex(contract.ContractDeployedCode)), nil -} diff --git a/contracts/chequebook/cheque_test.go b/contracts/chequebook/cheque_test.go deleted file mode 100644 index e83e0dbcea59..000000000000 --- a/contracts/chequebook/cheque_test.go +++ /dev/null @@ -1,487 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package chequebook - -import ( - "crypto/ecdsa" - "math/big" - "os" - "path/filepath" - "testing" - "time" - - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/accounts/abi/bind/backends" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/contracts/chequebook/contract" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/crypto" -) - -var ( - key0, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - key1, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a") - key2, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee") - addr0 = crypto.PubkeyToAddress(key0.PublicKey) - addr1 = crypto.PubkeyToAddress(key1.PublicKey) - addr2 = crypto.PubkeyToAddress(key2.PublicKey) -) - -func newTestBackend() *backends.SimulatedBackend { - return backends.NewSimulatedBackend(core.GenesisAlloc{ - addr0: {Balance: big.NewInt(1000000000)}, - addr1: {Balance: big.NewInt(1000000000)}, - addr2: {Balance: big.NewInt(1000000000)}, - }, 10000000) -} - -func deploy(prvKey *ecdsa.PrivateKey, amount *big.Int, backend *backends.SimulatedBackend) (common.Address, error) { - deployTransactor := bind.NewKeyedTransactor(prvKey) - deployTransactor.Value = amount - addr, _, _, err := contract.DeployChequebook(deployTransactor, backend) - if err != nil { - return common.Address{}, err - } - backend.Commit() - return addr, nil -} - -func TestIssueAndReceive(t *testing.T) { - path := filepath.Join(os.TempDir(), "chequebook-test.json") - backend := newTestBackend() - addr0, err := deploy(key0, big.NewInt(0), backend) - if err != nil { - t.Fatalf("deploy contract: expected no error, got %v", err) - } - chbook, err := NewChequebook(path, addr0, key0, backend) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - chbook.sent[addr1] = new(big.Int).SetUint64(42) - amount := common.Big1 - - if _, err = chbook.Issue(addr1, amount); err == nil { - t.Fatalf("expected insufficient funds error, got none") - } - - chbook.balance = new(big.Int).Set(common.Big1) - if chbook.Balance().Cmp(common.Big1) != 0 { - t.Fatalf("expected: %v, got %v", "0", chbook.Balance()) - } - - ch, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - if chbook.Balance().Sign() != 0 { - t.Errorf("expected: %v, got %v", "0", chbook.Balance()) - } - - chbox, err := NewInbox(key1, addr0, addr1, &key0.PublicKey, backend) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - received, err := chbox.Receive(ch) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - if received.Cmp(big.NewInt(43)) != 0 { - t.Errorf("expected: %v, got %v", "43", received) - } - -} - -func TestCheckbookFile(t *testing.T) { - path := filepath.Join(os.TempDir(), "chequebook-test.json") - backend := newTestBackend() - chbook, err := NewChequebook(path, addr0, key0, backend) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - chbook.sent[addr1] = new(big.Int).SetUint64(42) - chbook.balance = new(big.Int).Set(common.Big1) - - chbook.Save() - - chbook, err = LoadChequebook(path, key0, backend, false) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - if chbook.Balance().Cmp(common.Big1) != 0 { - t.Errorf("expected: %v, got %v", "0", chbook.Balance()) - } - - var ch *Cheque - if ch, err = chbook.Issue(addr1, common.Big1); err != nil { - t.Fatalf("expected no error, got %v", err) - } - if ch.Amount.Cmp(new(big.Int).SetUint64(43)) != 0 { - t.Errorf("expected: %v, got %v", "0", ch.Amount) - } - - err = chbook.Save() - if err != nil { - t.Fatalf("expected no error, got %v", err) - } -} - -func TestVerifyErrors(t *testing.T) { - path0 := filepath.Join(os.TempDir(), "chequebook-test-0.json") - backend := newTestBackend() - contr0, err := deploy(key0, common.Big2, backend) - if err != nil { - t.Errorf("expected no error, got %v", err) - } - chbook0, err := NewChequebook(path0, contr0, key0, backend) - if err != nil { - t.Errorf("expected no error, got %v", err) - } - - path1 := filepath.Join(os.TempDir(), "chequebook-test-1.json") - contr1, _ := deploy(key1, common.Big2, backend) - chbook1, err := NewChequebook(path1, contr1, key1, backend) - if err != nil { - t.Errorf("expected no error, got %v", err) - } - - chbook0.sent[addr1] = new(big.Int).SetUint64(42) - chbook0.balance = new(big.Int).Set(common.Big2) - chbook1.balance = new(big.Int).Set(common.Big1) - amount := common.Big1 - ch0, err := chbook0.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - chbox, err := NewInbox(key1, contr0, addr1, &key0.PublicKey, backend) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - received, err := chbox.Receive(ch0) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - if received.Cmp(big.NewInt(43)) != 0 { - t.Errorf("expected: %v, got %v", "43", received) - } - - ch1, err := chbook0.Issue(addr2, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - received, err = chbox.Receive(ch1) - t.Logf("correct error: %v", err) - if err == nil { - t.Fatalf("expected receiver error, got none and value %v", received) - } - - ch2, err := chbook1.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - received, err = chbox.Receive(ch2) - t.Logf("correct error: %v", err) - if err == nil { - t.Fatalf("expected sender error, got none and value %v", received) - } - - _, err = chbook1.Issue(addr1, new(big.Int).SetInt64(-1)) - t.Logf("correct error: %v", err) - if err == nil { - t.Fatalf("expected incorrect amount error, got none") - } - - received, err = chbox.Receive(ch0) - t.Logf("correct error: %v", err) - if err == nil { - t.Fatalf("expected incorrect amount error, got none and value %v", received) - } - -} - -func TestDeposit(t *testing.T) { - path0 := filepath.Join(os.TempDir(), "chequebook-test-0.json") - backend := newTestBackend() - contr0, _ := deploy(key0, new(big.Int), backend) - - chbook, err := NewChequebook(path0, contr0, key0, backend) - if err != nil { - t.Errorf("expected no error, got %v", err) - } - - 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()) - } - - amount := common.Big1 - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - exp := new(big.Int).SetUint64(41) - if chbook.Balance().Cmp(exp) != 0 { - t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) - } - - // autodeposit on each issue - chbook.AutoDeposit(0, balance, balance) - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - _, err = chbook.Issue(addr1, amount) - if err != nil { - 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()) - } - - // autodeposit off - chbook.AutoDeposit(0, common.Big0, balance) - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - exp = new(big.Int).SetUint64(40) - if chbook.Balance().Cmp(exp) != 0 { - t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) - } - - // autodeposit every 200ms if new cheque issued - interval := 200 * time.Millisecond - chbook.AutoDeposit(interval, common.Big1, balance) - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - exp = new(big.Int).SetUint64(38) - 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()) - } - - exp = new(big.Int).SetUint64(40) - chbook.AutoDeposit(4*interval, exp, balance) - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - time.Sleep(3 * interval) - backend.Commit() - if chbook.Balance().Cmp(exp) != 0 { - t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) - } - - _, err = chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - time.Sleep(1 * interval) - backend.Commit() - - if chbook.Balance().Cmp(balance) != 0 { - t.Fatalf("expected balance %v, got %v", balance, chbook.Balance()) - } - - chbook.AutoDeposit(1*interval, common.Big0, balance) - chbook.Stop() - - _, err = chbook.Issue(addr1, common.Big1) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - _, err = chbook.Issue(addr1, common.Big2) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - time.Sleep(1 * interval) - backend.Commit() - - exp = new(big.Int).SetUint64(39) - if chbook.Balance().Cmp(exp) != 0 { - t.Fatalf("expected balance %v, got %v", exp, chbook.Balance()) - } - -} - -func TestCash(t *testing.T) { - path := filepath.Join(os.TempDir(), "chequebook-test.json") - backend := newTestBackend() - contr0, _ := deploy(key0, common.Big2, backend) - - chbook, err := NewChequebook(path, contr0, key0, backend) - if err != nil { - t.Errorf("expected no error, got %v", err) - } - chbook.sent[addr1] = new(big.Int).SetUint64(42) - amount := common.Big1 - chbook.balance = new(big.Int).Set(common.Big1) - ch, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - chbox, err := NewInbox(key1, contr0, addr1, &key0.PublicKey, backend) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - // cashing latest cheque - if _, err = chbox.Receive(ch); err != nil { - t.Fatalf("expected no error, got %v", err) - } - if _, err = ch.Cash(chbook.session); err != nil { - t.Fatal("Cash failed:", err) - } - backend.Commit() - - chbook.balance = new(big.Int).Set(common.Big3) - ch0, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - ch1, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - interval := 10 * time.Millisecond - // setting autocash with interval of 10ms - chbox.AutoCash(interval, nil) - _, err = chbox.Receive(ch0) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - _, err = chbox.Receive(ch1) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - // after 3x interval time and 2 cheques received, exactly one cashing tx is sent - time.Sleep(4 * interval) - backend.Commit() - - // after stopping autocash no more tx are sent - ch2, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - chbox.Stop() - _, err = chbox.Receive(ch2) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - time.Sleep(2 * interval) - backend.Commit() - - // autocash below 1 - chbook.balance = big.NewInt(2) - chbox.AutoCash(0, common.Big1) - - ch3, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - ch4, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - _, err = chbox.Receive(ch3) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - _, err = chbox.Receive(ch4) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - // autochash on receipt when maxUncashed is 0 - chbook.balance = new(big.Int).Set(common.Big2) - chbox.AutoCash(0, common.Big0) - - ch5, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - ch6, err := chbook.Issue(addr1, amount) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - - _, err = chbox.Receive(ch5) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - - _, err = chbox.Receive(ch6) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - backend.Commit() - -} diff --git a/contracts/chequebook/contract/chequebook.go b/contracts/chequebook/contract/chequebook.go deleted file mode 100644 index dd3b661d1d70..000000000000 --- a/contracts/chequebook/contract/chequebook.go +++ /dev/null @@ -1,367 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package contract - -import ( - "math/big" - "strings" - - ethereum "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/accounts/abi" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/event" -) - -// ChequebookABI is the input ABI used to generate the binding from. -const ChequebookABI = "[{\"constant\":false,\"inputs\":[],\"name\":\"kill\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"address\"}],\"name\":\"sent\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"beneficiary\",\"type\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"sig_v\",\"type\":\"uint8\"},{\"name\":\"sig_r\",\"type\":\"bytes32\"},{\"name\":\"sig_s\",\"type\":\"bytes32\"}],\"name\":\"cash\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"deadbeat\",\"type\":\"address\"}],\"name\":\"Overdraft\",\"type\":\"event\"}]" - -// ChequebookBin is the compiled bytecode used for deploying new contracts. -const ChequebookBin = `0x606060405260008054600160a060020a033316600160a060020a03199091161790556102ec806100306000396000f3006060604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166341c0e1b581146100585780637bf786f81461006b578063fbf788d61461009c575b005b341561006357600080fd5b6100566100ca565b341561007657600080fd5b61008a600160a060020a03600435166100f1565b60405190815260200160405180910390f35b34156100a757600080fd5b610056600160a060020a036004351660243560ff60443516606435608435610103565b60005433600160a060020a03908116911614156100ef57600054600160a060020a0316ff5b565b60016020526000908152604090205481565b600160a060020a0385166000908152600160205260408120548190861161012957600080fd5b3087876040516c01000000000000000000000000600160a060020a03948516810282529290931690910260148301526028820152604801604051809103902091506001828686866040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f115156101cf57600080fd5b505060206040510351600054600160a060020a039081169116146101f257600080fd5b50600160a060020a03808716600090815260016020526040902054860390301631811161026257600160a060020a0387166000818152600160205260409081902088905582156108fc0290839051600060405180830381858888f19350505050151561025d57600080fd5b6102b7565b6000547f2250e2993c15843b32621c89447cc589ee7a9f049c026986e545d3c2c0c6f97890600160a060020a0316604051600160a060020a03909116815260200160405180910390a186600160a060020a0316ff5b505050505050505600a165627a7a72305820533e856fc37e3d64d1706bcc7dfb6b1d490c8d566ea498d9d01ec08965a896ca0029` - -// DeployChequebook deploys a new Ethereum contract, binding an instance of Chequebook to it. -func DeployChequebook(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Chequebook, error) { - parsed, err := abi.JSON(strings.NewReader(ChequebookABI)) - if err != nil { - return common.Address{}, nil, nil, err - } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(ChequebookBin), backend) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &Chequebook{ChequebookCaller: ChequebookCaller{contract: contract}, ChequebookTransactor: ChequebookTransactor{contract: contract}, ChequebookFilterer: ChequebookFilterer{contract: contract}}, nil -} - -// Chequebook is an auto generated Go binding around an Ethereum contract. -type Chequebook struct { - ChequebookCaller // Read-only binding to the contract - ChequebookTransactor // Write-only binding to the contract - ChequebookFilterer // Log filterer for contract events -} - -// ChequebookCaller is an auto generated read-only Go binding around an Ethereum contract. -type ChequebookCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ChequebookTransactor is an auto generated write-only Go binding around an Ethereum contract. -type ChequebookTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ChequebookFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type ChequebookFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ChequebookSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type ChequebookSession struct { - Contract *Chequebook // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ChequebookCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type ChequebookCallerSession struct { - Contract *ChequebookCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// ChequebookTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type ChequebookTransactorSession struct { - Contract *ChequebookTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ChequebookRaw is an auto generated low-level Go binding around an Ethereum contract. -type ChequebookRaw struct { - Contract *Chequebook // Generic contract binding to access the raw methods on -} - -// ChequebookCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type ChequebookCallerRaw struct { - Contract *ChequebookCaller // Generic read-only contract binding to access the raw methods on -} - -// ChequebookTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type ChequebookTransactorRaw struct { - Contract *ChequebookTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewChequebook creates a new instance of Chequebook, bound to a specific deployed contract. -func NewChequebook(address common.Address, backend bind.ContractBackend) (*Chequebook, error) { - contract, err := bindChequebook(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &Chequebook{ChequebookCaller: ChequebookCaller{contract: contract}, ChequebookTransactor: ChequebookTransactor{contract: contract}, ChequebookFilterer: ChequebookFilterer{contract: contract}}, nil -} - -// NewChequebookCaller creates a new read-only instance of Chequebook, bound to a specific deployed contract. -func NewChequebookCaller(address common.Address, caller bind.ContractCaller) (*ChequebookCaller, error) { - contract, err := bindChequebook(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &ChequebookCaller{contract: contract}, nil -} - -// NewChequebookTransactor creates a new write-only instance of Chequebook, bound to a specific deployed contract. -func NewChequebookTransactor(address common.Address, transactor bind.ContractTransactor) (*ChequebookTransactor, error) { - contract, err := bindChequebook(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &ChequebookTransactor{contract: contract}, nil -} - -// NewChequebookFilterer creates a new log filterer instance of Chequebook, bound to a specific deployed contract. -func NewChequebookFilterer(address common.Address, filterer bind.ContractFilterer) (*ChequebookFilterer, error) { - contract, err := bindChequebook(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &ChequebookFilterer{contract: contract}, nil -} - -// bindChequebook binds a generic wrapper to an already deployed contract. -func bindChequebook(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(ChequebookABI)) - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_Chequebook *ChequebookRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _Chequebook.Contract.ChequebookCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_Chequebook *ChequebookRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Chequebook.Contract.ChequebookTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_Chequebook *ChequebookRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _Chequebook.Contract.ChequebookTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_Chequebook *ChequebookCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _Chequebook.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_Chequebook *ChequebookTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Chequebook.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_Chequebook *ChequebookTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _Chequebook.Contract.contract.Transact(opts, method, params...) -} - -// Sent is a free data retrieval call binding the contract method 0x7bf786f8. -// -// Solidity: function sent( address) constant returns(uint256) -func (_Chequebook *ChequebookCaller) Sent(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { - var ( - ret0 = new(*big.Int) - ) - out := ret0 - err := _Chequebook.contract.Call(opts, out, "sent", arg0) - return *ret0, err -} - -// Sent is a free data retrieval call binding the contract method 0x7bf786f8. -// -// Solidity: function sent( address) constant returns(uint256) -func (_Chequebook *ChequebookSession) Sent(arg0 common.Address) (*big.Int, error) { - return _Chequebook.Contract.Sent(&_Chequebook.CallOpts, arg0) -} - -// Sent is a free data retrieval call binding the contract method 0x7bf786f8. -// -// Solidity: function sent( address) constant returns(uint256) -func (_Chequebook *ChequebookCallerSession) Sent(arg0 common.Address) (*big.Int, error) { - return _Chequebook.Contract.Sent(&_Chequebook.CallOpts, arg0) -} - -// Cash is a paid mutator transaction binding the contract method 0xfbf788d6. -// -// Solidity: function cash(beneficiary address, amount uint256, sig_v uint8, sig_r bytes32, sig_s bytes32) returns() -func (_Chequebook *ChequebookTransactor) Cash(opts *bind.TransactOpts, beneficiary common.Address, amount *big.Int, sig_v uint8, sig_r [32]byte, sig_s [32]byte) (*types.Transaction, error) { - return _Chequebook.contract.Transact(opts, "cash", beneficiary, amount, sig_v, sig_r, sig_s) -} - -// Cash is a paid mutator transaction binding the contract method 0xfbf788d6. -// -// Solidity: function cash(beneficiary address, amount uint256, sig_v uint8, sig_r bytes32, sig_s bytes32) returns() -func (_Chequebook *ChequebookSession) Cash(beneficiary common.Address, amount *big.Int, sig_v uint8, sig_r [32]byte, sig_s [32]byte) (*types.Transaction, error) { - return _Chequebook.Contract.Cash(&_Chequebook.TransactOpts, beneficiary, amount, sig_v, sig_r, sig_s) -} - -// Cash is a paid mutator transaction binding the contract method 0xfbf788d6. -// -// Solidity: function cash(beneficiary address, amount uint256, sig_v uint8, sig_r bytes32, sig_s bytes32) returns() -func (_Chequebook *ChequebookTransactorSession) Cash(beneficiary common.Address, amount *big.Int, sig_v uint8, sig_r [32]byte, sig_s [32]byte) (*types.Transaction, error) { - return _Chequebook.Contract.Cash(&_Chequebook.TransactOpts, beneficiary, amount, sig_v, sig_r, sig_s) -} - -// Kill is a paid mutator transaction binding the contract method 0x41c0e1b5. -// -// Solidity: function kill() returns() -func (_Chequebook *ChequebookTransactor) Kill(opts *bind.TransactOpts) (*types.Transaction, error) { - return _Chequebook.contract.Transact(opts, "kill") -} - -// Kill is a paid mutator transaction binding the contract method 0x41c0e1b5. -// -// Solidity: function kill() returns() -func (_Chequebook *ChequebookSession) Kill() (*types.Transaction, error) { - return _Chequebook.Contract.Kill(&_Chequebook.TransactOpts) -} - -// Kill is a paid mutator transaction binding the contract method 0x41c0e1b5. -// -// Solidity: function kill() returns() -func (_Chequebook *ChequebookTransactorSession) Kill() (*types.Transaction, error) { - return _Chequebook.Contract.Kill(&_Chequebook.TransactOpts) -} - -// ChequebookOverdraftIterator is returned from FilterOverdraft and is used to iterate over the raw logs and unpacked data for Overdraft events raised by the Chequebook contract. -type ChequebookOverdraftIterator struct { - Event *ChequebookOverdraft // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ChequebookOverdraftIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ChequebookOverdraft) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ChequebookOverdraft) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *ChequebookOverdraftIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ChequebookOverdraftIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ChequebookOverdraft represents a Overdraft event raised by the Chequebook contract. -type ChequebookOverdraft struct { - Deadbeat common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterOverdraft is a free log retrieval operation binding the contract event 0x2250e2993c15843b32621c89447cc589ee7a9f049c026986e545d3c2c0c6f978. -// -// Solidity: event Overdraft(deadbeat address) -func (_Chequebook *ChequebookFilterer) FilterOverdraft(opts *bind.FilterOpts) (*ChequebookOverdraftIterator, error) { - - logs, sub, err := _Chequebook.contract.FilterLogs(opts, "Overdraft") - if err != nil { - return nil, err - } - return &ChequebookOverdraftIterator{contract: _Chequebook.contract, event: "Overdraft", logs: logs, sub: sub}, nil -} - -// WatchOverdraft is a free log subscription operation binding the contract event 0x2250e2993c15843b32621c89447cc589ee7a9f049c026986e545d3c2c0c6f978. -// -// Solidity: event Overdraft(deadbeat address) -func (_Chequebook *ChequebookFilterer) WatchOverdraft(opts *bind.WatchOpts, sink chan<- *ChequebookOverdraft) (event.Subscription, error) { - - logs, sub, err := _Chequebook.contract.WatchLogs(opts, "Overdraft") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ChequebookOverdraft) - if err := _Chequebook.contract.UnpackLog(event, "Overdraft", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} diff --git a/contracts/chequebook/contract/chequebook.sol b/contracts/chequebook/contract/chequebook.sol deleted file mode 100644 index c386cceed856..000000000000 --- a/contracts/chequebook/contract/chequebook.sol +++ /dev/null @@ -1,47 +0,0 @@ -pragma solidity ^0.4.18; - -import "./mortal.sol"; - -/// @title Chequebook for Ethereum micropayments -/// @author Daniel A. Nagy -contract chequebook is mortal { - // Cumulative paid amount in wei to each beneficiary - mapping (address => uint256) public sent; - - /// @notice Overdraft event - event Overdraft(address deadbeat); - - // Allow sending ether to the chequebook. - function() public payable { } - - /// @notice Cash cheque - /// - /// @param beneficiary beneficiary address - /// @param amount cumulative amount in wei - /// @param sig_v signature parameter v - /// @param sig_r signature parameter r - /// @param sig_s signature parameter s - /// The digital signature is calculated on the concatenated triplet of contract address, beneficiary address and cumulative amount - function cash(address beneficiary, uint256 amount, uint8 sig_v, bytes32 sig_r, bytes32 sig_s) public { - // Check if the cheque is old. - // Only cheques that are more recent than the last cashed one are considered. - require(amount > sent[beneficiary]); - // Check the digital signature of the cheque. - bytes32 hash = keccak256(address(this), beneficiary, amount); - require(owner == ecrecover(hash, sig_v, sig_r, sig_s)); - // Attempt sending the difference between the cumulative amount on the cheque - // and the cumulative amount on the last cashed cheque to beneficiary. - uint256 diff = amount - sent[beneficiary]; - if (diff <= this.balance) { - // update the cumulative amount before sending - sent[beneficiary] = amount; - beneficiary.transfer(diff); - } else { - // Upon failure, punish owner for writing a bounced cheque. - // owner.sendToDebtorsPrison(); - Overdraft(owner); - // Compensate beneficiary. - selfdestruct(beneficiary); - } - } -} diff --git a/contracts/chequebook/contract/code.go b/contracts/chequebook/contract/code.go deleted file mode 100644 index d837a9d60114..000000000000 --- a/contracts/chequebook/contract/code.go +++ /dev/null @@ -1,5 +0,0 @@ -package contract - -// ContractDeployedCode is used to detect suicides. This constant needs to be -// updated when the contract code is changed. -const ContractDeployedCode = "0x6060604052600436106100565763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166341c0e1b581146100585780637bf786f81461006b578063fbf788d61461009c575b005b341561006357600080fd5b6100566100ca565b341561007657600080fd5b61008a600160a060020a03600435166100f1565b60405190815260200160405180910390f35b34156100a757600080fd5b610056600160a060020a036004351660243560ff60443516606435608435610103565b60005433600160a060020a03908116911614156100ef57600054600160a060020a0316ff5b565b60016020526000908152604090205481565b600160a060020a0385166000908152600160205260408120548190861161012957600080fd5b3087876040516c01000000000000000000000000600160a060020a03948516810282529290931690910260148301526028820152604801604051809103902091506001828686866040516000815260200160405260006040516020015260405193845260ff90921660208085019190915260408085019290925260608401929092526080909201915160208103908084039060008661646e5a03f115156101cf57600080fd5b505060206040510351600054600160a060020a039081169116146101f257600080fd5b50600160a060020a03808716600090815260016020526040902054860390301631811161026257600160a060020a0387166000818152600160205260409081902088905582156108fc0290839051600060405180830381858888f19350505050151561025d57600080fd5b6102b7565b6000547f2250e2993c15843b32621c89447cc589ee7a9f049c026986e545d3c2c0c6f97890600160a060020a0316604051600160a060020a03909116815260200160405180910390a186600160a060020a0316ff5b505050505050505600a165627a7a72305820533e856fc37e3d64d1706bcc7dfb6b1d490c8d566ea498d9d01ec08965a896ca0029" diff --git a/contracts/chequebook/contract/mortal.sol b/contracts/chequebook/contract/mortal.sol deleted file mode 100644 index c43f1e4f7951..000000000000 --- a/contracts/chequebook/contract/mortal.sol +++ /dev/null @@ -1,10 +0,0 @@ -pragma solidity ^0.4.0; - -import "./owned.sol"; - -contract mortal is owned { - function kill() public { - if (msg.sender == owner) - selfdestruct(owner); - } -} diff --git a/contracts/chequebook/contract/owned.sol b/contracts/chequebook/contract/owned.sol deleted file mode 100644 index ee9860d343af..000000000000 --- a/contracts/chequebook/contract/owned.sol +++ /dev/null @@ -1,15 +0,0 @@ -pragma solidity ^0.4.0; - -contract owned { - address owner; - - modifier onlyowner() { - if (msg.sender == owner) { - _; - } - } - - function owned() public { - owner = msg.sender; - } -} diff --git a/contracts/chequebook/gencode.go b/contracts/chequebook/gencode.go deleted file mode 100644 index ec4615c1d06a..000000000000 --- a/contracts/chequebook/gencode.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build none - -// This program generates contract/code.go, which contains the chequebook code -// after deployment. -package main - -import ( - "fmt" - "io/ioutil" - "math/big" - - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/accounts/abi/bind/backends" - "github.com/nebulaai/nbai-node/contracts/chequebook/contract" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/crypto" -) - -var ( - testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - testAlloc = core.GenesisAlloc{ - crypto.PubkeyToAddress(testKey.PublicKey): {Balance: big.NewInt(500000000000)}, - } -) - -func main() { - backend := backends.NewSimulatedBackend(testAlloc, uint64(100000000)) - auth := bind.NewKeyedTransactor(testKey) - - // Deploy the contract, get the code. - addr, _, _, err := contract.DeployChequebook(auth, backend) - if err != nil { - panic(err) - } - backend.Commit() - code, err := backend.CodeAt(nil, addr, nil) - if err != nil { - panic(err) - } - if len(code) == 0 { - panic("empty code") - } - - // Write the output file. - content := fmt.Sprintf(`package contract - -// ContractDeployedCode is used to detect suicides. This constant needs to be -// updated when the contract code is changed. -const ContractDeployedCode = "%#x" -`, code) - if err := ioutil.WriteFile("contract/code.go", []byte(content), 0644); err != nil { - panic(err) - } -} diff --git a/contracts/ens/README.md b/contracts/ens/README.md deleted file mode 100644 index c09b47e39d81..000000000000 --- a/contracts/ens/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Swarm ENS interface - -## Usage - -Full documentation for the Ethereum Name Service [can be found as EIP 137](https://github.com/ethereum/EIPs/issues/137). -This package offers a simple binding that streamlines the registration of arbitrary UTF8 domain names to swarm content hashes. - -## Development - -The SOL file in contract subdirectory implements the ENS root registry, a simple -first-in, first-served registrar for the root namespace, and a simple resolver contract; -they're used in tests, and can be used to deploy these contracts for your own purposes. - -The solidity source code can be found at [github.com/arachnid/ens/](https://github.com/arachnid/ens/). - -The go bindings for ENS contracts are generated using `abigen` via the go generator: - -```shell -go generate ./contracts/ens -``` diff --git a/contracts/ens/contract/AbstractENS.sol b/contracts/ens/contract/AbstractENS.sol deleted file mode 100644 index b80a1b0e6b50..000000000000 --- a/contracts/ens/contract/AbstractENS.sol +++ /dev/null @@ -1,23 +0,0 @@ -pragma solidity ^0.4.0; - -contract AbstractENS { - function owner(bytes32 node) constant returns(address); - function resolver(bytes32 node) constant returns(address); - function ttl(bytes32 node) constant returns(uint64); - function setOwner(bytes32 node, address owner); - function setSubnodeOwner(bytes32 node, bytes32 label, address owner); - function setResolver(bytes32 node, address resolver); - function setTTL(bytes32 node, uint64 ttl); - - // Logged when the owner of a node assigns a new owner to a subnode. - event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); - - // Logged when the owner of a node transfers ownership to a new account. - event Transfer(bytes32 indexed node, address owner); - - // Logged when the resolver for a node changes. - event NewResolver(bytes32 indexed node, address resolver); - - // Logged when the TTL of a node changes - event NewTTL(bytes32 indexed node, uint64 ttl); -} diff --git a/contracts/ens/contract/ENS.sol b/contracts/ens/contract/ENS.sol deleted file mode 100644 index 47050c19dabb..000000000000 --- a/contracts/ens/contract/ENS.sol +++ /dev/null @@ -1,94 +0,0 @@ -pragma solidity ^0.4.0; - -import './AbstractENS.sol'; - -/** - * The ENS registry contract. - */ -contract ENS is AbstractENS { - struct Record { - address owner; - address resolver; - uint64 ttl; - } - - mapping(bytes32=>Record) records; - - // Permits modifications only by the owner of the specified node. - modifier only_owner(bytes32 node) { - if (records[node].owner != msg.sender) throw; - _; - } - - /** - * Constructs a new ENS registrar. - */ - function ENS() { - records[0].owner = msg.sender; - } - - /** - * Returns the address that owns the specified node. - */ - function owner(bytes32 node) constant returns (address) { - return records[node].owner; - } - - /** - * Returns the address of the resolver for the specified node. - */ - function resolver(bytes32 node) constant returns (address) { - return records[node].resolver; - } - - /** - * Returns the TTL of a node, and any records associated with it. - */ - function ttl(bytes32 node) constant returns (uint64) { - return records[node].ttl; - } - - /** - * Transfers ownership of a node to a new address. May only be called by the current - * owner of the node. - * @param node The node to transfer ownership of. - * @param owner The address of the new owner. - */ - function setOwner(bytes32 node, address owner) only_owner(node) { - Transfer(node, owner); - records[node].owner = owner; - } - - /** - * Transfers ownership of a subnode sha3(node, label) to a new address. May only be - * called by the owner of the parent node. - * @param node The parent node. - * @param label The hash of the label specifying the subnode. - * @param owner The address of the new owner. - */ - function setSubnodeOwner(bytes32 node, bytes32 label, address owner) only_owner(node) { - var subnode = sha3(node, label); - NewOwner(node, label, owner); - records[subnode].owner = owner; - } - - /** - * Sets the resolver address for the specified node. - * @param node The node to update. - * @param resolver The address of the resolver. - */ - function setResolver(bytes32 node, address resolver) only_owner(node) { - NewResolver(node, resolver); - records[node].resolver = resolver; - } - - /** - * Sets the TTL for the specified node. - * @param node The node to update. - * @param ttl The TTL in seconds. - */ - function setTTL(bytes32 node, uint64 ttl) only_owner(node) { - NewTTL(node, ttl); - records[node].ttl = ttl; - } -} diff --git a/contracts/ens/contract/FIFSRegistrar.sol b/contracts/ens/contract/FIFSRegistrar.sol deleted file mode 100644 index 51629c2b65e0..000000000000 --- a/contracts/ens/contract/FIFSRegistrar.sol +++ /dev/null @@ -1,39 +0,0 @@ -pragma solidity ^0.4.0; - -import './AbstractENS.sol'; - -/** - * A registrar that allocates subdomains to the first person to claim them. - */ -contract FIFSRegistrar { - AbstractENS ens; - bytes32 rootNode; - - modifier only_owner(bytes32 subnode) { - var node = sha3(rootNode, subnode); - var currentOwner = ens.owner(node); - - if (currentOwner != 0 && currentOwner != msg.sender) throw; - - _; - } - - /** - * Constructor. - * @param ensAddr The address of the ENS registry. - * @param node The node that this registrar administers. - */ - function FIFSRegistrar(AbstractENS ensAddr, bytes32 node) { - ens = ensAddr; - rootNode = node; - } - - /** - * Register a name, or change the owner of an existing registration. - * @param subnode The hash of the label to register. - * @param owner The address of the new owner. - */ - function register(bytes32 subnode, address owner) only_owner(subnode) { - ens.setSubnodeOwner(rootNode, subnode, owner); - } -} diff --git a/contracts/ens/contract/PublicResolver.sol b/contracts/ens/contract/PublicResolver.sol deleted file mode 100644 index 9dcc95689ecc..000000000000 --- a/contracts/ens/contract/PublicResolver.sol +++ /dev/null @@ -1,212 +0,0 @@ -pragma solidity ^0.4.0; - -import './AbstractENS.sol'; - -/** - * A simple resolver anyone can use; only allows the owner of a node to set its - * address. - */ -contract PublicResolver { - bytes4 constant INTERFACE_META_ID = 0x01ffc9a7; - bytes4 constant ADDR_INTERFACE_ID = 0x3b3b57de; - bytes4 constant CONTENT_INTERFACE_ID = 0xd8389dc5; - bytes4 constant NAME_INTERFACE_ID = 0x691f3431; - bytes4 constant ABI_INTERFACE_ID = 0x2203ab56; - bytes4 constant PUBKEY_INTERFACE_ID = 0xc8690233; - bytes4 constant TEXT_INTERFACE_ID = 0x59d1d43c; - - event AddrChanged(bytes32 indexed node, address a); - event ContentChanged(bytes32 indexed node, bytes32 hash); - event NameChanged(bytes32 indexed node, string name); - event ABIChanged(bytes32 indexed node, uint256 indexed contentType); - event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y); - event TextChanged(bytes32 indexed node, string indexed indexedKey, string key); - - struct PublicKey { - bytes32 x; - bytes32 y; - } - - struct Record { - address addr; - bytes32 content; - string name; - PublicKey pubkey; - mapping(string=>string) text; - mapping(uint256=>bytes) abis; - } - - AbstractENS ens; - mapping(bytes32=>Record) records; - - modifier only_owner(bytes32 node) { - if (ens.owner(node) != msg.sender) throw; - _; - } - - /** - * Constructor. - * @param ensAddr The ENS registrar contract. - */ - function PublicResolver(AbstractENS ensAddr) { - ens = ensAddr; - } - - /** - * Returns true if the resolver implements the interface specified by the provided hash. - * @param interfaceID The ID of the interface to check for. - * @return True if the contract implements the requested interface. - */ - function supportsInterface(bytes4 interfaceID) constant returns (bool) { - return interfaceID == ADDR_INTERFACE_ID || - interfaceID == CONTENT_INTERFACE_ID || - interfaceID == NAME_INTERFACE_ID || - interfaceID == ABI_INTERFACE_ID || - interfaceID == PUBKEY_INTERFACE_ID || - interfaceID == TEXT_INTERFACE_ID || - interfaceID == INTERFACE_META_ID; - } - - /** - * Returns the address associated with an ENS node. - * @param node The ENS node to query. - * @return The associated address. - */ - function addr(bytes32 node) constant returns (address ret) { - ret = records[node].addr; - } - - /** - * Sets the address associated with an ENS node. - * May only be called by the owner of that node in the ENS registry. - * @param node The node to update. - * @param addr The address to set. - */ - function setAddr(bytes32 node, address addr) only_owner(node) { - records[node].addr = addr; - AddrChanged(node, addr); - } - - /** - * Returns the content hash associated with an ENS node. - * Note that this resource type is not standardized, and will likely change - * in future to a resource type based on multihash. - * @param node The ENS node to query. - * @return The associated content hash. - */ - function content(bytes32 node) constant returns (bytes32 ret) { - ret = records[node].content; - } - - /** - * Sets the content hash associated with an ENS node. - * May only be called by the owner of that node in the ENS registry. - * Note that this resource type is not standardized, and will likely change - * in future to a resource type based on multihash. - * @param node The node to update. - * @param hash The content hash to set - */ - function setContent(bytes32 node, bytes32 hash) only_owner(node) { - records[node].content = hash; - ContentChanged(node, hash); - } - - /** - * Returns the name associated with an ENS node, for reverse records. - * Defined in EIP181. - * @param node The ENS node to query. - * @return The associated name. - */ - function name(bytes32 node) constant returns (string ret) { - ret = records[node].name; - } - - /** - * Sets the name associated with an ENS node, for reverse records. - * May only be called by the owner of that node in the ENS registry. - * @param node The node to update. - * @param name The name to set. - */ - function setName(bytes32 node, string name) only_owner(node) { - records[node].name = name; - NameChanged(node, name); - } - - /** - * Returns the ABI associated with an ENS node. - * Defined in EIP205. - * @param node The ENS node to query - * @param contentTypes A bitwise OR of the ABI formats accepted by the caller. - * @return contentType The content type of the return value - * @return data The ABI data - */ - function ABI(bytes32 node, uint256 contentTypes) constant returns (uint256 contentType, bytes data) { - var record = records[node]; - for(contentType = 1; contentType <= contentTypes; contentType <<= 1) { - if ((contentType & contentTypes) != 0 && record.abis[contentType].length > 0) { - data = record.abis[contentType]; - return; - } - } - contentType = 0; - } - - /** - * Sets the ABI associated with an ENS node. - * Nodes may have one ABI of each content type. To remove an ABI, set it to - * the empty string. - * @param node The node to update. - * @param contentType The content type of the ABI - * @param data The ABI data. - */ - function setABI(bytes32 node, uint256 contentType, bytes data) only_owner(node) { - // Content types must be powers of 2 - if (((contentType - 1) & contentType) != 0) throw; - - records[node].abis[contentType] = data; - ABIChanged(node, contentType); - } - - /** - * Returns the SECP256k1 public key associated with an ENS node. - * Defined in EIP 619. - * @param node The ENS node to query - * @return x, y the X and Y coordinates of the curve point for the public key. - */ - function pubkey(bytes32 node) constant returns (bytes32 x, bytes32 y) { - return (records[node].pubkey.x, records[node].pubkey.y); - } - - /** - * Sets the SECP256k1 public key associated with an ENS node. - * @param node The ENS node to query - * @param x the X coordinate of the curve point for the public key. - * @param y the Y coordinate of the curve point for the public key. - */ - function setPubkey(bytes32 node, bytes32 x, bytes32 y) only_owner(node) { - records[node].pubkey = PublicKey(x, y); - PubkeyChanged(node, x, y); - } - - /** - * Returns the text data associated with an ENS node and key. - * @param node The ENS node to query. - * @param key The text data key to query. - * @return The associated text data. - */ - function text(bytes32 node, string key) constant returns (string ret) { - ret = records[node].text[key]; - } - - /** - * Sets the text data associated with an ENS node and key. - * May only be called by the owner of that node in the ENS registry. - * @param node The node to update. - * @param key The key to set. - * @param value The text data value to set. - */ - function setText(bytes32 node, string key, string value) only_owner(node) { - records[node].text[key] = value; - TextChanged(node, key, key); - } -} diff --git a/contracts/ens/contract/ens.go b/contracts/ens/contract/ens.go deleted file mode 100644 index 367ca69a94c5..000000000000 --- a/contracts/ens/contract/ens.go +++ /dev/null @@ -1,879 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package contract - -import ( - "strings" - - ethereum "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/accounts/abi" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/event" -) - -// ENSABI is the input ABI used to generate the binding from. -const ENSABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"resolver\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"label\",\"type\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"setSubnodeOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"ttl\",\"type\":\"uint64\"}],\"name\":\"setTTL\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"ttl\",\"outputs\":[{\"name\":\"\",\"type\":\"uint64\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"resolver\",\"type\":\"address\"}],\"name\":\"setResolver\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"label\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NewOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"resolver\",\"type\":\"address\"}],\"name\":\"NewResolver\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"ttl\",\"type\":\"uint64\"}],\"name\":\"NewTTL\",\"type\":\"event\"}]" - -// ENSBin is the compiled bytecode used for deploying new contracts. -const ENSBin = `0x6060604052341561000f57600080fd5b60008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054600160a060020a033316600160a060020a0319909116179055610503806100626000396000f3006060604052600436106100825763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630178b8bf811461008757806302571be3146100b957806306ab5923146100cf57806314ab9038146100f657806316a25cbd146101195780631896f70a1461014c5780635b0fc9c31461016e575b600080fd5b341561009257600080fd5b61009d600435610190565b604051600160a060020a03909116815260200160405180910390f35b34156100c457600080fd5b61009d6004356101ae565b34156100da57600080fd5b6100f4600435602435600160a060020a03604435166101c9565b005b341561010157600080fd5b6100f460043567ffffffffffffffff6024351661028b565b341561012457600080fd5b61012f600435610357565b60405167ffffffffffffffff909116815260200160405180910390f35b341561015757600080fd5b6100f4600435600160a060020a036024351661038e565b341561017957600080fd5b6100f4600435600160a060020a0360243516610434565b600090815260208190526040902060010154600160a060020a031690565b600090815260208190526040902054600160a060020a031690565b600083815260208190526040812054849033600160a060020a039081169116146101f257600080fd5b8484604051918252602082015260409081019051908190039020915083857fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e8285604051600160a060020a03909116815260200160405180910390a3506000908152602081905260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555050565b600082815260208190526040902054829033600160a060020a039081169116146102b457600080fd5b827f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa688360405167ffffffffffffffff909116815260200160405180910390a250600091825260208290526040909120600101805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60009081526020819052604090206001015474010000000000000000000000000000000000000000900467ffffffffffffffff1690565b600082815260208190526040902054829033600160a060020a039081169116146103b757600080fd5b827f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a083604051600160a060020a03909116815260200160405180910390a250600091825260208290526040909120600101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600082815260208190526040902054829033600160a060020a0390811691161461045d57600080fd5b827fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d26683604051600160a060020a03909116815260200160405180910390a250600091825260208290526040909120805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039092169190911790555600a165627a7a72305820f4c798d4c84c9912f389f64631e85e8d16c3e6644f8c2e1579936015c7d5f6660029` - -// DeployENS deploys a new Ethereum contract, binding an instance of ENS to it. -func DeployENS(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *ENS, error) { - parsed, err := abi.JSON(strings.NewReader(ENSABI)) - if err != nil { - return common.Address{}, nil, nil, err - } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(ENSBin), backend) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &ENS{ENSCaller: ENSCaller{contract: contract}, ENSTransactor: ENSTransactor{contract: contract}, ENSFilterer: ENSFilterer{contract: contract}}, nil -} - -// ENS is an auto generated Go binding around an Ethereum contract. -type ENS struct { - ENSCaller // Read-only binding to the contract - ENSTransactor // Write-only binding to the contract - ENSFilterer // Log filterer for contract events -} - -// ENSCaller is an auto generated read-only Go binding around an Ethereum contract. -type ENSCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ENSTransactor is an auto generated write-only Go binding around an Ethereum contract. -type ENSTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ENSFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type ENSFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ENSSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type ENSSession struct { - Contract *ENS // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ENSCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type ENSCallerSession struct { - Contract *ENSCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// ENSTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type ENSTransactorSession struct { - Contract *ENSTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ENSRaw is an auto generated low-level Go binding around an Ethereum contract. -type ENSRaw struct { - Contract *ENS // Generic contract binding to access the raw methods on -} - -// ENSCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type ENSCallerRaw struct { - Contract *ENSCaller // Generic read-only contract binding to access the raw methods on -} - -// ENSTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type ENSTransactorRaw struct { - Contract *ENSTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewENS creates a new instance of ENS, bound to a specific deployed contract. -func NewENS(address common.Address, backend bind.ContractBackend) (*ENS, error) { - contract, err := bindENS(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &ENS{ENSCaller: ENSCaller{contract: contract}, ENSTransactor: ENSTransactor{contract: contract}, ENSFilterer: ENSFilterer{contract: contract}}, nil -} - -// NewENSCaller creates a new read-only instance of ENS, bound to a specific deployed contract. -func NewENSCaller(address common.Address, caller bind.ContractCaller) (*ENSCaller, error) { - contract, err := bindENS(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &ENSCaller{contract: contract}, nil -} - -// NewENSTransactor creates a new write-only instance of ENS, bound to a specific deployed contract. -func NewENSTransactor(address common.Address, transactor bind.ContractTransactor) (*ENSTransactor, error) { - contract, err := bindENS(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &ENSTransactor{contract: contract}, nil -} - -// NewENSFilterer creates a new log filterer instance of ENS, bound to a specific deployed contract. -func NewENSFilterer(address common.Address, filterer bind.ContractFilterer) (*ENSFilterer, error) { - contract, err := bindENS(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &ENSFilterer{contract: contract}, nil -} - -// bindENS binds a generic wrapper to an already deployed contract. -func bindENS(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(ENSABI)) - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_ENS *ENSRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _ENS.Contract.ENSCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_ENS *ENSRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ENS.Contract.ENSTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_ENS *ENSRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _ENS.Contract.ENSTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_ENS *ENSCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _ENS.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_ENS *ENSTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ENS.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_ENS *ENSTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _ENS.Contract.contract.Transact(opts, method, params...) -} - -// Owner is a free data retrieval call binding the contract method 0x02571be3. -// -// Solidity: function owner(node bytes32) constant returns(address) -func (_ENS *ENSCaller) Owner(opts *bind.CallOpts, node [32]byte) (common.Address, error) { - var ( - ret0 = new(common.Address) - ) - out := ret0 - err := _ENS.contract.Call(opts, out, "owner", node) - return *ret0, err -} - -// Owner is a free data retrieval call binding the contract method 0x02571be3. -// -// Solidity: function owner(node bytes32) constant returns(address) -func (_ENS *ENSSession) Owner(node [32]byte) (common.Address, error) { - return _ENS.Contract.Owner(&_ENS.CallOpts, node) -} - -// Owner is a free data retrieval call binding the contract method 0x02571be3. -// -// Solidity: function owner(node bytes32) constant returns(address) -func (_ENS *ENSCallerSession) Owner(node [32]byte) (common.Address, error) { - return _ENS.Contract.Owner(&_ENS.CallOpts, node) -} - -// Resolver is a free data retrieval call binding the contract method 0x0178b8bf. -// -// Solidity: function resolver(node bytes32) constant returns(address) -func (_ENS *ENSCaller) Resolver(opts *bind.CallOpts, node [32]byte) (common.Address, error) { - var ( - ret0 = new(common.Address) - ) - out := ret0 - err := _ENS.contract.Call(opts, out, "resolver", node) - return *ret0, err -} - -// Resolver is a free data retrieval call binding the contract method 0x0178b8bf. -// -// Solidity: function resolver(node bytes32) constant returns(address) -func (_ENS *ENSSession) Resolver(node [32]byte) (common.Address, error) { - return _ENS.Contract.Resolver(&_ENS.CallOpts, node) -} - -// Resolver is a free data retrieval call binding the contract method 0x0178b8bf. -// -// Solidity: function resolver(node bytes32) constant returns(address) -func (_ENS *ENSCallerSession) Resolver(node [32]byte) (common.Address, error) { - return _ENS.Contract.Resolver(&_ENS.CallOpts, node) -} - -// Ttl is a free data retrieval call binding the contract method 0x16a25cbd. -// -// Solidity: function ttl(node bytes32) constant returns(uint64) -func (_ENS *ENSCaller) Ttl(opts *bind.CallOpts, node [32]byte) (uint64, error) { - var ( - ret0 = new(uint64) - ) - out := ret0 - err := _ENS.contract.Call(opts, out, "ttl", node) - return *ret0, err -} - -// Ttl is a free data retrieval call binding the contract method 0x16a25cbd. -// -// Solidity: function ttl(node bytes32) constant returns(uint64) -func (_ENS *ENSSession) Ttl(node [32]byte) (uint64, error) { - return _ENS.Contract.Ttl(&_ENS.CallOpts, node) -} - -// Ttl is a free data retrieval call binding the contract method 0x16a25cbd. -// -// Solidity: function ttl(node bytes32) constant returns(uint64) -func (_ENS *ENSCallerSession) Ttl(node [32]byte) (uint64, error) { - return _ENS.Contract.Ttl(&_ENS.CallOpts, node) -} - -// SetOwner is a paid mutator transaction binding the contract method 0x5b0fc9c3. -// -// Solidity: function setOwner(node bytes32, owner address) returns() -func (_ENS *ENSTransactor) SetOwner(opts *bind.TransactOpts, node [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENS.contract.Transact(opts, "setOwner", node, owner) -} - -// SetOwner is a paid mutator transaction binding the contract method 0x5b0fc9c3. -// -// Solidity: function setOwner(node bytes32, owner address) returns() -func (_ENS *ENSSession) SetOwner(node [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENS.Contract.SetOwner(&_ENS.TransactOpts, node, owner) -} - -// SetOwner is a paid mutator transaction binding the contract method 0x5b0fc9c3. -// -// Solidity: function setOwner(node bytes32, owner address) returns() -func (_ENS *ENSTransactorSession) SetOwner(node [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENS.Contract.SetOwner(&_ENS.TransactOpts, node, owner) -} - -// SetResolver is a paid mutator transaction binding the contract method 0x1896f70a. -// -// Solidity: function setResolver(node bytes32, resolver address) returns() -func (_ENS *ENSTransactor) SetResolver(opts *bind.TransactOpts, node [32]byte, resolver common.Address) (*types.Transaction, error) { - return _ENS.contract.Transact(opts, "setResolver", node, resolver) -} - -// SetResolver is a paid mutator transaction binding the contract method 0x1896f70a. -// -// Solidity: function setResolver(node bytes32, resolver address) returns() -func (_ENS *ENSSession) SetResolver(node [32]byte, resolver common.Address) (*types.Transaction, error) { - return _ENS.Contract.SetResolver(&_ENS.TransactOpts, node, resolver) -} - -// SetResolver is a paid mutator transaction binding the contract method 0x1896f70a. -// -// Solidity: function setResolver(node bytes32, resolver address) returns() -func (_ENS *ENSTransactorSession) SetResolver(node [32]byte, resolver common.Address) (*types.Transaction, error) { - return _ENS.Contract.SetResolver(&_ENS.TransactOpts, node, resolver) -} - -// SetSubnodeOwner is a paid mutator transaction binding the contract method 0x06ab5923. -// -// Solidity: function setSubnodeOwner(node bytes32, label bytes32, owner address) returns() -func (_ENS *ENSTransactor) SetSubnodeOwner(opts *bind.TransactOpts, node [32]byte, label [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENS.contract.Transact(opts, "setSubnodeOwner", node, label, owner) -} - -// SetSubnodeOwner is a paid mutator transaction binding the contract method 0x06ab5923. -// -// Solidity: function setSubnodeOwner(node bytes32, label bytes32, owner address) returns() -func (_ENS *ENSSession) SetSubnodeOwner(node [32]byte, label [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENS.Contract.SetSubnodeOwner(&_ENS.TransactOpts, node, label, owner) -} - -// SetSubnodeOwner is a paid mutator transaction binding the contract method 0x06ab5923. -// -// Solidity: function setSubnodeOwner(node bytes32, label bytes32, owner address) returns() -func (_ENS *ENSTransactorSession) SetSubnodeOwner(node [32]byte, label [32]byte, owner common.Address) (*types.Transaction, error) { - return _ENS.Contract.SetSubnodeOwner(&_ENS.TransactOpts, node, label, owner) -} - -// SetTTL is a paid mutator transaction binding the contract method 0x14ab9038. -// -// Solidity: function setTTL(node bytes32, ttl uint64) returns() -func (_ENS *ENSTransactor) SetTTL(opts *bind.TransactOpts, node [32]byte, ttl uint64) (*types.Transaction, error) { - return _ENS.contract.Transact(opts, "setTTL", node, ttl) -} - -// SetTTL is a paid mutator transaction binding the contract method 0x14ab9038. -// -// Solidity: function setTTL(node bytes32, ttl uint64) returns() -func (_ENS *ENSSession) SetTTL(node [32]byte, ttl uint64) (*types.Transaction, error) { - return _ENS.Contract.SetTTL(&_ENS.TransactOpts, node, ttl) -} - -// SetTTL is a paid mutator transaction binding the contract method 0x14ab9038. -// -// Solidity: function setTTL(node bytes32, ttl uint64) returns() -func (_ENS *ENSTransactorSession) SetTTL(node [32]byte, ttl uint64) (*types.Transaction, error) { - return _ENS.Contract.SetTTL(&_ENS.TransactOpts, node, ttl) -} - -// ENSNewOwnerIterator is returned from FilterNewOwner and is used to iterate over the raw logs and unpacked data for NewOwner events raised by the ENS contract. -type ENSNewOwnerIterator struct { - Event *ENSNewOwner // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ENSNewOwnerIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ENSNewOwner) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ENSNewOwner) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *ENSNewOwnerIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ENSNewOwnerIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ENSNewOwner represents a NewOwner event raised by the ENS contract. -type ENSNewOwner struct { - Node [32]byte - Label [32]byte - Owner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterNewOwner is a free log retrieval operation binding the contract event 0xce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e82. -// -// Solidity: event NewOwner(node indexed bytes32, label indexed bytes32, owner address) -func (_ENS *ENSFilterer) FilterNewOwner(opts *bind.FilterOpts, node [][32]byte, label [][32]byte) (*ENSNewOwnerIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - var labelRule []interface{} - for _, labelItem := range label { - labelRule = append(labelRule, labelItem) - } - - logs, sub, err := _ENS.contract.FilterLogs(opts, "NewOwner", nodeRule, labelRule) - if err != nil { - return nil, err - } - return &ENSNewOwnerIterator{contract: _ENS.contract, event: "NewOwner", logs: logs, sub: sub}, nil -} - -// WatchNewOwner is a free log subscription operation binding the contract event 0xce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e82. -// -// Solidity: event NewOwner(node indexed bytes32, label indexed bytes32, owner address) -func (_ENS *ENSFilterer) WatchNewOwner(opts *bind.WatchOpts, sink chan<- *ENSNewOwner, node [][32]byte, label [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - var labelRule []interface{} - for _, labelItem := range label { - labelRule = append(labelRule, labelItem) - } - - logs, sub, err := _ENS.contract.WatchLogs(opts, "NewOwner", nodeRule, labelRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ENSNewOwner) - if err := _ENS.contract.UnpackLog(event, "NewOwner", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ENSNewResolverIterator is returned from FilterNewResolver and is used to iterate over the raw logs and unpacked data for NewResolver events raised by the ENS contract. -type ENSNewResolverIterator struct { - Event *ENSNewResolver // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ENSNewResolverIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ENSNewResolver) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ENSNewResolver) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *ENSNewResolverIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ENSNewResolverIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ENSNewResolver represents a NewResolver event raised by the ENS contract. -type ENSNewResolver struct { - Node [32]byte - Resolver common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterNewResolver is a free log retrieval operation binding the contract event 0x335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0. -// -// Solidity: event NewResolver(node indexed bytes32, resolver address) -func (_ENS *ENSFilterer) FilterNewResolver(opts *bind.FilterOpts, node [][32]byte) (*ENSNewResolverIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENS.contract.FilterLogs(opts, "NewResolver", nodeRule) - if err != nil { - return nil, err - } - return &ENSNewResolverIterator{contract: _ENS.contract, event: "NewResolver", logs: logs, sub: sub}, nil -} - -// WatchNewResolver is a free log subscription operation binding the contract event 0x335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a0. -// -// Solidity: event NewResolver(node indexed bytes32, resolver address) -func (_ENS *ENSFilterer) WatchNewResolver(opts *bind.WatchOpts, sink chan<- *ENSNewResolver, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENS.contract.WatchLogs(opts, "NewResolver", nodeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ENSNewResolver) - if err := _ENS.contract.UnpackLog(event, "NewResolver", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ENSNewTTLIterator is returned from FilterNewTTL and is used to iterate over the raw logs and unpacked data for NewTTL events raised by the ENS contract. -type ENSNewTTLIterator struct { - Event *ENSNewTTL // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ENSNewTTLIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ENSNewTTL) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ENSNewTTL) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *ENSNewTTLIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ENSNewTTLIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ENSNewTTL represents a NewTTL event raised by the ENS contract. -type ENSNewTTL struct { - Node [32]byte - Ttl uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterNewTTL is a free log retrieval operation binding the contract event 0x1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa68. -// -// Solidity: event NewTTL(node indexed bytes32, ttl uint64) -func (_ENS *ENSFilterer) FilterNewTTL(opts *bind.FilterOpts, node [][32]byte) (*ENSNewTTLIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENS.contract.FilterLogs(opts, "NewTTL", nodeRule) - if err != nil { - return nil, err - } - return &ENSNewTTLIterator{contract: _ENS.contract, event: "NewTTL", logs: logs, sub: sub}, nil -} - -// WatchNewTTL is a free log subscription operation binding the contract event 0x1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa68. -// -// Solidity: event NewTTL(node indexed bytes32, ttl uint64) -func (_ENS *ENSFilterer) WatchNewTTL(opts *bind.WatchOpts, sink chan<- *ENSNewTTL, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENS.contract.WatchLogs(opts, "NewTTL", nodeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ENSNewTTL) - if err := _ENS.contract.UnpackLog(event, "NewTTL", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ENSTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the ENS contract. -type ENSTransferIterator struct { - Event *ENSTransfer // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ENSTransferIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ENSTransfer) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ENSTransfer) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *ENSTransferIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ENSTransferIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ENSTransfer represents a Transfer event raised by the ENS contract. -type ENSTransfer struct { - Node [32]byte - Owner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterTransfer is a free log retrieval operation binding the contract event 0xd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d266. -// -// Solidity: event Transfer(node indexed bytes32, owner address) -func (_ENS *ENSFilterer) FilterTransfer(opts *bind.FilterOpts, node [][32]byte) (*ENSTransferIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENS.contract.FilterLogs(opts, "Transfer", nodeRule) - if err != nil { - return nil, err - } - return &ENSTransferIterator{contract: _ENS.contract, event: "Transfer", logs: logs, sub: sub}, nil -} - -// WatchTransfer is a free log subscription operation binding the contract event 0xd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d266. -// -// Solidity: event Transfer(node indexed bytes32, owner address) -func (_ENS *ENSFilterer) WatchTransfer(opts *bind.WatchOpts, sink chan<- *ENSTransfer, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _ENS.contract.WatchLogs(opts, "Transfer", nodeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ENSTransfer) - if err := _ENS.contract.UnpackLog(event, "Transfer", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} diff --git a/contracts/ens/contract/fifsregistrar.go b/contracts/ens/contract/fifsregistrar.go deleted file mode 100644 index 7a7d9ef1fe0e..000000000000 --- a/contracts/ens/contract/fifsregistrar.go +++ /dev/null @@ -1,195 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package contract - -import ( - "strings" - - "github.com/nebulaai/nbai-node/accounts/abi" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" -) - -// FIFSRegistrarABI is the input ABI used to generate the binding from. -const FIFSRegistrarABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"subnode\",\"type\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"register\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"ensAddr\",\"type\":\"address\"},{\"name\":\"node\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]" - -// FIFSRegistrarBin is the compiled bytecode used for deploying new contracts. -const FIFSRegistrarBin = `0x6060604052341561000f57600080fd5b604051604080610224833981016040528080519190602001805160008054600160a060020a03909516600160a060020a03199095169490941790935550506001556101c58061005f6000396000f3006060604052600436106100275763ffffffff60e060020a600035041663d22057a9811461002c575b600080fd5b341561003757600080fd5b61004e600435600160a060020a0360243516610050565b005b816000806001548360405191825260208201526040908101905190819003902060008054919350600160a060020a03909116906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b15156100c857600080fd5b6102c65a03f115156100d957600080fd5b5050506040518051915050600160a060020a0381161580159061010e575033600160a060020a031681600160a060020a031614155b1561011857600080fd5b600054600154600160a060020a03909116906306ab592390878760405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b151561017e57600080fd5b6102c65a03f1151561018f57600080fd5b50505050505050505600a165627a7a723058206fb963cb168d5e3a51af12cd6bb23e324dbd32dd4954f43653ba27e66b68ea650029` - -// DeployFIFSRegistrar deploys a new Ethereum contract, binding an instance of FIFSRegistrar to it. -func DeployFIFSRegistrar(auth *bind.TransactOpts, backend bind.ContractBackend, ensAddr common.Address, node [32]byte) (common.Address, *types.Transaction, *FIFSRegistrar, error) { - parsed, err := abi.JSON(strings.NewReader(FIFSRegistrarABI)) - if err != nil { - return common.Address{}, nil, nil, err - } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(FIFSRegistrarBin), backend, ensAddr, node) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &FIFSRegistrar{FIFSRegistrarCaller: FIFSRegistrarCaller{contract: contract}, FIFSRegistrarTransactor: FIFSRegistrarTransactor{contract: contract}, FIFSRegistrarFilterer: FIFSRegistrarFilterer{contract: contract}}, nil -} - -// FIFSRegistrar is an auto generated Go binding around an Ethereum contract. -type FIFSRegistrar struct { - FIFSRegistrarCaller // Read-only binding to the contract - FIFSRegistrarTransactor // Write-only binding to the contract - FIFSRegistrarFilterer // Log filterer for contract events -} - -// FIFSRegistrarCaller is an auto generated read-only Go binding around an Ethereum contract. -type FIFSRegistrarCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// FIFSRegistrarTransactor is an auto generated write-only Go binding around an Ethereum contract. -type FIFSRegistrarTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// FIFSRegistrarFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type FIFSRegistrarFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// FIFSRegistrarSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type FIFSRegistrarSession struct { - Contract *FIFSRegistrar // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// FIFSRegistrarCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type FIFSRegistrarCallerSession struct { - Contract *FIFSRegistrarCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// FIFSRegistrarTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type FIFSRegistrarTransactorSession struct { - Contract *FIFSRegistrarTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// FIFSRegistrarRaw is an auto generated low-level Go binding around an Ethereum contract. -type FIFSRegistrarRaw struct { - Contract *FIFSRegistrar // Generic contract binding to access the raw methods on -} - -// FIFSRegistrarCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type FIFSRegistrarCallerRaw struct { - Contract *FIFSRegistrarCaller // Generic read-only contract binding to access the raw methods on -} - -// FIFSRegistrarTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type FIFSRegistrarTransactorRaw struct { - Contract *FIFSRegistrarTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewFIFSRegistrar creates a new instance of FIFSRegistrar, bound to a specific deployed contract. -func NewFIFSRegistrar(address common.Address, backend bind.ContractBackend) (*FIFSRegistrar, error) { - contract, err := bindFIFSRegistrar(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &FIFSRegistrar{FIFSRegistrarCaller: FIFSRegistrarCaller{contract: contract}, FIFSRegistrarTransactor: FIFSRegistrarTransactor{contract: contract}, FIFSRegistrarFilterer: FIFSRegistrarFilterer{contract: contract}}, nil -} - -// NewFIFSRegistrarCaller creates a new read-only instance of FIFSRegistrar, bound to a specific deployed contract. -func NewFIFSRegistrarCaller(address common.Address, caller bind.ContractCaller) (*FIFSRegistrarCaller, error) { - contract, err := bindFIFSRegistrar(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &FIFSRegistrarCaller{contract: contract}, nil -} - -// NewFIFSRegistrarTransactor creates a new write-only instance of FIFSRegistrar, bound to a specific deployed contract. -func NewFIFSRegistrarTransactor(address common.Address, transactor bind.ContractTransactor) (*FIFSRegistrarTransactor, error) { - contract, err := bindFIFSRegistrar(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &FIFSRegistrarTransactor{contract: contract}, nil -} - -// NewFIFSRegistrarFilterer creates a new log filterer instance of FIFSRegistrar, bound to a specific deployed contract. -func NewFIFSRegistrarFilterer(address common.Address, filterer bind.ContractFilterer) (*FIFSRegistrarFilterer, error) { - contract, err := bindFIFSRegistrar(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &FIFSRegistrarFilterer{contract: contract}, nil -} - -// bindFIFSRegistrar binds a generic wrapper to an already deployed contract. -func bindFIFSRegistrar(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(FIFSRegistrarABI)) - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_FIFSRegistrar *FIFSRegistrarRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _FIFSRegistrar.Contract.FIFSRegistrarCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_FIFSRegistrar *FIFSRegistrarRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _FIFSRegistrar.Contract.FIFSRegistrarTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_FIFSRegistrar *FIFSRegistrarRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _FIFSRegistrar.Contract.FIFSRegistrarTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_FIFSRegistrar *FIFSRegistrarCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _FIFSRegistrar.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_FIFSRegistrar *FIFSRegistrarTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _FIFSRegistrar.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_FIFSRegistrar *FIFSRegistrarTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _FIFSRegistrar.Contract.contract.Transact(opts, method, params...) -} - -// Register is a paid mutator transaction binding the contract method 0xd22057a9. -// -// Solidity: function register(subnode bytes32, owner address) returns() -func (_FIFSRegistrar *FIFSRegistrarTransactor) Register(opts *bind.TransactOpts, subnode [32]byte, owner common.Address) (*types.Transaction, error) { - return _FIFSRegistrar.contract.Transact(opts, "register", subnode, owner) -} - -// Register is a paid mutator transaction binding the contract method 0xd22057a9. -// -// Solidity: function register(subnode bytes32, owner address) returns() -func (_FIFSRegistrar *FIFSRegistrarSession) Register(subnode [32]byte, owner common.Address) (*types.Transaction, error) { - return _FIFSRegistrar.Contract.Register(&_FIFSRegistrar.TransactOpts, subnode, owner) -} - -// Register is a paid mutator transaction binding the contract method 0xd22057a9. -// -// Solidity: function register(subnode bytes32, owner address) returns() -func (_FIFSRegistrar *FIFSRegistrarTransactorSession) Register(subnode [32]byte, owner common.Address) (*types.Transaction, error) { - return _FIFSRegistrar.Contract.Register(&_FIFSRegistrar.TransactOpts, subnode, owner) -} diff --git a/contracts/ens/contract/publicresolver.go b/contracts/ens/contract/publicresolver.go deleted file mode 100644 index 71095d9e9b1f..000000000000 --- a/contracts/ens/contract/publicresolver.go +++ /dev/null @@ -1,1321 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package contract - -import ( - "math/big" - "strings" - - ethereum "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/accounts/abi" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/event" -) - -// PublicResolverABI is the input ABI used to generate the binding from. -const PublicResolverABI = "[{\"constant\":true,\"inputs\":[{\"name\":\"interfaceID\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"key\",\"type\":\"string\"},{\"name\":\"value\",\"type\":\"string\"}],\"name\":\"setText\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"contentTypes\",\"type\":\"uint256\"}],\"name\":\"ABI\",\"outputs\":[{\"name\":\"contentType\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"x\",\"type\":\"bytes32\"},{\"name\":\"y\",\"type\":\"bytes32\"}],\"name\":\"setPubkey\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"content\",\"outputs\":[{\"name\":\"ret\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"addr\",\"outputs\":[{\"name\":\"ret\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"key\",\"type\":\"string\"}],\"name\":\"text\",\"outputs\":[{\"name\":\"ret\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"contentType\",\"type\":\"uint256\"},{\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"setABI\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"name\",\"outputs\":[{\"name\":\"ret\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"name\",\"type\":\"string\"}],\"name\":\"setName\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"hash\",\"type\":\"bytes32\"}],\"name\":\"setContent\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"pubkey\",\"outputs\":[{\"name\":\"x\",\"type\":\"bytes32\"},{\"name\":\"y\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"node\",\"type\":\"bytes32\"},{\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"setAddr\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"ensAddr\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"a\",\"type\":\"address\"}],\"name\":\"AddrChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"hash\",\"type\":\"bytes32\"}],\"name\":\"ContentChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NameChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"contentType\",\"type\":\"uint256\"}],\"name\":\"ABIChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"x\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"y\",\"type\":\"bytes32\"}],\"name\":\"PubkeyChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"name\":\"indexedKey\",\"type\":\"string\"},{\"indexed\":false,\"name\":\"key\",\"type\":\"string\"}],\"name\":\"TextChanged\",\"type\":\"event\"}]" - -// PublicResolverBin is the compiled bytecode used for deploying new contracts. -const PublicResolverBin = `0x6060604052341561000f57600080fd5b6040516020806111b28339810160405280805160008054600160a060020a03909216600160a060020a0319909216919091179055505061115e806100546000396000f3006060604052600436106100ab5763ffffffff60e060020a60003504166301ffc9a781146100b057806310f13a8c146100e45780632203ab561461017e57806329cd62ea146102155780632dff6941146102315780633b3b57de1461025957806359d1d43c1461028b578063623195b014610358578063691f3431146103b457806377372213146103ca578063c3d014d614610420578063c869023314610439578063d5fa2b0014610467575b600080fd5b34156100bb57600080fd5b6100d0600160e060020a031960043516610489565b604051901515815260200160405180910390f35b34156100ef57600080fd5b61017c600480359060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506105f695505050505050565b005b341561018957600080fd5b610197600435602435610807565b60405182815260406020820181815290820183818151815260200191508051906020019080838360005b838110156101d95780820151838201526020016101c1565b50505050905090810190601f1680156102065780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561022057600080fd5b61017c600435602435604435610931565b341561023c57600080fd5b610247600435610a30565b60405190815260200160405180910390f35b341561026457600080fd5b61026f600435610a46565b604051600160a060020a03909116815260200160405180910390f35b341561029657600080fd5b6102e1600480359060446024803590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610a6195505050505050565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561031d578082015183820152602001610305565b50505050905090810190601f16801561034a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561036357600080fd5b61017c600480359060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610b8095505050505050565b34156103bf57600080fd5b6102e1600435610c7c565b34156103d557600080fd5b61017c600480359060446024803590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610d4295505050505050565b341561042b57600080fd5b61017c600435602435610e8c565b341561044457600080fd5b61044f600435610f65565b60405191825260208201526040908101905180910390f35b341561047257600080fd5b61017c600435600160a060020a0360243516610f82565b6000600160e060020a031982167f3b3b57de0000000000000000000000000000000000000000000000000000000014806104ec5750600160e060020a031982167fd8389dc500000000000000000000000000000000000000000000000000000000145b806105205750600160e060020a031982167f691f343100000000000000000000000000000000000000000000000000000000145b806105545750600160e060020a031982167f2203ab5600000000000000000000000000000000000000000000000000000000145b806105885750600160e060020a031982167fc869023300000000000000000000000000000000000000000000000000000000145b806105bc5750600160e060020a031982167f59d1d43c00000000000000000000000000000000000000000000000000000000145b806105f05750600160e060020a031982167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b600080548491600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561064f57600080fd5b6102c65a03f1151561066057600080fd5b50505060405180519050600160a060020a031614151561067f57600080fd5b6000848152600160205260409081902083916005909101908590518082805190602001908083835b602083106106c65780518252601f1990920191602091820191016106a7565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902090805161070a929160200190611085565b50826040518082805190602001908083835b6020831061073b5780518252601f19909201916020918201910161071c565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051908190039020847fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a75508560405160208082528190810183818151815260200191508051906020019080838360005b838110156107c75780820151838201526020016107af565b50505050905090810190601f1680156107f45780820380516001836020036101000a031916815260200191505b509250505060405180910390a350505050565b6000610811611103565b60008481526001602081905260409091209092505b838311610924578284161580159061085f5750600083815260068201602052604081205460026000196101006001841615020190911604115b15610919578060060160008481526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561090d5780601f106108e25761010080835404028352916020019161090d565b820191906000526020600020905b8154815290600101906020018083116108f057829003601f168201915b50505050509150610929565b600290920291610826565b600092505b509250929050565b600080548491600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561098a57600080fd5b6102c65a03f1151561099b57600080fd5b50505060405180519050600160a060020a03161415156109ba57600080fd5b6040805190810160409081528482526020808301859052600087815260019091522060030181518155602082015160019091015550837f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e46848460405191825260208201526040908101905180910390a250505050565b6000908152600160208190526040909120015490565b600090815260016020526040902054600160a060020a031690565b610a69611103565b60008381526001602052604090819020600501908390518082805190602001908083835b60208310610aac5780518252601f199092019160209182019101610a8d565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b735780601f10610b4857610100808354040283529160200191610b73565b820191906000526020600020905b815481529060010190602001808311610b5657829003601f168201915b5050505050905092915050565b600080548491600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610bd957600080fd5b6102c65a03f11515610bea57600080fd5b50505060405180519050600160a060020a0316141515610c0957600080fd5b6000198301831615610c1a57600080fd5b60008481526001602090815260408083208684526006019091529020828051610c47929160200190611085565b5082847faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe360405160405180910390a350505050565b610c84611103565b6001600083600019166000191681526020019081526020016000206002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d365780601f10610d0b57610100808354040283529160200191610d36565b820191906000526020600020905b815481529060010190602001808311610d1957829003601f168201915b50505050509050919050565b600080548391600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610d9b57600080fd5b6102c65a03f11515610dac57600080fd5b50505060405180519050600160a060020a0316141515610dcb57600080fd5b6000838152600160205260409020600201828051610ded929160200190611085565b50827fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f78360405160208082528190810183818151815260200191508051906020019080838360005b83811015610e4d578082015183820152602001610e35565b50505050905090810190601f168015610e7a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b600080548391600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610ee557600080fd5b6102c65a03f11515610ef657600080fd5b50505060405180519050600160a060020a0316141515610f1557600080fd5b6000838152600160208190526040918290200183905583907f0424b6fe0d9c3bdbece0e7879dc241bb0c22e900be8b6c168b4ee08bd9bf83bc9084905190815260200160405180910390a2505050565b600090815260016020526040902060038101546004909101549091565b600080548391600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610fdb57600080fd5b6102c65a03f11515610fec57600080fd5b50505060405180519050600160a060020a031614151561100b57600080fd5b60008381526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03851617905583907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd290849051600160a060020a03909116815260200160405180910390a2505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106110c657805160ff19168380011785556110f3565b828001600101855582156110f3579182015b828111156110f35782518255916020019190600101906110d8565b506110ff929150611115565b5090565b60206040519081016040526000815290565b61112f91905b808211156110ff576000815560010161111b565b905600a165627a7a723058201ecacbc445b9fbcd91b0ab164389f69d7283b856883bc7437eeed1008345a4920029` - -// DeployPublicResolver deploys a new Ethereum contract, binding an instance of PublicResolver to it. -func DeployPublicResolver(auth *bind.TransactOpts, backend bind.ContractBackend, ensAddr common.Address) (common.Address, *types.Transaction, *PublicResolver, error) { - parsed, err := abi.JSON(strings.NewReader(PublicResolverABI)) - if err != nil { - return common.Address{}, nil, nil, err - } - address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(PublicResolverBin), backend, ensAddr) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &PublicResolver{PublicResolverCaller: PublicResolverCaller{contract: contract}, PublicResolverTransactor: PublicResolverTransactor{contract: contract}, PublicResolverFilterer: PublicResolverFilterer{contract: contract}}, nil -} - -// PublicResolver is an auto generated Go binding around an Ethereum contract. -type PublicResolver struct { - PublicResolverCaller // Read-only binding to the contract - PublicResolverTransactor // Write-only binding to the contract - PublicResolverFilterer // Log filterer for contract events -} - -// PublicResolverCaller is an auto generated read-only Go binding around an Ethereum contract. -type PublicResolverCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// PublicResolverTransactor is an auto generated write-only Go binding around an Ethereum contract. -type PublicResolverTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// PublicResolverFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type PublicResolverFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// PublicResolverSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type PublicResolverSession struct { - Contract *PublicResolver // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// PublicResolverCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type PublicResolverCallerSession struct { - Contract *PublicResolverCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// PublicResolverTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type PublicResolverTransactorSession struct { - Contract *PublicResolverTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// PublicResolverRaw is an auto generated low-level Go binding around an Ethereum contract. -type PublicResolverRaw struct { - Contract *PublicResolver // Generic contract binding to access the raw methods on -} - -// PublicResolverCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type PublicResolverCallerRaw struct { - Contract *PublicResolverCaller // Generic read-only contract binding to access the raw methods on -} - -// PublicResolverTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type PublicResolverTransactorRaw struct { - Contract *PublicResolverTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewPublicResolver creates a new instance of PublicResolver, bound to a specific deployed contract. -func NewPublicResolver(address common.Address, backend bind.ContractBackend) (*PublicResolver, error) { - contract, err := bindPublicResolver(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &PublicResolver{PublicResolverCaller: PublicResolverCaller{contract: contract}, PublicResolverTransactor: PublicResolverTransactor{contract: contract}, PublicResolverFilterer: PublicResolverFilterer{contract: contract}}, nil -} - -// NewPublicResolverCaller creates a new read-only instance of PublicResolver, bound to a specific deployed contract. -func NewPublicResolverCaller(address common.Address, caller bind.ContractCaller) (*PublicResolverCaller, error) { - contract, err := bindPublicResolver(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &PublicResolverCaller{contract: contract}, nil -} - -// NewPublicResolverTransactor creates a new write-only instance of PublicResolver, bound to a specific deployed contract. -func NewPublicResolverTransactor(address common.Address, transactor bind.ContractTransactor) (*PublicResolverTransactor, error) { - contract, err := bindPublicResolver(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &PublicResolverTransactor{contract: contract}, nil -} - -// NewPublicResolverFilterer creates a new log filterer instance of PublicResolver, bound to a specific deployed contract. -func NewPublicResolverFilterer(address common.Address, filterer bind.ContractFilterer) (*PublicResolverFilterer, error) { - contract, err := bindPublicResolver(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &PublicResolverFilterer{contract: contract}, nil -} - -// bindPublicResolver binds a generic wrapper to an already deployed contract. -func bindPublicResolver(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := abi.JSON(strings.NewReader(PublicResolverABI)) - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_PublicResolver *PublicResolverRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _PublicResolver.Contract.PublicResolverCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_PublicResolver *PublicResolverRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _PublicResolver.Contract.PublicResolverTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_PublicResolver *PublicResolverRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _PublicResolver.Contract.PublicResolverTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_PublicResolver *PublicResolverCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error { - return _PublicResolver.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_PublicResolver *PublicResolverTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _PublicResolver.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_PublicResolver *PublicResolverTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _PublicResolver.Contract.contract.Transact(opts, method, params...) -} - -// ABI is a free data retrieval call binding the contract method 0x2203ab56. -// -// Solidity: function ABI(node bytes32, contentTypes uint256) constant returns(contentType uint256, data bytes) -func (_PublicResolver *PublicResolverCaller) ABI(opts *bind.CallOpts, node [32]byte, contentTypes *big.Int) (struct { - ContentType *big.Int - Data []byte -}, error) { - ret := new(struct { - ContentType *big.Int - Data []byte - }) - out := ret - err := _PublicResolver.contract.Call(opts, out, "ABI", node, contentTypes) - return *ret, err -} - -// ABI is a free data retrieval call binding the contract method 0x2203ab56. -// -// Solidity: function ABI(node bytes32, contentTypes uint256) constant returns(contentType uint256, data bytes) -func (_PublicResolver *PublicResolverSession) ABI(node [32]byte, contentTypes *big.Int) (struct { - ContentType *big.Int - Data []byte -}, error) { - return _PublicResolver.Contract.ABI(&_PublicResolver.CallOpts, node, contentTypes) -} - -// ABI is a free data retrieval call binding the contract method 0x2203ab56. -// -// Solidity: function ABI(node bytes32, contentTypes uint256) constant returns(contentType uint256, data bytes) -func (_PublicResolver *PublicResolverCallerSession) ABI(node [32]byte, contentTypes *big.Int) (struct { - ContentType *big.Int - Data []byte -}, error) { - return _PublicResolver.Contract.ABI(&_PublicResolver.CallOpts, node, contentTypes) -} - -// Addr is a free data retrieval call binding the contract method 0x3b3b57de. -// -// Solidity: function addr(node bytes32) constant returns(ret address) -func (_PublicResolver *PublicResolverCaller) Addr(opts *bind.CallOpts, node [32]byte) (common.Address, error) { - var ( - ret0 = new(common.Address) - ) - out := ret0 - err := _PublicResolver.contract.Call(opts, out, "addr", node) - return *ret0, err -} - -// Addr is a free data retrieval call binding the contract method 0x3b3b57de. -// -// Solidity: function addr(node bytes32) constant returns(ret address) -func (_PublicResolver *PublicResolverSession) Addr(node [32]byte) (common.Address, error) { - return _PublicResolver.Contract.Addr(&_PublicResolver.CallOpts, node) -} - -// Addr is a free data retrieval call binding the contract method 0x3b3b57de. -// -// Solidity: function addr(node bytes32) constant returns(ret address) -func (_PublicResolver *PublicResolverCallerSession) Addr(node [32]byte) (common.Address, error) { - return _PublicResolver.Contract.Addr(&_PublicResolver.CallOpts, node) -} - -// Content is a free data retrieval call binding the contract method 0x2dff6941. -// -// Solidity: function content(node bytes32) constant returns(ret bytes32) -func (_PublicResolver *PublicResolverCaller) Content(opts *bind.CallOpts, node [32]byte) ([32]byte, error) { - var ( - ret0 = new([32]byte) - ) - out := ret0 - err := _PublicResolver.contract.Call(opts, out, "content", node) - return *ret0, err -} - -// Content is a free data retrieval call binding the contract method 0x2dff6941. -// -// Solidity: function content(node bytes32) constant returns(ret bytes32) -func (_PublicResolver *PublicResolverSession) Content(node [32]byte) ([32]byte, error) { - return _PublicResolver.Contract.Content(&_PublicResolver.CallOpts, node) -} - -// Content is a free data retrieval call binding the contract method 0x2dff6941. -// -// Solidity: function content(node bytes32) constant returns(ret bytes32) -func (_PublicResolver *PublicResolverCallerSession) Content(node [32]byte) ([32]byte, error) { - return _PublicResolver.Contract.Content(&_PublicResolver.CallOpts, node) -} - -// Name is a free data retrieval call binding the contract method 0x691f3431. -// -// Solidity: function name(node bytes32) constant returns(ret string) -func (_PublicResolver *PublicResolverCaller) Name(opts *bind.CallOpts, node [32]byte) (string, error) { - var ( - ret0 = new(string) - ) - out := ret0 - err := _PublicResolver.contract.Call(opts, out, "name", node) - return *ret0, err -} - -// Name is a free data retrieval call binding the contract method 0x691f3431. -// -// Solidity: function name(node bytes32) constant returns(ret string) -func (_PublicResolver *PublicResolverSession) Name(node [32]byte) (string, error) { - return _PublicResolver.Contract.Name(&_PublicResolver.CallOpts, node) -} - -// Name is a free data retrieval call binding the contract method 0x691f3431. -// -// Solidity: function name(node bytes32) constant returns(ret string) -func (_PublicResolver *PublicResolverCallerSession) Name(node [32]byte) (string, error) { - return _PublicResolver.Contract.Name(&_PublicResolver.CallOpts, node) -} - -// Pubkey is a free data retrieval call binding the contract method 0xc8690233. -// -// Solidity: function pubkey(node bytes32) constant returns(x bytes32, y bytes32) -func (_PublicResolver *PublicResolverCaller) Pubkey(opts *bind.CallOpts, node [32]byte) (struct { - X [32]byte - Y [32]byte -}, error) { - ret := new(struct { - X [32]byte - Y [32]byte - }) - out := ret - err := _PublicResolver.contract.Call(opts, out, "pubkey", node) - return *ret, err -} - -// Pubkey is a free data retrieval call binding the contract method 0xc8690233. -// -// Solidity: function pubkey(node bytes32) constant returns(x bytes32, y bytes32) -func (_PublicResolver *PublicResolverSession) Pubkey(node [32]byte) (struct { - X [32]byte - Y [32]byte -}, error) { - return _PublicResolver.Contract.Pubkey(&_PublicResolver.CallOpts, node) -} - -// Pubkey is a free data retrieval call binding the contract method 0xc8690233. -// -// Solidity: function pubkey(node bytes32) constant returns(x bytes32, y bytes32) -func (_PublicResolver *PublicResolverCallerSession) Pubkey(node [32]byte) (struct { - X [32]byte - Y [32]byte -}, error) { - return _PublicResolver.Contract.Pubkey(&_PublicResolver.CallOpts, node) -} - -// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. -// -// Solidity: function supportsInterface(interfaceID bytes4) constant returns(bool) -func (_PublicResolver *PublicResolverCaller) SupportsInterface(opts *bind.CallOpts, interfaceID [4]byte) (bool, error) { - var ( - ret0 = new(bool) - ) - out := ret0 - err := _PublicResolver.contract.Call(opts, out, "supportsInterface", interfaceID) - return *ret0, err -} - -// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. -// -// Solidity: function supportsInterface(interfaceID bytes4) constant returns(bool) -func (_PublicResolver *PublicResolverSession) SupportsInterface(interfaceID [4]byte) (bool, error) { - return _PublicResolver.Contract.SupportsInterface(&_PublicResolver.CallOpts, interfaceID) -} - -// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. -// -// Solidity: function supportsInterface(interfaceID bytes4) constant returns(bool) -func (_PublicResolver *PublicResolverCallerSession) SupportsInterface(interfaceID [4]byte) (bool, error) { - return _PublicResolver.Contract.SupportsInterface(&_PublicResolver.CallOpts, interfaceID) -} - -// Text is a free data retrieval call binding the contract method 0x59d1d43c. -// -// Solidity: function text(node bytes32, key string) constant returns(ret string) -func (_PublicResolver *PublicResolverCaller) Text(opts *bind.CallOpts, node [32]byte, key string) (string, error) { - var ( - ret0 = new(string) - ) - out := ret0 - err := _PublicResolver.contract.Call(opts, out, "text", node, key) - return *ret0, err -} - -// Text is a free data retrieval call binding the contract method 0x59d1d43c. -// -// Solidity: function text(node bytes32, key string) constant returns(ret string) -func (_PublicResolver *PublicResolverSession) Text(node [32]byte, key string) (string, error) { - return _PublicResolver.Contract.Text(&_PublicResolver.CallOpts, node, key) -} - -// Text is a free data retrieval call binding the contract method 0x59d1d43c. -// -// Solidity: function text(node bytes32, key string) constant returns(ret string) -func (_PublicResolver *PublicResolverCallerSession) Text(node [32]byte, key string) (string, error) { - return _PublicResolver.Contract.Text(&_PublicResolver.CallOpts, node, key) -} - -// SetABI is a paid mutator transaction binding the contract method 0x623195b0. -// -// Solidity: function setABI(node bytes32, contentType uint256, data bytes) returns() -func (_PublicResolver *PublicResolverTransactor) SetABI(opts *bind.TransactOpts, node [32]byte, contentType *big.Int, data []byte) (*types.Transaction, error) { - return _PublicResolver.contract.Transact(opts, "setABI", node, contentType, data) -} - -// SetABI is a paid mutator transaction binding the contract method 0x623195b0. -// -// Solidity: function setABI(node bytes32, contentType uint256, data bytes) returns() -func (_PublicResolver *PublicResolverSession) SetABI(node [32]byte, contentType *big.Int, data []byte) (*types.Transaction, error) { - return _PublicResolver.Contract.SetABI(&_PublicResolver.TransactOpts, node, contentType, data) -} - -// SetABI is a paid mutator transaction binding the contract method 0x623195b0. -// -// Solidity: function setABI(node bytes32, contentType uint256, data bytes) returns() -func (_PublicResolver *PublicResolverTransactorSession) SetABI(node [32]byte, contentType *big.Int, data []byte) (*types.Transaction, error) { - return _PublicResolver.Contract.SetABI(&_PublicResolver.TransactOpts, node, contentType, data) -} - -// SetAddr is a paid mutator transaction binding the contract method 0xd5fa2b00. -// -// Solidity: function setAddr(node bytes32, addr address) returns() -func (_PublicResolver *PublicResolverTransactor) SetAddr(opts *bind.TransactOpts, node [32]byte, addr common.Address) (*types.Transaction, error) { - return _PublicResolver.contract.Transact(opts, "setAddr", node, addr) -} - -// SetAddr is a paid mutator transaction binding the contract method 0xd5fa2b00. -// -// Solidity: function setAddr(node bytes32, addr address) returns() -func (_PublicResolver *PublicResolverSession) SetAddr(node [32]byte, addr common.Address) (*types.Transaction, error) { - return _PublicResolver.Contract.SetAddr(&_PublicResolver.TransactOpts, node, addr) -} - -// SetAddr is a paid mutator transaction binding the contract method 0xd5fa2b00. -// -// Solidity: function setAddr(node bytes32, addr address) returns() -func (_PublicResolver *PublicResolverTransactorSession) SetAddr(node [32]byte, addr common.Address) (*types.Transaction, error) { - return _PublicResolver.Contract.SetAddr(&_PublicResolver.TransactOpts, node, addr) -} - -// SetContent is a paid mutator transaction binding the contract method 0xc3d014d6. -// -// Solidity: function setContent(node bytes32, hash bytes32) returns() -func (_PublicResolver *PublicResolverTransactor) SetContent(opts *bind.TransactOpts, node [32]byte, hash [32]byte) (*types.Transaction, error) { - return _PublicResolver.contract.Transact(opts, "setContent", node, hash) -} - -// SetContent is a paid mutator transaction binding the contract method 0xc3d014d6. -// -// Solidity: function setContent(node bytes32, hash bytes32) returns() -func (_PublicResolver *PublicResolverSession) SetContent(node [32]byte, hash [32]byte) (*types.Transaction, error) { - return _PublicResolver.Contract.SetContent(&_PublicResolver.TransactOpts, node, hash) -} - -// SetContent is a paid mutator transaction binding the contract method 0xc3d014d6. -// -// Solidity: function setContent(node bytes32, hash bytes32) returns() -func (_PublicResolver *PublicResolverTransactorSession) SetContent(node [32]byte, hash [32]byte) (*types.Transaction, error) { - return _PublicResolver.Contract.SetContent(&_PublicResolver.TransactOpts, node, hash) -} - -// SetName is a paid mutator transaction binding the contract method 0x77372213. -// -// Solidity: function setName(node bytes32, name string) returns() -func (_PublicResolver *PublicResolverTransactor) SetName(opts *bind.TransactOpts, node [32]byte, name string) (*types.Transaction, error) { - return _PublicResolver.contract.Transact(opts, "setName", node, name) -} - -// SetName is a paid mutator transaction binding the contract method 0x77372213. -// -// Solidity: function setName(node bytes32, name string) returns() -func (_PublicResolver *PublicResolverSession) SetName(node [32]byte, name string) (*types.Transaction, error) { - return _PublicResolver.Contract.SetName(&_PublicResolver.TransactOpts, node, name) -} - -// SetName is a paid mutator transaction binding the contract method 0x77372213. -// -// Solidity: function setName(node bytes32, name string) returns() -func (_PublicResolver *PublicResolverTransactorSession) SetName(node [32]byte, name string) (*types.Transaction, error) { - return _PublicResolver.Contract.SetName(&_PublicResolver.TransactOpts, node, name) -} - -// SetPubkey is a paid mutator transaction binding the contract method 0x29cd62ea. -// -// Solidity: function setPubkey(node bytes32, x bytes32, y bytes32) returns() -func (_PublicResolver *PublicResolverTransactor) SetPubkey(opts *bind.TransactOpts, node [32]byte, x [32]byte, y [32]byte) (*types.Transaction, error) { - return _PublicResolver.contract.Transact(opts, "setPubkey", node, x, y) -} - -// SetPubkey is a paid mutator transaction binding the contract method 0x29cd62ea. -// -// Solidity: function setPubkey(node bytes32, x bytes32, y bytes32) returns() -func (_PublicResolver *PublicResolverSession) SetPubkey(node [32]byte, x [32]byte, y [32]byte) (*types.Transaction, error) { - return _PublicResolver.Contract.SetPubkey(&_PublicResolver.TransactOpts, node, x, y) -} - -// SetPubkey is a paid mutator transaction binding the contract method 0x29cd62ea. -// -// Solidity: function setPubkey(node bytes32, x bytes32, y bytes32) returns() -func (_PublicResolver *PublicResolverTransactorSession) SetPubkey(node [32]byte, x [32]byte, y [32]byte) (*types.Transaction, error) { - return _PublicResolver.Contract.SetPubkey(&_PublicResolver.TransactOpts, node, x, y) -} - -// SetText is a paid mutator transaction binding the contract method 0x10f13a8c. -// -// Solidity: function setText(node bytes32, key string, value string) returns() -func (_PublicResolver *PublicResolverTransactor) SetText(opts *bind.TransactOpts, node [32]byte, key string, value string) (*types.Transaction, error) { - return _PublicResolver.contract.Transact(opts, "setText", node, key, value) -} - -// SetText is a paid mutator transaction binding the contract method 0x10f13a8c. -// -// Solidity: function setText(node bytes32, key string, value string) returns() -func (_PublicResolver *PublicResolverSession) SetText(node [32]byte, key string, value string) (*types.Transaction, error) { - return _PublicResolver.Contract.SetText(&_PublicResolver.TransactOpts, node, key, value) -} - -// SetText is a paid mutator transaction binding the contract method 0x10f13a8c. -// -// Solidity: function setText(node bytes32, key string, value string) returns() -func (_PublicResolver *PublicResolverTransactorSession) SetText(node [32]byte, key string, value string) (*types.Transaction, error) { - return _PublicResolver.Contract.SetText(&_PublicResolver.TransactOpts, node, key, value) -} - -// PublicResolverABIChangedIterator is returned from FilterABIChanged and is used to iterate over the raw logs and unpacked data for ABIChanged events raised by the PublicResolver contract. -type PublicResolverABIChangedIterator struct { - Event *PublicResolverABIChanged // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PublicResolverABIChangedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PublicResolverABIChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PublicResolverABIChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *PublicResolverABIChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PublicResolverABIChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PublicResolverABIChanged represents a ABIChanged event raised by the PublicResolver contract. -type PublicResolverABIChanged struct { - Node [32]byte - ContentType *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterABIChanged is a free log retrieval operation binding the contract event 0xaa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe3. -// -// Solidity: event ABIChanged(node indexed bytes32, contentType indexed uint256) -func (_PublicResolver *PublicResolverFilterer) FilterABIChanged(opts *bind.FilterOpts, node [][32]byte, contentType []*big.Int) (*PublicResolverABIChangedIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - var contentTypeRule []interface{} - for _, contentTypeItem := range contentType { - contentTypeRule = append(contentTypeRule, contentTypeItem) - } - - logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "ABIChanged", nodeRule, contentTypeRule) - if err != nil { - return nil, err - } - return &PublicResolverABIChangedIterator{contract: _PublicResolver.contract, event: "ABIChanged", logs: logs, sub: sub}, nil -} - -// WatchABIChanged is a free log subscription operation binding the contract event 0xaa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe3. -// -// Solidity: event ABIChanged(node indexed bytes32, contentType indexed uint256) -func (_PublicResolver *PublicResolverFilterer) WatchABIChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverABIChanged, node [][32]byte, contentType []*big.Int) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - var contentTypeRule []interface{} - for _, contentTypeItem := range contentType { - contentTypeRule = append(contentTypeRule, contentTypeItem) - } - - logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "ABIChanged", nodeRule, contentTypeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PublicResolverABIChanged) - if err := _PublicResolver.contract.UnpackLog(event, "ABIChanged", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// PublicResolverAddrChangedIterator is returned from FilterAddrChanged and is used to iterate over the raw logs and unpacked data for AddrChanged events raised by the PublicResolver contract. -type PublicResolverAddrChangedIterator struct { - Event *PublicResolverAddrChanged // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PublicResolverAddrChangedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PublicResolverAddrChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PublicResolverAddrChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *PublicResolverAddrChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PublicResolverAddrChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PublicResolverAddrChanged represents a AddrChanged event raised by the PublicResolver contract. -type PublicResolverAddrChanged struct { - Node [32]byte - A common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterAddrChanged is a free log retrieval operation binding the contract event 0x52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2. -// -// Solidity: event AddrChanged(node indexed bytes32, a address) -func (_PublicResolver *PublicResolverFilterer) FilterAddrChanged(opts *bind.FilterOpts, node [][32]byte) (*PublicResolverAddrChangedIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "AddrChanged", nodeRule) - if err != nil { - return nil, err - } - return &PublicResolverAddrChangedIterator{contract: _PublicResolver.contract, event: "AddrChanged", logs: logs, sub: sub}, nil -} - -// WatchAddrChanged is a free log subscription operation binding the contract event 0x52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2. -// -// Solidity: event AddrChanged(node indexed bytes32, a address) -func (_PublicResolver *PublicResolverFilterer) WatchAddrChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverAddrChanged, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "AddrChanged", nodeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PublicResolverAddrChanged) - if err := _PublicResolver.contract.UnpackLog(event, "AddrChanged", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// PublicResolverContentChangedIterator is returned from FilterContentChanged and is used to iterate over the raw logs and unpacked data for ContentChanged events raised by the PublicResolver contract. -type PublicResolverContentChangedIterator struct { - Event *PublicResolverContentChanged // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PublicResolverContentChangedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PublicResolverContentChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PublicResolverContentChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *PublicResolverContentChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PublicResolverContentChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PublicResolverContentChanged represents a ContentChanged event raised by the PublicResolver contract. -type PublicResolverContentChanged struct { - Node [32]byte - Hash [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterContentChanged is a free log retrieval operation binding the contract event 0x0424b6fe0d9c3bdbece0e7879dc241bb0c22e900be8b6c168b4ee08bd9bf83bc. -// -// Solidity: event ContentChanged(node indexed bytes32, hash bytes32) -func (_PublicResolver *PublicResolverFilterer) FilterContentChanged(opts *bind.FilterOpts, node [][32]byte) (*PublicResolverContentChangedIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "ContentChanged", nodeRule) - if err != nil { - return nil, err - } - return &PublicResolverContentChangedIterator{contract: _PublicResolver.contract, event: "ContentChanged", logs: logs, sub: sub}, nil -} - -// WatchContentChanged is a free log subscription operation binding the contract event 0x0424b6fe0d9c3bdbece0e7879dc241bb0c22e900be8b6c168b4ee08bd9bf83bc. -// -// Solidity: event ContentChanged(node indexed bytes32, hash bytes32) -func (_PublicResolver *PublicResolverFilterer) WatchContentChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverContentChanged, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "ContentChanged", nodeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PublicResolverContentChanged) - if err := _PublicResolver.contract.UnpackLog(event, "ContentChanged", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// PublicResolverNameChangedIterator is returned from FilterNameChanged and is used to iterate over the raw logs and unpacked data for NameChanged events raised by the PublicResolver contract. -type PublicResolverNameChangedIterator struct { - Event *PublicResolverNameChanged // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PublicResolverNameChangedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PublicResolverNameChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PublicResolverNameChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *PublicResolverNameChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PublicResolverNameChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PublicResolverNameChanged represents a NameChanged event raised by the PublicResolver contract. -type PublicResolverNameChanged struct { - Node [32]byte - Name string - Raw types.Log // Blockchain specific contextual infos -} - -// FilterNameChanged is a free log retrieval operation binding the contract event 0xb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7. -// -// Solidity: event NameChanged(node indexed bytes32, name string) -func (_PublicResolver *PublicResolverFilterer) FilterNameChanged(opts *bind.FilterOpts, node [][32]byte) (*PublicResolverNameChangedIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "NameChanged", nodeRule) - if err != nil { - return nil, err - } - return &PublicResolverNameChangedIterator{contract: _PublicResolver.contract, event: "NameChanged", logs: logs, sub: sub}, nil -} - -// WatchNameChanged is a free log subscription operation binding the contract event 0xb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f7. -// -// Solidity: event NameChanged(node indexed bytes32, name string) -func (_PublicResolver *PublicResolverFilterer) WatchNameChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverNameChanged, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "NameChanged", nodeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PublicResolverNameChanged) - if err := _PublicResolver.contract.UnpackLog(event, "NameChanged", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// PublicResolverPubkeyChangedIterator is returned from FilterPubkeyChanged and is used to iterate over the raw logs and unpacked data for PubkeyChanged events raised by the PublicResolver contract. -type PublicResolverPubkeyChangedIterator struct { - Event *PublicResolverPubkeyChanged // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PublicResolverPubkeyChangedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PublicResolverPubkeyChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PublicResolverPubkeyChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *PublicResolverPubkeyChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PublicResolverPubkeyChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PublicResolverPubkeyChanged represents a PubkeyChanged event raised by the PublicResolver contract. -type PublicResolverPubkeyChanged struct { - Node [32]byte - X [32]byte - Y [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterPubkeyChanged is a free log retrieval operation binding the contract event 0x1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e46. -// -// Solidity: event PubkeyChanged(node indexed bytes32, x bytes32, y bytes32) -func (_PublicResolver *PublicResolverFilterer) FilterPubkeyChanged(opts *bind.FilterOpts, node [][32]byte) (*PublicResolverPubkeyChangedIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "PubkeyChanged", nodeRule) - if err != nil { - return nil, err - } - return &PublicResolverPubkeyChangedIterator{contract: _PublicResolver.contract, event: "PubkeyChanged", logs: logs, sub: sub}, nil -} - -// WatchPubkeyChanged is a free log subscription operation binding the contract event 0x1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e46. -// -// Solidity: event PubkeyChanged(node indexed bytes32, x bytes32, y bytes32) -func (_PublicResolver *PublicResolverFilterer) WatchPubkeyChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverPubkeyChanged, node [][32]byte) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - - logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "PubkeyChanged", nodeRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PublicResolverPubkeyChanged) - if err := _PublicResolver.contract.UnpackLog(event, "PubkeyChanged", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// PublicResolverTextChangedIterator is returned from FilterTextChanged and is used to iterate over the raw logs and unpacked data for TextChanged events raised by the PublicResolver contract. -type PublicResolverTextChangedIterator struct { - Event *PublicResolverTextChanged // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub ethereum.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PublicResolverTextChangedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PublicResolverTextChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PublicResolverTextChanged) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error retruned any retrieval or parsing error occurred during filtering. -func (it *PublicResolverTextChangedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PublicResolverTextChangedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PublicResolverTextChanged represents a TextChanged event raised by the PublicResolver contract. -type PublicResolverTextChanged struct { - Node [32]byte - IndexedKey common.Hash - Key string - Raw types.Log // Blockchain specific contextual infos -} - -// FilterTextChanged is a free log retrieval operation binding the contract event 0xd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a7550. -// -// Solidity: event TextChanged(node indexed bytes32, indexedKey indexed string, key string) -func (_PublicResolver *PublicResolverFilterer) FilterTextChanged(opts *bind.FilterOpts, node [][32]byte, indexedKey []string) (*PublicResolverTextChangedIterator, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - var indexedKeyRule []interface{} - for _, indexedKeyItem := range indexedKey { - indexedKeyRule = append(indexedKeyRule, indexedKeyItem) - } - - logs, sub, err := _PublicResolver.contract.FilterLogs(opts, "TextChanged", nodeRule, indexedKeyRule) - if err != nil { - return nil, err - } - return &PublicResolverTextChangedIterator{contract: _PublicResolver.contract, event: "TextChanged", logs: logs, sub: sub}, nil -} - -// WatchTextChanged is a free log subscription operation binding the contract event 0xd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a7550. -// -// Solidity: event TextChanged(node indexed bytes32, indexedKey indexed string, key string) -func (_PublicResolver *PublicResolverFilterer) WatchTextChanged(opts *bind.WatchOpts, sink chan<- *PublicResolverTextChanged, node [][32]byte, indexedKey []string) (event.Subscription, error) { - - var nodeRule []interface{} - for _, nodeItem := range node { - nodeRule = append(nodeRule, nodeItem) - } - var indexedKeyRule []interface{} - for _, indexedKeyItem := range indexedKey { - indexedKeyRule = append(indexedKeyRule, indexedKeyItem) - } - - logs, sub, err := _PublicResolver.contract.WatchLogs(opts, "TextChanged", nodeRule, indexedKeyRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PublicResolverTextChanged) - if err := _PublicResolver.contract.UnpackLog(event, "TextChanged", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} diff --git a/contracts/ens/ens.go b/contracts/ens/ens.go deleted file mode 100644 index 2576b9a9e898..000000000000 --- a/contracts/ens/ens.go +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ens - -//go:generate abigen --sol contract/ENS.sol --exc contract/AbstractENS.sol:AbstractENS --pkg contract --out contract/ens.go -//go:generate abigen --sol contract/FIFSRegistrar.sol --exc contract/AbstractENS.sol:AbstractENS --pkg contract --out contract/fifsregistrar.go -//go:generate abigen --sol contract/PublicResolver.sol --exc contract/AbstractENS.sol:AbstractENS --pkg contract --out contract/publicresolver.go - -import ( - "strings" - - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/contracts/ens/contract" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" -) - -var ( - MainNetAddress = common.HexToAddress("0x314159265dD8dbb310642f98f50C066173C1259b") - TestNetAddress = common.HexToAddress("0x112234455c3a32fd11230c42e7bccd4a84e02010") -) - -// swarm domain name registry and resolver -type ENS struct { - *contract.ENSSession - contractBackend bind.ContractBackend -} - -// NewENS creates a struct exposing convenient high-level operations for interacting with -// the Ethereum Name Service. -func NewENS(transactOpts *bind.TransactOpts, contractAddr common.Address, contractBackend bind.ContractBackend) (*ENS, error) { - ens, err := contract.NewENS(contractAddr, contractBackend) - if err != nil { - return nil, err - } - - return &ENS{ - &contract.ENSSession{ - Contract: ens, - TransactOpts: *transactOpts, - }, - contractBackend, - }, nil -} - -// DeployENS deploys an instance of the ENS nameservice, with a 'first-in, first-served' root registrar. -func DeployENS(transactOpts *bind.TransactOpts, contractBackend bind.ContractBackend) (common.Address, *ENS, error) { - // Deploy the ENS registry. - ensAddr, _, _, err := contract.DeployENS(transactOpts, contractBackend) - if err != nil { - return ensAddr, nil, err - } - - ens, err := NewENS(transactOpts, ensAddr, contractBackend) - if err != nil { - return ensAddr, nil, err - } - - // Deploy the registrar. - regAddr, _, _, err := contract.DeployFIFSRegistrar(transactOpts, contractBackend, ensAddr, [32]byte{}) - if err != nil { - return ensAddr, nil, err - } - // Set the registrar as owner of the ENS root. - if _, err = ens.SetOwner([32]byte{}, regAddr); err != nil { - return ensAddr, nil, err - } - - return ensAddr, ens, nil -} - -func ensParentNode(name string) (common.Hash, common.Hash) { - parts := strings.SplitN(name, ".", 2) - label := crypto.Keccak256Hash([]byte(parts[0])) - if len(parts) == 1 { - return [32]byte{}, label - } else { - parentNode, parentLabel := ensParentNode(parts[1]) - return crypto.Keccak256Hash(parentNode[:], parentLabel[:]), label - } -} - -func EnsNode(name string) common.Hash { - parentNode, parentLabel := ensParentNode(name) - return crypto.Keccak256Hash(parentNode[:], parentLabel[:]) -} - -func (self *ENS) getResolver(node [32]byte) (*contract.PublicResolverSession, error) { - resolverAddr, err := self.Resolver(node) - if err != nil { - return nil, err - } - - resolver, err := contract.NewPublicResolver(resolverAddr, self.contractBackend) - if err != nil { - return nil, err - } - - return &contract.PublicResolverSession{ - Contract: resolver, - TransactOpts: self.TransactOpts, - }, nil -} - -func (self *ENS) getRegistrar(node [32]byte) (*contract.FIFSRegistrarSession, error) { - registrarAddr, err := self.Owner(node) - if err != nil { - return nil, err - } - - registrar, err := contract.NewFIFSRegistrar(registrarAddr, self.contractBackend) - if err != nil { - return nil, err - } - - return &contract.FIFSRegistrarSession{ - Contract: registrar, - TransactOpts: self.TransactOpts, - }, nil -} - -// Resolve is a non-transactional call that returns the content hash associated with a name. -func (self *ENS) Resolve(name string) (common.Hash, error) { - node := EnsNode(name) - - resolver, err := self.getResolver(node) - if err != nil { - return common.Hash{}, err - } - - ret, err := resolver.Content(node) - if err != nil { - return common.Hash{}, err - } - - return common.BytesToHash(ret[:]), nil -} - -// Addr is a non-transactional call that returns the address associated with a name. -func (self *ENS) Addr(name string) (common.Address, error) { - node := EnsNode(name) - - resolver, err := self.getResolver(node) - if err != nil { - return common.Address{}, err - } - - ret, err := resolver.Addr(node) - if err != nil { - return common.Address{}, err - } - - return common.BytesToAddress(ret[:]), nil -} - -// SetAddress sets the address associated with a name. Only works if the caller -// owns the name, and the associated resolver implements a `setAddress` function. -func (self *ENS) SetAddr(name string, addr common.Address) (*types.Transaction, error) { - node := EnsNode(name) - - resolver, err := self.getResolver(node) - if err != nil { - return nil, err - } - - opts := self.TransactOpts - opts.GasLimit = 200000 - return resolver.Contract.SetAddr(&opts, node, addr) -} - -// Register registers a new domain name for the caller, making them the owner of the new name. -// Only works if the registrar for the parent domain implements the FIFS registrar protocol. -func (self *ENS) Register(name string) (*types.Transaction, error) { - parentNode, label := ensParentNode(name) - registrar, err := self.getRegistrar(parentNode) - if err != nil { - return nil, err - } - return registrar.Contract.Register(&self.TransactOpts, label, self.TransactOpts.From) -} - -// SetContentHash sets the content hash associated with a name. Only works if the caller -// owns the name, and the associated resolver implements a `setContent` function. -func (self *ENS) SetContentHash(name string, hash common.Hash) (*types.Transaction, error) { - node := EnsNode(name) - - resolver, err := self.getResolver(node) - if err != nil { - return nil, err - } - - opts := self.TransactOpts - opts.GasLimit = 200000 - return resolver.Contract.SetContent(&opts, node, hash) -} diff --git a/contracts/ens/ens_test.go b/contracts/ens/ens_test.go deleted file mode 100644 index d6a3b0609375..000000000000 --- a/contracts/ens/ens_test.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ens - -import ( - "math/big" - "testing" - - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/accounts/abi/bind/backends" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/contracts/ens/contract" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/crypto" -) - -var ( - key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - name = "my name on ENS" - hash = crypto.Keccak256Hash([]byte("my content")) - addr = crypto.PubkeyToAddress(key.PublicKey) - testAddr = common.HexToAddress("0x1234123412341234123412341234123412341234") -) - -func TestENS(t *testing.T) { - contractBackend := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(1000000000)}}, 10000000) - transactOpts := bind.NewKeyedTransactor(key) - - ensAddr, ens, err := DeployENS(transactOpts, contractBackend) - if err != nil { - t.Fatalf("can't deploy root registry: %v", err) - } - contractBackend.Commit() - - // Set ourself as the owner of the name. - if _, err := ens.Register(name); err != nil { - t.Fatalf("can't register: %v", err) - } - contractBackend.Commit() - - // Deploy a resolver and make it responsible for the name. - resolverAddr, _, _, err := contract.DeployPublicResolver(transactOpts, contractBackend, ensAddr) - if err != nil { - t.Fatalf("can't deploy resolver: %v", err) - } - if _, err := ens.SetResolver(EnsNode(name), resolverAddr); err != nil { - t.Fatalf("can't set resolver: %v", err) - } - contractBackend.Commit() - - // Set the content hash for the name. - if _, err = ens.SetContentHash(name, hash); err != nil { - t.Fatalf("can't set content hash: %v", err) - } - contractBackend.Commit() - - // Try to resolve the name. - vhost, err := ens.Resolve(name) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - if vhost != hash { - t.Fatalf("resolve error, expected %v, got %v", hash.Hex(), vhost.Hex()) - } - - // set the address for the name - if _, err = ens.SetAddr(name, testAddr); err != nil { - t.Fatalf("can't set address: %v", err) - } - contractBackend.Commit() - - // Try to resolve the name to an address - recoveredAddr, err := ens.Addr(name) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - if vhost != hash { - t.Fatalf("resolve error, expected %v, got %v", testAddr.Hex(), recoveredAddr.Hex()) - } -} diff --git a/core/asm/asm.go b/core/asm/asm.go index 7f19bf1d41e0..4257198cc779 100644 --- a/core/asm/asm.go +++ b/core/asm/asm.go @@ -21,7 +21,7 @@ import ( "encoding/hex" "fmt" - "github.com/nebulaai/nbai-node/core/vm" + "github.com/ethereum/go-ethereum/core/vm" ) // Iterator for disassembled EVM instructions diff --git a/core/asm/compiler.go b/core/asm/compiler.go index bc0807832b2c..799709929875 100644 --- a/core/asm/compiler.go +++ b/core/asm/compiler.go @@ -22,8 +22,8 @@ import ( "os" "strings" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/core/vm" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/vm" ) // Compiler contains information about the parsed source @@ -57,6 +57,7 @@ func NewCompiler(debug bool) *Compiler { // second stage to push labels and determine the right // position. func (c *Compiler) Feed(ch <-chan token) { + var prev token for i := range ch { switch i.typ { case number: @@ -73,10 +74,14 @@ func (c *Compiler) Feed(ch <-chan token) { c.labels[i.text] = c.pc c.pc++ case label: - c.pc += 5 + c.pc += 4 + if prev.typ == element && isJump(prev.text) { + c.pc++ + } } c.tokens = append(c.tokens, i) + prev = i } if c.debug { fmt.Fprintln(os.Stderr, "found", len(c.labels), "labels") @@ -181,6 +186,8 @@ func (c *Compiler) compileElement(element token) error { pos := big.NewInt(int64(c.labels[rvalue.text])).Bytes() pos = append(make([]byte, 4-len(pos)), pos...) c.pushBin(pos) + case lineEnd: + c.pos-- default: return compileErr(rvalue, rvalue.text, "number, string or label") } @@ -201,8 +208,8 @@ func (c *Compiler) compileElement(element token) error { case stringValue: value = []byte(rvalue.text[1 : len(rvalue.text)-1]) case label: - value = make([]byte, 4) - copy(value, big.NewInt(int64(c.labels[rvalue.text])).Bytes()) + value = big.NewInt(int64(c.labels[rvalue.text])).Bytes() + value = append(make([]byte, 4-len(value)), value...) default: return compileErr(rvalue, rvalue.text, "number, string or label") } diff --git a/core/asm/compiler_test.go b/core/asm/compiler_test.go new file mode 100644 index 000000000000..ce9df436bd40 --- /dev/null +++ b/core/asm/compiler_test.go @@ -0,0 +1,71 @@ +// Copyright 2019 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 asm + +import ( + "testing" +) + +func TestCompiler(t *testing.T) { + tests := []struct { + input, output string + }{ + { + input: ` + GAS + label: + PUSH @label +`, + output: "5a5b6300000001", + }, + { + input: ` + PUSH @label + label: +`, + output: "63000000055b", + }, + { + input: ` + PUSH @label + JUMP + label: +`, + output: "6300000006565b", + }, + { + input: ` + JUMP @label + label: +`, + output: "6300000006565b", + }, + } + for _, test := range tests { + ch := Lex([]byte(test.input), false) + c := NewCompiler(false) + c.Feed(ch) + output, err := c.Compile() + if len(err) != 0 { + t.Errorf("compile error: %v\ninput: %s", err, test.input) + continue + } + if output != test.output { + t.Errorf("incorrect output\ninput: %sgot: %s\nwant: %s\n", test.input, output, test.output) + } + } +} diff --git a/core/asm/lex_test.go b/core/asm/lex_test.go index e6901d4e3769..6b8bd3d740be 100644 --- a/core/asm/lex_test.go +++ b/core/asm/lex_test.go @@ -22,7 +22,7 @@ import ( ) func lexAll(src string) []token { - ch := Lex("test.asm", []byte(src), false) + ch := Lex([]byte(src), false) var tokens []token for i := range ch { @@ -60,6 +60,14 @@ func TestLexer(t *testing.T) { input: "0123abc", tokens: []token{{typ: lineStart}, {typ: number, text: "0123"}, {typ: element, text: "abc"}, {typ: eof}}, }, + { + input: "@foo", + tokens: []token{{typ: lineStart}, {typ: label, text: "foo"}, {typ: eof}}, + }, + { + input: "@label123", + tokens: []token{{typ: lineStart}, {typ: label, text: "label123"}, {typ: eof}}, + }, } for _, test := range tests { diff --git a/core/asm/lexer.go b/core/asm/lexer.go index 91caeb27bc35..9eb8f914ac57 100644 --- a/core/asm/lexer.go +++ b/core/asm/lexer.go @@ -95,7 +95,7 @@ type lexer struct { // lex lexes the program by name with the given source. It returns a // channel on which the tokens are delivered. -func Lex(name string, source []byte, debug bool) <-chan token { +func Lex(source []byte, debug bool) <-chan token { ch := make(chan token) l := &lexer{ input: string(source), @@ -234,7 +234,7 @@ func lexComment(l *lexer) stateFn { // the lex text state function to advance the parsing // process. func lexLabel(l *lexer) stateFn { - l.acceptRun(Alpha + "_") + l.acceptRun(Alpha + "_" + Numbers) l.emit(label) diff --git a/core/bench_test.go b/core/bench_test.go index 09c953098e95..d7a5e11c2f15 100644 --- a/core/bench_test.go +++ b/core/bench_test.go @@ -23,15 +23,15 @@ import ( "os" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/params" ) func BenchmarkInsertChain_empty_memdb(b *testing.B) { @@ -85,7 +85,7 @@ func genValueTx(nbytes int) func(int, *BlockGen) { return func(i int, gen *BlockGen) { toaddr := common.Address{} data := make([]byte, nbytes) - gas, _ := IntrinsicGas(data, false, false) + gas, _ := IntrinsicGas(data, false, false, false) tx, _ := types.SignTx(types.NewTransaction(gen.TxNonce(benchRootAddr), toaddr, big.NewInt(1), gas, nil, data), types.HomesteadSigner{}, benchRootKey) gen.AddTx(tx) } @@ -150,14 +150,14 @@ func benchInsertChain(b *testing.B, disk bool, gen func(int, *BlockGen)) { // Create the database in memory or in a temporary directory. var db ethdb.Database if !disk { - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() } else { dir, err := ioutil.TempDir("", "eth-core-bench") if err != nil { b.Fatalf("cannot create temporary directory: %v", err) } defer os.RemoveAll(dir) - db, err = ethdb.NewLDBDatabase(dir, 128, 128) + db, err = rawdb.NewLevelDBDatabase(dir, 128, 128, "") if err != nil { b.Fatalf("cannot create temporary database: %v", err) } @@ -255,7 +255,7 @@ func benchWriteChain(b *testing.B, full bool, count uint64) { if err != nil { b.Fatalf("cannot create temporary directory: %v", err) } - db, err := ethdb.NewLDBDatabase(dir, 128, 1024) + db, err := rawdb.NewLevelDBDatabase(dir, 128, 1024, "") if err != nil { b.Fatalf("error opening database at %v: %v", dir, err) } @@ -272,7 +272,7 @@ func benchReadChain(b *testing.B, full bool, count uint64) { } defer os.RemoveAll(dir) - db, err := ethdb.NewLDBDatabase(dir, 128, 1024) + db, err := rawdb.NewLevelDBDatabase(dir, 128, 1024, "") if err != nil { b.Fatalf("error opening database at %v: %v", dir, err) } @@ -283,7 +283,7 @@ func benchReadChain(b *testing.B, full bool, count uint64) { b.ResetTimer() for i := 0; i < b.N; i++ { - db, err := ethdb.NewLDBDatabase(dir, 128, 1024) + db, err := rawdb.NewLevelDBDatabase(dir, 128, 1024, "") if err != nil { b.Fatalf("error opening database at %v: %v", dir, err) } @@ -297,7 +297,7 @@ func benchReadChain(b *testing.B, full bool, count uint64) { if full { hash := header.Hash() rawdb.ReadBody(db, hash, n) - rawdb.ReadReceipts(db, hash, n) + rawdb.ReadReceipts(db, hash, n, chain.Config()) } } chain.Stop() diff --git a/core/block_validator.go b/core/block_validator.go index 83d8f42cb307..b36ca56d7f7a 100644 --- a/core/block_validator.go +++ b/core/block_validator.go @@ -19,10 +19,10 @@ package core import ( "fmt" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" ) // BlockValidator is responsible for validating block headers, uncles and @@ -77,7 +77,7 @@ func (v *BlockValidator) ValidateBody(block *types.Block) error { // transition, such as amount of used gas, the receipt roots and the state root // itself. ValidateState returns a database batch if the validation was a success // otherwise nil and an error is returned. -func (v *BlockValidator) ValidateState(block, parent *types.Block, statedb *state.StateDB, receipts types.Receipts, usedGas uint64) error { +func (v *BlockValidator) ValidateState(block *types.Block, statedb *state.StateDB, receipts types.Receipts, usedGas uint64) error { header := block.Header() if block.GasUsed() != usedGas { return fmt.Errorf("invalid gas used (remote: %d local: %d)", block.GasUsed(), usedGas) diff --git a/core/block_validator_test.go b/core/block_validator_test.go index 538397965fd0..06e2ba1a4fd9 100644 --- a/core/block_validator_test.go +++ b/core/block_validator_test.go @@ -21,18 +21,18 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" ) // Tests that simple header verification works, for both good and bad blocks. func TestHeaderVerification(t *testing.T) { // Create a simple chain to verify var ( - testdb = ethdb.NewMemDatabase() + testdb = rawdb.NewMemoryDatabase() gspec = &Genesis{Config: params.TestChainConfig} genesis = gspec.MustCommit(testdb) blocks, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), testdb, 8, nil) @@ -84,7 +84,7 @@ func TestHeaderConcurrentVerification32(t *testing.T) { testHeaderConcurrentVeri func testHeaderConcurrentVerification(t *testing.T, threads int) { // Create a simple chain to verify var ( - testdb = ethdb.NewMemDatabase() + testdb = rawdb.NewMemoryDatabase() gspec = &Genesis{Config: params.TestChainConfig} genesis = gspec.MustCommit(testdb) blocks, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), testdb, 8, nil) @@ -156,7 +156,7 @@ func TestHeaderConcurrentAbortion32(t *testing.T) { testHeaderConcurrentAbortion func testHeaderConcurrentAbortion(t *testing.T, threads int) { // Create a simple chain to verify var ( - testdb = ethdb.NewMemDatabase() + testdb = rawdb.NewMemoryDatabase() gspec = &Genesis{Config: params.TestChainConfig} genesis = gspec.MustCommit(testdb) blocks, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), testdb, 1024, nil) diff --git a/core/blockchain.go b/core/blockchain.go index 0a06d265d2bc..ebab7a3ab591 100644 --- a/core/blockchain.go +++ b/core/blockchain.go @@ -23,58 +23,98 @@ import ( "io" "math/big" mrand "math/rand" + "sort" "sync" "sync/atomic" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/mclock" - "github.com/nebulaai/nbai-node/common/prque" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/trie" - "github.com/hashicorp/golang-lru" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/common/prque" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" + lru "github.com/hashicorp/golang-lru" ) var ( + headBlockGauge = metrics.NewRegisteredGauge("chain/head/block", nil) + headHeaderGauge = metrics.NewRegisteredGauge("chain/head/header", nil) + headFastBlockGauge = metrics.NewRegisteredGauge("chain/head/receipt", nil) + + accountReadTimer = metrics.NewRegisteredTimer("chain/account/reads", nil) + accountHashTimer = metrics.NewRegisteredTimer("chain/account/hashes", nil) + accountUpdateTimer = metrics.NewRegisteredTimer("chain/account/updates", nil) + accountCommitTimer = metrics.NewRegisteredTimer("chain/account/commits", nil) + + storageReadTimer = metrics.NewRegisteredTimer("chain/storage/reads", nil) + storageHashTimer = metrics.NewRegisteredTimer("chain/storage/hashes", nil) + storageUpdateTimer = metrics.NewRegisteredTimer("chain/storage/updates", nil) + storageCommitTimer = metrics.NewRegisteredTimer("chain/storage/commits", nil) + blockInsertTimer = metrics.NewRegisteredTimer("chain/inserts", nil) blockValidationTimer = metrics.NewRegisteredTimer("chain/validation", nil) blockExecutionTimer = metrics.NewRegisteredTimer("chain/execution", nil) blockWriteTimer = metrics.NewRegisteredTimer("chain/write", nil) + blockReorgAddMeter = metrics.NewRegisteredMeter("chain/reorg/drop", nil) + blockReorgDropMeter = metrics.NewRegisteredMeter("chain/reorg/add", nil) - ErrNoGenesis = errors.New("Genesis not found in chain") + blockPrefetchExecuteTimer = metrics.NewRegisteredTimer("chain/prefetch/executes", nil) + blockPrefetchInterruptMeter = metrics.NewRegisteredMeter("chain/prefetch/interrupts", nil) + + errInsertionInterrupted = errors.New("insertion is interrupted") ) const ( bodyCacheLimit = 256 blockCacheLimit = 256 receiptsCacheLimit = 32 + txLookupCacheLimit = 1024 maxFutureBlocks = 256 maxTimeFutureBlocks = 30 badBlockLimit = 10 - triesInMemory = 128 + TriesInMemory = 128 // BlockChainVersion ensures that an incompatible database forces a resync from scratch. - BlockChainVersion uint64 = 3 + // + // Changelog: + // + // - Version 4 + // The following incompatible database changes were added: + // * the `BlockNumber`, `TxHash`, `TxIndex`, `BlockHash` and `Index` fields of log are deleted + // * the `Bloom` field of receipt is deleted + // * the `BlockIndex` and `TxIndex` fields of txlookup are deleted + // - Version 5 + // The following incompatible database changes were added: + // * the `TxHash`, `GasCost`, and `ContractAddress` fields are no longer stored for a receipt + // * the `TxHash`, `GasCost`, and `ContractAddress` fields are computed by looking up the + // receipts' corresponding block + // - Version 6 + // The following incompatible database changes were added: + // * Transaction lookup information stores the corresponding block number instead of block hash + // - Version 7 + // The following incompatible database changes were added: + // * Use freezer as the ancient database to maintain all ancient data + BlockChainVersion uint64 = 7 ) // CacheConfig contains the configuration values for the trie caching/pruning // that's resident in a blockchain. type CacheConfig struct { - Disabled bool // Whether to disable trie write caching (archive node) - TrieCleanLimit int // Memory allowance (MB) to use for caching trie nodes in memory - TrieDirtyLimit int // Memory limit (MB) at which to start flushing dirty trie nodes to disk - TrieTimeLimit time.Duration // Time limit after which to flush the current in-memory trie to disk + TrieCleanLimit int // Memory allowance (MB) to use for caching trie nodes in memory + TrieCleanNoPrefetch bool // Whether to disable heuristic state prefetching for followup blocks + TrieDirtyLimit int // Memory limit (MB) at which to start flushing dirty trie nodes to disk + TrieDirtyDisabled bool // Whether to disable trie write caching and GC altogether (archive node) + TrieTimeLimit time.Duration // Time limit after which to flush the current in-memory trie to disk } // BlockChain represents the canonical chain given a database with a genesis @@ -105,14 +145,12 @@ type BlockChain struct { chainSideFeed event.Feed chainHeadFeed event.Feed logsFeed event.Feed + blockProcFeed event.Feed scope event.SubscriptionScope genesisBlock *types.Block - mu sync.RWMutex // global mutex for locking chain operations chainmu sync.RWMutex // blockchain insertion lock - procmu sync.RWMutex // block processor lock - checkpoint int // checkpoint counts towards the new checkpoint currentBlock atomic.Value // Current head of the block chain currentFastBlock atomic.Value // Current head of the fast-sync chain (may be above the block chain!) @@ -121,6 +159,7 @@ type BlockChain struct { bodyRLPCache *lru.Cache // Cache for the most recent block bodies in RLP encoded format receiptsCache *lru.Cache // Cache for the most recent receipts per block blockCache *lru.Cache // Cache for the most recent entire blocks + txLookupCache *lru.Cache // Cache for the most recent transaction lookup data. futureBlocks *lru.Cache // future blocks are blocks added for later processing quit chan struct{} // blockchain quit channel @@ -129,13 +168,15 @@ type BlockChain struct { procInterrupt int32 // interrupt signaler for block processing wg sync.WaitGroup // chain processing wait group for shutting down - engine consensus.Engine - processor Processor // block processor interface - validator Validator // block and state validator interface - vmConfig vm.Config + engine consensus.Engine + validator Validator // Block and state validator interface + prefetcher Prefetcher // Block state prefetcher interface + processor Processor // Block transaction processor interface + vmConfig vm.Config - badBlocks *lru.Cache // Bad block cache - shouldPreserve func(*types.Block) bool // Function used to determine whether should preserve the given block. + badBlocks *lru.Cache // Bad block cache + shouldPreserve func(*types.Block) bool // Function used to determine whether should preserve the given block. + terminateInsert func(common.Hash, uint64) bool // Testing hook used to terminate ancient receipt chain insertion. } // NewBlockChain returns a fully initialised block chain using information @@ -153,6 +194,7 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par bodyRLPCache, _ := lru.New(bodyCacheLimit) receiptsCache, _ := lru.New(receiptsCacheLimit) blockCache, _ := lru.New(blockCacheLimit) + txLookupCache, _ := lru.New(txLookupCacheLimit) futureBlocks, _ := lru.New(maxFutureBlocks) badBlocks, _ := lru.New(badBlockLimit) @@ -168,13 +210,15 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par bodyRLPCache: bodyRLPCache, receiptsCache: receiptsCache, blockCache: blockCache, + txLookupCache: txLookupCache, futureBlocks: futureBlocks, engine: engine, vmConfig: vmConfig, badBlocks: badBlocks, } - bc.SetValidator(NewBlockValidator(chainConfig, bc, engine)) - bc.SetProcessor(NewStateProcessor(chainConfig, bc, engine)) + bc.validator = NewBlockValidator(chainConfig, bc, engine) + bc.prefetcher = newStatePrefetcher(chainConfig, bc, engine) + bc.processor = NewStateProcessor(chainConfig, bc, engine) var err error bc.hc, err = NewHeaderChain(db, chainConfig, engine, bc.getProcInterrupt) @@ -185,9 +229,57 @@ func NewBlockChain(db ethdb.Database, cacheConfig *CacheConfig, chainConfig *par if bc.genesisBlock == nil { return nil, ErrNoGenesis } + + var nilBlock *types.Block + bc.currentBlock.Store(nilBlock) + bc.currentFastBlock.Store(nilBlock) + + // Initialize the chain with ancient data if it isn't empty. + if bc.empty() { + rawdb.InitDatabaseFromFreezer(bc.db) + } + if err := bc.loadLastState(); err != nil { return nil, err } + // The first thing the node will do is reconstruct the verification data for + // the head block (ethash cache or clique voting snapshot). Might as well do + // it in advance. + bc.engine.VerifyHeader(bc, bc.CurrentHeader(), true) + + if frozen, err := bc.db.Ancients(); err == nil && frozen > 0 { + var ( + needRewind bool + low uint64 + ) + // The head full block may be rolled back to a very low height due to + // blockchain repair. If the head full block is even lower than the ancient + // chain, truncate the ancient store. + fullBlock := bc.CurrentBlock() + if fullBlock != nil && fullBlock != bc.genesisBlock && fullBlock.NumberU64() < frozen-1 { + needRewind = true + low = fullBlock.NumberU64() + } + // In fast sync, it may happen that ancient data has been written to the + // ancient store, but the LastFastBlock has not been updated, truncate the + // extra data here. + fastBlock := bc.CurrentFastBlock() + if fastBlock != nil && fastBlock.NumberU64() < frozen-1 { + needRewind = true + if fastBlock.NumberU64() < low || low == 0 { + low = fastBlock.NumberU64() + } + } + if needRewind { + var hashes []common.Hash + previous := bc.CurrentHeader().Number.Uint64() + for i := low + 1; i <= bc.CurrentHeader().Number.Uint64(); i++ { + hashes = append(hashes, rawdb.ReadCanonicalHash(bc.db, i)) + } + bc.Rollback(hashes) + log.Warn("Truncate ancient chain", "from", previous, "to", low) + } + } // Check the current state of the block hashes and make sure that we do not have any of the bad blocks in our chain for hash := range BadHashes { if header := bc.GetHeaderByHash(hash); header != nil { @@ -215,6 +307,20 @@ func (bc *BlockChain) GetVMConfig() *vm.Config { return &bc.vmConfig } +// empty returns an indicator whether the blockchain is empty. +// Note, it's a special case that we connect a non-empty ancient +// database with an empty node, so that we can plugin the ancient +// into node seamlessly. +func (bc *BlockChain) empty() bool { + genesis := bc.genesisBlock.Hash() + for _, hash := range []common.Hash{rawdb.ReadHeadBlockHash(bc.db), rawdb.ReadHeadHeaderHash(bc.db), rawdb.ReadHeadFastBlockHash(bc.db)} { + if hash != genesis { + return false + } + } + return true +} + // loadLastState loads the last known chain state from the database. This method // assumes that the chain manager mutex is held. func (bc *BlockChain) loadLastState() error { @@ -239,9 +345,11 @@ func (bc *BlockChain) loadLastState() error { if err := bc.repair(¤tBlock); err != nil { return err } + rawdb.WriteHeadBlockHash(bc.db, currentBlock.Hash()) } // Everything seems to be fine, set as the head block bc.currentBlock.Store(currentBlock) + headBlockGauge.Update(int64(currentBlock.NumberU64())) // Restore the last known head header currentHeader := currentBlock.Header() @@ -254,12 +362,14 @@ func (bc *BlockChain) loadLastState() error { // Restore the last known head fast block bc.currentFastBlock.Store(currentBlock) + headFastBlockGauge.Update(int64(currentBlock.NumberU64())) + if head := rawdb.ReadHeadFastBlockHash(bc.db); head != (common.Hash{}) { if block := bc.GetBlockByHash(head); block != nil { bc.currentFastBlock.Store(block) + headFastBlockGauge.Update(int64(block.NumberU64())) } } - // Issue a status log for the user currentFastBlock := bc.CurrentFastBlock() @@ -267,9 +377,9 @@ func (bc *BlockChain) loadLastState() error { blockTd := bc.GetTd(currentBlock.Hash(), currentBlock.NumberU64()) fastTd := bc.GetTd(currentFastBlock.Hash(), currentFastBlock.NumberU64()) - log.Info("Loaded most recent local header", "number", currentHeader.Number, "hash", currentHeader.Hash(), "td", headerTd, "age", common.PrettyAge(time.Unix(currentHeader.Time.Int64(), 0))) - log.Info("Loaded most recent local full block", "number", currentBlock.Number(), "hash", currentBlock.Hash(), "td", blockTd, "age", common.PrettyAge(time.Unix(currentBlock.Time().Int64(), 0))) - log.Info("Loaded most recent local fast block", "number", currentFastBlock.Number(), "hash", currentFastBlock.Hash(), "td", fastTd, "age", common.PrettyAge(time.Unix(currentFastBlock.Time().Int64(), 0))) + log.Info("Loaded most recent local header", "number", currentHeader.Number, "hash", currentHeader.Hash(), "td", headerTd, "age", common.PrettyAge(time.Unix(int64(currentHeader.Time), 0))) + log.Info("Loaded most recent local full block", "number", currentBlock.Number(), "hash", currentBlock.Hash(), "td", blockTd, "age", common.PrettyAge(time.Unix(int64(currentBlock.Time()), 0))) + log.Info("Loaded most recent local fast block", "number", currentFastBlock.Number(), "hash", currentFastBlock.Hash(), "td", fastTd, "age", common.PrettyAge(time.Unix(int64(currentFastBlock.Time()), 0))) return nil } @@ -281,50 +391,71 @@ func (bc *BlockChain) loadLastState() error { func (bc *BlockChain) SetHead(head uint64) error { log.Warn("Rewinding blockchain", "target", head) - bc.mu.Lock() - defer bc.mu.Unlock() + bc.chainmu.Lock() + defer bc.chainmu.Unlock() + + updateFn := func(db ethdb.KeyValueWriter, header *types.Header) { + // Rewind the block chain, ensuring we don't end up with a stateless head block + if currentBlock := bc.CurrentBlock(); currentBlock != nil && header.Number.Uint64() < currentBlock.NumberU64() { + newHeadBlock := bc.GetBlock(header.Hash(), header.Number.Uint64()) + if newHeadBlock == nil { + newHeadBlock = bc.genesisBlock + } else { + if _, err := state.New(newHeadBlock.Root(), bc.stateCache); err != nil { + // Rewound state missing, rolled back to before pivot, reset to genesis + newHeadBlock = bc.genesisBlock + } + } + rawdb.WriteHeadBlockHash(db, newHeadBlock.Hash()) + bc.currentBlock.Store(newHeadBlock) + headBlockGauge.Update(int64(newHeadBlock.NumberU64())) + } + + // Rewind the fast block in a simpleton way to the target head + if currentFastBlock := bc.CurrentFastBlock(); currentFastBlock != nil && header.Number.Uint64() < currentFastBlock.NumberU64() { + newHeadFastBlock := bc.GetBlock(header.Hash(), header.Number.Uint64()) + // If either blocks reached nil, reset to the genesis state + if newHeadFastBlock == nil { + newHeadFastBlock = bc.genesisBlock + } + rawdb.WriteHeadFastBlockHash(db, newHeadFastBlock.Hash()) + bc.currentFastBlock.Store(newHeadFastBlock) + headFastBlockGauge.Update(int64(newHeadFastBlock.NumberU64())) + } + } // Rewind the header chain, deleting all block bodies until then - delFn := func(db rawdb.DatabaseDeleter, hash common.Hash, num uint64) { - rawdb.DeleteBody(db, hash, num) + delFn := func(db ethdb.KeyValueWriter, hash common.Hash, num uint64) { + // Ignore the error here since light client won't hit this path + frozen, _ := bc.db.Ancients() + if num+1 <= frozen { + // Truncate all relative data(header, total difficulty, body, receipt + // and canonical hash) from ancient store. + if err := bc.db.TruncateAncients(num + 1); err != nil { + log.Crit("Failed to truncate ancient data", "number", num, "err", err) + } + + // Remove the hash <-> number mapping from the active store. + rawdb.DeleteHeaderNumber(db, hash) + } else { + // Remove relative body and receipts from the active store. + // The header, total difficulty and canonical hash will be + // removed in the hc.SetHead function. + rawdb.DeleteBody(db, hash, num) + rawdb.DeleteReceipts(db, hash, num) + } + // Todo(rjl493456442) txlookup, bloombits, etc } - bc.hc.SetHead(head, delFn) - currentHeader := bc.hc.CurrentHeader() + bc.hc.SetHead(head, updateFn, delFn) // Clear out any stale content from the caches bc.bodyCache.Purge() bc.bodyRLPCache.Purge() bc.receiptsCache.Purge() bc.blockCache.Purge() + bc.txLookupCache.Purge() bc.futureBlocks.Purge() - // Rewind the block chain, ensuring we don't end up with a stateless head block - if currentBlock := bc.CurrentBlock(); currentBlock != nil && currentHeader.Number.Uint64() < currentBlock.NumberU64() { - bc.currentBlock.Store(bc.GetBlock(currentHeader.Hash(), currentHeader.Number.Uint64())) - } - if currentBlock := bc.CurrentBlock(); currentBlock != nil { - if _, err := state.New(currentBlock.Root(), bc.stateCache); err != nil { - // Rewound state missing, rolled back to before pivot, reset to genesis - bc.currentBlock.Store(bc.genesisBlock) - } - } - // Rewind the fast block in a simpleton way to the target head - if currentFastBlock := bc.CurrentFastBlock(); currentFastBlock != nil && currentHeader.Number.Uint64() < currentFastBlock.NumberU64() { - bc.currentFastBlock.Store(bc.GetBlock(currentHeader.Hash(), currentHeader.Number.Uint64())) - } - // If either blocks reached nil, reset to the genesis state - if currentBlock := bc.CurrentBlock(); currentBlock == nil { - bc.currentBlock.Store(bc.genesisBlock) - } - if currentFastBlock := bc.CurrentFastBlock(); currentFastBlock == nil { - bc.currentFastBlock.Store(bc.genesisBlock) - } - currentBlock := bc.CurrentBlock() - currentFastBlock := bc.CurrentFastBlock() - - rawdb.WriteHeadBlockHash(bc.db, currentBlock.Hash()) - rawdb.WriteHeadFastBlockHash(bc.db, currentFastBlock.Hash()) - return bc.loadLastState() } @@ -336,13 +467,14 @@ func (bc *BlockChain) FastSyncCommitHead(hash common.Hash) error { if block == nil { return fmt.Errorf("non existent block [%x…]", hash[:4]) } - if _, err := trie.NewSecure(block.Root(), bc.stateCache.TrieDB(), 0); err != nil { + if _, err := trie.NewSecure(block.Root(), bc.stateCache.TrieDB()); err != nil { return err } // If all checks out, manually set the head block - bc.mu.Lock() + bc.chainmu.Lock() bc.currentBlock.Store(block) - bc.mu.Unlock() + headBlockGauge.Update(int64(block.NumberU64())) + bc.chainmu.Unlock() log.Info("Committed new head block", "number", block.Number(), "hash", hash) return nil @@ -365,31 +497,13 @@ func (bc *BlockChain) CurrentFastBlock() *types.Block { return bc.currentFastBlock.Load().(*types.Block) } -// SetProcessor sets the processor required for making state modifications. -func (bc *BlockChain) SetProcessor(processor Processor) { - bc.procmu.Lock() - defer bc.procmu.Unlock() - bc.processor = processor -} - -// SetValidator sets the validator which is used to validate incoming blocks. -func (bc *BlockChain) SetValidator(validator Validator) { - bc.procmu.Lock() - defer bc.procmu.Unlock() - bc.validator = validator -} - // Validator returns the current validator. func (bc *BlockChain) Validator() Validator { - bc.procmu.RLock() - defer bc.procmu.RUnlock() return bc.validator } // Processor returns the current processor. func (bc *BlockChain) Processor() Processor { - bc.procmu.RLock() - defer bc.procmu.RUnlock() return bc.processor } @@ -420,8 +534,8 @@ func (bc *BlockChain) ResetWithGenesisBlock(genesis *types.Block) error { if err := bc.SetHead(0); err != nil { return err } - bc.mu.Lock() - defer bc.mu.Unlock() + bc.chainmu.Lock() + defer bc.chainmu.Unlock() // Prepare the genesis block and reinitialise the chain if err := bc.hc.WriteTd(genesis.Hash(), genesis.NumberU64(), genesis.Difficulty()); err != nil { @@ -432,9 +546,12 @@ func (bc *BlockChain) ResetWithGenesisBlock(genesis *types.Block) error { bc.genesisBlock = genesis bc.insert(bc.genesisBlock) bc.currentBlock.Store(bc.genesisBlock) + headBlockGauge.Update(int64(bc.genesisBlock.NumberU64())) + bc.hc.SetGenesis(bc.genesisBlock.Header()) bc.hc.SetCurrentHeader(bc.genesisBlock.Header()) bc.currentFastBlock.Store(bc.genesisBlock) + headFastBlockGauge.Update(int64(bc.genesisBlock.NumberU64())) return nil } @@ -457,7 +574,7 @@ func (bc *BlockChain) repair(head **types.Block) error { if block == nil { return fmt.Errorf("missing block %d [%x]", (*head).NumberU64()-1, (*head).ParentHash()) } - (*head) = block + *head = block } } @@ -468,8 +585,8 @@ func (bc *BlockChain) Export(w io.Writer) error { // ExportN writes a subset of the active chain to the given writer. func (bc *BlockChain) ExportN(w io.Writer, first uint64, last uint64) error { - bc.mu.RLock() - defer bc.mu.RUnlock() + bc.chainmu.RLock() + defer bc.chainmu.RUnlock() if first > last { return fmt.Errorf("export failed: first (%d) is greater than last (%d)", first, last) @@ -490,7 +607,6 @@ func (bc *BlockChain) ExportN(w io.Writer, first uint64, last uint64) error { reported = time.Now() } } - return nil } @@ -509,6 +625,7 @@ func (bc *BlockChain) insert(block *types.Block) { rawdb.WriteHeadBlockHash(bc.db, block.Hash()) bc.currentBlock.Store(block) + headBlockGauge.Update(int64(block.NumberU64())) // If the block is better than our head or is on a different chain, force update heads if updateHeads { @@ -516,6 +633,7 @@ func (bc *BlockChain) insert(block *types.Block) { rawdb.WriteHeadFastBlockHash(bc.db, block.Hash()) bc.currentFastBlock.Store(block) + headFastBlockGauge.Update(int64(block.NumberU64())) } } @@ -645,7 +763,10 @@ func (bc *BlockChain) GetReceiptsByHash(hash common.Hash) types.Receipts { if number == nil { return nil } - receipts := rawdb.ReadReceipts(bc.db, hash, *number) + receipts := rawdb.ReadReceipts(bc.db, hash, *number, bc.chainConfig) + if receipts == nil { + return nil + } bc.receiptsCache.Add(hash, receipts) return receipts } @@ -704,10 +825,10 @@ func (bc *BlockChain) Stop() { // - HEAD: So we don't need to reprocess any blocks in the general case // - HEAD-1: So we don't do large reorgs if our HEAD becomes an uncle // - HEAD-127: So we have a hard limit on the number of blocks reexecuted - if !bc.cacheConfig.Disabled { + if !bc.cacheConfig.TrieDirtyDisabled { triedb := bc.stateCache.TrieDB() - for _, offset := range []uint64{0, 1, triesInMemory - 1} { + for _, offset := range []uint64{0, 1, TriesInMemory - 1} { if number := bc.CurrentBlock().NumberU64(); number > offset { recent := bc.GetBlockByNumber(number - offset) @@ -735,8 +856,9 @@ func (bc *BlockChain) procFutureBlocks() { } } if len(blocks) > 0 { - types.BlockBy(types.Number).Sort(blocks) - + sort.Slice(blocks, func(i, j int) bool { + return blocks[i].NumberU64() < blocks[j].NumberU64() + }) // Insert one by one as chain insertion needs contiguous ancestry between blocks for i := range blocks { bc.InsertChain(blocks[i : i+1]) @@ -756,8 +878,8 @@ const ( // Rollback is designed to remove a chain of links from the database that aren't // certain enough to be valid. func (bc *BlockChain) Rollback(chain []common.Hash) { - bc.mu.Lock() - defer bc.mu.Unlock() + bc.chainmu.Lock() + defer bc.chainmu.Unlock() for i := len(chain) - 1; i >= 0; i-- { hash := chain[i] @@ -768,134 +890,329 @@ func (bc *BlockChain) Rollback(chain []common.Hash) { } if currentFastBlock := bc.CurrentFastBlock(); currentFastBlock.Hash() == hash { newFastBlock := bc.GetBlock(currentFastBlock.ParentHash(), currentFastBlock.NumberU64()-1) - bc.currentFastBlock.Store(newFastBlock) rawdb.WriteHeadFastBlockHash(bc.db, newFastBlock.Hash()) + bc.currentFastBlock.Store(newFastBlock) + headFastBlockGauge.Update(int64(newFastBlock.NumberU64())) } if currentBlock := bc.CurrentBlock(); currentBlock.Hash() == hash { newBlock := bc.GetBlock(currentBlock.ParentHash(), currentBlock.NumberU64()-1) - bc.currentBlock.Store(newBlock) rawdb.WriteHeadBlockHash(bc.db, newBlock.Hash()) + bc.currentBlock.Store(newBlock) + headBlockGauge.Update(int64(newBlock.NumberU64())) } } + // Truncate ancient data which exceeds the current header. + // + // Notably, it can happen that system crashes without truncating the ancient data + // but the head indicator has been updated in the active store. Regarding this issue, + // system will self recovery by truncating the extra data during the setup phase. + if err := bc.truncateAncient(bc.hc.CurrentHeader().Number.Uint64()); err != nil { + log.Crit("Truncate ancient store failed", "err", err) + } } -// SetReceiptsData computes all the non-consensus fields of the receipts -func SetReceiptsData(config *params.ChainConfig, block *types.Block, receipts types.Receipts) error { - signer := types.MakeSigner(config, block.Number()) - - transactions, logIndex := block.Transactions(), uint(0) - if len(transactions) != len(receipts) { - return errors.New("transaction and receipt count mismatch") +// truncateAncient rewinds the blockchain to the specified header and deletes all +// data in the ancient store that exceeds the specified header. +func (bc *BlockChain) truncateAncient(head uint64) error { + frozen, err := bc.db.Ancients() + if err != nil { + return err + } + // Short circuit if there is no data to truncate in ancient store. + if frozen <= head+1 { + return nil } + // Truncate all the data in the freezer beyond the specified head + if err := bc.db.TruncateAncients(head + 1); err != nil { + return err + } + // Clear out any stale content from the caches + bc.hc.headerCache.Purge() + bc.hc.tdCache.Purge() + bc.hc.numberCache.Purge() - for j := 0; j < len(receipts); j++ { - // The transaction hash can be retrieved from the transaction itself - receipts[j].TxHash = transactions[j].Hash() + // Clear out any stale content from the caches + bc.bodyCache.Purge() + bc.bodyRLPCache.Purge() + bc.receiptsCache.Purge() + bc.blockCache.Purge() + bc.txLookupCache.Purge() + bc.futureBlocks.Purge() - // The contract address can be derived from the transaction itself - if transactions[j].To() == nil { - // Deriving the signer is expensive, only do if it's actually needed - from, _ := types.Sender(signer, transactions[j]) - receipts[j].ContractAddress = crypto.CreateAddress(from, transactions[j].Nonce()) - } - // The used gas can be calculated based on previous receipts - if j == 0 { - receipts[j].GasUsed = receipts[j].CumulativeGasUsed - } else { - receipts[j].GasUsed = receipts[j].CumulativeGasUsed - receipts[j-1].CumulativeGasUsed - } - // The derived log fields can simply be set from the block and transaction - for k := 0; k < len(receipts[j].Logs); k++ { - receipts[j].Logs[k].BlockNumber = block.NumberU64() - receipts[j].Logs[k].BlockHash = block.Hash() - receipts[j].Logs[k].TxHash = receipts[j].TxHash - receipts[j].Logs[k].TxIndex = uint(j) - receipts[j].Logs[k].Index = logIndex - logIndex++ - } - } + log.Info("Rewind ancient data", "number", head) return nil } +// numberHash is just a container for a number and a hash, to represent a block +type numberHash struct { + number uint64 + hash common.Hash +} + // InsertReceiptChain attempts to complete an already existing header chain with // transaction and receipt data. -func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain []types.Receipts) (int, error) { +func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain []types.Receipts, ancientLimit uint64) (int, error) { + // We don't require the chainMu here since we want to maximize the + // concurrency of header insertion and receipt insertion. bc.wg.Add(1) defer bc.wg.Done() + var ( + ancientBlocks, liveBlocks types.Blocks + ancientReceipts, liveReceipts []types.Receipts + ) // 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() { - 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]) + for i := 0; i < len(blockChain); i++ { + if i != 0 { + if blockChain[i].NumberU64() != blockChain[i-1].NumberU64()+1 || blockChain[i].ParentHash() != blockChain[i-1].Hash() { + 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]) + } + } + if blockChain[i].NumberU64() <= ancientLimit { + ancientBlocks, ancientReceipts = append(ancientBlocks, blockChain[i]), append(ancientReceipts, receiptChain[i]) + } else { + liveBlocks, liveReceipts = append(liveBlocks, blockChain[i]), append(liveReceipts, receiptChain[i]) } } var ( stats = struct{ processed, ignored int32 }{} start = time.Now() - bytes = 0 - batch = bc.db.NewBatch() + size = 0 ) - 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 + // updateHead updates the head fast sync block if the inserted blocks are better + // and returns a indicator whether the inserted blocks are canonical. + updateHead := func(head *types.Block) bool { + bc.chainmu.Lock() + + // Rewind may have occurred, skip in that case. + if bc.CurrentHeader().Number.Cmp(head.Number()) >= 0 { + currentFastBlock, td := bc.CurrentFastBlock(), bc.GetTd(head.Hash(), head.NumberU64()) + if bc.GetTd(currentFastBlock.Hash(), currentFastBlock.NumberU64()).Cmp(td) < 0 { + rawdb.WriteHeadFastBlockHash(bc.db, head.Hash()) + bc.currentFastBlock.Store(head) + headFastBlockGauge.Update(int64(head.NumberU64())) + bc.chainmu.Unlock() + return true + } } - // 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]) + bc.chainmu.Unlock() + return false + } + // writeAncient writes blockchain and corresponding receipt chain into ancient store. + // + // this function only accepts canonical chain data. All side chain will be reverted + // eventually. + writeAncient := func(blockChain types.Blocks, receiptChain []types.Receipts) (int, error) { + var ( + previous = bc.CurrentFastBlock() + batch = bc.db.NewBatch() + ) + // If any error occurs before updating the head or we are inserting a side chain, + // all the data written this time wll be rolled back. + defer func() { + if previous != nil { + if err := bc.truncateAncient(previous.NumberU64()); err != nil { + log.Crit("Truncate ancient store failed", "err", err) + } + } + }() + var deleted []*numberHash + for i, block := range blockChain { + // Short circuit insertion if shutting down or processing failed + if atomic.LoadInt32(&bc.procInterrupt) == 1 { + return 0, errInsertionInterrupted + } + // Short circuit insertion if it is required(used in testing only) + if bc.terminateInsert != nil && bc.terminateInsert(block.Hash(), block.NumberU64()) { + return i, errors.New("insertion is terminated for testing purpose") + } + // 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]) + } + var ( + start = time.Now() + logged = time.Now() + count int + ) + // Migrate all ancient blocks. This can happen if someone upgrades from Geth + // 1.8.x to 1.9.x mid-fast-sync. Perhaps we can get rid of this path in the + // long term. + for { + // We can ignore the error here since light client won't hit this code path. + frozen, _ := bc.db.Ancients() + if frozen >= block.NumberU64() { + break + } + h := rawdb.ReadCanonicalHash(bc.db, frozen) + b := rawdb.ReadBlock(bc.db, h, frozen) + size += rawdb.WriteAncientBlock(bc.db, b, rawdb.ReadReceipts(bc.db, h, frozen, bc.chainConfig), rawdb.ReadTd(bc.db, h, frozen)) + count += 1 + + // Always keep genesis block in active database. + if b.NumberU64() != 0 { + deleted = append(deleted, &numberHash{b.NumberU64(), b.Hash()}) + } + if time.Since(logged) > 8*time.Second { + log.Info("Migrating ancient blocks", "count", count, "elapsed", common.PrettyDuration(time.Since(start))) + logged = time.Now() + } + // Don't collect too much in-memory, write it out every 100K blocks + if len(deleted) > 100000 { + + // Sync the ancient store explicitly to ensure all data has been flushed to disk. + if err := bc.db.Sync(); err != nil { + return 0, err + } + // Wipe out canonical block data. + for _, nh := range deleted { + rawdb.DeleteBlockWithoutNumber(batch, nh.hash, nh.number) + rawdb.DeleteCanonicalHash(batch, nh.number) + } + if err := batch.Write(); err != nil { + return 0, err + } + batch.Reset() + // Wipe out side chain too. + for _, nh := range deleted { + for _, hash := range rawdb.ReadAllHashes(bc.db, nh.number) { + rawdb.DeleteBlock(batch, hash, nh.number) + } + } + if err := batch.Write(); err != nil { + return 0, err + } + batch.Reset() + deleted = deleted[0:] + } + } + if count > 0 { + log.Info("Migrated ancient blocks", "count", count, "elapsed", common.PrettyDuration(time.Since(start))) + } + // Flush data into ancient database. + size += rawdb.WriteAncientBlock(bc.db, block, receiptChain[i], bc.GetTd(block.Hash(), block.NumberU64())) + rawdb.WriteTxLookupEntries(batch, block) + + stats.processed++ } - // Skip if the entire data is already known - if bc.HasBlock(block.Hash(), block.NumberU64()) { - stats.ignored++ - continue + // Flush all tx-lookup index data. + size += batch.ValueSize() + if err := batch.Write(); err != nil { + return 0, err } - // Compute all the non-consensus fields of the receipts - if err := SetReceiptsData(bc.chainConfig, block, receipts); err != nil { - return i, fmt.Errorf("failed to set receipts data: %v", err) + batch.Reset() + + // Sync the ancient store explicitly to ensure all data has been flushed to disk. + if err := bc.db.Sync(); err != nil { + return 0, err } - // Write all the data out into the database - rawdb.WriteBody(batch, block.Hash(), block.NumberU64(), block.Body()) - rawdb.WriteReceipts(batch, block.Hash(), block.NumberU64(), receipts) - rawdb.WriteTxLookupEntries(batch, block) + if !updateHead(blockChain[len(blockChain)-1]) { + return 0, errors.New("side blocks can't be accepted as the ancient chain data") + } + previous = nil // disable rollback explicitly - stats.processed++ + // Wipe out canonical block data. + for _, nh := range deleted { + rawdb.DeleteBlockWithoutNumber(batch, nh.hash, nh.number) + rawdb.DeleteCanonicalHash(batch, nh.number) + } + for _, block := range blockChain { + // Always keep genesis block in active database. + if block.NumberU64() != 0 { + rawdb.DeleteBlockWithoutNumber(batch, block.Hash(), block.NumberU64()) + rawdb.DeleteCanonicalHash(batch, block.NumberU64()) + } + } + if err := batch.Write(); err != nil { + return 0, err + } + batch.Reset() - if batch.ValueSize() >= ethdb.IdealBatchSize { + // Wipe out side chain too. + for _, nh := range deleted { + for _, hash := range rawdb.ReadAllHashes(bc.db, nh.number) { + rawdb.DeleteBlock(batch, hash, nh.number) + } + } + for _, block := range blockChain { + // Always keep genesis block in active database. + if block.NumberU64() != 0 { + for _, hash := range rawdb.ReadAllHashes(bc.db, block.NumberU64()) { + rawdb.DeleteBlock(batch, hash, block.NumberU64()) + } + } + } + if err := batch.Write(); err != nil { + return 0, err + } + return 0, nil + } + // writeLive writes blockchain and corresponding receipt chain into active store. + writeLive := func(blockChain types.Blocks, receiptChain []types.Receipts) (int, error) { + batch := bc.db.NewBatch() + for i, block := range blockChain { + // Short circuit insertion if shutting down or processing failed + if atomic.LoadInt32(&bc.procInterrupt) == 1 { + return 0, errInsertionInterrupted + } + // 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]) + } + if bc.HasBlock(block.Hash(), block.NumberU64()) { + stats.ignored++ + continue + } + // Write all the data out into the database + rawdb.WriteBody(batch, block.Hash(), block.NumberU64(), block.Body()) + rawdb.WriteReceipts(batch, block.Hash(), block.NumberU64(), receiptChain[i]) + rawdb.WriteTxLookupEntries(batch, block) + + stats.processed++ + if batch.ValueSize() >= ethdb.IdealBatchSize { + if err := batch.Write(); err != nil { + return 0, err + } + size += batch.ValueSize() + batch.Reset() + } + } + if batch.ValueSize() > 0 { + size += batch.ValueSize() if err := batch.Write(); err != nil { return 0, err } - bytes += batch.ValueSize() - batch.Reset() } + updateHead(blockChain[len(blockChain)-1]) + return 0, nil } - if batch.ValueSize() > 0 { - bytes += batch.ValueSize() - if err := batch.Write(); err != nil { - return 0, err + // Write downloaded chain data and corresponding receipt chain data. + if len(ancientBlocks) > 0 { + if n, err := writeAncient(ancientBlocks, ancientReceipts); err != nil { + if err == errInsertionInterrupted { + return 0, nil + } + return n, err } } - - // Update the head fast sync block if better - bc.mu.Lock() - head := blockChain[len(blockChain)-1] - if td := bc.GetTd(head.Hash(), head.NumberU64()); td != nil { // Rewind may have occurred, skip in that case - currentFastBlock := bc.CurrentFastBlock() - if bc.GetTd(currentFastBlock.Hash(), currentFastBlock.NumberU64()).Cmp(td) < 0 { - rawdb.WriteHeadFastBlockHash(bc.db, head.Hash()) - bc.currentFastBlock.Store(head) + if len(liveBlocks) > 0 { + if n, err := writeLive(liveBlocks, liveReceipts); err != nil { + if err == errInsertionInterrupted { + return 0, nil + } + return n, err } } - bc.mu.Unlock() + head := blockChain[len(blockChain)-1] context := []interface{}{ "count", stats.processed, "elapsed", common.PrettyDuration(time.Since(start)), - "number", head.Number(), "hash", head.Hash(), "age", common.PrettyAge(time.Unix(head.Time().Int64(), 0)), - "size", common.StorageSize(bytes), + "number", head.Number(), "hash", head.Hash(), "age", common.PrettyAge(time.Unix(int64(head.Time()), 0)), + "size", common.StorageSize(size), } if stats.ignored > 0 { context = append(context, []interface{}{"ignored", stats.ignored}...) @@ -907,10 +1224,10 @@ func (bc *BlockChain) InsertReceiptChain(blockChain types.Blocks, receiptChain [ var lastWrite uint64 -// WriteBlockWithoutState writes only the block and its metadata to the database, +// writeBlockWithoutState writes only the block and its metadata to the database, // but does not write any state. This is used to construct competing side forks // up to the point where they exceed the canonical total difficulty. -func (bc *BlockChain) WriteBlockWithoutState(block *types.Block, td *big.Int) (err error) { +func (bc *BlockChain) writeBlockWithoutState(block *types.Block, td *big.Int) (err error) { bc.wg.Add(1) defer bc.wg.Done() @@ -922,8 +1239,37 @@ func (bc *BlockChain) WriteBlockWithoutState(block *types.Block, td *big.Int) (e return nil } +// writeKnownBlock updates the head block flag with a known block +// and introduces chain reorg if necessary. +func (bc *BlockChain) writeKnownBlock(block *types.Block) error { + bc.wg.Add(1) + defer bc.wg.Done() + + current := bc.CurrentBlock() + if block.ParentHash() != current.Hash() { + if err := bc.reorg(current, block); err != nil { + return err + } + } + // Write the positional metadata for transaction/receipt lookups. + // Preimages here is empty, ignore it. + rawdb.WriteTxLookupEntries(bc.db, block) + + bc.insert(block) + return nil +} + // WriteBlockWithState writes the block and all associated state to the database. -func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types.Receipt, state *state.StateDB) (status WriteStatus, err error) { +func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types.Receipt, logs []*types.Log, state *state.StateDB, emitHeadEvent bool) (status WriteStatus, err error) { + bc.chainmu.Lock() + defer bc.chainmu.Unlock() + + return bc.writeBlockWithState(block, receipts, logs, state, emitHeadEvent) +} + +// writeBlockWithState writes the block and all associated state to the database, +// but is expects the chain mutex to be held. +func (bc *BlockChain) writeBlockWithState(block *types.Block, receipts []*types.Receipt, logs []*types.Log, state *state.StateDB, emitHeadEvent bool) (status WriteStatus, err error) { bc.wg.Add(1) defer bc.wg.Done() @@ -933,9 +1279,6 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. return NonStatTy, consensus.ErrUnknownAncestor } // Make sure no inconsistent state is leaked during insertion - bc.mu.Lock() - defer bc.mu.Unlock() - currentBlock := bc.CurrentBlock() localTd := bc.GetTd(currentBlock.Hash(), currentBlock.NumberU64()) externTd := new(big.Int).Add(block.Difficulty(), ptd) @@ -953,7 +1296,7 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. triedb := bc.stateCache.TrieDB() // If we're running an archive node, always flush - if bc.cacheConfig.Disabled { + if bc.cacheConfig.TrieDirtyDisabled { if err := triedb.Commit(root, false); err != nil { return NonStatTy, err } @@ -962,7 +1305,7 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. triedb.Reference(root, common.Hash{}) // metadata reference to keep trie alive bc.triegc.Push(root, -int64(block.NumberU64())) - if current := block.NumberU64(); current > triesInMemory { + if current := block.NumberU64(); current > TriesInMemory { // If we exceeded our memory allowance, flush matured singleton nodes to disk var ( nodes, imgs = triedb.Size() @@ -972,20 +1315,26 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. triedb.Cap(limit - ethdb.IdealBatchSize) } // Find the next state trie we need to commit - header := bc.GetHeaderByNumber(current - triesInMemory) - chosen := header.Number.Uint64() + chosen := current - TriesInMemory // If we exceeded out time allowance, flush an entire trie to disk if bc.gcproc > bc.cacheConfig.TrieTimeLimit { - // If we're exceeding limits but haven't reached a large enough memory gap, - // warn the user that the system is becoming unstable. - if chosen < lastWrite+triesInMemory && bc.gcproc >= 2*bc.cacheConfig.TrieTimeLimit { - log.Info("State in memory for too long, committing", "time", bc.gcproc, "allowance", bc.cacheConfig.TrieTimeLimit, "optimum", float64(chosen-lastWrite)/triesInMemory) + // If the header is missing (canonical chain behind), we're reorging a low + // diff sidechain. Suspend committing until this operation is completed. + header := bc.GetHeaderByNumber(chosen) + if header == nil { + log.Warn("Reorg in progress, trie commit postponed", "number", chosen) + } else { + // If we're exceeding limits but haven't reached a large enough memory gap, + // warn the user that the system is becoming unstable. + if chosen < lastWrite+TriesInMemory && bc.gcproc >= 2*bc.cacheConfig.TrieTimeLimit { + log.Info("State in memory for too long, committing", "time", bc.gcproc, "allowance", bc.cacheConfig.TrieTimeLimit, "optimum", float64(chosen-lastWrite)/TriesInMemory) + } + // Flush an entire trie and restart the counters + triedb.Commit(header.Root, true) + lastWrite = chosen + bc.gcproc = 0 } - // Flush an entire trie and restart the counters - triedb.Commit(header.Root, true) - lastWrite = chosen - bc.gcproc = 0 } // Garbage collect anything below our required write retention for !bc.triegc.Empty() { @@ -1045,6 +1394,23 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. bc.insert(block) } bc.futureBlocks.Remove(block.Hash()) + + if status == CanonStatTy { + bc.chainFeed.Send(ChainEvent{Block: block, Hash: block.Hash(), Logs: logs}) + if len(logs) > 0 { + bc.logsFeed.Send(logs) + } + // In theory we should fire a ChainHeadEvent when we inject + // a canonical block, but sometimes we can insert a batch of + // canonicial blocks. Avoid firing too much ChainHeadEvents, + // we will fire an accumulated ChainHeadEvent and disable fire + // event here. + if emitHeadEvent { + bc.chainHeadFeed.Send(ChainHeadEvent{Block: block}) + } + } else { + bc.chainSideFeed.Send(ChainSideEvent{Block: block}) + } return status, nil } @@ -1052,8 +1418,8 @@ func (bc *BlockChain) WriteBlockWithState(block *types.Block, receipts []*types. // accepted for future processing, and returns an error if the block is too far // ahead and was not added. func (bc *BlockChain) addFutureBlock(block *types.Block) error { - max := big.NewInt(time.Now().Unix() + maxTimeFutureBlocks) - if block.Time().Cmp(max) > 0 { + max := uint64(time.Now().Unix() + maxTimeFutureBlocks) + if block.Time() > max { return fmt.Errorf("future block timestamp %v > allowed %v", block.Time(), max) } bc.futureBlocks.Add(block.Hash(), block) @@ -1071,29 +1437,38 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { if len(chain) == 0 { return 0, nil } + + bc.blockProcFeed.Send(true) + defer bc.blockProcFeed.Send(false) + + // Remove already known canon-blocks + var ( + block, prev *types.Block + ) // 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() { + block = chain[i] + prev = chain[i-1] + if block.NumberU64() != prev.NumberU64()+1 || block.ParentHash() != prev.Hash() { // Chain broke ancestry, log a message (programming error) and skip insertion - 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()) + log.Error("Non contiguous block insert", "number", block.Number(), "hash", block.Hash(), + "parent", block.ParentHash(), "prevnumber", prev.Number(), "prevhash", prev.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(), - chain[i-1].Hash().Bytes()[:4], i, chain[i].NumberU64(), chain[i].Hash().Bytes()[:4], chain[i].ParentHash().Bytes()[:4]) + return 0, fmt.Errorf("non contiguous insert: item %d is #%d [%x…], item %d is #%d [%x…] (parent [%x…])", i-1, prev.NumberU64(), + prev.Hash().Bytes()[:4], i, block.NumberU64(), block.Hash().Bytes()[:4], block.ParentHash().Bytes()[:4]) } } // Pre-checks passed, start the full block imports bc.wg.Add(1) bc.chainmu.Lock() - n, events, logs, err := bc.insertChain(chain, true) + n, err := bc.insertChain(chain, true) bc.chainmu.Unlock() bc.wg.Done() - bc.PostChainEvents(events, logs) return n, err } -// insertChain is the internal implementation of insertChain, which assumes that +// insertChain is the internal implementation of InsertChain, which assumes that // 1) chains are contiguous, and 2) The chain mutex is held. // // This method is split out so that import batches that require re-injecting @@ -1101,23 +1476,24 @@ func (bc *BlockChain) InsertChain(chain types.Blocks) (int, error) { // racey behaviour. If a sidechain import is in progress, and the historic state // is imported, but then new canon-head is added before the actual sidechain // completes, then the historic state could be pruned again -func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, []interface{}, []*types.Log, error) { - // If the chain is terminating, don't even bother starting u +func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, error) { + // If the chain is terminating, don't even bother starting up if atomic.LoadInt32(&bc.procInterrupt) == 1 { - return 0, nil, nil, nil + return 0, nil } // Start a parallel signature recovery (signer will fluke on fork transition, minimal perf loss) senderCacher.recoverFromBlocks(types.MakeSigner(bc.chainConfig, chain[0].Number()), chain) - // A queued approach to delivering events. This is generally - // faster than direct delivery and requires much less mutex - // acquiring. var ( - stats = insertStats{startTime: mclock.Now()} - events = make([]interface{}, 0, len(chain)) - lastCanon *types.Block - coalescedLogs []*types.Log + stats = insertStats{startTime: mclock.Now()} + lastCanon *types.Block ) + // Fire a single chain head event if we've progressed the chain + defer func() { + if lastCanon != nil && bc.CurrentBlock().Hash() == lastCanon.Hash() { + bc.chainHeadFeed.Send(ChainHeadEvent{lastCanon}) + } + }() // Start the parallel header verifier headers := make([]*types.Header, len(chain)) seals := make([]bool, len(chain)) @@ -1130,19 +1506,63 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, [] defer close(abort) // Peek the error for the first block to decide the directing import logic - it := newInsertIterator(chain, results, bc.Validator()) + it := newInsertIterator(chain, results, bc.validator) block, err := it.next() + + // Left-trim all the known blocks + if err == ErrKnownBlock { + // First block (and state) is known + // 1. We did a roll-back, and should now do a re-import + // 2. The block is stored as a sidechain, and is lying about it's stateroot, and passes a stateroot + // from the canonical chain, which has not been verified. + // Skip all known blocks that are behind us + var ( + current = bc.CurrentBlock() + localTd = bc.GetTd(current.Hash(), current.NumberU64()) + externTd = bc.GetTd(block.ParentHash(), block.NumberU64()-1) // The first block can't be nil + ) + for block != nil && err == ErrKnownBlock { + externTd = new(big.Int).Add(externTd, block.Difficulty()) + if localTd.Cmp(externTd) < 0 { + break + } + log.Debug("Ignoring already known block", "number", block.Number(), "hash", block.Hash()) + stats.ignored++ + + block, err = it.next() + } + // The remaining blocks are still known blocks, the only scenario here is: + // During the fast sync, the pivot point is already submitted but rollback + // happens. Then node resets the head full block to a lower height via `rollback` + // and leaves a few known blocks in the database. + // + // When node runs a fast sync again, it can re-import a batch of known blocks via + // `insertChain` while a part of them have higher total difficulty than current + // head full block(new pivot point). + for block != nil && err == ErrKnownBlock { + log.Debug("Writing previously known block", "number", block.Number(), "hash", block.Hash()) + if err := bc.writeKnownBlock(block); err != nil { + return it.index, err + } + lastCanon = block + + block, err = it.next() + } + // Falls through to the block import + } switch { // First block is pruned, insert as sidechain and reorg only if TD grows enough case err == consensus.ErrPrunedAncestor: - return bc.insertSidechain(it) + log.Debug("Pruned ancestor, inserting as sidechain", "number", block.Number(), "hash", block.Hash()) + return bc.insertSideChain(block, it) // First block is future, shove it (and all children) to the future queue (unknown ancestor) case err == consensus.ErrFutureBlock || (err == consensus.ErrUnknownAncestor && bc.futureBlocks.Contains(it.first().ParentHash())): for block != nil && (it.index == 0 || err == consensus.ErrUnknownAncestor) { + log.Debug("Future block, postponing import", "number", block.Number(), "hash", block.Hash()) if err := bc.addFutureBlock(block); err != nil { - return it.index, events, coalescedLogs, err + return it.index, err } block, err = it.next() } @@ -1150,30 +1570,17 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, [] stats.ignored += it.remaining() // If there are any still remaining, mark as ignored - return it.index, events, coalescedLogs, err - - // First block (and state) is known - // 1. We did a roll-back, and should now do a re-import - // 2. The block is stored as a sidechain, and is lying about it's stateroot, and passes a stateroot - // from the canonical chain, which has not been verified. - case err == ErrKnownBlock: - // Skip all known blocks that behind us - current := bc.CurrentBlock().NumberU64() - - for block != nil && err == ErrKnownBlock && current >= block.NumberU64() { - stats.ignored++ - block, err = it.next() - } - // Falls through to the block import + return it.index, err // Some other error occurred, abort case err != nil: + bc.futureBlocks.Remove(block.Hash()) stats.ignored += len(it.chain) bc.reportBlock(block, nil, err) - return it.index, events, coalescedLogs, err + return it.index, err } // No validation errors for the first block (or chain prefix skipped) - for ; block != nil && err == nil; block, err = it.next() { + for ; block != nil && err == nil || err == ErrKnownBlock; block, err = it.next() { // If the chain is terminating, stop processing blocks if atomic.LoadInt32(&bc.procInterrupt) == 1 { log.Debug("Premature abort during blocks processing") @@ -1182,45 +1589,111 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, [] // If the header is a banned one, straight out abort if BadHashes[block.Hash()] { bc.reportBlock(block, nil, ErrBlacklistedHash) - return it.index, events, coalescedLogs, ErrBlacklistedHash + return it.index, ErrBlacklistedHash + } + // If the block is known (in the middle of the chain), it's a special case for + // Clique blocks where they can share state among each other, so importing an + // older block might complete the state of the subsequent one. In this case, + // just skip the block (we already validated it once fully (and crashed), since + // its header and body was already in the database). + if err == ErrKnownBlock { + logger := log.Debug + if bc.chainConfig.Clique == nil { + logger = log.Warn + } + logger("Inserted known block", "number", block.Number(), "hash", block.Hash(), + "uncles", len(block.Uncles()), "txs", len(block.Transactions()), "gas", block.GasUsed(), + "root", block.Root()) + + if err := bc.writeKnownBlock(block); err != nil { + return it.index, err + } + stats.processed++ + + // We can assume that logs are empty here, since the only way for consecutive + // Clique blocks to have the same state is if there are no transactions. + lastCanon = block + continue } // Retrieve the parent block and it's state to execute on top start := time.Now() parent := it.previous() if parent == nil { - parent = bc.GetBlock(block.ParentHash(), block.NumberU64()-1) + parent = bc.GetHeader(block.ParentHash(), block.NumberU64()-1) } - state, err := state.New(parent.Root(), bc.stateCache) + statedb, err := state.New(parent.Root, bc.stateCache) if err != nil { - return it.index, events, coalescedLogs, err + return it.index, err } - // Process block using the parent state as reference point. - t0 := time.Now() - receipts, logs, usedGas, err := bc.processor.Process(block, state, bc.vmConfig) - t1 := time.Now() + // If we have a followup block, run that against the current state to pre-cache + // transactions and probabilistically some of the account/storage trie nodes. + var followupInterrupt uint32 + + if !bc.cacheConfig.TrieCleanNoPrefetch { + if followup, err := it.peek(); followup != nil && err == nil { + go func(start time.Time) { + throwaway, _ := state.New(parent.Root, bc.stateCache) + bc.prefetcher.Prefetch(followup, throwaway, bc.vmConfig, &followupInterrupt) + + blockPrefetchExecuteTimer.Update(time.Since(start)) + if atomic.LoadUint32(&followupInterrupt) == 1 { + blockPrefetchInterruptMeter.Mark(1) + } + }(time.Now()) + } + } + // Process block using the parent state as reference point + substart := time.Now() + receipts, logs, usedGas, err := bc.processor.Process(block, statedb, bc.vmConfig) if err != nil { bc.reportBlock(block, receipts, err) - return it.index, events, coalescedLogs, err + atomic.StoreUint32(&followupInterrupt, 1) + return it.index, err } + // Update the metrics touched during block processing + accountReadTimer.Update(statedb.AccountReads) // Account reads are complete, we can mark them + storageReadTimer.Update(statedb.StorageReads) // Storage reads are complete, we can mark them + accountUpdateTimer.Update(statedb.AccountUpdates) // Account updates are complete, we can mark them + storageUpdateTimer.Update(statedb.StorageUpdates) // Storage updates are complete, we can mark them + + triehash := statedb.AccountHashes + statedb.StorageHashes // Save to not double count in validation + trieproc := statedb.AccountReads + statedb.AccountUpdates + trieproc += statedb.StorageReads + statedb.StorageUpdates + + blockExecutionTimer.Update(time.Since(substart) - trieproc - triehash) + // Validate the state using the default validator - if err := bc.Validator().ValidateState(block, parent, state, receipts, usedGas); err != nil { + substart = time.Now() + if err := bc.validator.ValidateState(block, statedb, receipts, usedGas); err != nil { bc.reportBlock(block, receipts, err) - return it.index, events, coalescedLogs, err + atomic.StoreUint32(&followupInterrupt, 1) + return it.index, err } - t2 := time.Now() proctime := time.Since(start) + // Update the metrics touched during block validation + accountHashTimer.Update(statedb.AccountHashes) // Account hashes are complete, we can mark them + storageHashTimer.Update(statedb.StorageHashes) // Storage hashes are complete, we can mark them + + blockValidationTimer.Update(time.Since(substart) - (statedb.AccountHashes + statedb.StorageHashes - triehash)) + // Write the block to the chain and get the status. - status, err := bc.WriteBlockWithState(block, receipts, state) - t3 := time.Now() + substart = time.Now() + status, err := bc.writeBlockWithState(block, receipts, logs, statedb, false) if err != nil { - return it.index, events, coalescedLogs, err + atomic.StoreUint32(&followupInterrupt, 1) + return it.index, err } + atomic.StoreUint32(&followupInterrupt, 1) + + // Update the metrics touched during block commit + accountCommitTimer.Update(statedb.AccountCommits) // Account commits are complete, we can mark them + storageCommitTimer.Update(statedb.StorageCommits) // Storage commits are complete, we can mark them + + blockWriteTimer.Update(time.Since(substart) - statedb.AccountCommits - statedb.StorageCommits) blockInsertTimer.UpdateSince(start) - blockExecutionTimer.Update(t1.Sub(t0)) - blockValidationTimer.Update(t2.Sub(t1)) - blockWriteTimer.Update(t3.Sub(t2)) + switch status { case CanonStatTy: log.Debug("Inserted new block", "number", block.Number(), "hash", block.Hash(), @@ -1228,8 +1701,6 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, [] "elapsed", common.PrettyDuration(time.Since(start)), "root", block.Root()) - coalescedLogs = append(coalescedLogs, logs...) - events = append(events, ChainEvent{block, block.Hash(), logs}) lastCanon = block // Only count canonical blocks for GC processing time @@ -1240,58 +1711,70 @@ func (bc *BlockChain) insertChain(chain types.Blocks, verifySeals bool) (int, [] "diff", block.Difficulty(), "elapsed", common.PrettyDuration(time.Since(start)), "txs", len(block.Transactions()), "gas", block.GasUsed(), "uncles", len(block.Uncles()), "root", block.Root()) - events = append(events, ChainSideEvent{block}) + + default: + // This in theory is impossible, but lets be nice to our future selves and leave + // a log, instead of trying to track down blocks imports that don't emit logs. + log.Warn("Inserted block with unknown status", "number", block.Number(), "hash", block.Hash(), + "diff", block.Difficulty(), "elapsed", common.PrettyDuration(time.Since(start)), + "txs", len(block.Transactions()), "gas", block.GasUsed(), "uncles", len(block.Uncles()), + "root", block.Root()) } - blockInsertTimer.UpdateSince(start) stats.processed++ stats.usedGas += usedGas - cache, _ := bc.stateCache.TrieDB().Size() - stats.report(chain, it.index, cache) + dirty, _ := bc.stateCache.TrieDB().Size() + stats.report(chain, it.index, dirty) } // Any blocks remaining here? The only ones we care about are the future ones if block != nil && err == consensus.ErrFutureBlock { if err := bc.addFutureBlock(block); err != nil { - return it.index, events, coalescedLogs, err + return it.index, err } block, err = it.next() for ; block != nil && err == consensus.ErrUnknownAncestor; block, err = it.next() { if err := bc.addFutureBlock(block); err != nil { - return it.index, events, coalescedLogs, err + return it.index, err } stats.queued++ } } stats.ignored += it.remaining() - // Append a single chain head event if we've progressed the chain - if lastCanon != nil && bc.CurrentBlock().Hash() == lastCanon.Hash() { - events = append(events, ChainHeadEvent{lastCanon}) - } - return it.index, events, coalescedLogs, err + return it.index, err } -// insertSidechain is called when an import batch hits upon a pruned ancestor +// insertSideChain is called when an import batch hits upon a pruned ancestor // error, which happens when a sidechain with a sufficiently old fork-block is // found. // // The method writes all (header-and-body-valid) blocks to disk, then tries to // switch over to the new chain if the TD exceeded the current chain. -func (bc *BlockChain) insertSidechain(it *insertIterator) (int, []interface{}, []*types.Log, error) { +func (bc *BlockChain) insertSideChain(block *types.Block, it *insertIterator) (int, error) { var ( externTd *big.Int - current = bc.CurrentBlock().NumberU64() + current = bc.CurrentBlock() ) // The first sidechain block error is already verified to be ErrPrunedAncestor. // Since we don't import them here, we expect ErrUnknownAncestor for the remaining // ones. Any other errors means that the block is invalid, and should not be written // to disk. - block, err := it.current(), consensus.ErrPrunedAncestor + err := consensus.ErrPrunedAncestor for ; block != nil && (err == consensus.ErrPrunedAncestor); block, err = it.next() { // Check the canonical state root for that number - if number := block.NumberU64(); current >= number { - if canonical := bc.GetBlockByNumber(number); canonical != nil && canonical.Root() == block.Root() { + if number := block.NumberU64(); current.NumberU64() >= number { + canonical := bc.GetBlockByNumber(number) + if canonical != nil && canonical.Hash() == block.Hash() { + // Not a sidechain block, this is a re-import of a canon block which has it's state pruned + + // Collect the TD of the block. Since we know it's a canon one, + // we can get it directly, and not (like further below) use + // the parent and then add the block on top + externTd = bc.GetTd(block.Hash(), block.NumberU64()) + continue + } + if canonical != nil && canonical.Root() == block.Root() { // This is most likely a shadow-state attack. When a fork is imported into the // database, and it eventually reaches a block height which is not pruned, we // just found that the state already exist! This means that the sidechain block @@ -1304,7 +1787,7 @@ func (bc *BlockChain) insertSidechain(it *insertIterator) (int, []interface{}, [ // If someone legitimately side-mines blocks, they would still be imported as usual. However, // we cannot risk writing unverified blocks to disk when they obviously target the pruning // mechanism. - return it.index, nil, nil, errors.New("sidechain ghost-state attack") + return it.index, errors.New("sidechain ghost-state attack") } } if externTd == nil { @@ -1314,10 +1797,10 @@ func (bc *BlockChain) insertSidechain(it *insertIterator) (int, []interface{}, [ if !bc.HasBlock(block.Hash(), block.NumberU64()) { start := time.Now() - if err := bc.WriteBlockWithoutState(block, externTd); err != nil { - return it.index, nil, nil, err + if err := bc.writeBlockWithoutState(block, externTd); err != nil { + return it.index, err } - log.Debug("Inserted sidechain block", "number", block.Number(), "hash", block.Hash(), + log.Debug("Injected sidechain block", "number", block.Number(), "hash", block.Hash(), "diff", block.Difficulty(), "elapsed", common.PrettyDuration(time.Since(start)), "txs", len(block.Transactions()), "gas", block.GasUsed(), "uncles", len(block.Uncles()), "root", block.Root()) @@ -1329,17 +1812,17 @@ func (bc *BlockChain) insertSidechain(it *insertIterator) (int, []interface{}, [ // // If the externTd was larger than our local TD, we now need to reimport the previous // blocks to regenerate the required state - localTd := bc.GetTd(bc.CurrentBlock().Hash(), current) + localTd := bc.GetTd(current.Hash(), current.NumberU64()) if localTd.Cmp(externTd) > 0 { - log.Info("Sidechain written to disk", "start", it.first().NumberU64(), "end", it.previous().NumberU64(), "sidetd", externTd, "localtd", localTd) - return it.index, nil, nil, err + log.Info("Sidechain written to disk", "start", it.first().NumberU64(), "end", it.previous().Number, "sidetd", externTd, "localtd", localTd) + return it.index, err } // Gather all the sidechain hashes (full blocks may be memory heavy) var ( hashes []common.Hash numbers []uint64 ) - parent := bc.GetHeader(it.previous().Hash(), it.previous().NumberU64()) + parent := it.previous() for parent != nil && !bc.HasState(parent.Root) { hashes = append(hashes, parent.Hash()) numbers = append(numbers, parent.Number.Uint64()) @@ -1347,7 +1830,7 @@ func (bc *BlockChain) insertSidechain(it *insertIterator) (int, []interface{}, [ parent = bc.GetHeader(parent.ParentHash, parent.Number.Uint64()-1) } if parent == nil { - return it.index, nil, nil, errors.New("missing parent") + return it.index, errors.New("missing parent") } // Import all the pruned blocks to make the state available var ( @@ -1366,15 +1849,15 @@ func (bc *BlockChain) insertSidechain(it *insertIterator) (int, []interface{}, [ // memory here. if len(blocks) >= 2048 || memory > 64*1024*1024 { log.Info("Importing heavy sidechain segment", "blocks", len(blocks), "start", blocks[0].NumberU64(), "end", block.NumberU64()) - if _, _, _, err := bc.insertChain(blocks, false); err != nil { - return 0, nil, nil, err + if _, err := bc.insertChain(blocks, false); err != nil { + return 0, err } blocks, memory = blocks[:0], 0 // If the chain is terminating, stop processing blocks if atomic.LoadInt32(&bc.procInterrupt) == 1 { log.Debug("Premature abort during blocks processing") - return 0, nil, nil, nil + return 0, nil } } } @@ -1382,144 +1865,173 @@ func (bc *BlockChain) insertSidechain(it *insertIterator) (int, []interface{}, [ log.Info("Importing sidechain segment", "start", blocks[0].NumberU64(), "end", blocks[len(blocks)-1].NumberU64()) return bc.insertChain(blocks, false) } - return 0, nil, nil, nil + return 0, nil } -// reorgs takes two blocks, an old chain and a new chain and will reconstruct the blocks and inserts them -// to be part of the new canonical chain and accumulates potential missing transactions and post an -// event about them +// reorg takes two blocks, an old chain and a new chain and will reconstruct the +// blocks and inserts them to be part of the new canonical chain and accumulates +// potential missing transactions and post an event about them. func (bc *BlockChain) reorg(oldBlock, newBlock *types.Block) error { var ( newChain types.Blocks oldChain types.Blocks commonBlock *types.Block - deletedTxs types.Transactions - deletedLogs []*types.Log - // collectLogs collects the logs that were generated during the - // processing of the block that corresponds with the given hash. - // These logs are later announced as deleted. - collectLogs = func(hash common.Hash) { - // Coalesce logs and set 'Removed'. + + deletedTxs types.Transactions + addedTxs types.Transactions + + deletedLogs [][]*types.Log + rebirthLogs [][]*types.Log + + // collectLogs collects the logs that were generated or removed during + // the processing of the block that corresponds with the given hash. + // These logs are later announced as deleted or reborn + collectLogs = func(hash common.Hash, removed bool) { number := bc.hc.GetBlockNumber(hash) if number == nil { return } - receipts := rawdb.ReadReceipts(bc.db, hash, *number) + receipts := rawdb.ReadReceipts(bc.db, hash, *number, bc.chainConfig) + + var logs []*types.Log for _, receipt := range receipts { for _, log := range receipt.Logs { - del := *log - del.Removed = true - deletedLogs = append(deletedLogs, &del) + l := *log + if removed { + l.Removed = true + } else { + } + logs = append(logs, &l) + } + } + if len(logs) > 0 { + if removed { + deletedLogs = append(deletedLogs, logs) + } else { + rebirthLogs = append(rebirthLogs, logs) } } } + // mergeLogs returns a merged log slice with specified sort order. + mergeLogs = func(logs [][]*types.Log, reverse bool) []*types.Log { + var ret []*types.Log + if reverse { + for i := len(logs) - 1; i >= 0; i-- { + ret = append(ret, logs[i]...) + } + } else { + for i := 0; i < len(logs); i++ { + ret = append(ret, logs[i]...) + } + } + return ret + } ) - - // first reduce whoever is higher bound + // Reduce the longer chain to the same number as the shorter one if oldBlock.NumberU64() > newBlock.NumberU64() { - // reduce old chain + // Old chain is longer, gather all transactions and logs as deleted ones for ; oldBlock != nil && oldBlock.NumberU64() != newBlock.NumberU64(); oldBlock = bc.GetBlock(oldBlock.ParentHash(), oldBlock.NumberU64()-1) { oldChain = append(oldChain, oldBlock) deletedTxs = append(deletedTxs, oldBlock.Transactions()...) - - collectLogs(oldBlock.Hash()) + collectLogs(oldBlock.Hash(), true) } } else { - // reduce new chain and append new chain blocks for inserting later on + // New chain is longer, stash all blocks away for subsequent insertion for ; newBlock != nil && newBlock.NumberU64() != oldBlock.NumberU64(); newBlock = bc.GetBlock(newBlock.ParentHash(), newBlock.NumberU64()-1) { newChain = append(newChain, newBlock) } } if oldBlock == nil { - return fmt.Errorf("Invalid old chain") + return fmt.Errorf("invalid old chain") } if newBlock == nil { - return fmt.Errorf("Invalid new chain") + return fmt.Errorf("invalid new chain") } - + // Both sides of the reorg are at the same number, reduce both until the common + // ancestor is found for { + // If the common ancestor was found, bail out if oldBlock.Hash() == newBlock.Hash() { commonBlock = oldBlock break } - + // Remove an old block as well as stash away a new block oldChain = append(oldChain, oldBlock) - newChain = append(newChain, newBlock) deletedTxs = append(deletedTxs, oldBlock.Transactions()...) - collectLogs(oldBlock.Hash()) + collectLogs(oldBlock.Hash(), true) + + newChain = append(newChain, newBlock) - oldBlock, newBlock = bc.GetBlock(oldBlock.ParentHash(), oldBlock.NumberU64()-1), bc.GetBlock(newBlock.ParentHash(), newBlock.NumberU64()-1) + // Step back with both chains + oldBlock = bc.GetBlock(oldBlock.ParentHash(), oldBlock.NumberU64()-1) if oldBlock == nil { - return fmt.Errorf("Invalid old chain") + return fmt.Errorf("invalid old chain") } + newBlock = bc.GetBlock(newBlock.ParentHash(), newBlock.NumberU64()-1) if newBlock == nil { - return fmt.Errorf("Invalid new chain") + return fmt.Errorf("invalid new chain") } } // Ensure the user sees large reorgs if len(oldChain) > 0 && len(newChain) > 0 { - logFn := log.Debug + logFn := log.Info + msg := "Chain reorg detected" if len(oldChain) > 63 { + msg = "Large chain reorg detected" logFn = log.Warn } - logFn("Chain split detected", "number", commonBlock.Number(), "hash", commonBlock.Hash(), + logFn(msg, "number", commonBlock.Number(), "hash", commonBlock.Hash(), "drop", len(oldChain), "dropfrom", oldChain[0].Hash(), "add", len(newChain), "addfrom", newChain[0].Hash()) + blockReorgAddMeter.Mark(int64(len(newChain))) + blockReorgDropMeter.Mark(int64(len(oldChain))) } else { log.Error("Impossible reorg, please file an issue", "oldnum", oldBlock.Number(), "oldhash", oldBlock.Hash(), "newnum", newBlock.Number(), "newhash", newBlock.Hash()) } - // Insert the new chain, taking care of the proper incremental order - var addedTxs types.Transactions - for i := len(newChain) - 1; i >= 0; i-- { - // insert the block in the canonical way, re-writing history + // Insert the new chain(except the head block(reverse order)), + // taking care of the proper incremental order. + for i := len(newChain) - 1; i >= 1; i-- { + // Insert the block in the canonical way, re-writing history bc.insert(newChain[i]) - // write lookup entries for hash based transaction/receipt searches + + // Collect reborn logs due to chain reorg + collectLogs(newChain[i].Hash(), false) + + // Write lookup entries for hash based transaction/receipt searches rawdb.WriteTxLookupEntries(bc.db, newChain[i]) addedTxs = append(addedTxs, newChain[i].Transactions()...) } - // calculate the difference between deleted and added transactions - diff := types.TxDifference(deletedTxs, addedTxs) - // When transactions get deleted from the database that means the - // receipts that were created in the fork must also be deleted + // When transactions get deleted from the database, the receipts that were + // created in the fork must also be deleted batch := bc.db.NewBatch() - for _, tx := range diff { + for _, tx := range types.TxDifference(deletedTxs, addedTxs) { rawdb.DeleteTxLookupEntry(batch, tx.Hash()) } + // Delete any canonical number assignments above the new head + number := bc.CurrentBlock().NumberU64() + for i := number + 1; ; i++ { + hash := rawdb.ReadCanonicalHash(bc.db, i) + if hash == (common.Hash{}) { + break + } + rawdb.DeleteCanonicalHash(batch, i) + } batch.Write() - + // If any logs need to be fired, do it now. In theory we could avoid creating + // this goroutine if there are no events to fire, but realistcally that only + // ever happens if we're reorging empty blocks, which will only happen on idle + // networks where performance is not an issue either way. if len(deletedLogs) > 0 { - go bc.rmLogsFeed.Send(RemovedLogsEvent{deletedLogs}) + bc.rmLogsFeed.Send(RemovedLogsEvent{mergeLogs(deletedLogs, true)}) } - if len(oldChain) > 0 { - go func() { - for _, block := range oldChain { - bc.chainSideFeed.Send(ChainSideEvent{Block: block}) - } - }() - } - - return nil -} - -// 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 - if logs != nil { - bc.logsFeed.Send(logs) + if len(rebirthLogs) > 0 { + bc.logsFeed.Send(mergeLogs(rebirthLogs, false)) } - for _, event := range events { - switch ev := event.(type) { - case ChainEvent: - bc.chainFeed.Send(ev) - - case ChainHeadEvent: - bc.chainHeadFeed.Send(ev) - - case ChainSideEvent: - bc.chainSideFeed.Send(ev) + if len(oldChain) > 0 { + for i := len(oldChain) - 1; i >= 0; i-- { + bc.chainSideFeed.Send(ChainSideEvent{Block: oldChain[i]}) } } + return nil } func (bc *BlockChain) update() { @@ -1597,36 +2109,12 @@ func (bc *BlockChain) InsertHeaderChain(chain []*types.Header, checkFreq int) (i defer bc.wg.Done() whFunc := func(header *types.Header) error { - bc.mu.Lock() - defer bc.mu.Unlock() - _, err := bc.hc.WriteHeader(header) return err } - return bc.hc.InsertHeaderChain(chain, whFunc, start) } -// writeHeader writes a header into the local chain, given that its parent is -// already known. If the total difficulty of the newly inserted header becomes -// greater than the current known TD, the canonical chain is re-routed. -// -// Note: This method is not concurrent-safe with inserting blocks simultaneously -// into the chain, as side effects caused by reorganisations cannot be emulated -// without the real blocks. Hence, writing headers directly should only be done -// in two scenarios: pure-header mode of operation (light clients), or properly -// separated header/block phases (non-archive clients). -func (bc *BlockChain) writeHeader(header *types.Header) error { - bc.wg.Add(1) - defer bc.wg.Done() - - bc.mu.Lock() - defer bc.mu.Unlock() - - _, err := bc.hc.WriteHeader(header) - return err -} - // CurrentHeader retrieves the current head header of the canonical chain. The // header is retrieved from the HeaderChain's internal cache. func (bc *BlockChain) CurrentHeader() *types.Header { @@ -1663,6 +2151,11 @@ func (bc *BlockChain) HasHeader(hash common.Hash, number uint64) bool { return bc.hc.HasHeader(hash, number) } +// GetCanonicalHash returns the canonical hash for a given block number +func (bc *BlockChain) GetCanonicalHash(number uint64) common.Hash { + return bc.hc.GetCanonicalHash(number) +} + // GetBlockHashesFromHash retrieves a number of block hashes starting at a given // hash, fetching towards the genesis block. func (bc *BlockChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash { @@ -1675,9 +2168,6 @@ func (bc *BlockChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []com // // Note: ancestor == 0 returns the same block, 1 returns its parent and so on. func (bc *BlockChain) GetAncestor(hash common.Hash, number, ancestor uint64, maxNonCanonical *uint64) (common.Hash, uint64) { - bc.chainmu.Lock() - defer bc.chainmu.Unlock() - return bc.hc.GetAncestor(hash, number, ancestor, maxNonCanonical) } @@ -1687,7 +2177,23 @@ func (bc *BlockChain) GetHeaderByNumber(number uint64) *types.Header { return bc.hc.GetHeaderByNumber(number) } -// Config retrieves the blockchain's chain configuration. +// GetTransactionLookup retrieves the lookup associate with the given transaction +// hash from the cache or database. +func (bc *BlockChain) GetTransactionLookup(hash common.Hash) *rawdb.LegacyTxLookupEntry { + // Short circuit if the txlookup already in the cache, retrieve otherwise + if lookup, exist := bc.txLookupCache.Get(hash); exist { + return lookup.(*rawdb.LegacyTxLookupEntry) + } + tx, blockHash, blockNumber, txIndex := rawdb.ReadTransaction(bc.db, hash) + if tx == nil { + return nil + } + lookup := &rawdb.LegacyTxLookupEntry{BlockHash: blockHash, BlockIndex: blockNumber, Index: txIndex} + bc.txLookupCache.Add(hash, lookup) + return lookup +} + +// Config retrieves the chain's fork configuration. func (bc *BlockChain) Config() *params.ChainConfig { return bc.chainConfig } // Engine retrieves the blockchain's consensus engine. @@ -1717,3 +2223,9 @@ func (bc *BlockChain) SubscribeChainSideEvent(ch chan<- ChainSideEvent) event.Su func (bc *BlockChain) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { return bc.scope.Track(bc.logsFeed.Subscribe(ch)) } + +// SubscribeBlockProcessingEvent registers a subscription of bool where true means +// block processing has started while false means it has stopped. +func (bc *BlockChain) SubscribeBlockProcessingEvent(ch chan<- bool) event.Subscription { + return bc.scope.Track(bc.blockProcFeed.Subscribe(ch)) +} diff --git a/core/blockchain_insert.go b/core/blockchain_insert.go index 1e22805c964b..5685b0a4bdd9 100644 --- a/core/blockchain_insert.go +++ b/core/blockchain_insert.go @@ -19,10 +19,10 @@ package core import ( "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/mclock" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" ) // insertStats tracks and reports on block insertion. @@ -39,7 +39,7 @@ const statsReportLimit = 8 * time.Second // report prints statistics if some number of blocks have been processed // or more than a few seconds have passed since the last message. -func (st *insertStats) report(chain []*types.Block, index int, cache common.StorageSize) { +func (st *insertStats) report(chain []*types.Block, index int, dirty common.StorageSize) { // Fetch the timings for the batch var ( now = mclock.Now() @@ -60,10 +60,10 @@ func (st *insertStats) report(chain []*types.Block, index int, cache common.Stor "elapsed", common.PrettyDuration(elapsed), "mgasps", float64(st.usedGas) * 1000 / float64(elapsed), "number", end.Number(), "hash", end.Hash(), } - if timestamp := time.Unix(end.Time().Int64(), 0); time.Since(timestamp) > time.Minute { + if timestamp := time.Unix(int64(end.Time()), 0); time.Since(timestamp) > time.Minute { context = append(context, []interface{}{"age", common.PrettyAge(timestamp)}...) } - context = append(context, []interface{}{"cache", cache}...) + context = append(context, []interface{}{"dirty", dirty}...) if st.queued > 0 { context = append(context, []interface{}{"queued", st.queued}...) @@ -80,10 +80,13 @@ func (st *insertStats) report(chain []*types.Block, index int, cache common.Stor // insertIterator is a helper to assist during chain import. type insertIterator struct { - chain types.Blocks - results <-chan error - index int - validator Validator + chain types.Blocks // Chain of blocks being iterated over + + results <-chan error // Verification result sink from the consensus engine + errors []error // Header verification errors for the blocks + + index int // Current offset of the iterator + validator Validator // Validator to run if verification succeeds } // newInsertIterator creates a new iterator based on the given blocks, which are @@ -92,6 +95,7 @@ func newInsertIterator(chain types.Blocks, results <-chan error, validator Valid return &insertIterator{ chain: chain, results: results, + errors: make([]error, 0, len(chain)), index: -1, validator: validator, } @@ -100,31 +104,50 @@ func newInsertIterator(chain types.Blocks, results <-chan error, validator Valid // next returns the next block in the iterator, along with any potential validation // error for that block. When the end is reached, it will return (nil, nil). func (it *insertIterator) next() (*types.Block, error) { + // If we reached the end of the chain, abort if it.index+1 >= len(it.chain) { it.index = len(it.chain) return nil, nil } + // Advance the iterator and wait for verification result if not yet done it.index++ - if err := <-it.results; err != nil { - return it.chain[it.index], err + if len(it.errors) <= it.index { + it.errors = append(it.errors, <-it.results) + } + if it.errors[it.index] != nil { + return it.chain[it.index], it.errors[it.index] } + // Block header valid, run body validation and return return it.chain[it.index], it.validator.ValidateBody(it.chain[it.index]) } -// current returns the current block that's being processed. -func (it *insertIterator) current() *types.Block { - if it.index < 0 || it.index+1 >= len(it.chain) { - return nil +// peek returns the next block in the iterator, along with any potential validation +// error for that block, but does **not** advance the iterator. +// +// Both header and body validation errors (nil too) is cached into the iterator +// to avoid duplicating work on the following next() call. +func (it *insertIterator) peek() (*types.Block, error) { + // If we reached the end of the chain, abort + if it.index+1 >= len(it.chain) { + return nil, nil + } + // Wait for verification result if not yet done + if len(it.errors) <= it.index+1 { + it.errors = append(it.errors, <-it.results) + } + if it.errors[it.index+1] != nil { + return it.chain[it.index+1], it.errors[it.index+1] } - return it.chain[it.index] + // Block header valid, ignore body validation since we don't have a parent anyway + return it.chain[it.index+1], nil } -// previous returns the previous block was being processed, or nil -func (it *insertIterator) previous() *types.Block { +// previous returns the previous header that was being processed, or nil. +func (it *insertIterator) previous() *types.Header { if it.index < 1 { return nil } - return it.chain[it.index-1] + return it.chain[it.index-1].Header() } // first returns the first block in the it. diff --git a/core/blockchain_test.go b/core/blockchain_test.go index d095b86904b8..de23ead21006 100644 --- a/core/blockchain_test.go +++ b/core/blockchain_test.go @@ -18,22 +18,25 @@ package core import ( "fmt" + "io/ioutil" "math/big" "math/rand" + "os" + "reflect" "sync" "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/params" ) // So we can deterministically seed different blockchains @@ -47,7 +50,7 @@ var ( // header only chain. func newCanonical(engine consensus.Engine, n int, full bool) (ethdb.Database, *BlockChain, error) { var ( - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() genesis = new(Genesis).MustCommit(db) ) @@ -126,13 +129,6 @@ func testFork(t *testing.T, blockchain *BlockChain, i, n int, full bool, compara comparator(tdPre, tdPost) } -func printChain(bc *BlockChain) { - for i := bc.CurrentBlock().Number().Uint64(); i > 0; i-- { - b := bc.GetBlockByNumber(uint64(i)) - fmt.Printf("\t%x %v\n", b.Hash(), b.Difficulty()) - } -} - // testBlockChainImport tries to process a chain of blocks, writing them into // the database if successful. func testBlockChainImport(chain types.Blocks, blockchain *BlockChain) error { @@ -152,21 +148,21 @@ func testBlockChainImport(chain types.Blocks, blockchain *BlockChain) error { if err != nil { return err } - receipts, _, usedGas, err := blockchain.Processor().Process(block, statedb, vm.Config{}) + receipts, _, usedGas, err := blockchain.processor.Process(block, statedb, vm.Config{}) if err != nil { blockchain.reportBlock(block, receipts, err) return err } - err = blockchain.validator.ValidateState(block, blockchain.GetBlockByHash(block.ParentHash()), statedb, receipts, usedGas) + err = blockchain.validator.ValidateState(block, statedb, receipts, usedGas) if err != nil { blockchain.reportBlock(block, receipts, err) return err } - blockchain.mu.Lock() + blockchain.chainmu.Lock() rawdb.WriteTd(blockchain.db, block.Hash(), block.NumberU64(), new(big.Int).Add(block.Difficulty(), blockchain.GetTdByHash(block.ParentHash()))) rawdb.WriteBlock(blockchain.db, block) statedb.Commit(false) - blockchain.mu.Unlock() + blockchain.chainmu.Unlock() } return nil } @@ -180,23 +176,14 @@ func testHeaderChainImport(chain []*types.Header, blockchain *BlockChain) error return err } // Manually insert the header into the database, but don't reorganise (allows subsequent testing) - blockchain.mu.Lock() + blockchain.chainmu.Lock() rawdb.WriteTd(blockchain.db, header.Hash(), header.Number.Uint64(), new(big.Int).Add(header.Difficulty, blockchain.GetTdByHash(header.ParentHash))) rawdb.WriteHeader(blockchain.db, header) - blockchain.mu.Unlock() + blockchain.chainmu.Unlock() } return nil } -func insertChain(done chan bool, blockchain *BlockChain, chain types.Blocks, t *testing.T) { - _, err := blockchain.InsertChain(chain) - if err != nil { - fmt.Println(err) - t.FailNow() - } - done <- true -} - func TestLastBlock(t *testing.T) { _, blockchain, err := newCanonical(ethash.NewFaker(), 0, true) if err != nil { @@ -603,7 +590,7 @@ func testInsertNonceError(t *testing.T, full bool) { func TestFastVsFullChains(t *testing.T) { // Configure and generate a sample block chain var ( - gendb = ethdb.NewMemDatabase() + gendb = rawdb.NewMemoryDatabase() key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") address = crypto.PubkeyToAddress(key.PublicKey) funds = big.NewInt(1000000000) @@ -633,7 +620,7 @@ func TestFastVsFullChains(t *testing.T) { } }) // Import the chain as an archive node for the comparison baseline - archiveDb := ethdb.NewMemDatabase() + archiveDb := rawdb.NewMemoryDatabase() gspec.MustCommit(archiveDb) archive, _ := NewBlockChain(archiveDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) defer archive.Stop() @@ -642,7 +629,7 @@ func TestFastVsFullChains(t *testing.T) { t.Fatalf("failed to process block %d: %v", n, err) } // Fast import the chain as a non-archive node to test - fastDb := ethdb.NewMemDatabase() + fastDb := rawdb.NewMemoryDatabase() gspec.MustCommit(fastDb) fast, _ := NewBlockChain(fastDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) defer fast.Stop() @@ -654,7 +641,27 @@ func TestFastVsFullChains(t *testing.T) { if n, err := fast.InsertHeaderChain(headers, 1); err != nil { t.Fatalf("failed to insert header %d: %v", n, err) } - if n, err := fast.InsertReceiptChain(blocks, receipts); err != nil { + if n, err := fast.InsertReceiptChain(blocks, receipts, 0); err != nil { + t.Fatalf("failed to insert receipt %d: %v", n, err) + } + // Freezer style fast import the chain. + frdir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("failed to create temp freezer dir: %v", err) + } + defer os.Remove(frdir) + ancientDb, err := rawdb.NewDatabaseWithFreezer(rawdb.NewMemoryDatabase(), frdir, "") + if err != nil { + t.Fatalf("failed to create temp freezer db: %v", err) + } + gspec.MustCommit(ancientDb) + ancient, _ := NewBlockChain(ancientDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) + defer ancient.Stop() + + if n, err := ancient.InsertHeaderChain(headers, 1); err != nil { + t.Fatalf("failed to insert header %d: %v", n, err) + } + if n, err := ancient.InsertReceiptChain(blocks, receipts, uint64(len(blocks)/2)); err != nil { t.Fatalf("failed to insert receipt %d: %v", n, err) } // Iterate over all chain data components, and cross reference @@ -662,26 +669,35 @@ func TestFastVsFullChains(t *testing.T) { num, hash := blocks[i].NumberU64(), blocks[i].Hash() if ftd, atd := fast.GetTdByHash(hash), archive.GetTdByHash(hash); ftd.Cmp(atd) != 0 { - t.Errorf("block #%d [%x]: td mismatch: have %v, want %v", num, hash, ftd, atd) + t.Errorf("block #%d [%x]: td mismatch: fastdb %v, archivedb %v", num, hash, ftd, atd) + } + if antd, artd := ancient.GetTdByHash(hash), archive.GetTdByHash(hash); antd.Cmp(artd) != 0 { + t.Errorf("block #%d [%x]: td mismatch: ancientdb %v, archivedb %v", num, hash, antd, artd) } if fheader, aheader := fast.GetHeaderByHash(hash), archive.GetHeaderByHash(hash); fheader.Hash() != aheader.Hash() { - t.Errorf("block #%d [%x]: header mismatch: have %v, want %v", num, hash, fheader, aheader) + t.Errorf("block #%d [%x]: header mismatch: fastdb %v, archivedb %v", num, hash, fheader, aheader) } - if fblock, ablock := fast.GetBlockByHash(hash), archive.GetBlockByHash(hash); fblock.Hash() != ablock.Hash() { - t.Errorf("block #%d [%x]: block mismatch: have %v, want %v", num, hash, fblock, ablock) - } else if types.DeriveSha(fblock.Transactions()) != types.DeriveSha(ablock.Transactions()) { - t.Errorf("block #%d [%x]: transactions mismatch: have %v, want %v", num, hash, fblock.Transactions(), ablock.Transactions()) - } else if types.CalcUncleHash(fblock.Uncles()) != types.CalcUncleHash(ablock.Uncles()) { - t.Errorf("block #%d [%x]: uncles mismatch: have %v, want %v", num, hash, fblock.Uncles(), ablock.Uncles()) + if anheader, arheader := ancient.GetHeaderByHash(hash), archive.GetHeaderByHash(hash); anheader.Hash() != arheader.Hash() { + t.Errorf("block #%d [%x]: header mismatch: ancientdb %v, archivedb %v", num, hash, anheader, arheader) } - if freceipts, areceipts := rawdb.ReadReceipts(fastDb, hash, *rawdb.ReadHeaderNumber(fastDb, hash)), rawdb.ReadReceipts(archiveDb, hash, *rawdb.ReadHeaderNumber(archiveDb, hash)); types.DeriveSha(freceipts) != types.DeriveSha(areceipts) { - t.Errorf("block #%d [%x]: receipts mismatch: have %v, want %v", num, hash, freceipts, areceipts) + if fblock, arblock, anblock := fast.GetBlockByHash(hash), archive.GetBlockByHash(hash), ancient.GetBlockByHash(hash); fblock.Hash() != arblock.Hash() || anblock.Hash() != arblock.Hash() { + t.Errorf("block #%d [%x]: block mismatch: fastdb %v, ancientdb %v, archivedb %v", num, hash, fblock, anblock, arblock) + } else if types.DeriveSha(fblock.Transactions()) != types.DeriveSha(arblock.Transactions()) || types.DeriveSha(anblock.Transactions()) != types.DeriveSha(arblock.Transactions()) { + t.Errorf("block #%d [%x]: transactions mismatch: fastdb %v, ancientdb %v, archivedb %v", num, hash, fblock.Transactions(), anblock.Transactions(), arblock.Transactions()) + } else if types.CalcUncleHash(fblock.Uncles()) != types.CalcUncleHash(arblock.Uncles()) || types.CalcUncleHash(anblock.Uncles()) != types.CalcUncleHash(arblock.Uncles()) { + t.Errorf("block #%d [%x]: uncles mismatch: fastdb %v, ancientdb %v, archivedb %v", num, hash, fblock.Uncles(), anblock, arblock.Uncles()) + } + if freceipts, anreceipts, areceipts := rawdb.ReadReceipts(fastDb, hash, *rawdb.ReadHeaderNumber(fastDb, hash), fast.Config()), rawdb.ReadReceipts(ancientDb, hash, *rawdb.ReadHeaderNumber(ancientDb, hash), fast.Config()), rawdb.ReadReceipts(archiveDb, hash, *rawdb.ReadHeaderNumber(archiveDb, hash), fast.Config()); types.DeriveSha(freceipts) != types.DeriveSha(areceipts) { + t.Errorf("block #%d [%x]: receipts mismatch: fastdb %v, ancientdb %v, archivedb %v", num, hash, freceipts, anreceipts, areceipts) } } // Check that the canonical chains are the same between the databases for i := 0; i < len(blocks)+1; i++ { if fhash, ahash := rawdb.ReadCanonicalHash(fastDb, uint64(i)), rawdb.ReadCanonicalHash(archiveDb, uint64(i)); fhash != ahash { - t.Errorf("block #%d: canonical hash mismatch: have %v, want %v", i, fhash, ahash) + t.Errorf("block #%d: canonical hash mismatch: fastdb %v, archivedb %v", i, fhash, ahash) + } + if anhash, arhash := rawdb.ReadCanonicalHash(ancientDb, uint64(i)), rawdb.ReadCanonicalHash(archiveDb, uint64(i)); anhash != arhash { + t.Errorf("block #%d: canonical hash mismatch: ancientdb %v, archivedb %v", i, anhash, arhash) } } } @@ -691,7 +707,7 @@ func TestFastVsFullChains(t *testing.T) { func TestLightVsFastVsFullChainHeads(t *testing.T) { // Configure and generate a sample block chain var ( - gendb = ethdb.NewMemDatabase() + gendb = rawdb.NewMemoryDatabase() key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") address = crypto.PubkeyToAddress(key.PublicKey) funds = big.NewInt(1000000000) @@ -701,6 +717,20 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { height := uint64(1024) blocks, receipts := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), gendb, int(height), nil) + // makeDb creates a db instance for testing. + makeDb := func() (ethdb.Database, func()) { + dir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("failed to create temp freezer dir: %v", err) + } + defer os.Remove(dir) + db, err := rawdb.NewDatabaseWithFreezer(rawdb.NewMemoryDatabase(), dir, "") + if err != nil { + t.Fatalf("failed to create temp freezer db: %v", err) + } + gspec.MustCommit(db) + return db, func() { os.RemoveAll(dir) } + } // Configure a subchain to roll back remove := []common.Hash{} for _, block := range blocks[height/2:] { @@ -719,9 +749,8 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { } } // Import the chain as an archive node and ensure all pointers are updated - archiveDb := ethdb.NewMemDatabase() - gspec.MustCommit(archiveDb) - + archiveDb, delfn := makeDb() + defer delfn() archive, _ := NewBlockChain(archiveDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) if n, err := archive.InsertChain(blocks); err != nil { t.Fatalf("failed to process block %d: %v", n, err) @@ -733,8 +762,8 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { assert(t, "archive", archive, height/2, height/2, height/2) // Import the chain as a non-archive node and ensure all pointers are updated - fastDb := ethdb.NewMemDatabase() - gspec.MustCommit(fastDb) + fastDb, delfn := makeDb() + defer delfn() fast, _ := NewBlockChain(fastDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) defer fast.Stop() @@ -745,17 +774,35 @@ func TestLightVsFastVsFullChainHeads(t *testing.T) { if n, err := fast.InsertHeaderChain(headers, 1); err != nil { t.Fatalf("failed to insert header %d: %v", n, err) } - if n, err := fast.InsertReceiptChain(blocks, receipts); err != nil { + if n, err := fast.InsertReceiptChain(blocks, receipts, 0); err != nil { t.Fatalf("failed to insert receipt %d: %v", n, err) } assert(t, "fast", fast, height, height, 0) fast.Rollback(remove) assert(t, "fast", fast, height/2, height/2, 0) - // Import the chain as a light node and ensure all pointers are updated - lightDb := ethdb.NewMemDatabase() - gspec.MustCommit(lightDb) + // Import the chain as a ancient-first node and ensure all pointers are updated + ancientDb, delfn := makeDb() + defer delfn() + ancient, _ := NewBlockChain(ancientDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) + defer ancient.Stop() + if n, err := ancient.InsertHeaderChain(headers, 1); err != nil { + t.Fatalf("failed to insert header %d: %v", n, err) + } + if n, err := ancient.InsertReceiptChain(blocks, receipts, uint64(3*len(blocks)/4)); err != nil { + t.Fatalf("failed to insert receipt %d: %v", n, err) + } + assert(t, "ancient", ancient, height, height, 0) + ancient.Rollback(remove) + assert(t, "ancient", ancient, height/2, height/2, 0) + if frozen, err := ancientDb.Ancients(); err != nil || frozen != height/2+1 { + t.Fatalf("failed to truncate ancient store, want %v, have %v", height/2+1, frozen) + } + + // Import the chain as a light node and ensure all pointers are updated + lightDb, delfn := makeDb() + defer delfn() light, _ := NewBlockChain(lightDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) if n, err := light.InsertHeaderChain(headers, 1); err != nil { t.Fatalf("failed to insert header %d: %v", n, err) @@ -776,7 +823,7 @@ func TestChainTxReorgs(t *testing.T) { addr1 = crypto.PubkeyToAddress(key1.PublicKey) addr2 = crypto.PubkeyToAddress(key2.PublicKey) addr3 = crypto.PubkeyToAddress(key3.PublicKey) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() gspec = &Genesis{ Config: params.TestChainConfig, GasLimit: 3141592, @@ -859,7 +906,7 @@ func TestChainTxReorgs(t *testing.T) { if txn, _, _, _ := rawdb.ReadTransaction(db, tx.Hash()); txn != nil { t.Errorf("drop %d: tx %v found while shouldn't have been", i, txn) } - if rcpt, _, _, _ := rawdb.ReadReceipt(db, tx.Hash()); rcpt != nil { + if rcpt, _, _, _ := rawdb.ReadReceipt(db, tx.Hash(), blockchain.Config()); rcpt != nil { t.Errorf("drop %d: receipt %v found while shouldn't have been", i, rcpt) } } @@ -868,7 +915,7 @@ func TestChainTxReorgs(t *testing.T) { if txn, _, _, _ := rawdb.ReadTransaction(db, tx.Hash()); txn == nil { t.Errorf("add %d: expected tx to be found", i) } - if rcpt, _, _, _ := rawdb.ReadReceipt(db, tx.Hash()); rcpt == nil { + if rcpt, _, _, _ := rawdb.ReadReceipt(db, tx.Hash(), blockchain.Config()); rcpt == nil { t.Errorf("add %d: expected receipt to be found", i) } } @@ -877,18 +924,17 @@ func TestChainTxReorgs(t *testing.T) { if txn, _, _, _ := rawdb.ReadTransaction(db, tx.Hash()); txn == nil { t.Errorf("share %d: expected tx to be found", i) } - if rcpt, _, _, _ := rawdb.ReadReceipt(db, tx.Hash()); rcpt == nil { + if rcpt, _, _, _ := rawdb.ReadReceipt(db, tx.Hash(), blockchain.Config()); rcpt == nil { t.Errorf("share %d: expected receipt to be found", i) } } } func TestLogReorgs(t *testing.T) { - var ( key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") addr1 = crypto.PubkeyToAddress(key1.PublicKey) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() // this code generates a log code = common.Hex2Bytes("60606040525b7f24ec1d3ff24c2f6ff210738839dbc339cd45a5294d85c79361016243157aae7b60405180905060405180910390a15b600a8060416000396000f360606040526008565b00") gspec = &Genesis{Config: params.TestChainConfig, Alloc: GenesisAlloc{addr1: {Balance: big.NewInt(10000000000000)}}} @@ -915,24 +961,233 @@ func TestLogReorgs(t *testing.T) { } chain, _ = GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 3, func(i int, gen *BlockGen) {}) + done := make(chan struct{}) + go func() { + ev := <-rmLogsCh + if len(ev.Logs) == 0 { + t.Error("expected logs") + } + close(done) + }() if _, err := blockchain.InsertChain(chain); err != nil { t.Fatalf("failed to insert forked chain: %v", err) } - timeout := time.NewTimer(1 * time.Second) select { - case ev := <-rmLogsCh: - if len(ev.Logs) == 0 { - t.Error("expected logs") - } + case <-done: case <-timeout.C: t.Fatal("Timeout. There is no RemovedLogsEvent has been sent.") } } +func TestLogRebirth(t *testing.T) { + var ( + key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + addr1 = crypto.PubkeyToAddress(key1.PublicKey) + db = rawdb.NewMemoryDatabase() + + // this code generates a log + code = common.Hex2Bytes("60606040525b7f24ec1d3ff24c2f6ff210738839dbc339cd45a5294d85c79361016243157aae7b60405180905060405180910390a15b600a8060416000396000f360606040526008565b00") + gspec = &Genesis{Config: params.TestChainConfig, Alloc: GenesisAlloc{addr1: {Balance: big.NewInt(10000000000000)}}} + genesis = gspec.MustCommit(db) + signer = types.NewEIP155Signer(gspec.Config.ChainID) + newLogCh = make(chan bool) + removeLogCh = make(chan bool) + ) + + // validateLogEvent checks whether the received logs number is equal with expected. + validateLogEvent := func(sink interface{}, result chan bool, expect int) { + chanval := reflect.ValueOf(sink) + chantyp := chanval.Type() + if chantyp.Kind() != reflect.Chan || chantyp.ChanDir()&reflect.RecvDir == 0 { + t.Fatalf("invalid channel, given type %v", chantyp) + } + cnt := 0 + var recv []reflect.Value + timeout := time.After(1 * time.Second) + cases := []reflect.SelectCase{{Chan: chanval, Dir: reflect.SelectRecv}, {Chan: reflect.ValueOf(timeout), Dir: reflect.SelectRecv}} + for { + chose, v, _ := reflect.Select(cases) + if chose == 1 { + // Not enough event received + result <- false + return + } + cnt += 1 + recv = append(recv, v) + if cnt == expect { + break + } + } + done := time.After(50 * time.Millisecond) + cases = cases[:1] + cases = append(cases, reflect.SelectCase{Chan: reflect.ValueOf(done), Dir: reflect.SelectRecv}) + chose, _, _ := reflect.Select(cases) + // If chose equal 0, it means receiving redundant events. + if chose == 1 { + result <- true + } else { + result <- false + } + } + + blockchain, _ := NewBlockChain(db, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) + defer blockchain.Stop() + + logsCh := make(chan []*types.Log) + blockchain.SubscribeLogsEvent(logsCh) + + rmLogsCh := make(chan RemovedLogsEvent) + blockchain.SubscribeRemovedLogsEvent(rmLogsCh) + + chain, _ := GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 2, func(i int, gen *BlockGen) { + if i == 1 { + tx, err := types.SignTx(types.NewContractCreation(gen.TxNonce(addr1), new(big.Int), 1000000, new(big.Int), code), signer, key1) + if err != nil { + t.Fatalf("failed to create tx: %v", err) + } + gen.AddTx(tx) + } + }) + + // Spawn a goroutine to receive log events + go validateLogEvent(logsCh, newLogCh, 1) + if _, err := blockchain.InsertChain(chain); err != nil { + t.Fatalf("failed to insert chain: %v", err) + } + if !<-newLogCh { + t.Fatal("failed to receive new log event") + } + + // Generate long reorg chain + forkChain, _ := GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 2, func(i int, gen *BlockGen) { + if i == 1 { + tx, err := types.SignTx(types.NewContractCreation(gen.TxNonce(addr1), new(big.Int), 1000000, new(big.Int), code), signer, key1) + if err != nil { + t.Fatalf("failed to create tx: %v", err) + } + gen.AddTx(tx) + // Higher block difficulty + gen.OffsetTime(-9) + } + }) + + // Spawn a goroutine to receive log events + go validateLogEvent(logsCh, newLogCh, 1) + go validateLogEvent(rmLogsCh, removeLogCh, 1) + if _, err := blockchain.InsertChain(forkChain); err != nil { + t.Fatalf("failed to insert forked chain: %v", err) + } + if !<-newLogCh { + t.Fatal("failed to receive new log event") + } + if !<-removeLogCh { + t.Fatal("failed to receive removed log event") + } + + newBlocks, _ := GenerateChain(params.TestChainConfig, chain[len(chain)-1], ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {}) + go validateLogEvent(logsCh, newLogCh, 1) + go validateLogEvent(rmLogsCh, removeLogCh, 1) + if _, err := blockchain.InsertChain(newBlocks); err != nil { + t.Fatalf("failed to insert forked chain: %v", err) + } + // Rebirth logs should omit a newLogEvent + if !<-newLogCh { + t.Fatal("failed to receive new log event") + } + // Ensure removedLog events received + if !<-removeLogCh { + t.Fatal("failed to receive removed log event") + } +} + +func TestSideLogRebirth(t *testing.T) { + var ( + key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + addr1 = crypto.PubkeyToAddress(key1.PublicKey) + db = rawdb.NewMemoryDatabase() + + // this code generates a log + code = common.Hex2Bytes("60606040525b7f24ec1d3ff24c2f6ff210738839dbc339cd45a5294d85c79361016243157aae7b60405180905060405180910390a15b600a8060416000396000f360606040526008565b00") + gspec = &Genesis{Config: params.TestChainConfig, Alloc: GenesisAlloc{addr1: {Balance: big.NewInt(10000000000000)}}} + genesis = gspec.MustCommit(db) + signer = types.NewEIP155Signer(gspec.Config.ChainID) + newLogCh = make(chan bool) + ) + + // listenNewLog checks whether the received logs number is equal with expected. + listenNewLog := func(sink chan []*types.Log, expect int) { + cnt := 0 + for { + select { + case logs := <-sink: + cnt += len(logs) + case <-time.NewTimer(5 * time.Second).C: + // new logs timeout + newLogCh <- false + return + } + if cnt == expect { + break + } else if cnt > expect { + // redundant logs received + newLogCh <- false + return + } + } + select { + case <-sink: + // redundant logs received + newLogCh <- false + case <-time.NewTimer(100 * time.Millisecond).C: + newLogCh <- true + } + } + + blockchain, _ := NewBlockChain(db, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) + defer blockchain.Stop() + + logsCh := make(chan []*types.Log) + blockchain.SubscribeLogsEvent(logsCh) + chain, _ := GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 2, func(i int, gen *BlockGen) { + if i == 1 { + // Higher block difficulty + gen.OffsetTime(-9) + } + }) + if _, err := blockchain.InsertChain(chain); err != nil { + t.Fatalf("failed to insert forked chain: %v", err) + } + + // Generate side chain with lower difficulty + sideChain, _ := GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, 2, func(i int, gen *BlockGen) { + if i == 1 { + tx, err := types.SignTx(types.NewContractCreation(gen.TxNonce(addr1), new(big.Int), 1000000, new(big.Int), code), signer, key1) + if err != nil { + t.Fatalf("failed to create tx: %v", err) + } + gen.AddTx(tx) + } + }) + if _, err := blockchain.InsertChain(sideChain); err != nil { + t.Fatalf("failed to insert forked chain: %v", err) + } + + // Generate a new block based on side chain + newBlocks, _ := GenerateChain(params.TestChainConfig, sideChain[len(sideChain)-1], ethash.NewFaker(), db, 1, func(i int, gen *BlockGen) {}) + go listenNewLog(logsCh, 1) + if _, err := blockchain.InsertChain(newBlocks); err != nil { + t.Fatalf("failed to insert forked chain: %v", err) + } + // Rebirth logs should omit a newLogEvent + if !<-newLogCh { + t.Fatalf("failed to receive new log event") + } +} + func TestReorgSideEvent(t *testing.T) { var ( - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() key1, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") addr1 = crypto.PubkeyToAddress(key1.PublicKey) gspec = &Genesis{ @@ -1037,14 +1292,17 @@ func TestCanonicalBlockRetrieval(t *testing.T) { continue // busy wait for canonical hash to be written } if ch != block.Hash() { - t.Fatalf("unknown canonical hash, want %s, got %s", block.Hash().Hex(), ch.Hex()) + t.Errorf("unknown canonical hash, want %s, got %s", block.Hash().Hex(), ch.Hex()) + return } fb := rawdb.ReadBlock(blockchain.db, ch, block.NumberU64()) if fb == nil { - t.Fatalf("unable to retrieve block %d for canonical hash: %s", block.NumberU64(), ch.Hex()) + t.Errorf("unable to retrieve block %d for canonical hash: %s", block.NumberU64(), ch.Hex()) + return } if fb.Hash() != block.Hash() { - t.Fatalf("invalid block hash for block %d, want %s, got %s", block.NumberU64(), block.Hash().Hex(), fb.Hash().Hex()) + t.Errorf("invalid block hash for block %d, want %s, got %s", block.NumberU64(), block.Hash().Hex(), fb.Hash().Hex()) + return } return } @@ -1060,13 +1318,13 @@ func TestCanonicalBlockRetrieval(t *testing.T) { func TestEIP155Transition(t *testing.T) { // Configure and generate a sample block chain var ( - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") address = crypto.PubkeyToAddress(key.PublicKey) funds = big.NewInt(1000000000) deleteAddr = common.Address{1} gspec = &Genesis{ - Config: ¶ms.ChainConfig{ChainID: big.NewInt(1), EIP155Block: big.NewInt(2), HomesteadBlock: new(big.Int)}, + Config: ¶ms.ChainConfig{ChainID: big.NewInt(1), EIP150Block: big.NewInt(0), EIP155Block: big.NewInt(2), HomesteadBlock: new(big.Int)}, Alloc: GenesisAlloc{address: {Balance: funds}, deleteAddr: {Balance: new(big.Int)}}, } genesis = gspec.MustCommit(db) @@ -1137,7 +1395,7 @@ func TestEIP155Transition(t *testing.T) { } // generate an invalid chain id transaction - config := ¶ms.ChainConfig{ChainID: big.NewInt(2), EIP155Block: big.NewInt(2), HomesteadBlock: new(big.Int)} + config := ¶ms.ChainConfig{ChainID: big.NewInt(2), EIP150Block: big.NewInt(0), EIP155Block: big.NewInt(2), HomesteadBlock: new(big.Int)} blocks, _ = GenerateChain(config, blocks[len(blocks)-1], ethash.NewFaker(), db, 4, func(i int, block *BlockGen) { var ( tx *types.Transaction @@ -1163,7 +1421,7 @@ func TestEIP155Transition(t *testing.T) { func TestEIP161AccountRemoval(t *testing.T) { // Configure and generate a sample block chain var ( - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") address = crypto.PubkeyToAddress(key.PublicKey) funds = big.NewInt(1000000000) @@ -1173,6 +1431,7 @@ func TestEIP161AccountRemoval(t *testing.T) { ChainID: big.NewInt(1), HomesteadBlock: new(big.Int), EIP155Block: new(big.Int), + EIP150Block: new(big.Int), EIP158Block: big.NewInt(2), }, Alloc: GenesisAlloc{address: {Balance: funds}}, @@ -1235,7 +1494,7 @@ func TestBlockchainHeaderchainReorgConsistency(t *testing.T) { // Generate a canonical chain to act as the main dataset engine := ethash.NewFaker() - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() genesis := new(Genesis).MustCommit(db) blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 64, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) }) @@ -1251,7 +1510,7 @@ func TestBlockchainHeaderchainReorgConsistency(t *testing.T) { } // Import the canonical and fork chain side by side, verifying the current block // and current header consistency - diskdb := ethdb.NewMemDatabase() + diskdb := rawdb.NewMemoryDatabase() new(Genesis).MustCommit(diskdb) chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) @@ -1280,9 +1539,9 @@ func TestTrieForkGC(t *testing.T) { // Generate a canonical chain to act as the main dataset engine := ethash.NewFaker() - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() genesis := new(Genesis).MustCommit(db) - blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 2*triesInMemory, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) }) + blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 2*TriesInMemory, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) }) // Generate a bunch of fork blocks, each side forking from the canonical chain forks := make([]*types.Block, len(blocks)) @@ -1295,7 +1554,7 @@ func TestTrieForkGC(t *testing.T) { forks[i] = fork[0] } // Import the canonical and fork chain side by side, forcing the trie cache to cache both - diskdb := ethdb.NewMemDatabase() + diskdb := rawdb.NewMemoryDatabase() new(Genesis).MustCommit(diskdb) chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) @@ -1311,7 +1570,7 @@ func TestTrieForkGC(t *testing.T) { } } // Dereference all the recent tries and ensure no past trie is left in - for i := 0; i < triesInMemory; i++ { + for i := 0; i < TriesInMemory; i++ { chain.stateCache.TrieDB().Dereference(blocks[len(blocks)-1-i].Root()) chain.stateCache.TrieDB().Dereference(forks[len(blocks)-1-i].Root()) } @@ -1326,15 +1585,15 @@ func TestLargeReorgTrieGC(t *testing.T) { // Generate the original common chain segment and the two competing forks engine := ethash.NewFaker() - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() genesis := new(Genesis).MustCommit(db) shared, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 64, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) }) - original, _ := GenerateChain(params.TestChainConfig, shared[len(shared)-1], engine, db, 2*triesInMemory, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{2}) }) - competitor, _ := GenerateChain(params.TestChainConfig, shared[len(shared)-1], engine, db, 2*triesInMemory+1, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{3}) }) + original, _ := GenerateChain(params.TestChainConfig, shared[len(shared)-1], engine, db, 2*TriesInMemory, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{2}) }) + competitor, _ := GenerateChain(params.TestChainConfig, shared[len(shared)-1], engine, db, 2*TriesInMemory+1, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{3}) }) // Import the shared chain and the original canonical one - diskdb := ethdb.NewMemDatabase() + diskdb := rawdb.NewMemoryDatabase() new(Genesis).MustCommit(diskdb) chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) @@ -1366,13 +1625,514 @@ func TestLargeReorgTrieGC(t *testing.T) { if _, err := chain.InsertChain(competitor[len(competitor)-2:]); err != nil { t.Fatalf("failed to finalize competitor chain: %v", err) } - for i, block := range competitor[:len(competitor)-triesInMemory] { + for i, block := range competitor[:len(competitor)-TriesInMemory] { if node, _ := chain.stateCache.TrieDB().Node(block.Root()); node != nil { t.Fatalf("competitor %d: competing chain state missing", i) } } } +func TestBlockchainRecovery(t *testing.T) { + // Configure and generate a sample block chain + var ( + gendb = rawdb.NewMemoryDatabase() + key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + address = crypto.PubkeyToAddress(key.PublicKey) + funds = big.NewInt(1000000000) + gspec = &Genesis{Config: params.TestChainConfig, Alloc: GenesisAlloc{address: {Balance: funds}}} + genesis = gspec.MustCommit(gendb) + ) + height := uint64(1024) + blocks, receipts := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), gendb, int(height), nil) + + // Import the chain as a ancient-first node and ensure all pointers are updated + frdir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("failed to create temp freezer dir: %v", err) + } + defer os.Remove(frdir) + ancientDb, err := rawdb.NewDatabaseWithFreezer(rawdb.NewMemoryDatabase(), frdir, "") + if err != nil { + t.Fatalf("failed to create temp freezer db: %v", err) + } + gspec.MustCommit(ancientDb) + ancient, _ := NewBlockChain(ancientDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) + + headers := make([]*types.Header, len(blocks)) + for i, block := range blocks { + headers[i] = block.Header() + } + if n, err := ancient.InsertHeaderChain(headers, 1); err != nil { + t.Fatalf("failed to insert header %d: %v", n, err) + } + if n, err := ancient.InsertReceiptChain(blocks, receipts, uint64(3*len(blocks)/4)); err != nil { + t.Fatalf("failed to insert receipt %d: %v", n, err) + } + ancient.Stop() + + // Destroy head fast block manually + midBlock := blocks[len(blocks)/2] + rawdb.WriteHeadFastBlockHash(ancientDb, midBlock.Hash()) + + // Reopen broken blockchain again + ancient, _ = NewBlockChain(ancientDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) + defer ancient.Stop() + if num := ancient.CurrentBlock().NumberU64(); num != 0 { + t.Errorf("head block mismatch: have #%v, want #%v", num, 0) + } + if num := ancient.CurrentFastBlock().NumberU64(); num != midBlock.NumberU64() { + t.Errorf("head fast-block mismatch: have #%v, want #%v", num, midBlock.NumberU64()) + } + if num := ancient.CurrentHeader().Number.Uint64(); num != midBlock.NumberU64() { + t.Errorf("head header mismatch: have #%v, want #%v", num, midBlock.NumberU64()) + } +} + +func TestIncompleteAncientReceiptChainInsertion(t *testing.T) { + // Configure and generate a sample block chain + var ( + gendb = rawdb.NewMemoryDatabase() + key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + address = crypto.PubkeyToAddress(key.PublicKey) + funds = big.NewInt(1000000000) + gspec = &Genesis{Config: params.TestChainConfig, Alloc: GenesisAlloc{address: {Balance: funds}}} + genesis = gspec.MustCommit(gendb) + ) + height := uint64(1024) + blocks, receipts := GenerateChain(gspec.Config, genesis, ethash.NewFaker(), gendb, int(height), nil) + + // Import the chain as a ancient-first node and ensure all pointers are updated + frdir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("failed to create temp freezer dir: %v", err) + } + defer os.Remove(frdir) + ancientDb, err := rawdb.NewDatabaseWithFreezer(rawdb.NewMemoryDatabase(), frdir, "") + if err != nil { + t.Fatalf("failed to create temp freezer db: %v", err) + } + gspec.MustCommit(ancientDb) + ancient, _ := NewBlockChain(ancientDb, nil, gspec.Config, ethash.NewFaker(), vm.Config{}, nil) + defer ancient.Stop() + + headers := make([]*types.Header, len(blocks)) + for i, block := range blocks { + headers[i] = block.Header() + } + if n, err := ancient.InsertHeaderChain(headers, 1); err != nil { + t.Fatalf("failed to insert header %d: %v", n, err) + } + // Abort ancient receipt chain insertion deliberately + ancient.terminateInsert = func(hash common.Hash, number uint64) bool { + return number == blocks[len(blocks)/2].NumberU64() + } + previousFastBlock := ancient.CurrentFastBlock() + if n, err := ancient.InsertReceiptChain(blocks, receipts, uint64(3*len(blocks)/4)); err == nil { + t.Fatalf("failed to insert receipt %d: %v", n, err) + } + if ancient.CurrentFastBlock().NumberU64() != previousFastBlock.NumberU64() { + t.Fatalf("failed to rollback ancient data, want %d, have %d", previousFastBlock.NumberU64(), ancient.CurrentFastBlock().NumberU64()) + } + if frozen, err := ancient.db.Ancients(); err != nil || frozen != 1 { + t.Fatalf("failed to truncate ancient data") + } + ancient.terminateInsert = nil + if n, err := ancient.InsertReceiptChain(blocks, receipts, uint64(3*len(blocks)/4)); err != nil { + t.Fatalf("failed to insert receipt %d: %v", n, err) + } + if ancient.CurrentFastBlock().NumberU64() != blocks[len(blocks)-1].NumberU64() { + t.Fatalf("failed to insert ancient recept chain after rollback") + } +} + +// Tests that importing a very large side fork, which is larger than the canon chain, +// but where the difficulty per block is kept low: this means that it will not +// overtake the 'canon' chain until after it's passed canon by about 200 blocks. +// +// Details at: +// - https://github.com/ethereum/go-ethereum/issues/18977 +// - https://github.com/ethereum/go-ethereum/pull/18988 +func TestLowDiffLongChain(t *testing.T) { + // Generate a canonical chain to act as the main dataset + engine := ethash.NewFaker() + db := rawdb.NewMemoryDatabase() + genesis := new(Genesis).MustCommit(db) + + // We must use a pretty long chain to ensure that the fork doesn't overtake us + // until after at least 128 blocks post tip + blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 6*TriesInMemory, func(i int, b *BlockGen) { + b.SetCoinbase(common.Address{1}) + b.OffsetTime(-9) + }) + + // Import the canonical chain + diskdb := rawdb.NewMemoryDatabase() + new(Genesis).MustCommit(diskdb) + + chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) + if err != nil { + t.Fatalf("failed to create tester chain: %v", err) + } + if n, err := chain.InsertChain(blocks); err != nil { + t.Fatalf("block %d: failed to insert into chain: %v", n, err) + } + // Generate fork chain, starting from an early block + parent := blocks[10] + fork, _ := GenerateChain(params.TestChainConfig, parent, engine, db, 8*TriesInMemory, func(i int, b *BlockGen) { + b.SetCoinbase(common.Address{2}) + }) + + // And now import the fork + if i, err := chain.InsertChain(fork); err != nil { + t.Fatalf("block %d: failed to insert into chain: %v", i, err) + } + head := chain.CurrentBlock() + if got := fork[len(fork)-1].Hash(); got != head.Hash() { + t.Fatalf("head wrong, expected %x got %x", head.Hash(), got) + } + // Sanity check that all the canonical numbers are present + header := chain.CurrentHeader() + for number := head.NumberU64(); number > 0; number-- { + if hash := chain.GetHeaderByNumber(number).Hash(); hash != header.Hash() { + t.Fatalf("header %d: canonical hash mismatch: have %x, want %x", number, hash, header.Hash()) + } + header = chain.GetHeader(header.ParentHash, number-1) + } +} + +// Tests that importing a sidechain (S), where +// - S is sidechain, containing blocks [Sn...Sm] +// - C is canon chain, containing blocks [G..Cn..Cm] +// - A common ancestor is placed at prune-point + blocksBetweenCommonAncestorAndPruneblock +// - The sidechain S is prepended with numCanonBlocksInSidechain blocks from the canon chain +func testSideImport(t *testing.T, numCanonBlocksInSidechain, blocksBetweenCommonAncestorAndPruneblock int) { + + // Generate a canonical chain to act as the main dataset + engine := ethash.NewFaker() + db := rawdb.NewMemoryDatabase() + genesis := new(Genesis).MustCommit(db) + + // Generate and import the canonical chain + blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 2*TriesInMemory, nil) + diskdb := rawdb.NewMemoryDatabase() + new(Genesis).MustCommit(diskdb) + chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) + if err != nil { + t.Fatalf("failed to create tester chain: %v", err) + } + if n, err := chain.InsertChain(blocks); err != nil { + t.Fatalf("block %d: failed to insert into chain: %v", n, err) + } + + lastPrunedIndex := len(blocks) - TriesInMemory - 1 + lastPrunedBlock := blocks[lastPrunedIndex] + firstNonPrunedBlock := blocks[len(blocks)-TriesInMemory] + + // Verify pruning of lastPrunedBlock + if chain.HasBlockAndState(lastPrunedBlock.Hash(), lastPrunedBlock.NumberU64()) { + t.Errorf("Block %d not pruned", lastPrunedBlock.NumberU64()) + } + // Verify firstNonPrunedBlock is not pruned + if !chain.HasBlockAndState(firstNonPrunedBlock.Hash(), firstNonPrunedBlock.NumberU64()) { + t.Errorf("Block %d pruned", firstNonPrunedBlock.NumberU64()) + } + // Generate the sidechain + // First block should be a known block, block after should be a pruned block. So + // canon(pruned), side, side... + + // Generate fork chain, make it longer than canon + parentIndex := lastPrunedIndex + blocksBetweenCommonAncestorAndPruneblock + parent := blocks[parentIndex] + fork, _ := GenerateChain(params.TestChainConfig, parent, engine, db, 2*TriesInMemory, func(i int, b *BlockGen) { + b.SetCoinbase(common.Address{2}) + }) + // Prepend the parent(s) + var sidechain []*types.Block + for i := numCanonBlocksInSidechain; i > 0; i-- { + sidechain = append(sidechain, blocks[parentIndex+1-i]) + } + sidechain = append(sidechain, fork...) + _, err = chain.InsertChain(sidechain) + if err != nil { + t.Errorf("Got error, %v", err) + } + head := chain.CurrentBlock() + if got := fork[len(fork)-1].Hash(); got != head.Hash() { + t.Fatalf("head wrong, expected %x got %x", head.Hash(), got) + } +} + +// Tests that importing a sidechain (S), where +// - S is sidechain, containing blocks [Sn...Sm] +// - C is canon chain, containing blocks [G..Cn..Cm] +// - The common ancestor Cc is pruned +// - The first block in S: Sn, is == Cn +// That is: the sidechain for import contains some blocks already present in canon chain. +// So the blocks are +// [ Cn, Cn+1, Cc, Sn+3 ... Sm] +// ^ ^ ^ pruned +func TestPrunedImportSide(t *testing.T) { + //glogger := log.NewGlogHandler(log.StreamHandler(os.Stdout, log.TerminalFormat(false))) + //glogger.Verbosity(3) + //log.Root().SetHandler(log.Handler(glogger)) + testSideImport(t, 3, 3) + testSideImport(t, 3, -3) + testSideImport(t, 10, 0) + testSideImport(t, 1, 10) + testSideImport(t, 1, -10) +} + +func TestInsertKnownHeaders(t *testing.T) { testInsertKnownChainData(t, "headers") } +func TestInsertKnownReceiptChain(t *testing.T) { testInsertKnownChainData(t, "receipts") } +func TestInsertKnownBlocks(t *testing.T) { testInsertKnownChainData(t, "blocks") } + +func testInsertKnownChainData(t *testing.T, typ string) { + engine := ethash.NewFaker() + + db := rawdb.NewMemoryDatabase() + genesis := new(Genesis).MustCommit(db) + + blocks, receipts := GenerateChain(params.TestChainConfig, genesis, engine, db, 32, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) }) + // A longer chain but total difficulty is lower. + blocks2, receipts2 := GenerateChain(params.TestChainConfig, blocks[len(blocks)-1], engine, db, 65, func(i int, b *BlockGen) { b.SetCoinbase(common.Address{1}) }) + // A shorter chain but total difficulty is higher. + blocks3, receipts3 := GenerateChain(params.TestChainConfig, blocks[len(blocks)-1], engine, db, 64, func(i int, b *BlockGen) { + b.SetCoinbase(common.Address{1}) + b.OffsetTime(-9) // A higher difficulty + }) + // Import the shared chain and the original canonical one + dir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("failed to create temp freezer dir: %v", err) + } + defer os.Remove(dir) + chaindb, err := rawdb.NewDatabaseWithFreezer(rawdb.NewMemoryDatabase(), dir, "") + if err != nil { + t.Fatalf("failed to create temp freezer db: %v", err) + } + new(Genesis).MustCommit(chaindb) + defer os.RemoveAll(dir) + + chain, err := NewBlockChain(chaindb, nil, params.TestChainConfig, engine, vm.Config{}, nil) + if err != nil { + t.Fatalf("failed to create tester chain: %v", err) + } + + var ( + inserter func(blocks []*types.Block, receipts []types.Receipts) error + asserter func(t *testing.T, block *types.Block) + ) + if typ == "headers" { + inserter = func(blocks []*types.Block, receipts []types.Receipts) error { + headers := make([]*types.Header, 0, len(blocks)) + for _, block := range blocks { + headers = append(headers, block.Header()) + } + _, err := chain.InsertHeaderChain(headers, 1) + return err + } + asserter = func(t *testing.T, block *types.Block) { + if chain.CurrentHeader().Hash() != block.Hash() { + t.Fatalf("current head header mismatch, have %v, want %v", chain.CurrentHeader().Hash().Hex(), block.Hash().Hex()) + } + } + } else if typ == "receipts" { + inserter = func(blocks []*types.Block, receipts []types.Receipts) error { + headers := make([]*types.Header, 0, len(blocks)) + for _, block := range blocks { + headers = append(headers, block.Header()) + } + _, err := chain.InsertHeaderChain(headers, 1) + if err != nil { + return err + } + _, err = chain.InsertReceiptChain(blocks, receipts, 0) + return err + } + asserter = func(t *testing.T, block *types.Block) { + if chain.CurrentFastBlock().Hash() != block.Hash() { + t.Fatalf("current head fast block mismatch, have %v, want %v", chain.CurrentFastBlock().Hash().Hex(), block.Hash().Hex()) + } + } + } else { + inserter = func(blocks []*types.Block, receipts []types.Receipts) error { + _, err := chain.InsertChain(blocks) + return err + } + asserter = func(t *testing.T, block *types.Block) { + if chain.CurrentBlock().Hash() != block.Hash() { + t.Fatalf("current head block mismatch, have %v, want %v", chain.CurrentBlock().Hash().Hex(), block.Hash().Hex()) + } + } + } + + if err := inserter(blocks, receipts); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + + // Reimport the chain data again. All the imported + // chain data are regarded "known" data. + if err := inserter(blocks, receipts); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + asserter(t, blocks[len(blocks)-1]) + + // Import a long canonical chain with some known data as prefix. + var rollback []common.Hash + for i := len(blocks) / 2; i < len(blocks); i++ { + rollback = append(rollback, blocks[i].Hash()) + } + chain.Rollback(rollback) + if err := inserter(append(blocks, blocks2...), append(receipts, receipts2...)); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + asserter(t, blocks2[len(blocks2)-1]) + + // Import a heavier shorter but higher total difficulty chain with some known data as prefix. + if err := inserter(append(blocks, blocks3...), append(receipts, receipts3...)); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + asserter(t, blocks3[len(blocks3)-1]) + + // Import a longer but lower total difficulty chain with some known data as prefix. + if err := inserter(append(blocks, blocks2...), append(receipts, receipts2...)); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + // The head shouldn't change. + asserter(t, blocks3[len(blocks3)-1]) + + // Rollback the heavier chain and re-insert the longer chain again + for i := 0; i < len(blocks3); i++ { + rollback = append(rollback, blocks3[i].Hash()) + } + chain.Rollback(rollback) + + if err := inserter(append(blocks, blocks2...), append(receipts, receipts2...)); err != nil { + t.Fatalf("failed to insert chain data: %v", err) + } + asserter(t, blocks2[len(blocks2)-1]) +} + +// getLongAndShortChains returns two chains, +// A is longer, B is heavier +func getLongAndShortChains() (*BlockChain, []*types.Block, []*types.Block, error) { + // Generate a canonical chain to act as the main dataset + engine := ethash.NewFaker() + db := rawdb.NewMemoryDatabase() + genesis := new(Genesis).MustCommit(db) + + // Generate and import the canonical chain, + // Offset the time, to keep the difficulty low + longChain, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 80, func(i int, b *BlockGen) { + b.SetCoinbase(common.Address{1}) + }) + diskdb := rawdb.NewMemoryDatabase() + new(Genesis).MustCommit(diskdb) + + chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) + if err != nil { + return nil, nil, nil, fmt.Errorf("failed to create tester chain: %v", err) + } + + // Generate fork chain, make it shorter than canon, with common ancestor pretty early + parentIndex := 3 + parent := longChain[parentIndex] + heavyChain, _ := GenerateChain(params.TestChainConfig, parent, engine, db, 75, func(i int, b *BlockGen) { + b.SetCoinbase(common.Address{2}) + b.OffsetTime(-9) + }) + // Verify that the test is sane + var ( + longerTd = new(big.Int) + shorterTd = new(big.Int) + ) + for index, b := range longChain { + longerTd.Add(longerTd, b.Difficulty()) + if index <= parentIndex { + shorterTd.Add(shorterTd, b.Difficulty()) + } + } + for _, b := range heavyChain { + shorterTd.Add(shorterTd, b.Difficulty()) + } + if shorterTd.Cmp(longerTd) <= 0 { + return nil, nil, nil, fmt.Errorf("Test is moot, heavyChain td (%v) must be larger than canon td (%v)", shorterTd, longerTd) + } + longerNum := longChain[len(longChain)-1].NumberU64() + shorterNum := heavyChain[len(heavyChain)-1].NumberU64() + if shorterNum >= longerNum { + return nil, nil, nil, fmt.Errorf("Test is moot, heavyChain num (%v) must be lower than canon num (%v)", shorterNum, longerNum) + } + return chain, longChain, heavyChain, nil +} + +// TestReorgToShorterRemovesCanonMapping tests that if we +// 1. Have a chain [0 ... N .. X] +// 2. Reorg to shorter but heavier chain [0 ... N ... Y] +// 3. Then there should be no canon mapping for the block at height X +func TestReorgToShorterRemovesCanonMapping(t *testing.T) { + chain, canonblocks, sideblocks, err := getLongAndShortChains() + if err != nil { + t.Fatal(err) + } + if n, err := chain.InsertChain(canonblocks); err != nil { + t.Fatalf("block %d: failed to insert into chain: %v", n, err) + } + canonNum := chain.CurrentBlock().NumberU64() + _, err = chain.InsertChain(sideblocks) + if err != nil { + t.Errorf("Got error, %v", err) + } + head := chain.CurrentBlock() + if got := sideblocks[len(sideblocks)-1].Hash(); got != head.Hash() { + t.Fatalf("head wrong, expected %x got %x", head.Hash(), got) + } + // We have now inserted a sidechain. + if blockByNum := chain.GetBlockByNumber(canonNum); blockByNum != nil { + t.Errorf("expected block to be gone: %v", blockByNum.NumberU64()) + } + if headerByNum := chain.GetHeaderByNumber(canonNum); headerByNum != nil { + t.Errorf("expected header to be gone: %v", headerByNum.Number.Uint64()) + } +} + +// TestReorgToShorterRemovesCanonMappingHeaderChain is the same scenario +// as TestReorgToShorterRemovesCanonMapping, but applied on headerchain +// imports -- that is, for fast sync +func TestReorgToShorterRemovesCanonMappingHeaderChain(t *testing.T) { + chain, canonblocks, sideblocks, err := getLongAndShortChains() + if err != nil { + t.Fatal(err) + } + // Convert into headers + canonHeaders := make([]*types.Header, len(canonblocks)) + for i, block := range canonblocks { + canonHeaders[i] = block.Header() + } + if n, err := chain.InsertHeaderChain(canonHeaders, 0); err != nil { + t.Fatalf("header %d: failed to insert into chain: %v", n, err) + } + canonNum := chain.CurrentHeader().Number.Uint64() + sideHeaders := make([]*types.Header, len(sideblocks)) + for i, block := range sideblocks { + sideHeaders[i] = block.Header() + } + if n, err := chain.InsertHeaderChain(sideHeaders, 0); err != nil { + t.Fatalf("header %d: failed to insert into chain: %v", n, err) + } + head := chain.CurrentHeader() + if got := sideblocks[len(sideblocks)-1].Hash(); got != head.Hash() { + t.Fatalf("head wrong, expected %x got %x", head.Hash(), got) + } + // We have now inserted a sidechain. + if blockByNum := chain.GetBlockByNumber(canonNum); blockByNum != nil { + t.Errorf("expected block to be gone: %v", blockByNum.NumberU64()) + } + if headerByNum := chain.GetHeaderByNumber(canonNum); headerByNum != nil { + t.Errorf("expected header to be gone: %v", headerByNum.Number.Uint64()) + } +} + // Benchmarks large blocks with value transfers to non-existing accounts func benchmarkLargeNumberOfValueToNonexisting(b *testing.B, numTxs, numBlocks int, recipientFn func(uint64) common.Address, dataFn func(uint64) []byte) { var ( @@ -1394,7 +2154,7 @@ func benchmarkLargeNumberOfValueToNonexisting(b *testing.B, numTxs, numBlocks in ) // Generate the original common chain segment and the two competing forks engine := ethash.NewFaker() - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() genesis := gspec.MustCommit(db) blockGenerator := func(i int, block *BlockGen) { @@ -1402,7 +2162,6 @@ func benchmarkLargeNumberOfValueToNonexisting(b *testing.B, numTxs, numBlocks in for txi := 0; txi < numTxs; txi++ { uniq := uint64(i*numTxs + txi) recipient := recipientFn(uniq) - //recipient := common.BigToAddress(big.NewInt(0).SetUint64(1337 + uniq)) tx, err := types.SignTx(types.NewTransaction(uniq, recipient, big.NewInt(1), params.TxGas, big.NewInt(1), nil), signer, testBankKey) if err != nil { b.Error(err) @@ -1416,7 +2175,7 @@ func benchmarkLargeNumberOfValueToNonexisting(b *testing.B, numTxs, numBlocks in b.ResetTimer() for i := 0; i < b.N; i++ { // Import the shared chain and the original canonical one - diskdb := ethdb.NewMemDatabase() + diskdb := rawdb.NewMemoryDatabase() gspec.MustCommit(diskdb) chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) @@ -1429,26 +2188,26 @@ func benchmarkLargeNumberOfValueToNonexisting(b *testing.B, numTxs, numBlocks in } b.StopTimer() if got := chain.CurrentBlock().Transactions().Len(); got != numTxs*numBlocks { - b.Fatalf("Transactions were not included, expected %d, got %d", (numTxs * numBlocks), got) + b.Fatalf("Transactions were not included, expected %d, got %d", numTxs*numBlocks, got) } } } + func BenchmarkBlockChain_1x1000ValueTransferToNonexisting(b *testing.B) { var ( numTxs = 1000 numBlocks = 1 ) - recipientFn := func(nonce uint64) common.Address { return common.BigToAddress(big.NewInt(0).SetUint64(1337 + nonce)) } dataFn := func(nonce uint64) []byte { return nil } - benchmarkLargeNumberOfValueToNonexisting(b, numTxs, numBlocks, recipientFn, dataFn) } + func BenchmarkBlockChain_1x1000ValueTransferToExisting(b *testing.B) { var ( numTxs = 1000 @@ -1463,9 +2222,9 @@ func BenchmarkBlockChain_1x1000ValueTransferToExisting(b *testing.B) { dataFn := func(nonce uint64) []byte { return nil } - benchmarkLargeNumberOfValueToNonexisting(b, numTxs, numBlocks, recipientFn, dataFn) } + func BenchmarkBlockChain_1x1000Executions(b *testing.B) { var ( numTxs = 1000 @@ -1480,6 +2239,126 @@ func BenchmarkBlockChain_1x1000Executions(b *testing.B) { dataFn := func(nonce uint64) []byte { return nil } - benchmarkLargeNumberOfValueToNonexisting(b, numTxs, numBlocks, recipientFn, dataFn) } + +// Tests that importing a some old blocks, where all blocks are before the +// pruning point. +// This internally leads to a sidechain import, since the blocks trigger an +// ErrPrunedAncestor error. +// This may e.g. happen if +// 1. Downloader rollbacks a batch of inserted blocks and exits +// 2. Downloader starts to sync again +// 3. The blocks fetched are all known and canonical blocks +func TestSideImportPrunedBlocks(t *testing.T) { + // Generate a canonical chain to act as the main dataset + engine := ethash.NewFaker() + db := rawdb.NewMemoryDatabase() + genesis := new(Genesis).MustCommit(db) + + // Generate and import the canonical chain + blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 2*TriesInMemory, nil) + diskdb := rawdb.NewMemoryDatabase() + new(Genesis).MustCommit(diskdb) + chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) + if err != nil { + t.Fatalf("failed to create tester chain: %v", err) + } + if n, err := chain.InsertChain(blocks); err != nil { + t.Fatalf("block %d: failed to insert into chain: %v", n, err) + } + + lastPrunedIndex := len(blocks) - TriesInMemory - 1 + lastPrunedBlock := blocks[lastPrunedIndex] + + // Verify pruning of lastPrunedBlock + if chain.HasBlockAndState(lastPrunedBlock.Hash(), lastPrunedBlock.NumberU64()) { + t.Errorf("Block %d not pruned", lastPrunedBlock.NumberU64()) + } + firstNonPrunedBlock := blocks[len(blocks)-TriesInMemory] + // Verify firstNonPrunedBlock is not pruned + if !chain.HasBlockAndState(firstNonPrunedBlock.Hash(), firstNonPrunedBlock.NumberU64()) { + t.Errorf("Block %d pruned", firstNonPrunedBlock.NumberU64()) + } + // Now re-import some old blocks + blockToReimport := blocks[5:8] + _, err = chain.InsertChain(blockToReimport) + if err != nil { + t.Errorf("Got error, %v", err) + } +} + +// TestDeleteCreateRevert tests a weird state transition corner case that we hit +// while changing the internals of statedb. The workflow is that a contract is +// self destructed, then in a followup transaction (but same block) it's created +// again and the transaction reverted. +// +// The original statedb implementation flushed dirty objects to the tries after +// each transaction, so this works ok. The rework accumulated writes in memory +// first, but the journal wiped the entire state object on create-revert. +func TestDeleteCreateRevert(t *testing.T) { + var ( + aa = common.HexToAddress("0x000000000000000000000000000000000000aaaa") + bb = common.HexToAddress("0x000000000000000000000000000000000000bbbb") + // Generate a canonical chain to act as the main dataset + engine = ethash.NewFaker() + db = rawdb.NewMemoryDatabase() + + // A sender who makes transactions, has some funds + key, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + address = crypto.PubkeyToAddress(key.PublicKey) + funds = big.NewInt(1000000000) + gspec = &Genesis{ + Config: params.TestChainConfig, + Alloc: GenesisAlloc{ + address: {Balance: funds}, + // The address 0xAAAAA selfdestructs if called + aa: { + // Code needs to just selfdestruct + Code: []byte{byte(vm.PC), 0xFF}, + Nonce: 1, + Balance: big.NewInt(0), + }, + // The address 0xBBBB send 1 wei to 0xAAAA, then reverts + bb: { + Code: []byte{ + byte(vm.PC), // [0] + byte(vm.DUP1), // [0,0] + byte(vm.DUP1), // [0,0,0] + byte(vm.DUP1), // [0,0,0,0] + byte(vm.PUSH1), 0x01, // [0,0,0,0,1] (value) + byte(vm.PUSH2), 0xaa, 0xaa, // [0,0,0,0,1, 0xaaaa] + byte(vm.GAS), + byte(vm.CALL), + byte(vm.REVERT), + }, + Balance: big.NewInt(1), + }, + }, + } + genesis = gspec.MustCommit(db) + ) + + blocks, _ := GenerateChain(params.TestChainConfig, genesis, engine, db, 1, func(i int, b *BlockGen) { + b.SetCoinbase(common.Address{1}) + // One transaction to AAAA + tx, _ := types.SignTx(types.NewTransaction(0, aa, + big.NewInt(0), 50000, big.NewInt(1), nil), types.HomesteadSigner{}, key) + b.AddTx(tx) + // One transaction to BBBB + tx, _ = types.SignTx(types.NewTransaction(1, bb, + big.NewInt(0), 100000, big.NewInt(1), nil), types.HomesteadSigner{}, key) + b.AddTx(tx) + }) + // Import the canonical chain + diskdb := rawdb.NewMemoryDatabase() + gspec.MustCommit(diskdb) + + chain, err := NewBlockChain(diskdb, nil, params.TestChainConfig, engine, vm.Config{}, nil) + if err != nil { + t.Fatalf("failed to create tester chain: %v", err) + } + if n, err := chain.InsertChain(blocks); err != nil { + t.Fatalf("block %d: failed to insert into chain: %v", n, err) + } +} diff --git a/core/blocks.go b/core/blocks.go index d96ca75bb137..f20ba4aaf295 100644 --- a/core/blocks.go +++ b/core/blocks.go @@ -16,7 +16,7 @@ package core -import "github.com/nebulaai/nbai-node/common" +import "github.com/ethereum/go-ethereum/common" // BadHashes represent a set of manually tracked bad hashes (usually hard forks) var BadHashes = map[common.Hash]bool{ diff --git a/core/bloombits/generator.go b/core/bloombits/generator.go index eb73dea5e3e9..ae07481ada50 100644 --- a/core/bloombits/generator.go +++ b/core/bloombits/generator.go @@ -19,7 +19,7 @@ package bloombits import ( "errors" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/core/types" ) var ( diff --git a/core/bloombits/generator_test.go b/core/bloombits/generator_test.go index 2b3692d6ad89..f9bcef96e0b5 100644 --- a/core/bloombits/generator_test.go +++ b/core/bloombits/generator_test.go @@ -21,7 +21,7 @@ import ( "math/rand" "testing" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/core/types" ) // Tests that batched bloom bits are correctly rotated from the input bloom diff --git a/core/bloombits/matcher.go b/core/bloombits/matcher.go index bd4d45afc40d..3ec0d5ae94e5 100644 --- a/core/bloombits/matcher.go +++ b/core/bloombits/matcher.go @@ -26,8 +26,8 @@ import ( "sync/atomic" "time" - "github.com/nebulaai/nbai-node/common/bitutil" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/common/bitutil" + "github.com/ethereum/go-ethereum/crypto" ) // bloomIndexes represents the bit indexes inside the bloom filter that belong diff --git a/core/bloombits/matcher_test.go b/core/bloombits/matcher_test.go index 789080376f01..91143e525e7f 100644 --- a/core/bloombits/matcher_test.go +++ b/core/bloombits/matcher_test.go @@ -23,7 +23,7 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) const testSectionSize = 4096 diff --git a/core/chain_indexer.go b/core/chain_indexer.go index db04a860db7d..c0c2c4f7f945 100644 --- a/core/chain_indexer.go +++ b/core/chain_indexer.go @@ -24,12 +24,12 @@ import ( "sync/atomic" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" ) // ChainIndexerBackend defines the methods needed to process chain segments in @@ -97,7 +97,7 @@ type ChainIndexer struct { // 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 { +func NewChainIndexer(chainDb ethdb.Database, indexDb ethdb.Database, backend ChainIndexerBackend, section, confirm uint64, throttling time.Duration, kind string) *ChainIndexer { c := &ChainIndexer{ chainDb: chainDb, indexDb: indexDb, @@ -128,12 +128,13 @@ func (c *ChainIndexer) AddCheckpoint(section uint64, shead common.Hash) { c.lock.Lock() defer c.lock.Unlock() + // Short circuit if the given checkpoint is below than local's. + if c.checkpointSections >= section+1 || section < c.storedSections { + return + } c.checkpointSections = section + 1 c.checkpointHead = shead - if section < c.storedSections { - return - } c.setSectionHead(section, shead) c.setValidSections(section + 1) } @@ -243,7 +244,7 @@ func (c *ChainIndexer) newHead(head uint64, reorg bool) { // If a reorg happened, invalidate all sections until that point if reorg { // Revert the known section number to the reorg point - known := head / c.sectionSize + known := (head + 1) / c.sectionSize stored := known if known < c.checkpointSections { known = 0 @@ -323,6 +324,7 @@ func (c *ChainIndexer) updateLoop() { updated = time.Now() } // Cache the current section count and head to allow unlocking the mutex + c.verifyLastHead() section := c.storedSections var oldHead common.Hash if section > 0 { @@ -342,8 +344,8 @@ func (c *ChainIndexer) updateLoop() { } c.lock.Lock() - // If processing succeeded and no reorgs occcurred, mark the section completed - if err == nil && oldHead == c.SectionHead(section-1) { + // If processing succeeded and no reorgs occurred, mark the section completed + if err == nil && (section == 0 || oldHead == c.SectionHead(section-1)) { c.setSectionHead(section, newHead) c.setValidSections(section + 1) if c.storedSections == c.knownSections && updating { @@ -358,6 +360,7 @@ func (c *ChainIndexer) updateLoop() { } else { // If processing failed, don't retry until further notification c.log.Debug("Chain index processing failed", "section", section, "err", err) + c.verifyLastHead() c.knownSections = c.storedSections } } @@ -411,6 +414,18 @@ func (c *ChainIndexer) processSection(section uint64, lastHead common.Hash) (com return lastHead, nil } +// verifyLastHead compares last stored section head with the corresponding block hash in the +// actual canonical chain and rolls back reorged sections if necessary to ensure that stored +// sections are all valid +func (c *ChainIndexer) verifyLastHead() { + for c.storedSections > 0 && c.storedSections > c.checkpointSections { + if c.SectionHead(c.storedSections-1) == rawdb.ReadCanonicalHash(c.chainDb, c.storedSections*c.sectionSize-1) { + return + } + c.setValidSections(c.storedSections - 1) + } +} + // Sections returns the number of processed sections maintained by the indexer // and also the information about the last header indexed for potential canonical // verifications. @@ -418,6 +433,7 @@ func (c *ChainIndexer) Sections() (uint64, uint64, common.Hash) { c.lock.Lock() defer c.lock.Unlock() + c.verifyLastHead() return c.storedSections, c.storedSections*c.sectionSize - 1, c.SectionHead(c.storedSections - 1) } diff --git a/core/chain_indexer_test.go b/core/chain_indexer_test.go index 52b32129489d..abf5b3cc1400 100644 --- a/core/chain_indexer_test.go +++ b/core/chain_indexer_test.go @@ -24,10 +24,9 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" ) // Runs multiple tests with randomized parameters. @@ -49,7 +48,7 @@ func TestChainIndexerWithChildren(t *testing.T) { // multiple backends. The section size and required confirmation count parameters // are randomized. func testChainIndexer(t *testing.T, count int) { - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() defer db.Close() // Create a chain of indexers and ensure they all report empty @@ -60,7 +59,7 @@ func testChainIndexer(t *testing.T, count int) { 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)) + backends[i].indexer = NewChainIndexer(db, rawdb.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) diff --git a/core/chain_makers.go b/core/chain_makers.go index d39552736af7..fc4f7d182d01 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -20,14 +20,14 @@ import ( "fmt" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/consensus/misc" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/misc" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/params" ) // BlockGen creates blocks for testing. @@ -71,6 +71,13 @@ func (b *BlockGen) SetNonce(nonce types.BlockNonce) { b.header.Nonce = nonce } +// SetDifficulty sets the difficulty field of the generated block. This method is +// useful for Clique tests where the difficulty does not depend on time. For the +// ethash tests, please use OffsetTime, which implicitly recalculates the diff. +func (b *BlockGen) SetDifficulty(diff *big.Int) { + b.header.Difficulty = diff +} + // AddTx adds a transaction to the generated block. If no coinbase has // been set, the block's coinbase is set to the zero address. // @@ -96,7 +103,7 @@ func (b *BlockGen) AddTxWithChain(bc *BlockChain, tx *types.Transaction) { b.SetCoinbase(common.Address{}) } b.statedb.Prepare(tx.Hash(), common.Hash{}, len(b.txs)) - receipt, _, err := ApplyTransaction(b.config, bc, &b.header.Coinbase, b.gasPool, b.statedb, b.header, tx, &b.header.GasUsed, vm.Config{}) + receipt, err := ApplyTransaction(b.config, bc, &b.header.Coinbase, b.gasPool, b.statedb, b.header, tx, &b.header.GasUsed, vm.Config{}) if err != nil { panic(err) } @@ -104,6 +111,15 @@ func (b *BlockGen) AddTxWithChain(bc *BlockChain, tx *types.Transaction) { b.receipts = append(b.receipts, receipt) } +// AddUncheckedTx forcefully adds a transaction to the block without any +// validation. +// +// AddUncheckedTx will cause consensus failures when used during real +// chain processing. This is best used in conjunction with raw block insertion. +func (b *BlockGen) AddUncheckedTx(tx *types.Transaction) { + b.txs = append(b.txs, tx) +} + // Number returns the block number of the block being generated. func (b *BlockGen) Number() *big.Int { return new(big.Int).Set(b.header.Number) @@ -149,12 +165,12 @@ func (b *BlockGen) PrevBlock(index int) *types.Block { // associated difficulty. It's useful to test scenarios where forking is not // tied to chain length directly. func (b *BlockGen) OffsetTime(seconds int64) { - b.header.Time.Add(b.header.Time, new(big.Int).SetInt64(seconds)) - if b.header.Time.Cmp(b.parent.Header().Time) <= 0 { + b.header.Time += uint64(seconds) + if b.header.Time <= b.parent.Header().Time { panic("block time out of range") } chainreader := &fakeChainReader{config: b.config} - b.header.Difficulty = b.engine.CalcDifficulty(chainreader, b.header.Time.Uint64(), b.parent.Header()) + b.header.Difficulty = b.engine.CalcDifficulty(chainreader, b.header.Time, b.parent.Header()) } // GenerateChain creates a chain of n blocks. The first block's @@ -197,7 +213,7 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse } if b.engine != nil { // Finalize and seal the block - block, _ := b.engine.Finalize(chainreader, b.header, statedb, b.txs, b.uncles, b.receipts) + block, _ := b.engine.FinalizeAndAssemble(chainreader, b.header, statedb, b.txs, b.uncles, b.receipts) // Write state changes to db root, err := statedb.Commit(config.IsEIP158(b.header.Number)) @@ -225,20 +241,20 @@ func GenerateChain(config *params.ChainConfig, parent *types.Block, engine conse } func makeHeader(chain consensus.ChainReader, parent *types.Block, state *state.StateDB, engine consensus.Engine) *types.Header { - var time *big.Int - if parent.Time() == nil { - time = big.NewInt(10) + var time uint64 + if parent.Time() == 0 { + time = 10 } else { - time = new(big.Int).Add(parent.Time(), big.NewInt(10)) // block time is fixed at 10 seconds + time = parent.Time() + 10 // block time is fixed at 10 seconds } return &types.Header{ Root: state.IntermediateRoot(chain.Config().IsEIP158(parent.Number())), ParentHash: parent.Hash(), Coinbase: parent.Coinbase(), - Difficulty: engine.CalcDifficulty(chain, time.Uint64(), &types.Header{ + Difficulty: engine.CalcDifficulty(chain, time, &types.Header{ Number: parent.Number(), - Time: new(big.Int).Sub(time, big.NewInt(10)), + Time: time - 10, Difficulty: parent.Difficulty(), UncleHash: parent.UncleHash(), }), @@ -267,8 +283,7 @@ func makeBlockChain(parent *types.Block, n int, engine consensus.Engine, db ethd } type fakeChainReader struct { - config *params.ChainConfig - genesis *types.Block + config *params.ChainConfig } // Config returns the chain configuration. diff --git a/core/chain_makers_test.go b/core/chain_makers_test.go index 640a041c9686..32e3888d55ce 100644 --- a/core/chain_makers_test.go +++ b/core/chain_makers_test.go @@ -20,12 +20,12 @@ import ( "fmt" "math/big" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" ) func ExampleGenerateChain() { @@ -36,7 +36,7 @@ func ExampleGenerateChain() { addr1 = crypto.PubkeyToAddress(key1.PublicKey) addr2 = crypto.PubkeyToAddress(key2.PublicKey) addr3 = crypto.PubkeyToAddress(key3.PublicKey) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() ) // Ensure that key1 has some funds in the genesis block. diff --git a/core/dao_test.go b/core/dao_test.go index 9ca69c01d4dc..4e8dba9e8488 100644 --- a/core/dao_test.go +++ b/core/dao_test.go @@ -20,10 +20,10 @@ import ( "math/big" "testing" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" ) // Tests that DAO-fork enabled clients can properly filter out fork-commencing @@ -32,13 +32,13 @@ func TestDAOForkRangeExtradata(t *testing.T) { forkBlock := big.NewInt(32) // Generate a common prefix for both pro-forkers and non-forkers - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() gspec := new(Genesis) genesis := gspec.MustCommit(db) prefix, _ := GenerateChain(params.TestChainConfig, genesis, ethash.NewFaker(), db, int(forkBlock.Int64()-1), func(i int, gen *BlockGen) {}) // Create the concurrent, conflicting two nodes - proDb := ethdb.NewMemDatabase() + proDb := rawdb.NewMemoryDatabase() gspec.MustCommit(proDb) proConf := *params.TestChainConfig @@ -48,7 +48,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { proBc, _ := NewBlockChain(proDb, nil, &proConf, ethash.NewFaker(), vm.Config{}, nil) defer proBc.Stop() - conDb := ethdb.NewMemDatabase() + conDb := rawdb.NewMemoryDatabase() gspec.MustCommit(conDb) conConf := *params.TestChainConfig @@ -67,7 +67,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { // Try to expand both pro-fork and non-fork chains iteratively with other camp's blocks for i := int64(0); i < params.DAOForkExtraRange.Int64(); i++ { // Create a pro-fork block, and try to feed into the no-fork chain - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() gspec.MustCommit(db) bc, _ := NewBlockChain(db, nil, &conConf, ethash.NewFaker(), vm.Config{}, nil) defer bc.Stop() @@ -92,7 +92,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { t.Fatalf("contra-fork chain didn't accepted no-fork block: %v", err) } // Create a no-fork block, and try to feed into the pro-fork chain - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() gspec.MustCommit(db) bc, _ = NewBlockChain(db, nil, &proConf, ethash.NewFaker(), vm.Config{}, nil) defer bc.Stop() @@ -118,7 +118,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { } } // Verify that contra-forkers accept pro-fork extra-datas after forking finishes - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() gspec.MustCommit(db) bc, _ := NewBlockChain(db, nil, &conConf, ethash.NewFaker(), vm.Config{}, nil) defer bc.Stop() @@ -138,7 +138,7 @@ func TestDAOForkRangeExtradata(t *testing.T) { t.Fatalf("contra-fork chain didn't accept pro-fork block post-fork: %v", err) } // Verify that pro-forkers accept contra-fork extra-datas after forking finishes - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() gspec.MustCommit(db) bc, _ = NewBlockChain(db, nil, &proConf, ethash.NewFaker(), vm.Config{}, nil) defer bc.Stop() diff --git a/core/error.go b/core/error.go index 410eca1e1ea0..cd4be3d705e1 100644 --- a/core/error.go +++ b/core/error.go @@ -32,4 +32,7 @@ var ( // 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") + + // ErrNoGenesis is returned when there is no Genesis Block. + ErrNoGenesis = errors.New("genesis not found in chain") ) diff --git a/core/events.go b/core/events.go index 4b7808620ff4..710bdb589485 100644 --- a/core/events.go +++ b/core/events.go @@ -17,8 +17,8 @@ package core import ( - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" ) // NewTxsEvent is posted when a batch of transactions enter the transaction pool. diff --git a/core/evm.go b/core/evm.go index cdf6219163ed..b654bbd4796f 100644 --- a/core/evm.go +++ b/core/evm.go @@ -19,10 +19,10 @@ package core import ( "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" ) // ChainContext supports retrieving headers and consensus parameters from the @@ -51,7 +51,7 @@ func NewEVMContext(msg Message, header *types.Header, chain ChainContext, author Origin: msg.From(), Coinbase: beneficiary, BlockNumber: new(big.Int).Set(header.Number), - Time: new(big.Int).Set(header.Time), + Time: new(big.Int).SetUint64(header.Time), Difficulty: new(big.Int).Set(header.Difficulty), GasLimit: header.GasLimit, GasPrice: new(big.Int).Set(msg.GasPrice()), diff --git a/core/forkid/forkid.go b/core/forkid/forkid.go new file mode 100644 index 000000000000..e433db44608c --- /dev/null +++ b/core/forkid/forkid.go @@ -0,0 +1,246 @@ +// Copyright 2019 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 forkid implements EIP-2124 (https://eips.ethereum.org/EIPS/eip-2124). +package forkid + +import ( + "encoding/binary" + "errors" + "hash/crc32" + "math" + "math/big" + "reflect" + "strings" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" +) + +var ( + // ErrRemoteStale is returned by the validator if a remote fork checksum is a + // subset of our already applied forks, but the announced next fork block is + // not on our already passed chain. + ErrRemoteStale = errors.New("remote needs update") + + // ErrLocalIncompatibleOrStale is returned by the validator if a remote fork + // checksum does not match any local checksum variation, signalling that the + // two chains have diverged in the past at some point (possibly at genesis). + ErrLocalIncompatibleOrStale = errors.New("local incompatible or needs update") +) + +// ID is a fork identifier as defined by EIP-2124. +type ID struct { + Hash [4]byte // CRC32 checksum of the genesis block and passed fork block numbers + Next uint64 // Block number of the next upcoming fork, or 0 if no forks are known +} + +// Filter is a fork id filter to validate a remotely advertised ID. +type Filter func(id ID) error + +// NewID calculates the Ethereum fork ID from the chain config and head. +func NewID(chain *core.BlockChain) ID { + return newID( + chain.Config(), + chain.Genesis().Hash(), + chain.CurrentHeader().Number.Uint64(), + ) +} + +// newID is the internal version of NewID, which takes extracted values as its +// arguments instead of a chain. The reason is to allow testing the IDs without +// having to simulate an entire blockchain. +func newID(config *params.ChainConfig, genesis common.Hash, head uint64) ID { + // Calculate the starting checksum from the genesis hash + hash := crc32.ChecksumIEEE(genesis[:]) + + // Calculate the current fork checksum and the next fork block + var next uint64 + for _, fork := range gatherForks(config) { + if fork <= head { + // Fork already passed, checksum the previous hash and the fork number + hash = checksumUpdate(hash, fork) + continue + } + next = fork + break + } + return ID{Hash: checksumToBytes(hash), Next: next} +} + +// NewFilter creates a filter that returns if a fork ID should be rejected or not +// based on the local chain's status. +func NewFilter(chain *core.BlockChain) Filter { + return newFilter( + chain.Config(), + chain.Genesis().Hash(), + func() uint64 { + return chain.CurrentHeader().Number.Uint64() + }, + ) +} + +// NewStaticFilter creates a filter at block zero. +func NewStaticFilter(config *params.ChainConfig, genesis common.Hash) Filter { + head := func() uint64 { return 0 } + return newFilter(config, genesis, head) +} + +// newFilter is the internal version of NewFilter, taking closures as its arguments +// instead of a chain. The reason is to allow testing it without having to simulate +// an entire blockchain. +func newFilter(config *params.ChainConfig, genesis common.Hash, headfn func() uint64) Filter { + // Calculate the all the valid fork hash and fork next combos + var ( + forks = gatherForks(config) + sums = make([][4]byte, len(forks)+1) // 0th is the genesis + ) + hash := crc32.ChecksumIEEE(genesis[:]) + sums[0] = checksumToBytes(hash) + for i, fork := range forks { + hash = checksumUpdate(hash, fork) + sums[i+1] = checksumToBytes(hash) + } + // Add two sentries to simplify the fork checks and don't require special + // casing the last one. + forks = append(forks, math.MaxUint64) // Last fork will never be passed + + // Create a validator that will filter out incompatible chains + return func(id ID) error { + // Run the fork checksum validation ruleset: + // 1. If local and remote FORK_CSUM matches, compare local head to FORK_NEXT. + // The two nodes are in the same fork state currently. They might know + // of differing future forks, but that's not relevant until the fork + // triggers (might be postponed, nodes might be updated to match). + // 1a. A remotely announced but remotely not passed block is already passed + // locally, disconnect, since the chains are incompatible. + // 1b. No remotely announced fork; or not yet passed locally, connect. + // 2. If the remote FORK_CSUM is a subset of the local past forks and the + // remote FORK_NEXT matches with the locally following fork block number, + // connect. + // Remote node is currently syncing. It might eventually diverge from + // us, but at this current point in time we don't have enough information. + // 3. If the remote FORK_CSUM is a superset of the local past forks and can + // be completed with locally known future forks, connect. + // Local node is currently syncing. It might eventually diverge from + // the remote, but at this current point in time we don't have enough + // information. + // 4. Reject in all other cases. + head := headfn() + for i, fork := range forks { + // If our head is beyond this fork, continue to the next (we have a dummy + // fork of maxuint64 as the last item to always fail this check eventually). + if head > fork { + continue + } + // Found the first unpassed fork block, check if our current state matches + // the remote checksum (rule #1). + if sums[i] == id.Hash { + // Fork checksum matched, check if a remote future fork block already passed + // locally without the local node being aware of it (rule #1a). + if id.Next > 0 && head >= id.Next { + return ErrLocalIncompatibleOrStale + } + // Haven't passed locally a remote-only fork, accept the connection (rule #1b). + return nil + } + // The local and remote nodes are in different forks currently, check if the + // remote checksum is a subset of our local forks (rule #2). + for j := 0; j < i; j++ { + if sums[j] == id.Hash { + // Remote checksum is a subset, validate based on the announced next fork + if forks[j] != id.Next { + return ErrRemoteStale + } + return nil + } + } + // Remote chain is not a subset of our local one, check if it's a superset by + // any chance, signalling that we're simply out of sync (rule #3). + for j := i + 1; j < len(sums); j++ { + if sums[j] == id.Hash { + // Yay, remote checksum is a superset, ignore upcoming forks + return nil + } + } + // No exact, subset or superset match. We are on differing chains, reject. + return ErrLocalIncompatibleOrStale + } + log.Error("Impossible fork ID validation", "id", id) + return nil // Something's very wrong, accept rather than reject + } +} + +// checksumUpdate calculates the next IEEE CRC32 checksum based on the previous +// one and a fork block number (equivalent to CRC32(original-blob || fork)). +func checksumUpdate(hash uint32, fork uint64) uint32 { + var blob [8]byte + binary.BigEndian.PutUint64(blob[:], fork) + return crc32.Update(hash, crc32.IEEETable, blob[:]) +} + +// checksumToBytes converts a uint32 checksum into a [4]byte array. +func checksumToBytes(hash uint32) [4]byte { + var blob [4]byte + binary.BigEndian.PutUint32(blob[:], hash) + return blob +} + +// gatherForks gathers all the known forks and creates a sorted list out of them. +func gatherForks(config *params.ChainConfig) []uint64 { + // Gather all the fork block numbers via reflection + kind := reflect.TypeOf(params.ChainConfig{}) + conf := reflect.ValueOf(config).Elem() + + var forks []uint64 + for i := 0; i < kind.NumField(); i++ { + // Fetch the next field and skip non-fork rules + field := kind.Field(i) + if !strings.HasSuffix(field.Name, "Block") { + continue + } + if field.Type != reflect.TypeOf(new(big.Int)) { + continue + } + // Extract the fork rule block number and aggregate it + rule := conf.Field(i).Interface().(*big.Int) + if rule != nil { + forks = append(forks, rule.Uint64()) + } + } + // Sort the fork block numbers to permit chronologival XOR + for i := 0; i < len(forks); i++ { + for j := i + 1; j < len(forks); j++ { + if forks[i] > forks[j] { + forks[i], forks[j] = forks[j], forks[i] + } + } + } + // Deduplicate block numbers applying multiple forks + for i := 1; i < len(forks); i++ { + if forks[i] == forks[i-1] { + forks = append(forks[:i], forks[i+1:]...) + i-- + } + } + // Skip any forks in block 0, that's the genesis ruleset + if len(forks) > 0 && forks[0] == 0 { + forks = forks[1:] + } + return forks +} diff --git a/core/forkid/forkid_test.go b/core/forkid/forkid_test.go new file mode 100644 index 000000000000..f3364c3d6964 --- /dev/null +++ b/core/forkid/forkid_test.go @@ -0,0 +1,227 @@ +// Copyright 2019 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 forkid + +import ( + "bytes" + "math" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" +) + +// TestCreation tests that different genesis and fork rule combinations result in +// the correct fork ID. +func TestCreation(t *testing.T) { + type testcase struct { + head uint64 + want ID + } + tests := []struct { + config *params.ChainConfig + genesis common.Hash + cases []testcase + }{ + // Mainnet test cases + { + params.MainnetChainConfig, + params.MainnetGenesisHash, + []testcase{ + {0, ID{Hash: checksumToBytes(0xfc64ec04), Next: 1150000}}, // Unsynced + {1149999, ID{Hash: checksumToBytes(0xfc64ec04), Next: 1150000}}, // Last Frontier block + {1150000, ID{Hash: checksumToBytes(0x97c2c34c), Next: 1920000}}, // First Homestead block + {1919999, ID{Hash: checksumToBytes(0x97c2c34c), Next: 1920000}}, // Last Homestead block + {1920000, ID{Hash: checksumToBytes(0x91d1f948), Next: 2463000}}, // First DAO block + {2462999, ID{Hash: checksumToBytes(0x91d1f948), Next: 2463000}}, // Last DAO block + {2463000, ID{Hash: checksumToBytes(0x7a64da13), Next: 2675000}}, // First Tangerine block + {2674999, ID{Hash: checksumToBytes(0x7a64da13), Next: 2675000}}, // Last Tangerine block + {2675000, ID{Hash: checksumToBytes(0x3edd5b10), Next: 4370000}}, // First Spurious block + {4369999, ID{Hash: checksumToBytes(0x3edd5b10), Next: 4370000}}, // Last Spurious block + {4370000, ID{Hash: checksumToBytes(0xa00bc324), Next: 7280000}}, // First Byzantium block + {7279999, ID{Hash: checksumToBytes(0xa00bc324), Next: 7280000}}, // Last Byzantium block + {7280000, ID{Hash: checksumToBytes(0x668db0af), Next: 9069000}}, // First and last Constantinople, first Petersburg block + {9068999, ID{Hash: checksumToBytes(0x668db0af), Next: 9069000}}, // Last Petersburg block + {9069000, ID{Hash: checksumToBytes(0x879d6e30), Next: 9200000}}, // First Istanbul and first Muir Glacier block + {9199999, ID{Hash: checksumToBytes(0x879d6e30), Next: 9200000}}, // Last Istanbul and first Muir Glacier block + {9200000, ID{Hash: checksumToBytes(0xe029e991), Next: 0}}, // First Muir Glacier block + {10000000, ID{Hash: checksumToBytes(0xe029e991), Next: 0}}, // Future Muir Glacier block + }, + }, + // Ropsten test cases + { + params.TestnetChainConfig, + params.TestnetGenesisHash, + []testcase{ + {0, ID{Hash: checksumToBytes(0x30c7ddbc), Next: 10}}, // Unsynced, last Frontier, Homestead and first Tangerine block + {9, ID{Hash: checksumToBytes(0x30c7ddbc), Next: 10}}, // Last Tangerine block + {10, ID{Hash: checksumToBytes(0x63760190), Next: 1700000}}, // First Spurious block + {1699999, ID{Hash: checksumToBytes(0x63760190), Next: 1700000}}, // Last Spurious block + {1700000, ID{Hash: checksumToBytes(0x3ea159c7), Next: 4230000}}, // First Byzantium block + {4229999, ID{Hash: checksumToBytes(0x3ea159c7), Next: 4230000}}, // Last Byzantium block + {4230000, ID{Hash: checksumToBytes(0x97b544f3), Next: 4939394}}, // First Constantinople block + {4939393, ID{Hash: checksumToBytes(0x97b544f3), Next: 4939394}}, // Last Constantinople block + {4939394, ID{Hash: checksumToBytes(0xd6e2149b), Next: 6485846}}, // First Petersburg block + {6485845, ID{Hash: checksumToBytes(0xd6e2149b), Next: 6485846}}, // Last Petersburg block + {6485846, ID{Hash: checksumToBytes(0x4bc66396), Next: 7117117}}, // First Istanbul block + {7117116, ID{Hash: checksumToBytes(0x4bc66396), Next: 7117117}}, // Last Istanbul block + {7117117, ID{Hash: checksumToBytes(0x6727ef90), Next: 0}}, // First Muir Glacier block + {7500000, ID{Hash: checksumToBytes(0x6727ef90), Next: 0}}, // Future + }, + }, + // Rinkeby test cases + { + params.RinkebyChainConfig, + params.RinkebyGenesisHash, + []testcase{ + {0, ID{Hash: checksumToBytes(0x3b8e0691), Next: 1}}, // Unsynced, last Frontier block + {1, ID{Hash: checksumToBytes(0x60949295), Next: 2}}, // First and last Homestead block + {2, ID{Hash: checksumToBytes(0x8bde40dd), Next: 3}}, // First and last Tangerine block + {3, ID{Hash: checksumToBytes(0xcb3a64bb), Next: 1035301}}, // First Spurious block + {1035300, ID{Hash: checksumToBytes(0xcb3a64bb), Next: 1035301}}, // Last Spurious block + {1035301, ID{Hash: checksumToBytes(0x8d748b57), Next: 3660663}}, // First Byzantium block + {3660662, ID{Hash: checksumToBytes(0x8d748b57), Next: 3660663}}, // Last Byzantium block + {3660663, ID{Hash: checksumToBytes(0xe49cab14), Next: 4321234}}, // First Constantinople block + {4321233, ID{Hash: checksumToBytes(0xe49cab14), Next: 4321234}}, // Last Constantinople block + {4321234, ID{Hash: checksumToBytes(0xafec6b27), Next: 5435345}}, // First Petersburg block + {5435344, ID{Hash: checksumToBytes(0xafec6b27), Next: 5435345}}, // Last Petersburg block + {5435345, ID{Hash: checksumToBytes(0xcbdb8838), Next: 0}}, // First Istanbul block + {6000000, ID{Hash: checksumToBytes(0xcbdb8838), Next: 0}}, // Future Istanbul block + }, + }, + // Goerli test cases + { + params.GoerliChainConfig, + params.GoerliGenesisHash, + []testcase{ + {0, ID{Hash: checksumToBytes(0xa3f5ab08), Next: 1561651}}, // Unsynced, last Frontier, Homestead, Tangerine, Spurious, Byzantium, Constantinople and first Petersburg block + {1561650, ID{Hash: checksumToBytes(0xa3f5ab08), Next: 1561651}}, // Last Petersburg block + {1561651, ID{Hash: checksumToBytes(0xc25efa5c), Next: 0}}, // First Istanbul block + {2000000, ID{Hash: checksumToBytes(0xc25efa5c), Next: 0}}, // Future Istanbul block + }, + }, + } + for i, tt := range tests { + for j, ttt := range tt.cases { + if have := newID(tt.config, tt.genesis, ttt.head); have != ttt.want { + t.Errorf("test %d, case %d: fork ID mismatch: have %x, want %x", i, j, have, ttt.want) + } + } + } +} + +// TestValidation tests that a local peer correctly validates and accepts a remote +// fork ID. +func TestValidation(t *testing.T) { + tests := []struct { + head uint64 + id ID + err error + }{ + // Local is mainnet Petersburg, remote announces the same. No future fork is announced. + {7987396, ID{Hash: checksumToBytes(0x668db0af), Next: 0}, nil}, + + // Local is mainnet Petersburg, remote announces the same. Remote also announces a next fork + // at block 0xffffffff, but that is uncertain. + {7987396, ID{Hash: checksumToBytes(0x668db0af), Next: math.MaxUint64}, nil}, + + // Local is mainnet currently in Byzantium only (so it's aware of Petersburg), remote announces + // also Byzantium, but it's not yet aware of Petersburg (e.g. non updated node before the fork). + // In this case we don't know if Petersburg passed yet or not. + {7279999, ID{Hash: checksumToBytes(0xa00bc324), Next: 0}, nil}, + + // Local is mainnet currently in Byzantium only (so it's aware of Petersburg), remote announces + // also Byzantium, and it's also aware of Petersburg (e.g. updated node before the fork). We + // don't know if Petersburg passed yet (will pass) or not. + {7279999, ID{Hash: checksumToBytes(0xa00bc324), Next: 7280000}, nil}, + + // Local is mainnet currently in Byzantium only (so it's aware of Petersburg), remote announces + // also Byzantium, and it's also aware of some random fork (e.g. misconfigured Petersburg). As + // neither forks passed at neither nodes, they may mismatch, but we still connect for now. + {7279999, ID{Hash: checksumToBytes(0xa00bc324), Next: math.MaxUint64}, nil}, + + // Local is mainnet Petersburg, remote announces Byzantium + knowledge about Petersburg. Remote + // is simply out of sync, accept. + {7987396, ID{Hash: checksumToBytes(0xa00bc324), Next: 7280000}, nil}, + + // Local is mainnet Petersburg, remote announces Spurious + knowledge about Byzantium. Remote + // is definitely out of sync. It may or may not need the Petersburg update, we don't know yet. + {7987396, ID{Hash: checksumToBytes(0x3edd5b10), Next: 4370000}, nil}, + + // Local is mainnet Byzantium, remote announces Petersburg. Local is out of sync, accept. + {7279999, ID{Hash: checksumToBytes(0x668db0af), Next: 0}, nil}, + + // Local is mainnet Spurious, remote announces Byzantium, but is not aware of Petersburg. Local + // out of sync. Local also knows about a future fork, but that is uncertain yet. + {4369999, ID{Hash: checksumToBytes(0xa00bc324), Next: 0}, nil}, + + // Local is mainnet Petersburg. remote announces Byzantium but is not aware of further forks. + // Remote needs software update. + {7987396, ID{Hash: checksumToBytes(0xa00bc324), Next: 0}, ErrRemoteStale}, + + // Local is mainnet Petersburg, and isn't aware of more forks. Remote announces Petersburg + + // 0xffffffff. Local needs software update, reject. + {7987396, ID{Hash: checksumToBytes(0x5cddc0e1), Next: 0}, ErrLocalIncompatibleOrStale}, + + // Local is mainnet Byzantium, and is aware of Petersburg. Remote announces Petersburg + + // 0xffffffff. Local needs software update, reject. + {7279999, ID{Hash: checksumToBytes(0x5cddc0e1), Next: 0}, ErrLocalIncompatibleOrStale}, + + // Local is mainnet Petersburg, remote is Rinkeby Petersburg. + {7987396, ID{Hash: checksumToBytes(0xafec6b27), Next: 0}, ErrLocalIncompatibleOrStale}, + + // Local is mainnet Muir Glacier, far in the future. Remote announces Gopherium (non existing fork) + // at some future block 88888888, for itself, but past block for local. Local is incompatible. + // + // This case detects non-upgraded nodes with majority hash power (typical Ropsten mess). + {88888888, ID{Hash: checksumToBytes(0xe029e991), Next: 88888888}, ErrLocalIncompatibleOrStale}, + + // Local is mainnet Byzantium. Remote is also in Byzantium, but announces Gopherium (non existing + // fork) at block 7279999, before Petersburg. Local is incompatible. + {7279999, ID{Hash: checksumToBytes(0xa00bc324), Next: 7279999}, ErrLocalIncompatibleOrStale}, + } + for i, tt := range tests { + filter := newFilter(params.MainnetChainConfig, params.MainnetGenesisHash, func() uint64 { return tt.head }) + if err := filter(tt.id); err != tt.err { + t.Errorf("test %d: validation error mismatch: have %v, want %v", i, err, tt.err) + } + } +} + +// Tests that IDs are properly RLP encoded (specifically important because we +// use uint32 to store the hash, but we need to encode it as [4]byte). +func TestEncoding(t *testing.T) { + tests := []struct { + id ID + want []byte + }{ + {ID{Hash: checksumToBytes(0), Next: 0}, common.Hex2Bytes("c6840000000080")}, + {ID{Hash: checksumToBytes(0xdeadbeef), Next: 0xBADDCAFE}, common.Hex2Bytes("ca84deadbeef84baddcafe,")}, + {ID{Hash: checksumToBytes(math.MaxUint32), Next: math.MaxUint64}, common.Hex2Bytes("ce84ffffffff88ffffffffffffffff")}, + } + for i, tt := range tests { + have, err := rlp.EncodeToBytes(tt.id) + if err != nil { + t.Errorf("test %d: failed to encode forkid: %v", i, err) + continue + } + if !bytes.Equal(have, tt.want) { + t.Errorf("test %d: RLP mismatch: have %x, want %x", i, have, tt.want) + } + } +} diff --git a/core/gen_genesis.go b/core/gen_genesis.go index a3bb2ed21f98..bb8ea1d6a239 100644 --- a/core/gen_genesis.go +++ b/core/gen_genesis.go @@ -7,10 +7,10 @@ import ( "errors" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/params" ) var _ = (*genesisSpecMarshaling)(nil) diff --git a/core/gen_genesis_account.go b/core/gen_genesis_account.go index 393182158c8d..64fb9b9248f9 100644 --- a/core/gen_genesis_account.go +++ b/core/gen_genesis_account.go @@ -7,9 +7,9 @@ import ( "errors" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" ) var _ = (*genesisAccountMarshaling)(nil) diff --git a/core/genesis.go b/core/genesis.go index 623dca4a6281..e9d198f3aa95 100644 --- a/core/genesis.go +++ b/core/genesis.go @@ -25,16 +25,17 @@ import ( "math/big" "strings" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" ) //go:generate gencodec -type Genesis -field-override genesisSpecMarshaling -out gen_genesis.go @@ -134,7 +135,7 @@ type GenesisMismatchError struct { } func (e *GenesisMismatchError) Error() string { - return fmt.Sprintf("database already contains an incompatible genesis block (have %x, new %x)", e.Stored[:8], e.New[:8]) + return fmt.Sprintf("database contains incompatible genesis (have %x, new %x)", e.Stored, e.New) } // SetupGenesisBlock writes or updates the genesis block in db. @@ -151,13 +152,13 @@ func (e *GenesisMismatchError) Error() string { // // The returned chain configuration is never nil. func SetupGenesisBlock(db ethdb.Database, genesis *Genesis) (*params.ChainConfig, common.Hash, error) { - return SetupGenesisBlockWithOverride(db, genesis, nil) + return SetupGenesisBlockWithOverride(db, genesis, nil, nil) } -func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, constantinopleOverride *big.Int) (*params.ChainConfig, common.Hash, error) { + +func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, overrideIstanbul, overrideMuirGlacier *big.Int) (*params.ChainConfig, common.Hash, error) { if genesis != nil && genesis.Config == nil { return params.AllEthashProtocolChanges, common.Hash{}, errGenesisNoConfig } - // Just commit the new block if there is no stored genesis block. stored := rawdb.ReadCanonicalHash(db, 0) if (stored == common.Hash{}) { @@ -168,7 +169,29 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, constant log.Info("Writing custom genesis block") } block, err := genesis.Commit(db) - return genesis.Config, block.Hash(), err + if err != nil { + return genesis.Config, common.Hash{}, err + } + return genesis.Config, block.Hash(), nil + } + + // We have the genesis block in database(perhaps in ancient database) + // but the corresponding state is missing. + header := rawdb.ReadHeader(db, stored, 0) + if _, err := state.New(header.Root, state.NewDatabaseWithCache(db, 0)); err != nil { + if genesis == nil { + genesis = DefaultGenesisBlock() + } + // Ensure the stored genesis matches with the given one. + hash := genesis.ToBlock(nil).Hash() + if hash != stored { + return genesis.Config, hash, &GenesisMismatchError{stored, hash} + } + block, err := genesis.Commit(db) + if err != nil { + return genesis.Config, hash, err + } + return genesis.Config, block.Hash(), nil } // Check whether the genesis block is already written. @@ -181,8 +204,14 @@ func SetupGenesisBlockWithOverride(db ethdb.Database, genesis *Genesis, constant // Get the existing chain configuration. newcfg := genesis.configOrDefault(stored) - if constantinopleOverride != nil { - newcfg.ConstantinopleBlock = constantinopleOverride + if overrideIstanbul != nil { + newcfg.IstanbulBlock = overrideIstanbul + } + if overrideMuirGlacier != nil { + newcfg.MuirGlacierBlock = overrideMuirGlacier + } + if err := newcfg.CheckConfigForkOrder(); err != nil { + return newcfg, common.Hash{}, err } storedcfg := rawdb.ReadChainConfig(db, stored) if storedcfg == nil { @@ -228,7 +257,7 @@ func (g *Genesis) configOrDefault(ghash common.Hash) *params.ChainConfig { // to the given database (or discards it if nil). func (g *Genesis) ToBlock(db ethdb.Database) *types.Block { if db == nil { - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() } statedb, _ := state.New(common.Hash{}, state.NewDatabase(db)) for addr, account := range g.Alloc { @@ -243,7 +272,7 @@ func (g *Genesis) ToBlock(db ethdb.Database) *types.Block { head := &types.Header{ Number: new(big.Int).SetUint64(g.Number), Nonce: types.EncodeNonce(g.Nonce), - Time: new(big.Int).SetUint64(g.Timestamp), + Time: g.Timestamp, ParentHash: g.ParentHash, Extra: g.ExtraData, GasLimit: g.GasLimit, @@ -272,17 +301,20 @@ func (g *Genesis) Commit(db ethdb.Database) (*types.Block, error) { if block.Number().Sign() != 0 { return nil, fmt.Errorf("can't commit genesis block with number > 0") } + config := g.Config + if config == nil { + config = params.AllEthashProtocolChanges + } + if err := config.CheckConfigForkOrder(); err != nil { + return nil, err + } rawdb.WriteTd(db, block.Hash(), block.NumberU64(), g.Difficulty) rawdb.WriteBlock(db, block) rawdb.WriteReceipts(db, block.Hash(), block.NumberU64(), nil) rawdb.WriteCanonicalHash(db, block.Hash(), block.NumberU64()) rawdb.WriteHeadBlockHash(db, block.Hash()) + rawdb.WriteHeadFastBlockHash(db, block.Hash()) rawdb.WriteHeadHeaderHash(db, block.Hash()) - - config := g.Config - if config == nil { - config = params.AllEthashProtocolChanges - } rawdb.WriteChainConfig(db, block.Hash(), config) return block, nil } @@ -345,6 +377,18 @@ func DefaultRinkebyGenesisBlock() *Genesis { } } +// DefaultGoerliGenesisBlock returns the Görli network genesis block. +func DefaultGoerliGenesisBlock() *Genesis { + return &Genesis{ + Config: params.GoerliChainConfig, + Timestamp: 1548854791, + ExtraData: hexutil.MustDecode("0x22466c6578692069732061207468696e6722202d204166726900000000000000e0a2bd4258d2768837baa26a28fe71dc079f84c70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), + GasLimit: 10485760, + Difficulty: big.NewInt(1), + Alloc: decodePrealloc(goerliAllocData), + } +} + // DeveloperGenesisBlock returns the 'geth --dev' genesis block. Note, this must // be seeded with the func DeveloperGenesisBlock(period uint64, faucet common.Address) *Genesis { @@ -355,7 +399,7 @@ func DeveloperGenesisBlock(period uint64, faucet common.Address) *Genesis { // Assemble and return the genesis with the precompiles and faucet pre-funded return &Genesis{ Config: &config, - ExtraData: append(append(make([]byte, 32), faucet[:]...), make([]byte, 65)...), + ExtraData: append(append(make([]byte, 32), faucet[:]...), make([]byte, crypto.SignatureLength)...), GasLimit: 6283185, Difficulty: big.NewInt(1), Alloc: map[common.Address]GenesisAccount{ diff --git a/core/genesis_alloc.go b/core/genesis_alloc.go index bda07e1bc7ed..9af5b05e9dd0 100644 --- a/core/genesis_alloc.go +++ b/core/genesis_alloc.go @@ -24,3 +24,4 @@ package core const mainnetAllocData = "\xe3\u250b\xb5\x8f|a\x94\x02\n\xafr\xc6\xd6%E}\x93\x9aAL\xf5\x8c\x0fj7&\x86+\x11\xd8'\xd4\x00\x00" const testnetAllocData = "\xe4\xe3\x94>\x11\x9eI\u06b3.~O\u030d\xe5=\x96J\x952\x90*\xf1\x8d\x01C\x1e\x0f\xaemr\x17\u029f\xff\xff\xff" 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 goerliAllocData = "\xf9\x04\x06\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\xe0\x94L*\xe4\x82Y5\x05\xf0\x16<\xde\xfc\a>\x81\xc6<\xdaA\a\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe0\x94\xa8\xe8\xf1G2e\x8eKQ\xe8q\x191\x05:\x8ai\xba\xf2\xb1\x8a\x15-\x02\xc7\xe1J\xf6\x80\x00\x00\xe1\x94\u0665\x17\x9f\t\x1d\x85\x05\x1d<\x98'\x85\xef\xd1E\\\uc199\x8b\bE\x95\x16\x14\x01HJ\x00\x00\x00\xe1\x94\u08bdBX\xd2v\x887\xba\xa2j(\xfeq\xdc\a\x9f\x84\u01cbJG\xe3\xc1$H\xf4\xad\x00\x00\x00" diff --git a/core/genesis_test.go b/core/genesis_test.go index c7ce7ce4acf1..c6bcd0aa54bd 100644 --- a/core/genesis_test.go +++ b/core/genesis_test.go @@ -22,12 +22,12 @@ import ( "testing" "github.com/davecgh/go-spew/spew" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/params" ) func TestDefaultGenesisBlock(t *testing.T) { @@ -141,7 +141,7 @@ func TestSetupGenesis(t *testing.T) { } for _, test := range tests { - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() config, hash, err := test.fn(db) // Check the return values. if !reflect.DeepEqual(err, test.wantErr) { diff --git a/core/headerchain.go b/core/headerchain.go index bcf2f956e4c2..4682069cff0c 100644 --- a/core/headerchain.go +++ b/core/headerchain.go @@ -26,14 +26,14 @@ import ( "sync/atomic" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/params" - "github.com/hashicorp/golang-lru" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + lru "github.com/hashicorp/golang-lru" ) const ( @@ -104,6 +104,7 @@ func NewHeaderChain(chainDb ethdb.Database, config *params.ChainConfig, engine c } } hc.currentHeaderHash = hc.CurrentHeader().Hash() + headHeaderGauge.Update(hc.CurrentHeader().Number.Int64()) return hc, nil } @@ -185,12 +186,12 @@ func (hc *HeaderChain) WriteHeader(header *types.Header) (status WriteStatus, er hc.currentHeaderHash = hash hc.currentHeader.Store(types.CopyHeader(header)) + headHeaderGauge.Update(header.Number.Int64()) status = CanonStatTy } else { status = SideStatTy } - hc.headerCache.Add(hash, header) hc.numberCache.Add(hash, number) @@ -219,14 +220,18 @@ func (hc *HeaderChain) ValidateHeaderChain(chain []*types.Header, checkFreq int) // Generate the list of seal verification requests, and start the parallel verifier seals := make([]bool, len(chain)) - for i := 0; i < len(seals)/checkFreq; i++ { - index := i*checkFreq + hc.rand.Intn(checkFreq) - if index >= len(seals) { - index = len(seals) - 1 + if checkFreq != 0 { + // In case of checkFreq == 0 all seals are left false. + for i := 0; i < len(seals)/checkFreq; i++ { + index := i*checkFreq + hc.rand.Intn(checkFreq) + if index >= len(seals) { + index = len(seals) - 1 + } + seals[index] = true } - seals[index] = true + // Last should always be verified to avoid junk. + seals[len(seals)-1] = true } - seals[len(seals)-1] = true // Last should always be verified to avoid junk abort, results := hc.engine.VerifyHeaders(hc, chain, seals) defer close(abort) @@ -270,9 +275,14 @@ 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.HasHeader(header.Hash(), header.Number.Uint64()) { - stats.ignored++ - continue + hash := header.Hash() + if hc.HasHeader(hash, header.Number.Uint64()) { + externTd := hc.GetTd(hash, header.Number.Uint64()) + localTd := hc.GetTd(hc.currentHeaderHash, hc.CurrentHeader().Number.Uint64()) + if externTd == nil || externTd.Cmp(localTd) <= 0 { + stats.ignored++ + continue + } } if err := writeHeader(header); err != nil { return i, err @@ -286,7 +296,7 @@ func (hc *HeaderChain) InsertHeaderChain(chain []*types.Header, writeHeader WhCa "count", stats.processed, "elapsed", common.PrettyDuration(time.Since(start)), "number", last.Number, "hash", last.Hash(), } - if timestamp := time.Unix(last.Time.Int64(), 0); time.Since(timestamp) > time.Minute { + if timestamp := time.Unix(int64(last.Time), 0); time.Since(timestamp) > time.Minute { context = append(context, []interface{}{"age", common.PrettyAge(timestamp)}...) } if stats.ignored > 0 { @@ -339,8 +349,11 @@ func (hc *HeaderChain) GetAncestor(hash common.Hash, number, ancestor uint64, ma } for ancestor != 0 { if rawdb.ReadCanonicalHash(hc.chainDb, number) == hash { - number -= ancestor - return rawdb.ReadCanonicalHash(hc.chainDb, number), number + ancestorHash := rawdb.ReadCanonicalHash(hc.chainDb, number-ancestor) + if rawdb.ReadCanonicalHash(hc.chainDb, number) == hash { + number -= ancestor + return ancestorHash, number + } } if *maxNonCanonical == 0 { return common.Hash{}, 0 @@ -435,6 +448,10 @@ func (hc *HeaderChain) GetHeaderByNumber(number uint64) *types.Header { return hc.GetHeader(hash, number) } +func (hc *HeaderChain) GetCanonicalHash(number uint64) common.Hash { + return rawdb.ReadCanonicalHash(hc.chainDb, number) +} + // CurrentHeader retrieves the current head header of the canonical chain. The // header is retrieved from the HeaderChain's internal cache. func (hc *HeaderChain) CurrentHeader() *types.Header { @@ -447,35 +464,60 @@ func (hc *HeaderChain) SetCurrentHeader(head *types.Header) { hc.currentHeader.Store(head) hc.currentHeaderHash = head.Hash() + headHeaderGauge.Update(head.Number.Int64()) } -// DeleteCallback is a callback function that is called by SetHead before -// each header is deleted. -type DeleteCallback func(rawdb.DatabaseDeleter, common.Hash, uint64) +type ( + // UpdateHeadBlocksCallback is a callback function that is called by SetHead + // before head header is updated. + UpdateHeadBlocksCallback func(ethdb.KeyValueWriter, *types.Header) + + // DeleteBlockContentCallback is a callback function that is called by SetHead + // before each header is deleted. + DeleteBlockContentCallback func(ethdb.KeyValueWriter, common.Hash, uint64) +) // SetHead rewinds the local chain to a new head. Everything above the new head // will be deleted and the new one set. -func (hc *HeaderChain) SetHead(head uint64, delFn DeleteCallback) { - height := uint64(0) - - if hdr := hc.CurrentHeader(); hdr != nil { - height = hdr.Number.Uint64() - } - batch := hc.chainDb.NewBatch() +func (hc *HeaderChain) SetHead(head uint64, updateFn UpdateHeadBlocksCallback, delFn DeleteBlockContentCallback) { + var ( + parentHash common.Hash + batch = hc.chainDb.NewBatch() + ) for hdr := hc.CurrentHeader(); hdr != nil && hdr.Number.Uint64() > head; hdr = hc.CurrentHeader() { - hash := hdr.Hash() - num := hdr.Number.Uint64() + hash, num := hdr.Hash(), hdr.Number.Uint64() + + // Rewind block chain to new head. + parent := hc.GetHeader(hdr.ParentHash, num-1) + if parent == nil { + parent = hc.genesisHeader + } + parentHash = hdr.ParentHash + // Notably, since geth has the possibility for setting the head to a low + // height which is even lower than ancient head. + // In order to ensure that the head is always no higher than the data in + // the database(ancient store or active store), we need to update head + // first then remove the relative data from the database. + // + // Update head first(head fast block, head full block) before deleting the data. + if updateFn != nil { + updateFn(hc.chainDb, parent) + } + // Update head header then. + rawdb.WriteHeadHeaderHash(hc.chainDb, parentHash) + + // Remove the relative data from the database. if delFn != nil { delFn(batch, hash, num) } + // Rewind header chain to new head. rawdb.DeleteHeader(batch, hash, num) rawdb.DeleteTd(batch, hash, num) + rawdb.DeleteCanonicalHash(batch, num) - hc.currentHeader.Store(hc.GetHeader(hdr.ParentHash, hdr.Number.Uint64()-1)) - } - // Roll back the canonical chain numbering - for i := height; i > head; i-- { - rawdb.DeleteCanonicalHash(batch, i) + hc.currentHeader.Store(parent) + hc.currentHeaderHash = parentHash + headHeaderGauge.Update(parent.Number.Int64()) } batch.Write() @@ -483,13 +525,6 @@ func (hc *HeaderChain) SetHead(head uint64, delFn DeleteCallback) { hc.headerCache.Purge() hc.tdCache.Purge() hc.numberCache.Purge() - - if hc.CurrentHeader() == nil { - hc.currentHeader.Store(hc.genesisHeader) - } - hc.currentHeaderHash = hc.CurrentHeader().Hash() - - rawdb.WriteHeadHeaderHash(hc.chainDb, hc.currentHeaderHash) } // SetGenesis sets a new genesis block header for the chain diff --git a/core/helper_test.go b/core/helper_test.go deleted file mode 100644 index 16038fc1faac..000000000000 --- a/core/helper_test.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package core - -import ( - "container/list" - - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" -) - -// Implement our EthTest Manager -type TestManager struct { - // stateManager *StateManager - eventMux *event.TypeMux - - db ethdb.Database - txPool *TxPool - blockChain *BlockChain - Blocks []*types.Block -} - -func (tm *TestManager) IsListening() bool { - return false -} - -func (tm *TestManager) IsMining() bool { - return false -} - -func (tm *TestManager) PeerCount() int { - return 0 -} - -func (tm *TestManager) Peers() *list.List { - return list.New() -} - -func (tm *TestManager) BlockChain() *BlockChain { - return tm.blockChain -} - -func (tm *TestManager) TxPool() *TxPool { - return tm.txPool -} - -// func (tm *TestManager) StateManager() *StateManager { -// return tm.stateManager -// } - -func (tm *TestManager) EventMux() *event.TypeMux { - return tm.eventMux -} - -// func (tm *TestManager) KeyManager() *crypto.KeyManager { -// return nil -// } - -func (tm *TestManager) Db() ethdb.Database { - return tm.db -} - -func NewTestManager() *TestManager { - testManager := &TestManager{} - testManager.eventMux = new(event.TypeMux) - testManager.db = ethdb.NewMemDatabase() - // testManager.txPool = NewTxPool(testManager) - // testManager.blockChain = NewBlockChain(testManager) - // testManager.stateManager = NewStateManager(testManager) - return testManager -} diff --git a/core/mkalloc.go b/core/mkalloc.go index 41599b9371be..5118a4fcb327 100644 --- a/core/mkalloc.go +++ b/core/mkalloc.go @@ -34,8 +34,8 @@ import ( "sort" "strconv" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/rlp" ) type allocItem struct{ Addr, Balance *big.Int } @@ -52,7 +52,8 @@ func makelist(g *core.Genesis) allocList { if len(account.Storage) > 0 || len(account.Code) > 0 || account.Nonce != 0 { panic(fmt.Sprintf("can't encode account %x", addr)) } - a = append(a, allocItem{addr.Big(), account.Balance}) + bigAddr := new(big.Int).SetBytes(addr.Bytes()) + a = append(a, allocItem{bigAddr, account.Balance}) } sort.Sort(a) return a diff --git a/core/rawdb/accessors_chain.go b/core/rawdb/accessors_chain.go index 13be8021e7d5..4d064a33903f 100644 --- a/core/rawdb/accessors_chain.go +++ b/core/rawdb/accessors_chain.go @@ -21,15 +21,28 @@ import ( "encoding/binary" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" ) // ReadCanonicalHash retrieves the hash assigned to a canonical block number. -func ReadCanonicalHash(db DatabaseReader, number uint64) common.Hash { - data, _ := db.Get(headerHashKey(number)) +func ReadCanonicalHash(db ethdb.Reader, number uint64) common.Hash { + data, _ := db.Ancient(freezerHashTable, number) + if len(data) == 0 { + data, _ = db.Get(headerHashKey(number)) + // In the background freezer is moving data from leveldb to flatten files. + // So during the first check for ancient db, the data is not yet in there, + // but when we reach into leveldb, the data was already moved. That would + // result in a not found error. + if len(data) == 0 { + data, _ = db.Ancient(freezerHashTable, number) + } + } if len(data) == 0 { return common.Hash{} } @@ -37,21 +50,38 @@ func ReadCanonicalHash(db DatabaseReader, number uint64) common.Hash { } // WriteCanonicalHash stores the hash assigned to a canonical block number. -func WriteCanonicalHash(db DatabaseWriter, hash common.Hash, number uint64) { +func WriteCanonicalHash(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { if err := db.Put(headerHashKey(number), hash.Bytes()); err != nil { log.Crit("Failed to store number to hash mapping", "err", err) } } // DeleteCanonicalHash removes the number to hash canonical mapping. -func DeleteCanonicalHash(db DatabaseDeleter, number uint64) { +func DeleteCanonicalHash(db ethdb.KeyValueWriter, number uint64) { if err := db.Delete(headerHashKey(number)); err != nil { log.Crit("Failed to delete number to hash mapping", "err", err) } } +// ReadAllHashes retrieves all the hashes assigned to blocks at a certain heights, +// both canonical and reorged forks included. +func ReadAllHashes(db ethdb.Iteratee, number uint64) []common.Hash { + prefix := headerKeyPrefix(number) + + hashes := make([]common.Hash, 0, 1) + it := db.NewIteratorWithPrefix(prefix) + defer it.Release() + + for it.Next() { + if key := it.Key(); len(key) == len(prefix)+32 { + hashes = append(hashes, common.BytesToHash(key[len(key)-32:])) + } + } + return hashes +} + // ReadHeaderNumber returns the header number assigned to a hash. -func ReadHeaderNumber(db DatabaseReader, hash common.Hash) *uint64 { +func ReadHeaderNumber(db ethdb.KeyValueReader, hash common.Hash) *uint64 { data, _ := db.Get(headerNumberKey(hash)) if len(data) != 8 { return nil @@ -60,8 +90,24 @@ func ReadHeaderNumber(db DatabaseReader, hash common.Hash) *uint64 { return &number } +// WriteHeaderNumber stores the hash->number mapping. +func WriteHeaderNumber(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { + key := headerNumberKey(hash) + enc := encodeBlockNumber(number) + if err := db.Put(key, enc); err != nil { + log.Crit("Failed to store hash to number mapping", "err", err) + } +} + +// DeleteHeaderNumber removes hash->number mapping. +func DeleteHeaderNumber(db ethdb.KeyValueWriter, hash common.Hash) { + if err := db.Delete(headerNumberKey(hash)); err != nil { + log.Crit("Failed to delete hash to number mapping", "err", err) + } +} + // ReadHeadHeaderHash retrieves the hash of the current canonical head header. -func ReadHeadHeaderHash(db DatabaseReader) common.Hash { +func ReadHeadHeaderHash(db ethdb.KeyValueReader) common.Hash { data, _ := db.Get(headHeaderKey) if len(data) == 0 { return common.Hash{} @@ -70,14 +116,14 @@ func ReadHeadHeaderHash(db DatabaseReader) common.Hash { } // WriteHeadHeaderHash stores the hash of the current canonical head header. -func WriteHeadHeaderHash(db DatabaseWriter, hash common.Hash) { +func WriteHeadHeaderHash(db ethdb.KeyValueWriter, hash common.Hash) { if err := db.Put(headHeaderKey, hash.Bytes()); err != nil { log.Crit("Failed to store last header's hash", "err", err) } } // ReadHeadBlockHash retrieves the hash of the current canonical head block. -func ReadHeadBlockHash(db DatabaseReader) common.Hash { +func ReadHeadBlockHash(db ethdb.KeyValueReader) common.Hash { data, _ := db.Get(headBlockKey) if len(data) == 0 { return common.Hash{} @@ -86,14 +132,14 @@ func ReadHeadBlockHash(db DatabaseReader) common.Hash { } // WriteHeadBlockHash stores the head block's hash. -func WriteHeadBlockHash(db DatabaseWriter, hash common.Hash) { +func WriteHeadBlockHash(db ethdb.KeyValueWriter, hash common.Hash) { if err := db.Put(headBlockKey, hash.Bytes()); err != nil { log.Crit("Failed to store last block's hash", "err", err) } } // ReadHeadFastBlockHash retrieves the hash of the current fast-sync head block. -func ReadHeadFastBlockHash(db DatabaseReader) common.Hash { +func ReadHeadFastBlockHash(db ethdb.KeyValueReader) common.Hash { data, _ := db.Get(headFastBlockKey) if len(data) == 0 { return common.Hash{} @@ -102,7 +148,7 @@ func ReadHeadFastBlockHash(db DatabaseReader) common.Hash { } // WriteHeadFastBlockHash stores the hash of the current fast-sync head block. -func WriteHeadFastBlockHash(db DatabaseWriter, hash common.Hash) { +func WriteHeadFastBlockHash(db ethdb.KeyValueWriter, hash common.Hash) { if err := db.Put(headFastBlockKey, hash.Bytes()); err != nil { log.Crit("Failed to store last fast block's hash", "err", err) } @@ -110,7 +156,7 @@ func WriteHeadFastBlockHash(db DatabaseWriter, hash common.Hash) { // ReadFastTrieProgress retrieves the number of tries nodes fast synced to allow // reporting correct numbers across restarts. -func ReadFastTrieProgress(db DatabaseReader) uint64 { +func ReadFastTrieProgress(db ethdb.KeyValueReader) uint64 { data, _ := db.Get(fastTrieProgressKey) if len(data) == 0 { return 0 @@ -120,20 +166,42 @@ func ReadFastTrieProgress(db DatabaseReader) uint64 { // WriteFastTrieProgress stores the fast sync trie process counter to support // retrieving it across restarts. -func WriteFastTrieProgress(db DatabaseWriter, count uint64) { +func WriteFastTrieProgress(db ethdb.KeyValueWriter, count uint64) { if err := db.Put(fastTrieProgressKey, new(big.Int).SetUint64(count).Bytes()); err != nil { log.Crit("Failed to store fast sync trie progress", "err", err) } } // ReadHeaderRLP retrieves a block header in its raw RLP database encoding. -func ReadHeaderRLP(db DatabaseReader, hash common.Hash, number uint64) rlp.RawValue { - data, _ := db.Get(headerKey(number, hash)) - return data +func ReadHeaderRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { + // First try to look up the data in ancient database. Extra hash + // comparison is necessary since ancient database only maintains + // the canonical data. + data, _ := db.Ancient(freezerHeaderTable, number) + if len(data) > 0 && crypto.Keccak256Hash(data) == hash { + return data + } + // Then try to look up the data in leveldb. + data, _ = db.Get(headerKey(number, hash)) + if len(data) > 0 { + return data + } + // In the background freezer is moving data from leveldb to flatten files. + // So during the first check for ancient db, the data is not yet in there, + // but when we reach into leveldb, the data was already moved. That would + // result in a not found error. + data, _ = db.Ancient(freezerHeaderTable, number) + if len(data) > 0 && crypto.Keccak256Hash(data) == hash { + return data + } + return nil // Can't find the data anywhere. } // HasHeader verifies the existence of a block header corresponding to the hash. -func HasHeader(db DatabaseReader, hash common.Hash, number uint64) bool { +func HasHeader(db ethdb.Reader, hash common.Hash, number uint64) bool { + if has, err := db.Ancient(freezerHashTable, number); err == nil && common.BytesToHash(has) == hash { + return true + } if has, err := db.Has(headerKey(number, hash)); !has || err != nil { return false } @@ -141,7 +209,7 @@ func HasHeader(db DatabaseReader, hash common.Hash, number uint64) bool { } // ReadHeader retrieves the block header corresponding to the hash. -func ReadHeader(db DatabaseReader, hash common.Hash, number uint64) *types.Header { +func ReadHeader(db ethdb.Reader, hash common.Hash, number uint64) *types.Header { data := ReadHeaderRLP(db, hash, number) if len(data) == 0 { return nil @@ -156,53 +224,84 @@ func ReadHeader(db DatabaseReader, hash common.Hash, number uint64) *types.Heade // WriteHeader stores a block header into the database and also stores the hash- // to-number mapping. -func WriteHeader(db DatabaseWriter, header *types.Header) { - // Write the hash -> number mapping +func WriteHeader(db ethdb.KeyValueWriter, header *types.Header) { var ( - hash = header.Hash() - number = header.Number.Uint64() - encoded = encodeBlockNumber(number) + hash = header.Hash() + number = header.Number.Uint64() ) - key := headerNumberKey(hash) - if err := db.Put(key, encoded); err != nil { - log.Crit("Failed to store hash to number mapping", "err", err) - } + // Write the hash -> number mapping + WriteHeaderNumber(db, hash, number) + // Write the encoded header data, err := rlp.EncodeToBytes(header) if err != nil { log.Crit("Failed to RLP encode header", "err", err) } - key = headerKey(number, hash) + key := headerKey(number, hash) if err := db.Put(key, data); err != nil { log.Crit("Failed to store header", "err", err) } } // DeleteHeader removes all block header data associated with a hash. -func DeleteHeader(db DatabaseDeleter, hash common.Hash, number uint64) { - if err := db.Delete(headerKey(number, hash)); err != nil { - log.Crit("Failed to delete header", "err", err) - } +func DeleteHeader(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { + deleteHeaderWithoutNumber(db, hash, number) if err := db.Delete(headerNumberKey(hash)); err != nil { log.Crit("Failed to delete hash to number mapping", "err", err) } } +// deleteHeaderWithoutNumber removes only the block header but does not remove +// the hash to number mapping. +func deleteHeaderWithoutNumber(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { + if err := db.Delete(headerKey(number, hash)); err != nil { + log.Crit("Failed to delete header", "err", err) + } +} + // ReadBodyRLP retrieves the block body (transactions and uncles) in RLP encoding. -func ReadBodyRLP(db DatabaseReader, hash common.Hash, number uint64) rlp.RawValue { - data, _ := db.Get(blockBodyKey(number, hash)) - return data +func ReadBodyRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { + // First try to look up the data in ancient database. Extra hash + // comparison is necessary since ancient database only maintains + // the canonical data. + data, _ := db.Ancient(freezerBodiesTable, number) + if len(data) > 0 { + h, _ := db.Ancient(freezerHashTable, number) + if common.BytesToHash(h) == hash { + return data + } + } + // Then try to look up the data in leveldb. + data, _ = db.Get(blockBodyKey(number, hash)) + if len(data) > 0 { + return data + } + // In the background freezer is moving data from leveldb to flatten files. + // So during the first check for ancient db, the data is not yet in there, + // but when we reach into leveldb, the data was already moved. That would + // result in a not found error. + data, _ = db.Ancient(freezerBodiesTable, number) + if len(data) > 0 { + h, _ := db.Ancient(freezerHashTable, number) + if common.BytesToHash(h) == hash { + return data + } + } + return nil // Can't find the data anywhere. } // WriteBodyRLP stores an RLP encoded block body into the database. -func WriteBodyRLP(db DatabaseWriter, hash common.Hash, number uint64, rlp rlp.RawValue) { +func WriteBodyRLP(db ethdb.KeyValueWriter, hash common.Hash, number uint64, rlp rlp.RawValue) { if err := db.Put(blockBodyKey(number, hash), rlp); err != nil { log.Crit("Failed to store block body", "err", err) } } // HasBody verifies the existence of a block body corresponding to the hash. -func HasBody(db DatabaseReader, hash common.Hash, number uint64) bool { +func HasBody(db ethdb.Reader, hash common.Hash, number uint64) bool { + if has, err := db.Ancient(freezerHashTable, number); err == nil && common.BytesToHash(has) == hash { + return true + } if has, err := db.Has(blockBodyKey(number, hash)); !has || err != nil { return false } @@ -210,7 +309,7 @@ func HasBody(db DatabaseReader, hash common.Hash, number uint64) bool { } // ReadBody retrieves the block body corresponding to the hash. -func ReadBody(db DatabaseReader, hash common.Hash, number uint64) *types.Body { +func ReadBody(db ethdb.Reader, hash common.Hash, number uint64) *types.Body { data := ReadBodyRLP(db, hash, number) if len(data) == 0 { return nil @@ -223,8 +322,8 @@ func ReadBody(db DatabaseReader, hash common.Hash, number uint64) *types.Body { return body } -// WriteBody storea a block body into the database. -func WriteBody(db DatabaseWriter, hash common.Hash, number uint64, body *types.Body) { +// WriteBody stores a block body into the database. +func WriteBody(db ethdb.KeyValueWriter, hash common.Hash, number uint64, body *types.Body) { data, err := rlp.EncodeToBytes(body) if err != nil { log.Crit("Failed to RLP encode body", "err", err) @@ -233,15 +332,46 @@ func WriteBody(db DatabaseWriter, hash common.Hash, number uint64, body *types.B } // DeleteBody removes all block body data associated with a hash. -func DeleteBody(db DatabaseDeleter, hash common.Hash, number uint64) { +func DeleteBody(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { if err := db.Delete(blockBodyKey(number, hash)); err != nil { log.Crit("Failed to delete block body", "err", err) } } +// ReadTdRLP retrieves a block's total difficulty corresponding to the hash in RLP encoding. +func ReadTdRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { + // First try to look up the data in ancient database. Extra hash + // comparison is necessary since ancient database only maintains + // the canonical data. + data, _ := db.Ancient(freezerDifficultyTable, number) + if len(data) > 0 { + h, _ := db.Ancient(freezerHashTable, number) + if common.BytesToHash(h) == hash { + return data + } + } + // Then try to look up the data in leveldb. + data, _ = db.Get(headerTDKey(number, hash)) + if len(data) > 0 { + return data + } + // In the background freezer is moving data from leveldb to flatten files. + // So during the first check for ancient db, the data is not yet in there, + // but when we reach into leveldb, the data was already moved. That would + // result in a not found error. + data, _ = db.Ancient(freezerDifficultyTable, number) + if len(data) > 0 { + h, _ := db.Ancient(freezerHashTable, number) + if common.BytesToHash(h) == hash { + return data + } + } + return nil // Can't find the data anywhere. +} + // ReadTd retrieves a block's total difficulty corresponding to the hash. -func ReadTd(db DatabaseReader, hash common.Hash, number uint64) *big.Int { - data, _ := db.Get(headerTDKey(number, hash)) +func ReadTd(db ethdb.Reader, hash common.Hash, number uint64) *big.Int { + data := ReadTdRLP(db, hash, number) if len(data) == 0 { return nil } @@ -254,7 +384,7 @@ func ReadTd(db DatabaseReader, hash common.Hash, number uint64) *big.Int { } // WriteTd stores the total difficulty of a block into the database. -func WriteTd(db DatabaseWriter, hash common.Hash, number uint64, td *big.Int) { +func WriteTd(db ethdb.KeyValueWriter, hash common.Hash, number uint64, td *big.Int) { data, err := rlp.EncodeToBytes(td) if err != nil { log.Crit("Failed to RLP encode block total difficulty", "err", err) @@ -265,7 +395,7 @@ func WriteTd(db DatabaseWriter, hash common.Hash, number uint64, td *big.Int) { } // DeleteTd removes all block total difficulty data associated with a hash. -func DeleteTd(db DatabaseDeleter, hash common.Hash, number uint64) { +func DeleteTd(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { if err := db.Delete(headerTDKey(number, hash)); err != nil { log.Crit("Failed to delete block total difficulty", "err", err) } @@ -273,17 +403,53 @@ func DeleteTd(db DatabaseDeleter, hash common.Hash, number uint64) { // HasReceipts verifies the existence of all the transaction receipts belonging // to a block. -func HasReceipts(db DatabaseReader, hash common.Hash, number uint64) bool { +func HasReceipts(db ethdb.Reader, hash common.Hash, number uint64) bool { + if has, err := db.Ancient(freezerHashTable, number); err == nil && common.BytesToHash(has) == hash { + return true + } if has, err := db.Has(blockReceiptsKey(number, hash)); !has || err != nil { return false } return true } -// ReadReceipts retrieves all the transaction receipts belonging to a block. -func ReadReceipts(db DatabaseReader, hash common.Hash, number uint64) types.Receipts { +// ReadReceiptsRLP retrieves all the transaction receipts belonging to a block in RLP encoding. +func ReadReceiptsRLP(db ethdb.Reader, hash common.Hash, number uint64) rlp.RawValue { + // First try to look up the data in ancient database. Extra hash + // comparison is necessary since ancient database only maintains + // the canonical data. + data, _ := db.Ancient(freezerReceiptTable, number) + if len(data) > 0 { + h, _ := db.Ancient(freezerHashTable, number) + if common.BytesToHash(h) == hash { + return data + } + } + // Then try to look up the data in leveldb. + data, _ = db.Get(blockReceiptsKey(number, hash)) + if len(data) > 0 { + return data + } + // In the background freezer is moving data from leveldb to flatten files. + // So during the first check for ancient db, the data is not yet in there, + // but when we reach into leveldb, the data was already moved. That would + // result in a not found error. + data, _ = db.Ancient(freezerReceiptTable, number) + if len(data) > 0 { + h, _ := db.Ancient(freezerHashTable, number) + if common.BytesToHash(h) == hash { + return data + } + } + return nil // Can't find the data anywhere. +} + +// ReadRawReceipts retrieves all the transaction receipts belonging to a block. +// The receipt metadata fields are not guaranteed to be populated, so they +// should not be used. Use ReadReceipts instead if the metadata is needed. +func ReadRawReceipts(db ethdb.Reader, hash common.Hash, number uint64) types.Receipts { // Retrieve the flattened receipt slice - data, _ := db.Get(blockReceiptsKey(number, hash)) + data := ReadReceiptsRLP(db, hash, number) if len(data) == 0 { return nil } @@ -294,14 +460,39 @@ func ReadReceipts(db DatabaseReader, hash common.Hash, number uint64) types.Rece return nil } receipts := make(types.Receipts, len(storageReceipts)) - for i, receipt := range storageReceipts { - receipts[i] = (*types.Receipt)(receipt) + for i, storageReceipt := range storageReceipts { + receipts[i] = (*types.Receipt)(storageReceipt) + } + return receipts +} + +// ReadReceipts retrieves all the transaction receipts belonging to a block, including +// its correspoinding metadata fields. If it is unable to populate these metadata +// fields then nil is returned. +// +// The current implementation populates these metadata fields by reading the receipts' +// corresponding block body, so if the block body is not found it will return nil even +// if the receipt itself is stored. +func ReadReceipts(db ethdb.Reader, hash common.Hash, number uint64, config *params.ChainConfig) types.Receipts { + // We're deriving many fields from the block body, retrieve beside the receipt + receipts := ReadRawReceipts(db, hash, number) + if receipts == nil { + return nil + } + body := ReadBody(db, hash, number) + if body == nil { + log.Error("Missing body but have receipt", "hash", hash, "number", number) + return nil + } + if err := receipts.DeriveFields(config, hash, number, body.Transactions); err != nil { + log.Error("Failed to derive block receipts fields", "hash", hash, "number", number, "err", err) + return nil } return receipts } // WriteReceipts stores all the transaction receipts belonging to a block. -func WriteReceipts(db DatabaseWriter, hash common.Hash, number uint64, receipts types.Receipts) { +func WriteReceipts(db ethdb.KeyValueWriter, hash common.Hash, number uint64, receipts types.Receipts) { // Convert the receipts into their storage form and serialize them storageReceipts := make([]*types.ReceiptForStorage, len(receipts)) for i, receipt := range receipts { @@ -318,7 +509,7 @@ func WriteReceipts(db DatabaseWriter, hash common.Hash, number uint64, receipts } // DeleteReceipts removes all receipt data associated with a block hash. -func DeleteReceipts(db DatabaseDeleter, hash common.Hash, number uint64) { +func DeleteReceipts(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { if err := db.Delete(blockReceiptsKey(number, hash)); err != nil { log.Crit("Failed to delete block receipts", "err", err) } @@ -330,7 +521,7 @@ func DeleteReceipts(db DatabaseDeleter, hash common.Hash, number uint64) { // // 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 ReadBlock(db DatabaseReader, hash common.Hash, number uint64) *types.Block { +func ReadBlock(db ethdb.Reader, hash common.Hash, number uint64) *types.Block { header := ReadHeader(db, hash, number) if header == nil { return nil @@ -343,21 +534,61 @@ func ReadBlock(db DatabaseReader, hash common.Hash, number uint64) *types.Block } // WriteBlock serializes a block into the database, header and body separately. -func WriteBlock(db DatabaseWriter, block *types.Block) { +func WriteBlock(db ethdb.KeyValueWriter, block *types.Block) { WriteBody(db, block.Hash(), block.NumberU64(), block.Body()) WriteHeader(db, block.Header()) } +// WriteAncientBlock writes entire block data into ancient store and returns the total written size. +func WriteAncientBlock(db ethdb.AncientWriter, block *types.Block, receipts types.Receipts, td *big.Int) int { + // Encode all block components to RLP format. + headerBlob, err := rlp.EncodeToBytes(block.Header()) + if err != nil { + log.Crit("Failed to RLP encode block header", "err", err) + } + bodyBlob, err := rlp.EncodeToBytes(block.Body()) + if err != nil { + log.Crit("Failed to RLP encode body", "err", err) + } + storageReceipts := make([]*types.ReceiptForStorage, len(receipts)) + for i, receipt := range receipts { + storageReceipts[i] = (*types.ReceiptForStorage)(receipt) + } + receiptBlob, err := rlp.EncodeToBytes(storageReceipts) + if err != nil { + log.Crit("Failed to RLP encode block receipts", "err", err) + } + tdBlob, err := rlp.EncodeToBytes(td) + if err != nil { + log.Crit("Failed to RLP encode block total difficulty", "err", err) + } + // Write all blob to flatten files. + err = db.AppendAncient(block.NumberU64(), block.Hash().Bytes(), headerBlob, bodyBlob, receiptBlob, tdBlob) + if err != nil { + log.Crit("Failed to write block data to ancient store", "err", err) + } + return len(headerBlob) + len(bodyBlob) + len(receiptBlob) + len(tdBlob) + common.HashLength +} + // DeleteBlock removes all block data associated with a hash. -func DeleteBlock(db DatabaseDeleter, hash common.Hash, number uint64) { +func DeleteBlock(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { DeleteReceipts(db, hash, number) DeleteHeader(db, hash, number) DeleteBody(db, hash, number) DeleteTd(db, hash, number) } +// DeleteBlockWithoutNumber removes all block data associated with a hash, except +// the hash to number mapping. +func DeleteBlockWithoutNumber(db ethdb.KeyValueWriter, hash common.Hash, number uint64) { + DeleteReceipts(db, hash, number) + deleteHeaderWithoutNumber(db, hash, number) + DeleteBody(db, hash, number) + DeleteTd(db, hash, number) +} + // FindCommonAncestor returns the last common ancestor of two block headers -func FindCommonAncestor(db DatabaseReader, a, b *types.Header) *types.Header { +func FindCommonAncestor(db ethdb.Reader, a, b *types.Header) *types.Header { for bn := b.Number.Uint64(); a.Number.Uint64() > bn; { a = ReadHeader(db, a.ParentHash, a.Number.Uint64()-1) if a == nil { diff --git a/core/rawdb/accessors_chain_test.go b/core/rawdb/accessors_chain_test.go index 1660890b4b23..bb7dad5dffa1 100644 --- a/core/rawdb/accessors_chain_test.go +++ b/core/rawdb/accessors_chain_test.go @@ -18,19 +18,23 @@ package rawdb import ( "bytes" + "encoding/hex" + "fmt" + "io/ioutil" "math/big" + "os" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" "golang.org/x/crypto/sha3" ) // Tests block header storage and retrieval operations. func TestHeaderStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() // Create a test header to move around the database and make sure it's really new header := &types.Header{Number: big.NewInt(42), Extra: []byte("test header")} @@ -63,7 +67,7 @@ func TestHeaderStorage(t *testing.T) { // Tests block body storage and retrieval operations. func TestBodyStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() // Create a test body to move around the database and make sure it's really new body := &types.Body{Uncles: []*types.Header{{Extra: []byte("test header")}}} @@ -101,7 +105,7 @@ func TestBodyStorage(t *testing.T) { // Tests block storage and retrieval operations. func TestBlockStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() // Create a test block to move around the database and make sure it's really new block := types.NewBlockWithHeader(&types.Header{ @@ -151,7 +155,7 @@ func TestBlockStorage(t *testing.T) { // Tests that partial block contents don't get reassembled into full blocks. func TestPartialBlockStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() block := types.NewBlockWithHeader(&types.Header{ Extra: []byte("test block"), UncleHash: types.EmptyUncleHash, @@ -185,7 +189,7 @@ func TestPartialBlockStorage(t *testing.T) { // Tests block total difficulty storage and retrieval operations. func TestTdStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() // Create a test TD to move around the database and make sure it's really new hash, td := common.Hash{}, big.NewInt(314) @@ -208,7 +212,7 @@ func TestTdStorage(t *testing.T) { // Tests that canonical numbers can be mapped to hashes and retrieved. func TestCanonicalMappingStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() // Create a test canonical number and assinged hash to move around hash, number := common.Hash{0: 0xff}, uint64(314) @@ -231,7 +235,7 @@ func TestCanonicalMappingStorage(t *testing.T) { // Tests that head headers and head blocks can be assigned, individually. func TestHeadStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() blockHead := types.NewBlockWithHeader(&types.Header{Extra: []byte("test block header")}) blockFull := types.NewBlockWithHeader(&types.Header{Extra: []byte("test block full")}) @@ -266,8 +270,15 @@ func TestHeadStorage(t *testing.T) { // Tests that receipts associated with a single block can be stored and retrieved. func TestBlockReceiptStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + db := NewMemoryDatabase() + // Create a live block since we need metadata to reconstruct the receipt + tx1 := types.NewTransaction(1, common.HexToAddress("0x1"), big.NewInt(1), 1, big.NewInt(1), nil) + tx2 := types.NewTransaction(2, common.HexToAddress("0x2"), big.NewInt(2), 2, big.NewInt(2), nil) + + body := &types.Body{Transactions: types.Transactions{tx1, tx2}} + + // Create the two receipts to manage afterwards receipt1 := &types.Receipt{ Status: types.ReceiptStatusFailed, CumulativeGasUsed: 1, @@ -275,10 +286,12 @@ func TestBlockReceiptStorage(t *testing.T) { {Address: common.BytesToAddress([]byte{0x11})}, {Address: common.BytesToAddress([]byte{0x01, 0x11})}, }, - TxHash: common.BytesToHash([]byte{0x11, 0x11}), + TxHash: tx1.Hash(), ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}), GasUsed: 111111, } + receipt1.Bloom = types.CreateBloom(types.Receipts{receipt1}) + receipt2 := &types.Receipt{ PostState: common.Hash{2}.Bytes(), CumulativeGasUsed: 2, @@ -286,34 +299,128 @@ func TestBlockReceiptStorage(t *testing.T) { {Address: common.BytesToAddress([]byte{0x22})}, {Address: common.BytesToAddress([]byte{0x02, 0x22})}, }, - TxHash: common.BytesToHash([]byte{0x22, 0x22}), + TxHash: tx2.Hash(), ContractAddress: common.BytesToAddress([]byte{0x02, 0x22, 0x22}), GasUsed: 222222, } + receipt2.Bloom = types.CreateBloom(types.Receipts{receipt2}) receipts := []*types.Receipt{receipt1, receipt2} // Check that no receipt entries are in a pristine database hash := common.BytesToHash([]byte{0x03, 0x14}) - if rs := ReadReceipts(db, hash, 0); len(rs) != 0 { + if rs := ReadReceipts(db, hash, 0, params.TestChainConfig); len(rs) != 0 { t.Fatalf("non existent receipts returned: %v", rs) } + // Insert the body that corresponds to the receipts + WriteBody(db, hash, 0, body) + // Insert the receipt slice into the database and check presence WriteReceipts(db, hash, 0, receipts) - if rs := ReadReceipts(db, hash, 0); len(rs) == 0 { + if rs := ReadReceipts(db, hash, 0, params.TestChainConfig); len(rs) == 0 { t.Fatalf("no receipts returned") } else { - for i := 0; i < len(receipts); i++ { - rlpHave, _ := rlp.EncodeToBytes(rs[i]) - rlpWant, _ := rlp.EncodeToBytes(receipts[i]) - - if !bytes.Equal(rlpHave, rlpWant) { - t.Fatalf("receipt #%d: receipt mismatch: have %v, want %v", i, rs[i], receipts[i]) - } + if err := checkReceiptsRLP(rs, receipts); err != nil { + t.Fatalf(err.Error()) } } - // Delete the receipt slice and check purge + // Delete the body and ensure that the receipts are no longer returned (metadata can't be recomputed) + DeleteBody(db, hash, 0) + if rs := ReadReceipts(db, hash, 0, params.TestChainConfig); rs != nil { + t.Fatalf("receipts returned when body was deleted: %v", rs) + } + // Ensure that receipts without metadata can be returned without the block body too + if err := checkReceiptsRLP(ReadRawReceipts(db, hash, 0), receipts); err != nil { + t.Fatalf(err.Error()) + } + // Sanity check that body alone without the receipt is a full purge + WriteBody(db, hash, 0, body) + DeleteReceipts(db, hash, 0) - if rs := ReadReceipts(db, hash, 0); len(rs) != 0 { + if rs := ReadReceipts(db, hash, 0, params.TestChainConfig); len(rs) != 0 { t.Fatalf("deleted receipts returned: %v", rs) } } + +func checkReceiptsRLP(have, want types.Receipts) error { + if len(have) != len(want) { + return fmt.Errorf("receipts sizes mismatch: have %d, want %d", len(have), len(want)) + } + for i := 0; i < len(want); i++ { + rlpHave, err := rlp.EncodeToBytes(have[i]) + if err != nil { + return err + } + rlpWant, err := rlp.EncodeToBytes(want[i]) + if err != nil { + return err + } + if !bytes.Equal(rlpHave, rlpWant) { + return fmt.Errorf("receipt #%d: receipt mismatch: have %s, want %s", i, hex.EncodeToString(rlpHave), hex.EncodeToString(rlpWant)) + } + } + return nil +} + +func TestAncientStorage(t *testing.T) { + // Freezer style fast import the chain. + frdir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("failed to create temp freezer dir: %v", err) + } + defer os.Remove(frdir) + + db, err := NewDatabaseWithFreezer(NewMemoryDatabase(), frdir, "") + if err != nil { + t.Fatalf("failed to create database with ancient backend") + } + // Create a test block + block := types.NewBlockWithHeader(&types.Header{ + Number: big.NewInt(0), + Extra: []byte("test block"), + UncleHash: types.EmptyUncleHash, + TxHash: types.EmptyRootHash, + ReceiptHash: types.EmptyRootHash, + }) + // Ensure nothing non-existent will be read + hash, number := block.Hash(), block.NumberU64() + if blob := ReadHeaderRLP(db, hash, number); len(blob) > 0 { + t.Fatalf("non existent header returned") + } + if blob := ReadBodyRLP(db, hash, number); len(blob) > 0 { + t.Fatalf("non existent body returned") + } + if blob := ReadReceiptsRLP(db, hash, number); len(blob) > 0 { + t.Fatalf("non existent receipts returned") + } + if blob := ReadTdRLP(db, hash, number); len(blob) > 0 { + t.Fatalf("non existent td returned") + } + // Write and verify the header in the database + WriteAncientBlock(db, block, nil, big.NewInt(100)) + if blob := ReadHeaderRLP(db, hash, number); len(blob) == 0 { + t.Fatalf("no header returned") + } + if blob := ReadBodyRLP(db, hash, number); len(blob) == 0 { + t.Fatalf("no body returned") + } + if blob := ReadReceiptsRLP(db, hash, number); len(blob) == 0 { + t.Fatalf("no receipts returned") + } + if blob := ReadTdRLP(db, hash, number); len(blob) == 0 { + t.Fatalf("no td returned") + } + // Use a fake hash for data retrieval, nothing should be returned. + fakeHash := common.BytesToHash([]byte{0x01, 0x02, 0x03}) + if blob := ReadHeaderRLP(db, fakeHash, number); len(blob) != 0 { + t.Fatalf("invalid header returned") + } + if blob := ReadBodyRLP(db, fakeHash, number); len(blob) != 0 { + t.Fatalf("invalid body returned") + } + if blob := ReadReceiptsRLP(db, fakeHash, number); len(blob) != 0 { + t.Fatalf("invalid receipts returned") + } + if blob := ReadTdRLP(db, fakeHash, number); len(blob) != 0 { + t.Fatalf("invalid td returned") + } +} diff --git a/core/rawdb/accessors_indexes.go b/core/rawdb/accessors_indexes.go index d43fbc1d1a0d..38f8fe10ea94 100644 --- a/core/rawdb/accessors_indexes.go +++ b/core/rawdb/accessors_indexes.go @@ -17,90 +17,114 @@ package rawdb import ( - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rlp" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" ) // ReadTxLookupEntry retrieves the positional metadata associated with a transaction // hash to allow retrieving the transaction or receipt by hash. -func ReadTxLookupEntry(db DatabaseReader, hash common.Hash) (common.Hash, uint64, uint64) { +func ReadTxLookupEntry(db ethdb.Reader, hash common.Hash) *uint64 { data, _ := db.Get(txLookupKey(hash)) if len(data) == 0 { - return common.Hash{}, 0, 0 + return nil + } + // Database v6 tx lookup just stores the block number + if len(data) < common.HashLength { + number := new(big.Int).SetBytes(data).Uint64() + return &number } - var entry TxLookupEntry + // Database v4-v5 tx lookup format just stores the hash + if len(data) == common.HashLength { + return ReadHeaderNumber(db, common.BytesToHash(data)) + } + // Finally try database v3 tx lookup format + var entry LegacyTxLookupEntry if err := rlp.DecodeBytes(data, &entry); err != nil { - log.Error("Invalid transaction lookup entry RLP", "hash", hash, "err", err) - return common.Hash{}, 0, 0 + log.Error("Invalid transaction lookup entry RLP", "hash", hash, "blob", data, "err", err) + return nil } - return entry.BlockHash, entry.BlockIndex, entry.Index + return &entry.BlockIndex } // WriteTxLookupEntries stores a positional metadata for every transaction from // a block, enabling hash based transaction and receipt lookups. -func WriteTxLookupEntries(db DatabaseWriter, block *types.Block) { - for i, tx := range block.Transactions() { - entry := TxLookupEntry{ - BlockHash: block.Hash(), - BlockIndex: block.NumberU64(), - Index: uint64(i), - } - data, err := rlp.EncodeToBytes(entry) - if err != nil { - log.Crit("Failed to encode transaction lookup entry", "err", err) - } - if err := db.Put(txLookupKey(tx.Hash()), data); err != nil { +func WriteTxLookupEntries(db ethdb.KeyValueWriter, block *types.Block) { + number := block.Number().Bytes() + for _, tx := range block.Transactions() { + if err := db.Put(txLookupKey(tx.Hash()), number); err != nil { log.Crit("Failed to store transaction lookup entry", "err", err) } } } // DeleteTxLookupEntry removes all transaction data associated with a hash. -func DeleteTxLookupEntry(db DatabaseDeleter, hash common.Hash) { +func DeleteTxLookupEntry(db ethdb.KeyValueWriter, hash common.Hash) { db.Delete(txLookupKey(hash)) } // ReadTransaction retrieves a specific transaction from the database, along with // its added positional metadata. -func ReadTransaction(db DatabaseReader, hash common.Hash) (*types.Transaction, common.Hash, uint64, uint64) { - blockHash, blockNumber, txIndex := ReadTxLookupEntry(db, hash) +func ReadTransaction(db ethdb.Reader, hash common.Hash) (*types.Transaction, common.Hash, uint64, uint64) { + blockNumber := ReadTxLookupEntry(db, hash) + if blockNumber == nil { + return nil, common.Hash{}, 0, 0 + } + blockHash := ReadCanonicalHash(db, *blockNumber) if blockHash == (common.Hash{}) { return nil, common.Hash{}, 0, 0 } - body := ReadBody(db, blockHash, blockNumber) - if body == nil || len(body.Transactions) <= int(txIndex) { - log.Error("Transaction referenced missing", "number", blockNumber, "hash", blockHash, "index", txIndex) + body := ReadBody(db, blockHash, *blockNumber) + if body == nil { + log.Error("Transaction referenced missing", "number", blockNumber, "hash", blockHash) return nil, common.Hash{}, 0, 0 } - return body.Transactions[txIndex], blockHash, blockNumber, txIndex + for txIndex, tx := range body.Transactions { + if tx.Hash() == hash { + return tx, blockHash, *blockNumber, uint64(txIndex) + } + } + log.Error("Transaction not found", "number", blockNumber, "hash", blockHash, "txhash", hash) + return nil, common.Hash{}, 0, 0 } // ReadReceipt retrieves a specific transaction receipt from the database, along with // its added positional metadata. -func ReadReceipt(db DatabaseReader, hash common.Hash) (*types.Receipt, common.Hash, uint64, uint64) { - blockHash, blockNumber, receiptIndex := ReadTxLookupEntry(db, hash) - if blockHash == (common.Hash{}) { +func ReadReceipt(db ethdb.Reader, hash common.Hash, config *params.ChainConfig) (*types.Receipt, common.Hash, uint64, uint64) { + // Retrieve the context of the receipt based on the transaction hash + blockNumber := ReadTxLookupEntry(db, hash) + if blockNumber == nil { return nil, common.Hash{}, 0, 0 } - receipts := ReadReceipts(db, blockHash, blockNumber) - if len(receipts) <= int(receiptIndex) { - log.Error("Receipt refereced missing", "number", blockNumber, "hash", blockHash, "index", receiptIndex) + blockHash := ReadCanonicalHash(db, *blockNumber) + if blockHash == (common.Hash{}) { return nil, common.Hash{}, 0, 0 } - return receipts[receiptIndex], blockHash, blockNumber, receiptIndex + // Read all the receipts from the block and return the one with the matching hash + receipts := ReadReceipts(db, blockHash, *blockNumber, config) + for receiptIndex, receipt := range receipts { + if receipt.TxHash == hash { + return receipt, blockHash, *blockNumber, uint64(receiptIndex) + } + } + log.Error("Receipt not found", "number", blockNumber, "hash", blockHash, "txhash", hash) + return nil, common.Hash{}, 0, 0 } // ReadBloomBits retrieves the compressed bloom bit vector belonging to the given // section and bit index from the. -func ReadBloomBits(db DatabaseReader, bit uint, section uint64, head common.Hash) ([]byte, error) { +func ReadBloomBits(db ethdb.KeyValueReader, bit uint, section uint64, head common.Hash) ([]byte, error) { return db.Get(bloomBitsKey(bit, section, head)) } // WriteBloomBits stores the compressed bloom bits vector belonging to the given // section and bit index. -func WriteBloomBits(db DatabaseWriter, bit uint, section uint64, head common.Hash, bits []byte) { +func WriteBloomBits(db ethdb.KeyValueWriter, bit uint, section uint64, head common.Hash, bits []byte) { if err := db.Put(bloomBitsKey(bit, section, head), bits); err != nil { log.Crit("Failed to store bloom bits", "err", err) } diff --git a/core/rawdb/accessors_indexes_test.go b/core/rawdb/accessors_indexes_test.go index 9f1420cf532d..c09bff010127 100644 --- a/core/rawdb/accessors_indexes_test.go +++ b/core/rawdb/accessors_indexes_test.go @@ -20,49 +20,89 @@ import ( "math/big" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/rlp" ) // Tests that positional lookup metadata can be stored and retrieved. func TestLookupStorage(t *testing.T) { - db := ethdb.NewMemDatabase() + tests := []struct { + name string + writeTxLookupEntries func(ethdb.Writer, *types.Block) + }{ + { + "DatabaseV6", + func(db ethdb.Writer, block *types.Block) { + WriteTxLookupEntries(db, block) + }, + }, + { + "DatabaseV4-V5", + func(db ethdb.Writer, block *types.Block) { + for _, tx := range block.Transactions() { + db.Put(txLookupKey(tx.Hash()), block.Hash().Bytes()) + } + }, + }, + { + "DatabaseV3", + func(db ethdb.Writer, block *types.Block) { + for index, tx := range block.Transactions() { + entry := LegacyTxLookupEntry{ + BlockHash: block.Hash(), + BlockIndex: block.NumberU64(), + Index: uint64(index), + } + data, _ := rlp.EncodeToBytes(entry) + db.Put(txLookupKey(tx.Hash()), data) + } + }, + }, + } - tx1 := types.NewTransaction(1, common.BytesToAddress([]byte{0x11}), big.NewInt(111), 1111, big.NewInt(11111), []byte{0x11, 0x11, 0x11}) - tx2 := types.NewTransaction(2, common.BytesToAddress([]byte{0x22}), big.NewInt(222), 2222, big.NewInt(22222), []byte{0x22, 0x22, 0x22}) - tx3 := types.NewTransaction(3, common.BytesToAddress([]byte{0x33}), big.NewInt(333), 3333, big.NewInt(33333), []byte{0x33, 0x33, 0x33}) - txs := []*types.Transaction{tx1, tx2, tx3} + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + db := NewMemoryDatabase() - block := types.NewBlock(&types.Header{Number: big.NewInt(314)}, txs, nil, nil) + tx1 := types.NewTransaction(1, common.BytesToAddress([]byte{0x11}), big.NewInt(111), 1111, big.NewInt(11111), []byte{0x11, 0x11, 0x11}) + tx2 := types.NewTransaction(2, common.BytesToAddress([]byte{0x22}), big.NewInt(222), 2222, big.NewInt(22222), []byte{0x22, 0x22, 0x22}) + tx3 := types.NewTransaction(3, common.BytesToAddress([]byte{0x33}), big.NewInt(333), 3333, big.NewInt(33333), []byte{0x33, 0x33, 0x33}) + txs := []*types.Transaction{tx1, tx2, tx3} - // Check that no transactions entries are in a pristine database - for i, tx := range txs { - if txn, _, _, _ := ReadTransaction(db, tx.Hash()); txn != nil { - t.Fatalf("tx #%d [%x]: non existent transaction returned: %v", i, tx.Hash(), txn) - } - } - // Insert all the transactions into the database, and verify contents - WriteBlock(db, block) - WriteTxLookupEntries(db, block) + block := types.NewBlock(&types.Header{Number: big.NewInt(314)}, txs, nil, nil) - for i, tx := range txs { - if txn, hash, number, index := ReadTransaction(db, tx.Hash()); txn == nil { - t.Fatalf("tx #%d [%x]: transaction not found", i, tx.Hash()) - } else { - if hash != block.Hash() || number != block.NumberU64() || index != uint64(i) { - t.Fatalf("tx #%d [%x]: positional metadata mismatch: have %x/%d/%d, want %x/%v/%v", i, tx.Hash(), hash, number, index, block.Hash(), block.NumberU64(), i) + // Check that no transactions entries are in a pristine database + for i, tx := range txs { + if txn, _, _, _ := ReadTransaction(db, tx.Hash()); txn != nil { + t.Fatalf("tx #%d [%x]: non existent transaction returned: %v", i, tx.Hash(), txn) + } } - if tx.Hash() != txn.Hash() { - t.Fatalf("tx #%d [%x]: transaction mismatch: have %v, want %v", i, tx.Hash(), txn, tx) + // Insert all the transactions into the database, and verify contents + WriteCanonicalHash(db, block.Hash(), block.NumberU64()) + WriteBlock(db, block) + tc.writeTxLookupEntries(db, block) + + for i, tx := range txs { + if txn, hash, number, index := ReadTransaction(db, tx.Hash()); txn == nil { + t.Fatalf("tx #%d [%x]: transaction not found", i, tx.Hash()) + } else { + if hash != block.Hash() || number != block.NumberU64() || index != uint64(i) { + t.Fatalf("tx #%d [%x]: positional metadata mismatch: have %x/%d/%d, want %x/%v/%v", i, tx.Hash(), hash, number, index, block.Hash(), block.NumberU64(), i) + } + if tx.Hash() != txn.Hash() { + t.Fatalf("tx #%d [%x]: transaction mismatch: have %v, want %v", i, tx.Hash(), txn, tx) + } + } } - } - } - // Delete the transactions and check purge - for i, tx := range txs { - DeleteTxLookupEntry(db, tx.Hash()) - if txn, _, _, _ := ReadTransaction(db, tx.Hash()); txn != nil { - t.Fatalf("tx #%d [%x]: deleted transaction returned: %v", i, tx.Hash(), txn) - } + // Delete the transactions and check purge + for i, tx := range txs { + DeleteTxLookupEntry(db, tx.Hash()) + if txn, _, _, _ := ReadTransaction(db, tx.Hash()); txn != nil { + t.Fatalf("tx #%d [%x]: deleted transaction returned: %v", i, tx.Hash(), txn) + } + } + }) } } diff --git a/core/rawdb/accessors_metadata.go b/core/rawdb/accessors_metadata.go index 72c6a24b409c..f8d09fbddf2d 100644 --- a/core/rawdb/accessors_metadata.go +++ b/core/rawdb/accessors_metadata.go @@ -19,14 +19,15 @@ package rawdb import ( "encoding/json" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" ) // ReadDatabaseVersion retrieves the version number of the database. -func ReadDatabaseVersion(db DatabaseReader) *uint64 { +func ReadDatabaseVersion(db ethdb.KeyValueReader) *uint64 { var version uint64 enc, _ := db.Get(databaseVerisionKey) @@ -41,7 +42,7 @@ func ReadDatabaseVersion(db DatabaseReader) *uint64 { } // WriteDatabaseVersion stores the version number of the database -func WriteDatabaseVersion(db DatabaseWriter, version uint64) { +func WriteDatabaseVersion(db ethdb.KeyValueWriter, version uint64) { enc, err := rlp.EncodeToBytes(version) if err != nil { log.Crit("Failed to encode database version", "err", err) @@ -52,7 +53,7 @@ func WriteDatabaseVersion(db DatabaseWriter, version uint64) { } // ReadChainConfig retrieves the consensus settings based on the given genesis hash. -func ReadChainConfig(db DatabaseReader, hash common.Hash) *params.ChainConfig { +func ReadChainConfig(db ethdb.KeyValueReader, hash common.Hash) *params.ChainConfig { data, _ := db.Get(configKey(hash)) if len(data) == 0 { return nil @@ -66,7 +67,7 @@ func ReadChainConfig(db DatabaseReader, hash common.Hash) *params.ChainConfig { } // WriteChainConfig writes the chain config settings to the database. -func WriteChainConfig(db DatabaseWriter, hash common.Hash, cfg *params.ChainConfig) { +func WriteChainConfig(db ethdb.KeyValueWriter, hash common.Hash, cfg *params.ChainConfig) { if cfg == nil { return } @@ -80,13 +81,13 @@ func WriteChainConfig(db DatabaseWriter, hash common.Hash, cfg *params.ChainConf } // ReadPreimage retrieves a single preimage of the provided hash. -func ReadPreimage(db DatabaseReader, hash common.Hash) []byte { +func ReadPreimage(db ethdb.KeyValueReader, hash common.Hash) []byte { data, _ := db.Get(preimageKey(hash)) return data } // WritePreimages writes the provided set of preimages to the database. -func WritePreimages(db DatabaseWriter, preimages map[common.Hash][]byte) { +func WritePreimages(db ethdb.KeyValueWriter, preimages map[common.Hash][]byte) { for hash, preimage := range preimages { if err := db.Put(preimageKey(hash), preimage); err != nil { log.Crit("Failed to store trie preimage", "err", err) diff --git a/core/rawdb/database.go b/core/rawdb/database.go new file mode 100644 index 000000000000..838c084359ac --- /dev/null +++ b/core/rawdb/database.go @@ -0,0 +1,354 @@ +// Copyright 2018 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 rawdb + +import ( + "bytes" + "errors" + "fmt" + "os" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethdb/leveldb" + "github.com/ethereum/go-ethereum/ethdb/memorydb" + "github.com/ethereum/go-ethereum/log" + "github.com/olekukonko/tablewriter" +) + +// freezerdb is a database wrapper that enabled freezer data retrievals. +type freezerdb struct { + ethdb.KeyValueStore + ethdb.AncientStore +} + +// Close implements io.Closer, closing both the fast key-value store as well as +// the slow ancient tables. +func (frdb *freezerdb) Close() error { + var errs []error + if err := frdb.KeyValueStore.Close(); err != nil { + errs = append(errs, err) + } + if err := frdb.AncientStore.Close(); err != nil { + errs = append(errs, err) + } + if len(errs) != 0 { + return fmt.Errorf("%v", errs) + } + return nil +} + +// nofreezedb is a database wrapper that disables freezer data retrievals. +type nofreezedb struct { + ethdb.KeyValueStore +} + +// HasAncient returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) HasAncient(kind string, number uint64) (bool, error) { + return false, errNotSupported +} + +// Ancient returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) Ancient(kind string, number uint64) ([]byte, error) { + return nil, errNotSupported +} + +// Ancients returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) Ancients() (uint64, error) { + return 0, errNotSupported +} + +// AncientSize returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) AncientSize(kind string) (uint64, error) { + return 0, errNotSupported +} + +// AppendAncient returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) AppendAncient(number uint64, hash, header, body, receipts, td []byte) error { + return errNotSupported +} + +// TruncateAncients returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) TruncateAncients(items uint64) error { + return errNotSupported +} + +// Sync returns an error as we don't have a backing chain freezer. +func (db *nofreezedb) Sync() error { + return errNotSupported +} + +// NewDatabase creates a high level database on top of a given key-value data +// store without a freezer moving immutable chain segments into cold storage. +func NewDatabase(db ethdb.KeyValueStore) ethdb.Database { + return &nofreezedb{ + KeyValueStore: db, + } +} + +// NewDatabaseWithFreezer creates a high level database on top of a given key- +// value data store with a freezer moving immutable chain segments into cold +// storage. +func NewDatabaseWithFreezer(db ethdb.KeyValueStore, freezer string, namespace string) (ethdb.Database, error) { + // Create the idle freezer instance + frdb, err := newFreezer(freezer, namespace) + if err != nil { + return nil, err + } + // Since the freezer can be stored separately from the user's key-value database, + // there's a fairly high probability that the user requests invalid combinations + // of the freezer and database. Ensure that we don't shoot ourselves in the foot + // by serving up conflicting data, leading to both datastores getting corrupted. + // + // - If both the freezer and key-value store is empty (no genesis), we just + // initialized a new empty freezer, so everything's fine. + // - If the key-value store is empty, but the freezer is not, we need to make + // sure the user's genesis matches the freezer. That will be checked in the + // blockchain, since we don't have the genesis block here (nor should we at + // this point care, the key-value/freezer combo is valid). + // - If neither the key-value store nor the freezer is empty, cross validate + // the genesis hashes to make sure they are compatible. If they are, also + // ensure that there's no gap between the freezer and sunsequently leveldb. + // - If the key-value store is not empty, but the freezer is we might just be + // upgrading to the freezer release, or we might have had a small chain and + // not frozen anything yet. Ensure that no blocks are missing yet from the + // key-value store, since that would mean we already had an old freezer. + + // If the genesis hash is empty, we have a new key-value store, so nothing to + // validate in this method. If, however, the genesis hash is not nil, compare + // it to the freezer content. + if kvgenesis, _ := db.Get(headerHashKey(0)); len(kvgenesis) > 0 { + if frozen, _ := frdb.Ancients(); frozen > 0 { + // If the freezer already contains something, ensure that the genesis blocks + // match, otherwise we might mix up freezers across chains and destroy both + // the freezer and the key-value store. + if frgenesis, _ := frdb.Ancient(freezerHashTable, 0); !bytes.Equal(kvgenesis, frgenesis) { + return nil, fmt.Errorf("genesis mismatch: %#x (leveldb) != %#x (ancients)", kvgenesis, frgenesis) + } + // Key-value store and freezer belong to the same network. Ensure that they + // are contiguous, otherwise we might end up with a non-functional freezer. + if kvhash, _ := db.Get(headerHashKey(frozen)); len(kvhash) == 0 { + // Subsequent header after the freezer limit is missing from the database. + // Reject startup is the database has a more recent head. + if *ReadHeaderNumber(db, ReadHeadHeaderHash(db)) > frozen-1 { + return nil, fmt.Errorf("gap (#%d) in the chain between ancients and leveldb", frozen) + } + // Database contains only older data than the freezer, this happens if the + // state was wiped and reinited from an existing freezer. + } + // Otherwise, key-value store continues where the freezer left off, all is fine. + // We might have duplicate blocks (crash after freezer write but before key-value + // store deletion, but that's fine). + } else { + // If the freezer is empty, ensure nothing was moved yet from the key-value + // store, otherwise we'll end up missing data. We check block #1 to decide + // if we froze anything previously or not, but do take care of databases with + // only the genesis block. + if ReadHeadHeaderHash(db) != common.BytesToHash(kvgenesis) { + // Key-value store contains more data than the genesis block, make sure we + // didn't freeze anything yet. + if kvblob, _ := db.Get(headerHashKey(1)); len(kvblob) == 0 { + return nil, errors.New("ancient chain segments already extracted, please set --datadir.ancient to the correct path") + } + // Block #1 is still in the database, we're allowed to init a new feezer + } + // Otherwise, the head header is still the genesis, we're allowed to init a new + // feezer. + } + } + // Freezer is consistent with the key-value database, permit combining the two + go frdb.freeze(db) + + return &freezerdb{ + KeyValueStore: db, + AncientStore: frdb, + }, nil +} + +// NewMemoryDatabase creates an ephemeral in-memory key-value database without a +// freezer moving immutable chain segments into cold storage. +func NewMemoryDatabase() ethdb.Database { + return NewDatabase(memorydb.New()) +} + +// NewMemoryDatabaseWithCap creates an ephemeral in-memory key-value database +// with an initial starting capacity, but without a freezer moving immutable +// chain segments into cold storage. +func NewMemoryDatabaseWithCap(size int) ethdb.Database { + return NewDatabase(memorydb.NewWithCap(size)) +} + +// NewLevelDBDatabase creates a persistent key-value database without a freezer +// moving immutable chain segments into cold storage. +func NewLevelDBDatabase(file string, cache int, handles int, namespace string) (ethdb.Database, error) { + db, err := leveldb.New(file, cache, handles, namespace) + if err != nil { + return nil, err + } + return NewDatabase(db), nil +} + +// NewLevelDBDatabaseWithFreezer creates a persistent key-value database with a +// freezer moving immutable chain segments into cold storage. +func NewLevelDBDatabaseWithFreezer(file string, cache int, handles int, freezer string, namespace string) (ethdb.Database, error) { + kvdb, err := leveldb.New(file, cache, handles, namespace) + if err != nil { + return nil, err + } + frdb, err := NewDatabaseWithFreezer(kvdb, freezer, namespace) + if err != nil { + kvdb.Close() + return nil, err + } + return frdb, nil +} + +// InspectDatabase traverses the entire database and checks the size +// of all different categories of data. +func InspectDatabase(db ethdb.Database) error { + it := db.NewIterator() + defer it.Release() + + var ( + count int64 + start = time.Now() + logged = time.Now() + + // Key-value store statistics + total common.StorageSize + headerSize common.StorageSize + bodySize common.StorageSize + receiptSize common.StorageSize + tdSize common.StorageSize + numHashPairing common.StorageSize + hashNumPairing common.StorageSize + trieSize common.StorageSize + txlookupSize common.StorageSize + preimageSize common.StorageSize + bloomBitsSize common.StorageSize + cliqueSnapsSize common.StorageSize + + // Ancient store statistics + ancientHeaders common.StorageSize + ancientBodies common.StorageSize + ancientReceipts common.StorageSize + ancientHashes common.StorageSize + ancientTds common.StorageSize + + // Les statistic + chtTrieNodes common.StorageSize + bloomTrieNodes common.StorageSize + + // Meta- and unaccounted data + metadata common.StorageSize + unaccounted common.StorageSize + ) + // Inspect key-value database first. + for it.Next() { + var ( + key = it.Key() + size = common.StorageSize(len(key) + len(it.Value())) + ) + total += size + switch { + case bytes.HasPrefix(key, headerPrefix) && bytes.HasSuffix(key, headerTDSuffix): + tdSize += size + case bytes.HasPrefix(key, headerPrefix) && bytes.HasSuffix(key, headerHashSuffix): + numHashPairing += size + case bytes.HasPrefix(key, headerPrefix) && len(key) == (len(headerPrefix)+8+common.HashLength): + headerSize += size + case bytes.HasPrefix(key, headerNumberPrefix) && len(key) == (len(headerNumberPrefix)+common.HashLength): + hashNumPairing += size + case bytes.HasPrefix(key, blockBodyPrefix) && len(key) == (len(blockBodyPrefix)+8+common.HashLength): + bodySize += size + case bytes.HasPrefix(key, blockReceiptsPrefix) && len(key) == (len(blockReceiptsPrefix)+8+common.HashLength): + receiptSize += size + case bytes.HasPrefix(key, txLookupPrefix) && len(key) == (len(txLookupPrefix)+common.HashLength): + txlookupSize += size + case bytes.HasPrefix(key, preimagePrefix) && len(key) == (len(preimagePrefix)+common.HashLength): + preimageSize += size + case bytes.HasPrefix(key, bloomBitsPrefix) && len(key) == (len(bloomBitsPrefix)+10+common.HashLength): + bloomBitsSize += size + case bytes.HasPrefix(key, []byte("clique-")) && len(key) == 7+common.HashLength: + cliqueSnapsSize += size + case bytes.HasPrefix(key, []byte("cht-")) && len(key) == 4+common.HashLength: + chtTrieNodes += size + case bytes.HasPrefix(key, []byte("blt-")) && len(key) == 4+common.HashLength: + bloomTrieNodes += size + case len(key) == common.HashLength: + trieSize += size + default: + var accounted bool + for _, meta := range [][]byte{databaseVerisionKey, headHeaderKey, headBlockKey, headFastBlockKey, fastTrieProgressKey} { + if bytes.Equal(key, meta) { + metadata += size + accounted = true + break + } + } + if !accounted { + unaccounted += size + } + } + count += 1 + if count%1000 == 0 && time.Since(logged) > 8*time.Second { + log.Info("Inspecting database", "count", count, "elapsed", common.PrettyDuration(time.Since(start))) + logged = time.Now() + } + } + // Inspect append-only file store then. + ancients := []*common.StorageSize{&ancientHeaders, &ancientBodies, &ancientReceipts, &ancientHashes, &ancientTds} + for i, category := range []string{freezerHeaderTable, freezerBodiesTable, freezerReceiptTable, freezerHashTable, freezerDifficultyTable} { + if size, err := db.AncientSize(category); err == nil { + *ancients[i] += common.StorageSize(size) + total += common.StorageSize(size) + } + } + // Display the database statistic. + stats := [][]string{ + {"Key-Value store", "Headers", headerSize.String()}, + {"Key-Value store", "Bodies", bodySize.String()}, + {"Key-Value store", "Receipts", receiptSize.String()}, + {"Key-Value store", "Difficulties", tdSize.String()}, + {"Key-Value store", "Block number->hash", numHashPairing.String()}, + {"Key-Value store", "Block hash->number", hashNumPairing.String()}, + {"Key-Value store", "Transaction index", txlookupSize.String()}, + {"Key-Value store", "Bloombit index", bloomBitsSize.String()}, + {"Key-Value store", "Trie nodes", trieSize.String()}, + {"Key-Value store", "Trie preimages", preimageSize.String()}, + {"Key-Value store", "Clique snapshots", cliqueSnapsSize.String()}, + {"Key-Value store", "Singleton metadata", metadata.String()}, + {"Ancient store", "Headers", ancientHeaders.String()}, + {"Ancient store", "Bodies", ancientBodies.String()}, + {"Ancient store", "Receipts", ancientReceipts.String()}, + {"Ancient store", "Difficulties", ancientTds.String()}, + {"Ancient store", "Block number->hash", ancientHashes.String()}, + {"Light client", "CHT trie nodes", chtTrieNodes.String()}, + {"Light client", "Bloom trie nodes", bloomTrieNodes.String()}, + } + table := tablewriter.NewWriter(os.Stdout) + table.SetHeader([]string{"Database", "Category", "Size"}) + table.SetFooter([]string{"", "Total", total.String()}) + table.AppendBulk(stats) + table.Render() + + if unaccounted > 0 { + log.Error("Database contains unaccounted data", "size", unaccounted) + } + return nil +} diff --git a/core/rawdb/freezer.go b/core/rawdb/freezer.go new file mode 100644 index 000000000000..5497c59d4908 --- /dev/null +++ b/core/rawdb/freezer.go @@ -0,0 +1,393 @@ +// Copyright 2019 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 rawdb + +import ( + "errors" + "fmt" + "math" + "os" + "path/filepath" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/params" + "github.com/prometheus/tsdb/fileutil" +) + +var ( + // errUnknownTable is returned if the user attempts to read from a table that is + // not tracked by the freezer. + errUnknownTable = errors.New("unknown table") + + // errOutOrderInsertion is returned if the user attempts to inject out-of-order + // binary blobs into the freezer. + errOutOrderInsertion = errors.New("the append operation is out-order") + + // errSymlinkDatadir is returned if the ancient directory specified by user + // is a symbolic link. + errSymlinkDatadir = errors.New("symbolic link datadir is not supported") +) + +const ( + // freezerRecheckInterval is the frequency to check the key-value database for + // chain progression that might permit new blocks to be frozen into immutable + // storage. + freezerRecheckInterval = time.Minute + + // freezerBatchLimit is the maximum number of blocks to freeze in one batch + // before doing an fsync and deleting it from the key-value store. + freezerBatchLimit = 30000 +) + +// freezer is an memory mapped append-only database to store immutable chain data +// into flat files: +// +// - The append only nature ensures that disk writes are minimized. +// - The memory mapping ensures we can max out system memory for caching without +// reserving it for go-ethereum. This would also reduce the memory requirements +// of Geth, and thus also GC overhead. +type freezer struct { + // WARNING: The `frozen` field is accessed atomically. On 32 bit platforms, only + // 64-bit aligned fields can be atomic. The struct is guaranteed to be so aligned, + // so take advantage of that (https://golang.org/pkg/sync/atomic/#pkg-note-BUG). + frozen uint64 // Number of blocks already frozen + + tables map[string]*freezerTable // Data tables for storing everything + instanceLock fileutil.Releaser // File-system lock to prevent double opens +} + +// newFreezer creates a chain freezer that moves ancient chain data into +// append-only flat file containers. +func newFreezer(datadir string, namespace string) (*freezer, error) { + // Create the initial freezer object + var ( + readMeter = metrics.NewRegisteredMeter(namespace+"ancient/read", nil) + writeMeter = metrics.NewRegisteredMeter(namespace+"ancient/write", nil) + sizeGauge = metrics.NewRegisteredGauge(namespace+"ancient/size", nil) + ) + // Ensure the datadir is not a symbolic link if it exists. + if info, err := os.Lstat(datadir); !os.IsNotExist(err) { + if info.Mode()&os.ModeSymlink != 0 { + log.Warn("Symbolic link ancient database is not supported", "path", datadir) + return nil, errSymlinkDatadir + } + } + // Leveldb uses LOCK as the filelock filename. To prevent the + // name collision, we use FLOCK as the lock name. + lock, _, err := fileutil.Flock(filepath.Join(datadir, "FLOCK")) + if err != nil { + return nil, err + } + // Open all the supported data tables + freezer := &freezer{ + tables: make(map[string]*freezerTable), + instanceLock: lock, + } + for name, disableSnappy := range freezerNoSnappy { + table, err := newTable(datadir, name, readMeter, writeMeter, sizeGauge, disableSnappy) + if err != nil { + for _, table := range freezer.tables { + table.Close() + } + lock.Release() + return nil, err + } + freezer.tables[name] = table + } + if err := freezer.repair(); err != nil { + for _, table := range freezer.tables { + table.Close() + } + lock.Release() + return nil, err + } + log.Info("Opened ancient database", "database", datadir) + return freezer, nil +} + +// Close terminates the chain freezer, unmapping all the data files. +func (f *freezer) Close() error { + var errs []error + for _, table := range f.tables { + if err := table.Close(); err != nil { + errs = append(errs, err) + } + } + if err := f.instanceLock.Release(); err != nil { + errs = append(errs, err) + } + if errs != nil { + return fmt.Errorf("%v", errs) + } + return nil +} + +// HasAncient returns an indicator whether the specified ancient data exists +// in the freezer. +func (f *freezer) HasAncient(kind string, number uint64) (bool, error) { + if table := f.tables[kind]; table != nil { + return table.has(number), nil + } + return false, nil +} + +// Ancient retrieves an ancient binary blob from the append-only immutable files. +func (f *freezer) Ancient(kind string, number uint64) ([]byte, error) { + if table := f.tables[kind]; table != nil { + return table.Retrieve(number) + } + return nil, errUnknownTable +} + +// Ancients returns the length of the frozen items. +func (f *freezer) Ancients() (uint64, error) { + return atomic.LoadUint64(&f.frozen), nil +} + +// AncientSize returns the ancient size of the specified category. +func (f *freezer) AncientSize(kind string) (uint64, error) { + if table := f.tables[kind]; table != nil { + return table.size() + } + return 0, errUnknownTable +} + +// AppendAncient injects all binary blobs belong to block at the end of the +// append-only immutable table files. +// +// Notably, this function is lock free but kind of thread-safe. All out-of-order +// injection will be rejected. But if two injections with same number happen at +// the same time, we can get into the trouble. +func (f *freezer) AppendAncient(number uint64, hash, header, body, receipts, td []byte) (err error) { + // Ensure the binary blobs we are appending is continuous with freezer. + if atomic.LoadUint64(&f.frozen) != number { + return errOutOrderInsertion + } + // Rollback all inserted data if any insertion below failed to ensure + // the tables won't out of sync. + defer func() { + if err != nil { + rerr := f.repair() + if rerr != nil { + log.Crit("Failed to repair freezer", "err", rerr) + } + log.Info("Append ancient failed", "number", number, "err", err) + } + }() + // Inject all the components into the relevant data tables + if err := f.tables[freezerHashTable].Append(f.frozen, hash[:]); err != nil { + log.Error("Failed to append ancient hash", "number", f.frozen, "hash", hash, "err", err) + return err + } + if err := f.tables[freezerHeaderTable].Append(f.frozen, header); err != nil { + log.Error("Failed to append ancient header", "number", f.frozen, "hash", hash, "err", err) + return err + } + if err := f.tables[freezerBodiesTable].Append(f.frozen, body); err != nil { + log.Error("Failed to append ancient body", "number", f.frozen, "hash", hash, "err", err) + return err + } + if err := f.tables[freezerReceiptTable].Append(f.frozen, receipts); err != nil { + log.Error("Failed to append ancient receipts", "number", f.frozen, "hash", hash, "err", err) + return err + } + if err := f.tables[freezerDifficultyTable].Append(f.frozen, td); err != nil { + log.Error("Failed to append ancient difficulty", "number", f.frozen, "hash", hash, "err", err) + return err + } + atomic.AddUint64(&f.frozen, 1) // Only modify atomically + return nil +} + +// Truncate discards any recent data above the provided threshold number. +func (f *freezer) TruncateAncients(items uint64) error { + if atomic.LoadUint64(&f.frozen) <= items { + return nil + } + for _, table := range f.tables { + if err := table.truncate(items); err != nil { + return err + } + } + atomic.StoreUint64(&f.frozen, items) + return nil +} + +// sync flushes all data tables to disk. +func (f *freezer) Sync() error { + var errs []error + for _, table := range f.tables { + if err := table.Sync(); err != nil { + errs = append(errs, err) + } + } + if errs != nil { + return fmt.Errorf("%v", errs) + } + return nil +} + +// freeze is a background thread that periodically checks the blockchain for any +// import progress and moves ancient data from the fast database into the freezer. +// +// This functionality is deliberately broken off from block importing to avoid +// incurring additional data shuffling delays on block propagation. +func (f *freezer) freeze(db ethdb.KeyValueStore) { + nfdb := &nofreezedb{KeyValueStore: db} + + for { + // Retrieve the freezing threshold. + hash := ReadHeadBlockHash(nfdb) + if hash == (common.Hash{}) { + log.Debug("Current full block hash unavailable") // new chain, empty database + time.Sleep(freezerRecheckInterval) + continue + } + number := ReadHeaderNumber(nfdb, hash) + switch { + case number == nil: + log.Error("Current full block number unavailable", "hash", hash) + time.Sleep(freezerRecheckInterval) + continue + + case *number < params.ImmutabilityThreshold: + log.Debug("Current full block not old enough", "number", *number, "hash", hash, "delay", params.ImmutabilityThreshold) + time.Sleep(freezerRecheckInterval) + continue + + case *number-params.ImmutabilityThreshold <= f.frozen: + log.Debug("Ancient blocks frozen already", "number", *number, "hash", hash, "frozen", f.frozen) + time.Sleep(freezerRecheckInterval) + continue + } + head := ReadHeader(nfdb, hash, *number) + if head == nil { + log.Error("Current full block unavailable", "number", *number, "hash", hash) + time.Sleep(freezerRecheckInterval) + continue + } + // Seems we have data ready to be frozen, process in usable batches + limit := *number - params.ImmutabilityThreshold + if limit-f.frozen > freezerBatchLimit { + limit = f.frozen + freezerBatchLimit + } + var ( + start = time.Now() + first = f.frozen + ancients = make([]common.Hash, 0, limit) + ) + for f.frozen < limit { + // Retrieves all the components of the canonical block + hash := ReadCanonicalHash(nfdb, f.frozen) + if hash == (common.Hash{}) { + log.Error("Canonical hash missing, can't freeze", "number", f.frozen) + break + } + header := ReadHeaderRLP(nfdb, hash, f.frozen) + if len(header) == 0 { + log.Error("Block header missing, can't freeze", "number", f.frozen, "hash", hash) + break + } + body := ReadBodyRLP(nfdb, hash, f.frozen) + if len(body) == 0 { + log.Error("Block body missing, can't freeze", "number", f.frozen, "hash", hash) + break + } + receipts := ReadReceiptsRLP(nfdb, hash, f.frozen) + if len(receipts) == 0 { + log.Error("Block receipts missing, can't freeze", "number", f.frozen, "hash", hash) + break + } + td := ReadTdRLP(nfdb, hash, f.frozen) + if len(td) == 0 { + log.Error("Total difficulty missing, can't freeze", "number", f.frozen, "hash", hash) + break + } + log.Trace("Deep froze ancient block", "number", f.frozen, "hash", hash) + // Inject all the components into the relevant data tables + if err := f.AppendAncient(f.frozen, hash[:], header, body, receipts, td); err != nil { + break + } + ancients = append(ancients, hash) + } + // Batch of blocks have been frozen, flush them before wiping from leveldb + if err := f.Sync(); err != nil { + log.Crit("Failed to flush frozen tables", "err", err) + } + // Wipe out all data from the active database + batch := db.NewBatch() + for i := 0; i < len(ancients); i++ { + // Always keep the genesis block in active database + if first+uint64(i) != 0 { + DeleteBlockWithoutNumber(batch, ancients[i], first+uint64(i)) + DeleteCanonicalHash(batch, first+uint64(i)) + } + } + if err := batch.Write(); err != nil { + log.Crit("Failed to delete frozen canonical blocks", "err", err) + } + batch.Reset() + // Wipe out side chain also. + for number := first; number < f.frozen; number++ { + // Always keep the genesis block in active database + if number != 0 { + for _, hash := range ReadAllHashes(db, number) { + DeleteBlock(batch, hash, number) + } + } + } + if err := batch.Write(); err != nil { + log.Crit("Failed to delete frozen side blocks", "err", err) + } + // Log something friendly for the user + context := []interface{}{ + "blocks", f.frozen - first, "elapsed", common.PrettyDuration(time.Since(start)), "number", f.frozen - 1, + } + if n := len(ancients); n > 0 { + context = append(context, []interface{}{"hash", ancients[n-1]}...) + } + log.Info("Deep froze chain segment", context...) + + // Avoid database thrashing with tiny writes + if f.frozen-first < freezerBatchLimit { + time.Sleep(freezerRecheckInterval) + } + } +} + +// repair truncates all data tables to the same length. +func (f *freezer) repair() error { + min := uint64(math.MaxUint64) + for _, table := range f.tables { + items := atomic.LoadUint64(&table.items) + if min > items { + min = items + } + } + for _, table := range f.tables { + if err := table.truncate(min); err != nil { + return err + } + } + atomic.StoreUint64(&f.frozen, min) + return nil +} diff --git a/core/rawdb/freezer_reinit.go b/core/rawdb/freezer_reinit.go new file mode 100644 index 000000000000..d6bf9ab1dd6a --- /dev/null +++ b/core/rawdb/freezer_reinit.go @@ -0,0 +1,127 @@ +// Copyright 2019 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 rawdb + +import ( + "errors" + "runtime" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/prque" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" +) + +// InitDatabaseFromFreezer reinitializes an empty database from a previous batch +// of frozen ancient blocks. The method iterates over all the frozen blocks and +// injects into the database the block hash->number mappings and the transaction +// lookup entries. +func InitDatabaseFromFreezer(db ethdb.Database) error { + // If we can't access the freezer or it's empty, abort + frozen, err := db.Ancients() + if err != nil || frozen == 0 { + return err + } + // Blocks previously frozen, iterate over- and hash them concurrently + var ( + number = ^uint64(0) // -1 + results = make(chan *types.Block, 4*runtime.NumCPU()) + ) + abort := make(chan struct{}) + defer close(abort) + + for i := 0; i < runtime.NumCPU(); i++ { + go func() { + for { + // Fetch the next task number, terminating if everything's done + n := atomic.AddUint64(&number, 1) + if n >= frozen { + return + } + // Retrieve the block from the freezer. If successful, pre-cache + // the block hash and the individual transaction hashes for storing + // into the database. + block := ReadBlock(db, ReadCanonicalHash(db, n), n) + if block != nil { + block.Hash() + for _, tx := range block.Transactions() { + tx.Hash() + } + } + // Feed the block to the aggregator, or abort on interrupt + select { + case results <- block: + case <-abort: + return + } + } + }() + } + // Reassemble the blocks into a contiguous stream and push them out to disk + var ( + queue = prque.New(nil) + next = int64(0) + + batch = db.NewBatch() + start = time.Now() + logged time.Time + ) + for i := uint64(0); i < frozen; i++ { + // Retrieve the next result and bail if it's nil + block := <-results + if block == nil { + return errors.New("broken ancient database") + } + // Push the block into the import queue and process contiguous ranges + queue.Push(block, -int64(block.NumberU64())) + for !queue.Empty() { + // If the next available item is gapped, return + if _, priority := queue.Peek(); -priority != next { + break + } + // Next block available, pop it off and index it + block = queue.PopItem().(*types.Block) + next++ + + // Inject hash<->number mapping and txlookup indexes + WriteHeaderNumber(batch, block.Hash(), block.NumberU64()) + WriteTxLookupEntries(batch, block) + + // If enough data was accumulated in memory or we're at the last block, dump to disk + if batch.ValueSize() > ethdb.IdealBatchSize || uint64(next) == frozen { + if err := batch.Write(); err != nil { + return err + } + batch.Reset() + } + // If we've spent too much time already, notify the user of what we're doing + if time.Since(logged) > 8*time.Second { + log.Info("Initializing chain from ancient data", "number", block.Number(), "hash", block.Hash(), "total", frozen-1, "elapsed", common.PrettyDuration(time.Since(start))) + logged = time.Now() + } + } + } + hash := ReadCanonicalHash(db, frozen-1) + WriteHeadHeaderHash(db, hash) + WriteHeadFastBlockHash(db, hash) + + log.Info("Initialized chain from ancient data", "number", frozen-1, "hash", hash, "elapsed", common.PrettyDuration(time.Since(start))) + return nil +} diff --git a/core/rawdb/freezer_table.go b/core/rawdb/freezer_table.go new file mode 100644 index 000000000000..9fb341f02558 --- /dev/null +++ b/core/rawdb/freezer_table.go @@ -0,0 +1,637 @@ +// Copyright 2019 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 rawdb + +import ( + "encoding/binary" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "sync" + "sync/atomic" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/golang/snappy" +) + +var ( + // errClosed is returned if an operation attempts to read from or write to the + // freezer table after it has already been closed. + errClosed = errors.New("closed") + + // errOutOfBounds is returned if the item requested is not contained within the + // freezer table. + errOutOfBounds = errors.New("out of bounds") + + // errNotSupported is returned if the database doesn't support the required operation. + errNotSupported = errors.New("this operation is not supported") +) + +// indexEntry contains the number/id of the file that the data resides in, aswell as the +// offset within the file to the end of the data +// In serialized form, the filenum is stored as uint16. +type indexEntry struct { + filenum uint32 // stored as uint16 ( 2 bytes) + offset uint32 // stored as uint32 ( 4 bytes) +} + +const indexEntrySize = 6 + +// unmarshallBinary deserializes binary b into the rawIndex entry. +func (i *indexEntry) unmarshalBinary(b []byte) error { + i.filenum = uint32(binary.BigEndian.Uint16(b[:2])) + i.offset = binary.BigEndian.Uint32(b[2:6]) + return nil +} + +// marshallBinary serializes the rawIndex entry into binary. +func (i *indexEntry) marshallBinary() []byte { + b := make([]byte, indexEntrySize) + binary.BigEndian.PutUint16(b[:2], uint16(i.filenum)) + binary.BigEndian.PutUint32(b[2:6], i.offset) + return b +} + +// freezerTable represents a single chained data table within the freezer (e.g. blocks). +// It consists of a data file (snappy encoded arbitrary data blobs) and an indexEntry +// file (uncompressed 64 bit indices into the data file). +type freezerTable struct { + // WARNING: The `items` field is accessed atomically. On 32 bit platforms, only + // 64-bit aligned fields can be atomic. The struct is guaranteed to be so aligned, + // so take advantage of that (https://golang.org/pkg/sync/atomic/#pkg-note-BUG). + items uint64 // Number of items stored in the table (including items removed from tail) + + noCompression bool // if true, disables snappy compression. Note: does not work retroactively + maxFileSize uint32 // Max file size for data-files + name string + path string + + head *os.File // File descriptor for the data head of the table + files map[uint32]*os.File // open files + headId uint32 // number of the currently active head file + tailId uint32 // number of the earliest file + index *os.File // File descriptor for the indexEntry file of the table + + // In the case that old items are deleted (from the tail), we use itemOffset + // to count how many historic items have gone missing. + itemOffset uint32 // Offset (number of discarded items) + + headBytes uint32 // Number of bytes written to the head file + readMeter metrics.Meter // Meter for measuring the effective amount of data read + writeMeter metrics.Meter // Meter for measuring the effective amount of data written + sizeGauge metrics.Gauge // Gauge for tracking the combined size of all freezer tables + + logger log.Logger // Logger with database path and table name ambedded + lock sync.RWMutex // Mutex protecting the data file descriptors +} + +// newTable opens a freezer table with default settings - 2G files +func newTable(path string, name string, readMeter metrics.Meter, writeMeter metrics.Meter, sizeGauge metrics.Gauge, disableSnappy bool) (*freezerTable, error) { + return newCustomTable(path, name, readMeter, writeMeter, sizeGauge, 2*1000*1000*1000, disableSnappy) +} + +// openFreezerFileForAppend opens a freezer table file and seeks to the end +func openFreezerFileForAppend(filename string) (*os.File, error) { + // Open the file without the O_APPEND flag + // because it has differing behaviour during Truncate operations + // on different OS's + file, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, 0644) + if err != nil { + return nil, err + } + // Seek to end for append + if _, err = file.Seek(0, io.SeekEnd); err != nil { + return nil, err + } + return file, nil +} + +// openFreezerFileForReadOnly opens a freezer table file for read only access +func openFreezerFileForReadOnly(filename string) (*os.File, error) { + return os.OpenFile(filename, os.O_RDONLY, 0644) +} + +// openFreezerFileTruncated opens a freezer table making sure it is truncated +func openFreezerFileTruncated(filename string) (*os.File, error) { + return os.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) +} + +// truncateFreezerFile resizes a freezer table file and seeks to the end +func truncateFreezerFile(file *os.File, size int64) error { + if err := file.Truncate(size); err != nil { + return err + } + // Seek to end for append + if _, err := file.Seek(0, io.SeekEnd); err != nil { + return err + } + return nil +} + +// newCustomTable opens a freezer table, creating the data and index files if they are +// non existent. Both files are truncated to the shortest common length to ensure +// they don't go out of sync. +func newCustomTable(path string, name string, readMeter metrics.Meter, writeMeter metrics.Meter, sizeGauge metrics.Gauge, maxFilesize uint32, noCompression bool) (*freezerTable, error) { + // Ensure the containing directory exists and open the indexEntry file + if err := os.MkdirAll(path, 0755); err != nil { + return nil, err + } + var idxName string + if noCompression { + // Raw idx + idxName = fmt.Sprintf("%s.ridx", name) + } else { + // Compressed idx + idxName = fmt.Sprintf("%s.cidx", name) + } + offsets, err := openFreezerFileForAppend(filepath.Join(path, idxName)) + if err != nil { + return nil, err + } + // Create the table and repair any past inconsistency + tab := &freezerTable{ + index: offsets, + files: make(map[uint32]*os.File), + readMeter: readMeter, + writeMeter: writeMeter, + sizeGauge: sizeGauge, + name: name, + path: path, + logger: log.New("database", path, "table", name), + noCompression: noCompression, + maxFileSize: maxFilesize, + } + if err := tab.repair(); err != nil { + tab.Close() + return nil, err + } + // Initialize the starting size counter + size, err := tab.sizeNolock() + if err != nil { + tab.Close() + return nil, err + } + tab.sizeGauge.Inc(int64(size)) + + return tab, nil +} + +// repair cross checks the head and the index file and truncates them to +// be in sync with each other after a potential crash / data loss. +func (t *freezerTable) repair() error { + // Create a temporary offset buffer to init files with and read indexEntry into + buffer := make([]byte, indexEntrySize) + + // If we've just created the files, initialize the index with the 0 indexEntry + stat, err := t.index.Stat() + if err != nil { + return err + } + if stat.Size() == 0 { + if _, err := t.index.Write(buffer); err != nil { + return err + } + } + // Ensure the index is a multiple of indexEntrySize bytes + if overflow := stat.Size() % indexEntrySize; overflow != 0 { + truncateFreezerFile(t.index, stat.Size()-overflow) // New file can't trigger this path + } + // Retrieve the file sizes and prepare for truncation + if stat, err = t.index.Stat(); err != nil { + return err + } + offsetsSize := stat.Size() + + // Open the head file + var ( + firstIndex indexEntry + lastIndex indexEntry + contentSize int64 + contentExp int64 + ) + // Read index zero, determine what file is the earliest + // and what item offset to use + t.index.ReadAt(buffer, 0) + firstIndex.unmarshalBinary(buffer) + + t.tailId = firstIndex.offset + t.itemOffset = firstIndex.filenum + + t.index.ReadAt(buffer, offsetsSize-indexEntrySize) + lastIndex.unmarshalBinary(buffer) + t.head, err = t.openFile(lastIndex.filenum, openFreezerFileForAppend) + if err != nil { + return err + } + if stat, err = t.head.Stat(); err != nil { + return err + } + contentSize = stat.Size() + + // Keep truncating both files until they come in sync + contentExp = int64(lastIndex.offset) + + for contentExp != contentSize { + // Truncate the head file to the last offset pointer + if contentExp < contentSize { + t.logger.Warn("Truncating dangling head", "indexed", common.StorageSize(contentExp), "stored", common.StorageSize(contentSize)) + if err := truncateFreezerFile(t.head, contentExp); err != nil { + return err + } + contentSize = contentExp + } + // Truncate the index to point within the head file + if contentExp > contentSize { + t.logger.Warn("Truncating dangling indexes", "indexed", common.StorageSize(contentExp), "stored", common.StorageSize(contentSize)) + if err := truncateFreezerFile(t.index, offsetsSize-indexEntrySize); err != nil { + return err + } + offsetsSize -= indexEntrySize + t.index.ReadAt(buffer, offsetsSize-indexEntrySize) + var newLastIndex indexEntry + newLastIndex.unmarshalBinary(buffer) + // We might have slipped back into an earlier head-file here + if newLastIndex.filenum != lastIndex.filenum { + // Release earlier opened file + t.releaseFile(lastIndex.filenum) + if t.head, err = t.openFile(newLastIndex.filenum, openFreezerFileForAppend); err != nil { + return err + } + if stat, err = t.head.Stat(); err != nil { + // TODO, anything more we can do here? + // A data file has gone missing... + return err + } + contentSize = stat.Size() + } + lastIndex = newLastIndex + contentExp = int64(lastIndex.offset) + } + } + // Ensure all reparation changes have been written to disk + if err := t.index.Sync(); err != nil { + return err + } + if err := t.head.Sync(); err != nil { + return err + } + // Update the item and byte counters and return + t.items = uint64(t.itemOffset) + uint64(offsetsSize/indexEntrySize-1) // last indexEntry points to the end of the data file + t.headBytes = uint32(contentSize) + t.headId = lastIndex.filenum + + // Close opened files and preopen all files + if err := t.preopen(); err != nil { + return err + } + t.logger.Debug("Chain freezer table opened", "items", t.items, "size", common.StorageSize(t.headBytes)) + return nil +} + +// preopen opens all files that the freezer will need. This method should be called from an init-context, +// since it assumes that it doesn't have to bother with locking +// The rationale for doing preopen is to not have to do it from within Retrieve, thus not needing to ever +// obtain a write-lock within Retrieve. +func (t *freezerTable) preopen() (err error) { + // The repair might have already opened (some) files + t.releaseFilesAfter(0, false) + // Open all except head in RDONLY + for i := t.tailId; i < t.headId; i++ { + if _, err = t.openFile(i, openFreezerFileForReadOnly); err != nil { + return err + } + } + // Open head in read/write + t.head, err = t.openFile(t.headId, openFreezerFileForAppend) + return err +} + +// truncate discards any recent data above the provided threshold number. +func (t *freezerTable) truncate(items uint64) error { + t.lock.Lock() + defer t.lock.Unlock() + + // If our item count is correct, don't do anything + if atomic.LoadUint64(&t.items) <= items { + return nil + } + // We need to truncate, save the old size for metrics tracking + oldSize, err := t.sizeNolock() + if err != nil { + return err + } + // Something's out of sync, truncate the table's offset index + t.logger.Warn("Truncating freezer table", "items", t.items, "limit", items) + if err := truncateFreezerFile(t.index, int64(items+1)*indexEntrySize); err != nil { + return err + } + // Calculate the new expected size of the data file and truncate it + buffer := make([]byte, indexEntrySize) + if _, err := t.index.ReadAt(buffer, int64(items*indexEntrySize)); err != nil { + return err + } + var expected indexEntry + expected.unmarshalBinary(buffer) + + // We might need to truncate back to older files + if expected.filenum != t.headId { + // If already open for reading, force-reopen for writing + t.releaseFile(expected.filenum) + newHead, err := t.openFile(expected.filenum, openFreezerFileForAppend) + if err != nil { + return err + } + // Release any files _after the current head -- both the previous head + // and any files which may have been opened for reading + t.releaseFilesAfter(expected.filenum, true) + // Set back the historic head + t.head = newHead + atomic.StoreUint32(&t.headId, expected.filenum) + } + if err := truncateFreezerFile(t.head, int64(expected.offset)); err != nil { + return err + } + // All data files truncated, set internal counters and return + atomic.StoreUint64(&t.items, items) + atomic.StoreUint32(&t.headBytes, expected.offset) + + // Retrieve the new size and update the total size counter + newSize, err := t.sizeNolock() + if err != nil { + return err + } + t.sizeGauge.Dec(int64(oldSize - newSize)) + + return nil +} + +// Close closes all opened files. +func (t *freezerTable) Close() error { + t.lock.Lock() + defer t.lock.Unlock() + + var errs []error + if err := t.index.Close(); err != nil { + errs = append(errs, err) + } + t.index = nil + + for _, f := range t.files { + if err := f.Close(); err != nil { + errs = append(errs, err) + } + } + t.head = nil + + if errs != nil { + return fmt.Errorf("%v", errs) + } + return nil +} + +// openFile assumes that the write-lock is held by the caller +func (t *freezerTable) openFile(num uint32, opener func(string) (*os.File, error)) (f *os.File, err error) { + var exist bool + if f, exist = t.files[num]; !exist { + var name string + if t.noCompression { + name = fmt.Sprintf("%s.%04d.rdat", t.name, num) + } else { + name = fmt.Sprintf("%s.%04d.cdat", t.name, num) + } + f, err = opener(filepath.Join(t.path, name)) + if err != nil { + return nil, err + } + t.files[num] = f + } + return f, err +} + +// releaseFile closes a file, and removes it from the open file cache. +// Assumes that the caller holds the write lock +func (t *freezerTable) releaseFile(num uint32) { + if f, exist := t.files[num]; exist { + delete(t.files, num) + f.Close() + } +} + +// releaseFilesAfter closes all open files with a higher number, and optionally also deletes the files +func (t *freezerTable) releaseFilesAfter(num uint32, remove bool) { + for fnum, f := range t.files { + if fnum > num { + delete(t.files, fnum) + f.Close() + if remove { + os.Remove(f.Name()) + } + } + } +} + +// Append injects a binary blob at the end of the freezer table. The item number +// is a precautionary parameter to ensure data correctness, but the table will +// reject already existing data. +// +// Note, this method will *not* flush any data to disk so be sure to explicitly +// fsync before irreversibly deleting data from the database. +func (t *freezerTable) Append(item uint64, blob []byte) error { + // Read lock prevents competition with truncate + t.lock.RLock() + // Ensure the table is still accessible + if t.index == nil || t.head == nil { + t.lock.RUnlock() + return errClosed + } + // Ensure only the next item can be written, nothing else + if atomic.LoadUint64(&t.items) != item { + t.lock.RUnlock() + return fmt.Errorf("appending unexpected item: want %d, have %d", t.items, item) + } + // Encode the blob and write it into the data file + if !t.noCompression { + blob = snappy.Encode(nil, blob) + } + bLen := uint32(len(blob)) + if t.headBytes+bLen < bLen || + t.headBytes+bLen > t.maxFileSize { + // we need a new file, writing would overflow + t.lock.RUnlock() + t.lock.Lock() + nextID := atomic.LoadUint32(&t.headId) + 1 + // We open the next file in truncated mode -- if this file already + // exists, we need to start over from scratch on it + newHead, err := t.openFile(nextID, openFreezerFileTruncated) + if err != nil { + t.lock.Unlock() + return err + } + // Close old file, and reopen in RDONLY mode + t.releaseFile(t.headId) + t.openFile(t.headId, openFreezerFileForReadOnly) + + // Swap out the current head + t.head = newHead + atomic.StoreUint32(&t.headBytes, 0) + atomic.StoreUint32(&t.headId, nextID) + t.lock.Unlock() + t.lock.RLock() + } + + defer t.lock.RUnlock() + if _, err := t.head.Write(blob); err != nil { + return err + } + newOffset := atomic.AddUint32(&t.headBytes, bLen) + idx := indexEntry{ + filenum: atomic.LoadUint32(&t.headId), + offset: newOffset, + } + // Write indexEntry + t.index.Write(idx.marshallBinary()) + + t.writeMeter.Mark(int64(bLen + indexEntrySize)) + t.sizeGauge.Inc(int64(bLen + indexEntrySize)) + + atomic.AddUint64(&t.items, 1) + return nil +} + +// getBounds returns the indexes for the item +// returns start, end, filenumber and error +func (t *freezerTable) getBounds(item uint64) (uint32, uint32, uint32, error) { + var startIdx, endIdx indexEntry + buffer := make([]byte, indexEntrySize) + if _, err := t.index.ReadAt(buffer, int64(item*indexEntrySize)); err != nil { + return 0, 0, 0, err + } + startIdx.unmarshalBinary(buffer) + if _, err := t.index.ReadAt(buffer, int64((item+1)*indexEntrySize)); err != nil { + return 0, 0, 0, err + } + endIdx.unmarshalBinary(buffer) + if startIdx.filenum != endIdx.filenum { + // If a piece of data 'crosses' a data-file, + // it's actually in one piece on the second data-file. + // We return a zero-indexEntry for the second file as start + return 0, endIdx.offset, endIdx.filenum, nil + } + return startIdx.offset, endIdx.offset, endIdx.filenum, nil +} + +// Retrieve looks up the data offset of an item with the given number and retrieves +// the raw binary blob from the data file. +func (t *freezerTable) Retrieve(item uint64) ([]byte, error) { + // Ensure the table and the item is accessible + if t.index == nil || t.head == nil { + return nil, errClosed + } + if atomic.LoadUint64(&t.items) <= item { + return nil, errOutOfBounds + } + // Ensure the item was not deleted from the tail either + offset := atomic.LoadUint32(&t.itemOffset) + if uint64(offset) > item { + return nil, errOutOfBounds + } + t.lock.RLock() + startOffset, endOffset, filenum, err := t.getBounds(item - uint64(offset)) + if err != nil { + t.lock.RUnlock() + return nil, err + } + dataFile, exist := t.files[filenum] + if !exist { + t.lock.RUnlock() + return nil, fmt.Errorf("missing data file %d", filenum) + } + // Retrieve the data itself, decompress and return + blob := make([]byte, endOffset-startOffset) + if _, err := dataFile.ReadAt(blob, int64(startOffset)); err != nil { + t.lock.RUnlock() + return nil, err + } + t.lock.RUnlock() + t.readMeter.Mark(int64(len(blob) + 2*indexEntrySize)) + + if t.noCompression { + return blob, nil + } + return snappy.Decode(nil, blob) +} + +// has returns an indicator whether the specified number data +// exists in the freezer table. +func (t *freezerTable) has(number uint64) bool { + return atomic.LoadUint64(&t.items) > number +} + +// size returns the total data size in the freezer table. +func (t *freezerTable) size() (uint64, error) { + t.lock.RLock() + defer t.lock.RUnlock() + + return t.sizeNolock() +} + +// sizeNolock returns the total data size in the freezer table without obtaining +// the mutex first. +func (t *freezerTable) sizeNolock() (uint64, error) { + stat, err := t.index.Stat() + if err != nil { + return 0, err + } + total := uint64(t.maxFileSize)*uint64(t.headId-t.tailId) + uint64(t.headBytes) + uint64(stat.Size()) + return total, nil +} + +// Sync pushes any pending data from memory out to disk. This is an expensive +// operation, so use it with care. +func (t *freezerTable) Sync() error { + if err := t.index.Sync(); err != nil { + return err + } + return t.head.Sync() +} + +// printIndex is a debug print utility function for testing +func (t *freezerTable) printIndex() { + buf := make([]byte, indexEntrySize) + + fmt.Printf("|-----------------|\n") + fmt.Printf("| fileno | offset |\n") + fmt.Printf("|--------+--------|\n") + + for i := uint64(0); ; i++ { + if _, err := t.index.ReadAt(buf, int64(i*indexEntrySize)); err != nil { + break + } + var entry indexEntry + entry.unmarshalBinary(buf) + fmt.Printf("| %03d | %03d | \n", entry.filenum, entry.offset) + if i > 100 { + fmt.Printf(" ... \n") + break + } + } + fmt.Printf("|-----------------|\n") +} diff --git a/core/rawdb/freezer_table_test.go b/core/rawdb/freezer_table_test.go new file mode 100644 index 000000000000..e4a22b376869 --- /dev/null +++ b/core/rawdb/freezer_table_test.go @@ -0,0 +1,616 @@ +// Copyright 2019 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 rawdb + +import ( + "bytes" + "fmt" + "math/rand" + "os" + "path/filepath" + "testing" + "time" + + "github.com/ethereum/go-ethereum/metrics" +) + +func init() { + rand.Seed(time.Now().Unix()) +} + +// Gets a chunk of data, filled with 'b' +func getChunk(size int, b int) []byte { + data := make([]byte, size) + for i := range data { + data[i] = byte(b) + } + return data +} + +// TestFreezerBasics test initializing a freezertable from scratch, writing to the table, +// and reading it back. +func TestFreezerBasics(t *testing.T) { + t.Parallel() + // set cutoff at 50 bytes + f, err := newCustomTable(os.TempDir(), + fmt.Sprintf("unittest-%d", rand.Uint64()), + metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge(), 50, true) + if err != nil { + t.Fatal(err) + } + defer f.Close() + // Write 15 bytes 255 times, results in 85 files + for x := 0; x < 255; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + } + + //print(t, f, 0) + //print(t, f, 1) + //print(t, f, 2) + // + //db[0] = 000000000000000000000000000000 + //db[1] = 010101010101010101010101010101 + //db[2] = 020202020202020202020202020202 + + for y := 0; y < 255; y++ { + exp := getChunk(15, y) + got, err := f.Retrieve(uint64(y)) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(got, exp) { + t.Fatalf("test %d, got \n%x != \n%x", y, got, exp) + } + } + // Check that we cannot read too far + _, err = f.Retrieve(uint64(255)) + if err != errOutOfBounds { + t.Fatal(err) + } +} + +// TestFreezerBasicsClosing tests same as TestFreezerBasics, but also closes and reopens the freezer between +// every operation +func TestFreezerBasicsClosing(t *testing.T) { + t.Parallel() + // set cutoff at 50 bytes + var ( + fname = fmt.Sprintf("basics-close-%d", rand.Uint64()) + rm, wm, sg = metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge() + f *freezerTable + err error + ) + f, err = newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 15 bytes 255 times, results in 85 files + for x := 0; x < 255; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + f.Close() + f, err = newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + } + defer f.Close() + + for y := 0; y < 255; y++ { + exp := getChunk(15, y) + got, err := f.Retrieve(uint64(y)) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(got, exp) { + t.Fatalf("test %d, got \n%x != \n%x", y, got, exp) + } + f.Close() + f, err = newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + } +} + +// TestFreezerRepairDanglingHead tests that we can recover if index entries are removed +func TestFreezerRepairDanglingHead(t *testing.T) { + t.Parallel() + rm, wm, sg := metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge() + fname := fmt.Sprintf("dangling_headtest-%d", rand.Uint64()) + + { // Fill table + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 15 bytes 255 times + for x := 0; x < 255; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + } + // The last item should be there + if _, err = f.Retrieve(0xfe); err != nil { + t.Fatal(err) + } + f.Close() + } + // open the index + idxFile, err := os.OpenFile(filepath.Join(os.TempDir(), fmt.Sprintf("%s.ridx", fname)), os.O_RDWR, 0644) + if err != nil { + t.Fatalf("Failed to open index file: %v", err) + } + // Remove 4 bytes + stat, err := idxFile.Stat() + if err != nil { + t.Fatalf("Failed to stat index file: %v", err) + } + idxFile.Truncate(stat.Size() - 4) + idxFile.Close() + // Now open it again + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + // The last item should be missing + if _, err = f.Retrieve(0xff); err == nil { + t.Errorf("Expected error for missing index entry") + } + // The one before should still be there + if _, err = f.Retrieve(0xfd); err != nil { + t.Fatalf("Expected no error, got %v", err) + } + } +} + +// TestFreezerRepairDanglingHeadLarge tests that we can recover if very many index entries are removed +func TestFreezerRepairDanglingHeadLarge(t *testing.T) { + t.Parallel() + rm, wm, sg := metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge() + fname := fmt.Sprintf("dangling_headtest-%d", rand.Uint64()) + + { // Fill a table and close it + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 15 bytes 255 times + for x := 0; x < 0xff; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + } + // The last item should be there + if _, err = f.Retrieve(f.items - 1); err == nil { + if err != nil { + t.Fatal(err) + } + } + f.Close() + } + // open the index + idxFile, err := os.OpenFile(filepath.Join(os.TempDir(), fmt.Sprintf("%s.ridx", fname)), os.O_RDWR, 0644) + if err != nil { + t.Fatalf("Failed to open index file: %v", err) + } + // Remove everything but the first item, and leave data unaligned + // 0-indexEntry, 1-indexEntry, corrupt-indexEntry + idxFile.Truncate(indexEntrySize + indexEntrySize + indexEntrySize/2) + idxFile.Close() + // Now open it again + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + // The first item should be there + if _, err = f.Retrieve(0); err != nil { + t.Fatal(err) + } + // The second item should be missing + if _, err = f.Retrieve(1); err == nil { + t.Errorf("Expected error for missing index entry") + } + // We should now be able to store items again, from item = 1 + for x := 1; x < 0xff; x++ { + data := getChunk(15, ^x) + f.Append(uint64(x), data) + } + f.Close() + } + // And if we open it, we should now be able to read all of them (new values) + { + f, _ := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + for y := 1; y < 255; y++ { + exp := getChunk(15, ^y) + got, err := f.Retrieve(uint64(y)) + if err != nil { + t.Fatal(err) + } + if !bytes.Equal(got, exp) { + t.Fatalf("test %d, got \n%x != \n%x", y, got, exp) + } + } + } +} + +// TestSnappyDetection tests that we fail to open a snappy database and vice versa +func TestSnappyDetection(t *testing.T) { + t.Parallel() + rm, wm, sg := metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge() + fname := fmt.Sprintf("snappytest-%d", rand.Uint64()) + // Open with snappy + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 15 bytes 255 times + for x := 0; x < 0xff; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + } + f.Close() + } + // Open without snappy + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, false) + if err != nil { + t.Fatal(err) + } + if _, err = f.Retrieve(0); err == nil { + f.Close() + t.Fatalf("expected empty table") + } + } + + // Open with snappy + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + // There should be 255 items + if _, err = f.Retrieve(0xfe); err != nil { + f.Close() + t.Fatalf("expected no error, got %v", err) + } + } + +} +func assertFileSize(f string, size int64) error { + stat, err := os.Stat(f) + if err != nil { + return err + } + if stat.Size() != size { + return fmt.Errorf("error, expected size %d, got %d", size, stat.Size()) + } + return nil + +} + +// TestFreezerRepairDanglingIndex checks that if the index has more entries than there are data, +// the index is repaired +func TestFreezerRepairDanglingIndex(t *testing.T) { + t.Parallel() + rm, wm, sg := metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge() + fname := fmt.Sprintf("dangling_indextest-%d", rand.Uint64()) + + { // Fill a table and close it + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 15 bytes 9 times : 150 bytes + for x := 0; x < 9; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + } + // The last item should be there + if _, err = f.Retrieve(f.items - 1); err != nil { + f.Close() + t.Fatal(err) + } + f.Close() + // File sizes should be 45, 45, 45 : items[3, 3, 3) + } + // Crop third file + fileToCrop := filepath.Join(os.TempDir(), fmt.Sprintf("%s.0002.rdat", fname)) + // Truncate third file: 45 ,45, 20 + { + if err := assertFileSize(fileToCrop, 45); err != nil { + t.Fatal(err) + } + file, err := os.OpenFile(fileToCrop, os.O_RDWR, 0644) + if err != nil { + t.Fatal(err) + } + file.Truncate(20) + file.Close() + } + // Open db it again + // It should restore the file(s) to + // 45, 45, 15 + // with 3+3+1 items + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + if f.items != 7 { + f.Close() + t.Fatalf("expected %d items, got %d", 7, f.items) + } + if err := assertFileSize(fileToCrop, 15); err != nil { + t.Fatal(err) + } + } +} + +func TestFreezerTruncate(t *testing.T) { + + t.Parallel() + rm, wm, sg := metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge() + fname := fmt.Sprintf("truncation-%d", rand.Uint64()) + + { // Fill table + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 15 bytes 30 times + for x := 0; x < 30; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + } + // The last item should be there + if _, err = f.Retrieve(f.items - 1); err != nil { + t.Fatal(err) + } + f.Close() + } + // Reopen, truncate + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + defer f.Close() + f.truncate(10) // 150 bytes + if f.items != 10 { + t.Fatalf("expected %d items, got %d", 10, f.items) + } + // 45, 45, 45, 15 -- bytes should be 15 + if f.headBytes != 15 { + t.Fatalf("expected %d bytes, got %d", 15, f.headBytes) + } + + } + +} + +// TestFreezerRepairFirstFile tests a head file with the very first item only half-written. +// That will rewind the index, and _should_ truncate the head file +func TestFreezerRepairFirstFile(t *testing.T) { + t.Parallel() + rm, wm, sg := metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge() + fname := fmt.Sprintf("truncationfirst-%d", rand.Uint64()) + { // Fill table + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 80 bytes, splitting out into two files + f.Append(0, getChunk(40, 0xFF)) + f.Append(1, getChunk(40, 0xEE)) + // The last item should be there + if _, err = f.Retrieve(f.items - 1); err != nil { + t.Fatal(err) + } + f.Close() + } + // Truncate the file in half + fileToCrop := filepath.Join(os.TempDir(), fmt.Sprintf("%s.0001.rdat", fname)) + { + if err := assertFileSize(fileToCrop, 40); err != nil { + t.Fatal(err) + } + file, err := os.OpenFile(fileToCrop, os.O_RDWR, 0644) + if err != nil { + t.Fatal(err) + } + file.Truncate(20) + file.Close() + } + // Reopen + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + if f.items != 1 { + f.Close() + t.Fatalf("expected %d items, got %d", 0, f.items) + } + // Write 40 bytes + f.Append(1, getChunk(40, 0xDD)) + f.Close() + // Should have been truncated down to zero and then 40 written + if err := assertFileSize(fileToCrop, 40); err != nil { + t.Fatal(err) + } + } +} + +// TestFreezerReadAndTruncate tests: +// - we have a table open +// - do some reads, so files are open in readonly +// - truncate so those files are 'removed' +// - check that we did not keep the rdonly file descriptors +func TestFreezerReadAndTruncate(t *testing.T) { + t.Parallel() + rm, wm, sg := metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge() + fname := fmt.Sprintf("read_truncate-%d", rand.Uint64()) + { // Fill table + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + // Write 15 bytes 30 times + for x := 0; x < 30; x++ { + data := getChunk(15, x) + f.Append(uint64(x), data) + } + // The last item should be there + if _, err = f.Retrieve(f.items - 1); err != nil { + t.Fatal(err) + } + f.Close() + } + // Reopen and read all files + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 50, true) + if err != nil { + t.Fatal(err) + } + if f.items != 30 { + f.Close() + t.Fatalf("expected %d items, got %d", 0, f.items) + } + for y := byte(0); y < 30; y++ { + f.Retrieve(uint64(y)) + } + // Now, truncate back to zero + f.truncate(0) + // Write the data again + for x := 0; x < 30; x++ { + data := getChunk(15, ^x) + if err := f.Append(uint64(x), data); err != nil { + t.Fatalf("error %v", err) + } + } + f.Close() + } +} + +func TestOffset(t *testing.T) { + t.Parallel() + rm, wm, sg := metrics.NewMeter(), metrics.NewMeter(), metrics.NewGauge() + fname := fmt.Sprintf("offset-%d", rand.Uint64()) + { // Fill table + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 40, true) + if err != nil { + t.Fatal(err) + } + // Write 6 x 20 bytes, splitting out into three files + f.Append(0, getChunk(20, 0xFF)) + f.Append(1, getChunk(20, 0xEE)) + + f.Append(2, getChunk(20, 0xdd)) + f.Append(3, getChunk(20, 0xcc)) + + f.Append(4, getChunk(20, 0xbb)) + f.Append(5, getChunk(20, 0xaa)) + f.printIndex() + f.Close() + } + // Now crop it. + { + // delete files 0 and 1 + for i := 0; i < 2; i++ { + p := filepath.Join(os.TempDir(), fmt.Sprintf("%v.%04d.rdat", fname, i)) + if err := os.Remove(p); err != nil { + t.Fatal(err) + } + } + // Read the index file + p := filepath.Join(os.TempDir(), fmt.Sprintf("%v.ridx", fname)) + indexFile, err := os.OpenFile(p, os.O_RDWR, 0644) + if err != nil { + t.Fatal(err) + } + indexBuf := make([]byte, 7*indexEntrySize) + indexFile.Read(indexBuf) + + // Update the index file, so that we store + // [ file = 2, offset = 4 ] at index zero + + tailId := uint32(2) // First file is 2 + itemOffset := uint32(4) // We have removed four items + zeroIndex := indexEntry{ + offset: tailId, + filenum: itemOffset, + } + buf := zeroIndex.marshallBinary() + // Overwrite index zero + copy(indexBuf, buf) + // Remove the four next indices by overwriting + copy(indexBuf[indexEntrySize:], indexBuf[indexEntrySize*5:]) + indexFile.WriteAt(indexBuf, 0) + // Need to truncate the moved index items + indexFile.Truncate(indexEntrySize * (1 + 2)) + indexFile.Close() + + } + // Now open again + { + f, err := newCustomTable(os.TempDir(), fname, rm, wm, sg, 40, true) + if err != nil { + t.Fatal(err) + } + f.printIndex() + // It should allow writing item 6 + f.Append(6, getChunk(20, 0x99)) + + // It should be fine to fetch 4,5,6 + if got, err := f.Retrieve(4); err != nil { + t.Fatal(err) + } else if exp := getChunk(20, 0xbb); !bytes.Equal(got, exp) { + t.Fatalf("expected %x got %x", exp, got) + } + if got, err := f.Retrieve(5); err != nil { + t.Fatal(err) + } else if exp := getChunk(20, 0xaa); !bytes.Equal(got, exp) { + t.Fatalf("expected %x got %x", exp, got) + } + if got, err := f.Retrieve(6); err != nil { + t.Fatal(err) + } else if exp := getChunk(20, 0x99); !bytes.Equal(got, exp) { + t.Fatalf("expected %x got %x", exp, got) + } + + // It should error at 0, 1,2,3 + for i := 0; i < 4; i++ { + if _, err := f.Retrieve(uint64(i)); err == nil { + t.Fatal("expected err") + } + } + } +} + +// TODO (?) +// - test that if we remove several head-files, aswell as data last data-file, +// the index is truncated accordingly +// Right now, the freezer would fail on these conditions: +// 1. have data files d0, d1, d2, d3 +// 2. remove d2,d3 +// +// However, all 'normal' failure modes arising due to failing to sync() or save a file should be +// handled already, and the case described above can only (?) happen if an external process/user +// deletes files from the filesystem. diff --git a/core/rawdb/interfaces.go b/core/rawdb/interfaces.go deleted file mode 100644 index 3bdf55124a03..000000000000 --- a/core/rawdb/interfaces.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2018 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 rawdb - -// DatabaseReader wraps the Has and Get method of a backing data store. -type DatabaseReader interface { - Has(key []byte) (bool, error) - Get(key []byte) ([]byte, error) -} - -// DatabaseWriter wraps the Put method of a backing data store. -type DatabaseWriter interface { - Put(key []byte, value []byte) error -} - -// DatabaseDeleter wraps the Delete method of a backing data store. -type DatabaseDeleter interface { - Delete(key []byte) error -} diff --git a/core/rawdb/schema.go b/core/rawdb/schema.go index 02b3b7279ed9..a44a2c99f94f 100644 --- a/core/rawdb/schema.go +++ b/core/rawdb/schema.go @@ -20,8 +20,8 @@ package rawdb import ( "encoding/binary" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/metrics" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/metrics" ) // The fields below define the low level database schema prefixing. @@ -29,10 +29,10 @@ var ( // databaseVerisionKey tracks the current database version. databaseVerisionKey = []byte("DatabaseVersion") - // headHeaderKey tracks the latest know header's hash. + // headHeaderKey tracks the latest known header's hash. headHeaderKey = []byte("LastHeader") - // headBlockKey tracks the latest know full block's hash. + // headBlockKey tracks the latest known full block's hash. headBlockKey = []byte("LastBlock") // headFastBlockKey tracks the latest known incomplete block's hash during fast sync. @@ -63,9 +63,36 @@ var ( preimageHitCounter = metrics.NewRegisteredCounter("db/preimage/hits", nil) ) -// TxLookupEntry is a positional metadata to help looking up the data content of -// a transaction or receipt given only its hash. -type TxLookupEntry struct { +const ( + // freezerHeaderTable indicates the name of the freezer header table. + freezerHeaderTable = "headers" + + // freezerHashTable indicates the name of the freezer canonical hash table. + freezerHashTable = "hashes" + + // freezerBodiesTable indicates the name of the freezer block body table. + freezerBodiesTable = "bodies" + + // freezerReceiptTable indicates the name of the freezer receipts table. + freezerReceiptTable = "receipts" + + // freezerDifficultyTable indicates the name of the freezer total difficulty table. + freezerDifficultyTable = "diffs" +) + +// freezerNoSnappy configures whether compression is disabled for the ancient-tables. +// Hashes and difficulties don't compress well. +var freezerNoSnappy = map[string]bool{ + freezerHeaderTable: false, + freezerHashTable: true, + freezerBodiesTable: false, + freezerReceiptTable: false, + freezerDifficultyTable: true, +} + +// LegacyTxLookupEntry is the legacy TxLookupEntry definition with some unnecessary +// fields. +type LegacyTxLookupEntry struct { BlockHash common.Hash BlockIndex uint64 Index uint64 @@ -78,6 +105,11 @@ func encodeBlockNumber(number uint64) []byte { return enc } +// headerKeyPrefix = headerPrefix + num (uint64 big endian) +func headerKeyPrefix(number uint64) []byte { + return append(headerPrefix, encodeBlockNumber(number)...) +} + // headerKey = headerPrefix + num (uint64 big endian) + hash func headerKey(number uint64, hash common.Hash) []byte { return append(append(headerPrefix, encodeBlockNumber(number)...), hash.Bytes()...) diff --git a/core/rawdb/table.go b/core/rawdb/table.go new file mode 100644 index 000000000000..6610b7f5a256 --- /dev/null +++ b/core/rawdb/table.go @@ -0,0 +1,204 @@ +// Copyright 2018 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 rawdb + +import ( + "github.com/ethereum/go-ethereum/ethdb" +) + +// table is a wrapper around a database that prefixes each key access with a pre- +// configured string. +type table struct { + db ethdb.Database + prefix string +} + +// NewTable returns a database object that prefixes all keys with a given string. +func NewTable(db ethdb.Database, prefix string) ethdb.Database { + return &table{ + db: db, + prefix: prefix, + } +} + +// Close is a noop to implement the Database interface. +func (t *table) Close() error { + return nil +} + +// Has retrieves if a prefixed version of a key is present in the database. +func (t *table) Has(key []byte) (bool, error) { + return t.db.Has(append([]byte(t.prefix), key...)) +} + +// Get retrieves the given prefixed key if it's present in the database. +func (t *table) Get(key []byte) ([]byte, error) { + return t.db.Get(append([]byte(t.prefix), key...)) +} + +// HasAncient is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) HasAncient(kind string, number uint64) (bool, error) { + return t.db.HasAncient(kind, number) +} + +// Ancient is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) Ancient(kind string, number uint64) ([]byte, error) { + return t.db.Ancient(kind, number) +} + +// Ancients is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) Ancients() (uint64, error) { + return t.db.Ancients() +} + +// AncientSize is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) AncientSize(kind string) (uint64, error) { + return t.db.AncientSize(kind) +} + +// AppendAncient is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) AppendAncient(number uint64, hash, header, body, receipts, td []byte) error { + return t.db.AppendAncient(number, hash, header, body, receipts, td) +} + +// TruncateAncients is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) TruncateAncients(items uint64) error { + return t.db.TruncateAncients(items) +} + +// Sync is a noop passthrough that just forwards the request to the underlying +// database. +func (t *table) Sync() error { + return t.db.Sync() +} + +// Put inserts the given value into the database at a prefixed version of the +// provided key. +func (t *table) Put(key []byte, value []byte) error { + return t.db.Put(append([]byte(t.prefix), key...), value) +} + +// Delete removes the given prefixed key from the database. +func (t *table) Delete(key []byte) error { + return t.db.Delete(append([]byte(t.prefix), key...)) +} + +// NewIterator creates a binary-alphabetical iterator over the entire keyspace +// contained within the database. +func (t *table) NewIterator() ethdb.Iterator { + return t.NewIteratorWithPrefix(nil) +} + +// NewIteratorWithStart creates a binary-alphabetical iterator over a subset of +// database content starting at a particular initial key (or after, if it does +// not exist). +func (t *table) NewIteratorWithStart(start []byte) ethdb.Iterator { + return t.db.NewIteratorWithStart(start) +} + +// NewIteratorWithPrefix creates a binary-alphabetical iterator over a subset +// of database content with a particular key prefix. +func (t *table) NewIteratorWithPrefix(prefix []byte) ethdb.Iterator { + return t.db.NewIteratorWithPrefix(append([]byte(t.prefix), prefix...)) +} + +// Stat returns a particular internal stat of the database. +func (t *table) Stat(property string) (string, error) { + return t.db.Stat(property) +} + +// Compact flattens the underlying data store for the given key range. In essence, +// deleted and overwritten versions are discarded, and the data is rearranged to +// reduce the cost of operations needed to access them. +// +// A nil start is treated as a key before all keys in the data store; a nil limit +// is treated as a key after all keys in the data store. If both is nil then it +// will compact entire data store. +func (t *table) Compact(start []byte, limit []byte) error { + // If no start was specified, use the table prefix as the first value + if start == nil { + start = []byte(t.prefix) + } + // If no limit was specified, use the first element not matching the prefix + // as the limit + if limit == nil { + limit = []byte(t.prefix) + for i := len(limit) - 1; i >= 0; i-- { + // Bump the current character, stopping if it doesn't overflow + limit[i]++ + if limit[i] > 0 { + break + } + // Character overflown, proceed to the next or nil if the last + if i == 0 { + limit = nil + } + } + } + // Range correctly calculated based on table prefix, delegate down + return t.db.Compact(start, limit) +} + +// NewBatch creates a write-only database that buffers changes to its host db +// until a final write is called, each operation prefixing all keys with the +// pre-configured string. +func (t *table) NewBatch() ethdb.Batch { + return &tableBatch{t.db.NewBatch(), t.prefix} +} + +// tableBatch is a wrapper around a database batch that prefixes each key access +// with a pre-configured string. +type tableBatch struct { + batch ethdb.Batch + prefix string +} + +// Put inserts the given value into the batch for later committing. +func (b *tableBatch) Put(key, value []byte) error { + return b.batch.Put(append([]byte(b.prefix), key...), value) +} + +// Delete inserts the a key removal into the batch for later committing. +func (b *tableBatch) Delete(key []byte) error { + return b.batch.Delete(append([]byte(b.prefix), key...)) +} + +// ValueSize retrieves the amount of data queued up for writing. +func (b *tableBatch) ValueSize() int { + return b.batch.ValueSize() +} + +// Write flushes any accumulated data to disk. +func (b *tableBatch) Write() error { + return b.batch.Write() +} + +// Reset resets the batch for reuse. +func (b *tableBatch) Reset() { + b.batch.Reset() +} + +// Replay replays the batch contents. +func (b *tableBatch) Replay(w ethdb.KeyValueWriter) error { + return b.batch.Replay(w) +} diff --git a/core/state/database.go b/core/state/database.go index 4634e5e45df0..ecc2c134da6c 100644 --- a/core/state/database.go +++ b/core/state/database.go @@ -18,22 +18,14 @@ package state import ( "fmt" - "sync" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/trie" lru "github.com/hashicorp/golang-lru" ) -// Trie cache generation limit after which to evict trie nodes from memory. -var MaxTrieCacheGen = uint16(120) - const ( - // Number of past tries to keep. This value is chosen such that - // reasonable chain reorg depths will hit an existing trie. - maxPastTries = 12 - // Number of codehash->size associations to keep. codeSizeCacheSize = 100000 ) @@ -59,28 +51,61 @@ type Database interface { TrieDB() *trie.Database } -// Trie is a Ethereum Merkle Trie. +// Trie is a Ethereum Merkle Patricia trie. type Trie interface { + // GetKey returns the sha3 preimage of a hashed key that was previously used + // to store a value. + // + // TODO(fjl): remove this when SecureTrie is removed + GetKey([]byte) []byte + + // TryGet returns the value for key stored in the trie. The value bytes must + // not be modified by the caller. If a node was not found in the database, a + // trie.MissingNodeError is returned. TryGet(key []byte) ([]byte, error) + + // TryUpdate associates key with value in the trie. If value has length zero, any + // existing value is deleted from the trie. The value bytes must not be modified + // by the caller while they are stored in the trie. If a node was not found in the + // database, a trie.MissingNodeError is returned. TryUpdate(key, value []byte) error + + // TryDelete removes any existing value for key from the trie. If a node was not + // found in the database, a trie.MissingNodeError is returned. TryDelete(key []byte) error - Commit(onleaf trie.LeafCallback) (common.Hash, error) + + // Hash returns the root hash of the trie. It does not write to the database and + // can be used even if the trie doesn't have one. Hash() common.Hash + + // Commit writes all nodes to the trie's memory database, tracking the internal + // and external (for account tries) references. + Commit(onleaf trie.LeafCallback) (common.Hash, error) + + // NodeIterator returns an iterator that returns nodes of the trie. Iteration + // starts at the key after the given start key. NodeIterator(startKey []byte) trie.NodeIterator - GetKey([]byte) []byte // TODO(fjl): remove this when SecureTrie is removed - Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error + + // Prove constructs a Merkle proof for key. The result contains all encoded nodes + // on the path to the value at key. The value itself is also included in the last + // node and can be retrieved by verifying the proof. + // + // If the trie does not contain a value for key, the returned proof contains all + // nodes of the longest existing prefix of the key (at least the root), ending + // with the node that proves the absence of the key. + Prove(key []byte, fromLevel uint, proofDb ethdb.KeyValueWriter) error } // NewDatabase creates a backing store for state. The returned database is safe for -// concurrent use and retains a few recent expanded trie nodes in memory. To keep -// more historical state in memory, use the NewDatabaseWithCache constructor. +// concurrent use, but does not retain any recent trie nodes in memory. To keep some +// historical state in memory, use the NewDatabaseWithCache constructor. func NewDatabase(db ethdb.Database) Database { return NewDatabaseWithCache(db, 0) } -// NewDatabase creates a backing store for state. The returned database is safe for -// concurrent use and retains both a few recent expanded trie nodes in memory, as -// well as a lot of collapsed RLP trie nodes in a large memory cache. +// NewDatabaseWithCache creates a backing store for state. The returned database +// is safe for concurrent use and retains a lot of collapsed RLP trie nodes in a +// large memory cache. func NewDatabaseWithCache(db ethdb.Database, cache int) Database { csc, _ := lru.New(codeSizeCacheSize) return &cachingDB{ @@ -91,50 +116,22 @@ func NewDatabaseWithCache(db ethdb.Database, cache int) Database { type cachingDB struct { db *trie.Database - mu sync.Mutex - pastTries []*trie.SecureTrie codeSizeCache *lru.Cache } -// OpenTrie opens the main account trie. +// OpenTrie opens the main account trie at a specific root hash. func (db *cachingDB) OpenTrie(root common.Hash) (Trie, error) { - db.mu.Lock() - defer db.mu.Unlock() - - for i := len(db.pastTries) - 1; i >= 0; i-- { - if db.pastTries[i].Hash() == root { - return cachedTrie{db.pastTries[i].Copy(), db}, nil - } - } - tr, err := trie.NewSecure(root, db.db, MaxTrieCacheGen) - if err != nil { - return nil, err - } - return cachedTrie{tr, db}, nil -} - -func (db *cachingDB) pushTrie(t *trie.SecureTrie) { - db.mu.Lock() - defer db.mu.Unlock() - - if len(db.pastTries) >= maxPastTries { - copy(db.pastTries, db.pastTries[1:]) - db.pastTries[len(db.pastTries)-1] = t - } else { - db.pastTries = append(db.pastTries, t) - } + return trie.NewSecure(root, db.db) } // OpenStorageTrie opens the storage trie of an account. func (db *cachingDB) OpenStorageTrie(addrHash, root common.Hash) (Trie, error) { - return trie.NewSecure(root, db.db, 0) + return trie.NewSecure(root, db.db) } // CopyTrie returns an independent copy of the given trie. func (db *cachingDB) CopyTrie(t Trie) Trie { switch t := t.(type) { - case cachedTrie: - return cachedTrie{t.SecureTrie.Copy(), db} case *trie.SecureTrie: return t.Copy() default: @@ -164,21 +161,3 @@ func (db *cachingDB) ContractCodeSize(addrHash, codeHash common.Hash) (int, erro func (db *cachingDB) TrieDB() *trie.Database { return db.db } - -// cachedTrie inserts its trie into a cachingDB on commit. -type cachedTrie struct { - *trie.SecureTrie - db *cachingDB -} - -func (m cachedTrie) Commit(onleaf trie.LeafCallback) (common.Hash, error) { - root, err := m.SecureTrie.Commit(onleaf) - if err == nil { - m.db.pushTrie(m.SecureTrie) - } - return root, err -} - -func (m cachedTrie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error { - return m.SecureTrie.Prove(key, fromLevel, proofDb) -} diff --git a/core/state/dump.go b/core/state/dump.go index b991828b6966..a742cf85f518 100644 --- a/core/state/dump.go +++ b/core/state/dump.go @@ -20,62 +20,142 @@ import ( "encoding/json" "fmt" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" ) +// DumpAccount represents an account in the state type DumpAccount struct { - Balance string `json:"balance"` - Nonce uint64 `json:"nonce"` - Root string `json:"root"` - CodeHash string `json:"codeHash"` - Code string `json:"code"` - Storage map[string]string `json:"storage"` + Balance string `json:"balance"` + Nonce uint64 `json:"nonce"` + Root string `json:"root"` + CodeHash string `json:"codeHash"` + Code string `json:"code,omitempty"` + Storage map[common.Hash]string `json:"storage,omitempty"` + Address *common.Address `json:"address,omitempty"` // Address only present in iterative (line-by-line) mode + SecureKey hexutil.Bytes `json:"key,omitempty"` // If we don't have address, we can output the key + } +// Dump represents the full dump in a collected format, as one large map type Dump struct { - Root string `json:"root"` - Accounts map[string]DumpAccount `json:"accounts"` + Root string `json:"root"` + Accounts map[common.Address]DumpAccount `json:"accounts"` +} + +// iterativeDump is a 'collector'-implementation which dump output line-by-line iteratively +type iterativeDump struct { + *json.Encoder +} + +// Collector interface which the state trie calls during iteration +type collector interface { + onRoot(common.Hash) + onAccount(common.Address, DumpAccount) +} + +func (d *Dump) onRoot(root common.Hash) { + d.Root = fmt.Sprintf("%x", root) +} + +func (d *Dump) onAccount(addr common.Address, account DumpAccount) { + d.Accounts[addr] = account } -func (self *StateDB) RawDump() Dump { - dump := Dump{ - Root: fmt.Sprintf("%x", self.trie.Hash()), - Accounts: make(map[string]DumpAccount), +func (d iterativeDump) onAccount(addr common.Address, account DumpAccount) { + dumpAccount := &DumpAccount{ + Balance: account.Balance, + Nonce: account.Nonce, + Root: account.Root, + CodeHash: account.CodeHash, + Code: account.Code, + Storage: account.Storage, + SecureKey: account.SecureKey, + Address: nil, } + if addr != (common.Address{}) { + dumpAccount.Address = &addr + } + d.Encode(dumpAccount) +} - it := trie.NewIterator(self.trie.NodeIterator(nil)) +func (d iterativeDump) onRoot(root common.Hash) { + d.Encode(struct { + Root common.Hash `json:"root"` + }{root}) +} + +func (s *StateDB) dump(c collector, excludeCode, excludeStorage, excludeMissingPreimages bool) { + emptyAddress := (common.Address{}) + missingPreimages := 0 + c.onRoot(s.trie.Hash()) + it := trie.NewIterator(s.trie.NodeIterator(nil)) for it.Next() { - addr := self.trie.GetKey(it.Key) var data Account if err := rlp.DecodeBytes(it.Value, &data); err != nil { panic(err) } - - obj := newObject(nil, common.BytesToAddress(addr), data) + addr := common.BytesToAddress(s.trie.GetKey(it.Key)) + obj := newObject(nil, addr, data) account := DumpAccount{ Balance: data.Balance.String(), Nonce: data.Nonce, Root: common.Bytes2Hex(data.Root[:]), CodeHash: common.Bytes2Hex(data.CodeHash), - Code: common.Bytes2Hex(obj.Code(self.db)), - Storage: make(map[string]string), } - storageIt := trie.NewIterator(obj.getTrie(self.db).NodeIterator(nil)) - for storageIt.Next() { - account.Storage[common.Bytes2Hex(self.trie.GetKey(storageIt.Key))] = common.Bytes2Hex(storageIt.Value) + if emptyAddress == addr { + // Preimage missing + missingPreimages++ + if excludeMissingPreimages { + continue + } + account.SecureKey = it.Key + } + if !excludeCode { + account.Code = common.Bytes2Hex(obj.Code(s.db)) } - dump.Accounts[common.Bytes2Hex(addr)] = account + if !excludeStorage { + account.Storage = make(map[common.Hash]string) + storageIt := trie.NewIterator(obj.getTrie(s.db).NodeIterator(nil)) + for storageIt.Next() { + _, content, _, err := rlp.Split(storageIt.Value) + if err != nil { + log.Error("Failed to decode the value returned by iterator", "error", err) + continue + } + account.Storage[common.BytesToHash(s.trie.GetKey(storageIt.Key))] = common.Bytes2Hex(content) + } + } + c.onAccount(addr, account) + } + if missingPreimages > 0 { + log.Warn("Dump incomplete due to missing preimages", "missing", missingPreimages) } - return dump } -func (self *StateDB) Dump() []byte { - json, err := json.MarshalIndent(self.RawDump(), "", " ") +// RawDump returns the entire state an a single large object +func (s *StateDB) RawDump(excludeCode, excludeStorage, excludeMissingPreimages bool) Dump { + dump := &Dump{ + Accounts: make(map[common.Address]DumpAccount), + } + s.dump(dump, excludeCode, excludeStorage, excludeMissingPreimages) + return *dump +} + +// Dump returns a JSON string representing the entire state as a single json-object +func (s *StateDB) Dump(excludeCode, excludeStorage, excludeMissingPreimages bool) []byte { + dump := s.RawDump(excludeCode, excludeStorage, excludeMissingPreimages) + json, err := json.MarshalIndent(dump, "", " ") if err != nil { fmt.Println("dump err", err) } - return json } + +// IterativeDump dumps out accounts as json-objects, delimited by linebreaks on stdout +func (s *StateDB) IterativeDump(excludeCode, excludeStorage, excludeMissingPreimages bool, output *json.Encoder) { + s.dump(iterativeDump{output}, excludeCode, excludeStorage, excludeMissingPreimages) +} diff --git a/core/state/iterator.go b/core/state/iterator.go index 1c460cc481c4..6a5c73d3d13c 100644 --- a/core/state/iterator.go +++ b/core/state/iterator.go @@ -20,9 +20,9 @@ import ( "bytes" "fmt" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" ) // NodeIterator is an iterator to traverse the entire state trie post-order, diff --git a/core/state/iterator_test.go b/core/state/iterator_test.go index 3c4d99eba46e..69f51c4c7d8a 100644 --- a/core/state/iterator_test.go +++ b/core/state/iterator_test.go @@ -20,8 +20,8 @@ import ( "bytes" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/ethdb" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" ) // Tests that the node iterator indeed walks over the entire database contents. @@ -51,7 +51,9 @@ func TestNodeIteratorCoverage(t *testing.T) { t.Errorf("state entry not reported %x", hash) } } - for _, key := range db.TrieDB().DiskDB().(*ethdb.MemDatabase).Keys() { + it := db.TrieDB().DiskDB().(ethdb.Database).NewIterator() + for it.Next() { + key := it.Key() if bytes.HasPrefix(key, []byte("secure-key-")) { continue } @@ -59,4 +61,5 @@ func TestNodeIteratorCoverage(t *testing.T) { t.Errorf("state entry not reported %x", key) } } + it.Release() } diff --git a/core/state/journal.go b/core/state/journal.go index 0b1bb4b7351d..c0bd2b92426f 100644 --- a/core/state/journal.go +++ b/core/state/journal.go @@ -19,7 +19,7 @@ package state import ( "math/big" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) // journalEntry is a modification entry in the state change journal that can be @@ -127,9 +127,7 @@ type ( hash common.Hash } touchChange struct { - account *common.Address - prev bool - prevDirty bool + account *common.Address } ) diff --git a/core/state/main_test.go b/core/state/main_test.go deleted file mode 100644 index cd9661031fd1..000000000000 --- a/core/state/main_test.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package state - -import ( - "testing" - - checker "gopkg.in/check.v1" -) - -func Test(t *testing.T) { checker.TestingT(t) } diff --git a/core/state/managed_state.go b/core/state/managed_state.go deleted file mode 100644 index 447ae82e9c0b..000000000000 --- a/core/state/managed_state.go +++ /dev/null @@ -1,143 +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 state - -import ( - "sync" - - "github.com/nebulaai/nbai-node/common" -) - -type account struct { - stateObject *stateObject - nstart uint64 - nonces []bool -} - -type ManagedState struct { - *StateDB - - mu sync.RWMutex - - accounts map[common.Address]*account -} - -// ManagedState returns a new managed state with the statedb as it's backing layer -func ManageState(statedb *StateDB) *ManagedState { - return &ManagedState{ - StateDB: statedb.Copy(), - accounts: make(map[common.Address]*account), - } -} - -// SetState sets the backing layer of the managed state -func (ms *ManagedState) SetState(statedb *StateDB) { - ms.mu.Lock() - defer ms.mu.Unlock() - ms.StateDB = statedb -} - -// RemoveNonce removed the nonce from the managed state and all future pending nonces -func (ms *ManagedState) RemoveNonce(addr common.Address, n uint64) { - if ms.hasAccount(addr) { - ms.mu.Lock() - defer ms.mu.Unlock() - - account := ms.getAccount(addr) - if n-account.nstart <= uint64(len(account.nonces)) { - reslice := make([]bool, n-account.nstart) - copy(reslice, account.nonces[:n-account.nstart]) - account.nonces = reslice - } - } -} - -// NewNonce returns the new canonical nonce for the managed account -func (ms *ManagedState) NewNonce(addr common.Address) uint64 { - ms.mu.Lock() - defer ms.mu.Unlock() - - account := ms.getAccount(addr) - for i, nonce := range account.nonces { - if !nonce { - return account.nstart + uint64(i) - } - } - account.nonces = append(account.nonces, true) - - return uint64(len(account.nonces)-1) + account.nstart -} - -// GetNonce returns the canonical nonce for the managed or unmanaged account. -// -// Because GetNonce mutates the DB, we must take a write lock. -func (ms *ManagedState) GetNonce(addr common.Address) uint64 { - ms.mu.Lock() - defer ms.mu.Unlock() - - if ms.hasAccount(addr) { - account := ms.getAccount(addr) - return uint64(len(account.nonces)) + account.nstart - } else { - return ms.StateDB.GetNonce(addr) - } -} - -// SetNonce sets the new canonical nonce for the managed state -func (ms *ManagedState) SetNonce(addr common.Address, nonce uint64) { - ms.mu.Lock() - defer ms.mu.Unlock() - - so := ms.GetOrNewStateObject(addr) - so.SetNonce(nonce) - - ms.accounts[addr] = newAccount(so) -} - -// HasAccount returns whether the given address is managed or not -func (ms *ManagedState) HasAccount(addr common.Address) bool { - ms.mu.RLock() - defer ms.mu.RUnlock() - return ms.hasAccount(addr) -} - -func (ms *ManagedState) hasAccount(addr common.Address) bool { - _, ok := ms.accounts[addr] - return ok -} - -// populate the managed state -func (ms *ManagedState) getAccount(addr common.Address) *account { - if account, ok := ms.accounts[addr]; !ok { - so := ms.GetOrNewStateObject(addr) - ms.accounts[addr] = newAccount(so) - } else { - // Always make sure the state account nonce isn't actually higher - // than the tracked one. - so := ms.StateDB.getStateObject(addr) - if so != nil && uint64(len(account.nonces))+account.nstart < so.Nonce() { - ms.accounts[addr] = newAccount(so) - } - - } - - return ms.accounts[addr] -} - -func newAccount(so *stateObject) *account { - return &account{so, so.Nonce(), nil} -} diff --git a/core/state/managed_state_test.go b/core/state/managed_state_test.go deleted file mode 100644 index 692a45deaaa2..000000000000 --- a/core/state/managed_state_test.go +++ /dev/null @@ -1,123 +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 state - -import ( - "testing" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/ethdb" -) - -var addr = common.BytesToAddress([]byte("test")) - -func create() (*ManagedState, *account) { - statedb, _ := New(common.Hash{}, NewDatabase(ethdb.NewMemDatabase())) - ms := ManageState(statedb) - ms.StateDB.SetNonce(addr, 100) - ms.accounts[addr] = newAccount(ms.StateDB.getStateObject(addr)) - return ms, ms.accounts[addr] -} - -func TestNewNonce(t *testing.T) { - ms, _ := create() - - nonce := ms.NewNonce(addr) - if nonce != 100 { - t.Error("expected nonce 100. got", nonce) - } - - nonce = ms.NewNonce(addr) - if nonce != 101 { - t.Error("expected nonce 101. got", nonce) - } -} - -func TestRemove(t *testing.T) { - ms, account := create() - - nn := make([]bool, 10) - for i := range nn { - nn[i] = true - } - account.nonces = append(account.nonces, nn...) - - i := uint64(5) - ms.RemoveNonce(addr, account.nstart+i) - if len(account.nonces) != 5 { - t.Error("expected", i, "'th index to be false") - } -} - -func TestReuse(t *testing.T) { - ms, account := create() - - nn := make([]bool, 10) - for i := range nn { - nn[i] = true - } - account.nonces = append(account.nonces, nn...) - - i := uint64(5) - ms.RemoveNonce(addr, account.nstart+i) - nonce := ms.NewNonce(addr) - if nonce != 105 { - t.Error("expected nonce to be 105. got", nonce) - } -} - -func TestRemoteNonceChange(t *testing.T) { - ms, account := create() - nn := make([]bool, 10) - for i := range nn { - nn[i] = true - } - account.nonces = append(account.nonces, nn...) - ms.NewNonce(addr) - - ms.StateDB.stateObjects[addr].data.Nonce = 200 - nonce := ms.NewNonce(addr) - if nonce != 200 { - t.Error("expected nonce after remote update to be", 200, "got", nonce) - } - ms.NewNonce(addr) - ms.NewNonce(addr) - ms.NewNonce(addr) - ms.StateDB.stateObjects[addr].data.Nonce = 200 - nonce = ms.NewNonce(addr) - if nonce != 204 { - t.Error("expected nonce after remote update to be", 204, "got", nonce) - } -} - -func TestSetNonce(t *testing.T) { - ms, _ := create() - - var addr common.Address - ms.SetNonce(addr, 10) - - if ms.GetNonce(addr) != 10 { - t.Error("Expected nonce of 10, got", ms.GetNonce(addr)) - } - - addr[0] = 1 - ms.StateDB.SetNonce(addr, 1) - - if ms.GetNonce(addr) != 1 { - t.Error("Expected nonce of 1, got", ms.GetNonce(addr)) - } -} diff --git a/core/state/state_object.go b/core/state/state_object.go index 2826f58c9dd7..8680de021f42 100644 --- a/core/state/state_object.go +++ b/core/state/state_object.go @@ -21,33 +21,35 @@ import ( "fmt" "io" "math/big" + "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/rlp" ) var emptyCodeHash = crypto.Keccak256(nil) type Code []byte -func (self Code) String() string { - return string(self) //strings.Join(Disassemble(self), " ") +func (c Code) String() string { + return string(c) //strings.Join(Disassemble(c), " ") } type Storage map[common.Hash]common.Hash -func (self Storage) String() (str string) { - for key, value := range self { +func (s Storage) String() (str string) { + for key, value := range s { str += fmt.Sprintf("%X : %X\n", key, value) } return } -func (self Storage) Copy() Storage { +func (s Storage) Copy() Storage { cpy := make(Storage) - for key, value := range self { + for key, value := range s { cpy[key] = value } @@ -77,8 +79,10 @@ type stateObject struct { trie Trie // storage trie, which becomes non-nil on first access code Code // contract bytecode, which gets set when code is loaded - originStorage Storage // Storage cache of original entries to dedup rewrites - dirtyStorage Storage // Storage entries that need to be flushed to disk + originStorage Storage // Storage cache of original entries to dedup rewrites, reset for every transaction + pendingStorage Storage // Storage entries that need to be flushed to disk, at the end of an entire block + dirtyStorage Storage // Storage entries that have been modified in the current transaction execution + fakeStorage Storage // Fake storage which constructed by caller for debugging purpose. // Cache flags. // When an object is marked suicided it will be delete from the trie @@ -110,203 +114,275 @@ func newObject(db *StateDB, address common.Address, data Account) *stateObject { if data.CodeHash == nil { data.CodeHash = emptyCodeHash } + if data.Root == (common.Hash{}) { + data.Root = emptyRoot + } return &stateObject{ - db: db, - address: address, - addrHash: crypto.Keccak256Hash(address[:]), - data: data, - originStorage: make(Storage), - dirtyStorage: make(Storage), + db: db, + address: address, + addrHash: crypto.Keccak256Hash(address[:]), + data: data, + originStorage: make(Storage), + pendingStorage: make(Storage), + dirtyStorage: make(Storage), } } // EncodeRLP implements rlp.Encoder. -func (c *stateObject) EncodeRLP(w io.Writer) error { - return rlp.Encode(w, c.data) +func (s *stateObject) EncodeRLP(w io.Writer) error { + return rlp.Encode(w, s.data) } // setError remembers the first non-nil error it is called with. -func (self *stateObject) setError(err error) { - if self.dbErr == nil { - self.dbErr = err +func (s *stateObject) setError(err error) { + if s.dbErr == nil { + s.dbErr = err } } -func (self *stateObject) markSuicided() { - self.suicided = true +func (s *stateObject) markSuicided() { + s.suicided = true } -func (c *stateObject) touch() { - c.db.journal.append(touchChange{ - account: &c.address, +func (s *stateObject) touch() { + s.db.journal.append(touchChange{ + account: &s.address, }) - if c.address == ripemd { + if s.address == ripemd { // Explicitly put it in the dirty-cache, which is otherwise generated from // flattened journals. - c.db.journal.dirty(c.address) + s.db.journal.dirty(s.address) } } -func (c *stateObject) getTrie(db Database) Trie { - if c.trie == nil { +func (s *stateObject) getTrie(db Database) Trie { + if s.trie == nil { var err error - c.trie, err = db.OpenStorageTrie(c.addrHash, c.data.Root) + s.trie, err = db.OpenStorageTrie(s.addrHash, s.data.Root) if err != nil { - c.trie, _ = db.OpenStorageTrie(c.addrHash, common.Hash{}) - c.setError(fmt.Errorf("can't create storage trie: %v", err)) + s.trie, _ = db.OpenStorageTrie(s.addrHash, common.Hash{}) + s.setError(fmt.Errorf("can't create storage trie: %v", err)) } } - return c.trie + return s.trie } // GetState retrieves a value from the account storage trie. -func (self *stateObject) GetState(db Database, key common.Hash) common.Hash { +func (s *stateObject) GetState(db Database, key common.Hash) common.Hash { + // If the fake storage is set, only lookup the state here(in the debugging mode) + if s.fakeStorage != nil { + return s.fakeStorage[key] + } // If we have a dirty value for this state entry, return it - value, dirty := self.dirtyStorage[key] + value, dirty := s.dirtyStorage[key] if dirty { return value } // Otherwise return the entry's original value - return self.GetCommittedState(db, key) + return s.GetCommittedState(db, key) } // GetCommittedState retrieves a value from the committed account storage trie. -func (self *stateObject) GetCommittedState(db Database, key common.Hash) common.Hash { - // If we have the original value cached, return that - value, cached := self.originStorage[key] - if cached { +func (s *stateObject) GetCommittedState(db Database, key common.Hash) common.Hash { + // If the fake storage is set, only lookup the state here(in the debugging mode) + if s.fakeStorage != nil { + return s.fakeStorage[key] + } + // If we have a pending write or clean cached, return that + if value, pending := s.pendingStorage[key]; pending { return value } + if value, cached := s.originStorage[key]; cached { + return value + } + // Track the amount of time wasted on reading the storage trie + if metrics.EnabledExpensive { + defer func(start time.Time) { s.db.StorageReads += time.Since(start) }(time.Now()) + } // Otherwise load the value from the database - enc, err := self.getTrie(db).TryGet(key[:]) + enc, err := s.getTrie(db).TryGet(key[:]) if err != nil { - self.setError(err) + s.setError(err) return common.Hash{} } + var value common.Hash if len(enc) > 0 { _, content, _, err := rlp.Split(enc) if err != nil { - self.setError(err) + s.setError(err) } value.SetBytes(content) } - self.originStorage[key] = value + s.originStorage[key] = value return value } // SetState updates a value in account storage. -func (self *stateObject) SetState(db Database, key, value common.Hash) { +func (s *stateObject) SetState(db Database, key, value common.Hash) { + // If the fake storage is set, put the temporary state update here. + if s.fakeStorage != nil { + s.fakeStorage[key] = value + return + } // If the new value is the same as old, don't set - prev := self.GetState(db, key) + prev := s.GetState(db, key) if prev == value { return } // New value is different, update and journal the change - self.db.journal.append(storageChange{ - account: &self.address, + s.db.journal.append(storageChange{ + account: &s.address, key: key, prevalue: prev, }) - self.setState(key, value) + s.setState(key, value) } -func (self *stateObject) setState(key, value common.Hash) { - self.dirtyStorage[key] = value +// SetStorage replaces the entire state storage with the given one. +// +// After this function is called, all original state will be ignored and state +// lookup only happens in the fake state storage. +// +// Note this function should only be used for debugging purpose. +func (s *stateObject) SetStorage(storage map[common.Hash]common.Hash) { + // Allocate fake storage if it's nil. + if s.fakeStorage == nil { + s.fakeStorage = make(Storage) + } + for key, value := range storage { + s.fakeStorage[key] = value + } + // Don't bother journal since this function should only be used for + // debugging and the `fake` storage won't be committed to database. +} + +func (s *stateObject) setState(key, value common.Hash) { + s.dirtyStorage[key] = value +} + +// finalise moves all dirty storage slots into the pending area to be hashed or +// committed later. It is invoked at the end of every transaction. +func (s *stateObject) finalise() { + for key, value := range s.dirtyStorage { + s.pendingStorage[key] = value + } + if len(s.dirtyStorage) > 0 { + s.dirtyStorage = make(Storage) + } } // updateTrie writes cached storage modifications into the object's storage trie. -func (self *stateObject) updateTrie(db Database) Trie { - tr := self.getTrie(db) - for key, value := range self.dirtyStorage { - delete(self.dirtyStorage, key) +func (s *stateObject) updateTrie(db Database) Trie { + // Make sure all dirty slots are finalized into the pending storage area + s.finalise() + // Track the amount of time wasted on updating the storge trie + if metrics.EnabledExpensive { + defer func(start time.Time) { s.db.StorageUpdates += time.Since(start) }(time.Now()) + } + // Insert all the pending updates into the trie + tr := s.getTrie(db) + for key, value := range s.pendingStorage { // Skip noop changes, persist actual changes - if value == self.originStorage[key] { + if value == s.originStorage[key] { continue } - self.originStorage[key] = value + s.originStorage[key] = value if (value == common.Hash{}) { - self.setError(tr.TryDelete(key[:])) + s.setError(tr.TryDelete(key[:])) continue } // Encoding []byte cannot fail, ok to ignore the error. - v, _ := rlp.EncodeToBytes(bytes.TrimLeft(value[:], "\x00")) - self.setError(tr.TryUpdate(key[:], v)) + v, _ := rlp.EncodeToBytes(common.TrimLeftZeroes(value[:])) + s.setError(tr.TryUpdate(key[:], v)) + } + if len(s.pendingStorage) > 0 { + s.pendingStorage = make(Storage) } return tr } // UpdateRoot sets the trie root to the current root hash of -func (self *stateObject) updateRoot(db Database) { - self.updateTrie(db) - self.data.Root = self.trie.Hash() +func (s *stateObject) updateRoot(db Database) { + s.updateTrie(db) + + // Track the amount of time wasted on hashing the storge trie + if metrics.EnabledExpensive { + defer func(start time.Time) { s.db.StorageHashes += time.Since(start) }(time.Now()) + } + s.data.Root = s.trie.Hash() } // CommitTrie the storage trie of the object to db. // This updates the trie root. -func (self *stateObject) CommitTrie(db Database) error { - self.updateTrie(db) - if self.dbErr != nil { - return self.dbErr +func (s *stateObject) CommitTrie(db Database) error { + s.updateTrie(db) + if s.dbErr != nil { + return s.dbErr } - root, err := self.trie.Commit(nil) + // Track the amount of time wasted on committing the storge trie + if metrics.EnabledExpensive { + defer func(start time.Time) { s.db.StorageCommits += time.Since(start) }(time.Now()) + } + root, err := s.trie.Commit(nil) if err == nil { - self.data.Root = root + s.data.Root = root } return err } // AddBalance removes amount from c's balance. // It is used to add funds to the destination account of a transfer. -func (c *stateObject) AddBalance(amount *big.Int) { +func (s *stateObject) AddBalance(amount *big.Int) { // EIP158: We must check emptiness for the objects such that the account // clearing (0,0,0 objects) can take effect. if amount.Sign() == 0 { - if c.empty() { - c.touch() + if s.empty() { + s.touch() } return } - c.SetBalance(new(big.Int).Add(c.Balance(), amount)) + s.SetBalance(new(big.Int).Add(s.Balance(), amount)) } // SubBalance removes amount from c's balance. // It is used to remove funds from the origin account of a transfer. -func (c *stateObject) SubBalance(amount *big.Int) { +func (s *stateObject) SubBalance(amount *big.Int) { if amount.Sign() == 0 { return } - c.SetBalance(new(big.Int).Sub(c.Balance(), amount)) + s.SetBalance(new(big.Int).Sub(s.Balance(), amount)) } -func (self *stateObject) SetBalance(amount *big.Int) { - self.db.journal.append(balanceChange{ - account: &self.address, - prev: new(big.Int).Set(self.data.Balance), +func (s *stateObject) SetBalance(amount *big.Int) { + s.db.journal.append(balanceChange{ + account: &s.address, + prev: new(big.Int).Set(s.data.Balance), }) - self.setBalance(amount) + s.setBalance(amount) } -func (self *stateObject) setBalance(amount *big.Int) { - self.data.Balance = amount +func (s *stateObject) setBalance(amount *big.Int) { + s.data.Balance = amount } // Return the gas back to the origin. Used by the Virtual machine or Closures -func (c *stateObject) ReturnGas(gas *big.Int) {} - -func (self *stateObject) deepCopy(db *StateDB) *stateObject { - stateObject := newObject(db, self.address, self.data) - if self.trie != nil { - stateObject.trie = db.db.CopyTrie(self.trie) - } - stateObject.code = self.code - stateObject.dirtyStorage = self.dirtyStorage.Copy() - stateObject.originStorage = self.originStorage.Copy() - stateObject.suicided = self.suicided - stateObject.dirtyCode = self.dirtyCode - stateObject.deleted = self.deleted +func (s *stateObject) ReturnGas(gas *big.Int) {} + +func (s *stateObject) deepCopy(db *StateDB) *stateObject { + stateObject := newObject(db, s.address, s.data) + if s.trie != nil { + stateObject.trie = db.db.CopyTrie(s.trie) + } + stateObject.code = s.code + stateObject.dirtyStorage = s.dirtyStorage.Copy() + stateObject.originStorage = s.originStorage.Copy() + stateObject.pendingStorage = s.pendingStorage.Copy() + stateObject.suicided = s.suicided + stateObject.dirtyCode = s.dirtyCode + stateObject.deleted = s.deleted return stateObject } @@ -315,69 +391,69 @@ func (self *stateObject) deepCopy(db *StateDB) *stateObject { // // Returns the address of the contract/account -func (c *stateObject) Address() common.Address { - return c.address +func (s *stateObject) Address() common.Address { + return s.address } // Code returns the contract code associated with this object, if any. -func (self *stateObject) Code(db Database) []byte { - if self.code != nil { - return self.code +func (s *stateObject) Code(db Database) []byte { + if s.code != nil { + return s.code } - if bytes.Equal(self.CodeHash(), emptyCodeHash) { + if bytes.Equal(s.CodeHash(), emptyCodeHash) { return nil } - code, err := db.ContractCode(self.addrHash, common.BytesToHash(self.CodeHash())) + code, err := db.ContractCode(s.addrHash, common.BytesToHash(s.CodeHash())) if err != nil { - self.setError(fmt.Errorf("can't load code hash %x: %v", self.CodeHash(), err)) + s.setError(fmt.Errorf("can't load code hash %x: %v", s.CodeHash(), err)) } - self.code = code + s.code = code return code } -func (self *stateObject) SetCode(codeHash common.Hash, code []byte) { - prevcode := self.Code(self.db.db) - self.db.journal.append(codeChange{ - account: &self.address, - prevhash: self.CodeHash(), +func (s *stateObject) SetCode(codeHash common.Hash, code []byte) { + prevcode := s.Code(s.db.db) + s.db.journal.append(codeChange{ + account: &s.address, + prevhash: s.CodeHash(), prevcode: prevcode, }) - self.setCode(codeHash, code) + s.setCode(codeHash, code) } -func (self *stateObject) setCode(codeHash common.Hash, code []byte) { - self.code = code - self.data.CodeHash = codeHash[:] - self.dirtyCode = true +func (s *stateObject) setCode(codeHash common.Hash, code []byte) { + s.code = code + s.data.CodeHash = codeHash[:] + s.dirtyCode = true } -func (self *stateObject) SetNonce(nonce uint64) { - self.db.journal.append(nonceChange{ - account: &self.address, - prev: self.data.Nonce, +func (s *stateObject) SetNonce(nonce uint64) { + s.db.journal.append(nonceChange{ + account: &s.address, + prev: s.data.Nonce, }) - self.setNonce(nonce) + s.setNonce(nonce) } -func (self *stateObject) setNonce(nonce uint64) { - self.data.Nonce = nonce +func (s *stateObject) setNonce(nonce uint64) { + s.data.Nonce = nonce } -func (self *stateObject) CodeHash() []byte { - return self.data.CodeHash +func (s *stateObject) CodeHash() []byte { + return s.data.CodeHash } -func (self *stateObject) Balance() *big.Int { - return self.data.Balance +func (s *stateObject) Balance() *big.Int { + return s.data.Balance } -func (self *stateObject) Nonce() uint64 { - return self.data.Nonce +func (s *stateObject) Nonce() uint64 { + return s.data.Nonce } // Never called, but must be present to allow stateObject to be used // as a vm.Account interface that also satisfies the vm.ContractRef // interface. Interfaces are awesome. -func (self *stateObject) Value() *big.Int { +func (s *stateObject) Value() *big.Int { panic("Value on stateObject should never be called") } diff --git a/core/state/state_object_test.go b/core/state/state_object_test.go new file mode 100644 index 000000000000..42fd77802587 --- /dev/null +++ b/core/state/state_object_test.go @@ -0,0 +1,46 @@ +// Copyright 2019 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 state + +import ( + "bytes" + "testing" + + "github.com/ethereum/go-ethereum/common" +) + +func BenchmarkCutOriginal(b *testing.B) { + value := common.HexToHash("0x01") + for i := 0; i < b.N; i++ { + bytes.TrimLeft(value[:], "\x00") + } +} + +func BenchmarkCutsetterFn(b *testing.B) { + value := common.HexToHash("0x01") + cutSetFn := func(r rune) bool { return r == 0 } + for i := 0; i < b.N; i++ { + bytes.TrimLeftFunc(value[:], cutSetFn) + } +} + +func BenchmarkCutCustomTrim(b *testing.B) { + value := common.HexToHash("0x01") + for i := 0; i < b.N; i++ { + common.TrimLeftZeroes(value[:]) + } +} diff --git a/core/state/state_test.go b/core/state/state_test.go index b7a96aa8da69..0c920a9a2695 100644 --- a/core/state/state_test.go +++ b/core/state/state_test.go @@ -21,22 +21,28 @@ import ( "math/big" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - checker "gopkg.in/check.v1" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" ) -type StateSuite struct { - db *ethdb.MemDatabase +var toAddr = common.BytesToAddress + +type stateTest struct { + db ethdb.Database state *StateDB } -var _ = checker.Suite(&StateSuite{}) +func newStateTest() *stateTest { + db := rawdb.NewMemoryDatabase() + sdb, _ := New(common.Hash{}, NewDatabase(db)) + return &stateTest{db: db, state: sdb} +} -var toAddr = common.BytesToAddress +func TestDump(t *testing.T) { + s := newStateTest() -func (s *StateSuite) TestDump(c *checker.C) { // generate a few entries obj1 := s.state.GetOrNewStateObject(toAddr([]byte{0x01})) obj1.AddBalance(big.NewInt(22)) @@ -51,47 +57,38 @@ func (s *StateSuite) TestDump(c *checker.C) { s.state.Commit(false) // check that dump contains the state objects that are in trie - got := string(s.state.Dump()) + got := string(s.state.Dump(false, false, true)) want := `{ "root": "71edff0130dd2385947095001c73d9e28d862fc286fca2b922ca6f6f3cddfdd2", "accounts": { - "0000000000000000000000000000000000000001": { + "0x0000000000000000000000000000000000000001": { "balance": "22", "nonce": 0, "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "code": "", - "storage": {} + "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" }, - "0000000000000000000000000000000000000002": { + "0x0000000000000000000000000000000000000002": { "balance": "44", "nonce": 0, "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "code": "", - "storage": {} + "codeHash": "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" }, - "0000000000000000000000000000000000000102": { + "0x0000000000000000000000000000000000000102": { "balance": "0", "nonce": 0, "root": "56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "codeHash": "87874902497a5bb968da31a2998d8f22e949d1ef6214bcdedd8bae24cca4b9e3", - "code": "03030303030303", - "storage": {} + "code": "03030303030303" } } }` if got != want { - c.Errorf("dump mismatch:\ngot: %s\nwant: %s\n", got, want) + t.Errorf("dump mismatch:\ngot: %s\nwant: %s\n", got, want) } } -func (s *StateSuite) SetUpTest(c *checker.C) { - s.db = ethdb.NewMemDatabase() - s.state, _ = New(common.Hash{}, NewDatabase(s.db)) -} - -func (s *StateSuite) TestNull(c *checker.C) { +func TestNull(t *testing.T) { + s := newStateTest() address := common.HexToAddress("0x823140710bf13990e4500136726d8b55") s.state.CreateAccount(address) //value := common.FromHex("0x823140710bf13990e4500136726d8b55") @@ -101,18 +98,19 @@ func (s *StateSuite) TestNull(c *checker.C) { s.state.Commit(false) if value := s.state.GetState(address, common.Hash{}); value != (common.Hash{}) { - c.Errorf("expected empty current value, got %x", value) + t.Errorf("expected empty current value, got %x", value) } if value := s.state.GetCommittedState(address, common.Hash{}); value != (common.Hash{}) { - c.Errorf("expected empty committed value, got %x", value) + t.Errorf("expected empty committed value, got %x", value) } } -func (s *StateSuite) TestSnapshot(c *checker.C) { +func TestSnapshot(t *testing.T) { stateobjaddr := toAddr([]byte("aa")) var storageaddr common.Hash data1 := common.BytesToHash([]byte{42}) data2 := common.BytesToHash([]byte{43}) + s := newStateTest() // snapshot the genesis state genesis := s.state.Snapshot() @@ -125,23 +123,30 @@ func (s *StateSuite) TestSnapshot(c *checker.C) { s.state.SetState(stateobjaddr, storageaddr, data2) s.state.RevertToSnapshot(snapshot) - c.Assert(s.state.GetState(stateobjaddr, storageaddr), checker.DeepEquals, data1) - c.Assert(s.state.GetCommittedState(stateobjaddr, storageaddr), checker.DeepEquals, common.Hash{}) + if v := s.state.GetState(stateobjaddr, storageaddr); v != data1 { + t.Errorf("wrong storage value %v, want %v", v, data1) + } + if v := s.state.GetCommittedState(stateobjaddr, storageaddr); v != (common.Hash{}) { + t.Errorf("wrong committed storage value %v, want %v", v, common.Hash{}) + } // revert up to the genesis state and ensure correct content s.state.RevertToSnapshot(genesis) - c.Assert(s.state.GetState(stateobjaddr, storageaddr), checker.DeepEquals, common.Hash{}) - c.Assert(s.state.GetCommittedState(stateobjaddr, storageaddr), checker.DeepEquals, common.Hash{}) + if v := s.state.GetState(stateobjaddr, storageaddr); v != (common.Hash{}) { + t.Errorf("wrong storage value %v, want %v", v, common.Hash{}) + } + if v := s.state.GetCommittedState(stateobjaddr, storageaddr); v != (common.Hash{}) { + t.Errorf("wrong committed storage value %v, want %v", v, common.Hash{}) + } } -func (s *StateSuite) TestSnapshotEmpty(c *checker.C) { +func TestSnapshotEmpty(t *testing.T) { + s := newStateTest() s.state.RevertToSnapshot(s.state.Snapshot()) } -// use testing instead of checker because checker does not support -// printing/logging in tests (-check.vv does not work) func TestSnapshot2(t *testing.T) { - state, _ := New(common.Hash{}, NewDatabase(ethdb.NewMemDatabase())) + state, _ := New(common.Hash{}, NewDatabase(rawdb.NewMemoryDatabase())) stateobjaddr0 := toAddr([]byte("so0")) stateobjaddr1 := toAddr([]byte("so1")) diff --git a/core/state/statedb.go b/core/state/statedb.go index b2a6a37f3f22..03e118d117ec 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -22,13 +22,15 @@ import ( "fmt" "math/big" "sort" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/trie" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" ) type revision struct { @@ -37,8 +39,8 @@ type revision struct { } var ( - // emptyState is the known hash of an empty state trie entry. - emptyState = crypto.Keccak256Hash(nil) + // emptyRoot is the known root hash of an empty trie. + emptyRoot = common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421") // emptyCode is the known hash of the empty EVM bytecode. emptyCode = crypto.Keccak256Hash(nil) @@ -51,6 +53,10 @@ func (n *proofList) Put(key []byte, value []byte) error { return nil } +func (n *proofList) Delete(key []byte) error { + panic("not supported") +} + // StateDBs within the ethereum protocol are used to store anything // within the merkle trie. StateDBs take care of caching and storing // nested states. It's the general query interface to retrieve: @@ -61,8 +67,9 @@ 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{} + stateObjects map[common.Address]*stateObject + stateObjectsPending map[common.Address]struct{} // State objects finalized but not yet written to the trie + stateObjectsDirty map[common.Address]struct{} // State objects modified in the current execution // DB error. // State objects are used by the consensus core and VM which are @@ -86,6 +93,16 @@ type StateDB struct { journal *journal validRevisions []revision nextRevisionId int + + // Measurements gathered during execution for debugging purposes + AccountReads time.Duration + AccountHashes time.Duration + AccountUpdates time.Duration + AccountCommits time.Duration + StorageReads time.Duration + StorageHashes time.Duration + StorageUpdates time.Duration + StorageCommits time.Duration } // Create a new state from a given trie. @@ -95,125 +112,127 @@ 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{}), - logs: make(map[common.Hash][]*types.Log), - preimages: make(map[common.Hash][]byte), - journal: newJournal(), + db: db, + trie: tr, + stateObjects: make(map[common.Address]*stateObject), + stateObjectsPending: make(map[common.Address]struct{}), + stateObjectsDirty: make(map[common.Address]struct{}), + logs: make(map[common.Hash][]*types.Log), + preimages: make(map[common.Hash][]byte), + journal: newJournal(), }, nil } // setError remembers the first non-nil error it is called with. -func (self *StateDB) setError(err error) { - if self.dbErr == nil { - self.dbErr = err +func (s *StateDB) setError(err error) { + if s.dbErr == nil { + s.dbErr = err } } -func (self *StateDB) Error() error { - return self.dbErr +func (s *StateDB) Error() error { + return s.dbErr } // Reset clears out all ephemeral state objects from the state db, but keeps // the underlying state trie to avoid reloading data for the next operations. -func (self *StateDB) Reset(root common.Hash) error { - tr, err := self.db.OpenTrie(root) +func (s *StateDB) Reset(root common.Hash) error { + tr, err := s.db.OpenTrie(root) if err != nil { return err } - self.trie = tr - self.stateObjects = make(map[common.Address]*stateObject) - self.stateObjectsDirty = make(map[common.Address]struct{}) - self.thash = common.Hash{} - self.bhash = common.Hash{} - self.txIndex = 0 - self.logs = make(map[common.Hash][]*types.Log) - self.logSize = 0 - self.preimages = make(map[common.Hash][]byte) - self.clearJournalAndRefund() + s.trie = tr + s.stateObjects = make(map[common.Address]*stateObject) + s.stateObjectsPending = make(map[common.Address]struct{}) + s.stateObjectsDirty = make(map[common.Address]struct{}) + s.thash = common.Hash{} + s.bhash = common.Hash{} + s.txIndex = 0 + s.logs = make(map[common.Hash][]*types.Log) + s.logSize = 0 + s.preimages = make(map[common.Hash][]byte) + s.clearJournalAndRefund() return nil } -func (self *StateDB) AddLog(log *types.Log) { - self.journal.append(addLogChange{txhash: self.thash}) +func (s *StateDB) AddLog(log *types.Log) { + s.journal.append(addLogChange{txhash: s.thash}) - log.TxHash = self.thash - log.BlockHash = self.bhash - log.TxIndex = uint(self.txIndex) - log.Index = self.logSize - self.logs[self.thash] = append(self.logs[self.thash], log) - self.logSize++ + log.TxHash = s.thash + log.BlockHash = s.bhash + log.TxIndex = uint(s.txIndex) + log.Index = s.logSize + s.logs[s.thash] = append(s.logs[s.thash], log) + s.logSize++ } -func (self *StateDB) GetLogs(hash common.Hash) []*types.Log { - return self.logs[hash] +func (s *StateDB) GetLogs(hash common.Hash) []*types.Log { + return s.logs[hash] } -func (self *StateDB) Logs() []*types.Log { +func (s *StateDB) Logs() []*types.Log { var logs []*types.Log - for _, lgs := range self.logs { + for _, lgs := range s.logs { logs = append(logs, lgs...) } return logs } // AddPreimage records a SHA3 preimage seen by the VM. -func (self *StateDB) AddPreimage(hash common.Hash, preimage []byte) { - if _, ok := self.preimages[hash]; !ok { - self.journal.append(addPreimageChange{hash: hash}) +func (s *StateDB) AddPreimage(hash common.Hash, preimage []byte) { + if _, ok := s.preimages[hash]; !ok { + s.journal.append(addPreimageChange{hash: hash}) pi := make([]byte, len(preimage)) copy(pi, preimage) - self.preimages[hash] = pi + s.preimages[hash] = pi } } // Preimages returns a list of SHA3 preimages that have been submitted. -func (self *StateDB) Preimages() map[common.Hash][]byte { - return self.preimages +func (s *StateDB) Preimages() map[common.Hash][]byte { + return s.preimages } // AddRefund adds gas to the refund counter -func (self *StateDB) AddRefund(gas uint64) { - self.journal.append(refundChange{prev: self.refund}) - self.refund += gas +func (s *StateDB) AddRefund(gas uint64) { + s.journal.append(refundChange{prev: s.refund}) + s.refund += gas } // SubRefund removes gas from the refund counter. // This method will panic if the refund counter goes below zero -func (self *StateDB) SubRefund(gas uint64) { - self.journal.append(refundChange{prev: self.refund}) - if gas > self.refund { +func (s *StateDB) SubRefund(gas uint64) { + s.journal.append(refundChange{prev: s.refund}) + if gas > s.refund { panic("Refund counter below zero") } - self.refund -= gas + s.refund -= gas } // Exist reports whether the given account address exists in the state. // Notably this also returns true for suicided accounts. -func (self *StateDB) Exist(addr common.Address) bool { - return self.getStateObject(addr) != nil +func (s *StateDB) Exist(addr common.Address) bool { + return s.getStateObject(addr) != nil } // Empty returns whether the state object is either non-existent // or empty according to the EIP161 specification (balance = nonce = code = 0) -func (self *StateDB) Empty(addr common.Address) bool { - so := self.getStateObject(addr) +func (s *StateDB) Empty(addr common.Address) bool { + so := s.getStateObject(addr) return so == nil || so.empty() } // Retrieve the balance from the given address or 0 if object not found -func (self *StateDB) GetBalance(addr common.Address) *big.Int { - stateObject := self.getStateObject(addr) +func (s *StateDB) GetBalance(addr common.Address) *big.Int { + stateObject := s.getStateObject(addr) if stateObject != nil { return stateObject.Balance() } return common.Big0 } -func (self *StateDB) GetNonce(addr common.Address) uint64 { - stateObject := self.getStateObject(addr) +func (s *StateDB) GetNonce(addr common.Address) uint64 { + stateObject := s.getStateObject(addr) if stateObject != nil { return stateObject.Nonce() } @@ -221,31 +240,41 @@ func (self *StateDB) GetNonce(addr common.Address) uint64 { return 0 } -func (self *StateDB) GetCode(addr common.Address) []byte { - stateObject := self.getStateObject(addr) +// TxIndex returns the current transaction index set by Prepare. +func (s *StateDB) TxIndex() int { + return s.txIndex +} + +// BlockHash returns the current block hash set by Prepare. +func (s *StateDB) BlockHash() common.Hash { + return s.bhash +} + +func (s *StateDB) GetCode(addr common.Address) []byte { + stateObject := s.getStateObject(addr) if stateObject != nil { - return stateObject.Code(self.db) + return stateObject.Code(s.db) } return nil } -func (self *StateDB) GetCodeSize(addr common.Address) int { - stateObject := self.getStateObject(addr) +func (s *StateDB) GetCodeSize(addr common.Address) int { + stateObject := s.getStateObject(addr) if stateObject == nil { return 0 } if stateObject.code != nil { return len(stateObject.code) } - size, err := self.db.ContractCodeSize(stateObject.addrHash, common.BytesToHash(stateObject.CodeHash())) + size, err := s.db.ContractCodeSize(stateObject.addrHash, common.BytesToHash(stateObject.CodeHash())) if err != nil { - self.setError(err) + s.setError(err) } return size } -func (self *StateDB) GetCodeHash(addr common.Address) common.Hash { - stateObject := self.getStateObject(addr) +func (s *StateDB) GetCodeHash(addr common.Address) common.Hash { + stateObject := s.getStateObject(addr) if stateObject == nil { return common.Hash{} } @@ -253,25 +282,25 @@ func (self *StateDB) GetCodeHash(addr common.Address) common.Hash { } // GetState retrieves a value from the given account's storage trie. -func (self *StateDB) GetState(addr common.Address, hash common.Hash) common.Hash { - stateObject := self.getStateObject(addr) +func (s *StateDB) GetState(addr common.Address, hash common.Hash) common.Hash { + stateObject := s.getStateObject(addr) if stateObject != nil { - return stateObject.GetState(self.db, hash) + return stateObject.GetState(s.db, hash) } return common.Hash{} } // GetProof returns the MerkleProof for a given Account -func (self *StateDB) GetProof(a common.Address) ([][]byte, error) { +func (s *StateDB) GetProof(a common.Address) ([][]byte, error) { var proof proofList - err := self.trie.Prove(crypto.Keccak256(a.Bytes()), 0, &proof) + err := s.trie.Prove(crypto.Keccak256(a.Bytes()), 0, &proof) return [][]byte(proof), err } // GetProof returns the StorageProof for given key -func (self *StateDB) GetStorageProof(a common.Address, key common.Hash) ([][]byte, error) { +func (s *StateDB) GetStorageProof(a common.Address, key common.Hash) ([][]byte, error) { var proof proofList - trie := self.StorageTrie(a) + trie := s.StorageTrie(a) if trie == nil { return proof, errors.New("storage trie for requested address does not exist") } @@ -280,32 +309,32 @@ func (self *StateDB) GetStorageProof(a common.Address, key common.Hash) ([][]byt } // GetCommittedState retrieves a value from the given account's committed storage trie. -func (self *StateDB) GetCommittedState(addr common.Address, hash common.Hash) common.Hash { - stateObject := self.getStateObject(addr) +func (s *StateDB) GetCommittedState(addr common.Address, hash common.Hash) common.Hash { + stateObject := s.getStateObject(addr) if stateObject != nil { - return stateObject.GetCommittedState(self.db, hash) + return stateObject.GetCommittedState(s.db, hash) } return common.Hash{} } // Database retrieves the low level database supporting the lower level trie ops. -func (self *StateDB) Database() Database { - return self.db +func (s *StateDB) Database() Database { + return s.db } // StorageTrie returns the storage trie of an account. // The return value is a copy and is nil for non-existent accounts. -func (self *StateDB) StorageTrie(addr common.Address) Trie { - stateObject := self.getStateObject(addr) +func (s *StateDB) StorageTrie(addr common.Address) Trie { + stateObject := s.getStateObject(addr) if stateObject == nil { return nil } - cpy := stateObject.deepCopy(self) - return cpy.updateTrie(self.db) + cpy := stateObject.deepCopy(s) + return cpy.updateTrie(s.db) } -func (self *StateDB) HasSuicided(addr common.Address) bool { - stateObject := self.getStateObject(addr) +func (s *StateDB) HasSuicided(addr common.Address) bool { + stateObject := s.getStateObject(addr) if stateObject != nil { return stateObject.suicided } @@ -317,46 +346,55 @@ func (self *StateDB) HasSuicided(addr common.Address) bool { */ // AddBalance adds amount to the account associated with addr. -func (self *StateDB) AddBalance(addr common.Address, amount *big.Int) { - stateObject := self.GetOrNewStateObject(addr) +func (s *StateDB) AddBalance(addr common.Address, amount *big.Int) { + stateObject := s.GetOrNewStateObject(addr) if stateObject != nil { stateObject.AddBalance(amount) } } // SubBalance subtracts amount from the account associated with addr. -func (self *StateDB) SubBalance(addr common.Address, amount *big.Int) { - stateObject := self.GetOrNewStateObject(addr) +func (s *StateDB) SubBalance(addr common.Address, amount *big.Int) { + stateObject := s.GetOrNewStateObject(addr) if stateObject != nil { stateObject.SubBalance(amount) } } -func (self *StateDB) SetBalance(addr common.Address, amount *big.Int) { - stateObject := self.GetOrNewStateObject(addr) +func (s *StateDB) SetBalance(addr common.Address, amount *big.Int) { + stateObject := s.GetOrNewStateObject(addr) if stateObject != nil { stateObject.SetBalance(amount) } } -func (self *StateDB) SetNonce(addr common.Address, nonce uint64) { - stateObject := self.GetOrNewStateObject(addr) +func (s *StateDB) SetNonce(addr common.Address, nonce uint64) { + stateObject := s.GetOrNewStateObject(addr) if stateObject != nil { stateObject.SetNonce(nonce) } } -func (self *StateDB) SetCode(addr common.Address, code []byte) { - stateObject := self.GetOrNewStateObject(addr) +func (s *StateDB) SetCode(addr common.Address, code []byte) { + stateObject := s.GetOrNewStateObject(addr) if stateObject != nil { stateObject.SetCode(crypto.Keccak256Hash(code), code) } } -func (self *StateDB) SetState(addr common.Address, key, value common.Hash) { - stateObject := self.GetOrNewStateObject(addr) +func (s *StateDB) SetState(addr common.Address, key, value common.Hash) { + stateObject := s.GetOrNewStateObject(addr) if stateObject != nil { - stateObject.SetState(self.db, key, value) + stateObject.SetState(s.db, key, value) + } +} + +// SetStorage replaces the entire storage for the specified account with given +// storage. This function should only be used for debugging. +func (s *StateDB) SetStorage(addr common.Address, storage map[common.Hash]common.Hash) { + stateObject := s.GetOrNewStateObject(addr) + if stateObject != nil { + stateObject.SetStorage(storage) } } @@ -365,12 +403,12 @@ func (self *StateDB) SetState(addr common.Address, key, value common.Hash) { // // The account's state object is still available until the state is committed, // getStateObject will return a non-nil account after Suicide. -func (self *StateDB) Suicide(addr common.Address) bool { - stateObject := self.getStateObject(addr) +func (s *StateDB) Suicide(addr common.Address) bool { + stateObject := s.getStateObject(addr) if stateObject == nil { return false } - self.journal.append(suicideChange{ + s.journal.append(suicideChange{ account: &addr, prev: stateObject.suicided, prevbalance: new(big.Int).Set(stateObject.Balance()), @@ -386,36 +424,59 @@ func (self *StateDB) Suicide(addr common.Address) bool { // // updateStateObject writes the given object to the trie. -func (self *StateDB) updateStateObject(stateObject *stateObject) { - addr := stateObject.Address() - data, err := rlp.EncodeToBytes(stateObject) +func (s *StateDB) updateStateObject(obj *stateObject) { + // Track the amount of time wasted on updating the account from the trie + if metrics.EnabledExpensive { + defer func(start time.Time) { s.AccountUpdates += time.Since(start) }(time.Now()) + } + // Encode the account and update the account trie + addr := obj.Address() + + data, err := rlp.EncodeToBytes(obj) if err != nil { panic(fmt.Errorf("can't encode object at %x: %v", addr[:], err)) } - self.setError(self.trie.TryUpdate(addr[:], data)) + s.setError(s.trie.TryUpdate(addr[:], data)) } // deleteStateObject removes the given object from the state trie. -func (self *StateDB) deleteStateObject(stateObject *stateObject) { - stateObject.deleted = true - addr := stateObject.Address() - self.setError(self.trie.TryDelete(addr[:])) +func (s *StateDB) deleteStateObject(obj *stateObject) { + // Track the amount of time wasted on deleting the account from the trie + if metrics.EnabledExpensive { + defer func(start time.Time) { s.AccountUpdates += time.Since(start) }(time.Now()) + } + // Delete the account from the trie + addr := obj.Address() + s.setError(s.trie.TryDelete(addr[:])) } -// Retrieve a state object given by the address. Returns nil if not found. -func (self *StateDB) getStateObject(addr common.Address) (stateObject *stateObject) { - // Prefer 'live' objects. - if obj := self.stateObjects[addr]; obj != nil { - if obj.deleted { - return nil - } +// getStateObject retrieves a state object given by the address, returning nil if +// the object is not found or was deleted in this execution context. If you need +// to differentiate between non-existent/just-deleted, use getDeletedStateObject. +func (s *StateDB) getStateObject(addr common.Address) *stateObject { + if obj := s.getDeletedStateObject(addr); obj != nil && !obj.deleted { return obj } + return nil +} - // Load the object from the database. - enc, err := self.trie.TryGet(addr[:]) +// getDeletedStateObject is similar to getStateObject, but instead of returning +// nil for a deleted state object, it returns the actual object with the deleted +// flag set. This is needed by the state journal to revert to the correct s- +// destructed object instead of wiping all knowledge about the state object. +func (s *StateDB) getDeletedStateObject(addr common.Address) *stateObject { + // Prefer live objects if any is available + if obj := s.stateObjects[addr]; obj != nil { + return obj + } + // Track the amount of time wasted on loading the object from the database + if metrics.EnabledExpensive { + defer func(start time.Time) { s.AccountReads += time.Since(start) }(time.Now()) + } + // Load the object from the database + enc, err := s.trie.TryGet(addr[:]) if len(enc) == 0 { - self.setError(err) + s.setError(err) return nil } var data Account @@ -423,37 +484,38 @@ func (self *StateDB) getStateObject(addr common.Address) (stateObject *stateObje log.Error("Failed to decode state object", "addr", addr, "err", err) return nil } - // Insert into the live set. - obj := newObject(self, addr, data) - self.setStateObject(obj) + // Insert into the live set + obj := newObject(s, addr, data) + s.setStateObject(obj) return obj } -func (self *StateDB) setStateObject(object *stateObject) { - self.stateObjects[object.Address()] = object +func (s *StateDB) setStateObject(object *stateObject) { + s.stateObjects[object.Address()] = object } // Retrieve a state object or create a new state object if nil. -func (self *StateDB) GetOrNewStateObject(addr common.Address) *stateObject { - stateObject := self.getStateObject(addr) - if stateObject == nil || stateObject.deleted { - stateObject, _ = self.createObject(addr) +func (s *StateDB) GetOrNewStateObject(addr common.Address) *stateObject { + stateObject := s.getStateObject(addr) + if stateObject == nil { + stateObject, _ = s.createObject(addr) } return stateObject } // createObject creates a new state object. If there is an existing account with // the given address, it is overwritten and returned as the second return value. -func (self *StateDB) createObject(addr common.Address) (newobj, prev *stateObject) { - prev = self.getStateObject(addr) - newobj = newObject(self, addr, Account{}) +func (s *StateDB) createObject(addr common.Address) (newobj, prev *stateObject) { + prev = s.getDeletedStateObject(addr) // Note, prev might have been deleted, we need that! + + newobj = newObject(s, addr, Account{}) newobj.setNonce(0) // sets the object to dirty if prev == nil { - self.journal.append(createObjectChange{account: &addr}) + s.journal.append(createObjectChange{account: &addr}) } else { - self.journal.append(resetObjectChange{prev: prev}) + s.journal.append(resetObjectChange{prev: prev}) } - self.setStateObject(newobj) + s.setStateObject(newobj) return newobj, prev } @@ -467,65 +529,90 @@ func (self *StateDB) createObject(addr common.Address) (newobj, prev *stateObjec // 2. tx_create(sha(account ++ nonce)) (note that this gets the address of 1) // // Carrying over the balance ensures that Ether doesn't disappear. -func (self *StateDB) CreateAccount(addr common.Address) { - newObj, prev := self.createObject(addr) +func (s *StateDB) CreateAccount(addr common.Address) { + newObj, prev := s.createObject(addr) if prev != nil { newObj.setBalance(prev.data.Balance) } } -func (db *StateDB) ForEachStorage(addr common.Address, cb func(key, value common.Hash) bool) { +func (db *StateDB) ForEachStorage(addr common.Address, cb func(key, value common.Hash) bool) error { so := db.getStateObject(addr) if so == nil { - return + return nil } it := trie.NewIterator(so.getTrie(db.db).NodeIterator(nil)) + for it.Next() { key := common.BytesToHash(db.trie.GetKey(it.Key)) if value, dirty := so.dirtyStorage[key]; dirty { - cb(key, value) + if !cb(key, value) { + return nil + } continue } - cb(key, common.BytesToHash(it.Value)) + + if len(it.Value) > 0 { + _, content, _, err := rlp.Split(it.Value) + if err != nil { + return err + } + if !cb(key, common.BytesToHash(content)) { + return nil + } + } } + return nil } // Copy creates a deep, independent copy of the state. // Snapshots of the copied state cannot be applied to the copy. -func (self *StateDB) Copy() *StateDB { +func (s *StateDB) Copy() *StateDB { // Copy all the basic fields, initialize the memory ones state := &StateDB{ - db: self.db, - trie: self.db.CopyTrie(self.trie), - stateObjects: make(map[common.Address]*stateObject, len(self.journal.dirties)), - stateObjectsDirty: make(map[common.Address]struct{}, len(self.journal.dirties)), - refund: self.refund, - logs: make(map[common.Hash][]*types.Log, len(self.logs)), - logSize: self.logSize, - preimages: make(map[common.Hash][]byte), - journal: newJournal(), + db: s.db, + trie: s.db.CopyTrie(s.trie), + stateObjects: make(map[common.Address]*stateObject, len(s.journal.dirties)), + stateObjectsPending: make(map[common.Address]struct{}, len(s.stateObjectsPending)), + stateObjectsDirty: make(map[common.Address]struct{}, len(s.journal.dirties)), + refund: s.refund, + logs: make(map[common.Hash][]*types.Log, len(s.logs)), + logSize: s.logSize, + preimages: make(map[common.Hash][]byte, len(s.preimages)), + journal: newJournal(), } // Copy the dirty states, logs, and preimages - for addr := range self.journal.dirties { + for addr := range s.journal.dirties { // As documented [here](https://github.com/ethereum/go-ethereum/pull/16485#issuecomment-380438527), // and in the Finalise-method, there is a case where an object is in the journal but not // in the stateObjects: OOG after touch on ripeMD prior to Byzantium. Thus, we need to check for // nil - if object, exist := self.stateObjects[addr]; exist { + if object, exist := s.stateObjects[addr]; exist { + // Even though the original object is dirty, we are not copying the journal, + // so we need to make sure that anyside effect the journal would have caused + // during a commit (or similar op) is already applied to the copy. state.stateObjects[addr] = object.deepCopy(state) - state.stateObjectsDirty[addr] = struct{}{} + + state.stateObjectsDirty[addr] = struct{}{} // Mark the copy dirty to force internal (code/state) commits + state.stateObjectsPending[addr] = struct{}{} // Mark the copy pending to force external (account) commits } } // Above, we don't copy the actual journal. This means that if the copy is copied, the // loop above will be a no-op, since the copy's journal is empty. // Thus, here we iterate over stateObjects, to enable copies of copies - for addr := range self.stateObjectsDirty { + for addr := range s.stateObjectsPending { + if _, exist := state.stateObjects[addr]; !exist { + state.stateObjects[addr] = s.stateObjects[addr].deepCopy(state) + } + state.stateObjectsPending[addr] = struct{}{} + } + for addr := range s.stateObjectsDirty { if _, exist := state.stateObjects[addr]; !exist { - state.stateObjects[addr] = self.stateObjects[addr].deepCopy(state) - state.stateObjectsDirty[addr] = struct{}{} + state.stateObjects[addr] = s.stateObjects[addr].deepCopy(state) } + state.stateObjectsDirty[addr] = struct{}{} } - for hash, logs := range self.logs { + for hash, logs := range s.logs { cpy := make([]*types.Log, len(logs)) for i, l := range logs { cpy[i] = new(types.Log) @@ -533,46 +620,47 @@ func (self *StateDB) Copy() *StateDB { } state.logs[hash] = cpy } - for hash, preimage := range self.preimages { + for hash, preimage := range s.preimages { state.preimages[hash] = preimage } return state } // Snapshot returns an identifier for the current revision of the state. -func (self *StateDB) Snapshot() int { - id := self.nextRevisionId - self.nextRevisionId++ - self.validRevisions = append(self.validRevisions, revision{id, self.journal.length()}) +func (s *StateDB) Snapshot() int { + id := s.nextRevisionId + s.nextRevisionId++ + s.validRevisions = append(s.validRevisions, revision{id, s.journal.length()}) return id } // RevertToSnapshot reverts all state changes made since the given revision. -func (self *StateDB) RevertToSnapshot(revid int) { +func (s *StateDB) RevertToSnapshot(revid int) { // Find the snapshot in the stack of valid snapshots. - idx := sort.Search(len(self.validRevisions), func(i int) bool { - return self.validRevisions[i].id >= revid + idx := sort.Search(len(s.validRevisions), func(i int) bool { + return s.validRevisions[i].id >= revid }) - if idx == len(self.validRevisions) || self.validRevisions[idx].id != revid { + if idx == len(s.validRevisions) || s.validRevisions[idx].id != revid { panic(fmt.Errorf("revision id %v cannot be reverted", revid)) } - snapshot := self.validRevisions[idx].journalIndex + snapshot := s.validRevisions[idx].journalIndex // Replay the journal to undo changes and remove invalidated snapshots - self.journal.revert(self, snapshot) - self.validRevisions = self.validRevisions[:idx] + s.journal.revert(s, snapshot) + s.validRevisions = s.validRevisions[:idx] } // GetRefund returns the current value of the refund counter. -func (self *StateDB) GetRefund() uint64 { - return self.refund +func (s *StateDB) GetRefund() uint64 { + return s.refund } -// Finalise finalises the state by removing the self destructed objects -// and clears the journal as well as the refunds. +// Finalise finalises the state by removing the s destructed objects and clears +// the journal as well as the refunds. Finalise, however, will not push any updates +// into the tries just yet. Only IntermediateRoot or Commit will do that. func (s *StateDB) Finalise(deleteEmptyObjects bool) { for addr := range s.journal.dirties { - stateObject, exist := s.stateObjects[addr] + obj, exist := s.stateObjects[addr] if !exist { // ripeMD is 'touched' at block 1714175, in tx 0x1237f737031e40bcde4a8b7e717b2d15e3ecadfe49bb1bbc71ee9deb09c6fcf2 // That tx goes out of gas, and although the notion of 'touched' does not exist there, the @@ -582,13 +670,12 @@ func (s *StateDB) Finalise(deleteEmptyObjects bool) { // Thus, we can safely ignore it here continue } - - if stateObject.suicided || (deleteEmptyObjects && stateObject.empty()) { - s.deleteStateObject(stateObject) + if obj.suicided || (deleteEmptyObjects && obj.empty()) { + obj.deleted = true } else { - stateObject.updateRoot(s.db) - s.updateStateObject(stateObject) + obj.finalise() } + s.stateObjectsPending[addr] = struct{}{} s.stateObjectsDirty[addr] = struct{}{} } // Invalidate journal because reverting across transactions is not allowed. @@ -599,61 +686,76 @@ func (s *StateDB) Finalise(deleteEmptyObjects bool) { // 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 all the dirty storage states and write them into the tries s.Finalise(deleteEmptyObjects) + + for addr := range s.stateObjectsPending { + obj := s.stateObjects[addr] + if obj.deleted { + s.deleteStateObject(obj) + } else { + obj.updateRoot(s.db) + s.updateStateObject(obj) + } + } + if len(s.stateObjectsPending) > 0 { + s.stateObjectsPending = make(map[common.Address]struct{}) + } + // Track the amount of time wasted on hashing the account trie + if metrics.EnabledExpensive { + defer func(start time.Time) { s.AccountHashes += time.Since(start) }(time.Now()) + } return s.trie.Hash() } // Prepare sets the current transaction hash and index and block hash which is // used when the EVM emits new state logs. -func (self *StateDB) Prepare(thash, bhash common.Hash, ti int) { - self.thash = thash - self.bhash = bhash - self.txIndex = ti +func (s *StateDB) Prepare(thash, bhash common.Hash, ti int) { + s.thash = thash + s.bhash = bhash + s.txIndex = ti } func (s *StateDB) clearJournalAndRefund() { - s.journal = newJournal() - s.validRevisions = s.validRevisions[:0] - s.refund = 0 + if len(s.journal.entries) > 0 { + s.journal = newJournal() + s.refund = 0 + } + s.validRevisions = s.validRevisions[:0] // Snapshots can be created without journal entires } // Commit writes the state to the underlying in-memory trie database. -func (s *StateDB) Commit(deleteEmptyObjects bool) (root common.Hash, err error) { - defer s.clearJournalAndRefund() +func (s *StateDB) Commit(deleteEmptyObjects bool) (common.Hash, error) { + // Finalize any pending changes and merge everything into the tries + s.IntermediateRoot(deleteEmptyObjects) - for addr := range s.journal.dirties { - s.stateObjectsDirty[addr] = struct{}{} - } - // Commit objects to the trie. - for addr, stateObject := range s.stateObjects { - _, isDirty := s.stateObjectsDirty[addr] - switch { - case stateObject.suicided || (isDirty && deleteEmptyObjects && stateObject.empty()): - // If the object has been removed, don't bother syncing it - // and just mark it for deletion in the trie. - s.deleteStateObject(stateObject) - case isDirty: + // Commit objects to the trie, measuring the elapsed time + for addr := range s.stateObjectsDirty { + if obj := s.stateObjects[addr]; !obj.deleted { // Write any contract code associated with the state object - if stateObject.code != nil && stateObject.dirtyCode { - s.db.TrieDB().InsertBlob(common.BytesToHash(stateObject.CodeHash()), stateObject.code) - stateObject.dirtyCode = false + if obj.code != nil && obj.dirtyCode { + s.db.TrieDB().InsertBlob(common.BytesToHash(obj.CodeHash()), obj.code) + obj.dirtyCode = false } - // Write any storage changes in the state object to its storage trie. - if err := stateObject.CommitTrie(s.db); err != nil { + // Write any storage changes in the state object to its storage trie + if err := obj.CommitTrie(s.db); err != nil { return common.Hash{}, err } - // Update the object in the main account trie. - s.updateStateObject(stateObject) } - delete(s.stateObjectsDirty, addr) } - // Write trie changes. - root, err = s.trie.Commit(func(leaf []byte, parent common.Hash) error { + if len(s.stateObjectsDirty) > 0 { + s.stateObjectsDirty = make(map[common.Address]struct{}) + } + // Write the account trie changes, measuing the amount of wasted time + if metrics.EnabledExpensive { + defer func(start time.Time) { s.AccountCommits += time.Since(start) }(time.Now()) + } + return s.trie.Commit(func(leaf []byte, parent common.Hash) error { var account Account if err := rlp.DecodeBytes(leaf, &account); err != nil { return nil } - if account.Root != emptyState { + if account.Root != emptyRoot { s.db.TrieDB().Reference(account.Root, parent) } code := common.BytesToHash(account.CodeHash) @@ -662,6 +764,4 @@ func (s *StateDB) Commit(deleteEmptyObjects bool) (root common.Hash, err error) } return nil }) - log.Debug("Trie cache stats after commit", "misses", trie.CacheMisses(), "unloads", trie.CacheUnloads()) - return root, err } diff --git a/core/state/statedb_test.go b/core/state/statedb_test.go index f7ec7cfd16af..a065d2c55674 100644 --- a/core/state/statedb_test.go +++ b/core/state/statedb_test.go @@ -25,21 +25,20 @@ import ( "math/rand" "reflect" "strings" + "sync" "testing" "testing/quick" - check "gopkg.in/check.v1" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" ) // Tests that updating a state trie does not leak any database writes prior to // actually committing the state. func TestUpdateLeaks(t *testing.T) { // Create an empty state database - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() state, _ := New(common.Hash{}, NewDatabase(db)) // Update it with some accounts @@ -53,21 +52,27 @@ func TestUpdateLeaks(t *testing.T) { if i%3 == 0 { state.SetCode(addr, []byte{i, i, i, i, i}) } - state.IntermediateRoot(false) } + + root := state.IntermediateRoot(false) + if err := state.Database().TrieDB().Commit(root, false); err != nil { + t.Errorf("can not commit trie %v to persistent database", root.Hex()) + } + // Ensure that no data was leaked into the database - for _, key := range db.Keys() { - value, _ := db.Get(key) - t.Errorf("State leaked into database: %x -> %x", key, value) + it := db.NewIterator() + for it.Next() { + t.Errorf("State leaked into database: %x -> %x", it.Key(), it.Value()) } + it.Release() } // Tests that no intermediate state of an object is stored into the database, // only the one right before the commit. func TestIntermediateLeaks(t *testing.T) { // Create two state databases, one transitioning to the final state, the other final from the beginning - transDb := ethdb.NewMemDatabase() - finalDb := ethdb.NewMemDatabase() + transDb := rawdb.NewMemoryDatabase() + finalDb := rawdb.NewMemoryDatabase() transState, _ := New(common.Hash{}, NewDatabase(transDb)) finalState, _ := New(common.Hash{}, NewDatabase(finalDb)) @@ -85,34 +90,56 @@ func TestIntermediateLeaks(t *testing.T) { // Modify the transient state. for i := byte(0); i < 255; i++ { - modify(transState, common.Address{byte(i)}, i, 0) + modify(transState, common.Address{i}, i, 0) } // Write modifications to trie. transState.IntermediateRoot(false) // Overwrite all the data with new values in the transient database. for i := byte(0); i < 255; i++ { - modify(transState, common.Address{byte(i)}, i, 99) - modify(finalState, common.Address{byte(i)}, i, 99) + modify(transState, common.Address{i}, i, 99) + modify(finalState, common.Address{i}, i, 99) } // Commit and cross check the databases. - if _, err := transState.Commit(false); err != nil { + transRoot, err := transState.Commit(false) + if err != nil { t.Fatalf("failed to commit transition state: %v", err) } - if _, err := finalState.Commit(false); err != nil { + if err = transState.Database().TrieDB().Commit(transRoot, false); err != nil { + t.Errorf("can not commit trie %v to persistent database", transRoot.Hex()) + } + + finalRoot, err := finalState.Commit(false) + if err != nil { t.Fatalf("failed to commit final state: %v", err) } - for _, key := range finalDb.Keys() { - if _, err := transDb.Get(key); err != nil { - val, _ := finalDb.Get(key) - t.Errorf("entry missing from the transition database: %x -> %x", key, val) + if err = finalState.Database().TrieDB().Commit(finalRoot, false); err != nil { + t.Errorf("can not commit trie %v to persistent database", finalRoot.Hex()) + } + + it := finalDb.NewIterator() + for it.Next() { + key, fvalue := it.Key(), it.Value() + tvalue, err := transDb.Get(key) + if err != nil { + t.Errorf("entry missing from the transition database: %x -> %x", key, fvalue) + } + if !bytes.Equal(fvalue, tvalue) { + t.Errorf("the value associate key %x is mismatch,: %x in transition database ,%x in final database", key, tvalue, fvalue) } } - for _, key := range transDb.Keys() { - if _, err := finalDb.Get(key); err != nil { - val, _ := transDb.Get(key) - t.Errorf("extra entry in the transition database: %x -> %x", key, val) + it.Release() + + it = transDb.NewIterator() + for it.Next() { + key, tvalue := it.Key(), it.Value() + fvalue, err := finalDb.Get(key) + if err != nil { + t.Errorf("extra entry in the transition database: %x -> %x", key, it.Value()) + } + if !bytes.Equal(fvalue, tvalue) { + t.Errorf("the value associate key %x is mismatch,: %x in transition database ,%x in final database", key, tvalue, fvalue) } } } @@ -122,7 +149,7 @@ func TestIntermediateLeaks(t *testing.T) { // https://github.com/ethereum/go-ethereum/pull/15549. func TestCopy(t *testing.T) { // Create a random state test to copy and modify "independently" - orig, _ := New(common.Hash{}, NewDatabase(ethdb.NewMemDatabase())) + orig, _ := New(common.Hash{}, NewDatabase(rawdb.NewMemoryDatabase())) for i := byte(0); i < 255; i++ { obj := orig.GetOrNewStateObject(common.BytesToAddress([]byte{i})) @@ -131,32 +158,45 @@ func TestCopy(t *testing.T) { } orig.Finalise(false) - // Copy the state, modify both in-memory + // Copy the state copy := orig.Copy() + // Copy the copy state + ccopy := copy.Copy() + + // modify all in memory for i := byte(0); i < 255; i++ { origObj := orig.GetOrNewStateObject(common.BytesToAddress([]byte{i})) copyObj := copy.GetOrNewStateObject(common.BytesToAddress([]byte{i})) + ccopyObj := ccopy.GetOrNewStateObject(common.BytesToAddress([]byte{i})) origObj.AddBalance(big.NewInt(2 * int64(i))) copyObj.AddBalance(big.NewInt(3 * int64(i))) + ccopyObj.AddBalance(big.NewInt(4 * int64(i))) orig.updateStateObject(origObj) copy.updateStateObject(copyObj) + ccopy.updateStateObject(copyObj) + } + + // Finalise the changes on all concurrently + finalise := func(wg *sync.WaitGroup, db *StateDB) { + defer wg.Done() + db.Finalise(true) } - // Finalise the changes on both concurrently - done := make(chan struct{}) - go func() { - orig.Finalise(true) - close(done) - }() - copy.Finalise(true) - <-done - // Verify that the two states have been updated independently + var wg sync.WaitGroup + wg.Add(3) + go finalise(&wg, orig) + go finalise(&wg, copy) + go finalise(&wg, ccopy) + wg.Wait() + + // Verify that the three states have been updated independently for i := byte(0); i < 255; i++ { origObj := orig.GetOrNewStateObject(common.BytesToAddress([]byte{i})) copyObj := copy.GetOrNewStateObject(common.BytesToAddress([]byte{i})) + ccopyObj := ccopy.GetOrNewStateObject(common.BytesToAddress([]byte{i})) if want := big.NewInt(3 * int64(i)); origObj.Balance().Cmp(want) != 0 { t.Errorf("orig obj %d: balance mismatch: have %v, want %v", i, origObj.Balance(), want) @@ -164,6 +204,9 @@ func TestCopy(t *testing.T) { if want := big.NewInt(4 * int64(i)); copyObj.Balance().Cmp(want) != 0 { t.Errorf("copy obj %d: balance mismatch: have %v, want %v", i, copyObj.Balance(), want) } + if want := big.NewInt(5 * int64(i)); ccopyObj.Balance().Cmp(want) != 0 { + t.Errorf("copy obj %d: balance mismatch: have %v, want %v", i, ccopyObj.Balance(), want) + } } } @@ -276,13 +319,22 @@ func newTestAction(addr common.Address, r *rand.Rand) testAction { }, args: make([]int64, 1), }, + { + name: "AddPreimage", + fn: func(a testAction, s *StateDB) { + preimage := []byte{1} + hash := common.BytesToHash(preimage) + s.AddPreimage(hash, preimage) + }, + args: make([]int64, 1), + }, } action := actions[r.Intn(len(actions))] var nameargs []string if !action.noAddr { nameargs = append(nameargs, addr.Hex()) } - for _, i := range action.args { + for i := range action.args { action.args[i] = rand.Int63n(100) nameargs = append(nameargs, fmt.Sprint(action.args[i])) } @@ -333,7 +385,7 @@ func (test *snapshotTest) String() string { func (test *snapshotTest) run() bool { // Run all actions and create snapshots. var ( - state, _ = New(common.Hash{}, NewDatabase(ethdb.NewMemDatabase())) + state, _ = New(common.Hash{}, NewDatabase(rawdb.NewMemoryDatabase())) snapshotRevs = make([]int, len(test.snapshots)) sindex = 0 ) @@ -404,7 +456,8 @@ func (test *snapshotTest) checkEqual(state, checkstate *StateDB) error { return nil } -func (s *StateSuite) TestTouchDelete(c *check.C) { +func TestTouchDelete(t *testing.T) { + s := newStateTest() s.state.GetOrNewStateObject(common.Address{}) root, _ := s.state.Commit(false) s.state.Reset(root) @@ -413,25 +466,217 @@ func (s *StateSuite) TestTouchDelete(c *check.C) { s.state.AddBalance(common.Address{}, new(big.Int)) if len(s.state.journal.dirties) != 1 { - c.Fatal("expected one dirty state object") + t.Fatal("expected one dirty state object") } s.state.RevertToSnapshot(snapshot) if len(s.state.journal.dirties) != 0 { - c.Fatal("expected no dirty state object") + t.Fatal("expected no dirty state object") } } // TestCopyOfCopy tests that modified objects are carried over to the copy, and the copy of the copy. // See https://github.com/ethereum/go-ethereum/pull/15225#issuecomment-380191512 func TestCopyOfCopy(t *testing.T) { - sdb, _ := New(common.Hash{}, NewDatabase(ethdb.NewMemDatabase())) + state, _ := New(common.Hash{}, NewDatabase(rawdb.NewMemoryDatabase())) addr := common.HexToAddress("aaaa") - sdb.SetBalance(addr, big.NewInt(42)) + state.SetBalance(addr, big.NewInt(42)) - if got := sdb.Copy().GetBalance(addr).Uint64(); got != 42 { + if got := state.Copy().GetBalance(addr).Uint64(); got != 42 { t.Fatalf("1st copy fail, expected 42, got %v", got) } - if got := sdb.Copy().Copy().GetBalance(addr).Uint64(); got != 42 { + if got := state.Copy().Copy().GetBalance(addr).Uint64(); got != 42 { t.Fatalf("2nd copy fail, expected 42, got %v", got) } } + +// Tests a regression where committing a copy lost some internal meta information, +// leading to corrupted subsequent copies. +// +// See https://github.com/ethereum/go-ethereum/issues/20106. +func TestCopyCommitCopy(t *testing.T) { + state, _ := New(common.Hash{}, NewDatabase(rawdb.NewMemoryDatabase())) + + // Create an account and check if the retrieved balance is correct + addr := common.HexToAddress("0xaffeaffeaffeaffeaffeaffeaffeaffeaffeaffe") + skey := common.HexToHash("aaa") + sval := common.HexToHash("bbb") + + state.SetBalance(addr, big.NewInt(42)) // Change the account trie + state.SetCode(addr, []byte("hello")) // Change an external metadata + state.SetState(addr, skey, sval) // Change the storage trie + + if balance := state.GetBalance(addr); balance.Cmp(big.NewInt(42)) != 0 { + t.Fatalf("initial balance mismatch: have %v, want %v", balance, 42) + } + if code := state.GetCode(addr); !bytes.Equal(code, []byte("hello")) { + t.Fatalf("initial code mismatch: have %x, want %x", code, []byte("hello")) + } + if val := state.GetState(addr, skey); val != sval { + t.Fatalf("initial non-committed storage slot mismatch: have %x, want %x", val, sval) + } + if val := state.GetCommittedState(addr, skey); val != (common.Hash{}) { + t.Fatalf("initial committed storage slot mismatch: have %x, want %x", val, common.Hash{}) + } + // Copy the non-committed state database and check pre/post commit balance + copyOne := state.Copy() + if balance := copyOne.GetBalance(addr); balance.Cmp(big.NewInt(42)) != 0 { + t.Fatalf("first copy pre-commit balance mismatch: have %v, want %v", balance, 42) + } + if code := copyOne.GetCode(addr); !bytes.Equal(code, []byte("hello")) { + t.Fatalf("first copy pre-commit code mismatch: have %x, want %x", code, []byte("hello")) + } + if val := copyOne.GetState(addr, skey); val != sval { + t.Fatalf("first copy pre-commit non-committed storage slot mismatch: have %x, want %x", val, sval) + } + if val := copyOne.GetCommittedState(addr, skey); val != (common.Hash{}) { + t.Fatalf("first copy pre-commit committed storage slot mismatch: have %x, want %x", val, common.Hash{}) + } + + copyOne.Commit(false) + if balance := copyOne.GetBalance(addr); balance.Cmp(big.NewInt(42)) != 0 { + t.Fatalf("first copy post-commit balance mismatch: have %v, want %v", balance, 42) + } + if code := copyOne.GetCode(addr); !bytes.Equal(code, []byte("hello")) { + t.Fatalf("first copy post-commit code mismatch: have %x, want %x", code, []byte("hello")) + } + if val := copyOne.GetState(addr, skey); val != sval { + t.Fatalf("first copy post-commit non-committed storage slot mismatch: have %x, want %x", val, sval) + } + if val := copyOne.GetCommittedState(addr, skey); val != sval { + t.Fatalf("first copy post-commit committed storage slot mismatch: have %x, want %x", val, sval) + } + // Copy the copy and check the balance once more + copyTwo := copyOne.Copy() + if balance := copyTwo.GetBalance(addr); balance.Cmp(big.NewInt(42)) != 0 { + t.Fatalf("second copy balance mismatch: have %v, want %v", balance, 42) + } + if code := copyTwo.GetCode(addr); !bytes.Equal(code, []byte("hello")) { + t.Fatalf("second copy code mismatch: have %x, want %x", code, []byte("hello")) + } + if val := copyTwo.GetState(addr, skey); val != sval { + t.Fatalf("second copy non-committed storage slot mismatch: have %x, want %x", val, sval) + } + if val := copyTwo.GetCommittedState(addr, skey); val != sval { + t.Fatalf("second copy post-commit committed storage slot mismatch: have %x, want %x", val, sval) + } +} + +// Tests a regression where committing a copy lost some internal meta information, +// leading to corrupted subsequent copies. +// +// See https://github.com/ethereum/go-ethereum/issues/20106. +func TestCopyCopyCommitCopy(t *testing.T) { + state, _ := New(common.Hash{}, NewDatabase(rawdb.NewMemoryDatabase())) + + // Create an account and check if the retrieved balance is correct + addr := common.HexToAddress("0xaffeaffeaffeaffeaffeaffeaffeaffeaffeaffe") + skey := common.HexToHash("aaa") + sval := common.HexToHash("bbb") + + state.SetBalance(addr, big.NewInt(42)) // Change the account trie + state.SetCode(addr, []byte("hello")) // Change an external metadata + state.SetState(addr, skey, sval) // Change the storage trie + + if balance := state.GetBalance(addr); balance.Cmp(big.NewInt(42)) != 0 { + t.Fatalf("initial balance mismatch: have %v, want %v", balance, 42) + } + if code := state.GetCode(addr); !bytes.Equal(code, []byte("hello")) { + t.Fatalf("initial code mismatch: have %x, want %x", code, []byte("hello")) + } + if val := state.GetState(addr, skey); val != sval { + t.Fatalf("initial non-committed storage slot mismatch: have %x, want %x", val, sval) + } + if val := state.GetCommittedState(addr, skey); val != (common.Hash{}) { + t.Fatalf("initial committed storage slot mismatch: have %x, want %x", val, common.Hash{}) + } + // Copy the non-committed state database and check pre/post commit balance + copyOne := state.Copy() + if balance := copyOne.GetBalance(addr); balance.Cmp(big.NewInt(42)) != 0 { + t.Fatalf("first copy balance mismatch: have %v, want %v", balance, 42) + } + if code := copyOne.GetCode(addr); !bytes.Equal(code, []byte("hello")) { + t.Fatalf("first copy code mismatch: have %x, want %x", code, []byte("hello")) + } + if val := copyOne.GetState(addr, skey); val != sval { + t.Fatalf("first copy non-committed storage slot mismatch: have %x, want %x", val, sval) + } + if val := copyOne.GetCommittedState(addr, skey); val != (common.Hash{}) { + t.Fatalf("first copy committed storage slot mismatch: have %x, want %x", val, common.Hash{}) + } + // Copy the copy and check the balance once more + copyTwo := copyOne.Copy() + if balance := copyTwo.GetBalance(addr); balance.Cmp(big.NewInt(42)) != 0 { + t.Fatalf("second copy pre-commit balance mismatch: have %v, want %v", balance, 42) + } + if code := copyTwo.GetCode(addr); !bytes.Equal(code, []byte("hello")) { + t.Fatalf("second copy pre-commit code mismatch: have %x, want %x", code, []byte("hello")) + } + if val := copyTwo.GetState(addr, skey); val != sval { + t.Fatalf("second copy pre-commit non-committed storage slot mismatch: have %x, want %x", val, sval) + } + if val := copyTwo.GetCommittedState(addr, skey); val != (common.Hash{}) { + t.Fatalf("second copy pre-commit committed storage slot mismatch: have %x, want %x", val, common.Hash{}) + } + copyTwo.Commit(false) + if balance := copyTwo.GetBalance(addr); balance.Cmp(big.NewInt(42)) != 0 { + t.Fatalf("second copy post-commit balance mismatch: have %v, want %v", balance, 42) + } + if code := copyTwo.GetCode(addr); !bytes.Equal(code, []byte("hello")) { + t.Fatalf("second copy post-commit code mismatch: have %x, want %x", code, []byte("hello")) + } + if val := copyTwo.GetState(addr, skey); val != sval { + t.Fatalf("second copy post-commit non-committed storage slot mismatch: have %x, want %x", val, sval) + } + if val := copyTwo.GetCommittedState(addr, skey); val != sval { + t.Fatalf("second copy post-commit committed storage slot mismatch: have %x, want %x", val, sval) + } + // Copy the copy-copy and check the balance once more + copyThree := copyTwo.Copy() + if balance := copyThree.GetBalance(addr); balance.Cmp(big.NewInt(42)) != 0 { + t.Fatalf("third copy balance mismatch: have %v, want %v", balance, 42) + } + if code := copyThree.GetCode(addr); !bytes.Equal(code, []byte("hello")) { + t.Fatalf("third copy code mismatch: have %x, want %x", code, []byte("hello")) + } + if val := copyThree.GetState(addr, skey); val != sval { + t.Fatalf("third copy non-committed storage slot mismatch: have %x, want %x", val, sval) + } + if val := copyThree.GetCommittedState(addr, skey); val != sval { + t.Fatalf("third copy committed storage slot mismatch: have %x, want %x", val, sval) + } +} + +// TestDeleteCreateRevert tests a weird state transition corner case that we hit +// while changing the internals of statedb. The workflow is that a contract is +// self destructed, then in a followup transaction (but same block) it's created +// again and the transaction reverted. +// +// The original statedb implementation flushed dirty objects to the tries after +// each transaction, so this works ok. The rework accumulated writes in memory +// first, but the journal wiped the entire state object on create-revert. +func TestDeleteCreateRevert(t *testing.T) { + // Create an initial state with a single contract + state, _ := New(common.Hash{}, NewDatabase(rawdb.NewMemoryDatabase())) + + addr := toAddr([]byte("so")) + state.SetBalance(addr, big.NewInt(1)) + + root, _ := state.Commit(false) + state.Reset(root) + + // Simulate self-destructing in one transaction, then create-reverting in another + state.Suicide(addr) + state.Finalise(true) + + id := state.Snapshot() + state.SetBalance(addr, big.NewInt(2)) + state.RevertToSnapshot(id) + + // Commit the entire state and make sure we don't crash and have the correct state + root, _ = state.Commit(true) + state.Reset(root) + + if state.getStateObject(addr) != nil { + t.Fatalf("self-destructed contract came alive") + } +} diff --git a/core/state/sync.go b/core/state/sync.go index 60f68a5177b9..ef7930527366 100644 --- a/core/state/sync.go +++ b/core/state/sync.go @@ -19,13 +19,14 @@ package state import ( "bytes" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" ) // NewStateSync create a new state trie download scheduler. -func NewStateSync(root common.Hash, database trie.DatabaseReader) *trie.Sync { +func NewStateSync(root common.Hash, database ethdb.KeyValueReader, bloom *trie.SyncBloom) *trie.Sync { var syncer *trie.Sync callback := func(leaf []byte, parent common.Hash) error { var obj Account @@ -36,6 +37,6 @@ func NewStateSync(root common.Hash, database trie.DatabaseReader) *trie.Sync { syncer.AddRawEntry(common.BytesToHash(obj.CodeHash), 64, parent) return nil } - syncer = trie.NewSync(root, database, callback) + syncer = trie.NewSync(root, database, callback, bloom) return syncer } diff --git a/core/state/sync_test.go b/core/state/sync_test.go index a863b84018bb..f4a221bd9df2 100644 --- a/core/state/sync_test.go +++ b/core/state/sync_test.go @@ -21,10 +21,12 @@ import ( "math/big" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethdb/memorydb" + "github.com/ethereum/go-ethereum/trie" ) // testAccount is the data associated with an account used by the state tests. @@ -38,7 +40,7 @@ type testAccount struct { // makeTestState create a sample test state to test node-wise reconstruction. func makeTestState() (Database, common.Hash, []*testAccount) { // Create an empty state - db := NewDatabase(ethdb.NewMemDatabase()) + db := NewDatabase(rawdb.NewMemoryDatabase()) state, _ := New(common.Hash{}, db) // Fill it with some arbitrary data @@ -124,7 +126,7 @@ func checkStateConsistency(db ethdb.Database, root common.Hash) error { // Tests that an empty state is not scheduled for syncing. func TestEmptyStateSync(t *testing.T) { empty := common.HexToHash("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421") - if req := NewStateSync(empty, ethdb.NewMemDatabase()).Missing(1); len(req) != 0 { + if req := NewStateSync(empty, rawdb.NewMemoryDatabase(), trie.NewSyncBloom(1, memorydb.New())).Missing(1); len(req) != 0 { t.Errorf("content requested for empty state: %v", req) } } @@ -134,15 +136,15 @@ func TestEmptyStateSync(t *testing.T) { func TestIterativeStateSyncIndividual(t *testing.T) { testIterativeStateSync(t, 1) } func TestIterativeStateSyncBatched(t *testing.T) { testIterativeStateSync(t, 100) } -func testIterativeStateSync(t *testing.T, batch int) { +func testIterativeStateSync(t *testing.T, count int) { // Create a random state to copy srcDb, srcRoot, srcAccounts := makeTestState() // Create a destination state and sync with the scheduler - dstDb := ethdb.NewMemDatabase() - sched := NewStateSync(srcRoot, dstDb) + dstDb := rawdb.NewMemoryDatabase() + sched := NewStateSync(srcRoot, dstDb, trie.NewSyncBloom(1, dstDb)) - queue := append([]common.Hash{}, sched.Missing(batch)...) + queue := append([]common.Hash{}, sched.Missing(count)...) for len(queue) > 0 { results := make([]trie.SyncResult, len(queue)) for i, hash := range queue { @@ -155,10 +157,12 @@ func testIterativeStateSync(t *testing.T, batch int) { if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } - if index, err := sched.Commit(dstDb); err != nil { - t.Fatalf("failed to commit data #%d: %v", index, err) + batch := dstDb.NewBatch() + if err := sched.Commit(batch); err != nil { + t.Fatalf("failed to commit data: %v", err) } - queue = append(queue[:0], sched.Missing(batch)...) + batch.Write() + queue = append(queue[:0], sched.Missing(count)...) } // Cross check that the two states are in sync checkStateAccounts(t, dstDb, srcRoot, srcAccounts) @@ -171,8 +175,8 @@ func TestIterativeDelayedStateSync(t *testing.T) { srcDb, srcRoot, srcAccounts := makeTestState() // Create a destination state and sync with the scheduler - dstDb := ethdb.NewMemDatabase() - sched := NewStateSync(srcRoot, dstDb) + dstDb := rawdb.NewMemoryDatabase() + sched := NewStateSync(srcRoot, dstDb, trie.NewSyncBloom(1, dstDb)) queue := append([]common.Hash{}, sched.Missing(0)...) for len(queue) > 0 { @@ -188,9 +192,11 @@ func TestIterativeDelayedStateSync(t *testing.T) { if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } - if index, err := sched.Commit(dstDb); err != nil { - t.Fatalf("failed to commit data #%d: %v", index, err) + batch := dstDb.NewBatch() + if err := sched.Commit(batch); err != nil { + t.Fatalf("failed to commit data: %v", err) } + batch.Write() queue = append(queue[len(results):], sched.Missing(0)...) } // Cross check that the two states are in sync @@ -203,16 +209,16 @@ func TestIterativeDelayedStateSync(t *testing.T) { func TestIterativeRandomStateSyncIndividual(t *testing.T) { testIterativeRandomStateSync(t, 1) } func TestIterativeRandomStateSyncBatched(t *testing.T) { testIterativeRandomStateSync(t, 100) } -func testIterativeRandomStateSync(t *testing.T, batch int) { +func testIterativeRandomStateSync(t *testing.T, count int) { // Create a random state to copy srcDb, srcRoot, srcAccounts := makeTestState() // Create a destination state and sync with the scheduler - dstDb := ethdb.NewMemDatabase() - sched := NewStateSync(srcRoot, dstDb) + dstDb := rawdb.NewMemoryDatabase() + sched := NewStateSync(srcRoot, dstDb, trie.NewSyncBloom(1, dstDb)) queue := make(map[common.Hash]struct{}) - for _, hash := range sched.Missing(batch) { + for _, hash := range sched.Missing(count) { queue[hash] = struct{}{} } for len(queue) > 0 { @@ -229,11 +235,13 @@ func testIterativeRandomStateSync(t *testing.T, batch int) { if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } - if index, err := sched.Commit(dstDb); err != nil { - t.Fatalf("failed to commit data #%d: %v", index, err) + batch := dstDb.NewBatch() + if err := sched.Commit(batch); err != nil { + t.Fatalf("failed to commit data: %v", err) } + batch.Write() queue = make(map[common.Hash]struct{}) - for _, hash := range sched.Missing(batch) { + for _, hash := range sched.Missing(count) { queue[hash] = struct{}{} } } @@ -248,8 +256,8 @@ func TestIterativeRandomDelayedStateSync(t *testing.T) { srcDb, srcRoot, srcAccounts := makeTestState() // Create a destination state and sync with the scheduler - dstDb := ethdb.NewMemDatabase() - sched := NewStateSync(srcRoot, dstDb) + dstDb := rawdb.NewMemoryDatabase() + sched := NewStateSync(srcRoot, dstDb, trie.NewSyncBloom(1, dstDb)) queue := make(map[common.Hash]struct{}) for _, hash := range sched.Missing(0) { @@ -275,9 +283,11 @@ func TestIterativeRandomDelayedStateSync(t *testing.T) { if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } - if index, err := sched.Commit(dstDb); err != nil { - t.Fatalf("failed to commit data #%d: %v", index, err) + batch := dstDb.NewBatch() + if err := sched.Commit(batch); err != nil { + t.Fatalf("failed to commit data: %v", err) } + batch.Write() for _, hash := range sched.Missing(0) { queue[hash] = struct{}{} } @@ -295,8 +305,8 @@ func TestIncompleteStateSync(t *testing.T) { checkTrieConsistency(srcDb.TrieDB().DiskDB().(ethdb.Database), srcRoot) // Create a destination state and sync with the scheduler - dstDb := ethdb.NewMemDatabase() - sched := NewStateSync(srcRoot, dstDb) + dstDb := rawdb.NewMemoryDatabase() + sched := NewStateSync(srcRoot, dstDb, trie.NewSyncBloom(1, dstDb)) added := []common.Hash{} queue := append([]common.Hash{}, sched.Missing(1)...) @@ -314,9 +324,11 @@ func TestIncompleteStateSync(t *testing.T) { if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } - if index, err := sched.Commit(dstDb); err != nil { - t.Fatalf("failed to commit data #%d: %v", index, err) + batch := dstDb.NewBatch() + if err := sched.Commit(batch); err != nil { + t.Fatalf("failed to commit data: %v", err) } + batch.Write() for _, result := range results { added = append(added, result.Hash) } diff --git a/core/state_prefetcher.go b/core/state_prefetcher.go new file mode 100644 index 000000000000..cb85a05b578e --- /dev/null +++ b/core/state_prefetcher.go @@ -0,0 +1,85 @@ +// Copyright 2019 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 ( + "sync/atomic" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" +) + +// statePrefetcher is a basic Prefetcher, which blindly executes a block on top +// of an arbitrary state with the goal of prefetching potentially useful state +// data from disk before the main block processor start executing. +type statePrefetcher struct { + config *params.ChainConfig // Chain configuration options + bc *BlockChain // Canonical block chain + engine consensus.Engine // Consensus engine used for block rewards +} + +// newStatePrefetcher initialises a new statePrefetcher. +func newStatePrefetcher(config *params.ChainConfig, bc *BlockChain, engine consensus.Engine) *statePrefetcher { + return &statePrefetcher{ + config: config, + bc: bc, + engine: engine, + } +} + +// Prefetch processes the state changes according to the Ethereum rules by running +// the transaction messages using the statedb, but any changes are discarded. The +// only goal is to pre-cache transaction signatures and state trie nodes. +func (p *statePrefetcher) Prefetch(block *types.Block, statedb *state.StateDB, cfg vm.Config, interrupt *uint32) { + var ( + header = block.Header() + gaspool = new(GasPool).AddGas(block.GasLimit()) + ) + // Iterate over and process the individual transactions + for i, tx := range block.Transactions() { + // If block precaching was interrupted, abort + if interrupt != nil && atomic.LoadUint32(interrupt) == 1 { + return + } + // Block precaching permitted to continue, execute the transaction + statedb.Prepare(tx.Hash(), block.Hash(), i) + if err := precacheTransaction(p.config, p.bc, nil, gaspool, statedb, header, tx, cfg); err != nil { + return // Ugh, something went horribly wrong, bail out + } + } +} + +// precacheTransaction attempts to apply a transaction to the given state database +// and uses the input parameters for its environment. The goal is not to execute +// the transaction successfully, rather to warm up touched data slots. +func precacheTransaction(config *params.ChainConfig, bc ChainContext, author *common.Address, gaspool *GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, cfg vm.Config) error { + // Convert the transaction into an executable message and pre-cache its sender + msg, err := tx.AsMessage(types.MakeSigner(config, header.Number)) + if err != nil { + return err + } + // Create the EVM and execute the transaction + context := NewEVMContext(msg, header, bc, author) + vm := vm.NewEVM(context, statedb, config, cfg) + + _, _, _, err = ApplyMessage(vm, msg, gaspool) + return err +} diff --git a/core/state_processor.go b/core/state_processor.go index cc3a1a42f9d7..cfe17d587b46 100644 --- a/core/state_processor.go +++ b/core/state_processor.go @@ -17,14 +17,14 @@ package core import ( - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/consensus/misc" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/misc" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" ) // StateProcessor is a basic Processor, which takes care of transitioning @@ -68,7 +68,7 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg // Iterate over and process the individual transactions for i, tx := range block.Transactions() { statedb.Prepare(tx.Hash(), block.Hash(), i) - receipt, _, err := ApplyTransaction(p.config, p.bc, nil, gp, statedb, header, tx, usedGas, cfg) + receipt, err := ApplyTransaction(p.config, p.bc, nil, gp, statedb, header, tx, usedGas, cfg) if err != nil { return nil, nil, 0, err } @@ -76,7 +76,7 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg allLogs = append(allLogs, receipt.Logs...) } // Finalize the block, applying any consensus engine specific extras (e.g. block rewards) - p.engine.Finalize(p.bc, header, statedb, block.Transactions(), block.Uncles(), receipts) + p.engine.Finalize(p.bc, header, statedb, block.Transactions(), block.Uncles()) return receipts, allLogs, *usedGas, nil } @@ -85,10 +85,10 @@ func (p *StateProcessor) Process(block *types.Block, statedb *state.StateDB, cfg // and uses the input parameters for its environment. It returns the receipt // for the transaction, gas used and an error if the transaction failed, // indicating the block was invalid. -func ApplyTransaction(config *params.ChainConfig, bc ChainContext, author *common.Address, gp *GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, usedGas *uint64, cfg vm.Config) (*types.Receipt, uint64, error) { +func ApplyTransaction(config *params.ChainConfig, bc ChainContext, author *common.Address, gp *GasPool, statedb *state.StateDB, header *types.Header, tx *types.Transaction, usedGas *uint64, cfg vm.Config) (*types.Receipt, error) { msg, err := tx.AsMessage(types.MakeSigner(config, header.Number)) if err != nil { - return nil, 0, err + return nil, err } // Create a new context to be used in the EVM environment context := NewEVMContext(msg, header, bc, author) @@ -98,7 +98,7 @@ func ApplyTransaction(config *params.ChainConfig, bc ChainContext, author *commo // Apply the transaction to the current state (included in the env) _, gas, failed, err := ApplyMessage(vmenv, msg, gp) if err != nil { - return nil, 0, err + return nil, err } // Update the state with pending changes var root []byte @@ -121,6 +121,9 @@ func ApplyTransaction(config *params.ChainConfig, bc ChainContext, author *commo // Set the receipt logs and create a bloom for filtering receipt.Logs = statedb.GetLogs(tx.Hash()) receipt.Bloom = types.CreateBloom(types.Receipts{receipt}) + receipt.BlockHash = statedb.BlockHash() + receipt.BlockNumber = header.Number + receipt.TransactionIndex = uint(statedb.TxIndex()) - return receipt, gas, err + return receipt, err } diff --git a/core/state_transition.go b/core/state_transition.go index e6bb82ea5a2c..1d371f36d537 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -21,10 +21,10 @@ import ( "math" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" ) var ( @@ -76,10 +76,10 @@ type Message interface { } // IntrinsicGas computes the 'intrinsic gas' for a message with the given data. -func IntrinsicGas(data []byte, contractCreation, homestead bool) (uint64, error) { +func IntrinsicGas(data []byte, contractCreation, isHomestead bool, isEIP2028 bool) (uint64, error) { // Set the starting gas for the raw transaction var gas uint64 - if contractCreation && homestead { + if contractCreation && isHomestead { gas = params.TxGasContractCreation } else { gas = params.TxGas @@ -94,10 +94,14 @@ func IntrinsicGas(data []byte, contractCreation, homestead bool) (uint64, error) } } // Make sure we don't exceed uint64 for all data combinations - if (math.MaxUint64-gas)/params.TxDataNonZeroGas < nz { + nonZeroGas := params.TxDataNonZeroGasFrontier + if isEIP2028 { + nonZeroGas = params.TxDataNonZeroGasEIP2028 + } + if (math.MaxUint64-gas)/nonZeroGas < nz { return 0, vm.ErrOutOfGas } - gas += nz * params.TxDataNonZeroGas + gas += nz * nonZeroGas z := uint64(len(data)) - nz if (math.MaxUint64-gas)/params.TxDataZeroGas < z { @@ -187,10 +191,11 @@ func (st *StateTransition) TransitionDb() (ret []byte, usedGas uint64, failed bo msg := st.msg sender := vm.AccountRef(msg.From()) homestead := st.evm.ChainConfig().IsHomestead(st.evm.BlockNumber) + istanbul := st.evm.ChainConfig().IsIstanbul(st.evm.BlockNumber) contractCreation := msg.To() == nil // Pay intrinsic gas - gas, err := IntrinsicGas(st.data, contractCreation, homestead) + gas, err := IntrinsicGas(st.data, contractCreation, homestead, istanbul) if err != nil { return nil, 0, false, err } diff --git a/core/tx_cacher.go b/core/tx_cacher.go index 74bc05ba7d8f..b1e5d676a2b1 100644 --- a/core/tx_cacher.go +++ b/core/tx_cacher.go @@ -19,7 +19,7 @@ package core import ( "runtime" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/core/types" ) // senderCacher is a concurrent transaction sender recoverer and cacher. diff --git a/core/tx_journal.go b/core/tx_journal.go index 07d15d8e8cd5..41b5156d4ad2 100644 --- a/core/tx_journal.go +++ b/core/tx_journal.go @@ -21,10 +21,10 @@ import ( "io" "os" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" ) // errNoActiveJournal is returned if a transaction is attempted to be inserted diff --git a/core/tx_list.go b/core/tx_list.go index 5da02e28e9ee..75bfdaedac1a 100644 --- a/core/tx_list.go +++ b/core/tx_list.go @@ -22,9 +22,9 @@ import ( "math/big" "sort" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" ) // nonceHeap is a heap.Interface implementation over 64bit unsigned integers for @@ -418,9 +418,9 @@ func (l *txPricedList) Put(tx *types.Transaction) { // Removed notifies the prices transaction list that an old transaction dropped // from the pool. The list will just keep a counter of stale objects and update // the heap if a large enough ratio of transactions go stale. -func (l *txPricedList) Removed() { +func (l *txPricedList) Removed(count int) { // Bump the stale counter, but exit if still too low (< 25%) - l.stales++ + l.stales += count if l.stales <= len(*l.items)/4 { return } diff --git a/core/tx_list_test.go b/core/tx_list_test.go index 421453aa9648..d579f501afa8 100644 --- a/core/tx_list_test.go +++ b/core/tx_list_test.go @@ -20,8 +20,8 @@ import ( "math/rand" "testing" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" ) // Tests that transactions can be added to strict lists and list contents and diff --git a/core/tx_noncer.go b/core/tx_noncer.go new file mode 100644 index 000000000000..aa87c643aee2 --- /dev/null +++ b/core/tx_noncer.go @@ -0,0 +1,79 @@ +// Copyright 2019 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 ( + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/state" +) + +// txNoncer is a tiny virtual state database to manage the executable nonces of +// accounts in the pool, falling back to reading from a real state database if +// an account is unknown. +type txNoncer struct { + fallback *state.StateDB + nonces map[common.Address]uint64 + lock sync.Mutex +} + +// newTxNoncer creates a new virtual state database to track the pool nonces. +func newTxNoncer(statedb *state.StateDB) *txNoncer { + return &txNoncer{ + fallback: statedb.Copy(), + nonces: make(map[common.Address]uint64), + } +} + +// get returns the current nonce of an account, falling back to a real state +// database if the account is unknown. +func (txn *txNoncer) get(addr common.Address) uint64 { + // We use mutex for get operation is the underlying + // state will mutate db even for read access. + txn.lock.Lock() + defer txn.lock.Unlock() + + if _, ok := txn.nonces[addr]; !ok { + txn.nonces[addr] = txn.fallback.GetNonce(addr) + } + return txn.nonces[addr] +} + +// set inserts a new virtual nonce into the virtual state database to be returned +// whenever the pool requests it instead of reaching into the real state database. +func (txn *txNoncer) set(addr common.Address, nonce uint64) { + txn.lock.Lock() + defer txn.lock.Unlock() + + txn.nonces[addr] = nonce +} + +// setIfLower updates a new virtual nonce into the virtual state database if the +// the new one is lower. +func (txn *txNoncer) setIfLower(addr common.Address, nonce uint64) { + txn.lock.Lock() + defer txn.lock.Unlock() + + if _, ok := txn.nonces[addr]; !ok { + txn.nonces[addr] = txn.fallback.GetNonce(addr) + } + if txn.nonces[addr] <= nonce { + return + } + txn.nonces[addr] = nonce +} diff --git a/core/tx_pool.go b/core/tx_pool.go index 41c78f49b974..f7032dbd1e8a 100644 --- a/core/tx_pool.go +++ b/core/tx_pool.go @@ -25,14 +25,14 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/prque" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/prque" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/params" ) const ( @@ -85,20 +85,26 @@ var ( var ( // Metrics for the pending pool - pendingDiscardCounter = metrics.NewRegisteredCounter("txpool/pending/discard", nil) - pendingReplaceCounter = metrics.NewRegisteredCounter("txpool/pending/replace", nil) - pendingRateLimitCounter = metrics.NewRegisteredCounter("txpool/pending/ratelimit", nil) // Dropped due to rate limiting - pendingNofundsCounter = metrics.NewRegisteredCounter("txpool/pending/nofunds", nil) // Dropped due to out-of-funds + pendingDiscardMeter = metrics.NewRegisteredMeter("txpool/pending/discard", nil) + pendingReplaceMeter = metrics.NewRegisteredMeter("txpool/pending/replace", nil) + pendingRateLimitMeter = metrics.NewRegisteredMeter("txpool/pending/ratelimit", nil) // Dropped due to rate limiting + pendingNofundsMeter = metrics.NewRegisteredMeter("txpool/pending/nofunds", nil) // Dropped due to out-of-funds // Metrics for the queued pool - queuedDiscardCounter = metrics.NewRegisteredCounter("txpool/queued/discard", nil) - queuedReplaceCounter = metrics.NewRegisteredCounter("txpool/queued/replace", nil) - queuedRateLimitCounter = metrics.NewRegisteredCounter("txpool/queued/ratelimit", nil) // Dropped due to rate limiting - queuedNofundsCounter = metrics.NewRegisteredCounter("txpool/queued/nofunds", nil) // Dropped due to out-of-funds + queuedDiscardMeter = metrics.NewRegisteredMeter("txpool/queued/discard", nil) + queuedReplaceMeter = metrics.NewRegisteredMeter("txpool/queued/replace", nil) + queuedRateLimitMeter = metrics.NewRegisteredMeter("txpool/queued/ratelimit", nil) // Dropped due to rate limiting + queuedNofundsMeter = metrics.NewRegisteredMeter("txpool/queued/nofunds", nil) // Dropped due to out-of-funds // General tx metrics - invalidTxCounter = metrics.NewRegisteredCounter("txpool/invalid", nil) - underpricedTxCounter = metrics.NewRegisteredCounter("txpool/underpriced", nil) + knownTxMeter = metrics.NewRegisteredMeter("txpool/known", nil) + validTxMeter = metrics.NewRegisteredMeter("txpool/valid", nil) + invalidTxMeter = metrics.NewRegisteredMeter("txpool/invalid", nil) + underpricedTxMeter = metrics.NewRegisteredMeter("txpool/underpriced", nil) + + pendingGauge = metrics.NewRegisteredGauge("txpool/pending", nil) + queuedGauge = metrics.NewRegisteredGauge("txpool/queued", nil) + localGauge = metrics.NewRegisteredGauge("txpool/local", nil) ) // TxStatus is the current status of a transaction as seen by the pool. @@ -203,20 +209,20 @@ func (config *TxPoolConfig) sanitize() TxPoolConfig { // current state) and future transactions. Transactions move between those // two states over time as they are received and processed. type TxPool struct { - config TxPoolConfig - chainconfig *params.ChainConfig - chain blockChain - gasPrice *big.Int - 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 uint64 // Current gas limit for transaction caps + config TxPoolConfig + chainconfig *params.ChainConfig + chain blockChain + gasPrice *big.Int + txFeed event.Feed + scope event.SubscriptionScope + signer types.Signer + mu sync.RWMutex + + istanbul bool // Fork indicator whether we are in the istanbul stage. + + currentState *state.StateDB // Current state in the blockchain head + pendingNonces *txNoncer // Pending state tracking virtual nonces + currentMaxGas uint64 // Current gas limit for transaction caps locals *accountSet // Set of local transaction to exempt from eviction rules journal *txJournal // Journal of local transaction to back up to disk @@ -227,9 +233,18 @@ type TxPool struct { all *txLookup // All transactions to allow lookups priced *txPricedList // All transactions sorted by price - wg sync.WaitGroup // for shutdown sync + chainHeadCh chan ChainHeadEvent + chainHeadSub event.Subscription + reqResetCh chan *txpoolResetRequest + reqPromoteCh chan *accountSet + queueTxEventCh chan *types.Transaction + reorgDoneCh chan chan struct{} + reorgShutdownCh chan struct{} // requests shutdown of scheduleReorgLoop + wg sync.WaitGroup // tracks loop, scheduleReorgLoop +} - homestead bool +type txpoolResetRequest struct { + oldHead, newHead *types.Header } // NewTxPool creates a new transaction pool to gather, sort and filter inbound @@ -240,16 +255,21 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain block // Create the transaction pool with its initial settings pool := &TxPool{ - 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: newTxLookup(), - chainHeadCh: make(chan ChainHeadEvent, chainHeadChanSize), - gasPrice: new(big.Int).SetUint64(config.PriceLimit), + 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: newTxLookup(), + chainHeadCh: make(chan ChainHeadEvent, chainHeadChanSize), + reqResetCh: make(chan *txpoolResetRequest), + reqPromoteCh: make(chan *accountSet), + queueTxEventCh: make(chan *types.Transaction), + reorgDoneCh: make(chan chan struct{}), + reorgShutdownCh: make(chan struct{}), + gasPrice: new(big.Int).SetUint64(config.PriceLimit), } pool.locals = newAccountSet(pool.signer) for _, addr := range config.Locals { @@ -259,6 +279,10 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain block pool.priced = newTxPricedList(pool.all) pool.reset(nil, chain.CurrentBlock().Header()) + // Start the reorg loop early so it can handle requests generated during journal loading. + pool.wg.Add(1) + go pool.scheduleReorgLoop() + // If local transactions and journaling is enabled, load from disk if !config.NoLocals && config.Journal != "" { pool.journal = newTxJournal(config.Journal) @@ -270,10 +294,9 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain block 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 + // Subscribe events from blockchain and start the main event loop. + pool.chainHeadSub = pool.chain.SubscribeChainHeadEvent(pool.chainHeadCh) pool.wg.Add(1) go pool.loop() @@ -286,38 +309,31 @@ func NewTxPool(config TxPoolConfig, chainconfig *params.ChainConfig, chain block func (pool *TxPool) loop() { defer pool.wg.Done() - // Start the stats reporting and transaction eviction tickers - var prevPending, prevQueued, prevStales int - - report := time.NewTicker(statsReportInterval) + var ( + prevPending, prevQueued, prevStales int + // Start the stats reporting and transaction eviction tickers + report = time.NewTicker(statsReportInterval) + evict = time.NewTicker(evictionInterval) + journal = time.NewTicker(pool.config.Rejournal) + // Track the previous head headers for transaction reorgs + head = pool.chain.CurrentBlock() + ) defer report.Stop() - - 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 ChainHeadEvent case ev := <-pool.chainHeadCh: if ev.Block != nil { - pool.mu.Lock() - if pool.chainconfig.IsHomestead(ev.Block.Number()) { - pool.homestead = true - } - pool.reset(head.Header(), ev.Block.Header()) + pool.requestReset(head.Header(), ev.Block.Header()) head = ev.Block - - pool.mu.Unlock() } - // Be unsubscribed due to system stopped + + // System shutdown. case <-pool.chainHeadSub.Err(): + close(pool.reorgShutdownCh) return // Handle stats reporting ticks @@ -362,99 +378,6 @@ func (pool *TxPool) loop() { } } -// lockedReset is a wrapper around reset to allow calling it in a thread safe -// manner. This method is only ever used in the tester! -func (pool *TxPool) lockedReset(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.Debug("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 to reset txpool state", "err", err) - return - } - 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)) - senderCacher.recover(pool.signer, 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() - - // Update all accounts to the latest known pending nonce - for addr, list := range pool.pending { - txs := list.Flatten() // Heavy but will be cached and is needed by the miner anyway - pool.pendingState.SetNonce(addr, txs[len(txs)-1].Nonce()+1) - } - // Check the queue and move transactions over to the pending if possible - // or remove those that have become invalid - pool.promoteExecutables(nil) -} - // Stop terminates the transaction pool. func (pool *TxPool) Stop() { // Unsubscribe all subscriptions registered from txpool @@ -497,12 +420,13 @@ func (pool *TxPool) SetGasPrice(price *big.Int) { log.Info("Transaction pool price threshold updated", "price", price) } -// State returns the virtual managed state of the transaction pool. -func (pool *TxPool) State() *state.ManagedState { +// Nonce returns the next nonce of an account, with all transactions executable +// by the pool already applied on top. +func (pool *TxPool) Nonce(addr common.Address) uint64 { pool.mu.RLock() defer pool.mu.RUnlock() - return pool.pendingState + return pool.pendingNonces.get(addr) } // Stats retrieves the current pool stats, namely the number of pending and the @@ -618,7 +542,8 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error { if pool.currentState.GetBalance(from).Cmp(tx.Cost()) < 0 { return ErrInsufficientFunds } - intrGas, err := IntrinsicGas(tx.Data(), tx.To() == nil, pool.homestead) + // Ensure the transaction has more gas than the basic tx fee. + intrGas, err := IntrinsicGas(tx.Data(), tx.To() == nil, true, pool.istanbul) if err != nil { return err } @@ -628,25 +553,25 @@ func (pool *TxPool) validateTx(tx *types.Transaction, local bool) error { return nil } -// add validates a transaction and inserts it into the non-executable queue for -// later pending promotion and execution. If the transaction is a replacement for -// an already pending or queued one, it overwrites the previous and returns this -// so outer code doesn't uselessly call promote. +// add validates a transaction and inserts it into the non-executable queue for later +// pending promotion and execution. If the transaction is a replacement for an already +// pending or queued one, it overwrites the previous transaction if its price is higher. // // If a newly added transaction is marked as local, its sending account will be -// whitelisted, preventing any associated transaction from being dropped out of -// the pool due to pricing constraints. -func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { +// whitelisted, preventing any associated transaction from being dropped out of the pool +// due to pricing constraints. +func (pool *TxPool) add(tx *types.Transaction, local bool) (replaced bool, err error) { // If the transaction is already known, discard it hash := tx.Hash() if pool.all.Get(hash) != nil { log.Trace("Discarding already known transaction", "hash", hash) + knownTxMeter.Mark(1) return false, fmt.Errorf("known transaction: %x", hash) } // If the transaction fails basic validation, discard it if err := pool.validateTx(tx, local); err != nil { log.Trace("Discarding invalid transaction", "hash", hash, "err", err) - invalidTxCounter.Inc(1) + invalidTxMeter.Mark(1) return false, err } // If the transaction pool is full, discard underpriced transactions @@ -654,45 +579,41 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { // If the new transaction is underpriced, don't accept it if !local && pool.priced.Underpriced(tx, pool.locals) { log.Trace("Discarding underpriced transaction", "hash", hash, "price", tx.GasPrice()) - underpricedTxCounter.Inc(1) + underpricedTxMeter.Mark(1) return false, ErrUnderpriced } // New transaction is better than our worse ones, make room for it drop := pool.priced.Discard(pool.all.Count()-int(pool.config.GlobalSlots+pool.config.GlobalQueue-1), pool.locals) for _, tx := range drop { log.Trace("Discarding freshly underpriced transaction", "hash", tx.Hash(), "price", tx.GasPrice()) - underpricedTxCounter.Inc(1) + underpricedTxMeter.Mark(1) pool.removeTx(tx.Hash(), false) } } - // If the transaction is replacing an already pending one, do directly + // Try to replace an existing transaction in the pending pool from, _ := types.Sender(pool.signer, tx) // already validated if list := pool.pending[from]; list != nil && list.Overlaps(tx) { // Nonce already pending, check if required price bump is met inserted, old := list.Add(tx, pool.config.PriceBump) if !inserted { - pendingDiscardCounter.Inc(1) + pendingDiscardMeter.Mark(1) return false, ErrReplaceUnderpriced } // New transaction is better, replace old one if old != nil { pool.all.Remove(old.Hash()) - pool.priced.Removed() - pendingReplaceCounter.Inc(1) + pool.priced.Removed(1) + pendingReplaceMeter.Mark(1) } pool.all.Add(tx) pool.priced.Put(tx) pool.journalTx(from, tx) - + pool.queueTxEvent(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(NewTxsEvent{types.Transactions{tx}}) - return old != nil, nil } // New transaction isn't replacing a pending one, push into queue - replace, err := pool.enqueueTx(hash, tx) + replaced, err = pool.enqueueTx(hash, tx) if err != nil { return false, err } @@ -703,10 +624,13 @@ func (pool *TxPool) add(tx *types.Transaction, local bool) (bool, error) { pool.locals.add(from) } } + if local || pool.locals.contains(from) { + localGauge.Inc(1) + } pool.journalTx(from, tx) log.Trace("Pooled new future transaction", "hash", hash, "from", from, "to", tx.To()) - return replace, nil + return replaced, nil } // enqueueTx inserts a new transaction into the non-executable transaction queue. @@ -721,14 +645,17 @@ func (pool *TxPool) enqueueTx(hash common.Hash, tx *types.Transaction) (bool, er inserted, old := pool.queue[from].Add(tx, pool.config.PriceBump) if !inserted { // An older transaction was better, discard this - queuedDiscardCounter.Inc(1) + queuedDiscardMeter.Mark(1) return false, ErrReplaceUnderpriced } // Discard any previous transaction and mark this if old != nil { pool.all.Remove(old.Hash()) - pool.priced.Removed() - queuedReplaceCounter.Inc(1) + pool.priced.Removed(1) + queuedReplaceMeter.Mark(1) + } else { + // Nothing was replaced, bump the queued counter + queuedGauge.Inc(1) } if pool.all.Get(hash) == nil { pool.all.Add(tx) @@ -764,17 +691,20 @@ func (pool *TxPool) promoteTx(addr common.Address, hash common.Hash, tx *types.T if !inserted { // An older transaction was better, discard this pool.all.Remove(hash) - pool.priced.Removed() + pool.priced.Removed(1) - pendingDiscardCounter.Inc(1) + pendingDiscardMeter.Mark(1) return false } // Otherwise discard any previous transaction and mark this if old != nil { pool.all.Remove(old.Hash()) - pool.priced.Removed() + pool.priced.Removed(1) - pendingReplaceCounter.Inc(1) + pendingReplaceMeter.Mark(1) + } else { + // Nothing was replaced, bump the pending counter + pendingGauge.Inc(1) } // Failsafe to work around direct pending inserts (tests) if pool.all.Get(hash) == nil { @@ -783,112 +713,140 @@ 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) + pool.pendingNonces.set(addr, tx.Nonce()+1) return true } -// AddLocal enqueues a single transaction into the pool if it is valid, marking -// the sender as a local one in the mean time, ensuring it goes around the local -// pricing constraints. -func (pool *TxPool) AddLocal(tx *types.Transaction) error { - return pool.addTx(tx, !pool.config.NoLocals) +// AddLocals enqueues a batch of transactions into the pool if they are valid, marking the +// senders as a local ones, ensuring they go around the local pricing constraints. +// +// This method is used to add transactions from the RPC API and performs synchronous pool +// reorganization and event propagation. +func (pool *TxPool) AddLocals(txs []*types.Transaction) []error { + return pool.addTxs(txs, !pool.config.NoLocals, true) } -// AddRemote enqueues a single transaction into the pool if it is valid. If the -// sender is not among the locally tracked ones, full pricing constraints will -// apply. -func (pool *TxPool) AddRemote(tx *types.Transaction) error { - return pool.addTx(tx, false) +// AddLocal enqueues a single local transaction into the pool if it is valid. This is +// a convenience wrapper aroundd AddLocals. +func (pool *TxPool) AddLocal(tx *types.Transaction) error { + errs := pool.AddLocals([]*types.Transaction{tx}) + return errs[0] } -// 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 { - 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. +// +// This method is used to add transactions from the p2p network and does not wait for pool +// reorganization and internal event propagation. +func (pool *TxPool) AddRemotes(txs []*types.Transaction) []error { + return pool.addTxs(txs, false, false) } -// AddRemotes enqueues a batch of transactions into the pool if they are valid. -// If the senders are not among the locally tracked ones, full pricing constraints -// will apply. -func (pool *TxPool) AddRemotes(txs []*types.Transaction) []error { - return pool.addTxs(txs, false) +// This is like AddRemotes, but waits for pool reorganization. Tests use this method. +func (pool *TxPool) AddRemotesSync(txs []*types.Transaction) []error { + return pool.addTxs(txs, false, true) } -// addTx enqueues a single transaction into the pool if it is valid. -func (pool *TxPool) addTx(tx *types.Transaction, local bool) error { - pool.mu.Lock() - defer pool.mu.Unlock() +// This is like AddRemotes with a single transaction, but waits for pool reorganization. Tests use this method. +func (pool *TxPool) addRemoteSync(tx *types.Transaction) error { + errs := pool.AddRemotesSync([]*types.Transaction{tx}) + return errs[0] +} - // Try to inject the transaction and update any state - replace, err := pool.add(tx, local) - if err != nil { - return err - } - // If we added a new transaction, run promotion checks and return - if !replace { - from, _ := types.Sender(pool.signer, tx) // already validated - pool.promoteExecutables([]common.Address{from}) - } - return nil +// AddRemote enqueues a single transaction into the pool if it is valid. This is a convenience +// wrapper around AddRemotes. +// +// Deprecated: use AddRemotes +func (pool *TxPool) AddRemote(tx *types.Transaction) error { + errs := pool.AddRemotes([]*types.Transaction{tx}) + return errs[0] } // 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, sync bool) []error { + // Filter out known ones without obtaining the pool lock or recovering signatures + var ( + errs = make([]error, len(txs)) + news = make([]*types.Transaction, 0, len(txs)) + ) + for i, tx := range txs { + // If the transaction is known, pre-set the error slot + if pool.all.Get(tx.Hash()) != nil { + errs[i] = fmt.Errorf("known transaction: %x", tx.Hash()) + knownTxMeter.Mark(1) + continue + } + // Accumulate all unknown transactions for deeper processing + news = append(news, tx) + } + if len(news) == 0 { + return errs + } + // Cache senders in transactions before obtaining lock (pool.signer is immutable) + for _, tx := range news { + types.Sender(pool.signer, tx) + } + // Process all the new transaction and merge any errors into the original slice pool.mu.Lock() - defer pool.mu.Unlock() + newErrs, dirtyAddrs := pool.addTxsLocked(news, local) + pool.mu.Unlock() - return pool.addTxsLocked(txs, local) + var nilSlot = 0 + for _, err := range newErrs { + for errs[nilSlot] != nil { + nilSlot++ + } + errs[nilSlot] = err + } + // Reorg the pool internals if needed and return + done := pool.requestPromoteExecutables(dirtyAddrs) + if sync { + <-done + } + return errs } -// 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 transactions, tracking the accepted ones - dirty := make(map[common.Address]struct{}) +// addTxsLocked attempts to queue a batch of transactions if they are valid. +// The transaction pool lock must be held. +func (pool *TxPool) addTxsLocked(txs []*types.Transaction, local bool) ([]error, *accountSet) { + dirty := newAccountSet(pool.signer) errs := make([]error, len(txs)) - for i, tx := range txs { - var replace bool - if replace, errs[i] = pool.add(tx, local); errs[i] == nil && !replace { - from, _ := types.Sender(pool.signer, tx) // already validated - dirty[from] = struct{}{} - } - } - // Only reprocess the internal state if something was actually added - if len(dirty) > 0 { - addrs := make([]common.Address, 0, len(dirty)) - for addr := range dirty { - addrs = append(addrs, addr) + replaced, err := pool.add(tx, local) + errs[i] = err + if err == nil && !replaced { + dirty.addTx(tx) } - pool.promoteExecutables(addrs) } - return errs + validTxMeter.Mark(int64(len(dirty.accounts))) + return errs, dirty } // 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.Get(hash); tx != nil { - from, _ := types.Sender(pool.signer, tx) // already validated - if pool.pending[from] != nil && pool.pending[from].txs.items[tx.Nonce()] != nil { - status[i] = TxStatusPending - } else { - status[i] = TxStatusQueued - } + tx := pool.Get(hash) + if tx == nil { + continue } + from, _ := types.Sender(pool.signer, tx) // already validated + pool.mu.RLock() + if txList := pool.pending[from]; txList != nil && txList.txs.items[tx.Nonce()] != nil { + status[i] = TxStatusPending + } else if txList := pool.queue[from]; txList != nil && txList.txs.items[tx.Nonce()] != nil { + status[i] = TxStatusQueued + } + // implicit else: the tx may have been included into a block between + // checking pool.Get and obtaining the lock. In that case, TxStatusUnknown is correct + pool.mu.RUnlock() } return status } -// Get returns a transaction if it is contained in the pool -// and nil otherwise. +// Get returns a transaction if it is contained in the pool and nil otherwise. func (pool *TxPool) Get(hash common.Hash) *types.Transaction { return pool.all.Get(hash) } @@ -906,7 +864,10 @@ func (pool *TxPool) removeTx(hash common.Hash, outofbound bool) { // Remove it from the list of known transactions pool.all.Remove(hash) if outofbound { - pool.priced.Removed() + pool.priced.Removed(1) + } + if pool.locals.contains(addr) { + localGauge.Dec(1) } // Remove the transaction from the pending lists and reset the account nonce if pending := pool.pending[addr]; pending != nil { @@ -921,35 +882,283 @@ func (pool *TxPool) removeTx(hash common.Hash, outofbound bool) { pool.enqueueTx(tx.Hash(), tx) } // Update the account nonce if needed - if nonce := tx.Nonce(); pool.pendingState.GetNonce(addr) > nonce { - pool.pendingState.SetNonce(addr, nonce) - } + pool.pendingNonces.setIfLower(addr, tx.Nonce()) + // Reduce the pending counter + pendingGauge.Dec(int64(1 + len(invalids))) return } } // Transaction is in the future queue if future := pool.queue[addr]; future != nil { - future.Remove(tx) + if removed, _ := future.Remove(tx); removed { + // Reduce the queued counter + queuedGauge.Dec(1) + } if future.Empty() { delete(pool.queue, addr) } } } +// requestPromoteExecutables requests a pool reset to the new head block. +// The returned channel is closed when the reset has occurred. +func (pool *TxPool) requestReset(oldHead *types.Header, newHead *types.Header) chan struct{} { + select { + case pool.reqResetCh <- &txpoolResetRequest{oldHead, newHead}: + return <-pool.reorgDoneCh + case <-pool.reorgShutdownCh: + return pool.reorgShutdownCh + } +} + +// requestPromoteExecutables requests transaction promotion checks for the given addresses. +// The returned channel is closed when the promotion checks have occurred. +func (pool *TxPool) requestPromoteExecutables(set *accountSet) chan struct{} { + select { + case pool.reqPromoteCh <- set: + return <-pool.reorgDoneCh + case <-pool.reorgShutdownCh: + return pool.reorgShutdownCh + } +} + +// queueTxEvent enqueues a transaction event to be sent in the next reorg run. +func (pool *TxPool) queueTxEvent(tx *types.Transaction) { + select { + case pool.queueTxEventCh <- tx: + case <-pool.reorgShutdownCh: + } +} + +// scheduleReorgLoop schedules runs of reset and promoteExecutables. Code above should not +// call those methods directly, but request them being run using requestReset and +// requestPromoteExecutables instead. +func (pool *TxPool) scheduleReorgLoop() { + defer pool.wg.Done() + + var ( + curDone chan struct{} // non-nil while runReorg is active + nextDone = make(chan struct{}) + launchNextRun bool + reset *txpoolResetRequest + dirtyAccounts *accountSet + queuedEvents = make(map[common.Address]*txSortedMap) + ) + for { + // Launch next background reorg if needed + if curDone == nil && launchNextRun { + // Run the background reorg and announcements + go pool.runReorg(nextDone, reset, dirtyAccounts, queuedEvents) + + // Prepare everything for the next round of reorg + curDone, nextDone = nextDone, make(chan struct{}) + launchNextRun = false + + reset, dirtyAccounts = nil, nil + queuedEvents = make(map[common.Address]*txSortedMap) + } + + select { + case req := <-pool.reqResetCh: + // Reset request: update head if request is already pending. + if reset == nil { + reset = req + } else { + reset.newHead = req.newHead + } + launchNextRun = true + pool.reorgDoneCh <- nextDone + + case req := <-pool.reqPromoteCh: + // Promote request: update address set if request is already pending. + if dirtyAccounts == nil { + dirtyAccounts = req + } else { + dirtyAccounts.merge(req) + } + launchNextRun = true + pool.reorgDoneCh <- nextDone + + case tx := <-pool.queueTxEventCh: + // Queue up the event, but don't schedule a reorg. It's up to the caller to + // request one later if they want the events sent. + addr, _ := types.Sender(pool.signer, tx) + if _, ok := queuedEvents[addr]; !ok { + queuedEvents[addr] = newTxSortedMap() + } + queuedEvents[addr].Put(tx) + + case <-curDone: + curDone = nil + + case <-pool.reorgShutdownCh: + // Wait for current run to finish. + if curDone != nil { + <-curDone + } + close(nextDone) + return + } + } +} + +// runReorg runs reset and promoteExecutables on behalf of scheduleReorgLoop. +func (pool *TxPool) runReorg(done chan struct{}, reset *txpoolResetRequest, dirtyAccounts *accountSet, events map[common.Address]*txSortedMap) { + defer close(done) + + var promoteAddrs []common.Address + if dirtyAccounts != nil { + promoteAddrs = dirtyAccounts.flatten() + } + pool.mu.Lock() + if reset != nil { + // Reset from the old head to the new, rescheduling any reorged transactions + pool.reset(reset.oldHead, reset.newHead) + + // Nonces were reset, discard any events that became stale + for addr := range events { + events[addr].Forward(pool.pendingNonces.get(addr)) + if events[addr].Len() == 0 { + delete(events, addr) + } + } + // Reset needs promote for all addresses + promoteAddrs = promoteAddrs[:0] + for addr := range pool.queue { + promoteAddrs = append(promoteAddrs, addr) + } + } + // Check for pending transactions for every account that sent new ones + promoted := pool.promoteExecutables(promoteAddrs) + for _, tx := range promoted { + addr, _ := types.Sender(pool.signer, tx) + if _, ok := events[addr]; !ok { + events[addr] = newTxSortedMap() + } + events[addr].Put(tx) + } + // If a new block appeared, validate the pool of pending transactions. This will + // remove any transaction that has been included in the block or was invalidated + // because of another transaction (e.g. higher gas price). + if reset != nil { + pool.demoteUnexecutables() + } + // Ensure pool.queue and pool.pending sizes stay within the configured limits. + pool.truncatePending() + pool.truncateQueue() + + // Update all accounts to the latest known pending nonce + for addr, list := range pool.pending { + txs := list.Flatten() // Heavy but will be cached and is needed by the miner anyway + pool.pendingNonces.set(addr, txs[len(txs)-1].Nonce()+1) + } + pool.mu.Unlock() + + // Notify subsystems for newly added transactions + if len(events) > 0 { + var txs []*types.Transaction + for _, set := range events { + txs = append(txs, set.Flatten()...) + } + pool.txFeed.Send(NewTxsEvent{txs}) + } +} + +// 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.Debug("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()) + ) + if rem == nil { + // This can happen if a setHead is performed, where we simply discard the old + // head from the chain. + // If that is the case, we don't have the lost transactions any more, and + // there's nothing to add + if newNum < oldNum { + // If the reorg ended up on a lower number, it's indicative of setHead being the cause + log.Debug("Skipping transaction reset caused by setHead", + "old", oldHead.Hash(), "oldnum", oldNum, "new", newHead.Hash(), "newnum", newNum) + } else { + // If we reorged to a same or higher number, then it's not a case of setHead + log.Warn("Transaction pool reset with missing oldhead", + "old", oldHead.Hash(), "oldnum", oldNum, "new", newHead.Hash(), "newnum", newNum) + } + return + } + 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 to reset txpool state", "err", err) + return + } + pool.currentState = statedb + pool.pendingNonces = newTxNoncer(statedb) + pool.currentMaxGas = newHead.GasLimit + + // Inject any transactions discarded due to reorgs + log.Debug("Reinjecting stale transactions", "count", len(reinject)) + senderCacher.recover(pool.signer, reinject) + pool.addTxsLocked(reinject, false) + + // Update all fork indicator by next pending block number. + next := new(big.Int).Add(newHead.Number, big.NewInt(1)) + pool.istanbul = pool.chainconfig.IsIstanbul(next) +} + // 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(accounts []common.Address) { +func (pool *TxPool) promoteExecutables(accounts []common.Address) []*types.Transaction { // Track the promoted transactions to broadcast them at once var promoted []*types.Transaction - // Gather all the accounts potentially needing updates - if accounts == nil { - accounts = make([]common.Address, 0, len(pool.queue)) - for addr := range pool.queue { - accounts = append(accounts, addr) - } - } // Iterate over all accounts and promote any executable transactions for _, addr := range accounts { list := pool.queue[addr] @@ -957,157 +1166,185 @@ func (pool *TxPool) promoteExecutables(accounts []common.Address) { 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(pool.currentState.GetNonce(addr)) { + forwards := list.Forward(pool.currentState.GetNonce(addr)) + for _, tx := range forwards { hash := tx.Hash() - log.Trace("Removed old queued transaction", "hash", hash) pool.all.Remove(hash) - pool.priced.Removed() + log.Trace("Removed old queued transaction", "hash", hash) } // Drop all transactions that are too costly (low balance or out of gas) drops, _ := list.Filter(pool.currentState.GetBalance(addr), pool.currentMaxGas) for _, tx := range drops { hash := tx.Hash() - log.Trace("Removed unpayable queued transaction", "hash", hash) pool.all.Remove(hash) - pool.priced.Removed() - queuedNofundsCounter.Inc(1) + log.Trace("Removed unpayable queued transaction", "hash", hash) } + queuedNofundsMeter.Mark(int64(len(drops))) + // Gather all executable transactions and promote them - for _, tx := range list.Ready(pool.pendingState.GetNonce(addr)) { + readies := list.Ready(pool.pendingNonces.get(addr)) + for _, tx := range readies { hash := tx.Hash() if pool.promoteTx(addr, hash, tx) { log.Trace("Promoting queued transaction", "hash", hash) promoted = append(promoted, tx) } } + queuedGauge.Dec(int64(len(readies))) + // Drop all transactions over the allowed limit + var caps types.Transactions if !pool.locals.contains(addr) { - for _, tx := range list.Cap(int(pool.config.AccountQueue)) { + caps = list.Cap(int(pool.config.AccountQueue)) + for _, tx := range caps { hash := tx.Hash() pool.all.Remove(hash) - pool.priced.Removed() - queuedRateLimitCounter.Inc(1) log.Trace("Removed cap-exceeding queued transaction", "hash", hash) } + queuedRateLimitMeter.Mark(int64(len(caps))) + } + // Mark all the items dropped as removed + pool.priced.Removed(len(forwards) + len(drops) + len(caps)) + queuedGauge.Dec(int64(len(forwards) + len(drops) + len(caps))) + if pool.locals.contains(addr) { + localGauge.Dec(int64(len(forwards) + len(drops) + len(caps))) } // Delete the entire queue entry if it became empty. if list.Empty() { delete(pool.queue, addr) } } - // Notify subsystem for new promoted transactions. - if len(promoted) > 0 { - go pool.txFeed.Send(NewTxsEvent{promoted}) - } - // If the pending limit is overflown, start equalizing allowances + return promoted +} + +// truncatePending removes transactions from the pending queue if the pool is above the +// pending limit. The algorithm tries to reduce transaction counts by an approximately +// equal number for all for accounts with many pending transactions. +func (pool *TxPool) truncatePending() { pending := uint64(0) for _, list := range pool.pending { pending += uint64(list.Len()) } - if pending > pool.config.GlobalSlots { - pendingBeforeCap := pending - // Assemble a spam order to penalize large transactors first - spammers := prque.New(nil) - for addr, list := range pool.pending { - // Only evict transactions from high rollers - if !pool.locals.contains(addr) && uint64(list.Len()) > pool.config.AccountSlots { - spammers.Push(addr, int64(list.Len())) - } - } - // Gradually drop transactions from offenders - offenders := []common.Address{} - for pending > pool.config.GlobalSlots && !spammers.Empty() { - // Retrieve the next offender if not local address - offender, _ := spammers.Pop() - offenders = append(offenders, offender.(common.Address)) - - // Equalize balances until all the same or below threshold - if len(offenders) > 1 { - // Calculate the equalization threshold for all current offenders - threshold := pool.pending[offender.(common.Address)].Len() - - // Iteratively reduce all offenders until below limit or threshold reached - for pending > pool.config.GlobalSlots && pool.pending[offenders[len(offenders)-2]].Len() > threshold { - for i := 0; i < len(offenders)-1; i++ { - list := pool.pending[offenders[i]] - for _, tx := range list.Cap(list.Len() - 1) { - // Drop the transaction from the global pools too - hash := tx.Hash() - pool.all.Remove(hash) - pool.priced.Removed() - - // Update the account nonce to the dropped transaction - if nonce := tx.Nonce(); pool.pendingState.GetNonce(offenders[i]) > nonce { - pool.pendingState.SetNonce(offenders[i], nonce) - } - log.Trace("Removed fairness-exceeding pending transaction", "hash", hash) - } - pending-- - } - } - } + if pending <= pool.config.GlobalSlots { + return + } + + pendingBeforeCap := pending + // Assemble a spam order to penalize large transactors first + spammers := prque.New(nil) + for addr, list := range pool.pending { + // Only evict transactions from high rollers + if !pool.locals.contains(addr) && uint64(list.Len()) > pool.config.AccountSlots { + spammers.Push(addr, int64(list.Len())) } - // If still above threshold, reduce to limit or min allowance - if pending > pool.config.GlobalSlots && len(offenders) > 0 { - for pending > pool.config.GlobalSlots && uint64(pool.pending[offenders[len(offenders)-1]].Len()) > pool.config.AccountSlots { - for _, addr := range offenders { - list := pool.pending[addr] - for _, tx := range list.Cap(list.Len() - 1) { + } + // Gradually drop transactions from offenders + offenders := []common.Address{} + for pending > pool.config.GlobalSlots && !spammers.Empty() { + // Retrieve the next offender if not local address + offender, _ := spammers.Pop() + offenders = append(offenders, offender.(common.Address)) + + // Equalize balances until all the same or below threshold + if len(offenders) > 1 { + // Calculate the equalization threshold for all current offenders + threshold := pool.pending[offender.(common.Address)].Len() + + // Iteratively reduce all offenders until below limit or threshold reached + for pending > pool.config.GlobalSlots && pool.pending[offenders[len(offenders)-2]].Len() > threshold { + for i := 0; i < len(offenders)-1; i++ { + list := pool.pending[offenders[i]] + + caps := list.Cap(list.Len() - 1) + for _, tx := range caps { // Drop the transaction from the global pools too hash := tx.Hash() pool.all.Remove(hash) - pool.priced.Removed() // Update the account nonce to the dropped transaction - if nonce := tx.Nonce(); pool.pendingState.GetNonce(addr) > nonce { - pool.pendingState.SetNonce(addr, nonce) - } + pool.pendingNonces.setIfLower(offenders[i], tx.Nonce()) log.Trace("Removed fairness-exceeding pending transaction", "hash", hash) } + pool.priced.Removed(len(caps)) + pendingGauge.Dec(int64(len(caps))) + if pool.locals.contains(offenders[i]) { + localGauge.Dec(int64(len(caps))) + } pending-- } } } - pendingRateLimitCounter.Inc(int64(pendingBeforeCap - pending)) } - // If we've queued more transactions than the hard limit, drop oldest ones + + // If still above threshold, reduce to limit or min allowance + if pending > pool.config.GlobalSlots && len(offenders) > 0 { + for pending > pool.config.GlobalSlots && uint64(pool.pending[offenders[len(offenders)-1]].Len()) > pool.config.AccountSlots { + for _, addr := range offenders { + list := pool.pending[addr] + + caps := list.Cap(list.Len() - 1) + for _, tx := range caps { + // Drop the transaction from the global pools too + hash := tx.Hash() + pool.all.Remove(hash) + + // Update the account nonce to the dropped transaction + pool.pendingNonces.setIfLower(addr, tx.Nonce()) + log.Trace("Removed fairness-exceeding pending transaction", "hash", hash) + } + pool.priced.Removed(len(caps)) + pendingGauge.Dec(int64(len(caps))) + if pool.locals.contains(addr) { + localGauge.Dec(int64(len(caps))) + } + pending-- + } + } + } + pendingRateLimitMeter.Mark(int64(pendingBeforeCap - pending)) +} + +// truncateQueue drops the oldes transactions in the queue if the pool is above the global queue limit. +func (pool *TxPool) truncateQueue() { queued := uint64(0) for _, list := range pool.queue { queued += uint64(list.Len()) } - if queued > pool.config.GlobalQueue { - // Sort all accounts with queued transactions by heartbeat - addresses := make(addressesByHeartbeat, 0, len(pool.queue)) - for addr := range pool.queue { - if !pool.locals.contains(addr) { // don't drop locals - addresses = append(addresses, addressByHeartbeat{addr, pool.beats[addr]}) - } + if queued <= pool.config.GlobalQueue { + return + } + + // Sort all accounts with queued transactions by heartbeat + addresses := make(addressesByHeartbeat, 0, len(pool.queue)) + for addr := range pool.queue { + if !pool.locals.contains(addr) { // don't drop locals + addresses = append(addresses, addressByHeartbeat{addr, pool.beats[addr]}) } - sort.Sort(addresses) + } + sort.Sort(addresses) - // Drop transactions until the total is below the limit or only locals remain - for drop := queued - pool.config.GlobalQueue; drop > 0 && len(addresses) > 0; { - addr := addresses[len(addresses)-1] - list := pool.queue[addr.address] + // Drop transactions until the total is below the limit or only locals remain + for drop := queued - pool.config.GlobalQueue; drop > 0 && len(addresses) > 0; { + addr := addresses[len(addresses)-1] + list := pool.queue[addr.address] - addresses = addresses[:len(addresses)-1] + addresses = addresses[:len(addresses)-1] - // Drop all transactions if they are less than the overflow - if size := uint64(list.Len()); size <= drop { - for _, tx := range list.Flatten() { - pool.removeTx(tx.Hash(), true) - } - drop -= size - queuedRateLimitCounter.Inc(int64(size)) - continue - } - // Otherwise drop only last few transactions - txs := list.Flatten() - for i := len(txs) - 1; i >= 0 && drop > 0; i-- { - pool.removeTx(txs[i].Hash(), true) - drop-- - queuedRateLimitCounter.Inc(1) + // Drop all transactions if they are less than the overflow + if size := uint64(list.Len()); size <= drop { + for _, tx := range list.Flatten() { + pool.removeTx(tx.Hash(), true) } + drop -= size + queuedRateLimitMeter.Mark(int64(size)) + continue + } + // Otherwise drop only last few transactions + txs := list.Flatten() + for i := len(txs) - 1; i >= 0 && drop > 0; i-- { + pool.removeTx(txs[i].Hash(), true) + drop-- + queuedRateLimitMeter.Mark(1) } } } @@ -1121,11 +1358,11 @@ func (pool *TxPool) demoteUnexecutables() { nonce := pool.currentState.GetNonce(addr) // Drop all transactions that are deemed too old (low nonce) - for _, tx := range list.Forward(nonce) { + olds := list.Forward(nonce) + for _, tx := range olds { hash := tx.Hash() - log.Trace("Removed old pending transaction", "hash", hash) pool.all.Remove(hash) - pool.priced.Removed() + log.Trace("Removed old pending transaction", "hash", hash) } // Drop all transactions that are too costly (low balance or out of gas), and queue any invalids back for later drops, invalids := list.Filter(pool.currentState.GetBalance(addr), pool.currentMaxGas) @@ -1133,21 +1370,28 @@ func (pool *TxPool) demoteUnexecutables() { hash := tx.Hash() log.Trace("Removed unpayable pending transaction", "hash", hash) pool.all.Remove(hash) - pool.priced.Removed() - pendingNofundsCounter.Inc(1) } + pool.priced.Removed(len(olds) + len(drops)) + pendingNofundsMeter.Mark(int64(len(drops))) + for _, tx := range invalids { hash := tx.Hash() log.Trace("Demoting pending transaction", "hash", hash) pool.enqueueTx(hash, tx) } + pendingGauge.Dec(int64(len(olds) + len(drops) + len(invalids))) + if pool.locals.contains(addr) { + localGauge.Dec(int64(len(olds) + len(drops) + len(invalids))) + } // If there's a gap in front, alert (should never happen) and postpone all transactions if list.Len() > 0 && list.txs.Get(nonce) == nil { - for _, tx := range list.Cap(0) { + gapped := list.Cap(0) + for _, tx := range gapped { hash := tx.Hash() log.Error("Demoting invalidated transaction", "hash", hash) pool.enqueueTx(hash, tx) } + pendingGauge.Dec(int64(len(gapped))) } // Delete the entire queue entry if it became empty. if list.Empty() { @@ -1179,11 +1423,15 @@ type accountSet struct { // newAccountSet creates a new address set with an associated signer for sender // derivations. -func newAccountSet(signer types.Signer) *accountSet { - return &accountSet{ +func newAccountSet(signer types.Signer, addrs ...common.Address) *accountSet { + as := &accountSet{ accounts: make(map[common.Address]struct{}), signer: signer, } + for _, addr := range addrs { + as.add(addr) + } + return as } // contains checks if a given address is contained within the set. @@ -1207,6 +1455,13 @@ func (as *accountSet) add(addr common.Address) { as.cache = nil } +// addTx adds the sender of tx into the set. +func (as *accountSet) addTx(tx *types.Transaction) { + if addr, err := types.Sender(as.signer, tx); err == nil { + as.add(addr) + } +} + // flatten returns the list of addresses within this set, also caching it for later // reuse. The returned slice should not be changed! func (as *accountSet) flatten() []common.Address { @@ -1220,6 +1475,14 @@ func (as *accountSet) flatten() []common.Address { return *as.cache } +// merge adds all addresses from the 'other' set into 'as'. +func (as *accountSet) merge(other *accountSet) { + for addr := range other.accounts { + as.accounts[addr] = struct{}{} + } + as.cache = nil +} + // txLookup is used internally by TxPool to track transactions while allowing lookup without // mutex contention. // diff --git a/core/tx_pool_test.go b/core/tx_pool_test.go index 052b6fff92f2..0f1e7ac8f8fd 100644 --- a/core/tx_pool_test.go +++ b/core/tx_pool_test.go @@ -26,13 +26,13 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/params" ) // testTxPoolConfig is a transaction pool configuration without stateful disk @@ -78,7 +78,7 @@ func pricedTransaction(nonce uint64, gaslimit uint64, gasprice *big.Int, key *ec } func setupTxPool() (*TxPool, *ecdsa.PrivateKey) { - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} key, _ := crypto.GenerateKey() @@ -109,7 +109,7 @@ func validateTxPoolInternals(pool *TxPool) error { last = nonce } } - if nonce := pool.pendingState.GetNonce(addr); nonce != last+1 { + if nonce := pool.Nonce(addr); nonce != last+1 { return fmt.Errorf("pending nonce mismatch: have %v, want %v", nonce, last+1) } } @@ -126,7 +126,7 @@ func validateEvents(events chan NewTxsEvent, count int) error { case ev := <-events: received = append(received, ev.Txs...) case <-time.After(time.Second): - return fmt.Errorf("event #%d not fired", received) + return fmt.Errorf("event #%d not fired", len(received)) } } if len(received) > count { @@ -163,7 +163,7 @@ func (c *testChain) State() (*state.StateDB, error) { // a state change between those fetches. stdb := c.statedb if *c.trigger { - c.statedb, _ = state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + c.statedb, _ = state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) // 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)) @@ -181,7 +181,7 @@ func TestStateChangeDuringTransactionPoolReset(t *testing.T) { var ( key, _ = crypto.GenerateKey() address = crypto.PubkeyToAddress(key.PublicKey) - statedb, _ = state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ = state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) trigger = false ) @@ -195,28 +195,27 @@ func TestStateChangeDuringTransactionPoolReset(t *testing.T) { pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) defer pool.Stop() - nonce := pool.State().GetNonce(address) + nonce := pool.Nonce(address) if nonce != 0 { t.Fatalf("Invalid nonce, want 0, got %d", nonce) } - pool.AddRemotes(types.Transactions{tx0, tx1}) + pool.AddRemotesSync([]*types.Transaction{tx0, tx1}) - nonce = pool.State().GetNonce(address) + nonce = pool.Nonce(address) if nonce != 2 { t.Fatalf("Invalid nonce, want 2, got %d", nonce) } // trigger state change in the background trigger = true - - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) _, err := pool.Pending() if err != nil { t.Fatalf("Could not fetch pending transactions: %v", err) } - nonce = pool.State().GetNonce(address) + nonce = pool.Nonce(address) if nonce != 2 { t.Fatalf("Invalid nonce, want 2, got %d", nonce) } @@ -268,10 +267,10 @@ func TestTransactionQueue(t *testing.T) { tx := transaction(0, 100, key) from, _ := deriveSender(tx) pool.currentState.AddBalance(from, big.NewInt(1000)) - pool.lockedReset(nil, nil) - pool.enqueueTx(tx.Hash(), tx) + <-pool.requestReset(nil, nil) - pool.promoteExecutables([]common.Address{from}) + pool.enqueueTx(tx.Hash(), tx) + <-pool.requestPromoteExecutables(newAccountSet(pool.signer, from)) if len(pool.pending) != 1 { t.Error("expected valid txs to be 1 is", len(pool.pending)) } @@ -280,33 +279,36 @@ func TestTransactionQueue(t *testing.T) { from, _ = deriveSender(tx) pool.currentState.SetNonce(from, 2) pool.enqueueTx(tx.Hash(), tx) - pool.promoteExecutables([]common.Address{from}) + + <-pool.requestPromoteExecutables(newAccountSet(pool.signer, from)) if _, ok := pool.pending[from].txs.items[tx.Nonce()]; ok { t.Error("expected transaction to be in tx pool") } - if len(pool.queue) > 0 { t.Error("expected transaction queue to be empty. is", len(pool.queue)) } +} + +func TestTransactionQueue2(t *testing.T) { + t.Parallel() - pool, key = setupTxPool() + pool, key := setupTxPool() defer pool.Stop() tx1 := transaction(0, 100, key) tx2 := transaction(10, 100, key) tx3 := transaction(11, 100, key) - from, _ = deriveSender(tx1) + from, _ := deriveSender(tx1) pool.currentState.AddBalance(from, big.NewInt(1000)) - pool.lockedReset(nil, nil) + pool.reset(nil, nil) pool.enqueueTx(tx1.Hash(), tx1) pool.enqueueTx(tx2.Hash(), tx2) pool.enqueueTx(tx3.Hash(), tx3) pool.promoteExecutables([]common.Address{from}) - if len(pool.pending) != 1 { - t.Error("expected tx pool to be 1, got", len(pool.pending)) + t.Error("expected pending length to be 1, got", len(pool.pending)) } if pool.queue[from].Len() != 2 { t.Error("expected len(queue) == 2, got", pool.queue[from].Len()) @@ -335,11 +337,11 @@ func TestTransactionChainFork(t *testing.T) { addr := crypto.PubkeyToAddress(key.PublicKey) resetState := func() { - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) statedb.AddBalance(addr, big.NewInt(100000000000000)) pool.chain = &testBlockChain{statedb, 1000000, new(event.Feed)} - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) } resetState() @@ -364,11 +366,11 @@ func TestTransactionDoubleNonce(t *testing.T) { addr := crypto.PubkeyToAddress(key.PublicKey) resetState := func() { - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) statedb.AddBalance(addr, big.NewInt(100000000000000)) pool.chain = &testBlockChain{statedb, 1000000, new(event.Feed)} - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) } resetState() @@ -384,16 +386,17 @@ 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) } - pool.promoteExecutables([]common.Address{addr}) + <-pool.requestPromoteExecutables(newAccountSet(signer, addr)) if pool.pending[addr].Len() != 1 { t.Error("expected 1 pending transactions, got", pool.pending[addr].Len()) } if tx := pool.pending[addr].txs.items[0]; tx.Hash() != tx2.Hash() { t.Errorf("transaction mismatch: have %x, want %x", tx.Hash(), tx2.Hash()) } + // Add the third transaction and ensure it's not saved (smaller price) pool.add(tx3, false) - pool.promoteExecutables([]common.Address{addr}) + <-pool.requestPromoteExecutables(newAccountSet(signer, addr)) if pool.pending[addr].Len() != 1 { t.Error("expected 1 pending transactions, got", pool.pending[addr].Len()) } @@ -439,7 +442,7 @@ func TestTransactionNonceRecovery(t *testing.T) { addr := crypto.PubkeyToAddress(key.PublicKey) pool.currentState.SetNonce(addr, n) pool.currentState.AddBalance(addr, big.NewInt(100000000000000)) - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) tx := transaction(n, 100000, key) if err := pool.AddRemote(tx); err != nil { @@ -447,8 +450,8 @@ func TestTransactionNonceRecovery(t *testing.T) { } // simulate some weird re-order of transactions and missing nonce(s) pool.currentState.SetNonce(addr, n-1) - pool.lockedReset(nil, nil) - if fn := pool.pendingState.GetNonce(addr); fn != n-1 { + <-pool.requestReset(nil, nil) + if fn := pool.Nonce(addr); fn != n-1 { t.Errorf("expected nonce to be %d, got %d", n-1, fn) } } @@ -491,7 +494,7 @@ func TestTransactionDropping(t *testing.T) { if pool.all.Count() != 6 { t.Errorf("total transaction mismatch: have %d, want %d", pool.all.Count(), 6) } - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) if pool.pending[account].Len() != 3 { t.Errorf("pending transaction mismatch: have %d, want %d", pool.pending[account].Len(), 3) } @@ -503,7 +506,7 @@ func TestTransactionDropping(t *testing.T) { } // Reduce the balance of the account, and check that invalidated transactions are dropped pool.currentState.AddBalance(account, big.NewInt(-650)) - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) if _, ok := pool.pending[account].txs.items[tx0.Nonce()]; !ok { t.Errorf("funded pending transaction missing: %v", tx0) @@ -528,7 +531,7 @@ func TestTransactionDropping(t *testing.T) { } // Reduce the block gas limit, check that invalidated transactions are dropped pool.chain.(*testBlockChain).gasLimit = 100 - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) if _, ok := pool.pending[account].txs.items[tx0.Nonce()]; !ok { t.Errorf("funded pending transaction missing: %v", tx0) @@ -554,7 +557,7 @@ func TestTransactionPostponing(t *testing.T) { t.Parallel() // Create the pool to test the postponing with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) @@ -584,7 +587,7 @@ func TestTransactionPostponing(t *testing.T) { txs = append(txs, tx) } } - for i, err := range pool.AddRemotes(txs) { + for i, err := range pool.AddRemotesSync(txs) { if err != nil { t.Fatalf("tx %d: failed to add transactions: %v", i, err) } @@ -599,7 +602,7 @@ func TestTransactionPostponing(t *testing.T) { if pool.all.Count() != len(txs) { t.Errorf("total transaction mismatch: have %d, want %d", pool.all.Count(), len(txs)) } - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) if pending := pool.pending[accs[0]].Len() + pool.pending[accs[1]].Len(); pending != len(txs) { t.Errorf("pending transaction mismatch: have %d, want %d", pending, len(txs)) } @@ -613,7 +616,7 @@ func TestTransactionPostponing(t *testing.T) { for _, addr := range accs { pool.currentState.AddBalance(addr, big.NewInt(-1)) } - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) // The first account's first transaction remains valid, check that subsequent // ones are either filtered out, or queued up for later. @@ -680,12 +683,10 @@ func TestTransactionGapFilling(t *testing.T) { defer sub.Unsubscribe() // Create a pending and a queued transaction with a nonce-gap in between - if err := pool.AddRemote(transaction(0, 100000, key)); err != nil { - t.Fatalf("failed to add pending transaction: %v", err) - } - if err := pool.AddRemote(transaction(2, 100000, key)); err != nil { - t.Fatalf("failed to add queued transaction: %v", err) - } + pool.AddRemotesSync([]*types.Transaction{ + transaction(0, 100000, key), + transaction(2, 100000, key), + }) pending, queued := pool.Stats() if pending != 1 { t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 1) @@ -700,7 +701,7 @@ func TestTransactionGapFilling(t *testing.T) { t.Fatalf("pool internal state corrupted: %v", err) } // Fill the nonce gap and ensure all transactions become pending - if err := pool.AddRemote(transaction(1, 100000, key)); err != nil { + if err := pool.addRemoteSync(transaction(1, 100000, key)); err != nil { t.Fatalf("failed to add gapped transaction: %v", err) } pending, queued = pool.Stats() @@ -732,7 +733,7 @@ func TestTransactionQueueAccountLimiting(t *testing.T) { // Keep queuing up transactions and make sure all above a limit are dropped for i := uint64(1); i <= testTxPoolConfig.AccountQueue+5; i++ { - if err := pool.AddRemote(transaction(i, 100000, key)); err != nil { + if err := pool.addRemoteSync(transaction(i, 100000, key)); err != nil { t.Fatalf("tx %d: failed to add transaction: %v", i, err) } if len(pool.pending) != 0 { @@ -769,7 +770,7 @@ func testTransactionQueueGlobalLimiting(t *testing.T, nolocals bool) { t.Parallel() // Create the pool to test the limit enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig @@ -799,7 +800,7 @@ func testTransactionQueueGlobalLimiting(t *testing.T, nolocals bool) { nonces[addr]++ } // Import the batch and verify that limits have been enforced - pool.AddRemotes(txs) + pool.AddRemotesSync(txs) queued := 0 for addr, list := range pool.queue { @@ -857,7 +858,7 @@ func testTransactionQueueTimeLimiting(t *testing.T, nolocals bool) { evictionInterval = time.Second // Create the pool to test the non-expiration enforcement - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig @@ -932,7 +933,7 @@ func TestTransactionPendingLimiting(t *testing.T) { // Keep queuing up transactions and make sure all above a limit are dropped for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ { - if err := pool.AddRemote(transaction(i, 100000, key)); err != nil { + if err := pool.addRemoteSync(transaction(i, 100000, key)); err != nil { t.Fatalf("tx %d: failed to add transaction: %v", i, err) } if pool.pending[account].Len() != int(i)+1 { @@ -953,57 +954,6 @@ func TestTransactionPendingLimiting(t *testing.T) { } } -// Tests that the transaction limits are enforced the same way irrelevant whether -// the transactions are added one by one or in batches. -func TestTransactionQueueLimitingEquivalency(t *testing.T) { testTransactionLimitingEquivalency(t, 1) } -func TestTransactionPendingLimitingEquivalency(t *testing.T) { testTransactionLimitingEquivalency(t, 0) } - -func testTransactionLimitingEquivalency(t *testing.T, origin uint64) { - t.Parallel() - - // Add a batch of transactions to a pool one by one - pool1, key1 := setupTxPool() - defer pool1.Stop() - - account1, _ := deriveSender(transaction(0, 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, 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, 0, key2)) - pool2.currentState.AddBalance(account2, big.NewInt(1000000)) - - txs := []*types.Transaction{} - for i := uint64(0); i < testTxPoolConfig.AccountQueue+5; i++ { - txs = append(txs, transaction(origin+i, 100000, key2)) - } - pool2.AddRemotes(txs) - - // Ensure the batch optimization honors the same pool mechanics - if len(pool1.pending) != len(pool2.pending) { - t.Errorf("pending transaction count mismatch: one-by-one algo: %d, batch algo: %d", len(pool1.pending), len(pool2.pending)) - } - if len(pool1.queue) != len(pool2.queue) { - t.Errorf("queued transaction count mismatch: one-by-one algo: %d, batch algo: %d", len(pool1.queue), len(pool2.queue)) - } - if pool1.all.Count() != pool2.all.Count() { - t.Errorf("total transaction count mismatch: one-by-one algo %d, batch algo %d", pool1.all.Count(), pool2.all.Count()) - } - if err := validateTxPoolInternals(pool1); err != nil { - t.Errorf("pool 1 internal state corrupted: %v", err) - } - if err := validateTxPoolInternals(pool2); err != nil { - t.Errorf("pool 2 internal state corrupted: %v", err) - } -} - // Tests that if the transaction count belonging to multiple accounts go above // some hard threshold, the higher transactions are dropped to prevent DOS // attacks. @@ -1011,7 +961,7 @@ func TestTransactionPendingGlobalLimiting(t *testing.T) { t.Parallel() // Create the pool to test the limit enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig @@ -1038,7 +988,7 @@ func TestTransactionPendingGlobalLimiting(t *testing.T) { } } // Import the batch and verify that limits have been enforced - pool.AddRemotes(txs) + pool.AddRemotesSync(txs) pending := 0 for _, list := range pool.pending { @@ -1057,7 +1007,7 @@ func TestTransactionCapClearsFromAll(t *testing.T) { t.Parallel() // Create the pool to test the limit enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig @@ -1091,7 +1041,7 @@ func TestTransactionPendingMinimumAllowance(t *testing.T) { t.Parallel() // Create the pool to test the limit enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig @@ -1118,7 +1068,7 @@ func TestTransactionPendingMinimumAllowance(t *testing.T) { } } // Import the batch and verify that limits have been enforced - pool.AddRemotes(txs) + pool.AddRemotesSync(txs) for addr, list := range pool.pending { if list.Len() != int(config.AccountSlots) { @@ -1139,7 +1089,7 @@ func TestTransactionPoolRepricing(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) @@ -1174,7 +1124,7 @@ func TestTransactionPoolRepricing(t *testing.T) { ltx := pricedTransaction(0, 100000, big.NewInt(1), keys[3]) // Import the batch and that both pending and queued transactions match up - pool.AddRemotes(txs) + pool.AddRemotesSync(txs) pool.AddLocal(ltx) pending, queued := pool.Stats() @@ -1260,7 +1210,7 @@ func TestTransactionPoolRepricingKeepsLocals(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) @@ -1274,14 +1224,14 @@ func TestTransactionPoolRepricingKeepsLocals(t *testing.T) { } // Create transaction (both pending and queued) with a linearly growing gasprice for i := uint64(0); i < 500; i++ { - // Add pending - p_tx := pricedTransaction(i, 100000, big.NewInt(int64(i)), keys[2]) - if err := pool.AddLocal(p_tx); err != nil { + // Add pending transaction. + pendingTx := pricedTransaction(i, 100000, big.NewInt(int64(i)), keys[2]) + if err := pool.AddLocal(pendingTx); err != nil { t.Fatal(err) } - // Add queued - q_tx := pricedTransaction(i+501, 100000, big.NewInt(int64(i)), keys[2]) - if err := pool.AddLocal(q_tx); err != nil { + // Add queued transaction. + queuedTx := pricedTransaction(i+501, 100000, big.NewInt(int64(i)), keys[2]) + if err := pool.AddLocal(queuedTx); err != nil { t.Fatal(err) } } @@ -1322,7 +1272,7 @@ func TestTransactionPoolUnderpricing(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig @@ -1428,7 +1378,7 @@ func TestTransactionPoolStableUnderpricing(t *testing.T) { t.Parallel() // Create the pool to test the pricing enforcement with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig @@ -1454,7 +1404,7 @@ func TestTransactionPoolStableUnderpricing(t *testing.T) { for i := uint64(0); i < config.GlobalSlots; i++ { txs = append(txs, pricedTransaction(i, 100000, big.NewInt(1), keys[0])) } - pool.AddRemotes(txs) + pool.AddRemotesSync(txs) pending, queued := pool.Stats() if pending != int(config.GlobalSlots) { @@ -1470,7 +1420,7 @@ func TestTransactionPoolStableUnderpricing(t *testing.T) { t.Fatalf("pool internal state corrupted: %v", err) } // Ensure that adding high priced transactions drops a cheap, but doesn't produce a gap - if err := pool.AddRemote(pricedTransaction(0, 100000, big.NewInt(3), keys[1])); err != nil { + if err := pool.addRemoteSync(pricedTransaction(0, 100000, big.NewInt(3), keys[1])); err != nil { t.Fatalf("failed to add well priced transaction: %v", err) } pending, queued = pool.Stats() @@ -1488,13 +1438,78 @@ func TestTransactionPoolStableUnderpricing(t *testing.T) { } } +// Tests that the pool rejects duplicate transactions. +func TestTransactionDeduplication(t *testing.T) { + t.Parallel() + + // Create the pool to test the pricing enforcement with + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) + blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} + + pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) + defer pool.Stop() + + // Create a test account to add transactions with + key, _ := crypto.GenerateKey() + pool.currentState.AddBalance(crypto.PubkeyToAddress(key.PublicKey), big.NewInt(1000000000)) + + // Create a batch of transactions and add a few of them + txs := make([]*types.Transaction, 16) + for i := 0; i < len(txs); i++ { + txs[i] = pricedTransaction(uint64(i), 100000, big.NewInt(1), key) + } + var firsts []*types.Transaction + for i := 0; i < len(txs); i += 2 { + firsts = append(firsts, txs[i]) + } + errs := pool.AddRemotesSync(firsts) + if len(errs) != len(firsts) { + t.Fatalf("first add mismatching result count: have %d, want %d", len(errs), len(firsts)) + } + for i, err := range errs { + if err != nil { + t.Errorf("add %d failed: %v", i, err) + } + } + pending, queued := pool.Stats() + if pending != 1 { + t.Fatalf("pending transactions mismatched: have %d, want %d", pending, 1) + } + if queued != len(txs)/2-1 { + t.Fatalf("queued transactions mismatched: have %d, want %d", queued, len(txs)/2-1) + } + // Try to add all of them now and ensure previous ones error out as knowns + errs = pool.AddRemotesSync(txs) + if len(errs) != len(txs) { + t.Fatalf("all add mismatching result count: have %d, want %d", len(errs), len(txs)) + } + for i, err := range errs { + if i%2 == 0 && err == nil { + t.Errorf("add %d succeeded, should have failed as known", i) + } + if i%2 == 1 && err != nil { + t.Errorf("add %d failed: %v", i, err) + } + } + pending, queued = pool.Stats() + if pending != len(txs) { + t.Fatalf("pending transactions mismatched: have %d, want %d", pending, len(txs)) + } + 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) + } +} + // 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 - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) @@ -1513,7 +1528,7 @@ func TestTransactionReplacement(t *testing.T) { price := int64(100) threshold := (price * (100 + int64(testTxPoolConfig.PriceBump))) / 100 - if err := pool.AddRemote(pricedTransaction(0, 100000, big.NewInt(1), key)); err != nil { + if err := pool.addRemoteSync(pricedTransaction(0, 100000, big.NewInt(1), key)); err != nil { t.Fatalf("failed to add original cheap pending transaction: %v", err) } if err := pool.AddRemote(pricedTransaction(0, 100001, big.NewInt(1), key)); err != ErrReplaceUnderpriced { @@ -1526,7 +1541,7 @@ func TestTransactionReplacement(t *testing.T) { t.Fatalf("cheap replacement event firing failed: %v", err) } - if err := pool.AddRemote(pricedTransaction(0, 100000, big.NewInt(price), key)); err != nil { + if err := pool.addRemoteSync(pricedTransaction(0, 100000, big.NewInt(price), key)); err != nil { t.Fatalf("failed to add original proper pending transaction: %v", err) } if err := pool.AddRemote(pricedTransaction(0, 100001, big.NewInt(threshold-1), key)); err != ErrReplaceUnderpriced { @@ -1538,6 +1553,7 @@ func TestTransactionReplacement(t *testing.T) { 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, 100000, big.NewInt(1), key)); err != nil { t.Fatalf("failed to add original cheap queued transaction: %v", err) @@ -1588,7 +1604,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { os.Remove(journal) // Create the original pool to inject transaction into the journal - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} config := testTxPoolConfig @@ -1615,7 +1631,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { if err := pool.AddLocal(pricedTransaction(2, 100000, big.NewInt(1), local)); err != nil { t.Fatalf("failed to add local transaction: %v", err) } - if err := pool.AddRemote(pricedTransaction(0, 100000, big.NewInt(1), remote)); err != nil { + if err := pool.addRemoteSync(pricedTransaction(0, 100000, big.NewInt(1), remote)); err != nil { t.Fatalf("failed to add remote transaction: %v", err) } pending, queued := pool.Stats() @@ -1653,7 +1669,7 @@ func testTransactionJournaling(t *testing.T, nolocals bool) { } // Bump the nonce temporarily and ensure the newly invalidated transaction is removed statedb.SetNonce(crypto.PubkeyToAddress(local.PublicKey), 2) - pool.lockedReset(nil, nil) + <-pool.requestReset(nil, nil) time.Sleep(2 * config.Rejournal) pool.Stop() @@ -1686,7 +1702,7 @@ func TestTransactionStatusCheck(t *testing.T) { t.Parallel() // Create the pool to test the status retrievals with - statedb, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) blockchain := &testBlockChain{statedb, 1000000, new(event.Feed)} pool := NewTxPool(testTxPoolConfig, params.TestChainConfig, blockchain) @@ -1707,7 +1723,7 @@ func TestTransactionStatusCheck(t *testing.T) { txs = append(txs, pricedTransaction(2, 100000, big.NewInt(1), keys[2])) // Queued only // Import the transaction and ensure they are correctly added - pool.AddRemotes(txs) + pool.AddRemotesSync(txs) pending, queued := pool.Stats() if pending != 2 { @@ -1786,26 +1802,6 @@ func benchmarkFuturePromotion(b *testing.B, size int) { } } -// Benchmarks the speed of iterative transaction insertion. -func BenchmarkPoolInsert(b *testing.B) { - // Generate a batch of transactions to enqueue into the pool - pool, key := setupTxPool() - defer pool.Stop() - - account, _ := deriveSender(transaction(0, 0, key)) - pool.currentState.AddBalance(account, big.NewInt(1000000)) - - txs := make(types.Transactions, b.N) - for i := 0; i < b.N; i++ { - txs[i] = transaction(uint64(i), 100000, key) - } - // Benchmark importing the transactions into the queue - b.ResetTimer() - for _, tx := range txs { - pool.AddRemote(tx) - } -} - // Benchmarks the speed of batched transaction insertion. func BenchmarkPoolBatchInsert100(b *testing.B) { benchmarkPoolBatchInsert(b, 100) } func BenchmarkPoolBatchInsert1000(b *testing.B) { benchmarkPoolBatchInsert(b, 1000) } diff --git a/core/types.go b/core/types.go index bbd379bedc9b..4c5b74a49865 100644 --- a/core/types.go +++ b/core/types.go @@ -17,30 +17,35 @@ package core import ( - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" ) // Validator is an interface which defines the standard for block validation. It // is only responsible for validating block contents, as the header validation is // done by the specific consensus engines. -// type Validator interface { // ValidateBody validates the given block's content. ValidateBody(block *types.Block) error // ValidateState validates the given statedb and optionally the receipts and // gas used. - ValidateState(block, parent *types.Block, state *state.StateDB, receipts types.Receipts, usedGas uint64) error + ValidateState(block *types.Block, state *state.StateDB, receipts types.Receipts, usedGas uint64) error +} + +// Prefetcher is an interface for pre-caching transaction signatures and state. +type Prefetcher interface { + // Prefetch processes the state changes according to the Ethereum rules by running + // the transaction messages using the statedb, but any changes are discarded. The + // only goal is to pre-cache transaction signatures and state trie nodes. + Prefetch(block *types.Block, statedb *state.StateDB, cfg vm.Config, interrupt *uint32) } // Processor is an interface for processing blocks using a given initial state. -// -// Process takes the block to be processed and the statedb upon which the -// initial state is based. It should return the receipts generated, amount -// of gas used in the process and return an error if any of the internal rules -// failed. type Processor interface { + // Process processes the state changes according to the Ethereum rules by running + // the transaction messages using the statedb and applying any rewards to both + // the processor (coinbase) and any included uncles. Process(block *types.Block, statedb *state.StateDB, cfg vm.Config) (types.Receipts, []*types.Log, uint64, error) } diff --git a/core/types/block.go b/core/types/block.go index ccbd6fb81346..741ff8e282a8 100644 --- a/core/types/block.go +++ b/core/types/block.go @@ -19,22 +19,22 @@ package types import ( "encoding/binary" + "fmt" "io" "math/big" - "sort" + "reflect" "sync/atomic" "time" - "unsafe" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/rlp" "golang.org/x/crypto/sha3" ) var ( EmptyRootHash = DeriveSha(Transactions{}) - EmptyUncleHash = CalcUncleHash(nil) + EmptyUncleHash = rlpHash([]*Header(nil)) ) // A BlockNonce is a 64-bit hash which proves (combined with the @@ -79,7 +79,7 @@ type Header struct { Number *big.Int `json:"number" gencodec:"required"` GasLimit uint64 `json:"gasLimit" gencodec:"required"` GasUsed uint64 `json:"gasUsed" gencodec:"required"` - Time *big.Int `json:"timestamp" gencodec:"required"` + Time uint64 `json:"timestamp" gencodec:"required"` Extra []byte `json:"extraData" gencodec:"required"` MixDigest common.Hash `json:"mixHash"` Nonce BlockNonce `json:"nonce"` @@ -91,7 +91,7 @@ type headerMarshaling struct { Number *hexutil.Big GasLimit hexutil.Uint64 GasUsed hexutil.Uint64 - Time *hexutil.Big + Time hexutil.Uint64 Extra hexutil.Bytes Hash common.Hash `json:"hash"` // adds call to Hash() in MarshalJSON } @@ -102,10 +102,31 @@ func (h *Header) Hash() common.Hash { return rlpHash(h) } +var headerSize = common.StorageSize(reflect.TypeOf(Header{}).Size()) + // Size returns the approximate memory used by all internal contents. It is used // to approximate and limit the memory consumption of various caches. func (h *Header) Size() common.StorageSize { - return common.StorageSize(unsafe.Sizeof(*h)) + common.StorageSize(len(h.Extra)+(h.Difficulty.BitLen()+h.Number.BitLen()+h.Time.BitLen())/8) + return headerSize + common.StorageSize(len(h.Extra)+(h.Difficulty.BitLen()+h.Number.BitLen())/8) +} + +// SanityCheck checks a few basic things -- these checks are way beyond what +// any 'sane' production values should hold, and can mainly be used to prevent +// that the unbounded fields are stuffed with junk data to add processing +// overhead +func (h *Header) SanityCheck() error { + if h.Number != nil && !h.Number.IsUint64() { + return fmt.Errorf("too large block number: bitlen %d", h.Number.BitLen()) + } + if h.Difficulty != nil { + if diffLen := h.Difficulty.BitLen(); diffLen > 80 { + return fmt.Errorf("too large block difficulty: bitlen %d", diffLen) + } + } + if eLen := len(h.Extra); eLen > 100*1024 { + return fmt.Errorf("too large block extradata: size %d", eLen) + } + return nil } func rlpHash(x interface{}) (h common.Hash) { @@ -221,9 +242,6 @@ func NewBlockWithHeader(header *Header) *Block { // modifying a header variable. func CopyHeader(h *Header) *Header { cpy := *h - if cpy.Time = new(big.Int); h.Time != nil { - cpy.Time.Set(h.Time) - } if cpy.Difficulty = new(big.Int); h.Difficulty != nil { cpy.Difficulty.Set(h.Difficulty) } @@ -286,7 +304,7 @@ func (b *Block) Number() *big.Int { return new(big.Int).Set(b.header.Number) func (b *Block) GasLimit() uint64 { return b.header.GasLimit } func (b *Block) GasUsed() uint64 { return b.header.GasUsed } func (b *Block) Difficulty() *big.Int { return new(big.Int).Set(b.header.Difficulty) } -func (b *Block) Time() *big.Int { return new(big.Int).Set(b.header.Time) } +func (b *Block) Time() uint64 { return b.header.Time } func (b *Block) NumberU64() uint64 { return b.header.Number.Uint64() } func (b *Block) MixDigest() common.Hash { return b.header.MixDigest } @@ -317,6 +335,12 @@ func (b *Block) Size() common.StorageSize { return common.StorageSize(c) } +// SanityCheck can be used to prevent that unbounded fields are +// stuffed with junk data to add processing overhead +func (b *Block) SanityCheck() error { + return b.header.SanityCheck() +} + type writeCounter common.StorageSize func (c *writeCounter) Write(b []byte) (int, error) { @@ -325,6 +349,9 @@ func (c *writeCounter) Write(b []byte) (int, error) { } func CalcUncleHash(uncles []*Header) common.Hash { + if len(uncles) == 0 { + return EmptyUncleHash + } return rlpHash(uncles) } @@ -366,26 +393,3 @@ func (b *Block) Hash() common.Hash { } type Blocks []*Block - -type BlockBy func(b1, b2 *Block) bool - -func (self BlockBy) Sort(blocks Blocks) { - bs := blockSorter{ - blocks: blocks, - by: self, - } - sort.Sort(bs) -} - -type blockSorter struct { - blocks Blocks - by func(b1, b2 *Block) bool -} - -func (self blockSorter) Len() int { return len(self.blocks) } -func (self blockSorter) Swap(i, j int) { - self.blocks[i], self.blocks[j] = self.blocks[j], self.blocks[i] -} -func (self blockSorter) Less(i, j int) bool { return self.by(self.blocks[i], self.blocks[j]) } - -func Number(b1, b2 *Block) bool { return b1.header.Number.Cmp(b2.header.Number) < 0 } diff --git a/core/types/block_test.go b/core/types/block_test.go index 45a0d1d6c4b1..ff0a641e5ceb 100644 --- a/core/types/block_test.go +++ b/core/types/block_test.go @@ -18,13 +18,12 @@ package types import ( "bytes" - "fmt" "math/big" "reflect" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/rlp" ) // from bcValidBlockTest.json, "SimpleTx" @@ -48,15 +47,11 @@ func TestBlockEncoding(t *testing.T) { check("Root", block.Root(), common.HexToHash("ef1552a40b7165c3cd773806b9e0c165b75356e0314bf0706f279c729f51e017")) check("Hash", block.Hash(), common.HexToHash("0a5843ac1cb04865017cb35a57b50b07084e5fcee39b5acadade33149f4fff9e")) check("Nonce", block.Nonce(), uint64(0xa13a5a8c8f2bb1c4)) - check("Time", block.Time(), big.NewInt(1426516743)) + check("Time", block.Time(), uint64(1426516743)) check("Size", block.Size(), common.StorageSize(len(blockEnc))) tx1 := NewTransaction(0, common.HexToAddress("095e7baea6a6c7c4c2dfeb977efac326af552d87"), big.NewInt(10), 50000, big.NewInt(10), nil) - tx1, _ = tx1.WithSignature(HomesteadSigner{}, common.Hex2Bytes("9bea4c4daac7c7c52e093e6a4c35dbbcf8856f1af7b059ba20253e70848d094f8a8fae537ce25ed8cb5af9adac3f141af69bd515bd2ba031522df09b97dd72b100")) - fmt.Println(block.Transactions()[0].Hash()) - fmt.Println(tx1.data) - fmt.Println(tx1.Hash()) check("len(Transactions)", len(block.Transactions()), 1) check("Transactions[0].Hash", block.Transactions()[0].Hash(), tx1.Hash()) @@ -68,3 +63,19 @@ func TestBlockEncoding(t *testing.T) { t.Errorf("encoded block mismatch:\ngot: %x\nwant: %x", ourBlockEnc, blockEnc) } } + +func TestUncleHash(t *testing.T) { + uncles := make([]*Header, 0) + h := CalcUncleHash(uncles) + exp := common.HexToHash("1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347") + if h != exp { + t.Fatalf("empty uncle hash is wrong, got %x != %x", h, exp) + } +} +func BenchmarkUncleHash(b *testing.B) { + uncles := make([]*Header, 0) + b.ResetTimer() + for i := 0; i < b.N; i++ { + CalcUncleHash(uncles) + } +} diff --git a/core/types/bloom9.go b/core/types/bloom9.go index 9a2745c7bdd5..d045c9e6678e 100644 --- a/core/types/bloom9.go +++ b/core/types/bloom9.go @@ -20,8 +20,8 @@ import ( "fmt" "math/big" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" ) type bytesBacked interface { diff --git a/core/types/bloom9_test.go b/core/types/bloom9_test.go index 88f6c3877400..a28ac0e7afba 100644 --- a/core/types/bloom9_test.go +++ b/core/types/bloom9_test.go @@ -54,7 +54,7 @@ func TestBloom(t *testing.T) { import ( "testing" - "github.com/nebulaai/nbai-node/core/state" + "github.com/ethereum/go-ethereum/core/state" ) func TestBloom9(t *testing.T) { diff --git a/core/types/derive_sha.go b/core/types/derive_sha.go index 751c7f57f4c8..00c42c5bc622 100644 --- a/core/types/derive_sha.go +++ b/core/types/derive_sha.go @@ -19,9 +19,9 @@ package types import ( "bytes" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" ) type DerivableList interface { diff --git a/core/types/gen_header_json.go b/core/types/gen_header_json.go index 1c2f9966c6e2..4212b8d94d25 100644 --- a/core/types/gen_header_json.go +++ b/core/types/gen_header_json.go @@ -7,8 +7,8 @@ import ( "errors" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" ) var _ = (*headerMarshaling)(nil) @@ -27,7 +27,7 @@ func (h Header) MarshalJSON() ([]byte, error) { Number *hexutil.Big `json:"number" gencodec:"required"` GasLimit hexutil.Uint64 `json:"gasLimit" gencodec:"required"` GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"` - Time *hexutil.Big `json:"timestamp" gencodec:"required"` + Time hexutil.Uint64 `json:"timestamp" gencodec:"required"` Extra hexutil.Bytes `json:"extraData" gencodec:"required"` MixDigest common.Hash `json:"mixHash"` Nonce BlockNonce `json:"nonce"` @@ -45,7 +45,7 @@ func (h Header) MarshalJSON() ([]byte, error) { enc.Number = (*hexutil.Big)(h.Number) enc.GasLimit = hexutil.Uint64(h.GasLimit) enc.GasUsed = hexutil.Uint64(h.GasUsed) - enc.Time = (*hexutil.Big)(h.Time) + enc.Time = hexutil.Uint64(h.Time) enc.Extra = h.Extra enc.MixDigest = h.MixDigest enc.Nonce = h.Nonce @@ -67,7 +67,7 @@ func (h *Header) UnmarshalJSON(input []byte) error { Number *hexutil.Big `json:"number" gencodec:"required"` GasLimit *hexutil.Uint64 `json:"gasLimit" gencodec:"required"` GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"` - Time *hexutil.Big `json:"timestamp" gencodec:"required"` + Time *hexutil.Uint64 `json:"timestamp" gencodec:"required"` Extra *hexutil.Bytes `json:"extraData" gencodec:"required"` MixDigest *common.Hash `json:"mixHash"` Nonce *BlockNonce `json:"nonce"` @@ -123,7 +123,7 @@ func (h *Header) UnmarshalJSON(input []byte) error { if dec.Time == nil { return errors.New("missing required field 'timestamp' for Header") } - h.Time = (*big.Int)(dec.Time) + h.Time = uint64(*dec.Time) if dec.Extra == nil { return errors.New("missing required field 'extraData' for Header") } diff --git a/core/types/gen_log_json.go b/core/types/gen_log_json.go index eab02ca9b2b4..6e94339478f0 100644 --- a/core/types/gen_log_json.go +++ b/core/types/gen_log_json.go @@ -6,12 +6,13 @@ import ( "encoding/json" "errors" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" ) var _ = (*logMarshaling)(nil) +// MarshalJSON marshals as JSON. func (l Log) MarshalJSON() ([]byte, error) { type Log struct { Address common.Address `json:"address" gencodec:"required"` @@ -37,6 +38,7 @@ func (l Log) MarshalJSON() ([]byte, error) { return json.Marshal(&enc) } +// UnmarshalJSON unmarshals from JSON. func (l *Log) UnmarshalJSON(input []byte) error { type Log struct { Address *common.Address `json:"address" gencodec:"required"` diff --git a/core/types/gen_receipt_json.go b/core/types/gen_receipt_json.go index 6ff102412280..790ed65b5817 100644 --- a/core/types/gen_receipt_json.go +++ b/core/types/gen_receipt_json.go @@ -5,9 +5,10 @@ package types import ( "encoding/json" "errors" + "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" ) var _ = (*receiptMarshaling)(nil) @@ -23,6 +24,9 @@ func (r Receipt) MarshalJSON() ([]byte, error) { TxHash common.Hash `json:"transactionHash" gencodec:"required"` ContractAddress common.Address `json:"contractAddress"` GasUsed hexutil.Uint64 `json:"gasUsed" gencodec:"required"` + BlockHash common.Hash `json:"blockHash,omitempty"` + BlockNumber *hexutil.Big `json:"blockNumber,omitempty"` + TransactionIndex hexutil.Uint `json:"transactionIndex"` } var enc Receipt enc.PostState = r.PostState @@ -33,6 +37,9 @@ func (r Receipt) MarshalJSON() ([]byte, error) { enc.TxHash = r.TxHash enc.ContractAddress = r.ContractAddress enc.GasUsed = hexutil.Uint64(r.GasUsed) + enc.BlockHash = r.BlockHash + enc.BlockNumber = (*hexutil.Big)(r.BlockNumber) + enc.TransactionIndex = hexutil.Uint(r.TransactionIndex) return json.Marshal(&enc) } @@ -47,6 +54,9 @@ func (r *Receipt) UnmarshalJSON(input []byte) error { TxHash *common.Hash `json:"transactionHash" gencodec:"required"` ContractAddress *common.Address `json:"contractAddress"` GasUsed *hexutil.Uint64 `json:"gasUsed" gencodec:"required"` + BlockHash *common.Hash `json:"blockHash,omitempty"` + BlockNumber *hexutil.Big `json:"blockNumber,omitempty"` + TransactionIndex *hexutil.Uint `json:"transactionIndex"` } var dec Receipt if err := json.Unmarshal(input, &dec); err != nil { @@ -81,5 +91,14 @@ func (r *Receipt) UnmarshalJSON(input []byte) error { return errors.New("missing required field 'gasUsed' for Receipt") } r.GasUsed = uint64(*dec.GasUsed) + if dec.BlockHash != nil { + r.BlockHash = *dec.BlockHash + } + if dec.BlockNumber != nil { + r.BlockNumber = (*big.Int)(dec.BlockNumber) + } + if dec.TransactionIndex != nil { + r.TransactionIndex = uint(*dec.TransactionIndex) + } return nil } diff --git a/core/types/gen_tx_json.go b/core/types/gen_tx_json.go index c0969b60dc8a..e676058ecc4b 100644 --- a/core/types/gen_tx_json.go +++ b/core/types/gen_tx_json.go @@ -7,12 +7,13 @@ import ( "errors" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" ) var _ = (*txdataMarshaling)(nil) +// MarshalJSON marshals as JSON. func (t txdata) MarshalJSON() ([]byte, error) { type txdata struct { AccountNonce hexutil.Uint64 `json:"nonce" gencodec:"required"` @@ -40,6 +41,7 @@ func (t txdata) MarshalJSON() ([]byte, error) { return json.Marshal(&enc) } +// UnmarshalJSON unmarshals from JSON. func (t *txdata) UnmarshalJSON(input []byte) error { type txdata struct { AccountNonce *hexutil.Uint64 `json:"nonce" gencodec:"required"` diff --git a/core/types/log.go b/core/types/log.go index b82421c9a147..006f62bbf6f6 100644 --- a/core/types/log.go +++ b/core/types/log.go @@ -19,9 +19,9 @@ package types import ( "io" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/rlp" ) //go:generate gencodec -type Log -field-override logMarshaling -out gen_log_json.go @@ -68,7 +68,11 @@ type rlpLog struct { Data []byte } -type rlpStorageLog struct { +// rlpStorageLog is the storage encoding of a log. +type rlpStorageLog rlpLog + +// legacyRlpStorageLog is the previous storage encoding of a log including some redundant fields. +type legacyRlpStorageLog struct { Address common.Address Topics []common.Hash Data []byte @@ -101,31 +105,38 @@ type LogForStorage Log // EncodeRLP implements rlp.Encoder. func (l *LogForStorage) EncodeRLP(w io.Writer) error { return rlp.Encode(w, rlpStorageLog{ - Address: l.Address, - Topics: l.Topics, - Data: l.Data, - BlockNumber: l.BlockNumber, - TxHash: l.TxHash, - TxIndex: l.TxIndex, - BlockHash: l.BlockHash, - Index: l.Index, + Address: l.Address, + Topics: l.Topics, + Data: l.Data, }) } // DecodeRLP implements rlp.Decoder. +// +// Note some redundant fields(e.g. block number, tx hash etc) will be assembled later. func (l *LogForStorage) DecodeRLP(s *rlp.Stream) error { + blob, err := s.Raw() + if err != nil { + return err + } var dec rlpStorageLog - err := s.Decode(&dec) + err = rlp.DecodeBytes(blob, &dec) if err == nil { *l = LogForStorage{ - Address: dec.Address, - Topics: dec.Topics, - Data: dec.Data, - BlockNumber: dec.BlockNumber, - TxHash: dec.TxHash, - TxIndex: dec.TxIndex, - BlockHash: dec.BlockHash, - Index: dec.Index, + Address: dec.Address, + Topics: dec.Topics, + Data: dec.Data, + } + } else { + // Try to decode log with previous definition. + var dec legacyRlpStorageLog + err = rlp.DecodeBytes(blob, &dec) + if err == nil { + *l = LogForStorage{ + Address: dec.Address, + Topics: dec.Topics, + Data: dec.Data, + } } } return err diff --git a/core/types/log_test.go b/core/types/log_test.go index 50d63e8c39b6..0e56acfe4aa3 100644 --- a/core/types/log_test.go +++ b/core/types/log_test.go @@ -23,8 +23,8 @@ import ( "testing" "github.com/davecgh/go-spew/spew" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" ) var unmarshalLogTests = map[string]struct { diff --git a/core/types/receipt.go b/core/types/receipt.go index 72ed42e9ff96..a96c7525ef3b 100644 --- a/core/types/receipt.go +++ b/core/types/receipt.go @@ -18,13 +18,17 @@ package types import ( "bytes" + "errors" "fmt" "io" + "math/big" "unsafe" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" ) //go:generate gencodec -type Receipt -field-override receiptMarshaling -out gen_receipt_json.go @@ -44,17 +48,24 @@ const ( // Receipt represents the results of a transaction. type Receipt struct { - // Consensus fields + // Consensus fields: These fields are defined by the Yellow Paper PostState []byte `json:"root"` Status uint64 `json:"status"` CumulativeGasUsed uint64 `json:"cumulativeGasUsed" gencodec:"required"` Bloom Bloom `json:"logsBloom" gencodec:"required"` Logs []*Log `json:"logs" gencodec:"required"` - // Implementation fields (don't reorder!) + // Implementation fields: These fields are added by geth when processing a transaction. + // They are stored in the chain database. TxHash common.Hash `json:"transactionHash" gencodec:"required"` ContractAddress common.Address `json:"contractAddress"` GasUsed uint64 `json:"gasUsed" gencodec:"required"` + + // Inclusion information: These fields provide information about the inclusion of the + // transaction corresponding to this receipt. + BlockHash common.Hash `json:"blockHash,omitempty"` + BlockNumber *big.Int `json:"blockNumber,omitempty"` + TransactionIndex uint `json:"transactionIndex"` } type receiptMarshaling struct { @@ -62,6 +73,8 @@ type receiptMarshaling struct { Status hexutil.Uint64 CumulativeGasUsed hexutil.Uint64 GasUsed hexutil.Uint64 + BlockNumber *hexutil.Big + TransactionIndex hexutil.Uint } // receiptRLP is the consensus encoding of a receipt. @@ -72,7 +85,25 @@ type receiptRLP struct { Logs []*Log } -type receiptStorageRLP struct { +// storedReceiptRLP is the storage encoding of a receipt. +type storedReceiptRLP struct { + PostStateOrStatus []byte + CumulativeGasUsed uint64 + Logs []*LogForStorage +} + +// v4StoredReceiptRLP is the storage encoding of a receipt used in database version 4. +type v4StoredReceiptRLP struct { + PostStateOrStatus []byte + CumulativeGasUsed uint64 + TxHash common.Hash + ContractAddress common.Address + Logs []*LogForStorage + GasUsed uint64 +} + +// v3StoredReceiptRLP is the original storage encoding of a receipt including some unnecessary fields. +type v3StoredReceiptRLP struct { PostStateOrStatus []byte CumulativeGasUsed uint64 Bloom Bloom @@ -156,14 +187,10 @@ 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 { - enc := &receiptStorageRLP{ + enc := &storedReceiptRLP{ 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, } for i, log := range r.Logs { enc.Logs[i] = (*LogForStorage)(log) @@ -174,21 +201,79 @@ func (r *ReceiptForStorage) EncodeRLP(w io.Writer) error { // 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 dec receiptStorageRLP - if err := s.Decode(&dec); err != nil { + // Retrieve the entire receipt blob as we need to try multiple decoders + blob, err := s.Raw() + if err != nil { return err } - if err := (*Receipt)(r).setStatus(dec.PostStateOrStatus); err != nil { + // Try decoding from the newest format for future proofness, then the older one + // for old nodes that just upgraded. V4 was an intermediate unreleased format so + // we do need to decode it, but it's not common (try last). + if err := decodeStoredReceiptRLP(r, blob); err == nil { + return nil + } + if err := decodeV3StoredReceiptRLP(r, blob); err == nil { + return nil + } + return decodeV4StoredReceiptRLP(r, blob) +} + +func decodeStoredReceiptRLP(r *ReceiptForStorage, blob []byte) error { + var stored storedReceiptRLP + if err := rlp.DecodeBytes(blob, &stored); err != nil { return err } - // Assign the consensus fields - r.CumulativeGasUsed, r.Bloom = dec.CumulativeGasUsed, dec.Bloom - r.Logs = make([]*Log, len(dec.Logs)) - for i, log := range dec.Logs { + if err := (*Receipt)(r).setStatus(stored.PostStateOrStatus); err != nil { + return err + } + r.CumulativeGasUsed = stored.CumulativeGasUsed + r.Logs = make([]*Log, len(stored.Logs)) + for i, log := range stored.Logs { + r.Logs[i] = (*Log)(log) + } + r.Bloom = CreateBloom(Receipts{(*Receipt)(r)}) + + return nil +} + +func decodeV4StoredReceiptRLP(r *ReceiptForStorage, blob []byte) error { + var stored v4StoredReceiptRLP + if err := rlp.DecodeBytes(blob, &stored); err != nil { + return err + } + if err := (*Receipt)(r).setStatus(stored.PostStateOrStatus); err != nil { + return err + } + r.CumulativeGasUsed = stored.CumulativeGasUsed + r.TxHash = stored.TxHash + r.ContractAddress = stored.ContractAddress + r.GasUsed = stored.GasUsed + r.Logs = make([]*Log, len(stored.Logs)) + for i, log := range stored.Logs { + r.Logs[i] = (*Log)(log) + } + r.Bloom = CreateBloom(Receipts{(*Receipt)(r)}) + + return nil +} + +func decodeV3StoredReceiptRLP(r *ReceiptForStorage, blob []byte) error { + var stored v3StoredReceiptRLP + if err := rlp.DecodeBytes(blob, &stored); err != nil { + return err + } + if err := (*Receipt)(r).setStatus(stored.PostStateOrStatus); err != nil { + return err + } + r.CumulativeGasUsed = stored.CumulativeGasUsed + r.Bloom = stored.Bloom + r.TxHash = stored.TxHash + r.ContractAddress = stored.ContractAddress + r.GasUsed = stored.GasUsed + r.Logs = make([]*Log, len(stored.Logs)) + for i, log := range stored.Logs { r.Logs[i] = (*Log)(log) } - // Assign the implementation fields - r.TxHash, r.ContractAddress, r.GasUsed = dec.TxHash, dec.ContractAddress, dec.GasUsed return nil } @@ -206,3 +291,46 @@ func (r Receipts) GetRlp(i int) []byte { } return bytes } + +// DeriveFields fills the receipts with their computed fields based on consensus +// data and contextual infos like containing block and transactions. +func (r Receipts) DeriveFields(config *params.ChainConfig, hash common.Hash, number uint64, txs Transactions) error { + signer := MakeSigner(config, new(big.Int).SetUint64(number)) + + logIndex := uint(0) + if len(txs) != len(r) { + return errors.New("transaction and receipt count mismatch") + } + for i := 0; i < len(r); i++ { + // The transaction hash can be retrieved from the transaction itself + r[i].TxHash = txs[i].Hash() + + // block location fields + r[i].BlockHash = hash + r[i].BlockNumber = new(big.Int).SetUint64(number) + r[i].TransactionIndex = uint(i) + + // The contract address can be derived from the transaction itself + if txs[i].To() == nil { + // Deriving the signer is expensive, only do if it's actually needed + from, _ := Sender(signer, txs[i]) + r[i].ContractAddress = crypto.CreateAddress(from, txs[i].Nonce()) + } + // The used gas can be calculated based on previous r + if i == 0 { + r[i].GasUsed = r[i].CumulativeGasUsed + } else { + r[i].GasUsed = r[i].CumulativeGasUsed - r[i-1].CumulativeGasUsed + } + // The derived log fields can simply be set from the block and transaction + for j := 0; j < len(r[i].Logs); j++ { + r[i].Logs[j].BlockNumber = number + r[i].Logs[j].BlockHash = hash + r[i].Logs[j].TxHash = r[i].TxHash + r[i].Logs[j].TxIndex = uint(i) + r[i].Logs[j].Index = logIndex + logIndex++ + } + } + return nil +} diff --git a/core/types/receipt_test.go b/core/types/receipt_test.go new file mode 100644 index 000000000000..806b3dd2ab88 --- /dev/null +++ b/core/types/receipt_test.go @@ -0,0 +1,283 @@ +// Copyright 2019 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 types + +import ( + "bytes" + "math" + "math/big" + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" +) + +func TestLegacyReceiptDecoding(t *testing.T) { + tests := []struct { + name string + encode func(*Receipt) ([]byte, error) + }{ + { + "StoredReceiptRLP", + encodeAsStoredReceiptRLP, + }, + { + "V4StoredReceiptRLP", + encodeAsV4StoredReceiptRLP, + }, + { + "V3StoredReceiptRLP", + encodeAsV3StoredReceiptRLP, + }, + } + + tx := NewTransaction(1, common.HexToAddress("0x1"), big.NewInt(1), 1, big.NewInt(1), nil) + receipt := &Receipt{ + Status: ReceiptStatusFailed, + CumulativeGasUsed: 1, + Logs: []*Log{ + { + Address: common.BytesToAddress([]byte{0x11}), + Topics: []common.Hash{common.HexToHash("dead"), common.HexToHash("beef")}, + Data: []byte{0x01, 0x00, 0xff}, + }, + { + Address: common.BytesToAddress([]byte{0x01, 0x11}), + Topics: []common.Hash{common.HexToHash("dead"), common.HexToHash("beef")}, + Data: []byte{0x01, 0x00, 0xff}, + }, + }, + TxHash: tx.Hash(), + ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}), + GasUsed: 111111, + } + receipt.Bloom = CreateBloom(Receipts{receipt}) + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + enc, err := tc.encode(receipt) + if err != nil { + t.Fatalf("Error encoding receipt: %v", err) + } + var dec ReceiptForStorage + if err := rlp.DecodeBytes(enc, &dec); err != nil { + t.Fatalf("Error decoding RLP receipt: %v", err) + } + // Check whether all consensus fields are correct. + if dec.Status != receipt.Status { + t.Fatalf("Receipt status mismatch, want %v, have %v", receipt.Status, dec.Status) + } + if dec.CumulativeGasUsed != receipt.CumulativeGasUsed { + t.Fatalf("Receipt CumulativeGasUsed mismatch, want %v, have %v", receipt.CumulativeGasUsed, dec.CumulativeGasUsed) + } + if dec.Bloom != receipt.Bloom { + t.Fatalf("Bloom data mismatch, want %v, have %v", receipt.Bloom, dec.Bloom) + } + if len(dec.Logs) != len(receipt.Logs) { + t.Fatalf("Receipt log number mismatch, want %v, have %v", len(receipt.Logs), len(dec.Logs)) + } + for i := 0; i < len(dec.Logs); i++ { + if dec.Logs[i].Address != receipt.Logs[i].Address { + t.Fatalf("Receipt log %d address mismatch, want %v, have %v", i, receipt.Logs[i].Address, dec.Logs[i].Address) + } + if !reflect.DeepEqual(dec.Logs[i].Topics, receipt.Logs[i].Topics) { + t.Fatalf("Receipt log %d topics mismatch, want %v, have %v", i, receipt.Logs[i].Topics, dec.Logs[i].Topics) + } + if !bytes.Equal(dec.Logs[i].Data, receipt.Logs[i].Data) { + t.Fatalf("Receipt log %d data mismatch, want %v, have %v", i, receipt.Logs[i].Data, dec.Logs[i].Data) + } + } + }) + } +} + +func encodeAsStoredReceiptRLP(want *Receipt) ([]byte, error) { + stored := &storedReceiptRLP{ + PostStateOrStatus: want.statusEncoding(), + CumulativeGasUsed: want.CumulativeGasUsed, + Logs: make([]*LogForStorage, len(want.Logs)), + } + for i, log := range want.Logs { + stored.Logs[i] = (*LogForStorage)(log) + } + return rlp.EncodeToBytes(stored) +} + +func encodeAsV4StoredReceiptRLP(want *Receipt) ([]byte, error) { + stored := &v4StoredReceiptRLP{ + PostStateOrStatus: want.statusEncoding(), + CumulativeGasUsed: want.CumulativeGasUsed, + TxHash: want.TxHash, + ContractAddress: want.ContractAddress, + Logs: make([]*LogForStorage, len(want.Logs)), + GasUsed: want.GasUsed, + } + for i, log := range want.Logs { + stored.Logs[i] = (*LogForStorage)(log) + } + return rlp.EncodeToBytes(stored) +} + +func encodeAsV3StoredReceiptRLP(want *Receipt) ([]byte, error) { + stored := &v3StoredReceiptRLP{ + PostStateOrStatus: want.statusEncoding(), + CumulativeGasUsed: want.CumulativeGasUsed, + Bloom: want.Bloom, + TxHash: want.TxHash, + ContractAddress: want.ContractAddress, + Logs: make([]*LogForStorage, len(want.Logs)), + GasUsed: want.GasUsed, + } + for i, log := range want.Logs { + stored.Logs[i] = (*LogForStorage)(log) + } + return rlp.EncodeToBytes(stored) +} + +// Tests that receipt data can be correctly derived from the contextual infos +func TestDeriveFields(t *testing.T) { + // Create a few transactions to have receipts for + txs := Transactions{ + NewContractCreation(1, big.NewInt(1), 1, big.NewInt(1), nil), + NewTransaction(2, common.HexToAddress("0x2"), big.NewInt(2), 2, big.NewInt(2), nil), + } + // Create the corresponding receipts + receipts := Receipts{ + &Receipt{ + Status: ReceiptStatusFailed, + CumulativeGasUsed: 1, + Logs: []*Log{ + {Address: common.BytesToAddress([]byte{0x11})}, + {Address: common.BytesToAddress([]byte{0x01, 0x11})}, + }, + TxHash: txs[0].Hash(), + ContractAddress: common.BytesToAddress([]byte{0x01, 0x11, 0x11}), + GasUsed: 1, + }, + &Receipt{ + PostState: common.Hash{2}.Bytes(), + CumulativeGasUsed: 3, + Logs: []*Log{ + {Address: common.BytesToAddress([]byte{0x22})}, + {Address: common.BytesToAddress([]byte{0x02, 0x22})}, + }, + TxHash: txs[1].Hash(), + ContractAddress: common.BytesToAddress([]byte{0x02, 0x22, 0x22}), + GasUsed: 2, + }, + } + // Clear all the computed fields and re-derive them + number := big.NewInt(1) + hash := common.BytesToHash([]byte{0x03, 0x14}) + + clearComputedFieldsOnReceipts(t, receipts) + if err := receipts.DeriveFields(params.TestChainConfig, hash, number.Uint64(), txs); err != nil { + t.Fatalf("DeriveFields(...) = %v, want ", err) + } + // Iterate over all the computed fields and check that they're correct + signer := MakeSigner(params.TestChainConfig, number) + + logIndex := uint(0) + for i := range receipts { + if receipts[i].TxHash != txs[i].Hash() { + t.Errorf("receipts[%d].TxHash = %s, want %s", i, receipts[i].TxHash.String(), txs[i].Hash().String()) + } + if receipts[i].BlockHash != hash { + t.Errorf("receipts[%d].BlockHash = %s, want %s", i, receipts[i].BlockHash.String(), hash.String()) + } + if receipts[i].BlockNumber.Cmp(number) != 0 { + t.Errorf("receipts[%c].BlockNumber = %s, want %s", i, receipts[i].BlockNumber.String(), number.String()) + } + if receipts[i].TransactionIndex != uint(i) { + t.Errorf("receipts[%d].TransactionIndex = %d, want %d", i, receipts[i].TransactionIndex, i) + } + if receipts[i].GasUsed != txs[i].Gas() { + t.Errorf("receipts[%d].GasUsed = %d, want %d", i, receipts[i].GasUsed, txs[i].Gas()) + } + if txs[i].To() != nil && receipts[i].ContractAddress != (common.Address{}) { + t.Errorf("receipts[%d].ContractAddress = %s, want %s", i, receipts[i].ContractAddress.String(), (common.Address{}).String()) + } + from, _ := Sender(signer, txs[i]) + contractAddress := crypto.CreateAddress(from, txs[i].Nonce()) + if txs[i].To() == nil && receipts[i].ContractAddress != contractAddress { + t.Errorf("receipts[%d].ContractAddress = %s, want %s", i, receipts[i].ContractAddress.String(), contractAddress.String()) + } + for j := range receipts[i].Logs { + if receipts[i].Logs[j].BlockNumber != number.Uint64() { + t.Errorf("receipts[%d].Logs[%d].BlockNumber = %d, want %d", i, j, receipts[i].Logs[j].BlockNumber, number.Uint64()) + } + if receipts[i].Logs[j].BlockHash != hash { + t.Errorf("receipts[%d].Logs[%d].BlockHash = %s, want %s", i, j, receipts[i].Logs[j].BlockHash.String(), hash.String()) + } + if receipts[i].Logs[j].TxHash != txs[i].Hash() { + t.Errorf("receipts[%d].Logs[%d].TxHash = %s, want %s", i, j, receipts[i].Logs[j].TxHash.String(), txs[i].Hash().String()) + } + if receipts[i].Logs[j].TxHash != txs[i].Hash() { + t.Errorf("receipts[%d].Logs[%d].TxHash = %s, want %s", i, j, receipts[i].Logs[j].TxHash.String(), txs[i].Hash().String()) + } + if receipts[i].Logs[j].TxIndex != uint(i) { + t.Errorf("receipts[%d].Logs[%d].TransactionIndex = %d, want %d", i, j, receipts[i].Logs[j].TxIndex, i) + } + if receipts[i].Logs[j].Index != logIndex { + t.Errorf("receipts[%d].Logs[%d].Index = %d, want %d", i, j, receipts[i].Logs[j].Index, logIndex) + } + logIndex++ + } + } +} + +func clearComputedFieldsOnReceipts(t *testing.T, receipts Receipts) { + t.Helper() + + for _, receipt := range receipts { + clearComputedFieldsOnReceipt(t, receipt) + } +} + +func clearComputedFieldsOnReceipt(t *testing.T, receipt *Receipt) { + t.Helper() + + receipt.TxHash = common.Hash{} + receipt.BlockHash = common.Hash{} + receipt.BlockNumber = big.NewInt(math.MaxUint32) + receipt.TransactionIndex = math.MaxUint32 + receipt.ContractAddress = common.Address{} + receipt.GasUsed = 0 + + clearComputedFieldsOnLogs(t, receipt.Logs) +} + +func clearComputedFieldsOnLogs(t *testing.T, logs []*Log) { + t.Helper() + + for _, log := range logs { + clearComputedFieldsOnLog(t, log) + } +} + +func clearComputedFieldsOnLog(t *testing.T, log *Log) { + t.Helper() + + log.BlockNumber = math.MaxUint32 + log.BlockHash = common.Hash{} + log.TxHash = common.Hash{} + log.TxIndex = math.MaxUint32 + log.Index = math.MaxUint32 +} diff --git a/core/types/transaction.go b/core/types/transaction.go index 6b20670c8902..3eb8df0ac7c7 100644 --- a/core/types/transaction.go +++ b/core/types/transaction.go @@ -23,10 +23,10 @@ import ( "math/big" "sync/atomic" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/rlp" ) //go:generate gencodec -type txdata -field-override txdataMarshaling -out gen_tx_json.go @@ -252,7 +252,9 @@ func (tx *Transaction) Cost() *big.Int { return total } -func (tx *Transaction) RawSignatureValues() (*big.Int, *big.Int, *big.Int) { +// RawSignatureValues returns the V, R, S signature values of the transaction. +// The return values should not be modified by the caller. +func (tx *Transaction) RawSignatureValues() (v, r, s *big.Int) { return tx.data.V, tx.data.R, tx.data.S } diff --git a/core/types/transaction_signing.go b/core/types/transaction_signing.go index 0b2992e8736b..842fedbd03d6 100644 --- a/core/types/transaction_signing.go +++ b/core/types/transaction_signing.go @@ -22,9 +22,9 @@ import ( "fmt" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" ) var ( @@ -193,8 +193,8 @@ func (s FrontierSigner) Equal(s2 Signer) bool { // SignatureValues returns signature values. This signature // needs to be in the [R || S || V] format where V is 0 or 1. 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 signature: got %d, want 65", len(sig))) + if len(sig) != crypto.SignatureLength { + panic(fmt.Sprintf("wrong size for signature: got %d, want %d", len(sig), crypto.SignatureLength)) } r = new(big.Int).SetBytes(sig[:32]) s = new(big.Int).SetBytes(sig[32:64]) @@ -229,7 +229,7 @@ func recoverPlain(sighash common.Hash, R, S, Vb *big.Int, homestead bool) (commo } // encode the signature in uncompressed format r, s := R.Bytes(), S.Bytes() - sig := make([]byte, 65) + sig := make([]byte, crypto.SignatureLength) copy(sig[32-len(r):32], r) copy(sig[64-len(s):64], s) sig[64] = V diff --git a/core/types/transaction_signing_test.go b/core/types/transaction_signing_test.go index 22b555ecaca7..689fc38a9b66 100644 --- a/core/types/transaction_signing_test.go +++ b/core/types/transaction_signing_test.go @@ -20,9 +20,9 @@ import ( "math/big" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/rlp" ) func TestEIP155Signing(t *testing.T) { diff --git a/core/types/transaction_test.go b/core/types/transaction_test.go index 58b7caf688c1..7a1b6cd4d4b7 100644 --- a/core/types/transaction_test.go +++ b/core/types/transaction_test.go @@ -23,9 +23,9 @@ import ( "math/big" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/rlp" ) // The values in those tests are from the Transaction Tests @@ -89,17 +89,15 @@ func TestRecipientEmpty(t *testing.T) { _, addr := defaultTestKey() tx, err := decodeTx(common.Hex2Bytes("f8498080808080011ca09b16de9d5bdee2cf56c28d16275a4da68cd30273e2525f3959f5d62557489921a0372ebd8fb3345f7db7b5a86d42e24d36e983e259b0664ceb8c227ec9af572f3d")) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } from, err := Sender(HomesteadSigner{}, tx) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } if addr != from { - t.Error("derived address doesn't match") + t.Fatal("derived address doesn't match") } } @@ -108,18 +106,15 @@ func TestRecipientNormal(t *testing.T) { tx, err := decodeTx(common.Hex2Bytes("f85d80808094000000000000000000000000000000000000000080011ca0527c0d8f5c63f7b9f41324a7c8a563ee1190bcbf0dac8ab446291bdbf32f5c79a0552c4ef0a09a04395074dab9ed34d3fbfb843c2f2546cc30fe89ec143ca94ca6")) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } from, err := Sender(HomesteadSigner{}, tx) if err != nil { - t.Error(err) - t.FailNow() + t.Fatal(err) } - if addr != from { - t.Error("derived address doesn't match") + t.Fatal("derived address doesn't match") } } diff --git a/core/vm/analysis_test.go b/core/vm/analysis_test.go index 3b6d4265c9f2..fd2d744d87f4 100644 --- a/core/vm/analysis_test.go +++ b/core/vm/analysis_test.go @@ -19,7 +19,7 @@ package vm import ( "testing" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/crypto" ) func TestJumpDestAnalysis(t *testing.T) { diff --git a/core/vm/common.go b/core/vm/common.go index d0e879ed233f..d592a9410dd0 100644 --- a/core/vm/common.go +++ b/core/vm/common.go @@ -19,17 +19,35 @@ package vm import ( "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" ) -// calculates the memory size required for a step -func calcMemSize(off, l *big.Int) *big.Int { - if l.Sign() == 0 { - return common.Big0 +// calcMemSize64 calculates the required memory size, and returns +// the size and whether the result overflowed uint64 +func calcMemSize64(off, l *big.Int) (uint64, bool) { + if !l.IsUint64() { + return 0, true } + return calcMemSize64WithUint(off, l.Uint64()) +} - return new(big.Int).Add(off, l) +// calcMemSize64WithUint calculates the required memory size, and returns +// the size and whether the result overflowed uint64 +// Identical to calcMemSize64, but length is a uint64 +func calcMemSize64WithUint(off *big.Int, length64 uint64) (uint64, bool) { + // if length is zero, memsize is always zero, regardless of offset + if length64 == 0 { + return 0, false + } + // Check that offset doesn't overflow + if !off.IsUint64() { + return 0, true + } + offset64 := off.Uint64() + val := offset64 + length64 + // if value < either of it's parts, then it overflowed + return val, val < offset64 } // getData returns a slice from the data based on the start and size and pads @@ -59,7 +77,7 @@ func getDataBig(data []byte, start *big.Int, size *big.Int) []byte { // bigUint64 returns the integer casted to a uint64 and returns whether it // overflowed in the process. func bigUint64(v *big.Int) (uint64, bool) { - return v.Uint64(), v.BitLen() > 64 + return v.Uint64(), !v.IsUint64() } // toWordSize returns the ceiled word size required for memory expansion. diff --git a/core/vm/contract.go b/core/vm/contract.go index ecb3eb79ecc9..375e24bc1974 100644 --- a/core/vm/contract.go +++ b/core/vm/contract.go @@ -19,7 +19,7 @@ package vm import ( "math/big" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) // ContractRef is a reference to the contract's backing object @@ -162,7 +162,7 @@ func (c *Contract) Address() common.Address { return c.self.Address() } -// Value returns the contracts value (sent to it from it's caller) +// Value returns the contract's value (sent to it from it's caller) func (c *Contract) Value() *big.Int { return c.value } diff --git a/core/vm/contracts.go b/core/vm/contracts.go index 40a283e00c0b..7d304613cedb 100644 --- a/core/vm/contracts.go +++ b/core/vm/contracts.go @@ -18,14 +18,18 @@ package vm import ( "crypto/sha256" + "encoding/binary" "errors" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/crypto/bn256" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/blake2b" + "github.com/ethereum/go-ethereum/crypto/bn256" + "github.com/ethereum/go-ethereum/params" + + //lint:ignore SA1019 Needed for precompile "golang.org/x/crypto/ripemd160" ) @@ -54,9 +58,23 @@ var PrecompiledContractsByzantium = map[common.Address]PrecompiledContract{ 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{}, + common.BytesToAddress([]byte{6}): &bn256AddByzantium{}, + common.BytesToAddress([]byte{7}): &bn256ScalarMulByzantium{}, + common.BytesToAddress([]byte{8}): &bn256PairingByzantium{}, +} + +// PrecompiledContractsIstanbul contains the default set of pre-compiled Ethereum +// contracts used in the Istanbul release. +var PrecompiledContractsIstanbul = 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}): &bn256AddIstanbul{}, + common.BytesToAddress([]byte{7}): &bn256ScalarMulIstanbul{}, + common.BytesToAddress([]byte{8}): &bn256PairingIstanbul{}, + common.BytesToAddress([]byte{9}): &blake2F{}, } // RunPrecompiledContract runs and evaluates the output of a precompiled contract. @@ -90,8 +108,13 @@ func (c *ecrecover) Run(input []byte) ([]byte, error) { if !allZero(input[32:63]) || !crypto.ValidateSignatureValues(v, r, s, false) { return nil, nil } + // We must make sure not to modify the 'input', so placing the 'v' along with + // the signature needs to be done on a new allocation + sig := make([]byte, 65) + copy(sig, input[64:128]) + sig[64] = v // v needs to be at the end for libsecp256k1 - pubKey, err := crypto.Ecrecover(input[:32], append(input[64:128], v)) + pubKey, err := crypto.Ecrecover(input[:32], sig) // make sure the public key is a valid one if err != nil { return nil, nil @@ -271,15 +294,9 @@ func newTwistPoint(blob []byte) (*bn256.G2, error) { 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) { +// runBn256Add implements the Bn256Add precompile, referenced by both +// Byzantium and Istanbul operations. +func runBn256Add(input []byte) ([]byte, error) { x, err := newCurvePoint(getData(input, 0, 64)) if err != nil { return nil, err @@ -293,15 +310,35 @@ func (c *bn256Add) Run(input []byte) ([]byte, error) { return res.Marshal(), nil } -// bn256ScalarMul implements a native elliptic curve scalar multiplication. -type bn256ScalarMul struct{} +// bn256Add implements a native elliptic curve point addition conforming to +// Istanbul consensus rules. +type bn256AddIstanbul struct{} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bn256AddIstanbul) RequiredGas(input []byte) uint64 { + return params.Bn256AddGasIstanbul +} + +func (c *bn256AddIstanbul) Run(input []byte) ([]byte, error) { + return runBn256Add(input) +} + +// bn256AddByzantium implements a native elliptic curve point addition +// conforming to Byzantium consensus rules. +type bn256AddByzantium struct{} // RequiredGas returns the gas required to execute the pre-compiled contract. -func (c *bn256ScalarMul) RequiredGas(input []byte) uint64 { - return params.Bn256ScalarMulGas +func (c *bn256AddByzantium) RequiredGas(input []byte) uint64 { + return params.Bn256AddGasByzantium } -func (c *bn256ScalarMul) Run(input []byte) ([]byte, error) { +func (c *bn256AddByzantium) Run(input []byte) ([]byte, error) { + return runBn256Add(input) +} + +// runBn256ScalarMul implements the Bn256ScalarMul precompile, referenced by +// both Byzantium and Istanbul operations. +func runBn256ScalarMul(input []byte) ([]byte, error) { p, err := newCurvePoint(getData(input, 0, 64)) if err != nil { return nil, err @@ -311,6 +348,32 @@ func (c *bn256ScalarMul) Run(input []byte) ([]byte, error) { return res.Marshal(), nil } +// bn256ScalarMulIstanbul implements a native elliptic curve scalar +// multiplication conforming to Istanbul consensus rules. +type bn256ScalarMulIstanbul struct{} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bn256ScalarMulIstanbul) RequiredGas(input []byte) uint64 { + return params.Bn256ScalarMulGasIstanbul +} + +func (c *bn256ScalarMulIstanbul) Run(input []byte) ([]byte, error) { + return runBn256ScalarMul(input) +} + +// bn256ScalarMulByzantium implements a native elliptic curve scalar +// multiplication conforming to Byzantium consensus rules. +type bn256ScalarMulByzantium struct{} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bn256ScalarMulByzantium) RequiredGas(input []byte) uint64 { + return params.Bn256ScalarMulGasByzantium +} + +func (c *bn256ScalarMulByzantium) Run(input []byte) ([]byte, error) { + return runBn256ScalarMul(input) +} + 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} @@ -322,15 +385,9 @@ var ( 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) { +// runBn256Pairing implements the Bn256Pairing precompile, referenced by both +// Byzantium and Istanbul operations. +func runBn256Pairing(input []byte) ([]byte, error) { // Handle some corner cases cheaply if len(input)%192 > 0 { return nil, errBadPairingInput @@ -358,3 +415,90 @@ func (c *bn256Pairing) Run(input []byte) ([]byte, error) { } return false32Byte, nil } + +// bn256PairingIstanbul implements a pairing pre-compile for the bn256 curve +// conforming to Istanbul consensus rules. +type bn256PairingIstanbul struct{} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bn256PairingIstanbul) RequiredGas(input []byte) uint64 { + return params.Bn256PairingBaseGasIstanbul + uint64(len(input)/192)*params.Bn256PairingPerPointGasIstanbul +} + +func (c *bn256PairingIstanbul) Run(input []byte) ([]byte, error) { + return runBn256Pairing(input) +} + +// bn256PairingByzantium implements a pairing pre-compile for the bn256 curve +// conforming to Byzantium consensus rules. +type bn256PairingByzantium struct{} + +// RequiredGas returns the gas required to execute the pre-compiled contract. +func (c *bn256PairingByzantium) RequiredGas(input []byte) uint64 { + return params.Bn256PairingBaseGasByzantium + uint64(len(input)/192)*params.Bn256PairingPerPointGasByzantium +} + +func (c *bn256PairingByzantium) Run(input []byte) ([]byte, error) { + return runBn256Pairing(input) +} + +type blake2F struct{} + +func (c *blake2F) RequiredGas(input []byte) uint64 { + // If the input is malformed, we can't calculate the gas, return 0 and let the + // actual call choke and fault. + if len(input) != blake2FInputLength { + return 0 + } + return uint64(binary.BigEndian.Uint32(input[0:4])) +} + +const ( + blake2FInputLength = 213 + blake2FFinalBlockBytes = byte(1) + blake2FNonFinalBlockBytes = byte(0) +) + +var ( + errBlake2FInvalidInputLength = errors.New("invalid input length") + errBlake2FInvalidFinalFlag = errors.New("invalid final flag") +) + +func (c *blake2F) Run(input []byte) ([]byte, error) { + // Make sure the input is valid (correct lenth and final flag) + if len(input) != blake2FInputLength { + return nil, errBlake2FInvalidInputLength + } + if input[212] != blake2FNonFinalBlockBytes && input[212] != blake2FFinalBlockBytes { + return nil, errBlake2FInvalidFinalFlag + } + // Parse the input into the Blake2b call parameters + var ( + rounds = binary.BigEndian.Uint32(input[0:4]) + final = (input[212] == blake2FFinalBlockBytes) + + h [8]uint64 + m [16]uint64 + t [2]uint64 + ) + for i := 0; i < 8; i++ { + offset := 4 + i*8 + h[i] = binary.LittleEndian.Uint64(input[offset : offset+8]) + } + for i := 0; i < 16; i++ { + offset := 68 + i*8 + m[i] = binary.LittleEndian.Uint64(input[offset : offset+8]) + } + t[0] = binary.LittleEndian.Uint64(input[196:204]) + t[1] = binary.LittleEndian.Uint64(input[204:212]) + + // Execute the compression function, extract and return the result + blake2b.F(&h, m, t, final, rounds) + + output := make([]byte, 64) + for i := 0; i < 8; i++ { + offset := i * 8 + binary.LittleEndian.PutUint64(output[offset:offset+8], h[i]) + } + return output, nil +} diff --git a/core/vm/contracts_test.go b/core/vm/contracts_test.go index e25ec5410434..be003a60c95d 100644 --- a/core/vm/contracts_test.go +++ b/core/vm/contracts_test.go @@ -17,21 +17,30 @@ package vm import ( + "bytes" "fmt" "math/big" + "reflect" "testing" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) // precompiledTest defines the input/output pairs for precompiled contract tests. type precompiledTest struct { input, expected string - gas uint64 name string noBenchmark bool // Benchmark primarily the worst-cases } +// precompiledFailureTest defines the input/error pairs for precompiled +// contract failure tests. +type precompiledFailureTest struct { + input string + expectedError error + name string +} + // modexpTests are the test and benchmark data for the modexp precompiled contract. var modexpTests = []precompiledTest{ { @@ -336,8 +345,61 @@ var bn256PairingTests = []precompiledTest{ }, } +// EIP-152 test vectors +var blake2FMalformedInputTests = []precompiledFailureTest{ + { + input: "", + expectedError: errBlake2FInvalidInputLength, + name: "vector 0: empty input", + }, + { + input: "00000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + expectedError: errBlake2FInvalidInputLength, + name: "vector 1: less than 213 bytes input", + }, + { + input: "000000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + expectedError: errBlake2FInvalidInputLength, + name: "vector 2: more than 213 bytes input", + }, + { + input: "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000002", + expectedError: errBlake2FInvalidFinalFlag, + name: "vector 3: malformed final block indicator flag", + }, +} + +// EIP-152 test vectors +var blake2FTests = []precompiledTest{ + { + input: "0000000048c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + expected: "08c9bcf367e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d282e6ad7f520e511f6c3e2b8c68059b9442be0454267ce079217e1319cde05b", + name: "vector 4", + }, + { // https://tools.ietf.org/html/rfc7693#appendix-A + input: "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + expected: "ba80a53f981c4d0d6a2797b69f12f6e94c212f14685ac4b74b12bb6fdbffa2d17d87c5392aab792dc252d5de4533cc9518d38aa8dbf1925ab92386edd4009923", + name: "vector 5", + }, + { + input: "0000000c48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000", + expected: "75ab69d3190a562c51aef8d88f1c2775876944407270c42c9844252c26d2875298743e7f6d5ea2f2d3e8d226039cd31b4e426ac4f2d3d666a610c2116fde4735", + name: "vector 6", + }, + { + input: "0000000148c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + expected: "b63a380cb2897d521994a85234ee2c181b5f844d2c624c002677e9703449d2fba551b3a8333bcdf5f2f7e08993d53923de3d64fcc68c034e717b9293fed7a421", + name: "vector 7", + }, + { + input: "007A120048c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5d182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000001", + expected: "6d2ce9e534d50e18ff866ae92d70cceba79bbcd14c63819fe48752c8aca87a4bb7dcc230d22a4047f0486cfcfb50a17b24b2899eb8fca370f22240adb5170189", + name: "vector 8", + }, +} + func testPrecompiled(addr string, test precompiledTest, t *testing.T) { - p := PrecompiledContractsByzantium[common.HexToAddress(addr)] + p := PrecompiledContractsIstanbul[common.HexToAddress(addr)] in := common.Hex2Bytes(test.input) contract := NewContract(AccountRef(common.HexToAddress("1337")), nil, new(big.Int), p.RequiredGas(in)) @@ -347,6 +409,48 @@ func testPrecompiled(addr string, test precompiledTest, t *testing.T) { } else if common.Bytes2Hex(res) != test.expected { t.Errorf("Expected %v, got %v", test.expected, common.Bytes2Hex(res)) } + // Verify that the precompile did not touch the input buffer + exp := common.Hex2Bytes(test.input) + if !bytes.Equal(in, exp) { + t.Errorf("Precompiled %v modified input data", addr) + } + }) +} + +func testPrecompiledOOG(addr string, test precompiledTest, t *testing.T) { + p := PrecompiledContractsIstanbul[common.HexToAddress(addr)] + in := common.Hex2Bytes(test.input) + contract := NewContract(AccountRef(common.HexToAddress("1337")), + nil, new(big.Int), p.RequiredGas(in)-1) + t.Run(fmt.Sprintf("%s-Gas=%d", test.name, contract.Gas), func(t *testing.T) { + _, err := RunPrecompiledContract(p, in, contract) + if err.Error() != "out of gas" { + t.Errorf("Expected error [out of gas], got [%v]", err) + } + // Verify that the precompile did not touch the input buffer + exp := common.Hex2Bytes(test.input) + if !bytes.Equal(in, exp) { + t.Errorf("Precompiled %v modified input data", addr) + } + }) +} + +func testPrecompiledFailure(addr string, test precompiledFailureTest, t *testing.T) { + p := PrecompiledContractsIstanbul[common.HexToAddress(addr)] + in := common.Hex2Bytes(test.input) + contract := NewContract(AccountRef(common.HexToAddress("31337")), + nil, new(big.Int), p.RequiredGas(in)) + + t.Run(test.name, func(t *testing.T) { + _, err := RunPrecompiledContract(p, in, contract) + if !reflect.DeepEqual(err, test.expectedError) { + t.Errorf("Expected error [%v], got [%v]", test.expectedError, err) + } + // Verify that the precompile did not touch the input buffer + exp := common.Hex2Bytes(test.input) + if !bytes.Equal(in, exp) { + t.Errorf("Precompiled %v modified input data", addr) + } }) } @@ -354,7 +458,7 @@ func benchmarkPrecompiled(addr string, test precompiledTest, bench *testing.B) { if test.noBenchmark { return } - p := PrecompiledContractsByzantium[common.HexToAddress(addr)] + p := PrecompiledContractsIstanbul[common.HexToAddress(addr)] in := common.Hex2Bytes(test.input) reqGas := p.RequiredGas(in) contract := NewContract(AccountRef(common.HexToAddress("1337")), @@ -454,6 +558,13 @@ func BenchmarkPrecompiledBn256Add(bench *testing.B) { } } +// Tests OOG +func TestPrecompiledModExpOOG(t *testing.T) { + for _, test := range modexpTests { + testPrecompiledOOG("05", test, t) + } +} + // Tests the sample inputs from the elliptic curve scalar multiplication EIP 213. func TestPrecompiledBn256ScalarMul(t *testing.T) { for _, test := range bn256ScalarMulTests { @@ -481,3 +592,72 @@ func BenchmarkPrecompiledBn256Pairing(bench *testing.B) { benchmarkPrecompiled("08", test, bench) } } +func TestPrecompiledBlake2F(t *testing.T) { + for _, test := range blake2FTests { + testPrecompiled("09", test, t) + } +} + +func BenchmarkPrecompiledBlake2F(bench *testing.B) { + for _, test := range blake2FTests { + benchmarkPrecompiled("09", test, bench) + } +} + +func TestPrecompileBlake2FMalformedInput(t *testing.T) { + for _, test := range blake2FMalformedInputTests { + testPrecompiledFailure("09", test, t) + } +} + +// EcRecover test vectors +var ecRecoverTests = []precompiledTest{ + { + input: "a8b53bdf3306a35a7103ab5504a0c9b492295564b6202b1942a84ef300107281" + + "000000000000000000000000000000000000000000000000000000000000001b" + + "3078356531653033663533636531386237373263636230303933666637316633" + + "6635336635633735623734646362333161383561613862383839326234653862" + + "1122334455667788991011121314151617181920212223242526272829303132", + expected: "", + name: "CallEcrecoverUnrecoverableKey", + }, + { + input: "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c" + + "000000000000000000000000000000000000000000000000000000000000001c" + + "73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f" + + "eeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549", + expected: "000000000000000000000000a94f5374fce5edbc8e2a8697c15331677e6ebf0b", + name: "ValidKey", + }, + { + input: "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c" + + "100000000000000000000000000000000000000000000000000000000000001c" + + "73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f" + + "eeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549", + expected: "", + name: "InvalidHighV-bits-1", + }, + { + input: "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c" + + "000000000000000000000000000000000000001000000000000000000000001c" + + "73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f" + + "eeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549", + expected: "", + name: "InvalidHighV-bits-2", + }, + { + input: "18c547e4f7b0f325ad1e56f57e26c745b09a3e503d86e00e5255ff7f715d3d1c" + + "000000000000000000000000000000000000001000000000000000000000011c" + + "73b1693892219d736caba55bdb67216e485557ea6b6af75f37096c9aa6a5a75f" + + "eeb940b1d03b21e36b0e47e79769f095fe2ab855bd91e3a38756b7d75a9c4549", + expected: "", + name: "InvalidHighV-bits-3", + }, +} + +func TestPrecompiledEcrecover(t *testing.T) { + for _, test := range ecRecoverTests { + testPrecompiled("01", test, t) + } + +} diff --git a/core/vm/eips.go b/core/vm/eips.go new file mode 100644 index 000000000000..075f5b760669 --- /dev/null +++ b/core/vm/eips.go @@ -0,0 +1,92 @@ +// Copyright 2019 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 ( + "fmt" + + "github.com/ethereum/go-ethereum/params" +) + +// EnableEIP enables the given EIP on the config. +// This operation writes in-place, and callers need to ensure that the globally +// defined jump tables are not polluted. +func EnableEIP(eipNum int, jt *JumpTable) error { + switch eipNum { + case 2200: + enable2200(jt) + case 1884: + enable1884(jt) + case 1344: + enable1344(jt) + default: + return fmt.Errorf("undefined eip %d", eipNum) + } + return nil +} + +// enable1884 applies EIP-1884 to the given jump table: +// - Increase cost of BALANCE to 700 +// - Increase cost of EXTCODEHASH to 700 +// - Increase cost of SLOAD to 800 +// - Define SELFBALANCE, with cost GasFastStep (5) +func enable1884(jt *JumpTable) { + // Gas cost changes + jt[BALANCE].constantGas = params.BalanceGasEIP1884 + jt[EXTCODEHASH].constantGas = params.ExtcodeHashGasEIP1884 + jt[SLOAD].constantGas = params.SloadGasEIP1884 + + // New opcode + jt[SELFBALANCE] = operation{ + execute: opSelfBalance, + constantGas: GasFastStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, + } +} + +func opSelfBalance(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { + balance := interpreter.intPool.get().Set(interpreter.evm.StateDB.GetBalance(contract.Address())) + stack.push(balance) + return nil, nil +} + +// enable1344 applies EIP-1344 (ChainID Opcode) +// - Adds an opcode that returns the current chain’s EIP-155 unique identifier +func enable1344(jt *JumpTable) { + // New opcode + jt[CHAINID] = operation{ + execute: opChainID, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, + } +} + +// opChainID implements CHAINID opcode +func opChainID(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { + chainId := interpreter.intPool.get().Set(interpreter.evm.chainConfig.ChainID) + stack.push(chainId) + return nil, nil +} + +// enable2200 applies EIP-2200 (Rebalance net-metered SSTORE) +func enable2200(jt *JumpTable) { + jt[SSTORE].dynamicGas = gasSStoreEIP2200 +} diff --git a/core/vm/evm.go b/core/vm/evm.go index b033f60cdbfa..751c1fdc1f41 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -21,9 +21,9 @@ import ( "sync/atomic" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" ) // emptyCodeHash is used by create to ensure deployment is disallowed to already @@ -35,7 +35,7 @@ type ( CanTransferFunc func(StateDB, common.Address, *big.Int) bool // TransferFunc is the signature of a transfer function TransferFunc func(StateDB, common.Address, common.Address, *big.Int) - // GetHashFunc returns the nth block hash in the blockchain + // GetHashFunc returns the n'th block hash in the blockchain // and is used by the BLOCKHASH EVM op code. GetHashFunc func(uint64) common.Hash ) @@ -44,9 +44,12 @@ type ( func run(evm *EVM, contract *Contract, input []byte, readOnly bool) ([]byte, error) { if contract.CodeAddr != nil { precompiles := PrecompiledContractsHomestead - if evm.ChainConfig().IsByzantium(evm.BlockNumber) { + if evm.chainRules.IsByzantium { precompiles = PrecompiledContractsByzantium } + if evm.chainRules.IsIstanbul { + precompiles = PrecompiledContractsIstanbul + } if p := precompiles[*contract.CodeAddr]; p != nil { return RunPrecompiledContract(p, input, contract) } @@ -169,6 +172,11 @@ func (evm *EVM) Cancel() { atomic.StoreInt32(&evm.abort, 1) } +// Cancelled returns true if Cancel has been called +func (evm *EVM) Cancelled() bool { + return atomic.LoadInt32(&evm.abort) == 1 +} + // Interpreter returns the current interpreter func (evm *EVM) Interpreter() Interpreter { return evm.interpreter @@ -198,10 +206,13 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas ) if !evm.StateDB.Exist(addr) { precompiles := PrecompiledContractsHomestead - if evm.ChainConfig().IsByzantium(evm.BlockNumber) { + if evm.chainRules.IsByzantium { precompiles = PrecompiledContractsByzantium } - if precompiles[addr] == nil && evm.ChainConfig().IsEIP158(evm.BlockNumber) && value.Sign() == 0 { + if evm.chainRules.IsIstanbul { + precompiles = PrecompiledContractsIstanbul + } + if precompiles[addr] == nil && evm.chainRules.IsEIP158 && value.Sign() == 0 { // Calling a non existing account, don't do anything, but ping the tracer if evm.vmConfig.Debug && evm.depth == 0 { evm.vmConfig.Tracer.CaptureStart(caller.Address(), addr, false, input, gas, value) @@ -267,9 +278,8 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, snapshot = evm.StateDB.Snapshot() to = AccountRef(caller.Address()) ) - // 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. + // 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, value, gas) contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr)) @@ -333,9 +343,8 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte 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. + // 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)) @@ -391,14 +400,13 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, // Create a new account on the state snapshot := evm.StateDB.Snapshot() evm.StateDB.CreateAccount(address) - if evm.ChainConfig().IsEIP158(evm.BlockNumber) { + if evm.chainRules.IsEIP158 { evm.StateDB.SetNonce(address, 1) } evm.Transfer(evm.StateDB, caller.Address(), address, value) - // 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. + // 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, AccountRef(address), value, gas) contract.SetCodeOptionalHash(&address, codeAndHash) @@ -414,7 +422,7 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, ret, err := run(evm, contract, nil, false) // check whether the max code size has been exceeded - maxCodeSizeExceeded := evm.ChainConfig().IsEIP158(evm.BlockNumber) && len(ret) > params.MaxCodeSize + maxCodeSizeExceeded := evm.chainRules.IsEIP158 && 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 @@ -431,7 +439,7 @@ func (evm *EVM) create(caller ContractRef, codeAndHash *codeAndHash, gas uint64, // 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)) { + if maxCodeSizeExceeded || (err != nil && (evm.chainRules.IsHomestead || err != ErrCodeStoreOutOfGas)) { evm.StateDB.RevertToSnapshot(snapshot) if err != errExecutionReverted { contract.UseGas(contract.Gas) diff --git a/core/vm/gas.go b/core/vm/gas.go index ade8f6635fa9..bd8b4f1042fa 100644 --- a/core/vm/gas.go +++ b/core/vm/gas.go @@ -18,8 +18,6 @@ package vm import ( "math/big" - - "github.com/nebulaai/nbai-node/params" ) // Gas costs @@ -30,28 +28,24 @@ const ( GasMidStep uint64 = 8 GasSlowStep uint64 = 10 GasExtStep uint64 = 20 - - GasReturn uint64 = 0 - GasStop uint64 = 0 - GasContractByte uint64 = 200 ) // calcGas returns the actual gas cost of the call. // -// The cost of gas was changed during the homestead price change HF. To allow for EIP150 -// to be implemented. The returned gas is gas - base * 63 / 64. -func callGas(gasTable params.GasTable, availableGas, base uint64, callCost *big.Int) (uint64, error) { - if gasTable.CreateBySuicide > 0 { +// The cost of gas was changed during the homestead price change HF. +// As part of EIP 150 (TangerineWhistle), the returned gas is gas - base * 63 / 64. +func callGas(isEip150 bool, availableGas, base uint64, callCost *big.Int) (uint64, error) { + if isEip150 { availableGas = availableGas - base gas := availableGas - availableGas/64 // If the bit length exceeds 64 bit we know that the newly calculated "gas" for EIP150 // is smaller than the requested amount. Therefor we return the new gas instead // of returning an error. - if callCost.BitLen() > 64 || gas < callCost.Uint64() { + if !callCost.IsUint64() || gas < callCost.Uint64() { return gas, nil } } - if callCost.BitLen() > 64 { + if !callCost.IsUint64() { return 0, errGasUintOverflow } diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go index c2f4c51a574d..1d3c4f1003e0 100644 --- a/core/vm/gas_table.go +++ b/core/vm/gas_table.go @@ -17,29 +17,27 @@ package vm import ( - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/params" + "errors" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/params" ) -// memoryGasCosts calculates the quadratic gas for memory expansion. It does so +// memoryGasCost calculates the quadratic gas for memory expansion. It does so // only for the memory region that is expanded, not the total memory. func memoryGasCost(mem *Memory, newMemSize uint64) (uint64, error) { - if newMemSize == 0 { return 0, nil } - // The maximum that will fit in a uint64 is max_word_count - 1 - // anything above that will result in an overflow. - // Additionally, a newMemSize which results in a - // newMemSizeWords larger than 0x7ffffffff will cause the square operation - // to overflow. - // The constant 0xffffffffe0 is the highest number that can be used without - // overflowing the gas calculation - if newMemSize > 0xffffffffe0 { + // The maximum that will fit in a uint64 is max_word_count - 1. Anything above + // that will result in an overflow. Additionally, a newMemSize which results in + // a newMemSizeWords larger than 0xFFFFFFFF will cause the square operation to + // overflow. The constant 0x1FFFFFFFE0 is the highest number that can be used + // without overflowing the gas calculation. + if newMemSize > 0x1FFFFFFFE0 { return 0, errGasUintOverflow } - newMemSizeWords := toWordSize(newMemSize) newMemSize = newMemSizeWords * 32 @@ -57,71 +55,53 @@ func memoryGasCost(mem *Memory, newMemSize uint64) (uint64, error) { return 0, nil } -func constGasFunc(gas uint64) gasFunc { - return func(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - return gas, nil - } -} - -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 - } +// memoryCopierGas creates the gas functions for the following opcodes, and takes +// the stack position of the operand which determines the size of the data to copy +// as argument: +// CALLDATACOPY (stack position 2) +// CODECOPY (stack position 2) +// EXTCODECOPY (stack poition 3) +// RETURNDATACOPY (stack position 2) +func memoryCopierGas(stackpos int) gasFunc { + return func(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + // Gas for expanding the memory + gas, err := memoryGasCost(mem, memorySize) + if err != nil { + return 0, err + } + // And gas for copying data, charged per word at param.CopyGas + words, overflow := bigUint64(stack.Back(stackpos)) + if overflow { + return 0, errGasUintOverflow + } - if words, overflow = math.SafeMul(toWordSize(words), params.CopyGas); 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 + if gas, overflow = math.SafeAdd(gas, words); overflow { + return 0, errGasUintOverflow + } + return gas, nil } - return gas, nil } -func gasReturnDataCopy(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - gas, err := memoryGasCost(mem, memorySize) - if err != nil { - return 0, err - } - - var overflow bool - if gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow { - return 0, errGasUintOverflow - } - - words, overflow := bigUint64(stack.Back(2)) - if overflow { - return 0, errGasUintOverflow - } - - if words, overflow = math.SafeMul(toWordSize(words), params.CopyGas); overflow { - return 0, errGasUintOverflow - } - - if gas, overflow = math.SafeAdd(gas, words); overflow { - return 0, errGasUintOverflow - } - return gas, nil -} +var ( + gasCallDataCopy = memoryCopierGas(2) + gasCodeCopy = memoryCopierGas(2) + gasExtCodeCopy = memoryCopierGas(3) + gasReturnDataCopy = memoryCopierGas(2) +) -func gasSStore(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { +func gasSStore(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { var ( y, x = stack.Back(1), stack.Back(0) current = evm.StateDB.GetState(contract.Address(), common.BigToHash(x)) ) // The legacy gas metering only takes into consideration the current state - if !evm.chainRules.IsConstantinople { + // Legacy rules should be applied if we are in Petersburg (removal of EIP-1283) + // OR Constantinople is not active + if evm.chainRules.IsPetersburg || !evm.chainRules.IsConstantinople { // This checks for 3 scenario's and calculates gas accordingly: // // 1. From a zero-value address to a non-zero value (NEW VALUE) @@ -182,8 +162,63 @@ func gasSStore(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, m return params.NetSstoreDirtyGas, nil } +// 0. If *gasleft* is less than or equal to 2300, fail the current call. +// 1. If current value equals new value (this is a no-op), SSTORE_NOOP_GAS gas is deducted. +// 2. If current value does not equal new value: +// 2.1. If original value equals current value (this storage slot has not been changed by the current execution context): +// 2.1.1. If original value is 0, SSTORE_INIT_GAS gas is deducted. +// 2.1.2. Otherwise, SSTORE_CLEAN_GAS gas is deducted. If new value is 0, add SSTORE_CLEAR_REFUND to refund counter. +// 2.2. If original value does not equal current value (this storage slot is dirty), SSTORE_DIRTY_GAS gas is deducted. Apply both of the following clauses: +// 2.2.1. If original value is not 0: +// 2.2.1.1. If current value is 0 (also means that new value is not 0), subtract SSTORE_CLEAR_REFUND gas from refund counter. We can prove that refund counter will never go below 0. +// 2.2.1.2. If new value is 0 (also means that current value is not 0), add SSTORE_CLEAR_REFUND gas to refund counter. +// 2.2.2. If original value equals new value (this storage slot is reset): +// 2.2.2.1. If original value is 0, add SSTORE_INIT_REFUND to refund counter. +// 2.2.2.2. Otherwise, add SSTORE_CLEAN_REFUND gas to refund counter. +func gasSStoreEIP2200(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + // If we fail the minimum gas availability invariant, fail (0) + if contract.Gas <= params.SstoreSentryGasEIP2200 { + return 0, errors.New("not enough gas for reentrancy sentry") + } + // Gas sentry honoured, do the actual gas calculation based on the stored value + var ( + y, x = stack.Back(1), stack.Back(0) + current = evm.StateDB.GetState(contract.Address(), common.BigToHash(x)) + ) + value := common.BigToHash(y) + + if current == value { // noop (1) + return params.SstoreNoopGasEIP2200, nil + } + original := evm.StateDB.GetCommittedState(contract.Address(), common.BigToHash(x)) + if original == current { + if original == (common.Hash{}) { // create slot (2.1.1) + return params.SstoreInitGasEIP2200, nil + } + if value == (common.Hash{}) { // delete slot (2.1.2b) + evm.StateDB.AddRefund(params.SstoreClearRefundEIP2200) + } + return params.SstoreCleanGasEIP2200, nil // write existing slot (2.1.2) + } + if original != (common.Hash{}) { + if current == (common.Hash{}) { // recreate slot (2.2.1.1) + evm.StateDB.SubRefund(params.SstoreClearRefundEIP2200) + } else if value == (common.Hash{}) { // delete slot (2.2.1.2) + evm.StateDB.AddRefund(params.SstoreClearRefundEIP2200) + } + } + if original == value { + if original == (common.Hash{}) { // reset to original inexistent slot (2.2.2.1) + evm.StateDB.AddRefund(params.SstoreInitRefundEIP2200) + } else { // reset to original existing slot (2.2.2.2) + evm.StateDB.AddRefund(params.SstoreCleanRefundEIP2200) + } + } + return params.SstoreDirtyGasEIP2200, nil // dirty update (2.2) +} + func makeGasLog(n uint64) gasFunc { - return func(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + return func(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { requestedSize, overflow := bigUint64(stack.Back(1)) if overflow { return 0, errGasUintOverflow @@ -212,17 +247,11 @@ func makeGasLog(n uint64) gasFunc { } } -func gasSha3(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - var overflow bool +func gasSha3(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err } - - if gas, overflow = math.SafeAdd(gas, params.Sha3Gas); overflow { - return 0, errGasUintOverflow - } - wordGas, overflow := bigUint64(stack.Back(1)) if overflow { return 0, errGasUintOverflow @@ -236,117 +265,27 @@ func gasSha3(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem return gas, nil } -func gasCodeCopy(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 - } - - wordGas, overflow := bigUint64(stack.Back(2)) - if overflow { - return 0, errGasUintOverflow - } - if wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.CopyGas); overflow { - return 0, errGasUintOverflow - } - if gas, overflow = math.SafeAdd(gas, wordGas); overflow { - return 0, errGasUintOverflow - } - return gas, nil -} - -func gasExtCodeCopy(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.ExtcodeCopy); overflow { - return 0, errGasUintOverflow - } - - wordGas, overflow := bigUint64(stack.Back(3)) - if overflow { - return 0, errGasUintOverflow - } - - if wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.CopyGas); overflow { - return 0, errGasUintOverflow - } - - if gas, overflow = math.SafeAdd(gas, wordGas); overflow { - return 0, errGasUintOverflow - } - return gas, nil -} - -func gasExtCodeHash(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - return gt.ExtcodeHash, nil -} - -func gasMLoad(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - var overflow bool - gas, err := memoryGasCost(mem, memorySize) - if err != nil { - return 0, errGasUintOverflow - } - if gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow { - return 0, errGasUintOverflow - } - return gas, nil -} - -func gasMStore8(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - var overflow bool - gas, err := memoryGasCost(mem, memorySize) - if err != nil { - return 0, errGasUintOverflow - } - if gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow { - return 0, errGasUintOverflow - } - return gas, nil -} - -func gasMStore(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - var overflow bool - gas, err := memoryGasCost(mem, memorySize) - if err != nil { - return 0, errGasUintOverflow - } - if gas, overflow = math.SafeAdd(gas, GasFastestStep); overflow { - return 0, errGasUintOverflow - } - return gas, nil +// pureMemoryGascost is used by several operations, which aside from their +// static cost have a dynamic cost which is solely based on the memory +// expansion +func pureMemoryGascost(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + return memoryGasCost(mem, memorySize) } -func gasCreate(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - var overflow bool - gas, err := memoryGasCost(mem, memorySize) - if err != nil { - return 0, err - } - if gas, overflow = math.SafeAdd(gas, params.CreateGas); overflow { - return 0, errGasUintOverflow - } - return gas, nil -} +var ( + gasReturn = pureMemoryGascost + gasRevert = pureMemoryGascost + gasMLoad = pureMemoryGascost + gasMStore8 = pureMemoryGascost + gasMStore = pureMemoryGascost + gasCreate = pureMemoryGascost +) -func gasCreate2(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - var overflow bool +func gasCreate2(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { gas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err } - if gas, overflow = math.SafeAdd(gas, params.Create2Gas); overflow { - return 0, errGasUintOverflow - } wordGas, overflow := bigUint64(stack.Back(2)) if overflow { return 0, errGasUintOverflow @@ -357,43 +296,42 @@ func gasCreate2(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, if gas, overflow = math.SafeAdd(gas, wordGas); overflow { return 0, errGasUintOverflow } - return gas, nil } -func gasBalance(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - return gt.Balance, nil -} - -func gasExtCodeSize(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - return gt.ExtcodeSize, nil -} +func gasExpFrontier(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + expByteLen := uint64((stack.data[stack.len()-2].BitLen() + 7) / 8) -func gasSLoad(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - return gt.SLoad, nil + var ( + gas = expByteLen * params.ExpByteFrontier // no overflow check required. Max is 256 * ExpByte gas + overflow bool + ) + if gas, overflow = math.SafeAdd(gas, params.ExpGas); overflow { + return 0, errGasUintOverflow + } + return gas, nil } -func gasExp(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { +func gasExpEIP158(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { expByteLen := uint64((stack.data[stack.len()-2].BitLen() + 7) / 8) var ( - gas = expByteLen * gt.ExpByte // no overflow check required. Max is 256 * ExpByte gas + gas = expByteLen * params.ExpByteEIP158 // no overflow check required. Max is 256 * ExpByte gas overflow bool ) - if gas, overflow = math.SafeAdd(gas, GasSlowStep); overflow { + if gas, overflow = math.SafeAdd(gas, params.ExpGas); overflow { return 0, errGasUintOverflow } return gas, nil } -func gasCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { +func gasCall(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { var ( - gas = gt.Calls + gas uint64 transfersValue = stack.Back(2).Sign() != 0 address = common.BigToAddress(stack.Back(1)) - eip158 = evm.ChainConfig().IsEIP158(evm.BlockNumber) ) - if eip158 { + if evm.chainRules.IsEIP158 { if transfersValue && evm.StateDB.Empty(address) { gas += params.CallNewAccountGas } @@ -412,7 +350,7 @@ func gasCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem return 0, errGasUintOverflow } - evm.callGasTemp, err = callGas(gt, contract.Gas, gas, stack.Back(0)) + evm.callGasTemp, err = callGas(evm.chainRules.IsEIP150, contract.Gas, gas, stack.Back(0)) if err != nil { return 0, err } @@ -422,21 +360,22 @@ func gasCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem return gas, nil } -func gasCallCode(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - gas := gt.Calls - if stack.Back(2).Sign() != 0 { - gas += params.CallValueTransferGas - } +func gasCallCode(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { memoryGas, err := memoryGasCost(mem, memorySize) if err != nil { return 0, err } - var overflow bool + var ( + gas uint64 + overflow bool + ) + if stack.Back(2).Sign() != 0 { + gas += params.CallValueTransferGas + } if gas, overflow = math.SafeAdd(gas, memoryGas); overflow { return 0, errGasUintOverflow } - - evm.callGasTemp, err = callGas(gt, contract.Gas, gas, stack.Back(0)) + evm.callGasTemp, err = callGas(evm.chainRules.IsEIP150, contract.Gas, gas, stack.Back(0)) if err != nil { return 0, err } @@ -446,88 +385,57 @@ func gasCallCode(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, return gas, nil } -func gasReturn(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - 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: - if evm.ChainConfig().IsEIP150(evm.BlockNumber) { - gas = gt.Suicide - var ( - address = common.BigToAddress(stack.Back(0)) - eip158 = evm.ChainConfig().IsEIP158(evm.BlockNumber) - ) - - if eip158 { - // if empty and transfers value - if evm.StateDB.Empty(address) && evm.StateDB.GetBalance(contract.Address()).Sign() != 0 { - gas += gt.CreateBySuicide - } - } else if !evm.StateDB.Exist(address) { - gas += gt.CreateBySuicide - } - } - - if !evm.StateDB.HasSuicided(contract.Address()) { - evm.StateDB.AddRefund(params.SuicideRefundGas) - } - return gas, nil -} - -func gasDelegateCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { +func gasDelegateCall(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 - } - - evm.callGasTemp, err = callGas(gt, contract.Gas, gas, stack.Back(0)) + evm.callGasTemp, err = callGas(evm.chainRules.IsEIP150, contract.Gas, gas, stack.Back(0)) if err != nil { return 0, err } + var overflow bool if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); overflow { return 0, errGasUintOverflow } return gas, nil } -func gasStaticCall(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { +func gasStaticCall(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 - } - - evm.callGasTemp, err = callGas(gt, contract.Gas, gas, stack.Back(0)) + evm.callGasTemp, err = callGas(evm.chainRules.IsEIP150, contract.Gas, gas, stack.Back(0)) if err != nil { return 0, err } + var overflow bool if gas, overflow = math.SafeAdd(gas, evm.callGasTemp); 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 -} +func gasSelfdestruct(evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { + var gas uint64 + // EIP150 homestead gas reprice fork: + if evm.chainRules.IsEIP150 { + gas = params.SelfdestructGasEIP150 + var address = common.BigToAddress(stack.Back(0)) -func gasSwap(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - return GasFastestStep, nil -} + if evm.chainRules.IsEIP158 { + // if empty and transfers value + if evm.StateDB.Empty(address) && evm.StateDB.GetBalance(contract.Address()).Sign() != 0 { + gas += params.CreateBySelfdestructGas + } + } else if !evm.StateDB.Exist(address) { + gas += params.CreateBySelfdestructGas + } + } -func gasDup(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack, mem *Memory, memorySize uint64) (uint64, error) { - return GasFastestStep, nil + if !evm.StateDB.HasSuicided(contract.Address()) { + evm.StateDB.AddRefund(params.SelfdestructRefundGas) + } + return gas, nil } diff --git a/core/vm/gas_table_test.go b/core/vm/gas_table_test.go index 1b91aee56c66..5d443de0eae6 100644 --- a/core/vm/gas_table_test.go +++ b/core/vm/gas_table_test.go @@ -16,21 +16,92 @@ package vm -import "testing" +import ( + "math" + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/params" +) func TestMemoryGasCost(t *testing.T) { - //size := uint64(math.MaxUint64 - 64) - size := uint64(0xffffffffe0) - v, err := memoryGasCost(&Memory{}, size) - if err != nil { - t.Error("didn't expect error:", err) + tests := []struct { + size uint64 + cost uint64 + overflow bool + }{ + {0x1fffffffe0, 36028809887088637, false}, + {0x1fffffffe1, 0, true}, } - if v != 36028899963961341 { - t.Errorf("Expected: 36028899963961341, got %d", v) + for i, tt := range tests { + v, err := memoryGasCost(&Memory{}, tt.size) + if (err == errGasUintOverflow) != tt.overflow { + t.Errorf("test %d: overflow mismatch: have %v, want %v", i, err == errGasUintOverflow, tt.overflow) + } + if v != tt.cost { + t.Errorf("test %d: gas cost mismatch: have %v, want %v", i, v, tt.cost) + } } +} + +var eip2200Tests = []struct { + original byte + gaspool uint64 + input string + used uint64 + refund uint64 + failure error +}{ + {0, math.MaxUint64, "0x60006000556000600055", 1612, 0, nil}, // 0 -> 0 -> 0 + {0, math.MaxUint64, "0x60006000556001600055", 20812, 0, nil}, // 0 -> 0 -> 1 + {0, math.MaxUint64, "0x60016000556000600055", 20812, 19200, nil}, // 0 -> 1 -> 0 + {0, math.MaxUint64, "0x60016000556002600055", 20812, 0, nil}, // 0 -> 1 -> 2 + {0, math.MaxUint64, "0x60016000556001600055", 20812, 0, nil}, // 0 -> 1 -> 1 + {1, math.MaxUint64, "0x60006000556000600055", 5812, 15000, nil}, // 1 -> 0 -> 0 + {1, math.MaxUint64, "0x60006000556001600055", 5812, 4200, nil}, // 1 -> 0 -> 1 + {1, math.MaxUint64, "0x60006000556002600055", 5812, 0, nil}, // 1 -> 0 -> 2 + {1, math.MaxUint64, "0x60026000556000600055", 5812, 15000, nil}, // 1 -> 2 -> 0 + {1, math.MaxUint64, "0x60026000556003600055", 5812, 0, nil}, // 1 -> 2 -> 3 + {1, math.MaxUint64, "0x60026000556001600055", 5812, 4200, nil}, // 1 -> 2 -> 1 + {1, math.MaxUint64, "0x60026000556002600055", 5812, 0, nil}, // 1 -> 2 -> 2 + {1, math.MaxUint64, "0x60016000556000600055", 5812, 15000, nil}, // 1 -> 1 -> 0 + {1, math.MaxUint64, "0x60016000556002600055", 5812, 0, nil}, // 1 -> 1 -> 2 + {1, math.MaxUint64, "0x60016000556001600055", 1612, 0, nil}, // 1 -> 1 -> 1 + {0, math.MaxUint64, "0x600160005560006000556001600055", 40818, 19200, nil}, // 0 -> 1 -> 0 -> 1 + {1, math.MaxUint64, "0x600060005560016000556000600055", 10818, 19200, nil}, // 1 -> 0 -> 1 -> 0 + {1, 2306, "0x6001600055", 2306, 0, ErrOutOfGas}, // 1 -> 1 (2300 sentry + 2xPUSH) + {1, 2307, "0x6001600055", 806, 0, nil}, // 1 -> 1 (2301 sentry + 2xPUSH) +} + +func TestEIP2200(t *testing.T) { + for i, tt := range eip2200Tests { + address := common.BytesToAddress([]byte("contract")) + + statedb, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) + statedb.CreateAccount(address) + statedb.SetCode(address, hexutil.MustDecode(tt.input)) + statedb.SetState(address, common.Hash{}, common.BytesToHash([]byte{tt.original})) + statedb.Finalise(true) // Push the state into the "original" slot + + vmctx := Context{ + CanTransfer: func(StateDB, common.Address, *big.Int) bool { return true }, + Transfer: func(StateDB, common.Address, common.Address, *big.Int) {}, + } + vmenv := NewEVM(vmctx, statedb, params.AllEthashProtocolChanges, Config{ExtraEips: []int{2200}}) - _, err = memoryGasCost(&Memory{}, size+1) - if err == nil { - t.Error("expected error") + _, gas, err := vmenv.Call(AccountRef(common.Address{}), address, nil, tt.gaspool, new(big.Int)) + if err != tt.failure { + t.Errorf("test %d: failure mismatch: have %v, want %v", i, err, tt.failure) + } + if used := tt.gaspool - gas; used != tt.used { + t.Errorf("test %d: gas used mismatch: have %v, want %v", i, used, tt.used) + } + if refund := vmenv.StateDB.GetRefund(); refund != tt.refund { + t.Errorf("test %d: gas refund mismatch: have %v, want %v", i, refund, tt.refund) + } } } diff --git a/core/vm/gen_structlog.go b/core/vm/gen_structlog.go index bdc1f5df7569..726012e59ecf 100644 --- a/core/vm/gen_structlog.go +++ b/core/vm/gen_structlog.go @@ -6,9 +6,9 @@ import ( "encoding/json" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" ) var _ = (*structLogMarshaling)(nil) diff --git a/core/vm/instructions.go b/core/vm/instructions.go index ac01b79a9710..d65664b67df9 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -18,13 +18,12 @@ package vm import ( "errors" - "fmt" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" "golang.org/x/crypto/sha3" ) @@ -35,6 +34,7 @@ var ( errReturnDataOutOfBounds = errors.New("evm: return data out of bounds") errExecutionReverted = errors.New("evm: execution reverted") errMaxCodeSizeExceeded = errors.New("evm: max code size exceeded") + errInvalidJump = errors.New("evm: invalid jump destination") ) func opAdd(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { @@ -384,7 +384,7 @@ func opSAR(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory * func opSha3(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { offset, size := stack.pop(), stack.pop() - data := memory.Get(offset.Int64(), size.Int64()) + data := memory.GetPtr(offset.Int64(), size.Int64()) if interpreter.hasher == nil { interpreter.hasher = sha3.NewLegacyKeccak256().(keccakState) @@ -405,7 +405,7 @@ func opSha3(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory } func opAddress(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { - stack.push(contract.Address().Big()) + stack.push(interpreter.intPool.get().SetBytes(contract.Address().Bytes())) return nil, nil } @@ -416,12 +416,12 @@ func opBalance(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memo } func opOrigin(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { - stack.push(interpreter.evm.Origin.Big()) + stack.push(interpreter.intPool.get().SetBytes(interpreter.evm.Origin.Bytes())) return nil, nil } func opCaller(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { - stack.push(contract.Caller().Big()) + stack.push(interpreter.intPool.get().SetBytes(contract.Caller().Bytes())) return nil, nil } @@ -467,7 +467,7 @@ func opReturnDataCopy(pc *uint64, interpreter *EVMInterpreter, contract *Contrac ) defer interpreter.intPool.put(memOffset, dataOffset, length, end) - if end.BitLen() > 64 || uint64(len(interpreter.returnData)) < end.Uint64() { + if !end.IsUint64() || uint64(len(interpreter.returnData)) < end.Uint64() { return nil, errReturnDataOutOfBounds } memory.Set(memOffset.Uint64(), length.Uint64(), interpreter.returnData[dataOffset.Uint64():end.Uint64()]) @@ -572,7 +572,7 @@ func opBlockhash(pc *uint64, interpreter *EVMInterpreter, contract *Contract, me } func opCoinbase(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { - stack.push(interpreter.evm.Coinbase.Big()) + stack.push(interpreter.intPool.get().SetBytes(interpreter.evm.Coinbase.Bytes())) return nil, nil } @@ -602,11 +602,9 @@ func opPop(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory * } func opMload(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { - offset := stack.pop() - val := interpreter.intPool.get().SetBytes(memory.Get(offset.Int64(), 32)) - stack.push(val) - - interpreter.intPool.put(offset) + v := stack.peek() + offset := v.Int64() + v.SetBytes(memory.GetPtr(offset, 32)) return nil, nil } @@ -645,8 +643,7 @@ func opSstore(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memor func opJump(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { pos := stack.pop() if !contract.validJumpdest(pos) { - nop := contract.GetOp(pos.Uint64()) - return nil, fmt.Errorf("invalid jump destination (%v) %v", nop, pos) + return nil, errInvalidJump } *pc = pos.Uint64() @@ -658,8 +655,7 @@ func opJumpi(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory pos, cond := stack.pop(), stack.pop() if cond.Sign() != 0 { if !contract.validJumpdest(pos) { - nop := contract.GetOp(pos.Uint64()) - return nil, fmt.Errorf("invalid jump destination (%v) %v", nop, pos) + return nil, errInvalidJump } *pc = pos.Uint64() } else { @@ -693,10 +689,10 @@ func opCreate(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memor var ( value = stack.pop() offset, size = stack.pop(), stack.pop() - input = memory.Get(offset.Int64(), size.Int64()) + input = memory.GetCopy(offset.Int64(), size.Int64()) gas = contract.Gas ) - if interpreter.evm.ChainConfig().IsEIP150(interpreter.evm.BlockNumber) { + if interpreter.evm.chainRules.IsEIP150 { gas -= gas / 64 } @@ -706,12 +702,12 @@ func opCreate(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memor // homestead we must check for CodeStoreOutOfGasError (homestead only // rule) and treat as an error, if the ruleset is frontier we must // ignore this error and pretend the operation was successful. - if interpreter.evm.ChainConfig().IsHomestead(interpreter.evm.BlockNumber) && suberr == ErrCodeStoreOutOfGas { + if interpreter.evm.chainRules.IsHomestead && suberr == ErrCodeStoreOutOfGas { stack.push(interpreter.intPool.getZero()) } else if suberr != nil && suberr != ErrCodeStoreOutOfGas { stack.push(interpreter.intPool.getZero()) } else { - stack.push(addr.Big()) + stack.push(interpreter.intPool.get().SetBytes(addr.Bytes())) } contract.Gas += returnGas interpreter.intPool.put(value, offset, size) @@ -727,7 +723,7 @@ func opCreate2(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memo endowment = stack.pop() offset, size = stack.pop(), stack.pop() salt = stack.pop() - input = memory.Get(offset.Int64(), size.Int64()) + input = memory.GetCopy(offset.Int64(), size.Int64()) gas = contract.Gas ) @@ -739,7 +735,7 @@ func opCreate2(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memo if suberr != nil { stack.push(interpreter.intPool.getZero()) } else { - stack.push(addr.Big()) + stack.push(interpreter.intPool.get().SetBytes(addr.Bytes())) } contract.Gas += returnGas interpreter.intPool.put(endowment, offset, size, salt) @@ -759,7 +755,7 @@ func opCall(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory toAddr := common.BigToAddress(addr) value = math.U256(value) // Get the arguments from the memory. - args := memory.Get(inOffset.Int64(), inSize.Int64()) + args := memory.GetPtr(inOffset.Int64(), inSize.Int64()) if value.Sign() != 0 { gas += params.CallStipend @@ -788,7 +784,7 @@ func opCallCode(pc *uint64, interpreter *EVMInterpreter, contract *Contract, mem toAddr := common.BigToAddress(addr) value = math.U256(value) // Get arguments from the memory. - args := memory.Get(inOffset.Int64(), inSize.Int64()) + args := memory.GetPtr(inOffset.Int64(), inSize.Int64()) if value.Sign() != 0 { gas += params.CallStipend @@ -816,7 +812,7 @@ func opDelegateCall(pc *uint64, interpreter *EVMInterpreter, contract *Contract, addr, inOffset, inSize, retOffset, retSize := stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop() toAddr := common.BigToAddress(addr) // Get arguments from the memory. - args := memory.Get(inOffset.Int64(), inSize.Int64()) + args := memory.GetPtr(inOffset.Int64(), inSize.Int64()) ret, returnGas, err := interpreter.evm.DelegateCall(contract, toAddr, args, gas) if err != nil { @@ -841,7 +837,7 @@ func opStaticCall(pc *uint64, interpreter *EVMInterpreter, contract *Contract, m addr, inOffset, inSize, retOffset, retSize := stack.pop(), stack.pop(), stack.pop(), stack.pop(), stack.pop() toAddr := common.BigToAddress(addr) // Get arguments from the memory. - args := memory.Get(inOffset.Int64(), inSize.Int64()) + args := memory.GetPtr(inOffset.Int64(), inSize.Int64()) ret, returnGas, err := interpreter.evm.StaticCall(contract, toAddr, args, gas) if err != nil { @@ -897,7 +893,7 @@ func makeLog(size int) executionFunc { topics[i] = common.BigToHash(stack.pop()) } - d := memory.Get(mStart.Int64(), mSize.Int64()) + d := memory.GetCopy(mStart.Int64(), mSize.Int64()) interpreter.evm.StateDB.AddLog(&types.Log{ Address: contract.Address(), Topics: topics, @@ -912,6 +908,21 @@ func makeLog(size int) executionFunc { } } +// opPush1 is a specialized version of pushN +func opPush1(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { + var ( + codeLen = uint64(len(contract.Code)) + integer = interpreter.intPool.get() + ) + *pc += 1 + if *pc < codeLen { + stack.push(integer.SetUint64(uint64(contract.Code[*pc]))) + } else { + stack.push(integer.SetUint64(0)) + } + return nil, nil +} + // make push instruction function func makePush(size uint64, pushByteSize int) executionFunc { return func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) { diff --git a/core/vm/instructions_test.go b/core/vm/instructions_test.go index 5fa50ce34b6e..bdc62d1777c2 100644 --- a/core/vm/instructions_test.go +++ b/core/vm/instructions_test.go @@ -18,40 +18,102 @@ package vm import ( "bytes" + "encoding/json" + "fmt" + "io/ioutil" "math/big" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" ) -type twoOperandTest struct { - x string - y string - expected string +type TwoOperandTestcase struct { + X string + Y string + Expected string } -func testTwoOperandOp(t *testing.T, tests []twoOperandTest, opFn func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error)) { +type twoOperandParams struct { + x string + y string +} + +var commonParams []*twoOperandParams +var twoOpMethods map[string]executionFunc + +func init() { + + // Params is a list of common edgecases that should be used for some common tests + params := []string{ + "0000000000000000000000000000000000000000000000000000000000000000", // 0 + "0000000000000000000000000000000000000000000000000000000000000001", // +1 + "0000000000000000000000000000000000000000000000000000000000000005", // +5 + "7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe", // + max -1 + "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", // + max + "8000000000000000000000000000000000000000000000000000000000000000", // - max + "8000000000000000000000000000000000000000000000000000000000000001", // - max+1 + "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", // - 5 + "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", // - 1 + } + // Params are combined so each param is used on each 'side' + commonParams = make([]*twoOperandParams, len(params)*len(params)) + for i, x := range params { + for j, y := range params { + commonParams[i*len(params)+j] = &twoOperandParams{x, y} + } + } + twoOpMethods = map[string]executionFunc{ + "add": opAdd, + "sub": opSub, + "mul": opMul, + "div": opDiv, + "sdiv": opSdiv, + "mod": opMod, + "smod": opSmod, + "exp": opExp, + "signext": opSignExtend, + "lt": opLt, + "gt": opGt, + "slt": opSlt, + "sgt": opSgt, + "eq": opEq, + "and": opAnd, + "or": opOr, + "xor": opXor, + "byte": opByte, + "shl": opSHL, + "shr": opSHR, + "sar": opSAR, + } +} + +func testTwoOperandOp(t *testing.T, tests []TwoOperandTestcase, opFn executionFunc, name string) { + var ( env = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) stack = newstack() pc = uint64(0) - evmInterpreter = NewEVMInterpreter(env, env.vmConfig) + evmInterpreter = env.interpreter.(*EVMInterpreter) ) - - env.interpreter = evmInterpreter + // Stuff a couple of nonzero bigints into pool, to ensure that ops do not rely on pooled integers to be zero evmInterpreter.intPool = poolOfIntPools.get() + evmInterpreter.intPool.put(big.NewInt(-1337)) + evmInterpreter.intPool.put(big.NewInt(-1337)) + evmInterpreter.intPool.put(big.NewInt(-1337)) + for i, test := range tests { - x := new(big.Int).SetBytes(common.Hex2Bytes(test.x)) - shift := new(big.Int).SetBytes(common.Hex2Bytes(test.y)) - expected := new(big.Int).SetBytes(common.Hex2Bytes(test.expected)) + x := new(big.Int).SetBytes(common.Hex2Bytes(test.X)) + y := new(big.Int).SetBytes(common.Hex2Bytes(test.Y)) + expected := new(big.Int).SetBytes(common.Hex2Bytes(test.Expected)) stack.push(x) - stack.push(shift) + stack.push(y) opFn(&pc, evmInterpreter, nil, nil, stack) actual := stack.pop() + if actual.Cmp(expected) != 0 { - t.Errorf("Testcase %d, expected %v, got %v", i, expected, actual) + t.Errorf("Testcase %v %d, %v(%x, %x): expected %x, got %x", name, i, name, x, y, expected, actual) } // Check pool usage // 1.pool is not allowed to contain anything on the stack @@ -64,7 +126,7 @@ func testTwoOperandOp(t *testing.T, tests []twoOperandTest, opFn func(pc *uint64 for evmInterpreter.intPool.pool.len() > 0 { key := evmInterpreter.intPool.get() if _, exist := poolvals[key]; exist { - t.Errorf("Testcase %d, pool contains double-entry", i) + t.Errorf("Testcase %v %d, pool contains double-entry", name, i) } poolvals[key] = struct{}{} } @@ -74,47 +136,22 @@ func testTwoOperandOp(t *testing.T, tests []twoOperandTest, opFn func(pc *uint64 } func TestByteOp(t *testing.T) { - var ( - env = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) - stack = newstack() - evmInterpreter = NewEVMInterpreter(env, env.vmConfig) - ) - - env.interpreter = evmInterpreter - evmInterpreter.intPool = poolOfIntPools.get() - tests := []struct { - v string - th uint64 - expected *big.Int - }{ - {"ABCDEF0908070605040302010000000000000000000000000000000000000000", 0, big.NewInt(0xAB)}, - {"ABCDEF0908070605040302010000000000000000000000000000000000000000", 1, big.NewInt(0xCD)}, - {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", 0, big.NewInt(0x00)}, - {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", 1, big.NewInt(0xCD)}, - {"0000000000000000000000000000000000000000000000000000000000102030", 31, big.NewInt(0x30)}, - {"0000000000000000000000000000000000000000000000000000000000102030", 30, big.NewInt(0x20)}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 32, big.NewInt(0x0)}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 0xFFFFFFFFFFFFFFFF, big.NewInt(0x0)}, + tests := []TwoOperandTestcase{ + {"ABCDEF0908070605040302010000000000000000000000000000000000000000", "00", "AB"}, + {"ABCDEF0908070605040302010000000000000000000000000000000000000000", "01", "CD"}, + {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", "00", "00"}, + {"00CDEF090807060504030201ffffffffffffffffffffffffffffffffffffffff", "01", "CD"}, + {"0000000000000000000000000000000000000000000000000000000000102030", "1F", "30"}, + {"0000000000000000000000000000000000000000000000000000000000102030", "1E", "20"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "20", "00"}, + {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "FFFFFFFFFFFFFFFF", "00"}, } - pc := uint64(0) - for _, test := range tests { - val := new(big.Int).SetBytes(common.Hex2Bytes(test.v)) - th := new(big.Int).SetUint64(test.th) - stack.push(val) - stack.push(th) - opByte(&pc, evmInterpreter, nil, nil, stack) - actual := stack.pop() - if actual.Cmp(test.expected) != 0 { - t.Fatalf("Expected [%v] %v:th byte to be %v, was %v.", test.v, test.th, test.expected, actual) - } - } - poolOfIntPools.put(evmInterpreter.intPool) + testTwoOperandOp(t, tests, opByte, "byte") } func TestSHL(t *testing.T) { // Testcases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-145.md#shl-shift-left - tests := []twoOperandTest{ - {"0000000000000000000000000000000000000000000000000000000000000001", "00", "0000000000000000000000000000000000000000000000000000000000000001"}, + tests := []TwoOperandTestcase{ {"0000000000000000000000000000000000000000000000000000000000000001", "01", "0000000000000000000000000000000000000000000000000000000000000002"}, {"0000000000000000000000000000000000000000000000000000000000000001", "ff", "8000000000000000000000000000000000000000000000000000000000000000"}, {"0000000000000000000000000000000000000000000000000000000000000001", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, @@ -126,12 +163,12 @@ func TestSHL(t *testing.T) { {"0000000000000000000000000000000000000000000000000000000000000000", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "01", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"}, } - testTwoOperandOp(t, tests, opSHL) + testTwoOperandOp(t, tests, opSHL, "shl") } func TestSHR(t *testing.T) { // Testcases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-145.md#shr-logical-shift-right - tests := []twoOperandTest{ + tests := []TwoOperandTestcase{ {"0000000000000000000000000000000000000000000000000000000000000001", "00", "0000000000000000000000000000000000000000000000000000000000000001"}, {"0000000000000000000000000000000000000000000000000000000000000001", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, {"8000000000000000000000000000000000000000000000000000000000000000", "01", "4000000000000000000000000000000000000000000000000000000000000000"}, @@ -144,12 +181,12 @@ func TestSHR(t *testing.T) { {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, {"0000000000000000000000000000000000000000000000000000000000000000", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, } - testTwoOperandOp(t, tests, opSHR) + testTwoOperandOp(t, tests, opSHR, "shr") } func TestSAR(t *testing.T) { // Testcases from https://github.com/ethereum/EIPs/blob/master/EIPS/eip-145.md#sar-arithmetic-shift-right - tests := []twoOperandTest{ + tests := []TwoOperandTestcase{ {"0000000000000000000000000000000000000000000000000000000000000001", "00", "0000000000000000000000000000000000000000000000000000000000000001"}, {"0000000000000000000000000000000000000000000000000000000000000001", "01", "0000000000000000000000000000000000000000000000000000000000000000"}, {"8000000000000000000000000000000000000000000000000000000000000000", "01", "c000000000000000000000000000000000000000000000000000000000000000"}, @@ -168,44 +205,59 @@ func TestSAR(t *testing.T) { {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0100", "0000000000000000000000000000000000000000000000000000000000000000"}, } - testTwoOperandOp(t, tests, opSAR) + testTwoOperandOp(t, tests, opSAR, "sar") } -func TestSGT(t *testing.T) { - tests := []twoOperandTest{ +// getResult is a convenience function to generate the expected values +func getResult(args []*twoOperandParams, opFn executionFunc) []TwoOperandTestcase { + var ( + env = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) + stack = newstack() + pc = uint64(0) + interpreter = env.interpreter.(*EVMInterpreter) + ) + interpreter.intPool = poolOfIntPools.get() + result := make([]TwoOperandTestcase, len(args)) + for i, param := range args { + x := new(big.Int).SetBytes(common.Hex2Bytes(param.x)) + y := new(big.Int).SetBytes(common.Hex2Bytes(param.y)) + stack.push(x) + stack.push(y) + opFn(&pc, interpreter, nil, nil, stack) + actual := stack.pop() + result[i] = TwoOperandTestcase{param.x, param.y, fmt.Sprintf("%064x", actual)} + } + return result +} + +// utility function to fill the json-file with testcases +// Enable this test to generate the 'testcases_xx.json' files +func TestWriteExpectedValues(t *testing.T) { + t.Skip("Enable this test to create json test cases.") - {"0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001"}, - {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000001"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"8000000000000000000000000000000000000000000000000000000000000001", "8000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"8000000000000000000000000000000000000000000000000000000000000001", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001"}, - {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "8000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd", "0000000000000000000000000000000000000000000000000000000000000001"}, - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", "0000000000000000000000000000000000000000000000000000000000000000"}, + for name, method := range twoOpMethods { + data, err := json.Marshal(getResult(commonParams, method)) + if err != nil { + t.Fatal(err) + } + _ = ioutil.WriteFile(fmt.Sprintf("testdata/testcases_%v.json", name), data, 0644) + if err != nil { + t.Fatal(err) + } } - testTwoOperandOp(t, tests, opSgt) -} - -func TestSLT(t *testing.T) { - tests := []twoOperandTest{ - {"0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000001"}, - {"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"0000000000000000000000000000000000000000000000000000000000000001", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000001"}, - {"8000000000000000000000000000000000000000000000000000000000000001", "8000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"8000000000000000000000000000000000000000000000000000000000000001", "7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "8000000000000000000000000000000000000000000000000000000000000001", "0000000000000000000000000000000000000000000000000000000000000001"}, - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd", "0000000000000000000000000000000000000000000000000000000000000000"}, - {"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd", "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb", "0000000000000000000000000000000000000000000000000000000000000001"}, +} + +// TestJsonTestcases runs through all the testcases defined as json-files +func TestJsonTestcases(t *testing.T) { + for name := range twoOpMethods { + data, err := ioutil.ReadFile(fmt.Sprintf("testdata/testcases_%v.json", name)) + if err != nil { + t.Fatal("Failed to read file", err) + } + var testcases []TwoOperandTestcase + json.Unmarshal(data, &testcases) + testTwoOperandOp(t, testcases, twoOpMethods[name], name) } - testTwoOperandOp(t, tests, opSlt) } func opBenchmark(bench *testing.B, op func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error), args ...string) { @@ -458,12 +510,12 @@ func TestOpMstore(t *testing.T) { v := "abcdef00000000000000abba000000000deaf000000c0de00100000000133700" stack.pushN(new(big.Int).SetBytes(common.Hex2Bytes(v)), big.NewInt(0)) opMstore(&pc, evmInterpreter, nil, mem, stack) - if got := common.Bytes2Hex(mem.Get(0, 32)); got != v { + if got := common.Bytes2Hex(mem.GetCopy(0, 32)); got != v { t.Fatalf("Mstore fail, got %v, expected %v", got, v) } stack.pushN(big.NewInt(0x1), big.NewInt(0)) opMstore(&pc, evmInterpreter, nil, mem, stack) - if common.Bytes2Hex(mem.Get(0, 32)) != "0000000000000000000000000000000000000000000000000000000000000001" { + if common.Bytes2Hex(mem.GetCopy(0, 32)) != "0000000000000000000000000000000000000000000000000000000000000001" { t.Fatalf("Mstore failed to overwrite previous value") } poolOfIntPools.put(evmInterpreter.intPool) diff --git a/core/vm/interface.go b/core/vm/interface.go index d08df8ae53a8..dd401466adfa 100644 --- a/core/vm/interface.go +++ b/core/vm/interface.go @@ -19,8 +19,8 @@ package vm import ( "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" ) // StateDB is an EVM database for full state querying. @@ -63,7 +63,7 @@ type StateDB interface { AddLog(*types.Log) AddPreimage(common.Hash, []byte) - ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) + ForEachStorage(common.Address, func(common.Hash, common.Hash) bool) error } // CallContext provides a basic interface for the EVM calling conventions. The EVM diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index e8b7f24f2cd5..fe06492de3f2 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -21,31 +21,24 @@ import ( "hash" "sync/atomic" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/log" ) // Config are the configuration options for the Interpreter type Config struct { - // Debug enabled debugging Interpreter options - Debug bool - // Tracer is the op code logger - Tracer Tracer - // NoRecursion disabled Interpreter call, callcode, - // delegate call and create. - NoRecursion bool - // Enable recording of SHA3/keccak preimages - EnablePreimageRecording bool - // JumpTable contains the EVM instruction table. This - // may be left uninitialised and will be set to the default - // table. - JumpTable [256]operation + Debug bool // Enables debugging + Tracer Tracer // Opcode logger + NoRecursion bool // Disables call, callcode, delegate call and create + EnablePreimageRecording bool // Enables recording of SHA3/keccak preimages - // Type of the EWASM interpreter - EWASMInterpreter string - // Type of the EVM interpreter - EVMInterpreter string + JumpTable [256]operation // EVM instruction table, automatically populated if unset + + EWASMInterpreter string // External EWASM interpreter options + EVMInterpreter string // External EVM interpreter options + + ExtraEips []int // Additional EIPS that are to be enabled } // Interpreter is used to run Ethereum based contracts and will utilise the @@ -80,9 +73,8 @@ type keccakState interface { // EVMInterpreter represents an EVM interpreter type EVMInterpreter struct { - evm *EVM - cfg Config - gasTable params.GasTable + evm *EVM + cfg Config intPool *intPool @@ -99,39 +91,37 @@ func NewEVMInterpreter(evm *EVM, cfg Config) *EVMInterpreter { // the jump table was initialised. If it was not // we'll set the default jump table. if !cfg.JumpTable[STOP].valid { + var jt JumpTable switch { - case evm.ChainConfig().IsConstantinople(evm.BlockNumber): - cfg.JumpTable = constantinopleInstructionSet - case evm.ChainConfig().IsByzantium(evm.BlockNumber): - cfg.JumpTable = byzantiumInstructionSet - case evm.ChainConfig().IsHomestead(evm.BlockNumber): - cfg.JumpTable = homesteadInstructionSet + case evm.chainRules.IsIstanbul: + jt = istanbulInstructionSet + case evm.chainRules.IsConstantinople: + jt = constantinopleInstructionSet + case evm.chainRules.IsByzantium: + jt = byzantiumInstructionSet + case evm.chainRules.IsEIP158: + jt = spuriousDragonInstructionSet + case evm.chainRules.IsEIP150: + jt = tangerineWhistleInstructionSet + case evm.chainRules.IsHomestead: + jt = homesteadInstructionSet default: - cfg.JumpTable = frontierInstructionSet + jt = frontierInstructionSet + } + for i, eip := range cfg.ExtraEips { + if err := EnableEIP(eip, &jt); err != nil { + // Disable it, so caller can check if it's activated or not + cfg.ExtraEips = append(cfg.ExtraEips[:i], cfg.ExtraEips[i+1:]...) + log.Error("EIP activation failed", "eip", eip, "error", err) + } } + cfg.JumpTable = jt } return &EVMInterpreter{ - evm: evm, - cfg: cfg, - gasTable: evm.ChainConfig().GasTable(evm.BlockNumber), - } -} - -func (in *EVMInterpreter) 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 - } - } + evm: evm, + cfg: cfg, } - return nil } // Run loops and evaluates the contract's code with the given input data and returns @@ -182,6 +172,7 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( 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 + res []byte // result of the opcode execution function ) contract.Input = input @@ -216,19 +207,36 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( if !operation.valid { return nil, fmt.Errorf("invalid opcode 0x%x", int(op)) } - if err := operation.validateStack(stack); err != nil { - return nil, err + // Validate stack + if sLen := stack.len(); sLen < operation.minStack { + return nil, fmt.Errorf("stack underflow (%d <=> %d)", sLen, operation.minStack) + } else if sLen > operation.maxStack { + return nil, fmt.Errorf("stack limit reached %d (%d)", sLen, operation.maxStack) } // If the operation is valid, enforce and write restrictions - if err := in.enforceRestrictions(op, operation, stack); err != nil { - return nil, err + if in.readOnly && in.evm.chainRules.IsByzantium { + // 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).Sign() != 0) { + return nil, errWriteProtection + } + } + // Static portion of gas + cost = operation.constantGas // For tracing + if !contract.UseGas(operation.constantGas) { + return nil, ErrOutOfGas } var memorySize uint64 // calculate the new memory size and expand the memory to fit // the operation + // Memory check needs to be done prior to evaluating the dynamic gas portion, + // to detect calculation overflows if operation.memorySize != nil { - memSize, overflow := bigUint64(operation.memorySize(stack)) + memSize, overflow := operation.memorySize(stack) if overflow { return nil, errGasUintOverflow } @@ -238,11 +246,16 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( return nil, errGasUintOverflow } } + // Dynamic portion of gas // consume the gas and return an error if not enough gas is available. // cost is explicitly set so that the capture state defer method can get the proper cost - cost, err = operation.gasCost(in.gasTable, in.evm, contract, stack, mem, memorySize) - if err != nil || !contract.UseGas(cost) { - return nil, ErrOutOfGas + if operation.dynamicGas != nil { + var dynamicCost uint64 + dynamicCost, err = operation.dynamicGas(in.evm, contract, stack, mem, memorySize) + cost += dynamicCost // total cost, for debug tracing + if err != nil || !contract.UseGas(dynamicCost) { + return nil, ErrOutOfGas + } } if memorySize > 0 { mem.Resize(memorySize) @@ -254,7 +267,7 @@ func (in *EVMInterpreter) Run(contract *Contract, input []byte, readOnly bool) ( } // execute the operation - res, err := operation.execute(&pc, in, contract, mem, stack) + res, err = operation.execute(&pc, in, contract, mem, stack) // verifyPool is a build flag. Pool verification makes sure the integrity // of the integer pool by comparing values to a default value. if verifyPool { diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index c68c733762a9..b26b55284c58 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -18,27 +18,30 @@ package vm import ( "errors" - "math/big" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/params" ) type ( - executionFunc func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) - gasFunc func(params.GasTable, *EVM, *Contract, *Stack, *Memory, uint64) (uint64, error) // last parameter is the requested memory size as a uint64 - stackValidationFunc func(*Stack) error - memorySizeFunc func(*Stack) *big.Int + executionFunc func(pc *uint64, interpreter *EVMInterpreter, contract *Contract, memory *Memory, stack *Stack) ([]byte, error) + gasFunc func(*EVM, *Contract, *Stack, *Memory, uint64) (uint64, error) // last parameter is the requested memory size as a uint64 + // memorySizeFunc returns the required size, and whether the operation overflowed a uint64 + memorySizeFunc func(*Stack) (size uint64, overflow bool) ) var errGasUintOverflow = errors.New("gas uint64 overflow") type operation struct { // execute is the operation function - execute executionFunc - // gasCost is the gas function and returns the gas required for execution - gasCost gasFunc - // validateStack validates the stack (size) for the operation - validateStack stackValidationFunc + execute executionFunc + constantGas uint64 + dynamicGas gasFunc + // minStack tells how many stack items are required + minStack int + // maxStack specifies the max length the stack can have for this operation + // to not overflow the stack. + maxStack int + // memorySize returns the memory size required for the operation memorySize memorySizeFunc @@ -51,916 +54,1106 @@ type operation struct { } var ( - frontierInstructionSet = newFrontierInstructionSet() - homesteadInstructionSet = newHomesteadInstructionSet() - byzantiumInstructionSet = newByzantiumInstructionSet() - constantinopleInstructionSet = newConstantinopleInstructionSet() + frontierInstructionSet = newFrontierInstructionSet() + homesteadInstructionSet = newHomesteadInstructionSet() + tangerineWhistleInstructionSet = newTangerineWhistleInstructionSet() + spuriousDragonInstructionSet = newSpuriousDragonInstructionSet() + byzantiumInstructionSet = newByzantiumInstructionSet() + constantinopleInstructionSet = newConstantinopleInstructionSet() + istanbulInstructionSet = newIstanbulInstructionSet() ) -// NewConstantinopleInstructionSet returns the frontier, homestead +// JumpTable contains the EVM opcodes supported at a given fork. +type JumpTable [256]operation + +// newIstanbulInstructionSet returns the frontier, homestead +// byzantium, contantinople and petersburg instructions. +func newIstanbulInstructionSet() JumpTable { + instructionSet := newConstantinopleInstructionSet() + + enable1344(&instructionSet) // ChainID opcode - https://eips.ethereum.org/EIPS/eip-1344 + enable1884(&instructionSet) // Reprice reader opcodes - https://eips.ethereum.org/EIPS/eip-1884 + enable2200(&instructionSet) // Net metered SSTORE - https://eips.ethereum.org/EIPS/eip-2200 + + return instructionSet +} + +// newConstantinopleInstructionSet returns the frontier, homestead // byzantium and contantinople instructions. -func newConstantinopleInstructionSet() [256]operation { - // instructions that can be executed during the byzantium phase. +func newConstantinopleInstructionSet() JumpTable { instructionSet := newByzantiumInstructionSet() instructionSet[SHL] = operation{ - execute: opSHL, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSHL, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, } instructionSet[SHR] = operation{ - execute: opSHR, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSHR, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, } instructionSet[SAR] = operation{ - execute: opSAR, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSAR, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, } instructionSet[EXTCODEHASH] = operation{ - execute: opExtCodeHash, - gasCost: gasExtCodeHash, - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opExtCodeHash, + constantGas: params.ExtcodeHashGasConstantinople, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, } instructionSet[CREATE2] = operation{ - execute: opCreate2, - gasCost: gasCreate2, - validateStack: makeStackFunc(4, 1), - memorySize: memoryCreate2, - valid: true, - writes: true, - returns: true, + execute: opCreate2, + constantGas: params.Create2Gas, + dynamicGas: gasCreate2, + minStack: minStack(4, 1), + maxStack: maxStack(4, 1), + memorySize: memoryCreate2, + valid: true, + writes: true, + returns: true, } return instructionSet } -// NewByzantiumInstructionSet returns the frontier, homestead and +// newByzantiumInstructionSet returns the frontier, homestead and // byzantium instructions. -func newByzantiumInstructionSet() [256]operation { - // instructions that can be executed during the homestead phase. - instructionSet := newHomesteadInstructionSet() +func newByzantiumInstructionSet() JumpTable { + instructionSet := newSpuriousDragonInstructionSet() instructionSet[STATICCALL] = operation{ - execute: opStaticCall, - gasCost: gasStaticCall, - validateStack: makeStackFunc(6, 1), - memorySize: memoryStaticCall, - valid: true, - returns: true, + execute: opStaticCall, + constantGas: params.CallGasEIP150, + dynamicGas: gasStaticCall, + minStack: minStack(6, 1), + maxStack: maxStack(6, 1), + memorySize: memoryStaticCall, + valid: true, + returns: true, } instructionSet[RETURNDATASIZE] = operation{ - execute: opReturnDataSize, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opReturnDataSize, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, } instructionSet[RETURNDATACOPY] = operation{ - execute: opReturnDataCopy, - gasCost: gasReturnDataCopy, - validateStack: makeStackFunc(3, 0), - memorySize: memoryReturnDataCopy, - valid: true, + execute: opReturnDataCopy, + constantGas: GasFastestStep, + dynamicGas: gasReturnDataCopy, + minStack: minStack(3, 0), + maxStack: maxStack(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, + execute: opRevert, + dynamicGas: gasRevert, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + memorySize: memoryRevert, + valid: true, + reverts: true, + returns: true, } return instructionSet } -// NewHomesteadInstructionSet returns the frontier and homestead +// EIP 158 a.k.a Spurious Dragon +func newSpuriousDragonInstructionSet() JumpTable { + instructionSet := newTangerineWhistleInstructionSet() + instructionSet[EXP].dynamicGas = gasExpEIP158 + return instructionSet + +} + +// EIP 150 a.k.a Tangerine Whistle +func newTangerineWhistleInstructionSet() JumpTable { + instructionSet := newHomesteadInstructionSet() + instructionSet[BALANCE].constantGas = params.BalanceGasEIP150 + instructionSet[EXTCODESIZE].constantGas = params.ExtcodeSizeGasEIP150 + instructionSet[SLOAD].constantGas = params.SloadGasEIP150 + instructionSet[EXTCODECOPY].constantGas = params.ExtcodeCopyBaseEIP150 + instructionSet[CALL].constantGas = params.CallGasEIP150 + instructionSet[CALLCODE].constantGas = params.CallGasEIP150 + instructionSet[DELEGATECALL].constantGas = params.CallGasEIP150 + return instructionSet +} + +// newHomesteadInstructionSet returns the frontier and homestead // instructions that can be executed during the homestead phase. -func newHomesteadInstructionSet() [256]operation { +func newHomesteadInstructionSet() JumpTable { instructionSet := newFrontierInstructionSet() instructionSet[DELEGATECALL] = operation{ - execute: opDelegateCall, - gasCost: gasDelegateCall, - validateStack: makeStackFunc(6, 1), - memorySize: memoryDelegateCall, - valid: true, - returns: true, + execute: opDelegateCall, + dynamicGas: gasDelegateCall, + constantGas: params.CallGasFrontier, + minStack: minStack(6, 1), + maxStack: maxStack(6, 1), + memorySize: memoryDelegateCall, + valid: true, + returns: true, } return instructionSet } -// NewFrontierInstructionSet returns the frontier instructions +// newFrontierInstructionSet returns the frontier instructions // that can be executed during the frontier phase. -func newFrontierInstructionSet() [256]operation { - return [256]operation{ +func newFrontierInstructionSet() JumpTable { + return JumpTable{ STOP: { - execute: opStop, - gasCost: constGasFunc(0), - validateStack: makeStackFunc(0, 0), - halts: true, - valid: true, + execute: opStop, + constantGas: 0, + minStack: minStack(0, 0), + maxStack: maxStack(0, 0), + halts: true, + valid: true, }, ADD: { - execute: opAdd, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opAdd, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, MUL: { - execute: opMul, - gasCost: constGasFunc(GasFastStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opMul, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, SUB: { - execute: opSub, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSub, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, DIV: { - execute: opDiv, - gasCost: constGasFunc(GasFastStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opDiv, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, SDIV: { - execute: opSdiv, - gasCost: constGasFunc(GasFastStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSdiv, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, MOD: { - execute: opMod, - gasCost: constGasFunc(GasFastStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opMod, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, SMOD: { - execute: opSmod, - gasCost: constGasFunc(GasFastStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSmod, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, ADDMOD: { - execute: opAddmod, - gasCost: constGasFunc(GasMidStep), - validateStack: makeStackFunc(3, 1), - valid: true, + execute: opAddmod, + constantGas: GasMidStep, + minStack: minStack(3, 1), + maxStack: maxStack(3, 1), + valid: true, }, MULMOD: { - execute: opMulmod, - gasCost: constGasFunc(GasMidStep), - validateStack: makeStackFunc(3, 1), - valid: true, + execute: opMulmod, + constantGas: GasMidStep, + minStack: minStack(3, 1), + maxStack: maxStack(3, 1), + valid: true, }, EXP: { - execute: opExp, - gasCost: gasExp, - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opExp, + dynamicGas: gasExpFrontier, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, SIGNEXTEND: { - execute: opSignExtend, - gasCost: constGasFunc(GasFastStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSignExtend, + constantGas: GasFastStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, LT: { - execute: opLt, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opLt, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, GT: { - execute: opGt, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opGt, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, SLT: { - execute: opSlt, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSlt, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, SGT: { - execute: opSgt, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opSgt, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, EQ: { - execute: opEq, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opEq, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, ISZERO: { - execute: opIszero, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opIszero, + constantGas: GasFastestStep, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, }, AND: { - execute: opAnd, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opAnd, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, XOR: { - execute: opXor, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opXor, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, OR: { - execute: opOr, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opOr, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, NOT: { - execute: opNot, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opNot, + constantGas: GasFastestStep, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, }, BYTE: { - execute: opByte, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(2, 1), - valid: true, + execute: opByte, + constantGas: GasFastestStep, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + valid: true, }, SHA3: { - execute: opSha3, - gasCost: gasSha3, - validateStack: makeStackFunc(2, 1), - memorySize: memorySha3, - valid: true, + execute: opSha3, + constantGas: params.Sha3Gas, + dynamicGas: gasSha3, + minStack: minStack(2, 1), + maxStack: maxStack(2, 1), + memorySize: memorySha3, + valid: true, }, ADDRESS: { - execute: opAddress, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opAddress, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, BALANCE: { - execute: opBalance, - gasCost: gasBalance, - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opBalance, + constantGas: params.BalanceGasFrontier, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, }, ORIGIN: { - execute: opOrigin, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opOrigin, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, CALLER: { - execute: opCaller, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opCaller, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, CALLVALUE: { - execute: opCallValue, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opCallValue, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, CALLDATALOAD: { - execute: opCallDataLoad, - gasCost: constGasFunc(GasFastestStep), - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opCallDataLoad, + constantGas: GasFastestStep, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, }, CALLDATASIZE: { - execute: opCallDataSize, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opCallDataSize, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, CALLDATACOPY: { - execute: opCallDataCopy, - gasCost: gasCallDataCopy, - validateStack: makeStackFunc(3, 0), - memorySize: memoryCallDataCopy, - valid: true, + execute: opCallDataCopy, + constantGas: GasFastestStep, + dynamicGas: gasCallDataCopy, + minStack: minStack(3, 0), + maxStack: maxStack(3, 0), + memorySize: memoryCallDataCopy, + valid: true, }, CODESIZE: { - execute: opCodeSize, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opCodeSize, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, CODECOPY: { - execute: opCodeCopy, - gasCost: gasCodeCopy, - validateStack: makeStackFunc(3, 0), - memorySize: memoryCodeCopy, - valid: true, + execute: opCodeCopy, + constantGas: GasFastestStep, + dynamicGas: gasCodeCopy, + minStack: minStack(3, 0), + maxStack: maxStack(3, 0), + memorySize: memoryCodeCopy, + valid: true, }, GASPRICE: { - execute: opGasprice, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opGasprice, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, EXTCODESIZE: { - execute: opExtCodeSize, - gasCost: gasExtCodeSize, - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opExtCodeSize, + constantGas: params.ExtcodeSizeGasFrontier, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, }, EXTCODECOPY: { - execute: opExtCodeCopy, - gasCost: gasExtCodeCopy, - validateStack: makeStackFunc(4, 0), - memorySize: memoryExtCodeCopy, - valid: true, + execute: opExtCodeCopy, + constantGas: params.ExtcodeCopyBaseFrontier, + dynamicGas: gasExtCodeCopy, + minStack: minStack(4, 0), + maxStack: maxStack(4, 0), + memorySize: memoryExtCodeCopy, + valid: true, }, BLOCKHASH: { - execute: opBlockhash, - gasCost: constGasFunc(GasExtStep), - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opBlockhash, + constantGas: GasExtStep, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, }, COINBASE: { - execute: opCoinbase, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opCoinbase, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, TIMESTAMP: { - execute: opTimestamp, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opTimestamp, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, NUMBER: { - execute: opNumber, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opNumber, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, DIFFICULTY: { - execute: opDifficulty, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opDifficulty, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, GASLIMIT: { - execute: opGasLimit, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opGasLimit, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, POP: { - execute: opPop, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(1, 0), - valid: true, + execute: opPop, + constantGas: GasQuickStep, + minStack: minStack(1, 0), + maxStack: maxStack(1, 0), + valid: true, }, MLOAD: { - execute: opMload, - gasCost: gasMLoad, - validateStack: makeStackFunc(1, 1), - memorySize: memoryMLoad, - valid: true, + execute: opMload, + constantGas: GasFastestStep, + dynamicGas: gasMLoad, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + memorySize: memoryMLoad, + valid: true, }, MSTORE: { - execute: opMstore, - gasCost: gasMStore, - validateStack: makeStackFunc(2, 0), - memorySize: memoryMStore, - valid: true, + execute: opMstore, + constantGas: GasFastestStep, + dynamicGas: gasMStore, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + memorySize: memoryMStore, + valid: true, }, MSTORE8: { - execute: opMstore8, - gasCost: gasMStore8, - memorySize: memoryMStore8, - validateStack: makeStackFunc(2, 0), + execute: opMstore8, + constantGas: GasFastestStep, + dynamicGas: gasMStore8, + memorySize: memoryMStore8, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), valid: true, }, SLOAD: { - execute: opSload, - gasCost: gasSLoad, - validateStack: makeStackFunc(1, 1), - valid: true, + execute: opSload, + constantGas: params.SloadGasFrontier, + minStack: minStack(1, 1), + maxStack: maxStack(1, 1), + valid: true, }, SSTORE: { - execute: opSstore, - gasCost: gasSStore, - validateStack: makeStackFunc(2, 0), - valid: true, - writes: true, + execute: opSstore, + dynamicGas: gasSStore, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + valid: true, + writes: true, }, JUMP: { - execute: opJump, - gasCost: constGasFunc(GasMidStep), - validateStack: makeStackFunc(1, 0), - jumps: true, - valid: true, + execute: opJump, + constantGas: GasMidStep, + minStack: minStack(1, 0), + maxStack: maxStack(1, 0), + jumps: true, + valid: true, }, JUMPI: { - execute: opJumpi, - gasCost: constGasFunc(GasSlowStep), - validateStack: makeStackFunc(2, 0), - jumps: true, - valid: true, + execute: opJumpi, + constantGas: GasSlowStep, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + jumps: true, + valid: true, }, PC: { - execute: opPc, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opPc, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, MSIZE: { - execute: opMsize, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opMsize, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, GAS: { - execute: opGas, - gasCost: constGasFunc(GasQuickStep), - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opGas, + constantGas: GasQuickStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, JUMPDEST: { - execute: opJumpdest, - gasCost: constGasFunc(params.JumpdestGas), - validateStack: makeStackFunc(0, 0), - valid: true, + execute: opJumpdest, + constantGas: params.JumpdestGas, + minStack: minStack(0, 0), + maxStack: maxStack(0, 0), + valid: true, }, PUSH1: { - execute: makePush(1, 1), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: opPush1, + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH2: { - execute: makePush(2, 2), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(2, 2), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH3: { - execute: makePush(3, 3), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(3, 3), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH4: { - execute: makePush(4, 4), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(4, 4), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH5: { - execute: makePush(5, 5), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(5, 5), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH6: { - execute: makePush(6, 6), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(6, 6), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH7: { - execute: makePush(7, 7), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(7, 7), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH8: { - execute: makePush(8, 8), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(8, 8), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH9: { - execute: makePush(9, 9), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(9, 9), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH10: { - execute: makePush(10, 10), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(10, 10), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH11: { - execute: makePush(11, 11), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(11, 11), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH12: { - execute: makePush(12, 12), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(12, 12), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH13: { - execute: makePush(13, 13), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(13, 13), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH14: { - execute: makePush(14, 14), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(14, 14), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH15: { - execute: makePush(15, 15), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(15, 15), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH16: { - execute: makePush(16, 16), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(16, 16), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH17: { - execute: makePush(17, 17), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(17, 17), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH18: { - execute: makePush(18, 18), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(18, 18), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH19: { - execute: makePush(19, 19), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(19, 19), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH20: { - execute: makePush(20, 20), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(20, 20), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH21: { - execute: makePush(21, 21), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(21, 21), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH22: { - execute: makePush(22, 22), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(22, 22), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH23: { - execute: makePush(23, 23), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(23, 23), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH24: { - execute: makePush(24, 24), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(24, 24), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH25: { - execute: makePush(25, 25), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(25, 25), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH26: { - execute: makePush(26, 26), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(26, 26), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH27: { - execute: makePush(27, 27), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(27, 27), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH28: { - execute: makePush(28, 28), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(28, 28), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH29: { - execute: makePush(29, 29), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(29, 29), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH30: { - execute: makePush(30, 30), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(30, 30), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH31: { - execute: makePush(31, 31), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(31, 31), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, PUSH32: { - execute: makePush(32, 32), - gasCost: gasPush, - validateStack: makeStackFunc(0, 1), - valid: true, + execute: makePush(32, 32), + constantGas: GasFastestStep, + minStack: minStack(0, 1), + maxStack: maxStack(0, 1), + valid: true, }, DUP1: { - execute: makeDup(1), - gasCost: gasDup, - validateStack: makeDupStackFunc(1), - valid: true, + execute: makeDup(1), + constantGas: GasFastestStep, + minStack: minDupStack(1), + maxStack: maxDupStack(1), + valid: true, }, DUP2: { - execute: makeDup(2), - gasCost: gasDup, - validateStack: makeDupStackFunc(2), - valid: true, + execute: makeDup(2), + constantGas: GasFastestStep, + minStack: minDupStack(2), + maxStack: maxDupStack(2), + valid: true, }, DUP3: { - execute: makeDup(3), - gasCost: gasDup, - validateStack: makeDupStackFunc(3), - valid: true, + execute: makeDup(3), + constantGas: GasFastestStep, + minStack: minDupStack(3), + maxStack: maxDupStack(3), + valid: true, }, DUP4: { - execute: makeDup(4), - gasCost: gasDup, - validateStack: makeDupStackFunc(4), - valid: true, + execute: makeDup(4), + constantGas: GasFastestStep, + minStack: minDupStack(4), + maxStack: maxDupStack(4), + valid: true, }, DUP5: { - execute: makeDup(5), - gasCost: gasDup, - validateStack: makeDupStackFunc(5), - valid: true, + execute: makeDup(5), + constantGas: GasFastestStep, + minStack: minDupStack(5), + maxStack: maxDupStack(5), + valid: true, }, DUP6: { - execute: makeDup(6), - gasCost: gasDup, - validateStack: makeDupStackFunc(6), - valid: true, + execute: makeDup(6), + constantGas: GasFastestStep, + minStack: minDupStack(6), + maxStack: maxDupStack(6), + valid: true, }, DUP7: { - execute: makeDup(7), - gasCost: gasDup, - validateStack: makeDupStackFunc(7), - valid: true, + execute: makeDup(7), + constantGas: GasFastestStep, + minStack: minDupStack(7), + maxStack: maxDupStack(7), + valid: true, }, DUP8: { - execute: makeDup(8), - gasCost: gasDup, - validateStack: makeDupStackFunc(8), - valid: true, + execute: makeDup(8), + constantGas: GasFastestStep, + minStack: minDupStack(8), + maxStack: maxDupStack(8), + valid: true, }, DUP9: { - execute: makeDup(9), - gasCost: gasDup, - validateStack: makeDupStackFunc(9), - valid: true, + execute: makeDup(9), + constantGas: GasFastestStep, + minStack: minDupStack(9), + maxStack: maxDupStack(9), + valid: true, }, DUP10: { - execute: makeDup(10), - gasCost: gasDup, - validateStack: makeDupStackFunc(10), - valid: true, + execute: makeDup(10), + constantGas: GasFastestStep, + minStack: minDupStack(10), + maxStack: maxDupStack(10), + valid: true, }, DUP11: { - execute: makeDup(11), - gasCost: gasDup, - validateStack: makeDupStackFunc(11), - valid: true, + execute: makeDup(11), + constantGas: GasFastestStep, + minStack: minDupStack(11), + maxStack: maxDupStack(11), + valid: true, }, DUP12: { - execute: makeDup(12), - gasCost: gasDup, - validateStack: makeDupStackFunc(12), - valid: true, + execute: makeDup(12), + constantGas: GasFastestStep, + minStack: minDupStack(12), + maxStack: maxDupStack(12), + valid: true, }, DUP13: { - execute: makeDup(13), - gasCost: gasDup, - validateStack: makeDupStackFunc(13), - valid: true, + execute: makeDup(13), + constantGas: GasFastestStep, + minStack: minDupStack(13), + maxStack: maxDupStack(13), + valid: true, }, DUP14: { - execute: makeDup(14), - gasCost: gasDup, - validateStack: makeDupStackFunc(14), - valid: true, + execute: makeDup(14), + constantGas: GasFastestStep, + minStack: minDupStack(14), + maxStack: maxDupStack(14), + valid: true, }, DUP15: { - execute: makeDup(15), - gasCost: gasDup, - validateStack: makeDupStackFunc(15), - valid: true, + execute: makeDup(15), + constantGas: GasFastestStep, + minStack: minDupStack(15), + maxStack: maxDupStack(15), + valid: true, }, DUP16: { - execute: makeDup(16), - gasCost: gasDup, - validateStack: makeDupStackFunc(16), - valid: true, + execute: makeDup(16), + constantGas: GasFastestStep, + minStack: minDupStack(16), + maxStack: maxDupStack(16), + valid: true, }, SWAP1: { - execute: makeSwap(1), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(2), - valid: true, + execute: makeSwap(1), + constantGas: GasFastestStep, + minStack: minSwapStack(2), + maxStack: maxSwapStack(2), + valid: true, }, SWAP2: { - execute: makeSwap(2), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(3), - valid: true, + execute: makeSwap(2), + constantGas: GasFastestStep, + minStack: minSwapStack(3), + maxStack: maxSwapStack(3), + valid: true, }, SWAP3: { - execute: makeSwap(3), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(4), - valid: true, + execute: makeSwap(3), + constantGas: GasFastestStep, + minStack: minSwapStack(4), + maxStack: maxSwapStack(4), + valid: true, }, SWAP4: { - execute: makeSwap(4), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(5), - valid: true, + execute: makeSwap(4), + constantGas: GasFastestStep, + minStack: minSwapStack(5), + maxStack: maxSwapStack(5), + valid: true, }, SWAP5: { - execute: makeSwap(5), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(6), - valid: true, + execute: makeSwap(5), + constantGas: GasFastestStep, + minStack: minSwapStack(6), + maxStack: maxSwapStack(6), + valid: true, }, SWAP6: { - execute: makeSwap(6), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(7), - valid: true, + execute: makeSwap(6), + constantGas: GasFastestStep, + minStack: minSwapStack(7), + maxStack: maxSwapStack(7), + valid: true, }, SWAP7: { - execute: makeSwap(7), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(8), - valid: true, + execute: makeSwap(7), + constantGas: GasFastestStep, + minStack: minSwapStack(8), + maxStack: maxSwapStack(8), + valid: true, }, SWAP8: { - execute: makeSwap(8), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(9), - valid: true, + execute: makeSwap(8), + constantGas: GasFastestStep, + minStack: minSwapStack(9), + maxStack: maxSwapStack(9), + valid: true, }, SWAP9: { - execute: makeSwap(9), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(10), - valid: true, + execute: makeSwap(9), + constantGas: GasFastestStep, + minStack: minSwapStack(10), + maxStack: maxSwapStack(10), + valid: true, }, SWAP10: { - execute: makeSwap(10), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(11), - valid: true, + execute: makeSwap(10), + constantGas: GasFastestStep, + minStack: minSwapStack(11), + maxStack: maxSwapStack(11), + valid: true, }, SWAP11: { - execute: makeSwap(11), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(12), - valid: true, + execute: makeSwap(11), + constantGas: GasFastestStep, + minStack: minSwapStack(12), + maxStack: maxSwapStack(12), + valid: true, }, SWAP12: { - execute: makeSwap(12), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(13), - valid: true, + execute: makeSwap(12), + constantGas: GasFastestStep, + minStack: minSwapStack(13), + maxStack: maxSwapStack(13), + valid: true, }, SWAP13: { - execute: makeSwap(13), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(14), - valid: true, + execute: makeSwap(13), + constantGas: GasFastestStep, + minStack: minSwapStack(14), + maxStack: maxSwapStack(14), + valid: true, }, SWAP14: { - execute: makeSwap(14), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(15), - valid: true, + execute: makeSwap(14), + constantGas: GasFastestStep, + minStack: minSwapStack(15), + maxStack: maxSwapStack(15), + valid: true, }, SWAP15: { - execute: makeSwap(15), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(16), - valid: true, + execute: makeSwap(15), + constantGas: GasFastestStep, + minStack: minSwapStack(16), + maxStack: maxSwapStack(16), + valid: true, }, SWAP16: { - execute: makeSwap(16), - gasCost: gasSwap, - validateStack: makeSwapStackFunc(17), - valid: true, + execute: makeSwap(16), + constantGas: GasFastestStep, + minStack: minSwapStack(17), + maxStack: maxSwapStack(17), + valid: true, }, LOG0: { - execute: makeLog(0), - gasCost: makeGasLog(0), - validateStack: makeStackFunc(2, 0), - memorySize: memoryLog, - valid: true, - writes: true, + execute: makeLog(0), + dynamicGas: makeGasLog(0), + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + memorySize: memoryLog, + valid: true, + writes: true, }, LOG1: { - execute: makeLog(1), - gasCost: makeGasLog(1), - validateStack: makeStackFunc(3, 0), - memorySize: memoryLog, - valid: true, - writes: true, + execute: makeLog(1), + dynamicGas: makeGasLog(1), + minStack: minStack(3, 0), + maxStack: maxStack(3, 0), + memorySize: memoryLog, + valid: true, + writes: true, }, LOG2: { - execute: makeLog(2), - gasCost: makeGasLog(2), - validateStack: makeStackFunc(4, 0), - memorySize: memoryLog, - valid: true, - writes: true, + execute: makeLog(2), + dynamicGas: makeGasLog(2), + minStack: minStack(4, 0), + maxStack: maxStack(4, 0), + memorySize: memoryLog, + valid: true, + writes: true, }, LOG3: { - execute: makeLog(3), - gasCost: makeGasLog(3), - validateStack: makeStackFunc(5, 0), - memorySize: memoryLog, - valid: true, - writes: true, + execute: makeLog(3), + dynamicGas: makeGasLog(3), + minStack: minStack(5, 0), + maxStack: maxStack(5, 0), + memorySize: memoryLog, + valid: true, + writes: true, }, LOG4: { - execute: makeLog(4), - gasCost: makeGasLog(4), - validateStack: makeStackFunc(6, 0), - memorySize: memoryLog, - valid: true, - writes: true, + execute: makeLog(4), + dynamicGas: makeGasLog(4), + minStack: minStack(6, 0), + maxStack: maxStack(6, 0), + memorySize: memoryLog, + valid: true, + writes: true, }, CREATE: { - execute: opCreate, - gasCost: gasCreate, - validateStack: makeStackFunc(3, 1), - memorySize: memoryCreate, - valid: true, - writes: true, - returns: true, + execute: opCreate, + constantGas: params.CreateGas, + dynamicGas: gasCreate, + minStack: minStack(3, 1), + maxStack: maxStack(3, 1), + memorySize: memoryCreate, + valid: true, + writes: true, + returns: true, }, CALL: { - execute: opCall, - gasCost: gasCall, - validateStack: makeStackFunc(7, 1), - memorySize: memoryCall, - valid: true, - returns: true, + execute: opCall, + constantGas: params.CallGasFrontier, + dynamicGas: gasCall, + minStack: minStack(7, 1), + maxStack: maxStack(7, 1), + memorySize: memoryCall, + valid: true, + returns: true, }, CALLCODE: { - execute: opCallCode, - gasCost: gasCallCode, - validateStack: makeStackFunc(7, 1), - memorySize: memoryCall, - valid: true, - returns: true, + execute: opCallCode, + constantGas: params.CallGasFrontier, + dynamicGas: gasCallCode, + minStack: minStack(7, 1), + maxStack: maxStack(7, 1), + memorySize: memoryCall, + valid: true, + returns: true, }, RETURN: { - execute: opReturn, - gasCost: gasReturn, - validateStack: makeStackFunc(2, 0), - memorySize: memoryReturn, - halts: true, - valid: true, + execute: opReturn, + dynamicGas: gasReturn, + minStack: minStack(2, 0), + maxStack: maxStack(2, 0), + memorySize: memoryReturn, + halts: true, + valid: true, }, SELFDESTRUCT: { - execute: opSuicide, - gasCost: gasSuicide, - validateStack: makeStackFunc(1, 0), - halts: true, - valid: true, - writes: true, + execute: opSuicide, + dynamicGas: gasSelfdestruct, + minStack: minStack(1, 0), + maxStack: maxStack(1, 0), + halts: true, + valid: true, + writes: true, }, } } diff --git a/core/vm/logger.go b/core/vm/logger.go index bc01ac12fcdd..33c58ac9da7f 100644 --- a/core/vm/logger.go +++ b/core/vm/logger.go @@ -23,10 +23,10 @@ import ( "math/big" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/types" ) // Storage represents a contract's storage. @@ -98,7 +98,7 @@ func (s *StructLog) ErrorString() string { // Note that reference types are actual VM data structures; make copies // if you need to retain them beyond the current call. type Tracer interface { - CaptureStart(from common.Address, to common.Address, call bool, input []byte, gas uint64, value *big.Int) error + CaptureStart(from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) error CaptureState(env *EVM, pc uint64, op OpCode, gas, cost uint64, memory *Memory, stack *Stack, contract *Contract, depth int, err error) error CaptureFault(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, err error) error @@ -158,7 +158,7 @@ func (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost ui ) l.changedValues[contract.Address()][address] = value } - // Copy a snapstot of the current memory state to a new buffer + // Copy a snapshot of the current memory state to a new buffer var mem []byte if !l.cfg.DisableMemory { mem = make([]byte, len(memory.Data())) @@ -177,7 +177,7 @@ func (l *StructLogger) CaptureState(env *EVM, pc uint64, op OpCode, gas, cost ui if !l.cfg.DisableStorage { storage = l.changedValues[contract.Address()].Copy() } - // create a new snaptshot of the EVM. + // create a new snapshot of the EVM. log := StructLog{pc, op, gas, cost, mem, memory.Len(), stck, storage, depth, env.StateDB.GetRefund(), err} l.logs = append(l.logs, log) diff --git a/core/vm/logger_json.go b/core/vm/logger_json.go index ce32b827a4b0..04a83d0660fc 100644 --- a/core/vm/logger_json.go +++ b/core/vm/logger_json.go @@ -1,18 +1,18 @@ // Copyright 2017 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// 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 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. // -// go-ethereum is distributed in the hope that it will be useful, +// 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 General Public License for more details. +// GNU Lesser 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 . +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . package vm @@ -22,8 +22,8 @@ import ( "math/big" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" ) type JSONLogger struct { @@ -34,7 +34,11 @@ type JSONLogger struct { // NewJSONLogger creates a new EVM tracer that prints execution steps as JSON objects // into the provided stream. func NewJSONLogger(cfg *LogConfig, writer io.Writer) *JSONLogger { - return &JSONLogger{json.NewEncoder(writer), cfg} + l := &JSONLogger{json.NewEncoder(writer), cfg} + if l.cfg == nil { + l.cfg = &LogConfig{} + } + return l } func (l *JSONLogger) CaptureStart(from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) error { diff --git a/core/vm/logger_test.go b/core/vm/logger_test.go index 13250c8e0737..2ea7535a794d 100644 --- a/core/vm/logger_test.go +++ b/core/vm/logger_test.go @@ -20,9 +20,9 @@ import ( "math/big" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/params" ) type dummyContractRef struct { diff --git a/core/vm/memory.go b/core/vm/memory.go index 40b0c999f6b9..496a4024ba01 100644 --- a/core/vm/memory.go +++ b/core/vm/memory.go @@ -20,7 +20,7 @@ import ( "fmt" "math/big" - "github.com/nebulaai/nbai-node/common/math" + "github.com/ethereum/go-ethereum/common/math" ) // Memory implements a simple memory model for the ethereum virtual machine. @@ -70,7 +70,7 @@ func (m *Memory) Resize(size uint64) { } // Get returns offset + size as a new slice -func (m *Memory) Get(offset, size int64) (cpy []byte) { +func (m *Memory) GetCopy(offset, size int64) (cpy []byte) { if size == 0 { return nil } diff --git a/core/vm/memory_table.go b/core/vm/memory_table.go index e35688d1e5f5..4fcb41442c4e 100644 --- a/core/vm/memory_table.go +++ b/core/vm/memory_table.go @@ -16,82 +16,98 @@ package vm -import ( - "math/big" - - "github.com/nebulaai/nbai-node/common/math" -) - -func memorySha3(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), stack.Back(1)) +func memorySha3(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(1)) } -func memoryCallDataCopy(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), stack.Back(2)) +func memoryCallDataCopy(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(2)) } -func memoryReturnDataCopy(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), stack.Back(2)) +func memoryReturnDataCopy(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(2)) } -func memoryCodeCopy(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), stack.Back(2)) +func memoryCodeCopy(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(2)) } -func memoryExtCodeCopy(stack *Stack) *big.Int { - return calcMemSize(stack.Back(1), stack.Back(3)) +func memoryExtCodeCopy(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(1), stack.Back(3)) } -func memoryMLoad(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), big.NewInt(32)) +func memoryMLoad(stack *Stack) (uint64, bool) { + return calcMemSize64WithUint(stack.Back(0), 32) } -func memoryMStore8(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), big.NewInt(1)) +func memoryMStore8(stack *Stack) (uint64, bool) { + return calcMemSize64WithUint(stack.Back(0), 1) } -func memoryMStore(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), big.NewInt(32)) +func memoryMStore(stack *Stack) (uint64, bool) { + return calcMemSize64WithUint(stack.Back(0), 32) } -func memoryCreate(stack *Stack) *big.Int { - return calcMemSize(stack.Back(1), stack.Back(2)) +func memoryCreate(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(1), stack.Back(2)) } -func memoryCreate2(stack *Stack) *big.Int { - return calcMemSize(stack.Back(1), stack.Back(2)) +func memoryCreate2(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(1), stack.Back(2)) } -func memoryCall(stack *Stack) *big.Int { - x := calcMemSize(stack.Back(5), stack.Back(6)) - y := calcMemSize(stack.Back(3), stack.Back(4)) - - return math.BigMax(x, y) +func memoryCall(stack *Stack) (uint64, bool) { + x, overflow := calcMemSize64(stack.Back(5), stack.Back(6)) + if overflow { + return 0, true + } + y, overflow := calcMemSize64(stack.Back(3), stack.Back(4)) + if overflow { + return 0, true + } + if x > y { + return x, false + } + return y, false } - -func memoryDelegateCall(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 memoryDelegateCall(stack *Stack) (uint64, bool) { + x, overflow := calcMemSize64(stack.Back(4), stack.Back(5)) + if overflow { + return 0, true + } + y, overflow := calcMemSize64(stack.Back(2), stack.Back(3)) + if overflow { + return 0, true + } + if x > y { + return x, false + } + return y, false } -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 memoryStaticCall(stack *Stack) (uint64, bool) { + x, overflow := calcMemSize64(stack.Back(4), stack.Back(5)) + if overflow { + return 0, true + } + y, overflow := calcMemSize64(stack.Back(2), stack.Back(3)) + if overflow { + return 0, true + } + if x > y { + return x, false + } + return y, false } -func memoryReturn(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), stack.Back(1)) +func memoryReturn(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(1)) } -func memoryRevert(stack *Stack) *big.Int { - return calcMemSize(stack.Back(0), stack.Back(1)) +func memoryRevert(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(1)) } -func memoryLog(stack *Stack) *big.Int { - mSize, mStart := stack.Back(1), stack.Back(0) - return calcMemSize(mStart, mSize) +func memoryLog(stack *Stack) (uint64, bool) { + return calcMemSize64(stack.Back(0), stack.Back(1)) } diff --git a/core/vm/opcodes.go b/core/vm/opcodes.go index 4349ffd29525..ba0ba01b8f03 100644 --- a/core/vm/opcodes.go +++ b/core/vm/opcodes.go @@ -101,6 +101,8 @@ const ( NUMBER DIFFICULTY GASLIMIT + CHAINID = 0x46 + SELFBALANCE = 0x47 ) // 0x50 range - 'storage' and execution. @@ -271,12 +273,14 @@ var opCodeToString = map[OpCode]string{ EXTCODEHASH: "EXTCODEHASH", // 0x40 range - block operations. - BLOCKHASH: "BLOCKHASH", - COINBASE: "COINBASE", - TIMESTAMP: "TIMESTAMP", - NUMBER: "NUMBER", - DIFFICULTY: "DIFFICULTY", - GASLIMIT: "GASLIMIT", + BLOCKHASH: "BLOCKHASH", + COINBASE: "COINBASE", + TIMESTAMP: "TIMESTAMP", + NUMBER: "NUMBER", + DIFFICULTY: "DIFFICULTY", + GASLIMIT: "GASLIMIT", + CHAINID: "CHAINID", + SELFBALANCE: "SELFBALANCE", // 0x50 range - 'storage' and execution. POP: "POP", @@ -428,6 +432,7 @@ var stringToOp = map[string]OpCode{ "CALLDATALOAD": CALLDATALOAD, "CALLDATASIZE": CALLDATASIZE, "CALLDATACOPY": CALLDATACOPY, + "CHAINID": CHAINID, "DELEGATECALL": DELEGATECALL, "STATICCALL": STATICCALL, "CODESIZE": CODESIZE, @@ -444,6 +449,7 @@ var stringToOp = map[string]OpCode{ "NUMBER": NUMBER, "DIFFICULTY": DIFFICULTY, "GASLIMIT": GASLIMIT, + "SELFBALANCE": SELFBALANCE, "POP": POP, "MLOAD": MLOAD, "MSTORE": MSTORE, diff --git a/core/vm/runtime/env.go b/core/vm/runtime/env.go index c05d3664ea32..31c9b9cf9da0 100644 --- a/core/vm/runtime/env.go +++ b/core/vm/runtime/env.go @@ -17,9 +17,9 @@ package runtime import ( - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/vm" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/vm" ) func NewEnv(cfg *Config) *vm.EVM { diff --git a/core/vm/runtime/runtime.go b/core/vm/runtime/runtime.go index 63125f817807..db1f6f38222b 100644 --- a/core/vm/runtime/runtime.go +++ b/core/vm/runtime/runtime.go @@ -21,12 +21,12 @@ import ( "math/big" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" ) // Config is a basic type specifying certain configuration flags for running @@ -99,7 +99,7 @@ func Execute(code, input []byte, cfg *Config) ([]byte, *state.StateDB, error) { setDefaults(cfg) if cfg.State == nil { - cfg.State, _ = state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + cfg.State, _ = state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) } var ( address = common.BytesToAddress([]byte("contract")) @@ -129,7 +129,7 @@ func Create(input []byte, cfg *Config) ([]byte, common.Address, uint64, error) { setDefaults(cfg) if cfg.State == nil { - cfg.State, _ = state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + cfg.State, _ = state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) } var ( vmenv = NewEnv(cfg) diff --git a/core/vm/runtime/runtime_example_test.go b/core/vm/runtime/runtime_example_test.go index f378e7965430..b7d0ddc384ea 100644 --- a/core/vm/runtime/runtime_example_test.go +++ b/core/vm/runtime/runtime_example_test.go @@ -19,8 +19,8 @@ package runtime_test import ( "fmt" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/vm/runtime" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/vm/runtime" ) func ExampleExecute() { diff --git a/core/vm/runtime/runtime_test.go b/core/vm/runtime/runtime_test.go index 67f1e9d205cd..15f545ddcafb 100644 --- a/core/vm/runtime/runtime_test.go +++ b/core/vm/runtime/runtime_test.go @@ -21,12 +21,12 @@ import ( "strings" "testing" - "github.com/nebulaai/nbai-node/accounts/abi" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" ) func TestDefaults(t *testing.T) { @@ -95,7 +95,7 @@ func TestExecute(t *testing.T) { } func TestCall(t *testing.T) { - state, _ := state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + state, _ := state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) address := common.HexToAddress("0x0a") state.SetCode(address, []byte{ byte(vm.PUSH1), 10, @@ -151,7 +151,7 @@ func BenchmarkCall(b *testing.B) { } func benchmarkEVM_Create(bench *testing.B, code string) { var ( - statedb, _ = state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + statedb, _ = state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) sender = common.BytesToAddress([]byte("sender")) receiver = common.BytesToAddress([]byte("receiver")) ) diff --git a/core/vm/stack.go b/core/vm/stack.go index 4c1b9e803707..c9c3d07f4b6f 100644 --- a/core/vm/stack.go +++ b/core/vm/stack.go @@ -74,13 +74,6 @@ func (st *Stack) Back(n int) *big.Int { return st.data[st.len()-n-1] } -func (st *Stack) require(n int) error { - if st.len() < n { - return fmt.Errorf("stack underflow (%d <=> %d)", len(st.data), n) - } - return nil -} - // Print dumps the content of the stack func (st *Stack) Print() { fmt.Println("### stack ###") diff --git a/core/vm/stack_table.go b/core/vm/stack_table.go index 9545d2d50d2a..10c12901afdb 100644 --- a/core/vm/stack_table.go +++ b/core/vm/stack_table.go @@ -17,28 +17,26 @@ package vm import ( - "fmt" - - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/params" ) -func makeStackFunc(pop, push int) stackValidationFunc { - return func(stack *Stack) error { - if err := stack.require(pop); err != nil { - return err - } - - if stack.len()+push-pop > int(params.StackLimit) { - return fmt.Errorf("stack limit reached %d (%d)", stack.len(), params.StackLimit) - } - return nil - } +func minSwapStack(n int) int { + return minStack(n, n) +} +func maxSwapStack(n int) int { + return maxStack(n, n) } -func makeDupStackFunc(n int) stackValidationFunc { - return makeStackFunc(n, n+1) +func minDupStack(n int) int { + return minStack(n, n+1) +} +func maxDupStack(n int) int { + return maxStack(n, n+1) } -func makeSwapStackFunc(n int) stackValidationFunc { - return makeStackFunc(n, n) +func maxStack(pop, push int) int { + return int(params.StackLimit) + pop - push +} +func minStack(pops, push int) int { + return pops } diff --git a/core/vm/testdata/testcases_add.json b/core/vm/testdata/testcases_add.json new file mode 100644 index 000000000000..c03ae96ada40 --- /dev/null +++ b/core/vm/testdata/testcases_add.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000006"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000006"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"000000000000000000000000000000000000000000000000000000000000000a"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000003"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000006"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000003"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000006"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_and.json b/core/vm/testdata/testcases_and.json new file mode 100644 index 000000000000..aba5f2463c84 --- /dev/null +++ b/core/vm/testdata/testcases_and.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_byte.json b/core/vm/testdata/testcases_byte.json new file mode 100644 index 000000000000..88d7c7d80711 --- /dev/null +++ b/core/vm/testdata/testcases_byte.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"000000000000000000000000000000000000000000000000000000000000007f"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"000000000000000000000000000000000000000000000000000000000000007f"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000080"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000080"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"00000000000000000000000000000000000000000000000000000000000000ff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_div.json b/core/vm/testdata/testcases_div.json new file mode 100644 index 000000000000..b1f9c7fbac8b --- /dev/null +++ b/core/vm/testdata/testcases_div.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"3333333333333333333333333333333333333333333333333333333333333332"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"3333333333333333333333333333333333333333333333333333333333333333"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_eq.json b/core/vm/testdata/testcases_eq.json new file mode 100644 index 000000000000..937eadb02481 --- /dev/null +++ b/core/vm/testdata/testcases_eq.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_exp.json b/core/vm/testdata/testcases_exp.json new file mode 100644 index 000000000000..61818357f8c6 --- /dev/null +++ b/core/vm/testdata/testcases_exp.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000c35"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3cb"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c29"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c29"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"3333333333333333333333333333333333333333333333333333333333333333"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"58cd20afa2f05a708ede54b48d3ae685db76b3bb83cf2cf95d4e8fb00bcbe61d"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"a732df505d0fa58f7121ab4b72c5197a24894c447c30d306a2b1704ff43419e3"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccd"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"3333333333333333333333333333333333333333333333333333333333333333"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_gt.json b/core/vm/testdata/testcases_gt.json new file mode 100644 index 000000000000..637bd3f6e67b --- /dev/null +++ b/core/vm/testdata/testcases_gt.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_lt.json b/core/vm/testdata/testcases_lt.json new file mode 100644 index 000000000000..55252a4de263 --- /dev/null +++ b/core/vm/testdata/testcases_lt.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_mod.json b/core/vm/testdata/testcases_mod.json new file mode 100644 index 000000000000..192503f26f21 --- /dev/null +++ b/core/vm/testdata/testcases_mod.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000003"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000003"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000003"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_mul.json b/core/vm/testdata/testcases_mul.json new file mode 100644 index 000000000000..dc44c253f6ec --- /dev/null +++ b/core/vm/testdata/testcases_mul.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000019"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"800000000000000000000000000000000000000000000000000000000000000a"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"800000000000000000000000000000000000000000000000000000000000000a"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000019"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_or.json b/core/vm/testdata/testcases_or.json new file mode 100644 index 000000000000..bfa561b58595 --- /dev/null +++ b/core/vm/testdata/testcases_or.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_sar.json b/core/vm/testdata/testcases_sar.json new file mode 100644 index 000000000000..c93abbd654fa --- /dev/null +++ b/core/vm/testdata/testcases_sar.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"c000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fc00000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"c000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fc00000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_sdiv.json b/core/vm/testdata/testcases_sdiv.json new file mode 100644 index 000000000000..18cb666ab507 --- /dev/null +++ b/core/vm/testdata/testcases_sdiv.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"e666666666666666666666666666666666666666666666666666666666666667"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"e666666666666666666666666666666666666666666666666666666666666667"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"e666666666666666666666666666666666666666666666666666666666666667"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"e666666666666666666666666666666666666666666666666666666666666667"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"1999999999999999999999999999999999999999999999999999999999999999"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_sgt.json b/core/vm/testdata/testcases_sgt.json new file mode 100644 index 000000000000..aa581a65492a --- /dev/null +++ b/core/vm/testdata/testcases_sgt.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_shl.json b/core/vm/testdata/testcases_shl.json new file mode 100644 index 000000000000..65e9c07b77a9 --- /dev/null +++ b/core/vm/testdata/testcases_shl.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000020"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"000000000000000000000000000000000000000000000000000000000000000a"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"00000000000000000000000000000000000000000000000000000000000000a0"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000020"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_shr.json b/core/vm/testdata/testcases_shr.json new file mode 100644 index 000000000000..a38491350d5d --- /dev/null +++ b/core/vm/testdata/testcases_shr.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"4000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0400000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"4000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0400000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_signext.json b/core/vm/testdata/testcases_signext.json new file mode 100644 index 000000000000..bdadd400e78c --- /dev/null +++ b/core/vm/testdata/testcases_signext.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_slt.json b/core/vm/testdata/testcases_slt.json new file mode 100644 index 000000000000..4369b96fd8f4 --- /dev/null +++ b/core/vm/testdata/testcases_slt.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_smod.json b/core/vm/testdata/testcases_smod.json new file mode 100644 index 000000000000..980e0341a797 --- /dev/null +++ b/core/vm/testdata/testcases_smod.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_sub.json b/core/vm/testdata/testcases_sub.json new file mode 100644 index 000000000000..b3881a5ab624 --- /dev/null +++ b/core/vm/testdata/testcases_sub.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000003"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000007"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000003"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000006"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000006"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"000000000000000000000000000000000000000000000000000000000000000a"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000003"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000006"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000002"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000006"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000002"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/core/vm/testdata/testcases_xor.json b/core/vm/testdata/testcases_xor.json new file mode 100644 index 000000000000..4cc2dddd7dfa --- /dev/null +++ b/core/vm/testdata/testcases_xor.json @@ -0,0 +1 @@ +[{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"0000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"0000000000000000000000000000000000000000000000000000000000000005","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"8000000000000000000000000000000000000000000000000000000000000000","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"0000000000000000000000000000000000000000000000000000000000000001"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"8000000000000000000000000000000000000000000000000000000000000001","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000005"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000004"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000000"},{"X":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000000","Expected":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000001","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"0000000000000000000000000000000000000000000000000000000000000005","Expected":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","Expected":"8000000000000000000000000000000000000000000000000000000000000001"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"8000000000000000000000000000000000000000000000000000000000000000"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000000","Expected":"7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"8000000000000000000000000000000000000000000000000000000000000001","Expected":"7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb","Expected":"0000000000000000000000000000000000000000000000000000000000000004"},{"X":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Y":"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff","Expected":"0000000000000000000000000000000000000000000000000000000000000000"}] \ No newline at end of file diff --git a/crypto/blake2b/blake2b.go b/crypto/blake2b/blake2b.go new file mode 100644 index 000000000000..5da50cab6f00 --- /dev/null +++ b/crypto/blake2b/blake2b.go @@ -0,0 +1,319 @@ +// 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. + +// Package blake2b implements the BLAKE2b hash algorithm defined by RFC 7693 +// and the extendable output function (XOF) BLAKE2Xb. +// +// For a detailed specification of BLAKE2b see https://blake2.net/blake2.pdf +// and for BLAKE2Xb see https://blake2.net/blake2x.pdf +// +// If you aren't sure which function you need, use BLAKE2b (Sum512 or New512). +// If you need a secret-key MAC (message authentication code), use the New512 +// function with a non-nil key. +// +// BLAKE2X is a construction to compute hash values larger than 64 bytes. It +// can produce hash values between 0 and 4 GiB. +package blake2b + +import ( + "encoding/binary" + "errors" + "hash" +) + +const ( + // The blocksize of BLAKE2b in bytes. + BlockSize = 128 + // The hash size of BLAKE2b-512 in bytes. + Size = 64 + // The hash size of BLAKE2b-384 in bytes. + Size384 = 48 + // The hash size of BLAKE2b-256 in bytes. + Size256 = 32 +) + +var ( + useAVX2 bool + useAVX bool + useSSE4 bool +) + +var ( + errKeySize = errors.New("blake2b: invalid key size") + errHashSize = errors.New("blake2b: invalid hash size") +) + +var iv = [8]uint64{ + 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, + 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179, +} + +// Sum512 returns the BLAKE2b-512 checksum of the data. +func Sum512(data []byte) [Size]byte { + var sum [Size]byte + checkSum(&sum, Size, data) + return sum +} + +// Sum384 returns the BLAKE2b-384 checksum of the data. +func Sum384(data []byte) [Size384]byte { + var sum [Size]byte + var sum384 [Size384]byte + checkSum(&sum, Size384, data) + copy(sum384[:], sum[:Size384]) + return sum384 +} + +// Sum256 returns the BLAKE2b-256 checksum of the data. +func Sum256(data []byte) [Size256]byte { + var sum [Size]byte + var sum256 [Size256]byte + checkSum(&sum, Size256, data) + copy(sum256[:], sum[:Size256]) + return sum256 +} + +// New512 returns a new hash.Hash computing the BLAKE2b-512 checksum. A non-nil +// key turns the hash into a MAC. The key must be between zero and 64 bytes long. +func New512(key []byte) (hash.Hash, error) { return newDigest(Size, key) } + +// New384 returns a new hash.Hash computing the BLAKE2b-384 checksum. A non-nil +// key turns the hash into a MAC. The key must be between zero and 64 bytes long. +func New384(key []byte) (hash.Hash, error) { return newDigest(Size384, key) } + +// New256 returns a new hash.Hash computing the BLAKE2b-256 checksum. A non-nil +// key turns the hash into a MAC. The key must be between zero and 64 bytes long. +func New256(key []byte) (hash.Hash, error) { return newDigest(Size256, key) } + +// New returns a new hash.Hash computing the BLAKE2b checksum with a custom length. +// A non-nil key turns the hash into a MAC. The key must be between zero and 64 bytes long. +// The hash size can be a value between 1 and 64 but it is highly recommended to use +// values equal or greater than: +// - 32 if BLAKE2b is used as a hash function (The key is zero bytes long). +// - 16 if BLAKE2b is used as a MAC function (The key is at least 16 bytes long). +// When the key is nil, the returned hash.Hash implements BinaryMarshaler +// and BinaryUnmarshaler for state (de)serialization as documented by hash.Hash. +func New(size int, key []byte) (hash.Hash, error) { return newDigest(size, key) } + +// F is a compression function for BLAKE2b. It takes as an argument the state +// vector `h`, message block vector `m`, offset counter `t`, final block indicator +// flag `f`, and number of rounds `rounds`. The state vector provided as the first +// parameter is modified by the function. +func F(h *[8]uint64, m [16]uint64, c [2]uint64, final bool, rounds uint32) { + var flag uint64 + if final { + flag = 0xFFFFFFFFFFFFFFFF + } + f(h, &m, c[0], c[1], flag, uint64(rounds)) +} + +func newDigest(hashSize int, key []byte) (*digest, error) { + if hashSize < 1 || hashSize > Size { + return nil, errHashSize + } + if len(key) > Size { + return nil, errKeySize + } + d := &digest{ + size: hashSize, + keyLen: len(key), + } + copy(d.key[:], key) + d.Reset() + return d, nil +} + +func checkSum(sum *[Size]byte, hashSize int, data []byte) { + h := iv + h[0] ^= uint64(hashSize) | (1 << 16) | (1 << 24) + var c [2]uint64 + + if length := len(data); length > BlockSize { + n := length &^ (BlockSize - 1) + if length == n { + n -= BlockSize + } + hashBlocks(&h, &c, 0, data[:n]) + data = data[n:] + } + + var block [BlockSize]byte + offset := copy(block[:], data) + remaining := uint64(BlockSize - offset) + if c[0] < remaining { + c[1]-- + } + c[0] -= remaining + + hashBlocks(&h, &c, 0xFFFFFFFFFFFFFFFF, block[:]) + + for i, v := range h[:(hashSize+7)/8] { + binary.LittleEndian.PutUint64(sum[8*i:], v) + } +} + +func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) { + var m [16]uint64 + c0, c1 := c[0], c[1] + + for i := 0; i < len(blocks); { + c0 += BlockSize + if c0 < BlockSize { + c1++ + } + for j := range m { + m[j] = binary.LittleEndian.Uint64(blocks[i:]) + i += 8 + } + f(h, &m, c0, c1, flag, 12) + } + c[0], c[1] = c0, c1 +} + +type digest struct { + h [8]uint64 + c [2]uint64 + size int + block [BlockSize]byte + offset int + + key [BlockSize]byte + keyLen int +} + +const ( + magic = "b2b" + marshaledSize = len(magic) + 8*8 + 2*8 + 1 + BlockSize + 1 +) + +func (d *digest) MarshalBinary() ([]byte, error) { + if d.keyLen != 0 { + return nil, errors.New("crypto/blake2b: cannot marshal MACs") + } + b := make([]byte, 0, marshaledSize) + b = append(b, magic...) + for i := 0; i < 8; i++ { + b = appendUint64(b, d.h[i]) + } + b = appendUint64(b, d.c[0]) + b = appendUint64(b, d.c[1]) + // Maximum value for size is 64 + b = append(b, byte(d.size)) + b = append(b, d.block[:]...) + b = append(b, byte(d.offset)) + return b, nil +} + +func (d *digest) UnmarshalBinary(b []byte) error { + if len(b) < len(magic) || string(b[:len(magic)]) != magic { + return errors.New("crypto/blake2b: invalid hash state identifier") + } + if len(b) != marshaledSize { + return errors.New("crypto/blake2b: invalid hash state size") + } + b = b[len(magic):] + for i := 0; i < 8; i++ { + b, d.h[i] = consumeUint64(b) + } + b, d.c[0] = consumeUint64(b) + b, d.c[1] = consumeUint64(b) + d.size = int(b[0]) + b = b[1:] + copy(d.block[:], b[:BlockSize]) + b = b[BlockSize:] + d.offset = int(b[0]) + return nil +} + +func (d *digest) BlockSize() int { return BlockSize } + +func (d *digest) Size() int { return d.size } + +func (d *digest) Reset() { + d.h = iv + d.h[0] ^= uint64(d.size) | (uint64(d.keyLen) << 8) | (1 << 16) | (1 << 24) + d.offset, d.c[0], d.c[1] = 0, 0, 0 + if d.keyLen > 0 { + d.block = d.key + d.offset = BlockSize + } +} + +func (d *digest) Write(p []byte) (n int, err error) { + n = len(p) + + if d.offset > 0 { + remaining := BlockSize - d.offset + if n <= remaining { + d.offset += copy(d.block[d.offset:], p) + return + } + copy(d.block[d.offset:], p[:remaining]) + hashBlocks(&d.h, &d.c, 0, d.block[:]) + d.offset = 0 + p = p[remaining:] + } + + if length := len(p); length > BlockSize { + nn := length &^ (BlockSize - 1) + if length == nn { + nn -= BlockSize + } + hashBlocks(&d.h, &d.c, 0, p[:nn]) + p = p[nn:] + } + + if len(p) > 0 { + d.offset += copy(d.block[:], p) + } + + return +} + +func (d *digest) Sum(sum []byte) []byte { + var hash [Size]byte + d.finalize(&hash) + return append(sum, hash[:d.size]...) +} + +func (d *digest) finalize(hash *[Size]byte) { + var block [BlockSize]byte + copy(block[:], d.block[:d.offset]) + remaining := uint64(BlockSize - d.offset) + + c := d.c + if c[0] < remaining { + c[1]-- + } + c[0] -= remaining + + h := d.h + hashBlocks(&h, &c, 0xFFFFFFFFFFFFFFFF, block[:]) + + for i, v := range h { + binary.LittleEndian.PutUint64(hash[8*i:], v) + } +} + +func appendUint64(b []byte, x uint64) []byte { + var a [8]byte + binary.BigEndian.PutUint64(a[:], x) + return append(b, a[:]...) +} + +func appendUint32(b []byte, x uint32) []byte { + var a [4]byte + binary.BigEndian.PutUint32(a[:], x) + return append(b, a[:]...) +} + +func consumeUint64(b []byte) ([]byte, uint64) { + x := binary.BigEndian.Uint64(b) + return b[8:], x +} + +func consumeUint32(b []byte) ([]byte, uint32) { + x := binary.BigEndian.Uint32(b) + return b[4:], x +} diff --git a/crypto/blake2b/blake2bAVX2_amd64.go b/crypto/blake2b/blake2bAVX2_amd64.go new file mode 100644 index 000000000000..0d52b186990b --- /dev/null +++ b/crypto/blake2b/blake2bAVX2_amd64.go @@ -0,0 +1,37 @@ +// 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 go1.7,amd64,!gccgo,!appengine + +package blake2b + +import "golang.org/x/sys/cpu" + +func init() { + useAVX2 = cpu.X86.HasAVX2 + useAVX = cpu.X86.HasAVX + useSSE4 = cpu.X86.HasSSE41 +} + +//go:noescape +func fAVX2(h *[8]uint64, m *[16]uint64, c0, c1 uint64, flag uint64, rounds uint64) + +//go:noescape +func fAVX(h *[8]uint64, m *[16]uint64, c0, c1 uint64, flag uint64, rounds uint64) + +//go:noescape +func fSSE4(h *[8]uint64, m *[16]uint64, c0, c1 uint64, flag uint64, rounds uint64) + +func f(h *[8]uint64, m *[16]uint64, c0, c1 uint64, flag uint64, rounds uint64) { + switch { + case useAVX2: + fAVX2(h, m, c0, c1, flag, rounds) + case useAVX: + fAVX(h, m, c0, c1, flag, rounds) + case useSSE4: + fSSE4(h, m, c0, c1, flag, rounds) + default: + fGeneric(h, m, c0, c1, flag, rounds) + } +} diff --git a/crypto/blake2b/blake2bAVX2_amd64.s b/crypto/blake2b/blake2bAVX2_amd64.s new file mode 100644 index 000000000000..4998af37dddd --- /dev/null +++ b/crypto/blake2b/blake2bAVX2_amd64.s @@ -0,0 +1,717 @@ +// 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 go1.7,amd64,!gccgo,!appengine + +#include "textflag.h" + +DATA ·AVX2_iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908 +DATA ·AVX2_iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b +DATA ·AVX2_iv0<>+0x10(SB)/8, $0x3c6ef372fe94f82b +DATA ·AVX2_iv0<>+0x18(SB)/8, $0xa54ff53a5f1d36f1 +GLOBL ·AVX2_iv0<>(SB), (NOPTR+RODATA), $32 + +DATA ·AVX2_iv1<>+0x00(SB)/8, $0x510e527fade682d1 +DATA ·AVX2_iv1<>+0x08(SB)/8, $0x9b05688c2b3e6c1f +DATA ·AVX2_iv1<>+0x10(SB)/8, $0x1f83d9abfb41bd6b +DATA ·AVX2_iv1<>+0x18(SB)/8, $0x5be0cd19137e2179 +GLOBL ·AVX2_iv1<>(SB), (NOPTR+RODATA), $32 + +DATA ·AVX2_c40<>+0x00(SB)/8, $0x0201000706050403 +DATA ·AVX2_c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b +DATA ·AVX2_c40<>+0x10(SB)/8, $0x0201000706050403 +DATA ·AVX2_c40<>+0x18(SB)/8, $0x0a09080f0e0d0c0b +GLOBL ·AVX2_c40<>(SB), (NOPTR+RODATA), $32 + +DATA ·AVX2_c48<>+0x00(SB)/8, $0x0100070605040302 +DATA ·AVX2_c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a +DATA ·AVX2_c48<>+0x10(SB)/8, $0x0100070605040302 +DATA ·AVX2_c48<>+0x18(SB)/8, $0x09080f0e0d0c0b0a +GLOBL ·AVX2_c48<>(SB), (NOPTR+RODATA), $32 + +DATA ·AVX_iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908 +DATA ·AVX_iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b +GLOBL ·AVX_iv0<>(SB), (NOPTR+RODATA), $16 + +DATA ·AVX_iv1<>+0x00(SB)/8, $0x3c6ef372fe94f82b +DATA ·AVX_iv1<>+0x08(SB)/8, $0xa54ff53a5f1d36f1 +GLOBL ·AVX_iv1<>(SB), (NOPTR+RODATA), $16 + +DATA ·AVX_iv2<>+0x00(SB)/8, $0x510e527fade682d1 +DATA ·AVX_iv2<>+0x08(SB)/8, $0x9b05688c2b3e6c1f +GLOBL ·AVX_iv2<>(SB), (NOPTR+RODATA), $16 + +DATA ·AVX_iv3<>+0x00(SB)/8, $0x1f83d9abfb41bd6b +DATA ·AVX_iv3<>+0x08(SB)/8, $0x5be0cd19137e2179 +GLOBL ·AVX_iv3<>(SB), (NOPTR+RODATA), $16 + +DATA ·AVX_c40<>+0x00(SB)/8, $0x0201000706050403 +DATA ·AVX_c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b +GLOBL ·AVX_c40<>(SB), (NOPTR+RODATA), $16 + +DATA ·AVX_c48<>+0x00(SB)/8, $0x0100070605040302 +DATA ·AVX_c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a +GLOBL ·AVX_c48<>(SB), (NOPTR+RODATA), $16 + +#define VPERMQ_0x39_Y1_Y1 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x39 +#define VPERMQ_0x93_Y1_Y1 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x93 +#define VPERMQ_0x4E_Y2_Y2 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xd2; BYTE $0x4e +#define VPERMQ_0x93_Y3_Y3 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x93 +#define VPERMQ_0x39_Y3_Y3 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x39 + +#define ROUND_AVX2(m0, m1, m2, m3, t, c40, c48) \ + VPADDQ m0, Y0, Y0; \ + VPADDQ Y1, Y0, Y0; \ + VPXOR Y0, Y3, Y3; \ + VPSHUFD $-79, Y3, Y3; \ + VPADDQ Y3, Y2, Y2; \ + VPXOR Y2, Y1, Y1; \ + VPSHUFB c40, Y1, Y1; \ + VPADDQ m1, Y0, Y0; \ + VPADDQ Y1, Y0, Y0; \ + VPXOR Y0, Y3, Y3; \ + VPSHUFB c48, Y3, Y3; \ + VPADDQ Y3, Y2, Y2; \ + VPXOR Y2, Y1, Y1; \ + VPADDQ Y1, Y1, t; \ + VPSRLQ $63, Y1, Y1; \ + VPXOR t, Y1, Y1; \ + VPERMQ_0x39_Y1_Y1; \ + VPERMQ_0x4E_Y2_Y2; \ + VPERMQ_0x93_Y3_Y3; \ + VPADDQ m2, Y0, Y0; \ + VPADDQ Y1, Y0, Y0; \ + VPXOR Y0, Y3, Y3; \ + VPSHUFD $-79, Y3, Y3; \ + VPADDQ Y3, Y2, Y2; \ + VPXOR Y2, Y1, Y1; \ + VPSHUFB c40, Y1, Y1; \ + VPADDQ m3, Y0, Y0; \ + VPADDQ Y1, Y0, Y0; \ + VPXOR Y0, Y3, Y3; \ + VPSHUFB c48, Y3, Y3; \ + VPADDQ Y3, Y2, Y2; \ + VPXOR Y2, Y1, Y1; \ + VPADDQ Y1, Y1, t; \ + VPSRLQ $63, Y1, Y1; \ + VPXOR t, Y1, Y1; \ + VPERMQ_0x39_Y3_Y3; \ + VPERMQ_0x4E_Y2_Y2; \ + VPERMQ_0x93_Y1_Y1 + +#define VMOVQ_SI_X11_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x1E +#define VMOVQ_SI_X12_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x26 +#define VMOVQ_SI_X13_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x2E +#define VMOVQ_SI_X14_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x36 +#define VMOVQ_SI_X15_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x3E + +#define VMOVQ_SI_X11(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x5E; BYTE $n +#define VMOVQ_SI_X12(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x66; BYTE $n +#define VMOVQ_SI_X13(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x6E; BYTE $n +#define VMOVQ_SI_X14(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x76; BYTE $n +#define VMOVQ_SI_X15(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x7E; BYTE $n + +#define VPINSRQ_1_SI_X11_0 BYTE $0xC4; BYTE $0x63; BYTE $0xA1; BYTE $0x22; BYTE $0x1E; BYTE $0x01 +#define VPINSRQ_1_SI_X12_0 BYTE $0xC4; BYTE $0x63; BYTE $0x99; BYTE $0x22; BYTE $0x26; BYTE $0x01 +#define VPINSRQ_1_SI_X13_0 BYTE $0xC4; BYTE $0x63; BYTE $0x91; BYTE $0x22; BYTE $0x2E; BYTE $0x01 +#define VPINSRQ_1_SI_X14_0 BYTE $0xC4; BYTE $0x63; BYTE $0x89; BYTE $0x22; BYTE $0x36; BYTE $0x01 +#define VPINSRQ_1_SI_X15_0 BYTE $0xC4; BYTE $0x63; BYTE $0x81; BYTE $0x22; BYTE $0x3E; BYTE $0x01 + +#define VPINSRQ_1_SI_X11(n) BYTE $0xC4; BYTE $0x63; BYTE $0xA1; BYTE $0x22; BYTE $0x5E; BYTE $n; BYTE $0x01 +#define VPINSRQ_1_SI_X12(n) BYTE $0xC4; BYTE $0x63; BYTE $0x99; BYTE $0x22; BYTE $0x66; BYTE $n; BYTE $0x01 +#define VPINSRQ_1_SI_X13(n) BYTE $0xC4; BYTE $0x63; BYTE $0x91; BYTE $0x22; BYTE $0x6E; BYTE $n; BYTE $0x01 +#define VPINSRQ_1_SI_X14(n) BYTE $0xC4; BYTE $0x63; BYTE $0x89; BYTE $0x22; BYTE $0x76; BYTE $n; BYTE $0x01 +#define VPINSRQ_1_SI_X15(n) BYTE $0xC4; BYTE $0x63; BYTE $0x81; BYTE $0x22; BYTE $0x7E; BYTE $n; BYTE $0x01 + +#define VMOVQ_R8_X15 BYTE $0xC4; BYTE $0x41; BYTE $0xF9; BYTE $0x6E; BYTE $0xF8 +#define VPINSRQ_1_R9_X15 BYTE $0xC4; BYTE $0x43; BYTE $0x81; BYTE $0x22; BYTE $0xF9; BYTE $0x01 + +// load msg: Y12 = (i0, i1, i2, i3) +// i0, i1, i2, i3 must not be 0 +#define LOAD_MSG_AVX2_Y12(i0, i1, i2, i3) \ + VMOVQ_SI_X12(i0*8); \ + VMOVQ_SI_X11(i2*8); \ + VPINSRQ_1_SI_X12(i1*8); \ + VPINSRQ_1_SI_X11(i3*8); \ + VINSERTI128 $1, X11, Y12, Y12 + +// load msg: Y13 = (i0, i1, i2, i3) +// i0, i1, i2, i3 must not be 0 +#define LOAD_MSG_AVX2_Y13(i0, i1, i2, i3) \ + VMOVQ_SI_X13(i0*8); \ + VMOVQ_SI_X11(i2*8); \ + VPINSRQ_1_SI_X13(i1*8); \ + VPINSRQ_1_SI_X11(i3*8); \ + VINSERTI128 $1, X11, Y13, Y13 + +// load msg: Y14 = (i0, i1, i2, i3) +// i0, i1, i2, i3 must not be 0 +#define LOAD_MSG_AVX2_Y14(i0, i1, i2, i3) \ + VMOVQ_SI_X14(i0*8); \ + VMOVQ_SI_X11(i2*8); \ + VPINSRQ_1_SI_X14(i1*8); \ + VPINSRQ_1_SI_X11(i3*8); \ + VINSERTI128 $1, X11, Y14, Y14 + +// load msg: Y15 = (i0, i1, i2, i3) +// i0, i1, i2, i3 must not be 0 +#define LOAD_MSG_AVX2_Y15(i0, i1, i2, i3) \ + VMOVQ_SI_X15(i0*8); \ + VMOVQ_SI_X11(i2*8); \ + VPINSRQ_1_SI_X15(i1*8); \ + VPINSRQ_1_SI_X11(i3*8); \ + VINSERTI128 $1, X11, Y15, Y15 + +#define LOAD_MSG_AVX2_0_2_4_6_1_3_5_7_8_10_12_14_9_11_13_15() \ + VMOVQ_SI_X12_0; \ + VMOVQ_SI_X11(4*8); \ + VPINSRQ_1_SI_X12(2*8); \ + VPINSRQ_1_SI_X11(6*8); \ + VINSERTI128 $1, X11, Y12, Y12; \ + LOAD_MSG_AVX2_Y13(1, 3, 5, 7); \ + LOAD_MSG_AVX2_Y14(8, 10, 12, 14); \ + LOAD_MSG_AVX2_Y15(9, 11, 13, 15) + +#define LOAD_MSG_AVX2_14_4_9_13_10_8_15_6_1_0_11_5_12_2_7_3() \ + LOAD_MSG_AVX2_Y12(14, 4, 9, 13); \ + LOAD_MSG_AVX2_Y13(10, 8, 15, 6); \ + VMOVQ_SI_X11(11*8); \ + VPSHUFD $0x4E, 0*8(SI), X14; \ + VPINSRQ_1_SI_X11(5*8); \ + VINSERTI128 $1, X11, Y14, Y14; \ + LOAD_MSG_AVX2_Y15(12, 2, 7, 3) + +#define LOAD_MSG_AVX2_11_12_5_15_8_0_2_13_10_3_7_9_14_6_1_4() \ + VMOVQ_SI_X11(5*8); \ + VMOVDQU 11*8(SI), X12; \ + VPINSRQ_1_SI_X11(15*8); \ + VINSERTI128 $1, X11, Y12, Y12; \ + VMOVQ_SI_X13(8*8); \ + VMOVQ_SI_X11(2*8); \ + VPINSRQ_1_SI_X13_0; \ + VPINSRQ_1_SI_X11(13*8); \ + VINSERTI128 $1, X11, Y13, Y13; \ + LOAD_MSG_AVX2_Y14(10, 3, 7, 9); \ + LOAD_MSG_AVX2_Y15(14, 6, 1, 4) + +#define LOAD_MSG_AVX2_7_3_13_11_9_1_12_14_2_5_4_15_6_10_0_8() \ + LOAD_MSG_AVX2_Y12(7, 3, 13, 11); \ + LOAD_MSG_AVX2_Y13(9, 1, 12, 14); \ + LOAD_MSG_AVX2_Y14(2, 5, 4, 15); \ + VMOVQ_SI_X15(6*8); \ + VMOVQ_SI_X11_0; \ + VPINSRQ_1_SI_X15(10*8); \ + VPINSRQ_1_SI_X11(8*8); \ + VINSERTI128 $1, X11, Y15, Y15 + +#define LOAD_MSG_AVX2_9_5_2_10_0_7_4_15_14_11_6_3_1_12_8_13() \ + LOAD_MSG_AVX2_Y12(9, 5, 2, 10); \ + VMOVQ_SI_X13_0; \ + VMOVQ_SI_X11(4*8); \ + VPINSRQ_1_SI_X13(7*8); \ + VPINSRQ_1_SI_X11(15*8); \ + VINSERTI128 $1, X11, Y13, Y13; \ + LOAD_MSG_AVX2_Y14(14, 11, 6, 3); \ + LOAD_MSG_AVX2_Y15(1, 12, 8, 13) + +#define LOAD_MSG_AVX2_2_6_0_8_12_10_11_3_4_7_15_1_13_5_14_9() \ + VMOVQ_SI_X12(2*8); \ + VMOVQ_SI_X11_0; \ + VPINSRQ_1_SI_X12(6*8); \ + VPINSRQ_1_SI_X11(8*8); \ + VINSERTI128 $1, X11, Y12, Y12; \ + LOAD_MSG_AVX2_Y13(12, 10, 11, 3); \ + LOAD_MSG_AVX2_Y14(4, 7, 15, 1); \ + LOAD_MSG_AVX2_Y15(13, 5, 14, 9) + +#define LOAD_MSG_AVX2_12_1_14_4_5_15_13_10_0_6_9_8_7_3_2_11() \ + LOAD_MSG_AVX2_Y12(12, 1, 14, 4); \ + LOAD_MSG_AVX2_Y13(5, 15, 13, 10); \ + VMOVQ_SI_X14_0; \ + VPSHUFD $0x4E, 8*8(SI), X11; \ + VPINSRQ_1_SI_X14(6*8); \ + VINSERTI128 $1, X11, Y14, Y14; \ + LOAD_MSG_AVX2_Y15(7, 3, 2, 11) + +#define LOAD_MSG_AVX2_13_7_12_3_11_14_1_9_5_15_8_2_0_4_6_10() \ + LOAD_MSG_AVX2_Y12(13, 7, 12, 3); \ + LOAD_MSG_AVX2_Y13(11, 14, 1, 9); \ + LOAD_MSG_AVX2_Y14(5, 15, 8, 2); \ + VMOVQ_SI_X15_0; \ + VMOVQ_SI_X11(6*8); \ + VPINSRQ_1_SI_X15(4*8); \ + VPINSRQ_1_SI_X11(10*8); \ + VINSERTI128 $1, X11, Y15, Y15 + +#define LOAD_MSG_AVX2_6_14_11_0_15_9_3_8_12_13_1_10_2_7_4_5() \ + VMOVQ_SI_X12(6*8); \ + VMOVQ_SI_X11(11*8); \ + VPINSRQ_1_SI_X12(14*8); \ + VPINSRQ_1_SI_X11_0; \ + VINSERTI128 $1, X11, Y12, Y12; \ + LOAD_MSG_AVX2_Y13(15, 9, 3, 8); \ + VMOVQ_SI_X11(1*8); \ + VMOVDQU 12*8(SI), X14; \ + VPINSRQ_1_SI_X11(10*8); \ + VINSERTI128 $1, X11, Y14, Y14; \ + VMOVQ_SI_X15(2*8); \ + VMOVDQU 4*8(SI), X11; \ + VPINSRQ_1_SI_X15(7*8); \ + VINSERTI128 $1, X11, Y15, Y15 + +#define LOAD_MSG_AVX2_10_8_7_1_2_4_6_5_15_9_3_13_11_14_12_0() \ + LOAD_MSG_AVX2_Y12(10, 8, 7, 1); \ + VMOVQ_SI_X13(2*8); \ + VPSHUFD $0x4E, 5*8(SI), X11; \ + VPINSRQ_1_SI_X13(4*8); \ + VINSERTI128 $1, X11, Y13, Y13; \ + LOAD_MSG_AVX2_Y14(15, 9, 3, 13); \ + VMOVQ_SI_X15(11*8); \ + VMOVQ_SI_X11(12*8); \ + VPINSRQ_1_SI_X15(14*8); \ + VPINSRQ_1_SI_X11_0; \ + VINSERTI128 $1, X11, Y15, Y15 + +// func fAVX2(h *[8]uint64, m *[16]uint64, c0, c1 uint64, flag uint64, rounds uint64) +TEXT ·fAVX2(SB), 4, $64-48 // frame size = 32 + 32 byte alignment + MOVQ h+0(FP), AX + MOVQ m+8(FP), SI + MOVQ c0+16(FP), R8 + MOVQ c1+24(FP), R9 + MOVQ flag+32(FP), CX + MOVQ rounds+40(FP), BX + + MOVQ SP, DX + MOVQ SP, R10 + ADDQ $31, R10 + ANDQ $~31, R10 + MOVQ R10, SP + + MOVQ CX, 16(SP) + XORQ CX, CX + MOVQ CX, 24(SP) + + VMOVDQU ·AVX2_c40<>(SB), Y4 + VMOVDQU ·AVX2_c48<>(SB), Y5 + + VMOVDQU 0(AX), Y8 + VMOVDQU 32(AX), Y9 + VMOVDQU ·AVX2_iv0<>(SB), Y6 + VMOVDQU ·AVX2_iv1<>(SB), Y7 + + MOVQ R8, 0(SP) + MOVQ R9, 8(SP) + + VMOVDQA Y8, Y0 + VMOVDQA Y9, Y1 + VMOVDQA Y6, Y2 + VPXOR 0(SP), Y7, Y3 + +loop: + SUBQ $1, BX; JCS done + LOAD_MSG_AVX2_0_2_4_6_1_3_5_7_8_10_12_14_9_11_13_15() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX2_14_4_9_13_10_8_15_6_1_0_11_5_12_2_7_3() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX2_11_12_5_15_8_0_2_13_10_3_7_9_14_6_1_4() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX2_7_3_13_11_9_1_12_14_2_5_4_15_6_10_0_8() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX2_9_5_2_10_0_7_4_15_14_11_6_3_1_12_8_13() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX2_2_6_0_8_12_10_11_3_4_7_15_1_13_5_14_9() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX2_12_1_14_4_5_15_13_10_0_6_9_8_7_3_2_11() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX2_13_7_12_3_11_14_1_9_5_15_8_2_0_4_6_10() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX2_6_14_11_0_15_9_3_8_12_13_1_10_2_7_4_5() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX2_10_8_7_1_2_4_6_5_15_9_3_13_11_14_12_0() + ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) + + JMP loop + +done: + VPXOR Y0, Y8, Y8 + VPXOR Y1, Y9, Y9 + VPXOR Y2, Y8, Y8 + VPXOR Y3, Y9, Y9 + + VMOVDQU Y8, 0(AX) + VMOVDQU Y9, 32(AX) + VZEROUPPER + + MOVQ DX, SP + RET + +#define VPUNPCKLQDQ_X2_X2_X15 BYTE $0xC5; BYTE $0x69; BYTE $0x6C; BYTE $0xFA +#define VPUNPCKLQDQ_X3_X3_X15 BYTE $0xC5; BYTE $0x61; BYTE $0x6C; BYTE $0xFB +#define VPUNPCKLQDQ_X7_X7_X15 BYTE $0xC5; BYTE $0x41; BYTE $0x6C; BYTE $0xFF +#define VPUNPCKLQDQ_X13_X13_X15 BYTE $0xC4; BYTE $0x41; BYTE $0x11; BYTE $0x6C; BYTE $0xFD +#define VPUNPCKLQDQ_X14_X14_X15 BYTE $0xC4; BYTE $0x41; BYTE $0x09; BYTE $0x6C; BYTE $0xFE + +#define VPUNPCKHQDQ_X15_X2_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x69; BYTE $0x6D; BYTE $0xD7 +#define VPUNPCKHQDQ_X15_X3_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xDF +#define VPUNPCKHQDQ_X15_X6_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x49; BYTE $0x6D; BYTE $0xF7 +#define VPUNPCKHQDQ_X15_X7_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xFF +#define VPUNPCKHQDQ_X15_X3_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xD7 +#define VPUNPCKHQDQ_X15_X7_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xF7 +#define VPUNPCKHQDQ_X15_X13_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x11; BYTE $0x6D; BYTE $0xDF +#define VPUNPCKHQDQ_X15_X13_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x11; BYTE $0x6D; BYTE $0xFF + +#define SHUFFLE_AVX() \ + VMOVDQA X6, X13; \ + VMOVDQA X2, X14; \ + VMOVDQA X4, X6; \ + VPUNPCKLQDQ_X13_X13_X15; \ + VMOVDQA X5, X4; \ + VMOVDQA X6, X5; \ + VPUNPCKHQDQ_X15_X7_X6; \ + VPUNPCKLQDQ_X7_X7_X15; \ + VPUNPCKHQDQ_X15_X13_X7; \ + VPUNPCKLQDQ_X3_X3_X15; \ + VPUNPCKHQDQ_X15_X2_X2; \ + VPUNPCKLQDQ_X14_X14_X15; \ + VPUNPCKHQDQ_X15_X3_X3; \ + +#define SHUFFLE_AVX_INV() \ + VMOVDQA X2, X13; \ + VMOVDQA X4, X14; \ + VPUNPCKLQDQ_X2_X2_X15; \ + VMOVDQA X5, X4; \ + VPUNPCKHQDQ_X15_X3_X2; \ + VMOVDQA X14, X5; \ + VPUNPCKLQDQ_X3_X3_X15; \ + VMOVDQA X6, X14; \ + VPUNPCKHQDQ_X15_X13_X3; \ + VPUNPCKLQDQ_X7_X7_X15; \ + VPUNPCKHQDQ_X15_X6_X6; \ + VPUNPCKLQDQ_X14_X14_X15; \ + VPUNPCKHQDQ_X15_X7_X7; \ + +#define HALF_ROUND_AVX(v0, v1, v2, v3, v4, v5, v6, v7, m0, m1, m2, m3, t0, c40, c48) \ + VPADDQ m0, v0, v0; \ + VPADDQ v2, v0, v0; \ + VPADDQ m1, v1, v1; \ + VPADDQ v3, v1, v1; \ + VPXOR v0, v6, v6; \ + VPXOR v1, v7, v7; \ + VPSHUFD $-79, v6, v6; \ + VPSHUFD $-79, v7, v7; \ + VPADDQ v6, v4, v4; \ + VPADDQ v7, v5, v5; \ + VPXOR v4, v2, v2; \ + VPXOR v5, v3, v3; \ + VPSHUFB c40, v2, v2; \ + VPSHUFB c40, v3, v3; \ + VPADDQ m2, v0, v0; \ + VPADDQ v2, v0, v0; \ + VPADDQ m3, v1, v1; \ + VPADDQ v3, v1, v1; \ + VPXOR v0, v6, v6; \ + VPXOR v1, v7, v7; \ + VPSHUFB c48, v6, v6; \ + VPSHUFB c48, v7, v7; \ + VPADDQ v6, v4, v4; \ + VPADDQ v7, v5, v5; \ + VPXOR v4, v2, v2; \ + VPXOR v5, v3, v3; \ + VPADDQ v2, v2, t0; \ + VPSRLQ $63, v2, v2; \ + VPXOR t0, v2, v2; \ + VPADDQ v3, v3, t0; \ + VPSRLQ $63, v3, v3; \ + VPXOR t0, v3, v3 + +// load msg: X12 = (i0, i1), X13 = (i2, i3), X14 = (i4, i5), X15 = (i6, i7) +// i0, i1, i2, i3, i4, i5, i6, i7 must not be 0 +#define LOAD_MSG_AVX(i0, i1, i2, i3, i4, i5, i6, i7) \ + VMOVQ_SI_X12(i0*8); \ + VMOVQ_SI_X13(i2*8); \ + VMOVQ_SI_X14(i4*8); \ + VMOVQ_SI_X15(i6*8); \ + VPINSRQ_1_SI_X12(i1*8); \ + VPINSRQ_1_SI_X13(i3*8); \ + VPINSRQ_1_SI_X14(i5*8); \ + VPINSRQ_1_SI_X15(i7*8) + +// load msg: X12 = (0, 2), X13 = (4, 6), X14 = (1, 3), X15 = (5, 7) +#define LOAD_MSG_AVX_0_2_4_6_1_3_5_7() \ + VMOVQ_SI_X12_0; \ + VMOVQ_SI_X13(4*8); \ + VMOVQ_SI_X14(1*8); \ + VMOVQ_SI_X15(5*8); \ + VPINSRQ_1_SI_X12(2*8); \ + VPINSRQ_1_SI_X13(6*8); \ + VPINSRQ_1_SI_X14(3*8); \ + VPINSRQ_1_SI_X15(7*8) + +// load msg: X12 = (1, 0), X13 = (11, 5), X14 = (12, 2), X15 = (7, 3) +#define LOAD_MSG_AVX_1_0_11_5_12_2_7_3() \ + VPSHUFD $0x4E, 0*8(SI), X12; \ + VMOVQ_SI_X13(11*8); \ + VMOVQ_SI_X14(12*8); \ + VMOVQ_SI_X15(7*8); \ + VPINSRQ_1_SI_X13(5*8); \ + VPINSRQ_1_SI_X14(2*8); \ + VPINSRQ_1_SI_X15(3*8) + +// load msg: X12 = (11, 12), X13 = (5, 15), X14 = (8, 0), X15 = (2, 13) +#define LOAD_MSG_AVX_11_12_5_15_8_0_2_13() \ + VMOVDQU 11*8(SI), X12; \ + VMOVQ_SI_X13(5*8); \ + VMOVQ_SI_X14(8*8); \ + VMOVQ_SI_X15(2*8); \ + VPINSRQ_1_SI_X13(15*8); \ + VPINSRQ_1_SI_X14_0; \ + VPINSRQ_1_SI_X15(13*8) + +// load msg: X12 = (2, 5), X13 = (4, 15), X14 = (6, 10), X15 = (0, 8) +#define LOAD_MSG_AVX_2_5_4_15_6_10_0_8() \ + VMOVQ_SI_X12(2*8); \ + VMOVQ_SI_X13(4*8); \ + VMOVQ_SI_X14(6*8); \ + VMOVQ_SI_X15_0; \ + VPINSRQ_1_SI_X12(5*8); \ + VPINSRQ_1_SI_X13(15*8); \ + VPINSRQ_1_SI_X14(10*8); \ + VPINSRQ_1_SI_X15(8*8) + +// load msg: X12 = (9, 5), X13 = (2, 10), X14 = (0, 7), X15 = (4, 15) +#define LOAD_MSG_AVX_9_5_2_10_0_7_4_15() \ + VMOVQ_SI_X12(9*8); \ + VMOVQ_SI_X13(2*8); \ + VMOVQ_SI_X14_0; \ + VMOVQ_SI_X15(4*8); \ + VPINSRQ_1_SI_X12(5*8); \ + VPINSRQ_1_SI_X13(10*8); \ + VPINSRQ_1_SI_X14(7*8); \ + VPINSRQ_1_SI_X15(15*8) + +// load msg: X12 = (2, 6), X13 = (0, 8), X14 = (12, 10), X15 = (11, 3) +#define LOAD_MSG_AVX_2_6_0_8_12_10_11_3() \ + VMOVQ_SI_X12(2*8); \ + VMOVQ_SI_X13_0; \ + VMOVQ_SI_X14(12*8); \ + VMOVQ_SI_X15(11*8); \ + VPINSRQ_1_SI_X12(6*8); \ + VPINSRQ_1_SI_X13(8*8); \ + VPINSRQ_1_SI_X14(10*8); \ + VPINSRQ_1_SI_X15(3*8) + +// load msg: X12 = (0, 6), X13 = (9, 8), X14 = (7, 3), X15 = (2, 11) +#define LOAD_MSG_AVX_0_6_9_8_7_3_2_11() \ + MOVQ 0*8(SI), X12; \ + VPSHUFD $0x4E, 8*8(SI), X13; \ + MOVQ 7*8(SI), X14; \ + MOVQ 2*8(SI), X15; \ + VPINSRQ_1_SI_X12(6*8); \ + VPINSRQ_1_SI_X14(3*8); \ + VPINSRQ_1_SI_X15(11*8) + +// load msg: X12 = (6, 14), X13 = (11, 0), X14 = (15, 9), X15 = (3, 8) +#define LOAD_MSG_AVX_6_14_11_0_15_9_3_8() \ + MOVQ 6*8(SI), X12; \ + MOVQ 11*8(SI), X13; \ + MOVQ 15*8(SI), X14; \ + MOVQ 3*8(SI), X15; \ + VPINSRQ_1_SI_X12(14*8); \ + VPINSRQ_1_SI_X13_0; \ + VPINSRQ_1_SI_X14(9*8); \ + VPINSRQ_1_SI_X15(8*8) + +// load msg: X12 = (5, 15), X13 = (8, 2), X14 = (0, 4), X15 = (6, 10) +#define LOAD_MSG_AVX_5_15_8_2_0_4_6_10() \ + MOVQ 5*8(SI), X12; \ + MOVQ 8*8(SI), X13; \ + MOVQ 0*8(SI), X14; \ + MOVQ 6*8(SI), X15; \ + VPINSRQ_1_SI_X12(15*8); \ + VPINSRQ_1_SI_X13(2*8); \ + VPINSRQ_1_SI_X14(4*8); \ + VPINSRQ_1_SI_X15(10*8) + +// load msg: X12 = (12, 13), X13 = (1, 10), X14 = (2, 7), X15 = (4, 5) +#define LOAD_MSG_AVX_12_13_1_10_2_7_4_5() \ + VMOVDQU 12*8(SI), X12; \ + MOVQ 1*8(SI), X13; \ + MOVQ 2*8(SI), X14; \ + VPINSRQ_1_SI_X13(10*8); \ + VPINSRQ_1_SI_X14(7*8); \ + VMOVDQU 4*8(SI), X15 + +// load msg: X12 = (15, 9), X13 = (3, 13), X14 = (11, 14), X15 = (12, 0) +#define LOAD_MSG_AVX_15_9_3_13_11_14_12_0() \ + MOVQ 15*8(SI), X12; \ + MOVQ 3*8(SI), X13; \ + MOVQ 11*8(SI), X14; \ + MOVQ 12*8(SI), X15; \ + VPINSRQ_1_SI_X12(9*8); \ + VPINSRQ_1_SI_X13(13*8); \ + VPINSRQ_1_SI_X14(14*8); \ + VPINSRQ_1_SI_X15_0 + +// func fAVX(h *[8]uint64, m *[16]uint64, c0, c1 uint64, flag uint64, rounds uint64) +TEXT ·fAVX(SB), 4, $24-48 // frame size = 8 + 16 byte alignment + MOVQ h+0(FP), AX + MOVQ m+8(FP), SI + MOVQ c0+16(FP), R8 + MOVQ c1+24(FP), R9 + MOVQ flag+32(FP), CX + MOVQ rounds+40(FP), BX + + MOVQ SP, BP + MOVQ SP, R10 + ADDQ $15, R10 + ANDQ $~15, R10 + MOVQ R10, SP + + VMOVDQU ·AVX_c40<>(SB), X0 + VMOVDQU ·AVX_c48<>(SB), X1 + VMOVDQA X0, X8 + VMOVDQA X1, X9 + + VMOVDQU ·AVX_iv3<>(SB), X0 + VMOVDQA X0, 0(SP) + XORQ CX, 0(SP) // 0(SP) = ·AVX_iv3 ^ (CX || 0) + + VMOVDQU 0(AX), X10 + VMOVDQU 16(AX), X11 + VMOVDQU 32(AX), X2 + VMOVDQU 48(AX), X3 + + VMOVQ_R8_X15 + VPINSRQ_1_R9_X15 + + VMOVDQA X10, X0 + VMOVDQA X11, X1 + VMOVDQU ·AVX_iv0<>(SB), X4 + VMOVDQU ·AVX_iv1<>(SB), X5 + VMOVDQU ·AVX_iv2<>(SB), X6 + + VPXOR X15, X6, X6 + VMOVDQA 0(SP), X7 + +loop: + SUBQ $1, BX; JCS done + LOAD_MSG_AVX_0_2_4_6_1_3_5_7() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX(8, 10, 12, 14, 9, 11, 13, 15) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX(14, 4, 9, 13, 10, 8, 15, 6) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX_1_0_11_5_12_2_7_3() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX_11_12_5_15_8_0_2_13() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX(10, 3, 7, 9, 14, 6, 1, 4) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX(7, 3, 13, 11, 9, 1, 12, 14) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX_2_5_4_15_6_10_0_8() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX_9_5_2_10_0_7_4_15() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX(14, 11, 6, 3, 1, 12, 8, 13) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX_2_6_0_8_12_10_11_3() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX(4, 7, 15, 1, 13, 5, 14, 9) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX(12, 1, 14, 4, 5, 15, 13, 10) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX_0_6_9_8_7_3_2_11() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX(13, 7, 12, 3, 11, 14, 1, 9) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX_5_15_8_2_0_4_6_10() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX_6_14_11_0_15_9_3_8() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX_12_13_1_10_2_7_4_5() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + SUBQ $1, BX; JCS done + LOAD_MSG_AVX(10, 8, 7, 1, 2, 4, 6, 5) + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX() + LOAD_MSG_AVX_15_9_3_13_11_14_12_0() + HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) + SHUFFLE_AVX_INV() + + JMP loop + +done: + VMOVDQU 32(AX), X14 + VMOVDQU 48(AX), X15 + VPXOR X0, X10, X10 + VPXOR X1, X11, X11 + VPXOR X2, X14, X14 + VPXOR X3, X15, X15 + VPXOR X4, X10, X10 + VPXOR X5, X11, X11 + VPXOR X6, X14, X2 + VPXOR X7, X15, X3 + VMOVDQU X2, 32(AX) + VMOVDQU X3, 48(AX) + + VMOVDQU X10, 0(AX) + VMOVDQU X11, 16(AX) + VZEROUPPER + + MOVQ BP, SP + RET diff --git a/crypto/blake2b/blake2b_amd64.go b/crypto/blake2b/blake2b_amd64.go new file mode 100644 index 000000000000..4dbe90da8f1a --- /dev/null +++ b/crypto/blake2b/blake2b_amd64.go @@ -0,0 +1,24 @@ +// 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 !go1.7,amd64,!gccgo,!appengine + +package blake2b + +import "golang.org/x/sys/cpu" + +func init() { + useSSE4 = cpu.X86.HasSSE41 +} + +//go:noescape +func fSSE4(h *[8]uint64, m *[16]uint64, c0, c1 uint64, flag uint64, rounds uint64) + +func f(h *[8]uint64, m *[16]uint64, c0, c1 uint64, flag uint64, rounds uint64) { + if useSSE4 { + fSSE4(h, m, c0, c1, flag, rounds) + } else { + fGeneric(h, m, c0, c1, flag, rounds) + } +} diff --git a/crypto/blake2b/blake2b_amd64.s b/crypto/blake2b/blake2b_amd64.s new file mode 100644 index 000000000000..ce4b56d1053c --- /dev/null +++ b/crypto/blake2b/blake2b_amd64.s @@ -0,0 +1,253 @@ +// 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 amd64,!gccgo,!appengine + +#include "textflag.h" + +DATA ·iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908 +DATA ·iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b +GLOBL ·iv0<>(SB), (NOPTR+RODATA), $16 + +DATA ·iv1<>+0x00(SB)/8, $0x3c6ef372fe94f82b +DATA ·iv1<>+0x08(SB)/8, $0xa54ff53a5f1d36f1 +GLOBL ·iv1<>(SB), (NOPTR+RODATA), $16 + +DATA ·iv2<>+0x00(SB)/8, $0x510e527fade682d1 +DATA ·iv2<>+0x08(SB)/8, $0x9b05688c2b3e6c1f +GLOBL ·iv2<>(SB), (NOPTR+RODATA), $16 + +DATA ·iv3<>+0x00(SB)/8, $0x1f83d9abfb41bd6b +DATA ·iv3<>+0x08(SB)/8, $0x5be0cd19137e2179 +GLOBL ·iv3<>(SB), (NOPTR+RODATA), $16 + +DATA ·c40<>+0x00(SB)/8, $0x0201000706050403 +DATA ·c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b +GLOBL ·c40<>(SB), (NOPTR+RODATA), $16 + +DATA ·c48<>+0x00(SB)/8, $0x0100070605040302 +DATA ·c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a +GLOBL ·c48<>(SB), (NOPTR+RODATA), $16 + +#define SHUFFLE(v2, v3, v4, v5, v6, v7, t1, t2) \ + MOVO v4, t1; \ + MOVO v5, v4; \ + MOVO t1, v5; \ + MOVO v6, t1; \ + PUNPCKLQDQ v6, t2; \ + PUNPCKHQDQ v7, v6; \ + PUNPCKHQDQ t2, v6; \ + PUNPCKLQDQ v7, t2; \ + MOVO t1, v7; \ + MOVO v2, t1; \ + PUNPCKHQDQ t2, v7; \ + PUNPCKLQDQ v3, t2; \ + PUNPCKHQDQ t2, v2; \ + PUNPCKLQDQ t1, t2; \ + PUNPCKHQDQ t2, v3 + +#define SHUFFLE_INV(v2, v3, v4, v5, v6, v7, t1, t2) \ + MOVO v4, t1; \ + MOVO v5, v4; \ + MOVO t1, v5; \ + MOVO v2, t1; \ + PUNPCKLQDQ v2, t2; \ + PUNPCKHQDQ v3, v2; \ + PUNPCKHQDQ t2, v2; \ + PUNPCKLQDQ v3, t2; \ + MOVO t1, v3; \ + MOVO v6, t1; \ + PUNPCKHQDQ t2, v3; \ + PUNPCKLQDQ v7, t2; \ + PUNPCKHQDQ t2, v6; \ + PUNPCKLQDQ t1, t2; \ + PUNPCKHQDQ t2, v7 + +#define HALF_ROUND(v0, v1, v2, v3, v4, v5, v6, v7, m0, m1, m2, m3, t0, c40, c48) \ + PADDQ m0, v0; \ + PADDQ m1, v1; \ + PADDQ v2, v0; \ + PADDQ v3, v1; \ + PXOR v0, v6; \ + PXOR v1, v7; \ + PSHUFD $0xB1, v6, v6; \ + PSHUFD $0xB1, v7, v7; \ + PADDQ v6, v4; \ + PADDQ v7, v5; \ + PXOR v4, v2; \ + PXOR v5, v3; \ + PSHUFB c40, v2; \ + PSHUFB c40, v3; \ + PADDQ m2, v0; \ + PADDQ m3, v1; \ + PADDQ v2, v0; \ + PADDQ v3, v1; \ + PXOR v0, v6; \ + PXOR v1, v7; \ + PSHUFB c48, v6; \ + PSHUFB c48, v7; \ + PADDQ v6, v4; \ + PADDQ v7, v5; \ + PXOR v4, v2; \ + PXOR v5, v3; \ + MOVOU v2, t0; \ + PADDQ v2, t0; \ + PSRLQ $63, v2; \ + PXOR t0, v2; \ + MOVOU v3, t0; \ + PADDQ v3, t0; \ + PSRLQ $63, v3; \ + PXOR t0, v3 + +#define LOAD_MSG(m0, m1, m2, m3, i0, i1, i2, i3, i4, i5, i6, i7) \ + MOVQ i0*8(SI), m0; \ + PINSRQ $1, i1*8(SI), m0; \ + MOVQ i2*8(SI), m1; \ + PINSRQ $1, i3*8(SI), m1; \ + MOVQ i4*8(SI), m2; \ + PINSRQ $1, i5*8(SI), m2; \ + MOVQ i6*8(SI), m3; \ + PINSRQ $1, i7*8(SI), m3 + +// func fSSE4(h *[8]uint64, m *[16]uint64, c0, c1 uint64, flag uint64, rounds uint64) +TEXT ·fSSE4(SB), 4, $24-48 // frame size = 8 + 16 byte alignment + MOVQ h+0(FP), AX + MOVQ m+8(FP), SI + MOVQ c0+16(FP), R8 + MOVQ c1+24(FP), R9 + MOVQ flag+32(FP), CX + MOVQ rounds+40(FP), BX + + MOVQ SP, BP + MOVQ SP, R10 + ADDQ $15, R10 + ANDQ $~15, R10 + MOVQ R10, SP + + MOVOU ·iv3<>(SB), X0 + MOVO X0, 0(SP) + XORQ CX, 0(SP) // 0(SP) = ·iv3 ^ (CX || 0) + + MOVOU ·c40<>(SB), X13 + MOVOU ·c48<>(SB), X14 + + MOVOU 0(AX), X12 + MOVOU 16(AX), X15 + + MOVQ R8, X8 + PINSRQ $1, R9, X8 + + MOVO X12, X0 + MOVO X15, X1 + MOVOU 32(AX), X2 + MOVOU 48(AX), X3 + MOVOU ·iv0<>(SB), X4 + MOVOU ·iv1<>(SB), X5 + MOVOU ·iv2<>(SB), X6 + + PXOR X8, X6 + MOVO 0(SP), X7 + +loop: + SUBQ $1, BX; JCS done + LOAD_MSG(X8, X9, X10, X11, 0, 2, 4, 6, 1, 3, 5, 7) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, 8, 10, 12, 14, 9, 11, 13, 15) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + SUBQ $1, BX; JCS done + LOAD_MSG(X8, X9, X10, X11, 14, 4, 9, 13, 10, 8, 15, 6) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, 1, 0, 11, 5, 12, 2, 7, 3) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + SUBQ $1, BX; JCS done + LOAD_MSG(X8, X9, X10, X11, 11, 12, 5, 15, 8, 0, 2, 13) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, 10, 3, 7, 9, 14, 6, 1, 4) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + SUBQ $1, BX; JCS done + LOAD_MSG(X8, X9, X10, X11, 7, 3, 13, 11, 9, 1, 12, 14) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, 2, 5, 4, 15, 6, 10, 0, 8) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + SUBQ $1, BX; JCS done + LOAD_MSG(X8, X9, X10, X11, 9, 5, 2, 10, 0, 7, 4, 15) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, 14, 11, 6, 3, 1, 12, 8, 13) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + SUBQ $1, BX; JCS done + LOAD_MSG(X8, X9, X10, X11, 2, 6, 0, 8, 12, 10, 11, 3) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, 4, 7, 15, 1, 13, 5, 14, 9) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + SUBQ $1, BX; JCS done + LOAD_MSG(X8, X9, X10, X11, 12, 1, 14, 4, 5, 15, 13, 10) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, 0, 6, 9, 8, 7, 3, 2, 11) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + SUBQ $1, BX; JCS done + LOAD_MSG(X8, X9, X10, X11, 13, 7, 12, 3, 11, 14, 1, 9) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, 5, 15, 8, 2, 0, 4, 6, 10) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + SUBQ $1, BX; JCS done + LOAD_MSG(X8, X9, X10, X11, 6, 14, 11, 0, 15, 9, 3, 8) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, 12, 13, 1, 10, 2, 7, 4, 5) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + SUBQ $1, BX; JCS done + LOAD_MSG(X8, X9, X10, X11, 10, 8, 7, 1, 2, 4, 6, 5) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) + LOAD_MSG(X8, X9, X10, X11, 15, 9, 3, 13, 11, 14, 12, 0) + HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) + SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + + JMP loop + +done: + MOVOU 32(AX), X10 + MOVOU 48(AX), X11 + PXOR X0, X12 + PXOR X1, X15 + PXOR X2, X10 + PXOR X3, X11 + PXOR X4, X12 + PXOR X5, X15 + PXOR X6, X10 + PXOR X7, X11 + MOVOU X10, 32(AX) + MOVOU X11, 48(AX) + + MOVOU X12, 0(AX) + MOVOU X15, 16(AX) + + MOVQ BP, SP + RET diff --git a/crypto/blake2b/blake2b_f_fuzz.go b/crypto/blake2b/blake2b_f_fuzz.go new file mode 100644 index 000000000000..ab73342803f8 --- /dev/null +++ b/crypto/blake2b/blake2b_f_fuzz.go @@ -0,0 +1,57 @@ +// +build gofuzz + +package blake2b + +import ( + "encoding/binary" +) + +func Fuzz(data []byte) int { + // Make sure the data confirms to the input model + if len(data) != 211 { + return 0 + } + // Parse everything and call all the implementations + var ( + rounds = binary.BigEndian.Uint16(data[0:2]) + + h [8]uint64 + m [16]uint64 + t [2]uint64 + f uint64 + ) + for i := 0; i < 8; i++ { + offset := 2 + i*8 + h[i] = binary.LittleEndian.Uint64(data[offset : offset+8]) + } + for i := 0; i < 16; i++ { + offset := 66 + i*8 + m[i] = binary.LittleEndian.Uint64(data[offset : offset+8]) + } + t[0] = binary.LittleEndian.Uint64(data[194:202]) + t[1] = binary.LittleEndian.Uint64(data[202:210]) + + if data[210]%2 == 1 { // Avoid spinning the fuzzer to hit 0/1 + f = 0xFFFFFFFFFFFFFFFF + } + // Run the blake2b compression on all instruction sets and cross reference + want := h + fGeneric(&want, &m, t[0], t[1], f, uint64(rounds)) + + have := h + fSSE4(&have, &m, t[0], t[1], f, uint64(rounds)) + if have != want { + panic("SSE4 mismatches generic algo") + } + have = h + fAVX(&have, &m, t[0], t[1], f, uint64(rounds)) + if have != want { + panic("AVX mismatches generic algo") + } + have = h + fAVX2(&have, &m, t[0], t[1], f, uint64(rounds)) + if have != want { + panic("AVX2 mismatches generic algo") + } + return 1 +} diff --git a/crypto/blake2b/blake2b_f_test.go b/crypto/blake2b/blake2b_f_test.go new file mode 100644 index 000000000000..4e07d131cda6 --- /dev/null +++ b/crypto/blake2b/blake2b_f_test.go @@ -0,0 +1,59 @@ +package blake2b + +import ( + "fmt" + "reflect" + "testing" +) + +func TestF(t *testing.T) { + for i, test := range testVectorsF { + t.Run(fmt.Sprintf("test vector %v", i), func(t *testing.T) { + //toEthereumTestCase(test) + + h := test.hIn + F(&h, test.m, test.c, test.f, test.rounds) + + if !reflect.DeepEqual(test.hOut, h) { + t.Errorf("Unexpected result\nExpected: [%#x]\nActual: [%#x]\n", test.hOut, h) + } + }) + } +} + +type testVector struct { + hIn [8]uint64 + m [16]uint64 + c [2]uint64 + f bool + rounds uint32 + hOut [8]uint64 +} + +// https://tools.ietf.org/html/rfc7693#appendix-A +var testVectorsF = []testVector{ + { + hIn: [8]uint64{ + 0x6a09e667f2bdc948, 0xbb67ae8584caa73b, + 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, + 0x510e527fade682d1, 0x9b05688c2b3e6c1f, + 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179, + }, + m: [16]uint64{ + 0x0000000000636261, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, 0x0000000000000000, 0x0000000000000000, + 0x0000000000000000, + }, + c: [2]uint64{3, 0}, + f: true, + rounds: 12, + hOut: [8]uint64{ + 0x0D4D1C983FA580BA, 0xE9F6129FB697276A, 0xB7C45A68142F214C, + 0xD1A2FFDB6FBB124B, 0x2D79AB2A39C5877D, 0x95CC3345DED552C2, + 0x5A92F1DBA88AD318, 0x239900D4ED8623B9, + }, + }, +} diff --git a/crypto/blake2b/blake2b_generic.go b/crypto/blake2b/blake2b_generic.go new file mode 100644 index 000000000000..35c40cc924f8 --- /dev/null +++ b/crypto/blake2b/blake2b_generic.go @@ -0,0 +1,180 @@ +// 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. + +package blake2b + +import ( + "encoding/binary" + "math/bits" +) + +// the precomputed values for BLAKE2b +// there are 10 16-byte arrays - one for each round +// the entries are calculated from the sigma constants. +var precomputed = [10][16]byte{ + {0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15}, + {14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3}, + {11, 12, 5, 15, 8, 0, 2, 13, 10, 3, 7, 9, 14, 6, 1, 4}, + {7, 3, 13, 11, 9, 1, 12, 14, 2, 5, 4, 15, 6, 10, 0, 8}, + {9, 5, 2, 10, 0, 7, 4, 15, 14, 11, 6, 3, 1, 12, 8, 13}, + {2, 6, 0, 8, 12, 10, 11, 3, 4, 7, 15, 1, 13, 5, 14, 9}, + {12, 1, 14, 4, 5, 15, 13, 10, 0, 6, 9, 8, 7, 3, 2, 11}, + {13, 7, 12, 3, 11, 14, 1, 9, 5, 15, 8, 2, 0, 4, 6, 10}, + {6, 14, 11, 0, 15, 9, 3, 8, 12, 13, 1, 10, 2, 7, 4, 5}, + {10, 8, 7, 1, 2, 4, 6, 5, 15, 9, 3, 13, 11, 14, 12, 0}, +} + +func hashBlocksGeneric(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) { + var m [16]uint64 + c0, c1 := c[0], c[1] + + for i := 0; i < len(blocks); { + c0 += BlockSize + if c0 < BlockSize { + c1++ + } + for j := range m { + m[j] = binary.LittleEndian.Uint64(blocks[i:]) + i += 8 + } + fGeneric(h, &m, c0, c1, flag, 12) + } + c[0], c[1] = c0, c1 +} + +func fGeneric(h *[8]uint64, m *[16]uint64, c0, c1 uint64, flag uint64, rounds uint64) { + v0, v1, v2, v3, v4, v5, v6, v7 := h[0], h[1], h[2], h[3], h[4], h[5], h[6], h[7] + v8, v9, v10, v11, v12, v13, v14, v15 := iv[0], iv[1], iv[2], iv[3], iv[4], iv[5], iv[6], iv[7] + v12 ^= c0 + v13 ^= c1 + v14 ^= flag + + for i := 0; i < int(rounds); i++ { + s := &(precomputed[i%10]) + + v0 += m[s[0]] + v0 += v4 + v12 ^= v0 + v12 = bits.RotateLeft64(v12, -32) + v8 += v12 + v4 ^= v8 + v4 = bits.RotateLeft64(v4, -24) + v1 += m[s[1]] + v1 += v5 + v13 ^= v1 + v13 = bits.RotateLeft64(v13, -32) + v9 += v13 + v5 ^= v9 + v5 = bits.RotateLeft64(v5, -24) + v2 += m[s[2]] + v2 += v6 + v14 ^= v2 + v14 = bits.RotateLeft64(v14, -32) + v10 += v14 + v6 ^= v10 + v6 = bits.RotateLeft64(v6, -24) + v3 += m[s[3]] + v3 += v7 + v15 ^= v3 + v15 = bits.RotateLeft64(v15, -32) + v11 += v15 + v7 ^= v11 + v7 = bits.RotateLeft64(v7, -24) + + v0 += m[s[4]] + v0 += v4 + v12 ^= v0 + v12 = bits.RotateLeft64(v12, -16) + v8 += v12 + v4 ^= v8 + v4 = bits.RotateLeft64(v4, -63) + v1 += m[s[5]] + v1 += v5 + v13 ^= v1 + v13 = bits.RotateLeft64(v13, -16) + v9 += v13 + v5 ^= v9 + v5 = bits.RotateLeft64(v5, -63) + v2 += m[s[6]] + v2 += v6 + v14 ^= v2 + v14 = bits.RotateLeft64(v14, -16) + v10 += v14 + v6 ^= v10 + v6 = bits.RotateLeft64(v6, -63) + v3 += m[s[7]] + v3 += v7 + v15 ^= v3 + v15 = bits.RotateLeft64(v15, -16) + v11 += v15 + v7 ^= v11 + v7 = bits.RotateLeft64(v7, -63) + + v0 += m[s[8]] + v0 += v5 + v15 ^= v0 + v15 = bits.RotateLeft64(v15, -32) + v10 += v15 + v5 ^= v10 + v5 = bits.RotateLeft64(v5, -24) + v1 += m[s[9]] + v1 += v6 + v12 ^= v1 + v12 = bits.RotateLeft64(v12, -32) + v11 += v12 + v6 ^= v11 + v6 = bits.RotateLeft64(v6, -24) + v2 += m[s[10]] + v2 += v7 + v13 ^= v2 + v13 = bits.RotateLeft64(v13, -32) + v8 += v13 + v7 ^= v8 + v7 = bits.RotateLeft64(v7, -24) + v3 += m[s[11]] + v3 += v4 + v14 ^= v3 + v14 = bits.RotateLeft64(v14, -32) + v9 += v14 + v4 ^= v9 + v4 = bits.RotateLeft64(v4, -24) + + v0 += m[s[12]] + v0 += v5 + v15 ^= v0 + v15 = bits.RotateLeft64(v15, -16) + v10 += v15 + v5 ^= v10 + v5 = bits.RotateLeft64(v5, -63) + v1 += m[s[13]] + v1 += v6 + v12 ^= v1 + v12 = bits.RotateLeft64(v12, -16) + v11 += v12 + v6 ^= v11 + v6 = bits.RotateLeft64(v6, -63) + v2 += m[s[14]] + v2 += v7 + v13 ^= v2 + v13 = bits.RotateLeft64(v13, -16) + v8 += v13 + v7 ^= v8 + v7 = bits.RotateLeft64(v7, -63) + v3 += m[s[15]] + v3 += v4 + v14 ^= v3 + v14 = bits.RotateLeft64(v14, -16) + v9 += v14 + v4 ^= v9 + v4 = bits.RotateLeft64(v4, -63) + } + h[0] ^= v0 ^ v8 + h[1] ^= v1 ^ v9 + h[2] ^= v2 ^ v10 + h[3] ^= v3 ^ v11 + h[4] ^= v4 ^ v12 + h[5] ^= v5 ^ v13 + h[6] ^= v6 ^ v14 + h[7] ^= v7 ^ v15 +} diff --git a/crypto/blake2b/blake2b_ref.go b/crypto/blake2b/blake2b_ref.go new file mode 100644 index 000000000000..9d0ade473a14 --- /dev/null +++ b/crypto/blake2b/blake2b_ref.go @@ -0,0 +1,11 @@ +// 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 !amd64 appengine gccgo + +package blake2b + +func f(h *[8]uint64, m *[16]uint64, c0, c1 uint64, flag uint64, rounds uint64) { + fGeneric(h, m, c0, c1, flag, rounds) +} diff --git a/crypto/blake2b/blake2b_test.go b/crypto/blake2b/blake2b_test.go new file mode 100644 index 000000000000..9e7297da160f --- /dev/null +++ b/crypto/blake2b/blake2b_test.go @@ -0,0 +1,871 @@ +// 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. + +package blake2b + +import ( + "bytes" + "encoding" + "encoding/hex" + "fmt" + "hash" + "io" + "testing" +) + +func fromHex(s string) []byte { + b, err := hex.DecodeString(s) + if err != nil { + panic(err) + } + return b +} + +func TestHashes(t *testing.T) { + defer func(sse4, avx, avx2 bool) { + useSSE4, useAVX, useAVX2 = sse4, avx, avx2 + }(useSSE4, useAVX, useAVX2) + + if useAVX2 { + t.Log("AVX2 version") + testHashes(t) + useAVX2 = false + } + if useAVX { + t.Log("AVX version") + testHashes(t) + useAVX = false + } + if useSSE4 { + t.Log("SSE4 version") + testHashes(t) + useSSE4 = false + } + t.Log("generic version") + testHashes(t) +} + +func TestHashes2X(t *testing.T) { + defer func(sse4, avx, avx2 bool) { + useSSE4, useAVX, useAVX2 = sse4, avx, avx2 + }(useSSE4, useAVX, useAVX2) + + if useAVX2 { + t.Log("AVX2 version") + testHashes2X(t) + useAVX2 = false + } + if useAVX { + t.Log("AVX version") + testHashes2X(t) + useAVX = false + } + if useSSE4 { + t.Log("SSE4 version") + testHashes2X(t) + useSSE4 = false + } + t.Log("generic version") + testHashes2X(t) +} + +func TestMarshal(t *testing.T) { + input := make([]byte, 255) + for i := range input { + input[i] = byte(i) + } + for _, size := range []int{Size, Size256, Size384, 12, 25, 63} { + for i := 0; i < 256; i++ { + h, err := New(size, nil) + if err != nil { + t.Fatalf("size=%d, len(input)=%d: error from New(%v, nil): %v", size, i, size, err) + } + h2, err := New(size, nil) + if err != nil { + t.Fatalf("size=%d, len(input)=%d: error from New(%v, nil): %v", size, i, size, err) + } + + h.Write(input[:i/2]) + halfstate, err := h.(encoding.BinaryMarshaler).MarshalBinary() + if err != nil { + t.Fatalf("size=%d, len(input)=%d: could not marshal: %v", size, i, err) + } + err = h2.(encoding.BinaryUnmarshaler).UnmarshalBinary(halfstate) + if err != nil { + t.Fatalf("size=%d, len(input)=%d: could not unmarshal: %v", size, i, err) + } + + h.Write(input[i/2 : i]) + sum := h.Sum(nil) + h2.Write(input[i/2 : i]) + sum2 := h2.Sum(nil) + + if !bytes.Equal(sum, sum2) { + t.Fatalf("size=%d, len(input)=%d: results do not match; sum = %v, sum2 = %v", size, i, sum, sum2) + } + + h3, err := New(size, nil) + if err != nil { + t.Fatalf("size=%d, len(input)=%d: error from New(%v, nil): %v", size, i, size, err) + } + h3.Write(input[:i]) + sum3 := h3.Sum(nil) + if !bytes.Equal(sum, sum3) { + t.Fatalf("size=%d, len(input)=%d: sum = %v, want %v", size, i, sum, sum3) + } + } + } +} + +func testHashes(t *testing.T) { + key, _ := hex.DecodeString("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f") + + input := make([]byte, 255) + for i := range input { + input[i] = byte(i) + } + + for i, expectedHex := range hashes { + h, err := New512(key) + if err != nil { + t.Fatalf("#%d: error from New512: %v", i, err) + } + + h.Write(input[:i]) + sum := h.Sum(nil) + + if gotHex := fmt.Sprintf("%x", sum); gotHex != expectedHex { + t.Fatalf("#%d (single write): got %s, wanted %s", i, gotHex, expectedHex) + } + + h.Reset() + for j := 0; j < i; j++ { + h.Write(input[j : j+1]) + } + + sum = h.Sum(sum[:0]) + if gotHex := fmt.Sprintf("%x", sum); gotHex != expectedHex { + t.Fatalf("#%d (byte-by-byte): got %s, wanted %s", i, gotHex, expectedHex) + } + } +} + +func testHashes2X(t *testing.T) { + key, _ := hex.DecodeString("000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f") + + input := make([]byte, 256) + for i := range input { + input[i] = byte(i) + } + + for i, expectedHex := range hashes2X { + length := uint32(len(expectedHex) / 2) + sum := make([]byte, int(length)) + + h, err := NewXOF(length, key) + if err != nil { + t.Fatalf("#%d: error from NewXOF: %v", i, err) + } + + if _, err := h.Write(input); err != nil { + t.Fatalf("#%d (single write): error from Write: %v", i, err) + } + if _, err := h.Read(sum); err != nil { + t.Fatalf("#%d (single write): error from Read: %v", i, err) + } + if n, err := h.Read(sum); n != 0 || err != io.EOF { + t.Fatalf("#%d (single write): Read did not return (0, io.EOF) after exhaustion, got (%v, %v)", i, n, err) + } + if gotHex := fmt.Sprintf("%x", sum); gotHex != expectedHex { + t.Fatalf("#%d (single write): got %s, wanted %s", i, gotHex, expectedHex) + } + + h.Reset() + for j := 0; j < len(input); j++ { + h.Write(input[j : j+1]) + } + for j := 0; j < len(sum); j++ { + h = h.Clone() + if _, err := h.Read(sum[j : j+1]); err != nil { + t.Fatalf("#%d (byte-by-byte) - Read %d: error from Read: %v", i, j, err) + } + } + if gotHex := fmt.Sprintf("%x", sum); gotHex != expectedHex { + t.Fatalf("#%d (byte-by-byte): got %s, wanted %s", i, gotHex, expectedHex) + } + } + + h, err := NewXOF(OutputLengthUnknown, key) + if err != nil { + t.Fatalf("#unknown length: error from NewXOF: %v", err) + } + if _, err := h.Write(input); err != nil { + t.Fatalf("#unknown length: error from Write: %v", err) + } + + var result [64]byte + if n, err := h.Read(result[:]); err != nil { + t.Fatalf("#unknown length: error from Read: %v", err) + } else if n != len(result) { + t.Fatalf("#unknown length: Read returned %d bytes, want %d", n, len(result)) + } + + const expected = "3dbba8516da76bf7330055c66ea36cf1005e92714262b24d9710f51d9e126406e1bcd6497059f9331f1091c3634b695428d475ed432f987040575520a1c29f5e" + if fmt.Sprintf("%x", result) != expected { + t.Fatalf("#unknown length: bad result %x, wanted %s", result, expected) + } +} + +func generateSequence(out []byte, seed uint32) { + a := 0xDEAD4BAD * seed // prime + b := uint32(1) + + for i := range out { // fill the buf + a, b = b, a+b + out[i] = byte(b >> 24) + } +} + +func computeMAC(msg []byte, hashSize int, key []byte) (sum []byte) { + var h hash.Hash + switch hashSize { + case Size: + h, _ = New512(key) + case Size384: + h, _ = New384(key) + case Size256: + h, _ = New256(key) + case 20: + h, _ = newDigest(20, key) + default: + panic("unexpected hashSize") + } + + h.Write(msg) + return h.Sum(sum) +} + +func computeHash(msg []byte, hashSize int) (sum []byte) { + switch hashSize { + case Size: + hash := Sum512(msg) + return hash[:] + case Size384: + hash := Sum384(msg) + return hash[:] + case Size256: + hash := Sum256(msg) + return hash[:] + case 20: + var hash [64]byte + checkSum(&hash, 20, msg) + return hash[:20] + default: + panic("unexpected hashSize") + } +} + +// Test function from RFC 7693. +func TestSelfTest(t *testing.T) { + hashLens := [4]int{20, 32, 48, 64} + msgLens := [6]int{0, 3, 128, 129, 255, 1024} + + msg := make([]byte, 1024) + key := make([]byte, 64) + + h, _ := New256(nil) + for _, hashSize := range hashLens { + for _, msgLength := range msgLens { + generateSequence(msg[:msgLength], uint32(msgLength)) // unkeyed hash + + md := computeHash(msg[:msgLength], hashSize) + h.Write(md) + + generateSequence(key[:], uint32(hashSize)) // keyed hash + md = computeMAC(msg[:msgLength], hashSize, key[:hashSize]) + h.Write(md) + } + } + + sum := h.Sum(nil) + expected := [32]byte{ + 0xc2, 0x3a, 0x78, 0x00, 0xd9, 0x81, 0x23, 0xbd, + 0x10, 0xf5, 0x06, 0xc6, 0x1e, 0x29, 0xda, 0x56, + 0x03, 0xd7, 0x63, 0xb8, 0xbb, 0xad, 0x2e, 0x73, + 0x7f, 0x5e, 0x76, 0x5a, 0x7b, 0xcc, 0xd4, 0x75, + } + if !bytes.Equal(sum, expected[:]) { + t.Fatalf("got %x, wanted %x", sum, expected) + } +} + +// Benchmarks + +func benchmarkSum(b *testing.B, size int, sse4, avx, avx2 bool) { + // Enable the correct set of instructions + defer func(sse4, avx, avx2 bool) { + useSSE4, useAVX, useAVX2 = sse4, avx, avx2 + }(useSSE4, useAVX, useAVX2) + useSSE4, useAVX, useAVX2 = sse4, avx, avx2 + + data := make([]byte, size) + b.SetBytes(int64(size)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + Sum512(data) + } +} + +func benchmarkWrite(b *testing.B, size int, sse4, avx, avx2 bool) { + // Enable the correct set of instructions + defer func(sse4, avx, avx2 bool) { + useSSE4, useAVX, useAVX2 = sse4, avx, avx2 + }(useSSE4, useAVX, useAVX2) + useSSE4, useAVX, useAVX2 = sse4, avx, avx2 + + data := make([]byte, size) + h, _ := New512(nil) + b.SetBytes(int64(size)) + b.ResetTimer() + for i := 0; i < b.N; i++ { + h.Write(data) + } +} + +func BenchmarkWrite128Generic(b *testing.B) { benchmarkWrite(b, 128, false, false, false) } +func BenchmarkWrite1KGeneric(b *testing.B) { benchmarkWrite(b, 1024, false, false, false) } +func BenchmarkWrite128SSE4(b *testing.B) { benchmarkWrite(b, 128, true, false, false) } +func BenchmarkWrite1KSSE4(b *testing.B) { benchmarkWrite(b, 1024, true, false, false) } +func BenchmarkWrite128AVX(b *testing.B) { benchmarkWrite(b, 128, false, true, false) } +func BenchmarkWrite1KAVX(b *testing.B) { benchmarkWrite(b, 1024, false, true, false) } +func BenchmarkWrite128AVX2(b *testing.B) { benchmarkWrite(b, 128, false, false, true) } +func BenchmarkWrite1KAVX2(b *testing.B) { benchmarkWrite(b, 1024, false, false, true) } + +func BenchmarkSum128Generic(b *testing.B) { benchmarkSum(b, 128, false, false, false) } +func BenchmarkSum1KGeneric(b *testing.B) { benchmarkSum(b, 1024, false, false, false) } +func BenchmarkSum128SSE4(b *testing.B) { benchmarkSum(b, 128, true, false, false) } +func BenchmarkSum1KSSE4(b *testing.B) { benchmarkSum(b, 1024, true, false, false) } +func BenchmarkSum128AVX(b *testing.B) { benchmarkSum(b, 128, false, true, false) } +func BenchmarkSum1KAVX(b *testing.B) { benchmarkSum(b, 1024, false, true, false) } +func BenchmarkSum128AVX2(b *testing.B) { benchmarkSum(b, 128, false, false, true) } +func BenchmarkSum1KAVX2(b *testing.B) { benchmarkSum(b, 1024, false, false, true) } + +// These values were taken from https://blake2.net/blake2b-test.txt. +var hashes = []string{ + "10ebb67700b1868efb4417987acf4690ae9d972fb7a590c2f02871799aaa4786b5e996e8f0f4eb981fc214b005f42d2ff4233499391653df7aefcbc13fc51568", + "961f6dd1e4dd30f63901690c512e78e4b45e4742ed197c3c5e45c549fd25f2e4187b0bc9fe30492b16b0d0bc4ef9b0f34c7003fac09a5ef1532e69430234cebd", + "da2cfbe2d8409a0f38026113884f84b50156371ae304c4430173d08a99d9fb1b983164a3770706d537f49e0c916d9f32b95cc37a95b99d857436f0232c88a965", + "33d0825dddf7ada99b0e7e307104ad07ca9cfd9692214f1561356315e784f3e5a17e364ae9dbb14cb2036df932b77f4b292761365fb328de7afdc6d8998f5fc1", + "beaa5a3d08f3807143cf621d95cd690514d0b49efff9c91d24b59241ec0eefa5f60196d407048bba8d2146828ebcb0488d8842fd56bb4f6df8e19c4b4daab8ac", + "098084b51fd13deae5f4320de94a688ee07baea2800486689a8636117b46c1f4c1f6af7f74ae7c857600456a58a3af251dc4723a64cc7c0a5ab6d9cac91c20bb", + "6044540d560853eb1c57df0077dd381094781cdb9073e5b1b3d3f6c7829e12066bbaca96d989a690de72ca3133a83652ba284a6d62942b271ffa2620c9e75b1f", + "7a8cfe9b90f75f7ecb3acc053aaed6193112b6f6a4aeeb3f65d3de541942deb9e2228152a3c4bbbe72fc3b12629528cfbb09fe630f0474339f54abf453e2ed52", + "380beaf6ea7cc9365e270ef0e6f3a64fb902acae51dd5512f84259ad2c91f4bc4108db73192a5bbfb0cbcf71e46c3e21aee1c5e860dc96e8eb0b7b8426e6abe9", + "60fe3c4535e1b59d9a61ea8500bfac41a69dffb1ceadd9aca323e9a625b64da5763bad7226da02b9c8c4f1a5de140ac5a6c1124e4f718ce0b28ea47393aa6637", + "4fe181f54ad63a2983feaaf77d1e7235c2beb17fa328b6d9505bda327df19fc37f02c4b6f0368ce23147313a8e5738b5fa2a95b29de1c7f8264eb77b69f585cd", + "f228773ce3f3a42b5f144d63237a72d99693adb8837d0e112a8a0f8ffff2c362857ac49c11ec740d1500749dac9b1f4548108bf3155794dcc9e4082849e2b85b", + "962452a8455cc56c8511317e3b1f3b2c37df75f588e94325fdd77070359cf63a9ae6e930936fdf8e1e08ffca440cfb72c28f06d89a2151d1c46cd5b268ef8563", + "43d44bfa18768c59896bf7ed1765cb2d14af8c260266039099b25a603e4ddc5039d6ef3a91847d1088d401c0c7e847781a8a590d33a3c6cb4df0fab1c2f22355", + "dcffa9d58c2a4ca2cdbb0c7aa4c4c1d45165190089f4e983bb1c2cab4aaeff1fa2b5ee516fecd780540240bf37e56c8bcca7fab980e1e61c9400d8a9a5b14ac6", + "6fbf31b45ab0c0b8dad1c0f5f4061379912dde5aa922099a030b725c73346c524291adef89d2f6fd8dfcda6d07dad811a9314536c2915ed45da34947e83de34e", + "a0c65bddde8adef57282b04b11e7bc8aab105b99231b750c021f4a735cb1bcfab87553bba3abb0c3e64a0b6955285185a0bd35fb8cfde557329bebb1f629ee93", + "f99d815550558e81eca2f96718aed10d86f3f1cfb675cce06b0eff02f617c5a42c5aa760270f2679da2677c5aeb94f1142277f21c7f79f3c4f0cce4ed8ee62b1", + "95391da8fc7b917a2044b3d6f5374e1ca072b41454d572c7356c05fd4bc1e0f40b8bb8b4a9f6bce9be2c4623c399b0dca0dab05cb7281b71a21b0ebcd9e55670", + "04b9cd3d20d221c09ac86913d3dc63041989a9a1e694f1e639a3ba7e451840f750c2fc191d56ad61f2e7936bc0ac8e094b60caeed878c18799045402d61ceaf9", + "ec0e0ef707e4ed6c0c66f9e089e4954b058030d2dd86398fe84059631f9ee591d9d77375355149178c0cf8f8e7c49ed2a5e4f95488a2247067c208510fadc44c", + "9a37cce273b79c09913677510eaf7688e89b3314d3532fd2764c39de022a2945b5710d13517af8ddc0316624e73bec1ce67df15228302036f330ab0cb4d218dd", + "4cf9bb8fb3d4de8b38b2f262d3c40f46dfe747e8fc0a414c193d9fcf753106ce47a18f172f12e8a2f1c26726545358e5ee28c9e2213a8787aafbc516d2343152", + "64e0c63af9c808fd893137129867fd91939d53f2af04be4fa268006100069b2d69daa5c5d8ed7fddcb2a70eeecdf2b105dd46a1e3b7311728f639ab489326bc9", + "5e9c93158d659b2def06b0c3c7565045542662d6eee8a96a89b78ade09fe8b3dcc096d4fe48815d88d8f82620156602af541955e1f6ca30dce14e254c326b88f", + "7775dff889458dd11aef417276853e21335eb88e4dec9cfb4e9edb49820088551a2ca60339f12066101169f0dfe84b098fddb148d9da6b3d613df263889ad64b", + "f0d2805afbb91f743951351a6d024f9353a23c7ce1fc2b051b3a8b968c233f46f50f806ecb1568ffaa0b60661e334b21dde04f8fa155ac740eeb42e20b60d764", + "86a2af316e7d7754201b942e275364ac12ea8962ab5bd8d7fb276dc5fbffc8f9a28cae4e4867df6780d9b72524160927c855da5b6078e0b554aa91e31cb9ca1d", + "10bdf0caa0802705e706369baf8a3f79d72c0a03a80675a7bbb00be3a45e516424d1ee88efb56f6d5777545ae6e27765c3a8f5e493fc308915638933a1dfee55", + "b01781092b1748459e2e4ec178696627bf4ebafebba774ecf018b79a68aeb84917bf0b84bb79d17b743151144cd66b7b33a4b9e52c76c4e112050ff5385b7f0b", + "c6dbc61dec6eaeac81e3d5f755203c8e220551534a0b2fd105a91889945a638550204f44093dd998c076205dffad703a0e5cd3c7f438a7e634cd59fededb539e", + "eba51acffb4cea31db4b8d87e9bf7dd48fe97b0253ae67aa580f9ac4a9d941f2bea518ee286818cc9f633f2a3b9fb68e594b48cdd6d515bf1d52ba6c85a203a7", + "86221f3ada52037b72224f105d7999231c5e5534d03da9d9c0a12acb68460cd375daf8e24386286f9668f72326dbf99ba094392437d398e95bb8161d717f8991", + "5595e05c13a7ec4dc8f41fb70cb50a71bce17c024ff6de7af618d0cc4e9c32d9570d6d3ea45b86525491030c0d8f2b1836d5778c1ce735c17707df364d054347", + "ce0f4f6aca89590a37fe034dd74dd5fa65eb1cbd0a41508aaddc09351a3cea6d18cb2189c54b700c009f4cbf0521c7ea01be61c5ae09cb54f27bc1b44d658c82", + "7ee80b06a215a3bca970c77cda8761822bc103d44fa4b33f4d07dcb997e36d55298bceae12241b3fa07fa63be5576068da387b8d5859aeab701369848b176d42", + "940a84b6a84d109aab208c024c6ce9647676ba0aaa11f86dbb7018f9fd2220a6d901a9027f9abcf935372727cbf09ebd61a2a2eeb87653e8ecad1bab85dc8327", + "2020b78264a82d9f4151141adba8d44bf20c5ec062eee9b595a11f9e84901bf148f298e0c9f8777dcdbc7cc4670aac356cc2ad8ccb1629f16f6a76bcefbee760", + "d1b897b0e075ba68ab572adf9d9c436663e43eb3d8e62d92fc49c9be214e6f27873fe215a65170e6bea902408a25b49506f47babd07cecf7113ec10c5dd31252", + "b14d0c62abfa469a357177e594c10c194243ed2025ab8aa5ad2fa41ad318e0ff48cd5e60bec07b13634a711d2326e488a985f31e31153399e73088efc86a5c55", + "4169c5cc808d2697dc2a82430dc23e3cd356dc70a94566810502b8d655b39abf9e7f902fe717e0389219859e1945df1af6ada42e4ccda55a197b7100a30c30a1", + "258a4edb113d66c839c8b1c91f15f35ade609f11cd7f8681a4045b9fef7b0b24c82cda06a5f2067b368825e3914e53d6948ede92efd6e8387fa2e537239b5bee", + "79d2d8696d30f30fb34657761171a11e6c3f1e64cbe7bebee159cb95bfaf812b4f411e2f26d9c421dc2c284a3342d823ec293849e42d1e46b0a4ac1e3c86abaa", + "8b9436010dc5dee992ae38aea97f2cd63b946d94fedd2ec9671dcde3bd4ce9564d555c66c15bb2b900df72edb6b891ebcadfeff63c9ea4036a998be7973981e7", + "c8f68e696ed28242bf997f5b3b34959508e42d613810f1e2a435c96ed2ff560c7022f361a9234b9837feee90bf47922ee0fd5f8ddf823718d86d1e16c6090071", + "b02d3eee4860d5868b2c39ce39bfe81011290564dd678c85e8783f29302dfc1399ba95b6b53cd9ebbf400cca1db0ab67e19a325f2d115812d25d00978ad1bca4", + "7693ea73af3ac4dad21ca0d8da85b3118a7d1c6024cfaf557699868217bc0c2f44a199bc6c0edd519798ba05bd5b1b4484346a47c2cadf6bf30b785cc88b2baf", + "a0e5c1c0031c02e48b7f09a5e896ee9aef2f17fc9e18e997d7f6cac7ae316422c2b1e77984e5f3a73cb45deed5d3f84600105e6ee38f2d090c7d0442ea34c46d", + "41daa6adcfdb69f1440c37b596440165c15ada596813e2e22f060fcd551f24dee8e04ba6890387886ceec4a7a0d7fc6b44506392ec3822c0d8c1acfc7d5aebe8", + "14d4d40d5984d84c5cf7523b7798b254e275a3a8cc0a1bd06ebc0bee726856acc3cbf516ff667cda2058ad5c3412254460a82c92187041363cc77a4dc215e487", + "d0e7a1e2b9a447fee83e2277e9ff8010c2f375ae12fa7aaa8ca5a6317868a26a367a0b69fbc1cf32a55d34eb370663016f3d2110230eba754028a56f54acf57c", + "e771aa8db5a3e043e8178f39a0857ba04a3f18e4aa05743cf8d222b0b095825350ba422f63382a23d92e4149074e816a36c1cd28284d146267940b31f8818ea2", + "feb4fd6f9e87a56bef398b3284d2bda5b5b0e166583a66b61e538457ff0584872c21a32962b9928ffab58de4af2edd4e15d8b35570523207ff4e2a5aa7754caa", + "462f17bf005fb1c1b9e671779f665209ec2873e3e411f98dabf240a1d5ec3f95ce6796b6fc23fe171903b502023467dec7273ff74879b92967a2a43a5a183d33", + "d3338193b64553dbd38d144bea71c5915bb110e2d88180dbc5db364fd6171df317fc7268831b5aef75e4342b2fad8797ba39eddcef80e6ec08159350b1ad696d", + "e1590d585a3d39f7cb599abd479070966409a6846d4377acf4471d065d5db94129cc9be92573b05ed226be1e9b7cb0cabe87918589f80dadd4ef5ef25a93d28e", + "f8f3726ac5a26cc80132493a6fedcb0e60760c09cfc84cad178175986819665e76842d7b9fedf76dddebf5d3f56faaad4477587af21606d396ae570d8e719af2", + "30186055c07949948183c850e9a756cc09937e247d9d928e869e20bafc3cd9721719d34e04a0899b92c736084550186886efba2e790d8be6ebf040b209c439a4", + "f3c4276cb863637712c241c444c5cc1e3554e0fddb174d035819dd83eb700b4ce88df3ab3841ba02085e1a99b4e17310c5341075c0458ba376c95a6818fbb3e2", + "0aa007c4dd9d5832393040a1583c930bca7dc5e77ea53add7e2b3f7c8e231368043520d4a3ef53c969b6bbfd025946f632bd7f765d53c21003b8f983f75e2a6a", + "08e9464720533b23a04ec24f7ae8c103145f765387d738777d3d343477fd1c58db052142cab754ea674378e18766c53542f71970171cc4f81694246b717d7564", + "d37ff7ad297993e7ec21e0f1b4b5ae719cdc83c5db687527f27516cbffa822888a6810ee5c1ca7bfe3321119be1ab7bfa0a502671c8329494df7ad6f522d440f", + "dd9042f6e464dcf86b1262f6accfafbd8cfd902ed3ed89abf78ffa482dbdeeb6969842394c9a1168ae3d481a017842f660002d42447c6b22f7b72f21aae021c9", + "bd965bf31e87d70327536f2a341cebc4768eca275fa05ef98f7f1b71a0351298de006fba73fe6733ed01d75801b4a928e54231b38e38c562b2e33ea1284992fa", + "65676d800617972fbd87e4b9514e1c67402b7a331096d3bfac22f1abb95374abc942f16e9ab0ead33b87c91968a6e509e119ff07787b3ef483e1dcdccf6e3022", + "939fa189699c5d2c81ddd1ffc1fa207c970b6a3685bb29ce1d3e99d42f2f7442da53e95a72907314f4588399a3ff5b0a92beb3f6be2694f9f86ecf2952d5b41c", + "c516541701863f91005f314108ceece3c643e04fc8c42fd2ff556220e616aaa6a48aeb97a84bad74782e8dff96a1a2fa949339d722edcaa32b57067041df88cc", + "987fd6e0d6857c553eaebb3d34970a2c2f6e89a3548f492521722b80a1c21a153892346d2cba6444212d56da9a26e324dccbc0dcde85d4d2ee4399eec5a64e8f", + "ae56deb1c2328d9c4017706bce6e99d41349053ba9d336d677c4c27d9fd50ae6aee17e853154e1f4fe7672346da2eaa31eea53fcf24a22804f11d03da6abfc2b", + "49d6a608c9bde4491870498572ac31aac3fa40938b38a7818f72383eb040ad39532bc06571e13d767e6945ab77c0bdc3b0284253343f9f6c1244ebf2ff0df866", + "da582ad8c5370b4469af862aa6467a2293b2b28bd80ae0e91f425ad3d47249fdf98825cc86f14028c3308c9804c78bfeeeee461444ce243687e1a50522456a1d", + "d5266aa3331194aef852eed86d7b5b2633a0af1c735906f2e13279f14931a9fc3b0eac5ce9245273bd1aa92905abe16278ef7efd47694789a7283b77da3c70f8", + "2962734c28252186a9a1111c732ad4de4506d4b4480916303eb7991d659ccda07a9911914bc75c418ab7a4541757ad054796e26797feaf36e9f6ad43f14b35a4", + "e8b79ec5d06e111bdfafd71e9f5760f00ac8ac5d8bf768f9ff6f08b8f026096b1cc3a4c973333019f1e3553e77da3f98cb9f542e0a90e5f8a940cc58e59844b3", + "dfb320c44f9d41d1efdcc015f08dd5539e526e39c87d509ae6812a969e5431bf4fa7d91ffd03b981e0d544cf72d7b1c0374f8801482e6dea2ef903877eba675e", + "d88675118fdb55a5fb365ac2af1d217bf526ce1ee9c94b2f0090b2c58a06ca58187d7fe57c7bed9d26fca067b4110eefcd9a0a345de872abe20de368001b0745", + "b893f2fc41f7b0dd6e2f6aa2e0370c0cff7df09e3acfcc0e920b6e6fad0ef747c40668417d342b80d2351e8c175f20897a062e9765e6c67b539b6ba8b9170545", + "6c67ec5697accd235c59b486d7b70baeedcbd4aa64ebd4eef3c7eac189561a726250aec4d48cadcafbbe2ce3c16ce2d691a8cce06e8879556d4483ed7165c063", + "f1aa2b044f8f0c638a3f362e677b5d891d6fd2ab0765f6ee1e4987de057ead357883d9b405b9d609eea1b869d97fb16d9b51017c553f3b93c0a1e0f1296fedcd", + "cbaa259572d4aebfc1917acddc582b9f8dfaa928a198ca7acd0f2aa76a134a90252e6298a65b08186a350d5b7626699f8cb721a3ea5921b753ae3a2dce24ba3a", + "fa1549c9796cd4d303dcf452c1fbd5744fd9b9b47003d920b92de34839d07ef2a29ded68f6fc9e6c45e071a2e48bd50c5084e96b657dd0404045a1ddefe282ed", + "5cf2ac897ab444dcb5c8d87c495dbdb34e1838b6b629427caa51702ad0f9688525f13bec503a3c3a2c80a65e0b5715e8afab00ffa56ec455a49a1ad30aa24fcd", + "9aaf80207bace17bb7ab145757d5696bde32406ef22b44292ef65d4519c3bb2ad41a59b62cc3e94b6fa96d32a7faadae28af7d35097219aa3fd8cda31e40c275", + "af88b163402c86745cb650c2988fb95211b94b03ef290eed9662034241fd51cf398f8073e369354c43eae1052f9b63b08191caa138aa54fea889cc7024236897", + "48fa7d64e1ceee27b9864db5ada4b53d00c9bc7626555813d3cd6730ab3cc06ff342d727905e33171bde6e8476e77fb1720861e94b73a2c538d254746285f430", + "0e6fd97a85e904f87bfe85bbeb34f69e1f18105cf4ed4f87aec36c6e8b5f68bd2a6f3dc8a9ecb2b61db4eedb6b2ea10bf9cb0251fb0f8b344abf7f366b6de5ab", + "06622da5787176287fdc8fed440bad187d830099c94e6d04c8e9c954cda70c8bb9e1fc4a6d0baa831b9b78ef6648681a4867a11da93ee36e5e6a37d87fc63f6f", + "1da6772b58fabf9c61f68d412c82f182c0236d7d575ef0b58dd22458d643cd1dfc93b03871c316d8430d312995d4197f0874c99172ba004a01ee295abac24e46", + "3cd2d9320b7b1d5fb9aab951a76023fa667be14a9124e394513918a3f44096ae4904ba0ffc150b63bc7ab1eeb9a6e257e5c8f000a70394a5afd842715de15f29", + "04cdc14f7434e0b4be70cb41db4c779a88eaef6accebcb41f2d42fffe7f32a8e281b5c103a27021d0d08362250753cdf70292195a53a48728ceb5844c2d98bab", + "9071b7a8a075d0095b8fb3ae5113785735ab98e2b52faf91d5b89e44aac5b5d4ebbf91223b0ff4c71905da55342e64655d6ef8c89a4768c3f93a6dc0366b5bc8", + "ebb30240dd96c7bc8d0abe49aa4edcbb4afdc51ff9aaf720d3f9e7fbb0f9c6d6571350501769fc4ebd0b2141247ff400d4fd4be414edf37757bb90a32ac5c65a", + "8532c58bf3c8015d9d1cbe00eef1f5082f8f3632fbe9f1ed4f9dfb1fa79e8283066d77c44c4af943d76b300364aecbd0648c8a8939bd204123f4b56260422dec", + "fe9846d64f7c7708696f840e2d76cb4408b6595c2f81ec6a28a7f2f20cb88cfe6ac0b9e9b8244f08bd7095c350c1d0842f64fb01bb7f532dfcd47371b0aeeb79", + "28f17ea6fb6c42092dc264257e29746321fb5bdaea9873c2a7fa9d8f53818e899e161bc77dfe8090afd82bf2266c5c1bc930a8d1547624439e662ef695f26f24", + "ec6b7d7f030d4850acae3cb615c21dd25206d63e84d1db8d957370737ba0e98467ea0ce274c66199901eaec18a08525715f53bfdb0aacb613d342ebdceeddc3b", + "b403d3691c03b0d3418df327d5860d34bbfcc4519bfbce36bf33b208385fadb9186bc78a76c489d89fd57e7dc75412d23bcd1dae8470ce9274754bb8585b13c5", + "31fc79738b8772b3f55cd8178813b3b52d0db5a419d30ba9495c4b9da0219fac6df8e7c23a811551a62b827f256ecdb8124ac8a6792ccfecc3b3012722e94463", + "bb2039ec287091bcc9642fc90049e73732e02e577e2862b32216ae9bedcd730c4c284ef3968c368b7d37584f97bd4b4dc6ef6127acfe2e6ae2509124e66c8af4", + "f53d68d13f45edfcb9bd415e2831e938350d5380d3432278fc1c0c381fcb7c65c82dafe051d8c8b0d44e0974a0e59ec7bf7ed0459f86e96f329fc79752510fd3", + "8d568c7984f0ecdf7640fbc483b5d8c9f86634f6f43291841b309a350ab9c1137d24066b09da9944bac54d5bb6580d836047aac74ab724b887ebf93d4b32eca9", + "c0b65ce5a96ff774c456cac3b5f2c4cd359b4ff53ef93a3da0778be4900d1e8da1601e769e8f1b02d2a2f8c5b9fa10b44f1c186985468feeb008730283a6657d", + "4900bba6f5fb103ece8ec96ada13a5c3c85488e05551da6b6b33d988e611ec0fe2e3c2aa48ea6ae8986a3a231b223c5d27cec2eadde91ce07981ee652862d1e4", + "c7f5c37c7285f927f76443414d4357ff789647d7a005a5a787e03c346b57f49f21b64fa9cf4b7e45573e23049017567121a9c3d4b2b73ec5e9413577525db45a", + "ec7096330736fdb2d64b5653e7475da746c23a4613a82687a28062d3236364284ac01720ffb406cfe265c0df626a188c9e5963ace5d3d5bb363e32c38c2190a6", + "82e744c75f4649ec52b80771a77d475a3bc091989556960e276a5f9ead92a03f718742cdcfeaee5cb85c44af198adc43a4a428f5f0c2ddb0be36059f06d7df73", + "2834b7a7170f1f5b68559ab78c1050ec21c919740b784a9072f6e5d69f828d70c919c5039fb148e39e2c8a52118378b064ca8d5001cd10a5478387b966715ed6", + "16b4ada883f72f853bb7ef253efcab0c3e2161687ad61543a0d2824f91c1f81347d86be709b16996e17f2dd486927b0288ad38d13063c4a9672c39397d3789b6", + "78d048f3a69d8b54ae0ed63a573ae350d89f7c6cf1f3688930de899afa037697629b314e5cd303aa62feea72a25bf42b304b6c6bcb27fae21c16d925e1fbdac3", + "0f746a48749287ada77a82961f05a4da4abdb7d77b1220f836d09ec814359c0ec0239b8c7b9ff9e02f569d1b301ef67c4612d1de4f730f81c12c40cc063c5caa", + "f0fc859d3bd195fbdc2d591e4cdac15179ec0f1dc821c11df1f0c1d26e6260aaa65b79fafacafd7d3ad61e600f250905f5878c87452897647a35b995bcadc3a3", + "2620f687e8625f6a412460b42e2cef67634208ce10a0cbd4dff7044a41b7880077e9f8dc3b8d1216d3376a21e015b58fb279b521d83f9388c7382c8505590b9b", + "227e3aed8d2cb10b918fcb04f9de3e6d0a57e08476d93759cd7b2ed54a1cbf0239c528fb04bbf288253e601d3bc38b21794afef90b17094a182cac557745e75f", + "1a929901b09c25f27d6b35be7b2f1c4745131fdebca7f3e2451926720434e0db6e74fd693ad29b777dc3355c592a361c4873b01133a57c2e3b7075cbdb86f4fc", + "5fd7968bc2fe34f220b5e3dc5af9571742d73b7d60819f2888b629072b96a9d8ab2d91b82d0a9aaba61bbd39958132fcc4257023d1eca591b3054e2dc81c8200", + "dfcce8cf32870cc6a503eadafc87fd6f78918b9b4d0737db6810be996b5497e7e5cc80e312f61e71ff3e9624436073156403f735f56b0b01845c18f6caf772e6", + "02f7ef3a9ce0fff960f67032b296efca3061f4934d690749f2d01c35c81c14f39a67fa350bc8a0359bf1724bffc3bca6d7c7bba4791fd522a3ad353c02ec5aa8", + "64be5c6aba65d594844ae78bb022e5bebe127fd6b6ffa5a13703855ab63b624dcd1a363f99203f632ec386f3ea767fc992e8ed9686586aa27555a8599d5b808f", + "f78585505c4eaa54a8b5be70a61e735e0ff97af944ddb3001e35d86c4e2199d976104b6ae31750a36a726ed285064f5981b503889fef822fcdc2898dddb7889a", + "e4b5566033869572edfd87479a5bb73c80e8759b91232879d96b1dda36c012076ee5a2ed7ae2de63ef8406a06aea82c188031b560beafb583fb3de9e57952a7e", + "e1b3e7ed867f6c9484a2a97f7715f25e25294e992e41f6a7c161ffc2adc6daaeb7113102d5e6090287fe6ad94ce5d6b739c6ca240b05c76fb73f25dd024bf935", + "85fd085fdc12a080983df07bd7012b0d402a0f4043fcb2775adf0bad174f9b08d1676e476985785c0a5dcc41dbff6d95ef4d66a3fbdc4a74b82ba52da0512b74", + "aed8fa764b0fbff821e05233d2f7b0900ec44d826f95e93c343c1bc3ba5a24374b1d616e7e7aba453a0ada5e4fab5382409e0d42ce9c2bc7fb39a99c340c20f0", + "7ba3b2e297233522eeb343bd3ebcfd835a04007735e87f0ca300cbee6d416565162171581e4020ff4cf176450f1291ea2285cb9ebffe4c56660627685145051c", + "de748bcf89ec88084721e16b85f30adb1a6134d664b5843569babc5bbd1a15ca9b61803c901a4fef32965a1749c9f3a4e243e173939dc5a8dc495c671ab52145", + "aaf4d2bdf200a919706d9842dce16c98140d34bc433df320aba9bd429e549aa7a3397652a4d768277786cf993cde2338673ed2e6b66c961fefb82cd20c93338f", + "c408218968b788bf864f0997e6bc4c3dba68b276e2125a4843296052ff93bf5767b8cdce7131f0876430c1165fec6c4f47adaa4fd8bcfacef463b5d3d0fa61a0", + "76d2d819c92bce55fa8e092ab1bf9b9eab237a25267986cacf2b8ee14d214d730dc9a5aa2d7b596e86a1fd8fa0804c77402d2fcd45083688b218b1cdfa0dcbcb", + "72065ee4dd91c2d8509fa1fc28a37c7fc9fa7d5b3f8ad3d0d7a25626b57b1b44788d4caf806290425f9890a3a2a35a905ab4b37acfd0da6e4517b2525c9651e4", + "64475dfe7600d7171bea0b394e27c9b00d8e74dd1e416a79473682ad3dfdbb706631558055cfc8a40e07bd015a4540dcdea15883cbbf31412df1de1cd4152b91", + "12cd1674a4488a5d7c2b3160d2e2c4b58371bedad793418d6f19c6ee385d70b3e06739369d4df910edb0b0a54cbff43d54544cd37ab3a06cfa0a3ddac8b66c89", + "60756966479dedc6dd4bcff8ea7d1d4ce4d4af2e7b097e32e3763518441147cc12b3c0ee6d2ecabf1198cec92e86a3616fba4f4e872f5825330adbb4c1dee444", + "a7803bcb71bc1d0f4383dde1e0612e04f872b715ad30815c2249cf34abb8b024915cb2fc9f4e7cc4c8cfd45be2d5a91eab0941c7d270e2da4ca4a9f7ac68663a", + "b84ef6a7229a34a750d9a98ee2529871816b87fbe3bc45b45fa5ae82d5141540211165c3c5d7a7476ba5a4aa06d66476f0d9dc49a3f1ee72c3acabd498967414", + "fae4b6d8efc3f8c8e64d001dabec3a21f544e82714745251b2b4b393f2f43e0da3d403c64db95a2cb6e23ebb7b9e94cdd5ddac54f07c4a61bd3cb10aa6f93b49", + "34f7286605a122369540141ded79b8957255da2d4155abbf5a8dbb89c8eb7ede8eeef1daa46dc29d751d045dc3b1d658bb64b80ff8589eddb3824b13da235a6b", + "3b3b48434be27b9eababba43bf6b35f14b30f6a88dc2e750c358470d6b3aa3c18e47db4017fa55106d8252f016371a00f5f8b070b74ba5f23cffc5511c9f09f0", + "ba289ebd6562c48c3e10a8ad6ce02e73433d1e93d7c9279d4d60a7e879ee11f441a000f48ed9f7c4ed87a45136d7dccdca482109c78a51062b3ba4044ada2469", + "022939e2386c5a37049856c850a2bb10a13dfea4212b4c732a8840a9ffa5faf54875c5448816b2785a007da8a8d2bc7d71a54e4e6571f10b600cbdb25d13ede3", + "e6fec19d89ce8717b1a087024670fe026f6c7cbda11caef959bb2d351bf856f8055d1c0ebdaaa9d1b17886fc2c562b5e99642fc064710c0d3488a02b5ed7f6fd", + "94c96f02a8f576aca32ba61c2b206f907285d9299b83ac175c209a8d43d53bfe683dd1d83e7549cb906c28f59ab7c46f8751366a28c39dd5fe2693c9019666c8", + "31a0cd215ebd2cb61de5b9edc91e6195e31c59a5648d5c9f737e125b2605708f2e325ab3381c8dce1a3e958886f1ecdc60318f882cfe20a24191352e617b0f21", + "91ab504a522dce78779f4c6c6ba2e6b6db5565c76d3e7e7c920caf7f757ef9db7c8fcf10e57f03379ea9bf75eb59895d96e149800b6aae01db778bb90afbc989", + "d85cabc6bd5b1a01a5afd8c6734740da9fd1c1acc6db29bfc8a2e5b668b028b6b3154bfb8703fa3180251d589ad38040ceb707c4bad1b5343cb426b61eaa49c1", + "d62efbec2ca9c1f8bd66ce8b3f6a898cb3f7566ba6568c618ad1feb2b65b76c3ce1dd20f7395372faf28427f61c9278049cf0140df434f5633048c86b81e0399", + "7c8fdc6175439e2c3db15bafa7fb06143a6a23bc90f449e79deef73c3d492a671715c193b6fea9f036050b946069856b897e08c00768f5ee5ddcf70b7cd6d0e0", + "58602ee7468e6bc9df21bd51b23c005f72d6cb013f0a1b48cbec5eca299299f97f09f54a9a01483eaeb315a6478bad37ba47ca1347c7c8fc9e6695592c91d723", + "27f5b79ed256b050993d793496edf4807c1d85a7b0a67c9c4fa99860750b0ae66989670a8ffd7856d7ce411599e58c4d77b232a62bef64d15275be46a68235ff", + "3957a976b9f1887bf004a8dca942c92d2b37ea52600f25e0c9bc5707d0279c00c6e85a839b0d2d8eb59c51d94788ebe62474a791cadf52cccf20f5070b6573fc", + "eaa2376d55380bf772ecca9cb0aa4668c95c707162fa86d518c8ce0ca9bf7362b9f2a0adc3ff59922df921b94567e81e452f6c1a07fc817cebe99604b3505d38", + "c1e2c78b6b2734e2480ec550434cb5d613111adcc21d475545c3b1b7e6ff12444476e5c055132e2229dc0f807044bb919b1a5662dd38a9ee65e243a3911aed1a", + "8ab48713389dd0fcf9f965d3ce66b1e559a1f8c58741d67683cd971354f452e62d0207a65e436c5d5d8f8ee71c6abfe50e669004c302b31a7ea8311d4a916051", + "24ce0addaa4c65038bd1b1c0f1452a0b128777aabc94a29df2fd6c7e2f85f8ab9ac7eff516b0e0a825c84a24cfe492eaad0a6308e46dd42fe8333ab971bb30ca", + "5154f929ee03045b6b0c0004fa778edee1d139893267cc84825ad7b36c63de32798e4a166d24686561354f63b00709a1364b3c241de3febf0754045897467cd4", + "e74e907920fd87bd5ad636dd11085e50ee70459c443e1ce5809af2bc2eba39f9e6d7128e0e3712c316da06f4705d78a4838e28121d4344a2c79c5e0db307a677", + "bf91a22334bac20f3fd80663b3cd06c4e8802f30e6b59f90d3035cc9798a217ed5a31abbda7fa6842827bdf2a7a1c21f6fcfccbb54c6c52926f32da816269be1", + "d9d5c74be5121b0bd742f26bffb8c89f89171f3f934913492b0903c271bbe2b3395ef259669bef43b57f7fcc3027db01823f6baee66e4f9fead4d6726c741fce", + "50c8b8cf34cd879f80e2faab3230b0c0e1cc3e9dcadeb1b9d97ab923415dd9a1fe38addd5c11756c67990b256e95ad6d8f9fedce10bf1c90679cde0ecf1be347", + "0a386e7cd5dd9b77a035e09fe6fee2c8ce61b5383c87ea43205059c5e4cd4f4408319bb0a82360f6a58e6c9ce3f487c446063bf813bc6ba535e17fc1826cfc91", + "1f1459cb6b61cbac5f0efe8fc487538f42548987fcd56221cfa7beb22504769e792c45adfb1d6b3d60d7b749c8a75b0bdf14e8ea721b95dca538ca6e25711209", + "e58b3836b7d8fedbb50ca5725c6571e74c0785e97821dab8b6298c10e4c079d4a6cdf22f0fedb55032925c16748115f01a105e77e00cee3d07924dc0d8f90659", + "b929cc6505f020158672deda56d0db081a2ee34c00c1100029bdf8ea98034fa4bf3e8655ec697fe36f40553c5bb46801644a627d3342f4fc92b61f03290fb381", + "72d353994b49d3e03153929a1e4d4f188ee58ab9e72ee8e512f29bc773913819ce057ddd7002c0433ee0a16114e3d156dd2c4a7e80ee53378b8670f23e33ef56", + "c70ef9bfd775d408176737a0736d68517ce1aaad7e81a93c8c1ed967ea214f56c8a377b1763e676615b60f3988241eae6eab9685a5124929d28188f29eab06f7", + "c230f0802679cb33822ef8b3b21bf7a9a28942092901d7dac3760300831026cf354c9232df3e084d9903130c601f63c1f4a4a4b8106e468cd443bbe5a734f45f", + "6f43094cafb5ebf1f7a4937ec50f56a4c9da303cbb55ac1f27f1f1976cd96beda9464f0e7b9c54620b8a9fba983164b8be3578425a024f5fe199c36356b88972", + "3745273f4c38225db2337381871a0c6aafd3af9b018c88aa02025850a5dc3a42a1a3e03e56cbf1b0876d63a441f1d2856a39b8801eb5af325201c415d65e97fe", + "c50c44cca3ec3edaae779a7e179450ebdda2f97067c690aa6c5a4ac7c30139bb27c0df4db3220e63cb110d64f37ffe078db72653e2daacf93ae3f0a2d1a7eb2e", + "8aef263e385cbc61e19b28914243262af5afe8726af3ce39a79c27028cf3ecd3f8d2dfd9cfc9ad91b58f6f20778fd5f02894a3d91c7d57d1e4b866a7f364b6be", + "28696141de6e2d9bcb3235578a66166c1448d3e905a1b482d423be4bc5369bc8c74dae0acc9cc123e1d8ddce9f97917e8c019c552da32d39d2219b9abf0fa8c8", + "2fb9eb2085830181903a9dafe3db428ee15be7662224efd643371fb25646aee716e531eca69b2bdc8233f1a8081fa43da1500302975a77f42fa592136710e9dc", + "66f9a7143f7a3314a669bf2e24bbb35014261d639f495b6c9c1f104fe8e320aca60d4550d69d52edbd5a3cdeb4014ae65b1d87aa770b69ae5c15f4330b0b0ad8", + "f4c4dd1d594c3565e3e25ca43dad82f62abea4835ed4cd811bcd975e46279828d44d4c62c3679f1b7f7b9dd4571d7b49557347b8c5460cbdc1bef690fb2a08c0", + "8f1dc9649c3a84551f8f6e91cac68242a43b1f8f328ee92280257387fa7559aa6db12e4aeadc2d26099178749c6864b357f3f83b2fb3efa8d2a8db056bed6bcc", + "3139c1a7f97afd1675d460ebbc07f2728aa150df849624511ee04b743ba0a833092f18c12dc91b4dd243f333402f59fe28abdbbbae301e7b659c7a26d5c0f979", + "06f94a2996158a819fe34c40de3cf0379fd9fb85b3e363ba3926a0e7d960e3f4c2e0c70c7ce0ccb2a64fc29869f6e7ab12bd4d3f14fce943279027e785fb5c29", + "c29c399ef3eee8961e87565c1ce263925fc3d0ce267d13e48dd9e732ee67b0f69fad56401b0f10fcaac119201046cca28c5b14abdea3212ae65562f7f138db3d", + "4cec4c9df52eef05c3f6faaa9791bc7445937183224ecc37a1e58d0132d35617531d7e795f52af7b1eb9d147de1292d345fe341823f8e6bc1e5badca5c656108", + "898bfbae93b3e18d00697eab7d9704fa36ec339d076131cefdf30edbe8d9cc81c3a80b129659b163a323bab9793d4feed92d54dae966c77529764a09be88db45", + "ee9bd0469d3aaf4f14035be48a2c3b84d9b4b1fff1d945e1f1c1d38980a951be197b25fe22c731f20aeacc930ba9c4a1f4762227617ad350fdabb4e80273a0f4", + "3d4d3113300581cd96acbf091c3d0f3c310138cd6979e6026cde623e2dd1b24d4a8638bed1073344783ad0649cc6305ccec04beb49f31c633088a99b65130267", + "95c0591ad91f921ac7be6d9ce37e0663ed8011c1cfd6d0162a5572e94368bac02024485e6a39854aa46fe38e97d6c6b1947cd272d86b06bb5b2f78b9b68d559d", + "227b79ded368153bf46c0a3ca978bfdbef31f3024a5665842468490b0ff748ae04e7832ed4c9f49de9b1706709d623e5c8c15e3caecae8d5e433430ff72f20eb", + "5d34f3952f0105eef88ae8b64c6ce95ebfade0e02c69b08762a8712d2e4911ad3f941fc4034dc9b2e479fdbcd279b902faf5d838bb2e0c6495d372b5b7029813", + "7f939bf8353abce49e77f14f3750af20b7b03902e1a1e7fb6aaf76d0259cd401a83190f15640e74f3e6c5a90e839c7821f6474757f75c7bf9002084ddc7a62dc", + "062b61a2f9a33a71d7d0a06119644c70b0716a504de7e5e1be49bd7b86e7ed6817714f9f0fc313d06129597e9a2235ec8521de36f7290a90ccfc1ffa6d0aee29", + "f29e01eeae64311eb7f1c6422f946bf7bea36379523e7b2bbaba7d1d34a22d5ea5f1c5a09d5ce1fe682cced9a4798d1a05b46cd72dff5c1b355440b2a2d476bc", + "ec38cd3bbab3ef35d7cb6d5c914298351d8a9dc97fcee051a8a02f58e3ed6184d0b7810a5615411ab1b95209c3c810114fdeb22452084e77f3f847c6dbaafe16", + "c2aef5e0ca43e82641565b8cb943aa8ba53550caef793b6532fafad94b816082f0113a3ea2f63608ab40437ecc0f0229cb8fa224dcf1c478a67d9b64162b92d1", + "15f534efff7105cd1c254d074e27d5898b89313b7d366dc2d7d87113fa7d53aae13f6dba487ad8103d5e854c91fdb6e1e74b2ef6d1431769c30767dde067a35c", + "89acbca0b169897a0a2714c2df8c95b5b79cb69390142b7d6018bb3e3076b099b79a964152a9d912b1b86412b7e372e9cecad7f25d4cbab8a317be36492a67d7", + "e3c0739190ed849c9c962fd9dbb55e207e624fcac1eb417691515499eea8d8267b7e8f1287a63633af5011fde8c4ddf55bfdf722edf88831414f2cfaed59cb9a", + "8d6cf87c08380d2d1506eee46fd4222d21d8c04e585fbfd08269c98f702833a156326a0724656400ee09351d57b440175e2a5de93cc5f80db6daf83576cf75fa", + "da24bede383666d563eeed37f6319baf20d5c75d1635a6ba5ef4cfa1ac95487e96f8c08af600aab87c986ebad49fc70a58b4890b9c876e091016daf49e1d322e", + "f9d1d1b1e87ea7ae753a029750cc1cf3d0157d41805e245c5617bb934e732f0ae3180b78e05bfe76c7c3051e3e3ac78b9b50c05142657e1e03215d6ec7bfd0fc", + "11b7bc1668032048aa43343de476395e814bbbc223678db951a1b03a021efac948cfbe215f97fe9a72a2f6bc039e3956bfa417c1a9f10d6d7ba5d3d32ff323e5", + "b8d9000e4fc2b066edb91afee8e7eb0f24e3a201db8b6793c0608581e628ed0bcc4e5aa6787992a4bcc44e288093e63ee83abd0bc3ec6d0934a674a4da13838a", + "ce325e294f9b6719d6b61278276ae06a2564c03bb0b783fafe785bdf89c7d5acd83e78756d301b445699024eaeb77b54d477336ec2a4f332f2b3f88765ddb0c3", + "29acc30e9603ae2fccf90bf97e6cc463ebe28c1b2f9b4b765e70537c25c702a29dcbfbf14c99c54345ba2b51f17b77b5f15db92bbad8fa95c471f5d070a137cc", + "3379cbaae562a87b4c0425550ffdd6bfe1203f0d666cc7ea095be407a5dfe61ee91441cd5154b3e53b4f5fb31ad4c7a9ad5c7af4ae679aa51a54003a54ca6b2d", + "3095a349d245708c7cf550118703d7302c27b60af5d4e67fc978f8a4e60953c7a04f92fcf41aee64321ccb707a895851552b1e37b00bc5e6b72fa5bcef9e3fff", + "07262d738b09321f4dbccec4bb26f48cb0f0ed246ce0b31b9a6e7bc683049f1f3e5545f28ce932dd985c5ab0f43bd6de0770560af329065ed2e49d34624c2cbb", + "b6405eca8ee3316c87061cc6ec18dba53e6c250c63ba1f3bae9e55dd3498036af08cd272aa24d713c6020d77ab2f3919af1a32f307420618ab97e73953994fb4", + "7ee682f63148ee45f6e5315da81e5c6e557c2c34641fc509c7a5701088c38a74756168e2cd8d351e88fd1a451f360a01f5b2580f9b5a2e8cfc138f3dd59a3ffc", + "1d263c179d6b268f6fa016f3a4f29e943891125ed8593c81256059f5a7b44af2dcb2030d175c00e62ecaf7ee96682aa07ab20a611024a28532b1c25b86657902", + "106d132cbdb4cd2597812846e2bc1bf732fec5f0a5f65dbb39ec4e6dc64ab2ce6d24630d0f15a805c3540025d84afa98e36703c3dbee713e72dde8465bc1be7e", + "0e79968226650667a8d862ea8da4891af56a4e3a8b6d1750e394f0dea76d640d85077bcec2cc86886e506751b4f6a5838f7f0b5fef765d9dc90dcdcbaf079f08", + "521156a82ab0c4e566e5844d5e31ad9aaf144bbd5a464fdca34dbd5717e8ff711d3ffebbfa085d67fe996a34f6d3e4e60b1396bf4b1610c263bdbb834d560816", + "1aba88befc55bc25efbce02db8b9933e46f57661baeabeb21cc2574d2a518a3cba5dc5a38e49713440b25f9c744e75f6b85c9d8f4681f676160f6105357b8406", + "5a9949fcb2c473cda968ac1b5d08566dc2d816d960f57e63b898fa701cf8ebd3f59b124d95bfbbedc5f1cf0e17d5eaed0c02c50b69d8a402cabcca4433b51fd4", + "b0cead09807c672af2eb2b0f06dde46cf5370e15a4096b1a7d7cbb36ec31c205fbefca00b7a4162fa89fb4fb3eb78d79770c23f44e7206664ce3cd931c291e5d", + "bb6664931ec97044e45b2ae420ae1c551a8874bc937d08e969399c3964ebdba8346cdd5d09caafe4c28ba7ec788191ceca65ddd6f95f18583e040d0f30d0364d", + "65bc770a5faa3792369803683e844b0be7ee96f29f6d6a35568006bd5590f9a4ef639b7a8061c7b0424b66b60ac34af3119905f33a9d8c3ae18382ca9b689900", + "ea9b4dca333336aaf839a45c6eaa48b8cb4c7ddabffea4f643d6357ea6628a480a5b45f2b052c1b07d1fedca918b6f1139d80f74c24510dcbaa4be70eacc1b06", + "e6342fb4a780ad975d0e24bce149989b91d360557e87994f6b457b895575cc02d0c15bad3ce7577f4c63927ff13f3e381ff7e72bdbe745324844a9d27e3f1c01", + "3e209c9b33e8e461178ab46b1c64b49a07fb745f1c8bc95fbfb94c6b87c69516651b264ef980937fad41238b91ddc011a5dd777c7efd4494b4b6ecd3a9c22ac0", + "fd6a3d5b1875d80486d6e69694a56dbb04a99a4d051f15db2689776ba1c4882e6d462a603b7015dc9f4b7450f05394303b8652cfb404a266962c41bae6e18a94", + "951e27517e6bad9e4195fc8671dee3e7e9be69cee1422cb9fecfce0dba875f7b310b93ee3a3d558f941f635f668ff832d2c1d033c5e2f0997e4c66f147344e02", + "8eba2f874f1ae84041903c7c4253c82292530fc8509550bfdc34c95c7e2889d5650b0ad8cb988e5c4894cb87fbfbb19612ea93ccc4c5cad17158b9763464b492", + "16f712eaa1b7c6354719a8e7dbdfaf55e4063a4d277d947550019b38dfb564830911057d50506136e2394c3b28945cc964967d54e3000c2181626cfb9b73efd2", + "c39639e7d5c7fb8cdd0fd3e6a52096039437122f21c78f1679cea9d78a734c56ecbeb28654b4f18e342c331f6f7229ec4b4bc281b2d80a6eb50043f31796c88c", + "72d081af99f8a173dcc9a0ac4eb3557405639a29084b54a40172912a2f8a395129d5536f0918e902f9e8fa6000995f4168ddc5f893011be6a0dbc9b8a1a3f5bb", + "c11aa81e5efd24d5fc27ee586cfd8847fbb0e27601ccece5ecca0198e3c7765393bb74457c7e7a27eb9170350e1fb53857177506be3e762cc0f14d8c3afe9077", + "c28f2150b452e6c0c424bcde6f8d72007f9310fed7f2f87de0dbb64f4479d6c1441ba66f44b2accee61609177ed340128b407ecec7c64bbe50d63d22d8627727", + "f63d88122877ec30b8c8b00d22e89000a966426112bd44166e2f525b769ccbe9b286d437a0129130dde1a86c43e04bedb594e671d98283afe64ce331de9828fd", + "348b0532880b88a6614a8d7408c3f913357fbb60e995c60205be9139e74998aede7f4581e42f6b52698f7fa1219708c14498067fd1e09502de83a77dd281150c", + "5133dc8bef725359dff59792d85eaf75b7e1dcd1978b01c35b1b85fcebc63388ad99a17b6346a217dc1a9622ebd122ecf6913c4d31a6b52a695b86af00d741a0", + "2753c4c0e98ecad806e88780ec27fccd0f5c1ab547f9e4bf1659d192c23aa2cc971b58b6802580baef8adc3b776ef7086b2545c2987f348ee3719cdef258c403", + "b1663573ce4b9d8caefc865012f3e39714b9898a5da6ce17c25a6a47931a9ddb9bbe98adaa553beed436e89578455416c2a52a525cf2862b8d1d49a2531b7391", + "64f58bd6bfc856f5e873b2a2956ea0eda0d6db0da39c8c7fc67c9f9feefcff3072cdf9e6ea37f69a44f0c61aa0da3693c2db5b54960c0281a088151db42b11e8", + "0764c7be28125d9065c4b98a69d60aede703547c66a12e17e1c618994132f5ef82482c1e3fe3146cc65376cc109f0138ed9a80e49f1f3c7d610d2f2432f20605", + "f748784398a2ff03ebeb07e155e66116a839741a336e32da71ec696001f0ad1b25cd48c69cfca7265eca1dd71904a0ce748ac4124f3571076dfa7116a9cf00e9", + "3f0dbc0186bceb6b785ba78d2a2a013c910be157bdaffae81bb6663b1a73722f7f1228795f3ecada87cf6ef0078474af73f31eca0cc200ed975b6893f761cb6d", + "d4762cd4599876ca75b2b8fe249944dbd27ace741fdab93616cbc6e425460feb51d4e7adcc38180e7fc47c89024a7f56191adb878dfde4ead62223f5a2610efe", + "cd36b3d5b4c91b90fcbba79513cfee1907d8645a162afd0cd4cf4192d4a5f4c892183a8eacdb2b6b6a9d9aa8c11ac1b261b380dbee24ca468f1bfd043c58eefe", + "98593452281661a53c48a9d8cd790826c1a1ce567738053d0bee4a91a3d5bd92eefdbabebe3204f2031ca5f781bda99ef5d8ae56e5b04a9e1ecd21b0eb05d3e1", + "771f57dd2775ccdab55921d3e8e30ccf484d61fe1c1b9c2ae819d0fb2a12fab9be70c4a7a138da84e8280435daade5bbe66af0836a154f817fb17f3397e725a3", + "c60897c6f828e21f16fbb5f15b323f87b6c8955eabf1d38061f707f608abdd993fac3070633e286cf8339ce295dd352df4b4b40b2f29da1dd50b3a05d079e6bb", + "8210cd2c2d3b135c2cf07fa0d1433cd771f325d075c6469d9c7f1ba0943cd4ab09808cabf4acb9ce5bb88b498929b4b847f681ad2c490d042db2aec94214b06b", + "1d4edfffd8fd80f7e4107840fa3aa31e32598491e4af7013c197a65b7f36dd3ac4b478456111cd4309d9243510782fa31b7c4c95fa951520d020eb7e5c36e4ef", + "af8e6e91fab46ce4873e1a50a8ef448cc29121f7f74deef34a71ef89cc00d9274bc6c2454bbb3230d8b2ec94c62b1dec85f3593bfa30ea6f7a44d7c09465a253", + "29fd384ed4906f2d13aa9fe7af905990938bed807f1832454a372ab412eea1f5625a1fcc9ac8343b7c67c5aba6e0b1cc4644654913692c6b39eb9187ceacd3ec", + "a268c7885d9874a51c44dffed8ea53e94f78456e0b2ed99ff5a3924760813826d960a15edbedbb5de5226ba4b074e71b05c55b9756bb79e55c02754c2c7b6c8a", + "0cf8545488d56a86817cd7ecb10f7116b7ea530a45b6ea497b6c72c997e09e3d0da8698f46bb006fc977c2cd3d1177463ac9057fdd1662c85d0c126443c10473", + "b39614268fdd8781515e2cfebf89b4d5402bab10c226e6344e6b9ae000fb0d6c79cb2f3ec80e80eaeb1980d2f8698916bd2e9f747236655116649cd3ca23a837", + "74bef092fc6f1e5dba3663a3fb003b2a5ba257496536d99f62b9d73f8f9eb3ce9ff3eec709eb883655ec9eb896b9128f2afc89cf7d1ab58a72f4a3bf034d2b4a", + "3a988d38d75611f3ef38b8774980b33e573b6c57bee0469ba5eed9b44f29945e7347967fba2c162e1c3be7f310f2f75ee2381e7bfd6b3f0baea8d95dfb1dafb1", + "58aedfce6f67ddc85a28c992f1c0bd0969f041e66f1ee88020a125cbfcfebcd61709c9c4eba192c15e69f020d462486019fa8dea0cd7a42921a19d2fe546d43d", + "9347bd291473e6b4e368437b8e561e065f649a6d8ada479ad09b1999a8f26b91cf6120fd3bfe014e83f23acfa4c0ad7b3712b2c3c0733270663112ccd9285cd9", + "b32163e7c5dbb5f51fdc11d2eac875efbbcb7e7699090a7e7ff8a8d50795af5d74d9ff98543ef8cdf89ac13d0485278756e0ef00c817745661e1d59fe38e7537", + "1085d78307b1c4b008c57a2e7e5b234658a0a82e4ff1e4aaac72b312fda0fe27d233bc5b10e9cc17fdc7697b540c7d95eb215a19a1a0e20e1abfa126efd568c7", + "4e5c734c7dde011d83eac2b7347b373594f92d7091b9ca34cb9c6f39bdf5a8d2f134379e16d822f6522170ccf2ddd55c84b9e6c64fc927ac4cf8dfb2a17701f2", + "695d83bd990a1117b3d0ce06cc888027d12a054c2677fd82f0d4fbfc93575523e7991a5e35a3752e9b70ce62992e268a877744cdd435f5f130869c9a2074b338", + "a6213743568e3b3158b9184301f3690847554c68457cb40fc9a4b8cfd8d4a118c301a07737aeda0f929c68913c5f51c80394f53bff1c3e83b2e40ca97eba9e15", + "d444bfa2362a96df213d070e33fa841f51334e4e76866b8139e8af3bb3398be2dfaddcbc56b9146de9f68118dc5829e74b0c28d7711907b121f9161cb92b69a9", + "142709d62e28fcccd0af97fad0f8465b971e82201dc51070faa0372aa43e92484be1c1e73ba10906d5d1853db6a4106e0a7bf9800d373d6dee2d46d62ef2a461", +} + +var hashes2X = []string{ + "64", + "f457", + "e8c045", + "a74c6d0d", + "eb02ae482a", + "be65b981275e", + "8540ccd083a455", + "074a02fa58d7c7c0", + "da6da05e10db3022b6", + "542a5aae2f28f2c3b68c", + "ca3af2afc4afe891da78b1", + "e0f66b8dcebf4edc85f12c85", + "744224d383733b3fa2c53bfcf5", + "b09b653e85b72ef5cdf8fcfa95f3", + "dd51877f31f1cf7b9f68bbb09064a3", + "f5ebf68e7ebed6ad445ffc0c47e82650", + "ebdcfe03bcb7e21a9091202c5938c0a1bb", + "860fa5a72ff92efafc48a89df1632a4e2809", + "0d6d49daa26ae2818041108df3ce0a4db48c8d", + "e5d7e1bc5715f5ae991e4043e39533af5d53e47f", + "5232028a43b9d4dfa7f37439b49495926481ab8a29", + "c118803c922f9ae2397fb676a2ab7603dd9c29c21fe4", + "2af924f48b9bd7076bfd68794bba6402e2a7ae048de3ea", + "61255ac38231087c79ea1a0fa14538c26be1c851b6f318c0", + "f9712b8e42f0532162822f142cb946c40369f2f0e77b6b186e", + "76da0b89558df66f9b1e66a61d1e795b178ce77a359087793ff2", + "9036fd1eb32061bdecebc4a32aa524b343b8098a16768ee774d93c", + "f4ce5a05934e125d159678bea521f585574bcf9572629f155f63efcc", + "5e1c0d9fae56393445d3024d6b82692d1339f7b5936f68b062c691d3bf", + "538e35f3e11111d7c4bab69f83b30ade4f67addf1f45cdd2ac74bf299509", + "17572c4dcbb17faf8785f3bba9f6903895394352eae79b01ebd758377694cc", + "29f6bb55de7f8868e053176c878c9fe6c2055c4c5413b51ab0386c277fdbac75", + "bad026c8b2bd3d294907f2280a7145253ec2117d76e3800357be6d431b16366e41", + "386b7cb6e0fd4b27783125cbe80065af8eb9981fafc3ed18d8120863d972fa7427d9", + "06e8e6e26e756fff0b83b226dce974c21f970e44fb5b3e5bbada6e4b12f81cca666f48", + "2f9bd300244f5bc093ba6dcdb4a89fa29da22b1de9d2c9762af919b5fedf6998fbda305b", + "cf6bdcc46d788074511f9e8f0a4b86704365b2d3f98340b8db53920c385b959a38c8869ae7", + "1171e603e5cdeb4cda8fd7890222dd8390ede87b6f3284cac0f0d832d8250c9200715af7913d", + "bda7b2ad5d02bd35ffb009bdd72b7d7bc9c28b3a32f32b0ba31d6cbd3ee87c60b7b98c03404621", + "2001455324e748503aa08eff2fb2e52ae0170e81a6e9368ada054a36ca340fb779393fb045ac72b3", + "45f0761aefafbf87a68f9f1f801148d9bba52616ad5ee8e8ac9207e9846a782f487d5cca8b20355a18", + "3a7e05708be62f087f17b41ac9f20e4ef8115c5ab6d08e84d46af8c273fb46d3ce1aabebae5eea14e018", + "ea318da9d042ca337ccdfb2bee3e96ecb8f907876c8d143e8e44569178353c2e593e4a82c265931ba1dd79", + "e0f7c08f5bd712f87094b04528fadb283d83c9ceb82a3e39ec31c19a42a1a1c3bee5613b5640abe069b0d690", + "d35e63fb1f3f52ab8f7c6cd7c8247e9799042e53922fbaea808ab979fa0c096588cfea3009181d2f93002dfc11", + "b8b0ab69e3ae55a8699eb481dd665b6a2424c89bc6b7cca02d15fdf1b9854139cab49d34de498b50b2c7e8b910cf", + "fb65e3222a2950eae1701d4cdd4736266f65bf2c0d2e77968996eadb60ef74fb786f6234973a2524bdfe32d100aa0e", + "f28b4bb3a2e2c4d5c01a23ff134558559a2d3d704b75402983ee4e0f71d273ae056842c4153b18ee5c47e2bfa54313d4", + "7bb78794e58a53c3e4b1aeb161e756af051583d14e0a5a3205e094b7c9a8cf62d098fa9ea1db12f330a51ab9852c17f983", + "a879a8ebae4d0987789bcc58ec3448e35ba1fa1ee58c668d8295aba4eaeaf2762b053a677e25404f635a53037996974d418a", + "695865b353ec701ecc1cb38f3154489eed0d39829fc192bb68db286d20fa0a64235cde5639137819f7e99f86bd89afcef84a0f", + "a6ec25f369f71176952fb9b33305dc768589a6070463ee4c35996e1ced4964a865a5c3dc8f0d809eab71366450de702318e4834d", + "604749f7bfadb069a036409ffac5ba291fa05be8cba2f141554132f56d9bcb88d1ce12f2004cd3ade1aa66a26e6ef64e327514096d", + "daf9fa7dc2464a899533594e7916fc9bc585bd29dd60c930f3bfa78bc47f6c8439448043a45119fc9228c15bce5fd24f46baf9de736b", + "943ea5647a8666763084da6a6f15dcf0e8dc24f27fd0d9194805d25180fe3a6d98f4b2b5e0d6a04e9b41869817030f16ae975dd41fc35c", + "af4f73cbfc093760dfeb52d57ef45207bbd1a515f5523404e5d95a73c237d97ae65bd195b472de6d514c2c448b12fafc282166da132258e9", + "605f4ed72ed7f5046a342fe4cf6808100d4632e610d59f7ebb016e367d0ff0a95cf45b02c727ba71f147e95212f52046804d376c918cadd260", + "3750d8ab0a6b13f78e51d321dfd1aa801680e958de45b7b977d05732ee39f856b27cb2bcce8fbf3db6666d35e21244c2881fdcc27fbfea6b1672", + "8f1b929e80ab752b58abe9731b7b34eb61369536995abef1c0980d93903c1880da3637d367456895f0cb4769d6de3a979e38ed6f5f6ac4d48e9b32", + "d8469b7aa538b36cdc711a591d60dafecca22bd421973a70e2deef72f69d8014a6f0064eabfbebf5383cbb90f452c6e113d2110e4b1092c54a38b857", + "7d1f1ad2029f4880e1898af8289c23bc933a40863cc4ab697fead79c58b6b8e25b68cf5324579b0fe879fe7a12e6d03907f0140dfe7b29d33d6109ecf1", + "87a77aca6d551642288a0dff66078225ae39d288801607429d6725ca949eed7a6f199dd8a65523b4ee7cfa4187400e96597bfffc3e38ade0ae0ab88536a9", + "e101f43179d8e8546e5ce6a96d7556b7e6b9d4a7d00e7aade5579d085d527ce34a9329551ebcaf6ba946949bbe38e30a62ae344c1950b4bde55306b3bac432", + "4324561d76c370ef35ac36a4adf8f3773a50d86504bd284f71f7ce9e2bc4c1f1d34a7fb2d67561d101955d448b67577eb30dfee96a95c7f921ef53e20be8bc44", + "78f0ed6e220b3da3cc9381563b2f72c8dc830cb0f39a48c6ae479a6a78dcfa94002631dec467e9e9b47cc8f0887eb680e340aec3ec009d4a33d241533c76c8ca8c", + "9f6589c31a472e0a736f4eb22b6c70a9d332cc15304ccb66a6b97cd051b6ed82f8990e1d9bee2e4bb1c3c45e550ae0e7b96e93ae23f2fb8f63b309131e72b36cba6a", + "c138077ee4ed3d7ffa85ba851dfdf6e9843fc1dc00889d117237bfaad9aa757192f73556b959f98e6d24886ce48869f2a01a48c371785f12b6484eb2078f08c22066e1", + "f83e7c9e0954a500576ea1fc90a3db2cbd7994eaef647dab5b34e88ab9dc0b47addbc807b21c8e6dd3d0bd357f008471d4f3e0abb18450e1d4919e03a34545b9643f870e", + "3277a11f2628544fc66f50428f1ad56bcba6ee36ba2ca6ecdf7e255effc0c30235c039d13e01f04cf1efe95b5c2033ab72adda30994b62f2851d17c9920eadca9a251752dc", + "c2a834281a06fe7b730d3a03f90761daf02714c066e33fc07e1f59ac801ec2f4433486b5a2da8faa51a0cf3c34e29b2960cd0013378938dbd47c3a3d12d70db01d7d06c3e91e", + "47680182924a51cabe142a6175c9253e8ba7ea579ece8d9bcb78b1e9ca00db844fa08abcf41702bd758ee2c608d9612fed50e85854469cb4ef3038acf1e35b6ba4390561d8ae82", + "cec45830cd71869e83b109a99a3cd7d935f83a95de7c582f3adbd34e4938fa2f3f922f52f14f169c38cc6618d3f306a8a4d607b345b8a9c48017136fbf825aecf7b620e85f837fae", + "46fb53c70ab105079d5d78dc60eaa30d938f26e4d0b9df122e21ec85deda94744c1daf8038b8a6652d1ff3e7e15376f5abd30e564784a999f665078340d66b0e939e0c2ef03f9c08bb", + "7b0dcb52791a170cc52f2e8b95d8956f325c3751d3ef3b2b83b41d82d4496b46228a750d02b71a96012e56b0720949ca77dc68be9b1ef1ad6d6a5ceb86bf565cb972279039e209dddcdc", + "7153fd43e6b05f5e1a4401e0fef954a737ed142ec2f60bc4daeef9ce73ea1b40a0fcaf1a1e03a3513f930dd5335723632f59f7297fe3a98b68e125eadf478eb045ed9fc4ee566d13f537f5", + "c7f569c79c801dab50e9d9ca6542f25774b3841e49c83efe0b89109f569509ce7887bc0d2b57b50320eb81fab9017f16c4c870e59edb6c26620d93748500231d70a36f48a7c60747ca2d5986", + "0a81e0c547648595adca65623ce783411aac7f7d30c3ad269efafab288e7186f6895261972f5137877669c550f34f5128850ebb50e1884814ea1055ee29a866afd04b2087abed02d9592573428", + "6a7b6769e1f1c95314b0c7fe77013567891bd23416374f23e4f43e27bc4c55cfada13b53b1581948e07fb96a50676baa2756db0988077b0f27d36ac088e0ff0fe72eda1e8eb4b8facff3218d9af0", + "a399474595cb1ccab6107f18e80f03b1707745c7bf769fc9f260094dc9f8bc6fe09271cb0b131ebb2acd073de4a6521c8368e664278be86be216d1622393f23435fae4fbc6a2e7c961282a777c2d75", + "4f0fc590b2755a515ae6b46e9628092369d9c8e589e3239320639aa8f7aa44f8111c7c4b3fdbe6e55e036fbf5ebc9c0aa87a4e66851c11e86f6cbf0bd9eb1c98a378c7a7d3af900f55ee108b59bc9e5c", + "ed96a046f08dd675107331d267379c6fce3c352a9f8d7b243008a74cb4e9410836afaabe871dab6038ca94ce5f6d41fa922ce08aba58169f94cfc86d9f688f396abd24c11a6a9b0830572105a477c33e92", + "379955f539abf0eb2972ee99ed9546c4bbee363403991833005dc27904c271ef22a799bc32cb39f08d2e4ba6717d55153feb692d7c5efae70890bf29d96df02333c7b05ccc314e4835b018fec9141a82c745", + "e16cc8d41b96547ede0d0cf4d908c5fa393399daa4a9696e76a4c1f6a2a9fef70f17fb53551a8145ed88f18db8fe780a079d94732437023f7c1d1849ef69ad536a76204239e8ba5d97e507c36c7d042f87fe0e", + "a81de50750ece3f84536728f227208bf01ec5b7721579d007de72c88ee20663318332efe5bc7c09ad1fa8342be51f0609046ccf760a7957a7d8dc88941adb93666a4521ebe76618e5ddc2dd3261493d400b50073", + "b72c5fb7c7f60d243928fa41a2d711157b96aef290185c64b4de3dcfa3d644da67a8f37c2ac55caad79ec695a473e8b481f658c497edb8a191526592b11a412282d2a4010c90ef4647bd6ce745ebc9244a71d4876b", + "9550703877079c90e200e830f277b605624954c549e729c359ee01ee2b07741ecc4255cb37f96682dafcdbaade1063e2c5ccbd1918fb669926a67744101fb6de3ac016be4c74165a1e5a696b704ba2ebf4a953d44b95", + "a17eb44d4de502dc04a80d5a5e9507d17f27c96467f24c79b06bc98a4c410741d4ac2db98ec02c2a976d788531f1a4451b6c6204cef6dae1b6ebbcd0bde23e6fffb02754043c8fd3c783d90a670b16879ce68b5554fe1c", + "41d3ea1eaba5be4a206732dbb5b70b79b66a6e5908795ad4fb7cf9e67efb13f06fef8f90acb080ce082aadec6a1b543af759ab63fa6f1d3941186482b0c2b312f1151ea8386253a13ed3708093279b8eb04185636488b226", + "5e7cdd8373dc42a243c96013cd29df9283b5f28bb50453a903c85e2ce57f35861bf93f03029072b70dac0804e7d51fd0c578c8d9fa619f1e9ce3d8044f65d55634dba611280c1d5cfb59c836a595c803124f696b07ddfac718", + "26a14c4aa168907cb5de0d12a82e1373a128fb21f2ed11feba108b1bebce934ad63ed89f4ed7ea5e0bc8846e4fc10142f82de0bebd39d68f7874f615c3a9c896bab34190e85df05aaa316e14820b5e478d838fa89dfc94a7fc1e", + "0211dfc3c35881adc170e4ba6daab1b702dff88933db9a6829a76b8f4a7c2a6d658117132a974f0a0b3a38ceea1efc2488da21905345909e1d859921dc2b5054f09bce8eeb91fa2fc6d048ce00b9cd655e6aafbdaa3a2f19270a16", + "ddf015b01b68c4f5f72c3145d54049867d99ee6bef24282abf0eecdb506e295bacf8f23ffa65a4cd891f76a046b9dd82cae43a8d01e18a8dff3b50aeb92672be69d7c087ec1fa2d3b2a39196ea5b49b7baede37a586fea71aded587f", + "6ee721f71ca4dd5c9ce7873c5c04c6ce76a2c824b984251c15535afc96adc9a4d48ca314bfeb6b8ee65092f14cf2a7ca9614e1dcf24c2a7f0f0c11207d3d8aed4af92873b56e8b9ba2fbd659c3f4ca90fa24f113f74a37181bf0fdf758", + "689bd150e65ac123612524f720f54def78c095eaab8a87b8bcc72b443408e3227f5c8e2bd5af9bcac684d497bc3e41b7a022c28fb5458b95e8dfa2e8caccde0492936ff1902476bb7b4ef2125b19aca2cd3384d922d9f36dddbcd96ae0d6", + "3a3c0ef066fa4390ec76ad6be1dc9c31ddf45fef43fbfa1f49b439caa2eb9f3042253a9853e96a9cf86b4f873785a5d2c5d3b05f6501bc876e09031188e05f48937bf3c9b667d14800db62437590b84ce96aa70bb5141ee2ea41b55a6fd944", + "741ce384e5e0edaebb136701ce38b3d33215415197758ae81235307a4115777d4dab23891db530c6d28f63a957428391421f742789a0e04c99c828373d9903b64dd57f26b3a38b67df829ae243feef731ead0abfca049924667fdec49d40f665", + "a513f450d66cd5a48a115aee862c65b26e836f35a5eb6894a80519e2cd96cc4cad8ed7eb922b4fc9bbc55c973089d627b1da9c3a95f6c019ef1d47143cc545b15e4244424be28199c51a5efc7234dcd94e72d229897c392af85f523c2633427825", + "71f1554d2d49bb7bd9e62e71fa049fb54a2c097032f61ebda669b3e1d4593962e47fc62a0ab5d85706aebd6a2f9a192c88aa1ee2f6a46710cf4af6d3c25b7e68ad5c3db23ac009c8f13625ff85dc8e50a9a1b2682d3329330b973ec8cbb7bb73b2bd", + "167cc1067bc08a8d2c1a0c10041ebe1fc327b37043f6bd8f1c63569e9d36ded58519e66b162f34b6d8f1107ef1e3de199d97b36b44141a1fc4f49b883f40507ff11f909a017869dc8a2357fc7336ae68703d25f75710b0ff5f9765321c0fa53a51675c", + "cb859b35dc70e264efaad2a809fea1e71cd4a3f924be3b5a13f8687a1166b538c40b2ad51d5c3e47b0de482497382673140f547068ff0b3b0fb7501209e1bf36082509ae85f60bb98fd02ac50d883a1a8daa704952d83c1f6da60c9624bc7c99912930bf", + "afb1f0c6b7125b04fa2578dd40f60cb411b35ebc7026c702e25b3f0ae3d4695d44cfdf37cb755691dd9c365edadf21ee44245620e6a24d4c2497135b37cd7ac67e3bd0aaee9f63f107746f9b88859ea902bc7d6895406aa2161f480cad56327d0a5bba2836", + "13e9c0522587460d90c7cb354604de8f1bf850e75b4b176bda92862d35ec810861f7d5e7ff6ba9302f2c2c8642ff8b7776a2f53665790f570fcef3cac069a90d50db42227331c4affb33d6c040d75b9aeafc9086eb83ced38bb02c759e95ba08c92b17031288", + "0549812d62d3ed497307673a4806a21060987a4dbbf43d352b9b170a29240954cf04bc3e1e250476e6800b79e843a8bd8253b7d743de01ab336e978d4bea384eaff700ce020691647411b10a60acacb6f8837fb08ad666b8dcc9eaa87ccb42aef6914a3f3bc30a", + "3a263efbe1f2d463f20526e1d0fd735035fd3f808925f058b32c4d8788aeeab9b8ce233b3c34894731cd73361f465bd350395aebcabd2fb63010298ca025d849c1fa3cd573309b74d7f824bbfe383f09db24bcc565f636b877333206a6ad70815c3bef5574c5fc1c", + "3c6a7d8a84ef7e3eaa812fc1eb8e85105467230d2c9e4562edbfd808f4d1ac15d16b786cc6a02959c2bc17149c2ce74c6f85ee5ef22a8a96b9be1f197cffd214c1ab02a06a9227f37cd432579f8c28ff2b5ac91cca8ffe6240932739d56788c354e92c591e1dd76499", + "b571859294b02af17541a0b5e899a5f67d6f5e36d38255bc417486e69240db56b09cf2607fbf4f95d085a779358a8a8b41f36503438c1860c8f361ce0f2783a08b21bd7232b50ca6d35428335272a5c05b436b2631d8d5c84d60e8040083768ce56a250727fb0579dd5c", + "98ee1b7269d2a0dd490ca38d447279870ea55326571a1b430adbb2cf65c492131136f504145df3ab113a13abfb72c33663266b8bc9c458db4bf5d7ef03e1d3b8a99d5de0c024be8fabc8dc4f5dac82a0342d8ed65c329e7018d6997e69e29a01350516c86beaf153da65ac", + "41c5c95f088df320d35269e5bf86d10248f17aec6776f0fe653f1c356aae409788c938befeb67c86d1c8870e8099ca0ce61a80fbb5a6654c44529368f70fc9b9c2f912f5092047d0ffc339577d24142300e34948e086f62e23ecaca410d24f8a36b5c8c5a80e0926bc8aa16a", + "9f93c41f533b2a82a4df893c78faaaa793c1506974ba2a604cd33101713ca4adfd30819ffd8403402b8d40aff78106f3357f3e2c24312c0d3603a17184d7b999fc9908d14d50192aebabd90d05073da7af4be37dd3d81c90acc80e8333df546f17ab6874f1ec204392d1c0571e", + "3da5207245ac270a915fc91cdb314e5a2577c4f8e269c4e701f0d7493ba716de79935918b917a2bd5db98050dbd1eb3894b65fac5abf13e075abebc011e651c03cafb6127147771a5c8418223e1548137a89206635c26ca9c235ccc108dc25cf846e4732444bd0c2782b197b262b", + "96011af3965bb941dc8f749932ea484eccb9ba94e34b39f24c1e80410f96ce1d4f6e0aa5be606def4f54301e930493d4b55d484d93ab9dd4dc2c9cfb79345363af31ad42f4bd1aa6c77b8afc9f0d551bef7570b13b927afe3e7ac4de7603a0876d5edb1ad9be05e9ee8b53941e8f59", + "51dbbf2a7ca224e524e3454fe82ddc901fafd2120fa8603bc343f129484e9600f688586e040566de0351d1693829045232d04ff31aa6b80125c763faab2a9b233313d931903dcfaba490538b06e4688a35886dc24cdd32a13875e6acf45454a8eb8a315ab95e608ad8b6a49aef0e299a", + "5a6a422529e22104681e8b18d64bc0463a45df19ae2633751c7aae412c250f8fb2cd5e1270d3d0cf009c8aa69688ccd4e2b6536f5747a5bc479b20c135bf4e89d33a26118705a614c6be7ecfe766932471ad4ba01c4f045b1abb5070f90ec78439a27a1788db9327d1c32f939e5fb1d5ba", + "5d26c983642093cb12ff0afabd87b7c56e211d01844ad6da3f623b9f20a0c968034299f2a65e6673530c5980a532beb831c7d0697d12760445986681076dfb6fae5f3a4d8f17a0db5008ce8619f566d2cfe4cf2a6d6f9c3664e3a48564a351c0b3c945c5ee24587521e4112c57e318be1b6a", + "52641dbc6e36be4d905d8d60311e303e8e859cc47901ce30d6f67f152343e3c4030e3a33463793c19effd81fb7c4d631a9479a7505a983a052b1e948ce093b30efa595fab3a00f4cef9a2f664ceeb07ec61719212d58966bca9f00a7d7a8cb4024cf6476bab7fbccee5fd4e7c3f5e2b2975aa2", + "a34ce135b37bf3db1c4aaa4878b4499bd2ee17b85578fcaf605d41e1826b45fdaa1b083d8235dc642787f11469a5493e36806504fe2a2063905e821475e2d5ee217057950370492f5024995e77b82aa51b4f5bd8ea24dc71e0a8a640b0592c0d80c24a726169cf0a10b40944747113d03b52708c", + "46b3cdf4946e15a5334fc3244d6680f5fc132afa67bf43bfade23d0c9e0ec64e7dab76faaeca1870c05f96b7d019411d8b0873d9fed04fa5057c039d5949a4d592827f619471359d6171691cfa8a5d7cb07ef2804f6ccad4821c56d4988bea7765f660f09ef87405f0a80bcf8559efa111f2a0b419", + "8b9fc21691477f11252fca050b121c5334eb4280aa11659e267297de1fec2b2294c7ccee9b59a149b9930b08bd320d3943130930a7d931b71d2f10234f4480c67f1de883d9894ada5ed5071660e221d78ae402f1f05af47761e13fec979f2671e3c63fb0ae7aa1327cf9b8313adab90794a52686bbc4", + "cd6598924ce847de7ff45b20ac940aa6292a8a99b56a74eddc24f2cfb45797188614a21d4e8867e23ff75afd7cd324248d58fcf1ddc73fbd115dfa8c09e62022fab540a59f87c989c12a86ded05130939f00cd2f3b512963dfe0289f0e54acad881c1027d2a0292138fdee902d67d9669c0ca1034a9456", + "594e1cd7337248704e691854af0fdb021067ddf7832b049ba7b684438c32b029eded2df2c89a6ff5f2f2c311522ae2dc6db5a815afc60637b15ec24ef9541f1550409db2a006da3affffe548a1eaee7bd114e9b805d0756c8e90c4dc33cb05226bc2b393b18d953f8730d4c7ae693159cdba758ad28964e2", + "1f0d292453f04406ada8be4c161b82e3cdd69099a8637659e0ee40b8f6da46005cfc6085db9804852decfbe9f7b4dda019a7112612895a144ed430a960c8b2f5458d3d56b7f427cee6358915aee7146278aed2a0296cdd929e4d21ef95a3adf8b7a6beba673cdccdbdcfb2474711732d972ad054b2dc64f38d", + "b65a72d4e1f9f9f75911cc46ad0806b9b18c87d105332a3fe183f45f063a746c892dc6c4b9181b1485b3e3a2cc3b453eba2d4c39d6905a774ed3fb755468beb190925ecd8e57ecb0d985125741650c6b6a1b2a3a50e93e3892c21d47ed5884eed83aa94e1602288f2f49fe286624de9d01fcb54433a0dc4ad70b", + "705ce0ffa469250782aff725248fc88fe98eb76659e8407edc1c4842c9867d61fe64fb86f74e980598b92bc213d06f337bd5654fc28643c7ba769a4c31563427543c00808b627a19c90d86c322f33566ce020121cc322229c3337943d46f68ef939d613dcef0077269f88151d6398b6b009abb763410b154ad76a3", + "7fa881ce87498440ab6af13854f0d851a7e0404de33896999a9b3292a5d2f5b3ad033530c558168fe5d2fdb9b89a2354c46cf32a0e612afc6c6485d789511bfef26800c74bf1a4cfbe30bda310d5f6029c3dccdedb6149e4971274e276dccfabd63bc4b9955e8303feb57f8a688db55ecb4b33d1f9fe1b3a8ba7ac32", + "23a98f71c01c0408ae16843dc03be7db0aeaf055f951709d4e0dfdf64fffbffaf900ee592ee10929648e56f6c1e9f5be5793f7df66453eb56502c7c56c0f0c88da77abc8fa371e434104627ef7c663c49f40998dbad63fa6c7aa4fac17ae138d8bbe081f9bd168cd33c1fbc92fa35ed687679f48a64b87db1fe5bae675", + "7b8970b6a33237e5a7bcb39272703edb92285c55842b30b9a48834b1b507cc02a6764739f2f7ee6ae02a7b715a1c455e59e8c77a1ae98abb10161853f1234d20da99016588cd8602d6b7ec7e177d4011edfa61e6b3766a3c6f8d6e9eac893c568903eb6e6aba9c4725774f6b4343b7acaa6c031593a36eef6c72806ff309", + "f7f4d328ba108b7b1de4443e889a985ed52f485f3ca4e0c246aa5526590cbed344e9f4fe53e4eea0e761c82324649206ca8c2b45152157d4115e68c818644b03b65bb47ad79f94d37cb03c1d953b74c2b8adfa0e1c418bda9c518ddcd7050e0f149044740a2b16479413b63fc13c36144f80c73687513dca761ba8642a8ae0", + "2d7dc80c19a1d12d5fe3963569547a5d1d3e821e6f06c5d5e2c09401f946c9f7e13cd019f2f9a878b62dd850453b6294b99ccaa068e542993524b0f63832d48e865be31e8ec1ee103c718340c904b32efb69170b67f038d50a3252794b1b4076c0620621ab3d91215d55ffea99f23d54e161a90d8d4902fda5931d9f6a27146a", + "77dff4c7ad30c954338c4b23639dae4b275086cbe654d401a2343528065e4c9f1f2eca22aa025d49ca823e76fdbb35df78b1e5075ff2c82b680bca385c6d57f7ea7d1030bb392527b25dd73e9eeff97bea397cf3b9dda0c817a9c870ed12c006cc054968c64000e0da874e9b7d7d621b0679866912243ea096c7b38a1344e98f74", + "83bed0d556798f2b419f7056e6d3ffada06e939b95a688d0ec8c6ac5ea45ab73a4cf01043e0a170766e21395f27ab4b78c435f5f0dfe6e93ab80df38610e41158429ddf20296f53a06a017723359fe22dc08b5da33f0800a4fe50118e8d7eab2f83a85cd764bf8a166903bd0e9dcfeeceba44ff4ca4439846458d31ea2bb564645d1", + "ea12cf5a113543e39504123036f15a5bafa9c555562469f99cd29996a4dfaaab2a34b00557ccf15f37fc0cc1b3be427e725f2cd952e50af7970dda9200cd5ce252b1f29c40067fea3027ed686190803b59d834179d1b8f5b55abe55ad174b2a1188f7753ec0ae2fc01316e7d498b68ee3598a0e9baaaa664a60f7fb4f90edbed494ad7", + "55266358332d8d9e68bd13432088beadf95833aab67a0eb3b10650414255f299e2670c3e1a5b2976159a46c72a7ce57d59b7be14c15798e09ed50fa312a431b0264d7a1396aa6168bde897e208ece53d2cfc83786113b1e6eac5e9bb98984abb6c8d64eebb991903254abc650c999bb9958a5d7937434b869bc940e21b9dc1cc8982f2ba", + "4d6104ded730aefe02873f4c741232c8234a6d66d85393aff57fbf56ba6347666988dfc4d58f3cc895a0da598822edeee4533d24ec0ee292fd5e1ad04898ffbc1ff4bef14dec220babcb0f28fffe32a6e2c28aaaac16442bf4feb02917d18bb3a415d84fa9358d5a9852688d846c92271911f934181c30f82434d915f93f155a1ffbf0b125", + "eb5f579a4c476af554aac11e5719d378549497e613b35a929d6f36bb8831d7a466aa76de9be24ebb55543f1c13924f64cfd648a5b3fa90387315c16174dbf1e9a183c196d9bb8f84af65f1f8212429aadc11ef2426d07d4716062b85c8d5d2dff8e21b9e62b7fa7dbd57d72633054b464fb28583a56ca13ccc5ddc74dae942492f31731e7046", + "ebddec3dcaf18063e45a76ebeac39af85a1adc2818881ccce48c106288f5988365cca2b4b1d7f037322da46840f42bebdcbc7193838d426e101087d8cea03aaff743d573eb4f4e9a71a2c884390769a6503874125d194bee8d46a3a0d5e4fcf28ff8465887d8e9df771d70157e75df3642b331d2778ceb32ceba868640171ab7a5d22eede1ee44", + "26d87ec70b57691e3bb359633d3ddba17f029d62cdfe977f5fd42274d79b444a32494d1c01e9f72d03cce78c806df96e93ea78da3a054209924ed765edc4d570f66168dc25ee3114e4017e387440349c8f0a94804761c3055f88e4fda2a49b860b1486a9609095f6250f268b6a4d1aecc03a505632ebf0b9dc22d0755a736faf7ad7000858b5864b", + "3880f5cc2d08fa70ef44b1f263fcf534d062a298c1bd5ee2eee8c3265806c4ce50b004f3a1fc1fa5b024aaac7f528c023c8181f67c6e1c357425dc4d573bd46b93a542afa3a19bdb140a2ce666e1a01f5c4d2dcd681fa9f5839b797813c394738d5ee4971386c12c7c117d17c7bec324b760aa30cda9ab2aa850284ba6fa97946f710f02449d1883c6", + "3317d2f452105dd3f4a96f9257af8285a80be58066b50f6f54bd633749b49f6ab9d57d45652d2ae852a2f6940cd5ec3159dd7f333358b12f502325df38843508faf7e246352d201280babd90b14fbf7722641c3601d0e458474439973c611bb5502fd0eb3078f87124ca7e1a016fcb6cfeff65f6a565985aca7122cfa8c5a11da0cb47797c5132333179", + "f2c5c955d0224e784a46b9125f8fef8a5e1271e145eb08bbbd07ca8e1cfc848cef14fa3b36221ac62006403dbb7f7d77958ccc54a8566c837858b809f3e310ace8ca682515bc655d2a397cab238a663b464d511f02dc5d033dad4cb5e0e519e94a54b62a3896e460ec70e5716b5921bf8396aa86a60123e6287e34570bb01bdc602e113670bf498af2ff10", + "180e275205691a83630cf4b0c7b80e6df8fad6ef1c23ba8013d2f09aef7abade1827f23af230de90676240b4b3b0673f8afdea0327330055041741f65560d90348de696d34ca80dfe8afae582fe4879d4594b80e9408fb53e800e01ca58552b905c365e7f1416e51c080f517d6bbd30e64ae1535d59decdc76c6624d737868f49f2f719da39ba1344d59eab9", + "c517a84e4631a7f65ace170d1e5c2fdb259841535d88da323e68c0883e6af7b041cfe05908815a5a9d1b14fa712c2c16fadcf1ca54d3aa954d411240df331b2aebdfb65aced84d0b8aace56ec0aa7c13ec7d75ca883b6bcf6db74c9e98463c484a8262684f29910373430651f90ecffe18b072170e61ee58de20e2a6ff67b3ab00fccbb80af943f20b56b98107", + "d1a56a5ee990e02b84b5862fde62f69ec07567be2d7ccb769a461c4989d11fdda6c945d942fb8b2da795ed97e43a5b7dbdde7f8fd2ff7154544336d5c50fb7380341e660d4898c7fbc39b2b782f28defac6873523c7c1de8e52c65e4395c686ba483c35a220b0416d46357a063fa4c33fa9c52d5c207a1304ae141c791e62ba6a7374ed922b8dd94079b72b69302", + "4720b88d6bfb1ab43958e26827730d852d9ec30173ebd0fe0d273edcece2e788558984cd9306fe5978086a5cb6d37975755d2a3daeb16f99a8a11544b8247a8b7ed5587afc5bea1daf85dcea5703c5905cf56ae7cc76408ccabb8fcc25cacc5ff456db3f62fa559c45b9c71505eb5073df1f10fc4c9060843f0cd68bbb4e8edfb48d0fd81d9c21e53b28a2aae4f7ba", + "f4639b511db9e092823d47d2947efacbaae0e5b912dec3b284d2350b9262f3a51796a0cd9f8bc5a65879d6578ec24a060e293100c2e12ad82d5b2a0e9d22965858030e7cdf2ab3562bfa8ac084c6e8237aa22f54b94c4e92d69f22169ced6c85a293f5e16bfc326153bf629cdd6393675c6627cd949cd367eef02e0f54779f4d5210197698e4754a5fe490a3a7521c1c", + "3d9e7a860a718565e3670c29079ce80e381969fea91017cfd5952e0d8a4a79bb08e2cd1e26161f30ee03a24891d1bfa8c212861b51618d07429fb48000ff87ef09c6fca526567777e9c076d58a642d5c521b1caa5fb0fb3a4b8982dc14a444732b72b239b8f01fc8ba8ee86b3013b5d3e98a92b2aeaecd4879fca5d5e9e0bd880dbfffa6f96f94f3998812aac6a714f331", + "4d9bf551d7fd531e7482e2ec875c0651b0bcc6caa738f7497befd11e67ae0e036c9d7ae4301cc3c7906f0d0e1ed4738753f414f9b3cd9b8a71176e325c4c74ce020680ecbfb146889597f5b40487e93f974cd866817fb9fb24c7c7c16177e6e120bfe349e83aa82ba40e59e917565788658a2b254f25cf99bc65070b3794cea2259eb10e42bb54852cba3110baa773dcd70c", + "b91f65ab5bc059bfa5b43b6ebae243b1c46826f3da061338b5af02b2da76bb5ebad2b426de3c3134a633499c7c36a120369727cb48a0c6cbab0acecdda137057159aa117a5d687c4286868f561a272e0c18966b2fec3e55d75abea818ce2d339e26adc005c2658493fe06271ad0cc33fcb25065e6a2a286af45a518aee5e2532f81ec9256f93ff2d0d41c9b9a2efdb1a2af899", + "736f6e387acb9acbee026a6080f8a9eb8dbb5d7c54ac7053ce75dd184b2cb7b942e22a3497419ddb3a04cf9e4eb9340a1a6f9474c06ee1dcfc8513979fee1fc4768087617fd424f4d65f54782c787a1d2de6efc81534343e855f20b3f3589027a5436201eee747d45b9b8375e4294d72ab6a52e04dfbb2914db92ee58f134b026527ed52d4f794459e02a43a17b0d51ea69bd7f3", + "9242d3eb31d26d923b99d66954cfade94f25a18912e6356810b63b971ae74bb53bc58b3c01424208ea1e0b1499936daea27e63d904f9ed65fdf69de40780a3027b2e89d94bdf214f585472613ce328f628f4f0d56217dfb53db5f7a07f54c8d71db16e27de7cdb8d23988837b49b65c12f1771d979e8b192c9f4a16b8d9fba917bcf74ce5a82aac2075608ba6c2d485fa59864b9de", + "5da68704f4b592d41f08aca08f62d85e2e2466e5f3be010315d11d113db674c4b98764a509a2f5aacc7ae72c9deff2bcc42810b47f64d429b35745b9efff0b18c58653461e968aaa3c2c7fc455bc5771a8f10cd184be831040df767201ab8d32cb9a58c89afbebecb524502c9b940c1b838f8361bbcde90d272715017f67609ea39b20fac985332d82daaa023999e3f8bfa5f3758bb8", + "71ea2af9c8ac2e5ae44a176662882e01027ca3cdb41ec2c6785606a07d7231cd4a2bded7155c2feef3d44d8fd42afa73265cef826f6e03aa761c5c51d5b1f129ddc27503ff50d9c2d748322df4b13dd5cdc7d46381528ab22b79b0049011e4d2e57fe2735e0d58d8d56e92c75dbeac8c76c4239d7f3f24fb56697593b3e4afa6671d5bbc96c079a1c154fe20212ade67b05d49ceaa7a84", + "1d133170582fa4bff59a21953ebbc01bc202d43cd79c083d1f5c02fa15a43a0f519e36acb710bdabac880f04bc003800641c2487930de9c03c0e0deb347fa815efca0a38c6c5de694db698743bc955581f6a945deec4ae988ef7cdf40498b77796ddea3fae0ea844891ab751c7ee20917c5a4af53cd4ebd82170078f41ada2795e6eea17593fa90cbf5290a1095e299fc7f507f360f187cd", + "5ec4ac45d48fc15c72471d795066bdf8e99a483d5fdd599511b9cdc408de7c0616491b73924d0266da34a495331a935c4b8884f57d7ad8cce4cbe586875aa52482215ed39d7626cce55d50349c7767981c8bd6890f132a196184247343566fc972b86fe3c5369d6a6519e9f07942f0522b77ad01c751dcf7defe31e471a0ec00963765dd8518144a3b8c3c978ad108056516a25dbe3092e73c", + "0d5e74b78290c689f2b3cfea45fc9b6a84c822639cd438a7f05c07c374adced42cdc12d2a9233a4ffe80307efc1ac13cb04300e165f8d90dd01c0ea955e7657332c6e86ad6b43e78ba4c13c675aed83192d8427866fb6484e6a3071b2369a46fba9005f31232da7ffec7952f831aaaddf63e225263531c2cf387f8cc14fa856c8795137142c3a52ffa69b8e30ebc88ce3bbc227597bcc8dddd89", + "a0fe36f983259921dc2fa7d89002b3066241d63bfc2448caf7e10522a35562be0bfedc3dce49cfce2e614a04d4c64cfc0ab898873a7fc26928dc1927c009d12f6f9b7a278205d3d0057604f4ac746f8b9287c3bc6b929832bf253b6586192ac43fdd29ba585dbd9059aab9c6ff6000a7867c67fec1457b733f6b620881166b8fed92bc8d84f0426002e7be7fcd6ee0abf3755e2babfe5636ca0b37", + "1d29b6d8eca793bb801becf90b7d7de215b17618ec32340da4bac707cdbb58b951d5036ec02e105d83b5960e2a72002d19b7fa8e1128cc7c5049ed1f76b82a59eac6ed09e56eb73d9ade38a6739f0e07155afa6ec0d9f5cf13c4b30f5f9a465b162a9c3ba04b5a0b3363c2a63f13f2a3b57c590ec6aa7f64f4dcf7f1582d0ca157eb3b3e53b20e306b1f24e9bda87397d413f01b453ceffeca1fb1e7", + "6a2860c110cd0fc5a19bcaafcd30762ee10242d34739638e716bd89fd537ea4dc630e6f85d1bd88a25ad3892ca554c232c9830bd56980c9f08d378d28f7fa6fa7df4fcbf6ad98b1adfff3ec1f63310e50f920c99a5200b8e64c2c2ca249399a149942261f737d5d72da949e914c024d57c4b639cb89990fed2b38a37e5bcd24d17ca12dfcd36ce04691fd03c32f6ed5de2a2191ed7c826375ba81f78d0", + "7132aa291ddc9210c60dbe7eb3c19f9053f2dd74742cf57fdc5df98312adbf4710a73245de4a0c3b24e21ab8b466a77ae29d15500d5142555ef3088cbccbe685ed9119a10755148f0b9f0dbcf02b2b9bcadc8517c88346ea4e78285e9cbab122f824cc18faf53b742a87c008bb6aa47eed8e1c8709b8c2b9adb4cc4f07fb423e5830a8e503ab4f7945a2a02ab0a019b65d4fd71dc364d07bdc6e637990e3", + "3e664da330f2c6007bff0d5101d88288aaacd3c07913c09e871cce16e55a39fde1ce4db6b8379977c46cce08983ca686778afe0a77a41baf447854b9aa286c398c2b83c95a127b053101b6799c1638e5efd67273b2618df6ec0b96d8d040e8c1ee01a99b9b5c8fe63fea2f749e6c90d31f6fae4e1469ac09884c4fe1a8539acb313f42c941224a0e79c059e18affc2bcb6724975c436f7bf949ebdd8aef51c", + "7a6ea63a271eb49470f5ce77519ed61ae9b2f1be07a96855726bc3df1d0723af3a703fdfc2e739c9d31d25814daf661a23558b50982e66ee37ad880f5c8f11c8130fac8a5d0250583700d5a324894fae6d61993f6bf9327214f8674649f355b23fd634940b2c467973a839e659169c773119919f5b81ee171edb2e5f6940d7551f9e5a70625d9ea88711ad0ed8ab2da720ad358bef954456cb2d5636425717c2", + "c5106bbda114168c449172e49590c7eeb827fa4e1a2a7a87a3c1f721a9047d0c0a50fbf244731be1b7eb1a2ef30f5ae846a9f38f0df44f32af61b68dbdcd0226e741dfb6ef81a2503691af5e4b3171f48c59ba4ef91eba344b5b697f261df7bbbb734ca6e6daebaa4a179feb17002823281b8534d55a6531c59305f6e3fd3fa63b747bcf0deb654c392a02fe687a269effb1238f38bcaea6b208b221c45fe7fbe7", + "597716a5ebeebc4bf524c15518816f0b5dcda39cc833c3d66b6368ce39f3fd02ceba8d12072bfe6137c68d3acd50c849873150928b320b4fbc31c1456679ea1d0acaeeabf666d1f1bad3e6b9312c5cbdecf9b799d3e30b0316bed5f41245107b693366accc8b2bcef2a6be54209ffabc0bb6f93377abdcd57d1b25a89e046f16d8fd00f99d1c0cd247aafa72234386ae484510c084ee609f08aad32a005a0a5710cb", + "0771ffe789f4135704b6970b617bae41666bc9a6939d47bd04282e140d5a861c44cf05e0aa57190f5b02e298f1431265a365d29e3127d6fccd86ec0df600e26bcdda2d8f487d2e4b38fbb20f1667591f9b5730930788f2691b9ee1564829d1ada15fffc53e785e0c5e5dd11705a5a71e390ca66f4a592785be188fefe89b4bd085b2024b22a210cb7f4a71c2ad215f082ec63746c7367c22aedb5601f513d9f1ffc1f3", + "be6556c94313739c115895a7bad2b620c0708e24f0390daa55521c31d2c6782acf41156271238885c367a57c72b4fe999c160e804ad58d8e565edbce14a2dd90e443eb80626b3eab9d7ab75d6f8a062d7ca89b7af8eb292c98eaf87ad1dfd0db103d1bb6188bd7e7a63502153cf3ce23d43b60c5782602bac8ad92fb2324f5a79453898c5de18415639ecc5c7974d3077f76fc1df5b956723bb19a624d7ea3ec13ba3d86", + "4bc33729f14cd2f1dc2ff459abee8f6860dda1062845e4adab78b53c835d106bdfa35dd9e77219eaef403d4e80488ca6bd1c93dd76ef9d543fbb7c8904dccc5f71509a6214f73d0f4e467c3e038ea639b29e7fc442ee29f57117740576188ada15a739827c647a46b0271817ab235c023c30c90f2115e5c90cd8501e7b286962fc66ffc3fe7e8978746168314908a41998bd83a1eeffda9d714b864f4d490fdeb9c7a6edfa", + "ab12faea205b3d3a803cf6cb32b9698c32301a1e7f7c6c23a20174c95e98b7c3cfe93fffb3c970face8f5751312a261741141b948d777b8a2ea286fe69fc8ac84d34116a4674bb09a1a0b6af90a748e511749de4697908f4acb22be08e96ebc58ab1690acf73914286c198a2b57f1dd70ea8a52325d3045b8bdfe9a09792521526b7564a2a5fcd01e291f1f8894017ce7d3e8a5dba15332fb410fcfc8d62195a48a9e7c86fc4", + "7d421e59a567af70594757a49809a9c22e07fe14061090b9a041875bb77933deae36c823a9b47044fa0599187c75426b6b5ed94982ab1af7882d9e952eca399ee80a8903c4bc8ebe7a0fb035b6b26a2a013536e57fa9c94b16f8c2753c9dd79fb568f638966b06da81ce87cd77ac0793b7a36c45b8687c995bf4414d28289dbee977e77bf05d931b4feaa359a397ca41be529910077c8d498e0e8fb06e8e660cc6ebf07b77a02f", + "0c18ab727725d62fd3a2714b7185c09faca130438eff1675b38beca7f93a6962d7b98cb300ea33067a2035cdd694348784aa2eda2f16c731eca119a050d3b3ce7d5c0fd6c234354a1da98c0642451922f670984d035f8c6f35031d6188bbeb31a95e99e21b26f6eb5e2af3c7f8eea426357b3b5f83e0029f4c4732bca366c9aa625748297f039327c276cd8d9c9bf692a47af098aa50ca97b99961bef8bc2a7a802e0b8cfdb84319", + "92d5909d18a8b2b9971cd1627b461e98a74ba377186a6a9df5bd133635250b300abccb2254cacb775df6d99f7c7d0952653c28e6909b9f9a45adce691f7adc1afffcd9b06e49f775364cc2c62825b9c1a86089080e26b57e732aac98d80d009bfe50df01b95205aa07ed8ec5c873da3b92d00d53af825aa64b3c634c5ece40bff152c331222d3453fd92e0ca17cef19ecb96a6eed4961b627aca48b12fecd091754f770d52ba861546", + "802f22e4a388e874927fef24c797408254e03910bab5bf372320207f8067f2b1ea543917d4a27df89f5bf936ba12e04302bde23119533d0976beca9e20cc16b4dbf17a2ddc44b66aba76c61ad59d5e90de02a88327ead0a8b75463a1a68e307a6e2e53ecc1986274b9ee80bc9f3140671d5285bc5fb57b281042a8978a1175900c6073fd7bd740122956602c1aa773dd2896674d0a6beab24454b107f7c847acb31a0d332b4dfc5e3f2f", + "3844fe65db11c92fb90bf15e2e0cd216b5b5be91604baf3b84a0ca480e41ecfaca3709b32f8c6e8761406a635b88eec91e075c48799a16ca08f295d9766d74475c47f3f2a274eae8a6ee1d191a7f37ee413a4bf42cad52acd5564a651715ae42ac2cddd52f819c692ecdef52ecb763270322cdca7bd5aef71428fa73e844568b96b43c89bf1ed42a0abf209ffad0eeec286c6f141e8af073ba4adfbbdeda253752ae36c9957dfc905b4c49", + "329377f7bf3c8d74991a7d61b0cf39baff5d485d79751b0d5ad017d23bec570fb19810105bab79ab5acb102ab972165224d4ec888ec7de5148077fa9c1bb6820e0d91ae4e2591a21fec2f820606ce4bafc1e377f8dc3a5bd1a9e2772a57abccd0b757164d768872c91d02789545ab5b203f688d71dd08522a3fd2f5bcd7df507aebf1ca27ddff0a82afb7aa9c180008f49d1325adf97d047e77238fc75f56356de4e87d8c961575c9f6362c9", + "f7f269929b0d71ea8eef7120e55ccba691c582dd534692abef35c0fe9dec7dae973cd9702e5ad420d278fe0e653fdcb22fdcb63148109ec7e94f2d0750b28157dd1764376ae10fdb0a4aef3b304bd82793e0595f941226a2d72abbc929f53134dc495b0d65ced409914f94c2523f3dfbbdeeac84ae247ab5d1b9ea33dce1a808885a55be1f3683b46f4be73d9b62eec2585f690056858dfc427aabf591cd276724885bcd4c00b93bb51fb7484d", + "ac022309aa2c4d7fb628255b8b7fb4c3e3ae64b1cb65e0de711a6def1653d95d8088871cb8905fe8ae76423604988a8f77589f3f776dc1e4b30dbe9dd262b2187db02518a132d219bd1a06ebac13132b5164b6c420b37dd2ccee7d69b3b7fa12e54f0a53b853d490a68379ea1fa2d79762830ffb71bf86aab506b51f85c4b6a41b69325c7d0c7aa85b93b7144489d213e8f33dbb879fce22849865337b620b155cb2d2d36a68832889e30194d36d", + "d009c2b78a8f02e5e5dbb586ef71fc324b375092e15913ca1a5bfd22d516baadb96867bee3562e77c4a4852344a1a76c30728be5e22400b4cc41711f66754c246a520498d8c24f0205b9c873748dbeb67fe1ad099ad04cf89f4b517f0aa481136d9f6de2d727df01c6aa4099da59d4382b51e25fd47c33d9842c32b62331e50794bfe8b61b3ba9de1b8b704779c6d65edff3af00f121ab4a7ea384edabe47c6d0098a48991f387ca4444135ec59d46", + "c00bab36cce69899817d1425016d222d7303197ed3e3fdcac744705e7f178a1ac745968900f69299163e19b3161f3e0a4cc55aa2e4e71e0ee6ac427d1f4d14e063f68d303ddfbb18118335cfa7a6a90d99c38319ee76f7a884846a9e0b68030bf28e78bfbd56359b9368842814da42b04cb0e307d5d846dc22f049147bae31b9a956d17676a8cc348dafa3cabc2007a30e730e3894dddf9999fb8819086311f0703e141613ed6dcd7af8510e2dc435b0", + "c9789152a9fc29698d49ed95f09bd11b75f18a8c5615a73dbe54ae5e550027fd0ae6a8b60667040c1b12de3d1ee3f6bf061c78c951a3210effc912e19f482dd4de152063c588c44903bc11761706fd935afa040df085b08144d83d0dde32b46ab52f4fae98ac116c7ff11d7f553450c2e37b9c5f0b1dd9e0b8640a24cba6f2a5246c41f197f46e3dc8a29131c79bef3351c6e277a0a34442274d546ccd058891277473d668420f121750d19cd684267405", + "06a15a0731ce52557e368bcbaa11ef3399299e36fb9f2eda6e5726907c1d29c5c6fc581405ba48c7e2e522206a8f128d7c1c939d1132a00bd7d6366aa82724e968964eb2e373563f607dfa649590dcf5589114df69da5547fef8d1604cc4c6de1ed5783c8746918a4dd31168d6bc8784cd0c769206bd803d6ca8557b66748770402b075ef44b38157d4c0da7c6281725a2065d087b1f7b23455fa673bdeeba45b983311c44eabe9ef4b7bde3420ae9881863", + "d08aacef2d7a41aec09473bd8a44f628e15addb7b9e5b77a1e09c8ab4942f379a0bfcb324d580b774666f18ae78dd36710824ff12393f059068fe4b559c53662c2b0e6c69e23785c8f32554e837ec1714bee902e60737b639dd933af4f68cb9d7de77e1f3b28e5b122891afce62b79acd5b1ab4ba411662cc77d806449e69c5a45a143b742d98ac84a0826d68433b9b700ace6cd472ba2d58a90847f42ce9c43f38ffc017db4bf40450b2eee1f4594dc740c0f", + "6a6058b0a498b7ea76a93c646eb9b8629f0cba4a0c726420c5f67ba9b0412cade356abdf0a4fb94384bad32ce0d5dd9e23dcaae1d6f28ff8683616b30f1392890c67b3a2c04b360893b801f127e527e4da82e239f4c878da13f4a4f1c76db07190e77ec123995168102fb274434a2d1e12913b9b5cbab4aacaad2bd89d88b3ca2b8e60dacf7c22c9379097ff60880f552e320ca3b571994f52534470feee2b39e0dadb5cd88257a3e459a4cc6f12f17b8d54e1bb", + "adeced01fc5671531cbb45679f5ddd42b3a95151677b6125aaf6f5e8f82fbabaa5ecf7c3552c2458587224f0042870f178f5fca5465250e75d71352e652eeed23cdb7f915f5ebb44099b6db116ca1be45530ac8ed32b7f161d60ed4397ad3d7d649ae6bf75ca5bec891d8e595605be9764f3a03965e1fe0eaffbf212e3df4f0fa35e08ff9d0091e6d4ac4748edfe43b611085a6ffec163014655fdd839fd9e81b63b1fa8cae4ec335ec343289758e389a79ceedfae", + "d014592f3a83ba40af366f137c674724916c3cdd3f6cf9d4c5c7c8d6d51ebf26e315e2c12b3546be56fb52382904046ecbd2f5b883aa4ff473de6f0c26ab862c3fa34bf3d880cc1911ce39a4088c6617c179dc5faf68a2c488bbde12d67b50f73abcfab0e3b062e68c95363e11f5f1de8ec36ed01ea21442518089045df67d346135283ad5b3fff80cf57f20876849f6db9fa139728358415a90610f69ec720fc92d8234e3e122551e9df2c644c4a2c4e3734d07de8e", + "c0d0c37838873ba8757d6e41b409605043bc1635edcd731219587676d94217e9f0ab44b71de25000661ce7303b7015f45e6eaa7b7ebef92b8f4a34c902c908d2172185505fa33aca5a41be83079316cdfdd430fc2c45f505f85d867e6d516f7e1bf19c001d9f43018968aab65ec031b3801399231c83ec9e622dab5629922a6b424cab938c135ff7310501c2c02971bfd2f577e25904d1a618baf0859f77f4e8b1d0cde9544e95ec52ff710c0672fdb3d891feeea2b017", + "7022e7f00902219ba97baa0e940e8ac7727f58955aa068c29680fac4a16bcd812c03eeb5adbcfe867a7f7c6b5d89f4641adb9173b76a1a8438866f9b4f640ce2aedf5f1080c890bcf515b4be4e3e512352f1e5323c62ec46cb73f3d71be8235fee55a154763f7c3f9aeb61ffd28f4cd93d3310f608e2133586bf1ab3f102de96f64c68a4668de8acb2a76a7ce0cddddc8fa3df5e9d230823da16ed9ebb402d36e38e6e018795e5a71517ecab5f9ca472b9ced8ff69d2d195", + "acaf4baf3681ab865ab9abfae41697141ead9d5e98523c2e0e1eeb6373dd15405242a3393611e19b693cabaa4e45ac866cc66663a6e898dc73095a4132d43fb78ff7166724f06562fc6c546c78f2d5087467fcfb780478ec871ac38d9516c2f62bdb66c00218747e959b24f1f1795fafe39ee4109a1f84e3f82e96436a3f8e2c74ef1a665b0daaa459c7a80757b52c905e2fb4e30c4a3f882e87bce35d70e2925a1671205c28c89886a49e045e31434abaab4a7aed077ff22c", + "84cb6ec8a2da4f6c3b15edf77f9af9e44e13d67acc17b24bd4c7a33980f37050c0301ba3aa15ad92efe842cd3ebd3636cf945bb1f199fe0682037b9dacf86f162dadabfa625239c37f8b8db9901df0e618ff56fa62a57499f7ba83baebc085eaf3dda850835520344a67e09419368d81012168e5de5ea45158397af9a5c6a1657b26f319b66f816cd2c28996547d697e8df2bb163ccb9dda4d6691dffd102a13667ab9cde60ffbfb872187d9c425a7f67c1d9fffff9276ed0aeb", + "6a52c9bbbba454c14540b2be58230d78ecbeb391646a0c6fcce2f789086a78364b81ae85d5396d7cfa8b46bda41e3083ec5cf7b4c47dc601c8a697df52f557defca248506dbebab25657f5a561d09625b7f4b2f0119a12beeac087efc9d350a735c35d2431c1da7dda99befb17f41a3dc4da0f00bb95366be128538ce27763d81f832fe3c1d4efc07b5b08ad8dc9e65fb5e48546664e18cb2d3bb3fe1f56fa7aae718c5e3bbdeaf70e15023f6a25b72a2d177fcfd04211d40664fe", + "c3c4d3b31f1f5f9538923df3478c84fffaef411520a542da9a220ee4132eabb9d718b5076fb2f985485e8ba058330aed27ddfd3afa3db34aa60301088caec3d0053828c0c2bc87e2e61db5ea5a29f62fdad9c8b5fc5063ec4ee865e5b2e35fac0c7a835d5f57a1b1079833c25fc38fcb14311c54f8a3bd251bca19342d69e5785f9c2e43cf189d421c76c8e8db925d70fa0fae5ee3a28c4047c23a2b8a167ce53f35ced33bec822b88b06f41558c47d4fed1bfa3e21eb060df4d8ba1", + "8d55e92136992ba23856c1aea109766fc44772477efc932b3194af2265e433ed77d63b44d2a1cff2e8680eff120a430fe012f0f09c6201d546e13ad46fc4ce910eab27bb1569879abed2d9c37fae9f1267c2216ec5debcb20d4de58461a621e6ce8946899de81c0add44d35e27b7982a97f2a5e6314901caebe41dbba35f48bc9244ca6dca2bdde7306435892f287036df088633a070c2e385815ab3e2bfc1a47c05a5b9fe0e80dd6e38e4713a70c8f82bd32475eea8400c7bc67f59cf", + "5016284e20362610fa05ca9d789cad25f6d43263787e7e085476764ce4a8908ce99b262b375e9d106170b1bec1f473d5e777e0c1896533040e39c8c1465e07907ef5860e14e4d8310013e35f12090e0bfc687474b1f15f3dd2033a0edac5246102da4deec7e188c3517d84d9c2a0a4497a4c5f82a30f1ba009e45ee6eb3ab4368c720ea6feee428ffd2c4cc52debb8d634a64176572c72368f94a66689f23f8a01218f532117af5a8060d140e7ca435a92882fcb5630ebe14a4805f1dc83", + "05456ec59b8d41bbd736727976b96b38c43827f9e16169be673ff37870c2ecd5f0d1ea1a136be4cc7b047a02a4421d484fd2a12ece418e42ee391a13a0b1df5a0162b29ab70d3fe3e04ba6ab26b37d62b7cf05a5e2f033611bf970b8e1f30e198e483e740fa9618c1e8677e07b61296b94a9787a68fba622d7653b5568f4a8628025939b0f74389ea8fced6098c065bf2a869fd8e07d705eadb53006be2abb716a3114ceb0236d7e916f037cb954cf977720855d12be76d900ca124a2a66bb", + "eb6f60b83fcee77060ff346aaf6ec34d82a8af469947d3b5074cde8eb26566eb1fa039bcc707738df1e95869bd827c246e88436f0614d9834ead5392ef376105c4a9f370071cdeaaff6ca0f18b74c3a48d19a717253c49bd9009ccbfdd5728a08b7d112a2ed8dbafbbb46d7a75dc9a05e09bfde1a0a92d74a51887f9d123d7896e9f9d0057b660ed7d55454c069d3c5260411db4cdc67e7b74f680d7ac4b9dcc2f8baf72e15e6b3cafebcdf449a6436ed2c398b675f79c644747c57553bf7ea2", + "187a88e88514f6c4157c1ba40b442baae1ae563a6c989277443b12a219aa484cb9fa8adbb9a29d429f50155321b15664926317477079c7060dfdaa84c1d74bba78892c34e6f21ad35208d2ae622012401696bff5cd57b6485944b3db7b9071fa5f57fbfb1085d91bb9cff5808d662cdc6c8157249478262c44b7fbc397ed42a4977b202e817717bfccc9f0467294062313f7705251ed09573f16d23429361fada259dfb300369c4198f07341b38e84d02cdb74af5de6aab1fc2026208ea7c418c0", + "be31bc96606d0fab007e5caeded2f1c9f747c759777e9b6eef962bed49e45a1d4fc993e279d024915e600865ecb087b960584be18c41114d3c43f92169b9e0e1f85a0ebcd4e196376ccdc920e66103cd3b1c58407d0aafd0e003c4e341a1daddb9f4faba974362a32f35db83384b05ae8e3322d728893861afd8b1c940de5a17f691e763ce4969b6d94f67fb4a0235d100225bd8602f291388f0ca4a568748ad0d6040f1262eac2aede6cd27419bb78a394c1ffad72c262be8c3f9d9619d633e51d0", + "4d83d85ca838b4518588f2a90228a4dd18f14dd5b4c012d26298a97d848abbd825d221d02cceb6e8c701b4ad00e1dee4889b5c533e4bb60f1f41a4a61ee5478be2c1b1016c30345afd7a5253668260515e70751f22c8b4022d7fe4877d7bbce90b46531507dd3e89549e7fd58ea28f4cb23d33662bd003c1345ba94cc4b06867f778957901a8c441bee0f3b12e16463a51f7e50690356971dd73a686a49fda1eae46c9d54fba262811d698025d0ee053f1c58591c3bb3cbde69de0b31549ef5b69cf10", + "cdeb07d36dc5f9a1cd717a9e9cca37a2ce93caa298eee63571f7d6c5fde2a11c666cf53cf2dcb41ca2ea2319e7230ca68e38c647905928713a13982bf47fe33d7095ebd50b2df976208920a43eb2e29b942f32467403c45cea18bf44e0f6aeb155b48a8e5c471fec972a9d62f7ae093d2758f0aaec7ca50cb4725bfa219f1a3a46ad6bde7361f445f86b94d66b8ece080e56c510250693a5d0ea0ae87b4421860b853bcf0381eae4f1bf7c5c0472a93ad18407bc88475ab8560d344a921d3e86a02da397", + "a598fad52852c5d51ae3b10528fc1f722e21d44fbd42ae5acdf20e85a28532e646a223d27fd907bfd38eb8bb75175636892f8242877aab89e8c0824d368f3339ce7a82aa4e5af6db1f3b588a4d667a00f67bee37cfd2724dde06d2909fb9e58d892f4cfd2c4ca85acdf8256f5458b030a6bda151154ff2e6d7a8da90b54a2884c8a99fab5a4ac211ff23dc0975f4f592fd1b6b9dc7783bdcd2d4ca4e68d2902f2013e122cb62e2bff6b0a98ec55ba25837e21f1cfe67739b568d43e6413dab2bd1dc471e5a", + "17b68c74c9fe4926e8102070916a4e381b9fe25f5973c9bd4b04ce25749fc18931f37a65a356d3f5e5a1ef125d546f4f0ea797c15fb2efea6fbfcc5739c564693d47adeb12dcb3d98a2830719b13247792cb2491dca159a28138c6cff925aca42f4fdb02e73fbd508ec49b25c60703a7595a3e8f44b155b371d525e48e7e5dc84ac7b17c52bf5e526a67e7187234a2f19f57c548c70fc0b27183df73ffa53fa58b658034c896fa791ae9a7fd2620f5e46ce84c842a6e60e9324ae4db224ffc87d9617cb85ca2", + "b9e4267ea39e1de1fed0579f93bb351007c9f8fcdd811053fae33f09e2753d7428f04e1a9efcd45ea701a5d87a35b3afb2e6b65365dee6ead0bbb611b7797b212ac688653f542e604a39df277f12514ddfee3b4e27b98395c2cd97a203f1f1153c50327965770802ec2c9783edc428271762b275471e7ac65ac36523df28b0d7e6e6ccc7674268a132a63411fc82c0738dbb68af003b769a0bf9e6587b36476cb465350fee13f88ea355d47ffac7b0f964f4139db11b7642cb8d75fe1bc74d859b6d9e884f75ac", + "8ca704fe7208fe5f9c23110c0b3b4eee0ef632cae82bda68d8db2436ad409aa05cf159223586e1e6d8bdae9f316ea786809fbe7fe81ec61c61552d3a83cd6beaf652d1263862664df6aae321d0323440430f400f291c3efbe5d5c690b0cc6b0bf871b3933befb40bc870e2ee1ebb68025a2dcc11b68daadef6be29b5f21e440374301bde1e80dcfade4c9d681480e65ec494a6af48df232c3d51447b9d06be714949249c44c43cf73ed13ef0d533e770284e51369d94ae241a5fb2f163893071b2b4c118aeaf9eae", + "4fd8dd01012bb4df82bf42e0683f998e6f52dd9c5617bae33f867d6c0b69798cead8179346d70acc941abbbdd26e3229d5651361d2252c72ff22db2938d06ff6fc29a42fdf800ae967d06479bc7bbb8e71f40b1190a4b7189ffc9a7096cdb76d40aec424e1388e1eb7ef4ac3b34f3f089da8fda7d1927f5d775c0b2801d22dd1265c973158f640cec93edfed06dc80b20ef8c496b98289d54d46ccd205951cbb0f4e7daeb866b60bacb483411e4382b6f04d472843186bd0e31fbaa93e5c901ec028efafeb45fc551a", + "e9ee1b22b04b321a5fdd8301627011f583887d77560fb0f35552e207561f81e38ac58a0d0aeaf832d1ee72d913720d01f75574e9a321864fe95f4d0d8f0b8db97649a53e71e940aede5c40b4b9105daa42a6fb2811b61209247534cbaf830b07abe338d75d2f5f4eb1c3cf151e9edabe2c8d5f6fff08fac1495ef48160b100d30dcb0676700bcceb28723a29980ab0766a93abb8cb3d1963007db8458ed99b689d2a7c28c788743c80e8c1239b20982c81dadd0eed6740c65fbc4ef15c7b5569cb9fc997c6550a34b3b2", + "ec01e3a60964360f7f23ab0b22e021815765ad706f242265ebc19a2bb9e4eac94393952dcf61aae47682671a10f9165f0b20adf83a6706bfbdcf04c6faba6114653a35584267267873291c6fe7ff5f7695243143421509502c8875aafa9e9afe5be5ef2c851c7f35d69be5d3896000ccdbbfab5c238bb34d607cfe2d55d748880545b4aa7ca61137992925189025c62654b1f20d49c3ccd75aa73ce99cd7258dabedd6480a9f5185531fc0118beb68cc0a9cd182f6973287cf9252e12be5b619f15c25b65c71b7a316ebfd", + "db51a2f84704b78414093aa93708ec5e78573595c6e3a16c9e15744fa0f98ec78a1b3ed1e16f9717c01f6cab1bff0d56367ffc516c2e33261074935e0735ccf0d018744b4d28450f9a4db0dcf7ff504d3183aa967f76a507357948da9018fc38f150db53e2df6cea14466f03792f8bc11bdb5266dd6d508cde9e12ff04305c0295de29de19d491ad86e766774bb517e7e65befb1c5e2c267f013e235d8483e177214f89978b4cdc81aa7eff8b39f2825ad3a1b6ac1424e30edd49b067d770f16e74dd7a9c3af2ad74289a676", + "00e40f30ae3746edad0f5dd03d0e640933cf3d1694804c1e1ed6399ac36611d405196ee48f129344a8512feda16a354517871322bd5d9c6a1b592933eab531923efb393ffb23d9109cbe1075cebfa5fb917b40df028a621460ff6783c798792cb1d9635b5a6f84ec13918fa302924649b5c7fcb1f7007f0d2f06e9cfd7c27491e565a96c68a0c3644f92cd8f38857258c33801c5d537a83dfe583cba59d7eec7e394199c0a2660a62fabe3ed2099d57f315a6cd8de1a4ade29d977f15d65759cff433e5ac0c182aef3761163e1", + "3c5ea24d0d9b618294a263f062b2414a722be4eb10dfc346a6ec3b821d7396eba61cd6ef33618b04cd087a811f299d4606820227f16000d7c839062b96d3e3f59cd1a082448d13fc8f56b3fa7fb5f66d0350aa3b72dd7c165d590282f7da2e12cfe9e60e1796122bb8c2d40fdc2997af634b9c6b127a893dfb3467909378300db3da911be1d7b616bb8e0572433e65527e15d936500a2c60e9f9909dcf22ab5e4b6700f0238c205b4a813626fac3d945bab2637fb08203044a73d20c9a3fcf7c3fc4eb7807c3276dd5f73ce89597", + "9271aeeebfac46f4de85df78f1bfd36136aa8905e15835c9e1941176f71e3aa5b1b131843d40479735e23e182a2bd71f66f6149dccb7ed8c16469079dc8590bbf165374951785f4531f7e7361de62f936cfb23a2b5bdf186632e7042a0dd451fdc9b7208f923f3a5f250ae590ec348c63a16c3aacaf7379f53b5dd4152dcd40d23e683e2156e64c592ffc07e2cd6bbeebef4dd590b2f6b2bcbf08fcd111c079f5c4033adb6c17574f8756ecd87be27eff1d7c8e8d0324438d59ae171d5a17128fbcb5533d921bd044a2038a5046b33", + "4e3e533d5bcb15793d1b9d0468aaee801f32fdb486b11027183553a09ddbee8213924296f2815dc61577297459e834bf1c7a53f87d43782209e589b8295219ba7073a8fff18ad647fdb474fa39e1faa69911bf83438d5f64fe52f38ce6a991f25812c8f548de7bf2fdea7e9b4782beb4011d3567184c817521a2ba0ebad75b892f7f8e35d68b099827a1b08a84ec5e8125651d6f260295684d0ab1011a9209d2bdeb75128bf5364774d7df91e0746b7b08bda9185035f4f226e7d0a1946fcaa9c607a66b185d8546aac2800e85b74e67", + "b5d89fa2d94531093365d1259cc6fe8827fea48e6374c8b9a8c4d2209c280fa5c44958a1847222a692a59e6aa2696e6cdc8a543dd89b0ce03bc293b4e78d6ef48e1839694ccd5c65661143095c705b07e3ced84a0f5959114dd89deb956ab3fac8130eb4a878278205b801ae41a29e34146192308c4e759b374757b0c3b00319bce92a1b95a4d2ee179fd6714ff96155d26f693a5bc973f84ac8b3b91e3926276297532d98b46992a3f104c08100bf1671c43134bac280c617da711e90a0100137525375ebb12802a428885ae7fce6514a", + "40e3d8048fc10650cb8a7fc2e7113e26dec34f9ca2d5129cd10a8e8e44d113d61ee48c7d003e19fd307fc6debd70feb30243f298c510ccc4418355ce143066f067ad7c6de7288c3080e7ad46a23c8d34deb55a43e652fe90444ad3c57d3ec1e1c489d63ef915a24bc74a7925a0a7b1e1523f21ca8fee78df24e3d0a68d0013423db97c280799a0618229c0f2c167289a891e5c8d6661ab21285951c31710e3b5fe55f6347fe16d9b40507948a59252efeb616df83e5c098b07d0a7247cd371daff0e50491c582503fd89f79ba94d6af9ed76", + "1fa444de01dd3901e2b4684e3d7a799ffa02d85afd35fb30fe4c9d672837bee6dd8a3b8608b4bb5e589220ad5a854f46b46e41c6d57ad124a46beab4169ff69fee7e3838a6165e19dad8eb5d7bf53d4edd3cd2769daf219510a02fdd2afe0c0e1da3cd30fcd1aa88b68965586f07a25a1720fbd90a096ea30fc8e945e3637d7857c8a9c0ab4154ffb2000e57b5f9adfa4e4eaf8065bc3c2b2e75f495963325588785a6ce417dcddffd299873b15dcccca128d63cd4eeeadb64cda28099a9ad7c80d34844901f26b88b00b9aafeb2f90286d29d", + "fde0a0d9d813983bd1f55cf778a003a2023b34a555322ab280584537bc6bdd844d22a7d6066c18da83ec09f3d8d5a1aab4be0d5ce19b436052f6e259a4b49017a1f47f1fe2bf115d5bc8599fb216351c60dd6b1bedb2e6f4dcadf424b833501b6f099cbfad9e2290680fb69c25032b42a6274f7cb9b5c5950401354838a45f7cb77b95bf54718e2f3d3d9fb91eb2311903980277396398d9736d8e92fd838594ac8a537c6c529db5a8a4f89290e6ba6f20ac0e5ed6fef40901d0e0e8e3e502990811f9acaae555dd54eb1bcd96b513e2fe751bec", + "9f8e0caec87858599f5ab29bff86da78a841a918a023a111098687ecdf2747612d3f3809d9ca400b878bd4f92c43a1004f1c17c7f19a3cd1ce449bd2b23aff551623c37dd8c0be56bf3fd857b500c2b9f9ccea62481944090a3cf3b6ee81d9af8eeb60f65ef150f9fa4d3ed6ce4762d3d4f174ee8ccd460c25cafac0ea5ec8a6a4b2f9e8c0520cb7061155e532cb65f188b01e4b9086db951f504b060c296b326b3fc1c590498ecce594f828f4a10ea416675720ae505295d38a791bd0e93f428448a8f4c1fc0af53604a9e8255384d29ae5c334e2", + "33d1e683a4c97ee6bbaa5f9df1a88cb53b7f3c157b6045d70a56fda0ccbd3a1fa1f049cd564da072b53f415bf5fb843771c1d2551fd075d33377362b2f7c0645f9723123d11975991db8a2b518f02e2c7c30342a044754290bae2c77496d755e5981f12e6b0a0174280b958bf11ed628a9062775993ced04bf752ea8d165e3ac2177d7cd1b9371c44efa98f0b3e68602a839d384eec007979f46429dafb138cbc231ad928a9f65f7d66fac77416395e8f1debaaf76ec2e4e03e8674102cd26f614739f3ec9f949033df1fb97e87c2326d65aef94ed5f", + "180048f09d0b480887af7fd548a85abf605440c1ddde6afe4c30c30670233f7bf928f43b4681f59279ebbda5e8f8f2a1abefdee129e18ac60f9224e90b38b0aabd01308e0a27f41b6fb2ee07ee176ec9048c5fe33c3f7c791469c81f30e28170585b9f3e7e3c8c2e9d74370cb4518f13bf2dee048cbd98ffa32d85e43bcc64a626b40efb51ce712925fdd6fee006dc68b88004a81549d2121986dd1966084cd654a7c6686b3bae32afbd9625e09344e85cf9611ea08dfce835a2e5b3726e69ae8a76a97db60fcc539944ba4b1e8449e4d9802ae99fae86", + "13c0bc2f5eb887cd90eae426143764cf82b3545998c386007cca871890912217aa143ac4ed4ddb5a7495b704aa4de18419b8664b15bc26cfc6596a4d2ae408f98b47a566476d5802d594ba84c2f538def9d016661f6404bb2337a3932a24f6e30073a6c9c274b940c62c727242e24466084a3ea336365d71ea8fa6499c0ea8d59eea505f1126b99c795023c4963aa0d99323d0391e8701110edf551b2d3799e1063ca443f1add162156e445502ca1a052fe70c289838593b58839fc63de128a03e2bbf389e22ae0cf957fd03315ee407b096cc1cfd92dee6", + "6f1eb607d679efef065df08987a1174aab41bdac8aece7726dfa65805d6fff5b3d17a672d96b770dc32165f144f0f7324822a5c87563b7cd9e37a742ae83ef245d09006d91576f435a03476f509ea2936636232f66aa7f6cdf1ac187bbd1fcb8e20f8791866e60ed96c73374c12ac16795e999b891c64507d2dbd97e5fc29fac750ad27f2937cbcd29fdafccf27ab22453834d475f6186eaf975a36fad5c8bd61c21da554e1ded46c4c39765dcf5c8f5ccfb49b6a4dc562c919d0c7d8940ec536ab2448ec3c9a9c8b0e8fd4870cad9de2577c7b0c38563f355", + "dcdd993c94d3acbc555f464871a32c5da6f13b3d5bbc3e34429705e8ad2e76393fdd96a69a94acb652f5dc3c120d41187e9aa919669f727c4868013b0cb6acc165c1b7706c52248e15c3bf81eb6c147619467945c7c48fa14a73e7c3d5bec91706c567145342a026c9d97eff97ec672c5debb9df1a998083b0b0081d65c517b3e5634c95e347e781aa30ca1c8af815e2e494d844e847fdcb41622894a518dc36571123a40bfdbe8c4f4cff44d83c61dd9dcd24c464c53b395edb31efee9f3aa080e87cdc3d22d613ae84a53c9249c32c96f9a3bc4629bb126a70", + "49971f9823e63c3a72574d977953329e813b22a8387cd13f56d8ea77a5d1a8a20012632d1d8732bbcb9f756b9675aab5db927beacab7ca263e5718b8dfa7b2eed9a91bf5ed163b16139d45f7b8cc7e3f7bdda6202106f67dfb23b7c315ee3e17a09d466b1e6b13e7c7428184a979f5358667b4fa8bd40bcc8ea46058db44587a85377ac46bf155136c09ac58cb6c27f28e17028c91e7e8f74d5b500e56293b316974f02b9d9ea205d9b6ac4cfb74eb8eb0c944577fd2f41316368307beab3e327bf7dbaa0a4428836ec4e895dea635234abeaf113ceeadac33c7a3", + "c57a9cc958cee983599b04fe694f15fb470fcbc53e4bfcc00a27351b12d5d2434444253ad4184e87b81b738922ffd7ff1dc1e54f39c5518b49fb8fe50d63e3935f99e4bd125e8dc0ba8a17fd62de709339a43fabe15cf86d96a54010112170c340cfac4132182eed7301402bc7c8276089dec38488af145cb6222525894658f03501204b7a66aba0be1b557b28a2f652d66f7313ed825ecc4d8596c1be7420d4425b86a1a90a5b7f30d0f24e0d1aae0eb619ca457a71699e44be612a4011c597ee80b94d5507e429d7fc6af22579cd6ad642723b05ef169fade526fb", + "0568a672cd1ecbaa947045b712e2ac27995392fbef8f9488f79803cbee561c212287f080eca95adb5ba42739d78e3ba667f06045d87850d3a0499358649caa257ad29f1a9c511e7054db20554d15cbb55ff854afa45cae475c729cea72ede953522031865bc02b95589ed4d9841c552a8cc94904a93ed09ed77222f6c178195056be59bc4e96a815adf534e6b466fb47e262ff79c803c157a21b6e2269c2e0abeb494113cd868d8466e82d4b2f6a28b73645853d96bc9242515d803e33294848d3fe42fdff68da53c03491636beede47ff1399dd3d54a5e914d55d7adf", + "3f19f61a4cd085796731ac9f85a75a8bce77031932c31762d87d8b8d07b8bd19ff78d6b7d1bd1e87f3a4f41aad03b6c4d17a6cbc86be55f7c8b88ada047bb04f8d49f1c34bcf81cc0f3389ad01a758fc7eeb0072aa9ad1481992bfdde82e438e75590a4423832dfbe3756e2229ea873bc3606e6d72174cb2163bf40b5d49c81009dab85ecc03e311351bbf96e32c030a2b276a7698cb25bc2c967acb3213161a1fdde7d912cd6a804490f8056c47da1333f6e35c41e749c2c23919cb9af5eec5652e6e072b034fb1682e9aaa194a9c0bd456ea0b008d14dbce37967a7a8e", + "705f98f632d99d3651793825c38dc4deda56c59eac539da6a0159c83131cf8ab6f2ee0c3b74111fde351f7aa1a8c500a0cecab17c212d2c58ca09eae608c8eefc922b9902ef8d6832f799ba48c3c28aa702b3242107edeba01daafe424406a3822965056cfe8783455a671e93b1e2eae2321364f1871471c82124df33bc09e1b52882bd7e1c4c7d0b2f3dd4a28c2a002a43246768af0700f9659de99d62167be93177aabf19d678e79e9c726ac510d94e74873eda99620a3961930cd91937c88a06d8153d64fd60da7ca38cf26d1d4f04a0df273f52127c53fdc593f0f8df9", + "ea6f8e977c954657b45f25480ff42c36c7a10c77caa26eb1c907062e24fbca5aebc65cacca0de10abea8c78322f08672e13d8ac16996eca1aa17402eaea4c1cc6c800b22dc18cb8d620192d74bac02c07b5cfa61e513c7f28b7e29b9700e0e442720bf4c669d4995da19d19f841d9eb68cc74153592591e3bf059ef616b95305aa453b32fe99a91afb35bd482cf2b7aa42702837a53be3c38883d2963020e347556f841254ec6b85854485fe8c520b05f2ea67a9bf3981555c20991e2bacd4db5b418228b6002d8d41c025cb472bf5443aaa885974a408ea7f2e3f932c600deb", + "408190134ed06556811b1af808ab2d986aff152a28de2c41a2207c0ccc18125ac20f48384de89ea7c80cda1da14e60cc1599943646b4c0082bbcda2d9fa55a13e9df2934edf15eb4fd41f25fa3dd706ab6de522ed351b106321e494e7a27d5f7caf44ec6fadf1122d227eefc0f57aefc140d2c63d07dcbfd65790b1099745ed042cfd1548242076b98e616b76ff0d53db5179df8dd62c06a36a8b9e95a671e2a9b9dd3fb187a31ae5828d218ec5851913e0b52e2532bd4bf9e7b349f32de2b6d5d3cdf9f372d49617b6220c93c05962327e99a0480488443349f0fd54c1860f7c8", + "5f9e5c6f38573a85010a9d84d33f29c057003b2645e3ea6f72cbc7af95d197ce6a06b13fea81722853e6991791b8b15091cd066f5ed913592ed3d3af5370d39ba22beeb2a582a414b16824b77e194a094c2afdcc09aa73ce36f4943cca5ae32c5017dc398801dd92a47382d9327c9f6cffd38ca4167cd836f7855fc5ff048d8efba378cdde224905a0425e6b1de061fc951c5e624a5153b008ad41160a710b3ff2081748d5e02deb9f841f4fc6cf4a15153dd4fe874fd447482696283e79ee0e6bc8c1c0409baa5ab02c5209c319e3169b2476149c0c6e541c6197ca46e004eef533", + "218c6b3508aec69574f2b5039b30b942b72a8349d05f48ff945bbbe5c8957d5a6199492a6bf54bab821c9377e2edfa4c908384664d2c80112d5e805d66e0a551b941021be17dd20bd825bea9a3b6afb1b8c605805b3bda58750f03ea5c953a698494b425d8980c69f34d1c3f6b5866e8717031152a127215c256e08873c21b0f5cc85875d0f7c94601659150c04cd5fe5d381ba29983a2d94fcd3a65a94c53c7279cd000dddd4253d8cff8d7f6ace10247fe3bc30d63ba4bb54f557b3d22a3924369430d71ab37b701e9500bda70b5a643704858beed4726a889b6c9c91584194c68f1", + "dac26aa7273fc25d6e044c79fc2bfa46e59892a42bbca59a86826c91e76ab03e4bd9f7c0b5f08d1931d88b36ea77d94f7ba67cd4f1d3086e529427201119096ae066ae6f170940830ed7900de7bb9d66e09788287403a4ecc93c6da975d2fb08e918840a236c15f5d3a8f7375c2eeebbf6f01a6e7f29ca2b8d42df158414c320777433663c59fdcd1f39ca68e3473db721be7ce8c6dba5fddc024f94fedb286b0477581d451313ca8c737484daf60d67f9b2d56d4bcc271f7e9ae958c7f258efbc74d25753e0516f28282461941bf2dcc7dd8c7df6173b89760cefcac07190243ff863fb", + "c46e6512e6797cc7a54254a1b26b2de29aa83d6c4b1ea5a2786fbcec388270625b12635eae39e1fba013f8a65219421bca8b52a8ddfd431cda60299bdf160734d5a7450ec79620058522702174ae451b9bfa7c4a455fbbee3e1d048c7d4bac5131018228f137c8e130440c7059b4f15eaa34ce872a851a16ce86f982df78a00be4d564da2003a450ddee9ab43ea876b8b4b65c84f0b39265fd5456417afb5bc54997c986e66fc222f2123ba5e719c4d6b9a177b188277df384f1125821cf19d5248cef0be183ccdc84ac194506f740ed2188b2689ea4c9236a9e9e3a2fff85b6af4e9b49a3", + "1ccd4d278d67b65cf2564ecd4de1b55fe07adc80e1f735fe2f08ea53fd3977323689122c29c798957abaff6aba09bdcbf661d77f4dc8913ab1fe2bef38846166e3834785e7105d746484eff8c656af5d8c7854abc1c62b7fadb65521dc6f793d978bda9838eb3800417d32e8a24d8c8cb1d18a5de6ca79d9e1b0ff9aa25e6218fe944cf18666fecc1e31334b390260dbe0997539e1b02f6366b2aea4f4a21efe04f4b97568fcb39e59919d5ebac6543d5d0f48fc66b923c34aac377dc95c20329b837b6ed5e8d9a3d2089cd0d8f025658006ff41cbdaccca618822ca590ab155253f8bc1c7f5", + "9875209588395ee3c9fdd793fd48717cc84c8c3ea622b2ccc4a1be4448e6034b7810569855255031f10be5ffd714b05f9ce01972d712d40abf03d4d0ce175813a7a668f761324996093fc2aa5912f7fc2abdadd8775d2b4d9ad492216293381460ed8f6db3d641d1525f4242c348bbfe504c704f215dc461de51b5c75c1aae967936963848f16c673eca5e78dfd47eb19001d52d1bcf96c98956dad5ddf594a5da757e7ca35f2f69803b784e66ac5a58b75c228b8266ec592505e5d1ca87d81225738855f15bc0914677e81593fd409e77d159f8a908f67788de9eb06c5561547aada96c47c535", + "40c90e375e366f3756d89091eb3eed9fe0fbfc5638700af4617d358812bac53124a2205dd6756456787d49cd6a35e302479a0992288f47532e4ea7ab62fc5ad5adc690a5d9a446f7e035ad4641bd8dae83946aee3338ec984ccb5cc633e1409f2531eeffe05532a8b0062ba99454c9aeabf8ecb94db195af7032bfebc22912f49d39330add47ff8fa5720612d697f0b602738930e060a1bb214efc5e292224cf34e29deaea6b1b1ff847e94ecc997325ac38df61db45d82bf0e74a664d2fe085c20b04c39e90d6a170b68d2f1d373f00c731c524456ada73d659aaac9df3191a7a3865083343fc13", + "e8800d82e072210ca6d7fa2472028974780b76aad4bcb9ad362422dd05ae3232668251d164daa375a43b26a38cce28dbeb3dee1a4a579f70d0fe7febb29b5ece8aa836e050fb3d188c63aa9c3c0da6c717d86458a6096b5effceb964efdec7035960c09ccd10dea3c5f1c7f9f478d5887ebbe2e15c5ff85dbacbc444bb951c4eec7abecb89ed80187e409e2972ffe1a5f01562af109f2cf09471cf72cf83a3bb8f4e2ef38ed0e326b698296394e5b2718a5000c01425708e8ad0461e62462d8819c2377f13ab1be2c7c9f33dc06fe23cad27b87569f2ce2e56e4b2c60c7b1b3d370841d89ebdc1f192", + "796d6d1447d5b7e8c55cd8b2f8b7010db39f27565f907e3fc0e464ea2d4bb52b37f10e7c6dcfc59231b9cdee12c32aeb4adbc42b86e86eb6defb5b69e6ca75e1f4d0dae3e124e5a1b8b6697f7e10b0403f1f0a5ff848eef3752837a9ba17780f16a9a709188a8d5b89a2fa74adb2e651163b1c2b3d261e225c9158dcd9eb7ac3d6704cee290cdff6bcb3cb90cee030aa0d19d4693655c3c30ac6fc06d2ae37787c47126d57ed9a6bef5f8a6c56859aefc08755739a95aac57a4dd916a92ba9f3afbf969df8085949615033365c751a9a3e1a18cee98a69d22e64009bebf8307169b6c61de0617ecfafdf", + "4f9057183566153cf337b07c3f5556006de54c56b2a1e5326c07aaeabd1886ec6f1641358925db232b2f0dbf75229c796a7395b2f934c1f99090bec1123f3c841b1cb3c5b1ec42ed5408f2940f0c48a9470b852c46d6557853d459cecd2c32bbcd8ee21fa11e385eef0857cba4d8545a61b52a484cdd779db4739fbc7aa9860dcabe0488b98fa0b60c3f7d6153db279000a52ffb573dab37d2ab1896a90e5deb7ac6bbe56239085c325d83a917dc6e8a448425b718c2356b9f3066163555ec444f372e184e02c8c4c69b1c1c2ae2b51e45b98f73d933d18750968945ca85d6bbb22014b4c4015262e3c40d", + "79dcca7d8b81a61359e4aece21f3df7b99518ce70bd2f57a18bab5e7114af2add0a0cea7f319d69f231f060e0a539d9a23fb3e95451ce8c6340cfb09edf931df84203a39226dd9eb278f11b691ef612585b973daab373e65d11325898badf6732100371fd759960fa8fec373268421d28bffdb9b12a430b92fe4b07566ca0c89e616e49f8fc75ccd9cdc66db820d7c02e109aa5ed86b89770262918a518f90a2292f6b68d68ae03992e4259a17a23c84ec2a417f082b5abf3a26e44d2278ecb8ba9456965303a75f25394d1aaf5544590e74b14d8a4cc4050be2b0ebcfe4d2db6b12a02c68a3bcdda70301f3", + "848755dc31e25e9a42f9ec12d847d19f292c14c162c9aba49e972cb123b58b8e57bb263a923929833373858594ff52dbc298dbbc078599194e4c07b0e5fc1e10808bbacdb6e93c72b333685cf961f28eb0d5a395c63266b01f130d25db384b356e5da6d01042fc2359581b89c63b3bb2d1ce897fbc9e83fe85d9666cb60e6a8c657f70caad5387b8a045bf91095606802c8424ea8ac52ef29386dc46183378a5fcb2cb927428b8c070f1c42aafd3bc70ca25437807696a46873cfeb7b80ba2ebc3c4272443d445e46343a1465253a9eebd532a0d1d2c18264b91ff45159f245404ae9335f2af55c802772426b4", + "ecaa6e999ef355a0768730edb835db411829a3764f79d764bb5682af6d00f51b313e017b83fffe2e332cd4a3de0a81d6a52084d5748346a1f81eb9b183ff6d93d05edc00e938d001c90872dfe234e8dd085f639af168af4a07e18f1c56ca6c7c1addffc4a70eb4660666dda0321636c3f83479ad3b64e23d749620413a2ecdcc52ad4e6e63f2b817ce99c15b5d2da3792721d7158297cce65e0c04fe810d7e2434b969e4c7892b3840623e153576356e9a696fd9e7a801c25de621a7849da3f99158d3d09bf039f43c510c8ffb00fa3e9a3c12d2c8062dd25b8dabe53d8581e30427e81c3dfc2d455352487e1255", + "23a3fe80e3636313fdf922a1359514d9f31775e1adf24285e8001c04dbce866df055edf25b506e18953492a173ba5aa0c1ec758123406a97025ba9b6b7a97eb14734424d1a7841ec0eaeba0051d6e9734263bea1af9895a3b8c83d8c854da2ae7832bdd7c285b73f8113c3821cced38b3656b4e6369a9f8327cd368f04128f1d78b6b4260f55995277feffa15e34532cd0306c1f47354667c17018ee012a791af2dbbc7afc92c388008c601740cccbbe66f1eb06ea657e9d478066c2bd2093ab62cd94abadc002722f50968e8acf361658fc64f50685a5b1b004888b3b4f64a4ddb67bec7e4ac64c9ee8deeda896b9", + "758f3567cd992228386a1c01930f7c52a9dcce28fdc1aaa54b0fed97d9a54f1df805f31bac12d559e90a2063cd7df8311a148f6904f78c5440f75e49877c0c0855d59c7f7ee52837e6ef3e54a568a7b38a0d5b896e298c8e46a56d24d8cabda8aeff85a622a3e7c87483ba921f34156defd185f608e2241224286e38121a162c2ba7604f68484717196f6628861a948180e8f06c6cc1ec66d032cf8d16da039cd74277cde31e535bc1692a44046e16881c954af3cd91dc49b443a3680e4bc42a954a46ebd1368b1398edd7580f935514b15c7fbfa9b40048a35122283af731f5e460aa85b66e65f49a9d158699bd2870", + "fe511e86971cea2b6af91b2afa898d9b067fa71780790bb409189f5debe719f405e16acf7c4306a6e6ac5cd535290efe088943b9e6c5d25bfc508023c1b105d20d57252fee8cdbddb4d34a6ec2f72e8d55be55afcafd2e922ab8c31888bec4e816d04f0b2cd23df6e04720969c5152b3563c6da37e4608554cc7b8715bc10aba6a2e3b6fbcd35408df0dd73a9076bfad32b741fcdb0edfb563b3f753508b9b26f0a91673255f9bcda2b9a120f6bfa0632b6551ca517d846a747b66ebda1b2170891ece94c19ce8bf682cc94afdf0053fba4e4f0530935c07cdd6f879c999a8c4328ef6d3e0a37974a230ada83910604337", + "a6024f5b959698c0de45f4f29e1803f99dc8112989c536e5a1337e281bc856ff721e986de183d7b0ea9eb61166830ae5d6d6bc857dc833ff189b52889b8e2bd3f35b4937624d9b36dc5f19db44f0772508029784c7dac9568d28609058bc437e2f79f95b12307d8a8fb042d7fd6ee910a9e8df609ede3283f958ba918a9925a0b1d0f9f9f232062315f28a52cbd60e71c09d83e0f6600f508f0ae8ad7642c080ffc618fcd2314e26f67f1529342569f6df37017f7e3b2dac32ad88d56d175ab22205ee7e3ee94720d76933a21132e110fefbb0689a3adbaa4c685f43652136d09b3a359b5c671e38f11915cb5612db2ae294", + "af6de0e227bd78494acb559ddf34d8a7d55a03912384831be21c38376f39cda8a864aff7a48aed758f6bdf777779a669068a75ce82a06f6b3325c855ed83daf5513a078a61f7dc6c1622a633367e5f3a33e765c8ec5d8d54f48494006fdbf8922063e5340013e312871b7f8f8e5ea439c0d4cb78e2f19dd11f010729b692c65dd0d347f0ce53de9d849224666ea2f6487f1c6f953e8f9dbfd3d6de291c3e9d045e633cfd83c89d2f2327d0b2f31f72ac1604a3db1febc5f22cad08153278047210cc2894582c251a014c652e3951593e70e52a5d7451be8924b64f85c8247dab6268d24710b39fc1c07b4ac829fbda34ed79b5", + "d7314e8b1ff82100b8f5870da62b61c31ab37ace9e6a7b6f7d294571523783c1fdedcbc00dd487dd6f848c34aab493507d07071b5eb59d1a2346068c7f356755fbde3d2cab67514f8c3a12d6ff9f96a977a9ac9263491bd33122a904da5386b943d35a6ba383932df07f259b6b45f69e9b27b4ca124fb3ae143d709853eed86690bc2754d5f8865c355a44b5279d8eb31cdc00f7407fb5f5b34edc57fc7ace943565da2222dc80632ccf42f2f125ceb19714ea964c2e50603c9f8960c3f27c2ed0e18a559931c4352bd7422109a28c5e145003f55c9b7c664fdc985168868950396eaf6fefc7b73d815c1aca721d7c67da632925", + "2928b55c0e4d0f5cb4b60af59e9a702e3d616a8cf427c8bb03981fb8c29026d8f7d89161f36c11654f9a5e8ccb703595a58d671ecdc22c6a784abe363158682be4643002a7da5c9d268a30ea9a8d4cc24f562ab59f55c2b43af7dbcecc7e5ebe7494e82d74145a1e7d442125eb0431c5ea0939b27afa47f8ca97849f341f707660c7fbe49b7a0712fbcb6f7562ae2961425f27c7779c7534ecdeb8047ff3cb89a25159f3e1cefe42f9ef16426241f2c4d62c11d7ac43c4500dfcd184436bb4ef33260366f875230f26d81613c334dbda4736ba9d1d2966502914ec01bbe72d885606ec11da7a2cb01b29d35eebedbb0ecc73ed6c35", + "fd993f50e8a68c7b2c7f87511ce65b93c0aa94dcbdf2c9cca93816f0f3b2ab34c62c586fc507b4900a34cf9d0517e0fe10a89d154c5419c1f5e38de00e8834fe3dc1032abdeb10729a81655a69a12856a78ca6e12110580de879b086fd6608726541cfa9616326bdd36064bc0d1e5f9c93b41278bff6a13b2494b81e238c0c45aea1b07d855e8f3fe1478e373bd9d3957cf8a5e5b9003386793d994c7c575cff2322e2428cbbaa4f47560316ae3354a7478842ff7cc5dcbacb6e871e72b36f06d63a9aaeb9044cfb7974afdc238a5816f537dcf33ee40b4e1a5eb3cff2402b46d548264e133008d284f11b7e4e450bc3c5ff9f79b9c4", + "8df21892f5fc303b0de4adef1970186db6fe71bb3ea3094922e13afcfabf1d0be009f36d6f6310c5f9fda51f1a946507a055b645c296370440e5e83d8e906a2fb51f2b42de8856a81a4f28a73a8825c68ea08e5e366730bce8047011cb7d6d9be8c6f4211308fad21856284d5bc47d199988e0abf5badf8693ceeed0a2d98e8ae94b7775a42925edb1f697ffbd8e806af23145054a85e071819cca4cd48875290ca65e5ee72a9a54ff9f19c10ef4adaf8d04c9a9afcc73853fc128bbebc61f78702787c966ca6e1b1a0e4dab646acdfcd3c6bf3e5cfbec5ebe3e06c8abaa1de56e48421d87c46b5c78030afcafd91f27e7d7c85eb4872b", + "48ec6ec520f8e593d7b3f653eb15553de246723b81a6d0c3221aaa42a37420fba98a23796338dff5f845dce6d5a449be5ecc1887356619270461087e08d05fb60433a83d7bd00c002b09ea210b428965124b9b27d9105a71c826c1a2491cfd60e4cfa86c2da0c7100a8dc1c3f2f94b280d54e01e043acf0e966200d9fa8a41daf3b9382820786c75cadbb8841a1b2be5b6cbeb64878e4a231ae063a99b4e2308960ef0c8e2a16bb3545cc43bdf171493fb89a84f47e7973dc60cf75aeeca71e0a7ebe17d161d4fb9fe009941cc438f16a5bae6c99fcad08cac486eb2a48060b023d8730bf1d82fe60a2f036e6f52a5bff95f43bbe088933f", + "f4d84ed3e564c102600a795eaa9b1eaf4ad12f1a4deca1d042a0a2750ddf6201db03073d8bf553cb9dde48a1b0083827a609f7242b86584cc180964ae794b12ce55661e00e36a6ba4dbc389e6a5a85f1b45df9af7ead1b0a54db56e68639b9d438a91504e82c35d40c7bc7e048a53ac0b04accd0dadf4ac9884b0ca0e3cb5ba4336e3581be4c4760a553823ffa283a1120d4e145af56a59f2533903650f0b9e9ad9fe2e8a3c3c3dd03a1fcb709032c8835324839c735b0c051d0cbd8b5d867617c11023432e4bd275d3d0eb98a0b6cf58071a5b712922f2bc751ac7c2588c447444cde2f37a8ea5ec126425bf517e0d17c9e2999f52fee14b3", + "2ccea21bac9c2b70d3923309cbf2d7cb7abd1fcc8b8b002688870a80029c62397350c3c898194e5deea360bb963d26d485cb7963f8167586976ec0556950b2e86135f4a2800991ce8473bfd44a3c5e937a48b5e355ba5141bccf2131a83988d9d2a9e8e7635a956105b3512c05ef708139ced51d7a4e204c12d8a49a21e8dc6de2629a2fd092326885d9f218745fe09f6d91fb6afce250a30a63689534b6be1f26899ffa3767d835cf586aa47776700f94241bc999b1e3deefe188f37ff734f5f16ee6a00914323dc7b8a143c9137cdcc5cd08ae9566f04bb2941532674c97dff6ffa5ce3405ef8e5d27ec403114253dd6394c0167d72a0044c5", + "2b681c6398aee63bf862770341648bbcd31d7de7903c5903fe3d9469311320bb24d914f2af0cdca199c97214c7c679dc32a2800ba484a03c010ea6be3bb9f2c87e30a98b606050b8a3f297f12b8f92caaeceb3e844652115934874e0a1ab093a73d759b53f6a6c3096940dd22c2bb96ce6820a7b9c6d71a208de9892aa6a7209b0fff56a0cafea52b952cdd6f5752cff3309d448800b4e4c878aa595595b56b12b83fcd6ca89520c7da664e449d7b4438fc455888aad5de0fad9a06eed14afd3513b5ebbffe01775549b701181bd26370764f56eba52fdb24286ad1ac0f5418a7c429f7dfc7f3168437fa8eed7a2ed7c723a485e4c3ed14dea2e07", + "aadfd505a89f4aade2c3018258a7e039401b1fc6a7f3d87910dddbb880d372ec8a13c70d92245de5b8e5f9a285c33b99dc82fa2b22decee72b93a72211656ad7a52696c8e570f78be28c0e427a371dafde856e8d5ed24f83b0660b51e7fac05d93a8666dfde6def59af863f80f3e5f6801182c87422203df390dcb736b8f830052a8832eeeb0b4e27e732aaf793d166b5a3ec7745aeef3766937c2b75a276bddd145f6010c29d035e343e267cb2d828436876ec3a7ebe3b6347d4172f7a99d6821ce152e039e53deb33340b324c7f068ffb94b3cde35a8eaa12d15c3806a7ad0acec3e8c7078c1d32a28fd3eec9f32cb86e4c22166ff69e83785e851", + "1605b8cce529a9d6262fd4390d9e4ae5e14e0adc0ec89b028ef68dd0f373ea259aaa96f2967091dd0874c0105385e9e6da9ca68297c31afa44ef834535fb302ce5b4e49edacbbdf359fe1228a8172495b3e57014c27edd58b685110980056c50c398a64f4923f2d720b4df16d75cb36b4233660694182099c35028a972519c24764fc94e18e582b24deb3491535fc06b83837c7958522800e822201d694af0bd0aa3834e17d4b1ba36f470905ae5f8bbeeb6c4c8604d8af02baa347b07086d6989867ddd5e8e8ed7740c3469bfa2810519c55c6add1332c4c54ee9097961d6741cb12a09713a0d07645f784f42f5ad94b48b836b34263130b0483f15e3", + "ff9c6125b2f60bfd6c2427b279df070e430075096647599bdc68c531152c58e13858b82385d78c856092d6c74106e87ccf51ac7e673936332d9b223444eaa0e762ee258d8a733d3a515ec68ed73285e5ca183ae3278b4820b0ab2797feb1e7d8cc864df585dfb5ebe02a993325a9ad5e2d7d49d3132cf66013898351d044e0fe908ccdfeeebf651983601e3673a1f92d36510c0cc19b2e75856db8e4a41f92a51efa66d6cc22e414944c2c34a5a89ccde0be76f51410824e330d8e7c613194338c93732e8aea651fca18bcf1ac1824340c5553aff1e58d4ab8d7c8842b4712021e517cd6c140f6743c69c7bee05b10a8f24050a8caa4f96d1664909c5a06", + "6e85c2f8e1fdc3aaeb969da1258cb504bbf0070cd03d23b3fb5ee08feea5ee2e0ee1c71a5d0f4f701b351f4e4b4d74cb1e2ae6184814f77b62d2f08134b7236ebf6b67d8a6c9f01b4248b30667c555f5d8646dbfe291151b23c9c9857e33a4d5c847be29a5ee7b402e03bac02d1a4319acc0dd8f25e9c7a266f5e5c896cc11b5b238df96a0963ae806cb277abc515c298a3e61a3036b177acf87a56ca4478c4c6d0d468913de602ec891318bbaf52c97a77c35c5b7d164816cf24e4c4b0b5f45853882f716d61eb947a45ce2efa78f1c70a918512af1ad536cbe6148083385b34e207f5f690d7a954021e4b5f4258a385fd8a87809a481f34202af4caccb82", + "1e9b2c454e9de3a2d723d850331037dbf54133dbe27488ff757dd255833a27d8eb8a128ad12d0978b6884e25737086a704fb289aaaccf930d5b582ab4df1f55f0c429b6875edec3fe45464fa74164be056a55e243c4222c586bec5b18f39036aa903d98180f24f83d09a454dfa1e03a60e6a3ba4613e99c35f874d790174ee48a557f4f021ade4d1b278d7997ef094569b37b3db0505951e9ee8400adaea275c6db51b325ee730c69df97745b556ae41cd98741e28aa3a49544541eeb3da1b1e8fa4e8e9100d66dd0c7f5e2c271b1ecc077de79c462b9fe4c273543ecd82a5bea63c5acc01eca5fb780c7d7c8c9fe208ae8bd50cad1769693d92c6c8649d20d8", +} diff --git a/crypto/blake2b/blake2x.go b/crypto/blake2b/blake2x.go new file mode 100644 index 000000000000..52c414db0e64 --- /dev/null +++ b/crypto/blake2b/blake2x.go @@ -0,0 +1,177 @@ +// 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 blake2b + +import ( + "encoding/binary" + "errors" + "io" +) + +// XOF defines the interface to hash functions that +// support arbitrary-length output. +type XOF interface { + // Write absorbs more data into the hash's state. It panics if called + // after Read. + io.Writer + + // Read reads more output from the hash. It returns io.EOF if the limit + // has been reached. + io.Reader + + // Clone returns a copy of the XOF in its current state. + Clone() XOF + + // Reset resets the XOF to its initial state. + Reset() +} + +// OutputLengthUnknown can be used as the size argument to NewXOF to indicate +// the length of the output is not known in advance. +const OutputLengthUnknown = 0 + +// magicUnknownOutputLength is a magic value for the output size that indicates +// an unknown number of output bytes. +const magicUnknownOutputLength = (1 << 32) - 1 + +// maxOutputLength is the absolute maximum number of bytes to produce when the +// number of output bytes is unknown. +const maxOutputLength = (1 << 32) * 64 + +// NewXOF creates a new variable-output-length hash. The hash either produce a +// known number of bytes (1 <= size < 2**32-1), or an unknown number of bytes +// (size == OutputLengthUnknown). In the latter case, an absolute limit of +// 256GiB applies. +// +// A non-nil key turns the hash into a MAC. The key must between +// zero and 32 bytes long. +func NewXOF(size uint32, key []byte) (XOF, error) { + if len(key) > Size { + return nil, errKeySize + } + if size == magicUnknownOutputLength { + // 2^32-1 indicates an unknown number of bytes and thus isn't a + // valid length. + return nil, errors.New("blake2b: XOF length too large") + } + if size == OutputLengthUnknown { + size = magicUnknownOutputLength + } + x := &xof{ + d: digest{ + size: Size, + keyLen: len(key), + }, + length: size, + } + copy(x.d.key[:], key) + x.Reset() + return x, nil +} + +type xof struct { + d digest + length uint32 + remaining uint64 + cfg, root, block [Size]byte + offset int + nodeOffset uint32 + readMode bool +} + +func (x *xof) Write(p []byte) (n int, err error) { + if x.readMode { + panic("blake2b: write to XOF after read") + } + return x.d.Write(p) +} + +func (x *xof) Clone() XOF { + clone := *x + return &clone +} + +func (x *xof) Reset() { + x.cfg[0] = byte(Size) + binary.LittleEndian.PutUint32(x.cfg[4:], uint32(Size)) // leaf length + binary.LittleEndian.PutUint32(x.cfg[12:], x.length) // XOF length + x.cfg[17] = byte(Size) // inner hash size + + x.d.Reset() + x.d.h[1] ^= uint64(x.length) << 32 + + x.remaining = uint64(x.length) + if x.remaining == magicUnknownOutputLength { + x.remaining = maxOutputLength + } + x.offset, x.nodeOffset = 0, 0 + x.readMode = false +} + +func (x *xof) Read(p []byte) (n int, err error) { + if !x.readMode { + x.d.finalize(&x.root) + x.readMode = true + } + + if x.remaining == 0 { + return 0, io.EOF + } + + n = len(p) + if uint64(n) > x.remaining { + n = int(x.remaining) + p = p[:n] + } + + if x.offset > 0 { + blockRemaining := Size - x.offset + if n < blockRemaining { + x.offset += copy(p, x.block[x.offset:]) + x.remaining -= uint64(n) + return + } + copy(p, x.block[x.offset:]) + p = p[blockRemaining:] + x.offset = 0 + x.remaining -= uint64(blockRemaining) + } + + for len(p) >= Size { + binary.LittleEndian.PutUint32(x.cfg[8:], x.nodeOffset) + x.nodeOffset++ + + x.d.initConfig(&x.cfg) + x.d.Write(x.root[:]) + x.d.finalize(&x.block) + + copy(p, x.block[:]) + p = p[Size:] + x.remaining -= uint64(Size) + } + + if todo := len(p); todo > 0 { + if x.remaining < uint64(Size) { + x.cfg[0] = byte(x.remaining) + } + binary.LittleEndian.PutUint32(x.cfg[8:], x.nodeOffset) + x.nodeOffset++ + + x.d.initConfig(&x.cfg) + x.d.Write(x.root[:]) + x.d.finalize(&x.block) + + x.offset = copy(p, x.block[:todo]) + x.remaining -= uint64(todo) + } + return +} + +func (d *digest) initConfig(cfg *[Size]byte) { + d.offset, d.c[0], d.c[1] = 0, 0, 0 + for i := range d.h { + d.h[i] = iv[i] ^ binary.LittleEndian.Uint64(cfg[i*8:]) + } +} diff --git a/crypto/blake2b/register.go b/crypto/blake2b/register.go new file mode 100644 index 000000000000..efd689af4b49 --- /dev/null +++ b/crypto/blake2b/register.go @@ -0,0 +1,32 @@ +// 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 go1.9 + +package blake2b + +import ( + "crypto" + "hash" +) + +func init() { + newHash256 := func() hash.Hash { + h, _ := New256(nil) + return h + } + newHash384 := func() hash.Hash { + h, _ := New384(nil) + return h + } + + newHash512 := func() hash.Hash { + h, _ := New512(nil) + return h + } + + crypto.RegisterHash(crypto.BLAKE2b_256, newHash256) + crypto.RegisterHash(crypto.BLAKE2b_384, newHash384) + crypto.RegisterHash(crypto.BLAKE2b_512, newHash512) +} diff --git a/crypto/bn256/bn256_fast.go b/crypto/bn256/bn256_fast.go index 73ba8f605a1c..14b596539388 100644 --- a/crypto/bn256/bn256_fast.go +++ b/crypto/bn256/bn256_fast.go @@ -7,17 +7,19 @@ // Package bn256 implements the Optimal Ate pairing over a 256-bit Barreto-Naehrig curve. package bn256 -import "github.com/nebulaai/nbai-node/crypto/bn256/cloudflare" +import ( + bn256cf "github.com/ethereum/go-ethereum/crypto/bn256/cloudflare" +) // G1 is an abstract cyclic group. The zero value is suitable for use as the // output of an operation, but cannot be used as an input. -type G1 = bn256.G1 +type G1 = bn256cf.G1 // G2 is an abstract cyclic group. The zero value is suitable for use as the // output of an operation, but cannot be used as an input. -type G2 = bn256.G2 +type G2 = bn256cf.G2 // PairingCheck calculates the Optimal Ate pairing for a set of points. func PairingCheck(a []*G1, b []*G2) bool { - return bn256.PairingCheck(a, b) + return bn256cf.PairingCheck(a, b) } diff --git a/crypto/bn256/bn256_fuzz.go b/crypto/bn256/bn256_fuzz.go index 6cdc96c1f164..6aa142117045 100644 --- a/crypto/bn256/bn256_fuzz.go +++ b/crypto/bn256/bn256_fuzz.go @@ -10,8 +10,8 @@ import ( "bytes" "math/big" - cloudflare "github.com/nebulaai/nbai-node/crypto/bn256/cloudflare" - google "github.com/nebulaai/nbai-node/crypto/bn256/google" + cloudflare "github.com/ethereum/go-ethereum/crypto/bn256/cloudflare" + google "github.com/ethereum/go-ethereum/crypto/bn256/google" ) // FuzzAdd fuzzez bn256 addition between the Google and Cloudflare libraries. diff --git a/crypto/bn256/bn256_slow.go b/crypto/bn256/bn256_slow.go index 877c66be00ac..47df49d41763 100644 --- a/crypto/bn256/bn256_slow.go +++ b/crypto/bn256/bn256_slow.go @@ -7,7 +7,7 @@ // Package bn256 implements the Optimal Ate pairing over a 256-bit Barreto-Naehrig curve. package bn256 -import "github.com/nebulaai/nbai-node/crypto/bn256/google" +import "github.com/ethereum/go-ethereum/crypto/bn256/google" // G1 is an abstract cyclic group. The zero value is suitable for use as the // output of an operation, but cannot be used as an input. diff --git a/crypto/bn256/cloudflare/bn256.go b/crypto/bn256/cloudflare/bn256.go index c6ea2d07e01c..38822a76bfec 100644 --- a/crypto/bn256/cloudflare/bn256.go +++ b/crypto/bn256/cloudflare/bn256.go @@ -100,6 +100,10 @@ func (e *G1) Marshal() []byte { // Each value is a 256-bit number. const numBytes = 256 / 8 + if e.p == nil { + e.p = &curvePoint{} + } + e.p.MakeAffine() ret := make([]byte, numBytes*2) if e.p.IsInfinity() { @@ -382,6 +386,11 @@ func (e *GT) Marshal() []byte { // Each value is a 256-bit number. const numBytes = 256 / 8 + if e.p == nil { + e.p = &gfP12{} + e.p.SetOne() + } + ret := make([]byte, numBytes*12) temp := &gfP{} diff --git a/crypto/bn256/cloudflare/constants.go b/crypto/bn256/cloudflare/constants.go index 5122aae64f1e..f7d2c7c001cc 100644 --- a/crypto/bn256/cloudflare/constants.go +++ b/crypto/bn256/cloudflare/constants.go @@ -13,10 +13,13 @@ func bigFromBase10(s string) *big.Int { return n } -// u is the BN parameter that determines the prime: 1868033³. +// u is the BN parameter. var u = bigFromBase10("4965661367192848881") // Order is the number of elements in both G₁ and G₂: 36u⁴+36u³+18u²+6u+1. +// Needs to be highly 2-adic for efficient SNARK key and proof generation. +// Order - 1 = 2^28 * 3^2 * 13 * 29 * 983 * 11003 * 237073 * 405928799 * 1670836401704629 * 13818364434197438864469338081. +// Refer to https://eprint.iacr.org/2013/879.pdf and https://eprint.iacr.org/2013/507.pdf for more information on these parameters. var Order = bigFromBase10("21888242871839275222246405745257275088548364400416034343698204186575808495617") // P is a prime over which we form a basic field: 36u⁴+36u³+24u²+6u+1. diff --git a/crypto/bn256/cloudflare/gfp6.go b/crypto/bn256/cloudflare/gfp6.go index 83d61b781f39..a42734911c64 100644 --- a/crypto/bn256/cloudflare/gfp6.go +++ b/crypto/bn256/cloudflare/gfp6.go @@ -5,7 +5,7 @@ package bn256 // http://eprint.iacr.org/2006/471.pdf. // gfP6 implements the field of size p⁶ as a cubic extension of gfP2 where τ³=ξ -// and ξ=i+3. +// and ξ=i+9. type gfP6 struct { x, y, z gfP2 // value is xτ² + yτ + z } diff --git a/crypto/bn256/cloudflare/main_test.go b/crypto/bn256/cloudflare/main_test.go index 0230f1b1993d..c0c85457beca 100644 --- a/crypto/bn256/cloudflare/main_test.go +++ b/crypto/bn256/cloudflare/main_test.go @@ -13,7 +13,7 @@ func TestRandomG2Marshal(t *testing.T) { t.Error(err) continue } - t.Logf("%d: %x\n", n, g2.Marshal()) + t.Logf("%v: %x\n", n, g2.Marshal()) } } diff --git a/crypto/bn256/cloudflare/mul_arm64.h b/crypto/bn256/cloudflare/mul_arm64.h index 75d52217311b..d405eb8f7287 100644 --- a/crypto/bn256/cloudflare/mul_arm64.h +++ b/crypto/bn256/cloudflare/mul_arm64.h @@ -12,7 +12,7 @@ UMULH R1, R8, c4 \ ADCS ZR, c4 \ \ - MUL R2, R5, R25 \ + MUL R2, R5, R1 \ UMULH R2, R5, R26 \ MUL R2, R6, R0 \ ADDS R0, R26 \ @@ -24,13 +24,13 @@ ADCS R0, R29 \ UMULH R2, R8, c5 \ ADCS ZR, c5 \ - ADDS R25, c1 \ + ADDS R1, c1 \ ADCS R26, c2 \ ADCS R27, c3 \ ADCS R29, c4 \ ADCS ZR, c5 \ \ - MUL R3, R5, R25 \ + MUL R3, R5, R1 \ UMULH R3, R5, R26 \ MUL R3, R6, R0 \ ADDS R0, R26 \ @@ -42,13 +42,13 @@ ADCS R0, R29 \ UMULH R3, R8, c6 \ ADCS ZR, c6 \ - ADDS R25, c2 \ + ADDS R1, c2 \ ADCS R26, c3 \ ADCS R27, c4 \ ADCS R29, c5 \ ADCS ZR, c6 \ \ - MUL R4, R5, R25 \ + MUL R4, R5, R1 \ UMULH R4, R5, R26 \ MUL R4, R6, R0 \ ADDS R0, R26 \ @@ -60,7 +60,7 @@ ADCS R0, R29 \ UMULH R4, R8, c7 \ ADCS ZR, c7 \ - ADDS R25, c3 \ + ADDS R1, c3 \ ADCS R26, c4 \ ADCS R27, c5 \ ADCS R29, c6 \ @@ -69,15 +69,15 @@ #define gfpReduce() \ \ // m = (T * N') mod R, store m in R1:R2:R3:R4 MOVD ·np+0(SB), R17 \ - MOVD ·np+8(SB), R18 \ + MOVD ·np+8(SB), R25 \ MOVD ·np+16(SB), R19 \ MOVD ·np+24(SB), R20 \ \ MUL R9, R17, R1 \ UMULH R9, R17, R2 \ - MUL R9, R18, R0 \ + MUL R9, R25, R0 \ ADDS R0, R2 \ - UMULH R9, R18, R3 \ + UMULH R9, R25, R3 \ MUL R9, R19, R0 \ ADCS R0, R3 \ UMULH R9, R19, R4 \ @@ -86,9 +86,9 @@ \ MUL R10, R17, R21 \ UMULH R10, R17, R22 \ - MUL R10, R18, R0 \ + MUL R10, R25, R0 \ ADDS R0, R22 \ - UMULH R10, R18, R23 \ + UMULH R10, R25, R23 \ MUL R10, R19, R0 \ ADCS R0, R23 \ ADDS R21, R2 \ @@ -97,7 +97,7 @@ \ MUL R11, R17, R21 \ UMULH R11, R17, R22 \ - MUL R11, R18, R0 \ + MUL R11, R25, R0 \ ADDS R0, R22 \ ADDS R21, R3 \ ADCS R22, R4 \ @@ -107,19 +107,19 @@ \ \ // m * N loadModulus(R5,R6,R7,R8) \ - mul(R17,R18,R19,R20,R21,R22,R23,R24) \ + mul(R17,R25,R19,R20,R21,R22,R23,R24) \ \ \ // Add the 512-bit intermediate to m*N - MOVD ZR, R25 \ + MOVD ZR, R0 \ ADDS R9, R17 \ - ADCS R10, R18 \ + ADCS R10, R25 \ ADCS R11, R19 \ ADCS R12, R20 \ ADCS R13, R21 \ ADCS R14, R22 \ ADCS R15, R23 \ ADCS R16, R24 \ - ADCS ZR, R25 \ + ADCS ZR, R0 \ \ \ // Our output is R21:R22:R23:R24. Reduce mod p if necessary. SUBS R5, R21, R10 \ diff --git a/crypto/bn256/google/main_test.go b/crypto/bn256/google/main_test.go index 0230f1b1993d..c0c85457beca 100644 --- a/crypto/bn256/google/main_test.go +++ b/crypto/bn256/google/main_test.go @@ -13,7 +13,7 @@ func TestRandomG2Marshal(t *testing.T) { t.Error(err) continue } - t.Logf("%d: %x\n", n, g2.Marshal()) + t.Logf("%v: %x\n", n, g2.Marshal()) } } diff --git a/crypto/crypto.go b/crypto/crypto.go index 999ea29b4a7c..2869b4c19165 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -28,12 +28,21 @@ import ( "math/big" "os" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/rlp" "golang.org/x/crypto/sha3" ) +//SignatureLength indicates the byte length required to carry a signature with recovery id. +const SignatureLength = 64 + 1 // 64 bytes ECDSA signature + 1 byte recovery id + +// RecoveryIDOffset points to the byte offset within the signature that contains the recovery id. +const RecoveryIDOffset = 64 + +// DigestLength sets the signature digest exact length +const DigestLength = 32 + var ( secp256k1N, _ = new(big.Int).SetString("fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141", 16) secp256k1halfN = new(big.Int).Div(secp256k1N, big.NewInt(2)) diff --git a/crypto/crypto_test.go b/crypto/crypto_test.go index 28bb4e11482b..177c19c0cfca 100644 --- a/crypto/crypto_test.go +++ b/crypto/crypto_test.go @@ -26,8 +26,8 @@ import ( "reflect" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" ) var testAddrHex = "970e8128ab834e8eac17ab8e3812f010678cf791" diff --git a/crypto/ecies/ecies_test.go b/crypto/ecies/ecies_test.go index 6b9510f6d53a..b465f076f4eb 100644 --- a/crypto/ecies/ecies_test.go +++ b/crypto/ecies/ecies_test.go @@ -35,22 +35,13 @@ import ( "crypto/rand" "crypto/sha256" "encoding/hex" - "flag" "fmt" "math/big" "testing" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/crypto" ) -var dumpEnc bool - -func init() { - flDump := flag.Bool("dump", false, "write encrypted test message to file") - flag.Parse() - dumpEnc = *flDump -} - // Ensure the KDF generates appropriately sized keys. func TestKDF(t *testing.T) { msg := []byte("Hello, world") @@ -58,12 +49,10 @@ func TestKDF(t *testing.T) { k, err := concatKDF(h, msg, nil, 64) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } if len(k) != 64 { - fmt.Printf("KDF: generated key is the wrong size (%d instead of 64\n", len(k)) - t.FailNow() + t.Fatalf("KDF: generated key is the wrong size (%d instead of 64\n", len(k)) } } @@ -77,65 +66,31 @@ func cmpParams(p1, p2 *ECIESParams) bool { p1.BlockSize == p2.BlockSize } -// cmpPublic returns true if the two public keys represent the same pojnt. -func cmpPublic(pub1, pub2 PublicKey) bool { - if pub1.X == nil || pub1.Y == nil { - fmt.Println(ErrInvalidPublicKey.Error()) - return false - } - if pub2.X == nil || pub2.Y == nil { - fmt.Println(ErrInvalidPublicKey.Error()) - return false - } - pub1Out := elliptic.Marshal(pub1.Curve, pub1.X, pub1.Y) - pub2Out := elliptic.Marshal(pub2.Curve, pub2.X, pub2.Y) - - return bytes.Equal(pub1Out, pub2Out) -} - -// cmpPrivate returns true if the two private keys are the same. -func cmpPrivate(prv1, prv2 *PrivateKey) bool { - if prv1 == nil || prv1.D == nil { - return false - } else if prv2 == nil || prv2.D == nil { - return false - } else if prv1.D.Cmp(prv2.D) != 0 { - return false - } else { - return cmpPublic(prv1.PublicKey, prv2.PublicKey) - } -} - // Validate the ECDH component. func TestSharedKey(t *testing.T) { prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } skLen := MaxSharedKeyLength(&prv1.PublicKey) / 2 prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } sk1, err := prv1.GenerateShared(&prv2.PublicKey, skLen, skLen) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } sk2, err := prv2.GenerateShared(&prv1.PublicKey, skLen, skLen) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } if !bytes.Equal(sk1, sk2) { - fmt.Println(ErrBadSharedKeys.Error()) - t.FailNow() + t.Fatal(ErrBadSharedKeys) } } @@ -164,7 +119,7 @@ func TestSharedKeyPadding(t *testing.T) { // test shared secret generation sk1, err := prv0.GenerateShared(&prv1.PublicKey, 16, 16) if err != nil { - fmt.Println(err.Error()) + t.Log(err.Error()) } sk2, err := prv1.GenerateShared(&prv0.PublicKey, 16, 16) @@ -182,26 +137,22 @@ func TestSharedKeyPadding(t *testing.T) { func TestTooBigSharedKey(t *testing.T) { prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } _, err = prv1.GenerateShared(&prv2.PublicKey, 32, 32) if err != ErrSharedKeyTooBig { - fmt.Println("ecdh: shared key should be too large for curve") - t.FailNow() + t.Fatal("ecdh: shared key should be too large for curve") } _, err = prv2.GenerateShared(&prv1.PublicKey, 32, 32) if err != ErrSharedKeyTooBig { - fmt.Println("ecdh: shared key should be too large for curve") - t.FailNow() + t.Fatal("ecdh: shared key should be too large for curve") } } @@ -209,8 +160,7 @@ func TestTooBigSharedKey(t *testing.T) { func BenchmarkGenerateKeyP256(b *testing.B) { for i := 0; i < b.N; i++ { if _, err := GenerateKey(rand.Reader, elliptic.P256(), nil); err != nil { - fmt.Println(err.Error()) - b.FailNow() + b.Fatal(err) } } } @@ -219,15 +169,13 @@ func BenchmarkGenerateKeyP256(b *testing.B) { func BenchmarkGenSharedKeyP256(b *testing.B) { prv, err := GenerateKey(rand.Reader, elliptic.P256(), nil) if err != nil { - fmt.Println(err.Error()) - b.FailNow() + b.Fatal(err) } b.ResetTimer() for i := 0; i < b.N; i++ { _, err := prv.GenerateShared(&prv.PublicKey, 16, 16) if err != nil { - fmt.Println(err.Error()) - b.FailNow() + b.Fatal(err) } } } @@ -236,15 +184,13 @@ func BenchmarkGenSharedKeyP256(b *testing.B) { func BenchmarkGenSharedKeyS256(b *testing.B) { prv, err := GenerateKey(rand.Reader, crypto.S256(), nil) if err != nil { - fmt.Println(err.Error()) - b.FailNow() + b.Fatal(err) } b.ResetTimer() for i := 0; i < b.N; i++ { _, err := prv.GenerateShared(&prv.PublicKey, 16, 16) if err != nil { - fmt.Println(err.Error()) - b.FailNow() + b.Fatal(err) } } } @@ -253,38 +199,32 @@ func BenchmarkGenSharedKeyS256(b *testing.B) { func TestEncryptDecrypt(t *testing.T) { prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } message := []byte("Hello, world.") ct, err := Encrypt(rand.Reader, &prv2.PublicKey, message, nil, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } pt, err := prv2.Decrypt(ct, nil, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } if !bytes.Equal(pt, message) { - fmt.Println("ecies: plaintext doesn't match message") - t.FailNow() + t.Fatal("ecies: plaintext doesn't match message") } _, err = prv1.Decrypt(ct, nil, nil) if err == nil { - fmt.Println("ecies: encryption should not have succeeded") - t.FailNow() + t.Fatal("ecies: encryption should not have succeeded") } } @@ -354,50 +294,39 @@ func TestParamSelection(t *testing.T) { func testParamSelection(t *testing.T, c testCase) { params := ParamsFromCurve(c.Curve) if params == nil && c.Expected != nil { - fmt.Printf("%s (%s)\n", ErrInvalidParams.Error(), c.Name) - t.FailNow() + t.Fatalf("%s (%s)\n", ErrInvalidParams.Error(), c.Name) } else if params != nil && !cmpParams(params, c.Expected) { - fmt.Printf("ecies: parameters should be invalid (%s)\n", - c.Name) - t.FailNow() + t.Fatalf("ecies: parameters should be invalid (%s)\n", c.Name) } prv1, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Printf("%s (%s)\n", err.Error(), c.Name) - t.FailNow() + t.Fatalf("%s (%s)\n", err.Error(), c.Name) } prv2, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Printf("%s (%s)\n", err.Error(), c.Name) - t.FailNow() + t.Fatalf("%s (%s)\n", err.Error(), c.Name) } message := []byte("Hello, world.") ct, err := Encrypt(rand.Reader, &prv2.PublicKey, message, nil, nil) if err != nil { - fmt.Printf("%s (%s)\n", err.Error(), c.Name) - t.FailNow() + t.Fatalf("%s (%s)\n", err.Error(), c.Name) } pt, err := prv2.Decrypt(ct, nil, nil) if err != nil { - fmt.Printf("%s (%s)\n", err.Error(), c.Name) - t.FailNow() + t.Fatalf("%s (%s)\n", err.Error(), c.Name) } if !bytes.Equal(pt, message) { - fmt.Printf("ecies: plaintext doesn't match message (%s)\n", - c.Name) - t.FailNow() + t.Fatalf("ecies: plaintext doesn't match message (%s)\n", c.Name) } _, err = prv1.Decrypt(ct, nil, nil) if err == nil { - fmt.Printf("ecies: encryption should not have succeeded (%s)\n", - c.Name) - t.FailNow() + t.Fatalf("ecies: encryption should not have succeeded (%s)\n", c.Name) } } @@ -409,23 +338,20 @@ func TestBasicKeyValidation(t *testing.T) { prv, err := GenerateKey(rand.Reader, DefaultCurve, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } message := []byte("Hello, world.") ct, err := Encrypt(rand.Reader, &prv.PublicKey, message, nil, nil) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } for _, b := range badBytes { ct[0] = b _, err := prv.Decrypt(ct, nil, nil) if err != ErrInvalidPublicKey { - fmt.Println("ecies: validated an invalid key") - t.FailNow() + t.Fatal("ecies: validated an invalid key") } } } @@ -463,19 +389,16 @@ func TestSharedKeyStatic(t *testing.T) { sk1, err := prv1.GenerateShared(&prv2.PublicKey, skLen, skLen) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } sk2, err := prv2.GenerateShared(&prv1.PublicKey, skLen, skLen) if err != nil { - fmt.Println(err.Error()) - t.FailNow() + t.Fatal(err) } if !bytes.Equal(sk1, sk2) { - fmt.Println(ErrBadSharedKeys.Error()) - t.FailNow() + t.Fatal(ErrBadSharedKeys) } sk, _ := hex.DecodeString("167ccc13ac5e8a26b131c3446030c60fbfac6aa8e31149d0869f93626a4cdf62") diff --git a/crypto/ecies/params.go b/crypto/ecies/params.go index 843fd7dce3c3..6312daf5a1c1 100644 --- a/crypto/ecies/params.go +++ b/crypto/ecies/params.go @@ -42,7 +42,7 @@ import ( "fmt" "hash" - ethcrypto "github.com/nebulaai/nbai-node/crypto" + ethcrypto "github.com/ethereum/go-ethereum/crypto" ) var ( diff --git a/crypto/secp256k1/libsecp256k1/src/asm/field_10x26_arm.s b/crypto/secp256k1/libsecp256k1/src/asm/field_10x26_arm.s index 5df561f2fc93..1e2d7ff9612d 100644 --- a/crypto/secp256k1/libsecp256k1/src/asm/field_10x26_arm.s +++ b/crypto/secp256k1/libsecp256k1/src/asm/field_10x26_arm.s @@ -23,7 +23,7 @@ Note: .eabi_attribute 10, 0 @ Tag_FP_arch = none .eabi_attribute 24, 1 @ Tag_ABI_align_needed = 8-byte .eabi_attribute 25, 1 @ Tag_ABI_align_preserved = 8-byte, except leaf SP - .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals = Agressive Speed + .eabi_attribute 30, 2 @ Tag_ABI_optimization_goals = Aggressive Speed .eabi_attribute 34, 1 @ Tag_CPU_unaligned_access = v6 .text diff --git a/crypto/signature_cgo.go b/crypto/signature_cgo.go index f3a16e7184b4..1fe84509e76f 100644 --- a/crypto/signature_cgo.go +++ b/crypto/signature_cgo.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build !nacl,!js,!nocgo +// +build !nacl,!js,cgo package crypto @@ -23,8 +23,8 @@ import ( "crypto/elliptic" "fmt" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/crypto/secp256k1" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto/secp256k1" ) // Ecrecover returns the uncompressed public key that created the given signature. @@ -47,24 +47,24 @@ func SigToPub(hash, sig []byte) (*ecdsa.PublicKey, error) { // // This function is susceptible to chosen plaintext attacks that can leak // information about the private key that is used for signing. Callers must -// be aware that the given hash cannot be chosen by an adversery. Common +// be aware that the given digest cannot be chosen by an adversery. Common // solution is to hash any input before calculating the signature. // // The produced signature is in the [R || S || V] format where V is 0 or 1. -func Sign(hash []byte, prv *ecdsa.PrivateKey) (sig []byte, err error) { - if len(hash) != 32 { - return nil, fmt.Errorf("hash is required to be exactly 32 bytes (%d)", len(hash)) +func Sign(digestHash []byte, prv *ecdsa.PrivateKey) (sig []byte, err error) { + if len(digestHash) != DigestLength { + return nil, fmt.Errorf("hash is required to be exactly %d bytes (%d)", DigestLength, len(digestHash)) } seckey := math.PaddedBigBytes(prv.D, prv.Params().BitSize/8) defer zeroBytes(seckey) - return secp256k1.Sign(hash, seckey) + return secp256k1.Sign(digestHash, seckey) } -// VerifySignature checks that the given public key created signature over hash. +// VerifySignature checks that the given public key created signature over digest. // The public key should be in compressed (33 bytes) or uncompressed (65 bytes) format. // The signature should have the 64 byte [R || S] format. -func VerifySignature(pubkey, hash, signature []byte) bool { - return secp256k1.VerifySignature(pubkey, hash, signature) +func VerifySignature(pubkey, digestHash, signature []byte) bool { + return secp256k1.VerifySignature(pubkey, digestHash, signature) } // DecompressPubkey parses a public key in the 33-byte compressed format. diff --git a/crypto/signature_nocgo.go b/crypto/signature_nocgo.go index e8fa18ed475d..067d32e13ce1 100644 --- a/crypto/signature_nocgo.go +++ b/crypto/signature_nocgo.go @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build nacl js nocgo +// +build nacl js !cgo package crypto @@ -41,7 +41,7 @@ func Ecrecover(hash, sig []byte) ([]byte, error) { // SigToPub returns the public key that created the given signature. func SigToPub(hash, sig []byte) (*ecdsa.PublicKey, error) { // Convert to btcec input format with 'recovery id' v at the beginning. - btcsig := make([]byte, 65) + btcsig := make([]byte, SignatureLength) btcsig[0] = sig[64] + 27 copy(btcsig[1:], sig) diff --git a/crypto/signature_test.go b/crypto/signature_test.go index b39498bd3a6b..aecff76bfbda 100644 --- a/crypto/signature_test.go +++ b/crypto/signature_test.go @@ -22,9 +22,9 @@ import ( "reflect" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" ) var ( diff --git a/dashboard/README.md b/dashboard/README.md deleted file mode 100644 index 641c5f44bc3f..000000000000 --- a/dashboard/README.md +++ /dev/null @@ -1,58 +0,0 @@ -## Go Ethereum Dashboard - -The dashboard is a data visualizer integrated into geth, intended to collect and visualize useful information of an Ethereum node. It consists of two parts: - -* The client visualizes the collected data. -* The server collects the data, and updates the clients. - -The client's UI uses [React][React] with JSX syntax, which is validated by the [ESLint][ESLint] linter mostly according to the [Airbnb React/JSX Style Guide][Airbnb]. The style is defined in the `.eslintrc` configuration file. The resources are bundled into a single `bundle.js` file using [Webpack][Webpack], which relies on the `webpack.config.js`. The bundled file is referenced from `dashboard.html` and takes part in the `assets.go` too. The necessary dependencies for the module bundler are gathered by [Node.js][Node.js]. - -### Development and bundling - -As the dashboard depends on certain NPM packages (which are not included in the `go-ethereum` repo), these need to be installed first: - -``` -$ (cd dashboard/assets && yarn install && yarn flow) -``` - -Normally the dashboard assets are bundled into Geth via `go-bindata` to avoid external dependencies. Rebuilding Geth after each UI modification however is not feasible from a developer perspective. Instead, we can run `yarn dev` to watch for file system changes and refresh the browser automatically. - -``` -$ geth --dashboard --vmodule=dashboard=5 -$ (cd dashboard/assets && yarn dev) -``` - -To bundle up the final UI into Geth, run `go generate`: - -``` -$ (cd dashboard && go generate) -``` - -### Static type checking - -Since JavaScript doesn't provide type safety, [Flow][Flow] is used to check types. These are only useful during development, so at the end of the process Babel will strip them. - -To take advantage of static type checking, your IDE needs to be prepared for it. In case of [Atom][Atom] a configuration guide can be found [here][Atom config]: Install the [Nuclide][Nuclide] package for Flow support, making sure it installs all of its support packages by enabling `Install Recommended Packages on Startup`, and set the path of the `flow-bin` which were installed previously by `yarn`. - -For more IDE support install the `linter-eslint` package too, which finds the `.eslintrc` file, and provides real-time linting. Atom warns, that these two packages are incompatible, but they seem to work well together. For third-party library errors and auto-completion [flow-typed][flow-typed] is used. - -### Have fun - -[Webpack][Webpack] offers handy tools for visualizing the bundle's dependency tree and space usage. - -* Generate the bundle's profile running `yarn stats` -* 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/ -[Flow]: https://flow.org/ -[Atom]: https://atom.io/ -[Atom config]: https://medium.com/@fastphrase/integrating-flow-into-a-react-project-fbbc2f130eed -[Nuclide]: https://nuclide.io/docs/quick-start/getting-started/ -[flow-typed]: https://github.com/flowtype/flow-typed diff --git a/dashboard/assets.go b/dashboard/assets.go deleted file mode 100644 index e64951f403c6..000000000000 --- a/dashboard/assets.go +++ /dev/null @@ -1,40818 +0,0 @@ -// Code generated by go-bindata. DO NOT EDIT. -// sources: -// assets/index.html -// assets/bundle.js - -package dashboard - -import ( - "crypto/sha256" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "strings" - "time" -) - -type asset struct { - bytes []byte - info os.FileInfo - digest [sha256.Size]byte -} - -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 -} - -//nolint:misspell -var _indexHtml = []byte(` - - - - - - - Go Ethereum Dashboard - - - - -
- - - -`) - -func indexHtmlBytes() ([]byte, error) { - return _indexHtml, nil -} - -func indexHtml() (*asset, error) { - bytes, err := indexHtmlBytes() - if err != nil { - return nil, err - } - - info := bindataFileInfo{name: "index.html", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} - a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x22, 0xc8, 0x3d, 0x86, 0x2f, 0xb4, 0x6a, 0x1f, 0xda, 0xd, 0x54, 0x14, 0xa3, 0x6e, 0x80, 0x56, 0x28, 0xea, 0x44, 0xcf, 0xf5, 0xf2, 0xe, 0xad, 0x19, 0xf5, 0x93, 0xd6, 0x8d, 0x6d, 0x2f, 0x35}} - return a, nil -} - -//nolint:misspell -var _bundleJs = []byte((((((((((`!function(modules) { - function __webpack_require__(moduleId) { - if (installedModules[moduleId]) return installedModules[moduleId].exports; - var module = installedModules[moduleId] = { - i: moduleId, - l: !1, - exports: {} - }; - return modules[moduleId].call(module.exports, module, module.exports, __webpack_require__), - module.l = !0, module.exports; - } - var installedModules = {}; - __webpack_require__.m = modules, __webpack_require__.c = installedModules, __webpack_require__.d = function(exports, name, getter) { - __webpack_require__.o(exports, name) || Object.defineProperty(exports, name, { - configurable: !1, - enumerable: !0, - get: getter - }); - }, __webpack_require__.n = function(module) { - var getter = module && module.__esModule ? function() { - return module.default; - } : function() { - return module; - }; - return __webpack_require__.d(getter, "a", getter), getter; - }, __webpack_require__.o = function(object, property) { - return Object.prototype.hasOwnProperty.call(object, property); - }, __webpack_require__.p = "", __webpack_require__(__webpack_require__.s = 375); -}([ function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - "production" === process.env.NODE_ENV ? module.exports = __webpack_require__(376) : module.exports = __webpack_require__(377); - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - (function(process) { - if ("production" !== process.env.NODE_ENV) { - var REACT_ELEMENT_TYPE = "function" == typeof Symbol && Symbol.for && Symbol.for("react.element") || 60103, isValidElement = function(object) { - return "object" == typeof object && null !== object && object.$$typeof === REACT_ELEMENT_TYPE; - }; - module.exports = __webpack_require__(418)(isValidElement, !0); - } else module.exports = __webpack_require__(419)(); - }).call(exports, __webpack_require__(2)); -}, function(module, exports) { - function defaultSetTimout() { - throw new Error("setTimeout has not been defined"); - } - function defaultClearTimeout() { - throw new Error("clearTimeout has not been defined"); - } - function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) return setTimeout(fun, 0); - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) return cachedSetTimeout = setTimeout, - setTimeout(fun, 0); - try { - return cachedSetTimeout(fun, 0); - } catch (e) { - try { - return cachedSetTimeout.call(null, fun, 0); - } catch (e) { - return cachedSetTimeout.call(this, fun, 0); - } - } - } - function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) return clearTimeout(marker); - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) return cachedClearTimeout = clearTimeout, - clearTimeout(marker); - try { - return cachedClearTimeout(marker); - } catch (e) { - try { - return cachedClearTimeout.call(null, marker); - } catch (e) { - return cachedClearTimeout.call(this, marker); - } - } - } - function cleanUpNextTick() { - draining && currentQueue && (draining = !1, currentQueue.length ? queue = currentQueue.concat(queue) : queueIndex = -1, - queue.length && drainQueue()); - } - function drainQueue() { - if (!draining) { - var timeout = runTimeout(cleanUpNextTick); - draining = !0; - for (var len = queue.length; len; ) { - for (currentQueue = queue, queue = []; ++queueIndex < len; ) currentQueue && currentQueue[queueIndex].run(); - queueIndex = -1, len = queue.length; - } - currentQueue = null, draining = !1, runClearTimeout(timeout); - } - } - function Item(fun, array) { - this.fun = fun, this.array = array; - } - function noop() {} - var cachedSetTimeout, cachedClearTimeout, process = module.exports = {}; - !function() { - try { - cachedSetTimeout = "function" == typeof setTimeout ? setTimeout : defaultSetTimout; - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - cachedClearTimeout = "function" == typeof clearTimeout ? clearTimeout : defaultClearTimeout; - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } - }(); - var currentQueue, queue = [], draining = !1, queueIndex = -1; - process.nextTick = function(fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) for (var i = 1; i < arguments.length; i++) args[i - 1] = arguments[i]; - queue.push(new Item(fun, args)), 1 !== queue.length || draining || runTimeout(drainQueue); - }, Item.prototype.run = function() { - this.fun.apply(null, this.array); - }, process.title = "browser", process.browser = !0, process.env = {}, process.argv = [], - process.version = "", process.versions = {}, process.on = noop, process.addListener = noop, - process.once = noop, process.off = noop, process.removeListener = noop, process.removeAllListeners = noop, - process.emit = noop, process.prependListener = noop, process.prependOnceListener = noop, - process.listeners = function(name) { - return []; - }, process.binding = function(name) { - throw new Error("process.binding is not supported"); - }, process.cwd = function() { - return "/"; - }, process.chdir = function(dir) { - throw new Error("process.chdir is not supported"); - }, process.umask = function() { - return 0; - }; -}, function(module, exports, __webpack_require__) { - var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__; - !function() { - "use strict"; - function classNames() { - for (var classes = [], i = 0; i < arguments.length; i++) { - var arg = arguments[i]; - if (arg) { - var argType = typeof arg; - if ("string" === argType || "number" === argType) classes.push(arg); else if (Array.isArray(arg)) classes.push(classNames.apply(null, arg)); else if ("object" === argType) for (var key in arg) hasOwn.call(arg, key) && arg[key] && classes.push(key); - } - } - return classes.join(" "); - } - var hasOwn = {}.hasOwnProperty; - void 0 !== module && module.exports ? module.exports = classNames : (__WEBPACK_AMD_DEFINE_ARRAY__ = [], - void 0 !== (__WEBPACK_AMD_DEFINE_RESULT__ = function() { - return classNames; - }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); - }(); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _toConsumableArray(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - return arr2; - } - return Array.from(arr); - } - function _objectWithoutProperties(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - } - __webpack_require__.d(__webpack_exports__, "c", function() { - return PRESENTATION_ATTRIBUTES; - }), __webpack_require__.d(__webpack_exports__, "a", function() { - return EVENT_ATTRIBUTES; - }), __webpack_require__.d(__webpack_exports__, "d", function() { - return SCALE_TYPES; - }), __webpack_require__.d(__webpack_exports__, "b", function() { - return LEGEND_TYPES; - }), __webpack_require__.d(__webpack_exports__, "j", function() { - return getDisplayName; - }), __webpack_require__.d(__webpack_exports__, "h", function() { - return findAllByType; - }), __webpack_require__.d(__webpack_exports__, "i", function() { - return findChildByType; - }), __webpack_require__.d(__webpack_exports__, "k", function() { - return getPresentationAttributes; - }), __webpack_require__.d(__webpack_exports__, "e", function() { - return filterEventAttributes; - }), __webpack_require__.d(__webpack_exports__, "f", function() { - return filterEventsOfChild; - }), __webpack_require__.d(__webpack_exports__, "q", function() { - return validateWidthHeight; - }), __webpack_require__.d(__webpack_exports__, "n", function() { - return isSsr; - }), __webpack_require__.d(__webpack_exports__, "g", function() { - return filterSvgElements; - }), __webpack_require__.d(__webpack_exports__, "m", function() { - return isChildrenEqual; - }), __webpack_require__.d(__webpack_exports__, "p", function() { - return renderByOrder; - }), __webpack_require__.d(__webpack_exports__, "l", function() { - return getReactEventByType; - }), __webpack_require__.d(__webpack_exports__, "o", function() { - return parseChildIndex; - }); - var __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1_lodash_isString__ = __webpack_require__(173), __WEBPACK_IMPORTED_MODULE_1_lodash_isString___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isString__), __WEBPACK_IMPORTED_MODULE_2_lodash_isObject__ = __webpack_require__(32), __WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isObject__), __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7__DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_8__PureRender__ = __webpack_require__(5), PRESENTATION_ATTRIBUTES = { - alignmentBaseline: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - angle: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - baselineShift: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - clip: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - clipPath: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - clipRule: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - color: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - colorInterpolation: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - colorInterpolationFilters: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - colorProfile: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - colorRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - cursor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - direction: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "ltr", "rtl", "inherit" ]), - display: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - dominantBaseline: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - enableBackground: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - fill: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - fillOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]), - fillRule: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "nonzero", "evenodd", "inherit" ]), - filter: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - floodColor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - floodOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]), - font: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - fontFamily: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - fontSize: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - fontSizeAdjust: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - fontStretch: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "wider", "narrower", "ultra-condensed", "extra-condensed", "condensed", "semi-condensed", "semi-expanded", "expanded", "extra-expanded", "ultra-expanded", "inherit" ]), - fontStyle: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "italic", "oblique", "inherit" ]), - fontVariant: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "small-caps", "inherit" ]), - fontWeight: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "bold", "bolder", "lighter", 100, 200, 300, 400, 500, 600, 700, 800, 900, "inherit" ]), - glyphOrientationHorizontal: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - glyphOrientationVertical: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - imageRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "auto", "optimizeSpeed", "optimizeQuality", "inherit" ]), - kerning: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - letterSpacing: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - lightingColor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - markerEnd: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - markerMid: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - markerStart: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - mask: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - opacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - overflow: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "visible", "hidden", "scroll", "auto", "inherit" ]), - pointerEvents: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "visiblePainted", "visibleFill", "visibleStroke", "visible", "painted", "fill", "stroke", "all", "none", "inherit" ]), - shapeRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "auto", "optimizeSpeed", "crispEdges", "geometricPrecision", "inherit" ]), - stopColor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - stopOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - stroke: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - strokeDasharray: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - strokeDashoffset: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - strokeLinecap: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "butt", "round", "square", "inherit" ]), - strokeLinejoin: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "miter", "round", "bevel", "inherit" ]), - strokeMiterlimit: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - strokeOpacity: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - strokeWidth: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - textAnchor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "start", "middle", "end", "inherit" ]), - textDecoration: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "none", "underline", "overline", "line-through", "blink", "inherit" ]), - textRendering: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "auto", "optimizeSpeed", "optimizeLegibility", "geometricPrecision", "inherit" ]), - unicodeBidi: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "normal", "embed", "bidi-override", "inherit" ]), - visibility: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "visible", "hidden", "collapse", "inherit" ]), - wordSpacing: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - writingMode: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "lr-tb", "rl-tb", "tb-rl", "lr", "rl", "tb", "inherit" ]), - transform: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - style: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object, - width: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - height: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - dx: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - dy: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - x: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - y: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - r: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - radius: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.array ]) - }, EVENT_ATTRIBUTES = { - onClick: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseDown: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseUp: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseOver: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseMove: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseOut: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseEnter: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseLeave: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onTouchEnd: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onTouchMove: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onTouchStart: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onTouchCancel: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func - }, REACT_BROWSER_EVENT_MAP = { - click: "onClick", - mousedown: "onMouseDown", - mouseup: "onMouseUp", - mouseover: "onMouseOver", - mousemove: "onMouseMove", - mouseout: "onMouseOut", - mouseenter: "onMouseEnter", - mouseleave: "onMouseLeave", - touchcancel: "onTouchCancel", - touchend: "onTouchEnd", - touchmove: "onTouchMove", - touchstart: "onTouchStart" - }, SCALE_TYPES = [ "auto", "linear", "pow", "sqrt", "log", "identity", "time", "band", "point", "ordinal", "quantile", "quantize", "utcTime", "sequential", "threshold" ], LEGEND_TYPES = [ "plainline", "line", "square", "rect", "circle", "cross", "diamond", "star", "triangle", "wye", "none" ], getDisplayName = function(Comp) { - return Comp ? "string" == typeof Comp ? Comp : Comp.displayName || Comp.name || "Component" : ""; - }, findAllByType = function(children, type) { - var result = [], types = []; - return types = __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(type) ? type.map(function(t) { - return getDisplayName(t); - }) : [ getDisplayName(type) ], __WEBPACK_IMPORTED_MODULE_5_react___default.a.Children.forEach(children, function(child) { - var childType = child && child.type && (child.type.displayName || child.type.name); - -1 !== types.indexOf(childType) && result.push(child); - }), result; - }, findChildByType = function(children, type) { - var result = findAllByType(children, type); - return result && result[0]; - }, getPresentationAttributes = function(el) { - if (!el || __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default()(el)) return null; - var props = __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(el) ? el.props : el; - if (!__WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default()(props)) return null; - var out = null; - for (var i in props) ({}).hasOwnProperty.call(props, i) && PRESENTATION_ATTRIBUTES[i] && (out || (out = {}), - out[i] = props[i]); - return out; - }, getEventHandlerOfElement = function(originalHandler, props) { - return function(e) { - return originalHandler(props, e), null; - }; - }, filterEventAttributes = function(el, newHandler) { - var wrapCallback = arguments.length > 2 && void 0 !== arguments[2] && arguments[2]; - if (!el || __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default()(el)) return null; - var props = __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(el) ? el.props : el; - if (!__WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default()(props)) return null; - var out = null; - for (var i in props) ({}).hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i] && (out || (out = {}), - out[i] = newHandler || (wrapCallback ? getEventHandlerOfElement(props[i], props) : props[i])); - return out; - }, getEventHandlerOfChild = function(originalHandler, data, index) { - return function(e) { - return originalHandler(data, index, e), null; - }; - }, filterEventsOfChild = function(props, data, index) { - if (!__WEBPACK_IMPORTED_MODULE_2_lodash_isObject___default()(props)) return null; - var out = null; - for (var i in props) ({}).hasOwnProperty.call(props, i) && EVENT_ATTRIBUTES[i] && __WEBPACK_IMPORTED_MODULE_3_lodash_isFunction___default()(props[i]) && (out || (out = {}), - out[i] = getEventHandlerOfChild(props[i], data, index)); - return out; - }, validateWidthHeight = function(el) { - if (!el || !el.props) return !1; - var _el$props = el.props, width = _el$props.width, height = _el$props.height; - return !(!Object(__WEBPACK_IMPORTED_MODULE_7__DataUtils__.h)(width) || width <= 0 || !Object(__WEBPACK_IMPORTED_MODULE_7__DataUtils__.h)(height) || height <= 0); - }, isSsr = function() { - return !("undefined" != typeof window && window.document && window.document.createElement && window.setTimeout); - }, SVG_TAGS = [ "a", "altGlyph", "altGlyphDef", "altGlyphItem", "animate", "animateColor", "animateMotion", "animateTransform", "circle", "clipPath", "color-profile", "cursor", "defs", "desc", "ellipse", "feBlend", "feColormatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence", "filter", "font", "font-face", "font-face-format", "font-face-name", "font-face-url", "foreignObject", "g", "glyph", "glyphRef", "hkern", "image", "line", "lineGradient", "marker", "mask", "metadata", "missing-glyph", "mpath", "path", "pattern", "polygon", "polyline", "radialGradient", "rect", "script", "set", "stop", "style", "svg", "switch", "symbol", "text", "textPath", "title", "tref", "tspan", "use", "view", "vkern" ], isSvgElement = function(child) { - return child && child.type && __WEBPACK_IMPORTED_MODULE_1_lodash_isString___default()(child.type) && SVG_TAGS.indexOf(child.type) >= 0; - }, filterSvgElements = function(children) { - var svgElements = []; - return __WEBPACK_IMPORTED_MODULE_5_react___default.a.Children.forEach(children, function(entry) { - entry && entry.type && __WEBPACK_IMPORTED_MODULE_1_lodash_isString___default()(entry.type) && SVG_TAGS.indexOf(entry.type) >= 0 && svgElements.push(entry); - }), svgElements; - }, isSingleChildEqual = function(nextChild, prevChild) { - if (__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(nextChild) && __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(prevChild)) return !0; - if (!__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(nextChild) && !__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(prevChild)) { - var _ref = nextChild.props || {}, nextChildren = _ref.children, nextProps = _objectWithoutProperties(_ref, [ "children" ]), _ref2 = prevChild.props || {}, prevChildren = _ref2.children, prevProps = _objectWithoutProperties(_ref2, [ "children" ]); - return nextChildren && prevChildren ? Object(__WEBPACK_IMPORTED_MODULE_8__PureRender__.b)(nextProps, prevProps) && isChildrenEqual(nextChildren, prevChildren) : !nextChildren && !prevChildren && Object(__WEBPACK_IMPORTED_MODULE_8__PureRender__.b)(nextProps, prevProps); - } - return !1; - }, isChildrenEqual = function isChildrenEqual(nextChildren, prevChildren) { - if (nextChildren === prevChildren) return !0; - if (__WEBPACK_IMPORTED_MODULE_5_react__.Children.count(nextChildren) !== __WEBPACK_IMPORTED_MODULE_5_react__.Children.count(prevChildren)) return !1; - var count = __WEBPACK_IMPORTED_MODULE_5_react__.Children.count(nextChildren); - if (0 === count) return !0; - if (1 === count) return isSingleChildEqual(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(nextChildren) ? nextChildren[0] : nextChildren, __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(prevChildren) ? prevChildren[0] : prevChildren); - for (var i = 0; i < count; i++) { - var nextChild = nextChildren[i], prevChild = prevChildren[i]; - if (__WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(nextChild) || __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(prevChild)) { - if (!isChildrenEqual(nextChild, prevChild)) return !1; - } else if (!isSingleChildEqual(nextChild, prevChild)) return !1; - } - return !0; - }, renderByOrder = function(children, renderMap) { - var elements = [], record = {}; - return __WEBPACK_IMPORTED_MODULE_5_react__.Children.forEach(children, function(child, index) { - if (child && isSvgElement(child)) elements.push(child); else if (child && renderMap[getDisplayName(child.type)]) { - var displayName = getDisplayName(child.type), _renderMap$displayNam = renderMap[displayName], handler = _renderMap$displayNam.handler, once = _renderMap$displayNam.once; - if (once && !record[displayName] || !once) { - var results = handler(child, displayName, index); - __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(results) ? elements = [ elements ].concat(_toConsumableArray(results)) : elements.push(results), - record[displayName] = !0; - } - } - }), elements; - }, getReactEventByType = function(e) { - var type = e && e.type; - return type && REACT_BROWSER_EVENT_MAP[type] ? REACT_BROWSER_EVENT_MAP[type] : null; - }, parseChildIndex = function(child, children) { - var result = -1; - return __WEBPACK_IMPORTED_MODULE_5_react__.Children.forEach(children, function(entry, index) { - entry === child && (result = index); - }), result; - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function shallowEqual(a, b) { - for (var key in a) if ({}.hasOwnProperty.call(a, key) && (!{}.hasOwnProperty.call(b, key) || a[key] !== b[key])) return !1; - for (var _key in b) if ({}.hasOwnProperty.call(b, _key) && !{}.hasOwnProperty.call(a, _key)) return !1; - return !0; - } - function shouldComponentUpdate(props, state) { - return !shallowEqual(props, this.props) || !shallowEqual(state, this.state); - } - function pureRenderDecorator(component) { - component.prototype.shouldComponentUpdate = shouldComponentUpdate; - } - __webpack_exports__.b = shallowEqual, __webpack_exports__.a = pureRenderDecorator; -}, function(module, exports, __webpack_require__) { - "use strict"; - exports.__esModule = !0; - var _assign = __webpack_require__(222), _assign2 = function(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - }(_assign); - exports.default = _assign2.default || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - exports.__esModule = !0, exports.default = function(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - }; -}, function(module, exports, __webpack_require__) { - function isFunction(value) { - if (!isObject(value)) return !1; - var tag = baseGetTag(value); - return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; - } - var baseGetTag = __webpack_require__(41), isObject = __webpack_require__(32), asyncTag = "[object AsyncFunction]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", proxyTag = "[object Proxy]"; - module.exports = isFunction; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_require__.d(__webpack_exports__, "j", function() { - return mathSign; - }), __webpack_require__.d(__webpack_exports__, "i", function() { - return isPercent; - }), __webpack_require__.d(__webpack_exports__, "h", function() { - return isNumber; - }), __webpack_require__.d(__webpack_exports__, "g", function() { - return isNumOrStr; - }), __webpack_require__.d(__webpack_exports__, "k", function() { - return uniqueId; - }), __webpack_require__.d(__webpack_exports__, "d", function() { - return getPercentValue; - }), __webpack_require__.d(__webpack_exports__, "b", function() { - return getAnyElementOfObject; - }), __webpack_require__.d(__webpack_exports__, "e", function() { - return hasDuplicate; - }), __webpack_require__.d(__webpack_exports__, "f", function() { - return interpolateNumber; - }), __webpack_require__.d(__webpack_exports__, "a", function() { - return findEntryInArray; - }), __webpack_require__.d(__webpack_exports__, "c", function() { - return getLinearRegression; - }); - var __WEBPACK_IMPORTED_MODULE_0_lodash_get__ = __webpack_require__(174), __WEBPACK_IMPORTED_MODULE_0_lodash_get___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_get__), __WEBPACK_IMPORTED_MODULE_1_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_1_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__ = __webpack_require__(120), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__), __WEBPACK_IMPORTED_MODULE_3_lodash_isNumber__ = __webpack_require__(272), __WEBPACK_IMPORTED_MODULE_3_lodash_isNumber___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isNumber__), __WEBPACK_IMPORTED_MODULE_4_lodash_isString__ = __webpack_require__(173), __WEBPACK_IMPORTED_MODULE_4_lodash_isString___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isString__), mathSign = function(value) { - return 0 === value ? 0 : value > 0 ? 1 : -1; - }, isPercent = function(value) { - return __WEBPACK_IMPORTED_MODULE_4_lodash_isString___default()(value) && value.indexOf("%") === value.length - 1; - }, isNumber = function(value) { - return __WEBPACK_IMPORTED_MODULE_3_lodash_isNumber___default()(value) && !__WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default()(value); - }, isNumOrStr = function(value) { - return isNumber(value) || __WEBPACK_IMPORTED_MODULE_4_lodash_isString___default()(value); - }, idCounter = 0, uniqueId = function(prefix) { - var id = ++idCounter; - return "" + (prefix || "") + id; - }, getPercentValue = function(percent, totalValue) { - var defaultValue = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0, validate = arguments.length > 3 && void 0 !== arguments[3] && arguments[3]; - if (!isNumber(percent) && !__WEBPACK_IMPORTED_MODULE_4_lodash_isString___default()(percent)) return defaultValue; - var value = void 0; - if (isPercent(percent)) { - var index = percent.indexOf("%"); - value = totalValue * parseFloat(percent.slice(0, index)) / 100; - } else value = +percent; - return __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default()(value) && (value = defaultValue), - validate && value > totalValue && (value = totalValue), value; - }, getAnyElementOfObject = function(obj) { - if (!obj) return null; - var keys = Object.keys(obj); - return keys && keys.length ? obj[keys[0]] : null; - }, hasDuplicate = function(ary) { - if (!__WEBPACK_IMPORTED_MODULE_1_lodash_isArray___default()(ary)) return !1; - for (var len = ary.length, cache = {}, i = 0; i < len; i++) { - if (cache[ary[i]]) return !0; - cache[ary[i]] = !0; - } - return !1; - }, interpolateNumber = function(numberA, numberB) { - return isNumber(numberA) && isNumber(numberB) ? function(t) { - return numberA + t * (numberB - numberA); - } : function() { - return numberB; - }; - }, findEntryInArray = function(ary, specifiedKey, specifiedValue) { - return ary && ary.length ? ary.find(function(entry) { - return entry && __WEBPACK_IMPORTED_MODULE_0_lodash_get___default()(entry, specifiedKey) === specifiedValue; - }) : null; - }, getLinearRegression = function(data) { - if (!data || !data.length) return null; - for (var len = data.length, xsum = 0, ysum = 0, xysum = 0, xxsum = 0, xmin = 1 / 0, xmax = -1 / 0, i = 0; i < len; i++) xsum += data[i].cx, - ysum += data[i].cy, xysum += data[i].cx * data[i].cy, xxsum += data[i].cx * data[i].cx, - xmin = Math.min(xmin, data[i].cx), xmax = Math.max(xmax, data[i].cx); - var a = len * xxsum != xsum * xsum ? (len * xysum - xsum * ysum) / (len * xxsum - xsum * xsum) : 0; - return { - xmin: xmin, - xmax: xmax, - a: a, - b: (ysum - a * xsum) / len - }; - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - function getDefaultTheme() { - return defaultTheme || (defaultTheme = (0, _createMuiTheme2.default)()); - } - Object.defineProperty(exports, "__esModule", { - value: !0 - }), exports.sheetsManager = void 0; - var _keys = __webpack_require__(55), _keys2 = _interopRequireDefault(_keys), _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _getPrototypeOf = __webpack_require__(26), _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf), _classCallCheck2 = __webpack_require__(27), _classCallCheck3 = _interopRequireDefault(_classCallCheck2), _createClass2 = __webpack_require__(28), _createClass3 = _interopRequireDefault(_createClass2), _possibleConstructorReturn2 = __webpack_require__(29), _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2), _inherits2 = __webpack_require__(30), _inherits3 = _interopRequireDefault(_inherits2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2), _map = __webpack_require__(440), _map2 = _interopRequireDefault(_map), _minSafeInteger = __webpack_require__(456), _minSafeInteger2 = _interopRequireDefault(_minSafeInteger), _react = __webpack_require__(0), _react2 = _interopRequireDefault(_react), _propTypes = __webpack_require__(1), _propTypes2 = _interopRequireDefault(_propTypes), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _hoistNonReactStatics = __webpack_require__(162), _hoistNonReactStatics2 = _interopRequireDefault(_hoistNonReactStatics), _getDisplayName = __webpack_require__(244), _getDisplayName2 = _interopRequireDefault(_getDisplayName), _wrapDisplayName = __webpack_require__(79), _wrapDisplayName2 = _interopRequireDefault(_wrapDisplayName), _contextTypes = __webpack_require__(459), _contextTypes2 = _interopRequireDefault(_contextTypes), _jss = __webpack_require__(246), _ns = __webpack_require__(245), ns = function(obj) { - if (obj && obj.__esModule) return obj; - var newObj = {}; - if (null != obj) for (var key in obj) Object.prototype.hasOwnProperty.call(obj, key) && (newObj[key] = obj[key]); - return newObj.default = obj, newObj; - }(_ns), _jssPreset = __webpack_require__(481), _jssPreset2 = _interopRequireDefault(_jssPreset), _createMuiTheme = __webpack_require__(161), _createMuiTheme2 = _interopRequireDefault(_createMuiTheme), _themeListener = __webpack_require__(160), _themeListener2 = _interopRequireDefault(_themeListener), _createGenerateClassName = __webpack_require__(494), _createGenerateClassName2 = _interopRequireDefault(_createGenerateClassName), _getStylesCreator = __webpack_require__(495), _getStylesCreator2 = _interopRequireDefault(_getStylesCreator), jss = (0, - _jss.create)((0, _jssPreset2.default)()), generateClassName = (0, _createGenerateClassName2.default)(), indexCounter = _minSafeInteger2.default, sheetsManager = exports.sheetsManager = new _map2.default(), noopTheme = {}, defaultTheme = void 0, withStyles = function(stylesOrCreator) { - var options = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; - return function(Component) { - var _options$withTheme = options.withTheme, withTheme = void 0 !== _options$withTheme && _options$withTheme, _options$flip = options.flip, flip = void 0 === _options$flip ? null : _options$flip, name = options.name, styleSheetOptions = (0, - _objectWithoutProperties3.default)(options, [ "withTheme", "flip", "name" ]), stylesCreator = (0, - _getStylesCreator2.default)(stylesOrCreator), listenToTheme = stylesCreator.themingEnabled || withTheme || "string" == typeof name; - indexCounter += 1, stylesCreator.options.index = indexCounter, "production" !== process.env.NODE_ENV && (0, - _warning2.default)(indexCounter < 0, [ "Material-UI: you might have a memory leak.", "The indexCounter is not supposed to grow that much." ].join(" ")); - var WithStyles = function(_React$Component) { - function WithStyles(props, context) { - (0, _classCallCheck3.default)(this, WithStyles); - var _this = (0, _possibleConstructorReturn3.default)(this, (WithStyles.__proto__ || (0, - _getPrototypeOf2.default)(WithStyles)).call(this, props, context)); - _this.state = {}, _this.disableStylesGeneration = !1, _this.jss = null, _this.sheetOptions = null, - _this.sheetsManager = sheetsManager, _this.stylesCreatorSaved = null, _this.theme = null, - _this.unsubscribeId = null, _this.jss = _this.context[ns.jss] || jss; - var muiThemeProviderOptions = _this.context.muiThemeProviderOptions; - return muiThemeProviderOptions && (muiThemeProviderOptions.sheetsManager && (_this.sheetsManager = muiThemeProviderOptions.sheetsManager), - _this.disableStylesGeneration = muiThemeProviderOptions.disableStylesGeneration), - _this.stylesCreatorSaved = stylesCreator, _this.sheetOptions = (0, _extends3.default)({ - generateClassName: generateClassName - }, _this.context[ns.sheetOptions]), _this.theme = listenToTheme ? _themeListener2.default.initial(context) || getDefaultTheme() : noopTheme, - _this; - } - return (0, _inherits3.default)(WithStyles, _React$Component), (0, _createClass3.default)(WithStyles, [ { - key: "componentWillMount", - value: function() { - this.attach(this.theme); - } - }, { - key: "componentDidMount", - value: function() { - var _this2 = this; - listenToTheme && (this.unsubscribeId = _themeListener2.default.subscribe(this.context, function(theme) { - var oldTheme = _this2.theme; - _this2.theme = theme, _this2.attach(_this2.theme), _this2.setState({}, function() { - _this2.detach(oldTheme); - }); - })); - } - }, { - key: "componentWillReceiveProps", - value: function() { - this.stylesCreatorSaved !== stylesCreator && "production" !== process.env.NODE_ENV && (this.detach(this.theme), - this.stylesCreatorSaved = stylesCreator, this.attach(this.theme)); - } - }, { - key: "componentWillUnmount", - value: function() { - this.detach(this.theme), null !== this.unsubscribeId && _themeListener2.default.unsubscribe(this.context, this.unsubscribeId); - } - }, { - key: "attach", - value: function(theme) { - if (!this.disableStylesGeneration) { - var stylesCreatorSaved = this.stylesCreatorSaved, sheetManager = this.sheetsManager.get(stylesCreatorSaved); - sheetManager || (sheetManager = new _map2.default(), this.sheetsManager.set(stylesCreatorSaved, sheetManager)); - var sheetManagerTheme = sheetManager.get(theme); - if (sheetManagerTheme || (sheetManagerTheme = { - refs: 0, - sheet: null - }, sheetManager.set(theme, sheetManagerTheme)), 0 === sheetManagerTheme.refs) { - var styles = stylesCreatorSaved.create(theme, name), meta = name; - "production" === process.env.NODE_ENV || meta || (meta = (0, _getDisplayName2.default)(Component)); - var sheet = this.jss.createStyleSheet(styles, (0, _extends3.default)({ - meta: meta, - classNamePrefix: meta, - flip: "boolean" == typeof flip ? flip : "rtl" === theme.direction, - link: !1 - }, this.sheetOptions, stylesCreatorSaved.options, { - name: name - }, styleSheetOptions)); - sheetManagerTheme.sheet = sheet, sheet.attach(); - var sheetsRegistry = this.context[ns.sheetsRegistry]; - sheetsRegistry && sheetsRegistry.add(sheet); - } - sheetManagerTheme.refs += 1; - } - } - }, { - key: "detach", - value: function(theme) { - if (!this.disableStylesGeneration) { - var stylesCreatorSaved = this.stylesCreatorSaved, sheetManager = this.sheetsManager.get(stylesCreatorSaved), sheetManagerTheme = sheetManager.get(theme); - if (sheetManagerTheme.refs -= 1, 0 === sheetManagerTheme.refs) { - sheetManager.delete(theme), this.jss.removeStyleSheet(sheetManagerTheme.sheet); - var sheetsRegistry = this.context[ns.sheetsRegistry]; - sheetsRegistry && sheetsRegistry.remove(sheetManagerTheme.sheet); - } - } - } - }, { - key: "render", - value: function() { - var _this3 = this, _props = this.props, classesProp = _props.classes, innerRef = _props.innerRef, other = (0, - _objectWithoutProperties3.default)(_props, [ "classes", "innerRef" ]), classes = void 0, renderedClasses = {}; - if (!this.disableStylesGeneration) { - var sheetManager = this.sheetsManager.get(this.stylesCreatorSaved), sheetsManagerTheme = sheetManager.get(this.theme); - renderedClasses = sheetsManagerTheme.sheet.classes; - } - classes = classesProp ? (0, _extends3.default)({}, renderedClasses, (0, _keys2.default)(classesProp).reduce(function(accumulator, key) { - return "production" !== process.env.NODE_ENV && (0, _warning2.default)(renderedClasses[key] || _this3.disableStylesGeneration, [ "Material-UI: the key ` + ("`" + `" + key + "`)) + ("`" + (` provided to the classes property is not implemented in " + (0, - _getDisplayName2.default)(Component) + ".", "You can only override one of the following: " + (0, - _keys2.default)(renderedClasses).join(",") ].join("\n")), "production" !== process.env.NODE_ENV && (0, - _warning2.default)(!classesProp[key] || "string" == typeof classesProp[key], [ "Material-UI: the key ` + "`"))) + ((`" + key + "` + ("`" + ` provided to the classes property is not valid for " + (0, - _getDisplayName2.default)(Component) + ".", "You need to provide a non empty string instead of: " + classesProp[key] + "." ].join("\n")), - classesProp[key] && (accumulator[key] = renderedClasses[key] + " " + classesProp[key]), - accumulator; - }, {})) : renderedClasses; - var more = {}; - return withTheme && (more.theme = this.theme), _react2.default.createElement(Component, (0, - _extends3.default)({ - classes: classes - }, more, other, { - ref: innerRef - })); - } - } ]), WithStyles; - }(_react2.default.Component); - return WithStyles.propTypes = "production" !== process.env.NODE_ENV ? { - classes: _propTypes2.default.object, - innerRef: _propTypes2.default.func - } : {}, WithStyles.contextTypes = (0, _extends3.default)({ - muiThemeProviderOptions: _propTypes2.default.object - }, _contextTypes2.default, listenToTheme ? _themeListener2.default.contextTypes : {}), - "production" !== process.env.NODE_ENV && (WithStyles.displayName = (0, _wrapDisplayName2.default)(Component, "WithStyles")), - (0, _hoistNonReactStatics2.default)(WithStyles, Component), "production" !== process.env.NODE_ENV && (WithStyles.Naked = Component, - WithStyles.options = options), WithStyles; - }; - }; - exports.default = withStyles; - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - var warning = function() {}; - "production" !== process.env.NODE_ENV && (warning = function(condition, format, args) { - var len = arguments.length; - args = new Array(len > 2 ? len - 2 : 0); - for (var key = 2; key < len; key++) args[key - 2] = arguments[key]; - if (void 0 === format) throw new Error("`)) + ("`" + (`warning(condition, format, ...args)` + "`")))) + (((` requires a warning message argument"); - if (format.length < 10 || /^[s\W]*$/.test(format)) throw new Error("The warning format should be able to uniquely identify this warning. Please, use a more descriptive format than: " + format); - if (!condition) { - var argIndex = 0, message = "Warning: " + format.replace(/%s/g, function() { - return args[argIndex++]; - }); - "undefined" != typeof console && console.error(message); - try { - throw new Error(message); - } catch (x) {} - } - }), module.exports = warning; - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - "use strict"; - exports.__esModule = !0; - var _defineProperty = __webpack_require__(154), _defineProperty2 = function(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - }(_defineProperty); - exports.default = function(obj, key, value) { - return key in obj ? (0, _defineProperty2.default)(obj, key, { - value: value, - enumerable: !0, - configurable: !0, - writable: !0 - }) : obj[key] = value, obj; - }; -}, function(module, exports) { - var isArray = Array.isArray; - module.exports = isArray; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _objectWithoutProperties(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - } - function Layer(props) { - var children = props.children, className = props.className, others = _objectWithoutProperties(props, [ "children", "className" ]), layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-layer", className); - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("g", _extends({ - className: layerClass - }, others), children); - } - var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, propTypes = { - className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, - children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node ]) - }; - Layer.propTypes = propTypes, __webpack_exports__.a = Layer; -}, function(module, exports, __webpack_require__) { - var global = __webpack_require__(167), core = __webpack_require__(168), hide = __webpack_require__(266), redefine = __webpack_require__(581), ctx = __webpack_require__(584), $export = function(type, name, source) { - var key, own, out, exp, IS_FORCED = type & $export.F, IS_GLOBAL = type & $export.G, IS_STATIC = type & $export.S, IS_PROTO = type & $export.P, IS_BIND = type & $export.B, target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {}).prototype, exports = IS_GLOBAL ? core : core[name] || (core[name] = {}), expProto = exports.prototype || (exports.prototype = {}); - IS_GLOBAL && (source = name); - for (key in source) own = !IS_FORCED && target && void 0 !== target[key], out = (own ? target : source)[key], - exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && "function" == typeof out ? ctx(Function.call, out) : out, - target && redefine(target, key, out, type & $export.U), exports[key] != out && hide(exports, key, exp), - IS_PROTO && expProto[key] != out && (expProto[key] = out); - }; - global.core = core, $export.F = 1, $export.G = 2, $export.S = 4, $export.P = 8, - $export.B = 16, $export.W = 32, $export.U = 64, $export.R = 128, module.exports = $export; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _defineProperty(obj, key, value) { - return key in obj ? Object.defineProperty(obj, key, { - value: value, - enumerable: !0, - configurable: !0, - writable: !0 - }) : obj[key] = value, obj; - } - function _toConsumableArray(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - return arr2; - } - return Array.from(arr); - } - __webpack_require__.d(__webpack_exports__, "w", function() { - return getValueByDataKey; - }), __webpack_require__.d(__webpack_exports__, "n", function() { - return getDomainOfDataByKey; - }), __webpack_require__.d(__webpack_exports__, "b", function() { - return calculateActiveTickIndex; - }), __webpack_require__.d(__webpack_exports__, "r", function() { - return getMainColorOfGraphicItem; - }), __webpack_require__.d(__webpack_exports__, "q", function() { - return getLegendProps; - }), __webpack_require__.d(__webpack_exports__, "i", function() { - return getBarSizeList; - }), __webpack_require__.d(__webpack_exports__, "h", function() { - return getBarPosition; - }), __webpack_require__.d(__webpack_exports__, "a", function() { - return appendOffsetOfLegend; - }), __webpack_require__.d(__webpack_exports__, "z", function() { - return parseErrorBarsOfAxis; - }), __webpack_require__.d(__webpack_exports__, "o", function() { - return getDomainOfItemsWithSameAxis; - }), __webpack_require__.d(__webpack_exports__, "x", function() { - return isCategorialAxis; - }), __webpack_require__.d(__webpack_exports__, "m", function() { - return getCoordinatesOfGrid; - }), __webpack_require__.d(__webpack_exports__, "u", function() { - return getTicksOfAxis; - }), __webpack_require__.d(__webpack_exports__, "d", function() { - return combineEventHandlers; - }), __webpack_require__.d(__webpack_exports__, "A", function() { - return parseScale; - }), __webpack_require__.d(__webpack_exports__, "c", function() { - return checkDomainOfScale; - }), __webpack_require__.d(__webpack_exports__, "f", function() { - return findPositionOfBar; - }), __webpack_require__.d(__webpack_exports__, "C", function() { - return truncateByDomain; - }), __webpack_require__.d(__webpack_exports__, "s", function() { - return getStackGroupsByAxisId; - }), __webpack_require__.d(__webpack_exports__, "v", function() { - return getTicksOfScale; - }), __webpack_require__.d(__webpack_exports__, "l", function() { - return getCateCoordinateOfLine; - }), __webpack_require__.d(__webpack_exports__, "k", function() { - return getCateCoordinateOfBar; - }), __webpack_require__.d(__webpack_exports__, "j", function() { - return getBaseValueOfBar; - }), __webpack_require__.d(__webpack_exports__, "e", function() { - return detectReferenceElementsDomain; - }), __webpack_require__.d(__webpack_exports__, "t", function() { - return getStackedDataOfItem; - }), __webpack_require__.d(__webpack_exports__, "p", function() { - return getDomainOfStackGroups; - }), __webpack_require__.d(__webpack_exports__, "B", function() { - return parseSpecifiedDomain; - }), __webpack_require__.d(__webpack_exports__, "D", function() { - return validateCoordinateInRange; - }), __webpack_require__.d(__webpack_exports__, "g", function() { - return getBandSizeOfAxis; - }), __webpack_require__.d(__webpack_exports__, "y", function() { - return parseDomainOfCategoryAxis; - }); - var __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__ = __webpack_require__(45), __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isEqual__), __WEBPACK_IMPORTED_MODULE_1_lodash_sortBy__ = __webpack_require__(321), __WEBPACK_IMPORTED_MODULE_1_lodash_sortBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_sortBy__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__ = __webpack_require__(120), __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNaN__), __WEBPACK_IMPORTED_MODULE_3_lodash_isString__ = __webpack_require__(173), __WEBPACK_IMPORTED_MODULE_3_lodash_isString___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_isString__), __WEBPACK_IMPORTED_MODULE_4_lodash_max__ = __webpack_require__(841), __WEBPACK_IMPORTED_MODULE_4_lodash_max___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_max__), __WEBPACK_IMPORTED_MODULE_5_lodash_min__ = __webpack_require__(328), __WEBPACK_IMPORTED_MODULE_5_lodash_min___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_lodash_min__), __WEBPACK_IMPORTED_MODULE_6_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_7_lodash_flatMap__ = __webpack_require__(842), __WEBPACK_IMPORTED_MODULE_7_lodash_flatMap___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_lodash_flatMap__), __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_8_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_9_lodash_get__ = __webpack_require__(174), __WEBPACK_IMPORTED_MODULE_9_lodash_get___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_9_lodash_get__), __WEBPACK_IMPORTED_MODULE_10_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_10_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_11_recharts_scale__ = __webpack_require__(844), __WEBPACK_IMPORTED_MODULE_12_d3_scale__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_11_recharts_scale__), - __webpack_require__(331)), __WEBPACK_IMPORTED_MODULE_13_d3_shape__ = __webpack_require__(182), __WEBPACK_IMPORTED_MODULE_14__DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_15__cartesian_ReferenceDot__ = __webpack_require__(364), __WEBPACK_IMPORTED_MODULE_16__cartesian_ReferenceLine__ = __webpack_require__(365), __WEBPACK_IMPORTED_MODULE_17__cartesian_ReferenceArea__ = __webpack_require__(366), __WEBPACK_IMPORTED_MODULE_18__cartesian_ErrorBar__ = __webpack_require__(95), __WEBPACK_IMPORTED_MODULE_19__component_Legend__ = __webpack_require__(180), __WEBPACK_IMPORTED_MODULE_20__ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, getValueByDataKey = function(obj, dataKey, defaultValue) { - return __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(obj) || __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(dataKey) ? defaultValue : Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(dataKey) ? __WEBPACK_IMPORTED_MODULE_9_lodash_get___default()(obj, dataKey, defaultValue) : __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(dataKey) ? dataKey(obj) : defaultValue; - }, getDomainOfDataByKey = function(data, key, type, filterNil) { - var flattenData = __WEBPACK_IMPORTED_MODULE_7_lodash_flatMap___default()(data, function(entry) { - return getValueByDataKey(entry, key); - }); - if ("number" === type) { - var domain = flattenData.filter(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h); - return [ Math.min.apply(null, domain), Math.max.apply(null, domain) ]; - } - return (filterNil ? flattenData.filter(function(entry) { - return !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(entry); - }) : flattenData).map(function(entry) { - return Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(entry) ? entry : ""; - }); - }, calculateActiveTickIndex = function(coordinate, ticks, unsortedTicks, axis) { - var index = -1, len = ticks.length; - if (len > 1) { - if (axis && "angleAxis" === axis.axisType && Math.abs(Math.abs(axis.range[1] - axis.range[0]) - 360) <= 1e-6) for (var range = axis.range, i = 0; i < len; i++) { - var before = i > 0 ? unsortedTicks[i - 1].coordinate : unsortedTicks[len - 1].coordinate, cur = unsortedTicks[i].coordinate, after = i >= len - 1 ? unsortedTicks[0].coordinate : unsortedTicks[i + 1].coordinate, sameDirectionCoord = void 0; - if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(cur - before) !== Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(after - cur)) { - var diffInterval = []; - if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(after - cur) === Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(range[1] - range[0])) { - sameDirectionCoord = after; - var curInRange = cur + range[1] - range[0]; - diffInterval[0] = Math.min(curInRange, (curInRange + before) / 2), diffInterval[1] = Math.max(curInRange, (curInRange + before) / 2); - } else { - sameDirectionCoord = before; - var afterInRange = after + range[1] - range[0]; - diffInterval[0] = Math.min(cur, (afterInRange + cur) / 2), diffInterval[1] = Math.max(cur, (afterInRange + cur) / 2); - } - var sameInterval = [ Math.min(cur, (sameDirectionCoord + cur) / 2), Math.max(cur, (sameDirectionCoord + cur) / 2) ]; - if (coordinate > sameInterval[0] && coordinate <= sameInterval[1] || coordinate >= diffInterval[0] && coordinate <= diffInterval[1]) { - index = unsortedTicks[i].index; - break; - } - } else { - var min = Math.min(before, after), max = Math.max(before, after); - if (coordinate > (min + cur) / 2 && coordinate <= (max + cur) / 2) { - index = unsortedTicks[i].index; - break; - } - } - } else for (var _i = 0; _i < len; _i++) if (0 === _i && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i > 0 && _i < len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2 && coordinate <= (ticks[_i].coordinate + ticks[_i + 1].coordinate) / 2 || _i === len - 1 && coordinate > (ticks[_i].coordinate + ticks[_i - 1].coordinate) / 2) { - index = ticks[_i].index; - break; - } - } else index = 0; - return index; - }, getMainColorOfGraphicItem = function(item) { - var displayName = item.type.displayName, result = void 0; - switch (displayName) { - case "Line": - case "Area": - case "Radar": - result = item.props.stroke; - break; - - default: - result = item.props.fill; - } - return result; - }, getLegendProps = function(_ref) { - var children = _ref.children, formatedGraphicalItems = _ref.formatedGraphicalItems, legendWidth = _ref.legendWidth, legendContent = _ref.legendContent, legendItem = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_19__component_Legend__.a); - if (!legendItem) return null; - var legendData = void 0; - return legendData = legendItem.props && legendItem.props.payload ? legendItem.props && legendItem.props.payload : "children" === legendContent ? (formatedGraphicalItems || []).reduce(function(result, _ref2) { - var item = _ref2.item, props = _ref2.props, data = props.sectors || props.data || []; - return result.concat(data.map(function(entry) { - return { - type: legendItem.props.iconType || item.props.legendType, - value: entry.name, - color: entry.fill, - payload: entry - }; - })); - }, []) : (formatedGraphicalItems || []).map(function(_ref3) { - var item = _ref3.item, _item$props = item.props, dataKey = _item$props.dataKey, name = _item$props.name, legendType = _item$props.legendType; - return { - inactive: _item$props.hide, - dataKey: dataKey, - type: legendItem.props.iconType || legendType || "square", - color: getMainColorOfGraphicItem(item), - value: name || dataKey, - payload: item.props - }; - }), _extends({}, legendItem.props, __WEBPACK_IMPORTED_MODULE_19__component_Legend__.a.getWithHeight(legendItem, legendWidth), { - payload: legendData, - item: legendItem - }); - }, getBarSizeList = function(_ref4) { - var globalSize = _ref4.barSize, _ref4$stackGroups = _ref4.stackGroups, stackGroups = void 0 === _ref4$stackGroups ? {} : _ref4$stackGroups; - if (!stackGroups) return {}; - for (var result = {}, numericAxisIds = Object.keys(stackGroups), i = 0, len = numericAxisIds.length; i < len; i++) for (var sgs = stackGroups[numericAxisIds[i]].stackGroups, stackIds = Object.keys(sgs), j = 0, sLen = stackIds.length; j < sLen; j++) { - var _sgs$stackIds$j = sgs[stackIds[j]], items = _sgs$stackIds$j.items, cateAxisId = _sgs$stackIds$j.cateAxisId, barItems = items.filter(function(item) { - return Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.j)(item.type).indexOf("Bar") >= 0; - }); - if (barItems && barItems.length) { - var selfSize = barItems[0].props.barSize, cateId = barItems[0].props[cateAxisId]; - result[cateId] || (result[cateId] = []), result[cateId].push({ - item: barItems[0], - stackList: barItems.slice(1), - barSize: __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(selfSize) ? globalSize : selfSize - }); - } - } - return result; - }, getBarPosition = function(_ref5) { - var barGap = _ref5.barGap, barCategoryGap = _ref5.barCategoryGap, bandSize = _ref5.bandSize, _ref5$sizeList = _ref5.sizeList, sizeList = void 0 === _ref5$sizeList ? [] : _ref5$sizeList, maxBarSize = _ref5.maxBarSize, len = sizeList.length; - if (len < 1) return null; - var realBarGap = Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.d)(barGap, bandSize, 0, !0), result = void 0; - if (sizeList[0].barSize === +sizeList[0].barSize) { - var useFull = !1, fullBarSize = bandSize / len, sum = sizeList.reduce(function(res, entry) { - return res + entry.barSize || 0; - }, 0); - sum += (len - 1) * realBarGap, sum >= bandSize && (sum -= (len - 1) * realBarGap, - realBarGap = 0), sum >= bandSize && fullBarSize > 0 && (useFull = !0, fullBarSize *= .9, - sum = len * fullBarSize); - var offset = (bandSize - sum) / 2 >> 0, prev = { - offset: offset - realBarGap, - size: 0 - }; - result = sizeList.reduce(function(res, entry) { - var newRes = [].concat(_toConsumableArray(res), [ { - item: entry.item, - position: { - offset: prev.offset + prev.size + realBarGap, - size: useFull ? fullBarSize : entry.barSize - } - } ]); - return prev = newRes[newRes.length - 1].position, entry.stackList && entry.stackList.length && entry.stackList.forEach(function(item) { - newRes.push({ - item: item, - position: prev - }); - }), newRes; - }, []); - } else { - var _offset = Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.d)(barCategoryGap, bandSize, 0, !0); - bandSize - 2 * _offset - (len - 1) * realBarGap <= 0 && (realBarGap = 0); - var originalSize = (bandSize - 2 * _offset - (len - 1) * realBarGap) / len; - originalSize > 1 && (originalSize >>= 0); - var size = maxBarSize === +maxBarSize ? Math.min(originalSize, maxBarSize) : originalSize; - result = sizeList.reduce(function(res, entry, i) { - var newRes = [].concat(_toConsumableArray(res), [ { - item: entry.item, - position: { - offset: _offset + (originalSize + realBarGap) * i + (originalSize - size) / 2, - size: size - } - } ]); - return entry.stackList && entry.stackList.length && entry.stackList.forEach(function(item) { - newRes.push({ - item: item, - position: newRes[newRes.length - 1].position - }); - }), newRes; - }, []); - } - return result; - }, appendOffsetOfLegend = function(offset, items, props, legendBox) { - var children = props.children, width = props.width, height = props.height, margin = props.margin, legendWidth = width - (margin.left || 0) - (margin.right || 0), legendHeight = height - (margin.top || 0) - (margin.bottom || 0), legendProps = getLegendProps({ - children: children, - items: items, - legendWidth: legendWidth, - legendHeight: legendHeight - }), newOffset = offset; - if (legendProps) { - var box = legendBox || {}, align = legendProps.align, verticalAlign = legendProps.verticalAlign, layout = legendProps.layout; - ("vertical" === layout || "horizontal" === layout && "center" === verticalAlign) && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(offset[align]) && (newOffset = _extends({}, offset, _defineProperty({}, align, newOffset[align] + (box.width || 0)))), - ("horizontal" === layout || "vertical" === layout && "center" === align) && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(offset[verticalAlign]) && (newOffset = _extends({}, offset, _defineProperty({}, verticalAlign, newOffset[verticalAlign] + (box.height || 0)))); - } - return newOffset; - }, getDomainOfErrorBars = function(data, item, dataKey, axisType) { - var children = item.props.children, errorBars = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_18__cartesian_ErrorBar__.a).filter(function(errorBarChild) { - var direction = errorBarChild.props.direction; - return !(!__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(direction) && !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(axisType)) || axisType.indexOf(direction) >= 0; - }); - if (errorBars && errorBars.length) { - var keys = errorBars.map(function(errorBarChild) { - return errorBarChild.props.dataKey; - }); - return data.reduce(function(result, entry) { - var entryValue = getValueByDataKey(entry, dataKey, 0), mainValue = __WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(entryValue) ? [ __WEBPACK_IMPORTED_MODULE_5_lodash_min___default()(entryValue), __WEBPACK_IMPORTED_MODULE_4_lodash_max___default()(entryValue) ] : [ entryValue, entryValue ], errorDomain = keys.reduce(function(prevErrorArr, k) { - var errorValue = getValueByDataKey(entry, k, 0), lowerValue = mainValue[0] - Math.abs(__WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(errorValue) ? errorValue[0] : errorValue), upperValue = mainValue[1] + Math.abs(__WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(errorValue) ? errorValue[1] : errorValue); - return [ Math.min(lowerValue, prevErrorArr[0]), Math.max(upperValue, prevErrorArr[1]) ]; - }, [ 1 / 0, -1 / 0 ]); - return [ Math.min(errorDomain[0], result[0]), Math.max(errorDomain[1], result[1]) ]; - }, [ 1 / 0, -1 / 0 ]); - } - return null; - }, parseErrorBarsOfAxis = function(data, items, dataKey, axisType) { - var domains = items.map(function(item) { - return getDomainOfErrorBars(data, item, dataKey, axisType); - }).filter(function(entry) { - return !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(entry); - }); - return domains && domains.length ? domains.reduce(function(result, entry) { - return [ Math.min(result[0], entry[0]), Math.max(result[1], entry[1]) ]; - }, [ 1 / 0, -1 / 0 ]) : null; - }, getDomainOfItemsWithSameAxis = function(data, items, type, filterNil) { - var domains = items.map(function(item) { - var dataKey = item.props.dataKey; - return "number" === type && dataKey ? getDomainOfErrorBars(data, item, dataKey) || getDomainOfDataByKey(data, dataKey, type, filterNil) : getDomainOfDataByKey(data, dataKey, type, filterNil); - }); - if ("number" === type) return domains.reduce(function(result, entry) { - return [ Math.min(result[0], entry[0]), Math.max(result[1], entry[1]) ]; - }, [ 1 / 0, -1 / 0 ]); - var tag = {}; - return domains.reduce(function(result, entry) { - for (var i = 0, len = entry.length; i < len; i++) tag[entry[i]] || (tag[entry[i]] = !0, - result.push(entry[i])); - return result; - }, []); - }, isCategorialAxis = function(layout, axisType) { - return "horizontal" === layout && "xAxis" === axisType || "vertical" === layout && "yAxis" === axisType || "centric" === layout && "angleAxis" === axisType || "radial" === layout && "radiusAxis" === axisType; - }, getCoordinatesOfGrid = function(ticks, min, max) { - var hasMin = void 0, hasMax = void 0, values = ticks.map(function(entry) { - return entry.coordinate === min && (hasMin = !0), entry.coordinate === max && (hasMax = !0), - entry.coordinate; - }); - return hasMin || values.push(min), hasMax || values.push(max), values; - }, getTicksOfAxis = function(axis, isGrid, isAll) { - if (!axis) return null; - var scale = axis.scale, duplicateDomain = axis.duplicateDomain, type = axis.type, range = axis.range, offset = (isGrid || isAll) && "category" === type && scale.bandwidth ? scale.bandwidth() / 2 : 0; - return offset = "angleAxis" === axis.axisType ? 2 * Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.j)(range[0] - range[1]) * offset : offset, - isGrid && (axis.ticks || axis.niceTicks) ? (axis.ticks || axis.niceTicks).map(function(entry) { - var scaleContent = duplicateDomain ? duplicateDomain.indexOf(entry) : entry; - return { - coordinate: scale(scaleContent) + offset, - value: entry, - offset: offset - }; - }) : axis.isCategorial && axis.categoricalDomain ? axis.categoricalDomain.map(function(entry, index) { - return { - coordinate: scale(entry), - value: entry, - index: index, - offset: offset - }; - }) : scale.ticks && !isAll ? scale.ticks(axis.tickCount).map(function(entry) { - return { - coordinate: scale(entry) + offset, - value: entry, - offset: offset - }; - }) : scale.domain().map(function(entry, index) { - return { - coordinate: scale(entry) + offset, - value: duplicateDomain ? duplicateDomain[entry] : entry, - index: index, - offset: offset - }; - }); - }, combineEventHandlers = function(defaultHandler, parentHandler, childHandler) { - var customizedHandler = void 0; - return __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(childHandler) ? customizedHandler = childHandler : __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(parentHandler) && (customizedHandler = parentHandler), - __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(defaultHandler) || customizedHandler ? function(arg1, arg2, arg3, arg4) { - __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(defaultHandler) && defaultHandler(arg1, arg2, arg3, arg4), - __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(customizedHandler) && customizedHandler(arg1, arg2, arg3, arg4); - } : null; - }, parseScale = function(axis, chartType) { - var scale = axis.scale, type = axis.type, layout = axis.layout, axisType = axis.axisType; - if ("auto" === scale) return "radial" === layout && "radiusAxis" === axisType ? { - scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleBand(), - realScaleType: "band" - } : "radial" === layout && "angleAxis" === axisType ? { - scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleLinear(), - realScaleType: "linear" - } : "category" === type && chartType && (chartType.indexOf("LineChart") >= 0 || chartType.indexOf("AreaChart") >= 0) ? { - scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scalePoint(), - realScaleType: "point" - } : "category" === type ? { - scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleBand(), - realScaleType: "band" - } : { - scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scaleLinear(), - realScaleType: "linear" - }; - if (__WEBPACK_IMPORTED_MODULE_3_lodash_isString___default()(scale)) { - var name = "scale" + scale.slice(0, 1).toUpperCase() + scale.slice(1); - return { - scale: (__WEBPACK_IMPORTED_MODULE_12_d3_scale__[name] || __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scalePoint)(), - realScaleType: __WEBPACK_IMPORTED_MODULE_12_d3_scale__[name] ? name : "point" - }; - } - return __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(scale) ? { - scale: scale - } : { - scale: __WEBPACK_IMPORTED_MODULE_12_d3_scale__.scalePoint(), - realScaleType: "point" - }; - }, checkDomainOfScale = function(scale) { - var domain = scale.domain(); - if (domain && !(domain.length <= 2)) { - var len = domain.length, range = scale.range(), min = Math.min(range[0], range[1]) - 1e-4, max = Math.max(range[0], range[1]) + 1e-4, first = scale(domain[0]), last = scale(domain[len - 1]); - (first < min || first > max || last < min || last > max) && scale.domain([ domain[0], domain[len - 1] ]); - } - }, findPositionOfBar = function(barPosition, child) { - if (!barPosition) return null; - for (var i = 0, len = barPosition.length; i < len; i++) if (barPosition[i].item === child) return barPosition[i].position; - return null; - }, truncateByDomain = function(value, domain) { - if (!domain || 2 !== domain.length || !Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(domain[0]) || !Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(domain[1])) return value; - var min = Math.min(domain[0], domain[1]), max = Math.max(domain[0], domain[1]), result = [ value[0], value[1] ]; - return (!Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(value[0]) || value[0] < min) && (result[0] = min), - (!Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(value[1]) || value[1] > max) && (result[1] = max), - result[0] > max && (result[0] = max), result[1] < min && (result[1] = min), result; - }, offsetSign = function(series) { - var n = series.length; - if (!(n <= 0)) for (var j = 0, m = series[0].length; j < m; ++j) for (var positive = 0, negative = 0, i = 0; i < n; ++i) { - var value = __WEBPACK_IMPORTED_MODULE_2_lodash_isNaN___default()(series[i][j][1]) ? series[i][j][0] : series[i][j][1]; - value >= 0 ? (series[i][j][0] = positive, series[i][j][1] = positive + value, positive = series[i][j][1]) : (series[i][j][0] = negative, - series[i][j][1] = negative + value, negative = series[i][j][1]); - } - }, STACK_OFFSET_MAP = { - sign: offsetSign, - expand: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.o, - none: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.p, - silhouette: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.q, - wiggle: __WEBPACK_IMPORTED_MODULE_13_d3_shape__.r - }, getStackedData = function(data, stackItems, offsetType) { - var dataKeys = stackItems.map(function(item) { - return item.props.dataKey; - }); - return Object(__WEBPACK_IMPORTED_MODULE_13_d3_shape__.n)().keys(dataKeys).value(function(d, key) { - return +getValueByDataKey(d, key, 0); - }).order(__WEBPACK_IMPORTED_MODULE_13_d3_shape__.s).offset(STACK_OFFSET_MAP[offsetType])(data); - }, getStackGroupsByAxisId = function(data, _items, numericAxisId, cateAxisId, offsetType, reverseStackOrder) { - if (!data) return null; - var items = reverseStackOrder ? _items.reverse() : _items, stackGroups = items.reduce(function(result, item) { - var _item$props2 = item.props, stackId = _item$props2.stackId; - if (_item$props2.hide) return result; - var axisId = item.props[numericAxisId], parentGroup = result[axisId] || { - hasStack: !1, - stackGroups: {} - }; - if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(stackId)) { - var childGroup = parentGroup.stackGroups[stackId] || { - numericAxisId: numericAxisId, - cateAxisId: cateAxisId, - items: [] - }; - childGroup.items.push(item), parentGroup.hasStack = !0, parentGroup.stackGroups[stackId] = childGroup; - } else parentGroup.stackGroups[Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.k)("_stackId_")] = { - numericAxisId: numericAxisId, - cateAxisId: cateAxisId, - items: [ item ] - }; - return _extends({}, result, _defineProperty({}, axisId, parentGroup)); - }, {}); - return Object.keys(stackGroups).reduce(function(result, axisId) { - var group = stackGroups[axisId]; - return group.hasStack && (group.stackGroups = Object.keys(group.stackGroups).reduce(function(res, stackId) { - var g = group.stackGroups[stackId]; - return _extends({}, res, _defineProperty({}, stackId, { - numericAxisId: numericAxisId, - cateAxisId: cateAxisId, - items: g.items, - stackedData: getStackedData(data, g.items, offsetType) - })); - }, {})), _extends({}, result, _defineProperty({}, axisId, group)); - }, {}); - }, calculateDomainOfTicks = function(ticks, type) { - return "number" === type ? [ Math.min.apply(null, ticks), Math.max.apply(null, ticks) ] : ticks; - }, getTicksOfScale = function(scale, opts) { - var realScaleType = opts.realScaleType, type = opts.type, tickCount = opts.tickCount, originalDomain = opts.originalDomain, allowDecimals = opts.allowDecimals, scaleType = realScaleType || opts.scale; - if ("auto" !== scaleType && "linear" !== scaleType) return null; - if (tickCount && "number" === type && originalDomain && ("auto" === originalDomain[0] || "auto" === originalDomain[1])) { - var domain = scale.domain(), tickValues = Object(__WEBPACK_IMPORTED_MODULE_11_recharts_scale__.getNiceTickValues)(domain, tickCount, allowDecimals); - return scale.domain(calculateDomainOfTicks(tickValues, type)), { - niceTicks: tickValues - }; - } - if (tickCount && "number" === type) { - var _domain = scale.domain(); - return { - niceTicks: Object(__WEBPACK_IMPORTED_MODULE_11_recharts_scale__.getTickValuesFixedDomain)(_domain, tickCount, allowDecimals) - }; - } - return null; - }, getCateCoordinateOfLine = function(_ref6) { - var axis = _ref6.axis, ticks = _ref6.ticks, bandSize = _ref6.bandSize, entry = _ref6.entry, index = _ref6.index; - if ("category" === axis.type) { - if (!axis.allowDuplicatedCategory && axis.dataKey && !__WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(entry[axis.dataKey])) { - var matchedTick = Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.a)(ticks, "value", entry[axis.dataKey]); - if (matchedTick) return matchedTick.coordinate + bandSize / 2; - } - return ticks[index] ? ticks[index].coordinate + bandSize / 2 : null; - } - var value = getValueByDataKey(entry, axis.dataKey); - return __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(value) ? null : axis.scale(value); - }, getCateCoordinateOfBar = function(_ref7) { - var axis = _ref7.axis, ticks = _ref7.ticks, offset = _ref7.offset, bandSize = _ref7.bandSize, entry = _ref7.entry, index = _ref7.index; - if ("category" === axis.type) return ticks[index] ? ticks[index].coordinate + offset : null; - var value = getValueByDataKey(entry, axis.dataKey, axis.domain[index]); - return __WEBPACK_IMPORTED_MODULE_10_lodash_isNil___default()(value) ? null : axis.scale(value) - bandSize / 2 + offset; - }, getBaseValueOfBar = function(_ref8) { - var numericAxis = _ref8.numericAxis, domain = numericAxis.scale.domain(); - if ("number" === numericAxis.type) { - var min = Math.min(domain[0], domain[1]), max = Math.max(domain[0], domain[1]); - return min <= 0 && max >= 0 ? 0 : max < 0 ? max : min; - } - return domain[0]; - }, detectReferenceElementsDomain = function(children, domain, axisId, axisType, specifiedTicks) { - var lines = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_16__cartesian_ReferenceLine__.a), dots = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_15__cartesian_ReferenceDot__.a), elements = lines.concat(dots), areas = Object(__WEBPACK_IMPORTED_MODULE_20__ReactUtils__.h)(children, __WEBPACK_IMPORTED_MODULE_17__cartesian_ReferenceArea__.a), idKey = axisType + "Id", valueKey = axisType[0], finalDomain = domain; - if (elements.length && (finalDomain = elements.reduce(function(result, el) { - if (el.props[idKey] === axisId && el.props.alwaysShow && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(el.props[valueKey])) { - var value = el.props[valueKey]; - return [ Math.min(result[0], value), Math.max(result[1], value) ]; - } - return result; - }, finalDomain)), areas.length) { - var key1 = valueKey + "1", key2 = valueKey + "2"; - finalDomain = areas.reduce(function(result, el) { - if (el.props[idKey] === axisId && el.props.alwaysShow && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(el.props[key1]) && Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(el.props[key2])) { - var value1 = el.props[key1], value2 = el.props[key2]; - return [ Math.min(result[0], value1, value2), Math.max(result[1], value1, value2) ]; - } - return result; - }, finalDomain); - } - return specifiedTicks && specifiedTicks.length && (finalDomain = specifiedTicks.reduce(function(result, tick) { - return Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(tick) ? [ Math.min(result[0], tick), Math.max(result[1], tick) ] : result; - }, finalDomain)), finalDomain; - }, getStackedDataOfItem = function(item, stackGroups) { - var stackId = item.props.stackId; - if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.g)(stackId)) { - var group = stackGroups[stackId]; - if (group && group.items.length) { - for (var itemIndex = -1, i = 0, len = group.items.length; i < len; i++) if (group.items[i] === item) { - itemIndex = i; - break; - } - return itemIndex >= 0 ? group.stackedData[itemIndex] : null; - } - } - return null; - }, getDomainOfSingle = function(data) { - return data.reduce(function(result, entry) { - return [ Math.min.apply(null, entry.concat([ result[0] ]).filter(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)), Math.max.apply(null, entry.concat([ result[1] ]).filter(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)) ]; - }, [ 1 / 0, -1 / 0 ]); - }, getDomainOfStackGroups = function(stackGroups, startIndex, endIndex) { - return Object.keys(stackGroups).reduce(function(result, stackId) { - var group = stackGroups[stackId], stackedData = group.stackedData, domain = stackedData.reduce(function(res, entry) { - var s = getDomainOfSingle(entry.slice(startIndex, endIndex + 1)); - return [ Math.min(res[0], s[0]), Math.max(res[1], s[1]) ]; - }, [ 1 / 0, -1 / 0 ]); - return [ Math.min(domain[0], result[0]), Math.max(domain[1], result[1]) ]; - }, [ 1 / 0, -1 / 0 ]).map(function(result) { - return result === 1 / 0 || result === -1 / 0 ? 0 : result; - }); - }, MIN_VALUE_REG = /^dataMin[\s]*-[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/, MAX_VALUE_REG = /^dataMax[\s]*\+[\s]*([0-9]+([.]{1}[0-9]+){0,1})$/, parseSpecifiedDomain = function(specifiedDomain, dataDomain, allowDataOverflow) { - if (!__WEBPACK_IMPORTED_MODULE_6_lodash_isArray___default()(specifiedDomain)) return dataDomain; - var domain = []; - if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(specifiedDomain[0])) domain[0] = allowDataOverflow ? specifiedDomain[0] : Math.min(specifiedDomain[0], dataDomain[0]); else if (MIN_VALUE_REG.test(specifiedDomain[0])) { - var value = +MIN_VALUE_REG.exec(specifiedDomain[0])[1]; - domain[0] = dataDomain[0] - value; - } else __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(specifiedDomain[0]) ? domain[0] = specifiedDomain[0](dataDomain[0]) : domain[0] = dataDomain[0]; - if (Object(__WEBPACK_IMPORTED_MODULE_14__DataUtils__.h)(specifiedDomain[1])) domain[1] = allowDataOverflow ? specifiedDomain[1] : Math.max(specifiedDomain[1], dataDomain[1]); else if (MAX_VALUE_REG.test(specifiedDomain[1])) { - var _value = +MAX_VALUE_REG.exec(specifiedDomain[1])[1]; - domain[1] = dataDomain[1] + _value; - } else __WEBPACK_IMPORTED_MODULE_8_lodash_isFunction___default()(specifiedDomain[1]) ? domain[1] = specifiedDomain[1](dataDomain[1]) : domain[1] = dataDomain[1]; - return domain; - }, validateCoordinateInRange = function(coordinate, scale) { - if (!scale) return !1; - var range = scale.range(), first = range[0], last = range[range.length - 1]; - return first <= last ? coordinate >= first && coordinate <= last : coordinate >= last && coordinate <= first; - }, getBandSizeOfAxis = function(axis, ticks) { - if (axis && axis.scale && axis.scale.bandwidth) return axis.scale.bandwidth(); - if (axis && ticks && ticks.length >= 2) { - for (var orderedTicks = __WEBPACK_IMPORTED_MODULE_1_lodash_sortBy___default()(ticks, function(o) { - return o.coordinate; - }), bandSize = 1 / 0, i = 1, len = orderedTicks.length; i < len; i++) { - var cur = orderedTicks[i], prev = orderedTicks[i - 1]; - bandSize = Math.min((cur.coordinate || 0) - (prev.coordinate || 0), bandSize); - } - return bandSize === 1 / 0 ? 0 : bandSize; - } - return 0; - }, parseDomainOfCategoryAxis = function(specifiedDomain, calculatedDomain, axisChild) { - return specifiedDomain && specifiedDomain.length ? __WEBPACK_IMPORTED_MODULE_0_lodash_isEqual___default()(specifiedDomain, __WEBPACK_IMPORTED_MODULE_9_lodash_get___default()(axisChild, "type.defaultProps.domain")) ? calculatedDomain : specifiedDomain : calculatedDomain; - }; -}, function(module, exports) { - var core = module.exports = { - version: "2.5.7" - }; - "number" == typeof __e && (__e = core); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function newInterval(floori, offseti, count, field) { - function interval(date) { - return floori(date = new Date(+date)), date; - } - return interval.floor = interval, interval.ceil = function(date) { - return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; - }, interval.round = function(date) { - var d0 = interval(date), d1 = interval.ceil(date); - return date - d0 < d1 - date ? d0 : d1; - }, interval.offset = function(date, step) { - return offseti(date = new Date(+date), null == step ? 1 : Math.floor(step)), date; - }, interval.range = function(start, stop, step) { - var previous, range = []; - if (start = interval.ceil(start), step = null == step ? 1 : Math.floor(step), !(start < stop && step > 0)) return range; - do { - range.push(previous = new Date(+start)), offseti(start, step), floori(start); - } while (previous < start && start < stop); - return range; - }, interval.filter = function(test) { - return newInterval(function(date) { - if (date >= date) for (;floori(date), !test(date); ) date.setTime(date - 1); - }, function(date, step) { - if (date >= date) if (step < 0) for (;++step <= 0; ) for (;offseti(date, -1), !test(date); ) ; else for (;--step >= 0; ) for (;offseti(date, 1), - !test(date); ) ; - }); - }, count && (interval.count = function(start, end) { - return t0.setTime(+start), t1.setTime(+end), floori(t0), floori(t1), Math.floor(count(t0, t1)); - }, interval.every = function(step) { - return step = Math.floor(step), isFinite(step) && step > 0 ? step > 1 ? interval.filter(field ? function(d) { - return field(d) % step == 0; - } : function(d) { - return interval.count(0, d) % step == 0; - }) : interval : null; - }), interval; - } - __webpack_exports__.a = newInterval; - var t0 = new Date(), t1 = new Date(); -}, function(module, exports, __webpack_require__) { - var global = __webpack_require__(24), core = __webpack_require__(17), ctx = __webpack_require__(51), hide = __webpack_require__(39), has = __webpack_require__(54), $export = function(type, name, source) { - var key, own, out, IS_FORCED = type & $export.F, IS_GLOBAL = type & $export.G, IS_STATIC = type & $export.S, IS_PROTO = type & $export.P, IS_BIND = type & $export.B, IS_WRAP = type & $export.W, exports = IS_GLOBAL ? core : core[name] || (core[name] = {}), expProto = exports.prototype, target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {}).prototype; - IS_GLOBAL && (source = name); - for (key in source) (own = !IS_FORCED && target && void 0 !== target[key]) && has(exports, key) || (out = own ? target[key] : source[key], - exports[key] = IS_GLOBAL && "function" != typeof target[key] ? source[key] : IS_BIND && own ? ctx(out, global) : IS_WRAP && target[key] == out ? function(C) { - var F = function(a, b, c) { - if (this instanceof C) { - switch (arguments.length) { - case 0: - return new C(); - - case 1: - return new C(a); - - case 2: - return new C(a, b); - } - return new C(a, b, c); - } - return C.apply(this, arguments); - }; - return F.prototype = C.prototype, F; - }(out) : IS_PROTO && "function" == typeof out ? ctx(Function.call, out) : out, IS_PROTO && ((exports.virtual || (exports.virtual = {}))[key] = out, - type & $export.R && expProto && !expProto[key] && hide(expProto, key, out))); - }; - $export.F = 1, $export.G = 2, $export.S = 4, $export.P = 8, $export.B = 16, $export.W = 32, - $export.U = 64, $export.R = 128, module.exports = $export; -}, function(module, exports) { - function isNil(value) { - return null == value; - } - module.exports = isNil; -}, function(module, exports, __webpack_require__) { - var store = __webpack_require__(151)("wks"), uid = __webpack_require__(103), Symbol = __webpack_require__(24).Symbol, USE_SYMBOL = "function" == typeof Symbol; - (module.exports = function(name) { - return store[name] || (store[name] = USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)("Symbol." + name)); - }).store = store; -}, function(module, exports, __webpack_require__) { - var anObject = __webpack_require__(52), IE8_DOM_DEFINE = __webpack_require__(224), toPrimitive = __webpack_require__(145), dP = Object.defineProperty; - exports.f = __webpack_require__(25) ? Object.defineProperty : function(O, P, Attributes) { - if (anObject(O), P = toPrimitive(P, !0), anObject(Attributes), IE8_DOM_DEFINE) try { - return dP(O, P, Attributes); - } catch (e) {} - if ("get" in Attributes || "set" in Attributes) throw TypeError("Accessors not supported!"); - return "value" in Attributes && (O[P] = Attributes.value), O; - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _defineProperty(obj, key, value) { - return key in obj ? Object.defineProperty(obj, key, { - value: value, - enumerable: !0, - configurable: !0, - writable: !0 - }) : obj[key] = value, obj; - } - __webpack_require__.d(__webpack_exports__, "a", function() { - return RADIAN; - }), __webpack_require__.d(__webpack_exports__, "e", function() { - return polarToCartesian; - }), __webpack_require__.d(__webpack_exports__, "c", function() { - return getMaxRadius; - }), __webpack_require__.d(__webpack_exports__, "b", function() { - return formatAxisMap; - }), __webpack_require__.d(__webpack_exports__, "d", function() { - return inRangeOfSector; - }); - var __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1__DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_2__ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, RADIAN = Math.PI / 180, radianToDegree = function(angleInRadian) { - return 180 * angleInRadian / Math.PI; - }, polarToCartesian = function(cx, cy, radius, angle) { - return { - x: cx + Math.cos(-RADIAN * angle) * radius, - y: cy + Math.sin(-RADIAN * angle) * radius - }; - }, getMaxRadius = function(width, height) { - var offset = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : { - top: 0, - right: 0, - bottom: 0, - left: 0 - }; - return Math.min(Math.abs(width - (offset.left || 0) - (offset.right || 0)), Math.abs(height - (offset.top || 0) - (offset.bottom || 0))) / 2; - }, formatAxisMap = function(props, axisMap, offset, axisType, chartName) { - var width = props.width, height = props.height, startAngle = props.startAngle, endAngle = props.endAngle, cx = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.cx, width, width / 2), cy = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.cy, height, height / 2), maxRadius = getMaxRadius(width, height, offset), innerRadius = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.innerRadius, maxRadius, 0), outerRadius = Object(__WEBPACK_IMPORTED_MODULE_1__DataUtils__.d)(props.outerRadius, maxRadius, .8 * maxRadius); - return Object.keys(axisMap).reduce(function(result, id) { - var axis = axisMap[id], domain = axis.domain, reversed = axis.reversed, range = void 0; - __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(axis.range) ? ("angleAxis" === axisType ? range = [ startAngle, endAngle ] : "radiusAxis" === axisType && (range = [ innerRadius, outerRadius ]), - reversed && (range = [ range[1], range[0] ])) : (range = axis.range, startAngle = range[0], - endAngle = range[1]); - var _parseScale = Object(__WEBPACK_IMPORTED_MODULE_2__ChartUtils__.A)(axis, chartName), realScaleType = _parseScale.realScaleType, scale = _parseScale.scale; - scale.domain(domain).range(range), Object(__WEBPACK_IMPORTED_MODULE_2__ChartUtils__.c)(scale); - var ticks = Object(__WEBPACK_IMPORTED_MODULE_2__ChartUtils__.v)(scale, _extends({}, axis, { - realScaleType: realScaleType - })), finalAxis = _extends({}, axis, ticks, { - range: range, - radius: outerRadius, - realScaleType: realScaleType, - scale: scale, - cx: cx, - cy: cy, - innerRadius: innerRadius, - outerRadius: outerRadius, - startAngle: startAngle, - endAngle: endAngle - }); - return _extends({}, result, _defineProperty({}, id, finalAxis)); - }, {}); - }, distanceBetweenPoints = function(point, anotherPoint) { - var x1 = point.x, y1 = point.y, x2 = anotherPoint.x, y2 = anotherPoint.y; - return Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)); - }, getAngleOfPoint = function(_ref, _ref2) { - var x = _ref.x, y = _ref.y, cx = _ref2.cx, cy = _ref2.cy, radius = distanceBetweenPoints({ - x: x, - y: y - }, { - x: cx, - y: cy - }); - if (radius <= 0) return { - radius: radius - }; - var cos = (x - cx) / radius, angleInRadian = Math.acos(cos); - return y > cy && (angleInRadian = 2 * Math.PI - angleInRadian), { - radius: radius, - angle: radianToDegree(angleInRadian), - angleInRadian: angleInRadian - }; - }, formatAngleOfSector = function(_ref3) { - var startAngle = _ref3.startAngle, endAngle = _ref3.endAngle, startCnt = Math.floor(startAngle / 360), endCnt = Math.floor(endAngle / 360), min = Math.min(startCnt, endCnt); - return { - startAngle: startAngle - 360 * min, - endAngle: endAngle - 360 * min - }; - }, reverseFormatAngleOfSetor = function(angle, _ref4) { - var startAngle = _ref4.startAngle, endAngle = _ref4.endAngle, startCnt = Math.floor(startAngle / 360), endCnt = Math.floor(endAngle / 360); - return angle + 360 * Math.min(startCnt, endCnt); - }, inRangeOfSector = function(_ref5, sector) { - var x = _ref5.x, y = _ref5.y, _getAngleOfPoint = getAngleOfPoint({ - x: x, - y: y - }, sector), radius = _getAngleOfPoint.radius, angle = _getAngleOfPoint.angle, innerRadius = sector.innerRadius, outerRadius = sector.outerRadius; - if (radius < innerRadius || radius > outerRadius) return !1; - if (0 === radius) return !0; - var _formatAngleOfSector = formatAngleOfSector(sector), startAngle = _formatAngleOfSector.startAngle, endAngle = _formatAngleOfSector.endAngle, formatAngle = angle, inRange = void 0; - if (startAngle <= endAngle) { - for (;formatAngle > endAngle; ) formatAngle -= 360; - for (;formatAngle < startAngle; ) formatAngle += 360; - inRange = formatAngle >= startAngle && formatAngle <= endAngle; - } else { - for (;formatAngle > startAngle; ) formatAngle -= 360; - for (;formatAngle < endAngle; ) formatAngle += 360; - inRange = formatAngle >= endAngle && formatAngle <= startAngle; - } - return inRange ? _extends({}, sector, { - radius: radius, - angle: reverseFormatAngleOfSetor(formatAngle, sector) - }) : null; - }; -}, function(module, exports) { - var global = module.exports = "undefined" != typeof window && window.Math == Math ? window : "undefined" != typeof self && self.Math == Math ? self : Function("return this")(); - "number" == typeof __g && (__g = global); -}, function(module, exports, __webpack_require__) { - module.exports = !__webpack_require__(53)(function() { - return 7 != Object.defineProperty({}, "a", { - get: function() { - return 7; - } - }).a; - }); -}, function(module, exports, __webpack_require__) { - module.exports = { - default: __webpack_require__(394), - __esModule: !0 - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - exports.__esModule = !0, exports.default = function(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - exports.__esModule = !0; - var _defineProperty = __webpack_require__(154), _defineProperty2 = function(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - }(_defineProperty); - exports.default = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), (0, _defineProperty2.default)(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(); -}, function(module, exports, __webpack_require__) { - "use strict"; - exports.__esModule = !0; - var _typeof2 = __webpack_require__(105), _typeof3 = function(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - }(_typeof2); - exports.default = function(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" !== (void 0 === call ? "undefined" : (0, _typeof3.default)(call)) && "function" != typeof call ? self : call; - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - exports.__esModule = !0; - var _setPrototypeOf = __webpack_require__(411), _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf), _create = __webpack_require__(415), _create2 = _interopRequireDefault(_create), _typeof2 = __webpack_require__(105), _typeof3 = _interopRequireDefault(_typeof2); - exports.default = function(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + (void 0 === superClass ? "undefined" : (0, - _typeof3.default)(superClass))); - subClass.prototype = (0, _create2.default)(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 - } - }), superClass && (_setPrototypeOf2.default ? (0, _setPrototypeOf2.default)(subClass, superClass) : subClass.__proto__ = superClass); - }; -}, function(module, exports, __webpack_require__) { - var freeGlobal = __webpack_require__(268), freeSelf = "object" == typeof self && self && self.Object === Object && self, root = freeGlobal || freeSelf || Function("return this")(); - module.exports = root; -}, function(module, exports) { - function isObject(value) { - var type = typeof value; - return null != value && ("object" == type || "function" == type); - } - module.exports = isObject; -}, function(module, exports, __webpack_require__) { - "use strict"; - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - Object.defineProperty(exports, "__esModule", { - value: !0 - }), exports.translateStyle = exports.AnimateGroup = exports.configBezier = exports.configSpring = void 0; - var _Animate = __webpack_require__(287), _Animate2 = _interopRequireDefault(_Animate), _easing = __webpack_require__(305), _util = __webpack_require__(132), _AnimateGroup = __webpack_require__(762), _AnimateGroup2 = _interopRequireDefault(_AnimateGroup); - exports.configSpring = _easing.configSpring, exports.configBezier = _easing.configBezier, - exports.AnimateGroup = _AnimateGroup2.default, exports.translateStyle = _util.translateStyle, - exports.default = _Animate2.default; -}, function(module, exports) { - var isArray = Array.isArray; - module.exports = isArray; -}, function(module, exports) { - module.exports = function(it) { - return "object" == typeof it ? null !== it : "function" == typeof it; - }; -}, function(module, exports, __webpack_require__) { - var freeGlobal = __webpack_require__(292), freeSelf = "object" == typeof self && self && self.Object === Object && self, root = freeGlobal || freeSelf || Function("return this")(); - module.exports = root; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - var __WEBPACK_IMPORTED_MODULE_0__src_bisect__ = __webpack_require__(332); - __webpack_require__.d(__webpack_exports__, "b", function() { - return __WEBPACK_IMPORTED_MODULE_0__src_bisect__.a; - }); - var __WEBPACK_IMPORTED_MODULE_1__src_ascending__ = __webpack_require__(69); - __webpack_require__.d(__webpack_exports__, "a", function() { - return __WEBPACK_IMPORTED_MODULE_1__src_ascending__.a; - }); - var __WEBPACK_IMPORTED_MODULE_2__src_bisector__ = __webpack_require__(333); - __webpack_require__.d(__webpack_exports__, "c", function() { - return __WEBPACK_IMPORTED_MODULE_2__src_bisector__.a; - }); - var __WEBPACK_IMPORTED_MODULE_18__src_quantile__ = (__webpack_require__(848), __webpack_require__(849), - __webpack_require__(335), __webpack_require__(337), __webpack_require__(850), __webpack_require__(853), - __webpack_require__(854), __webpack_require__(341), __webpack_require__(855), __webpack_require__(856), - __webpack_require__(857), __webpack_require__(858), __webpack_require__(342), __webpack_require__(334), - __webpack_require__(859), __webpack_require__(204)); - __webpack_require__.d(__webpack_exports__, "d", function() { - return __WEBPACK_IMPORTED_MODULE_18__src_quantile__.a; - }); - var __WEBPACK_IMPORTED_MODULE_19__src_range__ = __webpack_require__(339); - __webpack_require__.d(__webpack_exports__, "e", function() { - return __WEBPACK_IMPORTED_MODULE_19__src_range__.a; - }); - var __WEBPACK_IMPORTED_MODULE_23__src_ticks__ = (__webpack_require__(860), __webpack_require__(861), - __webpack_require__(862), __webpack_require__(340)); - __webpack_require__.d(__webpack_exports__, "h", function() { - return __WEBPACK_IMPORTED_MODULE_23__src_ticks__.a; - }), __webpack_require__.d(__webpack_exports__, "f", function() { - return __WEBPACK_IMPORTED_MODULE_23__src_ticks__.b; - }), __webpack_require__.d(__webpack_exports__, "g", function() { - return __WEBPACK_IMPORTED_MODULE_23__src_ticks__.c; - }); - __webpack_require__(343), __webpack_require__(336), __webpack_require__(863); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_require__.d(__webpack_exports__, "d", function() { - return durationSecond; - }), __webpack_require__.d(__webpack_exports__, "c", function() { - return durationMinute; - }), __webpack_require__.d(__webpack_exports__, "b", function() { - return durationHour; - }), __webpack_require__.d(__webpack_exports__, "a", function() { - return durationDay; - }), __webpack_require__.d(__webpack_exports__, "e", function() { - return durationWeek; - }); - var durationSecond = 1e3, durationMinute = 6e4, durationHour = 36e5, durationDay = 864e5, durationWeek = 6048e5; -}, function(module, exports, __webpack_require__) { - var dP = __webpack_require__(22), createDesc = __webpack_require__(75); - module.exports = __webpack_require__(25) ? function(object, key, value) { - return dP.f(object, key, createDesc(1, value)); - } : function(object, key, value) { - return object[key] = value, object; - }; -}, function(module, exports) { - var g; - g = function() { - return this; - }(); - try { - g = g || Function("return this")() || (0, eval)("this"); - } catch (e) { - "object" == typeof window && (g = window); - } - module.exports = g; -}, function(module, exports, __webpack_require__) { - function baseGetTag(value) { - return null == value ? void 0 === value ? undefinedTag : nullTag : symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value); - } - var Symbol = __webpack_require__(83), getRawTag = __webpack_require__(603), objectToString = __webpack_require__(604), nullTag = "[object Null]", undefinedTag = "[object Undefined]", symToStringTag = Symbol ? Symbol.toStringTag : void 0; - module.exports = baseGetTag; -}, function(module, exports) { - function isObjectLike(value) { - return null != value && "object" == typeof value; - } - module.exports = isObjectLike; -}, function(module, exports) { - function isObjectLike(value) { - return null != value && "object" == typeof value; - } - module.exports = isObjectLike; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _toConsumableArray(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - return arr2; - } - return Array.from(arr); - } - function Label(props) { - var viewBox = props.viewBox, position = props.position, value = props.value, children = props.children, content = props.content, _props$className = props.className, className = void 0 === _props$className ? "" : _props$className; - if (!viewBox || __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(value) && __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(children) && !Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(content) && !__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(content)) return null; - if (Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(content)) return Object(__WEBPACK_IMPORTED_MODULE_3_react__.cloneElement)(content, props); - var label = void 0; - if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(content)) { - if (label = content(props), Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(label)) return label; - } else label = getLabel(props); - var isPolarLabel = isPolar(viewBox), attrs = Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.k)(props); - if (isPolarLabel && ("insideStart" === position || "insideEnd" === position || "end" === position)) return renderRadialLabel(props, label, attrs); - var positionAttrs = isPolarLabel ? getAttrsOfPolarLabel(props) : getAttrsOfCartesianLabel(props); - return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_6__Text__.a, _extends({ - className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()("recharts-label", className) - }, attrs, positionAttrs), label); - } - var __WEBPACK_IMPORTED_MODULE_0_lodash_isObject__ = __webpack_require__(32), __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isObject__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_3_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_3_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react__), __WEBPACK_IMPORTED_MODULE_4_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_4_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_prop_types__), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6__Text__ = __webpack_require__(61), __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_8__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__ = __webpack_require__(23), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, cartesianViewBoxShape = __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({ - x: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - y: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - width: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - height: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number - }), polarViewBoxShape = __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.shape({ - cx: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - cy: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - innerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - outerRadius: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - startAngle: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - endAngle: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number - }), propTypes = { - viewBox: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ cartesianViewBoxShape, polarViewBoxShape ]), - formatter: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func, - value: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string ]), - offset: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.number, - position: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOf([ "top", "left", "right", "bottom", "inside", "outside", "insideLeft", "insideRight", "insideTop", "insideBottom", "insideTopLeft", "insideBottomLeft", "insideTopRight", "insideBottomRight", "insideStart", "insideEnd", "end", "center" ]), - children: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.node ]), - className: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.string, - content: __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.element, __WEBPACK_IMPORTED_MODULE_4_prop_types___default.a.func ]) - }, defaultProps = { - offset: 5 - }, getLabel = function(props) { - var value = props.value, formatter = props.formatter, label = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(props.children) ? value : props.children; - return __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(formatter) ? formatter(label) : label; - }, getDeltaAngle = function(startAngle, endAngle) { - return Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.j)(endAngle - startAngle) * Math.min(Math.abs(endAngle - startAngle), 360); - }, renderRadialLabel = function(labelProps, label, attrs) { - var position = labelProps.position, viewBox = labelProps.viewBox, offset = labelProps.offset, className = labelProps.className, cx = viewBox.cx, cy = viewBox.cy, innerRadius = viewBox.innerRadius, outerRadius = viewBox.outerRadius, startAngle = viewBox.startAngle, endAngle = viewBox.endAngle, clockWise = viewBox.clockWise, radius = (innerRadius + outerRadius) / 2, deltaAngle = getDeltaAngle(startAngle, endAngle), sign = deltaAngle >= 0 ? 1 : -1, labelAngle = void 0, direction = void 0; - "insideStart" === position ? (labelAngle = startAngle + sign * offset, direction = clockWise) : "insideEnd" === position ? (labelAngle = endAngle - sign * offset, - direction = !clockWise) : "end" === position && (labelAngle = endAngle + sign * offset, - direction = clockWise), direction = deltaAngle <= 0 ? direction : !direction; - var startPoint = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, labelAngle), endPoint = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, radius, labelAngle + 359 * (direction ? 1 : -1)), path = "M" + startPoint.x + "," + startPoint.y + "\n A" + radius + "," + radius + ",0,1," + (direction ? 0 : 1) + ",\n " + endPoint.x + "," + endPoint.y, id = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(labelProps.id) ? Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.k)("recharts-radial-line-") : labelProps.id; - return __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("text", _extends({}, attrs, { - dominantBaseline: "central", - className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()("recharts-radial-bar-label", className) - }), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("defs", null, __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("path", { - id: id, - d: path - })), __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement("textPath", { - xlinkHref: "#" + id - }, label)); - }, getAttrsOfPolarLabel = function(props) { - var viewBox = props.viewBox, offset = props.offset, position = props.position, cx = viewBox.cx, cy = viewBox.cy, innerRadius = viewBox.innerRadius, outerRadius = viewBox.outerRadius, startAngle = viewBox.startAngle, endAngle = viewBox.endAngle, midAngle = (startAngle + endAngle) / 2; - if ("outside" === position) { - var _polarToCartesian = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, outerRadius + offset, midAngle), _x = _polarToCartesian.x; - return { - x: _x, - y: _polarToCartesian.y, - textAnchor: _x >= cx ? "start" : "end", - verticalAnchor: "middle" - }; - } - if ("center" === position) return { - x: cx, - y: cy, - textAnchor: "middle", - verticalAnchor: "middle" - }; - var r = (innerRadius + outerRadius) / 2, _polarToCartesian2 = Object(__WEBPACK_IMPORTED_MODULE_9__util_PolarUtils__.e)(cx, cy, r, midAngle); - return { - x: _polarToCartesian2.x, - y: _polarToCartesian2.y, - textAnchor: "middle", - verticalAnchor: "middle" - }; - }, getAttrsOfCartesianLabel = function(props) { - var viewBox = props.viewBox, offset = props.offset, position = props.position, x = viewBox.x, y = viewBox.y, width = viewBox.width, height = viewBox.height, sign = height >= 0 ? 1 : -1; - return "top" === position ? { - x: x + width / 2, - y: y - sign * offset, - textAnchor: "middle", - verticalAnchor: "end" - } : "bottom" === position ? { - x: x + width / 2, - y: y + height + sign * offset, - textAnchor: "middle", - verticalAnchor: "start" - } : "left" === position ? { - x: x - offset, - y: y + height / 2, - textAnchor: "end", - verticalAnchor: "middle" - } : "right" === position ? { - x: x + width + offset, - y: y + height / 2, - textAnchor: "start", - verticalAnchor: "middle" - } : "insideLeft" === position ? { - x: x + offset, - y: y + height / 2, - textAnchor: "start", - verticalAnchor: "middle" - } : "insideRight" === position ? { - x: x + width - offset, - y: y + height / 2, - textAnchor: "end", - verticalAnchor: "middle" - } : "insideTop" === position ? { - x: x + width / 2, - y: y + sign * offset, - textAnchor: "middle", - verticalAnchor: "start" - } : "insideBottom" === position ? { - x: x + width / 2, - y: y + height - sign * offset, - textAnchor: "middle", - verticalAnchor: "end" - } : "insideTopLeft" === position ? { - x: x + offset, - y: y + sign * offset, - textAnchor: "start", - verticalAnchor: "start" - } : "insideTopRight" === position ? { - x: x + width - offset, - y: y + sign * offset, - textAnchor: "end", - verticalAnchor: "start" - } : "insideBottomLeft" === position ? { - x: x + offset, - y: y + height - sign * offset, - textAnchor: "start", - verticalAnchor: "end" - } : "insideBottomRight" === position ? { - x: x + width - offset, - y: y + height - sign * offset, - textAnchor: "end", - verticalAnchor: "end" - } : __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default()(position) && (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(position.x) || Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.i)(position.x)) && (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(position.y) || Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.i)(position.y)) ? { - x: x + Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.d)(position.x, width), - y: y + Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.d)(position.y, height), - textAnchor: "end", - verticalAnchor: "end" - } : { - x: x + width / 2, - y: y + height / 2, - textAnchor: "middle", - verticalAnchor: "middle" - }; - }, isPolar = function(viewBox) { - return Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(viewBox.cx); - }; - Label.displayName = "Label", Label.defaultProps = defaultProps, Label.propTypes = propTypes; - var parseViewBox = function(props) { - var cx = props.cx, cy = props.cy, angle = props.angle, startAngle = props.startAngle, endAngle = props.endAngle, r = props.r, radius = props.radius, innerRadius = props.innerRadius, outerRadius = props.outerRadius, x = props.x, y = props.y, top = props.top, left = props.left, width = props.width, height = props.height, clockWise = props.clockWise; - if (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(width) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(height)) { - if (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(x) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(y)) return { - x: x, - y: y, - width: width, - height: height - }; - if (Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(top) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(left)) return { - x: top, - y: left, - width: width, - height: height - }; - } - return Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(x) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(y) ? { - x: x, - y: y, - width: 0, - height: 0 - } : Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(cx) && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(cy) ? { - cx: cx, - cy: cy, - startAngle: startAngle || angle || 0, - endAngle: endAngle || angle || 0, - innerRadius: innerRadius || 0, - outerRadius: outerRadius || radius || r || 0, - clockWise: clockWise - } : props.viewBox ? props.viewBox : {}; - }, parseLabel = function(label, viewBox) { - return label ? !0 === label ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, { - key: "label-implicit", - viewBox: viewBox - }) : Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.g)(label) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, { - key: "label-implicit", - viewBox: viewBox, - value: label - }) : Object(__WEBPACK_IMPORTED_MODULE_3_react__.isValidElement)(label) || __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(label) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, { - key: "label-implicit", - content: label, - viewBox: viewBox - }) : __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default()(label) ? __WEBPACK_IMPORTED_MODULE_3_react___default.a.createElement(Label, _extends({ - viewBox: viewBox - }, label, { - key: "label-implicit" - })) : null : null; - }, renderCallByParent = function(parentProps, viewBox) { - var ckeckPropsLabel = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2]; - if (!parentProps || !parentProps.children && ckeckPropsLabel && !parentProps.label) return null; - var children = parentProps.children, parentViewBox = parseViewBox(parentProps), explicitChilren = Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.h)(children, Label).map(function(child, index) { - return Object(__WEBPACK_IMPORTED_MODULE_3_react__.cloneElement)(child, { - viewBox: viewBox || parentViewBox, - key: "label-" + index - }); - }); - return ckeckPropsLabel ? [ parseLabel(parentProps.label, viewBox || parentViewBox) ].concat(_toConsumableArray(explicitChilren)) : explicitChilren; - }; - Label.parseViewBox = parseViewBox, Label.renderCallByParent = renderCallByParent, - __webpack_exports__.a = Label; -}, function(module, exports, __webpack_require__) { - function isEqual(value, other) { - return baseIsEqual(value, other); - } - var baseIsEqual = __webpack_require__(199); - module.exports = isEqual; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - var __WEBPACK_IMPORTED_MODULE_0__src_color__ = __webpack_require__(207); - __webpack_require__.d(__webpack_exports__, "a", function() { - return __WEBPACK_IMPORTED_MODULE_0__src_color__.e; - }), __webpack_require__.d(__webpack_exports__, "f", function() { - return __WEBPACK_IMPORTED_MODULE_0__src_color__.g; - }), __webpack_require__.d(__webpack_exports__, "d", function() { - return __WEBPACK_IMPORTED_MODULE_0__src_color__.f; - }); - var __WEBPACK_IMPORTED_MODULE_1__src_lab__ = __webpack_require__(871); - __webpack_require__.d(__webpack_exports__, "e", function() { - return __WEBPACK_IMPORTED_MODULE_1__src_lab__.a; - }), __webpack_require__.d(__webpack_exports__, "c", function() { - return __WEBPACK_IMPORTED_MODULE_1__src_lab__.b; - }); - var __WEBPACK_IMPORTED_MODULE_2__src_cubehelix__ = __webpack_require__(872); - __webpack_require__.d(__webpack_exports__, "b", function() { - return __WEBPACK_IMPORTED_MODULE_2__src_cubehelix__.a; - }); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _toConsumableArray(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - return arr2; - } - return Array.from(arr); - } - function _objectWithoutProperties(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - } - function LabelList(props) { - var data = props.data, valueAccessor = props.valueAccessor, dataKey = props.dataKey, clockWise = props.clockWise, id = props.id, others = _objectWithoutProperties(props, [ "data", "valueAccessor", "dataKey", "clockWise", "id" ]); - return data && data.length ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Layer__.a, { - className: "recharts-label-list" - }, data.map(function(entry, index) { - var value = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(dataKey) ? valueAccessor(entry, index) : Object(__WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__.w)(entry && entry.payload, dataKey), idProps = __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(id) ? {} : { - id: id + "-" + index - }; - return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_7__Label__.a, _extends({}, Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.k)(entry), others, idProps, { - index: index, - value: value, - viewBox: __WEBPACK_IMPORTED_MODULE_7__Label__.a.parseViewBox(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default()(clockWise) ? entry : _extends({}, entry, { - clockWise: clockWise - })), - key: "label-" + index - })); - })) : null; - } - var __WEBPACK_IMPORTED_MODULE_0_lodash_isObject__ = __webpack_require__(32), __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isObject__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_2_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_3_lodash_last__ = __webpack_require__(922), __WEBPACK_IMPORTED_MODULE_3_lodash_last___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_last__), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7__Label__ = __webpack_require__(44), __WEBPACK_IMPORTED_MODULE_8__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_10__util_ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, propTypes = { - id: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - data: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object), - valueAccessor: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - clockWise: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool, - dataKey: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func ]) - }, defaultProps = { - valueAccessor: function(entry) { - return __WEBPACK_IMPORTED_MODULE_4_lodash_isArray___default()(entry.value) ? __WEBPACK_IMPORTED_MODULE_3_lodash_last___default()(entry.value) : entry.value; - } - }; - LabelList.propTypes = propTypes, LabelList.displayName = "LabelList"; - var parseLabelList = function(label, data) { - return label ? !0 === label ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(LabelList, { - key: "labelList-implicit", - data: data - }) : __WEBPACK_IMPORTED_MODULE_5_react___default.a.isValidElement(label) || __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(label) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(LabelList, { - key: "labelList-implicit", - data: data, - content: label - }) : __WEBPACK_IMPORTED_MODULE_0_lodash_isObject___default()(label) ? __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(LabelList, _extends({ - data: data - }, label, { - key: "labelList-implicit" - })) : null : null; - }, renderCallByParent = function(parentProps, data) { - var ckeckPropsLabel = !(arguments.length > 2 && void 0 !== arguments[2]) || arguments[2]; - if (!parentProps || !parentProps.children && ckeckPropsLabel && !parentProps.label) return null; - var children = parentProps.children, explicitChilren = Object(__WEBPACK_IMPORTED_MODULE_9__util_ReactUtils__.h)(children, LabelList).map(function(child, index) { - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(child, { - data: data, - key: "labelList-" + index - }); - }); - return ckeckPropsLabel ? [ parseLabelList(parentProps.label, data) ].concat(_toConsumableArray(explicitChilren)) : explicitChilren; - }; - LabelList.renderCallByParent = renderCallByParent, LabelList.defaultProps = defaultProps, - __webpack_exports__.a = LabelList; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _objectWithoutProperties(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - } - function _defineProperty(obj, key, value) { - return key in obj ? Object.defineProperty(obj, key, { - value: value, - enumerable: !0, - configurable: !0, - writable: !0 - }) : obj[key] = value, obj; - } - function _toConsumableArray(arr) { - if (Array.isArray(arr)) { - for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; - return arr2; - } - return Array.from(arr); - } - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 - } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var __WEBPACK_IMPORTED_MODULE_0_lodash_sortBy__ = __webpack_require__(321), __WEBPACK_IMPORTED_MODULE_0_lodash_sortBy___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_sortBy__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_lodash_range__ = __webpack_require__(373), __WEBPACK_IMPORTED_MODULE_2_lodash_range___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_lodash_range__), __WEBPACK_IMPORTED_MODULE_3_lodash_throttle__ = __webpack_require__(933), __WEBPACK_IMPORTED_MODULE_3_lodash_throttle___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_lodash_throttle__), __WEBPACK_IMPORTED_MODULE_4_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_5_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_5_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_react__), __WEBPACK_IMPORTED_MODULE_6_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_6_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6_prop_types__), __WEBPACK_IMPORTED_MODULE_7_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_7_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_7_classnames__), __WEBPACK_IMPORTED_MODULE_8__container_Surface__ = __webpack_require__(82), __WEBPACK_IMPORTED_MODULE_9__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__ = __webpack_require__(125), __WEBPACK_IMPORTED_MODULE_11__component_Legend__ = __webpack_require__(180), __WEBPACK_IMPORTED_MODULE_12__shape_Curve__ = __webpack_require__(71), __WEBPACK_IMPORTED_MODULE_13__shape_Cross__ = __webpack_require__(367), __WEBPACK_IMPORTED_MODULE_14__shape_Sector__ = __webpack_require__(139), __WEBPACK_IMPORTED_MODULE_15__shape_Dot__ = __webpack_require__(63), __WEBPACK_IMPORTED_MODULE_16__shape_Rectangle__ = __webpack_require__(70), __WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__ = __webpack_require__(374), __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__ = __webpack_require__(372), __WEBPACK_IMPORTED_MODULE_20__util_DOMUtils__ = __webpack_require__(198), __WEBPACK_IMPORTED_MODULE_21__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__ = __webpack_require__(16), __WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__ = __webpack_require__(23), __WEBPACK_IMPORTED_MODULE_24__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_25__util_Events__ = __webpack_require__(934), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), ORIENT_MAP = { - xAxis: [ "bottom", "top" ], - yAxis: [ "left", "right" ] - }, originCoordinate = { - x: 0, - y: 0 - }, generateCategoricalChart = function(_ref) { - var _class, _temp, _initialiseProps, chartName = _ref.chartName, GraphicalChild = _ref.GraphicalChild, _ref$eventType = _ref.eventType, eventType = void 0 === _ref$eventType ? "axis" : _ref$eventType, axisComponents = _ref.axisComponents, legendContent = _ref.legendContent, formatAxisMap = _ref.formatAxisMap, defaultProps = _ref.defaultProps, propTypes = _ref.propTypes; - return _temp = _class = function(_Component) { - function CategoricalChartWrapper(props) { - _classCallCheck(this, CategoricalChartWrapper); - var _this = _possibleConstructorReturn(this, (CategoricalChartWrapper.__proto__ || Object.getPrototypeOf(CategoricalChartWrapper)).call(this, props)); - _initialiseProps.call(_this); - var defaultState = _this.constructor.createDefaultState(props); - return _this.state = _extends({}, defaultState, { - updateId: 0 - }, _this.updateStateOfAxisMapsOffsetAndStackGroups(_extends({ - props: props - }, defaultState, { - updateId: 0 - }))), _this.uniqueChartId = __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(props.id) ? Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.k)("recharts") : props.id, - props.throttleDelay && (_this.triggeredAfterMouseMove = __WEBPACK_IMPORTED_MODULE_3_lodash_throttle___default()(_this.triggeredAfterMouseMove, props.throttleDelay)), - _this; - } - return _inherits(CategoricalChartWrapper, _Component), _createClass(CategoricalChartWrapper, [ { - key: "componentDidMount", - value: function() { - __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) || this.addListener(); - } - }, { - key: "componentWillReceiveProps", - value: function(nextProps) { - var _props = this.props, data = _props.data, children = _props.children, width = _props.width, height = _props.height, layout = _props.layout, stackOffset = _props.stackOffset, margin = _props.margin, updateId = this.state.updateId; - if (nextProps.data === data && nextProps.width === width && nextProps.height === height && nextProps.layout === layout && nextProps.stackOffset === stackOffset && Object(__WEBPACK_IMPORTED_MODULE_24__util_PureRender__.b)(nextProps.margin, margin)) { - if (!Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.m)(nextProps.children, children)) { - var hasGlobalData = !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(nextProps.data), newUpdateId = hasGlobalData ? updateId : updateId + 1, _state = this.state, dataStartIndex = _state.dataStartIndex, dataEndIndex = _state.dataEndIndex, _defaultState = _extends({}, this.constructor.createDefaultState(nextProps), { - dataEndIndex: dataEndIndex, - dataStartIndex: dataStartIndex - }); - this.setState(_extends({}, _defaultState, { - updateId: newUpdateId - }, this.updateStateOfAxisMapsOffsetAndStackGroups(_extends({ - props: nextProps - }, _defaultState, { - updateId: newUpdateId - })))); - } - } else { - var defaultState = this.constructor.createDefaultState(nextProps); - this.setState(_extends({}, defaultState, { - updateId: updateId + 1 - }, this.updateStateOfAxisMapsOffsetAndStackGroups(_extends({ - props: nextProps - }, defaultState, { - updateId: updateId + 1 - })))); - } - __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) && !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(nextProps.syncId) && this.addListener(), - !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) && __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(nextProps.syncId) && this.removeListener(); - } - }, { - key: "componentWillUnmount", - value: function() { - __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(this.props.syncId) || this.removeListener(), - "function" == typeof this.triggeredAfterMouseMove.cancel && this.triggeredAfterMouseMove.cancel(); - } - }, { - key: "getAxisMap", - value: function(props, _ref2) { - var _ref2$axisType = _ref2.axisType, axisType = void 0 === _ref2$axisType ? "xAxis" : _ref2$axisType, AxisComp = _ref2.AxisComp, graphicalItems = _ref2.graphicalItems, stackGroups = _ref2.stackGroups, dataStartIndex = _ref2.dataStartIndex, dataEndIndex = _ref2.dataEndIndex, children = props.children, axisIdKey = axisType + "Id", axes = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.h)(children, AxisComp), axisMap = {}; - return axes && axes.length ? axisMap = this.getAxisMapByAxes(props, { - axes: axes, - graphicalItems: graphicalItems, - axisType: axisType, - axisIdKey: axisIdKey, - stackGroups: stackGroups, - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex - }) : graphicalItems && graphicalItems.length && (axisMap = this.getAxisMapByItems(props, { - Axis: AxisComp, - graphicalItems: graphicalItems, - axisType: axisType, - axisIdKey: axisIdKey, - stackGroups: stackGroups, - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex - })), axisMap; - } - }, { - key: "getAxisMapByAxes", - value: function(props, _ref3) { - var _this2 = this, axes = _ref3.axes, graphicalItems = _ref3.graphicalItems, axisType = _ref3.axisType, axisIdKey = _ref3.axisIdKey, stackGroups = _ref3.stackGroups, dataStartIndex = _ref3.dataStartIndex, dataEndIndex = _ref3.dataEndIndex, layout = props.layout, children = props.children, stackOffset = props.stackOffset, isCategorial = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.x)(layout, axisType); - return axes.reduce(function(result, child) { - var _child$props = child.props, type = _child$props.type, dataKey = _child$props.dataKey, allowDataOverflow = _child$props.allowDataOverflow, allowDuplicatedCategory = _child$props.allowDuplicatedCategory, scale = _child$props.scale, ticks = _child$props.ticks, axisId = child.props[axisIdKey], displayedData = _this2.constructor.getDisplayedData(props, { - graphicalItems: graphicalItems.filter(function(item) { - return item.props[axisIdKey] === axisId; - }), - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex - }), len = displayedData.length; - if (!result[axisId]) { - var domain = void 0, duplicateDomain = void 0, categoricalDomain = void 0; - if (dataKey) { - if (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.n)(displayedData, dataKey, type), - "category" === type && isCategorial) { - var duplicate = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.e)(domain); - allowDuplicatedCategory && duplicate ? (duplicateDomain = domain, domain = __WEBPACK_IMPORTED_MODULE_2_lodash_range___default()(0, len)) : allowDuplicatedCategory || (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.y)(child.props.domain, domain, child).reduce(function(finalDomain, entry) { - return finalDomain.indexOf(entry) >= 0 ? finalDomain : [].concat(_toConsumableArray(finalDomain), [ entry ]); - }, [])); - } else if ("category" === type) domain = allowDuplicatedCategory ? domain.filter(function(entry) { - return "" !== entry && !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(entry); - }) : Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.y)(child.props.domain, domain, child).reduce(function(finalDomain, entry) { - return finalDomain.indexOf(entry) >= 0 || "" === entry || __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(entry) ? finalDomain : [].concat(_toConsumableArray(finalDomain), [ entry ]); - }, []); else if ("number" === type) { - var errorBarsDomain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.z)(displayedData, graphicalItems.filter(function(item) { - return item.props[axisIdKey] === axisId && !item.props.hide; - }), dataKey, axisType); - errorBarsDomain && (domain = errorBarsDomain); - } - !isCategorial || "number" !== type && "auto" === scale || (categoricalDomain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.n)(displayedData, dataKey, "category")); - } else domain = isCategorial ? __WEBPACK_IMPORTED_MODULE_2_lodash_range___default()(0, len) : stackGroups && stackGroups[axisId] && stackGroups[axisId].hasStack && "number" === type ? "expand" === stackOffset ? [ 0, 1 ] : Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.p)(stackGroups[axisId].stackGroups, dataStartIndex, dataEndIndex) : Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.o)(displayedData, graphicalItems.filter(function(item) { - return item.props[axisIdKey] === axisId && !item.props.hide; - }), type, !0); - return "number" === type && (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.e)(children, domain, axisId, axisType, ticks), - child.props.domain && (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.B)(child.props.domain, domain, allowDataOverflow))), - _extends({}, result, _defineProperty({}, axisId, _extends({}, child.props, { - axisType: axisType, - domain: domain, - categoricalDomain: categoricalDomain, - duplicateDomain: duplicateDomain, - originalDomain: child.props.domain, - isCategorial: isCategorial, - layout: layout - }))); - } - return result; - }, {}); - } - }, { - key: "getAxisMapByItems", - value: function(props, _ref4) { - var graphicalItems = _ref4.graphicalItems, Axis = _ref4.Axis, axisType = _ref4.axisType, axisIdKey = _ref4.axisIdKey, stackGroups = _ref4.stackGroups, dataStartIndex = _ref4.dataStartIndex, dataEndIndex = _ref4.dataEndIndex, layout = props.layout, children = props.children, displayedData = this.constructor.getDisplayedData(props, { - graphicalItems: graphicalItems, - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex - }), len = displayedData.length, isCategorial = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.x)(layout, axisType), index = -1; - return graphicalItems.reduce(function(result, child) { - var axisId = child.props[axisIdKey]; - if (!result[axisId]) { - index++; - var domain = void 0; - return isCategorial ? domain = __WEBPACK_IMPORTED_MODULE_2_lodash_range___default()(0, len) : stackGroups && stackGroups[axisId] && stackGroups[axisId].hasStack ? (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.p)(stackGroups[axisId].stackGroups, dataStartIndex, dataEndIndex), - domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.e)(children, domain, axisId, axisType)) : (domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.B)(Axis.defaultProps.domain, Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.o)(displayedData, graphicalItems.filter(function(item) { - return item.props[axisIdKey] === axisId && !item.props.hide; - }), "number"), Axis.defaultProps.allowDataOverflow), domain = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.e)(children, domain, axisId, axisType)), - _extends({}, result, _defineProperty({}, axisId, _extends({ - axisType: axisType - }, Axis.defaultProps, { - hide: !0, - orientation: ORIENT_MAP[axisType] && ORIENT_MAP[axisType][index % 2], - domain: domain, - originalDomain: Axis.defaultProps.domain, - isCategorial: isCategorial, - layout: layout - }))); - } - return result; - }, {}); - } - }, { - key: "getActiveCoordinate", - value: function(tooltipTicks, activeIndex, rangeObj) { - var layout = this.props.layout, entry = tooltipTicks.find(function(tick) { - return tick && tick.index === activeIndex; - }); - if (entry) { - if ("horizontal" === layout) return { - x: entry.coordinate, - y: rangeObj.y - }; - if ("vertical" === layout) return { - x: rangeObj.x, - y: entry.coordinate - }; - if ("centric" === layout) { - var _angle = entry.coordinate, _radius = rangeObj.radius; - return _extends({}, rangeObj, Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(rangeObj.cx, rangeObj.cy, _radius, _angle), { - angle: _angle, - radius: _radius - }); - } - var radius = entry.coordinate, angle = rangeObj.angle; - return _extends({}, rangeObj, Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(rangeObj.cx, rangeObj.cy, radius, angle), { - angle: angle, - radius: radius - }); - } - return originCoordinate; - } - }, { - key: "getMouseInfo", - value: function(event) { - if (!this.container) return null; - var containerOffset = Object(__WEBPACK_IMPORTED_MODULE_20__util_DOMUtils__.b)(this.container), e = Object(__WEBPACK_IMPORTED_MODULE_20__util_DOMUtils__.a)(event, containerOffset), rangeObj = this.inRange(e.chartX, e.chartY); - if (!rangeObj) return null; - var _state2 = this.state, xAxisMap = _state2.xAxisMap, yAxisMap = _state2.yAxisMap; - if ("axis" !== eventType && xAxisMap && yAxisMap) { - var xScale = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(xAxisMap).scale, yScale = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(yAxisMap).scale, xValue = xScale && xScale.invert ? xScale.invert(e.chartX) : null, yValue = yScale && yScale.invert ? yScale.invert(e.chartY) : null; - return _extends({}, e, { - xValue: xValue, - yValue: yValue - }); - } - var _state3 = this.state, ticks = _state3.orderedTooltipTicks, axis = _state3.tooltipAxis, tooltipTicks = _state3.tooltipTicks, pos = this.calculateTooltipPos(rangeObj), activeIndex = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.b)(pos, ticks, tooltipTicks, axis); - if (activeIndex >= 0 && tooltipTicks) { - var activeLabel = tooltipTicks[activeIndex] && tooltipTicks[activeIndex].value, activePayload = this.getTooltipContent(activeIndex, activeLabel), activeCoordinate = this.getActiveCoordinate(ticks, activeIndex, rangeObj); - return _extends({}, e, { - activeTooltipIndex: activeIndex, - activeLabel: activeLabel, - activePayload: activePayload, - activeCoordinate: activeCoordinate - }); - } - return null; - } - }, { - key: "getTooltipContent", - value: function(activeIndex, activeLabel) { - var _state4 = this.state, graphicalItems = _state4.graphicalItems, tooltipAxis = _state4.tooltipAxis, displayedData = this.constructor.getDisplayedData(this.props, this.state); - return activeIndex < 0 || !graphicalItems || !graphicalItems.length || activeIndex >= displayedData.length ? null : graphicalItems.reduce(function(result, child) { - if (child.props.hide) return result; - var _child$props2 = child.props, dataKey = _child$props2.dataKey, name = _child$props2.name, unit = _child$props2.unit, formatter = _child$props2.formatter, data = _child$props2.data, payload = void 0; - return payload = tooltipAxis.dataKey && !tooltipAxis.allowDuplicatedCategory ? Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.a)(data || displayedData, tooltipAxis.dataKey, activeLabel) : displayedData[activeIndex], - payload ? [].concat(_toConsumableArray(result), [ _extends({}, Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(child), { - dataKey: dataKey, - unit: unit, - formatter: formatter, - name: name || dataKey, - color: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.r)(child), - value: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.w)(payload, dataKey), - payload: payload - }) ]) : result; - }, []); - } - }, { - key: "getFormatItems", - value: function(props, currentState) { - var _this3 = this, graphicalItems = currentState.graphicalItems, stackGroups = currentState.stackGroups, offset = currentState.offset, updateId = currentState.updateId, dataStartIndex = currentState.dataStartIndex, dataEndIndex = currentState.dataEndIndex, barSize = props.barSize, layout = props.layout, barGap = props.barGap, barCategoryGap = props.barCategoryGap, globalMaxBarSize = props.maxBarSize, _getAxisNameByLayout = this.getAxisNameByLayout(layout), numericAxisName = _getAxisNameByLayout.numericAxisName, cateAxisName = _getAxisNameByLayout.cateAxisName, hasBar = this.constructor.hasBar(graphicalItems), sizeList = hasBar && Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.i)({ - barSize: barSize, - stackGroups: stackGroups - }), formatedItems = []; - return graphicalItems.forEach(function(item, index) { - var displayedData = _this3.constructor.getDisplayedData(props, { - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex - }, item), _item$props = item.props, dataKey = _item$props.dataKey, childMaxBarSize = _item$props.maxBarSize, numericAxisId = item.props[numericAxisName + "Id"], cateAxisId = item.props[cateAxisName + "Id"], axisObj = axisComponents.reduce(function(result, entry) { - var _extends4, axisMap = currentState[entry.axisType + "Map"], id = item.props[entry.axisType + "Id"], axis = axisMap && axisMap[id]; - return _extends({}, result, (_extends4 = {}, _defineProperty(_extends4, entry.axisType, axis), - _defineProperty(_extends4, entry.axisType + "Ticks", Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axis)), - _extends4)); - }, {}), cateAxis = axisObj[cateAxisName], cateTicks = axisObj[cateAxisName + "Ticks"], stackedData = stackGroups && stackGroups[numericAxisId] && stackGroups[numericAxisId].hasStack && Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.t)(item, stackGroups[numericAxisId].stackGroups), bandSize = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.g)(cateAxis, cateTicks), maxBarSize = __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(childMaxBarSize) ? globalMaxBarSize : childMaxBarSize, barPosition = hasBar && Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.h)({ - barGap: barGap, - barCategoryGap: barCategoryGap, - bandSize: bandSize, - sizeList: sizeList[cateAxisId], - maxBarSize: maxBarSize - }), componsedFn = item && item.type && item.type.getComposedData; - if (componsedFn) { - var _extends5; - formatedItems.push({ - props: _extends({}, componsedFn(_extends({}, axisObj, { - displayedData: displayedData, - props: props, - dataKey: dataKey, - item: item, - bandSize: bandSize, - barPosition: barPosition, - offset: offset, - stackedData: stackedData, - layout: layout, - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex, - onItemMouseLeave: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.d)(_this3.handleItemMouseLeave, null, item.props.onMouseLeave), - onItemMouseEnter: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.d)(_this3.handleItemMouseEnter, null, item.props.onMouseEnter) - })), (_extends5 = { - key: item.key || "item-" + index - }, _defineProperty(_extends5, numericAxisName, axisObj[numericAxisName]), _defineProperty(_extends5, cateAxisName, axisObj[cateAxisName]), - _defineProperty(_extends5, "animationId", updateId), _extends5)), - childIndex: Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.o)(item, props.children), - item: item - }); - } - }), formatedItems; - } - }, { - key: "getCursorRectangle", - value: function() { - var layout = this.props.layout, _state5 = this.state, activeCoordinate = _state5.activeCoordinate, offset = _state5.offset, tooltipAxisBandSize = _state5.tooltipAxisBandSize, halfSize = tooltipAxisBandSize / 2; - return { - stroke: "none", - fill: "#ccc", - x: "horizontal" === layout ? activeCoordinate.x - halfSize : offset.left + .5, - y: "horizontal" === layout ? offset.top + .5 : activeCoordinate.y - halfSize, - width: "horizontal" === layout ? tooltipAxisBandSize : offset.width - 1, - height: "horizontal" === layout ? offset.height - 1 : tooltipAxisBandSize - }; - } - }, { - key: "getCursorPoints", - value: function() { - var layout = this.props.layout, _state6 = this.state, activeCoordinate = _state6.activeCoordinate, offset = _state6.offset, x1 = void 0, y1 = void 0, x2 = void 0, y2 = void 0; - if ("horizontal" === layout) x1 = activeCoordinate.x, x2 = x1, y1 = offset.top, - y2 = offset.top + offset.height; else if ("vertical" === layout) y1 = activeCoordinate.y, - y2 = y1, x1 = offset.left, x2 = offset.left + offset.width; else if (!__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(activeCoordinate.cx) || !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(activeCoordinate.cy)) { - if ("centric" !== layout) { - var _cx = activeCoordinate.cx, _cy = activeCoordinate.cy, radius = activeCoordinate.radius, startAngle = activeCoordinate.startAngle, endAngle = activeCoordinate.endAngle, startPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(_cx, _cy, radius, startAngle), endPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(_cx, _cy, radius, endAngle); - return { - points: [ startPoint, endPoint ], - cx: _cx, - cy: _cy, - radius: radius, - startAngle: startAngle, - endAngle: endAngle - }; - } - var cx = activeCoordinate.cx, cy = activeCoordinate.cy, innerRadius = activeCoordinate.innerRadius, outerRadius = activeCoordinate.outerRadius, angle = activeCoordinate.angle, innerPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(cx, cy, innerRadius, angle), outerPoint = Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.e)(cx, cy, outerRadius, angle); - x1 = innerPoint.x, y1 = innerPoint.y, x2 = outerPoint.x, y2 = outerPoint.y; - } - return [ { - x: x1, - y: y1 - }, { - x: x2, - y: y2 - } ]; - } - }, { - key: "getAxisNameByLayout", - value: function(layout) { - return "horizontal" === layout ? { - numericAxisName: "yAxis", - cateAxisName: "xAxis" - } : "vertical" === layout ? { - numericAxisName: "xAxis", - cateAxisName: "yAxis" - } : "centric" === layout ? { - numericAxisName: "radiusAxis", - cateAxisName: "angleAxis" - } : { - numericAxisName: "angleAxis", - cateAxisName: "radiusAxis" - }; - } - }, { - key: "calculateTooltipPos", - value: function(rangeObj) { - var layout = this.props.layout; - return "horizontal" === layout ? rangeObj.x : "vertical" === layout ? rangeObj.y : "centric" === layout ? rangeObj.angle : rangeObj.radius; - } - }, { - key: "inRange", - value: function(x, y) { - var layout = this.props.layout; - if ("horizontal" === layout || "vertical" === layout) { - var offset = this.state.offset; - return x >= offset.left && x <= offset.left + offset.width && y >= offset.top && y <= offset.top + offset.height ? { - x: x, - y: y - } : null; - } - var _state7 = this.state, angleAxisMap = _state7.angleAxisMap, radiusAxisMap = _state7.radiusAxisMap; - if (angleAxisMap && radiusAxisMap) { - var angleAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(angleAxisMap); - return Object(__WEBPACK_IMPORTED_MODULE_23__util_PolarUtils__.d)({ - x: x, - y: y - }, angleAxis); - } - return null; - } - }, { - key: "parseEventsOfWrapper", - value: function() { - var children = this.props.children, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a), tooltipEvents = tooltipItem && "axis" === eventType ? { - onMouseEnter: this.handleMouseEnter, - onMouseMove: this.handleMouseMove, - onMouseLeave: this.handleMouseLeave, - onTouchMove: this.handleTouchMove - } : {}, outerEvents = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.e)(this.props, this.handleOuterEvent); - return _extends({}, outerEvents, tooltipEvents); - } - }, { - key: "updateStateOfAxisMapsOffsetAndStackGroups", - value: function(_ref5) { - var _this4 = this, props = _ref5.props, dataStartIndex = _ref5.dataStartIndex, dataEndIndex = _ref5.dataEndIndex, updateId = _ref5.updateId; - if (!Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.q)({ - props: props - })) return null; - var children = props.children, layout = props.layout, stackOffset = props.stackOffset, data = props.data, reverseStackOrder = props.reverseStackOrder, _getAxisNameByLayout2 = this.getAxisNameByLayout(layout), numericAxisName = _getAxisNameByLayout2.numericAxisName, cateAxisName = _getAxisNameByLayout2.cateAxisName, graphicalItems = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.h)(children, GraphicalChild), stackGroups = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.s)(data, graphicalItems, numericAxisName + "Id", cateAxisName + "Id", stackOffset, reverseStackOrder), axisObj = axisComponents.reduce(function(result, entry) { - var name = entry.axisType + "Map"; - return _extends({}, result, _defineProperty({}, name, _this4.getAxisMap(props, _extends({}, entry, { - graphicalItems: graphicalItems, - stackGroups: entry.axisType === numericAxisName && stackGroups, - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex - })))); - }, {}), offset = this.calculateOffset(_extends({}, axisObj, { - props: props, - graphicalItems: graphicalItems - })); - Object.keys(axisObj).forEach(function(key) { - axisObj[key] = formatAxisMap(props, axisObj[key], offset, key.replace("Map", ""), chartName); - }); - var cateAxisMap = axisObj[cateAxisName + "Map"], ticksObj = this.tooltipTicksGenerator(cateAxisMap), formatedGraphicalItems = this.getFormatItems(props, _extends({}, axisObj, { - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex, - updateId: updateId, - graphicalItems: graphicalItems, - stackGroups: stackGroups, - offset: offset - })); - return _extends({ - formatedGraphicalItems: formatedGraphicalItems, - graphicalItems: graphicalItems, - offset: offset, - stackGroups: stackGroups - }, ticksObj, axisObj); - } - }, { - key: "addListener", - value: function() { - __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.on(__WEBPACK_IMPORTED_MODULE_25__util_Events__.a, this.handleReceiveSyncEvent), - __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners(__WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners + 1); - } - }, { - key: "removeListener", - value: function() { - __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.removeListener(__WEBPACK_IMPORTED_MODULE_25__util_Events__.a, this.handleReceiveSyncEvent), - __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners && __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.setMaxListeners(__WEBPACK_IMPORTED_MODULE_25__util_Events__.b._maxListeners - 1); - } - }, { - key: "calculateOffset", - value: function(_ref6) { - var props = _ref6.props, graphicalItems = _ref6.graphicalItems, _ref6$xAxisMap = _ref6.xAxisMap, xAxisMap = void 0 === _ref6$xAxisMap ? {} : _ref6$xAxisMap, _ref6$yAxisMap = _ref6.yAxisMap, yAxisMap = void 0 === _ref6$yAxisMap ? {} : _ref6$yAxisMap, width = props.width, height = props.height, children = props.children, margin = props.margin || {}, brushItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__.a), legendItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_11__component_Legend__.a), offsetH = Object.keys(yAxisMap).reduce(function(result, id) { - var entry = yAxisMap[id], orientation = entry.orientation; - return entry.mirror || entry.hide ? result : _extends({}, result, _defineProperty({}, orientation, result[orientation] + entry.width)); - }, { - left: margin.left || 0, - right: margin.right || 0 - }), offsetV = Object.keys(xAxisMap).reduce(function(result, id) { - var entry = xAxisMap[id], orientation = entry.orientation; - return entry.mirror || entry.hide ? result : _extends({}, result, _defineProperty({}, orientation, result[orientation] + entry.height)); - }, { - top: margin.top || 0, - bottom: margin.bottom || 0 - }), offset = _extends({}, offsetV, offsetH), brushBottom = offset.bottom; - if (brushItem && (offset.bottom += brushItem.props.height || __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__.a.defaultProps.height), - legendItem && this.legendInstance) { - var legendBox = this.legendInstance.getBBox(); - offset = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.a)(offset, graphicalItems, props, legendBox); - } - return _extends({ - brushBottom: brushBottom - }, offset, { - width: width - offset.left - offset.right, - height: height - offset.top - offset.bottom - }); - } - }, { - key: "triggerSyncEvent", - value: function(data) { - var syncId = this.props.syncId; - __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(syncId) || __WEBPACK_IMPORTED_MODULE_25__util_Events__.b.emit(__WEBPACK_IMPORTED_MODULE_25__util_Events__.a, syncId, this.uniqueChartId, data); - } - }, { - key: "filterFormatItem", - value: function(item, displayName, childIndex) { - for (var formatedGraphicalItems = this.state.formatedGraphicalItems, i = 0, len = formatedGraphicalItems.length; i < len; i++) { - var entry = formatedGraphicalItems[i]; - if (entry.item === item || entry.props.key === item.key || displayName === Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.j)(entry.item.type) && childIndex === entry.childIndex) return entry; - } - return null; - } - }, { - key: "renderAxis", - value: function(axisOptions, element, displayName, index) { - var _props2 = this.props, width = _props2.width, height = _props2.height; - return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a, _extends({}, axisOptions, { - className: "recharts-" + axisOptions.axisType + " " + axisOptions.axisType, - key: element.key || displayName + "-" + index, - viewBox: { - x: 0, - y: 0, - width: width, - height: height - }, - ticksGenerator: this.axesTicksGenerator - })); - } - }, { - key: "renderLegend", - value: function() { - var _this5 = this, formatedGraphicalItems = this.state.formatedGraphicalItems, _props3 = this.props, children = _props3.children, width = _props3.width, height = _props3.height, margin = this.props.margin || {}, legendWidth = width - (margin.left || 0) - (margin.right || 0), legendHeight = height - (margin.top || 0) - (margin.bottom || 0), props = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.q)({ - children: children, - formatedGraphicalItems: formatedGraphicalItems, - legendWidth: legendWidth, - legendHeight: legendHeight, - legendContent: legendContent - }); - if (!props) return null; - var item = props.item, otherProps = _objectWithoutProperties(props, [ "item" ]); - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(item, _extends({}, otherProps, { - chartWidth: width, - chartHeight: height, - margin: margin, - ref: function(legend) { - _this5.legendInstance = legend; - }, - onBBoxUpdate: this.handleLegendBBoxUpdate - })); - } - }, { - key: "renderTooltip", - value: function() { - var children = this.props.children, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a); - if (!tooltipItem) return null; - var _state8 = this.state, isTooltipActive = _state8.isTooltipActive, activeCoordinate = _state8.activeCoordinate, activePayload = _state8.activePayload, activeLabel = _state8.activeLabel, offset = _state8.offset; - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(tooltipItem, { - viewBox: _extends({}, offset, { - x: offset.left, - y: offset.top - }), - active: isTooltipActive, - label: activeLabel, - payload: isTooltipActive ? activePayload : [], - coordinate: activeCoordinate - }); - } - }, { - key: "renderActiveDot", - value: function(option, props) { - var dot = void 0; - return dot = Object(__WEBPACK_IMPORTED_MODULE_5_react__.isValidElement)(option) ? Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(option, props) : __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(option) ? option(props) : __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_15__shape_Dot__.a, props), - __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_9__container_Layer__.a, { - className: "recharts-active-dot", - key: props.key - }, dot); - } - }, { - key: "renderActivePoints", - value: function(_ref7) { - var item = _ref7.item, activePoint = _ref7.activePoint, basePoint = _ref7.basePoint, childIndex = _ref7.childIndex, isRange = _ref7.isRange, result = [], key = item.props.key, _item$item$props = item.item.props, activeDot = _item$item$props.activeDot, dataKey = _item$item$props.dataKey, dotProps = _extends({ - index: childIndex, - dataKey: dataKey, - cx: activePoint.x, - cy: activePoint.y, - r: 4, - fill: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.r)(item.item), - strokeWidth: 2, - stroke: "#fff", - payload: activePoint.payload, - value: activePoint.value, - key: key + "-activePoint-" + childIndex - }, Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(activeDot), Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.e)(activeDot)); - return result.push(this.renderActiveDot(activeDot, dotProps, childIndex)), basePoint ? result.push(this.renderActiveDot(activeDot, _extends({}, dotProps, { - cx: basePoint.x, - cy: basePoint.y, - key: key + "-basePoint-" + childIndex - }), childIndex)) : isRange && result.push(null), result; - } - }, { - key: "render", - value: function() { - var _this6 = this; - if (!Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.q)(this)) return null; - var _props4 = this.props, children = _props4.children, className = _props4.className, width = _props4.width, height = _props4.height, style = _props4.style, compact = _props4.compact, others = _objectWithoutProperties(_props4, [ "children", "className", "width", "height", "style", "compact" ]), attrs = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(others), map = { - CartesianGrid: { - handler: this.renderGrid, - once: !0 - }, - ReferenceArea: { - handler: this.renderReferenceElement - }, - ReferenceLine: { - handler: this.renderReferenceElement - }, - ReferenceDot: { - handler: this.renderReferenceElement - }, - XAxis: { - handler: this.renderXAxis - }, - YAxis: { - handler: this.renderYAxis - }, - Brush: { - handler: this.renderBrush, - once: !0 - }, - Bar: { - handler: this.renderGraphicChild - }, - Line: { - handler: this.renderGraphicChild - }, - Area: { - handler: this.renderGraphicChild - }, - Radar: { - handler: this.renderGraphicChild - }, - RadialBar: { - handler: this.renderGraphicChild - }, - Scatter: { - handler: this.renderGraphicChild - }, - Pie: { - handler: this.renderGraphicChild - }, - Tooltip: { - handler: this.renderCursor, - once: !0 - }, - PolarGrid: { - handler: this.renderPolarGrid, - once: !0 - }, - PolarAngleAxis: { - handler: this.renderPolarAxis - }, - PolarRadiusAxis: { - handler: this.renderPolarAxis - } - }; - if (compact) return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Surface__.a, _extends({}, attrs, { - width: width, - height: height - }), Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.p)(children, map)); - var events = this.parseEventsOfWrapper(); - return __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement("div", _extends({ - className: __WEBPACK_IMPORTED_MODULE_7_classnames___default()("recharts-wrapper", className), - style: _extends({}, style, { - position: "relative", - cursor: "default", - width: width, - height: height - }) - }, events, { - ref: function(node) { - _this6.container = node; - } - }), __WEBPACK_IMPORTED_MODULE_5_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_8__container_Surface__.a, _extends({}, attrs, { - width: width, - height: height - }), Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.p)(children, map)), this.renderLegend(), this.renderTooltip()); - } - } ]), CategoricalChartWrapper; - }(__WEBPACK_IMPORTED_MODULE_5_react__.Component), _class.displayName = chartName, - _class.propTypes = _extends({ - syncId: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number ]), - compact: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool, - width: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - height: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - data: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object), - layout: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "horizontal", "vertical" ]), - stackOffset: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOf([ "sign", "expand", "none", "wiggle", "silhouette" ]), - throttleDelay: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - margin: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.shape({ - top: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - right: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - bottom: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - left: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number - }), - barCategoryGap: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - barGap: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - barSize: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string ]), - maxBarSize: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.number, - style: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.object, - className: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string, - children: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.node ]), - onClick: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseLeave: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseEnter: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseMove: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseDown: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - onMouseUp: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.func, - reverseStackOrder: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.bool, - id: __WEBPACK_IMPORTED_MODULE_6_prop_types___default.a.string - }, propTypes), _class.defaultProps = _extends({ - layout: "horizontal", - stackOffset: "none", - barCategoryGap: "10%", - barGap: 4, - margin: { - top: 5, - right: 5, - bottom: 5, - left: 5 - }, - reverseStackOrder: !1 - }, defaultProps), _class.createDefaultState = function(props) { - var children = props.children, brushItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_19__cartesian_Brush__.a); - return { - chartX: 0, - chartY: 0, - dataStartIndex: brushItem && brushItem.props && brushItem.props.startIndex || 0, - dataEndIndex: brushItem && brushItem.props && brushItem.props.endIndex || props.data && props.data.length - 1 || 0, - activeTooltipIndex: -1, - isTooltipActive: !1 - }; - }, _class.hasBar = function(graphicalItems) { - return !(!graphicalItems || !graphicalItems.length) && graphicalItems.some(function(item) { - var name = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.j)(item && item.type); - return name && name.indexOf("Bar") >= 0; - }); - }, _class.getDisplayedData = function(props, _ref8, item) { - var graphicalItems = _ref8.graphicalItems, dataStartIndex = _ref8.dataStartIndex, dataEndIndex = _ref8.dataEndIndex, itemsData = (graphicalItems || []).reduce(function(result, child) { - var itemData = child.props.data; - return itemData && itemData.length ? [].concat(_toConsumableArray(result), _toConsumableArray(itemData)) : result; - }, []); - if (itemsData && itemsData.length > 0) return itemsData; - if (item && item.props && item.props.data && item.props.data.length > 0) return item.props.data; - var data = props.data; - return data && data.length && Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(dataStartIndex) && Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(dataEndIndex) ? data.slice(dataStartIndex, dataEndIndex + 1) : []; - }, _initialiseProps = function() { - var _this7 = this; - this.handleLegendBBoxUpdate = function(box) { - if (box && _this7.legendInstance) { - var _state9 = _this7.state, dataStartIndex = _state9.dataStartIndex, dataEndIndex = _state9.dataEndIndex, updateId = _state9.updateId; - _this7.setState(_this7.updateStateOfAxisMapsOffsetAndStackGroups({ - props: _this7.props, - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex, - updateId: updateId - })); - } - }, this.handleReceiveSyncEvent = function(cId, chartId, data) { - var _props5 = _this7.props, syncId = _props5.syncId, layout = _props5.layout, updateId = _this7.state.updateId; - if (syncId === cId && chartId !== _this7.uniqueChartId) { - var dataStartIndex = data.dataStartIndex, dataEndIndex = data.dataEndIndex; - if (__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(data.dataStartIndex) && __WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(data.dataEndIndex)) if (__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(data.activeTooltipIndex)) _this7.setState(data); else { - var chartX = data.chartX, chartY = data.chartY, activeTooltipIndex = data.activeTooltipIndex, _state10 = _this7.state, offset = _state10.offset, tooltipTicks = _state10.tooltipTicks; - if (!offset) return; - var viewBox = _extends({}, offset, { - x: offset.left, - y: offset.top - }), validateChartX = Math.min(chartX, viewBox.x + viewBox.width), validateChartY = Math.min(chartY, viewBox.y + viewBox.height), activeLabel = tooltipTicks[activeTooltipIndex] && tooltipTicks[activeTooltipIndex].value, activePayload = _this7.getTooltipContent(activeTooltipIndex), activeCoordinate = tooltipTicks[activeTooltipIndex] ? { - x: "horizontal" === layout ? tooltipTicks[activeTooltipIndex].coordinate : validateChartX, - y: "horizontal" === layout ? validateChartY : tooltipTicks[activeTooltipIndex].coordinate - } : originCoordinate; - _this7.setState(_extends({}, data, { - activeLabel: activeLabel, - activeCoordinate: activeCoordinate, - activePayload: activePayload - })); - } else _this7.setState(_extends({ - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex - }, _this7.updateStateOfAxisMapsOffsetAndStackGroups({ - props: _this7.props, - dataStartIndex: dataStartIndex, - dataEndIndex: dataEndIndex, - updateId: updateId - }))); - } - }, this.handleBrushChange = function(_ref9) { - var startIndex = _ref9.startIndex, endIndex = _ref9.endIndex; - if (startIndex !== _this7.state.dataStartIndex || endIndex !== _this7.state.dataEndIndex) { - var updateId = _this7.state.updateId; - _this7.setState(function() { - return _extends({ - dataStartIndex: startIndex, - dataEndIndex: endIndex - }, _this7.updateStateOfAxisMapsOffsetAndStackGroups({ - props: _this7.props, - dataStartIndex: startIndex, - dataEndIndex: endIndex, - updateId: updateId - })); - }), _this7.triggerSyncEvent({ - dataStartIndex: startIndex, - dataEndIndex: endIndex - }); - } - }, this.handleMouseEnter = function(e) { - var onMouseEnter = _this7.props.onMouseEnter, mouse = _this7.getMouseInfo(e); - if (mouse) { - var nextState = _extends({}, mouse, { - isTooltipActive: !0 - }); - _this7.setState(nextState), _this7.triggerSyncEvent(nextState), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseEnter) && onMouseEnter(nextState, e); - } - }, this.triggeredAfterMouseMove = function(e) { - var onMouseMove = _this7.props.onMouseMove, mouse = _this7.getMouseInfo(e), nextState = mouse ? _extends({}, mouse, { - isTooltipActive: !0 - }) : { - isTooltipActive: !1 - }; - _this7.setState(nextState), _this7.triggerSyncEvent(nextState), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseMove) && onMouseMove(nextState, e); - }, this.handleItemMouseEnter = function(el) { - _this7.setState(function() { - return { - isTooltipActive: !0, - activeItem: el, - activePayload: el.tooltipPayload, - activeCoordinate: el.tooltipPosition || { - x: el.cx, - y: el.cy - } - }; - }); - }, this.handleItemMouseLeave = function() { - _this7.setState(function() { - return { - isTooltipActive: !1 - }; - }); - }, this.handleMouseMove = function(e) { - e && __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(e.persist) && e.persist(), - _this7.triggeredAfterMouseMove(e); - }, this.handleMouseLeave = function(e) { - var onMouseLeave = _this7.props.onMouseLeave, nextState = { - isTooltipActive: !1 - }; - _this7.setState(nextState), _this7.triggerSyncEvent(nextState), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseLeave) && onMouseLeave(nextState, e); - }, this.handleOuterEvent = function(e) { - var eventName = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.l)(e); - if (eventName && __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(_this7.props[eventName])) { - var mouse = _this7.getMouseInfo(e); - (0, _this7.props[eventName])(mouse, e); - } - }, this.handleClick = function(e) { - var onClick = _this7.props.onClick; - if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onClick)) { - onClick(_this7.getMouseInfo(e), e); - } - }, this.handleMouseDown = function(e) { - var onMouseDown = _this7.props.onMouseDown; - if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseDown)) { - onMouseDown(_this7.getMouseInfo(e), e); - } - }, this.handleMouseUp = function(e) { - var onMouseUp = _this7.props.onMouseUp; - if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(onMouseUp)) { - onMouseUp(_this7.getMouseInfo(e), e); - } - }, this.handleTouchMove = function(e) { - null != e.changedTouches && e.changedTouches.length > 0 && _this7.handleMouseMove(e.changedTouches[0]); - }, this.verticalCoordinatesGenerator = function(_ref10) { - var xAxis = _ref10.xAxis, width = _ref10.width, height = _ref10.height, offset = _ref10.offset; - return Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.m)(__WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.getTicks(_extends({}, __WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.defaultProps, xAxis, { - ticks: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(xAxis, !0), - viewBox: { - x: 0, - y: 0, - width: width, - height: height - } - })), offset.left, offset.left + offset.width); - }, this.horizontalCoordinatesGenerator = function(_ref11) { - var yAxis = _ref11.yAxis, width = _ref11.width, height = _ref11.height, offset = _ref11.offset; - return Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.m)(__WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.getTicks(_extends({}, __WEBPACK_IMPORTED_MODULE_18__cartesian_CartesianAxis__.a.defaultProps, yAxis, { - ticks: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(yAxis, !0), - viewBox: { - x: 0, - y: 0, - width: width, - height: height - } - })), offset.top, offset.top + offset.height); - }, this.axesTicksGenerator = function(axis) { - return Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axis, !0); - }, this.tooltipTicksGenerator = function(axisMap) { - var axis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(axisMap), tooltipTicks = Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axis, !1, !0); - return { - tooltipTicks: tooltipTicks, - orderedTooltipTicks: __WEBPACK_IMPORTED_MODULE_0_lodash_sortBy___default()(tooltipTicks, function(o) { - return o.coordinate; - }), - tooltipAxis: axis, - tooltipAxisBandSize: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.g)(axis) - }; - }, this.renderCursor = function(element) { - var _state11 = _this7.state, isTooltipActive = _state11.isTooltipActive, activeCoordinate = _state11.activeCoordinate, activePayload = _state11.activePayload, offset = _state11.offset; - if (!(element && element.props.cursor && isTooltipActive && activeCoordinate)) return null; - var layout = _this7.props.layout, restProps = void 0, cursorComp = __WEBPACK_IMPORTED_MODULE_12__shape_Curve__.a; - if ("ScatterChart" === chartName) restProps = activeCoordinate, cursorComp = __WEBPACK_IMPORTED_MODULE_13__shape_Cross__.a; else if ("BarChart" === chartName) restProps = _this7.getCursorRectangle(), - cursorComp = __WEBPACK_IMPORTED_MODULE_16__shape_Rectangle__.a; else if ("radial" === layout) { - var _getCursorPoints = _this7.getCursorPoints(), cx = _getCursorPoints.cx, cy = _getCursorPoints.cy, radius = _getCursorPoints.radius, startAngle = _getCursorPoints.startAngle, endAngle = _getCursorPoints.endAngle; - restProps = { - cx: cx, - cy: cy, - startAngle: startAngle, - endAngle: endAngle, - innerRadius: radius, - outerRadius: radius - }, cursorComp = __WEBPACK_IMPORTED_MODULE_14__shape_Sector__.a; - } else restProps = { - points: _this7.getCursorPoints() - }, cursorComp = __WEBPACK_IMPORTED_MODULE_12__shape_Curve__.a; - var key = element.key || "_recharts-cursor", cursorProps = _extends({ - stroke: "#ccc" - }, offset, restProps, Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.k)(element.props.cursor), { - payload: activePayload, - key: key, - className: "recharts-tooltip-cursor" - }); - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.isValidElement)(element.props.cursor) ? Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element.props.cursor, cursorProps) : Object(__WEBPACK_IMPORTED_MODULE_5_react__.createElement)(cursorComp, cursorProps); - }, this.renderPolarAxis = function(element, displayName, index) { - var axisType = element.type.axisType, axisMap = _this7.state[axisType + "Map"], axisOption = axisMap[element.props[axisType + "Id"]]; - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, _extends({}, axisOption, { - className: axisType, - key: element.key || displayName + "-" + index, - ticks: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(axisOption, !0) - })); - }, this.renderXAxis = function(element, displayName, index) { - var xAxisMap = _this7.state.xAxisMap, axisObj = xAxisMap[element.props.xAxisId]; - return _this7.renderAxis(axisObj, element, displayName, index); - }, this.renderYAxis = function(element, displayName, index) { - var yAxisMap = _this7.state.yAxisMap, axisObj = yAxisMap[element.props.yAxisId]; - return _this7.renderAxis(axisObj, element, displayName, index); - }, this.renderGrid = function(element) { - var _state12 = _this7.state, xAxisMap = _state12.xAxisMap, yAxisMap = _state12.yAxisMap, offset = _state12.offset, _props6 = _this7.props, width = _props6.width, height = _props6.height, xAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(xAxisMap), yAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(yAxisMap), props = element.props || {}; - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, { - key: element.key || "grid", - x: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.x) ? props.x : offset.left, - y: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.y) ? props.y : offset.top, - width: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.width) ? props.width : offset.width, - height: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(props.height) ? props.height : offset.height, - xAxis: xAxis, - yAxis: yAxis, - offset: offset, - chartWidth: width, - chartHeight: height, - verticalCoordinatesGenerator: _this7.verticalCoordinatesGenerator, - horizontalCoordinatesGenerator: _this7.horizontalCoordinatesGenerator - }); - }, this.renderPolarGrid = function(element) { - var _state13 = _this7.state, radiusAxisMap = _state13.radiusAxisMap, angleAxisMap = _state13.angleAxisMap, radiusAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(radiusAxisMap), angleAxis = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.b)(angleAxisMap), cx = angleAxis.cx, cy = angleAxis.cy, innerRadius = angleAxis.innerRadius, outerRadius = angleAxis.outerRadius; - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, { - polarAngles: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(angleAxis, !0).map(function(entry) { - return entry.coordinate; - }), - polarRadius: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.u)(radiusAxis, !0).map(function(entry) { - return entry.coordinate; - }), - cx: cx, - cy: cy, - innerRadius: innerRadius, - outerRadius: outerRadius, - key: element.key || "polar-grid" - }); - }, this.renderBrush = function(element) { - var _props7 = _this7.props, margin = _props7.margin, data = _props7.data, _state14 = _this7.state, offset = _state14.offset, dataStartIndex = _state14.dataStartIndex, dataEndIndex = _state14.dataEndIndex, updateId = _state14.updateId; - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, { - key: element.key || "_recharts-brush", - onChange: Object(__WEBPACK_IMPORTED_MODULE_22__util_ChartUtils__.d)(_this7.handleBrushChange, null, element.props.onChange), - data: data, - x: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(element.props.x) ? element.props.x : offset.left, - y: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(element.props.y) ? element.props.y : offset.top + offset.height + offset.brushBottom - (margin.bottom || 0), - width: Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.h)(element.props.width) ? element.props.width : offset.width, - startIndex: dataStartIndex, - endIndex: dataEndIndex, - updateId: "brush-" + updateId - }); - }, this.renderReferenceElement = function(element, displayName, index) { - if (!element) return null; - var _state15 = _this7.state, xAxisMap = _state15.xAxisMap, yAxisMap = _state15.yAxisMap, offset = _state15.offset, _element$props = element.props, xAxisId = _element$props.xAxisId, yAxisId = _element$props.yAxisId; - return Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, { - key: element.key || displayName + "-" + index, - xAxis: xAxisMap[xAxisId], - yAxis: yAxisMap[yAxisId], - viewBox: { - x: offset.left, - y: offset.top, - width: offset.width, - height: offset.height - } - }); - }, this.renderGraphicChild = function(element, displayName, index) { - var item = _this7.filterFormatItem(element, displayName, index); - if (!item) return null; - var graphicalItem = Object(__WEBPACK_IMPORTED_MODULE_5_react__.cloneElement)(element, item.props), _state16 = _this7.state, isTooltipActive = _state16.isTooltipActive, tooltipAxis = _state16.tooltipAxis, activeTooltipIndex = _state16.activeTooltipIndex, activeLabel = _state16.activeLabel, children = _this7.props.children, tooltipItem = Object(__WEBPACK_IMPORTED_MODULE_17__util_ReactUtils__.i)(children, __WEBPACK_IMPORTED_MODULE_10__component_Tooltip__.a), _item$props2 = item.props, points = _item$props2.points, isRange = _item$props2.isRange, baseLine = _item$props2.baseLine, _item$item$props2 = item.item.props, activeDot = _item$item$props2.activeDot; - if (!_item$item$props2.hide && isTooltipActive && tooltipItem && activeDot && activeTooltipIndex >= 0) { - var activePoint = void 0, basePoint = void 0; - if (tooltipAxis.dataKey && !tooltipAxis.allowDuplicatedCategory ? (activePoint = Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.a)(points, "payload." + tooltipAxis.dataKey, activeLabel), - basePoint = isRange && baseLine && Object(__WEBPACK_IMPORTED_MODULE_21__util_DataUtils__.a)(baseLine, "payload." + tooltipAxis.dataKey, activeLabel)) : (activePoint = points[activeTooltipIndex], - basePoint = isRange && baseLine && baseLine[activeTooltipIndex]), !__WEBPACK_IMPORTED_MODULE_4_lodash_isNil___default()(activePoint)) return [ graphicalItem ].concat(_toConsumableArray(_this7.renderActivePoints({ - item: item, - activePoint: activePoint, - basePoint: basePoint, - childIndex: activeTooltipIndex, - isRange: isRange - }))); - } - return isRange ? [ graphicalItem, null, null ] : [ graphicalItem, null ]; - }; - }, _temp; - }; - __webpack_exports__.a = generateCategoricalChart; -}, function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - function invariant(condition, format, a, b, c, d, e, f) { - if (validateFormat(format), !condition) { - var error; - if (void 0 === format) error = new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings."); else { - var args = [ a, b, c, d, e, f ], argIndex = 0; - error = new Error(format.replace(/%s/g, function() { - return args[argIndex++]; - })), error.name = "Invariant Violation"; - } - throw error.framesToPop = 1, error; - } - } - var validateFormat = function(format) {}; - "production" !== process.env.NODE_ENV && (validateFormat = function(format) { - if (void 0 === format) throw new Error("invariant requires an error message argument"); - }), module.exports = invariant; - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - "use strict"; - function makeEmptyFunction(arg) { - return function() { - return arg; - }; - } - var emptyFunction = function() {}; - emptyFunction.thatReturns = makeEmptyFunction, emptyFunction.thatReturnsFalse = makeEmptyFunction(!1), - emptyFunction.thatReturnsTrue = makeEmptyFunction(!0), emptyFunction.thatReturnsNull = makeEmptyFunction(null), - emptyFunction.thatReturnsThis = function() { - return this; - }, emptyFunction.thatReturnsArgument = function(arg) { - return arg; - }, module.exports = emptyFunction; -}, function(module, exports, __webpack_require__) { - var aFunction = __webpack_require__(223); - module.exports = function(fn, that, length) { - if (aFunction(fn), void 0 === that) return fn; - switch (length) { - case 1: - return function(a) { - return fn.call(that, a); - }; - - case 2: - return function(a, b) { - return fn.call(that, a, b); - }; - - case 3: - return function(a, b, c) { - return fn.call(that, a, b, c); - }; - } - return function() { - return fn.apply(that, arguments); - }; - }; -}, function(module, exports, __webpack_require__) { - var isObject = __webpack_require__(35); - module.exports = function(it) { - if (!isObject(it)) throw TypeError(it + " is not an object!"); - return it; - }; -}, function(module, exports) { - module.exports = function(exec) { - try { - return !!exec(); - } catch (e) { - return !0; - } - }; -}, function(module, exports) { - var hasOwnProperty = {}.hasOwnProperty; - module.exports = function(it, key) { - return hasOwnProperty.call(it, key); - }; -}, function(module, exports, __webpack_require__) { - module.exports = { - default: __webpack_require__(421), - __esModule: !0 - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - function capitalize(string) { - if ("production" !== process.env.NODE_ENV && "string" != typeof string) throw new Error("Material-UI: capitalize(string) expects a string argument."); - return string.charAt(0).toUpperCase() + string.slice(1); - } - function contains(obj, pred) { - return (0, _keys2.default)(pred).every(function(key) { - return obj.hasOwnProperty(key) && obj[key] === pred[key]; - }); - } - function findIndex(arr, pred) { - for (var predType = void 0 === pred ? "undefined" : (0, _typeof3.default)(pred), i = 0; i < arr.length; i += 1) { - if ("function" === predType && !0 == !!pred(arr[i], i, arr)) return i; - if ("object" === predType && contains(arr[i], pred)) return i; - if (-1 !== [ "string", "number", "boolean" ].indexOf(predType)) return arr.indexOf(pred); - } - return -1; - } - function find(arr, pred) { - var index = findIndex(arr, pred); - return index > -1 ? arr[index] : void 0; - } - function createChainedFunction() { - for (var _len = arguments.length, funcs = Array(_len), _key = 0; _key < _len; _key++) funcs[_key] = arguments[_key]; - return funcs.filter(function(func) { - return null != func; - }).reduce(function(acc, func) { - return "production" !== process.env.NODE_ENV && (0, _warning2.default)("function" == typeof func, "Material-UI: invalid Argument Type, must only provide functions, undefined, or null."), - function() { - for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) args[_key2] = arguments[_key2]; - acc.apply(this, args), func.apply(this, args); - }; - }, function() {}); - } - Object.defineProperty(exports, "__esModule", { - value: !0 - }); - var _typeof2 = __webpack_require__(105), _typeof3 = _interopRequireDefault(_typeof2), _keys = __webpack_require__(55), _keys2 = _interopRequireDefault(_keys); - exports.capitalize = capitalize, exports.contains = contains, exports.findIndex = findIndex, - exports.find = find, exports.createChainedFunction = createChainedFunction; - var _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning); - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - function getNative(object, key) { - var value = getValue(object, key); - return baseIsNative(value) ? value : void 0; - } - var baseIsNative = __webpack_require__(611), getValue = __webpack_require__(614); - module.exports = getNative; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_exports__.a = function(x) { - return function() { - return x; - }; - }; -}, function(module, exports, __webpack_require__) { - function getNative(object, key) { - var value = getValue(object, key); - return baseIsNative(value) ? value : void 0; - } - var baseIsNative = __webpack_require__(668), getValue = __webpack_require__(673); - module.exports = getNative; -}, function(module, exports, __webpack_require__) { - function baseGetTag(value) { - return null == value ? void 0 === value ? undefinedTag : nullTag : symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value); - } - var Symbol = __webpack_require__(128), getRawTag = __webpack_require__(669), objectToString = __webpack_require__(670), nullTag = "[object Null]", undefinedTag = "[object Undefined]", symToStringTag = Symbol ? Symbol.toStringTag : void 0; - module.exports = baseGetTag; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _objectWithoutProperties(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - } - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 - } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var _class, _temp2, __WEBPACK_IMPORTED_MODULE_0_lodash_isNil__ = __webpack_require__(20), __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isNil__), __WEBPACK_IMPORTED_MODULE_1_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react__), __WEBPACK_IMPORTED_MODULE_2_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_2_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_prop_types__), __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc__ = __webpack_require__(771), __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_reduce_css_calc__), __WEBPACK_IMPORTED_MODULE_4_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_4_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_classnames__), __WEBPACK_IMPORTED_MODULE_5__util_DataUtils__ = __webpack_require__(9), __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_7__util_DOMUtils__ = __webpack_require__(198), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), BREAKING_SPACES = /[ \f\n\r\t\v\u2028\u2029]+/, calculateWordWidths = function(props) { - try { - return { - wordsWithComputedWidth: (__WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(props.children) ? [] : props.children.toString().split(BREAKING_SPACES)).map(function(word) { - return { - word: word, - width: Object(__WEBPACK_IMPORTED_MODULE_7__util_DOMUtils__.c)(word, props.style).width - }; - }), - spaceWidth: Object(__WEBPACK_IMPORTED_MODULE_7__util_DOMUtils__.c)(" ", props.style).width - }; - } catch (e) { - return null; - } - }, Text = (_temp2 = _class = function(_Component) { - function Text() { - var _ref, _temp, _this, _ret; - _classCallCheck(this, Text); - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key]; - return _temp = _this = _possibleConstructorReturn(this, (_ref = Text.__proto__ || Object.getPrototypeOf(Text)).call.apply(_ref, [ this ].concat(args))), - _this.state = { - wordsByLines: [] - }, _ret = _temp, _possibleConstructorReturn(_this, _ret); - } - return _inherits(Text, _Component), _createClass(Text, [ { - key: "componentWillMount", - value: function() { - this.updateWordsByLines(this.props, !0); - } - }, { - key: "componentWillReceiveProps", - value: function(nextProps) { - var needCalculate = this.props.children !== nextProps.children || this.props.style !== nextProps.style; - this.updateWordsByLines(nextProps, needCalculate); - } - }, { - key: "updateWordsByLines", - value: function(props, needCalculate) { - if (!props.width && !props.scaleToFit || Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.n)()) this.updateWordsWithoutCalculate(props); else { - if (needCalculate) { - var wordWidths = calculateWordWidths(props); - if (!wordWidths) return void this.updateWordsWithoutCalculate(props); - var wordsWithComputedWidth = wordWidths.wordsWithComputedWidth, spaceWidth = wordWidths.spaceWidth; - this.wordsWithComputedWidth = wordsWithComputedWidth, this.spaceWidth = spaceWidth; - } - var wordsByLines = this.calculateWordsByLines(this.wordsWithComputedWidth, this.spaceWidth, props.width); - this.setState({ - wordsByLines: wordsByLines - }); - } - } - }, { - key: "updateWordsWithoutCalculate", - value: function(props) { - var words = __WEBPACK_IMPORTED_MODULE_0_lodash_isNil___default()(props.children) ? [] : props.children.toString().split(BREAKING_SPACES); - this.setState({ - wordsByLines: [ { - words: words - } ] - }); - } - }, { - key: "calculateWordsByLines", - value: function(wordsWithComputedWidth, spaceWidth, lineWidth) { - var scaleToFit = this.props.scaleToFit; - return wordsWithComputedWidth.reduce(function(result, _ref2) { - var word = _ref2.word, width = _ref2.width, currentLine = result[result.length - 1]; - if (currentLine && (null == lineWidth || scaleToFit || currentLine.width + width + spaceWidth < lineWidth)) currentLine.words.push(word), - currentLine.width += width + spaceWidth; else { - var newLine = { - words: [ word ], - width: width - }; - result.push(newLine); - } - return result; - }, []); - } - }, { - key: "render", - value: function() { - var _props = this.props, dx = _props.dx, dy = _props.dy, textAnchor = _props.textAnchor, verticalAnchor = _props.verticalAnchor, scaleToFit = _props.scaleToFit, angle = _props.angle, lineHeight = _props.lineHeight, capHeight = _props.capHeight, className = _props.className, textProps = _objectWithoutProperties(_props, [ "dx", "dy", "textAnchor", "verticalAnchor", "scaleToFit", "angle", "lineHeight", "capHeight", "className" ]), wordsByLines = this.state.wordsByLines; - if (!Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.g)(textProps.x) || !Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.g)(textProps.y)) return null; - var x = textProps.x + (Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(dx) ? dx : 0), y = textProps.y + (Object(__WEBPACK_IMPORTED_MODULE_5__util_DataUtils__.h)(dy) ? dy : 0), startDy = void 0; - switch (verticalAnchor) { - case "start": - startDy = __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default()("calc(" + capHeight + ")"); - break; - - case "middle": - startDy = __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default()("calc(" + (wordsByLines.length - 1) / 2 + " * -" + lineHeight + " + (" + capHeight + " / 2))"); - break; - - default: - startDy = __WEBPACK_IMPORTED_MODULE_3_reduce_css_calc___default()("calc(" + (wordsByLines.length - 1) + " * -" + lineHeight + ")"); - } - var transforms = []; - if (scaleToFit) { - var lineWidth = wordsByLines[0].width; - transforms.push("scale(" + this.props.width / lineWidth + ")"); - } - return angle && transforms.push("rotate(" + angle + ", " + x + ", " + y + ")"), - transforms.length && (textProps.transform = transforms.join(" ")), __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("text", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.k)(textProps), { - x: x, - y: y, - className: __WEBPACK_IMPORTED_MODULE_4_classnames___default()("recharts-text", className), - textAnchor: textAnchor - }), wordsByLines.map(function(line, index) { - return __WEBPACK_IMPORTED_MODULE_1_react___default.a.createElement("tspan", { - x: x, - dy: 0 === index ? startDy : lineHeight, - key: index - }, line.words.join(" ")); - })); - } - } ]), Text; - }(__WEBPACK_IMPORTED_MODULE_1_react__.Component), _class.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_6__util_ReactUtils__.c, { - scaleToFit: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.bool, - angle: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.number, - textAnchor: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "start", "middle", "end", "inherit" ]), - verticalAnchor: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.oneOf([ "start", "middle", "end" ]), - style: __WEBPACK_IMPORTED_MODULE_2_prop_types___default.a.object - }), _class.defaultProps = { - x: 0, - y: 0, - lineHeight: "1em", - capHeight: "0.71em", - scaleToFit: !1, - textAnchor: "start", - verticalAnchor: "end" - }, _temp2); - __webpack_exports__.a = Text; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_require__.d(__webpack_exports__, "a", function() { - return map; - }), __webpack_require__.d(__webpack_exports__, "b", function() { - return slice; - }); - var array = Array.prototype, map = array.map, slice = array.slice; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 - } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), Dot = Object(__WEBPACK_IMPORTED_MODULE_3__util_PureRender__.a)((_temp = _class2 = function(_Component) { - function Dot() { - return _classCallCheck(this, Dot), _possibleConstructorReturn(this, (Dot.__proto__ || Object.getPrototypeOf(Dot)).apply(this, arguments)); - } - return _inherits(Dot, _Component), _createClass(Dot, [ { - key: "render", - value: function() { - var _props = this.props, cx = _props.cx, cy = _props.cy, r = _props.r, className = _props.className, layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-dot", className); - return cx === +cx && cy === +cy && r === +r ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("circle", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_4__util_ReactUtils__.e)(this.props, null, !0), { - className: layerClass, - cx: cx, - cy: cy, - r: r - })) : null; - } - } ]), Dot; - }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "Dot", _class2.propTypes = { - className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, - cx: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - cy: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - r: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number - }, _class = _temp)) || _class; - __webpack_exports__.a = Dot; -}, function(module, exports, __webpack_require__) { - var IObject = __webpack_require__(146), defined = __webpack_require__(148); - module.exports = function(it) { - return IObject(defined(it)); - }; -}, function(module, exports, __webpack_require__) { - var defined = __webpack_require__(148); - module.exports = function(it) { - return Object(defined(it)); - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - Object.defineProperty(exports, "__esModule", { - value: !0 - }); - var _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) { - return typeof obj; - } : function(obj) { - return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), _warning = __webpack_require__(11), _warning2 = _interopRequireDefault(_warning), _toCss = __webpack_require__(163), _toCss2 = _interopRequireDefault(_toCss), _toCssValue = __webpack_require__(110), _toCssValue2 = _interopRequireDefault(_toCssValue), StyleRule = function() { - function StyleRule(key, style, options) { - _classCallCheck(this, StyleRule), this.type = "style", this.isProcessed = !1; - var sheet = options.sheet, Renderer = options.Renderer, selector = options.selector; - this.key = key, this.options = options, this.style = style, selector && (this.selectorText = selector), - this.renderer = sheet ? sheet.renderer : new Renderer(); - } - return _createClass(StyleRule, [ { - key: "prop", - value: function(name, value) { - if (void 0 === value) return this.style[name]; - if (this.style[name] === value) return this; - value = this.options.jss.plugins.onChangeValue(value, name, this); - var isEmpty = null == value || !1 === value, isDefined = name in this.style; - if (isEmpty && !isDefined) return this; - var remove = isEmpty && isDefined; - if (remove ? delete this.style[name] : this.style[name] = value, this.renderable) return remove ? this.renderer.removeProperty(this.renderable, name) : this.renderer.setProperty(this.renderable, name, value), - this; - var sheet = this.options.sheet; - return sheet && sheet.attached && (0, _warning2.default)(!1, 'Rule is not linked. Missing sheet option "link: true".'), - this; - } - }, { - key: "applyTo", - value: function(renderable) { - var json = this.toJSON(); - for (var prop in json) this.renderer.setProperty(renderable, prop, json[prop]); - return this; - } - }, { - key: "toJSON", - value: function() { - var json = {}; - for (var prop in this.style) { - var value = this.style[prop]; - "object" !== (void 0 === value ? "undefined" : _typeof(value)) ? json[prop] = value : Array.isArray(value) && (json[prop] = (0, - _toCssValue2.default)(value)); - } - return json; - } - }, { - key: "toString", - value: function(options) { - var sheet = this.options.sheet, link = !!sheet && sheet.options.link, opts = link ? _extends({}, options, { - allowEmpty: !0 - }) : options; - return (0, _toCss2.default)(this.selector, this.style, opts); - } - }, { - key: "selector", - set: function(selector) { - if (selector !== this.selectorText && (this.selectorText = selector, this.renderable)) { - if (!this.renderer.setSelector(this.renderable, selector) && this.renderable) { - var renderable = this.renderer.replaceRule(this.renderable, this); - renderable && (this.renderable = renderable); - } - } - }, - get: function() { - return this.selectorText; - } - } ]), StyleRule; - }(); - exports.default = StyleRule; -}, function(module, exports, __webpack_require__) { - function isSymbol(value) { - return "symbol" == typeof value || isObjectLike(value) && baseGetTag(value) == symbolTag; - } - var baseGetTag = __webpack_require__(41), isObjectLike = __webpack_require__(42), symbolTag = "[object Symbol]"; - module.exports = isSymbol; -}, function(module, exports) { - function identity(value) { - return value; - } - module.exports = identity; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_exports__.a = function(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 - } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var _class, _class2, _temp2, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3_react_smooth__ = __webpack_require__(33), __WEBPACK_IMPORTED_MODULE_3_react_smooth___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_react_smooth__), __WEBPACK_IMPORTED_MODULE_4__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), getRectangePath = function(x, y, width, height, radius) { - var maxRadius = Math.min(Math.abs(width) / 2, Math.abs(height) / 2), sign = height >= 0 ? 1 : -1, clockWise = height >= 0 ? 1 : 0, path = void 0; - if (maxRadius > 0 && radius instanceof Array) { - for (var newRadius = [], i = 0; i < 4; i++) newRadius[i] = radius[i] > maxRadius ? maxRadius : radius[i]; - path = "M" + x + "," + (y + sign * newRadius[0]), newRadius[0] > 0 && (path += "A " + newRadius[0] + "," + newRadius[0] + ",0,0," + clockWise + "," + (x + newRadius[0]) + "," + y), - path += "L " + (x + width - newRadius[1]) + "," + y, newRadius[1] > 0 && (path += "A " + newRadius[1] + "," + newRadius[1] + ",0,0," + clockWise + ",\n " + (x + width) + "," + (y + sign * newRadius[1])), - path += "L " + (x + width) + "," + (y + height - sign * newRadius[2]), newRadius[2] > 0 && (path += "A " + newRadius[2] + "," + newRadius[2] + ",0,0," + clockWise + ",\n " + (x + width - newRadius[2]) + "," + (y + height)), - path += "L " + (x + newRadius[3]) + "," + (y + height), newRadius[3] > 0 && (path += "A " + newRadius[3] + "," + newRadius[3] + ",0,0," + clockWise + ",\n " + x + "," + (y + height - sign * newRadius[3])), - path += "Z"; - } else if (maxRadius > 0 && radius === +radius && radius > 0) { - var _newRadius = Math.min(maxRadius, radius); - path = "M " + x + "," + (y + sign * _newRadius) + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + (x + _newRadius) + "," + y + "\n L " + (x + width - _newRadius) + "," + y + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + (x + width) + "," + (y + sign * _newRadius) + "\n L " + (x + width) + "," + (y + height - sign * _newRadius) + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + (x + width - _newRadius) + "," + (y + height) + "\n L " + (x + _newRadius) + "," + (y + height) + "\n A " + _newRadius + "," + _newRadius + ",0,0," + clockWise + "," + x + "," + (y + height - sign * _newRadius) + " Z"; - } else path = "M " + x + "," + y + " h " + width + " v " + height + " h " + -width + " Z"; - return path; - }, Rectangle = Object(__WEBPACK_IMPORTED_MODULE_4__util_PureRender__.a)((_temp2 = _class2 = function(_Component) { - function Rectangle() { - var _ref, _temp, _this, _ret; - _classCallCheck(this, Rectangle); - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) args[_key] = arguments[_key]; - return _temp = _this = _possibleConstructorReturn(this, (_ref = Rectangle.__proto__ || Object.getPrototypeOf(Rectangle)).call.apply(_ref, [ this ].concat(args))), - _this.state = { - totalLength: -1 - }, _ret = _temp, _possibleConstructorReturn(_this, _ret); - } - return _inherits(Rectangle, _Component), _createClass(Rectangle, [ { - key: "componentDidMount", - value: function() { - if (this.node && this.node.getTotalLength) try { - var totalLength = this.node.getTotalLength(); - totalLength && this.setState({ - totalLength: totalLength - }); - } catch (err) {} - } - }, { - key: "render", - value: function() { - var _this2 = this, _props = this.props, x = _props.x, y = _props.y, width = _props.width, height = _props.height, radius = _props.radius, className = _props.className, totalLength = this.state.totalLength, _props2 = this.props, animationEasing = _props2.animationEasing, animationDuration = _props2.animationDuration, animationBegin = _props2.animationBegin, isAnimationActive = _props2.isAnimationActive, isUpdateAnimationActive = _props2.isUpdateAnimationActive; - if (x !== +x || y !== +y || width !== +width || height !== +height || 0 === width || 0 === height) return null; - var layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-rectangle", className); - return isUpdateAnimationActive ? __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_3_react_smooth___default.a, { - canBegin: totalLength > 0, - from: { - width: width, - height: height, - x: x, - y: y - }, - to: { - width: width, - height: height, - x: x, - y: y - }, - duration: animationDuration, - animationEasing: animationEasing, - isActive: isUpdateAnimationActive - }, function(_ref2) { - var currWidth = _ref2.width, currHeight = _ref2.height, currX = _ref2.x, currY = _ref2.y; - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_3_react_smooth___default.a, { - canBegin: totalLength > 0, - from: "0px " + (-1 === totalLength ? 1 : totalLength) + "px", - to: totalLength + "px 0px", - attributeName: "strokeDasharray", - begin: animationBegin, - duration: animationDuration, - isActive: isAnimationActive, - easing: animationEasing - }, __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("path", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(_this2.props), Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.e)(_this2.props), { - className: layerClass, - d: getRectangePath(currX, currY, currWidth, currHeight, radius), - ref: function(node) { - _this2.node = node; - } - }))); - }) : __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("path", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.e)(this.props), { - className: layerClass, - d: getRectangePath(x, y, width, height, radius) - })); - } - } ]), Rectangle; - }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "Rectangle", - _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.c, __WEBPACK_IMPORTED_MODULE_5__util_ReactUtils__.a, { - className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, - x: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - y: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - radius: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array ]), - isAnimationActive: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - isUpdateAnimationActive: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - animationBegin: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - animationDuration: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - animationEasing: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "ease", "ease-in", "ease-out", "ease-in-out", "linear" ]) - }), _class2.defaultProps = { - x: 0, - y: 0, - width: 0, - height: 0, - radius: 0, - isAnimationActive: !1, - isUpdateAnimationActive: !1, - animationBegin: 0, - animationDuration: 1500, - animationEasing: "ease" - }, _class = _temp2)) || _class; - __webpack_exports__.a = Rectangle; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 - } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_lodash_isArray__ = __webpack_require__(13), __WEBPACK_IMPORTED_MODULE_0_lodash_isArray___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_lodash_isArray__), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__ = __webpack_require__(8), __WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction__), __WEBPACK_IMPORTED_MODULE_2_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_2_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_react__), __WEBPACK_IMPORTED_MODULE_3_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_3_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_prop_types__), __WEBPACK_IMPORTED_MODULE_4_d3_shape__ = __webpack_require__(182), __WEBPACK_IMPORTED_MODULE_5_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_5_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_classnames__), __WEBPACK_IMPORTED_MODULE_6__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__ = __webpack_require__(4), __WEBPACK_IMPORTED_MODULE_8__util_DataUtils__ = __webpack_require__(9), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), CURVE_FACTORIES = { - curveBasisClosed: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.c, - curveBasisOpen: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.d, - curveBasis: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.b, - curveLinearClosed: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.f, - curveLinear: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.e, - curveMonotoneX: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.g, - curveMonotoneY: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.h, - curveNatural: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.i, - curveStep: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.j, - curveStepAfter: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.k, - curveStepBefore: __WEBPACK_IMPORTED_MODULE_4_d3_shape__.l - }, defined = function(p) { - return p.x === +p.x && p.y === +p.y; - }, getX = function(p) { - return p.x; - }, getY = function(p) { - return p.y; - }, getCurveFactory = function(type, layout) { - if (__WEBPACK_IMPORTED_MODULE_1_lodash_isFunction___default()(type)) return type; - var name = "curve" + type.slice(0, 1).toUpperCase() + type.slice(1); - return "curveMonotone" === name && layout ? CURVE_FACTORIES[name + ("vertical" === layout ? "Y" : "X")] : CURVE_FACTORIES[name] || __WEBPACK_IMPORTED_MODULE_4_d3_shape__.e; - }, Curve = Object(__WEBPACK_IMPORTED_MODULE_6__util_PureRender__.a)((_temp = _class2 = function(_Component) { - function Curve() { - return _classCallCheck(this, Curve), _possibleConstructorReturn(this, (Curve.__proto__ || Object.getPrototypeOf(Curve)).apply(this, arguments)); - } - return _inherits(Curve, _Component), _createClass(Curve, [ { - key: "getPath", - value: function() { - var _props = this.props, type = _props.type, points = _props.points, baseLine = _props.baseLine, layout = _props.layout, connectNulls = _props.connectNulls, curveFactory = getCurveFactory(type, layout), formatPoints = connectNulls ? points.filter(function(entry) { - return defined(entry); - }) : points, lineFunction = void 0; - if (__WEBPACK_IMPORTED_MODULE_0_lodash_isArray___default()(baseLine)) { - var areaPoints = formatPoints.map(function(entry, index) { - return _extends({}, entry, { - base: baseLine[index] - }); - }); - return lineFunction = "vertical" === layout ? Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().y(getY).x1(getX).x0(function(d) { - return d.base.x; - }) : Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().x(getX).y1(getY).y0(function(d) { - return d.base.y; - }), lineFunction.defined(defined).curve(curveFactory), lineFunction(areaPoints); - } - return lineFunction = "vertical" === layout && Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(baseLine) ? Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().y(getY).x1(getX).x0(baseLine) : Object(__WEBPACK_IMPORTED_MODULE_8__util_DataUtils__.h)(baseLine) ? Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.a)().x(getX).y1(getY).y0(baseLine) : Object(__WEBPACK_IMPORTED_MODULE_4_d3_shape__.m)().x(getX).y(getY), - lineFunction.defined(defined).curve(curveFactory), lineFunction(formatPoints); - } - }, { - key: "render", - value: function() { - var _props2 = this.props, className = _props2.className, points = _props2.points, path = _props2.path, pathRef = _props2.pathRef; - if (!(points && points.length || path)) return null; - var realPath = points && points.length ? this.getPath() : path; - return __WEBPACK_IMPORTED_MODULE_2_react___default.a.createElement("path", _extends({}, Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.k)(this.props), Object(__WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.e)(this.props, null, !0), { - className: __WEBPACK_IMPORTED_MODULE_5_classnames___default()("recharts-curve", className), - d: realPath, - ref: pathRef - })); - } - } ]), Curve; - }(__WEBPACK_IMPORTED_MODULE_2_react__.Component), _class2.displayName = "Curve", - _class2.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_7__util_ReactUtils__.c, { - className: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, - type: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ "basis", "basisClosed", "basisOpen", "linear", "linearClosed", "natural", "monotoneX", "monotoneY", "monotone", "step", "stepBefore", "stepAfter" ]), __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func ]), - layout: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOf([ "horizontal", "vertical" ]), - baseLine: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.array ]), - points: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.object), - connectNulls: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.bool, - path: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.string, - pathRef: __WEBPACK_IMPORTED_MODULE_3_prop_types___default.a.func - }), _class2.defaultProps = { - type: "linear", - points: [], - connectNulls: !1 - }, _class = _temp)) || _class; - __webpack_exports__.a = Curve; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 - } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), - __webpack_require__(1)), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__util_PureRender__ = __webpack_require__(5), __WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__ = __webpack_require__(4), _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), XAxis = Object(__WEBPACK_IMPORTED_MODULE_2__util_PureRender__.a)((_temp = _class2 = function(_Component) { - function XAxis() { - return _classCallCheck(this, XAxis), _possibleConstructorReturn(this, (XAxis.__proto__ || Object.getPrototypeOf(XAxis)).apply(this, arguments)); - } - return _inherits(XAxis, _Component), _createClass(XAxis, [ { - key: "render", - value: function() { - return null; - } - } ]), XAxis; - }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "XAxis", - _class2.propTypes = { - allowDecimals: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - allowDuplicatedCategory: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - hide: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - name: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), - unit: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), - xAxisId: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), - domain: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "auto", "dataMin", "dataMax" ]) ])), - dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]), - width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - mirror: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - orientation: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "top", "bottom" ]), - type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "number", "category" ]), - ticks: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array, - tickCount: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - tickFormatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, - padding: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({ - left: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - right: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number - }), - allowDataOverflow: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - scale: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf(__WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__.d), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]), - tick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.element ]), - axisLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]), - tickLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]), - minTickGap: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - tickSize: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - interval: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "preserveStart", "preserveEnd", "preserveStartEnd" ]) ]), - reversed: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool - }, _class2.defaultProps = { - allowDecimals: !0, - hide: !1, - orientation: "bottom", - width: 0, - height: 30, - mirror: !1, - xAxisId: 0, - tickCount: 5, - type: "category", - domain: [ 0, "auto" ], - padding: { - left: 0, - right: 0 - }, - allowDataOverflow: !1, - scale: "auto", - reversed: !1, - allowDuplicatedCategory: !0 - }, _class = _temp)) || _class; - __webpack_exports__.a = XAxis; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 - } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var _class, _class2, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), - __webpack_require__(1)), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__util_PureRender__ = __webpack_require__(5), _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), YAxis = Object(__WEBPACK_IMPORTED_MODULE_2__util_PureRender__.a)((_temp = _class2 = function(_Component) { - function YAxis() { - return _classCallCheck(this, YAxis), _possibleConstructorReturn(this, (YAxis.__proto__ || Object.getPrototypeOf(YAxis)).apply(this, arguments)); - } - return _inherits(YAxis, _Component), _createClass(YAxis, [ { - key: "render", - value: function() { - return null; - } - } ]), YAxis; - }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class2.displayName = "YAxis", - _class2.propTypes = { - allowDecimals: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - allowDuplicatedCategory: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - hide: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - name: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), - unit: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), - yAxisId: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number ]), - domain: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "auto", "dataMin", "dataMax" ]) ])), - dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]), - ticks: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array, - tickCount: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - tickFormatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, - width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - mirror: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - orientation: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "left", "right" ]), - type: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "number", "category" ]), - padding: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({ - top: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - bottom: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number - }), - allowDataOverflow: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, - scale: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "auto", "linear", "pow", "sqrt", "log", "identity", "time", "band", "point", "ordinal", "quantile", "quantize", "utcTime", "sequential", "threshold" ]), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]), - tick: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.element ]), - axisLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]), - tickLine: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object ]), - minTickGap: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - tickSize: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - interval: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOf([ "preserveStart", "preserveEnd", "preserveStartEnd" ]) ]), - reversed: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.bool - }, _class2.defaultProps = { - allowDuplicatedCategory: !0, - allowDecimals: !0, - hide: !1, - orientation: "left", - width: 60, - height: 0, - mirror: !1, - yAxisId: 0, - tickCount: 5, - type: "number", - domain: [ 0, "auto" ], - padding: { - top: 0, - bottom: 0 - }, - allowDataOverflow: !1, - scale: "auto", - reversed: !1 - }, _class = _temp)) || _class; - __webpack_exports__.a = YAxis; -}, function(module, exports, __webpack_require__) { - "use strict"; - function toObject(val) { - if (null === val || void 0 === val) throw new TypeError("Object.assign cannot be called with null or undefined"); - return Object(val); - } - var getOwnPropertySymbols = Object.getOwnPropertySymbols, hasOwnProperty = Object.prototype.hasOwnProperty, propIsEnumerable = Object.prototype.propertyIsEnumerable; - module.exports = function() { - try { - if (!Object.assign) return !1; - var test1 = new String("abc"); - if (test1[5] = "de", "5" === Object.getOwnPropertyNames(test1)[0]) return !1; - for (var test2 = {}, i = 0; i < 10; i++) test2["_" + String.fromCharCode(i)] = i; - if ("0123456789" !== Object.getOwnPropertyNames(test2).map(function(n) { - return test2[n]; - }).join("")) return !1; - var test3 = {}; - return "abcdefghijklmnopqrst".split("").forEach(function(letter) { - test3[letter] = letter; - }), "abcdefghijklmnopqrst" === Object.keys(Object.assign({}, test3)).join(""); - } catch (err) { - return !1; - } - }() ? Object.assign : function(target, source) { - for (var from, symbols, to = toObject(target), s = 1; s < arguments.length; s++) { - from = Object(arguments[s]); - for (var key in from) hasOwnProperty.call(from, key) && (to[key] = from[key]); - if (getOwnPropertySymbols) { - symbols = getOwnPropertySymbols(from); - for (var i = 0; i < symbols.length; i++) propIsEnumerable.call(from, symbols[i]) && (to[symbols[i]] = from[symbols[i]]); - } - } - return to; - }; -}, function(module, exports) { - module.exports = function(bitmap, value) { - return { - enumerable: !(1 & bitmap), - configurable: !(2 & bitmap), - writable: !(4 & bitmap), - value: value - }; - }; -}, function(module, exports, __webpack_require__) { - var $keys = __webpack_require__(226), enumBugKeys = __webpack_require__(152); - module.exports = Object.keys || function(O) { - return $keys(O, enumBugKeys); - }; -}, function(module, exports) { - module.exports = {}; -}, function(module, exports, __webpack_require__) { - "use strict"; - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - function createBreakpoints(breakpoints) { - function up(key) { - return "@media (min-width:" + ("number" == typeof values[key] ? values[key] : key) + unit + ")"; - } - function down(key) { - var endIndex = keys.indexOf(key) + 1, upperbound = values[keys[endIndex]]; - return endIndex === keys.length ? up("xs") : "@media (max-width:" + (("number" == typeof upperbound && endIndex > 0 ? upperbound : key) - step / 100) + unit + ")"; - } - function between(start, end) { - var endIndex = keys.indexOf(end) + 1; - return endIndex === keys.length ? up(start) : "@media (min-width:" + values[start] + unit + ") and (max-width:" + (values[keys[endIndex]] - step / 100) + unit + ")"; - } - function only(key) { - return between(key, key); - } - function width(key) { - return values[key]; - } - var _breakpoints$values = breakpoints.values, values = void 0 === _breakpoints$values ? { - xs: 0, - sm: 600, - md: 960, - lg: 1280, - xl: 1920 - } : _breakpoints$values, _breakpoints$unit = breakpoints.unit, unit = void 0 === _breakpoints$unit ? "px" : _breakpoints$unit, _breakpoints$step = breakpoints.step, step = void 0 === _breakpoints$step ? 5 : _breakpoints$step, other = (0, - _objectWithoutProperties3.default)(breakpoints, [ "values", "unit", "step" ]); - return (0, _extends3.default)({ - keys: keys, - values: values, - up: up, - down: down, - between: between, - only: only, - width: width - }, other); - } - Object.defineProperty(exports, "__esModule", { - value: !0 - }), exports.keys = void 0; - var _extends2 = __webpack_require__(6), _extends3 = _interopRequireDefault(_extends2), _objectWithoutProperties2 = __webpack_require__(7), _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); - exports.default = createBreakpoints; - var keys = exports.keys = [ "xs", "sm", "md", "lg", "xl" ]; -}, function(module, exports, __webpack_require__) { - "use strict"; - exports.__esModule = !0; - var _getDisplayName = __webpack_require__(244), _getDisplayName2 = function(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - }(_getDisplayName), wrapDisplayName = function(BaseComponent, hocName) { - return hocName + "(" + (0, _getDisplayName2.default)(BaseComponent) + ")"; - }; - exports.default = wrapDisplayName; -}, function(module, exports, __webpack_require__) { - "use strict"; - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - Object.defineProperty(exports, "__esModule", { - value: !0 - }); - var _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), _createRule = __webpack_require__(111), _createRule2 = _interopRequireDefault(_createRule), _linkRule = __webpack_require__(249), _linkRule2 = _interopRequireDefault(_linkRule), _StyleRule = __webpack_require__(66), _StyleRule2 = _interopRequireDefault(_StyleRule), _escape = __webpack_require__(467), _escape2 = _interopRequireDefault(_escape), RuleList = function() { - function RuleList(options) { - _classCallCheck(this, RuleList), this.map = {}, this.raw = {}, this.index = [], - this.options = options, this.classes = options.classes; - } - return _createClass(RuleList, [ { - key: "add", - value: function(name, decl, options) { - var _options = this.options, parent = _options.parent, sheet = _options.sheet, jss = _options.jss, Renderer = _options.Renderer, generateClassName = _options.generateClassName; - options = _extends({ - classes: this.classes, - parent: parent, - sheet: sheet, - jss: jss, - Renderer: Renderer, - generateClassName: generateClassName - }, options), !options.selector && this.classes[name] && (options.selector = "." + (0, - _escape2.default)(this.classes[name])), this.raw[name] = decl; - var rule = (0, _createRule2.default)(name, decl, options), className = void 0; - !options.selector && rule instanceof _StyleRule2.default && (className = generateClassName(rule, sheet), - rule.selector = "." + (0, _escape2.default)(className)), this.register(rule, className); - var index = void 0 === options.index ? this.index.length : options.index; - return this.index.splice(index, 0, rule), rule; - } - }, { - key: "get", - value: function(name) { - return this.map[name]; - } - }, { - key: "remove", - value: function(rule) { - this.unregister(rule), this.index.splice(this.indexOf(rule), 1); - } - }, { - key: "indexOf", - value: function(rule) { - return this.index.indexOf(rule); - } - }, { - key: "process", - value: function() { - var plugins = this.options.jss.plugins; - this.index.slice(0).forEach(plugins.onProcessRule, plugins); - } - }, { - key: "register", - value: function(rule, className) { - this.map[rule.key] = rule, rule instanceof _StyleRule2.default && (this.map[rule.selector] = rule, - className && (this.classes[rule.key] = className)); - } - }, { - key: "unregister", - value: function(rule) { - delete this.map[rule.key], rule instanceof _StyleRule2.default && (delete this.map[rule.selector], - delete this.classes[rule.key]); - } - }, { - key: "update", - value: function(name, data) { - var _options2 = this.options, plugins = _options2.jss.plugins, sheet = _options2.sheet; - if ("string" == typeof name) return void plugins.onUpdate(data, this.get(name), sheet); - for (var index = 0; index < this.index.length; index++) plugins.onUpdate(name, this.index[index], sheet); - } - }, { - key: "link", - value: function(cssRules) { - for (var map = this.options.sheet.renderer.getUnescapedKeysMap(this.index), i = 0; i < cssRules.length; i++) { - var cssRule = cssRules[i], _key = this.options.sheet.renderer.getKey(cssRule); - map[_key] && (_key = map[_key]); - var rule = this.map[_key]; - rule && (0, _linkRule2.default)(rule, cssRule); - } - } - }, { - key: "toString", - value: function(options) { - for (var str = "", sheet = this.options.sheet, link = !!sheet && sheet.options.link, index = 0; index < this.index.length; index++) { - var rule = this.index[index], css = rule.toString(options); - (css || link) && (str && (str += "\n"), str += css); - } - return str; - } - } ]), RuleList; - }(); - exports.default = RuleList; -}, function(module, exports, __webpack_require__) { - "use strict"; - Object.defineProperty(exports, "__esModule", { - value: !0 - }); - var _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, menuSkeletons = [ { - id: "home", - menu: { - title: "Home", - icon: "home" - } - }, { - id: "chain", - menu: { - title: "Chain", - icon: "link" - } - }, { - id: "txpool", - menu: { - title: "TxPool", - icon: "credit-card" - } - }, { - id: "network", - menu: { - title: "Network", - icon: "globe" - } - }, { - id: "system", - menu: { - title: "System", - icon: "tachometer" - } - }, { - id: "logs", - menu: { - title: "Logs", - icon: "list" - } - } ]; - exports.MENU = new Map(menuSkeletons.map(function(_ref) { - var id = _ref.id, menu = _ref.menu; - return [ id, _extends({ - id: id - }, menu) ]; - })), exports.DURATION = 200, exports.styles = { - light: { - color: "rgba(255, 255, 255, 0.54)" - } - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _objectWithoutProperties(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - } - function Surface(props) { - var children = props.children, width = props.width, height = props.height, viewBox = props.viewBox, className = props.className, style = props.style, others = _objectWithoutProperties(props, [ "children", "width", "height", "viewBox", "className", "style" ]), svgView = viewBox || { - width: width, - height: height, - x: 0, - y: 0 - }, layerClass = __WEBPACK_IMPORTED_MODULE_2_classnames___default()("recharts-surface", className), attrs = Object(__WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__.k)(others); - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("svg", _extends({}, attrs, { - className: layerClass, - width: width, - height: height, - style: style, - viewBox: svgView.x + " " + svgView.y + " " + svgView.width + " " + svgView.height, - version: "1.1" - }), children); - } - var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2_classnames__ = __webpack_require__(3), __WEBPACK_IMPORTED_MODULE_2_classnames___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_classnames__), __WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, propTypes = { - width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number.isRequired, - height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number.isRequired, - viewBox: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.shape({ - x: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - y: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - height: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number - }), - className: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, - style: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, - children: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.arrayOf(__WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node), __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.node ]) - }; - Surface.propTypes = propTypes, __webpack_exports__.a = Surface; -}, function(module, exports, __webpack_require__) { - var root = __webpack_require__(31), Symbol = root.Symbol; - module.exports = Symbol; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - var __WEBPACK_IMPORTED_MODULE_0__src_path__ = __webpack_require__(633); - __webpack_require__.d(__webpack_exports__, "a", function() { - return __WEBPACK_IMPORTED_MODULE_0__src_path__.a; - }); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function acos(x) { - return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); - } - function asin(x) { - return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x); - } - __webpack_require__.d(__webpack_exports__, "a", function() { - return abs; - }), __webpack_require__.d(__webpack_exports__, "d", function() { - return atan2; - }), __webpack_require__.d(__webpack_exports__, "e", function() { - return cos; - }), __webpack_require__.d(__webpack_exports__, "h", function() { - return max; - }), __webpack_require__.d(__webpack_exports__, "i", function() { - return min; - }), __webpack_require__.d(__webpack_exports__, "k", function() { - return sin; - }), __webpack_require__.d(__webpack_exports__, "l", function() { - return sqrt; - }), __webpack_require__.d(__webpack_exports__, "f", function() { - return epsilon; - }), __webpack_require__.d(__webpack_exports__, "j", function() { - return pi; - }), __webpack_require__.d(__webpack_exports__, "g", function() { - return halfPi; - }), __webpack_require__.d(__webpack_exports__, "m", function() { - return tau; - }), __webpack_exports__.b = acos, __webpack_exports__.c = asin; - var abs = Math.abs, atan2 = Math.atan2, cos = Math.cos, max = Math.max, min = Math.min, sin = Math.sin, sqrt = Math.sqrt, epsilon = 1e-12, pi = Math.PI, halfPi = pi / 2, tau = 2 * pi; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_exports__.a = function(series, order) { - if ((n = series.length) > 1) for (var j, s0, n, i = 1, s1 = series[order[0]], m = s1.length; i < n; ++i) for (s0 = s1, - s1 = series[order[i]], j = 0; j < m; ++j) s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_exports__.a = function(series) { - for (var n = series.length, o = new Array(n); --n >= 0; ) o[n] = n; - return o; - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function Cell() { - return null; - } - var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_1__util_ReactUtils__ = (__webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), - __webpack_require__(4)), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }; - Cell.propTypes = _extends({}, __WEBPACK_IMPORTED_MODULE_1__util_ReactUtils__.c), - Cell.displayName = "Cell", __webpack_exports__.a = Cell; -}, function(module, exports, __webpack_require__) { - function baseIteratee(value) { - return "function" == typeof value ? value : null == value ? identity : "object" == typeof value ? isArray(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value) : property(value); - } - var baseMatches = __webpack_require__(815), baseMatchesProperty = __webpack_require__(818), identity = __webpack_require__(68), isArray = __webpack_require__(13), property = __webpack_require__(822); - module.exports = baseIteratee; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_exports__.a = function(x) { - return null === x ? NaN : +x; - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function linearish(scale) { - var domain = scale.domain; - return scale.ticks = function(count) { - var d = domain(); - return Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.h)(d[0], d[d.length - 1], null == count ? 10 : count); - }, scale.tickFormat = function(count, specifier) { - return Object(__WEBPACK_IMPORTED_MODULE_3__tickFormat__.a)(domain(), count, specifier); - }, scale.nice = function(count) { - null == count && (count = 10); - var step, d = domain(), i0 = 0, i1 = d.length - 1, start = d[i0], stop = d[i1]; - return stop < start && (step = start, start = stop, stop = step, step = i0, i0 = i1, - i1 = step), step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.f)(start, stop, count), - step > 0 ? (start = Math.floor(start / step) * step, stop = Math.ceil(stop / step) * step, - step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.f)(start, stop, count)) : step < 0 && (start = Math.ceil(start * step) / step, - stop = Math.floor(stop * step) / step, step = Object(__WEBPACK_IMPORTED_MODULE_0_d3_array__.f)(start, stop, count)), - step > 0 ? (d[i0] = Math.floor(start / step) * step, d[i1] = Math.ceil(stop / step) * step, - domain(d)) : step < 0 && (d[i0] = Math.ceil(start * step) / step, d[i1] = Math.floor(stop * step) / step, - domain(d)), scale; - }, scale; - } - function linear() { - var scale = Object(__WEBPACK_IMPORTED_MODULE_2__continuous__.b)(__WEBPACK_IMPORTED_MODULE_2__continuous__.c, __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__.c); - return scale.copy = function() { - return Object(__WEBPACK_IMPORTED_MODULE_2__continuous__.a)(scale, linear()); - }, linearish(scale); - } - __webpack_exports__.b = linearish, __webpack_exports__.a = linear; - var __WEBPACK_IMPORTED_MODULE_0_d3_array__ = __webpack_require__(37), __WEBPACK_IMPORTED_MODULE_1_d3_interpolate__ = __webpack_require__(92), __WEBPACK_IMPORTED_MODULE_2__continuous__ = __webpack_require__(137), __WEBPACK_IMPORTED_MODULE_3__tickFormat__ = __webpack_require__(883); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - var __WEBPACK_IMPORTED_MODULE_0__src_value__ = __webpack_require__(206); - __webpack_require__.d(__webpack_exports__, "a", function() { - return __WEBPACK_IMPORTED_MODULE_0__src_value__.a; - }); - var __WEBPACK_IMPORTED_MODULE_5__src_number__ = (__webpack_require__(349), __webpack_require__(209), - __webpack_require__(347), __webpack_require__(350), __webpack_require__(136)); - __webpack_require__.d(__webpack_exports__, "c", function() { - return __WEBPACK_IMPORTED_MODULE_5__src_number__.a; - }); - var __WEBPACK_IMPORTED_MODULE_7__src_round__ = (__webpack_require__(351), __webpack_require__(873)); - __webpack_require__.d(__webpack_exports__, "d", function() { - return __WEBPACK_IMPORTED_MODULE_7__src_round__.a; - }); - var __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__ = (__webpack_require__(352), __webpack_require__(874), - __webpack_require__(877), __webpack_require__(346), __webpack_require__(878), __webpack_require__(879), - __webpack_require__(880), __webpack_require__(881)); - __webpack_require__.d(__webpack_exports__, "b", function() { - return __WEBPACK_IMPORTED_MODULE_15__src_cubehelix__.a; - }); - __webpack_require__(882); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function linear(a, d) { - return function(t) { - return a + t * d; - }; - } - function exponential(a, b, y) { - return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { - return Math.pow(a + t * b, y); - }; - } - function hue(a, b) { - var d = b - a; - return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(isNaN(a) ? b : a); - } - function gamma(y) { - return 1 == (y = +y) ? nogamma : function(a, b) { - return b - a ? exponential(a, b, y) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(isNaN(a) ? b : a); - }; - } - function nogamma(a, b) { - var d = b - a; - return d ? linear(a, d) : Object(__WEBPACK_IMPORTED_MODULE_0__constant__.a)(isNaN(a) ? b : a); - } - __webpack_exports__.c = hue, __webpack_exports__.b = gamma, __webpack_exports__.a = nogamma; - var __WEBPACK_IMPORTED_MODULE_0__constant__ = __webpack_require__(348); -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - __webpack_exports__.a = function(s) { - return s.match(/.{6}/g).map(function(x) { - return "#" + x; - }); - }; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _objectWithoutProperties(obj, keys) { - var target = {}; - for (var i in obj) keys.indexOf(i) >= 0 || Object.prototype.hasOwnProperty.call(obj, i) && (target[i] = obj[i]); - return target; - } - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function"); - } - function _possibleConstructorReturn(self, call) { - if (!self) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - return !call || "object" != typeof call && "function" != typeof call ? self : call; - } - function _inherits(subClass, superClass) { - if ("function" != typeof superClass && null !== superClass) throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - enumerable: !1, - writable: !0, - configurable: !0 - } - }), superClass && (Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass); - } - var _class, _temp, __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(0), __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__), __WEBPACK_IMPORTED_MODULE_1_prop_types__ = __webpack_require__(1), __WEBPACK_IMPORTED_MODULE_1_prop_types___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_prop_types__), __WEBPACK_IMPORTED_MODULE_2__container_Layer__ = __webpack_require__(14), __WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__ = __webpack_require__(4), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, _createClass = function() { - function defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || !1, descriptor.configurable = !0, - "value" in descriptor && (descriptor.writable = !0), Object.defineProperty(target, descriptor.key, descriptor); - } - } - return function(Constructor, protoProps, staticProps) { - return protoProps && defineProperties(Constructor.prototype, protoProps), staticProps && defineProperties(Constructor, staticProps), - Constructor; - }; - }(), ErrorBar = (_temp = _class = function(_Component) { - function ErrorBar() { - return _classCallCheck(this, ErrorBar), _possibleConstructorReturn(this, (ErrorBar.__proto__ || Object.getPrototypeOf(ErrorBar)).apply(this, arguments)); - } - return _inherits(ErrorBar, _Component), _createClass(ErrorBar, [ { - key: "renderErrorBars", - value: function() { - var _props = this.props, offset = _props.offset, layout = _props.layout, width = _props.width, dataKey = _props.dataKey, data = _props.data, dataPointFormatter = _props.dataPointFormatter, xAxis = _props.xAxis, yAxis = _props.yAxis, others = _objectWithoutProperties(_props, [ "offset", "layout", "width", "dataKey", "data", "dataPointFormatter", "xAxis", "yAxis" ]), props = Object(__WEBPACK_IMPORTED_MODULE_3__util_ReactUtils__.k)(others); - return data.map(function(entry, i) { - var _dataPointFormatter = dataPointFormatter(entry, dataKey), x = _dataPointFormatter.x, y = _dataPointFormatter.y, value = _dataPointFormatter.value, errorVal = _dataPointFormatter.errorVal; - if (!errorVal) return null; - var xMid = void 0, yMid = void 0, xMin = void 0, yMin = void 0, xMax = void 0, yMax = void 0, scale = void 0, coordsTop = void 0, coordsMid = void 0, coordsBot = void 0, lowBound = void 0, highBound = void 0; - return Array.isArray(errorVal) ? (lowBound = errorVal[0], highBound = errorVal[1]) : (lowBound = errorVal, - highBound = errorVal), "vertical" === layout ? (scale = xAxis.scale, xMid = value, - yMid = y + offset, xMin = scale(xMid - lowBound), yMin = yMid + width, xMax = scale(xMid + highBound), - yMax = yMid - width, coordsTop = { - x1: xMax, - y1: yMin, - x2: xMax, - y2: yMax - }, coordsMid = { - x1: xMin, - y1: yMid, - x2: xMax, - y2: yMid - }, coordsBot = { - x1: xMin, - y1: yMin, - x2: xMin, - y2: yMax - }) : "horizontal" === layout && (scale = yAxis.scale, xMid = x + offset, yMid = value, - xMin = xMid - width, xMax = xMid + width, yMin = scale(yMid - lowBound), yMax = scale(yMid + highBound), - coordsTop = { - x1: xMin, - y1: yMax, - x2: xMax, - y2: yMax - }, coordsMid = { - x1: xMid, - y1: yMin, - x2: xMid, - y2: yMax - }, coordsBot = { - x1: xMin, - y1: yMin, - x2: xMax, - y2: yMin - }), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_2__container_Layer__.a, _extends({ - className: "recharts-errorBar", - key: i - }, props), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("line", coordsTop), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("line", coordsMid), __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("line", coordsBot)); - }); - } - }, { - key: "render", - value: function() { - return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_2__container_Layer__.a, { - className: "recharts-errorBars" - }, this.renderErrorBars()); - } - } ]), ErrorBar; - }(__WEBPACK_IMPORTED_MODULE_0_react__.Component), _class.propTypes = { - dataKey: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.oneOfType([ __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func ]).isRequired, - data: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.array, - xAxis: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, - yAxis: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.object, - layout: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, - dataPointFormatter: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.func, - stroke: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.string, - strokeWidth: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - width: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number, - offset: __WEBPACK_IMPORTED_MODULE_1_prop_types___default.a.number - }, _class.defaultProps = { - stroke: "black", - strokeWidth: 1.5, - width: 5, - offset: 0, - layout: "horizontal" - }, _temp); - __webpack_exports__.a = ErrorBar; -}, function(module, __webpack_exports__, __webpack_require__) { - "use strict"; - function _defineProperty(obj, key, value) { - return key in obj ? Object.defineProperty(obj, key, { - value: value, - enumerable: !0, - configurable: !0, - writable: !0 - }) : obj[key] = value, obj; - } - __webpack_require__.d(__webpack_exports__, "a", function() { - return formatAxisMap; - }); - var __WEBPACK_IMPORTED_MODULE_0__ChartUtils__ = __webpack_require__(16), _extends = Object.assign || function(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - for (var key in source) Object.prototype.hasOwnProperty.call(source, key) && (target[key] = source[key]); - } - return target; - }, formatAxisMap = function(props, axisMap, offset, axisType, chartName) { - var width = props.width, height = props.height, layout = props.layout, ids = Object.keys(axisMap), steps = { - left: offset.left, - leftMirror: offset.left, - right: width - offset.right, - rightMirror: width - offset.right, - top: offset.top, - topMirror: offset.top, - bottom: height - offset.bottom, - bottomMirror: height - offset.bottom - }; - return ids.reduce(function(result, id) { - var axis = axisMap[id], orientation = axis.orientation, domain = axis.domain, _axis$padding = axis.padding, padding = void 0 === _axis$padding ? {} : _axis$padding, mirror = axis.mirror, reversed = axis.reversed, offsetKey = orientation + (mirror ? "Mirror" : ""), range = void 0, x = void 0, y = void 0, needSpace = void 0; - range = "xAxis" === axisType ? [ offset.left + (padding.left || 0), offset.left + offset.width - (padding.right || 0) ] : "yAxis" === axisType ? "horizontal" === layout ? [ offset.top + offset.height - (padding.bottom || 0), offset.top + (padding.top || 0) ] : [ offset.top + (padding.top || 0), offset.top + offset.height - (padding.bottom || 0) ] : axis.range, - reversed && (range = [ range[1], range[0] ]); - var _parseScale = Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.A)(axis, chartName), scale = _parseScale.scale, realScaleType = _parseScale.realScaleType; - scale.domain(domain).range(range), Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.c)(scale); - var ticks = Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.v)(scale, _extends({}, axis, { - realScaleType: realScaleType - })); - "xAxis" === axisType ? (needSpace = "top" === orientation && !mirror || "bottom" === orientation && mirror, - x = offset.left, y = steps[offsetKey] - needSpace * axis.height) : "yAxis" === axisType && (needSpace = "left" === orientation && !mirror || "right" === orientation && mirror, - x = steps[offsetKey] - needSpace * axis.width, y = offset.top); - var finalAxis = _extends({}, axis, ticks, { - realScaleType: realScaleType, - x: x, - y: y, - scale: scale, - width: "xAxis" === axisType ? offset.width : axis.width, - height: "yAxis" === axisType ? offset.height : axis.height - }); - return finalAxis.bandSize = Object(__WEBPACK_IMPORTED_MODULE_0__ChartUtils__.g)(finalAxis, ticks), - axis.hide || "xAxis" !== axisType ? axis.hide || (steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.width) : steps[offsetKey] += (needSpace ? -1 : 1) * finalAxis.height, - _extends({}, result, _defineProperty({}, id, finalAxis)); - }, {}); - }; -}, function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - var emptyObject = {}; - "production" !== process.env.NODE_ENV && Object.freeze(emptyObject), module.exports = emptyObject; - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - var emptyFunction = __webpack_require__(50), warning = emptyFunction; - if ("production" !== process.env.NODE_ENV) { - var printWarning = function(format) { - for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) args[_key - 1] = arguments[_key]; - var argIndex = 0, message = "Warning: " + format.replace(/%s/g, function() { - return args[argIndex++]; - }); - "undefined" != typeof console && console.error(message); - try { - throw new Error(message); - } catch (x) {} - }; - warning = function(condition, format) { - if (void 0 === format) throw new Error("` + ("`" + `warning(condition, format, ...args)`)) + ("`" + (` requires a warning message argument"); - if (0 !== format.indexOf("Failed Composite propType: ") && !condition) { - for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) args[_key2 - 2] = arguments[_key2]; - printWarning.apply(void 0, [ format ].concat(args)); - } - }; - } - module.exports = warning; - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - "use strict"; - (function(process) { - function checkDCE() { - if ("undefined" != typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" == typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE) { - if ("production" !== process.env.NODE_ENV) throw new Error("^_^"); - try { - __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE); - } catch (err) { - console.error(err); - } - } - } - "production" === process.env.NODE_ENV ? (checkDCE(), module.exports = __webpack_require__(378)) : module.exports = __webpack_require__(381); - }).call(exports, __webpack_require__(2)); -}, function(module, exports, __webpack_require__) { - "use strict"; - function is(x, y) { - return x === y ? 0 !== x || 0 !== y || 1 / x == 1 / y : x !== x && y !== y; - } - function shallowEqual(objA, objB) { - if (is(objA, objB)) return !0; - if ("object" != typeof objA || null === objA || "object" != typeof objB || null === objB) return !1; - var keysA = Object.keys(objA), keysB = Object.keys(objB); - if (keysA.length !== keysB.length) return !1; - for (var i = 0; i < keysA.length; i++) if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) return !1; - return !0; - } - var hasOwnProperty = Object.prototype.hasOwnProperty; - module.exports = shallowEqual; -}, function(module, exports, __webpack_require__) { - var toInteger = __webpack_require__(149), min = Math.min; - module.exports = function(it) { - return it > 0 ? min(toInteger(it), 9007199254740991) : 0; - }; -}, function(module, exports) { - module.exports = !0; -}, function(module, exports) { - var id = 0, px = Math.random(); - module.exports = function(key) { - return "Symbol(".concat(void 0 === key ? "" : key, ")_", (++id + px).toString(36)); - }; -}, function(module, exports) { - exports.f = {}.propertyIsEnumerable; -}, function(module, exports, __webpack_require__) { - "use strict"; - function _interopRequireDefault(obj) { - return obj && obj.__esModule ? obj : { - default: obj - }; - } - exports.__esModule = !0; - var _iterator = __webpack_require__(396), _iterator2 = _interopRequireDefault(_iterator), _symbol = __webpack_require__(404), _symbol2 = _interopRequireDefault(_symbol), _typeof = "function" == typeof _symbol2.default && "symbol" == typeof _iterator2.default ? function(obj) { - return typeof obj; - } : function(obj) { - return obj && "function" == typeof _symbol2.default && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; - }; - exports.default = "function" == typeof _symbol2.default && "symbol" === _typeof(_iterator2.default) ? function(obj) { - return void 0 === obj ? "undefined" : _typeof(obj); - } : function(obj) { - return obj && "function" == typeof _symbol2.default && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : void 0 === obj ? "undefined" : _typeof(obj); - }; -}, function(module, exports, __webpack_require__) { - var anObject = __webpack_require__(52), dPs = __webpack_require__(400), enumBugKeys = __webpack_require__(152), IE_PROTO = __webpack_require__(150)("IE_PROTO"), Empty = function() {}, createDict = function() { - var iframeDocument, iframe = __webpack_require__(225)("iframe"), i = enumBugKeys.length; - for (iframe.style.display = "none", __webpack_require__(401).appendChild(iframe), - iframe.src = "javascript:", iframeDocument = iframe.contentWindow.document, iframeDocument.open(), - iframeDocument.write(" - - diff --git a/dashboard/assets/index.jsx b/dashboard/assets/index.jsx deleted file mode 100644 index 4ee567b01bd1..000000000000 --- a/dashboard/assets/index.jsx +++ /dev/null @@ -1,41 +0,0 @@ -// @flow - -// 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 {render} from 'react-dom'; - -import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider'; -import createMuiTheme from 'material-ui/styles/createMuiTheme'; - -import Dashboard from './components/Dashboard'; - -const theme: Object = createMuiTheme({ - palette: { - type: 'dark', - }, -}); -const dashboard = document.getElementById('dashboard'); -if (dashboard) { - // Renders the whole dashboard. - render( - - - , - dashboard, - ); -} diff --git a/dashboard/assets/package.json b/dashboard/assets/package.json deleted file mode 100644 index fb1a68e5b52b..000000000000 --- a/dashboard/assets/package.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "dependencies": { - "babel-core": "^6.26.0", - "babel-eslint": "^8.2.1", - "babel-loader": "^7.1.2", - "babel-plugin-transform-class-properties": "^6.24.1", - "babel-plugin-transform-decorators-legacy": "^1.3.4", - "babel-plugin-transform-flow-strip-types": "^6.22.0", - "babel-plugin-transform-runtime": "^6.23.0", - "babel-preset-env": "^1.6.1", - "babel-preset-react": "^6.24.1", - "babel-preset-stage-0": "^6.24.1", - "babel-runtime": "^6.26.0", - "classnames": "^2.2.5", - "css-loader": "^0.28.9", - "escape-html": "^1.0.3", - "eslint": "^4.16.0", - "eslint-config-airbnb": "^16.1.0", - "eslint-loader": "^2.0.0", - "eslint-plugin-flowtype": "^2.41.0", - "eslint-plugin-import": "^2.8.0", - "eslint-plugin-jsx-a11y": "^6.0.3", - "eslint-plugin-react": "^7.5.1", - "file-loader": "^1.1.6", - "flow-bin": "^0.63.1", - "flow-bin-loader": "^1.0.2", - "flow-typed": "^2.2.3", - "material-ui": "^1.0.0-beta.30", - "material-ui-icons": "^1.0.0-beta.17", - "path": "^0.12.7", - "react": "^16.2.0", - "react-dom": "^16.2.0", - "react-fa": "^5.0.0", - "react-transition-group": "^2.2.1", - "recharts": "^1.0.0-beta.9", - "style-loader": "^0.19.1", - "url": "^0.11.0", - "url-loader": "^0.6.2", - "webpack": "^3.10.0", - "webpack-dev-server": "^2.11.1" - }, - "scripts": { - "build": "NODE_ENV=production webpack", - "stats": "webpack --profile --json > stats.json", - "dev": "webpack-dev-server --port 8081", - "flow": "flow-typed install" - } -} diff --git a/dashboard/assets/types/content.jsx b/dashboard/assets/types/content.jsx deleted file mode 100644 index ff82c3572d05..000000000000 --- a/dashboard/assets/types/content.jsx +++ /dev/null @@ -1,96 +0,0 @@ -// @flow - -// 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 . - -export type Content = { - general: General, - home: Home, - chain: Chain, - txpool: TxPool, - network: Network, - system: System, - logs: Logs, -}; - -export type ChartEntries = Array; - -export type ChartEntry = { - time: Date, - value: number, -}; - -export type General = { - version: ?string, - commit: ?string, -}; - -export type Home = { - /* TODO (kurkomisi) */ -}; - -export type Chain = { - /* TODO (kurkomisi) */ -}; - -export type TxPool = { - /* TODO (kurkomisi) */ -}; - -export type Network = { - /* TODO (kurkomisi) */ -}; - -export type System = { - activeMemory: ChartEntries, - virtualMemory: ChartEntries, - networkIngress: ChartEntries, - networkEgress: ChartEntries, - processCPU: ChartEntries, - systemCPU: ChartEntries, - diskRead: ChartEntries, - diskWrite: ChartEntries, -}; - -export type Record = { - t: string, - lvl: Object, - msg: string, - ctx: Array -}; - -export type Chunk = { - content: string, - name: string, -}; - -export type Logs = { - chunks: Array, - endTop: boolean, - endBottom: boolean, - topChanged: number, - bottomChanged: number, -}; - -export type LogsMessage = { - source: ?LogFile, - chunk: Array, -}; - -export type LogFile = { - name: string, - last: string, -}; diff --git a/dashboard/assets/webpack.config.js b/dashboard/assets/webpack.config.js deleted file mode 100644 index f58d35ad1e38..000000000000 --- a/dashboard/assets/webpack.config.js +++ /dev/null @@ -1,77 +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 . - -const webpack = require('webpack'); -const path = require('path'); - -module.exports = { - resolve: { - extensions: ['.js', '.jsx'], - }, - entry: './index', - output: { - path: path.resolve(__dirname, ''), - filename: 'bundle.js', - }, - plugins: [ - new webpack.optimize.UglifyJsPlugin({ - comments: false, - mangle: false, - beautify: true, - }), - new webpack.DefinePlugin({ - PROD: process.env.NODE_ENV === 'production', - }), - ], - module: { - rules: [ - { - test: /\.jsx$/, // regexp for JSX files - exclude: /node_modules/, - use: [ // order: from bottom to top - { - loader: 'babel-loader', - options: { - plugins: [ // order: from top to bottom - // 'transform-decorators-legacy', // @withStyles, @withTheme - 'transform-class-properties', // static defaultProps - 'transform-flow-strip-types', - ], - presets: [ // order: from bottom to top - 'env', - 'react', - 'stage-0', - ], - }, - }, - // 'eslint-loader', // show errors not only in the editor, but also in the console - ], - }, - { - test: /font-awesome\.css$/, - use: [ - 'style-loader', - 'css-loader', - path.resolve(__dirname, './fa-only-woff-loader.js'), - ], - }, - { - test: /\.woff2?$/, // font-awesome icons - use: 'url-loader', - }, - ], - }, -}; diff --git a/dashboard/assets/yarn.lock b/dashboard/assets/yarn.lock deleted file mode 100644 index 10277c988235..000000000000 --- a/dashboard/assets/yarn.lock +++ /dev/null @@ -1,6590 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@babel/code-frame@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" - dependencies: - "@babel/highlight" "7.0.0-beta.44" - -"@babel/generator@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" - dependencies: - "@babel/types" "7.0.0-beta.44" - jsesc "^2.5.1" - lodash "^4.2.0" - source-map "^0.5.0" - trim-right "^1.0.1" - -"@babel/helper-function-name@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" - dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.44" - "@babel/template" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - -"@babel/helper-get-function-arity@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" - dependencies: - "@babel/types" "7.0.0-beta.44" - -"@babel/helper-split-export-declaration@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" - dependencies: - "@babel/types" "7.0.0-beta.44" - -"@babel/highlight@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - -"@babel/template@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - lodash "^4.2.0" - -"@babel/traverse@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/generator" "7.0.0-beta.44" - "@babel/helper-function-name" "7.0.0-beta.44" - "@babel/helper-split-export-declaration" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - debug "^3.1.0" - globals "^11.1.0" - invariant "^2.2.0" - lodash "^4.2.0" - -"@babel/types@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" - dependencies: - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^2.0.0" - -"@types/jss@^9.3.0": - version "9.5.0" - resolved "https://registry.yarnpkg.com/@types/jss/-/jss-9.5.0.tgz#65d9b5c61f1e95ad3acd53e9a8b2d2342aa917e8" - dependencies: - csstype "^1.6.0" - -"@types/react-transition-group@^2.0.6": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-2.0.7.tgz#2847292d54c5685d982ae5a3ecb6960946689d87" - dependencies: - "@types/react" "*" - -"@types/react@*": - version "16.0.40" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.0.40.tgz#caabc2296886f40b67f6fc80f0f3464476461df9" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - -accepts@~1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" - dependencies: - mime-types "~2.1.18" - negotiator "0.6.1" - -acorn-dynamic-import@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" - dependencies: - acorn "^4.0.3" - -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - dependencies: - acorn "^3.0.4" - -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -acorn@^4.0.3: - version "4.0.13" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" - -acorn@^5.0.0, acorn@^5.4.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.0.tgz#1abb587fbf051f94e3de20e6b26ef910b1828298" - -ajv-keywords@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" - -ajv-keywords@^3.0.0, ajv-keywords@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be" - -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - -ajv@^5.0.0, ajv@^5.2.3, ajv@^5.3.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - -ajv@^6.0.1, ajv@^6.1.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.2.0.tgz#afac295bbaa0152449e522742e4547c1ae9328d2" - dependencies: - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - -ansi-escapes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" - -ansi-html@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - dependencies: - color-convert "^1.9.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - -are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - dependencies: - sprintf-js "~1.0.2" - -aria-query@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.1.tgz#26cbb5aff64144b0a825be1846e0b16cfa00b11e" - dependencies: - ast-types-flow "0.0.7" - commander "^2.11.0" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - -arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - -array-flatten@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" - -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.7.0" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - dependencies: - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - -ast-types-flow@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -async@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - -async@^2.1.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" - dependencies: - lodash "^4.14.0" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -atob@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" - -autoprefixer@^6.3.1: - version "6.7.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014" - dependencies: - browserslist "^1.7.6" - caniuse-db "^1.0.30000634" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^5.2.16" - postcss-value-parser "^3.2.3" - -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - -aws4@^1.2.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" - -axobject-query@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0" - dependencies: - ast-types-flow "0.0.7" - -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - -babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - -babel-eslint@^8.2.1: - version "8.2.3" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.3.tgz#1a2e6681cc9bc4473c32899e59915e19cd6733cf" - dependencies: - "@babel/code-frame" "7.0.0-beta.44" - "@babel/traverse" "7.0.0-beta.44" - "@babel/types" "7.0.0-beta.44" - babylon "7.0.0-beta.44" - eslint-scope "~3.7.1" - eslint-visitor-keys "^1.0.0" - -babel-generator@^6.26.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - -babel-helper-bindify-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz#14c19e5f142d7b47f19a52431e52b1ccbc40a330" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-builder-react-jsx@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - esutils "^2.0.2" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-explode-class@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz#7dc2a3910dee007056e1e31d640ced3d54eaa9eb" - dependencies: - babel-helper-bindify-decorators "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-loader@^7.1.2: - version "7.1.4" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.4.tgz#e3463938bd4e6d55d1c174c5485d406a188ed015" - dependencies: - find-cache-dir "^1.0.0" - loader-utils "^1.0.2" - mkdirp "^0.5.1" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-async-generators@^6.5.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz#6bc963ebb16eccbae6b92b596eb7f35c342a8b9a" - -babel-plugin-syntax-class-constructor-call@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz#9cb9d39fe43c8600bec8146456ddcbd4e1a76416" - -babel-plugin-syntax-class-properties@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de" - -babel-plugin-syntax-decorators@^6.1.18, babel-plugin-syntax-decorators@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz#312563b4dbde3cc806cee3e416cceeaddd11ac0b" - -babel-plugin-syntax-do-expressions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz#5747756139aa26d390d09410b03744ba07e4796d" - -babel-plugin-syntax-dynamic-import@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da" - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-export-extensions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz#70a1484f0f9089a4e84ad44bac353c95b9b12721" - -babel-plugin-syntax-flow@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" - -babel-plugin-syntax-function-bind@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz#48c495f177bdf31a981e732f55adc0bdd2601f46" - -babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - -babel-plugin-transform-async-generator-functions@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz#f058900145fd3e9907a6ddf28da59f215258a5db" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-generators "^6.5.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-async-to-generator@^6.22.0, babel-plugin-transform-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-class-constructor-call@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz#80dc285505ac067dcb8d6c65e2f6f11ab7765ef9" - dependencies: - babel-plugin-syntax-class-constructor-call "^6.18.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-class-properties@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac" - dependencies: - babel-helper-function-name "^6.24.1" - babel-plugin-syntax-class-properties "^6.8.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-decorators-legacy@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.4.tgz#741b58f6c5bce9e6027e0882d9c994f04f366925" - dependencies: - babel-plugin-syntax-decorators "^6.1.18" - babel-runtime "^6.2.0" - babel-template "^6.3.0" - -babel-plugin-transform-decorators@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz#788013d8f8c6b5222bdf7b344390dfd77569e24d" - dependencies: - babel-helper-explode-class "^6.24.1" - babel-plugin-syntax-decorators "^6.13.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-do-expressions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz#28ccaf92812d949c2cd1281f690c8fdc468ae9bb" - dependencies: - babel-plugin-syntax-do-expressions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0, babel-plugin-transform-exponentiation-operator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-export-extensions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz#53738b47e75e8218589eea946cbbd39109bbe653" - dependencies: - babel-plugin-syntax-export-extensions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-flow-strip-types@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" - dependencies: - babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-function-bind@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz#c6fb8e96ac296a310b8cf8ea401462407ddf6a97" - dependencies: - babel-plugin-syntax-function-bind "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-react-display-name@^6.23.0: - version "6.25.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx-self@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx-source@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6" - dependencies: - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-react-jsx@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" - dependencies: - babel-helper-builder-react-jsx "^6.24.1" - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-runtime@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-polyfill@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - -babel-preset-env@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^2.1.2" - invariant "^2.2.2" - semver "^5.3.0" - -babel-preset-flow@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d" - dependencies: - babel-plugin-transform-flow-strip-types "^6.22.0" - -babel-preset-react@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380" - dependencies: - babel-plugin-syntax-jsx "^6.3.13" - babel-plugin-transform-react-display-name "^6.23.0" - babel-plugin-transform-react-jsx "^6.24.1" - babel-plugin-transform-react-jsx-self "^6.22.0" - babel-plugin-transform-react-jsx-source "^6.22.0" - babel-preset-flow "^6.23.0" - -babel-preset-stage-0@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz#5642d15042f91384d7e5af8bc88b1db95b039e6a" - dependencies: - babel-plugin-transform-do-expressions "^6.22.0" - babel-plugin-transform-function-bind "^6.22.0" - babel-preset-stage-1 "^6.24.1" - -babel-preset-stage-1@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz#7692cd7dcd6849907e6ae4a0a85589cfb9e2bfb0" - dependencies: - babel-plugin-transform-class-constructor-call "^6.24.1" - babel-plugin-transform-export-extensions "^6.22.0" - babel-preset-stage-2 "^6.24.1" - -babel-preset-stage-2@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz#d9e2960fb3d71187f0e64eec62bc07767219bdc1" - dependencies: - babel-plugin-syntax-dynamic-import "^6.18.0" - babel-plugin-transform-class-properties "^6.24.1" - babel-plugin-transform-decorators "^6.24.1" - babel-preset-stage-3 "^6.24.1" - -babel-preset-stage-3@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz#836ada0a9e7a7fa37cb138fb9326f87934a48395" - dependencies: - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-generator-functions "^6.24.1" - babel-plugin-transform-async-to-generator "^6.24.1" - babel-plugin-transform-exponentiation-operator "^6.24.1" - babel-plugin-transform-object-rest-spread "^6.22.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.24.1, babel-template@^6.26.0, babel-template@^6.3.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.24.1, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@7.0.0-beta.44: - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - -balanced-match@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -base64-js@^1.0.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.3.tgz#fb13668233d9614cf5fb4bce95a9ba4096cdf801" - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - dependencies: - tweetnacl "^0.14.3" - -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - -binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" - -"binary@>= 0.3.0 < 1": - version "0.3.0" - resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" - dependencies: - buffers "~0.1.1" - chainsaw "~0.1.0" - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - -body-parser@1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" - dependencies: - bytes "3.0.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.1" - http-errors "~1.6.2" - iconv-lite "0.4.19" - on-finished "~2.3.0" - qs "6.5.1" - raw-body "2.3.2" - type-is "~1.6.15" - -bonjour@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - dependencies: - array-flatten "^2.1.0" - deep-equal "^1.0.1" - dns-equal "^1.0.0" - dns-txt "^2.0.2" - multicast-dns "^6.0.1" - multicast-dns-service-types "^1.1.0" - -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.0, braces@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.1.tgz#7086c913b4e5a08dbe37ac0ee6a2500c4ba691bb" - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - define-property "^1.0.0" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - kind-of "^6.0.2" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -brcast@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/brcast/-/brcast-3.0.1.tgz#6256a8349b20de9eed44257a9b24d71493cd48dd" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - dependencies: - pako "~1.0.5" - -browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: - version "1.7.7" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9" - dependencies: - caniuse-db "^1.0.30000639" - electron-to-chromium "^1.2.7" - -browserslist@^2.1.2: - version "2.11.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" - dependencies: - caniuse-lite "^1.0.30000792" - electron-to-chromium "^1.3.30" - -buffer-indexof@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - -buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -buffers@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" - -builtin-modules@^1.0.0, builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -caller-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - dependencies: - callsites "^0.2.0" - -callsites@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - -caniuse-api@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c" - dependencies: - browserslist "^1.3.6" - caniuse-db "^1.0.30000529" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000811" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000811.tgz#19efb9238393d40078332c34485c818d641c4305" - -caniuse-lite@^1.0.30000792: - version "1.0.30000811" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000811.tgz#0b6e40f2efccc27bd3cb52f91ee7ca4673d77d10" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chain-function@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chain-function/-/chain-function-1.0.0.tgz#0d4ab37e7e18ead0bdc47b920764118ce58733dc" - -chainsaw@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" - dependencies: - traverse ">=0.3.0 <0.4" - -chalk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.0.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^2.1.0, chalk@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -change-emitter@^0.1.2: - version "0.1.6" - resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515" - -chardet@^0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" - -charenc@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - -chokidar@^2.0.0, chokidar@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.2.tgz#4dc65139eeb2714977735b6a35d06e97b494dfd7" - dependencies: - anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" - glob-parent "^3.1.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^2.1.1" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.0" - optionalDependencies: - fsevents "^1.0.0" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -circular-json@^0.3.1: - version "0.3.3" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - -clap@^1.0.9: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51" - dependencies: - chalk "^1.1.3" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -classnames@2.2.5, classnames@^2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -clone@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -coa@~1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd" - dependencies: - q "^1.1.2" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.3.0, color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" - dependencies: - color-name "^1.1.1" - -color-name@^1.0.0, color-name@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" - dependencies: - color-name "^1.0.0" - -color@^0.11.0: - version "0.11.4" - resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764" - dependencies: - clone "^1.0.2" - color-convert "^1.3.0" - color-string "^0.3.0" - -colormin@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133" - dependencies: - color "^0.11.0" - css-color-names "0.0.4" - has "^1.0.1" - -colors@^1.1.2, colors@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - dependencies: - delayed-stream "~1.0.0" - -commander@^2.11.0: - version "2.14.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - -component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - -compressible@~2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.13.tgz#0d1020ab924b2fdb4d6279875c7d6daba6baa7a9" - dependencies: - mime-db ">= 1.33.0 < 2" - -compression@^1.5.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.2.tgz#aaffbcd6aaf854b44ebb280353d5ad1651f59a69" - dependencies: - accepts "~1.3.4" - bytes "3.0.0" - compressible "~2.0.13" - debug "2.6.9" - on-headers "~1.0.1" - safe-buffer "5.1.1" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -concat-stream@^1.6.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.1.tgz#261b8f518301f1d834e36342b9fea095d2620a26" - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -connect-history-api-fallback@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" - -console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - dependencies: - date-now "^0.1.4" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - -convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - -cookie@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - -core-js@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" - -core-js@^1.0.0: - version "1.2.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" - -core-js@^2.4.0, core-js@^2.5.0: - version "2.5.7" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -create-ecdh@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - ripemd160 "^2.0.0" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.6" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^5.0.1, cross-spawn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -crypt@~0.0.1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-color-names@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - -css-loader@^0.28.9: - version "0.28.10" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.10.tgz#40282e79230f7bcb4e483efa631d670b735ebf42" - dependencies: - babel-code-frame "^6.26.0" - css-selector-tokenizer "^0.7.0" - cssnano "^3.10.0" - icss-utils "^2.1.0" - loader-utils "^1.0.2" - lodash.camelcase "^4.3.0" - object-assign "^4.1.1" - postcss "^5.0.6" - postcss-modules-extract-imports "^1.2.0" - postcss-modules-local-by-default "^1.2.0" - postcss-modules-scope "^1.1.0" - postcss-modules-values "^1.3.0" - postcss-value-parser "^3.3.0" - source-list-map "^2.0.0" - -css-selector-tokenizer@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86" - dependencies: - cssesc "^0.1.0" - fastparse "^1.1.1" - regexpu-core "^1.0.0" - -css-vendor@^0.3.8: - version "0.3.8" - resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-0.3.8.tgz#6421cfd3034ce664fe7673972fd0119fc28941fa" - dependencies: - is-in-browser "^1.0.2" - -cssesc@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" - -cssnano@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38" - dependencies: - autoprefixer "^6.3.1" - decamelize "^1.1.2" - defined "^1.0.0" - has "^1.0.1" - object-assign "^4.0.1" - postcss "^5.0.14" - postcss-calc "^5.2.0" - postcss-colormin "^2.1.8" - postcss-convert-values "^2.3.4" - postcss-discard-comments "^2.0.4" - postcss-discard-duplicates "^2.0.1" - postcss-discard-empty "^2.0.1" - postcss-discard-overridden "^0.1.1" - postcss-discard-unused "^2.2.1" - postcss-filter-plugins "^2.0.0" - postcss-merge-idents "^2.1.5" - postcss-merge-longhand "^2.0.1" - postcss-merge-rules "^2.0.3" - postcss-minify-font-values "^1.0.2" - postcss-minify-gradients "^1.0.1" - postcss-minify-params "^1.0.4" - postcss-minify-selectors "^2.0.4" - postcss-normalize-charset "^1.1.0" - postcss-normalize-url "^3.0.7" - postcss-ordered-values "^2.1.0" - postcss-reduce-idents "^2.2.2" - postcss-reduce-initial "^1.0.0" - postcss-reduce-transforms "^1.0.3" - postcss-svgo "^2.1.1" - postcss-unique-selectors "^2.0.2" - postcss-value-parser "^3.2.3" - postcss-zindex "^2.0.1" - -csso@~2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85" - dependencies: - clap "^1.0.9" - source-map "^0.5.3" - -csstype@^1.6.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-1.8.2.tgz#2c0f16da08b99f13fe7fbb242e87d1a19dbe77a7" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - -d3-array@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.1.tgz#d1ca33de2f6ac31efadb8e050a021d7e2396d5dc" - -d3-collection@1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.4.tgz#342dfd12837c90974f33f1cc0a785aea570dcdc2" - -d3-color@1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.0.3.tgz#bc7643fca8e53a8347e2fbdaffa236796b58509b" - -d3-format@1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.2.2.tgz#1a39c479c8a57fe5051b2e67a3bee27061a74e7a" - -d3-interpolate@1, d3-interpolate@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.1.6.tgz#2cf395ae2381804df08aa1bf766b7f97b5f68fb6" - dependencies: - d3-color "1" - -d3-path@1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.5.tgz#241eb1849bd9e9e8021c0d0a799f8a0e8e441764" - -d3-scale@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-1.0.6.tgz#bce19da80d3a0cf422c9543ae3322086220b34ed" - dependencies: - d3-array "^1.2.0" - d3-collection "1" - d3-color "1" - d3-format "1" - d3-interpolate "1" - d3-time "1" - d3-time-format "2" - -d3-shape@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.2.0.tgz#45d01538f064bafd05ea3d6d2cb748fd8c41f777" - dependencies: - d3-path "1" - -d3-time-format@2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.1.1.tgz#85b7cdfbc9ffca187f14d3c456ffda268081bb31" - dependencies: - d3-time "1" - -d3-time@1: - version "1.0.8" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.0.8.tgz#dbd2d6007bf416fe67a76d17947b784bffea1e84" - -d@1: - version "1.0.0" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" - dependencies: - es5-ext "^0.10.9" - -damerau-levenshtein@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - dependencies: - ms "2.0.0" - -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - -decompress-response@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - dependencies: - mimic-response "^1.0.0" - -deep-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" - -deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - -deepmerge@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.0.1.tgz#25c1c24f110fb914f80001b925264dd77f3f4312" - -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" - dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - -del@^2.0.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - -del@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" - dependencies: - globby "^6.1.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - p-map "^1.1.1" - pify "^3.0.0" - rimraf "^2.2.8" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -depd@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" - -depd@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - -des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - -detect-node@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" - -diffie-hellman@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - -dns-packet@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" - dependencies: - ip "^1.1.0" - safe-buffer "^5.0.1" - -dns-txt@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - dependencies: - buffer-indexof "^1.0.0" - -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - -doctrine@^2.0.2, doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - dependencies: - esutils "^2.0.2" - -dom-helpers@^3.2.0, dom-helpers@^3.2.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.3.1.tgz#fc1a4e15ffdf60ddde03a480a9c0fece821dd4a6" - -dom-walk@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30: - version "1.3.34" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.34.tgz#d93498f40391bb0c16a603d8241b9951404157ed" - -elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emoji-regex@^6.1.0: - version "6.5.1" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - -encodeurl@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - -encoding@^0.1.11: - version "0.1.12" - resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" - dependencies: - iconv-lite "~0.4.13" - -enhanced-resolve@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e" - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - object-assign "^4.0.1" - tapable "^0.2.7" - -errno@^0.1.3: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - dependencies: - prr "~1.0.1" - -error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.7.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" - dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" - dependencies: - is-callable "^1.1.1" - is-date-object "^1.0.1" - is-symbol "^1.0.1" - -es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: - version "0.10.39" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.39.tgz#fca21b67559277ca4ac1a1ed7048b107b6f76d87" - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.1" - -es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-map@^0.1.3: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - -es6-set@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - -es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - dependencies: - d "1" - es5-ext "~0.10.14" - -es6-weak-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" - dependencies: - d "1" - es5-ext "^0.10.14" - es6-iterator "^2.0.1" - es6-symbol "^3.1.1" - -escape-html@^1.0.3, escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -escope@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-config-airbnb-base@^12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz#386441e54a12ccd957b0a92564a4bafebd747944" - dependencies: - eslint-restricted-globals "^0.1.1" - -eslint-config-airbnb@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb/-/eslint-config-airbnb-16.1.0.tgz#2546bfb02cc9fe92284bf1723ccf2e87bc45ca46" - dependencies: - eslint-config-airbnb-base "^12.1.0" - -eslint-import-resolver-node@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a" - dependencies: - debug "^2.6.9" - resolve "^1.5.0" - -eslint-loader@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.0.0.tgz#d136619b5c684e36531ffc28c60a56e404608f5d" - dependencies: - loader-fs-cache "^1.0.0" - loader-utils "^1.0.2" - object-assign "^4.0.1" - object-hash "^1.1.4" - rimraf "^2.6.1" - -eslint-module-utils@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz#abaec824177613b8a95b299639e1b6facf473449" - dependencies: - debug "^2.6.8" - pkg-dir "^1.0.0" - -eslint-plugin-flowtype@^2.41.0: - version "2.46.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.46.1.tgz#c4f81d580cd89c82bc3a85a1ccf4ae3a915143a4" - dependencies: - lodash "^4.15.0" - -eslint-plugin-import@^2.8.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.9.0.tgz#26002efbfca5989b7288ac047508bd24f217b169" - dependencies: - builtin-modules "^1.1.1" - contains-path "^0.1.0" - debug "^2.6.8" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.1" - eslint-module-utils "^2.1.1" - has "^1.0.1" - lodash "^4.17.4" - minimatch "^3.0.3" - read-pkg-up "^2.0.0" - -eslint-plugin-jsx-a11y@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.0.3.tgz#54583d1ae442483162e040e13cc31865465100e5" - dependencies: - aria-query "^0.7.0" - array-includes "^3.0.3" - ast-types-flow "0.0.7" - axobject-query "^0.1.0" - damerau-levenshtein "^1.0.0" - emoji-regex "^6.1.0" - jsx-ast-utils "^2.0.0" - -eslint-plugin-react@^7.5.1: - version "7.7.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.7.0.tgz#f606c719dbd8a1a2b3d25c16299813878cca0160" - dependencies: - doctrine "^2.0.2" - has "^1.0.1" - jsx-ast-utils "^2.0.1" - prop-types "^15.6.0" - -eslint-restricted-globals@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz#35f0d5cbc64c2e3ed62e93b4b1a7af05ba7ed4d7" - -eslint-scope@^3.7.1, eslint-scope@~3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-visitor-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" - -eslint@^4.16.0: - version "4.18.2" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.18.2.tgz#0f81267ad1012e7d2051e186a9004cc2267b8d45" - dependencies: - ajv "^5.3.0" - babel-code-frame "^6.22.0" - chalk "^2.1.0" - concat-stream "^1.6.0" - cross-spawn "^5.1.0" - debug "^3.1.0" - doctrine "^2.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.2" - esquery "^1.0.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.0.1" - ignore "^3.3.3" - imurmurhash "^0.1.4" - inquirer "^3.0.6" - is-resolvable "^1.0.0" - js-yaml "^3.9.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.4" - minimatch "^3.0.2" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - pluralize "^7.0.0" - progress "^2.0.0" - require-uncached "^1.0.3" - semver "^5.3.0" - strip-ansi "^4.0.0" - strip-json-comments "~2.0.1" - table "4.0.2" - text-table "~0.2.0" - -espree@^3.5.2: - version "3.5.3" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6" - dependencies: - acorn "^5.4.0" - acorn-jsx "^3.0.0" - -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - -esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" - -esquery@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" - dependencies: - estraverse "^4.0.0" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - dependencies: - estraverse "^4.1.0" - -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - -event-emitter@~0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - dependencies: - d "1" - es5-ext "~0.10.14" - -eventemitter3@1.x.x: - version "1.2.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" - -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - -eventsource@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" - dependencies: - original ">=0.0.5" - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -express@^4.16.2: - version "4.16.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" - dependencies: - accepts "~1.3.4" - array-flatten "1.1.1" - body-parser "1.18.2" - content-disposition "0.5.2" - content-type "~1.0.4" - cookie "0.3.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.1" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.1.0" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.2" - path-to-regexp "0.1.7" - proxy-addr "~2.0.2" - qs "6.5.1" - range-parser "~1.2.0" - safe-buffer "5.1.1" - send "0.16.1" - serve-static "1.13.1" - setprototypeof "1.1.0" - statuses "~1.3.1" - type-is "~1.6.15" - utils-merge "1.0.1" - vary "~1.1.2" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -external-editor@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" - dependencies: - chardet "^0.4.0" - iconv-lite "^0.4.17" - tmp "^0.0.33" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - -fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - -fast-levenshtein@~2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - -fastparse@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" - -faye-websocket@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - dependencies: - websocket-driver ">=0.5.1" - -faye-websocket@~0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" - dependencies: - websocket-driver ">=0.5.1" - -fbjs@^0.8.1, fbjs@^0.8.16: - version "0.8.16" - resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" - dependencies: - core-js "^1.0.0" - isomorphic-fetch "^2.1.1" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.9" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - -file-loader@^1.1.6: - version "1.1.11" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8" - dependencies: - loader-utils "^1.0.2" - schema-utils "^0.4.5" - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -finalhandler@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" - dependencies: - debug "2.6.9" - encodeurl "~1.0.1" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.3.1" - unpipe "~1.0.0" - -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" - dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" - -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - dependencies: - locate-path "^2.0.0" - -flat-cache@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" - dependencies: - circular-json "^0.3.1" - del "^2.0.2" - graceful-fs "^4.1.2" - write "^0.2.1" - -flatten@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" - -flow-bin-loader@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flow-bin-loader/-/flow-bin-loader-1.0.3.tgz#1b95260437bea24786a5abc022ef3efa02df77c5" - -flow-bin@^0.63.1: - version "0.63.1" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.63.1.tgz#ab00067c197169a5fb5b4996c8f6927b06694828" - -flow-typed@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/flow-typed/-/flow-typed-2.3.0.tgz#0f8604faab60691b885024e16ec0e3256e3b680e" - dependencies: - babel-polyfill "^6.26.0" - colors "^1.1.2" - fs-extra "^5.0.0" - github "0.2.4" - glob "^7.1.2" - got "^7.1.0" - md5 "^2.1.0" - mkdirp "^0.5.1" - rimraf "^2.6.2" - semver "^5.5.0" - table "^4.0.2" - through "^2.3.8" - unzip "^0.1.11" - which "^1.3.0" - yargs "^4.2.0" - -font-awesome@^4.3.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" - -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - dependencies: - for-in "^1.0.1" - -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - -forwarded@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - dependencies: - map-cache "^0.2.2" - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - -fs-extra@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.39" - -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -"fstream@>= 0.1.30 < 1": - version "0.1.31" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-0.1.31.tgz#7337f058fbbbbefa8c9f561a28cab0849202c988" - dependencies: - graceful-fs "~3.0.2" - inherits "~2.0.0" - mkdirp "0.5" - rimraf "2" - -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -function-bind@^1.0.2, function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - -github@0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/github/-/github-0.2.4.tgz#24fa7f0e13fa11b946af91134c51982a91ce538b" - dependencies: - mime "^1.2.11" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global@~4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" - dependencies: - min-document "^2.19.0" - process "~0.5.1" - -globals@^11.0.1: - version "11.3.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" - -globals@^11.1.0: - version "11.5.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" - -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -got@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-7.1.0.tgz#05450fd84094e6bbea56f451a43a9c289166385a" - dependencies: - decompress-response "^3.2.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-plain-obj "^1.1.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - isurl "^1.0.0-alpha5" - lowercase-keys "^1.0.0" - p-cancelable "^0.3.0" - p-timeout "^1.1.1" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - url-parse-lax "^1.0.0" - url-to-options "^1.0.1" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -graceful-fs@~3.0.2: - version "3.0.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" - dependencies: - natives "^1.1.0" - -handle-thing@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" - -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - -has-symbol-support-x@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz#1409f98bc00247da45da67cee0a36f282ff26455" - -has-to-string-tag-x@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" - dependencies: - has-symbol-support-x "^1.4.1" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" - dependencies: - function-bind "^1.0.2" - -hash-base@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" - dependencies: - inherits "^2.0.1" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.0" - -hawk@3.1.3, hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - -hoist-non-react-statics@^2.3.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.0.tgz#d2ca2dfc19c5a91c5a6615ce8e564ef0347e2a40" - -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - -hosted-git-info@^2.1.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-comment-regex@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" - -html-entities@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - -http-errors@1.6.2, http-errors@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" - dependencies: - depd "1.1.1" - inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" - -http-parser-js@>=0.4.0: - version "0.4.10" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4" - -http-proxy-middleware@~0.17.4: - version "0.17.4" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833" - dependencies: - http-proxy "^1.16.2" - is-glob "^3.1.0" - lodash "^4.17.2" - micromatch "^2.3.11" - -http-proxy@^1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" - dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" - -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - -hyphenate-style-name@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.2.tgz#31160a36930adaf1fc04c6074f7eb41465d4ec4b" - -iconv-lite@0.4.19, iconv-lite@^0.4.17: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" - -iconv-lite@~0.4.13: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-replace-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" - -icss-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" - dependencies: - postcss "^6.0.1" - -ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" - -ignore@^3.3.3: - version "3.3.7" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" - -import-local@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" - dependencies: - pkg-dir "^2.0.0" - resolve-cwd "^2.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - -ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - -inquirer@^3.0.6: - version "3.3.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^2.0.4" - figures "^2.0.0" - lodash "^4.3.0" - mute-stream "0.0.7" - run-async "^2.2.0" - rx-lite "^4.0.8" - rx-lite-aggregates "^4.0.8" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -internal-ip@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" - dependencies: - meow "^3.3.0" - -interpret@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" - -invariant@^2.2.0, invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - dependencies: - loose-envify "^1.0.0" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - -ip@^1.1.0, ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - -ipaddr.js@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" - -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5, is-buffer@~1.1.1: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-callable@^1.1.1, is-callable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-function@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - dependencies: - is-extglob "^2.1.1" - -is-in-browser@^1.0.2, is-in-browser@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - -is-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - -is-odd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" - dependencies: - is-number "^4.0.0" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - dependencies: - path-is-inside "^1.0.1" - -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - dependencies: - isobject "^3.0.1" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - dependencies: - has "^1.0.1" - -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - -is-retry-allowed@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -is-svg@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" - dependencies: - html-comment-regex "^1.1.0" - -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - -isomorphic-fetch@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -isurl@^1.0.0-alpha5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" - dependencies: - has-to-string-tag-x "^1.2.0" - is-object "^1.0.1" - -js-base64@^2.1.9: - version "2.4.3" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.3.tgz#2e545ec2b0f2957f41356510205214e98fad6582" - -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -js-yaml@^3.9.1: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@~3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - -jsesc@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - -json-loader@^0.5.4: - version "0.5.7" - resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d" - -json-schema-traverse@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json3@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - -json5@^0.5.0, json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -jss-camel-case@^6.0.0, jss-camel-case@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jss-camel-case/-/jss-camel-case-6.1.0.tgz#ccb1ff8d6c701c02a1fed6fb6fb6b7896e11ce44" - dependencies: - hyphenate-style-name "^1.0.2" - -jss-compose@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/jss-compose/-/jss-compose-5.0.0.tgz#ce01b2e4521d65c37ea42cf49116e5f7ab596484" - dependencies: - warning "^3.0.0" - -jss-default-unit@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/jss-default-unit/-/jss-default-unit-8.0.2.tgz#cc1e889bae4c0b9419327b314ab1c8e2826890e6" - -jss-expand@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/jss-expand/-/jss-expand-5.1.0.tgz#b1ad74ec18631f34f65a2124fcfceb6400610e3d" - -jss-extend@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/jss-extend/-/jss-extend-6.2.0.tgz#4af09d0b72fb98ee229970f8ca852fec1ca2a8dc" - dependencies: - warning "^3.0.0" - -jss-global@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/jss-global/-/jss-global-3.0.0.tgz#e19e5c91ab2b96353c227e30aa2cbd938cdaafa2" - -jss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/jss-nested/-/jss-nested-6.0.1.tgz#ef992b79d6e8f63d939c4397b9d99b5cbbe824ca" - dependencies: - warning "^3.0.0" - -jss-preset-default@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/jss-preset-default/-/jss-preset-default-4.3.0.tgz#7bc91b0b282492557d36ed4e5c6d7c8cb3154bb8" - dependencies: - jss-camel-case "^6.1.0" - jss-compose "^5.0.0" - jss-default-unit "^8.0.2" - jss-expand "^5.1.0" - jss-extend "^6.2.0" - jss-global "^3.0.0" - jss-nested "^6.0.1" - jss-props-sort "^6.0.0" - jss-template "^1.0.1" - jss-vendor-prefixer "^7.0.0" - -jss-props-sort@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/jss-props-sort/-/jss-props-sort-6.0.0.tgz#9105101a3b5071fab61e2d85ea74cc22e9b16323" - -jss-template@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/jss-template/-/jss-template-1.0.1.tgz#09aed9d86cc547b07f53ef355d7e1777f7da430a" - dependencies: - warning "^3.0.0" - -jss-vendor-prefixer@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/jss-vendor-prefixer/-/jss-vendor-prefixer-7.0.0.tgz#0166729650015ef19d9f02437c73667231605c71" - dependencies: - css-vendor "^0.3.8" - -jss@^9.3.2, jss@^9.3.3: - version "9.8.0" - resolved "https://registry.yarnpkg.com/jss/-/jss-9.8.0.tgz#77830def563870103f8671ed31ce3a3d2f32aa2b" - dependencies: - is-in-browser "^1.1.3" - symbol-observable "^1.1.0" - warning "^3.0.0" - -jsx-ast-utils@^2.0.0, jsx-ast-utils@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" - dependencies: - array-includes "^3.0.3" - -keycode@^2.1.9: - version "2.1.9" - resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.1.9.tgz#964a23c54e4889405b4861a5c9f0480d45141dfa" - -killable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -lazy-cache@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" - dependencies: - set-getter "^0.1.0" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - -loader-fs-cache@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz#56e0bf08bd9708b26a765b68509840c8dec9fdbc" - dependencies: - find-cache-dir "^0.1.1" - mkdirp "0.5.1" - -loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" - -loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -lodash.assign@^4.0.3, lodash.assign@^4.0.6: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - -lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.2, lodash@^4.3.0, lodash@~4.17.4: - version "4.17.5" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" - -lodash@^4.17.4, lodash@^4.2.0: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - -loglevel@^1.4.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - dependencies: - js-tokens "^3.0.0" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lowercase-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - -lru-cache@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -macaddress@^0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - dependencies: - pify "^3.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - dependencies: - object-visit "^1.0.0" - -"match-stream@>= 0.0.2 < 1": - version "0.0.2" - resolved "https://registry.yarnpkg.com/match-stream/-/match-stream-0.0.2.tgz#99eb050093b34dffade421b9ac0b410a9cfa17cf" - dependencies: - buffers "~0.1.1" - readable-stream "~1.0.0" - -material-ui-icons@^1.0.0-beta.17: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/material-ui-icons/-/material-ui-icons-1.0.0-beta.35.tgz#f795fafa385918ef7c88ee382e5e5bf4401f008c" - dependencies: - recompose "^0.26.0" - -material-ui@^1.0.0-beta.30: - version "1.0.0-beta.35" - resolved "https://registry.yarnpkg.com/material-ui/-/material-ui-1.0.0-beta.35.tgz#eeac6be307c0469943c7686e5c6bd4eaa6b1b563" - dependencies: - "@types/jss" "^9.3.0" - "@types/react-transition-group" "^2.0.6" - babel-runtime "^6.26.0" - brcast "^3.0.1" - classnames "^2.2.5" - deepmerge "^2.0.1" - dom-helpers "^3.2.1" - hoist-non-react-statics "^2.3.1" - jss "^9.3.3" - jss-camel-case "^6.0.0" - jss-default-unit "^8.0.2" - jss-global "^3.0.0" - jss-nested "^6.0.1" - jss-props-sort "^6.0.0" - jss-vendor-prefixer "^7.0.0" - keycode "^2.1.9" - lodash "^4.2.0" - normalize-scroll-left "^0.1.2" - prop-types "^15.6.0" - react-event-listener "^0.5.1" - react-jss "^8.1.0" - react-popper "^0.8.0" - react-scrollbar-size "^2.0.2" - react-transition-group "^2.2.1" - recompose "^0.26.0" - scroll "^2.0.3" - warning "^3.0.0" - -math-expression-evaluator@^1.2.14: - version "1.2.17" - resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" - -md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -md5@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" - dependencies: - charenc "~0.0.1" - crypt "~0.0.1" - is-buffer "~1.1.1" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - dependencies: - mimic-fn "^1.0.0" - -memory-fs@^0.4.0, memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - -micromatch@^2.3.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -micromatch@^3.1.4: - version "3.1.9" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.9.tgz#15dc93175ae39e52e93087847096effc73efcf89" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -"mime-db@>= 1.33.0 < 2", mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.7: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - dependencies: - mime-db "~1.33.0" - -mime@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - -mime@^1.2.11, mime@^1.4.1, mime@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - -mimic-response@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - dependencies: - dom-walk "^0.1.0" - -minimalistic-assert@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - -minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@0.5, mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -multicast-dns-service-types@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - -multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - -nan@^2.3.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.9.2.tgz#f564d75f5f8f36a6d9456cca7a6c4fe488ab7866" - -nanomatch@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-odd "^2.0.0" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natives@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.1.tgz#011acce1f7cbd87f7ba6b3093d6cd9392be1c574" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - -negotiator@0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - -neo-async@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.0.tgz#76b1c823130cca26acfbaccc8fbaf0a2fa33b18f" - -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-forge@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.1.tgz#9da611ea08982f4b94206b3beb4cc9665f20c300" - -node-libs-browser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.0" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" - -node-pre-gyp@^0.6.39: - version "0.6.39" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" - dependencies: - detect-libc "^1.0.2" - hawk "3.1.3" - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.1, normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - -normalize-scroll-left@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz#6b79691ba79eb5fb107fa5edfbdc06b55caee2aa" - -normalize-url@^1.4.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c" - dependencies: - object-assign "^4.0.1" - prepend-http "^1.0.0" - query-string "^4.1.0" - sort-keys "^1.0.0" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - dependencies: - path-key "^2.0.0" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-hash@^1.1.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.2.0.tgz#e96af0e96981996a1d47f88ead8f74f1ebc4422b" - -object-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - dependencies: - isobject "^3.0.0" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - dependencies: - isobject "^3.0.1" - -obuf@^1.0.0, obuf@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" - -once@^1.3.0, once@^1.3.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - dependencies: - mimic-fn "^1.0.0" - -opn@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225" - dependencies: - is-wsl "^1.1.0" - -optionator@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.4" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - wordwrap "~1.0.0" - -original@>=0.0.5: - version "1.0.0" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" - dependencies: - url-parse "1.0.x" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - dependencies: - lcid "^1.0.0" - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -"over@>= 0.0.5 < 1": - version "0.0.5" - resolved "https://registry.yarnpkg.com/over/-/over-0.0.5.tgz#f29852e70fd7e25f360e013a8ec44c82aedb5708" - -p-cancelable@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - -p-limit@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" - dependencies: - p-try "^1.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - dependencies: - p-limit "^1.1.0" - -p-map@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" - -p-timeout@^1.1.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-1.2.1.tgz#5eb3b353b7fce99f101a1038880bb054ebbea386" - dependencies: - p-finally "^1.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - -pako@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" - -parse-asn1@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - -parseurl@~1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1, path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-key@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - dependencies: - pify "^2.0.0" - -path@^0.12.7: - version "0.12.7" - resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" - dependencies: - process "^0.11.1" - util "^0.10.3" - -pbkdf2@^3.0.3: - version "3.0.14" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - dependencies: - find-up "^1.0.0" - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - dependencies: - find-up "^2.1.0" - -pluralize@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" - -popper.js@^1.12.9: - version "1.12.9" - resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.12.9.tgz#0dfbc2dff96c451bb332edcfcfaaf566d331d5b3" - -portfinder@^1.0.9: - version "1.0.13" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" - dependencies: - async "^1.5.2" - debug "^2.2.0" - mkdirp "0.5.x" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - -postcss-calc@^5.2.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e" - dependencies: - postcss "^5.0.2" - postcss-message-helpers "^2.0.0" - reduce-css-calc "^1.2.6" - -postcss-colormin@^2.1.8: - version "2.2.2" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b" - dependencies: - colormin "^1.0.5" - postcss "^5.0.13" - postcss-value-parser "^3.2.3" - -postcss-convert-values@^2.3.4: - version "2.6.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d" - dependencies: - postcss "^5.0.11" - postcss-value-parser "^3.1.2" - -postcss-discard-comments@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d" - dependencies: - postcss "^5.0.14" - -postcss-discard-duplicates@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932" - dependencies: - postcss "^5.0.4" - -postcss-discard-empty@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5" - dependencies: - postcss "^5.0.14" - -postcss-discard-overridden@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58" - dependencies: - postcss "^5.0.16" - -postcss-discard-unused@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433" - dependencies: - postcss "^5.0.14" - uniqs "^2.0.0" - -postcss-filter-plugins@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz#6d85862534d735ac420e4a85806e1f5d4286d84c" - dependencies: - postcss "^5.0.4" - uniqid "^4.0.0" - -postcss-merge-idents@^2.1.5: - version "2.1.7" - resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270" - dependencies: - has "^1.0.1" - postcss "^5.0.10" - postcss-value-parser "^3.1.1" - -postcss-merge-longhand@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658" - dependencies: - postcss "^5.0.4" - -postcss-merge-rules@^2.0.3: - version "2.1.2" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721" - dependencies: - browserslist "^1.5.2" - caniuse-api "^1.5.2" - postcss "^5.0.4" - postcss-selector-parser "^2.2.2" - vendors "^1.0.0" - -postcss-message-helpers@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e" - -postcss-minify-font-values@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69" - dependencies: - object-assign "^4.0.1" - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-minify-gradients@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1" - dependencies: - postcss "^5.0.12" - postcss-value-parser "^3.3.0" - -postcss-minify-params@^1.0.4: - version "1.2.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3" - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.2" - postcss-value-parser "^3.0.2" - uniqs "^2.0.0" - -postcss-minify-selectors@^2.0.4: - version "2.1.1" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf" - dependencies: - alphanum-sort "^1.0.2" - has "^1.0.1" - postcss "^5.0.14" - postcss-selector-parser "^2.0.0" - -postcss-modules-extract-imports@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz#66140ecece38ef06bf0d3e355d69bf59d141ea85" - dependencies: - postcss "^6.0.1" - -postcss-modules-local-by-default@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - -postcss-modules-scope@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - -postcss-modules-values@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" - dependencies: - icss-replace-symbols "^1.1.0" - postcss "^6.0.1" - -postcss-normalize-charset@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1" - dependencies: - postcss "^5.0.5" - -postcss-normalize-url@^3.0.7: - version "3.0.8" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222" - dependencies: - is-absolute-url "^2.0.0" - normalize-url "^1.4.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - -postcss-ordered-values@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d" - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.1" - -postcss-reduce-idents@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3" - dependencies: - postcss "^5.0.4" - postcss-value-parser "^3.0.2" - -postcss-reduce-initial@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea" - dependencies: - postcss "^5.0.4" - -postcss-reduce-transforms@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1" - dependencies: - has "^1.0.1" - postcss "^5.0.8" - postcss-value-parser "^3.0.1" - -postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90" - dependencies: - flatten "^1.0.2" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-svgo@^2.1.1: - version "2.1.6" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d" - dependencies: - is-svg "^2.0.0" - postcss "^5.0.14" - postcss-value-parser "^3.2.3" - svgo "^0.7.0" - -postcss-unique-selectors@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d" - dependencies: - alphanum-sort "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" - -postcss-zindex@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22" - dependencies: - has "^1.0.1" - postcss "^5.0.4" - uniqs "^2.0.0" - -postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16: - version "5.2.18" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5" - dependencies: - chalk "^1.1.3" - js-base64 "^2.1.9" - source-map "^0.5.6" - supports-color "^3.2.3" - -postcss@^6.0.1: - version "6.0.19" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.19.tgz#76a78386f670b9d9494a655bf23ac012effd1555" - dependencies: - chalk "^2.3.1" - source-map "^0.6.1" - supports-color "^5.2.0" - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - -prepend-http@^1.0.0, prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -private@^0.1.6, private@^0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - -process@^0.11.1, process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - -process@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - -progress@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - dependencies: - asap "~2.0.3" - -prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0: - version "15.6.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.1.tgz#36644453564255ddda391191fb3a125cbdf654ca" - dependencies: - fbjs "^0.8.16" - loose-envify "^1.3.1" - object-assign "^4.1.1" - -proxy-addr@~2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.6.0" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -public-encrypt@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - -"pullstream@>= 0.4.1 < 1": - version "0.4.1" - resolved "https://registry.yarnpkg.com/pullstream/-/pullstream-0.4.1.tgz#d6fb3bf5aed697e831150eb1002c25a3f8ae1314" - dependencies: - over ">= 0.0.5 < 1" - readable-stream "~1.0.31" - setimmediate ">= 1.0.2 < 2" - slice-stream ">= 1.0.0 < 2" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - -punycode@^1.2.4, punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -q@^1.1.2: - version "1.5.1" - resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - -qs@6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" - -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - -query-string@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" - dependencies: - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - -querystringify@0.0.x: - version "0.0.4" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" - -querystringify@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" - -raf@^3.2.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575" - dependencies: - performance-now "^2.1.0" - -rafl@~1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/rafl/-/rafl-1.2.2.tgz#fe930f758211020d47e38815f5196a8be4150740" - dependencies: - global "~4.3.0" - -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@^1.0.3, range-parser@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - -raw-body@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" - dependencies: - bytes "3.0.0" - http-errors "1.6.2" - iconv-lite "0.4.19" - unpipe "1.0.0" - -rc@^1.1.7: - version "1.2.5" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-dom@^16.2.0: - version "16.4.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.4.0.tgz#099f067dd5827ce36a29eaf9a6cdc7cbf6216b1e" - dependencies: - fbjs "^0.8.16" - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.0" - -react-event-listener@^0.5.1: - version "0.5.3" - resolved "https://registry.yarnpkg.com/react-event-listener/-/react-event-listener-0.5.3.tgz#a8b492596ad601865314fcc2c18cb87b6ce3876e" - dependencies: - babel-runtime "^6.26.0" - fbjs "^0.8.16" - prop-types "^15.6.0" - warning "^3.0.0" - -react-fa@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/react-fa/-/react-fa-5.0.0.tgz#d571732856c6cb2c155c46daef018ba67a75b973" - dependencies: - font-awesome "^4.3.0" - prop-types "^15.5.8" - -react-jss@^8.1.0: - version "8.3.3" - resolved "https://registry.yarnpkg.com/react-jss/-/react-jss-8.3.3.tgz#677a57569d3e4f5099fcdeafeddd8d2c62ab5977" - dependencies: - hoist-non-react-statics "^2.3.1" - jss "^9.3.2" - jss-preset-default "^4.3.0" - prop-types "^15.6.0" - theming "^1.3.0" - -react-popper@^0.8.0: - version "0.8.2" - resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-0.8.2.tgz#092095ff13933211d3856d9f325511ec3a42f12c" - dependencies: - popper.js "^1.12.9" - prop-types "^15.6.0" - -react-resize-detector@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/react-resize-detector/-/react-resize-detector-1.1.0.tgz#4a9831fa3caad32230478dd0185cbd2aa91a5ebf" - dependencies: - prop-types "^15.5.10" - -react-scrollbar-size@^2.0.2: - version "2.1.0" - resolved "https://registry.yarnpkg.com/react-scrollbar-size/-/react-scrollbar-size-2.1.0.tgz#105e797135cab92b1f9e16f00071db7f29f80754" - dependencies: - babel-runtime "^6.26.0" - prop-types "^15.6.0" - react-event-listener "^0.5.1" - stifle "^1.0.2" - -react-smooth@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/react-smooth/-/react-smooth-1.0.0.tgz#b29dbebddddb06d21b5b08962167fb9eac1897d8" - dependencies: - lodash "~4.17.4" - prop-types "^15.6.0" - raf "^3.2.0" - react-transition-group "^2.2.1" - -react-transition-group@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.2.1.tgz#e9fb677b79e6455fd391b03823afe84849df4a10" - dependencies: - chain-function "^1.0.0" - classnames "^2.2.5" - dom-helpers "^3.2.0" - loose-envify "^1.3.1" - prop-types "^15.5.8" - warning "^3.0.0" - -react@^16.2.0: - version "16.4.0" - resolved "https://registry.yarnpkg.com/react/-/react-16.4.0.tgz#402c2db83335336fba1962c08b98c6272617d585" - dependencies: - fbjs "^0.8.16" - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.0" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -readable-stream@^2.2.9: - version "2.3.5" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -readable-stream@~1.0.0, readable-stream@~1.0.31: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - -recharts-scale@0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/recharts-scale/-/recharts-scale-0.3.2.tgz#dac7621714a4765d152cb2adbc30c73b831208c9" - -recharts@^1.0.0-beta.9: - version "1.0.0-beta.10" - resolved "https://registry.yarnpkg.com/recharts/-/recharts-1.0.0-beta.10.tgz#d3cd15df6b7879d5968da3c942b5fcdaf2504fe1" - dependencies: - classnames "2.2.5" - core-js "2.5.1" - d3-interpolate "^1.1.5" - d3-scale "1.0.6" - d3-shape "1.2.0" - lodash "~4.17.4" - prop-types "^15.6.0" - react-resize-detector "1.1.0" - react-smooth "1.0.0" - recharts-scale "0.3.2" - reduce-css-calc "1.3.0" - -recompose@^0.26.0: - version "0.26.0" - resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.26.0.tgz#9babff039cb72ba5bd17366d55d7232fbdfb2d30" - dependencies: - change-emitter "^0.1.2" - fbjs "^0.8.1" - hoist-non-react-statics "^2.3.1" - symbol-observable "^1.0.4" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -reduce-css-calc@1.3.0, reduce-css-calc@^1.2.6: - version "1.3.0" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" - dependencies: - balanced-match "^0.4.2" - math-expression-evaluator "^1.2.14" - reduce-function-call "^1.0.1" - -reduce-function-call@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99" - dependencies: - balanced-match "^0.4.2" - -regenerate@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" - -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" - private "^0.1.6" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - dependencies: - is-equal-shallow "^0.1.3" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexpu-core@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - dependencies: - jsesc "~0.5.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -request@2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - -require-uncached@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - -requires-port@1.0.x, requires-port@1.x.x, requires-port@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - dependencies: - resolve-from "^3.0.0" - -resolve-from@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - -resolve@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" - dependencies: - path-parse "^1.0.5" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - dependencies: - align-text "^0.1.1" - -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" - dependencies: - hash-base "^2.0.0" - inherits "^2.0.1" - -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - dependencies: - is-promise "^2.1.0" - -rx-lite-aggregates@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" - dependencies: - rx-lite "*" - -rx-lite@*, rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" - -safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - -sax@~1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - -schema-utils@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" - dependencies: - ajv "^5.0.0" - -schema-utils@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - -scroll@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/scroll/-/scroll-2.0.3.tgz#0951b785544205fd17753bc3d294738ba16fc2ab" - dependencies: - rafl "~1.2.1" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - -selfsigned@^1.9.1: - version "1.10.2" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.2.tgz#b4449580d99929b65b10a48389301a6592088758" - dependencies: - node-forge "0.7.1" - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - -send@0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" - dependencies: - debug "2.6.9" - depd "~1.1.1" - destroy "~1.0.4" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.6.2" - mime "1.4.1" - ms "2.0.0" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.3.1" - -serve-index@^1.7.2: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" - dependencies: - encodeurl "~1.0.1" - escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.16.1" - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-getter@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" - dependencies: - to-object-path "^0.3.0" - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -"setimmediate@>= 1.0.1 < 2", "setimmediate@>= 1.0.2 < 2", setimmediate@^1.0.4, setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.10" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.10.tgz#b1fde5cd7d11a5626638a07c604ab909cfa31f9b" - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - -slice-ansi@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" - dependencies: - is-fullwidth-code-point "^2.0.0" - -"slice-stream@>= 1.0.0 < 2": - version "1.0.0" - resolved "https://registry.yarnpkg.com/slice-stream/-/slice-stream-1.0.0.tgz#5b33bd66f013b1a7f86460b03d463dec39ad3ea0" - dependencies: - readable-stream "~1.0.31" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^2.0.0" - -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - -sockjs-client@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" - dependencies: - debug "^2.6.6" - eventsource "0.1.6" - faye-websocket "~0.11.0" - inherits "^2.0.1" - json3 "^3.3.2" - url-parse "^1.1.8" - -sockjs@0.3.19: - version "0.3.19" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" - dependencies: - faye-websocket "^0.10.0" - uuid "^3.0.1" - -sort-keys@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" - dependencies: - is-plain-obj "^1.0.0" - -source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" - -source-map-resolve@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" - dependencies: - atob "^2.0.0" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - dependencies: - source-map "^0.5.6" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - -source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - -source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - -spdx-correct@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" - -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" - -spdy-transport@^2.0.18: - version "2.0.20" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d" - dependencies: - debug "^2.6.8" - detect-node "^2.0.3" - hpack.js "^2.1.6" - obuf "^1.1.1" - readable-stream "^2.2.9" - safe-buffer "^5.0.1" - wbuf "^1.7.2" - -spdy@^3.4.1: - version "3.4.7" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" - dependencies: - debug "^2.6.8" - handle-thing "^1.2.5" - http-deceiver "^1.2.7" - safe-buffer "^5.0.1" - select-hose "^2.0.0" - spdy-transport "^2.0.18" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - dependencies: - extend-shallow "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"statuses@>= 1.3.1 < 2": - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - -statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - -stifle@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/stifle/-/stifle-1.0.4.tgz#8b3bcdf52419b0a9c79e35adadce50123c1d8e99" - -stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-http@^2.7.2: - version "2.8.0" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10" - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.3" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@^1.0.0, string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - dependencies: - safe-buffer "~5.1.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - -style-loader@^0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.19.1.tgz#591ffc80bcefe268b77c5d9ebc0505d772619f85" - dependencies: - loader-utils "^1.0.2" - schema-utils "^0.3.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -supports-color@^3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - dependencies: - has-flag "^1.0.0" - -supports-color@^4.2.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - dependencies: - has-flag "^2.0.0" - -supports-color@^5.1.0, supports-color@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" - dependencies: - has-flag "^3.0.0" - -supports-color@^5.3.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - dependencies: - has-flag "^3.0.0" - -svgo@^0.7.0: - version "0.7.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" - dependencies: - coa "~1.0.1" - colors "~1.1.2" - csso "~2.3.1" - js-yaml "~3.7.0" - mkdirp "~0.5.1" - sax "~1.2.1" - whet.extend "~0.9.9" - -symbol-observable@^1.0.4, symbol-observable@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - -table@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" - dependencies: - ajv "^5.2.3" - ajv-keywords "^2.1.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" - -table@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc" - dependencies: - ajv "^6.0.1" - ajv-keywords "^3.0.0" - chalk "^2.1.0" - lodash "^4.17.4" - slice-ansi "1.0.0" - string-width "^2.1.1" - -tapable@^0.2.7: - version "0.2.8" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" - -tar-pack@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" - dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - -tar@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - -text-table@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - -theming@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/theming/-/theming-1.3.0.tgz#286d5bae80be890d0adc645e5ca0498723725bdc" - dependencies: - brcast "^3.0.1" - is-function "^1.0.1" - is-plain-object "^2.0.1" - prop-types "^15.5.8" - -through@^2.3.6, through@^2.3.8: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -thunky@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371" - -time-stamp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.0.0.tgz#95c6a44530e15ba8d6f4a3ecb8c3a3fac46da357" - -timed-out@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - -timers-browserify@^2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.6.tgz#241e76927d9ca05f4d959819022f5b3664b64bae" - dependencies: - setimmediate "^1.0.4" - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - dependencies: - os-tmpdir "~1.0.2" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tough-cookie@~2.3.0: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" - dependencies: - punycode "^1.4.1" - -"traverse@>=0.3.0 <0.4": - version "0.3.9" - resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - dependencies: - prelude-ls "~1.1.2" - -type-is@~1.6.15: - version "1.6.16" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" - dependencies: - media-typer "0.3.0" - mime-types "~2.1.18" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - -ua-parser-js@^0.7.9: - version "0.7.18" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" - -uglify-js@^2.8.29: - version "2.8.29" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - -uglifyjs-webpack-plugin@^0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309" - dependencies: - source-map "^0.5.6" - uglify-js "^2.8.29" - webpack-sources "^1.0.1" - -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - -uniq@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" - -uniqid@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/uniqid/-/uniqid-4.1.1.tgz#89220ddf6b751ae52b5f72484863528596bb84c1" - dependencies: - macaddress "^0.2.8" - -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - -universalify@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -unzip@^0.1.11: - version "0.1.11" - resolved "https://registry.yarnpkg.com/unzip/-/unzip-0.1.11.tgz#89749c63b058d7d90d619f86b98aa1535d3b97f0" - dependencies: - binary ">= 0.3.0 < 1" - fstream ">= 0.1.30 < 1" - match-stream ">= 0.0.2 < 1" - pullstream ">= 0.4.1 < 1" - readable-stream "~1.0.31" - setimmediate ">= 1.0.1 < 2" - -upath@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - -url-loader@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7" - dependencies: - loader-utils "^1.0.2" - mime "^1.4.1" - schema-utils "^0.3.0" - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - dependencies: - prepend-http "^1.0.1" - -url-parse@1.0.x: - version "1.0.5" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" - dependencies: - querystringify "0.0.x" - requires-port "1.0.x" - -url-parse@^1.1.8: - version "1.2.0" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.2.0.tgz#3a19e8aaa6d023ddd27dcc44cb4fc8f7fec23986" - dependencies: - querystringify "~1.0.0" - requires-port "~1.0.0" - -url-to-options@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9" - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" - dependencies: - define-property "^0.2.5" - isobject "^3.0.0" - lazy-cache "^2.0.2" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -util@0.10.3, util@^0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - -uuid@^3.0.0, uuid@^3.0.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" - -validate-npm-package-license@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - -vendors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.1.tgz#37ad73c8ee417fb3d580e785312307d274847f22" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - dependencies: - indexof "0.0.1" - -warning@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c" - dependencies: - loose-envify "^1.0.0" - -watchpack@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.5.0.tgz#231e783af830a22f8966f65c4c4bacc814072eed" - dependencies: - chokidar "^2.0.2" - graceful-fs "^4.1.2" - neo-async "^2.5.0" - -wbuf@^1.1.0, wbuf@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" - dependencies: - minimalistic-assert "^1.0.0" - -webpack-dev-middleware@1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e" - dependencies: - memory-fs "~0.4.1" - mime "^1.5.0" - path-is-absolute "^1.0.0" - range-parser "^1.0.3" - time-stamp "^2.0.0" - -webpack-dev-server@^2.11.1: - version "2.11.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.11.2.tgz#1f4f4c78bf1895378f376815910812daf79a216f" - dependencies: - ansi-html "0.0.7" - array-includes "^3.0.3" - bonjour "^3.5.0" - chokidar "^2.0.0" - compression "^1.5.2" - connect-history-api-fallback "^1.3.0" - debug "^3.1.0" - del "^3.0.0" - express "^4.16.2" - html-entities "^1.2.0" - http-proxy-middleware "~0.17.4" - import-local "^1.0.0" - internal-ip "1.2.0" - ip "^1.1.5" - killable "^1.0.0" - loglevel "^1.4.1" - opn "^5.1.0" - portfinder "^1.0.9" - selfsigned "^1.9.1" - serve-index "^1.7.2" - sockjs "0.3.19" - sockjs-client "1.1.4" - spdy "^3.4.1" - strip-ansi "^3.0.0" - supports-color "^5.1.0" - webpack-dev-middleware "1.12.2" - yargs "6.6.0" - -webpack-sources@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@^3.10.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.11.0.tgz#77da451b1d7b4b117adaf41a1a93b5742f24d894" - dependencies: - acorn "^5.0.0" - acorn-dynamic-import "^2.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - async "^2.1.2" - enhanced-resolve "^3.4.0" - escope "^3.6.0" - interpret "^1.0.0" - json-loader "^0.5.4" - json5 "^0.5.1" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - mkdirp "~0.5.0" - node-libs-browser "^2.0.0" - source-map "^0.5.3" - supports-color "^4.2.1" - tapable "^0.2.7" - uglifyjs-webpack-plugin "^0.4.6" - watchpack "^1.4.0" - webpack-sources "^1.0.1" - yargs "^8.0.2" - -websocket-driver@>=0.5.1: - version "0.7.0" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" - dependencies: - http-parser-js ">=0.4.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - -whatwg-fetch@>=0.10.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" - -whet.extend@~0.9.9: - version "0.9.9" - resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" - -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - -which@^1.2.9, which@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" - dependencies: - string-width "^1.0.2" - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - -wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - dependencies: - mkdirp "^0.5.1" - -xtend@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" - -yargs-parser@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" - dependencies: - camelcase "^3.0.0" - -yargs-parser@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - dependencies: - camelcase "^4.1.0" - -yargs@6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^4.2.0" - -yargs@^4.2.0: - version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - lodash.assign "^4.0.3" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.1" - which-module "^1.0.0" - window-size "^0.2.0" - y18n "^3.2.1" - yargs-parser "^2.4.1" - -yargs@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" - dependencies: - camelcase "^4.1.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - read-pkg-up "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^7.0.0" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" diff --git a/dashboard/config.go b/dashboard/config.go deleted file mode 100644 index c260ed4f0e64..000000000000 --- a/dashboard/config.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package dashboard - -import "time" - -// DefaultConfig contains default settings for the dashboard. -var DefaultConfig = Config{ - Host: "localhost", - Port: 8080, - Refresh: 5 * 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"` -} diff --git a/dashboard/cpu.go b/dashboard/cpu.go deleted file mode 100644 index b91955f4823a..000000000000 --- a/dashboard/cpu.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2018 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 . - -// +build !windows - -package dashboard - -import ( - "syscall" - - "github.com/nebulaai/nbai-node/log" -) - -// getProcessCPUTime retrieves the process' CPU time since program startup. -func getProcessCPUTime() float64 { - var usage syscall.Rusage - if err := syscall.Getrusage(syscall.RUSAGE_SELF, &usage); err != nil { - log.Warn("Failed to retrieve CPU time", "err", err) - return 0 - } - return float64(usage.Utime.Sec+usage.Stime.Sec) + float64(usage.Utime.Usec+usage.Stime.Usec)/1000000 -} diff --git a/dashboard/dashboard.go b/dashboard/dashboard.go deleted file mode 100644 index ac6070ee1b98..000000000000 --- a/dashboard/dashboard.go +++ /dev/null @@ -1,403 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package dashboard - -//go:generate yarn --cwd ./assets install -//go:generate yarn --cwd ./assets build -//go:generate go-bindata -nometadata -o assets.go -prefix assets -nocompress -pkg dashboard assets/index.html assets/bundle.js -//go:generate sh -c "sed 's#var _bundleJs#//nolint:misspell\\\n&#' assets.go > assets.go.tmp && mv assets.go.tmp assets.go" -//go:generate sh -c "sed 's#var _indexHtml#//nolint:misspell\\\n&#' assets.go > assets.go.tmp && mv assets.go.tmp assets.go" -//go:generate gofmt -w -s assets.go - -import ( - "fmt" - "net" - "net/http" - "runtime" - "sync" - "sync/atomic" - "time" - - "io" - - "github.com/elastic/gosigar" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rpc" - "github.com/mohae/deepcopy" - "golang.org/x/net/websocket" -) - -const ( - activeMemorySampleLimit = 200 // Maximum number of active memory data samples - virtualMemorySampleLimit = 200 // Maximum number of virtual memory data samples - networkIngressSampleLimit = 200 // Maximum number of network ingress data samples - networkEgressSampleLimit = 200 // Maximum number of network egress data samples - processCPUSampleLimit = 200 // Maximum number of process cpu data samples - systemCPUSampleLimit = 200 // Maximum number of system cpu data samples - diskReadSampleLimit = 200 // Maximum number of disk read data samples - diskWriteSampleLimit = 200 // Maximum number of disk write 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 - history *Message - lock sync.RWMutex // Lock protecting the dashboard's internals - - logdir string - - quit chan chan error // Channel used for graceful exit - wg sync.WaitGroup -} - -// 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 -} - -// New creates a new dashboard instance with the given configuration. -func New(config *Config, commit string, logdir string) *Dashboard { - now := time.Now() - versionMeta := "" - if len(params.VersionMeta) > 0 { - versionMeta = fmt.Sprintf(" (%s)", params.VersionMeta) - } - return &Dashboard{ - conns: make(map[uint32]*client), - config: config, - quit: make(chan chan error), - history: &Message{ - General: &GeneralMessage{ - Commit: commit, - Version: fmt.Sprintf("v%d.%d.%d%s", params.VersionMajor, params.VersionMinor, params.VersionPatch, versionMeta), - }, - System: &SystemMessage{ - ActiveMemory: emptyChartEntries(now, activeMemorySampleLimit, config.Refresh), - VirtualMemory: emptyChartEntries(now, virtualMemorySampleLimit, config.Refresh), - NetworkIngress: emptyChartEntries(now, networkIngressSampleLimit, config.Refresh), - NetworkEgress: emptyChartEntries(now, networkEgressSampleLimit, config.Refresh), - ProcessCPU: emptyChartEntries(now, processCPUSampleLimit, config.Refresh), - SystemCPU: emptyChartEntries(now, systemCPUSampleLimit, config.Refresh), - DiskRead: emptyChartEntries(now, diskReadSampleLimit, config.Refresh), - DiskWrite: emptyChartEntries(now, diskWriteSampleLimit, config.Refresh), - }, - }, - logdir: logdir, - } -} - -// emptyChartEntries returns a ChartEntry array containing limit number of empty samples. -func emptyChartEntries(t time.Time, limit int, refresh time.Duration) ChartEntries { - ce := make(ChartEntries, limit) - for i := 0; i < limit; i++ { - ce[i] = &ChartEntry{ - Time: t.Add(-time.Duration(i) * refresh), - } - } - return ce -} - -// Protocols implements the node.Service interface. -func (db *Dashboard) Protocols() []p2p.Protocol { return nil } - -// APIs implements the node.Service interface. -func (db *Dashboard) APIs() []rpc.API { return nil } - -// Start starts the data collection thread and the listening server of the dashboard. -// Implements the node.Service interface. -func (db *Dashboard) Start(server *p2p.Server) error { - log.Info("Starting dashboard") - - db.wg.Add(2) - go db.collectData() - go db.streamLogs() - - 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 stops the data collection thread and the connection listener of the dashboard. -// Implements the node.Service interface. -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 = "/index.html" - } - blob, err := Asset(path[1:]) - 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{}) - - // 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 - } - } - } - }() - - db.lock.Lock() - // Send the past data. - client.msg <- deepcopy.Copy(db.history).(*Message) - // Start tracking the connection and drop at connection loss. - db.conns[id] = client - db.lock.Unlock() - defer func() { - db.lock.Lock() - delete(db.conns, id) - db.lock.Unlock() - }() - for { - r := new(Request) - if err := websocket.JSON.Receive(conn, r); err != nil { - if err != io.EOF { - client.logger.Warn("Failed to receive request", "err", err) - } - close(done) - return - } - if r.Logs != nil { - db.handleLogRequest(r.Logs, client) - } - } -} - -// meterCollector returns a function, which retrieves a specific meter. -func meterCollector(name string) func() int64 { - if metric := metrics.DefaultRegistry.Get(name); metric != nil { - m := metric.(metrics.Meter) - return func() int64 { - return m.Count() - } - } - return func() int64 { - return 0 - } -} - -// collectData collects the required data to plot on the dashboard. -func (db *Dashboard) collectData() { - defer db.wg.Done() - - systemCPUUsage := gosigar.Cpu{} - systemCPUUsage.Get() - var ( - mem runtime.MemStats - - collectNetworkIngress = meterCollector("p2p/InboundTraffic") - collectNetworkEgress = meterCollector("p2p/OutboundTraffic") - collectDiskRead = meterCollector("eth/db/chaindata/disk/read") - collectDiskWrite = meterCollector("eth/db/chaindata/disk/write") - - prevNetworkIngress = collectNetworkIngress() - prevNetworkEgress = collectNetworkEgress() - prevProcessCPUTime = getProcessCPUTime() - prevSystemCPUUsage = systemCPUUsage - prevDiskRead = collectDiskRead() - prevDiskWrite = collectDiskWrite() - - frequency = float64(db.config.Refresh / time.Second) - numCPU = float64(runtime.NumCPU()) - ) - - for { - select { - case errc := <-db.quit: - errc <- nil - return - case <-time.After(db.config.Refresh): - systemCPUUsage.Get() - var ( - curNetworkIngress = collectNetworkIngress() - curNetworkEgress = collectNetworkEgress() - curProcessCPUTime = getProcessCPUTime() - curSystemCPUUsage = systemCPUUsage - curDiskRead = collectDiskRead() - curDiskWrite = collectDiskWrite() - - deltaNetworkIngress = float64(curNetworkIngress - prevNetworkIngress) - deltaNetworkEgress = float64(curNetworkEgress - prevNetworkEgress) - deltaProcessCPUTime = curProcessCPUTime - prevProcessCPUTime - deltaSystemCPUUsage = curSystemCPUUsage.Delta(prevSystemCPUUsage) - deltaDiskRead = curDiskRead - prevDiskRead - deltaDiskWrite = curDiskWrite - prevDiskWrite - ) - prevNetworkIngress = curNetworkIngress - prevNetworkEgress = curNetworkEgress - prevProcessCPUTime = curProcessCPUTime - prevSystemCPUUsage = curSystemCPUUsage - prevDiskRead = curDiskRead - prevDiskWrite = curDiskWrite - - now := time.Now() - - runtime.ReadMemStats(&mem) - activeMemory := &ChartEntry{ - Time: now, - Value: float64(mem.Alloc) / frequency, - } - virtualMemory := &ChartEntry{ - Time: now, - Value: float64(mem.Sys) / frequency, - } - networkIngress := &ChartEntry{ - Time: now, - Value: deltaNetworkIngress / frequency, - } - networkEgress := &ChartEntry{ - Time: now, - Value: deltaNetworkEgress / frequency, - } - processCPU := &ChartEntry{ - Time: now, - Value: deltaProcessCPUTime / frequency / numCPU * 100, - } - systemCPU := &ChartEntry{ - Time: now, - Value: float64(deltaSystemCPUUsage.Sys+deltaSystemCPUUsage.User) / frequency / numCPU, - } - diskRead := &ChartEntry{ - Time: now, - Value: float64(deltaDiskRead) / frequency, - } - diskWrite := &ChartEntry{ - Time: now, - Value: float64(deltaDiskWrite) / frequency, - } - sys := db.history.System - db.lock.Lock() - sys.ActiveMemory = append(sys.ActiveMemory[1:], activeMemory) - sys.VirtualMemory = append(sys.VirtualMemory[1:], virtualMemory) - sys.NetworkIngress = append(sys.NetworkIngress[1:], networkIngress) - sys.NetworkEgress = append(sys.NetworkEgress[1:], networkEgress) - sys.ProcessCPU = append(sys.ProcessCPU[1:], processCPU) - sys.SystemCPU = append(sys.SystemCPU[1:], systemCPU) - sys.DiskRead = append(sys.DiskRead[1:], diskRead) - sys.DiskWrite = append(sys.DiskWrite[1:], diskWrite) - db.lock.Unlock() - - db.sendToAll(&Message{ - System: &SystemMessage{ - ActiveMemory: ChartEntries{activeMemory}, - VirtualMemory: ChartEntries{virtualMemory}, - NetworkIngress: ChartEntries{networkIngress}, - NetworkEgress: ChartEntries{networkEgress}, - ProcessCPU: ChartEntries{processCPU}, - SystemCPU: ChartEntries{systemCPU}, - DiskRead: ChartEntries{diskRead}, - DiskWrite: ChartEntries{diskWrite}, - }, - }) - } - } -} - -// 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/dashboard/log.go b/dashboard/log.go deleted file mode 100644 index 590f710b2bba..000000000000 --- a/dashboard/log.go +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright 2018 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 ( - "bytes" - "encoding/json" - "io/ioutil" - "os" - "path/filepath" - "regexp" - "sort" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/mohae/deepcopy" - "github.com/rjeczalik/notify" -) - -var emptyChunk = json.RawMessage("[]") - -// prepLogs creates a JSON array from the given log record buffer. -// Returns the prepared array and the position of the last '\n' -// character in the original buffer, or -1 if it doesn't contain any. -func prepLogs(buf []byte) (json.RawMessage, int) { - b := make(json.RawMessage, 1, len(buf)+1) - b[0] = '[' - b = append(b, buf...) - last := -1 - for i := 1; i < len(b); i++ { - if b[i] == '\n' { - b[i] = ',' - last = i - } - } - if last < 0 { - return emptyChunk, -1 - } - b[last] = ']' - return b[:last+1], last - 1 -} - -// handleLogRequest searches for the log file specified by the timestamp of the -// request, creates a JSON array out of it and sends it to the requesting client. -func (db *Dashboard) handleLogRequest(r *LogsRequest, c *client) { - files, err := ioutil.ReadDir(db.logdir) - if err != nil { - log.Warn("Failed to open logdir", "path", db.logdir, "err", err) - return - } - re := regexp.MustCompile(`\.log$`) - fileNames := make([]string, 0, len(files)) - for _, f := range files { - if f.Mode().IsRegular() && re.MatchString(f.Name()) { - fileNames = append(fileNames, f.Name()) - } - } - if len(fileNames) < 1 { - log.Warn("No log files in logdir", "path", db.logdir) - return - } - idx := sort.Search(len(fileNames), func(idx int) bool { - // Returns the smallest index such as fileNames[idx] >= r.Name, - // if there is no such index, returns n. - return fileNames[idx] >= r.Name - }) - - switch { - case idx < 0: - return - case idx == 0 && r.Past: - return - case idx >= len(fileNames): - return - case r.Past: - idx-- - case idx == len(fileNames)-1 && fileNames[idx] == r.Name: - return - case idx == len(fileNames)-1 || (idx == len(fileNames)-2 && fileNames[idx] == r.Name): - // The last file is continuously updated, and its chunks are streamed, - // so in order to avoid log record duplication on the client side, it is - // handled differently. Its actual content is always saved in the history. - db.lock.Lock() - if db.history.Logs != nil { - c.msg <- &Message{ - Logs: db.history.Logs, - } - } - db.lock.Unlock() - return - case fileNames[idx] == r.Name: - idx++ - } - - path := filepath.Join(db.logdir, fileNames[idx]) - var buf []byte - if buf, err = ioutil.ReadFile(path); err != nil { - log.Warn("Failed to read file", "path", path, "err", err) - return - } - chunk, end := prepLogs(buf) - if end < 0 { - log.Warn("The file doesn't contain valid logs", "path", path) - return - } - c.msg <- &Message{ - Logs: &LogsMessage{ - Source: &LogFile{ - Name: fileNames[idx], - Last: r.Past && idx == 0, - }, - Chunk: chunk, - }, - } -} - -// streamLogs watches the file system, and when the logger writes -// the new log records into the files, picks them up, then makes -// JSON array out of them and sends them to the clients. -func (db *Dashboard) streamLogs() { - defer db.wg.Done() - var ( - err error - errc chan error - ) - defer func() { - if errc == nil { - errc = <-db.quit - } - errc <- err - }() - - files, err := ioutil.ReadDir(db.logdir) - if err != nil { - log.Warn("Failed to open logdir", "path", db.logdir, "err", err) - return - } - var ( - opened *os.File // File descriptor for the opened active log file. - buf []byte // Contains the recently written log chunks, which are not sent to the clients yet. - ) - - // The log records are always written into the last file in alphabetical order, because of the timestamp. - re := regexp.MustCompile(`\.log$`) - i := len(files) - 1 - for i >= 0 && (!files[i].Mode().IsRegular() || !re.MatchString(files[i].Name())) { - i-- - } - if i < 0 { - log.Warn("No log files in logdir", "path", db.logdir) - return - } - if opened, err = os.OpenFile(filepath.Join(db.logdir, files[i].Name()), os.O_RDONLY, 0600); err != nil { - log.Warn("Failed to open file", "name", files[i].Name(), "err", err) - return - } - defer opened.Close() // Close the lastly opened file. - fi, err := opened.Stat() - if err != nil { - log.Warn("Problem with file", "name", opened.Name(), "err", err) - return - } - db.lock.Lock() - db.history.Logs = &LogsMessage{ - Source: &LogFile{ - Name: fi.Name(), - Last: true, - }, - Chunk: emptyChunk, - } - db.lock.Unlock() - - watcher := make(chan notify.EventInfo, 10) - if err := notify.Watch(db.logdir, watcher, notify.Create); err != nil { - log.Warn("Failed to create file system watcher", "err", err) - return - } - defer notify.Stop(watcher) - - ticker := time.NewTicker(db.config.Refresh) - defer ticker.Stop() - -loop: - for err == nil || errc == nil { - select { - case event := <-watcher: - // Make sure that new log file was created. - if !re.Match([]byte(event.Path())) { - break - } - if opened == nil { - log.Warn("The last log file is not opened") - break loop - } - // The new log file's name is always greater, - // because it is created using the actual log record's time. - if opened.Name() >= event.Path() { - break - } - // Read the rest of the previously opened file. - chunk, err := ioutil.ReadAll(opened) - if err != nil { - log.Warn("Failed to read file", "name", opened.Name(), "err", err) - break loop - } - buf = append(buf, chunk...) - opened.Close() - - if chunk, last := prepLogs(buf); last >= 0 { - // Send the rest of the previously opened file. - db.sendToAll(&Message{ - Logs: &LogsMessage{ - Chunk: chunk, - }, - }) - } - if opened, err = os.OpenFile(event.Path(), os.O_RDONLY, 0644); err != nil { - log.Warn("Failed to open file", "name", event.Path(), "err", err) - break loop - } - buf = buf[:0] - - // Change the last file in the history. - fi, err := opened.Stat() - if err != nil { - log.Warn("Problem with file", "name", opened.Name(), "err", err) - break loop - } - db.lock.Lock() - db.history.Logs.Source.Name = fi.Name() - db.history.Logs.Chunk = emptyChunk - db.lock.Unlock() - case <-ticker.C: // Send log updates to the client. - if opened == nil { - log.Warn("The last log file is not opened") - break loop - } - // Read the new logs created since the last read. - chunk, err := ioutil.ReadAll(opened) - if err != nil { - log.Warn("Failed to read file", "name", opened.Name(), "err", err) - break loop - } - b := append(buf, chunk...) - - chunk, last := prepLogs(b) - if last < 0 { - break - } - // Only keep the invalid part of the buffer, which can be valid after the next read. - buf = b[last+1:] - - var l *LogsMessage - // Update the history. - db.lock.Lock() - if bytes.Equal(db.history.Logs.Chunk, emptyChunk) { - db.history.Logs.Chunk = chunk - l = deepcopy.Copy(db.history.Logs).(*LogsMessage) - } else { - b = make([]byte, len(db.history.Logs.Chunk)+len(chunk)-1) - copy(b, db.history.Logs.Chunk) - b[len(db.history.Logs.Chunk)-1] = ',' - copy(b[len(db.history.Logs.Chunk):], chunk[1:]) - db.history.Logs.Chunk = b - l = &LogsMessage{Chunk: chunk} - } - db.lock.Unlock() - - db.sendToAll(&Message{Logs: l}) - case errc = <-db.quit: - break loop - } - } -} diff --git a/dashboard/message.go b/dashboard/message.go deleted file mode 100644 index 46856b9e6eed..000000000000 --- a/dashboard/message.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package dashboard - -import ( - "encoding/json" - "time" -) - -type Message struct { - General *GeneralMessage `json:"general,omitempty"` - Home *HomeMessage `json:"home,omitempty"` - Chain *ChainMessage `json:"chain,omitempty"` - TxPool *TxPoolMessage `json:"txpool,omitempty"` - Network *NetworkMessage `json:"network,omitempty"` - System *SystemMessage `json:"system,omitempty"` - Logs *LogsMessage `json:"logs,omitempty"` -} - -type ChartEntries []*ChartEntry - -type ChartEntry struct { - Time time.Time `json:"time,omitempty"` - Value float64 `json:"value,omitempty"` -} - -type GeneralMessage struct { - Version string `json:"version,omitempty"` - Commit string `json:"commit,omitempty"` -} - -type HomeMessage struct { - /* TODO (kurkomisi) */ -} - -type ChainMessage struct { - /* TODO (kurkomisi) */ -} - -type TxPoolMessage struct { - /* TODO (kurkomisi) */ -} - -type NetworkMessage struct { - /* TODO (kurkomisi) */ -} - -type SystemMessage struct { - ActiveMemory ChartEntries `json:"activeMemory,omitempty"` - VirtualMemory ChartEntries `json:"virtualMemory,omitempty"` - NetworkIngress ChartEntries `json:"networkIngress,omitempty"` - NetworkEgress ChartEntries `json:"networkEgress,omitempty"` - ProcessCPU ChartEntries `json:"processCPU,omitempty"` - SystemCPU ChartEntries `json:"systemCPU,omitempty"` - DiskRead ChartEntries `json:"diskRead,omitempty"` - DiskWrite ChartEntries `json:"diskWrite,omitempty"` -} - -// LogsMessage wraps up a log chunk. If Source isn't present, the chunk is a stream chunk. -type LogsMessage struct { - Source *LogFile `json:"source,omitempty"` // Attributes of the log file. - Chunk json.RawMessage `json:"chunk"` // Contains log records. -} - -// LogFile contains the attributes of a log file. -type LogFile struct { - Name string `json:"name"` // The name of the file. - Last bool `json:"last"` // Denotes if the actual log file is the last one in the directory. -} - -// Request represents the client request. -type Request struct { - Logs *LogsRequest `json:"logs,omitempty"` -} - -type LogsRequest struct { - Name string `json:"name"` // The request handler searches for log file based on this file name. - Past bool `json:"past"` // Denotes whether the client wants the previous or the next file. -} diff --git a/docs/audits/2017-04-25_Geth-audit_Truesec.pdf b/docs/audits/2017-04-25_Geth-audit_Truesec.pdf new file mode 100644 index 000000000000..702dc99567f3 Binary files /dev/null and b/docs/audits/2017-04-25_Geth-audit_Truesec.pdf differ diff --git a/docs/audits/2018-09-14_Clef-audit_NCC.pdf b/docs/audits/2018-09-14_Clef-audit_NCC.pdf new file mode 100644 index 000000000000..1a5c66f178af Binary files /dev/null and b/docs/audits/2018-09-14_Clef-audit_NCC.pdf differ diff --git a/eth/api.go b/eth/api.go index 86fe3acc1fde..f8c51c09bd68 100644 --- a/eth/api.go +++ b/eth/api.go @@ -28,17 +28,16 @@ import ( "strings" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/internal/ethapi" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/trie" ) // PublicEthereumAPI provides an API to access Ethereum full node-related @@ -70,7 +69,7 @@ func (api *PublicEthereumAPI) Hashrate() hexutil.Uint64 { // ChainId is the EIP-155 replay-protection chain id for the current ethereum chain config. func (api *PublicEthereumAPI) ChainId() hexutil.Uint64 { chainID := new(big.Int) - if config := api.e.chainConfig; config.IsEIP155(api.e.blockchain.CurrentBlock().Number()) { + if config := api.e.blockchain.Config(); config.IsEIP155(api.e.blockchain.CurrentBlock().Number()) { chainID = config.ChainID } return (hexutil.Uint64)(chainID.Uint64()) @@ -169,6 +168,11 @@ func NewPrivateAdminAPI(eth *Ethereum) *PrivateAdminAPI { // ExportChain exports the current blockchain into a local file. func (api *PrivateAdminAPI) ExportChain(file string) (bool, error) { + if _, err := os.Stat(file); err == nil { + // File already exists. Allowing overwrite could be a DoS vecotor, + // since the 'file' may point to arbitrary paths on the drive + return false, errors.New("location would overwrite an existing file") + } // Make sure we can create the file to export into out, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm) if err != nil { @@ -267,7 +271,7 @@ func (api *PublicDebugAPI) DumpBlock(blockNr rpc.BlockNumber) (state.Dump, error // both the pending block as well as the pending state from // the miner and operate on those _, stateDb := api.eth.miner.Pending() - return stateDb.RawDump(), nil + return stateDb.RawDump(false, false, true), nil } var block *types.Block if blockNr == rpc.LatestBlockNumber { @@ -282,20 +286,19 @@ func (api *PublicDebugAPI) DumpBlock(blockNr rpc.BlockNumber) (state.Dump, error if err != nil { return state.Dump{}, err } - return stateDb.RawDump(), nil + return stateDb.RawDump(false, false, true), nil } // PrivateDebugAPI is the collection of Ethereum full node APIs exposed over // the private debugging endpoint. type PrivateDebugAPI struct { - config *params.ChainConfig - eth *Ethereum + eth *Ethereum } // NewPrivateDebugAPI creates a new API definition for the full node-related // private debug methods of the Ethereum service. -func NewPrivateDebugAPI(config *params.ChainConfig, eth *Ethereum) *PrivateDebugAPI { - return &PrivateDebugAPI{config: config, eth: eth} +func NewPrivateDebugAPI(eth *Ethereum) *PrivateDebugAPI { + return &PrivateDebugAPI{eth: eth} } // Preimage is a debug API function that returns the preimage for a sha3 hash, if known. @@ -336,6 +339,72 @@ func (api *PrivateDebugAPI) GetBadBlocks(ctx context.Context) ([]*BadBlockArgs, return results, nil } +// AccountRangeResult returns a mapping from the hash of an account addresses +// to its preimage. It will return the JSON null if no preimage is found. +// Since a query can return a limited amount of results, a "next" field is +// also present for paging. +type AccountRangeResult struct { + Accounts map[common.Hash]*common.Address `json:"accounts"` + Next common.Hash `json:"next"` +} + +func accountRange(st state.Trie, start *common.Hash, maxResults int) (AccountRangeResult, error) { + if start == nil { + start = &common.Hash{0} + } + it := trie.NewIterator(st.NodeIterator(start.Bytes())) + result := AccountRangeResult{Accounts: make(map[common.Hash]*common.Address), Next: common.Hash{}} + + if maxResults > AccountRangeMaxResults { + maxResults = AccountRangeMaxResults + } + + for i := 0; i < maxResults && it.Next(); i++ { + if preimage := st.GetKey(it.Key); preimage != nil { + addr := &common.Address{} + addr.SetBytes(preimage) + result.Accounts[common.BytesToHash(it.Key)] = addr + } else { + result.Accounts[common.BytesToHash(it.Key)] = nil + } + } + + if it.Next() { + result.Next = common.BytesToHash(it.Key) + } + + return result, nil +} + +// AccountRangeMaxResults is the maximum number of results to be returned per call +const AccountRangeMaxResults = 256 + +// AccountRange enumerates all accounts in the latest state +func (api *PrivateDebugAPI) AccountRange(ctx context.Context, start *common.Hash, maxResults int) (AccountRangeResult, error) { + var statedb *state.StateDB + var err error + block := api.eth.blockchain.CurrentBlock() + + if len(block.Transactions()) == 0 { + statedb, err = api.computeStateDB(block, defaultTraceReexec) + if err != nil { + return AccountRangeResult{}, err + } + } else { + _, _, statedb, err = api.computeTxEnv(block.Hash(), len(block.Transactions())-1, 0) + if err != nil { + return AccountRangeResult{}, err + } + } + + trie, err := statedb.Database().OpenTrie(block.Header().Root) + if err != nil { + return AccountRangeResult{}, err + } + + return accountRange(trie, start, maxResults) +} + // StorageRangeResult is the result of a debug_storageRangeAt API call. type StorageRangeResult struct { Storage storageMap `json:"storage"` @@ -446,11 +515,11 @@ func (api *PrivateDebugAPI) getModifiedAccounts(startBlock, endBlock *types.Bloc } triedb := api.eth.BlockChain().StateCache().TrieDB() - oldTrie, err := trie.NewSecure(startBlock.Root(), triedb, 0) + oldTrie, err := trie.NewSecure(startBlock.Root(), triedb) if err != nil { return nil, err } - newTrie, err := trie.NewSecure(endBlock.Root(), triedb, 0) + newTrie, err := trie.NewSecure(endBlock.Root(), triedb) if err != nil { return nil, err } diff --git a/eth/api_backend.go b/eth/api_backend.go index afbb64b85a7a..4b74ccff519d 100644 --- a/eth/api_backend.go +++ b/eth/api_backend.go @@ -18,33 +18,36 @@ package eth import ( "context" + "errors" "math/big" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/bloombits" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/eth/gasprice" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/eth/gasprice" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" ) // EthAPIBackend implements ethapi.Backend for full nodes type EthAPIBackend struct { - eth *Ethereum - gpo *gasprice.Oracle + extRPCEnabled bool + eth *Ethereum + gpo *gasprice.Oracle } // ChainConfig returns the active chain configuration. func (b *EthAPIBackend) ChainConfig() *params.ChainConfig { - return b.eth.chainConfig + return b.eth.blockchain.Config() } func (b *EthAPIBackend) CurrentBlock() *types.Block { @@ -56,53 +59,115 @@ func (b *EthAPIBackend) SetHead(number uint64) { b.eth.blockchain.SetHead(number) } -func (b *EthAPIBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) { +func (b *EthAPIBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) { // Pending block is only known by the miner - if blockNr == rpc.PendingBlockNumber { + if number == rpc.PendingBlockNumber { block := b.eth.miner.PendingBlock() return block.Header(), nil } // Otherwise resolve and return the block - if blockNr == rpc.LatestBlockNumber { + if number == rpc.LatestBlockNumber { return b.eth.blockchain.CurrentBlock().Header(), nil } - return b.eth.blockchain.GetHeaderByNumber(uint64(blockNr)), nil + return b.eth.blockchain.GetHeaderByNumber(uint64(number)), nil +} + +func (b *EthAPIBackend) HeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Header, error) { + if blockNr, ok := blockNrOrHash.Number(); ok { + return b.HeaderByNumber(ctx, blockNr) + } + if hash, ok := blockNrOrHash.Hash(); ok { + header := b.eth.blockchain.GetHeaderByHash(hash) + if header == nil { + return nil, errors.New("header for hash not found") + } + if blockNrOrHash.RequireCanonical && b.eth.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { + return nil, errors.New("hash is not currently canonical") + } + return header, nil + } + return nil, errors.New("invalid arguments; neither block nor hash specified") } func (b *EthAPIBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { return b.eth.blockchain.GetHeaderByHash(hash), nil } -func (b *EthAPIBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error) { +func (b *EthAPIBackend) BlockByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Block, error) { // Pending block is only known by the miner - if blockNr == rpc.PendingBlockNumber { + if number == rpc.PendingBlockNumber { block := b.eth.miner.PendingBlock() return block, nil } // Otherwise resolve and return the block - if blockNr == rpc.LatestBlockNumber { + if number == rpc.LatestBlockNumber { return b.eth.blockchain.CurrentBlock(), nil } - return b.eth.blockchain.GetBlockByNumber(uint64(blockNr)), nil + return b.eth.blockchain.GetBlockByNumber(uint64(number)), nil +} + +func (b *EthAPIBackend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { + return b.eth.blockchain.GetBlockByHash(hash), nil +} + +func (b *EthAPIBackend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Block, error) { + if blockNr, ok := blockNrOrHash.Number(); ok { + return b.BlockByNumber(ctx, blockNr) + } + if hash, ok := blockNrOrHash.Hash(); ok { + header := b.eth.blockchain.GetHeaderByHash(hash) + if header == nil { + return nil, errors.New("header for hash not found") + } + if blockNrOrHash.RequireCanonical && b.eth.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { + return nil, errors.New("hash is not currently canonical") + } + block := b.eth.blockchain.GetBlock(hash, header.Number.Uint64()) + if block == nil { + return nil, errors.New("header found, but block body is missing") + } + return block, nil + } + return nil, errors.New("invalid arguments; neither block nor hash specified") } -func (b *EthAPIBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*state.StateDB, *types.Header, error) { +func (b *EthAPIBackend) StateAndHeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*state.StateDB, *types.Header, error) { // Pending state is only known by the miner - if blockNr == rpc.PendingBlockNumber { + if number == rpc.PendingBlockNumber { block, state := b.eth.miner.Pending() return state, block.Header(), nil } // Otherwise resolve the block number and return its state - header, err := b.HeaderByNumber(ctx, blockNr) - if header == nil || err != nil { + header, err := b.HeaderByNumber(ctx, number) + if err != nil { return nil, nil, err } + if header == nil { + return nil, nil, errors.New("header not found") + } stateDb, err := b.eth.BlockChain().StateAt(header.Root) return stateDb, header, err } -func (b *EthAPIBackend) GetBlock(ctx context.Context, hash common.Hash) (*types.Block, error) { - return b.eth.blockchain.GetBlockByHash(hash), nil +func (b *EthAPIBackend) StateAndHeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*state.StateDB, *types.Header, error) { + if blockNr, ok := blockNrOrHash.Number(); ok { + return b.StateAndHeaderByNumber(ctx, blockNr) + } + if hash, ok := blockNrOrHash.Hash(); ok { + header, err := b.HeaderByHash(ctx, hash) + if err != nil { + return nil, nil, err + } + if header == nil { + return nil, nil, errors.New("header for hash not found") + } + if blockNrOrHash.RequireCanonical && b.eth.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { + return nil, nil, errors.New("hash is not currently canonical") + } + stateDb, err := b.eth.BlockChain().StateAt(header.Root) + return stateDb, header, err + } + return nil, nil, errors.New("invalid arguments; neither block nor hash specified") } func (b *EthAPIBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) { @@ -130,7 +195,7 @@ func (b *EthAPIBackend) GetEVM(ctx context.Context, msg core.Message, state *sta vmError := func() error { return nil } context := core.NewEVMContext(msg, header, b.eth.BlockChain(), nil) - return vm.NewEVM(context, state, b.eth.chainConfig, *b.eth.blockchain.GetVMConfig()), vmError, nil + return vm.NewEVM(context, state, b.eth.blockchain.Config(), *b.eth.blockchain.GetVMConfig()), vmError, nil } func (b *EthAPIBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription { @@ -173,8 +238,13 @@ func (b *EthAPIBackend) GetPoolTransaction(hash common.Hash) *types.Transaction return b.eth.txPool.Get(hash) } +func (b *EthAPIBackend) GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) { + tx, blockHash, blockNumber, index := rawdb.ReadTransaction(b.eth.ChainDb(), txHash) + return tx, blockHash, blockNumber, index, nil +} + func (b *EthAPIBackend) GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) { - return b.eth.txPool.State().GetNonce(addr), nil + return b.eth.txPool.Nonce(addr), nil } func (b *EthAPIBackend) Stats() (pending int, queued int) { @@ -213,6 +283,14 @@ func (b *EthAPIBackend) AccountManager() *accounts.Manager { return b.eth.AccountManager() } +func (b *EthAPIBackend) ExtRPCEnabled() bool { + return b.extRPCEnabled +} + +func (b *EthAPIBackend) RPCGasCap() *big.Int { + return b.eth.config.RPCGasCap +} + func (b *EthAPIBackend) BloomStatus() (uint64, uint64) { sections, _, _ := b.eth.bloomIndexer.Sections() return params.BloomBitsBlocks, sections diff --git a/eth/api_test.go b/eth/api_test.go index 7257d4bf34f7..1e7c489c3295 100644 --- a/eth/api_test.go +++ b/eth/api_test.go @@ -17,21 +17,178 @@ package eth import ( + "bytes" + "fmt" + "math/big" "reflect" + "sort" "testing" "github.com/davecgh/go-spew/spew" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/ethdb" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/crypto" ) var dumper = spew.ConfigState{Indent: " "} +func accountRangeTest(t *testing.T, trie *state.Trie, statedb *state.StateDB, start *common.Hash, requestedNum int, expectedNum int) AccountRangeResult { + result, err := accountRange(*trie, start, requestedNum) + if err != nil { + t.Fatal(err) + } + + if len(result.Accounts) != expectedNum { + t.Fatalf("expected %d results. Got %d", expectedNum, len(result.Accounts)) + } + + for _, address := range result.Accounts { + if address == nil { + t.Fatalf("null address returned") + } + if !statedb.Exist(*address) { + t.Fatalf("account not found in state %s", address.Hex()) + } + } + + return result +} + +type resultHash []*common.Hash + +func (h resultHash) Len() int { return len(h) } +func (h resultHash) Swap(i, j int) { h[i], h[j] = h[j], h[i] } +func (h resultHash) Less(i, j int) bool { return bytes.Compare(h[i].Bytes(), h[j].Bytes()) < 0 } + +func TestAccountRange(t *testing.T) { + var ( + statedb = state.NewDatabase(rawdb.NewMemoryDatabase()) + state, _ = state.New(common.Hash{}, statedb) + addrs = [AccountRangeMaxResults * 2]common.Address{} + m = map[common.Address]bool{} + ) + + for i := range addrs { + hash := common.HexToHash(fmt.Sprintf("%x", i)) + addr := common.BytesToAddress(crypto.Keccak256Hash(hash.Bytes()).Bytes()) + addrs[i] = addr + state.SetBalance(addrs[i], big.NewInt(1)) + if _, ok := m[addr]; ok { + t.Fatalf("bad") + } else { + m[addr] = true + } + } + + state.Commit(true) + root := state.IntermediateRoot(true) + + trie, err := statedb.OpenTrie(root) + if err != nil { + t.Fatal(err) + } + + t.Logf("test getting number of results less than max") + accountRangeTest(t, &trie, state, &common.Hash{0x0}, AccountRangeMaxResults/2, AccountRangeMaxResults/2) + + t.Logf("test getting number of results greater than max %d", AccountRangeMaxResults) + accountRangeTest(t, &trie, state, &common.Hash{0x0}, AccountRangeMaxResults*2, AccountRangeMaxResults) + + t.Logf("test with empty 'start' hash") + accountRangeTest(t, &trie, state, nil, AccountRangeMaxResults, AccountRangeMaxResults) + + t.Logf("test pagination") + + // test pagination + firstResult := accountRangeTest(t, &trie, state, &common.Hash{0x0}, AccountRangeMaxResults, AccountRangeMaxResults) + + t.Logf("test pagination 2") + secondResult := accountRangeTest(t, &trie, state, &firstResult.Next, AccountRangeMaxResults, AccountRangeMaxResults) + + hList := make(resultHash, 0) + for h1, addr1 := range firstResult.Accounts { + h := &common.Hash{} + h.SetBytes(h1.Bytes()) + hList = append(hList, h) + for h2, addr2 := range secondResult.Accounts { + // Make sure that the hashes aren't the same + if bytes.Equal(h1.Bytes(), h2.Bytes()) { + t.Fatalf("pagination test failed: results should not overlap") + } + + // If either address is nil, then it makes no sense to compare + // them as they might be two different accounts. + if addr1 == nil || addr2 == nil { + continue + } + + // Since the two hashes are different, they should not have + // the same preimage, but let's check anyway in case there + // is a bug in the (hash, addr) map generation code. + if bytes.Equal(addr1.Bytes(), addr2.Bytes()) { + t.Fatalf("pagination test failed: addresses should not repeat") + } + } + } + + // Test to see if it's possible to recover from the middle of the previous + // set and get an even split between the first and second sets. + t.Logf("test random access pagination") + sort.Sort(hList) + middleH := hList[AccountRangeMaxResults/2] + middleResult := accountRangeTest(t, &trie, state, middleH, AccountRangeMaxResults, AccountRangeMaxResults) + innone, infirst, insecond := 0, 0, 0 + for h := range middleResult.Accounts { + if _, ok := firstResult.Accounts[h]; ok { + infirst++ + } else if _, ok := secondResult.Accounts[h]; ok { + insecond++ + } else { + innone++ + } + } + if innone != 0 { + t.Fatalf("%d hashes in the 'middle' set were neither in the first not the second set", innone) + } + if infirst != AccountRangeMaxResults/2 { + t.Fatalf("Imbalance in the number of first-test results: %d != %d", infirst, AccountRangeMaxResults/2) + } + if insecond != AccountRangeMaxResults/2 { + t.Fatalf("Imbalance in the number of second-test results: %d != %d", insecond, AccountRangeMaxResults/2) + } +} + +func TestEmptyAccountRange(t *testing.T) { + var ( + statedb = state.NewDatabase(rawdb.NewMemoryDatabase()) + state, _ = state.New(common.Hash{}, statedb) + ) + + state.Commit(true) + root := state.IntermediateRoot(true) + + trie, err := statedb.OpenTrie(root) + if err != nil { + t.Fatal(err) + } + + results, err := accountRange(trie, &common.Hash{0x0}, AccountRangeMaxResults) + if err != nil { + t.Fatalf("Empty results should not trigger an error: %v", err) + } + if results.Next != common.HexToHash("0") { + t.Fatalf("Empty results should not return a second page") + } + if len(results.Accounts) != 0 { + t.Fatalf("Empty state should not return addresses: %v", results.Accounts) + } +} + func TestStorageRangeAt(t *testing.T) { // Create a state where account 0x010000... has a few storage entries. var ( - state, _ = state.New(common.Hash{}, state.NewDatabase(ethdb.NewMemDatabase())) + state, _ = state.New(common.Hash{}, state.NewDatabase(rawdb.NewMemoryDatabase())) addr = common.Address{0x01} keys = []common.Hash{ // hashes of Keys of storage common.HexToHash("340dd630ad21bf010b4e676dbfa9ba9a02175262d1fa356232cfde6cb5b47ef2"), diff --git a/eth/api_tracer.go b/eth/api_tracer.go index d60bab7f70a7..ce211cbd99ef 100644 --- a/eth/api_tracer.go +++ b/eth/api_tracer.go @@ -28,19 +28,19 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/eth/tracers" - "github.com/nebulaai/nbai-node/internal/ethapi" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/tracers" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" + "github.com/ethereum/go-ethereum/trie" ) const ( @@ -201,7 +201,7 @@ func (api *PrivateDebugAPI) traceChain(ctx context.Context, start, end *types.Bl // Fetch and execute the next block trace tasks for task := range tasks { - signer := types.MakeSigner(api.config, task.block.Number()) + signer := types.MakeSigner(api.eth.blockchain.Config(), task.block.Number()) // Trace all the transactions contained within for i, tx := range task.block.Transactions() { @@ -214,7 +214,8 @@ func (api *PrivateDebugAPI) traceChain(ctx context.Context, start, end *types.Bl log.Warn("Tracing failed", "hash", tx.Hash(), "block", task.block.NumberU64(), "err", err) break } - task.statedb.Finalise(true) + // Only delete empty objects if EIP158/161 (a.k.a Spurious Dragon) is in effect + task.statedb.Finalise(api.eth.blockchain.Config().IsEIP158(task.block.Number())) task.results[i] = &txTraceResult{Result: res} } // Stream the result back to the user or abort on teardown @@ -294,7 +295,7 @@ func (api *PrivateDebugAPI) traceChain(ctx context.Context, start, end *types.Bl break } // Finalize the state so any modifications are written to the trie - root, err := statedb.Commit(true) + root, err := statedb.Commit(api.eth.blockchain.Config().IsEIP158(block.Number())) if err != nil { failed = err break @@ -459,7 +460,7 @@ func (api *PrivateDebugAPI) traceBlock(ctx context.Context, block *types.Block, } // Execute all the transaction contained within the block concurrently var ( - signer = types.MakeSigner(api.config, block.Number()) + signer = types.MakeSigner(api.eth.blockchain.Config(), block.Number()) txs = block.Transactions() results = make([]*txTraceResult, len(txs)) @@ -500,13 +501,14 @@ func (api *PrivateDebugAPI) traceBlock(ctx context.Context, block *types.Block, msg, _ := tx.AsMessage(signer) vmctx := core.NewEVMContext(msg, block.Header(), api.eth.blockchain, nil) - vmenv := vm.NewEVM(vmctx, statedb, api.config, vm.Config{}) + vmenv := vm.NewEVM(vmctx, statedb, api.eth.blockchain.Config(), vm.Config{}) if _, _, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())); err != nil { failed = err break } // Finalize the state so any modifications are written to the trie - statedb.Finalise(true) + // Only delete empty objects if EIP158/161 (a.k.a Spurious Dragon) is in effect + statedb.Finalise(vmenv.ChainConfig().IsEIP158(block.Number())) } close(jobs) pend.Wait() @@ -524,13 +526,7 @@ func (api *PrivateDebugAPI) traceBlock(ctx context.Context, block *types.Block, func (api *PrivateDebugAPI) standardTraceBlockToFile(ctx context.Context, block *types.Block, config *StdTraceConfig) ([]string, error) { // If we're tracing a single transaction, make sure it's present if config != nil && config.TxHash != (common.Hash{}) { - var exists bool - for _, tx := range block.Transactions() { - if exists = (tx.Hash() == config.TxHash); exists { - break - } - } - if !exists { + if !containsTx(block, config.TxHash) { return nil, fmt.Errorf("transaction %#x not found in block", config.TxHash) } } @@ -565,7 +561,7 @@ func (api *PrivateDebugAPI) standardTraceBlockToFile(ctx context.Context, block // Execute transaction, either tracing all or just the requested one var ( - signer = types.MakeSigner(api.config, block.Number()) + signer = types.MakeSigner(api.eth.blockchain.Config(), block.Number()) dumps []string ) for i, tx := range block.Transactions() { @@ -576,6 +572,7 @@ func (api *PrivateDebugAPI) standardTraceBlockToFile(ctx context.Context, block vmConf vm.Config dump *os.File + writer *bufio.Writer err error ) // If the transaction needs tracing, swap out the configs @@ -590,16 +587,19 @@ func (api *PrivateDebugAPI) standardTraceBlockToFile(ctx context.Context, block dumps = append(dumps, dump.Name()) // Swap out the noop logger to the standard tracer + writer = bufio.NewWriter(dump) vmConf = vm.Config{ Debug: true, - Tracer: vm.NewJSONLogger(&logConfig, bufio.NewWriter(dump)), + Tracer: vm.NewJSONLogger(&logConfig, writer), EnablePreimageRecording: true, } } // Execute the transaction and flush any traces to disk - vmenv := vm.NewEVM(vmctx, statedb, api.config, vmConf) + vmenv := vm.NewEVM(vmctx, statedb, api.eth.blockchain.Config(), vmConf) _, _, _, err = core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(msg.Gas())) - + if writer != nil { + writer.Flush() + } if dump != nil { dump.Close() log.Info("Wrote standard trace", "file", dump.Name()) @@ -608,7 +608,8 @@ func (api *PrivateDebugAPI) standardTraceBlockToFile(ctx context.Context, block return dumps, err } // Finalize the state so any modifications are written to the trie - statedb.Finalise(true) + // Only delete empty objects if EIP158/161 (a.k.a Spurious Dragon) is in effect + statedb.Finalise(vmenv.ChainConfig().IsEIP158(block.Number())) // If we've traced the transaction we were looking for, abort if tx.Hash() == txHash { @@ -618,6 +619,17 @@ func (api *PrivateDebugAPI) standardTraceBlockToFile(ctx context.Context, block return dumps, nil } +// containsTx reports whether the transaction with a certain hash +// is contained within the specified block. +func containsTx(block *types.Block, hash common.Hash) bool { + for _, tx := range block.Transactions() { + if tx.Hash() == hash { + return true + } + } + return false +} + // computeStateDB retrieves the state database associated with a certain block. // If no state is locally available for the given block, a number of blocks are // attempted to be reexecuted to generate the desired state. @@ -744,7 +756,7 @@ func (api *PrivateDebugAPI) traceTx(ctx context.Context, message core.Message, v tracer = vm.NewStructLogger(config.LogConfig) } // Run the transaction with tracing enabled. - vmenv := vm.NewEVM(vmctx, statedb, api.config, vm.Config{Debug: true, Tracer: tracer}) + vmenv := vm.NewEVM(vmctx, statedb, api.eth.blockchain.Config(), vm.Config{Debug: true, Tracer: tracer}) ret, gas, failed, err := core.ApplyMessage(vmenv, message, new(core.GasPool).AddGas(message.Gas())) if err != nil { @@ -783,8 +795,13 @@ func (api *PrivateDebugAPI) computeTxEnv(blockHash common.Hash, txIndex int, ree if err != nil { return nil, vm.Context{}, nil, err } + + if txIndex == 0 && len(block.Transactions()) == 0 { + return nil, vm.Context{}, statedb, nil + } + // Recompute transactions up to the target index. - signer := types.MakeSigner(api.config, block.Number()) + signer := types.MakeSigner(api.eth.blockchain.Config(), block.Number()) for idx, tx := range block.Transactions() { // Assemble the transaction call message and return if the requested offset @@ -794,12 +811,13 @@ func (api *PrivateDebugAPI) computeTxEnv(blockHash common.Hash, txIndex int, ree return msg, context, statedb, nil } // Not yet the searched for transaction, execute on top of the current state - vmenv := vm.NewEVM(context, statedb, api.config, vm.Config{}) + vmenv := vm.NewEVM(context, statedb, api.eth.blockchain.Config(), vm.Config{}) if _, _, _, err := core.ApplyMessage(vmenv, msg, new(core.GasPool).AddGas(tx.Gas())); err != nil { return nil, vm.Context{}, nil, fmt.Errorf("transaction %#x failed: %v", tx.Hash(), err) } // Ensure any modifications are committed to the state - statedb.Finalise(true) + // Only delete empty objects if EIP158/161 (a.k.a Spurious Dragon) is in effect + statedb.Finalise(vmenv.ChainConfig().IsEIP158(block.Number())) } return nil, vm.Context{}, nil, fmt.Errorf("transaction index %d out of range for block %#x", txIndex, blockHash) } diff --git a/eth/backend.go b/eth/backend.go index f45bc7d47683..adde609de096 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -25,46 +25,49 @@ import ( "sync" "sync/atomic" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/consensus/clique" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/bloombits" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/eth/filters" - "github.com/nebulaai/nbai-node/eth/gasprice" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/internal/ethapi" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/miner" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/clique" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/eth/filters" + "github.com/ethereum/go-ethereum/eth/gasprice" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/miner" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" ) type LesServer interface { Start(srvr *p2p.Server) Stop() + APIs() []rpc.API Protocols() []p2p.Protocol SetBloomBitsIndexer(bbIndexer *core.ChainIndexer) + SetContractBackend(bind.ContractBackend) } // Ethereum implements the Ethereum full node service. type Ethereum struct { - config *Config - chainConfig *params.ChainConfig + config *Config // Channel for shutting down the service - shutdownChan chan bool // Channel for shutting down the Ethereum + shutdownChan chan bool // Handlers txPool *core.TxPool @@ -99,6 +102,14 @@ func (s *Ethereum) AddLesServer(ls LesServer) { ls.SetBloomBitsIndexer(s.bloomIndexer) } +// SetClient sets a rpc client which connecting to our local node. +func (s *Ethereum) SetContractBackend(backend bind.ContractBackend) { + // Pass the rpc client to les server if it is enabled. + if s.lesServer != nil { + s.lesServer.SetContractBackend(backend) + } +} + // New creates a new Ethereum object (including the // initialisation of the common Ethereum object) func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { @@ -109,16 +120,22 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { if !config.SyncMode.IsValid() { return nil, fmt.Errorf("invalid sync mode %d", config.SyncMode) } - if config.MinerGasPrice == nil || config.MinerGasPrice.Cmp(common.Big0) <= 0 { - log.Warn("Sanitizing invalid miner gas price", "provided", config.MinerGasPrice, "updated", DefaultConfig.MinerGasPrice) - config.MinerGasPrice = new(big.Int).Set(DefaultConfig.MinerGasPrice) + if config.Miner.GasPrice == nil || config.Miner.GasPrice.Cmp(common.Big0) <= 0 { + log.Warn("Sanitizing invalid miner gas price", "provided", config.Miner.GasPrice, "updated", DefaultConfig.Miner.GasPrice) + config.Miner.GasPrice = new(big.Int).Set(DefaultConfig.Miner.GasPrice) + } + if config.NoPruning && config.TrieDirtyCache > 0 { + config.TrieCleanCache += config.TrieDirtyCache + config.TrieDirtyCache = 0 } + log.Info("Allocated trie memory caches", "clean", common.StorageSize(config.TrieCleanCache)*1024*1024, "dirty", common.StorageSize(config.TrieDirtyCache)*1024*1024) + // Assemble the Ethereum object - chainDb, err := CreateDB(ctx, config, "chaindata") + chainDb, err := ctx.OpenDatabaseWithFreezer("chaindata", config.DatabaseCache, config.DatabaseHandles, config.DatabaseFreezer, "eth/db/chaindata/") if err != nil { return nil, err } - chainConfig, genesisHash, genesisErr := core.SetupGenesisBlockWithOverride(chainDb, config.Genesis, config.ConstantinopleOverride) + chainConfig, genesisHash, genesisErr := core.SetupGenesisBlockWithOverride(chainDb, config.Genesis, config.OverrideIstanbul, config.OverrideMuirGlacier) if _, ok := genesisErr.(*params.ConfigCompatError); genesisErr != nil && !ok { return nil, genesisErr } @@ -127,28 +144,31 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { eth := &Ethereum{ config: config, chainDb: chainDb, - chainConfig: chainConfig, eventMux: ctx.EventMux, accountManager: ctx.AccountManager, - engine: CreateConsensusEngine(ctx, chainConfig, &config.Ethash, config.MinerNotify, config.MinerNoverify, chainDb), + engine: CreateConsensusEngine(ctx, chainConfig, &config.Ethash, config.Miner.Notify, config.Miner.Noverify, chainDb), shutdownChan: make(chan bool), networkID: config.NetworkId, - gasPrice: config.MinerGasPrice, - etherbase: config.Etherbase, + gasPrice: config.Miner.GasPrice, + etherbase: config.Miner.Etherbase, bloomRequests: make(chan chan *bloombits.Retrieval), bloomIndexer: NewBloomIndexer(chainDb, params.BloomBitsBlocks, params.BloomConfirms), } - log.Info("Initialising Ethereum protocol", "versions", ProtocolVersions, "network", config.NetworkId) + bcVersion := rawdb.ReadDatabaseVersion(chainDb) + var dbVer = "" + if bcVersion != nil { + dbVer = fmt.Sprintf("%d", *bcVersion) + } + log.Info("Initialising Ethereum protocol", "versions", ProtocolVersions, "network", config.NetworkId, "dbversion", dbVer) if !config.SkipBcVersionCheck { - bcVersion := rawdb.ReadDatabaseVersion(chainDb) if bcVersion != nil && *bcVersion > core.BlockChainVersion { return nil, fmt.Errorf("database version is v%d, Geth %s only supports v%d", *bcVersion, params.VersionWithMeta, core.BlockChainVersion) - } else if bcVersion != nil && *bcVersion < core.BlockChainVersion { - log.Warn("Upgrade blockchain database version", "from", *bcVersion, "to", core.BlockChainVersion) + } else if bcVersion == nil || *bcVersion < core.BlockChainVersion { + log.Warn("Upgrade blockchain database version", "from", dbVer, "to", core.BlockChainVersion) + rawdb.WriteDatabaseVersion(chainDb, core.BlockChainVersion) } - rawdb.WriteDatabaseVersion(chainDb, core.BlockChainVersion) } var ( vmConfig = vm.Config{ @@ -156,9 +176,15 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { EWASMInterpreter: config.EWASMInterpreter, EVMInterpreter: config.EVMInterpreter, } - cacheConfig = &core.CacheConfig{Disabled: config.NoPruning, TrieCleanLimit: config.TrieCleanCache, TrieDirtyLimit: config.TrieDirtyCache, TrieTimeLimit: config.TrieTimeout} + cacheConfig = &core.CacheConfig{ + TrieCleanLimit: config.TrieCleanCache, + TrieCleanNoPrefetch: config.NoPrefetch, + TrieDirtyLimit: config.TrieDirtyCache, + TrieDirtyDisabled: config.NoPruning, + TrieTimeLimit: config.TrieTimeout, + } ) - eth.blockchain, err = core.NewBlockChain(chainDb, cacheConfig, eth.chainConfig, eth.engine, vmConfig, eth.shouldPreserve) + eth.blockchain, err = core.NewBlockChain(chainDb, cacheConfig, chainConfig, eth.engine, vmConfig, eth.shouldPreserve) if err != nil { return nil, err } @@ -173,19 +199,24 @@ func New(ctx *node.ServiceContext, config *Config) (*Ethereum, error) { if config.TxPool.Journal != "" { config.TxPool.Journal = ctx.ResolvePath(config.TxPool.Journal) } - eth.txPool = core.NewTxPool(config.TxPool, eth.chainConfig, eth.blockchain) + eth.txPool = core.NewTxPool(config.TxPool, chainConfig, eth.blockchain) - if eth.protocolManager, err = NewProtocolManager(eth.chainConfig, config.SyncMode, config.NetworkId, eth.eventMux, eth.txPool, eth.engine, eth.blockchain, chainDb, config.Whitelist); err != nil { + // Permit the downloader to use the trie cache allowance during fast sync + cacheLimit := cacheConfig.TrieCleanLimit + cacheConfig.TrieDirtyLimit + checkpoint := config.Checkpoint + if checkpoint == nil { + checkpoint = params.TrustedCheckpoints[genesisHash] + } + if eth.protocolManager, err = NewProtocolManager(chainConfig, checkpoint, config.SyncMode, config.NetworkId, eth.eventMux, eth.txPool, eth.engine, eth.blockchain, chainDb, cacheLimit, config.Whitelist); err != nil { return nil, err } + eth.miner = miner.New(eth, &config.Miner, chainConfig, eth.EventMux(), eth.engine, eth.isLocalBlock) + eth.miner.SetExtra(makeExtraData(config.Miner.ExtraData)) - eth.miner = miner.New(eth, eth.chainConfig, eth.EventMux(), eth.engine, config.MinerRecommit, config.MinerGasFloor, config.MinerGasCeil, eth.isLocalBlock) - eth.miner.SetExtra(makeExtraData(config.MinerExtraData)) - - eth.APIBackend = &EthAPIBackend{eth, nil} + eth.APIBackend = &EthAPIBackend{ctx.ExtRPCEnabled(), eth, nil} gpoParams := config.GPO if gpoParams.Default == nil { - gpoParams.Default = config.MinerGasPrice + gpoParams.Default = config.Miner.GasPrice } eth.APIBackend.gpo = gasprice.NewOracle(eth.APIBackend, gpoParams) @@ -209,18 +240,6 @@ func makeExtraData(extra []byte) []byte { return extra } -// CreateDB creates the chain database. -func CreateDB(ctx *node.ServiceContext, config *Config, name string) (ethdb.Database, error) { - db, err := ctx.OpenDatabase(name, config.DatabaseCache, config.DatabaseHandles) - if err != nil { - return nil, err - } - if db, ok := db.(*ethdb.LDBDatabase); ok { - db.Meter("eth/db/chaindata/") - } - return db, nil -} - // CreateConsensusEngine creates the required type of consensus engine instance for an Ethereum service func CreateConsensusEngine(ctx *node.ServiceContext, chainConfig *params.ChainConfig, config *ethash.Config, notify []string, noverify bool, db ethdb.Database) consensus.Engine { // If proof-of-authority is requested, set it up @@ -257,9 +276,18 @@ func CreateConsensusEngine(ctx *node.ServiceContext, chainConfig *params.ChainCo func (s *Ethereum) APIs() []rpc.API { apis := ethapi.GetAPIs(s.APIBackend) + // Append any APIs exposed explicitly by the les server + if s.lesServer != nil { + apis = append(apis, s.lesServer.APIs()...) + } // Append any APIs exposed explicitly by the consensus engine apis = append(apis, s.engine.APIs(s.BlockChain())...) + // Append any APIs exposed explicitly by the les server + if s.lesServer != nil { + apis = append(apis, s.lesServer.APIs()...) + } + // Append all the local APIs and return return append(apis, []rpc.API{ { @@ -299,7 +327,7 @@ func (s *Ethereum) APIs() []rpc.API { }, { Namespace: "debug", Version: "1.0", - Service: NewPrivateDebugAPI(s.chainConfig, s), + Service: NewPrivateDebugAPI(s), }, { Namespace: "net", Version: "1.0", @@ -434,7 +462,7 @@ func (s *Ethereum) StartMining(threads int) error { log.Error("Etherbase account unavailable locally", "err", err) return fmt.Errorf("signer missing: %v", err) } - clique.Authorize(eb, wallet.SignHash) + clique.Authorize(eb, wallet.SignData) } // If mining is started, we can disable the transaction rejection mechanism // introduced to speed sync times. @@ -469,22 +497,31 @@ func (s *Ethereum) EventMux() *event.TypeMux { return s.eventMux } func (s *Ethereum) Engine() consensus.Engine { return s.engine } func (s *Ethereum) ChainDb() ethdb.Database { return s.chainDb } func (s *Ethereum) IsListening() bool { return true } // Always listening -func (s *Ethereum) EthVersion() int { return int(s.protocolManager.SubProtocols[0].Version) } +func (s *Ethereum) EthVersion() int { return int(ProtocolVersions[0]) } func (s *Ethereum) NetVersion() uint64 { return s.networkID } func (s *Ethereum) Downloader() *downloader.Downloader { return s.protocolManager.downloader } +func (s *Ethereum) Synced() bool { return atomic.LoadUint32(&s.protocolManager.acceptTxs) == 1 } +func (s *Ethereum) ArchiveMode() bool { return s.config.NoPruning } // Protocols implements node.Service, returning all the currently configured // network protocols to start. func (s *Ethereum) Protocols() []p2p.Protocol { - if s.lesServer == nil { - return s.protocolManager.SubProtocols + protos := make([]p2p.Protocol, len(ProtocolVersions)) + for i, vsn := range ProtocolVersions { + protos[i] = s.protocolManager.makeProtocol(vsn) + protos[i].Attributes = []enr.Entry{s.currentEthEntry()} } - return append(s.protocolManager.SubProtocols, s.lesServer.Protocols()...) + if s.lesServer != nil { + protos = append(protos, s.lesServer.Protocols()...) + } + return protos } // Start implements node.Service, starting all internal goroutines needed by the // Ethereum protocol implementation. func (s *Ethereum) Start(srvr *p2p.Server) error { + s.startEthEntryUpdate(srvr.LocalNode()) + // Start the bloom bits servicing goroutines s.startBloomHandlers(params.BloomBitsBlocks) diff --git a/eth/bloombits.go b/eth/bloombits.go index e90429bbcebc..9a31997d6002 100644 --- a/eth/bloombits.go +++ b/eth/bloombits.go @@ -20,13 +20,13 @@ import ( "context" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/bitutil" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/bloombits" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/bitutil" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" ) const ( @@ -102,7 +102,7 @@ func NewBloomIndexer(db ethdb.Database, size, confirms uint64) *core.ChainIndexe db: db, size: size, } - table := ethdb.NewTable(db, string(rawdb.BloomBitsIndexPrefix)) + table := rawdb.NewTable(db, string(rawdb.BloomBitsIndexPrefix)) return core.NewChainIndexer(db, table, backend, size, confirms, bloomThrottling, "bloombits") } diff --git a/eth/config.go b/eth/config.go index 0f15267f11e8..67ac6932678d 100644 --- a/eth/config.go +++ b/eth/config.go @@ -24,13 +24,13 @@ import ( "runtime" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/eth/gasprice" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/eth/gasprice" + "github.com/ethereum/go-ethereum/miner" + "github.com/ethereum/go-ethereum/params" ) // DefaultConfig contains default settings for use on the Ethereum main net. @@ -49,11 +49,12 @@ var DefaultConfig = Config{ TrieCleanCache: 256, TrieDirtyCache: 256, TrieTimeout: 60 * time.Minute, - MinerGasFloor: 8000000, - MinerGasCeil: 8000000, - MinerGasPrice: big.NewInt(params.GWei), - MinerRecommit: 3 * time.Second, - + Miner: miner.Config{ + GasFloor: 8000000, + GasCeil: 8000000, + GasPrice: big.NewInt(params.GWei), + Recommit: 3 * time.Second, + }, TxPool: core.DefaultTxPoolConfig, GPO: gasprice.Config{ Blocks: 20, @@ -68,14 +69,21 @@ func init() { home = user.HomeDir } } - if runtime.GOOS == "windows" { - DefaultConfig.Ethash.DatasetDir = filepath.Join(home, "AppData", "Ethash") + if runtime.GOOS == "darwin" { + DefaultConfig.Ethash.DatasetDir = filepath.Join(home, "Library", "Ethash") + } else if runtime.GOOS == "windows" { + localappdata := os.Getenv("LOCALAPPDATA") + if localappdata != "" { + DefaultConfig.Ethash.DatasetDir = filepath.Join(localappdata, "Ethash") + } else { + DefaultConfig.Ethash.DatasetDir = filepath.Join(home, "AppData", "Local", "Ethash") + } } else { DefaultConfig.Ethash.DatasetDir = filepath.Join(home, ".ethash") } } -//go:generate gencodec -type Config -field-override configMarshaling -formats toml -out gen_config.go +//go:generate gencodec -type Config -formats toml -out gen_config.go type Config struct { // The genesis block, which is inserted if the database is empty. @@ -85,32 +93,36 @@ type Config struct { // Protocol options NetworkId uint64 // Network ID to use for selecting peers to connect to SyncMode downloader.SyncMode - NoPruning bool + + NoPruning bool // Whether to disable pruning and flush everything to disk + NoPrefetch bool // Whether to disable prefetching and only load state on demand // Whitelist of required block number -> hash values to accept Whitelist map[uint64]common.Hash `toml:"-"` // 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 + LightServ int `toml:",omitempty"` // Maximum percentage of time allowed for serving LES requests + LightIngress int `toml:",omitempty"` // Incoming bandwidth limit for light servers + LightEgress int `toml:",omitempty"` // Outgoing bandwidth limit for light servers + LightPeers int `toml:",omitempty"` // Maximum number of LES client peers + + // Ultra Light client options + UltraLightServers []string `toml:",omitempty"` // List of trusted ultra light servers + UltraLightFraction int `toml:",omitempty"` // Percentage of trusted servers to accept an announcement + UltraLightOnlyAnnounce bool `toml:",omitempty"` // Whether to only announce headers, or also serve them // Database options SkipBcVersionCheck bool `toml:"-"` DatabaseHandles int `toml:"-"` DatabaseCache int - TrieCleanCache int - TrieDirtyCache int - TrieTimeout time.Duration - - // Mining-related options - Etherbase common.Address `toml:",omitempty"` - MinerNotify []string `toml:",omitempty"` - MinerExtraData []byte `toml:",omitempty"` - MinerGasFloor uint64 - MinerGasCeil uint64 - MinerGasPrice *big.Int - MinerRecommit time.Duration - MinerNoverify bool + DatabaseFreezer string + + TrieCleanCache int + TrieDirtyCache int + TrieTimeout time.Duration + + // Mining options + Miner miner.Config // Ethash options Ethash ethash.Config @@ -133,10 +145,18 @@ type Config struct { // Type of the EVM interpreter ("" for default) EVMInterpreter string - // Constantinople block override (TODO: remove after the fork) - ConstantinopleOverride *big.Int -} + // RPCGasCap is the global gas cap for eth-call variants. + RPCGasCap *big.Int `toml:",omitempty"` + + // Checkpoint is a hardcoded checkpoint which can be nil. + Checkpoint *params.TrustedCheckpoint `toml:",omitempty"` + + // CheckpointOracle is the configuration for checkpoint oracle. + CheckpointOracle *params.CheckpointOracleConfig `toml:",omitempty"` + + // Istanbul block override (TODO: remove after the fork) + OverrideIstanbul *big.Int -type configMarshaling struct { - MinerExtraData hexutil.Bytes + // MuirGlacier block override (TODO: remove after the fork) + OverrideMuirGlacier *big.Int } diff --git a/eth/downloader/api.go b/eth/downloader/api.go index d32a6d808ef7..57ff3d71afa8 100644 --- a/eth/downloader/api.go +++ b/eth/downloader/api.go @@ -20,9 +20,9 @@ import ( "context" "sync" - ethereum "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/rpc" + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/rpc" ) // PublicDownloaderAPI provides an API which gives information about the current synchronisation status. diff --git a/eth/downloader/downloader.go b/eth/downloader/downloader.go index 9490d5b6fd3c..f8982f696f6f 100644 --- a/eth/downloader/downloader.go +++ b/eth/downloader/downloader.go @@ -25,15 +25,16 @@ import ( "sync/atomic" "time" - ethereum "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/trie" ) var ( @@ -45,20 +46,20 @@ var ( MaxReceiptFetch = 256 // Amount of transaction receipts to allow fetching per request MaxStateFetch = 384 // Amount of node state values to allow fetching per request - MaxForkAncestry = 3 * params.EpochDuration // Maximum chain reorganisation - rttMinEstimate = 2 * time.Second // Minimum round-trip time to target for download requests - rttMaxEstimate = 20 * time.Second // Maximum round-trip time to target for download requests - rttMinConfidence = 0.1 // Worse confidence factor in our estimated RTT value - ttlScaling = 3 // Constant scaling factor for RTT -> TTL conversion - ttlLimit = time.Minute // Maximum TTL allowance to prevent reaching crazy timeouts + rttMinEstimate = 2 * time.Second // Minimum round-trip time to target for download requests + rttMaxEstimate = 20 * time.Second // Maximum round-trip time to target for download requests + rttMinConfidence = 0.1 // Worse confidence factor in our estimated RTT value + ttlScaling = 3 // Constant scaling factor for RTT -> TTL conversion + ttlLimit = time.Minute // Maximum TTL allowance to prevent reaching crazy timeouts qosTuningPeers = 5 // Number of peers to tune based on (best peers) qosConfidenceCap = 10 // Number of peers above which not to modify RTT confidence qosTuningImpact = 0.25 // Impact that a new tuning target has on the previous value - maxQueuedHeaders = 32 * 1024 // [eth/62] Maximum number of headers to queue for import (DOS protection) - maxHeadersProcess = 2048 // Number of header download results to import at once into the chain - maxResultsProcess = 2048 // Number of content download results to import at once into the chain + maxQueuedHeaders = 32 * 1024 // [eth/62] Maximum number of headers to queue for import (DOS protection) + maxHeadersProcess = 2048 // Number of header download results to import at once into the chain + maxResultsProcess = 2048 // Number of content download results to import at once into the chain + maxForkAncestry uint64 = params.ImmutabilityThreshold // Maximum chain reorganisation (locally redeclared so tests can reduce it) reorgProtThreshold = 48 // Threshold number of recent blocks to disable mini reorg protection reorgProtHeaderDelay = 2 // Number of headers to delay delivering to cover mini reorgs @@ -75,37 +76,40 @@ var ( errUnknownPeer = errors.New("peer is unknown or unhealthy") errBadPeer = errors.New("action from bad peer ignored") errStallingPeer = errors.New("peer is stalling") + errUnsyncedPeer = errors.New("unsynced peer") errNoPeers = errors.New("no peers to keep download active") errTimeout = errors.New("timeout") errEmptyHeaderSet = errors.New("empty header set by peer") errPeersUnavailable = errors.New("no peers available or all tried for download") errInvalidAncestor = errors.New("retrieved ancestor is invalid") errInvalidChain = errors.New("retrieved hash chain is invalid") - errInvalidBlock = errors.New("retrieved block is invalid") errInvalidBody = errors.New("retrieved block body is invalid") errInvalidReceipt = errors.New("retrieved receipt is invalid") - errCancelBlockFetch = errors.New("block download canceled (requested)") - errCancelHeaderFetch = errors.New("block header download canceled (requested)") - errCancelBodyFetch = errors.New("block body download canceled (requested)") - errCancelReceiptFetch = errors.New("receipt download canceled (requested)") errCancelStateFetch = errors.New("state data download canceled (requested)") - errCancelHeaderProcessing = errors.New("header processing canceled (requested)") errCancelContentProcessing = errors.New("content processing canceled (requested)") + errCanceled = errors.New("syncing canceled (requested)") errNoSyncActive = errors.New("no sync active") errTooOld = errors.New("peer doesn't speak recent enough protocol version (need version >= 62)") ) type Downloader struct { + // WARNING: The `rttEstimate` and `rttConfidence` fields are accessed atomically. + // On 32 bit platforms, only 64-bit aligned fields can be atomic. The struct is + // guaranteed to be so aligned, so take advantage of that. For more information, + // see https://golang.org/pkg/sync/atomic/#pkg-note-BUG. + rttEstimate uint64 // Round trip time to target for download requests + rttConfidence uint64 // Confidence in the estimated RTT (unit: millionths to allow atomic ops) + mode SyncMode // Synchronisation mode defining the strategy used (per sync cycle) mux *event.TypeMux // Event multiplexer to announce sync operation events - genesis uint64 // Genesis block number to limit sync to (e.g. light client CHT) - queue *queue // Scheduler for selecting the hashes to download - peers *peerSet // Set of active peers from which download can proceed - stateDB ethdb.Database + checkpoint uint64 // Checkpoint block number to enforce head against (e.g. fast sync) + genesis uint64 // Genesis block number to limit sync to (e.g. light client CHT) + queue *queue // Scheduler for selecting the hashes to download + peers *peerSet // Set of active peers from which download can proceed - rttEstimate uint64 // Round trip time to target for download requests - rttConfidence uint64 // Confidence in the estimated RTT (unit: millionths to allow atomic ops) + stateDB ethdb.Database // Database to state sync into (and deduplicate via) + stateBloom *trie.SyncBloom // Bloom filter for fast trie node existence checks // Statistics syncStatsChainOrigin uint64 // Origin block number where syncing started at @@ -124,6 +128,7 @@ type Downloader struct { synchronising int32 notified int32 committed int32 + ancientLimit uint64 // The maximum block number which can be regarded as ancient data. // Channels headerCh chan dataPack // [eth/62] Channel receiving inbound block headers @@ -201,19 +206,19 @@ type BlockChain interface { InsertChain(types.Blocks) (int, error) // InsertReceiptChain inserts a batch of receipts into the local chain. - InsertReceiptChain(types.Blocks, []types.Receipts) (int, error) + InsertReceiptChain(types.Blocks, []types.Receipts, uint64) (int, error) } // New creates a new downloader to fetch hashes and blocks from remote peers. -func New(mode SyncMode, stateDb ethdb.Database, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn) *Downloader { +func New(checkpoint uint64, stateDb ethdb.Database, stateBloom *trie.SyncBloom, mux *event.TypeMux, chain BlockChain, lightchain LightChain, dropPeer peerDropFn) *Downloader { if lightchain == nil { lightchain = chain } - dl := &Downloader{ - mode: mode, stateDB: stateDb, + stateBloom: stateBloom, mux: mux, + checkpoint: checkpoint, queue: newQueue(), peers: newPeerSet(), rttEstimate: uint64(rttMaxEstimate), @@ -253,13 +258,15 @@ func (d *Downloader) Progress() ethereum.SyncProgress { defer d.syncStatsLock.RUnlock() current := uint64(0) - switch d.mode { - case FullSync: + switch { + case d.blockchain != nil && d.mode == FullSync: current = d.blockchain.CurrentBlock().NumberU64() - case FastSync: + case d.blockchain != nil && d.mode == FastSync: current = d.blockchain.CurrentFastBlock().NumberU64() - case LightSync: + case d.lightchain != nil: current = d.lightchain.CurrentHeader().Number.Uint64() + default: + log.Error("Unknown downloader chain/mode combo", "light", d.lightchain != nil, "full", d.blockchain != nil, "mode", d.mode) } return ethereum.SyncProgress{ StartingBlock: d.syncStatsChainOrigin, @@ -307,14 +314,6 @@ func (d *Downloader) UnregisterPeer(id string) error { } d.queue.Revoke(id) - // If this peer was the master peer, abort sync immediately - d.cancelLock.RLock() - master := id == d.cancelPeer - d.cancelLock.RUnlock() - - if master { - d.cancel() - } return nil } @@ -324,9 +323,9 @@ func (d *Downloader) Synchronise(id string, head common.Hash, td *big.Int, mode err := d.synchronise(id, head, td, mode) switch err { case nil: - case errBusy: + case errBusy, errCanceled: - case errTimeout, errBadPeer, errStallingPeer, + case errTimeout, errBadPeer, errStallingPeer, errUnsyncedPeer, errEmptyHeaderSet, errPeersUnavailable, errTooOld, errInvalidAncestor, errInvalidChain: log.Warn("Synchronisation failed, dropping peer", "peer", id, "err", err) @@ -361,6 +360,12 @@ func (d *Downloader) synchronise(id string, hash common.Hash, td *big.Int, mode if atomic.CompareAndSwapInt32(&d.notified, 0, 1) { log.Info("Block synchronisation started") } + // If we are already full syncing, but have a fast-sync bloom filter laying + // around, make sure it does't use memory any more. This is a special case + // when the user attempts to fast sync a new empty network. + if mode == FullSync && d.stateBloom != nil { + d.stateBloom.Close() + } // Reset the queue, peer set and wake channels to clean any internal leftover state d.queue.Reset() d.peers.Reset() @@ -415,7 +420,8 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I if err != nil { d.mux.Post(FailedEvent{err}) } else { - d.mux.Post(DoneEvent{}) + latest := d.lightchain.CurrentHeader() + d.mux.Post(DoneEvent{latest}) } }() if p.version < 62 { @@ -424,7 +430,7 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I log.Debug("Synchronising with the network", "peer", p.id, "eth", p.version, "head", hash, "td", td, "mode", d.mode) defer func(start time.Time) { - log.Debug("Synchronisation terminated", "elapsed", time.Since(start)) + log.Debug("Synchronisation terminated", "elapsed", common.PrettyDuration(time.Since(start))) }(time.Now()) // Look up the sync boundaries: the common ancestor and the target block @@ -461,12 +467,49 @@ func (d *Downloader) syncWithPeer(p *peerConnection, hash common.Hash, td *big.I if d.mode == FastSync && pivot != 0 { d.committed = 0 } + if d.mode == FastSync { + // Set the ancient data limitation. + // If we are running fast sync, all block data older than ancientLimit will be + // written to the ancient store. More recent data will be written to the active + // database and will wait for the freezer to migrate. + // + // If there is a checkpoint available, then calculate the ancientLimit through + // that. Otherwise calculate the ancient limit through the advertised height + // of the remote peer. + // + // The reason for picking checkpoint first is that a malicious peer can give us + // a fake (very high) height, forcing the ancient limit to also be very high. + // The peer would start to feed us valid blocks until head, resulting in all of + // the blocks might be written into the ancient store. A following mini-reorg + // could cause issues. + if d.checkpoint != 0 && d.checkpoint > maxForkAncestry+1 { + d.ancientLimit = d.checkpoint + } else if height > maxForkAncestry+1 { + d.ancientLimit = height - maxForkAncestry - 1 + } + frozen, _ := d.stateDB.Ancients() // Ignore the error here since light client can also hit here. + // If a part of blockchain data has already been written into active store, + // disable the ancient style insertion explicitly. + if origin >= frozen && frozen != 0 { + d.ancientLimit = 0 + log.Info("Disabling direct-ancient mode", "origin", origin, "ancient", frozen-1) + } else if d.ancientLimit > 0 { + log.Debug("Enabling direct-ancient mode", "ancient", d.ancientLimit) + } + // Rewind the ancient store and blockchain if reorg happens. + if origin+1 < frozen { + var hashes []common.Hash + for i := origin + 1; i < d.lightchain.CurrentHeader().Number.Uint64(); i++ { + hashes = append(hashes, rawdb.ReadCanonicalHash(d.stateDB, i)) + } + d.lightchain.Rollback(hashes) + } + } // Initiate the sync using a concurrent header and content retrieval algorithm d.queue.Prepare(origin+1, d.mode) if d.syncInitHook != nil { d.syncInitHook(origin, height) } - fetchers := []func() error{ func() error { return d.fetchHeaders(p, origin+1, pivot) }, // Headers are always retrieved func() error { return d.fetchBodies(origin + 1) }, // Bodies are retrieved during normal and fast sync @@ -499,7 +542,7 @@ func (d *Downloader) spawnSync(fetchers []func() error) error { // it has processed the queue. d.queue.Close() } - if err = <-errc; err != nil { + if err = <-errc; err != nil && err != errCanceled { break } } @@ -530,6 +573,9 @@ func (d *Downloader) cancel() { func (d *Downloader) Cancel() { d.cancel() d.cancelWg.Wait() + + d.ancientLimit = 0 + log.Debug("Reset ancient limit to zero") } // Terminate interrupts the downloader, canceling all pending operations. @@ -562,7 +608,7 @@ func (d *Downloader) fetchHeight(p *peerConnection) (*types.Header, error) { for { select { case <-d.cancelCh: - return nil, errCancelBlockFetch + return nil, errCanceled case packet := <-d.headerCh: // Discard anything not from the origin peer @@ -577,6 +623,10 @@ func (d *Downloader) fetchHeight(p *peerConnection) (*types.Header, error) { return nil, errBadPeer } head := headers[0] + if (d.mode == FastSync || d.mode == LightSync) && head.Number.Uint64() < d.checkpoint { + p.log.Warn("Remote head below checkpoint", "number", head.Number, "hash", head.Hash()) + return nil, errUnsyncedPeer + } p.log.Debug("Remote head header identified", "number", head.Number, "hash", head.Hash()) return head, nil @@ -664,30 +714,32 @@ func (d *Downloader) findAncestor(p *peerConnection, remoteHeader *types.Header) localHeight = d.lightchain.CurrentHeader().Number.Uint64() } p.log.Debug("Looking for common ancestor", "local", localHeight, "remote", remoteHeight) - if localHeight >= MaxForkAncestry { + + // Recap floor value for binary search + if localHeight >= maxForkAncestry { // We're above the max reorg threshold, find the earliest fork point - floor = int64(localHeight - MaxForkAncestry) - - // If we're doing a light sync, ensure the floor doesn't go below the CHT, as - // all headers before that point will be missing. - if d.mode == LightSync { - // If we dont know the current CHT position, find it - if d.genesis == 0 { - header := d.lightchain.CurrentHeader() - for header != nil { - d.genesis = header.Number.Uint64() - if floor >= int64(d.genesis)-1 { - break - } - header = d.lightchain.GetHeaderByHash(header.ParentHash) + floor = int64(localHeight - maxForkAncestry) + } + // If we're doing a light sync, ensure the floor doesn't go below the CHT, as + // all headers before that point will be missing. + if d.mode == LightSync { + // If we dont know the current CHT position, find it + if d.genesis == 0 { + header := d.lightchain.CurrentHeader() + for header != nil { + d.genesis = header.Number.Uint64() + if floor >= int64(d.genesis)-1 { + break } + header = d.lightchain.GetHeaderByHash(header.ParentHash) } - // We already know the "genesis" block number, cap floor to that - if floor < int64(d.genesis)-1 { - floor = int64(d.genesis) - 1 - } + } + // We already know the "genesis" block number, cap floor to that + if floor < int64(d.genesis)-1 { + floor = int64(d.genesis) - 1 } } + from, count, skip, max := calculateRequestSpan(remoteHeight, localHeight) p.log.Trace("Span searching for common ancestor", "count", count, "from", from, "skip", skip) @@ -702,7 +754,7 @@ func (d *Downloader) findAncestor(p *peerConnection, remoteHeader *types.Header) for finished := false; !finished; { select { case <-d.cancelCh: - return 0, errCancelHeaderFetch + return 0, errCanceled case packet := <-d.headerCh: // Discard anything not from the origin peer @@ -718,7 +770,7 @@ func (d *Downloader) findAncestor(p *peerConnection, remoteHeader *types.Header) } // Make sure the peer's reply conforms to the request for i, header := range headers { - expectNumber := from + int64(i)*int64((skip+1)) + expectNumber := from + int64(i)*int64(skip+1) if number := header.Number.Int64(); number != expectNumber { p.log.Warn("Head headers broke chain ordering", "index", i, "requested", expectNumber, "received", number) return 0, errInvalidChain @@ -788,7 +840,7 @@ func (d *Downloader) findAncestor(p *peerConnection, remoteHeader *types.Header) for arrived := false; !arrived; { select { case <-d.cancelCh: - return 0, errCancelHeaderFetch + return 0, errCanceled case packer := <-d.headerCh: // Discard anything not from the origin peer @@ -883,12 +935,13 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64, pivot uint64) } } // Start pulling the header chain skeleton until all is done + ancestor := from getHeaders(from) for { select { case <-d.cancelCh: - return errCancelHeaderFetch + return errCanceled case packet := <-d.headerCh: // Make sure the active peer is giving us the skeleton headers @@ -915,7 +968,7 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64, pivot uint64) getHeaders(from) continue case <-d.cancelCh: - return errCancelHeaderFetch + return errCanceled } } // Pivot done (or not in fast sync) and no more headers, terminate the process @@ -924,7 +977,7 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64, pivot uint64) case d.headerProcCh <- nil: return nil case <-d.cancelCh: - return errCancelHeaderFetch + return errCanceled } } headers := packet.(*headerPack).headers @@ -944,7 +997,7 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64, pivot uint64) // chain errors. if n := len(headers); n > 0 { // Retrieve the current head we're at - head := uint64(0) + var head uint64 if d.mode == LightSync { head = d.lightchain.CurrentHeader().Number.Uint64() } else { @@ -953,6 +1006,12 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64, pivot uint64) head = full } } + // If the head is below the common ancestor, we're actually deduplicating + // already existing chain segments, so use the ancestor as the fake head. + // Otherwise we might end up delaying header deliveries pointlessly. + if head < ancestor { + head = ancestor + } // If the head is way older than this batch, delay the last few headers if head+uint64(reorgProtThreshold) < headers[n-1].Number.Uint64() { delay := reorgProtHeaderDelay @@ -969,7 +1028,7 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64, pivot uint64) select { case d.headerProcCh <- headers: case <-d.cancelCh: - return errCancelHeaderFetch + return errCanceled } from += uint64(len(headers)) getHeaders(from) @@ -981,7 +1040,7 @@ func (d *Downloader) fetchHeaders(p *peerConnection, from uint64, pivot uint64) getHeaders(from) continue case <-d.cancelCh: - return errCancelHeaderFetch + return errCanceled } } @@ -1040,7 +1099,7 @@ func (d *Downloader) fillHeaderSkeleton(from uint64, skeleton []*types.Header) ( capacity = func(p *peerConnection) int { return p.HeaderCapacity(d.requestRTT()) } setIdle = func(p *peerConnection, accepted int) { p.SetHeadersIdle(accepted) } ) - err := d.fetchParts(errCancelHeaderFetch, d.headerCh, deliver, d.queue.headerContCh, expire, + err := d.fetchParts(d.headerCh, deliver, d.queue.headerContCh, expire, d.queue.PendingHeaders, d.queue.InFlightHeaders, throttle, reserve, nil, fetch, d.queue.CancelHeaders, capacity, d.peers.HeaderIdlePeers, setIdle, "headers") @@ -1066,7 +1125,7 @@ func (d *Downloader) fetchBodies(from uint64) error { capacity = func(p *peerConnection) int { return p.BlockCapacity(d.requestRTT()) } setIdle = func(p *peerConnection, accepted int) { p.SetBodiesIdle(accepted) } ) - err := d.fetchParts(errCancelBodyFetch, d.bodyCh, deliver, d.bodyWakeCh, expire, + err := d.fetchParts(d.bodyCh, deliver, d.bodyWakeCh, expire, d.queue.PendingBlocks, d.queue.InFlightBlocks, d.queue.ShouldThrottleBlocks, d.queue.ReserveBodies, d.bodyFetchHook, fetch, d.queue.CancelBodies, capacity, d.peers.BodyIdlePeers, setIdle, "bodies") @@ -1090,7 +1149,7 @@ func (d *Downloader) fetchReceipts(from uint64) error { capacity = func(p *peerConnection) int { return p.ReceiptCapacity(d.requestRTT()) } setIdle = func(p *peerConnection, accepted int) { p.SetReceiptsIdle(accepted) } ) - err := d.fetchParts(errCancelReceiptFetch, d.receiptCh, deliver, d.receiptWakeCh, expire, + err := d.fetchParts(d.receiptCh, deliver, d.receiptWakeCh, expire, d.queue.PendingReceipts, d.queue.InFlightReceipts, d.queue.ShouldThrottleReceipts, d.queue.ReserveReceipts, d.receiptFetchHook, fetch, d.queue.CancelReceipts, capacity, d.peers.ReceiptIdlePeers, setIdle, "receipts") @@ -1123,7 +1182,7 @@ func (d *Downloader) fetchReceipts(from uint64) error { // - idle: network callback to retrieve the currently (type specific) idle peers that can be assigned tasks // - setIdle: network callback to set a peer back to idle and update its estimated capacity (traffic shaping) // - kind: textual label of the type being downloaded to display in log mesages -func (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliver func(dataPack) (int, error), wakeCh chan bool, +func (d *Downloader) fetchParts(deliveryCh chan dataPack, deliver func(dataPack) (int, error), wakeCh chan bool, expire func() map[string]int, pending func() int, inFlight func() bool, throttle func() bool, reserve func(*peerConnection, int) (*fetchRequest, bool, error), fetchHook func([]*types.Header), fetch func(*peerConnection, *fetchRequest) error, cancel func(*fetchRequest), capacity func(*peerConnection) int, idle func() ([]*peerConnection, int), setIdle func(*peerConnection, int), kind string) error { @@ -1139,7 +1198,7 @@ func (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliv for { select { case <-d.cancelCh: - return errCancel + return errCanceled case packet := <-deliveryCh: // If the peer was previously banned and failed to deliver its pack @@ -1210,12 +1269,23 @@ func (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliv setIdle(peer, 0) } else { peer.log.Debug("Stalling delivery, dropping", "type", kind) + if d.dropPeer == nil { // The dropPeer method is nil when `--copydb` is used for a local copy. // Timeouts can occur if e.g. compaction hits at the wrong time, and can be ignored peer.log.Warn("Downloader wants to drop peer, but peerdrop-function is not set", "peer", pid) } else { d.dropPeer(pid) + + // If this peer was the master peer, abort sync immediately + d.cancelLock.RLock() + master := pid == d.cancelPeer + d.cancelLock.RUnlock() + + if master { + d.cancel() + return errTimeout + } } } } @@ -1288,7 +1358,7 @@ func (d *Downloader) fetchParts(errCancel error, deliveryCh chan dataPack, deliv // queue until the stream ends or a failure occurs. func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) error { // Keep a count of uncertain headers to roll back - rollback := []*types.Header{} + var rollback []*types.Header defer func() { if len(rollback) > 0 { // Flatten the headers and roll them back @@ -1320,7 +1390,7 @@ func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) er for { select { case <-d.cancelCh: - return errCancelHeaderProcessing + return errCanceled case headers := <-d.headerProcCh: // Terminate header processing if we synced up @@ -1369,12 +1439,11 @@ func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) er } // Otherwise split the chunk of headers into batches and process them gotHeaders = true - for len(headers) > 0 { // Terminate if something failed in between processing chunks select { case <-d.cancelCh: - return errCancelHeaderProcessing + return errCanceled default: } // Select the next chunk of headers to import @@ -1383,11 +1452,10 @@ func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) er limit = len(headers) } chunk := headers[:limit] - // In case of header only syncing, validate the chunk immediately if d.mode == FastSync || d.mode == LightSync { // Collect the yet unknown headers to mark them as uncertain - unknown := make([]*types.Header, 0, len(headers)) + unknown := make([]*types.Header, 0, len(chunk)) for _, header := range chunk { if !d.lightchain.HasHeader(header.Hash(), header.Number.Uint64()) { unknown = append(unknown, header) @@ -1418,7 +1486,7 @@ func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) er for d.queue.PendingBlocks() >= maxQueuedHeaders || d.queue.PendingReceipts() >= maxQueuedHeaders { select { case <-d.cancelCh: - return errCancelHeaderProcessing + return errCanceled case <-time.After(time.Second): } } @@ -1432,7 +1500,6 @@ func (d *Downloader) processHeaders(origin uint64, pivot uint64, td *big.Int) er headers = headers[limit:] origin += uint64(limit) } - // Update the highest block number we know if a higher one is found. d.syncStatsLock.Lock() if d.syncStatsChainHeight < origin { @@ -1507,13 +1574,14 @@ func (d *Downloader) importBlockResults(results []*fetchResult) error { func (d *Downloader) processFastSyncContent(latest *types.Header) error { // Start syncing state of the reported head block. This should get us most of // the state of the pivot block. - stateSync := d.syncState(latest.Root) - defer stateSync.Cancel() - go func() { - if err := stateSync.Wait(); err != nil && err != errCancelStateFetch { + sync := d.syncState(latest.Root) + defer sync.Cancel() + closeOnErr := func(s *stateSync) { + if err := s.Wait(); err != nil && err != errCancelStateFetch && err != errCanceled { d.queue.Close() // wake up Results } - }() + } + go closeOnErr(sync) // Figure out the ideal pivot block. Note, that this goalpost may move if the // sync takes long enough for the chain head to move significantly. pivot := uint64(0) @@ -1533,12 +1601,13 @@ func (d *Downloader) processFastSyncContent(latest *types.Header) error { if len(results) == 0 { // If pivot sync is done, stop if oldPivot == nil { - return stateSync.Cancel() + return sync.Cancel() } // If sync failed, stop select { case <-d.cancelCh: - return stateSync.Cancel() + sync.Cancel() + return errCanceled default: } } @@ -1557,28 +1626,24 @@ func (d *Downloader) processFastSyncContent(latest *types.Header) error { } } P, beforeP, afterP := splitAroundPivot(pivot, results) - if err := d.commitFastSyncData(beforeP, stateSync); err != nil { + if err := d.commitFastSyncData(beforeP, sync); err != nil { return err } if P != nil { // If new pivot block found, cancel old state retrieval and restart if oldPivot != P { - stateSync.Cancel() + sync.Cancel() - stateSync = d.syncState(P.Header.Root) - defer stateSync.Cancel() - go func() { - if err := stateSync.Wait(); err != nil && err != errCancelStateFetch { - d.queue.Close() // wake up Results - } - }() + sync = d.syncState(P.Header.Root) + defer sync.Cancel() + go closeOnErr(sync) oldPivot = P } // Wait for completion, occasionally checking for pivot staleness select { - case <-stateSync.done: - if stateSync.err != nil { - return stateSync.err + case <-sync.done: + if sync.err != nil { + return sync.err } if err := d.commitPivotBlock(P); err != nil { return err @@ -1638,7 +1703,7 @@ func (d *Downloader) commitFastSyncData(results []*fetchResult, stateSync *state blocks[i] = types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles) receipts[i] = result.Receipts } - if index, err := d.blockchain.InsertReceiptChain(blocks, receipts); err != nil { + if index, err := d.blockchain.InsertReceiptChain(blocks, receipts, d.ancientLimit); err != nil { log.Debug("Downloaded item processing failed", "number", results[index].Header.Number, "hash", results[index].Header.Hash(), "err", err) return errInvalidChain } @@ -1648,13 +1713,24 @@ func (d *Downloader) commitFastSyncData(results []*fetchResult, stateSync *state func (d *Downloader) commitPivotBlock(result *fetchResult) error { block := types.NewBlockWithHeader(result.Header).WithBody(result.Transactions, result.Uncles) log.Debug("Committing fast sync pivot as new head", "number", block.Number(), "hash", block.Hash()) - if _, err := d.blockchain.InsertReceiptChain([]*types.Block{block}, []types.Receipts{result.Receipts}); err != nil { + + // Commit the pivot block as the new head, will require full sync from here on + if _, err := d.blockchain.InsertReceiptChain([]*types.Block{block}, []types.Receipts{result.Receipts}, d.ancientLimit); err != nil { return err } if err := d.blockchain.FastSyncCommitHead(block.Hash()); err != nil { return err } atomic.StoreInt32(&d.committed, 1) + + // If we had a bloom filter for the state sync, deallocate it now. Note, we only + // deallocate internally, but keep the empty wrapper. This ensures that if we do + // a rollback after committing the pivot and restarting fast sync, we don't end + // up using a nil bloom. Empty bloom is fine, it just returns that it does not + // have the info we need, so reach down to the database instead. + if d.stateBloom != nil { + d.stateBloom.Close() + } return nil } diff --git a/eth/downloader/downloader_test.go b/eth/downloader/downloader_test.go index 3521e02d15ab..b23043b1c003 100644 --- a/eth/downloader/downloader_test.go +++ b/eth/downloader/downloader_test.go @@ -26,17 +26,18 @@ import ( "testing" "time" - ethereum "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/trie" ) // Reduce some of the parameters to make the tester faster. func init() { - MaxForkAncestry = uint64(10000) + maxForkAncestry = 10000 blockCacheItems = 1024 fsHeaderContCheck = 500 * time.Millisecond } @@ -56,6 +57,11 @@ type downloadTester struct { ownReceipts map[common.Hash]types.Receipts // Receipts belonging to the tester ownChainTd map[common.Hash]*big.Int // Total difficulties of the blocks in the local chain + ancientHeaders map[common.Hash]*types.Header // Ancient headers belonging to the tester + ancientBlocks map[common.Hash]*types.Block // Ancient blocks belonging to the tester + ancientReceipts map[common.Hash]types.Receipts // Ancient receipts belonging to the tester + ancientChainTd map[common.Hash]*big.Int // Ancient total difficulties of the blocks in the local chain + lock sync.RWMutex } @@ -70,10 +76,17 @@ func newTester() *downloadTester { ownBlocks: map[common.Hash]*types.Block{testGenesis.Hash(): testGenesis}, ownReceipts: map[common.Hash]types.Receipts{testGenesis.Hash(): nil}, ownChainTd: map[common.Hash]*big.Int{testGenesis.Hash(): testGenesis.Difficulty()}, + + // Initialize ancient store with test genesis block + ancientHeaders: map[common.Hash]*types.Header{testGenesis.Hash(): testGenesis.Header()}, + ancientBlocks: map[common.Hash]*types.Block{testGenesis.Hash(): testGenesis}, + ancientReceipts: map[common.Hash]types.Receipts{testGenesis.Hash(): nil}, + ancientChainTd: map[common.Hash]*big.Int{testGenesis.Hash(): testGenesis.Difficulty()}, } - tester.stateDb = ethdb.NewMemDatabase() + tester.stateDb = rawdb.NewMemoryDatabase() tester.stateDb.Put(testGenesis.Root().Bytes(), []byte{0x00}) - tester.downloader = New(FullSync, tester.stateDb, new(event.TypeMux), tester, nil, tester.dropPeer) + + tester.downloader = New(0, tester.stateDb, trie.NewSyncBloom(1, tester.stateDb), new(event.TypeMux), tester, nil, tester.dropPeer) return tester } @@ -120,6 +133,9 @@ func (dl *downloadTester) HasFastBlock(hash common.Hash, number uint64) bool { dl.lock.RLock() defer dl.lock.RUnlock() + if _, ok := dl.ancientReceipts[hash]; ok { + return true + } _, ok := dl.ownReceipts[hash] return ok } @@ -129,6 +145,10 @@ func (dl *downloadTester) GetHeaderByHash(hash common.Hash) *types.Header { dl.lock.RLock() defer dl.lock.RUnlock() + header := dl.ancientHeaders[hash] + if header != nil { + return header + } return dl.ownHeaders[hash] } @@ -137,6 +157,10 @@ func (dl *downloadTester) GetBlockByHash(hash common.Hash) *types.Block { dl.lock.RLock() defer dl.lock.RUnlock() + block := dl.ancientBlocks[hash] + if block != nil { + return block + } return dl.ownBlocks[hash] } @@ -146,6 +170,9 @@ func (dl *downloadTester) CurrentHeader() *types.Header { defer dl.lock.RUnlock() for i := len(dl.ownHashes) - 1; i >= 0; i-- { + if header := dl.ancientHeaders[dl.ownHashes[i]]; header != nil { + return header + } if header := dl.ownHeaders[dl.ownHashes[i]]; header != nil { return header } @@ -159,6 +186,12 @@ func (dl *downloadTester) CurrentBlock() *types.Block { defer dl.lock.RUnlock() for i := len(dl.ownHashes) - 1; i >= 0; i-- { + if block := dl.ancientBlocks[dl.ownHashes[i]]; block != nil { + if _, err := dl.stateDb.Get(block.Root().Bytes()); err == nil { + return block + } + return block + } if block := dl.ownBlocks[dl.ownHashes[i]]; block != nil { if _, err := dl.stateDb.Get(block.Root().Bytes()); err == nil { return block @@ -174,6 +207,9 @@ func (dl *downloadTester) CurrentFastBlock() *types.Block { defer dl.lock.RUnlock() for i := len(dl.ownHashes) - 1; i >= 0; i-- { + if block := dl.ancientBlocks[dl.ownHashes[i]]; block != nil { + return block + } if block := dl.ownBlocks[dl.ownHashes[i]]; block != nil { return block } @@ -185,7 +221,7 @@ func (dl *downloadTester) CurrentFastBlock() *types.Block { func (dl *downloadTester) FastSyncCommitHead(hash common.Hash) error { // For now only check that the state trie is correct if block := dl.GetBlockByHash(hash); block != nil { - _, err := trie.NewSecure(block.Root(), trie.NewDatabase(dl.stateDb), 0) + _, err := trie.NewSecure(block.Root(), trie.NewDatabase(dl.stateDb)) return err } return fmt.Errorf("non existent block: %x", hash[:4]) @@ -196,6 +232,9 @@ func (dl *downloadTester) GetTd(hash common.Hash, number uint64) *big.Int { dl.lock.RLock() defer dl.lock.RUnlock() + if td := dl.ancientChainTd[hash]; td != nil { + return td + } return dl.ownChainTd[hash] } @@ -252,7 +291,7 @@ func (dl *downloadTester) InsertChain(blocks types.Blocks) (i int, err error) { } // InsertReceiptChain injects a new batch of receipts into the simulated chain. -func (dl *downloadTester) InsertReceiptChain(blocks types.Blocks, receipts []types.Receipts) (i int, err error) { +func (dl *downloadTester) InsertReceiptChain(blocks types.Blocks, receipts []types.Receipts, ancientLimit uint64) (i int, err error) { dl.lock.Lock() defer dl.lock.Unlock() @@ -260,11 +299,25 @@ func (dl *downloadTester) InsertReceiptChain(blocks types.Blocks, receipts []typ if _, ok := dl.ownHeaders[blocks[i].Hash()]; !ok { return i, errors.New("unknown owner") } - if _, ok := dl.ownBlocks[blocks[i].ParentHash()]; !ok { - return i, errors.New("unknown parent") + if _, ok := dl.ancientBlocks[blocks[i].ParentHash()]; !ok { + if _, ok := dl.ownBlocks[blocks[i].ParentHash()]; !ok { + return i, errors.New("unknown parent") + } + } + if blocks[i].NumberU64() <= ancientLimit { + dl.ancientBlocks[blocks[i].Hash()] = blocks[i] + dl.ancientReceipts[blocks[i].Hash()] = receipts[i] + + // Migrate from active db to ancient db + dl.ancientHeaders[blocks[i].Hash()] = blocks[i].Header() + dl.ancientChainTd[blocks[i].Hash()] = new(big.Int).Add(dl.ancientChainTd[blocks[i].ParentHash()], blocks[i].Difficulty()) + + delete(dl.ownHeaders, blocks[i].Hash()) + delete(dl.ownChainTd, blocks[i].Hash()) + } else { + dl.ownBlocks[blocks[i].Hash()] = blocks[i] + dl.ownReceipts[blocks[i].Hash()] = receipts[i] } - dl.ownBlocks[blocks[i].Hash()] = blocks[i] - dl.ownReceipts[blocks[i].Hash()] = receipts[i] } return len(blocks), nil } @@ -282,6 +335,11 @@ func (dl *downloadTester) Rollback(hashes []common.Hash) { delete(dl.ownHeaders, hashes[i]) delete(dl.ownReceipts, hashes[i]) delete(dl.ownBlocks, hashes[i]) + + delete(dl.ancientChainTd, hashes[i]) + delete(dl.ancientHeaders, hashes[i]) + delete(dl.ancientReceipts, hashes[i]) + delete(dl.ancientBlocks, hashes[i]) } } @@ -409,13 +467,13 @@ func assertOwnForkedChain(t *testing.T, tester *downloadTester, common int, leng if tester.downloader.mode == LightSync { blocks, receipts = 1, 1 } - if hs := len(tester.ownHeaders); hs != headers { + if hs := len(tester.ownHeaders) + len(tester.ancientHeaders) - 1; hs != headers { t.Fatalf("synchronised headers mismatch: have %v, want %v", hs, headers) } - if bs := len(tester.ownBlocks); bs != blocks { + if bs := len(tester.ownBlocks) + len(tester.ancientBlocks) - 1; bs != blocks { t.Fatalf("synchronised blocks mismatch: have %v, want %v", bs, blocks) } - if rs := len(tester.ownReceipts); rs != receipts { + if rs := len(tester.ownReceipts) + len(tester.ancientReceipts) - 1; rs != receipts { t.Fatalf("synchronised receipts mismatch: have %v, want %v", rs, receipts) } } @@ -1049,20 +1107,15 @@ func testBlockHeaderAttackerDropping(t *testing.T, protocol int) { {errUnknownPeer, false}, // Peer is unknown, was already dropped, don't double drop {errBadPeer, true}, // Peer was deemed bad for some reason, drop it {errStallingPeer, true}, // Peer was detected to be stalling, drop it + {errUnsyncedPeer, true}, // Peer was detected to be unsynced, drop it {errNoPeers, false}, // No peers to download from, soft race, no issue {errTimeout, true}, // No hashes received in due time, drop the peer {errEmptyHeaderSet, true}, // No headers were returned as a response, drop as it's a dead end {errPeersUnavailable, true}, // Nobody had the advertised blocks, drop the advertiser {errInvalidAncestor, true}, // Agreed upon ancestor is not acceptable, drop the chain rewriter {errInvalidChain, true}, // Hash chain was detected as invalid, definitely drop - {errInvalidBlock, false}, // A bad peer was detected, but not the sync origin {errInvalidBody, false}, // A bad peer was detected, but not the sync origin {errInvalidReceipt, false}, // A bad peer was detected, but not the sync origin - {errCancelBlockFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop - {errCancelHeaderFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop - {errCancelBodyFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop - {errCancelReceiptFetch, false}, // Synchronisation was canceled, origin may be innocent, don't drop - {errCancelHeaderProcessing, false}, // Synchronisation was canceled, origin may be innocent, don't drop {errCancelContentProcessing, false}, // Synchronisation was canceled, origin may be innocent, don't drop } // Run the tests and check disconnection status @@ -1561,9 +1614,45 @@ func TestRemoteHeaderRequestSpan(t *testing.T) { if failed { res := strings.Replace(fmt.Sprint(data), " ", ",", -1) exp := strings.Replace(fmt.Sprint(tt.expected), " ", ",", -1) - fmt.Printf("got: %v\n", res) - fmt.Printf("exp: %v\n", exp) + t.Logf("got: %v\n", res) + t.Logf("exp: %v\n", exp) t.Errorf("test %d: wrong values", i) } } } + +// Tests that peers below a pre-configured checkpoint block are prevented from +// being fast-synced from, avoiding potential cheap eclipse attacks. +func TestCheckpointEnforcement62(t *testing.T) { testCheckpointEnforcement(t, 62, FullSync) } +func TestCheckpointEnforcement63Full(t *testing.T) { testCheckpointEnforcement(t, 63, FullSync) } +func TestCheckpointEnforcement63Fast(t *testing.T) { testCheckpointEnforcement(t, 63, FastSync) } +func TestCheckpointEnforcement64Full(t *testing.T) { testCheckpointEnforcement(t, 64, FullSync) } +func TestCheckpointEnforcement64Fast(t *testing.T) { testCheckpointEnforcement(t, 64, FastSync) } +func TestCheckpointEnforcement64Light(t *testing.T) { testCheckpointEnforcement(t, 64, LightSync) } + +func testCheckpointEnforcement(t *testing.T, protocol int, mode SyncMode) { + t.Parallel() + + // Create a new tester with a particular hard coded checkpoint block + tester := newTester() + defer tester.terminate() + + tester.downloader.checkpoint = uint64(fsMinFullBlocks) + 256 + chain := testChainBase.shorten(int(tester.downloader.checkpoint) - 1) + + // Attempt to sync with the peer and validate the result + tester.newPeer("peer", protocol, chain) + + var expect error + if mode == FastSync || mode == LightSync { + expect = errUnsyncedPeer + } + if err := tester.sync("peer", nil, mode); err != expect { + t.Fatalf("block sync error mismatch: have %v, want %v", err, expect) + } + if mode == FastSync || mode == LightSync { + assertOwnChain(t, tester, 1) + } else { + assertOwnChain(t, tester, chain.len()) + } +} diff --git a/eth/downloader/events.go b/eth/downloader/events.go index 64905b8f2ac7..25255a3a72e5 100644 --- a/eth/downloader/events.go +++ b/eth/downloader/events.go @@ -16,6 +16,10 @@ package downloader -type DoneEvent struct{} +import "github.com/ethereum/go-ethereum/core/types" + +type DoneEvent struct { + Latest *types.Header +} type StartEvent struct{} type FailedEvent struct{ Err error } diff --git a/eth/downloader/fakepeer.go b/eth/downloader/fakepeer.go index 8c8dc95c590e..3ec90bc9ef08 100644 --- a/eth/downloader/fakepeer.go +++ b/eth/downloader/fakepeer.go @@ -19,11 +19,11 @@ package downloader import ( "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" ) // FakePeer is a mock downloader peer that operates on a local database instance @@ -141,7 +141,7 @@ func (p *FakePeer) RequestBodies(hashes []common.Hash) error { func (p *FakePeer) RequestReceipts(hashes []common.Hash) error { var receipts [][]*types.Receipt for _, hash := range hashes { - receipts = append(receipts, rawdb.ReadReceipts(p.db, hash, *p.hc.GetBlockNumber(hash))) + receipts = append(receipts, rawdb.ReadRawReceipts(p.db, hash, *p.hc.GetBlockNumber(hash))) } p.dl.DeliverReceipts(p.id, receipts) return nil diff --git a/eth/downloader/metrics.go b/eth/downloader/metrics.go index 25ef0f393be3..d4eb33794628 100644 --- a/eth/downloader/metrics.go +++ b/eth/downloader/metrics.go @@ -19,7 +19,7 @@ package downloader import ( - "github.com/nebulaai/nbai-node/metrics" + "github.com/ethereum/go-ethereum/metrics" ) var ( diff --git a/eth/downloader/peer.go b/eth/downloader/peer.go index 790ce04c4da4..60f86d0e14cf 100644 --- a/eth/downloader/peer.go +++ b/eth/downloader/peer.go @@ -29,9 +29,9 @@ import ( "sync/atomic" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" ) const ( diff --git a/eth/downloader/queue.go b/eth/downloader/queue.go index a0de9652704a..7c339538110a 100644 --- a/eth/downloader/queue.go +++ b/eth/downloader/queue.go @@ -25,11 +25,11 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/prque" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/prque" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" ) var ( diff --git a/eth/downloader/statesync.go b/eth/downloader/statesync.go index b958a79e84e2..f875b3a84c28 100644 --- a/eth/downloader/statesync.go +++ b/eth/downloader/statesync.go @@ -22,12 +22,12 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/trie" "golang.org/x/crypto/sha3" ) @@ -59,6 +59,7 @@ type stateSyncStats struct { // syncState starts downloading state with the given root hash. func (d *Downloader) syncState(root common.Hash) *stateSync { + // Create the state sync s := newStateSync(d, root) select { case d.stateSyncStart <- s: @@ -239,7 +240,7 @@ type stateTask struct { func newStateSync(d *Downloader, root common.Hash) *stateSync { return &stateSync{ d: d, - sched: state.NewStateSync(root, d.stateDB), + sched: state.NewStateSync(root, d.stateDB, d.stateBloom), keccak: sha3.NewLegacyKeccak256(), tasks: make(map[common.Hash]*stateTask), deliver: make(chan *stateReq), @@ -301,7 +302,7 @@ func (s *stateSync) loop() (err error) { return errCancelStateFetch case <-s.d.cancelCh: - return errCancelStateFetch + return errCanceled case req := <-s.deliver: // Response, disconnect or timeout triggered, drop the peer if stalling @@ -310,7 +311,23 @@ func (s *stateSync) loop() (err error) { // 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) - s.d.dropPeer(req.peer.id) + if s.d.dropPeer == nil { + // The dropPeer method is nil when `--copydb` is used for a local copy. + // Timeouts can occur if e.g. compaction hits at the wrong time, and can be ignored + req.peer.log.Warn("Downloader wants to drop peer, but peerdrop-function is not set", "peer", req.peer.id) + } else { + s.d.dropPeer(req.peer.id) + + // If this peer was the master peer, abort sync immediately + s.d.cancelLock.RLock() + master := req.peer.id == s.d.cancelPeer + s.d.cancelLock.RUnlock() + + if master { + s.d.cancel() + return errTimeout + } + } } // Process all the received blobs and check for stale delivery delivered, err := s.process(req) @@ -330,7 +347,7 @@ func (s *stateSync) commit(force bool) error { } start := time.Now() b := s.d.stateDB.NewBatch() - if written, err := s.sched.Commit(b); written == 0 || err != nil { + if err := s.sched.Commit(b); err != nil { return err } if err := b.Write(); err != nil { @@ -425,9 +442,7 @@ func (s *stateSync) process(req *stateReq) (int, error) { default: return successful, fmt.Errorf("invalid state node %s: %v", hash.TerminalString(), err) } - if _, ok := req.tasks[hash]; ok { - delete(req.tasks, hash) - } + delete(req.tasks, hash) } // Put unfulfilled tasks back into the retry queue npeers := s.d.peers.Len() diff --git a/eth/downloader/testchain_test.go b/eth/downloader/testchain_test.go index 3c5b660cd789..f410152f5b00 100644 --- a/eth/downloader/testchain_test.go +++ b/eth/downloader/testchain_test.go @@ -21,20 +21,20 @@ import ( "math/big" "sync" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" ) // Test chain parameters. var ( testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") testAddress = crypto.PubkeyToAddress(testKey.PublicKey) - testDB = ethdb.NewMemDatabase() + testDB = rawdb.NewMemoryDatabase() testGenesis = core.GenesisBlockForTesting(testDB, testAddress, big.NewInt(1000000000)) ) @@ -45,7 +45,7 @@ var testChainBase = newTestChain(blockCacheItems+200, testGenesis) var testChainForkLightA, testChainForkLightB, testChainForkHeavy *testChain func init() { - var forkLen = int(MaxForkAncestry + 50) + var forkLen = int(maxForkAncestry + 50) var wg sync.WaitGroup wg.Add(3) go func() { testChainForkLightA = testChainBase.makeFork(forkLen, false, 1); wg.Done() }() diff --git a/eth/downloader/types.go b/eth/downloader/types.go index 0a54102af51c..ff70bfa0e3cc 100644 --- a/eth/downloader/types.go +++ b/eth/downloader/types.go @@ -19,7 +19,7 @@ package downloader import ( "fmt" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/core/types" ) // peerDropFn is a callback type for dropping a peer detected as malicious. diff --git a/eth/enr_entry.go b/eth/enr_entry.go new file mode 100644 index 000000000000..d9e7b95784a2 --- /dev/null +++ b/eth/enr_entry.go @@ -0,0 +1,61 @@ +// Copyright 2019 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 ( + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/forkid" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/rlp" +) + +// ethEntry is the "eth" ENR entry which advertises eth protocol +// on the discovery network. +type ethEntry struct { + ForkID forkid.ID // Fork identifier per EIP-2124 + + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` +} + +// ENRKey implements enr.Entry. +func (e ethEntry) ENRKey() string { + return "eth" +} + +func (eth *Ethereum) startEthEntryUpdate(ln *enode.LocalNode) { + var newHead = make(chan core.ChainHeadEvent, 10) + sub := eth.blockchain.SubscribeChainHeadEvent(newHead) + + go func() { + defer sub.Unsubscribe() + for { + select { + case <-newHead: + ln.Set(eth.currentEthEntry()) + case <-sub.Err(): + // Would be nice to sync with eth.Stop, but there is no + // good way to do that. + return + } + } + }() +} + +func (eth *Ethereum) currentEthEntry() *ethEntry { + return ðEntry{ForkID: forkid.NewID(eth.blockchain)} +} diff --git a/eth/fetcher/fetcher.go b/eth/fetcher/fetcher.go index ee609920d761..28c532d9bdad 100644 --- a/eth/fetcher/fetcher.go +++ b/eth/fetcher/fetcher.go @@ -22,11 +22,11 @@ import ( "math/rand" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/prque" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/prque" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" ) const ( @@ -110,7 +110,6 @@ type Fetcher struct { notify chan *announce inject chan *inject - blockFilter chan chan []*types.Block headerFilter chan chan *headerFilterTask bodyFilter chan chan *bodyFilterTask @@ -150,7 +149,6 @@ func New(getBlock blockRetrievalFn, verifyHeader headerVerifierFn, broadcastBloc return &Fetcher{ notify: make(chan *announce), inject: make(chan *inject), - blockFilter: make(chan chan []*types.Block), headerFilter: make(chan chan *headerFilterTask), bodyFilter: make(chan chan *bodyFilterTask), done: make(chan common.Hash), @@ -687,7 +685,7 @@ func (f *Fetcher) forgetHash(hash common.Hash) { // Remove all pending announces and decrement DOS counters for _, announce := range f.announced[hash] { f.announces[announce.origin]-- - if f.announces[announce.origin] == 0 { + if f.announces[announce.origin] <= 0 { delete(f.announces, announce.origin) } } @@ -698,7 +696,7 @@ func (f *Fetcher) forgetHash(hash common.Hash) { // Remove any pending fetches and decrement the DOS counters if announce := f.fetching[hash]; announce != nil { f.announces[announce.origin]-- - if f.announces[announce.origin] == 0 { + if f.announces[announce.origin] <= 0 { delete(f.announces, announce.origin) } delete(f.fetching, hash) @@ -707,7 +705,7 @@ func (f *Fetcher) forgetHash(hash common.Hash) { // Remove any pending completion requests and decrement the DOS counters for _, announce := range f.fetched[hash] { f.announces[announce.origin]-- - if f.announces[announce.origin] == 0 { + if f.announces[announce.origin] <= 0 { delete(f.announces, announce.origin) } } @@ -716,7 +714,7 @@ func (f *Fetcher) forgetHash(hash common.Hash) { // Remove any pending completions and decrement the DOS counters if announce := f.completing[hash]; announce != nil { f.announces[announce.origin]-- - if f.announces[announce.origin] == 0 { + if f.announces[announce.origin] <= 0 { delete(f.announces, announce.origin) } delete(f.completing, hash) diff --git a/eth/fetcher/fetcher_test.go b/eth/fetcher/fetcher_test.go index db63b1678052..83172c5348f4 100644 --- a/eth/fetcher/fetcher_test.go +++ b/eth/fetcher/fetcher_test.go @@ -24,17 +24,17 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" ) var ( - testdb = ethdb.NewMemDatabase() + testdb = rawdb.NewMemoryDatabase() testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") testAddress = crypto.PubkeyToAddress(testKey.PublicKey) genesis = core.GenesisBlockForTesting(testdb, testAddress, big.NewInt(1000000000)) @@ -244,7 +244,7 @@ func verifyImportEvent(t *testing.T, imported chan *types.Block, arrive bool) { select { case <-imported: t.Fatalf("import invoked") - case <-time.After(10 * time.Millisecond): + case <-time.After(20 * time.Millisecond): } } } diff --git a/eth/fetcher/metrics.go b/eth/fetcher/metrics.go index 994a34b5bef5..d68d12f000f7 100644 --- a/eth/fetcher/metrics.go +++ b/eth/fetcher/metrics.go @@ -19,7 +19,7 @@ package fetcher import ( - "github.com/nebulaai/nbai-node/metrics" + "github.com/ethereum/go-ethereum/metrics" ) var ( diff --git a/eth/filters/api.go b/eth/filters/api.go index 5beb39c0f3bc..5ed80a887563 100644 --- a/eth/filters/api.go +++ b/eth/filters/api.go @@ -25,13 +25,13 @@ import ( "sync" "time" - ethereum "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/rpc" + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/rpc" ) var ( diff --git a/eth/filters/api_test.go b/eth/filters/api_test.go index d173d3bbac74..02229a7549a7 100644 --- a/eth/filters/api_test.go +++ b/eth/filters/api_test.go @@ -21,8 +21,8 @@ import ( "fmt" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/rpc" ) func TestUnmarshalJSONNewFilterArgs(t *testing.T) { diff --git a/eth/filters/bench_test.go b/eth/filters/bench_test.go index f7ede97ff601..fc7e6f5273ce 100644 --- a/eth/filters/bench_test.go +++ b/eth/filters/bench_test.go @@ -17,20 +17,19 @@ package filters import ( - "bytes" "context" "fmt" "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/bitutil" - "github.com/nebulaai/nbai-node/core/bloombits" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/node" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/bitutil" + "github.com/ethereum/go-ethereum/core/bloombits" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/node" ) func BenchmarkBloomBits512(b *testing.B) { @@ -65,9 +64,9 @@ const benchFilterCnt = 2000 func benchmarkBloomBits(b *testing.B, sectionSize uint64) { benchDataDir := node.DefaultDataDir() + "/geth/chaindata" - fmt.Println("Running bloombits benchmark section size:", sectionSize) + b.Log("Running bloombits benchmark section size:", sectionSize) - db, err := ethdb.NewLDBDatabase(benchDataDir, 128, 1024) + db, err := rawdb.NewLevelDBDatabase(benchDataDir, 128, 1024, "") if err != nil { b.Fatalf("error opening database at %v: %v", benchDataDir, err) } @@ -77,7 +76,7 @@ func benchmarkBloomBits(b *testing.B, sectionSize uint64) { } clearBloomBits(db) - fmt.Println("Generating bloombits data...") + b.Log("Generating bloombits data...") headNum := rawdb.ReadHeaderNumber(db, head) if headNum == nil || *headNum < sectionSize+512 { b.Fatalf("not enough blocks for running a benchmark") @@ -112,16 +111,16 @@ func benchmarkBloomBits(b *testing.B, sectionSize uint64) { rawdb.WriteBloomBits(db, uint(i), sectionIdx, sectionHead, comp) } //if sectionIdx%50 == 0 { - // fmt.Println(" section", sectionIdx, "/", cnt) + // b.Log(" 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)) + b.Log("Finished generating bloombits data") + b.Log(" ", d, "total ", d/time.Duration(cnt*sectionSize), "per block") + b.Log(" data size:", dataSize, " compressed size:", compSize, " compression ratio:", float64(compSize)/float64(dataSize)) - fmt.Println("Running filter benchmarks...") + b.Log("Running filter benchmarks...") start = time.Now() mux := new(event.TypeMux) var backend *testBackend @@ -129,7 +128,7 @@ func benchmarkBloomBits(b *testing.B, sectionSize uint64) { for i := 0; i < benchFilterCnt; i++ { if i%20 == 0 { db.Close() - db, _ = ethdb.NewLDBDatabase(benchDataDir, 128, 1024) + db, _ = rawdb.NewLevelDBDatabase(benchDataDir, 128, 1024, "") backend = &testBackend{mux, db, cnt, new(event.Feed), new(event.Feed), new(event.Feed), new(event.Feed)} } var addr common.Address @@ -141,42 +140,26 @@ func benchmarkBloomBits(b *testing.B, sectionSize uint64) { } } 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") + b.Log("Finished running filter benchmarks") + b.Log(" ", 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) - }) + it := db.NewIteratorWithPrefix(bloomBitsPrefix) + for it.Next() { + db.Delete(it.Key()) + } + it.Release() } func BenchmarkNoBloomBits(b *testing.B) { benchDataDir := node.DefaultDataDir() + "/geth/chaindata" - fmt.Println("Running benchmark without bloombits") - db, err := ethdb.NewLDBDatabase(benchDataDir, 128, 1024) + b.Log("Running benchmark without bloombits") + db, err := rawdb.NewLevelDBDatabase(benchDataDir, 128, 1024, "") if err != nil { b.Fatalf("error opening database at %v: %v", benchDataDir, err) } @@ -188,14 +171,14 @@ func BenchmarkNoBloomBits(b *testing.B) { clearBloomBits(db) - fmt.Println("Running filter benchmarks...") + b.Log("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 := NewRangeFilter(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") + b.Log("Finished running filter benchmarks") + b.Log(" ", 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 8bf887f12e23..071613ad7a15 100644 --- a/eth/filters/filter.go +++ b/eth/filters/filter.go @@ -21,13 +21,13 @@ import ( "errors" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/bloombits" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/rpc" ) type Backend interface { diff --git a/eth/filters/filter_system.go b/eth/filters/filter_system.go index 51af80cb7c1f..70139c1a96ec 100644 --- a/eth/filters/filter_system.go +++ b/eth/filters/filter_system.go @@ -25,14 +25,14 @@ import ( "sync" "time" - ethereum "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rpc" + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rpc" ) // Type determines the kind of filter and is used to put the filter in to diff --git a/eth/filters/filter_system_test.go b/eth/filters/filter_system_test.go index d9888746de08..93cb43123f70 100644 --- a/eth/filters/filter_system_test.go +++ b/eth/filters/filter_system_test.go @@ -25,17 +25,17 @@ import ( "testing" "time" - ethereum "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/bloombits" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rpc" + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" ) type testBackend struct { @@ -85,7 +85,7 @@ func (b *testBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*type func (b *testBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) { if number := rawdb.ReadHeaderNumber(b.db, hash); number != nil { - return rawdb.ReadReceipts(b.db, hash, *number), nil + return rawdb.ReadReceipts(b.db, hash, *number, params.TestChainConfig), nil } return nil, nil } @@ -95,7 +95,7 @@ func (b *testBackend) GetLogs(ctx context.Context, hash common.Hash) ([][]*types if number == nil { return nil, nil } - receipts := rawdb.ReadReceipts(b.db, hash, *number) + receipts := rawdb.ReadReceipts(b.db, hash, *number, params.TestChainConfig) logs := make([][]*types.Log, len(receipts)) for i, receipt := range receipts { @@ -161,7 +161,7 @@ func TestBlockSubscription(t *testing.T) { var ( mux = new(event.TypeMux) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) @@ -218,7 +218,7 @@ func TestPendingTxFilter(t *testing.T) { var ( mux = new(event.TypeMux) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) @@ -278,7 +278,7 @@ func TestPendingTxFilter(t *testing.T) { func TestLogFilterCreation(t *testing.T) { var ( mux = new(event.TypeMux) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) @@ -327,7 +327,7 @@ func TestInvalidLogFilterCreation(t *testing.T) { var ( mux = new(event.TypeMux) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) @@ -354,7 +354,7 @@ func TestInvalidLogFilterCreation(t *testing.T) { func TestInvalidGetLogsRequest(t *testing.T) { var ( mux = new(event.TypeMux) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) @@ -384,7 +384,7 @@ func TestLogFilter(t *testing.T) { var ( mux = new(event.TypeMux) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) @@ -503,7 +503,7 @@ func TestPendingLogsSubscription(t *testing.T) { var ( mux = new(event.TypeMux) - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) logsFeed = new(event.Feed) diff --git a/eth/filters/filter_test.go b/eth/filters/filter_test.go index 55ab39bd4ba0..eafa19cdfa22 100644 --- a/eth/filters/filter_test.go +++ b/eth/filters/filter_test.go @@ -23,15 +23,14 @@ import ( "os" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/params" ) func makeReceipt(addr common.Address) *types.Receipt { @@ -51,7 +50,7 @@ func BenchmarkFilters(b *testing.B) { defer os.RemoveAll(dir) var ( - db, _ = ethdb.NewLDBDatabase(dir, 0, 0) + db, _ = rawdb.NewLevelDBDatabase(dir, 0, 0, "") mux = new(event.TypeMux) txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) @@ -110,7 +109,7 @@ func TestFilters(t *testing.T) { defer os.RemoveAll(dir) var ( - db, _ = ethdb.NewLDBDatabase(dir, 0, 0) + db, _ = rawdb.NewLevelDBDatabase(dir, 0, 0, "") mux = new(event.TypeMux) txFeed = new(event.Feed) rmLogsFeed = new(event.Feed) @@ -139,6 +138,7 @@ func TestFilters(t *testing.T) { }, } gen.AddUncheckedReceipt(receipt) + gen.AddUncheckedTx(types.NewTransaction(1, common.HexToAddress("0x1"), big.NewInt(1), 1, big.NewInt(1), nil)) case 2: receipt := types.NewReceipt(nil, false, 0) receipt.Logs = []*types.Log{ @@ -148,6 +148,8 @@ func TestFilters(t *testing.T) { }, } gen.AddUncheckedReceipt(receipt) + gen.AddUncheckedTx(types.NewTransaction(2, common.HexToAddress("0x2"), big.NewInt(2), 2, big.NewInt(2), nil)) + case 998: receipt := types.NewReceipt(nil, false, 0) receipt.Logs = []*types.Log{ @@ -157,6 +159,7 @@ func TestFilters(t *testing.T) { }, } gen.AddUncheckedReceipt(receipt) + gen.AddUncheckedTx(types.NewTransaction(998, common.HexToAddress("0x998"), big.NewInt(998), 998, big.NewInt(998), nil)) case 999: receipt := types.NewReceipt(nil, false, 0) receipt.Logs = []*types.Log{ @@ -166,6 +169,7 @@ func TestFilters(t *testing.T) { }, } gen.AddUncheckedReceipt(receipt) + gen.AddUncheckedTx(types.NewTransaction(999, common.HexToAddress("0x999"), big.NewInt(999), 999, big.NewInt(999), nil)) } }) for i, block := range chain { diff --git a/eth/gasprice/gasprice.go b/eth/gasprice/gasprice.go index f2cfdf6679df..3b8db78a1cc7 100644 --- a/eth/gasprice/gasprice.go +++ b/eth/gasprice/gasprice.go @@ -22,11 +22,11 @@ import ( "sort" "sync" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/internal/ethapi" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" ) var maxPrice = big.NewInt(500 * params.GWei) diff --git a/eth/gen_config.go b/eth/gen_config.go index 911ce34468ed..bc4b55b120fa 100644 --- a/eth/gen_config.go +++ b/eth/gen_config.go @@ -6,16 +6,15 @@ import ( "math/big" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/eth/gasprice" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/eth/gasprice" + "github.com/ethereum/go-ethereum/miner" + "github.com/ethereum/go-ethereum/params" ) -var _ = (*configMarshaling)(nil) - // MarshalTOML marshals as TOML. func (c Config) MarshalTOML() (interface{}, error) { type Config struct { @@ -23,22 +22,23 @@ func (c Config) MarshalTOML() (interface{}, error) { NetworkId uint64 SyncMode downloader.SyncMode NoPruning bool - LightServ int `toml:",omitempty"` - LightPeers int `toml:",omitempty"` - SkipBcVersionCheck bool `toml:"-"` - DatabaseHandles int `toml:"-"` + NoPrefetch bool + Whitelist map[uint64]common.Hash `toml:"-"` + LightServ int `toml:",omitempty"` + LightIngress int `toml:",omitempty"` + LightEgress int `toml:",omitempty"` + LightPeers int `toml:",omitempty"` + UltraLightServers []string `toml:",omitempty"` + UltraLightFraction int `toml:",omitempty"` + UltraLightOnlyAnnounce bool `toml:",omitempty"` + SkipBcVersionCheck bool `toml:"-"` + DatabaseHandles int `toml:"-"` DatabaseCache int + DatabaseFreezer string TrieCleanCache int TrieDirtyCache int TrieTimeout time.Duration - Etherbase common.Address `toml:",omitempty"` - MinerNotify []string `toml:",omitempty"` - MinerExtraData hexutil.Bytes `toml:",omitempty"` - MinerGasFloor uint64 - MinerGasCeil uint64 - MinerGasPrice *big.Int - MinerRecommit time.Duration - MinerNoverify bool + Miner miner.Config Ethash ethash.Config TxPool core.TxPoolConfig GPO gasprice.Config @@ -46,28 +46,32 @@ func (c Config) MarshalTOML() (interface{}, error) { DocRoot string `toml:"-"` EWASMInterpreter string EVMInterpreter string + RPCGasCap *big.Int `toml:",omitempty"` + Checkpoint *params.TrustedCheckpoint `toml:",omitempty"` + CheckpointOracle *params.CheckpointOracleConfig `toml:",omitempty"` } var enc Config enc.Genesis = c.Genesis enc.NetworkId = c.NetworkId enc.SyncMode = c.SyncMode enc.NoPruning = c.NoPruning + enc.NoPrefetch = c.NoPrefetch + enc.Whitelist = c.Whitelist enc.LightServ = c.LightServ + enc.LightIngress = c.LightIngress + enc.LightEgress = c.LightEgress enc.LightPeers = c.LightPeers + enc.UltraLightServers = c.UltraLightServers + enc.UltraLightFraction = c.UltraLightFraction + enc.UltraLightOnlyAnnounce = c.UltraLightOnlyAnnounce enc.SkipBcVersionCheck = c.SkipBcVersionCheck enc.DatabaseHandles = c.DatabaseHandles enc.DatabaseCache = c.DatabaseCache + enc.DatabaseFreezer = c.DatabaseFreezer enc.TrieCleanCache = c.TrieCleanCache enc.TrieDirtyCache = c.TrieDirtyCache enc.TrieTimeout = c.TrieTimeout - enc.Etherbase = c.Etherbase - enc.MinerNotify = c.MinerNotify - enc.MinerExtraData = c.MinerExtraData - enc.MinerGasFloor = c.MinerGasFloor - enc.MinerGasCeil = c.MinerGasCeil - enc.MinerGasPrice = c.MinerGasPrice - enc.MinerRecommit = c.MinerRecommit - enc.MinerNoverify = c.MinerNoverify + enc.Miner = c.Miner enc.Ethash = c.Ethash enc.TxPool = c.TxPool enc.GPO = c.GPO @@ -75,6 +79,9 @@ func (c Config) MarshalTOML() (interface{}, error) { enc.DocRoot = c.DocRoot enc.EWASMInterpreter = c.EWASMInterpreter enc.EVMInterpreter = c.EVMInterpreter + enc.RPCGasCap = c.RPCGasCap + enc.Checkpoint = c.Checkpoint + enc.CheckpointOracle = c.CheckpointOracle return &enc, nil } @@ -85,22 +92,23 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { NetworkId *uint64 SyncMode *downloader.SyncMode NoPruning *bool - LightServ *int `toml:",omitempty"` - LightPeers *int `toml:",omitempty"` - SkipBcVersionCheck *bool `toml:"-"` - DatabaseHandles *int `toml:"-"` + NoPrefetch *bool + Whitelist map[uint64]common.Hash `toml:"-"` + LightServ *int `toml:",omitempty"` + LightIngress *int `toml:",omitempty"` + LightEgress *int `toml:",omitempty"` + LightPeers *int `toml:",omitempty"` + UltraLightServers []string `toml:",omitempty"` + UltraLightFraction *int `toml:",omitempty"` + UltraLightOnlyAnnounce *bool `toml:",omitempty"` + SkipBcVersionCheck *bool `toml:"-"` + DatabaseHandles *int `toml:"-"` DatabaseCache *int + DatabaseFreezer *string TrieCleanCache *int TrieDirtyCache *int TrieTimeout *time.Duration - Etherbase *common.Address `toml:",omitempty"` - MinerNotify []string `toml:",omitempty"` - MinerExtraData *hexutil.Bytes `toml:",omitempty"` - MinerGasFloor *uint64 - MinerGasCeil *uint64 - MinerGasPrice *big.Int - MinerRecommit *time.Duration - MinerNoverify *bool + Miner *miner.Config Ethash *ethash.Config TxPool *core.TxPoolConfig GPO *gasprice.Config @@ -108,6 +116,9 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { DocRoot *string `toml:"-"` EWASMInterpreter *string EVMInterpreter *string + RPCGasCap *big.Int `toml:",omitempty"` + Checkpoint *params.TrustedCheckpoint `toml:",omitempty"` + CheckpointOracle *params.CheckpointOracleConfig `toml:",omitempty"` } var dec Config if err := unmarshal(&dec); err != nil { @@ -125,12 +136,33 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.NoPruning != nil { c.NoPruning = *dec.NoPruning } + if dec.NoPrefetch != nil { + c.NoPrefetch = *dec.NoPrefetch + } + if dec.Whitelist != nil { + c.Whitelist = dec.Whitelist + } if dec.LightServ != nil { c.LightServ = *dec.LightServ } + if dec.LightIngress != nil { + c.LightIngress = *dec.LightIngress + } + if dec.LightEgress != nil { + c.LightEgress = *dec.LightEgress + } if dec.LightPeers != nil { c.LightPeers = *dec.LightPeers } + if dec.UltraLightServers != nil { + c.UltraLightServers = dec.UltraLightServers + } + if dec.UltraLightFraction != nil { + c.UltraLightFraction = *dec.UltraLightFraction + } + if dec.UltraLightOnlyAnnounce != nil { + c.UltraLightOnlyAnnounce = *dec.UltraLightOnlyAnnounce + } if dec.SkipBcVersionCheck != nil { c.SkipBcVersionCheck = *dec.SkipBcVersionCheck } @@ -140,6 +172,9 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.DatabaseCache != nil { c.DatabaseCache = *dec.DatabaseCache } + if dec.DatabaseFreezer != nil { + c.DatabaseFreezer = *dec.DatabaseFreezer + } if dec.TrieCleanCache != nil { c.TrieCleanCache = *dec.TrieCleanCache } @@ -149,29 +184,8 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.TrieTimeout != nil { c.TrieTimeout = *dec.TrieTimeout } - if dec.Etherbase != nil { - c.Etherbase = *dec.Etherbase - } - if dec.MinerNotify != nil { - c.MinerNotify = dec.MinerNotify - } - if dec.MinerExtraData != nil { - c.MinerExtraData = *dec.MinerExtraData - } - if dec.MinerGasFloor != nil { - c.MinerGasFloor = *dec.MinerGasFloor - } - if dec.MinerGasCeil != nil { - c.MinerGasCeil = *dec.MinerGasCeil - } - if dec.MinerGasPrice != nil { - c.MinerGasPrice = dec.MinerGasPrice - } - if dec.MinerRecommit != nil { - c.MinerRecommit = *dec.MinerRecommit - } - if dec.MinerNoverify != nil { - c.MinerNoverify = *dec.MinerNoverify + if dec.Miner != nil { + c.Miner = *dec.Miner } if dec.Ethash != nil { c.Ethash = *dec.Ethash @@ -194,5 +208,14 @@ func (c *Config) UnmarshalTOML(unmarshal func(interface{}) error) error { if dec.EVMInterpreter != nil { c.EVMInterpreter = *dec.EVMInterpreter } + if dec.RPCGasCap != nil { + c.RPCGasCap = dec.RPCGasCap + } + if dec.Checkpoint != nil { + c.Checkpoint = dec.Checkpoint + } + if dec.CheckpointOracle != nil { + c.CheckpointOracle = dec.CheckpointOracle + } return nil } diff --git a/eth/handler.go b/eth/handler.go index e7fd0cd7f535..d2355a87680c 100644 --- a/eth/handler.go +++ b/eth/handler.go @@ -26,20 +26,21 @@ import ( "sync/atomic" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/consensus/misc" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/eth/fetcher" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/forkid" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/eth/fetcher" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" ) const ( @@ -55,34 +56,31 @@ const ( ) var ( - daoChallengeTimeout = 15 * time.Second // Time allowance for a node to reply to the DAO handshake challenge + syncChallengeTimeout = 15 * time.Second // Time allowance for a node to reply to the sync progress challenge ) -// errIncompatibleConfig is returned if the requested protocols and configs are -// not compatible (low protocol version restrictions and high requirements). -var errIncompatibleConfig = errors.New("incompatible configuration") - func errResp(code errCode, format string, v ...interface{}) error { return fmt.Errorf("%v - %v", code, fmt.Sprintf(format, v...)) } type ProtocolManager struct { - networkID uint64 + networkID uint64 + forkFilter forkid.Filter // Fork ID filter, constant across the lifetime of the node fastSync uint32 // Flag whether fast sync is enabled (gets disabled if we already have blocks) acceptTxs uint32 // Flag whether we're considered synchronised (enables transaction processing) - txpool txPool - blockchain *core.BlockChain - chainconfig *params.ChainConfig - maxPeers int + checkpointNumber uint64 // Block number for the sync progress validator to cross reference + checkpointHash common.Hash // Block hash for the sync progress validator to cross reference + + txpool txPool + blockchain *core.BlockChain + maxPeers int downloader *downloader.Downloader fetcher *fetcher.Fetcher peers *peerSet - SubProtocols []p2p.Protocol - eventMux *event.TypeMux txsCh chan core.NewTxsEvent txsSub event.Subscription @@ -103,14 +101,14 @@ 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, mux *event.TypeMux, txpool txPool, engine consensus.Engine, blockchain *core.BlockChain, chaindb ethdb.Database, whitelist map[uint64]common.Hash) (*ProtocolManager, error) { +func NewProtocolManager(config *params.ChainConfig, checkpoint *params.TrustedCheckpoint, mode downloader.SyncMode, networkID uint64, mux *event.TypeMux, txpool txPool, engine consensus.Engine, blockchain *core.BlockChain, chaindb ethdb.Database, cacheLimit int, whitelist map[uint64]common.Hash) (*ProtocolManager, error) { // Create the protocol manager with the base fields manager := &ProtocolManager{ networkID: networkID, + forkFilter: forkid.NewFilter(blockchain), eventMux: mux, txpool: txpool, blockchain: blockchain, - chainconfig: config, peers: newPeerSet(), whitelist: whitelist, newPeerCh: make(chan *peer), @@ -118,55 +116,45 @@ func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, ne txsyncCh: make(chan *txsync), quitSync: make(chan struct{}), } - // Figure out whether to allow fast sync or not - if mode == downloader.FastSync && blockchain.CurrentBlock().NumberU64() > 0 { - log.Warn("Blockchain not empty, fast sync disabled") - mode = downloader.FullSync - } - if mode == downloader.FastSync { - manager.fastSync = uint32(1) + if mode == downloader.FullSync { + // The database seems empty as the current block is the genesis. Yet the fast + // block is ahead, so fast sync was enabled for this node at a certain point. + // The scenarios where this can happen is + // * if the user manually (or via a bad block) rolled back a fast sync node + // below the sync point. + // * the last fast sync is not finished while user specifies a full sync this + // time. But we don't have any recent state for full sync. + // In these cases however it's safe to reenable fast sync. + fullBlock, fastBlock := blockchain.CurrentBlock(), blockchain.CurrentFastBlock() + if fullBlock.NumberU64() == 0 && fastBlock.NumberU64() > 0 { + manager.fastSync = uint32(1) + log.Warn("Switch sync mode from full sync to fast sync") + } + } else { + if blockchain.CurrentBlock().NumberU64() > 0 { + // Print warning log if database is not empty to run fast sync. + log.Warn("Switch sync mode from fast sync to full sync") + } else { + // If fast sync was requested and our database is empty, grant it + manager.fastSync = uint32(1) + } } - // Initiate a sub-protocol for every implemented version we can handle - manager.SubProtocols = make([]p2p.Protocol, 0, len(ProtocolVersions)) - for i, version := range ProtocolVersions { - // Skip protocol version if incompatible with the mode of operation - if mode == downloader.FastSync && version < eth63 { - continue - } - // Compatible; initialise the sub-protocol - version := version // Closure for the run - manager.SubProtocols = append(manager.SubProtocols, p2p.Protocol{ - Name: ProtocolName, - Version: version, - Length: ProtocolLengths[i], - Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error { - peer := manager.newPeer(int(version), p, rw) - select { - case manager.newPeerCh <- peer: - manager.wg.Add(1) - defer manager.wg.Done() - return manager.handle(peer) - case <-manager.quitSync: - return p2p.DiscQuitting - } - }, - NodeInfo: func() interface{} { - return manager.NodeInfo() - }, - PeerInfo: func(id enode.ID) interface{} { - if p := manager.peers.Peer(fmt.Sprintf("%x", id[:8])); p != nil { - return p.Info() - } - return nil - }, - }) + // If we have trusted checkpoints, enforce them on the chain + if checkpoint != nil { + manager.checkpointNumber = (checkpoint.SectionIndex+1)*params.CHTFrequency - 1 + manager.checkpointHash = checkpoint.SectionHead } - if len(manager.SubProtocols) == 0 { - return nil, errIncompatibleConfig + + // Construct the downloader (long sync) and its backing state bloom if fast + // sync is requested. The downloader is responsible for deallocating the state + // bloom when it's done. + var stateBloom *trie.SyncBloom + if atomic.LoadUint32(&manager.fastSync) == 1 { + stateBloom = trie.NewSyncBloom(uint64(cacheLimit), chaindb) } - // Construct the different synchronisation mechanisms - manager.downloader = downloader.New(mode, chaindb, manager.eventMux, blockchain, nil, manager.removePeer) + manager.downloader = downloader.New(manager.checkpointNumber, chaindb, stateBloom, manager.eventMux, blockchain, nil, manager.removePeer) + // Construct the fetcher (short sync) validator := func(header *types.Header) error { return engine.VerifyHeader(blockchain, header, true) } @@ -174,19 +162,69 @@ func NewProtocolManager(config *params.ChainConfig, mode downloader.SyncMode, ne return blockchain.CurrentBlock().NumberU64() } inserter := func(blocks types.Blocks) (int, error) { - // If fast sync is running, deny importing weird blocks + // If sync hasn't reached the checkpoint yet, deny importing weird blocks. + // + // Ideally we would also compare the head block's timestamp and similarly reject + // the propagated block if the head is too old. Unfortunately there is a corner + // case when starting new networks, where the genesis might be ancient (0 unix) + // which would prevent full nodes from accepting it. + if manager.blockchain.CurrentBlock().NumberU64() < manager.checkpointNumber { + log.Warn("Unsynced yet, discarded propagated block", "number", blocks[0].Number(), "hash", blocks[0].Hash()) + return 0, nil + } + // If fast sync is running, deny importing weird blocks. This is a problematic + // clause when starting up a new network, because fast-syncing miners might not + // accept each others' blocks until a restart. Unfortunately we haven't figured + // out a way yet where nodes can decide unilaterally whether the network is new + // or not. This should be fixed if we figure out a solution. if atomic.LoadUint32(&manager.fastSync) == 1 { - log.Warn("Discarded bad propagated block", "number", blocks[0].Number(), "hash", blocks[0].Hash()) + log.Warn("Fast syncing, discarded propagated block", "number", blocks[0].Number(), "hash", blocks[0].Hash()) return 0, nil } - atomic.StoreUint32(&manager.acceptTxs, 1) // Mark initial sync done on any fetcher import - return manager.blockchain.InsertChain(blocks) + n, err := manager.blockchain.InsertChain(blocks) + if err == nil { + atomic.StoreUint32(&manager.acceptTxs, 1) // Mark initial sync done on any fetcher import + } + return n, err } manager.fetcher = fetcher.New(blockchain.GetBlockByHash, validator, manager.BroadcastBlock, heighter, inserter, manager.removePeer) return manager, nil } +func (pm *ProtocolManager) makeProtocol(version uint) p2p.Protocol { + length, ok := protocolLengths[version] + if !ok { + panic("makeProtocol for unknown version") + } + + return p2p.Protocol{ + Name: protocolName, + Version: version, + Length: length, + Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error { + peer := pm.newPeer(int(version), p, rw) + select { + case pm.newPeerCh <- peer: + pm.wg.Add(1) + defer pm.wg.Done() + return pm.handle(peer) + case <-pm.quitSync: + return p2p.DiscQuitting + } + }, + NodeInfo: func() interface{} { + return pm.NodeInfo() + }, + PeerInfo: func(id enode.ID) interface{} { + if p := pm.peers.Peer(fmt.Sprintf("%x", id[:8])); p != nil { + return p.Info() + } + return nil + }, + } +} + func (pm *ProtocolManager) removePeer(id string) { // Short circuit if the peer was already removed peer := pm.peers.Peer(id) @@ -269,7 +307,7 @@ func (pm *ProtocolManager) handle(p *peer) error { number = head.Number.Uint64() td = pm.blockchain.GetTd(hash, number) ) - if err := p.Handshake(pm.networkID, td, hash, genesis.Hash()); err != nil { + if err := p.Handshake(pm.networkID, td, hash, genesis.Hash(), forkid.NewID(pm.blockchain), pm.forkFilter); err != nil { p.Log().Debug("Ethereum handshake failed", "err", err) return err } @@ -291,22 +329,22 @@ func (pm *ProtocolManager) handle(p *peer) error { // after this will be sent via broadcasts. pm.syncTransactions(p) - // If we're DAO hard-fork aware, validate any remote peer with regard to the hard-fork - if daoBlock := pm.chainconfig.DAOForkBlock; daoBlock != nil { - // Request the peer's DAO fork header for extra-data validation - if err := p.RequestHeadersByNumber(daoBlock.Uint64(), 1, 0, false); err != nil { + // If we have a trusted CHT, reject all peers below that (avoid fast sync eclipse) + if pm.checkpointHash != (common.Hash{}) { + // Request the peer's checkpoint header for chain height/weight validation + if err := p.RequestHeadersByNumber(pm.checkpointNumber, 1, 0, false); err != nil { return err } // Start a timer to disconnect if the peer doesn't reply in time - p.forkDrop = time.AfterFunc(daoChallengeTimeout, func() { - p.Log().Debug("Timed out DAO fork-check, dropping") + p.syncDrop = time.AfterFunc(syncChallengeTimeout, func() { + p.Log().Warn("Checkpoint challenge timed out, dropping", "addr", p.RemoteAddr(), "type", p.Name()) pm.removePeer(p.id) }) // Make sure it's cleaned up if the peer dies off defer func() { - if p.forkDrop != nil { - p.forkDrop.Stop() - p.forkDrop = nil + if p.syncDrop != nil { + p.syncDrop.Stop() + p.syncDrop = nil } }() } @@ -333,8 +371,8 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err != nil { return err } - if msg.Size > ProtocolMaxMsgSize { - return errResp(ErrMsgTooLarge, "%v > %v", msg.Size, ProtocolMaxMsgSize) + if msg.Size > protocolMaxMsgSize { + return errResp(ErrMsgTooLarge, "%v > %v", msg.Size, protocolMaxMsgSize) } defer msg.Discard() @@ -438,41 +476,33 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err := msg.Decode(&headers); err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) } - // If no headers were received, but we're expending a DAO fork check, maybe it's that - if len(headers) == 0 && p.forkDrop != nil { - // Possibly an empty reply to the fork header checks, sanity check TDs - verifyDAO := true - - // If we already have a DAO header, we can check the peer's TD against it. If - // the peer's ahead of this, it too must have a reply to the DAO check - if daoHeader := pm.blockchain.GetHeaderByNumber(pm.chainconfig.DAOForkBlock.Uint64()); daoHeader != nil { - if _, td := p.Head(); td.Cmp(pm.blockchain.GetTd(daoHeader.Hash(), daoHeader.Number.Uint64())) >= 0 { - verifyDAO = false - } - } - // If we're seemingly on the same chain, disable the drop timer - if verifyDAO { - p.Log().Debug("Seems to be on the same side of the DAO fork") - p.forkDrop.Stop() - p.forkDrop = nil - return nil + // If no headers were received, but we're expencting a checkpoint header, consider it that + if len(headers) == 0 && p.syncDrop != nil { + // Stop the timer either way, decide later to drop or not + p.syncDrop.Stop() + p.syncDrop = nil + + // If we're doing a fast sync, we must enforce the checkpoint block to avoid + // eclipse attacks. Unsynced nodes are welcome to connect after we're done + // joining the network + if atomic.LoadUint32(&pm.fastSync) == 1 { + p.Log().Warn("Dropping unsynced node during fast sync", "addr", p.RemoteAddr(), "type", p.Name()) + return errors.New("unsynced node cannot serve fast sync") } } // Filter out any explicitly requested headers, deliver the rest to the downloader filter := len(headers) == 1 if filter { - // If it's a potential DAO fork check, validate against the rules - if p.forkDrop != nil && pm.chainconfig.DAOForkBlock.Cmp(headers[0].Number) == 0 { - // Disable the fork drop timer - p.forkDrop.Stop() - p.forkDrop = nil + // If it's a potential sync progress check, validate the content and advertised chain weight + if p.syncDrop != nil && headers[0].Number.Uint64() == pm.checkpointNumber { + // Disable the sync drop timer + p.syncDrop.Stop() + p.syncDrop = nil // Validate the header and either drop the peer or continue - if err := misc.VerifyDAOHeaderExtraData(pm.chainconfig, headers[0]); err != nil { - p.Log().Debug("Verified to be on the other side of the DAO fork, dropping") - return err + if headers[0].Hash() != pm.checkpointHash { + return errors.New("checkpoint hash mismatch") } - p.Log().Debug("Verified to be on the same side of the DAO fork") return nil } // Otherwise if it's a whitelisted block, validate against the set @@ -657,6 +687,9 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err := msg.Decode(&request); err != nil { return errResp(ErrDecode, "%v: %v", msg, err) } + if err := request.sanityCheck(); err != nil { + return err + } request.Block.ReceivedAt = msg.ReceivedAt request.Block.ReceivedFrom = p diff --git a/eth/handler_test.go b/eth/handler_test.go index 31fbcce730d1..05ddca3efd42 100644 --- a/eth/handler_test.go +++ b/eth/handler_test.go @@ -24,52 +24,23 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/params" ) -// Tests that protocol versions and modes of operations are matched up properly. -func TestProtocolCompatibility(t *testing.T) { - // Define the compatibility chart - tests := []struct { - version uint - mode downloader.SyncMode - compatible bool - }{ - {61, downloader.FullSync, true}, {62, downloader.FullSync, true}, {63, downloader.FullSync, true}, - {61, downloader.FastSync, false}, {62, downloader.FastSync, false}, {63, downloader.FastSync, true}, - } - // Make sure anything we screw up is restored - backup := ProtocolVersions - defer func() { ProtocolVersions = backup }() - - // Try all available compatibility configs and check for errors - for i, tt := range tests { - ProtocolVersions = []uint{tt.version} - - pm, _, err := newTestProtocolManager(tt.mode, 0, nil, nil) - if pm != nil { - defer pm.Stop() - } - if (err == nil && !tt.compatible) || (err != nil && tt.compatible) { - t.Errorf("test %d: compatibility mismatch: have error %v, want compatibility %v", i, err, tt.compatible) - } - } -} - // Tests that block headers can be retrieved from a remote chain based on user queries. -func TestGetBlockHeaders62(t *testing.T) { testGetBlockHeaders(t, 62) } func TestGetBlockHeaders63(t *testing.T) { testGetBlockHeaders(t, 63) } +func TestGetBlockHeaders64(t *testing.T) { testGetBlockHeaders(t, 64) } func testGetBlockHeaders(t *testing.T, protocol int) { pm, _ := newTestProtocolManagerMust(t, downloader.FullSync, downloader.MaxHashFetch+15, nil, nil) @@ -227,8 +198,8 @@ func testGetBlockHeaders(t *testing.T, protocol int) { } // Tests that block contents can be retrieved from a remote chain based on their hashes. -func TestGetBlockBodies62(t *testing.T) { testGetBlockBodies(t, 62) } func TestGetBlockBodies63(t *testing.T) { testGetBlockBodies(t, 63) } +func TestGetBlockBodies64(t *testing.T) { testGetBlockBodies(t, 64) } func testGetBlockBodies(t *testing.T, protocol int) { pm, _ := newTestProtocolManagerMust(t, downloader.FullSync, downloader.MaxBlockFetch+15, nil, nil) @@ -300,6 +271,7 @@ func testGetBlockBodies(t *testing.T, protocol int) { // Tests that the node state database can be retrieved based on hashes. func TestGetNodeData63(t *testing.T) { testGetNodeData(t, 63) } +func TestGetNodeData64(t *testing.T) { testGetNodeData(t, 64) } func testGetNodeData(t *testing.T, protocol int) { // Define three accounts to simulate transactions with @@ -344,11 +316,15 @@ func testGetNodeData(t *testing.T, protocol int) { // Fetch for now the entire chain db hashes := []common.Hash{} - for _, key := range db.Keys() { - if len(key) == len(common.Hash{}) { + + it := db.NewIterator() + for it.Next() { + if key := it.Key(); len(key) == common.HashLength { hashes = append(hashes, common.BytesToHash(key)) } } + it.Release() + p2p.Send(peer.app, 0x0d, hashes) msg, err := peer.app.ReadMsg() if err != nil { @@ -367,7 +343,7 @@ func testGetNodeData(t *testing.T, protocol int) { t.Errorf("data hash mismatch: have %x, want %x", hash, want) } } - statedb := ethdb.NewMemDatabase() + statedb := rawdb.NewMemoryDatabase() for i := 0; i < len(data); i++ { statedb.Put(hashes[i].Bytes(), data[i]) } @@ -392,6 +368,7 @@ func testGetNodeData(t *testing.T, protocol int) { // Tests that the transaction receipts can be retrieved based on hashes. func TestGetReceipt63(t *testing.T) { testGetReceipt(t, 63) } +func TestGetReceipt64(t *testing.T) { testGetReceipt(t, 64) } func testGetReceipt(t *testing.T, protocol int) { // Define three accounts to simulate transactions with @@ -449,79 +426,125 @@ func testGetReceipt(t *testing.T, protocol int) { } } -// Tests that post eth protocol handshake, DAO fork-enabled clients also execute -// a DAO "challenge" verifying each others' DAO fork headers to ensure they're on -// compatible chains. -func TestDAOChallengeNoVsNo(t *testing.T) { testDAOChallenge(t, false, false, false) } -func TestDAOChallengeNoVsPro(t *testing.T) { testDAOChallenge(t, false, true, false) } -func TestDAOChallengeProVsNo(t *testing.T) { testDAOChallenge(t, true, false, false) } -func TestDAOChallengeProVsPro(t *testing.T) { testDAOChallenge(t, true, true, false) } -func TestDAOChallengeNoVsTimeout(t *testing.T) { testDAOChallenge(t, false, false, true) } -func TestDAOChallengeProVsTimeout(t *testing.T) { testDAOChallenge(t, true, true, true) } - -func testDAOChallenge(t *testing.T, localForked, remoteForked bool, timeout bool) { - // Reduce the DAO handshake challenge timeout - if timeout { - defer func(old time.Duration) { daoChallengeTimeout = old }(daoChallengeTimeout) - daoChallengeTimeout = 500 * time.Millisecond - } - // Create a DAO aware protocol manager +// Tests that post eth protocol handshake, clients perform a mutual checkpoint +// challenge to validate each other's chains. Hash mismatches, or missing ones +// during a fast sync should lead to the peer getting dropped. +func TestCheckpointChallenge(t *testing.T) { + tests := []struct { + syncmode downloader.SyncMode + checkpoint bool + timeout bool + empty bool + match bool + drop bool + }{ + // If checkpointing is not enabled locally, don't challenge and don't drop + {downloader.FullSync, false, false, false, false, false}, + {downloader.FastSync, false, false, false, false, false}, + + // If checkpointing is enabled locally and remote response is empty, only drop during fast sync + {downloader.FullSync, true, false, true, false, false}, + {downloader.FastSync, true, false, true, false, true}, // Special case, fast sync, unsynced peer + + // If checkpointing is enabled locally and remote response mismatches, always drop + {downloader.FullSync, true, false, false, false, true}, + {downloader.FastSync, true, false, false, false, true}, + + // If checkpointing is enabled locally and remote response matches, never drop + {downloader.FullSync, true, false, false, true, false}, + {downloader.FastSync, true, false, false, true, false}, + + // If checkpointing is enabled locally and remote times out, always drop + {downloader.FullSync, true, true, false, true, true}, + {downloader.FastSync, true, true, false, true, true}, + } + for _, tt := range tests { + t.Run(fmt.Sprintf("sync %v checkpoint %v timeout %v empty %v match %v", tt.syncmode, tt.checkpoint, tt.timeout, tt.empty, tt.match), func(t *testing.T) { + testCheckpointChallenge(t, tt.syncmode, tt.checkpoint, tt.timeout, tt.empty, tt.match, tt.drop) + }) + } +} + +func testCheckpointChallenge(t *testing.T, syncmode downloader.SyncMode, checkpoint bool, timeout bool, empty bool, match bool, drop bool) { + // Reduce the checkpoint handshake challenge timeout + defer func(old time.Duration) { syncChallengeTimeout = old }(syncChallengeTimeout) + syncChallengeTimeout = 250 * time.Millisecond + + // Initialize a chain and generate a fake CHT if checkpointing is enabled var ( - evmux = new(event.TypeMux) - pow = ethash.NewFaker() - db = ethdb.NewMemDatabase() - config = ¶ms.ChainConfig{DAOForkBlock: big.NewInt(1), DAOForkSupport: localForked} - gspec = &core.Genesis{Config: config} - genesis = gspec.MustCommit(db) + db = rawdb.NewMemoryDatabase() + config = new(params.ChainConfig) ) - blockchain, err := core.NewBlockChain(db, nil, config, pow, vm.Config{}, nil) + (&core.Genesis{Config: config}).MustCommit(db) // Commit genesis block + // If checkpointing is enabled, create and inject a fake CHT and the corresponding + // chllenge response. + var response *types.Header + var cht *params.TrustedCheckpoint + if checkpoint { + index := uint64(rand.Intn(500)) + number := (index+1)*params.CHTFrequency - 1 + response = &types.Header{Number: big.NewInt(int64(number)), Extra: []byte("valid")} + + cht = ¶ms.TrustedCheckpoint{ + SectionIndex: index, + SectionHead: response.Hash(), + } + } + // Create a checkpoint aware protocol manager + blockchain, err := core.NewBlockChain(db, nil, config, ethash.NewFaker(), vm.Config{}, nil) if err != nil { t.Fatalf("failed to create new blockchain: %v", err) } - pm, err := NewProtocolManager(config, downloader.FullSync, DefaultConfig.NetworkId, evmux, new(testTxPool), pow, blockchain, db, nil) + pm, err := NewProtocolManager(config, cht, syncmode, DefaultConfig.NetworkId, new(event.TypeMux), new(testTxPool), ethash.NewFaker(), blockchain, db, 1, nil) if err != nil { t.Fatalf("failed to start test protocol manager: %v", err) } pm.Start(1000) defer pm.Stop() - // Connect a new peer and check that we receive the DAO challenge + // Connect a new peer and check that we receive the checkpoint challenge peer, _ := newTestPeer("peer", eth63, pm, true) defer peer.close() - challenge := &getBlockHeadersData{ - Origin: hashOrNumber{Number: config.DAOForkBlock.Uint64()}, - Amount: 1, - Skip: 0, - Reverse: false, - } - if err := p2p.ExpectMsg(peer.app, GetBlockHeadersMsg, challenge); err != nil { - t.Fatalf("challenge mismatch: %v", err) - } - // Create a block to reply to the challenge if no timeout is simulated - if !timeout { - blocks, _ := core.GenerateChain(¶ms.ChainConfig{}, genesis, ethash.NewFaker(), db, 1, func(i int, block *core.BlockGen) { - if remoteForked { - block.SetExtra(params.DAOForkBlockExtra) + if checkpoint { + challenge := &getBlockHeadersData{ + Origin: hashOrNumber{Number: response.Number.Uint64()}, + Amount: 1, + Skip: 0, + Reverse: false, + } + if err := p2p.ExpectMsg(peer.app, GetBlockHeadersMsg, challenge); err != nil { + t.Fatalf("challenge mismatch: %v", err) + } + // Create a block to reply to the challenge if no timeout is simulated + if !timeout { + if empty { + if err := p2p.Send(peer.app, BlockHeadersMsg, []*types.Header{}); err != nil { + t.Fatalf("failed to answer challenge: %v", err) + } + } else if match { + if err := p2p.Send(peer.app, BlockHeadersMsg, []*types.Header{response}); err != nil { + t.Fatalf("failed to answer challenge: %v", err) + } + } else { + if err := p2p.Send(peer.app, BlockHeadersMsg, []*types.Header{{Number: response.Number}}); err != nil { + t.Fatalf("failed to answer challenge: %v", err) + } } - }) - if err := p2p.Send(peer.app, BlockHeadersMsg, []*types.Header{blocks[0].Header()}); err != nil { - t.Fatalf("failed to answer challenge: %v", err) } - time.Sleep(100 * time.Millisecond) // Sleep to avoid the verification racing with the drops - } else { - // Otherwise wait until the test timeout passes - time.Sleep(daoChallengeTimeout + 500*time.Millisecond) } - // Verify that depending on fork side, the remote peer is maintained or dropped - if localForked == remoteForked && !timeout { - if peers := pm.peers.Len(); peers != 1 { - t.Fatalf("peer count mismatch: have %d, want %d", peers, 1) - } - } else { + // Wait until the test timeout passes to ensure proper cleanup + time.Sleep(syncChallengeTimeout + 100*time.Millisecond) + + // Verify that the remote peer is maintained or dropped + if drop { if peers := pm.peers.Len(); peers != 0 { t.Fatalf("peer count mismatch: have %d, want %d", peers, 0) } + } else { + if peers := pm.peers.Len(); peers != 1 { + t.Fatalf("peer count mismatch: have %d, want %d", peers, 1) + } } } @@ -550,7 +573,7 @@ func testBroadcastBlock(t *testing.T, totalPeers, broadcastExpected int) { var ( evmux = new(event.TypeMux) pow = ethash.NewFaker() - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() config = ¶ms.ChainConfig{} gspec = &core.Genesis{Config: config} genesis = gspec.MustCommit(db) @@ -559,7 +582,7 @@ func testBroadcastBlock(t *testing.T, totalPeers, broadcastExpected int) { if err != nil { t.Fatalf("failed to create new blockchain: %v", err) } - pm, err := NewProtocolManager(config, downloader.FullSync, DefaultConfig.NetworkId, evmux, new(testTxPool), pow, blockchain, db, nil) + pm, err := NewProtocolManager(config, nil, downloader.FullSync, DefaultConfig.NetworkId, evmux, new(testTxPool), pow, blockchain, db, 1, nil) if err != nil { t.Fatalf("failed to start test protocol manager: %v", err) } @@ -585,7 +608,7 @@ func testBroadcastBlock(t *testing.T, totalPeers, broadcastExpected int) { } }(peer) } - timeout := time.After(300 * time.Millisecond) + timeout := time.After(time.Second) var receivedCount int outer: for { diff --git a/eth/helper_test.go b/eth/helper_test.go index b250b6009009..e66910334f17 100644 --- a/eth/helper_test.go +++ b/eth/helper_test.go @@ -22,23 +22,26 @@ package eth import ( "crypto/ecdsa" "crypto/rand" + "fmt" "math/big" "sort" "sync" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/forkid" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" ) var ( @@ -49,11 +52,11 @@ var ( // newTestProtocolManager creates a new protocol manager for testing purposes, // with the given number of blocks already known, and potential notification // channels for different events. -func newTestProtocolManager(mode downloader.SyncMode, blocks int, generator func(int, *core.BlockGen), newtx chan<- []*types.Transaction) (*ProtocolManager, *ethdb.MemDatabase, error) { +func newTestProtocolManager(mode downloader.SyncMode, blocks int, generator func(int, *core.BlockGen), newtx chan<- []*types.Transaction) (*ProtocolManager, ethdb.Database, error) { var ( evmux = new(event.TypeMux) engine = ethash.NewFaker() - db = ethdb.NewMemDatabase() + db = rawdb.NewMemoryDatabase() gspec = &core.Genesis{ Config: params.TestChainConfig, Alloc: core.GenesisAlloc{testBank: {Balance: big.NewInt(1000000)}}, @@ -65,8 +68,7 @@ func newTestProtocolManager(mode downloader.SyncMode, blocks int, generator func if _, err := blockchain.InsertChain(chain); err != nil { panic(err) } - - pm, err := NewProtocolManager(gspec.Config, mode, DefaultConfig.NetworkId, evmux, &testTxPool{added: newtx}, engine, blockchain, db, nil) + pm, err := NewProtocolManager(gspec.Config, nil, mode, DefaultConfig.NetworkId, evmux, &testTxPool{added: newtx}, engine, blockchain, db, 1, nil) if err != nil { return nil, nil, err } @@ -78,7 +80,7 @@ func newTestProtocolManager(mode downloader.SyncMode, blocks int, generator func // with the given number of blocks already known, and potential notification // channels for different events. In case of an error, the constructor force- // fails the test. -func newTestProtocolManagerMust(t *testing.T, mode downloader.SyncMode, blocks int, generator func(int, *core.BlockGen), newtx chan<- []*types.Transaction) (*ProtocolManager, *ethdb.MemDatabase) { +func newTestProtocolManagerMust(t *testing.T, mode downloader.SyncMode, blocks int, generator func(int, *core.BlockGen), newtx chan<- []*types.Transaction) (*ProtocolManager, ethdb.Database) { pm, db, err := newTestProtocolManager(mode, blocks, generator, newtx) if err != nil { t.Fatalf("Failed to create protocol manager: %v", err) @@ -171,20 +173,35 @@ func newTestPeer(name string, version int, pm *ProtocolManager, shake bool) (*te head = pm.blockchain.CurrentHeader() td = pm.blockchain.GetTd(head.Hash(), head.Number.Uint64()) ) - tp.handshake(nil, td, head.Hash(), genesis.Hash()) + tp.handshake(nil, td, head.Hash(), genesis.Hash(), forkid.NewID(pm.blockchain), forkid.NewFilter(pm.blockchain)) } return tp, errc } // handshake simulates a trivial handshake that expects the same state from the // remote side as we are simulating locally. -func (p *testPeer) handshake(t *testing.T, td *big.Int, head common.Hash, genesis common.Hash) { - msg := &statusData{ - ProtocolVersion: uint32(p.version), - NetworkId: DefaultConfig.NetworkId, - TD: td, - CurrentBlock: head, - GenesisBlock: genesis, +func (p *testPeer) handshake(t *testing.T, td *big.Int, head common.Hash, genesis common.Hash, forkID forkid.ID, forkFilter forkid.Filter) { + var msg interface{} + switch { + case p.version == eth63: + msg = &statusData63{ + ProtocolVersion: uint32(p.version), + NetworkId: DefaultConfig.NetworkId, + TD: td, + CurrentBlock: head, + GenesisBlock: genesis, + } + case p.version == eth64: + msg = &statusData{ + ProtocolVersion: uint32(p.version), + NetworkID: DefaultConfig.NetworkId, + TD: td, + Head: head, + Genesis: genesis, + ForkID: forkID, + } + default: + panic(fmt.Sprintf("unsupported eth protocol version: %d", p.version)) } if err := p2p.ExpectMsg(p.app, StatusMsg, msg); err != nil { t.Fatalf("status recv: %v", err) diff --git a/eth/metrics.go b/eth/metrics.go index 6a4609a28ff9..0533a2a8757c 100644 --- a/eth/metrics.go +++ b/eth/metrics.go @@ -17,8 +17,8 @@ package eth import ( - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/p2p" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/p2p" ) var ( diff --git a/eth/peer.go b/eth/peer.go index 6f9ebd61cd10..0beec1d8449e 100644 --- a/eth/peer.go +++ b/eth/peer.go @@ -24,10 +24,11 @@ import ( "time" mapset "github.com/deckarep/golang-set" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/forkid" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rlp" ) var ( @@ -79,7 +80,7 @@ type peer struct { rw p2p.MsgReadWriter version int // Protocol version negotiated - forkDrop *time.Timer // Timed connection dropper if forks aren't validated in time + syncDrop *time.Timer // Timed connection dropper if sync progress isn't validated in time head common.Hash td *big.Int @@ -196,9 +197,13 @@ func (p *peer) MarkTransaction(hash common.Hash) { // SendTransactions sends transactions to the peer and includes the hashes // in its transaction hash set for future reference. func (p *peer) SendTransactions(txs types.Transactions) error { + // Mark all the transactions as known, but ensure we don't overflow our limits for _, tx := range txs { p.knownTxs.Add(tx.Hash()) } + for p.knownTxs.Cardinality() >= maxKnownTxs { + p.knownTxs.Pop() + } return p2p.Send(p.rw, TxMsg, txs) } @@ -207,9 +212,13 @@ func (p *peer) SendTransactions(txs types.Transactions) error { func (p *peer) AsyncSendTransactions(txs []*types.Transaction) { select { case p.queuedTxs <- txs: + // Mark all the transactions as known, but ensure we don't overflow our limits for _, tx := range txs { p.knownTxs.Add(tx.Hash()) } + for p.knownTxs.Cardinality() >= maxKnownTxs { + p.knownTxs.Pop() + } default: p.Log().Debug("Dropping transaction propagation", "count", len(txs)) } @@ -218,9 +227,13 @@ func (p *peer) AsyncSendTransactions(txs []*types.Transaction) { // SendNewBlockHashes announces the availability of a number of blocks through // a hash notification. func (p *peer) SendNewBlockHashes(hashes []common.Hash, numbers []uint64) error { + // Mark all the block hashes as known, but ensure we don't overflow our limits for _, hash := range hashes { p.knownBlocks.Add(hash) } + for p.knownBlocks.Cardinality() >= maxKnownBlocks { + p.knownBlocks.Pop() + } request := make(newBlockHashesData, len(hashes)) for i := 0; i < len(hashes); i++ { request[i].Hash = hashes[i] @@ -235,7 +248,11 @@ func (p *peer) SendNewBlockHashes(hashes []common.Hash, numbers []uint64) error func (p *peer) AsyncSendNewBlockHash(block *types.Block) { select { case p.queuedAnns <- block: + // Mark all the block hash as known, but ensure we don't overflow our limits p.knownBlocks.Add(block.Hash()) + for p.knownBlocks.Cardinality() >= maxKnownBlocks { + p.knownBlocks.Pop() + } default: p.Log().Debug("Dropping block announcement", "number", block.NumberU64(), "hash", block.Hash()) } @@ -243,7 +260,11 @@ func (p *peer) AsyncSendNewBlockHash(block *types.Block) { // SendNewBlock propagates an entire block to a remote peer. func (p *peer) SendNewBlock(block *types.Block, td *big.Int) error { + // Mark all the block hash as known, but ensure we don't overflow our limits p.knownBlocks.Add(block.Hash()) + for p.knownBlocks.Cardinality() >= maxKnownBlocks { + p.knownBlocks.Pop() + } return p2p.Send(p.rw, NewBlockMsg, []interface{}{block, td}) } @@ -252,7 +273,11 @@ func (p *peer) SendNewBlock(block *types.Block, td *big.Int) error { func (p *peer) AsyncSendNewBlock(block *types.Block, td *big.Int) { select { case p.queuedProps <- &propEvent{block: block, td: td}: + // Mark all the block hash as known, but ensure we don't overflow our limits p.knownBlocks.Add(block.Hash()) + for p.knownBlocks.Cardinality() >= maxKnownBlocks { + p.knownBlocks.Pop() + } default: p.Log().Debug("Dropping block propagation", "number", block.NumberU64(), "hash", block.Hash()) } @@ -329,22 +354,46 @@ func (p *peer) RequestReceipts(hashes []common.Hash) error { // Handshake executes the eth protocol handshake, negotiating version number, // network IDs, difficulties, head and genesis blocks. -func (p *peer) Handshake(network uint64, td *big.Int, head common.Hash, genesis common.Hash) error { +func (p *peer) Handshake(network uint64, td *big.Int, head common.Hash, genesis common.Hash, forkID forkid.ID, forkFilter forkid.Filter) error { // Send out own handshake in a new thread errc := make(chan error, 2) - var status statusData // safe to read after two values have been received from errc + var ( + status63 statusData63 // safe to read after two values have been received from errc + status statusData // safe to read after two values have been received from errc + ) go func() { - errc <- p2p.Send(p.rw, StatusMsg, &statusData{ - ProtocolVersion: uint32(p.version), - NetworkId: network, - TD: td, - CurrentBlock: head, - GenesisBlock: genesis, - }) + switch { + case p.version == eth63: + errc <- p2p.Send(p.rw, StatusMsg, &statusData63{ + ProtocolVersion: uint32(p.version), + NetworkId: network, + TD: td, + CurrentBlock: head, + GenesisBlock: genesis, + }) + case p.version == eth64: + errc <- p2p.Send(p.rw, StatusMsg, &statusData{ + ProtocolVersion: uint32(p.version), + NetworkID: network, + TD: td, + Head: head, + Genesis: genesis, + ForkID: forkID, + }) + default: + panic(fmt.Sprintf("unsupported eth protocol version: %d", p.version)) + } }() go func() { - errc <- p.readStatus(network, &status, genesis) + switch { + case p.version == eth63: + errc <- p.readStatusLegacy(network, &status63, genesis) + case p.version == eth64: + errc <- p.readStatus(network, &status, genesis, forkFilter) + default: + panic(fmt.Sprintf("unsupported eth protocol version: %d", p.version)) + } }() timeout := time.NewTimer(handshakeTimeout) defer timeout.Stop() @@ -358,11 +407,18 @@ func (p *peer) Handshake(network uint64, td *big.Int, head common.Hash, genesis return p2p.DiscReadTimeout } } - p.td, p.head = status.TD, status.CurrentBlock + switch { + case p.version == eth63: + p.td, p.head = status63.TD, status63.CurrentBlock + case p.version == eth64: + p.td, p.head = status.TD, status.Head + default: + panic(fmt.Sprintf("unsupported eth protocol version: %d", p.version)) + } return nil } -func (p *peer) readStatus(network uint64, status *statusData, genesis common.Hash) (err error) { +func (p *peer) readStatusLegacy(network uint64, status *statusData63, genesis common.Hash) error { msg, err := p.rw.ReadMsg() if err != nil { return err @@ -370,18 +426,18 @@ func (p *peer) readStatus(network uint64, status *statusData, genesis common.Has if msg.Code != StatusMsg { return errResp(ErrNoStatusMsg, "first msg has code %x (!= %x)", msg.Code, StatusMsg) } - if msg.Size > ProtocolMaxMsgSize { - return errResp(ErrMsgTooLarge, "%v > %v", msg.Size, ProtocolMaxMsgSize) + if msg.Size > protocolMaxMsgSize { + return errResp(ErrMsgTooLarge, "%v > %v", msg.Size, protocolMaxMsgSize) } // Decode the handshake and make sure everything matches if err := msg.Decode(&status); err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) } if status.GenesisBlock != genesis { - return errResp(ErrGenesisBlockMismatch, "%x (!= %x)", status.GenesisBlock[:8], genesis[:8]) + return errResp(ErrGenesisMismatch, "%x (!= %x)", status.GenesisBlock[:8], genesis[:8]) } if status.NetworkId != network { - return errResp(ErrNetworkIdMismatch, "%d (!= %d)", status.NetworkId, network) + return errResp(ErrNetworkIDMismatch, "%d (!= %d)", status.NetworkId, network) } if int(status.ProtocolVersion) != p.version { return errResp(ErrProtocolVersionMismatch, "%d (!= %d)", status.ProtocolVersion, p.version) @@ -389,6 +445,36 @@ func (p *peer) readStatus(network uint64, status *statusData, genesis common.Has return nil } +func (p *peer) readStatus(network uint64, status *statusData, genesis common.Hash, forkFilter forkid.Filter) error { + msg, err := p.rw.ReadMsg() + if err != nil { + return err + } + if msg.Code != StatusMsg { + return errResp(ErrNoStatusMsg, "first msg has code %x (!= %x)", msg.Code, StatusMsg) + } + if msg.Size > protocolMaxMsgSize { + return errResp(ErrMsgTooLarge, "%v > %v", msg.Size, protocolMaxMsgSize) + } + // Decode the handshake and make sure everything matches + if err := msg.Decode(&status); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + if status.NetworkID != network { + return errResp(ErrNetworkIDMismatch, "%d (!= %d)", status.NetworkID, network) + } + if int(status.ProtocolVersion) != p.version { + return errResp(ErrProtocolVersionMismatch, "%d (!= %d)", status.ProtocolVersion, p.version) + } + if status.Genesis != genesis { + return errResp(ErrGenesisMismatch, "%x (!= %x)", status.Genesis, genesis) + } + if err := forkFilter(status.ForkID); err != nil { + return errResp(ErrForkIDRejected, "%v", err) + } + return nil +} + // String implements fmt.Stringer. func (p *peer) String() string { return fmt.Sprintf("Peer %s [%s]", p.id, diff --git a/eth/protocol.go b/eth/protocol.go index 1604d70b1e8b..62e4d13d149c 100644 --- a/eth/protocol.go +++ b/eth/protocol.go @@ -21,33 +21,33 @@ import ( "io" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/forkid" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/rlp" ) // Constants to match up protocol versions and messages const ( - eth62 = 62 eth63 = 63 + eth64 = 64 ) -// ProtocolName is the official short name of the protocol used during capability negotiation. -var ProtocolName = "eth" +// protocolName is the official short name of the protocol used during capability negotiation. +const protocolName = "eth" // ProtocolVersions are the supported versions of the eth protocol (first is primary). -var ProtocolVersions = []uint{eth63, eth62} +var ProtocolVersions = []uint{eth64, eth63} -// ProtocolLengths are the number of implemented message corresponding to different protocol versions. -var ProtocolLengths = []uint64{17, 8} +// protocolLengths are the number of implemented message corresponding to different protocol versions. +var protocolLengths = map[uint]uint64{eth64: 17, eth63: 17} -const ProtocolMaxMsgSize = 10 * 1024 * 1024 // Maximum cap on the size of a protocol message +const protocolMaxMsgSize = 10 * 1024 * 1024 // Maximum cap on the size of a protocol message // eth protocol message codes const ( - // Protocol messages belonging to eth/62 StatusMsg = 0x00 NewBlockHashesMsg = 0x01 TxMsg = 0x02 @@ -56,12 +56,10 @@ const ( GetBlockBodiesMsg = 0x05 BlockBodiesMsg = 0x06 NewBlockMsg = 0x07 - - // Protocol messages belonging to eth/63 - GetNodeDataMsg = 0x0d - NodeDataMsg = 0x0e - GetReceiptsMsg = 0x0f - ReceiptsMsg = 0x10 + GetNodeDataMsg = 0x0d + NodeDataMsg = 0x0e + GetReceiptsMsg = 0x0f + ReceiptsMsg = 0x10 ) type errCode int @@ -71,11 +69,11 @@ const ( ErrDecode ErrInvalidMsgCode ErrProtocolVersionMismatch - ErrNetworkIdMismatch - ErrGenesisBlockMismatch + ErrNetworkIDMismatch + ErrGenesisMismatch + ErrForkIDRejected ErrNoStatusMsg ErrExtraStatusMsg - ErrSuspendedPeer ) func (e errCode) String() string { @@ -88,11 +86,11 @@ var errorToString = map[int]string{ ErrDecode: "Invalid message", ErrInvalidMsgCode: "Invalid message code", ErrProtocolVersionMismatch: "Protocol version mismatch", - ErrNetworkIdMismatch: "NetworkId mismatch", - ErrGenesisBlockMismatch: "Genesis block mismatch", + ErrNetworkIDMismatch: "Network ID mismatch", + ErrGenesisMismatch: "Genesis mismatch", + ErrForkIDRejected: "Fork ID rejected", ErrNoStatusMsg: "No status message", ErrExtraStatusMsg: "Extra status message", - ErrSuspendedPeer: "Suspended peer", } type txPool interface { @@ -108,8 +106,8 @@ type txPool interface { SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription } -// statusData is the network packet for the status message. -type statusData struct { +// statusData63 is the network packet for the status message for eth/63. +type statusData63 struct { ProtocolVersion uint32 NetworkId uint64 TD *big.Int @@ -117,6 +115,16 @@ type statusData struct { GenesisBlock common.Hash } +// statusData is the network packet for the status message for eth/64 and later. +type statusData struct { + ProtocolVersion uint32 + NetworkID uint64 + TD *big.Int + Head common.Hash + Genesis common.Hash + ForkID forkid.ID +} + // newBlockHashesData is the network packet for the block announcements. type newBlockHashesData []struct { Hash common.Hash // Hash of one particular block being announced @@ -173,6 +181,19 @@ type newBlockData struct { TD *big.Int } +// sanityCheck verifies that the values are reasonable, as a DoS protection +func (request *newBlockData) sanityCheck() error { + if err := request.Block.SanityCheck(); err != nil { + return err + } + //TD at mainnet block #7753254 is 76 bits. If it becomes 100 million times + // larger, it will still fit within 100 bits + if tdlen := request.TD.BitLen(); tdlen > 100 { + return fmt.Errorf("too large block TD: bitlen %d", tdlen) + } + return nil +} + // blockBody represents the data content of a single block. type blockBody struct { Transactions []*types.Transaction // Transactions contained within a block diff --git a/eth/protocol_test.go b/eth/protocol_test.go index a060f2f49236..ca418942bb2c 100644 --- a/eth/protocol_test.go +++ b/eth/protocol_test.go @@ -18,16 +18,25 @@ package eth import ( "fmt" + "math/big" "sync" "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/forkid" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" ) func init() { @@ -37,10 +46,7 @@ func init() { var testAccount, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") // Tests that handshake failures are detected and reported correctly. -func TestStatusMsgErrors62(t *testing.T) { testStatusMsgErrors(t, 62) } -func TestStatusMsgErrors63(t *testing.T) { testStatusMsgErrors(t, 63) } - -func testStatusMsgErrors(t *testing.T, protocol int) { +func TestStatusMsgErrors63(t *testing.T) { pm, _ := newTestProtocolManagerMust(t, downloader.FullSync, 0, nil, nil) var ( genesis = pm.blockchain.Genesis() @@ -59,21 +65,76 @@ func testStatusMsgErrors(t *testing.T, protocol int) { wantError: errResp(ErrNoStatusMsg, "first msg has code 2 (!= 0)"), }, { - code: StatusMsg, data: statusData{10, DefaultConfig.NetworkId, td, head.Hash(), genesis.Hash()}, - wantError: errResp(ErrProtocolVersionMismatch, "10 (!= %d)", protocol), + code: StatusMsg, data: statusData63{10, DefaultConfig.NetworkId, td, head.Hash(), genesis.Hash()}, + wantError: errResp(ErrProtocolVersionMismatch, "10 (!= %d)", 63), }, { - code: StatusMsg, data: statusData{uint32(protocol), 999, td, head.Hash(), genesis.Hash()}, - wantError: errResp(ErrNetworkIdMismatch, "999 (!= 1)"), + code: StatusMsg, data: statusData63{63, 999, td, head.Hash(), genesis.Hash()}, + wantError: errResp(ErrNetworkIDMismatch, "999 (!= %d)", DefaultConfig.NetworkId), }, { - code: StatusMsg, data: statusData{uint32(protocol), DefaultConfig.NetworkId, td, head.Hash(), common.Hash{3}}, - wantError: errResp(ErrGenesisBlockMismatch, "0300000000000000 (!= %x)", genesis.Hash().Bytes()[:8]), + code: StatusMsg, data: statusData63{63, DefaultConfig.NetworkId, td, head.Hash(), common.Hash{3}}, + wantError: errResp(ErrGenesisMismatch, "0300000000000000 (!= %x)", genesis.Hash().Bytes()[:8]), }, } + for i, test := range tests { + p, errc := newTestPeer("peer", 63, pm, false) + // The send call might hang until reset because + // the protocol might not read the payload. + go p2p.Send(p.app, test.code, test.data) + + select { + case err := <-errc: + if err == nil { + t.Errorf("test %d: protocol returned nil error, want %q", i, test.wantError) + } else if err.Error() != test.wantError.Error() { + t.Errorf("test %d: wrong error: got %q, want %q", i, err, test.wantError) + } + case <-time.After(2 * time.Second): + t.Errorf("protocol did not shut down within 2 seconds") + } + p.close() + } +} + +func TestStatusMsgErrors64(t *testing.T) { + pm, _ := newTestProtocolManagerMust(t, downloader.FullSync, 0, nil, nil) + var ( + genesis = pm.blockchain.Genesis() + head = pm.blockchain.CurrentHeader() + td = pm.blockchain.GetTd(head.Hash(), head.Number.Uint64()) + forkID = forkid.NewID(pm.blockchain) + ) + defer pm.Stop() + tests := []struct { + code uint64 + data interface{} + wantError error + }{ + { + code: TxMsg, data: []interface{}{}, + wantError: errResp(ErrNoStatusMsg, "first msg has code 2 (!= 0)"), + }, + { + code: StatusMsg, data: statusData{10, DefaultConfig.NetworkId, td, head.Hash(), genesis.Hash(), forkID}, + wantError: errResp(ErrProtocolVersionMismatch, "10 (!= %d)", 64), + }, + { + code: StatusMsg, data: statusData{64, 999, td, head.Hash(), genesis.Hash(), forkID}, + wantError: errResp(ErrNetworkIDMismatch, "999 (!= %d)", DefaultConfig.NetworkId), + }, + { + code: StatusMsg, data: statusData{64, DefaultConfig.NetworkId, td, head.Hash(), common.Hash{3}, forkID}, + wantError: errResp(ErrGenesisMismatch, "0300000000000000000000000000000000000000000000000000000000000000 (!= %x)", genesis.Hash()), + }, + { + code: StatusMsg, data: statusData{64, DefaultConfig.NetworkId, td, head.Hash(), genesis.Hash(), forkid.ID{Hash: [4]byte{0x00, 0x01, 0x02, 0x03}}}, + wantError: errResp(ErrForkIDRejected, forkid.ErrLocalIncompatibleOrStale.Error()), + }, + } for i, test := range tests { - p, errc := newTestPeer("peer", protocol, pm, false) + p, errc := newTestPeer("peer", 64, pm, false) // The send call might hang until reset because // the protocol might not read the payload. go p2p.Send(p.app, test.code, test.data) @@ -92,9 +153,99 @@ func testStatusMsgErrors(t *testing.T, protocol int) { } } +func TestForkIDSplit(t *testing.T) { + var ( + engine = ethash.NewFaker() + + configNoFork = ¶ms.ChainConfig{HomesteadBlock: big.NewInt(1)} + configProFork = ¶ms.ChainConfig{ + HomesteadBlock: big.NewInt(1), + EIP150Block: big.NewInt(2), + EIP155Block: big.NewInt(2), + EIP158Block: big.NewInt(2), + ByzantiumBlock: big.NewInt(3), + } + dbNoFork = rawdb.NewMemoryDatabase() + dbProFork = rawdb.NewMemoryDatabase() + + gspecNoFork = &core.Genesis{Config: configNoFork} + gspecProFork = &core.Genesis{Config: configProFork} + + genesisNoFork = gspecNoFork.MustCommit(dbNoFork) + genesisProFork = gspecProFork.MustCommit(dbProFork) + + chainNoFork, _ = core.NewBlockChain(dbNoFork, nil, configNoFork, engine, vm.Config{}, nil) + chainProFork, _ = core.NewBlockChain(dbProFork, nil, configProFork, engine, vm.Config{}, nil) + + blocksNoFork, _ = core.GenerateChain(configNoFork, genesisNoFork, engine, dbNoFork, 2, nil) + blocksProFork, _ = core.GenerateChain(configProFork, genesisProFork, engine, dbProFork, 2, nil) + + ethNoFork, _ = NewProtocolManager(configNoFork, nil, downloader.FullSync, 1, new(event.TypeMux), new(testTxPool), engine, chainNoFork, dbNoFork, 1, nil) + ethProFork, _ = NewProtocolManager(configProFork, nil, downloader.FullSync, 1, new(event.TypeMux), new(testTxPool), engine, chainProFork, dbProFork, 1, nil) + ) + ethNoFork.Start(1000) + ethProFork.Start(1000) + + // Both nodes should allow the other to connect (same genesis, next fork is the same) + p2pNoFork, p2pProFork := p2p.MsgPipe() + peerNoFork := newPeer(64, p2p.NewPeer(enode.ID{1}, "", nil), p2pNoFork) + peerProFork := newPeer(64, p2p.NewPeer(enode.ID{2}, "", nil), p2pProFork) + + errc := make(chan error, 2) + go func() { errc <- ethNoFork.handle(peerProFork) }() + go func() { errc <- ethProFork.handle(peerNoFork) }() + + select { + case err := <-errc: + t.Fatalf("frontier nofork <-> profork failed: %v", err) + case <-time.After(250 * time.Millisecond): + p2pNoFork.Close() + p2pProFork.Close() + } + // Progress into Homestead. Fork's match, so we don't care what the future holds + chainNoFork.InsertChain(blocksNoFork[:1]) + chainProFork.InsertChain(blocksProFork[:1]) + + p2pNoFork, p2pProFork = p2p.MsgPipe() + peerNoFork = newPeer(64, p2p.NewPeer(enode.ID{1}, "", nil), p2pNoFork) + peerProFork = newPeer(64, p2p.NewPeer(enode.ID{2}, "", nil), p2pProFork) + + errc = make(chan error, 2) + go func() { errc <- ethNoFork.handle(peerProFork) }() + go func() { errc <- ethProFork.handle(peerNoFork) }() + + select { + case err := <-errc: + t.Fatalf("homestead nofork <-> profork failed: %v", err) + case <-time.After(250 * time.Millisecond): + p2pNoFork.Close() + p2pProFork.Close() + } + // Progress into Spurious. Forks mismatch, signalling differing chains, reject + chainNoFork.InsertChain(blocksNoFork[1:2]) + chainProFork.InsertChain(blocksProFork[1:2]) + + p2pNoFork, p2pProFork = p2p.MsgPipe() + peerNoFork = newPeer(64, p2p.NewPeer(enode.ID{1}, "", nil), p2pNoFork) + peerProFork = newPeer(64, p2p.NewPeer(enode.ID{2}, "", nil), p2pProFork) + + errc = make(chan error, 2) + go func() { errc <- ethNoFork.handle(peerProFork) }() + go func() { errc <- ethProFork.handle(peerNoFork) }() + + select { + case err := <-errc: + if want := errResp(ErrForkIDRejected, forkid.ErrLocalIncompatibleOrStale.Error()); err.Error() != want.Error() { + t.Fatalf("fork ID rejection error mismatch: have %v, want %v", err, want) + } + case <-time.After(250 * time.Millisecond): + t.Fatalf("split peers not rejected") + } +} + // This test checks that received transactions are added to the local pool. -func TestRecvTransactions62(t *testing.T) { testRecvTransactions(t, 62) } func TestRecvTransactions63(t *testing.T) { testRecvTransactions(t, 63) } +func TestRecvTransactions64(t *testing.T) { testRecvTransactions(t, 64) } func testRecvTransactions(t *testing.T, protocol int) { txAdded := make(chan []*types.Transaction) @@ -121,8 +272,8 @@ func testRecvTransactions(t *testing.T, protocol int) { } // This test checks that pending transactions are sent. -func TestSendTransactions62(t *testing.T) { testSendTransactions(t, 62) } func TestSendTransactions63(t *testing.T) { testSendTransactions(t, 63) } +func TestSendTransactions64(t *testing.T) { testSendTransactions(t, 64) } func testSendTransactions(t *testing.T, protocol int) { pm, _ := newTestProtocolManagerMust(t, downloader.FullSync, 0, nil, nil) diff --git a/eth/sync.go b/eth/sync.go index d500d412240f..9e180ee200f7 100644 --- a/eth/sync.go +++ b/eth/sync.go @@ -21,11 +21,11 @@ import ( "sync/atomic" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/enode" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" ) const ( @@ -179,23 +179,13 @@ func (pm *ProtocolManager) synchronise(peer *peer) { if atomic.LoadUint32(&pm.fastSync) == 1 { // Fast sync was explicitly requested, and explicitly granted mode = downloader.FastSync - } else if currentBlock.NumberU64() == 0 && pm.blockchain.CurrentFastBlock().NumberU64() > 0 { - // The database seems empty as the current block is the genesis. Yet the fast - // block is ahead, so fast sync was enabled for this node at a certain point. - // The only scenario where this can happen is if the user manually (or via a - // bad block) rolled back a fast sync node below the sync point. In this case - // however it's safe to reenable fast sync. - atomic.StoreUint32(&pm.fastSync, 1) - mode = downloader.FastSync } - if mode == downloader.FastSync { // Make sure the peer's total difficulty we are synchronizing is higher. if pm.blockchain.GetTdByHash(pm.blockchain.CurrentFastBlock().Hash()).Cmp(pTd) >= 0 { return } } - // Run the sync cycle, and disable fast sync if we've went past the pivot block if err := pm.downloader.Synchronise(peer.id, pHead, pTd, mode); err != nil { return @@ -204,8 +194,17 @@ func (pm *ProtocolManager) synchronise(peer *peer) { log.Info("Fast sync complete, auto disabling") atomic.StoreUint32(&pm.fastSync, 0) } - atomic.StoreUint32(&pm.acceptTxs, 1) // Mark initial sync done - if head := pm.blockchain.CurrentBlock(); head.NumberU64() > 0 { + // If we've successfully finished a sync cycle and passed any required checkpoint, + // enable accepting transactions from the network. + head := pm.blockchain.CurrentBlock() + if head.NumberU64() >= pm.checkpointNumber { + // Checkpoint passed, sanity check the timestamp to have a fallback mechanism + // for non-checkpointed (number = 0) private networks. + if head.Time() >= uint64(time.Now().AddDate(0, -1, 0).Unix()) { + atomic.StoreUint32(&pm.acceptTxs, 1) + } + } + if head.NumberU64() > 0 { // We've completed a sync cycle, notify all peers of new state. This path is // essential in star-topology networks where a gateway node needs to notify // all its out-of-date peers of the availability of a new block. This failure diff --git a/eth/sync_test.go b/eth/sync_test.go index 0ed18bbca67a..e4c99ff5873f 100644 --- a/eth/sync_test.go +++ b/eth/sync_test.go @@ -21,9 +21,9 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" ) // Tests that fast sync gets disabled as soon as a real block is successfully diff --git a/eth/tracers/internal/tracers/evmdis_tracer.js b/eth/tracers/internal/tracers/evmdis_tracer.js index 2790e0fd527c..bb19777aba91 100644 --- a/eth/tracers/internal/tracers/evmdis_tracer.js +++ b/eth/tracers/internal/tracers/evmdis_tracer.js @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// evmdisTracer returns sufficent information from a trace to perform evmdis-style +// evmdisTracer returns sufficient information from a trace to perform evmdis-style // disassembly. { stack: [{ops: []}], diff --git a/eth/tracers/testdata/call_tracer_inner_create_oog_outer_throw.json b/eth/tracers/testdata/call_tracer_inner_create_oog_outer_throw.json index b8a4cdd23359..d1c8ac913c54 100644 --- a/eth/tracers/testdata/call_tracer_inner_create_oog_outer_throw.json +++ b/eth/tracers/testdata/call_tracer_inner_create_oog_outer_throw.json @@ -65,7 +65,7 @@ "value": "0x0" } ], - "error": "invalid jump destination (PUSH1) 0", + "error": "evm: invalid jump destination", "from": "0xe4a13bc304682a903e9472f469c33801dd18d9e8", "gas": "0x435c8", "gasUsed": "0x435c8", diff --git a/eth/tracers/testdata/call_tracer_throw.json b/eth/tracers/testdata/call_tracer_throw.json index 60d4d1071d02..d66f1ffa61de 100644 --- a/eth/tracers/testdata/call_tracer_throw.json +++ b/eth/tracers/testdata/call_tracer_throw.json @@ -50,7 +50,7 @@ }, "input": "0xf88b8206668504a817c8008303d09094c212e03b9e060e36facad5fd8f4435412ca22e6b80a451a34eb8000000000000000000000000000000000000000000000027fad02094277c000029a0692a3b4e7b2842f8dd7832e712c21e09f451f416c8976d5b8d02e8c0c2b4bea9a07645e90fc421b63dd755767fd93d3c03b4ec0c4d8fafa059558d08cf11d59750", "result": { - "error": "invalid jump destination (PUSH1) 2", + "error": "evm: invalid jump destination", "from": "0x70c9217d814985faef62b124420f8dfbddd96433", "gas": "0x37b38", "gasUsed": "0x37b38", diff --git a/eth/tracers/tracer.go b/eth/tracers/tracer.go index 99856d6f9b42..63d38ed32de3 100644 --- a/eth/tracers/tracer.go +++ b/eth/tracers/tracer.go @@ -25,11 +25,11 @@ import ( "time" "unsafe" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" duktape "gopkg.in/olebedev/go-duktape.v3" ) @@ -99,7 +99,7 @@ func (mw *memoryWrapper) slice(begin, end int64) []byte { log.Warn("Tracer accessed out of bound memory", "available", mw.memory.Len(), "offset", begin, "size", end-begin) return nil } - return mw.memory.Get(begin, end-begin) + return mw.memory.GetCopy(begin, end-begin) } // getUint returns the 32 bytes at the specified address interpreted as a uint. @@ -390,7 +390,7 @@ func New(code string) (*Tracer, error) { return 1 }) tracer.vm.PushGlobalGoFunction("isPrecompiled", func(ctx *duktape.Context) int { - _, ok := vm.PrecompiledContractsByzantium[common.BytesToAddress(popSlice(ctx))] + _, ok := vm.PrecompiledContractsIstanbul[common.BytesToAddress(popSlice(ctx))] ctx.PushBoolean(ok) return 1 }) @@ -419,17 +419,17 @@ func New(code string) (*Tracer, error) { tracer.tracerObject = 0 // yeah, nice, eval can't return the index itself if !tracer.vm.GetPropString(tracer.tracerObject, "step") { - return nil, fmt.Errorf("Trace object must expose a function step()") + return nil, fmt.Errorf("trace object must expose a function step()") } tracer.vm.Pop() if !tracer.vm.GetPropString(tracer.tracerObject, "fault") { - return nil, fmt.Errorf("Trace object must expose a function fault()") + return nil, fmt.Errorf("trace object must expose a function fault()") } tracer.vm.Pop() if !tracer.vm.GetPropString(tracer.tracerObject, "result") { - return nil, fmt.Errorf("Trace object must expose a function result()") + return nil, fmt.Errorf("trace object must expose a function result()") } tracer.vm.Pop() diff --git a/eth/tracers/tracer_test.go b/eth/tracers/tracer_test.go index bcae13b16292..a45a121159d8 100644 --- a/eth/tracers/tracer_test.go +++ b/eth/tracers/tracer_test.go @@ -24,10 +24,10 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" ) type account struct{} diff --git a/eth/tracers/tracers.go b/eth/tracers/tracers.go index de5a68403eea..4e1ef23ad2f8 100644 --- a/eth/tracers/tracers.go +++ b/eth/tracers/tracers.go @@ -21,7 +21,7 @@ import ( "strings" "unicode" - "github.com/nebulaai/nbai-node/eth/tracers/internal/tracers" + "github.com/ethereum/go-ethereum/eth/tracers/internal/tracers" ) // all contains all the built in JavaScript tracers by name. diff --git a/eth/tracers/tracers_test.go b/eth/tracers/tracers_test.go index b1a36af335c1..69eb80a5c53a 100644 --- a/eth/tracers/tracers_test.go +++ b/eth/tracers/tracers_test.go @@ -27,17 +27,17 @@ import ( "strings" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/tests" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/tests" ) // To generate a new callTracer test, copy paste the makeTest method below into @@ -121,7 +121,7 @@ type callTracerTest struct { } func TestPrestateTracerCreate2(t *testing.T) { - unsigned_tx := types.NewTransaction(1, common.HexToAddress("0x00000000000000000000000000000000deadbeef"), + unsignedTx := types.NewTransaction(1, common.HexToAddress("0x00000000000000000000000000000000deadbeef"), new(big.Int), 5000000, big.NewInt(1), []byte{}) privateKeyECDSA, err := ecdsa.GenerateKey(crypto.S256(), rand.Reader) @@ -129,7 +129,7 @@ func TestPrestateTracerCreate2(t *testing.T) { t.Fatalf("err %v", err) } signer := types.NewEIP155Signer(big.NewInt(1)) - tx, err := types.SignTx(unsigned_tx, signer, privateKeyECDSA) + tx, err := types.SignTx(unsignedTx, signer, privateKeyECDSA) if err != nil { t.Fatalf("err %v", err) } @@ -155,6 +155,7 @@ func TestPrestateTracerCreate2(t *testing.T) { GasPrice: big.NewInt(1), } alloc := core.GenesisAlloc{} + // The code pushes 'deadbeef' into memory, then the other params, and calls CREATE2, then returns // the address alloc[common.HexToAddress("0x00000000000000000000000000000000deadbeef")] = core.GenesisAccount{ @@ -167,7 +168,8 @@ func TestPrestateTracerCreate2(t *testing.T) { Code: []byte{}, Balance: big.NewInt(500000000000000), } - statedb := tests.MakePreState(ethdb.NewMemDatabase(), alloc) + statedb := tests.MakePreState(rawdb.NewMemoryDatabase(), alloc) + // Create the tracer, the EVM environment and run it tracer, err := New("prestateTracer") if err != nil { @@ -240,7 +242,7 @@ func TestCallTracer(t *testing.T) { GasLimit: uint64(test.Context.GasLimit), GasPrice: tx.GasPrice(), } - statedb := tests.MakePreState(ethdb.NewMemDatabase(), test.Genesis.Alloc) + statedb := tests.MakePreState(rawdb.NewMemoryDatabase(), test.Genesis.Alloc) // Create the tracer, the EVM environment and run it tracer, err := New("callTracer") diff --git a/ethclient/ethclient.go b/ethclient/ethclient.go index b3adb1cca17a..a60d73223116 100644 --- a/ethclient/ethclient.go +++ b/ethclient/ethclient.go @@ -24,12 +24,12 @@ import ( "fmt" "math/big" - "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" ) // Client defines typed wrappers for the Ethereum RPC API. @@ -61,6 +61,16 @@ func (ec *Client) Close() { // Blockchain Access +// ChainId retrieves the current chain ID for transaction replay protection. +func (ec *Client) ChainID(ctx context.Context) (*big.Int, error) { + var result hexutil.Big + err := ec.c.CallContext(ctx, &result, "eth_chainId") + if err != nil { + return nil, err + } + return (*big.Int)(&result), err +} + // BlockByHash returns the given full block. // // Note that loading full blocks requires two requests. Use HeaderByHash @@ -241,12 +251,13 @@ func (ec *Client) TransactionCount(ctx context.Context, blockHash common.Hash) ( func (ec *Client) TransactionInBlock(ctx context.Context, blockHash common.Hash, index uint) (*types.Transaction, error) { var json *rpcTransaction err := ec.c.CallContext(ctx, &json, "eth_getTransactionByBlockHashAndIndex", blockHash, hexutil.Uint64(index)) - if err == nil { - if json == nil { - return nil, ethereum.NotFound - } else if _, r, _ := json.tx.RawSignatureValues(); r == nil { - return nil, fmt.Errorf("server returned transaction without signature") - } + if err != nil { + return nil, err + } + if json == nil { + return nil, ethereum.NotFound + } else if _, r, _ := json.tx.RawSignatureValues(); r == nil { + return nil, fmt.Errorf("server returned transaction without signature") } if json.From != nil && json.BlockHash != nil { setSenderFromServer(json.tx, *json.From, *json.BlockHash) @@ -503,7 +514,7 @@ func (ec *Client) SendTransaction(ctx context.Context, tx *types.Transaction) er if err != nil { return err } - return ec.c.CallContext(ctx, nil, "eth_sendRawTransaction", common.ToHex(data)) + return ec.c.CallContext(ctx, nil, "eth_sendRawTransaction", hexutil.Encode(data)) } func toCallArg(msg ethereum.CallMsg) interface{} { diff --git a/ethclient/ethclient_test.go b/ethclient/ethclient_test.go index 046cd7ff17cf..3576d4870e66 100644 --- a/ethclient/ethclient_test.go +++ b/ethclient/ethclient_test.go @@ -17,13 +17,24 @@ package ethclient import ( + "context" + "errors" "fmt" "math/big" "reflect" "testing" + "time" - "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/params" ) // Verify that Client implements the ethereum interfaces. @@ -150,3 +161,177 @@ func TestToFilterArg(t *testing.T) { }) } } + +var ( + testKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + testAddr = crypto.PubkeyToAddress(testKey.PublicKey) + testBalance = big.NewInt(2e10) +) + +func newTestBackend(t *testing.T) (*node.Node, []*types.Block) { + // Generate test chain. + genesis, blocks := generateTestChain() + + // Start Ethereum service. + var ethservice *eth.Ethereum + n, err := node.New(&node.Config{}) + n.Register(func(ctx *node.ServiceContext) (node.Service, error) { + config := ð.Config{Genesis: genesis} + config.Ethash.PowMode = ethash.ModeFake + ethservice, err = eth.New(ctx, config) + return ethservice, err + }) + + // Import the test chain. + if err := n.Start(); err != nil { + t.Fatalf("can't start test node: %v", err) + } + if _, err := ethservice.BlockChain().InsertChain(blocks[1:]); err != nil { + t.Fatalf("can't import test blocks: %v", err) + } + return n, blocks +} + +func generateTestChain() (*core.Genesis, []*types.Block) { + db := rawdb.NewMemoryDatabase() + config := params.AllEthashProtocolChanges + genesis := &core.Genesis{ + Config: config, + Alloc: core.GenesisAlloc{testAddr: {Balance: testBalance}}, + ExtraData: []byte("test genesis"), + Timestamp: 9000, + } + generate := func(i int, g *core.BlockGen) { + g.OffsetTime(5) + g.SetExtra([]byte("test")) + } + gblock := genesis.ToBlock(db) + engine := ethash.NewFaker() + blocks, _ := core.GenerateChain(config, gblock, engine, db, 1, generate) + blocks = append([]*types.Block{gblock}, blocks...) + return genesis, blocks +} + +func TestHeader(t *testing.T) { + backend, chain := newTestBackend(t) + client, _ := backend.Attach() + defer backend.Stop() + defer client.Close() + + tests := map[string]struct { + block *big.Int + want *types.Header + wantErr error + }{ + "genesis": { + block: big.NewInt(0), + want: chain[0].Header(), + }, + "first_block": { + block: big.NewInt(1), + want: chain[1].Header(), + }, + "future_block": { + block: big.NewInt(1000000000), + want: nil, + }, + } + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + ec := NewClient(client) + ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) + defer cancel() + + got, err := ec.HeaderByNumber(ctx, tt.block) + if tt.wantErr != nil && (err == nil || err.Error() != tt.wantErr.Error()) { + t.Fatalf("HeaderByNumber(%v) error = %q, want %q", tt.block, err, tt.wantErr) + } + if got != nil && got.Number.Sign() == 0 { + got.Number = big.NewInt(0) // hack to make DeepEqual work + } + if !reflect.DeepEqual(got, tt.want) { + t.Fatalf("HeaderByNumber(%v)\n = %v\nwant %v", tt.block, got, tt.want) + } + }) + } +} + +func TestBalanceAt(t *testing.T) { + backend, _ := newTestBackend(t) + client, _ := backend.Attach() + defer backend.Stop() + defer client.Close() + + tests := map[string]struct { + account common.Address + block *big.Int + want *big.Int + wantErr error + }{ + "valid_account": { + account: testAddr, + block: big.NewInt(1), + want: testBalance, + }, + "non_existent_account": { + account: common.Address{1}, + block: big.NewInt(1), + want: big.NewInt(0), + }, + "future_block": { + account: testAddr, + block: big.NewInt(1000000000), + want: big.NewInt(0), + wantErr: errors.New("header not found"), + }, + } + for name, tt := range tests { + t.Run(name, func(t *testing.T) { + ec := NewClient(client) + ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) + defer cancel() + + got, err := ec.BalanceAt(ctx, tt.account, tt.block) + if tt.wantErr != nil && (err == nil || err.Error() != tt.wantErr.Error()) { + t.Fatalf("BalanceAt(%x, %v) error = %q, want %q", tt.account, tt.block, err, tt.wantErr) + } + if got.Cmp(tt.want) != 0 { + t.Fatalf("BalanceAt(%x, %v) = %v, want %v", tt.account, tt.block, got, tt.want) + } + }) + } +} + +func TestTransactionInBlockInterrupted(t *testing.T) { + backend, _ := newTestBackend(t) + client, _ := backend.Attach() + defer backend.Stop() + defer client.Close() + + ec := NewClient(client) + ctx, cancel := context.WithCancel(context.Background()) + cancel() + tx, err := ec.TransactionInBlock(ctx, common.Hash{1}, 1) + if tx != nil { + t.Fatal("transaction should be nil") + } + if err == nil { + t.Fatal("error should not be nil") + } +} + +func TestChainID(t *testing.T) { + backend, _ := newTestBackend(t) + client, _ := backend.Attach() + defer backend.Stop() + defer client.Close() + ec := NewClient(client) + + id, err := ec.ChainID(context.Background()) + if err != nil { + t.Fatalf("unexpected error: %v", err) + } + if id == nil || id.Cmp(params.AllEthashProtocolChanges.ChainID) != 0 { + t.Fatalf("ChainID returned wrong number: %+v", id) + } +} diff --git a/ethclient/signer.go b/ethclient/signer.go index a45ca60f5dba..74a93f1e2fd6 100644 --- a/ethclient/signer.go +++ b/ethclient/signer.go @@ -20,8 +20,8 @@ import ( "errors" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" ) // senderFromServer is a types.Signer that remembers the sender address returned by the RPC diff --git a/ethdb/.gitignore b/ethdb/.gitignore deleted file mode 100644 index f725d58d14f7..000000000000 --- a/ethdb/.gitignore +++ /dev/null @@ -1,12 +0,0 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. -# -# If you find yourself ignoring temporary files generated by your text editor -# or operating system, you probably want to add a global ignore instead: -# git config --global core.excludesfile ~/.gitignore_global - -/tmp -*/**/*un~ -*un~ -.DS_Store -*/**/.DS_Store - diff --git a/ethdb/batch.go b/ethdb/batch.go new file mode 100644 index 000000000000..e261415bff9d --- /dev/null +++ b/ethdb/batch.go @@ -0,0 +1,46 @@ +// Copyright 2018 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 ethdb + +// IdealBatchSize defines the size of the data batches should ideally add in one +// write. +const IdealBatchSize = 100 * 1024 + +// Batch is a write-only database that commits changes to its host database +// when Write is called. A batch cannot be used concurrently. +type Batch interface { + KeyValueWriter + + // ValueSize retrieves the amount of data queued up for writing. + ValueSize() int + + // Write flushes any accumulated data to disk. + Write() error + + // Reset resets the batch for reuse. + Reset() + + // Replay replays the batch contents. + Replay(w KeyValueWriter) error +} + +// Batcher wraps the NewBatch method of a backing data store. +type Batcher interface { + // NewBatch creates a write-only database that buffers changes to its host db + // until a final write is called. + NewBatch() Batch +} diff --git a/ethdb/database.go b/ethdb/database.go index 53fb7399704a..0dc14624b98e 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -14,371 +14,118 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// +build !js - +// Package ethdb defines the interfaces for an Ethereum data store. package ethdb -import ( - "fmt" - "strconv" - "strings" - "sync" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/filter" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/util" -) - -const ( - writePauseWarningThrottler = 1 * time.Minute -) - -var OpenFileLimit = 64 - -type LDBDatabase struct { - fn string // filename for reporting - db *leveldb.DB // LevelDB instance - - compTimeMeter metrics.Meter // Meter for measuring the total time spent in database compaction - compReadMeter metrics.Meter // Meter for measuring the data read during compaction - compWriteMeter metrics.Meter // Meter for measuring the data written during compaction - writeDelayNMeter metrics.Meter // Meter for measuring the write delay number due to database compaction - writeDelayMeter metrics.Meter // Meter for measuring the write delay duration due to database compaction - diskReadMeter metrics.Meter // Meter for measuring the effective amount of data read - diskWriteMeter metrics.Meter // Meter for measuring the effective amount of data written - - quitLock sync.Mutex // Mutex protecting the quit channel access - quitChan chan chan error // Quit channel to stop the metrics collection before closing the database - - log log.Logger // Contextual logger tracking the database path -} - -// NewLDBDatabase returns a LevelDB wrapped object. -func NewLDBDatabase(file string, cache int, handles int) (*LDBDatabase, error) { - logger := log.New("database", file) - - // Ensure we have some minimal caching and file guarantees - if cache < 16 { - cache = 16 - } - if handles < 16 { - handles = 16 - } - logger.Info("Allocated cache and file handles", "cache", cache, "handles", handles) - - // Open the db and recover any potential corruptions - db, err := leveldb.OpenFile(file, &opt.Options{ - OpenFilesCacheCapacity: handles, - BlockCacheCapacity: cache / 2 * opt.MiB, - WriteBuffer: cache / 4 * opt.MiB, // Two of these are used internally - Filter: filter.NewBloomFilter(10), - }) - if _, corrupted := err.(*errors.ErrCorrupted); corrupted { - db, err = leveldb.RecoverFile(file, nil) - } - // (Re)check for errors and abort if opening of the db failed - if err != nil { - return nil, err - } - return &LDBDatabase{ - fn: file, - db: db, - log: logger, - }, nil -} - -// Path returns the path to the database directory. -func (db *LDBDatabase) Path() string { - return db.fn -} - -// Put puts the given key / value to the queue -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) -} +import "io" -// Get returns the given key if it's present. -func (db *LDBDatabase) Get(key []byte) ([]byte, error) { - dat, err := db.db.Get(key, nil) - if err != nil { - return nil, err - } - return dat, nil -} +// KeyValueReader wraps the Has and Get method of a backing data store. +type KeyValueReader interface { + // Has retrieves if a key is present in the key-value data store. + Has(key []byte) (bool, error) -// Delete deletes the key from the queue and database -func (db *LDBDatabase) Delete(key []byte) error { - return db.db.Delete(key, nil) + // Get retrieves the given key if it's present in the key-value data store. + Get(key []byte) ([]byte, error) } -func (db *LDBDatabase) NewIterator() iterator.Iterator { - return db.db.NewIterator(nil, nil) -} +// KeyValueWriter wraps the Put method of a backing data store. +type KeyValueWriter interface { + // Put inserts the given value into the key-value data store. + Put(key []byte, value []byte) error -// NewIteratorWithPrefix returns a iterator to iterate over subset of database content with a particular prefix. -func (db *LDBDatabase) NewIteratorWithPrefix(prefix []byte) iterator.Iterator { - return db.db.NewIterator(util.BytesPrefix(prefix), nil) + // Delete removes the key from the key-value data store. + Delete(key []byte) error } -func (db *LDBDatabase) Close() { - // Stop the metrics collection to avoid internal database races - db.quitLock.Lock() - defer db.quitLock.Unlock() - - if db.quitChan != nil { - errc := make(chan error) - db.quitChan <- errc - if err := <-errc; err != nil { - db.log.Error("Metrics collection failed", "err", err) - } - db.quitChan = nil - } - err := db.db.Close() - if err == nil { - db.log.Info("Database closed") - } else { - db.log.Error("Failed to close database", "err", err) - } +// Stater wraps the Stat method of a backing data store. +type Stater interface { + // Stat returns a particular internal stat of the database. + Stat(property string) (string, error) } -func (db *LDBDatabase) LDB() *leveldb.DB { - return db.db +// Compacter wraps the Compact method of a backing data store. +type Compacter interface { + // Compact flattens the underlying data store for the given key range. In essence, + // deleted and overwritten versions are discarded, and the data is rearranged to + // reduce the cost of operations needed to access them. + // + // A nil start is treated as a key before all keys in the data store; a nil limit + // is treated as a key after all keys in the data store. If both is nil then it + // will compact entire data store. + Compact(start []byte, limit []byte) error } -// Meter configures the database metrics collectors and -func (db *LDBDatabase) Meter(prefix string) { - // Initialize all the metrics collector at the requested prefix - db.compTimeMeter = metrics.NewRegisteredMeter(prefix+"compact/time", nil) - db.compReadMeter = metrics.NewRegisteredMeter(prefix+"compact/input", nil) - db.compWriteMeter = metrics.NewRegisteredMeter(prefix+"compact/output", nil) - db.diskReadMeter = metrics.NewRegisteredMeter(prefix+"disk/read", nil) - db.diskWriteMeter = metrics.NewRegisteredMeter(prefix+"disk/write", nil) - db.writeDelayMeter = metrics.NewRegisteredMeter(prefix+"compact/writedelay/duration", nil) - db.writeDelayNMeter = metrics.NewRegisteredMeter(prefix+"compact/writedelay/counter", nil) - - // Create a quit channel for the periodic collector and run it - db.quitLock.Lock() - db.quitChan = make(chan chan error) - db.quitLock.Unlock() - - go db.meter(3 * time.Second) +// KeyValueStore contains all the methods required to allow handling different +// key-value data stores backing the high level database. +type KeyValueStore interface { + KeyValueReader + KeyValueWriter + Batcher + Iteratee + Stater + Compacter + io.Closer } -// meter periodically retrieves internal leveldb counters and reports them to -// the metrics subsystem. -// -// This is how a stats table look like (currently): -// Compactions -// Level | Tables | Size(MB) | Time(sec) | Read(MB) | Write(MB) -// -------+------------+---------------+---------------+---------------+--------------- -// 0 | 0 | 0.00000 | 1.27969 | 0.00000 | 12.31098 -// 1 | 85 | 109.27913 | 28.09293 | 213.92493 | 214.26294 -// 2 | 523 | 1000.37159 | 7.26059 | 66.86342 | 66.77884 -// 3 | 570 | 1113.18458 | 0.00000 | 0.00000 | 0.00000 -// -// This is how the write delay look like (currently): -// DelayN:5 Delay:406.604657ms Paused: false -// -// This is how the iostats look like (currently): -// Read(MB):3895.04860 Write(MB):3654.64712 -func (db *LDBDatabase) meter(refresh time.Duration) { - // Create the counters to store current and previous compaction values - compactions := make([][]float64, 2) - for i := 0; i < 2; i++ { - compactions[i] = make([]float64, 3) - } - // Create storage for iostats. - var iostats [2]float64 - - // Create storage and warning log tracer for write delay. - var ( - delaystats [2]int64 - lastWritePaused time.Time - ) - - var ( - errc chan error - merr error - ) - - // Iterate ad infinitum and collect the stats - for i := 1; errc == nil && merr == nil; i++ { - // Retrieve the database stats - stats, err := db.db.GetProperty("leveldb.stats") - if err != nil { - db.log.Error("Failed to read database stats", "err", err) - merr = err - continue - } - // Find the compaction table, skip the header - lines := strings.Split(stats, "\n") - for len(lines) > 0 && strings.TrimSpace(lines[0]) != "Compactions" { - lines = lines[1:] - } - if len(lines) <= 3 { - db.log.Error("Compaction table not found") - merr = errors.New("compaction table not found") - continue - } - lines = lines[3:] +// AncientReader contains the methods required to read from immutable ancient data. +type AncientReader interface { + // HasAncient returns an indicator whether the specified data exists in the + // ancient store. + HasAncient(kind string, number uint64) (bool, error) - // Iterate over all the table rows, and accumulate the entries - for j := 0; j < len(compactions[i%2]); j++ { - compactions[i%2][j] = 0 - } - for _, line := range lines { - parts := strings.Split(line, "|") - if len(parts) != 6 { - break - } - for idx, counter := range parts[3:] { - value, err := strconv.ParseFloat(strings.TrimSpace(counter), 64) - if err != nil { - db.log.Error("Compaction entry parsing failed", "err", err) - merr = err - continue - } - compactions[i%2][idx] += value - } - } - // Update all the requested meters - if db.compTimeMeter != nil { - db.compTimeMeter.Mark(int64((compactions[i%2][0] - compactions[(i-1)%2][0]) * 1000 * 1000 * 1000)) - } - if db.compReadMeter != nil { - db.compReadMeter.Mark(int64((compactions[i%2][1] - compactions[(i-1)%2][1]) * 1024 * 1024)) - } - if db.compWriteMeter != nil { - db.compWriteMeter.Mark(int64((compactions[i%2][2] - compactions[(i-1)%2][2]) * 1024 * 1024)) - } + // Ancient retrieves an ancient binary blob from the append-only immutable files. + Ancient(kind string, number uint64) ([]byte, error) - // Retrieve the write delay statistic - writedelay, err := db.db.GetProperty("leveldb.writedelay") - if err != nil { - db.log.Error("Failed to read database write delay statistic", "err", err) - merr = err - continue - } - var ( - delayN int64 - delayDuration string - duration time.Duration - paused bool - ) - if n, err := fmt.Sscanf(writedelay, "DelayN:%d Delay:%s Paused:%t", &delayN, &delayDuration, &paused); n != 3 || err != nil { - db.log.Error("Write delay statistic not found") - merr = err - continue - } - duration, err = time.ParseDuration(delayDuration) - if err != nil { - db.log.Error("Failed to parse delay duration", "err", err) - merr = err - continue - } - if db.writeDelayNMeter != nil { - db.writeDelayNMeter.Mark(delayN - delaystats[0]) - } - if db.writeDelayMeter != nil { - db.writeDelayMeter.Mark(duration.Nanoseconds() - delaystats[1]) - } - // If a warning that db is performing compaction has been displayed, any subsequent - // warnings will be withheld for one minute not to overwhelm the user. - if paused && delayN-delaystats[0] == 0 && duration.Nanoseconds()-delaystats[1] == 0 && - time.Now().After(lastWritePaused.Add(writePauseWarningThrottler)) { - db.log.Warn("Database compacting, degraded performance") - lastWritePaused = time.Now() - } - delaystats[0], delaystats[1] = delayN, duration.Nanoseconds() + // Ancients returns the ancient item numbers in the ancient store. + Ancients() (uint64, error) - // Retrieve the database iostats. - ioStats, err := db.db.GetProperty("leveldb.iostats") - if err != nil { - db.log.Error("Failed to read database iostats", "err", err) - merr = err - continue - } - var nRead, nWrite float64 - parts := strings.Split(ioStats, " ") - if len(parts) < 2 { - db.log.Error("Bad syntax of ioStats", "ioStats", ioStats) - merr = fmt.Errorf("bad syntax of ioStats %s", ioStats) - continue - } - if n, err := fmt.Sscanf(parts[0], "Read(MB):%f", &nRead); n != 1 || err != nil { - db.log.Error("Bad syntax of read entry", "entry", parts[0]) - merr = err - continue - } - if n, err := fmt.Sscanf(parts[1], "Write(MB):%f", &nWrite); n != 1 || err != nil { - db.log.Error("Bad syntax of write entry", "entry", parts[1]) - merr = err - continue - } - if db.diskReadMeter != nil { - db.diskReadMeter.Mark(int64((nRead - iostats[0]) * 1024 * 1024)) - } - if db.diskWriteMeter != nil { - db.diskWriteMeter.Mark(int64((nWrite - iostats[1]) * 1024 * 1024)) - } - iostats[0], iostats[1] = nRead, nWrite - - // Sleep a bit, then repeat the stats collection - select { - case errc = <-db.quitChan: - // Quit requesting, stop hammering the database - case <-time.After(refresh): - // Timeout, gather a new set of stats - } - } - - if errc == nil { - errc = <-db.quitChan - } - errc <- merr + // AncientSize returns the ancient size of the specified category. + AncientSize(kind string) (uint64, error) } -func (db *LDBDatabase) NewBatch() Batch { - return &ldbBatch{db: db.db, b: new(leveldb.Batch)} -} +// AncientWriter contains the methods required to write to immutable ancient data. +type AncientWriter interface { + // AppendAncient injects all binary blobs belong to block at the end of the + // append-only immutable table files. + AppendAncient(number uint64, hash, header, body, receipt, td []byte) error -type ldbBatch struct { - db *leveldb.DB - b *leveldb.Batch - size int -} + // TruncateAncients discards all but the first n ancient data from the ancient store. + TruncateAncients(n uint64) error -func (b *ldbBatch) Put(key, value []byte) error { - b.b.Put(key, value) - b.size += len(value) - return nil + // Sync flushes all in-memory ancient store data to disk. + Sync() error } -func (b *ldbBatch) Delete(key []byte) error { - b.b.Delete(key) - b.size += 1 - return nil +// Reader contains the methods required to read data from both key-value as well as +// immutable ancient data. +type Reader interface { + KeyValueReader + AncientReader } -func (b *ldbBatch) Write() error { - return b.db.Write(b.b, nil) +// Writer contains the methods required to write data to both key-value as well as +// immutable ancient data. +type Writer interface { + KeyValueWriter + AncientWriter } -func (b *ldbBatch) ValueSize() int { - return b.size +// AncientStore contains all the methods required to allow handling different +// ancient data stores backing immutable chain data store. +type AncientStore interface { + AncientReader + AncientWriter + io.Closer } -func (b *ldbBatch) Reset() { - b.b.Reset() - b.size = 0 +// Database contains all the methods required by the high level database to not +// only access the key-value data store but also the chain freezer. +type Database interface { + Reader + Writer + Batcher + Iteratee + Stater + Compacter + io.Closer } diff --git a/ethdb/database_js.go b/ethdb/database_js.go deleted file mode 100644 index ba6eeb5a237d..000000000000 --- a/ethdb/database_js.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build js - -package ethdb - -import ( - "errors" -) - -var errNotSupported = errors.New("ethdb: not supported") - -type LDBDatabase struct { -} - -// NewLDBDatabase returns a LevelDB wrapped object. -func NewLDBDatabase(file string, cache int, handles int) (*LDBDatabase, error) { - return nil, errNotSupported -} - -// Path returns the path to the database directory. -func (db *LDBDatabase) Path() string { - return "" -} - -// Put puts the given key / value to the queue -func (db *LDBDatabase) Put(key []byte, value []byte) error { - return errNotSupported -} - -func (db *LDBDatabase) Has(key []byte) (bool, error) { - return false, errNotSupported -} - -// Get returns the given key if it's present. -func (db *LDBDatabase) Get(key []byte) ([]byte, error) { - return nil, errNotSupported -} - -// Delete deletes the key from the queue and database -func (db *LDBDatabase) Delete(key []byte) error { - return errNotSupported -} - -func (db *LDBDatabase) Close() { -} - -// Meter configures the database metrics collectors and -func (db *LDBDatabase) Meter(prefix string) { -} - -func (db *LDBDatabase) NewBatch() Batch { - return nil -} diff --git a/ethdb/database_js_test.go b/ethdb/database_js_test.go deleted file mode 100644 index d64ae59a27fb..000000000000 --- a/ethdb/database_js_test.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build js - -package ethdb_test - -import ( - "github.com/nebulaai/nbai-node/ethdb" -) - -var _ ethdb.Database = ðdb.LDBDatabase{} diff --git a/ethdb/database_test.go b/ethdb/database_test.go deleted file mode 100644 index 20f6344ec321..000000000000 --- a/ethdb/database_test.go +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// +build !js - -package ethdb_test - -import ( - "bytes" - "fmt" - "io/ioutil" - "os" - "strconv" - "sync" - "testing" - - "github.com/nebulaai/nbai-node/ethdb" -) - -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()) - } - - 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) { - testPutGet(ethdb.NewMemDatabase(), t) -} - -func testPutGet(db ethdb.Database, t *testing.T) { - t.Parallel() - - for _, k := range test_values { - err := db.Put([]byte(k), nil) - if err != nil { - t.Fatalf("put failed: %v", err) - } - } - - for _, k := range test_values { - data, err := db.Get([]byte(k)) - if err != nil { - t.Fatalf("get failed: %v", err) - } - if len(data) != 0 { - t.Fatalf("get returned wrong result, got %q expected nil", string(data)) - } - } - - _, err := db.Get([]byte("non-exist-key")) - if err == nil { - t.Fatalf("expect to return a not found error") - } - - 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) { - testParallelPutGet(ethdb.NewMemDatabase(), 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/dbtest/testsuite.go b/ethdb/dbtest/testsuite.go new file mode 100644 index 000000000000..dce2ba2a1f74 --- /dev/null +++ b/ethdb/dbtest/testsuite.go @@ -0,0 +1,315 @@ +// Copyright 2019 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 dbtest + +import ( + "bytes" + "reflect" + "sort" + "testing" + + "github.com/ethereum/go-ethereum/ethdb" +) + +// TestDatabaseSuite runs a suite of tests against a KeyValueStore database +// implementation. +func TestDatabaseSuite(t *testing.T, New func() ethdb.KeyValueStore) { + t.Run("Iterator", func(t *testing.T) { + tests := []struct { + content map[string]string + prefix string + order []string + }{ + // Empty databases should be iterable + {map[string]string{}, "", nil}, + {map[string]string{}, "non-existent-prefix", nil}, + + // Single-item databases should be iterable + {map[string]string{"key": "val"}, "", []string{"key"}}, + {map[string]string{"key": "val"}, "k", []string{"key"}}, + {map[string]string{"key": "val"}, "l", nil}, + + // Multi-item databases should be fully iterable + { + map[string]string{"k1": "v1", "k5": "v5", "k2": "v2", "k4": "v4", "k3": "v3"}, + "", + []string{"k1", "k2", "k3", "k4", "k5"}, + }, + { + map[string]string{"k1": "v1", "k5": "v5", "k2": "v2", "k4": "v4", "k3": "v3"}, + "k", + []string{"k1", "k2", "k3", "k4", "k5"}, + }, + { + map[string]string{"k1": "v1", "k5": "v5", "k2": "v2", "k4": "v4", "k3": "v3"}, + "l", + nil, + }, + // Multi-item databases should be prefix-iterable + { + map[string]string{ + "ka1": "va1", "ka5": "va5", "ka2": "va2", "ka4": "va4", "ka3": "va3", + "kb1": "vb1", "kb5": "vb5", "kb2": "vb2", "kb4": "vb4", "kb3": "vb3", + }, + "ka", + []string{"ka1", "ka2", "ka3", "ka4", "ka5"}, + }, + { + map[string]string{ + "ka1": "va1", "ka5": "va5", "ka2": "va2", "ka4": "va4", "ka3": "va3", + "kb1": "vb1", "kb5": "vb5", "kb2": "vb2", "kb4": "vb4", "kb3": "vb3", + }, + "kc", + nil, + }, + } + for i, tt := range tests { + // Create the key-value data store + db := New() + for key, val := range tt.content { + if err := db.Put([]byte(key), []byte(val)); err != nil { + t.Fatalf("test %d: failed to insert item %s:%s into database: %v", i, key, val, err) + } + } + // Iterate over the database with the given configs and verify the results + it, idx := db.NewIteratorWithPrefix([]byte(tt.prefix)), 0 + for it.Next() { + if len(tt.order) <= idx { + t.Errorf("test %d: prefix=%q more items than expected: checking idx=%d (key %q), expecting len=%d", i, tt.prefix, idx, it.Key(), len(tt.order)) + break + } + if !bytes.Equal(it.Key(), []byte(tt.order[idx])) { + t.Errorf("test %d: item %d: key mismatch: have %s, want %s", i, idx, string(it.Key()), tt.order[idx]) + } + if !bytes.Equal(it.Value(), []byte(tt.content[tt.order[idx]])) { + t.Errorf("test %d: item %d: value mismatch: have %s, want %s", i, idx, string(it.Value()), tt.content[tt.order[idx]]) + } + idx++ + } + if err := it.Error(); err != nil { + t.Errorf("test %d: iteration failed: %v", i, err) + } + if idx != len(tt.order) { + t.Errorf("test %d: iteration terminated prematurely: have %d, want %d", i, idx, len(tt.order)) + } + db.Close() + } + }) + + t.Run("IteratorWith", func(t *testing.T) { + db := New() + defer db.Close() + + keys := []string{"1", "2", "3", "4", "6", "10", "11", "12", "20", "21", "22"} + sort.Strings(keys) // 1, 10, 11, etc + + for _, k := range keys { + if err := db.Put([]byte(k), nil); err != nil { + t.Fatal(err) + } + } + + { + it := db.NewIterator() + got, want := iterateKeys(it), keys + if err := it.Error(); err != nil { + t.Fatal(err) + } + it.Release() + if !reflect.DeepEqual(got, want) { + t.Errorf("Iterator: got: %s; want: %s", got, want) + } + } + + { + it := db.NewIteratorWithPrefix([]byte("1")) + got, want := iterateKeys(it), []string{"1", "10", "11", "12"} + if err := it.Error(); err != nil { + t.Fatal(err) + } + it.Release() + if !reflect.DeepEqual(got, want) { + t.Errorf("IteratorWithPrefix(1): got: %s; want: %s", got, want) + } + } + + { + it := db.NewIteratorWithPrefix([]byte("5")) + got, want := iterateKeys(it), []string{} + if err := it.Error(); err != nil { + t.Fatal(err) + } + it.Release() + if !reflect.DeepEqual(got, want) { + t.Errorf("IteratorWithPrefix(1): got: %s; want: %s", got, want) + } + } + + { + it := db.NewIteratorWithStart([]byte("2")) + got, want := iterateKeys(it), []string{"2", "20", "21", "22", "3", "4", "6"} + if err := it.Error(); err != nil { + t.Fatal(err) + } + it.Release() + if !reflect.DeepEqual(got, want) { + t.Errorf("IteratorWithStart(2): got: %s; want: %s", got, want) + } + } + + { + it := db.NewIteratorWithStart([]byte("5")) + got, want := iterateKeys(it), []string{"6"} + if err := it.Error(); err != nil { + t.Fatal(err) + } + it.Release() + if !reflect.DeepEqual(got, want) { + t.Errorf("IteratorWithStart(2): got: %s; want: %s", got, want) + } + } + }) + + t.Run("KeyValueOperations", func(t *testing.T) { + db := New() + defer db.Close() + + key := []byte("foo") + + if got, err := db.Has(key); err != nil { + t.Error(err) + } else if got { + t.Errorf("wrong value: %t", got) + } + + value := []byte("hello world") + if err := db.Put(key, value); err != nil { + t.Error(err) + } + + if got, err := db.Has(key); err != nil { + t.Error(err) + } else if !got { + t.Errorf("wrong value: %t", got) + } + + if got, err := db.Get(key); err != nil { + t.Error(err) + } else if !bytes.Equal(got, value) { + t.Errorf("wrong value: %q", got) + } + + if err := db.Delete(key); err != nil { + t.Error(err) + } + + if got, err := db.Has(key); err != nil { + t.Error(err) + } else if got { + t.Errorf("wrong value: %t", got) + } + }) + + t.Run("Batch", func(t *testing.T) { + db := New() + defer db.Close() + + b := db.NewBatch() + for _, k := range []string{"1", "2", "3", "4"} { + if err := b.Put([]byte(k), nil); err != nil { + t.Fatal(err) + } + } + + if has, err := db.Has([]byte("1")); err != nil { + t.Fatal(err) + } else if has { + t.Error("db contains element before batch write") + } + + if err := b.Write(); err != nil { + t.Fatal(err) + } + + { + it := db.NewIterator() + if got, want := iterateKeys(it), []string{"1", "2", "3", "4"}; !reflect.DeepEqual(got, want) { + t.Errorf("got: %s; want: %s", got, want) + } + it.Release() + } + + b.Reset() + + // Mix writes and deletes in batch + b.Put([]byte("5"), nil) + b.Delete([]byte("1")) + b.Put([]byte("6"), nil) + b.Delete([]byte("3")) + b.Put([]byte("3"), nil) + + if err := b.Write(); err != nil { + t.Fatal(err) + } + + { + it := db.NewIterator() + if got, want := iterateKeys(it), []string{"2", "3", "4", "5", "6"}; !reflect.DeepEqual(got, want) { + t.Errorf("got: %s; want: %s", got, want) + } + it.Release() + } + }) + + t.Run("BatchReplay", func(t *testing.T) { + db := New() + defer db.Close() + + want := []string{"1", "2", "3", "4"} + b := db.NewBatch() + for _, k := range want { + if err := b.Put([]byte(k), nil); err != nil { + t.Fatal(err) + } + } + + b2 := db.NewBatch() + if err := b.Replay(b2); err != nil { + t.Fatal(err) + } + + if err := b2.Replay(db); err != nil { + t.Fatal(err) + } + + it := db.NewIterator() + if got := iterateKeys(it); !reflect.DeepEqual(got, want) { + t.Errorf("got: %s; want: %s", got, want) + } + it.Release() + }) + +} + +func iterateKeys(it ethdb.Iterator) []string { + keys := []string{} + for it.Next() { + keys = append(keys, string(it.Key())) + } + sort.Strings(keys) + return keys +} diff --git a/ethdb/interface.go b/ethdb/interface.go deleted file mode 100644 index af13557798cf..000000000000 --- a/ethdb/interface.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ethdb - -// 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 -} - -// Deleter wraps the database delete operation supported by both batches and regular databases. -type Deleter interface { - Delete(key []byte) error -} - -// Database wraps all database operations. All methods are safe for concurrent use. -type Database interface { - Putter - Deleter - Get(key []byte) ([]byte, error) - Has(key []byte) (bool, 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 { - Putter - Deleter - ValueSize() int // amount of data in the batch - Write() error - // Reset resets the batch for reuse - Reset() -} diff --git a/ethdb/iterator.go b/ethdb/iterator.go new file mode 100644 index 000000000000..419e9bdfc21f --- /dev/null +++ b/ethdb/iterator.go @@ -0,0 +1,66 @@ +// Copyright 2018 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 ethdb + +// Iterator iterates over a database's key/value pairs in ascending key order. +// +// When it encounters an error any seek will return false and will yield no key/ +// value pairs. The error can be queried by calling the Error method. Calling +// Release is still necessary. +// +// An iterator must be released after use, but it is not necessary to read an +// iterator until exhaustion. An iterator is not safe for concurrent use, but it +// is safe to use multiple iterators concurrently. +type Iterator interface { + // Next moves the iterator to the next key/value pair. It returns whether the + // iterator is exhausted. + Next() bool + + // Error returns any accumulated error. Exhausting all the key/value pairs + // is not considered to be an error. + Error() error + + // Key returns the key of the current key/value pair, or nil if done. The caller + // should not modify the contents of the returned slice, and its contents may + // change on the next call to Next. + Key() []byte + + // Value returns the value of the current key/value pair, or nil if done. The + // caller should not modify the contents of the returned slice, and its contents + // may change on the next call to Next. + Value() []byte + + // Release releases associated resources. Release should always succeed and can + // be called multiple times without causing error. + Release() +} + +// Iteratee wraps the NewIterator methods of a backing data store. +type Iteratee interface { + // NewIterator creates a binary-alphabetical iterator over the entire keyspace + // contained within the key-value database. + NewIterator() Iterator + + // NewIteratorWithStart creates a binary-alphabetical iterator over a subset of + // database content starting at a particular initial key (or after, if it does + // not exist). + NewIteratorWithStart(start []byte) Iterator + + // NewIteratorWithPrefix creates a binary-alphabetical iterator over a subset + // of database content with a particular key prefix. + NewIteratorWithPrefix(prefix []byte) Iterator +} diff --git a/ethdb/leveldb/leveldb.go b/ethdb/leveldb/leveldb.go new file mode 100644 index 000000000000..378d4c3cd236 --- /dev/null +++ b/ethdb/leveldb/leveldb.go @@ -0,0 +1,490 @@ +// Copyright 2018 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 . + +// +build !js + +// Package leveldb implements the key-value database layer based on LevelDB. +package leveldb + +import ( + "fmt" + "strconv" + "strings" + "sync" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/errors" + "github.com/syndtr/goleveldb/leveldb/filter" + "github.com/syndtr/goleveldb/leveldb/opt" + "github.com/syndtr/goleveldb/leveldb/util" +) + +const ( + // degradationWarnInterval specifies how often warning should be printed if the + // leveldb database cannot keep up with requested writes. + degradationWarnInterval = time.Minute + + // minCache is the minimum amount of memory in megabytes to allocate to leveldb + // read and write caching, split half and half. + minCache = 16 + + // minHandles is the minimum number of files handles to allocate to the open + // database files. + minHandles = 16 + + // metricsGatheringInterval specifies the interval to retrieve leveldb database + // compaction, io and pause stats to report to the user. + metricsGatheringInterval = 3 * time.Second +) + +// Database is a persistent key-value store. Apart from basic data storage +// functionality it also supports batch writes and iterating over the keyspace in +// binary-alphabetical order. +type Database struct { + fn string // filename for reporting + db *leveldb.DB // LevelDB instance + + compTimeMeter metrics.Meter // Meter for measuring the total time spent in database compaction + compReadMeter metrics.Meter // Meter for measuring the data read during compaction + compWriteMeter metrics.Meter // Meter for measuring the data written during compaction + writeDelayNMeter metrics.Meter // Meter for measuring the write delay number due to database compaction + writeDelayMeter metrics.Meter // Meter for measuring the write delay duration due to database compaction + diskSizeGauge metrics.Gauge // Gauge for tracking the size of all the levels in the database + diskReadMeter metrics.Meter // Meter for measuring the effective amount of data read + diskWriteMeter metrics.Meter // Meter for measuring the effective amount of data written + memCompGauge metrics.Gauge // Gauge for tracking the number of memory compaction + level0CompGauge metrics.Gauge // Gauge for tracking the number of table compaction in level0 + nonlevel0CompGauge metrics.Gauge // Gauge for tracking the number of table compaction in non0 level + seekCompGauge metrics.Gauge // Gauge for tracking the number of table compaction caused by read opt + + quitLock sync.Mutex // Mutex protecting the quit channel access + quitChan chan chan error // Quit channel to stop the metrics collection before closing the database + + log log.Logger // Contextual logger tracking the database path +} + +// New returns a wrapped LevelDB object. The namespace is the prefix that the +// metrics reporting should use for surfacing internal stats. +func New(file string, cache int, handles int, namespace string) (*Database, error) { + // Ensure we have some minimal caching and file guarantees + if cache < minCache { + cache = minCache + } + if handles < minHandles { + handles = minHandles + } + logger := log.New("database", file) + logger.Info("Allocated cache and file handles", "cache", common.StorageSize(cache*1024*1024), "handles", handles) + + // Open the db and recover any potential corruptions + db, err := leveldb.OpenFile(file, &opt.Options{ + OpenFilesCacheCapacity: handles, + BlockCacheCapacity: cache / 2 * opt.MiB, + WriteBuffer: cache / 4 * opt.MiB, // Two of these are used internally + Filter: filter.NewBloomFilter(10), + DisableSeeksCompaction: true, + }) + if _, corrupted := err.(*errors.ErrCorrupted); corrupted { + db, err = leveldb.RecoverFile(file, nil) + } + if err != nil { + return nil, err + } + // Assemble the wrapper with all the registered metrics + ldb := &Database{ + fn: file, + db: db, + log: logger, + quitChan: make(chan chan error), + } + ldb.compTimeMeter = metrics.NewRegisteredMeter(namespace+"compact/time", nil) + ldb.compReadMeter = metrics.NewRegisteredMeter(namespace+"compact/input", nil) + ldb.compWriteMeter = metrics.NewRegisteredMeter(namespace+"compact/output", nil) + ldb.diskSizeGauge = metrics.NewRegisteredGauge(namespace+"disk/size", nil) + ldb.diskReadMeter = metrics.NewRegisteredMeter(namespace+"disk/read", nil) + ldb.diskWriteMeter = metrics.NewRegisteredMeter(namespace+"disk/write", nil) + ldb.writeDelayMeter = metrics.NewRegisteredMeter(namespace+"compact/writedelay/duration", nil) + ldb.writeDelayNMeter = metrics.NewRegisteredMeter(namespace+"compact/writedelay/counter", nil) + ldb.memCompGauge = metrics.NewRegisteredGauge(namespace+"compact/memory", nil) + ldb.level0CompGauge = metrics.NewRegisteredGauge(namespace+"compact/level0", nil) + ldb.nonlevel0CompGauge = metrics.NewRegisteredGauge(namespace+"compact/nonlevel0", nil) + ldb.seekCompGauge = metrics.NewRegisteredGauge(namespace+"compact/seek", nil) + + // Start up the metrics gathering and return + go ldb.meter(metricsGatheringInterval) + return ldb, nil +} + +// Close stops the metrics collection, flushes any pending data to disk and closes +// all io accesses to the underlying key-value store. +func (db *Database) Close() error { + db.quitLock.Lock() + defer db.quitLock.Unlock() + + if db.quitChan != nil { + errc := make(chan error) + db.quitChan <- errc + if err := <-errc; err != nil { + db.log.Error("Metrics collection failed", "err", err) + } + db.quitChan = nil + } + return db.db.Close() +} + +// Has retrieves if a key is present in the key-value store. +func (db *Database) Has(key []byte) (bool, error) { + return db.db.Has(key, nil) +} + +// Get retrieves the given key if it's present in the key-value store. +func (db *Database) Get(key []byte) ([]byte, error) { + dat, err := db.db.Get(key, nil) + if err != nil { + return nil, err + } + return dat, nil +} + +// Put inserts the given value into the key-value store. +func (db *Database) Put(key []byte, value []byte) error { + return db.db.Put(key, value, nil) +} + +// Delete removes the key from the key-value store. +func (db *Database) Delete(key []byte) error { + return db.db.Delete(key, nil) +} + +// NewBatch creates a write-only key-value store that buffers changes to its host +// database until a final write is called. +func (db *Database) NewBatch() ethdb.Batch { + return &batch{ + db: db.db, + b: new(leveldb.Batch), + } +} + +// NewIterator creates a binary-alphabetical iterator over the entire keyspace +// contained within the leveldb database. +func (db *Database) NewIterator() ethdb.Iterator { + return db.db.NewIterator(new(util.Range), nil) +} + +// NewIteratorWithStart creates a binary-alphabetical iterator over a subset of +// database content starting at a particular initial key (or after, if it does +// not exist). +func (db *Database) NewIteratorWithStart(start []byte) ethdb.Iterator { + return db.db.NewIterator(&util.Range{Start: start}, nil) +} + +// NewIteratorWithPrefix creates a binary-alphabetical iterator over a subset +// of database content with a particular key prefix. +func (db *Database) NewIteratorWithPrefix(prefix []byte) ethdb.Iterator { + return db.db.NewIterator(util.BytesPrefix(prefix), nil) +} + +// Stat returns a particular internal stat of the database. +func (db *Database) Stat(property string) (string, error) { + return db.db.GetProperty(property) +} + +// Compact flattens the underlying data store for the given key range. In essence, +// deleted and overwritten versions are discarded, and the data is rearranged to +// reduce the cost of operations needed to access them. +// +// A nil start is treated as a key before all keys in the data store; a nil limit +// is treated as a key after all keys in the data store. If both is nil then it +// will compact entire data store. +func (db *Database) Compact(start []byte, limit []byte) error { + return db.db.CompactRange(util.Range{Start: start, Limit: limit}) +} + +// Path returns the path to the database directory. +func (db *Database) Path() string { + return db.fn +} + +// meter periodically retrieves internal leveldb counters and reports them to +// the metrics subsystem. +// +// This is how a LevelDB stats table looks like (currently): +// Compactions +// Level | Tables | Size(MB) | Time(sec) | Read(MB) | Write(MB) +// -------+------------+---------------+---------------+---------------+--------------- +// 0 | 0 | 0.00000 | 1.27969 | 0.00000 | 12.31098 +// 1 | 85 | 109.27913 | 28.09293 | 213.92493 | 214.26294 +// 2 | 523 | 1000.37159 | 7.26059 | 66.86342 | 66.77884 +// 3 | 570 | 1113.18458 | 0.00000 | 0.00000 | 0.00000 +// +// This is how the write delay look like (currently): +// DelayN:5 Delay:406.604657ms Paused: false +// +// This is how the iostats look like (currently): +// Read(MB):3895.04860 Write(MB):3654.64712 +func (db *Database) meter(refresh time.Duration) { + // Create the counters to store current and previous compaction values + compactions := make([][]float64, 2) + for i := 0; i < 2; i++ { + compactions[i] = make([]float64, 4) + } + // Create storage for iostats. + var iostats [2]float64 + + // Create storage and warning log tracer for write delay. + var ( + delaystats [2]int64 + lastWritePaused time.Time + ) + + var ( + errc chan error + merr error + ) + + // Iterate ad infinitum and collect the stats + for i := 1; errc == nil && merr == nil; i++ { + // Retrieve the database stats + stats, err := db.db.GetProperty("leveldb.stats") + if err != nil { + db.log.Error("Failed to read database stats", "err", err) + merr = err + continue + } + // Find the compaction table, skip the header + lines := strings.Split(stats, "\n") + for len(lines) > 0 && strings.TrimSpace(lines[0]) != "Compactions" { + lines = lines[1:] + } + if len(lines) <= 3 { + db.log.Error("Compaction leveldbTable not found") + merr = errors.New("compaction leveldbTable not found") + continue + } + lines = lines[3:] + + // Iterate over all the leveldbTable rows, and accumulate the entries + for j := 0; j < len(compactions[i%2]); j++ { + compactions[i%2][j] = 0 + } + for _, line := range lines { + parts := strings.Split(line, "|") + if len(parts) != 6 { + break + } + for idx, counter := range parts[2:] { + value, err := strconv.ParseFloat(strings.TrimSpace(counter), 64) + if err != nil { + db.log.Error("Compaction entry parsing failed", "err", err) + merr = err + continue + } + compactions[i%2][idx] += value + } + } + // Update all the requested meters + if db.diskSizeGauge != nil { + db.diskSizeGauge.Update(int64(compactions[i%2][0] * 1024 * 1024)) + } + if db.compTimeMeter != nil { + db.compTimeMeter.Mark(int64((compactions[i%2][1] - compactions[(i-1)%2][1]) * 1000 * 1000 * 1000)) + } + if db.compReadMeter != nil { + db.compReadMeter.Mark(int64((compactions[i%2][2] - compactions[(i-1)%2][2]) * 1024 * 1024)) + } + if db.compWriteMeter != nil { + db.compWriteMeter.Mark(int64((compactions[i%2][3] - compactions[(i-1)%2][3]) * 1024 * 1024)) + } + // Retrieve the write delay statistic + writedelay, err := db.db.GetProperty("leveldb.writedelay") + if err != nil { + db.log.Error("Failed to read database write delay statistic", "err", err) + merr = err + continue + } + var ( + delayN int64 + delayDuration string + duration time.Duration + paused bool + ) + if n, err := fmt.Sscanf(writedelay, "DelayN:%d Delay:%s Paused:%t", &delayN, &delayDuration, &paused); n != 3 || err != nil { + db.log.Error("Write delay statistic not found") + merr = err + continue + } + duration, err = time.ParseDuration(delayDuration) + if err != nil { + db.log.Error("Failed to parse delay duration", "err", err) + merr = err + continue + } + if db.writeDelayNMeter != nil { + db.writeDelayNMeter.Mark(delayN - delaystats[0]) + } + if db.writeDelayMeter != nil { + db.writeDelayMeter.Mark(duration.Nanoseconds() - delaystats[1]) + } + // If a warning that db is performing compaction has been displayed, any subsequent + // warnings will be withheld for one minute not to overwhelm the user. + if paused && delayN-delaystats[0] == 0 && duration.Nanoseconds()-delaystats[1] == 0 && + time.Now().After(lastWritePaused.Add(degradationWarnInterval)) { + db.log.Warn("Database compacting, degraded performance") + lastWritePaused = time.Now() + } + delaystats[0], delaystats[1] = delayN, duration.Nanoseconds() + + // Retrieve the database iostats. + ioStats, err := db.db.GetProperty("leveldb.iostats") + if err != nil { + db.log.Error("Failed to read database iostats", "err", err) + merr = err + continue + } + var nRead, nWrite float64 + parts := strings.Split(ioStats, " ") + if len(parts) < 2 { + db.log.Error("Bad syntax of ioStats", "ioStats", ioStats) + merr = fmt.Errorf("bad syntax of ioStats %s", ioStats) + continue + } + if n, err := fmt.Sscanf(parts[0], "Read(MB):%f", &nRead); n != 1 || err != nil { + db.log.Error("Bad syntax of read entry", "entry", parts[0]) + merr = err + continue + } + if n, err := fmt.Sscanf(parts[1], "Write(MB):%f", &nWrite); n != 1 || err != nil { + db.log.Error("Bad syntax of write entry", "entry", parts[1]) + merr = err + continue + } + if db.diskReadMeter != nil { + db.diskReadMeter.Mark(int64((nRead - iostats[0]) * 1024 * 1024)) + } + if db.diskWriteMeter != nil { + db.diskWriteMeter.Mark(int64((nWrite - iostats[1]) * 1024 * 1024)) + } + iostats[0], iostats[1] = nRead, nWrite + + compCount, err := db.db.GetProperty("leveldb.compcount") + if err != nil { + db.log.Error("Failed to read database iostats", "err", err) + merr = err + continue + } + + var ( + memComp uint32 + level0Comp uint32 + nonLevel0Comp uint32 + seekComp uint32 + ) + if n, err := fmt.Sscanf(compCount, "MemComp:%d Level0Comp:%d NonLevel0Comp:%d SeekComp:%d", &memComp, &level0Comp, &nonLevel0Comp, &seekComp); n != 4 || err != nil { + db.log.Error("Compaction count statistic not found") + merr = err + continue + } + db.memCompGauge.Update(int64(memComp)) + db.level0CompGauge.Update(int64(level0Comp)) + db.nonlevel0CompGauge.Update(int64(nonLevel0Comp)) + db.seekCompGauge.Update(int64(seekComp)) + + // Sleep a bit, then repeat the stats collection + select { + case errc = <-db.quitChan: + // Quit requesting, stop hammering the database + case <-time.After(refresh): + // Timeout, gather a new set of stats + } + } + + if errc == nil { + errc = <-db.quitChan + } + errc <- merr +} + +// batch is a write-only leveldb batch that commits changes to its host database +// when Write is called. A batch cannot be used concurrently. +type batch struct { + db *leveldb.DB + b *leveldb.Batch + size int +} + +// Put inserts the given value into the batch for later committing. +func (b *batch) Put(key, value []byte) error { + b.b.Put(key, value) + b.size += len(value) + return nil +} + +// Delete inserts the a key removal into the batch for later committing. +func (b *batch) Delete(key []byte) error { + b.b.Delete(key) + b.size++ + return nil +} + +// ValueSize retrieves the amount of data queued up for writing. +func (b *batch) ValueSize() int { + return b.size +} + +// Write flushes any accumulated data to disk. +func (b *batch) Write() error { + return b.db.Write(b.b, nil) +} + +// Reset resets the batch for reuse. +func (b *batch) Reset() { + b.b.Reset() + b.size = 0 +} + +// Replay replays the batch contents. +func (b *batch) Replay(w ethdb.KeyValueWriter) error { + return b.b.Replay(&replayer{writer: w}) +} + +// replayer is a small wrapper to implement the correct replay methods. +type replayer struct { + writer ethdb.KeyValueWriter + failure error +} + +// Put inserts the given value into the key-value data store. +func (r *replayer) Put(key, value []byte) { + // If the replay already failed, stop executing ops + if r.failure != nil { + return + } + r.failure = r.writer.Put(key, value) +} + +// Delete removes the key from the key-value data store. +func (r *replayer) Delete(key []byte) { + // If the replay already failed, stop executing ops + if r.failure != nil { + return + } + r.failure = r.writer.Delete(key) +} diff --git a/ethdb/leveldb/leveldb_test.go b/ethdb/leveldb/leveldb_test.go new file mode 100644 index 000000000000..421d9b4693f4 --- /dev/null +++ b/ethdb/leveldb/leveldb_test.go @@ -0,0 +1,40 @@ +// Copyright 2019 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 leveldb + +import ( + "testing" + + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethdb/dbtest" + "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/storage" +) + +func TestLevelDB(t *testing.T) { + t.Run("DatabaseSuite", func(t *testing.T) { + dbtest.TestDatabaseSuite(t, func() ethdb.KeyValueStore { + db, err := leveldb.Open(storage.NewMemStorage(), nil) + if err != nil { + t.Fatal(err) + } + return &Database{ + db: db, + } + }) + }) +} diff --git a/ethdb/memory_database.go b/ethdb/memory_database.go deleted file mode 100644 index 40cc7dc0f0c4..000000000000 --- a/ethdb/memory_database.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ethdb - -import ( - "errors" - "sync" - - "github.com/nebulaai/nbai-node/common" -) - -/* - * This is a test memory database. Do not use for any production it does not get persisted - */ -type MemDatabase struct { - db map[string][]byte - lock sync.RWMutex -} - -func NewMemDatabase() *MemDatabase { - return &MemDatabase{ - db: make(map[string][]byte), - } -} - -func NewMemDatabaseWithCap(size int) *MemDatabase { - return &MemDatabase{ - db: make(map[string][]byte, size), - } -} - -func (db *MemDatabase) Put(key []byte, value []byte) error { - db.lock.Lock() - defer db.lock.Unlock() - - db.db[string(key)] = common.CopyBytes(value) - 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 common.CopyBytes(entry), nil - } - return nil, errors.New("not found") -} - -func (db *MemDatabase) Keys() [][]byte { - db.lock.RLock() - defer db.lock.RUnlock() - - keys := [][]byte{} - for key := range db.db { - keys = append(keys, []byte(key)) - } - return keys -} - -func (db *MemDatabase) Delete(key []byte) error { - db.lock.Lock() - defer db.lock.Unlock() - - delete(db.db, string(key)) - return nil -} - -func (db *MemDatabase) Close() {} - -func (db *MemDatabase) NewBatch() Batch { - return &memBatch{db: db} -} - -func (db *MemDatabase) Len() int { return len(db.db) } - -type kv struct { - k, v []byte - del bool -} - -type memBatch struct { - db *MemDatabase - writes []kv - size int -} - -func (b *memBatch) Put(key, value []byte) error { - b.writes = append(b.writes, kv{common.CopyBytes(key), common.CopyBytes(value), false}) - b.size += len(value) - return nil -} - -func (b *memBatch) Delete(key []byte) error { - b.writes = append(b.writes, kv{common.CopyBytes(key), nil, true}) - b.size += 1 - return nil -} - -func (b *memBatch) Write() error { - b.db.lock.Lock() - defer b.db.lock.Unlock() - - for _, kv := range b.writes { - if kv.del { - delete(b.db.db, string(kv.k)) - continue - } - b.db.db[string(kv.k)] = kv.v - } - return nil -} - -func (b *memBatch) ValueSize() int { - return b.size -} - -func (b *memBatch) Reset() { - b.writes = b.writes[:0] - b.size = 0 -} diff --git a/ethdb/memorydb/memorydb.go b/ethdb/memorydb/memorydb.go new file mode 100644 index 000000000000..346edc438160 --- /dev/null +++ b/ethdb/memorydb/memorydb.go @@ -0,0 +1,344 @@ +// Copyright 2018 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 memorydb implements the key-value database layer based on memory maps. +package memorydb + +import ( + "errors" + "sort" + "strings" + "sync" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" +) + +var ( + // errMemorydbClosed is returned if a memory database was already closed at the + // invocation of a data access operation. + errMemorydbClosed = errors.New("database closed") + + // errMemorydbNotFound is returned if a key is requested that is not found in + // the provided memory database. + errMemorydbNotFound = errors.New("not found") +) + +// Database is an ephemeral key-value store. Apart from basic data storage +// functionality it also supports batch writes and iterating over the keyspace in +// binary-alphabetical order. +type Database struct { + db map[string][]byte + lock sync.RWMutex +} + +// New returns a wrapped map with all the required database interface methods +// implemented. +func New() *Database { + return &Database{ + db: make(map[string][]byte), + } +} + +// NewWithCap returns a wrapped map pre-allocated to the provided capcity with +// all the required database interface methods implemented. +func NewWithCap(size int) *Database { + return &Database{ + db: make(map[string][]byte, size), + } +} + +// Close deallocates the internal map and ensures any consecutive data access op +// failes with an error. +func (db *Database) Close() error { + db.lock.Lock() + defer db.lock.Unlock() + + db.db = nil + return nil +} + +// Has retrieves if a key is present in the key-value store. +func (db *Database) Has(key []byte) (bool, error) { + db.lock.RLock() + defer db.lock.RUnlock() + + if db.db == nil { + return false, errMemorydbClosed + } + _, ok := db.db[string(key)] + return ok, nil +} + +// Get retrieves the given key if it's present in the key-value store. +func (db *Database) Get(key []byte) ([]byte, error) { + db.lock.RLock() + defer db.lock.RUnlock() + + if db.db == nil { + return nil, errMemorydbClosed + } + if entry, ok := db.db[string(key)]; ok { + return common.CopyBytes(entry), nil + } + return nil, errMemorydbNotFound +} + +// Put inserts the given value into the key-value store. +func (db *Database) Put(key []byte, value []byte) error { + db.lock.Lock() + defer db.lock.Unlock() + + if db.db == nil { + return errMemorydbClosed + } + db.db[string(key)] = common.CopyBytes(value) + return nil +} + +// Delete removes the key from the key-value store. +func (db *Database) Delete(key []byte) error { + db.lock.Lock() + defer db.lock.Unlock() + + if db.db == nil { + return errMemorydbClosed + } + delete(db.db, string(key)) + return nil +} + +// NewBatch creates a write-only key-value store that buffers changes to its host +// database until a final write is called. +func (db *Database) NewBatch() ethdb.Batch { + return &batch{ + db: db, + } +} + +// NewIterator creates a binary-alphabetical iterator over the entire keyspace +// contained within the memory database. +func (db *Database) NewIterator() ethdb.Iterator { + return db.NewIteratorWithStart(nil) +} + +// NewIteratorWithStart creates a binary-alphabetical iterator over a subset of +// database content starting at a particular initial key (or after, if it does +// not exist). +func (db *Database) NewIteratorWithStart(start []byte) ethdb.Iterator { + db.lock.RLock() + defer db.lock.RUnlock() + + var ( + st = string(start) + keys = make([]string, 0, len(db.db)) + values = make([][]byte, 0, len(db.db)) + ) + // Collect the keys from the memory database corresponding to the given start + for key := range db.db { + if key >= st { + keys = append(keys, key) + } + } + // Sort the items and retrieve the associated values + sort.Strings(keys) + for _, key := range keys { + values = append(values, db.db[key]) + } + return &iterator{ + keys: keys, + values: values, + } +} + +// NewIteratorWithPrefix creates a binary-alphabetical iterator over a subset +// of database content with a particular key prefix. +func (db *Database) NewIteratorWithPrefix(prefix []byte) ethdb.Iterator { + db.lock.RLock() + defer db.lock.RUnlock() + + var ( + pr = string(prefix) + keys = make([]string, 0, len(db.db)) + values = make([][]byte, 0, len(db.db)) + ) + // Collect the keys from the memory database corresponding to the given prefix + for key := range db.db { + if strings.HasPrefix(key, pr) { + keys = append(keys, key) + } + } + // Sort the items and retrieve the associated values + sort.Strings(keys) + for _, key := range keys { + values = append(values, db.db[key]) + } + return &iterator{ + keys: keys, + values: values, + } +} + +// Stat returns a particular internal stat of the database. +func (db *Database) Stat(property string) (string, error) { + return "", errors.New("unknown property") +} + +// Compact is not supported on a memory database, but there's no need either as +// a memory database doesn't waste space anyway. +func (db *Database) Compact(start []byte, limit []byte) error { + return nil +} + +// Len returns the number of entries currently present in the memory database. +// +// Note, this method is only used for testing (i.e. not public in general) and +// does not have explicit checks for closed-ness to allow simpler testing code. +func (db *Database) Len() int { + db.lock.RLock() + defer db.lock.RUnlock() + + return len(db.db) +} + +// keyvalue is a key-value tuple tagged with a deletion field to allow creating +// memory-database write batches. +type keyvalue struct { + key []byte + value []byte + delete bool +} + +// batch is a write-only memory batch that commits changes to its host +// database when Write is called. A batch cannot be used concurrently. +type batch struct { + db *Database + writes []keyvalue + size int +} + +// Put inserts the given value into the batch for later committing. +func (b *batch) Put(key, value []byte) error { + b.writes = append(b.writes, keyvalue{common.CopyBytes(key), common.CopyBytes(value), false}) + b.size += len(value) + return nil +} + +// Delete inserts the a key removal into the batch for later committing. +func (b *batch) Delete(key []byte) error { + b.writes = append(b.writes, keyvalue{common.CopyBytes(key), nil, true}) + b.size += 1 + return nil +} + +// ValueSize retrieves the amount of data queued up for writing. +func (b *batch) ValueSize() int { + return b.size +} + +// Write flushes any accumulated data to the memory database. +func (b *batch) Write() error { + b.db.lock.Lock() + defer b.db.lock.Unlock() + + for _, keyvalue := range b.writes { + if keyvalue.delete { + delete(b.db.db, string(keyvalue.key)) + continue + } + b.db.db[string(keyvalue.key)] = keyvalue.value + } + return nil +} + +// Reset resets the batch for reuse. +func (b *batch) Reset() { + b.writes = b.writes[:0] + b.size = 0 +} + +// Replay replays the batch contents. +func (b *batch) Replay(w ethdb.KeyValueWriter) error { + for _, keyvalue := range b.writes { + if keyvalue.delete { + if err := w.Delete(keyvalue.key); err != nil { + return err + } + continue + } + if err := w.Put(keyvalue.key, keyvalue.value); err != nil { + return err + } + } + return nil +} + +// iterator can walk over the (potentially partial) keyspace of a memory key +// value store. Internally it is a deep copy of the entire iterated state, +// sorted by keys. +type iterator struct { + inited bool + keys []string + values [][]byte +} + +// Next moves the iterator to the next key/value pair. It returns whether the +// iterator is exhausted. +func (it *iterator) Next() bool { + // If the iterator was not yet initialized, do it now + if !it.inited { + it.inited = true + return len(it.keys) > 0 + } + // Iterator already initialize, advance it + if len(it.keys) > 0 { + it.keys = it.keys[1:] + it.values = it.values[1:] + } + return len(it.keys) > 0 +} + +// Error returns any accumulated error. Exhausting all the key/value pairs +// is not considered to be an error. A memory iterator cannot encounter errors. +func (it *iterator) Error() error { + return nil +} + +// Key returns the key of the current key/value pair, or nil if done. The caller +// should not modify the contents of the returned slice, and its contents may +// change on the next call to Next. +func (it *iterator) Key() []byte { + if len(it.keys) > 0 { + return []byte(it.keys[0]) + } + return nil +} + +// Value returns the value of the current key/value pair, or nil if done. The +// caller should not modify the contents of the returned slice, and its contents +// may change on the next call to Next. +func (it *iterator) Value() []byte { + if len(it.values) > 0 { + return it.values[0] + } + return nil +} + +// Release releases associated resources. Release should always succeed and can +// be called multiple times without causing error. +func (it *iterator) Release() { + it.keys, it.values = nil, nil +} diff --git a/ethdb/memorydb/memorydb_test.go b/ethdb/memorydb/memorydb_test.go new file mode 100644 index 000000000000..dba18ad3062b --- /dev/null +++ b/ethdb/memorydb/memorydb_test.go @@ -0,0 +1,32 @@ +// Copyright 2018 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 memorydb + +import ( + "testing" + + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/ethdb/dbtest" +) + +func TestMemoryDB(t *testing.T) { + t.Run("DatabaseSuite", func(t *testing.T) { + dbtest.TestDatabaseSuite(t, func() ethdb.KeyValueStore { + return New() + }) + }) +} diff --git a/ethdb/table.go b/ethdb/table.go deleted file mode 100644 index 28069c078ed2..000000000000 --- a/ethdb/table.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ethdb - -type table struct { - db Database - prefix string -} - -// NewTable returns a Database object that prefixes all keys with a given -// string. -func NewTable(db Database, prefix string) Database { - return &table{ - db: db, - prefix: prefix, - } -} - -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...)) -} - -func (dt *table) Delete(key []byte) error { - return dt.db.Delete(append([]byte(dt.prefix), key...)) -} - -func (dt *table) Close() { - // Do nothing; don't close the underlying DB. -} diff --git a/ethdb/table_batch.go b/ethdb/table_batch.go deleted file mode 100644 index ae83e79ced14..000000000000 --- a/ethdb/table_batch.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2014 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package ethdb - -type tableBatch struct { - batch Batch - prefix string -} - -// NewTableBatch returns a Batch object which prefixes all keys with a given string. -func NewTableBatch(db Database, prefix string) Batch { - return &tableBatch{db.NewBatch(), prefix} -} - -func (dt *table) NewBatch() Batch { - return &tableBatch{dt.db.NewBatch(), dt.prefix} -} - -func (tb *tableBatch) Put(key, value []byte) error { - return tb.batch.Put(append([]byte(tb.prefix), key...), value) -} - -func (tb *tableBatch) Delete(key []byte) error { - return tb.batch.Delete(append([]byte(tb.prefix), key...)) -} - -func (tb *tableBatch) Write() error { - return tb.batch.Write() -} - -func (tb *tableBatch) ValueSize() int { - return tb.batch.ValueSize() -} - -func (tb *tableBatch) Reset() { - tb.batch.Reset() -} diff --git a/ethstats/ethstats.go b/ethstats/ethstats.go index 1a69d053c5cf..f9284722cf83 100644 --- a/ethstats/ethstats.go +++ b/ethstats/ethstats.go @@ -23,25 +23,25 @@ import ( "errors" "fmt" "math/big" - "net" + "net/http" "regexp" "runtime" "strconv" "strings" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/mclock" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/eth" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/les" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/rpc" - "golang.org/x/net/websocket" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/les" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rpc" + "github.com/gorilla/websocket" ) const ( @@ -200,21 +200,21 @@ func (s *Service) loop() { path := fmt.Sprintf("%s/api", s.host) urls := []string{path} - if !strings.Contains(path, "://") { // url.Parse and url.IsAbs is unsuitable (https://github.com/golang/go/issues/19779) + // url.Parse and url.IsAbs is unsuitable (https://github.com/golang/go/issues/19779) + if !strings.Contains(path, "://") { urls = []string{"wss://" + path, "ws://" + path} } // Establish a websocket connection to the server on any supported URL var ( - conf *websocket.Config conn *websocket.Conn err error ) + dialer := websocket.Dialer{HandshakeTimeout: 5 * time.Second} + header := make(http.Header) + header.Set("origin", "http://localhost") for _, url := range urls { - if conf, err = websocket.NewConfig(url, "http://localhost/"); err != nil { - continue - } - conf.Dialer = &net.Dialer{Timeout: 5 * time.Second} - if conn, err = websocket.DialConfig(conf); err == nil { + conn, _, err = dialer.Dial(url, header) + if err == nil { break } } @@ -284,7 +284,7 @@ func (s *Service) readLoop(conn *websocket.Conn) { for { // Retrieve the next generic network packet and bail out on error var msg map[string][]interface{} - if err := websocket.JSON.Receive(conn, &msg); err != nil { + if err := conn.ReadJSON(&msg); err != nil { log.Warn("Failed to decode stats server message", "err", err) return } @@ -399,12 +399,12 @@ func (s *Service) login(conn *websocket.Conn) error { login := map[string][]interface{}{ "emit": {"hello", auth}, } - if err := websocket.JSON.Send(conn, login); err != nil { + if err := conn.WriteJSON(login); err != nil { return err } // Retrieve the remote ack or connection termination var ack map[string][]string - if err := websocket.JSON.Receive(conn, &ack); err != nil || len(ack["emit"]) != 1 || ack["emit"][0] != "ready" { + if err := conn.ReadJSON(&ack); err != nil || len(ack["emit"]) != 1 || ack["emit"][0] != "ready" { return errors.New("unauthorized") } return nil @@ -441,7 +441,7 @@ func (s *Service) reportLatency(conn *websocket.Conn) error { "clientTime": start.String(), }}, } - if err := websocket.JSON.Send(conn, ping); err != nil { + if err := conn.WriteJSON(ping); err != nil { return err } // Wait for the pong request to arrive back @@ -463,7 +463,7 @@ func (s *Service) reportLatency(conn *websocket.Conn) error { "latency": latency, }}, } - return websocket.JSON.Send(conn, stats) + return conn.WriteJSON(stats) } // blockStats is the information to report about individual blocks. @@ -514,7 +514,7 @@ func (s *Service) reportBlock(conn *websocket.Conn, block *types.Block) error { report := map[string][]interface{}{ "emit": {"block", stats}, } - return websocket.JSON.Send(conn, report) + return conn.WriteJSON(report) } // assembleBlockStats retrieves any required metadata to report a single block @@ -557,7 +557,7 @@ func (s *Service) assembleBlockStats(block *types.Block) *blockStats { Number: header.Number, Hash: header.Hash(), ParentHash: header.ParentHash, - Timestamp: header.Time, + Timestamp: new(big.Int).SetUint64(header.Time), Miner: author, GasUsed: header.GasUsed, GasLimit: header.GasLimit, @@ -628,7 +628,7 @@ func (s *Service) reportHistory(conn *websocket.Conn, list []uint64) error { report := map[string][]interface{}{ "emit": {"history", stats}, } - return websocket.JSON.Send(conn, report) + return conn.WriteJSON(report) } // pendStats is the information to report about pending transactions. @@ -658,7 +658,7 @@ func (s *Service) reportPending(conn *websocket.Conn) error { report := map[string][]interface{}{ "emit": {"pending", stats}, } - return websocket.JSON.Send(conn, report) + return conn.WriteJSON(report) } // nodeStats is the information to report about the local node. @@ -713,5 +713,5 @@ func (s *Service) reportStats(conn *websocket.Conn) error { report := map[string][]interface{}{ "emit": {"stats", stats}, } - return websocket.JSON.Send(conn, report) + return conn.WriteJSON(report) } diff --git a/event/example_feed_test.go b/event/example_feed_test.go index 2526c63793cd..9b5ad50df546 100644 --- a/event/example_feed_test.go +++ b/event/example_feed_test.go @@ -19,7 +19,7 @@ package event_test import ( "fmt" - "github.com/nebulaai/nbai-node/event" + "github.com/ethereum/go-ethereum/event" ) func ExampleFeed_acknowledgedEvents() { diff --git a/event/example_scope_test.go b/event/example_scope_test.go index dc37939cac48..825a8deeacba 100644 --- a/event/example_scope_test.go +++ b/event/example_scope_test.go @@ -20,7 +20,7 @@ import ( "fmt" "sync" - "github.com/nebulaai/nbai-node/event" + "github.com/ethereum/go-ethereum/event" ) // This example demonstrates how SubscriptionScope can be used to control the lifetime of diff --git a/event/example_subscription_test.go b/event/example_subscription_test.go index 577c690326c4..5c76b55d98e8 100644 --- a/event/example_subscription_test.go +++ b/event/example_subscription_test.go @@ -19,7 +19,7 @@ package event_test import ( "fmt" - "github.com/nebulaai/nbai-node/event" + "github.com/ethereum/go-ethereum/event" ) func ExampleNewSubscription() { diff --git a/event/feed.go b/event/feed.go index f578f00c10ff..02f3ca68759f 100644 --- a/event/feed.go +++ b/event/feed.go @@ -39,10 +39,9 @@ type Feed struct { sendCases caseList // the active set of select cases used by Send // The inbox holds newly subscribed channels until they are added to sendCases. - mu sync.Mutex - inbox caseList - etype reflect.Type - closed bool + mu sync.Mutex + inbox caseList + etype reflect.Type } // This is the index of the first actual subscription channel in sendCases. diff --git a/event/subscription.go b/event/subscription.go index 08c8f077d051..d03f465075bf 100644 --- a/event/subscription.go +++ b/event/subscription.go @@ -21,7 +21,7 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/common/mclock" + "github.com/ethereum/go-ethereum/common/mclock" ) // Subscription represents a stream of events. The carrier of the events is typically a diff --git a/go.mod b/go.mod new file mode 100644 index 000000000000..d4b420833665 --- /dev/null +++ b/go.mod @@ -0,0 +1,68 @@ +module github.com/ethereum/go-ethereum + +go 1.13 + +require ( + github.com/Azure/azure-pipeline-go v0.2.2 // indirect + github.com/Azure/azure-storage-blob-go v0.7.0 + github.com/Azure/go-autorest/autorest/adal v0.8.0 // indirect + github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect + github.com/VictoriaMetrics/fastcache v1.5.3 + github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847 + github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6 + github.com/cespare/cp v0.1.0 + github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9 + github.com/davecgh/go-spew v1.1.1 + github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea + github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf + github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c + github.com/elastic/gosigar v0.8.1-0.20180330100440-37f05ff46ffa + github.com/fatih/color v1.3.0 + github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc + github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff + github.com/go-ole/go-ole v1.2.1 // indirect + github.com/go-stack/stack v1.8.0 + github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c + github.com/golang/snappy v0.0.1 + github.com/google/go-cmp v0.3.1 // indirect + github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989 + github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277 + github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad + github.com/huin/goupnp v0.0.0-20161224104101-679507af18f3 + github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883 + github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 + github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21 + github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 + github.com/kr/pretty v0.1.0 // indirect + github.com/kylelemons/godebug v1.1.0 // indirect + github.com/mattn/go-colorable v0.1.0 + github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035 + github.com/naoina/go-stringutil v0.1.0 // indirect + github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 + github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c + github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222 + github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 + github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150 + github.com/rjeczalik/notify v0.9.1 + github.com/robertkrimen/otto v0.0.0-20170205013659-6a77b7cbc37d + github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00 + github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521 // indirect + github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 + github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 + github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 // indirect + github.com/stretchr/testify v1.4.0 + github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d + github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef + github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 + golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 + golang.org/x/net v0.0.0-20190628185345-da137c7871d7 // indirect + golang.org/x/sync v0.0.0-20181108010431-42b317875d0f + golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 + golang.org/x/text v0.3.2 + gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce + gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772 + gopkg.in/sourcemap.v1 v1.0.5 // indirect + gopkg.in/urfave/cli.v1 v1.20.0 + gotest.tools v2.2.0+incompatible // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 000000000000..515207bca387 --- /dev/null +++ b/go.sum @@ -0,0 +1,226 @@ +github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= +github.com/Azure/azure-pipeline-go v0.2.2 h1:6oiIS9yaG6XCCzhgAgKFfIWyo4LLCiDhZot6ltoThhY= +github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-storage-blob-go v0.7.0 h1:MuueVOYkufCxJw5YZzF842DY2MBsp+hLuh2apKY0mck= +github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= +github.com/Azure/go-autorest/autorest v0.9.0 h1:MRvx8gncNaXJqOoLmhNjUAKh33JJF8LyxPhomEtOsjs= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/adal v0.8.0 h1:CxTzQrySOxDnKpLjFJeZAS5Qrv/qFPkgLjx5bOAi//I= +github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM= +github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc= +github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= +github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OneOfOne/xxhash v1.2.5 h1:zl/OfRA6nftbBK9qTohYBJ5xvw6C/oNKizR7cZGl3cI= +github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= +github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/VictoriaMetrics/fastcache v1.5.3 h1:2odJnXLbFZcoV9KYtQ+7TH1UOq3dn3AssMgieaezkR4= +github.com/VictoriaMetrics/fastcache v1.5.3/go.mod h1:+jv9Ckb+za/P1ZRg/sulP5Ni1v49daAVERr0H3CuscE= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847 h1:rtI0fD4oG/8eVokGVPYJEW1F88p1ZNgXiEIs9thEE4A= +github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6 h1:Eey/GGQ/E5Xp1P2Lyx1qj007hLZfbi0+CoVeJruGCtI= +github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= +github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.0.1-0.20190104013014-3767db7a7e18 h1:pl4eWIqvFe/Kg3zkn7NxevNzILnZYWDCG7qbA1CJik0= +github.com/cespare/xxhash/v2 v2.0.1-0.20190104013014-3767db7a7e18/go.mod h1:HD5P3vAIAh+Y2GAxg0PrPN1P8WkepXGpjbUPDHJqqKM= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9 h1:J82+/8rub3qSy0HxEnoYD8cs+HDlHWYrqYXe2Vqxluk= +github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea h1:j4317fAZh7X6GqbFowYdYdI0L9bwxL07jyPZIdepyZ0= +github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf h1:sh8rkQZavChcmakYiSlqu2425CHyFXLZZnvm7PDpU8M= +github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c h1:JHHhtb9XWJrGNMcrVP6vyzO4dusgi/HnceHTgxSejUM= +github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elastic/gosigar v0.8.1-0.20180330100440-37f05ff46ffa h1:XKAhUk/dtp+CV0VO6mhG2V7jA9vbcGcnYF/Ay9NjZrY= +github.com/elastic/gosigar v0.8.1-0.20180330100440-37f05ff46ffa/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs= +github.com/fatih/color v1.3.0 h1:YehCCcyeQ6Km0D6+IapqPinWBK6y+0eB5umvZXK9WPs= +github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc h1:jtW8jbpkO4YirRSyepBOH8E+2HEw6/hKkBvFPwhUN8c= +github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= +github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/go-kit/kit v0.8.0 h1:Wz+5lgoB0kkuqLEc6NVmwRknTKP6dTGbSqvhZtBI/j0= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0 h1:8HUsc87TaSWLKwrnumgC8/YconD2fJQsRJAsWaPg2ic= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E= +github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c h1:zqAKixg3cTcIasAMJV+EcfVbWwLpOZ7LeoWJvcuD/5Q= +github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989 h1:giknQ4mEuDFmmHSrGcbargOuLHQGtywqo4mheITex54= +github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277 h1:E0whKxgp2ojts0FDgUA8dl62bmH0LxKanMoBr6MDTDM= +github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= +github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad h1:eMxs9EL0PvIGS9TTtxg4R+JxuPGav82J8rA+GFnY7po= +github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v0.0.0-20161224104101-679507af18f3 h1:DqD8eigqlUm0+znmx7zhL0xvTW3+e1jCekJMfBUADWI= +github.com/huin/goupnp v0.0.0-20161224104101-679507af18f3/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= +github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883 h1:FSeK4fZCo8u40n2JMnyAsd6x7+SbvoOMHvQOU/n10P4= +github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= +github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 h1:6OvNmYgJyexcZ3pYbTI9jWx5tHo1Dee/tWbLMfPe2TA= +github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21 h1:F/iKcka0K2LgnKy/fgSBf235AETtm1n1TvBzqu40LE0= +github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 h1:I/yrLt2WilKxlQKCM52clh5rGzTKpVctGT1lH4Dc8Jw= +github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/mattn/go-colorable v0.1.0 h1:v2XXALHHh6zHfYTJ+cSkwtyffnaOyR1MXaA91mTrb8o= +github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d h1:oNAwILwmgWKFpuU+dXvI6dl9jG2mAWAZLX3r9s0PPiw= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035 h1:USWjF42jDCSEeikX/G1g40ZWnsPXN5WkZ4jMHZWyBK4= +github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= +github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= +github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c h1:1RHs3tNxjXGHeul8z2t6H2N2TlAqpKe5yryJztRx4Jk= +github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222 h1:goeTyGkArOZIVOMA0dQbyuPWGNQJZGPwPu/QS9GlpnA= +github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150 h1:ZeU+auZj1iNzN8iVhff6M38Mfu73FQiJve/GEXYJBjE= +github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rjeczalik/notify v0.9.1 h1:CLCKso/QK1snAlnhNR/CNvNiFU2saUtjV0bx3EwNeCE= +github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= +github.com/robertkrimen/otto v0.0.0-20170205013659-6a77b7cbc37d h1:ouzpe+YhpIfnjR40gSkJHWsvXmB6TiPKqMtMpfyU9DE= +github.com/robertkrimen/otto v0.0.0-20170205013659-6a77b7cbc37d/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY= +github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00 h1:8DPul/X0IT/1TNMIxoKLwdemEOBBHDC/K4EB16Cw5WE= +github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521 h1:3hxavr+IHMsQBrYUPQM5v0CgENFktkkbg1sfpgM3h20= +github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spaolacci/murmur3 v1.0.1-0.20190317074736-539464a789e9 h1:5Cp3cVwpQP4aCQ6jx6dNLP3IarbYiuStmIzYu+BjQwY= +github.com/spaolacci/murmur3 v1.0.1-0.20190317074736-539464a789e9/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg= +github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= +github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 h1:gIlAHnH1vJb5vwEjIp5kBj/eu99p/bl0Ay2goiPe5xE= +github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= +github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 h1:njlZPzLwU639dk2kqnCPPv+wNjq7Xb6EfUxe/oX0/NM= +github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d h1:gZZadD8H+fF+n9CmNhYL1Y0dJB+kLOmKd7FbPJLeGHs= +github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= +github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef h1:wHSqTBrZW24CsNJDfeh9Ex6Pm0Rcpc7qrgKBiL44vF4= +github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208 h1:1cngl9mPEoITZG8s8cVcUy5CeIBYhEESkOB7m6Gmkrk= +github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7 h1:LepdCS8Gf/MVejFIt8lsiexZATdoGVyp5bcyS+rYoUI= +golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772 h1:hhsSf/5z74Ck/DJYc+R8zpq8KGm7uJvpdLRQED/IedA= +gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= +gopkg.in/sourcemap.v1 v1.0.5 h1:inv58fC9f9J3TK2Y2R1NPntXEn3/wjWHkonhIUODNTI= +gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= +gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= diff --git a/graphql/graphiql.go b/graphql/graphiql.go new file mode 100644 index 000000000000..864ebf57df21 --- /dev/null +++ b/graphql/graphiql.go @@ -0,0 +1,120 @@ +// The MIT License (MIT) +// +// Copyright (c) 2016 Muhammed Thanish +// +// 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. + +package graphql + +import ( + "bytes" + "fmt" + "net/http" +) + +// GraphiQL is an in-browser IDE for exploring GraphiQL APIs. +// This handler returns GraphiQL when requested. +// +// For more information, see https://github.com/graphql/graphiql. +type GraphiQL struct{} + +func respond(w http.ResponseWriter, body []byte, code int) { + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.Header().Set("X-Content-Type-Options", "nosniff") + w.WriteHeader(code) + _, _ = w.Write(body) +} + +func errorJSON(msg string) []byte { + buf := bytes.Buffer{} + fmt.Fprintf(&buf, `{"error": "%s"}`, msg) + return buf.Bytes() +} + +func (h GraphiQL) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if r.Method != "GET" { + respond(w, errorJSON("only GET requests are supported"), http.StatusMethodNotAllowed) + return + } + w.Header().Set("Content-Type", "text/html") + w.Write(graphiql) +} + +var graphiql = []byte(` + + + + + + + + + + + +
Loading...
+ + + +`) diff --git a/graphql/graphql.go b/graphql/graphql.go new file mode 100644 index 000000000000..ddd928dff12c --- /dev/null +++ b/graphql/graphql.go @@ -0,0 +1,1055 @@ +// Copyright 2019 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 graphql provides a GraphQL interface to Ethereum node data. +package graphql + +import ( + "context" + "errors" + "time" + + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/filters" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" +) + +var ( + errBlockInvariant = errors.New("block objects must be instantiated with at least one of num or hash") +) + +// Account represents an Ethereum account at a particular block. +type Account struct { + backend ethapi.Backend + address common.Address + blockNrOrHash rpc.BlockNumberOrHash +} + +// getState fetches the StateDB object for an account. +func (a *Account) getState(ctx context.Context) (*state.StateDB, error) { + state, _, err := a.backend.StateAndHeaderByNumberOrHash(ctx, a.blockNrOrHash) + return state, err +} + +func (a *Account) Address(ctx context.Context) (common.Address, error) { + return a.address, nil +} + +func (a *Account) Balance(ctx context.Context) (hexutil.Big, error) { + state, err := a.getState(ctx) + if err != nil { + return hexutil.Big{}, err + } + return hexutil.Big(*state.GetBalance(a.address)), nil +} + +func (a *Account) TransactionCount(ctx context.Context) (hexutil.Uint64, error) { + state, err := a.getState(ctx) + if err != nil { + return 0, err + } + return hexutil.Uint64(state.GetNonce(a.address)), nil +} + +func (a *Account) Code(ctx context.Context) (hexutil.Bytes, error) { + state, err := a.getState(ctx) + if err != nil { + return hexutil.Bytes{}, err + } + return hexutil.Bytes(state.GetCode(a.address)), nil +} + +func (a *Account) Storage(ctx context.Context, args struct{ Slot common.Hash }) (common.Hash, error) { + state, err := a.getState(ctx) + if err != nil { + return common.Hash{}, err + } + return state.GetState(a.address, args.Slot), nil +} + +// Log represents an individual log message. All arguments are mandatory. +type Log struct { + backend ethapi.Backend + transaction *Transaction + log *types.Log +} + +func (l *Log) Transaction(ctx context.Context) *Transaction { + return l.transaction +} + +func (l *Log) Account(ctx context.Context, args BlockNumberArgs) *Account { + return &Account{ + backend: l.backend, + address: l.log.Address, + blockNrOrHash: args.NumberOrLatest(), + } +} + +func (l *Log) Index(ctx context.Context) int32 { + return int32(l.log.Index) +} + +func (l *Log) Topics(ctx context.Context) []common.Hash { + return l.log.Topics +} + +func (l *Log) Data(ctx context.Context) hexutil.Bytes { + return hexutil.Bytes(l.log.Data) +} + +// Transaction represents an Ethereum transaction. +// backend and hash are mandatory; all others will be fetched when required. +type Transaction struct { + backend ethapi.Backend + hash common.Hash + tx *types.Transaction + block *Block + index uint64 +} + +// resolve returns the internal transaction object, fetching it if needed. +func (t *Transaction) resolve(ctx context.Context) (*types.Transaction, error) { + if t.tx == nil { + tx, blockHash, _, index := rawdb.ReadTransaction(t.backend.ChainDb(), t.hash) + if tx != nil { + t.tx = tx + blockNrOrHash := rpc.BlockNumberOrHashWithHash(blockHash, false) + t.block = &Block{ + backend: t.backend, + numberOrHash: &blockNrOrHash, + } + t.index = index + } else { + t.tx = t.backend.GetPoolTransaction(t.hash) + } + } + return t.tx, nil +} + +func (t *Transaction) Hash(ctx context.Context) common.Hash { + return t.hash +} + +func (t *Transaction) InputData(ctx context.Context) (hexutil.Bytes, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return hexutil.Bytes{}, err + } + return hexutil.Bytes(tx.Data()), nil +} + +func (t *Transaction) Gas(ctx context.Context) (hexutil.Uint64, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return 0, err + } + return hexutil.Uint64(tx.Gas()), nil +} + +func (t *Transaction) GasPrice(ctx context.Context) (hexutil.Big, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return hexutil.Big{}, err + } + return hexutil.Big(*tx.GasPrice()), nil +} + +func (t *Transaction) Value(ctx context.Context) (hexutil.Big, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return hexutil.Big{}, err + } + return hexutil.Big(*tx.Value()), nil +} + +func (t *Transaction) Nonce(ctx context.Context) (hexutil.Uint64, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return 0, err + } + return hexutil.Uint64(tx.Nonce()), nil +} + +func (t *Transaction) To(ctx context.Context, args BlockNumberArgs) (*Account, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return nil, err + } + to := tx.To() + if to == nil { + return nil, nil + } + return &Account{ + backend: t.backend, + address: *to, + blockNrOrHash: args.NumberOrLatest(), + }, nil +} + +func (t *Transaction) From(ctx context.Context, args BlockNumberArgs) (*Account, error) { + tx, err := t.resolve(ctx) + if err != nil || tx == nil { + return nil, err + } + var signer types.Signer = types.HomesteadSigner{} + if tx.Protected() { + signer = types.NewEIP155Signer(tx.ChainId()) + } + from, _ := types.Sender(signer, tx) + + return &Account{ + backend: t.backend, + address: from, + blockNrOrHash: args.NumberOrLatest(), + }, nil +} + +func (t *Transaction) Block(ctx context.Context) (*Block, error) { + if _, err := t.resolve(ctx); err != nil { + return nil, err + } + return t.block, nil +} + +func (t *Transaction) Index(ctx context.Context) (*int32, error) { + if _, err := t.resolve(ctx); err != nil { + return nil, err + } + if t.block == nil { + return nil, nil + } + index := int32(t.index) + return &index, nil +} + +// getReceipt returns the receipt associated with this transaction, if any. +func (t *Transaction) getReceipt(ctx context.Context) (*types.Receipt, error) { + if _, err := t.resolve(ctx); err != nil { + return nil, err + } + if t.block == nil { + return nil, nil + } + receipts, err := t.block.resolveReceipts(ctx) + if err != nil { + return nil, err + } + return receipts[t.index], nil +} + +func (t *Transaction) Status(ctx context.Context) (*hexutil.Uint64, error) { + receipt, err := t.getReceipt(ctx) + if err != nil || receipt == nil { + return nil, err + } + ret := hexutil.Uint64(receipt.Status) + return &ret, nil +} + +func (t *Transaction) GasUsed(ctx context.Context) (*hexutil.Uint64, error) { + receipt, err := t.getReceipt(ctx) + if err != nil || receipt == nil { + return nil, err + } + ret := hexutil.Uint64(receipt.GasUsed) + return &ret, nil +} + +func (t *Transaction) CumulativeGasUsed(ctx context.Context) (*hexutil.Uint64, error) { + receipt, err := t.getReceipt(ctx) + if err != nil || receipt == nil { + return nil, err + } + ret := hexutil.Uint64(receipt.CumulativeGasUsed) + return &ret, nil +} + +func (t *Transaction) CreatedContract(ctx context.Context, args BlockNumberArgs) (*Account, error) { + receipt, err := t.getReceipt(ctx) + if err != nil || receipt == nil || receipt.ContractAddress == (common.Address{}) { + return nil, err + } + return &Account{ + backend: t.backend, + address: receipt.ContractAddress, + blockNrOrHash: args.NumberOrLatest(), + }, nil +} + +func (t *Transaction) Logs(ctx context.Context) (*[]*Log, error) { + receipt, err := t.getReceipt(ctx) + if err != nil || receipt == nil { + return nil, err + } + ret := make([]*Log, 0, len(receipt.Logs)) + for _, log := range receipt.Logs { + ret = append(ret, &Log{ + backend: t.backend, + transaction: t, + log: log, + }) + } + return &ret, nil +} + +type BlockType int + +// Block represents an Ethereum block. +// backend, and numberOrHash are mandatory. All other fields are lazily fetched +// when required. +type Block struct { + backend ethapi.Backend + numberOrHash *rpc.BlockNumberOrHash + hash common.Hash + header *types.Header + block *types.Block + receipts []*types.Receipt +} + +// resolve returns the internal Block object representing this block, fetching +// it if necessary. +func (b *Block) resolve(ctx context.Context) (*types.Block, error) { + if b.block != nil { + return b.block, nil + } + if b.numberOrHash == nil { + latest := rpc.BlockNumberOrHashWithNumber(rpc.LatestBlockNumber) + b.numberOrHash = &latest + } + var err error + b.block, err = b.backend.BlockByNumberOrHash(ctx, *b.numberOrHash) + if b.block != nil && b.header == nil { + b.header = b.block.Header() + if hash, ok := b.numberOrHash.Hash(); ok { + b.hash = hash + } + } + return b.block, err +} + +// resolveHeader returns the internal Header object for this block, fetching it +// if necessary. Call this function instead of `resolve` unless you need the +// additional data (transactions and uncles). +func (b *Block) resolveHeader(ctx context.Context) (*types.Header, error) { + if b.numberOrHash == nil && b.hash == (common.Hash{}) { + return nil, errBlockInvariant + } + var err error + if b.header == nil { + if b.hash != (common.Hash{}) { + b.header, err = b.backend.HeaderByHash(ctx, b.hash) + } else { + b.header, err = b.backend.HeaderByNumberOrHash(ctx, *b.numberOrHash) + } + } + return b.header, err +} + +// resolveReceipts returns the list of receipts for this block, fetching them +// if necessary. +func (b *Block) resolveReceipts(ctx context.Context) ([]*types.Receipt, error) { + if b.receipts == nil { + hash := b.hash + if hash == (common.Hash{}) { + header, err := b.resolveHeader(ctx) + if err != nil { + return nil, err + } + hash = header.Hash() + } + receipts, err := b.backend.GetReceipts(ctx, hash) + if err != nil { + return nil, err + } + b.receipts = []*types.Receipt(receipts) + } + return b.receipts, nil +} + +func (b *Block) Number(ctx context.Context) (hexutil.Uint64, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return 0, err + } + + return hexutil.Uint64(header.Number.Uint64()), nil +} + +func (b *Block) Hash(ctx context.Context) (common.Hash, error) { + if b.hash == (common.Hash{}) { + header, err := b.resolveHeader(ctx) + if err != nil { + return common.Hash{}, err + } + b.hash = header.Hash() + } + return b.hash, nil +} + +func (b *Block) GasLimit(ctx context.Context) (hexutil.Uint64, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return 0, err + } + return hexutil.Uint64(header.GasLimit), nil +} + +func (b *Block) GasUsed(ctx context.Context) (hexutil.Uint64, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return 0, err + } + return hexutil.Uint64(header.GasUsed), nil +} + +func (b *Block) Parent(ctx context.Context) (*Block, error) { + // If the block header hasn't been fetched, and we'll need it, fetch it. + if b.numberOrHash == nil && b.header == nil { + if _, err := b.resolveHeader(ctx); err != nil { + return nil, err + } + } + if b.header != nil && b.header.Number.Uint64() > 0 { + num := rpc.BlockNumberOrHashWithNumber(rpc.BlockNumber(b.header.Number.Uint64() - 1)) + return &Block{ + backend: b.backend, + numberOrHash: &num, + hash: b.header.ParentHash, + }, nil + } + return nil, nil +} + +func (b *Block) Difficulty(ctx context.Context) (hexutil.Big, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return hexutil.Big{}, err + } + return hexutil.Big(*header.Difficulty), nil +} + +func (b *Block) Timestamp(ctx context.Context) (hexutil.Uint64, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return 0, err + } + return hexutil.Uint64(header.Time), nil +} + +func (b *Block) Nonce(ctx context.Context) (hexutil.Bytes, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return hexutil.Bytes{}, err + } + return hexutil.Bytes(header.Nonce[:]), nil +} + +func (b *Block) MixHash(ctx context.Context) (common.Hash, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return common.Hash{}, err + } + return header.MixDigest, nil +} + +func (b *Block) TransactionsRoot(ctx context.Context) (common.Hash, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return common.Hash{}, err + } + return header.TxHash, nil +} + +func (b *Block) StateRoot(ctx context.Context) (common.Hash, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return common.Hash{}, err + } + return header.Root, nil +} + +func (b *Block) ReceiptsRoot(ctx context.Context) (common.Hash, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return common.Hash{}, err + } + return header.ReceiptHash, nil +} + +func (b *Block) OmmerHash(ctx context.Context) (common.Hash, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return common.Hash{}, err + } + return header.UncleHash, nil +} + +func (b *Block) OmmerCount(ctx context.Context) (*int32, error) { + block, err := b.resolve(ctx) + if err != nil || block == nil { + return nil, err + } + count := int32(len(block.Uncles())) + return &count, err +} + +func (b *Block) Ommers(ctx context.Context) (*[]*Block, error) { + block, err := b.resolve(ctx) + if err != nil || block == nil { + return nil, err + } + ret := make([]*Block, 0, len(block.Uncles())) + for _, uncle := range block.Uncles() { + blockNumberOrHash := rpc.BlockNumberOrHashWithHash(uncle.Hash(), false) + ret = append(ret, &Block{ + backend: b.backend, + numberOrHash: &blockNumberOrHash, + header: uncle, + }) + } + return &ret, nil +} + +func (b *Block) ExtraData(ctx context.Context) (hexutil.Bytes, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return hexutil.Bytes{}, err + } + return hexutil.Bytes(header.Extra), nil +} + +func (b *Block) LogsBloom(ctx context.Context) (hexutil.Bytes, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return hexutil.Bytes{}, err + } + return hexutil.Bytes(header.Bloom.Bytes()), nil +} + +func (b *Block) TotalDifficulty(ctx context.Context) (hexutil.Big, error) { + h := b.hash + if h == (common.Hash{}) { + header, err := b.resolveHeader(ctx) + if err != nil { + return hexutil.Big{}, err + } + h = header.Hash() + } + return hexutil.Big(*b.backend.GetTd(h)), nil +} + +// BlockNumberArgs encapsulates arguments to accessors that specify a block number. +type BlockNumberArgs struct { + // TODO: Ideally we could use input unions to allow the query to specify the + // block parameter by hash, block number, or tag but input unions aren't part of the + // standard GraphQL schema SDL yet, see: https://github.com/graphql/graphql-spec/issues/488 + Block *hexutil.Uint64 +} + +// NumberOr returns the provided block number argument, or the "current" block number or hash if none +// was provided. +func (a BlockNumberArgs) NumberOr(current rpc.BlockNumberOrHash) rpc.BlockNumberOrHash { + if a.Block != nil { + blockNr := rpc.BlockNumber(*a.Block) + return rpc.BlockNumberOrHashWithNumber(blockNr) + } + return current +} + +// NumberOrLatest returns the provided block number argument, or the "latest" block number if none +// was provided. +func (a BlockNumberArgs) NumberOrLatest() rpc.BlockNumberOrHash { + return a.NumberOr(rpc.BlockNumberOrHashWithNumber(rpc.LatestBlockNumber)) +} + +func (b *Block) Miner(ctx context.Context, args BlockNumberArgs) (*Account, error) { + header, err := b.resolveHeader(ctx) + if err != nil { + return nil, err + } + return &Account{ + backend: b.backend, + address: header.Coinbase, + blockNrOrHash: args.NumberOrLatest(), + }, nil +} + +func (b *Block) TransactionCount(ctx context.Context) (*int32, error) { + block, err := b.resolve(ctx) + if err != nil || block == nil { + return nil, err + } + count := int32(len(block.Transactions())) + return &count, err +} + +func (b *Block) Transactions(ctx context.Context) (*[]*Transaction, error) { + block, err := b.resolve(ctx) + if err != nil || block == nil { + return nil, err + } + ret := make([]*Transaction, 0, len(block.Transactions())) + for i, tx := range block.Transactions() { + ret = append(ret, &Transaction{ + backend: b.backend, + hash: tx.Hash(), + tx: tx, + block: b, + index: uint64(i), + }) + } + return &ret, nil +} + +func (b *Block) TransactionAt(ctx context.Context, args struct{ Index int32 }) (*Transaction, error) { + block, err := b.resolve(ctx) + if err != nil || block == nil { + return nil, err + } + txs := block.Transactions() + if args.Index < 0 || int(args.Index) >= len(txs) { + return nil, nil + } + tx := txs[args.Index] + return &Transaction{ + backend: b.backend, + hash: tx.Hash(), + tx: tx, + block: b, + index: uint64(args.Index), + }, nil +} + +func (b *Block) OmmerAt(ctx context.Context, args struct{ Index int32 }) (*Block, error) { + block, err := b.resolve(ctx) + if err != nil || block == nil { + return nil, err + } + uncles := block.Uncles() + if args.Index < 0 || int(args.Index) >= len(uncles) { + return nil, nil + } + uncle := uncles[args.Index] + blockNumberOrHash := rpc.BlockNumberOrHashWithHash(uncle.Hash(), false) + return &Block{ + backend: b.backend, + numberOrHash: &blockNumberOrHash, + header: uncle, + }, nil +} + +// BlockFilterCriteria encapsulates criteria passed to a `logs` accessor inside +// a block. +type BlockFilterCriteria struct { + Addresses *[]common.Address // restricts matches to events created by specific contracts + + // The Topic list restricts matches to particular event topics. Each event has a list + // of topics. Topics matches a prefix of that list. An empty element slice matches any + // topic. Non-empty elements represent an alternative that matches any of the + // contained topics. + // + // Examples: + // {} or nil matches any topic list + // {{A}} matches topic A in first position + // {{}, {B}} matches any topic in first position, B in second position + // {{A}, {B}} matches topic A in first position, B in second position + // {{A, B}}, {C, D}} matches topic (A OR B) in first position, (C OR D) in second position + Topics *[][]common.Hash +} + +// runFilter accepts a filter and executes it, returning all its results as +// `Log` objects. +func runFilter(ctx context.Context, be ethapi.Backend, filter *filters.Filter) ([]*Log, error) { + logs, err := filter.Logs(ctx) + if err != nil || logs == nil { + return nil, err + } + ret := make([]*Log, 0, len(logs)) + for _, log := range logs { + ret = append(ret, &Log{ + backend: be, + transaction: &Transaction{backend: be, hash: log.TxHash}, + log: log, + }) + } + return ret, nil +} + +func (b *Block) Logs(ctx context.Context, args struct{ Filter BlockFilterCriteria }) ([]*Log, error) { + var addresses []common.Address + if args.Filter.Addresses != nil { + addresses = *args.Filter.Addresses + } + var topics [][]common.Hash + if args.Filter.Topics != nil { + topics = *args.Filter.Topics + } + hash := b.hash + if hash == (common.Hash{}) { + header, err := b.resolveHeader(ctx) + if err != nil { + return nil, err + } + hash = header.Hash() + } + // Construct the range filter + filter := filters.NewBlockFilter(b.backend, hash, addresses, topics) + + // Run the filter and return all the logs + return runFilter(ctx, b.backend, filter) +} + +func (b *Block) Account(ctx context.Context, args struct { + Address common.Address +}) (*Account, error) { + if b.numberOrHash == nil { + _, err := b.resolveHeader(ctx) + if err != nil { + return nil, err + } + } + return &Account{ + backend: b.backend, + address: args.Address, + blockNrOrHash: *b.numberOrHash, + }, nil +} + +// CallData encapsulates arguments to `call` or `estimateGas`. +// All arguments are optional. +type CallData struct { + From *common.Address // The Ethereum address the call is from. + To *common.Address // The Ethereum address the call is to. + Gas *hexutil.Uint64 // The amount of gas provided for the call. + GasPrice *hexutil.Big // The price of each unit of gas, in wei. + Value *hexutil.Big // The value sent along with the call. + Data *hexutil.Bytes // Any data sent with the call. +} + +// CallResult encapsulates the result of an invocation of the `call` accessor. +type CallResult struct { + data hexutil.Bytes // The return data from the call + gasUsed hexutil.Uint64 // The amount of gas used + status hexutil.Uint64 // The return status of the call - 0 for failure or 1 for success. +} + +func (c *CallResult) Data() hexutil.Bytes { + return c.data +} + +func (c *CallResult) GasUsed() hexutil.Uint64 { + return c.gasUsed +} + +func (c *CallResult) Status() hexutil.Uint64 { + return c.status +} + +func (b *Block) Call(ctx context.Context, args struct { + Data ethapi.CallArgs +}) (*CallResult, error) { + if b.numberOrHash == nil { + _, err := b.resolve(ctx) + if err != nil { + return nil, err + } + } + result, gas, failed, err := ethapi.DoCall(ctx, b.backend, args.Data, *b.numberOrHash, nil, vm.Config{}, 5*time.Second, b.backend.RPCGasCap()) + status := hexutil.Uint64(1) + if failed { + status = 0 + } + return &CallResult{ + data: hexutil.Bytes(result), + gasUsed: hexutil.Uint64(gas), + status: status, + }, err +} + +func (b *Block) EstimateGas(ctx context.Context, args struct { + Data ethapi.CallArgs +}) (hexutil.Uint64, error) { + if b.numberOrHash == nil { + _, err := b.resolveHeader(ctx) + if err != nil { + return hexutil.Uint64(0), err + } + } + gas, err := ethapi.DoEstimateGas(ctx, b.backend, args.Data, *b.numberOrHash, b.backend.RPCGasCap()) + return gas, err +} + +type Pending struct { + backend ethapi.Backend +} + +func (p *Pending) TransactionCount(ctx context.Context) (int32, error) { + txs, err := p.backend.GetPoolTransactions() + return int32(len(txs)), err +} + +func (p *Pending) Transactions(ctx context.Context) (*[]*Transaction, error) { + txs, err := p.backend.GetPoolTransactions() + if err != nil { + return nil, err + } + ret := make([]*Transaction, 0, len(txs)) + for i, tx := range txs { + ret = append(ret, &Transaction{ + backend: p.backend, + hash: tx.Hash(), + tx: tx, + index: uint64(i), + }) + } + return &ret, nil +} + +func (p *Pending) Account(ctx context.Context, args struct { + Address common.Address +}) *Account { + pendingBlockNr := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber) + return &Account{ + backend: p.backend, + address: args.Address, + blockNrOrHash: pendingBlockNr, + } +} + +func (p *Pending) Call(ctx context.Context, args struct { + Data ethapi.CallArgs +}) (*CallResult, error) { + pendingBlockNr := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber) + result, gas, failed, err := ethapi.DoCall(ctx, p.backend, args.Data, pendingBlockNr, nil, vm.Config{}, 5*time.Second, p.backend.RPCGasCap()) + status := hexutil.Uint64(1) + if failed { + status = 0 + } + return &CallResult{ + data: hexutil.Bytes(result), + gasUsed: hexutil.Uint64(gas), + status: status, + }, err +} + +func (p *Pending) EstimateGas(ctx context.Context, args struct { + Data ethapi.CallArgs +}) (hexutil.Uint64, error) { + pendingBlockNr := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber) + return ethapi.DoEstimateGas(ctx, p.backend, args.Data, pendingBlockNr, p.backend.RPCGasCap()) +} + +// Resolver is the top-level object in the GraphQL hierarchy. +type Resolver struct { + backend ethapi.Backend +} + +func (r *Resolver) Block(ctx context.Context, args struct { + Number *hexutil.Uint64 + Hash *common.Hash +}) (*Block, error) { + var block *Block + if args.Number != nil { + number := rpc.BlockNumber(uint64(*args.Number)) + numberOrHash := rpc.BlockNumberOrHashWithNumber(number) + block = &Block{ + backend: r.backend, + numberOrHash: &numberOrHash, + } + } else if args.Hash != nil { + numberOrHash := rpc.BlockNumberOrHashWithHash(*args.Hash, false) + block = &Block{ + backend: r.backend, + numberOrHash: &numberOrHash, + } + } else { + numberOrHash := rpc.BlockNumberOrHashWithNumber(rpc.LatestBlockNumber) + block = &Block{ + backend: r.backend, + numberOrHash: &numberOrHash, + } + } + // Resolve the header, return nil if it doesn't exist. + // Note we don't resolve block directly here since it will require an + // additional network request for light client. + h, err := block.resolveHeader(ctx) + if err != nil { + return nil, err + } else if h == nil { + return nil, nil + } + return block, nil +} + +func (r *Resolver) Blocks(ctx context.Context, args struct { + From hexutil.Uint64 + To *hexutil.Uint64 +}) ([]*Block, error) { + from := rpc.BlockNumber(args.From) + + var to rpc.BlockNumber + if args.To != nil { + to = rpc.BlockNumber(*args.To) + } else { + to = rpc.BlockNumber(r.backend.CurrentBlock().Number().Int64()) + } + if to < from { + return []*Block{}, nil + } + ret := make([]*Block, 0, to-from+1) + for i := from; i <= to; i++ { + numberOrHash := rpc.BlockNumberOrHashWithNumber(i) + ret = append(ret, &Block{ + backend: r.backend, + numberOrHash: &numberOrHash, + }) + } + return ret, nil +} + +func (r *Resolver) Pending(ctx context.Context) *Pending { + return &Pending{r.backend} +} + +func (r *Resolver) Transaction(ctx context.Context, args struct{ Hash common.Hash }) (*Transaction, error) { + tx := &Transaction{ + backend: r.backend, + hash: args.Hash, + } + // Resolve the transaction; if it doesn't exist, return nil. + t, err := tx.resolve(ctx) + if err != nil { + return nil, err + } else if t == nil { + return nil, nil + } + return tx, nil +} + +func (r *Resolver) SendRawTransaction(ctx context.Context, args struct{ Data hexutil.Bytes }) (common.Hash, error) { + tx := new(types.Transaction) + if err := rlp.DecodeBytes(args.Data, tx); err != nil { + return common.Hash{}, err + } + hash, err := ethapi.SubmitTransaction(ctx, r.backend, tx) + return hash, err +} + +// FilterCriteria encapsulates the arguments to `logs` on the root resolver object. +type FilterCriteria struct { + FromBlock *hexutil.Uint64 // beginning of the queried range, nil means genesis block + ToBlock *hexutil.Uint64 // end of the range, nil means latest block + Addresses *[]common.Address // restricts matches to events created by specific contracts + + // The Topic list restricts matches to particular event topics. Each event has a list + // of topics. Topics matches a prefix of that list. An empty element slice matches any + // topic. Non-empty elements represent an alternative that matches any of the + // contained topics. + // + // Examples: + // {} or nil matches any topic list + // {{A}} matches topic A in first position + // {{}, {B}} matches any topic in first position, B in second position + // {{A}, {B}} matches topic A in first position, B in second position + // {{A, B}}, {C, D}} matches topic (A OR B) in first position, (C OR D) in second position + Topics *[][]common.Hash +} + +func (r *Resolver) Logs(ctx context.Context, args struct{ Filter FilterCriteria }) ([]*Log, error) { + // Convert the RPC block numbers into internal representations + begin := rpc.LatestBlockNumber.Int64() + if args.Filter.FromBlock != nil { + begin = int64(*args.Filter.FromBlock) + } + end := rpc.LatestBlockNumber.Int64() + if args.Filter.ToBlock != nil { + end = int64(*args.Filter.ToBlock) + } + var addresses []common.Address + if args.Filter.Addresses != nil { + addresses = *args.Filter.Addresses + } + var topics [][]common.Hash + if args.Filter.Topics != nil { + topics = *args.Filter.Topics + } + // Construct the range filter + filter := filters.NewRangeFilter(filters.Backend(r.backend), begin, end, addresses, topics) + return runFilter(ctx, r.backend, filter) +} + +func (r *Resolver) GasPrice(ctx context.Context) (hexutil.Big, error) { + price, err := r.backend.SuggestPrice(ctx) + return hexutil.Big(*price), err +} + +func (r *Resolver) ProtocolVersion(ctx context.Context) (int32, error) { + return int32(r.backend.ProtocolVersion()), nil +} + +// SyncState represents the synchronisation status returned from the `syncing` accessor. +type SyncState struct { + progress ethereum.SyncProgress +} + +func (s *SyncState) StartingBlock() hexutil.Uint64 { + return hexutil.Uint64(s.progress.StartingBlock) +} + +func (s *SyncState) CurrentBlock() hexutil.Uint64 { + return hexutil.Uint64(s.progress.CurrentBlock) +} + +func (s *SyncState) HighestBlock() hexutil.Uint64 { + return hexutil.Uint64(s.progress.HighestBlock) +} + +func (s *SyncState) PulledStates() *hexutil.Uint64 { + ret := hexutil.Uint64(s.progress.PulledStates) + return &ret +} + +func (s *SyncState) KnownStates() *hexutil.Uint64 { + ret := hexutil.Uint64(s.progress.KnownStates) + return &ret +} + +// Syncing returns false in case the node is currently not syncing with the network. It can be up to date or has not +// yet received the latest block headers from its pears. In case it is synchronizing: +// - startingBlock: block number this node started to synchronise from +// - currentBlock: block number this node is currently importing +// - highestBlock: block number of the highest block header this node has received from peers +// - pulledStates: number of state entries processed until now +// - knownStates: number of known state entries that still need to be pulled +func (r *Resolver) Syncing() (*SyncState, error) { + progress := r.backend.Downloader().Progress() + + // Return not syncing if the synchronisation already completed + if progress.CurrentBlock >= progress.HighestBlock { + return nil, nil + } + // Otherwise gather the block sync stats + return &SyncState{progress}, nil +} diff --git a/graphql/graphql_test.go b/graphql/graphql_test.go new file mode 100644 index 000000000000..40b13187f496 --- /dev/null +++ b/graphql/graphql_test.go @@ -0,0 +1,28 @@ +// Copyright 2019 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 graphql + +import ( + "testing" +) + +func TestBuildSchema(t *testing.T) { + // Make sure the schema can be parsed and matched up to the object model. + if _, err := newHandler(nil); err != nil { + t.Errorf("Could not construct GraphQL handler: %v", err) + } +} diff --git a/graphql/schema.go b/graphql/schema.go new file mode 100644 index 000000000000..525b9e1e5a88 --- /dev/null +++ b/graphql/schema.go @@ -0,0 +1,320 @@ +// Copyright 2019 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 graphql + +const schema string = ` + # Bytes32 is a 32 byte binary string, represented as 0x-prefixed hexadecimal. + scalar Bytes32 + # Address is a 20 byte Ethereum address, represented as 0x-prefixed hexadecimal. + scalar Address + # Bytes is an arbitrary length binary string, represented as 0x-prefixed hexadecimal. + # An empty byte string is represented as '0x'. Byte strings must have an even number of hexadecimal nybbles. + scalar Bytes + # BigInt is a large integer. Input is accepted as either a JSON number or as a string. + # Strings may be either decimal or 0x-prefixed hexadecimal. Output values are all + # 0x-prefixed hexadecimal. + scalar BigInt + # Long is a 64 bit unsigned integer. + scalar Long + + schema { + query: Query + mutation: Mutation + } + + # Account is an Ethereum account at a particular block. + type Account { + # Address is the address owning the account. + address: Address! + # Balance is the balance of the account, in wei. + balance: BigInt! + # TransactionCount is the number of transactions sent from this account, + # or in the case of a contract, the number of contracts created. Otherwise + # known as the nonce. + transactionCount: Long! + # Code contains the smart contract code for this account, if the account + # is a (non-self-destructed) contract. + code: Bytes! + # Storage provides access to the storage of a contract account, indexed + # by its 32 byte slot identifier. + storage(slot: Bytes32!): Bytes32! + } + + # Log is an Ethereum event log. + type Log { + # Index is the index of this log in the block. + index: Int! + # Account is the account which generated this log - this will always + # be a contract account. + account(block: Long): Account! + # Topics is a list of 0-4 indexed topics for the log. + topics: [Bytes32!]! + # Data is unindexed data for this log. + data: Bytes! + # Transaction is the transaction that generated this log entry. + transaction: Transaction! + } + + # Transaction is an Ethereum transaction. + type Transaction { + # Hash is the hash of this transaction. + hash: Bytes32! + # Nonce is the nonce of the account this transaction was generated with. + nonce: Long! + # Index is the index of this transaction in the parent block. This will + # be null if the transaction has not yet been mined. + index: Int + # From is the account that sent this transaction - this will always be + # an externally owned account. + from(block: Long): Account! + # To is the account the transaction was sent to. This is null for + # contract-creating transactions. + to(block: Long): Account + # Value is the value, in wei, sent along with this transaction. + value: BigInt! + # GasPrice is the price offered to miners for gas, in wei per unit. + gasPrice: BigInt! + # Gas is the maximum amount of gas this transaction can consume. + gas: Long! + # InputData is the data supplied to the target of the transaction. + inputData: Bytes! + # Block is the block this transaction was mined in. This will be null if + # the transaction has not yet been mined. + block: Block + + # Status is the return status of the transaction. This will be 1 if the + # transaction succeeded, or 0 if it failed (due to a revert, or due to + # running out of gas). If the transaction has not yet been mined, this + # field will be null. + status: Long + # GasUsed is the amount of gas that was used processing this transaction. + # If the transaction has not yet been mined, this field will be null. + gasUsed: Long + # CumulativeGasUsed is the total gas used in the block up to and including + # this transaction. If the transaction has not yet been mined, this field + # will be null. + cumulativeGasUsed: Long + # CreatedContract is the account that was created by a contract creation + # transaction. If the transaction was not a contract creation transaction, + # or it has not yet been mined, this field will be null. + createdContract(block: Long): Account + # Logs is a list of log entries emitted by this transaction. If the + # transaction has not yet been mined, this field will be null. + logs: [Log!] + } + + # BlockFilterCriteria encapsulates log filter criteria for a filter applied + # to a single block. + input BlockFilterCriteria { + # Addresses is list of addresses that are of interest. If this list is + # empty, results will not be filtered by address. + addresses: [Address!] + # Topics list restricts matches to particular event topics. Each event has a list + # of topics. Topics matches a prefix of that list. An empty element array matches any + # topic. Non-empty elements represent an alternative that matches any of the + # contained topics. + # + # Examples: + # - [] or nil matches any topic list + # - [[A]] matches topic A in first position + # - [[], [B]] matches any topic in first position, B in second position + # - [[A], [B]] matches topic A in first position, B in second position + # - [[A, B]], [C, D]] matches topic (A OR B) in first position, (C OR D) in second position + topics: [[Bytes32!]!] + } + + # Block is an Ethereum block. + type Block { + # Number is the number of this block, starting at 0 for the genesis block. + number: Long! + # Hash is the block hash of this block. + hash: Bytes32! + # Parent is the parent block of this block. + parent: Block + # Nonce is the block nonce, an 8 byte sequence determined by the miner. + nonce: Bytes! + # TransactionsRoot is the keccak256 hash of the root of the trie of transactions in this block. + transactionsRoot: Bytes32! + # TransactionCount is the number of transactions in this block. if + # transactions are not available for this block, this field will be null. + transactionCount: Int + # StateRoot is the keccak256 hash of the state trie after this block was processed. + stateRoot: Bytes32! + # ReceiptsRoot is the keccak256 hash of the trie of transaction receipts in this block. + receiptsRoot: Bytes32! + # Miner is the account that mined this block. + miner(block: Long): Account! + # ExtraData is an arbitrary data field supplied by the miner. + extraData: Bytes! + # GasLimit is the maximum amount of gas that was available to transactions in this block. + gasLimit: Long! + # GasUsed is the amount of gas that was used executing transactions in this block. + gasUsed: Long! + # Timestamp is the unix timestamp at which this block was mined. + timestamp: Long! + # LogsBloom is a bloom filter that can be used to check if a block may + # contain log entries matching a filter. + logsBloom: Bytes! + # MixHash is the hash that was used as an input to the PoW process. + mixHash: Bytes32! + # Difficulty is a measure of the difficulty of mining this block. + difficulty: BigInt! + # TotalDifficulty is the sum of all difficulty values up to and including + # this block. + totalDifficulty: BigInt! + # OmmerCount is the number of ommers (AKA uncles) associated with this + # block. If ommers are unavailable, this field will be null. + ommerCount: Int + # Ommers is a list of ommer (AKA uncle) blocks associated with this block. + # If ommers are unavailable, this field will be null. Depending on your + # node, the transactions, transactionAt, transactionCount, ommers, + # ommerCount and ommerAt fields may not be available on any ommer blocks. + ommers: [Block] + # OmmerAt returns the ommer (AKA uncle) at the specified index. If ommers + # are unavailable, or the index is out of bounds, this field will be null. + ommerAt(index: Int!): Block + # OmmerHash is the keccak256 hash of all the ommers (AKA uncles) + # associated with this block. + ommerHash: Bytes32! + # Transactions is a list of transactions associated with this block. If + # transactions are unavailable for this block, this field will be null. + transactions: [Transaction!] + # TransactionAt returns the transaction at the specified index. If + # transactions are unavailable for this block, or if the index is out of + # bounds, this field will be null. + transactionAt(index: Int!): Transaction + # Logs returns a filtered set of logs from this block. + logs(filter: BlockFilterCriteria!): [Log!]! + # Account fetches an Ethereum account at the current block's state. + account(address: Address!): Account! + # Call executes a local call operation at the current block's state. + call(data: CallData!): CallResult + # EstimateGas estimates the amount of gas that will be required for + # successful execution of a transaction at the current block's state. + estimateGas(data: CallData!): Long! + } + + # CallData represents the data associated with a local contract call. + # All fields are optional. + input CallData { + # From is the address making the call. + from: Address + # To is the address the call is sent to. + to: Address + # Gas is the amount of gas sent with the call. + gas: Long + # GasPrice is the price, in wei, offered for each unit of gas. + gasPrice: BigInt + # Value is the value, in wei, sent along with the call. + value: BigInt + # Data is the data sent to the callee. + data: Bytes + } + + # CallResult is the result of a local call operation. + type CallResult { + # Data is the return data of the called contract. + data: Bytes! + # GasUsed is the amount of gas used by the call, after any refunds. + gasUsed: Long! + # Status is the result of the call - 1 for success or 0 for failure. + status: Long! + } + + # FilterCriteria encapsulates log filter criteria for searching log entries. + input FilterCriteria { + # FromBlock is the block at which to start searching, inclusive. Defaults + # to the latest block if not supplied. + fromBlock: Long + # ToBlock is the block at which to stop searching, inclusive. Defaults + # to the latest block if not supplied. + toBlock: Long + # Addresses is a list of addresses that are of interest. If this list is + # empty, results will not be filtered by address. + addresses: [Address!] + # Topics list restricts matches to particular event topics. Each event has a list + # of topics. Topics matches a prefix of that list. An empty element array matches any + # topic. Non-empty elements represent an alternative that matches any of the + # contained topics. + # + # Examples: + # - [] or nil matches any topic list + # - [[A]] matches topic A in first position + # - [[], [B]] matches any topic in first position, B in second position + # - [[A], [B]] matches topic A in first position, B in second position + # - [[A, B]], [C, D]] matches topic (A OR B) in first position, (C OR D) in second position + topics: [[Bytes32!]!] + } + + # SyncState contains the current synchronisation state of the client. + type SyncState{ + # StartingBlock is the block number at which synchronisation started. + startingBlock: Long! + # CurrentBlock is the point at which synchronisation has presently reached. + currentBlock: Long! + # HighestBlock is the latest known block number. + highestBlock: Long! + # PulledStates is the number of state entries fetched so far, or null + # if this is not known or not relevant. + pulledStates: Long + # KnownStates is the number of states the node knows of so far, or null + # if this is not known or not relevant. + knownStates: Long + } + + # Pending represents the current pending state. + type Pending { + # TransactionCount is the number of transactions in the pending state. + transactionCount: Int! + # Transactions is a list of transactions in the current pending state. + transactions: [Transaction!] + # Account fetches an Ethereum account for the pending state. + account(address: Address!): Account! + # Call executes a local call operation for the pending state. + call(data: CallData!): CallResult + # EstimateGas estimates the amount of gas that will be required for + # successful execution of a transaction for the pending state. + estimateGas(data: CallData!): Long! + } + + type Query { + # Block fetches an Ethereum block by number or by hash. If neither is + # supplied, the most recent known block is returned. + block(number: Long, hash: Bytes32): Block + # Blocks returns all the blocks between two numbers, inclusive. If + # to is not supplied, it defaults to the most recent known block. + blocks(from: Long!, to: Long): [Block!]! + # Pending returns the current pending state. + pending: Pending! + # Transaction returns a transaction specified by its hash. + transaction(hash: Bytes32!): Transaction + # Logs returns log entries matching the provided filter. + logs(filter: FilterCriteria!): [Log!]! + # GasPrice returns the node's estimate of a gas price sufficient to + # ensure a transaction is mined in a timely fashion. + gasPrice: BigInt! + # ProtocolVersion returns the current wire protocol version number. + protocolVersion: Int! + # Syncing returns information on the current synchronisation state. + syncing: SyncState + } + + type Mutation { + # SendRawTransaction sends an RLP-encoded transaction to the network. + sendRawTransaction(data: Bytes!): Bytes32! + } +` diff --git a/graphql/service.go b/graphql/service.go new file mode 100644 index 000000000000..f64075680634 --- /dev/null +++ b/graphql/service.go @@ -0,0 +1,103 @@ +// Copyright 2019 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 graphql + +import ( + "fmt" + "net" + "net/http" + + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rpc" + "github.com/graph-gophers/graphql-go" + "github.com/graph-gophers/graphql-go/relay" +) + +// Service encapsulates a GraphQL service. +type Service struct { + endpoint string // The host:port endpoint for this service. + cors []string // Allowed CORS domains + vhosts []string // Recognised vhosts + timeouts rpc.HTTPTimeouts // Timeout settings for HTTP requests. + backend ethapi.Backend // The backend that queries will operate onn. + handler http.Handler // The `http.Handler` used to answer queries. + listener net.Listener // The listening socket. +} + +// New constructs a new GraphQL service instance. +func New(backend ethapi.Backend, endpoint string, cors, vhosts []string, timeouts rpc.HTTPTimeouts) (*Service, error) { + return &Service{ + endpoint: endpoint, + cors: cors, + vhosts: vhosts, + timeouts: timeouts, + backend: backend, + }, nil +} + +// Protocols returns the list of protocols exported by this service. +func (s *Service) Protocols() []p2p.Protocol { return nil } + +// APIs returns the list of APIs exported by this service. +func (s *Service) APIs() []rpc.API { return nil } + +// Start is called after all services have been constructed and the networking +// layer was also initialized to spawn any goroutines required by the service. +func (s *Service) Start(server *p2p.Server) error { + var err error + s.handler, err = newHandler(s.backend) + if err != nil { + return err + } + if s.listener, err = net.Listen("tcp", s.endpoint); err != nil { + return err + } + go rpc.NewHTTPServer(s.cors, s.vhosts, s.timeouts, s.handler).Serve(s.listener) + log.Info("GraphQL endpoint opened", "url", fmt.Sprintf("http://%s", s.endpoint)) + return nil +} + +// newHandler returns a new `http.Handler` that will answer GraphQL queries. +// It additionally exports an interactive query browser on the / endpoint. +func newHandler(backend ethapi.Backend) (http.Handler, error) { + q := Resolver{backend} + + s, err := graphql.ParseSchema(schema, &q) + if err != nil { + return nil, err + } + h := &relay.Handler{Schema: s} + + mux := http.NewServeMux() + mux.Handle("/", GraphiQL{}) + mux.Handle("/graphql", h) + mux.Handle("/graphql/", h) + return mux, nil +} + +// Stop terminates all goroutines belonging to the service, blocking until they +// are all terminated. +func (s *Service) Stop() error { + if s.listener != nil { + s.listener.Close() + s.listener = nil + log.Info("GraphQL endpoint closed", "url", fmt.Sprintf("http://%s", s.endpoint)) + } + return nil +} diff --git a/interfaces.go b/interfaces.go index 332925557507..1ff31f96b6a6 100644 --- a/interfaces.go +++ b/interfaces.go @@ -22,8 +22,8 @@ import ( "errors" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" ) // NotFound is returned by API methods if the requested item does not exist. @@ -144,9 +144,9 @@ type FilterQuery struct { // Examples: // {} or nil matches any topic list // {{A}} matches topic A in first position - // {{}, {B}} matches any topic in first position, B in second position - // {{A}, {B}} matches topic A in first position, B in second position - // {{A, B}, {C, D}} matches topic (A OR B) in first position, (C OR D) in second position + // {{}, {B}} matches any topic in first position AND B in second position + // {{A}, {B}} matches topic A in first position AND B in second position + // {{A, B}, {C, D}} matches topic (A OR B) in first position AND (C OR D) in second position Topics [][]common.Hash } diff --git a/internal/build/archive.go b/internal/build/archive.go index ac680ba63de8..a00258d99903 100644 --- a/internal/build/archive.go +++ b/internal/build/archive.go @@ -183,3 +183,48 @@ func (a *TarballArchive) Close() error { } return a.file.Close() } + +func ExtractTarballArchive(archive string, dest string) error { + // We're only interested in gzipped archives, wrap the reader now + ar, err := os.Open(archive) + if err != nil { + return err + } + defer ar.Close() + + gzr, err := gzip.NewReader(ar) + if err != nil { + return err + } + defer gzr.Close() + + // Iterate over all the files in the tarball + tr := tar.NewReader(gzr) + for { + // Fetch the next tarball header and abort if needed + header, err := tr.Next() + if err != nil { + if err == io.EOF { + return nil + } + return err + } + // Figure out the target and create it + target := filepath.Join(dest, header.Name) + + switch header.Typeflag { + case tar.TypeReg: + if err := os.MkdirAll(filepath.Dir(target), 0755); err != nil { + return err + } + file, err := os.OpenFile(target, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode)) + if err != nil { + return err + } + if _, err := io.Copy(file, tr); err != nil { + return err + } + file.Close() + } + } +} diff --git a/internal/build/azure.go b/internal/build/azure.go index 086dff2c4a8a..786284265082 100644 --- a/internal/build/azure.go +++ b/internal/build/azure.go @@ -22,7 +22,7 @@ import ( "net/url" "os" - "github.com/Azure/azure-storage-blob-go/2018-03-28/azblob" + "github.com/Azure/azure-storage-blob-go/azblob" ) // AzureBlobstoreConfig is an authentication and configuration struct containing @@ -45,7 +45,11 @@ func AzureBlobstoreUpload(path string, name string, config AzureBlobstoreConfig) return nil } // Create an authenticated client against the Azure cloud - credential := azblob.NewSharedKeyCredential(config.Account, config.Token) + credential, err := azblob.NewSharedKeyCredential(config.Account, config.Token) + if err != nil { + return err + } + pipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{}) u, _ := url.Parse(fmt.Sprintf("https://%s.blob.core.windows.net", config.Account)) @@ -67,7 +71,11 @@ func AzureBlobstoreUpload(path string, name string, config AzureBlobstoreConfig) // AzureBlobstoreList lists all the files contained within an azure blobstore. func AzureBlobstoreList(config AzureBlobstoreConfig) ([]azblob.BlobItem, error) { - credential := azblob.NewSharedKeyCredential(config.Account, config.Token) + credential, err := azblob.NewSharedKeyCredential(config.Account, config.Token) + if err != nil { + return nil, err + } + pipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{}) u, _ := url.Parse(fmt.Sprintf("https://%s.blob.core.windows.net", config.Account)) @@ -95,7 +103,11 @@ func AzureBlobstoreDelete(config AzureBlobstoreConfig, blobs []azblob.BlobItem) return nil } // Create an authenticated client against the Azure cloud - credential := azblob.NewSharedKeyCredential(config.Account, config.Token) + credential, err := azblob.NewSharedKeyCredential(config.Account, config.Token) + if err != nil { + return err + } + pipeline := azblob.NewPipeline(credential, azblob.PipelineOptions{}) u, _ := url.Parse(fmt.Sprintf("https://%s.blob.core.windows.net", config.Account)) diff --git a/internal/build/download.go b/internal/build/download.go new file mode 100644 index 000000000000..c50680029529 --- /dev/null +++ b/internal/build/download.go @@ -0,0 +1,149 @@ +// Copyright 2019 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 build + +import ( + "bufio" + "crypto/sha256" + "encoding/hex" + "fmt" + "io" + "io/ioutil" + "log" + "net/http" + "os" + "path/filepath" + "strings" +) + +// ChecksumDB keeps file checksums. +type ChecksumDB struct { + allChecksums []string +} + +// MustLoadChecksums loads a file containing checksums. +func MustLoadChecksums(file string) *ChecksumDB { + content, err := ioutil.ReadFile(file) + if err != nil { + log.Fatal("can't load checksum file: " + err.Error()) + } + return &ChecksumDB{strings.Split(string(content), "\n")} +} + +// Verify checks whether the given file is valid according to the checksum database. +func (db *ChecksumDB) Verify(path string) error { + fd, err := os.Open(path) + if err != nil { + return err + } + defer fd.Close() + + h := sha256.New() + if _, err := io.Copy(h, bufio.NewReader(fd)); err != nil { + return err + } + fileHash := hex.EncodeToString(h.Sum(nil)) + if !db.findHash(filepath.Base(path), fileHash) { + return fmt.Errorf("invalid file hash %s", fileHash) + } + return nil +} + +func (db *ChecksumDB) findHash(basename, hash string) bool { + want := hash + " " + basename + for _, line := range db.allChecksums { + if strings.TrimSpace(line) == want { + return true + } + } + return false +} + +// DownloadFile downloads a file and verifies its checksum. +func (db *ChecksumDB) DownloadFile(url, dstPath string) error { + if err := db.Verify(dstPath); err == nil { + fmt.Printf("%s is up-to-date\n", dstPath) + return nil + } + fmt.Printf("%s is stale\n", dstPath) + fmt.Printf("downloading from %s\n", url) + + resp, err := http.Get(url) + if err != nil || resp.StatusCode != http.StatusOK { + return fmt.Errorf("download error: code %d, err %v", resp.StatusCode, err) + } + defer resp.Body.Close() + if err := os.MkdirAll(filepath.Dir(dstPath), 0755); err != nil { + return err + } + fd, err := os.OpenFile(dstPath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) + if err != nil { + return err + } + dst := newDownloadWriter(fd, resp.ContentLength) + _, err = io.Copy(dst, resp.Body) + dst.Close() + if err != nil { + return err + } + + return db.Verify(dstPath) +} + +type downloadWriter struct { + file *os.File + dstBuf *bufio.Writer + size int64 + written int64 + lastpct int64 +} + +func newDownloadWriter(dst *os.File, size int64) *downloadWriter { + return &downloadWriter{ + file: dst, + dstBuf: bufio.NewWriter(dst), + size: size, + } +} + +func (w *downloadWriter) Write(buf []byte) (int, error) { + n, err := w.dstBuf.Write(buf) + + // Report progress. + w.written += int64(n) + pct := w.written * 10 / w.size * 10 + if pct != w.lastpct { + if w.lastpct != 0 { + fmt.Print("...") + } + fmt.Print(pct, "%") + w.lastpct = pct + } + return n, err +} + +func (w *downloadWriter) Close() error { + if w.lastpct > 0 { + fmt.Println() // Finish the progress line. + } + flushErr := w.dstBuf.Flush() + closeErr := w.file.Close() + if flushErr != nil { + return flushErr + } + return closeErr +} diff --git a/internal/build/env.go b/internal/build/env.go index fe15edd4b23e..a3017182e3c1 100644 --- a/internal/build/env.go +++ b/internal/build/env.go @@ -20,7 +20,10 @@ import ( "flag" "fmt" "os" + "regexp" + "strconv" "strings" + "time" ) var ( @@ -35,17 +38,17 @@ var ( // Environment contains metadata provided by the build environment. type Environment struct { - Name string // name of the environment - Repo string // name of GitHub repo - Commit, Branch, Tag string // Git info - Buildnum string - IsPullRequest bool - IsCronJob bool + Name string // name of the environment + Repo string // name of GitHub repo + Commit, Date, Branch, Tag string // Git info + Buildnum string + IsPullRequest bool + IsCronJob bool } func (env Environment) String() string { - return fmt.Sprintf("%s env (commit:%s branch:%s tag:%s buildnum:%s pr:%t)", - env.Name, env.Commit, env.Branch, env.Tag, env.Buildnum, env.IsPullRequest) + return fmt.Sprintf("%s env (commit:%s date:%s branch:%s tag:%s buildnum:%s pr:%t)", + env.Name, env.Commit, env.Date, env.Branch, env.Tag, env.Buildnum, env.IsPullRequest) } // Env returns metadata about the current CI environment, falling back to LocalEnv @@ -53,10 +56,15 @@ func (env Environment) String() string { func Env() Environment { switch { case os.Getenv("CI") == "true" && os.Getenv("TRAVIS") == "true": + commit := os.Getenv("TRAVIS_PULL_REQUEST_SHA") + if commit == "" { + commit = os.Getenv("TRAVIS_COMMIT") + } return Environment{ Name: "travis", Repo: os.Getenv("TRAVIS_REPO_SLUG"), - Commit: os.Getenv("TRAVIS_COMMIT"), + Commit: commit, + Date: getDate(commit), Branch: os.Getenv("TRAVIS_BRANCH"), Tag: os.Getenv("TRAVIS_TAG"), Buildnum: os.Getenv("TRAVIS_BUILD_NUMBER"), @@ -64,10 +72,15 @@ func Env() Environment { IsCronJob: os.Getenv("TRAVIS_EVENT_TYPE") == "cron", } case os.Getenv("CI") == "True" && os.Getenv("APPVEYOR") == "True": + commit := os.Getenv("APPVEYOR_PULL_REQUEST_HEAD_COMMIT") + if commit == "" { + commit = os.Getenv("APPVEYOR_REPO_COMMIT") + } return Environment{ Name: "appveyor", Repo: os.Getenv("APPVEYOR_REPO_NAME"), - Commit: os.Getenv("APPVEYOR_REPO_COMMIT"), + Commit: commit, + Date: getDate(commit), Branch: os.Getenv("APPVEYOR_REPO_BRANCH"), Tag: os.Getenv("APPVEYOR_REPO_TAG_NAME"), Buildnum: os.Getenv("APPVEYOR_BUILD_NUMBER"), @@ -81,17 +94,25 @@ func Env() Environment { // LocalEnv returns build environment metadata gathered from git. func LocalEnv() Environment { - env := applyEnvFlags(Environment{Name: "local", Repo: "nebulaai/nbai-node"}) + env := applyEnvFlags(Environment{Name: "local", Repo: "ethereum/go-ethereum"}) head := readGitFile("HEAD") - if splits := strings.Split(head, " "); len(splits) == 2 { - head = splits[1] + if fields := strings.Fields(head); len(fields) == 2 { + head = fields[1] } else { + // In this case we are in "detached head" state + // see: https://git-scm.com/docs/git-checkout#_detached_head + // Additional check required to verify, that file contains commit hash + commitRe, _ := regexp.Compile("^([0-9a-f]{40})$") + if commit := commitRe.FindString(head); commit != "" && env.Commit == "" { + env.Commit = commit + } return env } if env.Commit == "" { env.Commit = readGitFile(head) } + env.Date = getDate(env.Commit) if env.Branch == "" { if head != "HEAD" { env.Branch = strings.TrimPrefix(head, "refs/heads/") @@ -107,6 +128,21 @@ func firstLine(s string) string { return strings.Split(s, "\n")[0] } +func getDate(commit string) string { + if commit == "" { + return "" + } + out := RunGit("show", "-s", "--format=%ct", commit) + if out == "" { + return "" + } + date, err := strconv.ParseInt(strings.TrimSpace(out), 10, 64) + if err != nil { + panic(fmt.Sprintf("failed to parse git commit date: %v", err)) + } + return time.Unix(date, 0).Format("20060102") +} + func applyEnvFlags(env Environment) Environment { if !flag.Parsed() { panic("you need to call flag.Parse before Env or LocalEnv") diff --git a/internal/build/util.go b/internal/build/util.go index 195bdb404b8b..08a71d877788 100644 --- a/internal/build/util.go +++ b/internal/build/util.go @@ -68,13 +68,14 @@ func RunGit(args ...string) string { cmd := exec.Command("git", args...) var stdout, stderr bytes.Buffer cmd.Stdout, cmd.Stderr = &stdout, &stderr - if err := cmd.Run(); err == exec.ErrNotFound { - if !warnedAboutGit { - log.Println("Warning: can't find 'git' in PATH") - warnedAboutGit = true + if err := cmd.Run(); err != nil { + if e, ok := err.(*exec.Error); ok && e.Err == exec.ErrNotFound { + if !warnedAboutGit { + log.Println("Warning: can't find 'git' in PATH") + warnedAboutGit = true + } + return "" } - return "" - } else if err != nil { log.Fatal(strings.Join(cmd.Args, " "), ": ", err, "\n", stderr.String()) } return strings.TrimSpace(stdout.String()) @@ -117,63 +118,46 @@ func render(tpl *template.Template, outputFile string, outputPerm os.FileMode, x } } -// CopyFile copies a file. -func CopyFile(dst, src string, mode os.FileMode) { - if err := os.MkdirAll(filepath.Dir(dst), 0755); err != nil { - log.Fatal(err) - } - destFile, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, mode) - if err != nil { - log.Fatal(err) - } - defer destFile.Close() - - srcFile, err := os.Open(src) - if err != nil { - log.Fatal(err) - } - defer srcFile.Close() - - if _, err := io.Copy(destFile, srcFile); err != nil { - log.Fatal(err) - } -} - // 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.11/bin/go run build/ci.go ... +// /usr/lib/go-1.12.1/bin/go run build/ci.go ... // -// runs using go 1.11 and invokes go 1.11 tools from the same GOROOT. This is also important +// runs using go 1.12.1 and invokes go 1.12.1 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 { - expand := false - for _, pkg := range patterns { - if strings.Contains(pkg, "...") { - expand = true - } +// UploadSFTP uploads files to a remote host using the sftp command line tool. +// The destination host may be specified either as [user@]host[: or as a URI in +// the form sftp://[user@]host[:port]. +func UploadSFTP(identityFile, host, dir string, files []string) error { + sftp := exec.Command("sftp") + sftp.Stdout = nil + sftp.Stderr = os.Stderr + if identityFile != "" { + sftp.Args = append(sftp.Args, "-i", identityFile) } - if expand { - cmd := GoTool("list", patterns...) - out, err := cmd.CombinedOutput() - if err != nil { - log.Fatalf("package listing failed: %v\n%s", err, string(out)) - } - var packages []string - for _, line := range strings.Split(string(out), "\n") { - if !strings.Contains(line, "/vendor/") { - packages = append(packages, strings.TrimSpace(line)) - } - } - return packages + sftp.Args = append(sftp.Args, host) + fmt.Println(">>>", strings.Join(sftp.Args, " ")) + if *DryRunFlag { + return nil + } + + stdin, err := sftp.StdinPipe() + if err != nil { + return fmt.Errorf("can't create stdin pipe for sftp: %v", err) + } + if err := sftp.Start(); err != nil { + return err + } + in := io.MultiWriter(stdin, os.Stdout) + for _, f := range files { + fmt.Fprintln(in, "put", f, path.Join(dir, filepath.Base(f))) } - return patterns + stdin.Close() + return sftp.Wait() } diff --git a/internal/cmdtest/test_cmd.go b/internal/cmdtest/test_cmd.go index f8b1b43c0119..d4ccc583297a 100644 --- a/internal/cmdtest/test_cmd.go +++ b/internal/cmdtest/test_cmd.go @@ -127,12 +127,12 @@ func (tt *TestCmd) matchExactOutput(want []byte) error { // Find the mismatch position. for i := 0; i < n; i++ { if want[i] != buf[i] { - return fmt.Errorf("Output mismatch at ◊:\n---------------- (stdout text)\n%s◊%s\n---------------- (expected text)\n%s", + return fmt.Errorf("output mismatch at ◊:\n---------------- (stdout text)\n%s◊%s\n---------------- (expected text)\n%s", buf[:i], buf[i:n], want) } } if n < len(want) { - return fmt.Errorf("Not enough output, got until ◊:\n---------------- (stdout text)\n%s\n---------------- (expected text)\n%s◊%s", + return fmt.Errorf("not enough output, got until ◊:\n---------------- (stdout text)\n%s\n---------------- (expected text)\n%s◊%s", buf, want[:n], want[n:]) } } diff --git a/internal/debug/api.go b/internal/debug/api.go index 5c4062983744..86a4218f6a57 100644 --- a/internal/debug/api.go +++ b/internal/debug/api.go @@ -34,7 +34,7 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // Handler is the global debugging handler. diff --git a/internal/debug/flags.go b/internal/debug/flags.go index ea13db20225e..46c8fe9f80de 100644 --- a/internal/debug/flags.go +++ b/internal/debug/flags.go @@ -24,9 +24,9 @@ import ( "os" "runtime" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/metrics/exp" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/metrics/exp" "github.com/fjl/memsize/memsizeui" colorable "github.com/mattn/go-colorable" "github.com/mattn/go-isatty" diff --git a/internal/debug/trace.go b/internal/debug/trace.go index 9024a2cc9cea..cab5deaafd6c 100644 --- a/internal/debug/trace.go +++ b/internal/debug/trace.go @@ -23,7 +23,7 @@ import ( "os" "runtime/trace" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // StartGoTrace turns on tracing, writing to the given file. diff --git a/internal/ethapi/addrlock.go b/internal/ethapi/addrlock.go index 64dd221bee8b..61ddff688ccc 100644 --- a/internal/ethapi/addrlock.go +++ b/internal/ethapi/addrlock.go @@ -19,7 +19,7 @@ package ethapi import ( "sync" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) type AddrLocker struct { diff --git a/internal/ethapi/api.go b/internal/ethapi/api.go index 9e1af145e3e7..2b299d38596a 100644 --- a/internal/ethapi/api.go +++ b/internal/ethapi/api.go @@ -26,24 +26,25 @@ import ( "time" "github.com/davecgh/go-spew/spew" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/rpc" - "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/util" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/accounts/scwallet" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus/clique" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" + "github.com/tyler-smith/go-bip39" ) const ( @@ -190,13 +191,7 @@ func NewPublicAccountAPI(am *accounts.Manager) *PublicAccountAPI { // Accounts returns the collection of accounts this node manages func (s *PublicAccountAPI) Accounts() []common.Address { - addresses := make([]common.Address, 0) // return [] instead of nil if empty - for _, wallet := range s.am.Wallets() { - for _, account := range wallet.Accounts() { - addresses = append(addresses, account.Address) - } - } - return addresses + return s.am.Accounts() } // PrivateAccountAPI provides an API to access accounts managed by this node. @@ -217,15 +212,9 @@ func NewPrivateAccountAPI(b Backend, nonceLock *AddrLocker) *PrivateAccountAPI { } } -// ListAccounts will return a list of addresses for accounts this node manages. +// listAccounts will return a list of addresses for accounts this node manages. func (s *PrivateAccountAPI) ListAccounts() []common.Address { - addresses := make([]common.Address, 0) // return [] instead of nil if empty - for _, wallet := range s.am.Wallets() { - for _, account := range wallet.Accounts() { - addresses = append(addresses, account.Address) - } - } - return addresses + return s.am.Accounts() } // rawWallet is a JSON representation of an accounts.Wallet interface, with its @@ -293,6 +282,9 @@ func (s *PrivateAccountAPI) DeriveAccount(url string, path string, pin *bool) (a func (s *PrivateAccountAPI) NewAccount(password string) (common.Address, error) { acc, err := fetchKeystore(s.am).NewAccount(password) if err == nil { + log.Info("Your new key was generated", "address", acc.Address) + log.Warn("Please backup your key file!", "path", acc.URL.Path) + log.Warn("Please remember your password!") return acc.Address, nil } return common.Address{}, err @@ -317,7 +309,14 @@ func (s *PrivateAccountAPI) ImportRawKey(privkey string, password string) (commo // UnlockAccount will unlock the account associated with the given address with // the given password for duration seconds. If duration is nil it will use a // default of 300 seconds. It returns an indication if the account was unlocked. -func (s *PrivateAccountAPI) UnlockAccount(addr common.Address, password string, duration *uint64) (bool, error) { +func (s *PrivateAccountAPI) UnlockAccount(ctx context.Context, addr common.Address, password string, duration *uint64) (bool, error) { + // When the API is exposed by external RPC(http, ws etc), unless the user + // explicitly specifies to allow the insecure account unlocking, otherwise + // it is disabled. + if s.b.ExtRPCEnabled() && !s.b.AccountManager().Config().InsecureUnlockAllowed { + return false, errors.New("account unlock with HTTP access is forbidden") + } + const max = uint64(time.Duration(math.MaxInt64) / time.Second) var d time.Duration if duration == nil { @@ -356,11 +355,7 @@ func (s *PrivateAccountAPI) signTransaction(ctx context.Context, args *SendTxArg // Assemble the transaction and sign with the wallet tx := args.toTransaction() - var chainID *big.Int - if config := s.b.ChainConfig(); config.IsEIP155(s.b.CurrentBlock().Number()) { - chainID = config.ChainID - } - return wallet.SignTxWithPassphrase(account, passwd, tx, chainID) + return wallet.SignTxWithPassphrase(account, passwd, tx, s.b.ChainConfig().ChainID) } // SendTransaction will create a transaction from the given arguments and @@ -378,7 +373,7 @@ func (s *PrivateAccountAPI) SendTransaction(ctx context.Context, args SendTxArgs log.Warn("Failed transaction send attempt", "from", args.From, "to", args.To, "value", args.Value.ToInt(), "err", err) return common.Hash{}, err } - return submitTransaction(ctx, s.b, signed) + return SubmitTransaction(ctx, s.b, signed) } // SignTransaction will create a transaction from the given arguments and @@ -409,18 +404,6 @@ func (s *PrivateAccountAPI) SignTransaction(ctx context.Context, args SendTxArgs return &SignTransactionResult{data, signed}, nil } -// signHash is a helper function that calculates a hash for the given message that can be -// safely used to calculate a signature from. -// -// The hash is calulcated as -// keccak256("\x19Ethereum Signed Message:\n"${message length}${message}). -// -// This gives context to the signed message and prevents signing of transactions. -func signHash(data []byte) []byte { - msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), data) - return crypto.Keccak256([]byte(msg)) -} - // Sign calculates an Ethereum ECDSA signature for: // keccack256("\x19Ethereum Signed Message:\n" + len(message) + message)) // @@ -439,12 +422,12 @@ func (s *PrivateAccountAPI) Sign(ctx context.Context, data hexutil.Bytes, addr c return nil, err } // Assemble sign the data with the wallet - signature, err := wallet.SignHashWithPassphrase(account, passwd, signHash(data)) + signature, err := wallet.SignTextWithPassphrase(account, passwd, data) if err != nil { log.Warn("Failed data sign attempt", "address", addr, "err", err) return nil, err } - signature[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper + signature[crypto.RecoveryIDOffset] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper return signature, nil } @@ -459,15 +442,15 @@ func (s *PrivateAccountAPI) Sign(ctx context.Context, data hexutil.Bytes, addr c // // https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_ecRecover func (s *PrivateAccountAPI) EcRecover(ctx context.Context, data, sig hexutil.Bytes) (common.Address, error) { - if len(sig) != 65 { - return common.Address{}, fmt.Errorf("signature must be 65 bytes long") + if len(sig) != crypto.SignatureLength { + return common.Address{}, fmt.Errorf("signature must be %d bytes long", crypto.SignatureLength) } - if sig[64] != 27 && sig[64] != 28 { + if sig[crypto.RecoveryIDOffset] != 27 && sig[crypto.RecoveryIDOffset] != 28 { return common.Address{}, fmt.Errorf("invalid Ethereum signature (V is not 27 or 28)") } - sig[64] -= 27 // Transform yellow paper V from 27/28 to 0/1 + sig[crypto.RecoveryIDOffset] -= 27 // Transform yellow paper V from 27/28 to 0/1 - rpk, err := crypto.SigToPub(signHash(data), sig) + rpk, err := crypto.SigToPub(accounts.TextHash(data), sig) if err != nil { return common.Address{}, err } @@ -480,6 +463,48 @@ func (s *PrivateAccountAPI) SignAndSendTransaction(ctx context.Context, args Sen return s.SendTransaction(ctx, args, passwd) } +// InitializeWallet initializes a new wallet at the provided URL, by generating and returning a new private key. +func (s *PrivateAccountAPI) InitializeWallet(ctx context.Context, url string) (string, error) { + wallet, err := s.am.Wallet(url) + if err != nil { + return "", err + } + + entropy, err := bip39.NewEntropy(256) + if err != nil { + return "", err + } + + mnemonic, err := bip39.NewMnemonic(entropy) + if err != nil { + return "", err + } + + seed := bip39.NewSeed(mnemonic, "") + + switch wallet := wallet.(type) { + case *scwallet.Wallet: + return mnemonic, wallet.Initialize(seed) + default: + return "", fmt.Errorf("specified wallet does not support initialization") + } +} + +// Unpair deletes a pairing between wallet and geth. +func (s *PrivateAccountAPI) Unpair(ctx context.Context, url string, pin string) error { + wallet, err := s.am.Wallet(url) + if err != nil { + return err + } + + switch wallet := wallet.(type) { + case *scwallet.Wallet: + return wallet.Unpair([]byte(pin)) + default: + return fmt.Errorf("specified wallet does not support pairing") + } +} + // PublicBlockChainAPI provides an API to access the Ethereum blockchain. // It offers only methods that operate on public data that is freely available to anyone. type PublicBlockChainAPI struct { @@ -491,6 +516,11 @@ func NewPublicBlockChainAPI(b Backend) *PublicBlockChainAPI { return &PublicBlockChainAPI{b} } +// ChainId returns the chainID value for transaction replay protection. +func (s *PublicBlockChainAPI) ChainId() *hexutil.Big { + return (*hexutil.Big)(s.b.ChainConfig().ChainID) +} + // BlockNumber returns the block number of the chain head. func (s *PublicBlockChainAPI) BlockNumber() hexutil.Uint64 { header, _ := s.b.HeaderByNumber(context.Background(), rpc.LatestBlockNumber) // latest header should always be available @@ -500,8 +530,8 @@ func (s *PublicBlockChainAPI) BlockNumber() hexutil.Uint64 { // GetBalance returns the amount of wei for the given address in the state of the // given block number. The rpc.LatestBlockNumber and rpc.PendingBlockNumber meta // block numbers are also allowed. -func (s *PublicBlockChainAPI) GetBalance(ctx context.Context, address common.Address, blockNr rpc.BlockNumber) (*hexutil.Big, error) { - state, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr) +func (s *PublicBlockChainAPI) GetBalance(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (*hexutil.Big, error) { + state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) if state == nil || err != nil { return nil, err } @@ -525,8 +555,8 @@ type StorageResult struct { } // GetProof returns the Merkle-proof for a given account and optionally some storage keys. -func (s *PublicBlockChainAPI) GetProof(ctx context.Context, address common.Address, storageKeys []string, blockNr rpc.BlockNumber) (*AccountResult, error) { - state, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr) +func (s *PublicBlockChainAPI) GetProof(ctx context.Context, address common.Address, storageKeys []string, blockNrOrHash rpc.BlockNumberOrHash) (*AccountResult, error) { + state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) if state == nil || err != nil { return nil, err } @@ -574,13 +604,43 @@ func (s *PublicBlockChainAPI) GetProof(ctx context.Context, address common.Addre }, state.Error() } -// GetBlockByNumber returns the requested block. When blockNr is -1 the chain head is returned. When fullTx is true all -// transactions in the block are returned in full detail, otherwise only the transaction hash is returned. -func (s *PublicBlockChainAPI) GetBlockByNumber(ctx context.Context, blockNr rpc.BlockNumber, fullTx bool) (map[string]interface{}, error) { - block, err := s.b.BlockByNumber(ctx, blockNr) - if block != nil { - response, err := s.rpcOutputBlock(block, true, fullTx) - if err == nil && blockNr == rpc.PendingBlockNumber { +// GetHeaderByNumber returns the requested canonical block header. +// * When blockNr is -1 the chain head is returned. +// * When blockNr is -2 the pending chain head is returned. +func (s *PublicBlockChainAPI) GetHeaderByNumber(ctx context.Context, number rpc.BlockNumber) (map[string]interface{}, error) { + header, err := s.b.HeaderByNumber(ctx, number) + if header != nil && err == nil { + response := s.rpcMarshalHeader(header) + if number == rpc.PendingBlockNumber { + // Pending header need to nil out a few fields + for _, field := range []string{"hash", "nonce", "miner"} { + response[field] = nil + } + } + return response, err + } + return nil, err +} + +// GetHeaderByHash returns the requested header by hash. +func (s *PublicBlockChainAPI) GetHeaderByHash(ctx context.Context, hash common.Hash) map[string]interface{} { + header, _ := s.b.HeaderByHash(ctx, hash) + if header != nil { + return s.rpcMarshalHeader(header) + } + return nil +} + +// GetBlockByNumber returns the requested canonical block. +// * When blockNr is -1 the chain head is returned. +// * When blockNr is -2 the pending chain head is returned. +// * When fullTx is true all transactions in the block are returned, otherwise +// only the transaction hash is returned. +func (s *PublicBlockChainAPI) GetBlockByNumber(ctx context.Context, number rpc.BlockNumber, fullTx bool) (map[string]interface{}, error) { + block, err := s.b.BlockByNumber(ctx, number) + if block != nil && err == nil { + response, err := s.rpcMarshalBlock(block, true, fullTx) + if err == nil && number == rpc.PendingBlockNumber { // Pending blocks need to nil out a few fields for _, field := range []string{"hash", "nonce", "miner"} { response[field] = nil @@ -593,10 +653,10 @@ func (s *PublicBlockChainAPI) GetBlockByNumber(ctx context.Context, blockNr rpc. // GetBlockByHash returns the requested block. When fullTx is true all transactions in the block are returned in full // detail, otherwise only the transaction hash is returned. -func (s *PublicBlockChainAPI) GetBlockByHash(ctx context.Context, blockHash common.Hash, fullTx bool) (map[string]interface{}, error) { - block, err := s.b.GetBlock(ctx, blockHash) +func (s *PublicBlockChainAPI) GetBlockByHash(ctx context.Context, hash common.Hash, fullTx bool) (map[string]interface{}, error) { + block, err := s.b.BlockByHash(ctx, hash) if block != nil { - return s.rpcOutputBlock(block, true, fullTx) + return s.rpcMarshalBlock(block, true, fullTx) } return nil, err } @@ -612,7 +672,7 @@ func (s *PublicBlockChainAPI) GetUncleByBlockNumberAndIndex(ctx context.Context, return nil, nil } block = types.NewBlockWithHeader(uncles[index]) - return s.rpcOutputBlock(block, false, false) + return s.rpcMarshalBlock(block, false, false) } return nil, err } @@ -620,7 +680,7 @@ func (s *PublicBlockChainAPI) GetUncleByBlockNumberAndIndex(ctx context.Context, // GetUncleByBlockHashAndIndex returns the uncle block for the given block hash and index. When fullTx is true // all transactions in the block are returned in full detail, otherwise only the transaction hash is returned. func (s *PublicBlockChainAPI) GetUncleByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) (map[string]interface{}, error) { - block, err := s.b.GetBlock(ctx, blockHash) + block, err := s.b.BlockByHash(ctx, blockHash) if block != nil { uncles := block.Uncles() if index >= hexutil.Uint(len(uncles)) { @@ -628,7 +688,7 @@ func (s *PublicBlockChainAPI) GetUncleByBlockHashAndIndex(ctx context.Context, b return nil, nil } block = types.NewBlockWithHeader(uncles[index]) - return s.rpcOutputBlock(block, false, false) + return s.rpcMarshalBlock(block, false, false) } return nil, err } @@ -644,7 +704,7 @@ func (s *PublicBlockChainAPI) GetUncleCountByBlockNumber(ctx context.Context, bl // GetUncleCountByBlockHash returns number of uncles in the block for the given block hash func (s *PublicBlockChainAPI) GetUncleCountByBlockHash(ctx context.Context, blockHash common.Hash) *hexutil.Uint { - if block, _ := s.b.GetBlock(ctx, blockHash); block != nil { + if block, _ := s.b.BlockByHash(ctx, blockHash); block != nil { n := hexutil.Uint(len(block.Uncles())) return &n } @@ -652,8 +712,8 @@ func (s *PublicBlockChainAPI) GetUncleCountByBlockHash(ctx context.Context, bloc } // GetCode returns the code stored at the given address in the state for the given block number. -func (s *PublicBlockChainAPI) GetCode(ctx context.Context, address common.Address, blockNr rpc.BlockNumber) (hexutil.Bytes, error) { - state, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr) +func (s *PublicBlockChainAPI) GetCode(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (hexutil.Bytes, error) { + state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) if state == nil || err != nil { return nil, err } @@ -664,8 +724,8 @@ func (s *PublicBlockChainAPI) GetCode(ctx context.Context, address common.Addres // GetStorageAt returns the storage from the state at the given address, key and // block number. The rpc.LatestBlockNumber and rpc.PendingBlockNumber meta block // numbers are also allowed. -func (s *PublicBlockChainAPI) GetStorageAt(ctx context.Context, address common.Address, key string, blockNr rpc.BlockNumber) (hexutil.Bytes, error) { - state, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr) +func (s *PublicBlockChainAPI) GetStorageAt(ctx context.Context, address common.Address, key string, blockNrOrHash rpc.BlockNumberOrHash) (hexutil.Bytes, error) { + state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) if state == nil || err != nil { return nil, err } @@ -675,41 +735,100 @@ func (s *PublicBlockChainAPI) GetStorageAt(ctx context.Context, address common.A // CallArgs represents the arguments for a call. type CallArgs struct { - From common.Address `json:"from"` + From *common.Address `json:"from"` To *common.Address `json:"to"` - Gas hexutil.Uint64 `json:"gas"` - GasPrice hexutil.Big `json:"gasPrice"` - Value hexutil.Big `json:"value"` - Data hexutil.Bytes `json:"data"` + Gas *hexutil.Uint64 `json:"gas"` + GasPrice *hexutil.Big `json:"gasPrice"` + Value *hexutil.Big `json:"value"` + Data *hexutil.Bytes `json:"data"` } -func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr rpc.BlockNumber, timeout time.Duration) ([]byte, uint64, bool, error) { +// account indicates the overriding fields of account during the execution of +// a message call. +// Note, state and stateDiff can't be specified at the same time. If state is +// set, message execution will only use the data in the given state. Otherwise +// if statDiff is set, all diff will be applied first and then execute the call +// message. +type account struct { + Nonce *hexutil.Uint64 `json:"nonce"` + Code *hexutil.Bytes `json:"code"` + Balance **hexutil.Big `json:"balance"` + State *map[common.Hash]common.Hash `json:"state"` + StateDiff *map[common.Hash]common.Hash `json:"stateDiff"` +} + +func DoCall(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.BlockNumberOrHash, overrides map[common.Address]account, vmCfg vm.Config, timeout time.Duration, globalGasCap *big.Int) ([]byte, uint64, 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) + state, header, err := b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) if state == nil || err != nil { return nil, 0, false, err } // Set sender address or use a default if none specified - addr := args.From - if addr == (common.Address{}) { - if wallets := s.b.AccountManager().Wallets(); len(wallets) > 0 { + var addr common.Address + if args.From == nil { + if wallets := b.AccountManager().Wallets(); len(wallets) > 0 { if accounts := wallets[0].Accounts(); len(accounts) > 0 { addr = accounts[0].Address } } + } else { + addr = *args.From + } + // Override the fields of specified contracts before execution. + for addr, account := range overrides { + // Override account nonce. + if account.Nonce != nil { + state.SetNonce(addr, uint64(*account.Nonce)) + } + // Override account(contract) code. + if account.Code != nil { + state.SetCode(addr, *account.Code) + } + // Override account balance. + if account.Balance != nil { + state.SetBalance(addr, (*big.Int)(*account.Balance)) + } + if account.State != nil && account.StateDiff != nil { + return nil, 0, false, fmt.Errorf("account %s has both 'state' and 'stateDiff'", addr.Hex()) + } + // Replace entire state if caller requires. + if account.State != nil { + state.SetStorage(addr, *account.State) + } + // Apply state diff into specified accounts. + if account.StateDiff != nil { + for key, value := range *account.StateDiff { + state.SetState(addr, key, value) + } + } } // Set default gas & gas price if none were set - gas, gasPrice := uint64(args.Gas), args.GasPrice.ToInt() - if gas == 0 { - gas = math.MaxUint64 / 2 + gas := uint64(math.MaxUint64 / 2) + if args.Gas != nil { + gas = uint64(*args.Gas) + } + if globalGasCap != nil && globalGasCap.Uint64() < gas { + log.Warn("Caller gas above allowance, capping", "requested", gas, "cap", globalGasCap) + gas = globalGasCap.Uint64() } - if gasPrice.Sign() == 0 { - gasPrice = new(big.Int).SetUint64(defaultGasPrice) + gasPrice := new(big.Int).SetUint64(defaultGasPrice) + if args.GasPrice != nil { + gasPrice = args.GasPrice.ToInt() + } + + value := new(big.Int) + if args.Value != nil { + value = args.Value.ToInt() + } + + var data []byte + if args.Data != nil { + data = []byte(*args.Data) } // Create new call message - msg := types.NewMessage(addr, args.To, 0, args.Value.ToInt(), gas, gasPrice, args.Data, false) + msg := types.NewMessage(addr, args.To, 0, value, gas, gasPrice, data, false) // Setup context so it may be cancelled the call has completed // or, in case of unmetered gas, setup a context with a timeout. @@ -724,7 +843,7 @@ func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr defer cancel() // Get a new instance of the EVM. - evm, vmError, err := s.b.GetEVM(ctx, msg, state, header) + evm, vmError, err := b.GetEVM(ctx, msg, state, header) if err != nil { return nil, 0, false, err } @@ -742,42 +861,68 @@ func (s *PublicBlockChainAPI) doCall(ctx context.Context, args CallArgs, blockNr if err := vmError(); err != nil { return nil, 0, false, err } + // If the timer caused an abort, return an appropriate error message + if evm.Cancelled() { + return nil, 0, false, fmt.Errorf("execution aborted (timeout = %v)", timeout) + } 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, 5*time.Second) +// +// Additionally, the caller can specify a batch of contract for fields overriding. +// +// Note, this function 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, blockNrOrHash rpc.BlockNumberOrHash, overrides *map[common.Address]account) (hexutil.Bytes, error) { + var accounts map[common.Address]account + if overrides != nil { + accounts = *overrides + } + result, _, _, err := DoCall(ctx, s.b, args, blockNrOrHash, accounts, vm.Config{}, 5*time.Second, s.b.RPCGasCap()) return (hexutil.Bytes)(result), err } -// 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.Uint64, error) { +func DoEstimateGas(ctx context.Context, b Backend, args CallArgs, blockNrOrHash rpc.BlockNumberOrHash, gasCap *big.Int) (hexutil.Uint64, error) { // Binary search the gas requirement, as it may be higher than the amount used var ( lo uint64 = params.TxGas - 1 hi uint64 cap uint64 ) - if uint64(args.Gas) >= params.TxGas { - hi = uint64(args.Gas) + if args.Gas != nil && uint64(*args.Gas) >= params.TxGas { + hi = uint64(*args.Gas) } else { - // Retrieve the current pending block to act as the gas ceiling - block, err := s.b.BlockByNumber(ctx, rpc.PendingBlockNumber) + // Retrieve the block to act as the gas ceiling + block, err := b.BlockByNumberOrHash(ctx, blockNrOrHash) if err != nil { return 0, err } hi = block.GasLimit() } + if gasCap != nil && hi > gasCap.Uint64() { + log.Warn("Caller gas above allowance, capping", "requested", hi, "cap", gasCap) + hi = gasCap.Uint64() + } cap = hi + // Set sender address or use a default if none specified + if args.From == nil { + if wallets := b.AccountManager().Wallets(); len(wallets) > 0 { + if accounts := wallets[0].Accounts(); len(accounts) > 0 { + args.From = &accounts[0].Address + } + } + } + // Use zero-address if none other is available + if args.From == nil { + args.From = &common.Address{} + } // Create a helper to check if a gas allowance results in an executable transaction executable := func(gas uint64) bool { - args.Gas = hexutil.Uint64(gas) + args.Gas = (*hexutil.Uint64)(&gas) - _, _, failed, err := s.doCall(ctx, args, rpc.PendingBlockNumber, 0) + _, _, failed, err := DoCall(ctx, b, args, blockNrOrHash, nil, vm.Config{}, 0, gasCap) if err != nil || failed { return false } @@ -795,12 +940,19 @@ func (s *PublicBlockChainAPI) EstimateGas(ctx context.Context, args CallArgs) (h // Reject the transaction as invalid if it still fails at the highest allowance if hi == cap { if !executable(hi) { - return 0, fmt.Errorf("gas required exceeds allowance or always failing transaction") + return 0, fmt.Errorf("gas required exceeds allowance (%d) or always failing transaction", cap) } } return hexutil.Uint64(hi), nil } +// 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.Uint64, error) { + blockNrOrHash := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber) + return DoEstimateGas(ctx, s.b, args, blockNrOrHash, s.b.RPCGasCap()) +} + // ExecutionResult groups all structured logs emitted by the EVM // while replaying a transaction in debug mode as well as transaction // execution status, the amount of gas used and the return value @@ -825,7 +977,7 @@ type StructLogRes struct { Storage *map[string]string `json:"storage,omitempty"` } -// formatLogs formats EVM returned structured logs for json output +// FormatLogs formats EVM returned structured logs for json output func FormatLogs(logs []vm.StructLog) []StructLogRes { formatted := make([]StructLogRes, len(logs)) for index, trace := range logs { @@ -862,14 +1014,11 @@ func FormatLogs(logs []vm.StructLog) []StructLogRes { return formatted } -// RPCMarshalBlock converts the given block to the RPC output which depends on fullTx. If inclTx is true transactions are -// returned. When fullTx is true the returned block contains full transaction details, otherwise it will only contain -// transaction hashes. -func RPCMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]interface{}, error) { - head := b.Header() // copies the header once - fields := map[string]interface{}{ +// RPCMarshalHeader converts the given header to the RPC output . +func RPCMarshalHeader(head *types.Header) map[string]interface{} { + return map[string]interface{}{ "number": (*hexutil.Big)(head.Number), - "hash": b.Hash(), + "hash": head.Hash(), "parentHash": head.ParentHash, "nonce": head.Nonce, "mixHash": head.MixDigest, @@ -879,13 +1028,21 @@ func RPCMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]inter "miner": head.Coinbase, "difficulty": (*hexutil.Big)(head.Difficulty), "extraData": hexutil.Bytes(head.Extra), - "size": hexutil.Uint64(b.Size()), + "size": hexutil.Uint64(head.Size()), "gasLimit": hexutil.Uint64(head.GasLimit), "gasUsed": hexutil.Uint64(head.GasUsed), - "timestamp": (*hexutil.Big)(head.Time), + "timestamp": hexutil.Uint64(head.Time), "transactionsRoot": head.TxHash, "receiptsRoot": head.ReceiptHash, } +} + +// RPCMarshalBlock converts the given block to the RPC output which depends on fullTx. If inclTx is true transactions are +// returned. When fullTx is true the returned block contains full transaction details, otherwise it will only contain +// transaction hashes. +func RPCMarshalBlock(block *types.Block, inclTx bool, fullTx bool) (map[string]interface{}, error) { + fields := RPCMarshalHeader(block.Header()) + fields["size"] = hexutil.Uint64(block.Size()) if inclTx { formatTx := func(tx *types.Transaction) (interface{}, error) { @@ -893,10 +1050,10 @@ func RPCMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]inter } if fullTx { formatTx = func(tx *types.Transaction) (interface{}, error) { - return newRPCTransactionFromBlockHash(b, tx.Hash()), nil + return newRPCTransactionFromBlockHash(block, tx.Hash()), nil } } - txs := b.Transactions() + txs := block.Transactions() transactions := make([]interface{}, len(txs)) var err error for i, tx := range txs { @@ -906,8 +1063,7 @@ func RPCMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]inter } fields["transactions"] = transactions } - - uncles := b.Uncles() + uncles := block.Uncles() uncleHashes := make([]common.Hash, len(uncles)) for i, uncle := range uncles { uncleHashes[i] = uncle.Hash() @@ -917,9 +1073,17 @@ func RPCMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]inter return fields, nil } -// rpcOutputBlock uses the generalized output filler, then adds the total difficulty field, which requires +// rpcMarshalHeader uses the generalized output filler, then adds the total difficulty field, which requires +// a `PublicBlockchainAPI`. +func (s *PublicBlockChainAPI) rpcMarshalHeader(header *types.Header) map[string]interface{} { + fields := RPCMarshalHeader(header) + fields["totalDifficulty"] = (*hexutil.Big)(s.b.GetTd(header.Hash())) + return fields +} + +// rpcMarshalBlock uses the generalized output filler, then adds the total difficulty field, which requires // a `PublicBlockchainAPI`. -func (s *PublicBlockChainAPI) rpcOutputBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]interface{}, error) { +func (s *PublicBlockChainAPI) rpcMarshalBlock(b *types.Block, inclTx bool, fullTx bool) (map[string]interface{}, error) { fields, err := RPCMarshalBlock(b, inclTx, fullTx) if err != nil { return nil, err @@ -930,7 +1094,7 @@ func (s *PublicBlockChainAPI) rpcOutputBlock(b *types.Block, inclTx bool, fullTx // RPCTransaction represents a transaction that will serialize to the RPC representation of a transaction type RPCTransaction struct { - BlockHash common.Hash `json:"blockHash"` + BlockHash *common.Hash `json:"blockHash"` BlockNumber *hexutil.Big `json:"blockNumber"` From common.Address `json:"from"` Gas hexutil.Uint64 `json:"gas"` @@ -939,7 +1103,7 @@ type RPCTransaction struct { Input hexutil.Bytes `json:"input"` Nonce hexutil.Uint64 `json:"nonce"` To *common.Address `json:"to"` - TransactionIndex hexutil.Uint `json:"transactionIndex"` + TransactionIndex *hexutil.Uint64 `json:"transactionIndex"` Value *hexutil.Big `json:"value"` V *hexutil.Big `json:"v"` R *hexutil.Big `json:"r"` @@ -970,9 +1134,9 @@ func newRPCTransaction(tx *types.Transaction, blockHash common.Hash, blockNumber S: (*hexutil.Big)(s), } if blockHash != (common.Hash{}) { - result.BlockHash = blockHash + result.BlockHash = &blockHash result.BlockNumber = (*hexutil.Big)(new(big.Int).SetUint64(blockNumber)) - result.TransactionIndex = hexutil.Uint(index) + result.TransactionIndex = (*hexutil.Uint64)(&index) } return result } @@ -1033,7 +1197,7 @@ func (s *PublicTransactionPoolAPI) GetBlockTransactionCountByNumber(ctx context. // GetBlockTransactionCountByHash returns the number of transactions in the block with the given hash. func (s *PublicTransactionPoolAPI) GetBlockTransactionCountByHash(ctx context.Context, blockHash common.Hash) *hexutil.Uint { - if block, _ := s.b.GetBlock(ctx, blockHash); block != nil { + if block, _ := s.b.BlockByHash(ctx, blockHash); block != nil { n := hexutil.Uint(len(block.Transactions())) return &n } @@ -1050,7 +1214,7 @@ func (s *PublicTransactionPoolAPI) GetTransactionByBlockNumberAndIndex(ctx conte // GetTransactionByBlockHashAndIndex returns the transaction for the given block hash and index. func (s *PublicTransactionPoolAPI) GetTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) *RPCTransaction { - if block, _ := s.b.GetBlock(ctx, blockHash); block != nil { + if block, _ := s.b.BlockByHash(ctx, blockHash); block != nil { return newRPCTransactionFromBlockIndex(block, uint64(index)) } return nil @@ -1066,16 +1230,16 @@ func (s *PublicTransactionPoolAPI) GetRawTransactionByBlockNumberAndIndex(ctx co // GetRawTransactionByBlockHashAndIndex returns the bytes of the transaction for the given block hash and index. func (s *PublicTransactionPoolAPI) GetRawTransactionByBlockHashAndIndex(ctx context.Context, blockHash common.Hash, index hexutil.Uint) hexutil.Bytes { - if block, _ := s.b.GetBlock(ctx, blockHash); block != nil { + if block, _ := s.b.BlockByHash(ctx, blockHash); block != nil { return newRPCRawTransactionFromBlockIndex(block, uint64(index)) } return nil } // GetTransactionCount returns the number of transactions the given address has sent for the given block number -func (s *PublicTransactionPoolAPI) GetTransactionCount(ctx context.Context, address common.Address, blockNr rpc.BlockNumber) (*hexutil.Uint64, error) { +func (s *PublicTransactionPoolAPI) GetTransactionCount(ctx context.Context, address common.Address, blockNrOrHash rpc.BlockNumberOrHash) (*hexutil.Uint64, error) { // Ask transaction pool for the nonce which includes pending transactions - if blockNr == rpc.PendingBlockNumber { + if blockNr, ok := blockNrOrHash.Number(); ok && blockNr == rpc.PendingBlockNumber { nonce, err := s.b.GetPoolNonce(ctx, address) if err != nil { return nil, err @@ -1083,7 +1247,7 @@ func (s *PublicTransactionPoolAPI) GetTransactionCount(ctx context.Context, addr return (*hexutil.Uint64)(&nonce), nil } // Resolve block number and use its state to ask for the nonce - state, _, err := s.b.StateAndHeaderByNumber(ctx, blockNr) + state, _, err := s.b.StateAndHeaderByNumberOrHash(ctx, blockNrOrHash) if state == nil || err != nil { return nil, err } @@ -1092,25 +1256,32 @@ func (s *PublicTransactionPoolAPI) GetTransactionCount(ctx context.Context, addr } // GetTransactionByHash returns the transaction for the given hash -func (s *PublicTransactionPoolAPI) GetTransactionByHash(ctx context.Context, hash common.Hash) *RPCTransaction { +func (s *PublicTransactionPoolAPI) GetTransactionByHash(ctx context.Context, hash common.Hash) (*RPCTransaction, error) { // Try to return an already finalized transaction - if tx, blockHash, blockNumber, index := rawdb.ReadTransaction(s.b.ChainDb(), hash); tx != nil { - return newRPCTransaction(tx, blockHash, blockNumber, index) + tx, blockHash, blockNumber, index, err := s.b.GetTransaction(ctx, hash) + if err != nil { + return nil, err + } + if tx != nil { + return newRPCTransaction(tx, blockHash, blockNumber, index), nil } // No finalized transaction, try to retrieve it from the pool if tx := s.b.GetPoolTransaction(hash); tx != nil { - return newRPCPendingTransaction(tx) + return newRPCPendingTransaction(tx), nil } + // Transaction unknown, return as such - return nil + return nil, nil } // GetRawTransactionByHash returns the bytes of the transaction for the given hash. func (s *PublicTransactionPoolAPI) GetRawTransactionByHash(ctx context.Context, hash common.Hash) (hexutil.Bytes, error) { - var tx *types.Transaction - // Retrieve a finalized transaction, or a pooled otherwise - if tx, _, _, _ = rawdb.ReadTransaction(s.b.ChainDb(), hash); tx == nil { + tx, _, _, _, err := s.b.GetTransaction(ctx, hash) + if err != nil { + return nil, err + } + if tx == nil { if tx = s.b.GetPoolTransaction(hash); tx == nil { // Transaction not found anywhere, abort return nil, nil @@ -1181,11 +1352,7 @@ func (s *PublicTransactionPoolAPI) sign(addr common.Address, tx *types.Transacti return nil, err } // Request the wallet to sign the transaction - var chainID *big.Int - if config := s.b.ChainConfig(); config.IsEIP155(s.b.CurrentBlock().Number()) { - chainID = config.ChainID - } - return wallet.SignTx(account, tx, chainID) + return wallet.SignTx(account, tx, s.b.ChainConfig().ChainID) } // SendTxArgs represents the arguments to sumbit a new transaction into the transaction pool. @@ -1204,10 +1371,6 @@ type SendTxArgs struct { // setDefaults is a helper function that fills in default values for unspecified tx fields. func (args *SendTxArgs) setDefaults(ctx context.Context, b Backend) error { - if args.Gas == nil { - args.Gas = new(hexutil.Uint64) - *(*uint64)(args.Gas) = 90000 - } if args.GasPrice == nil { price, err := b.SuggestPrice(ctx) if err != nil { @@ -1226,7 +1389,7 @@ func (args *SendTxArgs) setDefaults(ctx context.Context, b Backend) error { args.Nonce = (*hexutil.Uint64)(&nonce) } if args.Data != nil && args.Input != nil && !bytes.Equal(*args.Data, *args.Input) { - return errors.New(`Both "data" and "input" are set and not equal. Please use "input" to pass transaction call data.`) + return errors.New(`both "data" and "input" are set and not equal. Please use "input" to pass transaction call data`) } if args.To == nil { // Contract creation @@ -1240,15 +1403,38 @@ func (args *SendTxArgs) setDefaults(ctx context.Context, b Backend) error { return errors.New(`contract creation without any data provided`) } } + // Estimate the gas usage if necessary. + if args.Gas == nil { + // For backwards-compatibility reason, we try both input and data + // but input is preferred. + input := args.Input + if input == nil { + input = args.Data + } + callArgs := CallArgs{ + From: &args.From, // From shouldn't be nil + To: args.To, + GasPrice: args.GasPrice, + Value: args.Value, + Data: input, + } + pendingBlockNr := rpc.BlockNumberOrHashWithNumber(rpc.PendingBlockNumber) + estimated, err := DoEstimateGas(ctx, b, callArgs, pendingBlockNr, b.RPCGasCap()) + if err != nil { + return err + } + args.Gas = &estimated + log.Trace("Estimate gas usage automatically", "gas", args.Gas) + } return nil } func (args *SendTxArgs) toTransaction() *types.Transaction { var input []byte - if args.Data != nil { - input = *args.Data - } else if args.Input != nil { + if args.Input != nil { input = *args.Input + } else if args.Data != nil { + input = *args.Data } if args.To == nil { return types.NewContractCreation(uint64(*args.Nonce), (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input) @@ -1256,8 +1442,8 @@ func (args *SendTxArgs) toTransaction() *types.Transaction { return types.NewTransaction(uint64(*args.Nonce), *args.To, (*big.Int)(args.Value), uint64(*args.Gas), (*big.Int)(args.GasPrice), input) } -// submitTransaction is a helper function that submits tx to txPool and logs a message. -func submitTransaction(ctx context.Context, b Backend, tx *types.Transaction) (common.Hash, error) { +// SubmitTransaction is a helper function that submits tx to txPool and logs a message. +func SubmitTransaction(ctx context.Context, b Backend, tx *types.Transaction) (common.Hash, error) { if err := b.SendTx(ctx, tx); err != nil { return common.Hash{}, err } @@ -1278,7 +1464,6 @@ func submitTransaction(ctx context.Context, b Backend, tx *types.Transaction) (c // SendTransaction creates a transaction for the given argument, sign it and submit it to the // transaction pool. func (s *PublicTransactionPoolAPI) SendTransaction(ctx context.Context, args SendTxArgs) (common.Hash, error) { - // Look up the wallet containing the requested signer account := accounts.Account{Address: args.From} @@ -1301,15 +1486,27 @@ func (s *PublicTransactionPoolAPI) SendTransaction(ctx context.Context, args Sen // Assemble the transaction and sign with the wallet tx := args.toTransaction() - var chainID *big.Int - if config := s.b.ChainConfig(); config.IsEIP155(s.b.CurrentBlock().Number()) { - chainID = config.ChainID - } - signed, err := wallet.SignTx(account, tx, chainID) + signed, err := wallet.SignTx(account, tx, s.b.ChainConfig().ChainID) if err != nil { return common.Hash{}, err } - return submitTransaction(ctx, s.b, signed) + return SubmitTransaction(ctx, s.b, signed) +} + +// FillTransaction fills the defaults (nonce, gas, gasPrice) on a given unsigned transaction, +// and returns it to the caller for further processing (signing + broadcast) +func (s *PublicTransactionPoolAPI) FillTransaction(ctx context.Context, args SendTxArgs) (*SignTransactionResult, error) { + // Set some sanity defaults and terminate on failure + if err := args.setDefaults(ctx, s.b); err != nil { + return nil, err + } + // Assemble the transaction and obtain rlp + tx := args.toTransaction() + data, err := rlp.EncodeToBytes(tx) + if err != nil { + return nil, err + } + return &SignTransactionResult{data, tx}, nil } // SendRawTransaction will add the signed transaction to the transaction pool. @@ -1319,7 +1516,7 @@ func (s *PublicTransactionPoolAPI) SendRawTransaction(ctx context.Context, encod if err := rlp.DecodeBytes(encodedTx, tx); err != nil { return common.Hash{}, err } - return submitTransaction(ctx, s.b, tx) + return SubmitTransaction(ctx, s.b, tx) } // Sign calculates an ECDSA signature for: @@ -1340,7 +1537,7 @@ func (s *PublicTransactionPoolAPI) Sign(addr common.Address, data hexutil.Bytes) return nil, err } // Sign the requested hash with the wallet - signature, err := wallet.SignHash(account, signHash(data)) + signature, err := wallet.SignText(account, data) if err == nil { signature[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper } @@ -1448,7 +1645,7 @@ func (s *PublicTransactionPoolAPI) Resend(ctx context.Context, sendArgs SendTxAr } } - return common.Hash{}, fmt.Errorf("Transaction %#x not found", matchTx.Hash()) + return common.Hash{}, fmt.Errorf("transaction %#x not found", matchTx.Hash()) } // PublicDebugAPI is the collection of Ethereum APIs exposed over the public @@ -1476,6 +1673,45 @@ func (api *PublicDebugAPI) GetBlockRlp(ctx context.Context, number uint64) (stri return fmt.Sprintf("%x", encoded), nil } +// TestSignCliqueBlock fetches the given block number, and attempts to sign it as a clique header with the +// given address, returning the address of the recovered signature +// +// This is a temporary method to debug the externalsigner integration, +// TODO: Remove this method when the integration is mature +func (api *PublicDebugAPI) TestSignCliqueBlock(ctx context.Context, address common.Address, number uint64) (common.Address, error) { + block, _ := api.b.BlockByNumber(ctx, rpc.BlockNumber(number)) + if block == nil { + return common.Address{}, fmt.Errorf("block #%d not found", number) + } + header := block.Header() + header.Extra = make([]byte, 32+65) + encoded := clique.CliqueRLP(header) + + // Look up the wallet containing the requested signer + account := accounts.Account{Address: address} + wallet, err := api.b.AccountManager().Find(account) + if err != nil { + return common.Address{}, err + } + + signature, err := wallet.SignData(account, accounts.MimetypeClique, encoded) + if err != nil { + return common.Address{}, err + } + sealHash := clique.SealHash(header).Bytes() + log.Info("test signing of clique block", + "Sealhash", fmt.Sprintf("%x", sealHash), + "signature", fmt.Sprintf("%x", signature)) + pubkey, err := crypto.Ecrecover(sealHash, signature) + if err != nil { + return common.Address{}, err + } + var signer common.Address + copy(signer[:], crypto.Keccak256(pubkey[1:])[12:]) + + return signer, nil +} + // PrintBlock retrieves a block and returns its pretty printed form. func (api *PublicDebugAPI) PrintBlock(ctx context.Context, number uint64) (string, error) { block, _ := api.b.BlockByNumber(ctx, rpc.BlockNumber(number)) @@ -1506,33 +1742,22 @@ func NewPrivateDebugAPI(b Backend) *PrivateDebugAPI { return &PrivateDebugAPI{b: b} } -// ChaindbProperty returns leveldb properties of the chain database. +// ChaindbProperty returns leveldb properties of the key-value database. func (api *PrivateDebugAPI) ChaindbProperty(property string) (string, error) { - ldb, ok := api.b.ChainDb().(interface { - LDB() *leveldb.DB - }) - if !ok { - return "", fmt.Errorf("chaindbProperty does not work for memory databases") - } if property == "" { property = "leveldb.stats" } else if !strings.HasPrefix(property, "leveldb.") { property = "leveldb." + property } - return ldb.LDB().GetProperty(property) + return api.b.ChainDb().Stat(property) } +// ChaindbCompact flattens the entire key-value database into a single level, +// removing all unused slots and merging all keys. func (api *PrivateDebugAPI) ChaindbCompact() error { - ldb, ok := api.b.ChainDb().(interface { - LDB() *leveldb.DB - }) - if !ok { - return fmt.Errorf("chaindbCompact does not work for memory databases") - } for b := byte(0); b < 255; b++ { log.Info("Compacting chain database", "range", fmt.Sprintf("0x%0.2X-0x%0.2X", b, b+1)) - err := ldb.LDB().CompactRange(util.Range{Start: []byte{b}, Limit: []byte{b + 1}}) - if err != nil { + if err := api.b.ChainDb().Compact([]byte{b}, []byte{b + 1}); err != nil { log.Error("Database compaction failed", "err", err) return err } diff --git a/internal/ethapi/backend.go b/internal/ethapi/backend.go index 1968288f477a..73b6c89ceaaf 100644 --- a/internal/ethapi/backend.go +++ b/internal/ethapi/backend.go @@ -21,17 +21,18 @@ import ( "context" "math/big" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" ) // Backend interface provides the common API services (that are provided by @@ -44,22 +45,29 @@ type Backend interface { ChainDb() ethdb.Database EventMux() *event.TypeMux AccountManager() *accounts.Manager + ExtRPCEnabled() bool + RPCGasCap() *big.Int // global gas cap for eth_call over rpc: DoS protection - // BlockChain API + // Blockchain API SetHead(number uint64) - HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) - BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error) - StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*state.StateDB, *types.Header, error) - GetBlock(ctx context.Context, blockHash common.Hash) (*types.Block, error) - GetReceipts(ctx context.Context, blockHash common.Hash) (types.Receipts, error) - GetTd(blockHash common.Hash) *big.Int + HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) + HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) + HeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Header, error) + BlockByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Block, error) + BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) + BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Block, error) + StateAndHeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*state.StateDB, *types.Header, error) + StateAndHeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*state.StateDB, *types.Header, error) + GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) + GetTd(hash common.Hash) *big.Int GetEVM(ctx context.Context, msg core.Message, state *state.StateDB, header *types.Header) (*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 + // Transaction pool API SendTx(ctx context.Context, signedTx *types.Transaction) error + GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) GetPoolTransactions() (types.Transactions, error) GetPoolTransaction(txHash common.Hash) *types.Transaction GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) @@ -67,6 +75,13 @@ type Backend interface { TxPoolContent() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) SubscribeNewTxsEvent(chan<- core.NewTxsEvent) event.Subscription + // Filter API + BloomStatus() (uint64, uint64) + GetLogs(ctx context.Context, blockHash common.Hash) ([][]*types.Log, error) + ServiceFilter(ctx context.Context, session *bloombits.MatcherSession) + SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription + SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription + ChainConfig() *params.ChainConfig CurrentBlock() *types.Block } diff --git a/internal/guide/guide_test.go b/internal/guide/guide_test.go index 7da8b5c28f84..9c7ad16d182d 100644 --- a/internal/guide/guide_test.go +++ b/internal/guide/guide_test.go @@ -30,8 +30,8 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/core/types" ) // Tests that the account management snippets work correctly. diff --git a/internal/jsre/deps/bindata.go b/internal/jsre/deps/bindata.go index 7454c7cfcb1f..a6545b7140d9 100644 --- a/internal/jsre/deps/bindata.go +++ b/internal/jsre/deps/bindata.go @@ -1,8 +1,7 @@ -// Code generated by go-bindata. DO NOT EDIT. +// Package deps Code generated by go-bindata. (@generated) DO NOT EDIT. // sources: // bignumber.js // web3.js - package deps import ( @@ -20,7 +19,7 @@ import ( 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) + return nil, fmt.Errorf("read %q: %v", name, err) } var buf bytes.Buffer @@ -28,7 +27,7 @@ func bindataRead(data []byte, name string) ([]byte, error) { clErr := gz.Close() if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) + return nil, fmt.Errorf("read %q: %v", name, err) } if clErr != nil { return nil, err @@ -49,21 +48,32 @@ type bindataFileInfo struct { modTime time.Time } +// Name return file name func (fi bindataFileInfo) Name() string { return fi.name } + +// Size return file size func (fi bindataFileInfo) Size() int64 { return fi.size } + +// Mode return file mode func (fi bindataFileInfo) Mode() os.FileMode { return fi.mode } + +// ModTime return file modify time func (fi bindataFileInfo) ModTime() time.Time { return fi.modTime } + +// IsDir return file whether a directory func (fi bindataFileInfo) IsDir() bool { - return false + return fi.mode&os.ModeDir != 0 } + +// Sys return file is sys mode func (fi bindataFileInfo) Sys() interface{} { return nil } @@ -161,8 +171,7 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ "bignumber.js": bignumberJs, - - "web3.js": web3Js, + "web3.js": web3Js, } // AssetDir returns the file names below a certain @@ -228,7 +237,11 @@ func RestoreAsset(dir, name string) error { if err != nil { return err } - return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) + 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 diff --git a/internal/jsre/deps/web3.js b/internal/jsre/deps/web3.js index df920bb1d389..07418d05631a 100644 --- a/internal/jsre/deps/web3.js +++ b/internal/jsre/deps/web3.js @@ -2231,7 +2231,7 @@ var toTwosComplement = function (number) { * Checks if the given string is strictly an address * * @method isStrictAddress - * @param {String} address the given HEX adress + * @param {String} address the given HEX address * @return {Boolean} */ var isStrictAddress = function (address) { @@ -2242,7 +2242,7 @@ var isStrictAddress = function (address) { * Checks if the given string is an address * * @method isAddress - * @param {String} address the given HEX adress + * @param {String} address the given HEX address * @return {Boolean} */ var isAddress = function (address) { @@ -2262,7 +2262,7 @@ var isAddress = function (address) { * Checks if the given string is a checksummed address * * @method isChecksumAddress - * @param {String} address the given HEX adress + * @param {String} address the given HEX address * @return {Boolean} */ var isChecksumAddress = function (address) { @@ -2285,7 +2285,7 @@ var isChecksumAddress = function (address) { * Makes a checksum address * * @method toChecksumAddress - * @param {String} address the given HEX adress + * @param {String} address the given HEX address * @return {String} */ var toChecksumAddress = function (address) { @@ -3003,7 +3003,7 @@ var ContractFactory = function (eth, abi) { if (callback) { - // wait for the contract address adn check if the code was deployed + // wait for the contract address and check if the code was deployed this.eth.sendTransaction(options, function (err, hash) { if (err) { callback(err); @@ -6735,7 +6735,7 @@ var transferToAddress = function (eth, from, to, value, callback) { * @method deposit * @param {String} from * @param {String} to - * @param {Value} value to be transfered + * @param {Value} value to be transferred * @param {String} client unique identifier * @param {Function} callback, callback */ diff --git a/internal/jsre/jsre.go b/internal/jsre/jsre.go index c7b4ddf0d69a..1b3528a03617 100644 --- a/internal/jsre/jsre.go +++ b/internal/jsre/jsre.go @@ -26,14 +26,14 @@ import ( "math/rand" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/internal/jsre/deps" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/internal/jsre/deps" "github.com/robertkrimen/otto" ) var ( - BigNumber_JS = deps.MustAsset("bignumber.js") - Web3_JS = deps.MustAsset("web3.js") + BignumberJs = deps.MustAsset("bignumber.js") + Web3Js = deps.MustAsset("web3.js") ) /* diff --git a/internal/testlog/testlog.go b/internal/testlog/testlog.go new file mode 100644 index 000000000000..c5a6114d16aa --- /dev/null +++ b/internal/testlog/testlog.go @@ -0,0 +1,46 @@ +// Copyright 2019 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 testlog provides a log handler for unit tests. +package testlog + +import ( + "testing" + + "github.com/ethereum/go-ethereum/log" +) + +// Logger returns a logger which logs to the unit test log of t. +func Logger(t *testing.T, level log.Lvl) log.Logger { + l := log.New() + l.SetHandler(Handler(t, level)) + return l +} + +// Handler returns a log handler which logs to the unit test log of t. +func Handler(t *testing.T, level log.Lvl) log.Handler { + return log.LvlFilterHandler(level, &handler{t, log.TerminalFormat(false)}) +} + +type handler struct { + t *testing.T + fmt log.Format +} + +func (h *handler) Log(r *log.Record) error { + h.t.Logf("%s", h.fmt.Format(r)) + return nil +} diff --git a/internal/web3ext/web3ext.go b/internal/web3ext/web3ext.go index 6b98c8b7e1c0..cd16fa79c68d 100644 --- a/internal/web3ext/web3ext.go +++ b/internal/web3ext/web3ext.go @@ -18,23 +18,24 @@ package web3ext var Modules = map[string]string{ - "accounting": Accounting_JS, - "admin": Admin_JS, - "chequebook": Chequebook_JS, - "clique": Clique_JS, - "ethash": Ethash_JS, - "debug": Debug_JS, - "eth": Eth_JS, - "miner": Miner_JS, - "net": Net_JS, - "personal": Personal_JS, - "rpc": RPC_JS, - "shh": Shh_JS, - "swarmfs": SWARMFS_JS, - "txpool": TxPool_JS, + "accounting": AccountingJs, + "admin": AdminJs, + "chequebook": ChequebookJs, + "clique": CliqueJs, + "ethash": EthashJs, + "debug": DebugJs, + "eth": EthJs, + "miner": MinerJs, + "net": NetJs, + "personal": PersonalJs, + "rpc": RpcJs, + "shh": ShhJs, + "swarmfs": SwarmfsJs, + "txpool": TxpoolJs, + "les": LESJs, } -const Chequebook_JS = ` +const ChequebookJs = ` web3._extend({ property: 'chequebook', methods: [ @@ -65,7 +66,7 @@ web3._extend({ }); ` -const Clique_JS = ` +const CliqueJs = ` web3._extend({ property: 'clique', methods: [ @@ -73,7 +74,7 @@ web3._extend({ name: 'getSnapshot', call: 'clique_getSnapshot', params: 1, - inputFormatter: [null] + inputFormatter: [web3._extend.utils.fromDecimal] }), new web3._extend.Method({ name: 'getSnapshotAtHash', @@ -84,7 +85,7 @@ web3._extend({ name: 'getSigners', call: 'clique_getSigners', params: 1, - inputFormatter: [null] + inputFormatter: [web3._extend.utils.fromDecimal] }), new web3._extend.Method({ name: 'getSignersAtHash', @@ -101,6 +102,11 @@ web3._extend({ call: 'clique_discard', params: 1 }), + new web3._extend.Method({ + name: 'status', + call: 'clique_status', + params: 0 + }), ], properties: [ new web3._extend.Property({ @@ -111,7 +117,7 @@ web3._extend({ }); ` -const Ethash_JS = ` +const EthashJs = ` web3._extend({ property: 'ethash', methods: [ @@ -139,7 +145,7 @@ web3._extend({ }); ` -const Admin_JS = ` +const AdminJs = ` web3._extend({ property: 'admin', methods: [ @@ -217,10 +223,15 @@ web3._extend({ }); ` -const Debug_JS = ` +const DebugJs = ` web3._extend({ property: 'debug', methods: [ + new web3._extend.Method({ + name: 'accountRange', + call: 'debug_accountRange', + params: 2 + }), new web3._extend.Method({ name: 'printBlock', call: 'debug_printBlock', @@ -231,6 +242,12 @@ web3._extend({ call: 'debug_getBlockRlp', params: 1 }), + new web3._extend.Method({ + name: 'testSignCliqueBlock', + call: 'debug_testSignCliqueBlock', + params: 2, + inputFormatters: [web3._extend.formatters.inputAddressFormatter, null], + }), new web3._extend.Method({ name: 'setHead', call: 'debug_setHead', @@ -256,11 +273,6 @@ web3._extend({ name: 'chaindbCompact', call: 'debug_chaindbCompact', }), - new web3._extend.Method({ - name: 'metrics', - call: 'debug_metrics', - params: 1 - }), new web3._extend.Method({ name: 'verbosity', call: 'debug_verbosity', @@ -443,12 +455,17 @@ web3._extend({ params: 2, inputFormatter:[null, null], }), + new web3._extend.Method({ + name: 'freezeClient', + call: 'debug_freezeClient', + params: 1, + }), ], properties: [] }); ` -const Eth_JS = ` +const EthJs = ` web3._extend({ property: 'eth', methods: [ @@ -481,6 +498,32 @@ web3._extend({ params: 1, inputFormatter: [web3._extend.formatters.inputTransactionFormatter] }), + new web3._extend.Method({ + name: 'fillTransaction', + call: 'eth_fillTransaction', + params: 1, + inputFormatter: [web3._extend.formatters.inputTransactionFormatter] + }), + new web3._extend.Method({ + name: 'getHeaderByNumber', + call: 'eth_getHeaderByNumber', + params: 1 + }), + new web3._extend.Method({ + name: 'getHeaderByHash', + call: 'eth_getHeaderByHash', + params: 1 + }), + new web3._extend.Method({ + name: 'getBlockByNumber', + call: 'eth_getBlockByNumber', + params: 2 + }), + new web3._extend.Method({ + name: 'getBlockByHash', + call: 'eth_getBlockByHash', + params: 2 + }), new web3._extend.Method({ name: 'getRawTransaction', call: 'eth_getRawTransactionByHash', @@ -518,7 +561,7 @@ web3._extend({ }); ` -const Miner_JS = ` +const MinerJs = ` web3._extend({ property: 'miner', methods: [ @@ -563,7 +606,7 @@ web3._extend({ }); ` -const Net_JS = ` +const NetJs = ` web3._extend({ property: 'net', methods: [], @@ -576,7 +619,7 @@ web3._extend({ }); ` -const Personal_JS = ` +const PersonalJs = ` web3._extend({ property: 'personal', methods: [ @@ -612,6 +655,16 @@ web3._extend({ params: 2, inputFormatter: [web3._extend.formatters.inputTransactionFormatter, null] }), + new web3._extend.Method({ + name: 'unpair', + call: 'personal_unpair', + params: 2 + }), + new web3._extend.Method({ + name: 'initializeWallet', + call: 'personal_initializeWallet', + params: 1 + }) ], properties: [ new web3._extend.Property({ @@ -622,7 +675,7 @@ web3._extend({ }) ` -const RPC_JS = ` +const RpcJs = ` web3._extend({ property: 'rpc', methods: [], @@ -635,7 +688,7 @@ web3._extend({ }); ` -const Shh_JS = ` +const ShhJs = ` web3._extend({ property: 'shh', methods: [ @@ -655,7 +708,7 @@ web3._extend({ }); ` -const SWARMFS_JS = ` +const SwarmfsJs = ` web3._extend({ property: 'swarmfs', methods: @@ -679,7 +732,7 @@ web3._extend({ }); ` -const TxPool_JS = ` +const TxpoolJs = ` web3._extend({ property: 'txpool', methods: [], @@ -706,7 +759,7 @@ web3._extend({ }); ` -const Accounting_JS = ` +const AccountingJs = ` web3._extend({ property: 'accounting', methods: [ @@ -749,3 +802,57 @@ web3._extend({ ] }); ` + +const LESJs = ` +web3._extend({ + property: 'les', + methods: + [ + new web3._extend.Method({ + name: 'getCheckpoint', + call: 'les_getCheckpoint', + params: 1 + }), + new web3._extend.Method({ + name: 'clientInfo', + call: 'les_clientInfo', + params: 1 + }), + new web3._extend.Method({ + name: 'priorityClientInfo', + call: 'les_priorityClientInfo', + params: 3 + }), + new web3._extend.Method({ + name: 'setClientParams', + call: 'les_setClientParams', + params: 2 + }), + new web3._extend.Method({ + name: 'setDefaultParams', + call: 'les_setDefaultParams', + params: 1 + }), + new web3._extend.Method({ + name: 'addBalance', + call: 'les_addBalance', + params: 3 + }), + ], + properties: + [ + new web3._extend.Property({ + name: 'latestCheckpoint', + getter: 'les_latestCheckpoint' + }), + new web3._extend.Property({ + name: 'checkpointContractAddress', + getter: 'les_getCheckpointContractAddress' + }), + new web3._extend.Property({ + name: 'serverInfo', + getter: 'les_serverInfo' + }), + ] +}); +` diff --git a/les/api.go b/les/api.go new file mode 100644 index 000000000000..ad511c9d6b59 --- /dev/null +++ b/les/api.go @@ -0,0 +1,354 @@ +// Copyright 2019 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 ( + "errors" + "fmt" + "math" + "time" + + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/p2p/enode" +) + +var ( + errNoCheckpoint = errors.New("no local checkpoint provided") + errNotActivated = errors.New("checkpoint registrar is not activated") + errUnknownBenchmarkType = errors.New("unknown benchmark type") + errBalanceOverflow = errors.New("balance overflow") + errNoPriority = errors.New("priority too low to raise capacity") +) + +const maxBalance = math.MaxInt64 + +// PrivateLightServerAPI provides an API to access the LES light server. +type PrivateLightServerAPI struct { + server *LesServer + defaultPosFactors, defaultNegFactors priceFactors +} + +// NewPrivateLightServerAPI creates a new LES light server API. +func NewPrivateLightServerAPI(server *LesServer) *PrivateLightServerAPI { + return &PrivateLightServerAPI{ + server: server, + defaultPosFactors: server.clientPool.defaultPosFactors, + defaultNegFactors: server.clientPool.defaultNegFactors, + } +} + +// ServerInfo returns global server parameters +func (api *PrivateLightServerAPI) ServerInfo() map[string]interface{} { + res := make(map[string]interface{}) + res["minimumCapacity"] = api.server.minCapacity + res["maximumCapacity"] = api.server.maxCapacity + res["freeClientCapacity"] = api.server.freeCapacity + res["totalCapacity"], res["totalConnectedCapacity"], res["priorityConnectedCapacity"] = api.server.clientPool.capacityInfo() + return res +} + +// ClientInfo returns information about clients listed in the ids list or matching the given tags +func (api *PrivateLightServerAPI) ClientInfo(ids []enode.ID) map[enode.ID]map[string]interface{} { + res := make(map[enode.ID]map[string]interface{}) + api.server.clientPool.forClients(ids, func(client *clientInfo, id enode.ID) error { + res[id] = api.clientInfo(client, id) + return nil + }) + return res +} + +// PriorityClientInfo returns information about clients with a positive balance +// in the given ID range (stop excluded). If stop is null then the iterator stops +// only at the end of the ID space. MaxCount limits the number of results returned. +// If maxCount limit is applied but there are more potential results then the ID +// of the next potential result is included in the map with an empty structure +// assigned to it. +func (api *PrivateLightServerAPI) PriorityClientInfo(start, stop enode.ID, maxCount int) map[enode.ID]map[string]interface{} { + res := make(map[enode.ID]map[string]interface{}) + ids := api.server.clientPool.ndb.getPosBalanceIDs(start, stop, maxCount+1) + if len(ids) > maxCount { + res[ids[maxCount]] = make(map[string]interface{}) + ids = ids[:maxCount] + } + if len(ids) != 0 { + api.server.clientPool.forClients(ids, func(client *clientInfo, id enode.ID) error { + res[id] = api.clientInfo(client, id) + return nil + }) + } + return res +} + +// clientInfo creates a client info data structure +func (api *PrivateLightServerAPI) clientInfo(c *clientInfo, id enode.ID) map[string]interface{} { + info := make(map[string]interface{}) + if c != nil { + now := mclock.Now() + info["isConnected"] = true + info["connectionTime"] = float64(now-c.connectedAt) / float64(time.Second) + info["capacity"] = c.capacity + pb, nb := c.balanceTracker.getBalance(now) + info["pricing/balance"], info["pricing/negBalance"] = pb, nb + info["pricing/balanceMeta"] = c.balanceMetaInfo + info["priority"] = pb != 0 + } else { + info["isConnected"] = false + pb := api.server.clientPool.ndb.getOrNewPB(id) + info["pricing/balance"], info["pricing/balanceMeta"] = pb.value, pb.meta + info["priority"] = pb.value != 0 + } + return info +} + +// setParams either sets the given parameters for a single connected client (if specified) +// or the default parameters applicable to clients connected in the future +func (api *PrivateLightServerAPI) setParams(params map[string]interface{}, client *clientInfo, posFactors, negFactors *priceFactors) (updateFactors bool, err error) { + defParams := client == nil + if !defParams { + posFactors, negFactors = &client.posFactors, &client.negFactors + } + for name, value := range params { + errValue := func() error { + return fmt.Errorf("invalid value for parameter '%s'", name) + } + setFactor := func(v *float64) { + if val, ok := value.(float64); ok && val >= 0 { + *v = val / float64(time.Second) + updateFactors = true + } else { + err = errValue() + } + } + + switch { + case name == "pricing/timeFactor": + setFactor(&posFactors.timeFactor) + case name == "pricing/capacityFactor": + setFactor(&posFactors.capacityFactor) + case name == "pricing/requestCostFactor": + setFactor(&posFactors.requestFactor) + case name == "pricing/negative/timeFactor": + setFactor(&negFactors.timeFactor) + case name == "pricing/negative/capacityFactor": + setFactor(&negFactors.capacityFactor) + case name == "pricing/negative/requestCostFactor": + setFactor(&negFactors.requestFactor) + case !defParams && name == "capacity": + if capacity, ok := value.(float64); ok && uint64(capacity) >= api.server.minCapacity { + err = api.server.clientPool.setCapacity(client, uint64(capacity)) + // Don't have to call factor update explicitly. It's already done + // in setCapacity function. + } else { + err = errValue() + } + default: + if defParams { + err = fmt.Errorf("invalid default parameter '%s'", name) + } else { + err = fmt.Errorf("invalid client parameter '%s'", name) + } + } + if err != nil { + return + } + } + return +} + +// AddBalance updates the balance of a client (either overwrites it or adds to it). +// It also updates the balance meta info string. +func (api *PrivateLightServerAPI) AddBalance(id enode.ID, value int64, meta string) ([2]uint64, error) { + oldBalance, newBalance, err := api.server.clientPool.addBalance(id, value, meta) + return [2]uint64{oldBalance, newBalance}, err +} + +// SetClientParams sets client parameters for all clients listed in the ids list +// or all connected clients if the list is empty +func (api *PrivateLightServerAPI) SetClientParams(ids []enode.ID, params map[string]interface{}) error { + return api.server.clientPool.forClients(ids, func(client *clientInfo, id enode.ID) error { + if client != nil { + update, err := api.setParams(params, client, nil, nil) + if update { + client.updatePriceFactors() + } + return err + } else { + return fmt.Errorf("client %064x is not connected", id[:]) + } + }) +} + +// SetDefaultParams sets the default parameters applicable to clients connected in the future +func (api *PrivateLightServerAPI) SetDefaultParams(params map[string]interface{}) error { + update, err := api.setParams(params, nil, &api.defaultPosFactors, &api.defaultNegFactors) + if update { + api.server.clientPool.setDefaultFactors(api.defaultPosFactors, api.defaultNegFactors) + } + return err +} + +// Benchmark runs a request performance benchmark with a given set of measurement setups +// in multiple passes specified by passCount. The measurement time for each setup in each +// pass is specified in milliseconds by length. +// +// Note: measurement time is adjusted for each pass depending on the previous ones. +// Therefore a controlled total measurement time is achievable in multiple passes. +func (api *PrivateLightServerAPI) Benchmark(setups []map[string]interface{}, passCount, length int) ([]map[string]interface{}, error) { + benchmarks := make([]requestBenchmark, len(setups)) + for i, setup := range setups { + if t, ok := setup["type"].(string); ok { + getInt := func(field string, def int) int { + if value, ok := setup[field].(float64); ok { + return int(value) + } + return def + } + getBool := func(field string, def bool) bool { + if value, ok := setup[field].(bool); ok { + return value + } + return def + } + switch t { + case "header": + benchmarks[i] = &benchmarkBlockHeaders{ + amount: getInt("amount", 1), + skip: getInt("skip", 1), + byHash: getBool("byHash", false), + reverse: getBool("reverse", false), + } + case "body": + benchmarks[i] = &benchmarkBodiesOrReceipts{receipts: false} + case "receipts": + benchmarks[i] = &benchmarkBodiesOrReceipts{receipts: true} + case "proof": + benchmarks[i] = &benchmarkProofsOrCode{code: false} + case "code": + benchmarks[i] = &benchmarkProofsOrCode{code: true} + case "cht": + benchmarks[i] = &benchmarkHelperTrie{ + bloom: false, + reqCount: getInt("amount", 1), + } + case "bloom": + benchmarks[i] = &benchmarkHelperTrie{ + bloom: true, + reqCount: getInt("amount", 1), + } + case "txSend": + benchmarks[i] = &benchmarkTxSend{} + case "txStatus": + benchmarks[i] = &benchmarkTxStatus{} + default: + return nil, errUnknownBenchmarkType + } + } else { + return nil, errUnknownBenchmarkType + } + } + rs := api.server.handler.runBenchmark(benchmarks, passCount, time.Millisecond*time.Duration(length)) + result := make([]map[string]interface{}, len(setups)) + for i, r := range rs { + res := make(map[string]interface{}) + if r.err == nil { + res["totalCount"] = r.totalCount + res["avgTime"] = r.avgTime + res["maxInSize"] = r.maxInSize + res["maxOutSize"] = r.maxOutSize + } else { + res["error"] = r.err.Error() + } + result[i] = res + } + return result, nil +} + +// PrivateDebugAPI provides an API to debug LES light server functionality. +type PrivateDebugAPI struct { + server *LesServer +} + +// NewPrivateDebugAPI creates a new LES light server debug API. +func NewPrivateDebugAPI(server *LesServer) *PrivateDebugAPI { + return &PrivateDebugAPI{ + server: server, + } +} + +// FreezeClient forces a temporary client freeze which normally happens when the server is overloaded +func (api *PrivateDebugAPI) FreezeClient(id enode.ID) error { + return api.server.clientPool.forClients([]enode.ID{id}, func(c *clientInfo, id enode.ID) error { + if c == nil { + return fmt.Errorf("client %064x is not connected", id[:]) + } + c.peer.freezeClient() + return nil + }) +} + +// PrivateLightAPI provides an API to access the LES light server or light client. +type PrivateLightAPI struct { + backend *lesCommons +} + +// NewPrivateLightAPI creates a new LES service API. +func NewPrivateLightAPI(backend *lesCommons) *PrivateLightAPI { + return &PrivateLightAPI{backend: backend} +} + +// LatestCheckpoint returns the latest local checkpoint package. +// +// The checkpoint package consists of 4 strings: +// result[0], hex encoded latest section index +// result[1], 32 bytes hex encoded latest section head hash +// result[2], 32 bytes hex encoded latest section canonical hash trie root hash +// result[3], 32 bytes hex encoded latest section bloom trie root hash +func (api *PrivateLightAPI) LatestCheckpoint() ([4]string, error) { + var res [4]string + cp := api.backend.latestLocalCheckpoint() + if cp.Empty() { + return res, errNoCheckpoint + } + res[0] = hexutil.EncodeUint64(cp.SectionIndex) + res[1], res[2], res[3] = cp.SectionHead.Hex(), cp.CHTRoot.Hex(), cp.BloomRoot.Hex() + return res, nil +} + +// GetLocalCheckpoint returns the specific local checkpoint package. +// +// The checkpoint package consists of 3 strings: +// result[0], 32 bytes hex encoded latest section head hash +// result[1], 32 bytes hex encoded latest section canonical hash trie root hash +// result[2], 32 bytes hex encoded latest section bloom trie root hash +func (api *PrivateLightAPI) GetCheckpoint(index uint64) ([3]string, error) { + var res [3]string + cp := api.backend.localCheckpoint(index) + if cp.Empty() { + return res, errNoCheckpoint + } + res[0], res[1], res[2] = cp.SectionHead.Hex(), cp.CHTRoot.Hex(), cp.BloomRoot.Hex() + return res, nil +} + +// GetCheckpointContractAddress returns the contract contract address in hex format. +func (api *PrivateLightAPI) GetCheckpointContractAddress() (string, error) { + if api.backend.oracle == nil { + return "", errNotActivated + } + return api.backend.oracle.config.Address.Hex(), nil +} diff --git a/les/api_backend.go b/les/api_backend.go index db68a3e7050b..e01e1be98bd2 100644 --- a/les/api_backend.go +++ b/les/api_backend.go @@ -18,29 +18,31 @@ package les import ( "context" + "errors" "math/big" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/bloombits" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/eth/gasprice" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/light" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/eth/gasprice" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" ) type LesApiBackend struct { - eth *LightEthereum - gpo *gasprice.Oracle + extRPCEnabled bool + eth *LightEthereum + gpo *gasprice.Oracle } func (b *LesApiBackend) ChainConfig() *params.ChainConfig { @@ -52,39 +54,99 @@ func (b *LesApiBackend) CurrentBlock() *types.Block { } func (b *LesApiBackend) SetHead(number uint64) { - b.eth.protocolManager.downloader.Cancel() + b.eth.handler.downloader.Cancel() b.eth.blockchain.SetHead(number) } -func (b *LesApiBackend) HeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Header, error) { - if blockNr == rpc.LatestBlockNumber || blockNr == rpc.PendingBlockNumber { +func (b *LesApiBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) { + if number == rpc.LatestBlockNumber || number == rpc.PendingBlockNumber { return b.eth.blockchain.CurrentHeader(), nil } - return b.eth.blockchain.GetHeaderByNumberOdr(ctx, uint64(blockNr)) + return b.eth.blockchain.GetHeaderByNumberOdr(ctx, uint64(number)) +} + +func (b *LesApiBackend) HeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Header, error) { + if blockNr, ok := blockNrOrHash.Number(); ok { + return b.HeaderByNumber(ctx, blockNr) + } + if hash, ok := blockNrOrHash.Hash(); ok { + header, err := b.HeaderByHash(ctx, hash) + if err != nil { + return nil, err + } + if header == nil { + return nil, errors.New("header for hash not found") + } + if blockNrOrHash.RequireCanonical && b.eth.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { + return nil, errors.New("hash is not currently canonical") + } + return header, nil + } + return nil, errors.New("invalid arguments; neither block nor hash specified") } func (b *LesApiBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) { return b.eth.blockchain.GetHeaderByHash(hash), nil } -func (b *LesApiBackend) BlockByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*types.Block, error) { - header, err := b.HeaderByNumber(ctx, blockNr) +func (b *LesApiBackend) BlockByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Block, error) { + header, err := b.HeaderByNumber(ctx, number) if header == nil || err != nil { return nil, err } - return b.GetBlock(ctx, header.Hash()) + return b.BlockByHash(ctx, header.Hash()) } -func (b *LesApiBackend) StateAndHeaderByNumber(ctx context.Context, blockNr rpc.BlockNumber) (*state.StateDB, *types.Header, error) { - header, err := b.HeaderByNumber(ctx, blockNr) - if header == nil || err != nil { +func (b *LesApiBackend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { + return b.eth.blockchain.GetBlockByHash(ctx, hash) +} + +func (b *LesApiBackend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Block, error) { + if blockNr, ok := blockNrOrHash.Number(); ok { + return b.BlockByNumber(ctx, blockNr) + } + if hash, ok := blockNrOrHash.Hash(); ok { + block, err := b.BlockByHash(ctx, hash) + if err != nil { + return nil, err + } + if block == nil { + return nil, errors.New("header found, but block body is missing") + } + if blockNrOrHash.RequireCanonical && b.eth.blockchain.GetCanonicalHash(block.NumberU64()) != hash { + return nil, errors.New("hash is not currently canonical") + } + return block, nil + } + return nil, errors.New("invalid arguments; neither block nor hash specified") +} + +func (b *LesApiBackend) StateAndHeaderByNumber(ctx context.Context, number rpc.BlockNumber) (*state.StateDB, *types.Header, error) { + header, err := b.HeaderByNumber(ctx, number) + if err != nil { return nil, nil, err } + if header == nil { + return nil, nil, errors.New("header not found") + } return light.NewState(ctx, header, b.eth.odr), header, nil } -func (b *LesApiBackend) GetBlock(ctx context.Context, blockHash common.Hash) (*types.Block, error) { - return b.eth.blockchain.GetBlockByHash(ctx, blockHash) +func (b *LesApiBackend) StateAndHeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*state.StateDB, *types.Header, error) { + if blockNr, ok := blockNrOrHash.Number(); ok { + return b.StateAndHeaderByNumber(ctx, blockNr) + } + if hash, ok := blockNrOrHash.Hash(); ok { + header := b.eth.blockchain.GetHeaderByHash(hash) + if header == nil { + return nil, nil, errors.New("header for hash not found") + } + if blockNrOrHash.RequireCanonical && b.eth.blockchain.GetCanonicalHash(header.Number.Uint64()) != hash { + return nil, nil, errors.New("hash is not currently canonical") + } + return light.NewState(ctx, header, b.eth.odr), header, nil + } + return nil, nil, errors.New("invalid arguments; neither block nor hash specified") } func (b *LesApiBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) { @@ -127,6 +189,10 @@ func (b *LesApiBackend) GetPoolTransaction(txHash common.Hash) *types.Transactio return b.eth.txPool.GetTransaction(txHash) } +func (b *LesApiBackend) GetTransaction(ctx context.Context, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) { + return light.GetTransaction(ctx, b.eth.odr, txHash) +} + func (b *LesApiBackend) GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) { return b.eth.txPool.GetNonce(ctx, addr) } @@ -187,6 +253,14 @@ func (b *LesApiBackend) AccountManager() *accounts.Manager { return b.eth.accountManager } +func (b *LesApiBackend) ExtRPCEnabled() bool { + return b.extRPCEnabled +} + +func (b *LesApiBackend) RPCGasCap() *big.Int { + return b.eth.config.RPCGasCap +} + func (b *LesApiBackend) BloomStatus() (uint64, uint64) { if b.eth.bloomIndexer == nil { return 0, 0 diff --git a/les/api_test.go b/les/api_test.go new file mode 100644 index 000000000000..06a519b62bed --- /dev/null +++ b/les/api_test.go @@ -0,0 +1,517 @@ +// Copyright 2019 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 ( + "context" + "errors" + "flag" + "io/ioutil" + "math/rand" + "os" + "sync" + "sync/atomic" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/les/flowcontrol" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/simulations" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" + "github.com/ethereum/go-ethereum/rpc" + "github.com/mattn/go-colorable" +) + +// Additional command line flags for the test binary. +var ( + loglevel = flag.Int("loglevel", 0, "verbosity of logs") + simAdapter = flag.String("adapter", "exec", "type of simulation: sim|socket|exec|docker") +) + +func TestMain(m *testing.M) { + flag.Parse() + log.PrintOrigins(true) + log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) + // register the Delivery service which will run as a devp2p + // protocol when using the exec adapter + adapters.RegisterServices(services) + os.Exit(m.Run()) +} + +// This test is not meant to be a part of the automatic testing process because it +// runs for a long time and also requires a large database in order to do a meaningful +// request performance test. When testServerDataDir is empty, the test is skipped. + +const ( + testServerDataDir = "" // should always be empty on the master branch + testServerCapacity = 200 + testMaxClients = 10 + testTolerance = 0.1 + minRelCap = 0.2 +) + +func TestCapacityAPI3(t *testing.T) { + testCapacityAPI(t, 3) +} + +func TestCapacityAPI6(t *testing.T) { + testCapacityAPI(t, 6) +} + +func TestCapacityAPI10(t *testing.T) { + testCapacityAPI(t, 10) +} + +// testCapacityAPI runs an end-to-end simulation test connecting one server with +// a given number of clients. It sets different priority capacities to all clients +// except a randomly selected one which runs in free client mode. All clients send +// similar requests at the maximum allowed rate and the test verifies whether the +// ratio of processed requests is close enough to the ratio of assigned capacities. +// Running multiple rounds with different settings ensures that changing capacity +// while connected and going back and forth between free and priority mode with +// the supplied API calls is also thoroughly tested. +func testCapacityAPI(t *testing.T, clientCount int) { + // Skip test if no data dir specified + if testServerDataDir == "" { + return + } + for !testSim(t, 1, clientCount, []string{testServerDataDir}, nil, func(ctx context.Context, net *simulations.Network, servers []*simulations.Node, clients []*simulations.Node) bool { + if len(servers) != 1 { + t.Fatalf("Invalid number of servers: %d", len(servers)) + } + server := servers[0] + + serverRpcClient, err := server.Client() + if err != nil { + t.Fatalf("Failed to obtain rpc client: %v", err) + } + headNum, headHash := getHead(ctx, t, serverRpcClient) + minCap, freeCap, totalCap := getCapacityInfo(ctx, t, serverRpcClient) + testCap := totalCap * 3 / 4 + t.Logf("Server testCap: %d minCap: %d head number: %d head hash: %064x\n", testCap, minCap, headNum, headHash) + reqMinCap := uint64(float64(testCap) * minRelCap / (minRelCap + float64(len(clients)-1))) + if minCap > reqMinCap { + t.Fatalf("Minimum client capacity (%d) bigger than required minimum for this test (%d)", minCap, reqMinCap) + } + freeIdx := rand.Intn(len(clients)) + + clientRpcClients := make([]*rpc.Client, len(clients)) + for i, client := range clients { + var err error + clientRpcClients[i], err = client.Client() + if err != nil { + t.Fatalf("Failed to obtain rpc client: %v", err) + } + t.Log("connecting client", i) + if i != freeIdx { + setCapacity(ctx, t, serverRpcClient, client.ID(), testCap/uint64(len(clients))) + } + net.Connect(client.ID(), server.ID()) + + for { + select { + case <-ctx.Done(): + t.Fatalf("Timeout") + default: + } + num, hash := getHead(ctx, t, clientRpcClients[i]) + if num == headNum && hash == headHash { + t.Log("client", i, "synced") + break + } + time.Sleep(time.Millisecond * 200) + } + } + + var wg sync.WaitGroup + stop := make(chan struct{}) + + reqCount := make([]uint64, len(clientRpcClients)) + + // Send light request like crazy. + for i, c := range clientRpcClients { + wg.Add(1) + i, c := i, c + go func() { + defer wg.Done() + + queue := make(chan struct{}, 100) + reqCount[i] = 0 + for { + select { + case queue <- struct{}{}: + select { + case <-stop: + return + case <-ctx.Done(): + return + default: + wg.Add(1) + go func() { + ok := testRequest(ctx, t, c) + wg.Done() + <-queue + if ok { + count := atomic.AddUint64(&reqCount[i], 1) + if count%10000 == 0 { + freezeClient(ctx, t, serverRpcClient, clients[i].ID()) + } + } + }() + } + case <-stop: + return + case <-ctx.Done(): + return + } + } + }() + } + + processedSince := func(start []uint64) []uint64 { + res := make([]uint64, len(reqCount)) + for i := range reqCount { + res[i] = atomic.LoadUint64(&reqCount[i]) + if start != nil { + res[i] -= start[i] + } + } + return res + } + + weights := make([]float64, len(clients)) + for c := 0; c < 5; c++ { + setCapacity(ctx, t, serverRpcClient, clients[freeIdx].ID(), freeCap) + freeIdx = rand.Intn(len(clients)) + var sum float64 + for i := range clients { + if i == freeIdx { + weights[i] = 0 + } else { + weights[i] = rand.Float64()*(1-minRelCap) + minRelCap + } + sum += weights[i] + } + for i, client := range clients { + weights[i] *= float64(testCap-freeCap-100) / sum + capacity := uint64(weights[i]) + if i != freeIdx && capacity < getCapacity(ctx, t, serverRpcClient, client.ID()) { + setCapacity(ctx, t, serverRpcClient, client.ID(), capacity) + } + } + setCapacity(ctx, t, serverRpcClient, clients[freeIdx].ID(), 0) + for i, client := range clients { + capacity := uint64(weights[i]) + if i != freeIdx && capacity > getCapacity(ctx, t, serverRpcClient, client.ID()) { + setCapacity(ctx, t, serverRpcClient, client.ID(), capacity) + } + } + weights[freeIdx] = float64(freeCap) + for i := range clients { + weights[i] /= float64(testCap) + } + + time.Sleep(flowcontrol.DecParamDelay) + t.Log("Starting measurement") + t.Logf("Relative weights:") + for i := range clients { + t.Logf(" %f", weights[i]) + } + t.Log() + start := processedSince(nil) + for { + select { + case <-ctx.Done(): + t.Fatalf("Timeout") + default: + } + + _, _, totalCap = getCapacityInfo(ctx, t, serverRpcClient) + if totalCap < testCap { + t.Log("Total capacity underrun") + close(stop) + wg.Wait() + return false + } + + processed := processedSince(start) + var avg uint64 + t.Logf("Processed") + for i, p := range processed { + t.Logf(" %d", p) + processed[i] = uint64(float64(p) / weights[i]) + avg += processed[i] + } + avg /= uint64(len(processed)) + + if avg >= 10000 { + var maxDev float64 + for _, p := range processed { + dev := float64(int64(p-avg)) / float64(avg) + t.Logf(" %7.4f", dev) + if dev < 0 { + dev = -dev + } + if dev > maxDev { + maxDev = dev + } + } + t.Logf(" max deviation: %f totalCap: %d\n", maxDev, totalCap) + if maxDev <= testTolerance { + t.Log("success") + break + } + } else { + t.Log() + } + time.Sleep(time.Millisecond * 200) + } + } + + close(stop) + wg.Wait() + + for i, count := range reqCount { + t.Log("client", i, "processed", count) + } + return true + }) { + t.Log("restarting test") + } +} + +func getHead(ctx context.Context, t *testing.T, client *rpc.Client) (uint64, common.Hash) { + res := make(map[string]interface{}) + if err := client.CallContext(ctx, &res, "eth_getBlockByNumber", "latest", false); err != nil { + t.Fatalf("Failed to obtain head block: %v", err) + } + numStr, ok := res["number"].(string) + if !ok { + t.Fatalf("RPC block number field invalid") + } + num, err := hexutil.DecodeUint64(numStr) + if err != nil { + t.Fatalf("Failed to decode RPC block number: %v", err) + } + hashStr, ok := res["hash"].(string) + if !ok { + t.Fatalf("RPC block number field invalid") + } + hash := common.HexToHash(hashStr) + return num, hash +} + +func testRequest(ctx context.Context, t *testing.T, client *rpc.Client) bool { + var res string + var addr common.Address + rand.Read(addr[:]) + c, cancel := context.WithTimeout(ctx, time.Second*12) + defer cancel() + err := client.CallContext(c, &res, "eth_getBalance", addr, "latest") + if err != nil { + t.Log("request error:", err) + } + return err == nil +} + +func freezeClient(ctx context.Context, t *testing.T, server *rpc.Client, clientID enode.ID) { + if err := server.CallContext(ctx, nil, "debug_freezeClient", clientID); err != nil { + t.Fatalf("Failed to freeze client: %v", err) + } + +} + +func setCapacity(ctx context.Context, t *testing.T, server *rpc.Client, clientID enode.ID, cap uint64) { + params := make(map[string]interface{}) + params["capacity"] = cap + if err := server.CallContext(ctx, nil, "les_setClientParams", []enode.ID{clientID}, []string{}, params); err != nil { + t.Fatalf("Failed to set client capacity: %v", err) + } +} + +func getCapacity(ctx context.Context, t *testing.T, server *rpc.Client, clientID enode.ID) uint64 { + var res map[enode.ID]map[string]interface{} + if err := server.CallContext(ctx, &res, "les_clientInfo", []enode.ID{clientID}, []string{}); err != nil { + t.Fatalf("Failed to get client info: %v", err) + } + info, ok := res[clientID] + if !ok { + t.Fatalf("Missing client info") + } + v, ok := info["capacity"] + if !ok { + t.Fatalf("Missing field in client info: capacity") + } + vv, ok := v.(float64) + if !ok { + t.Fatalf("Failed to decode capacity field") + } + return uint64(vv) +} + +func getCapacityInfo(ctx context.Context, t *testing.T, server *rpc.Client) (minCap, freeCap, totalCap uint64) { + var res map[string]interface{} + if err := server.CallContext(ctx, &res, "les_serverInfo"); err != nil { + t.Fatalf("Failed to query server info: %v", err) + } + decode := func(s string) uint64 { + v, ok := res[s] + if !ok { + t.Fatalf("Missing field in server info: %s", s) + } + vv, ok := v.(float64) + if !ok { + t.Fatalf("Failed to decode server info field: %s", s) + } + return uint64(vv) + } + minCap = decode("minimumCapacity") + freeCap = decode("freeClientCapacity") + totalCap = decode("totalCapacity") + return +} + +var services = adapters.Services{ + "lesclient": newLesClientService, + "lesserver": newLesServerService, +} + +func NewNetwork() (*simulations.Network, func(), error) { + adapter, adapterTeardown, err := NewAdapter(*simAdapter, services) + if err != nil { + return nil, adapterTeardown, err + } + defaultService := "streamer" + net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ + ID: "0", + DefaultService: defaultService, + }) + teardown := func() { + adapterTeardown() + net.Shutdown() + } + return net, teardown, nil +} + +func NewAdapter(adapterType string, services adapters.Services) (adapter adapters.NodeAdapter, teardown func(), err error) { + teardown = func() {} + switch adapterType { + case "sim": + adapter = adapters.NewSimAdapter(services) + // case "socket": + // adapter = adapters.NewSocketAdapter(services) + case "exec": + baseDir, err0 := ioutil.TempDir("", "les-test") + if err0 != nil { + return nil, teardown, err0 + } + teardown = func() { os.RemoveAll(baseDir) } + adapter = adapters.NewExecAdapter(baseDir) + /*case "docker": + adapter, err = adapters.NewDockerAdapter() + if err != nil { + return nil, teardown, err + }*/ + default: + return nil, teardown, errors.New("adapter needs to be one of sim, socket, exec, docker") + } + return adapter, teardown, nil +} + +func testSim(t *testing.T, serverCount, clientCount int, serverDir, clientDir []string, test func(ctx context.Context, net *simulations.Network, servers []*simulations.Node, clients []*simulations.Node) bool) bool { + net, teardown, err := NewNetwork() + defer teardown() + if err != nil { + t.Fatalf("Failed to create network: %v", err) + } + timeout := 1800 * time.Second + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + servers := make([]*simulations.Node, serverCount) + clients := make([]*simulations.Node, clientCount) + + for i := range clients { + clientconf := adapters.RandomNodeConfig() + clientconf.Services = []string{"lesclient"} + if len(clientDir) == clientCount { + clientconf.DataDir = clientDir[i] + } + client, err := net.NewNodeWithConfig(clientconf) + if err != nil { + t.Fatalf("Failed to create client: %v", err) + } + clients[i] = client + } + + for i := range servers { + serverconf := adapters.RandomNodeConfig() + serverconf.Services = []string{"lesserver"} + if len(serverDir) == serverCount { + serverconf.DataDir = serverDir[i] + } + server, err := net.NewNodeWithConfig(serverconf) + if err != nil { + t.Fatalf("Failed to create server: %v", err) + } + servers[i] = server + } + + for _, client := range clients { + if err := net.Start(client.ID()); err != nil { + t.Fatalf("Failed to start client node: %v", err) + } + } + for _, server := range servers { + if err := net.Start(server.ID()); err != nil { + t.Fatalf("Failed to start server node: %v", err) + } + } + + return test(ctx, net, servers, clients) +} + +func newLesClientService(ctx *adapters.ServiceContext) (node.Service, error) { + config := eth.DefaultConfig + config.SyncMode = downloader.LightSync + config.Ethash.PowMode = ethash.ModeFake + return New(ctx.NodeContext, &config) +} + +func newLesServerService(ctx *adapters.ServiceContext) (node.Service, error) { + config := eth.DefaultConfig + config.SyncMode = downloader.FullSync + config.LightServ = testServerCapacity + config.LightPeers = testMaxClients + ethereum, err := eth.New(ctx.NodeContext, &config) + if err != nil { + return nil, err + } + server, err := NewLesServer(ethereum, &config) + if err != nil { + return nil, err + } + ethereum.AddLesServer(server) + return ethereum, nil +} diff --git a/les/backend.go b/les/backend.go deleted file mode 100644 index 43faa9bd57d1..000000000000 --- a/les/backend.go +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package les implements the Light Ethereum Subprotocol. -package les - -import ( - "fmt" - "sync" - "time" - - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/bloombits" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/eth" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/eth/filters" - "github.com/nebulaai/nbai-node/eth/gasprice" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/internal/ethapi" - "github.com/nebulaai/nbai-node/light" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/discv5" - "github.com/nebulaai/nbai-node/params" - rpc "github.com/nebulaai/nbai-node/rpc" -) - -type LightEthereum struct { - lesCommons - - odr *LesOdr - relay *LesTxRelay - chainConfig *params.ChainConfig - // Channel for shutting down the service - shutdownChan chan bool - - // Handlers - peers *peerSet - txPool *light.TxPool - blockchain *light.LightChain - serverPool *serverPool - reqDist *requestDistributor - retriever *retrieveManager - - bloomRequests chan chan *bloombits.Retrieval // Channel receiving bloom data retrieval requests - bloomIndexer *core.ChainIndexer - - ApiBackend *LesApiBackend - - eventMux *event.TypeMux - engine consensus.Engine - accountManager *accounts.Manager - - networkId uint64 - netRPCService *ethapi.PublicNetAPI - - wg sync.WaitGroup -} - -func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) { - chainDb, err := eth.CreateDB(ctx, config, "lightchaindata") - if err != nil { - return nil, err - } - chainConfig, genesisHash, genesisErr := core.SetupGenesisBlockWithOverride(chainDb, config.Genesis, config.ConstantinopleOverride) - if _, isCompat := genesisErr.(*params.ConfigCompatError); genesisErr != nil && !isCompat { - return nil, genesisErr - } - log.Info("Initialised chain configuration", "config", chainConfig) - - peers := newPeerSet() - quitSync := make(chan struct{}) - - leth := &LightEthereum{ - lesCommons: lesCommons{ - chainDb: chainDb, - config: config, - iConfig: light.DefaultClientIndexerConfig, - }, - chainConfig: chainConfig, - eventMux: ctx.EventMux, - peers: peers, - reqDist: newRequestDistributor(peers, quitSync), - accountManager: ctx.AccountManager, - engine: eth.CreateConsensusEngine(ctx, chainConfig, &config.Ethash, nil, false, chainDb), - shutdownChan: make(chan bool), - networkId: config.NetworkId, - bloomRequests: make(chan chan *bloombits.Retrieval), - bloomIndexer: eth.NewBloomIndexer(chainDb, params.BloomBitsBlocksClient, params.HelperTrieConfirmations), - } - - 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, light.DefaultClientIndexerConfig, leth.retriever) - leth.chtIndexer = light.NewChtIndexer(chainDb, leth.odr, params.CHTFrequencyClient, params.HelperTrieConfirmations) - leth.bloomTrieIndexer = light.NewBloomTrieIndexer(chainDb, leth.odr, params.BloomBitsBlocksClient, params.BloomTrieFrequency) - leth.odr.SetIndexers(leth.chtIndexer, leth.bloomTrieIndexer, leth.bloomIndexer) - - // Note: NewLightChain adds the trusted checkpoint so it needs an ODR with - // indexers already set but not started yet - if leth.blockchain, err = light.NewLightChain(leth.odr, leth.chainConfig, leth.engine); err != nil { - return nil, err - } - // Note: AddChildIndexer starts the update process for the child - leth.bloomIndexer.AddChildIndexer(leth.bloomTrieIndexer) - leth.chtIndexer.Start(leth.blockchain) - 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) - leth.blockchain.SetHead(compat.RewindTo) - rawdb.WriteChainConfig(chainDb, genesisHash, chainConfig) - } - - leth.txPool = light.NewTxPool(leth.chainConfig, leth.blockchain, leth.relay) - if leth.protocolManager, err = NewProtocolManager(leth.chainConfig, light.DefaultClientIndexerConfig, true, config.NetworkId, leth.eventMux, leth.engine, leth.peers, leth.blockchain, nil, chainDb, leth.odr, leth.relay, leth.serverPool, quitSync, &leth.wg); err != nil { - return nil, err - } - leth.ApiBackend = &LesApiBackend{leth, nil} - gpoParams := config.GPO - if gpoParams.Default == nil { - gpoParams.Default = config.MinerGasPrice - } - leth.ApiBackend.gpo = gasprice.NewOracle(leth.ApiBackend, gpoParams) - return leth, nil -} - -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{} - -// Etherbase is the address that mining rewards will be send to -func (s *LightDummyAPI) Etherbase() (common.Address, error) { - return common.Address{}, fmt.Errorf("not supported") -} - -// Coinbase is the address that mining rewards will be send to (alias for Etherbase) -func (s *LightDummyAPI) Coinbase() (common.Address, error) { - return common.Address{}, fmt.Errorf("not supported") -} - -// Hashrate returns the POW hashrate -func (s *LightDummyAPI) Hashrate() hexutil.Uint { - return 0 -} - -// Mining returns an indication if this node is currently mining. -func (s *LightDummyAPI) Mining() bool { - return false -} - -// APIs returns the collection of RPC services the ethereum package offers. -// NOTE, some of these services probably need to be moved to somewhere else. -func (s *LightEthereum) APIs() []rpc.API { - return append(ethapi.GetAPIs(s.ApiBackend), []rpc.API{ - { - Namespace: "eth", - Version: "1.0", - Service: &LightDummyAPI{}, - Public: true, - }, { - Namespace: "eth", - Version: "1.0", - Service: downloader.NewPublicDownloaderAPI(s.protocolManager.downloader, s.eventMux), - Public: true, - }, { - Namespace: "eth", - Version: "1.0", - Service: filters.NewPublicFilterAPI(s.ApiBackend, true), - Public: true, - }, { - Namespace: "net", - Version: "1.0", - Service: s.netRPCService, - Public: true, - }, - }...) -} - -func (s *LightEthereum) ResetWithGenesisBlock(gb *types.Block) { - s.blockchain.ResetWithGenesisBlock(gb) -} - -func (s *LightEthereum) BlockChain() *light.LightChain { return s.blockchain } -func (s *LightEthereum) TxPool() *light.TxPool { return s.txPool } -func (s *LightEthereum) Engine() consensus.Engine { return s.engine } -func (s *LightEthereum) LesVersion() int { return int(ClientProtocolVersions[0]) } -func (s *LightEthereum) Downloader() *downloader.Downloader { return s.protocolManager.downloader } -func (s *LightEthereum) EventMux() *event.TypeMux { return s.eventMux } - -// Protocols implements node.Service, returning all the currently configured -// network protocols to start. -func (s *LightEthereum) Protocols() []p2p.Protocol { - return s.makeProtocols(ClientProtocolVersions) -} - -// Start implements node.Service, starting all internal goroutines needed by the -// Ethereum protocol implementation. -func (s *LightEthereum) Start(srvr *p2p.Server) error { - log.Warn("Light client mode is an experimental feature") - s.startBloomHandlers(params.BloomBitsBlocksClient) - s.netRPCService = ethapi.NewPublicNetAPI(srvr, s.networkId) - // clients are searching for the first advertised protocol in the list - protocolVersion := AdvertiseProtocolVersions[0] - s.serverPool.start(srvr, lesTopic(s.blockchain.Genesis().Hash(), protocolVersion)) - s.protocolManager.Start(s.config.LightPeers) - return nil -} - -// Stop implements node.Service, terminating all internal goroutines used by the -// Ethereum protocol. -func (s *LightEthereum) Stop() error { - s.odr.Stop() - s.bloomIndexer.Close() - s.chtIndexer.Close() - s.blockchain.Stop() - s.protocolManager.Stop() - s.txPool.Stop() - s.engine.Close() - - s.eventMux.Stop() - - time.Sleep(time.Millisecond * 200) - s.chainDb.Close() - close(s.shutdownChan) - - return nil -} diff --git a/les/balance.go b/les/balance.go new file mode 100644 index 000000000000..51cef15c803d --- /dev/null +++ b/les/balance.go @@ -0,0 +1,389 @@ +// Copyright 2019 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 ( + "sync" + "time" + + "github.com/ethereum/go-ethereum/common/mclock" +) + +const ( + balanceCallbackQueue = iota + balanceCallbackZero + balanceCallbackCount +) + +// balanceTracker keeps track of the positive and negative balances of a connected +// client and calculates actual and projected future priority values required by +// prque.LazyQueue. +type balanceTracker struct { + lock sync.Mutex + clock mclock.Clock + stopped bool + capacity uint64 + balance balance + timeFactor, requestFactor float64 + negTimeFactor, negRequestFactor float64 + sumReqCost uint64 + lastUpdate, nextUpdate, initTime mclock.AbsTime + updateEvent mclock.Timer + // since only a limited and fixed number of callbacks are needed, they are + // stored in a fixed size array ordered by priority threshold. + callbacks [balanceCallbackCount]balanceCallback + // callbackIndex maps balanceCallback constants to callbacks array indexes (-1 if not active) + callbackIndex [balanceCallbackCount]int + callbackCount int // number of active callbacks +} + +// balance represents a pair of positive and negative balances +type balance struct { + pos, neg uint64 +} + +// balanceCallback represents a single callback that is activated when client priority +// reaches the given threshold +type balanceCallback struct { + id int + threshold int64 + callback func() +} + +// init initializes balanceTracker +func (bt *balanceTracker) init(clock mclock.Clock, capacity uint64) { + bt.clock = clock + bt.initTime, bt.lastUpdate = clock.Now(), clock.Now() // Init timestamps + for i := range bt.callbackIndex { + bt.callbackIndex[i] = -1 + } + bt.capacity = capacity +} + +// stop shuts down the balance tracker +func (bt *balanceTracker) stop(now mclock.AbsTime) { + bt.lock.Lock() + defer bt.lock.Unlock() + + bt.stopped = true + bt.addBalance(now) + bt.negTimeFactor = 0 + bt.negRequestFactor = 0 + bt.timeFactor = 0 + bt.requestFactor = 0 + if bt.updateEvent != nil { + bt.updateEvent.Stop() + bt.updateEvent = nil + } +} + +// balanceToPriority converts a balance to a priority value. Higher priority means +// first to disconnect. Positive balance translates to negative priority. If positive +// balance is zero then negative balance translates to a positive priority. +func (bt *balanceTracker) balanceToPriority(b balance) int64 { + if b.pos > 0 { + return ^int64(b.pos / bt.capacity) + } + return int64(b.neg) +} + +// reducedBalance estimates the reduced balance at a given time in the fututre based +// on the current balance, the time factor and an estimated average request cost per time ratio +func (bt *balanceTracker) reducedBalance(at mclock.AbsTime, avgReqCost float64) balance { + dt := float64(at - bt.lastUpdate) + b := bt.balance + if b.pos != 0 { + factor := bt.timeFactor + bt.requestFactor*avgReqCost + diff := uint64(dt * factor) + if diff <= b.pos { + b.pos -= diff + dt = 0 + } else { + dt -= float64(b.pos) / factor + b.pos = 0 + } + } + if dt != 0 { + factor := bt.negTimeFactor + bt.negRequestFactor*avgReqCost + b.neg += uint64(dt * factor) + } + return b +} + +// timeUntil calculates the remaining time needed to reach a given priority level +// assuming that no requests are processed until then. If the given level is never +// reached then (0, false) is returned. +// Note: the function assumes that the balance has been recently updated and +// calculates the time starting from the last update. +func (bt *balanceTracker) timeUntil(priority int64) (time.Duration, bool) { + var dt float64 + if bt.balance.pos != 0 { + if bt.timeFactor < 1e-100 { + return 0, false + } + if priority < 0 { + newBalance := uint64(^priority) * bt.capacity + if newBalance > bt.balance.pos { + return 0, false + } + dt = float64(bt.balance.pos-newBalance) / bt.timeFactor + return time.Duration(dt), true + } else { + dt = float64(bt.balance.pos) / bt.timeFactor + } + } else { + if priority < 0 { + return 0, false + } + } + // if we have a positive balance then dt equals the time needed to get it to zero + if uint64(priority) > bt.balance.neg { + if bt.negTimeFactor < 1e-100 { + return 0, false + } + dt += float64(uint64(priority)-bt.balance.neg) / bt.negTimeFactor + } + return time.Duration(dt), true +} + +// setCapacity updates the capacity value used for priority calculation +func (bt *balanceTracker) setCapacity(capacity uint64) { + bt.lock.Lock() + defer bt.lock.Unlock() + + bt.capacity = capacity +} + +// getPriority returns the actual priority based on the current balance +func (bt *balanceTracker) getPriority(now mclock.AbsTime) int64 { + bt.lock.Lock() + defer bt.lock.Unlock() + + bt.addBalance(now) + return bt.balanceToPriority(bt.balance) +} + +// estimatedPriority gives an upper estimate for the priority at a given time in the future. +// If addReqCost is true then an average request cost per time is assumed that is twice the +// average cost per time in the current session. If false, zero request cost is assumed. +func (bt *balanceTracker) estimatedPriority(at mclock.AbsTime, addReqCost bool) int64 { + bt.lock.Lock() + defer bt.lock.Unlock() + + var avgReqCost float64 + if addReqCost { + dt := time.Duration(bt.lastUpdate - bt.initTime) + if dt > time.Second { + avgReqCost = float64(bt.sumReqCost) * 2 / float64(dt) + } + } + return bt.balanceToPriority(bt.reducedBalance(at, avgReqCost)) +} + +// addBalance updates balance based on the time factor +func (bt *balanceTracker) addBalance(now mclock.AbsTime) { + if now > bt.lastUpdate { + bt.balance = bt.reducedBalance(now, 0) + bt.lastUpdate = now + } +} + +// checkCallbacks checks whether the threshold of any of the active callbacks +// have been reached and calls them if necessary. It also sets up or updates +// a scheduled event to ensure that is will be called again just after the next +// threshold has been reached. +// Note: checkCallbacks assumes that the balance has been recently updated. +func (bt *balanceTracker) checkCallbacks(now mclock.AbsTime) { + if bt.callbackCount == 0 { + return + } + pri := bt.balanceToPriority(bt.balance) + for bt.callbackCount != 0 && bt.callbacks[bt.callbackCount-1].threshold <= pri { + bt.callbackCount-- + bt.callbackIndex[bt.callbacks[bt.callbackCount].id] = -1 + go bt.callbacks[bt.callbackCount].callback() + } + if bt.callbackCount != 0 { + d, ok := bt.timeUntil(bt.callbacks[bt.callbackCount-1].threshold) + if !ok { + bt.nextUpdate = 0 + bt.updateAfter(0) + return + } + if bt.nextUpdate == 0 || bt.nextUpdate > now+mclock.AbsTime(d) { + if d > time.Second { + // Note: if the scheduled update is not in the very near future then we + // schedule the update a bit earlier. This way we do need to update a few + // extra times but don't need to reschedule every time a processed request + // brings the expected firing time a little bit closer. + d = ((d - time.Second) * 7 / 8) + time.Second + } + bt.nextUpdate = now + mclock.AbsTime(d) + bt.updateAfter(d) + } + } else { + bt.nextUpdate = 0 + bt.updateAfter(0) + } +} + +// updateAfter schedules a balance update and callback check in the future +func (bt *balanceTracker) updateAfter(dt time.Duration) { + if bt.updateEvent == nil || bt.updateEvent.Stop() { + if dt == 0 { + bt.updateEvent = nil + } else { + bt.updateEvent = bt.clock.AfterFunc(dt, func() { + bt.lock.Lock() + defer bt.lock.Unlock() + + if bt.callbackCount != 0 { + now := bt.clock.Now() + bt.addBalance(now) + bt.checkCallbacks(now) + } + }) + } + } +} + +// requestCost should be called after serving a request for the given peer +func (bt *balanceTracker) requestCost(cost uint64) { + bt.lock.Lock() + defer bt.lock.Unlock() + + if bt.stopped { + return + } + now := bt.clock.Now() + bt.addBalance(now) + fcost := float64(cost) + + if bt.balance.pos != 0 { + if bt.requestFactor != 0 { + c := uint64(fcost * bt.requestFactor) + if bt.balance.pos >= c { + bt.balance.pos -= c + fcost = 0 + } else { + fcost *= 1 - float64(bt.balance.pos)/float64(c) + bt.balance.pos = 0 + } + bt.checkCallbacks(now) + } else { + fcost = 0 + } + } + if fcost > 0 { + if bt.negRequestFactor != 0 { + bt.balance.neg += uint64(fcost * bt.negRequestFactor) + bt.checkCallbacks(now) + } + } + bt.sumReqCost += cost +} + +// getBalance returns the current positive and negative balance +func (bt *balanceTracker) getBalance(now mclock.AbsTime) (uint64, uint64) { + bt.lock.Lock() + defer bt.lock.Unlock() + + bt.addBalance(now) + return bt.balance.pos, bt.balance.neg +} + +// setBalance sets the positive and negative balance to the given values +func (bt *balanceTracker) setBalance(pos, neg uint64) error { + bt.lock.Lock() + defer bt.lock.Unlock() + + now := bt.clock.Now() + bt.addBalance(now) + bt.balance.pos = pos + bt.balance.neg = neg + bt.checkCallbacks(now) + return nil +} + +// setFactors sets the price factors. timeFactor is the price of a nanosecond of +// connection while requestFactor is the price of a "realCost" unit. +func (bt *balanceTracker) setFactors(neg bool, timeFactor, requestFactor float64) { + bt.lock.Lock() + defer bt.lock.Unlock() + + if bt.stopped { + return + } + now := bt.clock.Now() + bt.addBalance(now) + if neg { + bt.negTimeFactor = timeFactor + bt.negRequestFactor = requestFactor + } else { + bt.timeFactor = timeFactor + bt.requestFactor = requestFactor + } + bt.checkCallbacks(now) +} + +// setCallback sets up a one-time callback to be called when priority reaches +// the threshold. If it has already reached the threshold the callback is called +// immediately. +func (bt *balanceTracker) addCallback(id int, threshold int64, callback func()) { + bt.lock.Lock() + defer bt.lock.Unlock() + + bt.removeCb(id) + idx := 0 + for idx < bt.callbackCount && threshold < bt.callbacks[idx].threshold { + idx++ + } + for i := bt.callbackCount - 1; i >= idx; i-- { + bt.callbackIndex[bt.callbacks[i].id]++ + bt.callbacks[i+1] = bt.callbacks[i] + } + bt.callbackCount++ + bt.callbackIndex[id] = idx + bt.callbacks[idx] = balanceCallback{id, threshold, callback} + now := bt.clock.Now() + bt.addBalance(now) + bt.checkCallbacks(now) +} + +// removeCallback removes the given callback and returns true if it was active +func (bt *balanceTracker) removeCallback(id int) bool { + bt.lock.Lock() + defer bt.lock.Unlock() + + return bt.removeCb(id) +} + +// removeCb removes the given callback and returns true if it was active +// Note: should be called while bt.lock is held +func (bt *balanceTracker) removeCb(id int) bool { + idx := bt.callbackIndex[id] + if idx == -1 { + return false + } + bt.callbackIndex[id] = -1 + for i := idx; i < bt.callbackCount-1; i++ { + bt.callbackIndex[bt.callbacks[i+1].id]-- + bt.callbacks[i] = bt.callbacks[i+1] + } + bt.callbackCount-- + return true +} diff --git a/les/balance_test.go b/les/balance_test.go new file mode 100644 index 000000000000..b571c2cc5c2d --- /dev/null +++ b/les/balance_test.go @@ -0,0 +1,260 @@ +// Copyright 2019 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 ( + "testing" + "time" + + "github.com/ethereum/go-ethereum/common/mclock" +) + +func TestSetBalance(t *testing.T) { + var clock = &mclock.Simulated{} + var inputs = []struct { + pos uint64 + neg uint64 + }{ + {1000, 0}, + {0, 1000}, + {1000, 1000}, + } + + tracker := balanceTracker{} + tracker.init(clock, 1000) + defer tracker.stop(clock.Now()) + + for _, i := range inputs { + tracker.setBalance(i.pos, i.neg) + pos, neg := tracker.getBalance(clock.Now()) + if pos != i.pos { + t.Fatalf("Positive balance mismatch, want %v, got %v", i.pos, pos) + } + if neg != i.neg { + t.Fatalf("Negative balance mismatch, want %v, got %v", i.neg, neg) + } + } +} + +func TestBalanceTimeCost(t *testing.T) { + var ( + clock = &mclock.Simulated{} + tracker = balanceTracker{} + ) + tracker.init(clock, 1000) + defer tracker.stop(clock.Now()) + tracker.setFactors(false, 1, 1) + tracker.setFactors(true, 1, 1) + + tracker.setBalance(uint64(time.Minute), 0) // 1 minute time allowance + + var inputs = []struct { + runTime time.Duration + expPos uint64 + expNeg uint64 + }{ + {time.Second, uint64(time.Second * 59), 0}, + {0, uint64(time.Second * 59), 0}, + {time.Second * 59, 0, 0}, + {time.Second, 0, uint64(time.Second)}, + } + for _, i := range inputs { + clock.Run(i.runTime) + if pos, _ := tracker.getBalance(clock.Now()); pos != i.expPos { + t.Fatalf("Positive balance mismatch, want %v, got %v", i.expPos, pos) + } + if _, neg := tracker.getBalance(clock.Now()); neg != i.expNeg { + t.Fatalf("Negative balance mismatch, want %v, got %v", i.expNeg, neg) + } + } + + tracker.setBalance(uint64(time.Minute), 0) // Refill 1 minute time allowance + for _, i := range inputs { + clock.Run(i.runTime) + if pos, _ := tracker.getBalance(clock.Now()); pos != i.expPos { + t.Fatalf("Positive balance mismatch, want %v, got %v", i.expPos, pos) + } + if _, neg := tracker.getBalance(clock.Now()); neg != i.expNeg { + t.Fatalf("Negative balance mismatch, want %v, got %v", i.expNeg, neg) + } + } +} + +func TestBalanceReqCost(t *testing.T) { + var ( + clock = &mclock.Simulated{} + tracker = balanceTracker{} + ) + tracker.init(clock, 1000) + defer tracker.stop(clock.Now()) + tracker.setFactors(false, 1, 1) + tracker.setFactors(true, 1, 1) + + tracker.setBalance(uint64(time.Minute), 0) // 1 minute time serving time allowance + var inputs = []struct { + reqCost uint64 + expPos uint64 + expNeg uint64 + }{ + {uint64(time.Second), uint64(time.Second * 59), 0}, + {0, uint64(time.Second * 59), 0}, + {uint64(time.Second * 59), 0, 0}, + {uint64(time.Second), 0, uint64(time.Second)}, + } + for _, i := range inputs { + tracker.requestCost(i.reqCost) + if pos, _ := tracker.getBalance(clock.Now()); pos != i.expPos { + t.Fatalf("Positive balance mismatch, want %v, got %v", i.expPos, pos) + } + if _, neg := tracker.getBalance(clock.Now()); neg != i.expNeg { + t.Fatalf("Negative balance mismatch, want %v, got %v", i.expNeg, neg) + } + } +} + +func TestBalanceToPriority(t *testing.T) { + var ( + clock = &mclock.Simulated{} + tracker = balanceTracker{} + ) + tracker.init(clock, 1000) // cap = 1000 + defer tracker.stop(clock.Now()) + tracker.setFactors(false, 1, 1) + tracker.setFactors(true, 1, 1) + + var inputs = []struct { + pos uint64 + neg uint64 + priority int64 + }{ + {1000, 0, ^int64(1)}, + {2000, 0, ^int64(2)}, // Higher balance, lower priority value + {0, 0, 0}, + {0, 1000, 1000}, + } + for _, i := range inputs { + tracker.setBalance(i.pos, i.neg) + priority := tracker.getPriority(clock.Now()) + if priority != i.priority { + t.Fatalf("Priority mismatch, want %v, got %v", i.priority, priority) + } + } +} + +func TestEstimatedPriority(t *testing.T) { + var ( + clock = &mclock.Simulated{} + tracker = balanceTracker{} + ) + tracker.init(clock, 1000000000) // cap = 1000,000,000 + defer tracker.stop(clock.Now()) + tracker.setFactors(false, 1, 1) + tracker.setFactors(true, 1, 1) + + tracker.setBalance(uint64(time.Minute), 0) + var inputs = []struct { + runTime time.Duration // time cost + futureTime time.Duration // diff of future time + reqCost uint64 // single request cost + priority int64 // expected estimated priority + }{ + {time.Second, time.Second, 0, ^int64(58)}, + {0, time.Second, 0, ^int64(58)}, + + // 2 seconds time cost, 1 second estimated time cost, 10^9 request cost, + // 10^9 estimated request cost per second. + {time.Second, time.Second, 1000000000, ^int64(55)}, + + // 3 seconds time cost, 3 second estimated time cost, 10^9*2 request cost, + // 4*10^9 estimated request cost. + {time.Second, 3 * time.Second, 1000000000, ^int64(48)}, + + // All positive balance is used up + {time.Second * 55, 0, 0, 0}, + + // 1 minute estimated time cost, 4/58 * 10^9 estimated request cost per sec. + {0, time.Minute, 0, int64(time.Minute) + int64(time.Second)*120/29}, + } + for _, i := range inputs { + clock.Run(i.runTime) + tracker.requestCost(i.reqCost) + priority := tracker.estimatedPriority(clock.Now()+mclock.AbsTime(i.futureTime), true) + if priority != i.priority { + t.Fatalf("Estimated priority mismatch, want %v, got %v", i.priority, priority) + } + } +} + +func TestCallbackChecking(t *testing.T) { + var ( + clock = &mclock.Simulated{} + tracker = balanceTracker{} + ) + tracker.init(clock, 1000000) // cap = 1000,000 + defer tracker.stop(clock.Now()) + tracker.setFactors(false, 1, 1) + tracker.setFactors(true, 1, 1) + + var inputs = []struct { + priority int64 + expDiff time.Duration + }{ + {^int64(500), time.Millisecond * 500}, + {0, time.Second}, + {int64(time.Second), 2 * time.Second}, + } + tracker.setBalance(uint64(time.Second), 0) + for _, i := range inputs { + diff, _ := tracker.timeUntil(i.priority) + if diff != i.expDiff { + t.Fatalf("Time difference mismatch, want %v, got %v", i.expDiff, diff) + } + } +} + +func TestCallback(t *testing.T) { + var ( + clock = &mclock.Simulated{} + tracker = balanceTracker{} + ) + tracker.init(clock, 1000) // cap = 1000 + defer tracker.stop(clock.Now()) + tracker.setFactors(false, 1, 1) + tracker.setFactors(true, 1, 1) + + callCh := make(chan struct{}, 1) + tracker.setBalance(uint64(time.Minute), 0) + tracker.addCallback(balanceCallbackZero, 0, func() { callCh <- struct{}{} }) + + clock.Run(time.Minute) + select { + case <-callCh: + case <-time.NewTimer(time.Second).C: + t.Fatalf("Callback hasn't been called yet") + } + + tracker.setBalance(uint64(time.Minute), 0) + tracker.addCallback(balanceCallbackZero, 0, func() { callCh <- struct{}{} }) + tracker.removeCallback(balanceCallbackZero) + + clock.Run(time.Minute) + select { + case <-callCh: + t.Fatalf("Callback shouldn't be called") + case <-time.NewTimer(time.Millisecond * 100).C: + } +} diff --git a/les/benchmark.go b/les/benchmark.go new file mode 100644 index 000000000000..42eeef10f3b8 --- /dev/null +++ b/les/benchmark.go @@ -0,0 +1,354 @@ +// Copyright 2019 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 ( + "encoding/binary" + "fmt" + "math/big" + "math/rand" + "sync" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/les/flowcontrol" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" +) + +// requestBenchmark is an interface for different randomized request generators +type requestBenchmark interface { + // init initializes the generator for generating the given number of randomized requests + init(h *serverHandler, count int) error + // request initiates sending a single request to the given peer + request(peer *peer, index int) error +} + +// benchmarkBlockHeaders implements requestBenchmark +type benchmarkBlockHeaders struct { + amount, skip int + reverse, byHash bool + offset, randMax int64 + hashes []common.Hash +} + +func (b *benchmarkBlockHeaders) init(h *serverHandler, count int) error { + d := int64(b.amount-1) * int64(b.skip+1) + b.offset = 0 + b.randMax = h.blockchain.CurrentHeader().Number.Int64() + 1 - d + if b.randMax < 0 { + return fmt.Errorf("chain is too short") + } + if b.reverse { + b.offset = d + } + if b.byHash { + b.hashes = make([]common.Hash, count) + for i := range b.hashes { + b.hashes[i] = rawdb.ReadCanonicalHash(h.chainDb, uint64(b.offset+rand.Int63n(b.randMax))) + } + } + return nil +} + +func (b *benchmarkBlockHeaders) request(peer *peer, index int) error { + if b.byHash { + return peer.RequestHeadersByHash(0, 0, b.hashes[index], b.amount, b.skip, b.reverse) + } else { + return peer.RequestHeadersByNumber(0, 0, uint64(b.offset+rand.Int63n(b.randMax)), b.amount, b.skip, b.reverse) + } +} + +// benchmarkBodiesOrReceipts implements requestBenchmark +type benchmarkBodiesOrReceipts struct { + receipts bool + hashes []common.Hash +} + +func (b *benchmarkBodiesOrReceipts) init(h *serverHandler, count int) error { + randMax := h.blockchain.CurrentHeader().Number.Int64() + 1 + b.hashes = make([]common.Hash, count) + for i := range b.hashes { + b.hashes[i] = rawdb.ReadCanonicalHash(h.chainDb, uint64(rand.Int63n(randMax))) + } + return nil +} + +func (b *benchmarkBodiesOrReceipts) request(peer *peer, index int) error { + if b.receipts { + return peer.RequestReceipts(0, 0, []common.Hash{b.hashes[index]}) + } else { + return peer.RequestBodies(0, 0, []common.Hash{b.hashes[index]}) + } +} + +// benchmarkProofsOrCode implements requestBenchmark +type benchmarkProofsOrCode struct { + code bool + headHash common.Hash +} + +func (b *benchmarkProofsOrCode) init(h *serverHandler, count int) error { + b.headHash = h.blockchain.CurrentHeader().Hash() + return nil +} + +func (b *benchmarkProofsOrCode) request(peer *peer, index int) error { + key := make([]byte, 32) + rand.Read(key) + if b.code { + return peer.RequestCode(0, 0, []CodeReq{{BHash: b.headHash, AccKey: key}}) + } else { + return peer.RequestProofs(0, 0, []ProofReq{{BHash: b.headHash, Key: key}}) + } +} + +// benchmarkHelperTrie implements requestBenchmark +type benchmarkHelperTrie struct { + bloom bool + reqCount int + sectionCount, headNum uint64 +} + +func (b *benchmarkHelperTrie) init(h *serverHandler, count int) error { + if b.bloom { + b.sectionCount, b.headNum, _ = h.server.bloomTrieIndexer.Sections() + } else { + b.sectionCount, _, _ = h.server.chtIndexer.Sections() + b.headNum = b.sectionCount*params.CHTFrequency - 1 + } + if b.sectionCount == 0 { + return fmt.Errorf("no processed sections available") + } + return nil +} + +func (b *benchmarkHelperTrie) request(peer *peer, index int) error { + reqs := make([]HelperTrieReq, b.reqCount) + + if b.bloom { + bitIdx := uint16(rand.Intn(2048)) + for i := range reqs { + key := make([]byte, 10) + binary.BigEndian.PutUint16(key[:2], bitIdx) + binary.BigEndian.PutUint64(key[2:], uint64(rand.Int63n(int64(b.sectionCount)))) + reqs[i] = HelperTrieReq{Type: htBloomBits, TrieIdx: b.sectionCount - 1, Key: key} + } + } else { + for i := range reqs { + key := make([]byte, 8) + binary.BigEndian.PutUint64(key[:], uint64(rand.Int63n(int64(b.headNum)))) + reqs[i] = HelperTrieReq{Type: htCanonical, TrieIdx: b.sectionCount - 1, Key: key, AuxReq: auxHeader} + } + } + + return peer.RequestHelperTrieProofs(0, 0, reqs) +} + +// benchmarkTxSend implements requestBenchmark +type benchmarkTxSend struct { + txs types.Transactions +} + +func (b *benchmarkTxSend) init(h *serverHandler, count int) error { + key, _ := crypto.GenerateKey() + addr := crypto.PubkeyToAddress(key.PublicKey) + signer := types.NewEIP155Signer(big.NewInt(18)) + b.txs = make(types.Transactions, count) + + for i := range b.txs { + data := make([]byte, txSizeCostLimit) + rand.Read(data) + tx, err := types.SignTx(types.NewTransaction(0, addr, new(big.Int), 0, new(big.Int), data), signer, key) + if err != nil { + panic(err) + } + b.txs[i] = tx + } + return nil +} + +func (b *benchmarkTxSend) request(peer *peer, index int) error { + enc, _ := rlp.EncodeToBytes(types.Transactions{b.txs[index]}) + return peer.SendTxs(0, 0, enc) +} + +// benchmarkTxStatus implements requestBenchmark +type benchmarkTxStatus struct{} + +func (b *benchmarkTxStatus) init(h *serverHandler, count int) error { + return nil +} + +func (b *benchmarkTxStatus) request(peer *peer, index int) error { + var hash common.Hash + rand.Read(hash[:]) + return peer.RequestTxStatus(0, 0, []common.Hash{hash}) +} + +// benchmarkSetup stores measurement data for a single benchmark type +type benchmarkSetup struct { + req requestBenchmark + totalCount int + totalTime, avgTime time.Duration + maxInSize, maxOutSize uint32 + err error +} + +// runBenchmark runs a benchmark cycle for all benchmark types in the specified +// number of passes +func (h *serverHandler) runBenchmark(benchmarks []requestBenchmark, passCount int, targetTime time.Duration) []*benchmarkSetup { + setup := make([]*benchmarkSetup, len(benchmarks)) + for i, b := range benchmarks { + setup[i] = &benchmarkSetup{req: b} + } + for i := 0; i < passCount; i++ { + log.Info("Running benchmark", "pass", i+1, "total", passCount) + todo := make([]*benchmarkSetup, len(benchmarks)) + copy(todo, setup) + for len(todo) > 0 { + // select a random element + index := rand.Intn(len(todo)) + next := todo[index] + todo[index] = todo[len(todo)-1] + todo = todo[:len(todo)-1] + + if next.err == nil { + // calculate request count + count := 50 + if next.totalTime > 0 { + count = int(uint64(next.totalCount) * uint64(targetTime) / uint64(next.totalTime)) + } + if err := h.measure(next, count); err != nil { + next.err = err + } + } + } + } + log.Info("Benchmark completed") + + for _, s := range setup { + if s.err == nil { + s.avgTime = s.totalTime / time.Duration(s.totalCount) + } + } + return setup +} + +// meteredPipe implements p2p.MsgReadWriter and remembers the largest single +// message size sent through the pipe +type meteredPipe struct { + rw p2p.MsgReadWriter + maxSize uint32 +} + +func (m *meteredPipe) ReadMsg() (p2p.Msg, error) { + return m.rw.ReadMsg() +} + +func (m *meteredPipe) WriteMsg(msg p2p.Msg) error { + if msg.Size > m.maxSize { + m.maxSize = msg.Size + } + return m.rw.WriteMsg(msg) +} + +// measure runs a benchmark for a single type in a single pass, with the given +// number of requests +func (h *serverHandler) measure(setup *benchmarkSetup, count int) error { + clientPipe, serverPipe := p2p.MsgPipe() + clientMeteredPipe := &meteredPipe{rw: clientPipe} + serverMeteredPipe := &meteredPipe{rw: serverPipe} + var id enode.ID + rand.Read(id[:]) + + clientPeer := newPeer(lpv2, NetworkId, false, p2p.NewPeer(id, "client", nil), clientMeteredPipe) + serverPeer := newPeer(lpv2, NetworkId, false, p2p.NewPeer(id, "server", nil), serverMeteredPipe) + serverPeer.sendQueue = newExecQueue(count) + serverPeer.announceType = announceTypeNone + serverPeer.fcCosts = make(requestCostTable) + c := &requestCosts{} + for code := range requests { + serverPeer.fcCosts[code] = c + } + serverPeer.fcParams = flowcontrol.ServerParams{BufLimit: 1, MinRecharge: 1} + serverPeer.fcClient = flowcontrol.NewClientNode(h.server.fcManager, serverPeer.fcParams) + defer serverPeer.fcClient.Disconnect() + + if err := setup.req.init(h, count); err != nil { + return err + } + + errCh := make(chan error, 10) + start := mclock.Now() + + go func() { + for i := 0; i < count; i++ { + if err := setup.req.request(clientPeer, i); err != nil { + errCh <- err + return + } + } + }() + go func() { + for i := 0; i < count; i++ { + if err := h.handleMsg(serverPeer, &sync.WaitGroup{}); err != nil { + errCh <- err + return + } + } + }() + go func() { + for i := 0; i < count; i++ { + msg, err := clientPipe.ReadMsg() + if err != nil { + errCh <- err + return + } + var i interface{} + msg.Decode(&i) + } + // at this point we can be sure that the other two + // goroutines finished successfully too + close(errCh) + }() + select { + case err := <-errCh: + if err != nil { + return err + } + case <-h.closeCh: + clientPipe.Close() + serverPipe.Close() + return fmt.Errorf("Benchmark cancelled") + } + + setup.totalTime += time.Duration(mclock.Now() - start) + setup.totalCount += count + setup.maxInSize = clientMeteredPipe.maxSize + setup.maxOutSize = serverMeteredPipe.maxSize + clientPipe.Close() + serverPipe.Close() + return nil +} diff --git a/les/bloombits.go b/les/bloombits.go index a7af2871fc62..a98524ce2e69 100644 --- a/les/bloombits.go +++ b/les/bloombits.go @@ -19,8 +19,8 @@ package les import ( "time" - "github.com/nebulaai/nbai-node/common/bitutil" - "github.com/nebulaai/nbai-node/light" + "github.com/ethereum/go-ethereum/common/bitutil" + "github.com/ethereum/go-ethereum/light" ) const ( @@ -46,9 +46,10 @@ const ( func (eth *LightEthereum) startBloomHandlers(sectionSize uint64) { for i := 0; i < bloomServiceThreads; i++ { go func() { + defer eth.wg.Done() for { select { - case <-eth.shutdownChan: + case <-eth.closeCh: return case request := <-eth.bloomRequests: diff --git a/les/checkpointoracle.go b/les/checkpointoracle.go new file mode 100644 index 000000000000..5494e3d6d9d5 --- /dev/null +++ b/les/checkpointoracle.go @@ -0,0 +1,155 @@ +// Copyright 2019 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 ( + "encoding/binary" + "sync/atomic" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/contracts/checkpointoracle" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" +) + +// checkpointOracle is responsible for offering the latest stable checkpoint +// generated and announced by the contract admins on-chain. The checkpoint is +// verified by clients locally during the checkpoint syncing. +type checkpointOracle struct { + config *params.CheckpointOracleConfig + contract *checkpointoracle.CheckpointOracle + + running int32 // Flag whether the contract backend is set or not + getLocal func(uint64) params.TrustedCheckpoint // Function used to retrieve local checkpoint +} + +// newCheckpointOracle returns a checkpoint registrar handler. +func newCheckpointOracle(config *params.CheckpointOracleConfig, getLocal func(uint64) params.TrustedCheckpoint) *checkpointOracle { + if config == nil { + log.Info("Checkpoint registrar is not enabled") + return nil + } + if config.Address == (common.Address{}) || uint64(len(config.Signers)) < config.Threshold { + log.Warn("Invalid checkpoint registrar config") + return nil + } + log.Info("Configured checkpoint registrar", "address", config.Address, "signers", len(config.Signers), "threshold", config.Threshold) + + return &checkpointOracle{ + config: config, + getLocal: getLocal, + } +} + +// start binds the registrar contract and start listening to the +// newCheckpointEvent for the server side. +func (reg *checkpointOracle) start(backend bind.ContractBackend) { + contract, err := checkpointoracle.NewCheckpointOracle(reg.config.Address, backend) + if err != nil { + log.Error("Oracle contract binding failed", "err", err) + return + } + if !atomic.CompareAndSwapInt32(®.running, 0, 1) { + log.Error("Already bound and listening to registrar") + return + } + reg.contract = contract +} + +// isRunning returns an indicator whether the registrar is running. +func (reg *checkpointOracle) isRunning() bool { + return atomic.LoadInt32(®.running) == 1 +} + +// stableCheckpoint returns the stable checkpoint which was generated by local +// indexers and announced by trusted signers. +func (reg *checkpointOracle) stableCheckpoint() (*params.TrustedCheckpoint, uint64) { + // Retrieve the latest checkpoint from the contract, abort if empty + latest, hash, height, err := reg.contract.Contract().GetLatestCheckpoint(nil) + if err != nil || (latest == 0 && hash == [32]byte{}) { + return nil, 0 + } + local := reg.getLocal(latest) + + // The following scenarios may occur: + // + // * local node is out of sync so that it doesn't have the + // checkpoint which registered in the contract. + // * local checkpoint doesn't match with the registered one. + // + // In both cases, server won't send the **stable** checkpoint + // to the client(no worry, client can use hardcoded one instead). + if local.HashEqual(common.Hash(hash)) { + return &local, height.Uint64() + } + return nil, 0 +} + +// verifySigners recovers the signer addresses according to the signature and +// checks whether there are enough approvals to finalize the checkpoint. +func (reg *checkpointOracle) verifySigners(index uint64, hash [32]byte, signatures [][]byte) (bool, []common.Address) { + // Short circuit if the given signatures doesn't reach the threshold. + if len(signatures) < int(reg.config.Threshold) { + return false, nil + } + var ( + signers []common.Address + checked = make(map[common.Address]struct{}) + ) + for i := 0; i < len(signatures); i++ { + if len(signatures[i]) != 65 { + continue + } + // EIP 191 style signatures + // + // Arguments when calculating hash to validate + // 1: byte(0x19) - the initial 0x19 byte + // 2: byte(0) - the version byte (data with intended validator) + // 3: this - the validator address + // -- Application specific data + // 4 : checkpoint section_index (uint64) + // 5 : checkpoint hash (bytes32) + // hash = keccak256(checkpoint_index, section_head, cht_root, bloom_root) + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, index) + data := append([]byte{0x19, 0x00}, append(reg.config.Address.Bytes(), append(buf, hash[:]...)...)...) + signatures[i][64] -= 27 // Transform V from 27/28 to 0/1 according to the yellow paper for verification. + pubkey, err := crypto.Ecrecover(crypto.Keccak256(data), signatures[i]) + if err != nil { + return false, nil + } + var signer common.Address + copy(signer[:], crypto.Keccak256(pubkey[1:])[12:]) + if _, exist := checked[signer]; exist { + continue + } + for _, s := range reg.config.Signers { + if s == signer { + signers = append(signers, signer) + checked[signer] = struct{}{} + } + } + } + threshold := reg.config.Threshold + if uint64(len(signers)) < threshold { + log.Warn("Not enough signers to approve checkpoint", "signers", len(signers), "threshold", threshold) + return false, nil + } + return true, signers +} diff --git a/les/client.go b/les/client.go new file mode 100644 index 000000000000..c460f4c09d5d --- /dev/null +++ b/les/client.go @@ -0,0 +1,279 @@ +// 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 les implements the Light Ethereum Subprotocol. +package les + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/bloombits" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/eth/filters" + "github.com/ethereum/go-ethereum/eth/gasprice" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" +) + +type LightEthereum struct { + lesCommons + + reqDist *requestDistributor + retriever *retrieveManager + odr *LesOdr + relay *lesTxRelay + handler *clientHandler + txPool *light.TxPool + blockchain *light.LightChain + serverPool *serverPool + + bloomRequests chan chan *bloombits.Retrieval // Channel receiving bloom data retrieval requests + bloomIndexer *core.ChainIndexer // Bloom indexer operating during block imports + + ApiBackend *LesApiBackend + eventMux *event.TypeMux + engine consensus.Engine + accountManager *accounts.Manager + netRPCService *ethapi.PublicNetAPI +} + +func New(ctx *node.ServiceContext, config *eth.Config) (*LightEthereum, error) { + chainDb, err := ctx.OpenDatabase("lightchaindata", config.DatabaseCache, config.DatabaseHandles, "eth/db/chaindata/") + if err != nil { + return nil, err + } + chainConfig, genesisHash, genesisErr := core.SetupGenesisBlockWithOverride(chainDb, config.Genesis, + config.OverrideIstanbul, config.OverrideMuirGlacier) + if _, isCompat := genesisErr.(*params.ConfigCompatError); genesisErr != nil && !isCompat { + return nil, genesisErr + } + log.Info("Initialised chain configuration", "config", chainConfig) + + peers := newPeerSet() + leth := &LightEthereum{ + lesCommons: lesCommons{ + genesis: genesisHash, + config: config, + chainConfig: chainConfig, + iConfig: light.DefaultClientIndexerConfig, + chainDb: chainDb, + peers: peers, + closeCh: make(chan struct{}), + }, + eventMux: ctx.EventMux, + reqDist: newRequestDistributor(peers, &mclock.System{}), + accountManager: ctx.AccountManager, + engine: eth.CreateConsensusEngine(ctx, chainConfig, &config.Ethash, nil, false, chainDb), + bloomRequests: make(chan chan *bloombits.Retrieval), + bloomIndexer: eth.NewBloomIndexer(chainDb, params.BloomBitsBlocksClient, params.HelperTrieConfirmations), + serverPool: newServerPool(chainDb, config.UltraLightServers), + } + leth.retriever = newRetrieveManager(peers, leth.reqDist, leth.serverPool) + leth.relay = newLesTxRelay(peers, leth.retriever) + + leth.odr = NewLesOdr(chainDb, light.DefaultClientIndexerConfig, leth.retriever) + leth.chtIndexer = light.NewChtIndexer(chainDb, leth.odr, params.CHTFrequency, params.HelperTrieConfirmations) + leth.bloomTrieIndexer = light.NewBloomTrieIndexer(chainDb, leth.odr, params.BloomBitsBlocksClient, params.BloomTrieFrequency) + leth.odr.SetIndexers(leth.chtIndexer, leth.bloomTrieIndexer, leth.bloomIndexer) + + checkpoint := config.Checkpoint + if checkpoint == nil { + checkpoint = params.TrustedCheckpoints[genesisHash] + } + // Note: NewLightChain adds the trusted checkpoint so it needs an ODR with + // indexers already set but not started yet + if leth.blockchain, err = light.NewLightChain(leth.odr, leth.chainConfig, leth.engine, checkpoint); err != nil { + return nil, err + } + leth.chainReader = leth.blockchain + leth.txPool = light.NewTxPool(leth.chainConfig, leth.blockchain, leth.relay) + + // Set up checkpoint oracle. + oracle := config.CheckpointOracle + if oracle == nil { + oracle = params.CheckpointOracles[genesisHash] + } + leth.oracle = newCheckpointOracle(oracle, leth.localCheckpoint) + + // Note: AddChildIndexer starts the update process for the child + leth.bloomIndexer.AddChildIndexer(leth.bloomTrieIndexer) + leth.chtIndexer.Start(leth.blockchain) + leth.bloomIndexer.Start(leth.blockchain) + + leth.handler = newClientHandler(config.UltraLightServers, config.UltraLightFraction, checkpoint, leth) + if leth.handler.ulc != nil { + log.Warn("Ultra light client is enabled", "trustedNodes", len(leth.handler.ulc.keys), "minTrustedFraction", leth.handler.ulc.fraction) + leth.blockchain.DisableCheckFreq() + } + // 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) + leth.blockchain.SetHead(compat.RewindTo) + rawdb.WriteChainConfig(chainDb, genesisHash, chainConfig) + } + + leth.ApiBackend = &LesApiBackend{ctx.ExtRPCEnabled(), leth, nil} + gpoParams := config.GPO + if gpoParams.Default == nil { + gpoParams.Default = config.Miner.GasPrice + } + leth.ApiBackend.gpo = gasprice.NewOracle(leth.ApiBackend, gpoParams) + + return leth, nil +} + +type LightDummyAPI struct{} + +// Etherbase is the address that mining rewards will be send to +func (s *LightDummyAPI) Etherbase() (common.Address, error) { + return common.Address{}, fmt.Errorf("mining is not supported in light mode") +} + +// Coinbase is the address that mining rewards will be send to (alias for Etherbase) +func (s *LightDummyAPI) Coinbase() (common.Address, error) { + return common.Address{}, fmt.Errorf("mining is not supported in light mode") +} + +// Hashrate returns the POW hashrate +func (s *LightDummyAPI) Hashrate() hexutil.Uint { + return 0 +} + +// Mining returns an indication if this node is currently mining. +func (s *LightDummyAPI) Mining() bool { + return false +} + +// APIs returns the collection of RPC services the ethereum package offers. +// NOTE, some of these services probably need to be moved to somewhere else. +func (s *LightEthereum) APIs() []rpc.API { + apis := ethapi.GetAPIs(s.ApiBackend) + apis = append(apis, s.engine.APIs(s.BlockChain().HeaderChain())...) + return append(apis, []rpc.API{ + { + Namespace: "eth", + Version: "1.0", + Service: &LightDummyAPI{}, + Public: true, + }, { + Namespace: "eth", + Version: "1.0", + Service: downloader.NewPublicDownloaderAPI(s.handler.downloader, s.eventMux), + Public: true, + }, { + Namespace: "eth", + Version: "1.0", + Service: filters.NewPublicFilterAPI(s.ApiBackend, true), + Public: true, + }, { + Namespace: "net", + Version: "1.0", + Service: s.netRPCService, + Public: true, + }, { + Namespace: "les", + Version: "1.0", + Service: NewPrivateLightAPI(&s.lesCommons), + Public: false, + }, + }...) +} + +func (s *LightEthereum) ResetWithGenesisBlock(gb *types.Block) { + s.blockchain.ResetWithGenesisBlock(gb) +} + +func (s *LightEthereum) BlockChain() *light.LightChain { return s.blockchain } +func (s *LightEthereum) TxPool() *light.TxPool { return s.txPool } +func (s *LightEthereum) Engine() consensus.Engine { return s.engine } +func (s *LightEthereum) LesVersion() int { return int(ClientProtocolVersions[0]) } +func (s *LightEthereum) Downloader() *downloader.Downloader { return s.handler.downloader } +func (s *LightEthereum) EventMux() *event.TypeMux { return s.eventMux } + +// Protocols implements node.Service, returning all the currently configured +// network protocols to start. +func (s *LightEthereum) Protocols() []p2p.Protocol { + return s.makeProtocols(ClientProtocolVersions, s.handler.runPeer, func(id enode.ID) interface{} { + if p := s.peers.Peer(peerIdToString(id)); p != nil { + return p.Info() + } + return nil + }) +} + +// Start implements node.Service, starting all internal goroutines needed by the +// light ethereum protocol implementation. +func (s *LightEthereum) Start(srvr *p2p.Server) error { + log.Warn("Light client mode is an experimental feature") + + // Start bloom request workers. + s.wg.Add(bloomServiceThreads) + s.startBloomHandlers(params.BloomBitsBlocksClient) + + s.netRPCService = ethapi.NewPublicNetAPI(srvr, s.config.NetworkId) + + // clients are searching for the first advertised protocol in the list + protocolVersion := AdvertiseProtocolVersions[0] + s.serverPool.start(srvr, lesTopic(s.blockchain.Genesis().Hash(), protocolVersion)) + return nil +} + +// Stop implements node.Service, terminating all internal goroutines used by the +// Ethereum protocol. +func (s *LightEthereum) Stop() error { + close(s.closeCh) + s.peers.Close() + s.reqDist.close() + s.odr.Stop() + s.relay.Stop() + s.bloomIndexer.Close() + s.chtIndexer.Close() + s.blockchain.Stop() + s.handler.stop() + s.txPool.Stop() + s.engine.Close() + s.eventMux.Stop() + s.serverPool.stop() + s.chainDb.Close() + s.wg.Wait() + log.Info("Light ethereum stopped") + return nil +} + +// SetClient sets the rpc client and binds the registrar contract. +func (s *LightEthereum) SetContractBackend(backend bind.ContractBackend) { + if s.oracle == nil { + return + } + s.oracle.start(backend) +} diff --git a/les/client_handler.go b/les/client_handler.go new file mode 100644 index 000000000000..7fdb1657194c --- /dev/null +++ b/les/client_handler.go @@ -0,0 +1,403 @@ +// Copyright 2019 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 ( + "math/big" + "sync" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/params" +) + +// clientHandler is responsible for receiving and processing all incoming server +// responses. +type clientHandler struct { + ulc *ulc + checkpoint *params.TrustedCheckpoint + fetcher *lightFetcher + downloader *downloader.Downloader + backend *LightEthereum + + closeCh chan struct{} + wg sync.WaitGroup // WaitGroup used to track all connected peers. + syncDone func() // Test hooks when syncing is done. +} + +func newClientHandler(ulcServers []string, ulcFraction int, checkpoint *params.TrustedCheckpoint, backend *LightEthereum) *clientHandler { + handler := &clientHandler{ + checkpoint: checkpoint, + backend: backend, + closeCh: make(chan struct{}), + } + if ulcServers != nil { + ulc, err := newULC(ulcServers, ulcFraction) + if err != nil { + log.Error("Failed to initialize ultra light client") + } + handler.ulc = ulc + log.Info("Enable ultra light client mode") + } + var height uint64 + if checkpoint != nil { + height = (checkpoint.SectionIndex+1)*params.CHTFrequency - 1 + } + handler.fetcher = newLightFetcher(handler) + handler.downloader = downloader.New(height, backend.chainDb, nil, backend.eventMux, nil, backend.blockchain, handler.removePeer) + handler.backend.peers.notify((*downloaderPeerNotify)(handler)) + return handler +} + +func (h *clientHandler) stop() { + close(h.closeCh) + h.downloader.Terminate() + h.fetcher.close() + h.wg.Wait() +} + +// runPeer is the p2p protocol run function for the given version. +func (h *clientHandler) runPeer(version uint, p *p2p.Peer, rw p2p.MsgReadWriter) error { + trusted := false + if h.ulc != nil { + trusted = h.ulc.trusted(p.ID()) + } + peer := newPeer(int(version), h.backend.config.NetworkId, trusted, p, newMeteredMsgWriter(rw, int(version))) + peer.poolEntry = h.backend.serverPool.connect(peer, peer.Node()) + if peer.poolEntry == nil { + return p2p.DiscRequested + } + h.wg.Add(1) + defer h.wg.Done() + err := h.handle(peer) + h.backend.serverPool.disconnect(peer.poolEntry) + return err +} + +func (h *clientHandler) handle(p *peer) error { + if h.backend.peers.Len() >= h.backend.config.LightPeers && !p.Peer.Info().Network.Trusted { + return p2p.DiscTooManyPeers + } + p.Log().Debug("Light Ethereum peer connected", "name", p.Name()) + + // Execute the LES handshake + var ( + head = h.backend.blockchain.CurrentHeader() + hash = head.Hash() + number = head.Number.Uint64() + td = h.backend.blockchain.GetTd(hash, number) + ) + if err := p.Handshake(td, hash, number, h.backend.blockchain.Genesis().Hash(), nil); err != nil { + p.Log().Debug("Light Ethereum handshake failed", "err", err) + return err + } + // Register the peer locally + if err := h.backend.peers.Register(p); err != nil { + p.Log().Error("Light Ethereum peer registration failed", "err", err) + return err + } + serverConnectionGauge.Update(int64(h.backend.peers.Len())) + + connectedAt := mclock.Now() + defer func() { + h.backend.peers.Unregister(p.id) + connectionTimer.Update(time.Duration(mclock.Now() - connectedAt)) + serverConnectionGauge.Update(int64(h.backend.peers.Len())) + }() + + h.fetcher.announce(p, p.headInfo) + + // pool entry can be nil during the unit test. + if p.poolEntry != nil { + h.backend.serverPool.registered(p.poolEntry) + } + // Spawn a main loop to handle all incoming messages. + for { + if err := h.handleMsg(p); err != nil { + p.Log().Debug("Light Ethereum message handling failed", "err", err) + p.fcServer.DumpLogs() + return err + } + } +} + +// handleMsg is invoked whenever an inbound message is received from a remote +// peer. The remote connection is torn down upon returning any error. +func (h *clientHandler) handleMsg(p *peer) error { + // Read the next message from the remote peer, and ensure it's fully consumed + msg, err := p.rw.ReadMsg() + if err != nil { + return err + } + p.Log().Trace("Light Ethereum message arrived", "code", msg.Code, "bytes", msg.Size) + + if msg.Size > ProtocolMaxMsgSize { + return errResp(ErrMsgTooLarge, "%v > %v", msg.Size, ProtocolMaxMsgSize) + } + defer msg.Discard() + + var deliverMsg *Msg + + // Handle the message depending on its contents + switch msg.Code { + case AnnounceMsg: + p.Log().Trace("Received announce message") + var req announceData + if err := msg.Decode(&req); err != nil { + return errResp(ErrDecode, "%v: %v", msg, err) + } + if err := req.sanityCheck(); err != nil { + return err + } + update, size := req.Update.decode() + if p.rejectUpdate(size) { + return errResp(ErrRequestRejected, "") + } + p.updateFlowControl(update) + + if req.Hash != (common.Hash{}) { + if p.announceType == announceTypeNone { + return errResp(ErrUnexpectedResponse, "") + } + if p.announceType == announceTypeSigned { + if err := req.checkSignature(p.ID(), update); 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) + h.fetcher.announce(p, &req) + } + case BlockHeadersMsg: + p.Log().Trace("Received block header response message") + var resp struct { + ReqID, BV uint64 + Headers []*types.Header + } + if err := msg.Decode(&resp); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + p.fcServer.ReceivedReply(resp.ReqID, resp.BV) + if h.fetcher.requestedID(resp.ReqID) { + h.fetcher.deliverHeaders(p, resp.ReqID, resp.Headers) + } else { + if err := h.downloader.DeliverHeaders(p.id, resp.Headers); err != nil { + log.Debug("Failed to deliver headers", "err", err) + } + } + case BlockBodiesMsg: + p.Log().Trace("Received block bodies response") + var resp struct { + ReqID, BV uint64 + Data []*types.Body + } + if err := msg.Decode(&resp); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + p.fcServer.ReceivedReply(resp.ReqID, resp.BV) + deliverMsg = &Msg{ + MsgType: MsgBlockBodies, + ReqID: resp.ReqID, + Obj: resp.Data, + } + case CodeMsg: + p.Log().Trace("Received code response") + var resp struct { + ReqID, BV uint64 + Data [][]byte + } + if err := msg.Decode(&resp); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + p.fcServer.ReceivedReply(resp.ReqID, resp.BV) + deliverMsg = &Msg{ + MsgType: MsgCode, + ReqID: resp.ReqID, + Obj: resp.Data, + } + case ReceiptsMsg: + p.Log().Trace("Received receipts response") + var resp struct { + ReqID, BV uint64 + Receipts []types.Receipts + } + if err := msg.Decode(&resp); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + p.fcServer.ReceivedReply(resp.ReqID, resp.BV) + deliverMsg = &Msg{ + MsgType: MsgReceipts, + ReqID: resp.ReqID, + Obj: resp.Receipts, + } + case ProofsV2Msg: + p.Log().Trace("Received les/2 proofs response") + 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.ReceivedReply(resp.ReqID, resp.BV) + deliverMsg = &Msg{ + MsgType: MsgProofsV2, + ReqID: resp.ReqID, + Obj: resp.Data, + } + case HelperTrieProofsMsg: + 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.ReceivedReply(resp.ReqID, resp.BV) + deliverMsg = &Msg{ + MsgType: MsgHelperTrieProofs, + ReqID: resp.ReqID, + Obj: resp.Data, + } + case TxStatusMsg: + p.Log().Trace("Received tx status response") + var resp struct { + ReqID, BV uint64 + Status []light.TxStatus + } + if err := msg.Decode(&resp); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + p.fcServer.ReceivedReply(resp.ReqID, resp.BV) + deliverMsg = &Msg{ + MsgType: MsgTxStatus, + ReqID: resp.ReqID, + Obj: resp.Status, + } + case StopMsg: + p.freezeServer(true) + h.backend.retriever.frozen(p) + p.Log().Debug("Service stopped") + case ResumeMsg: + var bv uint64 + if err := msg.Decode(&bv); err != nil { + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + p.fcServer.ResumeFreeze(bv) + p.freezeServer(false) + p.Log().Debug("Service resumed") + default: + p.Log().Trace("Received invalid message", "code", msg.Code) + return errResp(ErrInvalidMsgCode, "%v", msg.Code) + } + // Deliver the received response to retriever. + if deliverMsg != nil { + if err := h.backend.retriever.deliver(p, deliverMsg); err != nil { + p.responseErrors++ + if p.responseErrors > maxResponseErrors { + return err + } + } + } + return nil +} + +func (h *clientHandler) removePeer(id string) { + h.backend.peers.Unregister(id) +} + +type peerConnection struct { + handler *clientHandler + peer *peer +} + +func (pc *peerConnection) Head() (common.Hash, *big.Int) { + return pc.peer.HeadAndTd() +} + +func (pc *peerConnection) RequestHeadersByHash(origin common.Hash, amount int, skip int, reverse bool) error { + rq := &distReq{ + getCost: func(dp distPeer) uint64 { + peer := dp.(*peer) + return peer.GetRequestCost(GetBlockHeadersMsg, amount) + }, + canSend: func(dp distPeer) bool { + return dp.(*peer) == pc.peer + }, + request: func(dp distPeer) func() { + reqID := genReqID() + peer := dp.(*peer) + cost := peer.GetRequestCost(GetBlockHeadersMsg, amount) + peer.fcServer.QueuedRequest(reqID, cost) + return func() { peer.RequestHeadersByHash(reqID, cost, origin, amount, skip, reverse) } + }, + } + _, ok := <-pc.handler.backend.reqDist.queue(rq) + if !ok { + return light.ErrNoPeers + } + return nil +} + +func (pc *peerConnection) RequestHeadersByNumber(origin uint64, amount int, skip int, reverse bool) error { + rq := &distReq{ + getCost: func(dp distPeer) uint64 { + peer := dp.(*peer) + return peer.GetRequestCost(GetBlockHeadersMsg, amount) + }, + canSend: func(dp distPeer) bool { + return dp.(*peer) == pc.peer + }, + request: func(dp distPeer) func() { + reqID := genReqID() + peer := dp.(*peer) + cost := peer.GetRequestCost(GetBlockHeadersMsg, amount) + peer.fcServer.QueuedRequest(reqID, cost) + return func() { peer.RequestHeadersByNumber(reqID, cost, origin, amount, skip, reverse) } + }, + } + _, ok := <-pc.handler.backend.reqDist.queue(rq) + if !ok { + return light.ErrNoPeers + } + return nil +} + +// downloaderPeerNotify implements peerSetNotify +type downloaderPeerNotify clientHandler + +func (d *downloaderPeerNotify) registerPeer(p *peer) { + h := (*clientHandler)(d) + pc := &peerConnection{ + handler: h, + peer: p, + } + h.downloader.RegisterLightPeer(p.id, ethVersion, pc) +} + +func (d *downloaderPeerNotify) unregisterPeer(p *peer) { + h := (*clientHandler)(d) + h.downloader.UnregisterPeer(p.id) +} diff --git a/les/clientpool.go b/les/clientpool.go new file mode 100644 index 000000000000..da76f08b91fd --- /dev/null +++ b/les/clientpool.go @@ -0,0 +1,862 @@ +// Copyright 2019 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 ( + "bytes" + "encoding/binary" + "fmt" + "io" + "math" + "sync" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/common/prque" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/rlp" + lru "github.com/hashicorp/golang-lru" +) + +const ( + negBalanceExpTC = time.Hour // time constant for exponentially reducing negative balance + fixedPointMultiplier = 0x1000000 // constant to convert logarithms to fixed point format + lazyQueueRefresh = time.Second * 10 // refresh period of the connected queue + persistCumulativeTimeRefresh = time.Minute * 5 // refresh period of the cumulative running time persistence + posBalanceCacheLimit = 8192 // the maximum number of cached items in positive balance queue + negBalanceCacheLimit = 8192 // the maximum number of cached items in negative balance queue + + // connectedBias is applied to already connected clients So that + // already connected client won't be kicked out very soon and we + // can ensure all connected clients can have enough time to request + // or sync some data. + // + // todo(rjl493456442) make it configurable. It can be the option of + // free trial time! + connectedBias = time.Minute * 3 +) + +// clientPool implements a client database that assigns a priority to each client +// based on a positive and negative balance. Positive balance is externally assigned +// to prioritized clients and is decreased with connection time and processed +// requests (unless the price factors are zero). If the positive balance is zero +// then negative balance is accumulated. +// +// Balance tracking and priority calculation for connected clients is done by +// balanceTracker. connectedQueue ensures that clients with the lowest positive or +// highest negative balance get evicted when the total capacity allowance is full +// and new clients with a better balance want to connect. +// +// Already connected nodes receive a small bias in their favor in order to avoid +// accepting and instantly kicking out clients. In theory, we try to ensure that +// each client can have several minutes of connection time. +// +// Balances of disconnected clients are stored in nodeDB including positive balance +// and negative banalce. Negative balance is transformed into a logarithmic form +// with a constantly shifting linear offset in order to implement an exponential +// decrease. Besides nodeDB will have a background thread to check the negative +// balance of disconnected client. If the balance is low enough, then the record +// will be dropped. +type clientPool struct { + ndb *nodeDB + lock sync.Mutex + clock mclock.Clock + stopCh chan struct{} + closed bool + removePeer func(enode.ID) + + connectedMap map[enode.ID]*clientInfo + connectedQueue *prque.LazyQueue + + defaultPosFactors, defaultNegFactors priceFactors + + connLimit int // The maximum number of connections that clientpool can support + capLimit uint64 // The maximum cumulative capacity that clientpool can support + connectedCap uint64 // The sum of the capacity of the current clientpool connected + priorityConnected uint64 // The sum of the capacity of currently connected priority clients + freeClientCap uint64 // The capacity value of each free client + startTime mclock.AbsTime // The timestamp at which the clientpool started running + cumulativeTime int64 // The cumulative running time of clientpool at the start point. + disableBias bool // Disable connection bias(used in testing) +} + +// clientPeer represents a client in the pool. +// Positive balances are assigned to node key while negative balances are assigned +// to freeClientId. Currently network IP address without port is used because +// clients have a limited access to IP addresses while new node keys can be easily +// generated so it would be useless to assign a negative value to them. +type clientPeer interface { + ID() enode.ID + freeClientId() string + updateCapacity(uint64) + freezeClient() +} + +// clientInfo represents a connected client +type clientInfo struct { + address string + id enode.ID + connectedAt mclock.AbsTime + capacity uint64 + priority bool + pool *clientPool + peer clientPeer + queueIndex int // position in connectedQueue + balanceTracker balanceTracker + posFactors, negFactors priceFactors + balanceMetaInfo string +} + +// connSetIndex callback updates clientInfo item index in connectedQueue +func connSetIndex(a interface{}, index int) { + a.(*clientInfo).queueIndex = index +} + +// connPriority callback returns actual priority of clientInfo item in connectedQueue +func connPriority(a interface{}, now mclock.AbsTime) int64 { + c := a.(*clientInfo) + return c.balanceTracker.getPriority(now) +} + +// connMaxPriority callback returns estimated maximum priority of clientInfo item in connectedQueue +func connMaxPriority(a interface{}, until mclock.AbsTime) int64 { + c := a.(*clientInfo) + pri := c.balanceTracker.estimatedPriority(until, true) + c.balanceTracker.addCallback(balanceCallbackQueue, pri+1, func() { + c.pool.lock.Lock() + if c.queueIndex != -1 { + c.pool.connectedQueue.Update(c.queueIndex) + } + c.pool.lock.Unlock() + }) + return pri +} + +// priceFactors determine the pricing policy (may apply either to positive or +// negative balances which may have different factors). +// - timeFactor is cost unit per nanosecond of connection time +// - capacityFactor is cost unit per nanosecond of connection time per 1000000 capacity +// - requestFactor is cost unit per request "realCost" unit +type priceFactors struct { + timeFactor, capacityFactor, requestFactor float64 +} + +// newClientPool creates a new client pool +func newClientPool(db ethdb.Database, freeClientCap uint64, clock mclock.Clock, removePeer func(enode.ID)) *clientPool { + ndb := newNodeDB(db, clock) + pool := &clientPool{ + ndb: ndb, + clock: clock, + connectedMap: make(map[enode.ID]*clientInfo), + connectedQueue: prque.NewLazyQueue(connSetIndex, connPriority, connMaxPriority, clock, lazyQueueRefresh), + freeClientCap: freeClientCap, + removePeer: removePeer, + startTime: clock.Now(), + cumulativeTime: ndb.getCumulativeTime(), + stopCh: make(chan struct{}), + } + // If the negative balance of free client is even lower than 1, + // delete this entry. + ndb.nbEvictCallBack = func(now mclock.AbsTime, b negBalance) bool { + balance := math.Exp(float64(b.logValue-pool.logOffset(now)) / fixedPointMultiplier) + return balance <= 1 + } + go func() { + for { + select { + case <-clock.After(lazyQueueRefresh): + pool.lock.Lock() + pool.connectedQueue.Refresh() + pool.lock.Unlock() + case <-clock.After(persistCumulativeTimeRefresh): + pool.ndb.setCumulativeTime(pool.logOffset(clock.Now())) + case <-pool.stopCh: + return + } + } + }() + return pool +} + +// stop shuts the client pool down +func (f *clientPool) stop() { + close(f.stopCh) + f.lock.Lock() + f.closed = true + f.lock.Unlock() + f.ndb.setCumulativeTime(f.logOffset(f.clock.Now())) + f.ndb.close() +} + +// connect should be called after a successful handshake. If the connection was +// rejected, there is no need to call disconnect. +func (f *clientPool) connect(peer clientPeer, capacity uint64) bool { + f.lock.Lock() + defer f.lock.Unlock() + + // Short circuit if clientPool is already closed. + if f.closed { + return false + } + // Dedup connected peers. + id, freeID := peer.ID(), peer.freeClientId() + if _, ok := f.connectedMap[id]; ok { + clientRejectedMeter.Mark(1) + log.Debug("Client already connected", "address", freeID, "id", peerIdToString(id)) + return false + } + // Create a clientInfo but do not add it yet + var ( + posBalance uint64 + negBalance uint64 + now = f.clock.Now() + ) + pb := f.ndb.getOrNewPB(id) + posBalance = pb.value + + nb := f.ndb.getOrNewNB(freeID) + if nb.logValue != 0 { + negBalance = uint64(math.Exp(float64(nb.logValue-f.logOffset(now))/fixedPointMultiplier) * float64(time.Second)) + } + e := &clientInfo{ + pool: f, + peer: peer, + address: freeID, + queueIndex: -1, + id: id, + connectedAt: now, + priority: posBalance != 0, + posFactors: f.defaultPosFactors, + negFactors: f.defaultNegFactors, + balanceMetaInfo: pb.meta, + } + // If the client is a free client, assign with a low free capacity, + // Otherwise assign with the given value(priority client) + if !e.priority || capacity == 0 { + capacity = f.freeClientCap + } + e.capacity = capacity + + // Starts a balance tracker + e.balanceTracker.init(f.clock, capacity) + e.balanceTracker.setBalance(posBalance, negBalance) + e.updatePriceFactors() + + // If the number of clients already connected in the clientpool exceeds its + // capacity, evict some clients with lowest priority. + // + // If the priority of the newly added client is lower than the priority of + // all connected clients, the client is rejected. + newCapacity := f.connectedCap + capacity + newCount := f.connectedQueue.Size() + 1 + if newCapacity > f.capLimit || newCount > f.connLimit { + var ( + kickList []*clientInfo + kickPriority int64 + ) + f.connectedQueue.MultiPop(func(data interface{}, priority int64) bool { + c := data.(*clientInfo) + kickList = append(kickList, c) + kickPriority = priority + newCapacity -= c.capacity + newCount-- + return newCapacity > f.capLimit || newCount > f.connLimit + }) + bias := connectedBias + if f.disableBias { + bias = 0 + } + if newCapacity > f.capLimit || newCount > f.connLimit || (e.balanceTracker.estimatedPriority(now+mclock.AbsTime(bias), false)-kickPriority) > 0 { + for _, c := range kickList { + f.connectedQueue.Push(c) + } + clientRejectedMeter.Mark(1) + log.Debug("Client rejected", "address", freeID, "id", peerIdToString(id)) + return false + } + // accept new client, drop old ones + for _, c := range kickList { + f.dropClient(c, now, true) + } + } + + // Register new client to connection queue. + f.connectedMap[id] = e + f.connectedQueue.Push(e) + f.connectedCap += e.capacity + + // If the current client is a paid client, monitor the status of client, + // downgrade it to normal client if positive balance is used up. + if e.priority { + f.priorityConnected += capacity + e.balanceTracker.addCallback(balanceCallbackZero, 0, func() { f.balanceExhausted(id) }) + } + // If the capacity of client is not the default value(free capacity), notify + // it to update capacity. + if e.capacity != f.freeClientCap { + e.peer.updateCapacity(e.capacity) + } + totalConnectedGauge.Update(int64(f.connectedCap)) + clientConnectedMeter.Mark(1) + log.Debug("Client accepted", "address", freeID) + return true +} + +// disconnect should be called when a connection is terminated. If the disconnection +// was initiated by the pool itself using disconnectFn then calling disconnect is +// not necessary but permitted. +func (f *clientPool) disconnect(p clientPeer) { + f.lock.Lock() + defer f.lock.Unlock() + + // Short circuit if client pool is already closed. + if f.closed { + return + } + // Short circuit if the peer hasn't been registered. + e := f.connectedMap[p.ID()] + if e == nil { + log.Debug("Client not connected", "address", p.freeClientId(), "id", peerIdToString(p.ID())) + return + } + f.dropClient(e, f.clock.Now(), false) +} + +// forClients iterates through a list of clients, calling the callback for each one. +// If a client is not connected then clientInfo is nil. If the specified list is empty +// then the callback is called for all connected clients. +func (f *clientPool) forClients(ids []enode.ID, callback func(*clientInfo, enode.ID) error) error { + f.lock.Lock() + defer f.lock.Unlock() + + if len(ids) > 0 { + for _, id := range ids { + if err := callback(f.connectedMap[id], id); err != nil { + return err + } + } + } else { + for _, c := range f.connectedMap { + if err := callback(c, c.id); err != nil { + return err + } + } + } + return nil +} + +// setDefaultFactors sets the default price factors applied to subsequently connected clients +func (f *clientPool) setDefaultFactors(posFactors, negFactors priceFactors) { + f.lock.Lock() + defer f.lock.Unlock() + + f.defaultPosFactors = posFactors + f.defaultNegFactors = negFactors +} + +// dropClient removes a client from the connected queue and finalizes its balance. +// If kick is true then it also initiates the disconnection. +func (f *clientPool) dropClient(e *clientInfo, now mclock.AbsTime, kick bool) { + if _, ok := f.connectedMap[e.id]; !ok { + return + } + f.finalizeBalance(e, now) + f.connectedQueue.Remove(e.queueIndex) + delete(f.connectedMap, e.id) + f.connectedCap -= e.capacity + if e.priority { + f.priorityConnected -= e.capacity + } + totalConnectedGauge.Update(int64(f.connectedCap)) + if kick { + clientKickedMeter.Mark(1) + log.Debug("Client kicked out", "address", e.address) + f.removePeer(e.id) + } else { + clientDisconnectedMeter.Mark(1) + log.Debug("Client disconnected", "address", e.address) + } +} + +// capacityInfo returns the total capacity allowance, the total capacity of connected +// clients and the total capacity of connected and prioritized clients +func (f *clientPool) capacityInfo() (uint64, uint64, uint64) { + f.lock.Lock() + defer f.lock.Unlock() + + return f.capLimit, f.connectedCap, f.priorityConnected +} + +// finalizeBalance stops the balance tracker, retrieves the final balances and +// stores them in posBalanceQueue and negBalanceQueue +func (f *clientPool) finalizeBalance(c *clientInfo, now mclock.AbsTime) { + c.balanceTracker.stop(now) + pos, neg := c.balanceTracker.getBalance(now) + + pb, nb := f.ndb.getOrNewPB(c.id), f.ndb.getOrNewNB(c.address) + pb.value = pos + f.ndb.setPB(c.id, pb) + + neg /= uint64(time.Second) // Convert the expanse to second level. + if neg > 1 { + nb.logValue = int64(math.Log(float64(neg))*fixedPointMultiplier) + f.logOffset(now) + f.ndb.setNB(c.address, nb) + } else { + f.ndb.delNB(c.address) // Negative balance is small enough, drop it directly. + } +} + +// balanceExhausted callback is called by balanceTracker when positive balance is exhausted. +// It revokes priority status and also reduces the client capacity if necessary. +func (f *clientPool) balanceExhausted(id enode.ID) { + f.lock.Lock() + defer f.lock.Unlock() + + c := f.connectedMap[id] + if c == nil || !c.priority { + return + } + if c.priority { + f.priorityConnected -= c.capacity + } + c.priority = false + if c.capacity != f.freeClientCap { + f.connectedCap += f.freeClientCap - c.capacity + totalConnectedGauge.Update(int64(f.connectedCap)) + c.capacity = f.freeClientCap + c.balanceTracker.setCapacity(c.capacity) + c.peer.updateCapacity(c.capacity) + } + pb := f.ndb.getOrNewPB(id) + pb.value = 0 + f.ndb.setPB(id, pb) +} + +// setConnLimit sets the maximum number and total capacity of connected clients, +// dropping some of them if necessary. +func (f *clientPool) setLimits(totalConn int, totalCap uint64) { + f.lock.Lock() + defer f.lock.Unlock() + + f.connLimit = totalConn + f.capLimit = totalCap + if f.connectedCap > f.capLimit || f.connectedQueue.Size() > f.connLimit { + f.connectedQueue.MultiPop(func(data interface{}, priority int64) bool { + f.dropClient(data.(*clientInfo), mclock.Now(), true) + return f.connectedCap > f.capLimit || f.connectedQueue.Size() > f.connLimit + }) + } +} + +// setCapacity sets the assigned capacity of a connected client +func (f *clientPool) setCapacity(c *clientInfo, capacity uint64) error { + if f.connectedMap[c.id] != c { + return fmt.Errorf("client %064x is not connected", c.id[:]) + } + if c.capacity == capacity { + return nil + } + if !c.priority { + return errNoPriority + } + oldCapacity := c.capacity + c.capacity = capacity + f.connectedCap += capacity - oldCapacity + c.balanceTracker.setCapacity(capacity) + f.connectedQueue.Update(c.queueIndex) + if f.connectedCap > f.capLimit { + var kickList []*clientInfo + kick := true + f.connectedQueue.MultiPop(func(data interface{}, priority int64) bool { + client := data.(*clientInfo) + kickList = append(kickList, client) + f.connectedCap -= client.capacity + if client == c { + kick = false + } + return kick && (f.connectedCap > f.capLimit) + }) + if kick { + now := mclock.Now() + for _, c := range kickList { + f.dropClient(c, now, true) + } + } else { + c.capacity = oldCapacity + c.balanceTracker.setCapacity(oldCapacity) + for _, c := range kickList { + f.connectedCap += c.capacity + f.connectedQueue.Push(c) + } + return errNoPriority + } + } + totalConnectedGauge.Update(int64(f.connectedCap)) + f.priorityConnected += capacity - oldCapacity + c.updatePriceFactors() + c.peer.updateCapacity(c.capacity) + return nil +} + +// requestCost feeds request cost after serving a request from the given peer. +func (f *clientPool) requestCost(p *peer, cost uint64) { + f.lock.Lock() + defer f.lock.Unlock() + + info, exist := f.connectedMap[p.ID()] + if !exist || f.closed { + return + } + info.balanceTracker.requestCost(cost) +} + +// logOffset calculates the time-dependent offset for the logarithmic +// representation of negative balance +// +// From another point of view, the result returned by the function represents +// the total time that the clientpool is cumulatively running(total_hours/multiplier). +func (f *clientPool) logOffset(now mclock.AbsTime) int64 { + // Note: fixedPointMultiplier acts as a multiplier here; the reason for dividing the divisor + // is to avoid int64 overflow. We assume that int64(negBalanceExpTC) >> fixedPointMultiplier. + cumulativeTime := int64((time.Duration(now - f.startTime)) / (negBalanceExpTC / fixedPointMultiplier)) + return f.cumulativeTime + cumulativeTime +} + +// setClientPriceFactors sets the pricing factors for an individual connected client +func (c *clientInfo) updatePriceFactors() { + c.balanceTracker.setFactors(true, c.negFactors.timeFactor+float64(c.capacity)*c.negFactors.capacityFactor/1000000, c.negFactors.requestFactor) + c.balanceTracker.setFactors(false, c.posFactors.timeFactor+float64(c.capacity)*c.posFactors.capacityFactor/1000000, c.posFactors.requestFactor) +} + +// getPosBalance retrieves a single positive balance entry from cache or the database +func (f *clientPool) getPosBalance(id enode.ID) posBalance { + f.lock.Lock() + defer f.lock.Unlock() + + return f.ndb.getOrNewPB(id) +} + +// addBalance updates the balance of a client (either overwrites it or adds to it). +// It also updates the balance meta info string. +func (f *clientPool) addBalance(id enode.ID, amount int64, meta string) (uint64, uint64, error) { + f.lock.Lock() + defer f.lock.Unlock() + + pb := f.ndb.getOrNewPB(id) + var negBalance uint64 + c := f.connectedMap[id] + if c != nil { + pb.value, negBalance = c.balanceTracker.getBalance(f.clock.Now()) + } + oldBalance := pb.value + if amount > 0 { + if amount > maxBalance || pb.value > maxBalance-uint64(amount) { + return oldBalance, oldBalance, errBalanceOverflow + } + pb.value += uint64(amount) + } else { + if uint64(-amount) > pb.value { + pb.value = 0 + } else { + pb.value -= uint64(-amount) + } + } + pb.meta = meta + f.ndb.setPB(id, pb) + if c != nil { + c.balanceTracker.setBalance(pb.value, negBalance) + if !c.priority && pb.value > 0 { + // The capacity should be adjusted based on the requirement, + // but we have no idea about the new capacity, need a second + // call to udpate it. + c.priority = true + f.priorityConnected += c.capacity + c.balanceTracker.addCallback(balanceCallbackZero, 0, func() { f.balanceExhausted(id) }) + } + // if balance is set to zero then reverting to non-priority status + // is handled by the balanceExhausted callback + c.balanceMetaInfo = meta + } + return oldBalance, pb.value, nil +} + +// posBalance represents a recently accessed positive balance entry +type posBalance struct { + value uint64 + meta string +} + +// EncodeRLP implements rlp.Encoder +func (e *posBalance) EncodeRLP(w io.Writer) error { + return rlp.Encode(w, []interface{}{e.value, e.meta}) +} + +// DecodeRLP implements rlp.Decoder +func (e *posBalance) DecodeRLP(s *rlp.Stream) error { + var entry struct { + Value uint64 + Meta string + } + if err := s.Decode(&entry); err != nil { + return err + } + e.value = entry.Value + e.meta = entry.Meta + return nil +} + +// negBalance represents a negative balance entry of a disconnected client +type negBalance struct{ logValue int64 } + +// EncodeRLP implements rlp.Encoder +func (e *negBalance) EncodeRLP(w io.Writer) error { + return rlp.Encode(w, []interface{}{uint64(e.logValue)}) +} + +// DecodeRLP implements rlp.Decoder +func (e *negBalance) DecodeRLP(s *rlp.Stream) error { + var entry struct { + LogValue uint64 + } + if err := s.Decode(&entry); err != nil { + return err + } + e.logValue = int64(entry.LogValue) + return nil +} + +const ( + // nodeDBVersion is the version identifier of the node data in db + // + // Changelog: + // * Replace `lastTotal` with `meta` in positive balance: version 0=>1 + nodeDBVersion = 1 + + // dbCleanupCycle is the cycle of db for useless data cleanup + dbCleanupCycle = time.Hour +) + +var ( + positiveBalancePrefix = []byte("pb:") // dbVersion(uint16 big endian) + positiveBalancePrefix + id -> balance + negativeBalancePrefix = []byte("nb:") // dbVersion(uint16 big endian) + negativeBalancePrefix + ip -> balance + cumulativeRunningTimeKey = []byte("cumulativeTime:") // dbVersion(uint16 big endian) + cumulativeRunningTimeKey -> cumulativeTime +) + +type nodeDB struct { + db ethdb.Database + pcache *lru.Cache + ncache *lru.Cache + auxbuf []byte // 37-byte auxiliary buffer for key encoding + verbuf [2]byte // 2-byte auxiliary buffer for db version + nbEvictCallBack func(mclock.AbsTime, negBalance) bool // Callback to determine whether the negative balance can be evicted. + clock mclock.Clock + closeCh chan struct{} + cleanupHook func() // Test hook used for testing +} + +func newNodeDB(db ethdb.Database, clock mclock.Clock) *nodeDB { + pcache, _ := lru.New(posBalanceCacheLimit) + ncache, _ := lru.New(negBalanceCacheLimit) + ndb := &nodeDB{ + db: db, + pcache: pcache, + ncache: ncache, + auxbuf: make([]byte, 37), + clock: clock, + closeCh: make(chan struct{}), + } + binary.BigEndian.PutUint16(ndb.verbuf[:], uint16(nodeDBVersion)) + go ndb.expirer() + return ndb +} + +func (db *nodeDB) close() { + close(db.closeCh) +} + +func (db *nodeDB) key(id []byte, neg bool) []byte { + prefix := positiveBalancePrefix + if neg { + prefix = negativeBalancePrefix + } + if len(prefix)+len(db.verbuf)+len(id) > len(db.auxbuf) { + db.auxbuf = append(db.auxbuf, make([]byte, len(prefix)+len(db.verbuf)+len(id)-len(db.auxbuf))...) + } + copy(db.auxbuf[:len(db.verbuf)], db.verbuf[:]) + copy(db.auxbuf[len(db.verbuf):len(db.verbuf)+len(prefix)], prefix) + copy(db.auxbuf[len(prefix)+len(db.verbuf):len(prefix)+len(db.verbuf)+len(id)], id) + return db.auxbuf[:len(prefix)+len(db.verbuf)+len(id)] +} + +func (db *nodeDB) getCumulativeTime() int64 { + blob, err := db.db.Get(append(cumulativeRunningTimeKey, db.verbuf[:]...)) + if err != nil || len(blob) == 0 { + return 0 + } + return int64(binary.BigEndian.Uint64(blob)) +} + +func (db *nodeDB) setCumulativeTime(v int64) { + binary.BigEndian.PutUint64(db.auxbuf[:8], uint64(v)) + db.db.Put(append(cumulativeRunningTimeKey, db.verbuf[:]...), db.auxbuf[:8]) +} + +func (db *nodeDB) getOrNewPB(id enode.ID) posBalance { + key := db.key(id.Bytes(), false) + item, exist := db.pcache.Get(string(key)) + if exist { + return item.(posBalance) + } + var balance posBalance + if enc, err := db.db.Get(key); err == nil { + if err := rlp.DecodeBytes(enc, &balance); err != nil { + log.Error("Failed to decode positive balance", "err", err) + } + } + db.pcache.Add(string(key), balance) + return balance +} + +func (db *nodeDB) setPB(id enode.ID, b posBalance) { + if b.value == 0 && len(b.meta) == 0 { + db.delPB(id) + return + } + key := db.key(id.Bytes(), false) + enc, err := rlp.EncodeToBytes(&(b)) + if err != nil { + log.Error("Failed to encode positive balance", "err", err) + return + } + db.db.Put(key, enc) + db.pcache.Add(string(key), b) +} + +func (db *nodeDB) delPB(id enode.ID) { + key := db.key(id.Bytes(), false) + db.db.Delete(key) + db.pcache.Remove(string(key)) +} + +// getPosBalanceIDs returns a lexicographically ordered list of IDs of accounts +// with a positive balance +func (db *nodeDB) getPosBalanceIDs(start, stop enode.ID, maxCount int) (result []enode.ID) { + if maxCount <= 0 { + return + } + it := db.db.NewIteratorWithStart(db.key(start.Bytes(), false)) + defer it.Release() + for i := len(stop[:]) - 1; i >= 0; i-- { + stop[i]-- + if stop[i] != 255 { + break + } + } + stopKey := db.key(stop.Bytes(), false) + keyLen := len(stopKey) + + for it.Next() { + var id enode.ID + if len(it.Key()) != keyLen || bytes.Compare(it.Key(), stopKey) == 1 { + return + } + copy(id[:], it.Key()[keyLen-len(id):]) + result = append(result, id) + if len(result) == maxCount { + return + } + } + return +} + +func (db *nodeDB) getOrNewNB(id string) negBalance { + key := db.key([]byte(id), true) + item, exist := db.ncache.Get(string(key)) + if exist { + return item.(negBalance) + } + var balance negBalance + if enc, err := db.db.Get(key); err == nil { + if err := rlp.DecodeBytes(enc, &balance); err != nil { + log.Error("Failed to decode negative balance", "err", err) + } + } + db.ncache.Add(string(key), balance) + return balance +} + +func (db *nodeDB) setNB(id string, b negBalance) { + key := db.key([]byte(id), true) + enc, err := rlp.EncodeToBytes(&(b)) + if err != nil { + log.Error("Failed to encode negative balance", "err", err) + return + } + db.db.Put(key, enc) + db.ncache.Add(string(key), b) +} + +func (db *nodeDB) delNB(id string) { + key := db.key([]byte(id), true) + db.db.Delete(key) + db.ncache.Remove(string(key)) +} + +func (db *nodeDB) expirer() { + for { + select { + case <-db.clock.After(dbCleanupCycle): + db.expireNodes() + case <-db.closeCh: + return + } + } +} + +// expireNodes iterates the whole node db and checks whether the negative balance +// entry can deleted. +// +// The rationale behind this is: server doesn't need to keep the negative balance +// records if they are low enough. +func (db *nodeDB) expireNodes() { + var ( + visited int + deleted int + start = time.Now() + ) + iter := db.db.NewIteratorWithPrefix(append(db.verbuf[:], negativeBalancePrefix...)) + for iter.Next() { + visited += 1 + var balance negBalance + if err := rlp.DecodeBytes(iter.Value(), &balance); err != nil { + log.Error("Failed to decode negative balance", "err", err) + continue + } + if db.nbEvictCallBack != nil && db.nbEvictCallBack(db.clock.Now(), balance) { + deleted += 1 + db.db.Delete(iter.Key()) + } + } + // Invoke testing hook if it's not nil. + if db.cleanupHook != nil { + db.cleanupHook() + } + log.Debug("Expire nodes", "visited", visited, "deleted", deleted, "elapsed", common.PrettyDuration(time.Since(start))) +} diff --git a/les/clientpool_test.go b/les/clientpool_test.go new file mode 100644 index 000000000000..06f782ac96ef --- /dev/null +++ b/les/clientpool_test.go @@ -0,0 +1,543 @@ +// Copyright 2019 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 ( + "bytes" + "fmt" + "math" + "math/rand" + "reflect" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/p2p/enode" +) + +func TestClientPoolL10C100Free(t *testing.T) { + testClientPool(t, 10, 100, 0, true) +} + +func TestClientPoolL40C200Free(t *testing.T) { + testClientPool(t, 40, 200, 0, true) +} + +func TestClientPoolL100C300Free(t *testing.T) { + testClientPool(t, 100, 300, 0, true) +} + +func TestClientPoolL10C100P4(t *testing.T) { + testClientPool(t, 10, 100, 4, false) +} + +func TestClientPoolL40C200P30(t *testing.T) { + testClientPool(t, 40, 200, 30, false) +} + +func TestClientPoolL100C300P20(t *testing.T) { + testClientPool(t, 100, 300, 20, false) +} + +const testClientPoolTicks = 100000 + +type poolTestPeer int + +func (i poolTestPeer) ID() enode.ID { + return enode.ID{byte(i % 256), byte(i >> 8)} +} + +func (i poolTestPeer) freeClientId() string { + return fmt.Sprintf("addr #%d", i) +} + +func (i poolTestPeer) updateCapacity(uint64) {} + +type poolTestPeerWithCap struct { + poolTestPeer + + cap uint64 +} + +func (i *poolTestPeerWithCap) updateCapacity(cap uint64) { i.cap = cap } + +func (i poolTestPeer) freezeClient() {} + +func testClientPool(t *testing.T, connLimit, clientCount, paidCount int, randomDisconnect bool) { + rand.Seed(time.Now().UnixNano()) + var ( + clock mclock.Simulated + db = rawdb.NewMemoryDatabase() + connected = make([]bool, clientCount) + connTicks = make([]int, clientCount) + disconnCh = make(chan int, clientCount) + disconnFn = func(id enode.ID) { + disconnCh <- int(id[0]) + int(id[1])<<8 + } + pool = newClientPool(db, 1, &clock, disconnFn) + ) + pool.disableBias = true + pool.setLimits(connLimit, uint64(connLimit)) + pool.setDefaultFactors(priceFactors{1, 0, 1}, priceFactors{1, 0, 1}) + + // pool should accept new peers up to its connected limit + for i := 0; i < connLimit; i++ { + if pool.connect(poolTestPeer(i), 0) { + connected[i] = true + } else { + t.Fatalf("Test peer #%d rejected", i) + } + } + // randomly connect and disconnect peers, expect to have a similar total connection time at the end + for tickCounter := 0; tickCounter < testClientPoolTicks; tickCounter++ { + clock.Run(1 * time.Second) + + if tickCounter == testClientPoolTicks/4 { + // give a positive balance to some of the peers + amount := testClientPoolTicks / 2 * int64(time.Second) // enough for half of the simulation period + for i := 0; i < paidCount; i++ { + pool.addBalance(poolTestPeer(i).ID(), amount, "") + } + } + + i := rand.Intn(clientCount) + if connected[i] { + if randomDisconnect { + pool.disconnect(poolTestPeer(i)) + connected[i] = false + connTicks[i] += tickCounter + } + } else { + if pool.connect(poolTestPeer(i), 0) { + connected[i] = true + connTicks[i] -= tickCounter + } + } + pollDisconnects: + for { + select { + case i := <-disconnCh: + pool.disconnect(poolTestPeer(i)) + if connected[i] { + connTicks[i] += tickCounter + connected[i] = false + } + default: + break pollDisconnects + } + } + } + + expTicks := testClientPoolTicks/2*connLimit/clientCount + testClientPoolTicks/2*(connLimit-paidCount)/(clientCount-paidCount) + expMin := expTicks - expTicks/5 + expMax := expTicks + expTicks/5 + paidTicks := testClientPoolTicks/2*connLimit/clientCount + testClientPoolTicks/2 + paidMin := paidTicks - paidTicks/5 + paidMax := paidTicks + paidTicks/5 + + // check if the total connected time of peers are all in the expected range + for i, c := range connected { + if c { + connTicks[i] += testClientPoolTicks + } + min, max := expMin, expMax + if i < paidCount { + // expect a higher amount for clients with a positive balance + min, max = paidMin, paidMax + } + if connTicks[i] < min || connTicks[i] > max { + t.Errorf("Total connected time of test node #%d (%d) outside expected range (%d to %d)", i, connTicks[i], min, max) + } + } + pool.stop() +} + +func TestConnectPaidClient(t *testing.T) { + var ( + clock mclock.Simulated + db = rawdb.NewMemoryDatabase() + ) + pool := newClientPool(db, 1, &clock, nil) + defer pool.stop() + pool.setLimits(10, uint64(10)) + pool.setDefaultFactors(priceFactors{1, 0, 1}, priceFactors{1, 0, 1}) + + // Add balance for an external client and mark it as paid client + pool.addBalance(poolTestPeer(0).ID(), 1000, "") + + if !pool.connect(poolTestPeer(0), 10) { + t.Fatalf("Failed to connect paid client") + } +} + +func TestConnectPaidClientToSmallPool(t *testing.T) { + var ( + clock mclock.Simulated + db = rawdb.NewMemoryDatabase() + ) + pool := newClientPool(db, 1, &clock, nil) + defer pool.stop() + pool.setLimits(10, uint64(10)) // Total capacity limit is 10 + pool.setDefaultFactors(priceFactors{1, 0, 1}, priceFactors{1, 0, 1}) + + // Add balance for an external client and mark it as paid client + pool.addBalance(poolTestPeer(0).ID(), 1000, "") + + // Connect a fat paid client to pool, should reject it. + if pool.connect(poolTestPeer(0), 100) { + t.Fatalf("Connected fat paid client, should reject it") + } +} + +func TestConnectPaidClientToFullPool(t *testing.T) { + var ( + clock mclock.Simulated + db = rawdb.NewMemoryDatabase() + ) + removeFn := func(enode.ID) {} // Noop + pool := newClientPool(db, 1, &clock, removeFn) + defer pool.stop() + pool.setLimits(10, uint64(10)) // Total capacity limit is 10 + pool.setDefaultFactors(priceFactors{1, 0, 1}, priceFactors{1, 0, 1}) + + for i := 0; i < 10; i++ { + pool.addBalance(poolTestPeer(i).ID(), 1000000000, "") + pool.connect(poolTestPeer(i), 1) + } + pool.addBalance(poolTestPeer(11).ID(), 1000, "") // Add low balance to new paid client + if pool.connect(poolTestPeer(11), 1) { + t.Fatalf("Low balance paid client should be rejected") + } + clock.Run(time.Second) + pool.addBalance(poolTestPeer(12).ID(), 1000000000*60*3, "") // Add high balance to new paid client + if !pool.connect(poolTestPeer(12), 1) { + t.Fatalf("High balance paid client should be accpected") + } +} + +func TestPaidClientKickedOut(t *testing.T) { + var ( + clock mclock.Simulated + db = rawdb.NewMemoryDatabase() + kickedCh = make(chan int, 1) + ) + removeFn := func(id enode.ID) { kickedCh <- int(id[0]) } + pool := newClientPool(db, 1, &clock, removeFn) + defer pool.stop() + pool.setLimits(10, uint64(10)) // Total capacity limit is 10 + pool.setDefaultFactors(priceFactors{1, 0, 1}, priceFactors{1, 0, 1}) + + for i := 0; i < 10; i++ { + pool.addBalance(poolTestPeer(i).ID(), 1000000000, "") // 1 second allowance + pool.connect(poolTestPeer(i), 1) + clock.Run(time.Millisecond) + } + clock.Run(time.Second) + clock.Run(connectedBias) + if !pool.connect(poolTestPeer(11), 0) { + t.Fatalf("Free client should be accectped") + } + select { + case id := <-kickedCh: + if id != 0 { + t.Fatalf("Kicked client mismatch, want %v, got %v", 0, id) + } + case <-time.NewTimer(time.Second).C: + t.Fatalf("timeout") + } +} + +func TestConnectFreeClient(t *testing.T) { + var ( + clock mclock.Simulated + db = rawdb.NewMemoryDatabase() + ) + pool := newClientPool(db, 1, &clock, nil) + defer pool.stop() + pool.setLimits(10, uint64(10)) + pool.setDefaultFactors(priceFactors{1, 0, 1}, priceFactors{1, 0, 1}) + if !pool.connect(poolTestPeer(0), 10) { + t.Fatalf("Failed to connect free client") + } +} + +func TestConnectFreeClientToFullPool(t *testing.T) { + var ( + clock mclock.Simulated + db = rawdb.NewMemoryDatabase() + ) + removeFn := func(enode.ID) {} // Noop + pool := newClientPool(db, 1, &clock, removeFn) + defer pool.stop() + pool.setLimits(10, uint64(10)) // Total capacity limit is 10 + pool.setDefaultFactors(priceFactors{1, 0, 1}, priceFactors{1, 0, 1}) + + for i := 0; i < 10; i++ { + pool.connect(poolTestPeer(i), 1) + } + if pool.connect(poolTestPeer(11), 1) { + t.Fatalf("New free client should be rejected") + } + clock.Run(time.Minute) + if pool.connect(poolTestPeer(12), 1) { + t.Fatalf("New free client should be rejected") + } + clock.Run(time.Millisecond) + clock.Run(4 * time.Minute) + if !pool.connect(poolTestPeer(13), 1) { + t.Fatalf("Old client connects more than 5min should be kicked") + } +} + +func TestFreeClientKickedOut(t *testing.T) { + var ( + clock mclock.Simulated + db = rawdb.NewMemoryDatabase() + kicked = make(chan int, 10) + ) + removeFn := func(id enode.ID) { kicked <- int(id[0]) } + pool := newClientPool(db, 1, &clock, removeFn) + defer pool.stop() + pool.setLimits(10, uint64(10)) // Total capacity limit is 10 + pool.setDefaultFactors(priceFactors{1, 0, 1}, priceFactors{1, 0, 1}) + + for i := 0; i < 10; i++ { + pool.connect(poolTestPeer(i), 1) + clock.Run(time.Millisecond) + } + if pool.connect(poolTestPeer(10), 1) { + t.Fatalf("New free client should be rejected") + } + clock.Run(5 * time.Minute) + for i := 0; i < 10; i++ { + pool.connect(poolTestPeer(i+10), 1) + } + for i := 0; i < 10; i++ { + select { + case id := <-kicked: + if id >= 10 { + t.Fatalf("Old client should be kicked, now got: %d", id) + } + case <-time.NewTimer(time.Second).C: + t.Fatalf("timeout") + } + } +} + +func TestPositiveBalanceCalculation(t *testing.T) { + var ( + clock mclock.Simulated + db = rawdb.NewMemoryDatabase() + kicked = make(chan int, 10) + ) + removeFn := func(id enode.ID) { kicked <- int(id[0]) } // Noop + pool := newClientPool(db, 1, &clock, removeFn) + defer pool.stop() + pool.setLimits(10, uint64(10)) // Total capacity limit is 10 + pool.setDefaultFactors(priceFactors{1, 0, 1}, priceFactors{1, 0, 1}) + + pool.addBalance(poolTestPeer(0).ID(), int64(time.Minute*3), "") + pool.connect(poolTestPeer(0), 10) + clock.Run(time.Minute) + + pool.disconnect(poolTestPeer(0)) + pb := pool.ndb.getOrNewPB(poolTestPeer(0).ID()) + if pb.value != uint64(time.Minute*2) { + t.Fatalf("Positive balance mismatch, want %v, got %v", uint64(time.Minute*2), pb.value) + } +} + +func TestDowngradePriorityClient(t *testing.T) { + var ( + clock mclock.Simulated + db = rawdb.NewMemoryDatabase() + kicked = make(chan int, 10) + ) + removeFn := func(id enode.ID) { kicked <- int(id[0]) } // Noop + pool := newClientPool(db, 1, &clock, removeFn) + defer pool.stop() + pool.setLimits(10, uint64(10)) // Total capacity limit is 10 + pool.setDefaultFactors(priceFactors{1, 0, 1}, priceFactors{1, 0, 1}) + + p := &poolTestPeerWithCap{ + poolTestPeer: poolTestPeer(0), + } + pool.addBalance(p.ID(), int64(time.Minute), "") + pool.connect(p, 10) + if p.cap != 10 { + t.Fatalf("The capcacity of priority peer hasn't been updated, got: %d", p.cap) + } + + clock.Run(time.Minute) // All positive balance should be used up. + time.Sleep(300 * time.Millisecond) // Ensure the callback is called + if p.cap != 1 { + t.Fatalf("The capcacity of peer should be downgraded, got: %d", p.cap) + } + pb := pool.ndb.getOrNewPB(poolTestPeer(0).ID()) + if pb.value != 0 { + t.Fatalf("Positive balance mismatch, want %v, got %v", 0, pb.value) + } + + pool.addBalance(poolTestPeer(0).ID(), int64(time.Minute), "") + pb = pool.ndb.getOrNewPB(poolTestPeer(0).ID()) + if pb.value != uint64(time.Minute) { + t.Fatalf("Positive balance mismatch, want %v, got %v", uint64(time.Minute), pb.value) + } +} + +func TestNegativeBalanceCalculation(t *testing.T) { + var ( + clock mclock.Simulated + db = rawdb.NewMemoryDatabase() + kicked = make(chan int, 10) + ) + removeFn := func(id enode.ID) { kicked <- int(id[0]) } // Noop + pool := newClientPool(db, 1, &clock, removeFn) + defer pool.stop() + pool.setLimits(10, uint64(10)) // Total capacity limit is 10 + pool.setDefaultFactors(priceFactors{1, 0, 1}, priceFactors{1, 0, 1}) + + for i := 0; i < 10; i++ { + pool.connect(poolTestPeer(i), 1) + } + clock.Run(time.Second) + + for i := 0; i < 10; i++ { + pool.disconnect(poolTestPeer(i)) + nb := pool.ndb.getOrNewNB(poolTestPeer(i).freeClientId()) + if nb.logValue != 0 { + t.Fatalf("Short connection shouldn't be recorded") + } + } + + for i := 0; i < 10; i++ { + pool.connect(poolTestPeer(i), 1) + } + clock.Run(time.Minute) + for i := 0; i < 10; i++ { + pool.disconnect(poolTestPeer(i)) + nb := pool.ndb.getOrNewNB(poolTestPeer(i).freeClientId()) + nb.logValue -= pool.logOffset(clock.Now()) + nb.logValue /= fixedPointMultiplier + if nb.logValue != int64(math.Log(float64(time.Minute/time.Second))) { + t.Fatalf("Negative balance mismatch, want %v, got %v", int64(math.Log(float64(time.Minute/time.Second))), nb.logValue) + } + } +} + +func TestNodeDB(t *testing.T) { + ndb := newNodeDB(rawdb.NewMemoryDatabase(), mclock.System{}) + defer ndb.close() + + if !bytes.Equal(ndb.verbuf[:], []byte{0x00, nodeDBVersion}) { + t.Fatalf("version buffer mismatch, want %v, got %v", []byte{0x00, nodeDBVersion}, ndb.verbuf) + } + var cases = []struct { + id enode.ID + ip string + balance interface{} + positive bool + }{ + {enode.ID{0x00, 0x01, 0x02}, "", posBalance{value: 100}, true}, + {enode.ID{0x00, 0x01, 0x02}, "", posBalance{value: 200}, true}, + {enode.ID{}, "127.0.0.1", negBalance{logValue: 10}, false}, + {enode.ID{}, "127.0.0.1", negBalance{logValue: 20}, false}, + } + for _, c := range cases { + if c.positive { + ndb.setPB(c.id, c.balance.(posBalance)) + if pb := ndb.getOrNewPB(c.id); !reflect.DeepEqual(pb, c.balance.(posBalance)) { + t.Fatalf("Positive balance mismatch, want %v, got %v", c.balance.(posBalance), pb) + } + } else { + ndb.setNB(c.ip, c.balance.(negBalance)) + if nb := ndb.getOrNewNB(c.ip); !reflect.DeepEqual(nb, c.balance.(negBalance)) { + t.Fatalf("Negative balance mismatch, want %v, got %v", c.balance.(negBalance), nb) + } + } + } + for _, c := range cases { + if c.positive { + ndb.delPB(c.id) + if pb := ndb.getOrNewPB(c.id); !reflect.DeepEqual(pb, posBalance{}) { + t.Fatalf("Positive balance mismatch, want %v, got %v", posBalance{}, pb) + } + } else { + ndb.delNB(c.ip) + if nb := ndb.getOrNewNB(c.ip); !reflect.DeepEqual(nb, negBalance{}) { + t.Fatalf("Negative balance mismatch, want %v, got %v", negBalance{}, nb) + } + } + } + ndb.setCumulativeTime(100) + if ndb.getCumulativeTime() != 100 { + t.Fatalf("Cumulative time mismatch, want %v, got %v", 100, ndb.getCumulativeTime()) + } +} + +func TestNodeDBExpiration(t *testing.T) { + var ( + iterated int + done = make(chan struct{}, 1) + ) + callback := func(now mclock.AbsTime, b negBalance) bool { + iterated += 1 + return true + } + clock := &mclock.Simulated{} + ndb := newNodeDB(rawdb.NewMemoryDatabase(), clock) + defer ndb.close() + ndb.nbEvictCallBack = callback + ndb.cleanupHook = func() { done <- struct{}{} } + + var cases = []struct { + ip string + balance negBalance + }{ + {"127.0.0.1", negBalance{logValue: 1}}, + {"127.0.0.2", negBalance{logValue: 1}}, + {"127.0.0.3", negBalance{logValue: 1}}, + {"127.0.0.4", negBalance{logValue: 1}}, + } + for _, c := range cases { + ndb.setNB(c.ip, c.balance) + } + time.Sleep(100 * time.Millisecond) // Ensure the db expirer is registered. + clock.Run(time.Hour + time.Minute) + select { + case <-done: + case <-time.NewTimer(time.Second).C: + t.Fatalf("timeout") + } + if iterated != 4 { + t.Fatalf("Failed to evict useless negative balances, want %v, got %d", 4, iterated) + } + + for _, c := range cases { + ndb.setNB(c.ip, c.balance) + } + clock.Run(time.Hour + time.Minute) + select { + case <-done: + case <-time.NewTimer(time.Second).C: + t.Fatalf("timeout") + } + if iterated != 8 { + t.Fatalf("Failed to evict useless negative balances, want %v, got %d", 4, iterated) + } +} diff --git a/les/commons.go b/les/commons.go index 4bba0d518fc2..ad3c5aef3d75 100644 --- a/les/commons.go +++ b/les/commons.go @@ -19,24 +19,54 @@ package les import ( "fmt" "math/big" + "sync" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/eth" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/light" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/discv5" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" ) +func errResp(code errCode, format string, v ...interface{}) error { + return fmt.Errorf("%v - %v", code, fmt.Sprintf(format, v...)) +} + +func lesTopic(genesisHash common.Hash, protocolVersion uint) discv5.Topic { + var name string + switch protocolVersion { + case lpv2: + name = "LES2" + default: + panic(nil) + } + return discv5.Topic(name + "@" + common.Bytes2Hex(genesisHash.Bytes()[0:8])) +} + +type chainReader interface { + CurrentHeader() *types.Header +} + // lesCommons contains fields needed by both server and client. type lesCommons struct { + genesis common.Hash config *eth.Config + chainConfig *params.ChainConfig iConfig *light.IndexerConfig chainDb ethdb.Database - protocolManager *ProtocolManager + peers *peerSet + chainReader chainReader chtIndexer, bloomTrieIndexer *core.ChainIndexer + oracle *checkpointOracle + + closeCh chan struct{} + wg sync.WaitGroup } // NodeInfo represents a short summary of the Ethereum sub-protocol metadata @@ -51,7 +81,7 @@ type NodeInfo struct { } // makeProtocols creates protocol descriptors for the given LES versions. -func (c *lesCommons) makeProtocols(versions []uint) []p2p.Protocol { +func (c *lesCommons) makeProtocols(versions []uint, runPeer func(version uint, p *p2p.Peer, rw p2p.MsgReadWriter) error, peerInfo func(id enode.ID) interface{}) []p2p.Protocol { protos := make([]p2p.Protocol, len(versions)) for i, version := range versions { version := version @@ -60,15 +90,10 @@ func (c *lesCommons) makeProtocols(versions []uint) []p2p.Protocol { Version: version, Length: ProtocolLengths[version], NodeInfo: c.nodeInfo, - Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error { - return c.protocolManager.runPeer(version, p, rw) - }, - PeerInfo: func(id enode.ID) interface{} { - if p := c.protocolManager.peers.Peer(fmt.Sprintf("%x", id[:8])); p != nil { - return p.Info() - } - return nil + Run: func(peer *p2p.Peer, rw p2p.MsgReadWriter) error { + return runPeer(version, peer, rw) }, + PeerInfo: peerInfo, } } return protos @@ -76,45 +101,46 @@ func (c *lesCommons) makeProtocols(versions []uint) []p2p.Protocol { // nodeInfo retrieves some protocol metadata about the running host node. func (c *lesCommons) nodeInfo() interface{} { - var cht params.TrustedCheckpoint - sections, _, _ := c.chtIndexer.Sections() - sections2, _, _ := c.bloomTrieIndexer.Sections() - - if !c.protocolManager.lightSync { - // convert to client section size if running in server mode - sections /= c.iConfig.PairChtSize / c.iConfig.ChtSize + head := c.chainReader.CurrentHeader() + hash := head.Hash() + return &NodeInfo{ + Network: c.config.NetworkId, + Difficulty: rawdb.ReadTd(c.chainDb, hash, head.Number.Uint64()), + Genesis: c.genesis, + Config: c.chainConfig, + Head: hash, + CHT: c.latestLocalCheckpoint(), } +} - if sections2 < sections { +// latestLocalCheckpoint finds the common stored section index and returns a set +// of post-processed trie roots (CHT and BloomTrie) associated with the appropriate +// section index and head hash as a local checkpoint package. +func (c *lesCommons) latestLocalCheckpoint() params.TrustedCheckpoint { + sections, _, _ := c.chtIndexer.Sections() + sections2, _, _ := c.bloomTrieIndexer.Sections() + // Cap the section index if the two sections are not consistent. + if sections > sections2 { sections = sections2 } - if sections > 0 { - sectionIndex := sections - 1 - sectionHead := c.bloomTrieIndexer.SectionHead(sectionIndex) - var chtRoot common.Hash - if c.protocolManager.lightSync { - chtRoot = light.GetChtRoot(c.chainDb, sectionIndex, sectionHead) - } else { - idxV2 := (sectionIndex+1)*c.iConfig.PairChtSize/c.iConfig.ChtSize - 1 - chtRoot = light.GetChtRoot(c.chainDb, idxV2, sectionHead) - } - cht = params.TrustedCheckpoint{ - SectionIndex: sectionIndex, - SectionHead: sectionHead, - CHTRoot: chtRoot, - BloomRoot: light.GetBloomTrieRoot(c.chainDb, sectionIndex, sectionHead), - } + if sections == 0 { + // No checkpoint information can be provided. + return params.TrustedCheckpoint{} } + return c.localCheckpoint(sections - 1) +} - chain := c.protocolManager.blockchain - head := chain.CurrentHeader() - hash := head.Hash() - return &NodeInfo{ - Network: c.config.NetworkId, - Difficulty: chain.GetTd(hash, head.Number.Uint64()), - Genesis: chain.Genesis().Hash(), - Config: chain.Config(), - Head: chain.CurrentHeader().Hash(), - CHT: cht, +// localCheckpoint returns a set of post-processed trie roots (CHT and BloomTrie) +// associated with the appropriate head hash by specific section index. +// +// The returned checkpoint is only the checkpoint generated by the local indexers, +// not the stable checkpoint registered in the registrar contract. +func (c *lesCommons) localCheckpoint(index uint64) params.TrustedCheckpoint { + sectionHead := c.chtIndexer.SectionHead(index) + return params.TrustedCheckpoint{ + SectionIndex: index, + SectionHead: sectionHead, + CHTRoot: light.GetChtRoot(c.chainDb, index, sectionHead), + BloomRoot: light.GetBloomTrieRoot(c.chainDb, index, sectionHead), } } diff --git a/les/costtracker.go b/les/costtracker.go new file mode 100644 index 000000000000..81da04566007 --- /dev/null +++ b/les/costtracker.go @@ -0,0 +1,516 @@ +// Copyright 2019 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 ( + "encoding/binary" + "math" + "sync" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/les/flowcontrol" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" +) + +const makeCostStats = false // make request cost statistics during operation + +var ( + // average request cost estimates based on serving time + reqAvgTimeCost = requestCostTable{ + GetBlockHeadersMsg: {150000, 30000}, + GetBlockBodiesMsg: {0, 700000}, + GetReceiptsMsg: {0, 1000000}, + GetCodeMsg: {0, 450000}, + GetProofsV2Msg: {0, 600000}, + GetHelperTrieProofsMsg: {0, 1000000}, + SendTxV2Msg: {0, 450000}, + GetTxStatusMsg: {0, 250000}, + } + // maximum incoming message size estimates + reqMaxInSize = requestCostTable{ + GetBlockHeadersMsg: {40, 0}, + GetBlockBodiesMsg: {0, 40}, + GetReceiptsMsg: {0, 40}, + GetCodeMsg: {0, 80}, + GetProofsV2Msg: {0, 80}, + GetHelperTrieProofsMsg: {0, 20}, + SendTxV2Msg: {0, 16500}, + GetTxStatusMsg: {0, 50}, + } + // maximum outgoing message size estimates + reqMaxOutSize = requestCostTable{ + GetBlockHeadersMsg: {0, 556}, + GetBlockBodiesMsg: {0, 100000}, + GetReceiptsMsg: {0, 200000}, + GetCodeMsg: {0, 50000}, + GetProofsV2Msg: {0, 4000}, + GetHelperTrieProofsMsg: {0, 4000}, + SendTxV2Msg: {0, 100}, + GetTxStatusMsg: {0, 100}, + } + // request amounts that have to fit into the minimum buffer size minBufferMultiplier times + minBufferReqAmount = map[uint64]uint64{ + GetBlockHeadersMsg: 192, + GetBlockBodiesMsg: 1, + GetReceiptsMsg: 1, + GetCodeMsg: 1, + GetProofsV2Msg: 1, + GetHelperTrieProofsMsg: 16, + SendTxV2Msg: 8, + GetTxStatusMsg: 64, + } + minBufferMultiplier = 3 +) + +const ( + maxCostFactor = 2 // ratio of maximum and average cost estimates + bufLimitRatio = 6000 // fixed bufLimit/MRR ratio + gfUsageThreshold = 0.5 + gfUsageTC = time.Second + gfRaiseTC = time.Second * 200 + gfDropTC = time.Second * 50 + gfDbKey = "_globalCostFactorV6" +) + +// costTracker is responsible for calculating costs and cost estimates on the +// server side. It continuously updates the global cost factor which is defined +// as the number of cost units per nanosecond of serving time in a single thread. +// It is based on statistics collected during serving requests in high-load periods +// and practically acts as a one-dimension request price scaling factor over the +// pre-defined cost estimate table. +// +// The reason for dynamically maintaining the global factor on the server side is: +// the estimated time cost of the request is fixed(hardcoded) but the configuration +// of the machine running the server is really different. Therefore, the request serving +// time in different machine will vary greatly. And also, the request serving time +// in same machine may vary greatly with different request pressure. +// +// In order to more effectively limit resources, we apply the global factor to serving +// time to make the result as close as possible to the estimated time cost no matter +// the server is slow or fast. And also we scale the totalRecharge with global factor +// so that fast server can serve more requests than estimation and slow server can +// reduce request pressure. +// +// Instead of scaling the cost values, the real value of cost units is changed by +// applying the factor to the serving times. This is more convenient because the +// changes in the cost factor can be applied immediately without always notifying +// the clients about the changed cost tables. +type costTracker struct { + db ethdb.Database + stopCh chan chan struct{} + + inSizeFactor float64 + outSizeFactor float64 + factor float64 + utilTarget float64 + minBufLimit uint64 + + gfLock sync.RWMutex + reqInfoCh chan reqInfo + totalRechargeCh chan uint64 + + stats map[uint64][]uint64 // Used for testing purpose. + + // TestHooks + testing bool // Disable real cost evaluation for testing purpose. + testCostList RequestCostList // Customized cost table for testing purpose. +} + +// newCostTracker creates a cost tracker and loads the cost factor statistics from the database. +// It also returns the minimum capacity that can be assigned to any peer. +func newCostTracker(db ethdb.Database, config *eth.Config) (*costTracker, uint64) { + utilTarget := float64(config.LightServ) * flowcontrol.FixedPointMultiplier / 100 + ct := &costTracker{ + db: db, + stopCh: make(chan chan struct{}), + reqInfoCh: make(chan reqInfo, 100), + utilTarget: utilTarget, + } + if config.LightIngress > 0 { + ct.inSizeFactor = utilTarget / float64(config.LightIngress) + } + if config.LightEgress > 0 { + ct.outSizeFactor = utilTarget / float64(config.LightEgress) + } + if makeCostStats { + ct.stats = make(map[uint64][]uint64) + for code := range reqAvgTimeCost { + ct.stats[code] = make([]uint64, 10) + } + } + ct.gfLoop() + costList := ct.makeCostList(ct.globalFactor() * 1.25) + for _, c := range costList { + amount := minBufferReqAmount[c.MsgCode] + cost := c.BaseCost + amount*c.ReqCost + if cost > ct.minBufLimit { + ct.minBufLimit = cost + } + } + ct.minBufLimit *= uint64(minBufferMultiplier) + return ct, (ct.minBufLimit-1)/bufLimitRatio + 1 +} + +// stop stops the cost tracker and saves the cost factor statistics to the database +func (ct *costTracker) stop() { + stopCh := make(chan struct{}) + ct.stopCh <- stopCh + <-stopCh + if makeCostStats { + ct.printStats() + } +} + +// makeCostList returns upper cost estimates based on the hardcoded cost estimate +// tables and the optionally specified incoming/outgoing bandwidth limits +func (ct *costTracker) makeCostList(globalFactor float64) RequestCostList { + maxCost := func(avgTimeCost, inSize, outSize uint64) uint64 { + cost := avgTimeCost * maxCostFactor + inSizeCost := uint64(float64(inSize) * ct.inSizeFactor * globalFactor) + if inSizeCost > cost { + cost = inSizeCost + } + outSizeCost := uint64(float64(outSize) * ct.outSizeFactor * globalFactor) + if outSizeCost > cost { + cost = outSizeCost + } + return cost + } + var list RequestCostList + for code, data := range reqAvgTimeCost { + baseCost := maxCost(data.baseCost, reqMaxInSize[code].baseCost, reqMaxOutSize[code].baseCost) + reqCost := maxCost(data.reqCost, reqMaxInSize[code].reqCost, reqMaxOutSize[code].reqCost) + if ct.minBufLimit != 0 { + // if minBufLimit is set then always enforce maximum request cost <= minBufLimit + maxCost := baseCost + reqCost*minBufferReqAmount[code] + if maxCost > ct.minBufLimit { + mul := 0.999 * float64(ct.minBufLimit) / float64(maxCost) + baseCost = uint64(float64(baseCost) * mul) + reqCost = uint64(float64(reqCost) * mul) + } + } + + list = append(list, requestCostListItem{ + MsgCode: code, + BaseCost: baseCost, + ReqCost: reqCost, + }) + } + return list +} + +// reqInfo contains the estimated time cost and the actual request serving time +// which acts as a feed source to update factor maintained by costTracker. +type reqInfo struct { + // avgTimeCost is the estimated time cost corresponding to maxCostTable. + avgTimeCost float64 + + // servingTime is the CPU time corresponding to the actual processing of + // the request. + servingTime float64 + + // msgCode indicates the type of request. + msgCode uint64 +} + +// gfLoop starts an event loop which updates the global cost factor which is +// calculated as a weighted average of the average estimate / serving time ratio. +// The applied weight equals the serving time if gfUsage is over a threshold, +// zero otherwise. gfUsage is the recent average serving time per time unit in +// an exponential moving window. This ensures that statistics are collected only +// under high-load circumstances where the measured serving times are relevant. +// The total recharge parameter of the flow control system which controls the +// total allowed serving time per second but nominated in cost units, should +// also be scaled with the cost factor and is also updated by this loop. +func (ct *costTracker) gfLoop() { + var ( + factor, totalRecharge float64 + gfLog, recentTime, recentAvg float64 + + lastUpdate, expUpdate = mclock.Now(), mclock.Now() + ) + + // Load historical cost factor statistics from the database. + data, _ := ct.db.Get([]byte(gfDbKey)) + if len(data) == 8 { + gfLog = math.Float64frombits(binary.BigEndian.Uint64(data[:])) + } + ct.factor = math.Exp(gfLog) + factor, totalRecharge = ct.factor, ct.utilTarget*ct.factor + + // In order to perform factor data statistics under the high request pressure, + // we only adjust factor when recent factor usage beyond the threshold. + threshold := gfUsageThreshold * float64(gfUsageTC) * ct.utilTarget / flowcontrol.FixedPointMultiplier + + go func() { + saveCostFactor := func() { + var data [8]byte + binary.BigEndian.PutUint64(data[:], math.Float64bits(gfLog)) + ct.db.Put([]byte(gfDbKey), data[:]) + log.Debug("global cost factor saved", "value", factor) + } + saveTicker := time.NewTicker(time.Minute * 10) + + for { + select { + case r := <-ct.reqInfoCh: + relCost := int64(factor * r.servingTime * 100 / r.avgTimeCost) // Convert the value to a percentage form + + // Record more metrics if we are debugging + if metrics.EnabledExpensive { + switch r.msgCode { + case GetBlockHeadersMsg: + relativeCostHeaderHistogram.Update(relCost) + case GetBlockBodiesMsg: + relativeCostBodyHistogram.Update(relCost) + case GetReceiptsMsg: + relativeCostReceiptHistogram.Update(relCost) + case GetCodeMsg: + relativeCostCodeHistogram.Update(relCost) + case GetProofsV2Msg: + relativeCostProofHistogram.Update(relCost) + case GetHelperTrieProofsMsg: + relativeCostHelperProofHistogram.Update(relCost) + case SendTxV2Msg: + relativeCostSendTxHistogram.Update(relCost) + case GetTxStatusMsg: + relativeCostTxStatusHistogram.Update(relCost) + } + } + // SendTxV2 and GetTxStatus requests are two special cases. + // All other requests will only put pressure on the database, and + // the corresponding delay is relatively stable. While these two + // requests involve txpool query, which is usually unstable. + // + // TODO(rjl493456442) fixes this. + if r.msgCode == SendTxV2Msg || r.msgCode == GetTxStatusMsg { + continue + } + requestServedMeter.Mark(int64(r.servingTime)) + requestServedTimer.Update(time.Duration(r.servingTime)) + requestEstimatedMeter.Mark(int64(r.avgTimeCost / factor)) + requestEstimatedTimer.Update(time.Duration(r.avgTimeCost / factor)) + relativeCostHistogram.Update(relCost) + + now := mclock.Now() + dt := float64(now - expUpdate) + expUpdate = now + exp := math.Exp(-dt / float64(gfUsageTC)) + + // calculate factor correction until now, based on previous values + var gfCorr float64 + max := recentTime + if recentAvg > max { + max = recentAvg + } + // we apply continuous correction when MAX(recentTime, recentAvg) > threshold + if max > threshold { + // calculate correction time between last expUpdate and now + if max*exp >= threshold { + gfCorr = dt + } else { + gfCorr = math.Log(max/threshold) * float64(gfUsageTC) + } + // calculate log(factor) correction with the right direction and time constant + if recentTime > recentAvg { + // drop factor if actual serving times are larger than average estimates + gfCorr /= -float64(gfDropTC) + } else { + // raise factor if actual serving times are smaller than average estimates + gfCorr /= float64(gfRaiseTC) + } + } + // update recent cost values with current request + recentTime = recentTime*exp + r.servingTime + recentAvg = recentAvg*exp + r.avgTimeCost/factor + + if gfCorr != 0 { + // Apply the correction to factor + gfLog += gfCorr + factor = math.Exp(gfLog) + // Notify outside modules the new factor and totalRecharge. + if time.Duration(now-lastUpdate) > time.Second { + totalRecharge, lastUpdate = ct.utilTarget*factor, now + ct.gfLock.Lock() + ct.factor = factor + ch := ct.totalRechargeCh + ct.gfLock.Unlock() + if ch != nil { + select { + case ct.totalRechargeCh <- uint64(totalRecharge): + default: + } + } + globalFactorGauge.Update(int64(1000 * factor)) + log.Debug("global cost factor updated", "factor", factor) + } + } + recentServedGauge.Update(int64(recentTime)) + recentEstimatedGauge.Update(int64(recentAvg)) + + case <-saveTicker.C: + saveCostFactor() + + case stopCh := <-ct.stopCh: + saveCostFactor() + close(stopCh) + return + } + } + }() +} + +// globalFactor returns the current value of the global cost factor +func (ct *costTracker) globalFactor() float64 { + ct.gfLock.RLock() + defer ct.gfLock.RUnlock() + + return ct.factor +} + +// totalRecharge returns the current total recharge parameter which is used by +// flowcontrol.ClientManager and is scaled by the global cost factor +func (ct *costTracker) totalRecharge() uint64 { + ct.gfLock.RLock() + defer ct.gfLock.RUnlock() + + return uint64(ct.factor * ct.utilTarget) +} + +// subscribeTotalRecharge returns all future updates to the total recharge value +// through a channel and also returns the current value +func (ct *costTracker) subscribeTotalRecharge(ch chan uint64) uint64 { + ct.gfLock.Lock() + defer ct.gfLock.Unlock() + + ct.totalRechargeCh = ch + return uint64(ct.factor * ct.utilTarget) +} + +// updateStats updates the global cost factor and (if enabled) the real cost vs. +// average estimate statistics +func (ct *costTracker) updateStats(code, amount, servingTime, realCost uint64) { + avg := reqAvgTimeCost[code] + avgTimeCost := avg.baseCost + amount*avg.reqCost + select { + case ct.reqInfoCh <- reqInfo{float64(avgTimeCost), float64(servingTime), code}: + default: + } + if makeCostStats { + realCost <<= 4 + l := 0 + for l < 9 && realCost > avgTimeCost { + l++ + realCost >>= 1 + } + atomic.AddUint64(&ct.stats[code][l], 1) + } +} + +// realCost calculates the final cost of a request based on actual serving time, +// incoming and outgoing message size +// +// Note: message size is only taken into account if bandwidth limitation is applied +// and the cost based on either message size is greater than the cost based on +// serving time. A maximum of the three costs is applied instead of their sum +// because the three limited resources (serving thread time and i/o bandwidth) can +// also be maxed out simultaneously. +func (ct *costTracker) realCost(servingTime uint64, inSize, outSize uint32) uint64 { + cost := float64(servingTime) + inSizeCost := float64(inSize) * ct.inSizeFactor + if inSizeCost > cost { + cost = inSizeCost + } + outSizeCost := float64(outSize) * ct.outSizeFactor + if outSizeCost > cost { + cost = outSizeCost + } + return uint64(cost * ct.globalFactor()) +} + +// printStats prints the distribution of real request cost relative to the average estimates +func (ct *costTracker) printStats() { + if ct.stats == nil { + return + } + for code, arr := range ct.stats { + log.Info("Request cost statistics", "code", code, "1/16", arr[0], "1/8", arr[1], "1/4", arr[2], "1/2", arr[3], "1", arr[4], "2", arr[5], "4", arr[6], "8", arr[7], "16", arr[8], ">16", arr[9]) + } +} + +type ( + // requestCostTable assigns a cost estimate function to each request type + // which is a linear function of the requested amount + // (cost = baseCost + reqCost * amount) + requestCostTable map[uint64]*requestCosts + requestCosts struct { + baseCost, reqCost uint64 + } + + // RequestCostList is a list representation of request costs which is used for + // database storage and communication through the network + RequestCostList []requestCostListItem + requestCostListItem struct { + MsgCode, BaseCost, ReqCost uint64 + } +) + +// getMaxCost calculates the estimated cost for a given request type and amount +func (table requestCostTable) getMaxCost(code, amount uint64) uint64 { + costs := table[code] + return costs.baseCost + amount*costs.reqCost +} + +// decode converts a cost list to a cost table +func (list RequestCostList) decode(protocolLength uint64) requestCostTable { + table := make(requestCostTable) + for _, e := range list { + if e.MsgCode < protocolLength { + table[e.MsgCode] = &requestCosts{ + baseCost: e.BaseCost, + reqCost: e.ReqCost, + } + } + } + return table +} + +// testCostList returns a dummy request cost list used by tests +func testCostList(testCost uint64) RequestCostList { + cl := make(RequestCostList, len(reqAvgTimeCost)) + var max uint64 + for code := range reqAvgTimeCost { + if code > max { + max = code + } + } + i := 0 + for code := uint64(0); code <= max; code++ { + if _, ok := reqAvgTimeCost[code]; ok { + cl[i].MsgCode = code + cl[i].BaseCost = testCost + cl[i].ReqCost = 0 + i++ + } + } + return cl +} diff --git a/les/distributor.go b/les/distributor.go index f90765b624b4..6d8114972057 100644 --- a/les/distributor.go +++ b/les/distributor.go @@ -14,27 +14,31 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package light implements on-demand retrieval capable state and chain objects -// for the Ethereum Light Client. package les import ( "container/list" "sync" "time" + + "github.com/ethereum/go-ethereum/common/mclock" ) // requestDistributor implements a mechanism that distributes requests to // suitable peers, obeying flow control rules and prioritizing them in creation // order (even when a resend is necessary). type requestDistributor struct { - reqQueue *list.List - lastReqOrder uint64 - peers map[distPeer]struct{} - peerLock sync.RWMutex - stopChn, loopChn chan struct{} - loopNextSent bool - lock sync.Mutex + clock mclock.Clock + reqQueue *list.List + lastReqOrder uint64 + peers map[distPeer]struct{} + peerLock sync.RWMutex + loopChn chan struct{} + loopNextSent bool + lock sync.Mutex + + closeCh chan struct{} + wg sync.WaitGroup } // distPeer is an LES server peer interface for the request distributor. @@ -61,22 +65,26 @@ type distReq struct { canSend func(distPeer) bool request func(distPeer) func() - reqOrder uint64 - sentChn chan distPeer - element *list.Element + reqOrder uint64 + sentChn chan distPeer + element *list.Element + waitForPeers mclock.AbsTime + enterQueue mclock.AbsTime } // newRequestDistributor creates a new request distributor -func newRequestDistributor(peers *peerSet, stopChn chan struct{}) *requestDistributor { +func newRequestDistributor(peers *peerSet, clock mclock.Clock) *requestDistributor { d := &requestDistributor{ + clock: clock, reqQueue: list.New(), loopChn: make(chan struct{}, 2), - stopChn: stopChn, + closeCh: make(chan struct{}), peers: make(map[distPeer]struct{}), } if peers != nil { peers.notify(d) } + d.wg.Add(1) go d.loop() return d } @@ -102,15 +110,22 @@ func (d *requestDistributor) registerTestPeer(p distPeer) { d.peerLock.Unlock() } -// distMaxWait is the maximum waiting time after which further necessary waiting -// times are recalculated based on new feedback from the servers -const distMaxWait = time.Millisecond * 10 +var ( + // distMaxWait is the maximum waiting time after which further necessary waiting + // times are recalculated based on new feedback from the servers + distMaxWait = time.Millisecond * 50 + + // waitForPeers is the time window in which a request does not fail even if it + // has no suitable peers to send to at the moment + waitForPeers = time.Second * 3 +) // main event loop func (d *requestDistributor) loop() { + defer d.wg.Done() for { select { - case <-d.stopChn: + case <-d.closeCh: d.lock.Lock() elem := d.reqQueue.Front() for elem != nil { @@ -133,6 +148,7 @@ func (d *requestDistributor) loop() { send := req.request(peer) if send != nil { peer.queueSend(send) + requestSendDelay.Update(time.Duration(d.clock.Now() - req.enterQueue)) } chn <- peer close(chn) @@ -148,7 +164,7 @@ func (d *requestDistributor) loop() { wait = distMaxWait } go func() { - time.Sleep(wait) + d.clock.Sleep(wait) d.loopChn <- struct{}{} }() break loop @@ -177,8 +193,6 @@ func (d *requestDistributor) nextRequest() (distPeer, *distReq, time.Duration) { checkedPeers := make(map[distPeer]struct{}) elem := d.reqQueue.Front() var ( - bestPeer distPeer - bestReq *distReq bestWait time.Duration sel *weightedRandomSelect ) @@ -186,9 +200,18 @@ func (d *requestDistributor) nextRequest() (distPeer, *distReq, time.Duration) { d.peerLock.RLock() defer d.peerLock.RUnlock() - for (len(d.peers) > 0 || elem == d.reqQueue.Front()) && elem != nil { + peerCount := len(d.peers) + for (len(checkedPeers) < peerCount || elem == d.reqQueue.Front()) && elem != nil { req := elem.Value.(*distReq) canSend := false + now := d.clock.Now() + if req.waitForPeers > now { + canSend = true + wait := time.Duration(req.waitForPeers - now) + if bestWait == 0 || wait < bestWait { + bestWait = wait + } + } for peer := range d.peers { if _, ok := checkedPeers[peer]; !ok && peer.canQueue() && req.canSend(peer) { canSend = true @@ -200,9 +223,7 @@ func (d *requestDistributor) nextRequest() (distPeer, *distReq, time.Duration) { } sel.update(selectPeerItem{peer: peer, req: req, weight: int64(bufRemain*1000000) + 1}) } else { - if bestReq == nil || wait < bestWait { - bestPeer = peer - bestReq = req + if bestWait == 0 || wait < bestWait { bestWait = wait } } @@ -221,7 +242,7 @@ func (d *requestDistributor) nextRequest() (distPeer, *distReq, time.Duration) { c := sel.choose().(selectPeerItem) return c.peer, c.req, 0 } - return bestPeer, bestReq, bestWait + return nil, nil, bestWait } // queue adds a request to the distribution queue, returns a channel where the @@ -235,7 +256,11 @@ func (d *requestDistributor) queue(r *distReq) chan distPeer { if r.reqOrder == 0 { d.lastReqOrder++ r.reqOrder = d.lastReqOrder + r.waitForPeers = d.clock.Now() + mclock.AbsTime(waitForPeers) } + // Assign the timestamp when the request is queued no matter it's + // a new one or re-queued one. + r.enterQueue = d.clock.Now() back := d.reqQueue.Back() if back == nil || r.reqOrder > back.Value.(*distReq).reqOrder { @@ -281,3 +306,8 @@ func (d *requestDistributor) remove(r *distReq) { r.element = nil } } + +func (d *requestDistributor) close() { + close(d.closeCh) + d.wg.Wait() +} diff --git a/les/distributor_test.go b/les/distributor_test.go index 8c7621f26b35..539c1aa7d781 100644 --- a/les/distributor_test.go +++ b/les/distributor_test.go @@ -14,8 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package light implements on-demand retrieval capable state and chain objects -// for the Ethereum Light Client. package les import ( @@ -23,6 +21,8 @@ import ( "sync" "testing" "time" + + "github.com/ethereum/go-ethereum/common/mclock" ) type testDistReq struct { @@ -86,8 +86,8 @@ func (p *testDistPeer) worker(t *testing.T, checkOrder bool, stop chan struct{}) const ( testDistBufLimit = 10000000 testDistMaxCost = 1000000 - testDistPeerCount = 5 - testDistReqCount = 5000 + testDistPeerCount = 2 + testDistReqCount = 10 testDistMaxResendCount = 3 ) @@ -121,13 +121,16 @@ func testRequestDistributor(t *testing.T, resend bool) { stop := make(chan struct{}) defer close(stop) - dist := newRequestDistributor(nil, stop) + dist := newRequestDistributor(nil, &mclock.System{}) var peers [testDistPeerCount]*testDistPeer for i := range peers { peers[i] = &testDistPeer{} go peers[i].worker(t, !resend, stop) dist.registerTestPeer(peers[i]) } + // Disable the mechanism that we will wait a few time for request + // even there is no suitable peer to send right now. + waitForPeers = 0 var wg sync.WaitGroup diff --git a/les/enr_entry.go b/les/enr_entry.go new file mode 100644 index 000000000000..c2a92dd999fa --- /dev/null +++ b/les/enr_entry.go @@ -0,0 +1,32 @@ +// Copyright 2019 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 ( + "github.com/ethereum/go-ethereum/rlp" +) + +// lesEntry is the "les" ENR entry. This is set for LES servers only. +type lesEntry struct { + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` +} + +// ENRKey implements enr.Entry. +func (e lesEntry) ENRKey() string { + return "les" +} diff --git a/les/execqueue.go b/les/execqueue.go index 614721bf0dd8..e0c88a990f07 100644 --- a/les/execqueue.go +++ b/les/execqueue.go @@ -44,7 +44,7 @@ func (q *execQueue) loop() { func (q *execQueue) waitNext(drop bool) (f func()) { q.mu.Lock() - if drop { + if drop && len(q.funcs) > 0 { // Remove the function that just executed. We do this here instead of when // dequeuing so len(q.funcs) includes the function that is running. q.funcs = append(q.funcs[:0], q.funcs[1:]...) @@ -84,6 +84,13 @@ func (q *execQueue) queue(f func()) bool { return ok } +// clear drops all queued functions +func (q *execQueue) clear() { + q.mu.Lock() + q.funcs = q.funcs[:0] + q.mu.Unlock() +} + // quit stops the exec queue. // quit waits for the current execution to finish before returning. func (q *execQueue) quit() { diff --git a/les/fetcher.go b/les/fetcher.go index 75cfb427f89e..df76c56d703d 100644 --- a/les/fetcher.go +++ b/les/fetcher.go @@ -14,7 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package les implements the Light Ethereum Subprotocol. package les import ( @@ -22,13 +21,13 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/mclock" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/light" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/log" ) const ( @@ -41,9 +40,8 @@ const ( // ODR system to ensure that we only request data related to a certain block from peers who have already processed // and announced that block. type lightFetcher struct { - pm *ProtocolManager - odr *LesOdr - chain *light.LightChain + handler *clientHandler + chain *light.LightChain lock sync.Mutex // lock protects access to the fetcher's internal state variables except sent requests maxConfirmedTd *big.Int @@ -52,11 +50,16 @@ type lightFetcher struct { syncing bool syncDone chan *peer - reqMu sync.RWMutex // reqMu protects access to sent header fetch requests - requested map[uint64]fetchRequest - deliverChn chan fetchResponse - timeoutChn chan uint64 - requestChn chan bool // true if initiated from outside + reqMu sync.RWMutex // reqMu protects access to sent header fetch requests + requested map[uint64]fetchRequest + deliverChn chan fetchResponse + timeoutChn chan uint64 + requestTriggered bool + requestTrigger chan struct{} + lastTrustedHeader *types.Header + + closeCh chan struct{} + wg sync.WaitGroup } // fetcherPeerInfo holds fetcher-specific information about each active peer @@ -106,53 +109,54 @@ type fetchResponse struct { } // newLightFetcher creates a new light fetcher -func newLightFetcher(pm *ProtocolManager) *lightFetcher { +func newLightFetcher(h *clientHandler) *lightFetcher { f := &lightFetcher{ - pm: pm, - chain: pm.blockchain.(*light.LightChain), - odr: pm.odr, + handler: h, + chain: h.backend.blockchain, peers: make(map[*peer]*fetcherPeerInfo), deliverChn: make(chan fetchResponse, 100), requested: make(map[uint64]fetchRequest), timeoutChn: make(chan uint64), - requestChn: make(chan bool, 100), + requestTrigger: make(chan struct{}, 1), syncDone: make(chan *peer), + closeCh: make(chan struct{}), maxConfirmedTd: big.NewInt(0), } - pm.peers.notify(f) + h.backend.peers.notify(f) - f.pm.wg.Add(1) + f.wg.Add(1) go f.syncLoop() return f } +func (f *lightFetcher) close() { + close(f.closeCh) + f.wg.Wait() +} + // syncLoop is the main event loop of the light fetcher func (f *lightFetcher) syncLoop() { - requesting := false - defer f.pm.wg.Done() + defer f.wg.Done() for { select { - case <-f.pm.quitSync: + case <-f.closeCh: return - // when a new announce is received, request loop keeps running until - // no further requests are necessary or possible - case newAnnounce := <-f.requestChn: + // request loop keeps running until no further requests are necessary or possible + case <-f.requestTrigger: f.lock.Lock() - s := requesting - requesting = false var ( rq *distReq reqID uint64 syncing bool ) - if !f.syncing && !(newAnnounce && s) { + if !f.syncing { rq, reqID, syncing = f.nextRequest() } + f.requestTriggered = rq != nil f.lock.Unlock() if rq != nil { - requesting = true - if _, ok := <-f.pm.reqDist.queue(rq); ok { + if _, ok := <-f.handler.backend.reqDist.queue(rq); ok { if syncing { f.lock.Lock() f.syncing = true @@ -168,11 +172,11 @@ func (f *lightFetcher) syncLoop() { } f.reqMu.Unlock() // keep starting new requests while possible - f.requestChn <- false + f.requestTrigger <- struct{}{} }() } } else { - f.requestChn <- false + f.requestTrigger <- struct{}{} } } case reqID := <-f.timeoutChn: @@ -183,9 +187,9 @@ func (f *lightFetcher) syncLoop() { } f.reqMu.Unlock() if ok { - f.pm.serverPool.adjustResponseTime(req.peer.poolEntry, time.Duration(mclock.Now()-req.sent), true) + f.handler.backend.serverPool.adjustResponseTime(req.peer.poolEntry, time.Duration(mclock.Now()-req.sent), true) req.peer.Log().Debug("Fetching data timed out hard") - go f.pm.removePeer(req.peer.id) + go f.handler.removePeer(req.peer.id) } case resp := <-f.deliverChn: f.reqMu.Lock() @@ -198,12 +202,12 @@ func (f *lightFetcher) syncLoop() { } f.reqMu.Unlock() if ok { - f.pm.serverPool.adjustResponseTime(req.peer.poolEntry, time.Duration(mclock.Now()-req.sent), req.timeout) + f.handler.backend.serverPool.adjustResponseTime(req.peer.poolEntry, time.Duration(mclock.Now()-req.sent), req.timeout) } f.lock.Lock() if !ok || !(f.syncing || f.processResponse(req, resp)) { resp.peer.Log().Debug("Failed processing response") - go f.pm.removePeer(resp.peer.id) + go f.handler.removePeer(resp.peer.id) } f.lock.Unlock() case p := <-f.syncDone: @@ -212,7 +216,7 @@ func (f *lightFetcher) syncLoop() { f.checkSyncedHeaders(p) f.syncing = false f.lock.Unlock() - f.requestChn <- false + f.requestTrigger <- struct{}{} // f.requestTriggered is always true here } } } @@ -227,7 +231,6 @@ func (f *lightFetcher) registerPeer(p *peer) { f.lock.Lock() defer f.lock.Unlock() - f.peers[p] = &fetcherPeerInfo{nodeByHash: make(map[common.Hash]*fetcherTreeNode)} } @@ -261,7 +264,7 @@ func (f *lightFetcher) announce(p *peer, head *announceData) { if fp.lastAnnounced != nil && head.Td.Cmp(fp.lastAnnounced.td) <= 0 { // announced tds should be strictly monotonic p.Log().Debug("Received non-monotonic td", "current", head.Td, "previous", fp.lastAnnounced.td) - go f.pm.removePeer(p.id) + go f.handler.removePeer(p.id) return } @@ -280,8 +283,10 @@ func (f *lightFetcher) announce(p *peer, head *announceData) { fp.nodeCnt = 0 fp.nodeByHash = make(map[common.Hash]*fetcherTreeNode) } + // check if the node count is too high to add new nodes, discard oldest ones if necessary if n != nil { - // check if the node count is too high to add new nodes, discard oldest ones if necessary + // n is now the reorg common ancestor, add a new branch of nodes + // check if the node count is too high to add new nodes locked := false for uint64(fp.nodeCnt)+head.Number-n.number > maxNodeCount && fp.root != nil { if !locked { @@ -292,7 +297,7 @@ func (f *lightFetcher) announce(p *peer, head *announceData) { // if one of root's children is canonical, keep it, delete other branches and root itself var newRoot *fetcherTreeNode for i, nn := range fp.root.children { - if rawdb.ReadCanonicalHash(f.pm.chainDb, nn.number) == nn.hash { + if rawdb.ReadCanonicalHash(f.handler.backend.chainDb, nn.number) == nn.hash { fp.root.children = append(fp.root.children[:i], fp.root.children[i+1:]...) nn.parent = nil newRoot = nn @@ -325,6 +330,7 @@ func (f *lightFetcher) announce(p *peer, head *announceData) { fp.nodeByHash[n.hash] = n } } + if n == nil { // could not find reorg common ancestor or had to delete entire tree, a new root and a resync is needed if fp.root != nil { @@ -344,7 +350,10 @@ func (f *lightFetcher) announce(p *peer, head *announceData) { fp.lastAnnounced = n p.lock.Unlock() f.checkUpdateStats(p, nil) - f.requestChn <- true + if !f.requestTriggered { + f.requestTriggered = true + f.requestTrigger <- struct{}{} + } } // peerHasBlock returns true if we can assume the peer knows the given block @@ -381,7 +390,7 @@ func (f *lightFetcher) peerHasBlock(p *peer, hash common.Hash, number uint64, ha // // when syncing, just check if it is part of the known chain, there is nothing better we // can do since we do not know the most recent block hash yet - return rawdb.ReadCanonicalHash(f.pm.chainDb, fp.root.number) == fp.root.hash && rawdb.ReadCanonicalHash(f.pm.chainDb, number) == hash + return rawdb.ReadCanonicalHash(f.handler.backend.chainDb, fp.root.number) == fp.root.hash && rawdb.ReadCanonicalHash(f.handler.backend.chainDb, number) == hash } // requestAmount calculates the amount of headers to be downloaded starting @@ -411,25 +420,13 @@ func (f *lightFetcher) requestedID(reqID uint64) bool { // to be downloaded starting from the head backwards is also returned func (f *lightFetcher) nextRequest() (*distReq, uint64, bool) { var ( - bestHash common.Hash - bestAmount uint64 + bestHash common.Hash + bestAmount uint64 + bestTd *big.Int + bestSyncing bool ) - bestTd := f.maxConfirmedTd - bestSyncing := false + bestHash, bestAmount, bestTd, bestSyncing = f.findBestRequest() - for p, fp := range f.peers { - for hash, n := range fp.nodeByHash { - if !f.checkKnownNode(p, n) && !n.requested && (bestTd == nil || n.td.Cmp(bestTd) >= 0) { - amount := f.requestAmount(p, n) - if bestTd == nil || n.td.Cmp(bestTd) > 0 || amount < bestAmount { - bestHash = hash - bestAmount = amount - bestTd = n.td - bestSyncing = fp.bestConfirmed == nil || fp.root == nil || !f.checkKnownNode(p, fp.root) - } - } - } - } if bestTd == f.maxConfirmedTd { return nil, 0, false } @@ -437,72 +434,132 @@ func (f *lightFetcher) nextRequest() (*distReq, uint64, bool) { var rq *distReq reqID := genReqID() if bestSyncing { - rq = &distReq{ - getCost: func(dp distPeer) uint64 { - return 0 - }, - canSend: func(dp distPeer) bool { - p := dp.(*peer) - f.lock.Lock() - defer f.lock.Unlock() - - fp := f.peers[p] - return fp != nil && fp.nodeByHash[bestHash] != nil - }, - request: func(dp distPeer) func() { - go func() { - p := dp.(*peer) - p.Log().Debug("Synchronisation started") - f.pm.synchronise(p) - f.syncDone <- p - }() - return nil - }, - } + rq = f.newFetcherDistReqForSync(bestHash) } else { - rq = &distReq{ - getCost: func(dp distPeer) uint64 { - p := dp.(*peer) - return p.GetRequestCost(GetBlockHeadersMsg, int(bestAmount)) - }, - canSend: func(dp distPeer) bool { + rq = f.newFetcherDistReq(bestHash, reqID, bestAmount) + } + return rq, reqID, bestSyncing +} + +// findBestRequest finds the best head to request that has been announced by but not yet requested from a known peer. +// It also returns the announced Td (which should be verified after fetching the head), +// the necessary amount to request and whether a downloader sync is necessary instead of a normal header request. +func (f *lightFetcher) findBestRequest() (bestHash common.Hash, bestAmount uint64, bestTd *big.Int, bestSyncing bool) { + bestTd = f.maxConfirmedTd + bestSyncing = false + + for p, fp := range f.peers { + for hash, n := range fp.nodeByHash { + if f.checkKnownNode(p, n) || n.requested { + continue + } + // if ulc mode is disabled, isTrustedHash returns true + amount := f.requestAmount(p, n) + if (bestTd == nil || n.td.Cmp(bestTd) > 0 || amount < bestAmount) && (f.isTrustedHash(hash) || f.maxConfirmedTd.Int64() == 0) { + bestHash = hash + bestTd = n.td + bestAmount = amount + bestSyncing = fp.bestConfirmed == nil || fp.root == nil || !f.checkKnownNode(p, fp.root) + } + } + } + return +} + +// isTrustedHash checks if the block can be trusted by the minimum trusted fraction. +func (f *lightFetcher) isTrustedHash(hash common.Hash) bool { + // If ultra light cliet mode is disabled, trust all hashes + if f.handler.ulc == nil { + return true + } + // Ultra light enabled, only trust after enough confirmations + var agreed int + for peer, info := range f.peers { + if peer.trusted && info.nodeByHash[hash] != nil { + agreed++ + } + } + return 100*agreed/len(f.handler.ulc.keys) >= f.handler.ulc.fraction +} + +func (f *lightFetcher) newFetcherDistReqForSync(bestHash common.Hash) *distReq { + return &distReq{ + getCost: func(dp distPeer) uint64 { + return 0 + }, + canSend: func(dp distPeer) bool { + p := dp.(*peer) + f.lock.Lock() + defer f.lock.Unlock() + + if p.onlyAnnounce { + return false + } + fp := f.peers[p] + return fp != nil && fp.nodeByHash[bestHash] != nil + }, + request: func(dp distPeer) func() { + if f.handler.ulc != nil { + // Keep last trusted header before sync + f.setLastTrustedHeader(f.chain.CurrentHeader()) + } + go func() { p := dp.(*peer) - f.lock.Lock() - defer f.lock.Unlock() + p.Log().Debug("Synchronisation started") + f.handler.synchronise(p) + f.syncDone <- p + }() + return nil + }, + } +} - fp := f.peers[p] - if fp == nil { - return false - } +// newFetcherDistReq creates a new request for the distributor. +func (f *lightFetcher) newFetcherDistReq(bestHash common.Hash, reqID uint64, bestAmount uint64) *distReq { + return &distReq{ + getCost: func(dp distPeer) uint64 { + p := dp.(*peer) + return p.GetRequestCost(GetBlockHeadersMsg, int(bestAmount)) + }, + canSend: func(dp distPeer) bool { + p := dp.(*peer) + f.lock.Lock() + defer f.lock.Unlock() + + if p.onlyAnnounce { + return false + } + fp := f.peers[p] + if fp == nil { + return false + } + n := fp.nodeByHash[bestHash] + return n != nil && !n.requested + }, + request: func(dp distPeer) func() { + p := dp.(*peer) + f.lock.Lock() + fp := f.peers[p] + if fp != nil { n := fp.nodeByHash[bestHash] - return n != nil && !n.requested - }, - request: func(dp distPeer) func() { - p := dp.(*peer) - f.lock.Lock() - fp := f.peers[p] - if fp != nil { - n := fp.nodeByHash[bestHash] - if n != nil { - n.requested = true - } + if n != nil { + n.requested = true } - f.lock.Unlock() - - cost := p.GetRequestCost(GetBlockHeadersMsg, int(bestAmount)) - p.fcServer.QueueRequest(reqID, cost) - f.reqMu.Lock() - f.requested[reqID] = fetchRequest{hash: bestHash, amount: bestAmount, peer: p, sent: mclock.Now()} - f.reqMu.Unlock() - go func() { - time.Sleep(hardRequestTimeout) - f.timeoutChn <- reqID - }() - return func() { p.RequestHeadersByHash(reqID, cost, bestHash, int(bestAmount), 0, true) } - }, - } + } + f.lock.Unlock() + + cost := p.GetRequestCost(GetBlockHeadersMsg, int(bestAmount)) + p.fcServer.QueuedRequest(reqID, cost) + f.reqMu.Lock() + f.requested[reqID] = fetchRequest{hash: bestHash, amount: bestAmount, peer: p, sent: mclock.Now()} + f.reqMu.Unlock() + go func() { + time.Sleep(hardRequestTimeout) + f.timeoutChn <- reqID + }() + return func() { p.RequestHeadersByHash(reqID, cost, bestHash, int(bestAmount), 0, true) } + }, } - return rq, reqID, bestSyncing } // deliverHeaders delivers header download request responses for processing @@ -520,6 +577,7 @@ func (f *lightFetcher) processResponse(req fetchRequest, resp fetchResponse) boo for i, header := range resp.headers { headers[int(req.amount)-1-i] = header } + if _, err := f.chain.InsertHeaderChain(headers, 1); err != nil { if err == consensus.ErrFutureBlock { return true @@ -544,15 +602,17 @@ func (f *lightFetcher) processResponse(req fetchRequest, resp fetchResponse) boo // downloaded and validated batch or headers func (f *lightFetcher) newHeaders(headers []*types.Header, tds []*big.Int) { var maxTd *big.Int + for p, fp := range f.peers { if !f.checkAnnouncedHeaders(fp, headers, tds) { p.Log().Debug("Inconsistent announcement") - go f.pm.removePeer(p.id) + go f.handler.removePeer(p.id) } if fp.confirmedTd != nil && (maxTd == nil || maxTd.Cmp(fp.confirmedTd) > 0) { maxTd = fp.confirmedTd } } + if maxTd != nil { f.updateMaxConfirmedTd(maxTd) } @@ -640,22 +700,66 @@ func (f *lightFetcher) checkSyncedHeaders(p *peer) { p.Log().Debug("Unknown peer to check sync headers") return } - n := fp.lastAnnounced - var td *big.Int - for n != nil { - if td = f.chain.GetTd(n.hash, n.number); td != nil { + var ( + node = fp.lastAnnounced + td *big.Int + ) + if f.handler.ulc != nil { + // Roll back untrusted blocks + h, unapproved := f.lastTrustedTreeNode(p) + f.chain.Rollback(unapproved) + node = fp.nodeByHash[h.Hash()] + } + // Find last valid block + for node != nil { + if td = f.chain.GetTd(node.hash, node.number); td != nil { break } - n = n.parent + node = node.parent } - // now n is the latest downloaded header after syncing - if n == nil { + // Now node is the latest downloaded/approved header after syncing + if node == nil { p.Log().Debug("Synchronisation failed") - go f.pm.removePeer(p.id) - } else { - header := f.chain.GetHeader(n.hash, n.number) - f.newHeaders([]*types.Header{header}, []*big.Int{td}) + go f.handler.removePeer(p.id) + return } + header := f.chain.GetHeader(node.hash, node.number) + f.newHeaders([]*types.Header{header}, []*big.Int{td}) +} + +// lastTrustedTreeNode return last approved treeNode and a list of unapproved hashes +func (f *lightFetcher) lastTrustedTreeNode(p *peer) (*types.Header, []common.Hash) { + unapprovedHashes := make([]common.Hash, 0) + current := f.chain.CurrentHeader() + + if f.lastTrustedHeader == nil { + return current, unapprovedHashes + } + + canonical := f.chain.CurrentHeader() + if canonical.Number.Uint64() > f.lastTrustedHeader.Number.Uint64() { + canonical = f.chain.GetHeaderByNumber(f.lastTrustedHeader.Number.Uint64()) + } + commonAncestor := rawdb.FindCommonAncestor(f.handler.backend.chainDb, canonical, f.lastTrustedHeader) + if commonAncestor == nil { + log.Error("Common ancestor of last trusted header and canonical header is nil", "canonical hash", canonical.Hash(), "trusted hash", f.lastTrustedHeader.Hash()) + return current, unapprovedHashes + } + + for current.Hash() == commonAncestor.Hash() { + if f.isTrustedHash(current.Hash()) { + break + } + unapprovedHashes = append(unapprovedHashes, current.Hash()) + current = f.chain.GetHeader(current.ParentHash, current.Number.Uint64()-1) + } + return current, unapprovedHashes +} + +func (f *lightFetcher) setLastTrustedHeader(h *types.Header) { + f.lock.Lock() + defer f.lock.Unlock() + f.lastTrustedHeader = h } // checkKnownNode checks if a block tree node is known (downloaded and validated) @@ -682,7 +786,7 @@ func (f *lightFetcher) checkKnownNode(p *peer, n *fetcherTreeNode) bool { } if !f.checkAnnouncedHeaders(fp, []*types.Header{header}, []*big.Int{td}) { p.Log().Debug("Inconsistent announcement") - go f.pm.removePeer(p.id) + go f.handler.removePeer(p.id) } if fp.confirmedTd != nil { f.updateMaxConfirmedTd(fp.confirmedTd) @@ -747,6 +851,7 @@ func (f *lightFetcher) updateMaxConfirmedTd(td *big.Int) { if f.lastUpdateStats != nil { f.lastUpdateStats.next = newEntry } + f.lastUpdateStats = newEntry for p := range f.peers { f.checkUpdateStats(p, newEntry) @@ -769,16 +874,17 @@ func (f *lightFetcher) checkUpdateStats(p *peer, newEntry *updateStatsEntry) { p.Log().Debug("Unknown peer to check update stats") return } + if newEntry != nil && fp.firstUpdateStats == nil { fp.firstUpdateStats = newEntry } for fp.firstUpdateStats != nil && fp.firstUpdateStats.time <= now-mclock.AbsTime(blockDelayTimeout) { - f.pm.serverPool.adjustBlockDelay(p.poolEntry, blockDelayTimeout) + f.handler.backend.serverPool.adjustBlockDelay(p.poolEntry, blockDelayTimeout) fp.firstUpdateStats = fp.firstUpdateStats.next } if fp.confirmedTd != nil { for fp.firstUpdateStats != nil && fp.firstUpdateStats.td.Cmp(fp.confirmedTd) <= 0 { - f.pm.serverPool.adjustBlockDelay(p.poolEntry, time.Duration(now-fp.firstUpdateStats.time)) + f.handler.backend.serverPool.adjustBlockDelay(p.poolEntry, time.Duration(now-fp.firstUpdateStats.time)) fp.firstUpdateStats = fp.firstUpdateStats.next } } diff --git a/les/flowcontrol/control.go b/les/flowcontrol/control.go index 30af21fd231b..490013677c63 100644 --- a/les/flowcontrol/control.go +++ b/les/flowcontrol/control.go @@ -18,166 +18,412 @@ package flowcontrol import ( + "fmt" "sync" "time" - "github.com/nebulaai/nbai-node/common/mclock" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/log" ) -const fcTimeConst = time.Millisecond +const ( + // fcTimeConst is the time constant applied for MinRecharge during linear + // buffer recharge period + fcTimeConst = time.Millisecond + // DecParamDelay is applied at server side when decreasing capacity in order to + // avoid a buffer underrun error due to requests sent by the client before + // receiving the capacity update announcement + DecParamDelay = time.Second * 2 + // keepLogs is the duration of keeping logs; logging is not used if zero + keepLogs = 0 +) +// ServerParams are the flow control parameters specified by a server for a client +// +// Note: a server can assign different amounts of capacity to each client by giving +// different parameters to them. type ServerParams struct { BufLimit, MinRecharge uint64 } +// scheduledUpdate represents a delayed flow control parameter update +type scheduledUpdate struct { + time mclock.AbsTime + params ServerParams +} + +// ClientNode is the flow control system's representation of a client +// (used in server mode only) type ClientNode struct { - params *ServerParams - bufValue uint64 - lastTime mclock.AbsTime - lock sync.Mutex - cm *ClientManager - cmNode *cmNode + params ServerParams + bufValue int64 + lastTime mclock.AbsTime + updateSchedule []scheduledUpdate + sumCost uint64 // sum of req costs received from this client + accepted map[uint64]uint64 // value = sumCost after accepting the given req + connected bool + lock sync.Mutex + cm *ClientManager + log *logger + cmNodeFields } -func NewClientNode(cm *ClientManager, params *ServerParams) *ClientNode { +// NewClientNode returns a new ClientNode +func NewClientNode(cm *ClientManager, params ServerParams) *ClientNode { node := &ClientNode{ - cm: cm, - params: params, - bufValue: params.BufLimit, - lastTime: mclock.Now(), + cm: cm, + params: params, + bufValue: int64(params.BufLimit), + lastTime: cm.clock.Now(), + accepted: make(map[uint64]uint64), + connected: true, + } + if keepLogs > 0 { + node.log = newLogger(keepLogs) } - node.cmNode = cm.addNode(node) + cm.connect(node) return node } -func (peer *ClientNode) Remove(cm *ClientManager) { - cm.removeNode(peer.cmNode) +// Disconnect should be called when a client is disconnected +func (node *ClientNode) Disconnect() { + node.lock.Lock() + defer node.lock.Unlock() + + node.connected = false + node.cm.disconnect(node) +} + +// BufferStatus returns the current buffer value and limit +func (node *ClientNode) BufferStatus() (uint64, uint64) { + node.lock.Lock() + defer node.lock.Unlock() + + if !node.connected { + return 0, 0 + } + now := node.cm.clock.Now() + node.update(now) + node.cm.updateBuffer(node, 0, now) + bv := node.bufValue + if bv < 0 { + bv = 0 + } + return uint64(bv), node.params.BufLimit +} + +// OneTimeCost subtracts the given amount from the node's buffer. +// +// Note: this call can take the buffer into the negative region internally. +// In this case zero buffer value is returned by exported calls and no requests +// are accepted. +func (node *ClientNode) OneTimeCost(cost uint64) { + node.lock.Lock() + defer node.lock.Unlock() + + now := node.cm.clock.Now() + node.update(now) + node.bufValue -= int64(cost) + node.cm.updateBuffer(node, -int64(cost), now) +} + +// Freeze notifies the client manager about a client freeze event in which case +// the total capacity allowance is slightly reduced. +func (node *ClientNode) Freeze() { + node.lock.Lock() + frozenCap := node.params.MinRecharge + node.lock.Unlock() + node.cm.reduceTotalCapacity(frozenCap) } -func (peer *ClientNode) recalcBV(time mclock.AbsTime) { - dt := uint64(time - peer.lastTime) - if time < peer.lastTime { +// update recalculates the buffer value at a specified time while also performing +// scheduled flow control parameter updates if necessary +func (node *ClientNode) update(now mclock.AbsTime) { + for len(node.updateSchedule) > 0 && node.updateSchedule[0].time <= now { + node.recalcBV(node.updateSchedule[0].time) + node.updateParams(node.updateSchedule[0].params, now) + node.updateSchedule = node.updateSchedule[1:] + } + node.recalcBV(now) +} + +// recalcBV recalculates the buffer value at a specified time +func (node *ClientNode) recalcBV(now mclock.AbsTime) { + dt := uint64(now - node.lastTime) + if now < node.lastTime { dt = 0 } - peer.bufValue += peer.params.MinRecharge * dt / uint64(fcTimeConst) - if peer.bufValue > peer.params.BufLimit { - peer.bufValue = peer.params.BufLimit + node.bufValue += int64(node.params.MinRecharge * dt / uint64(fcTimeConst)) + if node.bufValue > int64(node.params.BufLimit) { + node.bufValue = int64(node.params.BufLimit) } - peer.lastTime = time + if node.log != nil { + node.log.add(now, fmt.Sprintf("updated bv=%d MRR=%d BufLimit=%d", node.bufValue, node.params.MinRecharge, node.params.BufLimit)) + } + node.lastTime = now } -func (peer *ClientNode) AcceptRequest() (uint64, bool) { - peer.lock.Lock() - defer peer.lock.Unlock() +// UpdateParams updates the flow control parameters of a client node +func (node *ClientNode) UpdateParams(params ServerParams) { + node.lock.Lock() + defer node.lock.Unlock() - time := mclock.Now() - peer.recalcBV(time) - return peer.bufValue, peer.cm.accept(peer.cmNode, time) + now := node.cm.clock.Now() + node.update(now) + if params.MinRecharge >= node.params.MinRecharge { + node.updateSchedule = nil + node.updateParams(params, now) + } else { + for i, s := range node.updateSchedule { + if params.MinRecharge >= s.params.MinRecharge { + s.params = params + node.updateSchedule = node.updateSchedule[:i+1] + return + } + } + node.updateSchedule = append(node.updateSchedule, scheduledUpdate{time: now + mclock.AbsTime(DecParamDelay), params: params}) + } +} + +// updateParams updates the flow control parameters of the node +func (node *ClientNode) updateParams(params ServerParams, now mclock.AbsTime) { + diff := int64(params.BufLimit - node.params.BufLimit) + if diff > 0 { + node.bufValue += diff + } else if node.bufValue > int64(params.BufLimit) { + node.bufValue = int64(params.BufLimit) + } + node.cm.updateParams(node, params, now) } -func (peer *ClientNode) RequestProcessed(cost uint64) (bv, realCost uint64) { - peer.lock.Lock() - defer peer.lock.Unlock() +// AcceptRequest returns whether a new request can be accepted and the missing +// buffer amount if it was rejected due to a buffer underrun. If accepted, maxCost +// is deducted from the flow control buffer. +func (node *ClientNode) AcceptRequest(reqID, index, maxCost uint64) (accepted bool, bufShort uint64, priority int64) { + node.lock.Lock() + defer node.lock.Unlock() - time := mclock.Now() - peer.recalcBV(time) - peer.bufValue -= cost - rcValue, rcost := peer.cm.processed(peer.cmNode, time) - if rcValue < peer.params.BufLimit { - bv := peer.params.BufLimit - rcValue - if bv > peer.bufValue { - peer.bufValue = bv + now := node.cm.clock.Now() + node.update(now) + if int64(maxCost) > node.bufValue { + if node.log != nil { + node.log.add(now, fmt.Sprintf("rejected reqID=%d bv=%d maxCost=%d", reqID, node.bufValue, maxCost)) + node.log.dump(now) } + return false, maxCost - uint64(node.bufValue), 0 } - return peer.bufValue, rcost + node.bufValue -= int64(maxCost) + node.sumCost += maxCost + if node.log != nil { + node.log.add(now, fmt.Sprintf("accepted reqID=%d bv=%d maxCost=%d sumCost=%d", reqID, node.bufValue, maxCost, node.sumCost)) + } + node.accepted[index] = node.sumCost + return true, 0, node.cm.accepted(node, maxCost, now) +} + +// RequestProcessed should be called when the request has been processed +func (node *ClientNode) RequestProcessed(reqID, index, maxCost, realCost uint64) uint64 { + node.lock.Lock() + defer node.lock.Unlock() + + now := node.cm.clock.Now() + node.update(now) + node.cm.processed(node, maxCost, realCost, now) + bv := node.bufValue + int64(node.sumCost-node.accepted[index]) + if node.log != nil { + node.log.add(now, fmt.Sprintf("processed reqID=%d bv=%d maxCost=%d realCost=%d sumCost=%d oldSumCost=%d reportedBV=%d", reqID, node.bufValue, maxCost, realCost, node.sumCost, node.accepted[index], bv)) + } + delete(node.accepted, index) + if bv < 0 { + return 0 + } + return uint64(bv) } +// ServerNode is the flow control system's representation of a server +// (used in client mode only) type ServerNode struct { + clock mclock.Clock bufEstimate uint64 + bufRecharge bool lastTime mclock.AbsTime - params *ServerParams + params ServerParams sumCost uint64 // sum of req costs sent to this server pending map[uint64]uint64 // value = sumCost after sending the given req + log *logger lock sync.RWMutex } -func NewServerNode(params *ServerParams) *ServerNode { - return &ServerNode{ +// NewServerNode returns a new ServerNode +func NewServerNode(params ServerParams, clock mclock.Clock) *ServerNode { + node := &ServerNode{ + clock: clock, bufEstimate: params.BufLimit, - lastTime: mclock.Now(), + bufRecharge: false, + lastTime: clock.Now(), params: params, pending: make(map[uint64]uint64), } + if keepLogs > 0 { + node.log = newLogger(keepLogs) + } + return node } -func (peer *ServerNode) recalcBLE(time mclock.AbsTime) { - dt := uint64(time - peer.lastTime) - if time < peer.lastTime { - dt = 0 - } - peer.bufEstimate += peer.params.MinRecharge * dt / uint64(fcTimeConst) - if peer.bufEstimate > peer.params.BufLimit { - peer.bufEstimate = peer.params.BufLimit +// UpdateParams updates the flow control parameters of the node +func (node *ServerNode) UpdateParams(params ServerParams) { + node.lock.Lock() + defer node.lock.Unlock() + + node.recalcBLE(mclock.Now()) + if params.BufLimit > node.params.BufLimit { + node.bufEstimate += params.BufLimit - node.params.BufLimit + } else { + if node.bufEstimate > params.BufLimit { + node.bufEstimate = params.BufLimit + } } - peer.lastTime = time + node.params = params } -// safetyMargin is added to the flow control waiting time when estimated buffer value is low -const safetyMargin = time.Millisecond - -func (peer *ServerNode) canSend(maxCost uint64) (time.Duration, float64) { - peer.recalcBLE(mclock.Now()) - maxCost += uint64(safetyMargin) * peer.params.MinRecharge / uint64(fcTimeConst) - if maxCost > peer.params.BufLimit { - maxCost = peer.params.BufLimit +// recalcBLE recalculates the lowest estimate for the client's buffer value at +// the given server at the specified time +func (node *ServerNode) recalcBLE(now mclock.AbsTime) { + if now < node.lastTime { + return } - if peer.bufEstimate >= maxCost { - return 0, float64(peer.bufEstimate-maxCost) / float64(peer.params.BufLimit) + if node.bufRecharge { + dt := uint64(now - node.lastTime) + node.bufEstimate += node.params.MinRecharge * dt / uint64(fcTimeConst) + if node.bufEstimate >= node.params.BufLimit { + node.bufEstimate = node.params.BufLimit + node.bufRecharge = false + } + } + node.lastTime = now + if node.log != nil { + node.log.add(now, fmt.Sprintf("updated bufEst=%d MRR=%d BufLimit=%d", node.bufEstimate, node.params.MinRecharge, node.params.BufLimit)) } - return time.Duration((maxCost - peer.bufEstimate) * uint64(fcTimeConst) / peer.params.MinRecharge), 0 } +// safetyMargin is added to the flow control waiting time when estimated buffer value is low +const safetyMargin = time.Millisecond + // CanSend returns the minimum waiting time required before sending a request // with the given maximum estimated cost. Second return value is the relative // estimated buffer level after sending the request (divided by BufLimit). -func (peer *ServerNode) CanSend(maxCost uint64) (time.Duration, float64) { - peer.lock.RLock() - defer peer.lock.RUnlock() +func (node *ServerNode) CanSend(maxCost uint64) (time.Duration, float64) { + node.lock.RLock() + defer node.lock.RUnlock() - return peer.canSend(maxCost) + now := node.clock.Now() + node.recalcBLE(now) + maxCost += uint64(safetyMargin) * node.params.MinRecharge / uint64(fcTimeConst) + if maxCost > node.params.BufLimit { + maxCost = node.params.BufLimit + } + if node.bufEstimate >= maxCost { + relBuf := float64(node.bufEstimate-maxCost) / float64(node.params.BufLimit) + if node.log != nil { + node.log.add(now, fmt.Sprintf("canSend bufEst=%d maxCost=%d true relBuf=%f", node.bufEstimate, maxCost, relBuf)) + } + return 0, relBuf + } + timeLeft := time.Duration((maxCost - node.bufEstimate) * uint64(fcTimeConst) / node.params.MinRecharge) + if node.log != nil { + node.log.add(now, fmt.Sprintf("canSend bufEst=%d maxCost=%d false timeLeft=%v", node.bufEstimate, maxCost, timeLeft)) + } + return timeLeft, 0 } -// QueueRequest should be called when the request has been assigned to the given +// QueuedRequest should be called when the request has been assigned to the given // server node, before putting it in the send queue. It is mandatory that requests -// are sent in the same order as the QueueRequest calls are made. -func (peer *ServerNode) QueueRequest(reqID, maxCost uint64) { - peer.lock.Lock() - defer peer.lock.Unlock() +// are sent in the same order as the QueuedRequest calls are made. +func (node *ServerNode) QueuedRequest(reqID, maxCost uint64) { + node.lock.Lock() + defer node.lock.Unlock() - peer.bufEstimate -= maxCost - peer.sumCost += maxCost - peer.pending[reqID] = peer.sumCost + now := node.clock.Now() + node.recalcBLE(now) + // Note: we do not know when requests actually arrive to the server so bufRecharge + // is not turned on here if buffer was full; in this case it is going to be turned + // on by the first reply's bufValue feedback + if node.bufEstimate >= maxCost { + node.bufEstimate -= maxCost + } else { + log.Error("Queued request with insufficient buffer estimate") + node.bufEstimate = 0 + } + node.sumCost += maxCost + node.pending[reqID] = node.sumCost + if node.log != nil { + node.log.add(now, fmt.Sprintf("queued reqID=%d bufEst=%d maxCost=%d sumCost=%d", reqID, node.bufEstimate, maxCost, node.sumCost)) + } } -// GotReply adjusts estimated buffer value according to the value included in +// ReceivedReply adjusts estimated buffer value according to the value included in // the latest request reply. -func (peer *ServerNode) GotReply(reqID, bv uint64) { +func (node *ServerNode) ReceivedReply(reqID, bv uint64) { + node.lock.Lock() + defer node.lock.Unlock() - peer.lock.Lock() - defer peer.lock.Unlock() - - if bv > peer.params.BufLimit { - bv = peer.params.BufLimit + now := node.clock.Now() + node.recalcBLE(now) + if bv > node.params.BufLimit { + bv = node.params.BufLimit } - sc, ok := peer.pending[reqID] + sc, ok := node.pending[reqID] if !ok { return } - delete(peer.pending, reqID) - cc := peer.sumCost - sc - peer.bufEstimate = 0 + delete(node.pending, reqID) + cc := node.sumCost - sc + newEstimate := uint64(0) if bv > cc { - peer.bufEstimate = bv - cc + newEstimate = bv - cc + } + if newEstimate > node.bufEstimate { + // Note: we never reduce the buffer estimate based on the reported value because + // this can only happen because of the delayed delivery of the latest reply. + // The lowest estimate based on the previous reply can still be considered valid. + node.bufEstimate = newEstimate + } + + node.bufRecharge = node.bufEstimate < node.params.BufLimit + node.lastTime = now + if node.log != nil { + node.log.add(now, fmt.Sprintf("received reqID=%d bufEst=%d reportedBv=%d sumCost=%d oldSumCost=%d", reqID, node.bufEstimate, bv, node.sumCost, sc)) + } +} + +// ResumeFreeze cleans all pending requests and sets the buffer estimate to the +// reported value after resuming from a frozen state +func (node *ServerNode) ResumeFreeze(bv uint64) { + node.lock.Lock() + defer node.lock.Unlock() + + for reqID := range node.pending { + delete(node.pending, reqID) + } + now := node.clock.Now() + node.recalcBLE(now) + if bv > node.params.BufLimit { + bv = node.params.BufLimit + } + node.bufEstimate = bv + node.bufRecharge = node.bufEstimate < node.params.BufLimit + node.lastTime = now + if node.log != nil { + node.log.add(now, fmt.Sprintf("unfreeze bv=%d sumCost=%d", bv, node.sumCost)) + } +} + +// DumpLogs dumps the event log if logging is used +func (node *ServerNode) DumpLogs() { + node.lock.Lock() + defer node.lock.Unlock() + + if node.log != nil { + node.log.dump(node.clock.Now()) } - peer.lastTime = mclock.Now() } diff --git a/les/flowcontrol/logger.go b/les/flowcontrol/logger.go new file mode 100644 index 000000000000..428d7fbf22c9 --- /dev/null +++ b/les/flowcontrol/logger.go @@ -0,0 +1,65 @@ +// Copyright 2019 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 flowcontrol + +import ( + "fmt" + "time" + + "github.com/ethereum/go-ethereum/common/mclock" +) + +// logger collects events in string format and discards events older than the +// "keep" parameter +type logger struct { + events map[uint64]logEvent + writePtr, delPtr uint64 + keep time.Duration +} + +// logEvent describes a single event +type logEvent struct { + time mclock.AbsTime + event string +} + +// newLogger creates a new logger +func newLogger(keep time.Duration) *logger { + return &logger{ + events: make(map[uint64]logEvent), + keep: keep, + } +} + +// add adds a new event and discards old events if possible +func (l *logger) add(now mclock.AbsTime, event string) { + keepAfter := now - mclock.AbsTime(l.keep) + for l.delPtr < l.writePtr && l.events[l.delPtr].time <= keepAfter { + delete(l.events, l.delPtr) + l.delPtr++ + } + l.events[l.writePtr] = logEvent{now, event} + l.writePtr++ +} + +// dump prints all stored events +func (l *logger) dump(now mclock.AbsTime) { + for i := l.delPtr; i < l.writePtr; i++ { + e := l.events[i] + fmt.Println(time.Duration(e.time-now), e.event) + } +} diff --git a/les/flowcontrol/manager.go b/les/flowcontrol/manager.go index 2fe8c709d9ac..d6d0b1adde5a 100644 --- a/les/flowcontrol/manager.go +++ b/les/flowcontrol/manager.go @@ -14,211 +14,449 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package flowcontrol implements a client side flow control mechanism package flowcontrol import ( + "fmt" + "math" "sync" "time" - "github.com/nebulaai/nbai-node/common/mclock" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/common/prque" ) -const rcConst = 1000000 +// cmNodeFields are ClientNode fields used by the client manager +// Note: these fields are locked by the client manager's mutex +type cmNodeFields struct { + corrBufValue int64 // buffer value adjusted with the extra recharge amount + rcLastIntValue int64 // past recharge integrator value when corrBufValue was last updated + rcFullIntValue int64 // future recharge integrator value when corrBufValue will reach maximum + queueIndex int // position in the recharge queue (-1 if not queued) +} + +// FixedPointMultiplier is applied to the recharge integrator and the recharge curve. +// +// Note: fixed point arithmetic is required for the integrator because it is a +// constantly increasing value that can wrap around int64 limits (which behavior is +// also supported by the priority queue). A floating point value would gradually lose +// precision in this application. +// The recharge curve and all recharge values are encoded as fixed point because +// sumRecharge is frequently updated by adding or subtracting individual recharge +// values and perfect precision is required. +const FixedPointMultiplier = 1000000 + +var ( + capacityDropFactor = 0.1 + capacityRaiseTC = 1 / (3 * float64(time.Hour)) // time constant for raising the capacity factor + capacityRaiseThresholdRatio = 1.125 // total/connected capacity ratio threshold for raising the capacity factor +) -type cmNode struct { - node *ClientNode - lastUpdate mclock.AbsTime - serving, recharging bool - rcWeight uint64 - rcValue, rcDelta, startValue int64 - finishRecharge mclock.AbsTime +// ClientManager controls the capacity assigned to the clients of a server. +// Since ServerParams guarantee a safe lower estimate for processable requests +// even in case of all clients being active, ClientManager calculates a +// corrigated buffer value and usually allows a higher remaining buffer value +// to be returned with each reply. +type ClientManager struct { + clock mclock.Clock + lock sync.Mutex + enabledCh chan struct{} + stop chan chan struct{} + + curve PieceWiseLinear + sumRecharge, totalRecharge, totalConnected uint64 + logTotalCap, totalCapacity float64 + logTotalCapRaiseLimit float64 + minLogTotalCap, maxLogTotalCap float64 + capacityRaiseThreshold uint64 + capLastUpdate mclock.AbsTime + totalCapacityCh chan uint64 + + // recharge integrator is increasing in each moment with a rate of + // (totalRecharge / sumRecharge)*FixedPointMultiplier or 0 if sumRecharge==0 + rcLastUpdate mclock.AbsTime // last time the recharge integrator was updated + rcLastIntValue int64 // last updated value of the recharge integrator + // recharge queue is a priority queue with currently recharging client nodes + // as elements. The priority value is rcFullIntValue which allows to quickly + // determine which client will first finish recharge. + rcQueue *prque.Prque } -func (node *cmNode) update(time mclock.AbsTime) { - dt := int64(time - node.lastUpdate) - node.rcValue += node.rcDelta * dt / rcConst - node.lastUpdate = time - if node.recharging && time >= node.finishRecharge { - node.recharging = false - node.rcDelta = 0 - node.rcValue = 0 +// NewClientManager returns a new client manager. +// Client manager enhances flow control performance by allowing client buffers +// to recharge quicker than the minimum guaranteed recharge rate if possible. +// The sum of all minimum recharge rates (sumRecharge) is updated each time +// a clients starts or finishes buffer recharging. Then an adjusted total +// recharge rate is calculated using a piecewise linear recharge curve: +// +// totalRecharge = curve(sumRecharge) +// (totalRecharge >= sumRecharge is enforced) +// +// Then the "bonus" buffer recharge is distributed between currently recharging +// clients proportionally to their minimum recharge rates. +// +// Note: total recharge is proportional to the average number of parallel running +// serving threads. A recharge value of 1000000 corresponds to one thread in average. +// The maximum number of allowed serving threads should always be considerably +// higher than the targeted average number. +// +// Note 2: although it is possible to specify a curve allowing the total target +// recharge starting from zero sumRecharge, it makes sense to add a linear ramp +// starting from zero in order to not let a single low-priority client use up +// the entire server capacity and thus ensure quick availability for others at +// any moment. +func NewClientManager(curve PieceWiseLinear, clock mclock.Clock) *ClientManager { + cm := &ClientManager{ + clock: clock, + rcQueue: prque.New(func(a interface{}, i int) { a.(*ClientNode).queueIndex = i }), + capLastUpdate: clock.Now(), + stop: make(chan chan struct{}), } + if curve != nil { + cm.SetRechargeCurve(curve) + } + go func() { + // regularly recalculate and update total capacity + for { + select { + case <-time.After(time.Minute): + cm.lock.Lock() + cm.updateTotalCapacity(cm.clock.Now(), true) + cm.lock.Unlock() + case stop := <-cm.stop: + close(stop) + return + } + } + }() + return cm } -func (node *cmNode) set(serving bool, simReqCnt, sumWeight uint64) { - if node.serving && !serving { - node.recharging = true - sumWeight += node.rcWeight - } - node.serving = serving - if node.recharging && serving { - node.recharging = false - sumWeight -= node.rcWeight +// Stop stops the client manager +func (cm *ClientManager) Stop() { + stop := make(chan struct{}) + cm.stop <- stop + <-stop +} + +// SetRechargeCurve updates the recharge curve +func (cm *ClientManager) SetRechargeCurve(curve PieceWiseLinear) { + cm.lock.Lock() + defer cm.lock.Unlock() + + now := cm.clock.Now() + cm.updateRecharge(now) + cm.curve = curve + if len(curve) > 0 { + cm.totalRecharge = curve[len(curve)-1].Y + } else { + cm.totalRecharge = 0 } +} - node.rcDelta = 0 - if serving { - node.rcDelta = int64(rcConst / simReqCnt) +// SetCapacityRaiseThreshold sets a threshold value used for raising capFactor. +// Either if the difference between total allowed and connected capacity is less +// than this threshold or if their ratio is less than capacityRaiseThresholdRatio +// then capFactor is allowed to slowly raise. +func (cm *ClientManager) SetCapacityLimits(min, max, raiseThreshold uint64) { + if min < 1 { + min = 1 } - if node.recharging { - node.rcDelta = -int64(node.node.cm.rcRecharge * node.rcWeight / sumWeight) - node.finishRecharge = node.lastUpdate + mclock.AbsTime(node.rcValue*rcConst/(-node.rcDelta)) + cm.minLogTotalCap = math.Log(float64(min)) + if max < 1 { + max = 1 } + cm.maxLogTotalCap = math.Log(float64(max)) + cm.logTotalCap = cm.maxLogTotalCap + cm.capacityRaiseThreshold = raiseThreshold + cm.refreshCapacity() } -type ClientManager struct { - lock sync.Mutex - nodes map[*cmNode]struct{} - simReqCnt, sumWeight, rcSumValue uint64 - maxSimReq, maxRcSum uint64 - rcRecharge uint64 - resumeQueue chan chan bool - time mclock.AbsTime +// connect should be called when a client is connected, before passing it to any +// other ClientManager function +func (cm *ClientManager) connect(node *ClientNode) { + cm.lock.Lock() + defer cm.lock.Unlock() + + now := cm.clock.Now() + cm.updateRecharge(now) + node.corrBufValue = int64(node.params.BufLimit) + node.rcLastIntValue = cm.rcLastIntValue + node.queueIndex = -1 + cm.updateTotalCapacity(now, true) + cm.totalConnected += node.params.MinRecharge + cm.updateRaiseLimit() } -func NewClientManager(rcTarget, maxSimReq, maxRcSum uint64) *ClientManager { - cm := &ClientManager{ - nodes: make(map[*cmNode]struct{}), - resumeQueue: make(chan chan bool), - rcRecharge: rcConst * rcConst / (100*rcConst/rcTarget - rcConst), - maxSimReq: maxSimReq, - maxRcSum: maxRcSum, - } - go cm.queueProc() - return cm +// disconnect should be called when a client is disconnected +func (cm *ClientManager) disconnect(node *ClientNode) { + cm.lock.Lock() + defer cm.lock.Unlock() + + now := cm.clock.Now() + cm.updateRecharge(cm.clock.Now()) + cm.updateTotalCapacity(now, true) + cm.totalConnected -= node.params.MinRecharge + cm.updateRaiseLimit() } -func (self *ClientManager) Stop() { - self.lock.Lock() - defer self.lock.Unlock() +// accepted is called when a request with given maximum cost is accepted. +// It returns a priority indicator for the request which is used to determine placement +// in the serving queue. Older requests have higher priority by default. If the client +// is almost out of buffer, request priority is reduced. +func (cm *ClientManager) accepted(node *ClientNode, maxCost uint64, now mclock.AbsTime) (priority int64) { + cm.lock.Lock() + defer cm.lock.Unlock() - // signal any waiting accept routines to return false - self.nodes = make(map[*cmNode]struct{}) - close(self.resumeQueue) + cm.updateNodeRc(node, -int64(maxCost), &node.params, now) + rcTime := (node.params.BufLimit - uint64(node.corrBufValue)) * FixedPointMultiplier / node.params.MinRecharge + return -int64(now) - int64(rcTime) } -func (self *ClientManager) addNode(cnode *ClientNode) *cmNode { - time := mclock.Now() - node := &cmNode{ - node: cnode, - lastUpdate: time, - finishRecharge: time, - rcWeight: 1, +// processed updates the client buffer according to actual request cost after +// serving has been finished. +// +// Note: processed should always be called for all accepted requests +func (cm *ClientManager) processed(node *ClientNode, maxCost, realCost uint64, now mclock.AbsTime) { + if realCost > maxCost { + realCost = maxCost } - self.lock.Lock() - defer self.lock.Unlock() + cm.updateBuffer(node, int64(maxCost-realCost), now) +} + +// updateBuffer recalulates the corrected buffer value, adds the given value to it +// and updates the node's actual buffer value if possible +func (cm *ClientManager) updateBuffer(node *ClientNode, add int64, now mclock.AbsTime) { + cm.lock.Lock() + defer cm.lock.Unlock() - self.nodes[node] = struct{}{} - self.update(mclock.Now()) - return node + cm.updateNodeRc(node, add, &node.params, now) + if node.corrBufValue > node.bufValue { + if node.log != nil { + node.log.add(now, fmt.Sprintf("corrected bv=%d oldBv=%d", node.corrBufValue, node.bufValue)) + } + node.bufValue = node.corrBufValue + } } -func (self *ClientManager) removeNode(node *cmNode) { - self.lock.Lock() - defer self.lock.Unlock() +// updateParams updates the flow control parameters of a client node +func (cm *ClientManager) updateParams(node *ClientNode, params ServerParams, now mclock.AbsTime) { + cm.lock.Lock() + defer cm.lock.Unlock() - time := mclock.Now() - self.stop(node, time) - delete(self.nodes, node) - self.update(time) + cm.updateRecharge(now) + cm.updateTotalCapacity(now, true) + cm.totalConnected += params.MinRecharge - node.params.MinRecharge + cm.updateRaiseLimit() + cm.updateNodeRc(node, 0, ¶ms, now) } -// recalc sumWeight -func (self *ClientManager) updateNodes(time mclock.AbsTime) (rce bool) { - var sumWeight, rcSum uint64 - for node := range self.nodes { - rc := node.recharging - node.update(time) - if rc && !node.recharging { - rce = true - } - if node.recharging { - sumWeight += node.rcWeight - } - rcSum += uint64(node.rcValue) +// updateRaiseLimit recalculates the limiting value until which logTotalCap +// can be raised when no client freeze events occur +func (cm *ClientManager) updateRaiseLimit() { + if cm.capacityRaiseThreshold == 0 { + cm.logTotalCapRaiseLimit = 0 + return + } + limit := float64(cm.totalConnected + cm.capacityRaiseThreshold) + limit2 := float64(cm.totalConnected) * capacityRaiseThresholdRatio + if limit2 > limit { + limit = limit2 + } + if limit < 1 { + limit = 1 } - self.sumWeight = sumWeight - self.rcSumValue = rcSum - return + cm.logTotalCapRaiseLimit = math.Log(limit) } -func (self *ClientManager) update(time mclock.AbsTime) { - for { - firstTime := time - for node := range self.nodes { - if node.recharging && node.finishRecharge < firstTime { - firstTime = node.finishRecharge - } +// updateRecharge updates the recharge integrator and checks the recharge queue +// for nodes with recently filled buffers +func (cm *ClientManager) updateRecharge(now mclock.AbsTime) { + lastUpdate := cm.rcLastUpdate + cm.rcLastUpdate = now + // updating is done in multiple steps if node buffers are filled and sumRecharge + // is decreased before the given target time + for cm.sumRecharge > 0 { + sumRecharge := cm.sumRecharge + if sumRecharge > cm.totalRecharge { + sumRecharge = cm.totalRecharge } - if self.updateNodes(firstTime) { - for node := range self.nodes { - if node.recharging { - node.set(node.serving, self.simReqCnt, self.sumWeight) - } - } - } else { - self.time = time + bonusRatio := float64(1) + v := cm.curve.ValueAt(sumRecharge) + s := float64(sumRecharge) + if v > s && s > 0 { + bonusRatio = v / s + } + dt := now - lastUpdate + // fetch the client that finishes first + rcqNode := cm.rcQueue.PopItem().(*ClientNode) // if sumRecharge > 0 then the queue cannot be empty + // check whether it has already finished + dtNext := mclock.AbsTime(float64(rcqNode.rcFullIntValue-cm.rcLastIntValue) / bonusRatio) + if dt < dtNext { + // not finished yet, put it back, update integrator according + // to current bonusRatio and return + cm.rcQueue.Push(rcqNode, -rcqNode.rcFullIntValue) + cm.rcLastIntValue += int64(bonusRatio * float64(dt)) return } + lastUpdate += dtNext + // finished recharging, update corrBufValue and sumRecharge if necessary and do next step + if rcqNode.corrBufValue < int64(rcqNode.params.BufLimit) { + rcqNode.corrBufValue = int64(rcqNode.params.BufLimit) + cm.sumRecharge -= rcqNode.params.MinRecharge + } + cm.rcLastIntValue = rcqNode.rcFullIntValue } } -func (self *ClientManager) canStartReq() bool { - return self.simReqCnt < self.maxSimReq && self.rcSumValue < self.maxRcSum +// updateNodeRc updates a node's corrBufValue and adds an external correction value. +// It also adds or removes the rcQueue entry and updates ServerParams and sumRecharge if necessary. +func (cm *ClientManager) updateNodeRc(node *ClientNode, bvc int64, params *ServerParams, now mclock.AbsTime) { + cm.updateRecharge(now) + wasFull := true + if node.corrBufValue != int64(node.params.BufLimit) { + wasFull = false + node.corrBufValue += (cm.rcLastIntValue - node.rcLastIntValue) * int64(node.params.MinRecharge) / FixedPointMultiplier + if node.corrBufValue > int64(node.params.BufLimit) { + node.corrBufValue = int64(node.params.BufLimit) + } + node.rcLastIntValue = cm.rcLastIntValue + } + node.corrBufValue += bvc + diff := int64(params.BufLimit - node.params.BufLimit) + if diff > 0 { + node.corrBufValue += diff + } + isFull := false + if node.corrBufValue >= int64(params.BufLimit) { + node.corrBufValue = int64(params.BufLimit) + isFull = true + } + if !wasFull { + cm.sumRecharge -= node.params.MinRecharge + } + if params != &node.params { + node.params = *params + } + if !isFull { + cm.sumRecharge += node.params.MinRecharge + if node.queueIndex != -1 { + cm.rcQueue.Remove(node.queueIndex) + } + node.rcLastIntValue = cm.rcLastIntValue + node.rcFullIntValue = cm.rcLastIntValue + (int64(node.params.BufLimit)-node.corrBufValue)*FixedPointMultiplier/int64(node.params.MinRecharge) + cm.rcQueue.Push(node, -node.rcFullIntValue) + } } -func (self *ClientManager) queueProc() { - for rc := range self.resumeQueue { - for { - time.Sleep(time.Millisecond * 10) - self.lock.Lock() - self.update(mclock.Now()) - cs := self.canStartReq() - self.lock.Unlock() - if cs { - break - } - } - close(rc) +// reduceTotalCapacity reduces the total capacity allowance in case of a client freeze event +func (cm *ClientManager) reduceTotalCapacity(frozenCap uint64) { + cm.lock.Lock() + defer cm.lock.Unlock() + + ratio := float64(1) + if frozenCap < cm.totalConnected { + ratio = float64(frozenCap) / float64(cm.totalConnected) } + now := cm.clock.Now() + cm.updateTotalCapacity(now, false) + cm.logTotalCap -= capacityDropFactor * ratio + if cm.logTotalCap < cm.minLogTotalCap { + cm.logTotalCap = cm.minLogTotalCap + } + cm.updateTotalCapacity(now, true) } -func (self *ClientManager) accept(node *cmNode, time mclock.AbsTime) bool { - self.lock.Lock() - defer self.lock.Unlock() +// updateTotalCapacity updates the total capacity factor. The capacity factor allows +// the total capacity of the system to go over the allowed total recharge value +// if clients go to frozen state sufficiently rarely. +// The capacity factor is dropped instantly by a small amount if a clients is frozen. +// It is raised slowly (with a large time constant) if the total connected capacity +// is close to the total allowed amount and no clients are frozen. +func (cm *ClientManager) updateTotalCapacity(now mclock.AbsTime, refresh bool) { + dt := now - cm.capLastUpdate + cm.capLastUpdate = now - self.update(time) - if !self.canStartReq() { - resume := make(chan bool) - self.lock.Unlock() - self.resumeQueue <- resume - <-resume - self.lock.Lock() - if _, ok := self.nodes[node]; !ok { - return false // reject if node has been removed or manager has been stopped + if cm.logTotalCap < cm.logTotalCapRaiseLimit { + cm.logTotalCap += capacityRaiseTC * float64(dt) + if cm.logTotalCap > cm.logTotalCapRaiseLimit { + cm.logTotalCap = cm.logTotalCapRaiseLimit } } - self.simReqCnt++ - node.set(true, self.simReqCnt, self.sumWeight) - node.startValue = node.rcValue - self.update(self.time) - return true + if cm.logTotalCap > cm.maxLogTotalCap { + cm.logTotalCap = cm.maxLogTotalCap + } + if refresh { + cm.refreshCapacity() + } } -func (self *ClientManager) stop(node *cmNode, time mclock.AbsTime) { - if node.serving { - self.update(time) - self.simReqCnt-- - node.set(false, self.simReqCnt, self.sumWeight) - self.update(time) +// refreshCapacity recalculates the total capacity value and sends an update to the subscription +// channel if the relative change of the value since the last update is more than 0.1 percent +func (cm *ClientManager) refreshCapacity() { + totalCapacity := math.Exp(cm.logTotalCap) + if totalCapacity >= cm.totalCapacity*0.999 && totalCapacity <= cm.totalCapacity*1.001 { + return } + cm.totalCapacity = totalCapacity + if cm.totalCapacityCh != nil { + select { + case cm.totalCapacityCh <- uint64(cm.totalCapacity): + default: + } + } +} + +// SubscribeTotalCapacity returns all future updates to the total capacity value +// through a channel and also returns the current value +func (cm *ClientManager) SubscribeTotalCapacity(ch chan uint64) uint64 { + cm.lock.Lock() + defer cm.lock.Unlock() + + cm.totalCapacityCh = ch + return uint64(cm.totalCapacity) } -func (self *ClientManager) processed(node *cmNode, time mclock.AbsTime) (rcValue, rcCost uint64) { - self.lock.Lock() - defer self.lock.Unlock() +// PieceWiseLinear is used to describe recharge curves +type PieceWiseLinear []struct{ X, Y uint64 } - self.stop(node, time) - return uint64(node.rcValue), uint64(node.rcValue - node.startValue) +// ValueAt returns the curve's value at a given point +func (pwl PieceWiseLinear) ValueAt(x uint64) float64 { + l := 0 + h := len(pwl) + if h == 0 { + return 0 + } + for h != l { + m := (l + h) / 2 + if x > pwl[m].X { + l = m + 1 + } else { + h = m + } + } + if l == 0 { + return float64(pwl[0].Y) + } + l-- + if h == len(pwl) { + return float64(pwl[l].Y) + } + dx := pwl[h].X - pwl[l].X + if dx < 1 { + return float64(pwl[l].Y) + } + return float64(pwl[l].Y) + float64(pwl[h].Y-pwl[l].Y)*float64(x-pwl[l].X)/float64(dx) +} + +// Valid returns true if the X coordinates of the curve points are non-strictly monotonic +func (pwl PieceWiseLinear) Valid() bool { + var lastX uint64 + for _, i := range pwl { + if i.X < lastX { + return false + } + lastX = i.X + } + return true } diff --git a/les/flowcontrol/manager_test.go b/les/flowcontrol/manager_test.go new file mode 100644 index 000000000000..9d2f88763614 --- /dev/null +++ b/les/flowcontrol/manager_test.go @@ -0,0 +1,125 @@ +// Copyright 2019 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 flowcontrol + +import ( + "math/rand" + "testing" + "time" + + "github.com/ethereum/go-ethereum/common/mclock" +) + +type testNode struct { + node *ClientNode + bufLimit, capacity uint64 + waitUntil mclock.AbsTime + index, totalCost uint64 +} + +const ( + testMaxCost = 1000000 + testLength = 100000 +) + +// testConstantTotalCapacity simulates multiple request sender nodes and verifies +// whether the total amount of served requests matches the expected value based on +// the total capacity and the duration of the test. +// Some nodes are sending requests occasionally so that their buffer should regularly +// reach the maximum while other nodes (the "max capacity nodes") are sending at the +// maximum permitted rate. The max capacity nodes are changed multiple times during +// a single test. +func TestConstantTotalCapacity(t *testing.T) { + testConstantTotalCapacity(t, 10, 1, 0) + testConstantTotalCapacity(t, 10, 1, 1) + testConstantTotalCapacity(t, 30, 1, 0) + testConstantTotalCapacity(t, 30, 2, 3) + testConstantTotalCapacity(t, 100, 1, 0) + testConstantTotalCapacity(t, 100, 3, 5) + testConstantTotalCapacity(t, 100, 5, 10) +} + +func testConstantTotalCapacity(t *testing.T, nodeCount, maxCapacityNodes, randomSend int) { + clock := &mclock.Simulated{} + nodes := make([]*testNode, nodeCount) + var totalCapacity uint64 + for i := range nodes { + nodes[i] = &testNode{capacity: uint64(50000 + rand.Intn(100000))} + totalCapacity += nodes[i].capacity + } + m := NewClientManager(PieceWiseLinear{{0, totalCapacity}}, clock) + for _, n := range nodes { + n.bufLimit = n.capacity * 6000 + n.node = NewClientNode(m, ServerParams{BufLimit: n.bufLimit, MinRecharge: n.capacity}) + } + maxNodes := make([]int, maxCapacityNodes) + for i := range maxNodes { + // we don't care if some indexes are selected multiple times + // in that case we have fewer max nodes + maxNodes[i] = rand.Intn(nodeCount) + } + + var sendCount int + for i := 0; i < testLength; i++ { + now := clock.Now() + for _, idx := range maxNodes { + for nodes[idx].send(t, now) { + } + } + if rand.Intn(testLength) < maxCapacityNodes*3 { + maxNodes[rand.Intn(maxCapacityNodes)] = rand.Intn(nodeCount) + } + + sendCount += randomSend + failCount := randomSend * 10 + for sendCount > 0 && failCount > 0 { + if nodes[rand.Intn(nodeCount)].send(t, now) { + sendCount-- + } else { + failCount-- + } + } + clock.Run(time.Millisecond) + } + + var totalCost uint64 + for _, n := range nodes { + totalCost += n.totalCost + } + ratio := float64(totalCost) / float64(totalCapacity) / testLength + if ratio < 0.98 || ratio > 1.02 { + t.Errorf("totalCost/totalCapacity/testLength ratio incorrect (expected: 1, got: %f)", ratio) + } + +} + +func (n *testNode) send(t *testing.T, now mclock.AbsTime) bool { + if now < n.waitUntil { + return false + } + n.index++ + if ok, _, _ := n.node.AcceptRequest(0, n.index, testMaxCost); !ok { + t.Fatalf("Rejected request after expected waiting time has passed") + } + rcost := uint64(rand.Int63n(testMaxCost)) + bv := n.node.RequestProcessed(0, n.index, testMaxCost, rcost) + if bv < testMaxCost { + n.waitUntil = now + mclock.AbsTime((testMaxCost-bv)*1001000/n.capacity) + } + n.totalCost += rcost + return true +} diff --git a/les/freeclient.go b/les/freeclient.go deleted file mode 100644 index ebd0ba1d620d..000000000000 --- a/les/freeclient.go +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package les implements the Light Ethereum Subprotocol. -package les - -import ( - "io" - "math" - "sync" - "time" - - "github.com/nebulaai/nbai-node/common/mclock" - "github.com/nebulaai/nbai-node/common/prque" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rlp" -) - -// freeClientPool implements a client database that limits the connection time -// of each client and manages accepting/rejecting incoming connections and even -// kicking out some connected clients. The pool calculates recent usage time -// for each known client (a value that increases linearly when the client is -// connected and decreases exponentially when not connected). Clients with lower -// recent usage are preferred, unknown nodes have the highest priority. Already -// connected nodes receive a small bias in their favor in order to avoid accepting -// and instantly kicking out clients. -// -// Note: the pool can use any string for client identification. Using signature -// keys for that purpose would not make sense when being known has a negative -// value for the client. Currently the LES protocol manager uses IP addresses -// (without port address) to identify clients. -type freeClientPool struct { - db ethdb.Database - lock sync.Mutex - clock mclock.Clock - closed bool - - connectedLimit, totalLimit int - - addressMap map[string]*freeClientPoolEntry - connPool, disconnPool *prque.Prque - startupTime mclock.AbsTime - logOffsetAtStartup int64 -} - -const ( - recentUsageExpTC = time.Hour // time constant of the exponential weighting window for "recent" server usage - fixedPointMultiplier = 0x1000000 // constant to convert logarithms to fixed point format - connectedBias = time.Minute // this bias is applied in favor of already connected clients in order to avoid kicking them out very soon -) - -// newFreeClientPool creates a new free client pool -func newFreeClientPool(db ethdb.Database, connectedLimit, totalLimit int, clock mclock.Clock) *freeClientPool { - pool := &freeClientPool{ - db: db, - clock: clock, - addressMap: make(map[string]*freeClientPoolEntry), - connPool: prque.New(poolSetIndex), - disconnPool: prque.New(poolSetIndex), - connectedLimit: connectedLimit, - totalLimit: totalLimit, - } - pool.loadFromDb() - return pool -} - -func (f *freeClientPool) stop() { - f.lock.Lock() - f.closed = true - f.saveToDb() - f.lock.Unlock() -} - -// connect should be called after a successful handshake. If the connection was -// rejected, there is no need to call disconnect. -// -// Note: the disconnectFn callback should not block. -func (f *freeClientPool) connect(address string, disconnectFn func()) bool { - f.lock.Lock() - defer f.lock.Unlock() - - if f.closed { - return false - } - e := f.addressMap[address] - now := f.clock.Now() - var recentUsage int64 - if e == nil { - e = &freeClientPoolEntry{address: address, index: -1} - f.addressMap[address] = e - } else { - if e.connected { - log.Debug("Client already connected", "address", address) - return false - } - recentUsage = int64(math.Exp(float64(e.logUsage-f.logOffset(now)) / fixedPointMultiplier)) - } - e.linUsage = recentUsage - int64(now) - // check whether (linUsage+connectedBias) is smaller than the highest entry in the connected pool - if f.connPool.Size() == f.connectedLimit { - i := f.connPool.PopItem().(*freeClientPoolEntry) - if e.linUsage+int64(connectedBias)-i.linUsage < 0 { - // kick it out and accept the new client - f.connPool.Remove(i.index) - f.calcLogUsage(i, now) - i.connected = false - f.disconnPool.Push(i, -i.logUsage) - log.Debug("Client kicked out", "address", i.address) - i.disconnectFn() - } else { - // keep the old client and reject the new one - f.connPool.Push(i, i.linUsage) - log.Debug("Client rejected", "address", address) - return false - } - } - f.disconnPool.Remove(e.index) - e.connected = true - e.disconnectFn = disconnectFn - f.connPool.Push(e, e.linUsage) - if f.connPool.Size()+f.disconnPool.Size() > f.totalLimit { - f.disconnPool.Pop() - } - log.Debug("Client accepted", "address", address) - return true -} - -// disconnect should be called when a connection is terminated. If the disconnection -// was initiated by the pool itself using disconnectFn then calling disconnect is -// not necessary but permitted. -func (f *freeClientPool) disconnect(address string) { - f.lock.Lock() - defer f.lock.Unlock() - - if f.closed { - return - } - e := f.addressMap[address] - now := f.clock.Now() - if !e.connected { - log.Debug("Client already disconnected", "address", address) - return - } - - f.connPool.Remove(e.index) - f.calcLogUsage(e, now) - e.connected = false - f.disconnPool.Push(e, -e.logUsage) - log.Debug("Client disconnected", "address", address) -} - -// logOffset calculates the time-dependent offset for the logarithmic -// representation of recent usage -func (f *freeClientPool) logOffset(now mclock.AbsTime) int64 { - // Note: fixedPointMultiplier acts as a multiplier here; the reason for dividing the divisor - // is to avoid int64 overflow. We assume that int64(recentUsageExpTC) >> fixedPointMultiplier. - logDecay := int64((time.Duration(now - f.startupTime)) / (recentUsageExpTC / fixedPointMultiplier)) - return f.logOffsetAtStartup + logDecay -} - -// calcLogUsage converts recent usage from linear to logarithmic representation -// when disconnecting a peer or closing the client pool -func (f *freeClientPool) calcLogUsage(e *freeClientPoolEntry, now mclock.AbsTime) { - dt := e.linUsage + int64(now) - if dt < 1 { - dt = 1 - } - e.logUsage = int64(math.Log(float64(dt))*fixedPointMultiplier) + f.logOffset(now) -} - -// freeClientPoolStorage is the RLP representation of the pool's database storage -type freeClientPoolStorage struct { - LogOffset uint64 - List []*freeClientPoolEntry -} - -// loadFromDb restores pool status from the database storage -// (automatically called at initialization) -func (f *freeClientPool) loadFromDb() { - enc, err := f.db.Get([]byte("freeClientPool")) - if err != nil { - return - } - var storage freeClientPoolStorage - err = rlp.DecodeBytes(enc, &storage) - if err != nil { - log.Error("Failed to decode client list", "err", err) - return - } - f.logOffsetAtStartup = int64(storage.LogOffset) - f.startupTime = f.clock.Now() - for _, e := range storage.List { - log.Debug("Loaded free client record", "address", e.address, "logUsage", e.logUsage) - f.addressMap[e.address] = e - f.disconnPool.Push(e, -e.logUsage) - } -} - -// saveToDb saves pool status to the database storage -// (automatically called during shutdown) -func (f *freeClientPool) saveToDb() { - now := f.clock.Now() - storage := freeClientPoolStorage{ - LogOffset: uint64(f.logOffset(now)), - List: make([]*freeClientPoolEntry, len(f.addressMap)), - } - i := 0 - for _, e := range f.addressMap { - if e.connected { - f.calcLogUsage(e, now) - } - storage.List[i] = e - i++ - } - enc, err := rlp.EncodeToBytes(storage) - if err != nil { - log.Error("Failed to encode client list", "err", err) - } else { - f.db.Put([]byte("freeClientPool"), enc) - } -} - -// freeClientPoolEntry represents a client address known by the pool. -// When connected, recent usage is calculated as linUsage + int64(clock.Now()) -// When disconnected, it is calculated as exp(logUsage - logOffset) where logOffset -// also grows linearly with time while the server is running. -// Conversion between linear and logarithmic representation happens when connecting -// or disconnecting the node. -// -// Note: linUsage and logUsage are values used with constantly growing offsets so -// even though they are close to each other at any time they may wrap around int64 -// limits over time. Comparison should be performed accordingly. -type freeClientPoolEntry struct { - address string - connected bool - disconnectFn func() - linUsage, logUsage int64 - index int -} - -func (e *freeClientPoolEntry) EncodeRLP(w io.Writer) error { - return rlp.Encode(w, []interface{}{e.address, uint64(e.logUsage)}) -} - -func (e *freeClientPoolEntry) DecodeRLP(s *rlp.Stream) error { - var entry struct { - Address string - LogUsage uint64 - } - if err := s.Decode(&entry); err != nil { - return err - } - e.address = entry.Address - e.logUsage = int64(entry.LogUsage) - e.connected = false - e.index = -1 - return nil -} - -// poolSetIndex callback is used by both priority queues to set/update the index of -// the element in the queue. Index is needed to remove elements other than the top one. -func poolSetIndex(a interface{}, i int) { - a.(*freeClientPoolEntry).index = i -} diff --git a/les/freeclient_test.go b/les/freeclient_test.go deleted file mode 100644 index d5a6abd03afe..000000000000 --- a/les/freeclient_test.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package light implements on-demand retrieval capable state and chain objects -// for the Ethereum Light Client. -package les - -import ( - "fmt" - "math/rand" - "testing" - "time" - - "github.com/nebulaai/nbai-node/common/mclock" - "github.com/nebulaai/nbai-node/ethdb" -) - -func TestFreeClientPoolL10C100(t *testing.T) { - testFreeClientPool(t, 10, 100) -} - -func TestFreeClientPoolL40C200(t *testing.T) { - testFreeClientPool(t, 40, 200) -} - -func TestFreeClientPoolL100C300(t *testing.T) { - testFreeClientPool(t, 100, 300) -} - -const testFreeClientPoolTicks = 500000 - -func testFreeClientPool(t *testing.T, connLimit, clientCount int) { - var ( - clock mclock.Simulated - db = ethdb.NewMemDatabase() - pool = newFreeClientPool(db, connLimit, 10000, &clock) - connected = make([]bool, clientCount) - connTicks = make([]int, clientCount) - disconnCh = make(chan int, clientCount) - ) - peerId := func(i int) string { - return fmt.Sprintf("test peer #%d", i) - } - disconnFn := func(i int) func() { - return func() { - disconnCh <- i - } - } - - // pool should accept new peers up to its connected limit - for i := 0; i < connLimit; i++ { - if pool.connect(peerId(i), disconnFn(i)) { - connected[i] = true - } else { - t.Fatalf("Test peer #%d rejected", i) - } - } - // since all accepted peers are new and should not be kicked out, the next one should be rejected - if pool.connect(peerId(connLimit), disconnFn(connLimit)) { - connected[connLimit] = true - t.Fatalf("Peer accepted over connected limit") - } - - // randomly connect and disconnect peers, expect to have a similar total connection time at the end - for tickCounter := 0; tickCounter < testFreeClientPoolTicks; tickCounter++ { - clock.Run(1 * time.Second) - - i := rand.Intn(clientCount) - if connected[i] { - pool.disconnect(peerId(i)) - connected[i] = false - connTicks[i] += tickCounter - } else { - if pool.connect(peerId(i), disconnFn(i)) { - connected[i] = true - connTicks[i] -= tickCounter - } - } - pollDisconnects: - for { - select { - case i := <-disconnCh: - pool.disconnect(peerId(i)) - if connected[i] { - connTicks[i] += tickCounter - connected[i] = false - } - default: - break pollDisconnects - } - } - } - - expTicks := testFreeClientPoolTicks * connLimit / clientCount - expMin := expTicks - expTicks/10 - expMax := expTicks + expTicks/10 - - // check if the total connected time of peers are all in the expected range - for i, c := range connected { - if c { - connTicks[i] += testFreeClientPoolTicks - } - if connTicks[i] < expMin || connTicks[i] > expMax { - t.Errorf("Total connected time of test node #%d (%d) outside expected range (%d to %d)", i, connTicks[i], expMin, expMax) - } - } - - // a previously unknown peer should be accepted now - if !pool.connect("newPeer", func() {}) { - t.Fatalf("Previously unknown peer rejected") - } - - // close and restart pool - pool.stop() - pool = newFreeClientPool(db, connLimit, 10000, &clock) - - // try connecting all known peers (connLimit should be filled up) - for i := 0; i < clientCount; i++ { - pool.connect(peerId(i), func() {}) - } - // expect pool to remember known nodes and kick out one of them to accept a new one - if !pool.connect("newPeer2", func() {}) { - t.Errorf("Previously unknown peer rejected after restarting pool") - } - pool.stop() -} diff --git a/les/handler.go b/les/handler.go deleted file mode 100644 index 13bd093433ad..000000000000 --- a/les/handler.go +++ /dev/null @@ -1,1250 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package les implements the Light Ethereum Subprotocol. -package les - -import ( - "encoding/binary" - "encoding/json" - "fmt" - "math/big" - "net" - "sync" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/mclock" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/light" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/discv5" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/trie" -) - -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 - - 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 - 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 -) - -func errResp(code errCode, format string, v ...interface{}) error { - return fmt.Errorf("%v - %v", code, fmt.Sprintf(format, v...)) -} - -type BlockChain interface { - Config() *params.ChainConfig - HasHeader(hash common.Hash, number uint64) bool - GetHeader(hash common.Hash, number uint64) *types.Header - GetHeaderByHash(hash common.Hash) *types.Header - CurrentHeader() *types.Header - GetTd(hash common.Hash, number uint64) *big.Int - State() (*state.StateDB, error) - InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error) - Rollback(chain []common.Hash) - GetHeaderByNumber(number uint64) *types.Header - GetAncestor(hash common.Hash, number, ancestor uint64, maxNonCanonical *uint64) (common.Hash, uint64) - Genesis() *types.Block - SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription -} - -type txPool interface { - AddRemotes(txs []*types.Transaction) []error - Status(hashes []common.Hash) []core.TxStatus -} - -type ProtocolManager struct { - lightSync bool - txpool txPool - txrelay *LesTxRelay - networkId uint64 - chainConfig *params.ChainConfig - iConfig *light.IndexerConfig - blockchain BlockChain - chainDb ethdb.Database - odr *LesOdr - server *LesServer - serverPool *serverPool - clientPool *freeClientPool - lesTopic discv5.Topic - reqDist *requestDistributor - retriever *retrieveManager - - downloader *downloader.Downloader - fetcher *lightFetcher - peers *peerSet - maxPeers int - - eventMux *event.TypeMux - - // channels for fetcher, syncer, txsyncLoop - newPeerCh chan *peer - quitSync chan struct{} - noMorePeers chan struct{} - - // wait group is used for graceful shutdowns during downloading - // and processing - wg *sync.WaitGroup -} - -// NewProtocolManager returns a new ethereum sub protocol manager. The Ethereum sub protocol manages peers capable -// with the ethereum network. -func NewProtocolManager(chainConfig *params.ChainConfig, indexerConfig *light.IndexerConfig, lightSync bool, networkId uint64, mux *event.TypeMux, engine consensus.Engine, peers *peerSet, blockchain BlockChain, txpool txPool, chainDb ethdb.Database, odr *LesOdr, txrelay *LesTxRelay, serverPool *serverPool, quitSync chan struct{}, wg *sync.WaitGroup) (*ProtocolManager, error) { - // Create the protocol manager with the base fields - manager := &ProtocolManager{ - lightSync: lightSync, - eventMux: mux, - blockchain: blockchain, - chainConfig: chainConfig, - iConfig: indexerConfig, - chainDb: chainDb, - odr: odr, - networkId: networkId, - txpool: txpool, - txrelay: txrelay, - serverPool: serverPool, - peers: peers, - newPeerCh: make(chan *peer), - quitSync: quitSync, - wg: wg, - noMorePeers: make(chan struct{}), - } - if odr != nil { - manager.retriever = odr.retriever - manager.reqDist = odr.retriever.dist - } - - removePeer := manager.removePeer - if disableClientRemovePeer { - removePeer = func(id string) {} - } - - if lightSync { - manager.downloader = downloader.New(downloader.LightSync, chainDb, manager.eventMux, nil, blockchain, removePeer) - manager.peers.notify((*downloaderPeerNotify)(manager)) - manager.fetcher = newLightFetcher(manager) - } - - return manager, nil -} - -// removePeer initiates disconnection from a peer by removing it from the peer set -func (pm *ProtocolManager) removePeer(id string) { - pm.peers.Unregister(id) -} - -func (pm *ProtocolManager) Start(maxPeers int) { - pm.maxPeers = maxPeers - - if pm.lightSync { - go pm.syncer() - } else { - pm.clientPool = newFreeClientPool(pm.chainDb, maxPeers, 10000, mclock.System{}) - go func() { - for range pm.newPeerCh { - } - }() - } -} - -func (pm *ProtocolManager) Stop() { - // Showing a log message. During download / process this could actually - // take between 5 to 10 seconds and therefor feedback is required. - log.Info("Stopping light Ethereum protocol") - - // Quit the sync loop. - // After this send has completed, no new peers will be accepted. - pm.noMorePeers <- struct{}{} - - close(pm.quitSync) // quits syncer, fetcher - if pm.clientPool != nil { - pm.clientPool.stop() - } - - // Disconnect existing sessions. - // This also closes the gate for any new registrations on the peer set. - // sessions which are already established but not added to pm.peers yet - // will exit when they try to register. - pm.peers.Close() - - // Wait for any process action - pm.wg.Wait() - - log.Info("Light Ethereum protocol stopped") -} - -// runPeer is the p2p protocol run function for the given version. -func (pm *ProtocolManager) runPeer(version uint, p *p2p.Peer, rw p2p.MsgReadWriter) error { - var entry *poolEntry - peer := pm.newPeer(int(version), pm.networkId, p, rw) - if pm.serverPool != nil { - entry = pm.serverPool.connect(peer, peer.Node()) - } - peer.poolEntry = entry - select { - case pm.newPeerCh <- peer: - pm.wg.Add(1) - defer pm.wg.Done() - err := pm.handle(peer) - if entry != nil { - pm.serverPool.disconnect(entry) - } - return err - case <-pm.quitSync: - if entry != nil { - pm.serverPool.disconnect(entry) - } - return p2p.DiscQuitting - } -} - -func (pm *ProtocolManager) newPeer(pv int, nv uint64, p *p2p.Peer, rw p2p.MsgReadWriter) *peer { - return newPeer(pv, nv, p, newMeteredMsgWriter(rw)) -} - -// handle is the callback invoked to manage the life cycle of a les peer. When -// this function terminates, the peer is disconnected. -func (pm *ProtocolManager) handle(p *peer) error { - // Ignore maxPeers if this is a trusted peer - // In server mode we try to check into the client pool after handshake - if pm.lightSync && pm.peers.Len() >= pm.maxPeers && !p.Peer.Info().Network.Trusted { - return p2p.DiscTooManyPeers - } - - p.Log().Debug("Light Ethereum peer connected", "name", p.Name()) - - // Execute the LES handshake - var ( - genesis = pm.blockchain.Genesis() - head = pm.blockchain.CurrentHeader() - hash = head.Hash() - number = head.Number.Uint64() - td = pm.blockchain.GetTd(hash, number) - ) - if err := p.Handshake(td, hash, number, genesis.Hash(), pm.server); err != nil { - p.Log().Debug("Light Ethereum handshake failed", "err", err) - return err - } - - if !pm.lightSync && !p.Peer.Info().Network.Trusted { - addr, ok := p.RemoteAddr().(*net.TCPAddr) - // test peer address is not a tcp address, don't use client pool if can not typecast - if ok { - id := addr.IP.String() - if !pm.clientPool.connect(id, func() { go pm.removePeer(p.id) }) { - return p2p.DiscTooManyPeers - } - defer pm.clientPool.disconnect(id) - } - } - - if rw, ok := p.rw.(*meteredMsgReadWriter); ok { - rw.Init(p.version) - } - // Register the peer locally - if err := pm.peers.Register(p); err != nil { - p.Log().Error("Light Ethereum peer registration failed", "err", err) - return err - } - defer func() { - if pm.server != nil && pm.server.fcManager != nil && p.fcClient != nil { - p.fcClient.Remove(pm.server.fcManager) - } - pm.removePeer(p.id) - }() - // Register the peer in the downloader. If the downloader considers it banned, we disconnect - if pm.lightSync { - p.lock.Lock() - head := p.headInfo - p.lock.Unlock() - if pm.fetcher != nil { - pm.fetcher.announce(p, head) - } - - if p.poolEntry != nil { - pm.serverPool.registered(p.poolEntry) - } - } - - stop := make(chan struct{}) - defer close(stop) - go func() { - // new block announce loop - for { - select { - case announce := <-p.announceChn: - p.SendAnnounce(announce) - case <-stop: - return - } - } - }() - - // main loop. handle incoming messages. - for { - if err := pm.handleMsg(p); err != nil { - p.Log().Debug("Light Ethereum message handling failed", "err", err) - return err - } - } -} - -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. -func (pm *ProtocolManager) handleMsg(p *peer) error { - // Read the next message from the remote peer, and ensure it's fully consumed - msg, err := p.rw.ReadMsg() - if err != nil { - return err - } - p.Log().Trace("Light Ethereum message arrived", "code", msg.Code, "bytes", msg.Size) - - costs := p.fcCosts[msg.Code] - reject := func(reqCnt, maxCnt uint64) bool { - if p.fcClient == nil || reqCnt > maxCnt { - return true - } - bufValue, _ := p.fcClient.AcceptRequest() - cost := costs.baseCost + reqCnt*costs.reqCost - if cost > pm.server.defParams.BufLimit { - cost = pm.server.defParams.BufLimit - } - if cost > bufValue { - recharge := time.Duration((cost - bufValue) * 1000000 / pm.server.defParams.MinRecharge) - p.Log().Error("Request came too early", "recharge", common.PrettyDuration(recharge)) - return true - } - return false - } - - if msg.Size > ProtocolMaxMsgSize { - return errResp(ErrMsgTooLarge, "%v > %v", msg.Size, ProtocolMaxMsgSize) - } - defer msg.Discard() - - var deliverMsg *Msg - - // Handle the message depending on its contents - switch msg.Code { - case StatusMsg: - p.Log().Trace("Received status message") - // Status messages should never arrive after the handshake - return errResp(ErrExtraStatusMsg, "uncontrolled status message") - - // 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.ID()); 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) - } - - case GetBlockHeadersMsg: - p.Log().Trace("Received block header request") - // Decode the complex header query - var req struct { - ReqID uint64 - Query getBlockHeadersData - } - if err := msg.Decode(&req); err != nil { - return errResp(ErrDecode, "%v: %v", msg, err) - } - - query := req.Query - if reject(query.Amount, MaxHeaderFetch) { - return errResp(ErrRequestRejected, "") - } - - hashMode := query.Origin.Hash != (common.Hash{}) - first := true - maxNonCanonical := uint64(100) - - // Gather headers until the fetch or network limits is reached - var ( - bytes common.StorageSize - headers []*types.Header - unknown bool - ) - for !unknown && len(headers) < int(query.Amount) && bytes < softResponseLimit { - // Retrieve the next header satisfying the query - var origin *types.Header - if hashMode { - if first { - first = false - origin = pm.blockchain.GetHeaderByHash(query.Origin.Hash) - if origin != nil { - query.Origin.Number = origin.Number.Uint64() - } - } else { - origin = pm.blockchain.GetHeader(query.Origin.Hash, query.Origin.Number) - } - } else { - origin = pm.blockchain.GetHeaderByNumber(query.Origin.Number) - } - if origin == nil { - break - } - headers = append(headers, origin) - bytes += estHeaderRlpSize - - // Advance to the next header of the query - switch { - case hashMode && query.Reverse: - // Hash based traversal towards the genesis block - ancestor := query.Skip + 1 - if ancestor == 0 { - unknown = true - } else { - query.Origin.Hash, query.Origin.Number = pm.blockchain.GetAncestor(query.Origin.Hash, query.Origin.Number, ancestor, &maxNonCanonical) - unknown = (query.Origin.Hash == common.Hash{}) - } - case hashMode && !query.Reverse: - // Hash based traversal towards the leaf block - var ( - current = origin.Number.Uint64() - next = current + query.Skip + 1 - ) - if next <= current { - infos, _ := json.MarshalIndent(p.Peer.Info(), "", " ") - p.Log().Warn("GetBlockHeaders skip overflow attack", "current", current, "skip", query.Skip, "next", next, "attacker", infos) - unknown = true - } else { - if header := pm.blockchain.GetHeaderByNumber(next); header != nil { - nextHash := header.Hash() - expOldHash, _ := pm.blockchain.GetAncestor(nextHash, next, query.Skip+1, &maxNonCanonical) - if expOldHash == query.Origin.Hash { - query.Origin.Hash, query.Origin.Number = nextHash, next - } else { - unknown = true - } - } else { - unknown = true - } - } - case query.Reverse: - // Number based traversal towards the genesis block - if query.Origin.Number >= query.Skip+1 { - query.Origin.Number -= query.Skip + 1 - } else { - unknown = true - } - - case !query.Reverse: - // Number based traversal towards the leaf block - query.Origin.Number += query.Skip + 1 - } - } - - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + query.Amount*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, query.Amount, rcost) - return p.SendBlockHeaders(req.ReqID, bv, headers) - - case BlockHeadersMsg: - if pm.downloader == nil { - return errResp(ErrUnexpectedResponse, "") - } - - p.Log().Trace("Received block header response message") - // A batch of headers arrived to one of our previous requests - var resp struct { - ReqID, BV uint64 - Headers []*types.Header - } - if err := msg.Decode(&resp); err != nil { - return errResp(ErrDecode, "msg %v: %v", msg, err) - } - p.fcServer.GotReply(resp.ReqID, resp.BV) - if pm.fetcher != nil && pm.fetcher.requestedID(resp.ReqID) { - pm.fetcher.deliverHeaders(p, resp.ReqID, resp.Headers) - } else { - err := pm.downloader.DeliverHeaders(p.id, resp.Headers) - if err != nil { - log.Debug(fmt.Sprint(err)) - } - } - - case GetBlockBodiesMsg: - p.Log().Trace("Received block bodies request") - // Decode the retrieval message - var req struct { - ReqID uint64 - Hashes []common.Hash - } - if err := msg.Decode(&req); err != nil { - return errResp(ErrDecode, "msg %v: %v", msg, err) - } - // Gather blocks until the fetch or network limits is reached - var ( - bytes int - bodies []rlp.RawValue - ) - reqCnt := len(req.Hashes) - if reject(uint64(reqCnt), MaxBodyFetch) { - return errResp(ErrRequestRejected, "") - } - for _, hash := range req.Hashes { - if bytes >= softResponseLimit { - break - } - // Retrieve the requested block body, stopping if enough was found - if number := rawdb.ReadHeaderNumber(pm.chainDb, hash); number != nil { - if data := rawdb.ReadBodyRLP(pm.chainDb, hash, *number); len(data) != 0 { - bodies = append(bodies, data) - bytes += len(data) - } - } - } - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - return p.SendBlockBodiesRLP(req.ReqID, bv, bodies) - - case BlockBodiesMsg: - if pm.odr == nil { - return errResp(ErrUnexpectedResponse, "") - } - - p.Log().Trace("Received block bodies response") - // A batch of block bodies arrived to one of our previous requests - var resp struct { - ReqID, BV uint64 - Data []*types.Body - } - 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: MsgBlockBodies, - ReqID: resp.ReqID, - Obj: resp.Data, - } - - case GetCodeMsg: - p.Log().Trace("Received code request") - // Decode the retrieval message - var req struct { - ReqID uint64 - Reqs []CodeReq - } - 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 ( - bytes int - data [][]byte - ) - reqCnt := len(req.Reqs) - if reject(uint64(reqCnt), MaxCodeFetch) { - return errResp(ErrRequestRejected, "") - } - for _, req := range req.Reqs { - // Retrieve the requested state entry, stopping if enough was found - if number := rawdb.ReadHeaderNumber(pm.chainDb, req.BHash); number != nil { - if header := rawdb.ReadHeader(pm.chainDb, req.BHash, *number); header != nil { - statedb, err := pm.blockchain.State() - if err != nil { - continue - } - account, err := pm.getAccount(statedb, header.Root, common.BytesToHash(req.AccKey)) - if err != nil { - continue - } - code, _ := statedb.Database().TrieDB().Node(common.BytesToHash(account.CodeHash)) - - data = append(data, code) - if bytes += len(code); bytes >= softResponseLimit { - break - } - } - } - } - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - return p.SendCode(req.ReqID, bv, data) - - case CodeMsg: - if pm.odr == nil { - return errResp(ErrUnexpectedResponse, "") - } - - p.Log().Trace("Received code response") - // A batch of node state data arrived to one of our previous requests - var resp struct { - ReqID, BV uint64 - Data [][]byte - } - 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: MsgCode, - ReqID: resp.ReqID, - Obj: resp.Data, - } - - case GetReceiptsMsg: - p.Log().Trace("Received receipts request") - // Decode the retrieval message - var req struct { - ReqID uint64 - Hashes []common.Hash - } - 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 ( - bytes int - receipts []rlp.RawValue - ) - reqCnt := len(req.Hashes) - if reject(uint64(reqCnt), MaxReceiptFetch) { - return errResp(ErrRequestRejected, "") - } - for _, hash := range req.Hashes { - if bytes >= softResponseLimit { - break - } - // Retrieve the requested block's receipts, skipping if unknown to us - var results types.Receipts - if number := rawdb.ReadHeaderNumber(pm.chainDb, hash); number != nil { - results = rawdb.ReadReceipts(pm.chainDb, hash, *number) - } - if results == nil { - if header := pm.blockchain.GetHeaderByHash(hash); header == nil || header.ReceiptHash != types.EmptyRootHash { - continue - } - } - // If known, encode and queue for response packet - if encoded, err := rlp.EncodeToBytes(results); err != nil { - log.Error("Failed to encode receipt", "err", err) - } else { - receipts = append(receipts, encoded) - bytes += len(encoded) - } - } - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - return p.SendReceiptsRLP(req.ReqID, bv, receipts) - - case ReceiptsMsg: - if pm.odr == nil { - return errResp(ErrUnexpectedResponse, "") - } - - p.Log().Trace("Received receipts response") - // A batch of receipts arrived to one of our previous requests - var resp struct { - ReqID, BV uint64 - Receipts []types.Receipts - } - 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: MsgReceipts, - ReqID: resp.ReqID, - Obj: resp.Receipts, - } - - case GetProofsV1Msg: - p.Log().Trace("Received 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 ( - bytes int - proofs proofsData - ) - reqCnt := len(req.Reqs) - if reject(uint64(reqCnt), MaxProofsFetch) { - return errResp(ErrRequestRejected, "") - } - for _, req := range req.Reqs { - // Retrieve the requested state entry, stopping if enough was found - if number := rawdb.ReadHeaderNumber(pm.chainDb, req.BHash); number != nil { - if header := rawdb.ReadHeader(pm.chainDb, req.BHash, *number); header != nil { - statedb, err := pm.blockchain.State() - if err != nil { - continue - } - var trie state.Trie - if len(req.AccKey) > 0 { - account, err := pm.getAccount(statedb, header.Root, common.BytesToHash(req.AccKey)) - if err != nil { - continue - } - trie, _ = statedb.Database().OpenStorageTrie(common.BytesToHash(req.AccKey), account.Root) - } else { - trie, _ = statedb.Database().OpenTrie(header.Root) - } - if trie != nil { - var proof light.NodeList - trie.Prove(req.Key, 0, &proof) - - proofs = append(proofs, proof) - if bytes += proof.DataSize(); bytes >= softResponseLimit { - break - } - } - } - } - } - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) - pm.server.fcCostStats.update(msg.Code, uint64(reqCnt), rcost) - return p.SendProofs(req.ReqID, bv, proofs) - - 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 - statedb *state.StateDB - root common.Hash - ) - reqCnt := len(req.Reqs) - if reject(uint64(reqCnt), MaxProofsFetch) { - return errResp(ErrRequestRejected, "") - } - - nodes := light.NewNodeSet() - - for _, req := range req.Reqs { - // Look up the state belonging to the request - if statedb == nil || req.BHash != lastBHash { - statedb, root, lastBHash = nil, common.Hash{}, req.BHash - - if number := rawdb.ReadHeaderNumber(pm.chainDb, req.BHash); number != nil { - if header := rawdb.ReadHeader(pm.chainDb, req.BHash, *number); header != nil { - statedb, _ = pm.blockchain.State() - root = header.Root - } - } - } - if statedb == nil { - continue - } - // Pull the account or storage trie of the request - var trie state.Trie - if len(req.AccKey) > 0 { - account, err := pm.getAccount(statedb, root, common.BytesToHash(req.AccKey)) - if err != nil { - continue - } - trie, _ = statedb.Database().OpenStorageTrie(common.BytesToHash(req.AccKey), account.Root) - } else { - trie, _ = statedb.Database().OpenTrie(root) - } - if trie == nil { - continue - } - // Prove the user's request from the account or stroage trie - trie.Prove(req.Key, req.FromLevel, nodes) - if nodes.DataSize() >= softResponseLimit { - break - } - } - 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, nodes.NodeList()) - - case ProofsV1Msg: - if pm.odr == nil { - return errResp(ErrUnexpectedResponse, "") - } - - p.Log().Trace("Received 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: 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, - } - - case GetHeaderProofsMsg: - p.Log().Trace("Received headers proof request") - // Decode the retrieval message - var req struct { - ReqID uint64 - Reqs []ChtReq - } - 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 ( - bytes int - proofs []ChtResp - ) - reqCnt := len(req.Reqs) - if reject(uint64(reqCnt), MaxHelperTrieProofsFetch) { - return errResp(ErrRequestRejected, "") - } - trieDb := trie.NewDatabase(ethdb.NewTable(pm.chainDb, light.ChtTablePrefix)) - for _, req := range req.Reqs { - if header := pm.blockchain.GetHeaderByNumber(req.BlockNum); header != nil { - sectionHead := rawdb.ReadCanonicalHash(pm.chainDb, req.ChtNum*pm.iConfig.ChtSize-1) - if root := light.GetChtRoot(pm.chainDb, req.ChtNum-1, sectionHead); root != (common.Hash{}) { - trie, err := trie.New(root, trieDb) - if err != nil { - continue - } - var encNumber [8]byte - binary.BigEndian.PutUint64(encNumber[:], req.BlockNum) - - var proof light.NodeList - trie.Prove(encNumber[:], 0, &proof) - - proofs = append(proofs, ChtResp{Header: header, Proof: proof}) - if bytes += proof.DataSize() + estHeaderRlpSize; bytes >= softResponseLimit { - break - } - } - } - } - bv, rcost := p.fcClient.RequestProcessed(costs.baseCost + uint64(reqCnt)*costs.reqCost) - 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 - auxTrie *trie.Trie - ) - nodes := light.NewNodeSet() - for _, req := range req.Reqs { - if auxTrie == nil || req.Type != lastType || req.TrieIdx != lastIdx { - auxTrie, lastType, lastIdx = nil, req.Type, req.TrieIdx - - var prefix string - if root, prefix = pm.getHelperTrie(req.Type, req.TrieIdx); root != (common.Hash{}) { - auxTrie, _ = trie.New(root, trie.NewDatabase(ethdb.NewTable(pm.chainDb, prefix))) - } - } - if req.AuxReq == auxRoot { - var data []byte - if root != (common.Hash{}) { - data = root[:] - } - auxData = append(auxData, data) - auxBytes += len(data) - } else { - if auxTrie != nil { - auxTrie.Prove(req.Key, req.FromLevel, nodes) - } - if req.AuxReq != 0 { - data := pm.getHelperTrieAuxData(req) - auxData = append(auxData, data) - auxBytes += len(data) - } - } - if nodes.DataSize()+auxBytes >= softResponseLimit { - break - } - } - 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: nodes.NodeList(), AuxData: auxData}) - - case HeaderProofsMsg: - if pm.odr == nil { - return errResp(ErrUnexpectedResponse, "") - } - - p.Log().Trace("Received headers proof response") - var resp struct { - ReqID, BV uint64 - Data []ChtResp - } - 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: MsgHeaderProofs, - ReqID: resp.ReqID, - 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(ErrRequestRejected, "") - } - // Transactions arrived, parse all of them and deliver to the pool - var txs []*types.Transaction - if err := msg.Decode(&txs); err != nil { - return errResp(ErrDecode, "msg %v: %v", msg, err) - } - reqCnt := len(txs) - if reject(uint64(reqCnt), MaxTxSend) { - return errResp(ErrRequestRejected, "") - } - 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].Error() - 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 []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) - } - - if deliverMsg != nil { - err := pm.retriever.deliver(p, deliverMsg) - if err != nil { - p.responseErrors++ - if p.responseErrors > maxResponseErrors { - return err - } - } - } - return nil -} - -// getAccount retrieves an account from the state based at root. -func (pm *ProtocolManager) getAccount(statedb *state.StateDB, root, hash common.Hash) (state.Account, error) { - trie, err := trie.New(root, statedb.Database().TrieDB()) - if err != nil { - return state.Account{}, err - } - blob, err := trie.TryGet(hash[:]) - if err != nil { - return state.Account{}, err - } - var account state.Account - if err = rlp.DecodeBytes(blob, &account); err != nil { - return state.Account{}, err - } - return account, 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: - idxV1 := (idx+1)*(pm.iConfig.PairChtSize/pm.iConfig.ChtSize) - 1 - sectionHead := rawdb.ReadCanonicalHash(pm.chainDb, (idxV1+1)*pm.iConfig.ChtSize-1) - return light.GetChtRoot(pm.chainDb, idxV1, sectionHead), light.ChtTablePrefix - case htBloomBits: - sectionHead := rawdb.ReadCanonicalHash(pm.chainDb, (idx+1)*pm.iConfig.BloomTrieSize-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.Type == htCanonical && req.AuxReq == auxHeader && len(req.Key) == 8 { - blockNum := binary.BigEndian.Uint64(req.Key) - hash := rawdb.ReadCanonicalHash(pm.chainDb, blockNum) - return rawdb.ReadHeaderRLP(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 := rawdb.ReadTxLookupEntry(pm.chainDb, hashes[i]); block != (common.Hash{}) { - stats[i].Status = core.TxStatusIncluded - stats[i].Lookup = &rawdb.TxLookupEntry{BlockHash: block, BlockIndex: number, Index: index} - } - } - } - return stats -} - -// downloaderPeerNotify implements peerSetNotify -type downloaderPeerNotify ProtocolManager - -type peerConnection struct { - manager *ProtocolManager - peer *peer -} - -func (pc *peerConnection) Head() (common.Hash, *big.Int) { - return pc.peer.HeadAndTd() -} - -func (pc *peerConnection) RequestHeadersByHash(origin common.Hash, amount int, skip int, reverse bool) error { - reqID := genReqID() - rq := &distReq{ - getCost: func(dp distPeer) uint64 { - peer := dp.(*peer) - return peer.GetRequestCost(GetBlockHeadersMsg, amount) - }, - canSend: func(dp distPeer) bool { - return dp.(*peer) == pc.peer - }, - request: func(dp distPeer) func() { - peer := dp.(*peer) - cost := peer.GetRequestCost(GetBlockHeadersMsg, amount) - peer.fcServer.QueueRequest(reqID, cost) - return func() { peer.RequestHeadersByHash(reqID, cost, origin, amount, skip, reverse) } - }, - } - _, ok := <-pc.manager.reqDist.queue(rq) - if !ok { - return light.ErrNoPeers - } - return nil -} - -func (pc *peerConnection) RequestHeadersByNumber(origin uint64, amount int, skip int, reverse bool) error { - reqID := genReqID() - rq := &distReq{ - getCost: func(dp distPeer) uint64 { - peer := dp.(*peer) - return peer.GetRequestCost(GetBlockHeadersMsg, amount) - }, - canSend: func(dp distPeer) bool { - return dp.(*peer) == pc.peer - }, - request: func(dp distPeer) func() { - peer := dp.(*peer) - cost := peer.GetRequestCost(GetBlockHeadersMsg, amount) - peer.fcServer.QueueRequest(reqID, cost) - return func() { peer.RequestHeadersByNumber(reqID, cost, origin, amount, skip, reverse) } - }, - } - _, ok := <-pc.manager.reqDist.queue(rq) - if !ok { - return light.ErrNoPeers - } - return nil -} - -func (d *downloaderPeerNotify) registerPeer(p *peer) { - pm := (*ProtocolManager)(d) - pc := &peerConnection{ - manager: pm, - peer: p, - } - pm.downloader.RegisterLightPeer(p.id, ethVersion, pc) -} - -func (d *downloaderPeerNotify) unregisterPeer(p *peer) { - pm := (*ProtocolManager)(d) - pm.downloader.UnregisterPeer(p.id) -} diff --git a/les/handler_test.go b/les/handler_test.go index 9685406e253c..aad8d18e45c0 100644 --- a/les/handler_test.go +++ b/les/handler_test.go @@ -23,19 +23,19 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/light" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" ) func expectResponse(r p2p.MsgReader, msgcode, reqID, bv uint64, data interface{}) error { @@ -47,13 +47,14 @@ func expectResponse(r p2p.MsgReader, msgcode, reqID, bv uint64, data interface{} } // 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 TestGetBlockHeadersLes3(t *testing.T) { testGetBlockHeaders(t, 3) } func testGetBlockHeaders(t *testing.T, protocol int) { - server, tearDown := newServerEnv(t, downloader.MaxHashFetch+15, protocol, nil) + server, tearDown := newServerEnv(t, downloader.MaxHashFetch+15, protocol, nil, false, true, 0) defer tearDown() - bc := server.pm.blockchain.(*core.BlockChain) + + bc := server.handler.blockchain // Create a "random" unknown hash for testing var unknown common.Hash @@ -115,10 +116,10 @@ func testGetBlockHeaders(t *testing.T, protocol int) { []common.Hash{bc.CurrentBlock().Hash()}, }, // Ensure protocol limits are honored - /*{ - &getBlockHeadersData{Origin: hashOrNumber{Number: bc.CurrentBlock().NumberU64() - 1}, Amount: limit + 10, Reverse: true}, - bc.GetBlockHashesFromHash(bc.CurrentBlock().Hash(), limit), - },*/ + //{ + // &getBlockHeadersData{Origin: hashOrNumber{Number: bc.CurrentBlock().NumberU64() - 1}, Amount: limit + 10, Reverse: true}, + // []common.Hash{}, + //}, // Check that requesting more than available is handled gracefully { &getBlockHeadersData{Origin: hashOrNumber{Number: bc.CurrentBlock().NumberU64() - 4}, Skip: 3, Amount: 3}, @@ -160,28 +161,30 @@ func testGetBlockHeaders(t *testing.T, protocol int) { var reqID uint64 for i, tt := range tests { // Collect the headers to expect in the response - headers := []*types.Header{} + var headers []*types.Header for _, hash := range tt.expect { headers = append(headers, bc.GetHeaderByHash(hash)) } // Send the hash request and verify the response reqID++ - cost := server.tPeer.GetRequestCost(GetBlockHeadersMsg, int(tt.query.Amount)) - sendRequest(server.tPeer.app, GetBlockHeadersMsg, reqID, cost, tt.query) - if err := expectResponse(server.tPeer.app, BlockHeadersMsg, reqID, testBufLimit, headers); err != nil { + + cost := server.peer.peer.GetRequestCost(GetBlockHeadersMsg, int(tt.query.Amount)) + sendRequest(server.peer.app, GetBlockHeadersMsg, reqID, cost, tt.query) + if err := expectResponse(server.peer.app, BlockHeadersMsg, reqID, testBufLimit, headers); err != nil { t.Errorf("test %d: headers mismatch: %v", i, err) } } } // 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 TestGetBlockBodiesLes3(t *testing.T) { testGetBlockBodies(t, 3) } func testGetBlockBodies(t *testing.T, protocol int) { - server, tearDown := newServerEnv(t, downloader.MaxBlockFetch+15, protocol, nil) + server, tearDown := newServerEnv(t, downloader.MaxBlockFetch+15, protocol, nil, false, true, 0) defer tearDown() - bc := server.pm.blockchain.(*core.BlockChain) + + bc := server.handler.blockchain // Create a batch of tests for various scenarios limit := MaxBodyFetch @@ -214,8 +217,9 @@ func testGetBlockBodies(t *testing.T, protocol int) { var reqID uint64 for i, tt := range tests { // Collect the hashes to request, and the response to expect - hashes, seen := []common.Hash{}, make(map[int64]bool) - bodies := []*types.Body{} + var hashes []common.Hash + seen := make(map[int64]bool) + var bodies []*types.Body for j := 0; j < tt.random; j++ { for { @@ -240,28 +244,28 @@ func testGetBlockBodies(t *testing.T, protocol int) { } } reqID++ + // Send the hash request and verify the response - cost := server.tPeer.GetRequestCost(GetBlockBodiesMsg, len(hashes)) - sendRequest(server.tPeer.app, GetBlockBodiesMsg, reqID, cost, hashes) - if err := expectResponse(server.tPeer.app, BlockBodiesMsg, reqID, testBufLimit, bodies); err != nil { + cost := server.peer.peer.GetRequestCost(GetBlockBodiesMsg, len(hashes)) + sendRequest(server.peer.app, GetBlockBodiesMsg, reqID, cost, hashes) + if err := expectResponse(server.peer.app, BlockBodiesMsg, reqID, testBufLimit, bodies); err != nil { t.Errorf("test %d: bodies mismatch: %v", i, err) } } } // 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 TestGetCodeLes3(t *testing.T) { testGetCode(t, 3) } func testGetCode(t *testing.T, protocol int) { // Assemble the test environment - server, tearDown := newServerEnv(t, 4, protocol, nil) + server, tearDown := newServerEnv(t, 4, protocol, nil, false, true, 0) defer tearDown() - bc := server.pm.blockchain.(*core.BlockChain) + bc := server.handler.blockchain var codereqs []*CodeReq var codes [][]byte - for i := uint64(0); i <= bc.CurrentBlock().NumberU64(); i++ { header := bc.GetHeaderByNumber(i) req := &CodeReq{ @@ -274,60 +278,84 @@ func testGetCode(t *testing.T, protocol int) { } } - cost := server.tPeer.GetRequestCost(GetCodeMsg, len(codereqs)) - sendRequest(server.tPeer.app, GetCodeMsg, 42, cost, codereqs) - if err := expectResponse(server.tPeer.app, CodeMsg, 42, testBufLimit, codes); err != nil { + cost := server.peer.peer.GetRequestCost(GetCodeMsg, len(codereqs)) + sendRequest(server.peer.app, GetCodeMsg, 42, cost, codereqs) + if err := expectResponse(server.peer.app, CodeMsg, 42, testBufLimit, codes); err != nil { t.Errorf("codes mismatch: %v", err) } } +// Tests that the stale contract codes can't be retrieved based on account addresses. +func TestGetStaleCodeLes2(t *testing.T) { testGetStaleCode(t, 2) } +func TestGetStaleCodeLes3(t *testing.T) { testGetStaleCode(t, 3) } + +func testGetStaleCode(t *testing.T, protocol int) { + server, tearDown := newServerEnv(t, core.TriesInMemory+4, protocol, nil, false, true, 0) + defer tearDown() + bc := server.handler.blockchain + + check := func(number uint64, expected [][]byte) { + req := &CodeReq{ + BHash: bc.GetHeaderByNumber(number).Hash(), + AccKey: crypto.Keccak256(testContractAddr[:]), + } + cost := server.peer.peer.GetRequestCost(GetCodeMsg, 1) + sendRequest(server.peer.app, GetCodeMsg, 42, cost, []*CodeReq{req}) + if err := expectResponse(server.peer.app, CodeMsg, 42, testBufLimit, expected); err != nil { + t.Errorf("codes mismatch: %v", err) + } + } + check(0, [][]byte{}) // Non-exist contract + check(testContractDeployed, [][]byte{}) // Stale contract + check(bc.CurrentHeader().Number.Uint64(), [][]byte{testContractCodeDeployed}) // Fresh contract +} + // 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 TestGetReceiptLes3(t *testing.T) { testGetReceipt(t, 3) } func testGetReceipt(t *testing.T, protocol int) { // Assemble the test environment - server, tearDown := newServerEnv(t, 4, protocol, nil) + server, tearDown := newServerEnv(t, 4, protocol, nil, false, true, 0) defer tearDown() - bc := server.pm.blockchain.(*core.BlockChain) + + bc := server.handler.blockchain // Collect the hashes to request, and the response to expect - hashes, receipts := []common.Hash{}, []types.Receipts{} + var receipts []types.Receipts + var hashes []common.Hash for i := uint64(0); i <= bc.CurrentBlock().NumberU64(); i++ { block := bc.GetBlockByNumber(i) hashes = append(hashes, block.Hash()) - receipts = append(receipts, rawdb.ReadReceipts(server.db, block.Hash(), block.NumberU64())) + receipts = append(receipts, rawdb.ReadRawReceipts(server.db, block.Hash(), block.NumberU64())) } // Send the hash request and verify the response - cost := server.tPeer.GetRequestCost(GetReceiptsMsg, len(hashes)) - sendRequest(server.tPeer.app, GetReceiptsMsg, 42, cost, hashes) - if err := expectResponse(server.tPeer.app, ReceiptsMsg, 42, testBufLimit, receipts); err != nil { + cost := server.peer.peer.GetRequestCost(GetReceiptsMsg, len(hashes)) + sendRequest(server.peer.app, GetReceiptsMsg, 42, cost, hashes) + if err := expectResponse(server.peer.app, ReceiptsMsg, 42, testBufLimit, receipts); err != nil { t.Errorf("receipts mismatch: %v", err) } } // Tests that trie merkle proofs can be retrieved -func TestGetProofsLes1(t *testing.T) { testGetProofs(t, 1) } func TestGetProofsLes2(t *testing.T) { testGetProofs(t, 2) } +func TestGetProofsLes3(t *testing.T) { testGetProofs(t, 3) } func testGetProofs(t *testing.T, protocol int) { // Assemble the test environment - server, tearDown := newServerEnv(t, 4, protocol, nil) + server, tearDown := newServerEnv(t, 4, protocol, nil, false, true, 0) defer tearDown() - bc := server.pm.blockchain.(*core.BlockChain) - var ( - proofreqs []ProofReq - proofsV1 [][]rlp.RawValue - ) + bc := server.handler.blockchain + + var proofreqs []ProofReq proofsV2 := light.NewNodeSet() - accounts := []common.Address{testBankAddress, acc1Addr, acc2Addr, {}} + accounts := []common.Address{bankAddr, userAddr1, userAddr2, signerAddr, {}} for i := uint64(0); i <= bc.CurrentBlock().NumberU64(); i++ { header := bc.GetHeaderByNumber(i) - root := header.Root - trie, _ := trie.New(root, trie.NewDatabase(server.db)) + trie, _ := trie.New(header.Root, trie.NewDatabase(server.db)) for _, acc := range accounts { req := ProofReq{ @@ -335,133 +363,123 @@ func testGetProofs(t *testing.T, protocol int) { Key: crypto.Keccak256(acc[:]), } proofreqs = append(proofreqs, req) - - 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) - } + trie.Prove(crypto.Keccak256(acc[:]), 0, proofsV2) } } // Send the proof request and verify the response - switch protocol { - case 1: - cost := server.tPeer.GetRequestCost(GetProofsV1Msg, len(proofreqs)) - sendRequest(server.tPeer.app, GetProofsV1Msg, 42, cost, proofreqs) - if err := expectResponse(server.tPeer.app, ProofsV1Msg, 42, testBufLimit, proofsV1); err != nil { - t.Errorf("proofs mismatch: %v", err) + cost := server.peer.peer.GetRequestCost(GetProofsV2Msg, len(proofreqs)) + sendRequest(server.peer.app, GetProofsV2Msg, 42, cost, proofreqs) + if err := expectResponse(server.peer.app, ProofsV2Msg, 42, testBufLimit, proofsV2.NodeList()); err != nil { + t.Errorf("proofs mismatch: %v", err) + } +} + +// Tests that the stale contract codes can't be retrieved based on account addresses. +func TestGetStaleProofLes2(t *testing.T) { testGetStaleProof(t, 2) } +func TestGetStaleProofLes3(t *testing.T) { testGetStaleProof(t, 3) } + +func testGetStaleProof(t *testing.T, protocol int) { + server, tearDown := newServerEnv(t, core.TriesInMemory+4, protocol, nil, false, true, 0) + defer tearDown() + bc := server.handler.blockchain + + check := func(number uint64, wantOK bool) { + var ( + header = bc.GetHeaderByNumber(number) + account = crypto.Keccak256(userAddr1.Bytes()) + ) + req := &ProofReq{ + BHash: header.Hash(), + Key: account, } - case 2: - cost := server.tPeer.GetRequestCost(GetProofsV2Msg, len(proofreqs)) - sendRequest(server.tPeer.app, GetProofsV2Msg, 42, cost, proofreqs) - if err := expectResponse(server.tPeer.app, ProofsV2Msg, 42, testBufLimit, proofsV2.NodeList()); err != nil { - t.Errorf("proofs mismatch: %v", err) + cost := server.peer.peer.GetRequestCost(GetProofsV2Msg, 1) + sendRequest(server.peer.app, GetProofsV2Msg, 42, cost, []*ProofReq{req}) + + var expected []rlp.RawValue + if wantOK { + proofsV2 := light.NewNodeSet() + t, _ := trie.New(header.Root, trie.NewDatabase(server.db)) + t.Prove(account, 0, proofsV2) + expected = proofsV2.NodeList() + } + if err := expectResponse(server.peer.app, ProofsV2Msg, 42, testBufLimit, expected); err != nil { + t.Errorf("codes mismatch: %v", err) } } + check(0, false) // Non-exist proof + check(2, false) // Stale proof + check(bc.CurrentHeader().Number.Uint64(), true) // Fresh proof } // Tests that CHT proofs can be correctly retrieved. -func TestGetCHTProofsLes1(t *testing.T) { testGetCHTProofs(t, 1) } func TestGetCHTProofsLes2(t *testing.T) { testGetCHTProofs(t, 2) } +func TestGetCHTProofsLes3(t *testing.T) { testGetCHTProofs(t, 3) } func testGetCHTProofs(t *testing.T, protocol int) { config := light.TestServerIndexerConfig - frequency := config.ChtSize - if protocol == 2 { - frequency = config.PairChtSize - } waitIndexers := func(cIndexer, bIndexer, btIndexer *core.ChainIndexer) { - expectSections := frequency / config.ChtSize for { cs, _, _ := cIndexer.Sections() - bs, _, _ := bIndexer.Sections() - if cs >= expectSections && bs >= expectSections { + if cs >= 1 { break } time.Sleep(10 * time.Millisecond) } } - server, tearDown := newServerEnv(t, int(frequency+config.ChtConfirms), protocol, waitIndexers) + server, tearDown := newServerEnv(t, int(config.ChtSize+config.ChtConfirms), protocol, waitIndexers, false, true, 0) defer tearDown() - bc := server.pm.blockchain.(*core.BlockChain) + + bc := server.handler.blockchain // Assemble the proofs from the different protocols - header := bc.GetHeaderByNumber(frequency - 1) + header := bc.GetHeaderByNumber(config.ChtSize - 1) rlp, _ := rlp.EncodeToBytes(header) key := make([]byte, 8) - binary.BigEndian.PutUint64(key, frequency-1) + binary.BigEndian.PutUint64(key, config.ChtSize-1) - proofsV1 := []ChtResp{{ - Header: header, - }} proofsV2 := HelperTrieResps{ AuxData: [][]byte{rlp}, } - switch protocol { - case 1: - root := light.GetChtRoot(server.db, 0, bc.GetHeaderByNumber(frequency-1).Hash()) - trie, _ := trie.New(root, trie.NewDatabase(ethdb.NewTable(server.db, light.ChtTablePrefix))) - - var proof light.NodeList - trie.Prove(key, 0, &proof) - proofsV1[0].Proof = proof - - case 2: - root := light.GetChtRoot(server.db, (frequency/config.ChtSize)-1, bc.GetHeaderByNumber(frequency-1).Hash()) - trie, _ := trie.New(root, trie.NewDatabase(ethdb.NewTable(server.db, light.ChtTablePrefix))) - trie.Prove(key, 0, &proofsV2.Proofs) - } + root := light.GetChtRoot(server.db, 0, bc.GetHeaderByNumber(config.ChtSize-1).Hash()) + trie, _ := trie.New(root, trie.NewDatabase(rawdb.NewTable(server.db, light.ChtTablePrefix))) + trie.Prove(key, 0, &proofsV2.Proofs) // Assemble the requests for the different protocols - requestsV1 := []ChtReq{{ - ChtNum: frequency / config.ChtSize, - BlockNum: frequency - 1, - }} requestsV2 := []HelperTrieReq{{ Type: htCanonical, - TrieIdx: frequency/config.PairChtSize - 1, + TrieIdx: 0, Key: key, AuxReq: auxHeader, }} // Send the proof request and verify the response - switch protocol { - case 1: - cost := server.tPeer.GetRequestCost(GetHeaderProofsMsg, len(requestsV1)) - sendRequest(server.tPeer.app, GetHeaderProofsMsg, 42, cost, requestsV1) - if err := expectResponse(server.tPeer.app, HeaderProofsMsg, 42, testBufLimit, proofsV1); err != nil { - t.Errorf("proofs mismatch: %v", err) - } - case 2: - cost := server.tPeer.GetRequestCost(GetHelperTrieProofsMsg, len(requestsV2)) - sendRequest(server.tPeer.app, GetHelperTrieProofsMsg, 42, cost, requestsV2) - if err := expectResponse(server.tPeer.app, HelperTrieProofsMsg, 42, testBufLimit, proofsV2); err != nil { - t.Errorf("proofs mismatch: %v", err) - } + cost := server.peer.peer.GetRequestCost(GetHelperTrieProofsMsg, len(requestsV2)) + sendRequest(server.peer.app, GetHelperTrieProofsMsg, 42, cost, requestsV2) + if err := expectResponse(server.peer.app, HelperTrieProofsMsg, 42, testBufLimit, proofsV2); err != nil { + t.Errorf("proofs mismatch: %v", err) } } +func TestGetBloombitsProofsLes2(t *testing.T) { testGetBloombitsProofs(t, 2) } +func TestGetBloombitsProofsLes3(t *testing.T) { testGetBloombitsProofs(t, 3) } + // Tests that bloombits proofs can be correctly retrieved. -func TestGetBloombitsProofs(t *testing.T) { +func testGetBloombitsProofs(t *testing.T, protocol int) { config := light.TestServerIndexerConfig waitIndexers := func(cIndexer, bIndexer, btIndexer *core.ChainIndexer) { for { - cs, _, _ := cIndexer.Sections() - bs, _, _ := bIndexer.Sections() bts, _, _ := btIndexer.Sections() - if cs >= 8 && bs >= 8 && bts >= 1 { + if bts >= 1 { break } time.Sleep(10 * time.Millisecond) } } - server, tearDown := newServerEnv(t, int(config.BloomTrieSize+config.BloomTrieConfirms), 2, waitIndexers) + server, tearDown := newServerEnv(t, int(config.BloomTrieSize+config.BloomTrieConfirms), protocol, waitIndexers, false, true, 0) defer tearDown() - bc := server.pm.blockchain.(*core.BlockChain) + + bc := server.handler.blockchain // Request and verify each bit of the bloom bits proofs for bit := 0; bit < 2048; bit++ { @@ -480,66 +498,64 @@ func TestGetBloombitsProofs(t *testing.T) { var proofs HelperTrieResps root := light.GetBloomTrieRoot(server.db, 0, bc.GetHeaderByNumber(config.BloomTrieSize-1).Hash()) - trie, _ := trie.New(root, trie.NewDatabase(ethdb.NewTable(server.db, light.BloomTrieTablePrefix))) + trie, _ := trie.New(root, trie.NewDatabase(rawdb.NewTable(server.db, light.BloomTrieTablePrefix))) trie.Prove(key, 0, &proofs.Proofs) // Send the proof request and verify the response - cost := server.tPeer.GetRequestCost(GetHelperTrieProofsMsg, len(requests)) - sendRequest(server.tPeer.app, GetHelperTrieProofsMsg, 42, cost, requests) - if err := expectResponse(server.tPeer.app, HelperTrieProofsMsg, 42, testBufLimit, proofs); err != nil { + cost := server.peer.peer.GetRequestCost(GetHelperTrieProofsMsg, len(requests)) + sendRequest(server.peer.app, GetHelperTrieProofsMsg, 42, cost, requests) + if err := expectResponse(server.peer.app, HelperTrieProofsMsg, 42, testBufLimit, proofs); err != nil { t.Errorf("bit %d: proofs mismatch: %v", bit, err) } } } -func TestTransactionStatusLes2(t *testing.T) { - db := ethdb.NewMemDatabase() - pm := newTestProtocolManagerMust(t, false, 0, nil, nil, nil, db) - chain := pm.blockchain.(*core.BlockChain) - config := core.DefaultTxPoolConfig - config.Journal = "" - txpool := core.NewTxPool(config, params.TestChainConfig, chain) - pm.txpool = txpool - peer, _ := newTestPeer(t, "peer", 2, pm, true) - defer peer.close() +func TestTransactionStatusLes2(t *testing.T) { testTransactionStatus(t, 2) } +func TestTransactionStatusLes3(t *testing.T) { testTransactionStatus(t, 3) } + +func testTransactionStatus(t *testing.T, protocol int) { + server, tearDown := newServerEnv(t, 0, protocol, nil, false, true, 0) + defer tearDown() + server.handler.addTxsSync = true + + chain := server.handler.blockchain var reqID uint64 - test := func(tx *types.Transaction, send bool, expStatus txStatus) { + test := func(tx *types.Transaction, send bool, expStatus light.TxStatus) { reqID++ if send { - cost := peer.GetRequestCost(SendTxV2Msg, 1) - sendRequest(peer.app, SendTxV2Msg, reqID, cost, types.Transactions{tx}) + cost := server.peer.peer.GetRequestCost(SendTxV2Msg, 1) + sendRequest(server.peer.app, SendTxV2Msg, reqID, cost, types.Transactions{tx}) } else { - cost := peer.GetRequestCost(GetTxStatusMsg, 1) - sendRequest(peer.app, GetTxStatusMsg, reqID, cost, []common.Hash{tx.Hash()}) + cost := server.peer.peer.GetRequestCost(GetTxStatusMsg, 1) + sendRequest(server.peer.app, GetTxStatusMsg, reqID, cost, []common.Hash{tx.Hash()}) } - if err := expectResponse(peer.app, TxStatusMsg, reqID, testBufLimit, []txStatus{expStatus}); err != nil { + if err := expectResponse(server.peer.app, TxStatusMsg, reqID, testBufLimit, []light.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), params.TxGas, nil, nil), signer, testBankKey) - test(tx0, true, txStatus{Status: core.TxStatusUnknown, Error: core.ErrUnderpriced.Error()}) + tx0, _ := types.SignTx(types.NewTransaction(0, userAddr1, big.NewInt(10000), params.TxGas, nil, nil), signer, bankKey) + test(tx0, true, light.TxStatus{Status: core.TxStatusUnknown, Error: core.ErrUnderpriced.Error()}) - tx1, _ := types.SignTx(types.NewTransaction(0, acc1Addr, big.NewInt(10000), params.TxGas, 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 + tx1, _ := types.SignTx(types.NewTransaction(0, userAddr1, big.NewInt(10000), params.TxGas, big.NewInt(100000000000), nil), signer, bankKey) + test(tx1, false, light.TxStatus{Status: core.TxStatusUnknown}) // query before sending, should be unknown + test(tx1, true, light.TxStatus{Status: core.TxStatusPending}) // send valid processable tx, should return pending + test(tx1, true, light.TxStatus{Status: core.TxStatusPending}) // adding it again should not return an error - tx2, _ := types.SignTx(types.NewTransaction(1, acc1Addr, big.NewInt(10000), params.TxGas, big.NewInt(100000000000), nil), signer, testBankKey) - tx3, _ := types.SignTx(types.NewTransaction(2, acc1Addr, big.NewInt(10000), params.TxGas, big.NewInt(100000000000), nil), signer, testBankKey) + tx2, _ := types.SignTx(types.NewTransaction(1, userAddr1, big.NewInt(10000), params.TxGas, big.NewInt(100000000000), nil), signer, bankKey) + tx3, _ := types.SignTx(types.NewTransaction(2, userAddr1, big.NewInt(10000), params.TxGas, big.NewInt(100000000000), nil), signer, bankKey) // send transactions in the wrong order, tx3 should be queued - test(tx3, true, txStatus{Status: core.TxStatusQueued}) - test(tx2, true, txStatus{Status: core.TxStatusPending}) + test(tx3, true, light.TxStatus{Status: core.TxStatusQueued}) + test(tx2, true, light.TxStatus{Status: core.TxStatusPending}) // query again, now tx3 should be pending too - test(tx3, false, txStatus{Status: core.TxStatusPending}) + test(tx3, false, light.TxStatus{Status: core.TxStatusPending}) // generate and add a block with tx1 and tx2 included - gchain, _ := core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), ethash.NewFaker(), db, 1, func(i int, block *core.BlockGen) { + gchain, _ := core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), ethash.NewFaker(), server.db, 1, func(i int, block *core.BlockGen) { block.AddTx(tx1) block.AddTx(tx2) }) @@ -548,36 +564,90 @@ func TestTransactionStatusLes2(t *testing.T) { } // wait until TxPool processes the inserted block for i := 0; i < 10; i++ { - if pending, _ := txpool.Stats(); pending == 1 { + if pending, _ := server.handler.txpool.Stats(); pending == 1 { break } time.Sleep(100 * time.Millisecond) } - if pending, _ := txpool.Stats(); pending != 1 { + if pending, _ := server.handler.txpool.Stats(); pending != 1 { t.Fatalf("pending count mismatch: have %d, want 1", pending) } + // Discard new block announcement + msg, _ := server.peer.app.ReadMsg() + msg.Discard() // check if their status is included now - block1hash := rawdb.ReadCanonicalHash(db, 1) - test(tx1, false, txStatus{Status: core.TxStatusIncluded, Lookup: &rawdb.TxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 0}}) - test(tx2, false, txStatus{Status: core.TxStatusIncluded, Lookup: &rawdb.TxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 1}}) + block1hash := rawdb.ReadCanonicalHash(server.db, 1) + test(tx1, false, light.TxStatus{Status: core.TxStatusIncluded, Lookup: &rawdb.LegacyTxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 0}}) + + test(tx2, false, light.TxStatus{Status: core.TxStatusIncluded, Lookup: &rawdb.LegacyTxLookupEntry{BlockHash: block1hash, BlockIndex: 1, Index: 1}}) // create a reorg that rolls them back - gchain, _ = core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), ethash.NewFaker(), db, 2, func(i int, block *core.BlockGen) {}) + gchain, _ = core.GenerateChain(params.TestChainConfig, chain.GetBlockByNumber(0), ethash.NewFaker(), server.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 { + if pending, _ := server.handler.txpool.Stats(); pending == 3 { break } time.Sleep(100 * time.Millisecond) } - if pending, _ := txpool.Stats(); pending != 3 { + if pending, _ := server.handler.txpool.Stats(); pending != 3 { t.Fatalf("pending count mismatch: have %d, want 3", pending) } + // Discard new block announcement + msg, _ = server.peer.app.ReadMsg() + msg.Discard() + // check if their status is pending again - test(tx1, false, txStatus{Status: core.TxStatusPending}) - test(tx2, false, txStatus{Status: core.TxStatusPending}) + test(tx1, false, light.TxStatus{Status: core.TxStatusPending}) + test(tx2, false, light.TxStatus{Status: core.TxStatusPending}) +} + +func TestStopResumeLes3(t *testing.T) { + server, tearDown := newServerEnv(t, 0, 3, nil, true, true, testBufLimit/10) + defer tearDown() + + server.handler.server.costTracker.testing = true + + var ( + reqID uint64 + expBuf = testBufLimit + testCost = testBufLimit / 10 + ) + header := server.handler.blockchain.CurrentHeader() + req := func() { + reqID++ + sendRequest(server.peer.app, GetBlockHeadersMsg, reqID, testCost, &getBlockHeadersData{Origin: hashOrNumber{Hash: header.Hash()}, Amount: 1}) + } + for i := 1; i <= 5; i++ { + // send requests while we still have enough buffer and expect a response + for expBuf >= testCost { + req() + expBuf -= testCost + if err := expectResponse(server.peer.app, BlockHeadersMsg, reqID, expBuf, []*types.Header{header}); err != nil { + t.Errorf("expected response and failed: %v", err) + } + } + // send some more requests in excess and expect a single StopMsg + c := i + for c > 0 { + req() + c-- + } + if err := p2p.ExpectMsg(server.peer.app, StopMsg, nil); err != nil { + t.Errorf("expected StopMsg and failed: %v", err) + } + // wait until the buffer is recharged by half of the limit + wait := testBufLimit / testBufRecharge / 2 + server.clock.(*mclock.Simulated).Run(time.Millisecond * time.Duration(wait)) + + // expect a ResumeMsg with the partially recharged buffer value + expBuf += testBufRecharge * wait + if err := p2p.ExpectMsg(server.peer.app, ResumeMsg, expBuf); err != nil { + t.Errorf("expected ResumeMsg and failed: %v", err) + } + } } diff --git a/les/helper_test.go b/les/helper_test.go deleted file mode 100644 index e2f26847ee1a..000000000000 --- a/les/helper_test.go +++ /dev/null @@ -1,445 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// This file contains some shares testing functionality, common to multiple -// different files and modules being tested. - -package les - -import ( - "crypto/rand" - "math/big" - "sync" - "testing" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/eth" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/les/flowcontrol" - "github.com/nebulaai/nbai-node/light" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/params" -) - -var ( - testBankKey, _ = crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - testBankAddress = crypto.PubkeyToAddress(testBankKey.PublicKey) - testBankFunds = big.NewInt(1000000000000000000) - - acc1Key, _ = crypto.HexToECDSA("8a1f9a8f95be41cd7ccb6168179afb4504aefe388d1e14474d32c45c72ce7b7a") - acc2Key, _ = crypto.HexToECDSA("49a7b37aa6f6645917e7b807e9d1c00d4fa71f18343b0d4122a4d2df64dd6fee") - acc1Addr = crypto.PubkeyToAddress(acc1Key.PublicKey) - acc2Addr = crypto.PubkeyToAddress(acc2Key.PublicKey) - - testContractCode = common.Hex2Bytes("606060405260cc8060106000396000f360606040526000357c01000000000000000000000000000000000000000000000000000000009004806360cd2685146041578063c16431b914606b57603f565b005b6055600480803590602001909190505060a9565b6040518082815260200191505060405180910390f35b60886004808035906020019091908035906020019091905050608a565b005b80600060005083606481101560025790900160005b50819055505b5050565b6000600060005082606481101560025790900160005b5054905060c7565b91905056") - testContractAddr common.Address - testContractCodeDeployed = testContractCode[16:] - testContractDeployed = uint64(2) - - testEventEmitterCode = common.Hex2Bytes("60606040523415600e57600080fd5b7f57050ab73f6b9ebdd9f76b8d4997793f48cf956e965ee070551b9ca0bb71584e60405160405180910390a160358060476000396000f3006060604052600080fd00a165627a7a723058203f727efcad8b5811f8cb1fc2620ce5e8c63570d697aef968172de296ea3994140029") - testEventEmitterAddr common.Address - - testBufLimit = uint64(100) -) - -/* -contract test { - - uint256[100] data; - - function Put(uint256 addr, uint256 value) { - data[addr] = value; - } - - function Get(uint256 addr) constant returns (uint256 value) { - return data[addr]; - } -} -*/ - -func testChainGen(i int, block *core.BlockGen) { - signer := types.HomesteadSigner{} - - switch i { - case 0: - // In block 1, the test bank sends account #1 some ether. - tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(10000), params.TxGas, nil, nil), signer, testBankKey) - block.AddTx(tx) - case 1: - // In block 2, the test bank sends some more ether to account #1. - // acc1Addr passes it on to account #2. - // acc1Addr creates a test contract. - // acc1Addr creates a test event. - nonce := block.TxNonce(acc1Addr) - - tx1, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), acc1Addr, big.NewInt(1000), params.TxGas, nil, nil), signer, testBankKey) - tx2, _ := types.SignTx(types.NewTransaction(nonce, acc2Addr, big.NewInt(1000), params.TxGas, nil, nil), signer, acc1Key) - tx3, _ := types.SignTx(types.NewContractCreation(nonce+1, big.NewInt(0), 200000, big.NewInt(0), testContractCode), signer, acc1Key) - testContractAddr = crypto.CreateAddress(acc1Addr, nonce+1) - tx4, _ := types.SignTx(types.NewContractCreation(nonce+2, big.NewInt(0), 200000, big.NewInt(0), testEventEmitterCode), signer, acc1Key) - testEventEmitterAddr = crypto.CreateAddress(acc1Addr, nonce+2) - block.AddTx(tx1) - block.AddTx(tx2) - block.AddTx(tx3) - block.AddTx(tx4) - case 2: - // Block 3 is empty but was mined by account #2. - block.SetCoinbase(acc2Addr) - block.SetExtra([]byte("yeehaw")) - data := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001") - tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), testContractAddr, big.NewInt(0), 100000, nil, data), signer, testBankKey) - block.AddTx(tx) - case 3: - // Block 4 includes blocks 2 and 3 as uncle headers (with modified extra data). - b2 := block.PrevBlock(1).Header() - b2.Extra = []byte("foo") - block.AddUncle(b2) - b3 := block.PrevBlock(2).Header() - b3.Extra = []byte("foo") - block.AddUncle(b3) - data := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002") - tx, _ := types.SignTx(types.NewTransaction(block.TxNonce(testBankAddress), testContractAddr, big.NewInt(0), 100000, nil, data), signer, testBankKey) - block.AddTx(tx) - } -} - -// testIndexers creates a set of indexers with specified params for testing purpose. -func testIndexers(db ethdb.Database, odr light.OdrBackend, iConfig *light.IndexerConfig) (*core.ChainIndexer, *core.ChainIndexer, *core.ChainIndexer) { - chtIndexer := light.NewChtIndexer(db, odr, iConfig.ChtSize, iConfig.ChtConfirms) - bloomIndexer := eth.NewBloomIndexer(db, iConfig.BloomSize, iConfig.BloomConfirms) - bloomTrieIndexer := light.NewBloomTrieIndexer(db, odr, iConfig.BloomSize, iConfig.BloomTrieSize) - bloomIndexer.AddChildIndexer(bloomTrieIndexer) - return chtIndexer, bloomIndexer, bloomTrieIndexer -} - -func testRCL() RequestCostList { - cl := make(RequestCostList, len(reqList)) - for i, code := range reqList { - cl[i].MsgCode = code - cl[i].BaseCost = 0 - cl[i].ReqCost = 0 - } - return cl -} - -// newTestProtocolManager creates a new protocol manager for testing purposes, -// with the given number of blocks already known, potential notification -// channels for different events and relative chain indexers array. -func newTestProtocolManager(lightSync bool, blocks int, generator func(int, *core.BlockGen), odr *LesOdr, peers *peerSet, db ethdb.Database) (*ProtocolManager, error) { - var ( - evmux = new(event.TypeMux) - engine = ethash.NewFaker() - gspec = core.Genesis{ - Config: params.TestChainConfig, - Alloc: core.GenesisAlloc{testBankAddress: {Balance: testBankFunds}}, - } - genesis = gspec.MustCommit(db) - chain BlockChain - ) - if peers == nil { - peers = newPeerSet() - } - - if lightSync { - chain, _ = light.NewLightChain(odr, gspec.Config, engine) - } else { - blockchain, _ := core.NewBlockChain(db, nil, gspec.Config, engine, vm.Config{}, nil) - gchain, _ := core.GenerateChain(gspec.Config, genesis, ethash.NewFaker(), db, blocks, generator) - if _, err := blockchain.InsertChain(gchain); err != nil { - panic(err) - } - chain = blockchain - } - - indexConfig := light.TestServerIndexerConfig - if lightSync { - indexConfig = light.TestClientIndexerConfig - } - pm, err := NewProtocolManager(gspec.Config, indexConfig, lightSync, NetworkId, evmux, engine, peers, chain, nil, db, odr, nil, nil, make(chan struct{}), new(sync.WaitGroup)) - if err != nil { - return nil, err - } - if !lightSync { - srv := &LesServer{lesCommons: lesCommons{protocolManager: pm}} - pm.server = srv - - srv.defParams = &flowcontrol.ServerParams{ - BufLimit: testBufLimit, - MinRecharge: 1, - } - - srv.fcManager = flowcontrol.NewClientManager(50, 10, 1000000000) - srv.fcCostStats = newCostStats(nil) - } - pm.Start(1000) - return pm, nil -} - -// newTestProtocolManagerMust creates a new protocol manager for testing purposes, -// with the given number of blocks already known, potential notification -// channels for different events and relative chain indexers array. In case of an error, the constructor force- -// fails the test. -func newTestProtocolManagerMust(t *testing.T, lightSync bool, blocks int, generator func(int, *core.BlockGen), odr *LesOdr, peers *peerSet, db ethdb.Database) *ProtocolManager { - pm, err := newTestProtocolManager(lightSync, blocks, generator, odr, peers, db) - if err != nil { - t.Fatalf("Failed to create protocol manager: %v", err) - } - return pm -} - -// 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 - app *p2p.MsgPipeRW // Application layer reader/writer to simulate the local side - *peer -} - -// newTestPeer creates a new peer registered at the given protocol manager. -func newTestPeer(t *testing.T, name string, version int, pm *ProtocolManager, shake bool) (*testPeer, <-chan error) { - // Create a message pipe to communicate through - app, net := p2p.MsgPipe() - - // Generate a random id and create the peer - var id enode.ID - rand.Read(id[:]) - - peer := pm.newPeer(version, NetworkId, p2p.NewPeer(id, name, nil), net) - - // Start the peer on a new thread - errc := make(chan error, 1) - go func() { - select { - case pm.newPeerCh <- peer: - errc <- pm.handle(peer) - case <-pm.quitSync: - errc <- p2p.DiscQuitting - } - }() - tp := &testPeer{ - app: app, - net: net, - peer: peer, - } - // Execute any implicitly requested handshakes and return - if shake { - var ( - genesis = pm.blockchain.Genesis() - head = pm.blockchain.CurrentHeader() - td = pm.blockchain.GetTd(head.Hash(), head.Number.Uint64()) - ) - tp.handshake(t, td, head.Hash(), head.Number.Uint64(), genesis.Hash()) - } - return tp, errc -} - -func newTestPeerPair(name string, version int, pm, pm2 *ProtocolManager) (*peer, <-chan error, *peer, <-chan error) { - // Create a message pipe to communicate through - app, net := p2p.MsgPipe() - - // Generate a random id and create the peer - var id enode.ID - rand.Read(id[:]) - - peer := pm.newPeer(version, NetworkId, p2p.NewPeer(id, name, nil), net) - peer2 := pm2.newPeer(version, NetworkId, p2p.NewPeer(id, name, nil), app) - - // Start the peer on a new thread - errc := make(chan error, 1) - errc2 := make(chan error, 1) - go func() { - select { - case pm.newPeerCh <- peer: - errc <- pm.handle(peer) - case <-pm.quitSync: - errc <- p2p.DiscQuitting - } - }() - go func() { - select { - case pm2.newPeerCh <- peer2: - errc2 <- pm2.handle(peer2) - case <-pm2.quitSync: - errc2 <- p2p.DiscQuitting - } - }() - return peer, errc, peer2, errc2 -} - -// handshake simulates a trivial handshake that expects the same state from the -// remote side as we are simulating locally. -func (p *testPeer) handshake(t *testing.T, td *big.Int, head common.Hash, headNum uint64, genesis common.Hash) { - var expList keyValueList - expList = expList.add("protocolVersion", uint64(p.version)) - expList = expList.add("networkId", uint64(NetworkId)) - expList = expList.add("headTd", td) - expList = expList.add("headHash", head) - expList = expList.add("headNum", headNum) - expList = expList.add("genesisHash", genesis) - sendList := make(keyValueList, len(expList)) - copy(sendList, expList) - expList = expList.add("serveHeaders", nil) - expList = expList.add("serveChainSince", uint64(0)) - expList = expList.add("serveStateSince", uint64(0)) - expList = expList.add("txRelay", nil) - expList = expList.add("flowControl/BL", testBufLimit) - expList = expList.add("flowControl/MRR", uint64(1)) - expList = expList.add("flowControl/MRC", testRCL()) - - if err := p2p.ExpectMsg(p.app, StatusMsg, expList); err != nil { - t.Fatalf("status recv: %v", err) - } - if err := p2p.Send(p.app, StatusMsg, sendList); err != nil { - t.Fatalf("status send: %v", err) - } - - p.fcServerParams = &flowcontrol.ServerParams{ - BufLimit: testBufLimit, - MinRecharge: 1, - } -} - -// close terminates the local side of the peer, notifying the remote protocol -// manager of termination. -func (p *testPeer) close() { - p.app.Close() -} - -// TestEntity represents a network entity for testing with necessary auxiliary fields. -type TestEntity struct { - db ethdb.Database - rPeer *peer - tPeer *testPeer - peers *peerSet - pm *ProtocolManager - // Indexers - chtIndexer *core.ChainIndexer - bloomIndexer *core.ChainIndexer - bloomTrieIndexer *core.ChainIndexer -} - -// newServerEnv creates a server testing environment with a connected test peer for testing purpose. -func newServerEnv(t *testing.T, blocks int, protocol int, waitIndexers func(*core.ChainIndexer, *core.ChainIndexer, *core.ChainIndexer)) (*TestEntity, func()) { - db := ethdb.NewMemDatabase() - cIndexer, bIndexer, btIndexer := testIndexers(db, nil, light.TestServerIndexerConfig) - - pm := newTestProtocolManagerMust(t, false, blocks, testChainGen, nil, nil, db) - peer, _ := newTestPeer(t, "peer", protocol, pm, true) - - cIndexer.Start(pm.blockchain.(*core.BlockChain)) - bIndexer.Start(pm.blockchain.(*core.BlockChain)) - - // Wait until indexers generate enough index data. - if waitIndexers != nil { - waitIndexers(cIndexer, bIndexer, btIndexer) - } - - return &TestEntity{ - db: db, - tPeer: peer, - pm: pm, - chtIndexer: cIndexer, - bloomIndexer: bIndexer, - bloomTrieIndexer: btIndexer, - }, func() { - peer.close() - // Note bloom trie indexer will be closed by it parent recursively. - cIndexer.Close() - bIndexer.Close() - } -} - -// newClientServerEnv creates a client/server arch environment with a connected les server and light client pair -// for testing purpose. -func newClientServerEnv(t *testing.T, blocks int, protocol int, waitIndexers func(*core.ChainIndexer, *core.ChainIndexer, *core.ChainIndexer), newPeer bool) (*TestEntity, *TestEntity, func()) { - db, ldb := ethdb.NewMemDatabase(), ethdb.NewMemDatabase() - peers, lPeers := newPeerSet(), newPeerSet() - - dist := newRequestDistributor(lPeers, make(chan struct{})) - rm := newRetrieveManager(lPeers, dist, nil) - odr := NewLesOdr(ldb, light.TestClientIndexerConfig, rm) - - cIndexer, bIndexer, btIndexer := testIndexers(db, nil, light.TestServerIndexerConfig) - lcIndexer, lbIndexer, lbtIndexer := testIndexers(ldb, odr, light.TestClientIndexerConfig) - odr.SetIndexers(lcIndexer, lbtIndexer, lbIndexer) - - pm := newTestProtocolManagerMust(t, false, blocks, testChainGen, nil, peers, db) - lpm := newTestProtocolManagerMust(t, true, 0, nil, odr, lPeers, ldb) - - startIndexers := func(clientMode bool, pm *ProtocolManager) { - if clientMode { - lcIndexer.Start(pm.blockchain.(*light.LightChain)) - lbIndexer.Start(pm.blockchain.(*light.LightChain)) - } else { - cIndexer.Start(pm.blockchain.(*core.BlockChain)) - bIndexer.Start(pm.blockchain.(*core.BlockChain)) - } - } - - startIndexers(false, pm) - startIndexers(true, lpm) - - // Execute wait until function if it is specified. - if waitIndexers != nil { - waitIndexers(cIndexer, bIndexer, btIndexer) - } - - var ( - peer, lPeer *peer - err1, err2 <-chan error - ) - if newPeer { - peer, err1, lPeer, err2 = newTestPeerPair("peer", protocol, pm, lpm) - select { - case <-time.After(time.Millisecond * 100): - case err := <-err1: - t.Fatalf("peer 1 handshake error: %v", err) - case err := <-err2: - t.Fatalf("peer 2 handshake error: %v", err) - } - } - - return &TestEntity{ - db: db, - pm: pm, - rPeer: peer, - peers: peers, - chtIndexer: cIndexer, - bloomIndexer: bIndexer, - bloomTrieIndexer: btIndexer, - }, &TestEntity{ - db: ldb, - pm: lpm, - rPeer: lPeer, - peers: lPeers, - chtIndexer: lcIndexer, - bloomIndexer: lbIndexer, - bloomTrieIndexer: lbtIndexer, - }, func() { - // Note bloom trie indexers will be closed by their parents recursively. - cIndexer.Close() - bIndexer.Close() - lcIndexer.Close() - lbIndexer.Close() - } -} diff --git a/les/metrics.go b/les/metrics.go index 46f7078e5ba6..9ef8c365180c 100644 --- a/les/metrics.go +++ b/les/metrics.go @@ -17,51 +17,96 @@ package les import ( - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/p2p" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/p2p" ) var ( - /* propTxnInPacketsMeter = metrics.NewMeter("eth/prop/txns/in/packets") - propTxnInTrafficMeter = metrics.NewMeter("eth/prop/txns/in/traffic") - propTxnOutPacketsMeter = metrics.NewMeter("eth/prop/txns/out/packets") - propTxnOutTrafficMeter = metrics.NewMeter("eth/prop/txns/out/traffic") - propHashInPacketsMeter = metrics.NewMeter("eth/prop/hashes/in/packets") - propHashInTrafficMeter = metrics.NewMeter("eth/prop/hashes/in/traffic") - propHashOutPacketsMeter = metrics.NewMeter("eth/prop/hashes/out/packets") - propHashOutTrafficMeter = metrics.NewMeter("eth/prop/hashes/out/traffic") - propBlockInPacketsMeter = metrics.NewMeter("eth/prop/blocks/in/packets") - propBlockInTrafficMeter = metrics.NewMeter("eth/prop/blocks/in/traffic") - propBlockOutPacketsMeter = metrics.NewMeter("eth/prop/blocks/out/packets") - propBlockOutTrafficMeter = metrics.NewMeter("eth/prop/blocks/out/traffic") - reqHashInPacketsMeter = metrics.NewMeter("eth/req/hashes/in/packets") - reqHashInTrafficMeter = metrics.NewMeter("eth/req/hashes/in/traffic") - reqHashOutPacketsMeter = metrics.NewMeter("eth/req/hashes/out/packets") - reqHashOutTrafficMeter = metrics.NewMeter("eth/req/hashes/out/traffic") - reqBlockInPacketsMeter = metrics.NewMeter("eth/req/blocks/in/packets") - reqBlockInTrafficMeter = metrics.NewMeter("eth/req/blocks/in/traffic") - reqBlockOutPacketsMeter = metrics.NewMeter("eth/req/blocks/out/packets") - reqBlockOutTrafficMeter = metrics.NewMeter("eth/req/blocks/out/traffic") - reqHeaderInPacketsMeter = metrics.NewMeter("eth/req/headers/in/packets") - reqHeaderInTrafficMeter = metrics.NewMeter("eth/req/headers/in/traffic") - reqHeaderOutPacketsMeter = metrics.NewMeter("eth/req/headers/out/packets") - reqHeaderOutTrafficMeter = metrics.NewMeter("eth/req/headers/out/traffic") - reqBodyInPacketsMeter = metrics.NewMeter("eth/req/bodies/in/packets") - reqBodyInTrafficMeter = metrics.NewMeter("eth/req/bodies/in/traffic") - reqBodyOutPacketsMeter = metrics.NewMeter("eth/req/bodies/out/packets") - reqBodyOutTrafficMeter = metrics.NewMeter("eth/req/bodies/out/traffic") - reqStateInPacketsMeter = metrics.NewMeter("eth/req/states/in/packets") - reqStateInTrafficMeter = metrics.NewMeter("eth/req/states/in/traffic") - reqStateOutPacketsMeter = metrics.NewMeter("eth/req/states/out/packets") - reqStateOutTrafficMeter = metrics.NewMeter("eth/req/states/out/traffic") - reqReceiptInPacketsMeter = metrics.NewMeter("eth/req/receipts/in/packets") - reqReceiptInTrafficMeter = metrics.NewMeter("eth/req/receipts/in/traffic") - reqReceiptOutPacketsMeter = metrics.NewMeter("eth/req/receipts/out/packets") - reqReceiptOutTrafficMeter = metrics.NewMeter("eth/req/receipts/out/traffic")*/ - miscInPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets", nil) - miscInTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic", nil) - miscOutPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets", nil) - miscOutTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic", nil) + miscInPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/total", nil) + miscInTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/total", nil) + miscInHeaderPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/header", nil) + miscInHeaderTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/header", nil) + miscInBodyPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/body", nil) + miscInBodyTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/body", nil) + miscInCodePacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/code", nil) + miscInCodeTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/code", nil) + miscInReceiptPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/receipt", nil) + miscInReceiptTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/receipt", nil) + miscInTrieProofPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/proof", nil) + miscInTrieProofTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/proof", nil) + miscInHelperTriePacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/helperTrie", nil) + miscInHelperTrieTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/helperTrie", nil) + miscInTxsPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/txs", nil) + miscInTxsTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/txs", nil) + miscInTxStatusPacketsMeter = metrics.NewRegisteredMeter("les/misc/in/packets/txStatus", nil) + miscInTxStatusTrafficMeter = metrics.NewRegisteredMeter("les/misc/in/traffic/txStatus", nil) + + miscOutPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/total", nil) + miscOutTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/total", nil) + miscOutHeaderPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/header", nil) + miscOutHeaderTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/header", nil) + miscOutBodyPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/body", nil) + miscOutBodyTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/body", nil) + miscOutCodePacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/code", nil) + miscOutCodeTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/code", nil) + miscOutReceiptPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/receipt", nil) + miscOutReceiptTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/receipt", nil) + miscOutTrieProofPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/proof", nil) + miscOutTrieProofTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/proof", nil) + miscOutHelperTriePacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/helperTrie", nil) + miscOutHelperTrieTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/helperTrie", nil) + miscOutTxsPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/txs", nil) + miscOutTxsTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/txs", nil) + miscOutTxStatusPacketsMeter = metrics.NewRegisteredMeter("les/misc/out/packets/txStatus", nil) + miscOutTxStatusTrafficMeter = metrics.NewRegisteredMeter("les/misc/out/traffic/txStatus", nil) + + miscServingTimeHeaderTimer = metrics.NewRegisteredTimer("les/misc/serve/header", nil) + miscServingTimeBodyTimer = metrics.NewRegisteredTimer("les/misc/serve/body", nil) + miscServingTimeCodeTimer = metrics.NewRegisteredTimer("les/misc/serve/code", nil) + miscServingTimeReceiptTimer = metrics.NewRegisteredTimer("les/misc/serve/receipt", nil) + miscServingTimeTrieProofTimer = metrics.NewRegisteredTimer("les/misc/serve/proof", nil) + miscServingTimeHelperTrieTimer = metrics.NewRegisteredTimer("les/misc/serve/helperTrie", nil) + miscServingTimeTxTimer = metrics.NewRegisteredTimer("les/misc/serve/txs", nil) + miscServingTimeTxStatusTimer = metrics.NewRegisteredTimer("les/misc/serve/txStatus", nil) + + connectionTimer = metrics.NewRegisteredTimer("les/connection/duration", nil) + serverConnectionGauge = metrics.NewRegisteredGauge("les/connection/server", nil) + clientConnectionGauge = metrics.NewRegisteredGauge("les/connection/client", nil) + + totalCapacityGauge = metrics.NewRegisteredGauge("les/server/totalCapacity", nil) + totalRechargeGauge = metrics.NewRegisteredGauge("les/server/totalRecharge", nil) + totalConnectedGauge = metrics.NewRegisteredGauge("les/server/totalConnected", nil) + blockProcessingTimer = metrics.NewRegisteredTimer("les/server/blockProcessingTime", nil) + + requestServedMeter = metrics.NewRegisteredMeter("les/server/req/avgServedTime", nil) + requestServedTimer = metrics.NewRegisteredTimer("les/server/req/servedTime", nil) + requestEstimatedMeter = metrics.NewRegisteredMeter("les/server/req/avgEstimatedTime", nil) + requestEstimatedTimer = metrics.NewRegisteredTimer("les/server/req/estimatedTime", nil) + relativeCostHistogram = metrics.NewRegisteredHistogram("les/server/req/relative", nil, metrics.NewExpDecaySample(1028, 0.015)) + relativeCostHeaderHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/header", nil, metrics.NewExpDecaySample(1028, 0.015)) + relativeCostBodyHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/body", nil, metrics.NewExpDecaySample(1028, 0.015)) + relativeCostReceiptHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/receipt", nil, metrics.NewExpDecaySample(1028, 0.015)) + relativeCostCodeHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/code", nil, metrics.NewExpDecaySample(1028, 0.015)) + relativeCostProofHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/proof", nil, metrics.NewExpDecaySample(1028, 0.015)) + relativeCostHelperProofHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/helperTrie", nil, metrics.NewExpDecaySample(1028, 0.015)) + relativeCostSendTxHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/txs", nil, metrics.NewExpDecaySample(1028, 0.015)) + relativeCostTxStatusHistogram = metrics.NewRegisteredHistogram("les/server/req/relative/txStatus", nil, metrics.NewExpDecaySample(1028, 0.015)) + + globalFactorGauge = metrics.NewRegisteredGauge("les/server/globalFactor", nil) + recentServedGauge = metrics.NewRegisteredGauge("les/server/recentRequestServed", nil) + recentEstimatedGauge = metrics.NewRegisteredGauge("les/server/recentRequestEstimated", nil) + sqServedGauge = metrics.NewRegisteredGauge("les/server/servingQueue/served", nil) + sqQueuedGauge = metrics.NewRegisteredGauge("les/server/servingQueue/queued", nil) + + clientConnectedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/connected", nil) + clientRejectedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/rejected", nil) + clientKickedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/kicked", nil) + clientDisconnectedMeter = metrics.NewRegisteredMeter("les/server/clientEvent/disconnected", nil) + clientFreezeMeter = metrics.NewRegisteredMeter("les/server/clientEvent/freeze", nil) + clientErrorMeter = metrics.NewRegisteredMeter("les/server/clientEvent/error", nil) + + requestRTT = metrics.NewRegisteredTimer("les/client/req/rtt", nil) + requestSendDelay = metrics.NewRegisteredTimer("les/client/req/sendDelay", nil) ) // meteredMsgReadWriter is a wrapper around a p2p.MsgReadWriter, capable of @@ -73,17 +118,11 @@ type meteredMsgReadWriter struct { // newMeteredMsgWriter wraps a p2p MsgReadWriter with metering support. If the // metrics system is disabled, this function returns the original object. -func newMeteredMsgWriter(rw p2p.MsgReadWriter) p2p.MsgReadWriter { +func newMeteredMsgWriter(rw p2p.MsgReadWriter, version int) p2p.MsgReadWriter { if !metrics.Enabled { return rw } - return &meteredMsgReadWriter{MsgReadWriter: rw} -} - -// Init sets the protocol version used by the stream to know which meters to -// increment in case of overlapping message ids between protocol versions. -func (rw *meteredMsgReadWriter) Init(version int) { - rw.version = version + return &meteredMsgReadWriter{MsgReadWriter: rw, version: version} } func (rw *meteredMsgReadWriter) ReadMsg() (p2p.Msg, error) { diff --git a/les/odr.go b/les/odr.go index d74611ff748f..136ecf4df4c6 100644 --- a/les/odr.go +++ b/les/odr.go @@ -18,11 +18,13 @@ package les import ( "context" + "time" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/light" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/log" ) // LesOdr implements light.OdrBackend @@ -84,10 +86,9 @@ const ( MsgBlockBodies = iota MsgCode MsgReceipts - MsgProofsV1 MsgProofsV2 - MsgHeaderProofs MsgHelperTrieProofs + MsgTxStatus ) // Msg encodes a LES message that delivers reply data for a request @@ -109,19 +110,23 @@ func (odr *LesOdr) Retrieve(ctx context.Context, req light.OdrRequest) (err erro }, canSend: func(dp distPeer) bool { p := dp.(*peer) - return lreq.CanSend(p) + if !p.onlyAnnounce { + return lreq.CanSend(p) + } + return false }, request: func(dp distPeer) func() { p := dp.(*peer) cost := lreq.GetCost(p) - p.fcServer.QueueRequest(reqID, cost) + p.fcServer.QueuedRequest(reqID, cost) return func() { lreq.Request(reqID, p) } }, } - + sent := mclock.Now() 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(odr.db) + requestRTT.Update(time.Duration(mclock.Now() - sent)) } else { log.Debug("Failed to retrieve data from network", "err", err) } diff --git a/les/odr_requests.go b/les/odr_requests.go index e236c500141b..3c4dd7090fc0 100644 --- a/les/odr_requests.go +++ b/les/odr_requests.go @@ -14,8 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package light implements on-demand retrieval capable state and chain objects -// for the Ethereum Light Client. package les import ( @@ -23,15 +21,15 @@ import ( "errors" "fmt" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/light" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" ) var ( @@ -68,6 +66,8 @@ func LesRequest(req light.OdrRequest) LesOdrRequest { return (*ChtRequest)(r) case *light.BloomRequest: return (*BloomRequest)(r) + case *light.TxStatusRequest: + return (*TxStatusRequest)(r) default: return nil } @@ -166,11 +166,13 @@ func (r *ReceiptsRequest) Validate(db ethdb.Database, msg *Msg) error { receipt := receipts[0] // Retrieve our stored header and validate receipt content against it - header := rawdb.ReadHeader(db, r.Hash, r.Number) - if header == nil { + if r.Header == nil { + r.Header = rawdb.ReadHeader(db, r.Hash, r.Number) + } + if r.Header == nil { return errHeaderUnavailable } - if header.ReceiptHash != types.DeriveSha(receipt) { + if r.Header.ReceiptHash != types.DeriveSha(receipt) { return errReceiptHashMismatch } // Validations passed, store and return @@ -190,14 +192,7 @@ 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 { - switch peer.version { - case lpv1: - return peer.GetRequestCost(GetProofsV1Msg, 1) - case lpv2: - return peer.GetRequestCost(GetProofsV2Msg, 1) - default: - panic(nil) - } + return peer.GetRequestCost(GetProofsV2Msg, 1) } // CanSend tells if a certain peer is suitable for serving the given request @@ -222,38 +217,22 @@ 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) - 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: + if msg.MsgType != MsgProofsV2 { return errInvalidMessageType } + 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 } type CodeReq struct { @@ -332,32 +311,13 @@ type HelperTrieResps struct { // describes all responses, not just a single one 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 -} - // ODR request type for requesting headers by Canonical Hash Trie, see LesOdrRequest interface 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 { - switch peer.version { - case lpv1: - return peer.GetRequestCost(GetHeaderProofsMsg, 1) - case lpv2: - return peer.GetRequestCost(GetHelperTrieProofsMsg, 1) - default: - panic(nil) - } + return peer.GetRequestCost(GetHelperTrieProofsMsg, 1) } // CanSend tells if a certain peer is suitable for serving the given request @@ -365,7 +325,11 @@ func (r *ChtRequest) CanSend(peer *peer) bool { peer.lock.RLock() defer peer.lock.RUnlock() - return peer.headInfo.Number >= r.Config.ChtConfirms && r.ChtNum <= (peer.headInfo.Number-r.Config.ChtConfirms)/r.Config.ChtSize + if r.Untrusted { + return peer.headInfo.Number >= r.BlockNum && peer.id == r.PeerId + } else { + return peer.headInfo.Number >= r.Config.ChtConfirms && r.ChtNum <= (peer.headInfo.Number-r.Config.ChtConfirms)/r.Config.ChtSize + } } // Request sends an ODR request to the LES network (implementation of LesOdrRequest) @@ -379,21 +343,7 @@ func (r *ChtRequest) Request(reqID uint64, peer *peer) error { Key: encNum[:], AuxReq: auxHeader, } - switch peer.version { - case lpv1: - var reqsV1 ChtReq - if req.Type != 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 = ChtReq{ChtNum: (req.TrieIdx + 1) * (r.Config.ChtSize / r.Config.PairChtSize), BlockNum: blockNum, FromLevel: req.FromLevel} - return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), []ChtReq{reqsV1}) - case lpv2: - return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), []HelperTrieReq{req}) - default: - panic(nil) - } + return peer.RequestHelperTrieProofs(reqID, r.GetCost(peer), []HelperTrieReq{req}) } // Valid processes an ODR request reply message from the LES network @@ -402,49 +352,28 @@ 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) - 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 - } + if msg.MsgType != MsgHelperTrieProofs { + return errInvalidMessageType + } + 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 + // Verify the CHT + // Note: For untrusted CHT request, there is no proof response but + // header data. + var node light.ChtNode + if !r.Untrusted { var encNumber [8]byte binary.BigEndian.PutUint64(encNumber[:], r.BlockNum) @@ -457,7 +386,6 @@ func (r *ChtRequest) Validate(db ethdb.Database, msg *Msg) error { return errUselessNodes } - var node light.ChtNode if err := rlp.DecodeBytes(value, &node); err != nil { return err } @@ -467,13 +395,12 @@ func (r *ChtRequest) Validate(db ethdb.Database, msg *Msg) error { 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 } + // Verifications passed, store and return + r.Header = header + r.Proof = nodeSet + r.Td = node.Td // For untrusted request, td here is nil, todo improve the les/2 protocol + return nil } @@ -557,10 +484,48 @@ func (r *BloomRequest) Validate(db ethdb.Database, msg *Msg) error { return nil } +// TxStatusRequest is the ODR request type for transaction status +type TxStatusRequest light.TxStatusRequest + +// GetCost returns the cost of the given ODR request according to the serving +// peer's cost table (implementation of LesOdrRequest) +func (r *TxStatusRequest) GetCost(peer *peer) uint64 { + return peer.GetRequestCost(GetTxStatusMsg, len(r.Hashes)) +} + +// CanSend tells if a certain peer is suitable for serving the given request +func (r *TxStatusRequest) CanSend(peer *peer) bool { + return peer.version >= lpv2 +} + +// Request sends an ODR request to the LES network (implementation of LesOdrRequest) +func (r *TxStatusRequest) Request(reqID uint64, peer *peer) error { + peer.Log().Debug("Requesting transaction status", "count", len(r.Hashes)) + return peer.RequestTxStatus(reqID, r.GetCost(peer), r.Hashes) +} + +// 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 *TxStatusRequest) Validate(db ethdb.Database, msg *Msg) error { + log.Debug("Validating transaction status", "count", len(r.Hashes)) + + // Ensure we have a correct message with a single block body + if msg.MsgType != MsgTxStatus { + return errInvalidMessageType + } + status := msg.Obj.([]light.TxStatus) + if len(status) != len(r.Hashes) { + return errInvalidEntryCount + } + r.Status = status + 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 + db ethdb.KeyValueReader reads map[string]struct{} } diff --git a/les/odr_test.go b/les/odr_test.go index fdaf2d5cbd3c..7d10878226d0 100644 --- a/les/odr_test.go +++ b/les/odr_test.go @@ -23,24 +23,23 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/light" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" ) type odrTestFn func(ctx context.Context, db ethdb.Database, config *params.ChainConfig, bc *core.BlockChain, lc *light.LightChain, bhash common.Hash) []byte -func TestOdrGetBlockLes1(t *testing.T) { testOdr(t, 1, 1, odrGetBlock) } - -func TestOdrGetBlockLes2(t *testing.T) { testOdr(t, 2, 1, odrGetBlock) } +func TestOdrGetBlockLes2(t *testing.T) { testOdr(t, 2, 1, true, odrGetBlock) } +func TestOdrGetBlockLes3(t *testing.T) { testOdr(t, 3, 1, true, 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 @@ -56,15 +55,14 @@ func odrGetBlock(ctx context.Context, db ethdb.Database, config *params.ChainCon return rlp } -func TestOdrGetReceiptsLes1(t *testing.T) { testOdr(t, 1, 1, odrGetReceipts) } - -func TestOdrGetReceiptsLes2(t *testing.T) { testOdr(t, 2, 1, odrGetReceipts) } +func TestOdrGetReceiptsLes2(t *testing.T) { testOdr(t, 2, 1, true, odrGetReceipts) } +func TestOdrGetReceiptsLes3(t *testing.T) { testOdr(t, 3, 1, true, 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 { if number := rawdb.ReadHeaderNumber(db, bhash); number != nil { - receipts = rawdb.ReadReceipts(db, bhash, *number) + receipts = rawdb.ReadReceipts(db, bhash, *number, config) } } else { if number := rawdb.ReadHeaderNumber(db, bhash); number != nil { @@ -78,13 +76,12 @@ func odrGetReceipts(ctx context.Context, db ethdb.Database, config *params.Chain return rlp } -func TestOdrAccountsLes1(t *testing.T) { testOdr(t, 1, 1, odrAccounts) } - -func TestOdrAccountsLes2(t *testing.T) { testOdr(t, 2, 1, odrAccounts) } +func TestOdrAccountsLes2(t *testing.T) { testOdr(t, 2, 1, true, odrAccounts) } +func TestOdrAccountsLes3(t *testing.T) { testOdr(t, 3, 1, true, 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} + acc := []common.Address{bankAddr, userAddr1, userAddr2, dummyAddr} var ( res []byte @@ -108,9 +105,8 @@ func odrAccounts(ctx context.Context, db ethdb.Database, config *params.ChainCon return res } -func TestOdrContractCallLes1(t *testing.T) { testOdr(t, 1, 2, odrContractCall) } - -func TestOdrContractCallLes2(t *testing.T) { testOdr(t, 2, 2, odrContractCall) } +func TestOdrContractCallLes2(t *testing.T) { testOdr(t, 2, 2, true, odrContractCall) } +func TestOdrContractCallLes3(t *testing.T) { testOdr(t, 3, 2, true, odrContractCall) } type callmsg struct { types.Message @@ -129,7 +125,7 @@ func odrContractCall(ctx context.Context, db ethdb.Database, config *params.Chai statedb, err := state.New(header.Root, state.NewDatabase(db)) if err == nil { - from := statedb.GetOrNewStateObject(testBankAddress) + from := statedb.GetOrNewStateObject(bankAddr) from.SetBalance(math.MaxBig256) msg := callmsg{types.NewMessage(from.Address(), &testContractAddr, 0, new(big.Int), 100000, new(big.Int), data, false)} @@ -145,8 +141,8 @@ func odrContractCall(ctx context.Context, db ethdb.Database, config *params.Chai } else { header := lc.GetHeaderByHash(bhash) state := light.NewState(ctx, header, lc.Odr()) - state.SetBalance(testBankAddress, math.MaxBig256) - msg := callmsg{types.NewMessage(testBankAddress, &testContractAddr, 0, new(big.Int), 100000, new(big.Int), data, false)} + state.SetBalance(bankAddr, math.MaxBig256) + msg := callmsg{types.NewMessage(bankAddr, &testContractAddr, 0, new(big.Int), 100000, new(big.Int), data, false)} context := core.NewEVMContext(msg, header, lc, nil) vmenv := vm.NewEVM(context, state, config, vm.Config{}) gp := new(core.GasPool).AddGas(math.MaxUint64) @@ -159,46 +155,89 @@ func odrContractCall(ctx context.Context, db ethdb.Database, config *params.Chai return res } +func TestOdrTxStatusLes2(t *testing.T) { testOdr(t, 2, 1, false, odrTxStatus) } +func TestOdrTxStatusLes3(t *testing.T) { testOdr(t, 3, 1, false, odrTxStatus) } + +func odrTxStatus(ctx context.Context, db ethdb.Database, config *params.ChainConfig, bc *core.BlockChain, lc *light.LightChain, bhash common.Hash) []byte { + var txs types.Transactions + if bc != nil { + block := bc.GetBlockByHash(bhash) + txs = block.Transactions() + } else { + if block, _ := lc.GetBlockByHash(ctx, bhash); block != nil { + btxs := block.Transactions() + txs = make(types.Transactions, len(btxs)) + for i, tx := range btxs { + var err error + txs[i], _, _, _, err = light.GetTransaction(ctx, lc.Odr(), tx.Hash()) + if err != nil { + return nil + } + } + } + } + rlp, _ := rlp.EncodeToBytes(txs) + return rlp +} + // testOdr tests odr requests whose validation guaranteed by block headers. -func testOdr(t *testing.T, protocol int, expFail uint64, fn odrTestFn) { +func testOdr(t *testing.T, protocol int, expFail uint64, checkCached bool, fn odrTestFn) { // Assemble the test environment - server, client, tearDown := newClientServerEnv(t, 4, protocol, nil, true) + server, client, tearDown := newClientServerEnv(t, 4, protocol, nil, nil, 0, false, true) defer tearDown() - client.pm.synchronise(client.rPeer) + + client.handler.synchronise(client.peer.peer) + + // Ensure the client has synced all necessary data. + clientHead := client.handler.backend.blockchain.CurrentHeader() + if clientHead.Number.Uint64() != 4 { + t.Fatalf("Failed to sync the chain with server, head: %v", clientHead.Number.Uint64()) + } + // Disable the mechanism that we will wait a few time for request + // even there is no suitable peer to send right now. + waitForPeers = 0 test := func(expFail uint64) { - for i := uint64(0); i <= server.pm.blockchain.CurrentHeader().Number.Uint64(); i++ { + // Mark this as a helper to put the failures at the correct lines + t.Helper() + + for i := uint64(0); i <= server.handler.blockchain.CurrentHeader().Number.Uint64(); i++ { bhash := rawdb.ReadCanonicalHash(server.db, i) - b1 := fn(light.NoOdr, server.db, server.pm.chainConfig, server.pm.blockchain.(*core.BlockChain), nil, bhash) + b1 := fn(light.NoOdr, server.db, server.handler.server.chainConfig, server.handler.blockchain, nil, bhash) - ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond) - defer cancel() - b2 := fn(ctx, client.db, client.pm.chainConfig, nil, client.pm.blockchain.(*light.LightChain), bhash) + // Set the timeout as 1 second here, ensure there is enough time + // for travis to make the action. + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + b2 := fn(ctx, client.db, client.handler.backend.chainConfig, nil, client.handler.backend.blockchain, bhash) + cancel() eq := bytes.Equal(b1, b2) exp := i < expFail if exp && !eq { - t.Errorf("odr mismatch") + t.Fatalf("odr mismatch: have %x, want %x", b2, b1) } if !exp && eq { - t.Errorf("unexpected odr match") + t.Fatalf("unexpected odr match") } } } - // temporarily remove peer to test odr fails + // expect retrievals to fail (except genesis block) without a les peer - client.peers.Unregister(client.rPeer.id) - time.Sleep(time.Millisecond * 10) // ensure that all peerSetNotify callbacks are executed + client.handler.backend.peers.lock.Lock() + client.peer.peer.hasBlock = func(common.Hash, uint64, bool) bool { return false } + client.handler.backend.peers.lock.Unlock() test(expFail) + // expect all retrievals to pass - client.peers.Register(client.rPeer) - time.Sleep(time.Millisecond * 10) // ensure that all peerSetNotify callbacks are executed - client.peers.lock.Lock() - client.rPeer.hasBlock = func(common.Hash, uint64, bool) bool { return true } - client.peers.lock.Unlock() + client.handler.backend.peers.lock.Lock() + client.peer.peer.hasBlock = func(common.Hash, uint64, bool) bool { return true } + client.handler.backend.peers.lock.Unlock() test(5) + // still expect all retrievals to pass, now data should be cached locally - client.peers.Unregister(client.rPeer.id) - time.Sleep(time.Millisecond * 10) // ensure that all peerSetNotify callbacks are executed - test(5) + if checkCached { + client.handler.backend.peers.Unregister(client.peer.peer.id) + time.Sleep(time.Millisecond * 10) // ensure that all peerSetNotify callbacks are executed + test(5) + } } diff --git a/les/peer.go b/les/peer.go index 492e2ebe5542..ab5b30a6571a 100644 --- a/les/peer.go +++ b/les/peer.go @@ -14,33 +14,58 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package les implements the Light Ethereum Subprotocol. package les import ( "errors" "fmt" "math/big" + "math/rand" + "net" "sync" + "sync/atomic" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/eth" - "github.com/nebulaai/nbai-node/les/flowcontrol" - "github.com/nebulaai/nbai-node/light" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/les/flowcontrol" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" ) var ( - errClosed = errors.New("peer set is closed") - errAlreadyRegistered = errors.New("peer is already registered") - errNotRegistered = errors.New("peer is not registered") - errInvalidHelpTrieReq = errors.New("invalid help trie request") + errClosed = errors.New("peer set is closed") + errAlreadyRegistered = errors.New("peer is already registered") + 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 ( + maxRequestErrors = 20 // number of invalid requests tolerated (makes the protocol less brittle but still avoids spam) + maxResponseErrors = 50 // number of invalid responses tolerated (makes the protocol less brittle but still avoids spam) +) + +// capacity limitation for parameter updates +const ( + allowedUpdateBytes = 100000 // initial/maximum allowed update size + allowedUpdateRate = time.Millisecond * 10 // time constant for recharging one byte of allowance +) + +const ( + freezeTimeBase = time.Millisecond * 700 // fixed component of client freeze time + freezeTimeRandom = time.Millisecond * 600 // random component of client freeze time + freezeCheckPeriod = time.Millisecond * 100 // buffer value recheck period after initial freeze time has elapsed +) + +// if the total encoded size of a sent transaction batch is over txSizeCostLimit +// per transaction then the request cost is calculated as proportional to the +// encoded size instead of the transaction count +const txSizeCostLimit = 0x4000 const ( announceTypeNone = iota @@ -50,47 +75,156 @@ const ( type peer struct { *p2p.Peer - rw p2p.MsgReadWriter version int // Protocol version negotiated network uint64 // Network ID being on - announceType, requestAnnounceType uint64 + announceType uint64 + + // Checkpoint relative fields + checkpoint params.TrustedCheckpoint + checkpointNumber uint64 id string headInfo *announceData lock sync.RWMutex - announceChn chan announceData - sendQueue *execQueue + sendQueue *execQueue + + errCh chan error + + // responseLock ensures that responses are queued in the same order as + // RequestProcessed is called + responseLock sync.Mutex + responseCount uint64 + invalidCount uint32 poolEntry *poolEntry hasBlock func(common.Hash, uint64, bool) bool responseErrors int + updateCounter uint64 + updateTime mclock.AbsTime + frozen uint32 // 1 if client is in frozen state - fcClient *flowcontrol.ClientNode // nil if the peer is server only - fcServer *flowcontrol.ServerNode // nil if the peer is client only - fcServerParams *flowcontrol.ServerParams - fcCosts requestCostTable -} + fcClient *flowcontrol.ClientNode // nil if the peer is server only + fcServer *flowcontrol.ServerNode // nil if the peer is client only + fcParams flowcontrol.ServerParams + fcCosts requestCostTable -func newPeer(version int, network uint64, p *p2p.Peer, rw p2p.MsgReadWriter) *peer { - id := p.ID() + trusted bool + onlyAnnounce bool + chainSince, chainRecent uint64 + stateSince, stateRecent uint64 +} +func newPeer(version int, network uint64, trusted bool, p *p2p.Peer, rw p2p.MsgReadWriter) *peer { return &peer{ - Peer: p, - rw: rw, - version: version, - network: network, - id: fmt.Sprintf("%x", id[:8]), - announceChn: make(chan announceData, 20), + Peer: p, + rw: rw, + version: version, + network: network, + id: peerIdToString(p.ID()), + trusted: trusted, + errCh: make(chan error, 1), + } +} + +// peerIdToString converts enode.ID to a string form +func peerIdToString(id enode.ID) string { + return fmt.Sprintf("%x", id.Bytes()) +} + +// freeClientId returns a string identifier for the peer. Multiple peers with the +// same identifier can not be connected in free mode simultaneously. +func (p *peer) freeClientId() string { + if addr, ok := p.RemoteAddr().(*net.TCPAddr); ok { + if addr.IP.IsLoopback() { + // using peer id instead of loopback ip address allows multiple free + // connections from local machine to own server + return p.id + } else { + return addr.IP.String() + } } + return p.id +} + +// rejectUpdate returns true if a parameter update has to be rejected because +// the size and/or rate of updates exceed the capacity limitation +func (p *peer) rejectUpdate(size uint64) bool { + now := mclock.Now() + if p.updateCounter == 0 { + p.updateTime = now + } else { + dt := now - p.updateTime + r := uint64(dt / mclock.AbsTime(allowedUpdateRate)) + if p.updateCounter > r { + p.updateCounter -= r + p.updateTime += mclock.AbsTime(allowedUpdateRate * time.Duration(r)) + } else { + p.updateCounter = 0 + p.updateTime = now + } + } + p.updateCounter += size + return p.updateCounter > allowedUpdateBytes +} + +// freezeClient temporarily puts the client in a frozen state which means all +// unprocessed and subsequent requests are dropped. Unfreezing happens automatically +// after a short time if the client's buffer value is at least in the slightly positive +// region. The client is also notified about being frozen/unfrozen with a Stop/Resume +// message. +func (p *peer) freezeClient() { + if p.version < lpv3 { + // if Stop/Resume is not supported then just drop the peer after setting + // its frozen status permanently + atomic.StoreUint32(&p.frozen, 1) + p.Peer.Disconnect(p2p.DiscUselessPeer) + return + } + if atomic.SwapUint32(&p.frozen, 1) == 0 { + go func() { + p.SendStop() + time.Sleep(freezeTimeBase + time.Duration(rand.Int63n(int64(freezeTimeRandom)))) + for { + bufValue, bufLimit := p.fcClient.BufferStatus() + if bufLimit == 0 { + return + } + if bufValue <= bufLimit/8 { + time.Sleep(freezeCheckPeriod) + } else { + atomic.StoreUint32(&p.frozen, 0) + p.SendResume(bufValue) + break + } + } + }() + } +} + +// freezeServer processes Stop/Resume messages from the given server +func (p *peer) freezeServer(frozen bool) { + var f uint32 + if frozen { + f = 1 + } + if atomic.SwapUint32(&p.frozen, f) != f && frozen { + p.sendQueue.clear() + } +} + +// isFrozen returns true if the client is frozen or the server has put our +// client in frozen state +func (p *peer) isFrozen() bool { + return atomic.LoadUint32(&p.frozen) != 0 } func (p *peer) canQueue() bool { - return p.sendQueue.canQueue() + return p.sendQueue.canQueue() && !p.isFrozen() } func (p *peer) queueSend(f func()) { @@ -143,6 +277,25 @@ func (p *peer) waitBefore(maxCost uint64) (time.Duration, float64) { return p.fcServer.CanSend(maxCost) } +// updateCapacity updates the request serving capacity assigned to a given client +// and also sends an announcement about the updated flow control parameters +func (p *peer) updateCapacity(cap uint64) { + p.responseLock.Lock() + defer p.responseLock.Unlock() + + p.fcParams = flowcontrol.ServerParams{MinRecharge: cap, BufLimit: cap * bufLimitRatio} + p.fcClient.UpdateParams(p.fcParams) + var kvList keyValueList + kvList = kvList.add("flowControl/MRR", cap) + kvList = kvList.add("flowControl/BL", cap*bufLimitRatio) + p.queueSend(func() { p.SendAnnounce(announceData{Update: kvList}) }) +} + +func (p *peer) responseID() uint64 { + p.responseCount += 1 + return p.responseCount +} + func sendRequest(w p2p.MsgWriter, msgcode, reqID, cost uint64, data interface{}) error { type req struct { ReqID uint64 @@ -151,31 +304,82 @@ func sendRequest(w p2p.MsgWriter, msgcode, reqID, cost uint64, data interface{}) return p2p.Send(w, msgcode, req{reqID, data}) } -func sendResponse(w p2p.MsgWriter, msgcode, reqID, bv uint64, data interface{}) error { +// reply struct represents a reply with the actual data already RLP encoded and +// only the bv (buffer value) missing. This allows the serving mechanism to +// calculate the bv value which depends on the data size before sending the reply. +type reply struct { + w p2p.MsgWriter + msgcode, reqID uint64 + data rlp.RawValue +} + +// send sends the reply with the calculated buffer value +func (r *reply) send(bv uint64) error { type resp struct { ReqID, BV uint64 - Data interface{} + Data rlp.RawValue } - return p2p.Send(w, msgcode, resp{reqID, bv, data}) + return p2p.Send(r.w, r.msgcode, resp{r.reqID, bv, r.data}) +} + +// size returns the RLP encoded size of the message data +func (r *reply) size() uint32 { + return uint32(len(r.data)) } func (p *peer) GetRequestCost(msgcode uint64, amount int) uint64 { p.lock.RLock() defer p.lock.RUnlock() - cost := p.fcCosts[msgcode].baseCost + p.fcCosts[msgcode].reqCost*uint64(amount) - if cost > p.fcServerParams.BufLimit { - cost = p.fcServerParams.BufLimit + costs := p.fcCosts[msgcode] + if costs == nil { + return 0 + } + cost := costs.baseCost + costs.reqCost*uint64(amount) + if cost > p.fcParams.BufLimit { + cost = p.fcParams.BufLimit + } + return cost +} + +func (p *peer) GetTxRelayCost(amount, size int) uint64 { + p.lock.RLock() + defer p.lock.RUnlock() + + costs := p.fcCosts[SendTxV2Msg] + if costs == nil { + return 0 + } + cost := costs.baseCost + costs.reqCost*uint64(amount) + sizeCost := costs.baseCost + costs.reqCost*uint64(size)/txSizeCostLimit + if sizeCost > cost { + cost = sizeCost + } + + if cost > p.fcParams.BufLimit { + cost = p.fcParams.BufLimit } return cost } // HasBlock checks if the peer has a given block func (p *peer) HasBlock(hash common.Hash, number uint64, hasState bool) bool { + var head, since, recent uint64 p.lock.RLock() + if p.headInfo != nil { + head = p.headInfo.Number + } + if hasState { + since = p.stateSince + recent = p.stateRecent + } else { + since = p.chainSince + recent = p.chainRecent + } hasBlock := p.hasBlock p.lock.RUnlock() - return hasBlock != nil && hasBlock(hash, number, hasState) + + return head >= number && number >= since && (recent == 0 || number+recent+4 > head) && hasBlock != nil && hasBlock(hash, number, hasState) } // SendAnnounce announces the availability of a number of blocks through @@ -184,52 +388,59 @@ func (p *peer) SendAnnounce(request announceData) error { return p2p.Send(p.rw, AnnounceMsg, request) } -// SendBlockHeaders sends a batch of block headers to the remote peer. -func (p *peer) SendBlockHeaders(reqID, bv uint64, headers []*types.Header) error { - return sendResponse(p.rw, BlockHeadersMsg, reqID, bv, headers) +// SendStop notifies the client about being in frozen state +func (p *peer) SendStop() error { + return p2p.Send(p.rw, StopMsg, struct{}{}) } -// SendBlockBodiesRLP sends a batch of block contents to the remote peer from -// an already RLP encoded format. -func (p *peer) SendBlockBodiesRLP(reqID, bv uint64, bodies []rlp.RawValue) error { - return sendResponse(p.rw, BlockBodiesMsg, reqID, bv, bodies) +// SendResume notifies the client about getting out of frozen state +func (p *peer) SendResume(bv uint64) error { + return p2p.Send(p.rw, ResumeMsg, bv) } -// SendCodeRLP sends a batch of arbitrary internal data, corresponding to the -// hashes requested. -func (p *peer) SendCode(reqID, bv uint64, data [][]byte) error { - return sendResponse(p.rw, CodeMsg, reqID, bv, data) +// ReplyBlockHeaders creates a reply with a batch of block headers +func (p *peer) ReplyBlockHeaders(reqID uint64, headers []*types.Header) *reply { + data, _ := rlp.EncodeToBytes(headers) + return &reply{p.rw, BlockHeadersMsg, reqID, data} } -// SendReceiptsRLP sends a batch of transaction receipts, corresponding to the -// ones requested from an already RLP encoded format. -func (p *peer) SendReceiptsRLP(reqID, bv uint64, receipts []rlp.RawValue) error { - return sendResponse(p.rw, ReceiptsMsg, reqID, bv, receipts) +// ReplyBlockBodiesRLP creates a reply with a batch of block contents from +// an already RLP encoded format. +func (p *peer) ReplyBlockBodiesRLP(reqID uint64, bodies []rlp.RawValue) *reply { + data, _ := rlp.EncodeToBytes(bodies) + return &reply{p.rw, BlockBodiesMsg, reqID, data} } -// 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, ProofsV1Msg, reqID, bv, proofs) +// ReplyCode creates a reply with a batch of arbitrary internal data, corresponding to the +// hashes requested. +func (p *peer) ReplyCode(reqID uint64, codes [][]byte) *reply { + data, _ := rlp.EncodeToBytes(codes) + return &reply{p.rw, CodeMsg, reqID, data} } -// 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) +// ReplyReceiptsRLP creates a reply with a batch of transaction receipts, corresponding to the +// ones requested from an already RLP encoded format. +func (p *peer) ReplyReceiptsRLP(reqID uint64, receipts []rlp.RawValue) *reply { + data, _ := rlp.EncodeToBytes(receipts) + return &reply{p.rw, ReceiptsMsg, reqID, data} } -// 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) +// ReplyProofsV2 creates a reply with a batch of merkle proofs, corresponding to the ones requested. +func (p *peer) ReplyProofsV2(reqID uint64, proofs light.NodeList) *reply { + data, _ := rlp.EncodeToBytes(proofs) + return &reply{p.rw, ProofsV2Msg, reqID, data} } -// 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) +// ReplyHelperTrieProofs creates a reply with a batch of HelperTrie proofs, corresponding to the ones requested. +func (p *peer) ReplyHelperTrieProofs(reqID uint64, resp HelperTrieResps) *reply { + data, _ := rlp.EncodeToBytes(resp) + return &reply{p.rw, HelperTrieProofsMsg, reqID, data} } -// 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) +// ReplyTxStatus creates a reply with a batch of transaction status records, corresponding to the ones requested. +func (p *peer) ReplyTxStatus(reqID uint64, stats []light.TxStatus) *reply { + data, _ := rlp.EncodeToBytes(stats) + return &reply{p.rw, TxStatusMsg, reqID, data} } // RequestHeadersByHash fetches a batch of blocks' headers corresponding to the @@ -269,36 +480,13 @@ 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 { p.Log().Debug("Fetching batch of proofs", "count", len(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) - } + return sendRequest(p.rw, GetProofsV2Msg, reqID, cost, reqs) } // RequestHelperTrieProofs fetches a batch of HelperTrie merkle proofs from a remote node. -func (p *peer) RequestHelperTrieProofs(reqID, cost uint64, data interface{}) error { - switch p.version { - case lpv1: - reqs, ok := data.([]ChtReq) - if !ok { - return errInvalidHelpTrieReq - } - p.Log().Debug("Fetching batch of header proofs", "count", len(reqs)) - return sendRequest(p.rw, GetHeaderProofsMsg, reqID, cost, reqs) - case lpv2: - reqs, ok := data.([]HelperTrieReq) - if !ok { - return errInvalidHelpTrieReq - } - p.Log().Debug("Fetching batch of HelperTrie proofs", "count", len(reqs)) - return sendRequest(p.rw, GetHelperTrieProofsMsg, reqID, cost, reqs) - default: - panic(nil) - } +func (p *peer) RequestHelperTrieProofs(reqID, cost uint64, reqs []HelperTrieReq) error { + p.Log().Debug("Fetching batch of HelperTrie proofs", "count", len(reqs)) + return sendRequest(p.rw, GetHelperTrieProofsMsg, reqID, cost, reqs) } // RequestTxStatus fetches a batch of transaction status records from a remote node. @@ -307,17 +495,10 @@ func (p *peer) RequestTxStatus(reqID, cost uint64, txHashes []common.Hash) error 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)) - 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) - } +// SendTxStatus creates a reply with a batch of transactions to be added to the remote transaction pool. +func (p *peer) SendTxs(reqID, cost uint64, txs rlp.RawValue) error { + p.Log().Debug("Sending batch of transactions", "size", len(txs)) + return sendRequest(p.rw, SendTxV2Msg, reqID, cost, txs) } type keyValueEntry struct { @@ -340,12 +521,14 @@ func (l keyValueList) add(key string, val interface{}) keyValueList { return append(l, entry) } -func (l keyValueList) decode() keyValueMap { +func (l keyValueList) decode() (keyValueMap, uint64) { m := make(keyValueMap) + var size uint64 for _, entry := range l { m[entry.Key] = entry.Value + size += uint64(len(entry.Key)) + uint64(len(entry.Value)) + 8 } - return m + return m, size } func (m keyValueMap) get(key string, val interface{}) error { @@ -394,6 +577,8 @@ func (p *peer) Handshake(td *big.Int, head common.Hash, headNum uint64, genesis defer p.lock.Unlock() var send keyValueList + + // Add some basic handshake fields send = send.add("protocolVersion", uint64(p.version)) send = send.add("networkId", p.network) send = send.add("headTd", td) @@ -401,24 +586,60 @@ func (p *peer) Handshake(td *big.Int, head common.Hash, headNum uint64, genesis send = send.add("headNum", headNum) send = send.add("genesisHash", genesis) if server != nil { - send = send.add("serveHeaders", nil) - send = send.add("serveChainSince", uint64(0)) - send = send.add("serveStateSince", uint64(0)) - send = send.add("txRelay", nil) + // Add some information which services server can offer. + if !server.config.UltraLightOnlyAnnounce { + send = send.add("serveHeaders", nil) + send = send.add("serveChainSince", uint64(0)) + send = send.add("serveStateSince", uint64(0)) + + // If local ethereum node is running in archive mode, advertise ourselves we have + // all version state data. Otherwise only recent state is available. + stateRecent := uint64(core.TriesInMemory - 4) + if server.archiveMode { + stateRecent = 0 + } + send = send.add("serveRecentState", stateRecent) + send = send.add("txRelay", nil) + } send = send.add("flowControl/BL", server.defParams.BufLimit) send = send.add("flowControl/MRR", server.defParams.MinRecharge) - list := server.fcCostStats.getCurrentList() - send = send.add("flowControl/MRC", list) - p.fcCosts = list.decode() + + var costList RequestCostList + if server.costTracker.testCostList != nil { + costList = server.costTracker.testCostList + } else { + costList = server.costTracker.makeCostList(server.costTracker.globalFactor()) + } + send = send.add("flowControl/MRC", costList) + p.fcCosts = costList.decode(ProtocolLengths[uint(p.version)]) + p.fcParams = server.defParams + + // Add advertised checkpoint and register block height which + // client can verify the checkpoint validity. + if server.oracle != nil && server.oracle.isRunning() { + cp, height := server.oracle.stableCheckpoint() + if cp != nil { + send = send.add("checkpoint/value", cp) + send = send.add("checkpoint/registerHeight", height) + } + } } else { - p.requestAnnounceType = announceTypeSimple // set to default until "very light" client mode is implemented - send = send.add("announceType", p.requestAnnounceType) + // Add some client-specific handshake fields + p.announceType = announceTypeSimple + if p.trusted { + p.announceType = announceTypeSigned + } + send = send.add("announceType", p.announceType) } + recvList, err := p.sendReceiveHandshake(send) if err != nil { return err } - recv := recvList.decode() + recv, size := recvList.decode() + if p.rejectUpdate(size) { + return errResp(ErrRequestRejected, "") + } var rGenesis, rHash common.Hash var rVersion, rNetwork, rNum uint64 @@ -452,45 +673,86 @@ func (p *peer) Handshake(td *big.Int, head common.Hash, headNum uint64, genesis if int(rVersion) != p.version { return errResp(ErrProtocolVersionMismatch, "%d (!= %d)", rVersion, p.version) } + if server != nil { - // until we have a proper peer connectivity API, allow LES connection to other servers - /*if recv.get("serveStateSince", nil) == nil { - return errResp(ErrUselessPeer, "wanted client, got server") - }*/ if recv.get("announceType", &p.announceType) != nil { + // set default announceType on server side p.announceType = announceTypeSimple } p.fcClient = flowcontrol.NewClientNode(server.fcManager, server.defParams) } else { - if recv.get("serveChainSince", nil) != nil { - return errResp(ErrUselessPeer, "peer cannot serve chain") + if recv.get("serveChainSince", &p.chainSince) != nil { + p.onlyAnnounce = true + } + if recv.get("serveRecentChain", &p.chainRecent) != nil { + p.chainRecent = 0 + } + if recv.get("serveStateSince", &p.stateSince) != nil { + p.onlyAnnounce = true } - if recv.get("serveStateSince", nil) != nil { - return errResp(ErrUselessPeer, "peer cannot serve state") + if recv.get("serveRecentState", &p.stateRecent) != nil { + p.stateRecent = 0 } if recv.get("txRelay", nil) != nil { - return errResp(ErrUselessPeer, "peer cannot relay transactions") + p.onlyAnnounce = true } - params := &flowcontrol.ServerParams{} - if err := recv.get("flowControl/BL", ¶ms.BufLimit); err != nil { + + if p.onlyAnnounce && !p.trusted { + return errResp(ErrUselessPeer, "peer cannot serve requests") + } + + var sParams flowcontrol.ServerParams + if err := recv.get("flowControl/BL", &sParams.BufLimit); err != nil { return err } - if err := recv.get("flowControl/MRR", ¶ms.MinRecharge); err != nil { + if err := recv.get("flowControl/MRR", &sParams.MinRecharge); err != nil { return err } var MRC RequestCostList if err := recv.get("flowControl/MRC", &MRC); err != nil { return err } - p.fcServerParams = params - p.fcServer = flowcontrol.NewServerNode(params) - p.fcCosts = MRC.decode() + p.fcParams = sParams + p.fcServer = flowcontrol.NewServerNode(sParams, &mclock.System{}) + p.fcCosts = MRC.decode(ProtocolLengths[uint(p.version)]) + + recv.get("checkpoint/value", &p.checkpoint) + recv.get("checkpoint/registerHeight", &p.checkpointNumber) + + if !p.onlyAnnounce { + for msgCode := range reqAvgTimeCost { + if p.fcCosts[msgCode] == nil { + return errResp(ErrUselessPeer, "peer does not support message %d", msgCode) + } + } + } } - p.headInfo = &announceData{Td: rTd, Hash: rHash, Number: rNum} return nil } +// updateFlowControl updates the flow control parameters belonging to the server +// node if the announced key/value set contains relevant fields +func (p *peer) updateFlowControl(update keyValueMap) { + if p.fcServer == nil { + return + } + // If any of the flow control params is nil, refuse to update. + var params flowcontrol.ServerParams + if update.get("flowControl/BL", ¶ms.BufLimit) == nil && update.get("flowControl/MRR", ¶ms.MinRecharge) == nil { + // todo can light client set a minimal acceptable flow control params? + p.fcParams = params + p.fcServer.UpdateParams(params) + } + var MRC RequestCostList + if update.get("flowControl/MRC", &MRC) == nil { + costUpdate := MRC.decode(ProtocolLengths[uint(p.version)]) + for code, cost := range costUpdate { + p.fcCosts[code] = cost + } + } +} + // String implements fmt.Stringer. func (p *peer) String() string { return fmt.Sprintf("Peer %s [%s]", p.id, @@ -576,8 +838,10 @@ func (ps *peerSet) Unregister(id string) error { for _, n := range peers { n.unregisterPeer(p) } + p.sendQueue.quit() p.Peer.Disconnect(p2p.DiscUselessPeer) + return nil } } diff --git a/les/peer_test.go b/les/peer_test.go new file mode 100644 index 000000000000..db74a052c14c --- /dev/null +++ b/les/peer_test.go @@ -0,0 +1,302 @@ +// Copyright 2019 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 ( + "math/big" + "net" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/les/flowcontrol" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/rlp" +) + +const protocolVersion = lpv2 + +var ( + hash = common.HexToHash("deadbeef") + genesis = common.HexToHash("cafebabe") + headNum = uint64(1234) + td = big.NewInt(123) +) + +func newNodeID(t *testing.T) *enode.Node { + key, err := crypto.GenerateKey() + if err != nil { + t.Fatal("generate key err:", err) + } + return enode.NewV4(&key.PublicKey, net.IP{}, 35000, 35000) +} + +// ulc connects to trusted peer and send announceType=announceTypeSigned +func TestPeerHandshakeSetAnnounceTypeToAnnounceTypeSignedForTrustedPeer(t *testing.T) { + id := newNodeID(t).ID() + + // peer to connect(on ulc side) + p := peer{ + Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), + version: protocolVersion, + trusted: true, + rw: &rwStub{ + WriteHook: func(recvList keyValueList) { + recv, _ := recvList.decode() + var reqType uint64 + err := recv.get("announceType", &reqType) + if err != nil { + t.Fatal(err) + } + if reqType != announceTypeSigned { + t.Fatal("Expected announceTypeSigned") + } + }, + ReadHook: func(l keyValueList) keyValueList { + l = l.add("serveHeaders", nil) + l = l.add("serveChainSince", uint64(0)) + l = l.add("serveStateSince", uint64(0)) + l = l.add("txRelay", nil) + l = l.add("flowControl/BL", uint64(0)) + l = l.add("flowControl/MRR", uint64(0)) + l = l.add("flowControl/MRC", testCostList(0)) + return l + }, + }, + network: NetworkId, + } + err := p.Handshake(td, hash, headNum, genesis, nil) + if err != nil { + t.Fatalf("Handshake error: %s", err) + } + if p.announceType != announceTypeSigned { + t.Fatal("Incorrect announceType") + } +} + +func TestPeerHandshakeAnnounceTypeSignedForTrustedPeersPeerNotInTrusted(t *testing.T) { + id := newNodeID(t).ID() + p := peer{ + Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), + version: protocolVersion, + rw: &rwStub{ + WriteHook: func(recvList keyValueList) { + // checking that ulc sends to peer allowedRequests=noRequests and announceType != announceTypeSigned + recv, _ := recvList.decode() + var reqType uint64 + err := recv.get("announceType", &reqType) + if err != nil { + t.Fatal(err) + } + if reqType == announceTypeSigned { + t.Fatal("Expected not announceTypeSigned") + } + }, + ReadHook: func(l keyValueList) keyValueList { + l = l.add("serveHeaders", nil) + l = l.add("serveChainSince", uint64(0)) + l = l.add("serveStateSince", uint64(0)) + l = l.add("txRelay", nil) + l = l.add("flowControl/BL", uint64(0)) + l = l.add("flowControl/MRR", uint64(0)) + l = l.add("flowControl/MRC", testCostList(0)) + return l + }, + }, + network: NetworkId, + } + err := p.Handshake(td, hash, headNum, genesis, nil) + if err != nil { + t.Fatal(err) + } + if p.announceType == announceTypeSigned { + t.Fatal("Incorrect announceType") + } +} + +func TestPeerHandshakeDefaultAllRequests(t *testing.T) { + id := newNodeID(t).ID() + + s := generateLesServer() + + p := peer{ + Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), + version: protocolVersion, + rw: &rwStub{ + ReadHook: func(l keyValueList) keyValueList { + l = l.add("announceType", uint64(announceTypeSigned)) + l = l.add("allowedRequests", uint64(0)) + return l + }, + }, + network: NetworkId, + } + + err := p.Handshake(td, hash, headNum, genesis, s) + if err != nil { + t.Fatal(err) + } + + if p.onlyAnnounce { + t.Fatal("Incorrect announceType") + } +} + +func TestPeerHandshakeServerSendOnlyAnnounceRequestsHeaders(t *testing.T) { + id := newNodeID(t).ID() + + s := generateLesServer() + s.config.UltraLightOnlyAnnounce = true + + p := peer{ + Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), + version: protocolVersion, + rw: &rwStub{ + ReadHook: func(l keyValueList) keyValueList { + l = l.add("announceType", uint64(announceTypeSigned)) + return l + }, + WriteHook: func(l keyValueList) { + for _, v := range l { + if v.Key == "serveHeaders" || + v.Key == "serveChainSince" || + v.Key == "serveStateSince" || + v.Key == "txRelay" { + t.Fatalf("%v exists", v.Key) + } + } + }, + }, + network: NetworkId, + } + + err := p.Handshake(td, hash, headNum, genesis, s) + if err != nil { + t.Fatal(err) + } +} +func TestPeerHandshakeClientReceiveOnlyAnnounceRequestsHeaders(t *testing.T) { + id := newNodeID(t).ID() + + p := peer{ + Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), + version: protocolVersion, + rw: &rwStub{ + ReadHook: func(l keyValueList) keyValueList { + l = l.add("flowControl/BL", uint64(0)) + l = l.add("flowControl/MRR", uint64(0)) + l = l.add("flowControl/MRC", RequestCostList{}) + + l = l.add("announceType", uint64(announceTypeSigned)) + + return l + }, + }, + network: NetworkId, + trusted: true, + } + + err := p.Handshake(td, hash, headNum, genesis, nil) + if err != nil { + t.Fatal(err) + } + + if !p.onlyAnnounce { + t.Fatal("onlyAnnounce must be true") + } +} + +func TestPeerHandshakeClientReturnErrorOnUselessPeer(t *testing.T) { + id := newNodeID(t).ID() + + p := peer{ + Peer: p2p.NewPeer(id, "test peer", []p2p.Cap{}), + version: protocolVersion, + rw: &rwStub{ + ReadHook: func(l keyValueList) keyValueList { + l = l.add("flowControl/BL", uint64(0)) + l = l.add("flowControl/MRR", uint64(0)) + l = l.add("flowControl/MRC", RequestCostList{}) + l = l.add("announceType", uint64(announceTypeSigned)) + return l + }, + }, + network: NetworkId, + } + + err := p.Handshake(td, hash, headNum, genesis, nil) + if err == nil { + t.FailNow() + } +} + +func generateLesServer() *LesServer { + s := &LesServer{ + lesCommons: lesCommons{ + config: ð.Config{UltraLightOnlyAnnounce: true}, + }, + defParams: flowcontrol.ServerParams{ + BufLimit: uint64(300000000), + MinRecharge: uint64(50000), + }, + fcManager: flowcontrol.NewClientManager(nil, &mclock.System{}), + } + s.costTracker, _ = newCostTracker(rawdb.NewMemoryDatabase(), s.config) + return s +} + +type rwStub struct { + ReadHook func(l keyValueList) keyValueList + WriteHook func(l keyValueList) +} + +func (s *rwStub) ReadMsg() (p2p.Msg, error) { + payload := keyValueList{} + payload = payload.add("protocolVersion", uint64(protocolVersion)) + payload = payload.add("networkId", uint64(NetworkId)) + payload = payload.add("headTd", td) + payload = payload.add("headHash", hash) + payload = payload.add("headNum", headNum) + payload = payload.add("genesisHash", genesis) + + if s.ReadHook != nil { + payload = s.ReadHook(payload) + } + size, p, err := rlp.EncodeToReader(payload) + if err != nil { + return p2p.Msg{}, err + } + return p2p.Msg{ + Size: uint32(size), + Payload: p, + }, nil +} + +func (s *rwStub) WriteMsg(m p2p.Msg) error { + recvList := keyValueList{} + if err := m.Decode(&recvList); err != nil { + return err + } + if s.WriteHook != nil { + s.WriteHook(recvList) + } + return nil +} diff --git a/les/protocol.go b/les/protocol.go index 837ecb8d4fb6..36af88aea6d0 100644 --- a/les/protocol.go +++ b/les/protocol.go @@ -14,7 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package les implements the Light Ethereum Subprotocol. package les import ( @@ -24,29 +23,27 @@ import ( "io" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/rlp" ) // Constants to match up protocol versions and messages const ( - lpv1 = 1 lpv2 = 2 + lpv3 = 3 ) // Supported versions of the les protocol (first is primary) var ( - ClientProtocolVersions = []uint{lpv2, lpv1} - ServerProtocolVersions = []uint{lpv2, lpv1} + ClientProtocolVersions = []uint{lpv2, lpv3} + ServerProtocolVersions = []uint{lpv2, lpv3} AdvertiseProtocolVersions = []uint{lpv2} // clients are searching for the first advertised protocol in the list ) // Number of implemented message corresponding to different protocol versions. -var ProtocolLengths = map[uint]uint64{lpv1: 15, lpv2: 22} +var ProtocolLengths = map[uint]uint64{lpv2: 22, lpv3: 24} const ( NetworkId = 1 @@ -55,7 +52,7 @@ const ( // les protocol message codes const ( - // Protocol messages belonging to LPV1 + // Protocol messages inherited from LPV1 StatusMsg = 0x00 AnnounceMsg = 0x01 GetBlockHeadersMsg = 0x02 @@ -64,14 +61,9 @@ const ( BlockBodiesMsg = 0x05 GetReceiptsMsg = 0x06 ReceiptsMsg = 0x07 - GetProofsV1Msg = 0x08 - ProofsV1Msg = 0x09 GetCodeMsg = 0x0a CodeMsg = 0x0b - SendTxMsg = 0x0c - GetHeaderProofsMsg = 0x0d - HeaderProofsMsg = 0x0e - // Protocol messages belonging to LPV2 + // Protocol messages introduced in LPV2 GetProofsV2Msg = 0x0f ProofsV2Msg = 0x10 GetHelperTrieProofsMsg = 0x11 @@ -79,8 +71,27 @@ const ( SendTxV2Msg = 0x13 GetTxStatusMsg = 0x14 TxStatusMsg = 0x15 + // Protocol messages introduced in LPV3 + StopMsg = 0x16 + ResumeMsg = 0x17 ) +type requestInfo struct { + name string + maxCount uint64 +} + +var requests = map[uint64]requestInfo{ + GetBlockHeadersMsg: {"GetBlockHeaders", MaxHeaderFetch}, + GetBlockBodiesMsg: {"GetBlockBodies", MaxBodyFetch}, + GetReceiptsMsg: {"GetReceipts", MaxReceiptFetch}, + GetCodeMsg: {"GetCode", MaxCodeFetch}, + GetProofsV2Msg: {"GetProofsV2", MaxProofsFetch}, + GetHelperTrieProofsMsg: {"GetHelperTrieProofs", MaxHelperTrieProofsFetch}, + SendTxV2Msg: {"SendTxV2", MaxTxSend}, + GetTxStatusMsg: {"GetTxStatus", MaxTxStatus}, +} + type errCode int const ( @@ -138,6 +149,14 @@ type announceData struct { Update keyValueList } +// sanityCheck verifies that the values are reasonable, as a DoS protection +func (a *announceData) sanityCheck() error { + if tdlen := a.Td.BitLen(); tdlen > 100 { + return fmt.Errorf("too large block TD: bitlen %d", tdlen) + } + return nil +} + // 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}) @@ -146,9 +165,9 @@ func (a *announceData) sign(privKey *ecdsa.PrivateKey) { } // checkSignature verifies if the block announcement has a valid signature by the given pubKey -func (a *announceData) checkSignature(id enode.ID) error { +func (a *announceData) checkSignature(id enode.ID, update keyValueMap) error { var sig []byte - if err := a.Update.decode().get("sign", &sig); err != nil { + if err := update.get("sign", &sig); err != nil { return err } rlp, _ := rlp.EncodeToBytes(announceBlock{a.Hash, a.Number, a.Td}) @@ -216,11 +235,3 @@ func (hn *hashOrNumber) DecodeRLP(s *rlp.Stream) error { type CodeData []struct { Value []byte } - -type proofsData [][]rlp.RawValue - -type txStatus struct { - Status core.TxStatus - Lookup *rawdb.TxLookupEntry `rlp:"nil"` - Error string -} diff --git a/les/randselect.go b/les/randselect.go index 1cc1d3d3e0ea..8efe0c94d397 100644 --- a/les/randselect.go +++ b/les/randselect.go @@ -14,7 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package les implements the Light Ethereum Subprotocol. package les import ( diff --git a/les/request_test.go b/les/request_test.go index a877c2b51cec..8d09703c57ef 100644 --- a/les/request_test.go +++ b/les/request_test.go @@ -21,14 +21,14 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/light" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/light" ) -var testBankSecureTrieKey = secAddr(testBankAddress) +var testBankSecureTrieKey = secAddr(bankAddr) func secAddr(addr common.Address) []byte { return crypto.Keccak256(addr[:]) @@ -36,25 +36,22 @@ func secAddr(addr common.Address) []byte { type accessTestFn func(db ethdb.Database, bhash common.Hash, number uint64) light.OdrRequest -func TestBlockAccessLes1(t *testing.T) { testAccess(t, 1, tfBlockAccess) } - func TestBlockAccessLes2(t *testing.T) { testAccess(t, 2, tfBlockAccess) } +func TestBlockAccessLes3(t *testing.T) { testAccess(t, 3, 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 TestReceiptsAccessLes3(t *testing.T) { testAccess(t, 3, 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 TestTrieEntryAccessLes3(t *testing.T) { testAccess(t, 3, tfTrieEntryAccess) } func tfTrieEntryAccess(db ethdb.Database, bhash common.Hash, number uint64) light.OdrRequest { if number := rawdb.ReadHeaderNumber(db, bhash); number != nil { @@ -63,9 +60,8 @@ func tfTrieEntryAccess(db ethdb.Database, bhash common.Hash, number uint64) ligh return nil } -func TestCodeAccessLes1(t *testing.T) { testAccess(t, 1, tfCodeAccess) } - func TestCodeAccessLes2(t *testing.T) { testAccess(t, 2, tfCodeAccess) } +func TestCodeAccessLes3(t *testing.T) { testAccess(t, 3, tfCodeAccess) } func tfCodeAccess(db ethdb.Database, bhash common.Hash, num uint64) light.OdrRequest { number := rawdb.ReadHeaderNumber(db, bhash) @@ -83,17 +79,25 @@ func tfCodeAccess(db ethdb.Database, bhash common.Hash, num uint64) light.OdrReq func testAccess(t *testing.T, protocol int, fn accessTestFn) { // Assemble the test environment - server, client, tearDown := newClientServerEnv(t, 4, protocol, nil, true) + server, client, tearDown := newClientServerEnv(t, 4, protocol, nil, nil, 0, false, true) defer tearDown() - client.pm.synchronise(client.rPeer) + + client.handler.synchronise(client.peer.peer) + + // Ensure the client has synced all necessary data. + clientHead := client.handler.backend.blockchain.CurrentHeader() + if clientHead.Number.Uint64() != 4 { + t.Fatalf("Failed to sync the chain with server, head: %v", clientHead.Number.Uint64()) + } test := func(expFail uint64) { - for i := uint64(0); i <= server.pm.blockchain.CurrentHeader().Number.Uint64(); i++ { + for i := uint64(0); i <= server.handler.blockchain.CurrentHeader().Number.Uint64(); i++ { bhash := rawdb.ReadCanonicalHash(server.db, i) if req := fn(client.db, bhash, i); req != nil { ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond) - defer cancel() - err := client.pm.odr.Retrieve(ctx, req) + err := client.handler.backend.odr.Retrieve(ctx, req) + cancel() + got := err == nil exp := i < expFail if exp && !got { @@ -105,18 +109,5 @@ func testAccess(t *testing.T, protocol int, fn accessTestFn) { } } } - - // temporarily remove peer to test odr fails - client.peers.Unregister(client.rPeer.id) - time.Sleep(time.Millisecond * 10) // ensure that all peerSetNotify callbacks are executed - // expect retrievals to fail (except genesis block) without a les peer - test(0) - - client.peers.Register(client.rPeer) - time.Sleep(time.Millisecond * 10) // ensure that all peerSetNotify callbacks are executed - client.rPeer.lock.Lock() - client.rPeer.hasBlock = func(common.Hash, uint64, bool) bool { return true } - client.rPeer.lock.Unlock() - // expect all retrievals to pass test(5) } diff --git a/les/retrieve.go b/les/retrieve.go index 13155228b5ef..c806117902ad 100644 --- a/les/retrieve.go +++ b/les/retrieve.go @@ -14,8 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package light implements on-demand retrieval capable state and chain objects -// for the Ethereum Light Client. package les import ( @@ -26,8 +24,8 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/common/mclock" - "github.com/nebulaai/nbai-node/light" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/light" ) var ( @@ -80,8 +78,8 @@ type sentReq struct { // after which delivered is set to true, the validity of the response is sent on the // valid channel and no more responses are accepted. type sentReqToPeer struct { - delivered bool - valid chan bool + delivered, frozen bool + event chan int } // reqPeerEvent is sent by the request-from-peer goroutine (tryRequest) to the @@ -97,6 +95,7 @@ const ( rpHardTimeout rpDeliveredValid rpDeliveredInvalid + rpNotDelivered ) // newRetrieveManager creates the retrieve manager @@ -120,7 +119,7 @@ func (rm *retrieveManager) retrieve(ctx context.Context, reqID uint64, req *dist case <-ctx.Done(): sentReq.stop(ctx.Err()) case <-shutdown: - sentReq.stop(fmt.Errorf("Client is shutting down")) + sentReq.stop(fmt.Errorf("client is shutting down")) } return sentReq.getError() } @@ -151,7 +150,7 @@ func (rm *retrieveManager) sendReq(reqID uint64, req *distReq, val validatorFunc req.request = func(p distPeer) func() { // before actually sending the request, put an entry into the sentTo map r.lock.Lock() - r.sentTo[p] = sentReqToPeer{false, make(chan bool, 1)} + r.sentTo[p] = sentReqToPeer{delivered: false, frozen: false, event: make(chan int, 1)} r.lock.Unlock() return request(p) } @@ -175,6 +174,17 @@ func (rm *retrieveManager) deliver(peer distPeer, msg *Msg) error { return errResp(ErrUnexpectedResponse, "reqID = %v", msg.ReqID) } +// frozen is called by the LES protocol manager when a server has suspended its service and we +// should not expect an answer for the requests already sent there +func (rm *retrieveManager) frozen(peer distPeer) { + rm.lock.RLock() + defer rm.lock.RUnlock() + + for _, req := range rm.sentReqs { + req.frozen(peer) + } +} + // reqStateFn represents a state of the retrieve loop state machine type reqStateFn func() reqStateFn @@ -217,7 +227,7 @@ func (r *sentReq) stateRequesting() reqStateFn { go r.tryRequest() r.lastReqQueued = true return r.stateRequesting - case rpDeliveredInvalid: + case rpDeliveredInvalid, rpNotDelivered: // if it was the last sent request (set to nil by update) then start a new one if !r.lastReqQueued && r.lastReqSentTo == nil { go r.tryRequest() @@ -279,7 +289,7 @@ func (r *sentReq) update(ev reqPeerEvent) { r.reqSrtoCount++ case rpHardTimeout: r.reqSrtoCount-- - case rpDeliveredValid, rpDeliveredInvalid: + case rpDeliveredValid, rpDeliveredInvalid, rpNotDelivered: if ev.peer == r.lastReqSentTo { r.lastReqSentTo = nil } else { @@ -345,12 +355,13 @@ func (r *sentReq) tryRequest() { }() select { - case ok := <-s.valid: - if ok { - r.eventsCh <- reqPeerEvent{rpDeliveredValid, p} - } else { - r.eventsCh <- reqPeerEvent{rpDeliveredInvalid, p} + case event := <-s.event: + if event == rpNotDelivered { + r.lock.Lock() + delete(r.sentTo, p) + r.lock.Unlock() } + r.eventsCh <- reqPeerEvent{event, p} return case <-time.After(softRequestTimeout): srto = true @@ -358,12 +369,13 @@ func (r *sentReq) tryRequest() { } select { - case ok := <-s.valid: - if ok { - r.eventsCh <- reqPeerEvent{rpDeliveredValid, p} - } else { - r.eventsCh <- reqPeerEvent{rpDeliveredInvalid, p} + case event := <-s.event: + if event == rpNotDelivered { + r.lock.Lock() + delete(r.sentTo, p) + r.lock.Unlock() } + r.eventsCh <- reqPeerEvent{event, p} case <-time.After(hardRequestTimeout): hrto = true r.eventsCh <- reqPeerEvent{rpHardTimeout, p} @@ -379,15 +391,37 @@ func (r *sentReq) deliver(peer distPeer, msg *Msg) error { if !ok || s.delivered { return errResp(ErrUnexpectedResponse, "reqID = %v", msg.ReqID) } + if s.frozen { + return nil + } valid := r.validate(peer, msg) == nil - r.sentTo[peer] = sentReqToPeer{true, s.valid} - s.valid <- valid + r.sentTo[peer] = sentReqToPeer{delivered: true, frozen: false, event: s.event} + if valid { + s.event <- rpDeliveredValid + } else { + s.event <- rpDeliveredInvalid + } if !valid { return errResp(ErrInvalidResponse, "reqID = %v", msg.ReqID) } return nil } +// frozen sends a "not delivered" event to the peer event channel belonging to the +// given peer if the request has been sent there, causing the state machine to not +// expect an answer and potentially even send the request to the same peer again +// when canSend allows it. +func (r *sentReq) frozen(peer distPeer) { + r.lock.Lock() + defer r.lock.Unlock() + + s, ok := r.sentTo[peer] + if ok && !s.delivered && !s.frozen { + r.sentTo[peer] = sentReqToPeer{delivered: false, frozen: true, event: s.event} + s.event <- rpNotDelivered + } +} + // stop stops the retrieval process and sets an error code that will be returned // by getError func (r *sentReq) stop(err error) { diff --git a/les/server.go b/les/server.go index b77c19737215..e68903dd81da 100644 --- a/les/server.go +++ b/les/server.go @@ -14,106 +14,163 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package les implements the Light Ethereum Subprotocol. package les import ( "crypto/ecdsa" - "encoding/binary" - "math" - "sync" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/eth" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/les/flowcontrol" - "github.com/nebulaai/nbai-node/light" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/discv5" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/les/flowcontrol" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/discv5" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" ) type LesServer struct { lesCommons - fcManager *flowcontrol.ClientManager // nil if our node is client only - fcCostStats *requestCostStats - defParams *flowcontrol.ServerParams + archiveMode bool // Flag whether the ethereum node runs in archive mode. + handler *serverHandler lesTopics []discv5.Topic privateKey *ecdsa.PrivateKey - quitSync chan struct{} -} -func NewLesServer(eth *eth.Ethereum, config *eth.Config) (*LesServer, error) { - quitSync := make(chan struct{}) - pm, err := NewProtocolManager(eth.BlockChain().Config(), light.DefaultServerIndexerConfig, false, config.NetworkId, eth.EventMux(), eth.Engine(), newPeerSet(), eth.BlockChain(), eth.TxPool(), eth.ChainDb(), nil, nil, nil, quitSync, new(sync.WaitGroup)) - if err != nil { - return nil, err - } + // Flow control and capacity management + fcManager *flowcontrol.ClientManager + costTracker *costTracker + defParams flowcontrol.ServerParams + servingQueue *servingQueue + clientPool *clientPool + minCapacity, maxCapacity, freeCapacity uint64 + threadsIdle int // Request serving threads count when system is idle. + threadsBusy int // Request serving threads count when system is busy(block insertion). +} + +func NewLesServer(e *eth.Ethereum, config *eth.Config) (*LesServer, error) { + // Collect les protocol version information supported by local node. lesTopics := make([]discv5.Topic, len(AdvertiseProtocolVersions)) for i, pv := range AdvertiseProtocolVersions { - lesTopics[i] = lesTopic(eth.BlockChain().Genesis().Hash(), pv) + lesTopics[i] = lesTopic(e.BlockChain().Genesis().Hash(), pv) + } + // Calculate the number of threads used to service the light client + // requests based on the user-specified value. + threads := config.LightServ * 4 / 100 + if threads < 4 { + threads = 4 } - srv := &LesServer{ lesCommons: lesCommons{ + genesis: e.BlockChain().Genesis().Hash(), config: config, - chainDb: eth.ChainDb(), + chainConfig: e.BlockChain().Config(), iConfig: light.DefaultServerIndexerConfig, - chtIndexer: light.NewChtIndexer(eth.ChainDb(), nil, params.CHTFrequencyServer, params.HelperTrieProcessConfirmations), - bloomTrieIndexer: light.NewBloomTrieIndexer(eth.ChainDb(), nil, params.BloomBitsBlocks, params.BloomTrieFrequency), - protocolManager: pm, + chainDb: e.ChainDb(), + peers: newPeerSet(), + chainReader: e.BlockChain(), + chtIndexer: light.NewChtIndexer(e.ChainDb(), nil, params.CHTFrequency, params.HelperTrieProcessConfirmations), + bloomTrieIndexer: light.NewBloomTrieIndexer(e.ChainDb(), nil, params.BloomBitsBlocks, params.BloomTrieFrequency), + closeCh: make(chan struct{}), }, - quitSync: quitSync, - lesTopics: lesTopics, + archiveMode: e.ArchiveMode(), + lesTopics: lesTopics, + fcManager: flowcontrol.NewClientManager(nil, &mclock.System{}), + servingQueue: newServingQueue(int64(time.Millisecond*10), float64(config.LightServ)/100), + threadsBusy: config.LightServ/100 + 1, + threadsIdle: threads, } + srv.handler = newServerHandler(srv, e.BlockChain(), e.ChainDb(), e.TxPool(), e.Synced) + srv.costTracker, srv.minCapacity = newCostTracker(e.ChainDb(), config) + srv.freeCapacity = srv.minCapacity + + // Set up checkpoint oracle. + oracle := config.CheckpointOracle + if oracle == nil { + oracle = params.CheckpointOracles[e.BlockChain().Genesis().Hash()] + } + srv.oracle = newCheckpointOracle(oracle, srv.localCheckpoint) - logger := log.New() - - chtV1SectionCount, _, _ := srv.chtIndexer.Sections() // indexer still uses LES/1 4k section size for backwards server compatibility - chtV2SectionCount := chtV1SectionCount / (params.CHTFrequencyClient / params.CHTFrequencyServer) - 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)*(params.CHTFrequencyClient/params.CHTFrequencyServer) - 1 - chtSectionHead := srv.chtIndexer.SectionHead(chtLastSectionV1) - chtRoot := light.GetChtRoot(pm.chainDb, chtLastSectionV1, chtSectionHead) - logger.Info("Loaded CHT", "section", chtLastSection, "head", chtSectionHead, "root", chtRoot) + // Initialize server capacity management fields. + srv.defParams = flowcontrol.ServerParams{ + BufLimit: srv.freeCapacity * bufLimitRatio, + MinRecharge: srv.freeCapacity, } - bloomTrieSectionCount, _, _ := srv.bloomTrieIndexer.Sections() - if bloomTrieSectionCount != 0 { - bloomTrieLastSection := bloomTrieSectionCount - 1 - bloomTrieSectionHead := srv.bloomTrieIndexer.SectionHead(bloomTrieLastSection) - bloomTrieRoot := light.GetBloomTrieRoot(pm.chainDb, bloomTrieLastSection, bloomTrieSectionHead) - logger.Info("Loaded bloom trie", "section", bloomTrieLastSection, "head", bloomTrieSectionHead, "root", bloomTrieRoot) + // LES flow control tries to more or less guarantee the possibility for the + // clients to send a certain amount of requests at any time and get a quick + // response. Most of the clients want this guarantee but don't actually need + // to send requests most of the time. Our goal is to serve as many clients as + // possible while the actually used server capacity does not exceed the limits + totalRecharge := srv.costTracker.totalRecharge() + srv.maxCapacity = srv.freeCapacity * uint64(srv.config.LightPeers) + if totalRecharge > srv.maxCapacity { + srv.maxCapacity = totalRecharge } - - srv.chtIndexer.Start(eth.BlockChain()) - pm.server = srv - - srv.defParams = &flowcontrol.ServerParams{ - BufLimit: 300000000, - MinRecharge: 50000, + srv.fcManager.SetCapacityLimits(srv.freeCapacity, srv.maxCapacity, srv.freeCapacity*2) + srv.clientPool = newClientPool(srv.chainDb, srv.freeCapacity, mclock.System{}, func(id enode.ID) { go srv.peers.Unregister(peerIdToString(id)) }) + srv.clientPool.setDefaultFactors(priceFactors{0, 1, 1}, priceFactors{0, 1, 1}) + + checkpoint := srv.latestLocalCheckpoint() + if !checkpoint.Empty() { + log.Info("Loaded latest checkpoint", "section", checkpoint.SectionIndex, "head", checkpoint.SectionHead, + "chtroot", checkpoint.CHTRoot, "bloomroot", checkpoint.BloomRoot) } - srv.fcManager = flowcontrol.NewClientManager(uint64(config.LightServ), 10, 1000000000) - srv.fcCostStats = newCostStats(eth.ChainDb()) + srv.chtIndexer.Start(e.BlockChain()) return srv, nil } +func (s *LesServer) APIs() []rpc.API { + return []rpc.API{ + { + Namespace: "les", + Version: "1.0", + Service: NewPrivateLightAPI(&s.lesCommons), + Public: false, + }, + { + Namespace: "les", + Version: "1.0", + Service: NewPrivateLightServerAPI(s), + Public: false, + }, + { + Namespace: "debug", + Version: "1.0", + Service: NewPrivateDebugAPI(s), + Public: false, + }, + } +} + func (s *LesServer) Protocols() []p2p.Protocol { - return s.makeProtocols(ServerProtocolVersions) + ps := s.makeProtocols(ServerProtocolVersions, s.handler.runPeer, func(id enode.ID) interface{} { + if p := s.peers.Peer(peerIdToString(id)); p != nil { + return p.Info() + } + return nil + }) + // Add "les" ENR entries. + for i := range ps { + ps[i].Attributes = []enr.Entry{&lesEntry{}} + } + return ps } // Start starts the LES server func (s *LesServer) Start(srvr *p2p.Server) { - s.protocolManager.Start(s.config.LightPeers) + s.privateKey = srvr.PrivateKey + s.handler.start() + + s.wg.Add(1) + go s.capacityManagement() + if srvr.DiscV5 != nil { for _, topic := range s.lesTopics { topic := topic @@ -122,266 +179,101 @@ func (s *LesServer) Start(srvr *p2p.Server) { logger.Info("Starting topic registration") defer logger.Info("Terminated topic registration") - srvr.DiscV5.RegisterTopic(topic, s.quitSync) + srvr.DiscV5.RegisterTopic(topic, s.closeCh) }() } } - 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() { - <-s.protocolManager.noMorePeers - }() - s.protocolManager.Stop() -} - -type requestCosts struct { - baseCost, reqCost uint64 -} - -type requestCostTable map[uint64]*requestCosts + close(s.closeCh) -type RequestCostList []struct { - MsgCode, BaseCost, ReqCost uint64 -} + // Disconnect existing sessions. + // This also closes the gate for any new registrations on the peer set. + // sessions which are already established but not added to pm.peers yet + // will exit when they try to register. + s.peers.Close() -func (list RequestCostList) decode() requestCostTable { - table := make(requestCostTable) - for _, e := range list { - table[e.MsgCode] = &requestCosts{ - baseCost: e.BaseCost, - reqCost: e.ReqCost, - } - } - return table -} - -type linReg struct { - sumX, sumY, sumXX, sumXY float64 - cnt uint64 -} - -const linRegMaxCnt = 100000 - -func (l *linReg) add(x, y float64) { - if l.cnt >= linRegMaxCnt { - sub := float64(l.cnt+1-linRegMaxCnt) / linRegMaxCnt - l.sumX -= l.sumX * sub - l.sumY -= l.sumY * sub - l.sumXX -= l.sumXX * sub - l.sumXY -= l.sumXY * sub - l.cnt = linRegMaxCnt - 1 - } - l.cnt++ - l.sumX += x - l.sumY += y - l.sumXX += x * x - l.sumXY += x * y -} - -func (l *linReg) calc() (b, m float64) { - if l.cnt == 0 { - return 0, 0 - } - cnt := float64(l.cnt) - d := cnt*l.sumXX - l.sumX*l.sumX - if d < 0.001 { - return l.sumY / cnt, 0 - } - m = (cnt*l.sumXY - l.sumX*l.sumY) / d - b = (l.sumY / cnt) - (m * l.sumX / cnt) - return b, m -} - -func (l *linReg) toBytes() []byte { - var arr [40]byte - binary.BigEndian.PutUint64(arr[0:8], math.Float64bits(l.sumX)) - binary.BigEndian.PutUint64(arr[8:16], math.Float64bits(l.sumY)) - binary.BigEndian.PutUint64(arr[16:24], math.Float64bits(l.sumXX)) - binary.BigEndian.PutUint64(arr[24:32], math.Float64bits(l.sumXY)) - binary.BigEndian.PutUint64(arr[32:40], l.cnt) - return arr[:] -} - -func linRegFromBytes(data []byte) *linReg { - if len(data) != 40 { - return nil - } - l := &linReg{} - l.sumX = math.Float64frombits(binary.BigEndian.Uint64(data[0:8])) - l.sumY = math.Float64frombits(binary.BigEndian.Uint64(data[8:16])) - l.sumXX = math.Float64frombits(binary.BigEndian.Uint64(data[16:24])) - l.sumXY = math.Float64frombits(binary.BigEndian.Uint64(data[24:32])) - l.cnt = binary.BigEndian.Uint64(data[32:40]) - return l -} - -type requestCostStats struct { - lock sync.RWMutex - db ethdb.Database - stats map[uint64]*linReg -} + s.fcManager.Stop() + s.costTracker.stop() + s.handler.stop() + s.clientPool.stop() // client pool should be closed after handler. + s.servingQueue.stop() -type requestCostStatsRlp []struct { - MsgCode uint64 - Data []byte + // Note, bloom trie indexer is closed by parent bloombits indexer. + s.chtIndexer.Close() + s.wg.Wait() + log.Info("Les server stopped") } -var rcStatsKey = []byte("_requestCostStats") - -func newCostStats(db ethdb.Database) *requestCostStats { - stats := make(map[uint64]*linReg) - for _, code := range reqList { - stats[code] = &linReg{cnt: 100} - } - - if db != nil { - data, err := db.Get(rcStatsKey) - var statsRlp requestCostStatsRlp - if err == nil { - err = rlp.DecodeBytes(data, &statsRlp) - } - if err == nil { - for _, r := range statsRlp { - if stats[r.MsgCode] != nil { - if l := linRegFromBytes(r.Data); l != nil { - stats[r.MsgCode] = l - } - } - } - } - } - - return &requestCostStats{ - db: db, - stats: stats, - } +func (s *LesServer) SetBloomBitsIndexer(bloomIndexer *core.ChainIndexer) { + bloomIndexer.AddChildIndexer(s.bloomTrieIndexer) } -func (s *requestCostStats) store() { - s.lock.Lock() - defer s.lock.Unlock() - - statsRlp := make(requestCostStatsRlp, len(reqList)) - for i, code := range reqList { - statsRlp[i].MsgCode = code - statsRlp[i].Data = s.stats[code].toBytes() - } - - if data, err := rlp.EncodeToBytes(statsRlp); err == nil { - s.db.Put(rcStatsKey, data) +// SetClient sets the rpc client and starts running checkpoint contract if it is not yet watched. +func (s *LesServer) SetContractBackend(backend bind.ContractBackend) { + if s.oracle == nil { + return } + s.oracle.start(backend) } -func (s *requestCostStats) getCurrentList() RequestCostList { - s.lock.Lock() - defer s.lock.Unlock() - - list := make(RequestCostList, len(reqList)) - //fmt.Println("RequestCostList") - for idx, code := range reqList { - b, m := s.stats[code].calc() - //fmt.Println(code, s.stats[code].cnt, b/1000000, m/1000000) - if m < 0 { - b += m - m = 0 - } - if b < 0 { - b = 0 +// capacityManagement starts an event handler loop that updates the recharge curve of +// the client manager and adjusts the client pool's size according to the total +// capacity updates coming from the client manager +func (s *LesServer) capacityManagement() { + defer s.wg.Done() + + processCh := make(chan bool, 100) + sub := s.handler.blockchain.SubscribeBlockProcessingEvent(processCh) + defer sub.Unsubscribe() + + totalRechargeCh := make(chan uint64, 100) + totalRecharge := s.costTracker.subscribeTotalRecharge(totalRechargeCh) + + totalCapacityCh := make(chan uint64, 100) + totalCapacity := s.fcManager.SubscribeTotalCapacity(totalCapacityCh) + s.clientPool.setLimits(s.config.LightPeers, totalCapacity) + + var ( + busy bool + freePeers uint64 + blockProcess mclock.AbsTime + ) + updateRecharge := func() { + if busy { + s.servingQueue.setThreads(s.threadsBusy) + s.fcManager.SetRechargeCurve(flowcontrol.PieceWiseLinear{{0, 0}, {totalRecharge, totalRecharge}}) + } else { + s.servingQueue.setThreads(s.threadsIdle) + s.fcManager.SetRechargeCurve(flowcontrol.PieceWiseLinear{{0, 0}, {totalRecharge / 10, totalRecharge}, {totalRecharge, totalRecharge}}) } - - list[idx].MsgCode = code - list[idx].BaseCost = uint64(b * 2) - list[idx].ReqCost = uint64(m * 2) - } - return list -} - -func (s *requestCostStats) update(msgCode, reqCnt, cost uint64) { - s.lock.Lock() - defer s.lock.Unlock() - - c, ok := s.stats[msgCode] - if !ok || reqCnt == 0 { - return } - c.add(float64(reqCnt), float64(cost)) -} - -func (pm *ProtocolManager) blockLoop() { - pm.wg.Add(1) - headCh := make(chan core.ChainHeadEvent, 10) - headSub := pm.blockchain.SubscribeChainHeadEvent(headCh) - go func() { - var lastHead *types.Header - lastBroadcastTd := common.Big0 - for { - select { - case ev := <-headCh: - peers := pm.peers.AllPeers() - if len(peers) > 0 { - header := ev.Block.Header() - hash := header.Hash() - number := header.Number.Uint64() - td := rawdb.ReadTd(pm.chainDb, hash, number) - if td != nil && td.Cmp(lastBroadcastTd) > 0 { - var reorg uint64 - if lastHead != nil { - reorg = lastHead.Number.Uint64() - rawdb.FindCommonAncestor(pm.chainDb, header, lastHead).Number.Uint64() - } - lastHead = header - lastBroadcastTd = td - - 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 { - 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) - } - } - } - } - } - case <-pm.quitSync: - headSub.Unsubscribe() - pm.wg.Done() - return + updateRecharge() + + for { + select { + case busy = <-processCh: + if busy { + blockProcess = mclock.Now() + } else { + blockProcessingTimer.Update(time.Duration(mclock.Now() - blockProcess)) } + updateRecharge() + case totalRecharge = <-totalRechargeCh: + totalRechargeGauge.Update(int64(totalRecharge)) + updateRecharge() + case totalCapacity = <-totalCapacityCh: + totalCapacityGauge.Update(int64(totalCapacity)) + newFreePeers := totalCapacity / s.freeCapacity + if newFreePeers < freePeers && newFreePeers < uint64(s.config.LightPeers) { + log.Warn("Reduced free peer connections", "from", freePeers, "to", newFreePeers) + } + freePeers = newFreePeers + s.clientPool.setLimits(s.config.LightPeers, totalCapacity) + case <-s.closeCh: + return } - }() + } } diff --git a/les/server_handler.go b/les/server_handler.go new file mode 100644 index 000000000000..16249ef1ba27 --- /dev/null +++ b/les/server_handler.go @@ -0,0 +1,950 @@ +// Copyright 2019 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 ( + "encoding/binary" + "encoding/json" + "errors" + "sync" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" +) + +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 + 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 + MaxHelperTrieProofsFetch = 64 // Amount of helper tries 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 +) + +var ( + errTooManyInvalidRequest = errors.New("too many invalid requests made") + errFullClientPool = errors.New("client pool is full") +) + +// serverHandler is responsible for serving light client and process +// all incoming light requests. +type serverHandler struct { + blockchain *core.BlockChain + chainDb ethdb.Database + txpool *core.TxPool + server *LesServer + + closeCh chan struct{} // Channel used to exit all background routines of handler. + wg sync.WaitGroup // WaitGroup used to track all background routines of handler. + synced func() bool // Callback function used to determine whether local node is synced. + + // Testing fields + addTxsSync bool +} + +func newServerHandler(server *LesServer, blockchain *core.BlockChain, chainDb ethdb.Database, txpool *core.TxPool, synced func() bool) *serverHandler { + handler := &serverHandler{ + server: server, + blockchain: blockchain, + chainDb: chainDb, + txpool: txpool, + closeCh: make(chan struct{}), + synced: synced, + } + return handler +} + +// start starts the server handler. +func (h *serverHandler) start() { + h.wg.Add(1) + go h.broadcastHeaders() +} + +// stop stops the server handler. +func (h *serverHandler) stop() { + close(h.closeCh) + h.wg.Wait() +} + +// runPeer is the p2p protocol run function for the given version. +func (h *serverHandler) runPeer(version uint, p *p2p.Peer, rw p2p.MsgReadWriter) error { + peer := newPeer(int(version), h.server.config.NetworkId, false, p, newMeteredMsgWriter(rw, int(version))) + h.wg.Add(1) + defer h.wg.Done() + return h.handle(peer) +} + +func (h *serverHandler) handle(p *peer) error { + // Reject light clients if server is not synced. + if !h.synced() { + return p2p.DiscRequested + } + p.Log().Debug("Light Ethereum peer connected", "name", p.Name()) + + // Execute the LES handshake + var ( + head = h.blockchain.CurrentHeader() + hash = head.Hash() + number = head.Number.Uint64() + td = h.blockchain.GetTd(hash, number) + ) + if err := p.Handshake(td, hash, number, h.blockchain.Genesis().Hash(), h.server); err != nil { + p.Log().Debug("Light Ethereum handshake failed", "err", err) + return err + } + defer p.fcClient.Disconnect() + + // Disconnect the inbound peer if it's rejected by clientPool + if !h.server.clientPool.connect(p, 0) { + p.Log().Debug("Light Ethereum peer registration failed", "err", errFullClientPool) + return errFullClientPool + } + // Register the peer locally + if err := h.server.peers.Register(p); err != nil { + h.server.clientPool.disconnect(p) + p.Log().Error("Light Ethereum peer registration failed", "err", err) + return err + } + clientConnectionGauge.Update(int64(h.server.peers.Len())) + + var wg sync.WaitGroup // Wait group used to track all in-flight task routines. + + connectedAt := mclock.Now() + defer func() { + wg.Wait() // Ensure all background task routines have exited. + h.server.peers.Unregister(p.id) + h.server.clientPool.disconnect(p) + clientConnectionGauge.Update(int64(h.server.peers.Len())) + connectionTimer.Update(time.Duration(mclock.Now() - connectedAt)) + }() + + // Spawn a main loop to handle all incoming messages. + for { + select { + case err := <-p.errCh: + p.Log().Debug("Failed to send light ethereum response", "err", err) + return err + default: + } + if err := h.handleMsg(p, &wg); err != nil { + p.Log().Debug("Light Ethereum message handling failed", "err", err) + return err + } + } +} + +// handleMsg is invoked whenever an inbound message is received from a remote +// peer. The remote connection is torn down upon returning any error. +func (h *serverHandler) handleMsg(p *peer, wg *sync.WaitGroup) error { + // Read the next message from the remote peer, and ensure it's fully consumed + msg, err := p.rw.ReadMsg() + if err != nil { + return err + } + p.Log().Trace("Light Ethereum message arrived", "code", msg.Code, "bytes", msg.Size) + + // Discard large message which exceeds the limitation. + if msg.Size > ProtocolMaxMsgSize { + clientErrorMeter.Mark(1) + return errResp(ErrMsgTooLarge, "%v > %v", msg.Size, ProtocolMaxMsgSize) + } + defer msg.Discard() + + var ( + maxCost uint64 + task *servingTask + ) + p.responseCount++ + responseCount := p.responseCount + // accept returns an indicator whether the request can be served. + // If so, deduct the max cost from the flow control buffer. + accept := func(reqID, reqCnt, maxCnt uint64) bool { + // Short circuit if the peer is already frozen or the request is invalid. + inSizeCost := h.server.costTracker.realCost(0, msg.Size, 0) + if p.isFrozen() || reqCnt == 0 || reqCnt > maxCnt { + p.fcClient.OneTimeCost(inSizeCost) + return false + } + // Prepaid max cost units before request been serving. + maxCost = p.fcCosts.getMaxCost(msg.Code, reqCnt) + accepted, bufShort, priority := p.fcClient.AcceptRequest(reqID, responseCount, maxCost) + if !accepted { + p.freezeClient() + p.Log().Error("Request came too early", "remaining", common.PrettyDuration(time.Duration(bufShort*1000000/p.fcParams.MinRecharge))) + p.fcClient.OneTimeCost(inSizeCost) + return false + } + // Create a multi-stage task, estimate the time it takes for the task to + // execute, and cache it in the request service queue. + factor := h.server.costTracker.globalFactor() + if factor < 0.001 { + factor = 1 + p.Log().Error("Invalid global cost factor", "factor", factor) + } + maxTime := uint64(float64(maxCost) / factor) + task = h.server.servingQueue.newTask(p, maxTime, priority) + if task.start() { + return true + } + p.fcClient.RequestProcessed(reqID, responseCount, maxCost, inSizeCost) + return false + } + // sendResponse sends back the response and updates the flow control statistic. + sendResponse := func(reqID, amount uint64, reply *reply, servingTime uint64) { + p.responseLock.Lock() + defer p.responseLock.Unlock() + + // Short circuit if the client is already frozen. + if p.isFrozen() { + realCost := h.server.costTracker.realCost(servingTime, msg.Size, 0) + p.fcClient.RequestProcessed(reqID, responseCount, maxCost, realCost) + return + } + // Positive correction buffer value with real cost. + var replySize uint32 + if reply != nil { + replySize = reply.size() + } + var realCost uint64 + if h.server.costTracker.testing { + realCost = maxCost // Assign a fake cost for testing purpose + } else { + realCost = h.server.costTracker.realCost(servingTime, msg.Size, replySize) + } + bv := p.fcClient.RequestProcessed(reqID, responseCount, maxCost, realCost) + if amount != 0 { + // Feed cost tracker request serving statistic. + h.server.costTracker.updateStats(msg.Code, amount, servingTime, realCost) + // Reduce priority "balance" for the specific peer. + h.server.clientPool.requestCost(p, realCost) + } + if reply != nil { + p.queueSend(func() { + if err := reply.send(bv); err != nil { + select { + case p.errCh <- err: + default: + } + } + }) + } + } + switch msg.Code { + case GetBlockHeadersMsg: + p.Log().Trace("Received block header request") + if metrics.EnabledExpensive { + miscInHeaderPacketsMeter.Mark(1) + miscInHeaderTrafficMeter.Mark(int64(msg.Size)) + defer func(start time.Time) { miscServingTimeHeaderTimer.UpdateSince(start) }(time.Now()) + } + var req struct { + ReqID uint64 + Query getBlockHeadersData + } + if err := msg.Decode(&req); err != nil { + clientErrorMeter.Mark(1) + return errResp(ErrDecode, "%v: %v", msg, err) + } + query := req.Query + if accept(req.ReqID, query.Amount, MaxHeaderFetch) { + wg.Add(1) + go func() { + defer wg.Done() + hashMode := query.Origin.Hash != (common.Hash{}) + first := true + maxNonCanonical := uint64(100) + + // Gather headers until the fetch or network limits is reached + var ( + bytes common.StorageSize + headers []*types.Header + unknown bool + ) + for !unknown && len(headers) < int(query.Amount) && bytes < softResponseLimit { + if !first && !task.waitOrStop() { + sendResponse(req.ReqID, 0, nil, task.servingTime) + return + } + // Retrieve the next header satisfying the query + var origin *types.Header + if hashMode { + if first { + origin = h.blockchain.GetHeaderByHash(query.Origin.Hash) + if origin != nil { + query.Origin.Number = origin.Number.Uint64() + } + } else { + origin = h.blockchain.GetHeader(query.Origin.Hash, query.Origin.Number) + } + } else { + origin = h.blockchain.GetHeaderByNumber(query.Origin.Number) + } + if origin == nil { + atomic.AddUint32(&p.invalidCount, 1) + break + } + headers = append(headers, origin) + bytes += estHeaderRlpSize + + // Advance to the next header of the query + switch { + case hashMode && query.Reverse: + // Hash based traversal towards the genesis block + ancestor := query.Skip + 1 + if ancestor == 0 { + unknown = true + } else { + query.Origin.Hash, query.Origin.Number = h.blockchain.GetAncestor(query.Origin.Hash, query.Origin.Number, ancestor, &maxNonCanonical) + unknown = query.Origin.Hash == common.Hash{} + } + case hashMode && !query.Reverse: + // Hash based traversal towards the leaf block + var ( + current = origin.Number.Uint64() + next = current + query.Skip + 1 + ) + if next <= current { + infos, _ := json.MarshalIndent(p.Peer.Info(), "", " ") + p.Log().Warn("GetBlockHeaders skip overflow attack", "current", current, "skip", query.Skip, "next", next, "attacker", infos) + unknown = true + } else { + if header := h.blockchain.GetHeaderByNumber(next); header != nil { + nextHash := header.Hash() + expOldHash, _ := h.blockchain.GetAncestor(nextHash, next, query.Skip+1, &maxNonCanonical) + if expOldHash == query.Origin.Hash { + query.Origin.Hash, query.Origin.Number = nextHash, next + } else { + unknown = true + } + } else { + unknown = true + } + } + case query.Reverse: + // Number based traversal towards the genesis block + if query.Origin.Number >= query.Skip+1 { + query.Origin.Number -= query.Skip + 1 + } else { + unknown = true + } + + case !query.Reverse: + // Number based traversal towards the leaf block + query.Origin.Number += query.Skip + 1 + } + first = false + } + reply := p.ReplyBlockHeaders(req.ReqID, headers) + sendResponse(req.ReqID, query.Amount, p.ReplyBlockHeaders(req.ReqID, headers), task.done()) + if metrics.EnabledExpensive { + miscOutHeaderPacketsMeter.Mark(1) + miscOutHeaderTrafficMeter.Mark(int64(reply.size())) + } + }() + } + + case GetBlockBodiesMsg: + p.Log().Trace("Received block bodies request") + if metrics.EnabledExpensive { + miscInBodyPacketsMeter.Mark(1) + miscInBodyTrafficMeter.Mark(int64(msg.Size)) + defer func(start time.Time) { miscServingTimeBodyTimer.UpdateSince(start) }(time.Now()) + } + var req struct { + ReqID uint64 + Hashes []common.Hash + } + if err := msg.Decode(&req); err != nil { + clientErrorMeter.Mark(1) + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + var ( + bytes int + bodies []rlp.RawValue + ) + reqCnt := len(req.Hashes) + if accept(req.ReqID, uint64(reqCnt), MaxBodyFetch) { + wg.Add(1) + go func() { + defer wg.Done() + for i, hash := range req.Hashes { + if i != 0 && !task.waitOrStop() { + sendResponse(req.ReqID, 0, nil, task.servingTime) + return + } + if bytes >= softResponseLimit { + break + } + body := h.blockchain.GetBodyRLP(hash) + if body == nil { + atomic.AddUint32(&p.invalidCount, 1) + continue + } + bodies = append(bodies, body) + bytes += len(body) + } + reply := p.ReplyBlockBodiesRLP(req.ReqID, bodies) + sendResponse(req.ReqID, uint64(reqCnt), reply, task.done()) + if metrics.EnabledExpensive { + miscOutBodyPacketsMeter.Mark(1) + miscOutBodyTrafficMeter.Mark(int64(reply.size())) + } + }() + } + + case GetCodeMsg: + p.Log().Trace("Received code request") + if metrics.EnabledExpensive { + miscInCodePacketsMeter.Mark(1) + miscInCodeTrafficMeter.Mark(int64(msg.Size)) + defer func(start time.Time) { miscServingTimeCodeTimer.UpdateSince(start) }(time.Now()) + } + var req struct { + ReqID uint64 + Reqs []CodeReq + } + if err := msg.Decode(&req); err != nil { + clientErrorMeter.Mark(1) + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + var ( + bytes int + data [][]byte + ) + reqCnt := len(req.Reqs) + if accept(req.ReqID, uint64(reqCnt), MaxCodeFetch) { + wg.Add(1) + go func() { + defer wg.Done() + for i, request := range req.Reqs { + if i != 0 && !task.waitOrStop() { + sendResponse(req.ReqID, 0, nil, task.servingTime) + return + } + // Look up the root hash belonging to the request + header := h.blockchain.GetHeaderByHash(request.BHash) + if header == nil { + p.Log().Warn("Failed to retrieve associate header for code", "hash", request.BHash) + atomic.AddUint32(&p.invalidCount, 1) + continue + } + // Refuse to search stale state data in the database since looking for + // a non-exist key is kind of expensive. + local := h.blockchain.CurrentHeader().Number.Uint64() + if !h.server.archiveMode && header.Number.Uint64()+core.TriesInMemory <= local { + p.Log().Debug("Reject stale code request", "number", header.Number.Uint64(), "head", local) + atomic.AddUint32(&p.invalidCount, 1) + continue + } + triedb := h.blockchain.StateCache().TrieDB() + + account, err := h.getAccount(triedb, header.Root, common.BytesToHash(request.AccKey)) + if err != nil { + p.Log().Warn("Failed to retrieve account for code", "block", header.Number, "hash", header.Hash(), "account", common.BytesToHash(request.AccKey), "err", err) + atomic.AddUint32(&p.invalidCount, 1) + continue + } + code, err := triedb.Node(common.BytesToHash(account.CodeHash)) + if err != nil { + p.Log().Warn("Failed to retrieve account code", "block", header.Number, "hash", header.Hash(), "account", common.BytesToHash(request.AccKey), "codehash", common.BytesToHash(account.CodeHash), "err", err) + continue + } + // Accumulate the code and abort if enough data was retrieved + data = append(data, code) + if bytes += len(code); bytes >= softResponseLimit { + break + } + } + reply := p.ReplyCode(req.ReqID, data) + sendResponse(req.ReqID, uint64(reqCnt), reply, task.done()) + if metrics.EnabledExpensive { + miscOutCodePacketsMeter.Mark(1) + miscOutCodeTrafficMeter.Mark(int64(reply.size())) + } + }() + } + + case GetReceiptsMsg: + p.Log().Trace("Received receipts request") + if metrics.EnabledExpensive { + miscInReceiptPacketsMeter.Mark(1) + miscInReceiptTrafficMeter.Mark(int64(msg.Size)) + defer func(start time.Time) { miscServingTimeReceiptTimer.UpdateSince(start) }(time.Now()) + } + var req struct { + ReqID uint64 + Hashes []common.Hash + } + if err := msg.Decode(&req); err != nil { + clientErrorMeter.Mark(1) + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + var ( + bytes int + receipts []rlp.RawValue + ) + reqCnt := len(req.Hashes) + if accept(req.ReqID, uint64(reqCnt), MaxReceiptFetch) { + wg.Add(1) + go func() { + defer wg.Done() + for i, hash := range req.Hashes { + if i != 0 && !task.waitOrStop() { + sendResponse(req.ReqID, 0, nil, task.servingTime) + return + } + if bytes >= softResponseLimit { + break + } + // Retrieve the requested block's receipts, skipping if unknown to us + results := h.blockchain.GetReceiptsByHash(hash) + if results == nil { + if header := h.blockchain.GetHeaderByHash(hash); header == nil || header.ReceiptHash != types.EmptyRootHash { + atomic.AddUint32(&p.invalidCount, 1) + continue + } + } + // If known, encode and queue for response packet + if encoded, err := rlp.EncodeToBytes(results); err != nil { + log.Error("Failed to encode receipt", "err", err) + } else { + receipts = append(receipts, encoded) + bytes += len(encoded) + } + } + reply := p.ReplyReceiptsRLP(req.ReqID, receipts) + sendResponse(req.ReqID, uint64(reqCnt), reply, task.done()) + if metrics.EnabledExpensive { + miscOutReceiptPacketsMeter.Mark(1) + miscOutReceiptTrafficMeter.Mark(int64(reply.size())) + } + }() + } + + case GetProofsV2Msg: + p.Log().Trace("Received les/2 proofs request") + if metrics.EnabledExpensive { + miscInTrieProofPacketsMeter.Mark(1) + miscInTrieProofTrafficMeter.Mark(int64(msg.Size)) + defer func(start time.Time) { miscServingTimeTrieProofTimer.UpdateSince(start) }(time.Now()) + } + var req struct { + ReqID uint64 + Reqs []ProofReq + } + if err := msg.Decode(&req); err != nil { + clientErrorMeter.Mark(1) + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + // Gather state data until the fetch or network limits is reached + var ( + lastBHash common.Hash + root common.Hash + ) + reqCnt := len(req.Reqs) + if accept(req.ReqID, uint64(reqCnt), MaxProofsFetch) { + wg.Add(1) + go func() { + defer wg.Done() + nodes := light.NewNodeSet() + + for i, request := range req.Reqs { + if i != 0 && !task.waitOrStop() { + sendResponse(req.ReqID, 0, nil, task.servingTime) + return + } + // Look up the root hash belonging to the request + var ( + header *types.Header + trie state.Trie + ) + if request.BHash != lastBHash { + root, lastBHash = common.Hash{}, request.BHash + + if header = h.blockchain.GetHeaderByHash(request.BHash); header == nil { + p.Log().Warn("Failed to retrieve header for proof", "hash", request.BHash) + atomic.AddUint32(&p.invalidCount, 1) + continue + } + // Refuse to search stale state data in the database since looking for + // a non-exist key is kind of expensive. + local := h.blockchain.CurrentHeader().Number.Uint64() + if !h.server.archiveMode && header.Number.Uint64()+core.TriesInMemory <= local { + p.Log().Debug("Reject stale trie request", "number", header.Number.Uint64(), "head", local) + atomic.AddUint32(&p.invalidCount, 1) + continue + } + root = header.Root + } + // If a header lookup failed (non existent), ignore subsequent requests for the same header + if root == (common.Hash{}) { + atomic.AddUint32(&p.invalidCount, 1) + continue + } + // Open the account or storage trie for the request + statedb := h.blockchain.StateCache() + + switch len(request.AccKey) { + case 0: + // No account key specified, open an account trie + trie, err = statedb.OpenTrie(root) + if trie == nil || err != nil { + p.Log().Warn("Failed to open storage trie for proof", "block", header.Number, "hash", header.Hash(), "root", root, "err", err) + continue + } + default: + // Account key specified, open a storage trie + account, err := h.getAccount(statedb.TrieDB(), root, common.BytesToHash(request.AccKey)) + if err != nil { + p.Log().Warn("Failed to retrieve account for proof", "block", header.Number, "hash", header.Hash(), "account", common.BytesToHash(request.AccKey), "err", err) + atomic.AddUint32(&p.invalidCount, 1) + continue + } + trie, err = statedb.OpenStorageTrie(common.BytesToHash(request.AccKey), account.Root) + if trie == nil || err != nil { + p.Log().Warn("Failed to open storage trie for proof", "block", header.Number, "hash", header.Hash(), "account", common.BytesToHash(request.AccKey), "root", account.Root, "err", err) + continue + } + } + // Prove the user's request from the account or stroage trie + if err := trie.Prove(request.Key, request.FromLevel, nodes); err != nil { + p.Log().Warn("Failed to prove state request", "block", header.Number, "hash", header.Hash(), "err", err) + continue + } + if nodes.DataSize() >= softResponseLimit { + break + } + } + reply := p.ReplyProofsV2(req.ReqID, nodes.NodeList()) + sendResponse(req.ReqID, uint64(reqCnt), reply, task.done()) + if metrics.EnabledExpensive { + miscOutTrieProofPacketsMeter.Mark(1) + miscOutTrieProofTrafficMeter.Mark(int64(reply.size())) + } + }() + } + + case GetHelperTrieProofsMsg: + p.Log().Trace("Received helper trie proof request") + if metrics.EnabledExpensive { + miscInHelperTriePacketsMeter.Mark(1) + miscInHelperTrieTrafficMeter.Mark(int64(msg.Size)) + defer func(start time.Time) { miscServingTimeHelperTrieTimer.UpdateSince(start) }(time.Now()) + } + var req struct { + ReqID uint64 + Reqs []HelperTrieReq + } + if err := msg.Decode(&req); err != nil { + clientErrorMeter.Mark(1) + 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 accept(req.ReqID, uint64(reqCnt), MaxHelperTrieProofsFetch) { + wg.Add(1) + go func() { + defer wg.Done() + var ( + lastIdx uint64 + lastType uint + root common.Hash + auxTrie *trie.Trie + ) + nodes := light.NewNodeSet() + for i, request := range req.Reqs { + if i != 0 && !task.waitOrStop() { + sendResponse(req.ReqID, 0, nil, task.servingTime) + return + } + if auxTrie == nil || request.Type != lastType || request.TrieIdx != lastIdx { + auxTrie, lastType, lastIdx = nil, request.Type, request.TrieIdx + + var prefix string + if root, prefix = h.getHelperTrie(request.Type, request.TrieIdx); root != (common.Hash{}) { + auxTrie, _ = trie.New(root, trie.NewDatabase(rawdb.NewTable(h.chainDb, prefix))) + } + } + if request.AuxReq == auxRoot { + var data []byte + if root != (common.Hash{}) { + data = root[:] + } + auxData = append(auxData, data) + auxBytes += len(data) + } else { + if auxTrie != nil { + auxTrie.Prove(request.Key, request.FromLevel, nodes) + } + if request.AuxReq != 0 { + data := h.getAuxiliaryHeaders(request) + auxData = append(auxData, data) + auxBytes += len(data) + } + } + if nodes.DataSize()+auxBytes >= softResponseLimit { + break + } + } + reply := p.ReplyHelperTrieProofs(req.ReqID, HelperTrieResps{Proofs: nodes.NodeList(), AuxData: auxData}) + sendResponse(req.ReqID, uint64(reqCnt), reply, task.done()) + if metrics.EnabledExpensive { + miscOutHelperTriePacketsMeter.Mark(1) + miscOutHelperTrieTrafficMeter.Mark(int64(reply.size())) + } + }() + } + + case SendTxV2Msg: + p.Log().Trace("Received new transactions") + if metrics.EnabledExpensive { + miscInTxsPacketsMeter.Mark(1) + miscInTxsTrafficMeter.Mark(int64(msg.Size)) + defer func(start time.Time) { miscServingTimeTxTimer.UpdateSince(start) }(time.Now()) + } + var req struct { + ReqID uint64 + Txs []*types.Transaction + } + if err := msg.Decode(&req); err != nil { + clientErrorMeter.Mark(1) + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + reqCnt := len(req.Txs) + if accept(req.ReqID, uint64(reqCnt), MaxTxSend) { + wg.Add(1) + go func() { + defer wg.Done() + stats := make([]light.TxStatus, len(req.Txs)) + for i, tx := range req.Txs { + if i != 0 && !task.waitOrStop() { + return + } + hash := tx.Hash() + stats[i] = h.txStatus(hash) + if stats[i].Status == core.TxStatusUnknown { + addFn := h.txpool.AddRemotes + // Add txs synchronously for testing purpose + if h.addTxsSync { + addFn = h.txpool.AddRemotesSync + } + if errs := addFn([]*types.Transaction{tx}); errs[0] != nil { + stats[i].Error = errs[0].Error() + continue + } + stats[i] = h.txStatus(hash) + } + } + reply := p.ReplyTxStatus(req.ReqID, stats) + sendResponse(req.ReqID, uint64(reqCnt), reply, task.done()) + if metrics.EnabledExpensive { + miscOutTxsPacketsMeter.Mark(1) + miscOutTxsTrafficMeter.Mark(int64(reply.size())) + } + }() + } + + case GetTxStatusMsg: + p.Log().Trace("Received transaction status query request") + if metrics.EnabledExpensive { + miscInTxStatusPacketsMeter.Mark(1) + miscInTxStatusTrafficMeter.Mark(int64(msg.Size)) + defer func(start time.Time) { miscServingTimeTxStatusTimer.UpdateSince(start) }(time.Now()) + } + var req struct { + ReqID uint64 + Hashes []common.Hash + } + if err := msg.Decode(&req); err != nil { + clientErrorMeter.Mark(1) + return errResp(ErrDecode, "msg %v: %v", msg, err) + } + reqCnt := len(req.Hashes) + if accept(req.ReqID, uint64(reqCnt), MaxTxStatus) { + wg.Add(1) + go func() { + defer wg.Done() + stats := make([]light.TxStatus, len(req.Hashes)) + for i, hash := range req.Hashes { + if i != 0 && !task.waitOrStop() { + sendResponse(req.ReqID, 0, nil, task.servingTime) + return + } + stats[i] = h.txStatus(hash) + } + reply := p.ReplyTxStatus(req.ReqID, stats) + sendResponse(req.ReqID, uint64(reqCnt), reply, task.done()) + if metrics.EnabledExpensive { + miscOutTxStatusPacketsMeter.Mark(1) + miscOutTxStatusTrafficMeter.Mark(int64(reply.size())) + } + }() + } + + default: + p.Log().Trace("Received invalid message", "code", msg.Code) + clientErrorMeter.Mark(1) + return errResp(ErrInvalidMsgCode, "%v", msg.Code) + } + // If the client has made too much invalid request(e.g. request a non-exist data), + // reject them to prevent SPAM attack. + if atomic.LoadUint32(&p.invalidCount) > maxRequestErrors { + clientErrorMeter.Mark(1) + return errTooManyInvalidRequest + } + return nil +} + +// getAccount retrieves an account from the state based on root. +func (h *serverHandler) getAccount(triedb *trie.Database, root, hash common.Hash) (state.Account, error) { + trie, err := trie.New(root, triedb) + if err != nil { + return state.Account{}, err + } + blob, err := trie.TryGet(hash[:]) + if err != nil { + return state.Account{}, err + } + var account state.Account + if err = rlp.DecodeBytes(blob, &account); err != nil { + return state.Account{}, err + } + return account, nil +} + +// getHelperTrie returns the post-processed trie root for the given trie ID and section index +func (h *serverHandler) getHelperTrie(typ uint, index uint64) (common.Hash, string) { + switch typ { + case htCanonical: + sectionHead := rawdb.ReadCanonicalHash(h.chainDb, (index+1)*h.server.iConfig.ChtSize-1) + return light.GetChtRoot(h.chainDb, index, sectionHead), light.ChtTablePrefix + case htBloomBits: + sectionHead := rawdb.ReadCanonicalHash(h.chainDb, (index+1)*h.server.iConfig.BloomTrieSize-1) + return light.GetBloomTrieRoot(h.chainDb, index, sectionHead), light.BloomTrieTablePrefix + } + return common.Hash{}, "" +} + +// getAuxiliaryHeaders returns requested auxiliary headers for the CHT request. +func (h *serverHandler) getAuxiliaryHeaders(req HelperTrieReq) []byte { + if req.Type == htCanonical && req.AuxReq == auxHeader && len(req.Key) == 8 { + blockNum := binary.BigEndian.Uint64(req.Key) + hash := rawdb.ReadCanonicalHash(h.chainDb, blockNum) + return rawdb.ReadHeaderRLP(h.chainDb, hash, blockNum) + } + return nil +} + +// txStatus returns the status of a specified transaction. +func (h *serverHandler) txStatus(hash common.Hash) light.TxStatus { + var stat light.TxStatus + // Looking the transaction in txpool first. + stat.Status = h.txpool.Status([]common.Hash{hash})[0] + + // If the transaction is unknown to the pool, try looking it up locally. + if stat.Status == core.TxStatusUnknown { + lookup := h.blockchain.GetTransactionLookup(hash) + if lookup != nil { + stat.Status = core.TxStatusIncluded + stat.Lookup = lookup + } + } + return stat +} + +// broadcastHeaders broadcasts new block information to all connected light +// clients. According to the agreement between client and server, server should +// only broadcast new announcement if the total difficulty is higher than the +// last one. Besides server will add the signature if client requires. +func (h *serverHandler) broadcastHeaders() { + defer h.wg.Done() + + headCh := make(chan core.ChainHeadEvent, 10) + headSub := h.blockchain.SubscribeChainHeadEvent(headCh) + defer headSub.Unsubscribe() + + var ( + lastHead *types.Header + lastTd = common.Big0 + ) + for { + select { + case ev := <-headCh: + peers := h.server.peers.AllPeers() + if len(peers) == 0 { + continue + } + header := ev.Block.Header() + hash, number := header.Hash(), header.Number.Uint64() + td := h.blockchain.GetTd(hash, number) + if td == nil || td.Cmp(lastTd) <= 0 { + continue + } + var reorg uint64 + if lastHead != nil { + reorg = lastHead.Number.Uint64() - rawdb.FindCommonAncestor(h.chainDb, header, lastHead).Number.Uint64() + } + lastHead, lastTd = header, td + + log.Debug("Announcing block to peers", "number", number, "hash", hash, "td", td, "reorg", reorg) + var ( + signed bool + signedAnnounce announceData + ) + announce := announceData{Hash: hash, Number: number, Td: td, ReorgDepth: reorg} + for _, p := range peers { + p := p + switch p.announceType { + case announceTypeSimple: + p.queueSend(func() { p.SendAnnounce(announce) }) + case announceTypeSigned: + if !signed { + signedAnnounce = announce + signedAnnounce.sign(h.server.privateKey) + signed = true + } + p.queueSend(func() { p.SendAnnounce(signedAnnounce) }) + } + } + case <-h.closeCh: + return + } + } +} diff --git a/les/serverpool.go b/les/serverpool.go index cfc698f8f693..37621dc63481 100644 --- a/les/serverpool.go +++ b/les/serverpool.go @@ -14,7 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package les implements the Light Ethereum Subprotocol. package les import ( @@ -28,14 +27,14 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/common/mclock" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/discv5" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/discv5" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/rlp" ) const ( @@ -116,8 +115,6 @@ type serverPool struct { db ethdb.Database dbKey []byte server *p2p.Server - quit chan struct{} - wg *sync.WaitGroup connWg sync.WaitGroup topic discv5.Topic @@ -126,26 +123,27 @@ type serverPool struct { discNodes chan *enode.Node discLookups chan bool + trustedNodes map[enode.ID]*enode.Node entries map[enode.ID]*poolEntry timeout, enableRetry chan *poolEntry adjustStats chan poolStatAdjust - connCh chan *connReq - disconnCh chan *disconnReq - registerCh chan *registerReq - knownQueue, newQueue poolEntryQueue knownSelect, newSelect *weightedRandomSelect knownSelected, newSelected int fastDiscover bool + connCh chan *connReq + disconnCh chan *disconnReq + registerCh chan *registerReq + + closeCh chan struct{} + wg sync.WaitGroup } // newServerPool creates a new serverPool instance -func newServerPool(db ethdb.Database, quit chan struct{}, wg *sync.WaitGroup) *serverPool { +func newServerPool(db ethdb.Database, ulcServers []string) *serverPool { pool := &serverPool{ db: db, - quit: quit, - wg: wg, entries: make(map[enode.ID]*poolEntry), timeout: make(chan *poolEntry, 1), adjustStats: make(chan poolStatAdjust, 100), @@ -153,10 +151,13 @@ func newServerPool(db ethdb.Database, quit chan struct{}, wg *sync.WaitGroup) *s connCh: make(chan *connReq), disconnCh: make(chan *disconnReq), registerCh: make(chan *registerReq), + closeCh: make(chan struct{}), knownSelect: newWeightedRandomSelect(), newSelect: newWeightedRandomSelect(), fastDiscover: true, + trustedNodes: parseTrustedNodes(ulcServers), } + pool.knownQueue = newPoolEntryQueue(maxKnownEntries, pool.removeEntry) pool.newQueue = newPoolEntryQueue(maxNewEntries, pool.removeEntry) return pool @@ -166,8 +167,8 @@ func (pool *serverPool) start(server *p2p.Server, topic discv5.Topic) { pool.server = server pool.topic = topic pool.dbKey = append([]byte("serverPool/"), []byte(topic)...) - pool.wg.Add(1) pool.loadNodes() + pool.connectToTrustedNodes() if pool.server.DiscV5 != nil { pool.discSetPeriod = make(chan time.Duration, 1) @@ -176,9 +177,15 @@ func (pool *serverPool) start(server *p2p.Server, topic discv5.Topic) { go pool.discoverNodes() } pool.checkDial() + pool.wg.Add(1) go pool.eventLoop() } +func (pool *serverPool) stop() { + close(pool.closeCh) + pool.wg.Wait() +} + // discoverNodes wraps SearchTopic, converting result nodes to enode.Node. func (pool *serverPool) discoverNodes() { ch := make(chan *discv5.Node) @@ -205,7 +212,7 @@ func (pool *serverPool) connect(p *peer, node *enode.Node) *poolEntry { req := &connReq{p: p, node: node, result: make(chan *poolEntry, 1)} select { case pool.connCh <- req: - case <-pool.quit: + case <-pool.closeCh: return nil } return <-req.result @@ -217,7 +224,7 @@ func (pool *serverPool) registered(entry *poolEntry) { req := ®isterReq{entry: entry, done: make(chan struct{})} select { case pool.registerCh <- req: - case <-pool.quit: + case <-pool.closeCh: return } <-req.done @@ -229,7 +236,7 @@ func (pool *serverPool) registered(entry *poolEntry) { func (pool *serverPool) disconnect(entry *poolEntry) { stopped := false select { - case <-pool.quit: + case <-pool.closeCh: stopped = true default: } @@ -276,6 +283,7 @@ func (pool *serverPool) adjustResponseTime(entry *poolEntry, time time.Duration, // eventLoop handles pool events and mutex locking for all internal functions func (pool *serverPool) eventLoop() { + defer pool.wg.Done() lookupCnt := 0 var convTime mclock.AbsTime if pool.discSetPeriod != nil { @@ -337,8 +345,10 @@ func (pool *serverPool) eventLoop() { } case node := <-pool.discNodes: - entry := pool.findOrNewNode(node) - pool.updateCheckDial(entry) + if pool.trustedNodes[node.ID()] == nil { + entry := pool.findOrNewNode(node) + pool.updateCheckDial(entry) + } case conv := <-pool.discLookups: if conv { @@ -355,31 +365,39 @@ func (pool *serverPool) eventLoop() { } case req := <-pool.connCh: - // Handle peer connection requests. - entry := pool.entries[req.p.ID()] - if entry == nil { - entry = pool.findOrNewNode(req.node) - } - if entry.state == psConnected || entry.state == psRegistered { - req.result <- nil - continue - } - pool.connWg.Add(1) - entry.peer = req.p - entry.state = psConnected - addr := &poolEntryAddress{ - ip: req.node.IP(), - port: uint16(req.node.TCP()), - lastSeen: mclock.Now(), + if pool.trustedNodes[req.p.ID()] != nil { + // ignore trusted nodes + req.result <- &poolEntry{trusted: true} + } else { + // Handle peer connection requests. + entry := pool.entries[req.p.ID()] + if entry == nil { + entry = pool.findOrNewNode(req.node) + } + if entry.state == psConnected || entry.state == psRegistered { + req.result <- nil + continue + } + pool.connWg.Add(1) + entry.peer = req.p + entry.state = psConnected + addr := &poolEntryAddress{ + ip: req.node.IP(), + port: uint16(req.node.TCP()), + lastSeen: mclock.Now(), + } + entry.lastConnected = addr + entry.addr = make(map[string]*poolEntryAddress) + entry.addr[addr.strKey()] = addr + entry.addrSelect = *newWeightedRandomSelect() + entry.addrSelect.update(addr) + req.result <- entry } - entry.lastConnected = addr - entry.addr = make(map[string]*poolEntryAddress) - entry.addr[addr.strKey()] = addr - entry.addrSelect = *newWeightedRandomSelect() - entry.addrSelect.update(addr) - req.result <- entry case req := <-pool.registerCh: + if req.entry.trusted { + continue + } // Handle peer registration requests. entry := req.entry entry.state = psRegistered @@ -393,10 +411,13 @@ func (pool *serverPool) eventLoop() { close(req.done) case req := <-pool.disconnCh: + if req.entry.trusted { + continue + } // Handle peer disconnection requests. disconnect(req, req.stopped) - case <-pool.quit: + case <-pool.closeCh: if pool.discSetPeriod != nil { close(pool.discSetPeriod) } @@ -412,7 +433,6 @@ func (pool *serverPool) eventLoop() { disconnect(req, true) } pool.saveNodes() - pool.wg.Done() return } } @@ -470,9 +490,40 @@ func (pool *serverPool) loadNodes() { "response", fmt.Sprintf("%v/%v", time.Duration(e.responseStats.avg), e.responseStats.weight), "timeout", fmt.Sprintf("%v/%v", e.timeoutStats.avg, e.timeoutStats.weight)) pool.entries[e.node.ID()] = e - pool.knownQueue.setLatest(e) - pool.knownSelect.update((*knownEntry)(e)) + if pool.trustedNodes[e.node.ID()] == nil { + pool.knownQueue.setLatest(e) + pool.knownSelect.update((*knownEntry)(e)) + } + } +} + +// connectToTrustedNodes adds trusted server nodes as static trusted peers. +// +// Note: trusted nodes are not handled by the server pool logic, they are not +// added to either the known or new selection pools. They are connected/reconnected +// by p2p.Server whenever possible. +func (pool *serverPool) connectToTrustedNodes() { + //connect to trusted nodes + for _, node := range pool.trustedNodes { + pool.server.AddTrustedPeer(node) + pool.server.AddPeer(node) + log.Debug("Added trusted node", "id", node.ID().String()) + } +} + +// parseTrustedNodes returns valid and parsed enodes +func parseTrustedNodes(trustedNodes []string) map[enode.ID]*enode.Node { + nodes := make(map[enode.ID]*enode.Node) + + for _, node := range trustedNodes { + node, err := enode.Parse(enode.ValidSchemes, node) + if err != nil { + log.Warn("Trusted node URL invalid", "enode", node, "err", err) + continue + } + nodes[node.ID()] = node } + return nodes } // saveNodes saves known nodes and their statistics into the database. Nodes are @@ -509,10 +560,10 @@ func (pool *serverPool) setRetryDial(entry *poolEntry) { entry.delayedRetry = true go func() { select { - case <-pool.quit: + case <-pool.closeCh: case <-time.After(delay): select { - case <-pool.quit: + case <-pool.closeCh: case pool.enableRetry <- entry: } } @@ -578,10 +629,10 @@ func (pool *serverPool) dial(entry *poolEntry, knownSelected bool) { go func() { pool.server.AddPeer(entry.node) select { - case <-pool.quit: + case <-pool.closeCh: case <-time.After(dialTimeout): select { - case <-pool.quit: + case <-pool.closeCh: case pool.timeout <- entry: } } @@ -622,14 +673,14 @@ type poolEntry struct { lastConnected, dialed *poolEntryAddress addrSelect weightedRandomSelect - lastDiscovered mclock.AbsTime - known, knownSelected bool - connectStats, delayStats poolStats - responseStats, timeoutStats poolStats - state int - regTime mclock.AbsTime - queueIdx int - removed bool + lastDiscovered mclock.AbsTime + known, knownSelected, trusted bool + connectStats, delayStats poolStats + responseStats, timeoutStats poolStats + state int + regTime mclock.AbsTime + queueIdx int + removed bool delayedRetry bool shortRetry int diff --git a/les/servingqueue.go b/les/servingqueue.go new file mode 100644 index 000000000000..8842cf9e9d55 --- /dev/null +++ b/les/servingqueue.go @@ -0,0 +1,378 @@ +// Copyright 2019 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 ( + "sort" + "sync" + "sync/atomic" + + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/common/prque" +) + +// servingQueue allows running tasks in a limited number of threads and puts the +// waiting tasks in a priority queue +type servingQueue struct { + recentTime, queuedTime, servingTimeDiff uint64 + burstLimit, burstDropLimit uint64 + burstDecRate float64 + lastUpdate mclock.AbsTime + + queueAddCh, queueBestCh chan *servingTask + stopThreadCh, quit chan struct{} + setThreadsCh chan int + + wg sync.WaitGroup + threadCount int // number of currently running threads + queue *prque.Prque // priority queue for waiting or suspended tasks + best *servingTask // the highest priority task (not included in the queue) + suspendBias int64 // priority bias against suspending an already running task +} + +// servingTask represents a request serving task. Tasks can be implemented to +// run in multiple steps, allowing the serving queue to suspend execution between +// steps if higher priority tasks are entered. The creator of the task should +// set the following fields: +// +// - priority: greater value means higher priority; values can wrap around the int64 range +// - run: execute a single step; return true if finished +// - after: executed after run finishes or returns an error, receives the total serving time +type servingTask struct { + sq *servingQueue + servingTime, timeAdded, maxTime, expTime uint64 + peer *peer + priority int64 + biasAdded bool + token runToken + tokenCh chan runToken +} + +// runToken received by servingTask.start allows the task to run. Closing the +// channel by servingTask.stop signals the thread controller to allow a new task +// to start running. +type runToken chan struct{} + +// start blocks until the task can start and returns true if it is allowed to run. +// Returning false means that the task should be cancelled. +func (t *servingTask) start() bool { + if t.peer.isFrozen() { + return false + } + t.tokenCh = make(chan runToken, 1) + select { + case t.sq.queueAddCh <- t: + case <-t.sq.quit: + return false + } + select { + case t.token = <-t.tokenCh: + case <-t.sq.quit: + return false + } + if t.token == nil { + return false + } + t.servingTime -= uint64(mclock.Now()) + return true +} + +// done signals the thread controller about the task being finished and returns +// the total serving time of the task in nanoseconds. +func (t *servingTask) done() uint64 { + t.servingTime += uint64(mclock.Now()) + close(t.token) + diff := t.servingTime - t.timeAdded + t.timeAdded = t.servingTime + if t.expTime > diff { + t.expTime -= diff + atomic.AddUint64(&t.sq.servingTimeDiff, t.expTime) + } else { + t.expTime = 0 + } + return t.servingTime +} + +// waitOrStop can be called during the execution of the task. It blocks if there +// is a higher priority task waiting (a bias is applied in favor of the currently +// running task). Returning true means that the execution can be resumed. False +// means the task should be cancelled. +func (t *servingTask) waitOrStop() bool { + t.done() + if !t.biasAdded { + t.priority += t.sq.suspendBias + t.biasAdded = true + } + return t.start() +} + +// newServingQueue returns a new servingQueue +func newServingQueue(suspendBias int64, utilTarget float64) *servingQueue { + sq := &servingQueue{ + queue: prque.New(nil), + suspendBias: suspendBias, + queueAddCh: make(chan *servingTask, 100), + queueBestCh: make(chan *servingTask), + stopThreadCh: make(chan struct{}), + quit: make(chan struct{}), + setThreadsCh: make(chan int, 10), + burstLimit: uint64(utilTarget * bufLimitRatio * 1200000), + burstDropLimit: uint64(utilTarget * bufLimitRatio * 1000000), + burstDecRate: utilTarget, + lastUpdate: mclock.Now(), + } + sq.wg.Add(2) + go sq.queueLoop() + go sq.threadCountLoop() + return sq +} + +// newTask creates a new task with the given priority +func (sq *servingQueue) newTask(peer *peer, maxTime uint64, priority int64) *servingTask { + return &servingTask{ + sq: sq, + peer: peer, + maxTime: maxTime, + expTime: maxTime, + priority: priority, + } +} + +// threadController is started in multiple goroutines and controls the execution +// of tasks. The number of active thread controllers equals the allowed number of +// concurrently running threads. It tries to fetch the highest priority queued +// task first. If there are no queued tasks waiting then it can directly catch +// run tokens from the token channel and allow the corresponding tasks to run +// without entering the priority queue. +func (sq *servingQueue) threadController() { + for { + token := make(runToken) + select { + case best := <-sq.queueBestCh: + best.tokenCh <- token + case <-sq.stopThreadCh: + sq.wg.Done() + return + case <-sq.quit: + sq.wg.Done() + return + } + <-token + select { + case <-sq.stopThreadCh: + sq.wg.Done() + return + case <-sq.quit: + sq.wg.Done() + return + default: + } + } +} + +type ( + // peerTasks lists the tasks received from a given peer when selecting peers to freeze + peerTasks struct { + peer *peer + list []*servingTask + sumTime uint64 + priority float64 + } + // peerList is a sortable list of peerTasks + peerList []*peerTasks +) + +func (l peerList) Len() int { + return len(l) +} + +func (l peerList) Less(i, j int) bool { + return l[i].priority < l[j].priority +} + +func (l peerList) Swap(i, j int) { + l[i], l[j] = l[j], l[i] +} + +// freezePeers selects the peers with the worst priority queued tasks and freezes +// them until burstTime goes under burstDropLimit or all peers are frozen +func (sq *servingQueue) freezePeers() { + peerMap := make(map[*peer]*peerTasks) + var peerList peerList + if sq.best != nil { + sq.queue.Push(sq.best, sq.best.priority) + } + sq.best = nil + for sq.queue.Size() > 0 { + task := sq.queue.PopItem().(*servingTask) + tasks := peerMap[task.peer] + if tasks == nil { + bufValue, bufLimit := task.peer.fcClient.BufferStatus() + if bufLimit < 1 { + bufLimit = 1 + } + tasks = &peerTasks{ + peer: task.peer, + priority: float64(bufValue) / float64(bufLimit), // lower value comes first + } + peerMap[task.peer] = tasks + peerList = append(peerList, tasks) + } + tasks.list = append(tasks.list, task) + tasks.sumTime += task.expTime + } + sort.Sort(peerList) + drop := true + for _, tasks := range peerList { + if drop { + tasks.peer.freezeClient() + tasks.peer.fcClient.Freeze() + sq.queuedTime -= tasks.sumTime + sqQueuedGauge.Update(int64(sq.queuedTime)) + clientFreezeMeter.Mark(1) + drop = sq.recentTime+sq.queuedTime > sq.burstDropLimit + for _, task := range tasks.list { + task.tokenCh <- nil + } + } else { + for _, task := range tasks.list { + sq.queue.Push(task, task.priority) + } + } + } + if sq.queue.Size() > 0 { + sq.best = sq.queue.PopItem().(*servingTask) + } +} + +// updateRecentTime recalculates the recent serving time value +func (sq *servingQueue) updateRecentTime() { + subTime := atomic.SwapUint64(&sq.servingTimeDiff, 0) + now := mclock.Now() + dt := now - sq.lastUpdate + sq.lastUpdate = now + if dt > 0 { + subTime += uint64(float64(dt) * sq.burstDecRate) + } + if sq.recentTime > subTime { + sq.recentTime -= subTime + } else { + sq.recentTime = 0 + } +} + +// addTask inserts a task into the priority queue +func (sq *servingQueue) addTask(task *servingTask) { + if sq.best == nil { + sq.best = task + } else if task.priority > sq.best.priority { + sq.queue.Push(sq.best, sq.best.priority) + sq.best = task + } else { + sq.queue.Push(task, task.priority) + } + sq.updateRecentTime() + sq.queuedTime += task.expTime + sqServedGauge.Update(int64(sq.recentTime)) + sqQueuedGauge.Update(int64(sq.queuedTime)) + if sq.recentTime+sq.queuedTime > sq.burstLimit { + sq.freezePeers() + } +} + +// queueLoop is an event loop running in a goroutine. It receives tasks from queueAddCh +// and always tries to send the highest priority task to queueBestCh. Successfully sent +// tasks are removed from the queue. +func (sq *servingQueue) queueLoop() { + for { + if sq.best != nil { + expTime := sq.best.expTime + select { + case task := <-sq.queueAddCh: + sq.addTask(task) + case sq.queueBestCh <- sq.best: + sq.updateRecentTime() + sq.queuedTime -= expTime + sq.recentTime += expTime + sqServedGauge.Update(int64(sq.recentTime)) + sqQueuedGauge.Update(int64(sq.queuedTime)) + if sq.queue.Size() == 0 { + sq.best = nil + } else { + sq.best, _ = sq.queue.PopItem().(*servingTask) + } + case <-sq.quit: + sq.wg.Done() + return + } + } else { + select { + case task := <-sq.queueAddCh: + sq.addTask(task) + case <-sq.quit: + sq.wg.Done() + return + } + } + } +} + +// threadCountLoop is an event loop running in a goroutine. It adjusts the number +// of active thread controller goroutines. +func (sq *servingQueue) threadCountLoop() { + var threadCountTarget int + for { + for threadCountTarget > sq.threadCount { + sq.wg.Add(1) + go sq.threadController() + sq.threadCount++ + } + if threadCountTarget < sq.threadCount { + select { + case threadCountTarget = <-sq.setThreadsCh: + case sq.stopThreadCh <- struct{}{}: + sq.threadCount-- + case <-sq.quit: + sq.wg.Done() + return + } + } else { + select { + case threadCountTarget = <-sq.setThreadsCh: + case <-sq.quit: + sq.wg.Done() + return + } + } + } +} + +// setThreads sets the allowed processing thread count, suspending tasks as soon as +// possible if necessary. +func (sq *servingQueue) setThreads(threadCount int) { + select { + case sq.setThreadsCh <- threadCount: + case <-sq.quit: + return + } +} + +// stop stops task processing as soon as possible and shuts down the serving queue. +func (sq *servingQueue) stop() { + close(sq.quit) + sq.wg.Wait() +} diff --git a/les/sync.go b/les/sync.go index 5913ea635c85..1214fefcaf13 100644 --- a/les/sync.go +++ b/les/sync.go @@ -18,62 +18,169 @@ package les import ( "context" + "errors" "time" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/light" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/log" ) -// syncer is responsible for periodically synchronising with the network, both -// downloading hashes and blocks as well as handling the announcement handler. -func (pm *ProtocolManager) syncer() { - // Start and ensure cleanup of sync mechanisms - //pm.fetcher.Start() - //defer pm.fetcher.Stop() - defer pm.downloader.Terminate() +var errInvalidCheckpoint = errors.New("invalid advertised checkpoint") - // Wait for different events to fire synchronisation operations - //forceSync := time.Tick(forceSyncCycle) - for { - select { - case <-pm.newPeerCh: - /* // Make sure we have peers to select from, then sync - if pm.peers.Len() < minDesiredPeerCount { - break - } - go pm.synchronise(pm.peers.BestPeer()) - */ - /*case <-forceSync: - // Force a sync even if not enough peers are present - go pm.synchronise(pm.peers.BestPeer()) - */ - case <-pm.noMorePeers: - return - } - } -} +const ( + // lightSync starts syncing from the current highest block. + // If the chain is empty, syncing the entire header chain. + lightSync = iota + + // legacyCheckpointSync starts syncing from a hardcoded checkpoint. + legacyCheckpointSync + + // checkpointSync starts syncing from a checkpoint signed by trusted + // signer or hardcoded checkpoint for compatibility. + checkpointSync +) -func (pm *ProtocolManager) needToSync(peerHead blockInfo) bool { - head := pm.blockchain.CurrentHeader() - currentTd := rawdb.ReadTd(pm.chainDb, head.Hash(), head.Number.Uint64()) - return currentTd != nil && peerHead.Td.Cmp(currentTd) > 0 +// validateCheckpoint verifies the advertised checkpoint by peer is valid or not. +// +// Each network has several hard-coded checkpoint signer addresses. Only the +// checkpoint issued by the specified signer is considered valid. +// +// In addition to the checkpoint registered in the registrar contract, there are +// several legacy hardcoded checkpoints in our codebase. These checkpoints are +// also considered as valid. +func (h *clientHandler) validateCheckpoint(peer *peer) error { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + + // Fetch the block header corresponding to the checkpoint registration. + cp := peer.checkpoint + header, err := light.GetUntrustedHeaderByNumber(ctx, h.backend.odr, peer.checkpointNumber, peer.id) + if err != nil { + return err + } + // Fetch block logs associated with the block header. + logs, err := light.GetUntrustedBlockLogs(ctx, h.backend.odr, header) + if err != nil { + return err + } + events := h.backend.oracle.contract.LookupCheckpointEvents(logs, cp.SectionIndex, cp.Hash()) + if len(events) == 0 { + return errInvalidCheckpoint + } + var ( + index = events[0].Index + hash = events[0].CheckpointHash + signatures [][]byte + ) + for _, event := range events { + signatures = append(signatures, append(event.R[:], append(event.S[:], event.V)...)) + } + valid, signers := h.backend.oracle.verifySigners(index, hash, signatures) + if !valid { + return errInvalidCheckpoint + } + log.Warn("Verified advertised checkpoint", "peer", peer.id, "signers", len(signers)) + return nil } -// synchronise tries to sync up our local block chain with a remote peer. -func (pm *ProtocolManager) synchronise(peer *peer) { - // Short circuit if no peers are available +// synchronise tries to sync up our local chain with a remote peer. +func (h *clientHandler) synchronise(peer *peer) { + // Short circuit if the peer is nil. if peer == nil { return } - // Make sure the peer's TD is higher than our own. - if !pm.needToSync(peer.headBlockInfo()) { + latest := h.backend.blockchain.CurrentHeader() + currentTd := rawdb.ReadTd(h.backend.chainDb, latest.Hash(), latest.Number.Uint64()) + if currentTd != nil && peer.headBlockInfo().Td.Cmp(currentTd) < 0 { return } + // Recap the checkpoint. + // + // The light client may be connected to several different versions of the server. + // (1) Old version server which can not provide stable checkpoint in the handshake packet. + // => Use hardcoded checkpoint or empty checkpoint + // (2) New version server but simple checkpoint syncing is not enabled(e.g. mainnet, new testnet or private network) + // => Use hardcoded checkpoint or empty checkpoint + // (3) New version server but the provided stable checkpoint is even lower than the hardcoded one. + // => Use hardcoded checkpoint + // (4) New version server with valid and higher stable checkpoint + // => Use provided checkpoint + var checkpoint = &peer.checkpoint + var hardcoded bool + if h.checkpoint != nil && h.checkpoint.SectionIndex >= peer.checkpoint.SectionIndex { + checkpoint = h.checkpoint // Use the hardcoded one. + hardcoded = true + } + // Determine whether we should run checkpoint syncing or normal light syncing. + // + // Here has four situations that we will disable the checkpoint syncing: + // + // 1. The checkpoint is empty + // 2. The latest head block of the local chain is above the checkpoint. + // 3. The checkpoint is hardcoded(recap with local hardcoded checkpoint) + // 4. For some networks the checkpoint syncing is not activated. + mode := checkpointSync + switch { + case checkpoint.Empty(): + mode = lightSync + log.Debug("Disable checkpoint syncing", "reason", "empty checkpoint") + case latest.Number.Uint64() >= (checkpoint.SectionIndex+1)*h.backend.iConfig.ChtSize-1: + mode = lightSync + log.Debug("Disable checkpoint syncing", "reason", "local chain beyond the checkpoint") + case hardcoded: + mode = legacyCheckpointSync + log.Debug("Disable checkpoint syncing", "reason", "checkpoint is hardcoded") + case h.backend.oracle == nil || !h.backend.oracle.isRunning(): + if h.checkpoint == nil { + mode = lightSync // Downgrade to light sync unfortunately. + } else { + checkpoint = h.checkpoint + mode = legacyCheckpointSync + } + log.Debug("Disable checkpoint syncing", "reason", "checkpoint syncing is not activated") + } + // Notify testing framework if syncing has completed(for testing purpose). + defer func() { + if h.syncDone != nil { + h.syncDone() + } + }() + start := time.Now() + if mode == checkpointSync || mode == legacyCheckpointSync { + // Validate the advertised checkpoint + if mode == checkpointSync { + if err := h.validateCheckpoint(peer); err != nil { + log.Debug("Failed to validate checkpoint", "reason", err) + h.removePeer(peer.id) + return + } + h.backend.blockchain.AddTrustedCheckpoint(checkpoint) + } + log.Debug("Checkpoint syncing start", "peer", peer.id, "checkpoint", checkpoint.SectionIndex) - ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) - defer cancel() - pm.blockchain.(*light.LightChain).SyncCht(ctx) - pm.downloader.Synchronise(peer.id, peer.Head(), peer.Td(), downloader.LightSync) + // Fetch the start point block header. + // + // For the ethash consensus engine, the start header is the block header + // of the checkpoint. + // + // For the clique consensus engine, the start header is the block header + // of the latest epoch covered by checkpoint. + ctx, cancel := context.WithTimeout(context.Background(), time.Second*5) + defer cancel() + if !checkpoint.Empty() && !h.backend.blockchain.SyncCheckpoint(ctx, checkpoint) { + log.Debug("Sync checkpoint failed") + h.removePeer(peer.id) + return + } + } + // Fetch the remaining block headers based on the current chain header. + if err := h.downloader.Synchronise(peer.id, peer.Head(), peer.Td(), downloader.LightSync); err != nil { + log.Debug("Synchronise failed", "reason", err) + return + } + log.Debug("Synchronise finished", "elapsed", common.PrettyDuration(time.Since(start))) } diff --git a/les/sync_test.go b/les/sync_test.go new file mode 100644 index 000000000000..8df6223b8416 --- /dev/null +++ b/les/sync_test.go @@ -0,0 +1,229 @@ +// Copyright 2019 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 ( + "fmt" + "math/big" + "testing" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/params" +) + +// Test light syncing which will download all headers from genesis. +func TestLightSyncingLes3(t *testing.T) { testCheckpointSyncing(t, 3, 0) } + +// Test legacy checkpoint syncing which will download tail headers +// based on a hardcoded checkpoint. +func TestLegacyCheckpointSyncingLes3(t *testing.T) { testCheckpointSyncing(t, 3, 1) } + +// Test checkpoint syncing which will download tail headers based +// on a verified checkpoint. +func TestCheckpointSyncingLes3(t *testing.T) { testCheckpointSyncing(t, 3, 2) } + +func testCheckpointSyncing(t *testing.T, protocol int, syncMode int) { + config := light.TestServerIndexerConfig + + waitIndexers := func(cIndexer, bIndexer, btIndexer *core.ChainIndexer) { + for { + cs, _, _ := cIndexer.Sections() + bts, _, _ := btIndexer.Sections() + if cs >= 1 && bts >= 1 { + break + } + time.Sleep(10 * time.Millisecond) + } + } + // Generate 512+4 blocks (totally 1 CHT sections) + server, client, tearDown := newClientServerEnv(t, int(config.ChtSize+config.ChtConfirms), protocol, waitIndexers, nil, 0, false, false) + defer tearDown() + + expected := config.ChtSize + config.ChtConfirms + + // Checkpoint syncing or legacy checkpoint syncing. + if syncMode == 1 || syncMode == 2 { + // Assemble checkpoint 0 + s, _, head := server.chtIndexer.Sections() + cp := ¶ms.TrustedCheckpoint{ + SectionIndex: 0, + SectionHead: head, + CHTRoot: light.GetChtRoot(server.db, s-1, head), + BloomRoot: light.GetBloomTrieRoot(server.db, s-1, head), + } + if syncMode == 1 { + // Register the assembled checkpoint as hardcoded one. + client.handler.checkpoint = cp + client.handler.backend.blockchain.AddTrustedCheckpoint(cp) + } else { + // Register the assembled checkpoint into oracle. + header := server.backend.Blockchain().CurrentHeader() + + data := append([]byte{0x19, 0x00}, append(registrarAddr.Bytes(), append([]byte{0, 0, 0, 0, 0, 0, 0, 0}, cp.Hash().Bytes()...)...)...) + sig, _ := crypto.Sign(crypto.Keccak256(data), signerKey) + sig[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper + if _, err := server.handler.server.oracle.contract.RegisterCheckpoint(bind.NewKeyedTransactor(signerKey), cp.SectionIndex, cp.Hash().Bytes(), new(big.Int).Sub(header.Number, big.NewInt(1)), header.ParentHash, [][]byte{sig}); err != nil { + t.Error("register checkpoint failed", err) + } + server.backend.Commit() + + // Wait for the checkpoint registration + for { + _, hash, _, err := server.handler.server.oracle.contract.Contract().GetLatestCheckpoint(nil) + if err != nil || hash == [32]byte{} { + time.Sleep(10 * time.Millisecond) + continue + } + break + } + expected += 1 + } + } + + done := make(chan error) + client.handler.syncDone = func() { + header := client.handler.backend.blockchain.CurrentHeader() + if header.Number.Uint64() == expected { + done <- nil + } else { + done <- fmt.Errorf("blockchain length mismatch, want %d, got %d", expected, header.Number) + } + } + + // Create connected peer pair. + _, err1, _, err2 := newTestPeerPair("peer", protocol, server.handler, client.handler) + select { + case <-time.After(time.Millisecond * 100): + case err := <-err1: + t.Fatalf("peer 1 handshake error: %v", err) + case err := <-err2: + t.Fatalf("peer 2 handshake error: %v", err) + } + + select { + case err := <-done: + if err != nil { + t.Error("sync failed", err) + } + return + case <-time.NewTimer(10 * time.Second).C: + t.Error("checkpoint syncing timeout") + } +} + +func TestMissOracleBackend(t *testing.T) { testMissOracleBackend(t, true) } +func TestMissOracleBackendNoCheckpoint(t *testing.T) { testMissOracleBackend(t, false) } + +func testMissOracleBackend(t *testing.T, hasCheckpoint bool) { + config := light.TestServerIndexerConfig + + waitIndexers := func(cIndexer, bIndexer, btIndexer *core.ChainIndexer) { + for { + cs, _, _ := cIndexer.Sections() + bts, _, _ := btIndexer.Sections() + if cs >= 1 && bts >= 1 { + break + } + time.Sleep(10 * time.Millisecond) + } + } + // Generate 512+4 blocks (totally 1 CHT sections) + server, client, tearDown := newClientServerEnv(t, int(config.ChtSize+config.ChtConfirms), 3, waitIndexers, nil, 0, false, false) + defer tearDown() + + expected := config.ChtSize + config.ChtConfirms + + s, _, head := server.chtIndexer.Sections() + cp := ¶ms.TrustedCheckpoint{ + SectionIndex: 0, + SectionHead: head, + CHTRoot: light.GetChtRoot(server.db, s-1, head), + BloomRoot: light.GetBloomTrieRoot(server.db, s-1, head), + } + // Register the assembled checkpoint into oracle. + header := server.backend.Blockchain().CurrentHeader() + + data := append([]byte{0x19, 0x00}, append(registrarAddr.Bytes(), append([]byte{0, 0, 0, 0, 0, 0, 0, 0}, cp.Hash().Bytes()...)...)...) + sig, _ := crypto.Sign(crypto.Keccak256(data), signerKey) + sig[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper + if _, err := server.handler.server.oracle.contract.RegisterCheckpoint(bind.NewKeyedTransactor(signerKey), cp.SectionIndex, cp.Hash().Bytes(), new(big.Int).Sub(header.Number, big.NewInt(1)), header.ParentHash, [][]byte{sig}); err != nil { + t.Error("register checkpoint failed", err) + } + server.backend.Commit() + + // Wait for the checkpoint registration + for { + _, hash, _, err := server.handler.server.oracle.contract.Contract().GetLatestCheckpoint(nil) + if err != nil || hash == [32]byte{} { + time.Sleep(100 * time.Millisecond) + continue + } + break + } + expected += 1 + + // Explicitly set the oracle as nil. In normal use case it can happen + // that user wants to unlock something which blocks the oracle backend + // initialisation. But at the same time syncing starts. + // + // See https://github.com/ethereum/go-ethereum/issues/20097 for more detail. + // + // In this case, client should run light sync or legacy checkpoint sync + // if hardcoded checkpoint is configured. + client.handler.backend.oracle = nil + + // For some private networks it can happen checkpoint syncing is enabled + // but there is no hardcoded checkpoint configured. + if hasCheckpoint { + client.handler.checkpoint = cp + client.handler.backend.blockchain.AddTrustedCheckpoint(cp) + } + + done := make(chan error) + client.handler.syncDone = func() { + header := client.handler.backend.blockchain.CurrentHeader() + if header.Number.Uint64() == expected { + done <- nil + } else { + done <- fmt.Errorf("blockchain length mismatch, want %d, got %d", expected, header.Number) + } + } + + // Create connected peer pair. + _, err1, _, err2 := newTestPeerPair("peer", 2, server.handler, client.handler) + select { + case <-time.After(time.Millisecond * 100): + case err := <-err1: + t.Fatalf("peer 1 handshake error: %v", err) + case err := <-err2: + t.Fatalf("peer 2 handshake error: %v", err) + } + + select { + case err := <-done: + if err != nil { + t.Error("sync failed", err) + } + return + case <-time.NewTimer(10 * time.Second).C: + t.Error("checkpoint syncing timeout") + } +} diff --git a/les/test_helper.go b/les/test_helper.go new file mode 100644 index 000000000000..ee3d7a32e136 --- /dev/null +++ b/les/test_helper.go @@ -0,0 +1,558 @@ +// 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 . + +// This file contains some shares testing functionality, common to multiple +// different files and modules being tested. + +package les + +import ( + "context" + "crypto/rand" + "math/big" + "testing" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/contracts/checkpointoracle/contract" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/les/flowcontrol" + "github.com/ethereum/go-ethereum/light" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" +) + +var ( + bankKey, _ = crypto.GenerateKey() + bankAddr = crypto.PubkeyToAddress(bankKey.PublicKey) + bankFunds = big.NewInt(1000000000000000000) + + userKey1, _ = crypto.GenerateKey() + userKey2, _ = crypto.GenerateKey() + userAddr1 = crypto.PubkeyToAddress(userKey1.PublicKey) + userAddr2 = crypto.PubkeyToAddress(userKey2.PublicKey) + + testContractAddr common.Address + testContractCode = common.Hex2Bytes("606060405260cc8060106000396000f360606040526000357c01000000000000000000000000000000000000000000000000000000009004806360cd2685146041578063c16431b914606b57603f565b005b6055600480803590602001909190505060a9565b6040518082815260200191505060405180910390f35b60886004808035906020019091908035906020019091905050608a565b005b80600060005083606481101560025790900160005b50819055505b5050565b6000600060005082606481101560025790900160005b5054905060c7565b91905056") + testContractCodeDeployed = testContractCode[16:] + testContractDeployed = uint64(2) + + testEventEmitterCode = common.Hex2Bytes("60606040523415600e57600080fd5b7f57050ab73f6b9ebdd9f76b8d4997793f48cf956e965ee070551b9ca0bb71584e60405160405180910390a160358060476000396000f3006060604052600080fd00a165627a7a723058203f727efcad8b5811f8cb1fc2620ce5e8c63570d697aef968172de296ea3994140029") + + // Checkpoint registrar relative + registrarAddr common.Address + signerKey, _ = crypto.GenerateKey() + signerAddr = crypto.PubkeyToAddress(signerKey.PublicKey) +) + +var ( + // The block frequency for creating checkpoint(only used in test) + sectionSize = big.NewInt(128) + + // The number of confirmations needed to generate a checkpoint(only used in test). + processConfirms = big.NewInt(1) + + // The token bucket buffer limit for testing purpose. + testBufLimit = uint64(1000000) + + // The buffer recharging speed for testing purpose. + testBufRecharge = uint64(1000) +) + +/* +contract test { + + uint256[100] data; + + function Put(uint256 addr, uint256 value) { + data[addr] = value; + } + + function Get(uint256 addr) constant returns (uint256 value) { + return data[addr]; + } +} +*/ + +// prepare pre-commits specified number customized blocks into chain. +func prepare(n int, backend *backends.SimulatedBackend) { + var ( + ctx = context.Background() + signer = types.HomesteadSigner{} + ) + for i := 0; i < n; i++ { + switch i { + case 0: + // deploy checkpoint contract + registrarAddr, _, _, _ = contract.DeployCheckpointOracle(bind.NewKeyedTransactor(bankKey), backend, []common.Address{signerAddr}, sectionSize, processConfirms, big.NewInt(1)) + // bankUser transfers some ether to user1 + nonce, _ := backend.PendingNonceAt(ctx, bankAddr) + tx, _ := types.SignTx(types.NewTransaction(nonce, userAddr1, big.NewInt(10000), params.TxGas, nil, nil), signer, bankKey) + backend.SendTransaction(ctx, tx) + case 1: + bankNonce, _ := backend.PendingNonceAt(ctx, bankAddr) + userNonce1, _ := backend.PendingNonceAt(ctx, userAddr1) + + // bankUser transfers more ether to user1 + tx1, _ := types.SignTx(types.NewTransaction(bankNonce, userAddr1, big.NewInt(1000), params.TxGas, nil, nil), signer, bankKey) + backend.SendTransaction(ctx, tx1) + + // user1 relays ether to user2 + tx2, _ := types.SignTx(types.NewTransaction(userNonce1, userAddr2, big.NewInt(1000), params.TxGas, nil, nil), signer, userKey1) + backend.SendTransaction(ctx, tx2) + + // user1 deploys a test contract + tx3, _ := types.SignTx(types.NewContractCreation(userNonce1+1, big.NewInt(0), 200000, big.NewInt(0), testContractCode), signer, userKey1) + backend.SendTransaction(ctx, tx3) + testContractAddr = crypto.CreateAddress(userAddr1, userNonce1+1) + + // user1 deploys a event contract + tx4, _ := types.SignTx(types.NewContractCreation(userNonce1+2, big.NewInt(0), 200000, big.NewInt(0), testEventEmitterCode), signer, userKey1) + backend.SendTransaction(ctx, tx4) + case 2: + // bankUser transfer some ether to signer + bankNonce, _ := backend.PendingNonceAt(ctx, bankAddr) + tx1, _ := types.SignTx(types.NewTransaction(bankNonce, signerAddr, big.NewInt(1000000000), params.TxGas, nil, nil), signer, bankKey) + backend.SendTransaction(ctx, tx1) + + // invoke test contract + data := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001") + tx2, _ := types.SignTx(types.NewTransaction(bankNonce+1, testContractAddr, big.NewInt(0), 100000, nil, data), signer, bankKey) + backend.SendTransaction(ctx, tx2) + case 3: + // invoke test contract + bankNonce, _ := backend.PendingNonceAt(ctx, bankAddr) + data := common.Hex2Bytes("C16431B900000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002") + tx, _ := types.SignTx(types.NewTransaction(bankNonce, testContractAddr, big.NewInt(0), 100000, nil, data), signer, bankKey) + backend.SendTransaction(ctx, tx) + } + backend.Commit() + } +} + +// testIndexers creates a set of indexers with specified params for testing purpose. +func testIndexers(db ethdb.Database, odr light.OdrBackend, config *light.IndexerConfig) []*core.ChainIndexer { + var indexers [3]*core.ChainIndexer + indexers[0] = light.NewChtIndexer(db, odr, config.ChtSize, config.ChtConfirms) + indexers[1] = eth.NewBloomIndexer(db, config.BloomSize, config.BloomConfirms) + indexers[2] = light.NewBloomTrieIndexer(db, odr, config.BloomSize, config.BloomTrieSize) + // make bloomTrieIndexer as a child indexer of bloom indexer. + indexers[1].AddChildIndexer(indexers[2]) + return indexers[:] +} + +func newTestClientHandler(backend *backends.SimulatedBackend, odr *LesOdr, indexers []*core.ChainIndexer, db ethdb.Database, peers *peerSet, ulcServers []string, ulcFraction int) *clientHandler { + var ( + evmux = new(event.TypeMux) + engine = ethash.NewFaker() + gspec = core.Genesis{ + Config: params.AllEthashProtocolChanges, + Alloc: core.GenesisAlloc{bankAddr: {Balance: bankFunds}}, + GasLimit: 100000000, + } + oracle *checkpointOracle + ) + genesis := gspec.MustCommit(db) + chain, _ := light.NewLightChain(odr, gspec.Config, engine, nil) + if indexers != nil { + checkpointConfig := ¶ms.CheckpointOracleConfig{ + Address: crypto.CreateAddress(bankAddr, 0), + Signers: []common.Address{signerAddr}, + Threshold: 1, + } + getLocal := func(index uint64) params.TrustedCheckpoint { + chtIndexer := indexers[0] + sectionHead := chtIndexer.SectionHead(index) + return params.TrustedCheckpoint{ + SectionIndex: index, + SectionHead: sectionHead, + CHTRoot: light.GetChtRoot(db, index, sectionHead), + BloomRoot: light.GetBloomTrieRoot(db, index, sectionHead), + } + } + oracle = newCheckpointOracle(checkpointConfig, getLocal) + } + client := &LightEthereum{ + lesCommons: lesCommons{ + genesis: genesis.Hash(), + config: ð.Config{LightPeers: 100, NetworkId: NetworkId}, + chainConfig: params.AllEthashProtocolChanges, + iConfig: light.TestClientIndexerConfig, + chainDb: db, + oracle: oracle, + chainReader: chain, + peers: peers, + closeCh: make(chan struct{}), + }, + reqDist: odr.retriever.dist, + retriever: odr.retriever, + odr: odr, + engine: engine, + blockchain: chain, + eventMux: evmux, + } + client.handler = newClientHandler(ulcServers, ulcFraction, nil, client) + + if client.oracle != nil { + client.oracle.start(backend) + } + return client.handler +} + +func newTestServerHandler(blocks int, indexers []*core.ChainIndexer, db ethdb.Database, peers *peerSet, clock mclock.Clock) (*serverHandler, *backends.SimulatedBackend) { + var ( + gspec = core.Genesis{ + Config: params.AllEthashProtocolChanges, + Alloc: core.GenesisAlloc{bankAddr: {Balance: bankFunds}}, + GasLimit: 100000000, + } + oracle *checkpointOracle + ) + genesis := gspec.MustCommit(db) + + // create a simulation backend and pre-commit several customized block to the database. + simulation := backends.NewSimulatedBackendWithDatabase(db, gspec.Alloc, 100000000) + prepare(blocks, simulation) + + txpoolConfig := core.DefaultTxPoolConfig + txpoolConfig.Journal = "" + txpool := core.NewTxPool(txpoolConfig, gspec.Config, simulation.Blockchain()) + if indexers != nil { + checkpointConfig := ¶ms.CheckpointOracleConfig{ + Address: crypto.CreateAddress(bankAddr, 0), + Signers: []common.Address{signerAddr}, + Threshold: 1, + } + getLocal := func(index uint64) params.TrustedCheckpoint { + chtIndexer := indexers[0] + sectionHead := chtIndexer.SectionHead(index) + return params.TrustedCheckpoint{ + SectionIndex: index, + SectionHead: sectionHead, + CHTRoot: light.GetChtRoot(db, index, sectionHead), + BloomRoot: light.GetBloomTrieRoot(db, index, sectionHead), + } + } + oracle = newCheckpointOracle(checkpointConfig, getLocal) + } + server := &LesServer{ + lesCommons: lesCommons{ + genesis: genesis.Hash(), + config: ð.Config{LightPeers: 100, NetworkId: NetworkId}, + chainConfig: params.AllEthashProtocolChanges, + iConfig: light.TestServerIndexerConfig, + chainDb: db, + chainReader: simulation.Blockchain(), + oracle: oracle, + peers: peers, + closeCh: make(chan struct{}), + }, + servingQueue: newServingQueue(int64(time.Millisecond*10), 1), + defParams: flowcontrol.ServerParams{ + BufLimit: testBufLimit, + MinRecharge: testBufRecharge, + }, + fcManager: flowcontrol.NewClientManager(nil, clock), + } + server.costTracker, server.freeCapacity = newCostTracker(db, server.config) + server.costTracker.testCostList = testCostList(0) // Disable flow control mechanism. + server.clientPool = newClientPool(db, 1, clock, nil) + server.clientPool.setLimits(10000, 10000) // Assign enough capacity for clientpool + server.handler = newServerHandler(server, simulation.Blockchain(), db, txpool, func() bool { return true }) + if server.oracle != nil { + server.oracle.start(simulation) + } + server.servingQueue.setThreads(4) + server.handler.start() + return server.handler, simulation +} + +// testPeer is a simulated peer to allow testing direct network calls. +type testPeer struct { + peer *peer + + net p2p.MsgReadWriter // Network layer reader/writer to simulate remote messaging + app *p2p.MsgPipeRW // Application layer reader/writer to simulate the local side +} + +// newTestPeer creates a new peer registered at the given protocol manager. +func newTestPeer(t *testing.T, name string, version int, handler *serverHandler, shake bool, testCost uint64) (*testPeer, <-chan error) { + // Create a message pipe to communicate through + app, net := p2p.MsgPipe() + + // Generate a random id and create the peer + var id enode.ID + rand.Read(id[:]) + peer := newPeer(version, NetworkId, false, p2p.NewPeer(id, name, nil), net) + + // Start the peer on a new thread + errCh := make(chan error, 1) + go func() { + select { + case <-handler.closeCh: + errCh <- p2p.DiscQuitting + case errCh <- handler.handle(peer): + } + }() + tp := &testPeer{ + app: app, + net: net, + peer: peer, + } + // Execute any implicitly requested handshakes and return + if shake { + // Customize the cost table if required. + if testCost != 0 { + handler.server.costTracker.testCostList = testCostList(testCost) + } + var ( + genesis = handler.blockchain.Genesis() + head = handler.blockchain.CurrentHeader() + td = handler.blockchain.GetTd(head.Hash(), head.Number.Uint64()) + ) + tp.handshake(t, td, head.Hash(), head.Number.Uint64(), genesis.Hash(), testCostList(testCost)) + } + return tp, errCh +} + +// close terminates the local side of the peer, notifying the remote protocol +// manager of termination. +func (p *testPeer) close() { + p.app.Close() +} + +func newTestPeerPair(name string, version int, server *serverHandler, client *clientHandler) (*testPeer, <-chan error, *testPeer, <-chan error) { + // Create a message pipe to communicate through + app, net := p2p.MsgPipe() + + // Generate a random id and create the peer + var id enode.ID + rand.Read(id[:]) + + peer1 := newPeer(version, NetworkId, false, p2p.NewPeer(id, name, nil), net) + peer2 := newPeer(version, NetworkId, false, p2p.NewPeer(id, name, nil), app) + + // Start the peer on a new thread + errc1 := make(chan error, 1) + errc2 := make(chan error, 1) + go func() { + select { + case <-server.closeCh: + errc1 <- p2p.DiscQuitting + case errc1 <- server.handle(peer1): + } + }() + go func() { + select { + case <-client.closeCh: + errc1 <- p2p.DiscQuitting + case errc1 <- client.handle(peer2): + } + }() + return &testPeer{peer: peer1, net: net, app: app}, errc1, &testPeer{peer: peer2, net: app, app: net}, errc2 +} + +// handshake simulates a trivial handshake that expects the same state from the +// remote side as we are simulating locally. +func (p *testPeer) handshake(t *testing.T, td *big.Int, head common.Hash, headNum uint64, genesis common.Hash, costList RequestCostList) { + var expList keyValueList + expList = expList.add("protocolVersion", uint64(p.peer.version)) + expList = expList.add("networkId", uint64(NetworkId)) + expList = expList.add("headTd", td) + expList = expList.add("headHash", head) + expList = expList.add("headNum", headNum) + expList = expList.add("genesisHash", genesis) + sendList := make(keyValueList, len(expList)) + copy(sendList, expList) + expList = expList.add("serveHeaders", nil) + expList = expList.add("serveChainSince", uint64(0)) + expList = expList.add("serveStateSince", uint64(0)) + expList = expList.add("serveRecentState", uint64(core.TriesInMemory-4)) + expList = expList.add("txRelay", nil) + expList = expList.add("flowControl/BL", testBufLimit) + expList = expList.add("flowControl/MRR", testBufRecharge) + expList = expList.add("flowControl/MRC", costList) + + if err := p2p.ExpectMsg(p.app, StatusMsg, expList); err != nil { + t.Fatalf("status recv: %v", err) + } + if err := p2p.Send(p.app, StatusMsg, sendList); err != nil { + t.Fatalf("status send: %v", err) + } + p.peer.fcParams = flowcontrol.ServerParams{ + BufLimit: testBufLimit, + MinRecharge: testBufRecharge, + } +} + +type indexerCallback func(*core.ChainIndexer, *core.ChainIndexer, *core.ChainIndexer) + +// testClient represents a client for testing with necessary auxiliary fields. +type testClient struct { + clock mclock.Clock + db ethdb.Database + peer *testPeer + handler *clientHandler + + chtIndexer *core.ChainIndexer + bloomIndexer *core.ChainIndexer + bloomTrieIndexer *core.ChainIndexer +} + +// testServer represents a server for testing with necessary auxiliary fields. +type testServer struct { + clock mclock.Clock + backend *backends.SimulatedBackend + db ethdb.Database + peer *testPeer + handler *serverHandler + + chtIndexer *core.ChainIndexer + bloomIndexer *core.ChainIndexer + bloomTrieIndexer *core.ChainIndexer +} + +func newServerEnv(t *testing.T, blocks int, protocol int, callback indexerCallback, simClock bool, newPeer bool, testCost uint64) (*testServer, func()) { + db := rawdb.NewMemoryDatabase() + indexers := testIndexers(db, nil, light.TestServerIndexerConfig) + + var clock mclock.Clock = &mclock.System{} + if simClock { + clock = &mclock.Simulated{} + } + handler, b := newTestServerHandler(blocks, indexers, db, newPeerSet(), clock) + + var peer *testPeer + if newPeer { + peer, _ = newTestPeer(t, "peer", protocol, handler, true, testCost) + } + + cIndexer, bIndexer, btIndexer := indexers[0], indexers[1], indexers[2] + cIndexer.Start(handler.blockchain) + bIndexer.Start(handler.blockchain) + + // Wait until indexers generate enough index data. + if callback != nil { + callback(cIndexer, bIndexer, btIndexer) + } + server := &testServer{ + clock: clock, + backend: b, + db: db, + peer: peer, + handler: handler, + chtIndexer: cIndexer, + bloomIndexer: bIndexer, + bloomTrieIndexer: btIndexer, + } + teardown := func() { + if newPeer { + peer.close() + b.Close() + } + cIndexer.Close() + bIndexer.Close() + } + return server, teardown +} + +func newClientServerEnv(t *testing.T, blocks int, protocol int, callback indexerCallback, ulcServers []string, ulcFraction int, simClock bool, connect bool) (*testServer, *testClient, func()) { + sdb, cdb := rawdb.NewMemoryDatabase(), rawdb.NewMemoryDatabase() + speers, cPeers := newPeerSet(), newPeerSet() + + var clock mclock.Clock = &mclock.System{} + if simClock { + clock = &mclock.Simulated{} + } + dist := newRequestDistributor(cPeers, clock) + rm := newRetrieveManager(cPeers, dist, nil) + odr := NewLesOdr(cdb, light.TestClientIndexerConfig, rm) + + sindexers := testIndexers(sdb, nil, light.TestServerIndexerConfig) + cIndexers := testIndexers(cdb, odr, light.TestClientIndexerConfig) + + scIndexer, sbIndexer, sbtIndexer := sindexers[0], sindexers[1], sindexers[2] + ccIndexer, cbIndexer, cbtIndexer := cIndexers[0], cIndexers[1], cIndexers[2] + odr.SetIndexers(ccIndexer, cbIndexer, cbtIndexer) + + server, b := newTestServerHandler(blocks, sindexers, sdb, speers, clock) + client := newTestClientHandler(b, odr, cIndexers, cdb, cPeers, ulcServers, ulcFraction) + + scIndexer.Start(server.blockchain) + sbIndexer.Start(server.blockchain) + ccIndexer.Start(client.backend.blockchain) + cbIndexer.Start(client.backend.blockchain) + + if callback != nil { + callback(scIndexer, sbIndexer, sbtIndexer) + } + var ( + speer, cpeer *testPeer + err1, err2 <-chan error + ) + if connect { + cpeer, err1, speer, err2 = newTestPeerPair("peer", protocol, server, client) + select { + case <-time.After(time.Millisecond * 300): + case err := <-err1: + t.Fatalf("peer 1 handshake error: %v", err) + case err := <-err2: + t.Fatalf("peer 2 handshake error: %v", err) + } + } + s := &testServer{ + clock: clock, + backend: b, + db: sdb, + peer: cpeer, + handler: server, + chtIndexer: scIndexer, + bloomIndexer: sbIndexer, + bloomTrieIndexer: sbtIndexer, + } + c := &testClient{ + clock: clock, + db: cdb, + peer: speer, + handler: client, + chtIndexer: ccIndexer, + bloomIndexer: cbIndexer, + bloomTrieIndexer: cbtIndexer, + } + teardown := func() { + if connect { + speer.close() + cpeer.close() + } + ccIndexer.Close() + cbIndexer.Close() + scIndexer.Close() + sbIndexer.Close() + b.Close() + } + return s, c, teardown +} diff --git a/les/txrelay.go b/les/txrelay.go index 457a2c2a226e..d37a18faffbf 100644 --- a/les/txrelay.go +++ b/les/txrelay.go @@ -17,10 +17,12 @@ package les import ( + "context" "sync" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rlp" ) type ltrInfo struct { @@ -28,69 +30,75 @@ type ltrInfo struct { sentTo map[*peer]struct{} } -type LesTxRelay struct { +type lesTxRelay struct { txSent map[common.Hash]*ltrInfo txPending map[common.Hash]struct{} ps *peerSet peerList []*peer peerStartPos int lock sync.RWMutex + stop chan struct{} - reqDist *requestDistributor + retriever *retrieveManager } -func NewLesTxRelay(ps *peerSet, reqDist *requestDistributor) *LesTxRelay { - r := &LesTxRelay{ +func newLesTxRelay(ps *peerSet, retriever *retrieveManager) *lesTxRelay { + r := &lesTxRelay{ txSent: make(map[common.Hash]*ltrInfo), txPending: make(map[common.Hash]struct{}), ps: ps, - reqDist: reqDist, + retriever: retriever, + stop: make(chan struct{}), } ps.notify(r) return r } -func (self *LesTxRelay) registerPeer(p *peer) { - self.lock.Lock() - defer self.lock.Unlock() +func (ltrx *lesTxRelay) Stop() { + close(ltrx.stop) +} + +func (ltrx *lesTxRelay) registerPeer(p *peer) { + ltrx.lock.Lock() + defer ltrx.lock.Unlock() - self.peerList = self.ps.AllPeers() + ltrx.peerList = ltrx.ps.AllPeers() } -func (self *LesTxRelay) unregisterPeer(p *peer) { - self.lock.Lock() - defer self.lock.Unlock() +func (ltrx *lesTxRelay) unregisterPeer(p *peer) { + ltrx.lock.Lock() + defer ltrx.lock.Unlock() - self.peerList = self.ps.AllPeers() + ltrx.peerList = ltrx.ps.AllPeers() } // send sends a list of transactions to at most a given number of peers at // once, never resending any particular transaction to the same peer twice -func (self *LesTxRelay) send(txs types.Transactions, count int) { +func (ltrx *lesTxRelay) send(txs types.Transactions, count int) { sendTo := make(map[*peer]types.Transactions) - self.peerStartPos++ // rotate the starting position of the peer list - if self.peerStartPos >= len(self.peerList) { - self.peerStartPos = 0 + ltrx.peerStartPos++ // rotate the starting position of the peer list + if ltrx.peerStartPos >= len(ltrx.peerList) { + ltrx.peerStartPos = 0 } for _, tx := range txs { hash := tx.Hash() - ltr, ok := self.txSent[hash] + ltr, ok := ltrx.txSent[hash] if !ok { ltr = <rInfo{ tx: tx, sentTo: make(map[*peer]struct{}), } - self.txSent[hash] = ltr - self.txPending[hash] = struct{}{} + ltrx.txSent[hash] = ltr + ltrx.txPending[hash] = struct{}{} } - if len(self.peerList) > 0 { + if len(ltrx.peerList) > 0 { cnt := count - pos := self.peerStartPos + pos := ltrx.peerStartPos for { - peer := self.peerList[pos] + peer := ltrx.peerList[pos] if _, ok := ltr.sentTo[peer]; !ok { sendTo[peer] = append(sendTo[peer], tx) ltr.sentTo[peer] = struct{}{} @@ -100,10 +108,10 @@ func (self *LesTxRelay) send(txs types.Transactions, count int) { break // sent it to the desired number of peers } pos++ - if pos == len(self.peerList) { + if pos == len(ltrx.peerList) { pos = 0 } - if pos == self.peerStartPos { + if pos == ltrx.peerStartPos { break // tried all available peers } } @@ -113,63 +121,64 @@ func (self *LesTxRelay) send(txs types.Transactions, count int) { for p, list := range sendTo { pp := p ll := list + enc, _ := rlp.EncodeToBytes(ll) reqID := genReqID() rq := &distReq{ getCost: func(dp distPeer) uint64 { peer := dp.(*peer) - return peer.GetRequestCost(SendTxMsg, len(ll)) + return peer.GetTxRelayCost(len(ll), len(enc)) }, canSend: func(dp distPeer) bool { - return dp.(*peer) == pp + return !dp.(*peer).onlyAnnounce && dp.(*peer) == pp }, request: func(dp distPeer) func() { peer := dp.(*peer) - cost := peer.GetRequestCost(SendTxMsg, len(ll)) - peer.fcServer.QueueRequest(reqID, cost) - return func() { peer.SendTxs(reqID, cost, ll) } + cost := peer.GetTxRelayCost(len(ll), len(enc)) + peer.fcServer.QueuedRequest(reqID, cost) + return func() { peer.SendTxs(reqID, cost, enc) } }, } - self.reqDist.queue(rq) + go ltrx.retriever.retrieve(context.Background(), reqID, rq, func(p distPeer, msg *Msg) error { return nil }, ltrx.stop) } } -func (self *LesTxRelay) Send(txs types.Transactions) { - self.lock.Lock() - defer self.lock.Unlock() +func (ltrx *lesTxRelay) Send(txs types.Transactions) { + ltrx.lock.Lock() + defer ltrx.lock.Unlock() - self.send(txs, 3) + ltrx.send(txs, 3) } -func (self *LesTxRelay) NewHead(head common.Hash, mined []common.Hash, rollback []common.Hash) { - self.lock.Lock() - defer self.lock.Unlock() +func (ltrx *lesTxRelay) NewHead(head common.Hash, mined []common.Hash, rollback []common.Hash) { + ltrx.lock.Lock() + defer ltrx.lock.Unlock() for _, hash := range mined { - delete(self.txPending, hash) + delete(ltrx.txPending, hash) } for _, hash := range rollback { - self.txPending[hash] = struct{}{} + ltrx.txPending[hash] = struct{}{} } - if len(self.txPending) > 0 { - txs := make(types.Transactions, len(self.txPending)) + if len(ltrx.txPending) > 0 { + txs := make(types.Transactions, len(ltrx.txPending)) i := 0 - for hash := range self.txPending { - txs[i] = self.txSent[hash].tx + for hash := range ltrx.txPending { + txs[i] = ltrx.txSent[hash].tx i++ } - self.send(txs, 1) + ltrx.send(txs, 1) } } -func (self *LesTxRelay) Discard(hashes []common.Hash) { - self.lock.Lock() - defer self.lock.Unlock() +func (ltrx *lesTxRelay) Discard(hashes []common.Hash) { + ltrx.lock.Lock() + defer ltrx.lock.Unlock() for _, hash := range hashes { - delete(self.txSent, hash) - delete(self.txPending, hash) + delete(ltrx.txSent, hash) + delete(ltrx.txPending, hash) } } diff --git a/les/ulc.go b/les/ulc.go new file mode 100644 index 000000000000..b97217e79663 --- /dev/null +++ b/les/ulc.go @@ -0,0 +1,54 @@ +// Copyright 2019 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 ( + "errors" + + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" +) + +type ulc struct { + keys map[string]bool + fraction int +} + +// newULC creates and returns an ultra light client instance. +func newULC(servers []string, fraction int) (*ulc, error) { + keys := make(map[string]bool) + for _, id := range servers { + node, err := enode.Parse(enode.ValidSchemes, id) + if err != nil { + log.Warn("Failed to parse trusted server", "id", id, "err", err) + continue + } + keys[node.ID().String()] = true + } + if len(keys) == 0 { + return nil, errors.New("no trusted servers") + } + return &ulc{ + keys: keys, + fraction: fraction, + }, nil +} + +// trusted return an indicator that whether the specified peer is trusted. +func (u *ulc) trusted(p enode.ID) bool { + return u.keys[p.String()] +} diff --git a/les/ulc_test.go b/les/ulc_test.go new file mode 100644 index 000000000000..9112bf928c18 --- /dev/null +++ b/les/ulc_test.go @@ -0,0 +1,143 @@ +// Copyright 2018 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 ( + "crypto/rand" + "fmt" + "net" + "testing" + "time" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" +) + +func TestULCAnnounceThresholdLes2(t *testing.T) { testULCAnnounceThreshold(t, 2) } +func TestULCAnnounceThresholdLes3(t *testing.T) { testULCAnnounceThreshold(t, 3) } + +func testULCAnnounceThreshold(t *testing.T, protocol int) { + // todo figure out why it takes fetcher so longer to fetcher the announced header. + t.Skip("Sometimes it can failed") + var cases = []struct { + height []int + threshold int + expect uint64 + }{ + {[]int{1}, 100, 1}, + {[]int{0, 0, 0}, 100, 0}, + {[]int{1, 2, 3}, 30, 3}, + {[]int{1, 2, 3}, 60, 2}, + {[]int{3, 2, 1}, 67, 1}, + {[]int{3, 2, 1}, 100, 1}, + } + for _, testcase := range cases { + var ( + servers []*testServer + teardowns []func() + nodes []*enode.Node + ids []string + ) + for i := 0; i < len(testcase.height); i++ { + s, n, teardown := newServerPeer(t, 0, protocol) + + servers = append(servers, s) + nodes = append(nodes, n) + teardowns = append(teardowns, teardown) + ids = append(ids, n.String()) + } + c, teardown := newLightPeer(t, protocol, ids, testcase.threshold) + + // Connect all servers. + for i := 0; i < len(servers); i++ { + connect(servers[i].handler, nodes[i].ID(), c.handler, protocol) + } + for i := 0; i < len(servers); i++ { + for j := 0; j < testcase.height[i]; j++ { + servers[i].backend.Commit() + } + } + time.Sleep(1500 * time.Millisecond) // Ensure the fetcher has done its work. + head := c.handler.backend.blockchain.CurrentHeader().Number.Uint64() + if head != testcase.expect { + t.Fatalf("chain height mismatch, want %d, got %d", testcase.expect, head) + } + + // Release all servers and client resources. + teardown() + for i := 0; i < len(teardowns); i++ { + teardowns[i]() + } + } +} + +func connect(server *serverHandler, serverId enode.ID, client *clientHandler, protocol int) (*peer, *peer, error) { + // Create a message pipe to communicate through + app, net := p2p.MsgPipe() + + var id enode.ID + rand.Read(id[:]) + + peer1 := newPeer(protocol, NetworkId, true, p2p.NewPeer(serverId, "", nil), net) // Mark server as trusted + peer2 := newPeer(protocol, NetworkId, false, p2p.NewPeer(id, "", nil), app) + + // Start the peerLight on a new thread + errc1 := make(chan error, 1) + errc2 := make(chan error, 1) + go func() { + select { + case <-server.closeCh: + errc1 <- p2p.DiscQuitting + case errc1 <- server.handle(peer2): + } + }() + go func() { + select { + case <-client.closeCh: + errc1 <- p2p.DiscQuitting + case errc1 <- client.handle(peer1): + } + }() + + select { + case <-time.After(time.Millisecond * 100): + case err := <-errc1: + return nil, nil, fmt.Errorf("peerLight handshake error: %v", err) + case err := <-errc2: + return nil, nil, fmt.Errorf("peerFull handshake error: %v", err) + } + return peer1, peer2, nil +} + +// newServerPeer creates server peer. +func newServerPeer(t *testing.T, blocks int, protocol int) (*testServer, *enode.Node, func()) { + s, teardown := newServerEnv(t, blocks, protocol, nil, false, false, 0) + key, err := crypto.GenerateKey() + if err != nil { + t.Fatal("generate key err:", err) + } + s.handler.server.privateKey = key + n := enode.NewV4(&key.PublicKey, net.ParseIP("127.0.0.1"), 35000, 35000) + return s, n, teardown +} + +// newLightPeer creates node with light sync mode +func newLightPeer(t *testing.T, protocol int, ulcServers []string, ulcFraction int) (*testClient, func()) { + _, c, teardown := newClientServerEnv(t, 0, protocol, nil, ulcServers, ulcFraction, false, false) + return c, teardown +} diff --git a/light/lightchain.go b/light/lightchain.go index 2439c4a4426b..90ea26323754 100644 --- a/light/lightchain.go +++ b/light/lightchain.go @@ -14,6 +14,8 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . +// Package light implements on-demand retrieval capable state and chain objects +// for the Ethereum Light Client. package light import ( @@ -24,18 +26,18 @@ import ( "sync/atomic" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" - "github.com/hashicorp/golang-lru" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + lru "github.com/hashicorp/golang-lru" ) var ( @@ -50,6 +52,7 @@ type LightChain struct { hc *core.HeaderChain indexerConfig *IndexerConfig chainDb ethdb.Database + engine consensus.Engine odr OdrBackend chainFeed event.Feed chainSideFeed event.Feed @@ -57,26 +60,24 @@ type LightChain struct { scope event.SubscriptionScope genesisBlock *types.Block - mu sync.RWMutex - chainmu 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 blockCache *lru.Cache // Cache for the most recent entire blocks + chainmu sync.RWMutex // protects header inserts quit chan struct{} - running int32 // running must be called automically - // procInterrupt must be atomically called - procInterrupt int32 // interrupt signaler for block processing - wg sync.WaitGroup + wg sync.WaitGroup - engine consensus.Engine + // Atomic boolean switches: + running int32 // whether LightChain is running or stopped + procInterrupt int32 // interrupts chain insert + disableCheckFreq int32 // disables header verification } // 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) (*LightChain, error) { +func NewLightChain(odr OdrBackend, config *params.ChainConfig, engine consensus.Engine, checkpoint *params.TrustedCheckpoint) (*LightChain, error) { bodyCache, _ := lru.New(bodyCacheLimit) bodyRLPCache, _ := lru.New(bodyCacheLimit) blockCache, _ := lru.New(blockCacheLimit) @@ -100,8 +101,8 @@ func NewLightChain(odr OdrBackend, config *params.ChainConfig, engine consensus. if bc.genesisBlock == nil { return nil, core.ErrNoGenesis } - if cp, ok := trustedCheckpoints[bc.genesisBlock.Hash()]; ok { - bc.addTrustedCheckpoint(cp) + if checkpoint != nil { + bc.AddTrustedCheckpoint(checkpoint) } if err := bc.loadLastState(); err != nil { return nil, err @@ -117,228 +118,232 @@ 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 *params.TrustedCheckpoint) { - if self.odr.ChtIndexer() != nil { - StoreChtRoot(self.chainDb, cp.SectionIndex, cp.SectionHead, cp.CHTRoot) - self.odr.ChtIndexer().AddCheckpoint(cp.SectionIndex, cp.SectionHead) +// AddTrustedCheckpoint adds a trusted checkpoint to the blockchain +func (lc *LightChain) AddTrustedCheckpoint(cp *params.TrustedCheckpoint) { + if lc.odr.ChtIndexer() != nil { + StoreChtRoot(lc.chainDb, cp.SectionIndex, cp.SectionHead, cp.CHTRoot) + lc.odr.ChtIndexer().AddCheckpoint(cp.SectionIndex, cp.SectionHead) } - if self.odr.BloomTrieIndexer() != nil { - StoreBloomTrieRoot(self.chainDb, cp.SectionIndex, cp.SectionHead, cp.BloomRoot) - self.odr.BloomTrieIndexer().AddCheckpoint(cp.SectionIndex, cp.SectionHead) + if lc.odr.BloomTrieIndexer() != nil { + StoreBloomTrieRoot(lc.chainDb, cp.SectionIndex, cp.SectionHead, cp.BloomRoot) + lc.odr.BloomTrieIndexer().AddCheckpoint(cp.SectionIndex, cp.SectionHead) } - if self.odr.BloomIndexer() != nil { - self.odr.BloomIndexer().AddCheckpoint(cp.SectionIndex, cp.SectionHead) + if lc.odr.BloomIndexer() != nil { + lc.odr.BloomIndexer().AddCheckpoint(cp.SectionIndex, cp.SectionHead) } - log.Info("Added trusted checkpoint", "chain", cp.Name, "block", (cp.SectionIndex+1)*self.indexerConfig.ChtSize-1, "hash", cp.SectionHead) + log.Info("Added trusted checkpoint", "block", (cp.SectionIndex+1)*lc.indexerConfig.ChtSize-1, "hash", cp.SectionHead) } -func (self *LightChain) getProcInterrupt() bool { - return atomic.LoadInt32(&self.procInterrupt) == 1 +func (lc *LightChain) getProcInterrupt() bool { + return atomic.LoadInt32(&lc.procInterrupt) == 1 } // Odr returns the ODR backend of the chain -func (self *LightChain) Odr() OdrBackend { - return self.odr +func (lc *LightChain) Odr() OdrBackend { + return lc.odr +} + +// HeaderChain returns the underlying header chain. +func (lc *LightChain) HeaderChain() *core.HeaderChain { + return lc.hc } // loadLastState loads the last known chain state from the database. This method // assumes that the chain manager mutex is held. -func (self *LightChain) loadLastState() error { - if head := rawdb.ReadHeadHeaderHash(self.chainDb); head == (common.Hash{}) { +func (lc *LightChain) loadLastState() error { + if head := rawdb.ReadHeadHeaderHash(lc.chainDb); head == (common.Hash{}) { // Corrupt or empty database, init from scratch - self.Reset() + lc.Reset() } else { - if header := self.GetHeaderByHash(head); header != nil { - self.hc.SetCurrentHeader(header) + if header := lc.GetHeaderByHash(head); header != nil { + lc.hc.SetCurrentHeader(header) } } // Issue a status log and return - header := self.hc.CurrentHeader() - headerTd := self.GetTd(header.Hash(), header.Number.Uint64()) - log.Info("Loaded most recent local header", "number", header.Number, "hash", header.Hash(), "td", headerTd, "age", common.PrettyAge(time.Unix(header.Time.Int64(), 0))) + header := lc.hc.CurrentHeader() + headerTd := lc.GetTd(header.Hash(), header.Number.Uint64()) + log.Info("Loaded most recent local header", "number", header.Number, "hash", header.Hash(), "td", headerTd, "age", common.PrettyAge(time.Unix(int64(header.Time), 0))) return nil } // SetHead rewinds the local chain to a new head. Everything above the new // head will be deleted and the new one set. -func (bc *LightChain) SetHead(head uint64) { - bc.mu.Lock() - defer bc.mu.Unlock() +func (lc *LightChain) SetHead(head uint64) error { + lc.chainmu.Lock() + defer lc.chainmu.Unlock() - bc.hc.SetHead(head, nil) - bc.loadLastState() + lc.hc.SetHead(head, nil, nil) + return lc.loadLastState() } // GasLimit returns the gas limit of the current HEAD block. -func (self *LightChain) GasLimit() uint64 { - return self.hc.CurrentHeader().GasLimit +func (lc *LightChain) GasLimit() uint64 { + return lc.hc.CurrentHeader().GasLimit } // Reset purges the entire blockchain, restoring it to its genesis state. -func (bc *LightChain) Reset() { - bc.ResetWithGenesisBlock(bc.genesisBlock) +func (lc *LightChain) Reset() { + lc.ResetWithGenesisBlock(lc.genesisBlock) } // ResetWithGenesisBlock purges the entire blockchain, restoring it to the // specified genesis state. -func (bc *LightChain) ResetWithGenesisBlock(genesis *types.Block) { +func (lc *LightChain) ResetWithGenesisBlock(genesis *types.Block) { // Dump the entire block chain and purge the caches - bc.SetHead(0) + lc.SetHead(0) - bc.mu.Lock() - defer bc.mu.Unlock() + lc.chainmu.Lock() + defer lc.chainmu.Unlock() // Prepare the genesis block and reinitialise the chain - rawdb.WriteTd(bc.chainDb, genesis.Hash(), genesis.NumberU64(), genesis.Difficulty()) - rawdb.WriteBlock(bc.chainDb, genesis) + rawdb.WriteTd(lc.chainDb, genesis.Hash(), genesis.NumberU64(), genesis.Difficulty()) + rawdb.WriteBlock(lc.chainDb, genesis) - bc.genesisBlock = genesis - bc.hc.SetGenesis(bc.genesisBlock.Header()) - bc.hc.SetCurrentHeader(bc.genesisBlock.Header()) + lc.genesisBlock = genesis + lc.hc.SetGenesis(lc.genesisBlock.Header()) + lc.hc.SetCurrentHeader(lc.genesisBlock.Header()) } // Accessors // Engine retrieves the light chain's consensus engine. -func (bc *LightChain) Engine() consensus.Engine { return bc.engine } +func (lc *LightChain) Engine() consensus.Engine { return lc.engine } // Genesis returns the genesis block -func (bc *LightChain) Genesis() *types.Block { - return bc.genesisBlock +func (lc *LightChain) Genesis() *types.Block { + return lc.genesisBlock } -// State returns a new mutable state based on the current HEAD block. -func (bc *LightChain) State() (*state.StateDB, error) { - return nil, errors.New("not implemented, needs client/server interface split") +func (lc *LightChain) StateCache() state.Database { + panic("not implemented") } // GetBody retrieves a block body (transactions and uncles) from the database // or ODR service by hash, caching it if found. -func (self *LightChain) GetBody(ctx context.Context, hash common.Hash) (*types.Body, error) { +func (lc *LightChain) GetBody(ctx context.Context, hash common.Hash) (*types.Body, error) { // Short circuit if the body's already in the cache, retrieve otherwise - if cached, ok := self.bodyCache.Get(hash); ok { + if cached, ok := lc.bodyCache.Get(hash); ok { body := cached.(*types.Body) return body, nil } - number := self.hc.GetBlockNumber(hash) + number := lc.hc.GetBlockNumber(hash) if number == nil { return nil, errors.New("unknown block") } - body, err := GetBody(ctx, self.odr, hash, *number) + body, err := GetBody(ctx, lc.odr, hash, *number) if err != nil { return nil, err } // Cache the found body for next time and return - self.bodyCache.Add(hash, body) + lc.bodyCache.Add(hash, body) return body, nil } // GetBodyRLP retrieves a block body in RLP encoding from the database or // ODR service by hash, caching it if found. -func (self *LightChain) GetBodyRLP(ctx context.Context, hash common.Hash) (rlp.RawValue, error) { +func (lc *LightChain) GetBodyRLP(ctx context.Context, hash common.Hash) (rlp.RawValue, error) { // Short circuit if the body's already in the cache, retrieve otherwise - if cached, ok := self.bodyRLPCache.Get(hash); ok { + if cached, ok := lc.bodyRLPCache.Get(hash); ok { return cached.(rlp.RawValue), nil } - number := self.hc.GetBlockNumber(hash) + number := lc.hc.GetBlockNumber(hash) if number == nil { return nil, errors.New("unknown block") } - body, err := GetBodyRLP(ctx, self.odr, hash, *number) + body, err := GetBodyRLP(ctx, lc.odr, hash, *number) if err != nil { return nil, err } // Cache the found body for next time and return - self.bodyRLPCache.Add(hash, body) + lc.bodyRLPCache.Add(hash, body) return body, nil } // HasBlock checks if a block is fully present in the database or not, caching // it if present. -func (bc *LightChain) HasBlock(hash common.Hash, number uint64) bool { - blk, _ := bc.GetBlock(NoOdr, hash, number) +func (lc *LightChain) HasBlock(hash common.Hash, number uint64) bool { + blk, _ := lc.GetBlock(NoOdr, hash, number) return blk != nil } // GetBlock retrieves a block from the database or ODR service by hash and number, // caching it if found. -func (self *LightChain) GetBlock(ctx context.Context, hash common.Hash, number uint64) (*types.Block, error) { +func (lc *LightChain) GetBlock(ctx context.Context, hash common.Hash, number uint64) (*types.Block, error) { // Short circuit if the block's already in the cache, retrieve otherwise - if block, ok := self.blockCache.Get(hash); ok { + if block, ok := lc.blockCache.Get(hash); ok { return block.(*types.Block), nil } - block, err := GetBlock(ctx, self.odr, hash, number) + block, err := GetBlock(ctx, lc.odr, hash, number) if err != nil { return nil, err } // Cache the found block for next time and return - self.blockCache.Add(block.Hash(), block) + lc.blockCache.Add(block.Hash(), block) return block, nil } // GetBlockByHash retrieves a block from the database or ODR service by hash, // caching it if found. -func (self *LightChain) GetBlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { - number := self.hc.GetBlockNumber(hash) +func (lc *LightChain) GetBlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) { + number := lc.hc.GetBlockNumber(hash) if number == nil { return nil, errors.New("unknown block") } - return self.GetBlock(ctx, hash, *number) + return lc.GetBlock(ctx, hash, *number) } // GetBlockByNumber retrieves a block from the database or ODR service by // number, caching it (associated with its hash) if found. -func (self *LightChain) GetBlockByNumber(ctx context.Context, number uint64) (*types.Block, error) { - hash, err := GetCanonicalHash(ctx, self.odr, number) +func (lc *LightChain) GetBlockByNumber(ctx context.Context, number uint64) (*types.Block, error) { + hash, err := GetCanonicalHash(ctx, lc.odr, number) if hash == (common.Hash{}) || err != nil { return nil, err } - return self.GetBlock(ctx, hash, number) + return lc.GetBlock(ctx, hash, number) } // Stop stops the blockchain service. If any imports are currently in progress // it will abort them using the procInterrupt. -func (bc *LightChain) Stop() { - if !atomic.CompareAndSwapInt32(&bc.running, 0, 1) { +func (lc *LightChain) Stop() { + if !atomic.CompareAndSwapInt32(&lc.running, 0, 1) { return } - close(bc.quit) - atomic.StoreInt32(&bc.procInterrupt, 1) + close(lc.quit) + atomic.StoreInt32(&lc.procInterrupt, 1) - bc.wg.Wait() + lc.wg.Wait() log.Info("Blockchain manager stopped") } // Rollback is designed to remove a chain of links from the database that aren't // certain enough to be valid. -func (self *LightChain) Rollback(chain []common.Hash) { - self.mu.Lock() - defer self.mu.Unlock() +func (lc *LightChain) Rollback(chain []common.Hash) { + lc.chainmu.Lock() + defer lc.chainmu.Unlock() for i := len(chain) - 1; i >= 0; i-- { hash := chain[i] - if head := self.hc.CurrentHeader(); head.Hash() == hash { - self.hc.SetCurrentHeader(self.GetHeader(head.ParentHash, head.Number.Uint64()-1)) + if head := lc.hc.CurrentHeader(); head.Hash() == hash { + lc.hc.SetCurrentHeader(lc.GetHeader(head.ParentHash, head.Number.Uint64()-1)) } } } // postChainEvents iterates over the events generated by a chain insertion and // posts them into the event feed. -func (self *LightChain) postChainEvents(events []interface{}) { +func (lc *LightChain) postChainEvents(events []interface{}) { for _, event := range events { switch ev := event.(type) { case core.ChainEvent: - if self.CurrentHeader().Hash() == ev.Hash { - self.chainHeadFeed.Send(core.ChainHeadEvent{Block: ev.Block}) + if lc.CurrentHeader().Hash() == ev.Hash { + lc.chainHeadFeed.Send(core.ChainHeadEvent{Block: ev.Block}) } - self.chainFeed.Send(ev) + lc.chainFeed.Send(ev) case core.ChainSideEvent: - self.chainSideFeed.Send(ev) + lc.chainSideFeed.Send(ev) } } } @@ -354,28 +359,25 @@ func (self *LightChain) postChainEvents(events []interface{}) { // // In the case of a light chain, InsertHeaderChain also creates and posts light // chain events when necessary. -func (self *LightChain) InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error) { +func (lc *LightChain) InsertHeaderChain(chain []*types.Header, checkFreq int) (int, error) { + if atomic.LoadInt32(&lc.disableCheckFreq) == 1 { + checkFreq = 0 + } start := time.Now() - if i, err := self.hc.ValidateHeaderChain(chain, checkFreq); err != nil { + if i, err := lc.hc.ValidateHeaderChain(chain, checkFreq); err != nil { return i, err } // Make sure only one thread manipulates the chain at once - self.chainmu.Lock() - defer func() { - self.chainmu.Unlock() - time.Sleep(time.Millisecond * 10) // ugly hack; do not hog chain lock in case syncing is CPU-limited by validation - }() + lc.chainmu.Lock() + defer lc.chainmu.Unlock() - self.wg.Add(1) - defer self.wg.Done() + lc.wg.Add(1) + defer lc.wg.Done() var events []interface{} whFunc := func(header *types.Header) error { - self.mu.Lock() - defer self.mu.Unlock() - - status, err := self.hc.WriteHeader(header) + status, err := lc.hc.WriteHeader(header) switch status { case core.CanonStatTy: @@ -388,51 +390,56 @@ func (self *LightChain) InsertHeaderChain(chain []*types.Header, checkFreq int) } return err } - i, err := self.hc.InsertHeaderChain(chain, whFunc, start) - self.postChainEvents(events) + i, err := lc.hc.InsertHeaderChain(chain, whFunc, start) + lc.postChainEvents(events) return i, err } // CurrentHeader retrieves the current head header of the canonical chain. The // header is retrieved from the HeaderChain's internal cache. -func (self *LightChain) CurrentHeader() *types.Header { - return self.hc.CurrentHeader() +func (lc *LightChain) CurrentHeader() *types.Header { + return lc.hc.CurrentHeader() } // GetTd retrieves a block's total difficulty in the canonical chain from the // database by hash and number, caching it if found. -func (self *LightChain) GetTd(hash common.Hash, number uint64) *big.Int { - return self.hc.GetTd(hash, number) +func (lc *LightChain) GetTd(hash common.Hash, number uint64) *big.Int { + return lc.hc.GetTd(hash, number) } // GetTdByHash retrieves a block's total difficulty in the canonical chain from the // database by hash, caching it if found. -func (self *LightChain) GetTdByHash(hash common.Hash) *big.Int { - return self.hc.GetTdByHash(hash) +func (lc *LightChain) GetTdByHash(hash common.Hash) *big.Int { + return lc.hc.GetTdByHash(hash) } // GetHeader retrieves a block header from the database by hash and number, // caching it if found. -func (self *LightChain) GetHeader(hash common.Hash, number uint64) *types.Header { - return self.hc.GetHeader(hash, number) +func (lc *LightChain) GetHeader(hash common.Hash, number uint64) *types.Header { + return lc.hc.GetHeader(hash, number) } // GetHeaderByHash retrieves a block header from the database by hash, caching it if // found. -func (self *LightChain) GetHeaderByHash(hash common.Hash) *types.Header { - return self.hc.GetHeaderByHash(hash) +func (lc *LightChain) GetHeaderByHash(hash common.Hash) *types.Header { + return lc.hc.GetHeaderByHash(hash) } // HasHeader checks if a block header is present in the database or not, caching // it if present. -func (bc *LightChain) HasHeader(hash common.Hash, number uint64) bool { - return bc.hc.HasHeader(hash, number) +func (lc *LightChain) HasHeader(hash common.Hash, number uint64) bool { + return lc.hc.HasHeader(hash, number) +} + +// GetCanonicalHash returns the canonical hash for a given block number +func (bc *LightChain) GetCanonicalHash(number uint64) common.Hash { + return bc.hc.GetCanonicalHash(number) } // GetBlockHashesFromHash retrieves a number of block hashes starting at a given // hash, fetching towards the genesis block. -func (self *LightChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash { - return self.hc.GetBlockHashesFromHash(hash, max) +func (lc *LightChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []common.Hash { + return lc.hc.GetBlockHashesFromHash(hash, max) } // GetAncestor retrieves the Nth ancestor of a given block. It assumes that either the given block or @@ -440,56 +447,53 @@ func (self *LightChain) GetBlockHashesFromHash(hash common.Hash, max uint64) []c // number of blocks to be individually checked before we reach the canonical chain. // // Note: ancestor == 0 returns the same block, 1 returns its parent and so on. -func (bc *LightChain) GetAncestor(hash common.Hash, number, ancestor uint64, maxNonCanonical *uint64) (common.Hash, uint64) { - bc.chainmu.Lock() - defer bc.chainmu.Unlock() - - return bc.hc.GetAncestor(hash, number, ancestor, maxNonCanonical) +func (lc *LightChain) GetAncestor(hash common.Hash, number, ancestor uint64, maxNonCanonical *uint64) (common.Hash, uint64) { + return lc.hc.GetAncestor(hash, number, ancestor, maxNonCanonical) } // GetHeaderByNumber retrieves a block header from the database by number, // caching it (associated with its hash) if found. -func (self *LightChain) GetHeaderByNumber(number uint64) *types.Header { - return self.hc.GetHeaderByNumber(number) +func (lc *LightChain) GetHeaderByNumber(number uint64) *types.Header { + return lc.hc.GetHeaderByNumber(number) } // GetHeaderByNumberOdr retrieves a block header from the database or network // by number, caching it (associated with its hash) if found. -func (self *LightChain) GetHeaderByNumberOdr(ctx context.Context, number uint64) (*types.Header, error) { - if header := self.hc.GetHeaderByNumber(number); header != nil { +func (lc *LightChain) GetHeaderByNumberOdr(ctx context.Context, number uint64) (*types.Header, error) { + if header := lc.hc.GetHeaderByNumber(number); header != nil { return header, nil } - return GetHeaderByNumber(ctx, self.odr, number) + return GetHeaderByNumber(ctx, lc.odr, number) } // Config retrieves the header chain's chain configuration. -func (self *LightChain) Config() *params.ChainConfig { return self.hc.Config() } +func (lc *LightChain) Config() *params.ChainConfig { return lc.hc.Config() } -func (self *LightChain) SyncCht(ctx context.Context) bool { - // If we don't have a CHT indexer, abort - if self.odr.ChtIndexer() == nil { - return false - } - // Ensure the remote CHT head is ahead of us - head := self.CurrentHeader().Number.Uint64() - sections, _, _ := self.odr.ChtIndexer().Sections() - - latest := sections*self.indexerConfig.ChtSize - 1 - if clique := self.hc.Config().Clique; clique != nil { +// SyncCheckpoint fetches the checkpoint point block header according to +// the checkpoint provided by the remote peer. +// +// Note if we are running the clique, fetches the last epoch snapshot header +// which covered by checkpoint. +func (lc *LightChain) SyncCheckpoint(ctx context.Context, checkpoint *params.TrustedCheckpoint) bool { + // Ensure the remote checkpoint head is ahead of us + head := lc.CurrentHeader().Number.Uint64() + + latest := (checkpoint.SectionIndex+1)*lc.indexerConfig.ChtSize - 1 + if clique := lc.hc.Config().Clique; clique != nil { latest -= latest % clique.Epoch // epoch snapshot for clique } if head >= latest { - return false + return true } // Retrieve the latest useful header and update to it - if header, err := GetHeaderByNumber(ctx, self.odr, latest); header != nil && err == nil { - self.mu.Lock() - defer self.mu.Unlock() + if header, err := GetHeaderByNumber(ctx, lc.odr, latest); header != nil && err == nil { + lc.chainmu.Lock() + defer lc.chainmu.Unlock() // Ensure the chain didn't move past the latest block while retrieving it - if self.hc.CurrentHeader().Number.Uint64() < header.Number.Uint64() { - log.Info("Updated latest header based on CHT", "number", header.Number, "hash", header.Hash(), "age", common.PrettyAge(time.Unix(header.Time.Int64(), 0))) - self.hc.SetCurrentHeader(header) + if lc.hc.CurrentHeader().Number.Uint64() < header.Number.Uint64() { + log.Info("Updated latest header based on CHT", "number", header.Number, "hash", header.Hash(), "age", common.PrettyAge(time.Unix(int64(header.Time), 0))) + lc.hc.SetCurrentHeader(header) } return true } @@ -498,38 +502,48 @@ func (self *LightChain) SyncCht(ctx context.Context) bool { // LockChain locks the chain mutex for reading so that multiple canonical hashes can be // retrieved while it is guaranteed that they belong to the same version of the chain -func (self *LightChain) LockChain() { - self.chainmu.RLock() +func (lc *LightChain) LockChain() { + lc.chainmu.RLock() } // UnlockChain unlocks the chain mutex -func (self *LightChain) UnlockChain() { - self.chainmu.RUnlock() +func (lc *LightChain) UnlockChain() { + lc.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)) +func (lc *LightChain) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription { + return lc.scope.Track(lc.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)) +func (lc *LightChain) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription { + return lc.scope.Track(lc.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)) +func (lc *LightChain) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription { + return lc.scope.Track(lc.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)) +func (lc *LightChain) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription { + return lc.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)) +func (lc *LightChain) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription { + return lc.scope.Track(new(event.Feed).Subscribe(ch)) +} + +// DisableCheckFreq disables header validation. This is used for ultralight mode. +func (lc *LightChain) DisableCheckFreq() { + atomic.StoreInt32(&lc.disableCheckFreq, 1) +} + +// EnableCheckFreq enables header validation. +func (lc *LightChain) EnableCheckFreq() { + atomic.StoreInt32(&lc.disableCheckFreq, 0) } diff --git a/light/lightchain_test.go b/light/lightchain_test.go index cdb56f5fd899..70d2e70c189d 100644 --- a/light/lightchain_test.go +++ b/light/lightchain_test.go @@ -21,13 +21,13 @@ import ( "math/big" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/params" ) // So we can deterministically seed different blockchains @@ -52,10 +52,10 @@ func makeHeaderChain(parent *types.Header, n int, db ethdb.Database, seed int) [ // chain. Depending on the full flag, if creates either a full block chain or a // header only chain. func newCanonical(n int) (ethdb.Database, *LightChain, error) { - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() gspec := core.Genesis{Config: params.TestChainConfig} genesis := gspec.MustCommit(db) - blockchain, _ := NewLightChain(&dummyOdr{db: db, indexerConfig: TestClientIndexerConfig}, gspec.Config, ethash.NewFaker()) + blockchain, _ := NewLightChain(&dummyOdr{db: db, indexerConfig: TestClientIndexerConfig}, gspec.Config, ethash.NewFaker(), nil) // Create and inject the requested chain if n == 0 { @@ -69,13 +69,13 @@ func newCanonical(n int) (ethdb.Database, *LightChain, error) { // newTestLightChain creates a LightChain that doesn't validate anything. func newTestLightChain() *LightChain { - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() gspec := &core.Genesis{ Difficulty: big.NewInt(1), Config: params.TestChainConfig, } gspec.MustCommit(db) - lc, err := NewLightChain(&dummyOdr{db: db}, gspec.Config, ethash.NewFullFaker()) + lc, err := NewLightChain(&dummyOdr{db: db}, gspec.Config, ethash.NewFullFaker(), nil) if err != nil { panic(err) } @@ -122,10 +122,10 @@ func testHeaderChainImport(chain []*types.Header, lightchain *LightChain) error return err } // Manually insert the header into the database, but don't reorganize (allows subsequent testing) - lightchain.mu.Lock() + lightchain.chainmu.Lock() rawdb.WriteTd(lightchain.chainDb, header.Hash(), header.Number.Uint64(), new(big.Int).Add(header.Difficulty, lightchain.GetTdByHash(header.ParentHash))) rawdb.WriteHeader(lightchain.chainDb, header) - lightchain.mu.Unlock() + lightchain.chainmu.Unlock() } return nil } @@ -344,7 +344,7 @@ func TestReorgBadHeaderHashes(t *testing.T) { defer func() { delete(core.BadHashes, headers[3].Hash()) }() // Create a new LightChain and check that it rolled back the state. - ncm, err := NewLightChain(&dummyOdr{db: bc.chainDb}, params.TestChainConfig, ethash.NewFaker()) + ncm, err := NewLightChain(&dummyOdr{db: bc.chainDb}, params.TestChainConfig, ethash.NewFaker(), nil) if err != nil { t.Fatalf("failed to create new chain manager: %v", err) } diff --git a/light/nodeset.go b/light/nodeset.go index bcc78e0ec55f..3662596785c7 100644 --- a/light/nodeset.go +++ b/light/nodeset.go @@ -20,10 +20,10 @@ import ( "errors" "sync" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/rlp" ) // NodeSet stores a set of trie nodes. It implements trie.Database and can also @@ -60,6 +60,15 @@ func (db *NodeSet) Put(key []byte, value []byte) error { return nil } +// Delete removes a node from the set +func (db *NodeSet) Delete(key []byte) error { + db.lock.Lock() + defer db.lock.Unlock() + + delete(db.nodes, string(key)) + return nil +} + // Get returns a stored node func (db *NodeSet) Get(key []byte) ([]byte, error) { db.lock.RLock() @@ -106,7 +115,7 @@ func (db *NodeSet) NodeList() NodeList { } // Store writes the contents of the set to the given database -func (db *NodeSet) Store(target ethdb.Putter) { +func (db *NodeSet) Store(target ethdb.KeyValueWriter) { db.lock.RLock() defer db.lock.RUnlock() @@ -115,11 +124,11 @@ func (db *NodeSet) Store(target ethdb.Putter) { } } -// NodeList stores an ordered list of trie nodes. It implements ethdb.Putter. +// NodeList stores an ordered list of trie nodes. It implements ethdb.KeyValueWriter. type NodeList []rlp.RawValue // Store writes the contents of the list to the given database -func (n NodeList) Store(db ethdb.Putter) { +func (n NodeList) Store(db ethdb.KeyValueWriter) { for _, node := range n { db.Put(crypto.Keccak256(node), node) } @@ -138,6 +147,11 @@ func (n *NodeList) Put(key []byte, value []byte) error { return nil } +// Delete panics as there's no reason to remove a node from the list. +func (n *NodeList) Delete(key []byte) error { + panic("not supported") +} + // DataSize returns the aggregated data size of nodes in the list func (n NodeList) DataSize() int { var size int diff --git a/light/odr.go b/light/odr.go index c59513992f18..907712ede74f 100644 --- a/light/odr.go +++ b/light/odr.go @@ -14,8 +14,6 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package light implements on-demand retrieval capable state and chain objects -// for the Ethereum Light Client. package light import ( @@ -23,11 +21,11 @@ import ( "errors" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" ) // NoOdr is the default context passed to an ODR capable function when the ODR @@ -124,19 +122,25 @@ func (req *BlockRequest) StoreResult(db ethdb.Database) { // ReceiptsRequest is the ODR request type for retrieving block bodies type ReceiptsRequest struct { OdrRequest - Hash common.Hash - Number uint64 - Receipts types.Receipts + Untrusted bool // Indicator whether the result retrieved is trusted or not + Hash common.Hash + Number uint64 + Header *types.Header + Receipts types.Receipts } // StoreResult stores the retrieved data in local database func (req *ReceiptsRequest) StoreResult(db ethdb.Database) { - rawdb.WriteReceipts(db, req.Hash, req.Number, req.Receipts) + if !req.Untrusted { + rawdb.WriteReceipts(db, req.Hash, req.Number, req.Receipts) + } } // ChtRequest is the ODR request type for state/storage trie entries type ChtRequest struct { OdrRequest + Untrusted bool // Indicator whether the result retrieved is trusted or not + PeerId string // The specified peer id from which to retrieve data. Config *IndexerConfig ChtNum, BlockNum uint64 ChtRoot common.Hash @@ -149,9 +153,11 @@ type ChtRequest struct { func (req *ChtRequest) StoreResult(db ethdb.Database) { hash, num := req.Header.Hash(), req.Header.Number.Uint64() - rawdb.WriteHeader(db, req.Header) - rawdb.WriteTd(db, hash, num, req.Td) - rawdb.WriteCanonicalHash(db, hash, num) + if !req.Untrusted { + rawdb.WriteHeader(db, req.Header) + rawdb.WriteTd(db, hash, num, req.Td) + rawdb.WriteCanonicalHash(db, hash, num) + } } // BloomRequest is the ODR request type for retrieving bloom filters from a CHT structure @@ -177,3 +183,20 @@ func (req *BloomRequest) StoreResult(db ethdb.Database) { rawdb.WriteBloomBits(db, req.BitIdx, sectionIdx, sectionHead, req.BloomBits[i]) } } + +// TxStatus describes the status of a transaction +type TxStatus struct { + Status core.TxStatus + Lookup *rawdb.LegacyTxLookupEntry `rlp:"nil"` + Error string +} + +// TxStatusRequest is the ODR request type for retrieving transaction status +type TxStatusRequest struct { + OdrRequest + Hashes []common.Hash + Status []TxStatus +} + +// StoreResult stores the retrieved data in local database +func (req *TxStatusRequest) StoreResult(db ethdb.Database) {} diff --git a/light/odr_test.go b/light/odr_test.go index a993345ba55d..debd5544c312 100644 --- a/light/odr_test.go +++ b/light/odr_test.go @@ -24,19 +24,19 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" ) var ( @@ -79,7 +79,7 @@ func (odr *testOdr) Retrieve(ctx context.Context, req OdrRequest) error { case *ReceiptsRequest: number := rawdb.ReadHeaderNumber(odr.sdb, req.Hash) if number != nil { - req.Receipts = rawdb.ReadReceipts(odr.sdb, req.Hash, *number) + req.Receipts = rawdb.ReadRawReceipts(odr.sdb, req.Hash, *number) } case *TrieRequest: t, _ := trie.New(req.Id.Root, trie.NewDatabase(odr.sdb)) @@ -99,7 +99,7 @@ func (odr *testOdr) IndexerConfig() *IndexerConfig { type odrTestFn func(ctx context.Context, db ethdb.Database, bc *core.BlockChain, lc *LightChain, bhash common.Hash) ([]byte, error) -func TestOdrGetBlockLes1(t *testing.T) { testChainOdr(t, 1, odrGetBlock) } +func TestOdrGetBlockLes2(t *testing.T) { testChainOdr(t, 1, odrGetBlock) } func odrGetBlock(ctx context.Context, db ethdb.Database, bc *core.BlockChain, lc *LightChain, bhash common.Hash) ([]byte, error) { var block *types.Block @@ -115,14 +115,14 @@ func odrGetBlock(ctx context.Context, db ethdb.Database, bc *core.BlockChain, lc return rlp, nil } -func TestOdrGetReceiptsLes1(t *testing.T) { testChainOdr(t, 1, odrGetReceipts) } +func TestOdrGetReceiptsLes2(t *testing.T) { testChainOdr(t, 1, odrGetReceipts) } func odrGetReceipts(ctx context.Context, db ethdb.Database, bc *core.BlockChain, lc *LightChain, bhash common.Hash) ([]byte, error) { var receipts types.Receipts if bc != nil { number := rawdb.ReadHeaderNumber(db, bhash) if number != nil { - receipts = rawdb.ReadReceipts(db, bhash, *number) + receipts = rawdb.ReadReceipts(db, bhash, *number, bc.Config()) } } else { number := rawdb.ReadHeaderNumber(db, bhash) @@ -137,7 +137,7 @@ func odrGetReceipts(ctx context.Context, db ethdb.Database, bc *core.BlockChain, return rlp, nil } -func TestOdrAccountsLes1(t *testing.T) { testChainOdr(t, 1, odrAccounts) } +func TestOdrAccountsLes2(t *testing.T) { testChainOdr(t, 1, odrAccounts) } func odrAccounts(ctx context.Context, db ethdb.Database, bc *core.BlockChain, lc *LightChain, bhash common.Hash) ([]byte, error) { dummyAddr := common.HexToAddress("1234567812345678123456781234567812345678") @@ -161,7 +161,7 @@ func odrAccounts(ctx context.Context, db ethdb.Database, bc *core.BlockChain, lc return res, st.Error() } -func TestOdrContractCallLes1(t *testing.T) { testChainOdr(t, 1, odrContractCall) } +func TestOdrContractCallLes2(t *testing.T) { testChainOdr(t, 1, odrContractCall) } type callmsg struct { types.Message @@ -250,8 +250,8 @@ func testChainGen(i int, block *core.BlockGen) { func testChainOdr(t *testing.T, protocol int, fn odrTestFn) { var ( - sdb = ethdb.NewMemDatabase() - ldb = ethdb.NewMemDatabase() + sdb = rawdb.NewMemoryDatabase() + ldb = rawdb.NewMemoryDatabase() gspec = core.Genesis{Alloc: core.GenesisAlloc{testBankAddress: {Balance: testBankFunds}}} genesis = gspec.MustCommit(sdb) ) @@ -264,7 +264,7 @@ func testChainOdr(t *testing.T, protocol int, fn odrTestFn) { } odr := &testOdr{sdb: sdb, ldb: ldb, indexerConfig: TestClientIndexerConfig} - lightchain, err := NewLightChain(odr, params.TestChainConfig, ethash.NewFullFaker()) + lightchain, err := NewLightChain(odr, params.TestChainConfig, ethash.NewFullFaker(), nil) if err != nil { t.Fatal(err) } diff --git a/light/odr_util.go b/light/odr_util.go index 09864c72d5c0..2c820d40c783 100644 --- a/light/odr_util.go +++ b/light/odr_util.go @@ -20,15 +20,15 @@ import ( "bytes" "context" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/rlp" ) -var sha3_nil = crypto.Keccak256Hash(nil) +var sha3Nil = crypto.Keccak256Hash(nil) func GetHeaderByNumber(ctx context.Context, odr OdrBackend, number uint64) (*types.Header, error) { db := odr.Database() @@ -60,7 +60,7 @@ func GetHeaderByNumber(ctx context.Context, odr OdrBackend, number uint64) (*typ } } if number >= chtCount*odr.IndexerConfig().ChtSize { - return nil, ErrNoTrustedCht + return nil, errNoTrustedCht } r := &ChtRequest{ChtRoot: GetChtRoot(db, chtCount-1, sectionHead), ChtNum: chtCount - 1, BlockNum: number, Config: odr.IndexerConfig()} if err := odr.Retrieve(ctx, r); err != nil { @@ -69,6 +69,16 @@ func GetHeaderByNumber(ctx context.Context, odr OdrBackend, number uint64) (*typ return r.Header, nil } +// GetUntrustedHeaderByNumber fetches specified block header without correctness checking. +// Note this function should only be used in light client checkpoint syncing. +func GetUntrustedHeaderByNumber(ctx context.Context, odr OdrBackend, number uint64, peerId string) (*types.Header, error) { + r := &ChtRequest{BlockNum: number, ChtNum: number / odr.IndexerConfig().ChtSize, Untrusted: true, PeerId: peerId, Config: odr.IndexerConfig()} + if err := odr.Retrieve(ctx, r); err != nil { + return nil, err + } + return r.Header, nil +} + func GetCanonicalHash(ctx context.Context, odr OdrBackend, number uint64) (common.Hash, error) { hash := rawdb.ReadCanonicalHash(odr.Database(), number) if (hash != common.Hash{}) { @@ -114,7 +124,7 @@ func GetBlock(ctx context.Context, odr OdrBackend, hash common.Hash, number uint // Retrieve the block header and body contents header := rawdb.ReadHeader(odr.Database(), hash, number) if header == nil { - return nil, ErrNoHeader + return nil, errNoHeader } body, err := GetBody(ctx, odr, hash, number) if err != nil { @@ -127,8 +137,8 @@ func GetBlock(ctx context.Context, odr OdrBackend, hash common.Hash, number uint // GetBlockReceipts retrieves the receipts generated by the transactions included // in a block given by its hash. func GetBlockReceipts(ctx context.Context, odr OdrBackend, hash common.Hash, number uint64) (types.Receipts, error) { - // Retrieve the potentially incomplete receipts from disk or network - receipts := rawdb.ReadReceipts(odr.Database(), hash, number) + // Assume receipts are already stored locally and attempt to retrieve. + receipts := rawdb.ReadRawReceipts(odr.Database(), hash, number) if receipts == nil { r := &ReceiptsRequest{Hash: hash, Number: number} if err := odr.Retrieve(ctx, r); err != nil { @@ -145,7 +155,7 @@ func GetBlockReceipts(ctx context.Context, odr OdrBackend, hash common.Hash, num genesis := rawdb.ReadCanonicalHash(odr.Database(), 0) config := rawdb.ReadChainConfig(odr.Database(), genesis) - if err := core.SetReceiptsData(config, block, receipts); err != nil { + if err := receipts.DeriveFields(config, block.Hash(), block.NumberU64(), block.Transactions()); err != nil { return nil, err } rawdb.WriteReceipts(odr.Database(), hash, number, receipts) @@ -157,13 +167,33 @@ func GetBlockReceipts(ctx context.Context, odr OdrBackend, hash common.Hash, num // block given by its hash. func GetBlockLogs(ctx context.Context, odr OdrBackend, hash common.Hash, number uint64) ([][]*types.Log, error) { // Retrieve the potentially incomplete receipts from disk or network - receipts := rawdb.ReadReceipts(odr.Database(), hash, number) + receipts, err := GetBlockReceipts(ctx, odr, hash, number) + if err != nil { + return nil, err + } + // Return the logs without deriving any computed fields on the receipts + logs := make([][]*types.Log, len(receipts)) + for i, receipt := range receipts { + logs[i] = receipt.Logs + } + return logs, nil +} + +// GetUntrustedBlockLogs retrieves the logs generated by the transactions included in a +// block. The retrieved logs are regarded as untrusted and will not be stored in the +// database. This function should only be used in light client checkpoint syncing. +func GetUntrustedBlockLogs(ctx context.Context, odr OdrBackend, header *types.Header) ([][]*types.Log, error) { + // Retrieve the potentially incomplete receipts from disk or network + hash, number := header.Hash(), header.Number.Uint64() + receipts := rawdb.ReadRawReceipts(odr.Database(), hash, number) if receipts == nil { - r := &ReceiptsRequest{Hash: hash, Number: number} + r := &ReceiptsRequest{Hash: hash, Number: number, Header: header, Untrusted: true} if err := odr.Retrieve(ctx, r); err != nil { return nil, err } receipts = r.Receipts + // Untrusted receipts won't be stored in the database. Therefore + // derived fields computation is unnecessary. } // Return the logs without deriving any computed fields on the receipts logs := make([][]*types.Log, len(receipts)) @@ -211,7 +241,7 @@ func GetBloomBits(ctx context.Context, odr OdrBackend, bitIdx uint, sectionIdxLi } else { // TODO(rjl493456442) Convert sectionIndex to BloomTrie relative index if sectionIdx >= bloomTrieCount { - return nil, ErrNoTrustedBloomTrie + return nil, errNoTrustedBloomTrie } reqList = append(reqList, sectionIdx) reqIdx = append(reqIdx, i) @@ -232,3 +262,23 @@ func GetBloomBits(ctx context.Context, odr OdrBackend, bitIdx uint, sectionIdxLi return result, nil } } + +// GetTransaction retrieves a canonical transaction by hash and also returns its position in the chain +func GetTransaction(ctx context.Context, odr OdrBackend, txHash common.Hash) (*types.Transaction, common.Hash, uint64, uint64, error) { + r := &TxStatusRequest{Hashes: []common.Hash{txHash}} + if err := odr.Retrieve(ctx, r); err != nil || r.Status[0].Status != core.TxStatusIncluded { + return nil, common.Hash{}, 0, 0, err + } else { + pos := r.Status[0].Lookup + // first ensure that we have the header, otherwise block body retrieval will fail + // also verify if this is a canonical block by getting the header by number and checking its hash + if header, err := GetHeaderByNumber(ctx, odr, pos.BlockIndex); err != nil || header.Hash() != pos.BlockHash { + return nil, common.Hash{}, 0, 0, err + } + if body, err := GetBody(ctx, odr, pos.BlockHash, pos.BlockIndex); err != nil || uint64(len(body.Transactions)) <= pos.Index || body.Transactions[pos.Index].Hash() != txHash { + return nil, common.Hash{}, 0, 0, err + } else { + return body.Transactions[pos.Index], pos.BlockHash, pos.BlockIndex, pos.Index, nil + } + } +} diff --git a/light/postprocess.go b/light/postprocess.go index 6bfc788f68cd..af3b257923fa 100644 --- a/light/postprocess.go +++ b/light/postprocess.go @@ -24,16 +24,16 @@ import ( "math/big" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/bitutil" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/bitutil" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/trie" ) // IndexerConfig includes a set of configs for chain indexers. @@ -41,9 +41,6 @@ type IndexerConfig struct { // The block frequency for creating CHTs. ChtSize uint64 - // A special auxiliary field represents client's chtsize for server config, otherwise represents server's chtsize. - PairChtSize uint64 - // The number of confirmations needed to generate/accept a canonical hash help trie. ChtConfirms uint64 @@ -64,8 +61,7 @@ type IndexerConfig struct { var ( // DefaultServerIndexerConfig wraps a set of configs as a default indexer config for server side. DefaultServerIndexerConfig = &IndexerConfig{ - ChtSize: params.CHTFrequencyServer, - PairChtSize: params.CHTFrequencyClient, + ChtSize: params.CHTFrequency, ChtConfirms: params.HelperTrieProcessConfirmations, BloomSize: params.BloomBitsBlocks, BloomConfirms: params.BloomConfirms, @@ -74,8 +70,7 @@ var ( } // DefaultClientIndexerConfig wraps a set of configs as a default indexer config for client side. DefaultClientIndexerConfig = &IndexerConfig{ - ChtSize: params.CHTFrequencyClient, - PairChtSize: params.CHTFrequencyServer, + ChtSize: params.CHTFrequency, ChtConfirms: params.HelperTrieConfirmations, BloomSize: params.BloomBitsBlocksClient, BloomConfirms: params.HelperTrieConfirmations, @@ -84,38 +79,29 @@ var ( } // TestServerIndexerConfig wraps a set of configs as a test indexer config for server side. TestServerIndexerConfig = &IndexerConfig{ - ChtSize: 64, - PairChtSize: 512, - ChtConfirms: 4, - BloomSize: 64, - BloomConfirms: 4, - BloomTrieSize: 512, - BloomTrieConfirms: 4, + ChtSize: 128, + ChtConfirms: 1, + BloomSize: 16, + BloomConfirms: 1, + BloomTrieSize: 128, + BloomTrieConfirms: 1, } // TestClientIndexerConfig wraps a set of configs as a test indexer config for client side. TestClientIndexerConfig = &IndexerConfig{ - ChtSize: 512, - PairChtSize: 64, - ChtConfirms: 32, - BloomSize: 512, - BloomConfirms: 32, - BloomTrieSize: 512, - BloomTrieConfirms: 32, + ChtSize: 128, + ChtConfirms: 8, + BloomSize: 128, + BloomConfirms: 8, + BloomTrieSize: 128, + BloomTrieConfirms: 8, } ) -// trustedCheckpoints associates each known checkpoint with the genesis hash of the chain it belongs to -var trustedCheckpoints = map[common.Hash]*params.TrustedCheckpoint{ - params.MainnetGenesisHash: params.MainnetTrustedCheckpoint, - params.TestnetGenesisHash: params.TestnetTrustedCheckpoint, - params.RinkebyGenesisHash: params.RinkebyTrustedCheckpoint, -} - 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 + errNoTrustedCht = errors.New("no trusted canonical hash trie") + errNoTrustedBloomTrie = errors.New("no trusted bloom trie") + errNoHeader = errors.New("header not found") + chtPrefix = []byte("chtRootV2-") // chtPrefix + chtNum (uint64 big endian) -> trie root hash ChtTablePrefix = "cht-" ) @@ -126,7 +112,6 @@ type ChtNode struct { } // GetChtRoot reads the CHT root associated 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) @@ -135,7 +120,6 @@ func GetChtRoot(db ethdb.Database, sectionIdx uint64, sectionHead common.Hash) c } // StoreChtRoot writes the CHT root associated 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) @@ -154,7 +138,7 @@ type ChtIndexerBackend struct { // NewChtIndexer creates a Cht chain indexer func NewChtIndexer(db ethdb.Database, odr OdrBackend, size, confirms uint64) *core.ChainIndexer { - trieTable := ethdb.NewTable(db, ChtTablePrefix) + trieTable := rawdb.NewTable(db, ChtTablePrefix) backend := &ChtIndexerBackend{ diskdb: db, odr: odr, @@ -162,7 +146,7 @@ func NewChtIndexer(db ethdb.Database, odr OdrBackend, size, confirms uint64) *co triedb: trie.NewDatabaseWithCache(trieTable, 1), // Use a tiny cache only to keep memory down sectionSize: size, } - return core.NewChainIndexer(db, ethdb.NewTable(db, "chtIndex-"), backend, size, confirms, time.Millisecond*100, "cht") + return core.NewChainIndexer(db, rawdb.NewTable(db, "chtIndexV2-"), backend, size, confirms, time.Millisecond*100, "cht") } // fetchMissingNodes tries to retrieve the last entry of the latest trusted CHT from the @@ -234,9 +218,7 @@ func (c *ChtIndexerBackend) Commit() error { } c.triedb.Commit(root, false) - if ((c.section+1)*c.sectionSize)%params.CHTFrequencyClient == 0 { - log.Info("Storing CHT", "section", c.section*c.sectionSize/params.CHTFrequencyClient, "head", fmt.Sprintf("%064x", c.lastHash), "root", fmt.Sprintf("%064x", root)) - } + log.Info("Storing CHT", "section", c.section, "head", fmt.Sprintf("%064x", c.lastHash), "root", fmt.Sprintf("%064x", root)) StoreChtRoot(c.diskdb, c.section, c.lastHash, root) return nil } @@ -276,7 +258,7 @@ type BloomTrieIndexerBackend struct { // NewBloomTrieIndexer creates a BloomTrie chain indexer func NewBloomTrieIndexer(db ethdb.Database, odr OdrBackend, parentSize, size uint64) *core.ChainIndexer { - trieTable := ethdb.NewTable(db, BloomTrieTablePrefix) + trieTable := rawdb.NewTable(db, BloomTrieTablePrefix) backend := &BloomTrieIndexerBackend{ diskdb: db, odr: odr, @@ -287,7 +269,7 @@ func NewBloomTrieIndexer(db ethdb.Database, odr OdrBackend, parentSize, size uin } backend.bloomTrieRatio = size / parentSize backend.sectionHeads = make([]common.Hash, backend.bloomTrieRatio) - return core.NewChainIndexer(db, ethdb.NewTable(db, "bltIndex-"), backend, size, 0, time.Millisecond*100, "bloomtrie") + return core.NewChainIndexer(db, rawdb.NewTable(db, "bltIndex-"), backend, size, 0, time.Millisecond*100, "bloomtrie") } // fetchMissingNodes tries to retrieve the last entries of the latest trusted bloom trie from the diff --git a/light/trie.go b/light/trie.go index 95815d980d0f..e512bf6f9562 100644 --- a/light/trie.go +++ b/light/trie.go @@ -21,12 +21,12 @@ import ( "errors" "fmt" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/trie" ) func NewState(ctx context.Context, head *types.Header, odr OdrBackend) *state.StateDB { @@ -67,7 +67,7 @@ func (db *odrDatabase) CopyTrie(t state.Trie) state.Trie { } func (db *odrDatabase) ContractCode(addrHash, codeHash common.Hash) ([]byte, error) { - if codeHash == sha3_nil { + if codeHash == sha3Nil { return nil, nil } if code, err := db.backend.Database().Get(codeHash[:]); err == nil { @@ -141,7 +141,7 @@ func (t *odrTrie) GetKey(sha []byte) []byte { return nil } -func (t *odrTrie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error { +func (t *odrTrie) Prove(key []byte, fromLevel uint, proofDb ethdb.KeyValueWriter) error { return errors.New("not implemented, needs client/server interface split") } diff --git a/light/trie_test.go b/light/trie_test.go index c514346cd17a..4919f89641eb 100644 --- a/light/trie_test.go +++ b/light/trie_test.go @@ -23,19 +23,19 @@ import ( "testing" "github.com/davecgh/go-spew/spew" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/trie" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/trie" ) func TestNodeIterator(t *testing.T) { var ( - fulldb = ethdb.NewMemDatabase() - lightdb = ethdb.NewMemDatabase() + fulldb = rawdb.NewMemoryDatabase() + lightdb = rawdb.NewMemoryDatabase() gspec = core.Genesis{Alloc: core.GenesisAlloc{testBankAddress: {Balance: testBankFunds}}} genesis = gspec.MustCommit(fulldb) ) diff --git a/light/txpool.go b/light/txpool.go index b9b27dc8f7d8..11a0e76ae01e 100644 --- a/light/txpool.go +++ b/light/txpool.go @@ -19,19 +19,20 @@ package light import ( "context" "fmt" + "math/big" "sync" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/rawdb" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" ) const ( @@ -67,7 +68,7 @@ type TxPool struct { mined map[common.Hash][]*types.Transaction // mined transactions by block hash clearIdx uint64 // earliest block nr that can contain mined tx info - homestead bool + istanbul bool // Fork indicator whether we are in the istanbul stage. } // TxRelayBackend provides an interface to the mechanism that forwards transacions @@ -309,8 +310,10 @@ func (pool *TxPool) setNewHead(head *types.Header) { txc, _ := pool.reorgOnNewHead(ctx, head) m, r := txc.getLists() pool.relay.NewHead(pool.head, m, r) - pool.homestead = pool.config.IsHomestead(head.Number) - pool.signer = types.MakeSigner(pool.config, head.Number) + + // Update fork indicator by next pending block number + next := new(big.Int).Add(head.Number, big.NewInt(1)) + pool.istanbul = pool.config.IsIstanbul(next) } // Stop stops the light transaction pool @@ -378,7 +381,7 @@ func (pool *TxPool) validateTx(ctx context.Context, tx *types.Transaction) error } // Should supply enough intrinsic gas - gas, err := core.IntrinsicGas(tx.Data(), tx.To() == nil, pool.homestead) + gas, err := core.IntrinsicGas(tx.Data(), tx.To() == nil, true, pool.istanbul) if err != nil { return err } @@ -390,81 +393,81 @@ func (pool *TxPool) validateTx(ctx context.Context, tx *types.Transaction) error // add validates a new transaction and sets its state pending if processable. // It also updates the locally stored nonce if necessary. -func (self *TxPool) add(ctx context.Context, tx *types.Transaction) error { +func (pool *TxPool) add(ctx context.Context, tx *types.Transaction) error { hash := tx.Hash() - if self.pending[hash] != nil { + if pool.pending[hash] != nil { return fmt.Errorf("Known transaction (%x)", hash[:4]) } - err := self.validateTx(ctx, tx) + err := pool.validateTx(ctx, tx) if err != nil { return err } - if _, ok := self.pending[hash]; !ok { - self.pending[hash] = tx + if _, ok := pool.pending[hash]; !ok { + pool.pending[hash] = tx nonce := tx.Nonce() + 1 - addr, _ := types.Sender(self.signer, tx) - if nonce > self.nonce[addr] { - self.nonce[addr] = nonce + addr, _ := types.Sender(pool.signer, tx) + if nonce > pool.nonce[addr] { + pool.nonce[addr] = nonce } // 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.txFeed.Send(core.NewTxsEvent{Txs: types.Transactions{tx}}) + go pool.txFeed.Send(core.NewTxsEvent{Txs: types.Transactions{tx}}) } // Print a log message if low enough level is set - log.Debug("Pooled new transaction", "hash", hash, "from", log.Lazy{Fn: func() common.Address { from, _ := types.Sender(self.signer, tx); return from }}, "to", tx.To()) + log.Debug("Pooled new transaction", "hash", hash, "from", log.Lazy{Fn: func() common.Address { from, _ := types.Sender(pool.signer, tx); return from }}, "to", tx.To()) return nil } // Add adds a transaction to the pool if valid and passes it to the tx relay // backend -func (self *TxPool) Add(ctx context.Context, tx *types.Transaction) error { - self.mu.Lock() - defer self.mu.Unlock() +func (pool *TxPool) Add(ctx context.Context, tx *types.Transaction) error { + pool.mu.Lock() + defer pool.mu.Unlock() data, err := rlp.EncodeToBytes(tx) if err != nil { return err } - if err := self.add(ctx, tx); err != nil { + if err := pool.add(ctx, tx); err != nil { return err } //fmt.Println("Send", tx.Hash()) - self.relay.Send(types.Transactions{tx}) + pool.relay.Send(types.Transactions{tx}) - self.chainDb.Put(tx.Hash().Bytes(), data) + pool.chainDb.Put(tx.Hash().Bytes(), data) return nil } // AddTransactions adds all valid transactions to the pool and passes them to // the tx relay backend -func (self *TxPool) AddBatch(ctx context.Context, txs []*types.Transaction) { - self.mu.Lock() - defer self.mu.Unlock() +func (pool *TxPool) AddBatch(ctx context.Context, txs []*types.Transaction) { + pool.mu.Lock() + defer pool.mu.Unlock() var sendTx types.Transactions for _, tx := range txs { - if err := self.add(ctx, tx); err == nil { + if err := pool.add(ctx, tx); err == nil { sendTx = append(sendTx, tx) } } if len(sendTx) > 0 { - self.relay.Send(sendTx) + pool.relay.Send(sendTx) } } // GetTransaction returns a transaction if it is contained in the pool // and nil otherwise. -func (tp *TxPool) GetTransaction(hash common.Hash) *types.Transaction { +func (pool *TxPool) GetTransaction(hash common.Hash) *types.Transaction { // check the txs first - if tx, ok := tp.pending[hash]; ok { + if tx, ok := pool.pending[hash]; ok { return tx } return nil @@ -472,13 +475,13 @@ func (tp *TxPool) GetTransaction(hash common.Hash) *types.Transaction { // GetTransactions returns all currently processable transactions. // The returned slice may be modified by the caller. -func (self *TxPool) GetTransactions() (txs types.Transactions, err error) { - self.mu.RLock() - defer self.mu.RUnlock() +func (pool *TxPool) GetTransactions() (txs types.Transactions, err error) { + pool.mu.RLock() + defer pool.mu.RUnlock() - txs = make(types.Transactions, len(self.pending)) + txs = make(types.Transactions, len(pool.pending)) i := 0 - for _, tx := range self.pending { + for _, tx := range pool.pending { txs[i] = tx i++ } @@ -487,14 +490,14 @@ func (self *TxPool) GetTransactions() (txs types.Transactions, err error) { // Content retrieves the data content of the transaction pool, returning all the // pending as well as queued transactions, grouped by account and nonce. -func (self *TxPool) Content() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) { - self.mu.RLock() - defer self.mu.RUnlock() +func (pool *TxPool) Content() (map[common.Address]types.Transactions, map[common.Address]types.Transactions) { + pool.mu.RLock() + defer pool.mu.RUnlock() // Retrieve all the pending transactions and sort by account and by nonce pending := make(map[common.Address]types.Transactions) - for _, tx := range self.pending { - account, _ := types.Sender(self.signer, tx) + for _, tx := range pool.pending { + account, _ := types.Sender(pool.signer, tx) pending[account] = append(pending[account], tx) } // There are no queued transactions in a light pool, just return an empty map @@ -503,20 +506,20 @@ func (self *TxPool) Content() (map[common.Address]types.Transactions, map[common } // RemoveTransactions removes all given transactions from the pool. -func (self *TxPool) RemoveTransactions(txs types.Transactions) { - self.mu.Lock() - defer self.mu.Unlock() +func (pool *TxPool) RemoveTransactions(txs types.Transactions) { + pool.mu.Lock() + defer pool.mu.Unlock() var hashes []common.Hash - batch := self.chainDb.NewBatch() + batch := pool.chainDb.NewBatch() for _, tx := range txs { hash := tx.Hash() - delete(self.pending, hash) + delete(pool.pending, hash) batch.Delete(hash.Bytes()) hashes = append(hashes, hash) } batch.Write() - self.relay.Discard(hashes) + pool.relay.Discard(hashes) } // RemoveTx removes the transaction with the given hash from the pool. diff --git a/light/txpool_test.go b/light/txpool_test.go index a3894f274711..0996bd7c9cc0 100644 --- a/light/txpool_test.go +++ b/light/txpool_test.go @@ -23,13 +23,13 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" ) type testTxRelay struct { @@ -81,8 +81,8 @@ func TestTxPool(t *testing.T) { } var ( - sdb = ethdb.NewMemDatabase() - ldb = ethdb.NewMemDatabase() + sdb = rawdb.NewMemoryDatabase() + ldb = rawdb.NewMemoryDatabase() gspec = core.Genesis{Alloc: core.GenesisAlloc{testBankAddress: {Balance: testBankFunds}}} genesis = gspec.MustCommit(sdb) ) @@ -100,7 +100,7 @@ func TestTxPool(t *testing.T) { discard: make(chan int, 1), mined: make(chan int, 1), } - lightchain, _ := NewLightChain(odr, params.TestChainConfig, ethash.NewFullFaker()) + lightchain, _ := NewLightChain(odr, params.TestChainConfig, ethash.NewFullFaker(), nil) txPermanent = 50 pool := NewTxPool(params.TestChainConfig, lightchain, relay) ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) diff --git a/log/README.md b/log/README.md index b4476577b63b..47426806dd95 100644 --- a/log/README.md +++ b/log/README.md @@ -1,8 +1,8 @@ -![obligatory xkcd](http://imgs.xkcd.com/comics/standards.png) +![obligatory xkcd](https://imgs.xkcd.com/comics/standards.png) # log15 [![godoc reference](https://godoc.org/github.com/inconshreveable/log15?status.png)](https://godoc.org/github.com/inconshreveable/log15) [![Build Status](https://travis-ci.org/inconshreveable/log15.svg?branch=master)](https://travis-ci.org/inconshreveable/log15) -Package log15 provides an opinionated, simple toolkit for best-practice logging in Go (golang) that is both human and machine readable. It is modeled after the Go standard library's [`io`](http://golang.org/pkg/io/) and [`net/http`](http://golang.org/pkg/net/http/) packages and is an alternative to the standard library's [`log`](http://golang.org/pkg/log/) package. +Package log15 provides an opinionated, simple toolkit for best-practice logging in Go (golang) that is both human and machine readable. It is modeled after the Go standard library's [`io`](https://golang.org/pkg/io/) and [`net/http`](https://golang.org/pkg/net/http/) packages and is an alternative to the standard library's [`log`](https://golang.org/pkg/log/) package. ## Features - A simple, easy-to-understand API diff --git a/log/format.go b/log/format.go index 0c4c4164c59a..a1b5dac62953 100644 --- a/log/format.go +++ b/log/format.go @@ -14,15 +14,16 @@ import ( ) const ( - timeFormat = "2006-01-02T15:04:05-0700" - termTimeFormat = "01-02|15:04:05.000" - floatFormat = 'f' - termMsgJust = 40 + timeFormat = "2006-01-02T15:04:05-0700" + termTimeFormat = "01-02|15:04:05.000" + floatFormat = 'f' + termMsgJust = 40 + termCtxMaxPadding = 40 ) // locationTrims are trimmed for display to avoid unwieldy log lines. var locationTrims = []string{ - "github.com/nebulaai/nbai-node/", + "github.com/ethereum/go-ethereum/", } // PrintOrigins sets or unsets log location (file:line) printing for terminal @@ -175,7 +176,7 @@ func logfmt(buf *bytes.Buffer, ctx []interface{}, color int, term bool) { fieldPaddingLock.RUnlock() length := utf8.RuneCountInString(v) - if padding < length { + if padding < length && length <= termCtxMaxPadding { padding = length fieldPaddingLock.Lock() @@ -189,7 +190,7 @@ func logfmt(buf *bytes.Buffer, ctx []interface{}, color int, term bool) { buf.WriteByte('=') } buf.WriteString(v) - if i < len(ctx)-2 { + if i < len(ctx)-2 && padding > length { buf.Write(bytes.Repeat([]byte{' '}, padding-length)) } } diff --git a/log/handler_glog.go b/log/handler_glog.go index 83dae44bd54c..9b1d4efaf46e 100644 --- a/log/handler_glog.go +++ b/log/handler_glog.go @@ -207,7 +207,7 @@ func (h *GlogHandler) Log(r *Record) error { } // Check callsite cache for previously calculated log levels h.lock.RLock() - lvl, ok := h.siteCache[r.Call.PC()] + lvl, ok := h.siteCache[r.Call.Frame().PC] h.lock.RUnlock() // If we didn't cache the callsite yet, calculate it @@ -215,13 +215,13 @@ func (h *GlogHandler) Log(r *Record) error { h.lock.Lock() for _, rule := range h.patterns { if rule.pattern.MatchString(fmt.Sprintf("%+s", r.Call)) { - h.siteCache[r.Call.PC()], lvl, ok = rule.level, rule.level, true + h.siteCache[r.Call.Frame().PC], lvl, ok = rule.level, rule.level, true break } } // If no rule matched, remember to drop log the next time if !ok { - h.siteCache[r.Call.PC()] = 0 + h.siteCache[r.Call.Frame().PC] = 0 } h.lock.Unlock() } diff --git a/log/logger.go b/log/logger.go index ca3e0b05996e..276d6969e24d 100644 --- a/log/logger.go +++ b/log/logger.go @@ -83,7 +83,7 @@ func LvlFromString(lvlString string) (Lvl, error) { case "crit": return LvlCrit, nil default: - return LvlDebug, fmt.Errorf("Unknown level: %v", lvlString) + return LvlDebug, fmt.Errorf("unknown level: %v", lvlString) } } diff --git a/metrics/README.md b/metrics/README.md index bc2a45a8382d..e2d7945008e6 100644 --- a/metrics/README.md +++ b/metrics/README.md @@ -5,7 +5,7 @@ go-metrics Go port of Coda Hale's Metrics library: . -Documentation: . +Documentation: . Usage ----- @@ -128,7 +128,7 @@ go stathat.Stathat(metrics.DefaultRegistry, 10e9, "example@example.com") Maintain all metrics along with expvars at `/debug/metrics`: -This uses the same mechanism as [the official expvar](http://golang.org/pkg/expvar/) +This uses the same mechanism as [the official expvar](https://golang.org/pkg/expvar/) but exposed under `/debug/metrics`, which shows a json representation of all your usual expvars as well as all your go-metrics. diff --git a/metrics/counter_test.go b/metrics/counter_test.go index dfb03b4e8845..af26ef1548fe 100644 --- a/metrics/counter_test.go +++ b/metrics/counter_test.go @@ -14,7 +14,7 @@ func TestCounterClear(t *testing.T) { c := NewCounter() c.Inc(1) c.Clear() - if count := c.Count(); 0 != count { + if count := c.Count(); count != 0 { t.Errorf("c.Count(): 0 != %v\n", count) } } @@ -22,7 +22,7 @@ func TestCounterClear(t *testing.T) { func TestCounterDec1(t *testing.T) { c := NewCounter() c.Dec(1) - if count := c.Count(); -1 != count { + if count := c.Count(); count != -1 { t.Errorf("c.Count(): -1 != %v\n", count) } } @@ -30,7 +30,7 @@ func TestCounterDec1(t *testing.T) { func TestCounterDec2(t *testing.T) { c := NewCounter() c.Dec(2) - if count := c.Count(); -2 != count { + if count := c.Count(); count != -2 { t.Errorf("c.Count(): -2 != %v\n", count) } } @@ -38,7 +38,7 @@ func TestCounterDec2(t *testing.T) { func TestCounterInc1(t *testing.T) { c := NewCounter() c.Inc(1) - if count := c.Count(); 1 != count { + if count := c.Count(); count != 1 { t.Errorf("c.Count(): 1 != %v\n", count) } } @@ -46,7 +46,7 @@ func TestCounterInc1(t *testing.T) { func TestCounterInc2(t *testing.T) { c := NewCounter() c.Inc(2) - if count := c.Count(); 2 != count { + if count := c.Count(); count != 2 { t.Errorf("c.Count(): 2 != %v\n", count) } } @@ -56,14 +56,14 @@ func TestCounterSnapshot(t *testing.T) { c.Inc(1) snapshot := c.Snapshot() c.Inc(1) - if count := snapshot.Count(); 1 != count { + if count := snapshot.Count(); count != 1 { t.Errorf("c.Count(): 1 != %v\n", count) } } func TestCounterZero(t *testing.T) { c := NewCounter() - if count := c.Count(); 0 != count { + if count := c.Count(); count != 0 { t.Errorf("c.Count(): 0 != %v\n", count) } } @@ -71,7 +71,7 @@ func TestCounterZero(t *testing.T) { func TestGetOrRegisterCounter(t *testing.T) { r := NewRegistry() NewRegisteredCounter("foo", r).Inc(47) - if c := GetOrRegisterCounter("foo", r); 47 != c.Count() { + if c := GetOrRegisterCounter("foo", r); c.Count() != 47 { t.Fatal(c) } } diff --git a/metrics/cpu.go b/metrics/cpu.go new file mode 100644 index 000000000000..3278d81616a3 --- /dev/null +++ b/metrics/cpu.go @@ -0,0 +1,36 @@ +// Copyright 2018 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 metrics + +import "github.com/elastic/gosigar" + +// CPUStats is the system and process CPU stats. +type CPUStats struct { + GlobalTime int64 // Time spent by the CPU working on all processes + GlobalWait int64 // Time spent by waiting on disk for all processes + LocalTime int64 // Time spent by the CPU working on this process +} + +// ReadCPUStats retrieves the current CPU stats. +func ReadCPUStats(stats *CPUStats) { + global := gosigar.Cpu{} + global.Get() + + stats.GlobalTime = int64(global.User + global.Nice + global.Sys) + stats.GlobalWait = int64(global.Wait) + stats.LocalTime = getProcessCPUTime() +} diff --git a/metrics/cpu_syscall.go b/metrics/cpu_syscall.go new file mode 100644 index 000000000000..e245453e824f --- /dev/null +++ b/metrics/cpu_syscall.go @@ -0,0 +1,35 @@ +// Copyright 2018 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 . + +// +build !windows + +package metrics + +import ( + "syscall" + + "github.com/ethereum/go-ethereum/log" +) + +// getProcessCPUTime retrieves the process' CPU time since program startup. +func getProcessCPUTime() int64 { + var usage syscall.Rusage + if err := syscall.Getrusage(syscall.RUSAGE_SELF, &usage); err != nil { + log.Warn("Failed to retrieve CPU time", "err", err) + return 0 + } + return int64(usage.Utime.Sec+usage.Stime.Sec)*100 + int64(usage.Utime.Usec+usage.Stime.Usec)/10000 //nolint:unconvert +} diff --git a/dashboard/cpu_windows.go b/metrics/cpu_windows.go similarity index 94% rename from dashboard/cpu_windows.go rename to metrics/cpu_windows.go index 9bb7ec789cc9..fb29a52a82c1 100644 --- a/dashboard/cpu_windows.go +++ b/metrics/cpu_windows.go @@ -14,10 +14,10 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -package dashboard +package metrics // getProcessCPUTime returns 0 on Windows as there is no system call to resolve // the actual process' CPU time. -func getProcessCPUTime() float64 { +func getProcessCPUTime() int64 { return 0 } diff --git a/metrics/doc.go b/metrics/doc.go new file mode 100644 index 000000000000..13f429c1689d --- /dev/null +++ b/metrics/doc.go @@ -0,0 +1,4 @@ +package metrics + +const epsilon = 0.0000000000000001 +const epsilonPercentile = .00000000001 diff --git a/metrics/ewma_test.go b/metrics/ewma_test.go index 0430fbd24725..5b244191616e 100644 --- a/metrics/ewma_test.go +++ b/metrics/ewma_test.go @@ -1,6 +1,9 @@ package metrics -import "testing" +import ( + "math" + "testing" +) func BenchmarkEWMA(b *testing.B) { a := NewEWMA1() @@ -15,67 +18,67 @@ func TestEWMA1(t *testing.T) { a := NewEWMA1() a.Update(3) a.Tick() - if rate := a.Rate(); 0.6 != rate { + if rate := a.Rate(); math.Abs(0.6-rate) > epsilon { t.Errorf("initial a.Rate(): 0.6 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.22072766470286553 != rate { + if rate := a.Rate(); math.Abs(0.22072766470286553-rate) > epsilon { t.Errorf("1 minute a.Rate(): 0.22072766470286553 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.08120116994196772 != rate { + if rate := a.Rate(); math.Abs(0.08120116994196772-rate) > epsilon { t.Errorf("2 minute a.Rate(): 0.08120116994196772 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.029872241020718428 != rate { + if rate := a.Rate(); math.Abs(0.029872241020718428-rate) > epsilon { t.Errorf("3 minute a.Rate(): 0.029872241020718428 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.01098938333324054 != rate { + if rate := a.Rate(); math.Abs(0.01098938333324054-rate) > epsilon { t.Errorf("4 minute a.Rate(): 0.01098938333324054 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.004042768199451294 != rate { + if rate := a.Rate(); math.Abs(0.004042768199451294-rate) > epsilon { t.Errorf("5 minute a.Rate(): 0.004042768199451294 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.0014872513059998212 != rate { + if rate := a.Rate(); math.Abs(0.0014872513059998212-rate) > epsilon { t.Errorf("6 minute a.Rate(): 0.0014872513059998212 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.0005471291793327122 != rate { + if rate := a.Rate(); math.Abs(0.0005471291793327122-rate) > epsilon { t.Errorf("7 minute a.Rate(): 0.0005471291793327122 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.00020127757674150815 != rate { + if rate := a.Rate(); math.Abs(0.00020127757674150815-rate) > epsilon { t.Errorf("8 minute a.Rate(): 0.00020127757674150815 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 7.404588245200814e-05 != rate { + if rate := a.Rate(); math.Abs(7.404588245200814e-05-rate) > epsilon { t.Errorf("9 minute a.Rate(): 7.404588245200814e-05 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 2.7239957857491083e-05 != rate { + if rate := a.Rate(); math.Abs(2.7239957857491083e-05-rate) > epsilon { t.Errorf("10 minute a.Rate(): 2.7239957857491083e-05 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 1.0021020474147462e-05 != rate { + if rate := a.Rate(); math.Abs(1.0021020474147462e-05-rate) > epsilon { t.Errorf("11 minute a.Rate(): 1.0021020474147462e-05 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 3.6865274119969525e-06 != rate { + if rate := a.Rate(); math.Abs(3.6865274119969525e-06-rate) > epsilon { t.Errorf("12 minute a.Rate(): 3.6865274119969525e-06 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 1.3561976441886433e-06 != rate { + if rate := a.Rate(); math.Abs(1.3561976441886433e-06-rate) > epsilon { t.Errorf("13 minute a.Rate(): 1.3561976441886433e-06 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 4.989172314621449e-07 != rate { + if rate := a.Rate(); math.Abs(4.989172314621449e-07-rate) > epsilon { t.Errorf("14 minute a.Rate(): 4.989172314621449e-07 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 1.8354139230109722e-07 != rate { + if rate := a.Rate(); math.Abs(1.8354139230109722e-07-rate) > epsilon { t.Errorf("15 minute a.Rate(): 1.8354139230109722e-07 != %v\n", rate) } } @@ -84,67 +87,67 @@ func TestEWMA5(t *testing.T) { a := NewEWMA5() a.Update(3) a.Tick() - if rate := a.Rate(); 0.6 != rate { + if rate := a.Rate(); math.Abs(0.6-rate) > epsilon { t.Errorf("initial a.Rate(): 0.6 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.49123845184678905 != rate { + if rate := a.Rate(); math.Abs(0.49123845184678905-rate) > epsilon { t.Errorf("1 minute a.Rate(): 0.49123845184678905 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.4021920276213837 != rate { + if rate := a.Rate(); math.Abs(0.4021920276213837-rate) > epsilon { t.Errorf("2 minute a.Rate(): 0.4021920276213837 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.32928698165641596 != rate { + if rate := a.Rate(); math.Abs(0.32928698165641596-rate) > epsilon { t.Errorf("3 minute a.Rate(): 0.32928698165641596 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.269597378470333 != rate { + if rate := a.Rate(); math.Abs(0.269597378470333-rate) > epsilon { t.Errorf("4 minute a.Rate(): 0.269597378470333 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.2207276647028654 != rate { + if rate := a.Rate(); math.Abs(0.2207276647028654-rate) > epsilon { t.Errorf("5 minute a.Rate(): 0.2207276647028654 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.18071652714732128 != rate { + if rate := a.Rate(); math.Abs(0.18071652714732128-rate) > epsilon { t.Errorf("6 minute a.Rate(): 0.18071652714732128 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.14795817836496392 != rate { + if rate := a.Rate(); math.Abs(0.14795817836496392-rate) > epsilon { t.Errorf("7 minute a.Rate(): 0.14795817836496392 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.12113791079679326 != rate { + if rate := a.Rate(); math.Abs(0.12113791079679326-rate) > epsilon { t.Errorf("8 minute a.Rate(): 0.12113791079679326 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.09917933293295193 != rate { + if rate := a.Rate(); math.Abs(0.09917933293295193-rate) > epsilon { t.Errorf("9 minute a.Rate(): 0.09917933293295193 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.08120116994196763 != rate { + if rate := a.Rate(); math.Abs(0.08120116994196763-rate) > epsilon { t.Errorf("10 minute a.Rate(): 0.08120116994196763 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.06648189501740036 != rate { + if rate := a.Rate(); math.Abs(0.06648189501740036-rate) > epsilon { t.Errorf("11 minute a.Rate(): 0.06648189501740036 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.05443077197364752 != rate { + if rate := a.Rate(); math.Abs(0.05443077197364752-rate) > epsilon { t.Errorf("12 minute a.Rate(): 0.05443077197364752 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.04456414692860035 != rate { + if rate := a.Rate(); math.Abs(0.04456414692860035-rate) > epsilon { t.Errorf("13 minute a.Rate(): 0.04456414692860035 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.03648603757513079 != rate { + if rate := a.Rate(); math.Abs(0.03648603757513079-rate) > epsilon { t.Errorf("14 minute a.Rate(): 0.03648603757513079 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.0298722410207183831020718428 != rate { + if rate := a.Rate(); math.Abs(0.0298722410207183831020718428-rate) > epsilon { t.Errorf("15 minute a.Rate(): 0.0298722410207183831020718428 != %v\n", rate) } } @@ -153,67 +156,67 @@ func TestEWMA15(t *testing.T) { a := NewEWMA15() a.Update(3) a.Tick() - if rate := a.Rate(); 0.6 != rate { + if rate := a.Rate(); math.Abs(0.6-rate) > epsilon { t.Errorf("initial a.Rate(): 0.6 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.5613041910189706 != rate { + if rate := a.Rate(); math.Abs(0.5613041910189706-rate) > epsilon { t.Errorf("1 minute a.Rate(): 0.5613041910189706 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.5251039914257684 != rate { + if rate := a.Rate(); math.Abs(0.5251039914257684-rate) > epsilon { t.Errorf("2 minute a.Rate(): 0.5251039914257684 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.4912384518467888184678905 != rate { + if rate := a.Rate(); math.Abs(0.4912384518467888184678905-rate) > epsilon { t.Errorf("3 minute a.Rate(): 0.4912384518467888184678905 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.459557003018789 != rate { + if rate := a.Rate(); math.Abs(0.459557003018789-rate) > epsilon { t.Errorf("4 minute a.Rate(): 0.459557003018789 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.4299187863442732 != rate { + if rate := a.Rate(); math.Abs(0.4299187863442732-rate) > epsilon { t.Errorf("5 minute a.Rate(): 0.4299187863442732 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.4021920276213831 != rate { + if rate := a.Rate(); math.Abs(0.4021920276213831-rate) > epsilon { t.Errorf("6 minute a.Rate(): 0.4021920276213831 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.37625345116383313 != rate { + if rate := a.Rate(); math.Abs(0.37625345116383313-rate) > epsilon { t.Errorf("7 minute a.Rate(): 0.37625345116383313 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.3519877317060185 != rate { + if rate := a.Rate(); math.Abs(0.3519877317060185-rate) > epsilon { t.Errorf("8 minute a.Rate(): 0.3519877317060185 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.3292869816564153165641596 != rate { + if rate := a.Rate(); math.Abs(0.3292869816564153165641596-rate) > epsilon { t.Errorf("9 minute a.Rate(): 0.3292869816564153165641596 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.3080502714195546 != rate { + if rate := a.Rate(); math.Abs(0.3080502714195546-rate) > epsilon { t.Errorf("10 minute a.Rate(): 0.3080502714195546 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.2881831806538789 != rate { + if rate := a.Rate(); math.Abs(0.2881831806538789-rate) > epsilon { t.Errorf("11 minute a.Rate(): 0.2881831806538789 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.26959737847033216 != rate { + if rate := a.Rate(); math.Abs(0.26959737847033216-rate) > epsilon { t.Errorf("12 minute a.Rate(): 0.26959737847033216 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.2522102307052083 != rate { + if rate := a.Rate(); math.Abs(0.2522102307052083-rate) > epsilon { t.Errorf("13 minute a.Rate(): 0.2522102307052083 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.23594443252115815 != rate { + if rate := a.Rate(); math.Abs(0.23594443252115815-rate) > epsilon { t.Errorf("14 minute a.Rate(): 0.23594443252115815 != %v\n", rate) } elapseMinute(a) - if rate := a.Rate(); 0.2207276647028646247028654470286553 != rate { + if rate := a.Rate(); math.Abs(0.2207276647028646247028654470286553-rate) > epsilon { t.Errorf("15 minute a.Rate(): 0.2207276647028646247028654470286553 != %v\n", rate) } } diff --git a/metrics/exp/exp.go b/metrics/exp/exp.go index 4a3dbb981beb..55820f1aab2f 100644 --- a/metrics/exp/exp.go +++ b/metrics/exp/exp.go @@ -8,7 +8,8 @@ import ( "net/http" "sync" - "github.com/nebulaai/nbai-node/metrics" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/metrics/prometheus" ) type exp struct { @@ -42,6 +43,7 @@ func Exp(r metrics.Registry) { // http.HandleFunc("/debug/vars", e.expHandler) // haven't found an elegant way, so just use a different endpoint http.Handle("/debug/metrics", h) + http.Handle("/debug/metrics/prometheus", prometheus.Handler(r)) } // ExpHandler will return an expvar powered metrics handler. diff --git a/metrics/gauge.go b/metrics/gauge.go index 0fbfdb86033b..b6b2758b0d13 100644 --- a/metrics/gauge.go +++ b/metrics/gauge.go @@ -6,6 +6,8 @@ import "sync/atomic" type Gauge interface { Snapshot() Gauge Update(int64) + Dec(int64) + Inc(int64) Value() int64 } @@ -65,6 +67,16 @@ func (GaugeSnapshot) Update(int64) { panic("Update called on a GaugeSnapshot") } +// Dec panics. +func (GaugeSnapshot) Dec(int64) { + panic("Dec called on a GaugeSnapshot") +} + +// Inc panics. +func (GaugeSnapshot) Inc(int64) { + panic("Inc called on a GaugeSnapshot") +} + // Value returns the value at the time the snapshot was taken. func (g GaugeSnapshot) Value() int64 { return int64(g) } @@ -77,6 +89,12 @@ func (NilGauge) Snapshot() Gauge { return NilGauge{} } // Update is a no-op. func (NilGauge) Update(v int64) {} +// Dec is a no-op. +func (NilGauge) Dec(i int64) {} + +// Inc is a no-op. +func (NilGauge) Inc(i int64) {} + // Value is a no-op. func (NilGauge) Value() int64 { return 0 } @@ -101,6 +119,16 @@ func (g *StandardGauge) Value() int64 { return atomic.LoadInt64(&g.value) } +// Dec decrements the gauge's current value by the given amount. +func (g *StandardGauge) Dec(i int64) { + atomic.AddInt64(&g.value, -i) +} + +// Inc increments the gauge's current value by the given amount. +func (g *StandardGauge) Inc(i int64) { + atomic.AddInt64(&g.value, i) +} + // FunctionalGauge returns value from given function type FunctionalGauge struct { value func() int64 @@ -118,3 +146,13 @@ func (g FunctionalGauge) Snapshot() Gauge { return GaugeSnapshot(g.Value()) } func (FunctionalGauge) Update(int64) { panic("Update called on a FunctionalGauge") } + +// Dec panics. +func (FunctionalGauge) Dec(int64) { + panic("Dec called on a FunctionalGauge") +} + +// Inc panics. +func (FunctionalGauge) Inc(int64) { + panic("Inc called on a FunctionalGauge") +} diff --git a/metrics/gauge_float64_test.go b/metrics/gauge_float64_test.go index 99e62a40302f..3ee568e7ba09 100644 --- a/metrics/gauge_float64_test.go +++ b/metrics/gauge_float64_test.go @@ -53,7 +53,7 @@ func TestFunctionalGaugeFloat64(t *testing.T) { func TestGetOrRegisterFunctionalGaugeFloat64(t *testing.T) { r := NewRegistry() NewRegisteredFunctionalGaugeFloat64("foo", r, func() float64 { return 47 }) - if g := GetOrRegisterGaugeFloat64("foo", r); 47 != g.Value() { + if g := GetOrRegisterGaugeFloat64("foo", r); g.Value() != 47 { t.Fatal(g) } } diff --git a/metrics/gauge_test.go b/metrics/gauge_test.go index 1f2603d33985..3aee143455c3 100644 --- a/metrics/gauge_test.go +++ b/metrics/gauge_test.go @@ -16,7 +16,7 @@ func BenchmarkGuage(b *testing.B) { func TestGauge(t *testing.T) { g := NewGauge() g.Update(int64(47)) - if v := g.Value(); 47 != v { + if v := g.Value(); v != 47 { t.Errorf("g.Value(): 47 != %v\n", v) } } @@ -26,7 +26,7 @@ func TestGaugeSnapshot(t *testing.T) { g.Update(int64(47)) snapshot := g.Snapshot() g.Update(int64(0)) - if v := snapshot.Value(); 47 != v { + if v := snapshot.Value(); v != 47 { t.Errorf("g.Value(): 47 != %v\n", v) } } @@ -34,7 +34,7 @@ func TestGaugeSnapshot(t *testing.T) { func TestGetOrRegisterGauge(t *testing.T) { r := NewRegistry() NewRegisteredGauge("foo", r).Update(47) - if g := GetOrRegisterGauge("foo", r); 47 != g.Value() { + if g := GetOrRegisterGauge("foo", r); g.Value() != 47 { t.Fatal(g) } } @@ -55,7 +55,7 @@ func TestFunctionalGauge(t *testing.T) { func TestGetOrRegisterFunctionalGauge(t *testing.T) { r := NewRegistry() NewRegisteredFunctionalGauge("foo", r, func() int64 { return 47 }) - if g := GetOrRegisterGauge("foo", r); 47 != g.Value() { + if g := GetOrRegisterGauge("foo", r); g.Value() != 47 { t.Fatal(g) } } diff --git a/metrics/histogram_test.go b/metrics/histogram_test.go index d7f4f0171cf0..7c9f42fcec96 100644 --- a/metrics/histogram_test.go +++ b/metrics/histogram_test.go @@ -14,7 +14,7 @@ func TestGetOrRegisterHistogram(t *testing.T) { r := NewRegistry() s := NewUniformSample(100) NewRegisteredHistogram("foo", r, s).Update(47) - if h := GetOrRegisterHistogram("foo", r, s); 1 != h.Count() { + if h := GetOrRegisterHistogram("foo", r, s); h.Count() != 1 { t.Fatal(h) } } @@ -29,29 +29,29 @@ func TestHistogram10000(t *testing.T) { func TestHistogramEmpty(t *testing.T) { h := NewHistogram(NewUniformSample(100)) - if count := h.Count(); 0 != count { + if count := h.Count(); count != 0 { t.Errorf("h.Count(): 0 != %v\n", count) } - if min := h.Min(); 0 != min { + if min := h.Min(); min != 0 { t.Errorf("h.Min(): 0 != %v\n", min) } - if max := h.Max(); 0 != max { + if max := h.Max(); max != 0 { t.Errorf("h.Max(): 0 != %v\n", max) } - if mean := h.Mean(); 0.0 != mean { + if mean := h.Mean(); mean != 0.0 { t.Errorf("h.Mean(): 0.0 != %v\n", mean) } - if stdDev := h.StdDev(); 0.0 != stdDev { + if stdDev := h.StdDev(); stdDev != 0.0 { t.Errorf("h.StdDev(): 0.0 != %v\n", stdDev) } ps := h.Percentiles([]float64{0.5, 0.75, 0.99}) - if 0.0 != ps[0] { + if ps[0] != 0.0 { t.Errorf("median: 0.0 != %v\n", ps[0]) } - if 0.0 != ps[1] { + if ps[1] != 0.0 { t.Errorf("75th percentile: 0.0 != %v\n", ps[1]) } - if 0.0 != ps[2] { + if ps[2] != 0.0 { t.Errorf("99th percentile: 0.0 != %v\n", ps[2]) } } @@ -67,29 +67,29 @@ func TestHistogramSnapshot(t *testing.T) { } func testHistogram10000(t *testing.T, h Histogram) { - if count := h.Count(); 10000 != count { + if count := h.Count(); count != 10000 { t.Errorf("h.Count(): 10000 != %v\n", count) } - if min := h.Min(); 1 != min { + if min := h.Min(); min != 1 { t.Errorf("h.Min(): 1 != %v\n", min) } - if max := h.Max(); 10000 != max { + if max := h.Max(); max != 10000 { t.Errorf("h.Max(): 10000 != %v\n", max) } - if mean := h.Mean(); 5000.5 != mean { + if mean := h.Mean(); mean != 5000.5 { t.Errorf("h.Mean(): 5000.5 != %v\n", mean) } - if stdDev := h.StdDev(); 2886.751331514372 != stdDev { + if stdDev := h.StdDev(); stdDev != 2886.751331514372 { t.Errorf("h.StdDev(): 2886.751331514372 != %v\n", stdDev) } ps := h.Percentiles([]float64{0.5, 0.75, 0.99}) - if 5000.5 != ps[0] { + if ps[0] != 5000.5 { t.Errorf("median: 5000.5 != %v\n", ps[0]) } - if 7500.75 != ps[1] { + if ps[1] != 7500.75 { t.Errorf("75th percentile: 7500.75 != %v\n", ps[1]) } - if 9900.99 != ps[2] { + if ps[2] != 9900.99 { t.Errorf("99th percentile: 9900.99 != %v\n", ps[2]) } } diff --git a/metrics/influxdb/influxdb.go b/metrics/influxdb/influxdb.go index 21905c8b42d2..d4fc478e7b14 100644 --- a/metrics/influxdb/influxdb.go +++ b/metrics/influxdb/influxdb.go @@ -5,8 +5,8 @@ import ( uurl "net/url" "time" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" "github.com/influxdata/influxdb/client" ) @@ -62,7 +62,7 @@ func InfluxDBWithTags(r metrics.Registry, d time.Duration, url, database, userna func InfluxDBWithTagsOnce(r metrics.Registry, url, database, username, password, namespace string, tags map[string]string) error { u, err := uurl.Parse(url) if err != nil { - return fmt.Errorf("Unable to parse InfluxDB. url: %s, err: %v", url, err) + return fmt.Errorf("unable to parse InfluxDB. url: %s, err: %v", url, err) } rep := &reporter{ @@ -76,11 +76,11 @@ func InfluxDBWithTagsOnce(r metrics.Registry, url, database, username, password, cache: make(map[string]int64), } if err := rep.makeClient(); err != nil { - return fmt.Errorf("Unable to make InfluxDB client. err: %v", err) + return fmt.Errorf("unable to make InfluxDB client. err: %v", err) } if err := rep.send(); err != nil { - return fmt.Errorf("Unable to send to InfluxDB. err: %v", err) + return fmt.Errorf("unable to send to InfluxDB. err: %v", err) } return nil @@ -91,6 +91,7 @@ func (r *reporter) makeClient() (err error) { URL: r.url, Username: r.username, Password: r.password, + Timeout: 10 * time.Second, }) return diff --git a/metrics/json_test.go b/metrics/json_test.go index cf70051f7a2c..f91fe8cfa54f 100644 --- a/metrics/json_test.go +++ b/metrics/json_test.go @@ -12,7 +12,7 @@ func TestRegistryMarshallJSON(t *testing.T) { r := NewRegistry() r.Register("counter", NewCounter()) enc.Encode(r) - if s := b.String(); "{\"counter\":{\"count\":0}}\n" != s { + if s := b.String(); s != "{\"counter\":{\"count\":0}}\n" { t.Fatalf(s) } } diff --git a/metrics/librato/client.go b/metrics/librato/client.go index 1f8920cb1a0d..f7aed3e4ef9f 100644 --- a/metrics/librato/client.go +++ b/metrics/librato/client.go @@ -96,7 +96,7 @@ func (c *LibratoClient) PostMetrics(batch Batch) (err error) { if body, err = ioutil.ReadAll(resp.Body); err != nil { body = []byte(fmt.Sprintf("(could not fetch response body for error: %s)", err)) } - err = fmt.Errorf("Unable to post to Librato: %d %s %s", resp.StatusCode, resp.Status, string(body)) + err = fmt.Errorf("unable to post to Librato: %d %s %s", resp.StatusCode, resp.Status, string(body)) } return } diff --git a/metrics/librato/librato.go b/metrics/librato/librato.go index 6b80d6f43a34..b16493413ee1 100644 --- a/metrics/librato/librato.go +++ b/metrics/librato/librato.go @@ -7,7 +7,7 @@ import ( "regexp" "time" - "github.com/nebulaai/nbai-node/metrics" + "github.com/ethereum/go-ethereum/metrics" ) // a regexp for extracting the unit from time.Duration.String @@ -42,9 +42,10 @@ func Librato(r metrics.Registry, d time.Duration, e string, t string, s string, func (rep *Reporter) Run() { log.Printf("WARNING: This client has been DEPRECATED! It has been moved to https://github.com/mihasya/go-metrics-librato and will be removed from rcrowley/go-metrics on August 5th 2015") - ticker := time.Tick(rep.Interval) + ticker := time.NewTicker(rep.Interval) + defer ticker.Stop() metricsApi := &LibratoClient{rep.Email, rep.Token} - for now := range ticker { + for now := range ticker.C { var metrics Batch var err error if metrics, err = rep.BuildRequest(now, rep.Registry); err != nil { diff --git a/metrics/meter_test.go b/metrics/meter_test.go index e88922260145..0302c947d8d9 100644 --- a/metrics/meter_test.go +++ b/metrics/meter_test.go @@ -16,7 +16,7 @@ func BenchmarkMeter(b *testing.B) { func TestGetOrRegisterMeter(t *testing.T) { r := NewRegistry() NewRegisteredMeter("foo", r).Mark(47) - if m := GetOrRegisterMeter("foo", r); 47 != m.Count() { + if m := GetOrRegisterMeter("foo", r); m.Count() != 47 { t.Fatal(m) } } @@ -40,7 +40,7 @@ func TestMeterDecay(t *testing.T) { func TestMeterNonzero(t *testing.T) { m := NewMeter() m.Mark(3) - if count := m.Count(); 3 != count { + if count := m.Count(); count != 3 { t.Errorf("m.Count(): 3 != %v\n", count) } } @@ -48,11 +48,11 @@ func TestMeterNonzero(t *testing.T) { func TestMeterStop(t *testing.T) { l := len(arbiter.meters) m := NewMeter() - if len(arbiter.meters) != l+1 { + if l+1 != len(arbiter.meters) { t.Errorf("arbiter.meters: %d != %d\n", l+1, len(arbiter.meters)) } m.Stop() - if len(arbiter.meters) != l { + if l != len(arbiter.meters) { t.Errorf("arbiter.meters: %d != %d\n", l, len(arbiter.meters)) } } @@ -67,7 +67,7 @@ func TestMeterSnapshot(t *testing.T) { func TestMeterZero(t *testing.T) { m := NewMeter() - if count := m.Count(); 0 != count { + if count := m.Count(); count != 0 { t.Errorf("m.Count(): 0 != %v\n", count) } } diff --git a/metrics/metrics.go b/metrics/metrics.go index 9e0d19a66c94..747d6471a764 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -11,28 +11,45 @@ import ( "strings" "time" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // Enabled is checked by the constructor functions for all of the -// standard metrics. If it is true, the metric returned is a stub. +// standard metrics. If it is true, the metric returned is a stub. // // This global kill-switch helps quantify the observer effect and makes // for less cluttered pprof profiles. -var Enabled bool = false +var Enabled = false -// MetricsEnabledFlag is the CLI flag name to use to enable metrics collections. -const MetricsEnabledFlag = "metrics" -const DashboardEnabledFlag = "dashboard" +// EnabledExpensive is a soft-flag meant for external packages to check if costly +// metrics gathering is allowed or not. The goal is to separate standard metrics +// for health monitoring and debug metrics that might impact runtime performance. +var EnabledExpensive = false + +// enablerFlags is the CLI flag names to use to enable metrics collections. +var enablerFlags = []string{"metrics"} + +// expensiveEnablerFlags is the CLI flag names to use to enable metrics collections. +var expensiveEnablerFlags = []string{"metrics.expensive"} // Init enables or disables the metrics system. Since we need this to run before // any other code gets to create meters and timers, we'll actually do an ugly hack // and peek into the command line args for the metrics flag. func init() { for _, arg := range os.Args { - if flag := strings.TrimLeft(arg, "-"); flag == MetricsEnabledFlag || flag == DashboardEnabledFlag { - log.Info("Enabling metrics collection") - Enabled = true + flag := strings.TrimLeft(arg, "-") + + for _, enabler := range enablerFlags { + if !Enabled && flag == enabler { + log.Info("Enabling metrics collection") + Enabled = true + } + } + for _, enabler := range expensiveEnablerFlags { + if !EnabledExpensive && flag == enabler { + log.Info("Enabling expensive metrics collection") + EnabledExpensive = true + } } } } @@ -44,41 +61,56 @@ func CollectProcessMetrics(refresh time.Duration) { if !Enabled { return } + refreshFreq := int64(refresh / time.Second) + // Create the various data collectors + cpuStats := make([]*CPUStats, 2) memstats := make([]*runtime.MemStats, 2) diskstats := make([]*DiskStats, 2) for i := 0; i < len(memstats); i++ { + cpuStats[i] = new(CPUStats) memstats[i] = new(runtime.MemStats) diskstats[i] = new(DiskStats) } // Define the various metrics to collect - memAllocs := GetOrRegisterMeter("system/memory/allocs", DefaultRegistry) - memFrees := GetOrRegisterMeter("system/memory/frees", DefaultRegistry) - memInuse := GetOrRegisterMeter("system/memory/inuse", DefaultRegistry) - memPauses := GetOrRegisterMeter("system/memory/pauses", DefaultRegistry) - - var diskReads, diskReadBytes, diskWrites, diskWriteBytes Meter - var diskReadBytesCounter, diskWriteBytesCounter Counter - if err := ReadDiskStats(diskstats[0]); err == nil { - diskReads = GetOrRegisterMeter("system/disk/readcount", DefaultRegistry) - diskReadBytes = GetOrRegisterMeter("system/disk/readdata", DefaultRegistry) - diskReadBytesCounter = GetOrRegisterCounter("system/disk/readbytes", DefaultRegistry) - diskWrites = GetOrRegisterMeter("system/disk/writecount", DefaultRegistry) - diskWriteBytes = GetOrRegisterMeter("system/disk/writedata", DefaultRegistry) + var ( + cpuSysLoad = GetOrRegisterGauge("system/cpu/sysload", DefaultRegistry) + cpuSysWait = GetOrRegisterGauge("system/cpu/syswait", DefaultRegistry) + cpuProcLoad = GetOrRegisterGauge("system/cpu/procload", DefaultRegistry) + cpuThreads = GetOrRegisterGauge("system/cpu/threads", DefaultRegistry) + cpuGoroutines = GetOrRegisterGauge("system/cpu/goroutines", DefaultRegistry) + + memPauses = GetOrRegisterMeter("system/memory/pauses", DefaultRegistry) + memAllocs = GetOrRegisterMeter("system/memory/allocs", DefaultRegistry) + memFrees = GetOrRegisterMeter("system/memory/frees", DefaultRegistry) + memHeld = GetOrRegisterGauge("system/memory/held", DefaultRegistry) + memUsed = GetOrRegisterGauge("system/memory/used", DefaultRegistry) + + diskReads = GetOrRegisterMeter("system/disk/readcount", DefaultRegistry) + diskReadBytes = GetOrRegisterMeter("system/disk/readdata", DefaultRegistry) + diskReadBytesCounter = GetOrRegisterCounter("system/disk/readbytes", DefaultRegistry) + diskWrites = GetOrRegisterMeter("system/disk/writecount", DefaultRegistry) + diskWriteBytes = GetOrRegisterMeter("system/disk/writedata", DefaultRegistry) diskWriteBytesCounter = GetOrRegisterCounter("system/disk/writebytes", DefaultRegistry) - } else { - log.Debug("Failed to read disk metrics", "err", err) - } + ) // Iterate loading the different stats and updating the meters for i := 1; ; i++ { location1 := i % 2 location2 := (i - 1) % 2 + ReadCPUStats(cpuStats[location1]) + cpuSysLoad.Update((cpuStats[location1].GlobalTime - cpuStats[location2].GlobalTime) / refreshFreq) + cpuSysWait.Update((cpuStats[location1].GlobalWait - cpuStats[location2].GlobalWait) / refreshFreq) + cpuProcLoad.Update((cpuStats[location1].LocalTime - cpuStats[location2].LocalTime) / refreshFreq) + cpuThreads.Update(int64(threadCreateProfile.Count())) + cpuGoroutines.Update(int64(runtime.NumGoroutine())) + runtime.ReadMemStats(memstats[location1]) + memPauses.Mark(int64(memstats[location1].PauseTotalNs - memstats[location2].PauseTotalNs)) memAllocs.Mark(int64(memstats[location1].Mallocs - memstats[location2].Mallocs)) memFrees.Mark(int64(memstats[location1].Frees - memstats[location2].Frees)) - memInuse.Mark(int64(memstats[location1].Alloc - memstats[location2].Alloc)) - memPauses.Mark(int64(memstats[location1].PauseTotalNs - memstats[location2].PauseTotalNs)) + memHeld.Update(int64(memstats[location1].HeapSys - memstats[location1].HeapReleased)) + memUsed.Update(int64(memstats[location1].Alloc)) if ReadDiskStats(diskstats[location1]) == nil { diskReads.Mark(diskstats[location1].ReadCount - diskstats[location2].ReadCount) diff --git a/metrics/opentsdb.go b/metrics/opentsdb.go index df7f152ed2eb..3fde55454ba9 100644 --- a/metrics/opentsdb.go +++ b/metrics/opentsdb.go @@ -10,7 +10,7 @@ import ( "time" ) -var shortHostName string = "" +var shortHostName = "" // OpenTSDBConfig provides a container with configuration parameters for // the OpenTSDB exporter diff --git a/metrics/prometheus/collector.go b/metrics/prometheus/collector.go new file mode 100644 index 000000000000..8350fa2aaf31 --- /dev/null +++ b/metrics/prometheus/collector.go @@ -0,0 +1,115 @@ +// Copyright 2019 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 prometheus + +import ( + "bytes" + "fmt" + "strconv" + "strings" + + "github.com/ethereum/go-ethereum/metrics" +) + +var ( + typeGaugeTpl = "# TYPE %s gauge\n" + typeCounterTpl = "# TYPE %s counter\n" + typeSummaryTpl = "# TYPE %s summary\n" + keyValueTpl = "%s %v\n\n" + keyQuantileTagValueTpl = "%s {quantile=\"%s\"} %v\n\n" +) + +// collector is a collection of byte buffers that aggregate Prometheus reports +// for different metric types. +type collector struct { + buff *bytes.Buffer +} + +// newCollector createa a new Prometheus metric aggregator. +func newCollector() *collector { + return &collector{ + buff: &bytes.Buffer{}, + } +} + +func (c *collector) addCounter(name string, m metrics.Counter) { + c.writeGaugeCounter(name, m.Count()) +} + +func (c *collector) addGauge(name string, m metrics.Gauge) { + c.writeGaugeCounter(name, m.Value()) +} + +func (c *collector) addGaugeFloat64(name string, m metrics.GaugeFloat64) { + c.writeGaugeCounter(name, m.Value()) +} + +func (c *collector) addHistogram(name string, m metrics.Histogram) { + pv := []float64{0.5, 0.75, 0.95, 0.99, 0.999, 0.9999} + ps := m.Percentiles(pv) + c.writeSummaryCounter(name, m.Count()) + for i := range pv { + c.writeSummaryPercentile(name, strconv.FormatFloat(pv[i], 'f', -1, 64), ps[i]) + } +} + +func (c *collector) addMeter(name string, m metrics.Meter) { + c.writeGaugeCounter(name, m.Count()) +} + +func (c *collector) addTimer(name string, m metrics.Timer) { + pv := []float64{0.5, 0.75, 0.95, 0.99, 0.999, 0.9999} + ps := m.Percentiles(pv) + c.writeSummaryCounter(name, m.Count()) + for i := range pv { + c.writeSummaryPercentile(name, strconv.FormatFloat(pv[i], 'f', -1, 64), ps[i]) + } +} + +func (c *collector) addResettingTimer(name string, m metrics.ResettingTimer) { + if len(m.Values()) <= 0 { + return + } + ps := m.Percentiles([]float64{50, 95, 99}) + val := m.Values() + c.writeSummaryCounter(name, len(val)) + c.writeSummaryPercentile(name, "0.50", ps[0]) + c.writeSummaryPercentile(name, "0.95", ps[1]) + c.writeSummaryPercentile(name, "0.99", ps[2]) +} + +func (c *collector) writeGaugeCounter(name string, value interface{}) { + name = mutateKey(name) + c.buff.WriteString(fmt.Sprintf(typeGaugeTpl, name)) + c.buff.WriteString(fmt.Sprintf(keyValueTpl, name, value)) +} + +func (c *collector) writeSummaryCounter(name string, value interface{}) { + name = mutateKey(name + "_count") + c.buff.WriteString(fmt.Sprintf(typeCounterTpl, name)) + c.buff.WriteString(fmt.Sprintf(keyValueTpl, name, value)) +} + +func (c *collector) writeSummaryPercentile(name, p string, value interface{}) { + name = mutateKey(name) + c.buff.WriteString(fmt.Sprintf(typeSummaryTpl, name)) + c.buff.WriteString(fmt.Sprintf(keyQuantileTagValueTpl, name, p, value)) +} + +func mutateKey(key string) string { + return strings.Replace(key, "/", "_", -1) +} diff --git a/metrics/prometheus/prometheus.go b/metrics/prometheus/prometheus.go new file mode 100644 index 000000000000..9ad5ec7e9929 --- /dev/null +++ b/metrics/prometheus/prometheus.go @@ -0,0 +1,68 @@ +// Copyright 2019 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 prometheus exposes go-metrics into a Prometheus format. +package prometheus + +import ( + "fmt" + "net/http" + "sort" + + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" +) + +// Handler returns an HTTP handler which dump metrics in Prometheus format. +func Handler(reg metrics.Registry) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Gather and pre-sort the metrics to avoid random listings + var names []string + reg.Each(func(name string, i interface{}) { + names = append(names, name) + }) + sort.Strings(names) + + // Aggregate all the metris into a Prometheus collector + c := newCollector() + + for _, name := range names { + i := reg.Get(name) + + switch m := i.(type) { + case metrics.Counter: + c.addCounter(name, m.Snapshot()) + case metrics.Gauge: + c.addGauge(name, m.Snapshot()) + case metrics.GaugeFloat64: + c.addGaugeFloat64(name, m.Snapshot()) + case metrics.Histogram: + c.addHistogram(name, m.Snapshot()) + case metrics.Meter: + c.addMeter(name, m.Snapshot()) + case metrics.Timer: + c.addTimer(name, m.Snapshot()) + case metrics.ResettingTimer: + c.addResettingTimer(name, m.Snapshot()) + default: + log.Warn("Unknown Prometheus metric type", "type", fmt.Sprintf("%T", i)) + } + } + w.Header().Add("Content-Type", "text/plain") + w.Header().Add("Content-Length", fmt.Sprint(c.buff.Len())) + w.Write(c.buff.Bytes()) + }) +} diff --git a/metrics/registry.go b/metrics/registry.go index c1cf7906ce09..c5435adf2402 100644 --- a/metrics/registry.go +++ b/metrics/registry.go @@ -312,8 +312,9 @@ func (r *PrefixedRegistry) UnregisterAll() { } var ( - DefaultRegistry = NewRegistry() - EphemeralRegistry = NewRegistry() + DefaultRegistry = NewRegistry() + EphemeralRegistry = NewRegistry() + AccountingRegistry = NewRegistry() // registry used in swarm ) // Call the given function for each registered metric. diff --git a/metrics/registry_test.go b/metrics/registry_test.go index a63e485fe986..6cfedfd88f00 100644 --- a/metrics/registry_test.go +++ b/metrics/registry_test.go @@ -19,20 +19,20 @@ func TestRegistry(t *testing.T) { i := 0 r.Each(func(name string, iface interface{}) { i++ - if "foo" != name { + if name != "foo" { t.Fatal(name) } if _, ok := iface.(Counter); !ok { t.Fatal(iface) } }) - if 1 != i { + if i != 1 { t.Fatal(i) } r.Unregister("foo") i = 0 r.Each(func(string, interface{}) { i++ }) - if 0 != i { + if i != 0 { t.Fatal(i) } } @@ -52,7 +52,7 @@ func TestRegistryDuplicate(t *testing.T) { t.Fatal(iface) } }) - if 1 != i { + if i != 1 { t.Fatal(i) } } @@ -60,11 +60,11 @@ func TestRegistryDuplicate(t *testing.T) { func TestRegistryGet(t *testing.T) { r := NewRegistry() r.Register("foo", NewCounter()) - if count := r.Get("foo").(Counter).Count(); 0 != count { + if count := r.Get("foo").(Counter).Count(); count != 0 { t.Fatal(count) } r.Get("foo").(Counter).Inc(1) - if count := r.Get("foo").(Counter).Count(); 1 != count { + if count := r.Get("foo").(Counter).Count(); count != 1 { t.Fatal(count) } } @@ -271,6 +271,9 @@ func TestChildPrefixedRegistryOfChildRegister(t *testing.T) { t.Fatal(err.Error()) } err = r2.Register("baz", NewCounter()) + if err != nil { + t.Fatal(err.Error()) + } c := NewCounter() Register("bars", c) @@ -278,7 +281,7 @@ func TestChildPrefixedRegistryOfChildRegister(t *testing.T) { r2.Each(func(name string, m interface{}) { i++ if name != "prefix.prefix2.baz" { - //t.Fatal(name) + t.Fatal(name) } }) if i != 1 { @@ -294,11 +297,14 @@ func TestWalkRegistries(t *testing.T) { t.Fatal(err.Error()) } err = r2.Register("baz", NewCounter()) + if err != nil { + t.Fatal(err.Error()) + } c := NewCounter() Register("bars", c) _, prefix := findPrefix(r2, "") - if "prefix.prefix2." != prefix { + if prefix != "prefix.prefix2." { t.Fatal(prefix) } diff --git a/metrics/runtime_test.go b/metrics/runtime_test.go index ebbfd501a25d..f85f7868f71a 100644 --- a/metrics/runtime_test.go +++ b/metrics/runtime_test.go @@ -22,27 +22,27 @@ func TestRuntimeMemStats(t *testing.T) { zero := runtimeMetrics.MemStats.PauseNs.Count() // Get a "zero" since GC may have run before these tests. runtime.GC() CaptureRuntimeMemStatsOnce(r) - if count := runtimeMetrics.MemStats.PauseNs.Count(); 1 != count-zero { + if count := runtimeMetrics.MemStats.PauseNs.Count(); count-zero != 1 { t.Fatal(count - zero) } runtime.GC() runtime.GC() CaptureRuntimeMemStatsOnce(r) - if count := runtimeMetrics.MemStats.PauseNs.Count(); 3 != count-zero { + if count := runtimeMetrics.MemStats.PauseNs.Count(); count-zero != 3 { t.Fatal(count - zero) } for i := 0; i < 256; i++ { runtime.GC() } CaptureRuntimeMemStatsOnce(r) - if count := runtimeMetrics.MemStats.PauseNs.Count(); 259 != count-zero { + if count := runtimeMetrics.MemStats.PauseNs.Count(); count-zero != 259 { t.Fatal(count - zero) } for i := 0; i < 257; i++ { runtime.GC() } CaptureRuntimeMemStatsOnce(r) - if count := runtimeMetrics.MemStats.PauseNs.Count(); 515 != count-zero { // We lost one because there were too many GCs between captures. + if count := runtimeMetrics.MemStats.PauseNs.Count(); count-zero != 515 { // We lost one because there were too many GCs between captures. t.Fatal(count - zero) } } diff --git a/metrics/sample.go b/metrics/sample.go index 5c4845a4f841..fa2bfb274e39 100644 --- a/metrics/sample.go +++ b/metrics/sample.go @@ -234,7 +234,7 @@ func (NilSample) Variance() float64 { return 0.0 } // SampleMax returns the maximum value of the slice of int64. func SampleMax(values []int64) int64 { - if 0 == len(values) { + if len(values) == 0 { return 0 } var max int64 = math.MinInt64 @@ -248,7 +248,7 @@ func SampleMax(values []int64) int64 { // SampleMean returns the mean value of the slice of int64. func SampleMean(values []int64) float64 { - if 0 == len(values) { + if len(values) == 0 { return 0.0 } return float64(SampleSum(values)) / float64(len(values)) @@ -256,7 +256,7 @@ func SampleMean(values []int64) float64 { // SampleMin returns the minimum value of the slice of int64. func SampleMin(values []int64) int64 { - if 0 == len(values) { + if len(values) == 0 { return 0 } var min int64 = math.MaxInt64 @@ -382,7 +382,7 @@ func SampleSum(values []int64) int64 { // SampleVariance returns the variance of the slice of int64. func SampleVariance(values []int64) float64 { - if 0 == len(values) { + if len(values) == 0 { return 0.0 } m := SampleMean(values) diff --git a/metrics/sample_test.go b/metrics/sample_test.go index d60e99c5bba7..3250d88857f8 100644 --- a/metrics/sample_test.go +++ b/metrics/sample_test.go @@ -1,6 +1,7 @@ package metrics import ( + "math" "math/rand" "runtime" "testing" @@ -84,13 +85,13 @@ func TestExpDecaySample10(t *testing.T) { for i := 0; i < 10; i++ { s.Update(int64(i)) } - if size := s.Count(); 10 != size { + if size := s.Count(); size != 10 { t.Errorf("s.Count(): 10 != %v\n", size) } - if size := s.Size(); 10 != size { + if size := s.Size(); size != 10 { t.Errorf("s.Size(): 10 != %v\n", size) } - if l := len(s.Values()); 10 != l { + if l := len(s.Values()); l != 10 { t.Errorf("len(s.Values()): 10 != %v\n", l) } for _, v := range s.Values() { @@ -106,13 +107,13 @@ func TestExpDecaySample100(t *testing.T) { for i := 0; i < 100; i++ { s.Update(int64(i)) } - if size := s.Count(); 100 != size { + if size := s.Count(); size != 100 { t.Errorf("s.Count(): 100 != %v\n", size) } - if size := s.Size(); 100 != size { + if size := s.Size(); size != 100 { t.Errorf("s.Size(): 100 != %v\n", size) } - if l := len(s.Values()); 100 != l { + if l := len(s.Values()); l != 100 { t.Errorf("len(s.Values()): 100 != %v\n", l) } for _, v := range s.Values() { @@ -128,13 +129,13 @@ func TestExpDecaySample1000(t *testing.T) { for i := 0; i < 1000; i++ { s.Update(int64(i)) } - if size := s.Count(); 1000 != size { + if size := s.Count(); size != 1000 { t.Errorf("s.Count(): 1000 != %v\n", size) } - if size := s.Size(); 100 != size { + if size := s.Size(); size != 100 { t.Errorf("s.Size(): 100 != %v\n", size) } - if l := len(s.Values()); 100 != l { + if l := len(s.Values()); l != 100 { t.Errorf("len(s.Values()): 100 != %v\n", l) } for _, v := range s.Values() { @@ -208,13 +209,13 @@ func TestUniformSample(t *testing.T) { for i := 0; i < 1000; i++ { s.Update(int64(i)) } - if size := s.Count(); 1000 != size { + if size := s.Count(); size != 1000 { t.Errorf("s.Count(): 1000 != %v\n", size) } - if size := s.Size(); 100 != size { + if size := s.Size(); size != 100 { t.Errorf("s.Size(): 100 != %v\n", size) } - if l := len(s.Values()); 100 != l { + if l := len(s.Values()); l != 100 { t.Errorf("len(s.Values()): 100 != %v\n", l) } for _, v := range s.Values() { @@ -276,57 +277,57 @@ func benchmarkSample(b *testing.B, s Sample) { } func testExpDecaySampleStatistics(t *testing.T, s Sample) { - if count := s.Count(); 10000 != count { + if count := s.Count(); count != 10000 { t.Errorf("s.Count(): 10000 != %v\n", count) } - if min := s.Min(); 107 != min { + if min := s.Min(); min != 107 { t.Errorf("s.Min(): 107 != %v\n", min) } - if max := s.Max(); 10000 != max { + if max := s.Max(); max != 10000 { t.Errorf("s.Max(): 10000 != %v\n", max) } - if mean := s.Mean(); 4965.98 != mean { + if mean := s.Mean(); mean != 4965.98 { t.Errorf("s.Mean(): 4965.98 != %v\n", mean) } - if stdDev := s.StdDev(); 2959.825156930727 != stdDev { + if stdDev := s.StdDev(); stdDev != 2959.825156930727 { t.Errorf("s.StdDev(): 2959.825156930727 != %v\n", stdDev) } ps := s.Percentiles([]float64{0.5, 0.75, 0.99}) - if 4615 != ps[0] { + if ps[0] != 4615 { t.Errorf("median: 4615 != %v\n", ps[0]) } - if 7672 != ps[1] { + if ps[1] != 7672 { t.Errorf("75th percentile: 7672 != %v\n", ps[1]) } - if 9998.99 != ps[2] { + if ps[2] != 9998.99 { t.Errorf("99th percentile: 9998.99 != %v\n", ps[2]) } } func testUniformSampleStatistics(t *testing.T, s Sample) { - if count := s.Count(); 10000 != count { + if count := s.Count(); count != 10000 { t.Errorf("s.Count(): 10000 != %v\n", count) } - if min := s.Min(); 37 != min { + if min := s.Min(); min != 37 { t.Errorf("s.Min(): 37 != %v\n", min) } - if max := s.Max(); 9989 != max { + if max := s.Max(); max != 9989 { t.Errorf("s.Max(): 9989 != %v\n", max) } - if mean := s.Mean(); 4748.14 != mean { + if mean := s.Mean(); mean != 4748.14 { t.Errorf("s.Mean(): 4748.14 != %v\n", mean) } - if stdDev := s.StdDev(); 2826.684117548333 != stdDev { + if stdDev := s.StdDev(); stdDev != 2826.684117548333 { t.Errorf("s.StdDev(): 2826.684117548333 != %v\n", stdDev) } ps := s.Percentiles([]float64{0.5, 0.75, 0.99}) - if 4599 != ps[0] { + if ps[0] != 4599 { t.Errorf("median: 4599 != %v\n", ps[0]) } - if 7380.5 != ps[1] { + if ps[1] != 7380.5 { t.Errorf("75th percentile: 7380.5 != %v\n", ps[1]) } - if 9986.429999999998 != ps[2] { + if math.Abs(9986.429999999998-ps[2]) > epsilonPercentile { t.Errorf("99th percentile: 9986.429999999998 != %v\n", ps[2]) } } diff --git a/metrics/timer.go b/metrics/timer.go index 89e22208fde0..a63c9dfb6c2d 100644 --- a/metrics/timer.go +++ b/metrics/timer.go @@ -76,10 +76,7 @@ func NewTimer() Timer { } // NilTimer is a no-op Timer. -type NilTimer struct { - h Histogram - m Meter -} +type NilTimer struct{} // Count is a no-op. func (NilTimer) Count() int64 { return 0 } diff --git a/metrics/timer_test.go b/metrics/timer_test.go index 8638a2270bbb..330de609bcd4 100644 --- a/metrics/timer_test.go +++ b/metrics/timer_test.go @@ -18,7 +18,7 @@ func BenchmarkTimer(b *testing.B) { func TestGetOrRegisterTimer(t *testing.T) { r := NewRegistry() NewRegisteredTimer("foo", r).Update(47) - if tm := GetOrRegisterTimer("foo", r); 1 != tm.Count() { + if tm := GetOrRegisterTimer("foo", r); tm.Count() != 1 { t.Fatal(tm) } } @@ -27,7 +27,7 @@ func TestTimerExtremes(t *testing.T) { tm := NewTimer() tm.Update(math.MaxInt64) tm.Update(0) - if stdDev := tm.StdDev(); 4.611686018427388e+18 != stdDev { + if stdDev := tm.StdDev(); stdDev != 4.611686018427388e+18 { t.Errorf("tm.StdDev(): 4.611686018427388e+18 != %v\n", stdDev) } } @@ -35,11 +35,11 @@ func TestTimerExtremes(t *testing.T) { func TestTimerStop(t *testing.T) { l := len(arbiter.meters) tm := NewTimer() - if len(arbiter.meters) != l+1 { + if l+1 != len(arbiter.meters) { t.Errorf("arbiter.meters: %d != %d\n", l+1, len(arbiter.meters)) } tm.Stop() - if len(arbiter.meters) != l { + if l != len(arbiter.meters) { t.Errorf("arbiter.meters: %d != %d\n", l, len(arbiter.meters)) } } @@ -54,41 +54,41 @@ func TestTimerFunc(t *testing.T) { func TestTimerZero(t *testing.T) { tm := NewTimer() - if count := tm.Count(); 0 != count { + if count := tm.Count(); count != 0 { t.Errorf("tm.Count(): 0 != %v\n", count) } - if min := tm.Min(); 0 != min { + if min := tm.Min(); min != 0 { t.Errorf("tm.Min(): 0 != %v\n", min) } - if max := tm.Max(); 0 != max { + if max := tm.Max(); max != 0 { t.Errorf("tm.Max(): 0 != %v\n", max) } - if mean := tm.Mean(); 0.0 != mean { + if mean := tm.Mean(); mean != 0.0 { t.Errorf("tm.Mean(): 0.0 != %v\n", mean) } - if stdDev := tm.StdDev(); 0.0 != stdDev { + if stdDev := tm.StdDev(); stdDev != 0.0 { t.Errorf("tm.StdDev(): 0.0 != %v\n", stdDev) } ps := tm.Percentiles([]float64{0.5, 0.75, 0.99}) - if 0.0 != ps[0] { + if ps[0] != 0.0 { t.Errorf("median: 0.0 != %v\n", ps[0]) } - if 0.0 != ps[1] { + if ps[1] != 0.0 { t.Errorf("75th percentile: 0.0 != %v\n", ps[1]) } - if 0.0 != ps[2] { + if ps[2] != 0.0 { t.Errorf("99th percentile: 0.0 != %v\n", ps[2]) } - if rate1 := tm.Rate1(); 0.0 != rate1 { + if rate1 := tm.Rate1(); rate1 != 0.0 { t.Errorf("tm.Rate1(): 0.0 != %v\n", rate1) } - if rate5 := tm.Rate5(); 0.0 != rate5 { + if rate5 := tm.Rate5(); rate5 != 0.0 { t.Errorf("tm.Rate5(): 0.0 != %v\n", rate5) } - if rate15 := tm.Rate15(); 0.0 != rate15 { + if rate15 := tm.Rate15(); rate15 != 0.0 { t.Errorf("tm.Rate15(): 0.0 != %v\n", rate15) } - if rateMean := tm.RateMean(); 0.0 != rateMean { + if rateMean := tm.RateMean(); rateMean != 0.0 { t.Errorf("tm.RateMean(): 0.0 != %v\n", rateMean) } } diff --git a/miner/miner.go b/miner/miner.go index 6890c36f6ad2..bc9af0f06059 100644 --- a/miner/miner.go +++ b/miner/miner.go @@ -19,18 +19,20 @@ package miner import ( "fmt" + "math/big" "sync/atomic" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" ) // Backend wraps all methods required for mining. @@ -39,6 +41,18 @@ type Backend interface { TxPool() *core.TxPool } +// Config is the configuration parameters of mining. +type Config struct { + Etherbase common.Address `toml:",omitempty"` // Public address for block mining rewards (default = first account) + Notify []string `toml:",omitempty"` // HTTP URL list to be notified of new work packages(only useful in ethash). + ExtraData hexutil.Bytes `toml:",omitempty"` // Block extra data set by the miner + GasFloor uint64 // Target gas floor for mined blocks. + GasCeil uint64 // Target gas ceiling for mined blocks. + GasPrice *big.Int // Minimum gas price for mining a transaction + Recommit time.Duration // The time interval for miner to re-create mining work. + Noverify bool // Disable remote mining solution verification(only useful in ethash). +} + // Miner creates blocks and searches for proof-of-work values. type Miner struct { mux *event.TypeMux @@ -52,13 +66,13 @@ type Miner struct { shouldStart int32 // should start indicates whether we should start after sync } -func New(eth Backend, config *params.ChainConfig, mux *event.TypeMux, engine consensus.Engine, recommit time.Duration, gasFloor, gasCeil uint64, isLocalBlock func(block *types.Block) bool) *Miner { +func New(eth Backend, config *Config, chainConfig *params.ChainConfig, mux *event.TypeMux, engine consensus.Engine, isLocalBlock func(block *types.Block) bool) *Miner { miner := &Miner{ eth: eth, mux: mux, engine: engine, exitCh: make(chan struct{}), - worker: newWorker(config, engine, eth, mux, recommit, gasFloor, gasCeil, isLocalBlock), + worker: newWorker(config, chainConfig, engine, eth, mux, isLocalBlock, true), canStart: 1, } go miner.update() @@ -70,8 +84,8 @@ func New(eth Backend, config *params.ChainConfig, mux *event.TypeMux, engine con // It's entered once and as soon as `Done` or `Failed` has been broadcasted the events are unregistered and // the loop is exited. This to prevent a major security vuln where external parties can DOS you with blocks // and halt your mining operation for as long as the DOS continues. -func (self *Miner) update() { - events := self.mux.Subscribe(downloader.StartEvent{}, downloader.DoneEvent{}, downloader.FailedEvent{}) +func (miner *Miner) update() { + events := miner.mux.Subscribe(downloader.StartEvent{}, downloader.DoneEvent{}, downloader.FailedEvent{}) defer events.Unsubscribe() for { @@ -82,77 +96,77 @@ func (self *Miner) update() { } switch ev.Data.(type) { case downloader.StartEvent: - atomic.StoreInt32(&self.canStart, 0) - if self.Mining() { - self.Stop() - atomic.StoreInt32(&self.shouldStart, 1) + atomic.StoreInt32(&miner.canStart, 0) + if miner.Mining() { + miner.Stop() + atomic.StoreInt32(&miner.shouldStart, 1) log.Info("Mining aborted due to sync") } case downloader.DoneEvent, downloader.FailedEvent: - shouldStart := atomic.LoadInt32(&self.shouldStart) == 1 + shouldStart := atomic.LoadInt32(&miner.shouldStart) == 1 - atomic.StoreInt32(&self.canStart, 1) - atomic.StoreInt32(&self.shouldStart, 0) + atomic.StoreInt32(&miner.canStart, 1) + atomic.StoreInt32(&miner.shouldStart, 0) if shouldStart { - self.Start(self.coinbase) + miner.Start(miner.coinbase) } // stop immediately and ignore all further pending events return } - case <-self.exitCh: + case <-miner.exitCh: return } } } -func (self *Miner) Start(coinbase common.Address) { - atomic.StoreInt32(&self.shouldStart, 1) - self.SetEtherbase(coinbase) +func (miner *Miner) Start(coinbase common.Address) { + atomic.StoreInt32(&miner.shouldStart, 1) + miner.SetEtherbase(coinbase) - if atomic.LoadInt32(&self.canStart) == 0 { + if atomic.LoadInt32(&miner.canStart) == 0 { log.Info("Network syncing, will start miner afterwards") return } - self.worker.start() + miner.worker.start() } -func (self *Miner) Stop() { - self.worker.stop() - atomic.StoreInt32(&self.shouldStart, 0) +func (miner *Miner) Stop() { + miner.worker.stop() + atomic.StoreInt32(&miner.shouldStart, 0) } -func (self *Miner) Close() { - self.worker.close() - close(self.exitCh) +func (miner *Miner) Close() { + miner.worker.close() + close(miner.exitCh) } -func (self *Miner) Mining() bool { - return self.worker.isRunning() +func (miner *Miner) Mining() bool { + return miner.worker.isRunning() } -func (self *Miner) HashRate() uint64 { - if pow, ok := self.engine.(consensus.PoW); ok { +func (miner *Miner) HashRate() uint64 { + if pow, ok := miner.engine.(consensus.PoW); ok { return uint64(pow.Hashrate()) } return 0 } -func (self *Miner) SetExtra(extra []byte) error { +func (miner *Miner) SetExtra(extra []byte) error { if uint64(len(extra)) > params.MaximumExtraDataSize { - return fmt.Errorf("Extra exceeds max length. %d > %v", len(extra), params.MaximumExtraDataSize) + return fmt.Errorf("extra exceeds max length. %d > %v", len(extra), params.MaximumExtraDataSize) } - self.worker.setExtra(extra) + miner.worker.setExtra(extra) return nil } // SetRecommitInterval sets the interval for sealing work resubmitting. -func (self *Miner) SetRecommitInterval(interval time.Duration) { - self.worker.setRecommitInterval(interval) +func (miner *Miner) SetRecommitInterval(interval time.Duration) { + miner.worker.setRecommitInterval(interval) } // Pending returns the currently pending block and associated state. -func (self *Miner) Pending() (*types.Block, *state.StateDB) { - return self.worker.pending() +func (miner *Miner) Pending() (*types.Block, *state.StateDB) { + return miner.worker.pending() } // PendingBlock returns the currently pending block. @@ -160,11 +174,11 @@ func (self *Miner) Pending() (*types.Block, *state.StateDB) { // Note, to access both the pending block and the pending state // simultaneously, please use Pending(), as the pending state can // change between multiple method calls -func (self *Miner) PendingBlock() *types.Block { - return self.worker.pendingBlock() +func (miner *Miner) PendingBlock() *types.Block { + return miner.worker.pendingBlock() } -func (self *Miner) SetEtherbase(addr common.Address) { - self.coinbase = addr - self.worker.setEtherbase(addr) +func (miner *Miner) SetEtherbase(addr common.Address) { + miner.coinbase = addr + miner.worker.setEtherbase(addr) } diff --git a/miner/stress_clique.go b/miner/stress_clique.go index 65603132b08c..7f5db2e520b0 100644 --- a/miner/stress_clique.go +++ b/miner/stress_clique.go @@ -28,19 +28,19 @@ import ( "os" "time" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/fdlimit" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/eth" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/fdlimit" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" ) func main() { @@ -69,7 +69,7 @@ func main() { if err != nil { panic(err) } - defer node.Stop() + defer node.Close() for node.Server().NodeInfo().Ports.Listener == 0 { time.Sleep(250 * time.Millisecond) @@ -199,10 +199,12 @@ func makeSealer(genesis *core.Genesis) (*node.Node, error) { DatabaseHandles: 256, TxPool: core.DefaultTxPoolConfig, GPO: eth.DefaultConfig.GPO, - MinerGasFloor: genesis.GasLimit * 9 / 10, - MinerGasCeil: genesis.GasLimit * 11 / 10, - MinerGasPrice: big.NewInt(1), - MinerRecommit: time.Second, + Miner: Config{ + GasFloor: genesis.GasLimit * 9 / 10, + GasCeil: genesis.GasLimit * 11 / 10, + GasPrice: big.NewInt(1), + Recommit: time.Second, + }, }) }); err != nil { return nil, err diff --git a/miner/stress_ethash.go b/miner/stress_ethash.go index c7b416fbacff..7d4a7d24f7dd 100644 --- a/miner/stress_ethash.go +++ b/miner/stress_ethash.go @@ -28,20 +28,20 @@ import ( "path/filepath" "time" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/fdlimit" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/eth" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/fdlimit" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/params" ) func main() { @@ -69,7 +69,7 @@ func main() { if err != nil { panic(err) } - defer node.Stop() + defer node.Close() for node.Server().NodeInfo().Ports.Listener == 0 { time.Sleep(250 * time.Millisecond) @@ -179,10 +179,12 @@ func makeMiner(genesis *core.Genesis) (*node.Node, error) { TxPool: core.DefaultTxPoolConfig, GPO: eth.DefaultConfig.GPO, Ethash: eth.DefaultConfig.Ethash, - MinerGasFloor: genesis.GasLimit * 9 / 10, - MinerGasCeil: genesis.GasLimit * 11 / 10, - MinerGasPrice: big.NewInt(1), - MinerRecommit: time.Second, + Miner: Config{ + GasFloor: genesis.GasLimit * 9 / 10, + GasCeil: genesis.GasLimit * 11 / 10, + GasPrice: big.NewInt(1), + Recommit: time.Second, + }, }) }); err != nil { return nil, err diff --git a/miner/unconfirmed.go b/miner/unconfirmed.go index 4e0306cded64..3a176e8bd6f6 100644 --- a/miner/unconfirmed.go +++ b/miner/unconfirmed.go @@ -20,9 +20,9 @@ import ( "container/ring" "sync" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/log" ) // chainRetriever is used by the unconfirmed block set to verify whether a previously diff --git a/miner/unconfirmed_test.go b/miner/unconfirmed_test.go index 40bafd28521d..42e77f3e648c 100644 --- a/miner/unconfirmed_test.go +++ b/miner/unconfirmed_test.go @@ -19,8 +19,8 @@ package miner import ( "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" ) // noopChainRetriever is an implementation of headerRetriever that always diff --git a/miner/worker.go b/miner/worker.go index 81f507de0193..c95b32042f14 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -25,15 +25,15 @@ import ( "time" mapset "github.com/deckarep/golang-set" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/consensus/misc" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/misc" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/params" ) const ( @@ -122,13 +122,11 @@ type intervalAdjust struct { // worker is the main object which takes care of submitting new work to consensus engine // and gathering the sealing result. type worker struct { - config *params.ChainConfig - engine consensus.Engine - eth Backend - chain *core.BlockChain - - gasFloor uint64 - gasCeil uint64 + config *Config + chainConfig *params.ChainConfig + engine consensus.Engine + eth Backend + chain *core.BlockChain // Subscriptions mux *event.TypeMux @@ -178,15 +176,14 @@ type worker struct { resubmitHook func(time.Duration, time.Duration) // Method to call upon updating resubmitting interval. } -func newWorker(config *params.ChainConfig, engine consensus.Engine, eth Backend, mux *event.TypeMux, recommit time.Duration, gasFloor, gasCeil uint64, isLocalBlock func(*types.Block) bool) *worker { +func newWorker(config *Config, chainConfig *params.ChainConfig, engine consensus.Engine, eth Backend, mux *event.TypeMux, isLocalBlock func(*types.Block) bool, init bool) *worker { worker := &worker{ config: config, + chainConfig: chainConfig, engine: engine, eth: eth, mux: mux, chain: eth.BlockChain(), - gasFloor: gasFloor, - gasCeil: gasCeil, isLocalBlock: isLocalBlock, localUncles: make(map[common.Hash]*types.Block), remoteUncles: make(map[common.Hash]*types.Block), @@ -210,6 +207,7 @@ func newWorker(config *params.ChainConfig, engine consensus.Engine, eth Backend, worker.chainSideSub = eth.BlockChain().SubscribeChainSideEvent(worker.chainSideCh) // Sanitize recommit interval if the user-specified one is too short. + recommit := worker.config.Recommit if recommit < minRecommitInterval { log.Warn("Sanitizing miner recommit interval", "provided", recommit, "updated", minRecommitInterval) recommit = minRecommitInterval @@ -221,8 +219,9 @@ func newWorker(config *params.ChainConfig, engine consensus.Engine, eth Backend, go worker.taskLoop() // Submit first work to initialize pending state. - worker.startCh <- struct{}{} - + if init { + worker.startCh <- struct{}{} + } return worker } @@ -354,7 +353,7 @@ func (w *worker) newWorkLoop(recommit time.Duration) { case <-timer.C: // If mining is running resubmit a new work cycle periodically to pull in // higher priced transactions. Disable this overhead for pending blocks. - if w.isRunning() && (w.config.Clique == nil || w.config.Clique.Period > 0) { + if w.isRunning() && (w.chainConfig.Clique == nil || w.chainConfig.Clique.Period > 0) { // Short circuit if no new transaction arrives. if atomic.LoadInt32(&w.newTxs) == 0 { timer.Reset(recommit) @@ -455,6 +454,10 @@ func (w *worker) mainLoop() { // already included in the current mining block. These transactions will // be automatically eliminated. if !w.isRunning() && w.current != nil { + // If block is already full, abort + if gp := w.current.gasPool; gp != nil && gp.Gas() < params.TxGas { + continue + } w.mu.RLock() coinbase := w.coinbase w.mu.RUnlock() @@ -465,12 +468,18 @@ func (w *worker) mainLoop() { txs[acc] = append(txs[acc], tx) } txset := types.NewTransactionsByPriceAndNonce(w.current.signer, txs) + tcount := w.current.tcount w.commitTransactions(txset, coinbase, nil) - w.updateSnapshot() + // Only update the snapshot if any new transactons were added + // to the pending block + if tcount != w.current.tcount { + w.updateSnapshot() + } } else { - // If we're mining, but nothing is being processed, wake on new transactions - if w.config.Clique != nil && w.config.Clique.Period == 0 { - w.commitNewWork(nil, false, time.Now().Unix()) + // If clique is running in dev mode(period is 0), disable + // advance sealing here. + if w.chainConfig.Clique != nil && w.chainConfig.Clique.Period == 0 { + w.commitNewWork(nil, true, time.Now().Unix()) } } atomic.AddInt32(&w.newTxs, int32(len(ev.Txs))) @@ -566,6 +575,11 @@ func (w *worker) resultLoop() { logs []*types.Log ) for i, receipt := range task.receipts { + // add block location fields + receipt.BlockHash = hash + receipt.BlockNumber = block.Number() + receipt.TransactionIndex = uint(i) + receipts[i] = new(types.Receipt) *receipts[i] = *receipt // Update the block hash in all logs since it is now available and not when the @@ -576,7 +590,7 @@ func (w *worker) resultLoop() { logs = append(logs, receipt.Logs...) } // Commit block and state to database. - stat, err := w.chain.WriteBlockWithState(block, receipts, task.state) + _, err := w.chain.WriteBlockWithState(block, receipts, logs, task.state, true) if err != nil { log.Error("Failed writing block to chain", "err", err) continue @@ -587,16 +601,6 @@ func (w *worker) resultLoop() { // Broadcast the block and announce chain insertion event w.mux.Post(core.NewMinedBlockEvent{Block: block}) - var events []interface{} - switch stat { - case core.CanonStatTy: - events = append(events, core.ChainEvent{Block: block, Hash: block.Hash(), Logs: logs}) - events = append(events, core.ChainHeadEvent{Block: block}) - case core.SideStatTy: - events = append(events, core.ChainSideEvent{Block: block}) - } - w.chain.PostChainEvents(events, logs) - // Insert the block into the set of pending ones to resultLoop for confirmations w.unconfirmed.Insert(block.NumberU64(), block.Hash()) @@ -613,7 +617,7 @@ func (w *worker) makeCurrent(parent *types.Block, header *types.Header) error { return err } env := &environment{ - signer: types.NewEIP155Signer(w.config.ChainID), + signer: types.NewEIP155Signer(w.chainConfig.ChainID), state: state, ancestors: mapset.NewSet(), family: mapset.NewSet(), @@ -691,7 +695,7 @@ func (w *worker) updateSnapshot() { func (w *worker) commitTransaction(tx *types.Transaction, coinbase common.Address) ([]*types.Log, error) { snap := w.current.state.Snapshot() - receipt, _, err := core.ApplyTransaction(w.config, w.chain, &coinbase, w.current.gasPool, w.current.state, w.current.header, tx, &w.current.header.GasUsed, *w.chain.GetVMConfig()) + receipt, err := core.ApplyTransaction(w.chainConfig, w.chain, &coinbase, w.current.gasPool, w.current.state, w.current.header, tx, &w.current.header.GasUsed, *w.chain.GetVMConfig()) if err != nil { w.current.state.RevertToSnapshot(snap) return nil, err @@ -752,8 +756,8 @@ func (w *worker) commitTransactions(txs *types.TransactionsByPriceAndNonce, coin from, _ := types.Sender(w.current.signer, tx) // Check whether the tx is replay protected. If we're not in the EIP155 hf // phase, start ignoring the sender until we do. - if tx.Protected() && !w.config.IsEIP155(w.current.header.Number) { - log.Trace("Ignoring reply protected transaction", "hash", tx.Hash(), "eip155", w.config.EIP155Block) + if tx.Protected() && !w.chainConfig.IsEIP155(w.current.header.Number) { + log.Trace("Ignoring reply protected transaction", "hash", tx.Hash(), "eip155", w.chainConfig.EIP155Block) txs.Pop() continue @@ -823,8 +827,8 @@ func (w *worker) commitNewWork(interrupt *int32, noempty bool, timestamp int64) tstart := time.Now() parent := w.chain.CurrentBlock() - if parent.Time().Cmp(new(big.Int).SetInt64(timestamp)) >= 0 { - timestamp = parent.Time().Int64() + 1 + if parent.Time() >= uint64(timestamp) { + timestamp = int64(parent.Time() + 1) } // this will ensure we're not going off too far in the future if now := time.Now().Unix(); timestamp > now+1 { @@ -837,9 +841,9 @@ func (w *worker) commitNewWork(interrupt *int32, noempty bool, timestamp int64) header := &types.Header{ ParentHash: parent.Hash(), Number: num.Add(num, common.Big1), - GasLimit: core.CalcGasLimit(parent, w.gasFloor, w.gasCeil), + GasLimit: core.CalcGasLimit(parent, w.config.GasFloor, w.config.GasCeil), Extra: w.extra, - Time: big.NewInt(timestamp), + Time: uint64(timestamp), } // Only set the coinbase if our consensus engine is running (avoid spurious block rewards) if w.isRunning() { @@ -854,12 +858,12 @@ func (w *worker) commitNewWork(interrupt *int32, noempty bool, timestamp int64) return } // If we are care about TheDAO hard-fork check whether to override the extra-data or not - if daoBlock := w.config.DAOForkBlock; daoBlock != nil { + if daoBlock := w.chainConfig.DAOForkBlock; daoBlock != nil { // Check whether the block is among the fork extra-override range limit := new(big.Int).Add(daoBlock, params.DAOForkExtraRange) if header.Number.Cmp(daoBlock) >= 0 && header.Number.Cmp(limit) < 0 { // Depending whether we support or oppose the fork, override differently - if w.config.DAOForkSupport { + if w.chainConfig.DAOForkSupport { header.Extra = common.CopyBytes(params.DAOForkBlockExtra) } else if bytes.Equal(header.Extra, params.DAOForkBlockExtra) { header.Extra = []byte{} // If miner opposes, don't let it use the reserved extra-data @@ -874,7 +878,7 @@ func (w *worker) commitNewWork(interrupt *int32, noempty bool, timestamp int64) } // Create the current work task and check any fork transitions needed env := w.current - if w.config.DAOForkSupport && w.config.DAOForkBlock != nil && w.config.DAOForkBlock.Cmp(header.Number) == 0 { + if w.chainConfig.DAOForkSupport && w.chainConfig.DAOForkBlock != nil && w.chainConfig.DAOForkBlock.Cmp(header.Number) == 0 { misc.ApplyDAOHardFork(env.state) } // Accumulate the uncles for the current block @@ -952,7 +956,7 @@ func (w *worker) commit(uncles []*types.Header, interval func(), update bool, st *receipts[i] = *l } s := w.current.state.Copy() - block, err := w.engine.Finalize(w.chain, w.current.header, s, w.current.txs, uncles, w.current.receipts) + block, err := w.engine.FinalizeAndAssemble(w.chain, w.current.header, s, w.current.txs, uncles, w.current.receipts) if err != nil { return err } @@ -982,3 +986,11 @@ func (w *worker) commit(uncles []*types.Header, interval func(), update bool, st } return nil } + +// postSideBlock fires a side chain event, only use it for testing. +func (w *worker) postSideBlock(event core.ChainSideEvent) { + select { + case w.chainSideCh <- event: + case <-w.exitCh: + } +} diff --git a/miner/worker_test.go b/miner/worker_test.go index 9a21d34b9665..81fb8f1b9477 100644 --- a/miner/worker_test.go +++ b/miner/worker_test.go @@ -17,21 +17,35 @@ package miner import ( + "fmt" "math/big" + "math/rand" + "sync/atomic" "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/consensus/clique" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/clique" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/params" +) + +const ( + // testCode is the testing contract binary code which will initialises some + // variables in constructor + testCode = "0x60806040527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0060005534801561003457600080fd5b5060fc806100436000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c80630c4dae8814603757806398a213cf146053575b600080fd5b603d607e565b6040518082815260200191505060405180910390f35b607c60048036036020811015606757600080fd5b81019080803590602001909291905050506084565b005b60005481565b806000819055507fe9e44f9f7da8c559de847a3232b57364adc0354f15a2cd8dc636d54396f9587a6000546040518082815260200191505060405180910390a15056fea265627a7a723058208ae31d9424f2d0bc2a3da1a5dd659db2d71ec322a17db8f87e19e209e3a1ff4a64736f6c634300050a0032" + + // testGas is the gas required for contract deployment. + testGas = 144109 ) var ( @@ -51,6 +65,12 @@ var ( // Test transactions pendingTxs []*types.Transaction newTxs []*types.Transaction + + testConfig = &Config{ + Recommit: time.Second, + GasFloor: params.GenesisGasLimit, + GasCeil: params.GenesisGasLimit, + } ) func init() { @@ -66,6 +86,7 @@ func init() { pendingTxs = append(pendingTxs, tx1) tx2, _ := types.SignTx(types.NewTransaction(1, testUserAddress, big.NewInt(1000), params.TxGas, nil, nil), types.HomesteadSigner{}, testBankKey) newTxs = append(newTxs, tx2) + rand.Seed(time.Now().UnixNano()) } // testWorkerBackend implements worker.Backend interfaces and wraps all information needed during the testing. @@ -74,29 +95,30 @@ type testWorkerBackend struct { txPool *core.TxPool chain *core.BlockChain testTxFeed event.Feed + genesis *core.Genesis uncleBlock *types.Block } -func newTestWorkerBackend(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine, n int) *testWorkerBackend { - var ( - db = ethdb.NewMemDatabase() - gspec = core.Genesis{ - Config: chainConfig, - Alloc: core.GenesisAlloc{testBankAddress: {Balance: testBankFunds}}, - } - ) +func newTestWorkerBackend(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine, db ethdb.Database, n int) *testWorkerBackend { + var gspec = core.Genesis{ + Config: chainConfig, + Alloc: core.GenesisAlloc{testBankAddress: {Balance: testBankFunds}}, + } - switch engine.(type) { + switch e := engine.(type) { case *clique.Clique: - gspec.ExtraData = make([]byte, 32+common.AddressLength+65) - copy(gspec.ExtraData[32:], testBankAddress[:]) + gspec.ExtraData = make([]byte, 32+common.AddressLength+crypto.SignatureLength) + copy(gspec.ExtraData[32:32+common.AddressLength], testBankAddress.Bytes()) + e.Authorize(testBankAddress, func(account accounts.Account, s string, data []byte) ([]byte, error) { + return crypto.Sign(crypto.Keccak256(data), testBankKey) + }) case *ethash.Ethash: default: t.Fatalf("unexpected consensus engine type: %T", engine) } genesis := gspec.MustCommit(db) - chain, _ := core.NewBlockChain(db, nil, gspec.Config, engine, vm.Config{}, nil) + chain, _ := core.NewBlockChain(db, &core.CacheConfig{TrieDirtyDisabled: true}, gspec.Config, engine, vm.Config{}, nil) txpool := core.NewTxPool(testTxPoolConfig, chainConfig, chain) // Generate a small n-block chain and an uncle block for it @@ -120,53 +142,113 @@ func newTestWorkerBackend(t *testing.T, chainConfig *params.ChainConfig, engine db: db, chain: chain, txPool: txpool, + genesis: &gspec, uncleBlock: blocks[0], } } func (b *testWorkerBackend) BlockChain() *core.BlockChain { return b.chain } func (b *testWorkerBackend) TxPool() *core.TxPool { return b.txPool } -func (b *testWorkerBackend) PostChainEvents(events []interface{}) { - b.chain.PostChainEvents(events, nil) + +func (b *testWorkerBackend) newRandomUncle() *types.Block { + var parent *types.Block + cur := b.chain.CurrentBlock() + if cur.NumberU64() == 0 { + parent = b.chain.Genesis() + } else { + parent = b.chain.GetBlockByHash(b.chain.CurrentBlock().ParentHash()) + } + blocks, _ := core.GenerateChain(b.chain.Config(), parent, b.chain.Engine(), b.db, 1, func(i int, gen *core.BlockGen) { + var addr = make([]byte, common.AddressLength) + rand.Read(addr) + gen.SetCoinbase(common.BytesToAddress(addr)) + }) + return blocks[0] } -func newTestWorker(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine, blocks int) (*worker, *testWorkerBackend) { - backend := newTestWorkerBackend(t, chainConfig, engine, blocks) +func (b *testWorkerBackend) newRandomTx(creation bool) *types.Transaction { + var tx *types.Transaction + if creation { + tx, _ = types.SignTx(types.NewContractCreation(b.txPool.Nonce(testBankAddress), big.NewInt(0), testGas, nil, common.FromHex(testCode)), types.HomesteadSigner{}, testBankKey) + } else { + tx, _ = types.SignTx(types.NewTransaction(b.txPool.Nonce(testBankAddress), testUserAddress, big.NewInt(1000), params.TxGas, nil, nil), types.HomesteadSigner{}, testBankKey) + } + return tx +} + +func newTestWorker(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine, db ethdb.Database, blocks int) (*worker, *testWorkerBackend) { + backend := newTestWorkerBackend(t, chainConfig, engine, db, blocks) backend.txPool.AddLocals(pendingTxs) - w := newWorker(chainConfig, engine, backend, new(event.TypeMux), time.Second, params.GenesisGasLimit, params.GenesisGasLimit, nil) + w := newWorker(testConfig, chainConfig, engine, backend, new(event.TypeMux), nil, false) w.setEtherbase(testBankAddress) return w, backend } -func TestPendingStateAndBlockEthash(t *testing.T) { - testPendingStateAndBlock(t, ethashChainConfig, ethash.NewFaker()) +func TestGenerateBlockAndImportEthash(t *testing.T) { + testGenerateBlockAndImport(t, false) } -func TestPendingStateAndBlockClique(t *testing.T) { - testPendingStateAndBlock(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, ethdb.NewMemDatabase())) + +func TestGenerateBlockAndImportClique(t *testing.T) { + testGenerateBlockAndImport(t, true) } -func testPendingStateAndBlock(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine) { - defer engine.Close() +func testGenerateBlockAndImport(t *testing.T, isClique bool) { + var ( + engine consensus.Engine + chainConfig *params.ChainConfig + db = rawdb.NewMemoryDatabase() + ) + if isClique { + chainConfig = params.AllCliqueProtocolChanges + chainConfig.Clique = ¶ms.CliqueConfig{Period: 1, Epoch: 30000} + engine = clique.New(chainConfig.Clique, db) + } else { + chainConfig = params.AllEthashProtocolChanges + engine = ethash.NewFaker() + } - w, b := newTestWorker(t, chainConfig, engine, 0) + w, b := newTestWorker(t, chainConfig, engine, db, 0) defer w.close() - // Ensure snapshot has been updated. - time.Sleep(100 * time.Millisecond) - block, state := w.pending() - if block.NumberU64() != 1 { - t.Errorf("block number mismatch: have %d, want %d", block.NumberU64(), 1) + db2 := rawdb.NewMemoryDatabase() + b.genesis.MustCommit(db2) + chain, _ := core.NewBlockChain(db2, nil, b.chain.Config(), engine, vm.Config{}, nil) + defer chain.Stop() + + loopErr := make(chan error) + newBlock := make(chan struct{}) + listenNewBlock := func() { + sub := w.mux.Subscribe(core.NewMinedBlockEvent{}) + defer sub.Unsubscribe() + + for item := range sub.Chan() { + block := item.Data.(core.NewMinedBlockEvent).Block + _, err := chain.InsertChain([]*types.Block{block}) + if err != nil { + loopErr <- fmt.Errorf("failed to insert new mined block:%d, error:%v", block.NumberU64(), err) + } + newBlock <- struct{}{} + } } - if balance := state.GetBalance(testUserAddress); balance.Cmp(big.NewInt(1000)) != 0 { - t.Errorf("account balance mismatch: have %d, want %d", balance, 1000) + // Ignore empty commit here for less noise + w.skipSealHook = func(task *task) bool { + return len(task.receipts) == 0 } - b.txPool.AddLocals(newTxs) + w.start() // Start mining! + go listenNewBlock() - // Ensure the new tx events has been processed - time.Sleep(100 * time.Millisecond) - block, state = w.pending() - if balance := state.GetBalance(testUserAddress); balance.Cmp(big.NewInt(2000)) != 0 { - t.Errorf("account balance mismatch: have %d, want %d", balance, 2000) + for i := 0; i < 5; i++ { + b.txPool.AddLocal(b.newRandomTx(true)) + b.txPool.AddLocal(b.newRandomTx(false)) + w.postSideBlock(core.ChainSideEvent{Block: b.newRandomUncle()}) + w.postSideBlock(core.ChainSideEvent{Block: b.newRandomUncle()}) + select { + case e := <-loopErr: + t.Fatal(e) + case <-newBlock: + case <-time.NewTimer(3 * time.Second).C: // Worker needs 1s to include new changes. + t.Fatalf("timeout") + } } } @@ -174,33 +256,33 @@ func TestEmptyWorkEthash(t *testing.T) { testEmptyWork(t, ethashChainConfig, ethash.NewFaker()) } func TestEmptyWorkClique(t *testing.T) { - testEmptyWork(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, ethdb.NewMemDatabase())) + testEmptyWork(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, rawdb.NewMemoryDatabase())) } func testEmptyWork(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine) { defer engine.Close() - w, _ := newTestWorker(t, chainConfig, engine, 0) + w, _ := newTestWorker(t, chainConfig, engine, rawdb.NewMemoryDatabase(), 0) defer w.close() var ( - taskCh = make(chan struct{}, 2) taskIndex int + taskCh = make(chan struct{}, 2) ) - checkEqual := func(t *testing.T, task *task, index int) { + // The first empty work without any txs included receiptLen, balance := 0, big.NewInt(0) if index == 1 { + // The second full work with 1 tx included receiptLen, balance = 1, big.NewInt(1000) } if len(task.receipts) != receiptLen { - t.Errorf("receipt number mismatch: have %d, want %d", len(task.receipts), receiptLen) + t.Fatalf("receipt number mismatch: have %d, want %d", len(task.receipts), receiptLen) } if task.state.GetBalance(testUserAddress).Cmp(balance) != 0 { - t.Errorf("account balance mismatch: have %d, want %d", task.state.GetBalance(testUserAddress), balance) + t.Fatalf("account balance mismatch: have %d, want %d", task.state.GetBalance(testUserAddress), balance) } } - w.newTaskHook = func(task *task) { if task.block.NumberU64() == 1 { checkEqual(t, task, taskIndex) @@ -208,23 +290,17 @@ func testEmptyWork(t *testing.T, chainConfig *params.ChainConfig, engine consens taskCh <- struct{}{} } } + w.skipSealHook = func(task *task) bool { return true } w.fullTaskHook = func() { - time.Sleep(100 * time.Millisecond) - } - - // Ensure worker has finished initialization - for { - b := w.pendingBlock() - if b != nil && b.NumberU64() == 1 { - break - } + // Arch64 unit tests are running in a VM on travis, they must + // be given more time to execute. + time.Sleep(time.Second) } - - w.start() + w.start() // Start mining! for i := 0; i < 2; i += 1 { select { case <-taskCh: - case <-time.NewTimer(time.Second).C: + case <-time.NewTimer(3 * time.Second).C: t.Error("new task timeout") } } @@ -234,7 +310,7 @@ func TestStreamUncleBlock(t *testing.T) { ethash := ethash.NewFaker() defer ethash.Close() - w, b := newTestWorker(t, ethashChainConfig, ethash, 1) + w, b := newTestWorker(t, ethashChainConfig, ethash, rawdb.NewMemoryDatabase(), 1) defer w.close() var taskCh = make(chan struct{}) @@ -242,6 +318,9 @@ func TestStreamUncleBlock(t *testing.T) { taskIndex := 0 w.newTaskHook = func(task *task) { if task.block.NumberU64() == 2 { + // The first task is an empty task, the second + // one has 1 pending tx, the third one has 1 tx + // and 1 uncle. if taskIndex == 2 { have := task.block.Header().UncleHash want := types.CalcUncleHash([]*types.Header{b.uncleBlock.Header()}) @@ -259,17 +338,8 @@ func TestStreamUncleBlock(t *testing.T) { w.fullTaskHook = func() { time.Sleep(100 * time.Millisecond) } - - // Ensure worker has finished initialization - for { - b := w.pendingBlock() - if b != nil && b.NumberU64() == 2 { - break - } - } w.start() - // Ignore the first two works for i := 0; i < 2; i += 1 { select { case <-taskCh: @@ -277,7 +347,8 @@ func TestStreamUncleBlock(t *testing.T) { t.Error("new task timeout") } } - b.PostChainEvents([]interface{}{core.ChainSideEvent{Block: b.uncleBlock}}) + + w.postSideBlock(core.ChainSideEvent{Block: b.uncleBlock}) select { case <-taskCh: @@ -291,13 +362,13 @@ func TestRegenerateMiningBlockEthash(t *testing.T) { } func TestRegenerateMiningBlockClique(t *testing.T) { - testRegenerateMiningBlock(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, ethdb.NewMemDatabase())) + testRegenerateMiningBlock(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, rawdb.NewMemoryDatabase())) } func testRegenerateMiningBlock(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine) { defer engine.Close() - w, b := newTestWorker(t, chainConfig, engine, 0) + w, b := newTestWorker(t, chainConfig, engine, rawdb.NewMemoryDatabase(), 0) defer w.close() var taskCh = make(chan struct{}) @@ -305,6 +376,8 @@ func testRegenerateMiningBlock(t *testing.T, chainConfig *params.ChainConfig, en taskIndex := 0 w.newTaskHook = func(task *task) { if task.block.NumberU64() == 1 { + // The first task is an empty task, the second + // one has 1 pending tx, the third one has 2 txs if taskIndex == 2 { receiptLen, balance := 2, big.NewInt(2000) if len(task.receipts) != receiptLen { @@ -324,13 +397,6 @@ func testRegenerateMiningBlock(t *testing.T, chainConfig *params.ChainConfig, en w.fullTaskHook = func() { time.Sleep(100 * time.Millisecond) } - // Ensure worker has finished initialization - for { - b := w.pendingBlock() - if b != nil && b.NumberU64() == 1 { - break - } - } w.start() // Ignore the first two works @@ -356,13 +422,13 @@ func TestAdjustIntervalEthash(t *testing.T) { } func TestAdjustIntervalClique(t *testing.T) { - testAdjustInterval(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, ethdb.NewMemDatabase())) + testAdjustInterval(t, cliqueChainConfig, clique.New(cliqueChainConfig.Clique, rawdb.NewMemoryDatabase())) } func testAdjustInterval(t *testing.T, chainConfig *params.ChainConfig, engine consensus.Engine) { defer engine.Close() - w, _ := newTestWorker(t, chainConfig, engine, 0) + w, _ := newTestWorker(t, chainConfig, engine, rawdb.NewMemoryDatabase(), 0) defer w.close() w.skipSealHook = func(task *task) bool { @@ -375,11 +441,11 @@ func testAdjustInterval(t *testing.T, chainConfig *params.ChainConfig, engine co progress = make(chan struct{}, 10) result = make([]float64, 0, 10) index = 0 - start = false + start uint32 ) w.resubmitHook = func(minInterval time.Duration, recommitInterval time.Duration) { // Short circuit if interval checking hasn't started. - if !start { + if atomic.LoadUint32(&start) == 0 { return } var wantMinInterval, wantRecommitInterval time.Duration @@ -411,19 +477,11 @@ func testAdjustInterval(t *testing.T, chainConfig *params.ChainConfig, engine co index += 1 progress <- struct{}{} } - // Ensure worker has finished initialization - for { - b := w.pendingBlock() - if b != nil && b.NumberU64() == 1 { - break - } - } - w.start() - time.Sleep(time.Second) + time.Sleep(time.Second) // Ensure two tasks have been summitted due to start opt + atomic.StoreUint32(&start, 1) - start = true w.setRecommitInterval(3 * time.Second) select { case <-progress: diff --git a/mobile/accounts.go b/mobile/accounts.go index 6b92c08f9faf..4d979bffff5d 100644 --- a/mobile/accounts.go +++ b/mobile/accounts.go @@ -23,10 +23,10 @@ import ( "errors" "time" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" ) const ( diff --git a/mobile/android_test.go b/mobile/android_test.go index 885ee71fc931..c85314c15725 100644 --- a/mobile/android_test.go +++ b/mobile/android_test.go @@ -25,7 +25,7 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/internal/build" + "github.com/cespare/cp" ) // androidTestClass is a Java class to do some lightweight tests against the Android @@ -212,7 +212,7 @@ func TestAndroid(t *testing.T) { t.Logf("%s", output) t.Fatalf("failed to run gomobile bind: %v", err) } - build.CopyFile(filepath.Join("libs", "geth.aar"), "geth.aar", os.ModePerm) + cp.CopyFile(filepath.Join("libs", "geth.aar"), "geth.aar") if err = ioutil.WriteFile(filepath.Join("src", "androidTest", "java", "org", "ethereum", "gethtest", "AndroidTest.java"), []byte(androidTestClass), os.ModePerm); err != nil { t.Fatalf("failed to write Android test class: %v", err) diff --git a/mobile/big.go b/mobile/big.go index 782fbc44eba5..86ea93245aab 100644 --- a/mobile/big.go +++ b/mobile/big.go @@ -22,7 +22,7 @@ import ( "errors" "math/big" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) // A BigInt represents a signed multi-precision integer. diff --git a/mobile/bind.go b/mobile/bind.go index 0d7f943f86d4..90ecdf82c414 100644 --- a/mobile/bind.go +++ b/mobile/bind.go @@ -19,27 +19,30 @@ package geth import ( + "errors" "math/big" "strings" - "github.com/nebulaai/nbai-node/accounts/abi" - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" ) -// Signer is an interaface defining the callback when a contract requires a +// Signer is an interface defining the callback when a contract requires a // method to sign the transaction before submission. type Signer interface { Sign(*Address, *Transaction) (tx *Transaction, _ error) } -type signer struct { +type MobileSigner struct { sign bind.SignerFn } -func (s *signer) Sign(addr *Address, unsignedTx *Transaction) (signedTx *Transaction, _ error) { - sig, err := s.sign(types.HomesteadSigner{}, addr.address, unsignedTx.tx) +func (s *MobileSigner) Sign(addr *Address, unsignedTx *Transaction) (signedTx *Transaction, _ error) { + sig, err := s.sign(types.EIP155Signer{}, addr.address, unsignedTx.tx) if err != nil { return nil, err } @@ -73,6 +76,35 @@ type TransactOpts struct { opts bind.TransactOpts } +// NewTransactOpts creates a new option set for contract transaction. +func NewTransactOpts() *TransactOpts { + return new(TransactOpts) +} + +// NewKeyedTransactor is a utility method to easily create a transaction signer +// from a single private key. +func NewKeyedTransactOpts(keyJson []byte, passphrase string) (*TransactOpts, error) { + key, err := keystore.DecryptKey(keyJson, passphrase) + if err != nil { + return nil, err + } + keyAddr := crypto.PubkeyToAddress(key.PrivateKey.PublicKey) + opts := bind.TransactOpts{ + From: keyAddr, + Signer: func(signer types.Signer, address common.Address, tx *types.Transaction) (*types.Transaction, error) { + if address != keyAddr { + return nil, errors.New("not authorized to sign this account") + } + signature, err := crypto.Sign(signer.Hash(tx).Bytes(), key.PrivateKey) + if err != nil { + return nil, err + } + return tx.WithSignature(signer, signature) + }, + } + return &TransactOpts{opts}, nil +} + func (opts *TransactOpts) GetFrom() *Address { return &Address{opts.opts.From} } func (opts *TransactOpts) GetNonce() int64 { return opts.opts.Nonce.Int64() } func (opts *TransactOpts) GetValue() *BigInt { return &BigInt{opts.opts.Value} } diff --git a/mobile/common.go b/mobile/common.go index 3ba3eab720c1..d7e0457261a0 100644 --- a/mobile/common.go +++ b/mobile/common.go @@ -24,7 +24,8 @@ import ( "fmt" "strings" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" ) // Hash represents the 32 byte Keccak256 hash of arbitrary data. @@ -228,3 +229,13 @@ func (a *Addresses) Set(index int, address *Address) error { func (a *Addresses) Append(address *Address) { a.addresses = append(a.addresses, address.address) } + +// EncodeToHex encodes b as a hex string with 0x prefix. +func EncodeToHex(b []byte) string { + return hexutil.Encode(b) +} + +// DecodeFromHex decodes a hex string with 0x prefix. +func DecodeFromHex(s string) ([]byte, error) { + return hexutil.Decode(s) +} diff --git a/mobile/context.go b/mobile/context.go index f1fff9011471..76b4c54642a6 100644 --- a/mobile/context.go +++ b/mobile/context.go @@ -24,7 +24,7 @@ import ( "time" ) -// Context carries a deadline, a cancelation signal, and other values across API +// Context carries a deadline, a cancellation signal, and other values across API // boundaries. type Context struct { context context.Context diff --git a/mobile/discover.go b/mobile/discover.go index 9e3ed10b5829..9b3c93ccd98f 100644 --- a/mobile/discover.go +++ b/mobile/discover.go @@ -22,7 +22,7 @@ package geth import ( "errors" - "github.com/nebulaai/nbai-node/p2p/discv5" + "github.com/ethereum/go-ethereum/p2p/discv5" ) // Enode represents a host on the network. diff --git a/mobile/ethclient.go b/mobile/ethclient.go index 85ece5d25c43..662125c4adeb 100644 --- a/mobile/ethclient.go +++ b/mobile/ethclient.go @@ -21,8 +21,8 @@ package geth import ( "math/big" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/ethclient" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" ) // EthereumClient provides access to the Ethereum APIs. diff --git a/mobile/ethereum.go b/mobile/ethereum.go index b982cce9fa58..59da85239744 100644 --- a/mobile/ethereum.go +++ b/mobile/ethereum.go @@ -21,8 +21,8 @@ package geth import ( "errors" - ethereum "github.com/nebulaai/nbai-node" - "github.com/nebulaai/nbai-node/common" + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/common" ) // Subscription represents an event subscription where events are diff --git a/mobile/geth.go b/mobile/geth.go index 5f4bae8c6c5b..edcbfdbdbe55 100644 --- a/mobile/geth.go +++ b/mobile/geth.go @@ -24,18 +24,18 @@ import ( "fmt" "path/filepath" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/eth" - "github.com/nebulaai/nbai-node/eth/downloader" - "github.com/nebulaai/nbai-node/ethclient" - "github.com/nebulaai/nbai-node/ethstats" - "github.com/nebulaai/nbai-node/internal/debug" - "github.com/nebulaai/nbai-node/les" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/nat" - "github.com/nebulaai/nbai-node/params" - whisper "github.com/nebulaai/nbai-node/whisper/whisperv6" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/eth/downloader" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/ethstats" + "github.com/ethereum/go-ethereum/internal/debug" + "github.com/ethereum/go-ethereum/les" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/nat" + "github.com/ethereum/go-ethereum/params" + whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" ) // NodeConfig represents the collection of configuration values to fine tune the Geth @@ -131,6 +131,7 @@ func NewNode(datadir string, config *NodeConfig) (stack *Node, _ error) { MaxPeers: config.MaxPeers, }, } + rawStack, err := node.New(nodeConf) if err != nil { return nil, err @@ -188,6 +189,12 @@ func NewNode(datadir string, config *NodeConfig) (stack *Node, _ error) { return &Node{rawStack}, nil } +// Close terminates a running node along with all it's services, tearing internal +// state doen too. It's not possible to restart a closed node. +func (n *Node) Close() error { + return n.node.Close() +} + // Start creates a live P2P node and starts running it. func (n *Node) Start() error { return n.node.Start() diff --git a/mobile/init.go b/mobile/init.go index 60b1769dd927..2025d85edc92 100644 --- a/mobile/init.go +++ b/mobile/init.go @@ -22,7 +22,7 @@ import ( "os" "runtime" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) func init() { diff --git a/mobile/interface.go b/mobile/interface.go index e32c0e261bce..d5200d5b1b82 100644 --- a/mobile/interface.go +++ b/mobile/interface.go @@ -22,7 +22,7 @@ import ( "errors" "math/big" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) // Interface represents a wrapped version of Go's interface{}, with the capacity @@ -42,26 +42,82 @@ func NewInterface() *Interface { return new(Interface) } -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) { 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 } -func (i *Interface) SetHash(hash *Hash) { i.object = &hash.hash } -func (i *Interface) SetHashes(hashes *Hashes) { i.object = &hashes.hashes } -func (i *Interface) SetInt8(n int8) { i.object = &n } -func (i *Interface) SetInt16(n int16) { i.object = &n } -func (i *Interface) SetInt32(n int32) { i.object = &n } -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 := 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 } +func (i *Interface) SetBool(b bool) { i.object = &b } +func (i *Interface) SetBools(bs *Bools) { i.object = &bs.bools } +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) { b := common.CopyBytes(binary); i.object = &b } +func (i *Interface) SetBinaries(binaries *Binaries) { i.object = &binaries.binaries } +func (i *Interface) SetAddress(address *Address) { i.object = &address.address } +func (i *Interface) SetAddresses(addrs *Addresses) { i.object = &addrs.addresses } +func (i *Interface) SetHash(hash *Hash) { i.object = &hash.hash } +func (i *Interface) SetHashes(hashes *Hashes) { i.object = &hashes.hashes } +func (i *Interface) SetInt8(n int8) { i.object = &n } +func (i *Interface) SetInt16(n int16) { i.object = &n } +func (i *Interface) SetInt32(n int32) { i.object = &n } +func (i *Interface) SetInt64(n int64) { i.object = &n } +func (i *Interface) SetInt8s(bigints *BigInts) { + ints := make([]int8, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, int8(bi.Int64())) + } + i.object = &ints +} +func (i *Interface) SetInt16s(bigints *BigInts) { + ints := make([]int16, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, int16(bi.Int64())) + } + i.object = &ints +} +func (i *Interface) SetInt32s(bigints *BigInts) { + ints := make([]int32, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, int32(bi.Int64())) + } + i.object = &ints +} +func (i *Interface) SetInt64s(bigints *BigInts) { + ints := make([]int64, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, bi.Int64()) + } + i.object = &ints +} +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 := bigint.bigint.Uint64(); i.object = &n } +func (i *Interface) SetUint8s(bigints *BigInts) { + ints := make([]uint8, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, uint8(bi.Uint64())) + } + i.object = &ints +} +func (i *Interface) SetUint16s(bigints *BigInts) { + ints := make([]uint16, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, uint16(bi.Uint64())) + } + i.object = &ints +} +func (i *Interface) SetUint32s(bigints *BigInts) { + ints := make([]uint32, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, uint32(bi.Uint64())) + } + i.object = &ints +} +func (i *Interface) SetUint64s(bigints *BigInts) { + ints := make([]uint64, 0, bigints.Size()) + for _, bi := range bigints.bigints { + ints = append(ints, bi.Uint64()) + } + i.object = &ints +} +func (i *Interface) SetBigInt(bigint *BigInt) { i.object = &bigint.bigint } +func (i *Interface) SetBigInts(bigints *BigInts) { i.object = &bigints.bigints } func (i *Interface) SetDefaultBool() { i.object = new(bool) } func (i *Interface) SetDefaultBools() { i.object = new([]bool) } @@ -74,22 +130,30 @@ func (i *Interface) SetDefaultAddresses() { i.object = new([]common.Address) } func (i *Interface) SetDefaultHash() { i.object = new(common.Hash) } func (i *Interface) SetDefaultHashes() { i.object = new([]common.Hash) } func (i *Interface) SetDefaultInt8() { i.object = new(int8) } +func (i *Interface) SetDefaultInt8s() { i.object = new([]int8) } func (i *Interface) SetDefaultInt16() { i.object = new(int16) } +func (i *Interface) SetDefaultInt16s() { i.object = new([]int16) } func (i *Interface) SetDefaultInt32() { i.object = new(int32) } +func (i *Interface) SetDefaultInt32s() { i.object = new([]int32) } func (i *Interface) SetDefaultInt64() { i.object = new(int64) } +func (i *Interface) SetDefaultInt64s() { i.object = new([]int64) } func (i *Interface) SetDefaultUint8() { i.object = new(uint8) } +func (i *Interface) SetDefaultUint8s() { i.object = new([]uint8) } func (i *Interface) SetDefaultUint16() { i.object = new(uint16) } +func (i *Interface) SetDefaultUint16s() { i.object = new([]uint16) } func (i *Interface) SetDefaultUint32() { i.object = new(uint32) } +func (i *Interface) SetDefaultUint32s() { i.object = new([]uint32) } func (i *Interface) SetDefaultUint64() { i.object = new(uint64) } +func (i *Interface) SetDefaultUint64s() { i.object = new([]uint64) } func (i *Interface) SetDefaultBigInt() { i.object = new(*big.Int) } func (i *Interface) SetDefaultBigInts() { i.object = new([]*big.Int) } func (i *Interface) GetBool() bool { return *i.object.(*bool) } -func (i *Interface) GetBools() []bool { return *i.object.(*[]bool) } +func (i *Interface) GetBools() *Bools { return &Bools{*i.object.(*[]bool)} } func (i *Interface) GetString() string { return *i.object.(*string) } func (i *Interface) GetStrings() *Strings { return &Strings{*i.object.(*[]string)} } func (i *Interface) GetBinary() []byte { return *i.object.(*[]byte) } -func (i *Interface) GetBinaries() [][]byte { return *i.object.(*[][]byte) } +func (i *Interface) GetBinaries() *Binaries { return &Binaries{*i.object.(*[][]byte)} } func (i *Interface) GetAddress() *Address { return &Address{*i.object.(*common.Address)} } func (i *Interface) GetAddresses() *Addresses { return &Addresses{*i.object.(*[]common.Address)} } func (i *Interface) GetHash() *Hash { return &Hash{*i.object.(*common.Hash)} } @@ -98,6 +162,38 @@ func (i *Interface) GetInt8() int8 { return *i.object.(*int8) } func (i *Interface) GetInt16() int16 { return *i.object.(*int16) } func (i *Interface) GetInt32() int32 { return *i.object.(*int32) } func (i *Interface) GetInt64() int64 { return *i.object.(*int64) } +func (i *Interface) GetInt8s() *BigInts { + val := i.object.(*[]int8) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetInt64(int64(v))}) + } + return bigints +} +func (i *Interface) GetInt16s() *BigInts { + val := i.object.(*[]int16) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetInt64(int64(v))}) + } + return bigints +} +func (i *Interface) GetInt32s() *BigInts { + val := i.object.(*[]int32) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetInt64(int64(v))}) + } + return bigints +} +func (i *Interface) GetInt64s() *BigInts { + val := i.object.(*[]int64) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetInt64(v)}) + } + return bigints +} func (i *Interface) GetUint8() *BigInt { return &BigInt{new(big.Int).SetUint64(uint64(*i.object.(*uint8)))} } @@ -110,6 +206,38 @@ func (i *Interface) GetUint32() *BigInt { func (i *Interface) GetUint64() *BigInt { return &BigInt{new(big.Int).SetUint64(*i.object.(*uint64))} } +func (i *Interface) GetUint8s() *BigInts { + val := i.object.(*[]uint8) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetUint64(uint64(v))}) + } + return bigints +} +func (i *Interface) GetUint16s() *BigInts { + val := i.object.(*[]uint16) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetUint64(uint64(v))}) + } + return bigints +} +func (i *Interface) GetUint32s() *BigInts { + val := i.object.(*[]uint32) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetUint64(uint64(v))}) + } + return bigints +} +func (i *Interface) GetUint64s() *BigInts { + val := i.object.(*[]uint64) + bigints := NewBigInts(len(*val)) + for i, v := range *val { + bigints.Set(i, &BigInt{new(big.Int).SetUint64(v)}) + } + return bigints +} func (i *Interface) GetBigInt() *BigInt { return &BigInt{*i.object.(**big.Int)} } func (i *Interface) GetBigInts() *BigInts { return &BigInts{*i.object.(*[]*big.Int)} } @@ -120,9 +248,7 @@ type Interfaces struct { // NewInterfaces creates a slice of uninitialized interfaces. func NewInterfaces(size int) *Interfaces { - return &Interfaces{ - objects: make([]interface{}, size), - } + return &Interfaces{objects: make([]interface{}, size)} } // Size returns the number of interfaces in the slice. @@ -131,11 +257,13 @@ func (i *Interfaces) Size() int { } // Get returns the bigint at the given index from the slice. +// Notably the returned value can be changed without affecting the +// interfaces itself. func (i *Interfaces) Get(index int) (iface *Interface, _ error) { if index < 0 || index >= len(i.objects) { return nil, errors.New("index out of bounds") } - return &Interface{i.objects[index]}, nil + return &Interface{object: i.objects[index]}, nil } // Set sets the big int at the given index in the slice. diff --git a/mobile/interface_test.go b/mobile/interface_test.go new file mode 100644 index 000000000000..4bd1af47aa1d --- /dev/null +++ b/mobile/interface_test.go @@ -0,0 +1,90 @@ +// Copyright 2019 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 geth + +import ( + "fmt" + "math/big" + "reflect" + "testing" + + "github.com/ethereum/go-ethereum/common" +) + +func TestInterfaceGetSet(t *testing.T) { + var tests = []struct { + method string + input interface{} + expect interface{} + }{ + {"Bool", true, true}, + {"Bool", false, false}, + {"Bools", &Bools{[]bool{false, true}}, &Bools{[]bool{false, true}}}, + {"String", "go-ethereum", "go-ethereum"}, + {"Strings", &Strings{strs: []string{"hello", "world"}}, &Strings{strs: []string{"hello", "world"}}}, + {"Binary", []byte{0x01, 0x02}, []byte{0x01, 0x02}}, + {"Binaries", &Binaries{[][]byte{{0x01, 0x02}, {0x03, 0x04}}}, &Binaries{[][]byte{{0x01, 0x02}, {0x03, 0x04}}}}, + {"Address", &Address{common.HexToAddress("deadbeef")}, &Address{common.HexToAddress("deadbeef")}}, + {"Addresses", &Addresses{[]common.Address{common.HexToAddress("deadbeef"), common.HexToAddress("cafebabe")}}, &Addresses{[]common.Address{common.HexToAddress("deadbeef"), common.HexToAddress("cafebabe")}}}, + {"Hash", &Hash{common.HexToHash("deadbeef")}, &Hash{common.HexToHash("deadbeef")}}, + {"Hashes", &Hashes{[]common.Hash{common.HexToHash("deadbeef"), common.HexToHash("cafebabe")}}, &Hashes{[]common.Hash{common.HexToHash("deadbeef"), common.HexToHash("cafebabe")}}}, + {"Int8", int8(1), int8(1)}, + {"Int16", int16(1), int16(1)}, + {"Int32", int32(1), int32(1)}, + {"Int64", int64(1), int64(1)}, + {"Int8s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"Int16s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"Int32s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"Int64s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"Uint8", NewBigInt(1), NewBigInt(1)}, + {"Uint16", NewBigInt(1), NewBigInt(1)}, + {"Uint32", NewBigInt(1), NewBigInt(1)}, + {"Uint64", NewBigInt(1), NewBigInt(1)}, + {"Uint8s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"Uint16s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"Uint32s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"Uint64s", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + {"BigInt", NewBigInt(1), NewBigInt(1)}, + {"BigInts", &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}, &BigInts{[]*big.Int{big.NewInt(1), big.NewInt(2)}}}, + } + + args := NewInterfaces(len(tests)) + + callFn := func(receiver interface{}, method string, arg interface{}) interface{} { + rval := reflect.ValueOf(receiver) + rval.MethodByName(fmt.Sprintf("Set%s", method)).Call([]reflect.Value{reflect.ValueOf(arg)}) + res := rval.MethodByName(fmt.Sprintf("Get%s", method)).Call(nil) + if len(res) > 0 { + return res[0].Interface() + } + return nil + } + + for index, c := range tests { + // In theory the change of iface shouldn't effect the args value + iface, _ := args.Get(index) + result := callFn(iface, c.method, c.input) + if !reflect.DeepEqual(result, c.expect) { + t.Errorf("Interface get/set mismatch, want %v, got %v", c.expect, result) + } + // Check whether the underlying value in args is still zero + iface, _ = args.Get(index) + if iface.object != nil { + t.Error("Get operation is not write safe") + } + } +} diff --git a/mobile/logger.go b/mobile/logger.go index 8841787839f3..7078c4fd2c83 100644 --- a/mobile/logger.go +++ b/mobile/logger.go @@ -19,7 +19,7 @@ package geth import ( "os" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // SetVerbosity sets the global verbosity level (between 0 and 6 - see logger/verbosity.go). diff --git a/mobile/p2p.go b/mobile/p2p.go index d0d629e8ced6..a80d9fff2e15 100644 --- a/mobile/p2p.go +++ b/mobile/p2p.go @@ -21,7 +21,7 @@ package geth import ( "errors" - "github.com/nebulaai/nbai-node/p2p" + "github.com/ethereum/go-ethereum/p2p" ) // NodeInfo represents pi short summary of the information known about the host. diff --git a/mobile/params.go b/mobile/params.go index d3330c89f8cb..45fe870ee3dc 100644 --- a/mobile/params.go +++ b/mobile/params.go @@ -21,9 +21,9 @@ package geth import ( "encoding/json" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/p2p/discv5" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/p2p/discv5" + "github.com/ethereum/go-ethereum/params" ) // MainnetGenesis returns the JSON spec to use for the main Ethereum network. It diff --git a/mobile/primitives.go b/mobile/primitives.go index 5c6617fa475e..7e1ab26ef039 100644 --- a/mobile/primitives.go +++ b/mobile/primitives.go @@ -21,6 +21,8 @@ package geth import ( "errors" "fmt" + + "github.com/ethereum/go-ethereum/common" ) // Strings represents s slice of strs. @@ -52,3 +54,63 @@ func (s *Strings) Set(index int, str string) error { func (s *Strings) String() string { return fmt.Sprintf("%v", s.strs) } + +// Bools represents a slice of bool. +type Bools struct{ bools []bool } + +// Size returns the number of bool in the slice. +func (bs *Bools) Size() int { + return len(bs.bools) +} + +// Get returns the bool at the given index from the slice. +func (bs *Bools) Get(index int) (b bool, _ error) { + if index < 0 || index >= len(bs.bools) { + return false, errors.New("index out of bounds") + } + return bs.bools[index], nil +} + +// Set sets the bool at the given index in the slice. +func (bs *Bools) Set(index int, b bool) error { + if index < 0 || index >= len(bs.bools) { + return errors.New("index out of bounds") + } + bs.bools[index] = b + return nil +} + +// String implements the Stringer interface. +func (bs *Bools) String() string { + return fmt.Sprintf("%v", bs.bools) +} + +// Binaries represents a slice of byte slice +type Binaries struct{ binaries [][]byte } + +// Size returns the number of byte slice in the slice. +func (bs *Binaries) Size() int { + return len(bs.binaries) +} + +// Get returns the byte slice at the given index from the slice. +func (bs *Binaries) Get(index int) (binary []byte, _ error) { + if index < 0 || index >= len(bs.binaries) { + return nil, errors.New("index out of bounds") + } + return common.CopyBytes(bs.binaries[index]), nil +} + +// Set sets the byte slice at the given index in the slice. +func (bs *Binaries) Set(index int, binary []byte) error { + if index < 0 || index >= len(bs.binaries) { + return errors.New("index out of bounds") + } + bs.binaries[index] = common.CopyBytes(binary) + return nil +} + +// String implements the Stringer interface. +func (bs *Binaries) String() string { + return fmt.Sprintf("%v", bs.binaries) +} diff --git a/mobile/shhclient.go b/mobile/shhclient.go index 2759512a8691..90a8b83c39f9 100644 --- a/mobile/shhclient.go +++ b/mobile/shhclient.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2018 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 @@ -19,8 +19,8 @@ package geth import ( - "github.com/nebulaai/nbai-node/whisper/shhclient" - whisper "github.com/nebulaai/nbai-node/whisper/whisperv6" + "github.com/ethereum/go-ethereum/whisper/shhclient" + whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" ) // WhisperClient provides access to the Ethereum APIs. diff --git a/mobile/types.go b/mobile/types.go index 83016d610792..b9c44c25d7a9 100644 --- a/mobile/types.go +++ b/mobile/types.go @@ -23,10 +23,10 @@ import ( "errors" "fmt" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/rlp" - whisper "github.com/nebulaai/nbai-node/whisper/whisperv6" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/rlp" + whisper "github.com/ethereum/go-ethereum/whisper/whisperv6" ) // A Nonce is a 64-bit hash which proves (combined with the mix-hash) that @@ -109,7 +109,7 @@ func (h *Header) GetDifficulty() *BigInt { return &BigInt{h.header.Difficulty} } func (h *Header) GetNumber() int64 { return h.header.Number.Int64() } func (h *Header) GetGasLimit() int64 { return int64(h.header.GasLimit) } func (h *Header) GetGasUsed() int64 { return int64(h.header.GasUsed) } -func (h *Header) GetTime() int64 { return h.header.Time.Int64() } +func (h *Header) GetTime() int64 { return int64(h.header.Time) } func (h *Header) GetExtra() []byte { return h.header.Extra } func (h *Header) GetMixDigest() *Hash { return &Hash{h.header.MixDigest} } func (h *Header) GetNonce() *Nonce { return &Nonce{h.header.Nonce} } @@ -180,7 +180,7 @@ func (b *Block) GetDifficulty() *BigInt { return &BigInt{b.block.Difficu func (b *Block) GetNumber() int64 { return b.block.Number().Int64() } func (b *Block) GetGasLimit() int64 { return int64(b.block.GasLimit()) } func (b *Block) GetGasUsed() int64 { return int64(b.block.GasUsed()) } -func (b *Block) GetTime() int64 { return b.block.Time().Int64() } +func (b *Block) GetTime() int64 { return int64(b.block.Time()) } func (b *Block) GetExtra() []byte { return b.block.Extra() } func (b *Block) GetMixDigest() *Hash { return &Hash{b.block.MixDigest()} } func (b *Block) GetNonce() int64 { return int64(b.block.Nonce()) } @@ -197,8 +197,18 @@ type Transaction struct { tx *types.Transaction } -// NewTransaction creates a new transaction with the given properties. +// NewContractCreation creates a new transaction for deploying a new contract with +// the given properties. +func NewContractCreation(nonce int64, amount *BigInt, gasLimit int64, gasPrice *BigInt, data []byte) *Transaction { + return &Transaction{types.NewContractCreation(uint64(nonce), amount.bigint, uint64(gasLimit), gasPrice.bigint, common.CopyBytes(data))} +} + +// NewTransaction creates a new transaction with the given properties. Contracts +// can be created by transacting with a nil recipient. func NewTransaction(nonce int64, to *Address, amount *BigInt, gasLimit int64, gasPrice *BigInt, data []byte) *Transaction { + if to == nil { + return &Transaction{types.NewContractCreation(uint64(nonce), amount.bigint, uint64(gasLimit), gasPrice.bigint, common.CopyBytes(data))} + } return &Transaction{types.NewTransaction(uint64(nonce), to.address, amount.bigint, uint64(gasLimit), gasPrice.bigint, common.CopyBytes(data))} } diff --git a/mobile/vm.go b/mobile/vm.go index 094c92c3ff0e..72093e3d5b90 100644 --- a/mobile/vm.go +++ b/mobile/vm.go @@ -21,7 +21,7 @@ package geth import ( "errors" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/core/types" ) // Log represents a contract log event. These events are generated by the LOG diff --git a/node/api.go b/node/api.go index 1bf8aa387863..66cd1dde3354 100644 --- a/node/api.go +++ b/node/api.go @@ -20,14 +20,12 @@ import ( "context" "fmt" "strings" - "time" - - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/rpc" + + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/rpc" ) // PrivateAdminAPI is the collection of administrative API methods exposed only @@ -51,7 +49,7 @@ func (api *PrivateAdminAPI) AddPeer(url string) (bool, error) { return false, ErrNodeStopped } // Try to add the url as a static peer and return - node, err := enode.ParseV4(url) + node, err := enode.Parse(enode.ValidSchemes, url) if err != nil { return false, fmt.Errorf("invalid enode: %v", err) } @@ -67,7 +65,7 @@ func (api *PrivateAdminAPI) RemovePeer(url string) (bool, error) { return false, ErrNodeStopped } // Try to remove the url as a static peer and return - node, err := enode.ParseV4(url) + node, err := enode.Parse(enode.ValidSchemes, url) if err != nil { return false, fmt.Errorf("invalid enode: %v", err) } @@ -82,7 +80,7 @@ func (api *PrivateAdminAPI) AddTrustedPeer(url string) (bool, error) { if server == nil { return false, ErrNodeStopped } - node, err := enode.ParseV4(url) + node, err := enode.Parse(enode.ValidSchemes, url) if err != nil { return false, fmt.Errorf("invalid enode: %v", err) } @@ -98,7 +96,7 @@ func (api *PrivateAdminAPI) RemoveTrustedPeer(url string) (bool, error) { if server == nil { return false, ErrNodeStopped } - node, err := enode.ParseV4(url) + node, err := enode.Parse(enode.ValidSchemes, url) if err != nil { return false, fmt.Errorf("invalid enode: %v", err) } @@ -297,151 +295,6 @@ func (api *PublicAdminAPI) Datadir() string { return api.node.DataDir() } -// PublicDebugAPI is the collection of debugging related API methods exposed over -// both secure and unsecure RPC channels. -type PublicDebugAPI struct { - node *Node // Node interfaced by this API -} - -// NewPublicDebugAPI creates a new API definition for the public debug methods -// of the node itself. -func NewPublicDebugAPI(node *Node) *PublicDebugAPI { - return &PublicDebugAPI{node: node} -} - -// Metrics retrieves all the known system metric collected by the node. -func (api *PublicDebugAPI) Metrics(raw bool) (map[string]interface{}, error) { - // Create a rate formatter - units := []string{"", "K", "M", "G", "T", "E", "P"} - round := func(value float64, prec int) string { - unit := 0 - for value >= 1000 { - unit, value, prec = unit+1, value/1000, 2 - } - return fmt.Sprintf(fmt.Sprintf("%%.%df%s", prec, units[unit]), value) - } - format := func(total float64, rate float64) string { - return fmt.Sprintf("%s (%s/s)", round(total, 0), round(rate, 2)) - } - // Iterate over all the metrics, and just dump for now - counters := make(map[string]interface{}) - metrics.DefaultRegistry.Each(func(name string, metric interface{}) { - // Create or retrieve the counter hierarchy for this metric - root, parts := counters, strings.Split(name, "/") - for _, part := range parts[:len(parts)-1] { - if _, ok := root[part]; !ok { - root[part] = make(map[string]interface{}) - } - root = root[part].(map[string]interface{}) - } - name = parts[len(parts)-1] - - // Fill the counter with the metric details, formatting if requested - if raw { - switch metric := metric.(type) { - case metrics.Counter: - root[name] = map[string]interface{}{ - "Overall": float64(metric.Count()), - } - - case metrics.Meter: - root[name] = map[string]interface{}{ - "AvgRate01Min": metric.Rate1(), - "AvgRate05Min": metric.Rate5(), - "AvgRate15Min": metric.Rate15(), - "MeanRate": metric.RateMean(), - "Overall": float64(metric.Count()), - } - - case metrics.Timer: - root[name] = map[string]interface{}{ - "AvgRate01Min": metric.Rate1(), - "AvgRate05Min": metric.Rate5(), - "AvgRate15Min": metric.Rate15(), - "MeanRate": metric.RateMean(), - "Overall": float64(metric.Count()), - "Percentiles": map[string]interface{}{ - "5": metric.Percentile(0.05), - "20": metric.Percentile(0.2), - "50": metric.Percentile(0.5), - "80": metric.Percentile(0.8), - "95": metric.Percentile(0.95), - }, - } - - case metrics.ResettingTimer: - t := metric.Snapshot() - ps := t.Percentiles([]float64{5, 20, 50, 80, 95}) - root[name] = map[string]interface{}{ - "Measurements": len(t.Values()), - "Mean": t.Mean(), - "Percentiles": map[string]interface{}{ - "5": ps[0], - "20": ps[1], - "50": ps[2], - "80": ps[3], - "95": ps[4], - }, - } - - default: - root[name] = "Unknown metric type" - } - } else { - switch metric := metric.(type) { - case metrics.Counter: - root[name] = map[string]interface{}{ - "Overall": float64(metric.Count()), - } - - case metrics.Meter: - root[name] = map[string]interface{}{ - "Avg01Min": format(metric.Rate1()*60, metric.Rate1()), - "Avg05Min": format(metric.Rate5()*300, metric.Rate5()), - "Avg15Min": format(metric.Rate15()*900, metric.Rate15()), - "Overall": format(float64(metric.Count()), metric.RateMean()), - } - - case metrics.Timer: - root[name] = map[string]interface{}{ - "Avg01Min": format(metric.Rate1()*60, metric.Rate1()), - "Avg05Min": format(metric.Rate5()*300, metric.Rate5()), - "Avg15Min": format(metric.Rate15()*900, metric.Rate15()), - "Overall": format(float64(metric.Count()), metric.RateMean()), - "Maximum": time.Duration(metric.Max()).String(), - "Minimum": time.Duration(metric.Min()).String(), - "Percentiles": map[string]interface{}{ - "5": time.Duration(metric.Percentile(0.05)).String(), - "20": time.Duration(metric.Percentile(0.2)).String(), - "50": time.Duration(metric.Percentile(0.5)).String(), - "80": time.Duration(metric.Percentile(0.8)).String(), - "95": time.Duration(metric.Percentile(0.95)).String(), - }, - } - - case metrics.ResettingTimer: - t := metric.Snapshot() - ps := t.Percentiles([]float64{5, 20, 50, 80, 95}) - root[name] = map[string]interface{}{ - "Measurements": len(t.Values()), - "Mean": time.Duration(t.Mean()).String(), - "Percentiles": map[string]interface{}{ - "5": time.Duration(ps[0]).String(), - "20": time.Duration(ps[1]).String(), - "50": time.Duration(ps[2]).String(), - "80": time.Duration(ps[3]).String(), - "95": time.Duration(ps[4]).String(), - }, - } - - default: - root[name] = "Unknown metric type" - } - } - }) - return counters, nil -} - // PublicWeb3API offers helper utils type PublicWeb3API struct { stack *Node diff --git a/node/config.go b/node/config.go index 0573ca55cd4e..1905ac7fa591 100644 --- a/node/config.go +++ b/node/config.go @@ -26,15 +26,17 @@ import ( "strings" "sync" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/accounts/usbwallet" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/external" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/accounts/scwallet" + "github.com/ethereum/go-ethereum/accounts/usbwallet" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/rpc" ) const ( @@ -80,13 +82,22 @@ type Config struct { // is created by New and destroyed when the node is stopped. KeyStoreDir string `toml:",omitempty"` + // ExternalSigner specifies an external URI for a clef-type signer + ExternalSigner string `toml:"omitempty"` + // UseLightweightKDF lowers the memory and CPU requirements of the key store // scrypt KDF at the expense of security. UseLightweightKDF bool `toml:",omitempty"` + // InsecureUnlockAllowed allows user to unlock accounts in unsafe http environment. + InsecureUnlockAllowed bool `toml:",omitempty"` + // NoUSB disables hardware wallet monitoring and connectivity. NoUSB bool `toml:",omitempty"` + // SmartCardDaemonPath is the path to the smartcard daemon's socket + SmartCardDaemonPath string `toml:",omitempty"` + // IPCPath is the requested location to place the IPC endpoint. If the path is // a simple file name, it is placed inside the data directory (or on the root // pipe path on Windows), whereas if it's a resolvable path name (absolute or @@ -151,6 +162,29 @@ type Config struct { // private APIs to untrusted users is a major security risk. WSExposeAll bool `toml:",omitempty"` + // GraphQLHost is the host interface on which to start the GraphQL server. If this + // field is empty, no GraphQL API endpoint will be started. + GraphQLHost string `toml:",omitempty"` + + // GraphQLPort is the TCP port number on which to start the GraphQL server. The + // default zero value is/ valid and will pick a port number randomly (useful + // for ephemeral nodes). + GraphQLPort int `toml:",omitempty"` + + // GraphQLCors is the Cross-Origin Resource Sharing header to send to requesting + // clients. Please be aware that CORS is a browser enforced security, it's fully + // useless for custom HTTP clients. + GraphQLCors []string `toml:",omitempty"` + + // GraphQLVirtualHosts is the list of virtual hostnames which are allowed on incoming requests. + // This is by default {'localhost'}. Using this prevents attacks like + // DNS rebinding, which bypasses SOP by simply masquerading as being within the same + // origin. These attacks do not utilize CORS, since they are not cross-domain. + // By explicitly checking the Host-header, the server will not allow requests + // made against the server with a malicious host domain. + // Requests using ip address directly are not affected + GraphQLVirtualHosts []string `toml:",omitempty"` + // Logger is a custom logger to use with the p2p.Server. Logger log.Logger `toml:",omitempty"` @@ -213,6 +247,15 @@ func (c *Config) HTTPEndpoint() string { return fmt.Sprintf("%s:%d", c.HTTPHost, c.HTTPPort) } +// GraphQLEndpoint resolves a GraphQL endpoint based on the configured host interface +// and port parameters. +func (c *Config) GraphQLEndpoint() string { + if c.GraphQLHost == "" { + return "" + } + return fmt.Sprintf("%s:%d", c.GraphQLHost, c.GraphQLPort) +} + // DefaultHTTPEndpoint returns the HTTP endpoint used by default. func DefaultHTTPEndpoint() string { config := &Config{HTTPHost: DefaultHTTPHost, HTTPPort: DefaultHTTPPort} @@ -234,6 +277,12 @@ func DefaultWSEndpoint() string { return config.WSEndpoint() } +// ExtRPCEnabled returns the indicator whether node enables the external +// RPC(http, ws or graphql). +func (c *Config) ExtRPCEnabled() bool { + return c.HTTPHost != "" || c.WSHost != "" || c.GraphQLHost != "" +} + // NodeName returns the devp2p node identifier. func (c *Config) NodeName() string { name := c.name() @@ -376,7 +425,7 @@ func (c *Config) parsePersistentNodes(w *bool, path string) []*enode.Node { if url == "" { continue } - node, err := enode.ParseV4(url) + node, err := enode.Parse(enode.ValidSchemes, url) if err != nil { log.Error(fmt.Sprintf("Node URL %s: %v\n", url, err)) continue @@ -430,24 +479,52 @@ func makeAccountManager(conf *Config) (*accounts.Manager, string, error) { return nil, "", err } // Assemble the account manager and supported backends - backends := []accounts.Backend{ - 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)) + var backends []accounts.Backend + if len(conf.ExternalSigner) > 0 { + log.Info("Using external signer", "url", conf.ExternalSigner) + if extapi, err := external.NewExternalBackend(conf.ExternalSigner); err == nil { + backends = append(backends, extapi) } else { - backends = append(backends, ledgerhub) + return nil, "", fmt.Errorf("error connecting to external signer: %v", err) } - // 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) + } + if len(backends) == 0 { + // For now, we're using EITHER external signer OR local signers. + // If/when we implement some form of lockfile for USB and keystore wallets, + // we can have both, but it's very confusing for the user to see the same + // accounts in both externally and locally, plus very racey. + backends = append(backends, 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 (HID version) + if trezorhub, err := usbwallet.NewTrezorHubWithHID(); err != nil { + log.Warn(fmt.Sprintf("Failed to start HID Trezor hub, disabling: %v", err)) + } else { + backends = append(backends, trezorhub) + } + // Start a USB hub for Trezor hardware wallets (WebUSB version) + if trezorhub, err := usbwallet.NewTrezorHubWithWebUSB(); err != nil { + log.Warn(fmt.Sprintf("Failed to start WebUSB Trezor hub, disabling: %v", err)) + } else { + backends = append(backends, trezorhub) + } + } + if len(conf.SmartCardDaemonPath) > 0 { + // Start a smart card hub + if schub, err := scwallet.NewHub(conf.SmartCardDaemonPath, scwallet.Scheme, keydir); err != nil { + log.Warn(fmt.Sprintf("Failed to start smart card hub, disabling: %v", err)) + } else { + backends = append(backends, schub) + } } } - return accounts.NewManager(backends...), ephemeral, nil + + return accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: conf.InsecureUnlockAllowed}, backends...), ephemeral, nil } var warnLock sync.Mutex diff --git a/node/config_test.go b/node/config_test.go index 16826a763b80..00c24a239123 100644 --- a/node/config_test.go +++ b/node/config_test.go @@ -24,8 +24,8 @@ import ( "runtime" "testing" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/p2p" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p" ) // Tests that datadirs can be successfully created, be them manually configured @@ -38,14 +38,22 @@ func TestDatadirCreation(t *testing.T) { } defer os.RemoveAll(dir) - if _, err := New(&Config{DataDir: dir}); err != nil { + node, err := New(&Config{DataDir: dir}) + if err != nil { t.Fatalf("failed to create stack with existing datadir: %v", err) } + if err := node.Close(); err != nil { + t.Fatalf("failed to close node: %v", err) + } // Generate a long non-existing datadir path and check that it gets created by a node dir = filepath.Join(dir, "a", "b", "c", "d", "e", "f") - if _, err := New(&Config{DataDir: dir}); err != nil { + node, err = New(&Config{DataDir: dir}) + if err != nil { t.Fatalf("failed to create stack with creatable datadir: %v", err) } + if err := node.Close(); err != nil { + t.Fatalf("failed to close node: %v", err) + } if _, err := os.Stat(dir); err != nil { t.Fatalf("freshly created datadir not accessible: %v", err) } @@ -57,8 +65,12 @@ func TestDatadirCreation(t *testing.T) { defer os.Remove(file.Name()) dir = filepath.Join(file.Name(), "invalid/path") - if _, err := New(&Config{DataDir: dir}); err == nil { + node, err = New(&Config{DataDir: dir}) + if err == nil { t.Fatalf("protocol stack created with an invalid datadir") + if err := node.Close(); err != nil { + t.Fatalf("failed to close node: %v", err) + } } } diff --git a/node/defaults.go b/node/defaults.go index 3d8350939a15..f84a5d547998 100644 --- a/node/defaults.go +++ b/node/defaults.go @@ -22,30 +22,34 @@ import ( "path/filepath" "runtime" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/nat" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/nat" + "github.com/ethereum/go-ethereum/rpc" ) const ( - DefaultHTTPHost = "localhost" // Default host interface for the HTTP RPC server - DefaultHTTPPort = 8545 // Default TCP port for the HTTP RPC server - DefaultWSHost = "localhost" // Default host interface for the websocket RPC server - DefaultWSPort = 8546 // Default TCP port for the websocket RPC server + DefaultHTTPHost = "localhost" // Default host interface for the HTTP RPC server + DefaultHTTPPort = 8545 // Default TCP port for the HTTP RPC server + DefaultWSHost = "localhost" // Default host interface for the websocket RPC server + DefaultWSPort = 8546 // Default TCP port for the websocket RPC server + DefaultGraphQLHost = "localhost" // Default host interface for the GraphQL server + DefaultGraphQLPort = 8547 // Default TCP port for the GraphQL server ) // DefaultConfig contains reasonable default settings. var DefaultConfig = Config{ - DataDir: DefaultDataDir(), - HTTPPort: DefaultHTTPPort, - HTTPModules: []string{"net", "web3"}, - HTTPVirtualHosts: []string{"localhost"}, - HTTPTimeouts: rpc.DefaultHTTPTimeouts, - WSPort: DefaultWSPort, - WSModules: []string{"net", "web3"}, + DataDir: DefaultDataDir(), + HTTPPort: DefaultHTTPPort, + HTTPModules: []string{"net", "web3"}, + HTTPVirtualHosts: []string{"localhost"}, + HTTPTimeouts: rpc.DefaultHTTPTimeouts, + WSPort: DefaultWSPort, + WSModules: []string{"net", "web3"}, + GraphQLPort: DefaultGraphQLPort, + GraphQLVirtualHosts: []string{"localhost"}, P2P: p2p.Config{ - ListenAddr: ":30332", - MaxPeers: 25, + ListenAddr: ":30303", + MaxPeers: 50, NAT: nat.Any(), }, } @@ -56,11 +60,20 @@ func DefaultDataDir() string { // Try to place the data folder in the user's home dir home := homeDir() if home != "" { - if runtime.GOOS == "darwin" { + switch runtime.GOOS { + case "darwin": return filepath.Join(home, "Library", "Ethereum") - } else if runtime.GOOS == "windows" { - return filepath.Join(home, "AppData", "Roaming", "Ethereum") - } else { + case "windows": + // We used to put everything in %HOME%\AppData\Roaming, but this caused + // problems with non-typical setups. If this fallback location exists and + // is non-empty, use it, otherwise DTRT and check %LOCALAPPDATA%. + fallback := filepath.Join(home, "AppData", "Roaming", "Ethereum") + appdata := windowsAppData() + if appdata == "" || isNonEmptyDir(fallback) { + return fallback + } + return filepath.Join(appdata, "Ethereum") + default: return filepath.Join(home, ".ethereum") } } @@ -68,6 +81,27 @@ func DefaultDataDir() string { return "" } +func windowsAppData() string { + v := os.Getenv("LOCALAPPDATA") + if v == "" { + // Windows XP and below don't have LocalAppData. Crash here because + // we don't support Windows XP and undefining the variable will cause + // other issues. + panic("environment variable LocalAppData is undefined") + } + return v +} + +func isNonEmptyDir(dir string) bool { + f, err := os.Open(dir) + if err != nil { + return false + } + names, _ := f.Readdir(1) + f.Close() + return len(names) > 0 +} + func homeDir() string { if home := os.Getenv("HOME"); home != "" { return home diff --git a/node/node.go b/node/node.go index d1568c32fd03..c9c27d826239 100644 --- a/node/node.go +++ b/node/node.go @@ -26,14 +26,15 @@ import ( "strings" "sync" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/internal/debug" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/rpc" - "github.com/prometheus/prometheus/util/flock" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/internal/debug" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rpc" + "github.com/prometheus/tsdb/fileutil" ) // Node is a container on which services can be registered. @@ -42,8 +43,8 @@ type Node struct { config *Config accman *accounts.Manager - ephemeralKeystore string // if non-empty, the key directory that will be removed by Stop - instanceDirLock flock.Releaser // prevents concurrent use of instance directory + ephemeralKeystore string // if non-empty, the key directory that will be removed by Stop + instanceDirLock fileutil.Releaser // prevents concurrent use of instance directory serverConfig p2p.Config server *p2p.Server // Currently running P2P networking layer @@ -121,6 +122,29 @@ func New(conf *Config) (*Node, error) { }, nil } +// Close stops the Node and releases resources acquired in +// Node constructor New. +func (n *Node) Close() error { + var errs []error + + // Terminate all subsystems and collect any errors + if err := n.Stop(); err != nil && err != ErrNodeStopped { + errs = append(errs, err) + } + if err := n.accman.Close(); err != nil { + errs = append(errs, err) + } + // Report any errors that might have occurred + switch len(errs) { + case 0: + return nil + case 1: + return errs[0] + default: + return fmt.Errorf("%v", errs) + } +} + // Register injects a new service into the node's stack. The service created by // the passed constructor must be unique in its type with regard to sibling ones. func (n *Node) Register(constructor ServiceConstructor) error { @@ -197,7 +221,7 @@ func (n *Node) Start() error { return convertFileLockError(err) } // Start each of the services - started := []reflect.Type{} + var started []reflect.Type for kind, service := range services { // Start the next service, stopping all previous upon failure if err := service.Start(running); err != nil { @@ -223,10 +247,14 @@ func (n *Node) Start() error { n.services = services n.server = running n.stop = make(chan struct{}) - return nil } +// Config returns the configuration of node. +func (n *Node) Config() *Config { + return n.config +} + func (n *Node) openDataDir() error { if n.config.DataDir == "" { return nil // ephemeral @@ -238,7 +266,7 @@ func (n *Node) openDataDir() error { } // 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")) + release, _, err := fileutil.Flock(filepath.Join(instdir, "LOCK")) if err != nil { return convertFileLockError(err) } @@ -578,11 +606,31 @@ func (n *Node) EventMux() *event.TypeMux { // OpenDatabase opens an existing database with the given name (or creates one if no // previous can be found) from within the node's instance directory. If the node is // ephemeral, a memory database is returned. -func (n *Node) OpenDatabase(name string, cache, handles int) (ethdb.Database, error) { +func (n *Node) OpenDatabase(name string, cache, handles int, namespace string) (ethdb.Database, error) { if n.config.DataDir == "" { - return ethdb.NewMemDatabase(), nil + return rawdb.NewMemoryDatabase(), nil } - return ethdb.NewLDBDatabase(n.config.ResolvePath(name), cache, handles) + return rawdb.NewLevelDBDatabase(n.config.ResolvePath(name), cache, handles, namespace) +} + +// OpenDatabaseWithFreezer opens an existing database with the given name (or +// creates one if no previous can be found) from within the node's data directory, +// also attaching a chain freezer to it that moves ancient chain data from the +// database to immutable append-only files. If the node is an ephemeral one, a +// memory database is returned. +func (n *Node) OpenDatabaseWithFreezer(name string, cache, handles int, freezer, namespace string) (ethdb.Database, error) { + if n.config.DataDir == "" { + return rawdb.NewMemoryDatabase(), nil + } + root := n.config.ResolvePath(name) + + switch { + case freezer == "": + freezer = filepath.Join(root, "ancient") + case !filepath.IsAbs(freezer): + freezer = n.config.ResolvePath(freezer) + } + return rawdb.NewLevelDBDatabaseWithFreezer(root, cache, handles, freezer, namespace) } // ResolvePath returns the absolute path of a resource in the instance directory. @@ -606,11 +654,6 @@ func (n *Node) apis() []rpc.API { Namespace: "debug", Version: "1.0", Service: debug.Handler, - }, { - Namespace: "debug", - Version: "1.0", - Service: NewPublicDebugAPI(n), - Public: true, }, { Namespace: "web3", Version: "1.0", diff --git a/node/node_example_test.go b/node/node_example_test.go index 01ba21d80e1d..57b18855f1ed 100644 --- a/node/node_example_test.go +++ b/node/node_example_test.go @@ -20,9 +20,9 @@ import ( "fmt" "log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rpc" ) // SampleService is a trivial network service that can be attached to a node for @@ -46,6 +46,8 @@ func ExampleService() { if err != nil { log.Fatalf("Failed to create network node: %v", err) } + defer stack.Close() + // Create and register a simple network service. This is done through the definition // of a node.ServiceConstructor that will instantiate a node.Service. The reason for // the factory method approach is to support service restarts without relying on the diff --git a/node/node_test.go b/node/node_test.go index 3033c1f4d874..c464771cd807 100644 --- a/node/node_test.go +++ b/node/node_test.go @@ -24,9 +24,9 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rpc" ) var ( @@ -46,6 +46,8 @@ func TestNodeLifeCycle(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Ensure that a stopped node can be stopped again for i := 0; i < 3; i++ { if err := stack.Stop(); err != ErrNodeStopped { @@ -88,6 +90,8 @@ func TestNodeUsedDataDir(t *testing.T) { if err != nil { t.Fatalf("failed to create original protocol stack: %v", err) } + defer original.Close() + if err := original.Start(); err != nil { t.Fatalf("failed to start original protocol stack: %v", err) } @@ -98,6 +102,8 @@ func TestNodeUsedDataDir(t *testing.T) { if err != nil { t.Fatalf("failed to create duplicate protocol stack: %v", err) } + defer duplicate.Close() + if err := duplicate.Start(); err != ErrDatadirUsed { t.Fatalf("duplicate datadir failure mismatch: have %v, want %v", err, ErrDatadirUsed) } @@ -109,6 +115,8 @@ func TestServiceRegistry(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Register a batch of unique services and ensure they start successfully services := []ServiceConstructor{NewNoopServiceA, NewNoopServiceB, NewNoopServiceC} for i, constructor := range services { @@ -141,6 +149,8 @@ func TestServiceLifeCycle(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Register a batch of life-cycle instrumented services services := map[string]InstrumentingWrapper{ "A": InstrumentedServiceMakerA, @@ -191,6 +201,8 @@ func TestServiceRestarts(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Define a service that does not support restarts var ( running bool @@ -239,6 +251,8 @@ func TestServiceConstructionAbortion(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Define a batch of good services services := map[string]InstrumentingWrapper{ "A": InstrumentedServiceMakerA, @@ -286,6 +300,8 @@ func TestServiceStartupAbortion(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Register a batch of good services services := map[string]InstrumentingWrapper{ "A": InstrumentedServiceMakerA, @@ -339,6 +355,8 @@ func TestServiceTerminationGuarantee(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Register a batch of good services services := map[string]InstrumentingWrapper{ "A": InstrumentedServiceMakerA, @@ -414,6 +432,8 @@ func TestServiceRetrieval(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + if err := stack.Register(NewNoopService); err != nil { t.Fatalf("noop service registration failed: %v", err) } @@ -449,6 +469,8 @@ func TestProtocolGather(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Register a batch of services with some configured number of protocols services := map[string]struct { Count int @@ -505,6 +527,8 @@ func TestAPIGather(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() + // Register a batch of services with some configured APIs calls := make(chan string, 1) makeAPI := func(result string) *OneMethodAPI { diff --git a/node/service.go b/node/service.go index b15757e971f0..4dea00995c44 100644 --- a/node/service.go +++ b/node/service.go @@ -17,13 +17,15 @@ package node import ( + "path/filepath" "reflect" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rpc" ) // ServiceContext is a collection of service independent options inherited from @@ -39,15 +41,31 @@ type ServiceContext struct { // OpenDatabase opens an existing database with the given name (or creates one // if no previous can be found) from within the node's data directory. If the // node is an ephemeral one, a memory database is returned. -func (ctx *ServiceContext) OpenDatabase(name string, cache int, handles int) (ethdb.Database, error) { +func (ctx *ServiceContext) OpenDatabase(name string, cache int, handles int, namespace string) (ethdb.Database, error) { if ctx.config.DataDir == "" { - return ethdb.NewMemDatabase(), nil + return rawdb.NewMemoryDatabase(), nil } - db, err := ethdb.NewLDBDatabase(ctx.config.ResolvePath(name), cache, handles) - if err != nil { - return nil, err + return rawdb.NewLevelDBDatabase(ctx.config.ResolvePath(name), cache, handles, namespace) +} + +// OpenDatabaseWithFreezer opens an existing database with the given name (or +// creates one if no previous can be found) from within the node's data directory, +// also attaching a chain freezer to it that moves ancient chain data from the +// database to immutable append-only files. If the node is an ephemeral one, a +// memory database is returned. +func (ctx *ServiceContext) OpenDatabaseWithFreezer(name string, cache int, handles int, freezer string, namespace string) (ethdb.Database, error) { + if ctx.config.DataDir == "" { + return rawdb.NewMemoryDatabase(), nil } - return db, nil + root := ctx.config.ResolvePath(name) + + switch { + case freezer == "": + freezer = filepath.Join(root, "ancient") + case !filepath.IsAbs(freezer): + freezer = ctx.config.ResolvePath(freezer) + } + return rawdb.NewLevelDBDatabaseWithFreezer(root, cache, handles, freezer, namespace) } // ResolvePath resolves a user path into the data directory if that was relative @@ -67,6 +85,12 @@ func (ctx *ServiceContext) Service(service interface{}) error { return ErrServiceUnknown } +// ExtRPCEnabled returns the indicator whether node enables the external +// RPC(http, ws or graphql). +func (ctx *ServiceContext) ExtRPCEnabled() bool { + return ctx.config.ExtRPCEnabled() +} + // ServiceConstructor is the function signature of the constructors needed to be // registered for service instantiation. type ServiceConstructor func(ctx *ServiceContext) (Service, error) diff --git a/node/service_test.go b/node/service_test.go index a7ae439e0a90..63004a51ab58 100644 --- a/node/service_test.go +++ b/node/service_test.go @@ -39,7 +39,7 @@ func TestContextDatabases(t *testing.T) { } // Request the opening/creation of a database and ensure it persists to disk ctx := &ServiceContext{config: &Config{Name: "unit-test", DataDir: dir}} - db, err := ctx.OpenDatabase("persistent", 0, 0) + db, err := ctx.OpenDatabase("persistent", 0, 0, "") if err != nil { t.Fatalf("failed to open persistent database: %v", err) } @@ -50,7 +50,7 @@ func TestContextDatabases(t *testing.T) { } // Request th opening/creation of an ephemeral database and ensure it's not persisted ctx = &ServiceContext{config: &Config{DataDir: ""}} - db, err = ctx.OpenDatabase("ephemeral", 0, 0) + db, err = ctx.OpenDatabase("ephemeral", 0, 0, "") if err != nil { t.Fatalf("failed to open ephemeral database: %v", err) } @@ -67,6 +67,7 @@ func TestContextServices(t *testing.T) { if err != nil { t.Fatalf("failed to create protocol stack: %v", err) } + defer stack.Close() // Define a verifier that ensures a NoopA is before it and NoopB after verifier := func(ctx *ServiceContext) (Service, error) { var objA *NoopServiceA diff --git a/node/utils_test.go b/node/utils_test.go index 561d959b78a8..9801b1ed4565 100644 --- a/node/utils_test.go +++ b/node/utils_test.go @@ -22,8 +22,8 @@ package node import ( "reflect" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/rpc" ) // NoopService is a trivial implementation of the Service interface. diff --git a/p2p/dial.go b/p2p/dial.go index 774203131faf..3975b488bf5f 100644 --- a/p2p/dial.go +++ b/p2p/dial.go @@ -17,28 +17,23 @@ package p2p import ( - "container/heap" "errors" "fmt" "net" "time" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/netutil" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/netutil" ) const ( - // This is the amount of time spent waiting in between - // redialing a certain node. - dialHistoryExpiration = 30 * time.Second + // This is the amount of time spent waiting in between redialing a certain node. The + // limit is a bit higher than inboundThrottleTime to prevent failing dials in small + // private networks. + dialHistoryExpiration = inboundThrottleTime + 5*time.Second - // Discovery lookups are throttled and can only run - // once every few seconds. - lookupInterval = 4 * time.Second - - // If no peers are found for this amount of time, the initial bootnodes are - // attempted to be connected. + // If no peers are found for this amount of time, the initial bootnodes are dialed. fallbackInterval = 20 * time.Second // Endpoint resolution is throttled with bounded backoff. @@ -52,6 +47,10 @@ type NodeDialer interface { Dial(*enode.Node) (net.Conn, error) } +type nodeResolver interface { + Resolve(*enode.Node) *enode.Node +} + // TCPDialer implements the NodeDialer interface by using a net.Dialer to // create TCP connections to nodes in the network type TCPDialer struct { @@ -65,81 +64,42 @@ func (t TCPDialer) Dial(dest *enode.Node) (net.Conn, error) { } // dialstate schedules dials and discovery lookups. -// it get's a chance to compute new tasks on every iteration +// It gets a chance to compute new tasks on every iteration // of the main loop in Server.run. type dialstate struct { maxDynDials int - ntab discoverTable netrestrict *netutil.Netlist self enode.ID + bootnodes []*enode.Node // default dials when there are no peers + log log.Logger + start time.Time // time when the dialer was first used lookupRunning bool dialing map[enode.ID]connFlag lookupBuf []*enode.Node // current discovery lookup results - randomNodes []*enode.Node // filled from Table static map[enode.ID]*dialTask - hist *dialHistory - - start time.Time // time when the dialer was first used - bootnodes []*enode.Node // default dials when there are no peers -} - -type discoverTable interface { - Close() - Resolve(*enode.Node) *enode.Node - LookupRandom() []*enode.Node - ReadRandomNodes([]*enode.Node) int -} - -// the dial history remembers recent dials. -type dialHistory []pastDial - -// pastDial is an entry in the dial history. -type pastDial struct { - id enode.ID - exp time.Time + hist expHeap } type task interface { Do(*Server) } -// A dialTask is generated for each node that is dialed. Its -// fields cannot be accessed while the task is running. -type dialTask struct { - flags connFlag - dest *enode.Node - lastResolved time.Time - resolveDelay time.Duration -} - -// discoverTask runs discovery table operations. -// Only one discoverTask is active at any time. -// discoverTask.Do performs a random lookup. -type discoverTask struct { - results []*enode.Node -} - -// A waitExpireTask is generated if there are no other tasks -// to keep the loop in Server.run ticking. -type waitExpireTask struct { - time.Duration -} - -func newDialState(self enode.ID, static []*enode.Node, bootnodes []*enode.Node, ntab discoverTable, maxdyn int, netrestrict *netutil.Netlist) *dialstate { +func newDialState(self enode.ID, maxdyn int, cfg *Config) *dialstate { s := &dialstate{ maxDynDials: maxdyn, - ntab: ntab, self: self, - netrestrict: netrestrict, + netrestrict: cfg.NetRestrict, + log: cfg.Logger, static: make(map[enode.ID]*dialTask), dialing: make(map[enode.ID]connFlag), - bootnodes: make([]*enode.Node, len(bootnodes)), - randomNodes: make([]*enode.Node, maxdyn/2), - hist: new(dialHistory), + bootnodes: make([]*enode.Node, len(cfg.BootstrapNodes)), + } + copy(s.bootnodes, cfg.BootstrapNodes) + if s.log == nil { + s.log = log.Root() } - copy(s.bootnodes, bootnodes) - for _, n := range static { + for _, n := range cfg.StaticNodes { s.addStatic(n) } return s @@ -154,20 +114,13 @@ func (s *dialstate) addStatic(n *enode.Node) { func (s *dialstate) removeStatic(n *enode.Node) { // This removes a task so future attempts to connect will not be made. delete(s.static, n.ID()) - // This removes a previous dial timestamp so that application - // can force a server to reconnect with chosen peer immediately. - s.hist.remove(n.ID()) } func (s *dialstate) newTasks(nRunning int, peers map[enode.ID]*Peer, now time.Time) []task { - if s.start.IsZero() { - s.start = now - } - var newtasks []task addDial := func(flag connFlag, n *enode.Node) bool { if err := s.checkDial(n, peers); err != nil { - log.Trace("Skipping dial candidate", "id", n.ID(), "addr", &net.TCPAddr{IP: n.IP(), Port: n.TCP()}, "err", err) + s.log.Trace("Skipping dial candidate", "id", n.ID(), "addr", &net.TCPAddr{IP: n.IP(), Port: n.TCP()}, "err", err) return false } s.dialing[n.ID()] = flag @@ -175,20 +128,9 @@ func (s *dialstate) newTasks(nRunning int, peers map[enode.ID]*Peer, now time.Ti return true } - // Compute number of dynamic dials necessary at this point. - needDynDials := s.maxDynDials - for _, p := range peers { - if p.rw.is(dynDialedConn) { - needDynDials-- - } - } - for _, flag := range s.dialing { - if flag&dynDialedConn != 0 { - needDynDials-- - } + if s.start.IsZero() { + s.start = now } - - // Expire the dial history on every invocation. s.hist.expire(now) // Create dials for static nodes if they are not connected. @@ -196,13 +138,27 @@ func (s *dialstate) newTasks(nRunning int, peers map[enode.ID]*Peer, now time.Ti err := s.checkDial(t.dest, peers) switch err { case errNotWhitelisted, errSelf: - log.Warn("Removing static dial candidate", "id", t.dest.ID, "addr", &net.TCPAddr{IP: t.dest.IP(), Port: t.dest.TCP()}, "err", err) + s.log.Warn("Removing static dial candidate", "id", t.dest.ID, "addr", &net.TCPAddr{IP: t.dest.IP(), Port: t.dest.TCP()}, "err", err) delete(s.static, t.dest.ID()) case nil: s.dialing[id] = t.flags newtasks = append(newtasks, t) } } + + // Compute number of dynamic dials needed. + needDynDials := s.maxDynDials + for _, p := range peers { + if p.rw.is(dynDialedConn) { + needDynDials-- + } + } + for _, flag := range s.dialing { + if flag&dynDialedConn != 0 { + needDynDials-- + } + } + // If we don't have any peers whatsoever, try to dial a random bootnode. This // scenario is useful for the testnet (and private networks) where the discovery // table might be full of mostly bad peers, making it hard to find good ones. @@ -210,24 +166,12 @@ func (s *dialstate) newTasks(nRunning int, peers map[enode.ID]*Peer, now time.Ti bootnode := s.bootnodes[0] s.bootnodes = append(s.bootnodes[:0], s.bootnodes[1:]...) s.bootnodes = append(s.bootnodes, bootnode) - if addDial(dynDialedConn, bootnode) { needDynDials-- } } - // Use random nodes from the table for half of the necessary - // dynamic dials. - randomCandidates := needDynDials / 2 - if randomCandidates > 0 { - n := s.ntab.ReadRandomNodes(s.randomNodes) - for i := 0; i < randomCandidates && i < n; i++ { - if addDial(dynDialedConn, s.randomNodes[i]) { - needDynDials-- - } - } - } - // Create dynamic dials from random lookup results, removing tried - // items from the result buffer. + + // Create dynamic dials from discovery results. i := 0 for ; i < len(s.lookupBuf) && needDynDials > 0; i++ { if addDial(dynDialedConn, s.lookupBuf[i]) { @@ -235,10 +179,11 @@ func (s *dialstate) newTasks(nRunning int, peers map[enode.ID]*Peer, now time.Ti } } s.lookupBuf = s.lookupBuf[:copy(s.lookupBuf, s.lookupBuf[i:])] + // Launch a discovery lookup if more candidates are needed. if len(s.lookupBuf) < needDynDials && !s.lookupRunning { s.lookupRunning = true - newtasks = append(newtasks, &discoverTask{}) + newtasks = append(newtasks, &discoverTask{want: needDynDials - len(s.lookupBuf)}) } // Launch a timer to wait for the next node to expire if all @@ -246,7 +191,7 @@ func (s *dialstate) newTasks(nRunning int, peers map[enode.ID]*Peer, now time.Ti // This should prevent cases where the dialer logic is not ticked // because there are no pending events. if nRunning == 0 && len(newtasks) == 0 && s.hist.Len() > 0 { - t := &waitExpireTask{s.hist.min().exp.Sub(now)} + t := &waitExpireTask{s.hist.nextExpiry().Sub(now)} newtasks = append(newtasks, t) } return newtasks @@ -271,7 +216,7 @@ func (s *dialstate) checkDial(n *enode.Node, peers map[enode.ID]*Peer) error { return errSelf case s.netrestrict != nil && !s.netrestrict.Contains(n.IP()): return errNotWhitelisted - case s.hist.contains(n.ID()): + case s.hist.contains(string(n.ID().Bytes())): return errRecentlyDialed } return nil @@ -280,7 +225,7 @@ func (s *dialstate) checkDial(n *enode.Node, peers map[enode.ID]*Peer) error { func (s *dialstate) taskDone(t task, now time.Time) { switch t := t.(type) { case *dialTask: - s.hist.add(t.dest.ID(), now.Add(dialHistoryExpiration)) + s.hist.add(string(t.dest.ID().Bytes()), now.Add(dialHistoryExpiration)) delete(s.dialing, t.dest.ID()) case *discoverTask: s.lookupRunning = false @@ -288,6 +233,15 @@ func (s *dialstate) taskDone(t task, now time.Time) { } } +// A dialTask is generated for each node that is dialed. Its +// fields cannot be accessed while the task is running. +type dialTask struct { + flags connFlag + dest *enode.Node + lastResolved time.Time + resolveDelay time.Duration +} + func (t *dialTask) Do(srv *Server) { if t.dest.Incomplete() { if !t.resolve(srv) { @@ -296,7 +250,7 @@ func (t *dialTask) Do(srv *Server) { } err := t.dial(srv, t.dest) if err != nil { - log.Trace("Dial error", "task", t, "err", err) + srv.log.Trace("Dial error", "task", t, "err", err) // Try resolving the ID of static nodes if dialing failed. if _, ok := err.(*dialError); ok && t.flags&staticDialedConn != 0 { if t.resolve(srv) { @@ -313,8 +267,8 @@ func (t *dialTask) Do(srv *Server) { // discovery network with useless queries for nodes that don't exist. // The backoff delay resets when the node is found. func (t *dialTask) resolve(srv *Server) bool { - if srv.ntab == nil { - log.Debug("Can't resolve node", "id", t.dest.ID, "err", "discovery is disabled") + if srv.staticNodeResolver == nil { + srv.log.Debug("Can't resolve node", "id", t.dest.ID(), "err", "discovery is disabled") return false } if t.resolveDelay == 0 { @@ -323,20 +277,20 @@ func (t *dialTask) resolve(srv *Server) bool { if time.Since(t.lastResolved) < t.resolveDelay { return false } - resolved := srv.ntab.Resolve(t.dest) + resolved := srv.staticNodeResolver.Resolve(t.dest) t.lastResolved = time.Now() if resolved == nil { t.resolveDelay *= 2 if t.resolveDelay > maxResolveDelay { t.resolveDelay = maxResolveDelay } - log.Debug("Resolving node failed", "id", t.dest.ID, "newdelay", t.resolveDelay) + srv.log.Debug("Resolving node failed", "id", t.dest.ID(), "newdelay", t.resolveDelay) return false } // The node was found. t.resolveDelay = initialResolveDelay t.dest = resolved - log.Debug("Resolved node", "id", t.dest.ID, "addr", &net.TCPAddr{IP: t.dest.IP(), Port: t.dest.TCP()}) + srv.log.Debug("Resolved node", "id", t.dest.ID(), "addr", &net.TCPAddr{IP: t.dest.IP(), Port: t.dest.TCP()}) return true } @@ -350,7 +304,7 @@ func (t *dialTask) dial(srv *Server, dest *enode.Node) error { if err != nil { return &dialError{err} } - mfd := newMeteredConn(fd, false, dest.IP()) + mfd := newMeteredConn(fd, false, &net.TCPAddr{IP: dest.IP(), Port: dest.TCP()}) return srv.SetupConn(mfd, t.flags, dest) } @@ -359,75 +313,37 @@ func (t *dialTask) String() string { return fmt.Sprintf("%v %x %v:%d", t.flags, id[:8], t.dest.IP(), t.dest.TCP()) } +// discoverTask runs discovery table operations. +// Only one discoverTask is active at any time. +// discoverTask.Do performs a random lookup. +type discoverTask struct { + want int + results []*enode.Node +} + func (t *discoverTask) Do(srv *Server) { - // newTasks generates a lookup task whenever dynamic dials are - // necessary. Lookups need to take some time, otherwise the - // event loop spins too fast. - next := srv.lastLookup.Add(lookupInterval) - if now := time.Now(); now.Before(next) { - time.Sleep(next.Sub(now)) - } - srv.lastLookup = time.Now() - t.results = srv.ntab.LookupRandom() + t.results = enode.ReadNodes(srv.discmix, t.want) } func (t *discoverTask) String() string { - s := "discovery lookup" + s := "discovery query" if len(t.results) > 0 { s += fmt.Sprintf(" (%d results)", len(t.results)) + } else { + s += fmt.Sprintf(" (want %d)", t.want) } return s } +// A waitExpireTask is generated if there are no other tasks +// to keep the loop in Server.run ticking. +type waitExpireTask struct { + time.Duration +} + func (t waitExpireTask) Do(*Server) { time.Sleep(t.Duration) } func (t waitExpireTask) String() string { return fmt.Sprintf("wait for dial hist expire (%v)", t.Duration) } - -// Use only these methods to access or modify dialHistory. -func (h dialHistory) min() pastDial { - return h[0] -} -func (h *dialHistory) add(id enode.ID, exp time.Time) { - heap.Push(h, pastDial{id, exp}) - -} -func (h *dialHistory) remove(id enode.ID) bool { - for i, v := range *h { - if v.id == id { - heap.Remove(h, i) - return true - } - } - return false -} -func (h dialHistory) contains(id enode.ID) bool { - for _, v := range h { - if v.id == id { - return true - } - } - return false -} -func (h *dialHistory) expire(now time.Time) { - for h.Len() > 0 && h.min().exp.Before(now) { - heap.Pop(h) - } -} - -// heap.Interface boilerplate -func (h dialHistory) Len() int { return len(h) } -func (h dialHistory) Less(i, j int) bool { return h[i].exp.Before(h[j].exp) } -func (h dialHistory) Swap(i, j int) { h[i], h[j] = h[j], h[i] } -func (h *dialHistory) Push(x interface{}) { - *h = append(*h, x.(pastDial)) -} -func (h *dialHistory) Pop() interface{} { - old := *h - n := len(old) - x := old[n-1] - *h = old[0 : n-1] - return x -} diff --git a/p2p/dial_test.go b/p2p/dial_test.go index 2387907b82a0..6189ec4d0b85 100644 --- a/p2p/dial_test.go +++ b/p2p/dial_test.go @@ -20,13 +20,16 @@ import ( "encoding/binary" "net" "reflect" + "strings" "testing" "time" "github.com/davecgh/go-spew/spew" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/enr" - "github.com/nebulaai/nbai-node/p2p/netutil" + "github.com/ethereum/go-ethereum/internal/testlog" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/p2p/netutil" ) func init() { @@ -67,10 +70,10 @@ func runDialTest(t *testing.T, test dialtest) { new := test.init.newTasks(running, pm(round.peers), vtime) if !sametasks(new, round.new) { - t.Errorf("round %d: new tasks mismatch:\ngot %v\nwant %v\nstate: %v\nrunning: %v\n", + t.Errorf("ERROR round %d: got %v\nwant %v\nstate: %v\nrunning: %v", i, spew.Sdump(new), spew.Sdump(round.new), spew.Sdump(test.init), spew.Sdump(running)) } - t.Log("tasks:", spew.Sdump(new)) + t.Logf("round %d (running %d) new tasks: %s", i, running, strings.TrimSpace(spew.Sdump(new))) // Time advances by 16 seconds on every round. vtime = vtime.Add(16 * time.Second) @@ -78,18 +81,11 @@ func runDialTest(t *testing.T, test dialtest) { } } -type fakeTable []*enode.Node - -func (t fakeTable) Self() *enode.Node { return new(enode.Node) } -func (t fakeTable) Close() {} -func (t fakeTable) LookupRandom() []*enode.Node { return nil } -func (t fakeTable) Resolve(*enode.Node) *enode.Node { return nil } -func (t fakeTable) ReadRandomNodes(buf []*enode.Node) int { return copy(buf, t) } - // This test checks that dynamic dials are launched from discovery results. func TestDialStateDynDial(t *testing.T) { + config := &Config{Logger: testlog.Logger(t, log.LvlTrace)} runDialTest(t, dialtest{ - init: newDialState(enode.ID{}, nil, nil, fakeTable{}, 5, nil), + init: newDialState(enode.ID{}, 5, config), rounds: []round{ // A discovery query is launched. { @@ -98,7 +94,9 @@ func TestDialStateDynDial(t *testing.T) { {rw: &conn{flags: dynDialedConn, node: newNode(uintID(1), nil)}}, {rw: &conn{flags: dynDialedConn, node: newNode(uintID(2), nil)}}, }, - new: []task{&discoverTask{}}, + new: []task{ + &discoverTask{want: 3}, + }, }, // Dynamic dials are launched when it completes. { @@ -153,7 +151,7 @@ func TestDialStateDynDial(t *testing.T) { &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, }, new: []task{ - &waitExpireTask{Duration: 14 * time.Second}, + &waitExpireTask{Duration: 19 * time.Second}, }, }, // In this round, the peer with id 2 drops off. The query @@ -184,7 +182,7 @@ func TestDialStateDynDial(t *testing.T) { }, new: []task{ &dialTask{flags: dynDialedConn, dest: newNode(uintID(7), nil)}, - &discoverTask{}, + &discoverTask{want: 2}, }, }, // Peer 7 is connected, but there still aren't enough dynamic peers @@ -214,7 +212,7 @@ func TestDialStateDynDial(t *testing.T) { &discoverTask{}, }, new: []task{ - &discoverTask{}, + &discoverTask{want: 2}, }, }, }, @@ -223,52 +221,53 @@ func TestDialStateDynDial(t *testing.T) { // Tests that bootnodes are dialed if no peers are connectd, but not otherwise. func TestDialStateDynDialBootnode(t *testing.T) { - bootnodes := []*enode.Node{ - newNode(uintID(1), nil), - newNode(uintID(2), nil), - newNode(uintID(3), nil), - } - table := fakeTable{ - newNode(uintID(4), nil), - newNode(uintID(5), nil), - newNode(uintID(6), nil), - newNode(uintID(7), nil), - newNode(uintID(8), nil), + config := &Config{ + BootstrapNodes: []*enode.Node{ + newNode(uintID(1), nil), + newNode(uintID(2), nil), + newNode(uintID(3), nil), + }, + Logger: testlog.Logger(t, log.LvlTrace), } runDialTest(t, dialtest{ - init: newDialState(enode.ID{}, nil, bootnodes, table, 5, nil), + init: newDialState(enode.ID{}, 5, config), rounds: []round{ - // 2 dynamic dials attempted, bootnodes pending fallback interval { new: []task{ - &dialTask{flags: dynDialedConn, dest: newNode(uintID(4), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, - &discoverTask{}, + &discoverTask{want: 5}, }, }, - // No dials succeed, bootnodes still pending fallback interval { done: []task{ + &discoverTask{ + results: []*enode.Node{ + newNode(uintID(4), nil), + newNode(uintID(5), nil), + }, + }, + }, + new: []task{ &dialTask{flags: dynDialedConn, dest: newNode(uintID(4), nil)}, &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, + &discoverTask{want: 3}, }, }, // No dials succeed, bootnodes still pending fallback interval {}, - // No dials succeed, 2 dynamic dials attempted and 1 bootnode too as fallback interval was reached + // 1 bootnode attempted as fallback interval was reached { - new: []task{ - &dialTask{flags: dynDialedConn, dest: newNode(uintID(1), nil)}, + done: []task{ &dialTask{flags: dynDialedConn, dest: newNode(uintID(4), nil)}, &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, }, + new: []task{ + &dialTask{flags: dynDialedConn, dest: newNode(uintID(1), nil)}, + }, }, // No dials succeed, 2nd bootnode is attempted { done: []task{ &dialTask{flags: dynDialedConn, dest: newNode(uintID(1), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(4), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, }, new: []task{ &dialTask{flags: dynDialedConn, dest: newNode(uintID(2), nil)}, @@ -287,117 +286,19 @@ func TestDialStateDynDialBootnode(t *testing.T) { { done: []task{ &dialTask{flags: dynDialedConn, dest: newNode(uintID(3), nil)}, - }, - new: []task{ - &dialTask{flags: dynDialedConn, dest: newNode(uintID(1), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(4), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, - }, - }, - // Random dial succeeds, no more bootnodes are attempted - { - peers: []*Peer{ - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(4), nil)}}, - }, - done: []task{ - &dialTask{flags: dynDialedConn, dest: newNode(uintID(1), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(4), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, - }, - }, - }, - }) -} - -func TestDialStateDynDialFromTable(t *testing.T) { - // This table always returns the same random nodes - // in the order given below. - table := fakeTable{ - newNode(uintID(1), nil), - newNode(uintID(2), nil), - newNode(uintID(3), nil), - newNode(uintID(4), nil), - newNode(uintID(5), nil), - newNode(uintID(6), nil), - newNode(uintID(7), nil), - newNode(uintID(8), nil), - } - - runDialTest(t, dialtest{ - init: newDialState(enode.ID{}, nil, nil, table, 10, nil), - rounds: []round{ - // 5 out of 8 of the nodes returned by ReadRandomNodes are dialed. - { - new: []task{ - &dialTask{flags: dynDialedConn, dest: newNode(uintID(1), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(2), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(3), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(4), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, - &discoverTask{}, - }, - }, - // Dialing nodes 1,2 succeeds. Dials from the lookup are launched. - { - peers: []*Peer{ - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(1), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(2), nil)}}, - }, - done: []task{ - &dialTask{flags: dynDialedConn, dest: newNode(uintID(1), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(2), nil)}, &discoverTask{results: []*enode.Node{ - newNode(uintID(10), nil), - newNode(uintID(11), nil), - newNode(uintID(12), nil), + newNode(uintID(6), nil), }}, }, new: []task{ - &dialTask{flags: dynDialedConn, dest: newNode(uintID(10), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(11), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(12), nil)}, - &discoverTask{}, - }, - }, - // Dialing nodes 3,4,5 fails. The dials from the lookup succeed. - { - peers: []*Peer{ - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(1), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(2), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(10), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(11), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(12), nil)}}, - }, - done: []task{ - &dialTask{flags: dynDialedConn, dest: newNode(uintID(3), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(4), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(5), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(10), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(11), nil)}, - &dialTask{flags: dynDialedConn, dest: newNode(uintID(12), nil)}, + &dialTask{flags: dynDialedConn, dest: newNode(uintID(6), nil)}, + &discoverTask{want: 4}, }, }, - // Waiting for expiry. No waitExpireTask is launched because the - // discovery query is still running. + // Random dial succeeds, no more bootnodes are attempted { peers: []*Peer{ - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(1), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(2), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(10), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(11), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(12), nil)}}, - }, - }, - // Nodes 3,4 are not tried again because only the first two - // returned random nodes (nodes 1,2) are tried and they're - // already connected. - { - peers: []*Peer{ - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(1), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(2), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(10), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(11), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(12), nil)}}, + {rw: &conn{flags: dynDialedConn, node: newNode(uintID(6), nil)}}, }, }, }, @@ -412,11 +313,11 @@ func newNode(id enode.ID, ip net.IP) *enode.Node { return enode.SignNull(&r, id) } -// This test checks that candidates that do not match the netrestrict list are not dialed. +// // This test checks that candidates that do not match the netrestrict list are not dialed. func TestDialStateNetRestrict(t *testing.T) { // This table always returns the same random nodes // in the order given below. - table := fakeTable{ + nodes := []*enode.Node{ newNode(uintID(1), net.ParseIP("127.0.0.1")), newNode(uintID(2), net.ParseIP("127.0.0.2")), newNode(uintID(3), net.ParseIP("127.0.0.3")), @@ -430,12 +331,23 @@ func TestDialStateNetRestrict(t *testing.T) { restrict.Add("127.0.2.0/24") runDialTest(t, dialtest{ - init: newDialState(enode.ID{}, nil, nil, table, 10, restrict), + init: newDialState(enode.ID{}, 10, &Config{NetRestrict: restrict}), rounds: []round{ { new: []task{ - &dialTask{flags: dynDialedConn, dest: table[4]}, - &discoverTask{}, + &discoverTask{want: 10}, + }, + }, + { + done: []task{ + &discoverTask{results: nodes}, + }, + new: []task{ + &dialTask{flags: dynDialedConn, dest: nodes[4]}, + &dialTask{flags: dynDialedConn, dest: nodes[5]}, + &dialTask{flags: dynDialedConn, dest: nodes[6]}, + &dialTask{flags: dynDialedConn, dest: nodes[7]}, + &discoverTask{want: 6}, }, }, }, @@ -444,16 +356,18 @@ func TestDialStateNetRestrict(t *testing.T) { // This test checks that static dials are launched. func TestDialStateStaticDial(t *testing.T) { - wantStatic := []*enode.Node{ - newNode(uintID(1), nil), - newNode(uintID(2), nil), - newNode(uintID(3), nil), - newNode(uintID(4), nil), - newNode(uintID(5), nil), + config := &Config{ + StaticNodes: []*enode.Node{ + newNode(uintID(1), nil), + newNode(uintID(2), nil), + newNode(uintID(3), nil), + newNode(uintID(4), nil), + newNode(uintID(5), nil), + }, + Logger: testlog.Logger(t, log.LvlTrace), } - runDialTest(t, dialtest{ - init: newDialState(enode.ID{}, wantStatic, nil, fakeTable{}, 0, nil), + init: newDialState(enode.ID{}, 0, config), rounds: []round{ // Static dials are launched for the nodes that // aren't yet connected. @@ -495,7 +409,7 @@ func TestDialStateStaticDial(t *testing.T) { &dialTask{flags: staticDialedConn, dest: newNode(uintID(5), nil)}, }, new: []task{ - &waitExpireTask{Duration: 14 * time.Second}, + &waitExpireTask{Duration: 19 * time.Second}, }, }, // Wait a round for dial history to expire, no new tasks should spawn. @@ -511,6 +425,9 @@ func TestDialStateStaticDial(t *testing.T) { // If a static node is dropped, it should be immediately redialed, // irrespective whether it was originally static or dynamic. { + done: []task{ + &waitExpireTask{Duration: 19 * time.Second}, + }, peers: []*Peer{ {rw: &conn{flags: dynDialedConn, node: newNode(uintID(1), nil)}}, {rw: &conn{flags: staticDialedConn, node: newNode(uintID(3), nil)}}, @@ -518,67 +435,24 @@ func TestDialStateStaticDial(t *testing.T) { }, new: []task{ &dialTask{flags: staticDialedConn, dest: newNode(uintID(2), nil)}, - &dialTask{flags: staticDialedConn, dest: newNode(uintID(4), nil)}, }, }, }, }) } -// This test checks that static peers will be redialed immediately if they were re-added to a static list. -func TestDialStaticAfterReset(t *testing.T) { - wantStatic := []*enode.Node{ - newNode(uintID(1), nil), - newNode(uintID(2), nil), - } - - rounds := []round{ - // Static dials are launched for the nodes that aren't yet connected. - { - peers: nil, - new: []task{ - &dialTask{flags: staticDialedConn, dest: newNode(uintID(1), nil)}, - &dialTask{flags: staticDialedConn, dest: newNode(uintID(2), nil)}, - }, - }, - // No new dial tasks, all peers are connected. - { - peers: []*Peer{ - {rw: &conn{flags: staticDialedConn, node: newNode(uintID(1), nil)}}, - {rw: &conn{flags: staticDialedConn, node: newNode(uintID(2), nil)}}, - }, - done: []task{ - &dialTask{flags: staticDialedConn, dest: newNode(uintID(1), nil)}, - &dialTask{flags: staticDialedConn, dest: newNode(uintID(2), nil)}, - }, - new: []task{ - &waitExpireTask{Duration: 30 * time.Second}, - }, - }, - } - dTest := dialtest{ - init: newDialState(enode.ID{}, wantStatic, nil, fakeTable{}, 0, nil), - rounds: rounds, - } - runDialTest(t, dTest) - for _, n := range wantStatic { - dTest.init.removeStatic(n) - dTest.init.addStatic(n) - } - // without removing peers they will be considered recently dialed - runDialTest(t, dTest) -} - // This test checks that past dials are not retried for some time. func TestDialStateCache(t *testing.T) { - wantStatic := []*enode.Node{ - newNode(uintID(1), nil), - newNode(uintID(2), nil), - newNode(uintID(3), nil), + config := &Config{ + StaticNodes: []*enode.Node{ + newNode(uintID(1), nil), + newNode(uintID(2), nil), + newNode(uintID(3), nil), + }, + Logger: testlog.Logger(t, log.LvlTrace), } - runDialTest(t, dialtest{ - init: newDialState(enode.ID{}, wantStatic, nil, fakeTable{}, 0, nil), + init: newDialState(enode.ID{}, 0, config), rounds: []round{ // Static dials are launched for the nodes that // aren't yet connected. @@ -606,28 +480,37 @@ func TestDialStateCache(t *testing.T) { // entry to expire. { peers: []*Peer{ - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(1), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(2), nil)}}, + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(1), nil)}}, + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(2), nil)}}, }, done: []task{ &dialTask{flags: staticDialedConn, dest: newNode(uintID(3), nil)}, }, new: []task{ - &waitExpireTask{Duration: 14 * time.Second}, + &waitExpireTask{Duration: 19 * time.Second}, }, }, // Still waiting for node 3's entry to expire in the cache. { peers: []*Peer{ - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(1), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(2), nil)}}, + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(1), nil)}}, + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(2), nil)}}, + }, + }, + { + peers: []*Peer{ + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(1), nil)}}, + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(2), nil)}}, }, }, // The cache entry for node 3 has expired and is retried. { + done: []task{ + &waitExpireTask{Duration: 19 * time.Second}, + }, peers: []*Peer{ - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(1), nil)}}, - {rw: &conn{flags: dynDialedConn, node: newNode(uintID(2), nil)}}, + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(1), nil)}}, + {rw: &conn{flags: staticDialedConn, node: newNode(uintID(2), nil)}}, }, new: []task{ &dialTask{flags: staticDialedConn, dest: newNode(uintID(3), nil)}, @@ -638,9 +521,13 @@ func TestDialStateCache(t *testing.T) { } func TestDialResolve(t *testing.T) { + config := &Config{ + Logger: testlog.Logger(t, log.LvlTrace), + Dialer: TCPDialer{&net.Dialer{Deadline: time.Now().Add(-5 * time.Minute)}}, + } resolved := newNode(uintID(1), net.IP{127, 0, 55, 234}) - table := &resolveMock{answer: resolved} - state := newDialState(enode.ID{}, nil, nil, table, 0, nil) + resolver := &resolveMock{answer: resolved} + state := newDialState(enode.ID{}, 0, config) // Check that the task is generated with an incomplete ID. dest := newNode(uintID(1), nil) @@ -651,11 +538,14 @@ func TestDialResolve(t *testing.T) { } // Now run the task, it should resolve the ID once. - config := Config{Dialer: TCPDialer{&net.Dialer{Deadline: time.Now().Add(-5 * time.Minute)}}} - srv := &Server{ntab: table, Config: config} + srv := &Server{ + Config: *config, + log: config.Logger, + staticNodeResolver: resolver, + } tasks[0].Do(srv) - if !reflect.DeepEqual(table.resolveCalls, []*enode.Node{dest}) { - t.Fatalf("wrong resolve calls, got %v", table.resolveCalls) + if !reflect.DeepEqual(resolver.calls, []*enode.Node{dest}) { + t.Fatalf("wrong resolve calls, got %v", resolver.calls) } // Report it as done to the dialer, which should update the static node record. @@ -688,18 +578,13 @@ func uintID(i uint32) enode.ID { return id } -// implements discoverTable for TestDialResolve +// for TestDialResolve type resolveMock struct { - resolveCalls []*enode.Node - answer *enode.Node + calls []*enode.Node + answer *enode.Node } func (t *resolveMock) Resolve(n *enode.Node) *enode.Node { - t.resolveCalls = append(t.resolveCalls, n) + t.calls = append(t.calls, n) return t.answer } - -func (t *resolveMock) Self() *enode.Node { return new(enode.Node) } -func (t *resolveMock) Close() {} -func (t *resolveMock) LookupRandom() []*enode.Node { return nil } -func (t *resolveMock) ReadRandomNodes(buf []*enode.Node) int { return 0 } diff --git a/p2p/discover/common.go b/p2p/discover/common.go new file mode 100644 index 000000000000..cef6a9fc4f9f --- /dev/null +++ b/p2p/discover/common.go @@ -0,0 +1,58 @@ +// Copyright 2019 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 discover + +import ( + "crypto/ecdsa" + "net" + + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/netutil" +) + +// UDPConn is a network connection on which discovery can operate. +type UDPConn interface { + ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) + WriteToUDP(b []byte, addr *net.UDPAddr) (n int, err error) + Close() error + LocalAddr() net.Addr +} + +// Config holds settings for the discovery listener. +type Config struct { + // These settings are required and configure the UDP listener: + PrivateKey *ecdsa.PrivateKey + + // These settings are optional: + NetRestrict *netutil.Netlist // network whitelist + Bootnodes []*enode.Node // list of bootstrap nodes + Unhandled chan<- ReadPacket // unhandled packets are sent on this channel + Log log.Logger // if set, log messages go here +} + +// ListenUDP starts listening for discovery packets on the given UDP socket. +func ListenUDP(c UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv4, error) { + return ListenV4(c, ln, cfg) +} + +// ReadPacket is a packet that couldn't be handled. Those packets are sent to the unhandled +// channel if configured. This is exported for internal use, do not use this type. +type ReadPacket struct { + Data []byte + Addr *net.UDPAddr +} diff --git a/p2p/discover/lookup.go b/p2p/discover/lookup.go new file mode 100644 index 000000000000..ab825fb05dea --- /dev/null +++ b/p2p/discover/lookup.go @@ -0,0 +1,225 @@ +// Copyright 2019 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 discover + +import ( + "context" + "time" + + "github.com/ethereum/go-ethereum/p2p/enode" +) + +// lookup performs a network search for nodes close to the given target. It approaches the +// target by querying nodes that are closer to it on each iteration. The given target does +// not need to be an actual node identifier. +type lookup struct { + tab *Table + queryfunc func(*node) ([]*node, error) + replyCh chan []*node + cancelCh <-chan struct{} + asked, seen map[enode.ID]bool + result nodesByDistance + replyBuffer []*node + queries int +} + +type queryFunc func(*node) ([]*node, error) + +func newLookup(ctx context.Context, tab *Table, target enode.ID, q queryFunc) *lookup { + it := &lookup{ + tab: tab, + queryfunc: q, + asked: make(map[enode.ID]bool), + seen: make(map[enode.ID]bool), + result: nodesByDistance{target: target}, + replyCh: make(chan []*node, alpha), + cancelCh: ctx.Done(), + queries: -1, + } + // Don't query further if we hit ourself. + // Unlikely to happen often in practice. + it.asked[tab.self().ID()] = true + return it +} + +// run runs the lookup to completion and returns the closest nodes found. +func (it *lookup) run() []*enode.Node { + for it.advance() { + } + return unwrapNodes(it.result.entries) +} + +// advance advances the lookup until any new nodes have been found. +// It returns false when the lookup has ended. +func (it *lookup) advance() bool { + for it.startQueries() { + select { + case nodes := <-it.replyCh: + it.replyBuffer = it.replyBuffer[:0] + for _, n := range nodes { + if n != nil && !it.seen[n.ID()] { + it.seen[n.ID()] = true + it.result.push(n, bucketSize) + it.replyBuffer = append(it.replyBuffer, n) + } + } + it.queries-- + if len(it.replyBuffer) > 0 { + return true + } + case <-it.cancelCh: + it.shutdown() + } + } + return false +} + +func (it *lookup) shutdown() { + for it.queries > 0 { + <-it.replyCh + it.queries-- + } + it.queryfunc = nil + it.replyBuffer = nil +} + +func (it *lookup) startQueries() bool { + if it.queryfunc == nil { + return false + } + + // The first query returns nodes from the local table. + if it.queries == -1 { + it.tab.mutex.Lock() + closest := it.tab.closest(it.result.target, bucketSize, false) + it.tab.mutex.Unlock() + // Avoid finishing the lookup too quickly if table is empty. It'd be better to wait + // for the table to fill in this case, but there is no good mechanism for that + // yet. + if len(closest.entries) == 0 { + it.slowdown() + } + it.queries = 1 + it.replyCh <- closest.entries + return true + } + + // Ask the closest nodes that we haven't asked yet. + for i := 0; i < len(it.result.entries) && it.queries < alpha; i++ { + n := it.result.entries[i] + if !it.asked[n.ID()] { + it.asked[n.ID()] = true + it.queries++ + go it.query(n, it.replyCh) + } + } + // The lookup ends when no more nodes can be asked. + return it.queries > 0 +} + +func (it *lookup) slowdown() { + sleep := time.NewTimer(1 * time.Second) + defer sleep.Stop() + select { + case <-sleep.C: + case <-it.tab.closeReq: + } +} + +func (it *lookup) query(n *node, reply chan<- []*node) { + fails := it.tab.db.FindFails(n.ID(), n.IP()) + r, err := it.queryfunc(n) + if err == errClosed { + // Avoid recording failures on shutdown. + reply <- nil + return + } else if len(r) == 0 { + fails++ + it.tab.db.UpdateFindFails(n.ID(), n.IP(), fails) + it.tab.log.Trace("Findnode failed", "id", n.ID(), "failcount", fails, "err", err) + if fails >= maxFindnodeFailures { + it.tab.log.Trace("Too many findnode failures, dropping", "id", n.ID(), "failcount", fails) + it.tab.delete(n) + } + } else if fails > 0 { + // Reset failure counter because it counts _consecutive_ failures. + it.tab.db.UpdateFindFails(n.ID(), n.IP(), 0) + } + + // Grab as many nodes as possible. Some of them might not be alive anymore, but we'll + // just remove those again during revalidation. + for _, n := range r { + it.tab.addSeenNode(n) + } + reply <- r +} + +// lookupIterator performs lookup operations and iterates over all seen nodes. +// When a lookup finishes, a new one is created through nextLookup. +type lookupIterator struct { + buffer []*node + nextLookup lookupFunc + ctx context.Context + cancel func() + lookup *lookup +} + +type lookupFunc func(ctx context.Context) *lookup + +func newLookupIterator(ctx context.Context, next lookupFunc) *lookupIterator { + ctx, cancel := context.WithCancel(ctx) + return &lookupIterator{ctx: ctx, cancel: cancel, nextLookup: next} +} + +// Node returns the current node. +func (it *lookupIterator) Node() *enode.Node { + if len(it.buffer) == 0 { + return nil + } + return unwrapNode(it.buffer[0]) +} + +// Next moves to the next node. +func (it *lookupIterator) Next() bool { + // Consume next node in buffer. + if len(it.buffer) > 0 { + it.buffer = it.buffer[1:] + } + // Advance the lookup to refill the buffer. + for len(it.buffer) == 0 { + if it.ctx.Err() != nil { + it.lookup = nil + it.buffer = nil + return false + } + if it.lookup == nil { + it.lookup = it.nextLookup(it.ctx) + continue + } + if !it.lookup.advance() { + it.lookup = nil + continue + } + it.buffer = it.lookup.replyBuffer + } + return true +} + +// Close ends the iterator. +func (it *lookupIterator) Close() { + it.cancel() +} diff --git a/p2p/discover/node.go b/p2p/discover/node.go index e7e7fcdb8d8a..a7d9ce7368c0 100644 --- a/p2p/discover/node.go +++ b/p2p/discover/node.go @@ -23,17 +23,17 @@ import ( "net" "time" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/crypto/secp256k1" - "github.com/nebulaai/nbai-node/p2p/enode" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/enode" ) // node represents a host on the network. // The fields of Node may not be modified. type node struct { enode.Node - addedAt time.Time // time when the node was added to the table + addedAt time.Time // time when the node was added to the table + livenessChecks uint // how often liveness was checked } type encPubkey [64]byte @@ -63,7 +63,7 @@ func (e encPubkey) id() enode.ID { // recoverNodeKey computes the public key used to sign the // given hash from the signature. func recoverNodeKey(hash, sig []byte) (key encPubkey, err error) { - pubkey, err := secp256k1.RecoverPubkey(hash, sig) + pubkey, err := crypto.Ecrecover(hash, sig) if err != nil { return key, err } diff --git a/p2p/discover/ntp.go b/p2p/discover/ntp.go index 465686d0dda7..1bb52399fbc5 100644 --- a/p2p/discover/ntp.go +++ b/p2p/discover/ntp.go @@ -25,7 +25,7 @@ import ( "sort" "time" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) const ( diff --git a/p2p/discover/table.go b/p2p/discover/table.go index 9c37efec17ad..e5a5793e358f 100644 --- a/p2p/discover/table.go +++ b/p2p/discover/table.go @@ -23,7 +23,6 @@ package discover import ( - "crypto/ecdsa" crand "crypto/rand" "encoding/binary" "fmt" @@ -33,11 +32,10 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/netutil" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/netutil" ) const ( @@ -55,15 +53,17 @@ const ( bucketIPLimit, bucketSubnet = 2, 24 // at most 2 addresses from the same /24 tableIPLimit, tableSubnet = 10, 24 - maxFindnodeFailures = 5 // Nodes exceeding this limit are dropped - refreshInterval = 30 * time.Minute - revalidateInterval = 10 * time.Second - copyNodesInterval = 30 * time.Second - seedMinTableTime = 5 * time.Minute - seedCount = 30 - seedMaxAge = 5 * 24 * time.Hour + refreshInterval = 30 * time.Minute + revalidateInterval = 10 * time.Second + copyNodesInterval = 30 * time.Second + seedMinTableTime = 5 * time.Minute + seedCount = 30 + seedMaxAge = 5 * 24 * time.Hour ) +// Table is the 'node table', a Kademlia-like index of neighbor nodes. The table keeps +// itself up-to-date by verifying the liveness of neighbors and requesting their node +// records when announcements of a new record version are received. type Table struct { mutex sync.Mutex // protects buckets, bucket content, nursery, rand buckets [nBuckets]*bucket // index of known nodes by distance @@ -71,6 +71,7 @@ type Table struct { rand *mrand.Rand // source of randomness, periodically reseeded ips netutil.DistinctNetSet + log log.Logger db *enode.DB // database of known nodes net transport refreshReq chan chan struct{} @@ -81,14 +82,13 @@ type Table struct { nodeAddedHook func(*node) // for testing } -// transport is implemented by the UDP transport. -// it is an interface so we can test without opening lots of UDP -// sockets and without generating a private key. +// transport is implemented by the UDP transports. type transport interface { - self() *enode.Node - ping(enode.ID, *net.UDPAddr) error - findnode(toid enode.ID, addr *net.UDPAddr, target encPubkey) ([]*node, error) - close() + Self() *enode.Node + RequestENR(*enode.Node) (*enode.Node, error) + lookupRandom() []*enode.Node + lookupSelf() []*enode.Node + ping(*enode.Node) (seq uint64, err error) } // bucket contains nodes, ordered by their last activity. the entry @@ -99,7 +99,7 @@ type bucket struct { ips netutil.DistinctNetSet } -func newTable(t transport, db *enode.DB, bootnodes []*enode.Node) (*Table, error) { +func newTable(t transport, db *enode.DB, bootnodes []*enode.Node, log log.Logger) (*Table, error) { tab := &Table{ net: t, db: db, @@ -109,6 +109,7 @@ func newTable(t transport, db *enode.DB, bootnodes []*enode.Node) (*Table, error closed: make(chan struct{}), rand: mrand.New(mrand.NewSource(0)), ips: netutil.DistinctNetSet{Subnet: tableSubnet, Limit: tableIPLimit}, + log: log, } if err := tab.setFallbackNodes(bootnodes); err != nil { return nil, err @@ -121,12 +122,11 @@ func newTable(t transport, db *enode.DB, bootnodes []*enode.Node) (*Table, error tab.seedRand() tab.loadSeedNodes() - go tab.loop() return tab, nil } func (tab *Table) self() *enode.Node { - return tab.net.self() + return tab.net.Self() } func (tab *Table) seedRand() { @@ -147,49 +147,38 @@ func (tab *Table) ReadRandomNodes(buf []*enode.Node) (n int) { tab.mutex.Lock() defer tab.mutex.Unlock() - // Find all non-empty buckets and get a fresh slice of their entries. - var buckets [][]*node + var nodes []*enode.Node for _, b := range &tab.buckets { - if len(b.entries) > 0 { - buckets = append(buckets, b.entries) + for _, n := range b.entries { + nodes = append(nodes, unwrapNode(n)) } } - if len(buckets) == 0 { - return 0 + // Shuffle. + for i := 0; i < len(nodes); i++ { + j := tab.rand.Intn(len(nodes)) + nodes[i], nodes[j] = nodes[j], nodes[i] } - // Shuffle the buckets. - for i := len(buckets) - 1; i > 0; i-- { - j := tab.rand.Intn(len(buckets)) - buckets[i], buckets[j] = buckets[j], buckets[i] - } - // Move head of each bucket into buf, removing buckets that become empty. - var i, j int - for ; i < len(buf); i, j = i+1, (j+1)%len(buckets) { - b := buckets[j] - buf[i] = unwrapNode(b[0]) - buckets[j] = b[1:] - if len(b) == 1 { - buckets = append(buckets[:j], buckets[j+1:]...) - } - if len(buckets) == 0 { - break - } - } - return i + 1 + return copy(buf, nodes) } -// Close terminates the network listener and flushes the node database. -func (tab *Table) Close() { - if tab.net != nil { - tab.net.close() - } +// getNode returns the node with the given ID or nil if it isn't in the table. +func (tab *Table) getNode(id enode.ID) *enode.Node { + tab.mutex.Lock() + defer tab.mutex.Unlock() - select { - case <-tab.closed: - // already closed. - case tab.closeReq <- struct{}{}: - <-tab.closed // wait for refreshLoop to end. + b := tab.bucket(id) + for _, e := range b.entries { + if e.ID() == id { + return unwrapNode(e) + } } + return nil +} + +// close terminates the network listener and flushes the node database. +func (tab *Table) close() { + close(tab.closeReq) + <-tab.closed } // setFallbackNodes sets the initial points of contact. These nodes @@ -215,127 +204,17 @@ func (tab *Table) isInitDone() bool { } } -// Resolve searches for a specific node with the given ID. -// It returns nil if the node could not be found. -func (tab *Table) Resolve(n *enode.Node) *enode.Node { - // If the node is present in the local table, no - // network interaction is required. - hash := n.ID() - tab.mutex.Lock() - cl := tab.closest(hash, 1) - tab.mutex.Unlock() - if len(cl.entries) > 0 && cl.entries[0].ID() == hash { - return unwrapNode(cl.entries[0]) - } - // Otherwise, do a network lookup. - result := tab.lookup(encodePubkey(n.Pubkey()), true) - for _, n := range result { - if n.ID() == hash { - return unwrapNode(n) - } - } - return nil -} - -// LookupRandom finds random nodes in the network. -func (tab *Table) LookupRandom() []*enode.Node { - var target encPubkey - crand.Read(target[:]) - return unwrapNodes(tab.lookup(target, true)) -} - -// lookup performs a network search for nodes close to the given target. It approaches the -// target by querying nodes that are closer to it on each iteration. The given target does -// not need to be an actual node identifier. -func (tab *Table) lookup(targetKey encPubkey, refreshIfEmpty bool) []*node { - var ( - target = enode.ID(crypto.Keccak256Hash(targetKey[:])) - asked = make(map[enode.ID]bool) - seen = make(map[enode.ID]bool) - reply = make(chan []*node, alpha) - pendingQueries = 0 - result *nodesByDistance - ) - // don't query further if we hit ourself. - // unlikely to happen often in practice. - asked[tab.self().ID()] = true - - for { - tab.mutex.Lock() - // generate initial result set - result = tab.closest(target, bucketSize) - tab.mutex.Unlock() - if len(result.entries) > 0 || !refreshIfEmpty { - break - } - // The result set is empty, all nodes were dropped, refresh. - // We actually wait for the refresh to complete here. The very - // first query will hit this case and run the bootstrapping - // logic. - <-tab.refresh() - refreshIfEmpty = false - } - - for { - // ask the alpha closest nodes that we haven't asked yet - for i := 0; i < len(result.entries) && pendingQueries < alpha; i++ { - n := result.entries[i] - if !asked[n.ID()] { - asked[n.ID()] = true - pendingQueries++ - go tab.findnode(n, targetKey, reply) - } - } - if pendingQueries == 0 { - // we have asked all closest nodes, stop the search - break - } - // wait for the next reply - for _, n := range <-reply { - if n != nil && !seen[n.ID()] { - seen[n.ID()] = true - result.push(n, bucketSize) - } - } - pendingQueries-- - } - return result.entries -} - -func (tab *Table) findnode(n *node, targetKey encPubkey, reply chan<- []*node) { - fails := tab.db.FindFails(n.ID()) - r, err := tab.net.findnode(n.ID(), n.addr(), targetKey) - if err != nil || len(r) == 0 { - fails++ - tab.db.UpdateFindFails(n.ID(), fails) - log.Trace("Findnode failed", "id", n.ID(), "failcount", fails, "err", err) - if fails >= maxFindnodeFailures { - log.Trace("Too many findnode failures, dropping", "id", n.ID(), "failcount", fails) - tab.delete(n) - } - } else if fails > 0 { - tab.db.UpdateFindFails(n.ID(), fails-1) - } - - // Grab as many nodes as possible. Some of them might not be alive anymore, but we'll - // just remove those again during revalidation. - for _, n := range r { - tab.add(n) - } - reply <- r -} - func (tab *Table) refresh() <-chan struct{} { done := make(chan struct{}) select { case tab.refreshReq <- done: - case <-tab.closed: + case <-tab.closeReq: close(done) } return done } -// loop schedules refresh, revalidate runs and coordinates shutdown. +// loop schedules runs of doRefresh, doRevalidate and copyLiveNodes. func (tab *Table) loop() { var ( revalidate = time.NewTimer(tab.nextRevalidateTime()) @@ -397,9 +276,8 @@ loop: close(tab.closed) } -// doRefresh performs a lookup for a random target to keep buckets -// full. seed nodes are inserted if the table is empty (initial -// bootstrap or discarded faulty peers). +// doRefresh performs a lookup for a random target to keep buckets full. seed nodes are +// inserted if the table is empty (initial bootstrap or discarded faulty peers). func (tab *Table) doRefresh(done chan struct{}) { defer close(done) @@ -409,11 +287,7 @@ func (tab *Table) doRefresh(done chan struct{}) { tab.loadSeedNodes() // Run self lookup to discover new neighbor nodes. - // We can only do this if we have a secp256k1 identity. - var key ecdsa.PublicKey - if err := tab.self().Load((*enode.Secp256k1)(&key)); err == nil { - tab.lookup(encodePubkey(&key), false) - } + tab.net.lookupSelf() // The Kademlia paper specifies that the bucket refresh should // perform a lookup in the least recently used bucket. We cannot @@ -422,9 +296,7 @@ func (tab *Table) doRefresh(done chan struct{}) { // sha3 preimage that falls into a chosen bucket. // We perform a few lookups with a random target instead. for i := 0; i < 3; i++ { - var target encPubkey - crand.Read(target[:]) - tab.lookup(target, false) + tab.net.lookupRandom() } } @@ -433,14 +305,14 @@ func (tab *Table) loadSeedNodes() { seeds = append(seeds, tab.nursery...) for i := range seeds { seed := seeds[i] - age := log.Lazy{Fn: func() interface{} { return time.Since(tab.db.LastPongReceived(seed.ID())) }} - log.Trace("Found seed node in database", "id", seed.ID(), "addr", seed.addr(), "age", age) - tab.add(seed) + age := log.Lazy{Fn: func() interface{} { return time.Since(tab.db.LastPongReceived(seed.ID(), seed.IP())) }} + tab.log.Trace("Found seed node in database", "id", seed.ID(), "addr", seed.addr(), "age", age) + tab.addSeenNode(seed) } } -// doRevalidate checks that the last node in a random bucket is still live -// and replaces or deletes the node if it isn't. +// doRevalidate checks that the last node in a random bucket is still live and replaces or +// deletes the node if it isn't. func (tab *Table) doRevalidate(done chan<- struct{}) { defer func() { done <- struct{}{} }() @@ -451,23 +323,34 @@ func (tab *Table) doRevalidate(done chan<- struct{}) { } // Ping the selected node and wait for a pong. - err := tab.net.ping(last.ID(), last.addr()) + remoteSeq, err := tab.net.ping(unwrapNode(last)) + + // Also fetch record if the node replied and returned a higher sequence number. + if last.Seq() < remoteSeq { + n, err := tab.net.RequestENR(unwrapNode(last)) + if err != nil { + tab.log.Debug("ENR request failed", "id", last.ID(), "addr", last.addr(), "err", err) + } else { + last = &node{Node: *n, addedAt: last.addedAt, livenessChecks: last.livenessChecks} + } + } tab.mutex.Lock() defer tab.mutex.Unlock() b := tab.buckets[bi] if err == nil { // The node responded, move it to the front. - log.Debug("Revalidated node", "b", bi, "id", last.ID()) - b.bump(last) + last.livenessChecks++ + tab.log.Debug("Revalidated node", "b", bi, "id", last.ID(), "checks", last.livenessChecks) + tab.bumpInBucket(b, last) return } // No reply received, pick a replacement or delete the node if there aren't // any replacements. if r := tab.replace(b, last); r != nil { - log.Debug("Replaced dead node", "b", bi, "id", last.ID(), "ip", last.IP(), "r", r.ID(), "rip", r.IP()) + tab.log.Debug("Replaced dead node", "b", bi, "id", last.ID(), "ip", last.IP(), "checks", last.livenessChecks, "r", r.ID(), "rip", r.IP()) } else { - log.Debug("Removed dead node", "b", bi, "id", last.ID(), "ip", last.IP()) + tab.log.Debug("Removed dead node", "b", bi, "id", last.ID(), "ip", last.IP(), "checks", last.livenessChecks) } } @@ -502,7 +385,7 @@ func (tab *Table) copyLiveNodes() { now := time.Now() for _, b := range &tab.buckets { for _, n := range b.entries { - if now.Sub(n.addedAt) >= seedMinTableTime { + if n.livenessChecks > 0 && now.Sub(n.addedAt) >= seedMinTableTime { tab.db.UpdateNode(unwrapNode(n)) } } @@ -511,20 +394,27 @@ func (tab *Table) copyLiveNodes() { // closest returns the n nodes in the table that are closest to the // given id. The caller must hold tab.mutex. -func (tab *Table) closest(target enode.ID, nresults int) *nodesByDistance { +func (tab *Table) closest(target enode.ID, nresults int, checklive bool) *nodesByDistance { // This is a very wasteful way to find the closest nodes but // obviously correct. I believe that tree-based buckets would make // this easier to implement efficiently. close := &nodesByDistance{target: target} for _, b := range &tab.buckets { for _, n := range b.entries { + if checklive && n.livenessChecks == 0 { + continue + } close.push(n, nresults) } } return close } +// len returns the number of nodes in the table. func (tab *Table) len() (n int) { + tab.mutex.Lock() + defer tab.mutex.Unlock() + for _, b := range &tab.buckets { n += len(b.entries) } @@ -540,12 +430,12 @@ func (tab *Table) bucket(id enode.ID) *bucket { return tab.buckets[d-bucketMinDistance-1] } -// add attempts to add the given node to its corresponding bucket. If the bucket has space -// available, adding the node succeeds immediately. Otherwise, the node is added if the -// least recently active node in the bucket does not respond to a ping packet. +// addSeenNode adds a node which may or may not be live to the end of a bucket. If the +// bucket has space available, adding the node succeeds immediately. Otherwise, the node is +// added to the replacements list. // // The caller must not hold tab.mutex. -func (tab *Table) add(n *node) { +func (tab *Table) addSeenNode(n *node) { if n.ID() == tab.self().ID() { return } @@ -553,39 +443,67 @@ func (tab *Table) add(n *node) { tab.mutex.Lock() defer tab.mutex.Unlock() b := tab.bucket(n.ID()) - if !tab.bumpOrAdd(b, n) { - // Node is not in table. Add it to the replacement list. + if contains(b.entries, n.ID()) { + // Already in bucket, don't add. + return + } + if len(b.entries) >= bucketSize { + // Bucket full, maybe add as replacement. tab.addReplacement(b, n) + return + } + if !tab.addIP(b, n.IP()) { + // Can't add: IP limit reached. + return + } + // Add to end of bucket: + b.entries = append(b.entries, n) + b.replacements = deleteNode(b.replacements, n) + n.addedAt = time.Now() + if tab.nodeAddedHook != nil { + tab.nodeAddedHook(n) } } -// addThroughPing adds the given node to the table. Compared to plain -// 'add' there is an additional safety measure: if the table is still -// initializing the node is not added. This prevents an attack where the -// table could be filled by just sending ping repeatedly. +// addVerifiedNode adds a node whose existence has been verified recently to the front of a +// bucket. If the node is already in the bucket, it is moved to the front. If the bucket +// has no space, the node is added to the replacements list. +// +// There is an additional safety measure: if the table is still initializing the node +// is not added. This prevents an attack where the table could be filled by just sending +// ping repeatedly. // // The caller must not hold tab.mutex. -func (tab *Table) addThroughPing(n *node) { +func (tab *Table) addVerifiedNode(n *node) { if !tab.isInitDone() { return } - tab.add(n) -} + if n.ID() == tab.self().ID() { + return + } -// stuff adds nodes the table to the end of their corresponding bucket -// if the bucket is not full. The caller must not hold tab.mutex. -func (tab *Table) stuff(nodes []*node) { tab.mutex.Lock() defer tab.mutex.Unlock() - - for _, n := range nodes { - if n.ID() == tab.self().ID() { - continue // don't add self - } - b := tab.bucket(n.ID()) - if len(b.entries) < bucketSize { - tab.bumpOrAdd(b, n) - } + b := tab.bucket(n.ID()) + if tab.bumpInBucket(b, n) { + // Already in bucket, moved to front. + return + } + if len(b.entries) >= bucketSize { + // Bucket full, maybe add as replacement. + tab.addReplacement(b, n) + return + } + if !tab.addIP(b, n.IP()) { + // Can't add: IP limit reached. + return + } + // Add to front of bucket. + b.entries, _ = pushNode(b.entries, n, bucketSize) + b.replacements = deleteNode(b.replacements, n) + n.addedAt = time.Now() + if tab.nodeAddedHook != nil { + tab.nodeAddedHook(n) } } @@ -602,11 +520,11 @@ func (tab *Table) addIP(b *bucket, ip net.IP) bool { return true } if !tab.ips.Add(ip) { - log.Debug("IP exceeds table limit", "ip", ip) + tab.log.Debug("IP exceeds table limit", "ip", ip) return false } if !b.ips.Add(ip) { - log.Debug("IP exceeds bucket limit", "ip", ip) + tab.log.Debug("IP exceeds bucket limit", "ip", ip) tab.ips.Remove(ip) return false } @@ -657,12 +575,21 @@ func (tab *Table) replace(b *bucket, last *node) *node { return r } -// bump moves the given node to the front of the bucket entry list +// bumpInBucket moves the given node to the front of the bucket entry list // if it is contained in that list. -func (b *bucket) bump(n *node) bool { +func (tab *Table) bumpInBucket(b *bucket, n *node) bool { for i := range b.entries { if b.entries[i].ID() == n.ID() { - // move it to the front + if !n.IP().Equal(b.entries[i].IP()) { + // Endpoint has changed, ensure that the new IP fits into table limits. + tab.removeIP(b, b.entries[i].IP()) + if !tab.addIP(b, n.IP()) { + // It doesn't, put the previous one back. + tab.addIP(b, b.entries[i].IP()) + return false + } + } + // Move it to the front. copy(b.entries[1:], b.entries[:i]) b.entries[0] = n return true @@ -671,29 +598,20 @@ func (b *bucket) bump(n *node) bool { return false } -// bumpOrAdd moves n to the front of the bucket entry list or adds it if the list isn't -// full. The return value is true if n is in the bucket. -func (tab *Table) bumpOrAdd(b *bucket, n *node) bool { - if b.bump(n) { - return true - } - if len(b.entries) >= bucketSize || !tab.addIP(b, n.IP()) { - return false - } - b.entries, _ = pushNode(b.entries, n, bucketSize) - b.replacements = deleteNode(b.replacements, n) - n.addedAt = time.Now() - if tab.nodeAddedHook != nil { - tab.nodeAddedHook(n) - } - return true -} - func (tab *Table) deleteInBucket(b *bucket, n *node) { b.entries = deleteNode(b.entries, n) tab.removeIP(b, n.IP()) } +func contains(ns []*node, id enode.ID) bool { + for _, n := range ns { + if n.ID() == id { + return true + } + } + return false +} + // pushNode adds n to the front of list, keeping at most max items. func pushNode(list []*node, n *node, max int) ([]*node, *node) { if len(list) < max { @@ -715,8 +633,7 @@ func deleteNode(list []*node, n *node) []*node { return list } -// nodesByDistance is a list of nodes, ordered by -// distance to target. +// nodesByDistance is a list of nodes, ordered by distance to target. type nodesByDistance struct { entries []*node target enode.ID diff --git a/p2p/discover/table_test.go b/p2p/discover/table_test.go index ceae6c72e72b..895c284b270b 100644 --- a/p2p/discover/table_test.go +++ b/p2p/discover/table_test.go @@ -27,9 +27,10 @@ import ( "testing/quick" "time" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/enr" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/p2p/netutil" ) func TestTable_pingReplace(t *testing.T) { @@ -50,8 +51,8 @@ func TestTable_pingReplace(t *testing.T) { func testPingReplace(t *testing.T, newNodeIsResponding, lastInBucketIsResponding bool) { transport := newPingRecorder() tab, db := newTestTable(transport) - defer tab.Close() defer db.Close() + defer tab.close() <-tab.initDone @@ -64,7 +65,7 @@ func testPingReplace(t *testing.T, newNodeIsResponding, lastInBucketIsResponding // its bucket if it is unresponsive. Revalidate again to ensure that transport.dead[last.ID()] = !lastInBucketIsResponding transport.dead[pingSender.ID()] = !newNodeIsResponding - tab.add(pingSender) + tab.addSeenNode(pingSender) tab.doRevalidate(make(chan struct{}, 1)) tab.doRevalidate(make(chan struct{}, 1)) @@ -114,10 +115,14 @@ func TestBucket_bumpNoDuplicates(t *testing.T) { } prop := func(nodes []*node, bumps []int) (ok bool) { + tab, db := newTestTable(newPingRecorder()) + defer db.Close() + defer tab.close() + b := &bucket{entries: make([]*node, len(nodes))} copy(b.entries, nodes) for i, pos := range bumps { - b.bump(b.entries[pos]) + tab.bumpInBucket(b, b.entries[pos]) if hasDuplicates(b.entries) { t.Logf("bucket has duplicates after %d/%d bumps:", i+1, len(bumps)) for _, n := range b.entries { @@ -126,6 +131,7 @@ func TestBucket_bumpNoDuplicates(t *testing.T) { return false } } + checkIPLimitInvariant(t, tab) return true } if err := quick.Check(prop, cfg); err != nil { @@ -137,33 +143,51 @@ func TestBucket_bumpNoDuplicates(t *testing.T) { func TestTable_IPLimit(t *testing.T) { transport := newPingRecorder() tab, db := newTestTable(transport) - defer tab.Close() defer db.Close() + defer tab.close() for i := 0; i < tableIPLimit+1; i++ { n := nodeAtDistance(tab.self().ID(), i, net.IP{172, 0, 1, byte(i)}) - tab.add(n) + tab.addSeenNode(n) } if tab.len() > tableIPLimit { t.Errorf("too many nodes in table") } + checkIPLimitInvariant(t, tab) } // This checks that the per-bucket IP limit is applied correctly. func TestTable_BucketIPLimit(t *testing.T) { transport := newPingRecorder() tab, db := newTestTable(transport) - defer tab.Close() defer db.Close() + defer tab.close() d := 3 for i := 0; i < bucketIPLimit+1; i++ { n := nodeAtDistance(tab.self().ID(), d, net.IP{172, 0, 1, byte(i)}) - tab.add(n) + tab.addSeenNode(n) } if tab.len() > bucketIPLimit { t.Errorf("too many nodes in table") } + checkIPLimitInvariant(t, tab) +} + +// checkIPLimitInvariant checks that ip limit sets contain an entry for every +// node in the table and no extra entries. +func checkIPLimitInvariant(t *testing.T, tab *Table) { + t.Helper() + + tabset := netutil.DistinctNetSet{Subnet: tableSubnet, Limit: tableIPLimit} + for _, b := range tab.buckets { + for _, n := range b.entries { + tabset.Add(n.IP()) + } + } + if tabset.String() != tab.ips.String() { + t.Errorf("table IP set is incorrect:\nhave: %v\nwant: %v", tab.ips, tabset) + } } func TestTable_closest(t *testing.T) { @@ -173,12 +197,12 @@ func TestTable_closest(t *testing.T) { // for any node table, Target and N transport := newPingRecorder() tab, db := newTestTable(transport) - defer tab.Close() defer db.Close() - tab.stuff(test.All) + defer tab.close() + fillTable(tab, test.All) // check that closest(Target, N) returns nodes - result := tab.closest(test.Target, test.N).entries + result := tab.closest(test.Target, test.N, false).entries if hasDuplicates(result) { t.Errorf("result contains duplicates") return false @@ -234,13 +258,13 @@ func TestTable_ReadRandomNodesGetAll(t *testing.T) { test := func(buf []*enode.Node) bool { transport := newPingRecorder() tab, db := newTestTable(transport) - defer tab.Close() defer db.Close() + defer tab.close() <-tab.initDone for i := 0; i < len(buf); i++ { ld := cfg.Rand.Intn(len(tab.buckets)) - tab.stuff([]*node{nodeAtDistance(tab.self().ID(), ld, intIP(ld))}) + fillTable(tab, []*node{nodeAtDistance(tab.self().ID(), ld, intIP(ld))}) } gotN := tab.ReadRandomNodes(buf) if gotN != tab.len() { @@ -272,300 +296,104 @@ func (*closeTest) Generate(rand *rand.Rand, size int) reflect.Value { N: rand.Intn(bucketSize), } for _, id := range gen([]enode.ID{}, rand).([]enode.ID) { - n := enode.SignNull(new(enr.Record), id) - t.All = append(t.All, wrapNode(n)) + r := new(enr.Record) + r.Set(enr.IP(genIP(rand))) + n := wrapNode(enode.SignNull(r, id)) + n.livenessChecks = 1 + t.All = append(t.All, n) } return reflect.ValueOf(t) } -func TestTable_Lookup(t *testing.T) { - tab, db := newTestTable(lookupTestnet) - defer tab.Close() +func TestTable_addVerifiedNode(t *testing.T) { + tab, db := newTestTable(newPingRecorder()) + <-tab.initDone defer db.Close() + defer tab.close() - // lookup on empty table returns no nodes - if results := tab.lookup(lookupTestnet.target, false); len(results) > 0 { - t.Fatalf("lookup on empty table returned %d results: %#v", len(results), results) - } - // seed table with initial node (otherwise lookup will terminate immediately) - seedKey, _ := decodePubkey(lookupTestnet.dists[256][0]) - seed := wrapNode(enode.NewV4(seedKey, net.IP{}, 0, 256)) - tab.stuff([]*node{seed}) - - results := tab.lookup(lookupTestnet.target, true) - t.Logf("results:") - for _, e := range results { - t.Logf(" ld=%d, %x", enode.LogDist(lookupTestnet.targetSha, e.ID()), e.ID().Bytes()) - } - if len(results) != bucketSize { - t.Errorf("wrong number of results: got %d, want %d", len(results), bucketSize) - } - if hasDuplicates(results) { - t.Errorf("result set contains duplicate entries") - } - if !sortedByDistanceTo(lookupTestnet.targetSha, results) { - t.Errorf("result set not sorted by distance to target") + // Insert two nodes. + n1 := nodeAtDistance(tab.self().ID(), 256, net.IP{88, 77, 66, 1}) + n2 := nodeAtDistance(tab.self().ID(), 256, net.IP{88, 77, 66, 2}) + tab.addSeenNode(n1) + tab.addSeenNode(n2) + + // Verify bucket content: + bcontent := []*node{n1, n2} + if !reflect.DeepEqual(tab.bucket(n1.ID()).entries, bcontent) { + t.Fatalf("wrong bucket content: %v", tab.bucket(n1.ID()).entries) } - // TODO: check result nodes are actually closest -} -// This is the test network for the Lookup test. -// The nodes were obtained by running testnet.mine with a random NodeID as target. -var lookupTestnet = &preminedTestnet{ - target: hexEncPubkey("166aea4f556532c6d34e8b740e5d314af7e9ac0ca79833bd751d6b665f12dfd38ec563c363b32f02aef4a80b44fd3def94612d497b99cb5f17fd24de454927ec"), - targetSha: enode.HexID("5c944ee51c5ae9f72a95eccb8aed0374eecb5119d720cbea6813e8e0d6ad9261"), - dists: [257][]encPubkey{ - 240: { - hexEncPubkey("2001ad5e3e80c71b952161bc0186731cf5ffe942d24a79230a0555802296238e57ea7a32f5b6f18564eadc1c65389448481f8c9338df0a3dbd18f708cbc2cbcb"), - hexEncPubkey("6ba3f4f57d084b6bf94cc4555b8c657e4a8ac7b7baf23c6874efc21dd1e4f56b7eb2721e07f5242d2f1d8381fc8cae535e860197c69236798ba1ad231b105794"), - }, - 244: { - hexEncPubkey("696ba1f0a9d55c59246f776600542a9e6432490f0cd78f8bb55a196918df2081a9b521c3c3ba48e465a75c10768807717f8f689b0b4adce00e1c75737552a178"), - }, - 246: { - hexEncPubkey("d6d32178bdc38416f46ffb8b3ec9e4cb2cfff8d04dd7e4311a70e403cb62b10be1b447311b60b4f9ee221a8131fc2cbd45b96dd80deba68a949d467241facfa8"), - hexEncPubkey("3ea3d04a43a3dfb5ac11cffc2319248cf41b6279659393c2f55b8a0a5fc9d12581a9d97ef5d8ff9b5abf3321a290e8f63a4f785f450dc8a672aba3ba2ff4fdab"), - hexEncPubkey("2fc897f05ae585553e5c014effd3078f84f37f9333afacffb109f00ca8e7a3373de810a3946be971cbccdfd40249f9fe7f322118ea459ac71acca85a1ef8b7f4"), - }, - 247: { - hexEncPubkey("3155e1427f85f10a5c9a7755877748041af1bcd8d474ec065eb33df57a97babf54bfd2103575fa829115d224c523596b401065a97f74010610fce76382c0bf32"), - hexEncPubkey("312c55512422cf9b8a4097e9a6ad79402e87a15ae909a4bfefa22398f03d20951933beea1e4dfa6f968212385e829f04c2d314fc2d4e255e0d3bc08792b069db"), - hexEncPubkey("38643200b172dcfef857492156971f0e6aa2c538d8b74010f8e140811d53b98c765dd2d96126051913f44582e8c199ad7c6d6819e9a56483f637feaac9448aac"), - hexEncPubkey("8dcab8618c3253b558d459da53bd8fa68935a719aff8b811197101a4b2b47dd2d47295286fc00cc081bb542d760717d1bdd6bec2c37cd72eca367d6dd3b9df73"), - hexEncPubkey("8b58c6073dd98bbad4e310b97186c8f822d3a5c7d57af40e2136e88e315afd115edb27d2d0685a908cfe5aa49d0debdda6e6e63972691d6bd8c5af2d771dd2a9"), - hexEncPubkey("2cbb718b7dc682da19652e7d9eb4fefaf7b7147d82c1c2b6805edf77b85e29fde9f6da195741467ff2638dc62c8d3e014ea5686693c15ed0080b6de90354c137"), - hexEncPubkey("e84027696d3f12f2de30a9311afea8fbd313c2360daff52bb5fc8c7094d5295758bec3134e4eef24e4cdf377b40da344993284628a7a346eba94f74160998feb"), - hexEncPubkey("f1357a4f04f9d33753a57c0b65ba20a5d8777abbffd04e906014491c9103fb08590e45548d37aa4bd70965e2e81ddba94f31860348df01469eec8c1829200a68"), - hexEncPubkey("4ab0a75941b12892369b4490a1928c8ca52a9ad6d3dffbd1d8c0b907bc200fe74c022d011ec39b64808a39c0ca41f1d3254386c3e7733e7044c44259486461b6"), - hexEncPubkey("d45150a72dc74388773e68e03133a3b5f51447fe91837d566706b3c035ee4b56f160c878c6273394daee7f56cc398985269052f22f75a8057df2fe6172765354"), - }, - 248: { - hexEncPubkey("6aadfce366a189bab08ac84721567483202c86590642ea6d6a14f37ca78d82bdb6509eb7b8b2f6f63c78ae3ae1d8837c89509e41497d719b23ad53dd81574afa"), - hexEncPubkey("a605ecfd6069a4cf4cf7f5840e5bc0ce10d23a3ac59e2aaa70c6afd5637359d2519b4524f56fc2ca180cdbebe54262f720ccaae8c1b28fd553c485675831624d"), - hexEncPubkey("29701451cb9448ca33fc33680b44b840d815be90146eb521641efbffed0859c154e8892d3906eae9934bfacee72cd1d2fa9dd050fd18888eea49da155ab0efd2"), - hexEncPubkey("3ed426322dee7572b08592e1e079f8b6c6b30e10e6243edd144a6a48fdbdb83df73a6e41b1143722cb82604f2203a32758610b5d9544f44a1a7921ba001528c1"), - hexEncPubkey("b2e2a2b7fdd363572a3256e75435fab1da3b16f7891a8bd2015f30995dae665d7eabfd194d87d99d5df628b4bbc7b04e5b492c596422dd8272746c7a1b0b8e4f"), - hexEncPubkey("0c69c9756162c593e85615b814ce57a2a8ca2df6c690b9c4e4602731b61e1531a3bbe3f7114271554427ffabea80ad8f36fa95a49fa77b675ae182c6ccac1728"), - hexEncPubkey("8d28be21d5a97b0876442fa4f5e5387f5bf3faad0b6f13b8607b64d6e448c0991ca28dd7fe2f64eb8eadd7150bff5d5666aa6ed868b84c71311f4ba9a38569dd"), - hexEncPubkey("2c677e1c64b9c9df6359348a7f5f33dc79e22f0177042486d125f8b6ca7f0dc756b1f672aceee5f1746bcff80aaf6f92a8dc0c9fbeb259b3fa0da060de5ab7e8"), - hexEncPubkey("3994880f94a8678f0cd247a43f474a8af375d2a072128da1ad6cae84a244105ff85e94fc7d8496f639468de7ee998908a91c7e33ef7585fff92e984b210941a1"), - hexEncPubkey("b45a9153c08d002a48090d15d61a7c7dad8c2af85d4ff5bd36ce23a9a11e0709bf8d56614c7b193bc028c16cbf7f20dfbcc751328b64a924995d47b41e452422"), - hexEncPubkey("057ab3a9e53c7a84b0f3fc586117a525cdd18e313f52a67bf31798d48078e325abe5cfee3f6c2533230cb37d0549289d692a29dd400e899b8552d4b928f6f907"), - hexEncPubkey("0ddf663d308791eb92e6bd88a2f8cb45e4f4f35bb16708a0e6ff7f1362aa6a73fedd0a1b1557fb3365e38e1b79d6918e2fae2788728b70c9ab6b51a3b94a4338"), - hexEncPubkey("f637e07ff50cc1e3731735841c4798411059f2023abcf3885674f3e8032531b0edca50fd715df6feb489b6177c345374d64f4b07d257a7745de393a107b013a5"), - hexEncPubkey("e24ec7c6eec094f63c7b3239f56d311ec5a3e45bc4e622a1095a65b95eea6fe13e29f3b6b7a2cbfe40906e3989f17ac834c3102dd0cadaaa26e16ee06d782b72"), - hexEncPubkey("b76ea1a6fd6506ef6e3506a4f1f60ed6287fff8114af6141b2ff13e61242331b54082b023cfea5b3083354a4fb3f9eb8be01fb4a518f579e731a5d0707291a6b"), - hexEncPubkey("9b53a37950ca8890ee349b325032d7b672cab7eced178d3060137b24ef6b92a43977922d5bdfb4a3409a2d80128e02f795f9dae6d7d99973ad0e23a2afb8442f"), - }, - 249: { - hexEncPubkey("675ae65567c3c72c50c73bc0fd4f61f202ea5f93346ca57b551de3411ccc614fad61cb9035493af47615311b9d44ee7a161972ee4d77c28fe1ec029d01434e6a"), - hexEncPubkey("8eb81408389da88536ae5800392b16ef5109d7ea132c18e9a82928047ecdb502693f6e4a4cdd18b54296caf561db937185731456c456c98bfe7de0baf0eaa495"), - hexEncPubkey("2adba8b1612a541771cb93a726a38a4b88e97b18eced2593eb7daf82f05a5321ca94a72cc780c306ff21e551a932fc2c6d791e4681907b5ceab7f084c3fa2944"), - hexEncPubkey("b1b4bfbda514d9b8f35b1c28961da5d5216fe50548f4066f69af3b7666a3b2e06eac646735e963e5c8f8138a2fb95af15b13b23ff00c6986eccc0efaa8ee6fb4"), - hexEncPubkey("d2139281b289ad0e4d7b4243c4364f5c51aac8b60f4806135de06b12b5b369c9e43a6eb494eab860d115c15c6fbb8c5a1b0e382972e0e460af395b8385363de7"), - hexEncPubkey("4a693df4b8fc5bdc7cec342c3ed2e228d7c5b4ab7321ddaa6cccbeb45b05a9f1d95766b4002e6d4791c2deacb8a667aadea6a700da28a3eea810a30395701bbc"), - hexEncPubkey("ab41611195ec3c62bb8cd762ee19fb182d194fd141f4a66780efbef4b07ce916246c022b841237a3a6b512a93431157edd221e854ed2a259b72e9c5351f44d0c"), - hexEncPubkey("68e8e26099030d10c3c703ae7045c0a48061fb88058d853b3e67880014c449d4311014da99d617d3150a20f1a3da5e34bf0f14f1c51fe4dd9d58afd222823176"), - hexEncPubkey("3fbcacf546fb129cd70fc48de3b593ba99d3c473798bc309292aca280320e0eacc04442c914cad5c4cf6950345ba79b0d51302df88285d4e83ee3fe41339eee7"), - hexEncPubkey("1d4a623659f7c8f80b6c3939596afdf42e78f892f682c768ad36eb7bfba402dbf97aea3a268f3badd8fe7636be216edf3d67ee1e08789ebbc7be625056bd7109"), - hexEncPubkey("a283c474ab09da02bbc96b16317241d0627646fcc427d1fe790b76a7bf1989ced90f92101a973047ae9940c92720dffbac8eff21df8cae468a50f72f9e159417"), - hexEncPubkey("dbf7e5ad7f87c3dfecae65d87c3039e14ed0bdc56caf00ce81931073e2e16719d746295512ff7937a15c3b03603e7c41a4f9df94fcd37bb200dd8f332767e9cb"), - hexEncPubkey("caaa070a26692f64fc77f30d7b5ae980d419b4393a0f442b1c821ef58c0862898b0d22f74a4f8c5d83069493e3ec0b92f17dc1fe6e4cd437c1ec25039e7ce839"), - hexEncPubkey("874cc8d1213beb65c4e0e1de38ef5d8165235893ac74ab5ea937c885eaab25c8d79dad0456e9fd3e9450626cac7e107b004478fb59842f067857f39a47cee695"), - hexEncPubkey("d94193f236105010972f5df1b7818b55846592a0445b9cdc4eaed811b8c4c0f7c27dc8cc9837a4774656d6b34682d6d329d42b6ebb55da1d475c2474dc3dfdf4"), - hexEncPubkey("edd9af6aded4094e9785637c28fccbd3980cbe28e2eb9a411048a23c2ace4bd6b0b7088a7817997b49a3dd05fc6929ca6c7abbb69438dbdabe65e971d2a794b2"), - }, - 250: { - hexEncPubkey("53a5bd1215d4ab709ae8fdc2ced50bba320bced78bd9c5dc92947fb402250c914891786db0978c898c058493f86fc68b1c5de8a5cb36336150ac7a88655b6c39"), - hexEncPubkey("b7f79e3ab59f79262623c9ccefc8f01d682323aee56ffbe295437487e9d5acaf556a9c92e1f1c6a9601f2b9eb6b027ae1aeaebac71d61b9b78e88676efd3e1a3"), - hexEncPubkey("d374bf7e8d7ffff69cc00bebff38ef5bc1dcb0a8d51c1a3d70e61ac6b2e2d6617109254b0ac224354dfbf79009fe4239e09020c483cc60c071e00b9238684f30"), - hexEncPubkey("1e1eac1c9add703eb252eb991594f8f5a173255d526a855fab24ae57dc277e055bc3c7a7ae0b45d437c4f47a72d97eb7b126f2ba344ba6c0e14b2c6f27d4b1e6"), - hexEncPubkey("ae28953f63d4bc4e706712a59319c111f5ff8f312584f65d7436b4cd3d14b217b958f8486bad666b4481fe879019fb1f767cf15b3e3e2711efc33b56d460448a"), - hexEncPubkey("934bb1edf9c7a318b82306aca67feb3d6b434421fa275d694f0b4927afd8b1d3935b727fd4ff6e3d012e0c82f1824385174e8c6450ade59c2a43281a4b3446b6"), - hexEncPubkey("9eef3f28f70ce19637519a0916555bf76d26de31312ac656cf9d3e379899ea44e4dd7ffcce923b4f3563f8a00489a34bd6936db0cbb4c959d32c49f017e07d05"), - hexEncPubkey("82200872e8f871c48f1fad13daec6478298099b591bb3dbc4ef6890aa28ebee5860d07d70be62f4c0af85085a90ae8179ee8f937cf37915c67ea73e704b03ee7"), - hexEncPubkey("6c75a5834a08476b7fc37ff3dc2011dc3ea3b36524bad7a6d319b18878fad813c0ba76d1f4555cacd3890c865438c21f0e0aed1f80e0a157e642124c69f43a11"), - hexEncPubkey("995b873742206cb02b736e73a88580c2aacb0bd4a3c97a647b647bcab3f5e03c0e0736520a8b3600da09edf4248991fb01091ec7ff3ec7cdc8a1beae011e7aae"), - hexEncPubkey("c773a056594b5cdef2e850d30891ff0e927c3b1b9c35cd8e8d53a1017001e237468e1ece3ae33d612ca3e6abb0a9169aa352e9dcda358e5af2ad982b577447db"), - hexEncPubkey("2b46a5f6923f475c6be99ec6d134437a6d11f6bb4b4ac6bcd94572fa1092639d1c08aeefcb51f0912f0a060f71d4f38ee4da70ecc16010b05dd4a674aab14c3a"), - hexEncPubkey("af6ab501366debbaa0d22e20e9688f32ef6b3b644440580fd78de4fe0e99e2a16eb5636bbae0d1c259df8ddda77b35b9a35cbc36137473e9c68fbc9d203ba842"), - hexEncPubkey("c9f6f2dd1a941926f03f770695bda289859e85fabaf94baaae20b93e5015dc014ba41150176a36a1884adb52f405194693e63b0c464a6891cc9cc1c80d450326"), - hexEncPubkey("5b116f0751526868a909b61a30b0c5282c37df6925cc03ddea556ef0d0602a9595fd6c14d371f8ed7d45d89918a032dcd22be4342a8793d88fdbeb3ca3d75bd7"), - hexEncPubkey("50f3222fb6b82481c7c813b2172e1daea43e2710a443b9c2a57a12bd160dd37e20f87aa968c82ad639af6972185609d47036c0d93b4b7269b74ebd7073221c10"), - }, - 251: { - hexEncPubkey("9b8f702a62d1bee67bedfeb102eca7f37fa1713e310f0d6651cc0c33ea7c5477575289ccd463e5a2574a00a676a1fdce05658ba447bb9d2827f0ba47b947e894"), - hexEncPubkey("b97532eb83054ed054b4abdf413bb30c00e4205545c93521554dbe77faa3cfaa5bd31ef466a107b0b34a71ec97214c0c83919720142cddac93aa7a3e928d4708"), - hexEncPubkey("2f7a5e952bfb67f2f90b8441b5fadc9ee13b1dcde3afeeb3dd64bf937f86663cc5c55d1fa83952b5422763c7df1b7f2794b751c6be316ebc0beb4942e65ab8c1"), - hexEncPubkey("42c7483781727051a0b3660f14faf39e0d33de5e643702ae933837d036508ab856ce7eec8ec89c4929a4901256e5233a3d847d5d4893f91bcf21835a9a880fee"), - hexEncPubkey("873bae27bf1dc854408fba94046a53ab0c965cebe1e4e12290806fc62b88deb1f4a47f9e18f78fc0e7913a0c6e42ac4d0fc3a20cea6bc65f0c8a0ca90b67521e"), - hexEncPubkey("a7e3a370bbd761d413f8d209e85886f68bf73d5c3089b2dc6fa42aab1ecb5162635497eed95dee2417f3c9c74a3e76319625c48ead2e963c7de877cd4551f347"), - hexEncPubkey("528597534776a40df2addaaea15b6ff832ce36b9748a265768368f657e76d58569d9f30dbb91e91cf0ae7efe8f402f17aa0ae15f5c55051ba03ba830287f4c42"), - hexEncPubkey("461d8bd4f13c3c09031fdb84f104ed737a52f630261463ce0bdb5704259bab4b737dda688285b8444dbecaecad7f50f835190b38684ced5e90c54219e5adf1bc"), - hexEncPubkey("6ec50c0be3fd232737090fc0111caaf0bb6b18f72be453428087a11a97fd6b52db0344acbf789a689bd4f5f50f79017ea784f8fd6fe723ad6ae675b9e3b13e21"), - hexEncPubkey("12fc5e2f77a83fdcc727b79d8ae7fe6a516881138d3011847ee136b400fed7cfba1f53fd7a9730253c7aa4f39abeacd04f138417ba7fcb0f36cccc3514e0dab6"), - hexEncPubkey("4fdbe75914ccd0bce02101606a1ccf3657ec963e3b3c20239d5fec87673fe446d649b4f15f1fe1a40e6cfbd446dda2d31d40bb602b1093b8fcd5f139ba0eb46a"), - hexEncPubkey("3753668a0f6281e425ea69b52cb2d17ab97afbe6eb84cf5d25425bc5e53009388857640668fadd7c110721e6047c9697803bd8a6487b43bb343bfa32ebf24039"), - hexEncPubkey("2e81b16346637dec4410fd88e527346145b9c0a849dbf2628049ac7dae016c8f4305649d5659ec77f1e8a0fac0db457b6080547226f06283598e3740ad94849a"), - hexEncPubkey("802c3cc27f91c89213223d758f8d2ecd41135b357b6d698f24d811cdf113033a81c38e0bdff574a5c005b00a8c193dc2531f8c1fa05fa60acf0ab6f2858af09f"), - hexEncPubkey("fcc9a2e1ac3667026ff16192876d1813bb75abdbf39b929a92863012fe8b1d890badea7a0de36274d5c1eb1e8f975785532c50d80fd44b1a4b692f437303393f"), - hexEncPubkey("6d8b3efb461151dd4f6de809b62726f5b89e9b38e9ba1391967f61cde844f7528fecf821b74049207cee5a527096b31f3ad623928cd3ce51d926fa345a6b2951"), - }, - 252: { - hexEncPubkey("f1ae93157cc48c2075dd5868fbf523e79e06caf4b8198f352f6e526680b78ff4227263de92612f7d63472bd09367bb92a636fff16fe46ccf41614f7a72495c2a"), - hexEncPubkey("587f482d111b239c27c0cb89b51dd5d574db8efd8de14a2e6a1400c54d4567e77c65f89c1da52841212080b91604104768350276b6682f2f961cdaf4039581c7"), - hexEncPubkey("e3f88274d35cefdaabdf205afe0e80e936cc982b8e3e47a84ce664c413b29016a4fb4f3a3ebae0a2f79671f8323661ed462bf4390af94c424dc8ace0c301b90f"), - hexEncPubkey("0ddc736077da9a12ba410dc5ea63cbcbe7659dd08596485b2bff3435221f82c10d263efd9af938e128464be64a178b7cd22e19f400d5802f4c9df54bf89f2619"), - hexEncPubkey("784aa34d833c6ce63fcc1279630113c3272e82c4ae8c126c5a52a88ac461b6baeed4244e607b05dc14e5b2f41c70a273c3804dea237f14f7a1e546f6d1309d14"), - hexEncPubkey("f253a2c354ee0e27cfcae786d726753d4ad24be6516b279a936195a487de4a59dbc296accf20463749ff55293263ed8c1b6365eecb248d44e75e9741c0d18205"), - hexEncPubkey("a1910b80357b3ad9b4593e0628922939614dc9056a5fbf477279c8b2c1d0b4b31d89a0c09d0d41f795271d14d3360ef08a3f821e65e7e1f56c07a36afe49c7c5"), - hexEncPubkey("f1168552c2efe541160f0909b0b4a9d6aeedcf595cdf0e9b165c97e3e197471a1ee6320e93389edfba28af6eaf10de98597ad56e7ab1b504ed762451996c3b98"), - hexEncPubkey("b0c8e5d2c8634a7930e1a6fd082e448c6cf9d2d8b7293558b59238815a4df926c286bf297d2049f14e8296a6eb3256af614ec1812c4f2bbe807673b58bf14c8c"), - hexEncPubkey("0fb346076396a38badc342df3679b55bd7f40a609ab103411fe45082c01f12ea016729e95914b2b5540e987ff5c9b133e85862648e7f36abdfd23100d248d234"), - hexEncPubkey("f736e0cc83417feaa280d9483f5d4d72d1b036cd0c6d9cbdeb8ac35ceb2604780de46dddaa32a378474e1d5ccdf79b373331c30c7911ade2ae32f98832e5de1f"), - hexEncPubkey("8b02991457602f42b38b342d3f2259ae4100c354b3843885f7e4e07bd644f64dab94bb7f38a3915f8b7f11d8e3f81c28e07a0078cf79d7397e38a7b7e0c857e2"), - hexEncPubkey("9221d9f04a8a184993d12baa91116692bb685f887671302999d69300ad103eb2d2c75a09d8979404c6dd28f12362f58a1a43619c493d9108fd47588a23ce5824"), - hexEncPubkey("652797801744dada833fff207d67484742eea6835d695925f3e618d71b68ec3c65bdd85b4302b2cdcb835ad3f94fd00d8da07e570b41bc0d2bcf69a8de1b3284"), - hexEncPubkey("d84f06fe64debc4cd0625e36d19b99014b6218375262cc2209202bdbafd7dffcc4e34ce6398e182e02fd8faeed622c3e175545864902dfd3d1ac57647cddf4c6"), - hexEncPubkey("d0ed87b294f38f1d741eb601020eeec30ac16331d05880fe27868f1e454446de367d7457b41c79e202eaf9525b029e4f1d7e17d85a55f83a557c005c68d7328a"), - }, - 253: { - hexEncPubkey("ad4485e386e3cc7c7310366a7c38fb810b8896c0d52e55944bfd320ca294e7912d6c53c0a0cf85e7ce226e92491d60430e86f8f15cda0161ed71893fb4a9e3a1"), - hexEncPubkey("36d0e7e5b7734f98c6183eeeb8ac5130a85e910a925311a19c4941b1290f945d4fc3996b12ef4966960b6fa0fb29b1604f83a0f81bd5fd6398d2e1a22e46af0c"), - hexEncPubkey("7d307d8acb4a561afa23bdf0bd945d35c90245e26345ec3a1f9f7df354222a7cdcb81339c9ed6744526c27a1a0c8d10857e98df942fa433602facac71ac68a31"), - hexEncPubkey("d97bf55f88c83fae36232661af115d66ca600fc4bd6d1fb35ff9bb4dad674c02cf8c8d05f317525b5522250db58bb1ecafb7157392bf5aa61b178c61f098d995"), - hexEncPubkey("7045d678f1f9eb7a4613764d17bd5698796494d0bf977b16f2dbc272b8a0f7858a60805c022fc3d1fe4f31c37e63cdaca0416c0d053ef48a815f8b19121605e0"), - hexEncPubkey("14e1f21418d445748de2a95cd9a8c3b15b506f86a0acabd8af44bb968ce39885b19c8822af61b3dd58a34d1f265baec30e3ae56149dc7d2aa4a538f7319f69c8"), - hexEncPubkey("b9453d78281b66a4eac95a1546017111eaaa5f92a65d0de10b1122940e92b319728a24edf4dec6acc412321b1c95266d39c7b3a5d265c629c3e49a65fb022c09"), - hexEncPubkey("e8a49248419e3824a00d86af422f22f7366e2d4922b304b7169937616a01d9d6fa5abf5cc01061a352dc866f48e1fa2240dbb453d872b1d7be62bdfc1d5e248c"), - hexEncPubkey("bebcff24b52362f30e0589ee573ce2d86f073d58d18e6852a592fa86ceb1a6c9b96d7fb9ec7ed1ed98a51b6743039e780279f6bb49d0a04327ac7a182d9a56f6"), - hexEncPubkey("d0835e5a4291db249b8d2fca9f503049988180c7d247bedaa2cf3a1bad0a76709360a85d4f9a1423b2cbc82bb4d94b47c0cde20afc430224834c49fe312a9ae3"), - hexEncPubkey("6b087fe2a2da5e4f0b0f4777598a4a7fb66bf77dbd5bfc44e8a7eaa432ab585a6e226891f56a7d4f5ed11a7c57b90f1661bba1059590ca4267a35801c2802913"), - hexEncPubkey("d901e5bde52d1a0f4ddf010a686a53974cdae4ebe5c6551b3c37d6b6d635d38d5b0e5f80bc0186a2c7809dbf3a42870dd09643e68d32db896c6da8ba734579e7"), - hexEncPubkey("96419fb80efae4b674402bb969ebaab86c1274f29a83a311e24516d36cdf148fe21754d46c97688cdd7468f24c08b13e4727c29263393638a3b37b99ff60ebca"), - hexEncPubkey("7b9c1889ae916a5d5abcdfb0aaedcc9c6f9eb1c1a4f68d0c2d034fe79ac610ce917c3abc670744150fa891bfcd8ab14fed6983fca964de920aa393fa7b326748"), - hexEncPubkey("7a369b2b8962cc4c65900be046482fbf7c14f98a135bbbae25152c82ad168fb2097b3d1429197cf46d3ce9fdeb64808f908a489cc6019725db040060fdfe5405"), - hexEncPubkey("47bcae48288da5ecc7f5058dfa07cf14d89d06d6e449cb946e237aa6652ea050d9f5a24a65efdc0013ccf232bf88670979eddef249b054f63f38da9d7796dbd8"), - }, - 254: { - hexEncPubkey("099739d7abc8abd38ecc7a816c521a1168a4dbd359fa7212a5123ab583ffa1cf485a5fed219575d6475dbcdd541638b2d3631a6c7fce7474e7fe3cba1d4d5853"), - hexEncPubkey("c2b01603b088a7182d0cf7ef29fb2b04c70acb320fccf78526bf9472e10c74ee70b3fcfa6f4b11d167bd7d3bc4d936b660f2c9bff934793d97cb21750e7c3d31"), - hexEncPubkey("20e4d8f45f2f863e94b45548c1ef22a11f7d36f263e4f8623761e05a64c4572379b000a52211751e2561b0f14f4fc92dd4130410c8ccc71eb4f0e95a700d4ca9"), - hexEncPubkey("27f4a16cc085e72d86e25c98bd2eca173eaaee7565c78ec5a52e9e12b2211f35de81b5b45e9195de2ebfe29106742c59112b951a04eb7ae48822911fc1f9389e"), - hexEncPubkey("55db5ee7d98e7f0b1c3b9d5be6f2bc619a1b86c3cdd513160ad4dcf267037a5fffad527ac15d50aeb32c59c13d1d4c1e567ebbf4de0d25236130c8361f9aac63"), - hexEncPubkey("883df308b0130fc928a8559fe50667a0fff80493bc09685d18213b2db241a3ad11310ed86b0ef662b3ce21fc3d9aa7f3fc24b8d9afe17c7407e9afd3345ae548"), - hexEncPubkey("c7af968cc9bc8200c3ee1a387405f7563be1dce6710a3439f42ea40657d0eae9d2b3c16c42d779605351fcdece4da637b9804e60ca08cfb89aec32c197beffa6"), - hexEncPubkey("3e66f2b788e3ff1d04106b80597915cd7afa06c405a7ae026556b6e583dca8e05cfbab5039bb9a1b5d06083ffe8de5780b1775550e7218f5e98624bf7af9a0a8"), - hexEncPubkey("4fc7f53764de3337fdaec0a711d35d3a923e72fa65025444d12230b3552ed43d9b2d1ad08ccb11f2d50c58809e6dd74dde910e195294fca3b47ae5a3967cc479"), - hexEncPubkey("bafdfdcf6ccaa989436752fa97c77477b6baa7deb374b16c095492c529eb133e8e2f99e1977012b64767b9d34b2cf6d2048ed489bd822b5139b523f6a423167b"), - hexEncPubkey("7f5d78008a4312fe059104ce80202c82b8915c2eb4411c6b812b16f7642e57c00f2c9425121f5cbac4257fe0b3e81ef5dea97ea2dbaa98f6a8b6fd4d1e5980bb"), - hexEncPubkey("598c37fe78f922751a052f463aeb0cb0bc7f52b7c2a4cf2da72ec0931c7c32175d4165d0f8998f7320e87324ac3311c03f9382a5385c55f0407b7a66b2acd864"), - hexEncPubkey("f758c4136e1c148777a7f3275a76e2db0b2b04066fd738554ec398c1c6cc9fb47e14a3b4c87bd47deaeab3ffd2110514c3855685a374794daff87b605b27ee2e"), - hexEncPubkey("0307bb9e4fd865a49dcf1fe4333d1b944547db650ab580af0b33e53c4fef6c789531110fac801bbcbce21fc4d6f61b6d5b24abdf5b22e3030646d579f6dca9c2"), - hexEncPubkey("82504b6eb49bb2c0f91a7006ce9cefdbaf6df38706198502c2e06601091fc9dc91e4f15db3410d45c6af355bc270b0f268d3dff560f956985c7332d4b10bd1ed"), - hexEncPubkey("b39b5b677b45944ceebe76e76d1f051de2f2a0ec7b0d650da52135743e66a9a5dba45f638258f9a7545d9a790c7fe6d3fdf82c25425c7887323e45d27d06c057"), - }, - 255: { - hexEncPubkey("5c4d58d46e055dd1f093f81ee60a675e1f02f54da6206720adee4dccef9b67a31efc5c2a2949c31a04ee31beadc79aba10da31440a1f9ff2a24093c63c36d784"), - hexEncPubkey("ea72161ffdd4b1e124c7b93b0684805f4c4b58d617ed498b37a145c670dbc2e04976f8785583d9c805ffbf343c31d492d79f841652bbbd01b61ed85640b23495"), - hexEncPubkey("51caa1d93352d47a8e531692a3612adac1e8ac68d0a200d086c1c57ae1e1a91aa285ab242e8c52ef9d7afe374c9485b122ae815f1707b875569d0433c1c3ce85"), - hexEncPubkey("c08397d5751b47bd3da044b908be0fb0e510d3149574dff7aeab33749b023bb171b5769990fe17469dbebc100bc150e798aeda426a2dcc766699a225fddd75c6"), - hexEncPubkey("0222c1c194b749736e593f937fad67ee348ac57287a15c7e42877aa38a9b87732a408bca370f812efd0eedbff13e6d5b854bf3ba1dec431a796ed47f32552b09"), - hexEncPubkey("03d859cd46ef02d9bfad5268461a6955426845eef4126de6be0fa4e8d7e0727ba2385b78f1a883a8239e95ebb814f2af8379632c7d5b100688eebc5841209582"), - hexEncPubkey("64d5004b7e043c39ff0bd10cb20094c287721d5251715884c280a612b494b3e9e1c64ba6f67614994c7d969a0d0c0295d107d53fc225d47c44c4b82852d6f960"), - hexEncPubkey("b0a5eefb2dab6f786670f35bf9641eefe6dd87fd3f1362bcab4aaa792903500ab23d88fae68411372e0813b057535a601d46e454323745a948017f6063a47b1f"), - hexEncPubkey("0cc6df0a3433d448b5684d2a3ffa9d1a825388177a18f44ad0008c7bd7702f1ec0fc38b83506f7de689c3b6ecb552599927e29699eed6bb867ff08f80068b287"), - hexEncPubkey("50772f7b8c03a4e153355fbbf79c8a80cf32af656ff0c7873c99911099d04a0dae0674706c357e0145ad017a0ade65e6052cb1b0d574fcd6f67da3eee0ace66b"), - hexEncPubkey("1ae37829c9ef41f8b508b82259ebac76b1ed900d7a45c08b7970f25d2d48ddd1829e2f11423a18749940b6dab8598c6e416cef0efd47e46e51f29a0bc65b37cd"), - hexEncPubkey("ba973cab31c2af091fc1644a93527d62b2394999e2b6ccbf158dd5ab9796a43d408786f1803ef4e29debfeb62fce2b6caa5ab2b24d1549c822a11c40c2856665"), - hexEncPubkey("bc413ad270dd6ea25bddba78f3298b03b8ba6f8608ac03d06007d4116fa78ef5a0cfe8c80155089382fc7a193243ee5500082660cb5d7793f60f2d7d18650964"), - hexEncPubkey("5a6a9ef07634d9eec3baa87c997b529b92652afa11473dfee41ef7037d5c06e0ddb9fe842364462d79dd31cff8a59a1b8d5bc2b810dea1d4cbbd3beb80ecec83"), - hexEncPubkey("f492c6ee2696d5f682f7f537757e52744c2ae560f1090a07024609e903d334e9e174fc01609c5a229ddbcac36c9d21adaf6457dab38a25bfd44f2f0ee4277998"), - hexEncPubkey("459e4db99298cb0467a90acee6888b08bb857450deac11015cced5104853be5adce5b69c740968bc7f931495d671a70cad9f48546d7cd203357fe9af0e8d2164"), - }, - 256: { - hexEncPubkey("a8593af8a4aef7b806b5197612017951bac8845a1917ca9a6a15dd6086d608505144990b245785c4cd2d67a295701c7aac2aa18823fb0033987284b019656268"), - hexEncPubkey("d2eebef914928c3aad77fc1b2a495f52d2294acf5edaa7d8a530b540f094b861a68fe8348a46a7c302f08ab609d85912a4968eacfea0740847b29421b4795d9e"), - hexEncPubkey("b14bfcb31495f32b650b63cf7d08492e3e29071fdc73cf2da0da48d4b191a70ba1a65f42ad8c343206101f00f8a48e8db4b08bf3f622c0853e7323b250835b91"), - hexEncPubkey("7feaee0d818c03eb30e4e0bf03ade0f3c21ca38e938a761aa1781cf70bda8cc5cd631a6cc53dd44f1d4a6d3e2dae6513c6c66ee50cb2f0e9ad6f7e319b309fd9"), - hexEncPubkey("4ca3b657b139311db8d583c25dd5963005e46689e1317620496cc64129c7f3e52870820e0ec7941d28809311df6db8a2867bbd4f235b4248af24d7a9c22d1232"), - hexEncPubkey("1181defb1d16851d42dd951d84424d6bd1479137f587fa184d5a8152be6b6b16ed08bcdb2c2ed8539bcde98c80c432875f9f724737c316a2bd385a39d3cab1d8"), - hexEncPubkey("d9dd818769fa0c3ec9f553c759b92476f082817252a04a47dc1777740b1731d280058c66f982812f173a294acf4944a85ba08346e2de153ba3ba41ce8a62cb64"), - hexEncPubkey("bd7c4f8a9e770aa915c771b15e107ca123d838762da0d3ffc53aa6b53e9cd076cffc534ec4d2e4c334c683f1f5ea72e0e123f6c261915ed5b58ac1b59f003d88"), - hexEncPubkey("3dd5739c73649d510456a70e9d6b46a855864a4a3f744e088fd8c8da11b18e4c9b5f2d7da50b1c147b2bae5ca9609ae01f7a3cdea9dce34f80a91d29cd82f918"), - hexEncPubkey("f0d7df1efc439b4bcc0b762118c1cfa99b2a6143a9f4b10e3c9465125f4c9fca4ab88a2504169bbcad65492cf2f50da9dd5d077c39574a944f94d8246529066b"), - hexEncPubkey("dd598b9ba441448e5fb1a6ec6c5f5aa9605bad6e223297c729b1705d11d05f6bfd3d41988b694681ae69bb03b9a08bff4beab5596503d12a39bffb5cd6e94c7c"), - hexEncPubkey("3fce284ac97e567aebae681b15b7a2b6df9d873945536335883e4bbc26460c064370537f323fd1ada828ea43154992d14ac0cec0940a2bd2a3f42ec156d60c83"), - hexEncPubkey("7c8dfa8c1311cb14fb29a8ac11bca23ecc115e56d9fcf7b7ac1db9066aa4eb39f8b1dabf46e192a65be95ebfb4e839b5ab4533fef414921825e996b210dd53bd"), - hexEncPubkey("cafa6934f82120456620573d7f801390ed5e16ed619613a37e409e44ab355ef755e83565a913b48a9466db786f8d4fbd590bfec474c2524d4a2608d4eafd6abd"), - hexEncPubkey("9d16600d0dd310d77045769fed2cb427f32db88cd57d86e49390c2ba8a9698cfa856f775be2013237226e7bf47b248871cf865d23015937d1edeb20db5e3e760"), - hexEncPubkey("17be6b6ba54199b1d80eff866d348ea11d8a4b341d63ad9a6681d3ef8a43853ac564d153eb2a8737f0afc9ab320f6f95c55aa11aaa13bbb1ff422fd16bdf8188"), - }, - }, -} + // Add a changed version of n2. + newrec := n2.Record() + newrec.Set(enr.IP{99, 99, 99, 99}) + newn2 := wrapNode(enode.SignNull(newrec, n2.ID())) + tab.addVerifiedNode(newn2) -type preminedTestnet struct { - target encPubkey - targetSha enode.ID // sha3(target) - dists [hashBits + 1][]encPubkey + // Check that bucket is updated correctly. + newBcontent := []*node{newn2, n1} + if !reflect.DeepEqual(tab.bucket(n1.ID()).entries, newBcontent) { + t.Fatalf("wrong bucket content after update: %v", tab.bucket(n1.ID()).entries) + } + checkIPLimitInvariant(t, tab) } -func (tn *preminedTestnet) self() *enode.Node { - return nullNode -} +func TestTable_addSeenNode(t *testing.T) { + tab, db := newTestTable(newPingRecorder()) + <-tab.initDone + defer db.Close() + defer tab.close() + + // Insert two nodes. + n1 := nodeAtDistance(tab.self().ID(), 256, net.IP{88, 77, 66, 1}) + n2 := nodeAtDistance(tab.self().ID(), 256, net.IP{88, 77, 66, 2}) + tab.addSeenNode(n1) + tab.addSeenNode(n2) -func (tn *preminedTestnet) findnode(toid enode.ID, toaddr *net.UDPAddr, target encPubkey) ([]*node, error) { - // current log distance is encoded in port number - // fmt.Println("findnode query at dist", toaddr.Port) - if toaddr.Port == 0 { - panic("query to node at distance 0") + // Verify bucket content: + bcontent := []*node{n1, n2} + if !reflect.DeepEqual(tab.bucket(n1.ID()).entries, bcontent) { + t.Fatalf("wrong bucket content: %v", tab.bucket(n1.ID()).entries) } - next := toaddr.Port - 1 - var result []*node - for i, ekey := range tn.dists[toaddr.Port] { - key, _ := decodePubkey(ekey) - node := wrapNode(enode.NewV4(key, net.ParseIP("127.0.0.1"), i, next)) - result = append(result, node) + + // Add a changed version of n2. + newrec := n2.Record() + newrec.Set(enr.IP{99, 99, 99, 99}) + newn2 := wrapNode(enode.SignNull(newrec, n2.ID())) + tab.addSeenNode(newn2) + + // Check that bucket content is unchanged. + if !reflect.DeepEqual(tab.bucket(n1.ID()).entries, bcontent) { + t.Fatalf("wrong bucket content after update: %v", tab.bucket(n1.ID()).entries) } - return result, nil + checkIPLimitInvariant(t, tab) } -func (*preminedTestnet) close() {} -func (*preminedTestnet) waitping(from enode.ID) error { return nil } -func (*preminedTestnet) ping(toid enode.ID, toaddr *net.UDPAddr) error { return nil } - -// mine generates a testnet struct literal with nodes at -// various distances to the given target. -func (tn *preminedTestnet) mine(target encPubkey) { - tn.target = target - tn.targetSha = tn.target.id() - found := 0 - for found < bucketSize*10 { - k := newkey() - key := encodePubkey(&k.PublicKey) - ld := enode.LogDist(tn.targetSha, key.id()) - if len(tn.dists[ld]) < bucketSize { - tn.dists[ld] = append(tn.dists[ld], key) - fmt.Println("found ID with ld", ld) - found++ - } - } - fmt.Println("&preminedTestnet{") - fmt.Printf(" target: %#v,\n", tn.target) - fmt.Printf(" targetSha: %#v,\n", tn.targetSha) - fmt.Printf(" dists: [%d][]encPubkey{\n", len(tn.dists)) - for ld, ns := range tn.dists { - if len(ns) == 0 { - continue - } - fmt.Printf(" %d: []encPubkey{\n", ld) - for _, n := range ns { - fmt.Printf(" hexEncPubkey(\"%x\"),\n", n[:]) - } - fmt.Println(" },") +// This test checks that ENR updates happen during revalidation. If a node in the table +// announces a new sequence number, the new record should be pulled. +func TestTable_revalidateSyncRecord(t *testing.T) { + transport := newPingRecorder() + tab, db := newTestTable(transport) + <-tab.initDone + defer db.Close() + defer tab.close() + + // Insert a node. + var r enr.Record + r.Set(enr.IP(net.IP{127, 0, 0, 1})) + id := enode.ID{1} + n1 := wrapNode(enode.SignNull(&r, id)) + tab.addSeenNode(n1) + + // Update the node record. + r.Set(enr.WithEntry("foo", "bar")) + n2 := enode.SignNull(&r, id) + transport.updateRecord(n2) + + tab.doRevalidate(make(chan struct{}, 1)) + intable := tab.getNode(id) + if !reflect.DeepEqual(intable, n2) { + t.Fatalf("table contains old record with seq %d, want seq %d", intable.Seq(), n2.Seq()) } - fmt.Println(" },") - fmt.Println("}") } // gen wraps quick.Value so it's easier to use. @@ -578,6 +406,12 @@ func gen(typ interface{}, rand *rand.Rand) interface{} { return v.Interface() } +func genIP(rand *rand.Rand) net.IP { + ip := make(net.IP, 4) + rand.Read(ip) + return ip +} + func quickcfg() *quick.Config { return &quick.Config{ MaxCount: 5000, diff --git a/p2p/discover/table_util_test.go b/p2p/discover/table_util_test.go index c3158a0c3fe4..e35e48c5e69d 100644 --- a/p2p/discover/table_util_test.go +++ b/p2p/discover/table_util_test.go @@ -1,4 +1,4 @@ -// Copyright 2015 The go-ethereum Authors +// Copyright 2018 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 @@ -17,15 +17,21 @@ package discover import ( + "bytes" "crypto/ecdsa" "encoding/hex" + "errors" "fmt" "math/rand" "net" + "reflect" + "sort" "sync" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/enr" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" ) var nullNode *enode.Node @@ -38,7 +44,8 @@ func init() { func newTestTable(t transport) (*Table, *enode.DB) { db, _ := enode.OpenDB("") - tab, _ := newTable(t, db, nil) + tab, _ := newTable(t, db, nil, log.Root()) + go tab.loop() return tab, db } @@ -83,9 +90,18 @@ func fillBucket(tab *Table, n *node) (last *node) { return b.entries[bucketSize-1] } +// fillTable adds nodes the table to the end of their corresponding bucket +// if the bucket is not full. The caller must not hold tab.mutex. +func fillTable(tab *Table, nodes []*node) { + for _, n := range nodes { + tab.addSeenNode(n) + } +} + type pingRecorder struct { mu sync.Mutex dead, pinged map[enode.ID]bool + records map[enode.ID]*enode.Node n *enode.Node } @@ -95,38 +111,53 @@ func newPingRecorder() *pingRecorder { n := enode.SignNull(&r, enode.ID{}) return &pingRecorder{ - dead: make(map[enode.ID]bool), - pinged: make(map[enode.ID]bool), - n: n, + dead: make(map[enode.ID]bool), + pinged: make(map[enode.ID]bool), + records: make(map[enode.ID]*enode.Node), + n: n, } } -func (t *pingRecorder) self() *enode.Node { - return nullNode +// setRecord updates a node record. Future calls to ping and +// requestENR will return this record. +func (t *pingRecorder) updateRecord(n *enode.Node) { + t.mu.Lock() + defer t.mu.Unlock() + t.records[n.ID()] = n } -func (t *pingRecorder) findnode(toid enode.ID, toaddr *net.UDPAddr, target encPubkey) ([]*node, error) { - return nil, nil -} +// Stubs to satisfy the transport interface. +func (t *pingRecorder) Self() *enode.Node { return nullNode } +func (t *pingRecorder) lookupSelf() []*enode.Node { return nil } +func (t *pingRecorder) lookupRandom() []*enode.Node { return nil } +func (t *pingRecorder) close() {} + +// ping simulates a ping request. +func (t *pingRecorder) ping(n *enode.Node) (seq uint64, err error) { + t.mu.Lock() + defer t.mu.Unlock() -func (t *pingRecorder) waitping(from enode.ID) error { - return nil // remote always pings + t.pinged[n.ID()] = true + if t.dead[n.ID()] { + return 0, errTimeout + } + if t.records[n.ID()] != nil { + seq = t.records[n.ID()].Seq() + } + return seq, nil } -func (t *pingRecorder) ping(toid enode.ID, toaddr *net.UDPAddr) error { +// requestENR simulates an ENR request. +func (t *pingRecorder) RequestENR(n *enode.Node) (*enode.Node, error) { t.mu.Lock() defer t.mu.Unlock() - t.pinged[toid] = true - if t.dead[toid] { - return errTimeout - } else { - return nil + if t.dead[n.ID()] || t.records[n.ID()] == nil { + return nil, errTimeout } + return t.records[n.ID()], nil } -func (t *pingRecorder) close() {} - func hasDuplicates(slice []*node) bool { seen := make(map[enode.ID]bool) for i, e := range slice { @@ -141,24 +172,44 @@ func hasDuplicates(slice []*node) bool { return false } -func contains(ns []*node, id enode.ID) bool { - for _, n := range ns { - if n.ID() == id { - return true - } +func checkNodesEqual(got, want []*enode.Node) error { + if reflect.DeepEqual(got, want) { + return nil } - return false + output := new(bytes.Buffer) + fmt.Fprintf(output, "got %d nodes:\n", len(got)) + for _, n := range got { + fmt.Fprintf(output, " %v %v\n", n.ID(), n) + } + fmt.Fprintf(output, "want %d:\n", len(want)) + for _, n := range want { + fmt.Fprintf(output, " %v %v\n", n.ID(), n) + } + return errors.New(output.String()) +} + +func sortByID(nodes []*enode.Node) { + sort.Slice(nodes, func(i, j int) bool { + return string(nodes[i].ID().Bytes()) < string(nodes[j].ID().Bytes()) + }) } func sortedByDistanceTo(distbase enode.ID, slice []*node) bool { - var last enode.ID - for i, e := range slice { - if i > 0 && enode.DistCmp(distbase, e.ID(), last) < 0 { - return false - } - last = e.ID() + return sort.SliceIsSorted(slice, func(i, j int) bool { + return enode.DistCmp(distbase, slice[i].ID(), slice[j].ID()) < 0 + }) +} + +func hexEncPrivkey(h string) *ecdsa.PrivateKey { + b, err := hex.DecodeString(h) + if err != nil { + panic(err) } - return true + key, err := crypto.ToECDSA(b) + if err != nil { + panic(err) + } + return key } func hexEncPubkey(h string) (ret encPubkey) { @@ -172,11 +223,3 @@ func hexEncPubkey(h string) (ret encPubkey) { copy(ret[:], b) return ret } - -func hexPubkey(h string) *ecdsa.PublicKey { - k, err := decodePubkey(hexEncPubkey(h)) - if err != nil { - panic(err) - } - return k -} diff --git a/p2p/discover/udp.go b/p2p/discover/udp.go deleted file mode 100644 index 6fed74be664e..000000000000 --- a/p2p/discover/udp.go +++ /dev/null @@ -1,715 +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 discover - -import ( - "bytes" - "container/list" - "crypto/ecdsa" - "errors" - "fmt" - "net" - "sync" - "time" - - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/netutil" - "github.com/nebulaai/nbai-node/rlp" -) - -// Errors -var ( - errPacketTooSmall = errors.New("too small") - errBadHash = errors.New("bad hash") - errExpired = errors.New("expired") - errUnsolicitedReply = errors.New("unsolicited reply") - errUnknownNode = errors.New("unknown node") - errTimeout = errors.New("RPC timeout") - errClockWarp = errors.New("reply deadline too far in the future") - errClosed = errors.New("socket closed") -) - -// Timeouts -const ( - respTimeout = 500 * time.Millisecond - expiration = 20 * time.Second - bondExpiration = 24 * time.Hour - - ntpFailureThreshold = 32 // Continuous timeouts after which to check NTP - ntpWarningCooldown = 10 * time.Minute // Minimum amount of time to pass before repeating NTP warning - driftThreshold = 10 * time.Second // Allowed clock drift before warning user -) - -// RPC packet types -const ( - pingPacket = iota + 1 // zero is 'reserved' - pongPacket - findnodePacket - neighborsPacket -) - -// RPC request structures -type ( - ping struct { - Version uint - From, To rpcEndpoint - Expiration uint64 - // Ignore additional fields (for forward compatibility). - Rest []rlp.RawValue `rlp:"tail"` - } - - // pong is the reply to ping. - pong struct { - // This field should mirror the UDP envelope address - // of the ping packet, which provides a way to discover the - // the external address (after NAT). - To rpcEndpoint - - ReplyTok []byte // This contains the hash of the ping packet. - Expiration uint64 // Absolute timestamp at which the packet becomes invalid. - // Ignore additional fields (for forward compatibility). - Rest []rlp.RawValue `rlp:"tail"` - } - - // findnode is a query for nodes close to the given target. - findnode struct { - Target encPubkey - Expiration uint64 - // Ignore additional fields (for forward compatibility). - Rest []rlp.RawValue `rlp:"tail"` - } - - // reply to findnode - neighbors struct { - Nodes []rpcNode - Expiration uint64 - // Ignore additional fields (for forward compatibility). - Rest []rlp.RawValue `rlp:"tail"` - } - - rpcNode struct { - IP net.IP // len 4 for IPv4 or 16 for IPv6 - UDP uint16 // for discovery protocol - TCP uint16 // for RLPx protocol - ID encPubkey - } - - rpcEndpoint struct { - IP net.IP // len 4 for IPv4 or 16 for IPv6 - UDP uint16 // for discovery protocol - TCP uint16 // for RLPx protocol - } -) - -func makeEndpoint(addr *net.UDPAddr, tcpPort uint16) rpcEndpoint { - ip := net.IP{} - if ip4 := addr.IP.To4(); ip4 != nil { - ip = ip4 - } else if ip6 := addr.IP.To16(); ip6 != nil { - ip = ip6 - } - return rpcEndpoint{IP: ip, UDP: uint16(addr.Port), TCP: tcpPort} -} - -func (t *udp) nodeFromRPC(sender *net.UDPAddr, rn rpcNode) (*node, error) { - if rn.UDP <= 1024 { - return nil, errors.New("low port") - } - if err := netutil.CheckRelayIP(sender.IP, rn.IP); err != nil { - return nil, err - } - if t.netrestrict != nil && !t.netrestrict.Contains(rn.IP) { - return nil, errors.New("not contained in netrestrict whitelist") - } - key, err := decodePubkey(rn.ID) - if err != nil { - return nil, err - } - n := wrapNode(enode.NewV4(key, rn.IP, int(rn.TCP), int(rn.UDP))) - err = n.ValidateComplete() - return n, err -} - -func nodeToRPC(n *node) rpcNode { - var key ecdsa.PublicKey - var ekey encPubkey - if err := n.Load((*enode.Secp256k1)(&key)); err == nil { - ekey = encodePubkey(&key) - } - return rpcNode{ID: ekey, IP: n.IP(), UDP: uint16(n.UDP()), TCP: uint16(n.TCP())} -} - -type packet interface { - handle(t *udp, from *net.UDPAddr, fromKey encPubkey, mac []byte) error - name() string -} - -type conn interface { - ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) - WriteToUDP(b []byte, addr *net.UDPAddr) (n int, err error) - Close() error - LocalAddr() net.Addr -} - -// udp implements the discovery v4 UDP wire protocol. -type udp struct { - conn conn - netrestrict *netutil.Netlist - priv *ecdsa.PrivateKey - localNode *enode.LocalNode - db *enode.DB - tab *Table - wg sync.WaitGroup - - addpending chan *pending - gotreply chan reply - closing chan struct{} -} - -// pending represents a pending reply. -// -// some implementations of the protocol wish to send more than one -// reply packet to findnode. in general, any neighbors packet cannot -// be matched up with a specific findnode packet. -// -// our implementation handles this by storing a callback function for -// each pending reply. incoming packets from a node are dispatched -// to all the callback functions for that node. -type pending struct { - // these fields must match in the reply. - from enode.ID - ptype byte - - // time when the request must complete - deadline time.Time - - // callback is called when a matching reply arrives. if it returns - // true, the callback is removed from the pending reply queue. - // if it returns false, the reply is considered incomplete and - // the callback will be invoked again for the next matching reply. - callback func(resp interface{}) (done bool) - - // errc receives nil when the callback indicates completion or an - // error if no further reply is received within the timeout. - errc chan<- error -} - -type reply struct { - from enode.ID - ptype byte - data interface{} - // loop indicates whether there was - // a matching request by sending on this channel. - matched chan<- bool -} - -// ReadPacket is sent to the unhandled channel when it could not be processed -type ReadPacket struct { - Data []byte - Addr *net.UDPAddr -} - -// Config holds Table-related settings. -type Config struct { - // These settings are required and configure the UDP listener: - PrivateKey *ecdsa.PrivateKey - - // These settings are optional: - NetRestrict *netutil.Netlist // network whitelist - Bootnodes []*enode.Node // list of bootstrap nodes - Unhandled chan<- ReadPacket // unhandled packets are sent on this channel -} - -// ListenUDP returns a new table that listens for UDP packets on laddr. -func ListenUDP(c conn, ln *enode.LocalNode, cfg Config) (*Table, error) { - tab, _, err := newUDP(c, ln, cfg) - if err != nil { - return nil, err - } - return tab, nil -} - -func newUDP(c conn, ln *enode.LocalNode, cfg Config) (*Table, *udp, error) { - udp := &udp{ - conn: c, - priv: cfg.PrivateKey, - netrestrict: cfg.NetRestrict, - localNode: ln, - db: ln.Database(), - closing: make(chan struct{}), - gotreply: make(chan reply), - addpending: make(chan *pending), - } - tab, err := newTable(udp, ln.Database(), cfg.Bootnodes) - if err != nil { - return nil, nil, err - } - udp.tab = tab - - udp.wg.Add(2) - go udp.loop() - go udp.readLoop(cfg.Unhandled) - return udp.tab, udp, nil -} - -func (t *udp) self() *enode.Node { - return t.localNode.Node() -} - -func (t *udp) close() { - close(t.closing) - t.conn.Close() - t.wg.Wait() -} - -func (t *udp) ourEndpoint() rpcEndpoint { - n := t.self() - a := &net.UDPAddr{IP: n.IP(), Port: n.UDP()} - return makeEndpoint(a, uint16(n.TCP())) -} - -// ping sends a ping message to the given node and waits for a reply. -func (t *udp) ping(toid enode.ID, toaddr *net.UDPAddr) error { - return <-t.sendPing(toid, toaddr, nil) -} - -// sendPing sends a ping message to the given node and invokes the callback -// when the reply arrives. -func (t *udp) sendPing(toid enode.ID, toaddr *net.UDPAddr, callback func()) <-chan error { - req := &ping{ - Version: 4, - From: t.ourEndpoint(), - To: makeEndpoint(toaddr, 0), // TODO: maybe use known TCP port from DB - Expiration: uint64(time.Now().Add(expiration).Unix()), - } - packet, hash, err := encodePacket(t.priv, pingPacket, req) - if err != nil { - errc := make(chan error, 1) - errc <- err - return errc - } - errc := t.pending(toid, pongPacket, func(p interface{}) bool { - ok := bytes.Equal(p.(*pong).ReplyTok, hash) - if ok && callback != nil { - callback() - } - return ok - }) - t.localNode.UDPContact(toaddr) - t.write(toaddr, req.name(), packet) - return errc -} - -func (t *udp) waitping(from enode.ID) error { - return <-t.pending(from, pingPacket, func(interface{}) bool { return true }) -} - -// findnode sends a findnode request to the given node and waits until -// the node has sent up to k neighbors. -func (t *udp) findnode(toid enode.ID, toaddr *net.UDPAddr, target encPubkey) ([]*node, error) { - // If we haven't seen a ping from the destination node for a while, it won't remember - // our endpoint proof and reject findnode. Solicit a ping first. - if time.Since(t.db.LastPingReceived(toid)) > bondExpiration { - t.ping(toid, toaddr) - t.waitping(toid) - } - - nodes := make([]*node, 0, bucketSize) - nreceived := 0 - errc := t.pending(toid, neighborsPacket, func(r interface{}) bool { - reply := r.(*neighbors) - for _, rn := range reply.Nodes { - nreceived++ - n, err := t.nodeFromRPC(toaddr, rn) - if err != nil { - log.Trace("Invalid neighbor node received", "ip", rn.IP, "addr", toaddr, "err", err) - continue - } - nodes = append(nodes, n) - } - return nreceived >= bucketSize - }) - t.send(toaddr, findnodePacket, &findnode{ - Target: target, - Expiration: uint64(time.Now().Add(expiration).Unix()), - }) - return nodes, <-errc -} - -// pending adds a reply callback to the pending reply queue. -// see the documentation of type pending for a detailed explanation. -func (t *udp) pending(id enode.ID, ptype byte, callback func(interface{}) bool) <-chan error { - ch := make(chan error, 1) - p := &pending{from: id, ptype: ptype, callback: callback, errc: ch} - select { - case t.addpending <- p: - // loop will handle it - case <-t.closing: - ch <- errClosed - } - return ch -} - -func (t *udp) handleReply(from enode.ID, ptype byte, req packet) bool { - matched := make(chan bool, 1) - select { - case t.gotreply <- reply{from, ptype, req, matched}: - // loop will handle it - return <-matched - case <-t.closing: - return false - } -} - -// loop runs in its own goroutine. it keeps track of -// the refresh timer and the pending reply queue. -func (t *udp) loop() { - defer t.wg.Done() - - var ( - plist = list.New() - timeout = time.NewTimer(0) - nextTimeout *pending // head of plist when timeout was last reset - contTimeouts = 0 // number of continuous timeouts to do NTP checks - ntpWarnTime = time.Unix(0, 0) - ) - <-timeout.C // ignore first timeout - defer timeout.Stop() - - resetTimeout := func() { - if plist.Front() == nil || nextTimeout == plist.Front().Value { - return - } - // Start the timer so it fires when the next pending reply has expired. - now := time.Now() - for el := plist.Front(); el != nil; el = el.Next() { - nextTimeout = el.Value.(*pending) - if dist := nextTimeout.deadline.Sub(now); dist < 2*respTimeout { - timeout.Reset(dist) - return - } - // Remove pending replies whose deadline is too far in the - // future. These can occur if the system clock jumped - // backwards after the deadline was assigned. - nextTimeout.errc <- errClockWarp - plist.Remove(el) - } - nextTimeout = nil - timeout.Stop() - } - - for { - resetTimeout() - - select { - case <-t.closing: - for el := plist.Front(); el != nil; el = el.Next() { - el.Value.(*pending).errc <- errClosed - } - return - - case p := <-t.addpending: - p.deadline = time.Now().Add(respTimeout) - plist.PushBack(p) - - case r := <-t.gotreply: - var matched bool - for el := plist.Front(); el != nil; el = el.Next() { - p := el.Value.(*pending) - if p.from == r.from && p.ptype == r.ptype { - matched = true - // Remove the matcher if its callback indicates - // that all replies have been received. This is - // required for packet types that expect multiple - // reply packets. - if p.callback(r.data) { - p.errc <- nil - plist.Remove(el) - } - // Reset the continuous timeout counter (time drift detection) - contTimeouts = 0 - } - } - r.matched <- matched - - case now := <-timeout.C: - nextTimeout = nil - - // Notify and remove callbacks whose deadline is in the past. - for el := plist.Front(); el != nil; el = el.Next() { - p := el.Value.(*pending) - if now.After(p.deadline) || now.Equal(p.deadline) { - p.errc <- errTimeout - plist.Remove(el) - contTimeouts++ - } - } - // If we've accumulated too many timeouts, do an NTP time sync check - if contTimeouts > ntpFailureThreshold { - if time.Since(ntpWarnTime) >= ntpWarningCooldown { - ntpWarnTime = time.Now() - go checkClockDrift() - } - contTimeouts = 0 - } - } - } -} - -const ( - macSize = 256 / 8 - sigSize = 520 / 8 - headSize = macSize + sigSize // space of packet frame data -) - -var ( - headSpace = make([]byte, headSize) - - // Neighbors replies are sent across multiple packets to - // stay below the 1280 byte limit. We compute the maximum number - // of entries by stuffing a packet until it grows too large. - maxNeighbors int -) - -func init() { - p := neighbors{Expiration: ^uint64(0)} - maxSizeNode := rpcNode{IP: make(net.IP, 16), UDP: ^uint16(0), TCP: ^uint16(0)} - for n := 0; ; n++ { - p.Nodes = append(p.Nodes, maxSizeNode) - size, _, err := rlp.EncodeToReader(p) - if err != nil { - // If this ever happens, it will be caught by the unit tests. - panic("cannot encode: " + err.Error()) - } - if headSize+size+1 >= 1280 { - maxNeighbors = n - break - } - } -} - -func (t *udp) send(toaddr *net.UDPAddr, ptype byte, req packet) ([]byte, error) { - packet, hash, err := encodePacket(t.priv, ptype, req) - if err != nil { - return hash, err - } - return hash, t.write(toaddr, req.name(), packet) -} - -func (t *udp) write(toaddr *net.UDPAddr, what string, packet []byte) error { - _, err := t.conn.WriteToUDP(packet, toaddr) - log.Trace(">> "+what, "addr", toaddr, "err", err) - return err -} - -func encodePacket(priv *ecdsa.PrivateKey, ptype byte, req interface{}) (packet, hash []byte, err error) { - b := new(bytes.Buffer) - b.Write(headSpace) - b.WriteByte(ptype) - if err := rlp.Encode(b, req); err != nil { - log.Error("Can't encode discv4 packet", "err", err) - return nil, nil, err - } - packet = b.Bytes() - sig, err := crypto.Sign(crypto.Keccak256(packet[headSize:]), priv) - if err != nil { - log.Error("Can't sign discv4 packet", "err", err) - return nil, nil, err - } - copy(packet[macSize:], sig) - // add the hash to the front. Note: this doesn't protect the - // packet in any way. Our public key will be part of this hash in - // The future. - hash = crypto.Keccak256(packet[macSize:]) - copy(packet, hash) - return packet, hash, nil -} - -// readLoop runs in its own goroutine. it handles incoming UDP packets. -func (t *udp) readLoop(unhandled chan<- ReadPacket) { - defer t.wg.Done() - if unhandled != nil { - defer close(unhandled) - } - - // Discovery packets are defined to be no larger than 1280 bytes. - // Packets larger than this size will be cut at the end and treated - // as invalid because their hash won't match. - buf := make([]byte, 1280) - for { - nbytes, from, err := t.conn.ReadFromUDP(buf) - if netutil.IsTemporaryError(err) { - // Ignore temporary read errors. - log.Debug("Temporary UDP read error", "err", err) - continue - } else if err != nil { - // Shut down the loop for permament errors. - log.Debug("UDP read error", "err", err) - return - } - if t.handlePacket(from, buf[:nbytes]) != nil && unhandled != nil { - select { - case unhandled <- ReadPacket{buf[:nbytes], from}: - default: - } - } - } -} - -func (t *udp) handlePacket(from *net.UDPAddr, buf []byte) error { - packet, fromID, hash, err := decodePacket(buf) - if err != nil { - log.Debug("Bad discv4 packet", "addr", from, "err", err) - return err - } - err = packet.handle(t, from, fromID, hash) - log.Trace("<< "+packet.name(), "addr", from, "err", err) - return err -} - -func decodePacket(buf []byte) (packet, encPubkey, []byte, error) { - if len(buf) < headSize+1 { - return nil, encPubkey{}, nil, errPacketTooSmall - } - hash, sig, sigdata := buf[:macSize], buf[macSize:headSize], buf[headSize:] - shouldhash := crypto.Keccak256(buf[macSize:]) - if !bytes.Equal(hash, shouldhash) { - return nil, encPubkey{}, nil, errBadHash - } - fromKey, err := recoverNodeKey(crypto.Keccak256(buf[headSize:]), sig) - if err != nil { - return nil, fromKey, hash, err - } - - var req packet - switch ptype := sigdata[0]; ptype { - case pingPacket: - req = new(ping) - case pongPacket: - req = new(pong) - case findnodePacket: - req = new(findnode) - case neighborsPacket: - req = new(neighbors) - default: - return nil, fromKey, hash, fmt.Errorf("unknown type: %d", ptype) - } - s := rlp.NewStream(bytes.NewReader(sigdata[1:]), 0) - err = s.Decode(req) - return req, fromKey, hash, err -} - -func (req *ping) handle(t *udp, from *net.UDPAddr, fromKey encPubkey, mac []byte) error { - if expired(req.Expiration) { - return errExpired - } - key, err := decodePubkey(fromKey) - if err != nil { - return fmt.Errorf("invalid public key: %v", err) - } - t.send(from, pongPacket, &pong{ - To: makeEndpoint(from, req.From.TCP), - ReplyTok: mac, - Expiration: uint64(time.Now().Add(expiration).Unix()), - }) - n := wrapNode(enode.NewV4(key, from.IP, int(req.From.TCP), from.Port)) - t.handleReply(n.ID(), pingPacket, req) - if time.Since(t.db.LastPongReceived(n.ID())) > bondExpiration { - t.sendPing(n.ID(), from, func() { t.tab.addThroughPing(n) }) - } else { - t.tab.addThroughPing(n) - } - t.localNode.UDPEndpointStatement(from, &net.UDPAddr{IP: req.To.IP, Port: int(req.To.UDP)}) - t.db.UpdateLastPingReceived(n.ID(), time.Now()) - return nil -} - -func (req *ping) name() string { return "PING/v4" } - -func (req *pong) handle(t *udp, from *net.UDPAddr, fromKey encPubkey, mac []byte) error { - if expired(req.Expiration) { - return errExpired - } - fromID := fromKey.id() - if !t.handleReply(fromID, pongPacket, req) { - return errUnsolicitedReply - } - t.localNode.UDPEndpointStatement(from, &net.UDPAddr{IP: req.To.IP, Port: int(req.To.UDP)}) - t.db.UpdateLastPongReceived(fromID, time.Now()) - return nil -} - -func (req *pong) name() string { return "PONG/v4" } - -func (req *findnode) handle(t *udp, from *net.UDPAddr, fromKey encPubkey, mac []byte) error { - if expired(req.Expiration) { - return errExpired - } - fromID := fromKey.id() - if time.Since(t.db.LastPongReceived(fromID)) > bondExpiration { - // No endpoint proof pong exists, we don't process the packet. This prevents an - // attack vector where the discovery protocol could be used to amplify traffic in a - // DDOS attack. A malicious actor would send a findnode request with the IP address - // and UDP port of the target as the source address. The recipient of the findnode - // packet would then send a neighbors packet (which is a much bigger packet than - // findnode) to the victim. - return errUnknownNode - } - target := enode.ID(crypto.Keccak256Hash(req.Target[:])) - t.tab.mutex.Lock() - closest := t.tab.closest(target, bucketSize).entries - t.tab.mutex.Unlock() - - p := neighbors{Expiration: uint64(time.Now().Add(expiration).Unix())} - var sent bool - // Send neighbors in chunks with at most maxNeighbors per packet - // to stay below the 1280 byte limit. - for _, n := range closest { - if netutil.CheckRelayIP(from.IP, n.IP()) == nil { - p.Nodes = append(p.Nodes, nodeToRPC(n)) - } - if len(p.Nodes) == maxNeighbors { - t.send(from, neighborsPacket, &p) - p.Nodes = p.Nodes[:0] - sent = true - } - } - if len(p.Nodes) > 0 || !sent { - t.send(from, neighborsPacket, &p) - } - return nil -} - -func (req *findnode) name() string { return "FINDNODE/v4" } - -func (req *neighbors) handle(t *udp, from *net.UDPAddr, fromKey encPubkey, mac []byte) error { - if expired(req.Expiration) { - return errExpired - } - if !t.handleReply(fromKey.id(), neighborsPacket, req) { - return errUnsolicitedReply - } - return nil -} - -func (req *neighbors) name() string { return "NEIGHBORS/v4" } - -func expired(ts uint64) bool { - return time.Unix(int64(ts), 0).Before(time.Now()) -} diff --git a/p2p/discover/udp_test.go b/p2p/discover/udp_test.go deleted file mode 100644 index 53ac42a87c90..000000000000 --- a/p2p/discover/udp_test.go +++ /dev/null @@ -1,569 +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 discover - -import ( - "bytes" - "crypto/ecdsa" - "encoding/binary" - "encoding/hex" - "errors" - "fmt" - "io" - "math/rand" - "net" - "path/filepath" - "reflect" - "runtime" - "sync" - "testing" - "time" - - "github.com/davecgh/go-spew/spew" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/rlp" -) - -func init() { - spew.Config.DisableMethods = true -} - -// shared test variables -var ( - futureExp = uint64(time.Now().Add(10 * time.Hour).Unix()) - testTarget = encPubkey{0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1} - testRemote = rpcEndpoint{IP: net.ParseIP("1.1.1.1").To4(), UDP: 1, TCP: 2} - testLocalAnnounced = rpcEndpoint{IP: net.ParseIP("2.2.2.2").To4(), UDP: 3, TCP: 4} - testLocal = rpcEndpoint{IP: net.ParseIP("3.3.3.3").To4(), UDP: 5, TCP: 6} -) - -type udpTest struct { - t *testing.T - pipe *dgramPipe - table *Table - udp *udp - sent [][]byte - localkey, remotekey *ecdsa.PrivateKey - remoteaddr *net.UDPAddr -} - -func newUDPTest(t *testing.T) *udpTest { - test := &udpTest{ - t: t, - pipe: newpipe(), - localkey: newkey(), - remotekey: newkey(), - remoteaddr: &net.UDPAddr{IP: net.IP{10, 0, 1, 99}, Port: 30303}, - } - db, _ := enode.OpenDB("") - ln := enode.NewLocalNode(db, test.localkey) - test.table, test.udp, _ = newUDP(test.pipe, ln, Config{PrivateKey: test.localkey}) - // Wait for initial refresh so the table doesn't send unexpected findnode. - <-test.table.initDone - return test -} - -// handles a packet as if it had been sent to the transport. -func (test *udpTest) packetIn(wantError error, ptype byte, data packet) error { - enc, _, err := encodePacket(test.remotekey, ptype, data) - if err != nil { - return test.errorf("packet (%d) encode error: %v", ptype, err) - } - test.sent = append(test.sent, enc) - if err = test.udp.handlePacket(test.remoteaddr, enc); err != wantError { - return test.errorf("error mismatch: got %q, want %q", err, wantError) - } - return nil -} - -// waits for a packet to be sent by the transport. -// validate should have type func(*udpTest, X) error, where X is a packet type. -func (test *udpTest) waitPacketOut(validate interface{}) ([]byte, error) { - dgram := test.pipe.waitPacketOut() - p, _, hash, err := decodePacket(dgram) - if err != nil { - return hash, test.errorf("sent packet decode error: %v", err) - } - fn := reflect.ValueOf(validate) - exptype := fn.Type().In(0) - if reflect.TypeOf(p) != exptype { - return hash, test.errorf("sent packet type mismatch, got: %v, want: %v", reflect.TypeOf(p), exptype) - } - fn.Call([]reflect.Value{reflect.ValueOf(p)}) - return hash, nil -} - -func (test *udpTest) errorf(format string, args ...interface{}) error { - _, file, line, ok := runtime.Caller(2) // errorf + waitPacketOut - if ok { - file = filepath.Base(file) - } else { - file = "???" - line = 1 - } - err := fmt.Errorf(format, args...) - fmt.Printf("\t%s:%d: %v\n", file, line, err) - test.t.Fail() - return err -} - -func TestUDP_packetErrors(t *testing.T) { - test := newUDPTest(t) - defer test.table.Close() - - test.packetIn(errExpired, pingPacket, &ping{From: testRemote, To: testLocalAnnounced, Version: 4}) - test.packetIn(errUnsolicitedReply, pongPacket, &pong{ReplyTok: []byte{}, Expiration: futureExp}) - test.packetIn(errUnknownNode, findnodePacket, &findnode{Expiration: futureExp}) - test.packetIn(errUnsolicitedReply, neighborsPacket, &neighbors{Expiration: futureExp}) -} - -func TestUDP_pingTimeout(t *testing.T) { - t.Parallel() - test := newUDPTest(t) - defer test.table.Close() - - toaddr := &net.UDPAddr{IP: net.ParseIP("1.2.3.4"), Port: 2222} - toid := enode.ID{1, 2, 3, 4} - if err := test.udp.ping(toid, toaddr); err != errTimeout { - t.Error("expected timeout error, got", err) - } -} - -func TestUDP_responseTimeouts(t *testing.T) { - t.Parallel() - test := newUDPTest(t) - defer test.table.Close() - - rand.Seed(time.Now().UnixNano()) - randomDuration := func(max time.Duration) time.Duration { - return time.Duration(rand.Int63n(int64(max))) - } - - var ( - nReqs = 200 - nTimeouts = 0 // number of requests with ptype > 128 - nilErr = make(chan error, nReqs) // for requests that get a reply - timeoutErr = make(chan error, nReqs) // for requests that time out - ) - for i := 0; i < nReqs; i++ { - // Create a matcher for a random request in udp.loop. Requests - // with ptype <= 128 will not get a reply and should time out. - // For all other requests, a reply is scheduled to arrive - // within the timeout window. - p := &pending{ - ptype: byte(rand.Intn(255)), - callback: func(interface{}) bool { return true }, - } - binary.BigEndian.PutUint64(p.from[:], uint64(i)) - if p.ptype <= 128 { - p.errc = timeoutErr - test.udp.addpending <- p - nTimeouts++ - } else { - p.errc = nilErr - test.udp.addpending <- p - time.AfterFunc(randomDuration(60*time.Millisecond), func() { - if !test.udp.handleReply(p.from, p.ptype, nil) { - t.Logf("not matched: %v", p) - } - }) - } - time.Sleep(randomDuration(30 * time.Millisecond)) - } - - // Check that all timeouts were delivered and that the rest got nil errors. - // The replies must be delivered. - var ( - recvDeadline = time.After(20 * time.Second) - nTimeoutsRecv, nNil = 0, 0 - ) - for i := 0; i < nReqs; i++ { - select { - case err := <-timeoutErr: - if err != errTimeout { - t.Fatalf("got non-timeout error on timeoutErr %d: %v", i, err) - } - nTimeoutsRecv++ - case err := <-nilErr: - if err != nil { - t.Fatalf("got non-nil error on nilErr %d: %v", i, err) - } - nNil++ - case <-recvDeadline: - t.Fatalf("exceeded recv deadline") - } - } - if nTimeoutsRecv != nTimeouts { - t.Errorf("wrong number of timeout errors received: got %d, want %d", nTimeoutsRecv, nTimeouts) - } - if nNil != nReqs-nTimeouts { - t.Errorf("wrong number of successful replies: got %d, want %d", nNil, nReqs-nTimeouts) - } -} - -func TestUDP_findnodeTimeout(t *testing.T) { - t.Parallel() - test := newUDPTest(t) - defer test.table.Close() - - toaddr := &net.UDPAddr{IP: net.ParseIP("1.2.3.4"), Port: 2222} - toid := enode.ID{1, 2, 3, 4} - target := encPubkey{4, 5, 6, 7} - result, err := test.udp.findnode(toid, toaddr, target) - if err != errTimeout { - t.Error("expected timeout error, got", err) - } - if len(result) > 0 { - t.Error("expected empty result, got", result) - } -} - -func TestUDP_findnode(t *testing.T) { - test := newUDPTest(t) - defer test.table.Close() - - // put a few nodes into the table. their exact - // distribution shouldn't matter much, although we need to - // take care not to overflow any bucket. - nodes := &nodesByDistance{target: testTarget.id()} - for i := 0; i < bucketSize; i++ { - key := newkey() - n := wrapNode(enode.NewV4(&key.PublicKey, net.IP{10, 13, 0, 1}, 0, i)) - nodes.push(n, bucketSize) - } - test.table.stuff(nodes.entries) - - // ensure there's a bond with the test node, - // findnode won't be accepted otherwise. - remoteID := encodePubkey(&test.remotekey.PublicKey).id() - test.table.db.UpdateLastPongReceived(remoteID, time.Now()) - - // check that closest neighbors are returned. - test.packetIn(nil, findnodePacket, &findnode{Target: testTarget, Expiration: futureExp}) - expected := test.table.closest(testTarget.id(), bucketSize) - - waitNeighbors := func(want []*node) { - test.waitPacketOut(func(p *neighbors) { - if len(p.Nodes) != len(want) { - t.Errorf("wrong number of results: got %d, want %d", len(p.Nodes), bucketSize) - } - for i := range p.Nodes { - if p.Nodes[i].ID.id() != want[i].ID() { - t.Errorf("result mismatch at %d:\n got: %v\n want: %v", i, p.Nodes[i], expected.entries[i]) - } - } - }) - } - waitNeighbors(expected.entries[:maxNeighbors]) - waitNeighbors(expected.entries[maxNeighbors:]) -} - -func TestUDP_findnodeMultiReply(t *testing.T) { - test := newUDPTest(t) - defer test.table.Close() - - rid := enode.PubkeyToIDV4(&test.remotekey.PublicKey) - test.table.db.UpdateLastPingReceived(rid, time.Now()) - - // queue a pending findnode request - resultc, errc := make(chan []*node), make(chan error) - go func() { - rid := encodePubkey(&test.remotekey.PublicKey).id() - ns, err := test.udp.findnode(rid, test.remoteaddr, testTarget) - if err != nil && len(ns) == 0 { - errc <- err - } else { - resultc <- ns - } - }() - - // wait for the findnode to be sent. - // after it is sent, the transport is waiting for a reply - test.waitPacketOut(func(p *findnode) { - if p.Target != testTarget { - t.Errorf("wrong target: got %v, want %v", p.Target, testTarget) - } - }) - - // send the reply as two packets. - list := []*node{ - wrapNode(enode.MustParseV4("enode://ba85011c70bcc5c04d8607d3a0ed29aa6179c092cbdda10d5d32684fb33ed01bd94f588ca8f91ac48318087dcb02eaf36773a7a453f0eedd6742af668097b29c@10.0.1.16:30303?discport=30304")), - wrapNode(enode.MustParseV4("enode://81fa361d25f157cd421c60dcc28d8dac5ef6a89476633339c5df30287474520caca09627da18543d9079b5b288698b542d56167aa5c09111e55acdbbdf2ef799@10.0.1.16:30303")), - wrapNode(enode.MustParseV4("enode://9bffefd833d53fac8e652415f4973bee289e8b1a5c6c4cbe70abf817ce8a64cee11b823b66a987f51aaa9fba0d6a91b3e6bf0d5a5d1042de8e9eeea057b217f8@10.0.1.36:30301?discport=17")), - wrapNode(enode.MustParseV4("enode://1b5b4aa662d7cb44a7221bfba67302590b643028197a7d5214790f3bac7aaa4a3241be9e83c09cf1f6c69d007c634faae3dc1b1221793e8446c0b3a09de65960@10.0.1.16:30303")), - } - rpclist := make([]rpcNode, len(list)) - for i := range list { - rpclist[i] = nodeToRPC(list[i]) - } - test.packetIn(nil, neighborsPacket, &neighbors{Expiration: futureExp, Nodes: rpclist[:2]}) - test.packetIn(nil, neighborsPacket, &neighbors{Expiration: futureExp, Nodes: rpclist[2:]}) - - // check that the sent neighbors are all returned by findnode - select { - case result := <-resultc: - want := append(list[:2], list[3:]...) - if !reflect.DeepEqual(result, want) { - t.Errorf("neighbors mismatch:\n got: %v\n want: %v", result, want) - } - case err := <-errc: - t.Errorf("findnode error: %v", err) - case <-time.After(5 * time.Second): - t.Error("findnode did not return within 5 seconds") - } -} - -func TestUDP_successfulPing(t *testing.T) { - test := newUDPTest(t) - added := make(chan *node, 1) - test.table.nodeAddedHook = func(n *node) { added <- n } - defer test.table.Close() - - // The remote side sends a ping packet to initiate the exchange. - go test.packetIn(nil, pingPacket, &ping{From: testRemote, To: testLocalAnnounced, Version: 4, Expiration: futureExp}) - - // the ping is replied to. - test.waitPacketOut(func(p *pong) { - pinghash := test.sent[0][:macSize] - if !bytes.Equal(p.ReplyTok, pinghash) { - t.Errorf("got pong.ReplyTok %x, want %x", p.ReplyTok, pinghash) - } - wantTo := rpcEndpoint{ - // The mirrored UDP address is the UDP packet sender - IP: test.remoteaddr.IP, UDP: uint16(test.remoteaddr.Port), - // The mirrored TCP port is the one from the ping packet - TCP: testRemote.TCP, - } - if !reflect.DeepEqual(p.To, wantTo) { - t.Errorf("got pong.To %v, want %v", p.To, wantTo) - } - }) - - // remote is unknown, the table pings back. - hash, _ := test.waitPacketOut(func(p *ping) error { - if !reflect.DeepEqual(p.From, test.udp.ourEndpoint()) { - t.Errorf("got ping.From %#v, want %#v", p.From, test.udp.ourEndpoint()) - } - wantTo := rpcEndpoint{ - // The mirrored UDP address is the UDP packet sender. - IP: test.remoteaddr.IP, - UDP: uint16(test.remoteaddr.Port), - TCP: 0, - } - if !reflect.DeepEqual(p.To, wantTo) { - t.Errorf("got ping.To %v, want %v", p.To, wantTo) - } - return nil - }) - test.packetIn(nil, pongPacket, &pong{ReplyTok: hash, Expiration: futureExp}) - - // the node should be added to the table shortly after getting the - // pong packet. - select { - case n := <-added: - rid := encodePubkey(&test.remotekey.PublicKey).id() - if n.ID() != rid { - t.Errorf("node has wrong ID: got %v, want %v", n.ID(), rid) - } - if !n.IP().Equal(test.remoteaddr.IP) { - t.Errorf("node has wrong IP: got %v, want: %v", n.IP(), test.remoteaddr.IP) - } - if int(n.UDP()) != test.remoteaddr.Port { - t.Errorf("node has wrong UDP port: got %v, want: %v", n.UDP(), test.remoteaddr.Port) - } - if n.TCP() != int(testRemote.TCP) { - t.Errorf("node has wrong TCP port: got %v, want: %v", n.TCP(), testRemote.TCP) - } - case <-time.After(2 * time.Second): - t.Errorf("node was not added within 2 seconds") - } -} - -var testPackets = []struct { - input string - wantPacket interface{} -}{ - { - input: "71dbda3a79554728d4f94411e42ee1f8b0d561c10e1e5f5893367948c6a7d70bb87b235fa28a77070271b6c164a2dce8c7e13a5739b53b5e96f2e5acb0e458a02902f5965d55ecbeb2ebb6cabb8b2b232896a36b737666c55265ad0a68412f250001ea04cb847f000001820cfa8215a8d790000000000000000000000000000000018208ae820d058443b9a355", - wantPacket: &ping{ - Version: 4, - From: rpcEndpoint{net.ParseIP("127.0.0.1").To4(), 3322, 5544}, - To: rpcEndpoint{net.ParseIP("::1"), 2222, 3333}, - Expiration: 1136239445, - Rest: []rlp.RawValue{}, - }, - }, - { - input: "e9614ccfd9fc3e74360018522d30e1419a143407ffcce748de3e22116b7e8dc92ff74788c0b6663aaa3d67d641936511c8f8d6ad8698b820a7cf9e1be7155e9a241f556658c55428ec0563514365799a4be2be5a685a80971ddcfa80cb422cdd0101ec04cb847f000001820cfa8215a8d790000000000000000000000000000000018208ae820d058443b9a3550102", - wantPacket: &ping{ - Version: 4, - From: rpcEndpoint{net.ParseIP("127.0.0.1").To4(), 3322, 5544}, - To: rpcEndpoint{net.ParseIP("::1"), 2222, 3333}, - Expiration: 1136239445, - Rest: []rlp.RawValue{{0x01}, {0x02}}, - }, - }, - { - input: "577be4349c4dd26768081f58de4c6f375a7a22f3f7adda654d1428637412c3d7fe917cadc56d4e5e7ffae1dbe3efffb9849feb71b262de37977e7c7a44e677295680e9e38ab26bee2fcbae207fba3ff3d74069a50b902a82c9903ed37cc993c50001f83e82022bd79020010db83c4d001500000000abcdef12820cfa8215a8d79020010db885a308d313198a2e037073488208ae82823a8443b9a355c5010203040531b9019afde696e582a78fa8d95ea13ce3297d4afb8ba6433e4154caa5ac6431af1b80ba76023fa4090c408f6b4bc3701562c031041d4702971d102c9ab7fa5eed4cd6bab8f7af956f7d565ee1917084a95398b6a21eac920fe3dd1345ec0a7ef39367ee69ddf092cbfe5b93e5e568ebc491983c09c76d922dc3", - wantPacket: &ping{ - Version: 555, - From: rpcEndpoint{net.ParseIP("2001:db8:3c4d:15::abcd:ef12"), 3322, 5544}, - To: rpcEndpoint{net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), 2222, 33338}, - Expiration: 1136239445, - Rest: []rlp.RawValue{{0xC5, 0x01, 0x02, 0x03, 0x04, 0x05}}, - }, - }, - { - input: "09b2428d83348d27cdf7064ad9024f526cebc19e4958f0fdad87c15eb598dd61d08423e0bf66b2069869e1724125f820d851c136684082774f870e614d95a2855d000f05d1648b2d5945470bc187c2d2216fbe870f43ed0909009882e176a46b0102f846d79020010db885a308d313198a2e037073488208ae82823aa0fbc914b16819237dcd8801d7e53f69e9719adecb3cc0e790c57e91ca4461c9548443b9a355c6010203c2040506a0c969a58f6f9095004c0177a6b47f451530cab38966a25cca5cb58f055542124e", - wantPacket: &pong{ - To: rpcEndpoint{net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), 2222, 33338}, - ReplyTok: common.Hex2Bytes("fbc914b16819237dcd8801d7e53f69e9719adecb3cc0e790c57e91ca4461c954"), - Expiration: 1136239445, - Rest: []rlp.RawValue{{0xC6, 0x01, 0x02, 0x03, 0xC2, 0x04, 0x05}, {0x06}}, - }, - }, - { - input: "c7c44041b9f7c7e41934417ebac9a8e1a4c6298f74553f2fcfdcae6ed6fe53163eb3d2b52e39fe91831b8a927bf4fc222c3902202027e5e9eb812195f95d20061ef5cd31d502e47ecb61183f74a504fe04c51e73df81f25c4d506b26db4517490103f84eb840ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31387574077f301b421bc84df7266c44e9e6d569fc56be00812904767bf5ccd1fc7f8443b9a35582999983999999280dc62cc8255c73471e0a61da0c89acdc0e035e260add7fc0c04ad9ebf3919644c91cb247affc82b69bd2ca235c71eab8e49737c937a2c396", - wantPacket: &findnode{ - Target: hexEncPubkey("ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31387574077f301b421bc84df7266c44e9e6d569fc56be00812904767bf5ccd1fc7f"), - Expiration: 1136239445, - Rest: []rlp.RawValue{{0x82, 0x99, 0x99}, {0x83, 0x99, 0x99, 0x99}}, - }, - }, - { - input: "c679fc8fe0b8b12f06577f2e802d34f6fa257e6137a995f6f4cbfc9ee50ed3710faf6e66f932c4c8d81d64343f429651328758b47d3dbc02c4042f0fff6946a50f4a49037a72bb550f3a7872363a83e1b9ee6469856c24eb4ef80b7535bcf99c0004f9015bf90150f84d846321163782115c82115db8403155e1427f85f10a5c9a7755877748041af1bcd8d474ec065eb33df57a97babf54bfd2103575fa829115d224c523596b401065a97f74010610fce76382c0bf32f84984010203040101b840312c55512422cf9b8a4097e9a6ad79402e87a15ae909a4bfefa22398f03d20951933beea1e4dfa6f968212385e829f04c2d314fc2d4e255e0d3bc08792b069dbf8599020010db83c4d001500000000abcdef12820d05820d05b84038643200b172dcfef857492156971f0e6aa2c538d8b74010f8e140811d53b98c765dd2d96126051913f44582e8c199ad7c6d6819e9a56483f637feaac9448aacf8599020010db885a308d313198a2e037073488203e78203e8b8408dcab8618c3253b558d459da53bd8fa68935a719aff8b811197101a4b2b47dd2d47295286fc00cc081bb542d760717d1bdd6bec2c37cd72eca367d6dd3b9df738443b9a355010203b525a138aa34383fec3d2719a0", - wantPacket: &neighbors{ - Nodes: []rpcNode{ - { - ID: hexEncPubkey("3155e1427f85f10a5c9a7755877748041af1bcd8d474ec065eb33df57a97babf54bfd2103575fa829115d224c523596b401065a97f74010610fce76382c0bf32"), - IP: net.ParseIP("99.33.22.55").To4(), - UDP: 4444, - TCP: 4445, - }, - { - ID: hexEncPubkey("312c55512422cf9b8a4097e9a6ad79402e87a15ae909a4bfefa22398f03d20951933beea1e4dfa6f968212385e829f04c2d314fc2d4e255e0d3bc08792b069db"), - IP: net.ParseIP("1.2.3.4").To4(), - UDP: 1, - TCP: 1, - }, - { - ID: hexEncPubkey("38643200b172dcfef857492156971f0e6aa2c538d8b74010f8e140811d53b98c765dd2d96126051913f44582e8c199ad7c6d6819e9a56483f637feaac9448aac"), - IP: net.ParseIP("2001:db8:3c4d:15::abcd:ef12"), - UDP: 3333, - TCP: 3333, - }, - { - ID: hexEncPubkey("8dcab8618c3253b558d459da53bd8fa68935a719aff8b811197101a4b2b47dd2d47295286fc00cc081bb542d760717d1bdd6bec2c37cd72eca367d6dd3b9df73"), - IP: net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), - UDP: 999, - TCP: 1000, - }, - }, - Expiration: 1136239445, - Rest: []rlp.RawValue{{0x01}, {0x02}, {0x03}}, - }, - }, -} - -func TestForwardCompatibility(t *testing.T) { - testkey, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - wantNodeKey := encodePubkey(&testkey.PublicKey) - - for _, test := range testPackets { - input, err := hex.DecodeString(test.input) - if err != nil { - t.Fatalf("invalid hex: %s", test.input) - } - packet, nodekey, _, err := decodePacket(input) - if err != nil { - t.Errorf("did not accept packet %s\n%v", test.input, err) - continue - } - if !reflect.DeepEqual(packet, test.wantPacket) { - t.Errorf("got %s\nwant %s", spew.Sdump(packet), spew.Sdump(test.wantPacket)) - } - if nodekey != wantNodeKey { - t.Errorf("got id %v\nwant id %v", nodekey, wantNodeKey) - } - } -} - -// dgramPipe is a fake UDP socket. It queues all sent datagrams. -type dgramPipe struct { - mu *sync.Mutex - cond *sync.Cond - closing chan struct{} - closed bool - queue [][]byte -} - -func newpipe() *dgramPipe { - mu := new(sync.Mutex) - return &dgramPipe{ - closing: make(chan struct{}), - cond: &sync.Cond{L: mu}, - mu: mu, - } -} - -// WriteToUDP queues a datagram. -func (c *dgramPipe) WriteToUDP(b []byte, to *net.UDPAddr) (n int, err error) { - msg := make([]byte, len(b)) - copy(msg, b) - c.mu.Lock() - defer c.mu.Unlock() - if c.closed { - return 0, errors.New("closed") - } - c.queue = append(c.queue, msg) - c.cond.Signal() - return len(b), nil -} - -// ReadFromUDP just hangs until the pipe is closed. -func (c *dgramPipe) ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) { - <-c.closing - return 0, nil, io.EOF -} - -func (c *dgramPipe) Close() error { - c.mu.Lock() - defer c.mu.Unlock() - if !c.closed { - close(c.closing) - c.closed = true - } - return nil -} - -func (c *dgramPipe) LocalAddr() net.Addr { - return &net.UDPAddr{IP: testLocal.IP, Port: int(testLocal.UDP)} -} - -func (c *dgramPipe) waitPacketOut() []byte { - c.mu.Lock() - defer c.mu.Unlock() - for len(c.queue) == 0 { - c.cond.Wait() - } - p := c.queue[0] - copy(c.queue, c.queue[1:]) - c.queue = c.queue[:len(c.queue)-1] - return p -} diff --git a/p2p/discover/v4_lookup_test.go b/p2p/discover/v4_lookup_test.go new file mode 100644 index 000000000000..9b4042c5a276 --- /dev/null +++ b/p2p/discover/v4_lookup_test.go @@ -0,0 +1,312 @@ +// Copyright 2019 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 discover + +import ( + "crypto/ecdsa" + "fmt" + "net" + "sort" + "testing" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/enode" +) + +func TestUDPv4_Lookup(t *testing.T) { + t.Parallel() + test := newUDPTest(t) + + // Lookup on empty table returns no nodes. + targetKey, _ := decodePubkey(lookupTestnet.target) + if results := test.udp.LookupPubkey(targetKey); len(results) > 0 { + t.Fatalf("lookup on empty table returned %d results: %#v", len(results), results) + } + + // Seed table with initial node. + fillTable(test.table, []*node{wrapNode(lookupTestnet.node(256, 0))}) + + // Start the lookup. + resultC := make(chan []*enode.Node, 1) + go func() { + resultC <- test.udp.LookupPubkey(targetKey) + test.close() + }() + + // Answer lookup packets. + serveTestnet(test, lookupTestnet) + + // Verify result nodes. + results := <-resultC + t.Logf("results:") + for _, e := range results { + t.Logf(" ld=%d, %x", enode.LogDist(lookupTestnet.target.id(), e.ID()), e.ID().Bytes()) + } + if len(results) != bucketSize { + t.Errorf("wrong number of results: got %d, want %d", len(results), bucketSize) + } + if hasDuplicates(wrapNodes(results)) { + t.Errorf("result set contains duplicate entries") + } + if !sortedByDistanceTo(lookupTestnet.target.id(), wrapNodes(results)) { + t.Errorf("result set not sorted by distance to target") + } + if err := checkNodesEqual(results, lookupTestnet.closest(bucketSize)); err != nil { + t.Errorf("results aren't the closest %d nodes\n%v", bucketSize, err) + } +} + +func TestUDPv4_LookupIterator(t *testing.T) { + t.Parallel() + test := newUDPTest(t) + defer test.close() + + // Seed table with initial nodes. + bootnodes := make([]*node, len(lookupTestnet.dists[256])) + for i := range lookupTestnet.dists[256] { + bootnodes[i] = wrapNode(lookupTestnet.node(256, i)) + } + fillTable(test.table, bootnodes) + go serveTestnet(test, lookupTestnet) + + // Create the iterator and collect the nodes it yields. + iter := test.udp.RandomNodes() + seen := make(map[enode.ID]*enode.Node) + for limit := lookupTestnet.len(); iter.Next() && len(seen) < limit; { + seen[iter.Node().ID()] = iter.Node() + } + iter.Close() + + // Check that all nodes in lookupTestnet were seen by the iterator. + results := make([]*enode.Node, 0, len(seen)) + for _, n := range seen { + results = append(results, n) + } + sortByID(results) + want := lookupTestnet.nodes() + if err := checkNodesEqual(results, want); err != nil { + t.Fatal(err) + } +} + +// TestUDPv4_LookupIteratorClose checks that lookupIterator ends when its Close +// method is called. +func TestUDPv4_LookupIteratorClose(t *testing.T) { + t.Parallel() + test := newUDPTest(t) + defer test.close() + + // Seed table with initial nodes. + bootnodes := make([]*node, len(lookupTestnet.dists[256])) + for i := range lookupTestnet.dists[256] { + bootnodes[i] = wrapNode(lookupTestnet.node(256, i)) + } + fillTable(test.table, bootnodes) + go serveTestnet(test, lookupTestnet) + + it := test.udp.RandomNodes() + if ok := it.Next(); !ok || it.Node() == nil { + t.Fatalf("iterator didn't return any node") + } + + it.Close() + + ncalls := 0 + for ; ncalls < 100 && it.Next(); ncalls++ { + if it.Node() == nil { + t.Error("iterator returned Node() == nil node after Next() == true") + } + } + t.Logf("iterator returned %d nodes after close", ncalls) + if it.Next() { + t.Errorf("Next() == true after close and %d more calls", ncalls) + } + if n := it.Node(); n != nil { + t.Errorf("iterator returned non-nil node after close and %d more calls", ncalls) + } +} + +func serveTestnet(test *udpTest, testnet *preminedTestnet) { + for done := false; !done; { + done = test.waitPacketOut(func(p packetV4, to *net.UDPAddr, hash []byte) { + n, key := testnet.nodeByAddr(to) + switch p.(type) { + case *pingV4: + test.packetInFrom(nil, key, to, &pongV4{Expiration: futureExp, ReplyTok: hash}) + case *findnodeV4: + dist := enode.LogDist(n.ID(), testnet.target.id()) + nodes := testnet.nodesAtDistance(dist - 1) + test.packetInFrom(nil, key, to, &neighborsV4{Expiration: futureExp, Nodes: nodes}) + } + }) + } +} + +// This is the test network for the Lookup test. +// The nodes were obtained by running lookupTestnet.mine with a random NodeID as target. +var lookupTestnet = &preminedTestnet{ + target: hexEncPubkey("5d485bdcbe9bc89314a10ae9231e429d33853e3a8fa2af39f5f827370a2e4185e344ace5d16237491dad41f278f1d3785210d29ace76cd627b9147ee340b1125"), + dists: [257][]*ecdsa.PrivateKey{ + 251: { + hexEncPrivkey("29738ba0c1a4397d6a65f292eee07f02df8e58d41594ba2be3cf84ce0fc58169"), + hexEncPrivkey("511b1686e4e58a917f7f848e9bf5539d206a68f5ad6b54b552c2399fe7d174ae"), + hexEncPrivkey("d09e5eaeec0fd596236faed210e55ef45112409a5aa7f3276d26646080dcfaeb"), + hexEncPrivkey("c1e20dbbf0d530e50573bd0a260b32ec15eb9190032b4633d44834afc8afe578"), + hexEncPrivkey("ed5f38f5702d92d306143e5d9154fb21819777da39af325ea359f453d179e80b"), + }, + 252: { + hexEncPrivkey("1c9b1cafbec00848d2c174b858219914b42a7d5c9359b1ca03fd650e8239ae94"), + hexEncPrivkey("e0e1e8db4a6f13c1ffdd3e96b72fa7012293ced187c9dcdcb9ba2af37a46fa10"), + hexEncPrivkey("3d53823e0a0295cb09f3e11d16c1b44d07dd37cec6f739b8df3a590189fe9fb9"), + }, + 253: { + hexEncPrivkey("2d0511ae9bf590166597eeab86b6f27b1ab761761eaea8965487b162f8703847"), + hexEncPrivkey("6cfbd7b8503073fc3dbdb746a7c672571648d3bd15197ccf7f7fef3d904f53a2"), + hexEncPrivkey("a30599b12827b69120633f15b98a7f6bc9fc2e9a0fd6ae2ebb767c0e64d743ab"), + hexEncPrivkey("14a98db9b46a831d67eff29f3b85b1b485bb12ae9796aea98d91be3dc78d8a91"), + hexEncPrivkey("2369ff1fc1ff8ca7d20b17e2673adc3365c3674377f21c5d9dafaff21fe12e24"), + hexEncPrivkey("9ae91101d6b5048607f41ec0f690ef5d09507928aded2410aabd9237aa2727d7"), + hexEncPrivkey("05e3c59090a3fd1ae697c09c574a36fcf9bedd0afa8fe3946f21117319ca4973"), + hexEncPrivkey("06f31c5ea632658f718a91a1b1b9ae4b7549d7b3bc61cbc2be5f4a439039f3ad"), + }, + 254: { + hexEncPrivkey("dec742079ec00ff4ec1284d7905bc3de2366f67a0769431fd16f80fd68c58a7c"), + hexEncPrivkey("ff02c8861fa12fbd129d2a95ea663492ef9c1e51de19dcfbbfe1c59894a28d2b"), + hexEncPrivkey("4dded9e4eefcbce4262be4fd9e8a773670ab0b5f448f286ec97dfc8cf681444a"), + hexEncPrivkey("750d931e2a8baa2c9268cb46b7cd851f4198018bed22f4dceb09dd334a2395f6"), + hexEncPrivkey("ce1435a956a98ffec484cd11489c4f165cf1606819ab6b521cee440f0c677e9e"), + hexEncPrivkey("996e7f8d1638be92d7328b4770f47e5420fc4bafecb4324fd33b1f5d9f403a75"), + hexEncPrivkey("ebdc44e77a6cc0eb622e58cf3bb903c3da4c91ca75b447b0168505d8fc308b9c"), + hexEncPrivkey("46bd1eddcf6431bea66fc19ebc45df191c1c7d6ed552dcdc7392885009c322f0"), + }, + 255: { + hexEncPrivkey("da8645f90826e57228d9ea72aff84500060ad111a5d62e4af831ed8e4b5acfb8"), + hexEncPrivkey("3c944c5d9af51d4c1d43f5d0f3a1a7ef65d5e82744d669b58b5fed242941a566"), + hexEncPrivkey("5ebcde76f1d579eebf6e43b0ffe9157e65ffaa391175d5b9aa988f47df3e33da"), + hexEncPrivkey("97f78253a7d1d796e4eaabce721febcc4550dd68fb11cc818378ba807a2cb7de"), + hexEncPrivkey("a38cd7dc9b4079d1c0406afd0fdb1165c285f2c44f946eca96fc67772c988c7d"), + hexEncPrivkey("d64cbb3ffdf712c372b7a22a176308ef8f91861398d5dbaf326fd89c6eaeef1c"), + hexEncPrivkey("d269609743ef29d6446e3355ec647e38d919c82a4eb5837e442efd7f4218944f"), + hexEncPrivkey("d8f7bcc4a530efde1d143717007179e0d9ace405ddaaf151c4d863753b7fd64c"), + }, + 256: { + hexEncPrivkey("8c5b422155d33ea8e9d46f71d1ad3e7b24cb40051413ffa1a81cff613d243ba9"), + hexEncPrivkey("937b1af801def4e8f5a3a8bd225a8bcff1db764e41d3e177f2e9376e8dd87233"), + hexEncPrivkey("120260dce739b6f71f171da6f65bc361b5fad51db74cf02d3e973347819a6518"), + hexEncPrivkey("1fa56cf25d4b46c2bf94e82355aa631717b63190785ac6bae545a88aadc304a9"), + hexEncPrivkey("3c38c503c0376f9b4adcbe935d5f4b890391741c764f61b03cd4d0d42deae002"), + hexEncPrivkey("3a54af3e9fa162bc8623cdf3e5d9b70bf30ade1d54cc3abea8659aba6cff471f"), + hexEncPrivkey("6799a02ea1999aefdcbcc4d3ff9544478be7365a328d0d0f37c26bd95ade0cda"), + hexEncPrivkey("e24a7bc9051058f918646b0f6e3d16884b2a55a15553b89bab910d55ebc36116"), + }, + }, +} + +type preminedTestnet struct { + target encPubkey + dists [hashBits + 1][]*ecdsa.PrivateKey +} + +func (tn *preminedTestnet) len() int { + n := 0 + for _, keys := range tn.dists { + n += len(keys) + } + return n +} + +func (tn *preminedTestnet) nodes() []*enode.Node { + result := make([]*enode.Node, 0, tn.len()) + for dist, keys := range tn.dists { + for index := range keys { + result = append(result, tn.node(dist, index)) + } + } + sortByID(result) + return result +} + +func (tn *preminedTestnet) node(dist, index int) *enode.Node { + key := tn.dists[dist][index] + ip := net.IP{127, byte(dist >> 8), byte(dist), byte(index)} + return enode.NewV4(&key.PublicKey, ip, 0, 5000) +} + +func (tn *preminedTestnet) nodeByAddr(addr *net.UDPAddr) (*enode.Node, *ecdsa.PrivateKey) { + dist := int(addr.IP[1])<<8 + int(addr.IP[2]) + index := int(addr.IP[3]) + key := tn.dists[dist][index] + return tn.node(dist, index), key +} + +func (tn *preminedTestnet) nodesAtDistance(dist int) []rpcNode { + result := make([]rpcNode, len(tn.dists[dist])) + for i := range result { + result[i] = nodeToRPC(wrapNode(tn.node(dist, i))) + } + return result +} + +func (tn *preminedTestnet) closest(n int) (nodes []*enode.Node) { + for d := range tn.dists { + for i := range tn.dists[d] { + nodes = append(nodes, tn.node(d, i)) + } + } + sort.Slice(nodes, func(i, j int) bool { + return enode.DistCmp(tn.target.id(), nodes[i].ID(), nodes[j].ID()) < 0 + }) + return nodes[:n] +} + +var _ = (*preminedTestnet).mine // avoid linter warning about mine being dead code. + +// mine generates a testnet struct literal with nodes at +// various distances to the network's target. +func (tn *preminedTestnet) mine() { + // Clear existing slices first (useful when re-mining). + for i := range tn.dists { + tn.dists[i] = nil + } + + targetSha := tn.target.id() + found, need := 0, 40 + for found < need { + k := newkey() + ld := enode.LogDist(targetSha, encodePubkey(&k.PublicKey).id()) + if len(tn.dists[ld]) < 8 { + tn.dists[ld] = append(tn.dists[ld], k) + found++ + fmt.Printf("found ID with ld %d (%d/%d)\n", ld, found, need) + } + } + fmt.Printf("&preminedTestnet{\n") + fmt.Printf(" target: hexEncPubkey(\"%x\"),\n", tn.target[:]) + fmt.Printf(" dists: [%d][]*ecdsa.PrivateKey{\n", len(tn.dists)) + for ld, ns := range tn.dists { + if len(ns) == 0 { + continue + } + fmt.Printf(" %d: {\n", ld) + for _, key := range ns { + fmt.Printf(" hexEncPrivkey(\"%x\"),\n", crypto.FromECDSA(key)) + } + fmt.Printf(" },\n") + } + fmt.Printf(" },\n") + fmt.Printf("}\n") +} diff --git a/p2p/discover/v4_udp.go b/p2p/discover/v4_udp.go new file mode 100644 index 000000000000..bfb66fcb1967 --- /dev/null +++ b/p2p/discover/v4_udp.go @@ -0,0 +1,968 @@ +// Copyright 2019 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 discover + +import ( + "bytes" + "container/list" + "context" + "crypto/ecdsa" + crand "crypto/rand" + "errors" + "fmt" + "io" + "net" + "sync" + "time" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/p2p/netutil" + "github.com/ethereum/go-ethereum/rlp" +) + +// Errors +var ( + errPacketTooSmall = errors.New("too small") + errBadHash = errors.New("bad hash") + errExpired = errors.New("expired") + errUnsolicitedReply = errors.New("unsolicited reply") + errUnknownNode = errors.New("unknown node") + errTimeout = errors.New("RPC timeout") + errClockWarp = errors.New("reply deadline too far in the future") + errClosed = errors.New("socket closed") +) + +const ( + respTimeout = 500 * time.Millisecond + expiration = 20 * time.Second + bondExpiration = 24 * time.Hour + + maxFindnodeFailures = 5 // nodes exceeding this limit are dropped + ntpFailureThreshold = 32 // Continuous timeouts after which to check NTP + ntpWarningCooldown = 10 * time.Minute // Minimum amount of time to pass before repeating NTP warning + driftThreshold = 10 * time.Second // Allowed clock drift before warning user + + // Discovery packets are defined to be no larger than 1280 bytes. + // Packets larger than this size will be cut at the end and treated + // as invalid because their hash won't match. + maxPacketSize = 1280 +) + +// RPC packet types +const ( + p_pingV4 = iota + 1 // zero is 'reserved' + p_pongV4 + p_findnodeV4 + p_neighborsV4 + p_enrRequestV4 + p_enrResponseV4 +) + +// RPC request structures +type ( + pingV4 struct { + senderKey *ecdsa.PublicKey // filled in by preverify + + Version uint + From, To rpcEndpoint + Expiration uint64 + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` + } + + // pongV4 is the reply to pingV4. + pongV4 struct { + // This field should mirror the UDP envelope address + // of the ping packet, which provides a way to discover the + // the external address (after NAT). + To rpcEndpoint + + ReplyTok []byte // This contains the hash of the ping packet. + Expiration uint64 // Absolute timestamp at which the packet becomes invalid. + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` + } + + // findnodeV4 is a query for nodes close to the given target. + findnodeV4 struct { + Target encPubkey + Expiration uint64 + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` + } + + // neighborsV4 is the reply to findnodeV4. + neighborsV4 struct { + Nodes []rpcNode + Expiration uint64 + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` + } + + // enrRequestV4 queries for the remote node's record. + enrRequestV4 struct { + Expiration uint64 + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` + } + + // enrResponseV4 is the reply to enrRequestV4. + enrResponseV4 struct { + ReplyTok []byte // Hash of the enrRequest packet. + Record enr.Record + // Ignore additional fields (for forward compatibility). + Rest []rlp.RawValue `rlp:"tail"` + } + + rpcNode struct { + IP net.IP // len 4 for IPv4 or 16 for IPv6 + UDP uint16 // for discovery protocol + TCP uint16 // for RLPx protocol + ID encPubkey + } + + rpcEndpoint struct { + IP net.IP // len 4 for IPv4 or 16 for IPv6 + UDP uint16 // for discovery protocol + TCP uint16 // for RLPx protocol + } +) + +// packetV4 is implemented by all v4 protocol messages. +type packetV4 interface { + // preverify checks whether the packet is valid and should be handled at all. + preverify(t *UDPv4, from *net.UDPAddr, fromID enode.ID, fromKey encPubkey) error + // handle handles the packet. + handle(t *UDPv4, from *net.UDPAddr, fromID enode.ID, mac []byte) + // packet name and type for logging purposes. + name() string + kind() byte +} + +func makeEndpoint(addr *net.UDPAddr, tcpPort uint16) rpcEndpoint { + ip := net.IP{} + if ip4 := addr.IP.To4(); ip4 != nil { + ip = ip4 + } else if ip6 := addr.IP.To16(); ip6 != nil { + ip = ip6 + } + return rpcEndpoint{IP: ip, UDP: uint16(addr.Port), TCP: tcpPort} +} + +func (t *UDPv4) nodeFromRPC(sender *net.UDPAddr, rn rpcNode) (*node, error) { + if rn.UDP <= 1024 { + return nil, errors.New("low port") + } + if err := netutil.CheckRelayIP(sender.IP, rn.IP); err != nil { + return nil, err + } + if t.netrestrict != nil && !t.netrestrict.Contains(rn.IP) { + return nil, errors.New("not contained in netrestrict whitelist") + } + key, err := decodePubkey(rn.ID) + if err != nil { + return nil, err + } + n := wrapNode(enode.NewV4(key, rn.IP, int(rn.TCP), int(rn.UDP))) + err = n.ValidateComplete() + return n, err +} + +func nodeToRPC(n *node) rpcNode { + var key ecdsa.PublicKey + var ekey encPubkey + if err := n.Load((*enode.Secp256k1)(&key)); err == nil { + ekey = encodePubkey(&key) + } + return rpcNode{ID: ekey, IP: n.IP(), UDP: uint16(n.UDP()), TCP: uint16(n.TCP())} +} + +// UDPv4 implements the v4 wire protocol. +type UDPv4 struct { + conn UDPConn + log log.Logger + netrestrict *netutil.Netlist + priv *ecdsa.PrivateKey + localNode *enode.LocalNode + db *enode.DB + tab *Table + closeOnce sync.Once + wg sync.WaitGroup + + addReplyMatcher chan *replyMatcher + gotreply chan reply + closeCtx context.Context + cancelCloseCtx func() +} + +// replyMatcher represents a pending reply. +// +// Some implementations of the protocol wish to send more than one +// reply packet to findnode. In general, any neighbors packet cannot +// be matched up with a specific findnode packet. +// +// Our implementation handles this by storing a callback function for +// each pending reply. Incoming packets from a node are dispatched +// to all callback functions for that node. +type replyMatcher struct { + // these fields must match in the reply. + from enode.ID + ip net.IP + ptype byte + + // time when the request must complete + deadline time.Time + + // callback is called when a matching reply arrives. If it returns matched == true, the + // reply was acceptable. The second return value indicates whether the callback should + // be removed from the pending reply queue. If it returns false, the reply is considered + // incomplete and the callback will be invoked again for the next matching reply. + callback replyMatchFunc + + // errc receives nil when the callback indicates completion or an + // error if no further reply is received within the timeout. + errc chan error + + // reply contains the most recent reply. This field is safe for reading after errc has + // received a value. + reply packetV4 +} + +type replyMatchFunc func(interface{}) (matched bool, requestDone bool) + +// reply is a reply packet from a certain node. +type reply struct { + from enode.ID + ip net.IP + data packetV4 + // loop indicates whether there was + // a matching request by sending on this channel. + matched chan<- bool +} + +func ListenV4(c UDPConn, ln *enode.LocalNode, cfg Config) (*UDPv4, error) { + closeCtx, cancel := context.WithCancel(context.Background()) + t := &UDPv4{ + conn: c, + priv: cfg.PrivateKey, + netrestrict: cfg.NetRestrict, + localNode: ln, + db: ln.Database(), + gotreply: make(chan reply), + addReplyMatcher: make(chan *replyMatcher), + closeCtx: closeCtx, + cancelCloseCtx: cancel, + log: cfg.Log, + } + if t.log == nil { + t.log = log.Root() + } + + tab, err := newTable(t, ln.Database(), cfg.Bootnodes, t.log) + if err != nil { + return nil, err + } + t.tab = tab + go tab.loop() + + t.wg.Add(2) + go t.loop() + go t.readLoop(cfg.Unhandled) + return t, nil +} + +// Self returns the local node. +func (t *UDPv4) Self() *enode.Node { + return t.localNode.Node() +} + +// Close shuts down the socket and aborts any running queries. +func (t *UDPv4) Close() { + t.closeOnce.Do(func() { + t.cancelCloseCtx() + t.conn.Close() + t.wg.Wait() + t.tab.close() + }) +} + +// Resolve searches for a specific node with the given ID and tries to get the most recent +// version of the node record for it. It returns n if the node could not be resolved. +func (t *UDPv4) Resolve(n *enode.Node) *enode.Node { + // Try asking directly. This works if the node is still responding on the endpoint we have. + if rn, err := t.RequestENR(n); err == nil { + return rn + } + // Check table for the ID, we might have a newer version there. + if intable := t.tab.getNode(n.ID()); intable != nil && intable.Seq() > n.Seq() { + n = intable + if rn, err := t.RequestENR(n); err == nil { + return rn + } + } + // Otherwise perform a network lookup. + var key enode.Secp256k1 + if n.Load(&key) != nil { + return n // no secp256k1 key + } + result := t.LookupPubkey((*ecdsa.PublicKey)(&key)) + for _, rn := range result { + if rn.ID() == n.ID() { + if rn, err := t.RequestENR(rn); err == nil { + return rn + } + } + } + return n +} + +func (t *UDPv4) ourEndpoint() rpcEndpoint { + n := t.Self() + a := &net.UDPAddr{IP: n.IP(), Port: n.UDP()} + return makeEndpoint(a, uint16(n.TCP())) +} + +// Ping sends a ping message to the given node. +func (t *UDPv4) Ping(n *enode.Node) error { + _, err := t.ping(n) + return err +} + +// ping sends a ping message to the given node and waits for a reply. +func (t *UDPv4) ping(n *enode.Node) (seq uint64, err error) { + rm := t.sendPing(n.ID(), &net.UDPAddr{IP: n.IP(), Port: n.UDP()}, nil) + if err = <-rm.errc; err == nil { + seq = seqFromTail(rm.reply.(*pongV4).Rest) + } + return seq, err +} + +// sendPing sends a ping message to the given node and invokes the callback +// when the reply arrives. +func (t *UDPv4) sendPing(toid enode.ID, toaddr *net.UDPAddr, callback func()) *replyMatcher { + req := t.makePing(toaddr) + packet, hash, err := t.encode(t.priv, req) + if err != nil { + errc := make(chan error, 1) + errc <- err + return &replyMatcher{errc: errc} + } + // Add a matcher for the reply to the pending reply queue. Pongs are matched if they + // reference the ping we're about to send. + rm := t.pending(toid, toaddr.IP, p_pongV4, func(p interface{}) (matched bool, requestDone bool) { + matched = bytes.Equal(p.(*pongV4).ReplyTok, hash) + if matched && callback != nil { + callback() + } + return matched, matched + }) + // Send the packet. + t.localNode.UDPContact(toaddr) + t.write(toaddr, toid, req.name(), packet) + return rm +} + +func (t *UDPv4) makePing(toaddr *net.UDPAddr) *pingV4 { + seq, _ := rlp.EncodeToBytes(t.localNode.Node().Seq()) + return &pingV4{ + Version: 4, + From: t.ourEndpoint(), + To: makeEndpoint(toaddr, 0), + Expiration: uint64(time.Now().Add(expiration).Unix()), + Rest: []rlp.RawValue{seq}, + } +} + +// LookupPubkey finds the closest nodes to the given public key. +func (t *UDPv4) LookupPubkey(key *ecdsa.PublicKey) []*enode.Node { + if t.tab.len() == 0 { + // All nodes were dropped, refresh. The very first query will hit this + // case and run the bootstrapping logic. + <-t.tab.refresh() + } + return t.newLookup(t.closeCtx, encodePubkey(key)).run() +} + +// RandomNodes is an iterator yielding nodes from a random walk of the DHT. +func (t *UDPv4) RandomNodes() enode.Iterator { + return newLookupIterator(t.closeCtx, t.newRandomLookup) +} + +// lookupRandom implements transport. +func (t *UDPv4) lookupRandom() []*enode.Node { + return t.newRandomLookup(t.closeCtx).run() +} + +// lookupSelf implements transport. +func (t *UDPv4) lookupSelf() []*enode.Node { + return t.newLookup(t.closeCtx, encodePubkey(&t.priv.PublicKey)).run() +} + +func (t *UDPv4) newRandomLookup(ctx context.Context) *lookup { + var target encPubkey + crand.Read(target[:]) + return t.newLookup(ctx, target) +} + +func (t *UDPv4) newLookup(ctx context.Context, targetKey encPubkey) *lookup { + target := enode.ID(crypto.Keccak256Hash(targetKey[:])) + it := newLookup(ctx, t.tab, target, func(n *node) ([]*node, error) { + return t.findnode(n.ID(), n.addr(), targetKey) + }) + return it +} + +// findnode sends a findnode request to the given node and waits until +// the node has sent up to k neighbors. +func (t *UDPv4) findnode(toid enode.ID, toaddr *net.UDPAddr, target encPubkey) ([]*node, error) { + t.ensureBond(toid, toaddr) + + // Add a matcher for 'neighbours' replies to the pending reply queue. The matcher is + // active until enough nodes have been received. + nodes := make([]*node, 0, bucketSize) + nreceived := 0 + rm := t.pending(toid, toaddr.IP, p_neighborsV4, func(r interface{}) (matched bool, requestDone bool) { + reply := r.(*neighborsV4) + for _, rn := range reply.Nodes { + nreceived++ + n, err := t.nodeFromRPC(toaddr, rn) + if err != nil { + t.log.Trace("Invalid neighbor node received", "ip", rn.IP, "addr", toaddr, "err", err) + continue + } + nodes = append(nodes, n) + } + return true, nreceived >= bucketSize + }) + t.send(toaddr, toid, &findnodeV4{ + Target: target, + Expiration: uint64(time.Now().Add(expiration).Unix()), + }) + return nodes, <-rm.errc +} + +// RequestENR sends enrRequest to the given node and waits for a response. +func (t *UDPv4) RequestENR(n *enode.Node) (*enode.Node, error) { + addr := &net.UDPAddr{IP: n.IP(), Port: n.UDP()} + t.ensureBond(n.ID(), addr) + + req := &enrRequestV4{ + Expiration: uint64(time.Now().Add(expiration).Unix()), + } + packet, hash, err := t.encode(t.priv, req) + if err != nil { + return nil, err + } + // Add a matcher for the reply to the pending reply queue. Responses are matched if + // they reference the request we're about to send. + rm := t.pending(n.ID(), addr.IP, p_enrResponseV4, func(r interface{}) (matched bool, requestDone bool) { + matched = bytes.Equal(r.(*enrResponseV4).ReplyTok, hash) + return matched, matched + }) + // Send the packet and wait for the reply. + t.write(addr, n.ID(), req.name(), packet) + if err := <-rm.errc; err != nil { + return nil, err + } + // Verify the response record. + respN, err := enode.New(enode.ValidSchemes, &rm.reply.(*enrResponseV4).Record) + if err != nil { + return nil, err + } + if respN.ID() != n.ID() { + return nil, fmt.Errorf("invalid ID in response record") + } + if respN.Seq() < n.Seq() { + return n, nil // response record is older + } + if err := netutil.CheckRelayIP(addr.IP, respN.IP()); err != nil { + return nil, fmt.Errorf("invalid IP in response record: %v", err) + } + return respN, nil +} + +// pending adds a reply matcher to the pending reply queue. +// see the documentation of type replyMatcher for a detailed explanation. +func (t *UDPv4) pending(id enode.ID, ip net.IP, ptype byte, callback replyMatchFunc) *replyMatcher { + ch := make(chan error, 1) + p := &replyMatcher{from: id, ip: ip, ptype: ptype, callback: callback, errc: ch} + select { + case t.addReplyMatcher <- p: + // loop will handle it + case <-t.closeCtx.Done(): + ch <- errClosed + } + return p +} + +// handleReply dispatches a reply packet, invoking reply matchers. It returns +// whether any matcher considered the packet acceptable. +func (t *UDPv4) handleReply(from enode.ID, fromIP net.IP, req packetV4) bool { + matched := make(chan bool, 1) + select { + case t.gotreply <- reply{from, fromIP, req, matched}: + // loop will handle it + return <-matched + case <-t.closeCtx.Done(): + return false + } +} + +// loop runs in its own goroutine. it keeps track of +// the refresh timer and the pending reply queue. +func (t *UDPv4) loop() { + defer t.wg.Done() + + var ( + plist = list.New() + timeout = time.NewTimer(0) + nextTimeout *replyMatcher // head of plist when timeout was last reset + contTimeouts = 0 // number of continuous timeouts to do NTP checks + ntpWarnTime = time.Unix(0, 0) + ) + <-timeout.C // ignore first timeout + defer timeout.Stop() + + resetTimeout := func() { + if plist.Front() == nil || nextTimeout == plist.Front().Value { + return + } + // Start the timer so it fires when the next pending reply has expired. + now := time.Now() + for el := plist.Front(); el != nil; el = el.Next() { + nextTimeout = el.Value.(*replyMatcher) + if dist := nextTimeout.deadline.Sub(now); dist < 2*respTimeout { + timeout.Reset(dist) + return + } + // Remove pending replies whose deadline is too far in the + // future. These can occur if the system clock jumped + // backwards after the deadline was assigned. + nextTimeout.errc <- errClockWarp + plist.Remove(el) + } + nextTimeout = nil + timeout.Stop() + } + + for { + resetTimeout() + + select { + case <-t.closeCtx.Done(): + for el := plist.Front(); el != nil; el = el.Next() { + el.Value.(*replyMatcher).errc <- errClosed + } + return + + case p := <-t.addReplyMatcher: + p.deadline = time.Now().Add(respTimeout) + plist.PushBack(p) + + case r := <-t.gotreply: + var matched bool // whether any replyMatcher considered the reply acceptable. + for el := plist.Front(); el != nil; el = el.Next() { + p := el.Value.(*replyMatcher) + if p.from == r.from && p.ptype == r.data.kind() && p.ip.Equal(r.ip) { + ok, requestDone := p.callback(r.data) + matched = matched || ok + // Remove the matcher if callback indicates that all replies have been received. + if requestDone { + p.reply = r.data + p.errc <- nil + plist.Remove(el) + } + // Reset the continuous timeout counter (time drift detection) + contTimeouts = 0 + } + } + r.matched <- matched + + case now := <-timeout.C: + nextTimeout = nil + + // Notify and remove callbacks whose deadline is in the past. + for el := plist.Front(); el != nil; el = el.Next() { + p := el.Value.(*replyMatcher) + if now.After(p.deadline) || now.Equal(p.deadline) { + p.errc <- errTimeout + plist.Remove(el) + contTimeouts++ + } + } + // If we've accumulated too many timeouts, do an NTP time sync check + if contTimeouts > ntpFailureThreshold { + if time.Since(ntpWarnTime) >= ntpWarningCooldown { + ntpWarnTime = time.Now() + go checkClockDrift() + } + contTimeouts = 0 + } + } + } +} + +const ( + macSize = 256 / 8 + sigSize = 520 / 8 + headSize = macSize + sigSize // space of packet frame data +) + +var ( + headSpace = make([]byte, headSize) + + // Neighbors replies are sent across multiple packets to + // stay below the packet size limit. We compute the maximum number + // of entries by stuffing a packet until it grows too large. + maxNeighbors int +) + +func init() { + p := neighborsV4{Expiration: ^uint64(0)} + maxSizeNode := rpcNode{IP: make(net.IP, 16), UDP: ^uint16(0), TCP: ^uint16(0)} + for n := 0; ; n++ { + p.Nodes = append(p.Nodes, maxSizeNode) + size, _, err := rlp.EncodeToReader(p) + if err != nil { + // If this ever happens, it will be caught by the unit tests. + panic("cannot encode: " + err.Error()) + } + if headSize+size+1 >= maxPacketSize { + maxNeighbors = n + break + } + } +} + +func (t *UDPv4) send(toaddr *net.UDPAddr, toid enode.ID, req packetV4) ([]byte, error) { + packet, hash, err := t.encode(t.priv, req) + if err != nil { + return hash, err + } + return hash, t.write(toaddr, toid, req.name(), packet) +} + +func (t *UDPv4) write(toaddr *net.UDPAddr, toid enode.ID, what string, packet []byte) error { + _, err := t.conn.WriteToUDP(packet, toaddr) + t.log.Trace(">> "+what, "id", toid, "addr", toaddr, "err", err) + return err +} + +func (t *UDPv4) encode(priv *ecdsa.PrivateKey, req packetV4) (packet, hash []byte, err error) { + name := req.name() + b := new(bytes.Buffer) + b.Write(headSpace) + b.WriteByte(req.kind()) + if err := rlp.Encode(b, req); err != nil { + t.log.Error(fmt.Sprintf("Can't encode %s packet", name), "err", err) + return nil, nil, err + } + packet = b.Bytes() + sig, err := crypto.Sign(crypto.Keccak256(packet[headSize:]), priv) + if err != nil { + t.log.Error(fmt.Sprintf("Can't sign %s packet", name), "err", err) + return nil, nil, err + } + copy(packet[macSize:], sig) + // add the hash to the front. Note: this doesn't protect the + // packet in any way. Our public key will be part of this hash in + // The future. + hash = crypto.Keccak256(packet[macSize:]) + copy(packet, hash) + return packet, hash, nil +} + +// readLoop runs in its own goroutine. it handles incoming UDP packets. +func (t *UDPv4) readLoop(unhandled chan<- ReadPacket) { + defer t.wg.Done() + if unhandled != nil { + defer close(unhandled) + } + + buf := make([]byte, maxPacketSize) + for { + nbytes, from, err := t.conn.ReadFromUDP(buf) + if netutil.IsTemporaryError(err) { + // Ignore temporary read errors. + t.log.Debug("Temporary UDP read error", "err", err) + continue + } else if err != nil { + // Shut down the loop for permament errors. + if err != io.EOF { + t.log.Debug("UDP read error", "err", err) + } + return + } + if t.handlePacket(from, buf[:nbytes]) != nil && unhandled != nil { + select { + case unhandled <- ReadPacket{buf[:nbytes], from}: + default: + } + } + } +} + +func (t *UDPv4) handlePacket(from *net.UDPAddr, buf []byte) error { + packet, fromKey, hash, err := decodeV4(buf) + if err != nil { + t.log.Debug("Bad discv4 packet", "addr", from, "err", err) + return err + } + fromID := fromKey.id() + if err == nil { + err = packet.preverify(t, from, fromID, fromKey) + } + t.log.Trace("<< "+packet.name(), "id", fromID, "addr", from, "err", err) + if err == nil { + packet.handle(t, from, fromID, hash) + } + return err +} + +func decodeV4(buf []byte) (packetV4, encPubkey, []byte, error) { + if len(buf) < headSize+1 { + return nil, encPubkey{}, nil, errPacketTooSmall + } + hash, sig, sigdata := buf[:macSize], buf[macSize:headSize], buf[headSize:] + shouldhash := crypto.Keccak256(buf[macSize:]) + if !bytes.Equal(hash, shouldhash) { + return nil, encPubkey{}, nil, errBadHash + } + fromKey, err := recoverNodeKey(crypto.Keccak256(buf[headSize:]), sig) + if err != nil { + return nil, fromKey, hash, err + } + + var req packetV4 + switch ptype := sigdata[0]; ptype { + case p_pingV4: + req = new(pingV4) + case p_pongV4: + req = new(pongV4) + case p_findnodeV4: + req = new(findnodeV4) + case p_neighborsV4: + req = new(neighborsV4) + case p_enrRequestV4: + req = new(enrRequestV4) + case p_enrResponseV4: + req = new(enrResponseV4) + default: + return nil, fromKey, hash, fmt.Errorf("unknown type: %d", ptype) + } + s := rlp.NewStream(bytes.NewReader(sigdata[1:]), 0) + err = s.Decode(req) + return req, fromKey, hash, err +} + +// checkBond checks if the given node has a recent enough endpoint proof. +func (t *UDPv4) checkBond(id enode.ID, ip net.IP) bool { + return time.Since(t.db.LastPongReceived(id, ip)) < bondExpiration +} + +// ensureBond solicits a ping from a node if we haven't seen a ping from it for a while. +// This ensures there is a valid endpoint proof on the remote end. +func (t *UDPv4) ensureBond(toid enode.ID, toaddr *net.UDPAddr) { + tooOld := time.Since(t.db.LastPingReceived(toid, toaddr.IP)) > bondExpiration + if tooOld || t.db.FindFails(toid, toaddr.IP) > maxFindnodeFailures { + rm := t.sendPing(toid, toaddr, nil) + <-rm.errc + // Wait for them to ping back and process our pong. + time.Sleep(respTimeout) + } +} + +// expired checks whether the given UNIX time stamp is in the past. +func expired(ts uint64) bool { + return time.Unix(int64(ts), 0).Before(time.Now()) +} + +func seqFromTail(tail []rlp.RawValue) uint64 { + if len(tail) == 0 { + return 0 + } + var seq uint64 + rlp.DecodeBytes(tail[0], &seq) + return seq +} + +// PING/v4 + +func (req *pingV4) name() string { return "PING/v4" } +func (req *pingV4) kind() byte { return p_pingV4 } + +func (req *pingV4) preverify(t *UDPv4, from *net.UDPAddr, fromID enode.ID, fromKey encPubkey) error { + if expired(req.Expiration) { + return errExpired + } + key, err := decodePubkey(fromKey) + if err != nil { + return errors.New("invalid public key") + } + req.senderKey = key + return nil +} + +func (req *pingV4) handle(t *UDPv4, from *net.UDPAddr, fromID enode.ID, mac []byte) { + // Reply. + seq, _ := rlp.EncodeToBytes(t.localNode.Node().Seq()) + t.send(from, fromID, &pongV4{ + To: makeEndpoint(from, req.From.TCP), + ReplyTok: mac, + Expiration: uint64(time.Now().Add(expiration).Unix()), + Rest: []rlp.RawValue{seq}, + }) + + // Ping back if our last pong on file is too far in the past. + n := wrapNode(enode.NewV4(req.senderKey, from.IP, int(req.From.TCP), from.Port)) + if time.Since(t.db.LastPongReceived(n.ID(), from.IP)) > bondExpiration { + t.sendPing(fromID, from, func() { + t.tab.addVerifiedNode(n) + }) + } else { + t.tab.addVerifiedNode(n) + } + + // Update node database and endpoint predictor. + t.db.UpdateLastPingReceived(n.ID(), from.IP, time.Now()) + t.localNode.UDPEndpointStatement(from, &net.UDPAddr{IP: req.To.IP, Port: int(req.To.UDP)}) +} + +// PONG/v4 + +func (req *pongV4) name() string { return "PONG/v4" } +func (req *pongV4) kind() byte { return p_pongV4 } + +func (req *pongV4) preverify(t *UDPv4, from *net.UDPAddr, fromID enode.ID, fromKey encPubkey) error { + if expired(req.Expiration) { + return errExpired + } + if !t.handleReply(fromID, from.IP, req) { + return errUnsolicitedReply + } + return nil +} + +func (req *pongV4) handle(t *UDPv4, from *net.UDPAddr, fromID enode.ID, mac []byte) { + t.localNode.UDPEndpointStatement(from, &net.UDPAddr{IP: req.To.IP, Port: int(req.To.UDP)}) + t.db.UpdateLastPongReceived(fromID, from.IP, time.Now()) +} + +// FINDNODE/v4 + +func (req *findnodeV4) name() string { return "FINDNODE/v4" } +func (req *findnodeV4) kind() byte { return p_findnodeV4 } + +func (req *findnodeV4) preverify(t *UDPv4, from *net.UDPAddr, fromID enode.ID, fromKey encPubkey) error { + if expired(req.Expiration) { + return errExpired + } + if !t.checkBond(fromID, from.IP) { + // No endpoint proof pong exists, we don't process the packet. This prevents an + // attack vector where the discovery protocol could be used to amplify traffic in a + // DDOS attack. A malicious actor would send a findnode request with the IP address + // and UDP port of the target as the source address. The recipient of the findnode + // packet would then send a neighbors packet (which is a much bigger packet than + // findnode) to the victim. + return errUnknownNode + } + return nil +} + +func (req *findnodeV4) handle(t *UDPv4, from *net.UDPAddr, fromID enode.ID, mac []byte) { + // Determine closest nodes. + target := enode.ID(crypto.Keccak256Hash(req.Target[:])) + t.tab.mutex.Lock() + closest := t.tab.closest(target, bucketSize, true).entries + t.tab.mutex.Unlock() + + // Send neighbors in chunks with at most maxNeighbors per packet + // to stay below the packet size limit. + p := neighborsV4{Expiration: uint64(time.Now().Add(expiration).Unix())} + var sent bool + for _, n := range closest { + if netutil.CheckRelayIP(from.IP, n.IP()) == nil { + p.Nodes = append(p.Nodes, nodeToRPC(n)) + } + if len(p.Nodes) == maxNeighbors { + t.send(from, fromID, &p) + p.Nodes = p.Nodes[:0] + sent = true + } + } + if len(p.Nodes) > 0 || !sent { + t.send(from, fromID, &p) + } +} + +// NEIGHBORS/v4 + +func (req *neighborsV4) name() string { return "NEIGHBORS/v4" } +func (req *neighborsV4) kind() byte { return p_neighborsV4 } + +func (req *neighborsV4) preverify(t *UDPv4, from *net.UDPAddr, fromID enode.ID, fromKey encPubkey) error { + if expired(req.Expiration) { + return errExpired + } + if !t.handleReply(fromID, from.IP, req) { + return errUnsolicitedReply + } + return nil +} + +func (req *neighborsV4) handle(t *UDPv4, from *net.UDPAddr, fromID enode.ID, mac []byte) { +} + +// ENRREQUEST/v4 + +func (req *enrRequestV4) name() string { return "ENRREQUEST/v4" } +func (req *enrRequestV4) kind() byte { return p_enrRequestV4 } + +func (req *enrRequestV4) preverify(t *UDPv4, from *net.UDPAddr, fromID enode.ID, fromKey encPubkey) error { + if expired(req.Expiration) { + return errExpired + } + if !t.checkBond(fromID, from.IP) { + return errUnknownNode + } + return nil +} + +func (req *enrRequestV4) handle(t *UDPv4, from *net.UDPAddr, fromID enode.ID, mac []byte) { + t.send(from, fromID, &enrResponseV4{ + ReplyTok: mac, + Record: *t.localNode.Node().Record(), + }) +} + +// ENRRESPONSE/v4 + +func (req *enrResponseV4) name() string { return "ENRRESPONSE/v4" } +func (req *enrResponseV4) kind() byte { return p_enrResponseV4 } + +func (req *enrResponseV4) preverify(t *UDPv4, from *net.UDPAddr, fromID enode.ID, fromKey encPubkey) error { + if !t.handleReply(fromID, from.IP, req) { + return errUnsolicitedReply + } + return nil +} + +func (req *enrResponseV4) handle(t *UDPv4, from *net.UDPAddr, fromID enode.ID, mac []byte) { +} diff --git a/p2p/discover/v4_udp_test.go b/p2p/discover/v4_udp_test.go new file mode 100644 index 000000000000..b4e024e7ef29 --- /dev/null +++ b/p2p/discover/v4_udp_test.go @@ -0,0 +1,687 @@ +// 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 discover + +import ( + "bytes" + "crypto/ecdsa" + crand "crypto/rand" + "encoding/binary" + "encoding/hex" + "errors" + "io" + "math/rand" + "net" + "reflect" + "sync" + "testing" + "time" + + "github.com/davecgh/go-spew/spew" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/internal/testlog" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/rlp" +) + +func init() { + spew.Config.DisableMethods = true +} + +// shared test variables +var ( + futureExp = uint64(time.Now().Add(10 * time.Hour).Unix()) + testTarget = encPubkey{0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1} + testRemote = rpcEndpoint{IP: net.ParseIP("1.1.1.1").To4(), UDP: 1, TCP: 2} + testLocalAnnounced = rpcEndpoint{IP: net.ParseIP("2.2.2.2").To4(), UDP: 3, TCP: 4} + testLocal = rpcEndpoint{IP: net.ParseIP("3.3.3.3").To4(), UDP: 5, TCP: 6} +) + +type udpTest struct { + t *testing.T + pipe *dgramPipe + table *Table + db *enode.DB + udp *UDPv4 + sent [][]byte + localkey, remotekey *ecdsa.PrivateKey + remoteaddr *net.UDPAddr +} + +func newUDPTest(t *testing.T) *udpTest { + test := &udpTest{ + t: t, + pipe: newpipe(), + localkey: newkey(), + remotekey: newkey(), + remoteaddr: &net.UDPAddr{IP: net.IP{10, 0, 1, 99}, Port: 30303}, + } + + test.db, _ = enode.OpenDB("") + ln := enode.NewLocalNode(test.db, test.localkey) + test.udp, _ = ListenV4(test.pipe, ln, Config{ + PrivateKey: test.localkey, + Log: testlog.Logger(t, log.LvlTrace), + }) + test.table = test.udp.tab + // Wait for initial refresh so the table doesn't send unexpected findnode. + <-test.table.initDone + return test +} + +func (test *udpTest) close() { + test.udp.Close() + test.db.Close() +} + +// handles a packet as if it had been sent to the transport. +func (test *udpTest) packetIn(wantError error, data packetV4) { + test.t.Helper() + + test.packetInFrom(wantError, test.remotekey, test.remoteaddr, data) +} + +// handles a packet as if it had been sent to the transport by the key/endpoint. +func (test *udpTest) packetInFrom(wantError error, key *ecdsa.PrivateKey, addr *net.UDPAddr, data packetV4) { + test.t.Helper() + + enc, _, err := test.udp.encode(key, data) + if err != nil { + test.t.Errorf("%s encode error: %v", data.name(), err) + } + test.sent = append(test.sent, enc) + if err = test.udp.handlePacket(addr, enc); err != wantError { + test.t.Errorf("error mismatch: got %q, want %q", err, wantError) + } +} + +// waits for a packet to be sent by the transport. +// validate should have type func(X, *net.UDPAddr, []byte), where X is a packet type. +func (test *udpTest) waitPacketOut(validate interface{}) (closed bool) { + test.t.Helper() + + dgram, ok := test.pipe.receive() + if !ok { + return true + } + p, _, hash, err := decodeV4(dgram.data) + if err != nil { + test.t.Errorf("sent packet decode error: %v", err) + return false + } + fn := reflect.ValueOf(validate) + exptype := fn.Type().In(0) + if !reflect.TypeOf(p).AssignableTo(exptype) { + test.t.Errorf("sent packet type mismatch, got: %v, want: %v", reflect.TypeOf(p), exptype) + return false + } + fn.Call([]reflect.Value{reflect.ValueOf(p), reflect.ValueOf(&dgram.to), reflect.ValueOf(hash)}) + return false +} + +func TestUDPv4_packetErrors(t *testing.T) { + test := newUDPTest(t) + defer test.close() + + test.packetIn(errExpired, &pingV4{From: testRemote, To: testLocalAnnounced, Version: 4}) + test.packetIn(errUnsolicitedReply, &pongV4{ReplyTok: []byte{}, Expiration: futureExp}) + test.packetIn(errUnknownNode, &findnodeV4{Expiration: futureExp}) + test.packetIn(errUnsolicitedReply, &neighborsV4{Expiration: futureExp}) +} + +func TestUDPv4_pingTimeout(t *testing.T) { + t.Parallel() + test := newUDPTest(t) + defer test.close() + + key := newkey() + toaddr := &net.UDPAddr{IP: net.ParseIP("1.2.3.4"), Port: 2222} + node := enode.NewV4(&key.PublicKey, toaddr.IP, 0, toaddr.Port) + if _, err := test.udp.ping(node); err != errTimeout { + t.Error("expected timeout error, got", err) + } +} + +type testPacket byte + +func (req testPacket) kind() byte { return byte(req) } +func (req testPacket) name() string { return "" } +func (req testPacket) preverify(*UDPv4, *net.UDPAddr, enode.ID, encPubkey) error { + return nil +} +func (req testPacket) handle(*UDPv4, *net.UDPAddr, enode.ID, []byte) { +} + +func TestUDPv4_responseTimeouts(t *testing.T) { + t.Parallel() + test := newUDPTest(t) + defer test.close() + + rand.Seed(time.Now().UnixNano()) + randomDuration := func(max time.Duration) time.Duration { + return time.Duration(rand.Int63n(int64(max))) + } + + var ( + nReqs = 200 + nTimeouts = 0 // number of requests with ptype > 128 + nilErr = make(chan error, nReqs) // for requests that get a reply + timeoutErr = make(chan error, nReqs) // for requests that time out + ) + for i := 0; i < nReqs; i++ { + // Create a matcher for a random request in udp.loop. Requests + // with ptype <= 128 will not get a reply and should time out. + // For all other requests, a reply is scheduled to arrive + // within the timeout window. + p := &replyMatcher{ + ptype: byte(rand.Intn(255)), + callback: func(interface{}) (bool, bool) { return true, true }, + } + binary.BigEndian.PutUint64(p.from[:], uint64(i)) + if p.ptype <= 128 { + p.errc = timeoutErr + test.udp.addReplyMatcher <- p + nTimeouts++ + } else { + p.errc = nilErr + test.udp.addReplyMatcher <- p + time.AfterFunc(randomDuration(60*time.Millisecond), func() { + if !test.udp.handleReply(p.from, p.ip, testPacket(p.ptype)) { + t.Logf("not matched: %v", p) + } + }) + } + time.Sleep(randomDuration(30 * time.Millisecond)) + } + + // Check that all timeouts were delivered and that the rest got nil errors. + // The replies must be delivered. + var ( + recvDeadline = time.After(20 * time.Second) + nTimeoutsRecv, nNil = 0, 0 + ) + for i := 0; i < nReqs; i++ { + select { + case err := <-timeoutErr: + if err != errTimeout { + t.Fatalf("got non-timeout error on timeoutErr %d: %v", i, err) + } + nTimeoutsRecv++ + case err := <-nilErr: + if err != nil { + t.Fatalf("got non-nil error on nilErr %d: %v", i, err) + } + nNil++ + case <-recvDeadline: + t.Fatalf("exceeded recv deadline") + } + } + if nTimeoutsRecv != nTimeouts { + t.Errorf("wrong number of timeout errors received: got %d, want %d", nTimeoutsRecv, nTimeouts) + } + if nNil != nReqs-nTimeouts { + t.Errorf("wrong number of successful replies: got %d, want %d", nNil, nReqs-nTimeouts) + } +} + +func TestUDPv4_findnodeTimeout(t *testing.T) { + t.Parallel() + test := newUDPTest(t) + defer test.close() + + toaddr := &net.UDPAddr{IP: net.ParseIP("1.2.3.4"), Port: 2222} + toid := enode.ID{1, 2, 3, 4} + target := encPubkey{4, 5, 6, 7} + result, err := test.udp.findnode(toid, toaddr, target) + if err != errTimeout { + t.Error("expected timeout error, got", err) + } + if len(result) > 0 { + t.Error("expected empty result, got", result) + } +} + +func TestUDPv4_findnode(t *testing.T) { + test := newUDPTest(t) + defer test.close() + + // put a few nodes into the table. their exact + // distribution shouldn't matter much, although we need to + // take care not to overflow any bucket. + nodes := &nodesByDistance{target: testTarget.id()} + live := make(map[enode.ID]bool) + numCandidates := 2 * bucketSize + for i := 0; i < numCandidates; i++ { + key := newkey() + ip := net.IP{10, 13, 0, byte(i)} + n := wrapNode(enode.NewV4(&key.PublicKey, ip, 0, 2000)) + // Ensure half of table content isn't verified live yet. + if i > numCandidates/2 { + n.livenessChecks = 1 + live[n.ID()] = true + } + nodes.push(n, numCandidates) + } + fillTable(test.table, nodes.entries) + + // ensure there's a bond with the test node, + // findnode won't be accepted otherwise. + remoteID := encodePubkey(&test.remotekey.PublicKey).id() + test.table.db.UpdateLastPongReceived(remoteID, test.remoteaddr.IP, time.Now()) + + // check that closest neighbors are returned. + expected := test.table.closest(testTarget.id(), bucketSize, true) + test.packetIn(nil, &findnodeV4{Target: testTarget, Expiration: futureExp}) + waitNeighbors := func(want []*node) { + test.waitPacketOut(func(p *neighborsV4, to *net.UDPAddr, hash []byte) { + if len(p.Nodes) != len(want) { + t.Errorf("wrong number of results: got %d, want %d", len(p.Nodes), bucketSize) + } + for i, n := range p.Nodes { + if n.ID.id() != want[i].ID() { + t.Errorf("result mismatch at %d:\n got: %v\n want: %v", i, n, expected.entries[i]) + } + if !live[n.ID.id()] { + t.Errorf("result includes dead node %v", n.ID.id()) + } + } + }) + } + // Receive replies. + want := expected.entries + if len(want) > maxNeighbors { + waitNeighbors(want[:maxNeighbors]) + want = want[maxNeighbors:] + } + waitNeighbors(want) +} + +func TestUDPv4_findnodeMultiReply(t *testing.T) { + test := newUDPTest(t) + defer test.close() + + rid := enode.PubkeyToIDV4(&test.remotekey.PublicKey) + test.table.db.UpdateLastPingReceived(rid, test.remoteaddr.IP, time.Now()) + + // queue a pending findnode request + resultc, errc := make(chan []*node), make(chan error) + go func() { + rid := encodePubkey(&test.remotekey.PublicKey).id() + ns, err := test.udp.findnode(rid, test.remoteaddr, testTarget) + if err != nil && len(ns) == 0 { + errc <- err + } else { + resultc <- ns + } + }() + + // wait for the findnode to be sent. + // after it is sent, the transport is waiting for a reply + test.waitPacketOut(func(p *findnodeV4, to *net.UDPAddr, hash []byte) { + if p.Target != testTarget { + t.Errorf("wrong target: got %v, want %v", p.Target, testTarget) + } + }) + + // send the reply as two packets. + list := []*node{ + wrapNode(enode.MustParse("enode://ba85011c70bcc5c04d8607d3a0ed29aa6179c092cbdda10d5d32684fb33ed01bd94f588ca8f91ac48318087dcb02eaf36773a7a453f0eedd6742af668097b29c@10.0.1.16:30303?discport=30304")), + wrapNode(enode.MustParse("enode://81fa361d25f157cd421c60dcc28d8dac5ef6a89476633339c5df30287474520caca09627da18543d9079b5b288698b542d56167aa5c09111e55acdbbdf2ef799@10.0.1.16:30303")), + wrapNode(enode.MustParse("enode://9bffefd833d53fac8e652415f4973bee289e8b1a5c6c4cbe70abf817ce8a64cee11b823b66a987f51aaa9fba0d6a91b3e6bf0d5a5d1042de8e9eeea057b217f8@10.0.1.36:30301?discport=17")), + wrapNode(enode.MustParse("enode://1b5b4aa662d7cb44a7221bfba67302590b643028197a7d5214790f3bac7aaa4a3241be9e83c09cf1f6c69d007c634faae3dc1b1221793e8446c0b3a09de65960@10.0.1.16:30303")), + } + rpclist := make([]rpcNode, len(list)) + for i := range list { + rpclist[i] = nodeToRPC(list[i]) + } + test.packetIn(nil, &neighborsV4{Expiration: futureExp, Nodes: rpclist[:2]}) + test.packetIn(nil, &neighborsV4{Expiration: futureExp, Nodes: rpclist[2:]}) + + // check that the sent neighbors are all returned by findnode + select { + case result := <-resultc: + want := append(list[:2], list[3:]...) + if !reflect.DeepEqual(result, want) { + t.Errorf("neighbors mismatch:\n got: %v\n want: %v", result, want) + } + case err := <-errc: + t.Errorf("findnode error: %v", err) + case <-time.After(5 * time.Second): + t.Error("findnode did not return within 5 seconds") + } +} + +// This test checks that reply matching of pong verifies the ping hash. +func TestUDPv4_pingMatch(t *testing.T) { + test := newUDPTest(t) + defer test.close() + + randToken := make([]byte, 32) + crand.Read(randToken) + + test.packetIn(nil, &pingV4{From: testRemote, To: testLocalAnnounced, Version: 4, Expiration: futureExp}) + test.waitPacketOut(func(*pongV4, *net.UDPAddr, []byte) {}) + test.waitPacketOut(func(*pingV4, *net.UDPAddr, []byte) {}) + test.packetIn(errUnsolicitedReply, &pongV4{ReplyTok: randToken, To: testLocalAnnounced, Expiration: futureExp}) +} + +// This test checks that reply matching of pong verifies the sender IP address. +func TestUDPv4_pingMatchIP(t *testing.T) { + test := newUDPTest(t) + defer test.close() + + test.packetIn(nil, &pingV4{From: testRemote, To: testLocalAnnounced, Version: 4, Expiration: futureExp}) + test.waitPacketOut(func(*pongV4, *net.UDPAddr, []byte) {}) + + test.waitPacketOut(func(p *pingV4, to *net.UDPAddr, hash []byte) { + wrongAddr := &net.UDPAddr{IP: net.IP{33, 44, 1, 2}, Port: 30000} + test.packetInFrom(errUnsolicitedReply, test.remotekey, wrongAddr, &pongV4{ + ReplyTok: hash, + To: testLocalAnnounced, + Expiration: futureExp, + }) + }) +} + +func TestUDPv4_successfulPing(t *testing.T) { + test := newUDPTest(t) + added := make(chan *node, 1) + test.table.nodeAddedHook = func(n *node) { added <- n } + defer test.close() + + // The remote side sends a ping packet to initiate the exchange. + go test.packetIn(nil, &pingV4{From: testRemote, To: testLocalAnnounced, Version: 4, Expiration: futureExp}) + + // The ping is replied to. + test.waitPacketOut(func(p *pongV4, to *net.UDPAddr, hash []byte) { + pinghash := test.sent[0][:macSize] + if !bytes.Equal(p.ReplyTok, pinghash) { + t.Errorf("got pong.ReplyTok %x, want %x", p.ReplyTok, pinghash) + } + wantTo := rpcEndpoint{ + // The mirrored UDP address is the UDP packet sender + IP: test.remoteaddr.IP, UDP: uint16(test.remoteaddr.Port), + // The mirrored TCP port is the one from the ping packet + TCP: testRemote.TCP, + } + if !reflect.DeepEqual(p.To, wantTo) { + t.Errorf("got pong.To %v, want %v", p.To, wantTo) + } + }) + + // Remote is unknown, the table pings back. + test.waitPacketOut(func(p *pingV4, to *net.UDPAddr, hash []byte) { + if !reflect.DeepEqual(p.From, test.udp.ourEndpoint()) { + t.Errorf("got ping.From %#v, want %#v", p.From, test.udp.ourEndpoint()) + } + wantTo := rpcEndpoint{ + // The mirrored UDP address is the UDP packet sender. + IP: test.remoteaddr.IP, + UDP: uint16(test.remoteaddr.Port), + TCP: 0, + } + if !reflect.DeepEqual(p.To, wantTo) { + t.Errorf("got ping.To %v, want %v", p.To, wantTo) + } + test.packetIn(nil, &pongV4{ReplyTok: hash, Expiration: futureExp}) + }) + + // The node should be added to the table shortly after getting the + // pong packet. + select { + case n := <-added: + rid := encodePubkey(&test.remotekey.PublicKey).id() + if n.ID() != rid { + t.Errorf("node has wrong ID: got %v, want %v", n.ID(), rid) + } + if !n.IP().Equal(test.remoteaddr.IP) { + t.Errorf("node has wrong IP: got %v, want: %v", n.IP(), test.remoteaddr.IP) + } + if n.UDP() != test.remoteaddr.Port { + t.Errorf("node has wrong UDP port: got %v, want: %v", n.UDP(), test.remoteaddr.Port) + } + if n.TCP() != int(testRemote.TCP) { + t.Errorf("node has wrong TCP port: got %v, want: %v", n.TCP(), testRemote.TCP) + } + case <-time.After(2 * time.Second): + t.Errorf("node was not added within 2 seconds") + } +} + +// This test checks that EIP-868 requests work. +func TestUDPv4_EIP868(t *testing.T) { + test := newUDPTest(t) + defer test.close() + + test.udp.localNode.Set(enr.WithEntry("foo", "bar")) + wantNode := test.udp.localNode.Node() + + // ENR requests aren't allowed before endpoint proof. + test.packetIn(errUnknownNode, &enrRequestV4{Expiration: futureExp}) + + // Perform endpoint proof and check for sequence number in packet tail. + test.packetIn(nil, &pingV4{Expiration: futureExp}) + test.waitPacketOut(func(p *pongV4, addr *net.UDPAddr, hash []byte) { + if seq := seqFromTail(p.Rest); seq != wantNode.Seq() { + t.Errorf("wrong sequence number in pong: %d, want %d", seq, wantNode.Seq()) + } + }) + test.waitPacketOut(func(p *pingV4, addr *net.UDPAddr, hash []byte) { + if seq := seqFromTail(p.Rest); seq != wantNode.Seq() { + t.Errorf("wrong sequence number in ping: %d, want %d", seq, wantNode.Seq()) + } + test.packetIn(nil, &pongV4{Expiration: futureExp, ReplyTok: hash}) + }) + + // Request should work now. + test.packetIn(nil, &enrRequestV4{Expiration: futureExp}) + test.waitPacketOut(func(p *enrResponseV4, addr *net.UDPAddr, hash []byte) { + n, err := enode.New(enode.ValidSchemes, &p.Record) + if err != nil { + t.Fatalf("invalid record: %v", err) + } + if !reflect.DeepEqual(n, wantNode) { + t.Fatalf("wrong node in enrResponse: %v", n) + } + }) +} + +// EIP-8 test vectors. +var testPackets = []struct { + input string + wantPacket interface{} +}{ + { + input: "71dbda3a79554728d4f94411e42ee1f8b0d561c10e1e5f5893367948c6a7d70bb87b235fa28a77070271b6c164a2dce8c7e13a5739b53b5e96f2e5acb0e458a02902f5965d55ecbeb2ebb6cabb8b2b232896a36b737666c55265ad0a68412f250001ea04cb847f000001820cfa8215a8d790000000000000000000000000000000018208ae820d058443b9a355", + wantPacket: &pingV4{ + Version: 4, + From: rpcEndpoint{net.ParseIP("127.0.0.1").To4(), 3322, 5544}, + To: rpcEndpoint{net.ParseIP("::1"), 2222, 3333}, + Expiration: 1136239445, + Rest: []rlp.RawValue{}, + }, + }, + { + input: "e9614ccfd9fc3e74360018522d30e1419a143407ffcce748de3e22116b7e8dc92ff74788c0b6663aaa3d67d641936511c8f8d6ad8698b820a7cf9e1be7155e9a241f556658c55428ec0563514365799a4be2be5a685a80971ddcfa80cb422cdd0101ec04cb847f000001820cfa8215a8d790000000000000000000000000000000018208ae820d058443b9a3550102", + wantPacket: &pingV4{ + Version: 4, + From: rpcEndpoint{net.ParseIP("127.0.0.1").To4(), 3322, 5544}, + To: rpcEndpoint{net.ParseIP("::1"), 2222, 3333}, + Expiration: 1136239445, + Rest: []rlp.RawValue{{0x01}, {0x02}}, + }, + }, + { + input: "577be4349c4dd26768081f58de4c6f375a7a22f3f7adda654d1428637412c3d7fe917cadc56d4e5e7ffae1dbe3efffb9849feb71b262de37977e7c7a44e677295680e9e38ab26bee2fcbae207fba3ff3d74069a50b902a82c9903ed37cc993c50001f83e82022bd79020010db83c4d001500000000abcdef12820cfa8215a8d79020010db885a308d313198a2e037073488208ae82823a8443b9a355c5010203040531b9019afde696e582a78fa8d95ea13ce3297d4afb8ba6433e4154caa5ac6431af1b80ba76023fa4090c408f6b4bc3701562c031041d4702971d102c9ab7fa5eed4cd6bab8f7af956f7d565ee1917084a95398b6a21eac920fe3dd1345ec0a7ef39367ee69ddf092cbfe5b93e5e568ebc491983c09c76d922dc3", + wantPacket: &pingV4{ + Version: 555, + From: rpcEndpoint{net.ParseIP("2001:db8:3c4d:15::abcd:ef12"), 3322, 5544}, + To: rpcEndpoint{net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), 2222, 33338}, + Expiration: 1136239445, + Rest: []rlp.RawValue{{0xC5, 0x01, 0x02, 0x03, 0x04, 0x05}}, + }, + }, + { + input: "09b2428d83348d27cdf7064ad9024f526cebc19e4958f0fdad87c15eb598dd61d08423e0bf66b2069869e1724125f820d851c136684082774f870e614d95a2855d000f05d1648b2d5945470bc187c2d2216fbe870f43ed0909009882e176a46b0102f846d79020010db885a308d313198a2e037073488208ae82823aa0fbc914b16819237dcd8801d7e53f69e9719adecb3cc0e790c57e91ca4461c9548443b9a355c6010203c2040506a0c969a58f6f9095004c0177a6b47f451530cab38966a25cca5cb58f055542124e", + wantPacket: &pongV4{ + To: rpcEndpoint{net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), 2222, 33338}, + ReplyTok: common.Hex2Bytes("fbc914b16819237dcd8801d7e53f69e9719adecb3cc0e790c57e91ca4461c954"), + Expiration: 1136239445, + Rest: []rlp.RawValue{{0xC6, 0x01, 0x02, 0x03, 0xC2, 0x04, 0x05}, {0x06}}, + }, + }, + { + input: "c7c44041b9f7c7e41934417ebac9a8e1a4c6298f74553f2fcfdcae6ed6fe53163eb3d2b52e39fe91831b8a927bf4fc222c3902202027e5e9eb812195f95d20061ef5cd31d502e47ecb61183f74a504fe04c51e73df81f25c4d506b26db4517490103f84eb840ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31387574077f301b421bc84df7266c44e9e6d569fc56be00812904767bf5ccd1fc7f8443b9a35582999983999999280dc62cc8255c73471e0a61da0c89acdc0e035e260add7fc0c04ad9ebf3919644c91cb247affc82b69bd2ca235c71eab8e49737c937a2c396", + wantPacket: &findnodeV4{ + Target: hexEncPubkey("ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31387574077f301b421bc84df7266c44e9e6d569fc56be00812904767bf5ccd1fc7f"), + Expiration: 1136239445, + Rest: []rlp.RawValue{{0x82, 0x99, 0x99}, {0x83, 0x99, 0x99, 0x99}}, + }, + }, + { + input: "c679fc8fe0b8b12f06577f2e802d34f6fa257e6137a995f6f4cbfc9ee50ed3710faf6e66f932c4c8d81d64343f429651328758b47d3dbc02c4042f0fff6946a50f4a49037a72bb550f3a7872363a83e1b9ee6469856c24eb4ef80b7535bcf99c0004f9015bf90150f84d846321163782115c82115db8403155e1427f85f10a5c9a7755877748041af1bcd8d474ec065eb33df57a97babf54bfd2103575fa829115d224c523596b401065a97f74010610fce76382c0bf32f84984010203040101b840312c55512422cf9b8a4097e9a6ad79402e87a15ae909a4bfefa22398f03d20951933beea1e4dfa6f968212385e829f04c2d314fc2d4e255e0d3bc08792b069dbf8599020010db83c4d001500000000abcdef12820d05820d05b84038643200b172dcfef857492156971f0e6aa2c538d8b74010f8e140811d53b98c765dd2d96126051913f44582e8c199ad7c6d6819e9a56483f637feaac9448aacf8599020010db885a308d313198a2e037073488203e78203e8b8408dcab8618c3253b558d459da53bd8fa68935a719aff8b811197101a4b2b47dd2d47295286fc00cc081bb542d760717d1bdd6bec2c37cd72eca367d6dd3b9df738443b9a355010203b525a138aa34383fec3d2719a0", + wantPacket: &neighborsV4{ + Nodes: []rpcNode{ + { + ID: hexEncPubkey("3155e1427f85f10a5c9a7755877748041af1bcd8d474ec065eb33df57a97babf54bfd2103575fa829115d224c523596b401065a97f74010610fce76382c0bf32"), + IP: net.ParseIP("99.33.22.55").To4(), + UDP: 4444, + TCP: 4445, + }, + { + ID: hexEncPubkey("312c55512422cf9b8a4097e9a6ad79402e87a15ae909a4bfefa22398f03d20951933beea1e4dfa6f968212385e829f04c2d314fc2d4e255e0d3bc08792b069db"), + IP: net.ParseIP("1.2.3.4").To4(), + UDP: 1, + TCP: 1, + }, + { + ID: hexEncPubkey("38643200b172dcfef857492156971f0e6aa2c538d8b74010f8e140811d53b98c765dd2d96126051913f44582e8c199ad7c6d6819e9a56483f637feaac9448aac"), + IP: net.ParseIP("2001:db8:3c4d:15::abcd:ef12"), + UDP: 3333, + TCP: 3333, + }, + { + ID: hexEncPubkey("8dcab8618c3253b558d459da53bd8fa68935a719aff8b811197101a4b2b47dd2d47295286fc00cc081bb542d760717d1bdd6bec2c37cd72eca367d6dd3b9df73"), + IP: net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), + UDP: 999, + TCP: 1000, + }, + }, + Expiration: 1136239445, + Rest: []rlp.RawValue{{0x01}, {0x02}, {0x03}}, + }, + }, +} + +func TestUDPv4_forwardCompatibility(t *testing.T) { + testkey, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") + wantNodeKey := encodePubkey(&testkey.PublicKey) + + for _, test := range testPackets { + input, err := hex.DecodeString(test.input) + if err != nil { + t.Fatalf("invalid hex: %s", test.input) + } + packet, nodekey, _, err := decodeV4(input) + if err != nil { + t.Errorf("did not accept packet %s\n%v", test.input, err) + continue + } + if !reflect.DeepEqual(packet, test.wantPacket) { + t.Errorf("got %s\nwant %s", spew.Sdump(packet), spew.Sdump(test.wantPacket)) + } + if nodekey != wantNodeKey { + t.Errorf("got id %v\nwant id %v", nodekey, wantNodeKey) + } + } +} + +// dgramPipe is a fake UDP socket. It queues all sent datagrams. +type dgramPipe struct { + mu *sync.Mutex + cond *sync.Cond + closing chan struct{} + closed bool + queue []dgram +} + +type dgram struct { + to net.UDPAddr + data []byte +} + +func newpipe() *dgramPipe { + mu := new(sync.Mutex) + return &dgramPipe{ + closing: make(chan struct{}), + cond: &sync.Cond{L: mu}, + mu: mu, + } +} + +// WriteToUDP queues a datagram. +func (c *dgramPipe) WriteToUDP(b []byte, to *net.UDPAddr) (n int, err error) { + msg := make([]byte, len(b)) + copy(msg, b) + c.mu.Lock() + defer c.mu.Unlock() + if c.closed { + return 0, errors.New("closed") + } + c.queue = append(c.queue, dgram{*to, b}) + c.cond.Signal() + return len(b), nil +} + +// ReadFromUDP just hangs until the pipe is closed. +func (c *dgramPipe) ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) { + <-c.closing + return 0, nil, io.EOF +} + +func (c *dgramPipe) Close() error { + c.mu.Lock() + defer c.mu.Unlock() + if !c.closed { + close(c.closing) + c.closed = true + } + c.cond.Broadcast() + return nil +} + +func (c *dgramPipe) LocalAddr() net.Addr { + return &net.UDPAddr{IP: testLocal.IP, Port: int(testLocal.UDP)} +} + +func (c *dgramPipe) receive() (dgram, bool) { + c.mu.Lock() + defer c.mu.Unlock() + for len(c.queue) == 0 && !c.closed { + c.cond.Wait() + } + if c.closed { + return dgram{}, false + } + p := c.queue[0] + copy(c.queue, c.queue[1:]) + c.queue = c.queue[:len(c.queue)-1] + return p, true +} diff --git a/p2p/discv5/README b/p2p/discv5/README new file mode 100644 index 000000000000..617a473d7ff2 --- /dev/null +++ b/p2p/discv5/README @@ -0,0 +1,4 @@ +This package is an early prototype of Discovery v5. Do not use this code. + +See https://github.com/ethereum/devp2p/blob/master/discv5/discv5.md for the +current Discovery v5 specification. \ No newline at end of file diff --git a/p2p/discv5/database.go b/p2p/discv5/database.go index feb1c7c538b7..ca118e7f80f2 100644 --- a/p2p/discv5/database.go +++ b/p2p/discv5/database.go @@ -28,9 +28,9 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/errors" "github.com/syndtr/goleveldb/leveldb/iterator" @@ -58,12 +58,11 @@ var ( nodeDBVersionKey = []byte("version") // Version of the database to flush if changes nodeDBItemPrefix = []byte("n:") // Identifier to prefix node entries with - nodeDBDiscoverRoot = ":discover" - nodeDBDiscoverPing = nodeDBDiscoverRoot + ":lastping" - nodeDBDiscoverPong = nodeDBDiscoverRoot + ":lastpong" - nodeDBDiscoverFindFails = nodeDBDiscoverRoot + ":findfail" - nodeDBDiscoverLocalEndpoint = nodeDBDiscoverRoot + ":localendpoint" - nodeDBTopicRegTickets = ":tickets" + nodeDBDiscoverRoot = ":discover" + nodeDBDiscoverPing = nodeDBDiscoverRoot + ":lastping" + nodeDBDiscoverPong = nodeDBDiscoverRoot + ":lastpong" + nodeDBDiscoverFindFails = nodeDBDiscoverRoot + ":findfail" + nodeDBTopicRegTickets = ":tickets" ) // newNodeDB creates a new node database for storing and retrieving infos about @@ -311,20 +310,6 @@ func (db *nodeDB) updateFindFails(id NodeID, fails int) error { return db.storeInt64(makeKey(id, nodeDBDiscoverFindFails), int64(fails)) } -// localEndpoint returns the last local endpoint communicated to the -// given remote node. -func (db *nodeDB) localEndpoint(id NodeID) *rpcEndpoint { - var ep rpcEndpoint - if err := db.fetchRLP(makeKey(id, nodeDBDiscoverLocalEndpoint), &ep); err != nil { - return nil - } - return &ep -} - -func (db *nodeDB) updateLocalEndpoint(id NodeID, ep rpcEndpoint) error { - return db.storeRLP(makeKey(id, nodeDBDiscoverLocalEndpoint), &ep) -} - // querySeeds retrieves random nodes to be used as potential seed nodes // for bootstrapping. func (db *nodeDB) querySeeds(n int, maxAge time.Duration) []*Node { diff --git a/p2p/discv5/metrics.go b/p2p/discv5/metrics.go index 1f973c9d0974..e68d53c13c63 100644 --- a/p2p/discv5/metrics.go +++ b/p2p/discv5/metrics.go @@ -1,6 +1,22 @@ +// Copyright 2018 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 discv5 -import "github.com/nebulaai/nbai-node/metrics" +import "github.com/ethereum/go-ethereum/metrics" var ( ingressTrafficMeter = metrics.NewRegisteredMeter("discv5/InboundTraffic", nil) diff --git a/p2p/discv5/net.go b/p2p/discv5/net.go index c3c8948f6a9e..dd2ec3e9298f 100644 --- a/p2p/discv5/net.go +++ b/p2p/discv5/net.go @@ -24,12 +24,12 @@ import ( "net" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/mclock" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/netutil" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/netutil" + "github.com/ethereum/go-ethereum/rlp" "golang.org/x/crypto/sha3" ) @@ -77,14 +77,6 @@ type Network struct { nursery []*Node nodes map[NodeID]*Node // tracks active nodes with state != known timeoutTimers map[timeoutEvent]*time.Timer - - // Revalidation queues. - // Nodes put on these queues will be pinged eventually. - slowRevalidateQueue []*Node - fastRevalidateQueue []*Node - - // Buffers for state transition. - sendBuf []*ingressPacket } // transport is implemented by the UDP transport. @@ -104,10 +96,9 @@ type transport interface { } type findnodeQuery struct { - remote *Node - target common.Hash - reply chan<- []*Node - nresults int // counter for received nodes + remote *Node + target common.Hash + reply chan<- []*Node } type topicRegisterReq struct { @@ -650,10 +641,10 @@ loop: if net.conn != nil { net.conn.Close() } - if refreshDone != nil { - // TODO: wait for pending refresh. - //<-refreshResults - } + // TODO: wait for pending refresh. + // if refreshDone != nil { + // <-refreshResults + // } // Cancel all pending timeouts. for _, timer := range net.timeoutTimers { timer.Stop() diff --git a/p2p/discv5/net_test.go b/p2p/discv5/net_test.go index 9c10469cc87f..29321bc86f90 100644 --- a/p2p/discv5/net_test.go +++ b/p2p/discv5/net_test.go @@ -17,13 +17,12 @@ package discv5 import ( - "fmt" "net" "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" ) func TestNetwork_Lookup(t *testing.T) { @@ -265,10 +264,6 @@ type preminedTestnet struct { net *Network } -func (tn *preminedTestnet) sendFindnode(to *Node, target NodeID) { - panic("sendFindnode called") -} - func (tn *preminedTestnet) sendFindnodeHash(to *Node, target common.Hash) { // current log distance is encoded in port number // fmt.Println("findnode query at dist", toaddr.Port) @@ -316,10 +311,6 @@ func (tn *preminedTestnet) sendNeighbours(to *Node, nodes []*Node) { panic("sendNeighbours called") } -func (tn *preminedTestnet) sendTopicQuery(to *Node, topic Topic) { - panic("sendTopicQuery called") -} - func (tn *preminedTestnet) sendTopicNodes(to *Node, queryHash common.Hash, nodes []*Node) { panic("sendTopicNodes called") } @@ -334,41 +325,6 @@ func (*preminedTestnet) localAddr() *net.UDPAddr { return &net.UDPAddr{IP: net.ParseIP("10.0.1.1"), Port: 40000} } -// mine generates a testnet struct literal with nodes at -// various distances to the given target. -func (tn *preminedTestnet) mine(target NodeID) { - tn.target = target - tn.targetSha = crypto.Keccak256Hash(tn.target[:]) - found := 0 - for found < bucketSize*10 { - k := newkey() - id := PubkeyID(&k.PublicKey) - sha := crypto.Keccak256Hash(id[:]) - ld := logdist(tn.targetSha, sha) - if len(tn.dists[ld]) < bucketSize { - tn.dists[ld] = append(tn.dists[ld], id) - fmt.Println("found ID with ld", ld) - found++ - } - } - fmt.Println("&preminedTestnet{") - fmt.Printf(" target: %#v,\n", tn.target) - fmt.Printf(" targetSha: %#v,\n", tn.targetSha) - fmt.Printf(" dists: [%d][]NodeID{\n", len(tn.dists)) - for ld, ns := range &tn.dists { - if len(ns) == 0 { - continue - } - fmt.Printf(" %d: []NodeID{\n", ld) - for _, n := range ns { - fmt.Printf(" MustHexID(\"%x\"),\n", n[:]) - } - fmt.Println(" },") - } - fmt.Println(" },") - fmt.Println("}") -} - func injectResponse(net *Network, from *Node, ev nodeEvent, packet interface{}) { go net.reqReadPacket(ingressPacket{remoteID: from.ID, remoteAddr: from.addr(), ev: ev, data: packet}) } diff --git a/p2p/discv5/node.go b/p2p/discv5/node.go index c2646b041338..44d3025b70c4 100644 --- a/p2p/discv5/node.go +++ b/p2p/discv5/node.go @@ -30,8 +30,8 @@ import ( "strconv" "strings" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" ) // Node represents a host on the network. @@ -66,23 +66,6 @@ func (n *Node) addr() *net.UDPAddr { return &net.UDPAddr{IP: n.IP, Port: int(n.UDP)} } -func (n *Node) setAddr(a *net.UDPAddr) { - n.IP = a.IP - if ipv4 := a.IP.To4(); ipv4 != nil { - n.IP = ipv4 - } - n.UDP = uint16(a.Port) -} - -// compares the given address against the stored values. -func (n *Node) addrEqual(a *net.UDPAddr) bool { - ip := a.IP - if ipv4 := a.IP.To4(); ipv4 != nil { - ip = ipv4 - } - return n.UDP == uint16(a.Port) && n.IP.Equal(ip) -} - // Incomplete returns true for nodes with no IP address. func (n *Node) Incomplete() bool { return n.IP == nil @@ -326,14 +309,6 @@ func (n NodeID) Pubkey() (*ecdsa.PublicKey, error) { return p, nil } -func (id NodeID) mustPubkey() ecdsa.PublicKey { - pk, err := id.Pubkey() - if err != nil { - panic(err) - } - return *pk -} - // recoverNodeID computes the public key used to sign the // given hash from the signature. func recoverNodeID(hash, sig []byte) (id NodeID, err error) { diff --git a/p2p/discv5/node_test.go b/p2p/discv5/node_test.go index 52c2d67437d0..c231345db2e4 100644 --- a/p2p/discv5/node_test.go +++ b/p2p/discv5/node_test.go @@ -27,8 +27,8 @@ import ( "testing/quick" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" ) func ExampleNewNode() { @@ -152,7 +152,7 @@ func TestParseNode(t *testing.T) { if err == nil { t.Errorf("test %q:\n got nil error, expected %#q", test.rawurl, test.wantError) continue - } else if err.Error() != test.wantError { + } else if !strings.Contains(err.Error(), test.wantError) { t.Errorf("test %q:\n got error %#q, expected %#q", test.rawurl, err.Error(), test.wantError) continue } diff --git a/p2p/discv5/ntp.go b/p2p/discv5/ntp.go deleted file mode 100644 index 2eecc04ed7ec..000000000000 --- a/p2p/discv5/ntp.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Contains the NTP time drift detection via the SNTP protocol: -// https://tools.ietf.org/html/rfc4330 - -package discv5 - -import ( - "fmt" - "net" - "sort" - "strings" - "time" - - "github.com/nebulaai/nbai-node/log" -) - -const ( - ntpPool = "pool.ntp.org" // ntpPool is the NTP server to query for the current time - ntpChecks = 3 // Number of measurements to do against the NTP server -) - -// durationSlice attaches the methods of sort.Interface to []time.Duration, -// sorting in increasing order. -type durationSlice []time.Duration - -func (s durationSlice) Len() int { return len(s) } -func (s durationSlice) Less(i, j int) bool { return s[i] < s[j] } -func (s durationSlice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -// checkClockDrift queries an NTP server for clock drifts and warns the user if -// one large enough is detected. -func checkClockDrift() { - drift, err := sntpDrift(ntpChecks) - if err != nil { - return - } - if drift < -driftThreshold || drift > driftThreshold { - warning := fmt.Sprintf("System clock seems off by %v, which can prevent network connectivity", drift) - howtofix := fmt.Sprintf("Please enable network time synchronisation in system settings") - separator := strings.Repeat("-", len(warning)) - - log.Warn(separator) - log.Warn(warning) - log.Warn(howtofix) - log.Warn(separator) - } else { - log.Debug(fmt.Sprintf("Sanity NTP check reported %v drift, all ok", drift)) - } -} - -// sntpDrift does a naive time resolution against an NTP server and returns the -// measured drift. This method uses the simple version of NTP. It's not precise -// but should be fine for these purposes. -// -// Note, it executes two extra measurements compared to the number of requested -// ones to be able to discard the two extremes as outliers. -func sntpDrift(measurements int) (time.Duration, error) { - // Resolve the address of the NTP server - addr, err := net.ResolveUDPAddr("udp", ntpPool+":123") - if err != nil { - return 0, err - } - // Construct the time request (empty package with only 2 fields set): - // Bits 3-5: Protocol version, 3 - // Bits 6-8: Mode of operation, client, 3 - request := make([]byte, 48) - request[0] = 3<<3 | 3 - - // Execute each of the measurements - drifts := []time.Duration{} - for i := 0; i < measurements+2; i++ { - // Dial the NTP server and send the time retrieval request - conn, err := net.DialUDP("udp", nil, addr) - if err != nil { - return 0, err - } - defer conn.Close() - - sent := time.Now() - if _, err = conn.Write(request); err != nil { - return 0, err - } - // Retrieve the reply and calculate the elapsed time - conn.SetDeadline(time.Now().Add(5 * time.Second)) - - reply := make([]byte, 48) - if _, err = conn.Read(reply); err != nil { - return 0, err - } - elapsed := time.Since(sent) - - // Reconstruct the time from the reply data - sec := uint64(reply[43]) | uint64(reply[42])<<8 | uint64(reply[41])<<16 | uint64(reply[40])<<24 - frac := uint64(reply[47]) | uint64(reply[46])<<8 | uint64(reply[45])<<16 | uint64(reply[44])<<24 - - nanosec := sec*1e9 + (frac*1e9)>>32 - - t := time.Date(1900, 1, 1, 0, 0, 0, 0, time.UTC).Add(time.Duration(nanosec)).Local() - - // Calculate the drift based on an assumed answer time of RRT/2 - drifts = append(drifts, sent.Sub(t)+elapsed/2) - } - // Calculate average drif (drop two extremities to avoid outliers) - sort.Sort(durationSlice(drifts)) - - drift := time.Duration(0) - for i := 1; i < len(drifts)-1; i++ { - drift += drifts[i] - } - return drift / time.Duration(measurements), nil -} diff --git a/p2p/discv5/sim_test.go b/p2p/discv5/sim_test.go index afd12c44151e..aac26d9c4e34 100644 --- a/p2p/discv5/sim_test.go +++ b/p2p/discv5/sim_test.go @@ -28,7 +28,7 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) // In this test, nodes try to randomly resolve each other. @@ -50,7 +50,7 @@ func TestSimRandomResolve(t *testing.T) { if err := net.SetFallbackNodes([]*Node{bootnode.Self()}); err != nil { panic(err) } - fmt.Printf("launched @ %v: %x\n", time.Now(), net.Self().ID[:16]) + t.Logf("launched @ %v: %x\n", time.Now(), net.Self().ID[:16]) } }() @@ -294,15 +294,6 @@ func (s *simulation) launchNode(log bool) *Network { return net } -func (s *simulation) dropNode(id NodeID) { - s.mu.Lock() - n := s.nodes[id] - delete(s.nodes, id) - s.mu.Unlock() - - n.Close() -} - type simTransport struct { joinTime time.Time sender NodeID @@ -358,22 +349,6 @@ func (st *simTransport) sendPing(remote *Node, remoteAddr *net.UDPAddr, topics [ return hash } -func (st *simTransport) sendPong(remote *Node, pingHash []byte) { - raddr := remote.addr() - - st.sendPacket(remote.ID, ingressPacket{ - remoteID: st.sender, - remoteAddr: st.senderAddr, - hash: st.nextHash(), - ev: pongPacket, - data: &pong{ - To: rpcEndpoint{IP: raddr.IP, UDP: uint16(raddr.Port), TCP: 30303}, - ReplyTok: pingHash, - Expiration: uint64(time.Now().Unix() + int64(expiration)), - }, - }) -} - func (st *simTransport) sendFindnodeHash(remote *Node, target common.Hash) { st.sendPacket(remote.ID, ingressPacket{ remoteID: st.sender, diff --git a/p2p/discv5/table.go b/p2p/discv5/table.go index 6c210e54052b..64c3ecd1c7b2 100644 --- a/p2p/discv5/table.go +++ b/p2p/discv5/table.go @@ -14,12 +14,8 @@ // You should have received a copy of the GNU Lesser General Public License // along with the go-ethereum library. If not, see . -// Package discv5 implements the RLPx v5 Topic Discovery Protocol. -// -// The Topic Discovery protocol provides a way to find RLPx nodes that -// can be connected to. It uses a Kademlia-like protocol to maintain a -// distributed database of the IDs and endpoints of all listening -// nodes. +// Package discv5 is a prototype implementation of Discvery v5. +// Deprecated: do not use this package. package discv5 import ( @@ -29,7 +25,7 @@ import ( "net" "sort" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) const ( diff --git a/p2p/discv5/table_test.go b/p2p/discv5/table_test.go index 7e64b444e715..872a4f68367e 100644 --- a/p2p/discv5/table_test.go +++ b/p2p/discv5/table_test.go @@ -27,76 +27,10 @@ import ( "testing/quick" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" ) -type nullTransport struct{} - -func (nullTransport) sendPing(remote *Node, remoteAddr *net.UDPAddr) []byte { return []byte{1} } -func (nullTransport) sendPong(remote *Node, pingHash []byte) {} -func (nullTransport) sendFindnode(remote *Node, target NodeID) {} -func (nullTransport) sendNeighbours(remote *Node, nodes []*Node) {} -func (nullTransport) localAddr() *net.UDPAddr { return new(net.UDPAddr) } -func (nullTransport) Close() {} - -// func TestTable_pingReplace(t *testing.T) { -// doit := func(newNodeIsResponding, lastInBucketIsResponding bool) { -// transport := newPingRecorder() -// tab, _ := newTable(transport, NodeID{}, &net.UDPAddr{}) -// defer tab.Close() -// pingSender := NewNode(MustHexID("a502af0f59b2aab7746995408c79e9ca312d2793cc997e44fc55eda62f0150bbb8c59a6f9269ba3a081518b62699ee807c7c19c20125ddfccca872608af9e370"), net.IP{}, 99, 99) -// -// // fill up the sender's bucket. -// last := fillBucket(tab, 253) -// -// // this call to bond should replace the last node -// // in its bucket if the node is not responding. -// transport.responding[last.ID] = lastInBucketIsResponding -// transport.responding[pingSender.ID] = newNodeIsResponding -// tab.bond(true, pingSender.ID, &net.UDPAddr{}, 0) -// -// // first ping goes to sender (bonding pingback) -// if !transport.pinged[pingSender.ID] { -// t.Error("table did not ping back sender") -// } -// if newNodeIsResponding { -// // second ping goes to oldest node in bucket -// // to see whether it is still alive. -// if !transport.pinged[last.ID] { -// t.Error("table did not ping last node in bucket") -// } -// } -// -// tab.mutex.Lock() -// defer tab.mutex.Unlock() -// if l := len(tab.buckets[253].entries); l != bucketSize { -// t.Errorf("wrong bucket size after bond: got %d, want %d", l, bucketSize) -// } -// -// if lastInBucketIsResponding || !newNodeIsResponding { -// if !contains(tab.buckets[253].entries, last.ID) { -// t.Error("last entry was removed") -// } -// if contains(tab.buckets[253].entries, pingSender.ID) { -// t.Error("new entry was added") -// } -// } else { -// if contains(tab.buckets[253].entries, last.ID) { -// t.Error("last entry was not removed") -// } -// if !contains(tab.buckets[253].entries, pingSender.ID) { -// t.Error("new entry was not added") -// } -// } -// } -// -// doit(true, true) -// doit(false, true) -// doit(true, false) -// doit(false, false) -// } - func TestBucket_bumpNoDuplicates(t *testing.T) { t.Parallel() cfg := &quick.Config{ @@ -139,17 +73,6 @@ func TestBucket_bumpNoDuplicates(t *testing.T) { } } -// fillBucket inserts nodes into the given bucket until -// it is full. The node's IDs dont correspond to their -// hashes. -func fillBucket(tab *Table, ld int) (last *Node) { - b := tab.buckets[ld] - for len(b.entries) < bucketSize { - b.entries = append(b.entries, nodeAtDistance(tab.self.sha, ld)) - } - return b.entries[bucketSize-1] -} - // nodeAtDistance creates a node for which logdist(base, n.sha) == ld. // The node's ID does not correspond to n.sha. func nodeAtDistance(base common.Hash, ld int) (n *Node) { @@ -159,28 +82,6 @@ func nodeAtDistance(base common.Hash, ld int) (n *Node) { return n } -type pingRecorder struct{ responding, pinged map[NodeID]bool } - -func newPingRecorder() *pingRecorder { - return &pingRecorder{make(map[NodeID]bool), make(map[NodeID]bool)} -} - -func (t *pingRecorder) findnode(toid NodeID, toaddr *net.UDPAddr, target NodeID) ([]*Node, error) { - panic("findnode called on pingRecorder") -} -func (t *pingRecorder) close() {} -func (t *pingRecorder) waitping(from NodeID) error { - return nil // remote always pings -} -func (t *pingRecorder) ping(toid NodeID, toaddr *net.UDPAddr) error { - t.pinged[toid] = true - if t.responding[toid] { - return nil - } else { - return errTimeout - } -} - func TestTable_closest(t *testing.T) { t.Parallel() diff --git a/p2p/discv5/ticket.go b/p2p/discv5/ticket.go index ebbe869382a3..c5e3d6c08f93 100644 --- a/p2p/discv5/ticket.go +++ b/p2p/discv5/ticket.go @@ -22,19 +22,16 @@ import ( "fmt" "math" "math/rand" - "sort" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/mclock" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" ) const ( ticketTimeBucketLen = time.Minute - timeWindow = 10 // * ticketTimeBucketLen - wantTicketsInWindow = 10 collectFrequency = time.Second * 30 registerFrequency = time.Second * 60 maxCollectDebt = 10 @@ -139,7 +136,6 @@ type ticketStore struct { lastBucketFetched timeBucket nextTicketCached *ticketRef - nextTicketReg mclock.AbsTime searchTopicMap map[Topic]searchTopic nextTopicQueryCleanup mclock.AbsTime @@ -268,57 +264,6 @@ func (s *ticketStore) nextSearchLookup(topic Topic) lookupInfo { return target } -// ticketsInWindow returns the tickets of a given topic in the registration window. -func (s *ticketStore) ticketsInWindow(topic Topic) []ticketRef { - // Sanity check that the topic still exists before operating on it - if s.tickets[topic] == nil { - log.Warn("Listing non-existing discovery tickets", "topic", topic) - return nil - } - // Gather all the tickers in the next time window - var tickets []ticketRef - - buckets := s.tickets[topic].buckets - for idx := timeBucket(0); idx < timeWindow; idx++ { - tickets = append(tickets, buckets[s.lastBucketFetched+idx]...) - } - log.Trace("Retrieved discovery registration tickets", "topic", topic, "from", s.lastBucketFetched, "tickets", len(tickets)) - return tickets -} - -func (s *ticketStore) removeExcessTickets(t Topic) { - tickets := s.ticketsInWindow(t) - if len(tickets) <= wantTicketsInWindow { - return - } - sort.Sort(ticketRefByWaitTime(tickets)) - for _, r := range tickets[wantTicketsInWindow:] { - s.removeTicketRef(r) - } -} - -type ticketRefByWaitTime []ticketRef - -// Len is the number of elements in the collection. -func (s ticketRefByWaitTime) Len() int { - return len(s) -} - -func (ref ticketRef) waitTime() mclock.AbsTime { - return ref.t.regTime[ref.idx] - ref.t.issueTime -} - -// Less reports whether the element with -// index i should sort before the element with index j. -func (s ticketRefByWaitTime) Less(i, j int) bool { - return s[i].waitTime() < s[j].waitTime() -} - -// Swap swaps the elements with indexes i and j. -func (s ticketRefByWaitTime) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - func (s *ticketStore) addTicketRef(r ticketRef) { topic := r.t.topics[r.idx] tickets := s.tickets[topic] @@ -565,15 +510,6 @@ func (s *ticketStore) addTicket(localTime mclock.AbsTime, pingHash []byte, ticke } } -func (s *ticketStore) getNodeTicket(node *Node) *ticket { - if s.nodes[node] == nil { - log.Trace("Retrieving node ticket", "node", node.ID, "serial", nil) - } else { - log.Trace("Retrieving node ticket", "node", node.ID, "serial", s.nodes[node].serial) - } - return s.nodes[node] -} - func (s *ticketStore) canQueryTopic(node *Node, topic Topic) bool { qq := s.queriesSent[node] if qq != nil { @@ -770,12 +706,6 @@ func globalRandRead(b []byte) { } } -func (r *topicRadius) isInRadius(addrHash common.Hash) bool { - nodePrefix := binary.BigEndian.Uint64(addrHash[0:8]) - dist := nodePrefix ^ r.topicHashPrefix - return dist < r.radius -} - func (r *topicRadius) chooseLookupBucket(a, b int) int { if a < 0 { a = 0 diff --git a/p2p/discv5/topic.go b/p2p/discv5/topic.go index e3e826e38f6c..609a41297f85 100644 --- a/p2p/discv5/topic.go +++ b/p2p/discv5/topic.go @@ -23,8 +23,8 @@ import ( "math/rand" "time" - "github.com/nebulaai/nbai-node/common/mclock" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/log" ) const ( diff --git a/p2p/discv5/topic_test.go b/p2p/discv5/topic_test.go index e155951325fc..ba79993f29e9 100644 --- a/p2p/discv5/topic_test.go +++ b/p2p/discv5/topic_test.go @@ -21,8 +21,8 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/mclock" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" ) func TestTopicRadius(t *testing.T) { diff --git a/p2p/discv5/udp.go b/p2p/discv5/udp.go index d209ace0ee3b..088f95cac6a2 100644 --- a/p2p/discv5/udp.go +++ b/p2p/discv5/udp.go @@ -24,12 +24,11 @@ import ( "net" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/nat" - "github.com/nebulaai/nbai-node/p2p/netutil" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/netutil" + "github.com/ethereum/go-ethereum/rlp" ) const Version = 4 @@ -38,15 +37,12 @@ const Version = 4 var ( errPacketTooSmall = errors.New("too small") errBadPrefix = errors.New("bad prefix") - errTimeout = errors.New("RPC timeout") ) // Timeouts const ( respTimeout = 500 * time.Millisecond expiration = 20 * time.Second - - driftThreshold = 10 * time.Second // Allowed clock drift before warning user ) // RPC request structures @@ -187,10 +183,6 @@ func makeEndpoint(addr *net.UDPAddr, tcpPort uint16) rpcEndpoint { return rpcEndpoint{IP: ip, UDP: uint16(addr.Port), TCP: tcpPort} } -func (e1 rpcEndpoint) equal(e2 rpcEndpoint) bool { - return e1.UDP == e2.UDP && e1.TCP == e2.TCP && e1.IP.Equal(e2.IP) -} - func nodeFromRPC(sender *net.UDPAddr, rn rpcNode) (*Node, error) { if err := netutil.CheckRelayIP(sender.IP, rn.IP); err != nil { return nil, err @@ -225,7 +217,6 @@ type udp struct { conn conn priv *ecdsa.PrivateKey ourEndpoint rpcEndpoint - nat nat.Interface net *Network } @@ -274,13 +265,6 @@ func (t *udp) sendPing(remote *Node, toaddr *net.UDPAddr, topics []Topic) (hash return hash } -func (t *udp) sendFindnode(remote *Node, target NodeID) { - t.sendPacket(remote.ID, remote.addr(), byte(findnodePacket), findnode{ - Target: target, - Expiration: uint64(time.Now().Add(expiration).Unix()), - }) -} - func (t *udp) sendNeighbours(remote *Node, results []*Node) { // Send neighbors in chunks with at most maxNeighbors per packet // to stay below the 1280 byte limit. diff --git a/p2p/discv5/udp_test.go b/p2p/discv5/udp_test.go deleted file mode 100644 index 4751a7643e0d..000000000000 --- a/p2p/discv5/udp_test.go +++ /dev/null @@ -1,450 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package discv5 - -import ( - "encoding/hex" - "errors" - "io" - "net" - "reflect" - "sync" - "testing" - - "github.com/davecgh/go-spew/spew" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/rlp" -) - -func init() { - spew.Config.DisableMethods = true -} - -// shared test variables -var ( - testLocal = rpcEndpoint{IP: net.ParseIP("3.3.3.3").To4(), UDP: 5, TCP: 6} -) - -// type udpTest struct { -// t *testing.T -// pipe *dgramPipe -// table *Table -// udp *udp -// sent [][]byte -// localkey, remotekey *ecdsa.PrivateKey -// remoteaddr *net.UDPAddr -// } -// -// func newUDPTest(t *testing.T) *udpTest { -// test := &udpTest{ -// t: t, -// pipe: newpipe(), -// localkey: newkey(), -// remotekey: newkey(), -// remoteaddr: &net.UDPAddr{IP: net.IP{1, 2, 3, 4}, Port: 30303}, -// } -// test.table, test.udp, _ = newUDP(test.localkey, test.pipe, nil, "") -// return test -// } -// -// // handles a packet as if it had been sent to the transport. -// func (test *udpTest) packetIn(wantError error, ptype byte, data packet) error { -// enc, err := encodePacket(test.remotekey, ptype, data) -// if err != nil { -// return test.errorf("packet (%d) encode error: %v", ptype, err) -// } -// test.sent = append(test.sent, enc) -// if err = test.udp.handlePacket(test.remoteaddr, enc); err != wantError { -// return test.errorf("error mismatch: got %q, want %q", err, wantError) -// } -// return nil -// } -// -// // waits for a packet to be sent by the transport. -// // validate should have type func(*udpTest, X) error, where X is a packet type. -// func (test *udpTest) waitPacketOut(validate interface{}) error { -// dgram := test.pipe.waitPacketOut() -// p, _, _, err := decodePacket(dgram) -// if err != nil { -// return test.errorf("sent packet decode error: %v", err) -// } -// fn := reflect.ValueOf(validate) -// exptype := fn.Type().In(0) -// if reflect.TypeOf(p) != exptype { -// return test.errorf("sent packet type mismatch, got: %v, want: %v", reflect.TypeOf(p), exptype) -// } -// fn.Call([]reflect.Value{reflect.ValueOf(p)}) -// return nil -// } -// -// func (test *udpTest) errorf(format string, args ...interface{}) error { -// _, file, line, ok := runtime.Caller(2) // errorf + waitPacketOut -// if ok { -// file = filepath.Base(file) -// } else { -// file = "???" -// line = 1 -// } -// err := fmt.Errorf(format, args...) -// fmt.Printf("\t%s:%d: %v\n", file, line, err) -// test.t.Fail() -// return err -// } -// -// func TestUDP_packetErrors(t *testing.T) { -// test := newUDPTest(t) -// defer test.table.Close() -// -// test.packetIn(errExpired, pingPacket, &ping{From: testRemote, To: testLocalAnnounced, Version: Version}) -// test.packetIn(errUnsolicitedReply, pongPacket, &pong{ReplyTok: []byte{}, Expiration: futureExp}) -// test.packetIn(errUnknownNode, findnodePacket, &findnode{Expiration: futureExp}) -// test.packetIn(errUnsolicitedReply, neighborsPacket, &neighbors{Expiration: futureExp}) -// } -// -// func TestUDP_findnode(t *testing.T) { -// test := newUDPTest(t) -// defer test.table.Close() -// -// // put a few nodes into the table. their exact -// // distribution shouldn't matter much, although we need to -// // take care not to overflow any bucket. -// targetHash := crypto.Keccak256Hash(testTarget[:]) -// nodes := &nodesByDistance{target: targetHash} -// for i := 0; i < bucketSize; i++ { -// nodes.push(nodeAtDistance(test.table.self.sha, i+2), bucketSize) -// } -// test.table.stuff(nodes.entries) -// -// // ensure there's a bond with the test node, -// // findnode won't be accepted otherwise. -// test.table.db.updateNode(NewNode( -// PubkeyID(&test.remotekey.PublicKey), -// test.remoteaddr.IP, -// uint16(test.remoteaddr.Port), -// 99, -// )) -// // check that closest neighbors are returned. -// test.packetIn(nil, findnodePacket, &findnode{Target: testTarget, Expiration: futureExp}) -// expected := test.table.closest(targetHash, bucketSize) -// -// waitNeighbors := func(want []*Node) { -// test.waitPacketOut(func(p *neighbors) { -// if len(p.Nodes) != len(want) { -// t.Errorf("wrong number of results: got %d, want %d", len(p.Nodes), bucketSize) -// } -// for i := range p.Nodes { -// if p.Nodes[i].ID != want[i].ID { -// t.Errorf("result mismatch at %d:\n got: %v\n want: %v", i, p.Nodes[i], expected.entries[i]) -// } -// } -// }) -// } -// waitNeighbors(expected.entries[:maxNeighbors]) -// waitNeighbors(expected.entries[maxNeighbors:]) -// } -// -// func TestUDP_findnodeMultiReply(t *testing.T) { -// test := newUDPTest(t) -// defer test.table.Close() -// -// // queue a pending findnode request -// resultc, errc := make(chan []*Node), make(chan error) -// go func() { -// rid := PubkeyID(&test.remotekey.PublicKey) -// ns, err := test.udp.findnode(rid, test.remoteaddr, testTarget) -// if err != nil && len(ns) == 0 { -// errc <- err -// } else { -// resultc <- ns -// } -// }() -// -// // wait for the findnode to be sent. -// // after it is sent, the transport is waiting for a reply -// test.waitPacketOut(func(p *findnode) { -// if p.Target != testTarget { -// t.Errorf("wrong target: got %v, want %v", p.Target, testTarget) -// } -// }) -// -// // send the reply as two packets. -// list := []*Node{ -// MustParseNode("enode://ba85011c70bcc5c04d8607d3a0ed29aa6179c092cbdda10d5d32684fb33ed01bd94f588ca8f91ac48318087dcb02eaf36773a7a453f0eedd6742af668097b29c@10.0.1.16:30303?discport=30304"), -// MustParseNode("enode://81fa361d25f157cd421c60dcc28d8dac5ef6a89476633339c5df30287474520caca09627da18543d9079b5b288698b542d56167aa5c09111e55acdbbdf2ef799@10.0.1.16:30303"), -// MustParseNode("enode://9bffefd833d53fac8e652415f4973bee289e8b1a5c6c4cbe70abf817ce8a64cee11b823b66a987f51aaa9fba0d6a91b3e6bf0d5a5d1042de8e9eeea057b217f8@10.0.1.36:30301?discport=17"), -// MustParseNode("enode://1b5b4aa662d7cb44a7221bfba67302590b643028197a7d5214790f3bac7aaa4a3241be9e83c09cf1f6c69d007c634faae3dc1b1221793e8446c0b3a09de65960@10.0.1.16:30303"), -// } -// rpclist := make([]rpcNode, len(list)) -// for i := range list { -// rpclist[i] = nodeToRPC(list[i]) -// } -// test.packetIn(nil, neighborsPacket, &neighbors{Expiration: futureExp, Nodes: rpclist[:2]}) -// test.packetIn(nil, neighborsPacket, &neighbors{Expiration: futureExp, Nodes: rpclist[2:]}) -// -// // check that the sent neighbors are all returned by findnode -// select { -// case result := <-resultc: -// if !reflect.DeepEqual(result, list) { -// t.Errorf("neighbors mismatch:\n got: %v\n want: %v", result, list) -// } -// case err := <-errc: -// t.Errorf("findnode error: %v", err) -// case <-time.After(5 * time.Second): -// t.Error("findnode did not return within 5 seconds") -// } -// } -// -// func TestUDP_successfulPing(t *testing.T) { -// test := newUDPTest(t) -// added := make(chan *Node, 1) -// test.table.nodeAddedHook = func(n *Node) { added <- n } -// defer test.table.Close() -// -// // The remote side sends a ping packet to initiate the exchange. -// go test.packetIn(nil, pingPacket, &ping{From: testRemote, To: testLocalAnnounced, Version: Version, Expiration: futureExp}) -// -// // the ping is replied to. -// test.waitPacketOut(func(p *pong) { -// pinghash := test.sent[0][:macSize] -// if !bytes.Equal(p.ReplyTok, pinghash) { -// t.Errorf("got pong.ReplyTok %x, want %x", p.ReplyTok, pinghash) -// } -// wantTo := rpcEndpoint{ -// // The mirrored UDP address is the UDP packet sender -// IP: test.remoteaddr.IP, UDP: uint16(test.remoteaddr.Port), -// // The mirrored TCP port is the one from the ping packet -// TCP: testRemote.TCP, -// } -// if !reflect.DeepEqual(p.To, wantTo) { -// t.Errorf("got pong.To %v, want %v", p.To, wantTo) -// } -// }) -// -// // remote is unknown, the table pings back. -// test.waitPacketOut(func(p *ping) error { -// if !reflect.DeepEqual(p.From, test.udp.ourEndpoint) { -// t.Errorf("got ping.From %v, want %v", p.From, test.udp.ourEndpoint) -// } -// wantTo := rpcEndpoint{ -// // The mirrored UDP address is the UDP packet sender. -// IP: test.remoteaddr.IP, UDP: uint16(test.remoteaddr.Port), -// TCP: 0, -// } -// if !reflect.DeepEqual(p.To, wantTo) { -// t.Errorf("got ping.To %v, want %v", p.To, wantTo) -// } -// return nil -// }) -// test.packetIn(nil, pongPacket, &pong{Expiration: futureExp}) -// -// // the node should be added to the table shortly after getting the -// // pong packet. -// select { -// case n := <-added: -// rid := PubkeyID(&test.remotekey.PublicKey) -// if n.ID != rid { -// t.Errorf("node has wrong ID: got %v, want %v", n.ID, rid) -// } -// if !bytes.Equal(n.IP, test.remoteaddr.IP) { -// t.Errorf("node has wrong IP: got %v, want: %v", n.IP, test.remoteaddr.IP) -// } -// if int(n.UDP) != test.remoteaddr.Port { -// t.Errorf("node has wrong UDP port: got %v, want: %v", n.UDP, test.remoteaddr.Port) -// } -// if n.TCP != testRemote.TCP { -// t.Errorf("node has wrong TCP port: got %v, want: %v", n.TCP, testRemote.TCP) -// } -// case <-time.After(2 * time.Second): -// t.Errorf("node was not added within 2 seconds") -// } -// } - -var testPackets = []struct { - input string - wantPacket interface{} -}{ - { - input: "71dbda3a79554728d4f94411e42ee1f8b0d561c10e1e5f5893367948c6a7d70bb87b235fa28a77070271b6c164a2dce8c7e13a5739b53b5e96f2e5acb0e458a02902f5965d55ecbeb2ebb6cabb8b2b232896a36b737666c55265ad0a68412f250001ea04cb847f000001820cfa8215a8d790000000000000000000000000000000018208ae820d058443b9a355", - wantPacket: &ping{ - Version: 4, - From: rpcEndpoint{net.ParseIP("127.0.0.1").To4(), 3322, 5544}, - To: rpcEndpoint{net.ParseIP("::1"), 2222, 3333}, - Expiration: 1136239445, - Rest: []rlp.RawValue{}, - }, - }, - { - input: "e9614ccfd9fc3e74360018522d30e1419a143407ffcce748de3e22116b7e8dc92ff74788c0b6663aaa3d67d641936511c8f8d6ad8698b820a7cf9e1be7155e9a241f556658c55428ec0563514365799a4be2be5a685a80971ddcfa80cb422cdd0101ec04cb847f000001820cfa8215a8d790000000000000000000000000000000018208ae820d058443b9a3550102", - wantPacket: &ping{ - Version: 4, - From: rpcEndpoint{net.ParseIP("127.0.0.1").To4(), 3322, 5544}, - To: rpcEndpoint{net.ParseIP("::1"), 2222, 3333}, - Expiration: 1136239445, - Rest: []rlp.RawValue{{0x01}, {0x02}}, - }, - }, - { - input: "577be4349c4dd26768081f58de4c6f375a7a22f3f7adda654d1428637412c3d7fe917cadc56d4e5e7ffae1dbe3efffb9849feb71b262de37977e7c7a44e677295680e9e38ab26bee2fcbae207fba3ff3d74069a50b902a82c9903ed37cc993c50001f83e82022bd79020010db83c4d001500000000abcdef12820cfa8215a8d79020010db885a308d313198a2e037073488208ae82823a8443b9a355c5010203040531b9019afde696e582a78fa8d95ea13ce3297d4afb8ba6433e4154caa5ac6431af1b80ba76023fa4090c408f6b4bc3701562c031041d4702971d102c9ab7fa5eed4cd6bab8f7af956f7d565ee1917084a95398b6a21eac920fe3dd1345ec0a7ef39367ee69ddf092cbfe5b93e5e568ebc491983c09c76d922dc3", - wantPacket: &ping{ - Version: 555, - From: rpcEndpoint{net.ParseIP("2001:db8:3c4d:15::abcd:ef12"), 3322, 5544}, - To: rpcEndpoint{net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), 2222, 33338}, - Expiration: 1136239445, - Rest: []rlp.RawValue{{0xC5, 0x01, 0x02, 0x03, 0x04, 0x05}}, - }, - }, - { - input: "09b2428d83348d27cdf7064ad9024f526cebc19e4958f0fdad87c15eb598dd61d08423e0bf66b2069869e1724125f820d851c136684082774f870e614d95a2855d000f05d1648b2d5945470bc187c2d2216fbe870f43ed0909009882e176a46b0102f846d79020010db885a308d313198a2e037073488208ae82823aa0fbc914b16819237dcd8801d7e53f69e9719adecb3cc0e790c57e91ca4461c9548443b9a355c6010203c2040506a0c969a58f6f9095004c0177a6b47f451530cab38966a25cca5cb58f055542124e", - wantPacket: &pong{ - To: rpcEndpoint{net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), 2222, 33338}, - ReplyTok: common.Hex2Bytes("fbc914b16819237dcd8801d7e53f69e9719adecb3cc0e790c57e91ca4461c954"), - Expiration: 1136239445, - Rest: []rlp.RawValue{{0xC6, 0x01, 0x02, 0x03, 0xC2, 0x04, 0x05}, {0x06}}, - }, - }, - { - input: "c7c44041b9f7c7e41934417ebac9a8e1a4c6298f74553f2fcfdcae6ed6fe53163eb3d2b52e39fe91831b8a927bf4fc222c3902202027e5e9eb812195f95d20061ef5cd31d502e47ecb61183f74a504fe04c51e73df81f25c4d506b26db4517490103f84eb840ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31387574077f301b421bc84df7266c44e9e6d569fc56be00812904767bf5ccd1fc7f8443b9a35582999983999999280dc62cc8255c73471e0a61da0c89acdc0e035e260add7fc0c04ad9ebf3919644c91cb247affc82b69bd2ca235c71eab8e49737c937a2c396", - wantPacket: &findnode{ - Target: MustHexID("ca634cae0d49acb401d8a4c6b6fe8c55b70d115bf400769cc1400f3258cd31387574077f301b421bc84df7266c44e9e6d569fc56be00812904767bf5ccd1fc7f"), - Expiration: 1136239445, - Rest: []rlp.RawValue{{0x82, 0x99, 0x99}, {0x83, 0x99, 0x99, 0x99}}, - }, - }, - { - input: "c679fc8fe0b8b12f06577f2e802d34f6fa257e6137a995f6f4cbfc9ee50ed3710faf6e66f932c4c8d81d64343f429651328758b47d3dbc02c4042f0fff6946a50f4a49037a72bb550f3a7872363a83e1b9ee6469856c24eb4ef80b7535bcf99c0004f9015bf90150f84d846321163782115c82115db8403155e1427f85f10a5c9a7755877748041af1bcd8d474ec065eb33df57a97babf54bfd2103575fa829115d224c523596b401065a97f74010610fce76382c0bf32f84984010203040101b840312c55512422cf9b8a4097e9a6ad79402e87a15ae909a4bfefa22398f03d20951933beea1e4dfa6f968212385e829f04c2d314fc2d4e255e0d3bc08792b069dbf8599020010db83c4d001500000000abcdef12820d05820d05b84038643200b172dcfef857492156971f0e6aa2c538d8b74010f8e140811d53b98c765dd2d96126051913f44582e8c199ad7c6d6819e9a56483f637feaac9448aacf8599020010db885a308d313198a2e037073488203e78203e8b8408dcab8618c3253b558d459da53bd8fa68935a719aff8b811197101a4b2b47dd2d47295286fc00cc081bb542d760717d1bdd6bec2c37cd72eca367d6dd3b9df738443b9a355010203b525a138aa34383fec3d2719a0", - wantPacket: &neighbors{ - Nodes: []rpcNode{ - { - ID: MustHexID("3155e1427f85f10a5c9a7755877748041af1bcd8d474ec065eb33df57a97babf54bfd2103575fa829115d224c523596b401065a97f74010610fce76382c0bf32"), - IP: net.ParseIP("99.33.22.55").To4(), - UDP: 4444, - TCP: 4445, - }, - { - ID: MustHexID("312c55512422cf9b8a4097e9a6ad79402e87a15ae909a4bfefa22398f03d20951933beea1e4dfa6f968212385e829f04c2d314fc2d4e255e0d3bc08792b069db"), - IP: net.ParseIP("1.2.3.4").To4(), - UDP: 1, - TCP: 1, - }, - { - ID: MustHexID("38643200b172dcfef857492156971f0e6aa2c538d8b74010f8e140811d53b98c765dd2d96126051913f44582e8c199ad7c6d6819e9a56483f637feaac9448aac"), - IP: net.ParseIP("2001:db8:3c4d:15::abcd:ef12"), - UDP: 3333, - TCP: 3333, - }, - { - ID: MustHexID("8dcab8618c3253b558d459da53bd8fa68935a719aff8b811197101a4b2b47dd2d47295286fc00cc081bb542d760717d1bdd6bec2c37cd72eca367d6dd3b9df73"), - IP: net.ParseIP("2001:db8:85a3:8d3:1319:8a2e:370:7348"), - UDP: 999, - TCP: 1000, - }, - }, - Expiration: 1136239445, - Rest: []rlp.RawValue{{0x01}, {0x02}, {0x03}}, - }, - }, -} - -func TestForwardCompatibility(t *testing.T) { - t.Skip("skipped while working on discovery v5") - - testkey, _ := crypto.HexToECDSA("b71c71a67e1177ad4e901695e1b4b9ee17ae16c6668d313eac2f96dbcda3f291") - wantNodeID := PubkeyID(&testkey.PublicKey) - - for _, test := range testPackets { - input, err := hex.DecodeString(test.input) - if err != nil { - t.Fatalf("invalid hex: %s", test.input) - } - var pkt ingressPacket - if err := decodePacket(input, &pkt); err != nil { - t.Errorf("did not accept packet %s\n%v", test.input, err) - continue - } - if !reflect.DeepEqual(pkt.data, test.wantPacket) { - t.Errorf("got %s\nwant %s", spew.Sdump(pkt.data), spew.Sdump(test.wantPacket)) - } - if pkt.remoteID != wantNodeID { - t.Errorf("got id %v\nwant id %v", pkt.remoteID, wantNodeID) - } - } -} - -// dgramPipe is a fake UDP socket. It queues all sent datagrams. -type dgramPipe struct { - mu *sync.Mutex - cond *sync.Cond - closing chan struct{} - closed bool - queue [][]byte -} - -func newpipe() *dgramPipe { - mu := new(sync.Mutex) - return &dgramPipe{ - closing: make(chan struct{}), - cond: &sync.Cond{L: mu}, - mu: mu, - } -} - -// WriteToUDP queues a datagram. -func (c *dgramPipe) WriteToUDP(b []byte, to *net.UDPAddr) (n int, err error) { - msg := make([]byte, len(b)) - copy(msg, b) - c.mu.Lock() - defer c.mu.Unlock() - if c.closed { - return 0, errors.New("closed") - } - c.queue = append(c.queue, msg) - c.cond.Signal() - return len(b), nil -} - -// ReadFromUDP just hangs until the pipe is closed. -func (c *dgramPipe) ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) { - <-c.closing - return 0, nil, io.EOF -} - -func (c *dgramPipe) Close() error { - c.mu.Lock() - defer c.mu.Unlock() - if !c.closed { - close(c.closing) - c.closed = true - } - return nil -} - -func (c *dgramPipe) LocalAddr() net.Addr { - return &net.UDPAddr{IP: testLocal.IP, Port: int(testLocal.UDP)} -} - -func (c *dgramPipe) waitPacketOut() []byte { - c.mu.Lock() - defer c.mu.Unlock() - for len(c.queue) == 0 { - c.cond.Wait() - } - p := c.queue[0] - copy(c.queue, c.queue[1:]) - c.queue = c.queue[:len(c.queue)-1] - return p -} diff --git a/p2p/dnsdisc/client.go b/p2p/dnsdisc/client.go new file mode 100644 index 000000000000..677c0aa92299 --- /dev/null +++ b/p2p/dnsdisc/client.go @@ -0,0 +1,260 @@ +// Copyright 2018 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 dnsdisc + +import ( + "bytes" + "context" + "fmt" + "math/rand" + "net" + "strings" + "time" + + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" + lru "github.com/hashicorp/golang-lru" +) + +// Client discovers nodes by querying DNS servers. +type Client struct { + cfg Config + clock mclock.Clock + linkCache linkCache + trees map[string]*clientTree + + entries *lru.Cache +} + +// Config holds configuration options for the client. +type Config struct { + Timeout time.Duration // timeout used for DNS lookups (default 5s) + RecheckInterval time.Duration // time between tree root update checks (default 30min) + CacheLimit int // maximum number of cached records (default 1000) + ValidSchemes enr.IdentityScheme // acceptable ENR identity schemes (default enode.ValidSchemes) + Resolver Resolver // the DNS resolver to use (defaults to system DNS) + Logger log.Logger // destination of client log messages (defaults to root logger) +} + +// Resolver is a DNS resolver that can query TXT records. +type Resolver interface { + LookupTXT(ctx context.Context, domain string) ([]string, error) +} + +func (cfg Config) withDefaults() Config { + const ( + defaultTimeout = 5 * time.Second + defaultRecheck = 30 * time.Minute + defaultCache = 1000 + ) + if cfg.Timeout == 0 { + cfg.Timeout = defaultTimeout + } + if cfg.RecheckInterval == 0 { + cfg.RecheckInterval = defaultRecheck + } + if cfg.CacheLimit == 0 { + cfg.CacheLimit = defaultCache + } + if cfg.ValidSchemes == nil { + cfg.ValidSchemes = enode.ValidSchemes + } + if cfg.Resolver == nil { + cfg.Resolver = new(net.Resolver) + } + if cfg.Logger == nil { + cfg.Logger = log.Root() + } + return cfg +} + +// NewClient creates a client. +func NewClient(cfg Config, urls ...string) (*Client, error) { + c := &Client{ + cfg: cfg.withDefaults(), + clock: mclock.System{}, + trees: make(map[string]*clientTree), + } + var err error + if c.entries, err = lru.New(c.cfg.CacheLimit); err != nil { + return nil, err + } + for _, url := range urls { + if err := c.AddTree(url); err != nil { + return nil, err + } + } + return c, nil +} + +// SyncTree downloads the entire node tree at the given URL. This doesn't add the tree for +// later use, but any previously-synced entries are reused. +func (c *Client) SyncTree(url string) (*Tree, error) { + le, err := parseLink(url) + if err != nil { + return nil, fmt.Errorf("invalid enrtree URL: %v", err) + } + ct := newClientTree(c, le) + t := &Tree{entries: make(map[string]entry)} + if err := ct.syncAll(t.entries); err != nil { + return nil, err + } + t.root = ct.root + return t, nil +} + +// AddTree adds a enrtree:// URL to crawl. +func (c *Client) AddTree(url string) error { + le, err := parseLink(url) + if err != nil { + return fmt.Errorf("invalid enrtree URL: %v", err) + } + ct, err := c.ensureTree(le) + if err != nil { + return err + } + c.linkCache.add(ct) + return nil +} + +func (c *Client) ensureTree(le *linkEntry) (*clientTree, error) { + if tree, ok := c.trees[le.domain]; ok { + if !tree.matchPubkey(le.pubkey) { + return nil, fmt.Errorf("conflicting public keys for domain %q", le.domain) + } + return tree, nil + } + ct := newClientTree(c, le) + c.trees[le.domain] = ct + return ct, nil +} + +// RandomNode retrieves the next random node. +func (c *Client) RandomNode(ctx context.Context) *enode.Node { + for { + ct := c.randomTree() + if ct == nil { + return nil + } + n, err := ct.syncRandom(ctx) + if err != nil { + if err == ctx.Err() { + return nil // context canceled. + } + c.cfg.Logger.Debug("Error in DNS random node sync", "tree", ct.loc.domain, "err", err) + continue + } + if n != nil { + return n + } + } +} + +// randomTree returns a random tree. +func (c *Client) randomTree() *clientTree { + if !c.linkCache.valid() { + c.gcTrees() + } + limit := rand.Intn(len(c.trees)) + for _, ct := range c.trees { + if limit == 0 { + return ct + } + limit-- + } + return nil +} + +// gcTrees rebuilds the 'trees' map. +func (c *Client) gcTrees() { + trees := make(map[string]*clientTree) + for t := range c.linkCache.all() { + trees[t.loc.domain] = t + } + c.trees = trees +} + +// resolveRoot retrieves a root entry via DNS. +func (c *Client) resolveRoot(ctx context.Context, loc *linkEntry) (rootEntry, error) { + txts, err := c.cfg.Resolver.LookupTXT(ctx, loc.domain) + c.cfg.Logger.Trace("Updating DNS discovery root", "tree", loc.domain, "err", err) + if err != nil { + return rootEntry{}, err + } + for _, txt := range txts { + if strings.HasPrefix(txt, rootPrefix) { + return parseAndVerifyRoot(txt, loc) + } + } + return rootEntry{}, nameError{loc.domain, errNoRoot} +} + +func parseAndVerifyRoot(txt string, loc *linkEntry) (rootEntry, error) { + e, err := parseRoot(txt) + if err != nil { + return e, err + } + if !e.verifySignature(loc.pubkey) { + return e, entryError{typ: "root", err: errInvalidSig} + } + return e, nil +} + +// resolveEntry retrieves an entry from the cache or fetches it from the network +// if it isn't cached. +func (c *Client) resolveEntry(ctx context.Context, domain, hash string) (entry, error) { + cacheKey := truncateHash(hash) + if e, ok := c.entries.Get(cacheKey); ok { + return e.(entry), nil + } + e, err := c.doResolveEntry(ctx, domain, hash) + if err != nil { + return nil, err + } + c.entries.Add(cacheKey, e) + return e, nil +} + +// doResolveEntry fetches an entry via DNS. +func (c *Client) doResolveEntry(ctx context.Context, domain, hash string) (entry, error) { + wantHash, err := b32format.DecodeString(hash) + if err != nil { + return nil, fmt.Errorf("invalid base32 hash") + } + name := hash + "." + domain + txts, err := c.cfg.Resolver.LookupTXT(ctx, hash+"."+domain) + c.cfg.Logger.Trace("DNS discovery lookup", "name", name, "err", err) + if err != nil { + return nil, err + } + for _, txt := range txts { + e, err := parseEntry(txt, c.cfg.ValidSchemes) + if err == errUnknownEntry { + continue + } + if !bytes.HasPrefix(crypto.Keccak256([]byte(txt)), wantHash) { + err = nameError{name, errHashMismatch} + } else if err != nil { + err = nameError{name, err} + } + return e, err + } + return nil, nameError{name, errNoEntry} +} diff --git a/p2p/dnsdisc/client_test.go b/p2p/dnsdisc/client_test.go new file mode 100644 index 000000000000..d8e3ecee391b --- /dev/null +++ b/p2p/dnsdisc/client_test.go @@ -0,0 +1,316 @@ +// Copyright 2018 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 dnsdisc + +import ( + "context" + "crypto/ecdsa" + "math/rand" + "reflect" + "testing" + "time" + + "github.com/davecgh/go-spew/spew" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/internal/testlog" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" +) + +const ( + signingKeySeed = 0x111111 + nodesSeed1 = 0x2945237 + nodesSeed2 = 0x4567299 +) + +func TestClientSyncTree(t *testing.T) { + r := mapResolver{ + "n": "enrtree-root:v1 e=JWXYDBPXYWG6FX3GMDIBFA6CJ4 l=C7HRFPF3BLGF3YR4DY5KX3SMBE seq=1 sig=o908WmNp7LibOfPsr4btQwatZJ5URBr2ZAuxvK4UWHlsB9sUOTJQaGAlLPVAhM__XJesCHxLISo94z5Z2a463gA", + "C7HRFPF3BLGF3YR4DY5KX3SMBE.n": "enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org", + "JWXYDBPXYWG6FX3GMDIBFA6CJ4.n": "enrtree-branch:2XS2367YHAXJFGLZHVAWLQD4ZY,H4FHT4B454P6UXFD7JCYQ5PWDY,MHTDO6TMUBRIA2XWG5LUDACK24", + "2XS2367YHAXJFGLZHVAWLQD4ZY.n": "enr:-HW4QOFzoVLaFJnNhbgMoDXPnOvcdVuj7pDpqRvh6BRDO68aVi5ZcjB3vzQRZH2IcLBGHzo8uUN3snqmgTiE56CH3AMBgmlkgnY0iXNlY3AyNTZrMaECC2_24YYkYHEgdzxlSNKQEnHhuNAbNlMlWJxrJxbAFvA", + "H4FHT4B454P6UXFD7JCYQ5PWDY.n": "enr:-HW4QAggRauloj2SDLtIHN1XBkvhFZ1vtf1raYQp9TBW2RD5EEawDzbtSmlXUfnaHcvwOizhVYLtr7e6vw7NAf6mTuoCgmlkgnY0iXNlY3AyNTZrMaECjrXI8TLNXU0f8cthpAMxEshUyQlK-AM0PW2wfrnacNI", + "MHTDO6TMUBRIA2XWG5LUDACK24.n": "enr:-HW4QLAYqmrwllBEnzWWs7I5Ev2IAs7x_dZlbYdRdMUx5EyKHDXp7AV5CkuPGUPdvbv1_Ms1CPfhcGCvSElSosZmyoqAgmlkgnY0iXNlY3AyNTZrMaECriawHKWdDRk2xeZkrOXBQ0dfMFLHY4eENZwdufn1S1o", + } + var ( + wantNodes = testNodes(0x29452, 3) + wantLinks = []string{"enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org"} + wantSeq = uint(1) + ) + + c, _ := NewClient(Config{Resolver: r, Logger: testlog.Logger(t, log.LvlTrace)}) + stree, err := c.SyncTree("enrtree://AKPYQIUQIL7PSIACI32J7FGZW56E5FKHEFCCOFHILBIMW3M6LWXS2@n") + if err != nil { + t.Fatal("sync error:", err) + } + if !reflect.DeepEqual(sortByID(stree.Nodes()), sortByID(wantNodes)) { + t.Errorf("wrong nodes in synced tree:\nhave %v\nwant %v", spew.Sdump(stree.Nodes()), spew.Sdump(wantNodes)) + } + if !reflect.DeepEqual(stree.Links(), wantLinks) { + t.Errorf("wrong links in synced tree: %v", stree.Links()) + } + if stree.Seq() != wantSeq { + t.Errorf("synced tree has wrong seq: %d", stree.Seq()) + } + if len(c.trees) > 0 { + t.Errorf("tree from SyncTree added to client") + } +} + +// In this test, syncing the tree fails because it contains an invalid ENR entry. +func TestClientSyncTreeBadNode(t *testing.T) { + // var b strings.Builder + // b.WriteString(enrPrefix) + // b.WriteString("-----") + // badHash := subdomain(&b) + // tree, _ := MakeTree(3, nil, []string{"enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org"}) + // tree.entries[badHash] = &b + // tree.root.eroot = badHash + // url, _ := tree.Sign(testKey(signingKeySeed), "n") + // fmt.Println(url) + // fmt.Printf("%#v\n", tree.ToTXT("n")) + + r := mapResolver{ + "n": "enrtree-root:v1 e=INDMVBZEEQ4ESVYAKGIYU74EAA l=C7HRFPF3BLGF3YR4DY5KX3SMBE seq=3 sig=Vl3AmunLur0JZ3sIyJPSH6A3Vvdp4F40jWQeCmkIhmcgwE4VC5U9wpK8C_uL_CMY29fd6FAhspRvq2z_VysTLAA", + "C7HRFPF3BLGF3YR4DY5KX3SMBE.n": "enrtree://AM5FCQLWIZX2QFPNJAP7VUERCCRNGRHWZG3YYHIUV7BVDQ5FDPRT2@morenodes.example.org", + "INDMVBZEEQ4ESVYAKGIYU74EAA.n": "enr:-----", + } + c, _ := NewClient(Config{Resolver: r, Logger: testlog.Logger(t, log.LvlTrace)}) + _, err := c.SyncTree("enrtree://AKPYQIUQIL7PSIACI32J7FGZW56E5FKHEFCCOFHILBIMW3M6LWXS2@n") + wantErr := nameError{name: "INDMVBZEEQ4ESVYAKGIYU74EAA.n", err: entryError{typ: "enr", err: errInvalidENR}} + if err != wantErr { + t.Fatalf("expected sync error %q, got %q", wantErr, err) + } +} + +// This test checks that RandomNode hits all entries. +func TestClientRandomNode(t *testing.T) { + nodes := testNodes(nodesSeed1, 30) + tree, url := makeTestTree("n", nodes, nil) + r := mapResolver(tree.ToTXT("n")) + c, _ := NewClient(Config{Resolver: r, Logger: testlog.Logger(t, log.LvlTrace)}) + if err := c.AddTree(url); err != nil { + t.Fatal(err) + } + + checkRandomNode(t, c, nodes) +} + +// This test checks that RandomNode traverses linked trees as well as explicitly added trees. +func TestClientRandomNodeLinks(t *testing.T) { + nodes := testNodes(nodesSeed1, 40) + tree1, url1 := makeTestTree("t1", nodes[:10], nil) + tree2, url2 := makeTestTree("t2", nodes[10:], []string{url1}) + cfg := Config{ + Resolver: newMapResolver(tree1.ToTXT("t1"), tree2.ToTXT("t2")), + Logger: testlog.Logger(t, log.LvlTrace), + } + c, _ := NewClient(cfg) + if err := c.AddTree(url2); err != nil { + t.Fatal(err) + } + + checkRandomNode(t, c, nodes) +} + +// This test verifies that RandomNode re-checks the root of the tree to catch +// updates to nodes. +func TestClientRandomNodeUpdates(t *testing.T) { + var ( + clock = new(mclock.Simulated) + nodes = testNodes(nodesSeed1, 30) + resolver = newMapResolver() + cfg = Config{ + Resolver: resolver, + Logger: testlog.Logger(t, log.LvlTrace), + RecheckInterval: 20 * time.Minute, + } + c, _ = NewClient(cfg) + ) + c.clock = clock + tree1, url := makeTestTree("n", nodes[:25], nil) + + // Sync the original tree. + resolver.add(tree1.ToTXT("n")) + c.AddTree(url) + checkRandomNode(t, c, nodes[:25]) + + // Update some nodes and ensure RandomNode returns the new nodes as well. + keys := testKeys(nodesSeed1, len(nodes)) + for i, n := range nodes[:len(nodes)/2] { + r := n.Record() + r.Set(enr.IP{127, 0, 0, 1}) + r.SetSeq(55) + enode.SignV4(r, keys[i]) + n2, _ := enode.New(enode.ValidSchemes, r) + nodes[i] = n2 + } + tree2, _ := makeTestTree("n", nodes, nil) + clock.Run(cfg.RecheckInterval + 1*time.Second) + resolver.clear() + resolver.add(tree2.ToTXT("n")) + checkRandomNode(t, c, nodes) +} + +// This test verifies that RandomNode re-checks the root of the tree to catch +// updates to links. +func TestClientRandomNodeLinkUpdates(t *testing.T) { + var ( + clock = new(mclock.Simulated) + nodes = testNodes(nodesSeed1, 30) + resolver = newMapResolver() + cfg = Config{ + Resolver: resolver, + Logger: testlog.Logger(t, log.LvlTrace), + RecheckInterval: 20 * time.Minute, + } + c, _ = NewClient(cfg) + ) + c.clock = clock + tree3, url3 := makeTestTree("t3", nodes[20:30], nil) + tree2, url2 := makeTestTree("t2", nodes[10:20], nil) + tree1, url1 := makeTestTree("t1", nodes[0:10], []string{url2}) + resolver.add(tree1.ToTXT("t1")) + resolver.add(tree2.ToTXT("t2")) + resolver.add(tree3.ToTXT("t3")) + + // Sync tree1 using RandomNode. + c.AddTree(url1) + checkRandomNode(t, c, nodes[:20]) + + // Add link to tree3, remove link to tree2. + tree1, _ = makeTestTree("t1", nodes[:10], []string{url3}) + resolver.add(tree1.ToTXT("t1")) + clock.Run(cfg.RecheckInterval + 1*time.Second) + t.Log("tree1 updated") + + var wantNodes []*enode.Node + wantNodes = append(wantNodes, tree1.Nodes()...) + wantNodes = append(wantNodes, tree3.Nodes()...) + checkRandomNode(t, c, wantNodes) + + // Check that linked trees are GCed when they're no longer referenced. + if len(c.trees) != 2 { + t.Errorf("client knows %d trees, want 2", len(c.trees)) + } +} + +func checkRandomNode(t *testing.T, c *Client, wantNodes []*enode.Node) { + t.Helper() + + var ( + want = make(map[enode.ID]*enode.Node) + maxCalls = len(wantNodes) * 2 + calls = 0 + ctx = context.Background() + ) + for _, n := range wantNodes { + want[n.ID()] = n + } + for ; len(want) > 0 && calls < maxCalls; calls++ { + n := c.RandomNode(ctx) + if n == nil { + t.Fatalf("RandomNode returned nil (call %d)", calls) + } + delete(want, n.ID()) + } + t.Logf("checkRandomNode called RandomNode %d times to find %d nodes", calls, len(wantNodes)) + for _, n := range want { + t.Errorf("RandomNode didn't discover node %v", n.ID()) + } +} + +func makeTestTree(domain string, nodes []*enode.Node, links []string) (*Tree, string) { + tree, err := MakeTree(1, nodes, links) + if err != nil { + panic(err) + } + url, err := tree.Sign(testKey(signingKeySeed), domain) + if err != nil { + panic(err) + } + return tree, url +} + +// testKeys creates deterministic private keys for testing. +func testKeys(seed int64, n int) []*ecdsa.PrivateKey { + rand := rand.New(rand.NewSource(seed)) + keys := make([]*ecdsa.PrivateKey, n) + for i := 0; i < n; i++ { + key, err := ecdsa.GenerateKey(crypto.S256(), rand) + if err != nil { + panic("can't generate key: " + err.Error()) + } + keys[i] = key + } + return keys +} + +func testKey(seed int64) *ecdsa.PrivateKey { + return testKeys(seed, 1)[0] +} + +func testNodes(seed int64, n int) []*enode.Node { + keys := testKeys(seed, n) + nodes := make([]*enode.Node, n) + for i, key := range keys { + record := new(enr.Record) + record.SetSeq(uint64(i)) + enode.SignV4(record, key) + n, err := enode.New(enode.ValidSchemes, record) + if err != nil { + panic(err) + } + nodes[i] = n + } + return nodes +} + +func testNode(seed int64) *enode.Node { + return testNodes(seed, 1)[0] +} + +type mapResolver map[string]string + +func newMapResolver(maps ...map[string]string) mapResolver { + mr := make(mapResolver) + for _, m := range maps { + mr.add(m) + } + return mr +} + +func (mr mapResolver) clear() { + for k := range mr { + delete(mr, k) + } +} + +func (mr mapResolver) add(m map[string]string) { + for k, v := range m { + mr[k] = v + } +} + +func (mr mapResolver) LookupTXT(ctx context.Context, name string) ([]string, error) { + if record, ok := mr[name]; ok { + return []string{record}, nil + } + return nil, nil +} diff --git a/p2p/dnsdisc/doc.go b/p2p/dnsdisc/doc.go new file mode 100644 index 000000000000..227467d084b5 --- /dev/null +++ b/p2p/dnsdisc/doc.go @@ -0,0 +1,18 @@ +// Copyright 2018 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 dnsdisc implements node discovery via DNS (EIP-1459). +package dnsdisc diff --git a/p2p/dnsdisc/error.go b/p2p/dnsdisc/error.go new file mode 100644 index 000000000000..e0998c7350f7 --- /dev/null +++ b/p2p/dnsdisc/error.go @@ -0,0 +1,63 @@ +// Copyright 2018 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 dnsdisc + +import ( + "errors" + "fmt" +) + +// Entry parse errors. +var ( + errUnknownEntry = errors.New("unknown entry type") + errNoPubkey = errors.New("missing public key") + errBadPubkey = errors.New("invalid public key") + errInvalidENR = errors.New("invalid node record") + errInvalidChild = errors.New("invalid child hash") + errInvalidSig = errors.New("invalid base64 signature") + errSyntax = errors.New("invalid syntax") +) + +// Resolver/sync errors +var ( + errNoRoot = errors.New("no valid root found") + errNoEntry = errors.New("no valid tree entry found") + errHashMismatch = errors.New("hash mismatch") + errENRInLinkTree = errors.New("enr entry in link tree") + errLinkInENRTree = errors.New("link entry in ENR tree") +) + +type nameError struct { + name string + err error +} + +func (err nameError) Error() string { + if ee, ok := err.err.(entryError); ok { + return fmt.Sprintf("invalid %s entry at %s: %v", ee.typ, err.name, ee.err) + } + return err.name + ": " + err.err.Error() +} + +type entryError struct { + typ string + err error +} + +func (err entryError) Error() string { + return fmt.Sprintf("invalid %s entry: %v", err.typ, err.err) +} diff --git a/p2p/dnsdisc/sync.go b/p2p/dnsdisc/sync.go new file mode 100644 index 000000000000..533dacc653c3 --- /dev/null +++ b/p2p/dnsdisc/sync.go @@ -0,0 +1,277 @@ +// Copyright 2019 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 dnsdisc + +import ( + "context" + "crypto/ecdsa" + "math/rand" + "time" + + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/p2p/enode" +) + +// clientTree is a full tree being synced. +type clientTree struct { + c *Client + loc *linkEntry + root *rootEntry + lastRootCheck mclock.AbsTime // last revalidation of root + enrs *subtreeSync + links *subtreeSync + linkCache linkCache +} + +func newClientTree(c *Client, loc *linkEntry) *clientTree { + ct := &clientTree{c: c, loc: loc} + ct.linkCache.self = ct + return ct +} + +func (ct *clientTree) matchPubkey(key *ecdsa.PublicKey) bool { + return keysEqual(ct.loc.pubkey, key) +} + +func keysEqual(k1, k2 *ecdsa.PublicKey) bool { + return k1.Curve == k2.Curve && k1.X.Cmp(k2.X) == 0 && k1.Y.Cmp(k2.Y) == 0 +} + +// syncAll retrieves all entries of the tree. +func (ct *clientTree) syncAll(dest map[string]entry) error { + if err := ct.updateRoot(); err != nil { + return err + } + if err := ct.links.resolveAll(dest); err != nil { + return err + } + if err := ct.enrs.resolveAll(dest); err != nil { + return err + } + return nil +} + +// syncRandom retrieves a single entry of the tree. The Node return value +// is non-nil if the entry was a node. +func (ct *clientTree) syncRandom(ctx context.Context) (*enode.Node, error) { + if ct.rootUpdateDue() { + if err := ct.updateRoot(); err != nil { + return nil, err + } + } + // Link tree sync has priority, run it to completion before syncing ENRs. + if !ct.links.done() { + err := ct.syncNextLink(ctx) + return nil, err + } + + // Sync next random entry in ENR tree. Once every node has been visited, we simply + // start over. This is fine because entries are cached. + if ct.enrs.done() { + ct.enrs = newSubtreeSync(ct.c, ct.loc, ct.root.eroot, false) + } + return ct.syncNextRandomENR(ctx) +} + +func (ct *clientTree) syncNextLink(ctx context.Context) error { + hash := ct.links.missing[0] + e, err := ct.links.resolveNext(ctx, hash) + if err != nil { + return err + } + ct.links.missing = ct.links.missing[1:] + + if le, ok := e.(*linkEntry); ok { + lt, err := ct.c.ensureTree(le) + if err != nil { + return err + } + ct.linkCache.add(lt) + } + return nil +} + +func (ct *clientTree) syncNextRandomENR(ctx context.Context) (*enode.Node, error) { + index := rand.Intn(len(ct.enrs.missing)) + hash := ct.enrs.missing[index] + e, err := ct.enrs.resolveNext(ctx, hash) + if err != nil { + return nil, err + } + ct.enrs.missing = removeHash(ct.enrs.missing, index) + if ee, ok := e.(*enrEntry); ok { + return ee.node, nil + } + return nil, nil +} + +func (ct *clientTree) String() string { + return ct.loc.String() +} + +// removeHash removes the element at index from h. +func removeHash(h []string, index int) []string { + if len(h) == 1 { + return nil + } + last := len(h) - 1 + if index < last { + h[index] = h[last] + h[last] = "" + } + return h[:last] +} + +// updateRoot ensures that the given tree has an up-to-date root. +func (ct *clientTree) updateRoot() error { + ct.lastRootCheck = ct.c.clock.Now() + ctx, cancel := context.WithTimeout(context.Background(), ct.c.cfg.Timeout) + defer cancel() + root, err := ct.c.resolveRoot(ctx, ct.loc) + if err != nil { + return err + } + ct.root = &root + + // Invalidate subtrees if changed. + if ct.links == nil || root.lroot != ct.links.root { + ct.links = newSubtreeSync(ct.c, ct.loc, root.lroot, true) + ct.linkCache.reset() + } + if ct.enrs == nil || root.eroot != ct.enrs.root { + ct.enrs = newSubtreeSync(ct.c, ct.loc, root.eroot, false) + } + return nil +} + +// rootUpdateDue returns true when a root update is needed. +func (ct *clientTree) rootUpdateDue() bool { + return ct.root == nil || time.Duration(ct.c.clock.Now()-ct.lastRootCheck) > ct.c.cfg.RecheckInterval +} + +// subtreeSync is the sync of an ENR or link subtree. +type subtreeSync struct { + c *Client + loc *linkEntry + root string + missing []string // missing tree node hashes + link bool // true if this sync is for the link tree +} + +func newSubtreeSync(c *Client, loc *linkEntry, root string, link bool) *subtreeSync { + return &subtreeSync{c, loc, root, []string{root}, link} +} + +func (ts *subtreeSync) done() bool { + return len(ts.missing) == 0 +} + +func (ts *subtreeSync) resolveAll(dest map[string]entry) error { + for !ts.done() { + hash := ts.missing[0] + ctx, cancel := context.WithTimeout(context.Background(), ts.c.cfg.Timeout) + e, err := ts.resolveNext(ctx, hash) + cancel() + if err != nil { + return err + } + dest[hash] = e + ts.missing = ts.missing[1:] + } + return nil +} + +func (ts *subtreeSync) resolveNext(ctx context.Context, hash string) (entry, error) { + e, err := ts.c.resolveEntry(ctx, ts.loc.domain, hash) + if err != nil { + return nil, err + } + switch e := e.(type) { + case *enrEntry: + if ts.link { + return nil, errENRInLinkTree + } + case *linkEntry: + if !ts.link { + return nil, errLinkInENRTree + } + case *branchEntry: + ts.missing = append(ts.missing, e.children...) + } + return e, nil +} + +// linkCache tracks the links of a tree. +type linkCache struct { + self *clientTree + directM map[*clientTree]struct{} // direct links + allM map[*clientTree]struct{} // direct & transitive links +} + +// reset clears the cache. +func (lc *linkCache) reset() { + lc.directM = nil + lc.allM = nil +} + +// add adds a direct link to the cache. +func (lc *linkCache) add(ct *clientTree) { + if lc.directM == nil { + lc.directM = make(map[*clientTree]struct{}) + } + if _, ok := lc.directM[ct]; !ok { + lc.invalidate() + } + lc.directM[ct] = struct{}{} +} + +// invalidate resets the cache of transitive links. +func (lc *linkCache) invalidate() { + lc.allM = nil +} + +// valid returns true when the cache of transitive links is up-to-date. +func (lc *linkCache) valid() bool { + // Re-check validity of child caches to catch updates. + for ct := range lc.allM { + if ct != lc.self && !ct.linkCache.valid() { + lc.allM = nil + break + } + } + return lc.allM != nil +} + +// all returns all trees reachable through the cache. +func (lc *linkCache) all() map[*clientTree]struct{} { + if lc.valid() { + return lc.allM + } + // Remake lc.allM it by taking the union of all() across children. + m := make(map[*clientTree]struct{}) + if lc.self != nil { + m[lc.self] = struct{}{} + } + for ct := range lc.directM { + m[ct] = struct{}{} + for lt := range ct.linkCache.all() { + m[lt] = struct{}{} + } + } + lc.allM = m + return m +} diff --git a/p2p/dnsdisc/tree.go b/p2p/dnsdisc/tree.go new file mode 100644 index 000000000000..eba2ff9c0c70 --- /dev/null +++ b/p2p/dnsdisc/tree.go @@ -0,0 +1,385 @@ +// Copyright 2018 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 dnsdisc + +import ( + "bytes" + "crypto/ecdsa" + "encoding/base32" + "encoding/base64" + "fmt" + "io" + "sort" + "strings" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/rlp" + "golang.org/x/crypto/sha3" +) + +// Tree is a merkle tree of node records. +type Tree struct { + root *rootEntry + entries map[string]entry +} + +// Sign signs the tree with the given private key and sets the sequence number. +func (t *Tree) Sign(key *ecdsa.PrivateKey, domain string) (url string, err error) { + root := *t.root + sig, err := crypto.Sign(root.sigHash(), key) + if err != nil { + return "", err + } + root.sig = sig + t.root = &root + link := &linkEntry{domain, &key.PublicKey} + return link.String(), nil +} + +// SetSignature verifies the given signature and assigns it as the tree's current +// signature if valid. +func (t *Tree) SetSignature(pubkey *ecdsa.PublicKey, signature string) error { + sig, err := b64format.DecodeString(signature) + if err != nil || len(sig) != crypto.SignatureLength { + return errInvalidSig + } + root := *t.root + root.sig = sig + if !root.verifySignature(pubkey) { + return errInvalidSig + } + t.root = &root + return nil +} + +// Seq returns the sequence number of the tree. +func (t *Tree) Seq() uint { + return t.root.seq +} + +// Signature returns the signature of the tree. +func (t *Tree) Signature() string { + return b64format.EncodeToString(t.root.sig) +} + +// ToTXT returns all DNS TXT records required for the tree. +func (t *Tree) ToTXT(domain string) map[string]string { + records := map[string]string{domain: t.root.String()} + for _, e := range t.entries { + sd := subdomain(e) + if domain != "" { + sd = sd + "." + domain + } + records[sd] = e.String() + } + return records +} + +// Links returns all links contained in the tree. +func (t *Tree) Links() []string { + var links []string + for _, e := range t.entries { + if le, ok := e.(*linkEntry); ok { + links = append(links, le.String()) + } + } + return links +} + +// Nodes returns all nodes contained in the tree. +func (t *Tree) Nodes() []*enode.Node { + var nodes []*enode.Node + for _, e := range t.entries { + if ee, ok := e.(*enrEntry); ok { + nodes = append(nodes, ee.node) + } + } + return nodes +} + +const ( + hashAbbrev = 16 + maxChildren = 300 / hashAbbrev * (13 / 8) + minHashLength = 12 +) + +// MakeTree creates a tree containing the given nodes and links. +func MakeTree(seq uint, nodes []*enode.Node, links []string) (*Tree, error) { + // Sort records by ID and ensure all nodes have a valid record. + records := make([]*enode.Node, len(nodes)) + + copy(records, nodes) + sortByID(records) + for _, n := range records { + if len(n.Record().Signature()) == 0 { + return nil, fmt.Errorf("can't add node %v: unsigned node record", n.ID()) + } + } + + // Create the leaf list. + enrEntries := make([]entry, len(records)) + for i, r := range records { + enrEntries[i] = &enrEntry{r} + } + linkEntries := make([]entry, len(links)) + for i, l := range links { + le, err := parseLink(l) + if err != nil { + return nil, err + } + linkEntries[i] = le + } + + // Create intermediate nodes. + t := &Tree{entries: make(map[string]entry)} + eroot := t.build(enrEntries) + t.entries[subdomain(eroot)] = eroot + lroot := t.build(linkEntries) + t.entries[subdomain(lroot)] = lroot + t.root = &rootEntry{seq: seq, eroot: subdomain(eroot), lroot: subdomain(lroot)} + return t, nil +} + +func (t *Tree) build(entries []entry) entry { + if len(entries) == 1 { + return entries[0] + } + if len(entries) <= maxChildren { + hashes := make([]string, len(entries)) + for i, e := range entries { + hashes[i] = subdomain(e) + t.entries[hashes[i]] = e + } + return &branchEntry{hashes} + } + var subtrees []entry + for len(entries) > 0 { + n := maxChildren + if len(entries) < n { + n = len(entries) + } + sub := t.build(entries[:n]) + entries = entries[n:] + subtrees = append(subtrees, sub) + t.entries[subdomain(sub)] = sub + } + return t.build(subtrees) +} + +func sortByID(nodes []*enode.Node) []*enode.Node { + sort.Slice(nodes, func(i, j int) bool { + return bytes.Compare(nodes[i].ID().Bytes(), nodes[j].ID().Bytes()) < 0 + }) + return nodes +} + +// Entry Types + +type entry interface { + fmt.Stringer +} + +type ( + rootEntry struct { + eroot string + lroot string + seq uint + sig []byte + } + branchEntry struct { + children []string + } + enrEntry struct { + node *enode.Node + } + linkEntry struct { + domain string + pubkey *ecdsa.PublicKey + } +) + +// Entry Encoding + +var ( + b32format = base32.StdEncoding.WithPadding(base32.NoPadding) + b64format = base64.RawURLEncoding +) + +const ( + rootPrefix = "enrtree-root:v1" + linkPrefix = "enrtree://" + branchPrefix = "enrtree-branch:" + enrPrefix = "enr:" +) + +func subdomain(e entry) string { + h := sha3.NewLegacyKeccak256() + io.WriteString(h, e.String()) + return b32format.EncodeToString(h.Sum(nil)[:16]) +} + +func (e *rootEntry) String() string { + return fmt.Sprintf(rootPrefix+" e=%s l=%s seq=%d sig=%s", e.eroot, e.lroot, e.seq, b64format.EncodeToString(e.sig)) +} + +func (e *rootEntry) sigHash() []byte { + h := sha3.NewLegacyKeccak256() + fmt.Fprintf(h, rootPrefix+" e=%s l=%s seq=%d", e.eroot, e.lroot, e.seq) + return h.Sum(nil) +} + +func (e *rootEntry) verifySignature(pubkey *ecdsa.PublicKey) bool { + sig := e.sig[:crypto.RecoveryIDOffset] // remove recovery id + return crypto.VerifySignature(crypto.FromECDSAPub(pubkey), e.sigHash(), sig) +} + +func (e *branchEntry) String() string { + return branchPrefix + strings.Join(e.children, ",") +} + +func (e *enrEntry) String() string { + return e.node.String() +} + +func (e *linkEntry) String() string { + pubkey := b32format.EncodeToString(crypto.CompressPubkey(e.pubkey)) + return fmt.Sprintf("%s%s@%s", linkPrefix, pubkey, e.domain) +} + +// Entry Parsing + +func parseEntry(e string, validSchemes enr.IdentityScheme) (entry, error) { + switch { + case strings.HasPrefix(e, linkPrefix): + return parseLinkEntry(e) + case strings.HasPrefix(e, branchPrefix): + return parseBranch(e) + case strings.HasPrefix(e, enrPrefix): + return parseENR(e, validSchemes) + default: + return nil, errUnknownEntry + } +} + +func parseRoot(e string) (rootEntry, error) { + var eroot, lroot, sig string + var seq uint + if _, err := fmt.Sscanf(e, rootPrefix+" e=%s l=%s seq=%d sig=%s", &eroot, &lroot, &seq, &sig); err != nil { + return rootEntry{}, entryError{"root", errSyntax} + } + if !isValidHash(eroot) || !isValidHash(lroot) { + return rootEntry{}, entryError{"root", errInvalidChild} + } + sigb, err := b64format.DecodeString(sig) + if err != nil || len(sigb) != crypto.SignatureLength { + return rootEntry{}, entryError{"root", errInvalidSig} + } + return rootEntry{eroot, lroot, seq, sigb}, nil +} + +func parseLinkEntry(e string) (entry, error) { + le, err := parseLink(e) + if err != nil { + return nil, err + } + return le, nil +} + +func parseLink(e string) (*linkEntry, error) { + if !strings.HasPrefix(e, linkPrefix) { + return nil, fmt.Errorf("wrong/missing scheme 'enrtree' in URL") + } + e = e[len(linkPrefix):] + pos := strings.IndexByte(e, '@') + if pos == -1 { + return nil, entryError{"link", errNoPubkey} + } + keystring, domain := e[:pos], e[pos+1:] + keybytes, err := b32format.DecodeString(keystring) + if err != nil { + return nil, entryError{"link", errBadPubkey} + } + key, err := crypto.DecompressPubkey(keybytes) + if err != nil { + return nil, entryError{"link", errBadPubkey} + } + return &linkEntry{domain, key}, nil +} + +func parseBranch(e string) (entry, error) { + e = e[len(branchPrefix):] + if e == "" { + return &branchEntry{}, nil // empty entry is OK + } + hashes := make([]string, 0, strings.Count(e, ",")) + for _, c := range strings.Split(e, ",") { + if !isValidHash(c) { + return nil, entryError{"branch", errInvalidChild} + } + hashes = append(hashes, c) + } + return &branchEntry{hashes}, nil +} + +func parseENR(e string, validSchemes enr.IdentityScheme) (entry, error) { + e = e[len(enrPrefix):] + enc, err := b64format.DecodeString(e) + if err != nil { + return nil, entryError{"enr", errInvalidENR} + } + var rec enr.Record + if err := rlp.DecodeBytes(enc, &rec); err != nil { + return nil, entryError{"enr", err} + } + n, err := enode.New(validSchemes, &rec) + if err != nil { + return nil, entryError{"enr", err} + } + return &enrEntry{n}, nil +} + +func isValidHash(s string) bool { + dlen := b32format.DecodedLen(len(s)) + if dlen < minHashLength || dlen > 32 || strings.ContainsAny(s, "\n\r") { + return false + } + buf := make([]byte, 32) + _, err := b32format.Decode(buf, []byte(s)) + return err == nil +} + +// truncateHash truncates the given base32 hash string to the minimum acceptable length. +func truncateHash(hash string) string { + maxLen := b32format.EncodedLen(minHashLength) + if len(hash) < maxLen { + panic(fmt.Errorf("dnsdisc: hash %q is too short", hash)) + } + return hash[:maxLen] +} + +// URL encoding + +// ParseURL parses an enrtree:// URL and returns its components. +func ParseURL(url string) (domain string, pubkey *ecdsa.PublicKey, err error) { + le, err := parseLink(url) + if err != nil { + return "", nil, err + } + return le.domain, le.pubkey, nil +} diff --git a/p2p/dnsdisc/tree_test.go b/p2p/dnsdisc/tree_test.go new file mode 100644 index 000000000000..b6d0a8433688 --- /dev/null +++ b/p2p/dnsdisc/tree_test.go @@ -0,0 +1,144 @@ +// Copyright 2018 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 dnsdisc + +import ( + "reflect" + "testing" + + "github.com/davecgh/go-spew/spew" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/p2p/enode" +) + +func TestParseRoot(t *testing.T) { + tests := []struct { + input string + e rootEntry + err error + }{ + { + input: "enrtree-root:v1 e=TO4Q75OQ2N7DX4EOOR7X66A6OM seq=3 sig=N-YY6UB9xD0hFx1Gmnt7v0RfSxch5tKyry2SRDoLx7B4GfPXagwLxQqyf7gAMvApFn_ORwZQekMWa_pXrcGCtw", + err: entryError{"root", errSyntax}, + }, + { + input: "enrtree-root:v1 e=TO4Q75OQ2N7DX4EOOR7X66A6OM l=TO4Q75OQ2N7DX4EOOR7X66A6OM seq=3 sig=N-YY6UB9xD0hFx1Gmnt7v0RfSxch5tKyry2SRDoLx7B4GfPXagwLxQqyf7gAMvApFn_ORwZQekMWa_pXrcGCtw", + err: entryError{"root", errInvalidSig}, + }, + { + input: "enrtree-root:v1 e=QFT4PBCRX4XQCV3VUYJ6BTCEPU l=JGUFMSAGI7KZYB3P7IZW4S5Y3A seq=3 sig=3FmXuVwpa8Y7OstZTx9PIb1mt8FrW7VpDOFv4AaGCsZ2EIHmhraWhe4NxYhQDlw5MjeFXYMbJjsPeKlHzmJREQE", + e: rootEntry{ + eroot: "QFT4PBCRX4XQCV3VUYJ6BTCEPU", + lroot: "JGUFMSAGI7KZYB3P7IZW4S5Y3A", + seq: 3, + sig: hexutil.MustDecode("0xdc5997b95c296bc63b3acb594f1f4f21bd66b7c16b5bb5690ce16fe006860ac6761081e686b69685ee0dc588500e5c393237855d831b263b0f78a947ce62511101"), + }, + }, + } + for i, test := range tests { + e, err := parseRoot(test.input) + if !reflect.DeepEqual(e, test.e) { + t.Errorf("test %d: wrong entry %s, want %s", i, spew.Sdump(e), spew.Sdump(test.e)) + } + if err != test.err { + t.Errorf("test %d: wrong error %q, want %q", i, err, test.err) + } + } +} + +func TestParseEntry(t *testing.T) { + testkey := testKey(signingKeySeed) + tests := []struct { + input string + e entry + err error + }{ + // Subtrees: + { + input: "enrtree-branch:1,2", + err: entryError{"branch", errInvalidChild}, + }, + { + input: "enrtree-branch:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + err: entryError{"branch", errInvalidChild}, + }, + { + input: "enrtree-branch:", + e: &branchEntry{}, + }, + { + input: "enrtree-branch:AAAAAAAAAAAAAAAAAAAA", + e: &branchEntry{[]string{"AAAAAAAAAAAAAAAAAAAA"}}, + }, + { + input: "enrtree-branch:AAAAAAAAAAAAAAAAAAAA,BBBBBBBBBBBBBBBBBBBB", + e: &branchEntry{[]string{"AAAAAAAAAAAAAAAAAAAA", "BBBBBBBBBBBBBBBBBBBB"}}, + }, + // Links + { + input: "enrtree://AKPYQIUQIL7PSIACI32J7FGZW56E5FKHEFCCOFHILBIMW3M6LWXS2@nodes.example.org", + e: &linkEntry{"nodes.example.org", &testkey.PublicKey}, + }, + { + input: "enrtree://nodes.example.org", + err: entryError{"link", errNoPubkey}, + }, + { + input: "enrtree://AP62DT7WOTEQZGQZOU474PP3KMEGVTTE7A7NPRXKX3DUD57@nodes.example.org", + err: entryError{"link", errBadPubkey}, + }, + { + input: "enrtree://AP62DT7WONEQZGQZOU474PP3KMEGVTTE7A7NPRXKX3DUD57TQHGIA@nodes.example.org", + err: entryError{"link", errBadPubkey}, + }, + // ENRs + { + input: "enr:-HW4QES8QIeXTYlDzbfr1WEzE-XKY4f8gJFJzjJL-9D7TC9lJb4Z3JPRRz1lP4pL_N_QpT6rGQjAU9Apnc-C1iMP36OAgmlkgnY0iXNlY3AyNTZrMaED5IdwfMxdmR8W37HqSFdQLjDkIwBd4Q_MjxgZifgKSdM", + e: &enrEntry{node: testNode(nodesSeed1)}, + }, + { + input: "enr:-HW4QLZHjM4vZXkbp-5xJoHsKSbE7W39FPC8283X-y8oHcHPTnDDlIlzL5ArvDUlHZVDPgmFASrh7cWgLOLxj4wprRkHgmlkgnY0iXNlY3AyNTZrMaEC3t2jLMhDpCDX5mbSEwDn4L3iUfyXzoO8G28XvjGRkrAg=", + err: entryError{"enr", errInvalidENR}, + }, + // Invalid: + {input: "", err: errUnknownEntry}, + {input: "foo", err: errUnknownEntry}, + {input: "enrtree", err: errUnknownEntry}, + {input: "enrtree-x=", err: errUnknownEntry}, + } + for i, test := range tests { + e, err := parseEntry(test.input, enode.ValidSchemes) + if !reflect.DeepEqual(e, test.e) { + t.Errorf("test %d: wrong entry %s, want %s", i, spew.Sdump(e), spew.Sdump(test.e)) + } + if err != test.err { + t.Errorf("test %d: wrong error %q, want %q", i, err, test.err) + } + } +} + +func TestMakeTree(t *testing.T) { + nodes := testNodes(nodesSeed2, 50) + tree, err := MakeTree(2, nodes, nil) + if err != nil { + t.Fatal(err) + } + txt := tree.ToTXT("") + if len(txt) < len(nodes)+1 { + t.Fatal("too few TXT records in output") + } +} diff --git a/p2p/enode/idscheme.go b/p2p/enode/idscheme.go index b1fdff85f7b9..c1834f06995c 100644 --- a/p2p/enode/idscheme.go +++ b/p2p/enode/idscheme.go @@ -21,10 +21,10 @@ import ( "fmt" "io" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/p2p/enr" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/rlp" "golang.org/x/crypto/sha3" ) diff --git a/p2p/enode/idscheme_test.go b/p2p/enode/idscheme_test.go index 58e7182f9636..0910e6e83f61 100644 --- a/p2p/enode/idscheme_test.go +++ b/p2p/enode/idscheme_test.go @@ -23,9 +23,9 @@ import ( "math/big" "testing" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/p2p/enr" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/rlp" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) diff --git a/p2p/enode/iter.go b/p2p/enode/iter.go new file mode 100644 index 000000000000..664964f53406 --- /dev/null +++ b/p2p/enode/iter.go @@ -0,0 +1,288 @@ +// Copyright 2019 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 enode + +import ( + "sync" + "time" +) + +// Iterator represents a sequence of nodes. The Next method moves to the next node in the +// sequence. It returns false when the sequence has ended or the iterator is closed. Close +// may be called concurrently with Next and Node, and interrupts Next if it is blocked. +type Iterator interface { + Next() bool // moves to next node + Node() *Node // returns current node + Close() // ends the iterator +} + +// ReadNodes reads at most n nodes from the given iterator. The return value contains no +// duplicates and no nil values. To prevent looping indefinitely for small repeating node +// sequences, this function calls Next at most n times. +func ReadNodes(it Iterator, n int) []*Node { + seen := make(map[ID]*Node, n) + for i := 0; i < n && it.Next(); i++ { + // Remove duplicates, keeping the node with higher seq. + node := it.Node() + prevNode, ok := seen[node.ID()] + if ok && prevNode.Seq() > node.Seq() { + continue + } + seen[node.ID()] = node + } + result := make([]*Node, 0, len(seen)) + for _, node := range seen { + result = append(result, node) + } + return result +} + +// IterNodes makes an iterator which runs through the given nodes once. +func IterNodes(nodes []*Node) Iterator { + return &sliceIter{nodes: nodes, index: -1} +} + +// CycleNodes makes an iterator which cycles through the given nodes indefinitely. +func CycleNodes(nodes []*Node) Iterator { + return &sliceIter{nodes: nodes, index: -1, cycle: true} +} + +type sliceIter struct { + mu sync.Mutex + nodes []*Node + index int + cycle bool +} + +func (it *sliceIter) Next() bool { + it.mu.Lock() + defer it.mu.Unlock() + + if len(it.nodes) == 0 { + return false + } + it.index++ + if it.index == len(it.nodes) { + if it.cycle { + it.index = 0 + } else { + it.nodes = nil + return false + } + } + return true +} + +func (it *sliceIter) Node() *Node { + it.mu.Lock() + defer it.mu.Unlock() + if len(it.nodes) == 0 { + return nil + } + return it.nodes[it.index] +} + +func (it *sliceIter) Close() { + it.mu.Lock() + defer it.mu.Unlock() + + it.nodes = nil +} + +// Filter wraps an iterator such that Next only returns nodes for which +// the 'check' function returns true. +func Filter(it Iterator, check func(*Node) bool) Iterator { + return &filterIter{it, check} +} + +type filterIter struct { + Iterator + check func(*Node) bool +} + +func (f *filterIter) Next() bool { + for f.Iterator.Next() { + if f.check(f.Node()) { + return true + } + } + return false +} + +// FairMix aggregates multiple node iterators. The mixer itself is an iterator which ends +// only when Close is called. Source iterators added via AddSource are removed from the +// mix when they end. +// +// The distribution of nodes returned by Next is approximately fair, i.e. FairMix +// attempts to draw from all sources equally often. However, if a certain source is slow +// and doesn't return a node within the configured timeout, a node from any other source +// will be returned. +// +// It's safe to call AddSource and Close concurrently with Next. +type FairMix struct { + wg sync.WaitGroup + fromAny chan *Node + timeout time.Duration + cur *Node + + mu sync.Mutex + closed chan struct{} + sources []*mixSource + last int +} + +type mixSource struct { + it Iterator + next chan *Node + timeout time.Duration +} + +// NewFairMix creates a mixer. +// +// The timeout specifies how long the mixer will wait for the next fairly-chosen source +// before giving up and taking a node from any other source. A good way to set the timeout +// is deciding how long you'd want to wait for a node on average. Passing a negative +// timeout makes the mixer completely fair. +func NewFairMix(timeout time.Duration) *FairMix { + m := &FairMix{ + fromAny: make(chan *Node), + closed: make(chan struct{}), + timeout: timeout, + } + return m +} + +// AddSource adds a source of nodes. +func (m *FairMix) AddSource(it Iterator) { + m.mu.Lock() + defer m.mu.Unlock() + + if m.closed == nil { + return + } + m.wg.Add(1) + source := &mixSource{it, make(chan *Node), m.timeout} + m.sources = append(m.sources, source) + go m.runSource(m.closed, source) +} + +// Close shuts down the mixer and all current sources. +// Calling this is required to release resources associated with the mixer. +func (m *FairMix) Close() { + m.mu.Lock() + defer m.mu.Unlock() + + if m.closed == nil { + return + } + for _, s := range m.sources { + s.it.Close() + } + close(m.closed) + m.wg.Wait() + close(m.fromAny) + m.sources = nil + m.closed = nil +} + +// Next returns a node from a random source. +func (m *FairMix) Next() bool { + m.cur = nil + + var timeout <-chan time.Time + if m.timeout >= 0 { + timer := time.NewTimer(m.timeout) + timeout = timer.C + defer timer.Stop() + } + for { + source := m.pickSource() + if source == nil { + return m.nextFromAny() + } + select { + case n, ok := <-source.next: + if ok { + m.cur = n + source.timeout = m.timeout + return true + } + // This source has ended. + m.deleteSource(source) + case <-timeout: + source.timeout /= 2 + return m.nextFromAny() + } + } +} + +// Node returns the current node. +func (m *FairMix) Node() *Node { + return m.cur +} + +// nextFromAny is used when there are no sources or when the 'fair' choice +// doesn't turn up a node quickly enough. +func (m *FairMix) nextFromAny() bool { + n, ok := <-m.fromAny + if ok { + m.cur = n + } + return ok +} + +// pickSource chooses the next source to read from, cycling through them in order. +func (m *FairMix) pickSource() *mixSource { + m.mu.Lock() + defer m.mu.Unlock() + + if len(m.sources) == 0 { + return nil + } + m.last = (m.last + 1) % len(m.sources) + return m.sources[m.last] +} + +// deleteSource deletes a source. +func (m *FairMix) deleteSource(s *mixSource) { + m.mu.Lock() + defer m.mu.Unlock() + + for i := range m.sources { + if m.sources[i] == s { + copy(m.sources[i:], m.sources[i+1:]) + m.sources[len(m.sources)-1] = nil + m.sources = m.sources[:len(m.sources)-1] + break + } + } +} + +// runSource reads a single source in a loop. +func (m *FairMix) runSource(closed chan struct{}, s *mixSource) { + defer m.wg.Done() + defer close(s.next) + for s.it.Next() { + n := s.it.Node() + select { + case s.next <- n: + case m.fromAny <- n: + case <-closed: + return + } + } +} diff --git a/p2p/enode/iter_test.go b/p2p/enode/iter_test.go new file mode 100644 index 000000000000..6009661f3ce6 --- /dev/null +++ b/p2p/enode/iter_test.go @@ -0,0 +1,291 @@ +// Copyright 2019 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 enode + +import ( + "encoding/binary" + "runtime" + "sync/atomic" + "testing" + "time" + + "github.com/ethereum/go-ethereum/p2p/enr" +) + +func TestReadNodes(t *testing.T) { + nodes := ReadNodes(new(genIter), 10) + checkNodes(t, nodes, 10) +} + +// This test checks that ReadNodes terminates when reading N nodes from an iterator +// which returns less than N nodes in an endless cycle. +func TestReadNodesCycle(t *testing.T) { + iter := &callCountIter{ + Iterator: CycleNodes([]*Node{ + testNode(0, 0), + testNode(1, 0), + testNode(2, 0), + }), + } + nodes := ReadNodes(iter, 10) + checkNodes(t, nodes, 3) + if iter.count != 10 { + t.Fatalf("%d calls to Next, want %d", iter.count, 100) + } +} + +func TestFilterNodes(t *testing.T) { + nodes := make([]*Node, 100) + for i := range nodes { + nodes[i] = testNode(uint64(i), uint64(i)) + } + + it := Filter(IterNodes(nodes), func(n *Node) bool { + return n.Seq() >= 50 + }) + for i := 50; i < len(nodes); i++ { + if !it.Next() { + t.Fatal("Next returned false") + } + if it.Node() != nodes[i] { + t.Fatalf("iterator returned wrong node %v\nwant %v", it.Node(), nodes[i]) + } + } + if it.Next() { + t.Fatal("Next returned true after underlying iterator has ended") + } +} + +func checkNodes(t *testing.T, nodes []*Node, wantLen int) { + if len(nodes) != wantLen { + t.Errorf("slice has %d nodes, want %d", len(nodes), wantLen) + return + } + seen := make(map[ID]bool) + for i, e := range nodes { + if e == nil { + t.Errorf("nil node at index %d", i) + return + } + if seen[e.ID()] { + t.Errorf("slice has duplicate node %v", e.ID()) + return + } + seen[e.ID()] = true + } +} + +// This test checks fairness of FairMix in the happy case where all sources return nodes +// within the context's deadline. +func TestFairMix(t *testing.T) { + for i := 0; i < 500; i++ { + testMixerFairness(t) + } +} + +func testMixerFairness(t *testing.T) { + mix := NewFairMix(1 * time.Second) + mix.AddSource(&genIter{index: 1}) + mix.AddSource(&genIter{index: 2}) + mix.AddSource(&genIter{index: 3}) + defer mix.Close() + + nodes := ReadNodes(mix, 500) + checkNodes(t, nodes, 500) + + // Verify that the nodes slice contains an approximately equal number of nodes + // from each source. + d := idPrefixDistribution(nodes) + for _, count := range d { + if approxEqual(count, len(nodes)/3, 30) { + t.Fatalf("ID distribution is unfair: %v", d) + } + } +} + +// This test checks that FairMix falls back to an alternative source when +// the 'fair' choice doesn't return a node within the timeout. +func TestFairMixNextFromAll(t *testing.T) { + mix := NewFairMix(1 * time.Millisecond) + mix.AddSource(&genIter{index: 1}) + mix.AddSource(CycleNodes(nil)) + defer mix.Close() + + nodes := ReadNodes(mix, 500) + checkNodes(t, nodes, 500) + + d := idPrefixDistribution(nodes) + if len(d) > 1 || d[1] != len(nodes) { + t.Fatalf("wrong ID distribution: %v", d) + } +} + +// This test ensures FairMix works for Next with no sources. +func TestFairMixEmpty(t *testing.T) { + var ( + mix = NewFairMix(1 * time.Second) + testN = testNode(1, 1) + ch = make(chan *Node) + ) + defer mix.Close() + + go func() { + mix.Next() + ch <- mix.Node() + }() + + mix.AddSource(CycleNodes([]*Node{testN})) + if n := <-ch; n != testN { + t.Errorf("got wrong node: %v", n) + } +} + +// This test checks closing a source while Next runs. +func TestFairMixRemoveSource(t *testing.T) { + mix := NewFairMix(1 * time.Second) + source := make(blockingIter) + mix.AddSource(source) + + sig := make(chan *Node) + go func() { + <-sig + mix.Next() + sig <- mix.Node() + }() + + sig <- nil + runtime.Gosched() + source.Close() + + wantNode := testNode(0, 0) + mix.AddSource(CycleNodes([]*Node{wantNode})) + n := <-sig + + if len(mix.sources) != 1 { + t.Fatalf("have %d sources, want one", len(mix.sources)) + } + if n != wantNode { + t.Fatalf("mixer returned wrong node") + } +} + +type blockingIter chan struct{} + +func (it blockingIter) Next() bool { + <-it + return false +} + +func (it blockingIter) Node() *Node { + return nil +} + +func (it blockingIter) Close() { + close(it) +} + +func TestFairMixClose(t *testing.T) { + for i := 0; i < 20 && !t.Failed(); i++ { + testMixerClose(t) + } +} + +func testMixerClose(t *testing.T) { + mix := NewFairMix(-1) + mix.AddSource(CycleNodes(nil)) + mix.AddSource(CycleNodes(nil)) + + done := make(chan struct{}) + go func() { + defer close(done) + if mix.Next() { + t.Error("Next returned true") + } + }() + // This call is supposed to make it more likely that NextNode is + // actually executing by the time we call Close. + runtime.Gosched() + + mix.Close() + select { + case <-done: + case <-time.After(3 * time.Second): + t.Fatal("Next didn't unblock on Close") + } + + mix.Close() // shouldn't crash +} + +func idPrefixDistribution(nodes []*Node) map[uint32]int { + d := make(map[uint32]int) + for _, node := range nodes { + id := node.ID() + d[binary.BigEndian.Uint32(id[:4])]++ + } + return d +} + +func approxEqual(x, y, ε int) bool { + if y > x { + x, y = y, x + } + return x-y > ε +} + +// genIter creates fake nodes with numbered IDs based on 'index' and 'gen' +type genIter struct { + node *Node + index, gen uint32 +} + +func (s *genIter) Next() bool { + index := atomic.LoadUint32(&s.index) + if index == ^uint32(0) { + s.node = nil + return false + } + s.node = testNode(uint64(index)<<32|uint64(s.gen), 0) + s.gen++ + return true +} + +func (s *genIter) Node() *Node { + return s.node +} + +func (s *genIter) Close() { + s.index = ^uint32(0) +} + +func testNode(id, seq uint64) *Node { + var nodeID ID + binary.BigEndian.PutUint64(nodeID[:], id) + r := new(enr.Record) + r.SetSeq(seq) + return SignNull(r, nodeID) +} + +// callCountIter counts calls to NextNode. +type callCountIter struct { + Iterator + count int +} + +func (it *callCountIter) Next() bool { + it.count++ + return it.Iterator.Next() +} diff --git a/p2p/enode/localnode.go b/p2p/enode/localnode.go index d327bf9e9703..d8aa02a77e26 100644 --- a/p2p/enode/localnode.go +++ b/p2p/enode/localnode.go @@ -26,9 +26,9 @@ import ( "sync/atomic" "time" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/enr" - "github.com/nebulaai/nbai-node/p2p/netutil" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/p2p/netutil" ) const ( @@ -48,23 +48,32 @@ type LocalNode struct { db *DB // everything below is protected by a lock - mu sync.Mutex - seq uint64 - entries map[string]enr.Entry - udpTrack *netutil.IPTracker // predicts external UDP endpoint - staticIP net.IP - fallbackIP net.IP - fallbackUDP int + mu sync.Mutex + seq uint64 + entries map[string]enr.Entry + endpoint4 lnEndpoint + endpoint6 lnEndpoint +} + +type lnEndpoint struct { + track *netutil.IPTracker + staticIP, fallbackIP net.IP + fallbackUDP int } // NewLocalNode creates a local node. func NewLocalNode(db *DB, key *ecdsa.PrivateKey) *LocalNode { ln := &LocalNode{ - id: PubkeyToIDV4(&key.PublicKey), - db: db, - key: key, - udpTrack: netutil.NewIPTracker(iptrackWindow, iptrackContactWindow, iptrackMinStatements), - entries: make(map[string]enr.Entry), + id: PubkeyToIDV4(&key.PublicKey), + db: db, + key: key, + entries: make(map[string]enr.Entry), + endpoint4: lnEndpoint{ + track: netutil.NewIPTracker(iptrackWindow, iptrackContactWindow, iptrackMinStatements), + }, + endpoint6: lnEndpoint{ + track: netutil.NewIPTracker(iptrackWindow, iptrackContactWindow, iptrackMinStatements), + }, } ln.seq = db.localSeq(ln.id) ln.invalidate() @@ -89,13 +98,22 @@ func (ln *LocalNode) Node() *Node { return ln.cur.Load().(*Node) } +// Seq returns the current sequence number of the local node record. +func (ln *LocalNode) Seq() uint64 { + ln.mu.Lock() + defer ln.mu.Unlock() + + return ln.seq +} + // ID returns the local node ID. func (ln *LocalNode) ID() ID { return ln.id } -// Set puts the given entry into the local record, overwriting -// any existing value. +// Set puts the given entry into the local record, overwriting any existing value. +// Use Set*IP and SetFallbackUDP to set IP addresses and UDP port, otherwise they'll +// be overwritten by the endpoint predictor. func (ln *LocalNode) Set(e enr.Entry) { ln.mu.Lock() defer ln.mu.Unlock() @@ -127,13 +145,20 @@ func (ln *LocalNode) delete(e enr.Entry) { } } +func (ln *LocalNode) endpointForIP(ip net.IP) *lnEndpoint { + if ip.To4() != nil { + return &ln.endpoint4 + } + return &ln.endpoint6 +} + // SetStaticIP sets the local IP to the given one unconditionally. // This disables endpoint prediction. func (ln *LocalNode) SetStaticIP(ip net.IP) { ln.mu.Lock() defer ln.mu.Unlock() - ln.staticIP = ip + ln.endpointForIP(ip).staticIP = ip ln.updateEndpoints() } @@ -143,17 +168,18 @@ func (ln *LocalNode) SetFallbackIP(ip net.IP) { ln.mu.Lock() defer ln.mu.Unlock() - ln.fallbackIP = ip + ln.endpointForIP(ip).fallbackIP = ip ln.updateEndpoints() } -// SetFallbackUDP sets the last-resort UDP port. This port is used +// SetFallbackUDP sets the last-resort UDP-on-IPv4 port. This port is used // if no endpoint prediction can be made. func (ln *LocalNode) SetFallbackUDP(port int) { ln.mu.Lock() defer ln.mu.Unlock() - ln.fallbackUDP = port + ln.endpoint4.fallbackUDP = port + ln.endpoint6.fallbackUDP = port ln.updateEndpoints() } @@ -163,7 +189,7 @@ func (ln *LocalNode) UDPEndpointStatement(fromaddr, endpoint *net.UDPAddr) { ln.mu.Lock() defer ln.mu.Unlock() - ln.udpTrack.AddStatement(fromaddr.String(), endpoint.String()) + ln.endpointForIP(endpoint.IP).track.AddStatement(fromaddr.String(), endpoint.String()) ln.updateEndpoints() } @@ -173,32 +199,50 @@ func (ln *LocalNode) UDPContact(toaddr *net.UDPAddr) { ln.mu.Lock() defer ln.mu.Unlock() - ln.udpTrack.AddContact(toaddr.String()) + ln.endpointForIP(toaddr.IP).track.AddContact(toaddr.String()) ln.updateEndpoints() } +// updateEndpoints updates the record with predicted endpoints. func (ln *LocalNode) updateEndpoints() { - // Determine the endpoints. - newIP := ln.fallbackIP - newUDP := ln.fallbackUDP - if ln.staticIP != nil { - newIP = ln.staticIP - } else if ip, port := predictAddr(ln.udpTrack); ip != nil { - newIP = ip - newUDP = port - } + ip4, udp4 := ln.endpoint4.get() + ip6, udp6 := ln.endpoint6.get() - // Update the record. - if newIP != nil && !newIP.IsUnspecified() { - ln.set(enr.IP(newIP)) - if newUDP != 0 { - ln.set(enr.UDP(newUDP)) - } else { - ln.delete(enr.UDP(0)) - } + if ip4 != nil && !ip4.IsUnspecified() { + ln.set(enr.IPv4(ip4)) } else { - ln.delete(enr.IP{}) + ln.delete(enr.IPv4{}) + } + if ip6 != nil && !ip6.IsUnspecified() { + ln.set(enr.IPv6(ip6)) + } else { + ln.delete(enr.IPv6{}) + } + if udp4 != 0 { + ln.set(enr.UDP(udp4)) + } else { + ln.delete(enr.UDP(0)) + } + if udp6 != 0 && udp6 != udp4 { + ln.set(enr.UDP6(udp6)) + } else { + ln.delete(enr.UDP6(0)) + } +} + +// get returns the endpoint with highest precedence. +func (e *lnEndpoint) get() (newIP net.IP, newPort int) { + newPort = e.fallbackUDP + if e.fallbackIP != nil { + newIP = e.fallbackIP + } + if e.staticIP != nil { + newIP = e.staticIP + } else if ip, port := predictAddr(e.track); ip != nil { + newIP = ip + newPort = port } + return newIP, newPort } // predictAddr wraps IPTracker.PredictEndpoint, converting from its string-based diff --git a/p2p/enode/localnode_test.go b/p2p/enode/localnode_test.go index da1e87b8b12a..00746a8d277a 100644 --- a/p2p/enode/localnode_test.go +++ b/p2p/enode/localnode_test.go @@ -17,10 +17,13 @@ package enode import ( + "math/rand" + "net" "testing" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/p2p/enr" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/stretchr/testify/assert" ) func newLocalNodeForTesting() (*LocalNode, *DB) { @@ -74,3 +77,46 @@ func TestLocalNodeSeqPersist(t *testing.T) { t.Fatalf("wrong seq %d on instance with changed key, want 1", s) } } + +// This test checks behavior of the endpoint predictor. +func TestLocalNodeEndpoint(t *testing.T) { + var ( + fallback = &net.UDPAddr{IP: net.IP{127, 0, 0, 1}, Port: 80} + predicted = &net.UDPAddr{IP: net.IP{127, 0, 1, 2}, Port: 81} + staticIP = net.IP{127, 0, 1, 2} + ) + ln, db := newLocalNodeForTesting() + defer db.Close() + + // Nothing is set initially. + assert.Equal(t, net.IP(nil), ln.Node().IP()) + assert.Equal(t, 0, ln.Node().UDP()) + assert.Equal(t, uint64(1), ln.Node().Seq()) + + // Set up fallback address. + ln.SetFallbackIP(fallback.IP) + ln.SetFallbackUDP(fallback.Port) + assert.Equal(t, fallback.IP, ln.Node().IP()) + assert.Equal(t, fallback.Port, ln.Node().UDP()) + assert.Equal(t, uint64(2), ln.Node().Seq()) + + // Add endpoint statements from random hosts. + for i := 0; i < iptrackMinStatements; i++ { + assert.Equal(t, fallback.IP, ln.Node().IP()) + assert.Equal(t, fallback.Port, ln.Node().UDP()) + assert.Equal(t, uint64(2), ln.Node().Seq()) + + from := &net.UDPAddr{IP: make(net.IP, 4), Port: 90} + rand.Read(from.IP) + ln.UDPEndpointStatement(from, predicted) + } + assert.Equal(t, predicted.IP, ln.Node().IP()) + assert.Equal(t, predicted.Port, ln.Node().UDP()) + assert.Equal(t, uint64(3), ln.Node().Seq()) + + // Static IP overrides prediction. + ln.SetStaticIP(staticIP) + assert.Equal(t, staticIP, ln.Node().IP()) + assert.Equal(t, fallback.Port, ln.Node().UDP()) + assert.Equal(t, uint64(4), ln.Node().Seq()) +} diff --git a/p2p/enode/node.go b/p2p/enode/node.go index fce2caafabe8..9eb2544ffe14 100644 --- a/p2p/enode/node.go +++ b/p2p/enode/node.go @@ -18,6 +18,7 @@ package enode import ( "crypto/ecdsa" + "encoding/base64" "encoding/hex" "errors" "fmt" @@ -26,9 +27,12 @@ import ( "net" "strings" - "github.com/nebulaai/nbai-node/p2p/enr" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/rlp" ) +var errMissingPrefix = errors.New("missing 'enr:' prefix for base64-encoded record") + // Node represents a host on the network. type Node struct { r enr.Record @@ -48,6 +52,34 @@ func New(validSchemes enr.IdentityScheme, r *enr.Record) (*Node, error) { return node, nil } +// MustParse parses a node record or enode:// URL. It panics if the input is invalid. +func MustParse(rawurl string) *Node { + n, err := Parse(ValidSchemes, rawurl) + if err != nil { + panic("invalid node: " + err.Error()) + } + return n +} + +// Parse decodes and verifies a base64-encoded node record. +func Parse(validSchemes enr.IdentityScheme, input string) (*Node, error) { + if strings.HasPrefix(input, "enode://") { + return ParseV4(input) + } + if !strings.HasPrefix(input, "enr:") { + return nil, errMissingPrefix + } + bin, err := base64.RawURLEncoding.DecodeString(input[4:]) + if err != nil { + return nil, err + } + var r enr.Record + if err := rlp.DecodeBytes(bin, &r); err != nil { + return nil, err + } + return New(validSchemes, &r) +} + // ID returns the node identifier. func (n *Node) ID() ID { return n.id @@ -68,11 +100,19 @@ func (n *Node) Load(k enr.Entry) error { return n.r.Load(k) } -// IP returns the IP address of the node. +// IP returns the IP address of the node. This prefers IPv4 addresses. func (n *Node) IP() net.IP { - var ip net.IP - n.Load((*enr.IP)(&ip)) - return ip + var ( + ip4 enr.IPv4 + ip6 enr.IPv6 + ) + if n.Load(&ip4) == nil { + return net.IP(ip4) + } + if n.Load(&ip6) == nil { + return net.IP(ip6) + } + return nil } // UDP returns the UDP port of the node. @@ -105,10 +145,11 @@ func (n *Node) Record() *enr.Record { return &cpy } -// checks whether n is a valid complete node. +// ValidateComplete checks whether n has a valid IP and UDP port. +// Deprecated: don't use this method. func (n *Node) ValidateComplete() error { if n.Incomplete() { - return errors.New("incomplete node") + return errors.New("missing IP address") } if n.UDP() == 0 { return errors.New("missing UDP port") @@ -122,20 +163,24 @@ func (n *Node) ValidateComplete() error { return n.Load(&key) } -// The string representation of a Node is a URL. -// Please see ParseNode for a description of the format. +// String returns the text representation of the record. func (n *Node) String() string { - return n.v4URL() + if isNewV4(n) { + return n.URLv4() // backwards-compatibility glue for NewV4 nodes + } + enc, _ := rlp.EncodeToBytes(&n.r) // always succeeds because record is valid + b64 := base64.RawURLEncoding.EncodeToString(enc) + return "enr:" + b64 } // MarshalText implements encoding.TextMarshaler. func (n *Node) MarshalText() ([]byte, error) { - return []byte(n.v4URL()), nil + return []byte(n.String()), nil } // UnmarshalText implements encoding.TextUnmarshaler. func (n *Node) UnmarshalText(text []byte) error { - dec, err := ParseV4(string(text)) + dec, err := Parse(ValidSchemes, string(text)) if err == nil { *n = *dec } diff --git a/p2p/enode/node_test.go b/p2p/enode/node_test.go index 3a232883f0c5..d15859c477a5 100644 --- a/p2p/enode/node_test.go +++ b/p2p/enode/node_test.go @@ -17,12 +17,15 @@ package enode import ( + "bytes" "encoding/hex" "fmt" + "math/big" "testing" + "testing/quick" - "github.com/nebulaai/nbai-node/p2p/enr" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/rlp" "github.com/stretchr/testify/assert" ) @@ -43,7 +46,7 @@ func TestPythonInterop(t *testing.T) { var ( wantID = HexID("a448f24c6d18e575453db13171562b71999873db5b286df957af199ec94617f7") wantSeq = uint64(1) - wantIP = enr.IP{127, 0, 0, 1} + wantIP = enr.IPv4{127, 0, 0, 1} wantUDP = enr.UDP(30303) ) if n.Seq() != wantSeq { @@ -52,7 +55,7 @@ func TestPythonInterop(t *testing.T) { if n.ID() != wantID { t.Errorf("wrong id: got %x, want %x", n.ID(), wantID) } - want := map[enr.Entry]interface{}{new(enr.IP): &wantIP, new(enr.UDP): &wantUDP} + want := map[enr.Entry]interface{}{new(enr.IPv4): &wantIP, new(enr.UDP): &wantUDP} for k, v := range want { desc := fmt.Sprintf("loading key %q", k.ENRKey()) if assert.NoError(t, n.Load(k), desc) { @@ -60,3 +63,83 @@ func TestPythonInterop(t *testing.T) { } } } + +func TestHexID(t *testing.T) { + ref := ID{0, 0, 0, 0, 0, 0, 0, 128, 106, 217, 182, 31, 165, 174, 1, 67, 7, 235, 220, 150, 66, 83, 173, 205, 159, 44, 10, 57, 42, 161, 26, 188} + id1 := HexID("0x00000000000000806ad9b61fa5ae014307ebdc964253adcd9f2c0a392aa11abc") + id2 := HexID("00000000000000806ad9b61fa5ae014307ebdc964253adcd9f2c0a392aa11abc") + + if id1 != ref { + t.Errorf("wrong id1\ngot %v\nwant %v", id1[:], ref[:]) + } + if id2 != ref { + t.Errorf("wrong id2\ngot %v\nwant %v", id2[:], ref[:]) + } +} + +func TestID_textEncoding(t *testing.T) { + ref := ID{ + 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, + } + hex := "0102030405060708091011121314151617181920212223242526272829303132" + + 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(ID) + 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 TestID_distcmp(t *testing.T) { + distcmpBig := func(target, a, b ID) int { + tbig := new(big.Int).SetBytes(target[:]) + abig := new(big.Int).SetBytes(a[:]) + bbig := new(big.Int).SetBytes(b[:]) + return new(big.Int).Xor(tbig, abig).Cmp(new(big.Int).Xor(tbig, bbig)) + } + if err := quick.CheckEqual(DistCmp, distcmpBig, nil); err != nil { + t.Error(err) + } +} + +// The random tests is likely to miss the case where a and b are equal, +// this test checks it explicitly. +func TestID_distcmpEqual(t *testing.T) { + base := ID{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} + x := ID{15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} + if DistCmp(base, x, x) != 0 { + t.Errorf("DistCmp(base, x, x) != 0") + } +} + +func TestID_logdist(t *testing.T) { + logdistBig := func(a, b ID) int { + abig, bbig := new(big.Int).SetBytes(a[:]), new(big.Int).SetBytes(b[:]) + return new(big.Int).Xor(abig, bbig).BitLen() + } + if err := quick.CheckEqual(LogDist, logdistBig, nil); err != nil { + t.Error(err) + } +} + +// The random tests is likely to miss the case where a and b are equal, +// this test checks it explicitly. +func TestID_logdistEqual(t *testing.T) { + x := ID{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} + if LogDist(x, x) != 0 { + t.Errorf("LogDist(x, x) != 0") + } +} diff --git a/p2p/enode/nodedb.go b/p2p/enode/nodedb.go index 6e868b76e99b..44332640c75d 100644 --- a/p2p/enode/nodedb.go +++ b/p2p/enode/nodedb.go @@ -1,4 +1,4 @@ -// Copyright 2015 The go-ethereum Authors +// Copyright 2018 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 @@ -21,12 +21,12 @@ import ( "crypto/rand" "encoding/binary" "fmt" + "net" "os" "sync" "time" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/rlp" "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/errors" "github.com/syndtr/goleveldb/leveldb/iterator" @@ -37,24 +37,31 @@ import ( // Keys in the node database. const ( - dbVersionKey = "version" // Version of the database to flush if changes - dbItemPrefix = "n:" // Identifier to prefix node entries with - - dbDiscoverRoot = ":discover" - dbDiscoverSeq = dbDiscoverRoot + ":seq" - dbDiscoverPing = dbDiscoverRoot + ":lastping" - dbDiscoverPong = dbDiscoverRoot + ":lastpong" - dbDiscoverFindFails = dbDiscoverRoot + ":findfail" - dbLocalRoot = ":local" - dbLocalSeq = dbLocalRoot + ":seq" + dbVersionKey = "version" // Version of the database to flush if changes + dbNodePrefix = "n:" // Identifier to prefix node entries with + dbLocalPrefix = "local:" + dbDiscoverRoot = "v4" + + // These fields are stored per ID and IP, the full key is "n::v4::findfail". + // Use nodeItemKey to create those keys. + dbNodeFindFails = "findfail" + dbNodePing = "lastping" + dbNodePong = "lastpong" + dbNodeSeq = "seq" + + // Local information is keyed by ID only, the full key is "local::seq". + // Use localItemKey to create those keys. + dbLocalSeq = "seq" ) -var ( +const ( dbNodeExpiration = 24 * time.Hour // Time after which an unseen node should be dropped. dbCleanupCycle = time.Hour // Time period for running the expiration task. - dbVersion = 7 + dbVersion = 9 ) +var zeroIP = make(net.IP, 16) + // DB is the node database, storing previously seen nodes and any collected metadata about // them for QoS purposes. type DB struct { @@ -119,27 +126,58 @@ func newPersistentDB(path string) (*DB, error) { return &DB{lvl: db, quit: make(chan struct{})}, nil } -// makeKey generates the leveldb key-blob from a node id and its particular -// field of interest. -func makeKey(id ID, field string) []byte { - if (id == ID{}) { - return []byte(field) - } - return append([]byte(dbItemPrefix), append(id[:], field...)...) +// nodeKey returns the database key for a node record. +func nodeKey(id ID) []byte { + key := append([]byte(dbNodePrefix), id[:]...) + key = append(key, ':') + key = append(key, dbDiscoverRoot...) + return key } -// splitKey tries to split a database key into a node id and a field part. -func splitKey(key []byte) (id ID, field string) { - // If the key is not of a node, return it plainly - if !bytes.HasPrefix(key, []byte(dbItemPrefix)) { - return ID{}, string(key) +// splitNodeKey returns the node ID of a key created by nodeKey. +func splitNodeKey(key []byte) (id ID, rest []byte) { + if !bytes.HasPrefix(key, []byte(dbNodePrefix)) { + return ID{}, nil } - // Otherwise split the id and field - item := key[len(dbItemPrefix):] + item := key[len(dbNodePrefix):] copy(id[:], item[:len(id)]) - field = string(item[len(id):]) + return id, item[len(id)+1:] +} - return id, field +// nodeItemKey returns the database key for a node metadata field. +func nodeItemKey(id ID, ip net.IP, field string) []byte { + ip16 := ip.To16() + if ip16 == nil { + panic(fmt.Errorf("invalid IP (length %d)", len(ip))) + } + return bytes.Join([][]byte{nodeKey(id), ip16, []byte(field)}, []byte{':'}) +} + +// splitNodeItemKey returns the components of a key created by nodeItemKey. +func splitNodeItemKey(key []byte) (id ID, ip net.IP, field string) { + id, key = splitNodeKey(key) + // Skip discover root. + if string(key) == dbDiscoverRoot { + return id, nil, "" + } + key = key[len(dbDiscoverRoot)+1:] + // Split out the IP. + ip = net.IP(key[:16]) + if ip4 := ip.To4(); ip4 != nil { + ip = ip4 + } + key = key[16+1:] + // Field is the remainder of key. + field = string(key) + return id, ip, field +} + +// localItemKey returns the key of a local node item. +func localItemKey(id ID, field string) []byte { + key := append([]byte(dbLocalPrefix), id[:]...) + key = append(key, ':') + key = append(key, field...) + return key } // fetchInt64 retrieves an integer associated with a particular key. @@ -181,7 +219,7 @@ func (db *DB) storeUint64(key []byte, n uint64) error { // Node retrieves a node with a given id from the database. func (db *DB) Node(id ID) *Node { - blob, err := db.lvl.Get(makeKey(id, dbDiscoverRoot), nil) + blob, err := db.lvl.Get(nodeKey(id), nil) if err != nil { return nil } @@ -207,15 +245,15 @@ func (db *DB) UpdateNode(node *Node) error { if err != nil { return err } - if err := db.lvl.Put(makeKey(node.ID(), dbDiscoverRoot), blob, nil); err != nil { + if err := db.lvl.Put(nodeKey(node.ID()), blob, nil); err != nil { return err } - return db.storeUint64(makeKey(node.ID(), dbDiscoverSeq), node.Seq()) + return db.storeUint64(nodeItemKey(node.ID(), zeroIP, dbNodeSeq), node.Seq()) } // NodeSeq returns the stored record sequence number of the given node. func (db *DB) NodeSeq(id ID) uint64 { - return db.fetchUint64(makeKey(id, dbDiscoverSeq)) + return db.fetchUint64(nodeItemKey(id, zeroIP, dbNodeSeq)) } // Resolve returns the stored record of the node if it has a larger sequence @@ -227,15 +265,17 @@ func (db *DB) Resolve(n *Node) *Node { return db.Node(n.ID()) } -// DeleteNode deletes all information/keys associated with a node. -func (db *DB) DeleteNode(id ID) error { - deleter := db.lvl.NewIterator(util.BytesPrefix(makeKey(id, "")), nil) - for deleter.Next() { - if err := db.lvl.Delete(deleter.Key(), nil); err != nil { - return err - } +// DeleteNode deletes all information associated with a node. +func (db *DB) DeleteNode(id ID) { + deleteRange(db.lvl, nodeKey(id)) +} + +func deleteRange(db *leveldb.DB, prefix []byte) { + it := db.NewIterator(util.BytesPrefix(prefix), nil) + defer it.Release() + for it.Next() { + db.Delete(it.Key(), nil) } - return nil } // ensureExpirer is a small helper method ensuring that the data expiration @@ -259,9 +299,7 @@ func (db *DB) expirer() { for { select { case <-tick.C: - if err := db.expireNodes(); err != nil { - log.Error("Failed to expire nodedb items", "err", err) - } + db.expireNodes() case <-db.quit: return } @@ -269,71 +307,85 @@ func (db *DB) expirer() { } // expireNodes iterates over the database and deletes all nodes that have not -// been seen (i.e. received a pong from) for some allotted time. -func (db *DB) expireNodes() error { - threshold := time.Now().Add(-dbNodeExpiration) - - // Find discovered nodes that are older than the allowance - it := db.lvl.NewIterator(nil, nil) +// been seen (i.e. received a pong from) for some time. +func (db *DB) expireNodes() { + it := db.lvl.NewIterator(util.BytesPrefix([]byte(dbNodePrefix)), nil) defer it.Release() + if !it.Next() { + return + } - for it.Next() { - // Skip the item if not a discovery node - id, field := splitKey(it.Key()) - if field != dbDiscoverRoot { - continue + var ( + threshold = time.Now().Add(-dbNodeExpiration).Unix() + youngestPong int64 + atEnd = false + ) + for !atEnd { + id, ip, field := splitNodeItemKey(it.Key()) + if field == dbNodePong { + time, _ := binary.Varint(it.Value()) + if time > youngestPong { + youngestPong = time + } + if time < threshold { + // Last pong from this IP older than threshold, remove fields belonging to it. + deleteRange(db.lvl, nodeItemKey(id, ip, "")) + } } - // Skip the node if not expired yet (and not self) - if seen := db.LastPongReceived(id); seen.After(threshold) { - continue + atEnd = !it.Next() + nextID, _ := splitNodeKey(it.Key()) + if atEnd || nextID != id { + // We've moved beyond the last entry of the current ID. + // Remove everything if there was no recent enough pong. + if youngestPong > 0 && youngestPong < threshold { + deleteRange(db.lvl, nodeKey(id)) + } + youngestPong = 0 } - // Otherwise delete all associated information - db.DeleteNode(id) } - return nil } // LastPingReceived retrieves the time of the last ping packet received from // a remote node. -func (db *DB) LastPingReceived(id ID) time.Time { - return time.Unix(db.fetchInt64(makeKey(id, dbDiscoverPing)), 0) +func (db *DB) LastPingReceived(id ID, ip net.IP) time.Time { + return time.Unix(db.fetchInt64(nodeItemKey(id, ip, dbNodePing)), 0) } // UpdateLastPingReceived updates the last time we tried contacting a remote node. -func (db *DB) UpdateLastPingReceived(id ID, instance time.Time) error { - return db.storeInt64(makeKey(id, dbDiscoverPing), instance.Unix()) +func (db *DB) UpdateLastPingReceived(id ID, ip net.IP, instance time.Time) error { + return db.storeInt64(nodeItemKey(id, ip, dbNodePing), instance.Unix()) } // LastPongReceived retrieves the time of the last successful pong from remote node. -func (db *DB) LastPongReceived(id ID) time.Time { +func (db *DB) LastPongReceived(id ID, ip net.IP) time.Time { // Launch expirer db.ensureExpirer() - return time.Unix(db.fetchInt64(makeKey(id, dbDiscoverPong)), 0) + return time.Unix(db.fetchInt64(nodeItemKey(id, ip, dbNodePong)), 0) } // UpdateLastPongReceived updates the last pong time of a node. -func (db *DB) UpdateLastPongReceived(id ID, instance time.Time) error { - return db.storeInt64(makeKey(id, dbDiscoverPong), instance.Unix()) +func (db *DB) UpdateLastPongReceived(id ID, ip net.IP, instance time.Time) error { + return db.storeInt64(nodeItemKey(id, ip, dbNodePong), instance.Unix()) } // FindFails retrieves the number of findnode failures since bonding. -func (db *DB) FindFails(id ID) int { - return int(db.fetchInt64(makeKey(id, dbDiscoverFindFails))) +func (db *DB) FindFails(id ID, ip net.IP) int { + return int(db.fetchInt64(nodeItemKey(id, ip, dbNodeFindFails))) } // UpdateFindFails updates the number of findnode failures since bonding. -func (db *DB) UpdateFindFails(id ID, fails int) error { - return db.storeInt64(makeKey(id, dbDiscoverFindFails), int64(fails)) +func (db *DB) UpdateFindFails(id ID, ip net.IP, fails int) error { + return db.storeInt64(nodeItemKey(id, ip, dbNodeFindFails), int64(fails)) } // LocalSeq retrieves the local record sequence counter. func (db *DB) localSeq(id ID) uint64 { - return db.fetchUint64(makeKey(id, dbLocalSeq)) + return db.fetchUint64(localItemKey(id, dbLocalSeq)) } // storeLocalSeq stores the local record sequence counter. func (db *DB) storeLocalSeq(id ID, n uint64) { - db.storeUint64(makeKey(id, dbLocalSeq), n) + db.storeUint64(localItemKey(id, dbLocalSeq), n) } // QuerySeeds retrieves random nodes to be used as potential seed nodes @@ -355,14 +407,14 @@ seek: ctr := id[0] rand.Read(id[:]) id[0] = ctr + id[0]%16 - it.Seek(makeKey(id, dbDiscoverRoot)) + it.Seek(nodeKey(id)) n := nextNode(it) if n == nil { id[0] = 0 continue seek // iterator exhausted } - if now.Sub(db.LastPongReceived(n.ID())) > maxAge { + if now.Sub(db.LastPongReceived(n.ID(), n.IP())) > maxAge { continue seek } for i := range nodes { @@ -379,8 +431,8 @@ seek: // database entries. func nextNode(it iterator.Iterator) *Node { for end := false; !end; end = !it.Next() { - id, field := splitKey(it.Key()) - if field != dbDiscoverRoot { + id, rest := splitNodeKey(it.Key()) + if string(rest) != dbDiscoverRoot { continue } return mustDecodeNode(id[:], it.Value()) diff --git a/p2p/enode/nodedb_test.go b/p2p/enode/nodedb_test.go index 96794827cf31..2adb14145d15 100644 --- a/p2p/enode/nodedb_test.go +++ b/p2p/enode/nodedb_test.go @@ -1,4 +1,4 @@ -// Copyright 2015 The go-ethereum Authors +// Copyright 2018 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 @@ -28,42 +28,54 @@ import ( "time" ) -var nodeDBKeyTests = []struct { - id ID - field string - key []byte -}{ - { - id: ID{}, - field: "version", - key: []byte{0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e}, // field - }, - { - id: HexID("51232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), - field: ":discover", - key: []byte{ - 0x6e, 0x3a, // prefix - 0x51, 0x23, 0x2b, 0x8d, 0x78, 0x21, 0x61, 0x7d, // node id - 0x2b, 0x29, 0xb5, 0x4b, 0x81, 0xcd, 0xef, 0xb9, // - 0xb3, 0xe9, 0xc3, 0x7d, 0x7f, 0xd5, 0xf6, 0x32, // - 0x70, 0xbc, 0xc9, 0xe1, 0xa6, 0xf6, 0xa4, 0x39, // - 0x3a, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, // field - }, - }, +var keytestID = HexID("51232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439") + +func TestDBNodeKey(t *testing.T) { + enc := nodeKey(keytestID) + want := []byte{ + 'n', ':', + 0x51, 0x23, 0x2b, 0x8d, 0x78, 0x21, 0x61, 0x7d, // node id + 0x2b, 0x29, 0xb5, 0x4b, 0x81, 0xcd, 0xef, 0xb9, // + 0xb3, 0xe9, 0xc3, 0x7d, 0x7f, 0xd5, 0xf6, 0x32, // + 0x70, 0xbc, 0xc9, 0xe1, 0xa6, 0xf6, 0xa4, 0x39, // + ':', 'v', '4', + } + if !bytes.Equal(enc, want) { + t.Errorf("wrong encoded key:\ngot %q\nwant %q", enc, want) + } + id, _ := splitNodeKey(enc) + if id != keytestID { + t.Errorf("wrong ID from splitNodeKey") + } } -func TestDBKeys(t *testing.T) { - for i, tt := range nodeDBKeyTests { - if key := makeKey(tt.id, tt.field); !bytes.Equal(key, tt.key) { - t.Errorf("make test %d: key mismatch: have 0x%x, want 0x%x", i, key, tt.key) - } - id, field := splitKey(tt.key) - if !bytes.Equal(id[:], tt.id[:]) { - t.Errorf("split test %d: id mismatch: have 0x%x, want 0x%x", i, id, tt.id) - } - if field != tt.field { - t.Errorf("split test %d: field mismatch: have 0x%x, want 0x%x", i, field, tt.field) - } +func TestDBNodeItemKey(t *testing.T) { + wantIP := net.IP{127, 0, 0, 3} + wantField := "foobar" + enc := nodeItemKey(keytestID, wantIP, wantField) + want := []byte{ + 'n', ':', + 0x51, 0x23, 0x2b, 0x8d, 0x78, 0x21, 0x61, 0x7d, // node id + 0x2b, 0x29, 0xb5, 0x4b, 0x81, 0xcd, 0xef, 0xb9, // + 0xb3, 0xe9, 0xc3, 0x7d, 0x7f, 0xd5, 0xf6, 0x32, // + 0x70, 0xbc, 0xc9, 0xe1, 0xa6, 0xf6, 0xa4, 0x39, // + ':', 'v', '4', ':', + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // IP + 0x00, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x03, // + ':', 'f', 'o', 'o', 'b', 'a', 'r', + } + if !bytes.Equal(enc, want) { + t.Errorf("wrong encoded key:\ngot %q\nwant %q", enc, want) + } + id, ip, field := splitNodeItemKey(enc) + if id != keytestID { + t.Errorf("splitNodeItemKey returned wrong ID: %v", id) + } + if !ip.Equal(wantIP) { + t.Errorf("splitNodeItemKey returned wrong IP: %v", ip) + } + if field != wantField { + t.Errorf("splitNodeItemKey returned wrong field: %q", field) } } @@ -113,33 +125,33 @@ func TestDBFetchStore(t *testing.T) { defer db.Close() // Check fetch/store operations on a node ping object - if stored := db.LastPingReceived(node.ID()); stored.Unix() != 0 { + if stored := db.LastPingReceived(node.ID(), node.IP()); stored.Unix() != 0 { t.Errorf("ping: non-existing object: %v", stored) } - if err := db.UpdateLastPingReceived(node.ID(), inst); err != nil { + if err := db.UpdateLastPingReceived(node.ID(), node.IP(), inst); err != nil { t.Errorf("ping: failed to update: %v", err) } - if stored := db.LastPingReceived(node.ID()); stored.Unix() != inst.Unix() { + if stored := db.LastPingReceived(node.ID(), node.IP()); stored.Unix() != inst.Unix() { t.Errorf("ping: value mismatch: have %v, want %v", stored, inst) } // Check fetch/store operations on a node pong object - if stored := db.LastPongReceived(node.ID()); stored.Unix() != 0 { + if stored := db.LastPongReceived(node.ID(), node.IP()); stored.Unix() != 0 { t.Errorf("pong: non-existing object: %v", stored) } - if err := db.UpdateLastPongReceived(node.ID(), inst); err != nil { + if err := db.UpdateLastPongReceived(node.ID(), node.IP(), inst); err != nil { t.Errorf("pong: failed to update: %v", err) } - if stored := db.LastPongReceived(node.ID()); stored.Unix() != inst.Unix() { + if stored := db.LastPongReceived(node.ID(), node.IP()); stored.Unix() != inst.Unix() { t.Errorf("pong: value mismatch: have %v, want %v", stored, inst) } // Check fetch/store operations on a node findnode-failure object - if stored := db.FindFails(node.ID()); stored != 0 { + if stored := db.FindFails(node.ID(), node.IP()); stored != 0 { t.Errorf("find-node fails: non-existing object: %v", stored) } - if err := db.UpdateFindFails(node.ID(), num); err != nil { + if err := db.UpdateFindFails(node.ID(), node.IP(), num); err != nil { t.Errorf("find-node fails: failed to update: %v", err) } - if stored := db.FindFails(node.ID()); stored != num { + if stored := db.FindFails(node.ID(), node.IP()); stored != num { t.Errorf("find-node fails: value mismatch: have %v, want %v", stored, num) } // Check fetch/store operations on an actual node object @@ -256,7 +268,7 @@ func testSeedQuery() error { if err := db.UpdateNode(seed.node); err != nil { return fmt.Errorf("node %d: failed to insert: %v", i, err) } - if err := db.UpdateLastPongReceived(seed.node.ID(), seed.pong); err != nil { + if err := db.UpdateLastPongReceived(seed.node.ID(), seed.node.IP(), seed.pong); err != nil { return fmt.Errorf("node %d: failed to insert bondTime: %v", i, err) } } @@ -321,10 +333,12 @@ func TestDBPersistency(t *testing.T) { } var nodeDBExpirationNodes = []struct { - node *Node - pong time.Time - exp bool + node *Node + pong time.Time + storeNode bool + exp bool }{ + // Node has new enough pong time and isn't expired: { node: NewV4( hexPubkey("8d110e2ed4b446d9b5fb50f117e5f37fb7597af455e1dab0e6f045a6eeaa786a6781141659020d38bdc5e698ed3d4d2bafa8b5061810dfa63e8ac038db2e9b67"), @@ -332,17 +346,79 @@ var nodeDBExpirationNodes = []struct { 30303, 30303, ), - pong: time.Now().Add(-dbNodeExpiration + time.Minute), - exp: false, - }, { + storeNode: true, + pong: time.Now().Add(-dbNodeExpiration + time.Minute), + exp: false, + }, + // Node with pong time before expiration is removed: + { node: NewV4( hexPubkey("913a205579c32425b220dfba999d215066e5bdbf900226b11da1907eae5e93eb40616d47412cf819664e9eacbdfcca6b0c6e07e09847a38472d4be46ab0c3672"), net.IP{127, 0, 0, 2}, 30303, 30303, ), - pong: time.Now().Add(-dbNodeExpiration - time.Minute), - exp: true, + storeNode: true, + pong: time.Now().Add(-dbNodeExpiration - time.Minute), + exp: true, + }, + // Just pong time, no node stored: + { + node: NewV4( + hexPubkey("b56670e0b6bad2c5dab9f9fe6f061a16cf78d68b6ae2cfda3144262d08d97ce5f46fd8799b6d1f709b1abe718f2863e224488bd7518e5e3b43809ac9bd1138ca"), + net.IP{127, 0, 0, 3}, + 30303, + 30303, + ), + storeNode: false, + pong: time.Now().Add(-dbNodeExpiration - time.Minute), + exp: true, + }, + // Node with multiple pong times, all older than expiration. + { + node: NewV4( + hexPubkey("29f619cebfd32c9eab34aec797ed5e3fe15b9b45be95b4df3f5fe6a9ae892f433eb08d7698b2ef3621568b0fb70d57b515ab30d4e72583b798298e0f0a66b9d1"), + net.IP{127, 0, 0, 4}, + 30303, + 30303, + ), + storeNode: true, + pong: time.Now().Add(-dbNodeExpiration - time.Minute), + exp: true, + }, + { + node: NewV4( + hexPubkey("29f619cebfd32c9eab34aec797ed5e3fe15b9b45be95b4df3f5fe6a9ae892f433eb08d7698b2ef3621568b0fb70d57b515ab30d4e72583b798298e0f0a66b9d1"), + net.IP{127, 0, 0, 5}, + 30303, + 30303, + ), + storeNode: false, + pong: time.Now().Add(-dbNodeExpiration - 2*time.Minute), + exp: true, + }, + // Node with multiple pong times, one newer, one older than expiration. + { + node: NewV4( + hexPubkey("3b73a9e5f4af6c4701c57c73cc8cfa0f4802840b24c11eba92aac3aef65644a3728b4b2aec8199f6d72bd66be2c65861c773129039bd47daa091ca90a6d4c857"), + net.IP{127, 0, 0, 6}, + 30303, + 30303, + ), + storeNode: true, + pong: time.Now().Add(-dbNodeExpiration + time.Minute), + exp: false, + }, + { + node: NewV4( + hexPubkey("3b73a9e5f4af6c4701c57c73cc8cfa0f4802840b24c11eba92aac3aef65644a3728b4b2aec8199f6d72bd66be2c65861c773129039bd47daa091ca90a6d4c857"), + net.IP{127, 0, 0, 7}, + 30303, + 30303, + ), + storeNode: false, + pong: time.Now().Add(-dbNodeExpiration - time.Minute), + exp: true, }, } @@ -350,23 +426,39 @@ func TestDBExpiration(t *testing.T) { db, _ := OpenDB("") defer db.Close() - // Add all the test nodes and set their last pong time + // Add all the test nodes and set their last pong time. for i, seed := range nodeDBExpirationNodes { - if err := db.UpdateNode(seed.node); err != nil { - t.Fatalf("node %d: failed to insert: %v", i, err) + if seed.storeNode { + if err := db.UpdateNode(seed.node); err != nil { + t.Fatalf("node %d: failed to insert: %v", i, err) + } } - if err := db.UpdateLastPongReceived(seed.node.ID(), seed.pong); err != nil { + if err := db.UpdateLastPongReceived(seed.node.ID(), seed.node.IP(), seed.pong); err != nil { t.Fatalf("node %d: failed to update bondTime: %v", i, err) } } - // Expire some of them, and check the rest - if err := db.expireNodes(); err != nil { - t.Fatalf("failed to expire nodes: %v", err) - } + + db.expireNodes() + + // Check that expired entries have been removed. + unixZeroTime := time.Unix(0, 0) for i, seed := range nodeDBExpirationNodes { node := db.Node(seed.node.ID()) - if (node == nil && !seed.exp) || (node != nil && seed.exp) { - t.Errorf("node %d: expiration mismatch: have %v, want %v", i, node, seed.exp) + pong := db.LastPongReceived(seed.node.ID(), seed.node.IP()) + if seed.exp { + if seed.storeNode && node != nil { + t.Errorf("node %d (%s) shouldn't be present after expiration", i, seed.node.ID().TerminalString()) + } + if !pong.Equal(unixZeroTime) { + t.Errorf("pong time %d (%s %v) shouldn't be present after expiration", i, seed.node.ID().TerminalString(), seed.node.IP()) + } + } else { + if seed.storeNode && node == nil { + t.Errorf("node %d (%s) should be present after expiration", i, seed.node.ID().TerminalString()) + } + if !pong.Equal(seed.pong.Truncate(1 * time.Second)) { + t.Errorf("pong time %d (%s) should be %v after expiration, but is %v", i, seed.node.ID().TerminalString(), seed.pong, pong) + } } } } diff --git a/p2p/enode/urlv4.go b/p2p/enode/urlv4.go index f4b1f6176f5a..2e3f9ba00e6c 100644 --- a/p2p/enode/urlv4.go +++ b/p2p/enode/urlv4.go @@ -26,12 +26,15 @@ import ( "regexp" "strconv" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/p2p/enr" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/enr" ) -var incompleteNodeURL = regexp.MustCompile("(?i)^(?:enode://)?([0-9a-f]+)$") +var ( + incompleteNodeURL = regexp.MustCompile("(?i)^(?:enode://)?([0-9a-f]+)$") + lookupIPFunc = net.LookupIP +) // MustParseV4 parses a node URL. It panics if the URL is not valid. func MustParseV4(rawurl string) *Node { @@ -70,7 +73,7 @@ func ParseV4(rawurl string) (*Node, error) { if m := incompleteNodeURL.FindStringSubmatch(rawurl); m != nil { id, err := parsePubkey(m[1]) if err != nil { - return nil, fmt.Errorf("invalid node ID (%v)", err) + return nil, fmt.Errorf("invalid public key (%v)", err) } return NewV4(id, nil, 0, 0), nil } @@ -81,7 +84,7 @@ func ParseV4(rawurl string) (*Node, error) { // contained in the node has a zero-length signature. func NewV4(pubkey *ecdsa.PublicKey, ip net.IP, tcp, udp int) *Node { var r enr.Record - if ip != nil { + if len(ip) > 0 { r.Set(enr.IP(ip)) } if udp != 0 { @@ -98,10 +101,15 @@ func NewV4(pubkey *ecdsa.PublicKey, ip net.IP, tcp, udp int) *Node { return n } +// isNewV4 returns true for nodes created by NewV4. +func isNewV4(n *Node) bool { + var k s256raw + return n.r.IdentityScheme() == "" && n.r.Load(&k) == nil && len(n.r.Signature()) == 0 +} + func parseComplete(rawurl string) (*Node, error) { var ( id *ecdsa.PublicKey - ip net.IP tcpPort, udpPort uint64 ) u, err := url.Parse(rawurl) @@ -116,22 +124,23 @@ func parseComplete(rawurl string) (*Node, error) { return nil, errors.New("does not contain node ID") } if id, err = parsePubkey(u.User.String()); err != nil { - return nil, fmt.Errorf("invalid node ID (%v)", err) + return nil, fmt.Errorf("invalid public key (%v)", err) } // Parse the IP address. - host, port, err := net.SplitHostPort(u.Host) - if err != nil { - return nil, fmt.Errorf("invalid host: %v", err) - } - if ip = net.ParseIP(host); ip == nil { - return nil, errors.New("invalid IP address") + ip := net.ParseIP(u.Hostname()) + if ip == nil { + ips, err := lookupIPFunc(u.Hostname()) + if err != nil { + return nil, err + } + ip = ips[0] } // Ensure the IP is 4 bytes long for IPv4 addresses. if ipv4 := ip.To4(); ipv4 != nil { ip = ipv4 } // Parse the port numbers. - if tcpPort, err = strconv.ParseUint(port, 10, 16); err != nil { + if tcpPort, err = strconv.ParseUint(u.Port(), 10, 16); err != nil { return nil, errors.New("invalid port") } udpPort = tcpPort @@ -157,7 +166,7 @@ func parsePubkey(in string) (*ecdsa.PublicKey, error) { return crypto.UnmarshalPubkey(b) } -func (n *Node) v4URL() string { +func (n *Node) URLv4() string { var ( scheme enr.ID nodeid string diff --git a/p2p/enode/urlv4_test.go b/p2p/enode/urlv4_test.go index 3680ab6b78b6..33de96cc57f1 100644 --- a/p2p/enode/urlv4_test.go +++ b/p2p/enode/urlv4_test.go @@ -17,53 +17,82 @@ package enode import ( - "bytes" "crypto/ecdsa" - "math/big" + "errors" "net" "reflect" "strings" "testing" - "testing/quick" + + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/p2p/enr" ) +func init() { + lookupIPFunc = func(name string) ([]net.IP, error) { + if name == "node.example.org" { + return []net.IP{{33, 44, 55, 66}}, nil + } + return nil, errors.New("no such host") + } +} + var parseNodeTests = []struct { - rawurl string + input string wantError string wantResult *Node }{ + // Records + { + input: "enr:-IS4QGrdq0ugARp5T2BZ41TrZOqLc_oKvZoPuZP5--anqWE_J-Tucc1xgkOL7qXl0puJgT7qc2KSvcupc4NCb0nr4tdjgmlkgnY0gmlwhH8AAAGJc2VjcDI1NmsxoQM6UUF2Rm-oFe1IH_rQkRCi00T2ybeMHRSvw1HDpRvjPYN1ZHCCdl8", + wantResult: func() *Node { + testKey, _ := crypto.HexToECDSA("45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8") + var r enr.Record + r.Set(enr.IP{127, 0, 0, 1}) + r.Set(enr.UDP(30303)) + r.SetSeq(99) + SignV4(&r, testKey) + n, _ := New(ValidSchemes, &r) + return n + }(), + }, + // Invalid Records { - rawurl: "http://foobar", - wantError: `invalid URL scheme, want "enode"`, + input: "enr:", + wantError: "EOF", // could be nicer }, { - rawurl: "enode://01010101@123.124.125.126:3", - wantError: `invalid node ID (wrong length, want 128 hex chars)`, + input: "enr:x", + wantError: "illegal base64 data at input byte 0", }, - // Complete nodes with IP address. { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@hostname:3", - wantError: `invalid IP address`, + input: "enr:-EmGZm9vYmFyY4JpZIJ2NIJpcIR_AAABiXNlY3AyNTZrMaEDOlFBdkZvqBXtSB_60JEQotNE9sm3jB0Ur8NRw6Ub4z2DdWRwgnZf", + wantError: enr.ErrInvalidSig.Error(), }, + // Complete node URLs with IP address and ports { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:foo", + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@invalid.:3", + wantError: `no such host`, + }, + { + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:foo", wantError: `invalid port`, }, { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:3?discport=foo", + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:3?discport=foo", wantError: `invalid discport in query`, }, { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:52150", + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:52150", wantResult: NewV4( hexPubkey("1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), - net.IP{0x7f, 0x0, 0x0, 0x1}, + net.IP{127, 0, 0, 1}, 52150, 52150, ), }, { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@[::]:52150", + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@[::]:52150", wantResult: NewV4( hexPubkey("1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.ParseIP("::"), @@ -72,7 +101,7 @@ var parseNodeTests = []struct { ), }, { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@[2001:db8:3c4d:15::abcd:ef12]:52150", + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@[2001:db8:3c4d:15::abcd:ef12]:52150", wantResult: NewV4( hexPubkey("1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.ParseIP("2001:db8:3c4d:15::abcd:ef12"), @@ -81,7 +110,7 @@ var parseNodeTests = []struct { ), }, { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:52150?discport=22334", + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439@127.0.0.1:52150?discport=22334", wantResult: NewV4( hexPubkey("1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), net.IP{0x7f, 0x0, 0x0, 0x1}, @@ -89,34 +118,42 @@ var parseNodeTests = []struct { 22334, ), }, - // Incomplete nodes with no address. + // Incomplete node URLs with no address { - rawurl: "1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439", + input: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439", wantResult: NewV4( hexPubkey("1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), nil, 0, 0, ), }, + // Invalid URLs { - rawurl: "enode://1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439", - wantResult: NewV4( - hexPubkey("1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439"), - nil, 0, 0, - ), + input: "", + wantError: errMissingPrefix.Error(), + }, + { + input: "1dd9d65c4552b5eb43d5ad55a2ee3f56c6cbc1c64a5c8d659f51fcd51bace24351232b8d7821617d2b29b54b81cdefb9b3e9c37d7fd5f63270bcc9e1a6f6a439", + wantError: errMissingPrefix.Error(), + }, + { + input: "01010101", + wantError: errMissingPrefix.Error(), }, - // Invalid URLs { - rawurl: "01010101", - wantError: `invalid node ID (wrong length, want 128 hex chars)`, + input: "enode://01010101@123.124.125.126:3", + wantError: `invalid public key (wrong length, want 128 hex chars)`, }, { - rawurl: "enode://01010101", - wantError: `invalid node ID (wrong length, want 128 hex chars)`, + input: "enode://01010101", + wantError: `invalid public key (wrong length, want 128 hex chars)`, }, { - // This test checks that errors from url.Parse are handled. - rawurl: "://foo", - wantError: `parse ://foo: missing protocol scheme`, + input: "http://foobar", + wantError: errMissingPrefix.Error(), + }, + { + input: "://foo", + wantError: errMissingPrefix.Error(), }, } @@ -130,22 +167,22 @@ func hexPubkey(h string) *ecdsa.PublicKey { func TestParseNode(t *testing.T) { for _, test := range parseNodeTests { - n, err := ParseV4(test.rawurl) + n, err := Parse(ValidSchemes, test.input) if test.wantError != "" { if err == nil { - t.Errorf("test %q:\n got nil error, expected %#q", test.rawurl, test.wantError) + t.Errorf("test %q:\n got nil error, expected %#q", test.input, test.wantError) continue - } else if err.Error() != test.wantError { - t.Errorf("test %q:\n got error %#q, expected %#q", test.rawurl, err.Error(), test.wantError) + } else if !strings.Contains(err.Error(), test.wantError) { + t.Errorf("test %q:\n got error %#q, expected %#q", test.input, err.Error(), test.wantError) continue } } else { if err != nil { - t.Errorf("test %q:\n unexpected error: %v", test.rawurl, err) + t.Errorf("test %q:\n unexpected error: %v", test.input, err) continue } if !reflect.DeepEqual(n, test.wantResult) { - t.Errorf("test %q:\n result mismatch:\ngot: %#v\nwant: %#v", test.rawurl, n, test.wantResult) + t.Errorf("test %q:\n result mismatch:\ngot: %#v\nwant: %#v", test.input, n, test.wantResult) } } } @@ -153,91 +190,11 @@ func TestParseNode(t *testing.T) { func TestNodeString(t *testing.T) { for i, test := range parseNodeTests { - if test.wantError == "" && strings.HasPrefix(test.rawurl, "enode://") { + if test.wantError == "" && strings.HasPrefix(test.input, "enode://") { str := test.wantResult.String() - if str != test.rawurl { - t.Errorf("test %d: Node.String() mismatch:\ngot: %s\nwant: %s", i, str, test.rawurl) + if str != test.input { + t.Errorf("test %d: Node.String() mismatch:\ngot: %s\nwant: %s", i, str, test.input) } } } } - -func TestHexID(t *testing.T) { - ref := ID{0, 0, 0, 0, 0, 0, 0, 128, 106, 217, 182, 31, 165, 174, 1, 67, 7, 235, 220, 150, 66, 83, 173, 205, 159, 44, 10, 57, 42, 161, 26, 188} - id1 := HexID("0x00000000000000806ad9b61fa5ae014307ebdc964253adcd9f2c0a392aa11abc") - id2 := HexID("00000000000000806ad9b61fa5ae014307ebdc964253adcd9f2c0a392aa11abc") - - if id1 != ref { - t.Errorf("wrong id1\ngot %v\nwant %v", id1[:], ref[:]) - } - if id2 != ref { - t.Errorf("wrong id2\ngot %v\nwant %v", id2[:], ref[:]) - } -} - -func TestID_textEncoding(t *testing.T) { - ref := ID{ - 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, - } - hex := "0102030405060708091011121314151617181920212223242526272829303132" - - 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(ID) - 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_distcmp(t *testing.T) { - distcmpBig := func(target, a, b ID) int { - tbig := new(big.Int).SetBytes(target[:]) - abig := new(big.Int).SetBytes(a[:]) - bbig := new(big.Int).SetBytes(b[:]) - return new(big.Int).Xor(tbig, abig).Cmp(new(big.Int).Xor(tbig, bbig)) - } - if err := quick.CheckEqual(DistCmp, distcmpBig, nil); err != nil { - t.Error(err) - } -} - -// The random tests is likely to miss the case where a and b are equal, -// this test checks it explicitly. -func TestNodeID_distcmpEqual(t *testing.T) { - base := ID{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} - x := ID{15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0} - if DistCmp(base, x, x) != 0 { - t.Errorf("DistCmp(base, x, x) != 0") - } -} - -func TestNodeID_logdist(t *testing.T) { - logdistBig := func(a, b ID) int { - abig, bbig := new(big.Int).SetBytes(a[:]), new(big.Int).SetBytes(b[:]) - return new(big.Int).Xor(abig, bbig).BitLen() - } - if err := quick.CheckEqual(LogDist, logdistBig, nil); err != nil { - t.Error(err) - } -} - -// The random tests is likely to miss the case where a and b are equal, -// this test checks it explicitly. -func TestNodeID_logdistEqual(t *testing.T) { - x := ID{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} - if LogDist(x, x) != 0 { - t.Errorf("LogDist(x, x) != 0") - } -} diff --git a/p2p/enr/enr.go b/p2p/enr/enr.go index 473107d0f7c6..c36ae9e3edea 100644 --- a/p2p/enr/enr.go +++ b/p2p/enr/enr.go @@ -40,7 +40,7 @@ import ( "io" "sort" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/rlp" ) const SizeLimit = 300 // maximum encoded size of a node record in bytes @@ -163,6 +163,16 @@ func (r *Record) invalidate() { r.raw = nil } +// Signature returns the signature of the record. +func (r *Record) Signature() []byte { + if r.signature == nil { + return nil + } + cpy := make([]byte, len(r.signature)) + copy(cpy, r.signature) + return cpy +} + // EncodeRLP implements rlp.Encoder. Encoding fails if // the record is unsigned. func (r Record) EncodeRLP(w io.Writer) error { @@ -173,7 +183,7 @@ func (r Record) EncodeRLP(w io.Writer) error { return err } -// DecodeRLP implements rlp.Decoder. Decoding verifies the signature. +// DecodeRLP implements rlp.Decoder. Decoding doesn't verify the signature. func (r *Record) DecodeRLP(s *rlp.Stream) error { dec, raw, err := decodeRecord(s) if err != nil { diff --git a/p2p/enr/enr_test.go b/p2p/enr/enr_test.go index 4d1f3f0748ce..96a9ced5cf3d 100644 --- a/p2p/enr/enr_test.go +++ b/p2p/enr/enr_test.go @@ -24,7 +24,7 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/rlp" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -49,28 +49,28 @@ func TestGetSetID(t *testing.T) { } // TestGetSetIP4 tests encoding/decoding and setting/getting of the IP key. -func TestGetSetIP4(t *testing.T) { - ip := IP{192, 168, 0, 3} +func TestGetSetIPv4(t *testing.T) { + ip := IPv4{192, 168, 0, 3} var r Record r.Set(ip) - var ip2 IP + var ip2 IPv4 require.NoError(t, r.Load(&ip2)) assert.Equal(t, ip, ip2) } -// TestGetSetIP6 tests encoding/decoding and setting/getting of the IP key. -func TestGetSetIP6(t *testing.T) { - ip := IP{0x20, 0x01, 0x48, 0x60, 0, 0, 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0x00, 0x68} +// TestGetSetIP6 tests encoding/decoding and setting/getting of the IP6 key. +func TestGetSetIPv6(t *testing.T) { + ip := IPv6{0x20, 0x01, 0x48, 0x60, 0, 0, 0x20, 0x01, 0, 0, 0, 0, 0, 0, 0x00, 0x68} var r Record r.Set(ip) - var ip2 IP + var ip2 IPv6 require.NoError(t, r.Load(&ip2)) assert.Equal(t, ip, ip2) } -// TestGetSetDiscPort tests encoding/decoding and setting/getting of the DiscPort key. +// TestGetSetUDP tests encoding/decoding and setting/getting of the UDP key. func TestGetSetUDP(t *testing.T) { port := UDP(30309) var r Record @@ -83,7 +83,7 @@ func TestGetSetUDP(t *testing.T) { func TestLoadErrors(t *testing.T) { var r Record - ip4 := IP{127, 0, 0, 1} + ip4 := IPv4{127, 0, 0, 1} r.Set(ip4) // Check error for missing keys. @@ -185,13 +185,13 @@ func TestSeq(t *testing.T) { func TestGetSetOverwrite(t *testing.T) { var r Record - ip := IP{192, 168, 0, 3} + ip := IPv4{192, 168, 0, 3} r.Set(ip) - ip2 := IP{192, 168, 0, 4} + ip2 := IPv4{192, 168, 0, 4} r.Set(ip2) - var ip3 IP + var ip3 IPv4 require.NoError(t, r.Load(&ip3)) assert.Equal(t, ip2, ip3) } @@ -200,7 +200,7 @@ func TestGetSetOverwrite(t *testing.T) { func TestSignEncodeAndDecode(t *testing.T) { var r Record r.Set(UDP(30303)) - r.Set(IP{127, 0, 0, 1}) + r.Set(IPv4{127, 0, 0, 1}) require.NoError(t, signTest([]byte{5}, &r)) blob, err := rlp.EncodeToBytes(r) diff --git a/p2p/enr/entries.go b/p2p/enr/entries.go index 965a85fe1892..f2118401afb8 100644 --- a/p2p/enr/entries.go +++ b/p2p/enr/entries.go @@ -21,7 +21,7 @@ import ( "io" "net" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/rlp" ) // Entry is implemented by known node record entry types. @@ -60,11 +60,21 @@ type TCP uint16 func (v TCP) ENRKey() string { return "tcp" } +// UDP is the "udp" key, which holds the IPv6-specific UDP port of the node. +type TCP6 uint16 + +func (v TCP6) ENRKey() string { return "tcp6" } + // UDP is the "udp" key, which holds the UDP port of the node. type UDP uint16 func (v UDP) ENRKey() string { return "udp" } +// UDP is the "udp" key, which holds the IPv6-specific UDP port of the node. +type UDP6 uint16 + +func (v UDP6) ENRKey() string { return "udp6" } + // ID is the "id" key, which holds the name of the identity scheme. type ID string @@ -72,17 +82,27 @@ const IDv4 = ID("v4") // the default identity scheme func (v ID) ENRKey() string { return "id" } -// IP is the "ip" key, which holds the IP address of the node. +// IP is either the "ip" or "ip6" key, depending on the value. +// Use this value to encode IP addresses that can be either v4 or v6. +// To load an address from a record use the IPv4 or IPv6 types. type IP net.IP -func (v IP) ENRKey() string { return "ip" } +func (v IP) ENRKey() string { + if net.IP(v).To4() == nil { + return "ip6" + } + return "ip" +} // EncodeRLP implements rlp.Encoder. func (v IP) EncodeRLP(w io.Writer) error { if ip4 := net.IP(v).To4(); ip4 != nil { return rlp.Encode(w, ip4) } - return rlp.Encode(w, net.IP(v)) + if ip6 := net.IP(v).To16(); ip6 != nil { + return rlp.Encode(w, ip6) + } + return fmt.Errorf("invalid IP address: %v", net.IP(v)) } // DecodeRLP implements rlp.Decoder. @@ -96,6 +116,56 @@ func (v *IP) DecodeRLP(s *rlp.Stream) error { return nil } +// IPv4 is the "ip" key, which holds the IP address of the node. +type IPv4 net.IP + +func (v IPv4) ENRKey() string { return "ip" } + +// EncodeRLP implements rlp.Encoder. +func (v IPv4) EncodeRLP(w io.Writer) error { + ip4 := net.IP(v).To4() + if ip4 == nil { + return fmt.Errorf("invalid IPv4 address: %v", net.IP(v)) + } + return rlp.Encode(w, ip4) +} + +// DecodeRLP implements rlp.Decoder. +func (v *IPv4) DecodeRLP(s *rlp.Stream) error { + if err := s.Decode((*net.IP)(v)); err != nil { + return err + } + if len(*v) != 4 { + return fmt.Errorf("invalid IPv4 address, want 4 bytes: %v", *v) + } + return nil +} + +// IPv6 is the "ip6" key, which holds the IP address of the node. +type IPv6 net.IP + +func (v IPv6) ENRKey() string { return "ip6" } + +// EncodeRLP implements rlp.Encoder. +func (v IPv6) EncodeRLP(w io.Writer) error { + ip6 := net.IP(v).To16() + if ip6 == nil { + return fmt.Errorf("invalid IPv6 address: %v", net.IP(v)) + } + return rlp.Encode(w, ip6) +} + +// DecodeRLP implements rlp.Decoder. +func (v *IPv6) DecodeRLP(s *rlp.Stream) error { + if err := s.Decode((*net.IP)(v)); err != nil { + return err + } + if len(*v) != 16 { + return fmt.Errorf("invalid IPv6 address, want 16 bytes: %v", *v) + } + return nil +} + // KeyError is an error related to a key. type KeyError struct { Key string diff --git a/p2p/message.go b/p2p/message.go index ed4cd53abe16..10b55a939c9b 100644 --- a/p2p/message.go +++ b/p2p/message.go @@ -25,9 +25,9 @@ import ( "sync/atomic" "time" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/rlp" ) // Msg defines the structure of a p2p message. @@ -39,9 +39,13 @@ import ( // separate Msg with a bytes.Reader as Payload for each send. type Msg struct { Code uint64 - Size uint32 // size of the paylod + Size uint32 // Size of the raw payload Payload io.Reader ReceivedAt time.Time + + meterCap Cap // Protocol name and version for egress metering + meterCode uint64 // Message within protocol for egress metering + meterSize uint32 // Compressed message size for ingress metering } // Decode parses the RLP content of a message into @@ -169,7 +173,7 @@ type MsgPipeRW struct { closed *int32 } -// WriteMsg sends a messsage on the pipe. +// WriteMsg sends a message on the pipe. // It blocks until the receiver has consumed the message payload. func (p *MsgPipeRW) WriteMsg(msg Msg) error { if atomic.LoadInt32(p.closed) == 0 { @@ -252,19 +256,23 @@ func ExpectMsg(r MsgReader, code uint64, content interface{}) error { type msgEventer struct { MsgReadWriter - feed *event.Feed - peerID enode.ID - Protocol string + feed *event.Feed + peerID enode.ID + Protocol string + localAddress string + remoteAddress string } // newMsgEventer returns a msgEventer which sends message events to the given // feed -func newMsgEventer(rw MsgReadWriter, feed *event.Feed, peerID enode.ID, proto string) *msgEventer { +func newMsgEventer(rw MsgReadWriter, feed *event.Feed, peerID enode.ID, proto, remote, local string) *msgEventer { return &msgEventer{ MsgReadWriter: rw, feed: feed, peerID: peerID, Protocol: proto, + remoteAddress: remote, + localAddress: local, } } @@ -276,11 +284,13 @@ func (ev *msgEventer) ReadMsg() (Msg, error) { return msg, err } ev.feed.Send(&PeerEvent{ - Type: PeerEventTypeMsgRecv, - Peer: ev.peerID, - Protocol: ev.Protocol, - MsgCode: &msg.Code, - MsgSize: &msg.Size, + Type: PeerEventTypeMsgRecv, + Peer: ev.peerID, + Protocol: ev.Protocol, + MsgCode: &msg.Code, + MsgSize: &msg.Size, + LocalAddress: ev.localAddress, + RemoteAddress: ev.remoteAddress, }) return msg, nil } @@ -293,11 +303,13 @@ func (ev *msgEventer) WriteMsg(msg Msg) error { return err } ev.feed.Send(&PeerEvent{ - Type: PeerEventTypeMsgSend, - Peer: ev.peerID, - Protocol: ev.Protocol, - MsgCode: &msg.Code, - MsgSize: &msg.Size, + Type: PeerEventTypeMsgSend, + Peer: ev.peerID, + Protocol: ev.Protocol, + MsgCode: &msg.Code, + MsgSize: &msg.Size, + LocalAddress: ev.localAddress, + RemoteAddress: ev.remoteAddress, }) return nil } diff --git a/p2p/metrics.go b/p2p/metrics.go index d2b4b18b2c91..30bd56bd4de5 100644 --- a/p2p/metrics.go +++ b/p2p/metrics.go @@ -19,24 +19,21 @@ package p2p import ( - "fmt" "net" "sync" "sync/atomic" "time" - "github.com/nebulaai/nbai-node/p2p/enode" - - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" ) const ( - MetricsInboundConnects = "p2p/InboundConnects" // Name for the registered inbound connects meter - MetricsInboundTraffic = "p2p/InboundTraffic" // Name for the registered inbound traffic meter - MetricsOutboundConnects = "p2p/OutboundConnects" // Name for the registered outbound connects meter - MetricsOutboundTraffic = "p2p/OutboundTraffic" // Name for the registered outbound traffic meter + MetricsInboundTraffic = "p2p/ingress" // Name for the registered inbound traffic meter + MetricsOutboundTraffic = "p2p/egress" // Name for the registered outbound traffic meter + MetricsOutboundConnects = "p2p/dials" // Name for the registered outbound connects meter + MetricsInboundConnects = "p2p/serves" // Name for the registered inbound connects meter MeteredPeerLimit = 1024 // This amount of peers are individually metered ) @@ -46,6 +43,7 @@ var ( ingressTrafficMeter = metrics.NewRegisteredMeter(MetricsInboundTraffic, nil) // Meter metering the cumulative ingress traffic egressConnectMeter = metrics.NewRegisteredMeter(MetricsOutboundConnects, nil) // Meter counting the egress connections egressTrafficMeter = metrics.NewRegisteredMeter(MetricsOutboundTraffic, nil) // Meter metering the cumulative egress traffic + activePeerGauge = metrics.NewRegisteredGauge("p2p/peers", nil) // Gauge tracking the current peer count PeerIngressRegistry = metrics.NewPrefixedChildRegistry(metrics.EphemeralRegistry, MetricsInboundTraffic+"/") // Registry containing the peer ingress PeerEgressRegistry = metrics.NewPrefixedChildRegistry(metrics.EphemeralRegistry, MetricsOutboundTraffic+"/") // Registry containing the peer egress @@ -58,24 +56,24 @@ var ( type MeteredPeerEventType int const ( - // PeerConnected is the type of event emitted when a peer successfully - // made the handshake. - PeerConnected MeteredPeerEventType = iota - - // PeerDisconnected is the type of event emitted when a peer disconnects. - PeerDisconnected + // PeerHandshakeSucceeded is the type of event + // emitted when a peer successfully makes the handshake. + PeerHandshakeSucceeded MeteredPeerEventType = iota // PeerHandshakeFailed is the type of event emitted when a peer fails to - // make the handshake or disconnects before the handshake. + // make the handshake or disconnects before it. PeerHandshakeFailed + + // PeerDisconnected is the type of event emitted when a peer disconnects. + PeerDisconnected ) // MeteredPeerEvent is an event emitted when peers connect or disconnect. type MeteredPeerEvent struct { Type MeteredPeerEventType // Type of peer event - IP net.IP // IP address of the peer - ID enode.ID // NodeID of the peer + Addr string // TCP address of the peer Elapsed time.Duration // Time elapsed between the connection and the handshake/disconnection + Peer *Peer // Connected remote node instance Ingress uint64 // Ingress count at the moment of the event Egress uint64 // Egress count at the moment of the event } @@ -91,9 +89,9 @@ func SubscribeMeteredPeerEvent(ch chan<- MeteredPeerEvent) event.Subscription { type meteredConn struct { net.Conn // Network connection to wrap with metering - connected time.Time // Connection time of the peer - ip net.IP // IP address of the peer - id enode.ID // NodeID of the peer + connected time.Time // Connection time of the peer + addr *net.TCPAddr // TCP address of the peer + peer *Peer // Peer instance // trafficMetered denotes if the peer is registered in the traffic registries. // Its value is true if the metered peer count doesn't reach the limit in the @@ -109,13 +107,13 @@ type meteredConn struct { // connection meter and also increases the metered peer count. If the metrics // system is disabled or the IP address is unspecified, this function returns // the original object. -func newMeteredConn(conn net.Conn, ingress bool, ip net.IP) net.Conn { +func newMeteredConn(conn net.Conn, ingress bool, addr *net.TCPAddr) net.Conn { // Short circuit if metrics are disabled if !metrics.Enabled { return conn } - if ip.IsUnspecified() { - log.Warn("Peer IP is unspecified") + if addr == nil || addr.IP.IsUnspecified() { + log.Warn("Peer address is unspecified") return conn } // Bump the connection counters and wrap the connection @@ -124,9 +122,11 @@ func newMeteredConn(conn net.Conn, ingress bool, ip net.IP) net.Conn { } else { egressConnectMeter.Mark(1) } + activePeerGauge.Inc(1) + return &meteredConn{ Conn: conn, - ip: ip, + addr: addr, connected: time.Now(), } } @@ -157,29 +157,27 @@ func (c *meteredConn) Write(b []byte) (n int, err error) { return n, err } -// handshakeDone is called when a peer handshake is done. Registers the peer to -// the ingress and the egress traffic registries using the peer's IP and node ID, -// also emits connect event. -func (c *meteredConn) handshakeDone(id enode.ID) { +// handshakeDone is called after the connection passes the handshake. +func (c *meteredConn) handshakeDone(peer *Peer) { if atomic.AddInt32(&meteredPeerCount, 1) >= MeteredPeerLimit { // Don't register the peer in the traffic registries. atomic.AddInt32(&meteredPeerCount, -1) c.lock.Lock() - c.id, c.trafficMetered = id, false + c.peer, c.trafficMetered = peer, false c.lock.Unlock() log.Warn("Metered peer count reached the limit") } else { - key := fmt.Sprintf("%s/%s", c.ip, id.String()) + enode := peer.Node().String() c.lock.Lock() - c.id, c.trafficMetered = id, true - c.ingressMeter = metrics.NewRegisteredMeter(key, PeerIngressRegistry) - c.egressMeter = metrics.NewRegisteredMeter(key, PeerEgressRegistry) + c.peer, c.trafficMetered = peer, true + c.ingressMeter = metrics.NewRegisteredMeter(enode, PeerIngressRegistry) + c.egressMeter = metrics.NewRegisteredMeter(enode, PeerEgressRegistry) c.lock.Unlock() } meteredPeerFeed.Send(MeteredPeerEvent{ - Type: PeerConnected, - IP: c.ip, - ID: id, + Type: PeerHandshakeSucceeded, + Addr: c.addr.String(), + Peer: peer, Elapsed: time.Since(c.connected), }) } @@ -189,44 +187,46 @@ func (c *meteredConn) handshakeDone(id enode.ID) { func (c *meteredConn) Close() error { err := c.Conn.Close() c.lock.RLock() - if c.id == (enode.ID{}) { - // If the peer disconnects before the handshake. + if c.peer == nil { + // If the peer disconnects before/during the handshake. c.lock.RUnlock() meteredPeerFeed.Send(MeteredPeerEvent{ Type: PeerHandshakeFailed, - IP: c.ip, + Addr: c.addr.String(), Elapsed: time.Since(c.connected), }) + activePeerGauge.Dec(1) return err } - id := c.id + peer := c.peer if !c.trafficMetered { // If the peer isn't registered in the traffic registries. c.lock.RUnlock() meteredPeerFeed.Send(MeteredPeerEvent{ Type: PeerDisconnected, - IP: c.ip, - ID: id, + Addr: c.addr.String(), + Peer: peer, }) + activePeerGauge.Dec(1) return err } - ingress, egress := uint64(c.ingressMeter.Count()), uint64(c.egressMeter.Count()) + ingress, egress, enode := uint64(c.ingressMeter.Count()), uint64(c.egressMeter.Count()), c.peer.Node().String() c.lock.RUnlock() // Decrement the metered peer count atomic.AddInt32(&meteredPeerCount, -1) // Unregister the peer from the traffic registries - key := fmt.Sprintf("%s/%s", c.ip, id) - PeerIngressRegistry.Unregister(key) - PeerEgressRegistry.Unregister(key) + PeerIngressRegistry.Unregister(enode) + PeerEgressRegistry.Unregister(enode) meteredPeerFeed.Send(MeteredPeerEvent{ Type: PeerDisconnected, - IP: c.ip, - ID: id, + Addr: c.addr.String(), + Peer: peer, Ingress: ingress, Egress: egress, }) + activePeerGauge.Dec(1) return err } diff --git a/p2p/nat/nat.go b/p2p/nat/nat.go index f9c05acfa426..504b7b074a16 100644 --- a/p2p/nat/nat.go +++ b/p2p/nat/nat.go @@ -25,8 +25,8 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/log" - "github.com/jackpal/go-nat-pmp" + "github.com/ethereum/go-ethereum/log" + natpmp "github.com/jackpal/go-nat-pmp" ) // An implementation of nat.Interface can map local ports to ports diff --git a/p2p/nat/natpmp.go b/p2p/nat/natpmp.go index 8ba971472811..7f85543f8e29 100644 --- a/p2p/nat/natpmp.go +++ b/p2p/nat/natpmp.go @@ -22,7 +22,7 @@ import ( "strings" "time" - "github.com/jackpal/go-nat-pmp" + natpmp "github.com/jackpal/go-nat-pmp" ) // natPMPClient adapts the NAT-PMP protocol implementation so it conforms to diff --git a/p2p/netutil/addrutil.go b/p2p/netutil/addrutil.go new file mode 100644 index 000000000000..fb6d8d27318d --- /dev/null +++ b/p2p/netutil/addrutil.go @@ -0,0 +1,33 @@ +// Copyright 2019 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 netutil + +import "net" + +// AddrIP gets the IP address contained in addr. It returns nil if no address is present. +func AddrIP(addr net.Addr) net.IP { + switch a := addr.(type) { + case *net.IPAddr: + return a.IP + case *net.TCPAddr: + return a.IP + case *net.UDPAddr: + return a.IP + default: + return nil + } +} diff --git a/p2p/netutil/iptrack.go b/p2p/netutil/iptrack.go index dbc54f41d819..b9cbd5e1caa9 100644 --- a/p2p/netutil/iptrack.go +++ b/p2p/netutil/iptrack.go @@ -19,7 +19,7 @@ package netutil import ( "time" - "github.com/nebulaai/nbai-node/common/mclock" + "github.com/ethereum/go-ethereum/common/mclock" ) // IPTracker predicts the external endpoint, i.e. IP address and port, of the local host diff --git a/p2p/netutil/iptrack_test.go b/p2p/netutil/iptrack_test.go index 3c1744881795..a9a2998a6528 100644 --- a/p2p/netutil/iptrack_test.go +++ b/p2p/netutil/iptrack_test.go @@ -22,7 +22,7 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common/mclock" + "github.com/ethereum/go-ethereum/common/mclock" ) const ( diff --git a/p2p/netutil/net.go b/p2p/netutil/net.go index 656abb6825b2..d5da3c694f8e 100644 --- a/p2p/netutil/net.go +++ b/p2p/netutil/net.go @@ -212,7 +212,7 @@ func sameNet(bits uint, ip, other net.IP) bool { if mask != 0 && nb < len(ip) && ip[nb]&mask != other[nb]&mask { return false } - return nb <= len(ip) && bytes.Equal(ip[:nb], other[:nb]) + return nb <= len(ip) && ip[:nb].Equal(other[:nb]) } // DistinctNetSet tracks IPs, ensuring that at most N of them diff --git a/p2p/peer.go b/p2p/peer.go index 035cdc0f030c..9a9788bc1759 100644 --- a/p2p/peer.go +++ b/p2p/peer.go @@ -25,12 +25,13 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/common/mclock" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/enr" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/rlp" ) var ( @@ -91,12 +92,14 @@ const ( // 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 enode.ID `json:"peer"` - Error string `json:"error,omitempty"` - Protocol string `json:"protocol,omitempty"` - MsgCode *uint64 `json:"msg_code,omitempty"` - MsgSize *uint32 `json:"msg_size,omitempty"` + Type PeerEventType `json:"type"` + Peer enode.ID `json:"peer"` + Error string `json:"error,omitempty"` + Protocol string `json:"protocol,omitempty"` + MsgCode *uint64 `json:"msg_code,omitempty"` + MsgSize *uint32 `json:"msg_size,omitempty"` + LocalAddress string `json:"local,omitempty"` + RemoteAddress string `json:"remote,omitempty"` } // Peer represents a connected remote node. @@ -120,7 +123,7 @@ func NewPeer(id enode.ID, name string, caps []Cap) *Peer { pipe, _ := net.Pipe() node := enode.SignNull(new(enr.Record), id) conn := &conn{fd: pipe, transport: nil, node: node, caps: caps, name: name} - peer := newPeer(conn, nil) + peer := newPeer(log.Root(), conn, nil) close(peer.closed) // ensures Disconnect doesn't block return peer } @@ -176,7 +179,7 @@ func (p *Peer) Inbound() bool { return p.rw.is(inboundConn) } -func newPeer(conn *conn, protocols []Protocol) *Peer { +func newPeer(log log.Logger, conn *conn, protocols []Protocol) *Peer { protomap := matchProtocols(protocols, conn.caps, conn) p := &Peer{ rw: conn, @@ -298,6 +301,9 @@ func (p *Peer) handle(msg Msg) error { if err != nil { return fmt.Errorf("msg code out of range: %v", msg.Code) } + if metrics.Enabled { + metrics.GetOrRegisterMeter(fmt.Sprintf("%s/%s/%d/%#02x", MetricsInboundTraffic, proto.Name, proto.Version, msg.Code-proto.offset), nil).Mark(int64(msg.meterSize)) + } select { case proto.in <- msg: return nil @@ -354,7 +360,7 @@ func (p *Peer) startProtocols(writeStart <-chan struct{}, writeErr chan<- error) proto.werr = writeErr var rw MsgReadWriter = proto if p.events != nil { - rw = newMsgEventer(rw, p.events, p.ID(), proto.Name) + rw = newMsgEventer(rw, p.events, p.ID(), proto.Name, p.Info().Network.RemoteAddress, p.Info().Network.LocalAddress) } p.log.Trace(fmt.Sprintf("Starting protocol %s/%d", proto.Name, proto.Version)) go func() { @@ -396,7 +402,11 @@ func (rw *protoRW) WriteMsg(msg Msg) (err error) { if msg.Code >= rw.Length { return newPeerError(errInvalidMsgCode, "not handled") } + msg.meterCap = rw.cap() + msg.meterCode = msg.Code + msg.Code += rw.offset + select { case <-rw.wstart: err = rw.w.WriteMsg(msg) @@ -425,10 +435,11 @@ func (rw *protoRW) ReadMsg() (Msg, error) { // peer. Sub-protocol independent fields are contained and initialized here, with // protocol specifics delegated to all connected sub-protocols. type PeerInfo struct { - Enode string `json:"enode"` // Node URL - ID string `json:"id"` // Unique node identifier - Name string `json:"name"` // Name of the node, including client type, version, OS, custom data - Caps []string `json:"caps"` // Protocols advertised by this peer + ENR string `json:"enr,omitempty"` // Ethereum Node Record + Enode string `json:"enode"` // Node URL + ID string `json:"id"` // Unique node identifier + Name string `json:"name"` // Name of the node, including client type, version, OS, custom data + Caps []string `json:"caps"` // Protocols advertised by this peer Network struct { LocalAddress string `json:"localAddress"` // Local endpoint of the TCP data connection RemoteAddress string `json:"remoteAddress"` // Remote endpoint of the TCP data connection @@ -448,12 +459,15 @@ func (p *Peer) Info() *PeerInfo { } // Assemble the generic peer metadata info := &PeerInfo{ - Enode: p.Node().String(), + Enode: p.Node().URLv4(), ID: p.ID().String(), Name: p.Name(), Caps: caps, Protocols: make(map[string]interface{}), } + if p.Node().Seq() > 0 { + info.ENR = p.Node().String() + } info.Network.LocalAddress = p.LocalAddr().String() info.Network.RemoteAddress = p.RemoteAddr().String() info.Network.Inbound = p.rw.is(inboundConn) diff --git a/p2p/peer_test.go b/p2p/peer_test.go index 5aa64a32e190..a2393ba85487 100644 --- a/p2p/peer_test.go +++ b/p2p/peer_test.go @@ -24,6 +24,8 @@ import ( "reflect" "testing" "time" + + "github.com/ethereum/go-ethereum/log" ) var discard = Protocol{ @@ -52,7 +54,7 @@ func testPeer(protos []Protocol) (func(), *conn, *Peer, <-chan error) { c2.caps = append(c2.caps, p.cap()) } - peer := newPeer(c1, protos) + peer := newPeer(log.Root(), c1, protos) errc := make(chan error, 1) go func() { _, err := peer.run() @@ -150,7 +152,7 @@ func TestPeerDisconnect(t *testing.T) { // This test is supposed to verify that Peer can reliably handle // multiple causes of disconnection occurring at the same time. func TestPeerDisconnectRace(t *testing.T) { - maybe := func() bool { return rand.Intn(1) == 1 } + maybe := func() bool { return rand.Intn(2) == 1 } for i := 0; i < 1000; i++ { protoclose := make(chan error) diff --git a/p2p/protocol.go b/p2p/protocol.go index 974526844496..fa23a087c281 100644 --- a/p2p/protocol.go +++ b/p2p/protocol.go @@ -19,8 +19,8 @@ package p2p import ( "fmt" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/enr" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" ) // Protocol represents a P2P subprotocol implementation. @@ -54,6 +54,11 @@ type Protocol struct { // but returns nil, it is assumed that the protocol handshake is still running. PeerInfo func(id enode.ID) interface{} + // DialCandidates, if non-nil, is a way to tell Server about protocol-specific nodes + // that should be dialed. The server continuously reads nodes from the iterator and + // attempts to create connections to them. + DialCandidates enode.Iterator + // Attributes contains protocol specific information for the node record. Attributes []enr.Entry } @@ -79,5 +84,3 @@ func (cs capsByNameAndVersion) Swap(i, j int) { cs[i], cs[j] = cs[j], cs[i] } func (cs capsByNameAndVersion) Less(i, j int) bool { return cs[i].Name < cs[j].Name || (cs[i].Name == cs[j].Name && cs[i].Version < cs[j].Version) } - -func (capsByNameAndVersion) ENRKey() string { return "cap" } diff --git a/p2p/protocols/accounting.go b/p2p/protocols/accounting.go deleted file mode 100644 index c381d72e6c70..000000000000 --- a/p2p/protocols/accounting.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2018 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 protocols - -import ( - "time" - - "github.com/nebulaai/nbai-node/metrics" -) - -// define some metrics -var ( - // All metrics are cumulative - - // total amount of units credited - mBalanceCredit metrics.Counter - // total amount of units debited - mBalanceDebit metrics.Counter - // total amount of bytes credited - mBytesCredit metrics.Counter - // total amount of bytes debited - mBytesDebit metrics.Counter - // total amount of credited messages - mMsgCredit metrics.Counter - // total amount of debited messages - mMsgDebit metrics.Counter - // how many times local node had to drop remote peers - mPeerDrops metrics.Counter - // how many times local node overdrafted and dropped - mSelfDrops metrics.Counter - - MetricsRegistry metrics.Registry -) - -// Prices defines how prices are being passed on to the accounting instance -type Prices interface { - // Return the Price for a message - Price(interface{}) *Price -} - -type Payer bool - -const ( - Sender = Payer(true) - Receiver = Payer(false) -) - -// Price represents the costs of a message -type Price struct { - Value uint64 - PerByte bool // True if the price is per byte or for unit - Payer Payer -} - -// For gives back the price for a message -// A protocol provides the message price in absolute value -// This method then returns the correct signed amount, -// depending on who pays, which is identified by the `payer` argument: -// `Send` will pass a `Sender` payer, `Receive` will pass the `Receiver` argument. -// Thus: If Sending and sender pays, amount positive, otherwise negative -// If Receiving, and receiver pays, amount positive, otherwise negative -func (p *Price) For(payer Payer, size uint32) int64 { - price := p.Value - if p.PerByte { - price *= uint64(size) - } - if p.Payer == payer { - return 0 - int64(price) - } - return int64(price) -} - -// Balance is the actual accounting instance -// Balance defines the operations needed for accounting -// Implementations internally maintain the balance for every peer -type Balance interface { - // Adds amount to the local balance with remote node `peer`; - // positive amount = credit local node - // negative amount = debit local node - Add(amount int64, peer *Peer) error -} - -// Accounting implements the Hook interface -// It interfaces to the balances through the Balance interface, -// while interfacing with protocols and its prices through the Prices interface -type Accounting struct { - Balance // interface to accounting logic - Prices // interface to prices logic -} - -func NewAccounting(balance Balance, po Prices) *Accounting { - ah := &Accounting{ - Prices: po, - Balance: balance, - } - return ah -} - -// SetupAccountingMetrics creates a separate registry for p2p accounting metrics; -// this registry should be independent of any other metrics as it persists at different endpoints. -// It also instantiates the given metrics and starts the persisting go-routine which -// at the passed interval writes the metrics to a LevelDB -func SetupAccountingMetrics(reportInterval time.Duration, path string) *AccountingMetrics { - // create an empty registry - MetricsRegistry = metrics.NewRegistry() - // instantiate the metrics - mBalanceCredit = metrics.NewRegisteredCounterForced("account.balance.credit", MetricsRegistry) - mBalanceDebit = metrics.NewRegisteredCounterForced("account.balance.debit", MetricsRegistry) - mBytesCredit = metrics.NewRegisteredCounterForced("account.bytes.credit", MetricsRegistry) - mBytesDebit = metrics.NewRegisteredCounterForced("account.bytes.debit", MetricsRegistry) - mMsgCredit = metrics.NewRegisteredCounterForced("account.msg.credit", MetricsRegistry) - mMsgDebit = metrics.NewRegisteredCounterForced("account.msg.debit", MetricsRegistry) - mPeerDrops = metrics.NewRegisteredCounterForced("account.peerdrops", MetricsRegistry) - mSelfDrops = metrics.NewRegisteredCounterForced("account.selfdrops", MetricsRegistry) - // create the DB and start persisting - return NewAccountingMetrics(MetricsRegistry, reportInterval, path) -} - -// Send takes a peer, a size and a msg and -// - calculates the cost for the local node sending a msg of size to peer using the Prices interface -// - credits/debits local node using balance interface -func (ah *Accounting) Send(peer *Peer, size uint32, msg interface{}) error { - // get the price for a message (through the protocol spec) - price := ah.Price(msg) - // this message doesn't need accounting - if price == nil { - return nil - } - // evaluate the price for sending messages - costToLocalNode := price.For(Sender, size) - // do the accounting - err := ah.Add(costToLocalNode, peer) - // record metrics: just increase counters for user-facing metrics - ah.doMetrics(costToLocalNode, size, err) - return err -} - -// Receive takes a peer, a size and a msg and -// - calculates the cost for the local node receiving a msg of size from peer using the Prices interface -// - credits/debits local node using balance interface -func (ah *Accounting) Receive(peer *Peer, size uint32, msg interface{}) error { - // get the price for a message (through the protocol spec) - price := ah.Price(msg) - // this message doesn't need accounting - if price == nil { - return nil - } - // evaluate the price for receiving messages - costToLocalNode := price.For(Receiver, size) - // do the accounting - err := ah.Add(costToLocalNode, peer) - // record metrics: just increase counters for user-facing metrics - ah.doMetrics(costToLocalNode, size, err) - return err -} - -// record some metrics -// this is not an error handling. `err` is returned by both `Send` and `Receive` -// `err` will only be non-nil if a limit has been violated (overdraft), in which case the peer has been dropped. -// if the limit has been violated and `err` is thus not nil: -// * if the price is positive, local node has been credited; thus `err` implicitly signals the REMOTE has been dropped -// * if the price is negative, local node has been debited, thus `err` implicitly signals LOCAL node "overdraft" -func (ah *Accounting) doMetrics(price int64, size uint32, err error) { - if price > 0 { - mBalanceCredit.Inc(price) - mBytesCredit.Inc(int64(size)) - mMsgCredit.Inc(1) - if err != nil { - // increase the number of times a remote node has been dropped due to "overdraft" - mPeerDrops.Inc(1) - } - } else { - mBalanceDebit.Inc(price) - mBytesDebit.Inc(int64(size)) - mMsgDebit.Inc(1) - if err != nil { - // increase the number of times the local node has done an "overdraft" in respect to other nodes - mSelfDrops.Inc(1) - } - } -} diff --git a/p2p/protocols/accounting_api.go b/p2p/protocols/accounting_api.go deleted file mode 100644 index 48e2af9feadd..000000000000 --- a/p2p/protocols/accounting_api.go +++ /dev/null @@ -1,94 +0,0 @@ -package protocols - -import ( - "errors" -) - -// Textual version number of accounting API -const AccountingVersion = "1.0" - -var errNoAccountingMetrics = errors.New("accounting metrics not enabled") - -// AccountingApi provides an API to access account related information -type AccountingApi struct { - metrics *AccountingMetrics -} - -// NewAccountingApi creates a new AccountingApi -// m will be used to check if accounting metrics are enabled -func NewAccountingApi(m *AccountingMetrics) *AccountingApi { - return &AccountingApi{m} -} - -// Balance returns local node balance (units credited - units debited) -func (self *AccountingApi) Balance() (int64, error) { - if self.metrics == nil { - return 0, errNoAccountingMetrics - } - balance := mBalanceCredit.Count() - mBalanceDebit.Count() - return balance, nil -} - -// BalanceCredit returns total amount of units credited by local node -func (self *AccountingApi) BalanceCredit() (int64, error) { - if self.metrics == nil { - return 0, errNoAccountingMetrics - } - return mBalanceCredit.Count(), nil -} - -// BalanceCredit returns total amount of units debited by local node -func (self *AccountingApi) BalanceDebit() (int64, error) { - if self.metrics == nil { - return 0, errNoAccountingMetrics - } - return mBalanceDebit.Count(), nil -} - -// BytesCredit returns total amount of bytes credited by local node -func (self *AccountingApi) BytesCredit() (int64, error) { - if self.metrics == nil { - return 0, errNoAccountingMetrics - } - return mBytesCredit.Count(), nil -} - -// BalanceCredit returns total amount of bytes debited by local node -func (self *AccountingApi) BytesDebit() (int64, error) { - if self.metrics == nil { - return 0, errNoAccountingMetrics - } - return mBytesDebit.Count(), nil -} - -// MsgCredit returns total amount of messages credited by local node -func (self *AccountingApi) MsgCredit() (int64, error) { - if self.metrics == nil { - return 0, errNoAccountingMetrics - } - return mMsgCredit.Count(), nil -} - -// MsgDebit returns total amount of messages debited by local node -func (self *AccountingApi) MsgDebit() (int64, error) { - if self.metrics == nil { - return 0, errNoAccountingMetrics - } - return mMsgDebit.Count(), nil -} - -// PeerDrops returns number of times when local node had to drop remote peers -func (self *AccountingApi) PeerDrops() (int64, error) { - if self.metrics == nil { - return 0, errNoAccountingMetrics - } - return mPeerDrops.Count(), nil -} - -// SelfDrops returns number of times when local node was overdrafted and dropped -func (self *AccountingApi) SelfDrops() (int64, error) { - if self.metrics == nil { - return 0, errNoAccountingMetrics - } - return mSelfDrops.Count(), nil -} diff --git a/p2p/protocols/accounting_simulation_test.go b/p2p/protocols/accounting_simulation_test.go deleted file mode 100644 index 4e940c508c93..000000000000 --- a/p2p/protocols/accounting_simulation_test.go +++ /dev/null @@ -1,320 +0,0 @@ -// Copyright 2018 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 protocols - -import ( - "context" - "flag" - "fmt" - "io/ioutil" - "math/rand" - "os" - "path/filepath" - "reflect" - "sync" - "testing" - "time" - - "github.com/mattn/go-colorable" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rpc" - - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" -) - -const ( - content = "123456789" -) - -var ( - nodes = flag.Int("nodes", 30, "number of nodes to create (default 30)") - msgs = flag.Int("msgs", 100, "number of messages sent by node (default 100)") - loglevel = flag.Int("loglevel", 0, "verbosity of logs") - rawlog = flag.Bool("rawlog", false, "remove terminal formatting from logs") -) - -func init() { - flag.Parse() - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(!*rawlog)))) -} - -//TestAccountingSimulation runs a p2p/simulations simulation -//It creates a *nodes number of nodes, connects each one with each other, -//then sends out a random selection of messages up to *msgs amount of messages -//from the test protocol spec. -//The spec has some accounted messages defined through the Prices interface. -//The test does accounting for all the message exchanged, and then checks -//that every node has the same balance with a peer, but with opposite signs. -//Balance(AwithB) = 0 - Balance(BwithA) or Abs|Balance(AwithB)| == Abs|Balance(BwithA)| -func TestAccountingSimulation(t *testing.T) { - //setup the balances objects for every node - bal := newBalances(*nodes) - //setup the metrics system or tests will fail trying to write metrics - dir, err := ioutil.TempDir("", "account-sim") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - SetupAccountingMetrics(1*time.Second, filepath.Join(dir, "metrics.db")) - //define the node.Service for this test - services := adapters.Services{ - "accounting": func(ctx *adapters.ServiceContext) (node.Service, error) { - return bal.newNode(), nil - }, - } - //setup the simulation - adapter := adapters.NewSimAdapter(services) - net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{DefaultService: "accounting"}) - defer net.Shutdown() - - // we send msgs messages per node, wait for all messages to arrive - bal.wg.Add(*nodes * *msgs) - trigger := make(chan enode.ID) - go func() { - // wait for all of them to arrive - bal.wg.Wait() - // then trigger a check - // the selected node for the trigger is irrelevant, - // we just want to trigger the end of the simulation - trigger <- net.Nodes[0].ID() - }() - - // create nodes and start them - for i := 0; i < *nodes; i++ { - conf := adapters.RandomNodeConfig() - bal.id2n[conf.ID] = i - if _, err := net.NewNodeWithConfig(conf); err != nil { - t.Fatal(err) - } - if err := net.Start(conf.ID); err != nil { - t.Fatal(err) - } - } - // fully connect nodes - for i, n := range net.Nodes { - for _, m := range net.Nodes[i+1:] { - if err := net.Connect(n.ID(), m.ID()); err != nil { - t.Fatal(err) - } - } - } - - // empty action - action := func(ctx context.Context) error { - return nil - } - // check always checks out - check := func(ctx context.Context, id enode.ID) (bool, error) { - return true, nil - } - - // run simulation - timeout := 30 * time.Second - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - result := simulations.NewSimulation(net).Run(ctx, &simulations.Step{ - Action: action, - Trigger: trigger, - Expect: &simulations.Expectation{ - Nodes: []enode.ID{net.Nodes[0].ID()}, - Check: check, - }, - }) - - if result.Error != nil { - t.Fatal(result.Error) - } - - // check if balance matrix is symmetric - if err := bal.symmetric(); err != nil { - t.Fatal(err) - } -} - -// matrix is a matrix of nodes and its balances -// matrix is in fact a linear array of size n*n, -// so the balance for any node A with B is at index -// A*n + B, while the balance of node B with A is at -// B*n + A -// (n entries in the array will not be filled - -// the balance of a node with itself) -type matrix struct { - n int //number of nodes - m []int64 //array of balances -} - -// create a new matrix -func newMatrix(n int) *matrix { - return &matrix{ - n: n, - m: make([]int64, n*n), - } -} - -// called from the testBalance's Add accounting function: register balance change -func (m *matrix) add(i, j int, v int64) error { - // index for the balance of local node i with remote nodde j is - // i * number of nodes + remote node - mi := i*m.n + j - // register that balance - m.m[mi] += v - return nil -} - -// check that the balances are symmetric: -// balance of node i with node j is the same as j with i but with inverted signs -func (m *matrix) symmetric() error { - //iterate all nodes - for i := 0; i < m.n; i++ { - //iterate starting +1 - for j := i + 1; j < m.n; j++ { - log.Debug("bal", "1", i, "2", j, "i,j", m.m[i*m.n+j], "j,i", m.m[j*m.n+i]) - if m.m[i*m.n+j] != -m.m[j*m.n+i] { - return fmt.Errorf("value mismatch. m[%v, %v] = %v; m[%v, %v] = %v", i, j, m.m[i*m.n+j], j, i, m.m[j*m.n+i]) - } - } - } - return nil -} - -// all the balances -type balances struct { - i int - *matrix - id2n map[enode.ID]int - wg *sync.WaitGroup -} - -func newBalances(n int) *balances { - return &balances{ - matrix: newMatrix(n), - id2n: make(map[enode.ID]int), - wg: &sync.WaitGroup{}, - } -} - -// create a new testNode for every node created as part of the service -func (b *balances) newNode() *testNode { - defer func() { b.i++ }() - return &testNode{ - bal: b, - i: b.i, - peers: make([]*testPeer, b.n), //a node will be connected to n-1 peers - } -} - -type testNode struct { - bal *balances - i int - lock sync.Mutex - peers []*testPeer - peerCount int -} - -// do the accounting for the peer's test protocol -// testNode implements protocols.Balance -func (t *testNode) Add(a int64, p *Peer) error { - //get the index for the remote peer - remote := t.bal.id2n[p.ID()] - log.Debug("add", "local", t.i, "remote", remote, "amount", a) - return t.bal.add(t.i, remote, a) -} - -//run the p2p protocol -//for every node, represented by testNode, create a remote testPeer -func (t *testNode) run(p *p2p.Peer, rw p2p.MsgReadWriter) error { - spec := createTestSpec() - //create accounting hook - spec.Hook = NewAccounting(t, &dummyPrices{}) - - //create a peer for this node - tp := &testPeer{NewPeer(p, rw, spec), t.i, t.bal.id2n[p.ID()], t.bal.wg} - t.lock.Lock() - t.peers[t.bal.id2n[p.ID()]] = tp - t.peerCount++ - if t.peerCount == t.bal.n-1 { - //when all peer connections are established, start sending messages from this peer - go t.send() - } - t.lock.Unlock() - return tp.Run(tp.handle) -} - -// p2p message receive handler function -func (tp *testPeer) handle(ctx context.Context, msg interface{}) error { - tp.wg.Done() - log.Debug("receive", "from", tp.remote, "to", tp.local, "type", reflect.TypeOf(msg), "msg", msg) - return nil -} - -type testPeer struct { - *Peer - local, remote int - wg *sync.WaitGroup -} - -func (t *testNode) send() { - log.Debug("start sending") - for i := 0; i < *msgs; i++ { - //determine randomly to which peer to send - whom := rand.Intn(t.bal.n - 1) - if whom >= t.i { - whom++ - } - t.lock.Lock() - p := t.peers[whom] - t.lock.Unlock() - - //determine a random message from the spec's messages to be sent - which := rand.Intn(len(p.spec.Messages)) - msg := p.spec.Messages[which] - switch msg.(type) { - case *perBytesMsgReceiverPays: - msg = &perBytesMsgReceiverPays{Content: content[:rand.Intn(len(content))]} - case *perBytesMsgSenderPays: - msg = &perBytesMsgSenderPays{Content: content[:rand.Intn(len(content))]} - } - log.Debug("send", "from", t.i, "to", whom, "type", reflect.TypeOf(msg), "msg", msg) - p.Send(context.TODO(), msg) - } -} - -// define the protocol -func (t *testNode) Protocols() []p2p.Protocol { - return []p2p.Protocol{{ - Length: 100, - Run: t.run, - }} -} - -func (t *testNode) APIs() []rpc.API { - return nil -} - -func (t *testNode) Start(server *p2p.Server) error { - return nil -} - -func (t *testNode) Stop() error { - return nil -} diff --git a/p2p/protocols/accounting_test.go b/p2p/protocols/accounting_test.go deleted file mode 100644 index 073a0b69bf40..000000000000 --- a/p2p/protocols/accounting_test.go +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright 2018 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 protocols - -import ( - "testing" - - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/rlp" -) - -//dummy Balance implementation -type dummyBalance struct { - amount int64 - peer *Peer -} - -//dummy Prices implementation -type dummyPrices struct{} - -//a dummy message which needs size based accounting -//sender pays -type perBytesMsgSenderPays struct { - Content string -} - -//a dummy message which needs size based accounting -//receiver pays -type perBytesMsgReceiverPays struct { - Content string -} - -//a dummy message which is paid for per unit -//sender pays -type perUnitMsgSenderPays struct{} - -//receiver pays -type perUnitMsgReceiverPays struct{} - -//a dummy message which has zero as its price -type zeroPriceMsg struct{} - -//a dummy message which has no accounting -type nilPriceMsg struct{} - -//return the price for the defined messages -func (d *dummyPrices) Price(msg interface{}) *Price { - switch msg.(type) { - //size based message cost, receiver pays - case *perBytesMsgReceiverPays: - return &Price{ - PerByte: true, - Value: uint64(100), - Payer: Receiver, - } - //size based message cost, sender pays - case *perBytesMsgSenderPays: - return &Price{ - PerByte: true, - Value: uint64(100), - Payer: Sender, - } - //unitary cost, receiver pays - case *perUnitMsgReceiverPays: - return &Price{ - PerByte: false, - Value: uint64(99), - Payer: Receiver, - } - //unitary cost, sender pays - case *perUnitMsgSenderPays: - return &Price{ - PerByte: false, - Value: uint64(99), - Payer: Sender, - } - case *zeroPriceMsg: - return &Price{ - PerByte: false, - Value: uint64(0), - Payer: Sender, - } - case *nilPriceMsg: - return nil - } - return nil -} - -//dummy accounting implementation, only stores values for later check -func (d *dummyBalance) Add(amount int64, peer *Peer) error { - d.amount = amount - d.peer = peer - return nil -} - -type testCase struct { - msg interface{} - size uint32 - sendResult int64 - recvResult int64 -} - -//lowest level unit test -func TestBalance(t *testing.T) { - //create instances - balance := &dummyBalance{} - prices := &dummyPrices{} - //create the spec - spec := createTestSpec() - //create the accounting hook for the spec - acc := NewAccounting(balance, prices) - //create a peer - id := adapters.RandomNodeConfig().ID - p := p2p.NewPeer(id, "testPeer", nil) - peer := NewPeer(p, &dummyRW{}, spec) - //price depends on size, receiver pays - msg := &perBytesMsgReceiverPays{Content: "testBalance"} - size, _ := rlp.EncodeToBytes(msg) - - testCases := []testCase{ - { - msg, - uint32(len(size)), - int64(len(size) * 100), - int64(len(size) * -100), - }, - { - &perBytesMsgSenderPays{Content: "testBalance"}, - uint32(len(size)), - int64(len(size) * -100), - int64(len(size) * 100), - }, - { - &perUnitMsgSenderPays{}, - 0, - int64(-99), - int64(99), - }, - { - &perUnitMsgReceiverPays{}, - 0, - int64(99), - int64(-99), - }, - { - &zeroPriceMsg{}, - 0, - int64(0), - int64(0), - }, - { - &nilPriceMsg{}, - 0, - int64(0), - int64(0), - }, - } - checkAccountingTestCases(t, testCases, acc, peer, balance, true) - checkAccountingTestCases(t, testCases, acc, peer, balance, false) -} - -func checkAccountingTestCases(t *testing.T, cases []testCase, acc *Accounting, peer *Peer, balance *dummyBalance, send bool) { - for _, c := range cases { - var err error - var expectedResult int64 - //reset balance before every check - balance.amount = 0 - if send { - err = acc.Send(peer, c.size, c.msg) - expectedResult = c.sendResult - } else { - err = acc.Receive(peer, c.size, c.msg) - expectedResult = c.recvResult - } - - checkResults(t, err, balance, peer, expectedResult) - } -} - -func checkResults(t *testing.T, err error, balance *dummyBalance, peer *Peer, result int64) { - if err != nil { - t.Fatal(err) - } - if balance.peer != peer { - t.Fatalf("expected Add to be called with peer %v, got %v", peer, balance.peer) - } - if balance.amount != result { - t.Fatalf("Expected balance to be %d but is %d", result, balance.amount) - } -} - -//create a test spec -func createTestSpec() *Spec { - spec := &Spec{ - Name: "test", - Version: 42, - MaxMsgSize: 10 * 1024, - Messages: []interface{}{ - &perBytesMsgReceiverPays{}, - &perBytesMsgSenderPays{}, - &perUnitMsgReceiverPays{}, - &perUnitMsgSenderPays{}, - &zeroPriceMsg{}, - &nilPriceMsg{}, - }, - } - return spec -} diff --git a/p2p/protocols/protocol.go b/p2p/protocols/protocol.go deleted file mode 100644 index 2bcc5a7a2cd7..000000000000 --- a/p2p/protocols/protocol.go +++ /dev/null @@ -1,425 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -/* -Package protocols is an extension to p2p. It offers a user friendly simple way to define -devp2p subprotocols by abstracting away code standardly shared by protocols. - -* automate assigments of code indexes to messages -* automate RLP decoding/encoding based on reflecting -* provide the forever loop to read incoming messages -* standardise error handling related to communication -* standardised handshake negotiation -* TODO: automatic generation of wire protocol specification for peers - -*/ -package protocols - -import ( - "bufio" - "bytes" - "context" - "fmt" - "io" - "reflect" - "sync" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/swarm/spancontext" - "github.com/nebulaai/nbai-node/swarm/tracing" - opentracing "github.com/opentracing/opentracing-go" -) - -// error codes used by this protocol scheme -const ( - ErrMsgTooLong = iota - ErrDecode - ErrWrite - ErrInvalidMsgCode - ErrInvalidMsgType - ErrHandshake - ErrNoHandler - ErrHandler -) - -// error description strings associated with the codes -var errorToString = map[int]string{ - ErrMsgTooLong: "Message too long", - ErrDecode: "Invalid message (RLP error)", - ErrWrite: "Error sending message", - ErrInvalidMsgCode: "Invalid message code", - ErrInvalidMsgType: "Invalid message type", - ErrHandshake: "Handshake error", - ErrNoHandler: "No handler registered error", - ErrHandler: "Message handler error", -} - -/* -Error implements the standard go error interface. -Use: - - errorf(code, format, params ...interface{}) - -Prints as: - - :
- -where description is given by code in errorToString -and details is fmt.Sprintf(format, params...) - -exported field Code can be checked -*/ -type Error struct { - Code int - message string - format string - params []interface{} -} - -func (e Error) Error() (message string) { - if len(e.message) == 0 { - name, ok := errorToString[e.Code] - if !ok { - panic("invalid message code") - } - e.message = name - if e.format != "" { - e.message += ": " + fmt.Sprintf(e.format, e.params...) - } - } - return e.message -} - -func errorf(code int, format string, params ...interface{}) *Error { - return &Error{ - Code: code, - format: format, - params: params, - } -} - -// WrappedMsg is used to propagate marshalled context alongside message payloads -type WrappedMsg struct { - Context []byte - Size uint32 - Payload []byte -} - -//For accounting, the design is to allow the Spec to describe which and how its messages are priced -//To access this functionality, we provide a Hook interface which will call accounting methods -//NOTE: there could be more such (horizontal) hooks in the future -type Hook interface { - //A hook for sending messages - Send(peer *Peer, size uint32, msg interface{}) error - //A hook for receiving messages - Receive(peer *Peer, size uint32, msg interface{}) error -} - -// Spec is a protocol specification including its name and version as well as -// the types of messages which are exchanged -type Spec struct { - // Name is the name of the protocol, often a three-letter word - Name string - - // Version is the version number of the protocol - Version uint - - // MaxMsgSize is the maximum accepted length of the message payload - MaxMsgSize uint32 - - // Messages is a list of message data types which this protocol uses, with - // each message type being sent with its array index as the code (so - // [&foo{}, &bar{}, &baz{}] would send foo, bar and baz with codes - // 0, 1 and 2 respectively) - // each message must have a single unique data type - Messages []interface{} - - //hook for accounting (could be extended to multiple hooks in the future) - Hook Hook - - initOnce sync.Once - codes map[reflect.Type]uint64 - types map[uint64]reflect.Type -} - -func (s *Spec) init() { - s.initOnce.Do(func() { - s.codes = make(map[reflect.Type]uint64, len(s.Messages)) - s.types = make(map[uint64]reflect.Type, len(s.Messages)) - for i, msg := range s.Messages { - code := uint64(i) - typ := reflect.TypeOf(msg) - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - } - s.codes[typ] = code - s.types[code] = typ - } - }) -} - -// Length returns the number of message types in the protocol -func (s *Spec) Length() uint64 { - return uint64(len(s.Messages)) -} - -// GetCode returns the message code of a type, and boolean second argument is -// false if the message type is not found -func (s *Spec) GetCode(msg interface{}) (uint64, bool) { - s.init() - typ := reflect.TypeOf(msg) - if typ.Kind() == reflect.Ptr { - typ = typ.Elem() - } - code, ok := s.codes[typ] - return code, ok -} - -// NewMsg construct a new message type given the code -func (s *Spec) NewMsg(code uint64) (interface{}, bool) { - s.init() - typ, ok := s.types[code] - if !ok { - return nil, false - } - return reflect.New(typ).Interface(), true -} - -// Peer represents a remote peer or protocol instance that is running on a peer connection with -// a remote peer -type Peer struct { - *p2p.Peer // the p2p.Peer object representing the remote - rw p2p.MsgReadWriter // p2p.MsgReadWriter to send messages to and read messages from - spec *Spec -} - -// NewPeer constructs a new peer -// this constructor is called by the p2p.Protocol#Run function -// the first two arguments are the arguments passed to p2p.Protocol.Run function -// the third argument is the Spec describing the protocol -func NewPeer(p *p2p.Peer, rw p2p.MsgReadWriter, spec *Spec) *Peer { - return &Peer{ - Peer: p, - rw: rw, - spec: spec, - } -} - -// Run starts the forever loop that handles incoming messages -// called within the p2p.Protocol#Run function -// the handler argument is a function which is called for each message received -// from the remote peer, a returned error causes the loop to exit -// resulting in disconnection -func (p *Peer) Run(handler func(ctx context.Context, msg interface{}) error) error { - for { - if err := p.handleIncoming(handler); err != nil { - if err != io.EOF { - metrics.GetOrRegisterCounter("peer.handleincoming.error", nil).Inc(1) - log.Error("peer.handleIncoming", "err", err) - } - - return err - } - } -} - -// Drop disconnects a peer. -// TODO: may need to implement protocol drop only? don't want to kick off the peer -// if they are useful for other protocols -func (p *Peer) Drop(err error) { - p.Disconnect(p2p.DiscSubprotocolError) -} - -// Send takes a message, encodes it in RLP, finds the right message code and sends the -// message off to the peer -// this low level call will be wrapped by libraries providing routed or broadcast sends -// but often just used to forward and push messages to directly connected peers -func (p *Peer) Send(ctx context.Context, msg interface{}) error { - defer metrics.GetOrRegisterResettingTimer("peer.send_t", nil).UpdateSince(time.Now()) - metrics.GetOrRegisterCounter("peer.send", nil).Inc(1) - - var b bytes.Buffer - if tracing.Enabled { - writer := bufio.NewWriter(&b) - - tracer := opentracing.GlobalTracer() - - sctx := spancontext.FromContext(ctx) - - if sctx != nil { - err := tracer.Inject( - sctx, - opentracing.Binary, - writer) - if err != nil { - return err - } - } - - writer.Flush() - } - - r, err := rlp.EncodeToBytes(msg) - if err != nil { - return err - } - - wmsg := WrappedMsg{ - Context: b.Bytes(), - Size: uint32(len(r)), - Payload: r, - } - - //if the accounting hook is set, call it - if p.spec.Hook != nil { - err := p.spec.Hook.Send(p, wmsg.Size, msg) - if err != nil { - p.Drop(err) - return err - } - } - - code, found := p.spec.GetCode(msg) - if !found { - return errorf(ErrInvalidMsgType, "%v", code) - } - return p2p.Send(p.rw, code, wmsg) -} - -// handleIncoming(code) -// is called each cycle of the main forever loop that dispatches incoming messages -// if this returns an error the loop returns and the peer is disconnected with the error -// this generic handler -// * checks message size, -// * checks for out-of-range message codes, -// * handles decoding with reflection, -// * call handlers as callbacks -func (p *Peer) handleIncoming(handle func(ctx context.Context, msg interface{}) error) error { - msg, err := p.rw.ReadMsg() - if err != nil { - return err - } - // make sure that the payload has been fully consumed - defer msg.Discard() - - if msg.Size > p.spec.MaxMsgSize { - return errorf(ErrMsgTooLong, "%v > %v", msg.Size, p.spec.MaxMsgSize) - } - - // unmarshal wrapped msg, which might contain context - var wmsg WrappedMsg - err = msg.Decode(&wmsg) - if err != nil { - log.Error(err.Error()) - return err - } - - ctx := context.Background() - - // if tracing is enabled and the context coming within the request is - // not empty, try to unmarshal it - if tracing.Enabled && len(wmsg.Context) > 0 { - var sctx opentracing.SpanContext - - tracer := opentracing.GlobalTracer() - sctx, err = tracer.Extract( - opentracing.Binary, - bytes.NewReader(wmsg.Context)) - if err != nil { - log.Error(err.Error()) - return err - } - - ctx = spancontext.WithContext(ctx, sctx) - } - - val, ok := p.spec.NewMsg(msg.Code) - if !ok { - return errorf(ErrInvalidMsgCode, "%v", msg.Code) - } - if err := rlp.DecodeBytes(wmsg.Payload, val); err != nil { - return errorf(ErrDecode, "<= %v: %v", msg, err) - } - - //if the accounting hook is set, call it - if p.spec.Hook != nil { - err := p.spec.Hook.Receive(p, wmsg.Size, val) - if err != nil { - return err - } - } - - // call the registered handler callbacks - // a registered callback take the decoded message as argument as an interface - // which the handler is supposed to cast to the appropriate type - // it is entirely safe not to check the cast in the handler since the handler is - // chosen based on the proper type in the first place - if err := handle(ctx, val); err != nil { - return errorf(ErrHandler, "(msg code %v): %v", msg.Code, err) - } - return nil -} - -// Handshake negotiates a handshake on the peer connection -// * arguments -// * context -// * the local handshake to be sent to the remote peer -// * function to be called on the remote handshake (can be nil) -// * expects a remote handshake back of the same type -// * the dialing peer needs to send the handshake first and then waits for remote -// * the listening peer waits for the remote handshake and then sends it -// returns the remote handshake and an error -func (p *Peer) Handshake(ctx context.Context, hs interface{}, verify func(interface{}) error) (rhs interface{}, err error) { - if _, ok := p.spec.GetCode(hs); !ok { - return nil, errorf(ErrHandshake, "unknown handshake message type: %T", hs) - } - errc := make(chan error, 2) - handle := func(ctx context.Context, msg interface{}) error { - rhs = msg - if verify != nil { - return verify(rhs) - } - return nil - } - send := func() { errc <- p.Send(ctx, hs) } - receive := func() { errc <- p.handleIncoming(handle) } - - go func() { - if p.Inbound() { - receive() - send() - } else { - send() - receive() - } - }() - - for i := 0; i < 2; i++ { - select { - case err = <-errc: - case <-ctx.Done(): - err = ctx.Err() - } - if err != nil { - return nil, errorf(ErrHandshake, err.Error()) - } - } - return rhs, nil -} diff --git a/p2p/protocols/protocol_test.go b/p2p/protocols/protocol_test.go deleted file mode 100644 index e1ef3d94f48b..000000000000 --- a/p2p/protocols/protocol_test.go +++ /dev/null @@ -1,590 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package protocols - -import ( - "bytes" - "context" - "errors" - "fmt" - "testing" - "time" - - "github.com/nebulaai/nbai-node/rlp" - - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - p2ptest "github.com/nebulaai/nbai-node/p2p/testing" -) - -// handshake message type -type hs0 struct { - C uint -} - -// message to kill/drop the peer with nodeID -type kill struct { - C enode.ID -} - -// message to drop connection -type drop struct { -} - -/// protoHandshake represents module-independent aspects of the protocol and is -// the first message peers send and receive as part the initial exchange -type protoHandshake struct { - Version uint // local and remote peer should have identical version - NetworkID string // local and remote peer should have identical network id -} - -// checkProtoHandshake verifies local and remote protoHandshakes match -func checkProtoHandshake(testVersion uint, testNetworkID string) func(interface{}) error { - return func(rhs interface{}) error { - remote := rhs.(*protoHandshake) - if remote.NetworkID != testNetworkID { - return fmt.Errorf("%s (!= %s)", remote.NetworkID, testNetworkID) - } - - if remote.Version != testVersion { - return fmt.Errorf("%d (!= %d)", remote.Version, testVersion) - } - return nil - } -} - -// newProtocol sets up a protocol -// the run function here demonstrates a typical protocol using peerPool, handshake -// and messages registered to handlers -func newProtocol(pp *p2ptest.TestPeerPool) func(*p2p.Peer, p2p.MsgReadWriter) error { - spec := &Spec{ - Name: "test", - Version: 42, - MaxMsgSize: 10 * 1024, - Messages: []interface{}{ - protoHandshake{}, - hs0{}, - kill{}, - drop{}, - }, - } - return func(p *p2p.Peer, rw p2p.MsgReadWriter) error { - peer := NewPeer(p, rw, spec) - - // initiate one-off protohandshake and check validity - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - phs := &protoHandshake{42, "420"} - hsCheck := checkProtoHandshake(phs.Version, phs.NetworkID) - _, err := peer.Handshake(ctx, phs, hsCheck) - if err != nil { - return err - } - - lhs := &hs0{42} - // module handshake demonstrating a simple repeatable exchange of same-type message - hs, err := peer.Handshake(ctx, lhs, nil) - if err != nil { - return err - } - - if rmhs := hs.(*hs0); rmhs.C > lhs.C { - return fmt.Errorf("handshake mismatch remote %v > local %v", rmhs.C, lhs.C) - } - - handle := func(ctx context.Context, msg interface{}) error { - switch msg := msg.(type) { - - case *protoHandshake: - return errors.New("duplicate handshake") - - case *hs0: - rhs := msg - if rhs.C > lhs.C { - return fmt.Errorf("handshake mismatch remote %v > local %v", rhs.C, lhs.C) - } - lhs.C += rhs.C - return peer.Send(ctx, lhs) - - case *kill: - // demonstrates use of peerPool, killing another peer connection as a response to a message - id := msg.C - pp.Get(id).Drop(errors.New("killed")) - return nil - - case *drop: - // for testing we can trigger self induced disconnect upon receiving drop message - return errors.New("dropped") - - default: - return fmt.Errorf("unknown message type: %T", msg) - } - } - - pp.Add(peer) - defer pp.Remove(peer) - return peer.Run(handle) - } -} - -func protocolTester(t *testing.T, pp *p2ptest.TestPeerPool) *p2ptest.ProtocolTester { - conf := adapters.RandomNodeConfig() - return p2ptest.NewProtocolTester(t, conf.ID, 2, newProtocol(pp)) -} - -func protoHandshakeExchange(id enode.ID, proto *protoHandshake) []p2ptest.Exchange { - - return []p2ptest.Exchange{ - { - Expects: []p2ptest.Expect{ - { - Code: 0, - Msg: &protoHandshake{42, "420"}, - Peer: id, - }, - }, - }, - { - Triggers: []p2ptest.Trigger{ - { - Code: 0, - Msg: proto, - Peer: id, - }, - }, - }, - } -} - -func runProtoHandshake(t *testing.T, proto *protoHandshake, errs ...error) { - pp := p2ptest.NewTestPeerPool() - s := protocolTester(t, pp) - // TODO: make this more than one handshake - node := s.Nodes[0] - if err := s.TestExchanges(protoHandshakeExchange(node.ID(), proto)...); err != nil { - t.Fatal(err) - } - var disconnects []*p2ptest.Disconnect - for i, err := range errs { - disconnects = append(disconnects, &p2ptest.Disconnect{Peer: s.Nodes[i].ID(), Error: err}) - } - if err := s.TestDisconnected(disconnects...); err != nil { - t.Fatal(err) - } -} - -type dummyHook struct { - peer *Peer - size uint32 - msg interface{} - send bool - err error - waitC chan struct{} -} - -type dummyMsg struct { - Content string -} - -func (d *dummyHook) Send(peer *Peer, size uint32, msg interface{}) error { - d.peer = peer - d.size = size - d.msg = msg - d.send = true - return d.err -} - -func (d *dummyHook) Receive(peer *Peer, size uint32, msg interface{}) error { - d.peer = peer - d.size = size - d.msg = msg - d.send = false - d.waitC <- struct{}{} - return d.err -} - -func TestProtocolHook(t *testing.T) { - testHook := &dummyHook{ - waitC: make(chan struct{}, 1), - } - spec := &Spec{ - Name: "test", - Version: 42, - MaxMsgSize: 10 * 1024, - Messages: []interface{}{ - dummyMsg{}, - }, - Hook: testHook, - } - - runFunc := func(p *p2p.Peer, rw p2p.MsgReadWriter) error { - peer := NewPeer(p, rw, spec) - ctx := context.TODO() - err := peer.Send(ctx, &dummyMsg{ - Content: "handshake"}) - - if err != nil { - t.Fatal(err) - } - - handle := func(ctx context.Context, msg interface{}) error { - return nil - } - - return peer.Run(handle) - } - - conf := adapters.RandomNodeConfig() - tester := p2ptest.NewProtocolTester(t, conf.ID, 2, runFunc) - err := tester.TestExchanges(p2ptest.Exchange{ - Expects: []p2ptest.Expect{ - { - Code: 0, - Msg: &dummyMsg{Content: "handshake"}, - Peer: tester.Nodes[0].ID(), - }, - }, - }) - if err != nil { - t.Fatal(err) - } - if testHook.msg == nil || testHook.msg.(*dummyMsg).Content != "handshake" { - t.Fatal("Expected msg to be set, but it is not") - } - if !testHook.send { - t.Fatal("Expected a send message, but it is not") - } - if testHook.peer == nil || testHook.peer.ID() != tester.Nodes[0].ID() { - t.Fatal("Expected peer ID to be set correctly, but it is not") - } - if testHook.size != 11 { //11 is the length of the encoded message - t.Fatalf("Expected size to be %d, but it is %d ", 1, testHook.size) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Triggers: []p2ptest.Trigger{ - { - Code: 0, - Msg: &dummyMsg{Content: "response"}, - Peer: tester.Nodes[1].ID(), - }, - }, - }) - - <-testHook.waitC - - if err != nil { - t.Fatal(err) - } - if testHook.msg == nil || testHook.msg.(*dummyMsg).Content != "response" { - t.Fatal("Expected msg to be set, but it is not") - } - if testHook.send { - t.Fatal("Expected a send message, but it is not") - } - if testHook.peer == nil || testHook.peer.ID() != tester.Nodes[1].ID() { - t.Fatal("Expected peer ID to be set correctly, but it is not") - } - if testHook.size != 10 { //11 is the length of the encoded message - t.Fatalf("Expected size to be %d, but it is %d ", 1, testHook.size) - } - - testHook.err = fmt.Errorf("dummy error") - err = tester.TestExchanges(p2ptest.Exchange{ - Triggers: []p2ptest.Trigger{ - { - Code: 0, - Msg: &dummyMsg{Content: "response"}, - Peer: tester.Nodes[1].ID(), - }, - }, - }) - - <-testHook.waitC - - time.Sleep(100 * time.Millisecond) - err = tester.TestDisconnected(&p2ptest.Disconnect{Peer: tester.Nodes[1].ID(), Error: testHook.err}) - if err != nil { - t.Fatalf("Expected a specific disconnect error, but got different one: %v", err) - } - -} - -//We need to test that if the hook is not defined, then message infrastructure -//(send,receive) still works -func TestNoHook(t *testing.T) { - //create a test spec - spec := createTestSpec() - //a random node - id := adapters.RandomNodeConfig().ID - //a peer - p := p2p.NewPeer(id, "testPeer", nil) - rw := &dummyRW{} - peer := NewPeer(p, rw, spec) - ctx := context.TODO() - msg := &perBytesMsgSenderPays{Content: "testBalance"} - //send a message - err := peer.Send(ctx, msg) - if err != nil { - t.Fatal(err) - } - //simulate receiving a message - rw.msg = msg - peer.handleIncoming(func(ctx context.Context, msg interface{}) error { - return nil - }) - //all should just work and not result in any error -} - -func TestProtoHandshakeVersionMismatch(t *testing.T) { - runProtoHandshake(t, &protoHandshake{41, "420"}, errorf(ErrHandshake, errorf(ErrHandler, "(msg code 0): 41 (!= 42)").Error())) -} - -func TestProtoHandshakeNetworkIDMismatch(t *testing.T) { - runProtoHandshake(t, &protoHandshake{42, "421"}, errorf(ErrHandshake, errorf(ErrHandler, "(msg code 0): 421 (!= 420)").Error())) -} - -func TestProtoHandshakeSuccess(t *testing.T) { - runProtoHandshake(t, &protoHandshake{42, "420"}) -} - -func moduleHandshakeExchange(id enode.ID, resp uint) []p2ptest.Exchange { - - return []p2ptest.Exchange{ - { - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &hs0{42}, - Peer: id, - }, - }, - }, - { - Triggers: []p2ptest.Trigger{ - { - Code: 1, - Msg: &hs0{resp}, - Peer: id, - }, - }, - }, - } -} - -func runModuleHandshake(t *testing.T, resp uint, errs ...error) { - pp := p2ptest.NewTestPeerPool() - s := protocolTester(t, pp) - node := s.Nodes[0] - if err := s.TestExchanges(protoHandshakeExchange(node.ID(), &protoHandshake{42, "420"})...); err != nil { - t.Fatal(err) - } - if err := s.TestExchanges(moduleHandshakeExchange(node.ID(), resp)...); err != nil { - t.Fatal(err) - } - var disconnects []*p2ptest.Disconnect - for i, err := range errs { - disconnects = append(disconnects, &p2ptest.Disconnect{Peer: s.Nodes[i].ID(), Error: err}) - } - if err := s.TestDisconnected(disconnects...); err != nil { - t.Fatal(err) - } -} - -func TestModuleHandshakeError(t *testing.T) { - runModuleHandshake(t, 43, fmt.Errorf("handshake mismatch remote 43 > local 42")) -} - -func TestModuleHandshakeSuccess(t *testing.T) { - runModuleHandshake(t, 42) -} - -// testing complex interactions over multiple peers, relaying, dropping -func testMultiPeerSetup(a, b enode.ID) []p2ptest.Exchange { - - return []p2ptest.Exchange{ - { - Label: "primary handshake", - Expects: []p2ptest.Expect{ - { - Code: 0, - Msg: &protoHandshake{42, "420"}, - Peer: a, - }, - { - Code: 0, - Msg: &protoHandshake{42, "420"}, - Peer: b, - }, - }, - }, - { - Label: "module handshake", - Triggers: []p2ptest.Trigger{ - { - Code: 0, - Msg: &protoHandshake{42, "420"}, - Peer: a, - }, - { - Code: 0, - Msg: &protoHandshake{42, "420"}, - Peer: b, - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &hs0{42}, - Peer: a, - }, - { - Code: 1, - Msg: &hs0{42}, - Peer: b, - }, - }, - }, - - {Label: "alternative module handshake", Triggers: []p2ptest.Trigger{{Code: 1, Msg: &hs0{41}, Peer: a}, - {Code: 1, Msg: &hs0{41}, Peer: b}}}, - {Label: "repeated module handshake", Triggers: []p2ptest.Trigger{{Code: 1, Msg: &hs0{1}, Peer: a}}}, - {Label: "receiving repeated module handshake", Expects: []p2ptest.Expect{{Code: 1, Msg: &hs0{43}, Peer: a}}}} -} - -func runMultiplePeers(t *testing.T, peer int, errs ...error) { - pp := p2ptest.NewTestPeerPool() - s := protocolTester(t, pp) - - if err := s.TestExchanges(testMultiPeerSetup(s.Nodes[0].ID(), s.Nodes[1].ID())...); err != nil { - t.Fatal(err) - } - // after some exchanges of messages, we can test state changes - // here this is simply demonstrated by the peerPool - // after the handshake negotiations peers must be added to the pool - // time.Sleep(1) - tick := time.NewTicker(10 * time.Millisecond) - timeout := time.NewTimer(1 * time.Second) -WAIT: - for { - select { - case <-tick.C: - if pp.Has(s.Nodes[0].ID()) { - break WAIT - } - case <-timeout.C: - t.Fatal("timeout") - } - } - if !pp.Has(s.Nodes[1].ID()) { - t.Fatalf("missing peer test-1: %v (%v)", pp, s.Nodes) - } - - // peer 0 sends kill request for peer with index - err := s.TestExchanges(p2ptest.Exchange{ - Triggers: []p2ptest.Trigger{ - { - Code: 2, - Msg: &kill{s.Nodes[peer].ID()}, - Peer: s.Nodes[0].ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - - // the peer not killed sends a drop request - err = s.TestExchanges(p2ptest.Exchange{ - Triggers: []p2ptest.Trigger{ - { - Code: 3, - Msg: &drop{}, - Peer: s.Nodes[(peer+1)%2].ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - - // check the actual discconnect errors on the individual peers - var disconnects []*p2ptest.Disconnect - for i, err := range errs { - disconnects = append(disconnects, &p2ptest.Disconnect{Peer: s.Nodes[i].ID(), Error: err}) - } - if err := s.TestDisconnected(disconnects...); err != nil { - t.Fatal(err) - } - // test if disconnected peers have been removed from peerPool - if pp.Has(s.Nodes[peer].ID()) { - t.Fatalf("peer test-%v not dropped: %v (%v)", peer, pp, s.Nodes) - } - -} -func XTestMultiplePeersDropSelf(t *testing.T) { - runMultiplePeers(t, 0, - fmt.Errorf("subprotocol error"), - fmt.Errorf("Message handler error: (msg code 3): dropped"), - ) -} - -func XTestMultiplePeersDropOther(t *testing.T) { - runMultiplePeers(t, 1, - fmt.Errorf("Message handler error: (msg code 3): dropped"), - fmt.Errorf("subprotocol error"), - ) -} - -//dummy implementation of a MsgReadWriter -//this allows for quick and easy unit tests without -//having to build up the complete protocol -type dummyRW struct { - msg interface{} - size uint32 - code uint64 -} - -func (d *dummyRW) WriteMsg(msg p2p.Msg) error { - return nil -} - -func (d *dummyRW) ReadMsg() (p2p.Msg, error) { - enc := bytes.NewReader(d.getDummyMsg()) - return p2p.Msg{ - Code: d.code, - Size: d.size, - Payload: enc, - ReceivedAt: time.Now(), - }, nil -} - -func (d *dummyRW) getDummyMsg() []byte { - r, _ := rlp.EncodeToBytes(d.msg) - var b bytes.Buffer - wmsg := WrappedMsg{ - Context: b.Bytes(), - Size: uint32(len(r)), - Payload: r, - } - rr, _ := rlp.EncodeToBytes(wmsg) - d.size = uint32(len(rr)) - return rr -} diff --git a/p2p/protocols/reporter.go b/p2p/protocols/reporter.go deleted file mode 100644 index 215d4fe31b96..000000000000 --- a/p2p/protocols/reporter.go +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright 2018 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 protocols - -import ( - "encoding/binary" - "time" - - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/metrics" - - "github.com/syndtr/goleveldb/leveldb" -) - -//AccountMetrics abstracts away the metrics DB and -//the reporter to persist metrics -type AccountingMetrics struct { - reporter *reporter -} - -//Close will be called when the node is being shutdown -//for a graceful cleanup -func (am *AccountingMetrics) Close() { - close(am.reporter.quit) - am.reporter.db.Close() -} - -//reporter is an internal structure used to write p2p accounting related -//metrics to a LevelDB. It will periodically write the accrued metrics to the DB. -type reporter struct { - reg metrics.Registry //the registry for these metrics (independent of other metrics) - interval time.Duration //duration at which the reporter will persist metrics - db *leveldb.DB //the actual DB - quit chan struct{} //quit the reporter loop -} - -//NewMetricsDB creates a new LevelDB instance used to persist metrics defined -//inside p2p/protocols/accounting.go -func NewAccountingMetrics(r metrics.Registry, d time.Duration, path string) *AccountingMetrics { - var val = make([]byte, 8) - var err error - - //Create the LevelDB - db, err := leveldb.OpenFile(path, nil) - if err != nil { - log.Error(err.Error()) - return nil - } - - //Check for all defined metrics that there is a value in the DB - //If there is, assign it to the metric. This means that the node - //has been running before and that metrics have been persisted. - metricsMap := map[string]metrics.Counter{ - "account.balance.credit": mBalanceCredit, - "account.balance.debit": mBalanceDebit, - "account.bytes.credit": mBytesCredit, - "account.bytes.debit": mBytesDebit, - "account.msg.credit": mMsgCredit, - "account.msg.debit": mMsgDebit, - "account.peerdrops": mPeerDrops, - "account.selfdrops": mSelfDrops, - } - //iterate the map and get the values - for key, metric := range metricsMap { - val, err = db.Get([]byte(key), nil) - //until the first time a value is being written, - //this will return an error. - //it could be beneficial though to log errors later, - //but that would require a different logic - if err == nil { - metric.Inc(int64(binary.BigEndian.Uint64(val))) - } - } - - //create the reporter - rep := &reporter{ - reg: r, - interval: d, - db: db, - quit: make(chan struct{}), - } - - //run the go routine - go rep.run() - - m := &AccountingMetrics{ - reporter: rep, - } - - return m -} - -//run is the goroutine which periodically sends the metrics to the configured LevelDB -func (r *reporter) run() { - intervalTicker := time.NewTicker(r.interval) - - for { - select { - case <-intervalTicker.C: - //at each tick send the metrics - if err := r.save(); err != nil { - log.Error("unable to send metrics to LevelDB", "err", err) - //If there is an error in writing, exit the routine; we assume here that the error is - //severe and don't attempt to write again. - //Also, this should prevent leaking when the node is stopped - return - } - case <-r.quit: - //graceful shutdown - return - } - } -} - -//send the metrics to the DB -func (r *reporter) save() error { - //create a LevelDB Batch - batch := leveldb.Batch{} - //for each metric in the registry (which is independent)... - r.reg.Each(func(name string, i interface{}) { - metric, ok := i.(metrics.Counter) - if ok { - //assuming every metric here to be a Counter (separate registry) - //...create a snapshot... - ms := metric.Snapshot() - byteVal := make([]byte, 8) - binary.BigEndian.PutUint64(byteVal, uint64(ms.Count())) - //...and save the value to the DB - batch.Put([]byte(name), byteVal) - } - }) - return r.db.Write(&batch, nil) -} diff --git a/p2p/protocols/reporter_test.go b/p2p/protocols/reporter_test.go deleted file mode 100644 index b9f06e6744ee..000000000000 --- a/p2p/protocols/reporter_test.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2018 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 protocols - -import ( - "io/ioutil" - "os" - "path/filepath" - "testing" - "time" - - "github.com/ethereum/go-ethereum/log" -) - -//TestReporter tests that the metrics being collected for p2p accounting -//are being persisted and available after restart of a node. -//It simulates restarting by just recreating the DB as if the node had restarted. -func TestReporter(t *testing.T) { - //create a test directory - dir, err := ioutil.TempDir("", "reporter-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - - //setup the metrics - log.Debug("Setting up metrics first time") - reportInterval := 5 * time.Millisecond - metrics := SetupAccountingMetrics(reportInterval, filepath.Join(dir, "test.db")) - log.Debug("Done.") - - //do some metrics - mBalanceCredit.Inc(12) - mBytesCredit.Inc(34) - mMsgDebit.Inc(9) - - //give the reporter time to write the metrics to DB - time.Sleep(20 * time.Millisecond) - - //set the metrics to nil - this effectively simulates the node having shut down... - mBalanceCredit = nil - mBytesCredit = nil - mMsgDebit = nil - //close the DB also, or we can't create a new one - metrics.Close() - - //setup the metrics again - log.Debug("Setting up metrics second time") - metrics = SetupAccountingMetrics(reportInterval, filepath.Join(dir, "test.db")) - defer metrics.Close() - log.Debug("Done.") - - //now check the metrics, they should have the same value as before "shutdown" - if mBalanceCredit.Count() != 12 { - t.Fatalf("Expected counter to be %d, but is %d", 12, mBalanceCredit.Count()) - } - if mBytesCredit.Count() != 34 { - t.Fatalf("Expected counter to be %d, but is %d", 23, mBytesCredit.Count()) - } - if mMsgDebit.Count() != 9 { - t.Fatalf("Expected counter to be %d, but is %d", 9, mMsgDebit.Count()) - } -} diff --git a/p2p/rlpx.go b/p2p/rlpx.go index adc73b47f6e5..c9ca6ea42f22 100644 --- a/p2p/rlpx.go +++ b/p2p/rlpx.go @@ -35,11 +35,11 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/common/bitutil" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/crypto/ecies" - "github.com/nebulaai/nbai-node/crypto/secp256k1" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common/bitutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/ecies" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/rlp" "github.com/golang/snappy" "golang.org/x/crypto/sha3" ) @@ -47,10 +47,10 @@ import ( const ( maxUint24 = ^uint32(0) >> 8 - sskLen = 16 // ecies.MaxSharedKeyLength(pubKey) / 2 - sigLen = 65 // elliptic S256 - pubLen = 64 // 512 bit pubkey in uncompressed representation without format byte - shaLen = 32 // hash length (for nonce etc) + sskLen = 16 // ecies.MaxSharedKeyLength(pubKey) / 2 + sigLen = crypto.SignatureLength // elliptic S256 + pubLen = 64 // 512 bit pubkey in uncompressed representation without format byte + shaLen = 32 // hash length (for nonce etc) authMsgLen = sigLen + shaLen + pubLen + shaLen + 1 authRespLen = pubLen + shaLen + 1 @@ -128,7 +128,7 @@ func (t *rlpx) doProtoHandshake(our *protoHandshake) (their *protoHandshake, err // as the error so it can be tracked elsewhere. werr := make(chan error, 1) go func() { werr <- Send(t.rw, handshakeMsg, our) }() - if their, err = readProtocolHandshake(t.rw, our); err != nil { + if their, err = readProtocolHandshake(t.rw); err != nil { <-werr // make sure the write terminates too return nil, err } @@ -141,7 +141,7 @@ func (t *rlpx) doProtoHandshake(our *protoHandshake) (their *protoHandshake, err return their, nil } -func readProtocolHandshake(rw MsgReader, our *protoHandshake) (*protoHandshake, error) { +func readProtocolHandshake(rw MsgReader) (*protoHandshake, error) { msg, err := rw.ReadMsg() if err != nil { return nil, err @@ -400,7 +400,7 @@ func (h *encHandshake) handleAuthMsg(msg *authMsgV4, prv *ecdsa.PrivateKey) erro return err } signedMsg := xor(token, h.initNonce) - remoteRandomPub, err := secp256k1.RecoverPubkey(signedMsg, msg.Signature[:]) + remoteRandomPub, err := crypto.Ecrecover(signedMsg, msg.Signature[:]) if err != nil { return err } @@ -422,16 +422,6 @@ func (h *encHandshake) makeAuthResp() (msg *authRespV4, err error) { return msg, nil } -func (msg *authMsgV4) sealPlain(h *encHandshake) ([]byte, error) { - buf := make([]byte, authMsgLen) - n := copy(buf, msg.Signature[:]) - n += copy(buf[n:], crypto.Keccak256(exportPubkey(&h.randomPrivKey.PublicKey))) - n += copy(buf[n:], msg.InitiatorPubkey[:]) - n += copy(buf[n:], msg.Nonce[:]) - buf[n] = 0 // token-flag - return ecies.Encrypt(rand.Reader, h.remote, buf, nil, nil) -} - func (msg *authMsgV4) decodePlain(input []byte) { n := copy(msg.Signature[:], input) n += shaLen // skip sha3(initiator-ephemeral-pubk) @@ -603,6 +593,10 @@ func (rw *rlpxFrameRW) WriteMsg(msg Msg) error { msg.Payload = bytes.NewReader(payload) msg.Size = uint32(len(payload)) } + msg.meterSize = msg.Size + if metrics.Enabled && msg.meterCap.Name != "" { // don't meter non-subprotocol messages + metrics.GetOrRegisterMeter(fmt.Sprintf("%s/%s/%d/%#02x", MetricsOutboundTraffic, msg.meterCap.Name, msg.meterCap.Version, msg.meterCode), nil).Mark(int64(msg.meterSize)) + } // write header headbuf := make([]byte, 32) fsize := uint32(len(ptype)) + msg.Size @@ -687,6 +681,7 @@ func (rw *rlpxFrameRW) ReadMsg() (msg Msg, err error) { return msg, err } msg.Size = uint32(content.Len()) + msg.meterSize = msg.Size msg.Payload = content // if snappy is enabled, verify and decompress message diff --git a/p2p/rlpx_test.go b/p2p/rlpx_test.go index ab480be6b318..e62196ff049e 100644 --- a/p2p/rlpx_test.go +++ b/p2p/rlpx_test.go @@ -32,10 +32,10 @@ import ( "time" "github.com/davecgh/go-spew/spew" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/crypto/ecies" - "github.com/nebulaai/nbai-node/p2p/simulations/pipes" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/crypto/ecies" + "github.com/ethereum/go-ethereum/p2p/simulations/pipes" + "github.com/ethereum/go-ethereum/rlp" "golang.org/x/crypto/sha3" ) @@ -222,7 +222,6 @@ func TestProtocolHandshake(t *testing.T) { } func TestProtocolHandshakeErrors(t *testing.T) { - our := &protoHandshake{Version: 3, Caps: []Cap{{"foo", 2}, {"bar", 3}}, Name: "quux"} tests := []struct { code uint64 msg interface{} @@ -258,7 +257,7 @@ func TestProtocolHandshakeErrors(t *testing.T) { for i, test := range tests { p1, p2 := MsgPipe() go Send(p1, test.code, test.msg) - _, err := readProtocolHandshake(p2, our) + _, err := readProtocolHandshake(p2) if !reflect.DeepEqual(err, test.err) { t.Errorf("test %d: error mismatch: got %q, want %q", i, err, test.err) } diff --git a/p2p/server.go b/p2p/server.go index 22d7c9ef0218..9b9effaf6cd4 100644 --- a/p2p/server.go +++ b/p2p/server.go @@ -22,34 +22,42 @@ import ( "crypto/ecdsa" "encoding/hex" "errors" + "fmt" "net" "sort" "sync" "sync/atomic" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/mclock" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/discover" - "github.com/nebulaai/nbai-node/p2p/discv5" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/enr" - "github.com/nebulaai/nbai-node/p2p/nat" - "github.com/nebulaai/nbai-node/p2p/netutil" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/mclock" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/discover" + "github.com/ethereum/go-ethereum/p2p/discv5" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/p2p/nat" + "github.com/ethereum/go-ethereum/p2p/netutil" ) const ( defaultDialTimeout = 15 * time.Second + // This is the fairness knob for the discovery mixer. When looking for peers, we'll + // wait this long for a single source of candidates before moving on and trying other + // sources. + discmixTimeout = 5 * time.Second + // Connectivity defaults. maxActiveDialTasks = 16 defaultMaxPendingPeers = 50 defaultDialRatio = 3 + // This time limits inbound connection attempts per source IP. + inboundThrottleTime = 30 * time.Second + // Maximum time allowed for reading a complete message. // This is effectively the amount of time a connection can be idle. frameReadTimeout = 30 * time.Second @@ -159,33 +167,39 @@ type Server struct { // the whole protocol stack. newTransport func(net.Conn) transport newPeerHook func(*Peer) + listenFunc func(network, addr string) (net.Listener, error) lock sync.Mutex // protects running running bool - nodedb *enode.DB - localnode *enode.LocalNode - ntab discoverTable listener net.Listener ourHandshake *protoHandshake - lastLookup time.Time - DiscV5 *discv5.Network - - // These are for Peers, PeerCount (and nothing else). - peerOp chan peerOpFunc - peerOpDone chan struct{} - - quit chan struct{} - addstatic chan *enode.Node - removestatic chan *enode.Node - addtrusted chan *enode.Node - removetrusted chan *enode.Node - posthandshake chan *conn - addpeer chan *conn - delpeer chan peerDrop - loopWG sync.WaitGroup // loop, listenLoop - peerFeed event.Feed - log log.Logger + loopWG sync.WaitGroup // loop, listenLoop + peerFeed event.Feed + log log.Logger + + nodedb *enode.DB + localnode *enode.LocalNode + ntab *discover.UDPv4 + DiscV5 *discv5.Network + discmix *enode.FairMix + + staticNodeResolver nodeResolver + + // Channels into the run loop. + quit chan struct{} + addstatic chan *enode.Node + removestatic chan *enode.Node + addtrusted chan *enode.Node + removetrusted chan *enode.Node + peerOp chan peerOpFunc + peerOpDone chan struct{} + delpeer chan peerDrop + checkpointPostHandshake chan *conn + checkpointAddPeer chan *conn + + // State of run loop and listenLoop. + inboundHistory expHeap } type peerOpFunc func(map[enode.ID]*Peer) @@ -280,6 +294,11 @@ func (c *conn) set(f connFlag, val bool) { } } +// LocalNode returns the local node record. +func (srv *Server) LocalNode() *enode.LocalNode { + return srv.localnode +} + // Peers returns all connected peers. func (srv *Server) Peers() []*Peer { var ps []*Peer @@ -390,7 +409,7 @@ type sharedUDPConn struct { func (s *sharedUDPConn) ReadFromUDP(b []byte) (n int, addr *net.UDPAddr, err error) { packet, ok := <-s.unhandled if !ok { - return 0, nil, errors.New("Connection was closed") + return 0, nil, errors.New("connection was closed") } l := len(packet.Data) if l > len(b) { @@ -416,7 +435,7 @@ func (srv *Server) Start() (err error) { srv.running = true srv.log = srv.Config.Logger if srv.log == nil { - srv.log = log.New() + srv.log = log.Root() } if srv.NoDial && srv.ListenAddr == "" { srv.log.Warn("P2P server will be useless, neither dialing nor listening") @@ -429,13 +448,16 @@ func (srv *Server) Start() (err error) { if srv.newTransport == nil { srv.newTransport = newRLPX } + if srv.listenFunc == nil { + srv.listenFunc = net.Listen + } if srv.Dialer == nil { srv.Dialer = TCPDialer{&net.Dialer{Timeout: defaultDialTimeout}} } srv.quit = make(chan struct{}) - srv.addpeer = make(chan *conn) srv.delpeer = make(chan peerDrop) - srv.posthandshake = make(chan *conn) + srv.checkpointPostHandshake = make(chan *conn) + srv.checkpointAddPeer = make(chan *conn) srv.addstatic = make(chan *enode.Node) srv.removestatic = make(chan *enode.Node) srv.addtrusted = make(chan *enode.Node) @@ -456,7 +478,7 @@ func (srv *Server) Start() (err error) { } dynPeers := srv.maxDialedConns() - dialer := newDialState(srv.localnode.ID(), srv.StaticNodes, srv.BootstrapNodes, srv.ntab, dynPeers, srv.NetRestrict) + dialer := newDialState(srv.localnode.ID(), dynPeers, &srv.Config) srv.loopWG.Add(1) go srv.run(dialer) return nil @@ -479,7 +501,6 @@ func (srv *Server) setupLocalNode() error { srv.nodedb = db srv.localnode = enode.NewLocalNode(db, srv.PrivateKey) srv.localnode.SetFallbackIP(net.IP{127, 0, 0, 1}) - srv.localnode.Set(capsByNameAndVersion(srv.ourHandshake.Caps)) // TODO: check conflicts for _, p := range srv.Protocols { for _, e := range p.Attributes { @@ -508,6 +529,18 @@ func (srv *Server) setupLocalNode() error { } func (srv *Server) setupDiscovery() error { + srv.discmix = enode.NewFairMix(discmixTimeout) + + // Add protocol-specific discovery sources. + added := make(map[string]bool) + for _, proto := range srv.Protocols { + if proto.DialCandidates != nil && !added[proto.Name] { + srv.discmix.AddSource(proto.DialCandidates) + added[proto.Name] = true + } + } + + // Don't listen on UDP endpoint if DHT is disabled. if srv.NoDiscovery && !srv.DiscoveryV5 { return nil } @@ -542,13 +575,17 @@ func (srv *Server) setupDiscovery() error { NetRestrict: srv.NetRestrict, Bootnodes: srv.BootstrapNodes, Unhandled: unhandled, + Log: srv.log, } ntab, err := discover.ListenUDP(conn, srv.localnode, cfg) if err != nil { return err } srv.ntab = ntab + srv.discmix.AddSource(ntab.RandomNodes()) + srv.staticNodeResolver = ntab } + // Discovery V5 if srv.DiscoveryV5 { var ntab *discv5.Network @@ -570,27 +607,28 @@ func (srv *Server) setupDiscovery() error { } func (srv *Server) setupListening() error { - // Launch the TCP listener. - listener, err := net.Listen("tcp", srv.ListenAddr) + // Launch the listener. + listener, err := srv.listenFunc("tcp", srv.ListenAddr) if err != nil { return err } - laddr := listener.Addr().(*net.TCPAddr) - srv.ListenAddr = laddr.String() srv.listener = listener - srv.localnode.Set(enr.TCP(laddr.Port)) + srv.ListenAddr = listener.Addr().String() + + // Update the local node record and map the TCP listening port if NAT is configured. + if tcp, ok := listener.Addr().(*net.TCPAddr); ok { + srv.localnode.Set(enr.TCP(tcp.Port)) + if !tcp.IP.IsLoopback() && srv.NAT != nil { + srv.loopWG.Add(1) + go func() { + nat.Map(srv.NAT, srv.quit, "tcp", tcp.Port, tcp.Port, "ethereum p2p") + srv.loopWG.Done() + }() + } + } srv.loopWG.Add(1) go srv.listenLoop() - - // Map the TCP listening port if NAT is configured. - if !laddr.IP.IsLoopback() && srv.NAT != nil { - srv.loopWG.Add(1) - go func() { - nat.Map(srv.NAT, srv.quit, "tcp", laddr.Port, laddr.Port, "ethereum p2p") - srv.loopWG.Done() - }() - } return nil } @@ -602,9 +640,10 @@ type dialer interface { } func (srv *Server) run(dialstate dialer) { - srv.log.Info("Started P2P networking", "self", srv.localnode.Node()) + srv.log.Info("Started P2P networking", "self", srv.localnode.Node().URLv4()) defer srv.loopWG.Done() defer srv.nodedb.Close() + defer srv.discmix.Close() var ( peers = make(map[enode.ID]*Peer) @@ -658,12 +697,14 @@ running: case <-srv.quit: // The server was stopped. Run the cleanup logic. break running + case n := <-srv.addstatic: // This channel is used by AddPeer to add to the // ephemeral static peer list. Add it to the dialer, // it will keep the node connected. srv.log.Trace("Adding static node", "node", n) dialstate.addStatic(n) + case n := <-srv.removestatic: // This channel is used by RemovePeer to send a // disconnect request to a peer and begin the @@ -673,6 +714,7 @@ running: if p, ok := peers[n.ID()]; ok { p.Disconnect(DiscRequested) } + case n := <-srv.addtrusted: // This channel is used by AddTrustedPeer to add an enode // to the trusted node set. @@ -682,21 +724,23 @@ running: if p, ok := peers[n.ID()]; ok { p.rw.set(trustedConn, true) } + case n := <-srv.removetrusted: // This channel is used by RemoveTrustedPeer to remove an enode // from the trusted node set. srv.log.Trace("Removing trusted node", "node", n) - if _, ok := trusted[n.ID()]; ok { - delete(trusted, n.ID()) - } + delete(trusted, n.ID()) + // Unmark any already-connected peer as trusted if p, ok := peers[n.ID()]; ok { p.rw.set(trustedConn, false) } + case op := <-srv.peerOp: // This channel is used by Peers and PeerCount. op(peers) srv.peerOpDone <- struct{}{} + case t := <-taskdone: // A task got done. Tell dialstate about it so it // can update its state and remove it from the active @@ -704,7 +748,8 @@ running: srv.log.Trace("Dial task done", "task", t) dialstate.taskDone(t, time.Now()) delTask(t) - case c := <-srv.posthandshake: + + case c := <-srv.checkpointPostHandshake: // A connection has passed the encryption handshake so // the remote identity is known (but hasn't been verified yet). if trusted[c.node.ID()] { @@ -712,43 +757,40 @@ running: c.flags |= trustedConn } // TODO: track in-progress inbound node IDs (pre-Peer) to avoid dialing them. - select { - case c.cont <- srv.encHandshakeChecks(peers, inboundCount, c): - case <-srv.quit: - break running - } - case c := <-srv.addpeer: + c.cont <- srv.postHandshakeChecks(peers, inboundCount, c) + + case c := <-srv.checkpointAddPeer: // At this point the connection is past the protocol handshake. // Its capabilities are known and the remote identity is verified. - err := srv.protoHandshakeChecks(peers, inboundCount, c) + err := srv.addPeerChecks(peers, inboundCount, c) if err == nil { // The handshakes are done and it passed all checks. - p := newPeer(c, srv.Protocols) + p := newPeer(srv.log, 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) - srv.log.Debug("Adding p2p peer", "name", name, "addr", c.fd.RemoteAddr(), "peers", len(peers)+1) + p.log.Debug("Adding p2p peer", "addr", p.RemoteAddr(), "peers", len(peers)+1, "name", name) go srv.runPeer(p) peers[c.node.ID()] = p if p.Inbound() { inboundCount++ } + if conn, ok := c.fd.(*meteredConn); ok { + conn.handshakeDone(p) + } } // The dialer logic relies on the assumption that // dial tasks complete after the peer has been added or // discarded. Unblock the task last. - select { - case c.cont <- err: - case <-srv.quit: - break running - } + c.cont <- err + case pd := <-srv.delpeer: // A peer disconnected. d := common.PrettyDuration(mclock.Now() - pd.created) - pd.log.Debug("Removing p2p peer", "duration", d, "peers", len(peers)-1, "req", pd.requested, "err", pd.err) + pd.log.Debug("Removing p2p peer", "addr", pd.RemoteAddr(), "peers", len(peers)-1, "duration", d, "req", pd.requested, "err", pd.err) delete(peers, pd.ID()) if pd.Inbound() { inboundCount-- @@ -779,17 +821,7 @@ running: } } -func (srv *Server) protoHandshakeChecks(peers map[enode.ID]*Peer, inboundCount int, c *conn) error { - // Drop connections with no matching protocols. - if len(srv.Protocols) > 0 && countMatchingProtocols(srv.Protocols, c.caps) == 0 { - return DiscUselessPeer - } - // Repeat the encryption handshake checks because the - // peer set might have changed between the handshakes. - return srv.encHandshakeChecks(peers, inboundCount, c) -} - -func (srv *Server) encHandshakeChecks(peers map[enode.ID]*Peer, inboundCount int, c *conn) error { +func (srv *Server) postHandshakeChecks(peers map[enode.ID]*Peer, inboundCount int, c *conn) error { switch { case !c.is(trustedConn|staticDialedConn) && len(peers) >= srv.MaxPeers: return DiscTooManyPeers @@ -804,9 +836,20 @@ func (srv *Server) encHandshakeChecks(peers map[enode.ID]*Peer, inboundCount int } } +func (srv *Server) addPeerChecks(peers map[enode.ID]*Peer, inboundCount int, c *conn) error { + // Drop connections with no matching protocols. + if len(srv.Protocols) > 0 && countMatchingProtocols(srv.Protocols, c.caps) == 0 { + return DiscUselessPeer + } + // Repeat the post-handshake checks because the + // peer set might have changed since those checks were performed. + return srv.postHandshakeChecks(peers, inboundCount, c) +} + func (srv *Server) maxInboundConns() int { return srv.MaxPeers - srv.maxDialedConns() } + func (srv *Server) maxDialedConns() int { if srv.NoDiscovery || srv.NoDial { return 0 @@ -834,7 +877,7 @@ func (srv *Server) listenLoop() { } for { - // Wait for a handshake slot before accepting. + // Wait for a free slot before accepting. <-slots var ( @@ -853,22 +896,21 @@ func (srv *Server) listenLoop() { break } - // Reject connections that do not match NetRestrict. - if srv.NetRestrict != nil { - if tcp, ok := fd.RemoteAddr().(*net.TCPAddr); ok && !srv.NetRestrict.Contains(tcp.IP) { - srv.log.Debug("Rejected conn (not whitelisted in NetRestrict)", "addr", fd.RemoteAddr()) - fd.Close() - slots <- struct{}{} - continue - } + remoteIP := netutil.AddrIP(fd.RemoteAddr()) + if err := srv.checkInboundConn(fd, remoteIP); err != nil { + srv.log.Debug("Rejected inbound connnection", "addr", fd.RemoteAddr(), "err", err) + fd.Close() + slots <- struct{}{} + continue } - - var ip net.IP - if tcp, ok := fd.RemoteAddr().(*net.TCPAddr); ok { - ip = tcp.IP + if remoteIP != nil { + var addr *net.TCPAddr + if tcp, ok := fd.RemoteAddr().(*net.TCPAddr); ok { + addr = tcp + } + fd = newMeteredConn(fd, true, addr) + srv.log.Trace("Accepted connection", "addr", fd.RemoteAddr()) } - fd = newMeteredConn(fd, true, ip) - srv.log.Trace("Accepted connection", "addr", fd.RemoteAddr()) go func() { srv.SetupConn(fd, inboundConn, nil) slots <- struct{}{} @@ -876,6 +918,22 @@ func (srv *Server) listenLoop() { } } +func (srv *Server) checkInboundConn(fd net.Conn, remoteIP net.IP) error { + if remoteIP != nil { + // Reject connections that do not match NetRestrict. + if srv.NetRestrict != nil && !srv.NetRestrict.Contains(remoteIP) { + return fmt.Errorf("not whitelisted in NetRestrict") + } + // Reject Internet peers that try too often. + srv.inboundHistory.expire(time.Now()) + if !netutil.IsLAN(remoteIP) && srv.inboundHistory.contains(remoteIP.String()) { + return fmt.Errorf("too many attempts") + } + srv.inboundHistory.add(remoteIP.String(), time.Now().Add(inboundThrottleTime)) + } + return nil +} + // 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. @@ -897,6 +955,7 @@ func (srv *Server) setupConn(c *conn, flags connFlag, dialDest *enode.Node) erro if !running { return errServerStopped } + // If dialing, figure out the remote public key. var dialPubkey *ecdsa.PublicKey if dialDest != nil { @@ -905,7 +964,8 @@ func (srv *Server) setupConn(c *conn, flags connFlag, dialDest *enode.Node) erro return errors.New("dial destination doesn't have a secp256k1 public key") } } - // Run the encryption handshake. + + // Run the RLPx handshake. remotePubkey, err := c.doEncHandshake(srv.PrivateKey, dialPubkey) if err != nil { srv.log.Trace("Failed RLPx handshake", "addr", c.fd.RemoteAddr(), "conn", c.flags, "err", err) @@ -920,16 +980,14 @@ func (srv *Server) setupConn(c *conn, flags connFlag, dialDest *enode.Node) erro } else { c.node = nodeFromConn(remotePubkey, c.fd) } - if conn, ok := c.fd.(*meteredConn); ok { - conn.handshakeDone(c.node.ID()) - } clog := srv.log.New("id", c.node.ID(), "addr", c.fd.RemoteAddr(), "conn", c.flags) - err = srv.checkpoint(c, srv.posthandshake) + err = srv.checkpoint(c, srv.checkpointPostHandshake) if err != nil { - clog.Trace("Rejected peer before protocol handshake", "err", err) + clog.Trace("Rejected peer", "err", err) return err } - // Run the protocol handshake + + // Run the capability negotiation handshake. phs, err := c.doProtoHandshake(srv.ourHandshake) if err != nil { clog.Trace("Failed proto handshake", "err", err) @@ -940,14 +998,15 @@ func (srv *Server) setupConn(c *conn, flags connFlag, dialDest *enode.Node) erro return DiscUnexpectedIdentity } c.caps, c.name = phs.Caps, phs.Name - err = srv.checkpoint(c, srv.addpeer) + err = srv.checkpoint(c, srv.checkpointAddPeer) if err != nil { clog.Trace("Rejected peer", "err", err) return err } - // If the checks completed successfully, runPeer has now been - // launched by run. - clog.Trace("connection set up", "inbound", dialDest == nil) + + // If the checks completed successfully, the connection has been added as a peer and + // runPeer has been launched. + clog.Trace("Connection set up", "inbound", dialDest == nil) return nil } @@ -976,12 +1035,7 @@ func (srv *Server) checkpoint(c *conn, stage chan<- *conn) error { case <-srv.quit: return errServerStopped } - select { - case err := <-c.cont: - return err - case <-srv.quit: - return errServerStopped - } + return <-c.cont } // runPeer runs in its own goroutine for each peer. @@ -994,8 +1048,10 @@ func (srv *Server) runPeer(p *Peer) { // broadcast peer add srv.peerFeed.Send(&PeerEvent{ - Type: PeerEventTypeAdd, - Peer: p.ID(), + Type: PeerEventTypeAdd, + Peer: p.ID(), + RemoteAddress: p.RemoteAddr().String(), + LocalAddress: p.LocalAddr().String(), }) // run the protocol @@ -1003,9 +1059,11 @@ func (srv *Server) runPeer(p *Peer) { // broadcast peer drop srv.peerFeed.Send(&PeerEvent{ - Type: PeerEventTypeDrop, - Peer: p.ID(), - Error: err.Error(), + Type: PeerEventTypeDrop, + Peer: p.ID(), + Error: err.Error(), + RemoteAddress: p.RemoteAddr().String(), + LocalAddress: p.LocalAddr().String(), }) // Note: run waits for existing peers to be sent on srv.delpeer @@ -1034,7 +1092,7 @@ func (srv *Server) NodeInfo() *NodeInfo { node := srv.Self() info := &NodeInfo{ Name: srv.Name, - Enode: node.String(), + Enode: node.URLv4(), ID: node.ID().String(), IP: node.IP().String(), ListenAddr: srv.ListenAddr, @@ -1042,9 +1100,7 @@ func (srv *Server) NodeInfo() *NodeInfo { } info.Ports.Discovery = node.UDP() info.Ports.Listener = node.TCP() - if enc, err := rlp.EncodeToBytes(node.Record()); err == nil { - info.ENR = "0x" + hex.EncodeToString(enc) - } + info.ENR = node.String() // Gather all the running protocol infos (only once per protocol type) for _, proto := range srv.Protocols { diff --git a/p2p/server_test.go b/p2p/server_test.go index c05200a3aa7e..383445c83388 100644 --- a/p2p/server_test.go +++ b/p2p/server_test.go @@ -19,16 +19,18 @@ package p2p import ( "crypto/ecdsa" "errors" + "io" "math/rand" "net" "reflect" "testing" "time" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/enr" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/internal/testlog" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" "golang.org/x/crypto/sha3" ) @@ -74,6 +76,7 @@ func startTestServer(t *testing.T, remoteKey *ecdsa.PublicKey, pf func(*Peer)) * MaxPeers: 10, ListenAddr: "127.0.0.1:0", PrivateKey: newkey(), + Logger: testlog.Logger(t, log.LvlTrace), } server := &Server{ Config: config, @@ -230,8 +233,8 @@ func TestServerTaskScheduling(t *testing.T) { Config: Config{MaxPeers: 10}, localnode: enode.NewLocalNode(db, newkey()), nodedb: db, + discmix: enode.NewFairMix(0), quit: make(chan struct{}), - ntab: fakeTable{}, running: true, log: log.New(), } @@ -279,9 +282,9 @@ func TestServerManyTasks(t *testing.T) { quit: make(chan struct{}), localnode: enode.NewLocalNode(db, newkey()), nodedb: db, - ntab: fakeTable{}, running: true, log: log.New(), + discmix: enode.NewFairMix(0), } done = make(chan *testTask) start, end = 0, 0 @@ -359,6 +362,7 @@ func TestServerAtCap(t *testing.T) { PrivateKey: newkey(), MaxPeers: 10, NoDial: true, + NoDiscovery: true, TrustedNodes: []*enode.Node{newNode(trustedID, nil)}, }, } @@ -377,19 +381,19 @@ func TestServerAtCap(t *testing.T) { // Inject a few connections to fill up the peer set. for i := 0; i < 10; i++ { c := newconn(randomID()) - if err := srv.checkpoint(c, srv.addpeer); err != nil { + if err := srv.checkpoint(c, srv.checkpointAddPeer); err != nil { t.Fatalf("could not add conn %d: %v", i, err) } } // Try inserting a non-trusted connection. anotherID := randomID() c := newconn(anotherID) - if err := srv.checkpoint(c, srv.posthandshake); err != DiscTooManyPeers { + if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != DiscTooManyPeers { t.Error("wrong error for insert:", err) } // Try inserting a trusted connection. c = newconn(trustedID) - if err := srv.checkpoint(c, srv.posthandshake); err != nil { + if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != nil { t.Error("unexpected error for trusted conn @posthandshake:", err) } if !c.is(trustedConn) { @@ -399,14 +403,14 @@ func TestServerAtCap(t *testing.T) { // Remove from trusted set and try again srv.RemoveTrustedPeer(newNode(trustedID, nil)) c = newconn(trustedID) - if err := srv.checkpoint(c, srv.posthandshake); err != DiscTooManyPeers { + if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != DiscTooManyPeers { t.Error("wrong error for insert:", err) } // Add anotherID to trusted set and try again srv.AddTrustedPeer(newNode(anotherID, nil)) c = newconn(anotherID) - if err := srv.checkpoint(c, srv.posthandshake); err != nil { + if err := srv.checkpoint(c, srv.checkpointPostHandshake); err != nil { t.Error("unexpected error for trusted conn @posthandshake:", err) } if !c.is(trustedConn) { @@ -430,10 +434,11 @@ func TestServerPeerLimits(t *testing.T) { srv := &Server{ Config: Config{ - PrivateKey: srvkey, - MaxPeers: 0, - NoDial: true, - Protocols: []Protocol{discard}, + PrivateKey: srvkey, + MaxPeers: 0, + NoDial: true, + NoDiscovery: true, + Protocols: []Protocol{discard}, }, newTransport: func(fd net.Conn) transport { return tp }, log: log.New(), @@ -541,29 +546,35 @@ func TestServerSetupConn(t *testing.T) { } for i, test := range tests { - srv := &Server{ - Config: Config{ - PrivateKey: srvkey, - MaxPeers: 10, - NoDial: true, - Protocols: []Protocol{discard}, - }, - newTransport: func(fd net.Conn) transport { return test.tt }, - log: log.New(), - } - if !test.dontstart { - if err := srv.Start(); err != nil { - t.Fatalf("couldn't start server: %v", err) + t.Run(test.wantCalls, func(t *testing.T) { + cfg := Config{ + PrivateKey: srvkey, + MaxPeers: 10, + NoDial: true, + NoDiscovery: true, + Protocols: []Protocol{discard}, + Logger: testlog.Logger(t, log.LvlTrace), } - } - p1, _ := net.Pipe() - 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) - } - if test.tt.calls != test.wantCalls { - t.Errorf("test %d: calls mismatch: got %q, want %q", i, test.tt.calls, test.wantCalls) - } + srv := &Server{ + Config: cfg, + newTransport: func(fd net.Conn) transport { return test.tt }, + log: cfg.Logger, + } + if !test.dontstart { + if err := srv.Start(); err != nil { + t.Fatalf("couldn't start server: %v", err) + } + defer srv.Stop() + } + p1, _ := net.Pipe() + 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) + } + if test.tt.calls != test.wantCalls { + t.Errorf("test %d: calls mismatch: got %q, want %q", i, test.tt.calls, test.wantCalls) + } + }) } } @@ -616,3 +627,100 @@ func randomID() (id enode.ID) { } return id } + +// This test checks that inbound connections are throttled by IP. +func TestServerInboundThrottle(t *testing.T) { + const timeout = 5 * time.Second + newTransportCalled := make(chan struct{}) + srv := &Server{ + Config: Config{ + PrivateKey: newkey(), + ListenAddr: "127.0.0.1:0", + MaxPeers: 10, + NoDial: true, + NoDiscovery: true, + Protocols: []Protocol{discard}, + Logger: testlog.Logger(t, log.LvlTrace), + }, + newTransport: func(fd net.Conn) transport { + newTransportCalled <- struct{}{} + return newRLPX(fd) + }, + listenFunc: func(network, laddr string) (net.Listener, error) { + fakeAddr := &net.TCPAddr{IP: net.IP{95, 33, 21, 2}, Port: 4444} + return listenFakeAddr(network, laddr, fakeAddr) + }, + } + if err := srv.Start(); err != nil { + t.Fatal("can't start: ", err) + } + defer srv.Stop() + + // Dial the test server. + conn, err := net.DialTimeout("tcp", srv.ListenAddr, timeout) + if err != nil { + t.Fatalf("could not dial: %v", err) + } + select { + case <-newTransportCalled: + // OK + case <-time.After(timeout): + t.Error("newTransport not called") + } + conn.Close() + + // Dial again. This time the server should close the connection immediately. + connClosed := make(chan struct{}) + conn, err = net.DialTimeout("tcp", srv.ListenAddr, timeout) + if err != nil { + t.Fatalf("could not dial: %v", err) + } + defer conn.Close() + go func() { + conn.SetDeadline(time.Now().Add(timeout)) + buf := make([]byte, 10) + if n, err := conn.Read(buf); err != io.EOF || n != 0 { + t.Errorf("expected io.EOF and n == 0, got error %q and n == %d", err, n) + } + connClosed <- struct{}{} + }() + select { + case <-connClosed: + // OK + case <-newTransportCalled: + t.Error("newTransport called for second attempt") + case <-time.After(timeout): + t.Error("connection not closed within timeout") + } +} + +func listenFakeAddr(network, laddr string, remoteAddr net.Addr) (net.Listener, error) { + l, err := net.Listen(network, laddr) + if err == nil { + l = &fakeAddrListener{l, remoteAddr} + } + return l, err +} + +// fakeAddrListener is a listener that creates connections with a mocked remote address. +type fakeAddrListener struct { + net.Listener + remoteAddr net.Addr +} + +type fakeAddrConn struct { + net.Conn + remoteAddr net.Addr +} + +func (l *fakeAddrListener) Accept() (net.Conn, error) { + c, err := l.Listener.Accept() + if err != nil { + return nil, err + } + return &fakeAddrConn{c, l.remoteAddr}, nil +} + +func (c *fakeAddrConn) RemoteAddr() net.Addr { + return c.remoteAddr +} diff --git a/p2p/simulations/adapters/exec.go b/p2p/simulations/adapters/exec.go index d82a68edf438..7c6ec9462192 100644 --- a/p2p/simulations/adapters/exec.go +++ b/p2p/simulations/adapters/exec.go @@ -19,7 +19,6 @@ package adapters import ( "bytes" "context" - "crypto/ecdsa" "encoding/json" "errors" "fmt" @@ -36,12 +35,12 @@ import ( "time" "github.com/docker/docker/pkg/reexec" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/rpc" - "golang.org/x/net/websocket" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/rpc" + "github.com/gorilla/websocket" ) func init() { @@ -92,22 +91,33 @@ func (e *ExecAdapter) NewNode(config *NodeConfig) (Node, error) { return nil, fmt.Errorf("error creating node directory: %s", err) } + err := config.initDummyEnode() + if err != nil { + return nil, err + } + // generate the config conf := &execNodeConfig{ Stack: node.DefaultConfig, Node: config, } - conf.Stack.DataDir = filepath.Join(dir, "data") + if config.DataDir != "" { + conf.Stack.DataDir = config.DataDir + } else { + conf.Stack.DataDir = filepath.Join(dir, "data") + } + + // these parameters are crucial for execadapter node to run correctly 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.EnableMsgEvents = config.EnableMsgEvents conf.Stack.P2P.NoDiscovery = true conf.Stack.P2P.NAT = nil conf.Stack.NoUSB = true - // listen on a localhost port, which we set when we + // Listen on a localhost port, which we set when we // initialise NodeConfig (usually a random port) conf.Stack.P2P.ListenAddr = fmt.Sprintf(":%d", config.Port) @@ -135,7 +145,6 @@ type ExecNode struct { client *rpc.Client wsAddr string newCmd func() *exec.Cmd - key *ecdsa.PrivateKey } // Addr returns the node's enode URL @@ -194,17 +203,17 @@ func (n *ExecNode) Start(snapshots map[string][]byte) (err error) { } n.Cmd = cmd - // read the WebSocket address from the stderr logs + // Wait for the node to start. status := <-statusC if status.Err != "" { return errors.New(status.Err) } - client, err := rpc.DialWebsocket(ctx, status.WSEndpoint, "http://localhost") + client, err := rpc.DialWebsocket(ctx, status.WSEndpoint, "") if err != nil { return fmt.Errorf("can't connect to RPC server: %v", err) } - // node ready :) + // Node ready :) n.client = client n.wsAddr = status.WSEndpoint n.Info = status.NodeInfo @@ -303,31 +312,37 @@ func (n *ExecNode) NodeInfo() *p2p.NodeInfo { // 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") +func (n *ExecNode) ServeRPC(clientConn *websocket.Conn) error { + conn, _, err := websocket.DefaultDialer.Dial(n.wsAddr, nil) 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) + go wsCopy(&wg, conn, clientConn) + go wsCopy(&wg, clientConn, conn) wg.Wait() + conn.Close() return nil } +func wsCopy(wg *sync.WaitGroup, src, dst *websocket.Conn) { + defer wg.Done() + for { + msgType, r, err := src.NextReader() + if err != nil { + return + } + w, err := dst.NextWriter(msgType) + if err != nil { + return + } + if _, err = io.Copy(w, r); err != nil { + return + } + } +} + // Snapshots creates snapshots of the services by calling the // simulation_snapshot RPC method func (n *ExecNode) Snapshots() (map[string][]byte, error) { @@ -403,6 +418,13 @@ func startExecNodeStack() (*node.Node, error) { if err := json.Unmarshal([]byte(confEnv), &conf); err != nil { return nil, fmt.Errorf("error decoding %s: %v", envNodeConfig, err) } + + // create enode record + nodeTcpConn, _ := net.ResolveTCPAddr("tcp", conf.Stack.P2P.ListenAddr) + if nodeTcpConn.IP == nil { + nodeTcpConn.IP = net.IPv4(127, 0, 0, 1) + } + conf.Node.initEnode(nodeTcpConn.IP, nodeTcpConn.Port, nodeTcpConn.Port) conf.Stack.P2P.PrivateKey = conf.Node.PrivateKey conf.Stack.Logger = log.New("node.id", conf.Node.ID.String()) diff --git a/p2p/simulations/adapters/inproc.go b/p2p/simulations/adapters/inproc.go index 313198dcf15e..9787082e1825 100644 --- a/p2p/simulations/adapters/inproc.go +++ b/p2p/simulations/adapters/inproc.go @@ -23,13 +23,14 @@ import ( "net" "sync" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations/pipes" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/simulations/pipes" + "github.com/ethereum/go-ethereum/rpc" + "github.com/gorilla/websocket" ) // SimAdapter is a NodeAdapter which creates in-memory simulation nodes and @@ -71,8 +72,13 @@ 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 + // verify that the node has a private key in the config + if config.PrivateKey == nil { + return nil, fmt.Errorf("node is missing private key: %s", id) + } + + // check a node with the ID doesn't already exist if _, exists := s.nodes[id]; exists { return nil, fmt.Errorf("node already exists: %s", id) } @@ -87,6 +93,11 @@ func (s *SimAdapter) NewNode(config *NodeConfig) (Node, error) { } } + err := config.initDummyEnode() + if err != nil { + return nil, err + } + n, err := node.New(&node.Config{ P2P: p2p.Config{ PrivateKey: config.PrivateKey, @@ -172,6 +183,12 @@ type SimNode struct { registerOnce sync.Once } +// Close closes the underlaying node.Node to release +// acquired resources. +func (sn *SimNode) Close() error { + return sn.node.Close() +} + // Addr returns the node's discovery address func (sn *SimNode) Addr() []byte { return []byte(sn.Node().String()) @@ -194,13 +211,14 @@ func (sn *SimNode) Client() (*rpc.Client, error) { } // ServeRPC serves RPC requests over the given connection by creating an -// in-memory client to the node's RPC server -func (sn *SimNode) ServeRPC(conn net.Conn) error { +// in-memory client to the node's RPC server. +func (sn *SimNode) ServeRPC(conn *websocket.Conn) error { handler, err := sn.node.RPCHandler() if err != nil { return err } - handler.ServeCodec(rpc.NewJSONCodec(conn), rpc.OptionMethodInvocation|rpc.OptionSubscriptions) + codec := rpc.NewFuncCodec(conn, conn.WriteJSON, conn.ReadJSON) + handler.ServeCodec(codec, 0) return nil } diff --git a/p2p/simulations/adapters/inproc_test.go b/p2p/simulations/adapters/inproc_test.go index c455d38857a7..2a61508fe18b 100644 --- a/p2p/simulations/adapters/inproc_test.go +++ b/p2p/simulations/adapters/inproc_test.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2018 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 @@ -20,10 +20,10 @@ import ( "bytes" "encoding/binary" "fmt" + "sync" "testing" - "time" - "github.com/nebulaai/nbai-node/p2p/simulations/pipes" + "github.com/ethereum/go-ethereum/p2p/simulations/pipes" ) func TestTCPPipe(t *testing.T) { @@ -32,42 +32,26 @@ func TestTCPPipe(t *testing.T) { t.Fatal(err) } - done := make(chan struct{}) - - go func() { - msgs := 50 - size := 1024 - for i := 0; i < msgs; i++ { - msg := make([]byte, size) - _ = binary.PutUvarint(msg, uint64(i)) - - _, err := c1.Write(msg) - if err != nil { - t.Fatal(err) - } + msgs := 50 + size := 1024 + for i := 0; i < msgs; i++ { + msg := make([]byte, size) + binary.PutUvarint(msg, uint64(i)) + if _, err := c1.Write(msg); err != nil { + t.Fatal(err) } + } - for i := 0; i < msgs; i++ { - msg := make([]byte, size) - _ = binary.PutUvarint(msg, uint64(i)) - - out := make([]byte, size) - _, err := c2.Read(out) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(msg, out) { - t.Fatalf("expected %#v, got %#v", msg, out) - } + for i := 0; i < msgs; i++ { + msg := make([]byte, size) + binary.PutUvarint(msg, uint64(i)) + out := make([]byte, size) + if _, err := c2.Read(out); err != nil { + t.Fatal(err) + } + if !bytes.Equal(msg, out) { + t.Fatalf("expected %#v, got %#v", msg, out) } - done <- struct{}{} - }() - - select { - case <-done: - case <-time.After(5 * time.Second): - t.Fatal("test timeout") } } @@ -77,60 +61,41 @@ func TestTCPPipeBidirections(t *testing.T) { t.Fatal(err) } - done := make(chan struct{}) - - go func() { - msgs := 50 - size := 7 - for i := 0; i < msgs; i++ { - msg := []byte(fmt.Sprintf("ping %02d", i)) - - _, err := c1.Write(msg) - if err != nil { - t.Fatal(err) - } + msgs := 50 + size := 7 + for i := 0; i < msgs; i++ { + msg := []byte(fmt.Sprintf("ping %02d", i)) + if _, err := c1.Write(msg); err != nil { + t.Fatal(err) } + } - for i := 0; i < msgs; i++ { - expected := []byte(fmt.Sprintf("ping %02d", i)) - - out := make([]byte, size) - _, err := c2.Read(out) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(expected, out) { - t.Fatalf("expected %#v, got %#v", out, expected) - } else { - msg := []byte(fmt.Sprintf("pong %02d", i)) - _, err := c2.Write(msg) - if err != nil { - t.Fatal(err) - } - } + for i := 0; i < msgs; i++ { + expected := []byte(fmt.Sprintf("ping %02d", i)) + out := make([]byte, size) + if _, err := c2.Read(out); err != nil { + t.Fatal(err) } - for i := 0; i < msgs; i++ { - expected := []byte(fmt.Sprintf("pong %02d", i)) - - out := make([]byte, size) - _, err := c1.Read(out) - if err != nil { + if !bytes.Equal(expected, out) { + t.Fatalf("expected %#v, got %#v", out, expected) + } else { + msg := []byte(fmt.Sprintf("pong %02d", i)) + if _, err := c2.Write(msg); err != nil { t.Fatal(err) } - - if !bytes.Equal(expected, out) { - t.Fatalf("expected %#v, got %#v", out, expected) - } } - done <- struct{}{} - }() + } - select { - case <-done: - case <-time.After(5 * time.Second): - t.Fatal("test timeout") + for i := 0; i < msgs; i++ { + expected := []byte(fmt.Sprintf("pong %02d", i)) + out := make([]byte, size) + if _, err := c1.Read(out); err != nil { + t.Fatal(err) + } + if !bytes.Equal(expected, out) { + t.Fatalf("expected %#v, got %#v", out, expected) + } } } @@ -140,46 +105,35 @@ func TestNetPipe(t *testing.T) { t.Fatal(err) } - done := make(chan struct{}) + msgs := 50 + size := 1024 + var wg sync.WaitGroup + defer wg.Wait() + // netPipe is blocking, so writes are emitted asynchronously + wg.Add(1) go func() { - msgs := 50 - size := 1024 - // netPipe is blocking, so writes are emitted asynchronously - go func() { - for i := 0; i < msgs; i++ { - msg := make([]byte, size) - _ = binary.PutUvarint(msg, uint64(i)) - - _, err := c1.Write(msg) - if err != nil { - t.Fatal(err) - } - } - }() + defer wg.Done() for i := 0; i < msgs; i++ { msg := make([]byte, size) - _ = binary.PutUvarint(msg, uint64(i)) - - out := make([]byte, size) - _, err := c2.Read(out) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(msg, out) { - t.Fatalf("expected %#v, got %#v", msg, out) + binary.PutUvarint(msg, uint64(i)) + if _, err := c1.Write(msg); err != nil { + t.Error(err) } } - - done <- struct{}{} }() - select { - case <-done: - case <-time.After(5 * time.Second): - t.Fatal("test timeout") + for i := 0; i < msgs; i++ { + msg := make([]byte, size) + binary.PutUvarint(msg, uint64(i)) + out := make([]byte, size) + if _, err := c2.Read(out); err != nil { + t.Error(err) + } + if !bytes.Equal(msg, out) { + t.Errorf("expected %#v, got %#v", msg, out) + } } } @@ -189,71 +143,60 @@ func TestNetPipeBidirections(t *testing.T) { t.Fatal(err) } - done := make(chan struct{}) + msgs := 1000 + size := 8 + pingTemplate := "ping %03d" + pongTemplate := "pong %03d" + var wg sync.WaitGroup + defer wg.Wait() + // netPipe is blocking, so writes are emitted asynchronously + wg.Add(1) go func() { - msgs := 1000 - size := 8 - pingTemplate := "ping %03d" - pongTemplate := "pong %03d" - - // netPipe is blocking, so writes are emitted asynchronously - go func() { - for i := 0; i < msgs; i++ { - msg := []byte(fmt.Sprintf(pingTemplate, i)) + defer wg.Done() - _, err := c1.Write(msg) - if err != nil { - t.Fatal(err) - } - } - }() - - // netPipe is blocking, so reads for pong are emitted asynchronously - go func() { - for i := 0; i < msgs; i++ { - expected := []byte(fmt.Sprintf(pongTemplate, i)) - - out := make([]byte, size) - _, err := c1.Read(out) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(expected, out) { - t.Fatalf("expected %#v, got %#v", expected, out) - } + for i := 0; i < msgs; i++ { + msg := []byte(fmt.Sprintf(pingTemplate, i)) + if _, err := c1.Write(msg); err != nil { + t.Error(err) } + } + }() - done <- struct{}{} - }() + // netPipe is blocking, so reads for pong are emitted asynchronously + wg.Add(1) + go func() { + defer wg.Done() - // expect to read pings, and respond with pongs to the alternate connection for i := 0; i < msgs; i++ { - expected := []byte(fmt.Sprintf(pingTemplate, i)) - + expected := []byte(fmt.Sprintf(pongTemplate, i)) out := make([]byte, size) - _, err := c2.Read(out) - if err != nil { - t.Fatal(err) + if _, err := c1.Read(out); err != nil { + t.Error(err) } - if !bytes.Equal(expected, out) { - t.Fatalf("expected %#v, got %#v", expected, out) - } else { - msg := []byte(fmt.Sprintf(pongTemplate, i)) - - _, err := c2.Write(msg) - if err != nil { - t.Fatal(err) - } + t.Errorf("expected %#v, got %#v", expected, out) } } }() - select { - case <-done: - case <-time.After(5 * time.Second): - t.Fatal("test timeout") + // expect to read pings, and respond with pongs to the alternate connection + for i := 0; i < msgs; i++ { + expected := []byte(fmt.Sprintf(pingTemplate, i)) + + out := make([]byte, size) + _, err := c2.Read(out) + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(expected, out) { + t.Errorf("expected %#v, got %#v", expected, out) + } else { + msg := []byte(fmt.Sprintf(pongTemplate, i)) + if _, err := c2.Write(msg); err != nil { + t.Fatal(err) + } + } } } diff --git a/p2p/simulations/adapters/types.go b/p2p/simulations/adapters/types.go index 77dc08d24262..ec22b712c351 100644 --- a/p2p/simulations/adapters/types.go +++ b/p2p/simulations/adapters/types.go @@ -26,11 +26,14 @@ import ( "strconv" "github.com/docker/docker/pkg/reexec" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enr" + "github.com/ethereum/go-ethereum/rpc" + "github.com/gorilla/websocket" ) // Node represents a node in a simulation network which is created by a @@ -49,7 +52,7 @@ type Node interface { Client() (*rpc.Client, error) // ServeRPC serves RPC requests over the given connection - ServeRPC(net.Conn) error + ServeRPC(*websocket.Conn) error // Start starts the node with the given snapshots Start(snapshots map[string][]byte) error @@ -90,12 +93,26 @@ type NodeConfig struct { // Name is a human friendly name for the node like "node01" Name string + // Use an existing database instead of a temporary one if non-empty + DataDir 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 + // Properties are the names of the properties this node should hold + // within running services (e.g. "bootnode", "lightnode" or any custom values) + // These values need to be checked and acted upon by node Services + Properties []string + + // Enode + node *enode.Node + + // ENR Record with entries to overwrite + Record enr.Record + // function to sanction or prevent suggesting a peer Reachable func(id enode.ID) bool @@ -109,6 +126,7 @@ type nodeConfigJSON struct { PrivateKey string `json:"private_key"` Name string `json:"name"` Services []string `json:"services"` + Properties []string `json:"properties"` EnableMsgEvents bool `json:"enable_msg_events"` Port uint16 `json:"port"` } @@ -120,6 +138,7 @@ func (n *NodeConfig) MarshalJSON() ([]byte, error) { ID: n.ID.String(), Name: n.Name, Services: n.Services, + Properties: n.Properties, Port: n.Port, EnableMsgEvents: n.EnableMsgEvents, } @@ -157,6 +176,7 @@ func (n *NodeConfig) UnmarshalJSON(data []byte) error { n.Name = confJSON.Name n.Services = confJSON.Services + n.Properties = confJSON.Properties n.Port = confJSON.Port n.EnableMsgEvents = confJSON.EnableMsgEvents @@ -165,26 +185,27 @@ func (n *NodeConfig) UnmarshalJSON(data []byte) error { // Node returns the node descriptor represented by the config. func (n *NodeConfig) Node() *enode.Node { - return enode.NewV4(&n.PrivateKey.PublicKey, net.IP{127, 0, 0, 1}, int(n.Port), int(n.Port)) + return n.node } // RandomNodeConfig returns node configuration with a randomly generated ID and // PrivateKey func RandomNodeConfig() *NodeConfig { - key, err := crypto.GenerateKey() + prvkey, err := crypto.GenerateKey() if err != nil { panic("unable to generate key") } - id := enode.PubkeyToIDV4(&key.PublicKey) port, err := assignTCPPort() if err != nil { panic("unable to assign tcp port") } + + enodId := enode.PubkeyToIDV4(&prvkey.PublicKey) return &NodeConfig{ - ID: id, - Name: fmt.Sprintf("node_%s", id.String()), - PrivateKey: key, + PrivateKey: prvkey, + ID: enodId, + Name: fmt.Sprintf("node_%s", enodId.String()), Port: port, EnableMsgEvents: true, } @@ -254,3 +275,30 @@ func RegisterServices(services Services) { os.Exit(0) } } + +// adds the host part to the configuration's ENR, signs it +// creates and the corresponding enode object to the configuration +func (n *NodeConfig) initEnode(ip net.IP, tcpport int, udpport int) error { + enrIp := enr.IP(ip) + n.Record.Set(&enrIp) + enrTcpPort := enr.TCP(tcpport) + n.Record.Set(&enrTcpPort) + enrUdpPort := enr.UDP(udpport) + n.Record.Set(&enrUdpPort) + + err := enode.SignV4(&n.Record, n.PrivateKey) + if err != nil { + return fmt.Errorf("unable to generate ENR: %v", err) + } + nod, err := enode.New(enode.V4ID{}, &n.Record) + if err != nil { + return fmt.Errorf("unable to create enode: %v", err) + } + log.Trace("simnode new", "record", n.Record) + n.node = nod + return nil +} + +func (n *NodeConfig) initDummyEnode() error { + return n.initEnode(net.IPv4(127, 0, 0, 1), 0, 0) +} diff --git a/p2p/simulations/connect.go b/p2p/simulations/connect.go index bb7e7999a173..ede96b34c133 100644 --- a/p2p/simulations/connect.go +++ b/p2p/simulations/connect.go @@ -32,6 +32,9 @@ var ( // It is useful when constructing a chain network topology // when Network adds and removes nodes dynamically. func (net *Network) ConnectToLastNode(id enode.ID) (err error) { + net.lock.Lock() + defer net.lock.Unlock() + ids := net.getUpNodeIDs() l := len(ids) if l < 2 { @@ -41,29 +44,35 @@ func (net *Network) ConnectToLastNode(id enode.ID) (err error) { if last == id { last = ids[l-2] } - return net.connect(last, id) + return net.connectNotConnected(last, id) } // ConnectToRandomNode connects the node with provided NodeID // to a random node that is up. func (net *Network) ConnectToRandomNode(id enode.ID) (err error) { - selected := net.GetRandomUpNode(id) + net.lock.Lock() + defer net.lock.Unlock() + + selected := net.getRandomUpNode(id) if selected == nil { return ErrNodeNotFound } - return net.connect(selected.ID(), id) + return net.connectNotConnected(selected.ID(), id) } // ConnectNodesFull connects all nodes one to another. // It provides a complete connectivity in the network // which should be rarely needed. func (net *Network) ConnectNodesFull(ids []enode.ID) (err error) { + net.lock.Lock() + defer net.lock.Unlock() + if ids == nil { ids = net.getUpNodeIDs() } for i, lid := range ids { for _, rid := range ids[i+1:] { - if err = net.connect(lid, rid); err != nil { + if err = net.connectNotConnected(lid, rid); err != nil { return err } } @@ -74,12 +83,19 @@ func (net *Network) ConnectNodesFull(ids []enode.ID) (err error) { // ConnectNodesChain connects all nodes in a chain topology. // If ids argument is nil, all nodes that are up will be connected. func (net *Network) ConnectNodesChain(ids []enode.ID) (err error) { + net.lock.Lock() + defer net.lock.Unlock() + + return net.connectNodesChain(ids) +} + +func (net *Network) connectNodesChain(ids []enode.ID) (err error) { if ids == nil { ids = net.getUpNodeIDs() } l := len(ids) for i := 0; i < l-1; i++ { - if err := net.connect(ids[i], ids[i+1]); err != nil { + if err := net.connectNotConnected(ids[i], ids[i+1]); err != nil { return err } } @@ -89,6 +105,9 @@ func (net *Network) ConnectNodesChain(ids []enode.ID) (err error) { // ConnectNodesRing connects all nodes in a ring topology. // If ids argument is nil, all nodes that are up will be connected. func (net *Network) ConnectNodesRing(ids []enode.ID) (err error) { + net.lock.Lock() + defer net.lock.Unlock() + if ids == nil { ids = net.getUpNodeIDs() } @@ -96,15 +115,18 @@ func (net *Network) ConnectNodesRing(ids []enode.ID) (err error) { if l < 2 { return nil } - if err := net.ConnectNodesChain(ids); err != nil { + if err := net.connectNodesChain(ids); err != nil { return err } - return net.connect(ids[l-1], ids[0]) + return net.connectNotConnected(ids[l-1], ids[0]) } // ConnectNodesStar connects all nodes into a star topology // If ids argument is nil, all nodes that are up will be connected. func (net *Network) ConnectNodesStar(ids []enode.ID, center enode.ID) (err error) { + net.lock.Lock() + defer net.lock.Unlock() + if ids == nil { ids = net.getUpNodeIDs() } @@ -112,16 +134,15 @@ func (net *Network) ConnectNodesStar(ids []enode.ID, center enode.ID) (err error if center == id { continue } - if err := net.connect(center, id); err != nil { + if err := net.connectNotConnected(center, id); err != nil { return err } } return nil } -// connect connects two nodes but ignores already connected error. -func (net *Network) connect(oneID, otherID enode.ID) error { - return ignoreAlreadyConnectedErr(net.Connect(oneID, otherID)) +func (net *Network) connectNotConnected(oneID, otherID enode.ID) error { + return ignoreAlreadyConnectedErr(net.connect(oneID, otherID)) } func ignoreAlreadyConnectedErr(err error) error { diff --git a/p2p/simulations/events.go b/p2p/simulations/events.go index 9b2a990e07e6..d0d03794edf7 100644 --- a/p2p/simulations/events.go +++ b/p2p/simulations/events.go @@ -73,8 +73,7 @@ func NewEvent(v interface{}) *Event { switch v := v.(type) { case *Node: event.Type = EventTypeNode - node := *v - event.Node = &node + event.Node = v.copy() case *Conn: event.Type = EventTypeConn conn := *v @@ -100,7 +99,7 @@ func ControlEvent(v interface{}) *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) + 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: diff --git a/p2p/simulations/examples/ping-pong.go b/p2p/simulations/examples/ping-pong.go index 878cf9922c79..cde2f3a677e2 100644 --- a/p2p/simulations/examples/ping-pong.go +++ b/p2p/simulations/examples/ping-pong.go @@ -25,13 +25,13 @@ import ( "sync/atomic" "time" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/simulations" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" + "github.com/ethereum/go-ethereum/rpc" ) var adapterType = flag.String("adapter", "sim", `node adapter to use (one of "sim", "exec" or "docker")`) diff --git a/p2p/simulations/http.go b/p2p/simulations/http.go index b528831f4400..51d45ce8f475 100644 --- a/p2p/simulations/http.go +++ b/p2p/simulations/http.go @@ -29,13 +29,13 @@ import ( "strings" "sync" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" + "github.com/ethereum/go-ethereum/rpc" + "github.com/gorilla/websocket" "github.com/julienschmidt/httprouter" - "golang.org/x/net/websocket" ) // DefaultClient is the default simulation API client which expects the API @@ -384,12 +384,6 @@ func (s *Server) StreamNetworkEvents(w http.ResponseWriter, req *http.Request) { 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: @@ -455,6 +449,7 @@ func (s *Server) StreamNetworkEvents(w http.ResponseWriter, req *http.Request) { } } + clientGone := req.Context().Done() for { select { case event := <-events: @@ -654,16 +649,20 @@ func (s *Server) Options(w http.ResponseWriter, req *http.Request) { w.WriteHeader(http.StatusOK) } +var wsUpgrade = websocket.Upgrader{ + CheckOrigin: func(*http.Request) bool { return true }, +} + // 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) + conn, err := wsUpgrade.Upgrade(w, req, nil) + if err != nil { + return } - - websocket.Server{Handler: handler}.ServeHTTP(w, req) + defer conn.Close() + node := req.Context().Value("node").(*Node) + node.ServeRPC(conn) } // ServeHTTP implements the http.Handler interface by delegating to the @@ -706,7 +705,7 @@ func (s *Server) wrapHandler(handler http.HandlerFunc) httprouter.Handle { w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") - ctx := context.Background() + ctx := req.Context() if id := params.ByName("nodeid"); id != "" { var nodeID enode.ID diff --git a/p2p/simulations/http_test.go b/p2p/simulations/http_test.go index 138baf73fea2..e88999f48b8c 100644 --- a/p2p/simulations/http_test.go +++ b/p2p/simulations/http_test.go @@ -22,31 +22,30 @@ import ( "fmt" "math/rand" "net/http/httptest" + "os" "reflect" "sync" "sync/atomic" "testing" "time" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" + "github.com/ethereum/go-ethereum/rpc" "github.com/mattn/go-colorable" ) -var ( - loglevel = flag.Int("loglevel", 2, "verbosity of logs") -) +func TestMain(m *testing.M) { + loglevel := flag.Int("loglevel", 2, "verbosity of logs") -func init() { flag.Parse() - log.PrintOrigins(true) log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) + os.Exit(m.Run()) } // testService implements the node.Service interface and provides protocols @@ -421,15 +420,8 @@ type expectEvents struct { } func (t *expectEvents) nodeEvent(id string, up bool) *Event { - return &Event{ - Type: EventTypeNode, - Node: &Node{ - Config: &adapters.NodeConfig{ - ID: enode.HexID(id), - }, - Up: up, - }, - } + config := &adapters.NodeConfig{ID: enode.HexID(id)} + return &Event{Type: EventTypeNode, Node: newNode(nil, config, up)} } func (t *expectEvents) connEvent(one, other string, up bool) *Event { @@ -450,7 +442,7 @@ loop: for { select { case event := <-t.events: - t.Logf("received %s event: %s", event.Type, event) + t.Logf("received %s event: %v", event.Type, event) if event.Type != EventTypeMsg || event.Msg.Received { continue loop @@ -480,12 +472,13 @@ loop: } func (t *expectEvents) expect(events ...*Event) { + t.Helper() timeout := time.After(10 * time.Second) i := 0 for { select { case event := <-t.events: - t.Logf("received %s event: %s", event.Type, event) + t.Logf("received %s event: %v", event.Type, event) expected := events[i] if event.Type != expected.Type { @@ -501,8 +494,8 @@ func (t *expectEvents) expect(events ...*Event) { 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) + 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: diff --git a/p2p/simulations/mocker.go b/p2p/simulations/mocker.go index 6a5206d1a58e..8ce777a0103f 100644 --- a/p2p/simulations/mocker.go +++ b/p2p/simulations/mocker.go @@ -24,9 +24,9 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" ) //a map of mocker names to its function diff --git a/p2p/simulations/mocker_test.go b/p2p/simulations/mocker_test.go index d4a10cf01474..56d81942bbd0 100644 --- a/p2p/simulations/mocker_test.go +++ b/p2p/simulations/mocker_test.go @@ -27,7 +27,7 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enode" ) func TestMocker(t *testing.T) { @@ -80,36 +80,32 @@ func TestMocker(t *testing.T) { var opts SubscribeOpts sub, err := client.SubscribeNetwork(events, opts) defer sub.Unsubscribe() - //wait until all nodes are started and connected - //store every node up event in a map (value is irrelevant, mimic Set datatype) + + // wait until all nodes are started and connected + // store every node up event in a map (value is irrelevant, mimic Set datatype) nodemap := make(map[enode.ID]bool) - wg.Add(1) nodesComplete := false connCount := 0 + wg.Add(1) go func() { - for { + defer wg.Done() + + for connCount < (nodeCount-1)*2 { select { case event := <-events: - //if the event is a node Up event only - if event.Node != nil && event.Node.Up { + if isNodeUp(event) { //add the correspondent node ID to the map nodemap[event.Node.Config.ID] = true //this means all nodes got a nodeUp event, so we can continue the test if len(nodemap) == nodeCount { nodesComplete = true - //wait for 3s as the mocker will need time to connect the nodes - //time.Sleep( 3 *time.Second) } } else if event.Conn != nil && nodesComplete { connCount += 1 - if connCount == (nodeCount-1)*2 { - wg.Done() - return - } } case <-time.After(30 * time.Second): - wg.Done() - t.Fatalf("Timeout waiting for nodes being started up!") + t.Errorf("Timeout waiting for nodes being started up!") + return } } }() @@ -169,3 +165,7 @@ func TestMocker(t *testing.T) { t.Fatalf("Expected empty list of nodes, got: %d", len(nodesInfo)) } } + +func isNodeUp(event *Event) bool { + return event.Node != nil && event.Node.Up() +} diff --git a/p2p/simulations/network.go b/p2p/simulations/network.go index e5f72c992f9a..ef5451e77ec4 100644 --- a/p2p/simulations/network.go +++ b/p2p/simulations/network.go @@ -22,15 +22,16 @@ import ( "encoding/json" "errors" "fmt" + "io" "math/rand" "sync" "time" - "github.com/nebulaai/nbai-node/event" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" ) var DialBanTimeout = 200 * time.Millisecond @@ -55,6 +56,9 @@ type Network struct { Nodes []*Node `json:"nodes"` nodeMap map[enode.ID]int + // Maps a node property string to node indexes of all nodes that hold this property + propertyMap map[string][]int + Conns []*Conn `json:"conns"` connMap map[string]int @@ -70,6 +74,7 @@ func NewNetwork(nodeAdapter adapters.NodeAdapter, conf *NetworkConfig) *Network NetworkConfig: *conf, nodeAdapter: nodeAdapter, nodeMap: make(map[enode.ID]int), + propertyMap: make(map[string][]int), connMap: make(map[string]int), quitc: make(chan struct{}), } @@ -114,14 +119,18 @@ func (net *Network) NewNodeWithConfig(conf *adapters.NodeConfig) (*Node, error) if err != nil { return nil, err } - node := &Node{ - Node: adapterNode, - Config: conf, - } + node := newNode(adapterNode, conf, false) log.Trace("Node created", "id", conf.ID) - net.nodeMap[conf.ID] = len(net.Nodes) + + nodeIndex := len(net.Nodes) + net.nodeMap[conf.ID] = nodeIndex net.Nodes = append(net.Nodes, node) + // Register any node properties with the network-level propertyMap + for _, property := range conf.Properties { + net.propertyMap[property] = append(net.propertyMap[property], nodeIndex) + } + // emit a "control" event net.events.Send(ControlEvent(node)) @@ -136,7 +145,7 @@ func (net *Network) Config() *NetworkConfig { // StartAll starts all nodes in the network func (net *Network) StartAll() error { for _, node := range net.Nodes { - if node.Up { + if node.Up() { continue } if err := net.Start(node.ID()); err != nil { @@ -149,7 +158,7 @@ func (net *Network) StartAll() error { // StopAll stops all nodes in the network func (net *Network) StopAll() error { for _, node := range net.Nodes { - if !node.Up { + if !node.Up() { continue } if err := net.Stop(node.ID()); err != nil { @@ -174,7 +183,7 @@ func (net *Network) startWithSnapshots(id enode.ID, snapshots map[string][]byte) if node == nil { return fmt.Errorf("node %v does not exist", id) } - if node.Up { + if node.Up() { return fmt.Errorf("node %v already up", id) } log.Trace("Starting node", "id", id, "adapter", net.nodeAdapter.Name()) @@ -182,10 +191,10 @@ func (net *Network) startWithSnapshots(id enode.ID, snapshots map[string][]byte) log.Warn("Node startup failed", "id", id, "err", err) return err } - node.Up = true + node.SetUp(true) log.Info("Started node", "id", id) - - net.events.Send(NewEvent(node)) + ev := NewEvent(node) + net.events.Send(ev) // subscribe to peer events client, err := node.Client() @@ -210,12 +219,14 @@ func (net *Network) watchPeerEvents(id enode.ID, events chan *p2p.PeerEvent, sub // assume the node is now down net.lock.Lock() defer net.lock.Unlock() + node := net.getNode(id) if node == nil { return } - node.Up = false - net.events.Send(NewEvent(node)) + node.SetUp(false) + ev := NewEvent(node) + net.events.Send(ev) }() for { select { @@ -251,34 +262,57 @@ func (net *Network) watchPeerEvents(id enode.ID, events chan *p2p.PeerEvent, sub // Stop stops the node with the given ID func (net *Network) Stop(id enode.ID) error { - net.lock.Lock() - node := net.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) + // IMPORTANT: node.Stop() must NOT be called under net.lock as + // node.Reachable() closure has a reference to the network and + // calls net.InitConn() what also locks the network. => DEADLOCK + // That holds until the following ticket is not resolved: + + var err error + + node, err := func() (*Node, error) { + net.lock.Lock() + defer net.lock.Unlock() + + node := net.getNode(id) + if node == nil { + return nil, fmt.Errorf("node %v does not exist", id) + } + if !node.Up() { + return nil, fmt.Errorf("node %v already down", id) + } + node.SetUp(false) + return node, nil + }() + if err != nil { + return err } - node.Up = false - net.lock.Unlock() - err := node.Stop() + err = node.Stop() // must be called without net.lock + + net.lock.Lock() + defer net.lock.Unlock() + if err != nil { - net.lock.Lock() - node.Up = true - net.lock.Unlock() + node.SetUp(true) return err } log.Info("Stopped node", "id", id, "err", err) - net.events.Send(ControlEvent(node)) + ev := ControlEvent(node) + net.events.Send(ev) 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 (net *Network) Connect(oneID, otherID enode.ID) error { + net.lock.Lock() + defer net.lock.Unlock() + return net.connect(oneID, otherID) +} + +func (net *Network) connect(oneID, otherID enode.ID) error { log.Debug("Connecting nodes with addPeer", "id", oneID, "other", otherID) - conn, err := net.InitConn(oneID, otherID) + conn, err := net.initConn(oneID, otherID) if err != nil { return err } @@ -376,7 +410,15 @@ func (net *Network) GetNode(id enode.ID) *Node { return net.getNode(id) } -// GetNode gets the node with the given name, returning nil if the node does +func (net *Network) getNode(id enode.ID) *Node { + i, found := net.nodeMap[id] + if !found { + return nil + } + return net.Nodes[i] +} + +// GetNodeByName gets the node with the given name, returning nil if the node does // not exist func (net *Network) GetNodeByName(name string) *Node { net.lock.RLock() @@ -393,33 +435,119 @@ func (net *Network) getNodeByName(name string) *Node { return nil } -// GetNodes returns the existing nodes -func (net *Network) GetNodes() (nodes []*Node) { +// GetNodeIDs returns the IDs of all existing nodes +// Nodes can optionally be excluded by specifying their enode.ID. +func (net *Network) GetNodeIDs(excludeIDs ...enode.ID) []enode.ID { + net.lock.RLock() + defer net.lock.RUnlock() + + return net.getNodeIDs(excludeIDs) +} + +func (net *Network) getNodeIDs(excludeIDs []enode.ID) []enode.ID { + // Get all current nodeIDs + nodeIDs := make([]enode.ID, 0, len(net.nodeMap)) + for id := range net.nodeMap { + nodeIDs = append(nodeIDs, id) + } + + if len(excludeIDs) > 0 { + // Return the difference of nodeIDs and excludeIDs + return filterIDs(nodeIDs, excludeIDs) + } else { + return nodeIDs + } +} + +// GetNodes returns the existing nodes. +// Nodes can optionally be excluded by specifying their enode.ID. +func (net *Network) GetNodes(excludeIDs ...enode.ID) []*Node { + net.lock.RLock() + defer net.lock.RUnlock() + + return net.getNodes(excludeIDs) +} + +func (net *Network) getNodes(excludeIDs []enode.ID) []*Node { + if len(excludeIDs) > 0 { + nodeIDs := net.getNodeIDs(excludeIDs) + return net.getNodesByID(nodeIDs) + } else { + return net.Nodes + } +} + +// GetNodesByID returns existing nodes with the given enode.IDs. +// If a node doesn't exist with a given enode.ID, it is ignored. +func (net *Network) GetNodesByID(nodeIDs []enode.ID) []*Node { net.lock.RLock() defer net.lock.RUnlock() - nodes = append(nodes, net.Nodes...) + return net.getNodesByID(nodeIDs) +} + +func (net *Network) getNodesByID(nodeIDs []enode.ID) []*Node { + nodes := make([]*Node, 0, len(nodeIDs)) + for _, id := range nodeIDs { + node := net.getNode(id) + if node != nil { + nodes = append(nodes, node) + } + } + return nodes } -func (net *Network) getNode(id enode.ID) *Node { - i, found := net.nodeMap[id] - if !found { - return nil +// GetNodesByProperty returns existing nodes that have the given property string registered in their NodeConfig +func (net *Network) GetNodesByProperty(property string) []*Node { + net.lock.RLock() + defer net.lock.RUnlock() + + return net.getNodesByProperty(property) +} + +func (net *Network) getNodesByProperty(property string) []*Node { + nodes := make([]*Node, 0, len(net.propertyMap[property])) + for _, nodeIndex := range net.propertyMap[property] { + nodes = append(nodes, net.Nodes[nodeIndex]) } - return net.Nodes[i] + + return nodes +} + +// GetNodeIDsByProperty returns existing node's enode IDs that have the given property string registered in the NodeConfig +func (net *Network) GetNodeIDsByProperty(property string) []enode.ID { + net.lock.RLock() + defer net.lock.RUnlock() + + return net.getNodeIDsByProperty(property) +} + +func (net *Network) getNodeIDsByProperty(property string) []enode.ID { + nodeIDs := make([]enode.ID, 0, len(net.propertyMap[property])) + for _, nodeIndex := range net.propertyMap[property] { + node := net.Nodes[nodeIndex] + nodeIDs = append(nodeIDs, node.ID()) + } + + return nodeIDs } // GetRandomUpNode returns a random node on the network, which is running. func (net *Network) GetRandomUpNode(excludeIDs ...enode.ID) *Node { net.lock.RLock() defer net.lock.RUnlock() + return net.getRandomUpNode(excludeIDs...) +} + +// GetRandomUpNode returns a random node on the network, which is running. +func (net *Network) getRandomUpNode(excludeIDs ...enode.ID) *Node { return net.getRandomNode(net.getUpNodeIDs(), excludeIDs) } func (net *Network) getUpNodeIDs() (ids []enode.ID) { for _, node := range net.Nodes { - if node.Up { + if node.Up() { ids = append(ids, node.ID()) } } @@ -434,14 +562,21 @@ func (net *Network) GetRandomDownNode(excludeIDs ...enode.ID) *Node { } func (net *Network) getDownNodeIDs() (ids []enode.ID) { - for _, node := range net.GetNodes() { - if !node.Up { + for _, node := range net.Nodes { + if !node.Up() { ids = append(ids, node.ID()) } } return ids } +// GetRandomNode returns a random node on the network, regardless of whether it is running or not +func (net *Network) GetRandomNode(excludeIDs ...enode.ID) *Node { + net.lock.RLock() + defer net.lock.RUnlock() + return net.getRandomNode(net.getNodeIDs(nil), excludeIDs) // no need to exclude twice +} + func (net *Network) getRandomNode(ids []enode.ID, excludeIDs []enode.ID) *Node { filtered := filterIDs(ids, excludeIDs) @@ -449,7 +584,7 @@ func (net *Network) getRandomNode(ids []enode.ID, excludeIDs []enode.ID) *Node { if l == 0 { return nil } - return net.GetNode(filtered[rand.Intn(l)]) + return net.getNode(filtered[rand.Intn(l)]) } func filterIDs(ids []enode.ID, excludeIDs []enode.ID) []enode.ID { @@ -527,6 +662,10 @@ func (net *Network) getConn(oneID, otherID enode.ID) *Conn { func (net *Network) InitConn(oneID, otherID enode.ID) (*Conn, error) { net.lock.Lock() defer net.lock.Unlock() + return net.initConn(oneID, otherID) +} + +func (net *Network) initConn(oneID, otherID enode.ID) (*Conn, error) { if oneID == otherID { return nil, fmt.Errorf("refusing to connect to self %v", oneID) } @@ -558,6 +697,12 @@ func (net *Network) Shutdown() { if err := node.Stop(); err != nil { log.Warn("Can't stop node", "id", node.ID(), "err", err) } + // If the node has the close method, call it. + if closer, ok := node.Node.(io.Closer); ok { + if err := closer.Close(); err != nil { + log.Warn("Can't close node", "id", node.ID(), "err", err) + } + } } close(net.quitc) } @@ -571,6 +716,7 @@ func (net *Network) Reset() { //re-initialize the maps net.connMap = make(map[string]int) net.nodeMap = make(map[enode.ID]int) + net.propertyMap = make(map[string][]int) net.Nodes = nil net.Conns = nil @@ -584,8 +730,32 @@ type Node struct { // 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"` + // up tracks whether or not the node is running + up bool + upMu *sync.RWMutex +} + +func newNode(an adapters.Node, ac *adapters.NodeConfig, up bool) *Node { + return &Node{Node: an, Config: ac, up: up, upMu: new(sync.RWMutex)} +} + +func (n *Node) copy() *Node { + configCpy := *n.Config + return newNode(n.Node, &configCpy, n.Up()) +} + +// Up returns whether the node is currently up (online) +func (n *Node) Up() bool { + n.upMu.RLock() + defer n.upMu.RUnlock() + return n.up +} + +// SetUp sets the up (online) status of the nodes with the given value +func (n *Node) SetUp(up bool) { + n.upMu.Lock() + defer n.upMu.Unlock() + n.up = up } // ID returns the ID of the node @@ -619,10 +789,26 @@ func (n *Node) MarshalJSON() ([]byte, error) { }{ Info: n.NodeInfo(), Config: n.Config, - Up: n.Up, + Up: n.Up(), }) } +// UnmarshalJSON implements json.Unmarshaler interface so that we don't lose Node.up +// status. IMPORTANT: The implementation is incomplete; we lose p2p.NodeInfo. +func (n *Node) UnmarshalJSON(raw []byte) error { + // TODO: How should we turn back NodeInfo into n.Node? + // Ticket: https://github.com/ethersphere/go-ethereum/issues/1177 + var node struct { + Config *adapters.NodeConfig `json:"config,omitempty"` + Up bool `json:"up"` + } + if err := json.Unmarshal(raw, &node); err != nil { + return err + } + *n = *newNode(nil, node.Config, node.Up) + return nil +} + // Conn represents a connection between two nodes in the network type Conn struct { // One is the node which initiated the connection @@ -642,10 +828,10 @@ type Conn struct { // nodesUp returns whether both nodes are currently up func (c *Conn) nodesUp() error { - if !c.one.Up { + if !c.one.Up() { return fmt.Errorf("one %v is not up", c.One) } - if !c.other.Up { + if !c.other.Up() { return fmt.Errorf("other %v is not up", c.Other) } return nil @@ -716,8 +902,8 @@ func (net *Network) snapshot(addServices []string, removeServices []string) (*Sn Nodes: make([]NodeSnapshot, len(net.Nodes)), } for i, node := range net.Nodes { - snap.Nodes[i] = NodeSnapshot{Node: *node} - if !node.Up { + snap.Nodes[i] = NodeSnapshot{Node: *node.copy()} + if !node.Up() { continue } snapshots, err := node.Snapshots() @@ -763,7 +949,8 @@ func (net *Network) snapshot(addServices []string, removeServices []string) (*Sn return snap, nil } -var snapshotLoadTimeout = 120 * time.Second +// longrunning tests may need a longer timeout +var snapshotLoadTimeout = 900 * time.Second // Load loads a network snapshot func (net *Network) Load(snap *Snapshot) error { @@ -772,7 +959,7 @@ func (net *Network) Load(snap *Snapshot) error { if _, err := net.NewNodeWithConfig(n.Node.Config); err != nil { return err } - if !n.Node.Up { + if !n.Node.Up() { continue } if err := net.startWithSnapshots(n.Node.Config.ID, n.Snapshots); err != nil { @@ -844,7 +1031,7 @@ func (net *Network) Load(snap *Snapshot) error { // Start connecting. for _, conn := range snap.Conns { - if !net.GetNode(conn.One).Up || !net.GetNode(conn.Other).Up { + if !net.GetNode(conn.One).Up() || !net.GetNode(conn.Other).Up() { //in this case, at least one of the nodes of a connection is not up, //so it would result in the snapshot `Load` to fail continue @@ -898,7 +1085,7 @@ func (net *Network) executeControlEvent(event *Event) { } func (net *Network) executeNodeEvent(e *Event) error { - if !e.Node.Up { + if !e.Node.Up() { return net.Stop(e.Node.ID()) } diff --git a/p2p/simulations/network_test.go b/p2p/simulations/network_test.go index 135cac561e4e..ac1b06a80ca5 100644 --- a/p2p/simulations/network_test.go +++ b/p2p/simulations/network_test.go @@ -17,18 +17,20 @@ package simulations import ( + "bytes" "context" "encoding/json" "fmt" + "reflect" "strconv" "strings" "testing" "time" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" ) // Tests that a created snapshot with a minimal service only contains the expected connections @@ -79,11 +81,13 @@ func TestSnapshot(t *testing.T) { // connect nodes in a ring // spawn separate thread to avoid deadlock in the event listeners + connectErr := make(chan error, 1) go func() { for i, id := range ids { peerID := ids[(i+1)%len(ids)] if err := network.Connect(id, peerID); err != nil { - t.Fatal(err) + connectErr <- err + return } } }() @@ -98,9 +102,10 @@ OUTER: select { case <-ctx.Done(): t.Fatal(ctx.Err()) + case err := <-connectErr: + t.Fatal(err) case ev := <-evC: if ev.Type == EventTypeConn && !ev.Control { - // fail on any disconnect if !ev.Conn.Up { t.Fatalf("unexpected disconnect: %v -> %v", ev.Conn.One, ev.Conn.Other) @@ -192,7 +197,7 @@ OUTER: connEventCount = nodeCount -OUTER_TWO: +OuterTwo: for { select { case <-ctx.Done(): @@ -210,7 +215,7 @@ OUTER_TWO: connEventCount-- log.Debug("ev", "count", connEventCount) if connEventCount == 0 { - break OUTER_TWO + break OuterTwo } } } @@ -392,6 +397,275 @@ func TestNetworkSimulation(t *testing.T) { } } +func createTestNodes(count int, network *Network) (nodes []*Node, err error) { + for i := 0; i < count; i++ { + nodeConf := adapters.RandomNodeConfig() + node, err := network.NewNodeWithConfig(nodeConf) + if err != nil { + return nil, err + } + if err := network.Start(node.ID()); err != nil { + return nil, err + } + + nodes = append(nodes, node) + } + + return nodes, nil +} + +func createTestNodesWithProperty(property string, count int, network *Network) (propertyNodes []*Node, err error) { + for i := 0; i < count; i++ { + nodeConf := adapters.RandomNodeConfig() + nodeConf.Properties = append(nodeConf.Properties, property) + + node, err := network.NewNodeWithConfig(nodeConf) + if err != nil { + return nil, err + } + if err := network.Start(node.ID()); err != nil { + return nil, err + } + + propertyNodes = append(propertyNodes, node) + } + + return propertyNodes, nil +} + +// TestGetNodeIDs creates a set of nodes and attempts to retrieve their IDs,. +// It then tests again whilst excluding a node ID from being returned. +// If a node ID is not returned, or more node IDs than expected are returned, the test fails. +func TestGetNodeIDs(t *testing.T) { + adapter := adapters.NewSimAdapter(adapters.Services{ + "test": newTestService, + }) + network := NewNetwork(adapter, &NetworkConfig{ + DefaultService: "test", + }) + defer network.Shutdown() + + numNodes := 5 + nodes, err := createTestNodes(numNodes, network) + if err != nil { + t.Fatalf("Could not creat test nodes %v", err) + } + + gotNodeIDs := network.GetNodeIDs() + if len(gotNodeIDs) != numNodes { + t.Fatalf("Expected %d nodes, got %d", numNodes, len(gotNodeIDs)) + } + + for _, node1 := range nodes { + match := false + for _, node2ID := range gotNodeIDs { + if bytes.Equal(node1.ID().Bytes(), node2ID.Bytes()) { + match = true + break + } + } + + if !match { + t.Fatalf("A created node was not returned by GetNodes(), ID: %s", node1.ID().String()) + } + } + + excludeNodeID := nodes[3].ID() + gotNodeIDsExcl := network.GetNodeIDs(excludeNodeID) + if len(gotNodeIDsExcl) != numNodes-1 { + t.Fatalf("Expected one less node ID to be returned") + } + for _, nodeID := range gotNodeIDsExcl { + if bytes.Equal(excludeNodeID.Bytes(), nodeID.Bytes()) { + t.Fatalf("GetNodeIDs returned the node ID we excluded, ID: %s", nodeID.String()) + } + } +} + +// TestGetNodes creates a set of nodes and attempts to retrieve them again. +// It then tests again whilst excluding a node from being returned. +// If a node is not returned, or more nodes than expected are returned, the test fails. +func TestGetNodes(t *testing.T) { + adapter := adapters.NewSimAdapter(adapters.Services{ + "test": newTestService, + }) + network := NewNetwork(adapter, &NetworkConfig{ + DefaultService: "test", + }) + defer network.Shutdown() + + numNodes := 5 + nodes, err := createTestNodes(numNodes, network) + if err != nil { + t.Fatalf("Could not creat test nodes %v", err) + } + + gotNodes := network.GetNodes() + if len(gotNodes) != numNodes { + t.Fatalf("Expected %d nodes, got %d", numNodes, len(gotNodes)) + } + + for _, node1 := range nodes { + match := false + for _, node2 := range gotNodes { + if bytes.Equal(node1.ID().Bytes(), node2.ID().Bytes()) { + match = true + break + } + } + + if !match { + t.Fatalf("A created node was not returned by GetNodes(), ID: %s", node1.ID().String()) + } + } + + excludeNodeID := nodes[3].ID() + gotNodesExcl := network.GetNodes(excludeNodeID) + if len(gotNodesExcl) != numNodes-1 { + t.Fatalf("Expected one less node to be returned") + } + for _, node := range gotNodesExcl { + if bytes.Equal(excludeNodeID.Bytes(), node.ID().Bytes()) { + t.Fatalf("GetNodes returned the node we excluded, ID: %s", node.ID().String()) + } + } +} + +// TestGetNodesByID creates a set of nodes and attempts to retrieve a subset of them by ID +// If a node is not returned, or more nodes than expected are returned, the test fails. +func TestGetNodesByID(t *testing.T) { + adapter := adapters.NewSimAdapter(adapters.Services{ + "test": newTestService, + }) + network := NewNetwork(adapter, &NetworkConfig{ + DefaultService: "test", + }) + defer network.Shutdown() + + numNodes := 5 + nodes, err := createTestNodes(numNodes, network) + if err != nil { + t.Fatalf("Could not create test nodes: %v", err) + } + + numSubsetNodes := 2 + subsetNodes := nodes[0:numSubsetNodes] + var subsetNodeIDs []enode.ID + for _, node := range subsetNodes { + subsetNodeIDs = append(subsetNodeIDs, node.ID()) + } + + gotNodesByID := network.GetNodesByID(subsetNodeIDs) + if len(gotNodesByID) != numSubsetNodes { + t.Fatalf("Expected %d nodes, got %d", numSubsetNodes, len(gotNodesByID)) + } + + for _, node1 := range subsetNodes { + match := false + for _, node2 := range gotNodesByID { + if bytes.Equal(node1.ID().Bytes(), node2.ID().Bytes()) { + match = true + break + } + } + + if !match { + t.Fatalf("A created node was not returned by GetNodesByID(), ID: %s", node1.ID().String()) + } + } +} + +// TestGetNodesByProperty creates a subset of nodes with a property assigned. +// GetNodesByProperty is then checked for correctness by comparing the nodes returned to those initially created. +// If a node with a property is not found, or more nodes than expected are returned, the test fails. +func TestGetNodesByProperty(t *testing.T) { + adapter := adapters.NewSimAdapter(adapters.Services{ + "test": newTestService, + }) + network := NewNetwork(adapter, &NetworkConfig{ + DefaultService: "test", + }) + defer network.Shutdown() + + numNodes := 3 + _, err := createTestNodes(numNodes, network) + if err != nil { + t.Fatalf("Failed to create nodes: %v", err) + } + + numPropertyNodes := 3 + propertyTest := "test" + propertyNodes, err := createTestNodesWithProperty(propertyTest, numPropertyNodes, network) + if err != nil { + t.Fatalf("Failed to create nodes with property: %v", err) + } + + gotNodesByProperty := network.GetNodesByProperty(propertyTest) + if len(gotNodesByProperty) != numPropertyNodes { + t.Fatalf("Expected %d nodes with a property, got %d", numPropertyNodes, len(gotNodesByProperty)) + } + + for _, node1 := range propertyNodes { + match := false + for _, node2 := range gotNodesByProperty { + if bytes.Equal(node1.ID().Bytes(), node2.ID().Bytes()) { + match = true + break + } + } + + if !match { + t.Fatalf("A created node with property was not returned by GetNodesByProperty(), ID: %s", node1.ID().String()) + } + } +} + +// TestGetNodeIDsByProperty creates a subset of nodes with a property assigned. +// GetNodeIDsByProperty is then checked for correctness by comparing the node IDs returned to those initially created. +// If a node ID with a property is not found, or more nodes IDs than expected are returned, the test fails. +func TestGetNodeIDsByProperty(t *testing.T) { + adapter := adapters.NewSimAdapter(adapters.Services{ + "test": newTestService, + }) + network := NewNetwork(adapter, &NetworkConfig{ + DefaultService: "test", + }) + defer network.Shutdown() + + numNodes := 3 + _, err := createTestNodes(numNodes, network) + if err != nil { + t.Fatalf("Failed to create nodes: %v", err) + } + + numPropertyNodes := 3 + propertyTest := "test" + propertyNodes, err := createTestNodesWithProperty(propertyTest, numPropertyNodes, network) + if err != nil { + t.Fatalf("Failed to created nodes with property: %v", err) + } + + gotNodeIDsByProperty := network.GetNodeIDsByProperty(propertyTest) + if len(gotNodeIDsByProperty) != numPropertyNodes { + t.Fatalf("Expected %d nodes with a property, got %d", numPropertyNodes, len(gotNodeIDsByProperty)) + } + + for _, node1 := range propertyNodes { + match := false + id1 := node1.ID() + for _, id2 := range gotNodeIDsByProperty { + if bytes.Equal(id1.Bytes(), id2.Bytes()) { + match = true + break + } + } + + if !match { + t.Fatalf("Not all nodes IDs were returned by GetNodeIDsByProperty(), ID: %s", id1.String()) + } + } +} + func triggerChecks(ctx context.Context, ids []enode.ID, trigger chan enode.ID, interval time.Duration) { tick := time.NewTicker(interval) defer tick.Stop() @@ -485,3 +759,117 @@ func benchmarkMinimalServiceTmp(b *testing.B) { } } } + +func TestNode_UnmarshalJSON(t *testing.T) { + t.Run("up_field", func(t *testing.T) { + runNodeUnmarshalJSON(t, casesNodeUnmarshalJSONUpField()) + }) + t.Run("config_field", func(t *testing.T) { + runNodeUnmarshalJSON(t, casesNodeUnmarshalJSONConfigField()) + }) +} + +func runNodeUnmarshalJSON(t *testing.T, tests []nodeUnmarshalTestCase) { + t.Helper() + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var got *Node + if err := json.Unmarshal([]byte(tt.marshaled), &got); err != nil { + expectErrorMessageToContain(t, err, tt.wantErr) + got = nil + } + expectNodeEquality(t, got, tt.want) + }) + } +} + +type nodeUnmarshalTestCase struct { + name string + marshaled string + want *Node + wantErr string +} + +func expectErrorMessageToContain(t *testing.T, got error, want string) { + t.Helper() + if got == nil && want == "" { + return + } + + if got == nil && want != "" { + t.Errorf("error was expected, got: nil, want: %v", want) + return + } + + if !strings.Contains(got.Error(), want) { + t.Errorf( + "unexpected error message, got %v, want: %v", + want, + got, + ) + } +} + +func expectNodeEquality(t *testing.T, got, want *Node) { + t.Helper() + if !reflect.DeepEqual(got, want) { + t.Errorf("Node.UnmarshalJSON() = %v, want %v", got, want) + } +} + +func casesNodeUnmarshalJSONUpField() []nodeUnmarshalTestCase { + return []nodeUnmarshalTestCase{ + { + name: "empty json", + marshaled: "{}", + want: newNode(nil, nil, false), + }, + { + name: "a stopped node", + marshaled: "{\"up\": false}", + want: newNode(nil, nil, false), + }, + { + name: "a running node", + marshaled: "{\"up\": true}", + want: newNode(nil, nil, true), + }, + { + name: "invalid JSON value on valid key", + marshaled: "{\"up\": foo}", + wantErr: "invalid character", + }, + { + name: "invalid JSON key and value", + marshaled: "{foo: bar}", + wantErr: "invalid character", + }, + { + name: "bool value expected but got something else (string)", + marshaled: "{\"up\": \"true\"}", + wantErr: "cannot unmarshal string into Go struct", + }, + } +} + +func casesNodeUnmarshalJSONConfigField() []nodeUnmarshalTestCase { + // Don't do a big fuss around testing, as adapters.NodeConfig should + // handle it's own serialization. Just do a sanity check. + return []nodeUnmarshalTestCase{ + { + name: "Config field is omitted", + marshaled: "{}", + want: newNode(nil, nil, false), + }, + { + name: "Config field is nil", + marshaled: "{\"config\": null}", + want: newNode(nil, nil, false), + }, + { + name: "a non default Config field", + marshaled: "{\"config\":{\"name\":\"node_ecdd0\",\"port\":44665}}", + want: newNode(nil, &adapters.NodeConfig{Name: "node_ecdd0", Port: 44665}, false), + }, + } +} diff --git a/p2p/simulations/pipes/pipes.go b/p2p/simulations/pipes/pipes.go index 8532c1bcf0e9..ec277c0d147c 100644 --- a/p2p/simulations/pipes/pipes.go +++ b/p2p/simulations/pipes/pipes.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2018 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 diff --git a/p2p/simulations/simulation.go b/p2p/simulations/simulation.go index 5b0085ad09d9..ae62c42b9c2d 100644 --- a/p2p/simulations/simulation.go +++ b/p2p/simulations/simulation.go @@ -20,7 +20,7 @@ import ( "context" "time" - "github.com/nebulaai/nbai-node/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/enode" ) // Simulation provides a framework for running actions in a simulated network diff --git a/p2p/simulations/test.go b/p2p/simulations/test.go index beeb414e41b3..687be6d0b8e3 100644 --- a/p2p/simulations/test.go +++ b/p2p/simulations/test.go @@ -1,3 +1,19 @@ +// Copyright 2018 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 ( diff --git a/p2p/testing/peerpool.go b/p2p/testing/peerpool.go index e18be6d63fce..91b9704c79f4 100644 --- a/p2p/testing/peerpool.go +++ b/p2p/testing/peerpool.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2018 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 @@ -20,13 +20,13 @@ import ( "fmt" "sync" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/enode" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/enode" ) type TestPeer interface { ID() enode.ID - Drop(error) + Drop() } // TestPeerPool is an example peerPool to demonstrate registration of peer connections diff --git a/p2p/testing/protocolsession.go b/p2p/testing/protocolsession.go index c19b10dba295..e3a3915a81e1 100644 --- a/p2p/testing/protocolsession.go +++ b/p2p/testing/protocolsession.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2018 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 @@ -22,10 +22,10 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" ) var errTimedOut = errors.New("timed out") diff --git a/p2p/testing/protocoltester.go b/p2p/testing/protocoltester.go index d07c6fa4d6dd..b80abcc264f5 100644 --- a/p2p/testing/protocoltester.go +++ b/p2p/testing/protocoltester.go @@ -1,4 +1,4 @@ -// Copyright 2017 The go-ethereum Authors +// Copyright 2018 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 @@ -25,21 +25,21 @@ package testing import ( "bytes" + "crypto/ecdsa" "fmt" "io" "io/ioutil" "strings" "sync" - "testing" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/p2p" + "github.com/ethereum/go-ethereum/p2p/enode" + "github.com/ethereum/go-ethereum/p2p/simulations" + "github.com/ethereum/go-ethereum/p2p/simulations/adapters" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/rpc" ) // ProtocolTester is the tester environment used for unit testing protocol @@ -52,7 +52,7 @@ type ProtocolTester struct { // NewProtocolTester constructs a new ProtocolTester // it takes as argument the pivot node id, the number of dummy peers and the // protocol run function called on a peer connection by the p2p server -func NewProtocolTester(t *testing.T, id enode.ID, n int, run func(*p2p.Peer, p2p.MsgReadWriter) error) *ProtocolTester { +func NewProtocolTester(prvkey *ecdsa.PrivateKey, nodeCount int, run func(*p2p.Peer, p2p.MsgReadWriter) error) *ProtocolTester { services := adapters.Services{ "test": func(ctx *adapters.ServiceContext) (node.Service, error) { return &testNode{run}, nil @@ -63,23 +63,30 @@ func NewProtocolTester(t *testing.T, id enode.ID, n int, run func(*p2p.Peer, p2p } adapter := adapters.NewSimAdapter(services) net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{}) - if _, err := net.NewNodeWithConfig(&adapters.NodeConfig{ - ID: id, + nodeConfig := &adapters.NodeConfig{ + PrivateKey: prvkey, EnableMsgEvents: true, Services: []string{"test"}, - }); err != nil { + } + if _, err := net.NewNodeWithConfig(nodeConfig); err != nil { panic(err.Error()) } - if err := net.Start(id); err != nil { + if err := net.Start(nodeConfig.ID); err != nil { panic(err.Error()) } - node := net.GetNode(id).Node.(*adapters.SimNode) - peers := make([]*adapters.NodeConfig, n) - nodes := make([]*enode.Node, n) - for i := 0; i < n; i++ { + node := net.GetNode(nodeConfig.ID).Node.(*adapters.SimNode) + peers := make([]*adapters.NodeConfig, nodeCount) + nodes := make([]*enode.Node, nodeCount) + for i := 0; i < nodeCount; i++ { peers[i] = adapters.RandomNodeConfig() peers[i].Services = []string{"mock"} + if _, err := net.NewNodeWithConfig(peers[i]); err != nil { + panic(fmt.Sprintf("error initializing peer %v: %v", peers[i].ID, err)) + } + if err := net.Start(peers[i].ID); err != nil { + panic(fmt.Sprintf("error starting peer %v: %v", peers[i].ID, err)) + } nodes[i] = peers[i].Node() } events := make(chan *p2p.PeerEvent, 1000) @@ -95,28 +102,21 @@ func NewProtocolTester(t *testing.T, id enode.ID, n int, run func(*p2p.Peer, p2p network: net, } - self.Connect(id, peers...) + self.Connect(nodeConfig.ID, peers...) return self } // Stop stops the p2p server -func (t *ProtocolTester) Stop() error { +func (t *ProtocolTester) Stop() { t.Server.Stop() - return nil + t.network.Shutdown() } // Connect brings up the remote peer node and connects it using the // p2p/simulations network connection with the in memory network adapter func (t *ProtocolTester) Connect(selfID enode.ID, peers ...*adapters.NodeConfig) { for _, peer := range peers { - log.Trace(fmt.Sprintf("start node %v", peer.ID)) - if _, err := t.network.NewNodeWithConfig(peer); err != nil { - panic(fmt.Sprintf("error starting peer %v: %v", peer.ID, err)) - } - if err := t.network.Start(peer.ID); err != nil { - panic(fmt.Sprintf("error starting peer %v: %v", peer.ID, err)) - } log.Trace(fmt.Sprintf("connect to %v", peer.ID)) if err := t.network.Connect(selfID, peer.ID); err != nil { panic(fmt.Sprintf("error connecting to peer %v: %v", peer.ID, err)) diff --git a/p2p/util.go b/p2p/util.go new file mode 100644 index 000000000000..018cc40e98a9 --- /dev/null +++ b/p2p/util.go @@ -0,0 +1,71 @@ +// Copyright 2019 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 p2p + +import ( + "container/heap" + "time" +) + +// expHeap tracks strings and their expiry time. +type expHeap []expItem + +// expItem is an entry in addrHistory. +type expItem struct { + item string + exp time.Time +} + +// nextExpiry returns the next expiry time. +func (h *expHeap) nextExpiry() time.Time { + return (*h)[0].exp +} + +// add adds an item and sets its expiry time. +func (h *expHeap) add(item string, exp time.Time) { + heap.Push(h, expItem{item, exp}) +} + +// contains checks whether an item is present. +func (h expHeap) contains(item string) bool { + for _, v := range h { + if v.item == item { + return true + } + } + return false +} + +// expire removes items with expiry time before 'now'. +func (h *expHeap) expire(now time.Time) { + for h.Len() > 0 && h.nextExpiry().Before(now) { + heap.Pop(h) + } +} + +// heap.Interface boilerplate +func (h expHeap) Len() int { return len(h) } +func (h expHeap) Less(i, j int) bool { return h[i].exp.Before(h[j].exp) } +func (h expHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] } +func (h *expHeap) Push(x interface{}) { *h = append(*h, x.(expItem)) } +func (h *expHeap) Pop() interface{} { + old := *h + n := len(old) + x := old[n-1] + *h = old[0 : n-1] + return x +} diff --git a/p2p/util_test.go b/p2p/util_test.go new file mode 100644 index 000000000000..c9f2648dc92f --- /dev/null +++ b/p2p/util_test.go @@ -0,0 +1,54 @@ +// Copyright 2019 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 p2p + +import ( + "testing" + "time" +) + +func TestExpHeap(t *testing.T) { + var h expHeap + + var ( + basetime = time.Unix(4000, 0) + exptimeA = basetime.Add(2 * time.Second) + exptimeB = basetime.Add(3 * time.Second) + exptimeC = basetime.Add(4 * time.Second) + ) + h.add("a", exptimeA) + h.add("b", exptimeB) + h.add("c", exptimeC) + + if !h.nextExpiry().Equal(exptimeA) { + t.Fatal("wrong nextExpiry") + } + if !h.contains("a") || !h.contains("b") || !h.contains("c") { + t.Fatal("heap doesn't contain all live items") + } + + h.expire(exptimeA.Add(1)) + if !h.nextExpiry().Equal(exptimeB) { + t.Fatal("wrong nextExpiry") + } + if h.contains("a") { + t.Fatal("heap contains a even though it has already expired") + } + if !h.contains("b") || !h.contains("c") { + t.Fatal("heap doesn't contain all live items") + } +} diff --git a/params/bootnodes.go b/params/bootnodes.go index 2b854646419d..daeb73532f52 100644 --- a/params/bootnodes.go +++ b/params/bootnodes.go @@ -40,6 +40,20 @@ var RinkebyBootnodes = []string{ "enode://b6b28890b006743680c52e64e0d16db57f28124885595fa03a562be1d2bf0f3a1da297d56b13da25fb992888fd556d4c1a27b1f39d531bde7de1921c90061cc6@159.89.28.211:30303", // AKASHA } +// GoerliBootnodes are the enode URLs of the P2P bootstrap nodes running on the +// Görli test network. +var GoerliBootnodes = []string{ + // Upstream bootnodes + "enode://011f758e6552d105183b1761c5e2dea0111bc20fd5f6422bc7f91e0fabbec9a6595caf6239b37feb773dddd3f87240d99d859431891e4a642cf2a0a9e6cbb98a@51.141.78.53:30303", + "enode://176b9417f511d05b6b2cf3e34b756cf0a7096b3094572a8f6ef4cdcb9d1f9d00683bf0f83347eebdf3b81c3521c2332086d9592802230bf528eaf606a1d9677b@13.93.54.137:30303", + "enode://46add44b9f13965f7b9875ac6b85f016f341012d84f975377573800a863526f4da19ae2c620ec73d11591fa9510e992ecc03ad0751f53cc02f7c7ed6d55c7291@94.237.54.114:30313", + "enode://c1f8b7c2ac4453271fa07d8e9ecf9a2e8285aa0bd0c07df0131f47153306b0736fd3db8924e7a9bf0bed6b1d8d4f87362a71b033dc7c64547728d953e43e59b2@52.64.155.147:30303", + "enode://f4a9c6ee28586009fb5a96c8af13a58ed6d8315a9eee4772212c1d4d9cebe5a8b8a78ea4434f318726317d04a3f531a1ef0420cf9752605a562cfe858c46e263@213.186.16.82:30303", + + // Ethereum Foundation bootnode + "enode://573b6607cd59f241e30e4c4943fd50e99e2b6f42f9bd5ca111659d309c06741247f4f1e93843ad3e8c8c18b6e2d94c161b7ef67479b3938780a97134b618b5ce@52.56.136.200:30303", +} + // DiscoveryV5Bootnodes are the enode URLs of the P2P bootstrap nodes for the // experimental RLPx v5 topic-discovery network. var DiscoveryV5Bootnodes = []string{ diff --git a/params/config.go b/params/config.go index fc670b60a616..89705bbe816f 100644 --- a/params/config.go +++ b/params/config.go @@ -17,10 +17,12 @@ package params import ( + "encoding/binary" "fmt" "math/big" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" ) // Genesis hashes to enforce below configs on. @@ -28,8 +30,27 @@ var ( MainnetGenesisHash = common.HexToHash("0x6bbc0c44f1b6fe4921f0a71c5581a8ff4c0991df4a54580f56e1e4166e0c3974") TestnetGenesisHash = common.HexToHash("0x41941023680923e0fe4d74a34bdac8141f2540e3ae90623718e47d66d1ca4a2d") RinkebyGenesisHash = common.HexToHash("0x6341fd3daf94b748c72ced5a5b26028f2474f5f00d824504e4fa37a75767e177") + GoerliGenesisHash = common.HexToHash("0xbf7e331f7f7c1dd2e05159666b3bf8bc7a8a3a9eb1d518969eab529dd9b88c1a") ) +// TrustedCheckpoints associates each known checkpoint with the genesis hash of +// the chain it belongs to. +var TrustedCheckpoints = map[common.Hash]*TrustedCheckpoint{ + MainnetGenesisHash: MainnetTrustedCheckpoint, + TestnetGenesisHash: TestnetTrustedCheckpoint, + RinkebyGenesisHash: RinkebyTrustedCheckpoint, + GoerliGenesisHash: GoerliTrustedCheckpoint, +} + +// CheckpointOracles associates each known checkpoint oracles with the genesis hash of +// the chain it belongs to. +var CheckpointOracles = map[common.Hash]*CheckpointOracleConfig{ + MainnetGenesisHash: MainnetCheckpointOracle, + TestnetGenesisHash: TestnetCheckpointOracle, + RinkebyGenesisHash: RinkebyCheckpointOracle, + GoerliGenesisHash: GoerliCheckpointOracle, +} + var ( // MainnetChainConfig is the chain parameters to run a node on the main network. MainnetChainConfig = &ChainConfig{ @@ -48,11 +69,23 @@ var ( // MainnetTrustedCheckpoint contains the light client trusted checkpoint for the main network. MainnetTrustedCheckpoint = &TrustedCheckpoint{ - Name: "mainnet", - SectionIndex: 208, - SectionHead: common.HexToHash("0x5e9f7696c397d9df8f3b1abda857753575c6f5cff894e1a3d9e1a2af1bd9d6ac"), - CHTRoot: common.HexToHash("0x954a63134f6897f015f026387c59c98c4dae7b336610ff5a143455aac9153e9d"), - BloomRoot: common.HexToHash("0x8006c5e44b14d90d7cc9cd5fa1cb48cf53697ee3bbbf4b76fdfa70b0242500a9"), + SectionIndex: 275, + SectionHead: common.HexToHash("0x03159234a3699e31d27e5d83a55cbcf8ceb1f2d90855c219c55d79089b61abd4"), + CHTRoot: common.HexToHash("0xd0c1f3828a4dcb2ee76625fdbea85afeabfb61c04adf07439d2fc1cf00469f76"), + BloomRoot: common.HexToHash("0xab8ea2be8aa24703208fee3fc0afdbb536301013f412a7282b2692d6d68f92c5"), + } + + // MainnetCheckpointOracle contains a set of configs for the main network oracle. + MainnetCheckpointOracle = &CheckpointOracleConfig{ + Address: common.HexToAddress("0x9a9070028361F7AAbeB3f2F2Dc07F82C4a98A02a"), + Signers: []common.Address{ + common.HexToAddress("0x1b2C260efc720BE89101890E4Db589b44E950527"), // Peter + common.HexToAddress("0x78d1aD571A1A09D60D9BBf25894b44e4C8859595"), // Martin + common.HexToAddress("0x286834935f4A8Cfb4FF4C77D5770C2775aE2b0E7"), // Zsolt + common.HexToAddress("0xb86e2B0Ab5A4B1373e40c51A7C712c70Ba2f9f8E"), // Gary + common.HexToAddress("0x0DF8fa387C602AE62559cC4aFa4972A7045d6707"), // Guillaume + }, + Threshold: 2, } // TestnetChainConfig contains the chain parameters to run a node on the Ropsten test network. @@ -72,11 +105,23 @@ var ( // TestnetTrustedCheckpoint contains the light client trusted checkpoint for the Ropsten test network. TestnetTrustedCheckpoint = &TrustedCheckpoint{ - Name: "testnet", - SectionIndex: 139, - SectionHead: common.HexToHash("0x9fad89a5e3b993c8339b9cf2cbbeb72cd08774ea6b71b105b3dd880420c618f4"), - CHTRoot: common.HexToHash("0xc815833881989c5d2035147e1a79a33d22cbc5313e104ff01e6ab405bd28b317"), - BloomRoot: common.HexToHash("0xd94ee9f3c480858f53ec5d059aebdbb2e8d904702f100875ee59ec5f366e841d"), + SectionIndex: 209, + SectionHead: common.HexToHash("0x8037eb6872b69397d434121424ed8d6ab74be32bf3cb3f12dc5d9657fc146860"), + CHTRoot: common.HexToHash("0xe64b7d6324e5cbdcbbc250adf4cf24a639a665aa83ccfd6a0b84a80faaaa0d41"), + BloomRoot: common.HexToHash("0x80fedbef680cd70d3dc4b50b14480fba82c74361a35e8dc7be9f11e03077c840"), + } + + // TestnetCheckpointOracle contains a set of configs for the Ropsten test network oracle. + TestnetCheckpointOracle = &CheckpointOracleConfig{ + Address: common.HexToAddress("0xEF79475013f154E6A65b54cB2742867791bf0B84"), + Signers: []common.Address{ + common.HexToAddress("0x32162F3581E88a5f62e8A61892B42C46E2c18f7b"), // Peter + common.HexToAddress("0x78d1aD571A1A09D60D9BBf25894b44e4C8859595"), // Martin + common.HexToAddress("0x286834935f4A8Cfb4FF4C77D5770C2775aE2b0E7"), // Zsolt + common.HexToAddress("0xb86e2B0Ab5A4B1373e40c51A7C712c70Ba2f9f8E"), // Gary + common.HexToAddress("0x0DF8fa387C602AE62559cC4aFa4972A7045d6707"), // Guillaume + }, + Threshold: 2, } // RinkebyChainConfig contains the chain parameters to run a node on the Rinkeby test network. @@ -91,6 +136,8 @@ var ( EIP158Block: big.NewInt(3), ByzantiumBlock: big.NewInt(1035301), ConstantinopleBlock: big.NewInt(3660663), + PetersburgBlock: big.NewInt(4321234), + IstanbulBlock: big.NewInt(5435345), Clique: &CliqueConfig{ Period: 15, Epoch: 30000, @@ -99,11 +146,62 @@ var ( // RinkebyTrustedCheckpoint contains the light client trusted checkpoint for the Rinkeby test network. RinkebyTrustedCheckpoint = &TrustedCheckpoint{ - Name: "rinkeby", - SectionIndex: 105, - SectionHead: common.HexToHash("0xec8147d43f936258aaf1b9b9ec91b0a853abf7109f436a23649be809ea43d507"), - CHTRoot: common.HexToHash("0xd92703b444846a3db928e87e450770e5d5cbe193131dc8f7c4cf18b4de925a75"), - BloomRoot: common.HexToHash("0xff45a6f807138a2cde0cea0c209d9ce5ad8e43ccaae5a7c41af801bb72a1ef96"), + SectionIndex: 168, + SectionHead: common.HexToHash("0x87301279595b16ac59360c839ef86b159e21fedbfcc8847d727ef446a14cf334"), + CHTRoot: common.HexToHash("0x00f522dd0705ff647cebdd36707d6779caaf77f5fe8f958aae85f36aa88e3f9c"), + BloomRoot: common.HexToHash("0xc908547a6b01c47c65a4581c68090e5602308d39e893f7c0ae3e16c52ce2abf2"), + } + + // RinkebyCheckpointOracle contains a set of configs for the Rinkeby test network oracle. + RinkebyCheckpointOracle = &CheckpointOracleConfig{ + Address: common.HexToAddress("0xebe8eFA441B9302A0d7eaECc277c09d20D684540"), + Signers: []common.Address{ + common.HexToAddress("0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3"), // Peter + common.HexToAddress("0x78d1aD571A1A09D60D9BBf25894b44e4C8859595"), // Martin + common.HexToAddress("0x286834935f4A8Cfb4FF4C77D5770C2775aE2b0E7"), // Zsolt + common.HexToAddress("0xb86e2B0Ab5A4B1373e40c51A7C712c70Ba2f9f8E"), // Gary + }, + Threshold: 2, + } + + // GoerliChainConfig contains the chain parameters to run a node on the Görli test network. + GoerliChainConfig = &ChainConfig{ + ChainID: big.NewInt(5), + HomesteadBlock: big.NewInt(0), + DAOForkBlock: nil, + DAOForkSupport: true, + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(1561651), + Clique: &CliqueConfig{ + Period: 15, + Epoch: 30000, + }, + } + + // GoerliTrustedCheckpoint contains the light client trusted checkpoint for the Görli test network. + GoerliTrustedCheckpoint = &TrustedCheckpoint{ + SectionIndex: 52, + SectionHead: common.HexToHash("0x64c3bbc896578cbf782e343db48e334177e87fb8b16106b75e1dcebf59ca59dc"), + CHTRoot: common.HexToHash("0x5d092e644f3815de40b8c4196698d3e34a9097cf3066a499c96e83e3927d8b8d"), + BloomRoot: common.HexToHash("0xb2ceb966b499dd9e6e5bf6adbf35440a0e15cbccc0f527f89a1c522a9f36250a"), + } + + // GoerliCheckpointOracle contains a set of configs for the Goerli test network oracle. + GoerliCheckpointOracle = &CheckpointOracleConfig{ + Address: common.HexToAddress("0x18CA0E045F0D772a851BC7e48357Bcaab0a0795D"), + Signers: []common.Address{ + common.HexToAddress("0x4769bcaD07e3b938B7f43EB7D278Bc7Cb9efFb38"), // Peter + common.HexToAddress("0x78d1aD571A1A09D60D9BBf25894b44e4C8859595"), // Martin + common.HexToAddress("0x286834935f4A8Cfb4FF4C77D5770C2775aE2b0E7"), // Zsolt + common.HexToAddress("0xb86e2B0Ab5A4B1373e40c51A7C712c70Ba2f9f8E"), // Gary + common.HexToAddress("0x0DF8fa387C602AE62559cC4aFa4972A7045d6707"), // Guillaume + }, + Threshold: 2, } // AllEthashProtocolChanges contains every protocol change (EIPs) introduced @@ -111,16 +209,16 @@ var ( // // This configuration is intentionally not using keyed fields to force anyone // adding flags to the config to also have to set these fields. - AllEthashProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, new(EthashConfig), nil} + AllEthashProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, new(EthashConfig), nil} // AllCliqueProtocolChanges contains every protocol change (EIPs) introduced // and accepted by the Ethereum core developers into the Clique consensus. // // This configuration is intentionally not using keyed fields to force anyone // adding flags to the config to also have to set these fields. - AllCliqueProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, &CliqueConfig{Period: 0, Epoch: 30000}} + AllCliqueProtocolChanges = &ChainConfig{big.NewInt(1337), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, 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), big.NewInt(0), nil, new(EthashConfig), nil} + TestChainConfig = &ChainConfig{big.NewInt(1), big.NewInt(0), nil, false, big.NewInt(0), common.Hash{}, big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), big.NewInt(0), nil, nil, new(EthashConfig), nil} TestRules = TestChainConfig.Rules(new(big.Int)) ) @@ -129,13 +227,43 @@ var ( // 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 `json:"-"` SectionIndex uint64 `json:"sectionIndex"` SectionHead common.Hash `json:"sectionHead"` CHTRoot common.Hash `json:"chtRoot"` BloomRoot common.Hash `json:"bloomRoot"` } +// HashEqual returns an indicator comparing the itself hash with given one. +func (c *TrustedCheckpoint) HashEqual(hash common.Hash) bool { + if c.Empty() { + return hash == common.Hash{} + } + return c.Hash() == hash +} + +// Hash returns the hash of checkpoint's four key fields(index, sectionHead, chtRoot and bloomTrieRoot). +func (c *TrustedCheckpoint) Hash() common.Hash { + buf := make([]byte, 8+3*common.HashLength) + binary.BigEndian.PutUint64(buf, c.SectionIndex) + copy(buf[8:], c.SectionHead.Bytes()) + copy(buf[8+common.HashLength:], c.CHTRoot.Bytes()) + copy(buf[8+2*common.HashLength:], c.BloomRoot.Bytes()) + return crypto.Keccak256Hash(buf) +} + +// Empty returns an indicator whether the checkpoint is regarded as empty. +func (c *TrustedCheckpoint) Empty() bool { + return c.SectionHead == (common.Hash{}) || c.CHTRoot == (common.Hash{}) || c.BloomRoot == (common.Hash{}) +} + +// CheckpointOracleConfig represents a set of checkpoint contract(which acts as an oracle) +// config which used for light client checkpoint syncing. +type CheckpointOracleConfig struct { + Address common.Address `json:"address"` + Signers []common.Address `json:"signers"` + Threshold uint64 `json:"threshold"` +} + // ChainConfig is the core config which determines the blockchain settings. // // ChainConfig is stored in the database on a per block basis. This means @@ -158,6 +286,9 @@ type ChainConfig struct { ByzantiumBlock *big.Int `json:"byzantiumBlock,omitempty"` // Byzantium switch block (nil = no fork, 0 = already on byzantium) ConstantinopleBlock *big.Int `json:"constantinopleBlock,omitempty"` // Constantinople switch block (nil = no fork, 0 = already activated) + PetersburgBlock *big.Int `json:"petersburgBlock,omitempty"` // Petersburg switch block (nil = same as Constantinople) + IstanbulBlock *big.Int `json:"istanbulBlock,omitempty"` // Istanbul switch block (nil = no fork, 0 = already on istanbul) + MuirGlacierBlock *big.Int `json:"muirGlacierBlock,omitempty"` // Eip-2384 (bomb delay) switch block (nil = no fork, 0 = already activated) EWASMBlock *big.Int `json:"ewasmBlock,omitempty"` // EWASM switch block (nil = no fork, 0 = already activated) // Various consensus engines @@ -195,7 +326,7 @@ func (c *ChainConfig) String() string { default: engine = "unknown" } - return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Engine: %v}", + return fmt.Sprintf("{ChainID: %v Homestead: %v DAO: %v DAOSupport: %v EIP150: %v EIP155: %v EIP158: %v Byzantium: %v Constantinople: %v Petersburg: %v Istanbul: %v, Muir Glacier: %v, Engine: %v}", c.ChainID, c.HomesteadBlock, c.DAOForkBlock, @@ -205,6 +336,9 @@ func (c *ChainConfig) String() string { c.EIP158Block, c.ByzantiumBlock, c.ConstantinopleBlock, + c.PetersburgBlock, + c.IstanbulBlock, + c.MuirGlacierBlock, engine, ) } @@ -244,30 +378,28 @@ func (c *ChainConfig) IsConstantinople(num *big.Int) bool { return isForked(c.ConstantinopleBlock, num) } +// IsMuirGlacier returns whether num is either equal to the Muir Glacier (EIP-2384) fork block or greater. +func (c *ChainConfig) IsMuirGlacier(num *big.Int) bool { + return isForked(c.MuirGlacierBlock, num) +} + +// IsPetersburg returns whether num is either +// - equal to or greater than the PetersburgBlock fork block, +// - OR is nil, and Constantinople is active +func (c *ChainConfig) IsPetersburg(num *big.Int) bool { + return isForked(c.PetersburgBlock, num) || c.PetersburgBlock == nil && isForked(c.ConstantinopleBlock, num) +} + +// IsIstanbul returns whether num is either equal to the Istanbul fork block or greater. +func (c *ChainConfig) IsIstanbul(num *big.Int) bool { + return isForked(c.IstanbulBlock, num) +} + // IsEWASM returns whether num represents a block number after the EWASM fork func (c *ChainConfig) IsEWASM(num *big.Int) bool { return isForked(c.EWASMBlock, num) } -// GasTable returns the gas table corresponding to the current phase (homestead or homestead reprice). -// -// The returned GasTable's fields shouldn't, under any circumstances, be changed. -func (c *ChainConfig) GasTable(num *big.Int) GasTable { - if num == nil { - return GasTableHomestead - } - switch { - case c.IsConstantinople(num): - return GasTableConstantinople - case c.IsEIP158(num): - return GasTableEIP158 - case c.IsEIP150(num): - return GasTableEIP150 - default: - return GasTableHomestead - } -} - // CheckCompatible checks whether scheduled fork transitions have been imported // with a mismatching chain configuration. func (c *ChainConfig) CheckCompatible(newcfg *ChainConfig, height uint64) *ConfigCompatError { @@ -286,6 +418,43 @@ func (c *ChainConfig) CheckCompatible(newcfg *ChainConfig, height uint64) *Confi return lasterr } +// CheckConfigForkOrder checks that we don't "skip" any forks, geth isn't pluggable enough +// to guarantee that forks can be implemented in a different order than on official networks +func (c *ChainConfig) CheckConfigForkOrder() error { + type fork struct { + name string + block *big.Int + } + var lastFork fork + for _, cur := range []fork{ + {"homesteadBlock", c.HomesteadBlock}, + {"eip150Block", c.EIP150Block}, + {"eip155Block", c.EIP155Block}, + {"eip158Block", c.EIP158Block}, + {"byzantiumBlock", c.ByzantiumBlock}, + {"constantinopleBlock", c.ConstantinopleBlock}, + {"petersburgBlock", c.PetersburgBlock}, + {"istanbulBlock", c.IstanbulBlock}, + {"muirGlacierBlock", c.MuirGlacierBlock}, + } { + if lastFork.name != "" { + // Next one must be higher number + if lastFork.block == nil && cur.block != nil { + return fmt.Errorf("unsupported fork ordering: %v not enabled, but %v enabled at %v", + lastFork.name, cur.name, cur.block) + } + if lastFork.block != nil && cur.block != nil { + if lastFork.block.Cmp(cur.block) > 0 { + return fmt.Errorf("unsupported fork ordering: %v enabled at %v, but %v enabled at %v", + lastFork.name, lastFork.block, cur.name, cur.block) + } + } + } + lastFork = cur + } + return nil +} + func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *ConfigCompatError { if isForkIncompatible(c.HomesteadBlock, newcfg.HomesteadBlock, head) { return newCompatError("Homestead fork block", c.HomesteadBlock, newcfg.HomesteadBlock) @@ -314,6 +483,15 @@ func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *Confi if isForkIncompatible(c.ConstantinopleBlock, newcfg.ConstantinopleBlock, head) { return newCompatError("Constantinople fork block", c.ConstantinopleBlock, newcfg.ConstantinopleBlock) } + if isForkIncompatible(c.PetersburgBlock, newcfg.PetersburgBlock, head) { + return newCompatError("Petersburg fork block", c.PetersburgBlock, newcfg.PetersburgBlock) + } + if isForkIncompatible(c.IstanbulBlock, newcfg.IstanbulBlock, head) { + return newCompatError("Istanbul fork block", c.IstanbulBlock, newcfg.IstanbulBlock) + } + if isForkIncompatible(c.MuirGlacierBlock, newcfg.MuirGlacierBlock, head) { + return newCompatError("Muir Glacier fork block", c.MuirGlacierBlock, newcfg.MuirGlacierBlock) + } if isForkIncompatible(c.EWASMBlock, newcfg.EWASMBlock, head) { return newCompatError("ewasm fork block", c.EWASMBlock, newcfg.EWASMBlock) } @@ -381,9 +559,9 @@ func (err *ConfigCompatError) Error() string { // Rules is a one time interface meaning that it shouldn't be used in between transition // phases. type Rules struct { - ChainID *big.Int - IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool - IsByzantium, IsConstantinople bool + ChainID *big.Int + IsHomestead, IsEIP150, IsEIP155, IsEIP158 bool + IsByzantium, IsConstantinople, IsPetersburg, IsIstanbul bool } // Rules ensures c's ChainID is not nil. @@ -400,5 +578,7 @@ func (c *ChainConfig) Rules(num *big.Int) Rules { IsEIP158: c.IsEIP158(num), IsByzantium: c.IsByzantium(num), IsConstantinople: c.IsConstantinople(num), + IsPetersburg: c.IsPetersburg(num), + IsIstanbul: c.IsIstanbul(num), } } diff --git a/params/dao.go b/params/dao.go index fea0e6390f55..da3c8dfc992b 100644 --- a/params/dao.go +++ b/params/dao.go @@ -19,7 +19,7 @@ package params import ( "math/big" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) // DAOForkBlockExtra is the block header extra-data field to set for the DAO fork diff --git a/params/gas_table.go b/params/gas_table.go deleted file mode 100644 index 6c4a38269cda..000000000000 --- a/params/gas_table.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package params - -// GasTable organizes gas prices for different ethereum phases. -type GasTable struct { - ExtcodeSize uint64 - ExtcodeCopy uint64 - ExtcodeHash uint64 - Balance uint64 - SLoad uint64 - Calls uint64 - Suicide uint64 - - ExpByte uint64 - - // CreateBySuicide occurs when the - // refunded account is one that does - // not exist. This logic is similar - // to call. May be left nil. Nil means - // not charged. - CreateBySuicide uint64 -} - -// Variables containing gas prices for different ethereum phases. -var ( - // GasTableHomestead contain the gas prices for - // the homestead phase. - GasTableHomestead = GasTable{ - ExtcodeSize: 20, - ExtcodeCopy: 20, - Balance: 20, - SLoad: 50, - Calls: 40, - Suicide: 0, - ExpByte: 10, - } - - // GasTableEIP150 contain the gas re-prices for - // the EIP150 phase. - GasTableEIP150 = GasTable{ - ExtcodeSize: 700, - ExtcodeCopy: 700, - Balance: 400, - SLoad: 200, - Calls: 700, - Suicide: 5000, - ExpByte: 10, - - CreateBySuicide: 25000, - } - // GasTableEIP158 contain the gas re-prices for - // the EIP155/EIP158 phase. - GasTableEIP158 = GasTable{ - ExtcodeSize: 700, - ExtcodeCopy: 700, - Balance: 400, - SLoad: 200, - Calls: 700, - Suicide: 5000, - ExpByte: 50, - - CreateBySuicide: 25000, - } - // GasTableConstantinople contain the gas re-prices for - // the constantinople phase. - GasTableConstantinople = GasTable{ - ExtcodeSize: 700, - ExtcodeCopy: 700, - ExtcodeHash: 400, - Balance: 400, - SLoad: 200, - Calls: 700, - Suicide: 5000, - ExpByte: 50, - - CreateBySuicide: 25000, - } -) diff --git a/params/network_params.go b/params/network_params.go index f8731e897970..bba24721c134 100644 --- a/params/network_params.go +++ b/params/network_params.go @@ -32,13 +32,8 @@ const ( // considered probably final and its rotated bits are calculated. BloomConfirms = 256 - // CHTFrequencyClient is the block frequency for creating CHTs on the client side. - CHTFrequencyClient = 32768 - - // CHTFrequencyServer is the block frequency for creating CHTs on the server side. - // Eventually this can be merged back with the client version, but that requires a - // full database upgrade, so that should be left for a suitable moment. - CHTFrequencyServer = 4096 + // CHTFrequency is the block frequency for creating CHTs + CHTFrequency = 32768 // BloomTrieFrequency is the block frequency for creating BloomTrie on both // server/client sides. @@ -51,4 +46,16 @@ const ( // HelperTrieProcessConfirmations is the number of confirmations before a HelperTrie // is generated HelperTrieProcessConfirmations = 256 + + // CheckpointFrequency is the block frequency for creating checkpoint + CheckpointFrequency = 32768 + + // CheckpointProcessConfirmations is the number before a checkpoint is generated + CheckpointProcessConfirmations = 256 + + // ImmutabilityThreshold is the number of blocks after which a chain segment is + // considered immutable (i.e. soft finality). It is used by the downloader as a + // hard limit against deep ancestors, by the blockchain against deep reorgs, by + // the freezer as the cutoff treshold and by clique as the snapshot trust limit. + ImmutabilityThreshold = 90000 ) diff --git a/params/protocol_params.go b/params/protocol_params.go index c8b6609afbfe..11b858a61c4f 100644 --- a/params/protocol_params.go +++ b/params/protocol_params.go @@ -52,39 +52,83 @@ const ( NetSstoreResetRefund uint64 = 4800 // Once per SSTORE operation for resetting to the original non-zero value NetSstoreResetClearRefund uint64 = 19800 // Once per SSTORE operation for resetting to the original zero value - JumpdestGas uint64 = 1 // Refunded gas, once per SSTORE operation if the zeroness changes to zero. - EpochDuration uint64 = 30000 // Duration between proof-of-work epochs. - CallGas uint64 = 40 // Once per CALL operation & message call transaction. - CreateDataGas uint64 = 200 // - CallCreateDepth uint64 = 1024 // Maximum depth of call/create stack. - ExpGas uint64 = 10 // Once per EXP instruction - LogGas uint64 = 375 // Per LOG* operation. - CopyGas uint64 = 3 // - StackLimit uint64 = 1024 // Maximum size of VM stack allowed. - TierStepGas uint64 = 0 // Once per operation, for a selection of them. - LogTopicGas uint64 = 375 // Multiplied by the * of the LOG*, per LOG transaction. e.g. LOG0 incurs 0 * c_txLogTopicGas, LOG4 incurs 4 * c_txLogTopicGas. - CreateGas uint64 = 32000 // Once per CREATE operation & contract-creation transaction. - Create2Gas uint64 = 32000 // Once per CREATE2 operation - SuicideRefundGas uint64 = 24000 // Refunded following a suicide operation. - 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. + SstoreSentryGasEIP2200 uint64 = 2300 // Minimum gas required to be present for an SSTORE call, not consumed + SstoreNoopGasEIP2200 uint64 = 800 // Once per SSTORE operation if the value doesn't change. + SstoreDirtyGasEIP2200 uint64 = 800 // Once per SSTORE operation if a dirty value is changed. + SstoreInitGasEIP2200 uint64 = 20000 // Once per SSTORE operation from clean zero to non-zero + SstoreInitRefundEIP2200 uint64 = 19200 // Once per SSTORE operation for resetting to the original zero value + SstoreCleanGasEIP2200 uint64 = 5000 // Once per SSTORE operation from clean non-zero to something else + SstoreCleanRefundEIP2200 uint64 = 4200 // Once per SSTORE operation for resetting to the original non-zero value + SstoreClearRefundEIP2200 uint64 = 15000 // Once per SSTORE operation for clearing an originally existing storage slot + + JumpdestGas uint64 = 1 // Once per JUMPDEST operation. + EpochDuration uint64 = 30000 // Duration between proof-of-work epochs. + + CreateDataGas uint64 = 200 // + CallCreateDepth uint64 = 1024 // Maximum depth of call/create stack. + ExpGas uint64 = 10 // Once per EXP instruction + LogGas uint64 = 375 // Per LOG* operation. + CopyGas uint64 = 3 // + StackLimit uint64 = 1024 // Maximum size of VM stack allowed. + TierStepGas uint64 = 0 // Once per operation, for a selection of them. + LogTopicGas uint64 = 375 // Multiplied by the * of the LOG*, per LOG transaction. e.g. LOG0 incurs 0 * c_txLogTopicGas, LOG4 incurs 4 * c_txLogTopicGas. + CreateGas uint64 = 32000 // Once per CREATE operation & contract-creation transaction. + Create2Gas uint64 = 32000 // Once per CREATE2 operation + SelfdestructRefundGas uint64 = 24000 // Refunded following a selfdestruct operation. + 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. + TxDataNonZeroGasFrontier 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. + TxDataNonZeroGasEIP2028 uint64 = 16 // Per byte of non zero data attached to a transaction after EIP 2028 (part in Istanbul) + + // These have been changed during the course of the chain + CallGasFrontier uint64 = 40 // Once per CALL operation & message call transaction. + CallGasEIP150 uint64 = 700 // Static portion of gas for CALL-derivates after EIP 150 (Tangerine) + BalanceGasFrontier uint64 = 20 // The cost of a BALANCE operation + BalanceGasEIP150 uint64 = 400 // The cost of a BALANCE operation after Tangerine + BalanceGasEIP1884 uint64 = 700 // The cost of a BALANCE operation after EIP 1884 (part of Istanbul) + ExtcodeSizeGasFrontier uint64 = 20 // Cost of EXTCODESIZE before EIP 150 (Tangerine) + ExtcodeSizeGasEIP150 uint64 = 700 // Cost of EXTCODESIZE after EIP 150 (Tangerine) + SloadGasFrontier uint64 = 50 + SloadGasEIP150 uint64 = 200 + SloadGasEIP1884 uint64 = 800 // Cost of SLOAD after EIP 1884 (part of Istanbul) + ExtcodeHashGasConstantinople uint64 = 400 // Cost of EXTCODEHASH (introduced in Constantinople) + ExtcodeHashGasEIP1884 uint64 = 700 // Cost of EXTCODEHASH after EIP 1884 (part in Istanbul) + SelfdestructGasEIP150 uint64 = 5000 // Cost of SELFDESTRUCT post EIP 150 (Tangerine) + + // EXP has a dynamic portion depending on the size of the exponent + ExpByteFrontier uint64 = 10 // was set to 10 in Frontier + ExpByteEIP158 uint64 = 50 // was raised to 50 during Eip158 (Spurious Dragon) + + // Extcodecopy has a dynamic AND a static cost. This represents only the + // static portion of the gas. It was changed during EIP 150 (Tangerine) + ExtcodeCopyBaseFrontier uint64 = 20 + ExtcodeCopyBaseEIP150 uint64 = 700 + + // CreateBySelfdestructGas is used when the refunded account is one that does + // not exist. This logic is similar to call. + // Introduced in Tangerine Whistle (Eip 150) + CreateBySelfdestructGas uint64 = 25000 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 + 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 + + Bn256AddGasByzantium uint64 = 500 // Byzantium gas needed for an elliptic curve addition + Bn256AddGasIstanbul uint64 = 150 // Gas needed for an elliptic curve addition + Bn256ScalarMulGasByzantium uint64 = 40000 // Byzantium gas needed for an elliptic curve scalar multiplication + Bn256ScalarMulGasIstanbul uint64 = 6000 // Gas needed for an elliptic curve scalar multiplication + Bn256PairingBaseGasByzantium uint64 = 100000 // Byzantium base price for an elliptic curve pairing check + Bn256PairingBaseGasIstanbul uint64 = 45000 // Base price for an elliptic curve pairing check + Bn256PairingPerPointGasByzantium uint64 = 80000 // Byzantium per-point price for an elliptic curve pairing check + Bn256PairingPerPointGasIstanbul uint64 = 34000 // Per-point price for an elliptic curve pairing check ) var ( diff --git a/params/version.go b/params/version.go index d7218fe4e643..aaeac6a5814e 100644 --- a/params/version.go +++ b/params/version.go @@ -21,9 +21,9 @@ import ( ) const ( - VersionMajor = 0 // Major version component of the current release - VersionMinor = 0 // Minor version component of the current release - VersionPatch = 2 // Patch version component of the current release + VersionMajor = 1 // Major version component of the current release + VersionMinor = 9 // Minor version component of the current release + VersionPatch = 9 // Patch version component of the current release VersionMeta = "stable" // Version metadata to append to the version string ) @@ -55,10 +55,13 @@ func ArchiveVersion(gitCommit string) string { return vsn } -func VersionWithCommit(gitCommit string) string { +func VersionWithCommit(gitCommit, gitDate string) string { vsn := VersionWithMeta if len(gitCommit) >= 8 { vsn += "-" + gitCommit[:8] } + if (VersionMeta != "stable") && (gitDate != "") { + vsn += "-" + gitDate + } return vsn } diff --git a/rlp/decode.go b/rlp/decode.go index dbbe599597a8..5f3f5eedfd1b 100644 --- a/rlp/decode.go +++ b/rlp/decode.go @@ -26,14 +26,16 @@ import ( "math/big" "reflect" "strings" + "sync" ) -var ( - // EOL is returned when the end of the current list - // has been reached during streaming. - EOL = errors.New("rlp: end of list") +//lint:ignore ST1012 EOL is not an error. + +// EOL is returned when the end of the current list +// has been reached during streaming. +var EOL = errors.New("rlp: end of list") - // Actual Errors +var ( ErrExpectedString = errors.New("rlp: expected String or Byte") ErrExpectedList = errors.New("rlp: expected List") ErrCanonInt = errors.New("rlp: non-canonical integer format") @@ -48,95 +50,49 @@ var ( errUintOverflow = errors.New("rlp: uint overflow") errNoPointer = errors.New("rlp: interface given to Decode must be a pointer") errDecodeIntoNil = errors.New("rlp: pointer given to Decode must not be nil") + + streamPool = sync.Pool{ + New: func() interface{} { return new(Stream) }, + } ) -// Decoder is implemented by types that require custom RLP -// decoding rules or need to decode into private fields. +// Decoder is implemented by types that require custom RLP decoding rules or need to decode +// into private fields. // -// The DecodeRLP method should read one value from the given -// Stream. It is not forbidden to read less or more, but it might -// be confusing. +// The DecodeRLP method should read one value from the given Stream. It is not forbidden to +// read less or more, but it might be confusing. type Decoder interface { DecodeRLP(*Stream) error } -// Decode parses RLP-encoded data from r and stores the result in the -// value pointed to by val. Val must be a non-nil pointer. If r does -// not implement ByteReader, Decode will do its own buffering. -// -// Decode uses the following type-dependent decoding rules: -// -// If the type implements the Decoder interface, decode calls -// DecodeRLP. -// -// To decode into a pointer, Decode will decode into the value pointed -// to. If the pointer is nil, a new value of the pointer's element -// type is allocated. If the pointer is non-nil, the existing value -// will be reused. -// -// To decode into a struct, Decode expects the input to be an RLP -// list. The decoded elements of the list are assigned to each public -// field in the order given by the struct's definition. The input list -// must contain an element for each decoded field. Decode returns an -// error if there are too few or too many elements. -// -// The decoding of struct fields honours certain struct tags, "tail", -// "nil" and "-". -// -// The "-" tag ignores fields. -// -// For an explanation of "tail", see the example. -// -// The "nil" tag applies to pointer-typed fields and changes the decoding -// rules for the field such that input values of size zero decode as a nil -// pointer. This tag can be useful when decoding recursive types. -// -// type StructWithEmptyOK struct { -// Foo *[20]byte `rlp:"nil"` -// } +// Decode parses RLP-encoded data from r and stores the result in the value pointed to by +// val. Please see package-level documentation for the decoding rules. Val must be a +// non-nil pointer. // -// To decode into a slice, the input must be a list and the resulting -// slice will contain the input elements in order. For byte slices, -// the input must be an RLP string. Array types decode similarly, with -// the additional restriction that the number of input elements (or -// bytes) must match the array's length. +// If r does not implement ByteReader, Decode will do its own buffering. // -// To decode into a Go string, the input must be an RLP string. The -// input bytes are taken as-is and will not necessarily be valid UTF-8. -// -// To decode into an unsigned integer type, the input must also be an RLP -// string. The bytes are interpreted as a big endian representation of -// the integer. If the RLP string is larger than the bit size of the -// type, Decode will return an error. Decode also supports *big.Int. -// There is no size limit for big integers. -// -// To decode into an interface value, Decode stores one of these -// in the value: -// -// []interface{}, for RLP lists -// []byte, for RLP strings -// -// Non-empty interface types are not supported, nor are booleans, -// signed integers, floating point numbers, maps, channels and -// functions. -// -// Note that Decode does not set an input limit for all readers -// and may be vulnerable to panics cause by huge value sizes. If -// you need an input limit, use +// Note that Decode does not set an input limit for all readers and may be vulnerable to +// panics cause by huge value sizes. If you need an input limit, use // // NewStream(r, limit).Decode(val) func Decode(r io.Reader, val interface{}) error { - // TODO: this could use a Stream from a pool. - return NewStream(r, 0).Decode(val) + stream := streamPool.Get().(*Stream) + defer streamPool.Put(stream) + + stream.Reset(r, 0) + return stream.Decode(val) } -// DecodeBytes parses RLP data from b into val. -// Please see the documentation of Decode for the decoding rules. -// The input must contain exactly one value and no trailing data. +// DecodeBytes parses RLP data from b into val. Please see package-level documentation for +// the decoding rules. The input must contain exactly one value and no trailing data. func DecodeBytes(b []byte, val interface{}) error { - // TODO: this could use a Stream from a pool. r := bytes.NewReader(b) - if err := NewStream(r, uint64(len(b))).Decode(val); err != nil { + + stream := streamPool.Get().(*Stream) + defer streamPool.Put(stream) + + stream.Reset(r, uint64(len(b))) + if err := stream.Decode(val); err != nil { return err } if r.Len() > 0 { @@ -197,14 +153,14 @@ func makeDecoder(typ reflect.Type, tags tags) (dec decoder, err error) { switch { case typ == rawValueType: return decodeRawValue, nil - case typ.Implements(decoderInterface): - return decodeDecoder, nil - case kind != reflect.Ptr && reflect.PtrTo(typ).Implements(decoderInterface): - return decodeDecoderNoPtr, nil case typ.AssignableTo(reflect.PtrTo(bigInt)): return decodeBigInt, nil case typ.AssignableTo(bigInt): return decodeBigIntNoPtr, nil + case kind == reflect.Ptr: + return makePtrDecoder(typ, tags) + case reflect.PtrTo(typ).Implements(decoderInterface): + return decodeDecoder, nil case isUint(kind): return decodeUint, nil case kind == reflect.Bool: @@ -215,11 +171,6 @@ func makeDecoder(typ reflect.Type, tags tags) (dec decoder, err error) { return makeListDecoder(typ, tags) case kind == reflect.Struct: return makeStructDecoder(typ) - case kind == reflect.Ptr: - if tags.nilOK { - return makeOptionalPtrDecoder(typ) - } - return makePtrDecoder(typ) case kind == reflect.Interface: return decodeInterface, nil default: @@ -294,9 +245,9 @@ func makeListDecoder(typ reflect.Type, tag tags) (decoder, error) { } return decodeByteSlice, nil } - etypeinfo, err := cachedTypeInfo1(etype, tags{}) - if err != nil { - return nil, err + etypeinfo := cachedTypeInfo1(etype, tags{}) + if etypeinfo.decoderErr != nil { + return nil, etypeinfo.decoderErr } var dec decoder switch { @@ -434,6 +385,11 @@ func makeStructDecoder(typ reflect.Type) (decoder, error) { if err != nil { return nil, err } + for _, f := range fields { + if f.info.decoderErr != nil { + return nil, structFieldError{typ, f.index, f.info.decoderErr} + } + } dec := func(s *Stream, val reflect.Value) (err error) { if _, err := s.List(); err != nil { return wrapStreamError(err, typ) @@ -451,15 +407,22 @@ func makeStructDecoder(typ reflect.Type) (decoder, error) { return dec, nil } -// makePtrDecoder creates a decoder that decodes into -// the pointer's element type. -func makePtrDecoder(typ reflect.Type) (decoder, error) { +// makePtrDecoder creates a decoder that decodes into the pointer's element type. +func makePtrDecoder(typ reflect.Type, tag tags) (decoder, error) { etype := typ.Elem() - etypeinfo, err := cachedTypeInfo1(etype, tags{}) - if err != nil { - return nil, err + etypeinfo := cachedTypeInfo1(etype, tags{}) + switch { + case etypeinfo.decoderErr != nil: + return nil, etypeinfo.decoderErr + case !tag.nilOK: + return makeSimplePtrDecoder(etype, etypeinfo), nil + default: + return makeNilPtrDecoder(etype, etypeinfo, tag.nilKind), nil } - dec := func(s *Stream, val reflect.Value) (err error) { +} + +func makeSimplePtrDecoder(etype reflect.Type, etypeinfo *typeinfo) decoder { + return func(s *Stream, val reflect.Value) (err error) { newval := val if val.IsNil() { newval = reflect.New(etype) @@ -469,30 +432,35 @@ func makePtrDecoder(typ reflect.Type) (decoder, error) { } return err } - return dec, nil } -// makeOptionalPtrDecoder creates a decoder that decodes empty values -// as nil. Non-empty values are decoded into a value of the element type, -// just like makePtrDecoder does. +// makeNilPtrDecoder creates a decoder that decodes empty values as nil. Non-empty +// values are decoded into a value of the element type, just like makePtrDecoder does. // // This decoder is used for pointer-typed struct fields with struct tag "nil". -func makeOptionalPtrDecoder(typ reflect.Type) (decoder, error) { - etype := typ.Elem() - etypeinfo, err := cachedTypeInfo1(etype, tags{}) - if err != nil { - return nil, err - } - dec := func(s *Stream, val reflect.Value) (err error) { +func makeNilPtrDecoder(etype reflect.Type, etypeinfo *typeinfo, nilKind Kind) decoder { + typ := reflect.PtrTo(etype) + nilPtr := reflect.Zero(typ) + return func(s *Stream, val reflect.Value) (err error) { kind, size, err := s.Kind() - if err != nil || size == 0 && kind != Byte { + if err != nil { + val.Set(nilPtr) + return wrapStreamError(err, typ) + } + // Handle empty values as a nil pointer. + if kind != Byte && size == 0 { + if kind != nilKind { + return &decodeError{ + msg: fmt.Sprintf("wrong kind of empty value (got %v, want %v)", kind, nilKind), + typ: typ, + } + } // rearm s.Kind. This is important because the input // position must advance to the next value even though // we don't read anything. s.kind = -1 - // set the pointer to nil. - val.Set(reflect.Zero(typ)) - return err + val.Set(nilPtr) + return nil } newval := val if val.IsNil() { @@ -503,7 +471,6 @@ func makeOptionalPtrDecoder(typ reflect.Type) (decoder, error) { } return err } - return dec, nil } var ifsliceType = reflect.TypeOf([]interface{}{}) @@ -532,21 +499,8 @@ func decodeInterface(s *Stream, val reflect.Value) error { return nil } -// This decoder is used for non-pointer values of types -// that implement the Decoder interface using a pointer receiver. -func decodeDecoderNoPtr(s *Stream, val reflect.Value) error { - return val.Addr().Interface().(Decoder).DecodeRLP(s) -} - func decodeDecoder(s *Stream, val reflect.Value) error { - // Decoder instances are not handled using the pointer rule if the type - // implements Decoder with pointer receiver (i.e. always) - // because it might handle empty values specially. - // We need to allocate one here in this case, like makePtrDecoder does. - if val.Kind() == reflect.Ptr && val.IsNil() { - val.Set(reflect.New(val.Type().Elem())) - } - return val.Interface().(Decoder).DecodeRLP(s) + return val.Addr().Interface().(Decoder).DecodeRLP(s) } // Kind represents the kind of value contained in an RLP stream. @@ -802,12 +756,12 @@ func (s *Stream) Decode(val interface{}) error { if rval.IsNil() { return errDecodeIntoNil } - info, err := cachedTypeInfo(rtyp.Elem(), tags{}) + decoder, err := cachedDecoder(rtyp.Elem()) if err != nil { return err } - err = info.decoder(s, rval.Elem()) + err = decoder(s, rval.Elem()) if decErr, ok := err.(*decodeError); ok && len(decErr.ctx) > 0 { // add decode target type to error so context has more meaning decErr.ctx = append(decErr.ctx, fmt.Sprint("(", rtyp.Elem(), ")")) @@ -853,6 +807,7 @@ func (s *Stream) Reset(r io.Reader, inputLimit uint64) { if s.uintbuf == nil { s.uintbuf = make([]byte, 8) } + s.byteval = 0 } // Kind returns the kind and size of the next value in the diff --git a/rlp/decode_test.go b/rlp/decode_test.go index 4d8abd001281..167e9974b96d 100644 --- a/rlp/decode_test.go +++ b/rlp/decode_test.go @@ -327,6 +327,10 @@ type recstruct struct { Child *recstruct `rlp:"nil"` } +type invalidNilTag struct { + X []byte `rlp:"nil"` +} + type invalidTail1 struct { A uint `rlp:"tail"` B string @@ -347,6 +351,24 @@ type tailUint struct { Tail []uint `rlp:"tail"` } +type tailPrivateFields struct { + A uint + Tail []uint `rlp:"tail"` + x, y bool //lint:ignore U1000 unused fields required for testing purposes. +} + +type nilListUint struct { + X *uint `rlp:"nilList"` +} + +type nilStringSlice struct { + X *[]uint `rlp:"nilString"` +} + +type intField struct { + X int +} + var ( veryBigInt = big.NewInt(0).Add( big.NewInt(0).Lsh(big.NewInt(0xFFFFFFFFFFFFFF), 16), @@ -479,20 +501,20 @@ var decodeTests = []decodeTest{ error: "rlp: expected input string or byte for uint, decoding into (rlp.recstruct).Child.I", }, { - input: "C0", - ptr: new(invalidTail1), - error: "rlp: invalid struct tag \"tail\" for rlp.invalidTail1.A (must be on last field)", - }, - { - input: "C0", - ptr: new(invalidTail2), - error: "rlp: invalid struct tag \"tail\" for rlp.invalidTail2.B (field type is not slice)", + input: "C103", + ptr: new(intField), + error: "rlp: type int is not RLP-serializable (struct field rlp.intField.X)", }, { input: "C50102C20102", ptr: new(tailUint), error: "rlp: expected input string or byte for uint, decoding into (rlp.tailUint).Tail[1]", }, + { + input: "C0", + ptr: new(invalidNilTag), + error: `rlp: invalid struct tag "nil" for rlp.invalidNilTag.X (field is not a pointer)`, + }, // struct tag "tail" { @@ -510,6 +532,21 @@ var decodeTests = []decodeTest{ ptr: new(tailRaw), value: tailRaw{A: 1, Tail: []RawValue{}}, }, + { + input: "C3010203", + ptr: new(tailPrivateFields), + value: tailPrivateFields{A: 1, Tail: []uint{2, 3}}, + }, + { + input: "C0", + ptr: new(invalidTail1), + error: `rlp: invalid struct tag "tail" for rlp.invalidTail1.A (must be on last field)`, + }, + { + input: "C0", + ptr: new(invalidTail2), + error: `rlp: invalid struct tag "tail" for rlp.invalidTail2.B (field type is not slice)`, + }, // struct tag "-" { @@ -518,6 +555,43 @@ var decodeTests = []decodeTest{ value: hasIgnoredField{A: 1, C: 2}, }, + // struct tag "nilList" + { + input: "C180", + ptr: new(nilListUint), + error: "rlp: wrong kind of empty value (got String, want List) for *uint, decoding into (rlp.nilListUint).X", + }, + { + input: "C1C0", + ptr: new(nilListUint), + value: nilListUint{}, + }, + { + input: "C103", + ptr: new(nilListUint), + value: func() interface{} { + v := uint(3) + return nilListUint{X: &v} + }(), + }, + + // struct tag "nilString" + { + input: "C1C0", + ptr: new(nilStringSlice), + error: "rlp: wrong kind of empty value (got List, want String) for *[]uint, decoding into (rlp.nilStringSlice).X", + }, + { + input: "C180", + ptr: new(nilStringSlice), + value: nilStringSlice{}, + }, + { + input: "C2C103", + ptr: new(nilStringSlice), + value: nilStringSlice{X: &[]uint{3}}, + }, + // RawValue {input: "01", ptr: new(RawValue), value: RawValue(unhex("01"))}, {input: "82FFFF", ptr: new(RawValue), value: RawValue(unhex("82FFFF"))}, @@ -661,6 +735,22 @@ func TestDecodeDecoder(t *testing.T) { } } +func TestDecodeDecoderNilPointer(t *testing.T) { + var s struct { + T1 *testDecoder `rlp:"nil"` + T2 *testDecoder + } + if err := Decode(bytes.NewReader(unhex("C2C002")), &s); err != nil { + t.Fatalf("Decode error: %v", err) + } + if s.T1 != nil { + t.Errorf("decoder T1 allocated for empty input (called: %v)", s.T1.called) + } + if s.T2 == nil || !s.T2.called { + t.Errorf("decoder T2 not allocated/called") + } +} + type byteDecoder byte func (bd *byteDecoder) DecodeRLP(s *Stream) error { @@ -691,13 +781,33 @@ func TestDecoderInByteSlice(t *testing.T) { } } +type unencodableDecoder func() + +func (f *unencodableDecoder) DecodeRLP(s *Stream) error { + if _, err := s.List(); err != nil { + return err + } + if err := s.ListEnd(); err != nil { + return err + } + *f = func() {} + return nil +} + +func TestDecoderFunc(t *testing.T) { + var x func() + if err := DecodeBytes([]byte{0xC0}, (*unencodableDecoder)(&x)); err != nil { + t.Fatal(err) + } + x() +} + func ExampleDecode() { input, _ := hex.DecodeString("C90A1486666F6F626172") type example struct { - A, B uint - private uint // private fields are ignored - String string + A, B uint + String string } var s example @@ -708,7 +818,7 @@ func ExampleDecode() { fmt.Printf("Decoded value: %#v\n", s) } // Output: - // Decoded value: rlp.example{A:0xa, B:0x14, private:0x0, String:"foobar"} + // Decoded value: rlp.example{A:0xa, B:0x14, String:"foobar"} } func ExampleDecode_structTagNil() { diff --git a/rlp/doc.go b/rlp/doc.go index b3a81fe2326f..7e6ee8520019 100644 --- a/rlp/doc.go +++ b/rlp/doc.go @@ -17,17 +17,114 @@ /* Package rlp implements the RLP serialization format. -The purpose of RLP (Recursive Linear Prefix) is to encode arbitrarily -nested arrays of binary data, and RLP is the main encoding method used -to serialize objects in Ethereum. The only purpose of RLP is to encode -structure; encoding specific atomic data types (eg. strings, ints, -floats) is left up to higher-order protocols; in Ethereum integers -must be represented in big endian binary form with no leading zeroes -(thus making the integer value zero equivalent to the empty byte -array). - -RLP values are distinguished by a type tag. The type tag precedes the -value in the input stream and defines the size and kind of the bytes -that follow. +The purpose of RLP (Recursive Linear Prefix) is to encode arbitrarily nested arrays of +binary data, and RLP is the main encoding method used to serialize objects in Ethereum. +The only purpose of RLP is to encode structure; encoding specific atomic data types (eg. +strings, ints, floats) is left up to higher-order protocols. In Ethereum integers must be +represented in big endian binary form with no leading zeroes (thus making the integer +value zero equivalent to the empty string). + +RLP values are distinguished by a type tag. The type tag precedes the value in the input +stream and defines the size and kind of the bytes that follow. + + +Encoding Rules + +Package rlp uses reflection and encodes RLP based on the Go type of the value. + +If the type implements the Encoder interface, Encode calls EncodeRLP. It does not +call EncodeRLP on nil pointer values. + +To encode a pointer, the value being pointed to is encoded. A nil pointer to a struct +type, slice or array always encodes as an empty RLP list unless the slice or array has +elememt type byte. A nil pointer to any other value encodes as the empty string. + +Struct values are encoded as an RLP list of all their encoded public fields. Recursive +struct types are supported. + +To encode slices and arrays, the elements are encoded as an RLP list of the value's +elements. Note that arrays and slices with element type uint8 or byte are always encoded +as an RLP string. + +A Go string is encoded as an RLP string. + +An unsigned integer value is encoded as an RLP string. Zero always encodes as an empty RLP +string. big.Int values are treated as integers. Signed integers (int, int8, int16, ...) +are not supported and will return an error when encoding. + +Boolean values are encoded as the unsigned integers zero (false) and one (true). + +An interface value encodes as the value contained in the interface. + +Floating point numbers, maps, channels and functions are not supported. + + +Decoding Rules + +Decoding uses the following type-dependent rules: + +If the type implements the Decoder interface, DecodeRLP is called. + +To decode into a pointer, the value will be decoded as the element type of the pointer. If +the pointer is nil, a new value of the pointer's element type is allocated. If the pointer +is non-nil, the existing value will be reused. Note that package rlp never leaves a +pointer-type struct field as nil unless one of the "nil" struct tags is present. + +To decode into a struct, decoding expects the input to be an RLP list. The decoded +elements of the list are assigned to each public field in the order given by the struct's +definition. The input list must contain an element for each decoded field. Decoding +returns an error if there are too few or too many elements for the struct. + +To decode into a slice, the input must be a list and the resulting slice will contain the +input elements in order. For byte slices, the input must be an RLP string. Array types +decode similarly, with the additional restriction that the number of input elements (or +bytes) must match the array's defined length. + +To decode into a Go string, the input must be an RLP string. The input bytes are taken +as-is and will not necessarily be valid UTF-8. + +To decode into an unsigned integer type, the input must also be an RLP string. The bytes +are interpreted as a big endian representation of the integer. If the RLP string is larger +than the bit size of the type, decoding will return an error. Decode also supports +*big.Int. There is no size limit for big integers. + +To decode into a boolean, the input must contain an unsigned integer of value zero (false) +or one (true). + +To decode into an interface value, one of these types is stored in the value: + + []interface{}, for RLP lists + []byte, for RLP strings + +Non-empty interface types are not supported when decoding. +Signed integers, floating point numbers, maps, channels and functions cannot be decoded into. + + +Struct Tags + +Package rlp honours certain struct tags: "-", "tail", "nil", "nilList" and "nilString". + +The "-" tag ignores fields. + +The "tail" tag, which may only be used on the last exported struct field, allows slurping +up any excess list elements into a slice. See examples for more details. + +The "nil" tag applies to pointer-typed fields and changes the decoding rules for the field +such that input values of size zero decode as a nil pointer. This tag can be useful when +decoding recursive types. + + type StructWithOptionalFoo struct { + Foo *[20]byte `rlp:"nil"` + } + +RLP supports two kinds of empty values: empty lists and empty strings. When using the +"nil" tag, the kind of empty value allowed for a type is chosen automatically. A struct +field whose Go type is a pointer to an unsigned integer, string, boolean or byte +array/slice expects an empty RLP string. Any other pointer field type encodes/decodes as +an empty RLP list. + +The choice of null value can be made explicit with the "nilList" and "nilString" struct +tags. Using these tags encodes/decodes a Go nil pointer value as the kind of empty +RLP value defined by the tag. */ package rlp diff --git a/rlp/encode.go b/rlp/encode.go index 445b4b5b2104..9c9e8d706d07 100644 --- a/rlp/encode.go +++ b/rlp/encode.go @@ -49,34 +49,7 @@ type Encoder interface { // perform many small writes in some cases. Consider making w // buffered. // -// Encode uses the following type-dependent encoding rules: -// -// If the type implements the Encoder interface, Encode calls -// EncodeRLP. This is true even for nil pointers, please see the -// documentation for Encoder. -// -// To encode a pointer, the value being pointed to is encoded. For nil -// pointers, Encode will encode the zero value of the type. A nil -// pointer to a struct type always encodes as an empty RLP list. -// A nil pointer to an array encodes as an empty list (or empty string -// if the array has element type byte). -// -// Struct values are encoded as an RLP list of all their encoded -// public fields. Recursive struct types are supported. -// -// To encode slices and arrays, the elements are encoded as an RLP -// list of the value's elements. Note that arrays and slices with -// element type uint8 or byte are always encoded as an RLP string. -// -// A Go string is encoded as an RLP string. -// -// An unsigned integer value is encoded as an RLP string. Zero always -// encodes as an empty RLP string. Encode also supports *big.Int. -// -// An interface value encodes as the value contained in the interface. -// -// Boolean values are not supported, nor are signed integers, floating -// point numbers, maps, channels and functions. +// Please see package-level documentation of encoding rules. func Encode(w io.Writer, val interface{}) error { if outer, ok := w.(*encbuf); ok { // Encode was called by some type's EncodeRLP. @@ -93,7 +66,7 @@ func Encode(w io.Writer, val interface{}) error { } // EncodeToBytes returns the RLP encoding of val. -// Please see the documentation of Encode for the encoding rules. +// Please see package-level documentation for the encoding rules. func EncodeToBytes(val interface{}) ([]byte, error) { eb := encbufPool.Get().(*encbuf) defer encbufPool.Put(eb) @@ -180,11 +153,11 @@ func (w *encbuf) Write(b []byte) (int, error) { func (w *encbuf) encode(val interface{}) error { rval := reflect.ValueOf(val) - ti, err := cachedTypeInfo(rval.Type(), tags{}) + writer, err := cachedWriter(rval.Type()) if err != nil { return err } - return ti.writer(rval, w) + return writer(rval, w) } func (w *encbuf) encodeStringHeader(size int) { @@ -347,16 +320,14 @@ func makeWriter(typ reflect.Type, ts tags) (writer, error) { switch { case typ == rawValueType: return writeRawValue, nil - case typ.Implements(encoderInterface): - return writeEncoder, nil - case kind != reflect.Ptr && reflect.PtrTo(typ).Implements(encoderInterface): - return writeEncoderNoPtr, nil - case kind == reflect.Interface: - return writeInterface, nil case typ.AssignableTo(reflect.PtrTo(bigInt)): return writeBigIntPtr, nil case typ.AssignableTo(bigInt): return writeBigIntNoPtr, nil + case kind == reflect.Ptr: + return makePtrWriter(typ, ts) + case reflect.PtrTo(typ).Implements(encoderInterface): + return makeEncoderWriter(typ), nil case isUint(kind): return writeUint, nil case kind == reflect.Bool: @@ -371,8 +342,8 @@ func makeWriter(typ reflect.Type, ts tags) (writer, error) { return makeSliceWriter(typ, ts) case kind == reflect.Struct: return makeStructWriter(typ) - case kind == reflect.Ptr: - return makePtrWriter(typ) + case kind == reflect.Interface: + return writeInterface, nil default: return nil, fmt.Errorf("rlp: type %v is not RLP-serializable", typ) } @@ -468,26 +439,6 @@ func writeString(val reflect.Value, w *encbuf) error { return nil } -func writeEncoder(val reflect.Value, w *encbuf) error { - return val.Interface().(Encoder).EncodeRLP(w) -} - -// writeEncoderNoPtr handles non-pointer values that implement Encoder -// with a pointer receiver. -func writeEncoderNoPtr(val reflect.Value, w *encbuf) error { - if !val.CanAddr() { - // We can't get the address. It would be possible to make the - // value addressable by creating a shallow copy, but this - // creates other problems so we're not doing it (yet). - // - // package json simply doesn't call MarshalJSON for cases like - // this, but encodes the value as if it didn't implement the - // interface. We don't want to handle it that way. - return fmt.Errorf("rlp: game over: unadressable value of type %v, EncodeRLP is pointer method", val.Type()) - } - return val.Addr().Interface().(Encoder).EncodeRLP(w) -} - func writeInterface(val reflect.Value, w *encbuf) error { if val.IsNil() { // Write empty list. This is consistent with the previous RLP @@ -497,17 +448,17 @@ func writeInterface(val reflect.Value, w *encbuf) error { return nil } eval := val.Elem() - ti, err := cachedTypeInfo(eval.Type(), tags{}) + writer, err := cachedWriter(eval.Type()) if err != nil { return err } - return ti.writer(eval, w) + return writer(eval, w) } func makeSliceWriter(typ reflect.Type, ts tags) (writer, error) { - etypeinfo, err := cachedTypeInfo1(typ.Elem(), tags{}) - if err != nil { - return nil, err + etypeinfo := cachedTypeInfo1(typ.Elem(), tags{}) + if etypeinfo.writerErr != nil { + return nil, etypeinfo.writerErr } writer := func(val reflect.Value, w *encbuf) error { if !ts.tail { @@ -529,6 +480,11 @@ func makeStructWriter(typ reflect.Type) (writer, error) { if err != nil { return nil, err } + for _, f := range fields { + if f.info.writerErr != nil { + return nil, structFieldError{typ, f.index, f.info.writerErr} + } + } writer := func(val reflect.Value, w *encbuf) error { lh := w.list() for _, f := range fields { @@ -542,42 +498,49 @@ func makeStructWriter(typ reflect.Type) (writer, error) { return writer, nil } -func makePtrWriter(typ reflect.Type) (writer, error) { - etypeinfo, err := cachedTypeInfo1(typ.Elem(), tags{}) - if err != nil { - return nil, err +func makePtrWriter(typ reflect.Type, ts tags) (writer, error) { + etypeinfo := cachedTypeInfo1(typ.Elem(), tags{}) + if etypeinfo.writerErr != nil { + return nil, etypeinfo.writerErr } - - // determine nil pointer handler - var nilfunc func(*encbuf) error - kind := typ.Elem().Kind() - switch { - case kind == reflect.Array && isByte(typ.Elem().Elem()): - nilfunc = func(w *encbuf) error { - w.str = append(w.str, 0x80) - return nil - } - case kind == reflect.Struct || kind == reflect.Array: - nilfunc = func(w *encbuf) error { - // encoding the zero value of a struct/array could trigger - // infinite recursion, avoid that. - w.listEnd(w.list()) - return nil - } - default: - zero := reflect.Zero(typ.Elem()) - nilfunc = func(w *encbuf) error { - return etypeinfo.writer(zero, w) - } + // Determine how to encode nil pointers. + var nilKind Kind + if ts.nilOK { + nilKind = ts.nilKind // use struct tag if provided + } else { + nilKind = defaultNilKind(typ.Elem()) } writer := func(val reflect.Value, w *encbuf) error { if val.IsNil() { - return nilfunc(w) + if nilKind == String { + w.str = append(w.str, 0x80) + } else { + w.listEnd(w.list()) + } + return nil } return etypeinfo.writer(val.Elem(), w) } - return writer, err + return writer, nil +} + +func makeEncoderWriter(typ reflect.Type) writer { + if typ.Implements(encoderInterface) { + return func(val reflect.Value, w *encbuf) error { + return val.Interface().(Encoder).EncodeRLP(w) + } + } + w := func(val reflect.Value, w *encbuf) error { + if !val.CanAddr() { + // package json simply doesn't call MarshalJSON for this case, but encodes the + // value as if it didn't implement the interface. We don't want to handle it that + // way. + return fmt.Errorf("rlp: unadressable value of type %v, EncodeRLP is pointer method", val.Type()) + } + return val.Addr().Interface().(Encoder).EncodeRLP(w) + } + return w } // putint writes i to the beginning of b in big endian byte diff --git a/rlp/encode_test.go b/rlp/encode_test.go index 827960f7c15a..b4b9e5128740 100644 --- a/rlp/encode_test.go +++ b/rlp/encode_test.go @@ -33,8 +33,9 @@ type testEncoder struct { func (e *testEncoder) EncodeRLP(w io.Writer) error { if e == nil { - w.Write([]byte{0, 0, 0, 0}) - } else if e.err != nil { + panic("EncodeRLP called on nil value") + } + if e.err != nil { return e.err } else { w.Write([]byte{0, 1, 0, 1, 0, 1, 0, 1, 0, 1}) @@ -42,6 +43,13 @@ func (e *testEncoder) EncodeRLP(w io.Writer) error { return nil } +type testEncoderValueMethod struct{} + +func (e testEncoderValueMethod) EncodeRLP(w io.Writer) error { + w.Write([]byte{0xFA, 0xFE, 0xF0}) + return nil +} + type byteEncoder byte func (e byteEncoder) EncodeRLP(w io.Writer) error { @@ -49,6 +57,13 @@ func (e byteEncoder) EncodeRLP(w io.Writer) error { return nil } +type undecodableEncoder func() + +func (f undecodableEncoder) EncodeRLP(w io.Writer) error { + w.Write([]byte{0xF5, 0xF5, 0xF5}) + return nil +} + type encodableReader struct { A, B uint } @@ -219,6 +234,7 @@ var encTests = []encTest{ {val: &tailRaw{A: 1, Tail: []RawValue{}}, output: "C101"}, {val: &tailRaw{A: 1, Tail: nil}, output: "C101"}, {val: &hasIgnoredField{A: 1, B: 2, C: 3}, output: "C20103"}, + {val: &intField{X: 3}, error: "rlp: type int is not RLP-serializable (struct field rlp.intField.X)"}, // nil {val: (*uint)(nil), output: "80"}, @@ -232,20 +248,66 @@ var encTests = []encTest{ {val: (*[]struct{ uint })(nil), output: "C0"}, {val: (*interface{})(nil), output: "C0"}, + // nil struct fields + { + val: struct { + X *[]byte + }{}, + output: "C180", + }, + { + val: struct { + X *[2]byte + }{}, + output: "C180", + }, + { + val: struct { + X *uint64 + }{}, + output: "C180", + }, + { + val: struct { + X *uint64 `rlp:"nilList"` + }{}, + output: "C1C0", + }, + { + val: struct { + X *[]uint64 + }{}, + output: "C1C0", + }, + { + val: struct { + X *[]uint64 `rlp:"nilString"` + }{}, + output: "C180", + }, + // interfaces {val: []io.Reader{reader}, output: "C3C20102"}, // the contained value is a struct // Encoder - {val: (*testEncoder)(nil), output: "00000000"}, + {val: (*testEncoder)(nil), output: "C0"}, {val: &testEncoder{}, output: "00010001000100010001"}, {val: &testEncoder{errors.New("test error")}, error: "test error"}, - // verify that pointer method testEncoder.EncodeRLP is called for + {val: struct{ E testEncoderValueMethod }{}, output: "C3FAFEF0"}, + {val: struct{ E *testEncoderValueMethod }{}, output: "C1C0"}, + + // Verify that the Encoder interface works for unsupported types like func(). + {val: undecodableEncoder(func() {}), output: "F5F5F5"}, + + // Verify that pointer method testEncoder.EncodeRLP is called for // addressable non-pointer values. {val: &struct{ TE testEncoder }{testEncoder{}}, output: "CA00010001000100010001"}, {val: &struct{ TE testEncoder }{testEncoder{errors.New("test error")}}, error: "test error"}, - // verify the error for non-addressable non-pointer Encoder - {val: testEncoder{}, error: "rlp: game over: unadressable value of type rlp.testEncoder, EncodeRLP is pointer method"}, - // verify the special case for []byte + + // Verify the error for non-addressable non-pointer Encoder. + {val: testEncoder{}, error: "rlp: unadressable value of type rlp.testEncoder, EncodeRLP is pointer method"}, + + // Verify Encoder takes precedence over []byte. {val: []byteEncoder{0, 1, 2, 3, 4}, output: "C5C0C0C0C0C0"}, } diff --git a/rlp/encoder_example_test.go b/rlp/encoder_example_test.go index 1cffa241c259..42c1c5c89064 100644 --- a/rlp/encoder_example_test.go +++ b/rlp/encoder_example_test.go @@ -28,15 +28,7 @@ type MyCoolType struct { // EncodeRLP writes x as RLP list [a, b] that omits the Name field. func (x *MyCoolType) EncodeRLP(w io.Writer) (err error) { - // Note: the receiver can be a nil pointer. This allows you to - // control the encoding of nil, but it also means that you have to - // check for a nil receiver. - if x == nil { - err = Encode(w, []uint{0, 0}) - } else { - err = Encode(w, []uint{x.a, x.b}) - } - return err + return Encode(w, []uint{x.a, x.b}) } func ExampleEncoder() { @@ -49,6 +41,6 @@ func ExampleEncoder() { fmt.Printf("%v → %X\n", t, bytes) // Output: - // → C28080 + // → C0 // &{foobar 5 6} → C20506 } diff --git a/rlp/typecache.go b/rlp/typecache.go index 8c2dd518e296..e9a1e3f9e26a 100644 --- a/rlp/typecache.go +++ b/rlp/typecache.go @@ -29,26 +29,34 @@ var ( ) type typeinfo struct { - decoder - writer + decoder decoder + decoderErr error // error from makeDecoder + writer writer + writerErr error // error from makeWriter } -// represents struct tags +// tags represents struct tags. type tags struct { // rlp:"nil" controls whether empty input results in a nil pointer. nilOK bool + + // This controls whether nil pointers are encoded/decoded as empty strings + // or empty lists. + nilKind Kind + // rlp:"tail" controls whether this field swallows additional list // elements. It can only be set for the last field, which must be // of slice type. tail bool + // rlp:"-" ignores fields. ignored bool } +// typekey is the key of a type in typeCache. It includes the struct tags because +// they might generate a different decoder. type typekey struct { reflect.Type - // the key must include the struct tags because they - // might generate a different decoder. tags } @@ -56,12 +64,22 @@ type decoder func(*Stream, reflect.Value) error type writer func(reflect.Value, *encbuf) error -func cachedTypeInfo(typ reflect.Type, tags tags) (*typeinfo, error) { +func cachedDecoder(typ reflect.Type) (decoder, error) { + info := cachedTypeInfo(typ, tags{}) + return info.decoder, info.decoderErr +} + +func cachedWriter(typ reflect.Type) (writer, error) { + info := cachedTypeInfo(typ, tags{}) + return info.writer, info.writerErr +} + +func cachedTypeInfo(typ reflect.Type, tags tags) *typeinfo { typeCacheMutex.RLock() info := typeCache[typekey{typ, tags}] typeCacheMutex.RUnlock() if info != nil { - return info, nil + return info } // not in the cache, need to generate info for this type. typeCacheMutex.Lock() @@ -69,25 +87,20 @@ func cachedTypeInfo(typ reflect.Type, tags tags) (*typeinfo, error) { return cachedTypeInfo1(typ, tags) } -func cachedTypeInfo1(typ reflect.Type, tags tags) (*typeinfo, error) { +func cachedTypeInfo1(typ reflect.Type, tags tags) *typeinfo { key := typekey{typ, tags} info := typeCache[key] if info != nil { // another goroutine got the write lock first - return info, nil + return info } // put a dummy value into the cache before generating. // if the generator tries to lookup itself, it will get // the dummy value and won't call itself recursively. - typeCache[key] = new(typeinfo) - info, err := genTypeInfo(typ, tags) - if err != nil { - // remove the dummy value if the generator fails - delete(typeCache, key) - return nil, err - } - *typeCache[key] = *info - return typeCache[key], err + info = new(typeinfo) + typeCache[key] = info + info.generate(typ, tags) + return info } type field struct { @@ -96,26 +109,43 @@ type field struct { } func structFields(typ reflect.Type) (fields []field, err error) { + lastPublic := lastPublicField(typ) for i := 0; i < typ.NumField(); i++ { if f := typ.Field(i); f.PkgPath == "" { // exported - tags, err := parseStructTag(typ, i) + tags, err := parseStructTag(typ, i, lastPublic) if err != nil { return nil, err } if tags.ignored { continue } - info, err := cachedTypeInfo1(f.Type, tags) - if err != nil { - return nil, err - } + info := cachedTypeInfo1(f.Type, tags) fields = append(fields, field{i, info}) } } return fields, nil } -func parseStructTag(typ reflect.Type, fi int) (tags, error) { +type structFieldError struct { + typ reflect.Type + field int + err error +} + +func (e structFieldError) Error() string { + return fmt.Sprintf("%v (struct field %v.%s)", e.err, e.typ, e.typ.Field(e.field).Name) +} + +type structTagError struct { + typ reflect.Type + field, tag, err string +} + +func (e structTagError) Error() string { + return fmt.Sprintf("rlp: invalid struct tag %q for %v.%s (%s)", e.tag, e.typ, e.field, e.err) +} + +func parseStructTag(typ reflect.Type, fi, lastPublic int) (tags, error) { f := typ.Field(fi) var ts tags for _, t := range strings.Split(f.Tag.Get("rlp"), ",") { @@ -123,15 +153,26 @@ func parseStructTag(typ reflect.Type, fi int) (tags, error) { case "": case "-": ts.ignored = true - case "nil": + case "nil", "nilString", "nilList": ts.nilOK = true + if f.Type.Kind() != reflect.Ptr { + return ts, structTagError{typ, f.Name, t, "field is not a pointer"} + } + switch t { + case "nil": + ts.nilKind = defaultNilKind(f.Type.Elem()) + case "nilString": + ts.nilKind = String + case "nilList": + ts.nilKind = List + } case "tail": ts.tail = true - if fi != typ.NumField()-1 { - return ts, fmt.Errorf(`rlp: invalid struct tag "tail" for %v.%s (must be on last field)`, typ, f.Name) + if fi != lastPublic { + return ts, structTagError{typ, f.Name, t, "must be on last field"} } if f.Type.Kind() != reflect.Slice { - return ts, fmt.Errorf(`rlp: invalid struct tag "tail" for %v.%s (field type is not slice)`, typ, f.Name) + return ts, structTagError{typ, f.Name, t, "field type is not slice"} } default: return ts, fmt.Errorf("rlp: unknown struct tag %q on %v.%s", t, typ, f.Name) @@ -140,17 +181,35 @@ func parseStructTag(typ reflect.Type, fi int) (tags, error) { return ts, nil } -func genTypeInfo(typ reflect.Type, tags tags) (info *typeinfo, err error) { - info = new(typeinfo) - if info.decoder, err = makeDecoder(typ, tags); err != nil { - return nil, err +func lastPublicField(typ reflect.Type) int { + last := 0 + for i := 0; i < typ.NumField(); i++ { + if typ.Field(i).PkgPath == "" { + last = i + } } - if info.writer, err = makeWriter(typ, tags); err != nil { - return nil, err + return last +} + +func (i *typeinfo) generate(typ reflect.Type, tags tags) { + i.decoder, i.decoderErr = makeDecoder(typ, tags) + i.writer, i.writerErr = makeWriter(typ, tags) +} + +// defaultNilKind determines whether a nil pointer to typ encodes/decodes +// as an empty string or empty list. +func defaultNilKind(typ reflect.Type) Kind { + k := typ.Kind() + if isUint(k) || k == reflect.String || k == reflect.Bool || isByteArray(typ) { + return String } - return info, nil + return List } func isUint(k reflect.Kind) bool { return k >= reflect.Uint && k <= reflect.Uintptr } + +func isByteArray(typ reflect.Type) bool { + return (typ.Kind() == reflect.Slice || typ.Kind() == reflect.Array) && isByte(typ.Elem()) +} diff --git a/rpc/client.go b/rpc/client.go index d6c65cb1bf74..a04198ad8783 100644 --- a/rpc/client.go +++ b/rpc/client.go @@ -18,35 +18,31 @@ package rpc import ( "bytes" - "container/list" "context" "encoding/json" "errors" "fmt" - "net" "net/url" "reflect" "strconv" - "strings" - "sync" "sync/atomic" "time" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) var ( ErrClientQuit = errors.New("client is closed") ErrNoResult = errors.New("no result in JSON-RPC response") ErrSubscriptionQueueOverflow = errors.New("subscription queue overflow") + errClientReconnected = errors.New("client reconnected") + errDead = errors.New("connection lost") ) const ( // Timeouts - tcpKeepAliveInterval = 30 * time.Second - defaultDialTimeout = 10 * time.Second // used when dialing if the context has no deadline - defaultWriteTimeout = 10 * time.Second // used for calls if the context has no deadline - subscribeTimeout = 5 * time.Second // overall timeout eth_subscribe, rpc_modules calls + defaultDialTimeout = 10 * time.Second // used if context has no deadline + subscribeTimeout = 5 * time.Second // overall timeout eth_subscribe, rpc_modules calls ) const ( @@ -76,56 +72,57 @@ type BatchElem struct { Error error } -// A value of this type can a JSON-RPC request, notification, successful response or -// error response. Which one it is depends on the fields. -type jsonrpcMessage struct { - Version string `json:"jsonrpc"` - ID json.RawMessage `json:"id,omitempty"` - Method string `json:"method,omitempty"` - Params json.RawMessage `json:"params,omitempty"` - Error *jsonError `json:"error,omitempty"` - Result json.RawMessage `json:"result,omitempty"` -} +// Client represents a connection to an RPC server. +type Client struct { + idgen func() ID // for subscriptions + isHTTP bool + services *serviceRegistry -func (msg *jsonrpcMessage) isNotification() bool { - return msg.ID == nil && msg.Method != "" -} + idCounter uint32 -func (msg *jsonrpcMessage) isResponse() bool { - return msg.hasValidID() && msg.Method == "" && len(msg.Params) == 0 -} + // This function, if non-nil, is called when the connection is lost. + reconnectFunc reconnectFunc + + // writeConn is used for writing to the connection on the caller's goroutine. It should + // only be accessed outside of dispatch, with the write lock held. The write lock is + // taken by sending on requestOp and released by sending on sendDone. + writeConn jsonWriter -func (msg *jsonrpcMessage) hasValidID() bool { - return len(msg.ID) > 0 && msg.ID[0] != '{' && msg.ID[0] != '[' + // for dispatch + close chan struct{} + closing chan struct{} // closed when client is quitting + didClose chan struct{} // closed when client quits + reconnected chan ServerCodec // where write/reconnect sends the new connection + readOp chan readOp // read messages + readErr chan error // errors from read + reqInit chan *requestOp // register response IDs, takes write lock + reqSent chan error // signals write completion, releases write lock + reqTimeout chan *requestOp // removes response IDs when call timeout expires } -func (msg *jsonrpcMessage) String() string { - b, _ := json.Marshal(msg) - return string(b) +type reconnectFunc func(ctx context.Context) (ServerCodec, error) + +type clientContextKey struct{} + +type clientConn struct { + codec ServerCodec + handler *handler } -// Client represents a connection to an RPC server. -type Client struct { - idCounter uint32 - connectFunc func(ctx context.Context) (net.Conn, error) - isHTTP bool +func (c *Client) newClientConn(conn ServerCodec) *clientConn { + ctx := context.WithValue(context.Background(), clientContextKey{}, c) + handler := newHandler(ctx, conn, c.idgen, c.services) + return &clientConn{conn, handler} +} - // writeConn is only safe to access outside dispatch, with the - // write lock held. The write lock is taken by sending on - // requestOp and released by sending on sendDone. - writeConn net.Conn +func (cc *clientConn) close(err error, inflightReq *requestOp) { + cc.handler.close(err, inflightReq) + cc.codec.close() +} - // for dispatch - close chan struct{} - closing chan struct{} // closed when client is quitting - didClose chan struct{} // closed when client quits - reconnected chan net.Conn // where write/reconnect sends the new connection - readErr chan error // errors from read - readResp chan []*jsonrpcMessage // valid messages from read - requestOp chan *requestOp // for registering response IDs - sendDone chan error // signals write completion, releases write lock - respWait map[string]*requestOp // active requests - subs map[string]*ClientSubscription // active subscriptions +type readOp struct { + msgs []*jsonrpcMessage + batch bool } type requestOp struct { @@ -135,9 +132,16 @@ type requestOp struct { sub *ClientSubscription // only set for EthSubscribe requests } -func (op *requestOp) wait(ctx context.Context) (*jsonrpcMessage, error) { +func (op *requestOp) wait(ctx context.Context, c *Client) (*jsonrpcMessage, error) { select { case <-ctx.Done(): + // Send the timeout to dispatch so it can remove the request IDs. + if !c.isHTTP { + select { + case c.reqTimeout <- op: + case <-c.closing: + } + } return nil, ctx.Err() case resp := <-op.resp: return resp, op.err @@ -181,36 +185,57 @@ func DialContext(ctx context.Context, rawurl string) (*Client, error) { } } -func newClient(initctx context.Context, connectFunc func(context.Context) (net.Conn, error)) (*Client, error) { - conn, err := connectFunc(initctx) +// Client retrieves the client from the context, if any. This can be used to perform +// 'reverse calls' in a handler method. +func ClientFromContext(ctx context.Context) (*Client, bool) { + client, ok := ctx.Value(clientContextKey{}).(*Client) + return client, ok +} + +func newClient(initctx context.Context, connect reconnectFunc) (*Client, error) { + conn, err := connect(initctx) if err != nil { return nil, err } + c := initClient(conn, randomIDGenerator(), new(serviceRegistry)) + c.reconnectFunc = connect + return c, nil +} + +func initClient(conn ServerCodec, idgen func() ID, services *serviceRegistry) *Client { _, isHTTP := conn.(*httpConn) c := &Client{ - writeConn: conn, + idgen: idgen, isHTTP: isHTTP, - connectFunc: connectFunc, + services: services, + writeConn: conn, close: make(chan struct{}), closing: make(chan struct{}), didClose: make(chan struct{}), - reconnected: make(chan net.Conn), + reconnected: make(chan ServerCodec), + readOp: make(chan readOp), readErr: make(chan error), - readResp: make(chan []*jsonrpcMessage), - requestOp: make(chan *requestOp), - sendDone: make(chan error, 1), - respWait: make(map[string]*requestOp), - subs: make(map[string]*ClientSubscription), + reqInit: make(chan *requestOp), + reqSent: make(chan error, 1), + reqTimeout: make(chan *requestOp), } if !isHTTP { go c.dispatch(conn) } - return c, nil + return c +} + +// RegisterName creates a service for the given receiver type under the given name. When no +// methods on the given receiver match the criteria to be either a RPC method or a +// subscription an error is returned. Otherwise a new service is created and added to the +// service collection this client provides to the server. +func (c *Client) RegisterName(name string, receiver interface{}) error { + return c.services.registerName(name, receiver) } func (c *Client) nextID() json.RawMessage { id := atomic.AddUint32(&c.idCounter, 1) - return []byte(strconv.FormatUint(uint64(id), 10)) + return strconv.AppendUint(nil, uint64(id), 10) } // SupportedModules calls the rpc_modules method, retrieving the list of @@ -267,7 +292,7 @@ func (c *Client) CallContext(ctx context.Context, result interface{}, method str } // dispatch has accepted the request and will close the channel when it quits. - switch resp, err := op.wait(ctx); { + switch resp, err := op.wait(ctx, c); { case err != nil: return err case resp.Error != nil: @@ -325,7 +350,7 @@ func (c *Client) BatchCallContext(ctx context.Context, b []BatchElem) error { // Wait for all responses to come back. for n := 0; n < len(b) && err == nil; n++ { var resp *jsonrpcMessage - resp, err = op.wait(ctx) + resp, err = op.wait(ctx, c) if err != nil { break } @@ -352,6 +377,22 @@ func (c *Client) BatchCallContext(ctx context.Context, b []BatchElem) error { return err } +// Notify sends a notification, i.e. a method call that doesn't expect a response. +func (c *Client) Notify(ctx context.Context, method string, args ...interface{}) error { + op := new(requestOp) + msg, err := c.newMessage(method, args...) + if err != nil { + return err + } + msg.ID = nil + + if c.isHTTP { + return c.sendHTTP(ctx, op, msg) + } else { + return c.send(ctx, op, msg) + } +} + // 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...) @@ -370,7 +411,7 @@ func (c *Client) ShhSubscribe(ctx context.Context, channel interface{}, args ... // The context argument cancels the RPC request that sets up the subscription but has no // effect on the subscription after Subscribe has returned. // -// Slow subscribers will be dropped eventually. Client buffers up to 8000 notifications +// Slow subscribers will be dropped eventually. Client buffers up to 20000 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. @@ -402,30 +443,30 @@ func (c *Client) Subscribe(ctx context.Context, namespace string, channel interf if err := c.send(ctx, op, msg); err != nil { return nil, err } - if _, err := op.wait(ctx); err != nil { + if _, err := op.wait(ctx, c); err != nil { return nil, err } return op.sub, nil } func (c *Client) newMessage(method string, paramsIn ...interface{}) (*jsonrpcMessage, error) { - params, err := json.Marshal(paramsIn) - if err != nil { - return nil, err + msg := &jsonrpcMessage{Version: vsn, ID: c.nextID(), Method: method} + if paramsIn != nil { // prevent sending "params":null + var err error + if msg.Params, err = json.Marshal(paramsIn); err != nil { + return nil, err + } } - return &jsonrpcMessage{Version: "2.0", ID: c.nextID(), Method: method, Params: params}, nil + return msg, nil } // send registers op with the dispatch loop, then sends msg on the connection. // if sending fails, op is deregistered. func (c *Client) send(ctx context.Context, op *requestOp, msg interface{}) error { select { - case c.requestOp <- op: - log.Trace("", "msg", log.Lazy{Fn: func() string { - return fmt.Sprint("sending ", msg) - }}) + case c.reqInit <- op: err := c.write(ctx, msg) - c.sendDone <- err + c.reqSent <- err return err case <-ctx.Done(): // This can happen if the client is overloaded or unable to keep up with @@ -433,25 +474,17 @@ func (c *Client) send(ctx context.Context, op *requestOp, msg interface{}) error return ctx.Err() case <-c.closing: return ErrClientQuit - case <-c.didClose: - return ErrClientQuit } } func (c *Client) write(ctx context.Context, msg interface{}) error { - deadline, ok := ctx.Deadline() - if !ok { - deadline = time.Now().Add(defaultWriteTimeout) - } // The previous write failed. Try to establish a new connection. if c.writeConn == nil { if err := c.reconnect(ctx); err != nil { return err } } - c.writeConn.SetWriteDeadline(deadline) - err := json.NewEncoder(c.writeConn).Encode(msg) - c.writeConn.SetWriteDeadline(time.Time{}) + err := c.writeConn.writeJSON(ctx, msg) if err != nil { c.writeConn = nil } @@ -459,9 +492,18 @@ func (c *Client) write(ctx context.Context, msg interface{}) error { } func (c *Client) reconnect(ctx context.Context) error { - newconn, err := c.connectFunc(ctx) + if c.reconnectFunc == nil { + return errDead + } + + if _, ok := ctx.Deadline(); !ok { + var cancel func() + ctx, cancel = context.WithTimeout(ctx, defaultDialTimeout) + defer cancel() + } + newconn, err := c.reconnectFunc(ctx) if err != nil { - log.Trace(fmt.Sprintf("reconnect failed: %v", err)) + log.Trace("RPC client reconnect failed", "err", err) return err } select { @@ -469,7 +511,7 @@ func (c *Client) reconnect(ctx context.Context) error { c.writeConn = newconn return nil case <-c.didClose: - newconn.Close() + newconn.close() return ErrClientQuit } } @@ -477,322 +519,107 @@ func (c *Client) reconnect(ctx context.Context) error { // dispatch is the main loop of the client. // It sends read messages to waiting calls to Call and BatchCall // and subscription notifications to registered subscriptions. -func (c *Client) dispatch(conn net.Conn) { - // Spawn the initial read loop. - go c.read(conn) - +func (c *Client) dispatch(codec ServerCodec) { var ( - lastOp *requestOp // tracks last send operation - requestOpLock = c.requestOp // nil while the send lock is held - reading = true // if true, a read loop is running + lastOp *requestOp // tracks last send operation + reqInitLock = c.reqInit // nil while the send lock is held + conn = c.newClientConn(codec) + reading = true ) - defer close(c.didClose) defer func() { close(c.closing) - c.closeRequestOps(ErrClientQuit) - conn.Close() if reading { - // Empty read channels until read is dead. - for { - select { - case <-c.readResp: - case <-c.readErr: - return - } - } + conn.close(ErrClientQuit, nil) + c.drainRead() } + close(c.didClose) }() + // Spawn the initial read loop. + go c.read(codec) + for { select { case <-c.close: return - // Read path. - case batch := <-c.readResp: - for _, msg := range batch { - switch { - case msg.isNotification(): - log.Trace("", "msg", log.Lazy{Fn: func() string { - return fmt.Sprint("<-readResp: notification ", msg) - }}) - c.handleNotification(msg) - case msg.isResponse(): - log.Trace("", "msg", log.Lazy{Fn: func() string { - return fmt.Sprint("<-readResp: response ", msg) - }}) - c.handleResponse(msg) - default: - log.Debug("", "msg", log.Lazy{Fn: func() string { - return fmt.Sprint("<-readResp: dropping weird message", msg) - }}) - // TODO: maybe close - } + // Read path: + case op := <-c.readOp: + if op.batch { + conn.handler.handleBatch(op.msgs) + } else { + conn.handler.handleMsg(op.msgs[0]) } case err := <-c.readErr: - log.Debug("<-readErr", "err", err) - c.closeRequestOps(err) - conn.Close() + conn.handler.log.Debug("RPC connection read error", "err", err) + conn.close(err, lastOp) reading = false - case newconn := <-c.reconnected: - log.Debug("<-reconnected", "reading", reading, "remote", conn.RemoteAddr()) + // Reconnect: + case newcodec := <-c.reconnected: + log.Debug("RPC client reconnected", "reading", reading, "conn", newcodec.remoteAddr()) if reading { - // Wait for the previous read loop to exit. This is a rare case. - conn.Close() - <-c.readErr + // Wait for the previous read loop to exit. This is a rare case which + // happens if this loop isn't notified in time after the connection breaks. + // In those cases the caller will notice first and reconnect. Closing the + // handler terminates all waiting requests (closing op.resp) except for + // lastOp, which will be transferred to the new handler. + conn.close(errClientReconnected, lastOp) + c.drainRead() } - go c.read(newconn) + go c.read(newcodec) reading = true - conn = newconn - - // Send path. - case op := <-requestOpLock: - // Stop listening for further send ops until the current one is done. - requestOpLock = nil + conn = c.newClientConn(newcodec) + // Re-register the in-flight request on the new handler + // because that's where it will be sent. + conn.handler.addRequestOp(lastOp) + + // Send path: + case op := <-reqInitLock: + // Stop listening for further requests until the current one has been sent. + reqInitLock = nil lastOp = op - for _, id := range op.ids { - c.respWait[string(id)] = op - } + conn.handler.addRequestOp(op) - case err := <-c.sendDone: + case err := <-c.reqSent: if err != nil { - // Remove response handlers for the last send. We remove those here - // because the error is already handled in Call or BatchCall. When the - // read loop goes down, it will signal all other current operations. - for _, id := range lastOp.ids { - delete(c.respWait, string(id)) - } + // Remove response handlers for the last send. When the read loop + // goes down, it will signal all other current operations. + conn.handler.removeRequestOp(lastOp) } - // Listen for send ops again. - requestOpLock = c.requestOp + // Let the next request in. + reqInitLock = c.reqInit lastOp = nil - } - } -} - -// closeRequestOps unblocks pending send ops and active subscriptions. -func (c *Client) closeRequestOps(err error) { - didClose := make(map[*requestOp]bool) - for id, op := range c.respWait { - // Remove the op so that later calls will not close op.resp again. - delete(c.respWait, id) - - if !didClose[op] { - op.err = err - close(op.resp) - didClose[op] = true + case op := <-c.reqTimeout: + conn.handler.removeRequestOp(op) } } - for id, sub := range c.subs { - delete(c.subs, id) - sub.quitWithError(err, false) - } -} - -func (c *Client) handleNotification(msg *jsonrpcMessage) { - if !strings.HasSuffix(msg.Method, notificationMethodSuffix) { - log.Debug("dropping non-subscription message", "msg", msg) - return - } - var subResult struct { - ID string `json:"subscription"` - Result json.RawMessage `json:"result"` - } - if err := json.Unmarshal(msg.Params, &subResult); err != nil { - log.Debug("dropping invalid subscription message", "msg", msg) - return - } - if c.subs[subResult.ID] != nil { - c.subs[subResult.ID].deliver(subResult.Result) - } -} - -func (c *Client) handleResponse(msg *jsonrpcMessage) { - op := c.respWait[string(msg.ID)] - if op == nil { - log.Debug("unsolicited response", "msg", msg) - return - } - delete(c.respWait, string(msg.ID)) - // For normal responses, just forward the reply to Call/BatchCall. - if op.sub == nil { - op.resp <- msg - return - } - // For subscription responses, start the subscription if the server - // indicates success. EthSubscribe gets unblocked in either case through - // the op.resp channel. - defer close(op.resp) - if msg.Error != nil { - op.err = msg.Error - return - } - if op.err = json.Unmarshal(msg.Result, &op.sub.subid); op.err == nil { - go op.sub.start() - c.subs[op.sub.subid] = op.sub - } } -// Reading happens on a dedicated goroutine. - -func (c *Client) read(conn net.Conn) error { - var ( - buf json.RawMessage - dec = json.NewDecoder(conn) - ) - readMessage := func() (rs []*jsonrpcMessage, err error) { - buf = buf[:0] - if err = dec.Decode(&buf); err != nil { - return nil, err - } - if isBatch(buf) { - err = json.Unmarshal(buf, &rs) - } else { - rs = make([]*jsonrpcMessage, 1) - err = json.Unmarshal(buf, &rs[0]) - } - return rs, err - } - +// drainRead drops read messages until an error occurs. +func (c *Client) drainRead() { for { - resp, err := readMessage() - if err != nil { - c.readErr <- err - return err - } - c.readResp <- resp - } -} - -// Subscriptions. - -// A ClientSubscription represents a subscription established through EthSubscribe. -type ClientSubscription struct { - client *Client - etype reflect.Type - channel reflect.Value - namespace string - subid string - in chan json.RawMessage - - quitOnce sync.Once // ensures quit is closed once - quit chan struct{} // quit is closed when the subscription exits - errOnce sync.Once // ensures err is closed once - err chan error -} - -func newClientSubscription(c *Client, namespace string, channel reflect.Value) *ClientSubscription { - sub := &ClientSubscription{ - client: c, - namespace: namespace, - etype: channel.Type().Elem(), - channel: channel, - quit: make(chan struct{}), - err: make(chan error, 1), - in: make(chan json.RawMessage), - } - return sub -} - -// Err returns the subscription error channel. The intended use of Err is to schedule -// resubscription when the client connection is closed unexpectedly. -// -// The error channel receives a value when the subscription has ended due -// to an error. The received error is nil if Close has been called -// on the underlying client and no other error has occurred. -// -// The error channel is closed when Unsubscribe is called on the subscription. -func (sub *ClientSubscription) Err() <-chan error { - return sub.err -} - -// Unsubscribe unsubscribes the notification and closes the error channel. -// It can safely be called more than once. -func (sub *ClientSubscription) Unsubscribe() { - sub.quitWithError(nil, true) - sub.errOnce.Do(func() { close(sub.err) }) -} - -func (sub *ClientSubscription) quitWithError(err error, unsubscribeServer bool) { - sub.quitOnce.Do(func() { - // The dispatch loop won't be able to execute the unsubscribe call - // if it is blocked on deliver. Close sub.quit first because it - // unblocks deliver. - close(sub.quit) - if unsubscribeServer { - sub.requestUnsubscribe() - } - if err != nil { - if err == ErrClientQuit { - err = nil // Adhere to subscription semantics. - } - sub.err <- err + select { + case <-c.readOp: + case <-c.readErr: + return } - }) -} - -func (sub *ClientSubscription) deliver(result json.RawMessage) (ok bool) { - select { - case sub.in <- result: - return true - case <-sub.quit: - return false } } -func (sub *ClientSubscription) start() { - sub.quitWithError(sub.forward()) -} - -func (sub *ClientSubscription) forward() (err error, unsubscribeServer bool) { - cases := []reflect.SelectCase{ - {Dir: reflect.SelectRecv, Chan: reflect.ValueOf(sub.quit)}, - {Dir: reflect.SelectRecv, Chan: reflect.ValueOf(sub.in)}, - {Dir: reflect.SelectSend, Chan: sub.channel}, - } - buffer := list.New() - defer buffer.Init() +// read decodes RPC messages from a codec, feeding them into dispatch. +func (c *Client) read(codec ServerCodec) { for { - var chosen int - var recv reflect.Value - if buffer.Len() == 0 { - // Idle, omit send case. - chosen, recv, _ = reflect.Select(cases[:2]) - } else { - // Non-empty buffer, send the first queued item. - cases[2].Send = reflect.ValueOf(buffer.Front().Value) - chosen, recv, _ = reflect.Select(cases) + msgs, batch, err := codec.readBatch() + if _, ok := err.(*json.SyntaxError); ok { + codec.writeJSON(context.Background(), errorMessage(&parseError{err.Error()})) } - - switch chosen { - case 0: // <-sub.quit - return nil, false - case 1: // <-sub.in - val, err := sub.unmarshal(recv.Interface().(json.RawMessage)) - if err != nil { - return err, true - } - if buffer.Len() == maxClientSubscriptionBuffer { - return ErrSubscriptionQueueOverflow, true - } - buffer.PushBack(val) - case 2: // sub.channel<- - cases[2].Send = reflect.Value{} // Don't hold onto the value. - buffer.Remove(buffer.Front()) + if err != nil { + c.readErr <- err + return } + c.readOp <- readOp{msgs, batch} } } - -func (sub *ClientSubscription) unmarshal(result json.RawMessage) (interface{}, error) { - val := reflect.New(sub.etype) - err := json.Unmarshal(result, val.Interface()) - return val.Elem().Interface(), err -} - -func (sub *ClientSubscription) requestUnsubscribe() error { - var result interface{} - return sub.client.Call(&result, sub.namespace+unsubscribeMethodSuffix, sub.subid) -} diff --git a/rpc/client_example_test.go b/rpc/client_example_test.go index 2203e59a5ec2..3bb8717b8061 100644 --- a/rpc/client_example_test.go +++ b/rpc/client_example_test.go @@ -22,7 +22,7 @@ import ( "math/big" "time" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/rpc" ) // In this example, our client wishes to track the latest 'block number' diff --git a/rpc/client_test.go b/rpc/client_test.go index 5179ba561c62..0d551402228e 100644 --- a/rpc/client_test.go +++ b/rpc/client_test.go @@ -31,40 +31,40 @@ import ( "time" "github.com/davecgh/go-spew/spew" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) func TestClientRequest(t *testing.T) { - server := newTestServer("service", new(Service)) + server := newTestServer() defer server.Stop() client := DialInProc(server) defer client.Close() - var resp Result - if err := client.Call(&resp, "service_echo", "hello", 10, &Args{"world"}); err != nil { + var resp echoResult + if err := client.Call(&resp, "test_echo", "hello", 10, &echoArgs{"world"}); err != nil { t.Fatal(err) } - if !reflect.DeepEqual(resp, Result{"hello", 10, &Args{"world"}}) { + if !reflect.DeepEqual(resp, echoResult{"hello", 10, &echoArgs{"world"}}) { t.Errorf("incorrect result %#v", resp) } } func TestClientBatchRequest(t *testing.T) { - server := newTestServer("service", new(Service)) + server := newTestServer() defer server.Stop() client := DialInProc(server) defer client.Close() batch := []BatchElem{ { - Method: "service_echo", - Args: []interface{}{"hello", 10, &Args{"world"}}, - Result: new(Result), + Method: "test_echo", + Args: []interface{}{"hello", 10, &echoArgs{"world"}}, + Result: new(echoResult), }, { - Method: "service_echo", - Args: []interface{}{"hello2", 11, &Args{"world"}}, - Result: new(Result), + Method: "test_echo", + Args: []interface{}{"hello2", 11, &echoArgs{"world"}}, + Result: new(echoResult), }, { Method: "no_such_method", @@ -77,20 +77,20 @@ func TestClientBatchRequest(t *testing.T) { } wantResult := []BatchElem{ { - Method: "service_echo", - Args: []interface{}{"hello", 10, &Args{"world"}}, - Result: &Result{"hello", 10, &Args{"world"}}, + Method: "test_echo", + Args: []interface{}{"hello", 10, &echoArgs{"world"}}, + Result: &echoResult{"hello", 10, &echoArgs{"world"}}, }, { - Method: "service_echo", - Args: []interface{}{"hello2", 11, &Args{"world"}}, - Result: &Result{"hello2", 11, &Args{"world"}}, + Method: "test_echo", + Args: []interface{}{"hello2", 11, &echoArgs{"world"}}, + Result: &echoResult{"hello2", 11, &echoArgs{"world"}}, }, { Method: "no_such_method", Args: []interface{}{1, 2, 3}, Result: new(int), - Error: &jsonError{Code: -32601, Message: "The method no_such_method_ does not exist/is not available"}, + Error: &jsonError{Code: -32601, Message: "the method no_such_method does not exist/is not available"}, }, } if !reflect.DeepEqual(batch, wantResult) { @@ -98,6 +98,17 @@ func TestClientBatchRequest(t *testing.T) { } } +func TestClientNotify(t *testing.T) { + server := newTestServer() + defer server.Stop() + client := DialInProc(server) + defer client.Close() + + if err := client.Notify(context.Background(), "test_echo", "hello", 10, &echoArgs{"world"}); err != nil { + t.Fatal(err) + } +} + // func TestClientCancelInproc(t *testing.T) { testClientCancel("inproc", t) } func TestClientCancelWebsocket(t *testing.T) { testClientCancel("ws", t) } func TestClientCancelHTTP(t *testing.T) { testClientCancel("http", t) } @@ -106,7 +117,12 @@ func TestClientCancelIPC(t *testing.T) { testClientCancel("ipc", t) } // This test checks that requests made through CallContext can be canceled by canceling // the context. func testClientCancel(transport string, t *testing.T) { - server := newTestServer("service", new(Service)) + // These tests take a lot of time, run them all at once. + // You probably want to run with -parallel 1 or comment out + // the call to t.Parallel if you enable the logging. + t.Parallel() + + server := newTestServer() defer server.Stop() // What we want to achieve is that the context gets canceled @@ -142,11 +158,6 @@ func testClientCancel(transport string, t *testing.T) { panic("unknown transport: " + transport) } - // These tests take a lot of time, run them all at once. - // You probably want to run with -parallel 1 or comment out - // the call to t.Parallel if you enable the logging. - t.Parallel() - // The actual test starts here. var ( wg sync.WaitGroup @@ -174,7 +185,8 @@ func testClientCancel(transport string, t *testing.T) { } // Now perform a call with the context. // The key thing here is that no call will ever complete successfully. - err := client.CallContext(ctx, nil, "service_sleep", 2*maxContextCancelTimeout) + sleepTime := maxContextCancelTimeout + 20*time.Millisecond + err := client.CallContext(ctx, nil, "test_sleep", sleepTime) if err != nil { log.Debug(fmt.Sprint("got expected error:", err)) } else { @@ -191,7 +203,7 @@ func testClientCancel(transport string, t *testing.T) { } func TestClientSubscribeInvalidArg(t *testing.T) { - server := newTestServer("service", new(Service)) + server := newTestServer() defer server.Stop() client := DialInProc(server) defer client.Close() @@ -221,14 +233,14 @@ func TestClientSubscribeInvalidArg(t *testing.T) { } func TestClientSubscribe(t *testing.T) { - server := newTestServer("eth", new(NotificationTestService)) + server := newTestServer() defer server.Stop() client := DialInProc(server) defer client.Close() nc := make(chan int) count := 10 - sub, err := client.EthSubscribe(context.Background(), nc, "someSubscription", count, 0) + sub, err := client.Subscribe(context.Background(), "nftest", nc, "someSubscription", count, 0) if err != nil { t.Fatal("can't subscribe:", err) } @@ -251,46 +263,17 @@ 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. +// In this test, the connection drops while Subscribe is waiting for a response. func TestClientSubscribeClose(t *testing.T) { - service := &NotificationTestService{ + server := newTestServer() + service := ¬ificationTestService{ gotHangSubscriptionReq: make(chan struct{}), unblockHangSubscription: make(chan struct{}), } - server := newTestServer("eth", service) + if err := server.RegisterName("nftest2", service); err != nil { + t.Fatal(err) + } + defer server.Stop() client := DialInProc(server) defer client.Close() @@ -302,7 +285,7 @@ func TestClientSubscribeClose(t *testing.T) { err error ) go func() { - sub, err = client.EthSubscribe(context.Background(), nc, "hangSubscription", 999) + sub, err = client.Subscribe(context.Background(), "nftest2", nc, "hangSubscription", 999) errc <- err }() @@ -313,27 +296,26 @@ func TestClientSubscribeClose(t *testing.T) { select { case err := <-errc: if err == nil { - t.Errorf("EthSubscribe returned nil error after Close") + t.Errorf("Subscribe returned nil error after Close") } if sub != nil { - t.Error("EthSubscribe returned non-nil subscription after Close") + t.Error("Subscribe returned non-nil subscription after Close") } case <-time.After(1 * time.Second): - t.Fatalf("EthSubscribe did not return within 1s after Close") + t.Fatalf("Subscribe did not return within 1s after Close") } } // This test reproduces https://github.com/ethereum/go-ethereum/issues/17837 where the // client hangs during shutdown when Unsubscribe races with Client.Close. func TestClientCloseUnsubscribeRace(t *testing.T) { - service := &NotificationTestService{} - server := newTestServer("eth", service) + server := newTestServer() defer server.Stop() for i := 0; i < 20; i++ { client := DialInProc(server) nc := make(chan int) - sub, err := client.EthSubscribe(context.Background(), nc, "someSubscription", 3, 1) + sub, err := client.Subscribe(context.Background(), "nftest", nc, "someSubscription", 3, 1) if err != nil { t.Fatal(err) } @@ -350,7 +332,7 @@ func TestClientCloseUnsubscribeRace(t *testing.T) { // This test checks that Client doesn't lock up when a single subscriber // doesn't read subscription events. func TestClientNotificationStorm(t *testing.T) { - server := newTestServer("eth", new(NotificationTestService)) + server := newTestServer() defer server.Stop() doTest := func(count int, wantError bool) { @@ -362,7 +344,7 @@ func TestClientNotificationStorm(t *testing.T) { // Subscribe on the server. It will start sending many notifications // very quickly. nc := make(chan int) - sub, err := client.EthSubscribe(ctx, nc, "someSubscription", count, 0) + sub, err := client.Subscribe(ctx, "nftest", nc, "someSubscription", count, 0) if err != nil { t.Fatal("can't subscribe:", err) } @@ -384,7 +366,7 @@ func TestClientNotificationStorm(t *testing.T) { return } var r int - err := client.CallContext(ctx, &r, "eth_echo", i) + err := client.CallContext(ctx, &r, "nftest_echo", i) if err != nil { if !wantError { t.Fatalf("(%d/%d) call error: %v", i, count, err) @@ -392,14 +374,17 @@ func TestClientNotificationStorm(t *testing.T) { return } } + if wantError { + t.Fatalf("didn't get expected error") + } } doTest(8000, false) - doTest(10000, true) + doTest(23000, true) } func TestClientHTTP(t *testing.T) { - server := newTestServer("service", new(Service)) + server := newTestServer() defer server.Stop() client, hs := httpTestClient(server, "http", nil) @@ -408,15 +393,15 @@ func TestClientHTTP(t *testing.T) { // Launch concurrent requests. var ( - results = make([]Result, 100) + results = make([]echoResult, 100) errc = make(chan error) - wantResult = Result{"a", 1, new(Args)} + wantResult = echoResult{"a", 1, new(echoArgs)} ) defer client.Close() for i := range results { i := i go func() { - errc <- client.Call(&results[i], "service_echo", + errc <- client.Call(&results[i], "test_echo", wantResult.String, wantResult.Int, wantResult.Args) }() } @@ -445,16 +430,16 @@ func TestClientHTTP(t *testing.T) { func TestClientReconnect(t *testing.T) { startServer := func(addr string) (*Server, net.Listener) { - srv := newTestServer("service", new(Service)) + srv := newTestServer() l, err := net.Listen("tcp", addr) if err != nil { - t.Fatal(err) + t.Fatal("can't listen:", err) } go http.Serve(l, srv.WebsocketHandler([]string{"*"})) return srv, l } - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 12*time.Second) defer cancel() // Start a server and corresponding client. @@ -465,22 +450,23 @@ func TestClientReconnect(t *testing.T) { } // Perform a call. This should work because the server is up. - var resp Result - if err := client.CallContext(ctx, &resp, "service_echo", "", 1, nil); err != nil { + var resp echoResult + if err := client.CallContext(ctx, &resp, "test_echo", "", 1, nil); err != nil { t.Fatal(err) } - // Shut down the server and try calling again. It shouldn't work. + // Shut down the server and allow for some cool down time so we can listen on the same + // address again. l1.Close() s1.Stop() - if err := client.CallContext(ctx, &resp, "service_echo", "", 2, nil); err == nil { + time.Sleep(2 * time.Second) + + // Try calling again. It shouldn't work. + if err := client.CallContext(ctx, &resp, "test_echo", "", 2, nil); err == nil { t.Error("successful call while the server is down") t.Logf("resp: %#v", resp) } - // Allow for some cool down time so we can listen on the same address again. - time.Sleep(2 * time.Second) - // Start it up again and call again. The connection should be reestablished. // We spawn multiple calls here to check whether this hangs somehow. s2, l2 := startServer(l1.Addr().String()) @@ -492,8 +478,8 @@ func TestClientReconnect(t *testing.T) { for i := 0; i < cap(errors); i++ { go func() { <-start - var resp Result - errors <- client.CallContext(ctx, &resp, "service_echo", "", 3, nil) + var resp echoResult + errors <- client.CallContext(ctx, &resp, "test_echo", "", 3, nil) }() } close(start) @@ -503,20 +489,12 @@ func TestClientReconnect(t *testing.T) { errcount++ } } - t.Log("err:", err) + t.Logf("%d errors, last error: %v", errcount, err) if errcount > 1 { t.Errorf("expected one error after disconnect, got %d", errcount) } } -func newTestServer(serviceName string, service interface{}) *Server { - server := NewServer() - if err := server.RegisterName(serviceName, service); err != nil { - panic(err) - } - return server -} - func httpTestClient(srv *Server, transport string, fl *flakeyListener) (*Client, *httptest.Server) { // Create the HTTP server. var hs *httptest.Server diff --git a/rpc/constants_unix.go b/rpc/constants_unix.go new file mode 100644 index 000000000000..2f98d6499b7a --- /dev/null +++ b/rpc/constants_unix.go @@ -0,0 +1,33 @@ +// Copyright 2019 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 . + +// +build darwin dragonfly freebsd linux nacl netbsd openbsd solaris + +package rpc + +/* +#include + +int max_socket_path_size() { +struct sockaddr_un s; +return sizeof(s.sun_path); +} +*/ +import "C" + +var ( + max_path_size = C.max_socket_path_size() +) diff --git a/rpc/constants_unix_nocgo.go b/rpc/constants_unix_nocgo.go new file mode 100644 index 000000000000..ecb231f92714 --- /dev/null +++ b/rpc/constants_unix_nocgo.go @@ -0,0 +1,25 @@ +// Copyright 2019 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 . + +// +build !cgo,!windows + +package rpc + +var ( + // On Linux, sun_path is 108 bytes in size + // see http://man7.org/linux/man-pages/man7/unix.7.html + max_path_size = 108 +) diff --git a/rpc/doc.go b/rpc/doc.go index c60381b5aef8..e0a6324675e6 100644 --- a/rpc/doc.go +++ b/rpc/doc.go @@ -15,43 +15,47 @@ // along with the go-ethereum library. If not, see . /* -Package rpc provides access to the exported methods of an object across a network -or other I/O connection. After creating a server instance objects can be registered, -making it visible from the outside. Exported methods that follow specific -conventions can be called remotely. It also has support for the publish/subscribe -pattern. + +Package rpc implements bi-directional JSON-RPC 2.0 on multiple transports. + +It provides access to the exported methods of an object across a network or other I/O +connection. After creating a server or client instance, objects can be registered to make +them visible as 'services'. Exported methods that follow specific conventions can be +called remotely. It also has support for the publish/subscribe pattern. + +RPC Methods Methods that satisfy the following criteria are made available for remote access: - - object must be exported + - method must be exported - method returns 0, 1 (response or error) or 2 (response and error) values - - method argument(s) must be exported or builtin types - - method returned value(s) must be exported or builtin types An example method: + func (s *CalcService) Add(a, b int) (int, error) -When the returned error isn't nil the returned integer is ignored and the error is -sent back to the client. Otherwise the returned integer is sent back to the client. +When the returned error isn't nil the returned integer is ignored and the error is sent +back to the client. Otherwise the returned integer is sent back to the client. -Optional arguments are supported by accepting pointer values as arguments. E.g. -if we want to do the addition in an optional finite field we can accept a mod -argument as pointer value. +Optional arguments are supported by accepting pointer values as arguments. E.g. if we want +to do the addition in an optional finite field we can accept a mod argument as pointer +value. - func (s *CalService) Add(a, b int, mod *int) (int, error) + func (s *CalcService) Add(a, b int, mod *int) (int, error) -This RPC method can be called with 2 integers and a null value as third argument. -In that case the mod argument will be nil. Or it can be called with 3 integers, -in that case mod will be pointing to the given third argument. Since the optional -argument is the last argument the RPC package will also accept 2 integers as -arguments. It will pass the mod argument as nil to the RPC method. +This RPC method can be called with 2 integers and a null value as third argument. In that +case the mod argument will be nil. Or it can be called with 3 integers, in that case mod +will be pointing to the given third argument. Since the optional argument is the last +argument the RPC package will also accept 2 integers as arguments. It will pass the mod +argument as nil to the RPC method. -The server offers the ServeCodec method which accepts a ServerCodec instance. It will -read requests from the codec, process the request and sends the response back to the -client using the codec. The server can execute requests concurrently. Responses -can be sent back to the client out of order. +The server offers the ServeCodec method which accepts a ServerCodec instance. It will read +requests from the codec, process the request and sends the response back to the client +using the codec. The server can execute requests concurrently. Responses can be sent back +to the client out of order. An example server which uses the JSON codec: + type CalculatorService struct {} func (s *CalculatorService) Add(a, b int) int { @@ -67,32 +71,40 @@ An example server which uses the JSON codec: calculator := new(CalculatorService) server := NewServer() - server.RegisterName("calculator", calculator") - + server.RegisterName("calculator", calculator) l, _ := net.ListenUnix("unix", &net.UnixAddr{Net: "unix", Name: "/tmp/calculator.sock"}) - for { - c, _ := l.AcceptUnix() - codec := v2.NewJSONCodec(c) - go server.ServeCodec(codec) - } + server.ServeListener(l) + +Subscriptions The package also supports the publish subscribe pattern through the use of subscriptions. -A method that is considered eligible for notifications must satisfy the following criteria: - - object must be exported +A method that is considered eligible for notifications must satisfy the following +criteria: + - method must be exported - first method argument type must be context.Context - - method argument(s) must be exported or builtin types - - method must return the tuple Subscription, error + - method must have return types (rpc.Subscription, error) An example method: - func (s *BlockChainService) NewBlocks(ctx context.Context) (Subscription, error) { + + func (s *BlockChainService) NewBlocks(ctx context.Context) (rpc.Subscription, error) { ... } -Subscriptions are deleted when: - - the user sends an unsubscribe request - - the connection which was used to create the subscription is closed. This can be initiated - by the client and server. The server will close the connection on a write error or when - the queue of buffered notifications gets too big. +When the service containing the subscription method is registered to the server, for +example under the "blockchain" namespace, a subscription is created by calling the +"blockchain_subscribe" method. + +Subscriptions are deleted when the user sends an unsubscribe request or when the +connection which was used to create the subscription is closed. This can be initiated by +the client and server. The server will close the connection for any write error. + +For more information about subscriptions, see https://github.com/ethereum/go-ethereum/wiki/RPC-PUB-SUB. + +Reverse Calls + +In any method handler, an instance of rpc.Client can be accessed through the +ClientFromContext method. Using this client instance, server-to-client method calls can be +performed on the RPC connection. */ package rpc diff --git a/rpc/endpoints.go b/rpc/endpoints.go index d687fb212f18..8ca6d4eb0c6d 100644 --- a/rpc/endpoints.go +++ b/rpc/endpoints.go @@ -19,7 +19,7 @@ package rpc import ( "net" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) // StartHTTPEndpoint starts the HTTP RPC endpoint, configured with cors/vhosts/modules diff --git a/rpc/errors.go b/rpc/errors.go index 9cf9dc60c29f..c3aa826cc88a 100644 --- a/rpc/errors.go +++ b/rpc/errors.go @@ -18,18 +18,31 @@ package rpc import "fmt" -// request is for an unknown service -type methodNotFoundError struct { - service string - method string -} +const defaultErrorCode = -32000 + +type methodNotFoundError struct{ method string } func (e *methodNotFoundError) ErrorCode() int { return -32601 } func (e *methodNotFoundError) Error() string { - return fmt.Sprintf("The method %s%s%s does not exist/is not available", e.service, serviceMethodSeparator, e.method) + return fmt.Sprintf("the method %s does not exist/is not available", e.method) +} + +type subscriptionNotFoundError struct{ namespace, subscription string } + +func (e *subscriptionNotFoundError) ErrorCode() int { return -32601 } + +func (e *subscriptionNotFoundError) Error() string { + return fmt.Sprintf("no %q subscription in %s namespace", e.subscription, e.namespace) } +// Invalid JSON was received by the server. +type parseError struct{ message string } + +func (e *parseError) ErrorCode() int { return -32700 } + +func (e *parseError) Error() string { return e.message } + // received message isn't a valid request type invalidRequestError struct{ message string } @@ -50,17 +63,3 @@ type invalidParamsError struct{ message string } func (e *invalidParamsError) ErrorCode() int { return -32602 } func (e *invalidParamsError) Error() string { return e.message } - -// logic error, callback returned an error -type callbackError struct{ message string } - -func (e *callbackError) ErrorCode() int { return -32000 } - -func (e *callbackError) Error() string { return e.message } - -// issued when a request is received after the server is issued to stop. -type shutdownError struct{} - -func (e *shutdownError) ErrorCode() int { return -32000 } - -func (e *shutdownError) Error() string { return "server is shutting down" } diff --git a/rpc/gzip.go b/rpc/gzip.go new file mode 100644 index 000000000000..a14fd09d5407 --- /dev/null +++ b/rpc/gzip.go @@ -0,0 +1,66 @@ +// Copyright 2019 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 ( + "compress/gzip" + "io" + "io/ioutil" + "net/http" + "strings" + "sync" +) + +var gzPool = sync.Pool{ + New: func() interface{} { + w := gzip.NewWriter(ioutil.Discard) + return w + }, +} + +type gzipResponseWriter struct { + io.Writer + http.ResponseWriter +} + +func (w *gzipResponseWriter) WriteHeader(status int) { + w.Header().Del("Content-Length") + w.ResponseWriter.WriteHeader(status) +} + +func (w *gzipResponseWriter) Write(b []byte) (int, error) { + return w.Writer.Write(b) +} + +func newGzipHandler(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") { + next.ServeHTTP(w, r) + return + } + + w.Header().Set("Content-Encoding", "gzip") + + gz := gzPool.Get().(*gzip.Writer) + defer gzPool.Put(gz) + + gz.Reset(w) + defer gz.Close() + + next.ServeHTTP(&gzipResponseWriter{ResponseWriter: w, Writer: gz}, r) + }) +} diff --git a/rpc/handler.go b/rpc/handler.go new file mode 100644 index 000000000000..ab32cf47e4bb --- /dev/null +++ b/rpc/handler.go @@ -0,0 +1,397 @@ +// Copyright 2019 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 ( + "context" + "encoding/json" + "reflect" + "strconv" + "strings" + "sync" + "time" + + "github.com/ethereum/go-ethereum/log" +) + +// handler handles JSON-RPC messages. There is one handler per connection. Note that +// handler is not safe for concurrent use. Message handling never blocks indefinitely +// because RPCs are processed on background goroutines launched by handler. +// +// The entry points for incoming messages are: +// +// h.handleMsg(message) +// h.handleBatch(message) +// +// Outgoing calls use the requestOp struct. Register the request before sending it +// on the connection: +// +// op := &requestOp{ids: ...} +// h.addRequestOp(op) +// +// Now send the request, then wait for the reply to be delivered through handleMsg: +// +// if err := op.wait(...); err != nil { +// h.removeRequestOp(op) // timeout, etc. +// } +// +type handler struct { + reg *serviceRegistry + unsubscribeCb *callback + idgen func() ID // subscription ID generator + respWait map[string]*requestOp // active client requests + clientSubs map[string]*ClientSubscription // active client subscriptions + callWG sync.WaitGroup // pending call goroutines + rootCtx context.Context // canceled by close() + cancelRoot func() // cancel function for rootCtx + conn jsonWriter // where responses will be sent + log log.Logger + allowSubscribe bool + + subLock sync.Mutex + serverSubs map[ID]*Subscription +} + +type callProc struct { + ctx context.Context + notifiers []*Notifier +} + +func newHandler(connCtx context.Context, conn jsonWriter, idgen func() ID, reg *serviceRegistry) *handler { + rootCtx, cancelRoot := context.WithCancel(connCtx) + h := &handler{ + reg: reg, + idgen: idgen, + conn: conn, + respWait: make(map[string]*requestOp), + clientSubs: make(map[string]*ClientSubscription), + rootCtx: rootCtx, + cancelRoot: cancelRoot, + allowSubscribe: true, + serverSubs: make(map[ID]*Subscription), + log: log.Root(), + } + if conn.remoteAddr() != "" { + h.log = h.log.New("conn", conn.remoteAddr()) + } + h.unsubscribeCb = newCallback(reflect.Value{}, reflect.ValueOf(h.unsubscribe)) + return h +} + +// handleBatch executes all messages in a batch and returns the responses. +func (h *handler) handleBatch(msgs []*jsonrpcMessage) { + // Emit error response for empty batches: + if len(msgs) == 0 { + h.startCallProc(func(cp *callProc) { + h.conn.writeJSON(cp.ctx, errorMessage(&invalidRequestError{"empty batch"})) + }) + return + } + + // Handle non-call messages first: + calls := make([]*jsonrpcMessage, 0, len(msgs)) + for _, msg := range msgs { + if handled := h.handleImmediate(msg); !handled { + calls = append(calls, msg) + } + } + if len(calls) == 0 { + return + } + // Process calls on a goroutine because they may block indefinitely: + h.startCallProc(func(cp *callProc) { + answers := make([]*jsonrpcMessage, 0, len(msgs)) + for _, msg := range calls { + if answer := h.handleCallMsg(cp, msg); answer != nil { + answers = append(answers, answer) + } + } + h.addSubscriptions(cp.notifiers) + if len(answers) > 0 { + h.conn.writeJSON(cp.ctx, answers) + } + for _, n := range cp.notifiers { + n.activate() + } + }) +} + +// handleMsg handles a single message. +func (h *handler) handleMsg(msg *jsonrpcMessage) { + if ok := h.handleImmediate(msg); ok { + return + } + h.startCallProc(func(cp *callProc) { + answer := h.handleCallMsg(cp, msg) + h.addSubscriptions(cp.notifiers) + if answer != nil { + h.conn.writeJSON(cp.ctx, answer) + } + for _, n := range cp.notifiers { + n.activate() + } + }) +} + +// close cancels all requests except for inflightReq and waits for +// call goroutines to shut down. +func (h *handler) close(err error, inflightReq *requestOp) { + h.cancelAllRequests(err, inflightReq) + h.callWG.Wait() + h.cancelRoot() + h.cancelServerSubscriptions(err) +} + +// addRequestOp registers a request operation. +func (h *handler) addRequestOp(op *requestOp) { + for _, id := range op.ids { + h.respWait[string(id)] = op + } +} + +// removeRequestOps stops waiting for the given request IDs. +func (h *handler) removeRequestOp(op *requestOp) { + for _, id := range op.ids { + delete(h.respWait, string(id)) + } +} + +// cancelAllRequests unblocks and removes pending requests and active subscriptions. +func (h *handler) cancelAllRequests(err error, inflightReq *requestOp) { + didClose := make(map[*requestOp]bool) + if inflightReq != nil { + didClose[inflightReq] = true + } + + for id, op := range h.respWait { + // Remove the op so that later calls will not close op.resp again. + delete(h.respWait, id) + + if !didClose[op] { + op.err = err + close(op.resp) + didClose[op] = true + } + } + for id, sub := range h.clientSubs { + delete(h.clientSubs, id) + sub.quitWithError(false, err) + } +} + +func (h *handler) addSubscriptions(nn []*Notifier) { + h.subLock.Lock() + defer h.subLock.Unlock() + + for _, n := range nn { + if sub := n.takeSubscription(); sub != nil { + h.serverSubs[sub.ID] = sub + } + } +} + +// cancelServerSubscriptions removes all subscriptions and closes their error channels. +func (h *handler) cancelServerSubscriptions(err error) { + h.subLock.Lock() + defer h.subLock.Unlock() + + for id, s := range h.serverSubs { + s.err <- err + close(s.err) + delete(h.serverSubs, id) + } +} + +// startCallProc runs fn in a new goroutine and starts tracking it in the h.calls wait group. +func (h *handler) startCallProc(fn func(*callProc)) { + h.callWG.Add(1) + go func() { + ctx, cancel := context.WithCancel(h.rootCtx) + defer h.callWG.Done() + defer cancel() + fn(&callProc{ctx: ctx}) + }() +} + +// handleImmediate executes non-call messages. It returns false if the message is a +// call or requires a reply. +func (h *handler) handleImmediate(msg *jsonrpcMessage) bool { + start := time.Now() + switch { + case msg.isNotification(): + if strings.HasSuffix(msg.Method, notificationMethodSuffix) { + h.handleSubscriptionResult(msg) + return true + } + return false + case msg.isResponse(): + h.handleResponse(msg) + h.log.Trace("Handled RPC response", "reqid", idForLog{msg.ID}, "t", time.Since(start)) + return true + default: + return false + } +} + +// handleSubscriptionResult processes subscription notifications. +func (h *handler) handleSubscriptionResult(msg *jsonrpcMessage) { + var result subscriptionResult + if err := json.Unmarshal(msg.Params, &result); err != nil { + h.log.Debug("Dropping invalid subscription message") + return + } + if h.clientSubs[result.ID] != nil { + h.clientSubs[result.ID].deliver(result.Result) + } +} + +// handleResponse processes method call responses. +func (h *handler) handleResponse(msg *jsonrpcMessage) { + op := h.respWait[string(msg.ID)] + if op == nil { + h.log.Debug("Unsolicited RPC response", "reqid", idForLog{msg.ID}) + return + } + delete(h.respWait, string(msg.ID)) + // For normal responses, just forward the reply to Call/BatchCall. + if op.sub == nil { + op.resp <- msg + return + } + // For subscription responses, start the subscription if the server + // indicates success. EthSubscribe gets unblocked in either case through + // the op.resp channel. + defer close(op.resp) + if msg.Error != nil { + op.err = msg.Error + return + } + if op.err = json.Unmarshal(msg.Result, &op.sub.subid); op.err == nil { + go op.sub.start() + h.clientSubs[op.sub.subid] = op.sub + } +} + +// handleCallMsg executes a call message and returns the answer. +func (h *handler) handleCallMsg(ctx *callProc, msg *jsonrpcMessage) *jsonrpcMessage { + start := time.Now() + switch { + case msg.isNotification(): + h.handleCall(ctx, msg) + h.log.Debug("Served "+msg.Method, "t", time.Since(start)) + return nil + case msg.isCall(): + resp := h.handleCall(ctx, msg) + if resp.Error != nil { + h.log.Warn("Served "+msg.Method, "reqid", idForLog{msg.ID}, "t", time.Since(start), "err", resp.Error.Message) + } else { + h.log.Debug("Served "+msg.Method, "reqid", idForLog{msg.ID}, "t", time.Since(start)) + } + return resp + case msg.hasValidID(): + return msg.errorResponse(&invalidRequestError{"invalid request"}) + default: + return errorMessage(&invalidRequestError{"invalid request"}) + } +} + +// handleCall processes method calls. +func (h *handler) handleCall(cp *callProc, msg *jsonrpcMessage) *jsonrpcMessage { + if msg.isSubscribe() { + return h.handleSubscribe(cp, msg) + } + var callb *callback + if msg.isUnsubscribe() { + callb = h.unsubscribeCb + } else { + callb = h.reg.callback(msg.Method) + } + if callb == nil { + return msg.errorResponse(&methodNotFoundError{method: msg.Method}) + } + args, err := parsePositionalArguments(msg.Params, callb.argTypes) + if err != nil { + return msg.errorResponse(&invalidParamsError{err.Error()}) + } + + return h.runMethod(cp.ctx, msg, callb, args) +} + +// handleSubscribe processes *_subscribe method calls. +func (h *handler) handleSubscribe(cp *callProc, msg *jsonrpcMessage) *jsonrpcMessage { + if !h.allowSubscribe { + return msg.errorResponse(ErrNotificationsUnsupported) + } + + // Subscription method name is first argument. + name, err := parseSubscriptionName(msg.Params) + if err != nil { + return msg.errorResponse(&invalidParamsError{err.Error()}) + } + namespace := msg.namespace() + callb := h.reg.subscription(namespace, name) + if callb == nil { + return msg.errorResponse(&subscriptionNotFoundError{namespace, name}) + } + + // Parse subscription name arg too, but remove it before calling the callback. + argTypes := append([]reflect.Type{stringType}, callb.argTypes...) + args, err := parsePositionalArguments(msg.Params, argTypes) + if err != nil { + return msg.errorResponse(&invalidParamsError{err.Error()}) + } + args = args[1:] + + // Install notifier in context so the subscription handler can find it. + n := &Notifier{h: h, namespace: namespace} + cp.notifiers = append(cp.notifiers, n) + ctx := context.WithValue(cp.ctx, notifierKey{}, n) + + return h.runMethod(ctx, msg, callb, args) +} + +// runMethod runs the Go callback for an RPC method. +func (h *handler) runMethod(ctx context.Context, msg *jsonrpcMessage, callb *callback, args []reflect.Value) *jsonrpcMessage { + result, err := callb.call(ctx, msg.Method, args) + if err != nil { + return msg.errorResponse(err) + } + return msg.response(result) +} + +// unsubscribe is the callback function for all *_unsubscribe calls. +func (h *handler) unsubscribe(ctx context.Context, id ID) (bool, error) { + h.subLock.Lock() + defer h.subLock.Unlock() + + s := h.serverSubs[id] + if s == nil { + return false, ErrSubscriptionNotFound + } + close(s.err) + delete(h.serverSubs, id) + return true, nil +} + +type idForLog struct{ json.RawMessage } + +func (id idForLog) String() string { + if s, err := strconv.Unquote(string(id.RawMessage)); err == nil { + return s + } + return string(id.RawMessage) +} diff --git a/rpc/http.go b/rpc/http.go index 6102e362a82c..0de127c80809 100644 --- a/rpc/http.go +++ b/rpc/http.go @@ -31,44 +31,45 @@ import ( "sync" "time" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" "github.com/rs/cors" ) const ( - maxRequestContentLength = 1024 * 512 + maxRequestContentLength = 1024 * 1024 * 5 + contentType = "application/json" ) -var ( - // https://www.jsonrpc.org/historical/json-rpc-over-http.html#id13 - acceptedContentTypes = []string{"application/json", "application/json-rpc", "application/jsonrequest"} - contentType = acceptedContentTypes[0] - nullAddr, _ = net.ResolveTCPAddr("tcp", "127.0.0.1:0") -) +// https://www.jsonrpc.org/historical/json-rpc-over-http.html#id13 +var acceptedContentTypes = []string{contentType, "application/json-rpc", "application/jsonrequest"} type httpConn struct { client *http.Client req *http.Request closeOnce sync.Once - closed chan struct{} + closeCh chan interface{} } // httpConn is treated specially by Client. -func (hc *httpConn) LocalAddr() net.Addr { return nullAddr } -func (hc *httpConn) RemoteAddr() net.Addr { return nullAddr } -func (hc *httpConn) SetReadDeadline(time.Time) error { return nil } -func (hc *httpConn) SetWriteDeadline(time.Time) error { return nil } -func (hc *httpConn) SetDeadline(time.Time) error { return nil } -func (hc *httpConn) Write([]byte) (int, error) { panic("Write called") } - -func (hc *httpConn) Read(b []byte) (int, error) { - <-hc.closed - return 0, io.EOF +func (hc *httpConn) writeJSON(context.Context, interface{}) error { + panic("writeJSON called on httpConn") } -func (hc *httpConn) Close() error { - hc.closeOnce.Do(func() { close(hc.closed) }) - return nil +func (hc *httpConn) remoteAddr() string { + return hc.req.URL.String() +} + +func (hc *httpConn) readBatch() ([]*jsonrpcMessage, bool, error) { + <-hc.closeCh + return nil, false, io.EOF +} + +func (hc *httpConn) close() { + hc.closeOnce.Do(func() { close(hc.closeCh) }) +} + +func (hc *httpConn) closed() <-chan interface{} { + return hc.closeCh } // HTTPTimeouts represents the configuration params for the HTTP RPC server. @@ -114,8 +115,8 @@ func DialHTTPWithClient(endpoint string, client *http.Client) (*Client, error) { req.Header.Set("Accept", contentType) initctx := context.Background() - return newClient(initctx, func(context.Context) (net.Conn, error) { - return &httpConn{client: client, req: req, closed: make(chan struct{})}, nil + return newClient(initctx, func(context.Context) (ServerCodec, error) { + return &httpConn{client: client, req: req, closeCh: make(chan interface{})}, nil }) } @@ -184,24 +185,38 @@ func (hc *httpConn) doRequest(ctx context.Context, msg interface{}) (io.ReadClos return resp.Body, nil } -// httpReadWriteNopCloser wraps a io.Reader and io.Writer with a NOP Close method. -type httpReadWriteNopCloser struct { +// httpServerConn turns a HTTP connection into a Conn. +type httpServerConn struct { io.Reader io.Writer + r *http.Request } -// Close does nothing and returns always nil -func (t *httpReadWriteNopCloser) Close() error { - return nil +func newHTTPServerConn(r *http.Request, w http.ResponseWriter) ServerCodec { + body := io.LimitReader(r.Body, maxRequestContentLength) + conn := &httpServerConn{Reader: body, Writer: w, r: r} + return NewCodec(conn) +} + +// Close does nothing and always returns nil. +func (t *httpServerConn) Close() error { return nil } + +// RemoteAddr returns the peer address of the underlying connection. +func (t *httpServerConn) RemoteAddr() string { + return t.r.RemoteAddr } +// SetWriteDeadline does nothing and always returns nil. +func (t *httpServerConn) SetWriteDeadline(time.Time) error { return nil } + // NewHTTPServer creates a new HTTP RPC server around an API provider. // // Deprecated: Server implements http.Handler -func NewHTTPServer(cors []string, vhosts []string, timeouts HTTPTimeouts, srv *Server) *http.Server { +func NewHTTPServer(cors []string, vhosts []string, timeouts HTTPTimeouts, srv http.Handler) *http.Server { // Wrap the CORS-handler within a host-handler handler := newCorsHandler(srv, cors) handler = newVHostHandler(vhosts, handler) + handler = newGzipHandler(handler) // Make sure timeout values are meaningful if timeouts.ReadTimeout < time.Second { @@ -226,7 +241,7 @@ func NewHTTPServer(cors []string, vhosts []string, timeouts HTTPTimeouts, srv *S } // ServeHTTP serves JSON-RPC requests over HTTP. -func (srv *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { +func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Permit dumb empty requests for remote health-checks (AWS) if r.Method == http.MethodGet && r.ContentLength == 0 && r.URL.RawQuery == "" { return @@ -249,12 +264,10 @@ func (srv *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { ctx = context.WithValue(ctx, "Origin", origin) } - body := io.LimitReader(r.Body, maxRequestContentLength) - codec := NewJSONCodec(&httpReadWriteNopCloser{body, w}) - defer codec.Close() - w.Header().Set("content-type", contentType) - srv.ServeSingleRequest(ctx, codec, OptionMethodInvocation) + codec := newHTTPServerConn(r, w) + defer codec.close() + s.serveSingleRequest(ctx, codec) } // validateRequest returns a non-zero response code and error message if the @@ -284,7 +297,7 @@ func validateRequest(r *http.Request) (int, error) { return http.StatusUnsupportedMediaType, err } -func newCorsHandler(srv *Server, allowedOrigins []string) http.Handler { +func newCorsHandler(srv http.Handler, allowedOrigins []string) http.Handler { // disable CORS support if user has not specified a custom CORS configuration if len(allowedOrigins) == 0 { return srv diff --git a/rpc/inproc.go b/rpc/inproc.go index cbe65d10e76e..fbe9a40ceca9 100644 --- a/rpc/inproc.go +++ b/rpc/inproc.go @@ -24,10 +24,10 @@ import ( // DialInProc attaches an in-process connection to the given RPC server. func DialInProc(handler *Server) *Client { initctx := context.Background() - c, _ := newClient(initctx, func(context.Context) (net.Conn, error) { + c, _ := newClient(initctx, func(context.Context) (ServerCodec, error) { p1, p2 := net.Pipe() - go handler.ServeCodec(NewJSONCodec(p1), OptionMethodInvocation|OptionSubscriptions) - return p2, nil + go handler.ServeCodec(NewCodec(p1), 0) + return NewCodec(p2), nil }) return c } diff --git a/rpc/ipc.go b/rpc/ipc.go index 06da6b74b9b8..07a211c6277c 100644 --- a/rpc/ipc.go +++ b/rpc/ipc.go @@ -20,22 +20,22 @@ import ( "context" "net" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/netutil" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/p2p/netutil" ) // ServeListener accepts connections on l, serving JSON-RPC on them. -func (srv *Server) ServeListener(l net.Listener) error { +func (s *Server) ServeListener(l net.Listener) error { for { conn, err := l.Accept() if netutil.IsTemporaryError(err) { - log.Warn("IPC accept error", "err", err) + log.Warn("RPC accept error", "err", err) continue } else if err != nil { return err } - log.Trace("IPC accepted connection") - go srv.ServeCodec(NewJSONCodec(conn), OptionMethodInvocation|OptionSubscriptions) + log.Trace("Accepted RPC connection", "conn", conn.RemoteAddr()) + go s.ServeCodec(NewCodec(conn), 0) } } @@ -46,7 +46,11 @@ func (srv *Server) ServeListener(l net.Listener) error { // The context is used for the initial connection establishment. It does not // affect subsequent interactions with the client. func DialIPC(ctx context.Context, endpoint string) (*Client, error) { - return newClient(ctx, func(ctx context.Context) (net.Conn, error) { - return newIPCConnection(ctx, endpoint) + return newClient(ctx, func(ctx context.Context) (ServerCodec, error) { + conn, err := newIPCConnection(ctx, endpoint) + if err != nil { + return nil, err + } + return NewCodec(conn), err }) } diff --git a/rpc/ipc_js.go b/rpc/ipc_js.go index eceef050e723..7e7554a76887 100644 --- a/rpc/ipc_js.go +++ b/rpc/ipc_js.go @@ -1,4 +1,4 @@ -// Copyright 2015 The go-ethereum Authors +// Copyright 2018 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 diff --git a/rpc/ipc_unix.go b/rpc/ipc_unix.go index adb72577f0b1..f4690cc0abb9 100644 --- a/rpc/ipc_unix.go +++ b/rpc/ipc_unix.go @@ -25,23 +25,13 @@ import ( "os" "path/filepath" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) -/* -#include - -int max_socket_path_size() { -struct sockaddr_un s; -return sizeof(s.sun_path); -} -*/ -import "C" - // ipcListen will create a Unix socket on the given endpoint. func ipcListen(endpoint string) (net.Listener, error) { - if len(endpoint) > int(C.max_socket_path_size()) { - log.Warn(fmt.Sprintf("The ipc endpoint is longer than %d characters. ", C.max_socket_path_size()), + if len(endpoint) > int(max_path_size) { + log.Warn(fmt.Sprintf("The ipc endpoint is longer than %d characters. ", max_path_size), "endpoint", endpoint) } @@ -60,5 +50,5 @@ func ipcListen(endpoint string) (net.Listener, error) { // newIPCConnection will connect to a Unix socket on the given endpoint. func newIPCConnection(ctx context.Context, endpoint string) (net.Conn, error) { - return dialContext(ctx, "unix", endpoint) + return new(net.Dialer).DialContext(ctx, "unix", endpoint) } diff --git a/rpc/json.go b/rpc/json.go index 5c92b674e850..61631a3d7660 100644 --- a/rpc/json.go +++ b/rpc/json.go @@ -18,71 +18,110 @@ package rpc import ( "bytes" + "context" "encoding/json" + "errors" "fmt" "io" "reflect" - "strconv" "strings" "sync" - - "github.com/nebulaai/nbai-node/log" + "time" ) const ( - jsonrpcVersion = "2.0" + vsn = "2.0" serviceMethodSeparator = "_" subscribeMethodSuffix = "_subscribe" unsubscribeMethodSuffix = "_unsubscribe" notificationMethodSuffix = "_subscription" + + defaultWriteTimeout = 10 * time.Second // used if context has no deadline ) -type jsonRequest struct { - Method string `json:"method"` - Version string `json:"jsonrpc"` - Id json.RawMessage `json:"id,omitempty"` - Payload json.RawMessage `json:"params,omitempty"` +var null = json.RawMessage("null") + +type subscriptionResult struct { + ID string `json:"subscription"` + Result json.RawMessage `json:"result,omitempty"` } -type jsonSuccessResponse struct { - Version string `json:"jsonrpc"` - Id interface{} `json:"id,omitempty"` - Result interface{} `json:"result"` +// A value of this type can a JSON-RPC request, notification, successful response or +// error response. Which one it is depends on the fields. +type jsonrpcMessage struct { + Version string `json:"jsonrpc,omitempty"` + ID json.RawMessage `json:"id,omitempty"` + Method string `json:"method,omitempty"` + Params json.RawMessage `json:"params,omitempty"` + Error *jsonError `json:"error,omitempty"` + Result json.RawMessage `json:"result,omitempty"` } -type jsonError struct { - Code int `json:"code"` - Message string `json:"message"` - Data interface{} `json:"data,omitempty"` +func (msg *jsonrpcMessage) isNotification() bool { + return msg.ID == nil && msg.Method != "" } -type jsonErrResponse struct { - Version string `json:"jsonrpc"` - Id interface{} `json:"id,omitempty"` - Error jsonError `json:"error"` +func (msg *jsonrpcMessage) isCall() bool { + return msg.hasValidID() && msg.Method != "" } -type jsonSubscription struct { - Subscription string `json:"subscription"` - Result interface{} `json:"result,omitempty"` +func (msg *jsonrpcMessage) isResponse() bool { + return msg.hasValidID() && msg.Method == "" && msg.Params == nil && (msg.Result != nil || msg.Error != nil) } -type jsonNotification struct { - Version string `json:"jsonrpc"` - Method string `json:"method"` - Params jsonSubscription `json:"params"` +func (msg *jsonrpcMessage) hasValidID() bool { + return len(msg.ID) > 0 && msg.ID[0] != '{' && msg.ID[0] != '[' } -// jsonCodec reads and writes JSON-RPC messages to the underlying connection. It -// also has support for parsing arguments and serializing (result) objects. -type jsonCodec struct { - closer sync.Once // close closed channel once - closed chan interface{} // closed on Close - decMu sync.Mutex // guards the decoder - decode func(v interface{}) error // decoder to allow multiple transports - encMu sync.Mutex // guards the encoder - encode func(v interface{}) error // encoder to allow multiple transports - rw io.ReadWriteCloser // connection +func (msg *jsonrpcMessage) isSubscribe() bool { + return strings.HasSuffix(msg.Method, subscribeMethodSuffix) +} + +func (msg *jsonrpcMessage) isUnsubscribe() bool { + return strings.HasSuffix(msg.Method, unsubscribeMethodSuffix) +} + +func (msg *jsonrpcMessage) namespace() string { + elem := strings.SplitN(msg.Method, serviceMethodSeparator, 2) + return elem[0] +} + +func (msg *jsonrpcMessage) String() string { + b, _ := json.Marshal(msg) + return string(b) +} + +func (msg *jsonrpcMessage) errorResponse(err error) *jsonrpcMessage { + resp := errorMessage(err) + resp.ID = msg.ID + return resp +} + +func (msg *jsonrpcMessage) response(result interface{}) *jsonrpcMessage { + enc, err := json.Marshal(result) + if err != nil { + // TODO: wrap with 'internal server error' + return msg.errorResponse(err) + } + return &jsonrpcMessage{Version: vsn, ID: msg.ID, Result: enc} +} + +func errorMessage(err error) *jsonrpcMessage { + msg := &jsonrpcMessage{Version: vsn, ID: null, Error: &jsonError{ + Code: defaultErrorCode, + Message: err.Error(), + }} + ec, ok := err.(Error) + if ok { + msg.Error.Code = ec.ErrorCode() + } + return msg +} + +type jsonError struct { + Code int `json:"code"` + Message string `json:"message"` + Data interface{} `json:"data,omitempty"` } func (err *jsonError) Error() string { @@ -96,268 +135,193 @@ func (err *jsonError) ErrorCode() int { return err.Code } -// NewCodec creates a new RPC server codec with support for JSON-RPC 2.0 based -// on explicitly given encoding and decoding methods. -func NewCodec(rwc io.ReadWriteCloser, encode, decode func(v interface{}) error) ServerCodec { - return &jsonCodec{ - closed: make(chan interface{}), - encode: encode, - decode: decode, - rw: rwc, - } +// Conn is a subset of the methods of net.Conn which are sufficient for ServerCodec. +type Conn interface { + io.ReadWriteCloser + SetWriteDeadline(time.Time) error } -// NewJSONCodec creates a new RPC server codec with support for JSON-RPC 2.0. -func NewJSONCodec(rwc io.ReadWriteCloser) ServerCodec { - enc := json.NewEncoder(rwc) - dec := json.NewDecoder(rwc) - dec.UseNumber() - - return &jsonCodec{ - closed: make(chan interface{}), - encode: enc.Encode, - decode: dec.Decode, - rw: rwc, - } +type deadlineCloser interface { + io.Closer + SetWriteDeadline(time.Time) error } -// isBatch returns true when the first non-whitespace characters is '[' -func isBatch(msg json.RawMessage) bool { - for _, c := range msg { - // skip insignificant whitespace (http://www.ietf.org/rfc/rfc4627.txt) - if c == 0x20 || c == 0x09 || c == 0x0a || c == 0x0d { - continue - } - return c == '[' - } - return false +// ConnRemoteAddr wraps the RemoteAddr operation, which returns a description +// of the peer address of a connection. If a Conn also implements ConnRemoteAddr, this +// description is used in log messages. +type ConnRemoteAddr interface { + RemoteAddr() string } -// ReadRequestHeaders will read new requests without parsing the arguments. It will -// return a collection of requests, an indication if these requests are in batch -// form or an error when the incoming message could not be read/parsed. -func (c *jsonCodec) ReadRequestHeaders() ([]rpcRequest, bool, Error) { - c.decMu.Lock() - defer c.decMu.Unlock() - - var incomingMsg json.RawMessage - if err := c.decode(&incomingMsg); err != nil { - return nil, false, &invalidRequestError{err.Error()} - } - if isBatch(incomingMsg) { - return parseBatchRequest(incomingMsg) - } - return parseRequest(incomingMsg) +// jsonCodec reads and writes JSON-RPC messages to the underlying connection. It also has +// support for parsing arguments and serializing (result) objects. +type jsonCodec struct { + remote string + closer sync.Once // close closed channel once + closeCh chan interface{} // closed on Close + decode func(v interface{}) error // decoder to allow multiple transports + encMu sync.Mutex // guards the encoder + encode func(v interface{}) error // encoder to allow multiple transports + conn deadlineCloser } -// checkReqId returns an error when the given reqId isn't valid for RPC method calls. -// valid id's are strings, numbers or null -func checkReqId(reqId json.RawMessage) error { - if len(reqId) == 0 { - return fmt.Errorf("missing request id") - } - if _, err := strconv.ParseFloat(string(reqId), 64); err == nil { - return nil +// NewFuncCodec creates a codec which uses the given functions to read and write. If conn +// implements ConnRemoteAddr, log messages will use it to include the remote address of +// the connection. +func NewFuncCodec(conn deadlineCloser, encode, decode func(v interface{}) error) ServerCodec { + codec := &jsonCodec{ + closeCh: make(chan interface{}), + encode: encode, + decode: decode, + conn: conn, } - var str string - if err := json.Unmarshal(reqId, &str); err == nil { - return nil + if ra, ok := conn.(ConnRemoteAddr); ok { + codec.remote = ra.RemoteAddr() } - return fmt.Errorf("invalid request id") + return codec } -// parseRequest will parse a single request from the given RawMessage. It will return -// the parsed request, an indication if the request was a batch or an error when -// the request could not be parsed. -func parseRequest(incomingMsg json.RawMessage) ([]rpcRequest, bool, Error) { - var in jsonRequest - if err := json.Unmarshal(incomingMsg, &in); err != nil { - return nil, false, &invalidMessageError{err.Error()} - } +// NewCodec creates a codec on the given connection. If conn implements ConnRemoteAddr, log +// messages will use it to include the remote address of the connection. +func NewCodec(conn Conn) ServerCodec { + enc := json.NewEncoder(conn) + dec := json.NewDecoder(conn) + dec.UseNumber() + return NewFuncCodec(conn, enc.Encode, dec.Decode) +} - if err := checkReqId(in.Id); err != nil { - return nil, false, &invalidMessageError{err.Error()} - } +func (c *jsonCodec) remoteAddr() string { + return c.remote +} - // subscribe are special, they will always use `subscribeMethod` as first param in the payload - if strings.HasSuffix(in.Method, subscribeMethodSuffix) { - reqs := []rpcRequest{{id: &in.Id, isPubSub: true}} - if len(in.Payload) > 0 { - // first param must be subscription name - var subscribeMethod [1]string - if err := json.Unmarshal(in.Payload, &subscribeMethod); err != nil { - log.Debug(fmt.Sprintf("Unable to parse subscription method: %v\n", err)) - return nil, false, &invalidRequestError{"Unable to parse subscription request"} - } - - reqs[0].service, reqs[0].method = strings.TrimSuffix(in.Method, subscribeMethodSuffix), subscribeMethod[0] - reqs[0].params = in.Payload - return reqs, false, nil - } - return nil, false, &invalidRequestError{"Unable to parse subscription request"} +func (c *jsonCodec) readBatch() (msg []*jsonrpcMessage, batch bool, err error) { + // Decode the next JSON object in the input stream. + // This verifies basic syntax, etc. + var rawmsg json.RawMessage + if err := c.decode(&rawmsg); err != nil { + return nil, false, err } + msg, batch = parseMessage(rawmsg) + return msg, batch, nil +} - if strings.HasSuffix(in.Method, unsubscribeMethodSuffix) { - return []rpcRequest{{id: &in.Id, isPubSub: true, - method: in.Method, params: in.Payload}}, false, nil - } +func (c *jsonCodec) writeJSON(ctx context.Context, v interface{}) error { + c.encMu.Lock() + defer c.encMu.Unlock() - elems := strings.Split(in.Method, serviceMethodSeparator) - if len(elems) != 2 { - return nil, false, &methodNotFoundError{in.Method, ""} + deadline, ok := ctx.Deadline() + if !ok { + deadline = time.Now().Add(defaultWriteTimeout) } + c.conn.SetWriteDeadline(deadline) + return c.encode(v) +} - // regular RPC call - if len(in.Payload) == 0 { - return []rpcRequest{{service: elems[0], method: elems[1], id: &in.Id}}, false, nil - } +func (c *jsonCodec) close() { + c.closer.Do(func() { + close(c.closeCh) + c.conn.Close() + }) +} - return []rpcRequest{{service: elems[0], method: elems[1], id: &in.Id, params: in.Payload}}, false, nil +// Closed returns a channel which will be closed when Close is called +func (c *jsonCodec) closed() <-chan interface{} { + return c.closeCh } -// parseBatchRequest will parse a batch request into a collection of requests from the given RawMessage, an indication -// if the request was a batch or an error when the request could not be read. -func parseBatchRequest(incomingMsg json.RawMessage) ([]rpcRequest, bool, Error) { - var in []jsonRequest - if err := json.Unmarshal(incomingMsg, &in); err != nil { - return nil, false, &invalidMessageError{err.Error()} +// parseMessage parses raw bytes as a (batch of) JSON-RPC message(s). There are no error +// checks in this function because the raw message has already been syntax-checked when it +// is called. Any non-JSON-RPC messages in the input return the zero value of +// jsonrpcMessage. +func parseMessage(raw json.RawMessage) ([]*jsonrpcMessage, bool) { + if !isBatch(raw) { + msgs := []*jsonrpcMessage{{}} + json.Unmarshal(raw, &msgs[0]) + return msgs, false } - - requests := make([]rpcRequest, len(in)) - for i, r := range in { - if err := checkReqId(r.Id); err != nil { - return nil, false, &invalidMessageError{err.Error()} - } - - id := &in[i].Id - - // subscribe are special, they will always use `subscriptionMethod` as first param in the payload - if strings.HasSuffix(r.Method, subscribeMethodSuffix) { - requests[i] = rpcRequest{id: id, isPubSub: true} - if len(r.Payload) > 0 { - // first param must be subscription name - var subscribeMethod [1]string - if err := json.Unmarshal(r.Payload, &subscribeMethod); err != nil { - log.Debug(fmt.Sprintf("Unable to parse subscription method: %v\n", err)) - return nil, false, &invalidRequestError{"Unable to parse subscription request"} - } - - requests[i].service, requests[i].method = strings.TrimSuffix(r.Method, subscribeMethodSuffix), subscribeMethod[0] - requests[i].params = r.Payload - continue - } - - return nil, true, &invalidRequestError{"Unable to parse (un)subscribe request arguments"} - } - - if strings.HasSuffix(r.Method, unsubscribeMethodSuffix) { - requests[i] = rpcRequest{id: id, isPubSub: true, method: r.Method, params: r.Payload} - continue - } - - if len(r.Payload) == 0 { - requests[i] = rpcRequest{id: id, params: nil} - } else { - requests[i] = rpcRequest{id: id, params: r.Payload} - } - if elem := strings.Split(r.Method, serviceMethodSeparator); len(elem) == 2 { - requests[i].service, requests[i].method = elem[0], elem[1] - } else { - requests[i].err = &methodNotFoundError{r.Method, ""} - } + dec := json.NewDecoder(bytes.NewReader(raw)) + dec.Token() // skip '[' + var msgs []*jsonrpcMessage + for dec.More() { + msgs = append(msgs, new(jsonrpcMessage)) + dec.Decode(&msgs[len(msgs)-1]) } - - return requests, true, nil + return msgs, true } -// ParseRequestArguments tries to parse the given params (json.RawMessage) with the given -// types. It returns the parsed values or an error when the parsing failed. -func (c *jsonCodec) ParseRequestArguments(argTypes []reflect.Type, params interface{}) ([]reflect.Value, Error) { - if args, ok := params.(json.RawMessage); !ok { - return nil, &invalidParamsError{"Invalid params supplied"} - } else { - return parsePositionalArguments(args, argTypes) +// isBatch returns true when the first non-whitespace characters is '[' +func isBatch(raw json.RawMessage) bool { + for _, c := range raw { + // skip insignificant whitespace (http://www.ietf.org/rfc/rfc4627.txt) + if c == 0x20 || c == 0x09 || c == 0x0a || c == 0x0d { + continue + } + return c == '[' } + return false } // parsePositionalArguments tries to parse the given args to an array of values with the // given types. It returns the parsed values or an error when the args could not be // parsed. Missing optional arguments are returned as reflect.Zero values. -func parsePositionalArguments(rawArgs json.RawMessage, types []reflect.Type) ([]reflect.Value, Error) { - // Read beginning of the args array. +func parsePositionalArguments(rawArgs json.RawMessage, types []reflect.Type) ([]reflect.Value, error) { dec := json.NewDecoder(bytes.NewReader(rawArgs)) - if tok, _ := dec.Token(); tok != json.Delim('[') { - return nil, &invalidParamsError{"non-array args"} + var args []reflect.Value + tok, err := dec.Token() + switch { + case err == io.EOF || tok == nil && err == nil: + // "params" is optional and may be empty. Also allow "params":null even though it's + // not in the spec because our own client used to send it. + case err != nil: + return nil, err + case tok == json.Delim('['): + // Read argument array. + if args, err = parseArgumentArray(dec, types); err != nil { + return nil, err + } + default: + return nil, errors.New("non-array args") } - // Read args. + // Set any missing args to nil. + for i := len(args); i < len(types); i++ { + if types[i].Kind() != reflect.Ptr { + return nil, fmt.Errorf("missing value for required argument %d", i) + } + args = append(args, reflect.Zero(types[i])) + } + return args, nil +} + +func parseArgumentArray(dec *json.Decoder, types []reflect.Type) ([]reflect.Value, error) { args := make([]reflect.Value, 0, len(types)) for i := 0; dec.More(); i++ { if i >= len(types) { - return nil, &invalidParamsError{fmt.Sprintf("too many arguments, want at most %d", len(types))} + return args, fmt.Errorf("too many arguments, want at most %d", len(types)) } argval := reflect.New(types[i]) if err := dec.Decode(argval.Interface()); err != nil { - return nil, &invalidParamsError{fmt.Sprintf("invalid argument %d: %v", i, err)} + return args, fmt.Errorf("invalid argument %d: %v", i, err) } if argval.IsNil() && types[i].Kind() != reflect.Ptr { - return nil, &invalidParamsError{fmt.Sprintf("missing value for required argument %d", i)} + return args, fmt.Errorf("missing value for required argument %d", i) } args = append(args, argval.Elem()) } // Read end of args array. - if _, err := dec.Token(); err != nil { - return nil, &invalidParamsError{err.Error()} - } - // Set any missing args to nil. - for i := len(args); i < len(types); i++ { - if types[i].Kind() != reflect.Ptr { - return nil, &invalidParamsError{fmt.Sprintf("missing value for required argument %d", i)} - } - args = append(args, reflect.Zero(types[i])) - } - return args, nil -} - -// CreateResponse will create a JSON-RPC success response with the given id and reply as result. -func (c *jsonCodec) CreateResponse(id interface{}, reply interface{}) interface{} { - return &jsonSuccessResponse{Version: jsonrpcVersion, Id: id, Result: reply} -} - -// CreateErrorResponse will create a JSON-RPC error response with the given id and error. -func (c *jsonCodec) CreateErrorResponse(id interface{}, err Error) interface{} { - return &jsonErrResponse{Version: jsonrpcVersion, Id: id, Error: jsonError{Code: err.ErrorCode(), Message: err.Error()}} -} - -// CreateErrorResponseWithInfo will create a JSON-RPC error response with the given id and error. -// info is optional and contains additional information about the error. When an empty string is passed it is ignored. -func (c *jsonCodec) CreateErrorResponseWithInfo(id interface{}, err Error, info interface{}) interface{} { - return &jsonErrResponse{Version: jsonrpcVersion, Id: id, - Error: jsonError{Code: err.ErrorCode(), Message: err.Error(), Data: info}} -} - -// CreateNotification will create a JSON-RPC notification with the given subscription id and event as params. -func (c *jsonCodec) CreateNotification(subid, namespace string, event interface{}) interface{} { - return &jsonNotification{Version: jsonrpcVersion, Method: namespace + notificationMethodSuffix, - Params: jsonSubscription{Subscription: subid, Result: event}} -} - -// Write message to client -func (c *jsonCodec) Write(res interface{}) error { - c.encMu.Lock() - defer c.encMu.Unlock() - - return c.encode(res) + _, err := dec.Token() + return args, err } -// Close the underlying connection -func (c *jsonCodec) Close() { - c.closer.Do(func() { - close(c.closed) - c.rw.Close() - }) -} - -// Closed returns a channel which will be closed when Close is called -func (c *jsonCodec) Closed() <-chan interface{} { - return c.closed +// parseSubscriptionName extracts the subscription name from an encoded argument array. +func parseSubscriptionName(rawArgs json.RawMessage) (string, error) { + dec := json.NewDecoder(bytes.NewReader(rawArgs)) + if tok, _ := dec.Token(); tok != json.Delim('[') { + return "", errors.New("non-array args") + } + v, _ := dec.Token() + method, ok := v.(string) + if !ok { + return "", errors.New("expected subscription name as first argument") + } + return method, nil } diff --git a/rpc/json_test.go b/rpc/json_test.go deleted file mode 100644 index 5048d2f7a067..000000000000 --- a/rpc/json_test.go +++ /dev/null @@ -1,178 +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 rpc - -import ( - "bufio" - "bytes" - "encoding/json" - "reflect" - "strconv" - "testing" -) - -type RWC struct { - *bufio.ReadWriter -} - -func (rwc *RWC) Close() error { - return nil -} - -func TestJSONRequestParsing(t *testing.T) { - server := NewServer() - service := new(Service) - - if err := server.RegisterName("calc", service); err != nil { - t.Fatalf("%v", err) - } - - req := bytes.NewBufferString(`{"id": 1234, "jsonrpc": "2.0", "method": "calc_add", "params": [11, 22]}`) - var str string - reply := bytes.NewBufferString(str) - rw := &RWC{bufio.NewReadWriter(bufio.NewReader(req), bufio.NewWriter(reply))} - - codec := NewJSONCodec(rw) - - requests, batch, err := codec.ReadRequestHeaders() - if err != nil { - t.Fatalf("%v", err) - } - - if batch { - t.Fatalf("Request isn't a batch") - } - - if len(requests) != 1 { - t.Fatalf("Expected 1 request but got %d requests - %v", len(requests), requests) - } - - if requests[0].service != "calc" { - t.Fatalf("Expected service 'calc' but got '%s'", requests[0].service) - } - - if requests[0].method != "add" { - t.Fatalf("Expected method 'Add' but got '%s'", requests[0].method) - } - - if rawId, ok := requests[0].id.(*json.RawMessage); ok { - id, e := strconv.ParseInt(string(*rawId), 0, 64) - if e != nil { - t.Fatalf("%v", e) - } - if id != 1234 { - t.Fatalf("Expected id 1234 but got %d", id) - } - } else { - t.Fatalf("invalid request, expected *json.RawMesage got %T", requests[0].id) - } - - var arg int - args := []reflect.Type{reflect.TypeOf(arg), reflect.TypeOf(arg)} - - v, err := codec.ParseRequestArguments(args, requests[0].params) - if err != nil { - t.Fatalf("%v", err) - } - - if len(v) != 2 { - t.Fatalf("Expected 2 argument values, got %d", len(v)) - } - - if v[0].Int() != 11 || v[1].Int() != 22 { - t.Fatalf("expected %d == 11 && %d == 22", v[0].Int(), v[1].Int()) - } -} - -func TestJSONRequestParamsParsing(t *testing.T) { - - var ( - stringT = reflect.TypeOf("") - intT = reflect.TypeOf(0) - intPtrT = reflect.TypeOf(new(int)) - - stringV = reflect.ValueOf("abc") - i = 1 - intV = reflect.ValueOf(i) - intPtrV = reflect.ValueOf(&i) - ) - - var validTests = []struct { - input string - argTypes []reflect.Type - expected []reflect.Value - }{ - {`[]`, []reflect.Type{}, []reflect.Value{}}, - {`[]`, []reflect.Type{intPtrT}, []reflect.Value{intPtrV}}, - {`[1]`, []reflect.Type{intT}, []reflect.Value{intV}}, - {`[1,"abc"]`, []reflect.Type{intT, stringT}, []reflect.Value{intV, stringV}}, - {`[null]`, []reflect.Type{intPtrT}, []reflect.Value{intPtrV}}, - {`[null,"abc"]`, []reflect.Type{intPtrT, stringT, intPtrT}, []reflect.Value{intPtrV, stringV, intPtrV}}, - {`[null,"abc",null]`, []reflect.Type{intPtrT, stringT, intPtrT}, []reflect.Value{intPtrV, stringV, intPtrV}}, - } - - codec := jsonCodec{} - - for _, test := range validTests { - params := (json.RawMessage)([]byte(test.input)) - args, err := codec.ParseRequestArguments(test.argTypes, params) - - if err != nil { - t.Fatal(err) - } - - var match []interface{} - json.Unmarshal([]byte(test.input), &match) - - if len(args) != len(test.argTypes) { - t.Fatalf("expected %d parsed args, got %d", len(test.argTypes), len(args)) - } - - for i, arg := range args { - expected := test.expected[i] - - if arg.Kind() != expected.Kind() { - t.Errorf("expected type for param %d in %s", i, test.input) - } - - if arg.Kind() == reflect.Int && arg.Int() != expected.Int() { - t.Errorf("expected int(%d), got int(%d) in %s", expected.Int(), arg.Int(), test.input) - } - - if arg.Kind() == reflect.String && arg.String() != expected.String() { - t.Errorf("expected string(%s), got string(%s) in %s", expected.String(), arg.String(), test.input) - } - } - } - - var invalidTests = []struct { - input string - argTypes []reflect.Type - }{ - {`[]`, []reflect.Type{intT}}, - {`[null]`, []reflect.Type{intT}}, - {`[1]`, []reflect.Type{stringT}}, - {`[1,2]`, []reflect.Type{stringT}}, - {`["abc", null]`, []reflect.Type{stringT, intT}}, - } - - for i, test := range invalidTests { - if _, err := codec.ParseRequestArguments(test.argTypes, test.input); err == nil { - t.Errorf("expected test %d - %s to fail", i, test.input) - } - } -} diff --git a/rpc/server.go b/rpc/server.go index 1a7ac3a6ffa2..ddd7c744c024 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -18,20 +18,18 @@ package rpc import ( "context" - "fmt" - "reflect" - "runtime" - "strings" - "sync" + "io" "sync/atomic" mapset "github.com/deckarep/golang-set" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) const MetadataApi = "rpc" -// CodecOption specifies which type of messages this codec supports +// CodecOption specifies which type of messages a codec supports. +// +// Deprecated: this option is no longer honored by Server. type CodecOption int const ( @@ -42,401 +40,108 @@ const ( OptionSubscriptions = 1 << iota // support pub sub ) -// NewServer will create a new server instance with no registered handlers. -func NewServer() *Server { - server := &Server{ - services: make(serviceRegistry), - codecs: mapset.NewSet(), - run: 1, - } +// Server is an RPC server. +type Server struct { + services serviceRegistry + idgen func() ID + run int32 + codecs mapset.Set +} - // register a default service which will provide meta information about the RPC service such as the services and - // methods it offers. +// NewServer creates a new server instance with no registered handlers. +func NewServer() *Server { + server := &Server{idgen: randomIDGenerator(), codecs: mapset.NewSet(), run: 1} + // Register the default service providing meta information about the RPC service such + // as the services and methods it offers. rpcService := &RPCService{server} server.RegisterName(MetadataApi, rpcService) - return server } -// RPCService gives meta information about the server. -// e.g. gives information about the loaded modules. -type RPCService struct { - server *Server +// RegisterName creates a service for the given receiver type under the given name. When no +// methods on the given receiver match the criteria to be either a RPC method or a +// subscription an error is returned. Otherwise a new service is created and added to the +// service collection this server provides to clients. +func (s *Server) RegisterName(name string, receiver interface{}) error { + return s.services.registerName(name, receiver) } -// Modules returns the list of RPC services with their version number -func (s *RPCService) Modules() map[string]string { - modules := make(map[string]string) - for name := range s.server.services { - modules[name] = "1.0" - } - return modules -} - -// RegisterName will create a service for the given rcvr type under the given name. When no methods on the given rcvr -// match the criteria to be either a RPC method or a subscription an error is returned. Otherwise a new service is -// created and added to the service collection this server instance serves. -func (s *Server) RegisterName(name string, rcvr interface{}) error { - if s.services == nil { - s.services = make(serviceRegistry) - } - - svc := new(service) - svc.typ = reflect.TypeOf(rcvr) - rcvrVal := reflect.ValueOf(rcvr) - - if name == "" { - return fmt.Errorf("no service name for type %s", svc.typ.String()) - } - if !isExported(reflect.Indirect(rcvrVal).Type().Name()) { - return fmt.Errorf("%s is not exported", reflect.Indirect(rcvrVal).Type().Name()) - } - - methods, subscriptions := suitableCallbacks(rcvrVal, svc.typ) - - if len(methods) == 0 && len(subscriptions) == 0 { - return fmt.Errorf("Service %T doesn't have any suitable methods/subscriptions to expose", rcvr) - } +// ServeCodec reads incoming requests from codec, calls the appropriate callback and writes +// the response back using the given codec. It will block until the codec is closed or the +// server is stopped. In either case the codec is closed. +// +// Note that codec options are no longer supported. +func (s *Server) ServeCodec(codec ServerCodec, options CodecOption) { + defer codec.close() - // already a previous service register under given name, merge methods/subscriptions - if regsvc, present := s.services[name]; present { - for _, m := range methods { - regsvc.callbacks[formatName(m.method.Name)] = m - } - for _, s := range subscriptions { - regsvc.subscriptions[formatName(s.method.Name)] = s - } - return nil + // Don't serve if server is stopped. + if atomic.LoadInt32(&s.run) == 0 { + return } - svc.name = name - svc.callbacks, svc.subscriptions = methods, subscriptions + // Add the codec to the set so it can be closed by Stop. + s.codecs.Add(codec) + defer s.codecs.Remove(codec) - s.services[svc.name] = svc - return nil + c := initClient(codec, s.idgen, &s.services) + <-codec.closed() + c.Close() } -// serveRequest will reads requests from the codec, calls the RPC callback and -// writes the response to the given codec. -// -// If singleShot is true it will process a single request, otherwise it will handle -// requests until the codec returns an error when reading a request (in most cases -// an EOF). It executes requests in parallel when singleShot is false. -func (s *Server) serveRequest(ctx context.Context, codec ServerCodec, singleShot bool, options CodecOption) error { - var pend sync.WaitGroup - - defer func() { - if err := recover(); err != nil { - const size = 64 << 10 - buf := make([]byte, size) - buf = buf[:runtime.Stack(buf, false)] - log.Error(string(buf)) - } - s.codecsMu.Lock() - s.codecs.Remove(codec) - s.codecsMu.Unlock() - }() - - // ctx, cancel := context.WithCancel(context.Background()) - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - // if the codec supports notification include a notifier that callbacks can use - // to send notification to clients. It is tied to the codec/connection. If the - // connection is closed the notifier will stop and cancels all active subscriptions. - if options&OptionSubscriptions == OptionSubscriptions { - ctx = context.WithValue(ctx, notifierKey{}, newNotifier(codec)) - } - s.codecsMu.Lock() - if atomic.LoadInt32(&s.run) != 1 { // server stopped - s.codecsMu.Unlock() - return &shutdownError{} +// serveSingleRequest reads and processes a single RPC request from the given codec. This +// is used to serve HTTP connections. Subscriptions and reverse calls are not allowed in +// this mode. +func (s *Server) serveSingleRequest(ctx context.Context, codec ServerCodec) { + // Don't serve if server is stopped. + if atomic.LoadInt32(&s.run) == 0 { + return } - s.codecs.Add(codec) - s.codecsMu.Unlock() - // test if the server is ordered to stop - for atomic.LoadInt32(&s.run) == 1 { - reqs, batch, err := s.readRequest(codec) - if err != nil { - // If a parsing error occurred, send an error - if err.Error() != "EOF" { - log.Debug(fmt.Sprintf("read error %v\n", err)) - codec.Write(codec.CreateErrorResponse(nil, err)) - } - // Error or end of stream, wait for requests and tear down - pend.Wait() - return nil - } + h := newHandler(ctx, codec, s.idgen, &s.services) + h.allowSubscribe = false + defer h.close(io.EOF, nil) - // check if server is ordered to shutdown and return an error - // telling the client that his request failed. - if atomic.LoadInt32(&s.run) != 1 { - err = &shutdownError{} - if batch { - resps := make([]interface{}, len(reqs)) - for i, r := range reqs { - resps[i] = codec.CreateErrorResponse(&r.id, err) - } - codec.Write(resps) - } else { - codec.Write(codec.CreateErrorResponse(&reqs[0].id, err)) - } - return nil - } - // If a single shot request is executing, run and return immediately - if singleShot { - if batch { - s.execBatch(ctx, codec, reqs) - } else { - s.exec(ctx, codec, reqs[0]) - } - return nil + reqs, batch, err := codec.readBatch() + if err != nil { + if err != io.EOF { + codec.writeJSON(ctx, errorMessage(&invalidMessageError{"parse error"})) } - // For multi-shot connections, start a goroutine to serve and loop back - pend.Add(1) - - go func(reqs []*serverRequest, batch bool) { - defer pend.Done() - if batch { - s.execBatch(ctx, codec, reqs) - } else { - s.exec(ctx, codec, reqs[0]) - } - }(reqs, batch) + return + } + if batch { + h.handleBatch(reqs) + } else { + h.handleMsg(reqs[0]) } - return nil -} - -// ServeCodec reads incoming requests from codec, calls the appropriate callback and writes the -// response back using the given codec. It will block until the codec is closed or the server is -// stopped. In either case the codec is closed. -func (s *Server) ServeCodec(codec ServerCodec, options CodecOption) { - defer codec.Close() - s.serveRequest(context.Background(), codec, false, options) -} - -// ServeSingleRequest reads and processes a single RPC request from the given codec. It will not -// close the codec unless a non-recoverable error has occurred. Note, this method will return after -// a single request has been processed! -func (s *Server) ServeSingleRequest(ctx context.Context, codec ServerCodec, options CodecOption) { - s.serveRequest(ctx, codec, true, options) } -// Stop will stop reading new requests, wait for stopPendingRequestTimeout to allow pending requests to finish, -// close all codecs which will cancel pending requests/subscriptions. +// Stop stops reading new requests, waits for stopPendingRequestTimeout to allow pending +// requests to finish, then closes all codecs which will cancel pending requests and +// subscriptions. func (s *Server) Stop() { if atomic.CompareAndSwapInt32(&s.run, 1, 0) { - log.Debug("RPC Server shutdown initiatied") - s.codecsMu.Lock() - defer s.codecsMu.Unlock() + log.Debug("RPC server shutting down") s.codecs.Each(func(c interface{}) bool { - c.(ServerCodec).Close() + c.(ServerCodec).close() return true }) } } -// createSubscription will call the subscription callback and returns the subscription id or error. -func (s *Server) createSubscription(ctx context.Context, c ServerCodec, req *serverRequest) (ID, error) { - // subscription have as first argument the context following optional arguments - args := []reflect.Value{req.callb.rcvr, reflect.ValueOf(ctx)} - args = append(args, req.args...) - reply := req.callb.method.Func.Call(args) - - if !reply[1].IsNil() { // subscription creation failed - return "", reply[1].Interface().(error) - } - - return reply[0].Interface().(*Subscription).ID, nil -} - -// handle executes a request and returns the response from the callback. -func (s *Server) handle(ctx context.Context, codec ServerCodec, req *serverRequest) (interface{}, func()) { - if req.err != nil { - return codec.CreateErrorResponse(&req.id, req.err), nil - } - - if req.isUnsubscribe { // cancel subscription, first param must be the subscription id - if len(req.args) >= 1 && req.args[0].Kind() == reflect.String { - notifier, supported := NotifierFromContext(ctx) - if !supported { // interface doesn't support subscriptions (e.g. http) - return codec.CreateErrorResponse(&req.id, &callbackError{ErrNotificationsUnsupported.Error()}), nil - } - - subid := ID(req.args[0].String()) - if err := notifier.unsubscribe(subid); err != nil { - return codec.CreateErrorResponse(&req.id, &callbackError{err.Error()}), nil - } - - return codec.CreateResponse(req.id, true), nil - } - return codec.CreateErrorResponse(&req.id, &invalidParamsError{"Expected subscription id as first argument"}), nil - } - - if req.callb.isSubscribe { - subid, err := s.createSubscription(ctx, codec, req) - if err != nil { - return codec.CreateErrorResponse(&req.id, &callbackError{err.Error()}), nil - } - - // active the subscription after the sub id was successfully sent to the client - activateSub := func() { - notifier, _ := NotifierFromContext(ctx) - notifier.activate(subid, req.svcname) - } - - return codec.CreateResponse(req.id, subid), activateSub - } - - // regular RPC call, prepare arguments - if len(req.args) != len(req.callb.argTypes) { - rpcErr := &invalidParamsError{fmt.Sprintf("%s%s%s expects %d parameters, got %d", - req.svcname, serviceMethodSeparator, req.callb.method.Name, - len(req.callb.argTypes), len(req.args))} - return codec.CreateErrorResponse(&req.id, rpcErr), nil - } - - arguments := []reflect.Value{req.callb.rcvr} - if req.callb.hasCtx { - arguments = append(arguments, reflect.ValueOf(ctx)) - } - if len(req.args) > 0 { - arguments = append(arguments, req.args...) - } - - // execute RPC method and return result - reply := req.callb.method.Func.Call(arguments) - if len(reply) == 0 { - return codec.CreateResponse(req.id, nil), nil - } - if req.callb.errPos >= 0 { // test if method returned an error - if !reply[req.callb.errPos].IsNil() { - e := reply[req.callb.errPos].Interface().(error) - res := codec.CreateErrorResponse(&req.id, &callbackError{e.Error()}) - return res, nil - } - } - return codec.CreateResponse(req.id, reply[0].Interface()), nil -} - -// exec executes the given request and writes the result back using the codec. -func (s *Server) exec(ctx context.Context, codec ServerCodec, req *serverRequest) { - var response interface{} - var callback func() - if req.err != nil { - response = codec.CreateErrorResponse(&req.id, req.err) - } else { - response, callback = s.handle(ctx, codec, req) - } - - if err := codec.Write(response); err != nil { - log.Error(fmt.Sprintf("%v\n", err)) - codec.Close() - } - - // when request was a subscribe request this allows these subscriptions to be actived - if callback != nil { - callback() - } -} - -// execBatch executes the given requests and writes the result back using the codec. -// It will only write the response back when the last request is processed. -func (s *Server) execBatch(ctx context.Context, codec ServerCodec, requests []*serverRequest) { - responses := make([]interface{}, len(requests)) - var callbacks []func() - for i, req := range requests { - if req.err != nil { - responses[i] = codec.CreateErrorResponse(&req.id, req.err) - } else { - var callback func() - if responses[i], callback = s.handle(ctx, codec, req); callback != nil { - callbacks = append(callbacks, callback) - } - } - } - - if err := codec.Write(responses); err != nil { - log.Error(fmt.Sprintf("%v\n", err)) - codec.Close() - } - - // when request holds one of more subscribe requests this allows these subscriptions to be activated - for _, c := range callbacks { - c() - } +// RPCService gives meta information about the server. +// e.g. gives information about the loaded modules. +type RPCService struct { + server *Server } -// readRequest requests the next (batch) request from the codec. It will return the collection -// of requests, an indication if the request was a batch, the invalid request identifier and an -// error when the request could not be read/parsed. -func (s *Server) readRequest(codec ServerCodec) ([]*serverRequest, bool, Error) { - reqs, batch, err := codec.ReadRequestHeaders() - if err != nil { - return nil, batch, err - } - - requests := make([]*serverRequest, len(reqs)) - - // verify requests - for i, r := range reqs { - var ok bool - var svc *service - - if r.err != nil { - requests[i] = &serverRequest{id: r.id, err: r.err} - continue - } - - if r.isPubSub && strings.HasSuffix(r.method, unsubscribeMethodSuffix) { - requests[i] = &serverRequest{id: r.id, isUnsubscribe: true} - argTypes := []reflect.Type{reflect.TypeOf("")} // expect subscription id as first arg - if args, err := codec.ParseRequestArguments(argTypes, r.params); err == nil { - requests[i].args = args - } else { - requests[i].err = &invalidParamsError{err.Error()} - } - continue - } - - if svc, ok = s.services[r.service]; !ok { // rpc method isn't available - requests[i] = &serverRequest{id: r.id, err: &methodNotFoundError{r.service, r.method}} - continue - } - - if r.isPubSub { // eth_subscribe, r.method contains the subscription method name - if callb, ok := svc.subscriptions[r.method]; ok { - requests[i] = &serverRequest{id: r.id, svcname: svc.name, callb: callb} - if r.params != nil && len(callb.argTypes) > 0 { - argTypes := []reflect.Type{reflect.TypeOf("")} - argTypes = append(argTypes, callb.argTypes...) - if args, err := codec.ParseRequestArguments(argTypes, r.params); err == nil { - requests[i].args = args[1:] // first one is service.method name which isn't an actual argument - } else { - requests[i].err = &invalidParamsError{err.Error()} - } - } - } else { - requests[i] = &serverRequest{id: r.id, err: &methodNotFoundError{r.service, r.method}} - } - continue - } - - if callb, ok := svc.callbacks[r.method]; ok { // lookup RPC method - requests[i] = &serverRequest{id: r.id, svcname: svc.name, callb: callb} - if r.params != nil && len(callb.argTypes) > 0 { - if args, err := codec.ParseRequestArguments(callb.argTypes, r.params); err == nil { - requests[i].args = args - } else { - requests[i].err = &invalidParamsError{err.Error()} - } - } - continue - } +// Modules returns the list of RPC services with their version number +func (s *RPCService) Modules() map[string]string { + s.server.services.mu.Lock() + defer s.server.services.mu.Unlock() - requests[i] = &serverRequest{id: r.id, err: &methodNotFoundError{r.service, r.method}} + modules := make(map[string]string) + for name := range s.server.services.services { + modules[name] = "1.0" } - - return requests, batch, nil + return modules } diff --git a/rpc/server_test.go b/rpc/server_test.go index 90d62f26d8f6..a4ca1fde43ea 100644 --- a/rpc/server_test.go +++ b/rpc/server_test.go @@ -17,146 +17,136 @@ package rpc import ( - "context" - "encoding/json" + "bufio" + "bytes" + "io" + "io/ioutil" "net" - "reflect" + "path/filepath" + "strings" "testing" "time" ) -type Service struct{} - -type Args struct { - S string -} - -func (s *Service) NoArgsRets() { -} - -type Result struct { - String string - Int int - Args *Args -} - -func (s *Service) Echo(str string, i int, args *Args) Result { - return Result{str, i, args} -} - -func (s *Service) EchoWithCtx(ctx context.Context, str string, i int, args *Args) Result { - return Result{str, i, args} -} - -func (s *Service) Sleep(ctx context.Context, duration time.Duration) { - select { - case <-time.After(duration): - case <-ctx.Done(): - } -} - -func (s *Service) Rets() (string, error) { - return "", nil -} - -func (s *Service) InvalidRets1() (error, string) { - return nil, "" -} - -func (s *Service) InvalidRets2() (string, string) { - return "", "" -} - -func (s *Service) InvalidRets3() (string, string, error) { - return "", "", nil -} - -func (s *Service) Subscription(ctx context.Context) (*Subscription, error) { - return nil, nil -} - func TestServerRegisterName(t *testing.T) { server := NewServer() - service := new(Service) + service := new(testService) - if err := server.RegisterName("calc", service); err != nil { + if err := server.RegisterName("test", service); err != nil { t.Fatalf("%v", err) } - if len(server.services) != 2 { - t.Fatalf("Expected 2 service entries, got %d", len(server.services)) + if len(server.services.services) != 2 { + t.Fatalf("Expected 2 service entries, got %d", len(server.services.services)) } - svc, ok := server.services["calc"] + svc, ok := server.services.services["test"] if !ok { t.Fatalf("Expected service calc to be registered") } - if len(svc.callbacks) != 5 { - t.Errorf("Expected 5 callbacks for service 'calc', got %d", len(svc.callbacks)) - } - - if len(svc.subscriptions) != 1 { - t.Errorf("Expected 1 subscription for service 'calc', got %d", len(svc.subscriptions)) + wantCallbacks := 7 + if len(svc.callbacks) != wantCallbacks { + t.Errorf("Expected %d callbacks for service 'service', got %d", wantCallbacks, len(svc.callbacks)) } } -func testServerMethodExecution(t *testing.T, method string) { - server := NewServer() - service := new(Service) - - if err := server.RegisterName("test", service); err != nil { - t.Fatalf("%v", err) +func TestServer(t *testing.T) { + files, err := ioutil.ReadDir("testdata") + if err != nil { + t.Fatal("where'd my testdata go?") } + for _, f := range files { + if f.IsDir() || strings.HasPrefix(f.Name(), ".") { + continue + } + path := filepath.Join("testdata", f.Name()) + name := strings.TrimSuffix(f.Name(), filepath.Ext(f.Name())) + t.Run(name, func(t *testing.T) { + runTestScript(t, path) + }) + } +} - stringArg := "string arg" - intArg := 1122 - argsArg := &Args{"abcde"} - params := []interface{}{stringArg, intArg, argsArg} - - request := map[string]interface{}{ - "id": 12345, - "method": "test_" + method, - "version": "2.0", - "params": params, +func runTestScript(t *testing.T, file string) { + server := newTestServer() + content, err := ioutil.ReadFile(file) + if err != nil { + t.Fatal(err) } clientConn, serverConn := net.Pipe() defer clientConn.Close() - - go server.ServeCodec(NewJSONCodec(serverConn), OptionMethodInvocation) - - out := json.NewEncoder(clientConn) - in := json.NewDecoder(clientConn) - - if err := out.Encode(request); err != nil { - t.Fatal(err) + go server.ServeCodec(NewCodec(serverConn), 0) + readbuf := bufio.NewReader(clientConn) + for _, line := range strings.Split(string(content), "\n") { + line = strings.TrimSpace(line) + switch { + case len(line) == 0 || strings.HasPrefix(line, "//"): + // skip comments, blank lines + continue + case strings.HasPrefix(line, "--> "): + t.Log(line) + // write to connection + clientConn.SetWriteDeadline(time.Now().Add(5 * time.Second)) + if _, err := io.WriteString(clientConn, line[4:]+"\n"); err != nil { + t.Fatalf("write error: %v", err) + } + case strings.HasPrefix(line, "<-- "): + t.Log(line) + want := line[4:] + // read line from connection and compare text + clientConn.SetReadDeadline(time.Now().Add(5 * time.Second)) + sent, err := readbuf.ReadString('\n') + if err != nil { + t.Fatalf("read error: %v", err) + } + sent = strings.TrimRight(sent, "\r\n") + if sent != want { + t.Errorf("wrong line from server\ngot: %s\nwant: %s", sent, want) + } + default: + panic("invalid line in test script: " + line) + } } +} - response := jsonSuccessResponse{Result: &Result{}} - if err := in.Decode(&response); err != nil { - t.Fatal(err) - } +// This test checks that responses are delivered for very short-lived connections that +// only carry a single request. +func TestServerShortLivedConn(t *testing.T) { + server := newTestServer() + defer server.Stop() - if result, ok := response.Result.(*Result); ok { - if result.String != stringArg { - t.Errorf("expected %s, got : %s\n", stringArg, result.String) + listener, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatal("can't listen:", err) + } + defer listener.Close() + go server.ServeListener(listener) + + var ( + request = `{"jsonrpc":"2.0","id":1,"method":"rpc_modules"}` + "\n" + wantResp = `{"jsonrpc":"2.0","id":1,"result":{"nftest":"1.0","rpc":"1.0","test":"1.0"}}` + "\n" + deadline = time.Now().Add(10 * time.Second) + ) + for i := 0; i < 20; i++ { + conn, err := net.Dial("tcp", listener.Addr().String()) + if err != nil { + t.Fatal("can't dial:", err) } - if result.Int != intArg { - t.Errorf("expected %d, got %d\n", intArg, result.Int) + defer conn.Close() + conn.SetDeadline(deadline) + // Write the request, then half-close the connection so the server stops reading. + conn.Write([]byte(request)) + conn.(*net.TCPConn).CloseWrite() + // Now try to get the response. + buf := make([]byte, 2000) + n, err := conn.Read(buf) + if err != nil { + t.Fatal("read error:", err) } - if !reflect.DeepEqual(result.Args, argsArg) { - t.Errorf("expected %v, got %v\n", argsArg, result) + if !bytes.Equal(buf[:n], []byte(wantResp)) { + t.Fatalf("wrong response: %s", buf[:n]) } - } else { - t.Fatalf("invalid response: expected *Result - got: %T", response.Result) } } - -func TestServerMethodExecution(t *testing.T) { - testServerMethodExecution(t, "echo") -} - -func TestServerMethodWithCtx(t *testing.T) { - testServerMethodExecution(t, "echoWithCtx") -} diff --git a/rpc/service.go b/rpc/service.go new file mode 100644 index 000000000000..bef891ea1125 --- /dev/null +++ b/rpc/service.go @@ -0,0 +1,261 @@ +// Copyright 2019 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 ( + "context" + "errors" + "fmt" + "reflect" + "runtime" + "strings" + "sync" + "unicode" + + "github.com/ethereum/go-ethereum/log" +) + +var ( + contextType = reflect.TypeOf((*context.Context)(nil)).Elem() + errorType = reflect.TypeOf((*error)(nil)).Elem() + subscriptionType = reflect.TypeOf(Subscription{}) + stringType = reflect.TypeOf("") +) + +type serviceRegistry struct { + mu sync.Mutex + services map[string]service +} + +// service represents a registered object. +type service struct { + name string // name for service + callbacks map[string]*callback // registered handlers + subscriptions map[string]*callback // available subscriptions/notifications +} + +// callback is a method callback which was registered in the server +type callback struct { + fn reflect.Value // the function + rcvr reflect.Value // receiver object of method, set if fn is method + argTypes []reflect.Type // input argument types + hasCtx bool // method's first argument is a context (not included in argTypes) + errPos int // err return idx, of -1 when method cannot return error + isSubscribe bool // true if this is a subscription callback +} + +func (r *serviceRegistry) registerName(name string, rcvr interface{}) error { + rcvrVal := reflect.ValueOf(rcvr) + if name == "" { + return fmt.Errorf("no service name for type %s", rcvrVal.Type().String()) + } + callbacks := suitableCallbacks(rcvrVal) + if len(callbacks) == 0 { + return fmt.Errorf("service %T doesn't have any suitable methods/subscriptions to expose", rcvr) + } + + r.mu.Lock() + defer r.mu.Unlock() + if r.services == nil { + r.services = make(map[string]service) + } + svc, ok := r.services[name] + if !ok { + svc = service{ + name: name, + callbacks: make(map[string]*callback), + subscriptions: make(map[string]*callback), + } + r.services[name] = svc + } + for name, cb := range callbacks { + if cb.isSubscribe { + svc.subscriptions[name] = cb + } else { + svc.callbacks[name] = cb + } + } + return nil +} + +// callback returns the callback corresponding to the given RPC method name. +func (r *serviceRegistry) callback(method string) *callback { + elem := strings.SplitN(method, serviceMethodSeparator, 2) + if len(elem) != 2 { + return nil + } + r.mu.Lock() + defer r.mu.Unlock() + return r.services[elem[0]].callbacks[elem[1]] +} + +// subscription returns a subscription callback in the given service. +func (r *serviceRegistry) subscription(service, name string) *callback { + r.mu.Lock() + defer r.mu.Unlock() + return r.services[service].subscriptions[name] +} + +// suitableCallbacks iterates over the methods of the given type. It determines if a method +// satisfies the criteria for a RPC callback or a subscription callback and adds it to the +// collection of callbacks. See server documentation for a summary of these criteria. +func suitableCallbacks(receiver reflect.Value) map[string]*callback { + typ := receiver.Type() + callbacks := make(map[string]*callback) + for m := 0; m < typ.NumMethod(); m++ { + method := typ.Method(m) + if method.PkgPath != "" { + continue // method not exported + } + cb := newCallback(receiver, method.Func) + if cb == nil { + continue // function invalid + } + name := formatName(method.Name) + callbacks[name] = cb + } + return callbacks +} + +// newCallback turns fn (a function) into a callback object. It returns nil if the function +// is unsuitable as an RPC callback. +func newCallback(receiver, fn reflect.Value) *callback { + fntype := fn.Type() + c := &callback{fn: fn, rcvr: receiver, errPos: -1, isSubscribe: isPubSub(fntype)} + // Determine parameter types. They must all be exported or builtin types. + c.makeArgTypes() + + // Verify return types. The function must return at most one error + // and/or one other non-error value. + outs := make([]reflect.Type, fntype.NumOut()) + for i := 0; i < fntype.NumOut(); i++ { + outs[i] = fntype.Out(i) + } + if len(outs) > 2 { + return nil + } + // If an error is returned, it must be the last returned value. + switch { + case len(outs) == 1 && isErrorType(outs[0]): + c.errPos = 0 + case len(outs) == 2: + if isErrorType(outs[0]) || !isErrorType(outs[1]) { + return nil + } + c.errPos = 1 + } + return c +} + +// makeArgTypes composes the argTypes list. +func (c *callback) makeArgTypes() { + fntype := c.fn.Type() + // Skip receiver and context.Context parameter (if present). + firstArg := 0 + if c.rcvr.IsValid() { + firstArg++ + } + if fntype.NumIn() > firstArg && fntype.In(firstArg) == contextType { + c.hasCtx = true + firstArg++ + } + // Add all remaining parameters. + c.argTypes = make([]reflect.Type, fntype.NumIn()-firstArg) + for i := firstArg; i < fntype.NumIn(); i++ { + c.argTypes[i-firstArg] = fntype.In(i) + } +} + +// call invokes the callback. +func (c *callback) call(ctx context.Context, method string, args []reflect.Value) (res interface{}, errRes error) { + // Create the argument slice. + fullargs := make([]reflect.Value, 0, 2+len(args)) + if c.rcvr.IsValid() { + fullargs = append(fullargs, c.rcvr) + } + if c.hasCtx { + fullargs = append(fullargs, reflect.ValueOf(ctx)) + } + fullargs = append(fullargs, args...) + + // Catch panic while running the callback. + defer func() { + if err := recover(); err != nil { + const size = 64 << 10 + buf := make([]byte, size) + buf = buf[:runtime.Stack(buf, false)] + log.Error("RPC method " + method + " crashed: " + fmt.Sprintf("%v\n%s", err, buf)) + errRes = errors.New("method handler crashed") + } + }() + // Run the callback. + results := c.fn.Call(fullargs) + if len(results) == 0 { + return nil, nil + } + if c.errPos >= 0 && !results[c.errPos].IsNil() { + // Method has returned non-nil error value. + err := results[c.errPos].Interface().(error) + return reflect.Value{}, err + } + return results[0].Interface(), nil +} + +// Is t context.Context or *context.Context? +func isContextType(t reflect.Type) bool { + for t.Kind() == reflect.Ptr { + t = t.Elem() + } + return t == contextType +} + +// Does t satisfy the error interface? +func isErrorType(t reflect.Type) bool { + for t.Kind() == reflect.Ptr { + t = t.Elem() + } + return t.Implements(errorType) +} + +// Is t Subscription or *Subscription? +func isSubscriptionType(t reflect.Type) bool { + for t.Kind() == reflect.Ptr { + t = t.Elem() + } + return t == subscriptionType +} + +// isPubSub tests whether the given method has as as first argument a context.Context and +// returns the pair (Subscription, error). +func isPubSub(methodType reflect.Type) bool { + // numIn(0) is the receiver type + if methodType.NumIn() < 2 || methodType.NumOut() != 2 { + return false + } + return isContextType(methodType.In(1)) && + isSubscriptionType(methodType.Out(0)) && + isErrorType(methodType.Out(1)) +} + +// formatName converts to first character of name to lowercase. +func formatName(name string) string { + ret := []rune(name) + if len(ret) > 0 { + ret[0] = unicode.ToLower(ret[0]) + } + return string(ret) +} diff --git a/rpc/stdio.go b/rpc/stdio.go index ea552cca286b..be2bab1c98bd 100644 --- a/rpc/stdio.go +++ b/rpc/stdio.go @@ -19,6 +19,7 @@ package rpc import ( "context" "errors" + "io" "net" "os" "time" @@ -26,39 +27,38 @@ import ( // DialStdIO creates a client on stdin/stdout. func DialStdIO(ctx context.Context) (*Client, error) { - return newClient(ctx, func(_ context.Context) (net.Conn, error) { - return stdioConn{}, nil + return DialIO(ctx, os.Stdin, os.Stdout) +} + +// DialIO creates a client which uses the given IO channels +func DialIO(ctx context.Context, in io.Reader, out io.Writer) (*Client, error) { + return newClient(ctx, func(_ context.Context) (ServerCodec, error) { + return NewCodec(stdioConn{ + in: in, + out: out, + }), nil }) } -type stdioConn struct{} +type stdioConn struct { + in io.Reader + out io.Writer +} func (io stdioConn) Read(b []byte) (n int, err error) { - return os.Stdin.Read(b) + return io.in.Read(b) } func (io stdioConn) Write(b []byte) (n int, err error) { - return os.Stdout.Write(b) + return io.out.Write(b) } func (io stdioConn) Close() error { return nil } -func (io stdioConn) LocalAddr() net.Addr { - return &net.UnixAddr{Name: "stdio", Net: "stdio"} -} - -func (io stdioConn) RemoteAddr() net.Addr { - return &net.UnixAddr{Name: "stdio", Net: "stdio"} -} - -func (io stdioConn) SetDeadline(t time.Time) error { - return &net.OpError{Op: "set", Net: "stdio", Source: nil, Addr: nil, Err: errors.New("deadline not supported")} -} - -func (io stdioConn) SetReadDeadline(t time.Time) error { - return &net.OpError{Op: "set", Net: "stdio", Source: nil, Addr: nil, Err: errors.New("deadline not supported")} +func (io stdioConn) RemoteAddr() string { + return "/dev/stdin" } func (io stdioConn) SetWriteDeadline(t time.Time) error { diff --git a/rpc/subscription.go b/rpc/subscription.go index 6bbb6f75d293..8992bfc5e19a 100644 --- a/rpc/subscription.go +++ b/rpc/subscription.go @@ -17,9 +17,19 @@ package rpc import ( + "bufio" + "container/list" "context" + crand "crypto/rand" + "encoding/binary" + "encoding/hex" + "encoding/json" "errors" + "math/rand" + "reflect" + "strings" "sync" + "time" ) var ( @@ -29,121 +39,289 @@ var ( ErrSubscriptionNotFound = errors.New("subscription not found") ) +var globalGen = randomIDGenerator() + // ID defines a pseudo random number that is used to identify RPC subscriptions. type ID string -// a Subscription is created by a notifier and tight to that notifier. The client can use -// this subscription to wait for an unsubscribe request for the client, see Err(). -type Subscription struct { - ID ID - namespace string - err chan error // closed on unsubscribe +// NewID returns a new, random ID. +func NewID() ID { + return globalGen() } -// Err returns a channel that is closed when the client send an unsubscribe request. -func (s *Subscription) Err() <-chan error { - return s.err +// randomIDGenerator returns a function generates a random IDs. +func randomIDGenerator() func() ID { + seed, err := binary.ReadVarint(bufio.NewReader(crand.Reader)) + if err != nil { + seed = int64(time.Now().Nanosecond()) + } + var ( + mu sync.Mutex + rng = rand.New(rand.NewSource(seed)) + ) + return func() ID { + mu.Lock() + defer mu.Unlock() + id := make([]byte, 16) + rng.Read(id) + return encodeID(id) + } } -// notifierKey is used to store a notifier within the connection context. -type notifierKey struct{} - -// Notifier is tight to a RPC connection that supports subscriptions. -// Server callbacks use the notifier to send notifications. -type Notifier struct { - codec ServerCodec - subMu sync.Mutex - active map[ID]*Subscription - inactive map[ID]*Subscription - buffer map[ID][]interface{} // unsent notifications of inactive subscriptions -} - -// newNotifier creates a new notifier that can be used to send subscription -// notifications to the client. -func newNotifier(codec ServerCodec) *Notifier { - return &Notifier{ - codec: codec, - active: make(map[ID]*Subscription), - inactive: make(map[ID]*Subscription), - buffer: make(map[ID][]interface{}), +func encodeID(b []byte) ID { + id := hex.EncodeToString(b) + id = strings.TrimLeft(id, "0") + if id == "" { + id = "0" // ID's are RPC quantities, no leading zero's and 0 is 0x0. } + return ID("0x" + id) } +type notifierKey struct{} + // NotifierFromContext returns the Notifier value stored in ctx, if any. func NotifierFromContext(ctx context.Context) (*Notifier, bool) { n, ok := ctx.Value(notifierKey{}).(*Notifier) return n, ok } +// Notifier is tied to a RPC connection that supports subscriptions. +// Server callbacks use the notifier to send notifications. +type Notifier struct { + h *handler + namespace string + + mu sync.Mutex + sub *Subscription + buffer []json.RawMessage + callReturned bool + activated bool +} + // CreateSubscription returns a new subscription that is coupled to the // RPC connection. By default subscriptions are inactive and notifications // are dropped until the subscription is marked as active. This is done // by the RPC server after the subscription ID is send to the client. func (n *Notifier) CreateSubscription() *Subscription { - s := &Subscription{ID: NewID(), err: make(chan error)} - n.subMu.Lock() - n.inactive[s.ID] = s - n.subMu.Unlock() - return s + n.mu.Lock() + defer n.mu.Unlock() + + if n.sub != nil { + panic("can't create multiple subscriptions with Notifier") + } else if n.callReturned { + panic("can't create subscription after subscribe call has returned") + } + n.sub = &Subscription{ID: n.h.idgen(), namespace: n.namespace, err: make(chan error, 1)} + return n.sub } // Notify sends a notification to the client with the given data as payload. // If an error occurs the RPC connection is closed and the error is returned. func (n *Notifier) Notify(id ID, data interface{}) error { - n.subMu.Lock() - defer n.subMu.Unlock() + enc, err := json.Marshal(data) + if err != nil { + return err + } - if sub, active := n.active[id]; active { - n.send(sub, data) - } else { - n.buffer[id] = append(n.buffer[id], data) + n.mu.Lock() + defer n.mu.Unlock() + + if n.sub == nil { + panic("can't Notify before subscription is created") + } else if n.sub.ID != id { + panic("Notify with wrong ID") + } + if n.activated { + return n.send(n.sub, enc) } + n.buffer = append(n.buffer, enc) return nil } -func (n *Notifier) send(sub *Subscription, data interface{}) error { - notification := n.codec.CreateNotification(string(sub.ID), sub.namespace, data) - err := n.codec.Write(notification) - if err != nil { - n.codec.Close() +// Closed returns a channel that is closed when the RPC connection is closed. +// Deprecated: use subscription error channel +func (n *Notifier) Closed() <-chan interface{} { + return n.h.conn.closed() +} + +// takeSubscription returns the subscription (if one has been created). No subscription can +// be created after this call. +func (n *Notifier) takeSubscription() *Subscription { + n.mu.Lock() + defer n.mu.Unlock() + n.callReturned = true + return n.sub +} + +// acticate is called after the subscription ID was sent to client. Notifications are +// buffered before activation. This prevents notifications being sent to the client before +// the subscription ID is sent to the client. +func (n *Notifier) activate() error { + n.mu.Lock() + defer n.mu.Unlock() + + for _, data := range n.buffer { + if err := n.send(n.sub, data); err != nil { + return err + } } - return err + n.activated = true + return nil } -// Closed returns a channel that is closed when the RPC connection is closed. -func (n *Notifier) Closed() <-chan interface{} { - return n.codec.Closed() -} - -// unsubscribe a subscription. -// If the subscription could not be found ErrSubscriptionNotFound is returned. -func (n *Notifier) unsubscribe(id ID) error { - n.subMu.Lock() - defer n.subMu.Unlock() - if s, found := n.active[id]; found { - close(s.err) - delete(n.active, id) - return nil +func (n *Notifier) send(sub *Subscription, data json.RawMessage) error { + params, _ := json.Marshal(&subscriptionResult{ID: string(sub.ID), Result: data}) + ctx := context.Background() + return n.h.conn.writeJSON(ctx, &jsonrpcMessage{ + Version: vsn, + Method: n.namespace + notificationMethodSuffix, + Params: params, + }) +} + +// A Subscription is created by a notifier and tight to that notifier. The client can use +// this subscription to wait for an unsubscribe request for the client, see Err(). +type Subscription struct { + ID ID + namespace string + err chan error // closed on unsubscribe +} + +// Err returns a channel that is closed when the client send an unsubscribe request. +func (s *Subscription) Err() <-chan error { + return s.err +} + +// MarshalJSON marshals a subscription as its ID. +func (s *Subscription) MarshalJSON() ([]byte, error) { + return json.Marshal(s.ID) +} + +// ClientSubscription is a subscription established through the Client's Subscribe or +// EthSubscribe methods. +type ClientSubscription struct { + client *Client + etype reflect.Type + channel reflect.Value + namespace string + subid string + in chan json.RawMessage + + quitOnce sync.Once // ensures quit is closed once + quit chan struct{} // quit is closed when the subscription exits + errOnce sync.Once // ensures err is closed once + err chan error +} + +func newClientSubscription(c *Client, namespace string, channel reflect.Value) *ClientSubscription { + sub := &ClientSubscription{ + client: c, + namespace: namespace, + etype: channel.Type().Elem(), + channel: channel, + quit: make(chan struct{}), + err: make(chan error, 1), + in: make(chan json.RawMessage), } - return ErrSubscriptionNotFound -} - -// activate enables a subscription. Until a subscription is enabled all -// notifications are dropped. This method is called by the RPC server after -// the subscription ID was sent to client. This prevents notifications being -// send to the client before the subscription ID is send to the client. -func (n *Notifier) activate(id ID, namespace string) { - n.subMu.Lock() - defer n.subMu.Unlock() - - if sub, found := n.inactive[id]; found { - sub.namespace = namespace - n.active[id] = sub - delete(n.inactive, id) - // Send buffered notifications. - for _, data := range n.buffer[id] { - n.send(sub, data) + return sub +} + +// Err returns the subscription error channel. The intended use of Err is to schedule +// resubscription when the client connection is closed unexpectedly. +// +// The error channel receives a value when the subscription has ended due +// to an error. The received error is nil if Close has been called +// on the underlying client and no other error has occurred. +// +// The error channel is closed when Unsubscribe is called on the subscription. +func (sub *ClientSubscription) Err() <-chan error { + return sub.err +} + +// Unsubscribe unsubscribes the notification and closes the error channel. +// It can safely be called more than once. +func (sub *ClientSubscription) Unsubscribe() { + sub.quitWithError(true, nil) + sub.errOnce.Do(func() { close(sub.err) }) +} + +func (sub *ClientSubscription) quitWithError(unsubscribeServer bool, err error) { + sub.quitOnce.Do(func() { + // The dispatch loop won't be able to execute the unsubscribe call + // if it is blocked on deliver. Close sub.quit first because it + // unblocks deliver. + close(sub.quit) + if unsubscribeServer { + sub.requestUnsubscribe() + } + if err != nil { + if err == ErrClientQuit { + err = nil // Adhere to subscription semantics. + } + sub.err <- err } - delete(n.buffer, id) + }) +} + +func (sub *ClientSubscription) deliver(result json.RawMessage) (ok bool) { + select { + case sub.in <- result: + return true + case <-sub.quit: + return false } } + +func (sub *ClientSubscription) start() { + sub.quitWithError(sub.forward()) +} + +func (sub *ClientSubscription) forward() (unsubscribeServer bool, err error) { + cases := []reflect.SelectCase{ + {Dir: reflect.SelectRecv, Chan: reflect.ValueOf(sub.quit)}, + {Dir: reflect.SelectRecv, Chan: reflect.ValueOf(sub.in)}, + {Dir: reflect.SelectSend, Chan: sub.channel}, + } + buffer := list.New() + defer buffer.Init() + for { + var chosen int + var recv reflect.Value + if buffer.Len() == 0 { + // Idle, omit send case. + chosen, recv, _ = reflect.Select(cases[:2]) + } else { + // Non-empty buffer, send the first queued item. + cases[2].Send = reflect.ValueOf(buffer.Front().Value) + chosen, recv, _ = reflect.Select(cases) + } + + switch chosen { + case 0: // <-sub.quit + return false, nil + case 1: // <-sub.in + val, err := sub.unmarshal(recv.Interface().(json.RawMessage)) + if err != nil { + return true, err + } + if buffer.Len() == maxClientSubscriptionBuffer { + return true, ErrSubscriptionQueueOverflow + } + buffer.PushBack(val) + case 2: // sub.channel<- + cases[2].Send = reflect.Value{} // Don't hold onto the value. + buffer.Remove(buffer.Front()) + } + } +} + +func (sub *ClientSubscription) unmarshal(result json.RawMessage) (interface{}, error) { + val := reflect.New(sub.etype) + err := json.Unmarshal(result, val.Interface()) + return val.Elem().Interface(), err +} + +func (sub *ClientSubscription) requestUnsubscribe() error { + var result interface{} + return sub.client.Call(&result, sub.namespace+unsubscribeMethodSuffix, sub.subid) +} diff --git a/rpc/subscription_test.go b/rpc/subscription_test.go index 24febc91909d..c3a918a83295 100644 --- a/rpc/subscription_test.go +++ b/rpc/subscription_test.go @@ -17,232 +17,62 @@ package rpc import ( - "context" "encoding/json" "fmt" "net" - "sync" + "strings" "testing" "time" ) -type NotificationTestService struct { - mu sync.Mutex - unsubscribed chan string - gotHangSubscriptionReq chan struct{} - unblockHangSubscription chan struct{} -} - -func (s *NotificationTestService) Echo(i int) int { - return i -} - -func (s *NotificationTestService) Unsubscribe(subid string) { - if s.unsubscribed != nil { - s.unsubscribed <- subid - } -} - -func (s *NotificationTestService) SomeSubscription(ctx context.Context, n, val int) (*Subscription, error) { - notifier, supported := NotifierFromContext(ctx) - if !supported { - return nil, ErrNotificationsUnsupported - } - - // by explicitly creating an subscription we make sure that the subscription id is send back to the client - // before the first subscription.Notify is called. Otherwise the events might be send before the response - // for the eth_subscribe method. - subscription := notifier.CreateSubscription() - - go func() { - // test expects n events, if we begin sending event immediately some events - // will probably be dropped since the subscription ID might not be send to - // the client. - for i := 0; i < n; i++ { - if err := notifier.Notify(subscription.ID, val+i); err != nil { - return - } +func TestNewID(t *testing.T) { + hexchars := "0123456789ABCDEFabcdef" + for i := 0; i < 100; i++ { + id := string(NewID()) + if !strings.HasPrefix(id, "0x") { + t.Fatalf("invalid ID prefix, want '0x...', got %s", id) } - select { - case <-notifier.Closed(): - case <-subscription.Err(): - } - if s.unsubscribed != nil { - s.unsubscribed <- string(subscription.ID) + id = id[2:] + if len(id) == 0 || len(id) > 32 { + t.Fatalf("invalid ID length, want len(id) > 0 && len(id) <= 32), got %d", len(id)) } - }() - - return subscription, nil -} - -// HangSubscription blocks on s.unblockHangSubscription before -// sending anything. -func (s *NotificationTestService) HangSubscription(ctx context.Context, val int) (*Subscription, error) { - notifier, supported := NotifierFromContext(ctx) - if !supported { - return nil, ErrNotificationsUnsupported - } - - s.gotHangSubscriptionReq <- struct{}{} - <-s.unblockHangSubscription - subscription := notifier.CreateSubscription() - - go func() { - notifier.Notify(subscription.ID, val) - }() - return subscription, nil -} - -func TestNotifications(t *testing.T) { - server := NewServer() - service := &NotificationTestService{unsubscribed: make(chan string)} - - if err := server.RegisterName("eth", service); err != nil { - t.Fatalf("unable to register test service %v", err) - } - - clientConn, serverConn := net.Pipe() - - go server.ServeCodec(NewJSONCodec(serverConn), OptionMethodInvocation|OptionSubscriptions) - - out := json.NewEncoder(clientConn) - in := json.NewDecoder(clientConn) - n := 5 - val := 12345 - request := map[string]interface{}{ - "id": 1, - "method": "eth_subscribe", - "version": "2.0", - "params": []interface{}{"someSubscription", n, val}, - } - - // create subscription - if err := out.Encode(request); err != nil { - t.Fatal(err) - } - - var subid string - response := jsonSuccessResponse{Result: subid} - if err := in.Decode(&response); err != nil { - t.Fatal(err) - } - - var ok bool - if _, ok = response.Result.(string); !ok { - t.Fatalf("expected subscription id, got %T", response.Result) - } - - for i := 0; i < n; i++ { - var notification jsonNotification - if err := in.Decode(¬ification); err != nil { - t.Fatalf("%v", err) - } - - if int(notification.Params.Result.(float64)) != val+i { - t.Fatalf("expected %d, got %d", val+i, notification.Params.Result) - } - } - - clientConn.Close() // causes notification unsubscribe callback to be called - select { - case <-service.unsubscribed: - case <-time.After(1 * time.Second): - t.Fatal("Unsubscribe not called after one second") - } -} - -func waitForMessages(t *testing.T, in *json.Decoder, successes chan<- jsonSuccessResponse, - failures chan<- jsonErrResponse, notifications chan<- jsonNotification, errors chan<- error) { - - // read and parse server messages - for { - var rmsg json.RawMessage - if err := in.Decode(&rmsg); err != nil { - return - } - - var responses []map[string]interface{} - if rmsg[0] == '[' { - if err := json.Unmarshal(rmsg, &responses); err != nil { - errors <- fmt.Errorf("Received invalid message: %s", rmsg) - return - } - } else { - var msg map[string]interface{} - if err := json.Unmarshal(rmsg, &msg); err != nil { - errors <- fmt.Errorf("Received invalid message: %s", rmsg) - return + for i := 0; i < len(id); i++ { + if strings.IndexByte(hexchars, id[i]) == -1 { + t.Fatalf("unexpected byte, want any valid hex char, got %c", id[i]) } - responses = append(responses, msg) - } - - for _, msg := range responses { - // determine what kind of msg was received and broadcast - // it to over the corresponding channel - if _, found := msg["result"]; found { - successes <- jsonSuccessResponse{ - Version: msg["jsonrpc"].(string), - Id: msg["id"], - Result: msg["result"], - } - continue - } - if _, found := msg["error"]; found { - params := msg["params"].(map[string]interface{}) - failures <- jsonErrResponse{ - Version: msg["jsonrpc"].(string), - Id: msg["id"], - Error: jsonError{int(params["subscription"].(float64)), params["message"].(string), params["data"]}, - } - continue - } - if _, found := msg["params"]; found { - params := msg["params"].(map[string]interface{}) - notifications <- jsonNotification{ - Version: msg["jsonrpc"].(string), - Method: msg["method"].(string), - Params: jsonSubscription{params["subscription"].(string), params["result"]}, - } - continue - } - errors <- fmt.Errorf("Received invalid message: %s", msg) } } } -// TestSubscriptionMultipleNamespaces ensures that subscriptions can exists -// for multiple different namespaces. -func TestSubscriptionMultipleNamespaces(t *testing.T) { +func TestSubscriptions(t *testing.T) { var ( namespaces = []string{"eth", "shh", "bzz"} - service = NotificationTestService{} - subCount = len(namespaces) * 2 + service = ¬ificationTestService{} + subCount = len(namespaces) notificationCount = 3 server = NewServer() clientConn, serverConn = net.Pipe() out = json.NewEncoder(clientConn) in = json.NewDecoder(clientConn) - successes = make(chan jsonSuccessResponse) - failures = make(chan jsonErrResponse) - notifications = make(chan jsonNotification) - errors = make(chan error, 10) + successes = make(chan subConfirmation) + notifications = make(chan subscriptionResult) + errors = make(chan error, subCount*notificationCount+1) ) // setup and start server for _, namespace := range namespaces { - if err := server.RegisterName(namespace, &service); err != nil { + if err := server.RegisterName(namespace, service); err != nil { t.Fatalf("unable to register test service %v", err) } } - - go server.ServeCodec(NewJSONCodec(serverConn), OptionMethodInvocation|OptionSubscriptions) + go server.ServeCodec(NewCodec(serverConn), 0) defer server.Stop() // wait for message and write them to the given channels - go waitForMessages(t, in, successes, failures, notifications, errors) + go waitForMessages(in, successes, notifications, errors) // create subscriptions one by one for i, namespace := range namespaces { @@ -252,27 +82,11 @@ func TestSubscriptionMultipleNamespaces(t *testing.T) { "version": "2.0", "params": []interface{}{"someSubscription", notificationCount, i}, } - if err := out.Encode(&request); err != nil { t.Fatalf("Could not create subscription: %v", err) } } - // create all subscriptions in 1 batch - var requests []interface{} - for i, namespace := range namespaces { - requests = append(requests, map[string]interface{}{ - "id": i, - "method": fmt.Sprintf("%s_subscribe", namespace), - "version": "2.0", - "params": []interface{}{"someSubscription", notificationCount, i}, - }) - } - - if err := out.Encode(&requests); err != nil { - t.Fatalf("Could not create subscription in batch form: %v", err) - } - timeout := time.After(30 * time.Second) subids := make(map[string]string, subCount) count := make(map[string]int, subCount) @@ -285,17 +99,14 @@ func TestSubscriptionMultipleNamespaces(t *testing.T) { } return done } - for !allReceived() { select { - case suc := <-successes: // subscription created - subids[namespaces[int(suc.Id.(float64))]] = suc.Result.(string) + case confirmation := <-successes: // subscription created + subids[namespaces[confirmation.reqid]] = string(confirmation.subid) case notification := <-notifications: - count[notification.Params.Subscription]++ + count[notification.ID]++ case err := <-errors: t.Fatal(err) - case failure := <-failures: - t.Errorf("received error: %v", failure.Error) case <-timeout: for _, namespace := range namespaces { subid, found := subids[namespace] @@ -311,3 +122,85 @@ func TestSubscriptionMultipleNamespaces(t *testing.T) { } } } + +// This test checks that unsubscribing works. +func TestServerUnsubscribe(t *testing.T) { + // Start the server. + server := newTestServer() + service := ¬ificationTestService{unsubscribed: make(chan string)} + server.RegisterName("nftest2", service) + p1, p2 := net.Pipe() + go server.ServeCodec(NewCodec(p1), 0) + + p2.SetDeadline(time.Now().Add(10 * time.Second)) + + // Subscribe. + p2.Write([]byte(`{"jsonrpc":"2.0","id":1,"method":"nftest2_subscribe","params":["someSubscription",0,10]}`)) + + // Handle received messages. + resps := make(chan subConfirmation) + notifications := make(chan subscriptionResult) + errors := make(chan error) + go waitForMessages(json.NewDecoder(p2), resps, notifications, errors) + + // Receive the subscription ID. + var sub subConfirmation + select { + case sub = <-resps: + case err := <-errors: + t.Fatal(err) + } + + // Unsubscribe and check that it is handled on the server side. + p2.Write([]byte(`{"jsonrpc":"2.0","method":"nftest2_unsubscribe","params":["` + sub.subid + `"]}`)) + for { + select { + case id := <-service.unsubscribed: + if id != string(sub.subid) { + t.Errorf("wrong subscription ID unsubscribed") + } + return + case err := <-errors: + t.Fatal(err) + case <-notifications: + // drop notifications + } + } +} + +type subConfirmation struct { + reqid int + subid ID +} + +func waitForMessages(in *json.Decoder, successes chan subConfirmation, notifications chan subscriptionResult, errors chan error) { + for { + var msg jsonrpcMessage + if err := in.Decode(&msg); err != nil { + errors <- fmt.Errorf("decode error: %v", err) + return + } + switch { + case msg.isNotification(): + var res subscriptionResult + if err := json.Unmarshal(msg.Params, &res); err != nil { + errors <- fmt.Errorf("invalid subscription result: %v", err) + } else { + notifications <- res + } + case msg.isResponse(): + var c subConfirmation + if msg.Error != nil { + errors <- msg.Error + } else if err := json.Unmarshal(msg.Result, &c.subid); err != nil { + errors <- fmt.Errorf("invalid response: %v", err) + } else { + json.Unmarshal(msg.ID, &c.reqid) + successes <- c + } + default: + errors <- fmt.Errorf("unrecognized message: %v", msg) + return + } + } +} diff --git a/rpc/testdata/invalid-badid.js b/rpc/testdata/invalid-badid.js new file mode 100644 index 000000000000..2202b8ccd26e --- /dev/null +++ b/rpc/testdata/invalid-badid.js @@ -0,0 +1,7 @@ +// This test checks processing of messages with invalid ID. + +--> {"id":[],"method":"test_foo"} +<-- {"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}} + +--> {"id":{},"method":"test_foo"} +<-- {"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}} diff --git a/rpc/testdata/invalid-batch.js b/rpc/testdata/invalid-batch.js new file mode 100644 index 000000000000..f470574fb5b5 --- /dev/null +++ b/rpc/testdata/invalid-batch.js @@ -0,0 +1,14 @@ +// This test checks the behavior of batches with invalid elements. +// Empty batches are not allowed. Batches may contain junk. + +--> [] +<-- {"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"empty batch"}} + +--> [1] +<-- [{"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}}] + +--> [1,2,3] +<-- [{"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}},{"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}},{"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}}] + +--> [{"jsonrpc":"2.0","id":1,"method":"test_echo","params":["foo",1]},55,{"jsonrpc":"2.0","id":2,"method":"unknown_method"},{"foo":"bar"}] +<-- [{"jsonrpc":"2.0","id":1,"result":{"String":"foo","Int":1,"Args":null}},{"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}},{"jsonrpc":"2.0","id":2,"error":{"code":-32601,"message":"the method unknown_method does not exist/is not available"}},{"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}}] diff --git a/rpc/testdata/invalid-idonly.js b/rpc/testdata/invalid-idonly.js new file mode 100644 index 000000000000..79997bee3060 --- /dev/null +++ b/rpc/testdata/invalid-idonly.js @@ -0,0 +1,7 @@ +// This test checks processing of messages that contain just the ID and nothing else. + +--> {"id":1} +<-- {"jsonrpc":"2.0","id":1,"error":{"code":-32600,"message":"invalid request"}} + +--> {"jsonrpc":"2.0","id":1} +<-- {"jsonrpc":"2.0","id":1,"error":{"code":-32600,"message":"invalid request"}} diff --git a/rpc/testdata/invalid-nonobj.js b/rpc/testdata/invalid-nonobj.js new file mode 100644 index 000000000000..4b9f4d994c13 --- /dev/null +++ b/rpc/testdata/invalid-nonobj.js @@ -0,0 +1,4 @@ +// This test checks behavior for invalid requests. + +--> 1 +<-- {"jsonrpc":"2.0","id":null,"error":{"code":-32600,"message":"invalid request"}} diff --git a/rpc/testdata/invalid-syntax.json b/rpc/testdata/invalid-syntax.json new file mode 100644 index 000000000000..b19429960309 --- /dev/null +++ b/rpc/testdata/invalid-syntax.json @@ -0,0 +1,5 @@ +// This test checks that an error is written for invalid JSON requests. + +--> 'f +<-- {"jsonrpc":"2.0","id":null,"error":{"code":-32700,"message":"invalid character '\\'' looking for beginning of value"}} + diff --git a/rpc/testdata/reqresp-batch.js b/rpc/testdata/reqresp-batch.js new file mode 100644 index 000000000000..977af7663099 --- /dev/null +++ b/rpc/testdata/reqresp-batch.js @@ -0,0 +1,8 @@ +// There is no response for all-notification batches. + +--> [{"jsonrpc":"2.0","method":"test_echo","params":["x",99]}] + +// This test checks regular batch calls. + +--> [{"jsonrpc":"2.0","id":2,"method":"test_echo","params":[]}, {"jsonrpc":"2.0","id": 3,"method":"test_echo","params":["x",3]}] +<-- [{"jsonrpc":"2.0","id":2,"error":{"code":-32602,"message":"missing value for required argument 0"}},{"jsonrpc":"2.0","id":3,"result":{"String":"x","Int":3,"Args":null}}] diff --git a/rpc/testdata/reqresp-echo.js b/rpc/testdata/reqresp-echo.js new file mode 100644 index 000000000000..7a9e90321c47 --- /dev/null +++ b/rpc/testdata/reqresp-echo.js @@ -0,0 +1,16 @@ +// This test calls the test_echo method. + +--> {"jsonrpc": "2.0", "id": 2, "method": "test_echo", "params": []} +<-- {"jsonrpc":"2.0","id":2,"error":{"code":-32602,"message":"missing value for required argument 0"}} + +--> {"jsonrpc": "2.0", "id": 2, "method": "test_echo", "params": ["x"]} +<-- {"jsonrpc":"2.0","id":2,"error":{"code":-32602,"message":"missing value for required argument 1"}} + +--> {"jsonrpc": "2.0", "id": 2, "method": "test_echo", "params": ["x", 3]} +<-- {"jsonrpc":"2.0","id":2,"result":{"String":"x","Int":3,"Args":null}} + +--> {"jsonrpc": "2.0", "id": 2, "method": "test_echo", "params": ["x", 3, {"S": "foo"}]} +<-- {"jsonrpc":"2.0","id":2,"result":{"String":"x","Int":3,"Args":{"S":"foo"}}} + +--> {"jsonrpc": "2.0", "id": 2, "method": "test_echoWithCtx", "params": ["x", 3, {"S": "foo"}]} +<-- {"jsonrpc":"2.0","id":2,"result":{"String":"x","Int":3,"Args":{"S":"foo"}}} diff --git a/rpc/testdata/reqresp-namedparam.js b/rpc/testdata/reqresp-namedparam.js new file mode 100644 index 000000000000..9a9372b0a711 --- /dev/null +++ b/rpc/testdata/reqresp-namedparam.js @@ -0,0 +1,5 @@ +// This test checks that an error response is sent for calls +// with named parameters. + +--> {"jsonrpc":"2.0","method":"test_echo","params":{"int":23},"id":3} +<-- {"jsonrpc":"2.0","id":3,"error":{"code":-32602,"message":"non-array args"}} diff --git a/rpc/testdata/reqresp-noargsrets.js b/rpc/testdata/reqresp-noargsrets.js new file mode 100644 index 000000000000..e61cc708ba33 --- /dev/null +++ b/rpc/testdata/reqresp-noargsrets.js @@ -0,0 +1,4 @@ +// This test calls the test_noArgsRets method. + +--> {"jsonrpc": "2.0", "id": "foo", "method": "test_noArgsRets", "params": []} +<-- {"jsonrpc":"2.0","id":"foo","result":null} diff --git a/rpc/testdata/reqresp-nomethod.js b/rpc/testdata/reqresp-nomethod.js new file mode 100644 index 000000000000..58ea6f3079b6 --- /dev/null +++ b/rpc/testdata/reqresp-nomethod.js @@ -0,0 +1,4 @@ +// This test calls a method that doesn't exist. + +--> {"jsonrpc": "2.0", "id": 2, "method": "invalid_method", "params": [2, 3]} +<-- {"jsonrpc":"2.0","id":2,"error":{"code":-32601,"message":"the method invalid_method does not exist/is not available"}} diff --git a/rpc/testdata/reqresp-noparam.js b/rpc/testdata/reqresp-noparam.js new file mode 100644 index 000000000000..2edf486d9f85 --- /dev/null +++ b/rpc/testdata/reqresp-noparam.js @@ -0,0 +1,4 @@ +// This test checks that calls with no parameters work. + +--> {"jsonrpc":"2.0","method":"test_noArgsRets","id":3} +<-- {"jsonrpc":"2.0","id":3,"result":null} diff --git a/rpc/testdata/reqresp-paramsnull.js b/rpc/testdata/reqresp-paramsnull.js new file mode 100644 index 000000000000..8a01bae1bbe7 --- /dev/null +++ b/rpc/testdata/reqresp-paramsnull.js @@ -0,0 +1,4 @@ +// This test checks that calls with "params":null work. + +--> {"jsonrpc":"2.0","method":"test_noArgsRets","params":null,"id":3} +<-- {"jsonrpc":"2.0","id":3,"result":null} diff --git a/rpc/testdata/revcall.js b/rpc/testdata/revcall.js new file mode 100644 index 000000000000..695d9858f87e --- /dev/null +++ b/rpc/testdata/revcall.js @@ -0,0 +1,6 @@ +// This test checks reverse calls. + +--> {"jsonrpc":"2.0","id":2,"method":"test_callMeBack","params":["foo",[1]]} +<-- {"jsonrpc":"2.0","id":1,"method":"foo","params":[1]} +--> {"jsonrpc":"2.0","id":1,"result":"my result"} +<-- {"jsonrpc":"2.0","id":2,"result":"my result"} diff --git a/rpc/testdata/revcall2.js b/rpc/testdata/revcall2.js new file mode 100644 index 000000000000..acab46551ec6 --- /dev/null +++ b/rpc/testdata/revcall2.js @@ -0,0 +1,7 @@ +// This test checks reverse calls. + +--> {"jsonrpc":"2.0","id":2,"method":"test_callMeBackLater","params":["foo",[1]]} +<-- {"jsonrpc":"2.0","id":2,"result":null} +<-- {"jsonrpc":"2.0","id":1,"method":"foo","params":[1]} +--> {"jsonrpc":"2.0","id":1,"result":"my result"} + diff --git a/rpc/testdata/subscription.js b/rpc/testdata/subscription.js new file mode 100644 index 000000000000..9f1007301080 --- /dev/null +++ b/rpc/testdata/subscription.js @@ -0,0 +1,12 @@ +// This test checks basic subscription support. + +--> {"jsonrpc":"2.0","id":1,"method":"nftest_subscribe","params":["someSubscription",5,1]} +<-- {"jsonrpc":"2.0","id":1,"result":"0x1"} +<-- {"jsonrpc":"2.0","method":"nftest_subscription","params":{"subscription":"0x1","result":1}} +<-- {"jsonrpc":"2.0","method":"nftest_subscription","params":{"subscription":"0x1","result":2}} +<-- {"jsonrpc":"2.0","method":"nftest_subscription","params":{"subscription":"0x1","result":3}} +<-- {"jsonrpc":"2.0","method":"nftest_subscription","params":{"subscription":"0x1","result":4}} +<-- {"jsonrpc":"2.0","method":"nftest_subscription","params":{"subscription":"0x1","result":5}} + +--> {"jsonrpc":"2.0","id":2,"method":"nftest_echo","params":[11]} +<-- {"jsonrpc":"2.0","id":2,"result":11} diff --git a/rpc/testservice_test.go b/rpc/testservice_test.go new file mode 100644 index 000000000000..010fc4f0bb76 --- /dev/null +++ b/rpc/testservice_test.go @@ -0,0 +1,181 @@ +// Copyright 2019 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 ( + "context" + "encoding/binary" + "errors" + "sync" + "time" +) + +func newTestServer() *Server { + server := NewServer() + server.idgen = sequentialIDGenerator() + if err := server.RegisterName("test", new(testService)); err != nil { + panic(err) + } + if err := server.RegisterName("nftest", new(notificationTestService)); err != nil { + panic(err) + } + return server +} + +func sequentialIDGenerator() func() ID { + var ( + mu sync.Mutex + counter uint64 + ) + return func() ID { + mu.Lock() + defer mu.Unlock() + counter++ + id := make([]byte, 8) + binary.BigEndian.PutUint64(id, counter) + return encodeID(id) + } +} + +type testService struct{} + +type echoArgs struct { + S string +} + +type echoResult struct { + String string + Int int + Args *echoArgs +} + +func (s *testService) NoArgsRets() {} + +func (s *testService) Echo(str string, i int, args *echoArgs) echoResult { + return echoResult{str, i, args} +} + +func (s *testService) EchoWithCtx(ctx context.Context, str string, i int, args *echoArgs) echoResult { + return echoResult{str, i, args} +} + +func (s *testService) Sleep(ctx context.Context, duration time.Duration) { + time.Sleep(duration) +} + +func (s *testService) Rets() (string, error) { + return "", nil +} + +//lint:ignore ST1008 returns error first on purpose. +func (s *testService) InvalidRets1() (error, string) { + return nil, "" +} + +func (s *testService) InvalidRets2() (string, string) { + return "", "" +} + +func (s *testService) InvalidRets3() (string, string, error) { + return "", "", nil +} + +func (s *testService) CallMeBack(ctx context.Context, method string, args []interface{}) (interface{}, error) { + c, ok := ClientFromContext(ctx) + if !ok { + return nil, errors.New("no client") + } + var result interface{} + err := c.Call(&result, method, args...) + return result, err +} + +func (s *testService) CallMeBackLater(ctx context.Context, method string, args []interface{}) error { + c, ok := ClientFromContext(ctx) + if !ok { + return errors.New("no client") + } + go func() { + <-ctx.Done() + var result interface{} + c.Call(&result, method, args...) + }() + return nil +} + +func (s *testService) Subscription(ctx context.Context) (*Subscription, error) { + return nil, nil +} + +type notificationTestService struct { + unsubscribed chan string + gotHangSubscriptionReq chan struct{} + unblockHangSubscription chan struct{} +} + +func (s *notificationTestService) Echo(i int) int { + return i +} + +func (s *notificationTestService) Unsubscribe(subid string) { + if s.unsubscribed != nil { + s.unsubscribed <- subid + } +} + +func (s *notificationTestService) SomeSubscription(ctx context.Context, n, val int) (*Subscription, error) { + notifier, supported := NotifierFromContext(ctx) + if !supported { + return nil, ErrNotificationsUnsupported + } + + // By explicitly creating an subscription we make sure that the subscription id is send + // back to the client before the first subscription.Notify is called. Otherwise the + // events might be send before the response for the *_subscribe method. + subscription := notifier.CreateSubscription() + go func() { + for i := 0; i < n; i++ { + if err := notifier.Notify(subscription.ID, val+i); err != nil { + return + } + } + select { + case <-notifier.Closed(): + case <-subscription.Err(): + } + if s.unsubscribed != nil { + s.unsubscribed <- string(subscription.ID) + } + }() + return subscription, nil +} + +// HangSubscription blocks on s.unblockHangSubscription before sending anything. +func (s *notificationTestService) HangSubscription(ctx context.Context, val int) (*Subscription, error) { + notifier, supported := NotifierFromContext(ctx) + if !supported { + return nil, ErrNotificationsUnsupported + } + s.gotHangSubscriptionReq <- struct{}{} + <-s.unblockHangSubscription + subscription := notifier.CreateSubscription() + + go func() { + notifier.Notify(subscription.ID, val) + }() + return subscription, nil +} diff --git a/rpc/types.go b/rpc/types.go index 762a6cca9654..dc9248d0feb8 100644 --- a/rpc/types.go +++ b/rpc/types.go @@ -17,14 +17,14 @@ package rpc import ( + "context" + "encoding/json" "fmt" "math" - "reflect" "strings" - "sync" - mapset "github.com/deckarep/golang-set" - "github.com/nebulaai/nbai-node/common/hexutil" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" ) // API describes the set of methods offered over the RPC interface @@ -35,57 +35,6 @@ type API struct { Public bool // indication if the methods must be considered safe for public use } -// callback is a method callback which was registered in the server -type callback struct { - rcvr reflect.Value // receiver of method - method reflect.Method // callback - argTypes []reflect.Type // input argument types - hasCtx bool // method's first argument is a context (not included in argTypes) - errPos int // err return idx, of -1 when method cannot return error - isSubscribe bool // indication if the callback is a subscription -} - -// service represents a registered object -type service struct { - name string // name for service - typ reflect.Type // receiver type - callbacks callbacks // registered handlers - subscriptions subscriptions // available subscriptions/notifications -} - -// serverRequest is an incoming request -type serverRequest struct { - id interface{} - svcname string - 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 - -// Server represents a RPC server -type Server struct { - services serviceRegistry - - run int32 - codecsMu sync.Mutex - codecs mapset.Set -} - -// rpcRequest represents a raw incoming RPC request -type rpcRequest struct { - service string - method string - id interface{} - isPubSub bool - params interface{} - err Error // invalid batch element -} - // Error wraps RPC errors, which contain an error code in addition to the message. type Error interface { Error() string // returns the message @@ -96,24 +45,19 @@ type Error interface { // a RPC session. Implementations must be go-routine safe since the codec can be called in // multiple go-routines concurrently. type ServerCodec interface { - // Read next request - ReadRequestHeaders() ([]rpcRequest, bool, Error) - // Parse request argument to the given types - ParseRequestArguments(argTypes []reflect.Type, params interface{}) ([]reflect.Value, Error) - // Assemble success response, expects response id and payload - CreateResponse(id interface{}, reply interface{}) interface{} - // Assemble error response, expects response id and error - CreateErrorResponse(id interface{}, err Error) interface{} - // Assemble error response with extra information about the error through info - CreateErrorResponseWithInfo(id interface{}, err Error, info interface{}) interface{} - // Create notification response - CreateNotification(id, namespace string, event interface{}) interface{} - // Write msg to client. - Write(msg interface{}) error - // Close underlying data stream - Close() - // Closed when underlying connection is closed - Closed() <-chan interface{} + readBatch() (msgs []*jsonrpcMessage, isBatch bool, err error) + close() + jsonWriter +} + +// jsonWriter can write JSON messages to its underlying connection. +// Implementations must be safe for concurrent use. +type jsonWriter interface { + writeJSON(context.Context, interface{}) error + // Closed returns a channel which is closed when the connection is closed. + closed() <-chan interface{} + // RemoteAddr returns the peer address of the connection. + remoteAddr() string } type BlockNumber int64 @@ -153,9 +97,8 @@ func (bn *BlockNumber) UnmarshalJSON(data []byte) error { return err } if blckNum > math.MaxInt64 { - return fmt.Errorf("Blocknumber too high") + return fmt.Errorf("block number larger than int64") } - *bn = BlockNumber(blckNum) return nil } @@ -163,3 +106,94 @@ func (bn *BlockNumber) UnmarshalJSON(data []byte) error { func (bn BlockNumber) Int64() int64 { return (int64)(bn) } + +type BlockNumberOrHash struct { + BlockNumber *BlockNumber `json:"blockNumber,omitempty"` + BlockHash *common.Hash `json:"blockHash,omitempty"` + RequireCanonical bool `json:"requireCanonical,omitempty"` +} + +func (bnh *BlockNumberOrHash) UnmarshalJSON(data []byte) error { + type erased BlockNumberOrHash + e := erased{} + err := json.Unmarshal(data, &e) + if err == nil { + if e.BlockNumber != nil && e.BlockHash != nil { + return fmt.Errorf("cannot specify both BlockHash and BlockNumber, choose one or the other") + } + bnh.BlockNumber = e.BlockNumber + bnh.BlockHash = e.BlockHash + bnh.RequireCanonical = e.RequireCanonical + return nil + } + var input string + err = json.Unmarshal(data, &input) + if err != nil { + return err + } + switch input { + case "earliest": + bn := EarliestBlockNumber + bnh.BlockNumber = &bn + return nil + case "latest": + bn := LatestBlockNumber + bnh.BlockNumber = &bn + return nil + case "pending": + bn := PendingBlockNumber + bnh.BlockNumber = &bn + return nil + default: + if len(input) == 66 { + hash := common.Hash{} + err := hash.UnmarshalText([]byte(input)) + if err != nil { + return err + } + bnh.BlockHash = &hash + return nil + } else { + blckNum, err := hexutil.DecodeUint64(input) + if err != nil { + return err + } + if blckNum > math.MaxInt64 { + return fmt.Errorf("blocknumber too high") + } + bn := BlockNumber(blckNum) + bnh.BlockNumber = &bn + return nil + } + } +} + +func (bnh *BlockNumberOrHash) Number() (BlockNumber, bool) { + if bnh.BlockNumber != nil { + return *bnh.BlockNumber, true + } + return BlockNumber(0), false +} + +func (bnh *BlockNumberOrHash) Hash() (common.Hash, bool) { + if bnh.BlockHash != nil { + return *bnh.BlockHash, true + } + return common.Hash{}, false +} + +func BlockNumberOrHashWithNumber(blockNr BlockNumber) BlockNumberOrHash { + return BlockNumberOrHash{ + BlockNumber: &blockNr, + BlockHash: nil, + RequireCanonical: false, + } +} + +func BlockNumberOrHashWithHash(hash common.Hash, canonical bool) BlockNumberOrHash { + return BlockNumberOrHash{ + BlockNumber: nil, + BlockHash: &hash, + RequireCanonical: canonical, + } +} diff --git a/rpc/types_test.go b/rpc/types_test.go index e61bb7802ac3..89b0c9171a14 100644 --- a/rpc/types_test.go +++ b/rpc/types_test.go @@ -20,7 +20,8 @@ import ( "encoding/json" "testing" - "github.com/nebulaai/nbai-node/common/math" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" ) func TestBlockNumberJSONUnmarshal(t *testing.T) { @@ -64,3 +65,60 @@ func TestBlockNumberJSONUnmarshal(t *testing.T) { } } } + +func TestBlockNumberOrHash_UnmarshalJSON(t *testing.T) { + tests := []struct { + input string + mustFail bool + expected BlockNumberOrHash + }{ + 0: {`"0x"`, true, BlockNumberOrHash{}}, + 1: {`"0x0"`, false, BlockNumberOrHashWithNumber(0)}, + 2: {`"0X1"`, false, BlockNumberOrHashWithNumber(1)}, + 3: {`"0x00"`, true, BlockNumberOrHash{}}, + 4: {`"0x01"`, true, BlockNumberOrHash{}}, + 5: {`"0x1"`, false, BlockNumberOrHashWithNumber(1)}, + 6: {`"0x12"`, false, BlockNumberOrHashWithNumber(18)}, + 7: {`"0x7fffffffffffffff"`, false, BlockNumberOrHashWithNumber(math.MaxInt64)}, + 8: {`"0x8000000000000000"`, true, BlockNumberOrHash{}}, + 9: {"0", true, BlockNumberOrHash{}}, + 10: {`"ff"`, true, BlockNumberOrHash{}}, + 11: {`"pending"`, false, BlockNumberOrHashWithNumber(PendingBlockNumber)}, + 12: {`"latest"`, false, BlockNumberOrHashWithNumber(LatestBlockNumber)}, + 13: {`"earliest"`, false, BlockNumberOrHashWithNumber(EarliestBlockNumber)}, + 14: {`someString`, true, BlockNumberOrHash{}}, + 15: {`""`, true, BlockNumberOrHash{}}, + 16: {``, true, BlockNumberOrHash{}}, + 17: {`"0x0000000000000000000000000000000000000000000000000000000000000000"`, false, BlockNumberOrHashWithHash(common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"), false)}, + 18: {`{"blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000"}`, false, BlockNumberOrHashWithHash(common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"), false)}, + 19: {`{"blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000","requireCanonical":false}`, false, BlockNumberOrHashWithHash(common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"), false)}, + 20: {`{"blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000","requireCanonical":true}`, false, BlockNumberOrHashWithHash(common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000000000"), true)}, + 21: {`{"blockNumber":"0x1"}`, false, BlockNumberOrHashWithNumber(1)}, + 22: {`{"blockNumber":"pending"}`, false, BlockNumberOrHashWithNumber(PendingBlockNumber)}, + 23: {`{"blockNumber":"latest"}`, false, BlockNumberOrHashWithNumber(LatestBlockNumber)}, + 24: {`{"blockNumber":"earliest"}`, false, BlockNumberOrHashWithNumber(EarliestBlockNumber)}, + 25: {`{"blockNumber":"0x1", "blockHash":"0x0000000000000000000000000000000000000000000000000000000000000000"}`, true, BlockNumberOrHash{}}, + } + + for i, test := range tests { + var bnh BlockNumberOrHash + err := json.Unmarshal([]byte(test.input), &bnh) + if test.mustFail && err == nil { + t.Errorf("Test %d should fail", i) + continue + } + if !test.mustFail && err != nil { + t.Errorf("Test %d should pass but got err: %v", i, err) + continue + } + hash, hashOk := bnh.Hash() + expectedHash, expectedHashOk := test.expected.Hash() + num, numOk := bnh.Number() + expectedNum, expectedNumOk := test.expected.Number() + if bnh.RequireCanonical != test.expected.RequireCanonical || + hash != expectedHash || hashOk != expectedHashOk || + num != expectedNum || numOk != expectedNumOk { + t.Errorf("Test %d got unexpected value, want %v, got %v", i, test.expected, bnh) + } + } +} diff --git a/rpc/utils.go b/rpc/utils.go deleted file mode 100644 index 7f7ac4520bc5..000000000000 --- a/rpc/utils.go +++ /dev/null @@ -1,226 +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 rpc - -import ( - "bufio" - "context" - crand "crypto/rand" - "encoding/binary" - "encoding/hex" - "math/rand" - "reflect" - "strings" - "sync" - "time" - "unicode" - "unicode/utf8" -) - -var ( - subscriptionIDGenMu sync.Mutex - subscriptionIDGen = idGenerator() -) - -// Is this an exported - upper case - name? -func isExported(name string) bool { - rune, _ := utf8.DecodeRuneInString(name) - return unicode.IsUpper(rune) -} - -// Is this type exported or a builtin? -func isExportedOrBuiltinType(t reflect.Type) bool { - for t.Kind() == reflect.Ptr { - t = t.Elem() - } - // PkgPath will be non-empty even for an exported type, - // so we need to check the type name as well. - return isExported(t.Name()) || t.PkgPath() == "" -} - -var contextType = reflect.TypeOf((*context.Context)(nil)).Elem() - -// isContextType returns an indication if the given t is of context.Context or *context.Context type -func isContextType(t reflect.Type) bool { - for t.Kind() == reflect.Ptr { - t = t.Elem() - } - return t == contextType -} - -var errorType = reflect.TypeOf((*error)(nil)).Elem() - -// Implements this type the error interface -func isErrorType(t reflect.Type) bool { - for t.Kind() == reflect.Ptr { - t = t.Elem() - } - return t.Implements(errorType) -} - -var subscriptionType = reflect.TypeOf((*Subscription)(nil)).Elem() - -// isSubscriptionType returns an indication if the given t is of Subscription or *Subscription type -func isSubscriptionType(t reflect.Type) bool { - for t.Kind() == reflect.Ptr { - t = t.Elem() - } - return t == subscriptionType -} - -// isPubSub tests whether the given method has as as first argument a context.Context -// and returns the pair (Subscription, error) -func isPubSub(methodType reflect.Type) bool { - // numIn(0) is the receiver type - if methodType.NumIn() < 2 || methodType.NumOut() != 2 { - return false - } - - return isContextType(methodType.In(1)) && - isSubscriptionType(methodType.Out(0)) && - isErrorType(methodType.Out(1)) -} - -// formatName will convert to first character to lower case -func formatName(name string) string { - ret := []rune(name) - if len(ret) > 0 { - ret[0] = unicode.ToLower(ret[0]) - } - return string(ret) -} - -// 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. -func suitableCallbacks(rcvr reflect.Value, typ reflect.Type) (callbacks, subscriptions) { - callbacks := make(callbacks) - subscriptions := make(subscriptions) - -METHODS: - for m := 0; m < typ.NumMethod(); m++ { - method := typ.Method(m) - mtype := method.Type - mname := formatName(method.Name) - if method.PkgPath != "" { // method must be exported - continue - } - - var h callback - h.isSubscribe = isPubSub(mtype) - h.rcvr = rcvr - h.method = method - h.errPos = -1 - - firstArg := 1 - numIn := mtype.NumIn() - if numIn >= 2 && mtype.In(1) == contextType { - h.hasCtx = true - firstArg = 2 - } - - if h.isSubscribe { - h.argTypes = make([]reflect.Type, numIn-firstArg) // skip rcvr type - for i := firstArg; i < numIn; i++ { - argType := mtype.In(i) - if isExportedOrBuiltinType(argType) { - h.argTypes[i-firstArg] = argType - } else { - continue METHODS - } - } - - subscriptions[mname] = &h - continue METHODS - } - - // determine method arguments, ignore first arg since it's the receiver type - // Arguments must be exported or builtin types - h.argTypes = make([]reflect.Type, numIn-firstArg) - for i := firstArg; i < numIn; i++ { - argType := mtype.In(i) - if !isExportedOrBuiltinType(argType) { - continue METHODS - } - h.argTypes[i-firstArg] = argType - } - - // check that all returned values are exported or builtin types - for i := 0; i < mtype.NumOut(); i++ { - if !isExportedOrBuiltinType(mtype.Out(i)) { - continue METHODS - } - } - - // when a method returns an error it must be the last returned value - h.errPos = -1 - for i := 0; i < mtype.NumOut(); i++ { - if isErrorType(mtype.Out(i)) { - h.errPos = i - break - } - } - - if h.errPos >= 0 && h.errPos != mtype.NumOut()-1 { - continue METHODS - } - - switch mtype.NumOut() { - case 0, 1, 2: - if mtype.NumOut() == 2 && h.errPos == -1 { // method must one return value and 1 error - continue METHODS - } - callbacks[mname] = &h - } - } - - return callbacks, subscriptions -} - -// idGenerator helper utility that generates a (pseudo) random sequence of -// bytes that are used to generate identifiers. -func idGenerator() *rand.Rand { - if seed, err := binary.ReadVarint(bufio.NewReader(crand.Reader)); err == nil { - return rand.New(rand.NewSource(seed)) - } - return rand.New(rand.NewSource(int64(time.Now().Nanosecond()))) -} - -// NewID generates a identifier that can be used as an identifier in the RPC interface. -// e.g. filter and subscription identifier. -func NewID() ID { - subscriptionIDGenMu.Lock() - defer subscriptionIDGenMu.Unlock() - - id := make([]byte, 16) - for i := 0; i < len(id); i += 7 { - val := subscriptionIDGen.Int63() - for j := 0; i+j < len(id) && j < 7; j++ { - id[i+j] = byte(val) - val >>= 8 - } - } - - rpcId := hex.EncodeToString(id) - // rpc ID's are RPC quantities, no leading zero's and 0 is 0x0 - rpcId = strings.TrimLeft(rpcId, "0") - if rpcId == "" { - rpcId = "0" - } - - return ID("0x" + rpcId) -} diff --git a/rpc/utils_test.go b/rpc/utils_test.go deleted file mode 100644 index e0e063f607f6..000000000000 --- a/rpc/utils_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package rpc - -import ( - "strings" - "testing" -) - -func TestNewID(t *testing.T) { - hexchars := "0123456789ABCDEFabcdef" - for i := 0; i < 100; i++ { - id := string(NewID()) - if !strings.HasPrefix(id, "0x") { - t.Fatalf("invalid ID prefix, want '0x...', got %s", id) - } - - id = id[2:] - if len(id) == 0 || len(id) > 32 { - t.Fatalf("invalid ID length, want len(id) > 0 && len(id) <= 32), got %d", len(id)) - } - - for i := 0; i < len(id); i++ { - if strings.IndexByte(hexchars, id[i]) == -1 { - t.Fatalf("unexpected byte, want any valid hex char, got %c", id[i]) - } - } - } -} diff --git a/rpc/websocket.go b/rpc/websocket.go index 4863c2fbfe8f..e34241e47fd0 100644 --- a/rpc/websocket.go +++ b/rpc/websocket.go @@ -17,62 +17,26 @@ package rpc import ( - "bytes" "context" - "crypto/tls" "encoding/base64" - "encoding/json" "fmt" - "net" "net/http" "net/url" "os" "strings" - "time" + "sync" mapset "github.com/deckarep/golang-set" - "github.com/nebulaai/nbai-node/log" - "golang.org/x/net/websocket" + "github.com/ethereum/go-ethereum/log" + "github.com/gorilla/websocket" ) -// websocketJSONCodec is a custom JSON codec with payload size enforcement and -// special number parsing. -var websocketJSONCodec = websocket.Codec{ - // Marshal is the stock JSON marshaller used by the websocket library too. - Marshal: func(v interface{}) ([]byte, byte, error) { - msg, err := json.Marshal(v) - return msg, websocket.TextFrame, err - }, - // Unmarshal is a specialized unmarshaller to properly convert numbers. - Unmarshal: func(msg []byte, payloadType byte, v interface{}) error { - dec := json.NewDecoder(bytes.NewReader(msg)) - dec.UseNumber() - - return dec.Decode(v) - }, -} +const ( + wsReadBuffer = 1024 + wsWriteBuffer = 1024 +) -// WebsocketHandler returns a handler that serves JSON-RPC to WebSocket connections. -// -// allowedOrigins should be a comma-separated list of allowed origin URLs. -// To allow connections with any origin, pass "*". -func (srv *Server) WebsocketHandler(allowedOrigins []string) http.Handler { - return websocket.Server{ - Handshake: wsHandshakeValidator(allowedOrigins), - Handler: func(conn *websocket.Conn) { - // Create a custom encode/decode pair to enforce payload size and number encoding - conn.MaxPayloadBytes = maxRequestContentLength - - encoder := func(v interface{}) error { - return websocketJSONCodec.Send(conn, v) - } - decoder := func(v interface{}) error { - return websocketJSONCodec.Receive(conn, v) - } - srv.ServeCodec(NewCodec(conn, encoder, decoder), OptionMethodInvocation|OptionSubscriptions) - }, - } -} +var wsBufferPool = new(sync.Pool) // NewWSServer creates a new websocket RPC server around an API provider. // @@ -81,10 +45,32 @@ func NewWSServer(allowedOrigins []string, srv *Server) *http.Server { return &http.Server{Handler: srv.WebsocketHandler(allowedOrigins)} } +// WebsocketHandler returns a handler that serves JSON-RPC to WebSocket connections. +// +// allowedOrigins should be a comma-separated list of allowed origin URLs. +// To allow connections with any origin, pass "*". +func (s *Server) WebsocketHandler(allowedOrigins []string) http.Handler { + var upgrader = websocket.Upgrader{ + ReadBufferSize: wsReadBuffer, + WriteBufferSize: wsWriteBuffer, + WriteBufferPool: wsBufferPool, + CheckOrigin: wsHandshakeValidator(allowedOrigins), + } + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + log.Debug("WebSocket upgrade failed", "err", err) + return + } + codec := newWebsocketCodec(conn) + s.ServeCodec(codec, 0) + }) +} + // wsHandshakeValidator returns a handler that verifies the origin during the // websocket upgrade process. When a '*' is specified as an allowed origins all // connections are accepted. -func wsHandshakeValidator(allowedOrigins []string) func(*websocket.Config, *http.Request) error { +func wsHandshakeValidator(allowedOrigins []string) func(*http.Request) bool { origins := mapset.NewSet() allowAllOrigins := false @@ -96,7 +82,6 @@ func wsHandshakeValidator(allowedOrigins []string) func(*websocket.Config, *http origins.Add(strings.ToLower(origin)) } } - // allow localhost if no allowedOrigins are specified. if len(origins.ToSlice()) == 0 { origins.Add("http://localhost") @@ -104,44 +89,39 @@ func wsHandshakeValidator(allowedOrigins []string) func(*websocket.Config, *http origins.Add("http://" + strings.ToLower(hostname)) } } - - log.Debug(fmt.Sprintf("Allowed origin(s) for WS RPC interface %v\n", origins.ToSlice())) - - f := func(cfg *websocket.Config, req *http.Request) error { + log.Debug(fmt.Sprintf("Allowed origin(s) for WS RPC interface %v", origins.ToSlice())) + + f := func(req *http.Request) bool { + // Skip origin verification if no Origin header is present. The origin check + // is supposed to protect against browser based attacks. Browsers always set + // Origin. Non-browser software can put anything in origin and checking it doesn't + // provide additional security. + if _, ok := req.Header["Origin"]; !ok { + return true + } + // Verify origin against whitelist. origin := strings.ToLower(req.Header.Get("Origin")) if allowAllOrigins || origins.Contains(origin) { - return nil + return true } - log.Warn(fmt.Sprintf("origin '%s' not allowed on WS-RPC interface\n", origin)) - return fmt.Errorf("origin %s not allowed", origin) + log.Warn("Rejected WebSocket connection", "origin", origin) + return false } return f } -func wsGetConfig(endpoint, origin string) (*websocket.Config, error) { - if origin == "" { - var err error - if origin, err = os.Hostname(); err != nil { - return nil, err - } - if strings.HasPrefix(endpoint, "wss") { - origin = "https://" + strings.ToLower(origin) - } else { - origin = "http://" + strings.ToLower(origin) - } - } - config, err := websocket.NewConfig(endpoint, origin) - if err != nil { - return nil, err - } +type wsHandshakeError struct { + err error + status string +} - if config.Location.User != nil { - b64auth := base64.StdEncoding.EncodeToString([]byte(config.Location.User.String())) - config.Header.Add("Authorization", "Basic "+b64auth) - config.Location.User = nil +func (e wsHandshakeError) Error() string { + s := e.err.Error() + if e.status != "" { + s += " (HTTP status " + e.status + ")" } - return config, nil + return s } // DialWebsocket creates a new RPC client that communicates with a JSON-RPC server @@ -150,61 +130,46 @@ func wsGetConfig(endpoint, origin string) (*websocket.Config, error) { // The context is used for the initial connection establishment. It does not // affect subsequent interactions with the client. func DialWebsocket(ctx context.Context, endpoint, origin string) (*Client, error) { - config, err := wsGetConfig(endpoint, origin) + endpoint, header, err := wsClientHeaders(endpoint, origin) if err != nil { return nil, err } - - return newClient(ctx, func(ctx context.Context) (net.Conn, error) { - return wsDialContext(ctx, config) + dialer := websocket.Dialer{ + ReadBufferSize: wsReadBuffer, + WriteBufferSize: wsWriteBuffer, + WriteBufferPool: wsBufferPool, + } + return newClient(ctx, func(ctx context.Context) (ServerCodec, error) { + conn, resp, err := dialer.DialContext(ctx, endpoint, header) + if err != nil { + hErr := wsHandshakeError{err: err} + if resp != nil { + hErr.status = resp.Status + } + return nil, hErr + } + return newWebsocketCodec(conn), nil }) } -func wsDialContext(ctx context.Context, config *websocket.Config) (*websocket.Conn, error) { - var conn net.Conn - var err error - switch config.Location.Scheme { - case "ws": - conn, err = dialContext(ctx, "tcp", wsDialAddress(config.Location)) - case "wss": - dialer := contextDialer(ctx) - conn, err = tls.DialWithDialer(dialer, "tcp", wsDialAddress(config.Location), config.TlsConfig) - default: - err = websocket.ErrBadScheme - } +func wsClientHeaders(endpoint, origin string) (string, http.Header, error) { + endpointURL, err := url.Parse(endpoint) if err != nil { - return nil, err + return endpoint, nil, err } - ws, err := websocket.NewClient(config, conn) - if err != nil { - conn.Close() - return nil, err + header := make(http.Header) + if origin != "" { + header.Add("origin", origin) } - return ws, err -} - -var wsPortMap = map[string]string{"ws": "80", "wss": "443"} - -func wsDialAddress(location *url.URL) string { - if _, ok := wsPortMap[location.Scheme]; ok { - if _, _, err := net.SplitHostPort(location.Host); err != nil { - return net.JoinHostPort(location.Host, wsPortMap[location.Scheme]) - } + if endpointURL.User != nil { + b64auth := base64.StdEncoding.EncodeToString([]byte(endpointURL.User.String())) + header.Add("authorization", "Basic "+b64auth) + endpointURL.User = nil } - return location.Host + return endpointURL.String(), header, nil } -func dialContext(ctx context.Context, network, addr string) (net.Conn, error) { - d := &net.Dialer{KeepAlive: tcpKeepAliveInterval} - return d.DialContext(ctx, network, addr) -} - -func contextDialer(ctx context.Context) *net.Dialer { - dialer := &net.Dialer{Cancel: ctx.Done(), KeepAlive: tcpKeepAliveInterval} - if deadline, ok := ctx.Deadline(); ok { - dialer.Deadline = deadline - } else { - dialer.Deadline = time.Now().Add(defaultDialTimeout) - } - return dialer +func newWebsocketCodec(conn *websocket.Conn) ServerCodec { + conn.SetReadLimit(maxRequestContentLength) + return NewFuncCodec(conn, conn.WriteJSON, conn.ReadJSON) } diff --git a/rpc/websocket_test.go b/rpc/websocket_test.go index 5bf3780d62c7..f2a8438d7ce9 100644 --- a/rpc/websocket_test.go +++ b/rpc/websocket_test.go @@ -1,4 +1,4 @@ -// Copyright 2016 The go-ethereum Authors +// Copyright 2018 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 @@ -16,39 +16,244 @@ package rpc -import "testing" +import ( + "context" + "net" + "net/http" + "net/http/httptest" + "reflect" + "strings" + "testing" + "time" -func TestWSGetConfigNoAuth(t *testing.T) { - config, err := wsGetConfig("ws://example.com:1234", "") + "github.com/gorilla/websocket" +) + +func TestWebsocketClientHeaders(t *testing.T) { + t.Parallel() + + endpoint, header, err := wsClientHeaders("wss://testuser:test-PASS_01@example.com:1234", "https://example.com") if err != nil { - t.Logf("wsGetConfig failed: %s", err) - t.Fail() - return + t.Fatalf("wsGetConfig failed: %s", err) + } + if endpoint != "wss://example.com:1234" { + t.Fatal("User should have been stripped from the URL") + } + if header.Get("authorization") != "Basic dGVzdHVzZXI6dGVzdC1QQVNTXzAx" { + t.Fatal("Basic auth header is incorrect") + } + if header.Get("origin") != "https://example.com" { + t.Fatal("Origin not set") + } +} + +// This test checks that the server rejects connections from disallowed origins. +func TestWebsocketOriginCheck(t *testing.T) { + t.Parallel() + + var ( + srv = newTestServer() + httpsrv = httptest.NewServer(srv.WebsocketHandler([]string{"http://example.com"})) + wsURL = "ws:" + strings.TrimPrefix(httpsrv.URL, "http:") + ) + defer srv.Stop() + defer httpsrv.Close() + + client, err := DialWebsocket(context.Background(), wsURL, "http://ekzample.com") + if err == nil { + client.Close() + t.Fatal("no error for wrong origin") + } + wantErr := wsHandshakeError{websocket.ErrBadHandshake, "403 Forbidden"} + if !reflect.DeepEqual(err, wantErr) { + t.Fatalf("wrong error for wrong origin: %q", err) + } + + // Connections without origin header should work. + client, err = DialWebsocket(context.Background(), wsURL, "") + if err != nil { + t.Fatal("error for empty origin") + } + client.Close() +} + +// This test checks whether calls exceeding the request size limit are rejected. +func TestWebsocketLargeCall(t *testing.T) { + t.Parallel() + + var ( + srv = newTestServer() + httpsrv = httptest.NewServer(srv.WebsocketHandler([]string{"*"})) + wsURL = "ws:" + strings.TrimPrefix(httpsrv.URL, "http:") + ) + defer srv.Stop() + defer httpsrv.Close() + + client, err := DialWebsocket(context.Background(), wsURL, "") + if err != nil { + t.Fatalf("can't dial: %v", err) + } + defer client.Close() + + // This call sends slightly less than the limit and should work. + var result echoResult + arg := strings.Repeat("x", maxRequestContentLength-200) + if err := client.Call(&result, "test_echo", arg, 1); err != nil { + t.Fatalf("valid call didn't work: %v", err) + } + if result.String != arg { + t.Fatal("wrong string echoed") + } + + // This call sends twice the allowed size and shouldn't work. + arg = strings.Repeat("x", maxRequestContentLength*2) + err = client.Call(&result, "test_echo", arg) + if err == nil { + t.Fatal("no error for too large call") } - if config.Location.User != nil { - t.Log("User should have been stripped from the URL") - t.Fail() +} + +// This test checks that client handles WebSocket ping frames correctly. +func TestClientWebsocketPing(t *testing.T) { + t.Parallel() + + var ( + sendPing = make(chan struct{}) + server = wsPingTestServer(t, sendPing) + ctx, cancel = context.WithTimeout(context.Background(), 1*time.Second) + ) + defer cancel() + defer server.Shutdown(ctx) + + client, err := DialContext(ctx, "ws://"+server.Addr) + if err != nil { + t.Fatalf("client dial error: %v", err) + } + resultChan := make(chan int) + sub, err := client.EthSubscribe(ctx, resultChan, "foo") + if err != nil { + t.Fatalf("client subscribe error: %v", err) } - if config.Location.Hostname() != "example.com" || - config.Location.Port() != "1234" || config.Location.Scheme != "ws" { - t.Logf("Unexpected URL: %s", config.Location) - t.Fail() + + // Wait for the context's deadline to be reached before proceeding. + // This is important for reproducing https://github.com/ethereum/go-ethereum/issues/19798 + <-ctx.Done() + close(sendPing) + + // Wait for the subscription result. + timeout := time.NewTimer(5 * time.Second) + for { + select { + case err := <-sub.Err(): + t.Error("client subscription error:", err) + case result := <-resultChan: + t.Log("client got result:", result) + return + case <-timeout.C: + t.Error("didn't get any result within the test timeout") + return + } } } -func TestWSGetConfigWithBasicAuth(t *testing.T) { - config, err := wsGetConfig("wss://testuser:test-PASS_01@example.com:1234", "") +// wsPingTestServer runs a WebSocket server which accepts a single subscription request. +// When a value arrives on sendPing, the server sends a ping frame, waits for a matching +// pong and finally delivers a single subscription result. +func wsPingTestServer(t *testing.T, sendPing <-chan struct{}) *http.Server { + var srv http.Server + shutdown := make(chan struct{}) + srv.RegisterOnShutdown(func() { + close(shutdown) + }) + srv.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Upgrade to WebSocket. + upgrader := websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { return true }, + } + conn, err := upgrader.Upgrade(w, r, nil) + if err != nil { + t.Errorf("server WS upgrade error: %v", err) + return + } + defer conn.Close() + + // Handle the connection. + wsPingTestHandler(t, conn, shutdown, sendPing) + }) + + // Start the server. + listener, err := net.Listen("tcp", "127.0.0.1:0") if err != nil { - t.Logf("wsGetConfig failed: %s", err) - t.Fail() + t.Fatal("can't listen:", err) + } + srv.Addr = listener.Addr().String() + go srv.Serve(listener) + return &srv +} + +func wsPingTestHandler(t *testing.T, conn *websocket.Conn, shutdown, sendPing <-chan struct{}) { + // Canned responses for the eth_subscribe call in TestClientWebsocketPing. + const ( + subResp = `{"jsonrpc":"2.0","id":1,"result":"0x00"}` + subNotify = `{"jsonrpc":"2.0","method":"eth_subscription","params":{"subscription":"0x00","result":1}}` + ) + + // Handle subscribe request. + if _, _, err := conn.ReadMessage(); err != nil { + t.Errorf("server read error: %v", err) return } - if config.Location.User != nil { - t.Log("User should have been stripped from the URL") - t.Fail() + if err := conn.WriteMessage(websocket.TextMessage, []byte(subResp)); err != nil { + t.Errorf("server write error: %v", err) + return } - if config.Header.Get("Authorization") != "Basic dGVzdHVzZXI6dGVzdC1QQVNTXzAx" { - t.Log("Basic auth header is incorrect") - t.Fail() + + // Read from the connection to process control messages. + var pongCh = make(chan string) + conn.SetPongHandler(func(d string) error { + t.Logf("server got pong: %q", d) + pongCh <- d + return nil + }) + go func() { + for { + typ, msg, err := conn.ReadMessage() + if err != nil { + return + } + t.Logf("server got message (%d): %q", typ, msg) + } + }() + + // Write messages. + var ( + sendResponse <-chan time.Time + wantPong string + ) + for { + select { + case _, open := <-sendPing: + if !open { + sendPing = nil + } + t.Logf("server sending ping") + conn.WriteMessage(websocket.PingMessage, []byte("ping")) + wantPong = "ping" + case data := <-pongCh: + if wantPong == "" { + t.Errorf("unexpected pong") + } else if data != wantPong { + t.Errorf("got pong with wrong data %q", data) + } + wantPong = "" + sendResponse = time.NewTimer(200 * time.Millisecond).C + case <-sendResponse: + t.Logf("server sending response") + conn.WriteMessage(websocket.TextMessage, []byte(subNotify)) + sendResponse = nil + case <-shutdown: + conn.Close() + return + } } } diff --git a/signer/core/abihelper.go b/signer/core/abihelper.go deleted file mode 100644 index bd01d984e726..000000000000 --- a/signer/core/abihelper.go +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright 2018 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 core - -import ( - "encoding/json" - "fmt" - "io/ioutil" - "strings" - - "github.com/nebulaai/nbai-node/accounts/abi" - "github.com/nebulaai/nbai-node/common" - - "bytes" - "os" - "regexp" -) - -type decodedArgument struct { - soltype abi.Argument - value interface{} -} -type decodedCallData struct { - signature string - name string - inputs []decodedArgument -} - -// String implements stringer interface, tries to use the underlying value-type -func (arg decodedArgument) String() string { - var value string - switch val := arg.value.(type) { - case fmt.Stringer: - value = val.String() - default: - value = fmt.Sprintf("%v", val) - } - return fmt.Sprintf("%v: %v", arg.soltype.Type.String(), value) -} - -// String implements stringer interface for decodedCallData -func (cd decodedCallData) String() string { - args := make([]string, len(cd.inputs)) - for i, arg := range cd.inputs { - args[i] = arg.String() - } - return fmt.Sprintf("%s(%s)", cd.name, strings.Join(args, ",")) -} - -// parseCallData matches the provided call data against the abi definition, -// and returns a struct containing the actual go-typed values -func parseCallData(calldata []byte, abidata string) (*decodedCallData, error) { - - if len(calldata) < 4 { - return nil, fmt.Errorf("Invalid ABI-data, incomplete method signature of (%d bytes)", len(calldata)) - } - - sigdata, argdata := calldata[:4], calldata[4:] - if len(argdata)%32 != 0 { - return nil, fmt.Errorf("Not ABI-encoded data; length should be a multiple of 32 (was %d)", len(argdata)) - } - - abispec, err := abi.JSON(strings.NewReader(abidata)) - if err != nil { - return nil, fmt.Errorf("Failed parsing JSON ABI: %v, abidata: %v", err, abidata) - } - - method, err := abispec.MethodById(sigdata) - if err != nil { - return nil, err - } - - v, err := method.Inputs.UnpackValues(argdata) - if err != nil { - return nil, err - } - - decoded := decodedCallData{signature: method.Sig(), name: method.Name} - - for n, argument := range method.Inputs { - if err != nil { - return nil, fmt.Errorf("Failed to decode argument %d (signature %v): %v", n, method.Sig(), err) - } - decodedArg := decodedArgument{ - soltype: argument, - value: v[n], - } - decoded.inputs = append(decoded.inputs, decodedArg) - } - - // We're finished decoding the data. At this point, we encode the decoded data to see if it matches with the - // original data. If we didn't do that, it would e.g. be possible to stuff extra data into the arguments, which - // is not detected by merely decoding the data. - - var ( - encoded []byte - ) - encoded, err = method.Inputs.PackValues(v) - - if err != nil { - return nil, err - } - - if !bytes.Equal(encoded, argdata) { - was := common.Bytes2Hex(encoded) - exp := common.Bytes2Hex(argdata) - return nil, fmt.Errorf("WARNING: Supplied data is stuffed with extra data. \nWant %s\nHave %s\nfor method %v", exp, was, method.Sig()) - } - return &decoded, nil -} - -// MethodSelectorToAbi converts a method selector into an ABI struct. The returned data is a valid json string -// which can be consumed by the standard abi package. -func MethodSelectorToAbi(selector string) ([]byte, error) { - - re := regexp.MustCompile(`^([^\)]+)\(([a-z0-9,\[\]]*)\)`) - - type fakeArg struct { - Type string `json:"type"` - } - type fakeABI struct { - Name string `json:"name"` - Type string `json:"type"` - Inputs []fakeArg `json:"inputs"` - } - groups := re.FindStringSubmatch(selector) - if len(groups) != 3 { - return nil, fmt.Errorf("Did not match: %v (%v matches)", selector, len(groups)) - } - name := groups[1] - args := groups[2] - arguments := make([]fakeArg, 0) - if len(args) > 0 { - for _, arg := range strings.Split(args, ",") { - arguments = append(arguments, fakeArg{arg}) - } - } - abicheat := fakeABI{ - name, "function", arguments, - } - return json.Marshal([]fakeABI{abicheat}) - -} - -type AbiDb struct { - db map[string]string - customdb map[string]string - customdbPath string -} - -// NewEmptyAbiDB exists for test purposes -func NewEmptyAbiDB() (*AbiDb, error) { - return &AbiDb{make(map[string]string), make(map[string]string), ""}, nil -} - -// NewAbiDBFromFile loads signature database from file, and -// errors if the file is not valid json. Does no other validation of contents -func NewAbiDBFromFile(path string) (*AbiDb, error) { - raw, err := ioutil.ReadFile(path) - if err != nil { - return nil, err - } - db, err := NewEmptyAbiDB() - if err != nil { - return nil, err - } - json.Unmarshal(raw, &db.db) - return db, nil -} - -// NewAbiDBFromFiles loads both the standard signature database and a custom database. The latter will be used -// to write new values into if they are submitted via the API -func NewAbiDBFromFiles(standard, custom string) (*AbiDb, error) { - - db := &AbiDb{make(map[string]string), make(map[string]string), custom} - db.customdbPath = custom - - raw, err := ioutil.ReadFile(standard) - if err != nil { - return nil, err - } - json.Unmarshal(raw, &db.db) - // Custom file may not exist. Will be created during save, if needed - if _, err := os.Stat(custom); err == nil { - raw, err = ioutil.ReadFile(custom) - if err != nil { - return nil, err - } - json.Unmarshal(raw, &db.customdb) - } - - return db, nil -} - -// LookupMethodSelector checks the given 4byte-sequence against the known ABI methods. -// OBS: This method does not validate the match, it's assumed the caller will do so -func (db *AbiDb) LookupMethodSelector(id []byte) (string, error) { - if len(id) < 4 { - return "", fmt.Errorf("Expected 4-byte id, got %d", len(id)) - } - sig := common.ToHex(id[:4]) - if key, exists := db.db[sig]; exists { - return key, nil - } - if key, exists := db.customdb[sig]; exists { - return key, nil - } - return "", fmt.Errorf("Signature %v not found", sig) -} -func (db *AbiDb) Size() int { - return len(db.db) -} - -// saveCustomAbi saves a signature ephemerally. If custom file is used, also saves to disk -func (db *AbiDb) saveCustomAbi(selector, signature string) error { - db.customdb[signature] = selector - if db.customdbPath == "" { - return nil //Not an error per se, just not used - } - d, err := json.Marshal(db.customdb) - if err != nil { - return err - } - err = ioutil.WriteFile(db.customdbPath, d, 0600) - return err -} - -// AddSignature to the database, if custom database saving is enabled. -// OBS: This method does _not_ validate the correctness of the data, -// it is assumed that the caller has already done so -func (db *AbiDb) AddSignature(selector string, data []byte) error { - if len(data) < 4 { - return nil - } - _, err := db.LookupMethodSelector(data[:4]) - if err == nil { - return nil - } - sig := common.ToHex(data[:4]) - return db.saveCustomAbi(selector, sig) -} diff --git a/signer/core/abihelper_test.go b/signer/core/abihelper_test.go deleted file mode 100644 index c66905f931ce..000000000000 --- a/signer/core/abihelper_test.go +++ /dev/null @@ -1,251 +0,0 @@ -// Copyright 2018 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 core - -import ( - "fmt" - "strings" - "testing" - - "io/ioutil" - "math/big" - "reflect" - - "github.com/nebulaai/nbai-node/accounts/abi" - "github.com/nebulaai/nbai-node/common" -) - -func verify(t *testing.T, jsondata, calldata string, exp []interface{}) { - - abispec, err := abi.JSON(strings.NewReader(jsondata)) - if err != nil { - t.Fatal(err) - } - cd := common.Hex2Bytes(calldata) - sigdata, argdata := cd[:4], cd[4:] - method, err := abispec.MethodById(sigdata) - if err != nil { - t.Fatal(err) - } - data, err := method.Inputs.UnpackValues(argdata) - if err != nil { - t.Fatal(err) - } - if len(data) != len(exp) { - t.Fatalf("Mismatched length, expected %d, got %d", len(exp), len(data)) - } - for i, elem := range data { - if !reflect.DeepEqual(elem, exp[i]) { - t.Fatalf("Unpack error, arg %d, got %v, want %v", i, elem, exp[i]) - } - } -} -func TestNewUnpacker(t *testing.T) { - type unpackTest struct { - jsondata string - calldata string - exp []interface{} - } - testcases := []unpackTest{ - { // https://solidity.readthedocs.io/en/develop/abi-spec.html#use-of-dynamic-types - `[{"type":"function","name":"f", "inputs":[{"type":"uint256"},{"type":"uint32[]"},{"type":"bytes10"},{"type":"bytes"}]}]`, - // 0x123, [0x456, 0x789], "1234567890", "Hello, world!" - "8be65246" + "00000000000000000000000000000000000000000000000000000000000001230000000000000000000000000000000000000000000000000000000000000080313233343536373839300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004560000000000000000000000000000000000000000000000000000000000000789000000000000000000000000000000000000000000000000000000000000000d48656c6c6f2c20776f726c642100000000000000000000000000000000000000", - []interface{}{ - big.NewInt(0x123), - []uint32{0x456, 0x789}, - [10]byte{49, 50, 51, 52, 53, 54, 55, 56, 57, 48}, - common.Hex2Bytes("48656c6c6f2c20776f726c6421"), - }, - }, { // https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#examples - `[{"type":"function","name":"sam","inputs":[{"type":"bytes"},{"type":"bool"},{"type":"uint256[]"}]}]`, - // "dave", true and [1,2,3] - "a5643bf20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", - []interface{}{ - []byte{0x64, 0x61, 0x76, 0x65}, - true, - []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}, - }, - }, { - `[{"type":"function","name":"send","inputs":[{"type":"uint256"}]}]`, - "a52c101e0000000000000000000000000000000000000000000000000000000000000012", - []interface{}{big.NewInt(0x12)}, - }, { - `[{"type":"function","name":"compareAndApprove","inputs":[{"type":"address"},{"type":"uint256"},{"type":"uint256"}]}]`, - "751e107900000000000000000000000000000133700000deadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", - []interface{}{ - common.HexToAddress("0x00000133700000deadbeef000000000000000000"), - new(big.Int).SetBytes([]byte{0x00}), - big.NewInt(0x1), - }, - }, - } - for _, c := range testcases { - verify(t, c.jsondata, c.calldata, c.exp) - } - -} - -func TestCalldataDecoding(t *testing.T) { - - // send(uint256) : a52c101e - // compareAndApprove(address,uint256,uint256) : 751e1079 - // issue(address[],uint256) : 42958b54 - jsondata := ` -[ - {"type":"function","name":"send","inputs":[{"name":"a","type":"uint256"}]}, - {"type":"function","name":"compareAndApprove","inputs":[{"name":"a","type":"address"},{"name":"a","type":"uint256"},{"name":"a","type":"uint256"}]}, - {"type":"function","name":"issue","inputs":[{"name":"a","type":"address[]"},{"name":"a","type":"uint256"}]}, - {"type":"function","name":"sam","inputs":[{"name":"a","type":"bytes"},{"name":"a","type":"bool"},{"name":"a","type":"uint256[]"}]} -]` - //Expected failures - for i, hexdata := range []string{ - "a52c101e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000042", - "a52c101e000000000000000000000000000000000000000000000000000000000000001200", - "a52c101e00000000000000000000000000000000000000000000000000000000000000", - "a52c101e", - "a52c10", - "", - // Too short - "751e10790000000000000000000000000000000000000000000000000000000000000012", - "751e1079FFffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - //Not valid multiple of 32 - "deadbeef00000000000000000000000000000000000000000000000000000000000000", - //Too short 'issue' - "42958b5400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000042", - // Too short compareAndApprove - "a52c101e00ff0000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000042", - // From https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI - // contains a bool with illegal values - "a5643bf20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", - } { - _, err := parseCallData(common.Hex2Bytes(hexdata), jsondata) - if err == nil { - t.Errorf("test %d: expected decoding to fail: %s", i, hexdata) - } - } - //Expected success - for i, hexdata := range []string{ - // From https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI - "a5643bf20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", - "a52c101e0000000000000000000000000000000000000000000000000000000000000012", - "a52c101eFFffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "751e1079000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "42958b54" + - // start of dynamic type - "0000000000000000000000000000000000000000000000000000000000000040" + - //uint256 - "0000000000000000000000000000000000000000000000000000000000000001" + - // length of array - "0000000000000000000000000000000000000000000000000000000000000002" + - // array values - "000000000000000000000000000000000000000000000000000000000000dead" + - "000000000000000000000000000000000000000000000000000000000000beef", - } { - _, err := parseCallData(common.Hex2Bytes(hexdata), jsondata) - if err != nil { - t.Errorf("test %d: unexpected failure on input %s:\n %v (%d bytes) ", i, hexdata, err, len(common.Hex2Bytes(hexdata))) - } - } -} - -func TestSelectorUnmarshalling(t *testing.T) { - var ( - db *AbiDb - err error - abistring []byte - abistruct abi.ABI - ) - - db, err = NewAbiDBFromFile("../../cmd/clef/4byte.json") - if err != nil { - t.Fatal(err) - } - fmt.Printf("DB size %v\n", db.Size()) - for id, selector := range db.db { - - abistring, err = MethodSelectorToAbi(selector) - if err != nil { - t.Error(err) - return - } - abistruct, err = abi.JSON(strings.NewReader(string(abistring))) - if err != nil { - t.Error(err) - return - } - m, err := abistruct.MethodById(common.Hex2Bytes(id[2:])) - if err != nil { - t.Error(err) - return - } - if m.Sig() != selector { - t.Errorf("Expected equality: %v != %v", m.Sig(), selector) - } - } - -} - -func TestCustomABI(t *testing.T) { - d, err := ioutil.TempDir("", "signer-4byte-test") - if err != nil { - t.Fatal(err) - } - filename := fmt.Sprintf("%s/4byte_custom.json", d) - abidb, err := NewAbiDBFromFiles("../../cmd/clef/4byte.json", filename) - if err != nil { - t.Fatal(err) - } - // Now we'll remove all existing signatures - abidb.db = make(map[string]string) - calldata := common.Hex2Bytes("a52c101edeadbeef") - _, err = abidb.LookupMethodSelector(calldata) - if err == nil { - t.Fatalf("Should not find a match on empty db") - } - if err = abidb.AddSignature("send(uint256)", calldata); err != nil { - t.Fatalf("Failed to save file: %v", err) - } - _, err = abidb.LookupMethodSelector(calldata) - if err != nil { - t.Fatalf("Should find a match for abi signature, got: %v", err) - } - //Check that it wrote to file - abidb2, err := NewAbiDBFromFile(filename) - if err != nil { - t.Fatalf("Failed to create new abidb: %v", err) - } - _, err = abidb2.LookupMethodSelector(calldata) - if err != nil { - t.Fatalf("Save failed: should find a match for abi signature after loading from disk") - } -} - -func TestMaliciousAbiStrings(t *testing.T) { - tests := []string{ - "func(uint256,uint256,[]uint256)", - "func(uint256,uint256,uint256,)", - "func(,uint256,uint256,uint256)", - } - data := common.Hex2Bytes("4401a6e40000000000000000000000000000000000000000000000000000000000000012") - for i, tt := range tests { - _, err := testSelector(tt, data) - if err == nil { - t.Errorf("test %d: expected error for selector '%v'", i, tt) - } - } -} diff --git a/signer/core/api.go b/signer/core/api.go index ae4cd21b481a..c10bf578d22f 100644 --- a/signer/core/api.go +++ b/signer/core/api.go @@ -1,18 +1,18 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// 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 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. // -// go-ethereum is distributed in the hope that it will be useful, +// 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 General Public License for more details. +// GNU Lesser 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 . +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . package core @@ -21,52 +21,56 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" "math/big" + "os" "reflect" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/accounts/usbwallet" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/internal/ethapi" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/accounts/scwallet" + "github.com/ethereum/go-ethereum/accounts/usbwallet" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/signer/storage" ) -// numberOfAccountsToDerive For hardware wallets, the number of accounts to derive -const numberOfAccountsToDerive = 10 +const ( + // numberOfAccountsToDerive For hardware wallets, the number of accounts to derive + numberOfAccountsToDerive = 10 + // ExternalAPIVersion -- see extapi_changelog.md + ExternalAPIVersion = "6.0.0" + // InternalAPIVersion -- see intapi_changelog.md + InternalAPIVersion = "7.0.0" +) // ExternalAPI defines the external API through which signing requests are made. type ExternalAPI interface { // List available accounts List(ctx context.Context) ([]common.Address, error) // New request to create a new account - New(ctx context.Context) (accounts.Account, error) + New(ctx context.Context) (common.Address, error) // SignTransaction request to sign the specified transaction SignTransaction(ctx context.Context, args SendTxArgs, methodSelector *string) (*ethapi.SignTransactionResult, error) - // Sign - request to sign the given data (plus prefix) - Sign(ctx context.Context, addr common.MixedcaseAddress, data hexutil.Bytes) (hexutil.Bytes, error) - // Export - request to export an account - Export(ctx context.Context, addr common.Address) (json.RawMessage, error) - // Import - request to import an account - // Should be moved to Internal API, in next phase when we have - // bi-directional communication - //Import(ctx context.Context, keyJSON json.RawMessage) (Account, error) + // SignData - request to sign the given data (plus prefix) + SignData(ctx context.Context, contentType string, addr common.MixedcaseAddress, data interface{}) (hexutil.Bytes, error) + // SignTypedData - request to sign the given structured data (plus prefix) + SignTypedData(ctx context.Context, addr common.MixedcaseAddress, data TypedData) (hexutil.Bytes, error) + // EcRecover - recover public key from given message and signature + EcRecover(ctx context.Context, data hexutil.Bytes, sig hexutil.Bytes) (common.Address, error) + // Version info about the APIs + Version(ctx context.Context) (string, error) } -// SignerUI specifies what method a UI needs to implement to be able to be used as a UI for the signer -type SignerUI interface { +// UIClientAPI specifies what method a UI needs to implement to be able to be used as a +// UI for the signer +type UIClientAPI interface { // ApproveTx prompt the user for confirmation to request to sign Transaction ApproveTx(request *SignTxRequest) (SignTxResponse, error) // ApproveSignData prompt the user for confirmation to request to sign data ApproveSignData(request *SignDataRequest) (SignDataResponse, error) - // ApproveExport prompt the user for confirmation to export encrypted Account json - ApproveExport(request *ExportRequest) (ExportResponse, error) - // ApproveImport prompt the user for confirmation to import Account json - ApproveImport(request *ImportRequest) (ImportResponse, error) // ApproveListing prompt the user for confirmation to list accounts // the list of accounts to list can be modified by the UI ApproveListing(request *ListRequest) (ListResponse, error) @@ -85,15 +89,31 @@ type SignerUI interface { // OnInputRequired is invoked when clef requires user input, for example master password or // pin-code for unlocking hardware wallets OnInputRequired(info UserInputRequest) (UserInputResponse, error) + // RegisterUIServer tells the UI to use the given UIServerAPI for ui->clef communication + RegisterUIServer(api *UIServerAPI) +} + +// Validator defines the methods required to validate a transaction against some +// sanity defaults as well as any underlying 4byte method database. +// +// Use fourbyte.Database as an implementation. It is separated out of this package +// to allow pieces of the signer package to be used without having to load the +// 7MB embedded 4byte dump. +type Validator interface { + // ValidateTransaction does a number of checks on the supplied transaction, and + // returns either a list of warnings, or an error (indicating that the transaction + // should be immediately rejected). + ValidateTransaction(selector *string, tx *SendTxArgs) (*ValidationMessages, error) } // SignerAPI defines the actual implementation of ExternalAPI type SignerAPI struct { - chainID *big.Int - am *accounts.Manager - UI SignerUI - validator *Validator - rejectMode bool + chainID *big.Int + am *accounts.Manager + UI UIClientAPI + validator Validator + rejectMode bool + credentials storage.Storage } // Metadata about a request @@ -105,6 +125,65 @@ type Metadata struct { Origin string `json:"Origin"` } +func StartClefAccountManager(ksLocation string, nousb, lightKDF bool, scpath string) *accounts.Manager { + var ( + backends []accounts.Backend + n, p = keystore.StandardScryptN, keystore.StandardScryptP + ) + if lightKDF { + n, p = keystore.LightScryptN, keystore.LightScryptP + } + // support password based accounts + if len(ksLocation) > 0 { + backends = append(backends, keystore.NewKeyStore(ksLocation, n, p)) + } + if !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) + log.Debug("Ledger support enabled") + } + // Start a USB hub for Trezor hardware wallets (HID version) + if trezorhub, err := usbwallet.NewTrezorHubWithHID(); err != nil { + log.Warn(fmt.Sprintf("Failed to start HID Trezor hub, disabling: %v", err)) + } else { + backends = append(backends, trezorhub) + log.Debug("Trezor support enabled via HID") + } + // Start a USB hub for Trezor hardware wallets (WebUSB version) + if trezorhub, err := usbwallet.NewTrezorHubWithWebUSB(); err != nil { + log.Warn(fmt.Sprintf("Failed to start WebUSB Trezor hub, disabling: %v", err)) + } else { + backends = append(backends, trezorhub) + log.Debug("Trezor support enabled via WebUSB") + } + } + + // Start a smart card hub + if len(scpath) > 0 { + // Sanity check that the smartcard path is valid + fi, err := os.Stat(scpath) + if err != nil { + log.Info("Smartcard socket file missing, disabling", "err", err) + } else { + if fi.Mode()&os.ModeType != os.ModeSocket { + log.Error("Invalid smartcard socket file type", "path", scpath, "type", fi.Mode().String()) + } else { + if schub, err := scwallet.NewHub(scpath, scwallet.Scheme, ksLocation); err != nil { + log.Warn(fmt.Sprintf("Failed to start smart card hub, disabling: %v", err)) + } else { + backends = append(backends, schub) + } + } + } + } + + // Clef doesn't allow insecure http account unlock. + return accounts.NewManager(&accounts.Config{InsecureUnlockAllowed: false}, backends...) +} + // MetadataFromContext extracts Metadata from a given context.Context func MetadataFromContext(ctx context.Context) Metadata { m := Metadata{"NA", "NA", "NA", "", ""} // batman @@ -149,66 +228,40 @@ type ( //The UI may make changes to the TX Transaction SendTxArgs `json:"transaction"` Approved bool `json:"approved"` - Password string `json:"password"` - } - // ExportRequest info about query to export accounts - ExportRequest struct { - Address common.Address `json:"address"` - Meta Metadata `json:"meta"` - } - // ExportResponse response to export-request - ExportResponse struct { - Approved bool `json:"approved"` - } - // ImportRequest info about request to import an Account - ImportRequest struct { - Meta Metadata `json:"meta"` - } - ImportResponse struct { - Approved bool `json:"approved"` - OldPassword string `json:"old_password"` - NewPassword string `json:"new_password"` } SignDataRequest struct { - Address common.MixedcaseAddress `json:"address"` - Rawdata hexutil.Bytes `json:"raw_data"` - Message string `json:"message"` - Hash hexutil.Bytes `json:"hash"` - Meta Metadata `json:"meta"` + ContentType string `json:"content_type"` + Address common.MixedcaseAddress `json:"address"` + Rawdata []byte `json:"raw_data"` + Messages []*NameValueType `json:"messages"` + Hash hexutil.Bytes `json:"hash"` + Meta Metadata `json:"meta"` } SignDataResponse struct { Approved bool `json:"approved"` - Password string } NewAccountRequest struct { Meta Metadata `json:"meta"` } NewAccountResponse struct { - Approved bool `json:"approved"` - Password string `json:"password"` + Approved bool `json:"approved"` } ListRequest struct { - Accounts []Account `json:"accounts"` - Meta Metadata `json:"meta"` + Accounts []accounts.Account `json:"accounts"` + Meta Metadata `json:"meta"` } ListResponse struct { - Accounts []Account `json:"accounts"` + Accounts []accounts.Account `json:"accounts"` } Message struct { Text string `json:"text"` } - PasswordRequest struct { - Prompt string `json:"prompt"` - } - PasswordResponse struct { - Password string `json:"password"` - } StartupInfo struct { Info map[string]interface{} `json:"info"` } UserInputRequest struct { - Prompt string `json:"prompt"` Title string `json:"title"` + Prompt string `json:"prompt"` IsPassword bool `json:"isPassword"` } UserInputResponse struct { @@ -216,45 +269,18 @@ type ( } ) -var ErrRequestDenied = errors.New("Request denied") +var ErrRequestDenied = errors.New("request denied") // NewSignerAPI creates a new API that can be used for Account management. // ksLocation specifies the directory where to store the password protected private // key that is generated when a new Account is created. // noUSB disables USB support that is required to support hardware devices such as // ledger and trezor. -func NewSignerAPI(chainID int64, ksLocation string, noUSB bool, ui SignerUI, abidb *AbiDb, lightKDF bool, advancedMode bool) *SignerAPI { - var ( - backends []accounts.Backend - n, p = keystore.StandardScryptN, keystore.StandardScryptP - ) - if lightKDF { - n, p = keystore.LightScryptN, keystore.LightScryptP - } - // support password based accounts - if len(ksLocation) > 0 { - backends = append(backends, keystore.NewKeyStore(ksLocation, n, p)) - } +func NewSignerAPI(am *accounts.Manager, chainID int64, noUSB bool, ui UIClientAPI, validator Validator, advancedMode bool, credentials storage.Storage) *SignerAPI { if advancedMode { log.Info("Clef is in advanced mode: will warn instead of reject") } - if !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) - log.Debug("Ledger support enabled") - } - // 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) - log.Debug("Trezor support enabled") - } - } - signer := &SignerAPI{big.NewInt(chainID), accounts.NewManager(backends...), ui, NewValidator(abidb), !advancedMode} + signer := &SignerAPI{big.NewInt(chainID), am, ui, validator, !advancedMode, credentials} if !noUSB { signer.startUSBListener() } @@ -321,12 +347,10 @@ func (api *SignerAPI) startUSBListener() { status, _ := event.Wallet.Status() log.Info("New wallet appeared", "url", event.Wallet.URL(), "status", status) - derivationPath := accounts.DefaultBaseDerivationPath - if event.Wallet.URL().Scheme == "ledger" { - derivationPath = accounts.DefaultLedgerBaseDerivationPath - } - var nextPath = derivationPath // Derive first N accounts, hardcoded for now + var nextPath = make(accounts.DerivationPath, len(accounts.DefaultBaseDerivationPath)) + copy(nextPath[:], accounts.DefaultBaseDerivationPath[:]) + for i := 0; i < numberOfAccountsToDerive; i++ { acc, err := event.Wallet.Derive(nextPath, true) if err != nil { @@ -347,12 +371,9 @@ func (api *SignerAPI) startUSBListener() { // List returns the set of wallet this signer manages. Each wallet can contain // multiple accounts. func (api *SignerAPI) List(ctx context.Context) ([]common.Address, error) { - var accs []Account + var accs []accounts.Account for _, wallet := range api.am.Wallets() { - for _, acc := range wallet.Accounts() { - acc := Account{Typ: "Account", URL: wallet.URL(), Address: acc.Address} - accs = append(accs, acc) - } + accs = append(accs, wallet.Accounts()...) } result, err := api.UI.ApproveListing(&ListRequest{Accounts: accs, Meta: MetadataFromContext(ctx)}) if err != nil { @@ -362,7 +383,6 @@ func (api *SignerAPI) List(ctx context.Context) ([]common.Address, error) { return nil, ErrRequestDenied } - addresses := make([]common.Address, 0) for _, acc := range result.Accounts { addresses = append(addresses, acc.Address) @@ -374,33 +394,40 @@ func (api *SignerAPI) List(ctx context.Context) ([]common.Address, error) { // New creates a new password protected Account. The private key is protected with // the given password. Users are responsible to backup the private key that is stored // in the keystore location thas was specified when this API was created. -func (api *SignerAPI) New(ctx context.Context) (accounts.Account, error) { +func (api *SignerAPI) New(ctx context.Context) (common.Address, error) { be := api.am.Backends(keystore.KeyStoreType) if len(be) == 0 { - return accounts.Account{}, errors.New("password based accounts not supported") + return common.Address{}, errors.New("password based accounts not supported") } - var ( - resp NewAccountResponse - err error - ) + if resp, err := api.UI.ApproveNewAccount(&NewAccountRequest{MetadataFromContext(ctx)}); err != nil { + return common.Address{}, err + } else if !resp.Approved { + return common.Address{}, ErrRequestDenied + } + // Three retries to get a valid password for i := 0; i < 3; i++ { - resp, err = api.UI.ApproveNewAccount(&NewAccountRequest{MetadataFromContext(ctx)}) + resp, err := api.UI.OnInputRequired(UserInputRequest{ + "New account password", + fmt.Sprintf("Please enter a password for the new account to be created (attempt %d of 3)", i), + true}) if err != nil { - return accounts.Account{}, err - } - if !resp.Approved { - return accounts.Account{}, ErrRequestDenied + log.Warn("error obtaining password", "attempt", i, "error", err) + continue } - if pwErr := ValidatePasswordFormat(resp.Password); pwErr != nil { + if pwErr := ValidatePasswordFormat(resp.Text); pwErr != nil { api.UI.ShowError(fmt.Sprintf("Account creation attempt #%d failed due to password requirements: %v", (i + 1), pwErr)) } else { // No error - return be[0].(*keystore.KeyStore).NewAccount(resp.Password) + acc, err := be[0].(*keystore.KeyStore).NewAccount(resp.Text) + log.Info("Your new key was generated", "address", acc.Address) + log.Warn("Please backup your key file!", "path", acc.URL.Path) + log.Warn("Please remember your password!") + return acc.Address, err } } // Otherwise fail, with generic error message - return accounts.Account{}, errors.New("account creation failed") + return common.Address{}, errors.New("account creation failed") } // logDiff logs the difference between the incoming (original) transaction and the one returned from the signer. @@ -449,13 +476,33 @@ func logDiff(original *SignTxRequest, new *SignTxResponse) bool { return modified } +func (api *SignerAPI) lookupPassword(address common.Address) (string, error) { + return api.credentials.Get(address.Hex()) +} + +func (api *SignerAPI) lookupOrQueryPassword(address common.Address, title, prompt string) (string, error) { + // Look up the password and return if available + if pw, err := api.lookupPassword(address); err == nil { + return pw, nil + } + // Password unavailable, request it from the user + pwResp, err := api.UI.OnInputRequired(UserInputRequest{title, prompt, true}) + if err != nil { + log.Warn("error obtaining password", "error", err) + // We'll not forward the error here, in case the error contains info about the response from the UI, + // which could leak the password if it was malformed json or something + return "", errors.New("internal error") + } + return pwResp.Text, nil +} + // SignTransaction signs the given Transaction and returns it both as json and rlp-encoded form func (api *SignerAPI) SignTransaction(ctx context.Context, args SendTxArgs, methodSelector *string) (*ethapi.SignTransactionResult, error) { var ( err error result SignTxResponse ) - msgs, err := api.validator.ValidateTransaction(&args, methodSelector) + msgs, err := api.validator.ValidateTransaction(methodSelector, &args) if err != nil { return nil, err } @@ -465,7 +512,6 @@ func (api *SignerAPI) SignTransaction(ctx context.Context, args SendTxArgs, meth return nil, err } } - req := SignTxRequest{ Transaction: args, Meta: MetadataFromContext(ctx), @@ -492,15 +538,23 @@ func (api *SignerAPI) SignTransaction(ctx context.Context, args SendTxArgs, meth } // Convert fields into a real transaction var unsignedTx = result.Transaction.toTransaction() - + // Get the password for the transaction + pw, err := api.lookupOrQueryPassword(acc.Address, "Account password", + fmt.Sprintf("Please enter the password for account %s", acc.Address.String())) + if err != nil { + return nil, err + } // The one to sign is the one that was returned from the UI - signedTx, err := wallet.SignTxWithPassphrase(acc, result.Password, unsignedTx, api.chainID) + signedTx, err := wallet.SignTxWithPassphrase(acc, pw, unsignedTx, api.chainID) if err != nil { api.UI.ShowError(err.Error()) return nil, err } rlpdata, err := rlp.EncodeToBytes(signedTx) + if err != nil { + return nil, err + } response := ethapi.SignTransactionResult{Raw: rlpdata, Tx: signedTx} // Finally, send the signed tx to the UI @@ -510,103 +564,8 @@ func (api *SignerAPI) SignTransaction(ctx context.Context, args SendTxArgs, meth } -// Sign calculates an Ethereum ECDSA signature for: -// keccack256("\x19Ethereum Signed Message:\n" + len(message) + message)) -// -// Note, the produced signature conforms to the secp256k1 curve R, S and V values, -// where the V value will be 27 or 28 for legacy reasons. -// -// The key used to calculate the signature is decrypted with the given password. -// -// https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_sign -func (api *SignerAPI) Sign(ctx context.Context, addr common.MixedcaseAddress, data hexutil.Bytes) (hexutil.Bytes, error) { - sighash, msg := SignHash(data) - // We make the request prior to looking up if we actually have the account, to prevent - // account-enumeration via the API - req := &SignDataRequest{Address: addr, Rawdata: data, Message: msg, Hash: sighash, Meta: MetadataFromContext(ctx)} - res, err := api.UI.ApproveSignData(req) - - if err != nil { - return nil, err - } - if !res.Approved { - return nil, ErrRequestDenied - } - // Look up the wallet containing the requested signer - account := accounts.Account{Address: addr.Address()} - wallet, err := api.am.Find(account) - if err != nil { - return nil, err - } - // Assemble sign the data with the wallet - signature, err := wallet.SignHashWithPassphrase(account, res.Password, sighash) - if err != nil { - api.UI.ShowError(err.Error()) - return nil, err - } - signature[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper - return signature, nil -} - -// SignHash is a helper function that calculates a hash for the given message that can be -// safely used to calculate a signature from. -// -// The hash is calculated as -// keccak256("\x19Ethereum Signed Message:\n"${message length}${message}). -// -// This gives context to the signed message and prevents signing of transactions. -func SignHash(data []byte) ([]byte, string) { - msg := fmt.Sprintf("\x19Ethereum Signed Message:\n%d%s", len(data), data) - return crypto.Keccak256([]byte(msg)), msg -} - -// Export returns encrypted private key associated with the given address in web3 keystore format. -func (api *SignerAPI) Export(ctx context.Context, addr common.Address) (json.RawMessage, error) { - res, err := api.UI.ApproveExport(&ExportRequest{Address: addr, Meta: MetadataFromContext(ctx)}) - - if err != nil { - return nil, err - } - if !res.Approved { - return nil, ErrRequestDenied - } - // Look up the wallet containing the requested signer - wallet, err := api.am.Find(accounts.Account{Address: addr}) - if err != nil { - return nil, err - } - if wallet.URL().Scheme != keystore.KeyStoreScheme { - return nil, fmt.Errorf("Account is not a keystore-account") - } - return ioutil.ReadFile(wallet.URL().Path) -} - -// Import tries to import the given keyJSON in the local keystore. The keyJSON data is expected to be -// in web3 keystore format. It will decrypt the keyJSON with the given passphrase and on successful -// decryption it will encrypt the key with the given newPassphrase and store it in the keystore. -// OBS! This method is removed from the public API. It should not be exposed on the external API -// for a couple of reasons: -// 1. Even though it is encrypted, it should still be seen as sensitive data -// 2. It can be used to DoS clef, by using malicious data with e.g. extreme large -// values for the kdfparams. -func (api *SignerAPI) Import(ctx context.Context, keyJSON json.RawMessage) (Account, error) { - be := api.am.Backends(keystore.KeyStoreType) - - if len(be) == 0 { - return Account{}, errors.New("password based accounts not supported") - } - res, err := api.UI.ApproveImport(&ImportRequest{Meta: MetadataFromContext(ctx)}) - - if err != nil { - return Account{}, err - } - if !res.Approved { - return Account{}, ErrRequestDenied - } - acc, err := be[0].(*keystore.KeyStore).Import(keyJSON, res.OldPassword, res.NewPassword) - if err != nil { - api.UI.ShowError(err.Error()) - return Account{}, err - } - return Account{Typ: "Account", URL: acc.URL, Address: acc.Address}, nil +// Returns the external api version. This method does not require user acceptance. Available methods are +// available via enumeration anyway, and this info does not contain user-specific data +func (api *SignerAPI) Version(ctx context.Context) (string, error) { + return ExternalAPIVersion, nil } diff --git a/signer/core/api_test.go b/signer/core/api_test.go index 94862d75c649..800020b0cf00 100644 --- a/signer/core/api_test.go +++ b/signer/core/api_test.go @@ -1,25 +1,24 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// 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 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. // -// go-ethereum is distributed in the hope that it will be useful, +// 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 General Public License for more details. +// GNU Lesser 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 core +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package core_test import ( "bytes" "context" - "errors" "fmt" "io/ioutil" "math/big" @@ -28,91 +27,82 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/accounts/keystore" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/internal/ethapi" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/rlp" + "github.com/ethereum/go-ethereum/signer/core" + "github.com/ethereum/go-ethereum/signer/fourbyte" + "github.com/ethereum/go-ethereum/signer/storage" ) //Used for testing -type HeadlessUI struct { - controller chan string -} - -func (ui *HeadlessUI) OnInputRequired(info UserInputRequest) (UserInputResponse, error) { - return UserInputResponse{}, errors.New("not implemented") +type headlessUi struct { + approveCh chan string // to send approve/deny + inputCh chan string // to send password } -func (ui *HeadlessUI) OnSignerStartup(info StartupInfo) { +func (ui *headlessUi) OnInputRequired(info core.UserInputRequest) (core.UserInputResponse, error) { + input := <-ui.inputCh + return core.UserInputResponse{Text: input}, nil } -func (ui *HeadlessUI) OnApprovedTx(tx ethapi.SignTransactionResult) { - fmt.Printf("OnApproved()\n") -} +func (ui *headlessUi) OnSignerStartup(info core.StartupInfo) {} +func (ui *headlessUi) RegisterUIServer(api *core.UIServerAPI) {} +func (ui *headlessUi) OnApprovedTx(tx ethapi.SignTransactionResult) {} -func (ui *HeadlessUI) ApproveTx(request *SignTxRequest) (SignTxResponse, error) { +func (ui *headlessUi) ApproveTx(request *core.SignTxRequest) (core.SignTxResponse, error) { - switch <-ui.controller { + switch <-ui.approveCh { case "Y": - return SignTxResponse{request.Transaction, true, <-ui.controller}, nil - case "M": //Modify + return core.SignTxResponse{request.Transaction, true}, nil + case "M": // modify + // The headless UI always modifies the transaction old := big.Int(request.Transaction.Value) newVal := big.NewInt(0).Add(&old, big.NewInt(1)) request.Transaction.Value = hexutil.Big(*newVal) - return SignTxResponse{request.Transaction, true, <-ui.controller}, nil + return core.SignTxResponse{request.Transaction, true}, nil default: - return SignTxResponse{request.Transaction, false, ""}, nil + return core.SignTxResponse{request.Transaction, false}, nil } } -func (ui *HeadlessUI) ApproveSignData(request *SignDataRequest) (SignDataResponse, error) { - if "Y" == <-ui.controller { - return SignDataResponse{true, <-ui.controller}, nil - } - return SignDataResponse{false, ""}, nil +func (ui *headlessUi) ApproveSignData(request *core.SignDataRequest) (core.SignDataResponse, error) { + approved := (<-ui.approveCh == "Y") + return core.SignDataResponse{approved}, nil } -func (ui *HeadlessUI) ApproveExport(request *ExportRequest) (ExportResponse, error) { - return ExportResponse{<-ui.controller == "Y"}, nil - -} - -func (ui *HeadlessUI) ApproveImport(request *ImportRequest) (ImportResponse, error) { - if "Y" == <-ui.controller { - return ImportResponse{true, <-ui.controller, <-ui.controller}, nil - } - return ImportResponse{false, "", ""}, nil -} - -func (ui *HeadlessUI) ApproveListing(request *ListRequest) (ListResponse, error) { - switch <-ui.controller { +func (ui *headlessUi) ApproveListing(request *core.ListRequest) (core.ListResponse, error) { + approval := <-ui.approveCh + //fmt.Printf("approval %s\n", approval) + switch approval { case "A": - return ListResponse{request.Accounts}, nil + return core.ListResponse{request.Accounts}, nil case "1": - l := make([]Account, 1) + l := make([]accounts.Account, 1) l[0] = request.Accounts[1] - return ListResponse{l}, nil + return core.ListResponse{l}, nil default: - return ListResponse{nil}, nil + return core.ListResponse{nil}, nil } } -func (ui *HeadlessUI) ApproveNewAccount(request *NewAccountRequest) (NewAccountResponse, error) { - if "Y" == <-ui.controller { - return NewAccountResponse{true, <-ui.controller}, nil +func (ui *headlessUi) ApproveNewAccount(request *core.NewAccountRequest) (core.NewAccountResponse, error) { + if <-ui.approveCh == "Y" { + return core.NewAccountResponse{true}, nil } - return NewAccountResponse{false, ""}, nil + return core.NewAccountResponse{false}, nil } -func (ui *HeadlessUI) ShowError(message string) { +func (ui *headlessUi) ShowError(message string) { //stdout is used by communication fmt.Fprintln(os.Stderr, message) } -func (ui *HeadlessUI) ShowInfo(message string) { +func (ui *headlessUi) ShowInfo(message string) { //stdout is used by communication fmt.Fprintln(os.Stderr, message) } @@ -129,30 +119,20 @@ func tmpDirName(t *testing.T) string { return d } -func setup(t *testing.T) (*SignerAPI, chan string) { - - controller := make(chan string, 20) - - db, err := NewAbiDBFromFile("../../cmd/clef/4byte.json") +func setup(t *testing.T) (*core.SignerAPI, *headlessUi) { + db, err := fourbyte.New() if err != nil { - utils.Fatalf(err.Error()) + t.Fatal(err.Error()) } - var ( - ui = &HeadlessUI{controller} - api = NewSignerAPI( - 1, - tmpDirName(t), - true, - ui, - db, - true, true) - ) - return api, controller -} -func createAccount(control chan string, api *SignerAPI, t *testing.T) { + ui := &headlessUi{make(chan string, 20), make(chan string, 20)} + am := core.StartClefAccountManager(tmpDirName(t), true, true, "") + api := core.NewSignerAPI(am, 1337, true, ui, db, true, &storage.NoStorage{}) + return api, ui - control <- "Y" - control <- "a_long_password" +} +func createAccount(ui *headlessUi, api *core.SignerAPI, t *testing.T) { + ui.approveCh <- "Y" + ui.inputCh <- "a_long_password" _, err := api.New(context.Background()) if err != nil { t.Fatal(err) @@ -161,48 +141,48 @@ func createAccount(control chan string, api *SignerAPI, t *testing.T) { time.Sleep(250 * time.Millisecond) } -func failCreateAccountWithPassword(control chan string, api *SignerAPI, password string, t *testing.T) { +func failCreateAccountWithPassword(ui *headlessUi, api *core.SignerAPI, password string, t *testing.T) { - control <- "Y" - control <- password - control <- "Y" - control <- password - control <- "Y" - control <- password + ui.approveCh <- "Y" + // We will be asked three times to provide a suitable password + ui.inputCh <- password + ui.inputCh <- password + ui.inputCh <- password - acc, err := api.New(context.Background()) + addr, err := api.New(context.Background()) if err == nil { t.Fatal("Should have returned an error") } - if acc.Address != (common.Address{}) { + if addr != (common.Address{}) { t.Fatal("Empty address should be returned") } } -func failCreateAccount(control chan string, api *SignerAPI, t *testing.T) { - control <- "N" - acc, err := api.New(context.Background()) - if err != ErrRequestDenied { +func failCreateAccount(ui *headlessUi, api *core.SignerAPI, t *testing.T) { + ui.approveCh <- "N" + addr, err := api.New(context.Background()) + if err != core.ErrRequestDenied { t.Fatal(err) } - if acc.Address != (common.Address{}) { + if addr != (common.Address{}) { t.Fatal("Empty address should be returned") } } -func list(control chan string, api *SignerAPI, t *testing.T) []common.Address { - control <- "A" - list, err := api.List(context.Background()) - if err != nil { - t.Fatal(err) - } - return list +func list(ui *headlessUi, api *core.SignerAPI, t *testing.T) ([]common.Address, error) { + ui.approveCh <- "A" + return api.List(context.Background()) + } func TestNewAcc(t *testing.T) { api, control := setup(t) verifyNum := func(num int) { - if list := list(control, api, t); len(list) != num { + list, err := list(control, api, t) + if err != nil { + t.Errorf("Unexpected error %v", err) + } + if len(list) != num { t.Errorf("Expected %d accounts, got %d", num, len(list)) } } @@ -215,18 +195,16 @@ func TestNewAcc(t *testing.T) { failCreateAccount(control, api, t) createAccount(control, api, t) failCreateAccount(control, api, t) - verifyNum(4) // Fail to create this, due to bad password failCreateAccountWithPassword(control, api, "short", t) failCreateAccountWithPassword(control, api, "longerbutbad\rfoo", t) - verifyNum(4) // Testing listing: // Listing one Account - control <- "1" + control.approveCh <- "1" list, err := api.List(context.Background()) if err != nil { t.Fatal(err) @@ -235,63 +213,24 @@ func TestNewAcc(t *testing.T) { t.Fatalf("List should only show one Account") } // Listing denied - control <- "Nope" + control.approveCh <- "Nope" list, err = api.List(context.Background()) if len(list) != 0 { t.Fatalf("List should be empty") } - if err != ErrRequestDenied { + if err != core.ErrRequestDenied { t.Fatal("Expected deny") } } -func TestSignData(t *testing.T) { - api, control := setup(t) - //Create two accounts - createAccount(control, api, t) - createAccount(control, api, t) - control <- "1" - list, err := api.List(context.Background()) - if err != nil { - t.Fatal(err) - } - a := common.NewMixedcaseAddress(list[0]) - - control <- "Y" - control <- "wrongpassword" - h, err := api.Sign(context.Background(), a, []byte("EHLO world")) - if h != nil { - t.Errorf("Expected nil-data, got %x", h) - } - if err != keystore.ErrDecrypt { - t.Errorf("Expected ErrLocked! %v", err) - } - control <- "No way" - h, err = api.Sign(context.Background(), a, []byte("EHLO world")) - if h != nil { - t.Errorf("Expected nil-data, got %x", h) - } - if err != ErrRequestDenied { - t.Errorf("Expected ErrRequestDenied! %v", err) - } - control <- "Y" - control <- "a_long_password" - h, err = api.Sign(context.Background(), a, []byte("EHLO world")) - if err != nil { - t.Fatal(err) - } - if h == nil || len(h) != 65 { - t.Errorf("Expected 65 byte signature (got %d bytes)", len(h)) - } -} -func mkTestTx(from common.MixedcaseAddress) SendTxArgs { +func mkTestTx(from common.MixedcaseAddress) core.SendTxArgs { to := common.NewMixedcaseAddress(common.HexToAddress("0x1337")) gas := hexutil.Uint64(21000) gasPrice := (hexutil.Big)(*big.NewInt(2000000000)) value := (hexutil.Big)(*big.NewInt(1e18)) nonce := (hexutil.Uint64)(0) data := hexutil.Bytes(common.Hex2Bytes("01020304050607080a")) - tx := SendTxArgs{ + tx := core.SendTxArgs{ From: from, To: &to, Gas: gas, @@ -311,7 +250,7 @@ func TestSignTx(t *testing.T) { api, control := setup(t) createAccount(control, api, t) - control <- "A" + control.approveCh <- "A" list, err = api.List(context.Background()) if err != nil { t.Fatal(err) @@ -321,8 +260,8 @@ func TestSignTx(t *testing.T) { methodSig := "test(uint)" tx := mkTestTx(a) - control <- "Y" - control <- "wrongpassword" + control.approveCh <- "Y" + control.inputCh <- "wrongpassword" res, err = api.SignTransaction(context.Background(), tx, &methodSig) if res != nil { t.Errorf("Expected nil-response, got %v", res) @@ -330,16 +269,17 @@ func TestSignTx(t *testing.T) { if err != keystore.ErrDecrypt { t.Errorf("Expected ErrLocked! %v", err) } - control <- "No way" + control.approveCh <- "No way" res, err = api.SignTransaction(context.Background(), tx, &methodSig) if res != nil { t.Errorf("Expected nil-response, got %v", res) } - if err != ErrRequestDenied { + if err != core.ErrRequestDenied { t.Errorf("Expected ErrRequestDenied! %v", err) } - control <- "Y" - control <- "a_long_password" + // Sign with correct password + control.approveCh <- "Y" + control.inputCh <- "a_long_password" res, err = api.SignTransaction(context.Background(), tx, &methodSig) if err != nil { @@ -352,8 +292,8 @@ func TestSignTx(t *testing.T) { if parsedTx.Value().Cmp(tx.Value.ToInt()) != 0 { t.Errorf("Expected value to be unchanged, expected %v got %v", tx.Value, parsedTx.Value()) } - control <- "Y" - control <- "a_long_password" + control.approveCh <- "Y" + control.inputCh <- "a_long_password" res2, err = api.SignTransaction(context.Background(), tx, &methodSig) if err != nil { @@ -364,8 +304,8 @@ func TestSignTx(t *testing.T) { } //The tx is modified by the UI - control <- "M" - control <- "a_long_password" + control.approveCh <- "M" + control.inputCh <- "a_long_password" res2, err = api.SignTransaction(context.Background(), tx, &methodSig) if err != nil { @@ -383,31 +323,3 @@ func TestSignTx(t *testing.T) { } } - -/* -func TestAsyncronousResponses(t *testing.T){ - - //Set up one account - api, control := setup(t) - createAccount(control, api, t) - - // Two transactions, the second one with larger value than the first - tx1 := mkTestTx() - newVal := big.NewInt(0).Add((*big.Int) (tx1.Value), big.NewInt(1)) - tx2 := mkTestTx() - tx2.Value = (*hexutil.Big)(newVal) - - control <- "W" //wait - control <- "Y" // - control <- "a_long_password" - control <- "Y" // - control <- "a_long_password" - - var err error - - h1, err := api.SignTransaction(context.Background(), common.HexToAddress("1111"), tx1, nil) - h2, err := api.SignTransaction(context.Background(), common.HexToAddress("2222"), tx2, nil) - - - } -*/ diff --git a/signer/core/auditlog.go b/signer/core/auditlog.go index 8dbeff9dc957..1092e7a92340 100644 --- a/signer/core/auditlog.go +++ b/signer/core/auditlog.go @@ -1,31 +1,28 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// 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 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. // -// go-ethereum is distributed in the hope that it will be useful, +// 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 General Public License for more details. +// GNU Lesser 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 . +// 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 ( "context" - "encoding/json" - - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/internal/ethapi" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/log" ) type AuditLogger struct { @@ -41,7 +38,7 @@ func (l *AuditLogger) List(ctx context.Context) ([]common.Address, error) { return res, e } -func (l *AuditLogger) New(ctx context.Context) (accounts.Account, error) { +func (l *AuditLogger) New(ctx context.Context) (common.Address, error) { return l.api.New(ctx) } @@ -63,31 +60,37 @@ func (l *AuditLogger) SignTransaction(ctx context.Context, args SendTxArgs, meth return res, e } -func (l *AuditLogger) Sign(ctx context.Context, addr common.MixedcaseAddress, data hexutil.Bytes) (hexutil.Bytes, error) { - l.log.Info("Sign", "type", "request", "metadata", MetadataFromContext(ctx).String(), - "addr", addr.String(), "data", common.Bytes2Hex(data)) - b, e := l.api.Sign(ctx, addr, data) - l.log.Info("Sign", "type", "response", "data", common.Bytes2Hex(b), "error", e) +func (l *AuditLogger) SignData(ctx context.Context, contentType string, addr common.MixedcaseAddress, data interface{}) (hexutil.Bytes, error) { + l.log.Info("SignData", "type", "request", "metadata", MetadataFromContext(ctx).String(), + "addr", addr.String(), "data", data, "content-type", contentType) + b, e := l.api.SignData(ctx, contentType, addr, data) + l.log.Info("SignData", "type", "response", "data", common.Bytes2Hex(b), "error", e) return b, e } -func (l *AuditLogger) Export(ctx context.Context, addr common.Address) (json.RawMessage, error) { - l.log.Info("Export", "type", "request", "metadata", MetadataFromContext(ctx).String(), - "addr", addr.Hex()) - j, e := l.api.Export(ctx, addr) - // In this case, we don't actually log the json-response, which may be extra sensitive - l.log.Info("Export", "type", "response", "json response size", len(j), "error", e) - return j, e +func (l *AuditLogger) SignTypedData(ctx context.Context, addr common.MixedcaseAddress, data TypedData) (hexutil.Bytes, error) { + l.log.Info("SignTypedData", "type", "request", "metadata", MetadataFromContext(ctx).String(), + "addr", addr.String(), "data", data) + b, e := l.api.SignTypedData(ctx, addr, data) + l.log.Info("SignTypedData", "type", "response", "data", common.Bytes2Hex(b), "error", e) + return b, e } -//func (l *AuditLogger) Import(ctx context.Context, keyJSON json.RawMessage) (Account, error) { -// // Don't actually log the json contents -// l.log.Info("Import", "type", "request", "metadata", MetadataFromContext(ctx).String(), -// "keyJSON size", len(keyJSON)) -// a, e := l.api.Import(ctx, keyJSON) -// l.log.Info("Import", "type", "response", "addr", a.String(), "error", e) -// return a, e -//} +func (l *AuditLogger) EcRecover(ctx context.Context, data hexutil.Bytes, sig hexutil.Bytes) (common.Address, error) { + l.log.Info("EcRecover", "type", "request", "metadata", MetadataFromContext(ctx).String(), + "data", common.Bytes2Hex(data), "sig", common.Bytes2Hex(sig)) + b, e := l.api.EcRecover(ctx, data, sig) + l.log.Info("EcRecover", "type", "response", "address", b.String(), "error", e) + return b, e +} + +func (l *AuditLogger) Version(ctx context.Context) (string, error) { + l.log.Info("Version", "type", "request", "metadata", MetadataFromContext(ctx).String()) + data, err := l.api.Version(ctx) + l.log.Info("Version", "type", "response", "data", data, "error", err) + return data, err + +} func NewAuditLogger(path string, api ExternalAPI) (*AuditLogger, error) { l := log.New("api", "signer") diff --git a/signer/core/cliui.go b/signer/core/cliui.go index 15647e570782..1e033299af7f 100644 --- a/signer/core/cliui.go +++ b/signer/core/cliui.go @@ -1,33 +1,32 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// 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 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. // -// go-ethereum is distributed in the hope that it will be useful, +// 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 General Public License for more details. +// GNU Lesser 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 . +// 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 ( "bufio" + "encoding/json" "fmt" "os" "strings" - "sync" - "github.com/davecgh/go-spew/spew" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/internal/ethapi" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/log" "golang.org/x/crypto/ssh/terminal" ) @@ -40,6 +39,10 @@ func NewCommandlineUI() *CommandlineUI { return &CommandlineUI{in: bufio.NewReader(os.Stdin)} } +func (ui *CommandlineUI) RegisterUIServer(api *UIServerAPI) { + // noop +} + // readString reads a single line from stdin, trimming if from spaces, enforcing // non-emptyness. func (ui *CommandlineUI) readString() string { @@ -55,38 +58,11 @@ func (ui *CommandlineUI) readString() string { } } -// readPassword reads a single line from stdin, trimming it from the trailing new -// line and returns it. The input will not be echoed. -func (ui *CommandlineUI) readPassword() string { - fmt.Printf("Enter password to approve:\n") - fmt.Printf("> ") - - text, err := terminal.ReadPassword(int(os.Stdin.Fd())) - if err != nil { - log.Crit("Failed to read password", "err", err) - } - fmt.Println() - fmt.Println("-----------------------") - return string(text) -} - -// readPassword reads a single line from stdin, trimming it from the trailing new -// line and returns it. The input will not be echoed. -func (ui *CommandlineUI) readPasswordText(inputstring string) string { - fmt.Printf("Enter %s:\n", inputstring) - 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) -} - func (ui *CommandlineUI) OnInputRequired(info UserInputRequest) (UserInputResponse, error) { - fmt.Println(info.Title) - fmt.Println(info.Prompt) + + fmt.Printf("## %s\n\n%s\n", info.Title, info.Prompt) if info.IsPassword { + fmt.Printf("> ") text, err := terminal.ReadPassword(int(os.Stdin.Fd())) if err != nil { log.Error("Failed to read password", "err", err) @@ -153,9 +129,9 @@ func (ui *CommandlineUI) ApproveTx(request *SignTxRequest) (SignTxResponse, erro showMetadata(request.Meta) fmt.Printf("-------------------------------------------\n") if !ui.confirm() { - return SignTxResponse{request.Transaction, false, ""}, nil + return SignTxResponse{request.Transaction, false}, nil } - return SignTxResponse{request.Transaction, true, ui.readPassword()}, nil + return SignTxResponse{request.Transaction, true}, nil } // ApproveSignData prompt the user for confirmation to request to sign data @@ -165,52 +141,23 @@ func (ui *CommandlineUI) ApproveSignData(request *SignDataRequest) (SignDataResp fmt.Printf("-------- Sign data request--------------\n") fmt.Printf("Account: %s\n", request.Address.String()) - fmt.Printf("message: \n%q\n", request.Message) - fmt.Printf("raw data: \n%v\n", request.Rawdata) - fmt.Printf("message hash: %v\n", request.Hash) - fmt.Printf("-------------------------------------------\n") - showMetadata(request.Meta) - if !ui.confirm() { - return SignDataResponse{false, ""}, nil + fmt.Printf("messages:\n") + for _, nvt := range request.Messages { + fmt.Printf("\u00a0\u00a0%v\n", strings.TrimSpace(nvt.Pprint(1))) } - return SignDataResponse{true, ui.readPassword()}, nil -} - -// ApproveExport prompt the user for confirmation to export encrypted Account json -func (ui *CommandlineUI) ApproveExport(request *ExportRequest) (ExportResponse, error) { - ui.mu.Lock() - defer ui.mu.Unlock() - - fmt.Printf("-------- Export Account request--------------\n") - fmt.Printf("A request has been made to export the (encrypted) keyfile\n") - fmt.Printf("Approving this operation means that the caller obtains the (encrypted) contents\n") - fmt.Printf("\n") - fmt.Printf("Account: %x\n", request.Address) - //fmt.Printf("keyfile: \n%v\n", request.file) - fmt.Printf("-------------------------------------------\n") - showMetadata(request.Meta) - return ExportResponse{ui.confirm()}, nil -} - -// ApproveImport prompt the user for confirmation to import Account json -func (ui *CommandlineUI) ApproveImport(request *ImportRequest) (ImportResponse, error) { - ui.mu.Lock() - defer ui.mu.Unlock() - - fmt.Printf("-------- Import Account request--------------\n") - fmt.Printf("A request has been made to import an encrypted keyfile\n") + fmt.Printf("raw data: \n%q\n", request.Rawdata) + fmt.Printf("data hash: %v\n", request.Hash) fmt.Printf("-------------------------------------------\n") showMetadata(request.Meta) if !ui.confirm() { - return ImportResponse{false, "", ""}, nil + return SignDataResponse{false}, nil } - return ImportResponse{true, ui.readPasswordText("Old password"), ui.readPasswordText("New password")}, nil + return SignDataResponse{true}, nil } // ApproveListing prompt the user for confirmation to list accounts // the list of accounts to list can be modified by the UI func (ui *CommandlineUI) ApproveListing(request *ListRequest) (ListResponse, error) { - ui.mu.Lock() defer ui.mu.Unlock() @@ -220,7 +167,6 @@ func (ui *CommandlineUI) ApproveListing(request *ListRequest) (ListResponse, err for _, account := range request.Accounts { fmt.Printf(" [x] %v\n", account.Address.Hex()) fmt.Printf(" URL: %v\n", account.URL) - fmt.Printf(" Type: %v\n", account.Typ) } fmt.Printf("-------------------------------------------\n") showMetadata(request.Meta) @@ -242,26 +188,29 @@ func (ui *CommandlineUI) ApproveNewAccount(request *NewAccountRequest) (NewAccou fmt.Printf("and the address is returned to the external caller\n\n") showMetadata(request.Meta) if !ui.confirm() { - return NewAccountResponse{false, ""}, nil + return NewAccountResponse{false}, nil } - return NewAccountResponse{true, ui.readPassword()}, nil + return NewAccountResponse{true}, nil } // ShowError displays error message to user func (ui *CommandlineUI) ShowError(message string) { - fmt.Printf("-------- Error message from Clef-----------\n") - fmt.Println(message) + fmt.Printf("## Error \n%s\n", message) fmt.Printf("-------------------------------------------\n") } // ShowInfo displays info message to user func (ui *CommandlineUI) ShowInfo(message string) { - fmt.Printf("Info: %v\n", message) + fmt.Printf("## Info \n%s\n", message) } func (ui *CommandlineUI) OnApprovedTx(tx ethapi.SignTransactionResult) { fmt.Printf("Transaction signed:\n ") - spew.Dump(tx.Tx) + if jsn, err := json.MarshalIndent(tx.Tx, " ", " "); err != nil { + fmt.Printf("WARN: marshalling error %v\n", err) + } else { + fmt.Println(string(jsn)) + } } func (ui *CommandlineUI) OnSignerStartup(info StartupInfo) { diff --git a/signer/core/signed_data.go b/signer/core/signed_data.go new file mode 100644 index 000000000000..f512be7ceaec --- /dev/null +++ b/signer/core/signed_data.go @@ -0,0 +1,1002 @@ +// Copyright 2019 The go-ethereum Authors +// This file is part of the go-ethereum library. +// +// The go-ethereum library is free software: you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// The go-ethereum library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . + +package core + +import ( + "bytes" + "context" + "errors" + "fmt" + "math/big" + "mime" + "reflect" + "regexp" + "sort" + "strconv" + "strings" + "unicode" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus/clique" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/rlp" +) + +type SigFormat struct { + Mime string + ByteVersion byte +} + +var ( + IntendedValidator = SigFormat{ + accounts.MimetypeDataWithValidator, + 0x00, + } + DataTyped = SigFormat{ + accounts.MimetypeTypedData, + 0x01, + } + ApplicationClique = SigFormat{ + accounts.MimetypeClique, + 0x02, + } + TextPlain = SigFormat{ + accounts.MimetypeTextPlain, + 0x45, + } +) + +type ValidatorData struct { + Address common.Address + Message hexutil.Bytes +} + +type TypedData struct { + Types Types `json:"types"` + PrimaryType string `json:"primaryType"` + Domain TypedDataDomain `json:"domain"` + Message TypedDataMessage `json:"message"` +} + +type Type struct { + Name string `json:"name"` + Type string `json:"type"` +} + +func (t *Type) isArray() bool { + return strings.HasSuffix(t.Type, "[]") +} + +// typeName returns the canonical name of the type. If the type is 'Person[]', then +// this method returns 'Person' +func (t *Type) typeName() string { + if strings.HasSuffix(t.Type, "[]") { + return strings.TrimSuffix(t.Type, "[]") + } + return t.Type +} + +func (t *Type) isReferenceType() bool { + if len(t.Type) == 0 { + return false + } + // Reference types must have a leading uppercase characer + return unicode.IsUpper([]rune(t.Type)[0]) +} + +type Types map[string][]Type + +type TypePriority struct { + Type string + Value uint +} + +type TypedDataMessage = map[string]interface{} + +type TypedDataDomain struct { + Name string `json:"name"` + Version string `json:"version"` + ChainId *math.HexOrDecimal256 `json:"chainId"` + VerifyingContract string `json:"verifyingContract"` + Salt string `json:"salt"` +} + +var typedDataReferenceTypeRegexp = regexp.MustCompile(`^[A-Z](\w*)(\[\])?$`) + +// sign receives a request and produces a signature +// +// Note, the produced signature conforms to the secp256k1 curve R, S and V values, +// where the V value will be 27 or 28 for legacy reasons, if legacyV==true. +func (api *SignerAPI) sign(addr common.MixedcaseAddress, req *SignDataRequest, legacyV bool) (hexutil.Bytes, error) { + // We make the request prior to looking up if we actually have the account, to prevent + // account-enumeration via the API + res, err := api.UI.ApproveSignData(req) + if err != nil { + return nil, err + } + if !res.Approved { + return nil, ErrRequestDenied + } + // Look up the wallet containing the requested signer + account := accounts.Account{Address: addr.Address()} + wallet, err := api.am.Find(account) + if err != nil { + return nil, err + } + pw, err := api.lookupOrQueryPassword(account.Address, + "Password for signing", + fmt.Sprintf("Please enter password for signing data with account %s", account.Address.Hex())) + if err != nil { + return nil, err + } + // Sign the data with the wallet + signature, err := wallet.SignDataWithPassphrase(account, pw, req.ContentType, req.Rawdata) + if err != nil { + return nil, err + } + if legacyV { + signature[64] += 27 // Transform V from 0/1 to 27/28 according to the yellow paper + } + return signature, nil +} + +// SignData signs the hash of the provided data, but does so differently +// depending on the content-type specified. +// +// Different types of validation occur. +func (api *SignerAPI) SignData(ctx context.Context, contentType string, addr common.MixedcaseAddress, data interface{}) (hexutil.Bytes, error) { + var req, transformV, err = api.determineSignatureFormat(ctx, contentType, addr, data) + if err != nil { + return nil, err + } + signature, err := api.sign(addr, req, transformV) + if err != nil { + api.UI.ShowError(err.Error()) + return nil, err + } + return signature, nil +} + +// determineSignatureFormat determines which signature method should be used based upon the mime type +// In the cases where it matters ensure that the charset is handled. The charset +// resides in the 'params' returned as the second returnvalue from mime.ParseMediaType +// charset, ok := params["charset"] +// As it is now, we accept any charset and just treat it as 'raw'. +// This method returns the mimetype for signing along with the request +func (api *SignerAPI) determineSignatureFormat(ctx context.Context, contentType string, addr common.MixedcaseAddress, data interface{}) (*SignDataRequest, bool, error) { + var ( + req *SignDataRequest + useEthereumV = true // Default to use V = 27 or 28, the legacy Ethereum format + ) + mediaType, _, err := mime.ParseMediaType(contentType) + if err != nil { + return nil, useEthereumV, err + } + + switch mediaType { + case IntendedValidator.Mime: + // Data with an intended validator + validatorData, err := UnmarshalValidatorData(data) + if err != nil { + return nil, useEthereumV, err + } + sighash, msg := SignTextValidator(validatorData) + messages := []*NameValueType{ + { + Name: "This is a request to sign data intended for a particular validator (see EIP 191 version 0)", + Typ: "description", + Value: "", + }, + { + Name: "Intended validator address", + Typ: "address", + Value: validatorData.Address.String(), + }, + { + Name: "Application-specific data", + Typ: "hexdata", + Value: validatorData.Message, + }, + { + Name: "Full message for signing", + Typ: "hexdata", + Value: fmt.Sprintf("0x%x", msg), + }, + } + req = &SignDataRequest{ContentType: mediaType, Rawdata: []byte(msg), Messages: messages, Hash: sighash} + case ApplicationClique.Mime: + // Clique is the Ethereum PoA standard + stringData, ok := data.(string) + if !ok { + return nil, useEthereumV, fmt.Errorf("input for %v must be an hex-encoded string", ApplicationClique.Mime) + } + cliqueData, err := hexutil.Decode(stringData) + if err != nil { + return nil, useEthereumV, err + } + header := &types.Header{} + if err := rlp.DecodeBytes(cliqueData, header); err != nil { + return nil, useEthereumV, err + } + // The incoming clique header is already truncated, sent to us with a extradata already shortened + if len(header.Extra) < 65 { + // Need to add it back, to get a suitable length for hashing + newExtra := make([]byte, len(header.Extra)+65) + copy(newExtra, header.Extra) + header.Extra = newExtra + } + // Get back the rlp data, encoded by us + sighash, cliqueRlp, err := cliqueHeaderHashAndRlp(header) + if err != nil { + return nil, useEthereumV, err + } + messages := []*NameValueType{ + { + Name: "Clique header", + Typ: "clique", + Value: fmt.Sprintf("clique header %d [0x%x]", header.Number, header.Hash()), + }, + } + // Clique uses V on the form 0 or 1 + useEthereumV = false + req = &SignDataRequest{ContentType: mediaType, Rawdata: cliqueRlp, Messages: messages, Hash: sighash} + default: // also case TextPlain.Mime: + // Calculates an Ethereum ECDSA signature for: + // hash = keccak256("\x19${byteVersion}Ethereum Signed Message:\n${message length}${message}") + // We expect it to be a string + if stringData, ok := data.(string); !ok { + return nil, useEthereumV, fmt.Errorf("input for text/plain must be an hex-encoded string") + } else { + if textData, err := hexutil.Decode(stringData); err != nil { + return nil, useEthereumV, err + } else { + sighash, msg := accounts.TextAndHash(textData) + messages := []*NameValueType{ + { + Name: "message", + Typ: accounts.MimetypeTextPlain, + Value: msg, + }, + } + req = &SignDataRequest{ContentType: mediaType, Rawdata: []byte(msg), Messages: messages, Hash: sighash} + } + } + } + req.Address = addr + req.Meta = MetadataFromContext(ctx) + return req, useEthereumV, nil +} + +// SignTextWithValidator signs the given message which can be further recovered +// with the given validator. +// hash = keccak256("\x19\x00"${address}${data}). +func SignTextValidator(validatorData ValidatorData) (hexutil.Bytes, string) { + msg := fmt.Sprintf("\x19\x00%s%s", string(validatorData.Address.Bytes()), string(validatorData.Message)) + return crypto.Keccak256([]byte(msg)), msg +} + +// cliqueHeaderHashAndRlp returns the hash which is used as input for the proof-of-authority +// signing. It is the hash of the entire header apart from the 65 byte signature +// contained at the end of the extra data. +// +// The method requires the extra data to be at least 65 bytes -- the original implementation +// in clique.go panics if this is the case, thus it's been reimplemented here to avoid the panic +// and simply return an error instead +func cliqueHeaderHashAndRlp(header *types.Header) (hash, rlp []byte, err error) { + if len(header.Extra) < 65 { + err = fmt.Errorf("clique header extradata too short, %d < 65", len(header.Extra)) + return + } + rlp = clique.CliqueRLP(header) + hash = clique.SealHash(header).Bytes() + return hash, rlp, err +} + +// SignTypedData signs EIP-712 conformant typed data +// hash = keccak256("\x19${byteVersion}${domainSeparator}${hashStruct(message)}") +func (api *SignerAPI) SignTypedData(ctx context.Context, addr common.MixedcaseAddress, typedData TypedData) (hexutil.Bytes, error) { + domainSeparator, err := typedData.HashStruct("EIP712Domain", typedData.Domain.Map()) + if err != nil { + return nil, err + } + typedDataHash, err := typedData.HashStruct(typedData.PrimaryType, typedData.Message) + if err != nil { + return nil, err + } + rawData := []byte(fmt.Sprintf("\x19\x01%s%s", string(domainSeparator), string(typedDataHash))) + sighash := crypto.Keccak256(rawData) + messages, err := typedData.Format() + if err != nil { + return nil, err + } + req := &SignDataRequest{ContentType: DataTyped.Mime, Rawdata: rawData, Messages: messages, Hash: sighash} + signature, err := api.sign(addr, req, true) + if err != nil { + api.UI.ShowError(err.Error()) + return nil, err + } + return signature, nil +} + +// HashStruct generates a keccak256 hash of the encoding of the provided data +func (typedData *TypedData) HashStruct(primaryType string, data TypedDataMessage) (hexutil.Bytes, error) { + encodedData, err := typedData.EncodeData(primaryType, data, 1) + if err != nil { + return nil, err + } + return crypto.Keccak256(encodedData), nil +} + +// Dependencies returns an array of custom types ordered by their hierarchical reference tree +func (typedData *TypedData) Dependencies(primaryType string, found []string) []string { + includes := func(arr []string, str string) bool { + for _, obj := range arr { + if obj == str { + return true + } + } + return false + } + + if includes(found, primaryType) { + return found + } + if typedData.Types[primaryType] == nil { + return found + } + found = append(found, primaryType) + for _, field := range typedData.Types[primaryType] { + for _, dep := range typedData.Dependencies(field.Type, found) { + if !includes(found, dep) { + found = append(found, dep) + } + } + } + return found +} + +// EncodeType generates the following encoding: +// `name ‖ "(" ‖ member₁ ‖ "," ‖ member₂ ‖ "," ‖ … ‖ memberₙ ")"` +// +// each member is written as `type ‖ " " ‖ name` encodings cascade down and are sorted by name +func (typedData *TypedData) EncodeType(primaryType string) hexutil.Bytes { + // Get dependencies primary first, then alphabetical + deps := typedData.Dependencies(primaryType, []string{}) + if len(deps) > 0 { + slicedDeps := deps[1:] + sort.Strings(slicedDeps) + deps = append([]string{primaryType}, slicedDeps...) + } + + // Format as a string with fields + var buffer bytes.Buffer + for _, dep := range deps { + buffer.WriteString(dep) + buffer.WriteString("(") + for _, obj := range typedData.Types[dep] { + buffer.WriteString(obj.Type) + buffer.WriteString(" ") + buffer.WriteString(obj.Name) + buffer.WriteString(",") + } + buffer.Truncate(buffer.Len() - 1) + buffer.WriteString(")") + } + return buffer.Bytes() +} + +// TypeHash creates the keccak256 hash of the data +func (typedData *TypedData) TypeHash(primaryType string) hexutil.Bytes { + return crypto.Keccak256(typedData.EncodeType(primaryType)) +} + +// EncodeData generates the following encoding: +// `enc(value₁) ‖ enc(value₂) ‖ … ‖ enc(valueₙ)` +// +// each encoded member is 32-byte long +func (typedData *TypedData) EncodeData(primaryType string, data map[string]interface{}, depth int) (hexutil.Bytes, error) { + if err := typedData.validate(); err != nil { + return nil, err + } + + buffer := bytes.Buffer{} + + // Verify extra data + if len(typedData.Types[primaryType]) < len(data) { + return nil, errors.New("there is extra data provided in the message") + } + + // Add typehash + buffer.Write(typedData.TypeHash(primaryType)) + + // Add field contents. Structs and arrays have special handlers. + for _, field := range typedData.Types[primaryType] { + encType := field.Type + encValue := data[field.Name] + if encType[len(encType)-1:] == "]" { + arrayValue, ok := encValue.([]interface{}) + if !ok { + return nil, dataMismatchError(encType, encValue) + } + + arrayBuffer := bytes.Buffer{} + parsedType := strings.Split(encType, "[")[0] + for _, item := range arrayValue { + if typedData.Types[parsedType] != nil { + mapValue, ok := item.(map[string]interface{}) + if !ok { + return nil, dataMismatchError(parsedType, item) + } + encodedData, err := typedData.EncodeData(parsedType, mapValue, depth+1) + if err != nil { + return nil, err + } + arrayBuffer.Write(encodedData) + } else { + bytesValue, err := typedData.EncodePrimitiveValue(parsedType, item, depth) + if err != nil { + return nil, err + } + arrayBuffer.Write(bytesValue) + } + } + + buffer.Write(crypto.Keccak256(arrayBuffer.Bytes())) + } else if typedData.Types[field.Type] != nil { + mapValue, ok := encValue.(map[string]interface{}) + if !ok { + return nil, dataMismatchError(encType, encValue) + } + encodedData, err := typedData.EncodeData(field.Type, mapValue, depth+1) + if err != nil { + return nil, err + } + buffer.Write(crypto.Keccak256(encodedData)) + } else { + byteValue, err := typedData.EncodePrimitiveValue(encType, encValue, depth) + if err != nil { + return nil, err + } + buffer.Write(byteValue) + } + } + return buffer.Bytes(), nil +} + +func parseInteger(encType string, encValue interface{}) (*big.Int, error) { + var ( + length int + signed = strings.HasPrefix(encType, "int") + b *big.Int + ) + if encType == "int" || encType == "uint" { + length = 256 + } else { + lengthStr := "" + if strings.HasPrefix(encType, "uint") { + lengthStr = strings.TrimPrefix(encType, "uint") + } else { + lengthStr = strings.TrimPrefix(encType, "int") + } + atoiSize, err := strconv.Atoi(lengthStr) + if err != nil { + return nil, fmt.Errorf("invalid size on integer: %v", lengthStr) + } + length = atoiSize + } + switch v := encValue.(type) { + case *math.HexOrDecimal256: + b = (*big.Int)(v) + case string: + var hexIntValue math.HexOrDecimal256 + if err := hexIntValue.UnmarshalText([]byte(v)); err != nil { + return nil, err + } + b = (*big.Int)(&hexIntValue) + case float64: + // JSON parses non-strings as float64. Fail if we cannot + // convert it losslessly + if float64(int64(v)) == v { + b = big.NewInt(int64(v)) + } else { + return nil, fmt.Errorf("invalid float value %v for type %v", v, encType) + } + } + if b == nil { + return nil, fmt.Errorf("invalid integer value %v/%v for type %v", encValue, reflect.TypeOf(encValue), encType) + } + if b.BitLen() > length { + return nil, fmt.Errorf("integer larger than '%v'", encType) + } + if !signed && b.Sign() == -1 { + return nil, fmt.Errorf("invalid negative value for unsigned type %v", encType) + } + return b, nil +} + +// EncodePrimitiveValue deals with the primitive values found +// while searching through the typed data +func (typedData *TypedData) EncodePrimitiveValue(encType string, encValue interface{}, depth int) ([]byte, error) { + switch encType { + case "address": + stringValue, ok := encValue.(string) + if !ok || !common.IsHexAddress(stringValue) { + return nil, dataMismatchError(encType, encValue) + } + retval := make([]byte, 32) + copy(retval[12:], common.HexToAddress(stringValue).Bytes()) + return retval, nil + case "bool": + boolValue, ok := encValue.(bool) + if !ok { + return nil, dataMismatchError(encType, encValue) + } + if boolValue { + return math.PaddedBigBytes(common.Big1, 32), nil + } + return math.PaddedBigBytes(common.Big0, 32), nil + case "string": + strVal, ok := encValue.(string) + if !ok { + return nil, dataMismatchError(encType, encValue) + } + return crypto.Keccak256([]byte(strVal)), nil + case "bytes": + bytesValue, ok := encValue.([]byte) + if !ok { + return nil, dataMismatchError(encType, encValue) + } + return crypto.Keccak256(bytesValue), nil + } + if strings.HasPrefix(encType, "bytes") { + lengthStr := strings.TrimPrefix(encType, "bytes") + length, err := strconv.Atoi(lengthStr) + if err != nil { + return nil, fmt.Errorf("invalid size on bytes: %v", lengthStr) + } + if length < 0 || length > 32 { + return nil, fmt.Errorf("invalid size on bytes: %d", length) + } + if byteValue, ok := encValue.(hexutil.Bytes); !ok { + return nil, dataMismatchError(encType, encValue) + } else { + return math.PaddedBigBytes(new(big.Int).SetBytes(byteValue), 32), nil + } + } + if strings.HasPrefix(encType, "int") || strings.HasPrefix(encType, "uint") { + b, err := parseInteger(encType, encValue) + if err != nil { + return nil, err + } + return abi.U256(b), nil + } + return nil, fmt.Errorf("unrecognized type '%s'", encType) + +} + +// dataMismatchError generates an error for a mismatch between +// the provided type and data +func dataMismatchError(encType string, encValue interface{}) error { + return fmt.Errorf("provided data '%v' doesn't match type '%s'", encValue, encType) +} + +// EcRecover recovers the address associated with the given sig. +// Only compatible with `text/plain` +func (api *SignerAPI) EcRecover(ctx context.Context, data hexutil.Bytes, sig hexutil.Bytes) (common.Address, error) { + // Returns the address for the Account that was used to create the signature. + // + // Note, this function is compatible with eth_sign and personal_sign. As such it recovers + // the address of: + // hash = keccak256("\x19${byteVersion}Ethereum Signed Message:\n${message length}${message}") + // addr = ecrecover(hash, signature) + // + // Note, the signature must conform to the secp256k1 curve R, S and V values, where + // the V value must be be 27 or 28 for legacy reasons. + // + // https://github.com/ethereum/go-ethereum/wiki/Management-APIs#personal_ecRecover + if len(sig) != 65 { + return common.Address{}, fmt.Errorf("signature must be 65 bytes long") + } + if sig[64] != 27 && sig[64] != 28 { + return common.Address{}, fmt.Errorf("invalid Ethereum signature (V is not 27 or 28)") + } + sig[64] -= 27 // Transform yellow paper V from 27/28 to 0/1 + hash := accounts.TextHash(data) + rpk, err := crypto.SigToPub(hash, sig) + if err != nil { + return common.Address{}, err + } + return crypto.PubkeyToAddress(*rpk), nil +} + +// UnmarshalValidatorData converts the bytes input to typed data +func UnmarshalValidatorData(data interface{}) (ValidatorData, error) { + raw, ok := data.(map[string]interface{}) + if !ok { + return ValidatorData{}, errors.New("validator input is not a map[string]interface{}") + } + addr, ok := raw["address"].(string) + if !ok { + return ValidatorData{}, errors.New("validator address is not sent as a string") + } + addrBytes, err := hexutil.Decode(addr) + if err != nil { + return ValidatorData{}, err + } + if !ok || len(addrBytes) == 0 { + return ValidatorData{}, errors.New("validator address is undefined") + } + + message, ok := raw["message"].(string) + if !ok { + return ValidatorData{}, errors.New("message is not sent as a string") + } + messageBytes, err := hexutil.Decode(message) + if err != nil { + return ValidatorData{}, err + } + if !ok || len(messageBytes) == 0 { + return ValidatorData{}, errors.New("message is undefined") + } + + return ValidatorData{ + Address: common.BytesToAddress(addrBytes), + Message: messageBytes, + }, nil +} + +// validate makes sure the types are sound +func (typedData *TypedData) validate() error { + if err := typedData.Types.validate(); err != nil { + return err + } + if err := typedData.Domain.validate(); err != nil { + return err + } + return nil +} + +// Map generates a map version of the typed data +func (typedData *TypedData) Map() map[string]interface{} { + dataMap := map[string]interface{}{ + "types": typedData.Types, + "domain": typedData.Domain.Map(), + "primaryType": typedData.PrimaryType, + "message": typedData.Message, + } + return dataMap +} + +// Format returns a representation of typedData, which can be easily displayed by a user-interface +// without in-depth knowledge about 712 rules +func (typedData *TypedData) Format() ([]*NameValueType, error) { + domain, err := typedData.formatData("EIP712Domain", typedData.Domain.Map()) + if err != nil { + return nil, err + } + ptype, err := typedData.formatData(typedData.PrimaryType, typedData.Message) + if err != nil { + return nil, err + } + var nvts []*NameValueType + nvts = append(nvts, &NameValueType{ + Name: "EIP712Domain", + Value: domain, + Typ: "domain", + }) + nvts = append(nvts, &NameValueType{ + Name: typedData.PrimaryType, + Value: ptype, + Typ: "primary type", + }) + return nvts, nil +} + +func (typedData *TypedData) formatData(primaryType string, data map[string]interface{}) ([]*NameValueType, error) { + var output []*NameValueType + + // Add field contents. Structs and arrays have special handlers. + for _, field := range typedData.Types[primaryType] { + encName := field.Name + encValue := data[encName] + item := &NameValueType{ + Name: encName, + Typ: field.Type, + } + if field.isArray() { + arrayValue, _ := encValue.([]interface{}) + parsedType := field.typeName() + for _, v := range arrayValue { + if typedData.Types[parsedType] != nil { + mapValue, _ := v.(map[string]interface{}) + mapOutput, err := typedData.formatData(parsedType, mapValue) + if err != nil { + return nil, err + } + item.Value = mapOutput + } else { + primitiveOutput, err := formatPrimitiveValue(field.Type, encValue) + if err != nil { + return nil, err + } + item.Value = primitiveOutput + } + } + } else if typedData.Types[field.Type] != nil { + if mapValue, ok := encValue.(map[string]interface{}); ok { + mapOutput, err := typedData.formatData(field.Type, mapValue) + if err != nil { + return nil, err + } + item.Value = mapOutput + } else { + item.Value = "" + } + } else { + primitiveOutput, err := formatPrimitiveValue(field.Type, encValue) + if err != nil { + return nil, err + } + item.Value = primitiveOutput + } + output = append(output, item) + } + return output, nil +} + +func formatPrimitiveValue(encType string, encValue interface{}) (string, error) { + switch encType { + case "address": + if stringValue, ok := encValue.(string); !ok { + return "", fmt.Errorf("could not format value %v as address", encValue) + } else { + return common.HexToAddress(stringValue).String(), nil + } + case "bool": + if boolValue, ok := encValue.(bool); !ok { + return "", fmt.Errorf("could not format value %v as bool", encValue) + } else { + return fmt.Sprintf("%t", boolValue), nil + } + case "bytes", "string": + return fmt.Sprintf("%s", encValue), nil + } + if strings.HasPrefix(encType, "bytes") { + return fmt.Sprintf("%s", encValue), nil + + } + if strings.HasPrefix(encType, "uint") || strings.HasPrefix(encType, "int") { + if b, err := parseInteger(encType, encValue); err != nil { + return "", err + } else { + return fmt.Sprintf("%d (0x%x)", b, b), nil + } + } + return "", fmt.Errorf("unhandled type %v", encType) +} + +// NameValueType is a very simple struct with Name, Value and Type. It's meant for simple +// json structures used to communicate signing-info about typed data with the UI +type NameValueType struct { + Name string `json:"name"` + Value interface{} `json:"value"` + Typ string `json:"type"` +} + +// Pprint returns a pretty-printed version of nvt +func (nvt *NameValueType) Pprint(depth int) string { + output := bytes.Buffer{} + output.WriteString(strings.Repeat("\u00a0", depth*2)) + output.WriteString(fmt.Sprintf("%s [%s]: ", nvt.Name, nvt.Typ)) + if nvts, ok := nvt.Value.([]*NameValueType); ok { + output.WriteString("\n") + for _, next := range nvts { + sublevel := next.Pprint(depth + 1) + output.WriteString(sublevel) + } + } else { + output.WriteString(fmt.Sprintf("%q\n", nvt.Value)) + } + return output.String() +} + +// Validate checks if the types object is conformant to the specs +func (t Types) validate() error { + for typeKey, typeArr := range t { + if len(typeKey) == 0 { + return fmt.Errorf("empty type key") + } + for i, typeObj := range typeArr { + if len(typeObj.Type) == 0 { + return fmt.Errorf("type %v:%d: empty Type", typeKey, i) + } + if len(typeObj.Name) == 0 { + return fmt.Errorf("type %v:%d: empty Name", typeKey, i) + } + if typeKey == typeObj.Type { + return fmt.Errorf("type '%s' cannot reference itself", typeObj.Type) + } + if typeObj.isReferenceType() { + if _, exist := t[typeObj.typeName()]; !exist { + return fmt.Errorf("reference type '%s' is undefined", typeObj.Type) + } + if !typedDataReferenceTypeRegexp.MatchString(typeObj.Type) { + return fmt.Errorf("unknown reference type '%s", typeObj.Type) + } + } else if !isPrimitiveTypeValid(typeObj.Type) { + return fmt.Errorf("unknown type '%s'", typeObj.Type) + } + } + } + return nil +} + +// Checks if the primitive value is valid +func isPrimitiveTypeValid(primitiveType string) bool { + if primitiveType == "address" || + primitiveType == "address[]" || + primitiveType == "bool" || + primitiveType == "bool[]" || + primitiveType == "string" || + primitiveType == "string[]" { + return true + } + if primitiveType == "bytes" || + primitiveType == "bytes[]" || + primitiveType == "bytes1" || + primitiveType == "bytes1[]" || + primitiveType == "bytes2" || + primitiveType == "bytes2[]" || + primitiveType == "bytes3" || + primitiveType == "bytes3[]" || + primitiveType == "bytes4" || + primitiveType == "bytes4[]" || + primitiveType == "bytes5" || + primitiveType == "bytes5[]" || + primitiveType == "bytes6" || + primitiveType == "bytes6[]" || + primitiveType == "bytes7" || + primitiveType == "bytes7[]" || + primitiveType == "bytes8" || + primitiveType == "bytes8[]" || + primitiveType == "bytes9" || + primitiveType == "bytes9[]" || + primitiveType == "bytes10" || + primitiveType == "bytes10[]" || + primitiveType == "bytes11" || + primitiveType == "bytes11[]" || + primitiveType == "bytes12" || + primitiveType == "bytes12[]" || + primitiveType == "bytes13" || + primitiveType == "bytes13[]" || + primitiveType == "bytes14" || + primitiveType == "bytes14[]" || + primitiveType == "bytes15" || + primitiveType == "bytes15[]" || + primitiveType == "bytes16" || + primitiveType == "bytes16[]" || + primitiveType == "bytes17" || + primitiveType == "bytes17[]" || + primitiveType == "bytes18" || + primitiveType == "bytes18[]" || + primitiveType == "bytes19" || + primitiveType == "bytes19[]" || + primitiveType == "bytes20" || + primitiveType == "bytes20[]" || + primitiveType == "bytes21" || + primitiveType == "bytes21[]" || + primitiveType == "bytes22" || + primitiveType == "bytes22[]" || + primitiveType == "bytes23" || + primitiveType == "bytes23[]" || + primitiveType == "bytes24" || + primitiveType == "bytes24[]" || + primitiveType == "bytes25" || + primitiveType == "bytes25[]" || + primitiveType == "bytes26" || + primitiveType == "bytes26[]" || + primitiveType == "bytes27" || + primitiveType == "bytes27[]" || + primitiveType == "bytes28" || + primitiveType == "bytes28[]" || + primitiveType == "bytes29" || + primitiveType == "bytes29[]" || + primitiveType == "bytes30" || + primitiveType == "bytes30[]" || + primitiveType == "bytes31" || + primitiveType == "bytes31[]" { + return true + } + if primitiveType == "int" || + primitiveType == "int[]" || + primitiveType == "int8" || + primitiveType == "int8[]" || + primitiveType == "int16" || + primitiveType == "int16[]" || + primitiveType == "int32" || + primitiveType == "int32[]" || + primitiveType == "int64" || + primitiveType == "int64[]" || + primitiveType == "int128" || + primitiveType == "int128[]" || + primitiveType == "int256" || + primitiveType == "int256[]" { + return true + } + if primitiveType == "uint" || + primitiveType == "uint[]" || + primitiveType == "uint8" || + primitiveType == "uint8[]" || + primitiveType == "uint16" || + primitiveType == "uint16[]" || + primitiveType == "uint32" || + primitiveType == "uint32[]" || + primitiveType == "uint64" || + primitiveType == "uint64[]" || + primitiveType == "uint128" || + primitiveType == "uint128[]" || + primitiveType == "uint256" || + primitiveType == "uint256[]" { + return true + } + return false +} + +// validate checks if the given domain is valid, i.e. contains at least +// the minimum viable keys and values +func (domain *TypedDataDomain) validate() error { + if domain.ChainId == nil { + return errors.New("chainId must be specified according to EIP-155") + } + + if len(domain.Name) == 0 && len(domain.Version) == 0 && len(domain.VerifyingContract) == 0 && len(domain.Salt) == 0 { + return errors.New("domain is undefined") + } + + return nil +} + +// Map is a helper function to generate a map version of the domain +func (domain *TypedDataDomain) Map() map[string]interface{} { + dataMap := map[string]interface{}{} + + if domain.ChainId != nil { + dataMap["chainId"] = domain.ChainId + } + + if len(domain.Name) > 0 { + dataMap["name"] = domain.Name + } + + if len(domain.Version) > 0 { + dataMap["version"] = domain.Version + } + + if len(domain.VerifyingContract) > 0 { + dataMap["verifyingContract"] = domain.VerifyingContract + } + + if len(domain.Salt) > 0 { + dataMap["salt"] = domain.Salt + } + return dataMap +} diff --git a/signer/core/signed_data_internal_test.go b/signer/core/signed_data_internal_test.go new file mode 100644 index 000000000000..0d59fcfca893 --- /dev/null +++ b/signer/core/signed_data_internal_test.go @@ -0,0 +1,51 @@ +// Copyright 2019 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 ( + "math/big" + "testing" +) + +func TestParseInteger(t *testing.T) { + for i, tt := range []struct { + t string + v interface{} + exp *big.Int + }{ + {"uint32", "-123", nil}, + {"int32", "-123", big.NewInt(-123)}, + {"uint32", "0xff", big.NewInt(0xff)}, + {"int8", "0xffff", nil}, + } { + res, err := parseInteger(tt.t, tt.v) + if tt.exp == nil && res == nil { + continue + } + if tt.exp == nil && res != nil { + t.Errorf("test %d, got %v, expected nil", i, res) + continue + } + if tt.exp != nil && res == nil { + t.Errorf("test %d, got '%v', expected %v", i, err, tt.exp) + continue + } + if tt.exp.Cmp(res) != 0 { + t.Errorf("test %d, got %v expected %v", i, res, tt.exp) + } + } +} diff --git a/signer/core/signed_data_test.go b/signer/core/signed_data_test.go new file mode 100644 index 000000000000..e5f478089040 --- /dev/null +++ b/signer/core/signed_data_test.go @@ -0,0 +1,408 @@ +// Copyright 2019 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_test + +import ( + "context" + "encoding/json" + "fmt" + "io/ioutil" + "path" + "strings" + "testing" + + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/signer/core" +) + +var typesStandard = core.Types{ + "EIP712Domain": { + { + Name: "name", + Type: "string", + }, + { + Name: "version", + Type: "string", + }, + { + Name: "chainId", + Type: "uint256", + }, + { + Name: "verifyingContract", + Type: "address", + }, + }, + "Person": { + { + Name: "name", + Type: "string", + }, + { + Name: "wallet", + Type: "address", + }, + }, + "Mail": { + { + Name: "from", + Type: "Person", + }, + { + Name: "to", + Type: "Person", + }, + { + Name: "contents", + Type: "string", + }, + }, +} + +var jsonTypedData = ` + { + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "test", + "type": "uint8" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "test": 3, + "wallet": "0xcD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } + } +` + +const primaryType = "Mail" + +var domainStandard = core.TypedDataDomain{ + "Ether Mail", + "1", + math.NewHexOrDecimal256(1), + "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC", + "", +} + +var messageStandard = map[string]interface{}{ + "from": map[string]interface{}{ + "name": "Cow", + "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826", + }, + "to": map[string]interface{}{ + "name": "Bob", + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB", + }, + "contents": "Hello, Bob!", +} + +var typedData = core.TypedData{ + Types: typesStandard, + PrimaryType: primaryType, + Domain: domainStandard, + Message: messageStandard, +} + +func TestSignData(t *testing.T) { + api, control := setup(t) + //Create two accounts + createAccount(control, api, t) + createAccount(control, api, t) + control.approveCh <- "1" + list, err := api.List(context.Background()) + if err != nil { + t.Fatal(err) + } + a := common.NewMixedcaseAddress(list[0]) + + control.approveCh <- "Y" + control.inputCh <- "wrongpassword" + signature, err := api.SignData(context.Background(), core.TextPlain.Mime, a, hexutil.Encode([]byte("EHLO world"))) + if signature != nil { + t.Errorf("Expected nil-data, got %x", signature) + } + if err != keystore.ErrDecrypt { + t.Errorf("Expected ErrLocked! '%v'", err) + } + control.approveCh <- "No way" + signature, err = api.SignData(context.Background(), core.TextPlain.Mime, a, hexutil.Encode([]byte("EHLO world"))) + if signature != nil { + t.Errorf("Expected nil-data, got %x", signature) + } + if err != core.ErrRequestDenied { + t.Errorf("Expected ErrRequestDenied! '%v'", err) + } + // text/plain + control.approveCh <- "Y" + control.inputCh <- "a_long_password" + signature, err = api.SignData(context.Background(), core.TextPlain.Mime, a, hexutil.Encode([]byte("EHLO world"))) + if err != nil { + t.Fatal(err) + } + if signature == nil || len(signature) != 65 { + t.Errorf("Expected 65 byte signature (got %d bytes)", len(signature)) + } + // data/typed + control.approveCh <- "Y" + control.inputCh <- "a_long_password" + signature, err = api.SignTypedData(context.Background(), a, typedData) + if err != nil { + t.Fatal(err) + } + if signature == nil || len(signature) != 65 { + t.Errorf("Expected 65 byte signature (got %d bytes)", len(signature)) + } +} + +func TestDomainChainId(t *testing.T) { + withoutChainID := core.TypedData{ + Types: core.Types{ + "EIP712Domain": []core.Type{ + {Name: "name", Type: "string"}, + }, + }, + Domain: core.TypedDataDomain{ + Name: "test", + }, + } + + if _, ok := withoutChainID.Domain.Map()["chainId"]; ok { + t.Errorf("Expected the chainId key to not be present in the domain map") + } + withChainID := core.TypedData{ + Types: core.Types{ + "EIP712Domain": []core.Type{ + {Name: "name", Type: "string"}, + {Name: "chainId", Type: "uint256"}, + }, + }, + Domain: core.TypedDataDomain{ + Name: "test", + ChainId: math.NewHexOrDecimal256(1), + }, + } + + if _, ok := withChainID.Domain.Map()["chainId"]; !ok { + t.Errorf("Expected the chainId key be present in the domain map") + } +} + +func TestHashStruct(t *testing.T) { + hash, err := typedData.HashStruct(typedData.PrimaryType, typedData.Message) + if err != nil { + t.Fatal(err) + } + mainHash := fmt.Sprintf("0x%s", common.Bytes2Hex(hash)) + if mainHash != "0xc52c0ee5d84264471806290a3f2c4cecfc5490626bf912d01f240d7a274b371e" { + t.Errorf("Expected different hashStruct result (got %s)", mainHash) + } + + hash, err = typedData.HashStruct("EIP712Domain", typedData.Domain.Map()) + if err != nil { + t.Error(err) + } + domainHash := fmt.Sprintf("0x%s", common.Bytes2Hex(hash)) + if domainHash != "0xf2cee375fa42b42143804025fc449deafd50cc031ca257e0b194a650a912090f" { + t.Errorf("Expected different domain hashStruct result (got %s)", domainHash) + } +} + +func TestEncodeType(t *testing.T) { + domainTypeEncoding := string(typedData.EncodeType("EIP712Domain")) + if domainTypeEncoding != "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" { + t.Errorf("Expected different encodeType result (got %s)", domainTypeEncoding) + } + + mailTypeEncoding := string(typedData.EncodeType(typedData.PrimaryType)) + if mailTypeEncoding != "Mail(Person from,Person to,string contents)Person(string name,address wallet)" { + t.Errorf("Expected different encodeType result (got %s)", mailTypeEncoding) + } +} + +func TestTypeHash(t *testing.T) { + mailTypeHash := fmt.Sprintf("0x%s", common.Bytes2Hex(typedData.TypeHash(typedData.PrimaryType))) + if mailTypeHash != "0xa0cedeb2dc280ba39b857546d74f5549c3a1d7bdc2dd96bf881f76108e23dac2" { + t.Errorf("Expected different typeHash result (got %s)", mailTypeHash) + } +} + +func TestEncodeData(t *testing.T) { + hash, err := typedData.EncodeData(typedData.PrimaryType, typedData.Message, 0) + if err != nil { + t.Fatal(err) + } + dataEncoding := fmt.Sprintf("0x%s", common.Bytes2Hex(hash)) + if dataEncoding != "0xa0cedeb2dc280ba39b857546d74f5549c3a1d7bdc2dd96bf881f76108e23dac2fc71e5fa27ff56c350aa531bc129ebdf613b772b6604664f5d8dbe21b85eb0c8cd54f074a4af31b4411ff6a60c9719dbd559c221c8ac3492d9d872b041d703d1b5aadf3154a261abdd9086fc627b61efca26ae5702701d05cd2305f7c52a2fc8" { + t.Errorf("Expected different encodeData result (got %s)", dataEncoding) + } +} + +func TestFormatter(t *testing.T) { + var d core.TypedData + err := json.Unmarshal([]byte(jsonTypedData), &d) + if err != nil { + t.Fatalf("unmarshalling failed '%v'", err) + } + formatted, _ := d.Format() + for _, item := range formatted { + t.Logf("'%v'\n", item.Pprint(0)) + } + + j, _ := json.Marshal(formatted) + t.Logf("'%v'\n", string(j)) +} + +func sign(typedData core.TypedData) ([]byte, []byte, error) { + domainSeparator, err := typedData.HashStruct("EIP712Domain", typedData.Domain.Map()) + if err != nil { + return nil, nil, err + } + typedDataHash, err := typedData.HashStruct(typedData.PrimaryType, typedData.Message) + if err != nil { + return nil, nil, err + } + rawData := []byte(fmt.Sprintf("\x19\x01%s%s", string(domainSeparator), string(typedDataHash))) + sighash := crypto.Keccak256(rawData) + return typedDataHash, sighash, nil +} + +func TestJsonFiles(t *testing.T) { + testfiles, err := ioutil.ReadDir("testdata/") + if err != nil { + t.Fatalf("failed reading files: %v", err) + } + for i, fInfo := range testfiles { + if !strings.HasSuffix(fInfo.Name(), "json") { + continue + } + expectedFailure := strings.HasPrefix(fInfo.Name(), "expfail") + data, err := ioutil.ReadFile(path.Join("testdata", fInfo.Name())) + if err != nil { + t.Errorf("Failed to read file %v: %v", fInfo.Name(), err) + continue + } + var typedData core.TypedData + err = json.Unmarshal(data, &typedData) + if err != nil { + t.Errorf("Test %d, file %v, json unmarshalling failed: %v", i, fInfo.Name(), err) + continue + } + _, _, err = sign(typedData) + t.Logf("Error %v\n", err) + if err != nil && !expectedFailure { + t.Errorf("Test %d failed, file %v: %v", i, fInfo.Name(), err) + } + if expectedFailure && err == nil { + t.Errorf("Test %d succeeded (expected failure), file %v: %v", i, fInfo.Name(), err) + } + } +} + +// TestFuzzerFiles tests some files that have been found by fuzzing to cause +// crashes or hangs. +func TestFuzzerFiles(t *testing.T) { + corpusdir := path.Join("testdata", "fuzzing") + testfiles, err := ioutil.ReadDir(corpusdir) + if err != nil { + t.Fatalf("failed reading files: %v", err) + } + verbose := false + for i, fInfo := range testfiles { + data, err := ioutil.ReadFile(path.Join(corpusdir, fInfo.Name())) + if err != nil { + t.Errorf("Failed to read file %v: %v", fInfo.Name(), err) + continue + } + var typedData core.TypedData + err = json.Unmarshal(data, &typedData) + if err != nil { + t.Errorf("Test %d, file %v, json unmarshalling failed: %v", i, fInfo.Name(), err) + continue + } + _, err = typedData.EncodeData("EIP712Domain", typedData.Domain.Map(), 1) + if verbose && err != nil { + t.Logf("%d, EncodeData[1] err: %v\n", i, err) + } + _, err = typedData.EncodeData(typedData.PrimaryType, typedData.Message, 1) + if verbose && err != nil { + t.Logf("%d, EncodeData[2] err: %v\n", i, err) + } + typedData.Format() + } +} diff --git a/signer/core/stdioui.go b/signer/core/stdioui.go index c2b73948877e..6963a89122f6 100644 --- a/signer/core/stdioui.go +++ b/signer/core/stdioui.go @@ -1,43 +1,44 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// 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 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. // -// go-ethereum is distributed in the hope that it will be useful, +// 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 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 . +// 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 ( "context" - "sync" - "github.com/nebulaai/nbai-node/internal/ethapi" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rpc" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rpc" ) type StdIOUI struct { client rpc.Client - mu sync.Mutex } func NewStdIOUI() *StdIOUI { - log.Info("NewStdIOUI") client, err := rpc.DialContext(context.Background(), "stdio://") if err != nil { log.Crit("Could not create stdio client", "err", err) } - return &StdIOUI{client: *client} + ui := &StdIOUI{client: *client} + return ui +} + +func (ui *StdIOUI) RegisterUIServer(api *UIServerAPI) { + ui.client.RegisterName("clef", api) } // dispatch sends a request over the stdio @@ -49,73 +50,71 @@ func (ui *StdIOUI) dispatch(serviceMethod string, args interface{}, reply interf return err } +// notify sends a request over the stdio, and does not listen for a response +func (ui *StdIOUI) notify(serviceMethod string, args interface{}) error { + ctx := context.Background() + err := ui.client.Notify(ctx, serviceMethod, args) + if err != nil { + log.Info("Error", "exc", err.Error()) + } + return err +} + func (ui *StdIOUI) ApproveTx(request *SignTxRequest) (SignTxResponse, error) { var result SignTxResponse - err := ui.dispatch("ApproveTx", request, &result) + err := ui.dispatch("ui_approveTx", request, &result) return result, err } func (ui *StdIOUI) ApproveSignData(request *SignDataRequest) (SignDataResponse, error) { var result SignDataResponse - err := ui.dispatch("ApproveSignData", request, &result) - return result, err -} - -func (ui *StdIOUI) ApproveExport(request *ExportRequest) (ExportResponse, error) { - var result ExportResponse - err := ui.dispatch("ApproveExport", request, &result) - return result, err -} - -func (ui *StdIOUI) ApproveImport(request *ImportRequest) (ImportResponse, error) { - var result ImportResponse - err := ui.dispatch("ApproveImport", request, &result) + err := ui.dispatch("ui_approveSignData", request, &result) return result, err } func (ui *StdIOUI) ApproveListing(request *ListRequest) (ListResponse, error) { var result ListResponse - err := ui.dispatch("ApproveListing", request, &result) + err := ui.dispatch("ui_approveListing", request, &result) return result, err } func (ui *StdIOUI) ApproveNewAccount(request *NewAccountRequest) (NewAccountResponse, error) { var result NewAccountResponse - err := ui.dispatch("ApproveNewAccount", request, &result) + err := ui.dispatch("ui_approveNewAccount", request, &result) return result, err } func (ui *StdIOUI) ShowError(message string) { - err := ui.dispatch("ShowError", &Message{message}, nil) + err := ui.notify("ui_showError", &Message{message}) if err != nil { - log.Info("Error calling 'ShowError'", "exc", err.Error(), "msg", message) + log.Info("Error calling 'ui_showError'", "exc", err.Error(), "msg", message) } } func (ui *StdIOUI) ShowInfo(message string) { - err := ui.dispatch("ShowInfo", Message{message}, nil) + err := ui.notify("ui_showInfo", Message{message}) if err != nil { - log.Info("Error calling 'ShowInfo'", "exc", err.Error(), "msg", message) + log.Info("Error calling 'ui_showInfo'", "exc", err.Error(), "msg", message) } } func (ui *StdIOUI) OnApprovedTx(tx ethapi.SignTransactionResult) { - err := ui.dispatch("OnApprovedTx", tx, nil) + err := ui.notify("ui_onApprovedTx", tx) if err != nil { - log.Info("Error calling 'OnApprovedTx'", "exc", err.Error(), "tx", tx) + log.Info("Error calling 'ui_onApprovedTx'", "exc", err.Error(), "tx", tx) } } func (ui *StdIOUI) OnSignerStartup(info StartupInfo) { - err := ui.dispatch("OnSignerStartup", info, nil) + err := ui.notify("ui_onSignerStartup", info) if err != nil { - log.Info("Error calling 'OnSignerStartup'", "exc", err.Error(), "info", info) + log.Info("Error calling 'ui_onSignerStartup'", "exc", err.Error(), "info", info) } } func (ui *StdIOUI) OnInputRequired(info UserInputRequest) (UserInputResponse, error) { var result UserInputResponse - err := ui.dispatch("OnInputRequired", info, &result) + err := ui.dispatch("ui_onInputRequired", info, &result) if err != nil { - log.Info("Error calling 'OnInputRequired'", "exc", err.Error(), "info", info) + log.Info("Error calling 'ui_onInputRequired'", "exc", err.Error(), "info", info) } return result, err } diff --git a/signer/core/testdata/README.md b/signer/core/testdata/README.md new file mode 100644 index 000000000000..f425450a0673 --- /dev/null +++ b/signer/core/testdata/README.md @@ -0,0 +1,5 @@ +### EIP 712 tests + +These tests are json files which are converted into eip-712 typed data. +All files are expected to be proper json, and tests will fail if they are not. +Files that begin with `expfail' are expected to not pass the hashstruct construction. diff --git a/signer/core/testdata/arrays-1.json b/signer/core/testdata/arrays-1.json new file mode 100644 index 000000000000..fea82b42c6de --- /dev/null +++ b/signer/core/testdata/arrays-1.json @@ -0,0 +1,60 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Foo": [ + { + "name": "addys", + "type": "address[]" + }, + { + "name": "stringies", + "type": "string[]" + }, + { + "name": "inties", + "type": "uint[]" + } + ] + }, + "primaryType": "Foo", + "domain": { + "name": "Lorem", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "addys": [ + "0x0000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000003" + ], + "stringies": [ + "lorem", + "ipsum", + "dolores" + ], + "inties": [ + "0x0000000000000000000000000000000000000001", + "3", + 4.0 + ] + } +} diff --git a/signer/core/testdata/custom_arraytype.json b/signer/core/testdata/custom_arraytype.json new file mode 100644 index 000000000000..078de88c22f8 --- /dev/null +++ b/signer/core/testdata/custom_arraytype.json @@ -0,0 +1,54 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person[]" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { "name": "Cow"}, + "to": [{ "name": "Moose"},{ "name": "Goose"}], + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/eip712.json b/signer/core/testdata/eip712.json new file mode 100644 index 000000000000..7b1cb8ae2d16 --- /dev/null +++ b/signer/core/testdata/eip712.json @@ -0,0 +1,76 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "test", + "type": "uint8" + }, + { + "name": "test2", + "type": "uint8" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "test": "3", + "test2": 5.0, + "wallet": "0xcD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "test": "0", + "test2": 5, + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/expfail_arraytype_overload.json b/signer/core/testdata/expfail_arraytype_overload.json new file mode 100644 index 000000000000..786487f1002d --- /dev/null +++ b/signer/core/testdata/expfail_arraytype_overload.json @@ -0,0 +1,67 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Person[]": [ + { + "name": "baz", + "type": "string" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person[]" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": {"baz": "foo"}, + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/expfail_datamismatch_1.json b/signer/core/testdata/expfail_datamismatch_1.json new file mode 100644 index 000000000000..d19d470d1eac --- /dev/null +++ b/signer/core/testdata/expfail_datamismatch_1.json @@ -0,0 +1,64 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "Person" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/expfail_extradata-1.json b/signer/core/testdata/expfail_extradata-1.json new file mode 100644 index 000000000000..fd704209bc46 --- /dev/null +++ b/signer/core/testdata/expfail_extradata-1.json @@ -0,0 +1,76 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256 ... and now for something completely different" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "test", + "type": "uint8" + }, + { + "name": "test2", + "type": "uint8" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "test": "3", + "test2": 5.0, + "wallet": "0xcD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "test": "0", + "test2": 5, + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/expfail_extradata-2.json b/signer/core/testdata/expfail_extradata-2.json new file mode 100644 index 000000000000..10f91c23af4b --- /dev/null +++ b/signer/core/testdata/expfail_extradata-2.json @@ -0,0 +1,77 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "test", + "type": "uint8" + }, + { + "name": "test2", + "type": "uint8" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "blahonga": "zonk bonk", + "from": { + "name": "Cow", + "test": "3", + "test2": 5.0, + "wallet": "0xcD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "test": "0", + "test2": 5, + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/expfail_malformeddomainkeys.json b/signer/core/testdata/expfail_malformeddomainkeys.json new file mode 100644 index 000000000000..354b3cc859ca --- /dev/null +++ b/signer/core/testdata/expfail_malformeddomainkeys.json @@ -0,0 +1,64 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "string" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "vFAILFAILerifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/expfail_nonexistant_type.json b/signer/core/testdata/expfail_nonexistant_type.json new file mode 100644 index 000000000000..d06bc20b9fe8 --- /dev/null +++ b/signer/core/testdata/expfail_nonexistant_type.json @@ -0,0 +1,64 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Person" + }, + { + "name": "contents", + "type": "Blahonga" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "Cow", + "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "Bob", + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "contents": "Hello, Bob!" + } +} diff --git a/signer/core/testdata/expfail_toolargeuint.json b/signer/core/testdata/expfail_toolargeuint.json new file mode 100644 index 000000000000..9854b65b17da --- /dev/null +++ b/signer/core/testdata/expfail_toolargeuint.json @@ -0,0 +1,38 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Mail": [ + { + "name": "test", + "type": "uint8" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "test":"257" + } +} diff --git a/signer/core/testdata/expfail_toolargeuint2.json b/signer/core/testdata/expfail_toolargeuint2.json new file mode 100644 index 000000000000..c63ed41f9c41 --- /dev/null +++ b/signer/core/testdata/expfail_toolargeuint2.json @@ -0,0 +1,38 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Mail": [ + { + "name": "test", + "type": "uint8" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "test":257 + } +} diff --git a/signer/core/testdata/expfail_unconvertiblefloat.json b/signer/core/testdata/expfail_unconvertiblefloat.json new file mode 100644 index 000000000000..8229a333ca88 --- /dev/null +++ b/signer/core/testdata/expfail_unconvertiblefloat.json @@ -0,0 +1,38 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Mail": [ + { + "name": "test", + "type": "uint8" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "test":"255.3" + } +} diff --git a/signer/core/testdata/expfail_unconvertiblefloat2.json b/signer/core/testdata/expfail_unconvertiblefloat2.json new file mode 100644 index 000000000000..59e6d38d24ad --- /dev/null +++ b/signer/core/testdata/expfail_unconvertiblefloat2.json @@ -0,0 +1,38 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Mail": [ + { + "name": "test", + "type": "uint8" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "test": 255.3 + } +} diff --git a/signer/core/testdata/fuzzing/2850f6ccf2d7f5f846dfb73119b60e09e712783f b/signer/core/testdata/fuzzing/2850f6ccf2d7f5f846dfb73119b60e09e712783f new file mode 100644 index 000000000000..8229a333ca88 --- /dev/null +++ b/signer/core/testdata/fuzzing/2850f6ccf2d7f5f846dfb73119b60e09e712783f @@ -0,0 +1,38 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Mail": [ + { + "name": "test", + "type": "uint8" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "test":"255.3" + } +} diff --git a/signer/core/testdata/fuzzing/36fb987a774011dc675e1b5246ac5c1d44d84d92 b/signer/core/testdata/fuzzing/36fb987a774011dc675e1b5246ac5c1d44d84d92 new file mode 100644 index 000000000000..fea82b42c6de --- /dev/null +++ b/signer/core/testdata/fuzzing/36fb987a774011dc675e1b5246ac5c1d44d84d92 @@ -0,0 +1,60 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Foo": [ + { + "name": "addys", + "type": "address[]" + }, + { + "name": "stringies", + "type": "string[]" + }, + { + "name": "inties", + "type": "uint[]" + } + ] + }, + "primaryType": "Foo", + "domain": { + "name": "Lorem", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "addys": [ + "0x0000000000000000000000000000000000000001", + "0x0000000000000000000000000000000000000002", + "0x0000000000000000000000000000000000000003" + ], + "stringies": [ + "lorem", + "ipsum", + "dolores" + ], + "inties": [ + "0x0000000000000000000000000000000000000001", + "3", + 4.0 + ] + } +} diff --git a/signer/core/testdata/fuzzing/37ec7b55c7ba014cced204c5f9989d2d0eb9ff6d b/signer/core/testdata/fuzzing/37ec7b55c7ba014cced204c5f9989d2d0eb9ff6d new file mode 100644 index 000000000000..c63ed41f9c41 --- /dev/null +++ b/signer/core/testdata/fuzzing/37ec7b55c7ba014cced204c5f9989d2d0eb9ff6d @@ -0,0 +1,38 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "uint256" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Mail": [ + { + "name": "test", + "type": "uint8" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "Ether Mail", + "version": "1", + "chainId": "1", + "verifyingContract": "0xCCCcccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "test":257 + } +} diff --git a/signer/core/testdata/fuzzing/582fa92154b784daa1faa293b695fa388fe34bf1 b/signer/core/testdata/fuzzing/582fa92154b784daa1faa293b695fa388fe34bf1 new file mode 100644 index 000000000000..9bc43938d53c --- /dev/null +++ b/signer/core/testdata/fuzzing/582fa92154b784daa1faa293b695fa388fe34bf1 @@ -0,0 +1 @@ +{"domain":{"version":"0","chainId":""}} \ No newline at end of file diff --git a/signer/core/testdata/fuzzing/ab57cb2b2b5ce614efe13a47bc73814580f2cce8 b/signer/core/testdata/fuzzing/ab57cb2b2b5ce614efe13a47bc73814580f2cce8 new file mode 100644 index 000000000000..fe27de916cdc --- /dev/null +++ b/signer/core/testdata/fuzzing/ab57cb2b2b5ce614efe13a47bc73814580f2cce8 @@ -0,0 +1,54 @@ +{ "types": { "":[ { + "name": "name", + "type":"string" }, + { + "name":"version", + "type": "string" }, { + "name": "chaiI", + "type":"uint256 . ad nowretig omeedifere" }, { + "ae": "eifinC", + "ty":"dess" + } + ], + "Person":[ + { + "name":"name", + "type": "string" + }, { + "name":"tes", "type":"it8" + }, + { "name":"t", "tye":"uit8" + }, + { + "a":"ale", + "type": "ress" + } + ], + "Mail": [ + { + "name":"from", "type":"Person" }, + { + "name": "to", "type": "Person" + }, + { + "name": "contents", + "type": "string" + } + ] + }, "primaryType": "Mail", + "domain": { +"name":"theMail", "version": "1", + "chainId": "1", + "verifyingntract": "0xCcccCCCcCCCCCCCcCCcCCCcCcccccC" + }, + "message": { "from": { + "name": "Cow", + "test": "3", + "est2":5.0, + "llt": "0xcD2a3938E13D947E0bE734DfDD86" }, "to": { "name": "Bob", + "ts":"", + "tet2": 5, + "allet": "0bBBBBbbBBbbbbBbbBbbbbBBBbB" + }, + "contents": "Hello, Bob!" } +} \ No newline at end of file diff --git a/signer/core/testdata/fuzzing/e4303e23ca34fbbc43164a232b2caa7a3af2bf8d b/signer/core/testdata/fuzzing/e4303e23ca34fbbc43164a232b2caa7a3af2bf8d new file mode 100644 index 000000000000..c5e14b39ed35 --- /dev/null +++ b/signer/core/testdata/fuzzing/e4303e23ca34fbbc43164a232b2caa7a3af2bf8d @@ -0,0 +1,64 @@ +{ + "types": { + "EIP712Domain": [ + { + "name": "name", + "type": "string" + }, + { + "name": "version", + "type": "string" + }, + { + "name": "chainId", + "type": "int" + }, + { + "name": "verifyingContract", + "type": "address" + } + ], + "Person": [ + { + "name": "name", + "type": "string" + }, + { + "name": "wallet", + "type": "address" + } + ], + "Mail": [ + { + "name": "from", + "type": "Person" + }, + { + "name": "to", + "type": "Mail" + }, + { + "name": "s", + "type": "Person" + } + ] + }, + "primaryType": "Mail", + "domain": { + "name": "l", + "version": "1", + "chainId": "", + "verifyingContract": "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" + }, + "message": { + "from": { + "name": "", + "wallet": "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" + }, + "to": { + "name": "", + "wallet": "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" + }, + "": "" + } +} diff --git a/signer/core/testdata/fuzzing/f658340af009dd4a35abe645a00a7b732bc30921 b/signer/core/testdata/fuzzing/f658340af009dd4a35abe645a00a7b732bc30921 new file mode 100644 index 000000000000..c4841cb07bab --- /dev/null +++ b/signer/core/testdata/fuzzing/f658340af009dd4a35abe645a00a7b732bc30921 @@ -0,0 +1 @@ +{"types":{"0":[{}]}} \ No newline at end of file diff --git a/signer/core/types.go b/signer/core/types.go index 1c556ff3e035..58b377c8d85b 100644 --- a/signer/core/types.go +++ b/signer/core/types.go @@ -1,58 +1,32 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// 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 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. // -// go-ethereum is distributed in the hope that it will be useful, +// 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 General Public License for more details. +// GNU Lesser 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 . +// 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/json" "fmt" - "strings" - "math/big" + "strings" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" ) -type Accounts []Account - -func (as Accounts) String() string { - var output []string - for _, a := range as { - output = append(output, a.String()) - } - return strings.Join(output, "\n") -} - -type Account struct { - Typ string `json:"type"` - URL accounts.URL `json:"url"` - Address common.Address `json:"address"` -} - -func (a Account) String() string { - s, err := json.Marshal(a) - if err == nil { - return string(s) - } - return err.Error() -} - type ValidationInfo struct { Typ string `json:"type"` Message string `json:"message"` @@ -67,13 +41,13 @@ const ( INFO = "Info" ) -func (vs *ValidationMessages) crit(msg string) { +func (vs *ValidationMessages) Crit(msg string) { vs.Messages = append(vs.Messages, ValidationInfo{CRIT, msg}) } -func (vs *ValidationMessages) warn(msg string) { +func (vs *ValidationMessages) Warn(msg string) { vs.Messages = append(vs.Messages, ValidationInfo{WARN, msg}) } -func (vs *ValidationMessages) info(msg string) { +func (vs *ValidationMessages) Info(msg string) { vs.Messages = append(vs.Messages, ValidationInfo{INFO, msg}) } @@ -86,7 +60,7 @@ func (v *ValidationMessages) getWarnings() error { } } if len(messages) > 0 { - return fmt.Errorf("Validation failed: %s", strings.Join(messages, ",")) + return fmt.Errorf("validation failed: %s", strings.Join(messages, ",")) } return nil } @@ -101,7 +75,7 @@ type SendTxArgs struct { Nonce hexutil.Uint64 `json:"nonce"` // We accept "data" and "input" for backwards-compatibility reasons. Data *hexutil.Bytes `json:"data"` - Input *hexutil.Bytes `json:"input"` + Input *hexutil.Bytes `json:"input,omitempty"` } func (args SendTxArgs) String() string { diff --git a/signer/core/uiapi.go b/signer/core/uiapi.go new file mode 100644 index 000000000000..36735d37ee63 --- /dev/null +++ b/signer/core/uiapi.go @@ -0,0 +1,200 @@ +// Copyright 2019 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 ( + "context" + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "math/big" + + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" +) + +// SignerUIAPI implements methods Clef provides for a UI to query, in the bidirectional communication +// channel. +// This API is considered secure, since a request can only +// ever arrive from the UI -- and the UI is capable of approving any action, thus we can consider these +// requests pre-approved. +// NB: It's very important that these methods are not ever exposed on the external service +// registry. +type UIServerAPI struct { + extApi *SignerAPI + am *accounts.Manager +} + +// NewUIServerAPI creates a new UIServerAPI +func NewUIServerAPI(extapi *SignerAPI) *UIServerAPI { + return &UIServerAPI{extapi, extapi.am} +} + +// List available accounts. As opposed to the external API definition, this method delivers +// the full Account object and not only Address. +// Example call +// {"jsonrpc":"2.0","method":"clef_listAccounts","params":[], "id":4} +func (s *UIServerAPI) ListAccounts(ctx context.Context) ([]accounts.Account, error) { + var accs []accounts.Account + for _, wallet := range s.am.Wallets() { + accs = append(accs, wallet.Accounts()...) + } + return accs, nil +} + +// rawWallet is a JSON representation of an accounts.Wallet interface, with its +// data contents extracted into plain fields. +type rawWallet struct { + URL string `json:"url"` + Status string `json:"status"` + Failure string `json:"failure,omitempty"` + Accounts []accounts.Account `json:"accounts,omitempty"` +} + +// ListWallets will return a list of wallets that clef manages +// Example call +// {"jsonrpc":"2.0","method":"clef_listWallets","params":[], "id":5} +func (s *UIServerAPI) ListWallets() []rawWallet { + wallets := make([]rawWallet, 0) // return [] instead of nil if empty + for _, wallet := range s.am.Wallets() { + status, failure := wallet.Status() + + raw := rawWallet{ + URL: wallet.URL().String(), + Status: status, + Accounts: wallet.Accounts(), + } + if failure != nil { + raw.Failure = failure.Error() + } + wallets = append(wallets, raw) + } + return wallets +} + +// DeriveAccount requests a HD wallet to derive a new account, optionally pinning +// it for later reuse. +// Example call +// {"jsonrpc":"2.0","method":"clef_deriveAccount","params":["ledger://","m/44'/60'/0'", false], "id":6} +func (s *UIServerAPI) DeriveAccount(url string, path string, pin *bool) (accounts.Account, error) { + wallet, err := s.am.Wallet(url) + if err != nil { + return accounts.Account{}, err + } + derivPath, err := accounts.ParseDerivationPath(path) + if err != nil { + return accounts.Account{}, err + } + if pin == nil { + pin = new(bool) + } + return wallet.Derive(derivPath, *pin) +} + +// fetchKeystore retrives the encrypted keystore from the account manager. +func fetchKeystore(am *accounts.Manager) *keystore.KeyStore { + return am.Backends(keystore.KeyStoreType)[0].(*keystore.KeyStore) +} + +// ImportRawKey stores the given hex encoded ECDSA key into the key directory, +// encrypting it with the passphrase. +// Example call (should fail on password too short) +// {"jsonrpc":"2.0","method":"clef_importRawKey","params":["1111111111111111111111111111111111111111111111111111111111111111","test"], "id":6} +func (s *UIServerAPI) ImportRawKey(privkey string, password string) (accounts.Account, error) { + key, err := crypto.HexToECDSA(privkey) + if err != nil { + return accounts.Account{}, err + } + if err := ValidatePasswordFormat(password); err != nil { + return accounts.Account{}, fmt.Errorf("password requirements not met: %v", err) + } + // No error + return fetchKeystore(s.am).ImportECDSA(key, password) +} + +// 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). +// Example +// {"jsonrpc":"2.0","method":"clef_openWallet","params":["ledger://",""], "id":6} +func (s *UIServerAPI) 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) +} + +// ChainId returns the chainid in use for Eip-155 replay protection +// Example call +// {"jsonrpc":"2.0","method":"clef_chainId","params":[], "id":8} +func (s *UIServerAPI) ChainId() math.HexOrDecimal64 { + return (math.HexOrDecimal64)(s.extApi.chainID.Uint64()) +} + +// SetChainId sets the chain id to use when signing transactions. +// Example call to set Ropsten: +// {"jsonrpc":"2.0","method":"clef_setChainId","params":["3"], "id":8} +func (s *UIServerAPI) SetChainId(id math.HexOrDecimal64) math.HexOrDecimal64 { + s.extApi.chainID = new(big.Int).SetUint64(uint64(id)) + return s.ChainId() +} + +// Export returns encrypted private key associated with the given address in web3 keystore format. +// Example +// {"jsonrpc":"2.0","method":"clef_export","params":["0x19e7e376e7c213b7e7e7e46cc70a5dd086daff2a"], "id":4} +func (s *UIServerAPI) Export(ctx context.Context, addr common.Address) (json.RawMessage, error) { + // Look up the wallet containing the requested signer + wallet, err := s.am.Find(accounts.Account{Address: addr}) + if err != nil { + return nil, err + } + if wallet.URL().Scheme != keystore.KeyStoreScheme { + return nil, fmt.Errorf("account is not a keystore-account") + } + return ioutil.ReadFile(wallet.URL().Path) +} + +// Import tries to import the given keyJSON in the local keystore. The keyJSON data is expected to be +// in web3 keystore format. It will decrypt the keyJSON with the given passphrase and on successful +// decryption it will encrypt the key with the given newPassphrase and store it in the keystore. +// Example (the address in question has privkey `11...11`): +// {"jsonrpc":"2.0","method":"clef_import","params":[{"address":"19e7e376e7c213b7e7e7e46cc70a5dd086daff2a","crypto":{"cipher":"aes-128-ctr","ciphertext":"33e4cd3756091d037862bb7295e9552424a391a6e003272180a455ca2a9fb332","cipherparams":{"iv":"b54b263e8f89c42bb219b6279fba5cce"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"e4ca94644fd30569c1b1afbbc851729953c92637b7fe4bb9840bbb31ffbc64a5"},"mac":"f4092a445c2b21c0ef34f17c9cd0d873702b2869ec5df4439a0c2505823217e7"},"id":"216c7eac-e8c1-49af-a215-fa0036f29141","version":3},"test","yaddayadda"], "id":4} +func (api *UIServerAPI) Import(ctx context.Context, keyJSON json.RawMessage, oldPassphrase, newPassphrase string) (accounts.Account, error) { + be := api.am.Backends(keystore.KeyStoreType) + + if len(be) == 0 { + return accounts.Account{}, errors.New("password based accounts not supported") + } + if err := ValidatePasswordFormat(newPassphrase); err != nil { + return accounts.Account{}, fmt.Errorf("password requirements not met: %v", err) + } + return be[0].(*keystore.KeyStore).Import(keyJSON, oldPassphrase, newPassphrase) +} + +// Other methods to be added, not yet implemented are: +// - Ruleset interaction: add rules, attest rulefiles +// - Store metadata about accounts, e.g. naming of accounts diff --git a/signer/core/validation.go b/signer/core/validation.go index bc91359e03ac..af858862ef4a 100644 --- a/signer/core/validation.go +++ b/signer/core/validation.go @@ -1,162 +1,27 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// 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 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. // -// go-ethereum is distributed in the hope that it will be useful, +// 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 General Public License for more details. +// GNU Lesser 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 . +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . package core import ( - "bytes" "errors" - "fmt" - "math/big" "regexp" - - "github.com/nebulaai/nbai-node/common" ) -// The validation package contains validation checks for transactions -// - ABI-data validation -// - Transaction semantics validation -// The package provides warnings for typical pitfalls - -type Validator struct { - db *AbiDb -} - -func NewValidator(db *AbiDb) *Validator { - return &Validator{db} -} -func testSelector(selector string, data []byte) (*decodedCallData, error) { - if selector == "" { - return nil, fmt.Errorf("selector not found") - } - abiData, err := MethodSelectorToAbi(selector) - if err != nil { - return nil, err - } - info, err := parseCallData(data, string(abiData)) - if err != nil { - return nil, err - } - return info, nil - -} - -// validateCallData checks if the ABI-data + methodselector (if given) can be parsed and seems to match -func (v *Validator) validateCallData(msgs *ValidationMessages, data []byte, methodSelector *string) { - if len(data) == 0 { - return - } - if len(data) < 4 { - msgs.warn("Tx contains data which is not valid ABI") - return - } - if arglen := len(data) - 4; arglen%32 != 0 { - msgs.warn(fmt.Sprintf("Not ABI-encoded data; length should be a multiple of 32 (was %d)", arglen)) - } - var ( - info *decodedCallData - err error - ) - // Check the provided one - if methodSelector != nil { - info, err = testSelector(*methodSelector, data) - if err != nil { - msgs.warn(fmt.Sprintf("Tx contains data, but provided ABI signature could not be matched: %v", err)) - } else { - msgs.info(info.String()) - //Successfull match. add to db if not there already (ignore errors there) - v.db.AddSignature(*methodSelector, data[:4]) - } - return - } - // Check the db - selector, err := v.db.LookupMethodSelector(data[:4]) - if err != nil { - msgs.warn(fmt.Sprintf("Tx contains data, but the ABI signature could not be found: %v", err)) - return - } - info, err = testSelector(selector, data) - if err != nil { - msgs.warn(fmt.Sprintf("Tx contains data, but provided ABI signature could not be matched: %v", err)) - } else { - msgs.info(info.String()) - } -} - -// validateSemantics checks if the transactions 'makes sense', and generate warnings for a couple of typical scenarios -func (v *Validator) validate(msgs *ValidationMessages, txargs *SendTxArgs, methodSelector *string) error { - // Prevent accidental erroneous usage of both 'input' and 'data' - if txargs.Data != nil && txargs.Input != nil && !bytes.Equal(*txargs.Data, *txargs.Input) { - // This is a showstopper - return errors.New(`Ambiguous request: both "data" and "input" are set and are not identical`) - } - var ( - data []byte - ) - // Place data on 'data', and nil 'input' - if txargs.Input != nil { - txargs.Data = txargs.Input - txargs.Input = nil - } - if txargs.Data != nil { - data = *txargs.Data - } - - if txargs.To == nil { - //Contract creation should contain sufficient data to deploy a contract - // A typical error is omitting sender due to some quirk in the javascript call - // e.g. https://github.com/ethereum/go-ethereum/issues/16106 - if len(data) == 0 { - if txargs.Value.ToInt().Cmp(big.NewInt(0)) > 0 { - // Sending ether into black hole - return errors.New("Tx will create contract with value but empty code!") - } - // No value submitted at least - msgs.crit("Tx will create contract with empty code!") - } else if len(data) < 40 { //Arbitrary limit - msgs.warn(fmt.Sprintf("Tx will will create contract, but payload is suspiciously small (%d b)", len(data))) - } - // methodSelector should be nil for contract creation - if methodSelector != nil { - msgs.warn("Tx will create contract, but method selector supplied; indicating intent to call a method.") - } - - } else { - if !txargs.To.ValidChecksum() { - msgs.warn("Invalid checksum on to-address") - } - // Normal transaction - if bytes.Equal(txargs.To.Address().Bytes(), common.Address{}.Bytes()) { - // Sending to 0 - msgs.crit("Tx destination is the zero address!") - } - // Validate calldata - v.validateCallData(msgs, data, methodSelector) - } - return nil -} - -// ValidateTransaction does a number of checks on the supplied transaction, and returns either a list of warnings, -// or an error, indicating that the transaction should be immediately rejected -func (v *Validator) ValidateTransaction(txArgs *SendTxArgs, methodSelector *string) (*ValidationMessages, error) { - msgs := &ValidationMessages{} - return msgs, v.validate(msgs, txArgs, methodSelector) -} - -var Printable7BitAscii = regexp.MustCompile("^[A-Za-z0-9!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ]+$") +var printable7BitAscii = regexp.MustCompile("^[A-Za-z0-9!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ]+$") // ValidatePasswordFormat returns an error if the password is too short, or consists of characters // outside the range of the printable 7bit ascii set @@ -164,7 +29,7 @@ func ValidatePasswordFormat(password string) error { if len(password) < 10 { return errors.New("password too short (<10 characters)") } - if !Printable7BitAscii.MatchString(password) { + if !printable7BitAscii.MatchString(password) { return errors.New("password contains invalid characters - only 7bit printable ascii allowed") } return nil diff --git a/signer/core/validation_test.go b/signer/core/validation_test.go index ecc66acb5e9a..7105691d29c0 100644 --- a/signer/core/validation_test.go +++ b/signer/core/validation_test.go @@ -1,142 +1,22 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// 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 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. // -// go-ethereum is distributed in the hope that it will be useful, +// 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 General Public License for more details. +// GNU Lesser 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 . +// 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" - "testing" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" -) - -func hexAddr(a string) common.Address { return common.BytesToAddress(common.FromHex(a)) } -func mixAddr(a string) (*common.MixedcaseAddress, error) { - return common.NewMixedcaseAddressFromString(a) -} -func toHexBig(h string) hexutil.Big { - b := big.NewInt(0).SetBytes(common.FromHex(h)) - return hexutil.Big(*b) -} -func toHexUint(h string) hexutil.Uint64 { - b := big.NewInt(0).SetBytes(common.FromHex(h)) - return hexutil.Uint64(b.Uint64()) -} -func dummyTxArgs(t txtestcase) *SendTxArgs { - to, _ := mixAddr(t.to) - from, _ := mixAddr(t.from) - n := toHexUint(t.n) - gas := toHexUint(t.g) - gasPrice := toHexBig(t.gp) - value := toHexBig(t.value) - var ( - data, input *hexutil.Bytes - ) - if t.d != "" { - a := hexutil.Bytes(common.FromHex(t.d)) - data = &a - } - if t.i != "" { - a := hexutil.Bytes(common.FromHex(t.i)) - input = &a - - } - return &SendTxArgs{ - From: *from, - To: to, - Value: value, - Nonce: n, - GasPrice: gasPrice, - Gas: gas, - Data: data, - Input: input, - } -} - -type txtestcase struct { - from, to, n, g, gp, value, d, i string - expectErr bool - numMessages int -} - -func TestValidator(t *testing.T) { - var ( - // use empty db, there are other tests for the abi-specific stuff - db, _ = NewEmptyAbiDB() - v = NewValidator(db) - ) - testcases := []txtestcase{ - // Invalid to checksum - {from: "000000000000000000000000000000000000dead", to: "000000000000000000000000000000000000dead", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 1}, - // valid 0x000000000000000000000000000000000000dEaD - {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 0}, - // conflicting input and data - {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x01", i: "0x02", expectErr: true}, - // Data can't be parsed - {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x0102", numMessages: 1}, - // Data (on Input) can't be parsed - {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", i: "0x0102", numMessages: 1}, - // Send to 0 - {from: "000000000000000000000000000000000000dead", to: "0x0000000000000000000000000000000000000000", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 1}, - // Create empty contract (no value) - {from: "000000000000000000000000000000000000dead", to: "", - n: "0x01", g: "0x20", gp: "0x40", value: "0x00", numMessages: 1}, - // Create empty contract (with value) - {from: "000000000000000000000000000000000000dead", to: "", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", expectErr: true}, - // Small payload for create - {from: "000000000000000000000000000000000000dead", to: "", - n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x01", numMessages: 1}, - } - for i, test := range testcases { - msgs, err := v.ValidateTransaction(dummyTxArgs(test), nil) - if err == nil && test.expectErr { - t.Errorf("Test %d, expected error", i) - for _, msg := range msgs.Messages { - fmt.Printf("* %s: %s\n", msg.Typ, msg.Message) - } - } - if err != nil && !test.expectErr { - t.Errorf("Test %d, unexpected error: %v", i, err) - } - if err == nil { - got := len(msgs.Messages) - if got != test.numMessages { - for _, msg := range msgs.Messages { - fmt.Printf("* %s: %s\n", msg.Typ, msg.Message) - } - t.Errorf("Test %d, expected %d messages, got %d", i, test.numMessages, got) - } else { - //Debug printout, remove later - for _, msg := range msgs.Messages { - fmt.Printf("* [%d] %s: %s\n", i, msg.Typ, msg.Message) - } - fmt.Println() - } - } - } -} +import "testing" func TestPasswordValidation(t *testing.T) { testcases := []struct { diff --git a/signer/fourbyte/4byte.go b/signer/fourbyte/4byte.go new file mode 100644 index 000000000000..2f7b24795cf2 --- /dev/null +++ b/signer/fourbyte/4byte.go @@ -0,0 +1,147088 @@ +// Code generated by go-bindata. DO NOT EDIT. +// sources: +// 4byte.json (5.955MB) + +package fourbyte + +import ( + "crypto/sha256" + "fmt" + "io/ioutil" + "os" + "path/filepath" + "strings" + "time" +) + +type asset struct { + bytes []byte + info os.FileInfo + digest [sha256.Size]byte +} + +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 +} + +//nolint:misspell +var __4byteJson = []byte(`{ +"00000001": "account_info_rotate_tine(uint256)", +"00000002": "razor_balance(bool)", +"0000000c": "gumXZCZ()", +"00000033": "matchTokenOrderByAdmin_k44j(uint256[])", +"00000039": "XXX_unrecognized_adapter(string)", +"0000003a": "good_mirror(uint256,uint32)", +"00000063": "math_rotate(uint256,uint256,uint64,uint64)", +"0000006e": "display_allow(uint256,uint256,uint256,uint32)", +"00000080": "conduct_auto(uint256,uint256,uint256)", +"00000082": "artefact_keep(bytes1)", +"000000a0": "tree_stream(bytes,bytes)", +"000000a1": "pistol_valve(uint256,uint32)", +"000000b6": "matchByAdmin_TwH36(uint256[])", +"000000c4": "festival_happy(uint256,uint256)", +"000000c7": "lend_during(uint256,uint256,uint64,uint32)", +"000000da": "muscle_teach(uint256,uint64,uint8)", +"000000db": "viable_print(uint256,uint256,uint64)", +"000000de": "pledge_future(uint256,uint32,uint8)", +"000000ed": "access_coconut_alarm(uint256)", +"000000f5": "cherry_tomorrow(uint256,uint64,bool)", +"000000f8": "required_strconv(string,string)", +"00008962": "token(string,uint8,string)", +"0000aeb3": "migrateByAdmin_DQV(uint256[])", +"00012f8b": "LatiumX()", +"00014502": "totalInfected()", +"000150a0": "DEV_TEAM_STAKE()", +"0001fd01": "PamToken()", +"00020a28": "HaltTokenAllOperation()", +"000267a4": "getUint()", +"00026e13": "checkAtkBossQuest(address)", +"00027737": "aicontract()", +"0002aa37": "richtestkk(uint256,string,uint8,string)", +"0002c1dc": "Johnsonville()", +"00046c1f": "totalDragons()", +"000525fd": "robCoin()", +"0005a533": "CoalichainToken()", +"0005bfb7": "gemmyMusicLockTime()", +"000713fe": "Initiate(address,uint256,uint256,uint256,bool)", +"000751b8": "LogExtendSale(uint256)", +"00076943": "unlocker()", +"00076de7": "disableSellerCancel(uint16,address,address)", +"00085d25": "round3()", +"0008f8df": "changeIcoFinish(uint256)", +"00094161": "TERMS_AND_CONDITIONS()", +"00096469": "AuctionCreated(uint256,address,uint256,uint256,uint256,uint256)", +"0009803b": "makeProject(address,string,uint256,uint256)", +"00099cdf": "withdrawTokens3(uint256)", +"000a4a7a": "backAtIndex(uint256,uint256,uint256)", +"000ac1ff": "addparts(bytes32,uint256,uint256,uint256)", +"000adc67": "buy_the_tokens(string)", +"000b66d3": "setIcoStartTime(uint256)", +"000b9726": "MintingContract()", +"000be356": "expiredBlock()", +"000c12af": "TOTAL_TOKENs_SUPPLY()", +"000c65c3": "withdrawVNET(address,uint256)", +"000ca58e": "refundRequestTimelock()", +"000dae5c": "claimantConvicted(uint256)", +"000e02d0": "fiveHundredThousand()", +"000e28d3": "setLandsLimitPerBid(uint256)", +"000e2f3a": "totalLBSold_GENERAL_1()", +"000e60f8": "pendingBetsBalance()", +"000e7fa8": "presalePrice()", +"000f0ded": "doAirdrop(address,uint256)", +"000f71f8": "recieveNegReq(uint256,uint256,uint256,uint256,string)", +"00100a18": "NewPoll(string,string,uint256,uint256)", +"0010ed99": "getBraggerAtIndex(uint256)", +"00113e08": "getBalances()", +"00115cba": "UpdateSellAgentBounty(address)", +"001246eb": "availableFlg()", +"0012d90a": "BNB_HARD_CAP()", +"001339b0": "prizePoolTotal(bytes4)", +"00137d6e": "peculAdress()", +"0013da50": "delList(string,uint256,uint256)", +"0013eb4b": "isExist(address)", +"0014f956": "getResourcesInfo(address)", +"00152924": "setSelfContractAddress(address)", +"0015be71": "executiveOfficerAddress()", +"001667bb": "getPI_edit_34()", +"00173d65": "getShouldGenerateDna()", +"001773e6": "convertMetToEth(uint256,uint256)", +"0017cd8b": "PRIME()", +"0017e1cf": "getTeamNameForAddress(address)", +"0018b1d3": "pps()", +"0018b665": "killTokenContract()", +"0018fe0b": "changeInGameFee(uint256)", +"00190f64": "getStatusLogs()", +"00199b79": "_updateList(address[],address,address[])", +"0019a46b": "gen0CutieCreatedCount()", +"0019c97d": "redeemPop(uint256)", +"001a4f5e": "createNewRevision(bytes32,bytes32)", +"001aa026": "withdrawMarginPreSigned(bytes,address,uint256,uint256,uint256,uint256)", +"001ab1cd": "setAsBurner(address,bool)", +"001ab993": "VTestDistribution(address,uint256,uint256)", +"001b1441": "Ethernext()", +"001b1cf0": "DualMintableToken(address,address)", +"001b3fe6": "card_blue_first()", +"001ba7ea": "signWitness()", +"001baa89": "createdBy(uint256)", +"001bc69a": "getGratitudesOf(address)", +"001cf577": "wcOnCrowdsaleFailure()", +"001d7bf6": "getInvestmentArray()", +"001db74d": "FreeLove()", +"001dbe8a": "getSoftwareExecRecordLength()", +"001ed012": "previousBurners()", +"001ee6b2": "participateGame(uint32,uint32,uint32,uint32)", +"001f0479": "getResultMask(uint256,uint256)", +"001f4701": "Examples()", +"001f8d11": "removePackage(bytes32,string)", +"001f91ce": "curatorAddress()", +"001f9bc0": "set_arbits_presale_open(address,bool)", +"00201e33": "BONUS_6_DAYS()", +"00203116": "endGame(address,uint8)", +"00203385": "getTotalBorrowingItem()", +"00212667": "m_Creator()", +"0021b6cb": "getElementOfBoughtTicketList(uint256)", +"0021d364": "getNOVotesByEntity(uint256)", +"00226eb5": "getDepositNum()", +"0022771f": "numAdviserDeposits()", +"002338ef": "TLSC()", +"0023de29": "tokensReceived(address,address,address,uint256,bytes,bytes)", +"00245220": "HAJDToken(string,uint8,string)", +"0024eb4b": "getCompanyAllocation(uint256)", +"00277883": "TeamTokensHolder(address,address,address)", +"0028b91f": "Distributor(address,address)", +"0029514f": "PROCESSBY()", +"00297671": "cancelOneSell()", +"002a2133": "createCitizen(uint16,uint16,uint8,bytes32,bytes32,bytes32)", +"002a228c": "initSeed(uint256)", +"002a4b14": "Nine()", +"002a5cc9": "getTicketHolders(uint256)", +"002beece": "unfroze(uint256,address)", +"002c1a9e": "percent(uint256,uint256,uint256)", +"002c8456": "toOpenVote()", +"002ce636": "settrusteeVaultAddr(address)", +"002d7c9d": "concludeFirstAuction()", +"002dc7f1": "ChangePeriod()", +"002e0ae7": "transferTokenOut(address,uint256)", +"002e1316": "maxInvestment()", +"002e1d7e": "LCOpenTimeout(bytes32)", +"002f15ca": "isExistInvestor(address)", +"002f9569": "allocatedTokens()", +"002fd07c": "_approve(address,uint256,uint256)", +"003074ff": "getFrontend()", +"003078b0": "unlockTo(address,string)", +"00310e16": "sellWolk(uint256)", +"00319aad": "_transferadvanced(address,address,uint256)", +"0031a48e": "myICO()", +"00322bb6": "sendPlatformMaintenance()", +"003259ea": "voteResult()", +"003271d5": "checkStateProof(bytes32,bytes,uint256[],bytes,bytes)", +"00333375": "minimumMainSaleRaise()", +"003338a0": "DrawOp()", +"0034451c": "_buildInternalSalt(uint128,address,address,uint256,uint64)", +"00346b57": "setHodlerStake(address,uint256)", +"003495a4": "getHighestBidder()", +"0034b5fd": "withrawFundTeacher(uint256)", +"0034f529": "_requestExists(address,uint32)", +"003538c5": "TestRegistrar(address,bytes32)", +"00354975": "VRYCoin()", +"00359e08": "presaleFinishedAt()", +"0035a45c": "isAllowedToPurchase()", +"0035ceb1": "BrinkzToken()", +"0036059c": "TESTER(uint256,string,string)", +"00360b66": "MyMonsterIds(address,uint256)", +"0036242d": "Power2X()", +"00362509": "LogWin(address,uint256,uint256,uint256)", +"00362a95": "donate(address)", +"00364ceb": "bountyManagementWalletAddress()", +"0036624a": "AmountReceived(address,uint256)", +"003705bc": "getTotalUSDInTokens()", +"0037dd47": "addUniqueSaleTokens(address,uint256)", +"00383d0a": "maxSignup()", +"00387733": "setGameResult(uint256,uint8)", +"0039522c": "emergencyWithdrawal(uint256)", +"003958e2": "LogOperatorAdd(address)", +"00397647": "addToFreelancerTotalEarned(address,address,uint256)", +"0039ad6d": "ROUNDS_KEPT()", +"0039d9db": "getNextStageStartTime()", +"003a3d80": "GetSale()", +"003a5b06": "getRoundEndBlock(uint32)", +"003a661d": "renounceOwnedOwnership(address)", +"003ab1ff": "timereum()", +"003b0a3f": "getFreeDino()", +"003b9d88": "setLowerFeePercentage(uint8)", +"003ba1ed": "setRoot(address)", +"003bcb34": "Received(address,bytes,uint256)", +"003cdf26": "Lima()", +"003cee5a": "HLCToken(address,string,string,uint256,uint8)", +"003db783": "Purchase(uint256,uint256,uint256,uint256)", +"003de230": "participantClawbackEther(uint256)", +"003e9d5b": "FillOrder(uint256,uint256)", +"003ead5f": "setPVEBattleFee(uint256)", +"003f07fa": "isValidAddress(address)", +"003fd35a": "CONTINUE_MINTING()", +"00404930": "CryptoRiyal()", +"00405351": "getWarriorChestAvailable()", +"004056c7": "validateNameInternalET(string)", +"004079b6": "CheckExec(string)", +"0040ff6c": "changeFee()", +"0041edee": "preSaleTokensLimit()", +"004240e3": "startTransaction(address,address,uint256)", +"004264c3": "overflow()", +"0042a3be": "isPublish(bytes32)", +"00432cf3": "getCurrentMarginAmount(address,address,address,uint256,uint256,uint256)", +"0043cce7": "technologyShare()", +"00442a07": "getLoanConfig(uint256)", +"00452636": "GxManagedWallet(address)", +"0045626f": "returnETHByOwner()", +"0045a4d4": "isPointerExpired(uint8)", +"0047850a": "getOfferCountByToken(address)", +"00478f87": "TIC()", +"0048236b": "setOrganName(string)", +"0048d680": "testTransferVotes()", +"00498257": "maxWeiTier2()", +"0049f068": "onContribute(uint256,address,uint256)", +"004b1e75": "actionAuthorisedBy()", +"004bd9a5": "setRate5(uint256)", +"004c942e": "Request_Dividends()", +"004d39b1": "HavvenGold()", +"004d4ed9": "setRegion(uint256,uint256)", +"004db370": "DawnCoin()", +"004dcd1c": "changeBrick(uint256,string,string,string,bytes32[],uint256)", +"004ebaa8": "silo_timer()", +"004ef6c6": "book(uint256,uint256)", +"004f3e86": "forceCancel()", +"004f4042": "takeAllPossible(address[3][],uint256[3][],uint256[],uint8[],bytes32[],bytes32[],bytes4)", +"004f4803": "raise(uint256)", +"004fba00": "addAdminAddress(address)", +"00501553": "subHours(uint256,uint256)", +"005016a3": "checkReturnValue(bool)", +"0050945d": "referrerLevel2Ether()", +"0050a315": "getCreationTs(uint256)", +"0050b3df": "newAlex(address)", +"0052992e": "buyForInvestor(address,uint256,string)", +"00530933": "BuyAsset(uint256)", +"00541756": "jackPotB()", +"0054438d": "validateResale(address,uint256,uint256)", +"00549c2b": "mintNonFungibles(uint256,address[])", +"0055bc9c": "withdrawAtOnce(uint256)", +"0056c4c2": "getTokensForWei(uint256,uint256,uint256,uint32)", +"0056ce89": "getCryptoPicture(uint256)", +"005733e6": "EMISSION_FOR_SALESTAGELAST()", +"00573858": "setrateIco(uint256)", +"0057e18f": "setPlatformMaintenance(address)", +"0057e8d4": "restoreToColdWallet(uint256)", +"00599e65": "getTokenOrder(address,address)", +"005a7d9a": "forFund()", +"005ab803": "LogRegister(address,address)", +"005b42cb": "MainSalePrice()", +"005b4487": "totalPayments()", +"005b7ce8": "SIGMA_EXTRACTION_BASE()", +"005b9b48": "sellAnimal(uint32)", +"005bb714": "BlocksToken()", +"005c0541": "_totalActiveBets()", +"005c33e1": "receiveFunds()", +"005d204d": "dataIdentifiers()", +"005e885e": "getSigners(uint256,uint16)", +"005ef4ec": "setReservedTokensList(address,uint256,uint256,uint256)", +"005f41cc": "create(address,uint256,uint256,uint256,bool)", +"00601801": "setCCH_edit_4(string)", +"00601d6c": "board(uint256,uint8,uint8)", +"00603126": "computeNodeId(bytes32,bytes32)", +"00604854": "FreePPCoin()", +"0060c778": "removeCompany(bytes32)", +"00613e27": "register(address,uint8,uint16,address)", +"0061c78e": "PayoutIncreased(uint256,uint256)", +"0061ebed": "TransactionFeeChanged(uint256)", +"0062c8cb": "canCallWithNoOne()", +"00634064": "Lescoin(address,address)", +"00639319": "Milestone_BankLicenseSuccessful(string)", +"006409c4": "Signed(address,uint256,uint8,bytes16,bytes)", +"0064575f": "shiva()", +"0064b1f8": "gameNum()", +"0064d618": "add_referral(address,string,uint256)", +"0065318b": "dividendsOf(address)", +"0065d700": "getTileFromBattleboard(uint16,uint8)", +"0066753e": "removeCertifier(address)", +"00675149": "isGroupExist(uint256,uint256)", +"0067a9fb": "BrokerImp(address,address,uint256,address,uint256)", +"0067ba69": "FT_TOKEN_SALE_CAP()", +"00686741": "registerProxyFor(address)", +"00691967": "SUPER_HERO_MULTIPLIER()", +"006932bb": "whitelistAllAddresses()", +"0069a132": "AshenVoid()", +"006a003e": "planetCordinates(uint256)", +"006a6ef6": "create(address,address,address,address,address,address,address,uint256)", +"006ac4bf": "findNextMonth(uint256,bytes2)", +"006ae9d5": "HopeToken()", +"006b1fd1": "purchasedCount()", +"006bcb71": "witness(bytes32,address)", +"006c10e8": "trackPurchase(uint256,uint256)", +"006c2abc": "privateSaleEndDate()", +"006c81d3": "isAllocated()", +"006cfea8": "_delegateAssetOwnerAdded(bytes32,address)", +"006d96e0": "hasVaultAccess(address,address)", +"006ddae3": "changevotePrice(uint256)", +"006e3a1d": "exitOverPlayer()", +"006f91d2": "RiskPrice(uint128,uint128,uint128,uint128)", +"006fbd88": "changeSellGenesPrice(uint256,uint256)", +"00703d48": "crearCelda(uint256,uint256,uint256,uint256,uint256,uint8)", +"0070c3b3": "Proxy(address)", +"0070c537": "increaseBid(uint256)", +"007188d3": "FAOC()", +"0072615c": "claimedBoards(uint256)", +"00728f76": "vestingAmount()", +"0072d7b5": "addressAdded(address)", +"00732113": "setHolderInformation(address)", +"00739f2a": "changeStartDate(uint256)", +"0073c769": "disableTime()", +"0074477d": "listMultipleItems(uint256[],uint256,address,bytes32)", +"0075a317": "mintTo(address,string)", +"00761731": "createContract(bytes32,uint256,uint256,uint256)", +"00774360": "deploy(bytes)", +"00797f77": "has_donated(address)", +"0079efb0": "withdraw1()", +"007aa091": "san_whitelist(address)", +"007aaac9": "sisterCheckPrice(uint256)", +"007b2a03": "GoldTokenERC20()", +"007bd509": "generalTerms()", +"007c197d": "ISE()", +"007cb3fb": "updateOraclizeGasPrice(uint256)", +"007cc224": "RESERVED_TOKENS_FOR_PLATFORM_OPERATIONS()", +"007d8051": "issueAndFreeze(address,uint256,uint256)", +"007e3dd2": "isComptroller()", +"007e5d08": "updateAvailable()", +"007e9355": "GetAllChallengesByAUser(address)", +"008000d6": "configSale(uint256,uint256,uint256,uint256)", +"008066b6": "doftManaged()", +"0081d6e5": "updateGravatarImage(string)", +"008201e7": "TokenSold(uint256,uint256,uint256,address,address,string)", +"00821b81": "bonusCalculation(uint256)", +"00821de3": "parentAddress()", +"00822599": "deleteMasternode(uint256)", +"008250e5": "fortune_new()", +"00837b15": "balanceEth(address)", +"00849f88": "changeFundCollection(address)", +"0084dbf5": "ProofOfEtherDelta()", +"0084fe51": "Exercise(uint256,uint256)", +"00851303": "tokensForSiteReg()", +"008557d2": "Buy(uint32,bool,bool,address)", +"0085c647": "setPreICOEndDate(uint256)", +"00862c3c": "areTokensUnlocked()", +"00865f92": "parseJsonArrayAndGetFirstElementAsNumber(string)", +"0086969f": "dissalowFreezing(address)", +"0086bb3e": "teamUnlockedAfterCliff()", +"0086ce4d": "LogUpdatedLimitPerDay(uint8,uint256)", +"00873367": "comparisonchr(string)", +"00873c97": "CLPContractToken()", +"00882097": "EtherDeltaDeposit(uint256)", +"00886980": "LogClaimReward(address,uint256)", +"0088fca8": "start_go_quiz(string,string)", +"0088fed7": "addIndex(address,address)", +"008a3ca1": "reverseSplit(uint8,bytes6,uint8,uint32)", +"008a5c23": "getCurEarlyIncomeByAddressRound(address,uint256)", +"008a706b": "Primal()", +"008a745d": "claimDividendShare(uint256)", +"008ad306": "changeLockCostPerHour(uint256)", +"008bdd13": "isWithinSaleTimeLimit()", +"008bed3e": "getAgreementCount()", +"008c1b28": "POSTSALE_START()", +"008c3215": "addReplies(address,address[],string,string)", +"008c8920": "currentType()", +"008ca816": "isSalePaused()", +"008cbc8c": "oraclize_query(uint256,string,bytes[4])", +"008df454": "ratio(uint256)", +"008e0f1b": "getTeam(uint256)", +"008e6865": "buyTicket(uint256,uint256,address)", +"008e8135": "setProviderRateHistory(uint256,uint256,uint8,bool)", +"008f7cc2": "requestLoan(bytes8,uint128,address,address,address,uint256,uint64,bytes)", +"008f8b35": "currentRoundInfo()", +"008fcc94": "stageEndDate(uint8)", +"00903c69": "Kether()", +"0090e9c2": "transferBonuses(address)", +"00918c7b": "icoPeriodTime()", +"0091d862": "Minaxis()", +"00922db6": "secondWeekBonusInWeek()", +"00923f9e": "tokenExists(uint256)", +"0093703c": "bankConfirm(address,uint256)", +"0094151b": "setPurchasable(uint256)", +"0095716b": "crownBalanceOf(address)", +"00961320": "stringToUint()", +"0097130e": "_realBalanceOnEther()", +"00971a30": "court()", +"00975ba6": "_sendP3D(address,uint256)", +"0097b607": "validRareId(uint256)", +"00983401": "setAuthor(string,string,address,uint256)", +"00987265": "migrateThroughAllForks()", +"0098728f": "buyXaddrForContract(address,uint256)", +"009888ce": "calcNextPrize()", +"00988a16": "EthMinContributionUpdated(uint256,uint256)", +"0098fe2b": "refundWhite(uint256,uint256,uint256,uint256)", +"00991d8e": "setMakeFee(uint256)", +"0099d386": "enableTrade()", +"009a1faf": "getSumOfGamblingPartiesBonusPool(uint256)", +"009af857": "setnextRoundId(uint256)", +"009b38fa": "canBeFinalizedNow(uint256)", +"009b9369": "getVoteNumber(uint256)", +"009ca5e8": "maxTokenWinValue()", +"009e2297": "SetFreeDCT(uint256)", +"009f9262": "setEthPrice(uint256)", +"00a0190e": "BIDDING_DURATION()", +"00a051ca": "FiCoinFundDeposit()", +"00a09a7a": "devTokensToken()", +"00a0d28f": "batchExecute(uint256[])", +"00a13901": "burnRemains()", +"00a16cab": "checkCutoffsBatch(address[],bytes20[],uint256[])", +"00a18b30": "setTeamAddress(address,address,address,address,address)", +"00a219f4": "payForDemocracy(bytes32)", +"00a22ee4": "EXOToken(address,address,address,address,address)", +"00a3216c": "getNextDepositBlockIndex()", +"00a32af6": "AIRDROP_WALLET()", +"00a35aa2": "deleteBoolValue(bytes32)", +"00a470d0": "doInvite(uint256,uint256,uint256)", +"00a4b146": "SDCToken()", +"00a53598": "emergencyToggle()", +"00a58a2a": "Coffee()", +"00a5e715": "TripCoinTeamSupply()", +"00a626f6": "getACLRole7123909213907581092()", +"00a676f9": "getExists(bytes32)", +"00a6dec6": "setPayerPercent(uint256,uint256)", +"00a70e03": "priceOfTicket()", +"00a7d6b3": "checkTransferFromToICAP(address,bytes32,uint256)", +"00a7fdfc": "bids_count()", +"00a81ef6": "emitRoleRemoved(address,uint8)", +"00a8efc7": "subBalance(uint256)", +"00a8f276": "last_transfer_state()", +"00a94b6e": "oraclize_query(uint256,string,string[5],uint256)", +"00a9f0d4": "getDayRestDepositLimit(uint256)", +"00aa21e6": "transferFromVault(bytes32,address,address,uint256)", +"00aa25b2": "_isValidAddress(address)", +"00aac98b": "Griefing(uint256)", +"00ac4663": "getWarrantyQuote(string,address,uint256,uint256,uint256)", +"00ac77a0": "ownerSetCanBurn(bool)", +"00ad3a23": "RELEASE_PERIODS()", +"00ad800c": "name(uint256)", +"00ad8035": "SwingerTokenSPICO()", +"00ad861f": "README()", +"00ad8b69": "releaseVestingAllocation()", +"00adc382": "addressHash(address)", +"00aea59b": "reviewAudit(uint256)", +"00aec05d": "BEECASHBACKHOME()", +"00aeef8a": "deposit(uint256,uint256,uint256)", +"00af4274": "getTokensForEther(uint256,uint8)", +"00af9811": "checkRedemptionFulfilled(bytes32)", +"00afd295": "getAllCellInfoFrom_To(uint256,uint256)", +"00afdcef": "ELink()", +"00b08526": "GXCH()", +"00b172d7": "buyTokensForProposal(uint256,address)", +"00b23740": "VersusArenaToken()", +"00b2516d": "vetoMotion(uint256)", +"00b34747": "contractInitialized()", +"00b37044": "totalDonated()", +"00b3c619": "VoteSvp001(address,uint256,uint256)", +"00b3c91b": "purgePack(uint256,uint256)", +"00b44750": "acceptMembership(address,uint8,uint256,address,uint256)", +"00b5152b": "VibeXChainToken()", +"00b526e4": "_sendTokensManually(address,uint256,uint256)", +"00b5277a": "checkSell(uint256)", +"00b55554": "emergencyDropEth()", +"00b56aa7": "emitSynthRemoved(bytes4,address)", +"00b5988e": "lockTournament(uint256,bool)", +"00b5b223": "computeResponse(uint256,uint16)", +"00b6849f": "airDrop(address[])", +"00b6b707": "accept(uint256,address,uint256)", +"00b76307": "ChangePrivilege(address,bool,bool)", +"00b767fa": "EventAddAdmin(address,address)", +"00b79dd9": "taxlvlEconomy(string,string,string,string,string)", +"00b7f20a": "isDebtor()", +"00b8a73c": "IntegrativeWalletToken()", +"00b9189d": "setPreIcoContract(address)", +"00b9840a": "DBDHToken()", +"00b99f8c": "view28()", +"00b9eb8b": "Coinchangex(address,address,uint256)", +"00ba092c": "is_current()", +"00ba3e50": "setProductAttributes(string,uint256,uint256,string)", +"00badc85": "getcvotesid(string)", +"00baea15": "pastOneDay()", +"00bbec1c": "payServiceProvider()", +"00bc83a9": "xToken(address,string,string,uint8,uint256)", +"00bca785": "state_of(address)", +"00bcb883": "ProposalAdded(uint256,address,string,uint256)", +"00bd35b8": "EventAddToBattle(address,uint64)", +"00bd6f4c": "transferToAddress(address,uint256,bytes,bool)", +"00bde030": "getDurationS()", +"00bdfbcd": "installed()", +"00c023da": "revokeAttribute(address,bytes32,bytes)", +"00c17ee4": "setConfig(uint256,uint256,string,string,uint256,uint256)", +"00c1e956": "addressFundBounty()", +"00c2943c": "declareWinner(uint256)", +"00c2b78e": "voteFor(uint256,uint256)", +"00c33731": "prepair(address)", +"00c42173": "winnerDeterminedDate()", +"00c43503": "totalReturns()", +"00c4cefa": "toKeyValue(int256,string)", +"00c56675": "setNegativeGrowth(int256)", +"00c5f509": "preICOSupply()", +"00c61e93": "hRCoin()", +"00c721ab": "setHand(uint256)", +"00c822fb": "oraclize_query(string,bytes[2],uint256)", +"00c8bb45": "addMeleeParts(uint8[])", +"00c90ac8": "AutoCoinICO(uint256,uint256,uint256,address)", +"00c988e8": "crowdsaleConcluded()", +"00c99206": "setIdentifier(bytes32)", +"00c9c8e7": "_emitFeeSet(uint256,address)", +"00cab8b1": "lockAddressValue(address,uint256)", +"00cae5df": "solve(uint256,bytes32)", +"00cb1ae4": "methodThatThrows(bool)", +"00cb41e3": "getWithdrawableDates()", +"00cb527f": "miningFive()", +"00cc15b0": "lengthEncode(uint256)", +"00cc48a6": "updateNameIP(string,string)", +"00ccbc68": "firstRedemptionRequest()", +"00ccfdab": "removeForgivedChar(uint256,string)", +"00cdbc1f": "changeHash(bytes32)", +"00cde2bb": "releaseAccount(address,address)", +"00ce2057": "triggerPayment()", +"00ce4462": "register_with_node()", +"00ce8e3e": "getUsers()", +"00ce9f8a": "getPeggedTokenValue(address,address,address)", +"00d11245": "Mallory(address)", +"00d17799": "defaultCreatedCount()", +"00d2c31d": "getHashSignatures(uint256)", +"00d30eb9": "firstWeekPreICOBonusRate()", +"00d32a75": "TransferDFN(address,address,uint256)", +"00d357d1": "CustomcoinCrowdsale(address)", +"00d3f51a": "VirtualRealityChain()", +"00d4b768": "currentMideTokenTime()", +"00d4b959": "ico1total()", +"00d52342": "loseGame()", +"00d56d71": "StageTwoEnable()", +"00d5da02": "setTokenDescription(string)", +"00d7b3a9": "Exoso()", +"00d7e9cf": "landPricePrevious()", +"00d7f5d8": "Human1StandardToken(uint256,string,uint8,string)", +"00d80e07": "getGuardianSale(uint256)", +"00d84fd8": "remove(uint32)", +"00d9694c": "setBonusRound3(uint256)", +"00d9f24e": "UpdateNumPlayers(uint256)", +"00db90d1": "setCanWithdrawBeforeEnd(bool)", +"00dba80c": "mineableTokenStorageContract()", +"00dba864": "TOKENOPSPLATFORM_JOINTTOKENS()", +"00dbeb31": "getPromoCodeForEther(bytes16)", +"00de1eb4": "cofoundersSupplyRemaining()", +"00de8393": "SetLimit(uint256,uint256)", +"00dee43f": "initMinting()", +"00df415e": "preSaleZxcCap()", +"00dfafa4": "addMarket(address,uint256,uint256,uint256,uint256)", +"00dfd21a": "getUserDocId(address,uint32)", +"00dff399": "Fibonzi()", +"00dff60a": "partnerPreICOBonus(address)", +"00e063bc": "AddressQuery(address)", +"00e0c53f": "hold()", +"00e11919": "setClamTax(uint8)", +"00e1986d": "grantVestedTokens(address,uint256,uint64,uint64,uint64)", +"00e29488": "selfRegisterDINWithResolver(address)", +"00e31614": "modifyGuess(uint32,uint64,uint64)", +"00e37634": "batchRefundzFixed(address[],uint256)", +"00e38410": "getVotingMetadata(uint256)", +"00e43ee9": "setMigrationStatus(uint256,address)", +"00e46700": "setMinimumPassPercentage(uint8)", +"00e4768b": "setPrice(address,uint256)", +"00e4778a": "addAccessoryIdMapping(address,uint64)", +"00e4fc14": "withdrawNetfRevenue(uint256)", +"00e520d0": "_emitSkillEvaluated(address,address,uint8,uint256,uint256,uint256)", +"00e5fc5f": "rawVotes(address)", +"00e610fc": "passwordMint(address,uint256,bytes32)", +"00e62620": "zoDailyLimit()", +"00e64f6d": "regularDonations()", +"00e6abbe": "EggFactory(address)", +"00e6b9f8": "MetalToken()", +"00e756cc": "roleAddressAliaser()", +"00e7d289": "registerListening(address)", +"00e8516a": "buySamples(uint256,address)", +"00e85279": "ownerLock()", +"00e893ce": "crowdsaleTokenPriceDenominator()", +"00e97827": "percentRake()", +"00e9c006": "deleteTransaction(uint256)", +"00ea11ec": "calcCakAmount(uint256)", +"00ea3146": "postGood(bytes32,uint256)", +"00ea81c0": "mint(address,uint256,string,string,bytes32[],bytes32[])", +"00ea8737": "myTickets()", +"00ead724": "Ticket(uint256,address,bytes3)", +"00eaedc8": "retrieveVanityForWallet(address)", +"00eb52f2": "setIsActivated(bool)", +"00ebc96e": "setCrowdsaleEndTime(uint256)", +"00ed015b": "setETH(address,uint256)", +"00ed2592": "sendEvents(address,uint256,uint256)", +"00efaa75": "tokenFinishMinting(address,address)", +"00f052f6": "getBidByBidder(address,uint256,address)", +"00f12159": "SpectrumNetworkNetwork()", +"00f17754": "accountAt(int256)", +"00f1c7ec": "setAllocationFee(bytes32,uint256)", +"00f29d55": "isOrdered(address,bytes32)", +"00f2c41b": "calculateTotalPayoutAmountAndCommission()", +"00f31e76": "isPresent(bytes32)", +"00f380f4": "communityFund()", +"00f3e717": "mrate()", +"00f40839": "LogTowncrierCallback(uint64,uint64,bytes32)", +"00f43f6d": "Simple_Claimable_Temporized_Stake()", +"00f45438": "createTokenToMarket2019()", +"00f49203": "Hard_Cap()", +"00f545c6": "addressBelongsToAccount(address,address)", +"00f54f0a": "Wallet2()", +"00f5544f": "openGame(uint256)", +"00f55d9d": "destroy(address)", +"00f5822c": "changePinakion(address)", +"00f62717": "setMockedBlockTime(uint32)", +"00f64e66": "StakePoolICO()", +"00f666d4": "QueueManager()", +"00f6ca59": "runCredits()", +"00f714ce": "withdraw(uint256,address)", +"00f733e9": "pieceForSale()", +"00f784a4": "OrderAdded(address,address,uint256,uint256,uint256)", +"00f7c5be": "unregisterAddress(address)", +"00f821a7": "addMintContract(address)", +"00f9ac78": "setVoteFactory(address)", +"00fa081a": "multiplicator()", +"00fa7be5": "EnterToken()", +"00fac74a": "salesdeadline()", +"00faf4dd": "getTokenDivisor()", +"00fca46f": "initialAuctionEndTime()", +"00fdc73f": "currentMinPurchase()", +"00fdd58e": "balanceOf(address,uint256)", +"00fe03e3": "icoSoftCapInWei()", +"00fe4789": "batchFillOrKillOrders(uint256[],bytes[])", +"00fe9590": "getMaxInt64()", +"00fec4ba": "afterForkBlockNumber()", +"00fece08": "giveDown(address,address)", +"00ff2fb1": "log_2(uint256)", +"00ff6262": "DefensorWallet(uint256,string,string,uint8)", +"010066ad": "joinWhiteList(address)", +"01008275": "addPersonalCap(address,uint256)", +"0102305b": "logGameData(bytes32[],bytes32[],int256[],uint8,bytes32,bytes32)", +"01024700": "OnePhaseAuction()", +"0102fcfc": "distributeOwnership()", +"010342f4": "averageSalePrice()", +"0103c92b": "userBalance(address)", +"01044632": "setDevelopersTokens(uint256)", +"0104855f": "mctTotalSupply()", +"01056361": "setupFunding(uint256,uint256,address)", +"0106172a": "invalidEarlyPurchaseIndexes()", +"01061ae1": "removeArtworksByString(string,uint32)", +"010648ca": "setDocument(bytes32,string,bytes32)", +"01067543": "getParentCount(address)", +"01068767": "ABL(address,address)", +"0106bc8f": "PVE()", +"010731c0": "sendCryptedHand(bytes32)", +"0107a4eb": "XRRfrozen()", +"0107a8df": "withdraw_bonus()", +"01080c6f": "activateTokensForArbitration(uint256)", +"0109057e": "WIZISHOPPINGCOIN()", +"01090c4e": "_removeProxyManager(address)", +"01090c9e": "PowerOfPutin()", +"01095962": "oraclize_setCustomGasPrice(uint256)", +"0109f22e": "CrowdSale()", +"010a38f5": "getTokenId()", +"010a7d65": "tryTransfer(address,uint256)", +"010abbd0": "getCardOwner(uint256)", +"010ae545": "creditTokens()", +"010afc20": "claimWrappedContractAdmin()", +"010b66de": "mainSale_Cap()", +"010b8701": "hasSubstring(string,string)", +"010ba4e2": "balanc()", +"010bd255": "DPNToken(address,address)", +"010cbd30": "_triggerPVPSignUp(uint32,uint256)", +"010cc97c": "transferMarketIncentivesFund(address,uint256)", +"010d214e": "WithdrawProfit(address,uint256)", +"010d2446": "getProblem(uint256)", +"010d3bf6": "buyUsingRefBonus(address,address)", +"010dbfec": "sell(uint256,bool)", +"010e3964": "mintTokenForPreCrowdsale(address,uint256)", +"010e3c1c": "setInflationChange(uint256)", +"010e8209": "admin(address,uint8)", +"010f7735": "burnToken(uint256,string)", +"0110ea76": "TanterX(uint256,string,uint8,string)", +"01114d74": "getCCH_edit_33()", +"0111ae8a": "maximumValueAfterGuaranteedPeriod()", +"01122ddb": "BonusEnrolled(address,uint256,uint256)", +"011285da": "multiplication()", +"0112e2c4": "CotteToken()", +"01132b70": "setXTVNetworkEndorser(address,bool)", +"0113b261": "getNumberOfShareHolders(uint256)", +"01146844": "loadFund()", +"0114af17": "investment_address()", +"0115a2f2": "_packAddressAndFunctionId(address,address,bytes4)", +"01169399": "createEthTknDelegation(address,address,address)", +"0116bc53": "CostChip(uint32)", +"0116bfc0": "BuyUpgrade(uint256)", +"01172005": "affiliateContract()", +"011721ad": "getValidation(address,uint256)", +"01173a74": "mintToken(address)", +"0117b324": "addTestimonial()", +"0118251c": "getHighWinPercent(uint256)", +"011847a2": "inviteReward()", +"011857d0": "bntConverter()", +"011879db": "createAuction(uint256,uint128,uint128,uint128)", +"0118895c": "reservations(address,uint256)", +"0118e662": "SiekechuCoin()", +"0118e686": "isCrowdsaleActive()", +"0118fa49": "create(uint256,string)", +"0119ada7": "eliminate(address)", +"011a44bf": "isAllFrozen()", +"011a8eb7": "DrawPrepareEvent(uint256)", +"011aab02": "Oculta(uint256,string,string)", +"011afdd7": "hello2()", +"011b1a7b": "setCrowdsalePrice(uint256,string)", +"011b29e3": "changeCourse(uint256)", +"011bc2e1": "calculateWinners()", +"011c3d06": "getCurrentStats(uint256)", +"011ce353": "OwnerRecall(address,uint256)", +"011d07c0": "getMyIdeas()", +"011d0b58": "buyListing(bytes5)", +"011d79ca": "CrowdsaleEnabled()", +"011db570": "calculateObtained(uint256)", +"011de7aa": "intervalAtTime(uint256)", +"011e0162": "Flercoin()", +"011e6492": "checkSuccess()", +"011eb18c": "removeAddressFromOperators(address)", +"01201c0b": "getTheTokens()", +"01209d09": "updateVaults(address,address)", +"0121683f": "createAuction(uint256,uint256)", +"01216f05": "calcEthReceived(uint256)", +"0121b93f": "vote(uint256)", +"0121be14": "_createCard(address,uint16)", +"01233474": "saleInProgressB()", +"012397ff": "firstroundprice()", +"01239adf": "maxPos()", +"0123aff4": "BurnCoinToken()", +"0124188d": "CAIRToken()", +"01250e4d": "CraigGrantEatDick()", +"01253fbf": "threshold1()", +"0125ae62": "setMeterPoint(int256,address,int256)", +"0125d7c8": "IPAYTOKEN()", +"0126b8b6": "batchAllocateTokensBeforeOffering(address[],uint256[])", +"01272c2c": "canExecute(uint32)", +"0127eb0d": "angelAdminAddress()", +"01281641": "OfferCanceled(uint256,bytes,address)", +"01281867": "keccak256calc(address)", +"01284ad4": "removeAddressFromPrivateWhiteList(address)", +"012874a3": "EthsMePresale(address,address)", +"01289e3a": "AvenceToken()", +"01293b5c": "defaultURIEnd()", +"012a08f8": "_vote(uint256,bool,address)", +"012aa25e": "releaseTokens(string,address,uint256)", +"012aa809": "InvalidCoinUsage(string)", +"012b1f73": "announceEndOfGame()", +"012bac23": "addCoinAllowance(address,address,uint256)", +"012beac9": "vendorRegistry()", +"012cd104": "LoveCrowdsale()", +"012d61e1": "buyRedirect()", +"012defec": "harvests(bytes32)", +"012ea37c": "arrangeFreePoints(uint256,uint256,uint256,uint256)", +"012f52ee": "escrows(uint256)", +"012fd089": "EscrowAccountCrowdsale()", +"012fec73": "KakushinToken()", +"0130371a": "MAX_SUPPLY_NBTOKEN()", +"01303778": "refreshMonarchyGamesReward()", +"013054c2": "redeemToken(uint256)", +"01307338": "dispatchRewardToken()", +"013130c0": "maximalInvestmentTimeTreshold()", +"01326c34": "clearAddresses()", +"0132cc82": "tokenFounderLockTime()", +"0133311b": "deleteLockTime(address)", +"01339c21": "launch()", +"0133db3a": "nameOf(uint256,address)", +"0133e1fa": "RunchuToken(uint256,string,uint8,string)", +"01340592": "MAX_CONTRIBUTION_USD()", +"01345514": "BJLToken()", +"013459ca": "getTokensForGraphenePower()", +"013512e3": "CABtoken()", +"0136356d": "unregisterAddresses(address[])", +"01365406": "deathData_f19()", +"01367751": "PryzeSale(address)", +"01372911": "throwsWhenActivatingBeforeDeployingANT()", +"0138aac1": "getUserBalanceOnToken(address,address)", +"0138e31b": "_jAdd(uint256,uint256,uint256,uint256)", +"013953a6": "amountForRefundIfSoftCapNotReached()", +"01395d33": "tokenPriceInWeiForDay(uint256)", +"0139caad": "payout(address,uint256,uint256,bool,uint256)", +"013a0e9b": "pairwiseOr(uint64)", +"013a83f1": "beat(uint256,bool,uint8)", +"013a9c50": "updateWallet(uint256,uint256)", +"013b490c": "updateDaoAddress(address)", +"013cf08b": "proposals(uint256)", +"013d48bd": "getGuessStatus(uint256)", +"013d64bd": "setCanCall(address,address,string,bool)", +"013dbf17": "crowdsaleProgress()", +"013e5415": "getGoldDataInitialized()", +"013e7c35": "getUrlCountOf(address,address)", +"013ed428": "author1()", +"013eebd7": "getmaxcardcount()", +"013efd8b": "tokenToEthSwapOutput(uint256,uint256,uint256)", +"013f83c9": "createTeam(address,uint32[])", +"013f84fa": "getAllNumberOfBets()", +"013fc2a3": "SmillesCoin()", +"0140e359": "stand(uint256,uint8[],bytes32,uint8,uint8,bytes32,bytes32)", +"0140ea82": "setNormalRoomMin(uint256)", +"0141e90a": "ICOaddress(address)", +"01429244": "getVendorApplicationsCount(string)", +"0142b8d1": "makeMerkle(bytes,uint256,uint256)", +"0142c8de": "currentPeriodRate()", +"0142c9ae": "isSoleout()", +"0142d43e": "notHungry(uint256)", +"0142d7b4": "authorizedBurnTokens(address,uint256)", +"0142f904": "CalculatePriceofRigs(uint256,uint256,uint256)", +"0143279c": "whitelistTicket(address)", +"014345c8": "SENDER_BALANCE()", +"01447eba": "disableCrowdsale()", +"0145e333": "init(address,address,address,uint256,uint256)", +"014647f4": "approve(address,bytes)", +"0146705b": "approvedRatio(string)", +"0146d0ca": "sendVote(string)", +"01491f09": "baseRateInCents()", +"01492a0b": "matchingEnabled()", +"0149ae4b": "finalizeExit(uint256,bytes32)", +"0149eea0": "view_get_Treasure()", +"014a7453": "getPI_edit_22()", +"014a897d": "Token_2()", +"014b0732": "validateTrade(address,address,address)", +"014bed81": "setAmountToKoikeToken(uint256)", +"014c3dbc": "current_external_block()", +"014c8ac0": "CBToken()", +"014d0f68": "hardCapHighUsd()", +"014d36f4": "Afroin()", +"014e5fde": "ARKController_1_00()", +"014e6996": "ZTF()", +"014e95ba": "rateBase()", +"014f7f22": "joinCount()", +"014fc169": "setLockToAccount(address,address)", +"015008b1": "reLoadXaddr(address,uint256)", +"01500a97": "getTokenForCommunity(address,uint256)", +"01501347": "disableRefund()", +"01502460": "freezeTransfers()", +"01509730": "userdynamicprofis2()", +"0150b530": "addressesLength()", +"015129a1": "sellPriceEth()", +"01512db1": "removeIntervalCoefficient(bytes2,uint256)", +"01515a7b": "weiToReceive()", +"01518d76": "sendQuery(uint256)", +"0151cf1d": "setVotingWinner(address)", +"01538868": "_setTokenURI(uint256,string)", +"015493b4": "setFoundationWallet(address)", +"0154d3ea": "notexistdept(string)", +"01567739": "beneficiaries(address)", +"015689c6": "testControlCreateWithParentsParentSameItemId()", +"0156b323": "destroyTokensFrom(uint256,address)", +"015773b6": "set_private_sale_total(uint256)", +"015854f8": "quoteBid()", +"0159a91d": "concatenate(string,string,string,string)", +"015a18ed": "start(bytes32)", +"015a4ead": "unfollow(address)", +"015aeda7": "setAttribute(address,bytes32,uint256,bytes32)", +"015afa55": "winnerIsB()", +"015bf264": "depositTokens(uint256,address,uint256)", +"015c1c7a": "toTokenAmount(address,uint256)", +"015cb3ff": "pauseTime()", +"015cb8cf": "baxianchain()", +"015ccd07": "DockToken(address)", +"015d200f": "lockBalanceAll(address)", +"015def53": "priceFactorC()", +"015e4f3a": "getConfigUint(int256,bytes)", +"015e52c6": "getPool(uint32,int256)", +"015f32f9": "cappedSaleStartTime()", +"015fa6c1": "setWeiCap(uint256)", +"015ff39f": "GNOSIS()", +"0160751c": "setDepositary_function(uint256)", +"01608f5f": "amountOf(address)", +"0160e2f6": "cancelOptionOrder(address[3],uint256[3],bool)", +"01612def": "additionalInternal(bytes32,uint256[])", +"0161d5f0": "createCampaign(address,uint256,bytes32,bytes32,bytes32,bytes32)", +"016211b5": "bonusAllocation()", +"01621527": "destEthDevs()", +"01623ee4": "basicRate()", +"0162827c": "bonus02End()", +"0162f799": "getPrivatePresaleFundersCount()", +"01637ff4": "getAccessory(uint256)", +"0163d8ff": "MostValuableCoin()", +"01644ea7": "getSimple()", +"016474ce": "withdrawalRound(address,uint256)", +"01655e31": "CollectibleBidEntered(uint256,uint256,uint256,address)", +"01659863": "_0xBitcoincashToken()", +"01665393": "BLOCKRADIO()", +"016774e9": "donatetokens(uint256)", +"0167eb85": "stone()", +"01681a62": "sweep(address)", +"016899de": "depot()", +"0168e2e3": "JonsCoin()", +"0168f063": "tokenAmountOf()", +"016a8cf6": "topUp(address,uint32,uint192)", +"016aba15": "setDividendTransactionNumber(uint256)", +"016b0882": "Cst()", +"016c6601": "_receiveDeposit()", +"016d5807": "_mint(address,uint256,uint256,uint256)", +"016d60b3": "buyStoreCore(uint256,uint256,uint256)", +"016d7c83": "pauseLottery(uint8)", +"016deccc": "createContractSpecial(string)", +"016e03b1": "getItemIdToTokenId(uint256)", +"016e128b": "ProfitWithdrawn(address,uint256)", +"016ea771": "isNotCommittee(address)", +"016eb8a8": "percentage(uint256,uint256)", +"016f34ad": "callgSoftCap()", +"016fa018": "getPartnerBalance(address)", +"01725a0b": "demo()", +"01738ecd": "setCurrent(uint256)", +"0173e3f4": "addCoins(uint256)", +"0174e12b": "myx()", +"01750152": "isNode(address)", +"01769b37": "sendTokensToSeven(address,address,address,address,address,address,address,uint256)", +"0176b596": "DreamBit()", +"01770e0c": "NKTToken()", +"01775f23": "_closeBooks()", +"01778b6d": "Ynfiniti()", +"0178090c": "toSHA256(string)", +"01788d1d": "Decabes()", +"01788d56": "balanceOfTranche(bytes32,address)", +"0178b8bf": "resolver(bytes32)", +"0178fe3f": "getData(uint256)", +"017945ba": "changeDollarPrice(uint256)", +"017972af": "getNumbersFromHash(bytes32)", +"017b0d00": "highestBidForEdition(uint256)", +"017b39a7": "getMiniPoolEdit_1()", +"017bef67": "addExplorationByShip(uint256,uint256,uint256)", +"017e322c": "getCurrentGameSteps()", +"017e6f5f": "reOrganizeAuthorities()", +"017f27fc": "saleIsClosed()", +"017fa10b": "returnUint128(uint128)", +"017fa51d": "shouldRevertPure(bool)", +"017fe809": "getPower(uint256)", +"01828e61": "Quecoin()", +"01836037": "foundationBoard()", +"01838f01": "addAnimal(uint8,address)", +"0183f310": "potMembers(uint256)", +"0184e952": "award(uint256)", +"0184fc35": "crowdSaleAddress()", +"0185f409": "getInvestorAddress(uint256)", +"01863f79": "thisContactsTokens()", +"0186aa16": "OxBioToken()", +"0186c36e": "getCurrentExchageETH()", +"0187699c": "VerixChain()", +"0187a677": "bbodServiceRegistry()", +"0187e973": "PricingStrategy(uint256,uint256,uint256,uint256)", +"0188c09f": "altList(uint256)", +"0188fdef": "setMaximumBuy(uint256)", +"01890840": "MilestonePricing(uint256[])", +"0189bd41": "getProofOfPerfBlockStateState(bytes32)", +"018a25e8": "getBuyPrice()", +"018aba3f": "createPledge(address,uint256,uint256)", +"018b06ff": "isWinner(address,bool)", +"018b64b6": "AuctionCancelled(address,uint256)", +"018d3490": "assignOracles(uint256,address[])", +"018d6f7a": "showethconf(address)", +"018de5c5": "distributeCBC(address[],uint256,uint256)", +"018dfaa0": "calcCount(uint256)", +"018e13d0": "numOfCurrentEpoch()", +"018ed439": "_getTokenForType(address,uint256)", +"018f5472": "isAUser(address)", +"018fa360": "getDeposits(address,address)", +"018fbf9f": "hashAt(uint16)", +"01909317": "_storeSettingDataState(uint256,address,uint8,string,address,address,string)", +"0190b805": "editEarlyParicipantWhitelist(address,bool)", +"0190e84f": "Bitscorone()", +"0191903e": "setBlogregistry(address)", +"0191d35c": "summFounders2()", +"0191dc92": "numOfAdmins()", +"01930b6e": "darknodeDeregisteredAt(address)", +"01933c43": "TOWN_START_PRICE()", +"0194abaf": "prolong()", +"0194ac16": "BlockchainFUN(uint256,string,string)", +"0194db8e": "sum(uint256[])", +"01968a56": "mintAllocation(address,uint256)", +"01970353": "setStepOneTime(uint256,uint256)", +"01970c6b": "team_funds()", +"0197d972": "VESTING_PERIOD()", +"01984892": "name(address)", +"019859bb": "changeMembershipContractAddr(address)", +"0198632a": "getPurchasedProducts()", +"0198aa74": "firstsaleOpen()", +"01991313": "scheduleCall(address,bytes4,uint256)", +"01996951": "ethPerTransactionLimit()", +"01998ad4": "GlobalAdminChanged(address)", +"0199c7b2": "numberOfHolders()", +"019b1576": "backupAddress()", +"019b32ad": "transferToSalesPartner(address)", +"019c3f52": "newCollectible(uint256,string,uint256,uint256,uint256,int256,string,uint256,string)", +"019c5675": "BatchComplete(uint256)", +"019c920c": "setcompany(uint256,string,string)", +"019d2729": "approve(bytes)", +"019e56fd": "findCurrentFor(address)", +"019f232a": "getTask(address)", +"019f5c5b": "narcoCore()", +"019f64cc": "payBack()", +"019f80b6": "toSecond(uint256,uint256)", +"019f8e26": "AddedManager(address)", +"019fef03": "resetFine(uint16)", +"01a00216": "addMod(address)", +"01a01551": "getApprovers(string,string)", +"01a048c3": "mintLockTeamTokens(address)", +"01a08a8b": "getWorkerPool(address,uint256)", +"01a0dee1": "investorsSupply()", +"01a12fd3": "removeAlerter(address)", +"01a15ee9": "mintTokensLocked(uint256,int256,address,uint256,uint256)", +"01a1b778": "battleId()", +"01a2789e": "transferPreSignedBulk(address[],address[],uint256[],uint256[],uint256[],uint8[],bytes32[],bytes32[])", +"01a2f48a": "changeAssetPackPrice(uint256,uint256)", +"01a2f75c": "createContract(address,uint256,uint256,uint256)", +"01a340a5": "totalBoughtColor()", +"01a413b9": "bankrollAvailable()", +"01a50001": "rewardEvery100000Draw7(uint256)", +"01a521d6": "getSellerBalancesOfCurrentAuctions(address[],address[],address)", +"01a53d3b": "maximumBuyBackPriceInCents()", +"01a5e3fe": "isWhitelisted(bytes32)", +"01a682c1": "createTeam(string,string)", +"01a68a94": "donkeyCoin()", +"01a6ab93": "PassedGateway(address,uint256)", +"01a77625": "_subEth(uint256,address)", +"01a7a8c0": "batFundDeposit()", +"01a80669": "createInvestorWallet(uint256,address,uint256)", +"01a88f7d": "buySeeds()", +"01a8d07f": "addBidder(uint256,address,uint256,uint256)", +"01a93f1c": "giveAwayOwnership(address)", +"01a96b94": "set_stage_Discount(uint256)", +"01ab2a66": "getPlayer1()", +"01ab2f14": "Manus()", +"01ab9806": "BUY()", +"01ab9f19": "_safeCall(address,bytes)", +"01ad35e3": "mintTokensForCommand(address,uint256)", +"01ad3936": "assignedAmountToDevelopmentTeam()", +"01ad62a3": "getBackendWallet()", +"01ae19d6": "LogLOTTransfer(address,uint256,uint256,uint256,uint256)", +"01aef755": "setBestProbability(uint8)", +"01afd5f3": "allBalancesForManyAccounts(address[],address[])", +"01afebac": "ICOopen()", +"01b057b1": "isAdminSet()", +"01b07f75": "adjustValue()", +"01b0c649": "collect(address,address,uint256,uint256)", +"01b11792": "toggleLocked()", +"01b125e6": "resetTimer(string)", +"01b14149": "getFcontracts(address)", +"01b2320e": "getStartBlock(uint256)", +"01b2a413": "baseVerifierFee()", +"01b490ed": "CAIDToken()", +"01b54744": "setLLV_edit_24(string)", +"01b5990c": "getCreatedOn(address,uint256)", +"01b5ffcf": "addVesting(address,address,uint256,uint256,uint256,uint256,bool)", +"01b6b523": "viewMyContribution(bool)", +"01b74d73": "TEAM_SHARE_PERCENTAGE()", +"01b78b12": "BitcoinMoon()", +"01b852c9": "MetadollarCrw()", +"01b869f1": "release(uint32,uint32,uint32,bytes)", +"01b8a0b9": "createTestingEnvironment()", +"01b96aaf": "waveCap2()", +"01b98853": "assetFreeze()", +"01b9a397": "setDescriptor(address)", +"01b9fe59": "testMint(int256)", +"01ba2bd5": "Request_Airdrop()", +"01ba6805": "loseEth(address,uint256)", +"01baa2e7": "validateCap()", +"01bb4edf": "RAIOCO(uint256,string,string)", +"01bb67a8": "InvestCancelEvent(address,uint256)", +"01bb7e5a": "getLockerDetails(address,uint256)", +"01bb85a4": "__startBlock(string)", +"01bbb8fa": "verifyTimelock(bytes32,uint256,address,address,uint256,uint256,bytes32,bytes,bytes)", +"01bbc3f5": "stopWhitelistReservetion()", +"01bc237d": "researchers(address)", +"01bc43a0": "sha(uint128,bytes32)", +"01bc45c9": "_admin()", +"01bc757a": "getstudentInfo(uint256)", +"01bc9533": "totalTokensGenerated()", +"01bd4051": "disown(string)", +"01bea2bd": "Mountain()", +"01beb7cf": "setBadgeLevel(bytes32,uint256,string,string,bytes)", +"01bebf36": "updateAirdropStageState(string,bool)", +"01bf6648": "removeFromWhiteList(address)", +"01c0c6bc": "_processRefund(bytes32)", +"01c11d96": "MAX_PRICE()", +"01c1c877": "setChampion(uint256)", +"01c1de96": "fechVoteInfoForVoterByStage(address,uint256)", +"01c24a90": "minimum_balance()", +"01c28786": "date_end()", +"01c2b6f5": "commitDeadline(bytes32)", +"01c355df": "appSelectors(bytes4)", +"01c432ce": "wrongClaimerOrUnsetInManager()", +"01c4a07e": "convertDeposit100to70(address)", +"01c516b1": "crowdsale_end()", +"01c543c2": "claimOreOnlyFromAssetId(uint256)", +"01c5b2f0": "compressBoard(uint256[81])", +"01c64ce8": "maxTxGas()", +"01c68b4e": "addSrNumberOfbook(uint256,uint256,uint256,uint256,uint256)", +"01c69452": "brandAccounts(uint256)", +"01c6adc3": "transferFrom(address,uint256)", +"01c6f167": "auctionsRunByUser(address,address)", +"01c7cb58": "migrateMileageLeader(uint8,address,uint256)", +"01c835e5": "returnRemainRewardToken()", +"01c8c9d4": "getCurrentBonus(bool)", +"01c96df6": "ZeusShieldCoin()", +"01ca1d72": "getTransformRate()", +"01cb0261": "getWeightedVote(bytes20,uint256)", +"01cb3b20": "checkGoalReached()", +"01cb63e8": "arrayIndexOutOfBoundsDynamic(uint256)", +"01cceb38": "setExpiry(uint256)", +"01cdc371": "getCBATransactionMessageLength(address)", +"01ce5e75": "fundsCombinedValue()", +"01ce616f": "setMaxweiAmount(uint256)", +"01cff174": "getNumberOfAvailableStartTickets()", +"01cffa17": "getTokenWithBonus(uint256)", +"01d09a3c": "setCallbackGas(uint256)", +"01d0ac0b": "requestAccess(address,address)", +"01d1c7fd": "BTCS_ETHER_CAP()", +"01d223c1": "set_modified_weth_address(address)", +"01d2db89": "isValidKyc(address)", +"01d37b0c": "changeHiddenValue(string)", +"01d4277c": "thisisalsofind(uint256)", +"01d42a9c": "closeChannel(address,uint256)", +"01d490fd": "registerVestingSchedule(address,address,uint256,uint256,uint256,uint256)", +"01d4fb7c": "fundsKeeper()", +"01d511f1": "request(string,string)", +"01d5c488": "gemCriticalRateConversion()", +"01d6e35b": "unfreezeTeamTokens(address)", +"01d78a8b": "alterTotalSupply(uint256)", +"01d81121": "allocateCreationInvestmentingToken(address[],uint256[])", +"01d81a50": "slice(bytes,uint8,uint8)", +"01d8715f": "replaceManager(address,address)", +"01d8ce92": "KpopArena()", +"01d90bbc": "getCurrentUserMaxPurchase()", +"01d92dc8": "unsoldAllocatonScheduled()", +"01d97f08": "setMapping(bytes32,bytes32)", +"01d98d44": "changesDenied()", +"01da31ad": "_setPermission(address,address,bytes4,address,bool)", +"01da73ff": "isValidChannel(bytes)", +"01da7b31": "getBankName(address)", +"01db61e0": "HARD_CAP_EUR()", +"01dbdf44": "priceAt(uint256,uint256)", +"01dd91c0": "force_received()", +"01dda205": "updateSoftCap(uint256)", +"01ddc95e": "getTargetBlockLength()", +"01ddfa9d": "referalFundBalance()", +"01de7a1c": "updateVendorName(uint256,string)", +"01dee025": "getTombDetail(uint256)", +"01df6885": "getTokenDetails(uint64)", +"01df7f30": "validateProposedThroneConfig(uint256,uint256,uint256,uint256)", +"01e0ba3a": "bonusAccountIndex(uint256)", +"01e11c29": "SellToken()", +"01e1bcf7": "rateIcoPreICO()", +"01e1c861": "minWeiValue()", +"01e1d114": "totalAssets()", +"01e1ecb4": "releaseTokensAndEtherForEmergencyFund()", +"01e30a7f": "bigContributionBound()", +"01e33667": "withdrawToken(address,address,uint256)", +"01e343db": "setOffset(uint256)", +"01e3d346": "create(bytes1,bytes32,uint256)", +"01e3d718": "transto(address,uint256)", +"01e40f5b": "getFeeWindowBurnTargetValue()", +"01e4741c": "Ebets()", +"01e4abc1": "setWhiteList(address,address,uint32)", +"01e5691c": "createTransaction(uint256,address,uint256,uint256,address)", +"01e56c77": "stopPayouts()", +"01e57a37": "dth()", +"01e5aa3e": "getIssuerArray(bytes32)", +"01e68cbb": "timestamp_msg()", +"01e6a70e": "EthlanceInvoice(address)", +"01e73b73": "bulkVote(uint256[])", +"01e7fefe": "addParticipant(address,uint256)", +"01e88208": "permissions(address)", +"01e8b608": "TOKEN_SECOND_EXCHANGE_RATE()", +"01e91872": "DECToken(uint256,string,string)", +"01ea6270": "setTeamTokenAddress(address,address)", +"01eb6fdd": "max(uint32,uint32)", +"01ebc88e": "pingReading(uint256)", +"01ebccb9": "activeNameOf(address)", +"01ebd36b": "enable_sale()", +"01ebebf2": "myTulips()", +"01ec0793": "profitsOf(address)", +"01ec16ef": "RulesChangedEvent(uint256,uint256,uint256,uint256)", +"01eca37c": "medalDataContract()", +"01ecaca5": "changeOVCPerEther(uint256)", +"01ed7f8b": "distribute(address,address,address)", +"01edb1ea": "dayIdx()", +"01ef6cad": "addJobContractFeedback(uint256,string,uint8)", +"01ef74f1": "tokens_rewards_available()", +"01efb6c8": "getOrderInfo()", +"01f2a2c5": "buyForBtc(address,uint256,uint256,uint256,uint256)", +"01f40a85": "issuePurchase(address,uint256)", +"01f59d16": "maxFee()", +"01f5af30": "addJobSponsorship(uint256,string,string)", +"01f6dad0": "remaining_for_sale()", +"01f6e6d5": "asignarDni(uint256)", +"01f78f43": "getFreeCHICKEN()", +"01f7e49a": "removeFromPresaleWhitelist(address)", +"01f81649": "claimBrokerFee()", +"01f865c3": "setWinPercent(uint256)", +"01f89de0": "purchaseSharesOfArtwork(uint256)", +"01f99ad7": "left9(uint256)", +"01f9a0aa": "setOraclizeQueryMaxTime(uint256)", +"01fa3e53": "addSocial(address[],uint256[])", +"01fabd75": "addArbitrator(address)", +"01fae3b6": "setTokenState(uint8)", +"01fbaf99": "totalLareSold()", +"01fc59e1": "checkId(bytes32)", +"01fce27e": "getQueue()", +"01fd1b1d": "finalizationFailHook()", +"01fd89a4": "getFlags(bytes20)", +"01fe34e3": "EWCertificationCenter(string,string,string)", +"01feeef4": "getTitleDeeds(bytes32)", +"01ff62ab": "isConcerned(uint256,address)", +"01ff8961": "getPortfolio(uint256,address)", +"01ffc9a7": "supportsInterface(bytes4)", +"0200b10d": "collectedEthers()", +"0201b5d5": "transferOverBalanceFunds(address,address,uint256)", +"0201e253": "WhoHoldsPatentFor(bytes32)", +"0202f3ea": "allowTransfersTo(address)", +"020331dd": "getFact(bytes16)", +"0203596d": "purchaseKingdom(string,string,bool)", +"0204c163": "maxFadeoutPromille()", +"0204d0f8": "unlockOwnerDate()", +"02055186": "Alexa()", +"02063d93": "calcMaxDeposit()", +"0206432d": "FlexionCoin()", +"02064b42": "consul_price()", +"02065fb8": "isLoanFunded()", +"02067e6a": "add(uint8)", +"0206deb5": "unitsLimitForCurrentSaleStage()", +"0206e79d": "decodeParamId(uint256)", +"02072579": "controllerSet()", +"02078166": "unburnedTypeTokens()", +"0207eda6": "NOVA(uint256,string,uint8,string)", +"02083e27": "REET()", +"02093ee2": "finalize2()", +"02096a8e": "amountsByCurrency(uint256)", +"02099186": "totalRise()", +"0209f982": "reminder()", +"020a0ff5": "setClaimLimit(uint256)", +"020acb6a": "round1Bonus()", +"020bdf54": "getFreeStrippers()", +"020d308d": "removeDelegate(address,address)", +"020d4786": "OmmerToken()", +"020de876": "setTakerFeeRate(uint256)", +"020df04b": "createBarCode(bytes32)", +"020df957": "setAirdropReceiver(address)", +"020e2d48": "getArrayHashLibry(bytes32)", +"020eb6e1": "createWorkOrder(address,uint128)", +"020f899a": "hybridizationPrice(uint256)", +"0210d751": "getMyGames()", +"02114111": "allowTimelock()", +"0211c4bb": "MessageToken()", +"0212d0b9": "payByTokens(uint256)", +"0212fd1f": "InternationalRapidAsset()", +"0213443c": "changeZombieCreator(address)", +"02135534": "getNinja(uint256)", +"02138563": "buyOre()", +"02140adf": "CryptoHuntersToken()", +"0214e9cf": "preIcoFinishTimestamp()", +"0216f544": "transferExecutor(address)", +"02171e7c": "largeConstant()", +"02172276": "triggerEvent(string,string)", +"02175beb": "setOzr(address)", +"0218a1c3": "setString(bytes32,bytes32,string,bool)", +"02190a52": "allowRecurringBillingInternal(address,uint256,uint256,uint256,uint256)", +"021979c3": "wlcontract()", +"021991e7": "getBetsLocked()", +"021a11d0": "setContractICO(address,address)", +"021ba8f8": "CLAWBACK_PERIOD()", +"021bb947": "burnAfterIco()", +"021bc974": "checkPoolBalance()", +"021c309a": "solveBet(address,uint8,bool,uint8)", +"021c43b4": "NBY()", +"021c7bd7": "setInspectorId(address)", +"021da58e": "initCrowdsale(uint256,uint256,uint256,address,address)", +"021dc2fc": "tokenExchangeRateInWei()", +"021dd82c": "checkNotLocked(address,uint256)", +"021e7f85": "CONTRACT_ALLOWANCE()", +"021ea45e": "claimTilesForExistingUser(uint16[],uint256,bool)", +"021efe49": "getPawnOwner(uint256)", +"021f0376": "_addAssetTo(address,uint256)", +"021f36a4": "changeResource(bytes32)", +"021fe51f": "VUPRefundedForWei(address,uint256)", +"0220611a": "timeOfLastPublish()", +"022079d9": "ecmulVerify(uint256,uint256,uint256,uint256,uint256)", +"0220a5b4": "terminate(string)", +"0220f662": "addPolicyAttribute(uint8,uint256,uint8)", +"0221038a": "payOut(address,uint256)", +"02218ad6": "desBan(address)", +"0221f2fb": "Beneficial()", +"0222f96e": "Poppy()", +"02238cbd": "_activateDevice(bytes32)", +"02238e43": "launchnewround()", +"0224dc18": "TOKEN_SALE1_PRE()", +"0224e9a7": "devFees()", +"02258730": "nodeRegistration()", +"02259b07": "setPBTTForGas(uint256)", +"02262ced": "setBackendOperator(address)", +"0226401d": "ownerTestValue()", +"02264b63": "private_withdraw(uint256,address)", +"0226a5c9": "petOnLeaderboard(uint64)", +"0226ed48": "changeGlobalAdmin(address)", +"02285548": "FarmHopeProjectToken()", +"0228e05a": "walletFromData(bytes)", +"022914a7": "owners(address)", +"02299496": "updateICOStatus()", +"0229ae31": "CosmoCoin()", +"0229b23e": "pauseSALE()", +"0229c4eb": "TransferMinimumFeeProposalAdded(uint256,address,uint8)", +"0229e448": "founderMulSigAddress()", +"022b7433": "add(bytes32,uint8,uint8)", +"022b8a7f": "getIdProject()", +"022b9735": "GetMyBalance()", +"022bc71f": "getNextCallSibling(bytes32)", +"022bd24c": "hypes(uint256)", +"022c254a": "pendingChanges(address)", +"022cabac": "CoinViewToken()", +"022e1e59": "USBEEF()", +"022e9c95": "getinverstinterval()", +"022ec936": "updatePeriod(uint256,uint256)", +"022edd35": "getActiveContracts()", +"022fc88b": "approveToken(address,uint256)", +"02300cbb": "DepositReleased()", +"0230a07c": "releaseDeed(bytes32)", +"0230d870": "tierThreeRate()", +"02329a29": "pause(bool)", +"02337657": "documentIPFSHash()", +"0233d94d": "getEscrowsByTaker(address)", +"02340ad6": "deleteVisaOffering(uint256,uint256)", +"023569aa": "MoniCoin()", +"02356ec0": "returnCoupon(address,bytes32)", +"02358773": "XFL(uint256,string,string)", +"02359fdd": "OfferingCloses(uint256,uint256)", +"02361dbc": "totalAllStage()", +"0236bb5a": "isAdminAddress(address)", +"0237ef12": "contributionInWei()", +"0238777f": "preCrowdsaleContractAddress()", +"0238b5aa": "testToAddress()", +"0238b770": "endDateICO()", +"02394872": "getLastBlockHeight()", +"02395e9b": "lpc()", +"023a624a": "right11(uint256)", +"023b011e": "getRateEth()", +"023bb74d": "DATE_PRESALE_START()", +"023c19ce": "MyWishChain()", +"023c23db": "getSize(uint256)", +"023c6042": "tokencap()", +"023c61ca": "price_agent()", +"023c8be2": "setWithdrawalAddress(address,address)", +"023d44df": "RNBlock()", +"023d6c03": "REPO_APP_NAME()", +"023e1c34": "communityContributionPercentage()", +"023e36d8": "nVotesCast()", +"023eff9f": "airdrop(uint8,bytes32,bytes32)", +"023f4147": "totalContributed()", +"023f4a66": "issueToReserve(uint256)", +"023fadda": "getRedeemedList()", +"02400845": "publish(bytes12)", +"02404bee": "crowdsaleCount()", +"02404fcb": "buyBanana()", +"0240ab3f": "finishRetrieving()", +"0240db33": "summFounders4()", +"02410cf6": "isFundReleased()", +"0241747f": "ReceivedBTC(address,uint256)", +"024187a5": "window0TotalSupply()", +"0241fb82": "returnChildForParentNew(address)", +"02421ca7": "SaddleFS(uint256)", +"0242622b": "changeMultisigAddress(address)", +"0242a5fc": "testRecovery(bytes32,uint8,bytes32,bytes32)", +"0242ba2a": "FOToken()", +"0242c430": "CreateTokenToTeam(address,uint256)", +"0242deb8": "registerIntermediary(address)", +"0242f1ef": "TonCoin()", +"0242f351": "getVote()", +"0242fc62": "voteNo(string)", +"02431422": "addSuperPlayer(address,bytes32)", +"02433d0f": "num_holders()", +"02437982": "adjustRate(uint256,uint256,uint256)", +"0243aa1b": "getCurrentNbVote()", +"02443111": "oneTrancheAmount()", +"0244ba4a": "Hubble()", +"0244eb3f": "testFundsAreLockedDuringSale()", +"0245c5c8": "importSequence()", +"02460d1e": "_emitHolderRegistered(bytes32,uint256,uint256)", +"02474718": "paydayFrequencyInDays()", +"02474c59": "myPledgeTo(address)", +"0247e02a": "subFromAddressBalancesInfo(address,uint256)", +"024800ff": "presaleWeiSold()", +"024858b1": "createTrade(bytes32,uint256,uint256,address,address)", +"02491bd5": "CryptoLottoCoin()", +"0249e64a": "CodeMailStamp()", +"024a56a4": "testIsData(bytes)", +"024adb25": "LogStateSwitch(uint8)", +"024bb1fd": "changeName(uint256)", +"024c4199": "addListener(address,address)", +"024c6def": "BONUS_ICO_WEEK_TWO()", +"024c764f": "setChallengeCooldownTime(uint256)", +"024cc06d": "updateRecipientInfo(bytes32,string,string,address)", +"024ddebe": "Error(bool)", +"024edd75": "buyHero(uint256)", +"024fcc6c": "enableService()", +"024fd650": "tokenData()", +"024fd912": "GoToken()", +"02500824": "buyDentacoinsAgainstEther()", +"025026d5": "updateEmployee(uint256,uint256)", +"02502787": "FDT(uint256,string,uint8,string)", +"0250bd2d": "unregisterName(string)", +"02521b16": "saveTxt(string)", +"0252607e": "bitcoinPublicKey(uint256)", +"0252b995": "gameStartTime()", +"025313a2": "proxyOwner()", +"0253a95a": "getMaxMerge()", +"0253e935": "setOrderListLengthFactor(uint256)", +"0253fbd1": "momFab()", +"025404d4": "amountRaisedUSD()", +"02543238": "setDiscountValueOff()", +"02548866": "TOTAL_CAP()", +"0254aa41": "CommonEth()", +"0254e687": "GodlyCoin()", +"0254ef0f": "enterMedium()", +"02550e4d": "profit(address)", +"02556de3": "updateMajorTree(bytes32)", +"02565633": "buriedSupply()", +"0256c7f5": "Afin()", +"0256e827": "enablePurchasing(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"02571be3": "owner(bytes32)", +"0257210f": "ForgeCDN()", +"02573fc2": "resetStellarInvestor()", +"0257a0c0": "onLotteryCompleted(uint32)", +"0257c48c": "meta(bytes32,bytes32)", +"02581ab3": "offerIndexedPieceForSaleByAddress(address,uint256,uint256)", +"02581cde": "refundExpiredBet(bytes32)", +"025830ac": "changedBrokerDealer(uint256,address)", +"025845ae": "thinkTankFundAddress()", +"02587586": "companyAddr()", +"025932fd": "bitikzikToken()", +"0259371c": "TTTTokenSell()", +"02593c2b": "_Split()", +"025a6f02": "OsmiumCrowdsale()", +"025abd58": "getTokenBalance(string)", +"025b22bc": "updateImplementation(address)", +"025b97bd": "getProviderAdmin(uint256)", +"025bbbe5": "newSale(bytes16,uint256,uint256)", +"025cce45": "AMULETS()", +"025cf89f": "setMigrationManager(address)", +"025dd017": "OnReceive(uint64)", +"025e029b": "buyStar(uint256,uint8,uint256)", +"025e56d3": "NeuroDAO()", +"025e7c27": "owners(uint256)", +"025e8095": "transferCell(address,uint256)", +"025ec81a": "getBytes32Value(bytes32)", +"025f9bc1": "updateTokenInformation(string,string)", +"025ff12f": "airdrop(address,address[],uint256[])", +"026164ad": "sunset()", +"026189ec": "BitRecord()", +"02618eb2": "AltCurrency(uint256,string,string)", +"0261a403": "issueDID(address,uint256)", +"0261edec": "getContractByID(string)", +"0262dc13": "claimOne(address)", +"0263379b": "bringBackTokens()", +"026345b6": "ledgerContract()", +"0264ba24": "sendValueToJackpot()", +"0265190c": "b66ReserveTokens()", +"026654bf": "PoolManager(address)", +"02667e9b": "killPay()", +"0266ba02": "list(address[])", +"0266f044": "reservePool()", +"02682ab3": "setNewWallets(address,address,address)", +"026858ea": "getRateModifierInPermilles()", +"0268ec43": "MyEtherTeller()", +"02690ef0": "setICOElePrice(uint256)", +"026993e0": "Midas(address,address)", +"026a308a": "_checkWhitelistContract(address)", +"026a9cdd": "getPotato(uint256)", +"026b1d5f": "getPool()", +"026bb254": "upVoteHouse(address)", +"026c0d8f": "RHP()", +"026d0e1c": "grantUserLicense(address,string)", +"026d19d5": "WeTestToken(address,string,string,uint256,uint256)", +"026d6a67": "setStartStopBlocks(uint256,uint256)", +"026e402b": "delegate(address,uint256)", +"026eca12": "createTapPoll(uint8)", +"026f9d56": "SOT()", +"026fcf83": "setSaleFinish()", +"026ff05e": "deleteUser()", +"02704a4d": "COIN_SUPPLY_ICO_PHASE_3()", +"027116f7": "approveNewOwnersCount()", +"027391bf": "sendMoneyBeforeEnd(uint256)", +"02742425": "preFundingtokens()", +"027471b0": "roundActive()", +"0274d5ff": "soulIsOwnedBy(address)", +"0274ea81": "jadd(uint256,uint256,uint256,uint256,uint256,uint256)", +"0276650b": "individualCap()", +"027681ab": "setJackPotInfo(uint256,uint256)", +"02780677": "LN2()", +"0278199e": "StandardToken(uint256)", +"0278bde1": "ask(address,uint256,uint256,uint256)", +"0278fa20": "TeambrellaWallet()", +"027903ef": "setReservedTokens(uint256)", +"02795b3a": "tokenMarket(address)", +"027a4425": "EthereumDiamond()", +"027a5e3f": "getLastVersion(bytes)", +"027a7ccc": "calculateFirstCut(uint256)", +"027aa9f5": "getUnits()", +"027b1fb3": "SimpleStorage()", +"027bb838": "FLTToken()", +"027bd9a8": "changeColorGreen()", +"027bfab4": "discountedIcoTokensSold()", +"027c3e08": "ControllerChanged(address)", +"027cb7c6": "clearing()", +"027e7a0f": "getTotalGamePot()", +"027ec848": "setDurationOfLock(uint256)", +"027efe2b": "makeOperation(uint32,string)", +"0280052d": "setKing()", +"028118a1": "PREBUY_PORTION_MAX()", +"02814b86": "maxETH()", +"0281b752": "admin_set_ExchangeRateInWei(uint256)", +"02825adc": "gvOptionToken30()", +"02836f24": "upgrading()", +"0283f4b4": "addPropertyForUser(bytes32,address)", +"02846858": "removeBurner(address)", +"0285d554": "transferWithEvent(address,address,uint256)", +"028780e4": "ownerWithdrawZth(address)", +"02879f9c": "addProduct(string,uint256,string,string,string)", +"02884909": "authorizedLogicContractAddress()", +"02889f26": "getCustodianChangeReq(bytes32)", +"0288a39c": "withdrawDelay()", +"0288ab5d": "TCC()", +"0288c0a0": "TransferDomain(string,address)", +"0289e966": "newVersionReleased()", +"028a582e": "findEndpointByAddress(address)", +"028a95a0": "lockRemainingTokens()", +"028ab3b1": "__get(address,uint256)", +"028ae3b7": "setAffiliateList(address)", +"028af743": "getServerCurrentMatch(uint256)", +"028b7854": "throwsSaleWalletIncorrectBlock()", +"028e10ac": "BidaCoin(uint256)", +"028e3731": "getUsersByDocHash(bytes)", +"028e6c67": "intOrRevert(uint256,uint256)", +"028ebc44": "setRegistryContract(address)", +"028fb6b8": "deleteRef(bytes32)", +"029043a4": "removeBlacklistSpender(address)", +"02911cfe": "distribute(address,uint256,uint8,uint256)", +"02917f4a": "issuePatrons(address,uint256)", +"0291b9b1": "judgeIsReachDailyLimit(uint256,int256,uint256)", +"02927d20": "setupEventsHistory(address)", +"0292f88a": "setBaseDenominationAddress(address)", +"02931e59": "getUserPower(address)", +"02932f56": "totalCampaigns()", +"0293a772": "get_sale_owner(address,address)", +"0293fafc": "ADBToken()", +"02940dbb": "Decenturuon()", +"02942724": "preservedTokens()", +"02949bff": "CampaignToken()", +"0295d71b": "currentDepositLimit()", +"02965297": "update_height(uint256)", +"0296b3a8": "STARLIGHT()", +"02978be8": "gameHostAddress()", +"0297abe5": "getLimitMaxGame()", +"02981cfe": "transferedToPool()", +"02987db8": "priceInWeiPerSatoshi()", +"02989d9f": "SellOrder(uint256,uint256,address)", +"0298d557": "isValidSignatureAndData(address,address,bytes)", +"029a258a": "claimDonations(address[2],uint256[8],uint8,bytes32[2])", +"029a8bf7": "multiAsset()", +"029ad03e": "get_nb(address)", +"029bca78": "isPremium(uint256)", +"029c19aa": "getCreditBondAddress()", +"029d1ecd": "ownerApprove(address,uint256)", +"029d4b2d": "isTimestampInsideRange(uint256,uint256,uint256)", +"029da1c4": "walletFounder2()", +"029dc6d2": "piggyToWallet()", +"029deeb0": "updateUportInfoFromOracle(string,address,address)", +"029eabcb": "contributions()", +"029f1d0e": "userName(uint256)", +"02a10d87": "getPreSaleEndDate()", +"02a182d1": "setInvestmentCapIcoPhaseTwoPounds(uint32)", +"02a1a7a8": "isReachCapped()", +"02a251a3": "votingPeriod()", +"02a2680c": "getUserWalletByID(uint256)", +"02a2c88f": "kycLevelOf(address)", +"02a2cf02": "NOK_Omnidollar()", +"02a2e105": "RYANTOKEN()", +"02a2f06e": "GetMyBet()", +"02a3036d": "init1_block_height()", +"02a4e488": "decreaseAllowanceProxy(address,address,uint256)", +"02a4e849": "getMiniPoolEdit_9()", +"02a566bd": "Woyager()", +"02a59ea3": "isEntitledForCluster(address)", +"02a5c0be": "CryptoSagaArenaRecord(address,address,uint8,uint8)", +"02a63c28": "consumeMarketOrderAsk(uint256,address,address)", +"02a6f266": "Presale(address,address,address,address)", +"02a72a4c": "tokenGrantsCount(address)", +"02a86781": "authorAddress()", +"02a8a406": "setBurnPolicy(bool,bool)", +"02aa26f6": "buySeatForEvent(uint256)", +"02aa274b": "setForward(bytes4,address)", +"02aa6318": "getDistributions()", +"02aa9be2": "unvote(address,uint256)", +"02ab4781": "reservedCoins(address)", +"02abb4c5": "Miner()", +"02ac8168": "Launch()", +"02acbaa3": "CrowdsaleMinter()", +"02acc6b6": "GNTTokenERC20(uint256,string,string)", +"02acdb44": "setAnyoneCanCall(address,bytes4,bool)", +"02ae832f": "trashTokens(address,uint256)", +"02ae8cdc": "tokenProduct(uint256)", +"02aec20d": "PrintableToken(string,uint256,string,uint256,int256)", +"02af2095": "massTransfer(address[],uint256[])", +"02b04384": "AIRDROP_ADDRESS()", +"02b09ac5": "charityVault()", +"02b32af5": "greenToken()", +"02b33929": "SMTToken(uint256,uint256)", +"02b3b3da": "Divium()", +"02b40d11": "tokenSetMarketMaker(address,address,address,address)", +"02b4b52c": "isLogoInitied()", +"02b518fd": "callback(address,address,uint256,uint256,uint256)", +"02b5ecc8": "rateAngelsDayEnd()", +"02b68bbf": "getPlayersItemTickets(address)", +"02b6ef74": "CRofMakerByIndex(address,uint256)", +"02b6f286": "TokenContract(address,string,string,uint8)", +"02b70b41": "addConfirmation(bytes32,address)", +"02b7144f": "updateCheckpoint(address,address)", +"02b74a7e": "setupStates(uint256,uint256,uint256[])", +"02b857f3": "unlockMintDate1()", +"02b985d3": "arr(uint256,uint256,uint256,uint256)", +"02ba302b": "nextPrice1Of(uint256)", +"02ba6f8d": "getHistoryEntry(uint256,uint256)", +"02ba742b": "extendMembership(address,uint256)", +"02ba8742": "sendCoins(address,uint256)", +"02baaf40": "lastInitTimestamp()", +"02bb2929": "etherToDustPrice()", +"02bb5d6e": "setEOMarketToken(address)", +"02bb8465": "setContent(uint8,string,string)", +"02bc54bf": "companySite()", +"02be8e4e": "changeOwnerShip(address)", +"02beee07": "_getElement(uint8[],uint8)", +"02bf3165": "auctionUnpause()", +"02bf7fe7": "JumpCoin()", +"02bf9e7f": "verifySignature(address,bytes32,uint8,bytes32,bytes32)", +"02bfeeb8": "totalPicoUSD()", +"02c06bcd": "prevTokenAddress()", +"02c1d7cf": "iSportNews()", +"02c1ecbf": "returnStateChange()", +"02c28410": "getPublicAllocation()", +"02c29349": "fixWithdrawalAddress(address)", +"02c2a74d": "episodeManager()", +"02c3d7f6": "end_ICO()", +"02c4897b": "getAutorPicture(bytes32)", +"02c4960e": "InsufficientFee(address,uint256)", +"02c4980c": "BOC()", +"02c63852": "TokenVesting(address,address,uint256,uint256,uint256)", +"02c6d827": "getgamecardpos2(address,address)", +"02c6f427": "PRESALE_LEVEL_4()", +"02c71d92": "newClonedRepo()", +"02c76d45": "mintCoolDown()", +"02c7e7af": "sold()", +"02c85991": "distributeMinting(address[],uint256[])", +"02c90584": "userAddressExists(address)", +"02c95d2d": "setHaltIco(bool)", +"02c9972c": "TICK_TIME()", +"02c9e537": "cresusAddress()", +"02ca5994": "registerToken(address,uint256)", +"02ccee02": "getNoteLine(uint256)", +"02cd0f96": "Deadline(uint256)", +"02cdc1ee": "setSendGodz(uint256)", +"02ce5813": "whitelistActive()", +"02ce5fc4": "generateMintEvents(address,uint256)", +"02ce728f": "updateExchangeRate()", +"02ce8ac9": "withdrawSale(uint256)", +"02d0181c": "HamidToken()", +"02d05531": "getUriCount()", +"02d05d3f": "creator()", +"02d06d05": "bytesToUint(bytes)", +"02d19fe5": "testApproveWillNotModifyAllowance()", +"02d1c1e6": "sendOwnerBalance(address,address,uint256)", +"02d1d5fe": "getDesign()", +"02d23cef": "sendWithFreeze(address,uint256,uint256)", +"02d2f349": "lastPeriodChange()", +"02d3b339": "drawColors(uint256[],uint256[],address)", +"02d3bd16": "circulatingSupply_()", +"02d3fdc9": "burnMin()", +"02d44e57": "_getBetTimestamp(bytes32)", +"02d49d0b": "_createHiveInternal(address)", +"02d52fa4": "createProposal(uint256,string)", +"02d596d8": "getUserFromAddr(address)", +"02d66fc2": "hasSchema(bytes32)", +"02d6e7f4": "tokenXchangeRate()", +"02d6f730": "getFreezing(address,uint256)", +"02d77954": "getVoteOf(uint256)", +"02d7ccef": "UP_winRate()", +"02d800ec": "deactivateKey(string)", +"02d8146e": "tokensWallet()", +"02d947ef": "vote(uint256,address)", +"02d99637": "BlockClaimedEvent(address,address,uint256,uint256)", +"02da667b": "createProject(uint256,uint256)", +"02da6d06": "lastDao()", +"02dadf8e": "registerCitizen(bytes32,address)", +"02db2d8a": "myRefund(address)", +"02dbf3c8": "CGE()", +"02dc2e1d": "queuePayment(bytes)", +"02dcfc8e": "setAssetFees(address,uint256,uint256)", +"02dd6731": "disableApiAccess(bool)", +"02dd92c4": "crowdsaleOn()", +"02de2cf3": "isLatestPreReleaseTree(bytes32,bytes32)", +"02df0b61": "deprecateById(bytes32)", +"02df45a8": "closeActive(uint256)", +"02e0a2ff": "getAvailableBlance()", +"02e0b293": "LogVote(address,uint256,uint256,uint256,uint256)", +"02e0c14a": "get(bytes12)", +"02e0d5a5": "AquaToken()", +"02e1033a": "monsterFleeTime()", +"02e132f6": "recalcInvestorsFee(address,uint256)", +"02e26c38": "richest()", +"02e2c3b7": "setRefererPercent(uint256)", +"02e2f0b6": "Erc20TokenMarket()", +"02e32144": "precentDecimal()", +"02e33d25": "HydroToken()", +"02e4879d": "setProposalDuration(uint64)", +"02e49bd9": "publicityAddress()", +"02e4af01": "generateRandom()", +"02e4ef66": "transferWhiteList(address)", +"02e4f63b": "doExchange(address,address,address,uint256)", +"02e635e6": "AID()", +"02e650b6": "DigitalMoney(uint256,string,string)", +"02e6a5dc": "LIC(uint256,string,string,uint8)", +"02e6a951": "PayableContract()", +"02e7491e": "ERC165ID()", +"02e8243e": "WeiCoin(address,uint256,uint256,uint256)", +"02e8d8c0": "scheduleTransaction(address,uint256,uint256)", +"02e97770": "InfinitiEstate()", +"02e98e0d": "diffMinutes(uint256,uint256)", +"02e99e16": "SplitAmount(address,address,uint256)", +"02e9ad65": "dispatchTo(address,uint256)", +"02e9d5e4": "acceptBid(uint256,uint256)", +"02eb4759": "RightAndRoles(address[])", +"02eba8a7": "auditContract(bytes32,bool)", +"02ec77d2": "joinPot(string)", +"02ed26d1": "startTokensSale(uint256,uint256,uint256)", +"02ed292b": "receiverSpend(bytes32,uint256,bytes32,address,address)", +"02ed4d2d": "Purox(uint256,string,uint8,string)", +"02edcbfb": "proposeAmendment(uint256[],uint256[],bytes32)", +"02ee3275": "setSatoShi()", +"02ee3a52": "getAllProducts()", +"02ee50e0": "EliteToken()", +"02ee6a6b": "RegisterEvent(address,address)", +"02eef456": "UK()", +"02eef7c3": "MassivelyMultiplayerOnlineGame()", +"02ef3844": "getBountiesByCreator(address)", +"02ef43c3": "recordPurchase(address,uint256,uint256,string,uint256)", +"02ef521e": "registerEtherToken(address,bool)", +"02ef6c86": "calculateWithdraw(address)", +"02efbde5": "batchApproveWhitelist(address[])", +"02f050e4": "getWinningDetails(uint256)", +"02f08568": "lockController()", +"02f0c937": "buyItem(uint256,address,string,string)", +"02f1bfad": "setupTimeWindow(uint256)", +"02f1ed99": "putOnInitialSale(uint256)", +"02f2008d": "hintURL(bytes32,string)", +"02f20b9c": "getReport(string,uint256)", +"02f41314": "continueDistribution(uint256)", +"02f48c8b": "transferAvailableBalances(address,address,uint256)", +"02f58015": "claim_bounty()", +"02f65096": "executeBid(uint256,uint256,uint256)", +"02f652a3": "setTransferAgent(address,bool)", +"02f83a56": "withdrawBonusToken()", +"02f9fd84": "HHGTTG()", +"02faabb3": "fetchOrderByIdWithMerchant(string,address)", +"02fac967": "ownerHasCard(address,address)", +"02faf1e2": "revokeAccessFromAddress(address,address)", +"02fb0c5e": "active()", +"02fb4d85": "slash(address,uint256)", +"02fbe0d5": "getKittyGetOrNot(address)", +"02fc1f85": "ownedNumbers(address)", +"02fc28c4": "TAP_POLL_DURATION()", +"02fc2a8a": "_buy(address,uint256)", +"02fc3127": "tokenSaleBalanceOf(address)", +"02fd9dd8": "market_DeclareForSaleToAddress(uint256,uint256,address)", +"02ff1fac": "changeDevevoperAccont(address)", +"02ffc0b0": "getApprovedAddressesOfList(address[])", +"03015ea3": "registerArbiter(uint256,uint256)", +"03021c87": "setMaxInterval(uint256)", +"0302263a": "getPendingManager()", +"0302c688": "prod()", +"03031960": "VestingVault(address,address,uint256)", +"030326ad": "pushAddr(address)", +"0303f694": "_getBonusPercent()", +"0304363a": "fetchAllVoteResult()", +"030481d5": "changePreseller(address)", +"03048590": "ratePresale()", +"03048a42": "createRequest(address,uint256,string,bytes,bytes)", +"0304de3b": "setFeeRecieverValue(uint256,address)", +"03058aad": "getLatestManifest(address)", +"0305bdfe": "Trongold()", +"03060b68": "getCoreSupply()", +"03062183": "getVisaLeft(address,uint256,uint256)", +"03068d57": "setMinimumTextDonation(uint256)", +"0307024f": "getCreatedStatus(uint256)", +"03070ae7": "MANHATTANPROXYRIVDR()", +"03071302": "getCCH_edit_23()", +"030745ec": "_calculatePaymentToOwner(uint256,bool)", +"03075018": "getCosts()", +"03075ded": "emitIssuanceRatioUpdated(uint256)", +"03078416": "requestOfAmount(address,uint256)", +"0307acae": "copy(uint256[],uint256)", +"0307f82a": "SoldToken(address,uint256,string)", +"03083883": "compose(uint256[],uint256)", +"03090958": "_transferAct(address,address,uint256)", +"03096e92": "proposedMilestones()", +"0309922f": "icoMaxAmount()", +"0309c7f8": "payLastSixteenWinner(uint256)", +"030a78aa": "MAX_SITE_TOKEN_ID()", +"030b1776": "ROPE()", +"030ba25d": "withdraw(uint256,bytes)", +"030bccb0": "QLANCE2()", +"030c3631": "dungeonPlayerCount(uint256)", +"030cc118": "depositSuccessful_()", +"030cecc7": "decode(string,bytes32)", +"030d406b": "entryPayout(uint256)", +"030d945c": "PMHToken(uint256,string,uint8,string)", +"030e30df": "super_transferFrom(address,address,uint256)", +"030e6b98": "testFinalizingBeforeCapChangesHardCap()", +"030e9080": "returnAllCoke()", +"030eafa0": "endThisContact()", +"030f5702": "returnAmount(uint256)", +"03101f46": "setDistributionMinimum(address,uint256)", +"03110f23": "returnKitty(uint256)", +"031122ef": "exhaustChibis(uint256,uint256)", +"031126e1": "_approx(uint256)", +"0311904c": "investAmount()", +"0311a8f0": "getUploadNames(uint256)", +"03122043": "setCompte_40(string)", +"031324fa": "_transferDivis(address,uint256)", +"03137d43": "test_insert_findWithHintPrevRemovedUpdateHead(int256)", +"03138b31": "phase_5_remaining_tokens()", +"0313953d": "indexBalance()", +"03141fcd": "listPairForReserve(address,address,address,bool)", +"03145ac2": "WildFurToken()", +"03149252": "everyoneDisabled()", +"0314bcfb": "FUND_SUPPLY()", +"03152429": "newAccount(address)", +"031578af": "bytes32Storage(bytes32)", +"0315a513": "getDigitalAsset()", +"0316bdb0": "CofounditToken(address)", +"03178d05": "getB3()", +"0317c06e": "isAllowedBalance(address,uint256)", +"0317fb71": "asmApprove(address,address,uint256)", +"031a36f1": "EBBToken(address,uint256)", +"031a8161": "convertDecimalBack(uint256)", +"031adff0": "whitelistingAddress()", +"031b3677": "funders(address)", +"031bd4c4": "TOKEN_LIMIT()", +"031d5d01": "readMessage()", +"031d7421": "createRegistry(address,address)", +"031d973e": "closeMarket(bytes32)", +"031e1b65": "sendFounderAndTeamToken(address,uint256)", +"031ee1c8": "contribute(address,bytes32,bytes32,uint8,bytes32,bytes32)", +"031f22e7": "PRICE_STAGE_TWO()", +"031f273c": "getMixerCountByType(bytes32)", +"031f3b1a": "remainderAmount()", +"031f74d4": "bugDiscovered()", +"031f9d7b": "buyCore(address,uint256,uint256)", +"031fce17": "listBackers(uint256)", +"0320fead": "getUsedBySoftware(uint256)", +"03216695": "monthlyWithdrawLimitInWei()", +"0321f836": "namiMultiSigWallet()", +"03228d0f": "changeSendingBanPeriod(uint256)", +"0323aa55": "isValidDeletion(uint8,bytes32,bytes32,string,address,address)", +"0323cc33": "getKnowledgeSinceLastUse(address)", +"0323e576": "INITIAL_CARD_PRICE()", +"0323f64a": "removeSubDivision(uint256)", +"03240775": "getActiveEntryById(bytes32)", +"0324149a": "marketGolds()", +"0324d0d9": "calculatVotePrice()", +"03251a08": "setMin(uint256,uint256)", +"0325be06": "biathlon_transfer(address,address,uint256)", +"03261030": "Time_call()", +"03267c60": "CITY_START_PRICE()", +"0326be45": "Permission()", +"0326c06b": "utfStringLength(string)", +"0327194a": "startPublicsale(uint256,uint256,uint256)", +"03282473": "AcceptedApplication(address,uint256,string)", +"03291893": "issueAndActivateTokenBounty(address,uint256,string,uint256,address,bool,address,uint256,address)", +"03294614": "buyPickaxes(address)", +"032a0af7": "adIds()", +"032a8838": "withdrawOnBehalfOf(address)", +"032aabf0": "has_presale_time_ended()", +"032b0824": "updateLatestRevision(bytes32,bytes32)", +"032b13da": "fourthChainETC()", +"032b3400": "end_Time()", +"032b642d": "changeStartAndEndDate(uint256,uint256)", +"032bc66b": "Locked(uint256)", +"032be08b": "ticketCountMax()", +"032c05aa": "maximalParticipationAmount()", +"032cbc5f": "chainStartBlock()", +"032ccf33": "dayPot()", +"032cfa5c": "comelBabyCoin()", +"032dbae5": "setTiers(uint256,uint256)", +"032e0868": "getAllStaff()", +"032eb997": "CCXTokenERC20(uint256,string,string)", +"032fa796": "SVCoin()", +"032fc13b": "whatRound()", +"03314efa": "shares()", +"0332c6d4": "advertisementPayment()", +"03335d04": "ethGoal()", +"03339af5": "getRobotCountForUser(address)", +"0333d499": "getOwnedPoints(address)", +"0333d4a2": "ZilleriumPresaleToken()", +"03347d75": "findOrderIndexForAddress(uint256,address)", +"0334e725": "FALCON(uint256,uint256)", +"0335d533": "USER_GET_CROWDSALE_TOKEN()", +"0335e18f": "timeComplete()", +"03379e7f": "Initialize(string,string,uint256,uint256)", +"0337aa74": "systemAuctionDuration()", +"0337e379": "releaseTokenOwnership()", +"0338e3a5": "getArrIntField2()", +"03395ba5": "AUCTION_TOKENS()", +"033988a1": "Pollen()", +"0339f300": "revise(uint256,bytes32)", +"033a010b": "adminClaimAirdropMultiple2(address[],uint256)", +"033a38b0": "vehreqexist(uint256,address)", +"033a6cab": "admin_redeem(address)", +"033b8675": "ICOCREED()", +"033ba5d1": "getWillData()", +"033c44c3": "m_totalInvested()", +"033c6ee6": "countHolders()", +"033c8477": "mined()", +"033d62ee": "is2D(bool)", +"033da70b": "setLogicContractAddress(address)", +"033df9cb": "stepOneStartTime()", +"033e7ef4": "registerVoteToken(bytes32,bytes32)", +"033e86d4": "PurchaseLocked()", +"033f7bc9": "testEmergencyStop()", +"0340249e": "HotelloadTokenERC20(uint256,string,string)", +"03402a9a": "ClubTransferContract()", +"03406e76": "getOptionSellOrders(uint256,uint256)", +"034187fd": "setEthToCents(uint256)", +"03427656": "getDefaultSoftResolutionBlocks()", +"03432744": "disputesWithoutJurors()", +"0343d550": "getApprovalCount()", +"0343dfa0": "checkInvariants()", +"03440022": "setAsSeller(address,bool)", +"0344a36f": "draw(address,bytes32,uint256)", +"03460f6c": "airdropAllowed()", +"0346a4ad": "MAXIMAL_PARTICIPATION()", +"034741a8": "patformWithdraw(uint256)", +"03487513": "SIGToken(uint256)", +"034889ff": "unFollow(address)", +"0348946d": "mintedTokensCap()", +"034a7bce": "saosao4()", +"034ac7a3": "ROLE_GRADE_PROVIDER()", +"034cb28e": "addressOf(address,bytes)", +"034cd0b0": "buyTokensGrowthLife()", +"034cf8bc": "transferClub(address,uint256)", +"034d0834": "NoBsCrypto()", +"034d3b0d": "withdrawTipForDeveloper()", +"034de540": "_getEthAmount(uint256)", +"034f55d2": "calculateSum(uint256[])", +"034f9774": "setWhitelistWallet(address)", +"034fcf55": "updCouponConsumed(string,bool)", +"0350bcd9": "toSendLeft()", +"0350d085": "Sign(string,string)", +"035186d6": "increasePrizePool(bytes4)", +"0351947f": "claimFine()", +"0352017b": "getInvestmentRecord(uint256)", +"03520535": "getPI_edit_10()", +"03526ff0": "LFDNetwork()", +"035340f1": "Bitether()", +"03547e53": "ownedBalance(address)", +"0354d6c5": "accountslength()", +"035502f2": "addCategory(string,uint256)", +"03553835": "calculateTokenAmount(uint256,uint256)", +"0355b70a": "getSpaceshipTotalSold()", +"03562dbb": "changeEmissionContractAddress(address)", +"0356948e": "previousstagedata()", +"0356fe3a": "genesisBlockNumber()", +"0357088b": "trancheByIndex(address,uint256)", +"0357371d": "release(address,uint256)", +"03580712": "executeDueToInactivity(bool)", +"03582fc5": "setReferralBonusPercent(uint256)", +"0358395d": "DominionCoin()", +"0358c295": "testInitialBalanceWithNewRGXBonus()", +"0358d965": "addPayout(uint256)", +"035ac814": "lastTimeUpdate()", +"035cf142": "getMinimumDeposit()", +"035d0880": "_requireQuePayment(uint256)", +"035d37a8": "setMinContribAmount(uint256)", +"035e898a": "getStellarInvestor()", +"035e902d": "Set_EmergencyCode(uint256,uint256)", +"035f057d": "multiIncreaseApproval(address[],uint256[])", +"03602e9e": "getPrivAddress()", +"03606b30": "setStopFunding(bool)", +"03611ec7": "Finside()", +"03612cb5": "settle(bytes32[],uint256[],uint256[])", +"03627e70": "countStudent()", +"0362d1f6": "getGamblerBet(address,uint256)", +"03635100": "bizcoin()", +"0363b1e1": "trade(address,uint256,address,address,bool)", +"036478c1": "GlobalAmountCapSoft()", +"0364a254": "getStringValue(bytes3)", +"03652c4e": "ICOStartTime()", +"03656d07": "exchangeMethodIsAllowed(address,bytes4)", +"036648b7": "TokenRateUpdated(uint256)", +"036723a2": "Payout_intern(uint256)", +"0367f96d": "setHardCapValue(uint256)", +"036896ab": "getERC20TokenBalance(address,address)", +"036a131d": "setPI_edit_28(string)", +"036a66eb": "GetProductionPerSecond(address)", +"036ae645": "deleteMessage(uint16)", +"036b3a81": "partnerSupply()", +"036bd387": "totalEthInWeiForFirstIco()", +"036c36eb": "relaySellerRequestCancel(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32)", +"036dd086": "createGame(string,string,uint256,uint256,string,string,string,string,bool)", +"036e05b0": "CreatePHX(address,uint256)", +"036e4220": "changeMinAcceptQuorumPct(uint256)", +"036ecf84": "dDownInsSplit()", +"036ee850": "votingDeadline()", +"036f60ec": "setSupplyAdjuster(address)", +"037051eb": "startRound(address)", +"0370c0d9": "_repayLoan(uint256,uint256)", +"0370ca41": "contractStage()", +"0370e65c": "preSaleEndedAt()", +"037101c4": "remainingPresaleCap()", +"03710668": "callContract(address,bytes)", +"0371193b": "getEmployeeAllInformation(uint256)", +"03714af7": "burnApproveReset(address,address)", +"0373e649": "Withdrawal(address,address,uint256,uint256,uint256)", +"03741040": "get_presale_arbits_total()", +"0374fc6f": "getBestOffer(address,address)", +"03750d94": "serverSeed(address,bytes32)", +"03771327": "HardcapGoalReached(uint256,uint256,uint256,uint256)", +"03771f2f": "numOfInflatableTokens()", +"0377ebe8": "itemKindCount()", +"0378f83f": "destroyFashion(uint256,uint16)", +"03792d52": "lastSubTokenBuyerOf(uint256)", +"037933dd": "calcSTQAmount(uint256,uint256)", +"0379565f": "EIP165Implementer()", +"037a417c": "testFunc()", +"037a9d30": "isDataSource()", +"037ae882": "reLoadKey(uint256,uint256)", +"037b5fdc": "burn_balance(address)", +"037c68b2": "disagreeCount()", +"037c983a": "resumeCrowdSale()", +"037c99b0": "setBonus(uint256,uint256)", +"037ca5fc": "HubCrowdsale(uint256,address,address)", +"037ca6c4": "allAgingTimesAdded()", +"037cf465": "has_token_sale_time_ended()", +"037d4ff8": "get_pre_kyc_bonus_denominator()", +"037e2e91": "Insureum()", +"037ed3e2": "executeClaim(address,address,uint256)", +"037ef916": "CaterToken(address,address)", +"037f8f8f": "_getDefaultTranchesForAmount(address,uint256)", +"037f9cf0": "rewardDistributionStarted()", +"0380e2f3": "getHashOfTheSignedDocument()", +"0380fd03": "newExchange()", +"0381c260": "getYearlyUSDSalary(address,address)", +"0381cb3b": "setRowcol(uint256,uint256[2])", +"03824f76": "hasSoldOut()", +"03828729": "coordinatesToAddresses(uint32)", +"0382c254": "CheckHash(uint8,uint8,uint8,uint8,bytes32)", +"038339ab": "publicGetDeposit(uint256)", +"03833bae": "ValidContributionCheck(uint256,bool)", +"0383966b": "testCanFinalizeOnCap()", +"0383a6f0": "CheckLimTransferDay(address)", +"038424c3": "maxEarningsClaimsRounds()", +"038461ea": "getCertifiedStudentsCount()", +"0384899b": "OwnershipChanged(address,address)", +"03850848": "saleAuctionContract()", +"03856d15": "BalanceOnlyOwner()", +"03866aad": "transferCrc(address)", +"0386a016": "closeProposal(uint256)", +"03872547": "setarg_1_input(uint256)", +"0387b0a2": "saleCounter()", +"03880bab": "deal(uint256[2],bytes32,bytes32,uint8)", +"03894922": "allocateTokens()", +"038b117b": "onlyAdminAndNotFinal()", +"038ccee8": "createNew(uint256,address,address,address,uint256,uint256,uint256,uint256)", +"038d71ee": "switchOff()", +"038e666f": "ethereumSaleRate()", +"038e7577": "setConfigUint(bytes32,uint256)", +"038f1845": "returnFunding()", +"038f21a6": "mapToRange(uint16)", +"038f5ed6": "drawDown(uint256)", +"038f8b64": "batchFillOrdersNoThrow(uint256[],bytes[])", +"038fa9cb": "getRomms()", +"03901913": "DLBToken(uint256,string,uint8,string)", +"03905f10": "scoreKnockouts(bytes32,bytes32,bytes12)", +"03906217": "SaddleNotForSale(uint256)", +"0390d190": "YouDealToken()", +"0392d2b4": "isManagerAllowed(address,string)", +"039314b1": "VotingEnded(address,bool)", +"03941cc5": "onwerName()", +"0394b9ce": "getWeaponList()", +"03959bb7": "setDataContract(address)", +"03960631": "raindropAddress()", +"03969758": "SetDurationOfLock(address)", +"0396dcb0": "purchaseByEMONT(uint16,uint256,address)", +"0396ece5": "SetupReserve(address)", +"0396f60a": "Invested(address,uint256,uint256,uint128)", +"03975d1f": "_validateBetOrRefund(uint8)", +"03976b0e": "setBattleProviderAddress(address,address)", +"03980ac4": "prophetize(string,string,string,bytes32,bytes)", +"03985426": "getMode(bytes32)", +"03991aea": "getReleasableFunds()", +"0399247a": "isVotingProxy(uint32,int256,address)", +"0399321e": "set(bytes)", +"03995b2d": "holdingsOf(address)", +"03999795": "rouletteOwner()", +"0399c357": "assignFreeReadings(address,uint8)", +"0399f881": "ART_DECIMALSFACTOR()", +"039a21b8": "tryExecute(address,bytes,uint256)", +"039af9eb": "tiers(uint256)", +"039b267d": "mdtFoundationAddress()", +"039b6c34": "assign(uint16,address,uint256)", +"039ba6be": "getPriceETH()", +"039bd55a": "constrctor()", +"039c84c1": "Add(uint32)", +"039c9a21": "refundTransactionInternal(uint256)", +"039c9d84": "getOpenNum(bytes32)", +"039d0bfa": "setSelfOn()", +"039d8751": "GOX()", +"039de01d": "unregisterScheme(address,address)", +"039e4e2a": "situation_challenge()", +"039e9e00": "acceptOwnershipAPI()", +"039efdeb": "startMilestone()", +"039f0156": "withdrawNxc(address,uint256)", +"039f0e9c": "_createPuppy(uint256,uint256,uint256,uint256,address,uint16,uint16,uint16,uint16)", +"039f6b28": "QuadrantAssets()", +"039fb41c": "get_description_hash()", +"03a0d68f": "expiry_date()", +"03a168e0": "jackpotLastWinner()", +"03a19a4f": "maxDropsPerTx()", +"03a1b87d": "manageInvestors(address,uint256)", +"03a1bdc3": "walletLockBoth(address,uint256)", +"03a250f9": "startWork(uint256)", +"03a3053b": "reserveFundManager()", +"03a47b58": "tyms(uint256)", +"03a503a4": "addHorseIndex(bytes32)", +"03a5c8e7": "tdeActive()", +"03a68d1d": "REBToken()", +"03a6981b": "StateUpdate(uint128,int128,int256,uint256,address,uint128)", +"03a76fed": "createToken(uint256[],address)", +"03a77c7a": "setRegulator(address,address,bool)", +"03a7b41f": "queryPlotExists(uint8,int256[],int256[])", +"03a7bdd7": "testCloseContract(bytes32,bytes32,uint256,uint256,uint64,uint64,bytes32,bytes32,bytes32,uint64)", +"03ab614d": "testTranferOneToken()", +"03ac58d7": "deathData_f8()", +"03ac7215": "setTotalSupply(uint256,bool)", +"03aca792": "pendingList(uint256)", +"03ad4be3": "updatetoken(uint256,string)", +"03adaee6": "applyForCertification(string,string,string,string,address,uint128)", +"03adcbd2": "walkBook(uint16)", +"03addce2": "payout(address[],uint256,address)", +"03ade532": "ctrtMarketPrice()", +"03ae0357": "DevidendsSnapshot(address,uint256)", +"03ae3ded": "aproveLoan(uint256)", +"03ae4c1f": "buyCoke()", +"03ae8508": "createGladiatorBattle(uint256,uint8[2],bool,uint256,uint16)", +"03aeeba6": "_setClientSupply(address,uint256)", +"03af2cda": "createMultiple(uint256[],uint256[],uint256[],uint256[],uint8[],uint256[],address[])", +"03af73d3": "sendCollectedEther(address)", +"03b05c73": "maxIssuedTokensPerIco()", +"03b0a55c": "icoPvtEnded()", +"03b0e428": "_unpackRarityBonusValue(uint256)", +"03b103ea": "Vote(uint256,string,bytes32[])", +"03b25050": "CGCToken()", +"03b4e20c": "removeAddressFromAccountFor(address,address)", +"03b59255": "withdrawForeignTokensTo(address,address,uint256)", +"03b5af0f": "incomingRandomNumber(address,uint8)", +"03b5d494": "takeBet()", +"03b5ddbe": "_usdMinAmountValidate(uint256)", +"03b62931": "proveInConfirmedGblock(bytes,bytes32,bytes32)", +"03b62e10": "lowestDiff()", +"03b6eb88": "note(address,uint256)", +"03b718ee": "getCityBuildings(uint256,bool)", +"03b753dd": "tokenPurchase(address,uint256)", +"03b8a24e": "ritual(uint256)", +"03b918dc": "allow_contributions()", +"03b98c0e": "pauseable()", +"03b9b4f9": "releaseTokens(bytes32,uint256)", +"03b9f0b2": "referrerBonusRate()", +"03ba27f6": "withdrawToWallet()", +"03ba3a88": "notifyContract(address,address,uint256,bytes)", +"03bad56e": "transferERC223(address,uint256,bytes)", +"03bb5d8a": "openGameResultAndNewGame(uint256,string,bytes32)", +"03bbba93": "incentiveDistributionStarted()", +"03bc1e19": "changeOneBet(uint256)", +"03bc6d0d": "amendFee(uint256)", +"03bcebea": "initOneChance(address)", +"03bcf11d": "abortSale()", +"03bcf514": "finishedCrowdsourcingDisputeBond()", +"03bda14e": "raiseMaxNumBets(uint256)", +"03bdecf5": "right69(uint256)", +"03bec188": "ChangeMinAmount(uint256,uint256)", +"03bf4fb7": "setTradersContract(address)", +"03bf8e70": "birthKitty()", +"03bfee9e": "_getBidId()", +"03c0bfb5": "getOwnUserState()", +"03c13148": "setReceiver1(address)", +"03c175ff": "isRestrictedAddress(address)", +"03c1d1df": "collectERC20(address,uint256)", +"03c2d5b6": "nextGameDeveloperMiningPower()", +"03c327f0": "changingMilestones()", +"03c401e3": "ADDR_TKG_VC()", +"03c411d3": "MOMToken()", +"03c41c04": "NewUpgradedAmount(uint256,uint256,address)", +"03c45305": "foundersSupply()", +"03c49580": "priceOfElement(uint256)", +"03c4d93a": "payWithGold(uint256)", +"03c5b1dc": "setPeriod(uint256,uint256)", +"03c5f26a": "PublicCheckGameStart()", +"03c5faf4": "s12(bytes1)", +"03c63869": "resumePlayer(address)", +"03c6c8f9": "TheExcelToken()", +"03c7bce1": "_addMinter(address)", +"03c7da39": "mintMarketingTokens()", +"03c83302": "distributeDividends()", +"03c94ca6": "tokenSoftCapReached()", +"03ca0a95": "performSetTokenControlInfo()", +"03ca0eed": "requireCustomerId()", +"03ca0f6c": "advisors(address)", +"03ca30e0": "changePreMine(address)", +"03ca558a": "read_i8()", +"03ca71d6": "setSecurityCheck(string)", +"03ca7bcc": "debug_last_approved()", +"03cba01e": "bonusEndTime250()", +"03cbcf57": "getBetAmountAtLayer(uint16)", +"03cc1e32": "addFundingRound(uint256,uint256,uint256,address[])", +"03cc5597": "wrestle()", +"03cc5e4d": "setTechnicalAdmin(address)", +"03cc7b85": "num_tokens_auctioned()", +"03cc8efb": "BethingWorldCup()", +"03cd3e47": "transferRecovery(address,address,uint256)", +"03cddb2c": "capitalAllocated()", +"03ce6c55": "roundUp(uint256,uint256)", +"03ce9c00": "AcceptsTokens(address)", +"03cf0678": "bigBang()", +"03cf4fd6": "expire(uint256,uint256,uint8,bytes32,bytes32,bytes32)", +"03cf678b": "vitToken()", +"03cfe12d": "benefactorsKeys()", +"03d08f3b": "nextLotteryTTWTokenId4()", +"03d0b7d2": "minimumFeePlusDividends()", +"03d0cecd": "getLx()", +"03d2107f": "getSender(bytes32)", +"03d22885": "scheduleCall(address,uint256,bytes4,uint256,uint256,uint8,uint256)", +"03d231b5": "signerFlag(address)", +"03d258c4": "set_prices(uint256)", +"03d285fd": "nameok(string)", +"03d2e963": "zint_now()", +"03d37d78": "showPoolNumber(address)", +"03d38296": "indexSuperInvestor(uint256)", +"03d3a6b7": "shutForETH(uint256)", +"03d41eb6": "reserveSupply()", +"03d499ef": "totalEthereumICOReceived()", +"03d4e98a": "getProposalVote(uint256,uint256,uint256)", +"03d50703": "challengeExit(bytes32[],bytes32[],uint256,uint256)", +"03d51a0c": "transfer_ether_to_owner(uint256)", +"03d5aa0c": "PigChain()", +"03d5f483": "founderTokenVesting()", +"03d699da": "YggdrashCrowd(address,address,address,uint256,uint256,uint256,uint256)", +"03d6b6b4": "EpigenCareCrowdsale(uint256,uint256,uint256,address,address,address)", +"03d6d7b6": "getCallMaxCost(bytes32)", +"03d7244f": "dice_game(uint256)", +"03d756cb": "ethealToken()", +"03d75937": "setUIntValue(string,uint256)", +"03d76547": "addressFin()", +"03d83c4d": "stopTge()", +"03d9d253": "unlock(uint256,address,address,bytes)", +"03da04d7": "BRN()", +"03da8902": "transfearDBOwner(address)", +"03dc0532": "getLableRecords(bytes32)", +"03dc6340": "AdminTokenSent(address,uint256)", +"03dcead2": "directDebitOf(address,address)", +"03dcf6bc": "truToken()", +"03dd5a18": "testSimpleArray()", +"03dd88f8": "getAssTotal()", +"03ddc104": "ownerClaimOverride(uint256)", +"03ddcae9": "checkTradeSignature(bytes32,uint256[],bytes32[])", +"03dec463": "getRentOwed(address)", +"03defdc5": "jobHunterWithdrawal()", +"03df1550": "ECR20HoneycombToken()", +"03df6106": "setNewReleasePeriod(address,uint256,uint256,uint256)", +"03e07b2f": "getMinRefEthPurchase()", +"03e1b3c6": "sellAllAmountBuyEth(address,address,uint256,address,uint256)", +"03e20503": "localManualEntry(bytes32,bytes32,uint256,uint256,address)", +"03e28366": "playerNum()", +"03e2b9f5": "syncDate()", +"03e337d1": "SEPCToken()", +"03e39113": "BeggarToken()", +"03e3b1ed": "applicationApproved(address,address)", +"03e3f677": "setICOStart(uint256)", +"03e3fa51": "editScores(uint256[],uint256[])", +"03e4d9f5": "getDayIndex(uint256)", +"03e55f1c": "lockEscrow(bytes32,address,uint256)", +"03e5affd": "add(string,int256,int256)", +"03e6c117": "getIcoAddrListByIcoRuleId(uint256,uint256)", +"03e7b4e9": "getEmission(uint256)", +"03e83b6a": "MyToken(uint256,string,string)", +"03e864fa": "TestableMarketContractOraclize(string,address,address,uint256[5],string,string)", +"03e8837c": "getUserCount(address)", +"03e9287a": "Tacoin(uint256,string,string)", +"03e93b2e": "changeStarbitWallet(address)", +"03e9598c": "updateClientVersion(bytes32)", +"03e96fe3": "getAllTickets()", +"03e9e609": "getRecord(uint256)", +"03ec1bbe": "tokenIssuedTotal()", +"03ed9d21": "setMaxContribution(uint256)", +"03edae57": "withdrawFounderFunds(uint256)", +"03edf914": "placeBet(uint256,uint8)", +"03ee8f08": "getCoeff(uint16)", +"03eea024": "issueTreasury(address,address)", +"03eeb40e": "AngelsvsRedSox419()", +"03ef03b4": "buyBulkMidGradeCar(address,uint256[],address)", +"03ef2a2c": "tryExecuteProposal(uint256,bytes)", +"03efb5c4": "book(address,uint256)", +"03f0cc64": "affiliateCodes(address)", +"03f10bff": "IDMONEY()", +"03f11878": "casino(uint256,uint256)", +"03f14886": "add_new_hash(string)", +"03f14be9": "updateEmployeeWallet(address,address,address)", +"03f14e96": "currentAirdrop()", +"03f166de": "calculateTransferValue(uint256,uint256)", +"03f17336": "BOPs(uint256)", +"03f187ea": "registerFee()", +"03f21bda": "privateOfferingTokens()", +"03f3b07f": "setUserScore(address,uint32)", +"03f3cea1": "requiresHardCap()", +"03f3e275": "getRatioList()", +"03f3e7c8": "setICOWeek4Bonus(uint256)", +"03f4864d": "XXXXXXXX05()", +"03f499b8": "refundState()", +"03f6477d": "setBonusSetter(address,address)", +"03f67e1b": "changelp2(address)", +"03f73f08": "start_ICO2(uint256)", +"03f744b0": "JessieEducationToken()", +"03f7d4ff": "BitpaintingStorage(uint8)", +"03f8008c": "getUserDAOsCount(address)", +"03f979c8": "saleEndTokenCreationRate()", +"03f9b456": "LockupTokensWithdrawn()", +"03f9c793": "invest(address)", +"03fad66e": "settokenCap(uint256)", +"03fb3f63": "currentMigrationSource()", +"03fba444": "_receiveBuyNextRank(address)", +"03fce7ef": "approveEscrow(uint256)", +"03fd8c65": "withdrawBalanceHashing(address,address,uint256)", +"03ff20a1": "crowdfundEndTime()", +"03ff5e73": "stopTime()", +"03ff8590": "random2(uint256,uint256)", +"03ff90f6": "minApproval()", +"03ffae3b": "FlightDelayDatabase(address)", +"040177b7": "previousDungeonId()", +"0401d897": "setVestingCliffDateTime(uint256)", +"04021ba8": "_increaseBalance(address,uint256)", +"04029f23": "_setBugFixVersion(string,uint32,bytes32,uint32)", +"040425d1": "protectedSupply()", +"040502e4": "EmmiumCoin()", +"04053d21": "checkCourse(uint256)", +"0405440c": "secureMode()", +"040622a9": "UNITPaymentGatewayList()", +"040677f1": "sentFirst()", +"0406870c": "SupplyManagementChainSolutions()", +"04072322": "GetEventData()", +"0407dc78": "medalBalanceOf(address)", +"04089c7d": "ALTnextCoin()", +"040a772e": "getUserDividends(address)", +"040c014b": "_changeName(string)", +"040c3a53": "maxRacers()", +"040cf020": "withdraw(bytes32,uint256)", +"040d54ce": "addFile(bytes32,string,uint256,string,string)", +"040d5e82": "partialFlip(bytes32)", +"040d70bd": "GetSeries0()", +"040da8f4": "jackpotBalance()", +"040e33f0": "SHRToken()", +"040e55f5": "getTransferCount()", +"040ea2f4": "ownerSetPriviledgedAddress(address)", +"040f9a5e": "transferRemainingTokens(address)", +"040fa051": "isPendingRegistration(address)", +"04106c8b": "startGeneration()", +"0410ec85": "randomReward(uint256[])", +"0410fac7": "adminRemoveTrustedCurrencyContract(address)", +"04115187": "initTime()", +"0411bca8": "getChallengeAnswerResult(uint256)", +"041257ef": "setWhitelistControllerAddress(address)", +"04126ce5": "getHashSubmissionEnd()", +"04143865": "dec_multiple()", +"04148f7e": "createGame(uint256,uint256,string,address)", +"04150694": "airdropBSupply()", +"04153ac9": "inflateActiveSupply(uint256)", +"04155727": "dcntrpls(uint256,uint256,uint256,uint256,uint256,bool)", +"04157752": "withdrawRed_(uint256,uint256)", +"0415bd13": "create(uint256,uint256,int256,address)", +"04165443": "gatherAllOldBalanceOf(address[])", +"0416c10c": "_getBytes(address,bytes32)", +"04186c57": "getPermissionsProvider()", +"0418945a": "addStablecoin(address)", +"0418ac09": "unFreezeTransfer()", +"04194636": "bulkTokenSend(address[],uint256[])", +"04198675": "setHitPrice(uint256)", +"0419c814": "isExistedOwner(address)", +"0419eca5": "createChild(uint256)", +"041abd9f": "timestampEnd()", +"041ae880": "funder()", +"041b1406": "checkPoDs(address[])", +"041b8c3e": "group(address,uint256)", +"041c3ade": "punkIndexToAddress()", +"041d0c0b": "MyTokenLoad(uint256,string,uint8,string,address)", +"041d15c9": "getPurchaseTimestamp(uint32)", +"041d40c1": "buyOrders(bytes32)", +"041dad49": "incrementpostId()", +"041dd0f9": "ValueToken()", +"041dd3f6": "testControlCreateWithParentsParentNotInUse()", +"041e3929": "getInvitationCreatedOn(address,uint256)", +"041e6b8b": "rejectUpgrades()", +"041f173f": "blacklist(address[])", +"041fa8aa": "times9()", +"041fe13d": "onEtherandomSeed(bytes32,bytes32)", +"04213a59": "setServiceDuration(uint256)", +"0421a94c": "sendSpecialTasterPackage(address,uint256)", +"042228db": "adminUpdateArrayInvite(uint256,uint256,address,address)", +"0422ddf3": "isGamePaused()", +"04239743": "lastGrantedIndex()", +"0424b6fe": "ContentChanged(bytes32,bytes32)", +"0424d979": "removeDepositCreator(address)", +"0425b5e9": "initialLockAddress(address)", +"0425c357": "submitVote(uint256,bytes32,bytes)", +"0425c4bf": "updateProduct(address,string,string,uint256,string,bool)", +"0425ccba": "DoubleETH()", +"0425e6ff": "SEXNTestToken()", +"04267892": "koth()", +"04269bc2": "ICO_SUPPLY()", +"0426c697": "changePayoutAddress(address)", +"0426dcef": "unlockBalance(address,uint256)", +"04275375": "MCToken()", +"0428c6aa": "earlyBirds(uint256)", +"0428ca27": "WalletAddressUpdated(address)", +"04293236": "m_owner80()", +"0429b880": "confirmationPeriod()", +"0429b9ca": "totalEthAmount()", +"042abdf8": "PRE_ICO_MIN_CAP()", +"042ae62b": "killAborted()", +"042b5fed": "placeBet(bytes32)", +"042c71f5": "DevsmartCoinFour()", +"042cb150": "batchSend(uint256,address[])", +"042d65ab": "getTokenAwarded()", +"042e58c8": "receiveResults(string,uint256)", +"042e9a43": "propose(bytes32,string)", +"042f3b34": "DesafioStone()", +"04304b55": "getUSDEth()", +"04306d69": "MOOSToken()", +"0430e405": "gameStopped()", +"043106c0": "deleteAddressValue(bytes32)", +"043122bb": "minimumParticipation()", +"04318794": "giveTimeToDemoc(bytes32,uint256,bytes32)", +"0431dd86": "TokenNedCoin(uint256,string,uint8,string)", +"0432ff56": "START_WEEK_4()", +"043331ee": "addOnCount()", +"04336615": "hashLoop(uint256,bytes32)", +"04338def": "maxAmountPreICO()", +"04339140": "setCloneFeePercentage(uint256)", +"04339582": "buyAndTransfer(uint256,address,address,bytes,uint8)", +"04343722": "addUsers(address)", +"0434a44d": "codeSize()", +"0434e5a6": "changeWalletForETH(address)", +"0434fe0b": "heal()", +"043531b1": "setFeeDivisor(uint256)", +"0435a745": "stat()", +"04362c2d": "getEsgoTXCount()", +"043728b4": "initBet(bool)", +"043753ba": "makeDecision(uint256,bool)", +"043799e3": "inquire_domain_id(uint16,uint16)", +"0438ebce": "getPlayerBetForPlayRound(address,uint256)", +"043996c2": "setUseAmountBasedBonus(bool)", +"0439f7d4": "getProviderSupply(uint256,uint256,uint256)", +"043aea8b": "CrypthubtTokenTest()", +"043b743f": "investor_getShortInfo(address)", +"043bb5e7": "getIdentities(address[])", +"043c8816": "INM()", +"043cf01a": "addCourse(string,uint256,uint256,uint256,string)", +"043cf343": "CreditIDENTITY(address)", +"043d0258": "changePriceLimits(uint256,uint256)", +"043d5f1a": "ENCSToken(uint256,string,uint8,string)", +"043d9aaa": "verifiersPerShard()", +"043da739": "getNextBid()", +"043eabd0": "RUVI()", +"0440187e": "hostingProfitAddress()", +"04403b30": "TokenSaleSucceed()", +"0440c8e4": "_unpackRarityValue(uint256)", +"044166ec": "PollManagedFund(address,address,address,address,address,address,address,address,address[])", +"044215c6": "token(uint256)", +"044337ca": "setPortfolio(address)", +"04433bbc": "getContractAddress(string)", +"044431f0": "setRefundEnabled(bool)", +"0444c5db": "SSPRegistryReplaced(address,address)", +"0445154c": "PRIVATESALE_USD_PER_MSENC()", +"044553ae": "configureBoard(address)", +"04455e95": "testIsList(bytes)", +"04461f4d": "XaurumAmountMelted()", +"0446e187": "buyDonation(address,uint8)", +"04474181": "JixoCoin(uint256,string,uint8,string)", +"0448e936": "setSite(string)", +"0448f79f": "addOptionChain(uint256,string,uint256,uint256,bytes,address,int256[])", +"0449aa40": "allowedToBeSold()", +"044a3038": "_changeResolverAllowances(string,address[],uint256[])", +"044a5f97": "mgmtDistribute()", +"044aed7c": "removeEmployee(address,uint256)", +"044b1b02": "addProblem(string,string,string,string,string)", +"044bf6c2": "getSpinnerData(address,uint256)", +"044c1d4d": "clientVersion()", +"044c9366": "privateCrowdsale(address,uint256)", +"044c96e4": "startGame(string,string)", +"044ce308": "refundBuyer(uint256,uint256)", +"044d0b06": "oraclize_query(string,string[2])", +"044ec699": "get_mail(uint256)", +"044f19bd": "InfiniteCorridor()", +"044f53ee": "OPC(string,string,address)", +"044f9ac8": "findThroneCalled(bytes)", +"04509918": "scheduleCall(address)", +"04514185": "ShortBlog(string)", +"04517225": "transferlock()", +"04520116": "centsPerEther()", +"045236b4": "getChainyData(string)", +"0452396c": "subtrInvestorBalance(address,uint256)", +"04532035": "settleEth(address,uint32,uint32)", +"0453a7d2": "computeBonus()", +"0453e3b1": "ITIX()", +"04549d6f": "presaleStarted()", +"04550e70": "MyTestToken2()", +"04554443": "lockDuration()", +"045585a4": "priceList(uint256)", +"0456860a": "acceptAtCommunity(address,uint256)", +"04571211": "setTokenReward(address,address,uint256)", +"04578f90": "JTC(uint256,string,string)", +"0457d76b": "Mesa(bytes32[],uint256,address)", +"045820b3": "Player()", +"045894ab": "getCreate()", +"0458996a": "CBTSToken()", +"04590a28": "EtherWithdrawn(uint256)", +"04599012": "balanceToken(address)", +"045a1796": "upgraderSet()", +"045aceb9": "useResolver(string)", +"045b1a0c": "isBreakingInvestorCap(address,uint256)", +"045b7dca": "mintSupply()", +"045b9c72": "START_TIME_PRESALE()", +"045c123a": "sponsorDAI(uint256,uint256)", +"045c6ce0": "voteForProposal(uint256)", +"045cc8ec": "_createZodiacWithTime(uint256,uint256,uint256,uint256,address,uint256,uint256,uint256)", +"045ccf7b": "byte64ToString(bytes1[64])", +"045d0389": "exchange(address,uint256)", +"045d2ad9": "upgrades()", +"045d4503": "TeamDeleted(uint256,uint256[])", +"045d465f": "setDataFactory(address)", +"045d46c2": "getBalances(address,address)", +"045e240f": "getAvailableTokensToWithdraw()", +"045e7dd7": "ContractEdited(string,address)", +"045ea88a": "fishySalmonToken()", +"045eb3b5": "expLimited(int128,int256,int256)", +"045ec563": "rndInc_()", +"045eea7d": "changeSelfName(string)", +"045f2593": "getRoot2(uint256)", +"045f7850": "airDrop(address,uint256)", +"045f8aad": "CONUNToken(uint256,string,uint8,string)", +"045f91ea": "getCurrentWallet()", +"045f955b": "buyPets(uint256,uint256)", +"045ff49a": "TIER2END()", +"0460b206": "Bxcoin()", +"046111e9": "addVip(bytes32,string)", +"04612d20": "minionAdd(address)", +"0461ac58": "dteamVaultAddr3()", +"04638e1a": "getBalanceOf(address,address,address)", +"0463cd73": "getSuperManager()", +"0463e4af": "releaseDividendsRights_(address,uint256)", +"0464f4b2": "InitialPriceEnable()", +"0464f8d0": "getCatsCount()", +"04651a1e": "firstRoundICOEnd()", +"0465832e": "modifyTransFee(uint256)", +"04658ad8": "NonIssueDeposits()", +"04659819": "capUsd()", +"0465a76d": "airdrop_cnt()", +"0466450e": "getUserByAddress(address,address)", +"046672cc": "batchTransfer(bytes32[],uint64)", +"0466c7ab": "executeComputation()", +"04670c9d": "nextStage(uint256,uint256)", +"04673368": "getCurrentPrice(uint256,uint256)", +"04676af4": "getCompte_7()", +"0467c3ff": "ThirdBonus()", +"04684ba3": "convertTokens(address,address,uint256,uint256)", +"0469756a": "MintAuthority(int256,address)", +"04699a72": "tipbot()", +"0469d644": "storeSecretVote(bytes32,uint256)", +"046a3d91": "distributePrizze(uint256)", +"046ae3c2": "YourPyramid()", +"046c472f": "IOU()", +"046c82e4": "GraceFund()", +"046ce030": "isFactoryApproved(address)", +"046d30c7": "_random(uint256)", +"046d5c53": "setMintAmountApproval(address,address,uint256)", +"046dc166": "setSignerAddress(address)", +"046e85f9": "getLastPendingTransaction()", +"046f7da2": "resume()", +"04706fdf": "giveContributionsBackProfitBugged()", +"047087cc": "getTotalTokenSupply()", +"04710a23": "toSgaAmount(uint256)", +"04719030": "manualSendTokens(address,uint256)", +"04729a8d": "tokensToEthereumAtSupply_(uint256,uint256)", +"0472a3bf": "doCrowdsaleMinting(address,uint256,uint256)", +"0472f549": "ran()", +"0472f72c": "_allocation(address,uint256)", +"0473e09c": "setConfigUint(bytes,uint256)", +"047408aa": "getAngelByIndex(address,uint256)", +"0474b484": "AllyICO()", +"0474d4a4": "isInitialAllocated()", +"04751333": "getRevForecast()", +"047564b7": "revokeValidator(address)", +"0477d647": "setSalary(uint256,uint256,uint256,uint256)", +"04780570": "ERC223Token_STB()", +"04787d83": "winBidDekla(address,address,uint256,uint256)", +"047956cf": "assign(address,uint256,bool)", +"0479fcd0": "setPopNameOriginal(uint256,string)", +"047a7ef1": "transferrable()", +"047a8dcb": "JetwingToken(address)", +"047ba641": "LowerStartingPrice(uint256)", +"047c738e": "wdivfloor(uint128,uint128)", +"047cfed9": "hasOwnership(uint256)", +"047d6649": "getUpdateByID(uint256)", +"047da93f": "testInvariantOverflow()", +"047de1f3": "drawerFee()", +"047e2b27": "setDataStorage(address)", +"047f9651": "make(uint256,uint256[4])", +"047f993d": "_vote(bytes32,uint8)", +"047fc9aa": "supply()", +"047fe8b3": "getUnsoldTokensBack()", +"047febbe": "admin_renewLockedAddress(address,address,uint256)", +"04803c2a": "addSales(uint16,uint128,uint16,uint16,uint64,uint64,uint16,uint8)", +"04804ee8": "sell(string,uint256,uint256)", +"0480c975": "setUnicornContract(address)", +"0480e58b": "maximumSupply()", +"04812aaf": "moveAccountData(address[],bytes32[],uint256[])", +"0481559b": "getLockDataFromMerkleTree(bytes,uint256)", +"04819507": "ICO_START4()", +"0481cb1b": "tokensAlreadyClaimed(bytes32,address)", +"048259e6": "UTCToken()", +"0482cfa8": "investorDividends(address)", +"04830ddd": "getVotersAt(uint256,uint256,uint256)", +"0483a7f6": "lockedBalances(address)", +"0484c7cf": "AppSupply(address,uint256)", +"0485066e": "addReading(uint8,uint256,uint256)", +"04858fef": "StartQuiz(string,string)", +"04859ceb": "afterTime(uint256)", +"048641be": "updateUserInvestBalance()", +"0486529b": "boardMemberApply(uint256)", +"04865327": "PlayerBet(address,uint256,uint256)", +"04869083": "auctionCreated(uint256,address,uint128,uint128,uint64)", +"0487b7e9": "Unity3d()", +"0487eed2": "restrictionsAllow(uint64,uint8)", +"0488781a": "teamOwnerOfPlayer(uint256)", +"0488dbfb": "getConfirmRefund(address,address,uint256)", +"048911a6": "createRandomZombie_ZOB_smallpack()", +"048926ac": "updateMaxPhase1(uint256)", +"04892c9f": "BASE_MIN_CONTRIBUTION()", +"048957d8": "sideBetPayToken(bytes32)", +"048986ae": "activityCore()", +"0489882e": "totalAdminsMapping()", +"0489fa70": "removePermittedContracts(address[])", +"048a5fed": "getSelfBalance()", +"048ae1bb": "addAssetPartOwner(bytes32,address)", +"048b0bcc": "addCustomerNReqACC(address,address,address)", +"048b3918": "messageNumber()", +"048bbc72": "CIR_SUPPLY()", +"048c35ca": "debug_is_recipient()", +"048ca698": "trackTotalVolume(address,uint256,uint256)", +"048cb8e0": "CarlosMatos()", +"048cc4a2": "BurnToken(address,address,uint256)", +"048cf8ed": "serviceDecreaseBalance(address,uint256)", +"048de56d": "setName(bytes2)", +"048dec38": "changeMarketingAddress(address)", +"048e2e94": "getAccountSize(address,uint256)", +"048e8c3a": "FidgetSpinner(uint256,uint256)", +"048e927b": "Checked(string,bool,uint256,bool,uint256)", +"048eb854": "_sortTopQuestions()", +"048f06f2": "setRoot(uint256,bytes32)", +"04903592": "withdrawAirdropTokens()", +"04904105": "setMiniPoolEdit_9(string)", +"0490540b": "Parameterizer(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"0490c71c": "unclaimedDividends(address)", +"0491eda0": "isCertainProduct(uint256,address,uint256,uint256,uint256,bool)", +"0492600e": "Issue(address,address,uint256,string)", +"04937cf9": "DoremiXToken()", +"0494630f": "oraclize_query(uint256,string,string[4],uint256)", +"04950f45": "KWHForGas()", +"049540c5": "structurePreIco(uint256)", +"0495cad9": "motionPasses(uint256)", +"0496e9ae": "triggerRequireError()", +"0496ee77": "checkPosition(address,uint256)", +"049766a8": "CleariumToken()", +"049878f3": "join(uint256)", +"04990162": "newChain(address[])", +"04994883": "ustAddress()", +"049948b0": "getMyGrapes()", +"0499ed13": "TOKEN_PRICE_WEI()", +"049a2dd1": "claimPartnerTokens()", +"049abf89": "queryUserContractCount(address)", +"049ae734": "scheduleCall(address,bytes4,uint256,uint256,uint8)", +"049b7852": "getElevations()", +"049c9bf2": "addExchangeAccount(address)", +"049cac16": "tokensUnvested()", +"049cc8b1": "soldForSecond()", +"049e63ee": "defaultClaimPercentage()", +"049eb289": "submitBuyOrder(bytes32,uint256,uint256)", +"049efcc7": "startReleasing()", +"049fb520": "countTickets()", +"04a077a4": "MyPasswordHint()", +"04a0c67e": "EagorNetwork()", +"04a1c63c": "token_a_amount()", +"04a1eb6b": "lastBlock_f16Hash_uint256()", +"04a23be0": "isAddressInWhiteList(string,address)", +"04a2b2c2": "testOwnerCanBreach()", +"04a2eaa5": "getTimeBonusPercent(uint256)", +"04a3693c": "applyFee(address,uint256,uint256)", +"04a373cc": "s20(bytes1)", +"04a3c21f": "maybeNewRound()", +"04a3ddd2": "_addToValueHeld(address,uint256)", +"04a48c27": "setActivityCoreAddress(address,address)", +"04a4a0d4": "getPriceMoney()", +"04a4a0ec": "TOTAL_XB_TOKEN_FOR_PRE_SALE()", +"04a4b776": "updateOpeningTime(uint256)", +"04a5288a": "stepcode()", +"04a6021d": "getByTypeNameVersion(string,string,string)", +"04a7137e": "controlledMint(address,uint256)", +"04a782ee": "addRecordByAdmin(bytes32,address,address,string,string)", +"04a79e9a": "spendDeposit(address,address,uint256)", +"04a7ca0e": "BonusUpdated(uint256)", +"04a7ff18": "totalNum()", +"04a82adf": "privateReservedUFT()", +"04a84938": "avaliableSupply()", +"04ac3b80": "addReceivedTrade(address,bytes32)", +"04ac75b0": "withdrawMulti(uint256,address[])", +"04aca4bc": "getClout(address)", +"04af7a20": "setDividendAndPayOut(uint32,uint32,uint32)", +"04afd2ce": "Multisended(uint256,address)", +"04b02ed6": "times_()", +"04b07a5e": "removeUpdater(address)", +"04b1142c": "getGuessCount(address)", +"04b1af75": "buy20()", +"04b1c6f0": "ICO_CAP()", +"04b2bf99": "stateControl()", +"04b370ab": "icoOver4()", +"04b43c5a": "withdrawZOB(uint256)", +"04b47e21": "isSignedWithEnc(uint16)", +"04b4e7e5": "awardsReservations()", +"04b5723d": "disableNewStakes()", +"04b5b5b6": "pointToToken(uint256,address,uint256)", +"04b64260": "tmpShuffleSeed(uint256,uint256)", +"04b65e74": "checkSTAGE()", +"04b69fa0": "jockeyNotForSale(uint256)", +"04b6ae61": "failedVotingCount()", +"04b6d39e": "_transferCroupier(address)", +"04b70576": "resetAgent(address)", +"04b7dcde": "hashData(string)", +"04b8ca98": "MAYTotalSupply()", +"04b92b7d": "overdraftAllocation()", +"04b94ec5": "MyToken30(uint256,string,string)", +"04badade": "get_hub_addr()", +"04bb1e3d": "updateActive(uint256,bool)", +"04bb754c": "TradeFinancing()", +"04bb89d5": "saveNick(string)", +"04bbc255": "isPricingStrategy()", +"04bd05d5": "getPeriodicalPnL()", +"04bd85f0": "getCapTab(uint256)", +"04be2f50": "isInvalid()", +"04bf1ee2": "JtoA(uint256[3])", +"04bf2a7f": "getScriptExecutor(bytes)", +"04c07569": "getBlock(uint256)", +"04c08fbd": "borrowFunds(uint256)", +"04c181f5": "beneficiars(address)", +"04c2a0ae": "DonateToLosers()", +"04c2a4a0": "computeKeyConstant(uint256)", +"04c313f4": "setAirdropGameInterface(address)", +"04c402f4": "set(int256,int256)", +"04c49f2c": "setFeePeriodDuration(uint256)", +"04c64e25": "revealMyVote(address,bytes32,bytes32,uint256,uint256)", +"04c6a9c5": "startIcoForOptionsHolders()", +"04c6ff7c": "devTeamTokenAddress()", +"04c76899": "sellerApprove(uint256,bytes)", +"04c76af0": "withdrawAdmin()", +"04c80c3c": "TOKEN_HODL_6M()", +"04c8384d": "trivialThreshold()", +"04c97ada": "setThirdRoundPricing(uint256)", +"04c98a2a": "validatePurchase()", +"04c98b2b": "startPresale()", +"04ca2775": "saleActive(uint256)", +"04caa6dd": "pauseReason()", +"04cb17ad": "returnPeriodExpired()", +"04cbc791": "getSellerOption()", +"04cc734b": "VoxelTransferred(address,uint8,uint8,uint8)", +"04ccf60e": "WrapperLockEth(string,string,uint256,address)", +"04cd1819": "disableVoting()", +"04cd5294": "getRefundAmount(uint256)", +"04ce1a61": "tokensWithdrawal(address,uint256)", +"04cf447d": "estimatesellvalue(uint256)", +"04d092c7": "claimPoints()", +"04d0a647": "getWallet(address)", +"04d0ac48": "tokensPending()", +"04d0c98a": "distribute10MTI(address[])", +"04d0fefe": "HoneyPot()", +"04d10f1c": "isValidChainyJson(string)", +"04d1290b": "getAlamat()", +"04d16482": "strConcat4(string,string,string,string)", +"04d1809c": "validateJoinSplit()", +"04d1b108": "_computeOwnerCut(uint128)", +"04d2cdbf": "setAcceptable(address)", +"04d2dec6": "getWalletAddress()", +"04d332a2": "setRefereeRewards(uint256[])", +"04d41474": "totalNormalContributorIdsAllocated()", +"04d58b3f": "MrwToken()", +"04d5c2c5": "toEGR(uint256)", +"04d6878f": "closeMicroWallet(uint256)", +"04d68a2b": "transferMoreThanBalanceTest(address)", +"04d69a11": "SoldToken(address,uint256,bytes32)", +"04d6db05": "startSale(address,uint256,uint256,uint256,uint256)", +"04d742dc": "startSale(uint256,uint256,uint256)", +"04d84108": "SWAP()", +"04d88bce": "DDJETH()", +"04d91c6a": "testFail()", +"04dbd2d3": "LogInvestorProfit(address,uint256)", +"04dcad85": "testDifferentTokenPrice()", +"04dcc44a": "getTip(address,bytes32)", +"04dd2dea": "getCardDivShare(uint256)", +"04dd69fa": "getGenerationIdForCall(address)", +"04de40ea": "AnnoToken()", +"04de76cf": "VisualChain()", +"04deaeb5": "retrieveEth(uint256,address)", +"04dee65f": "contractBatchTransfer(address[],uint256[])", +"04def102": "getRemainReleaseTimeOfStage(address,uint256)", +"04df0a1d": "kudosByMember()", +"04df48ef": "ICO_LEVEL_4()", +"04dfe14e": "LandmarkCoinTestF()", +"04e15de5": "issues(uint256)", +"04e1805a": "setFreezeForAngel(uint256,address,uint256)", +"04e1826c": "getNumTransactions(address,address,uint256)", +"04e262b8": "wlStartBlock()", +"04e5a069": "registerUBetCheck(address,string,string,string,string,string,uint256,string,string,int256,uint256)", +"04e639b6": "fetchSlot(uint256,uint256)", +"04e6a9a1": "teamLock(address,uint256)", +"04e6adf8": "serHoldTime(address,address,uint256)", +"04e75fda": "Contribution(uint256,address)", +"04e78a30": "stakingMintAmount()", +"04e7dfcf": "getAssetRaised(address)", +"04e80e90": "getMasterCopy()", +"04e86e15": "calctime(uint256)", +"04e88f2d": "SayaToken(uint256)", +"04e98568": "withdrawBalanceCut(uint256)", +"04ea23bf": "FLUXBlockToken()", +"04ea4a57": "getDisputedPayoutDistributionHash()", +"04eab1e1": "gvpe_per_Keos()", +"04eb7d83": "setFirstPeriodEndDate(uint256)", +"04ebb1d9": "commonWithdraw(address,address,uint256,uint256)", +"04ebfc52": "userCount_()", +"04ec70a7": "determineAttackingOrDefendingOutcomeForAttributes(uint256,uint256,uint256,uint256,uint256)", +"04ecdaac": "rateSecondRound()", +"04ed02f6": "getCards(uint256)", +"04ed3f6a": "canStartSale2()", +"04ed6fbc": "minCDTToParticipate()", +"04edad4d": "YouLose(address,uint256)", +"04ee54d2": "revokeInitiator(address)", +"04ee9748": "storeWinnerShare()", +"04ef1353": "setTokenWithoutFee(address,bool)", +"04ef161b": "findSeed(address)", +"04efa227": "feeMakeExporter()", +"04f016c9": "transferMulti(address[],uint256)", +"04f03b6a": "getSomeVar()", +"04f041b5": "BtcEthRateChange(uint256)", +"04f05f91": "joltToken()", +"04f08b55": "getPolicy(uint8)", +"04f08eec": "PayEth(address,uint256)", +"04f0aa4e": "setServiceAgent(address)", +"04f13e40": "HashLand()", +"04f14090": "setBlacklist(address,bool,string)", +"04f17b11": "PriceChanged(uint256,address)", +"04f182f4": "icoPhase1End()", +"04f1e4e2": "tradeEtherDelta(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,bool)", +"04f24897": "PlanetagroExchange(address)", +"04f30b37": "getFutureTransIdxByAddress(address)", +"04f31a47": "confirmICOSpec()", +"04f342f6": "_addToAging(address,address,uint256,uint256)", +"04f3bcec": "resolver()", +"04f49a3a": "addressStorage(bytes32)", +"04f4d425": "toEthFunction()", +"04f4f7ab": "KYRO()", +"04f5222c": "setEthMinContribution(uint256)", +"04f53231": "SendEth()", +"04f65288": "AK47Coin()", +"04f65590": "preSaleWeiRaised()", +"04f68d49": "dataSourceGetFinals()", +"04f6aa30": "forwardETHtoSTCcontract(uint256)", +"04f74b59": "make(address[],uint256[],address,bool)", +"04f7a69d": "baseSummonPrice()", +"04f7e87c": "issueBounty(address,uint256)", +"04f80977": "setBattleContract(address,address)", +"04f88d71": "testFailHardLimit()", +"04f8aa9b": "IoTeXNetwork(uint256)", +"04f92405": "icoTokensLeft()", +"04f9d030": "test_interface_call()", +"04fad28d": "instanceId()", +"04fb82cc": "_deliverTokens(address,uint256,uint256,uint256,address)", +"04fb9e81": "closeRequested()", +"04fc11d5": "getActual()", +"04fc7c6d": "updateJoinedCrowdsalesMultiple(address[])", +"04fcadf1": "totalZTHWagered()", +"04fd295c": "WOLF2()", +"04fd9f78": "variationsOfOwner(address)", +"04fda0d8": "_trade(address,uint256,address,uint256,address,uint256,bytes32)", +"04fe947c": "mapToNewRange(uint256,uint256,uint256)", +"04ffb5b9": "registerToken(address,string,string,uint256)", +"05009f0a": "_createBid(address,uint256,address,bytes32,bytes32,uint256,uint256)", +"0500de3e": "interestResolution(uint8,uint8,uint8,bool)", +"0500fe3e": "getRegionCurrentPixelPrice(uint256)", +"05010105": "stakeRequired()", +"05015e79": "coldAdmin()", +"05018d91": "objectPants()", +"0501b79f": "getBlocktime()", +"0501d556": "setEmergency(bool)", +"05021ce9": "_trade(address,uint256,address,uint256,address,uint256)", +"050225ea": "giveaway(address,uint256)", +"05026317": "bitcoinSaleRate()", +"0502ca6b": "addTime(uint256)", +"050394ec": "minGasPriceForDrawing()", +"0503a3bb": "transferCharity(address)", +"050414bb": "addWhitelist(address[],uint256[])", +"0505140c": "totalSupplyWithDecimals()", +"05062247": "blocknumber()", +"050642f2": "exchangeTokenRate()", +"0506689a": "omegaPerEther()", +"050895ff": "backEndOperator()", +"0508ed90": "contribute(uint256,address,address,uint256)", +"050906ea": "_computeDamage(uint256,uint256,uint8)", +"050a2eb4": "diceRollAddress()", +"050a3250": "ArithLib()", +"050b8c66": "drainStrayTokens(address,uint256)", +"050c09ee": "founderWithdraw(uint256)", +"050c0fd6": "AmmbrToken()", +"050c8803": "getAmountFida(uint256)", +"050c931d": "paymentNumber()", +"050d6a15": "setSellPrice()", +"050df9f7": "PoolJoined(uint8,address,uint256,uint256)", +"050e25a0": "getHash(address,uint256,address,uint256,uint256,uint256)", +"050eb8c0": "BuyableCourt(address[],uint256[])", +"050f2f3e": "updateBools(bytes32[],bool[])", +"051064c6": "lighthouseFee()", +"051097ef": "addProposal(uint256,string)", +"0510e186": "getSncTokenAddress()", +"05111c1e": "getItemHolder(uint256)", +"05117619": "endVesting(address,address,address,address)", +"05117e0d": "validateTokenPurchase(address,int256[],int256[])", +"0511a431": "addOns(uint16)", +"05120ba6": "getTokensReleased()", +"05128716": "sale(string)", +"0513fc8b": "onBurn(uint256)", +"0514be3b": "ownedTemplates()", +"0514c275": "REALPlaceHolder(address,address,address)", +"05160860": "initialDayWithdrawCount(uint256)", +"0516af06": "getMonsterId(uint256)", +"0516c9f0": "frozenToken(address,uint256)", +"0517431e": "_teamSupply()", +"05175786": "announceWinnerManually(uint256)", +"051847d5": "childTokenByIndex(address,uint256,uint256)", +"0518afdc": "tokenToReward(uint256)", +"0519adad": "largestLoaner()", +"0519b873": "heroLottery()", +"0519bb83": "getVoteStatus(uint256)", +"0519ce79": "cfoAddress()", +"051a2664": "nameOf(uint256)", +"051a65dd": "deal_cancel_rate()", +"051a86cc": "mintApprove(uint256,int256)", +"051b044f": "_sell(uint256,address)", +"051b4e6c": "getSurveyInfo(bytes32)", +"051ba270": "getLogCancelArguments()", +"051c4ab6": "AddPlayer(uint8,address)", +"051c8a8d": "tradeUserAsset(address,address,address,address,uint256,uint256,uint256)", +"051cb630": "mintRandomCards(address,uint8,uint8)", +"051d9955": "confirmCustodianChangeProxy(bytes32)", +"051e5c45": "fiatPerEth()", +"051f4f6f": "transferAll()", +"05204231": "setPermission(address,address,uint8)", +"0520ed4a": "LYT(uint256,string,string)", +"05215b2f": "createStandardToken(uint256)", +"0522345a": "blackListFreezeTime()", +"052369a6": "submitLocation(uint256,uint8)", +"052424f5": "recordPromoterBonus(address,uint256)", +"052534e7": "VerificationEvent(address,address,uint32)", +"0525ca77": "packParams(address,uint16,uint32)", +"0526179e": "getSoilTempControlLimits(bytes32)", +"05261aea": "finalize(uint256)", +"0527da64": "_openGamePlayNos(uint256[])", +"0528bb57": "isSubscriptionProduct(uint256)", +"05297781": "MintToken(uint256)", +"05298d37": "setWhiteListERC20(address)", +"0529be17": "circulateTokensForSale(uint256)", +"0529de04": "getCertificateExpires()", +"052a076f": "disablePresale(bool)", +"052a6849": "tokenStartPrice()", +"052a829c": "notSoldTokens()", +"052ab49c": "bytesToUint1(bytes)", +"052b2aa7": "getRegistrants()", +"052b81c7": "releaseBadges()", +"052ca699": "end_()", +"052d5707": "JYToken()", +"052d9e7e": "setWhitelistEnabled(bool)", +"052deec5": "investorsIter(uint256)", +"052f1a7a": "BGXToken()", +"052f6557": "setExtraLimit(uint256)", +"052f72d7": "getIsGlobalOperator(address)", +"052f7d11": "freezeAccountSend(address,bool)", +"053011b7": "authenticate(uint256,uint256,uint256)", +"0530abf0": "SwingTradeToken()", +"0533073c": "publishingOwner()", +"0533f57b": "RAISED_AMOUNT()", +"0534ab04": "setCapsMerkleRoot(bytes32)", +"0535020d": "payTokens(uint256)", +"05354bed": "etherPricesAreClose(uint256,uint256)", +"05357c69": "isAssigned(uint256,address)", +"0535ec77": "initialDistributionDone()", +"05365bb0": "presale1()", +"0537665d": "setOutcome()", +"053902f6": "DTCC_ILOW_4()", +"0539272a": "startDay()", +"05398302": "destroyFrom(address)", +"05398d45": "setNewMiner(address)", +"0539c6d6": "num_squares()", +"0539eba9": "setAllowBuying(bool)", +"053abd3c": "createShareToken(uint8)", +"053ae2ca": "getHairColorValue(uint256)", +"053b8d2f": "deleteBackgroundImage(uint256)", +"053c351b": "oraclize_getPrice(string)", +"053c5d59": "e_Purchase(address,uint256)", +"053db3a9": "testSetPresaleTokens()", +"053e3169": "openSaleStartTime()", +"053e3253": "window3EndTime()", +"053e71a6": "getTotalNumberOfTokensForWinningOption(uint256)", +"053f14da": "lastPrice()", +"053f598a": "policyActiveNum()", +"053f7492": "minimumPriceInDailyAuction()", +"05401284": "debundle(uint256,address,address)", +"0541b0f8": "acceptPayment(bytes8)", +"0542b61b": "snt_claimed()", +"05433a26": "GetNumbersFromHash(bytes)", +"054348d6": "icoIsOver()", +"0544587f": "getCRYPTON_CUT()", +"054550f3": "assertEq8(bytes8,bytes8,bytes32)", +"05459f42": "WeeklyLotteryB(address)", +"0545a03b": "getGroupManagement(uint256)", +"0545f8ba": "changeExchangeAdmin(address)", +"054604a2": "miniToken()", +"05468c26": "addToBond(address,uint256)", +"0546a746": "restrictedTokensOf(address)", +"054726cb": "MNTOKEN()", +"0547bf4d": "DEFROST_MONTHLY_PERCENT_OWNER()", +"054909aa": "_addNewOwnerHoldingsToToken(address,uint256,uint256)", +"0549f150": "getAdministrator(address)", +"054a8c02": "getGirl(uint256)", +"054a9f11": "shopGloves()", +"054ba658": "delete_key(uint256,uint256)", +"054baaf2": "jan()", +"054be0b7": "setIssuanceRatio(uint256)", +"054c3c71": "getBetsOnTimestamp(uint256)", +"054d2a7e": "ChuCunLingAIGO(uint256,string,uint8,string)", +"054dcbb5": "AdvisorsTokensHolder(address,address,address)", +"054ded2b": "registrazione_candidato(string)", +"054e9507": "lastEventId()", +"054f268e": "getDCategoriesN(bytes32)", +"054f381b": "entrepreneur()", +"054f7d9c": "frozen()", +"054fce82": "ZipperWithdrawalRight(address)", +"05502a62": "BONUS_PRESALE()", +"0550f92f": "setMintAddress(int256,address)", +"05514a3e": "winBonusArray(uint256)", +"05529d94": "addMultipleParticipants(address[])", +"0552ce3e": "MonthToken()", +"05533ce1": "setSettings(address,uint256)", +"0553b805": "transferStorage(address)", +"0553e156": "finalize(address,uint256)", +"0553fd5b": "incSupply(uint256)", +"05540534": "setMultisigAddress(address)", +"0554bb48": "depositToLock(bytes32)", +"0556369e": "tokenToReserve()", +"055680f0": "purchaseCounter()", +"0556a66f": "deliverPresale(address,uint256)", +"0556fcd0": "setIcoFinish(uint256)", +"0557b2b0": "getApprovedTransfer(uint256)", +"0557df99": "FundingRulesSet(address,uint256,uint256,uint256,uint256)", +"0558171d": "maxCharId()", +"05597d88": "setOwnerCut(uint8)", +"0559c114": "removeSellOrder(uint256)", +"055a7341": "USEAddr()", +"055ad42e": "currentPhase()", +"055bb725": "_approveForSale(address,address,uint256)", +"055c7c96": "sliceBytes32Arr(bytes32[],bytes32,uint256,uint256)", +"055cbb3d": "CalculatePayout(bytes32,uint256,uint256,uint8)", +"055cdee1": "UpdateBetOnTeams(string,address,uint256)", +"055cff88": "AlarmxToken()", +"055e0e07": "Bela()", +"055e6d8b": "playGameCheckBid(uint256)", +"055ee253": "claim_reward()", +"0560ff44": "tokenMetadata(uint256,string)", +"056129a6": "TravelShare()", +"0561d562": "GoldiamToken()", +"0561eff6": "addStoneToBoard(uint256,uint8,uint8)", +"0561fc18": "ICOResumed(uint256,uint256,uint256,uint256)", +"056265d1": "storeData(bytes32[],bytes32[],bytes32[],bytes32[])", +"05626694": "LABEEToken(uint256,string,string)", +"05626f09": "timeFundingStart(uint256)", +"0562b9f7": "withdrawAmount(uint256)", +"0563324c": "executeOrder(bytes32,uint256,address)", +"0563451a": "icoEnd()", +"056362e8": "Crowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"0563bbf6": "USDEtherPrice()", +"0563d55e": "MomaSpace()", +"05645168": "_removeFundkeeper(address)", +"0564a9a7": "getPollResults()", +"0564df4a": "_addBattleSequence(uint8,uint8,uint256)", +"0565ac43": "get_bonus(uint256)", +"0565c3f4": "pushAngelInvestmentData(address,address,uint256)", +"05664cea": "getRevisionTimestamp(bytes32,uint256)", +"0566bc12": "getDebrisPrice(bytes32,uint8)", +"0566c02a": "discountedSaleDuration()", +"0566c979": "iCashToken()", +"05674427": "numToString(uint256)", +"0567e83e": "kill(address,address)", +"05681031": "_sendBack()", +"056841b0": "InsertManifesto(string,string)", +"056a6421": "activateInvoiced(address)", +"056ab62a": "TestPool(address[3])", +"056b01ce": "mint(string,uint256)", +"056b2300": "TxUserWallet()", +"056b8197": "tokensInVault()", +"056ba056": "trade(address)", +"056bcc72": "_getVoteInterface(uint256)", +"056bef9e": "addRequester(address,string)", +"056cf6bf": "Witness()", +"056e1059": "oraclize_query(uint256,string,string,uint256)", +"056e25e3": "returnIcoInvestments(uint256)", +"056e4d88": "TotalInvested()", +"056e81a6": "TokenBooksAirdrop()", +"056ed205": "EstateTransactions(string,string,string,address,int256)", +"057101b1": "Token(uint256,string,string,string,uint8)", +"0571d85f": "Forwarded(address,address,uint256)", +"05733989": "setAttribute(address,string,bytes,uint256)", +"057466ea": "buyToken(uint256,uint256)", +"05748be2": "dropAmount()", +"05763ff7": "pauseProposer()", +"0576cb6f": "verifyTargetWallet()", +"05777d9b": "ReturnToken(uint256)", +"0577f15c": "exchangesStatus()", +"0577f62f": "PRE_MAX_CAP()", +"05785e4c": "minimumBuy()", +"05788701": "Ribble()", +"0578e3e5": "isAtMost(uint256,uint256)", +"0578f356": "addManagedInvestmentProposal(uint32,bytes24,uint256,uint152)", +"0579d25d": "price(uint256[],uint256[])", +"057af1c4": "exist(string)", +"057b0416": "getAccDetails(address,address)", +"057b17c0": "timeMode()", +"057b7105": "calculateTokenAmountICO(uint256)", +"057bd53f": "sameVar()", +"057bfcc7": "amount2()", +"057c3cf5": "get_flag()", +"057c824f": "proveInConfirmedBalances(bytes,bytes32,bytes32)", +"057d2c17": "Jack()", +"057dd42d": "purchaseCompanyCard(uint256)", +"058026d0": "checkTransferToICAPWithReference(bytes32,uint256,string)", +"058029a2": "icoCoinCap()", +"0580d5c7": "massBurnTokens(address[],uint256[])", +"0581345e": "issueClaimOwnership(address)", +"058206d9": "ICBCCoin()", +"05831c62": "donateFor(address)", +"05839b29": "sortTopTen()", +"0583ae52": "IRCToken()", +"05860b6f": "getBidIndex(address,bytes32)", +"058618f8": "setAuthorizeMintToken(uint256,int256)", +"05862435": "testFloatKeyValue()", +"05862611": "CrowdsaleLimit(uint256,uint256)", +"0587c1ba": "requestTokensFromOtherContract(address,address,address,uint256)", +"05888fcd": "tradeBalances(address,uint256,address,uint256,address,uint256)", +"0588dcbc": "updateStatsVars(uint256,uint256)", +"058a628f": "setAuthorizer(address)", +"058aace1": "divest()", +"058ab8c9": "EthVerifyCore()", +"058af982": "nameIsAdvocate(address,address)", +"058b316c": "MANAGEMENT_KEY()", +"058c5103": "safeKill()", +"058ceff7": "borrowBalanceStoredInternal(address)", +"058d4dd0": "setAssetCooldown(uint256,uint256,uint64)", +"058d7433": "setAlliesContract(address)", +"058fa067": "setGasRefundForClaimLootWithConsolationPrize(uint256)", +"058fcde9": "testFailTransferFrom()", +"058fe7d9": "setMiningRate(address,uint256)", +"05910b91": "canBreed(uint40)", +"05915147": "authType()", +"05917369": "populateFromOldContract(uint256[])", +"05917e8d": "updateWhitelistAddresses(address[],uint8)", +"0591eb24": "promoCreated()", +"059275ab": "howManyTokensForEther(uint256)", +"0593813f": "getBuyerTransaction(address)", +"0593d244": "setSaleContract(address)", +"05940728": "setGGCFee(uint8)", +"059417da": "_getAllParentIds(bytes32)", +"05943a15": "TEAM_SHARE()", +"0595ba4c": "getRoundMinAmountByBet(uint256)", +"0596334f": "rewardOne()", +"0596bd84": "_ChallengeFailed(uint256)", +"05976587": "test_expiry_increaseTimeBy30000()", +"05978450": "tokensReleasedAdvisorsTeam()", +"0597f3aa": "setGasRefundForClaimConsolationPrizeLoot(uint256)", +"05989e9d": "getAward(uint256)", +"05991e56": "Freewatch(uint256,string,uint8,string)", +"0599c284": "setAddress(string)", +"059a500c": "makeDeposit(uint256)", +"059a7d93": "cardEmojified(uint8)", +"059b8140": "upgradeAllowance(address,address,uint256)", +"059b8c77": "computeGainsRate(address)", +"059c00be": "STL(uint256,string,string)", +"059c5c4f": "policyFeeCollector()", +"059c5ecd": "WaniaToken()", +"059caad3": "creatorSupply()", +"059ce95d": "getVerifier(address)", +"059d45da": "removeAllPVPContenders()", +"059d92dc": "FeefersToken()", +"059eb515": "crowdsaleSold()", +"059efd9e": "_getShipColor(uint256)", +"059f8b16": "MULTIPLIER()", +"059f9342": "ownerSetLiquidationSpread()", +"05a0c707": "setMintAgent(address,int256)", +"05a10028": "burn(uint256,uint256,uint256)", +"05a10e6d": "withdrawStakeTokens(uint256,address)", +"05a17fc6": "getAccountFeed(address,uint256,uint256,uint256)", +"05a308fa": "setReferralSignupTokens(uint256)", +"05a30a7a": "lastDepositDate()", +"05a3823b": "colorplat()", +"05a3e81a": "ratePerWeiSecondPhase()", +"05a44292": "Train(uint64,uint64,uint64)", +"05a506b0": "seEnableTransfer(bool)", +"05a5b8c6": "verifyTx(bytes,int256,int256[],int256,bytes,int256,int256[],int256)", +"05a5f830": "signedApproveAndCallHash(address,address,uint256,bytes,uint256,uint256)", +"05a873dc": "setMetadataSize(uint256)", +"05a8bf98": "SEXYKITTEN(uint256,string,string)", +"05a955af": "holderList(address)", +"05a95f04": "triggerPayout()", +"05a9cec2": "BetOnMe()", +"05a9f274": "totalLockedAmount()", +"05aaee1f": "unlockTimeStamp()", +"05ab421d": "sendTokens(address,uint256)", +"05ac7908": "TakeBackToken(uint256)", +"05ac9bce": "voteVoting(uint256)", +"05ace573": "commitPhaseMinSeconds()", +"05ae6bcc": "userPublicFundingEthCountMap(address)", +"05aeb1e1": "RDMGameToken()", +"05aebead": "plantationSize()", +"05aecc80": "IAmVeryPoorToken()", +"05af0194": "getUserQuickPromoBonus(address)", +"05af2a81": "AddrDevelopFunds()", +"05af636b": "PunkTransfer(address,address,uint256)", +"05afff5b": "isHandleValid(bytes32)", +"05b0876d": "mgrAddress(uint256)", +"05b09e07": "getGameNumber(address,uint256)", +"05b1137b": "transferEther(address,uint256)", +"05b19fc5": "ZzyToken()", +"05b2b03a": "CertificationCentre(address)", +"05b34410": "creationDate()", +"05b35924": "totalLuxCents()", +"05b3dcb9": "roomFree()", +"05b4655a": "withdrawlWinnings()", +"05b496bb": "penalizeSolutionSubmitter(uint256,uint256)", +"05b4fe5f": "DepositFrozen(address,uint256)", +"05b542d9": "startPortalGun()", +"05b5711d": "level_3_amount()", +"05b575a5": "addWhitelister(address,address)", +"05b5b0dc": "submitSolution(uint8[])", +"05b5da23": "setPlayerTokenAddress(address)", +"05b64993": "setRequestCancellationMinimumTime(uint32)", +"05b67c8e": "BitGuildCrowdsale(uint256,uint256,address,address,address)", +"05b6d298": "assertEq0(string,string)", +"05b6d9e2": "distributeeBitcoinCashLarge(address[])", +"05b74d87": "inPrivatePreSalePeriod()", +"05b765ea": "getCertifierStatus(address)", +"05b8b29e": "profitOwner()", +"05b95822": "enableFundingWallets(address)", +"05b961e6": "PayWinner(address)", +"05b9cb3c": "totalDelegations()", +"05ba2ded": "voteForCashBackInPercentOfWeight(uint256)", +"05bbf5db": "startDocumentPoll(uint8,bytes32)", +"05bc99f8": "eth_sent(address)", +"05bccd09": "EGGCOIN()", +"05bdd57b": "AVMTestSuite()", +"05be478b": "calulateXticket(uint256,uint256,uint256)", +"05bf3bf0": "FtechizTestToken()", +"05bf4ecc": "batchPopularitySetting(uint256[],uint8[])", +"05bf779f": "setFoundation(address,address)", +"05bf9ece": "ICOSuspended()", +"05c06367": "RequestDetachment(uint256)", +"05c06db9": "majorPartnerAddress()", +"05c080be": "getTotalF6()", +"05c091f6": "_setCEO(address)", +"05c0dd91": "DEPOSIT_WINDOW()", +"05c0e497": "CDcurrency()", +"05c1f502": "post()", +"05c1f5ff": "getWhiteListStatus(address,address)", +"05c24481": "reserveSlash(bytes32)", +"05c270e2": "getPreviousBlockNumber(uint256,uint256)", +"05c31491": "test_oneTrueAssertNoMessage()", +"05c35eb6": "MICE(uint256,string,string)", +"05c3cb8d": "changegp(address)", +"05c4af9d": "getProto(uint16)", +"05c4b3dc": "Snydertoken()", +"05c54cd6": "MUNIRAHAMID()", +"05c7603d": "updateGenGuVault(uint256)", +"05c78929": "thirdWeekTokenPrice()", +"05c7cd4b": "confirmAndForwardWithRevert(address,uint256,bytes,bytes32,uint256,uint8,bytes32,bytes32)", +"05c7f589": "BACS()", +"05c85c42": "icoTimeStart()", +"05c8a4e2": "FeuzingToken()", +"05ca11cf": "TIM5(uint256,string,uint8,string)", +"05ca3557": "makeAdoptionOffer(bytes5,uint256)", +"05ca3841": "getOraclizeAddr()", +"05caca6c": "transferOwnershipServer(address)", +"05cb177a": "referralPay(uint256)", +"05cb71d4": "firstLoos()", +"05cc1d8e": "openForceAutoFree(address)", +"05cc49dd": "distributeFee(uint256)", +"05cc72e3": "FilmscoinToken()", +"05ccfddd": "invalidateCombat(uint256)", +"05cd4794": "ExEquity()", +"05ce55fc": "channelDisputeResolver(uint64)", +"05cf5fcd": "mediationExpiry()", +"05d0e91c": "withdrawFromCustodian(address,address[],uint256[],bytes,bytes,bytes32)", +"05d0f15b": "tokenPriceWei()", +"05d1127f": "changeChanceToWinModule(uint256)", +"05d1afec": "ausGroup()", +"05d1fc5d": "AIRDROP_MAX()", +"05d2035b": "mintingFinished()", +"05d258dd": "getMixingResult(uint256,uint256)", +"05d26bc6": "feedme(uint256)", +"05d2f3e2": "ErrorReport(address,uint256,uint256)", +"05d2f92a": "check_depth(address,uint256)", +"05d35816": "ConstitutionalDNA()", +"05d430db": "isNameValid(string)", +"05d4665f": "CROWDSALE_TOKENS()", +"05d473da": "assinaPresenca()", +"05d52eeb": "OMPxContract()", +"05d53802": "setPreSaleTokens(uint256)", +"05d55093": "oraclizeRequests(bytes32)", +"05d56a4e": "GetDChainNumRevokableHashes(bytes32)", +"05d57a59": "destroy_time()", +"05d6671c": "m_txs()", +"05d67464": "getTether(address,uint256)", +"05d74066": "SendPreReserved5()", +"05d7649f": "sendPortion(uint256,address)", +"05d78739": "cratesMigrated(address)", +"05d85eda": "count(address)", +"05d861fa": "CommunityAdVoucher()", +"05d866cd": "MemberChanged(address,address)", +"05d87fe2": "issueLetterOfCredit(uint256,uint256,uint256)", +"05d8bb97": "additionalDebt()", +"05d8c792": "_buyHicsTokens(address,uint256)", +"05d9a5fb": "sgn2sga(uint256,uint256)", +"05da403d": "withdrawBalance(bytes32,address,uint256,address,uint256)", +"05dabbcd": "lockedHasEnd()", +"05dad1c0": "test_userSetup()", +"05dae1f9": "ChargeStation(address,uint256)", +"05db3b82": "minwei()", +"05dc2708": "getCardNumber()", +"05dd071c": "_initialTransfers(address,address[],uint256[])", +"05dd23f7": "_stringGas(string)", +"05dd686f": "MIN_TOTAL_AMOUNT_TO_RECEIVE_ETH()", +"05dd7303": "EthereumStack()", +"05ddd49f": "Rotharium()", +"05de4f07": "getContentParent(uint256)", +"05de6288": "WithdrawalDone(address,uint256,uint256)", +"05df5e86": "XPAToken()", +"05df75db": "foobar()", +"05dfedac": "incrementDate()", +"05e0141d": "getOrders(uint256)", +"05e1bd8c": "calculateInterest(uint256,uint256,uint256)", +"05e1c942": "reclaimTokens(address[])", +"05e206f0": "_registerBid(uint32,uint256)", +"05e24a93": "DISTRIBUTED_STATUS()", +"05e2b66a": "update_eth_ratio(uint256)", +"05e2eee0": "getArrayString(bytes32)", +"05e33b6e": "calculateMask(uint256,uint256)", +"05e33dd0": "allParticipants(uint256)", +"05e43263": "AzwieToken(address)", +"05e437b5": "setAllSteps(uint256,uint256,uint256)", +"05e4438a": "applyHotFix(address)", +"05e4545d": "nextActionIsAuthorised()", +"05e45546": "promoCreatedCount()", +"05e49d1d": "findWinner(uint256)", +"05e4a75c": "setupairdrop(address,address)", +"05e52ea0": "numberOfBasesSold(uint256)", +"05e53535": "operationTokenCreated()", +"05e57cb1": "CommitGoodToken()", +"05e633e2": "bonusEnds3()", +"05e6b4a4": "_emitHolderAddressRemoved(bytes32,address,uint256)", +"05e6ee11": "btcInvestment(address,uint256,uint256,string,uint256)", +"05e7781e": "changeReserveWallet(address)", +"05e87e2a": "tracetoMultiSigContract()", +"05e88b69": "production()", +"05e992ff": "BitcoinDeuce(string,string,uint8,uint256)", +"05eb1877": "projectBuget(address)", +"05ecc085": "snapshotAt(uint256)", +"05ed2cd3": "settleBBDBatch(address[],int256[],uint256)", +"05ed76c4": "resolveTime()", +"05ee27a6": "RavneetToken()", +"05ee72b5": "playerEndGameConflictImpl(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address)", +"05ee8d89": "investorMinimalBalance()", +"05eed946": "waracoin_per_ether()", +"05ef6848": "getTokenPods(address)", +"05f04e46": "writePublicRecord(bytes32,bytes32,string,uint8,bytes32,bytes32)", +"05f0f662": "ComputeMyEggs()", +"05f203d9": "revoke(address[])", +"05f29b89": "smartSpeedEarning()", +"05f36283": "Nitrogen()", +"05f3a852": "tkn()", +"05f43bba": "calculatePreTokenAmount(uint256)", +"05f53b29": "getSkillCount()", +"05f5c0f3": "FrozenFunds(address,uint256,uint256,uint256,uint256,uint256)", +"05f6237f": "canClaimRefund()", +"05f671d9": "UUSD()", +"05f6d329": "limitTokenForSale()", +"05f6ee21": "updateBurnAgent(address,bool)", +"05f70f21": "getTokensWithoutRestrictions(uint256)", +"05f766a4": "Spc(uint256,string,string)", +"05f8002a": "setts01(uint256,address)", +"05f8b0cf": "setERCContract(address)", +"05f8b6f5": "_rewireIdentities(bytes32[],uint256,uint256,uint32)", +"05f8d55d": "addOwnerBalance()", +"05f908e6": "ICOPERIOD()", +"05f9bb6b": "transfersEnabledFlag()", +"05f9bf10": "AuctionCreated(uint256,address,uint256,uint256,uint256)", +"05fa0d5f": "_createTileAt(int32,int32)", +"05fc0586": "buyOptions(address,uint256,string)", +"05fcd234": "batchTransfer(address[],uint256,uint256[])", +"05fd22d0": "isPopulous(address)", +"05fe035f": "right100(uint256)", +"05feb950": "SOVREN()", +"05fec4be": "transferAdvisorToken(address,uint256)", +"05fefda7": "setPrices(uint256,uint256)", +"05ff088c": "getVendingInfo(uint256)", +"05ff711b": "blackList(uint32)", +"05ff792e": "cancelEscape(uint32,int256)", +"06005754": "nameRegAddress()", +"0600a865": "totalWithdrawable()", +"0600b814": "tokenBonusPct(uint256)", +"06011b14": "getUnitInfo(uint256,uint256,uint256)", +"06021e7e": "finalizeWork(address,string,string,string)", +"06024287": "attemptSomeMethod(address,uint256)", +"06026d87": "addAddressesToBonuslist(address[])", +"06027876": "sendBountyProgramBalance(address,uint256)", +"06040618": "currentPeriod()", +"0604c594": "getFreeBalances(address)", +"0605062f": "ownerOf()", +"0605d0cd": "emitSkillSet(uint256,uint256,uint256,bytes32)", +"0607dd94": "submitChoose(uint256)", +"06087e5b": "setColdWallet(address)", +"0608a48a": "reactivate_trading()", +"06090738": "setAdultTime(uint256)", +"06096931": "bountySupplied()", +"0609b433": "amendRetention(uint8)", +"060a02b7": "_hasIcoContributorType(address)", +"060a1051": "isExistInWhiteList(address)", +"060a56dc": "publisherCut()", +"060a7ef1": "getCreator(bytes32)", +"060b2128": "getEndPointOfCampaign(bytes32)", +"060ba7e9": "hackAdept(address)", +"060c265f": "checkMaxCap(address,uint256)", +"060c7f33": "AVAILABLE_FOR_EARLY_INVESTORS()", +"060ca250": "distributionsLength()", +"060cf4e8": "_cap()", +"060d15f9": "getBonusFactor(uint256,uint256,uint256)", +"060d206e": "modifyWhitelist(address,bool)", +"060d4f0d": "canDownload(address,address,bytes32)", +"060dac88": "setTokenBalance(address,address,uint256)", +"060eb520": "snt()", +"060f3102": "UbexToken()", +"060f400b": "removeFromOwnership(address)", +"060f58c3": "getUserFee(address)", +"060f919b": "getHash(address,bytes32)", +"060f99c4": "ZillaGDToken()", +"060ffb99": "getPromiseCount(address,bool)", +"0610e037": "isEnabled(bytes32)", +"0611037c": "QiiToken()", +"06114d36": "testChangeBet()", +"0611ae4a": "allocateBid(bytes32,uint256)", +"06122ea8": "createTokensAnySale()", +"061268d7": "requestFoundationTransfer(address,bytes32)", +"06127a11": "privateEntranceProvideAccessFor(address[])", +"061303a7": "refundIsAvailable()", +"061307b0": "fixPlayerPrename(uint256,string)", +"06130ca6": "getTopicAtIndex(uint256)", +"06132b38": "_create(address,uint16,uint16,uint8)", +"06137c9d": "add_luck(bytes32)", +"0613c265": "getLockBalance(address,uint8)", +"0613d936": "setAttackAddress(address,address)", +"0614117a": "recoverETH()", +"06155e95": "EmployeeSignedToESOP(address)", +"0615b520": "isBurner(address,address)", +"0615f7c3": "setGasForPBTT(uint256)", +"0616558c": "CampaignRules(address)", +"06169f63": "setAirdropAgent(address,bool)", +"0616ae05": "GenerateChips(address,uint256,uint256,uint32[])", +"0616cca0": "currentMood()", +"06171a5d": "OpsAddressUpdated(address)", +"061777ed": "incrementOpenInterestFromMarket(uint256)", +"06177ba8": "getdepositValue()", +"06184a25": "monthlySubscriptionCost()", +"0618c0b0": "INACTIVITY()", +"061931eb": "buySkill(uint256,uint256,uint256,uint32)", +"0619978d": "raiseApprovalEvent(address,address,uint256)", +"061a85c7": "forwardedOracle()", +"061ab664": "receiverTwo()", +"061b3245": "withdrawToExchange(address,uint256)", +"061c8800": "setInt(bytes32,bytes32,int256)", +"061c9040": "getLockInfo(address,address)", +"061d5102": "LivingstonCoin()", +"061d8169": "_addResolvers(string,address[],uint256[])", +"061e494f": "getBet(uint256)", +"061e5844": "withdrawFor(address,uint256,uint256,uint8,bytes32,bytes32)", +"061e7845": "buyTokens(string,string,address,uint256)", +"061ea8cc": "countByOwner(address)", +"061f7650": "supportsToken(address)", +"061f9811": "deleteRecord(uint256)", +"06201ad9": "getPLATPrice()", +"0620b2af": "PenaQuantumLeapToken()", +"0621472c": "approveAll(address)", +"0621afe4": "Virgingold()", +"0621b4f6": "sellAllAmount(address,uint256,address,uint256)", +"06222be3": "buyIcoTokens(uint256)", +"06223dac": "getDRCTotal(uint256)", +"06228e95": "freeTransferItem(uint64,address)", +"0622e74b": "crowdsaleTokenPriceNumerator()", +"06232bb0": "openAgreement(bytes,uint8,bytes32,bytes32)", +"06237111": "_getFilteredBoxes(bool)", +"06237526": "serviceCount()", +"06240d7d": "getWeiInCents(uint256)", +"0624ac2c": "getOutcomeTokens(bytes32,uint8)", +"0625d365": "getRightCoordinate(bytes1)", +"06262f1b": "trust(address,bool)", +"0627586a": "splitterNames(address)", +"06279d72": "priceUnits()", +"06287693": "directDebitAllowance(address)", +"062907d5": "initiateVotingContractUpdateVote(string,address)", +"062af37d": "isVersionContract(address,bytes32)", +"062b01ce": "isPricingSane()", +"062bbe59": "setEditedTrue(address)", +"062bd3e9": "getMarketTokenAddress(uint256)", +"062d0f09": "timestep()", +"062d4a34": "addressAdvisoryBountyTeam()", +"062db578": "createtoken(string,string,string,string,string,string,address)", +"062e43a1": "withdrawalToken(address)", +"062e53f3": "intFunc(int256,int256,int256)", +"062fe08e": "TOKENS_AVAILABLE()", +"062ff957": "fetchVoteNumForVoter(address)", +"06301ce8": "delUnpausedWallet(address)", +"06309aa0": "SistanToken()", +"0630da28": "TokenDeskProxy(address,uint256)", +"0631a171": "DocumentAdded(uint256,string,uint256,string)", +"0632a2f3": "getBlockAddress(uint256,uint256)", +"0632f718": "RedditRegistry(bytes32,uint8,uint16)", +"0633cd32": "requestAddressChange(address)", +"06347def": "getCooldownEndTimeFromIndex(uint16)", +"063575de": "withinPeriod()", +"0635fe90": "playerLockedFunds(address)", +"0636d7ac": "getOrdersForSeller(address)", +"063925c8": "scheduleCall(bytes,uint256,uint256)", +"06394c9b": "changeOperator(address)", +"063a7400": "registerUserOnToken(address,address,uint256,uint256,string)", +"063b1566": "partyTo(address)", +"063b3b29": "getPlayerStatus(uint256,uint256)", +"063bac1f": "giveRightToVoteByBatch(address[])", +"063bde24": "MAX_VALUE()", +"063c67c2": "getMatchInfo()", +"063ca521": "setPossibleMobs(uint32[])", +"063cea26": "prenupAgreement()", +"063cfaf0": "getVestingReleaseRate(address,uint256)", +"063d93d8": "register(address,string,string,string)", +"063db820": "payFee(uint256,uint256,address,bool)", +"063dda8b": "preSaleBonus(uint256)", +"063e1b78": "setTradingTime(uint256[])", +"063e7451": "initialSupplyAddress()", +"063ec2f0": "MEDIA_SUPPORT_PERCENT()", +"063f4540": "LogBet(address,uint256,uint256,uint256)", +"06407746": "Grant(address,bool)", +"0640f885": "PAYCLECOIN()", +"0641d812": "accruedDiv(address)", +"064292a8": "updateDates(uint256,uint256,uint256,uint256,uint256,uint256)", +"06437e4f": "_getCards(uint8,address)", +"0643be3e": "transferFrom(uint256,uint256)", +"06444e91": "register(address,uint32)", +"06459119": "testThrowsTransferNotTransferable()", +"0645b5d5": "getMyShareholderID()", +"06463556": "validateFunction(bytes4)", +"064701c6": "buyChest(uint16)", +"06474d12": "tokenIdOf(uint256)", +"06477332": "getMemberAtIndex(address,uint256)", +"0647b106": "Store(address,uint256,uint256,bytes32)", +"0647f697": "Uint256Oracle(uint256)", +"06490f47": "lockup()", +"064aa0e3": "ATMToken(uint256)", +"064af4ee": "setCoreContractAddress(address,address)", +"064c4ebc": "backDevvoteOwner()", +"064cc7a7": "delegatesByDelegator(address)", +"064cd77f": "changeFreezeDate(uint256)", +"064cfc16": "checkIsOpen()", +"064d4d7c": "_minAmount()", +"064da5e7": "getBAAU(bytes32,address,address)", +"064da642": "TransferSellAgentMulti(address[],uint256)", +"064dcb17": "sellTokens(uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", +"064ddd04": "getItemsForSale()", +"064f4fa7": "rateAge()", +"064f5dcd": "decentralizedEconomy()", +"064f67e7": "LockRemoved(address)", +"064fe208": "IxiniumFundingCoin()", +"06502ac0": "setMemberShip(address,uint256)", +"06504c31": "getNeedCloseBets()", +"0650b590": "bulkAdd(address[])", +"0651844e": "activateBalance(address)", +"06525841": "canCashBack()", +"0652d7f5": "fxFee()", +"065361a6": "buyBkgAtExchg(address,uint256,uint256,uint256)", +"0654cb16": "canInvest(address,uint256)", +"0654fbc4": "giveEther(address,uint256)", +"06552ff3": "init(address,address,address,address)", +"0655c58b": "getIcoTokensAmount(uint256,uint256)", +"06562575": "isTermOver()", +"0656dd02": "existingContract(address)", +"06575c89": "currentWeek()", +"0657a9c5": "registerTopPlayers(uint256,uint256[],uint256[])", +"0657f3a1": "finishIco(address,address)", +"0658a429": "BlockHashStorage()", +"0658b574": "storeImageString(string)", +"0659928c": "weiPerMinToken()", +"065b1061": "ln(uint256,uint256,uint8)", +"065b3133": "getDataColla_AA_02(string)", +"065c6b90": "setLevelRewards(uint256,uint256)", +"065de1f6": "minionRemove(address)", +"065de950": "dropNectar(address[])", +"065df077": "createBondFundToken(string,string,uint256,int256,uint256,uint256,address,string,uint256)", +"065e5360": "currentTick()", +"065ec2e6": "_restriction()", +"065ece90": "StageTwoDisable()", +"065f7a98": "totalNonSaleSupply()", +"065fcdff": "distributionThree(address)", +"065fe24f": "heldTimeline(address)", +"0660b8b2": "updateethFee(uint256)", +"0661b2f4": "setOtherPCK(address)", +"0661f204": "generateOtherNums(uint8[4])", +"066208de": "setInitialDuration(uint256)", +"06621ff6": "AZEEMCOIN(uint256,string,string)", +"0662572f": "activateSale(address)", +"06637876": "customers()", +"06637cd9": "getNewPeriod()", +"06638e92": "GetNumbersFromHash(bytes32)", +"066406ad": "LootEtherCom()", +"0665a06f": "createVesting(address,uint256,uint256,uint256)", +"0665c82b": "doPurchase(address)", +"06661abd": "count()", +"066636da": "getTotalEtherOfCurrentRound()", +"0666a6da": "setUnlceRateAndFees(uint256)", +"0666c071": "getEmployeeInfoByName(string)", +"06673ac7": "OmnesToken(address,address)", +"0668f649": "lambosTuneCount()", +"066aa53b": "updatCokeTotal(uint256,uint16)", +"066aff83": "calc1RealTokenRateFromRealTokens(int128)", +"066b0380": "assertEq30(bytes30,bytes30,bytes32)", +"066b3136": "paymentSuccessful(bytes32)", +"066bdc1b": "Legend_Royale(uint256,string,uint8,string)", +"066bf18c": "checkGoal(address)", +"066c94ba": "minTxSize()", +"066cc231": "YouAreHereAt(uint256)", +"066cd2c6": "createOfferAssets(uint256[],string,uint256,uint256)", +"066cf539": "vaultSecondaryUnlocked()", +"066d4701": "callFirstTarget()", +"066d76fe": "update_ratio(uint256,uint256)", +"066e4748": "calculateIdeaBuy(uint256,uint256)", +"066e4ce3": "CancelSell(address,uint256,uint256)", +"066f8a7d": "_disconnectModule()", +"066fd899": "availableReward(address)", +"067002ce": "removeSellingItem(uint256)", +"06713c3e": "proxy(address)", +"0672859b": "getMonsterCP(uint64)", +"0672cce3": "changeMinBet(uint8[157])", +"0673c8be": "isZero(address)", +"0674763c": "assert(bool)", +"06748fb1": "_random()", +"067497e2": "LogIcoTokenSupplyUpdated(uint256)", +"0674fde4": "aventus()", +"0675cb0b": "mintBool()", +"0675e962": "delegateIsCurrent()", +"0676aade": "GetOtherCustomerInfo(bytes18)", +"0676bde3": "BitGuildToken()", +"06771000": "ownerClawbackCredits()", +"06772bbd": "LogStateTransition(uint8,uint8)", +"06780cf5": "preIcoWallet()", +"06784b81": "MAXWIN_inTHOUSANDTHPERCENTS()", +"06787b98": "setHalfLifeRate(uint256)", +"0678c282": "extendRound(uint16,uint256)", +"067903f9": "withdraw4()", +"067906b1": "profiterole()", +"0679195a": "BerryLakeToken()", +"06791fc8": "enterPool(address,uint256)", +"067969a3": "sale2Accepting()", +"067a1e16": "getLockedValue(address)", +"067a2f3e": "Goochain(uint256,string,uint8,string)", +"067a6b05": "myRole()", +"067a8eb4": "registeredFundToRegistrants(address)", +"067ad784": "defaultBonussRate()", +"067ade9f": "claimSeedOwnership()", +"067c2d78": "thirdStartTime()", +"067cf182": "generateReport(int8[],uint32[])", +"067e06ee": "getServerStatus(string)", +"067ec02e": "Xkcd()", +"067eeeac": "tempTokensBalanceOf(address)", +"067fc6dd": "isTokenHolder(address,address)", +"06802613": "mintForCreatorsPool(uint256)", +"068045c7": "crowdsaleSetup(uint256,uint256)", +"0680d58a": "replaceService(address)", +"0681ae70": "FARTCOIN()", +"0681ca55": "milestoneCount()", +"068365ec": "buyWithCustomerId(uint256)", +"0683751e": "_removeByValue(address)", +"0683d56a": "minimumParticipationAmount()", +"0683dc58": "checkTransferIn(address,address,uint256)", +"0683dfdb": "getIdentifiersCount(address)", +"068417d9": "_registerInterface(bytes4)", +"06845b9f": "setTransferAbility(bool)", +"06845c4a": "LogFreezerRemoval(address,uint256)", +"0684c12b": "distributePresaleTokens(address,uint256)", +"0685224c": "GraspSmartBlockchainLock()", +"0685b410": "submitChooseByFactory(address,uint256)", +"0685b42c": "maascash()", +"06867f7d": "accountA()", +"0686dc8d": "setNEW(address,uint256,uint256,uint256,uint256)", +"06873418": "getcoolduwn(uint32)", +"0687bb4a": "purchaseCarCard(uint256)", +"06880dc0": "takeLoan(uint64)", +"06881fd1": "setBaseTokenGetRate(uint256)", +"068841c6": "getNeedLockFunds()", +"06884fc8": "airdrop2()", +"06886a53": "curOpenBNumber()", +"06886fd0": "logRoyalty(address,uint256)", +"0688b135": "recipient2()", +"0688ec24": "preicoAndAdvisorsAmounts(uint256)", +"06894f59": "TakeBack()", +"0689d0ff": "timeToChallenge()", +"068aafb8": "NepExToken()", +"068ae02b": "DATE_LIMIT()", +"068aebbc": "transfer(uint8[],uint8[],uint32[])", +"068b7310": "maxWei()", +"068bcd8d": "getPool(uint256)", +"068c017b": "calcUnlock(address,address)", +"068c8e61": "GetLandData()", +"068c966b": "DrawDetails(uint256)", +"068d5363": "withdraw_bix()", +"068ea2aa": "getLawyerAtIndex(uint256)", +"06900a40": "coAdmin()", +"06900c41": "ZeroPonzi()", +"06903e3e": "offeringProposals(address,uint256)", +"06903ecc": "GVE()", +"06907e17": "block(address)", +"06909f69": "cancel(string,uint256)", +"0691d0bf": "move(address,int64)", +"069215c9": "icoPhaseAmount4()", +"06921a9c": "PRESALES()", +"06934753": "getLanguageCountry()", +"0693b1ab": "minCount()", +"0693e603": "tokensAmountForPurchase()", +"0693ee6e": "firstStartTime()", +"069476ea": "_dispute(address,uint256,uint256[])", +"069489a2": "init2()", +"0694d1be": "refundsOpen()", +"0694f9d6": "getQtyValidators()", +"06961560": "DAO(address,uint256,uint256,uint256,address)", +"0696647a": "test_insert_findWithHintNextAtPosition()", +"0696ba24": "revokeTickets(address,bool)", +"0696eab6": "RICHCrowdsale(address,address,uint256,uint256)", +"0697dfb1": "tokenSetMintFeeProp(address,address,uint256)", +"0698ac9b": "decreaseWeiRaised(uint256)", +"06991539": "_addTokenToOwnersList(address,uint256)", +"06993c97": "writerAccountSupplyRemaining()", +"069984c9": "SmartVows(string,address,address,string,address,address,string,string,string,string,string,string,string)", +"0699d07d": "updateMaxVal()", +"0699f10a": "LightAirdrop()", +"069a2e73": "registerModuleHandler(address)", +"069a6947": "biddedico()", +"069b559c": "migrateThroughOneFork()", +"069b9232": "ChenXiangToken(uint256,string,string)", +"069bd974": "validateTransfer(uint256)", +"069c97df": "angels_lock_days()", +"069cff34": "getMymorties()", +"069d6d1c": "closeOrder(uint256)", +"069d92e3": "showInvestEther(address,uint256)", +"069e5e53": "createEscrow(address,address,uint256,uint256,uint256,uint256)", +"069e9dba": "activateHandbreak()", +"069f5f72": "getMineableTokens()", +"069f74c7": "zcc()", +"069f7e85": "getGreeksBattlePoints()", +"06a0ab2b": "earningsPerShare()", +"06a24640": "setNextPot()", +"06a248c6": "depositTo()", +"06a33300": "BITOX(address,address,address,address,uint256,uint256,uint256)", +"06a36aee": "getUserRoles(address)", +"06a46703": "pubsaleDeadline()", +"06a493fa": "redeemCards(address,uint8)", +"06a49fce": "getCandidates()", +"06a5312b": "GetNumber()", +"06a585e6": "addInvestor(bytes32[3][],address,uint256,uint256)", +"06a5cb3a": "ecosystemAddress()", +"06a5f087": "signSeller(uint256)", +"06a628d4": "packSize()", +"06a669fc": "createPayment(address,uint256)", +"06a6c28f": "commitDividend(address)", +"06a74947": "getBigWinPot()", +"06a81591": "_price_token_PRE()", +"06a85497": "getGameBonusAdded()", +"06a86539": "PBTTForGas()", +"06a8f8a2": "admin2()", +"06a95b53": "blablabla()", +"06a98f0a": "Mine_Block()", +"06a9ce79": "updateTimer(uint256,uint256)", +"06a9d1a9": "fundraisingDeadline()", +"06aa4083": "icoWeek1Bonus()", +"06aacb14": "Broker(bool,address,address)", +"06ab34cf": "initExit(uint256,bytes32)", +"06ab5923": "setSubnodeOwner(bytes32,bytes32,address)", +"06aba0e1": "getTotalWeight()", +"06ac1527": "capWalletAddress()", +"06ac2303": "EthereumButton()", +"06ac5879": "perReserveListedPairs(address,bytes32)", +"06adb71d": "increaseEmployeeExtraOptions(address,uint32)", +"06ae9483": "contractExists()", +"06aef16a": "getAuthorizationDate(address,address)", +"06aef6fb": "_withdrawToken(address,uint256)", +"06af0650": "initializeCurve(bytes32,bytes32,int256[])", +"06af3c75": "get_next_user_recast_from_item(bytes32,bytes32)", +"06af7414": "ContestAnnouncement(address)", +"06b05238": "safeWithdrawAmount()", +"06b091f9": "withdrawTokens(address,uint256)", +"06b0c76d": "setReferenceHash(bytes32,bytes32)", +"06b16a6c": "petPresell(uint16)", +"06b1b479": "indCommunity()", +"06b1efe5": "pushData(string)", +"06b28cec": "createDividendWithCheckpoint(uint256,uint256,address,uint256,uint256,int256)", +"06b2be05": "payStyle()", +"06b2e607": "GetGamestatus()", +"06b2fe22": "remainingTokensCount()", +"06b2ff47": "canReverse(address)", +"06b3bcd1": "getIpfsAddress(bytes32)", +"06b3efd6": "assetBalanceOf(address)", +"06b4c3e9": "ABCToken(string,string,uint256)", +"06b5338a": "JCoinz()", +"06b5760d": "getCreateShareTokenOutcomeValue()", +"06b5ad18": "recovery(string,address)", +"06b5b21e": "proposeTransfer(address)", +"06b5f02d": "calcWinnings(uint256,uint256)", +"06b6689b": "nextLotteryTTMTokenId5()", +"06b70f62": "MULTISIG_OWNER()", +"06b726d6": "smartBlockAddress(address)", +"06b764ed": "addAddressDataPatternVoteRules(address,address,uint256,uint256,bytes,bytes,uint256[5])", +"06b77972": "getDescriptionInfo(bytes32)", +"06b82a7d": "deregisterSettlement(uint64)", +"06b89153": "BBB()", +"06b8ef4a": "rewardCheckpoint()", +"06b96bb4": "HoloSale(uint256,uint256,uint256,uint256,uint256,address)", +"06ba089a": "updateWebsite(address,address,string)", +"06ba2987": "addSellTokensRequest(address,string,string)", +"06ba8e42": "logDisputeCrowdsourcerRedeemed(address,address,address,uint256,uint256,uint256,uint256[])", +"06bb18c0": "NewCratePreSale()", +"06bbbeff": "getUserBetOf(uint256,address,address)", +"06bc7ef3": "deleteInvestContract()", +"06bced7c": "set_presale_arbits_total(uint256)", +"06bcf02f": "updateStartTime(uint256)", +"06bd7aac": "setSubdivisionEnabled(bool)", +"06be8e04": "_payToInviter(address,uint256)", +"06bee2be": "CartycoinToken(uint256,string,string)", +"06c01551": "setAtomDna(uint256,uint64)", +"06c0e841": "withdrawPayout()", +"06c1032c": "Created(address,address,uint256,uint256,string)", +"06c15206": "GTL()", +"06c17cd7": "sliceLengthThrow()", +"06c18600": "takeOwnership(uint256,uint256)", +"06c18ae0": "CyberVeinToken(address,address,address,uint256)", +"06c1b0ba": "adPriceDay()", +"06c1df7b": "checkBetColumn(uint8)", +"06c265b6": "VICCOToken()", +"06c270be": "HmcDistributor()", +"06c2b53c": "becomeTo()", +"06c2f050": "setSendToSafeWalletPercentage(uint256)", +"06c30e84": "CoVEXTokenERC223()", +"06c3f137": "getLastNReadingsByDeviceId(uint8,uint8)", +"06c45c2a": "addToTradeList(uint256[],uint256[],uint256[],uint256[])", +"06c4811e": "TokenOWLProxy(address)", +"06c5b9d0": "XiaoMuBiaoERC20()", +"06c6c546": "massApprove(address[],uint256[])", +"06c7e165": "SevenStandardToken(uint256,string,uint8,string)", +"06c80102": "releaseAbstractToken_(address,uint256)", +"06c89667": "change(string,string,uint256,uint256,bool)", +"06c8ffed": "removeMultipleAddressesFromWhitelist(address[])", +"06c91ce3": "gx()", +"06ca218f": "doPayout(uint256)", +"06ca66f0": "Indosat(address)", +"06ca9bba": "Start_NewRound(uint256)", +"06caf3e6": "extraDiscount(uint256)", +"06cb0ea4": "updateAd(uint256)", +"06cb4bcd": "sendDeposit()", +"06cc01bc": "setBuyCommissionBps(uint256)", +"06cc2035": "revokeFeeExemption(address)", +"06cc2cd2": "recordSoldPrice(uint256)", +"06cc6373": "UpdateUserExtraData3(address,bytes32)", +"06ccd230": "addToNumber(uint256)", +"06cd4728": "RublixToken(uint256,address)", +"06cf2280": "transferWithFee(address,address,uint256,uint256,uint256,address)", +"06d00b10": "doesOwn(bytes32,address)", +"06d0407e": "getBeneficiaryFinance()", +"06d0db26": "roundMoneyUpToWholeFinneyET(uint256)", +"06d145c9": "getFundingInfoForUser(address)", +"06d1772d": "TWOIoT()", +"06d177c1": "divPoolAmt()", +"06d19d68": "getHashRevealEnd()", +"06d19eb3": "updateSeller(address,uint256,address,uint256)", +"06d37817": "loanToken()", +"06d44278": "_emitError(uint256)", +"06d586bb": "maxPerUser()", +"06d58f2a": "claimAndWithdraw(address,address,address,uint256,uint256)", +"06d65af3": "preSaleStartTime()", +"06d6b095": "ProposalAdded(uint256,address,uint256,bytes)", +"06d6e513": "checkIsKYC(address,address)", +"06d83296": "setData_17(string)", +"06d832a3": "ownerStartContract()", +"06d8619b": "transferKing(address)", +"06d91eea": "getExoplanet(uint256)", +"06d978b2": "setMinDepartureLim(uint256)", +"06da3309": "Deposited(uint256,uint256)", +"06dafac6": "setGreyToken(address)", +"06db33e4": "getVotesByCandidate(uint16)", +"06db8af7": "toAddrString(uint256)", +"06dc5d7f": "total_user_eth()", +"06dc8949": "calculateTokenSellPrice(uint256)", +"06dcd5d0": "CATTOKEN()", +"06dd497f": "cancel(address,uint256,address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)", +"06df6cf0": "icoTokenExchangeRate()", +"06e102a0": "Presale(address,uint256,uint256,uint256,uint256,uint256,address,address)", +"06e16a36": "currentTierId()", +"06e1976c": "lockAccount()", +"06e232c4": "getLuckyblockIds()", +"06e25081": "getFreeToken(uint256,address,uint256,bytes32,bytes32,uint8)", +"06e28346": "redeemPlatformMaintenance()", +"06e2f5c1": "getRoundRate(uint256)", +"06e31056": "FANCrowdsale(uint256,uint256,address,address)", +"06e34150": "filters(uint256)", +"06e3a700": "setStartingSeeds(uint256)", +"06e3d732": "getMyChest()", +"06e42962": "_winnerJackpot(uint256)", +"06e430f6": "getAcceptedOracles()", +"06e48538": "defaultOperators()", +"06e4d36f": "getSoftCapReached()", +"06e53e5c": "getCountHolder()", +"06e53f47": "whichChainIsThis()", +"06e5fe85": "promoPurchase(uint32,uint8,uint8,uint8,string)", +"06e63ff8": "insert(string,string)", +"06e64907": "End()", +"06e795e8": "sendToAddress(address,uint256,uint256)", +"06e7b5ad": "isDisputing(address)", +"06e8337f": "getTotalTickets()", +"06e83e2f": "send(address,address,address,uint256)", +"06e840ea": "incrementStatistics(uint256,uint256)", +"06e91d2e": "ROY()", +"06e99fef": "sendEth()", +"06ea1c02": "setArbitrationFeePerJuror(uint256)", +"06ea29c2": "notEqual(int256[],int256[],string)", +"06eb0c2f": "TokenERC20_test(uint256,string,string)", +"06eb6ac1": "TokenPaymentGateway()", +"06eb815f": "handleETH(address)", +"06ebe49f": "incMemberGoodRep(address,uint256)", +"06ec16f8": "collect(address)", +"06ec6272": "payCustom(address,uint256)", +"06ec8ca6": "setCurrency(bytes32)", +"06ec967b": "deleteHpbNodeBatch(address[])", +"06ec9b9e": "ETH_PRICE_USD()", +"06eca511": "unhaltICO()", +"06eccccb": "_getPersonalAirdrop(address,address)", +"06ed6908": "buyTokensFromContract()", +"06ed69b9": "dDeprecateCategory(bytes32,uint256)", +"06edcd24": "hasOpenedOldCrates(address)", +"06ee3b69": "startCloseSalePhase()", +"06ee4917": "ChainMaster()", +"06eeaba0": "tokensForParnter()", +"06ef53e0": "latestWinner()", +"06ef856b": "ethRelief()", +"06efdecd": "OwnerTransfered(address,address)", +"06f1117d": "REFERRAL_BONUS_LEVEL2()", +"06f13056": "batchCount()", +"06f13b8f": "transferTokensToEarlyEquityInvestor(address,uint256,bool)", +"06f2bf62": "getExchange(address)", +"06f33115": "ClaimedAmount()", +"06f33ae2": "setUnownedLifeRate(uint256,uint8)", +"06f36cc9": "helpBlue()", +"06f3a06a": "zeroInvestments()", +"06f3fc8a": "Mapoc(address)", +"06f470e9": "purchaseEstate(uint256)", +"06f4b12e": "changeTenant(address)", +"06f4f7de": "cancelDigitalArtSellingItem(uint256)", +"06f53cb3": "tryFinalizeProposal(uint256)", +"06f57add": "getWeekNumber()", +"06f639fe": "tier3(address)", +"06f660ef": "getInitialPrice()", +"06f68f12": "updateFirstBuyNum(bytes32,bytes32)", +"06f69881": "crossForkFundDeposit()", +"06f70295": "answer(uint256)", +"06f74bcf": "pauseInternal()", +"06f7ec97": "preICOBonus()", +"06f7f3fe": "getERC20Pawn(uint256)", +"06f84701": "canRedeemUTXO(bytes32,bytes20,uint8,uint256,bytes)", +"06f8ac40": "miniumInvestment()", +"06fa01b1": "MasonCoin()", +"06fa9df9": "hashPositions(uint32,int64[],bytes16)", +"06faebbe": "setPromoToPartner(string)", +"06fbf606": "setBurnFeeProp(uint256)", +"06fd06f8": "Exchanger()", +"06fd537b": "burnMoney()", +"06fdde03": "name()", +"06fdde58": "structure_variant_confirmation(int8)", +"06fde169": "REQUIRED_SHARES_TO_BE_BOARD_MEMBER()", +"06fdf75d": "getRedeemValue(uint256,address)", +"06fe0c29": "finishMilestone(string)", +"06fe1fd7": "getPackageName(bytes32)", +"06fe2212": "changeWaitTime(uint256)", +"06ff8908": "JoyToken()", +"06ffce53": "getTokenValue()", +"07002f02": "canIssue(uint256)", +"07006a55": "createPromoEggs()", +"07016f60": "getPOOL_edit_25()", +"0701da46": "limitAccount(address,uint256)", +"07023a38": "SellerHistory(address,uint256,uint256)", +"07031305": "setExpiration(uint256,uint256)", +"0703ffd1": "getLimitedReporterMarkets()", +"070485a9": "setGlobalPause(address)", +"070494ce": "blockFundsInEscrow(address,uint256,address)", +"0705028c": "addTransaction(uint256,address,address,bool,uint256,uint8)", +"070545d8": "Extend(bytes32)", +"07058808": "WinTokenLock()", +"07062cf2": "vision()", +"070669e6": "Requested(address,bytes32)", +"07073756": "_getTokenAmountForReferral(uint256,bool)", +"0707873c": "getInvestorInfo(address)", +"0707a106": "setRateEthToToken(uint256,uint256)", +"070816f1": "transferTeam1Tokens(address,uint256)", +"07085842": "smartcontracts(uint256)", +"0709544e": "getColor(bytes1,bytes1,bytes1)", +"0709d116": "setBlackListERC223(address)", +"0709df45": "vaultOf(address)", +"070a888f": "updateRewardDuration(uint256)", +"070ae23b": "createContractTokenWithPrice(string,uint256)", +"070b91d1": "voting(uint256,uint256,bool,uint256)", +"070bc415": "_computeUniqueness(uint256,uint256)", +"070bc508": "SupremIOTToken(address)", +"070be532": "BSE()", +"070c04b1": "setFromContractAddr(address)", +"070c3c23": "previousPayoutBlock()", +"070c87f9": "enableERC20()", +"070caf36": "exchangeTokenToEther(address,uint256)", +"070cf0cb": "isAgreementFullySigned(bytes32)", +"070f0e96": "countTokenHolders()", +"070f52f4": "canExchange()", +"070f5c09": "pausePresale()", +"070f723d": "_initializeGame()", +"070f7926": "_sendByDefaultTranches(address,address,address,uint256,bytes,bytes)", +"070fdb96": "getTakerBet(uint256,address,uint256,address)", +"07113965": "setPOOL_edit_3(string)", +"07120872": "createFightAuction(uint256,uint256,uint256,uint256)", +"07121a7a": "_requireBidderBalance(address,uint256)", +"07129e67": "SimpleEthBank()", +"07133caf": "HCToken()", +"07134b8b": "tokensNeededToGetPayment()", +"071357bd": "concludeCampaign(uint256)", +"0713d054": "checkDateExsit(uint256)", +"07142877": "PRE_SALE_MAX_CAP()", +"07144458": "forwardTokens(address[])", +"07146786": "userRankAddress()", +"0714c622": "anotherFunction()", +"07153d3b": "setStates(bytes32[])", +"07156854": "flipSwitchTo(bool)", +"0715b09f": "nouvelleProduction(uint256)", +"0715ec34": "EnchantedShop(address,string,string,uint256,uint32,uint256)", +"071696e0": "transferFAIDS(address[],uint256[])", +"0717f39e": "_isValidPerkToAdd(uint8[32],uint8)", +"0719d365": "TOKENS_CAP_ICO()", +"071a56df": "addOracle(address,string)", +"071a7541": "BETA()", +"071b7e73": "FinishIco(address,address,address,address)", +"071bafb5": "sin()", +"071bd079": "demo(uint256)", +"071bdfbd": "PlayCoin()", +"071c0306": "AvailableTokenPool()", +"071c802b": "saiVox()", +"071da02f": "totalBelaStaked()", +"071e1ddc": "processFunding(address,address,uint256)", +"071e8730": "AqsaJawaid()", +"071e9a76": "distributeFunds(address,uint256)", +"071ecb13": "getCurrencyContrData(uint256,uint256[7])", +"071eeeb3": "setStarNameMessage(uint256,string,string)", +"071fac61": "getAllMediators()", +"071fe9b0": "isBurnInClose()", +"07202460": "getMonsterObj(uint64)", +"07209e2b": "AllowanceCrowdsale(address)", +"0720fc78": "removeOWhitelist(address)", +"07216bda": "getBurnRequestStringMap(uint256,string)", +"072180ff": "buyCoinsAtExchg(address,uint256,uint256)", +"0721c6dd": "setCompte_29(string)", +"07220134": "getBetInfoByReveal(uint256)", +"0722559c": "endRentFlatDaily()", +"072419f4": "changeTeamFee(uint256)", +"072448f7": "midTimeBonusValue()", +"07256175": "SecondLevelCost()", +"07259d06": "limitGasPrice()", +"0725e898": "getTokensForOwner(address)", +"07260a43": "serveTx(address,uint256,bytes,bool,bytes)", +"07266117": "networkDevelopmentSupply()", +"0727adb3": "last_balance()", +"0728d5e3": "getDiscountedItemsForSale(uint256,uint256)", +"072933e9": "OWN_kill()", +"07293b9d": "maxStage2AllocationPerInvestor()", +"07298203": "GetStats()", +"072b3f49": "createContract(address,address,address,uint256,uint256,uint256)", +"072b8277": "VAPEbits()", +"072b9c83": "AxieERC721BaseEnumerable()", +"072b9cf2": "schema(bytes32)", +"072bdbb8": "getScripts(uint256,uint16)", +"072de7f3": "calculateTokenPrice(uint256)", +"072e28c2": "setCRManager(address)", +"072e4308": "detailsOf(string,string)", +"072ea61c": "entryFee()", +"073005f1": "canTransferFrom(address,address)", +"07304435": "getKilled()", +"0730a322": "FoundationTransfer(address,uint256,uint256)", +"073171d8": "LeaseBill(uint256,uint256,string)", +"0732717d": "buy_the_tokens(bytes32)", +"07336e35": "producedCaps()", +"0733b888": "getRoundsActive(address)", +"07342e9f": "MultiSigWalletWithDailyLimit()", +"073455f1": "BitDex(address,address,address,uint256,uint256,uint256)", +"073767fc": "changeRateFee(uint256)", +"073933ed": "isNotZero(int256,string)", +"07394d39": "TeamTokenLock(address,address)", +"0739cd26": "tsSucceeded()", +"073b3bf9": "addressToNumVillages(address)", +"073b423d": "mintTransfer(address,uint256,uint256,uint256)", +"073cc554": "newProposal(address,string,address,uint256,address,uint256,bytes)", +"073d5fd8": "DeadlineExtended(uint256,uint256)", +"073d9a28": "transferactive()", +"073e1fa3": "givecandyfrom()", +"073ede30": "addTeam1(uint64,uint64,uint64,uint16)", +"073f323d": "MamatToken(uint256,string,uint8,string)", +"07414002": "secureApprove(address,uint256)", +"07415ce8": "addressOfTokenUsedAsReward4()", +"0741dc1e": "withdrawToken(bytes8,address,uint256)", +"07420a41": "sendReward(address,uint256)", +"07433ca4": "createVesting(address,uint256,uint256,uint256,uint256,bool)", +"0744c56b": "getFreeHipster()", +"0745c160": "startProICO()", +"07461622": "setMinMax(uint256,string)", +"0746bfd9": "buySharesForProposal(uint256)", +"07471b18": "distributeInvest(uint256,uint256,uint256)", +"0747ab2a": "Winner(uint256,address,uint256,uint256)", +"0747e4eb": "wpr()", +"07489aa6": "totalFinalStage()", +"07489f92": "getUnsoldTokensVal(uint256)", +"074a1594": "addToAging(address,address,uint256,uint256)", +"074a1600": "percent2()", +"074b1e61": "referralsVault_()", +"074b5270": "leadingBid()", +"074bc101": "btcToken()", +"074c0836": "POMoooon()", +"074c09eb": "catalog()", +"074c32c4": "updateRatePlan(uint256,uint256,string,bytes32)", +"074c71e5": "SaleWallet(address,address)", +"074c9647": "updateEtherAmount(uint256)", +"074cac6c": "getFreeMinerForMiniGame(address)", +"074e06ee": "_addLuck(address,uint256)", +"074e0f36": "setMaxRefundableGasPrice(uint256)", +"074e6254": "blendWithYourself()", +"074e8940": "companyWalletAddress()", +"074f0a22": "DataContacts(address,address)", +"074fcfd5": "_blockKey(bytes32,bytes32,uint256)", +"07501073": "migrationGetPlayer(bytes32,uint8)", +"0751076d": "setBetMax(uint256)", +"07518c8e": "blockhashOf(uint256)", +"0752881a": "buyTokens(address,uint256)", +"075360bb": "moveRoundsToHolder(address)", +"07537ad4": "closeCrowdSale()", +"07539074": "LogInvestorRefunded(address,uint256)", +"0753afdf": "registration(string,string,string)", +"0753c30c": "deprecate(address)", +"0754236d": "minContributeETH()", +"07542576": "BayernvsRealMadrid()", +"07546172": "minter()", +"07549893": "SimpleChildToken(address,string,string,uint256,uint8)", +"0754e744": "icofunding()", +"07550f0a": "areAllBalanceNull(bytes32)", +"07560f13": "transferWithMessage(address,uint256,bytes)", +"0756f58f": "getDifficultyAsFixedPointForGameId(uint256)", +"0757114e": "getenddate()", +"07571c99": "getPayoutsCount()", +"075840d0": "bounty_funds()", +"075865c4": "getMiningWarDealine()", +"07587fa3": "KissMe(uint256,string,string)", +"075881d6": "purchasePlayer(uint256)", +"0758a980": "specialBonus(address)", +"0759a351": "getCCH_edit_30()", +"075a3b57": "releasedTo(address,address)", +"075acda7": "gasAmt()", +"075b1a09": "schemaId()", +"075bbcc7": "RESERVED_TOKENS_TIQPIT_SOLUTIONS()", +"075bf772": "teamTotal()", +"075c04ab": "dividendRewards(address,address)", +"075c18f7": "contributeByBitcoin(uint256,uint256,address,uint256)", +"075d4782": "publish()", +"075d7bb3": "setDontIndex(bool)", +"075deb95": "buyGana(address)", +"075e0a7c": "window3TotalSupply()", +"075f8ec2": "CommunityCoin()", +"075fe66a": "EDD()", +"075fe877": "scheduleCall(address,bytes,uint256,uint256)", +"0761923c": "TargetWalletUpdated(address)", +"0761a004": "step(uint256,bytes)", +"0761c57a": "rocketBlocksUntilAllowedToLaunch()", +"07621038": "getSponsorshipUser(address,uint256)", +"07626adb": "getApiId(string)", +"0762c317": "createNewPop(uint256,string)", +"07630eac": "sendTokensToBatch(uint256[],address[])", +"07632269": "_deliverPack(address,uint8)", +"07634cbe": "getCoupon()", +"0763b78b": "getPVEDuration(uint256)", +"0763f34e": "referrerReward()", +"0764a7fa": "FinderHyper()", +"0764ebd9": "updateExcludedAddress(address,bool)", +"0764f5e0": "serviceDeployCount(address)", +"076600ec": "ClaimDivs()", +"07660978": "PrepareForSale()", +"076736a2": "maxPurchaseSize()", +"07675951": "UpgradePurged(address)", +"0767d178": "weightOf(uint256)", +"076804b8": "checkAddressVerified()", +"0768e8fa": "payAffiliateToAddress(address)", +"07695379": "ControlStructure(uint256)", +"0769aefa": "createAnimecard(string,string,string,string,uint256)", +"076a1852": "zTransferLosingBets()", +"076a39a0": "HOUSEEDGE_inTHOUSANDTHPERCENTS()", +"076a6440": "setMain(address,address)", +"076ae31d": "BountyEscrow()", +"076b5fe1": "FangToken()", +"076c4870": "owner(address,address)", +"076c52b2": "betA()", +"076ccbe4": "testLedgerZeroCollateral()", +"076e18a0": "getCurrentTokenPriceWei()", +"076fdf3c": "getLockingTimestampTo()", +"076ffa3a": "___isActive()", +"0770a074": "adjustSupply(uint256,uint256,uint256)", +"077135a8": "totalNoOfTokenAlocated()", +"07715fd4": "BCOToken(address,string,string,uint256,uint256)", +"07716dd2": "hasEmployee(address)", +"07718a3b": "BankOwner_WithdrawDonations()", +"07730eb9": "BurnAllTokens()", +"077340c5": "transferAndFrozen(address,uint256,bytes,uint256,uint256)", +"0773aa85": "changeFoundersWallet(address)", +"0773e6ba": "addPermissions(address,address[])", +"0774774f": "lineageToken()", +"07751070": "getProperty()", +"07762e74": "viewMult()", +"0776e4fa": "set_balance(address,uint256)", +"077757fc": "transferWithoutChangeBest(address,uint256)", +"07776028": "creatorOwnership(address,address)", +"07777949": "transferEthBackToUser(address)", +"07779627": "isDelegate(address)", +"0777fa95": "TokenTKC()", +"0778425a": "getProposalsBySeller(address)", +"07786d0c": "sendAward()", +"0779afe6": "send(address,address,uint256)", +"0779d0f5": "refundApToken(address)", +"077a05dd": "sellSpecialTokensForPreSale(address,uint256)", +"077a8eaf": "abandonedIcoBalances()", +"077b109b": "_checkLedger(string)", +"077b124b": "addSuperInvestor(address)", +"077cd4bf": "petHpThreshold()", +"077d256a": "icoInvestorsAddresses(uint256)", +"077d3f8c": "Engrema()", +"077dadb2": "coinBalanceMultisig(address)", +"077e43b4": "getLastBallot()", +"077e6334": "endLock()", +"077f1008": "tovote(string,uint256,uint256)", +"077f224a": "initialize(string,string,address)", +"07801ac9": "addallmoney(address[],uint256[])", +"07801b5c": "nextroundGOTCHatcontract()", +"07805363": "joinGames(address,uint256)", +"07806b19": "cardDetailsStructs(uint8)", +"0780a196": "createDetail(address,uint256)", +"0781c111": "TokenSeller(address,uint256,uint256,bool)", +"0781f4d2": "emitting()", +"07822f7d": "viewauctionlist(uint256,uint256)", +"0782709a": "setKrsUsdRate(uint256)", +"0782fc35": "releaseValue4()", +"0783c2ef": "getAuditState(uint256)", +"0783d820": "getSysRestEth(uint256,uint256,uint256)", +"0784a07f": "distributedTokensAmount()", +"0785001c": "amountGoal()", +"07855f4f": "startPlacingPhase(uint256)", +"07858f0e": "setBallotOwner(uint256,address)", +"0785ca29": "BalanceCheck(uint256)", +"0785cb94": "DateOfBirth()", +"0786f01e": "setCookUpFee(uint256)", +"0786f72b": "etherAddress()", +"0787006d": "setCosignerCallGas()", +"0787bc27": "providers(address)", +"07883703": "Mint(uint256)", +"07885cd1": "PaymentChannel(address,address,address,address,uint256,bytes)", +"078895ea": "GbeeStandardToken(uint256,string,uint8,string)", +"0788f69c": "setCityPicture(uint256,string)", +"07894b1e": "initMartial()", +"0789fc01": "burningPercentage()", +"078aa5af": "testStorage(uint256[],uint256[])", +"078b247e": "shouldBeTerminated()", +"078b55e6": "createLibrary(string,string)", +"078bd227": "outputa(address)", +"078c0452": "setJobCompleted(bytes)", +"078c3fa4": "_transferToICAPWithReference(bytes32,uint256,string)", +"078c42e6": "AirdropCheck()", +"078c51f0": "getTournamentCount()", +"078cc1cb": "setStartersProxyAddress(address)", +"078cfee6": "initializePrivateSale(uint256,uint256,uint256,uint256,uint256)", +"078d1258": "addFrostTokens(address,uint256,uint256)", +"078d88ff": "Validated(string,uint256)", +"078db9c9": "Mepoupe()", +"078dcd2f": "isGoodAlreadyAdd(bytes32)", +"078dfbe7": "transferOwnership(address,bool,bool)", +"078e096d": "endPublicIco()", +"078f872c": "closeProposal(bytes32)", +"078f8d3b": "ConversionAborted(uint256,string)", +"078f9378": "updateParameters(address,address,uint256,uint256,uint256)", +"078fd9ea": "saleCap()", +"079095ae": "VULCAN_POD()", +"0790e880": "setBlockappsAddr(address)", +"07910a78": "get10Tokens()", +"07912c14": "setI6(address)", +"079172da": "proofSet()", +"07927187": "addEmployee(uint256,string,address)", +"07930644": "getExchangeAdapter(bytes32)", +"07932772": "judge(uint8)", +"07939a17": "BUYER_STEP_3(bytes32,uint256)", +"07957360": "verifyOwnership(address,address)", +"0796c325": "Loading()", +"0796f97b": "FIRST_DAY_END()", +"07973ccf": "userCount()", +"0797595a": "donateDnaFromContract(address,uint256,uint8)", +"0797adb0": "loadEngineerOldData()", +"07986518": "GoogleChainSale(address,uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"0798d7ef": "removePreIcoMembers(address[])", +"07993f04": "getPaper(uint256)", +"0799ad8d": "takeBackNTRY(address,address,uint256)", +"0799f1b2": "registerZTKCheck(address,string,string,string,string,string,uint256,string,string,int256,uint256)", +"079a193b": "changeAllowance(address,uint256)", +"079aab88": "newPresserFee()", +"079b365e": "reportProfit(int256,bool,address)", +"079c002f": "TOKEN_WITHDRAWAL_START_DATE()", +"079c12fb": "RongWQToken(uint256,string,string)", +"079c345d": "major(uint256)", +"079c9fbb": "airDropSame(address[],uint256)", +"079caa14": "grantAdvisorsTokens(address)", +"079ce327": "reLoadXname(bytes32,uint256,uint256)", +"079cf76e": "getRoot(address)", +"079d229f": "freeFromUpTo(address,uint256)", +"079d2b96": "IsCampaignAvailable(uint256)", +"079d7d7f": "winningPot()", +"079e0e0e": "batchBuild(uint256[],int256[],int256[],uint8[])", +"079eaf34": "addUser(string,string)", +"079ee6b3": "addParticipant(address[],uint256[])", +"07a1ca5f": "endGame(address,bytes)", +"07a2aac2": "reverseBytes()", +"07a2c4d5": "DanatCoin()", +"07a3082d": "ConstructByCredits(uint256,uint256)", +"07a43efd": "export()", +"07a67fb3": "get_pool(uint256)", +"07a6e434": "getDocs(uint256)", +"07a72184": "stringToBytes32(bytes)", +"07a7465f": "getDescendantsOfThing(uint256)", +"07a77473": "_isOnAuction(uint256)", +"07a8275d": "getInviteEarnings(address)", +"07a878f6": "CLPToken()", +"07a8af6f": "expiryLimit()", +"07a8df44": "capInitialized()", +"07a94ed2": "powerDayRemainingLimitOf(address)", +"07a9574a": "changeLeaderMessage(string)", +"07a95e83": "refundUnclaimedEthers(uint256)", +"07a993e5": "setOtherCurrenciesChecker(address)", +"07a9d7a8": "hasConfirmedApplicant(address,address)", +"07aba33d": "getNext(uint256)", +"07ac15e2": "getInitBlock()", +"07ac8087": "getQuickBuyEtherTokenAddress()", +"07ad3282": "lastSettlementStartedTimestamp()", +"07ad9ecb": "safeSend(address,uint256)", +"07ae279c": "stage_Days()", +"07ae3095": "setNotMoreThan(uint256)", +"07aef7a6": "BGGToken()", +"07afbe74": "addAssetToOwnedAssets(address)", +"07b1470c": "debugVal3()", +"07b15667": "addPresaleAllocation(address,address,uint256)", +"07b1be24": "addTokenPairSecondPart(address,address,uint256,uint256)", +"07b261bc": "addOwner2(address)", +"07b26217": "removeAvailability(uint256[],uint256)", +"07b2779f": "BasicRegulator(address,uint256,uint256)", +"07b3776c": "currentRecord()", +"07b39962": "delAllowContractList(address)", +"07b578a0": "getGuestName()", +"07b5fc54": "updateDividendsFor()", +"07b60c02": "calculatePermillToRelease(uint256)", +"07b657ce": "lastBlock_v17()", +"07b6b762": "reserveFullMintAllowance(int256)", +"07b6f631": "testTestHarnessAuth()", +"07b86b41": "transactionsOnNowVal(address)", +"07b88cb3": "registerOffering(bytes32,bytes32,address,uint256)", +"07b8ef24": "votesSupport()", +"07b99366": "initExit(bytes32)", +"07b9ac2c": "editTrustee(address)", +"07ba216c": "coinsaleactive()", +"07ba217c": "pay1(address)", +"07baa3db": "ARXCrowdsale()", +"07bbb378": "BoughtTokens(address,uint256,uint256,uint256,uint256)", +"07bc6fad": "withdraw(address,uint256,bytes32,uint256)", +"07bc8829": "showText()", +"07bcf03a": "CFXToken()", +"07be02fe": "getPublisher(bytes32)", +"07be6ef8": "getTopCompanyStartPrice()", +"07be74b9": "refundWhite(uint256,uint256,uint256)", +"07bec66f": "buyout(uint256)", +"07bee472": "totalMainSaleTokenLimit()", +"07bf5863": "unprocessedQueryList(uint256)", +"07bf9b9f": "BONUS_SCALE()", +"07bfaa03": "toB32(uint256,uint256,bytes)", +"07bfce37": "long()", +"07c037af": "NipToken()", +"07c1880a": "logMarketCreated(bytes32,string,string,address,address,address,bytes32[],int256,int256,uint8)", +"07c24086": "preSaledeadline()", +"07c299c2": "eT(address,uint256,uint256)", +"07c2e16c": "getOrdersLength()", +"07c34e73": "releaseState1()", +"07c38522": "RMBToken()", +"07c3d98b": "balanceOfTotalUnclaimedMilk()", +"07c430bd": "Robincoin(uint256,string,string)", +"07c4d580": "transferForAdmin(address,address,uint256)", +"07c4e9e4": "ToggleFreezeToken(uint256)", +"07c533a5": "MTSCoin()", +"07c599df": "Stakefasttoken()", +"07c6b2fa": "_addDataStream(address,string,bytes32)", +"07c7accb": "getIdentityProvider(address)", +"07c7bae8": "LogContributions(address,uint256,bool)", +"07c8e56f": "Filter(address[],uint256[])", +"07c8fb5a": "HelperSearch()", +"07c9cd45": "cancelSell(uint256)", +"07ca140d": "numberOfCampaigns()", +"07ca3bc1": "ping(bool)", +"07ca6931": "StrategyAddress()", +"07cadb0f": "createCryptoAvatar(uint256,uint256,uint256,uint256,address)", +"07caf9e1": "advisorFirstLockTime()", +"07cb33d5": "ReleasableToken()", +"07cb4419": "OWN_contractlocked(bool)", +"07cbe8ab": "raisedFromToken(address)", +"07cc36da": "BNBNSRegistry()", +"07cc6051": "airAmount()", +"07ccad95": "TEAM_POOL_TOKENS()", +"07cd401c": "dividendDistributionPool()", +"07cd5c29": "batchRefund(address[],uint256[])", +"07cdee49": "coo()", +"07ce55a0": "ExtraFinalizeAgent(uint256,address,uint256)", +"07cfa11f": "WELFARE_HANDOUT()", +"07cff6f2": "getERC20(address,uint256,address,uint256)", +"07d03f8c": "sendTokensToSale()", +"07d0da7e": "NormalToken(string,string,uint256,uint8)", +"07d15ffd": "SteriliumToken()", +"07d1c4af": "ICOStartPromo()", +"07d1ccd2": "nStages()", +"07d20edc": "preSoldTokens()", +"07d31642": "trustDealer(address)", +"07d3be03": "setItemsForSale(uint256[],uint256[])", +"07d3d941": "CIRCULATING_BASE()", +"07d4db39": "transferResidualScoupons(address,uint256)", +"07d52598": "purchase(uint256,string,bool,uint256)", +"07d544fa": "OrpheusOrganicsThailand()", +"07d5b826": "buyAllOutcomes(bytes32,uint256)", +"07d5ebf5": "getDrones()", +"07d6a5d4": "dripToken(address,uint256)", +"07d71e73": "getAllMatchesForRoundId(uint256)", +"07d76ae9": "getOrderDealSpeed()", +"07d78e21": "bonusRateInPercent1()", +"07d7f8ed": "ANHUI_ANNUITY_DAO_33()", +"07d86788": "finalizeReclaim(uint256)", +"07d94ac7": "canSendWebGift()", +"07da14ce": "AddItem(string,uint256,uint256)", +"07da68f5": "stop()", +"07db37e7": "contribute(address,address)", +"07db4228": "beneficiaryMultiSigWithdraw()", +"07db7fe0": "initOne(string,string,uint8,uint256,uint256,address,address,bytes32)", +"07dbd529": "getLeastExpensiveCryptoGamer()", +"07dc6bd1": "setRoundParams(uint8,uint256,uint256,uint256,uint256,uint256)", +"07dc6f12": "refundInternal(bytes32,address,uint256)", +"07dcfebe": "DURIANFX()", +"07dd8271": "_removeArbiter(address)", +"07dd8e3b": "merge(uint256,bytes32,address[])", +"07dda675": "view70()", +"07ddd6c9": "SkinBase()", +"07de67dc": "makeVisible(uint128)", +"07de8e8c": "MultiSigController(address,address[],uint256)", +"07def80d": "teamsCreatedCount()", +"07defcac": "pizzaHolder()", +"07df18d3": "test0Vote()", +"07df3fa4": "tokensIssuedForBonusRangeFour()", +"07dfe49f": "ALLOC_ADVISORS_BOUNTIES()", +"07e00bcb": "kissBTCCallback(uint256,uint256)", +"07e0421f": "repossessionBlocks()", +"07e0e6f1": "addEmployee(address,address,address[],uint256)", +"07e124aa": "prolongPreIco(uint256)", +"07e1967a": "setAccountShareRuleGroupId(address,uint256)", +"07e27959": "reduceReserves(uint256)", +"07e33107": "addMetaProject(address)", +"07e35246": "getMinimumWishTribute()", +"07e3ad2d": "_getTokenBonus()", +"07e63412": "getPoster(uint256)", +"07e655eb": "resetFinalize()", +"07e669c3": "_cancelAuction(uint256,address)", +"07e7d5b9": "ZUKToken()", +"07e7f941": "setBonuses(uint256[],uint256[])", +"07e82a1e": "indexOf(uint16[],uint16,bool)", +"07e89ec0": "PUBLIC_SALE_PRICE()", +"07e8d284": "addressToPowerlevel(address)", +"07e9f217": "setDefconLevel(uint16)", +"07ea65c8": "getLastAlert(string,int256)", +"07eaa38b": "changeSettings_only_Dev(uint256,uint256,uint256,uint8,uint8)", +"07eb6123": "LogFinishPreICO()", +"07eb752e": "getListAddressHolders()", +"07ec0ead": "changeTechAccountAddress(address)", +"07ec4b42": "unicornBreedingAddress()", +"07ecdfe9": "XAUsToken()", +"07edb029": "MainstreetToken(address,address,uint256,bool)", +"07ee9df2": "NDT2Token()", +"07ef3ea1": "forceNextStage()", +"07ef8b33": "ETG()", +"07ef99a0": "demintTokens(int256,address,uint8)", +"07efbf2b": "DEVELOPERSFUND()", +"07f07648": "catalogPlayersAddress()", +"07f0973e": "EtherLotto()", +"07f125e7": "setMintPrice(uint256,int256,uint256,int256,uint256,int256)", +"07f171b7": "checkGoalandPrice()", +"07f1eb0d": "setMinimumTokenAmountForUpdate(uint256)", +"07f30f6a": "owner2OK()", +"07f3f764": "godMode(address,address,uint256)", +"07f442c4": "fightAlphaMonster()", +"07f4556f": "KIA()", +"07f4eace": "preSaleAmount()", +"07f4f3f4": "assertToken(address)", +"07f5888b": "vote02YesCount()", +"07f5b7a2": "TokenSale(address,address,address)", +"07f64725": "gotParticipants()", +"07f79d38": "presaleOpeningTime()", +"07f7aafb": "approveContract(address)", +"07f8f100": "startSell()", +"07f90e5d": "lotteries()", +"07f95fc2": "mintParticularPart(int256,uint8[4],address)", +"07f9f7ba": "StandardBounties(address)", +"07fa40e4": "withdrawEtherTo(address)", +"07fb363a": "cap_()", +"07fb37d4": "ChangePrice()", +"07fb462c": "SCEscrow()", +"07fb7c60": "getKudosSentFromTo(address,address)", +"07fd3687": "Seller()", +"07fe178b": "HLCoin()", +"07fee2a6": "presaleStartedAt()", +"07fee501": "getNumberOfFirstBuyer()", +"07ff1413": "multiBatchSafeTransferFrom(uint256[],address[],address[])", +"07fffa9d": "privateDiscountPrice()", +"08003f78": "burnTokens()", +"0800a05f": "cryptoStorage()", +"0800b89e": "setCategoriesCreator(address)", +"0800e300": "getComment(uint256)", +"08016f6d": "firstRefundRoundRateNumerator()", +"0801baca": "talkToWorld(string)", +"08020361": "distributeFixed(uint256,address[],uint256)", +"0802350d": "testThrowExecuteSellOrderChecksAmount()", +"08029105": "InvestFund()", +"08038a29": "createCarToken(string)", +"0804d013": "ProcessedInvestment(address,uint256,uint256)", +"08051004": "AddNewPhase(uint256,uint256,uint256,uint256,uint256,uint256)", +"08054fd5": "RevokeBid()", +"080571eb": "mintAndTransfer(address,uint256)", +"0806506e": "bigId()", +"080692bd": "setEtherPriceInUSD(string)", +"08071c05": "addit(uint256,uint256)", +"08081302": "clearClaims(uint32,int256)", +"08083039": "isSponsor(uint32,uint32)", +"0808f3eb": "canBuy(address)", +"08093ff6": "post(string,address[],uint256[])", +"08098336": "balanceWinPoolToTeam()", +"080991e4": "Trustless_Transfer(uint256,address,address,uint256)", +"0809f95d": "Asset(string)", +"080a57f9": "whitelistAddr(address)", +"080b2356": "AirEX(uint256)", +"080b2a86": "getTicketsCount()", +"080b3713": "createWinner()", +"080bdfa8": "brokerVerifierContract()", +"080bfdeb": "kindCount()", +"080c8a83": "unlock(bytes,bytes,bytes32)", +"080ca381": "totalDivided()", +"080d840c": "getRandomValue(bytes32)", +"080e74f7": "lotById(bytes32)", +"080f27f3": "view_readyTime()", +"080fbebf": "setup(uint256,uint256,address)", +"080fd28a": "regulatorApprovedKycProvider()", +"0811dda0": "SolarEclipseToken()", +"0812226e": "approveOrderHash_(bytes32)", +"0812cfbf": "registerInvestorAccount(address)", +"08148f7a": "timeout(uint256)", +"0814931a": "canTake(address)", +"08151de1": "attack(uint256,uint256,bytes)", +"0815711a": "hmultiply(uint256,uint256)", +"08165230": "TarynToken()", +"08167a4e": "getJsonToValue(string,uint256,uint256)", +"08171d30": "numOfFinishedPromotions()", +"081780f4": "clearRecord(bytes32)", +"0817e5c1": "upgradeM5(address,address)", +"081812fc": "getApproved(uint256)", +"0818d1da": "VestingCreated(address,address,address,uint256,uint256,uint256)", +"08190cda": "HT()", +"08195e10": "makerFeeRateE4()", +"0819815e": "addressPositions(address,address,uint256)", +"081b8bb4": "refreshVoteForAllByIndex(uint256)", +"081bde95": "buyTrack(address,bytes32)", +"081bf263": "isOOB(uint8,uint8)", +"081ce187": "disallowAddressToSendMoney(address,address)", +"081d203e": "plantedRate()", +"081d5380": "sendFundsToManager(uint256)", +"081e1b12": "giveEther()", +"081e21b4": "allowancePaillier(address,address)", +"081e806d": "PayOut(uint256)", +"081f74c6": "ArchiveCreation()", +"081f9190": "DiscToken()", +"0820b7c9": "activePresale(uint256)", +"082104e3": "boxChoice(uint256)", +"082152b4": "toB32(uint256,bytes,bytes)", +"08216c0f": "createHumanStandardToken(uint256,string,uint8,string)", +"08218c98": "trade(address[3],uint256[4],bytes,uint256)", +"0821c87e": "sanMaxFree()", +"082346d9": "recoverAllFunds(bytes32,uint64,bytes32[],uint256[],uint256[2])", +"0823b38d": "calculateAveragePixelPrice(address[16],uint256,uint256)", +"0823d3a7": "Voted(address,bool,string)", +"082442f5": "feePayee()", +"08245f90": "testAbsMin()", +"08252f03": "CodeFundToken()", +"0827940f": "quitArbitrator()", +"0827ab43": "tokenRate10()", +"0828799b": "setTiersInfo(uint8,uint256[],uint256[],uint256[],uint8[4])", +"08290dc5": "setMaxSale(uint256)", +"082a4513": "releaseAllOnceLock()", +"082a7e60": "ODD()", +"082a8c4e": "arenaContract()", +"082b57e9": "TIER4_PRICE()", +"082b7c57": "FeesPayout(uint256)", +"082bd485": "BLAINetworkToken()", +"082c250c": "MDD()", +"082d7187": "mintFish(address[],uint32[],uint8[],uint8[],uint8[],bytes16[])", +"082d8f49": "left41(uint256)", +"082e0f6f": "makeupLegendary(uint256)", +"082e2814": "startDividendsPeriod()", +"082e6d81": "receivePriceFromOracle(uint256)", +"082f699e": "tokenReleaseAtStart()", +"082fa708": "tokensPerTrunche()", +"0830602b": "registerName(string)", +"08306af3": "PAYOUT_FRAC_BOT()", +"08314798": "setTokenSeed(uint256,string)", +"0831fb6c": "getWinnerListLength()", +"0832b925": "allowance(address,bytes32,address,address)", +"0832cf68": "FTNTCoin()", +"0832ff59": "Mentoscoin()", +"0834ab44": "cancelWagerOfCard(address)", +"0834d1e7": "getBetsSumByAgentId(uint256)", +"0834fe80": "LitecoinOne()", +"0835b8b2": "start2BonusPeriod2()", +"0835e754": "sendToRST(address)", +"08366c9d": "removeCZRLock(address,uint256)", +"0836d160": "WithdrawDividends(address,uint256)", +"08378040": "dayStartTime()", +"083903de": "setExchangeRateAgent(address)", +"0839e0fb": "migrationReceiver_setup()", +"0839f2ee": "WinbitToken(uint256,string,string)", +"083a0436": "getSentTransactionData(uint256)", +"083a3a74": "returnTokensToExchange()", +"083ab393": "bonusTokenRateLevelThree()", +"083ae00e": "postWish(bytes,bytes)", +"083ae1fe": "setPackage(string)", +"083b2732": "callback()", +"083baf15": "get_participant_arbits(address)", +"083c6323": "endBlock()", +"083cadf0": "approveInternal(address,uint256)", +"083ccc8a": "_forwardFunds(address,uint256,uint256,uint256)", +"083d13c4": "returnTokenDepositState(address[2],uint256[8],uint8,bytes32[2])", +"083d4aa5": "QoToken()", +"083d9e6d": "period4End()", +"083eb6f8": "icoSaleHardCap()", +"083ed817": "getEmployerJobsForFreelancerInvite(address,address)", +"083eea12": "Unfrozen(uint256)", +"08404ac8": "ERC20dex()", +"0840972b": "setClue(string)", +"0841abd2": "verifyNextTurn(uint256,uint256[3],uint256[3],uint8[176])", +"08421645": "changePresaleTimeRange(uint256,uint256)", +"08421e7f": "paymentsByAddress(address)", +"08434ef5": "updateRequestSeed(bytes32,bytes32)", +"08436588": "getUsersAwaitingForTokensTop150()", +"08447aef": "KudosTokenLockup(address,address)", +"08447c9f": "SilverWhitelist(address,bool)", +"0845817c": "resetCommission()", +"084592cb": "turnon()", +"0845e2d8": "SingularityTest2()", +"08464b68": "changeAREFWallet(address)", +"0846c0ee": "invalidate(string)", +"0846ca3c": "deleteAccounts(address[])", +"08474d2a": "judgeReleaseRecordExist(uint256)", +"084794f8": "_devFeesAddr()", +"0847e9fa": "numDarknodesNextEpoch()", +"084992a6": "closeChannel(address,uint8)", +"0849a197": "EventUpgradeCar(address,uint32,uint8,uint8)", +"0849cc99": "getArrayLength()", +"084a4011": "whitelistBonusSent()", +"084ab6f5": "requestLoan(address,address,uint256,uint256,uint256,bool,string)", +"084b410d": "getNormalCard(address)", +"084b8246": "getOwnedAndTotalTokens(bytes32,address)", +"084b8f8d": "set_presale_arbits_sold(uint256)", +"084bbafb": "update_entity(address,string)", +"084bdabe": "vestedBalanceOf(address,uint256)", +"084ccb41": "cBAListLength()", +"084ce708": "pay(address[],uint256[])", +"084d113b": "addMerkleTreeRoot(uint8,bytes,bytes)", +"084d72f4": "getWinningOutcome(uint256)", +"084ee60f": "convertWeiToTokens(uint256)", +"084fa898": "Raffle(uint64,uint32,uint256)", +"08508b8f": "hasBeenDeployed(address)", +"0850de0c": "_setUserInfo(address,uint256,uint256,address,address)", +"0850e4c3": "Sunny2()", +"0851762a": "transferLockedToken(address,uint256,uint256)", +"0851d08c": "setChainType(string)", +"08528190": "changeRegulator(address)", +"0852aa9d": "maafakaToken()", +"08534888": "privateSaleReleased(address)", +"0853b015": "lastBetUser()", +"0853e875": "adjustTradeRange(uint256,uint256)", +"0853ea45": "_stringToBytes32(string,string)", +"0853f7eb": "frontRunnerPeriod()", +"08540812": "removeContractFromTokenFallbackWhiteList(address,address)", +"085431f4": "getGameProprietaryData(uint256)", +"085487a5": "Shiva()", +"0854f856": "getPoolInformation(address)", +"08551a53": "seller()", +"08551d34": "haltPurchases()", +"085554a4": "DHUB()", +"08555a0a": "secondStageRaisedInWei()", +"085634ec": "changeStatus()", +"08567a87": "removePoliceNode(address)", +"08573a0b": "reservePunksForOwner(uint256)", +"08587a76": "_scheduleCall()", +"08595e5e": "puppySports()", +"0859e844": "getEthRate(uint256)", +"085a1daa": "startCollection()", +"085a3600": "_exchangeMatronSireId(uint256,uint256)", +"085a4705": "issueAsset(bytes32,uint256,string,string,uint8,bool)", +"085ba55b": "getRoundStageEndInfo(uint256)", +"085bcb34": "getSamplesForJingle(uint256)", +"085c1cee": "teamTokenBonus()", +"085ca4e3": "preIcoEndBlock()", +"085ca679": "setAirDropShadowTag(bool,uint256)", +"085ca94e": "payFiat(address,uint256,uint256)", +"085ceb30": "tokensCap()", +"085d1973": "getContributorByIndex(uint256)", +"085d4883": "provider()", +"085d9335": "participantBonus(address)", +"085dedf1": "init(uint256,uint256,address,uint256,address,uint256,uint256,uint256,address,uint256)", +"085e658c": "setSpecialWallet(address)", +"085e9579": "getCompte_35()", +"085f8ebb": "transform(uint64,uint64,uint64,uint64)", +"085fa50a": "changeMainContractInCoin(address,address)", +"085fd114": "o3Address()", +"085ff39a": "getPremiumCarsForVariant(uint256)", +"086013c0": "stackOwner(bytes32)", +"08604366": "nextPayeeIndex()", +"0860a902": "ownerBurnUnsoldTokens()", +"08612c35": "getReservedTokens(uint8)", +"08614362": "donateTokens(address)", +"086146d2": "getCurrentPeriod()", +"086282b9": "getIpfsHashToTokenId(string,string)", +"0862fdf3": "plantToken()", +"08637d20": "bountyPool()", +"08658523": "FraCoinAuct(string,uint256,uint256,address)", +"0865dadc": "setAdminContract(address,bool)", +"086610d2": "currPicHash()", +"086677de": "personalMaxcap()", +"08669aab": "withdrawInterest(uint256)", +"0866efcc": "FineArtCoin()", +"0867ecf3": "SimpleCustodian()", +"08681a74": "timeOfLastOwnerWithdrawal()", +"086914c3": "saleDateStart()", +"086949b7": "get7()", +"0869b302": "setBeneficiaryAddress(uint256,address)", +"0869db30": "emergencyWithdrawalActivated()", +"086a1b86": "walletForBounty()", +"086a9cd8": "AddMultipleItems(uint256,uint8)", +"086ac6d7": "setDeprecated(uint256)", +"086ae9e4": "getCallGasUsed(bytes32)", +"086af728": "moveUnsoldTokensToICO()", +"086b339e": "baseACL()", +"086b60dd": "contributionAmount(address)", +"086b8331": "requiredLockedForColorRegistration()", +"086ba261": "deleteIssuer(address)", +"086bdf2d": "nameArt(uint256,string)", +"086c2e09": "drawEther()", +"086c875b": "NewCloneToken(address,uint256)", +"086df89e": "withdrawPowhDivs()", +"086e4e52": "setCompte_23(string)", +"086fb1f8": "setFirstLogEntry()", +"086fd46b": "getAgreementsCount()", +"08700f0b": "MonaLease(string,uint256,uint256,address)", +"087038db": "switchLiquidity(bool)", +"0870607b": "addSubUser(address)", +"08707031": "setCryptoCupTokenContractAddress(address)", +"0870803d": "TermsOfUSe()", +"0870f1ff": "FundingProposalAdded(uint256,uint256,bool,uint256,address,uint256,uint256,uint256)", +"08714bfa": "TestContract()", +"0871968b": "isOverBalanceLimitHolder(address)", +"087205f0": "getTokenByID(uint256)", +"08722e78": "ethVerify()", +"0872c813": "closeBeta()", +"087380ca": "setSpecialAttack(uint256,uint8)", +"0874ba06": "player5Timestamp()", +"0875029e": "POXToken(address,address)", +"08752869": "buyXname(uint256,bytes32)", +"08753085": "MAT_TEAM_SUPPLY_LIMIT()", +"08761432": "onReceive(address,address,uint256,bytes)", +"08768c04": "setFundsCreditBondContract(address)", +"0876eb00": "ownerMigration(address)", +"08774410": "changeBridge(address)", +"08782469": "Akilos()", +"0878424f": "vota(bytes32,bytes32)", +"0878833d": "fourth_whitelistSupplier()", +"08789521": "revokeRole(address,string)", +"0878bc51": "getAttachesto(uint8)", +"087905c9": "getMiningEpoch()", +"08796ea0": "deployBTTSTokenContract(string,string,uint8,uint256,bool,bool)", +"087b230c": "getNextStageStartTime(int256)", +"087bb610": "USDXGE()", +"087c0055": "setIcoLockUntil(uint256)", +"087c7863": "testtop2()", +"087ca568": "setGalleryOnePrice(uint256)", +"087cbd40": "setStore(address)", +"087ccebe": "POOL_EDIT_3()", +"087ce940": "CPCEPrivateDeposit()", +"087da715": "removeStorage(string)", +"087ded64": "ChildChains()", +"087e055a": "getConfigBool(bytes)", +"087e5b5f": "ShiftContract()", +"087e926c": "setId()", +"087ee4c6": "random(uint8,uint256)", +"087f4ece": "limitTeamType()", +"087fc48b": "claimLoanToken()", +"088061bd": "momentSenderOf(uint256,uint256)", +"0880fb66": "transferOwnershipReceive()", +"0881acd3": "getWeiCollected()", +"0881fa0d": "shop()", +"08824fb7": "createCitizen(uint256,address)", +"088266b5": "isClearTime()", +"088322ef": "tradeWithHint(address,address,uint256,address,address,uint256,uint256,address,bytes)", +"0883cb04": "ERC20Batch(address,address)", +"0884e5d6": "RocketCoin()", +"08853525": "round6TokensRemaning()", +"08867fc2": "REFUND_POLL_DURATION()", +"088787a3": "getMultiLedgerValue(string,address,address)", +"0888ad41": "PFCCContribution()", +"08891c0a": "addVoter(address,address,bytes32)", +"088947a0": "universalexchangertoken()", +"088ae6e5": "releaseCreatedCount()", +"088b513e": "getAffiliateSender(bytes32)", +"088c20de": "IcxToken(uint256,address)", +"088cbf7e": "incrementRate()", +"088df612": "cancelTokenSale(uint256,bool)", +"088e3595": "GoldVein(string,string,uint256)", +"088ee7ec": "bountyTokenIssuedTotal()", +"088f11f3": "punksOfferedForSale(uint256)", +"088f5e58": "mergeCard(uint256,uint256)", +"088f87e0": "refundAlienDeposit(address)", +"088fc1a8": "movePendingToSetting(uint256)", +"08901fce": "expand(uint256[])", +"08908579": "KAL2Token()", +"0890e86e": "icoMinimumWei()", +"08910fe6": "getSpinResults(uint256,address,uint256)", +"08911cd5": "settokenDeployer(address)", +"0891f387": "getPaintedPixelsCountByAddress(address,address,uint32)", +"08927a67": "Jcoin()", +"089327de": "MyToken()", +"08933d11": "getJoinBlock(address)", +"08936ac0": "_removeContract(address,uint256)", +"08937f62": "transferChildToParent(uint256,address,uint256,address,uint256,bytes)", +"08941307": "getParametersHash(uint256[12])", +"0894183d": "priceof()", +"08946081": "setSalesFinished()", +"08949a76": "getNumberTwo()", +"0894bdf2": "setBehalfer(address)", +"0894c6c1": "queryDataInternal(address)", +"08956746": "erotixFundMultiplier()", +"08956ff8": "syncFunds()", +"089587cd": "getServer()", +"089620fc": "transferGrantJoinAddr(uint256,uint256)", +"08968426": "unfreezeDeposit(address,uint256)", +"0896937e": "MultiTransfer(address[],uint256[])", +"0897bf6f": "releasedRecordsCount()", +"089854fe": "LLG(uint256,string,string)", +"08988822": "RareAsset(bytes,uint256,bytes,bytes,address)", +"0898deeb": "op2()", +"0899146b": "lock(bytes32,address,uint256)", +"089922b5": "burnUnicorn(uint256)", +"08998acb": "contributionCapInWei()", +"08998c93": "activeBalance()", +"0899a99c": "canIssue()", +"089a15e4": "songTitle()", +"089aa819": "weiPerInitialHONG()", +"089ac36f": "distributeCards(uint256)", +"089ae962": "EOSGOLD()", +"089af913": "endNumber()", +"089b4d46": "totalCookieProduction()", +"089bb99a": "changeNameAndSymbol(string,string)", +"089bead1": "changeOuts(address,address)", +"089c22ad": "recoveryAfterPeriod()", +"089c9964": "setFriend(address)", +"089d1239": "Ssnc()", +"089d5200": "WILLTOKEN(uint256,string,uint8,string)", +"089d5c4a": "repr()", +"089dc937": "markAsReceived()", +"089e0ad0": "buildDSMap()", +"089ee2d6": "likeVoting(uint256)", +"089f7f85": "hasRisk(address,address,address,uint256,uint256)", +"089fa8b1": "trySolution(uint8[])", +"08a0f32f": "buyNow(uint256)", +"08a10ffe": "allRewPaid()", +"08a12b9a": "getBuyerFunded(address)", +"08a1360a": "publicSaleCapReached()", +"08a1b574": "getTokenProposalDetails()", +"08a2a386": "addProof(address,bytes32)", +"08a36a1c": "totalAmountWagered()", +"08a47243": "LCCToken()", +"08a47c32": "setVestingType(uint8)", +"08a4f072": "getParams(uint256)", +"08a60004": "LSDToken(uint256)", +"08a6077c": "tokenDistribution()", +"08a62d0a": "stopThrowing()", +"08a65591": "BUYGOODSWITHCRYPTODOTCOM()", +"08a6fb88": "setAdminsContract(address)", +"08a71396": "tokenRecovery(address)", +"08a80ff5": "transferAdminOwnership(address)", +"08a8ce1f": "setFactories(address[],bool)", +"08a91751": "getMyFairy()", +"08a9ba84": "setSourcePrice(address)", +"08a9dd29": "setEndEdit()", +"08a9ec7a": "startDApp(bytes32)", +"08aa3567": "BMPre_ICO()", +"08aa62c4": "industry()", +"08aa6a7e": "ContractorAdded(uint256,address,uint256)", +"08ab4097": "instruct_3()", +"08aba5aa": "setAccountBalance(uint256)", +"08abd7ff": "addArrayToWhitelist(address[])", +"08ac184b": "finishCurrentLimit()", +"08ac320e": "getAllGameAmount()", +"08ac5256": "maxValidators()", +"08ac782c": "lockTokens(uint256,uint256,bytes32)", +"08adf7b1": "transferFromMarketplace(address,address,uint256)", +"08ae8677": "pIDIndex_()", +"08aeda8b": "getEggPhaseList()", +"08af4d88": "allowAddress(address)", +"08af6ebc": "getEtherMonsterNumber()", +"08af723e": "calculateSha3(string)", +"08af84f0": "setAmountForPlayer(address,uint256)", +"08aff933": "hasConfirmed(uint256,address)", +"08b0e909": "initialExchangeRateForETH()", +"08b140dc": "Emergence()", +"08b1adf3": "RestoredInvestment(address,uint256)", +"08b27e3e": "transferAnyERC20Token(address)", +"08b309e3": "final_price()", +"08b3479c": "calcIOHash(bytes32[10])", +"08b370cf": "childExists(bytes32)", +"08b407da": "emergency(uint256,address)", +"08b40dc6": "CPGPEREGRINE()", +"08b4312b": "maximumRedeemable()", +"08b490f0": "EARLY_INVESTOR_AMOUNT()", +"08b4fa40": "GetClickPrice()", +"08b591a5": "revealOpen(uint256)", +"08b5a85a": "registerEndpoint(string)", +"08b6808c": "assignPartition(address,uint256,uint256)", +"08b6bb56": "playerTransactionList(address)", +"08b73b31": "setBurnAfterSoldAmount(uint256)", +"08b74d3c": "LogPolicyExpired(uint256)", +"08b7c13b": "getExists(bytes20)", +"08b7c837": "withdrawJackPot(address)", +"08b7fa31": "PriceFeed()", +"08b83b08": "appealOpen()", +"08b8d60f": "setAffiliateProgramAddress(address,address)", +"08ba7ee7": "setParties(address,address,address,address,address)", +"08bad193": "acceptSolution(uint256,uint256)", +"08bbd947": "globalTransferLock()", +"08bca566": "allocateTo(address,uint256)", +"08bd4d29": "ICO_CAP3()", +"08bd6e4e": "_activenessUpgrade(uint256,uint256)", +"08bddf32": "rescueAllRewards(address)", +"08bde7d4": "setMyContractt(address)", +"08be5bf3": "_doTransferFrom(address,address,uint256,bytes,bool)", +"08be8700": "increaseJackpot(uint256,uint256)", +"08bf2d0d": "getOrderBook(uint256,uint256)", +"08bfdd76": "refuseInvestment(address[])", +"08c01e5b": "Scicoins()", +"08c1090b": "getReferralAddress(bytes8)", +"08c2e0a6": "refundToBuyersIfSoftCapNotReached(uint256)", +"08c36eb0": "s30(bytes1)", +"08c372c3": "investSteps(uint256)", +"08c379a0": "Error(string)", +"08c3bf39": "upgradeCoinbase(address)", +"08c409bb": "numberOfCellsBought()", +"08c572b8": "PreIcoSupply()", +"08c5780a": "DU30()", +"08c7cf22": "Redeem(uint256,uint256,bool,address,uint256)", +"08c7e75c": "fechStageIndexByBlockNum(uint256)", +"08c87809": "maxFirstRoundTokenLimit()", +"08c8b880": "bonussale_EndDate()", +"08c8ba00": "BonusCalcPos()", +"08c977e7": "setMaxDexSize(uint256)", +"08c9ac21": "doubleBalances(address)", +"08caaa46": "UploadMusic(uint256,string,address,bool,uint256,uint256)", +"08cad05c": "bookerAddress()", +"08cb2e7e": "AJDToken()", +"08cb3b54": "GetUnpaid(uint256)", +"08cb4cb5": "releaseAmountPerDay()", +"08ce2136": "pricePreICO()", +"08ce9790": "updateOraclizeGas(uint256)", +"08d067bc": "indVestingDeposit()", +"08d0a7cf": "changeWhitelist(address)", +"08d0ca62": "TUINETWORK()", +"08d10c91": "TokenUnionToken()", +"08d233dc": "checkFunds()", +"08d299ba": "_setOutstandingPower(uint256)", +"08d317dd": "sellCrystal(uint256,uint256)", +"08d33e4c": "setAllocations(bytes32)", +"08d39380": "stageFourStart()", +"08d4073d": "startPreSale(uint256,uint256,uint256,uint256)", +"08d40e9c": "InvestorRefunded(address,uint256)", +"08d49d1f": "parseNewOrder(uint224,uint8,uint256[],uint256)", +"08d4ca92": "isImageOnSale(uint256)", +"08d4db14": "getBuyPrice(uint256)", +"08d50eb3": "_CAP()", +"08d605f2": "TrueToken()", +"08d68b97": "_getBlockCost(uint8,uint64,uint8)", +"08d6b4b9": "goldName()", +"08d7557a": "totalUsdReceived()", +"08d79718": "TilcoinStorage()", +"08d7aa9c": "houseTopUp()", +"08d7bd23": "toToken(uint256,uint256,uint256)", +"08d84b82": "ReleasedChanged(bool,bool)", +"08d90dc1": "BAHACAN(uint256,string,string)", +"08d9a77b": "addSaleWallet(address)", +"08daaf4a": "_premine()", +"08dbb18e": "getQuorumState(uint256)", +"08dc615c": "getWarrantyByIndex(uint256)", +"08dcf4f1": "setRollAddress(address)", +"08dd14fc": "defaultIcoStart()", +"08de68cc": "FootballerAccessControl()", +"08de795d": "testGetReceiptDetails(bytes)", +"08debacb": "ensureLoanBalance(uint256)", +"08def058": "mintme()", +"08df8602": "Futarchy()", +"08dfef4c": "upsertAll(address[],uint256,bool,bool,uint256)", +"08e05b85": "instantTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address)", +"08e12ad3": "addressOfERC20OldToken()", +"08e130c9": "setStables(address)", +"08e1438c": "everToken()", +"08e150db": "LogInvest(address,uint256)", +"08e2287c": "getPlayerVaultsHelper(uint256)", +"08e2cd00": "testFailTransferBeforeFinalize()", +"08e3399f": "hashes(address)", +"08e34e7f": "endBounty()", +"08e46cea": "processAndCheckParam(address,string,uint8[],bytes32[],bytes32[])", +"08e484a8": "doEscape(uint32,int256)", +"08e496ea": "vaultPercentOfTotal()", +"08e6b41c": "claimLegacy()", +"08e8000c": "transferSecurityDeposit(address,address)", +"08e88aa1": "newPackage(address,uint256[])", +"08e88ab9": "giveMultipleItems(address,uint256[])", +"08e8ac38": "hexStrToBytes(string)", +"08e929b1": "YunJiaMiToken()", +"08e93d0a": "getAllAccounts()", +"08e9988b": "airDropAmount()", +"08e9daa5": "countries(uint256)", +"08e9f758": "GenericCrowdsale(address,address,address)", +"08eb4e98": "cancel(address[5],uint256[6],uint256)", +"08ebbfc4": "AdminAccessTransferred(address,address)", +"08ebd3d3": "KBKToken()", +"08ec17a2": "testDeductCoin()", +"08ec6164": "colonyMultiSig()", +"08ec651f": "createDeklaBidAuction(uint256,uint256,uint16)", +"08ed0236": "setAirdropStatus(bool)", +"08ed8d16": "setTesting(bool)", +"08ed8e0c": "minimumBidAllowed()", +"08edf505": "claimH1()", +"08ee33af": "getRdFee()", +"08ee7325": "tokensPerCentsWeekOne()", +"08ee76a7": "dickbutt()", +"08ef59ff": "setBonusSystem(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"08efde8b": "DXYToken()", +"08f0b1b0": "PRE_WIN_MULTIPLE_PER()", +"08f10999": "beatGame()", +"08f12470": "getLockById(uint256)", +"08f14dd8": "ComputeMyDivs()", +"08f20630": "getWalletAddress(string)", +"08f235ec": "getDefaultPayment()", +"08f2e24c": "setFreelancerJobIndex(address,uint256,address,uint256)", +"08f2e704": "MBCash()", +"08f46b0a": "LeapCoin()", +"08f48256": "StorageEnabled(address)", +"08f53f44": "setAllowanceAddress(address)", +"08f68b90": "SetsecondTTax(uint256)", +"08f6e3b4": "BOUNTY_EXCHANGE_RATE()", +"08f7349a": "_addDistribution(uint256)", +"08f75d17": "move_reveal(bytes32,uint8)", +"08f7d570": "incrementalInverse(uint256,uint256,uint256,uint256)", +"08f9732b": "ForwarderTarget()", +"08f978c6": "migrationInfo()", +"08fa0e92": "canTrade(address[3],uint256[4],bytes)", +"08fa3b51": "approveCorrespondent(uint256)", +"08fae7db": "ICO_PHASE1_BONUS_PERCENTAGE()", +"08fb8a88": "changeServer(address)", +"08fc299b": "presaleMaxSupply()", +"08fc9ec8": "chunk6IsAdded()", +"08fcec89": "setNoteReportingGasPrice(bool)", +"08fd866c": "deleteAllCoverImages()", +"08fe23ca": "sq(uint256)", +"08ff597a": "tier_cap_3()", +"08ffce24": "predecessorAddress()", +"090015d8": "CONFIG_MAX_VALUE()", +"09004eb1": "getCard(uint8)", +"09007804": "getEOSKeyFor(address,address)", +"0900f010": "upgrade(address)", +"09010e53": "changeTransfer(bool)", +"09019ca0": "enter(bytes32,bytes8,uint32)", +"0901a3f1": "currentAllocations(uint256)", +"0902b25d": "maxEther()", +"0902c6d7": "testToUint(bytes)", +"0902f1ac": "getReserves()", +"0902f72f": "addOrder(bytes32)", +"090399fd": "announceWinner(address,uint256)", +"0904603e": "FTFNExchangeToken()", +"0904cb57": "gameStarted(uint256)", +"0905aa5c": "withdrawnTokens()", +"0905f560": "emergencyMode()", +"090637a1": "GetPart(bytes,uint256)", +"0908178f": "NoFeePonzi()", +"09081c51": "TCEToken()", +"0909338a": "emitHeartBeat(bytes32,int256,int256)", +"09094f7a": "ethWallet()", +"0909981a": "Created(address,address,bytes)", +"0909e8f7": "SafeModeActivated(address)", +"090a1f92": "RapidChain()", +"090b78e9": "setTrustedTokenHandler(address)", +"090b8d18": "SPIDER_BASE_REQ()", +"090bb93f": "mtcRate()", +"090bf3b7": "left29(uint256)", +"090c01d0": "editLimits(uint256,uint256)", +"090cebff": "unDelegate(uint8,bytes32,bytes32)", +"090cfb04": "DiamondscoinToken()", +"090d23b9": "setBank(address)", +"090d5386": "GDOAdv(uint256,string,string)", +"090d94cc": "WithdrawalsOpen(address)", +"090d993a": "updateParticipantCapTier1(uint256)", +"090e5465": "trainFee()", +"090e871f": "createNewSubtoken(uint256,address,uint256)", +"090ea6f3": "setProxyManagementAddress(address)", +"090f4465": "payoutDate()", +"090f92f7": "kittensRemainingForSale()", +"0910c715": "bringKydyHome(uint256)", +"091157cb": "getSerializedEmployee(address)", +"0911bdf7": "cancelTokenTransaction(address)", +"0911def1": "QoppaCoin()", +"0912d306": "TokensReceived(uint256,address,uint256)", +"0912fabd": "canWrite(address,bytes32)", +"09130ba1": "getEtherToBuy(uint256,uint256,bool)", +"09130f5d": "getAllMyTokensForAllEtherOnContract()", +"091356c5": "hasPrestige(address)", +"0913fc3a": "leekStealPot_()", +"09146664": "_burn(string,address)", +"0914a363": "cofoundersSupply()", +"09151f2d": "checkTotalPrizesWaiting()", +"09153f57": "unsoldVestingAddress()", +"0915db6d": "End9()", +"091621bd": "getHeadWalletList()", +"091691c5": "AgriChainNextData()", +"0916a263": "showLockTimes(address,address)", +"091734e0": "ROBEthExchangeRate()", +"0917f827": "JoannaToken()", +"09194fe8": "hasSponsor(uint32,int256)", +"091a79b2": "getVoteAndTime(uint256,uint256)", +"091a7a4b": "OperatorAdded(address,bool)", +"091ac806": "getGuestNotesInfo(bytes32)", +"091b3e6d": "transferMilestone()", +"091ba3da": "storeDataAndValue(bytes)", +"091cde0b": "DisbursementHandler(address)", +"091d2788": "GAS_LIMIT()", +"091d709b": "createVisa(address,uint256,bytes32,uint256)", +"091dbbd7": "currentEventId()", +"091dbc20": "ContractUpdate(address,address,uint256,uint256,uint256)", +"091dbfd2": "enterBidForPunk(uint256)", +"091dffca": "withdrawFromVault()", +"091e3f60": "getSponsorshipsAmounts(address,uint256[])", +"091e97f9": "sellnode(uint256)", +"091e9a60": "buyCoin()", +"091eea8f": "withdrawChildDao()", +"091f2f11": "getChildren(bytes32,bytes32)", +"0920829b": "adminGetPastShopFund()", +"0920d32c": "CardsRaffle()", +"0920d9a0": "getNumTokensForContributorInternal(uint256,uint256,uint8)", +"09214a07": "switchStage()", +"09218e91": "position()", +"0922e596": "paymentController(address,uint256)", +"09231602": "setGasPriceLimit(uint256)", +"09236161": "Craftmelon()", +"09241200": "wasSuccessful()", +"0924da5c": "resetHealthAndManaTimestamp(uint256)", +"0924fbba": "Imdex()", +"092501a0": "setCommission(uint32)", +"092518a7": "SecurityDeposit(address,address,uint256)", +"09260db7": "cut(uint256)", +"092626a7": "Bitcoin_address()", +"09262f71": "is_signed(address,address,bytes32)", +"09265805": "freeGiveProduce(uint256,string)", +"09267785": "notarizeTwo(bytes,bytes)", +"0926b32a": "getTokenSizes(uint256)", +"0926e6a2": "joinTeam(uint256)", +"09270ef4": "set_address(address)", +"09276ea4": "notifier()", +"092854e5": "cry()", +"092a2e37": "multiAccessAddOwnerD(address,address)", +"092a5cce": "destroyContract()", +"092a5fcd": "Devolver_Tickets(uint256)", +"092ac9e5": "approveByB(uint256,string)", +"092b25e9": "setOwner(string,address)", +"092c506e": "maxSGTSupply()", +"092d3de4": "closeAnyGame(uint256)", +"092dde45": "BteCoinToken()", +"092ecf1c": "raffleRewardAmount()", +"092f3623": "setBlockDotBlockHash(uint256,bytes32)", +"092f9d79": "DONATION_WALLET()", +"092fe5c5": "sendFirst(address,uint256)", +"093077ee": "calcRewardPool(uint256,uint256)", +"0930907b": "zeroAddress()", +"0930f27b": "QVT(address)", +"0930f6db": "getFunderContribution(address)", +"09310c61": "MinutemanToken()", +"0931ce67": "getAnimalsCount()", +"09320100": "addAllCandidates()", +"0932c3c6": "setPriceLocked(bool)", +"093376fe": "getOrders(address)", +"09339f2e": "lastSignedTimestamp()", +"0933a670": "offerOff(uint256)", +"0933b939": "renewMembership()", +"0933e3a7": "setRandomContract(address)", +"09357344": "setBuyExchangeRate(uint256)", +"09358584": "stageSupply()", +"0935fced": "Bhinneka(address)", +"09362a6a": "changeOwnerTwo(address)", +"09366ed2": "downdoot(uint256)", +"0937be1a": "createFixedPeriodVpfFactory(string,bytes32,uint256,int256[],uint256,uint256,uint256)", +"0937e68a": "paymentCount()", +"0937fb36": "getEventOutcome(uint256,uint256)", +"09386cc6": "leggiMsg(uint256)", +"0938be6e": "RockScissorPaper(address)", +"09390af1": "getPercentageAmount(uint256,uint256)", +"0939e863": "shareholder()", +"0939f6f4": "ContractFunded(address,uint256)", +"093a86d3": "gateways()", +"093ac512": "MINCAP_TOKENS_ICO()", +"093ae918": "ETH_EURCENT()", +"093c16db": "getActualTierIndex()", +"093c4ee6": "getChannelBalance(bytes32)", +"093c5284": "migrateFrom()", +"093d11a1": "getLocksAmount(address,uint256)", +"093d5fd4": "getOperationsLength()", +"093db6ff": "fetchOrderByIdWithWithPayer(string)", +"093e9633": "getNewDefaultPrice(address)", +"093f5198": "make(address,address,uint128,uint128)", +"09405164": "getOpenCandidates()", +"094111be": "FCMCOIN(uint256,string,string)", +"09412b53": "delBot(address,address)", +"09417110": "signatureBurnStatus(bytes32)", +"0942adbd": "getPetCardSeries(uint64)", +"09442d66": "getCurrentInvestments()", +"094455c4": "addProduct(string,uint256,uint256,uint256)", +"094493b9": "getAPAddresses()", +"0944e35d": "TimedCrowdsale(uint256,uint256)", +"09453628": "TokenERC20(uint256,uint8,string,string)", +"0945f04f": "completeWhiteList(address[])", +"09478fb7": "_totalEtherDonated()", +"09491490": "smsVerifiedBonusBps()", +"0949fcfe": "setInviteCollateralizer(address)", +"094b94c7": "BROKER_RESERVE_SUPPLY()", +"094c2919": "performWrite2()", +"094c491b": "rewardFiboken()", +"094c6f98": "TokenSaleFail()", +"094c8bee": "unlockSales()", +"094ca5f2": "RemoveAuthority(address)", +"094cd5ee": "deletePost(uint256)", +"094d583b": "_newGame(string,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"094db54b": "private_setMaxMultiRolls(uint256)", +"094fb864": "getCampaignBudgetById(bytes32)", +"09508ce4": "getReportedMatches()", +"0950e4ad": "_getNextPrice(uint256)", +"0950fe78": "setSoftCapCHF(uint256)", +"09518753": "calculateTokenBuyPrice(uint256)", +"0951b3ac": "receivedDividends()", +"095228b5": "unfrozenType(string)", +"09522d7f": "reservedAllocation()", +"0952c504": "requestOwnershipTransfer(address)", +"09533303": "setWhitelistedUser(address)", +"095408a7": "addCustomSecurityToken(string,string,address,address,string,bytes32)", +"09541d48": "disqualifyBid(address)", +"0954896e": "MultivestUnset(address)", +"09553b28": "addressDev()", +"0955ae99": "getAds()", +"09574810": "getOperationsNumber()", +"0957c807": "setToForking()", +"0957de9a": "unsoldTokensWallet()", +"0958ab50": "isInvestAllowed()", +"0958f83d": "registerName(bytes32,address,uint16)", +"09598dfd": "finalizeBet(uint8)", +"0959bd1a": "redeem(uint256,address[])", +"095a9983": "ETUex()", +"095b697b": "setClearingPriceCode(bytes)", +"095bbe59": "findContractByModText(string)", +"095bcdb6": "transfer(address,uint256,uint256)", +"095c075e": "guessAnswer(uint256)", +"095cf5c6": "setTeam(address)", +"095d5a70": "approveRound(address)", +"095daeb1": "getVoterProposal(address,uint256)", +"095dc5cf": "removeVIP(address)", +"095e360e": "getMiningWarRound()", +"095e596f": "AccountVoid(address)", +"095e89ac": "setTranslatorRate(uint256)", +"095ea7b3": "approve(address,uint256)", +"095f2f16": "tech()", +"0960002f": "registerAff()", +"09603109": "Vote_Customly(address)", +"09607679": "changeTest(uint256)", +"0960db7c": "finalizeExit(bytes32)", +"096191dd": "executeBeneficiary(uint256)", +"0962f869": "_getList()", +"0963415c": "getSPBalance(address)", +"09639373": "createZombie(string,uint256)", +"0963b12d": "tokenChanged(address,uint256)", +"0963d4b7": "mintMonster(uint32,address,string)", +"096437bc": "TokenTes()", +"09648181": "refundDeadlineTime()", +"09648a9d": "getState(bytes32)", +"0965b0b7": "fechAllForCandidateByStage(uint256)", +"0965be64": "managerETHbonus()", +"0965bf7d": "processProposals()", +"0965c4b2": "collectedNDAO()", +"0965f6ac": "superPrivilegeCost()", +"0965fd36": "LaxmiCoin(uint256,string,uint8,string)", +"09660513": "getGameById(uint256)", +"09663cef": "getTotalPetCardSeries()", +"09671f79": "tokensCount(uint256)", +"0967417b": "getExpectedRate(uint256)", +"0967cff0": "setCrowdsaleStartTime(uint256)", +"096835e3": "NewOraclizeQuery(string)", +"09688000": "makePurchaseForClient(address,address,uint32)", +"0968f264": "withdraw(bytes)", +"096908f9": "_adeptToken()", +"09696f1a": "tokenHardCapReached()", +"09699581": "setPI_edit_13(string)", +"0969a71f": "POCG()", +"096a113d": "getCipher(uint256,address)", +"096a3778": "placeBet(bool)", +"096a8ab7": "setTransactionFee(uint256)", +"096aadce": "ownershipTransferCounter()", +"096ac348": "guagua()", +"096b4039": "bitlumensDelivered()", +"096c0c27": "amountOfLovers()", +"096c45b1": "setGasUsed(uint256)", +"096c9d6f": "getStartHourglass(bytes32)", +"096cf33f": "onlyDeves()", +"096d740b": "stopWork()", +"096e27d9": "isBeneficiary(address,address)", +"096e47ca": "SetConfirmRound(address,uint8,bool)", +"096f4090": "minecoin()", +"096f4a49": "CrowdSaleFinished(address,string)", +"097284b2": "maxSupply_()", +"09738d25": "preSaleHardCap()", +"09745c5b": "ShariqCoin()", +"0974f94c": "initialize(address,address,address,address,address,address,address,uint256,uint256,uint256)", +"0975c338": "DKK_Omnidollar()", +"097694e1": "getFileByIndex(uint256)", +"0976e9a7": "catchMonster(uint256,uint32,string)", +"09772f8f": "getMembersCount()", +"097788d7": "ADPOWER()", +"09779838": "changeKeeper(address)", +"09787a2c": "newComment(uint256,string)", +"09798e2f": "currentpreicobonus()", +"09799c01": "stopDate()", +"09799ead": "recoveryToString(uint256)", +"0979f7f2": "wagerCardForAmount(address,uint256)", +"097b36dd": "createUser(bytes32,string)", +"097b4eea": "addToReferrals(address,address)", +"097b557f": "cancelAuction(uint64)", +"097b94d1": "mediaTokensInitialSupply(address)", +"097bcf7b": "getEtherOrdersLength()", +"097c3ead": "AddGift(string,uint256,uint32[],uint256[])", +"097cf31c": "MengToken()", +"097d44a8": "setNFTAddress(address,uint256)", +"097d5155": "holdTime()", +"097d8376": "request(address,bytes,bytes)", +"097dced0": "updateLawyer(uint256,address)", +"097dfa2f": "placePurchaseOrder(bytes32)", +"097e8fad": "getTheInvestor()", +"097f1192": "Miners()", +"0980150f": "payInternal(address,address,uint256,address)", +"09801707": "DOWN_winRate()", +"09821095": "setDailyVolumeCap(uint256)", +"09824a80": "registerToken(address)", +"09828a47": "promoPause()", +"098300bb": "goldDecimals()", +"09838bd9": "maxTokensRaised()", +"0984f0c1": "sendMessage(bytes,bytes,bytes,bytes)", +"09850495": "minusFreezeEndTime(uint256,uint256)", +"09857955": "recordRoundProfit(uint256,uint256)", +"09861b81": "flooredSub(uint256,uint256)", +"0986e647": "getLength(uint256)", +"09879962": "namehash(string)", +"09886649": "transfer(address,string)", +"0988ca8c": "checkRole(address,string)", +"09894422": "TokensIssuedOwner(address,uint256,bool)", +"098956a8": "getOldRecordInHistoryRecord(uint256)", +"098a7259": "addAfterValidId(address,uint32,uint128,uint128,uint32)", +"098a7321": "firstDueDate()", +"098ab6a1": "snapshotCount()", +"098ae858": "ReverseConfirmed(string,address)", +"098b939a": "isEnoughConfirmed(bytes,uint256)", +"098bf5de": "requestTransferOfETH(address,uint256)", +"098c83fe": "notContractPred(address,address[],uint256)", +"098dbf5c": "executeTransfer(address,uint256,address)", +"098deeb5": "startScoring()", +"098e349a": "currentRoundParameters()", +"098e652b": "batchCreateAsset(uint8[],uint256[],uint256[],uint256[],address[])", +"098e8fc4": "setOffer(address,uint256,uint256)", +"098eb040": "contributeFiat(address,uint256)", +"098ed807": "productAccountsLength()", +"098f076e": "isRejected(uint256)", +"098fb45c": "setFeeDistributionsAndStatusThresholds()", +"098fc010": "LylToken(uint256,string,string)", +"098fe7da": "MYSLF()", +"099015d9": "totalBurnedOfType(uint256)", +"09904c00": "depositWallet()", +"09905bdb": "priceForVerificationInWei()", +"0991bb09": "makeSperm(address)", +"0991f5a6": "closingTimeForCloning()", +"099224e9": "TrexToken()", +"09929628": "Contractbalance()", +"0992e4c3": "contributorMaxCap(address,uint256)", +"09931e00": "QWoodDAOToken(uint256,uint256,uint256)", +"09936cd6": "FLescoin(address,address)", +"0993e87f": "setSellingPrice(uint256)", +"0994257a": "BitcoinSamaritanSupply()", +"0994a0a0": "DSTokenTest()", +"09957e69": "newSale(bytes,uint256,uint256)", +"099583de": "PRESALE_TOKEN_IN_WEI()", +"09959439": "check_rhash(bytes32,bytes32)", +"09959a95": "JCWCToken(uint256,string,string)", +"0995efb5": "isChainCode(uint32)", +"0996a625": "MSPPlaceholderMock(address,address,address,address)", +"0996b4cc": "BitChordCrowdsale(address)", +"0996e0e5": "periodITO_mainCapInWei()", +"09987f3c": "checkAllRewPaid()", +"09989c8b": "getCfiEstimation(address)", +"09990611": "weiPerBtc()", +"09999404": "subLoan(address,uint256)", +"099a019d": "getBid()", +"099a5ab8": "lastBlock_v2Hash_uint256()", +"099ae6bc": "flowerAuction()", +"099aea0a": "isWorking()", +"099b9531": "contractownsthismanyP3D()", +"099ba954": "eSwitchToken()", +"099c00b9": "GWCoin_v3(address,address)", +"099c4c7e": "setCaps(address[],uint256[])", +"099c7ab2": "freePeriodEndTime()", +"099dccc8": "getTeamMemberAddres()", +"099dde07": "maxTarget()", +"099e0a26": "listPairs()", +"099e4133": "backend()", +"099f40a9": "throwsWhenFinalizingNotEndedSale()", +"09a00fb1": "IcoToken()", +"09a02562": "getCensored(address,uint256)", +"09a0307d": "tipLockCheck(bytes32)", +"09a0cfe4": "changeChampsName(uint256,string,address)", +"09a14f2e": "linkSelf()", +"09a2b4ad": "asmSymbol(address)", +"09a38873": "purchaseTokens(uint256,address,uint256)", +"09a38f26": "feed100AndPay(uint256)", +"09a39777": "projectWorkStarted()", +"09a399a7": "personAdd(string,int256,int256,string)", +"09a3beef": "setTokenURI(string,uint256)", +"09a44334": "changeElection(uint256,uint256,uint256)", +"09a547bd": "approveAndCall(address,uint256,bytes,string)", +"09a555c0": "setIcoStart(uint256,uint256)", +"09a55b65": "votePreProposal(uint256)", +"09a69f57": "getRewardAmount()", +"09a71a00": "addTask(bytes,uint256,uint256,address,uint256,uint256,uint256)", +"09a71ffb": "feesProfitDeposit()", +"09a7dbb4": "CollectReturns()", +"09a7dd17": "PRE_ICO_SINCE()", +"09a8d3f5": "oneEth()", +"09a94a3d": "_initiateClaim(string,bytes32)", +"09a97b6f": "_getCategoryIdx(uint256)", +"09aa3dcf": "maxTokenPurchase()", +"09aa69c2": "cancelFlight()", +"09aa7b67": "_mint(address)", +"09ab5008": "ISeeVoiceToken()", +"09ab8a03": "privateEndTime()", +"09ab8bba": "delegateAllowance(address,address)", +"09aba9ab": "ETHWalletCreated(address)", +"09ac3b00": "remainderWallet()", +"09ad1c47": "getUserPayoutBalance(address)", +"09ad8eef": "TBSTK1()", +"09ad8f7e": "getNumChildOperation(bytes32,uint8)", +"09ad9dd3": "BASE_PRICE_IN_WEI()", +"09ae2943": "stage_3_TokensSold()", +"09ae9452": "PreICOProxyBuyer(address,uint256,uint256,uint256,uint256)", +"09aea85f": "getMaxTradeAmount()", +"09af014f": "refillBalance()", +"09af4b1e": "IoexCoin()", +"09af8ffe": "guessAnswer(bytes32)", +"09b0245f": "Long()", +"09b0ce3c": "DCVToken()", +"09b13db0": "fundraisingReservation()", +"09b17085": "___proxyOwner()", +"09b22a4d": "allowAirdrop()", +"09b230cd": "getPriceSpeedTokenBlock()", +"09b258f7": "exchangeRateIco()", +"09b2996a": "originalRate()", +"09b30ed5": "afterExecute(address)", +"09b481b0": "LIABILITIES()", +"09b565f3": "updateTicketSum(address,uint256)", +"09b5e4ad": "ProxyBuy(bytes32,address,uint256)", +"09b637bc": "_founder()", +"09b70ad0": "sellGenes(uint256,uint256)", +"09b7c704": "addIdArrayItem(address,uint256,string,string,address)", +"09b86f84": "getPonziFriend(address)", +"09b8e3cc": "ValidateExec(string)", +"09b8f77a": "proposedRecoveryKey()", +"09ba4a4a": "registerEmail(string)", +"09bb03b4": "isChemistry()", +"09bb317d": "FredToken()", +"09bb7162": "createGateway()", +"09bb9267": "getDev()", +"09bb9b04": "isEtherSpaceBattle()", +"09bc1812": "setVerificationPeriod(uint256)", +"09bc4096": "developersTokensPercent()", +"09bc4933": "freezeof(address)", +"09bc90a4": "PerlToken()", +"09bd1d41": "testF1(uint256)", +"09bd3894": "SendTokens(address,uint256)", +"09bd5a60": "hash()", +"09bd98a4": "getNumAds()", +"09beb01b": "feed50(uint256)", +"09bf284c": "unanchor()", +"09bf6e42": "futureSaleVault()", +"09c0f771": "getScoringMask(bytes8)", +"09c110a1": "gzeFromEth(uint256,uint256)", +"09c12ccb": "getNextPaymentDate()", +"09c1a4b9": "totalIssuanceData()", +"09c25e6c": "FinishedExporting()", +"09c2b7f8": "MINCONTRIBUTION()", +"09c38bc8": "isAuctionManager()", +"09c4a273": "isVetted(address)", +"09c4bb2b": "releaseTime(uint256)", +"09c4f8be": "GetContractStateTerminatedOK()", +"09c51b4e": "assertSaneHTLC(uint256,int256)", +"09c5eabe": "execute(bytes)", +"09c5eb76": "getBalanceOfLogicContract()", +"09c62a1b": "ONECToken()", +"09c62c5c": "vanbexTeamAddress()", +"09c71690": "tokenFallbackBuyer(address,uint256,address)", +"09c72b26": "bonusInPhase6()", +"09c76571": "operationAt(uint256)", +"09c8d173": "claim(bytes32,uint8,bytes32,bytes32)", +"09c922e6": "setOracleGasLimit(uint256)", +"09c95e10": "isPlayer(address)", +"09c975df": "getCallContractAddress(bytes32)", +"09c99d10": "_stalemateTransfer()", +"09ca4b76": "getCurrentPriceAuction(uint32)", +"09ca60c1": "createLambo(uint256,address,uint64)", +"09cb22d5": "betFeePerMil()", +"09cc4f95": "increaseTS(uint256)", +"09cc5551": "topUp(string)", +"09ce4a91": "RLCPerSATOSHI()", +"09ceb7be": "icoAmountBonus2()", +"09cf0329": "StarterKit(address,address,address,address,address)", +"09cf8766": "grantPrivatePurchaserToken()", +"09d02b74": "getRamdomness()", +"09d03d90": "FounderUnlock(address,uint256)", +"09d0b12e": "ViewMyTokens(address)", +"09d0bb66": "NeodiumNetwork()", +"09d11c1d": "ZhangToken()", +"09d2100d": "ADEToken(uint256,uint256)", +"09d256fe": "getPresaleRate()", +"09d2d0b9": "setServiceAccount(address,bool)", +"09d31d8d": "addPerson(bytes32,address)", +"09d33f1d": "addRequest(address,uint256)", +"09d37704": "pushIssuer(address)", +"09d3cbda": "setUpdateDelay(uint256)", +"09d451ab": "calculateEthersAmount(uint256)", +"09d45f1d": "_deleteString(bytes32)", +"09d46057": "IcoStageStarted(uint256)", +"09d54b21": "checkAddressTransfer(address,uint256,address)", +"09d60069": "trade(int256,int256)", +"09d60db1": "claimedTokensWallet()", +"09d64774": "DevForceOpen()", +"09d6796f": "our_transferFrom(address,address,uint256)", +"09d6b0a3": "transfer(address,uint256[],uint256[])", +"09d6d33a": "NewCup(address,bytes32)", +"09d74cc5": "createJockey(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"09d77ad3": "Next(bool)", +"09d78e32": "ETCLocking(address,address)", +"09d78fba": "assertEq4(bytes4,bytes4)", +"09d7ab7a": "convertGene(uint8[7])", +"09d7e9ca": "decodedAsset()", +"09d84fc4": "bindingSmartIdentity(bytes32)", +"09d87ab5": "isAddressAuthorized(address,address)", +"09d89784": "TradeNetCoin()", +"09d8da2e": "isLock()", +"09d929d6": "releaseLockFounders1()", +"09d9f95e": "WinnerTakesAll()", +"09da52a2": "greet(address,string)", +"09da56c1": "getBoardBalance(uint256)", +"09db5d29": "notUsedToken()", +"09dba083": "GC()", +"09dc66af": "GT(uint256,string,string)", +"09dd0e81": "getBlockchainHead()", +"09dd1761": "attachPreOrder(address)", +"09dd7b3e": "paySize()", +"09ddc583": "getPropertyData(uint16)", +"09de4148": "getWinPercent()", +"09de92d0": "RENEE()", +"09df06b7": "TIE()", +"09df3248": "publicGetParticipants(uint256)", +"09df5060": "logoutUser(address)", +"09dfdc71": "currentPyramidBalanceApproximately()", +"09dfe330": "_checkItemId(uint256)", +"09e0a77c": "totalIco()", +"09e0a9eb": "batchBid(uint256[])", +"09e1a1f7": "PresalePurchase(address,address,uint256)", +"09e1c751": "CDPer()", +"09e24516": "ZepCloud()", +"09e25141": "bidInAuction()", +"09e2f193": "addVerificatorAddress(address)", +"09e419d1": "withdrawLongTermFoundationBudget()", +"09e587a5": "homicide()", +"09e6a0ed": "EASTADScredits()", +"09e76161": "getVideoGameDetails(uint256)", +"09e785e1": "payoutInterval()", +"09e7d837": "reachGoal()", +"09e7ec7a": "getInt256Max()", +"09e8046a": "fullfillAdvisors()", +"09e91cfb": "tokenUnits()", +"09e979e6": "getSquarePriceAuction()", +"09e9976d": "MetadataUpdated(address,uint256,string)", +"09e9c325": "createBooking(uint128,uint128,uint32,uint32,uint256,address)", +"09e9d7e2": "removeCandidate(uint256)", +"09e9e85b": "readAllUsers()", +"09ea63e3": "recoverPreSigned(bytes,bytes4,address,uint256,bytes,uint256,uint256)", +"09ebcd64": "getLockedUserInfo(address,address)", +"09ec6b6b": "supplyInterestRate()", +"09ec6cc7": "cancelTrade(uint256)", +"09ece618": "initiatable(bytes32)", +"09ecf413": "updateFoundAddress(address)", +"09ed1782": "withdrawCredits(uint256)", +"09ed4607": "clone()", +"09ed5022": "checkFileNamespace(string,bytes32)", +"09ed5673": "getScouponTransferCost()", +"09edf3ca": "x_Header()", +"09ee3e2a": "Global_Currency_Reserve()", +"09ee75a2": "documentIt(uint128,uint64,bytes32[],string,string,string)", +"09eecdd7": "isValidBet(uint8,uint256,uint256)", +"09eef43e": "hasVoted(address)", +"09ef7085": "is_name_used(bytes32)", +"09efcb8d": "fiatDeposits()", +"09f03da2": "getCurrentTimeRate()", +"09f0fe0d": "lamdenTau()", +"09f14a20": "addBuyerSig(string,string)", +"09f14e7e": "ownerSetExchangeRateInWei(uint256)", +"09f28927": "Crowdsale(address,address,address,address,uint256,uint256,uint256)", +"09f29d1b": "retrieveTokens(uint256)", +"09f2b6a9": "TokenBCC(uint256,string,string)", +"09f30eac": "unitTestSetRewardLevels()", +"09f32957": "lastCreditorPayedOut()", +"09f3ad26": "calcBonus(uint256)", +"09f41822": "batchVoteByIndex(uint256,address[],uint256[])", +"09f4614d": "product1()", +"09f4fc61": "addReferral(address,uint256)", +"09f580b0": "Bolivar()", +"09f5ca99": "GLBToken()", +"09f64d2e": "isIcoPaused()", +"09f68e96": "setPrivateSale(address)", +"09f6c607": "currentEthBlock()", +"09f70d2e": "getRequestHash(bytes,address[],uint256)", +"09f767e0": "deathFactor_iv()", +"09f80dd9": "feerate()", +"09f8477a": "getRandom(uint128,uint256)", +"09f8cc58": "upgradeAgentLocked()", +"09f90127": "fallback(address,bytes)", +"09f92a6a": "wordSize(string)", +"09f9630f": "BETHToken(address)", +"09f9b3c5": "getGrantBalance()", +"09fa6f96": "wpTokensBaskets()", +"09fa90b3": "globalLocked()", +"09fb1668": "changeMaxBetCoinDice(uint256)", +"09fba360": "alreadyHarvestedTokens()", +"09fbb22c": "decreaseGlobalInterestAmount(uint256)", +"09fc1ae0": "getCallTable(uint256)", +"09fc3c53": "burnWarrior(uint256)", +"09fc7046": "bytesToBytes2(bytes)", +"09fc8f6d": "isTokenUpgraded(bytes32)", +"09fc93c1": "getBalanceOfWei(address)", +"09fca951": "accumulated_from()", +"09fcda87": "PayPerView()", +"09fd018e": "setClaimer(uint256,address,uint256)", +"09fd8212": "isInWhitelist(address)", +"09fe5fbd": "CoinPaws()", +"09fe89c8": "privateBuyer()", +"09ff453a": "PFS()", +"09ff4b75": "Redenom()", +"09fffec0": "transferToAdmin(uint256)", +"0a0078bc": "unSet(address,address)", +"0a00840c": "challenge_period()", +"0a0092bf": "LakersvsRockets()", +"0a00ee41": "INNOToken()", +"0a0155e5": "passed(uint256)", +"0a01ad4d": "processWinner()", +"0a01ae41": "Supernova()", +"0a01bc2f": "WhitelistAddressisListed(address)", +"0a02037b": "girlOps()", +"0a0209d0": "soldTokensOnPreIco()", +"0a027825": "currentUnit()", +"0a0279f8": "determineDiscountTranche()", +"0a0313a9": "iterateValid(uint256)", +"0a0352d5": "_getOwnerNFTCount(address)", +"0a04dde8": "ThanosXToken(uint256,string,uint8,string)", +"0a0513da": "IEOEnded()", +"0a06f35e": "setBonusesForAmounts(uint128[],uint32[])", +"0a075a32": "spawnNewZeroCard()", +"0a07eadd": "systemWalletsMint(uint256)", +"0a07f3d8": "contains(uint8,uint8)", +"0a084473": "tokenPerEth()", +"0a08de75": "isContruibuteOpen()", +"0a0900a1": "buyXname(bytes32,uint256,bytes32)", +"0a09284a": "endsAt()", +"0a09815c": "presaleTokens()", +"0a0a2876": "killVesting()", +"0a0a876f": "stopSetPrice()", +"0a0b3139": "testFailOnFailedTransfer()", +"0a0c5e0d": "addSignature(string,string)", +"0a0c75aa": "setEmployeeSalary(uint256,uint256)", +"0a0cd8c8": "setupDone()", +"0a0d5509": "computeTimeBonus(uint256)", +"0a0e3c76": "nextMintFeeProp(uint256)", +"0a0e7883": "nDelegations(bytes32)", +"0a0e78e3": "addNOSPackage(uint256,uint256)", +"0a0f8168": "ceoAddress()", +"0a0fac2b": "isProxyOrSender(address)", +"0a0fb66b": "transferPreSignedHashing(address,address,uint256,uint256,uint256,uint256)", +"0a10376f": "newReplyEvent(uint256,uint256,string,string,uint256)", +"0a107ac3": "setPI_edit_19(string)", +"0a10df7c": "bookingId()", +"0a114a70": "extendExpiration(uint256)", +"0a12a7a0": "LogContribute(address,uint256)", +"0a12c89e": "BTImint(address,uint256)", +"0a12c90f": "AddNewChallenge(uint256,uint256,uint256,uint256,bool,string)", +"0a1432f7": "openResult(uint256,uint8[])", +"0a14504c": "participate(bytes32)", +"0a14849e": "setOpenBetIndex(uint256)", +"0a15299b": "TourCash(uint256,string,string)", +"0a15a07f": "removeUnicorn(address,uint256)", +"0a15d3a8": "ETFT(uint256,string,string)", +"0a16605e": "receiveSpendingDeposit(address,uint256)", +"0a16697a": "targetBlock()", +"0a16916a": "RESERVE_POOL_TOKENS()", +"0a16a53f": "setCitizen(address)", +"0a16e225": "getrestrict(address)", +"0a16efc0": "_addCommittedValidator(uint256,address)", +"0a17d422": "isZero(uint256,string)", +"0a1856db": "Billing(address,address)", +"0a18c334": "Denar()", +"0a18edfa": "returnCouponProportion(address[3],bytes32)", +"0a18f6c1": "playForcibly()", +"0a19283c": "_createCryptsy(uint32,uint32,uint32,address)", +"0a1930b7": "LogDonation(address,uint256,uint256)", +"0a193612": "setCountry(address)", +"0a19b14a": "trade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256)", +"0a1a677e": "searchtickets()", +"0a1a802e": "MatchPay()", +"0a1ab7fc": "arrayOfAccountsThatHaveClaimed(uint256)", +"0a1ceb0e": "usableBalances(address)", +"0a1dfb5a": "nextNextBid()", +"0a1e3a2c": "publishExecution(string,string,string,string,string,string)", +"0a1e71de": "isIco(uint256)", +"0a1e7701": "AtraOwner()", +"0a1e7a89": "getStudentRequest()", +"0a1e9f5e": "TokensOut()", +"0a1f0d9b": "reCap(uint256)", +"0a1f194f": "removeTrader(address)", +"0a1f5862": "minedTokenCap()", +"0a1f868c": "fuint256a(uint256[])", +"0a20aba4": "investOtherCrypto(address,uint256)", +"0a213e5b": "TWIMToken()", +"0a2282ae": "JackPot()", +"0a22ee73": "accountExists(address,uint8)", +"0a24c5bb": "yearlyMintCap()", +"0a2557d5": "wasInvestorWithdrawn(bytes32,address)", +"0a262f48": "setPreActiveTime(uint256)", +"0a26ccb1": "putBool(bytes32,bool)", +"0a276680": "transferOwnership(address,uint256)", +"0a27813d": "finalizedHoldingsAndTeamTokens()", +"0a28c664": "tokensOfWithData(address,uint256)", +"0a298034": "getFreeBulls()", +"0a29f508": "uploadSignedString(string)", +"0a2a9a01": "addWallet(address,uint256)", +"0a2ad0f3": "resetState(address)", +"0a2c0c65": "getAvailableVolume(bytes)", +"0a2cafac": "BPRchain()", +"0a2d31ad": "addToOptionChain(uint256,uint256[],uint256[],bytes32[],address[])", +"0a2d7629": "month12Unlock()", +"0a2d967b": "stopThisIco(bool)", +"0a2df1ed": "callSender(bytes4)", +"0a2eb301": "isAdministrator(address)", +"0a2ebc39": "NVISIONCASH()", +"0a2fd551": "ValidateKey(address,bytes32)", +"0a323fd0": "Boardcoin()", +"0a33cd41": "seIcoAddress(address)", +"0a35a7b1": "saleTierList()", +"0a36645f": "getShopOwnerProductList(string)", +"0a377f3a": "reserveKNCWallet(address)", +"0a384665": "maxTokensAmount()", +"0a38b400": "intermediadorAprovaDevolucao(bool)", +"0a394245": "doesReferralCodeValid(string)", +"0a39e222": "transferFromReserve(uint256,address)", +"0a3a0531": "manualContribution(address,uint256)", +"0a3b0a4f": "add(address)", +"0a3b1cd2": "setHotwallet(address)", +"0a3b7d9b": "TokenMacroansy()", +"0a3c000d": "buyerSymbol()", +"0a3c3088": "ARIZONE()", +"0a3c34fb": "successfulTransactions_()", +"0a3c4dbe": "merculetPrice()", +"0a3cb663": "freezePeriod()", +"0a3d7cce": "assertEq27(bytes27,bytes27,bytes32)", +"0a3dfba7": "giftCharacter(address,uint8)", +"0a3dfd10": "KittenTalked(string)", +"0a3e5712": "revokeWithdrawConfirmation(uint256)", +"0a3ecdfe": "drawNumbers(uint32)", +"0a3f013f": "releaseTimestamp()", +"0a3f5897": "placeBetEth()", +"0a401086": "operational()", +"0a402742": "allocateNormalTimeMints(address,uint256,uint256,uint256,uint256)", +"0a402a32": "LadaToken(uint256,string,string,uint8,address)", +"0a40878a": "EXSCoinSeller()", +"0a40f15f": "fundDeal(string,address)", +"0a40fb8c": "permissionMarker(address,bool)", +"0a412ae4": "aboveMinimumPurchase()", +"0a41442f": "setNewWallet1(address)", +"0a41dfee": "cancel_face_proof_request()", +"0a425a33": "getTreeIds(address)", +"0a42f86f": "getFrequency()", +"0a44b9cf": "amountIAmOwed()", +"0a4543ec": "MonoretoToken(uint256)", +"0a4625af": "totalEthers()", +"0a4655dd": "insert(bytes32,address)", +"0a46706b": "toCom(uint256)", +"0a47185d": "calcNav(uint256,uint256)", +"0a4740ff": "disableSale()", +"0a47a7a6": "mutiTransfer(address,address[],uint256[])", +"0a48dcb3": "appendUint8ToString(string,uint8)", +"0a49646b": "CreationRate()", +"0a49dece": "getDevelopmentFundBalance()", +"0a49e536": "getPoolAmounts(uint256)", +"0a4a3f0a": "GetConfirmRound(uint32,uint8)", +"0a4a57bc": "contain(uint256[],uint256)", +"0a4bb260": "buyItemAndApply(string,uint256)", +"0a4bfa6d": "IMDEXwithdrawToken(address,uint256)", +"0a4c374a": "birthPerTen()", +"0a4c6a45": "TEAM_UNFREEZE()", +"0a4caed0": "getChannelByRank(address,uint256)", +"0a4d564c": "TieUpLooseEnds()", +"0a4d7cd7": "setUserIdentityDocs(string)", +"0a4da2d4": "MyAdvancedTokenV2(uint256,string,string)", +"0a4dea01": "VETRI(uint256,string,string)", +"0a4fa201": "View_TrustlessTransaction_Status(uint256)", +"0a50e361": "generateNumberWinner()", +"0a513bc7": "CMBUpgradeableToken(address)", +"0a516805": "takerArguments(address)", +"0a518754": "periodICOStage4()", +"0a52d194": "payCommission(address,uint256,uint256)", +"0a55fbfe": "getMember(address,address)", +"0a56094d": "AriesToken()", +"0a56293d": "lockTokens()", +"0a564a03": "rateRound2()", +"0a569e8a": "currShares(address)", +"0a56a5f3": "nfsPoolLeft()", +"0a597da7": "impl_additionalRewards()", +"0a5988a8": "Term()", +"0a59b81b": "mesasCreated()", +"0a59bf2d": "setPersonalisationCost(uint256)", +"0a59c66e": "AuctusTokenVesting(address,uint256,uint256,uint256)", +"0a5a00c1": "recovery(address,address,uint256)", +"0a5a1e9a": "withDrawTips()", +"0a5a4e17": "AMBASSADOR_STAKE()", +"0a5a5b11": "releaseSecond()", +"0a5ab11d": "vestingWallet()", +"0a5ccb2a": "reclear(address,uint256,uint256,uint256,uint256,bool)", +"0a5cced2": "bookRoom(string,uint256[],uint256,address,bytes32,uint256,bool)", +"0a5cf9bb": "NeuralControl()", +"0a5dc24d": "getAuthorisationStatus(address)", +"0a5dc5a9": "blockMessagesFrom(address)", +"0a5de7bb": "midOf(uint256)", +"0a5ee9b0": "StakeReleased(uint256,uint256,address,bytes32,uint256)", +"0a5f558e": "mintInitialSupply(uint256[],address,address,address)", +"0a5f80f4": "publicAddDeposit(address,uint256)", +"0a6076b3": "SellableFund(uint256)", +"0a612095": "replaceToken(address[])", +"0a6184ce": "oneHundred()", +"0a623a11": "determineOutcome(uint8[],uint8[],uint8[],bool[],uint256)", +"0a62db33": "YToken(uint256,string,string)", +"0a639726": "oldPriceChangeBlock()", +"0a639ed1": "safeDiv_dec(uint256,uint256)", +"0a63ae38": "NukeContract(address)", +"0a64143a": "totalWithdrawn(address)", +"0a642d00": "retrait_3()", +"0a64bdb1": "_verifyOptionPoolDefray(address)", +"0a66d698": "isSealed(address)", +"0a67d2c7": "withDraw(address)", +"0a67dfbb": "setTeamTokenHolder(address)", +"0a681f7f": "NEXT_POT_FRAC_BOT()", +"0a68f374": "getATitty(uint256)", +"0a692347": "withdrawBack()", +"0a6a3f00": "B3nsToken()", +"0a6aec63": "cloneActiveToPlayed()", +"0a6b378c": "pushTokenId(uint256)", +"0a6be0e7": "BalancedPonzi()", +"0a6bea46": "principle(string)", +"0a6c0642": "frozenPortions(uint256)", +"0a6ee71a": "VISTACrowdSaleP1(address,address)", +"0a6ee947": "lockupContract()", +"0a6f2fbb": "setAllowDrawETH(bool)", +"0a6f5d8e": "_jackpotTax(uint256)", +"0a6fbb05": "SetPass(bytes32)", +"0a703549": "__forward(uint256)", +"0a70c0fd": "getTogglePrice(uint256)", +"0a70cae0": "getBalance2()", +"0a71943f": "PresaleToken(address)", +"0a71d020": "adjustFeaturePrice(uint256)", +"0a720fa9": "MemberSoldToken(address,uint256,uint256,uint256,uint256,uint256)", +"0a7258d8": "setNameWriterId(address,bytes32,bytes32)", +"0a728b85": "MakeSellOrder(bytes32,address,uint256,uint256,address)", +"0a732dac": "getCrowdsaleAddress()", +"0a7354d9": "getOwnedShipsByAddress(address)", +"0a738326": "Whitelist(uint256,address,bool)", +"0a738559": "AitasChain()", +"0a73f7c4": "GNNM(uint256,string,string)", +"0a740f74": "checkDatesPayment(address,uint256)", +"0a7493b4": "Etheropt(uint256,string,uint256,uint256,bytes,address,int256[])", +"0a74a181": "updatefundendtime(uint256)", +"0a751225": "shutDownDAO()", +"0a756f09": "StorageFund()", +"0a762b42": "PROMETHEUS_VOUCHER_PRICE()", +"0a766cfa": "sellCommission()", +"0a77b078": "Exchange()", +"0a77c3ed": "saleDuringRefundPeriod()", +"0a781bf4": "iCASH()", +"0a78e560": "PlayerNeedRefresh(address,uint256)", +"0a790e19": "MAX_ATHENIANS()", +"0a790eb7": "services(bytes32)", +"0a798f24": "openChannel(address,address,uint256)", +"0a799557": "setStartRefund(bool)", +"0a7a0807": "evaluateBet()", +"0a7a1c4d": "action()", +"0a7a2fef": "emitCapabilityRemoved(address,bytes4,uint8)", +"0a7a37bc": "setMonkey(string)", +"0a7a783a": "addOrg(address,address,string,string,string,string,uint8)", +"0a7a8c0a": "ItemMarket()", +"0a7c1922": "bitexlive()", +"0a7c1c35": "mItems(uint256)", +"0a7c1e9f": "NebeusToken()", +"0a7cf2aa": "weiHardCap()", +"0a7d29aa": "checkFunding()", +"0a7ead50": "_processPresalePurchase(address)", +"0a7f4239": "getAccountFundContract(address)", +"0a7f565f": "Intermediary()", +"0a7f734e": "_processTx(address,uint256)", +"0a7fb746": "removeMilestoneFrom(address,uint8)", +"0a7fc3df": "Sentivate()", +"0a80e725": "isReserveSupplyAssigned()", +"0a80ef45": "getIsClosed()", +"0a811fcc": "DigitalPesoCoin()", +"0a82f06b": "deleteCoverImage(uint256)", +"0a82fd1c": "deletePortfolio(uint256)", +"0a834ac0": "START_TGE()", +"0a85107a": "LogTransfer(address,address,uint256)", +"0a857040": "withdrawTrx(uint256)", +"0a85bb25": "isAuthorized(address,address,bytes)", +"0a864240": "TMBCStandardToken(uint256,string,uint8,string)", +"0a866f3a": "addThing(string,bytes32,bytes32,string)", +"0a86f644": "test_0_testBasicTxExecution()", +"0a87391c": "investorsAccounts()", +"0a874df6": "lookup(uint256)", +"0a875313": "createFunded(address,uint256,bytes32,bytes32,bytes1)", +"0a87557c": "ICO_END_TIME()", +"0a883790": "payrollCount()", +"0a888a63": "operation_address(uint256)", +"0a8972f9": "LoveAirCoffee(uint256)", +"0a898428": "nodesVars()", +"0a89e0aa": "switchModeSoOnlyEmergencyStopsAndEscapeHatchesCanBeUsed()", +"0a8a2485": "invite(address,bytes)", +"0a8b88f6": "SECOND_VOLUME_BONUS()", +"0a8bcdb9": "withdrawFromReserve(uint256)", +"0a8c138e": "NAABHAToken()", +"0a8c1551": "EtherAsset()", +"0a8d032d": "QuantumToken()", +"0a8d5fb8": "techProvider()", +"0a8e891f": "Medcash()", +"0a8e8e01": "test3()", +"0a8ed3db": "grantPermission(address,address,bytes32)", +"0a8f8fb9": "advisersReserve()", +"0a8fed89": "setup(uint256,uint256)", +"0a90011f": "setStatus(address,uint256,uint8)", +"0a90b578": "getLenderInterestForOracle(address,address,address)", +"0a90c704": "createCommunity(string,string,string,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)", +"0a9110b2": "NewDataRequest(uint256,bool,string)", +"0a919e3c": "QUEENTEN()", +"0a91cad0": "nextReleaseDate()", +"0a91f2a5": "get_owner_of(address)", +"0a9254e4": "setUp()", +"0a92b264": "getRandom(address,uint256,uint256,uint256)", +"0a934b9d": "mainSaleAllocations(address)", +"0a94031c": "GigaProfitIn(uint256,string,string)", +"0a94ece7": "nextUpgradeAgent()", +"0a95011e": "getCreateMarketNumTicksValue()", +"0a95c49d": "closeOutSweeps()", +"0a95dbfa": "approveUser(address,bytes32)", +"0a9626ba": "setLiqPrice(uint256)", +"0a968d5e": "issueFirstRoundToken()", +"0a979511": "gcExchangeRate()", +"0a9848ac": "setAdminlist(address,bool)", +"0a986540": "chinainc()", +"0a988892": "saveCurrentArbitrationFees(address,bytes32)", +"0a9a70c0": "changeDevFeesAddr(address)", +"0a9a7842": "logAllStop()", +"0a9aa521": "callAMethod1(uint256,uint256,uint256,uint256)", +"0a9ac3d0": "getMarketerAddress(bytes32)", +"0a9ae69d": "bb()", +"0a9d4e95": "_buy(uint8,bytes6,uint32,uint32)", +"0a9de288": "distributeTokens(address,address,address,address,address,address)", +"0a9e24c1": "addBurnWallet(address)", +"0a9ef927": "newTimeLockedWallet(address,uint256)", +"0a9fc06f": "verifyProposal(bytes32,address,address,uint256,bytes32,string)", +"0a9fec36": "sPeriodSoldTokensLimit()", +"0a9ff623": "voteUID()", +"0a9ffbf9": "confirmDividend(uint256)", +"0a9ffdb7": "allocateToken(address,uint256)", +"0aa0903c": "MINIMUM_PRESALE_PURCHASE_AMOUNT_IN_WEI()", +"0aa0bd00": "getPartyB(bytes)", +"0aa0fbe5": "netContractBalance()", +"0aa1ae29": "SMCT()", +"0aa1ee4c": "membersWhiteList()", +"0aa20e73": "multiTransfer(address,address[],uint256)", +"0aa24f50": "adjustInvestorCount(address,address,uint256)", +"0aa28f09": "splitInService()", +"0aa2b673": "cumReqMarbles()", +"0aa2bbaa": "lastWillAccount()", +"0aa2bf7f": "test_26_assertGasUsage2000Boards()", +"0aa34c7c": "updateJMAmount(uint256)", +"0aa3ae7e": "refill(address,uint256)", +"0aa46c12": "testClearBitFailIndexOOB()", +"0aa5418f": "IrfanFr()", +"0aa56368": "claimSocialNetworkIdentity(uint256,uint256,address,uint8,bytes32,bytes32)", +"0aa59fe3": "miningFivePlat()", +"0aa5aa2d": "transferAndNotify(address,uint256,uint256)", +"0aa6d45d": "oraclize_randomDS_proofVerify__main(bytes,bytes32,bytes,string)", +"0aa7881a": "MintableToken(int256,uint256)", +"0aa79fc6": "refundParticipant(address)", +"0aa83f5a": "consume(uint32,uint32)", +"0aa86791": "NujaBattle()", +"0aa93fff": "updateBytes32s(bytes32[],bytes32[])", +"0aa9a4fb": "payPrize(address,uint256,uint8,uint256,uint256,uint256)", +"0aa9c58b": "fillOrKillOrder(uint256,bytes)", +"0aaa9e46": "TNT()", +"0aaba432": "salesVolume()", +"0aac1073": "getSwapOutgoing(uint256)", +"0aac5dfd": "getAssetsCount()", +"0aac8034": "prizeWinners()", +"0aad1f3b": "fechSumNumForCandidateByStage(address,uint256)", +"0aad8ef9": "removeTypeAddressById(uint256,address,address,uint256)", +"0aae7a6b": "info(address)", +"0aaef916": "addManyWhitelist(address[])", +"0aafa40e": "IOVOToken()", +"0aafefb8": "QPay()", +"0ab03e1b": "testControlRegisterContractAgain()", +"0ab0c6c8": "getWinnablePot(uint256)", +"0ab0df87": "timeStamp()", +"0ab174a3": "untrack(uint256)", +"0ab21db7": "sencEthRate()", +"0ab2a9b8": "modifyJurySize(uint256)", +"0ab3bb1b": "totalFundingGoalInIBC()", +"0ab41690": "_forfeitShares(address,uint256)", +"0ab44f74": "AllNewsCash()", +"0ab4846c": "rewardLast7Draw(uint256)", +"0ab4c065": "subdomainOwner(string,string,string)", +"0ab4ca55": "registerNameXaddr(string,address,bool,uint8)", +"0ab4debd": "shortBuy()", +"0ab51bac": "aum()", +"0ab58ead": "SingularDTVFund()", +"0ab5bed4": "platformWithdrawAccount()", +"0ab66be3": "paySubscription(address)", +"0ab68776": "addDiscount(uint256,uint256)", +"0ab6ead5": "Ended(address,uint256)", +"0ab6fb36": "capitalPoolOf(address)", +"0ab6ff19": "addFullFundTX(uint256,uint256)", +"0ab757df": "withdrawEIP777(address,address,uint256)", +"0ab763d0": "polyCustomersAddress()", +"0ab77095": "assignUnitRafflePrize(address)", +"0ab7ec3a": "rejectProject(address)", +"0ab84ed9": "pivx()", +"0ab85a10": "getTotalRewards(uint32)", +"0ab880e5": "resumeBuy()", +"0ab8afac": "auctionContract()", +"0ab9059c": "OrphanToken(address)", +"0ab93971": "GetCount()", +"0ab9419d": "addint256(int256,int256)", +"0ab9db5b": "banker()", +"0aba73d7": "getDealById(uint256)", +"0aba8ec2": "brokerImp()", +"0aba980f": "unblockFundsInEscrow(address,uint256,address)", +"0abb691b": "buynode(uint256)", +"0abb8409": "getPoolETHBalance()", +"0abbf2de": "TeamLocker(address,address[],uint256[],uint256)", +"0abcbbcd": "makeShitClone(address)", +"0abd171b": "setinfo(string,string,string,address)", +"0abd2ba8": "tokenPause()", +"0abe293d": "addRefiller(address)", +"0ac0b31f": "calculateMultiplierAndBonus(uint256)", +"0ac10c0d": "createVesting(address,address,uint256,uint64,uint64,uint64)", +"0ac153ac": "lockMax()", +"0ac168a1": "blockReward()", +"0ac1a281": "CapRevealed(uint256,uint256,address)", +"0ac25e1a": "createPromoClown(uint256,address,bool)", +"0ac28725": "requestTradeDeal(uint256,uint256,string)", +"0ac298dc": "get_owner()", +"0ac2a1c7": "bonusDeliverTime()", +"0ac2ae27": "MarketContractOraclize(string,address,address,uint256[5],string,string)", +"0ac2ffc5": "getMiniByOwner(address)", +"0ac313e0": "setPlatAuction(address)", +"0ac3ccc4": "calcBUYoffer(uint256,uint256)", +"0ac42534": "isCancellable(address)", +"0ac50a6e": "CPCToken(uint256,string,uint8,string)", +"0ac51bd7": "getTimestampsFromPublishers(address[],string[],int256[],int256)", +"0ac5a67f": "paymentGateways()", +"0ac5f441": "paySellerForBuyer(uint256,address)", +"0ac62e02": "emergencyStop(bool)", +"0ac67e2f": "getLowPrice()", +"0ac7366b": "IRONtokenSale(uint256,uint256)", +"0ac799ff": "_transferXToken(address,address,uint256)", +"0ac7c7ba": "getBalanceMessage(address,uint32,uint192)", +"0ac8dc61": "GetLandId(uint256,uint256)", +"0ac924a0": "Minter(uint256,address)", +"0ac94000": "executeRequest(uint32)", +"0ac96103": "getBaseUrl()", +"0ac9bb29": "nextSeedHashed()", +"0ac9d35f": "_getRandomNumber(uint256)", +"0aca08ca": "closeGiveAway()", +"0aca7403": "process_swap(address,address,uint256)", +"0aca9de0": "placeLong(address[2],uint256[7],uint8,bytes32[2])", +"0acaad4c": "getWeiContributed(address)", +"0acae9a7": "publicEnd()", +"0acb4c28": "activateOracle()", +"0acc4382": "getMinDailyWithdrawLimit()", +"0acdc3ef": "_Doihave(uint8)", +"0acdd69f": "TOTAL_SOLD_TOKEN_SUPPLY_LIMIT()", +"0ace8c9a": "addPackage(string)", +"0ace9469": "setmaxContribution(uint256)", +"0acf0b8e": "admin_add_modify(address,uint8)", +"0acf473b": "AdminCloseContract()", +"0acf4b0b": "createPromoToken(address,string,uint256)", +"0ad0a0f3": "setPurchaseValues(uint256,uint256,address,bool)", +"0ad137c4": "Provide(address,address,address,address)", +"0ad182bc": "getTickets(address)", +"0ad1c2fa": "getContract(address)", +"0ad2074c": "logFailedSweep(address,address,uint256)", +"0ad20914": "getRequestByRequesterAddress(address)", +"0ad23aad": "getNumberOfRatingForAddress(address)", +"0ad24528": "end(uint256)", +"0ad27798": "depositPresale(address,uint256)", +"0ad40377": "KYCPresale(address,uint256,uint256,uint256)", +"0ad40df1": "setConfiguration(uint256)", +"0ad43eaa": "enterMessage(string)", +"0ad4b97b": "fibonacciIndex()", +"0ad50c02": "buyPropertyInETH(uint16)", +"0ad54c03": "playerRefundBet(bytes32)", +"0ad59fa2": "CocaCola()", +"0ad63730": "virtuePlayerPoints()", +"0ad65128": "logPresaleResults(uint256,uint256)", +"0ad6aa28": "currentstagedata()", +"0ad6ac85": "pay(uint256,uint256,address)", +"0ad7cf3c": "BitCloud()", +"0ad7f29f": "CampaignManagerContract(address,address)", +"0ad80f41": "WorldTrade(uint256,string,string)", +"0ad95b44": "bribery()", +"0ad98d71": "showTotal()", +"0ad9cf6f": "_resetTransferredCoinFees(address,address,uint256)", +"0ad9d052": "model()", +"0adaa7bf": "expireAssociate(address)", +"0adae972": "detailsOf(address)", +"0adb1354": "RimuoviProfessore(address)", +"0adcaddc": "iterate_valid(uint256)", +"0adcdbaa": "redeemRate()", +"0add0baa": "maxInvestments()", +"0add8140": "pendingProxyOwner()", +"0adde487": "getPurchaseLimit()", +"0ade4942": "tokenPriceProvider()", +"0ade7142": "terminateDirectDebit(address)", +"0ade9429": "getNext(uint256,address,uint256,uint256,uint256)", +"0adeb700": "changeQuarterlyRate(bytes32,uint256)", +"0adf331b": "stateSuccess(uint256)", +"0adf7912": "TokenDestroyed(uint256,address)", +"0adfb4e2": "Elemental()", +"0adfba60": "callSelf()", +"0adfdc4b": "setAwardedInitialWaitSeconds(uint256)", +"0ae08793": "confirmAndCheck(bytes32)", +"0ae100d8": "addOrganFunction(address,string)", +"0ae1b13d": "post(string,string)", +"0ae1fac0": "startICOStage4()", +"0ae25ca3": "withdrawToTeamStep4(uint256)", +"0ae31fbd": "setDistrictAddress(address,address)", +"0ae32e72": "ZhangHongBinToken()", +"0ae41574": "logOrderCreated(uint8,uint256,uint256,address,uint256,uint256,bytes32,bytes32,address,address)", +"0ae50a39": "GetOwner()", +"0ae5e739": "grantAccess(address)", +"0ae66820": "getBuyCost(uint256)", +"0ae75eb8": "amountOfBRAsold()", +"0ae7a310": "tokenMeta(uint256)", +"0ae80c37": "kickStartMiniICO(address)", +"0ae870bd": "Mjolnir()", +"0ae8f28f": "getProposalTextArrayLength()", +"0aea47bc": "getTimer(uint256)", +"0aeacb5e": "getTotalRecords()", +"0aeb0f79": "UserCategorySet(address,uint256)", +"0aeb1552": "insertStrategy(bytes15,address,uint256,string)", +"0aeb4b26": "WorldCupControl()", +"0aeb6b40": "register(address,bytes,uint256)", +"0aebeb4e": "close(uint256)", +"0aeccc9c": "setScribe(address,address,string,string)", +"0aece23c": "getFeeAmount(int256)", +"0aed3c36": "testIsCase()", +"0aed3ca1": "getLoans(uint256)", +"0aed5a21": "NamiExchange(address)", +"0aed80f2": "secondSellPrice()", +"0aed8e72": "rotate(uint256,bool)", +"0aed9c45": "TicketsSoldForThisGame()", +"0aef8500": "amountFundAirdrop()", +"0aef8655": "PXLProperty(address)", +"0aefc573": "KyberHandler(address,address)", +"0aeffa65": "ETH_MIN_GOAL()", +"0af15f6e": "stopSellingGenes(uint256)", +"0af179d7": "setDNSRecords(bytes32,bytes)", +"0af1fe11": "getAllPRS()", +"0af23be2": "ETHERREDSupply()", +"0af39032": "testMintThis()", +"0af3e660": "getHolderId(address)", +"0af4187d": "getAllowance(address,address)", +"0af4626d": "testRetract()", +"0af4cd61": "setHalted(uint256)", +"0af658ca": "personUpdateActivity(uint256,bool)", +"0af6c9ff": "setColdWallet(address,uint256,uint256)", +"0af6f6fe": "changeAgentPermission(address,uint8)", +"0af72ad0": "isStrategy()", +"0af825da": "_transferInternal(address,address,uint256,bytes)", +"0af8bd95": "TIDAChain()", +"0af95750": "deactivateProject(address)", +"0af9d89c": "getPaintingGeneration(uint256)", +"0afa371d": "XMAX()", +"0afa6dde": "getAddressLost(address)", +"0afa9fb9": "contains(int256,address)", +"0afb0409": "refresh(address)", +"0afb9f1f": "getProposalByIdIteration(uint256,uint256)", +"0afc0a59": "computeTokens(uint256,uint256)", +"0afd21d2": "failSale(uint256)", +"0afd2778": "changeFundOwnerWalletAddress(address)", +"0afd548d": "setOperationContracts(address,address,address)", +"0afdca95": "impl_batchTransferMSM(address,address[],uint256[])", +"0aff2076": "getLastAuctionId()", +"0b009517": "YourToken()", +"0b00a111": "WhitelistUpdated(address,address)", +"0b00de8d": "unregisterWorkerAffectation(address,address)", +"0b00fd54": "TEAM_ADDR()", +"0b01517c": "getPlayerBalance()", +"0b01856d": "startPreICOTimestamp()", +"0b02177f": "testnetWithdrawn(uint256)", +"0b03ad11": "unregisterToken(address,string)", +"0b0608db": "LolaCoin()", +"0b070845": "Dagt()", +"0b073865": "share3()", +"0b0740ae": "getItemIndexToOwner(uint256)", +"0b077fe7": "Whales()", +"0b0788dc": "assertEq27(bytes27,bytes27)", +"0b0a4b17": "askHash()", +"0b0b6d5b": "supportImpeachment()", +"0b0bbd65": "addrToAsciiString(address)", +"0b0c2e80": "test_basicWithTwoAssertThrow()", +"0b0c564d": "Enter(uint256,uint256,bool,address)", +"0b0c8f1f": "initSmartToken(address,address,uint256)", +"0b0c92bd": "_isOperatorFor(address,address,bool)", +"0b0d031a": "fetchCreatedOrdersForPayer()", +"0b0d0eb7": "transferToBeneficiaries()", +"0b0e13d6": "closeStageTwo()", +"0b0edad3": "getBooking(address,uint256)", +"0b0f7743": "issuedCount()", +"0b100a5a": "policiesCount()", +"0b107904": "authorizeOne(address)", +"0b10bd1b": "HiroyukiCoinDark()", +"0b11a6e3": "ERGOIN()", +"0b11ed63": "getGenerationForWindow(uint256,uint256)", +"0b1200da": "setWalletContractAddress(address)", +"0b121c04": "createIssue(uint256,uint256,uint256)", +"0b12a148": "_distributeNewSaleInput(address)", +"0b12e7e2": "soowhat()", +"0b1350cf": "assetProxy()", +"0b1414c1": "oneStaIsStb()", +"0b14331f": "getExpiration(uint256,uint256)", +"0b151811": "getBonusByDate(uint256,uint256)", +"0b15650b": "randInt(uint256,uint256)", +"0b1573b8": "setRoundLockAmount(uint256)", +"0b181567": "exceed()", +"0b1851a9": "Billionscoin()", +"0b1a3144": "pushToApproved(address,uint8)", +"0b1a8e1e": "setMasterServer(uint32)", +"0b1a94e7": "validPurchasePresale()", +"0b1aff48": "extendTDE(uint256)", +"0b1b62fa": "transferBackMANAMany(address[],uint256[])", +"0b1b92dd": "FACTOR_11()", +"0b1b9aa5": "getluckyuser()", +"0b1ba852": "changeDepositCell(address,uint256)", +"0b1bf3e2": "Galleass(string)", +"0b1c45c9": "getPhiladelphiaBets(address)", +"0b1c4a75": "subFees(uint256,uint256)", +"0b1c5b76": "fetchVoteMainInfoBySnapshotBlock(uint256)", +"0b1ca49a": "removeMember(address)", +"0b1d366d": "getLastAwardInfo(uint256)", +"0b1dcc88": "buyCountry(uint8)", +"0b1dfa26": "fxpDiv(uint256,uint256,uint256)", +"0b1e400a": "_transferFromToICAPWithReference(address,bytes32,uint256,string)", +"0b1e5acc": "roleHas(string,address,address)", +"0b1e7f83": "posts(uint256)", +"0b1ec92e": "RoundCreated(uint256,uint256,uint256,uint256)", +"0b1f3850": "num_hosts_revealed()", +"0b1fc3c0": "getVendingAmountLeft(uint256)", +"0b210a72": "getDrugInfo(uint256)", +"0b2140ab": "buyUSD(address,uint256)", +"0b214493": "_stageValidation(uint256,uint256,bool)", +"0b21d446": "setValidBwCaller(address)", +"0b225b42": "PHASE4_START_TIME()", +"0b2478b3": "getSaleIsOn()", +"0b247b1b": "CreateACI(address,uint256)", +"0b25cbb2": "Ftechiz()", +"0b261340": "marbleBalance(address)", +"0b269898": "setPricing(uint256[])", +"0b274f2e": "passPhase()", +"0b27fa51": "noOfTokenAlocatedForPresaleRound()", +"0b280a29": "isBatchActive(uint256)", +"0b2909e6": "addOwed(address,uint256)", +"0b294bdf": "GetPlayerDetails(address,address)", +"0b299630": "addItem(string,address,uint256,address,uint128)", +"0b2a6c70": "marketWine()", +"0b2acb3f": "add(address,bytes)", +"0b2accb2": "getPercentage()", +"0b2c588c": "setAdventureHandler(address)", +"0b2d25ca": "calculateCharityFee(uint256)", +"0b2e02c7": "migrateAgent()", +"0b2e7423": "maxSecurityGuardDelay()", +"0b2ee7e9": "create(uint256,uint256,uint256,bool)", +"0b2f6a7e": "_mintPlayer(uint32,uint32,address)", +"0b2f6cef": "m_hodlers()", +"0b2fce74": "addGardener(uint256,uint256)", +"0b305c62": "playerEndGameConflict(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address,bytes,bytes32)", +"0b305ce9": "destFoundation()", +"0b309c93": "Timer()", +"0b30ab4f": "bubbleSort()", +"0b30fc7b": "pastValues(uint256)", +"0b317697": "investorToken(address)", +"0b31fc3a": "DiamondToken()", +"0b341245": "activityAddress()", +"0b3464c3": "activeHeroGenome(address)", +"0b34f78c": "MintProposalAdded(uint256,address,uint256)", +"0b3532b3": "balanceSellingOf(address)", +"0b354090": "SimpleConstructorBool(bool,bool)", +"0b3598c6": "_sealDataStream(address,address,uint256,bytes32,uint256,bytes32)", +"0b35ea61": "stopGuess(uint256,bool)", +"0b35fe44": "VerifyEd25519(bytes32,bytes,bytes)", +"0b368627": "releaseOldData()", +"0b377a8f": "setNumIncorrectDesignatedReportMarkets(uint256)", +"0b38bae2": "_totalSupplyLeft()", +"0b393a9d": "MANHATTANPROXY1STAVE()", +"0b395d1e": "_addUserExperience(address,int32)", +"0b39aaa9": "privateEquityClaimed()", +"0b39c3e1": "requestLoan(address,address,bytes16,uint256,uint128,uint128,uint16,uint64,uint64,string)", +"0b39f18e": "setCardTokenAddress(address)", +"0b3a2ffd": "setRoyaltyInformationContract(address)", +"0b3af901": "proposePlatformWithdrawal(address)", +"0b3b2222": "TokenDistribution(address,address)", +"0b3bb024": "getTenant()", +"0b3bc259": "funderCount()", +"0b3cd070": "multiBet(uint256[],uint256[],uint256[])", +"0b3d7174": "prev_week_ID()", +"0b3e9c7b": "userEndGameConflictImpl(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,uint256,address)", +"0b3ed536": "claimDonations(uint256)", +"0b3f191a": "disableChanging(bool)", +"0b3fe32d": "setHalfTimeAtkBoss(uint256)", +"0b407022": "migrateV1Upgrades(address[],uint256[],uint256[])", +"0b40ab43": "setBankAddress(address,address)", +"0b4130f2": "GenomaToken()", +"0b424b66": "HHDCToken(uint256,string,string)", +"0b42d1de": "BejonesStandardToken(uint256,string,uint8,string)", +"0b43c6e6": "CryptonCoin()", +"0b440f33": "initCrowdsale(uint256,uint256,uint256,address)", +"0b4438e5": "spinAll()", +"0b45e8db": "SALE_CAP()", +"0b464bf6": "blocksSinceLastBid()", +"0b4650a0": "FiatContract()", +"0b467b9b": "revoke(bytes)", +"0b47459b": "LAARToken()", +"0b480095": "teamAddressThreeTokens()", +"0b483f6e": "toAllow()", +"0b48af0b": "interestOf(address,address)", +"0b4964a8": "addDungeonNewFloor(uint256,uint256,uint256)", +"0b4a1ece": "VisibilityDerived()", +"0b4aca45": "__formatDecimals(uint256)", +"0b4b5d5e": "GamityToken()", +"0b4bb61f": "burnPercentage1000m()", +"0b4c72a9": "rejectProvider(address)", +"0b4ca1cd": "doResult(uint256,bytes32,bytes32,uint256)", +"0b4cf825": "getRandomColorType()", +"0b4da628": "IsPlayer()", +"0b4db63a": "Tratok()", +"0b4dfc77": "contractMint(address,string,bytes32,bytes32,uint256)", +"0b4e0513": "reserveTokenFund()", +"0b4efd9a": "RobotBTC(uint256,string,string)", +"0b4f12f6": "updateUser(string)", +"0b4f3f3d": "cancel(string)", +"0b4f79a1": "RejekiKita()", +"0b509e1d": "getCountOfCell()", +"0b513828": "parseChannel(bytes)", +"0b513ce9": "PonziBet()", +"0b51989a": "setData(address,string)", +"0b520ad5": "freePeriodDuration()", +"0b522abf": "closeCrowdsale(address)", +"0b549884": "matingPrice(uint256)", +"0b54cbfb": "setType(uint8)", +"0b5608f2": "PackageCoinPresaleOne(uint256,uint256)", +"0b566f33": "unlockedCollateral(address)", +"0b56d4c6": "airdropNum()", +"0b56f01c": "createAmountFromEXORForAddress(uint256,address)", +"0b573638": "ethToTokenTransferOutput(uint256,uint256,address)", +"0b57adc0": "Transwave()", +"0b57c487": "COVERCOINToken(string,string,uint8,uint256)", +"0b583982": "getUserProductCount(bytes32)", +"0b586f1a": "_emitWorkResumed(uint256,uint256)", +"0b58dc38": "SetNewBlockchainEnabled()", +"0b590c6b": "SingularDTVToken()", +"0b591195": "largestPenis()", +"0b5945ec": "setTokenURL(address,string)", +"0b597135": "onHardCapReached(uint256)", +"0b5982f0": "payOutDividend()", +"0b59a5c4": "purchasedCoins()", +"0b59df68": "withdrawEscrow(uint64)", +"0b5a006b": "currentYear()", +"0b5ab3d5": "destroyDeed()", +"0b5ad1c1": "UpdateSellAgentCreators(address)", +"0b5adfff": "getNumTickets()", +"0b5ba082": "stagesManager()", +"0b5c2307": "globChanceOwner(uint256)", +"0b5c3f87": "addReferral(address,address)", +"0b5ca8db": "issuedBounty()", +"0b5d1c3d": "testLessThanOrEqual()", +"0b5d69ab": "UpdateMaxBalance(uint256)", +"0b5d94f6": "getOrderPrice(address,address,uint256,uint256)", +"0b5e19b0": "getInvestSum()", +"0b5e2232": "HunxuHappyToken()", +"0b5e89f4": "icoStarted()", +"0b5ee006": "setContractName(string)", +"0b5f2efd": "setCurrentRate(uint256)", +"0b5f5ef1": "setAvatar(uint256,bytes)", +"0b5faf97": "claimWin(bytes32)", +"0b5fcf81": "enableAutoDividends(uint256)", +"0b604085": "setBombletAddress(address)", +"0b605fcd": "tokensTo0xbtc_(uint256)", +"0b60ca88": "raisedSale2USD()", +"0b611241": "ieoStorageVault()", +"0b6142fc": "breach()", +"0b620b81": "withdraw(address,address,address,uint256)", +"0b6386d4": "KyberNetworkCrystal(uint256,uint256,uint256,address)", +"0b63b114": "freeTokens(address)", +"0b63fe95": "processPayment(address,uint256)", +"0b642d72": "recoverLostEth(address,uint256)", +"0b65108b": "merge()", +"0b654e7d": "finishedRaceCount()", +"0b663e63": "promoCount()", +"0b66c247": "scoreTeams(uint32,uint32[],int32[],uint32[],uint32,uint32)", +"0b66f3f5": "multisendToken(address,address[],uint256[])", +"0b6700d6": "getLogo()", +"0b6780aa": "extendSaleEndDate(uint256)", +"0b679d2c": "REQUEST_CANCELED_BY_CREATOR()", +"0b6826ca": "payDividend()", +"0b682cb8": "Quhabitat()", +"0b684de6": "CitizenOneCoin(uint256)", +"0b695449": "MiningUpgrade(address,uint256,uint256)", +"0b697362": "withdrawFromSubRound(uint256)", +"0b6b80b2": "sampleRegistry()", +"0b6bd1b0": "GetAcorn(address)", +"0b6bf29f": "partner1_will()", +"0b6c754b": "isSuccess()", +"0b6c9ac7": "airdroppedAmount()", +"0b6d3017": "overflow_upper()", +"0b6d715b": "createGame(string,uint256,uint256)", +"0b6d8d52": "createDAO(address,uint256,uint256)", +"0b6e01db": "total_bet_available()", +"0b6e46fe": "enableController(address)", +"0b6e6511": "convertToELIX(uint256,address)", +"0b6ebf86": "KWHTokenAddress()", +"0b6f0530": "test_twoInvalidEqBytes32Message()", +"0b6f2fad": "HashCoin(uint256,string,string)", +"0b6f46ed": "isPresaled(address)", +"0b6f5b3d": "ShrimpFarmer()", +"0b6f6e0d": "CanYaCoinToken()", +"0b6fc163": "claimSignerAddress()", +"0b6fcdb0": "getEnforceRevisions(bytes32)", +"0b70ce55": "Betfunding()", +"0b714b17": "AddHash()", +"0b71ff6a": "MTDCERC20()", +"0b72396c": "validateContractWithCode(address,string)", +"0b730fae": "ICOadvisor2()", +"0b731652": "Ethbet(address,address,address,uint256,uint256)", +"0b7373d6": "giveAllBack()", +"0b73aad0": "msgsWaitingDone(uint256)", +"0b74074b": "startPayouts()", +"0b743021": "TOKENS_TOTAL()", +"0b745a01": "setLockup(address)", +"0b747d91": "randomSeed()", +"0b74b620": "getChannelsParticipants()", +"0b74edc6": "testFinalHash()", +"0b74f633": "getTradeParameters(uint256,address,address,uint256,uint256,uint256,uint256)", +"0b7507ae": "getTaskAtIndex(uint256)", +"0b7623ba": "abs(int8)", +"0b76619b": "staked()", +"0b779363": "checkVotingForChangeAdminAddress()", +"0b77fa28": "generateThemedSpinners(uint256,uint256,uint256)", +"0b781385": "nextCampaignBalance()", +"0b78f9c0": "setFees(uint256,uint256)", +"0b7abf77": "TOTAL_TOKENS()", +"0b7ad54c": "getContent(uint256)", +"0b7d1de1": "proofOfSMS()", +"0b7d6320": "crowdsaleAgent()", +"0b7d796e": "loop(uint256)", +"0b7ddd25": "setRaisedAmount(uint256)", +"0b7e4e7f": "substractNumber(uint256)", +"0b7e9c44": "payout(address)", +"0b7ef89b": "contributeToCampaign(uint256)", +"0b8021c4": "getPublishedTokens(address)", +"0b803b6b": "transferApprovedBalance(address)", +"0b80b4f9": "QuantaloopToken()", +"0b80f8d3": "invmod(uint256,uint256)", +"0b811cb6": "executeProposal(uint256,bytes32)", +"0b816045": "getRequestInfo(uint256)", +"0b81e216": "setAllowTransfer(bool)", +"0b82a541": "setIcoEndTime()", +"0b82d33d": "withdrawBalanceDifference()", +"0b83284e": "MinterFunction(address,uint256)", +"0b834864": "publicTransfers(address,address,uint256)", +"0b83de20": "ABI(bytes32)", +"0b841433": "agentApproval(address,uint256)", +"0b8440ec": "bonusTokenRateLevelTwo()", +"0b84cc4a": "Committees(uint256)", +"0b8514b9": "exit(bytes32,bytes,bytes32)", +"0b851937": "year4Unlock()", +"0b85877f": "isICAP(address,address)", +"0b85881c": "ceilLog2(uint256,uint256)", +"0b869824": "CeoAddress()", +"0b87572b": "communityDevelopmentSupply()", +"0b8762d1": "Block18Token()", +"0b87cf10": "crowdsaleActive()", +"0b88e06b": "testTokenBalance()", +"0b892e3f": "celebs(uint256)", +"0b897f64": "invert(address,uint256,address)", +"0b8a7bf8": "coinbaseWallet()", +"0b8b709d": "_createDroneInternal(address)", +"0b8ba87d": "UnilotBonusTailEther(address)", +"0b8bbd5b": "webGiftEtherAmount()", +"0b8d0a28": "wallet2()", +"0b8d9d94": "createSportsBet(string,uint256)", +"0b8e845a": "burnFeeFlat()", +"0b8eebde": "gameEnd()", +"0b8f0b61": "sendCoinsToBeneficiary()", +"0b8f0e0a": "LIWUC()", +"0b901c82": "totalRepaidQuantity()", +"0b910f86": "PRESALE_MIN_INVEST()", +"0b91eaf9": "isValidated(address)", +"0b926ecd": "validStoreVal()", +"0b927666": "order(address,uint256,address,uint256,uint256,uint256)", +"0b93381b": "success()", +"0b936a77": "DuanZiToken(address)", +"0b93bf0d": "setRecruitHeroFee(uint256)", +"0b948684": "delegatedTransfer(bytes,address,uint256,uint256,uint256)", +"0b95c8ae": "aggiungiMsg(string)", +"0b962e8f": "AlphaChainConstructor()", +"0b96406a": "vestingMappingSize(address)", +"0b96740c": "changeMinimumContributionForAllPhases(uint256)", +"0b967584": "voteForCandidate(uint256,address)", +"0b967fd2": "remove_master(address)", +"0b967fe7": "assertEq18(bytes18,bytes18)", +"0b96e72e": "setBAS(bytes32,address,string)", +"0b972ff6": "weiPreCollected()", +"0b97bc86": "startDate()", +"0b97fc8d": "WeiPerTicket()", +"0b98107c": "dateFrom()", +"0b9830ba": "tokensIndexOf(address,bool)", +"0b9835cf": "pvpContenderRemoved(uint32)", +"0b9849ab": "WEChainCommunity()", +"0b98f975": "setBonus(uint256)", +"0b9902d0": "WithdrawPerformed(uint256)", +"0b99ccee": "ico2Ended()", +"0b9aa067": "isVerified(address,address)", +"0b9ac851": "getCurveUnset(address,bytes32,int256)", +"0b9adc57": "deleteBytes32(bytes32)", +"0b9b0e7d": "highRate()", +"0b9b8130": "registerMintedToken(address,string)", +"0b9b9602": "SalesWalletUpdated(address,address)", +"0b9bfa6c": "inCommunity(address,address)", +"0b9cae77": "KinetiQ()", +"0b9d5847": "getExchange(uint256)", +"0b9d98e9": "getTotalVolume()", +"0b9e9817": "CanaryV7FastTestnet()", +"0b9ea6c8": "getCurrentSold()", +"0b9ea95d": "configureSaleClockAuction(address,uint256)", +"0b9f1e76": "wphcToken()", +"0b9f2816": "nowwww()", +"0b9f2ca6": "getCountBuildings(uint256,uint256,bool)", +"0b9f6108": "divsm(uint256,uint256)", +"0b9fc8fb": "checkerSign(bool)", +"0ba00420": "bulkPay(address[],uint256)", +"0ba0a3a1": "TakerSoldAsset(address,uint256,uint256,uint256)", +"0ba12c83": "commitUpgrade()", +"0ba1772d": "callDistributed()", +"0ba1f7ad": "getImpactCount(string)", +"0ba234d6": "cancelRecovery()", +"0ba24e4c": "customers(address,address)", +"0ba27775": "fondToken()", +"0ba2e8a8": "allowFunding()", +"0ba3aa55": "setdoctor(string,uint256,string)", +"0ba46624": "setBountyAgent(address,bool)", +"0ba4d242": "s43(bytes1)", +"0ba5890a": "noteBallotDeployed(bytes32)", +"0ba6d271": "updateFunds(address,uint256)", +"0ba7ebe2": "changeAll(address)", +"0ba8916f": "updateMeterKey(address)", +"0ba8d735": "purch(address,uint256)", +"0ba8ebec": "lockance(address)", +"0ba92878": "delOrganizationCertificate(string)", +"0ba95909": "getMaxAmount()", +"0baaaed9": "setConfigBytes(bytes,bytes)", +"0bab4d84": "setClearingPriceSubmissionDeposit(uint256)", +"0bab718f": "updateCurs(uint256)", +"0bab7ff6": "messiCommunity()", +"0bac0312": "TryUnLockBalance(address)", +"0bac15ae": "PUBLICSALE()", +"0bac2850": "setFunctionFourPrice(uint256)", +"0bac3c01": "isDeferred(address)", +"0bac9fe7": "getUsernameByIndex(uint256)", +"0bad342a": "EscrowContract(address,address,address,address,uint256,uint256,uint256,uint256)", +"0bad4481": "setupRegion(address[16],uint256,uint256,uint256[],bool,uint8[128])", +"0bae2129": "affiliateTree()", +"0bae3288": "getSale()", +"0bae461c": "KomicaToken()", +"0baf0bcc": "lockDateTimeOf(address)", +"0bb0482f": "concatBytes(bytes,bytes)", +"0bb0e827": "add_addys(address[],uint256[])", +"0bb15acc": "GoldeaToken(uint256)", +"0bb18da2": "saveRefundJoinId(uint256,uint256)", +"0bb24375": "ITX_Token()", +"0bb25901": "freezeSupply(uint256)", +"0bb2cd6b": "mintAndFreeze(address,uint256,uint64)", +"0bb2cdef": "operatorManager(address,uint8)", +"0bb3a066": "unsetAdministrator(address[])", +"0bb4bbaf": "testInitialNumberOfVoters()", +"0bb4e6f4": "getTotalWei()", +"0bb536a2": "fightMix(uint256,uint256)", +"0bb563d6": "logString(string)", +"0bb5e62b": "EGC()", +"0bb700dc": "getStats(bytes32)", +"0bb7a81a": "ZhuhuaToken()", +"0bb8b9c3": "zint_convert(string)", +"0bb954c9": "WithdrawAndTransferToBankroll()", +"0bb9ee71": "createRepository(bytes32,bytes)", +"0bb9f21e": "SCAMERC20()", +"0bba3065": "AuthorityFilter()", +"0bba662d": "oneCoin()", +"0bbaa27a": "seedSourceB()", +"0bbad618": "setupReclaim()", +"0bbd4e38": "defrostReserveAndTeamTokens()", +"0bbd501e": "NewEtherPrice(uint256)", +"0bbdb469": "getLuckyblockSpend(bytes32)", +"0bbe0ee3": "transferAllFrom(address,address,uint256[])", +"0bbed2b7": "secondsaleopeningTime()", +"0bbf2768": "infrastruct(uint256)", +"0bbf709a": "validHolder(address)", +"0bbf8f38": "setMinBid()", +"0bbfdbec": "setUsdAmount(uint256)", +"0bc09cfe": "buy(uint256[6][])", +"0bc0c61f": "destroyOwner(address,uint256)", +"0bc1236e": "getTokenAmount(uint256,uint256)", +"0bc16f1b": "presell()", +"0bc1734c": "addPermissions(address[])", +"0bc217d9": "setCastleSale(uint256,uint256)", +"0bc23901": "WalletAddressesSet(address,address,address)", +"0bc2a3b7": "Showercoin()", +"0bc30aa0": "getTicketWinnings(uint256,uint256)", +"0bc311ea": "addFound(address)", +"0bc32570": "_sendTokenReward(address,uint64)", +"0bc32ab6": "tokenToPointBySkcContract(uint256,address,uint256)", +"0bc33b22": "addressJenkins()", +"0bc3a268": "KelvinToken()", +"0bc43490": "yesVotes(uint256,address)", +"0bc4ec45": "FirstDropToken()", +"0bc59a8e": "date15Nov2018()", +"0bc5b2c5": "stage_2_tokens_scaled()", +"0bc5e51e": "endTimeSale3()", +"0bc5f216": "kgtToken()", +"0bc69912": "createICO(bytes,bytes)", +"0bc6b708": "placeBetTESTONLY(uint256)", +"0bc6b89c": "dailySpent()", +"0bc6c96e": "failSafe()", +"0bc7760c": "crowdsaleSet()", +"0bc785df": "ACTToken()", +"0bc7fd93": "toTuis(uint256)", +"0bc8982f": "getBQL()", +"0bc8b4c2": "getMintRequestUintMap(uint256,int256,string)", +"0bc954dc": "addEgg(uint64,uint32,address,uint256)", +"0bc9c89c": "removeMessage()", +"0bca1704": "setHardcupTrue()", +"0bca441b": "BETHERTokenSale(uint256,address)", +"0bca5903": "claimMedals(uint16)", +"0bcab28a": "verifyReceiverAddress(address,address,address,uint8,bytes32,bytes32)", +"0bcb8a23": "getBondDivShare(uint256)", +"0bcbad90": "WLMTPrice()", +"0bcbbd21": "r2()", +"0bcbe35b": "lastBlock_f19()", +"0bcbfe1c": "withdraw_Eth(uint256)", +"0bcd0694": "getUserCities(address)", +"0bcd3b33": "getBytes()", +"0bcd87ed": "dashboardAddress()", +"0bce62ea": "isPreICOPublicOpened()", +"0bce8cdf": "getContributorInfo(address)", +"0bcef54c": "Eticket4Sale(address,address,uint256,uint256,uint256)", +"0bcf963b": "getDocumentsCount()", +"0bd089ab": "MyAdvancedToken(uint256,string,uint8,string,address)", +"0bd11894": "addBuilder(uint256,address)", +"0bd12120": "MMCC()", +"0bd18d7a": "investment(address)", +"0bd263ff": "registerPID(address)", +"0bd2ae1c": "ERW()", +"0bd38767": "testCanClone()", +"0bd3ae61": "EARLY_BIRD_SUPPLY()", +"0bd3cf7e": "Timebomb()", +"0bd58493": "sellMyApple(uint256)", +"0bd5b493": "payPostDrawRef(address,address,uint256)", +"0bd601df": "setLockEndTime(uint256)", +"0bd61e79": "_finalRoundLosersFight()", +"0bd62ad5": "FantasySportsCoin()", +"0bd64dbf": "BsToken(string,string,uint256,address)", +"0bd6a40f": "setWorkerAdress(address)", +"0bd6c769": "Load(address,uint256,uint256)", +"0bd7abde": "setMaxWinRate(uint256,uint256)", +"0bd7b6b8": "computed_fundraise()", +"0bd85158": "setUInt8Value(bytes32,uint8)", +"0bd8599e": "countUp()", +"0bd8a1d0": "auctionFinalized()", +"0bd8a3eb": "SaleEnded()", +"0bd934c3": "UPEXCoin()", +"0bd93738": "updateShareTimeGap(uint256)", +"0bd9c534": "right43(uint256)", +"0bda4dbf": "refundCount()", +"0bdaaaf5": "getAllOperations()", +"0bdab855": "distributeHNC(address[],uint256,uint256)", +"0bdc0031": "STARTBLOCKTM()", +"0bdc7953": "multiBuy(address[],bytes32[])", +"0bdc9c35": "CalculateReward(uint256,uint256,uint256)", +"0bddb83b": "bonusPresale()", +"0bdddb73": "stampOut(address,uint256,uint256)", +"0bdde107": "balanceOfme()", +"0bde1d36": "changeAllowanceToMint(address,address,int256)", +"0bdf3dae": "CryptoRoboticsToken()", +"0bdf5300": "TOKEN_ADDRESS()", +"0be0453b": "StringDemo()", +"0be0713d": "gcSupply()", +"0be0f677": "log(bytes32,string)", +"0be21ea9": "MAX_TIME_EXPLORE()", +"0be23ace": "RealMoney()", +"0be2858e": "multipleTransfer(address[],uint256[])", +"0be48491": "personalMax()", +"0be5430f": "DroneTokenSale(address,address)", +"0be560be": "NarniaUSDT()", +"0be5ca05": "privatePresaleTokenReservation(address,uint256,uint256)", +"0be5efa6": "year2LockAddress()", +"0be6ba2b": "addRestricedAccount(address,uint256)", +"0be702bf": "_v4()", +"0be72b6d": "allOfferingQuota()", +"0be76f80": "memberData(uint256)", +"0be77485": "Unlock(address)", +"0be77f56": "log(bytes)", +"0be80f39": "setComission(uint256)", +"0be80fa9": "changeVisitLengths(uint256,uint256,uint256,uint256,uint256,uint256)", +"0be8287e": "getJackpotInfo()", +"0be9189d": "showInvestorVault(address,uint256)", +"0be924ef": "tier_rate_4()", +"0be96fbd": "MAX_TOKENS_SALE()", +"0be9f930": "REL(uint256,string,uint8,string)", +"0beb90d3": "icoLimit()", +"0bebd0f9": "addAddressToGeneration(address,uint256)", +"0bec3231": "GalaxyChain()", +"0bece492": "setPhaseBonusAddress(address,address)", +"0bed63c7": "_isActive(uint256)", +"0bee1c3e": "availableICO_w2()", +"0beeb0af": "getValue(address,bytes32,address)", +"0beedbd4": "AdoptionRequested(bytes5,uint256,address)", +"0befe82b": "AddBankerPrincipal(uint8,uint256)", +"0befeeb0": "lastCreatedGame()", +"0bf05c99": "DraftPlayer(address,uint256)", +"0bf09985": "openRound(uint256,uint256)", +"0bf0e4e4": "myProfit(address)", +"0bf1c747": "destructed()", +"0bf2c50d": "setCFO(address,bytes)", +"0bf2ee8d": "addPerson(string)", +"0bf318a3": "finalizeCrowdsale()", +"0bf34d54": "CVToken()", +"0bf36806": "Bivacoin()", +"0bf474a9": "claimDonations(address[2],uint256[7],uint8,bytes32[2])", +"0bf5035d": "secondYearEnd()", +"0bf51f36": "updateTime(uint64)", +"0bf53613": "getBonusNow(address,uint256)", +"0bf53668": "consumers(address)", +"0bf61fd4": "t_Slava()", +"0bf63c60": "setBasicCentsPricePer30Days(uint256)", +"0bf6898e": "DPSToken(uint256,string,string)", +"0bf6dbfd": "VanityToken(address)", +"0bf75567": "voteSuperQuorum(uint256,bool)", +"0bf757e5": "HopiumToken()", +"0bf77989": "debug_coinbaseTxSha(bytes,uint256)", +"0bf7fb57": "getUserMilestone(address)", +"0bf82810": "removePartnerAddress(address)", +"0bf84797": "RATE_FOR_WEEK1()", +"0bf867c2": "Zemana()", +"0bf9236a": "KillContracts()", +"0bf9c50f": "calcNextNBonuses(uint256)", +"0bf9fd52": "wasPaid(bytes32)", +"0bfa1191": "setPriceStorageInternal(address,uint256)", +"0bfd1271": "confirmErc20TransactionRequest()", +"0bfd7b62": "getBonusesAmountAvailable(bytes32,uint256)", +"0bfefed4": "createUser(address,string,bool,bool,bool)", +"0bff2ac2": "NewBatch()", +"0bffa8b4": "changeMigrationInfoSetter(address)", +"0c0075a3": "getBallotOptions()", +"0c0078e8": "RESERVED_TOKENS_ANGLE()", +"0c012834": "ARS()", +"0c0174a4": "escapeRequest(uint256)", +"0c01b2ae": "setConfiguration(string,string,uint256,address[],uint256)", +"0c02159f": "HavEtherToken(uint256,string,uint8,string)", +"0c022933": "highTimeBonusValue()", +"0c031f45": "TokenBuy(address,uint256)", +"0c03348d": "getIntel(uint256)", +"0c0399a4": "iteration()", +"0c03f24a": "parseDate(string)", +"0c03fbd7": "getNumPassingTokens(address,uint256)", +"0c0615a7": "evaluate(address,string,string)", +"0c0662a8": "getLastWithdrawal()", +"0c06c3ee": "viewHouseFee()", +"0c06fda1": "AVINCOIN()", +"0c07fa56": "ICO_END()", +"0c087782": "PXLProperty()", +"0c087bc5": "stage1Start()", +"0c08bf88": "terminate()", +"0c08ec49": "importTokensToSidechain(address,address,uint256,bytes32)", +"0c099133": "ERC20TokenFactory()", +"0c0a5c55": "cancelAuth(address,address)", +"0c0a7a68": "Stars()", +"0c0ad299": "removeProject(address)", +"0c0b86ca": "currentAuctionId()", +"0c0bea5c": "FinalTokenToken()", +"0c0c13c8": "query2_fnc()", +"0c0cde7c": "ZIBToken(uint256,string,string)", +"0c0d6caa": "newDrawer(address)", +"0c0e5f0d": "calculateGrapeBuy(uint256,uint256)", +"0c0e6dea": "publicAllocationEnabled()", +"0c0ef2b0": "isGameActive()", +"0c103837": "votedHarvest(address)", +"0c112598": "fun(bytes32)", +"0c119354": "rateMain()", +"0c11dedd": "pay(address)", +"0c11f32e": "milestoneShares(uint256)", +"0c12fe41": "redeemResearchAndDevelopmentBal()", +"0c131629": "RDFToken()", +"0c14080b": "bonusSale()", +"0c15b963": "againAttack(address,uint256)", +"0c15f601": "meltTokens(address,uint256)", +"0c16683e": "SCLToken()", +"0c1688f7": "IstriumToken(address,address)", +"0c1754f0": "BitcoinXToken()", +"0c17d023": "dungeonTokenContract()", +"0c17d42c": "setAlpha(uint256)", +"0c1838e9": "importAmountForAddresses(uint256[],address[])", +"0c18e1c9": "balanceInSpecificTranche(uint256)", +"0c1925f3": "stock(string,string,uint256,string)", +"0c192fe5": "RBCToken()", +"0c195d99": "totalAllocatedTokens()", +"0c196a74": "getInterestRate(uint256)", +"0c19f80e": "checkReferral(address)", +"0c1a8b05": "toSPool(uint256)", +"0c1a972e": "newAccount(string,bytes)", +"0c1b33d2": "setRemainingSupply(uint256)", +"0c1be377": "removeSupport(address,address)", +"0c1c0974": "littPoolIDExists(uint256)", +"0c1c3c14": "registerNameXID(string)", +"0c1c972a": "startPublicSale()", +"0c1ca1ba": "withdrawOwnerEth()", +"0c1cd8cd": "endPvtSale()", +"0c1d4af7": "LogTokenAssigned(address,address)", +"0c1db532": "getPI_edit_28()", +"0c1e3fd4": "submitWithdrawTransaction(address,uint256,bytes)", +"0c1e3fea": "previousState()", +"0c1e517f": "bytes16ToStr(bytes16,bytes16,uint8,uint8)", +"0c1f679f": "WithdrawalTokensAfterDeadLine()", +"0c1fad51": "setSeedSourceA(address)", +"0c1fe4b1": "showTransaction()", +"0c204dbc": "getF()", +"0c2073e4": "LemonSelfDrop2()", +"0c21a2f1": "nextGameMinBlock()", +"0c21e754": "setLLV_edit_9(string)", +"0c237dde": "servusTokensAllocated()", +"0c23cf4b": "buyCardXid(uint256,uint256)", +"0c241b2d": "generateSeedA()", +"0c250dcd": "logUnsigned(bytes32)", +"0c255c94": "max256(uint256,uint256)", +"0c25c6c1": "getBonusUsersCount()", +"0c26a816": "pvpMaxIncentiveCut()", +"0c26ac30": "closeEarlyAdopters()", +"0c26e42e": "getReleaseHashForNameHash(bytes32,uint256)", +"0c270f44": "recleared(address)", +"0c2737d2": "incrementCounters(uint256,uint256)", +"0c27677a": "getCRaddress()", +"0c28e291": "Prout()", +"0c294f51": "getAllCounts()", +"0c29e589": "createMyEntity(uint256,bytes32,bool,uint256,uint256)", +"0c2a48e2": "realitycheck()", +"0c2ab324": "SAN()", +"0c2ad9e3": "battle(uint64,uint64)", +"0c2b14fe": "buyCostume(uint256,uint256)", +"0c2b3eda": "TeacherCoin()", +"0c2b4b85": "addGames(bytes32[],bytes32[])", +"0c2b663c": "SDR22(uint256,string,string)", +"0c2bc34d": "indexOf(uint256[],uint256,bool)", +"0c2c5add": "contribute(address,uint256,uint8,bytes32,bytes32)", +"0c2c81ed": "platformFundingSupply()", +"0c2cb820": "setDebug(bool)", +"0c2d71b1": "docStore()", +"0c2e4bf4": "icoStartAt()", +"0c2ec050": "isCurrentRoundFinishing()", +"0c2edc1c": "setExchangeAddresss(address,address)", +"0c2f6f48": "crowdSalePeriodInit()", +"0c31309e": "getPrivatePurchaserStatus(address)", +"0c316d6a": "DTOToken(address)", +"0c319d80": "BidiumToken(address,address,address,address)", +"0c3257d0": "changeUserClass(address,uint256)", +"0c326330": "_isICO()", +"0c3304d1": "mintMAN()", +"0c333556": "Vault(address[],address,address[],address[])", +"0c340a24": "governor()", +"0c345385": "RenaS()", +"0c34644c": "getInstructor(address,address)", +"0c3499ca": "_setSkills(address,uint256,uint256,uint256)", +"0c34f8a5": "addAddressesToWhitelist(bool,address[])", +"0c367f63": "DAEXToken(address)", +"0c36add8": "issue(uint256,uint256,address,address,uint256,address)", +"0c37348d": "buyPreSaleTokens(address,uint256,uint256,string)", +"0c376ee6": "setPvtTokens(uint256)", +"0c38708b": "get_all_project_information(uint256)", +"0c3890b7": "addThing(string,string,string,bytes32)", +"0c3980ef": "NextRewardHalving()", +"0c3a9658": "MTUV1()", +"0c3b3b70": "Unihorns(uint256,string,string)", +"0c3b7b96": "minTokensToCreate()", +"0c3c450e": "icoHashedPass()", +"0c3c92a3": "finishHardcap()", +"0c3cebfa": "issueTo(bytes32,uint256)", +"0c3d5157": "contractStartTime()", +"0c3dbf43": "removeMarket()", +"0c3dfa0e": "SLoader()", +"0c3e2d2d": "getTotalFundsRaised()", +"0c3e3c58": "getAdministerList()", +"0c3e4004": "GraceCoin()", +"0c3e564a": "airDeliverMulti(address[],uint256)", +"0c3f08c6": "newGame(uint8,string,string,bytes32,uint256)", +"0c3f0cac": "getLastPlayer(string)", +"0c3f1f14": "updateSupply()", +"0c3f64bf": "isDev(address)", +"0c3f6acf": "currentState()", +"0c402ed8": "confirmMinting(uint256)", +"0c424284": "setWhitelistStatus(address,bool)", +"0c4326a0": "getMajorMinorPatch(bytes32)", +"0c432c8d": "calcJadeReceived(uint256,uint256)", +"0c432f1f": "handleLastRef(address)", +"0c433edf": "receiptUsed(address,address,uint256)", +"0c437aa7": "setMandateInBlocks(uint256)", +"0c44ba40": "getMyTicketAddresses(address)", +"0c45361f": "creators_count()", +"0c45453c": "_feed(uint256,bytes32)", +"0c45e8d7": "roomsAvailable(string,uint256[])", +"0c4641d3": "BJCToken()", +"0c46fc92": "deliverLastMilestone(bytes32)", +"0c486a96": "requestPayment(uint256,uint256)", +"0c486c00": "CNRToken()", +"0c48ae9e": "createAdSlot(string,uint256,uint256,uint256[])", +"0c48c6bd": "getBonusMultiplierAt(uint256)", +"0c48e582": "updateVendor(address,address)", +"0c497094": "createAngel(uint8)", +"0c49c0a2": "MIN_CONTRIBUTION_AMOUNT()", +"0c49c36c": "sayHi()", +"0c4a3338": "CheckTime(uint256)", +"0c4a5153": "commitStageActive(uint256)", +"0c4a8d94": "STAGE_3_FINISH()", +"0c4a9869": "unregisterContract(bytes32)", +"0c4ada17": "cards_gold(uint256)", +"0c4ae1ca": "cancelBooking(address,address)", +"0c4bfa94": "left13(uint256)", +"0c4c4285": "setHash(bytes32)", +"0c4d6bdf": "EarlyBirdsFinalized(uint256)", +"0c4dd1d9": "totalUsdAmount()", +"0c4ecab4": "confirmations(bytes32,address)", +"0c4f65bd": "getOwnerAddress()", +"0c4f8f6f": "regularTransfer(bytes32,bytes32)", +"0c50b116": "BTHPoint()", +"0c51015d": "adjustTap(uint256)", +"0c51171d": "getTokensSold(address,bytes32)", +"0c516283": "freezeHybridizationsCount(uint256)", +"0c5241fa": "LOL6()", +"0c525571": "arraySum(uint16[])", +"0c52780d": "unCertifyDelegate(address)", +"0c52bb4c": "auditorsList(uint256)", +"0c547097": "goldenTicketOwner()", +"0c549dd9": "getCET6ByAddr(address)", +"0c54ce44": "ProofOfRipple()", +"0c5532bf": "singleValueAirdrop(address,address,address[],uint256)", +"0c55699c": "x()", +"0c5589b8": "DecreaseWithdrawalAmount(uint256)", +"0c559757": "setHouseEdge(uint8)", +"0c55d925": "deleteBytesValue(bytes32)", +"0c55d9a4": "confirmStaking()", +"0c55f818": "CTU_ADDRESS()", +"0c560c64": "USD(uint256)", +"0c58062b": "teamLockPeriodInSec()", +"0c584803": "SGTMock(address)", +"0c58bcb8": "EthLendToken(address,address,address)", +"0c58e23c": "ZClassicGold()", +"0c59b556": "viewCoinsKarmaBySymbol(string)", +"0c59c570": "CashTron()", +"0c5a534e": "allowBuying()", +"0c5a97a6": "getProviderName(uint256)", +"0c5c2ca3": "getIndexName(bytes)", +"0c5ce593": "open(address,bytes32,uint256,uint256)", +"0c5d919d": "totalsuplly()", +"0c5e3f11": "nestedFirstManyToSome(uint256,uint256)", +"0c5ebb1a": "userForceGameEnd(uint8,uint256,uint256,int256,uint256,uint256)", +"0c5ed9d5": "REB()", +"0c5f9a60": "allocationFee(bytes32)", +"0c5fd414": "preOrder(address,address,address,address,bytes32,uint256,uint256,uint256)", +"0c5fd4b2": "minttoken(address,uint256)", +"0c60223e": "withdrawAuctionBalance(address)", +"0c61257e": "WartegToken()", +"0c620494": "changeAllowTransferWallet(address)", +"0c62b816": "minableSupply()", +"0c62bfbb": "_calcNextRate()", +"0c636091": "adoptAxies(uint256,uint256,uint256,address)", +"0c646fbd": "get_entity_count()", +"0c64a739": "price_exponent()", +"0c64a7f2": "remainingTime(uint256)", +"0c657eb0": "bankroll()", +"0c65829b": "_setSkills(address,uint256,uint256[],uint256[])", +"0c65e229": "startICOPhaseThree()", +"0c662943": "_lockup(address,uint256,uint256)", +"0c66adf8": "getCurrentRoundInfo(uint256)", +"0c68194f": "getCourseIdOfStudent(address)", +"0c68a104": "fundingMaxInEth()", +"0c68ba21": "isGuardian(address)", +"0c68f917": "cancelOfferingProposal(address,uint256)", +"0c693110": "getVoted(address,uint256)", +"0c6940ea": "addMeToAllGames()", +"0c69b189": "claimCrystal()", +"0c6a3161": "RESERVE_ADDRESS()", +"0c6a5be4": "Arexium(uint256,string,uint8,string)", +"0c6a62dd": "updateCurator(address)", +"0c6b1324": "Etherboard()", +"0c6bfdd0": "openTheRabbitHole()", +"0c6cbf92": "lastPayOut()", +"0c6cd73a": "issueCard(uint256,uint256,uint256)", +"0c6d1efb": "releaseEachTokens()", +"0c6ddc0d": "getUserAllowance(address)", +"0c6de527": "addToBonusSeed()", +"0c6df351": "doBondBonusTransfer(address,address)", +"0c6e29e3": "subscribeToPool()", +"0c6fc9b2": "processTakerOrder(uint256,uint256,uint256,uint256,bool,address,address,bytes32)", +"0c6fe674": "getPresaleTotal(uint256)", +"0c700183": "listGlobalAuditDocuments(uint256,bool)", +"0c7013c1": "send(address,address[],address,uint256[])", +"0c70f055": "getRandomRarity(uint32,uint256)", +"0c71614c": "divsforall()", +"0c717036": "colourID(uint8,uint8,uint8)", +"0c71b48c": "BTCTransactions(bytes16)", +"0c72bf39": "ArtToujourToken()", +"0c72fe56": "_payBidAllocationFee(bytes32)", +"0c736e04": "refundForValidPartners(uint256)", +"0c73a392": "getLogSize()", +"0c740736": "addPicture(string,uint32,uint32,uint32,uint32,string,string,string)", +"0c7452b8": "viewPetitionSignerWithAddress(address,uint256)", +"0c74be3d": "TIME_TO_MAKE_TOMATOES()", +"0c7516fd": "numPurse()", +"0c754b9f": "BuyOptions(address,uint256,string,uint8)", +"0c75941a": "setContractMessage(string)", +"0c76316d": "withdrawPot()", +"0c763fef": "showContractMsgSender(address)", +"0c77a697": "claimFounders()", +"0c77b44e": "setLedger(address,address)", +"0c790369": "maxMessageChars()", +"0c798c81": "SCCToken(address,address)", +"0c79af3d": "witrhdraw(uint256)", +"0c79e3e6": "setCrydrStorage(address)", +"0c7ac7b6": "arbitratorExtraData()", +"0c7b5616": "Time_Start_Crowdsale()", +"0c7befb2": "_tokenLayersExist(uint256)", +"0c7bf731": "pendingRemain()", +"0c7ca61e": "ArrAccountIsFrozenByDate(uint256)", +"0c7caded": "destroyMe()", +"0c7d8c20": "_register(bytes32,address)", +"0c7de59d": "edit(address,bytes,bool)", +"0c7e30b7": "getUsdCentsFromWei(uint256)", +"0c7eca6e": "setCurs(uint8)", +"0c7ef39b": "HUBTToken()", +"0c7f076e": "advisoryReserveTokensDistributed()", +"0c7f27ba": "COE()", +"0c8004b5": "buyTokens_Address(address,uint256,bytes8)", +"0c80d6dd": "view_last_result(address,address)", +"0c8114d3": "_forwardFunds(address,uint256)", +"0c8135a7": "getTeamOwner(uint256)", +"0c8209b6": "manualWithdrawEtherAll()", +"0c823abe": "importedTokens()", +"0c828c42": "getTxIndex(uint256)", +"0c82b942": "whitelistRemove(address[])", +"0c832ef0": "restoreOwner()", +"0c8367fb": "HALAL()", +"0c83700a": "divCutPool()", +"0c8496cc": "getReturnByPath(address[],uint256)", +"0c857b25": "getLoveLock(uint64)", +"0c85b18c": "SetBuildingData(address,uint256,uint256,uint256,uint256,uint256)", +"0c85feea": "matchOrders(uint64,uint64)", +"0c861d4b": "Aeron()", +"0c87355e": "BANCOR_CONVERTER_UPGRADER()", +"0c875c8d": "Withdrawn(uint256,uint256)", +"0c898482": "getShare(address,address)", +"0c89a0df": "transferTokens(address)", +"0c89b766": "randomSource()", +"0c89ef35": "hasEnoughAllowance(address,address,uint256)", +"0c89ef67": "PXMCCoin(uint256,string,uint8,string)", +"0c8a611f": "getInvestorsETH(address)", +"0c8ac6f7": "transferAnyTokens(address,address,uint256)", +"0c8b29ae": "hodlTillBlock()", +"0c8b494d": "RadarSpeedChain()", +"0c8bae5c": "sellTokensForBtc(string,address,uint256,uint256)", +"0c8bd2c5": "Issue(address,address,address,address)", +"0c8bdcfa": "GetPolicy(address,string,string)", +"0c8c0392": "listAsset(uint256,uint256,uint256,uint256)", +"0c8c085f": "getNumContents()", +"0c8dfeda": "maxLinkedWalletCount()", +"0c8e3166": "assignAtheniansToBattle(uint256)", +"0c8e9977": "whitelist_pool(address,address,uint256)", +"0c8f167e": "TOKENS_SOLD()", +"0c8f78fb": "setGasAmount(uint256)", +"0c9066dd": "getZodiac(uint256)", +"0c90da51": "End2()", +"0c915c74": "releaseWithStage(address,address)", +"0c91af81": "IGTUSD()", +"0c91e624": "Winner(string,address)", +"0c91f2d0": "rewardForWork(address,address,uint256,bool)", +"0c92b17b": "checkBurnTokens()", +"0c932e77": "ritualFee()", +"0c938c3f": "changeSubscriptionFee(uint256)", +"0c939ae1": "KYROInv()", +"0c93c981": "playBatch(uint256[],uint256[])", +"0c96526b": "getRateUsd()", +"0c96c4ea": "triggerRelease()", +"0c97200a": "getLoansCount()", +"0c975447": "lowBonusRate()", +"0c976ace": "existenceApproveTest(address)", +"0c97bb77": "curConfig()", +"0c98048d": "transferFromAdmin(address,uint256)", +"0c981d58": "closeGame(address)", +"0c987501": "EtheraffleFreeLOT(address,uint256)", +"0c990004": "createToken(uint256,address,bytes32,uint256,uint256,bytes32)", +"0c99d807": "_isValidBlock(uint8)", +"0c9a6c24": "getUserCoinMarketValue(uint16,uint256)", +"0c9b016c": "expItemClass()", +"0c9b5777": "Erc20()", +"0c9bb7d2": "denyByPassword(bytes8,bytes)", +"0c9bc2c0": "calculateNonVestedTokens(uint256,uint256,uint256,uint256,uint256)", +"0c9be46d": "setCharityAddress(address)", +"0c9c1c58": "setAltFundAddress(address)", +"0c9cbfee": "moveProduct(address,address,uint256)", +"0c9daf45": "vcxWallet()", +"0c9dc2b8": "checkEthFundDepositAddress()", +"0c9dd381": "RewardTransfered(uint256,address,uint256,uint256,uint256)", +"0c9f6ed8": "ZEXCoin()", +"0c9f88c0": "Zignal()", +"0c9f980f": "isCSO(address)", +"0c9fcec9": "setApproval(address,address,uint256)", +"0c9fd581": "assertTrue(bool)", +"0c9fe5eb": "PIXEL_COUNT()", +"0c9ff620": "listINF()", +"0ca09e1e": "XoudCoin()", +"0ca1988b": "getnum(address)", +"0ca1c5c9": "getTotalMinted()", +"0ca2bda2": "isAllowedTransferDuringICO()", +"0ca2f2fd": "MultiBonusCrowdsaleMock()", +"0ca35682": "recover(uint256)", +"0ca35c22": "setScouponTransferCost(uint256)", +"0ca36263": "exit(bytes32)", +"0ca40865": "capRound2()", +"0ca413a4": "getDateRanges()", +"0ca435a6": "grabBooty()", +"0ca4f838": "BetCommunity()", +"0ca5bdb4": "novaBurn()", +"0ca5f72f": "rewardPercentageDecimals()", +"0ca621a8": "updateSplitandEmit()", +"0ca6afa7": "EtfToken()", +"0ca6d310": "setNamePiture(uint256,string)", +"0ca72e82": "testGetLawyerCount()", +"0ca7395f": "returnFund(address,uint256)", +"0ca78923": "updateConnector(address,uint32,bool,uint256)", +"0ca8fe1e": "burnCoins()", +"0ca9183c": "icoFundingRatePredictionBonusInPercentage()", +"0ca97903": "emergency(address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"0ca9897c": "citePaper(address)", +"0ca99ca8": "hardCapInWei()", +"0ca9c14e": "PryvCn()", +"0caa1d84": "isUserGranted(address,string)", +"0caa5d91": "UserDestroy(address,address)", +"0caa8605": "getStage3End()", +"0caaa284": "PresaleClosed(uint256,uint256)", +"0caab83a": "poolBounty()", +"0cab068c": "isVestingRevoked()", +"0cac54ed": "claimTransfer(address,address)", +"0cacbf21": "getSponsorshipsSortedByAmount(address,uint256)", +"0cadc5b3": "deliverBonus()", +"0cae3cbb": "checkStageCondition()", +"0caeb350": "upgradeValue(uint256)", +"0caee2ca": "calculatePayout(uint256,uint256,uint256)", +"0caf10b2": "GreenEnergy()", +"0caf9d39": "testFailTooManyMembers()", +"0cafabd8": "getTPrice()", +"0cafef9c": "Clen(uint256,string,uint8,string)", +"0cb08716": "airdropDynamic(address[],uint256[])", +"0cb08e3b": "_finalizeICO()", +"0cb09309": "ArysumToken()", +"0cb0a44b": "enableInvestment()", +"0cb0c7f0": "forceOwnerChange(address)", +"0cb1982b": "updateNAV(uint256)", +"0cb1d243": "ICT(uint256,string,string)", +"0cb1d6b4": "fourthWeek()", +"0cb296ae": "Gemstones()", +"0cb335c4": "setMissedVerificationSlashAmount(uint256)", +"0cb5f653": "newUser(address)", +"0cb60443": "minRate()", +"0cb61d7a": "setCurrentBonusPercent(uint256)", +"0cb6aaf1": "keys(uint256)", +"0cb6b577": "TOKEN_DECIMAL()", +"0cb743a5": "buyOld(uint256)", +"0cb749b6": "FutureBlockCall(address,uint256,uint8,address,bytes,bytes,uint256,uint256,uint16,uint256,uint256)", +"0cb795e8": "getDividendInfo(uint256)", +"0cb7eb4c": "getReleaseTime(address)", +"0cb812d3": "openWithoutCounterparty(address[4],uint256[3],uint32[4])", +"0cb9208a": "JorgeCoin()", +"0cb97f57": "advisorsTotal()", +"0cb9da1b": "RedemptionContract(address,uint256)", +"0cb9ec43": "TemperatureMeasurementB(address,uint32,uint64)", +"0cb9ee4b": "getAllPlayerObjectLen()", +"0cba5853": "angelCollection(uint64)", +"0cba6d27": "getSocialAccountsLength()", +"0cbb0f83": "entryCount()", +"0cbc90d8": "makeProposal(address,uint8,uint256,address)", +"0cbc9ce7": "sendToToteLiquidatorWallet()", +"0cbe1eb8": "USDDOWNLOADPRICE()", +"0cbf0601": "numMessagesSigned(bytes32)", +"0cbf54c8": "auctionDuration()", +"0cbf711a": "LogClosed()", +"0cbf7ec0": "startPrivateIco()", +"0cbfe979": "updatePrivateSaleWithMonthlyLockupByIndex(address,uint256,uint256,uint256)", +"0cc00bc9": "MarketPlace(address,uint256)", +"0cc03e7a": "claimShare(uint256)", +"0cc04b55": "adminUnregister(string)", +"0cc06221": "getUserAccountInfo(address)", +"0cc10550": "BIToken()", +"0cc2001c": "TastToken()", +"0cc20a0c": "getHoldEarningsInRound(address,uint256)", +"0cc3ad77": "verdictExecuted(address,bool,uint256)", +"0cc3db97": "_createToken(uint256,uint256,uint256,uint256,address)", +"0cc4330c": "visit()", +"0cc4fb87": "changeGeneralSaleEndDate(uint256)", +"0cc6373f": "tokenExchangeRateMile3()", +"0cc69a27": "Marketplace(address,address)", +"0cc69b5b": "NOKIA()", +"0cc7086b": "canBurnUtility(address,uint256)", +"0cc73b6a": "BLOCKS_PER_ROUND()", +"0cc79a85": "getEnded()", +"0cc8299b": "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww()", +"0cc87b1c": "soldPreSaleTokens()", +"0cc88021": "hasPlayer(address)", +"0cc8c9af": "getOrCreateNextFeeWindow()", +"0cc91bb9": "setEarlyParicipantWhitelist(address,bool,uint256,uint256)", +"0cc966fa": "buy(address,address,uint256,uint256,uint256,bool)", +"0ccc642e": "emergencyFlagAndHiddenCap()", +"0ccc68bb": "_create_mineral(bytes32,address,uint256,uint256)", +"0ccc88b1": "BurnupGameBase()", +"0cccfc58": "auctionPeriod()", +"0ccde0b1": "initialSupplyPerAddress()", +"0ccec396": "getNumReleases()", +"0ccf30f1": "setRentTime(uint256)", +"0ccf5af4": "_prizeAmount()", +"0ccfdd8b": "potentiallyCirculatingPop()", +"0cd0563b": "broadcast(string)", +"0cd0c3d7": "resetRental()", +"0cd1812f": "sendFundsTo(address,uint256)", +"0cd205bb": "CrowdsaleContract(uint256,uint256,address,uint256,uint256)", +"0cd28e9d": "getRoundPlayerList(uint256)", +"0cd2b327": "approveSponsorableJob(address,uint256,address)", +"0cd30783": "getcompany(uint256)", +"0cd3c7f7": "ransom()", +"0cd3fad2": "_base64decode(bytes)", +"0cd4700a": "NT()", +"0cd522da": "returnStartBlock(uint256)", +"0cd55abf": "nextNonce(address)", +"0cd5ea83": "earlyBirdDuration()", +"0cd641b2": "tokenForComunity()", +"0cd64ad0": "changeEthDailyLimit(uint256)", +"0cd6ceb3": "Boldman()", +"0cd74cd9": "etherWallet()", +"0cd7d0f2": "DestlerDoubloons()", +"0cd865ec": "recover(address)", +"0cd8dd0b": "setXPTokenAddress(address)", +"0cd9aec6": "testFailTrustWhenStopped()", +"0cd9f271": "buy10()", +"0cda88ce": "mul256By256(uint256,uint256)", +"0cdbf3dd": "setReferralsMap(address[],address[])", +"0cdc92ea": "canBeCanceled(uint256)", +"0cdd4234": "mainAddress()", +"0cddb437": "CNDTPrivate()", +"0cde0e7d": "solve(int256,int256,int256,int256)", +"0cde6009": "KinTokenSale(address,uint256)", +"0cded5f0": "migratePool()", +"0ce08a49": "refundAmount(uint256)", +"0ce10cbd": "changeOwnerToZero()", +"0ce11049": "setBCoinContractAddress(address,address)", +"0ce11a77": "registrarAddress()", +"0ce11ded": "updateMthEthRate(uint256)", +"0ce18afc": "TabToken()", +"0ce1f4b7": "toB32(bytes,uint256,bytes)", +"0ce3151c": "personUpdateRelation(uint256,string)", +"0ce38276": "setColorYellow()", +"0ce3d998": "fetchCancelledOrdersForMerchant()", +"0ce46c43": "scheduleCall(address,bytes4,bytes,uint16,uint8,uint256[5])", +"0ce4c990": "minRevenueToDeliver()", +"0ce4e104": "bnbTokenWallet()", +"0ce52e25": "time_on_trademarket()", +"0ce5a098": "getWordCount()", +"0ce64868": "setPendingValue(uint256,string)", +"0ce6bd26": "EtherCarbon()", +"0ce71356": "canPropose(address,uint256)", +"0ce84479": "Wallet10()", +"0ce8544a": "Ethlyte()", +"0ce90ec2": "levelUp(uint256)", +"0ce96e71": "removeAddressFromQueue(uint256)", +"0cea64a0": "callSomeFunctionViaOuter()", +"0cea7534": "withdrawMargin(uint256)", +"0ceaeb5a": "ecosystemSupplyRemaining()", +"0cec1ecd": "getPixelDistributor()", +"0cecf728": "ListingCancelled(bytes5,uint256)", +"0ced5b02": "buyTokens(uint128)", +"0cedd0bd": "_getDestinationPartition(bytes32,bytes)", +"0cee1725": "withdrawFund(uint256)", +"0cee22e9": "testSetBalanceSetsSupply()", +"0cef7d5a": "WBW(uint256,string,uint8,string)", +"0cef9a27": "add2MarketPlace(uint256,uint256,uint256)", +"0cefa4de": "minPersonalCap()", +"0ceff204": "withdrawRevenue(uint256)", +"0cf01051": "startFunding()", +"0cf039e3": "setBuyRequestLimitInterval(uint256)", +"0cf044ee": "enable_exploration()", +"0cf1d050": "withdrawAllToExchange(address,uint256)", +"0cf1dafc": "refreshRate(uint256)", +"0cf1dd6e": "BattleOfThermopylae(uint256,uint256,uint8,address,address,address,address)", +"0cf20cc9": "withdrawBalance(address,uint256)", +"0cf3da77": "ELCToken()", +"0cf45ba5": "updateFirstDuel2(uint256)", +"0cf56f3f": "addBetWithReferrer(uint256,address,address)", +"0cf59cc6": "changeScientistForElement(uint256,uint256)", +"0cf6d879": "getARInvTable()", +"0cf7193d": "Tradex()", +"0cf79e0a": "transfer(uint256,uint256)", +"0cf7f3b5": "changePrice(uint256,uint64)", +"0cf820e0": "lengthOfRecord(uint256)", +"0cf838e1": "Test2(address)", +"0cf85c4c": "stateMask()", +"0cf868bf": "_airdropLimit()", +"0cf8bcab": "setItemTransferable(uint256,bool)", +"0cf935c0": "getDegreeCount()", +"0cf93a60": "ICOweek1End()", +"0cf94990": "checkMD(address)", +"0cf94cda": "calcInvitationAmount(uint256)", +"0cfa0318": "approveBurn(address,uint256)", +"0cfa1d12": "rndExtra_()", +"0cfa8af4": "deleteCandidateByStage(address,uint256)", +"0cfb37a7": "revealProofOfPerfBlock(uint32,bytes32,bytes32,bytes16,bytes32,bytes16,bytes32,bytes32)", +"0cfbf6c6": "lockConfiguration()", +"0cfccc83": "SUPPLY_CAP()", +"0cfd0a0d": "INDI()", +"0cfd2c6a": "RecreationCultureMassMediaCoin()", +"0cfed2a2": "pauseSale(bool)", +"0cff4058": "AacharyaToken()", +"0d009297": "initOwner(address)", +"0d011088": "convert2(string,string,address)", +"0d015e4b": "get_depositLock()", +"0d01c1ae": "set_Area_name(string)", +"0d02369b": "takeSellOrder(address,uint256,uint256,address)", +"0d024f83": "DownStats(uint256,uint256,uint256,uint256)", +"0d02e05c": "setBuyStatus(bool)", +"0d032623": "getRemainingCompanyTokensAllocation()", +"0d043a60": "getRewardsWithdrawn(uint32,address,address)", +"0d047c5b": "NewFounderAddress(address,address)", +"0d047d49": "getFashionsAttrs(uint256[])", +"0d051c52": "clearCrowdsaleCloseTimer()", +"0d052f39": "getBurnAdminApproval(address,address)", +"0d055d1e": "sendBill(uint256)", +"0d0567ae": "latestAddress()", +"0d058fe3": "create(uint256,string,address)", +"0d062959": "FXTOKEN(address,uint256,uint256)", +"0d06a2ee": "setBenefeciar(address)", +"0d0a1901": "secondReserveAllocation()", +"0d0a6bf2": "investor_clearRefBonus(address)", +"0d0abf52": "matureBalanceOf(address)", +"0d0b0c74": "loadN(uint8[],uint256,uint256)", +"0d0b86c6": "CryptaurDepository()", +"0d0b8825": "weiPerRtc()", +"0d0bfb2f": "ba2cbor(bytes[])", +"0d0c0c51": "LogParticipation(address,uint256,uint256)", +"0d0c2008": "TwoAndAHalfPonzi()", +"0d0c2c62": "MOTDiscount()", +"0d0c529a": "getacttslen()", +"0d0cd4f4": "allWalletBalances(address)", +"0d0d0554": "ARMYToken()", +"0d0d7dc9": "raiseEvent2()", +"0d0ed6b9": "fetchAllCandidatesByIndex(uint256)", +"0d1017d6": "EnterRentCrowdsale()", +"0d10e842": "weiAmount()", +"0d1118ce": "burnTokens(address,uint256)", +"0d117d16": "chunk1IsAdded()", +"0d11dd70": "currentRefundInvestorsBallot()", +"0d121337": "transferOperatorRole(address)", +"0d126bc4": "getCurso()", +"0d1352cf": "marketAnts()", +"0d13bec6": "SellAcorns(uint256)", +"0d13d85e": "transferMintTokens(address,uint256)", +"0d13ea7d": "BONUS_2_DAYS()", +"0d145d16": "RegisteredPlayer(address,uint256)", +"0d14ed4f": "midgradeOpen()", +"0d157352": "ForkiToken()", +"0d15fd77": "totalVotes()", +"0d16b6ca": "setBTCRate(uint256)", +"0d16cba5": "addMessage(address,address,address,string)", +"0d172a01": "transferTokenTo(address,address,uint256)", +"0d174c24": "setWithdrawer(address)", +"0d17ace0": "currentDiscountPercentage()", +"0d17bc2e": "_disallow()", +"0d17c576": "_deliverBonusTokens(address)", +"0d18952b": "UpdateReleasePrice(uint32,uint256)", +"0d1946df": "MasterToken()", +"0d1a0c62": "setPackSize(uint256)", +"0d1a0d5e": "TokensPurchased(address,uint256,uint256,uint256)", +"0d1a94de": "SeriesCreated(uint256)", +"0d1ce2d2": "activateToken(address)", +"0d1cf200": "muscFund()", +"0d1d38aa": "info(uint256,bytes32)", +"0d1d6ffd": "checkTransferIn(address,uint256)", +"0d1d8d6d": "listTeams()", +"0d1dcd74": "foundersRewardsMinted()", +"0d1edad1": "Start8()", +"0d1ee029": "add(string,int256)", +"0d1efd7d": "getDistrictCode()", +"0d1f3471": "deleteRecord(address)", +"0d1f9bb6": "isBetLocked()", +"0d1fce42": "getBankroll()", +"0d20a889": "getRegistrantId(address)", +"0d213d31": "migrateTo(address,uint256)", +"0d2218d6": "millRaised()", +"0d229be7": "priceTokenWei()", +"0d24317d": "_getTotalHp(int256,int256,int256,int256)", +"0d244d68": "setNotRetractable(bytes32)", +"0d25320c": "distributedAmount()", +"0d2560ee": "addMe()", +"0d25b6f2": "getMonsterName(uint64)", +"0d260b60": "_sendTranche(bytes32,address,address,uint256,bytes,bytes)", +"0d2646d4": "switchNodes()", +"0d26c879": "getTotalFundationTokens()", +"0d271720": "transferFromAdmin(address,address,uint256)", +"0d274929": "getChannelName(uint256)", +"0d27864f": "TokenSwapOver()", +"0d278a8b": "Technology3GCrowdsale(uint256,address,address)", +"0d2806ad": "TOKEN_PRICE_D()", +"0d285d8c": "ETH_TO_QST_TOKEN_RATE()", +"0d28f8d1": "importIsland(bytes32,address[3],uint256[7],uint256[8])", +"0d290220": "getAllCardsType()", +"0d290deb": "SumToken()", +"0d294629": "splitProfits()", +"0d298318": "heapSort(uint128[])", +"0d2a1fa7": "mintAfterIcoPeriod()", +"0d2a246e": "tokenDividend()", +"0d2a25bb": "tentimes()", +"0d2bd1ac": "changeFact(string)", +"0d2be064": "buyToken(address,uint256,uint256,bool)", +"0d2cbe13": "settleBet(uint256,uint256)", +"0d2cc54a": "rebirthAxie(uint256,uint256)", +"0d2ce376": "submitVote(bytes32,bytes32)", +"0d2e017b": "getGamers()", +"0d2e677a": "getHotels()", +"0d2f2971": "authorized_recordFailedOldOwnerTransfer(address)", +"0d2f99d0": "removeChild(address,bytes32,bytes32)", +"0d2fc226": "createTokenUri(uint8,uint8,uint64,uint64,uint64)", +"0d3016bf": "_getIPFSHash(address,bytes32)", +"0d301c75": "removeFromGoldList(address)", +"0d30afb0": "CONFIG_DICE_SIDES()", +"0d310998": "DataContacts(address,address,address,address)", +"0d3167da": "BarmatzTestToken()", +"0d325b29": "setTokenApproval(uint256,address,bool)", +"0d329d14": "ICOtotalSupply()", +"0d334130": "m_callbackGas()", +"0d33cfa0": "meltAddress(address)", +"0d342cab": "autoTransfer()", +"0d3471f9": "sumHardCapICOStage5()", +"0d349aea": "updatePaid(address,address,uint256)", +"0d35f64c": "teamReservedBalanceOf(address)", +"0d3665b5": "IloveYou()", +"0d368fee": "deverify(address)", +"0d36c02c": "BACKUP_TWO()", +"0d3737b0": "mintAgent()", +"0d37ac7f": "toggleFunding(bool)", +"0d381a28": "tokensByOwner(address)", +"0d381cad": "addJobContract(uint256,string,bool)", +"0d38a077": "affRegister()", +"0d38ea48": "ethreceived()", +"0d38ffcd": "donationRate()", +"0d392cd9": "updateWhitelist(address,bool)", +"0d39820c": "preInvestStart()", +"0d39968c": "funderSmartToken()", +"0d3a557e": "_allowance(uint256,uint256,bytes32)", +"0d3ade73": "adjustNextTranche(uint8,uint8)", +"0d3b7901": "withdrawBonus(address[])", +"0d3c1b45": "addLayer(address,uint256,string,string)", +"0d3c7519": "distribute_NRT()", +"0d3cb409": "getAdjudicatorAddress()", +"0d3e4044": "binary_search(uint256,bytes32)", +"0d3f5cb5": "findCliPendTAndSetPrfm(address,address)", +"0d3fbdf8": "getPI_edit_8()", +"0d40022a": "_buildShip(uint16,uint16,uint8,bytes32)", +"0d40e8d6": "supportHarvestQuorum()", +"0d41117f": "calculateFee(uint256,uint256,uint256,bytes32,bool,bool)", +"0d42240a": "isWhiteListedAddress(address)", +"0d425559": "ownerSetMiningProfit(uint256)", +"0d441f8c": "totalNacInPool()", +"0d44cf79": "lastDelayedSetStake()", +"0d465263": "assessFees()", +"0d469483": "fiatToWei(uint256)", +"0d46f410": "getProposalParent(bytes32,bytes32)", +"0d46f877": "irucoin()", +"0d46f91a": "kycCertifier()", +"0d472f5f": "airdrop_byadmin(address,uint256)", +"0d4766a3": "STARTING_SHITCLONE()", +"0d480993": "getFoundersTokens(uint256)", +"0d483442": "NO()", +"0d4891ad": "signalDoneDistributing(uint256)", +"0d48a771": "claim(address,uint256,uint256,uint8,bytes32,bytes32)", +"0d48e8d0": "doBalance()", +"0d494a05": "isICOUp()", +"0d498b1e": "setTokenSPUsdCentPrice(uint256)", +"0d49a0f0": "addProofOfPerfBlock(uint32,bytes32,bytes32,bytes32,bytes32)", +"0d4a464f": "_newHorseShoe(uint256,uint256,uint256,bool,bool,address)", +"0d4a690a": "KopiToken()", +"0d4a8b3b": "wadmin_freezeAccount(address,bool)", +"0d4b8208": "convertCarbonDollar(address,uint256)", +"0d4c8f62": "setPayouts(uint256,uint256,uint256)", +"0d4d1513": "mint(address,uint256,address)", +"0d4d389f": "POOL_EDIT_4()", +"0d4e03e1": "changeTargetWallet(address)", +"0d4ea316": "buyLandWithTokens(bytes32,int256[],int256[])", +"0d4faa05": "acheter()", +"0d50266c": "TEAM_PERCENT_GZE()", +"0d505d54": "GDX()", +"0d5260e7": "setGasReserve(uint256)", +"0d5269ab": "distributeInviteReward(uint256,uint256,uint256,uint256,uint256)", +"0d5302c4": "DEVCLASS_EXTRACTION_BASE()", +"0d533e99": "UnlockEvent(address)", +"0d53b406": "recordEscrowOnBid(uint64,uint64)", +"0d543862": "sigBountyProgramEDUSupply()", +"0d54c49e": "processEndGame(uint256)", +"0d550b75": "allowance(uint256,address,address)", +"0d55af64": "AFRIHUBcredits()", +"0d5624b3": "preSaleStart()", +"0d567f38": "setStartRound(uint256)", +"0d571742": "setGenesisAddress(address,uint256)", +"0d57a47f": "setTokenCountFromPreIco(uint256)", +"0d582f13": "addOwnerWithThreshold(address,uint256)", +"0d5866e2": "setDeprecated(address)", +"0d59b564": "submitTransaction(address,uint256,bytes,uint256)", +"0d59c736": "Gavsino()", +"0d5a13f4": "BitdealCoin(address)", +"0d5a5c32": "CROWDSALE_OPENING_TIME()", +"0d5a621b": "childContractByIndex(uint256,uint256)", +"0d5be2df": "ballotLog(address,uint256)", +"0d5d6f7a": "BitEyeExchange(address)", +"0d5defa4": "escrowAddress()", +"0d5dfdd8": "debugVal4()", +"0d5e1e82": "redeemReputation(bytes32,address)", +"0d5e4c8d": "initialPrizeWeiValue()", +"0d5e87f4": "calcTokenAmountByZWC(address,address,uint256)", +"0d5f8f17": "setXWinContractAddress(address)", +"0d5fced3": "CHAJING()", +"0d605c4a": "NUM_RESERVED_AXIE()", +"0d60889c": "Thanks(address,address,uint8,uint8)", +"0d609939": "setParameters(uint256,uint256,uint256,uint256,address,address)", +"0d60e231": "migrationRewardTotal()", +"0d6103a1": "unsoldTokensBack()", +"0d616d20": "withdrawContribution()", +"0d61a4ff": "HUT34_VEST_ADDR()", +"0d61b519": "executeProposal(uint256)", +"0d61cd5d": "mintICD(address,uint256)", +"0d623e10": "oracleType()", +"0d63e87d": "setIntervalTime(uint256)", +"0d63fdbe": "parseOutputScript(bytes,uint256,uint256)", +"0d6495ef": "View_MediatedTransaction_Status(uint256)", +"0d649f90": "getVisaIdentifier(address,uint256,uint256)", +"0d65d50b": "TIER3()", +"0d65e3e7": "IS_SIGNATORY(address)", +"0d66343c": "getPaintingOwner(uint256)", +"0d668087": "lockTime()", +"0d668818": "dataContract()", +"0d66a3ec": "ApisCrowdSale(uint256,uint256,uint256,address,address,address,address)", +"0d679531": "soldedSupply()", +"0d6798e2": "userFinalize()", +"0d67d01b": "GradeBook()", +"0d68ddeb": "setBUUU(bytes32,uint256,uint256,uint256)", +"0d694114": "addressPremineBounty()", +"0d6a5c75": "ComputeHarvest()", +"0d6c66a1": "safesub(uint256,uint256)", +"0d6d1437": "changeMemberName(address,string)", +"0d6d1e64": "EricToken(uint256,string,uint8,string)", +"0d6dcab3": "getProofOfStakeReward(address)", +"0d6e548e": "getAgentsNum()", +"0d6ec16f": "isMyDrone(uint256)", +"0d6f6f0b": "summTeam()", +"0d6f72aa": "DLXV()", +"0d6f7ca3": "maxgas()", +"0d6f849b": "minAmountPresale()", +"0d6f8563": "withdrawWei(uint256)", +"0d6fef5f": "MoonBook()", +"0d70e29c": "isAuthorizedToTransfer(address,address)", +"0d70e7e3": "getRate(uint256,uint256)", +"0d71212f": "robotLiabilityLib()", +"0d7128d8": "setGoalETH(uint256)", +"0d7172f4": "canMakeUnrefusableOffer()", +"0d71aba5": "getRace(uint256)", +"0d729abc": "setStopDay(uint256)", +"0d72d57f": "backendAddress()", +"0d730a1a": "updateMerchant(string,string)", +"0d73a44a": "_collectFee(address,uint256)", +"0d73c10e": "totalWeiRaisedDuringICO2()", +"0d7519a9": "initialTokenSupply(address,uint256,bool)", +"0d7548f7": "seeEthPrice()", +"0d75d68e": "_canDownload(bytes32,uint8,bytes32,bytes32)", +"0d75f659": "TemperatureMeasurementA2(address,int8,int8,uint16,string)", +"0d7714e2": "PiedPiperCoin(uint256,string,uint8,string)", +"0d78573e": "releaseManager()", +"0d78bc17": "importCustomer(address,address,uint256)", +"0d7982ad": "lockMinting()", +"0d799734": "setMinSet(uint256)", +"0d7a90c8": "maxSeedStage()", +"0d7af726": "addGame(address,string,string)", +"0d7b4ac4": "setLLV_edit_27(string)", +"0d7b69e2": "fiatCurrency()", +"0d7bca61": "withdrawSuccessful(bytes32)", +"0d7bf53c": "getBlockHash(uint256,uint256)", +"0d7c064f": "setMinStandingBalance(uint256)", +"0d7cffb0": "PrizePool()", +"0d7dc36a": "setManagement(address,address,bool)", +"0d7eaa8b": "FudgeCucks()", +"0d7f7eff": "TokenDestructible()", +"0d8053ca": "getBetLength()", +"0d806df7": "setXaurCoined(uint256)", +"0d80b84b": "crowdSaleTime()", +"0d80bf64": "whitelist(string)", +"0d80fcdb": "distributeBonuses(uint256)", +"0d81057e": "multiplierOnWin()", +"0d81a570": "migrationDone()", +"0d826264": "phaseThreeLimit()", +"0d82cb3a": "setHeir(address,uint8,uint256)", +"0d830190": "getCharacterInfo(uint256)", +"0d831d09": "forwardUpdateFeesTo()", +"0d83304c": "getSales()", +"0d83a371": "unprocessedQueryBytes32s(uint256)", +"0d83dd8a": "recordNewAddress(address)", +"0d854646": "magic()", +"0d85ef17": "ZombiewCreator()", +"0d8693bd": "sBitcoin()", +"0d869ada": "immortals()", +"0d873644": "addToken(uint256,uint256,uint256,uint256,bytes)", +"0d87a7c0": "WLBDrawsDB()", +"0d8814ae": "cardOwnerOf(uint256)", +"0d882848": "BTNSold()", +"0d883bdf": "generateN()", +"0d88fb04": "removePatternUserIndex(address,bytes32)", +"0d895ee1": "setBurner(address,bool)", +"0d8b2708": "functionFour(uint256,uint256,uint256,uint256)", +"0d8b5fa2": "testControllerValidTransferFrom()", +"0d8b70bf": "grantAccessMint(address,address)", +"0d8c1a62": "toogleActive()", +"0d8c1c17": "read_supply()", +"0d8c2f67": "_logSendWebGiftAndSendEther(address,uint256)", +"0d8c3c2f": "calculator(address,uint256,uint256)", +"0d8cba74": "PublicMiningSupply()", +"0d8e6e2c": "getVersion()", +"0d8f9cee": "disableToken(address,address)", +"0d8fbe23": "getDigitFromUint(uint256,uint256,uint8)", +"0d8fd836": "ExeniumToken()", +"0d9019e1": "RECIPIENT()", +"0d9029ea": "Cryptodraw()", +"0d9049f2": "createOffer(uint256,uint256,string,uint256[])", +"0d927924": "XPCoin()", +"0d92b691": "transferDefaultPercentsOfInvested(uint256)", +"0d92d381": "ElectricQueue()", +"0d92ddac": "LockEvent(address,uint256,uint256)", +"0d92e3e8": "claimedTokens()", +"0d9332e2": "setMinContractBalance(uint256)", +"0d93afef": "revokePermissionBatch(address[],string)", +"0d9543c5": "donateAs(address)", +"0d955209": "ARTWORK_STARTING_PRICE()", +"0d95ccc9": "setPreSale(bool)", +"0d963235": "setGrowthBump(uint256)", +"0d973d2e": "getTimestampProposal(bytes32)", +"0d97f395": "redeem(string,bytes32)", +"0d98dcb1": "getTransferPreSignedHash(address,address,uint256,uint256,uint256)", +"0d997dc3": "setdivsforall(bool)", +"0d99bbec": "calculateUSDWithBonus(uint256)", +"0d99edbf": "presaleWeiLimit()", +"0d99f40a": "setInvestors(address)", +"0d9b2730": "FireXToken()", +"0d9b71cc": "setParter(address,uint256)", +"0d9d19b9": "joinMatch(uint256,uint256,string)", +"0d9db3f1": "VertesCoin()", +"0d9e16d1": "Alphonic()", +"0d9e8cab": "winnerLast(uint256,uint256)", +"0d9ec228": "_price_token_ICO3()", +"0d9f2817": "getJobSkillsCategory(uint256)", +"0d9f5aed": "mixGenes(uint256,uint256,uint256)", +"0d9f5faa": "oasisDirect()", +"0d9fcb03": "juegoSillaConsensys01(address)", +"0da03197": "_build(uint256,int256,int256,uint8)", +"0da04fa6": "Smrtoken()", +"0da072a8": "newMediaTokenCreated(string,address,string)", +"0da108ff": "JointICOBonusAmount()", +"0da1eb03": "deleteHiddenPosition(uint32,int64,bytes16)", +"0da24421": "bytesMemoryArray(bytes)", +"0da2c5f0": "setBuyLimits(uint256,uint256)", +"0da2e088": "upgradedContractAddress()", +"0da2ee2f": "init_register_contract(bytes32,address,address)", +"0da30317": "ExchangerPoint(address,address)", +"0da304b0": "AssetToken()", +"0da3bec6": "addToCategorie1(address,address)", +"0da3e613": "EthFactory()", +"0da4f991": "createContinuousSaleContract()", +"0da4fc46": "unMutex()", +"0da590d4": "withdrawDevFees()", +"0da5f845": "unBlacklistAccount(address)", +"0da719ec": "onERC998Removed(address,address,uint256,bytes)", +"0da76f1c": "externalDecline(uint256,bytes32)", +"0da84bc1": "newIntegrityFeeProposal(uint256,string)", +"0da86f7f": "JUSTed()", +"0da877d3": "getWeis(uint256,uint256)", +"0da8ba5d": "checkRecentInvestments(address)", +"0da95761": "upgrade(string)", +"0da97716": "isSignedByAlex()", +"0da9e3d7": "tokenIcoAllocated()", +"0daa431a": "currentstageplayer1()", +"0daa5703": "set(bytes32,bool)", +"0dab6e08": "getallowedContracts(uint256)", +"0dac3d99": "deadlineTwo()", +"0dae2a63": "DTXToken()", +"0daf233b": "agingTimeByStage(uint256)", +"0daf37e6": "Sales(address,uint256,string,uint8,string,uint256,uint256,uint256,uint256,uint256)", +"0daf7a8c": "setBlacklistInternal(address,bool)", +"0daf96f9": "ThaiBahtDigital()", +"0daf999a": "heroContract()", +"0dafc58f": "Compound_now_Accrued_interest()", +"0db02622": "ownerCount()", +"0db03955": "fundingProcessed()", +"0db0624a": "z_Determinations()", +"0db14e95": "getStakedAmount(address,address)", +"0db1b335": "getNextMaximumPlayers()", +"0db293cb": "depositDekla(uint256,uint256,bytes,uint256)", +"0db38253": "DEFAULT_CLIFF()", +"0db38f66": "BetChampion(uint256)", +"0db3be6a": "decrementOpenInterestFromMarket(uint256)", +"0db49c84": "TokensSold(address,uint256,uint256,uint256,uint256,uint256)", +"0db4bad0": "claimDate()", +"0db5db26": "weiToOwner(address,uint256)", +"0db6a786": "SALES_DEADLINE()", +"0db6ba9b": "debugGetNumPendingSubmissions()", +"0db71d53": "createCrowdsale(uint256,uint256,uint256,uint256)", +"0db73c72": "noevent()", +"0db74aaa": "getInvestorBalance(uint256)", +"0db75ab9": "UsingAVirtualStruct()", +"0db79003": "addWineryOperationByRegulator(string,string,string,string,uint256,uint16,string)", +"0db81580": "purchaseAd(uint256,string,string)", +"0db9d891": "icoEndOfStageA()", +"0dba2400": "addToMidnightPrize()", +"0dbb78ce": "showPoolMembers(uint256)", +"0dbbc14c": "endOfROSCARetrieveSurplus()", +"0dbcca89": "computeinterval(uint256,uint256)", +"0dbce4dd": "registerCandidate(string,string)", +"0dbd5270": "numberOfBackers()", +"0dbd5e81": "Send_Data(uint16)", +"0dbda70b": "angelOnLeaderboards(uint64)", +"0dbe671f": "a()", +"0dbea6d0": "robotRefund(address)", +"0dbedee7": "getNFTbyTokenId(uint256)", +"0dbf19cb": "PRICE_RATE_LAST()", +"0dbf23f4": "vehicleregistration(address,string,string,string)", +"0dbf2a3f": "isNewWeek()", +"0dbf527e": "MintedToken(address,uint256)", +"0dc03ec7": "INFLIV(uint256,string,uint8,string)", +"0dc06e50": "postTX(address,uint256,uint256)", +"0dc081c5": "tokenTransferOwnership(address)", +"0dc10a60": "advisorsAddress()", +"0dc115c8": "coinanxtemp()", +"0dc16a56": "getDepotEth(address)", +"0dc174bd": "track(address)", +"0dc1819f": "purchase_tokens()", +"0dc193f5": "getEtherReceived()", +"0dc1d357": "isAfterEnd()", +"0dc224ec": "partnersMintLockEnd()", +"0dc26492": "bankPercent()", +"0dc2e439": "setBZxAddresses(address,address,address,address)", +"0dc30397": "counterAppeal(uint256)", +"0dc3279d": "maxnumber()", +"0dc32b72": "EtherStopLoss()", +"0dc36f2a": "migrationAgentCandidate()", +"0dc5bffb": "crowdsaleTokenAmount()", +"0dc6bae5": "allowFreezeBypass(address)", +"0dc6c392": "Puttu()", +"0dc7bd07": "testBurnAuth()", +"0dc8b5a8": "shortenPreIco(uint256)", +"0dc8f435": "Party(address,uint256)", +"0dc96015": "getVotes()", +"0dc9c838": "changeSaleTimes(uint256,uint256)", +"0dc9ebfe": "FoundationAddr_()", +"0dca59c1": "debt()", +"0dca7ed8": "winningOption(uint256)", +"0dcad340": "getCitizenLocation(address)", +"0dcaf3e2": "test_setupSucceeded()", +"0dcb4627": "_addPendingRequestId(uint32)", +"0dcc59e6": "DEFROST_INITIAL_PERCENT_OWNER()", +"0dccca72": "showFPLocktime()", +"0dccfde4": "WithdrawProfitFunds(uint256,address)", +"0dcd772c": "AmountSent(address,uint256)", +"0dcd7a6c": "sendMultiSigToken(address,uint256,address,uint256,uint256,bytes)", +"0dcd9759": "PPToken(uint256,string,string)", +"0dcdefa8": "playThreeDiceTotal(uint256,uint256)", +"0dce06c1": "goalOfState(uint256)", +"0dcec63d": "updateEtherPrice(uint256)", +"0dcf298b": "pollExists(bytes32)", +"0dcf38a9": "FirstPaySend(uint256,address)", +"0dcf4b8f": "totalContribution()", +"0dd0a042": "lock(bool)", +"0dd0cf9e": "founderAdress()", +"0dd12d38": "moderatorTransferFrom(address,address,uint256)", +"0dd1d147": "ActionCompose(address)", +"0dd27120": "exchangeState()", +"0dd2d96c": "doFinalize()", +"0dd2d9c0": "Rookcont()", +"0dd30c81": "toB32(uint256,bytes,uint256)", +"0dd327fe": "FundsKeeper(address)", +"0dd32910": "welcomeMsg()", +"0dd3e1b1": "CNT_Crowdsale()", +"0dd3fd03": "buySpins(uint256)", +"0dd5db48": "startPreSale1()", +"0dd5e582": "masterTransferFrom(address,address,uint256)", +"0dd5ee1b": "verify(address,bytes32)", +"0dd636ef": "setBuyDividendPercentageFee(uint8)", +"0dd63ba3": "setIntArrayIndex(bytes32,uint256,int256)", +"0dd6a4ad": "addOversight(address)", +"0dd6eae1": "setCourse(uint256)", +"0dd84392": "setAllowance(address,address,uint256,uint256)", +"0dd8cdbb": "initRegistryData(address,address,address)", +"0dd93b56": "restartAuction()", +"0dda20d1": "sellCrystalDemand(uint256,uint256,string,string)", +"0dda350f": "dumpdivs()", +"0dda507e": "manualFinish()", +"0ddc4a94": "WHOLESALE_TOKENS()", +"0ddcc528": "Testable(bool)", +"0ddcfe8e": "checkAddress(address)", +"0ddd0824": "checkHash(bytes32,bytes32,uint256)", +"0ddeb632": "buy(bytes32,uint256)", +"0ddeeb4f": "tokenSaleUpperLimit()", +"0ddef58d": "isUnfrozen(address)", +"0ddf0bfd": "Cryptogs()", +"0ddf0c41": "updateCandidate(address,string,string)", +"0ddf78c2": "divForEthertoteDevelopmentWallet()", +"0de0271e": "paymentReceived(address,uint256)", +"0de04691": "testCreateWithParentForeign()", +"0de0b1bc": "giveBirthByUser()", +"0de1f4c1": "CreateCodeToken(uint256,string,string)", +"0de2b2d8": "openPosition(address[11],uint256[10],uint32[4],bool,bytes,bytes)", +"0de3513a": "test_validRuleChange()", +"0de39733": "activateFlat(address,uint256)", +"0de3b100": "VoteForProposal(uint256)", +"0de41aa4": "checkIfAddressIsWhitelisted(address,address)", +"0de41e45": "lockBegunAtBlock()", +"0de54c08": "setUpgradeController(address)", +"0de607c3": "makeSubscriptionID(address,uint256)", +"0de6aa7f": "getOneTimeCostsPaid()", +"0de78a7f": "removeEggFromSale(uint256)", +"0de94e4a": "HodlEth(address,uint256)", +"0de96dff": "giveBack()", +"0de9b825": "sellShip(uint256,bytes32)", +"0de9cacd": "reCalc()", +"0dea35bf": "playerBet(uint256)", +"0dea38b6": "VESTING_TIME()", +"0deaf3f8": "claimNextReward(address,uint256)", +"0dec1c23": "requestDetachment(uint256)", +"0dec5d85": "initializeCrowdsale()", +"0ded195e": "freezeTokensOfOneUser(address)", +"0ded7f62": "secondBonusEnds()", +"0dedffb8": "feedAndMultiply(uint256,uint256)", +"0dee302e": "transferToRef(address,uint256)", +"0dee34ed": "tokensaleStageAt(uint256)", +"0dee3863": "nameEntriesCount(bytes32,uint16,bytes32)", +"0dee4af0": "doThrow(uint256)", +"0def3866": "updateChamp(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"0df04802": "_7_russkayaRuletka()", +"0df07980": "secondLevelPrice()", +"0df0de11": "ownerChangeBuyerfee(uint256)", +"0df104d7": "EtheeraToken(address)", +"0df12532": "setpricefactor(uint256)", +"0df18942": "hsub(uint128,uint128)", +"0df19d35": "lockup(address)", +"0df22268": "CryptoSanguoToken()", +"0df23e5b": "saleCounterThisPhase()", +"0df2dcd2": "OdinToken()", +"0df3a342": "_coldStorage()", +"0df4135a": "CMCT()", +"0df428f0": "GoldenFleeceToken(uint256)", +"0df62a33": "Lilbank()", +"0df63210": "DOMAIN_SEPERATOR()", +"0df71602": "setWinner(uint256)", +"0df76370": "createInvoicingAddress(string,string)", +"0df8cbfe": "isCluster()", +"0df8e481": "setassetPrice(uint256)", +"0df9178f": "LimeEyes()", +"0df9d568": "CentraWhiteList()", +"0dfa1140": "_RaffleDraw()", +"0dfa71ae": "salesAgent()", +"0dfad849": "TokenSale(address,address,address,address)", +"0dfb0297": "changePriceSelectFight2Death(uint256)", +"0dfb6615": "user(bytes32)", +"0dfbdcc5": "lethalBonusAtHits()", +"0dfc2bcd": "originalFunds()", +"0dfce266": "setCovman(address)", +"0dfd085a": "ICOBeginsAt()", +"0dfd45f9": "removeHelper(address)", +"0dfd799c": "SponsoredLink(string)", +"0dfdcb76": "setAuctionWinnerMessageHash(bytes32)", +"0dff5cb9": "bop()", +"0e001ec0": "balanceOfContractFeeToken()", +"0e011262": "mockWhiteList()", +"0e014cf8": "viewBalance(address,address)", +"0e0280d0": "bookRoom(string,uint256[],uint256,address,bytes32)", +"0e0290a4": "_3_orientation()", +"0e037cc0": "bulkRemove(address[])", +"0e03f276": "setLLV_edit_7(string)", +"0e04a7d8": "isGameOver()", +"0e05a512": "superVoteAgree(address)", +"0e0643ae": "EvTokenAdd(uint256,uint256)", +"0e06e7ef": "NFOCoin(uint256,string,string)", +"0e0701be": "test_oneValidEqStringUint(int256)", +"0e07419c": "ConversionStarted(uint256)", +"0e07658b": "eliminate(uint256)", +"0e07ef81": "registerNameXname(string,bytes32)", +"0e088c98": "cancelChainlinkRequest(bytes32,uint256,bytes4,uint256)", +"0e0a0d74": "getAmount(bytes32)", +"0e0a6f0c": "getHours()", +"0e0ac84c": "QBASE()", +"0e0afb86": "getKYCVerificationContractAddress()", +"0e0b3519": "rateTierHigher()", +"0e0bc104": "computeNextGen0Price()", +"0e0c3f58": "super_transfer(address,uint256)", +"0e0c8241": "MAXIMUM_LOOP_BOUND()", +"0e0d3567": "highestAddressReserving()", +"0e0d946b": "CyberPayToken()", +"0e0dbd72": "updateToSendFromStorage(address)", +"0e0e26da": "getRemainShareAmount()", +"0e0e4acc": "LIANG(uint256,string,string)", +"0e0e73a8": "next_round_players()", +"0e0f05a5": "executeRaiseCapital(uint256)", +"0e0f1f00": "allocationAddressPreICO()", +"0e0f55d0": "RewardOrder(uint256,uint256)", +"0e0fec9f": "Arbitrage()", +"0e1087c3": "getMarketMakerFunds()", +"0e10e99d": "Vault(bytes32)", +"0e10f1ae": "X2()", +"0e114c89": "setBonusAffiliate(uint256,uint256)", +"0e11624b": "crowdsaleBalances(address)", +"0e136b19": "deprecated()", +"0e137368": "getBorrowInfo(uint256)", +"0e13af5d": "lockedTokensWallet()", +"0e13b9af": "getValue(uint8,uint8)", +"0e1456c0": "maxPreSale2Token()", +"0e149b52": "RBRToken()", +"0e14a376": "deleteAddress(bytes32)", +"0e14f955": "readyTobreed(uint256,bool,uint256,bool)", +"0e153d48": "MarketStake(address,address,address,address)", +"0e15561a": "totalRewards()", +"0e1565c2": "getClaims(string)", +"0e15dc89": "sizeOf()", +"0e169119": "grantAccess(bytes32,address,string)", +"0e18d11e": "changeFunder(address,address)", +"0e18ea3c": "fuoco()", +"0e19bac1": "MOBILINK()", +"0e19f74f": "makeDeposit(uint256,address,address,address)", +"0e1a0217": "boolOrRevert(bool,uint256)", +"0e1a0399": "calculateWithdrawalAmount(uint256)", +"0e1a9e3f": "getJobSkillsArea(uint256)", +"0e1ac81f": "natecoin(uint256,string,string)", +"0e1ae0e4": "RateUpdated(uint32)", +"0e1af57b": "getScore(uint256)", +"0e1b39fb": "Wallet()", +"0e1c0188": "errorTickerQueryError(string,bytes32)", +"0e1c2d46": "deliveryVSpayment(bytes32,uint8,bytes32,bytes32)", +"0e1c6491": "getTotalBettersForFighter(address,address)", +"0e1ca8a5": "Oraclize()", +"0e1cdd2d": "getStandardComponent(uint256)", +"0e1cfd97": "tokensub(address,uint256)", +"0e1d2ec8": "isUpdatable()", +"0e1d88fc": "addTender(uint256,uint256,address,uint256)", +"0e1da6c3": "claimTimeout()", +"0e1e1d0f": "removeAuthorized(address,address)", +"0e1e3914": "coreSupply()", +"0e1e56f7": "Tix()", +"0e1f6d3b": "DIGC(address[],uint256[])", +"0e1fa28f": "containMinValueFromOther(uint256,address)", +"0e1fd315": "changeWhitelistStatus(address[],uint256[])", +"0e20ebe2": "right96(uint256)", +"0e213129": "ZestCoin()", +"0e216954": "ReturnEthToEtherhero()", +"0e21750f": "setFund(address)", +"0e219339": "getContractHash(string)", +"0e21a6a6": "ADD_TIERS(bytes32)", +"0e21c886": "OWNERS_TOKENS_AMOUNT()", +"0e21f784": "getCoverImage(address,uint256)", +"0e21fce3": "Suggest(string)", +"0e2286d3": "rdiv(uint256,uint256)", +"0e22dc5b": "getAllCommentIdsByAd(uint256)", +"0e2318cb": "BonumFinancialTokenPreSale(uint256,uint256,address,address,uint256)", +"0e234cd4": "countBonus(uint256)", +"0e2350ba": "TopCoinSaleClosed()", +"0e239679": "SputnikToken(address)", +"0e2451c7": "Lilith()", +"0e24c52c": "register(string,string,string,string)", +"0e24c810": "calcAmountWithBonus(uint256,uint8)", +"0e2562d9": "getAccountAddress()", +"0e25b620": "addFreeze(address)", +"0e263906": "transferToBranch(address,uint256)", +"0e26fb41": "SeniumSupply()", +"0e27324d": "approveKYC(address)", +"0e274eab": "pullTokens()", +"0e275b49": "artworkSaleCount()", +"0e27e3df": "removeConsumer(address)", +"0e2833eb": "random(uint8,uint8)", +"0e288064": "setManyBonusExtra(address[],uint256)", +"0e28bc4a": "CanceledAuctionEvent(address,address,uint256,uint256)", +"0e2916e1": "requestClosingChannel(uint256)", +"0e2984d1": "Cancel(uint64,address,address,uint256,int256)", +"0e29df22": "sendEther()", +"0e2a05c8": "delayOfICO2()", +"0e2a273f": "getCandidateIndexArrayLength()", +"0e2a9237": "r15Backers()", +"0e2ae77c": "addVesterManager(address)", +"0e2b75cc": "setWhitelistedMemberTypes(uint256[])", +"0e2cfe93": "getPercent(uint8,uint256)", +"0e2d1a2a": "vestedBalanceOf(address)", +"0e2d27cd": "claimUnsoldCoins()", +"0e2dc949": "TIER_3_BUYIN()", +"0e2dce69": "Play()", +"0e2df9aa": "Withdraw(address,uint256,int256)", +"0e2e4037": "removeOwnersConfirmations(address)", +"0e2e4ce8": "maximumLockYears()", +"0e2ebe6c": "GetPoolInformation(address)", +"0e2f0a0f": "weiReceive()", +"0e2f5fb3": "getThree()", +"0e2f8058": "setBCFContractAddress(address,address)", +"0e2f94a6": "RegionsToken()", +"0e2fb51f": "addinverst(address,uint256)", +"0e30643f": "MemberChanged(address,uint256)", +"0e30cda7": "getTotalCoinsAvailable()", +"0e316ab7": "removeSigner(address)", +"0e32a720": "sendMarketByOwner(address,uint256)", +"0e336f00": "getSeedsSinceLastHatch(address)", +"0e33e181": "get_modulo_value(bytes32,uint32,uint32)", +"0e3484c1": "DelGift(string)", +"0e34df82": "openTicket()", +"0e351605": "transfer_token(address[],uint256)", +"0e3589d9": "DAILY_FUNDS_RELEASE()", +"0e366cbf": "ourLastJackpotWinner()", +"0e3802e9": "addRewardToken(address,uint256)", +"0e388774": "setContractorImpl(address)", +"0e38901a": "unvault(uint256)", +"0e39b210": "founders_1()", +"0e3a04a7": "digitalcashToken()", +"0e3a23db": "mineMany(address[],uint8[],bytes32[],bytes32[])", +"0e3a997e": "countPartnerPlayers()", +"0e3ab61d": "startSale(uint256)", +"0e3b70fd": "month48Allocated()", +"0e3bc6ca": "BLOCKLAND()", +"0e3be37d": "ToggleTransferAllowanceFor(address,bool)", +"0e3c8068": "BotpyToken(uint256,string,string)", +"0e3c9563": "privateIssue(address,uint256)", +"0e3d2202": "feeFixed()", +"0e3db9f2": "startNow()", +"0e3e9a67": "FundsMigrated(address)", +"0e3f732a": "TheGame()", +"0e3fd8c2": "getSolid(uint256)", +"0e407bdd": "soldTokensMainSale()", +"0e414500": "setClaimingStart(uint256)", +"0e417055": "address5()", +"0e41c63b": "addHistory(uint256,address,uint8)", +"0e420f42": "setEventResult(string,uint64,uint8)", +"0e429ecc": "providerValue()", +"0e4355d4": "validFactories(address)", +"0e43806a": "Rental(address)", +"0e438ee5": "withdrawTeamToken()", +"0e43d7c3": "getUserRoleBitmask(address)", +"0e449cf9": "foundersTokens()", +"0e4649fd": "LogProcessedInterval(uint64,uint64)", +"0e46695e": "sumHardCapICO2()", +"0e468245": "pledgeEth(uint256)", +"0e473722": "volumeType4()", +"0e4739b1": "_refulshFrozenInfo(address)", +"0e476e27": "getten(string)", +"0e479dc7": "getShop(address)", +"0e47c259": "evolveByAtom(uint256)", +"0e47c76f": "rotate(uint64,uint256)", +"0e496d25": "VICETOKEN_ICO_IS_FAKE()", +"0e4983ff": "setSecondsAfter(uint256)", +"0e4a4e8c": "fechVoteNumForCandidateByStage(address,uint256)", +"0e4aed3f": "yearlyRewardPercentage()", +"0e4b0ba8": "account2Address()", +"0e4b10b6": "totalETHLimit()", +"0e4b8389": "getEstKeyBlockNr(uint256)", +"0e4c3aa6": "OrangeCirculateChain()", +"0e4d5919": "PHASE1_START_TIME()", +"0e4debbc": "SHIT()", +"0e4e0054": "isIcoFinshed()", +"0e4e47cb": "claimAfter90days()", +"0e4e5d93": "_bidERC20(address,address,uint256,uint256)", +"0e5004e6": "_calcPhasesPassed()", +"0e501834": "emergencyTransfer(address)", +"0e5112a4": "get_dividend()", +"0e51574f": "endGameRound()", +"0e51c00d": "getPawnStatus(uint256)", +"0e5229b0": "addOwner(address,uint8)", +"0e5263fa": "discountedTokensPerDollar()", +"0e5356ec": "testEvents()", +"0e536ff4": "ratifyMint(uint256,address,uint256)", +"0e5376d6": "vars()", +"0e53aae9": "connectors(address)", +"0e53bf67": "producedDiamondCaps()", +"0e541185": "pauseBet(uint256)", +"0e542f82": "refundOptions(address)", +"0e54316f": "setSantaClaus(address)", +"0e54a883": "setPublicSaleDate(uint256)", +"0e54b872": "registerUser(string,address)", +"0e54d1fc": "pruneShareholders(address,uint256)", +"0e554bd8": "scheduleCall(bytes,uint256,uint256,uint8)", +"0e5689bc": "getBidsNum(address,uint256)", +"0e56f529": "guardarDocumento(string,bytes32,bytes32)", +"0e58369f": "registrator(address)", +"0e583df0": "GEN0_STARTING_PRICE()", +"0e587aee": "set_presale_arbits_per_ether(address,uint256)", +"0e58d08c": "setInvestmentGateway(address)", +"0e597ed9": "PreCrowdsale(address,address)", +"0e5a6c70": "peep()", +"0e5aaace": "initIcoRule()", +"0e5aaffc": "getSellingItemByObjId(uint64)", +"0e5c011e": "harvest(address)", +"0e5c6a3d": "_withdrawTo(address)", +"0e5ceb47": "register(bytes32,bytes32,string)", +"0e5d095d": "codepointsOf(uint256)", +"0e5d4b99": "fechVoteMainInfoForVoter(address)", +"0e5e36fb": "TCH(uint256,string,uint8,string)", +"0e5e4d72": "createAndExecuteTransaction(address[],uint256[],uint256)", +"0e5fc721": "addUserBalance(uint32,uint64)", +"0e5fdad4": "releaseTeamTokenTransfer()", +"0e5ffb3c": "hashVersion(uint32,uint32,uint32,string,string)", +"0e60de7a": "rinkeby3()", +"0e620d70": "MultiSend()", +"0e62fde6": "getAttributeTypeID(uint256)", +"0e6436d2": "TokenChange(address)", +"0e64780d": "distribute(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"0e64ff0e": "tradeWalletTokens(address,uint256)", +"0e655432": "adventureItemContract()", +"0e65e5d9": "ETBSToken(address)", +"0e662cf0": "buyTokens(uint16)", +"0e662ff9": "oddEven(uint8,address)", +"0e666e49": "userExists(address)", +"0e67cf6c": "GetWageredWei(bytes32)", +"0e67f4bb": "ReferrerRegistered(address,address)", +"0e6848cc": "massNotify(address[])", +"0e686170": "changeTotalAirdrop(uint256)", +"0e687501": "OpticalNetwork(address)", +"0e68c2f0": "finishPurse(uint256)", +"0e69782b": "BCTT()", +"0e698493": "transferFounderTokens(address,uint256)", +"0e69890f": "withdrawATN()", +"0e69d16b": "testToSliceB32()", +"0e6ae3fb": "bid(string,string,uint256)", +"0e6b0afc": "adminContractSettings(uint32,address,uint256)", +"0e6b5823": "changeMaxBet(uint8[157])", +"0e6bc36c": "OkeToken()", +"0e6c04db": "icoThreshold1()", +"0e6c5f93": "changeAddr(address)", +"0e6ce30d": "createNew(uint256)", +"0e6d1de9": "getLatestVersion()", +"0e6d3a89": "mintingState()", +"0e6dfcd5": "redeem(address,address,uint256)", +"0e6e1b3e": "addSubject(bytes32)", +"0e6e4f3e": "lockPlayerFunds(address)", +"0e6f21f2": "sendBatches(address[],uint256)", +"0e6f2cf8": "game_withdraw()", +"0e708203": "rewardAccount()", +"0e70ab11": "addEthBonusToBuy(address,uint256,uint256)", +"0e70f147": "immediateRefund()", +"0e713a50": "_preValidatePreICOPurchase(address,uint256)", +"0e714202": "returnContributionsToTheSponsors()", +"0e7238f1": "setNormalRoomMax(uint256)", +"0e741a36": "generateVoteSecret(string,uint256)", +"0e7470cb": "getFullProfit(uint256,uint256,uint256)", +"0e752702": "repayBorrow(uint256)", +"0e757191": "finalizeRound(bytes32,uint8,bytes4)", +"0e757a2e": "testSetAndGet()", +"0e78501f": "ChangeStart(uint256)", +"0e787cce": "predict(bytes32)", +"0e792536": "removeGlobalConstraint(int256,address,int256,address)", +"0e7938ec": "tokenCreateFunction()", +"0e79964c": "getBoolField3()", +"0e7a2d4e": "isInAssetList(address)", +"0e7a967a": "_distributeBountyToken(uint256)", +"0e7b592a": "Halo()", +"0e7b8e07": "Sleipnir()", +"0e7b9f10": "hasBuyerLotteryBonusWon(address)", +"0e7bda18": "addAddressListItem(bool,address,address,uint256,address)", +"0e7c0f80": "masterCopyCountdown()", +"0e7c1cb5": "originalToken()", +"0e7c5d2b": "test_validEmptyEqEmpty256()", +"0e7ce976": "owner_bonusSend()", +"0e7d490d": "numberOfVotes()", +"0e7ebce4": "min_bid()", +"0e7f2be7": "DecreaseAllowance(address,uint256)", +"0e7f756a": "totalAssetUnits()", +"0e801d7a": "ticket(address,bool,uint256)", +"0e80d8b9": "PRICE_SALE()", +"0e8162ba": "totalBurntCoins()", +"0e816f66": "payForYourGladiator(uint256)", +"0e830e49": "setEngine(address)", +"0e8354b9": "CreateOOG(address,uint256)", +"0e83afbb": "approveTokens(bytes32,address,uint256)", +"0e83d92b": "playerPull()", +"0e840284": "LMDA()", +"0e848c1d": "NeoBitToken()", +"0e850239": "scheduleCall(bytes4,bytes)", +"0e856588": "getScheduledTimelockCount(address)", +"0e858b64": "setBridgeValidatorsOwner(address)", +"0e8670e0": "highestPrice()", +"0e86b63e": "calcLevel2Bonus(uint256)", +"0e86ec01": "doConfirmDeath()", +"0e870871": "rateOfZLT()", +"0e87457b": "ZincElement()", +"0e887cda": "getUserMoney(address)", +"0e88aace": "contractErc20Token()", +"0e88c4a4": "RegisterMine(string,uint256,address)", +"0e89341c": "uri(uint256)", +"0e89439b": "stake(uint256,bytes)", +"0e8a4ac7": "getPositionPrincipal(bytes32)", +"0e8b3971": "mintTap()", +"0e8bf00e": "ReleaseOfAccount(address,uint256)", +"0e8c0cdd": "_mineableSupply()", +"0e8ca718": "transferCurationRights(address)", +"0e8da019": "getInitRound(uint256)", +"0e8de473": "getDividendBalance(address,address)", +"0e8ef0c1": "systemOnSaleCount()", +"0e8f0a95": "commonDiscount()", +"0e91f4b3": "removeBadToken(address)", +"0e923d3b": "submitEther(address)", +"0e9279a0": "BountyManager()", +"0e929611": "AdminRemoval(address)", +"0e92eb6d": "sellMyTokens(uint256)", +"0e934447": "createPromoPlayer(address,string,uint256,uint256)", +"0e940fd8": "CELL_ADD_SPACE()", +"0e94869e": "ArJoust(uint256,uint256)", +"0e94a0ee": "proofToken()", +"0e95e127": "readpriceXname(string)", +"0e96127a": "transferEther(address,address,uint256)", +"0e96938c": "matchExistingBids(bool,bytes32)", +"0e972421": "isSpawningAllowed(uint256,address)", +"0e975f73": "FirstPeriodEndDateUpdated(uint256,uint256)", +"0e978e81": "AgriChainDocumentContract()", +"0e97cfdf": "placeOrder(uint256,uint256,uint256)", +"0e97e3d3": "validateAuthentication(address,uint256,uint256)", +"0e97fa7a": "setEarlyParticipantsWhitelist(address[],bool[],uint256[],uint256[])", +"0e98f811": "reservedTotalSupply()", +"0e995ff5": "cd()", +"0e997ce3": "IPMCoin()", +"0e99b380": "getCoinAddress(bytes4)", +"0e99f5e6": "claimBonus(address)", +"0e9a9dbb": "signature(string,address,bytes32)", +"0e9aa208": "getAddressAdmixture()", +"0e9b6281": "setSubsidy(uint256)", +"0e9cbbad": "PurchaseFailed(address,uint8)", +"0e9ccb94": "Boboho()", +"0e9d02cc": "setTokensPerKEther(uint256)", +"0e9d56a2": "getTotalEth()", +"0e9e543a": "collectableTokenOf(address)", +"0e9ecedd": "mEtherInvalid()", +"0e9ef902": "join_voter()", +"0e9f0816": "getContractHash(uint256)", +"0e9f9f86": "isMinimalReached()", +"0e9fb0ed": "getOptionAddress(address,uint256,address,uint256,uint256,bool)", +"0e9fd199": "licenseAffiliate(uint256)", +"0ea008c8": "bonuscalpre()", +"0ea04562": "requestRandom(uint256)", +"0ea12558": "girlIdToOwner(uint256)", +"0ea126f9": "registerUser(address,string)", +"0ea17a76": "safe_mul(uint256,uint256)", +"0ea1f459": "DVCToken()", +"0ea227e7": "StarTravelLane()", +"0ea317a9": "SUNCOIN()", +"0ea37c64": "repost(uint256)", +"0ea412ab": "_setPrice(uint256)", +"0ea49bc1": "changeRental(address)", +"0ea4eef0": "getMaxGroupBalance(uint256)", +"0ea51122": "decreaseMarketCreatorSettlementFeeInAttoethPerEth(uint256)", +"0ea5edea": "payTodayReward(address,uint256)", +"0ea662ea": "hourPot()", +"0ea733bf": "setmyPrice(uint256,uint256)", +"0ea7a110": "getEmployee(address,uint256)", +"0ea7c8cd": "airDeliver(address,uint256)", +"0ea7ee82": "testRegisterAndVerified()", +"0ea81cf9": "initialPokemonInfo()", +"0ea8e5ac": "tokenPriceIncremental_()", +"0ea9e4f1": "doInitialReport(uint256[],bool)", +"0eaac106": "TokensAdded(address,uint256)", +"0eaadd04": "_addBurner(address)", +"0eaaf4c8": "withdrawBid(uint256)", +"0eaaf5ac": "auction_start_time()", +"0eab31b1": "initAuctions(uint256,uint256,uint256,uint256)", +"0eaba26a": "getCurrentValidatorsLength()", +"0eabdab6": "removeOracles(bytes4[],address[])", +"0eabeffe": "sendMessage(string,string,string)", +"0eac6ae7": "getClientAtIndex(uint256)", +"0eac7a0e": "transferToAnotherAddr(address,address,uint256,string)", +"0eacecd2": "getEquipTokens(address)", +"0eacf634": "BKCToken()", +"0ead3ec8": "payeePricePerPart()", +"0eada49f": "standingOrdersByPayee(address,uint256)", +"0eae2f86": "initAccount(address,uint256)", +"0eae73dd": "stringToAddr(string)", +"0eaee52c": "setGrantsUnlock(uint256,bool)", +"0eaf94c3": "secondDueDate()", +"0eaf9fa4": "ownerSetMinBorrowedValue()", +"0eafb6da": "getCapInWei()", +"0eafe473": "balanceOfCoin(address)", +"0eb05d49": "viewGoldList(address)", +"0eb0afa6": "createDebt(address,address,uint256)", +"0eb14edb": "Mondo()", +"0eb15f0f": "claimRewardWithBlockData(uint256,bytes)", +"0eb1947f": "changeGatewayAddr(address)", +"0eb288f1": "executeTransaction()", +"0eb34740": "lockedTokens()", +"0eb3f5a0": "sweepCommission(uint256)", +"0eb3f993": "getAreaQualityByDay(uint32,uint32)", +"0eb40426": "IncPreSupply(uint256)", +"0eb40916": "EthernautsStorage()", +"0eb43fe3": "SaleClockAuctionERC20(address,uint256)", +"0eb495c2": "pushCity()", +"0eb4c7d6": "checkTeamUnlockedTokens(address)", +"0eb4d170": "setLockup_dakehus(address,uint256,uint256)", +"0eb51018": "getProductOperation(string,address,uint256,uint256)", +"0eb523ac": "PRIVATE_STAGE_FINISH()", +"0eb524d4": "block1()", +"0eb5a167": "XCloudRoc()", +"0eb6f543": "hodlerTotalValue6M()", +"0eb82c13": "updateHpbNode(address,bytes32,bytes32,bytes32)", +"0eb8d153": "AICoreCoin()", +"0eb8ed07": "transferEnable(bytes32)", +"0eb8fe7a": "getChannelCount()", +"0eb944d5": "PiperToken()", +"0eba6b06": "getChannelInfo(address,address,uint32)", +"0eba7f2d": "SomeCoin(string,string,uint8,uint256)", +"0ebb0d30": "getSummaryReferralProfit(address)", +"0ebb172a": "WITHDRAWAL_DELAY()", +"0ebbe5d6": "firstPrivateLockTime()", +"0ebbf213": "AddPauser(address)", +"0ebc1568": "viewTokenName(uint8)", +"0ebdc43a": "IsSaleEnabled()", +"0ebe0f32": "HacToken()", +"0ebe31c8": "getCountTrack()", +"0ebe4acb": "EtherModifierMonstro()", +"0ebf0bcb": "FAID(uint256,string,uint8,string)", +"0ebf3886": "CryptoLandmarks()", +"0ebf5f27": "Reservation2(address,uint256)", +"0ec0692a": "prizeEth()", +"0ec0786d": "tb()", +"0ec08b29": "getLoopLimit(uint256,uint256)", +"0ec0fce5": "setPercentage(uint256,uint256,uint256,uint256)", +"0ec1268c": "_freezeFunds(address,address,uint256,uint256)", +"0ec12782": "internet()", +"0ec173d0": "changeTreshold(uint16)", +"0ec1b057": "verify(bytes32,string,string)", +"0ec1ce16": "_getCurrentRate()", +"0ec1e7ac": "claimBalanceByOwner(address)", +"0ec2c379": "_getJYPCBonus(uint256)", +"0ec2c5d7": "loik()", +"0ec3b247": "testControlSetEnforceRevisionsNotOwner()", +"0ec3f62e": "NITRONEUMERC20(uint256,string,string)", +"0ec48a42": "quater4()", +"0ec4fb0a": "WHITELIST_PERIOD()", +"0ec52541": "unshelf(string)", +"0ec55d6d": "SprinkleCoin(uint256,string,string)", +"0ec59606": "addPlayerTxHistory(address,uint256,uint256,uint256,uint256)", +"0ec5c49a": "changeEthToTokenRation(uint8)", +"0ec6688d": "intrepidSoldCount()", +"0ec66924": "getStudentRequestsLength()", +"0ec6b08d": "validIdentifier(uint256)", +"0ec78d9e": "setup(address[],uint256,address,bytes)", +"0ec843d1": "setMinAmount3Round(uint256)", +"0ec852f2": "QuranToken()", +"0ec89f2b": "requiredProgressOfPreviousDungeon()", +"0ec8c387": "getContractRates(bytes32)", +"0ec8e2b4": "Moneyplant()", +"0eca4c92": "CryptoPunksMarket()", +"0ecae7d3": "wager(bool,uint256,uint256,uint8,bytes32,bytes32)", +"0ecaea73": "create(address,uint256)", +"0ecb93c0": "addBlackList(address)", +"0ecba3f8": "BusinessAutomationUnion()", +"0ecd0424": "decompressPoint(uint256,uint8)", +"0ecda113": "freezeEndTime(uint256)", +"0ecdbfd4": "DesingCoin()", +"0ecdd94f": "goldFeeDataUpdatedAtBlock()", +"0ecea92c": "allowInvestor(address)", +"0ecf19e5": "balanceWithoutFreezedBonus(address)", +"0ed0b19f": "resetBonusPool(uint256,uint8)", +"0ed15d23": "dInit(address)", +"0ed21029": "getIssueAssignee(uint256,bytes32)", +"0ed2fc95": "exchange(address,address,uint256,uint256)", +"0ed387c1": "getSpinsContainer(bytes32)", +"0ed3909c": "startBonusCompaign(uint256)", +"0ed3d5b9": "passed(address[])", +"0ed40dff": "resetAppendDecryptedBids(uint256)", +"0ed469b8": "houseFee()", +"0ed5410a": "endOfRewards(bool)", +"0ed59a60": "releaseProof(bytes32,string)", +"0ed5a933": "isCanceled()", +"0ed61407": "makePick(uint8,uint256)", +"0ed659b4": "getLLV_edit_18()", +"0ed68aa5": "getPlanetOwners(uint256,uint256)", +"0ed6b171": "LogStartICO()", +"0ed74c08": "func_0C2C()", +"0ed7a0f2": "Predatex()", +"0ed7c905": "FantomToken()", +"0ed86f04": "withdrawDivis()", +"0ed9b97b": "buy_fromContract()", +"0edaf441": "lockAddressRegistration(address)", +"0edc1923": "changeMaximumHodlDuration(uint256)", +"0edc4737": "SEED()", +"0edc54a8": "holdTokens(address)", +"0edd2ffc": "penalty()", +"0edddd3e": "lstFunc(uint256[])", +"0ede050b": "ico3Max()", +"0edf2134": "deathData_a17()", +"0edfb0f7": "withdrawCollectedInterest()", +"0edfe7ec": "setBackendWallet(address)", +"0ee02d9d": "getHash(address,address,uint256,bytes,address,uint256)", +"0ee07836": "adjustDifficulty(uint256)", +"0ee21ddc": "setEtherPriceUSDWEI(uint256)", +"0ee2b0e6": "commissionToWithdraw()", +"0ee2cb10": "getCreator()", +"0ee2ce58": "VKNToEth()", +"0ee33128": "RequestRefund()", +"0ee33c70": "claimed_blocks()", +"0ee36dbc": "setParamsStopSale(bool)", +"0ee3c31d": "getUserIndexOnEther(address)", +"0ee4229c": "grantReservedToken(address,uint256)", +"0ee454dc": "getBUB(bytes32,uint256)", +"0ee526e0": "enableMintToken()", +"0ee5ca1f": "secondsLeftPublic()", +"0ee62c77": "getStageVolumeBonuses(uint256)", +"0ee75f6b": "TOKEN_THIRD_PRICE_RATE()", +"0ee7968e": "REWARD_NUM()", +"0ee79fb3": "closeReferendums()", +"0ee7c858": "beatMartialOwner()", +"0ee7f045": "TransferSellAgent(address,uint256)", +"0ee85800": "getCFOHashing(address,uint256)", +"0ee8e338": "testFailCreateWithParentsForeignNotInUse0()", +"0ee95ecf": "getNextPrice(bytes32)", +"0eea10b1": "sysPer()", +"0eeb63b9": "getUserAccountTokenBalance(address,address)", +"0eebd59b": "log_recast(address,uint256)", +"0eebdb04": "AprilAirdrop(address,address)", +"0eecae21": "draw()", +"0eecc2a3": "updateRequiredTimeBetweenDraws(uint256)", +"0eeccb84": "removeAdvisor(address)", +"0eed49d0": "_createFighter(uint16,uint256,uint8,uint8,uint8,uint8,address)", +"0eedc7b5": "voteDescription(uint256)", +"0eedc9d9": "payAffiliate1Address(address)", +"0eefdbad": "tokenTransferProxy()", +"0ef12aa9": "getUserID(address)", +"0ef14b98": "viewFirstLotOfClauses()", +"0ef25f8b": "TicTacToeRules(address,address,address,address,uint256)", +"0ef26743": "height()", +"0ef270d5": "CreateNewAccount()", +"0ef2d7af": "bonusDeadline()", +"0ef43cbd": "confirmerNouveauProprio()", +"0ef486d1": "revisions(uint256)", +"0ef504ae": "preSaleHalted()", +"0ef524ff": "setDefaultMint(uint256)", +"0ef5a7e0": "allocateToCrowdsalePurchaser(address,uint256)", +"0ef60e48": "setRubusOrangeAddress(address,address)", +"0ef67887": "Balance()", +"0ef6eb9c": "getCompte_33()", +"0ef71d79": "privatized(bytes32,bytes32)", +"0ef72880": "DADXChainERC20()", +"0ef76243": "withdraw_Arina(uint256)", +"0ef7cc8e": "metadataOf(uint256)", +"0ef845df": "propose(address,string,string,string,string,string,uint256,uint256,uint256,uint256)", +"0ef96356": "stakeFor(address,uint256,bytes)", +"0efafc03": "SaleClockAuction(address,uint256)", +"0efafd01": "getPlayerGainLossOnLastFlip()", +"0efc9d03": "minEthToRaise()", +"0efcf295": "deleteAnyProposal(bytes32)", +"0efd0973": "club()", +"0efd2cca": "postICO()", +"0efd3d5b": "getPrice(string,string,uint256)", +"0efd4989": "numAdmins()", +"0efe5fb7": "addToCart(uint256,string)", +"0efe6a8b": "deposit(address,uint256,uint256)", +"0efe7f62": "objectShoes()", +"0f00dfdb": "NonOperationalWithdrawManager(address)", +"0f027c67": "membersLength()", +"0f0308fb": "upgradeGems()", +"0f03be37": "mimax(uint64,uint64)", +"0f03e4c3": "numberOfAccounts()", +"0f041cef": "KitFutureToken()", +"0f0433c4": "_getDroneAbility(uint256)", +"0f050dce": "getBitcoinAddress(bytes32,int256,bytes32,int256)", +"0f052173": "invest2017()", +"0f059913": "vested(address,uint256)", +"0f06670a": "didWin(bytes32)", +"0f092c44": "MIDGRADE_TYPE3()", +"0f096163": "Chainy()", +"0f0ba766": "removeChild(uint256,address,uint256)", +"0f0c27ad": "HashRegistered(bytes32,address,uint256,uint256)", +"0f0ed39e": "EthealPromoToken(address)", +"0f0f3f24": "addOwnerAddress(address)", +"0f106e0a": "encodePacketCommit(uint256,uint256)", +"0f120fc3": "toggleTrading()", +"0f122a6c": "_setSealableProperty(uint256,bytes32,bytes32)", +"0f12354d": "updateStateBasedOnContributions()", +"0f12b32a": "Garcut()", +"0f12d8f8": "RoundWinner(uint256,uint256,address,uint256)", +"0f12ffac": "weiToFNU(uint256)", +"0f134bee": "payPreviousOwner(address,uint256)", +"0f1354f3": "burnFrom(bytes32,uint256)", +"0f136527": "getShareIndex(address)", +"0f13af83": "setCurrentCoin(address)", +"0f13dbde": "inRankList(address)", +"0f14212b": "transferFromOwner(address,uint256,uint256)", +"0f145dca": "Ethbet(address,address)", +"0f149d0a": "changeBurnPaused(uint256)", +"0f14a7e4": "ModeratorRemoved(address,address,bool)", +"0f14b900": "setTimeStampStatus(uint256,uint256,string)", +"0f15573b": "setLLV_edit_2(string)", +"0f15f4c0": "activate()", +"0f166ad4": "local()", +"0f183119": "vote_for_candidate_D_for_Free()", +"0f188e1d": "studioLevel(address)", +"0f18a530": "chemistry()", +"0f18ac07": "transferFromOwner(address,uint256)", +"0f191524": "fillOrder(uint256,bytes)", +"0f19f92a": "isIcoOver()", +"0f1a6444": "cliffTime()", +"0f1bf454": "getGameStatus(uint256)", +"0f1ca0d9": "sethToken()", +"0f1df574": "WithdrawETH()", +"0f1e3b5b": "getHousePayout()", +"0f1e8c24": "commitTeam(address,uint256,uint256[])", +"0f1ed0c6": "setOwner(address,bytes32,address)", +"0f1fd654": "ELearningCoinERC()", +"0f2004a1": "Bob(address)", +"0f201ca6": "reportConvertTokens(uint256,address)", +"0f20b9df": "crowdsaleContracts(address)", +"0f215afb": "paySeller(uint256,uint256)", +"0f21a046": "WithdrawMonethaBuyerUtility()", +"0f226a31": "getServiceUpdateAddress(address,uint32)", +"0f228087": "transferTokens(address[],address)", +"0f2284cc": "SbuyToken(address,address)", +"0f22a95d": "deleteCountry(uint256)", +"0f23a104": "burnAssetOperator(uint256)", +"0f23b047": "getPlayNumber()", +"0f23cbaa": "recycle()", +"0f246780": "ZJF()", +"0f24f5c8": "doTransfer(address,uint256)", +"0f250780": "AKCToken()", +"0f2636bd": "getStockSellOrderPrices(uint256)", +"0f264e1a": "farmerRequestCertificate(address,uint256,string,string,string,uint256)", +"0f2905f7": "verifyStage()", +"0f29eb73": "revokeStaking(address)", +"0f2bc56d": "fixTokenCalcBug()", +"0f2c9329": "split(address,address)", +"0f2da195": "LimitSet(uint256,uint256,uint256,uint256,uint256)", +"0f2dabca": "punchIn(address,uint64)", +"0f2e5b6c": "Locked()", +"0f2f9bb7": "getNextWhitelistedNode(address)", +"0f2fa473": "test_already_paid()", +"0f3092fb": "EasyHomes()", +"0f30c971": "TheGambler()", +"0f3554ad": "addBoolListItem(bool,address,address,uint256,bool)", +"0f36f691": "getLockStatus(address)", +"0f37e79a": "transferClockmaker(address)", +"0f37fd4a": "HexelErc20Token(string,string)", +"0f391236": "ethRateMax()", +"0f39c6ab": "removeVotersVote(address)", +"0f3a00d5": "CreateCOR(address,uint256)", +"0f3a0533": "extraReceiverAmount(address)", +"0f3a1412": "getArrlist(uint256,uint256)", +"0f3a31d6": "SymbolChange(string)", +"0f3a9f65": "setPeriod(uint256)", +"0f3ae419": "PreferentialRateChange(address,uint256)", +"0f3afeec": "Nodelist()", +"0f3b305e": "getPawnPackageId(uint256)", +"0f3bd3fd": "teamJust()", +"0f3c92f3": "calculateFLCCore(address,uint256)", +"0f3cb8bc": "setCardUpgradeLevels(uint256,uint256,uint256)", +"0f3d7c3e": "release(string,uint32[3],string,string,string)", +"0f3d8803": "getMinPurchase()", +"0f3de489": "newAuction(uint256,uint64)", +"0f3e7027": "clearTransferValueby(address)", +"0f3e9438": "frontRunner()", +"0f3eb785": "add(string,uint256,uint256,uint256)", +"0f3f0e42": "allowTotalMintAmount()", +"0f3f53c1": "dappsBonusCalc(address,uint256)", +"0f3fb52a": "LogSetState(uint256,uint8,uint256,bytes32)", +"0f3fc29e": "setChestProduct(uint16,uint256,uint16,bool,uint32,uint24,uint24,uint8,uint8)", +"0f40593e": "ViewMyBet()", +"0f40988e": "contributorsShare()", +"0f40d645": "demander(uint256)", +"0f4170f2": "BaseICO(address,address,uint256,uint256,uint256,uint256)", +"0f41ba4b": "bid(address,uint256,uint256)", +"0f420113": "_calculateCurrentRate()", +"0f42fdfb": "recoveryModeTriggerTime()", +"0f4391f5": "setPauseMaster(address)", +"0f43a677": "validatorCount()", +"0f43c196": "setTournamentAddress(address,address)", +"0f45368c": "checkTransferHash(address,uint256,address,address,uint256,uint256,bytes)", +"0f45c3e1": "transferFromAny(address,address,uint256)", +"0f45f528": "getTknOfferor(uint256)", +"0f4665aa": "getOrderHash(address,uint256,address,uint256,address,uint256,uint256,address,address,uint256)", +"0f47165e": "managePlayer(address)", +"0f473d72": "_calculateDiscount(uint8,address)", +"0f47435b": "pvt_inv_Pool()", +"0f481bf7": "postTransfer(address,address,address,uint256)", +"0f482da1": "unblockSpending(address)", +"0f482e64": "LikeCoin(uint256,address,address)", +"0f4acfcd": "charToByte(bytes1)", +"0f4b1cfc": "setGovernment(address)", +"0f4bbdf2": "registerBuyer(string,string,string,string,address,string)", +"0f4cf692": "numMessages()", +"0f4d14e9": "depositEth(uint256)", +"0f4df754": "Gladiethers()", +"0f4dfc17": "ICOTokenDelivery(address,uint256)", +"0f4ef8a6": "rewardManager()", +"0f4f8184": "bancorRegistry()", +"0f4fd9cc": "log_event(string)", +"0f4ff474": "_openGameResult(uint256,uint256,uint256,string)", +"0f501d07": "saveInfoAboutInvestors(address,address,uint256,uint256,bool)", +"0f505a01": "sealDataStream(address,uint256,bytes32,uint256,bytes32)", +"0f5127f5": "Ariston()", +"0f5137f9": "sellOrderBalances(bytes32)", +"0f522614": "Shufflix()", +"0f527200": "SimpleCoin()", +"0f529ba2": "D()", +"0f52fb0a": "searchFreelancers(address,uint256,uint256[],uint256[],uint8,uint256,uint256[],uint256[],uint256[],uint256)", +"0f5381f1": "testUserCanIncreaseVersionNumber()", +"0f53a470": "getProfile(address)", +"0f53b7ee": "communityTokensAddress()", +"0f53ba51": "appWasMade(string)", +"0f53e2a8": "NewToken(address)", +"0f555b46": "MicroCoins()", +"0f560cd7": "list()", +"0f56e460": "Shitcoin()", +"0f574ba7": "subscribe(uint256)", +"0f577d97": "getCompte_16()", +"0f57b9d9": "removeFromPrivileged(address)", +"0f57eb79": "minboc()", +"0f581aed": "MinimumBitcoinInvestmentUpdated(uint256,uint256)", +"0f58d28f": "weightOf(string)", +"0f590c36": "emergencyFixGameResult(uint64,uint256)", +"0f59a638": "totalWeiCommitted()", +"0f59eb95": "ownerUpdateOthers(uint256,bool,uint256,uint256,bool)", +"0f59f83a": "go()", +"0f5a5466": "claimWithResolver(address,address)", +"0f5a8d9c": "raiseDollarsFunded(address,uint160,int160)", +"0f5aa9f3": "setAuthorization(address,address)", +"0f5ad969": "node_index(address)", +"0f5b807d": "cuddleData()", +"0f5bab7c": "countManagers()", +"0f5c8c0a": "balancesDB()", +"0f5e41c8": "_getDestinationPartition(bytes)", +"0f5e7348": "getCommunityBallotCentsPrice()", +"0f5ea100": "price(address,uint256,uint8)", +"0f5eacf6": "EndStage()", +"0f5ed9e9": "escrowAllowed(address)", +"0f5ee138": "userSignupCount()", +"0f5f0151": "GxTradersProxy(address)", +"0f5f1dbc": "operationsAccount()", +"0f5f4c53": "unpause2()", +"0f5f8593": "MetaBall(uint256,string,string)", +"0f601679": "balanceOwner(address)", +"0f60e3d9": "resetAddTokenData()", +"0f610c06": "getValidatedLiability()", +"0f61280e": "nutzAddr()", +"0f62562f": "pregnantNinjas()", +"0f62c3e3": "releaseEscrow(bytes32,address,uint256)", +"0f632fd3": "onMint(address,uint256)", +"0f63d864": "addOwners(address[],uint256[],uint256[])", +"0f6413b7": "batchAssignStopped()", +"0f64864d": "transferTokensAndDividends(address,address)", +"0f6521e2": "FROZEN_TOKENS()", +"0f66791c": "setHTML(string)", +"0f66acd1": "EcosystemEthereum()", +"0f66d082": "gauntletTypeOf(address)", +"0f670da6": "destroyLogicContract()", +"0f6798a5": "Mint(address,uint256)", +"0f67f3f7": "distributeToDev(address,uint256)", +"0f683fd1": "Token(string,string,address)", +"0f69cdbe": "approvespender(address,uint256)", +"0f6a1734": "Crowdsale(address,uint256)", +"0f6b6756": "tokenSaleIsPaused()", +"0f6bb3c3": "doSpawn(uint32,int256,address,bool,address)", +"0f6c2a33": "setMaxStage2AllocationPerInvestor(uint256)", +"0f6d37d6": "supportAddress()", +"0f6d6236": "setIssueDividendReward(uint256)", +"0f6d9f00": "ERA_PERIOD()", +"0f6e40c3": "startRound(bytes32,bytes32)", +"0f6ea4fc": "MISCELLANEOUS_TOKENS_SUPPLY()", +"0f6f5f98": "setAndFixTokenPriceInWei(uint256)", +"0f6f72a8": "getClosingTimeValue()", +"0f710616": "TRSToken()", +"0f710e32": "CryptoFinexToken()", +"0f71590c": "setPOLYUSD(uint256)", +"0f732bdc": "getEncryptionAlgorithmCount()", +"0f73b4f4": "setStartingPrice(uint256)", +"0f73d212": "addLog(string,string,bytes32)", +"0f74a5cc": "cancelCenturionSale(uint256)", +"0f74e527": "RenmiCoin()", +"0f74e689": "registerNewPubKeyForHash(bytes28,string)", +"0f7503c9": "baseStartTime()", +"0f75806f": "GraphenePowerCrowdsale()", +"0f75c82e": "getObjClassExp(uint64)", +"0f75e81f": "issue(bytes32)", +"0f762cfe": "emission(address,address,uint256,uint256,uint256)", +"0f76496a": "returnTokens3(address,uint256,uint256)", +"0f76b651": "unlockDate5()", +"0f76c114": "getCurrentValue()", +"0f76de0d": "left45(uint256)", +"0f76f489": "getPoolName(uint256)", +"0f774287": "Burnt(address,uint256,uint256)", +"0f774931": "administrativePayouts(address,uint256)", +"0f776fb2": "PutDiv(address)", +"0f77c1d3": "addUsersWhitelistB(address[])", +"0f784943": "mintable(uint256)", +"0f78628e": "allowedToBurn()", +"0f7875c6": "startblock()", +"0f78d408": "JuvToken()", +"0f78ee7c": "payoutLockedToken()", +"0f79cfa2": "addReferrer(bytes32)", +"0f79e120": "nrFailures()", +"0f79e1c7": "createRandomDeveloper(string,uint256)", +"0f7a4590": "goalAchieved()", +"0f7a8971": "buildBoolMapping()", +"0f7bd1dd": "enterRaffle(uint256[],uint256)", +"0f7bff76": "getHeroDBZHeroAddress(uint256)", +"0f7c9085": "addToAdmin(address,bool)", +"0f7c932a": "getReservedTokensListValInPercentageDecimals(address)", +"0f7d6673": "Channel()", +"0f7e1653": "OpenGame()", +"0f7f97c8": "calcNewSkinAppearance(uint128,uint128,uint128)", +"0f7fa72f": "addOperator(address,uint256)", +"0f809adb": "changeTokenOwner(address)", +"0f80fc58": "exponent(uint256)", +"0f8143f6": "discardRejectedProposal()", +"0f819fe8": "disableTuneOption(uint256)", +"0f81d248": "endPeriodC()", +"0f822b78": "admin_transfer(address,uint256)", +"0f825673": "deleteCoupon(string)", +"0f82b42f": "userAccountTokenBalances(address)", +"0f832bc6": "testIsLawyer()", +"0f832f18": "_nextLoanInterestRate(uint256)", +"0f83f112": "CanTransferChecked(bool,address,bool,bool)", +"0f8410e3": "getPresellToKenAmount()", +"0f85751e": "change_p5(uint256)", +"0f861127": "argl(uint256,uint256)", +"0f861ca3": "ownerUnpause()", +"0f86abc1": "modifyStakerLimit(uint256)", +"0f86e3eb": "denaToken()", +"0f86f702": "compatible223()", +"0f87a044": "withdraw1(uint256)", +"0f88aa81": "emitRecord(bytes32,uint256,uint256,uint256)", +"0f88f1a5": "collectBounty(address,uint256,uint256)", +"0f89c305": "removePendingArray(address)", +"0f89fa28": "OrganizationRegister()", +"0f8a771e": "skr()", +"0f8a8887": "rocketSetResourcePrice(uint256,uint256,uint256)", +"0f8b70c9": "getBotContract()", +"0f8bca8c": "getStage0Start()", +"0f8c04e2": "create(address[],uint256[],uint256[],address,address,bytes)", +"0f8d4030": "totalShareholders()", +"0f8d598a": "decayedPriceOfSocialIdentity(uint256,uint256)", +"0f8dc272": "ComputeAcornPrice()", +"0f8ea4f3": "addSomeOfManyLine(uint256,string,uint256,string)", +"0f8eaa74": "addToPreSaleRefunds(address,uint256)", +"0f8ef9f8": "getBoosterRaiseValue(uint256)", +"0f8f8b83": "spendableBalanceOf(address)", +"0f8fcb74": "_setInt(bytes32,int256)", +"0f8fd363": "getRepPriceInAttoEth()", +"0f900587": "addBonusPerShare()", +"0f902bc2": "delayedTransferFrom(address,address,uint256)", +"0f907ba3": "failCar(string)", +"0f90b83a": "deployTokenContract(uint256)", +"0f917e31": "transferAndDonateTo(address,uint256,address)", +"0f917f9e": "totalSupplyTeamTokens()", +"0f91c8a5": "setCap(string,uint256)", +"0f91cce1": "releaseVanbexTeamTokens()", +"0f92f38f": "changeMartial(uint256)", +"0f9302c8": "LogEvent(string)", +"0f95378f": "MerchantWallet(address,string)", +"0f953b97": "getCmcAddress()", +"0f960644": "addClaim(address,bytes32,string,string,uint256)", +"0f96dd39": "maxTokenCap()", +"0f973874": "MiniMeTokenSimple(address,address,uint256,string,uint8,string,bool)", +"0f974ef2": "PasserBy(address)", +"0f977561": "getUserEvents()", +"0f97f2f1": "managePlayer(uint256,uint256)", +"0f98a9cc": "lockTokens(address,uint256,address,uint256)", +"0f98c91a": "TOKENS_PER_ETHER_EARLYSALE()", +"0f99da4a": "getBoosterAmount(uint256)", +"0f99fab2": "allowWrite(uint256,uint256)", +"0f9ad6b8": "GGPOKoFToken()", +"0f9aea56": "last_release_date()", +"0f9b481a": "TokenFinalized()", +"0f9b5129": "maxSellRateInPrecision()", +"0f9b87be": "transferToDestination(bytes32)", +"0f9bac2d": "ADVISORS_ADDRESS()", +"0f9bb8b3": "getCurrentUserQuickPromoBonus()", +"0f9c95da": "GDCAcc04()", +"0f9ce471": "Ether2Gen()", +"0f9e144d": "changeMaxMin(uint256,uint256)", +"0f9e39bf": "minBidMultiplier()", +"0f9e42da": "drawToken()", +"0f9e5bbd": "createShares(address,uint256)", +"0f9fb983": "lastBetTimeSEC()", +"0fa01949": "yearOfProduction()", +"0fa2b5d4": "Interestv3(address,address)", +"0fa2d864": "block4()", +"0fa45298": "getRoundAhead(uint256,uint256)", +"0fa48688": "calculateItemId(bytes32)", +"0fa53db8": "divideDecimalRound(uint256,uint256)", +"0fa6002e": "sellCharacter(uint32)", +"0fa6e84d": "SouYingToken()", +"0fa7a798": "getOpenRequestPublicKey(uint256,uint256)", +"0fa7b7b3": "totalRefunded(uint256)", +"0fa803e8": "SetCategoryName(string)", +"0fa85ab0": "claimTokensForUser(address)", +"0fa87b15": "closeMyGame(uint256)", +"0fa8beb3": "claimBonus(address,uint256)", +"0fa8f516": "getPosition(address,bytes32)", +"0fa95aee": "etherToTokens(uint256,uint256)", +"0fa9ced4": "emergencyFuneral()", +"0fa9e486": "registerCoin(string,string,address)", +"0faa2aae": "amountOfBSTRequired(address)", +"0faaa357": "nCanOpenRewardMinEth()", +"0fab0f6a": "minimumWitcoins()", +"0fab14e8": "agencyOwner()", +"0fab459c": "transferSoldTokens(address,uint256)", +"0fab7539": "getIssuanceCount(bool,bool,bool,bool)", +"0fac20e1": "dev1Wallet2Pct()", +"0fac8dc5": "update(string,string,bool,string,address,uint256,uint256)", +"0fac960e": "sellTokensForWaves(string,address,uint256,uint256)", +"0fadb5c7": "getWHaddress()", +"0fae42cd": "pricePreSale()", +"0faf0904": "set_creator(address)", +"0faf2775": "newGame(string,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"0fb0a8d3": "manageOperable(address,bool)", +"0fb0cf2d": "changeLockupDuration(uint64)", +"0fb125ac": "transferTokens(uint256,address[])", +"0fb26f0b": "switchTransfers()", +"0fb2e692": "buyMCTTokenProxy(address,uint256,uint256)", +"0fb35574": "SCC()", +"0fb3844c": "_status()", +"0fb411e8": "evc()", +"0fb4b070": "tokensMintedForSale()", +"0fb4ecdf": "complained(address,address)", +"0fb524ce": "castVote()", +"0fb54f3a": "AuthenticationManager()", +"0fb553ba": "FLC()", +"0fb59f95": "buy(uint256,string,uint256,uint16)", +"0fb5a6b4": "duration()", +"0fb65f10": "authorizeMintRequester(address)", +"0fb66557": "trustedTransfer(address,address,uint256)", +"0fb66da3": "getMessageOfVisit(address)", +"0fb7657f": "isAllocationLocked(address)", +"0fb792d0": "ONE_HUNDRED_PERCRENTS()", +"0fb7a5e6": "getCensuredBy(uint16)", +"0fb7cb1d": "addToKycTeam(address)", +"0fb7e602": "startEmergency()", +"0fb9398f": "getProductBuyers(uint256)", +"0fb9d85e": "buyIndex(uint256,address,bool)", +"0fb9dcd5": "getTokensAtCurrentRate(uint256)", +"0fba34a4": "has(bytes12)", +"0fba4ca1": "accept(string)", +"0fba80de": "pickValues(bytes32)", +"0fbad611": "setTimeFrame(uint256)", +"0fbb3b6b": "shittyRandom()", +"0fbbeceb": "PostCompleted(address,address)", +"0fbc0cd1": "bounty_solve(address,bytes32)", +"0fbc0f82": "LotterySymbol()", +"0fbe333a": "getLastBidder()", +"0fbe3e40": "returnLast()", +"0fbed9fe": "EFAFCOIN()", +"0fbf7151": "startsWith()", +"0fc03687": "Booko()", +"0fc0e9a8": "_addWithdrawal(address,address,uint256)", +"0fc10026": "CALLER_EXCHANGE_RATE()", +"0fc12b1a": "isGetWhiteList()", +"0fc1b08b": "setValue(string,string,string)", +"0fc1c83d": "minimumTokenCommission()", +"0fc24c03": "ZarFundsToken()", +"0fc33bb7": "lrcBalance()", +"0fc3866f": "isSoftCapGoalReached()", +"0fc38daa": "CSToken()", +"0fc3c5e8": "shipMedicine(address,string,string,string,string)", +"0fc4af53": "cloneTokens(uint256,uint256)", +"0fc4f262": "updateSubdivsFor(address)", +"0fc55d1e": "ENTS()", +"0fc55fd1": "bid(uint256,string)", +"0fc63d10": "tokenA()", +"0fc66f45": "PO24()", +"0fc69407": "BidPlaced(uint256,uint256)", +"0fc6ed30": "Satum()", +"0fc709e5": "setDistribution(uint256,uint256,uint256,uint256)", +"0fc72f4e": "purchaseCallback(string)", +"0fc783d1": "SacToken(address)", +"0fc7c15e": "getUnapprovedUsersTop150()", +"0fc81bdc": "editEventResult(string,uint64,uint8)", +"0fc85c7f": "INAYCOIN()", +"0fc8a393": "transferUpdater(address)", +"0fc8afbd": "getFreeSnake()", +"0fc92096": "isValid(address,bytes32[])", +"0fc958dd": "tMemberSolId(uint256,address)", +"0fcac452": "addToRakePool()", +"0fcaed94": "restartLottery()", +"0fcb5984": "getprice()", +"0fcb83f2": "SancojTokenContract()", +"0fcbb5b9": "getSubscriberType()", +"0fcbbc8e": "_lookupOwnerIdentityCount(address)", +"0fcc0c28": "deprecate()", +"0fcc1e47": "_grantAccess(bytes32,address,address,string)", +"0fccf22e": "ban_user(address)", +"0fcd1cab": "killInstance(address,address)", +"0fcda174": "getAccountTokenBalance(address,address)", +"0fcddd06": "CreateCRC(address,uint256)", +"0fce00ed": "calculatedPaymentInterval()", +"0fce349e": "popularitySetting(uint256,uint8)", +"0fce887b": "transferLockedFrom(address,address,uint256[],uint256[])", +"0fd02fc1": "isValidUnbondingLock(address,uint256)", +"0fd0aa67": "Parties()", +"0fd0ae10": "insert(address,uint256)", +"0fd0e440": "uniq(uint8[])", +"0fd1ed1f": "setMarginForVictoryPercent(uint8)", +"0fd1ed78": "LOG_EmergencyWithdrawalFailed(address)", +"0fd1f94e": "firstClaimBlock()", +"0fd2ce17": "funcArrayInArguments(address[])", +"0fd3d758": "WWAMPricingStrategy(uint256,uint256,uint256)", +"0fd3ee83": "__redeemTokens(address,uint256)", +"0fd4d286": "BlueSkyDragon()", +"0fd5084a": "validOrigins(uint256)", +"0fd548ef": "myShareToken()", +"0fd56202": "addressToNumCities(address)", +"0fd57f3e": "seatPrice()", +"0fd58d07": "expectedWinnersCount()", +"0fd62f57": "adminCharge_p2()", +"0fd68e3f": "newRaffle()", +"0fd6fc49": "IntelliShareEco()", +"0fd7410c": "in_finalization_phase()", +"0fd7b03d": "HackDivs()", +"0fd8a8fb": "setAnonymousCap(uint256)", +"0fd9d5bf": "Matrexcoin(uint256,string,uint8,string)", +"0fda890e": "changeGenRNGcontractAddress(address)", +"0fdb1c10": "withDraw()", +"0fdb468f": "fee(uint64)", +"0fdc3609": "changeDeposit(address)", +"0fdc7956": "unlockAllTokens(bool)", +"0fde0f8e": "ROLE_VENDOR()", +"0fde5686": "setBUB(bytes32,uint256,bytes)", +"0fdfa5ee": "preBuy3()", +"0fe1dfa8": "lastRoundLengthUpdateRound()", +"0fe1f548": "getTokenSCADARequiresHardCap()", +"0fe234ed": "testSetController()", +"0fe2abcf": "exchange(uint256,address)", +"0fe2c5d1": "BTSMToken()", +"0fe3152e": "airdropEnd()", +"0fe3c10d": "MANHATTANPROXY4THST()", +"0fe41fd5": "acquisitionsTokens()", +"0fe433db": "reallocate(uint256)", +"0fe43e1f": "foundersAdvisorsPartnersTokensVault()", +"0fe4ea72": "killDragonDeathContract(address,uint256,uint256)", +"0fe793aa": "studioHandler(address,uint256)", +"0fe7c250": "DaoRulesProposals()", +"0fe7db9c": "MedSupplyToken()", +"0fe83bb8": "preSaleTokens()", +"0fe8c788": "addCertificate(string,address)", +"0fe961da": "_getCurrentRoundTeamCos()", +"0fea657f": "totalExch()", +"0fea81fe": "setComisionInETH()", +"0fea9be6": "ChinhCoin(uint256,string,uint8,string)", +"0feacc42": "CommonToken(address,address)", +"0feaf627": "_safeStaticCall(address,bytes)", +"0feb10ff": "Register(uint256,string,string)", +"0feb172f": "buyTeam(uint256)", +"0feb376b": "AMOUNT_ICO()", +"0febb8b7": "setSaleInfo(uint8,uint256,uint256,uint256,uint256)", +"0feca6d5": "releaseAdvisorsTokensForPercentage(uint256)", +"0fecef48": "getProductsByOwner(address)", +"0fed240b": "dAdd(bytes32,address,bool)", +"0fed5dc8": "setSendAllow(bool)", +"0fee32bb": "setAuctionIndex(address,address)", +"0fee5a40": "getProviderCurve(address,bytes32,int256)", +"0ff0a4df": "reFund()", +"0ff188c7": "transferPixel(uint16,uint16,address)", +"0ff244b2": "transferByAddress(address,uint256,address)", +"0ff2e4b2": "assignCEO(address)", +"0ff3687b": "remainingGenesisCats()", +"0ff39daa": "generateDepositAddress()", +"0ff3d57e": "addMasterWallet(address)", +"0ff3d5ea": "getCastleSale(uint256)", +"0ff4009c": "getLotteryInfo(address)", +"0ff42eab": "setProofAddr(string)", +"0ff43cfd": "IFCNBToken()", +"0ff4c916": "getValue(uint256)", +"0ff4d239": "HashRushICO()", +"0ff4f160": "oraclize_query(uint256,string,string[1])", +"0ff58f40": "month24Allocated()", +"0ff7bb07": "refundClient(address,uint32)", +"0ff88a8d": "getChar(uint256)", +"0ff88baa": "RoyalTransfer()", +"0ff89c2b": "divide(int256,int256,uint256)", +"0ff8cf9b": "dividend()", +"0ff92e7b": "burnDead(address,uint256)", +"0ff9aafe": "updateMinimumBond(uint256)", +"0ffb1d8b": "whitelistToken(address,bool)", +"0ffbe43b": "initializeOfferChannel(uint128,address,address,uint256)", +"0ffdbd42": "feePoolShare(uint256,bool)", +"0fff6e06": "totalAvailableGames()", +"0fffbb54": "changeRankingSize(uint256)", +"10001fdd": "setPublicSaleParams(uint256,uint256,uint256,bool)", +"10002f39": "WorthlessEthereumTokens()", +"100153b6": "blocksByDay()", +"1001c39c": "tokensReleasedToIco()", +"100278d8": "startPreSale2()", +"100349fa": "Good_Bye_World()", +"10038099": "isPuppySports()", +"1003ac0c": "customFallback(address,uint256,bytes)", +"1003e2d2": "add(uint256)", +"10042e10": "remainingPublicSupply()", +"10055c1d": "role()", +"100565f4": "setTurnover(uint256)", +"10059be0": "do_redemption()", +"1006a41f": "auctionStarts(address,address)", +"10072af7": "SetupRaffle(string,uint256)", +"1007f753": "erase(uint256)", +"10082bff": "getActorBillXdetail(address,uint256,bool)", +"1008737d": "test_oneValidEqBytes32()", +"1008a2a5": "getTotalLendingItem(address)", +"10096c84": "exchangeBalanceOf(address,address)", +"10098ad5": "available(address)", +"100a0ed1": "receiveCreateAuction(address,address,uint256,uint256,uint256)", +"100a1099": "getTransactionIdsOf(address,address)", +"100a5ec5": "mintedCrowdsale()", +"100ab561": "updatePolicy2(bytes32,string,uint256,uint256,string)", +"100ac510": "addRx(address,address,uint256,uint256,bool)", +"100aca47": "totalFund()", +"100acefc": "_storeProof(string)", +"100af203": "reserveETH()", +"100b815d": "loadData()", +"100bce92": "toHex(string)", +"100be094": "setRefundRate(uint256)", +"100c6cfd": "ipoPlatformPercentage()", +"100c8ada": "setCAmodulus(bytes)", +"100c98fe": "SaleFailed()", +"100cdd91": "burnAll(uint256[])", +"100d7e30": "FuckFacebookCoin()", +"100e187a": "transferHolds(address,address,uint256)", +"100e4b94": "every_day_im_shufflin()", +"100ed0fc": "preallocateFirstStage(address,uint256,uint256)", +"100f23fd": "cancelWhitelistAddition(bytes32)", +"100f2e78": "determineSalaryTokens(address)", +"100f759f": "EDU_PER_ETH_SALE()", +"100f7a79": "registerBounty(address,uint256)", +"100fd02f": "isAbove(int256,int256,string)", +"101005bd": "releaseReserve(uint256)", +"10103122": "totalDurationInDays()", +"1010a515": "MONOGRAM()", +"101175e8": "BONUS_DATES(uint256)", +"10119521": "TokenBurnt(address,uint256)", +"1011a635": "changeCommissionFeeRate(uint256)", +"1013ad53": "KairosToken()", +"10142785": "assign(bytes,uint256,bytes1)", +"1014a29e": "firstRefundRoundRateDenominator()", +"1015295c": "ClaimMyBet()", +"10154bad": "addWhitelisted(address)", +"1016774e": "period3End()", +"1016ad94": "Baliv()", +"1016eadb": "Epilepsy()", +"10174967": "God()", +"1017a357": "HeirOwnershipClaimed(address,address)", +"101817ba": "getLastEmissionNum()", +"1018f294": "getRandom16(uint16,uint16)", +"1019635d": "assignReserved(address,uint8,uint256)", +"10196bf7": "pendingRefs(uint256)", +"1019dc59": "setSale(address,bool)", +"101a3fec": "setIsTokenTransactionOpen(bool)", +"101a889b": "LogBeneficiaryPaid(address)", +"101a917e": "makeTradeDetail(address,address,uint256,uint256,address,uint256)", +"101af16b": "countriesTokens()", +"101b6106": "RevokeEntity(bytes32,bytes)", +"101b7e7c": "vbtToken()", +"101b94f1": "setRightOfGroup(string,string,bool)", +"101ca1b9": "YoobaBatchTransfer()", +"101d1135": "ANNA(uint8)", +"101d52d2": "checkStoredFileName(string)", +"101d990c": "hmul(uint128,uint128)", +"101e1f2c": "initLottery(uint256,uint256,uint256,uint256,int256)", +"101e359b": "reviveFee()", +"101e5a32": "setSoftcap(uint256)", +"101e652e": "presaleUnlimitedStartTime()", +"101e8952": "forward(address)", +"101f13e2": "verifyProof(bytes,bytes32,bytes32)", +"102046db": "townPrice()", +"1021688f": "changeAdminAddress(address)", +"1022b30b": "proposalResult(uint256)", +"1023d597": "priceDecraseTime2Action()", +"102455a5": "sanity_check()", +"10253fec": "election(string,string,string,string)", +"10258bfd": "Payment(address,address,uint256,uint256)", +"10271334": "receiveICOcoins(uint256,uint256)", +"1027853f": "withdrawShare(address)", +"10278bc8": "setBytes32Value(string,bytes32)", +"1027e242": "getBoosterStrength(uint256)", +"10282b61": "payoutcount()", +"10286952": "parseKeys(bytes32[])", +"10288c4b": "startIco(uint256,uint256,uint256)", +"1028e4a8": "theCyberMemberUtilities()", +"1028f980": "getAssertDowntimeCost()", +"10290e51": "computeProfit(uint256,uint256,uint256)", +"102accc1": "fireEventLog2()", +"102b5cc5": "check_address_share_and_transfer_bond_token(uint256,uint256,address,address)", +"102b61f7": "setMinimumWeiAmount(uint256)", +"102c920a": "allRefunded()", +"102ce658": "setRule(address,string)", +"102deb9c": "changeMonethaVault(address)", +"102e58d0": "timeoutAt()", +"102e8b94": "sellnow()", +"102ff0b3": "amountToken()", +"10309781": "createdTimestamp()", +"1030adea": "change_king_name(string)", +"1030c539": "setCreditbit(address)", +"1030e227": "TroyToken(address,address)", +"1030f288": "releaseState2()", +"10314b07": "GOX(uint256,string,string)", +"10316eec": "getActionParametersCountByIndex(uint256)", +"10319417": "returnHost(uint256)", +"1031e34e": "raisedFromToken()", +"1031e36e": "pauseTrading()", +"10328e89": "CoinhiToken()", +"103359ce": "sendToIco()", +"10340069": "tokenDistributionPool()", +"10342d02": "endSaleCarProduct(uint32)", +"10347a2c": "lockSymbol()", +"10348938": "setRankDynamic(uint256)", +"10361bf2": "transferLog(address,address)", +"10369540": "icoPhaseAmount2()", +"1036bbe2": "MAX_PERCENT()", +"1036cde8": "allocateCustomer(address,uint256)", +"103728a3": "FundingFueled(uint256,uint256)", +"10375a67": "getRemainingTokens(address)", +"1037706d": "uploadSignedString(string,int256,bytes20,int256,string)", +"1037a5f4": "getPrev(uint256)", +"10388809": "setTransferPrice(uint256)", +"1039cf3c": "isIcoStopped()", +"103aeda7": "isContractAuthorized(address)", +"103b0506": "preter(uint256)", +"103b5dad": "computeIndexId(address,bytes32)", +"103bf0bd": "tSLDToken(address,address,address,address)", +"103cbb7f": "ethpyramid()", +"103cfacf": "CryptovationX(address)", +"103d26ac": "getRareItemsPrice(uint256)", +"103e8154": "sellComissionUnits()", +"103ed140": "_getSkill(uint16)", +"103ef9e1": "authorizeOperatorByPartition(bytes32,address)", +"103f3a83": "getAuraColor(uint64)", +"103f9251": "transferFrom(address,address)", +"10400446": "setMaxAppeals(uint256)", +"10402040": "createSaiCollectorsEdition(uint256,address)", +"1040233f": "LevelUp(address,uint256,uint32)", +"1040762d": "setExchangeRates(uint256)", +"1040dc27": "getSTODetails()", +"1040e5a5": "showBal()", +"10422c24": "releaseAngelVested()", +"1042604f": "isTrue(bool,string)", +"1042876d": "getDisplayName(address)", +"1042ca73": "getWeekIdx()", +"1043dcdf": "LastIsMe(uint256,uint256)", +"10442a1b": "GetMainAddress()", +"10443ab3": "setLotteryTokensWallet(address)", +"10445a16": "_joinGame(address,uint256)", +"1044bbe6": "unLockTokens()", +"1045290e": "Boocoin()", +"10458684": "GBCCoin()", +"1045a889": "buildContract(string,string)", +"1045de72": "isEndOffer()", +"1046bc68": "deleteContact(address)", +"1046d078": "transferItemFrom(uint256,address,uint256,uint256)", +"1046e2ab": "Flood_Standard_Ethereum_Coin(uint256,string,string,uint256)", +"1047456e": "userTransfer(address,address,uint256)", +"10476aa9": "_activateIfUserIsNew(address)", +"1047d79e": "freezTime()", +"10482f57": "getWhitelistedResolvers()", +"1048a25c": "view_random(address,address)", +"1049334f": "tokenBalance(address,address)", +"1049f742": "terminateEscrow(address)", +"104a5963": "targetDiscountValue9()", +"104a5e75": "getRareItemsPLATPrice(uint256)", +"104ace02": "register(string,string,string,string,string,string)", +"104b6704": "currentManager()", +"104b78bd": "amountRaised(bytes32)", +"104bb708": "GetStatusCount(string)", +"104bc708": "LamboCrowdsale(uint256,uint256,address,address,address[])", +"104bf512": "createBATokenContract(address,address,uint256,uint256)", +"104bff92": "HasBooster(address,uint256)", +"104c9cff": "releaseDividendsRights(uint256)", +"104ce199": "Launcher()", +"104d5fdd": "getPriceProxy()", +"104d7bbb": "LuzCoin()", +"104de5a1": "setPromoted(bool)", +"104e81ff": "_approve(address,address,uint256)", +"104e9929": "tokenPool()", +"104f2d8f": "_approve(uint256,uint256,bytes32,uint256)", +"104fea4c": "activeCrowdsalePhase2(uint256)", +"10510ec1": "payToken(address,uint256)", +"10518aeb": "removeOldFirst(address)", +"10519ff4": "WestCoin()", +"1051db34": "implementsERC721()", +"10523af3": "getPokemonCD(uint256)", +"1052506f": "isSignedBy(bytes32,string,address)", +"10525660": "setConsumeToken(address)", +"10549874": "tokenRate1()", +"1054d657": "divestETH()", +"105541ae": "returnPtSafeSmall()", +"10561361": "logDisputeCrowdsourcerTokensBurned(address,address,uint256)", +"105689a0": "doLockdown()", +"10570116": "newGroup(string,uint32,uint256,uint32,uint32,uint32,uint32,uint32,uint8)", +"1057ce8c": "create3DoggiesTokens()", +"10594e19": "JPGProject()", +"1059c492": "CROWDSALE_WALLET()", +"105a6356": "minimalSuccessUSD()", +"105ae3bf": "getRoundIsEnded(uint32)", +"105b2645": "CheToken()", +"105b6f00": "Fructus()", +"105c287b": "lockPeriod1()", +"105d3e0f": "cryptogs()", +"105d9e37": "disputeLength()", +"105e029f": "JSONpath_string(string,string,string)", +"105e68f0": "allBankers()", +"105e87a1": "redeemaAt(bytes32)", +"105ea540": "minimumToRaise()", +"105edd83": "toTheTop()", +"105ee9a7": "endFight(uint256,uint256,bool)", +"105fc4e8": "REQUEST_FOUNDATION_AMOUNT()", +"105ff033": "redeemReward(address,uint256)", +"10609902": "sendFundsToBorrower()", +"1060c965": "ZILLION()", +"106109c9": "RandiveBhToken()", +"10618776": "setETHUSDdemon(address)", +"10619300": "lockAccount(bytes32)", +"106233e8": "addAltOracle(address)", +"106259c8": "getNonEtherController()", +"10639ea0": "cancelMigration()", +"106524a5": "multisendEth(address[],uint256[])", +"106639ba": "getOwnAssets()", +"1066cd3c": "voteFor(uint16,address,bytes32,bytes)", +"1067f077": "setCompte_41(string)", +"1067f361": "totalTokenToSale()", +"10680b84": "getShareTokenAddress()", +"106812c9": "setPI_edit_18(string)", +"106858cb": "getRemainingPreSalesAmount()", +"1068d056": "getaddress0()", +"106a182b": "getLambosCount()", +"106b291f": "ethUsdRateInCent()", +"106bd2da": "initiateEscrow(uint64,uint256,address,address,address,address)", +"106be310": "getNameByNumber(uint256)", +"106c0a45": "collectOriginalBetERC20(address)", +"106c5511": "create(address,string,string,uint8,uint256)", +"106c6441": "removeReinforcedWhitelist(address[])", +"106c9da1": "mine(uint256,uint256,uint256)", +"106d2813": "setCreditGameAddress(address)", +"106e6290": "withdraw(address,uint256,bytes32)", +"106f6a3d": "TOKEN_FIRST_EXCHANGE_RATE()", +"106f6f33": "bountyTokensCount()", +"106f77a7": "multiMint(uint256,uint256[],uint256)", +"106f923f": "RewardClaimed(address,uint256)", +"106fcb7a": "changeAsset(bytes32,string,string,uint8)", +"106fd2d5": "setSaleAddress(address,address)", +"106ffbd3": "withdrawBatchTokenToInvestor()", +"107046bd": "projects(uint256)", +"1070eb4f": "calculateInterestDue()", +"1070f410": "convertToBytes(uint8[],bytes1)", +"10711911": "BONUS_TIER_5_LIMIT()", +"107169c5": "allLinesWrong()", +"10717a2e": "switchCompatible223(bool)", +"10718655": "contributeFor(address)", +"1072cbea": "transferToken(address,uint256)", +"10731a65": "claimTokenOwnership()", +"10735089": "readteamXaddr(address)", +"1073c4a9": "exploreBuilding(uint8,uint8[176])", +"1073d1f8": "releaseTprFund()", +"10745f7e": "getMinAmountToWager(uint256)", +"1074c619": "flushEthers()", +"1075153f": "multiPartySend(address[],uint256[])", +"1075f186": "fundingPoCEndTime()", +"10764268": "salvageOtherTokensFromContract(address,address,address,uint256)", +"10768bdd": "myUsingOracalize()", +"10769e01": "POOL_EDIT_2()", +"1076c2d7": "StreamXOnline()", +"1077135a": "oraclizeSetWinner(uint256)", +"1077666e": "unmined()", +"1077f06c": "makeClaim(uint256)", +"10780cce": "grantsStartTimestamp()", +"107853a9": "Spacoin()", +"10787d58": "checkfriend(address)", +"1078ad80": "makeContractPermanent(string)", +"107925bb": "viewCustomer(string)", +"10793b50": "m_contributionHistory()", +"10796a47": "staticCall(address,bytes,bytes)", +"10797bab": "runtoeth(uint256)", +"1079b859": "finalRewardPeriodPercent()", +"1079ed67": "getChildByAddress(address)", +"107a2c5e": "betEvents(uint256)", +"107a69e8": "WithdrawResult(uint256,bytes32,uint256)", +"107a77d0": "finalizeVestingAllocation(uint256)", +"107a83e2": "prizesAwarded()", +"107b1f8c": "debug_verifyShare(bytes,uint256[],uint256[],bytes,uint256,uint256)", +"107bf304": "withdrawEthToOwner(uint256)", +"107d1d55": "startPeriod(uint256,uint256)", +"107d4b23": "Bitcan()", +"107d8a90": "COBA()", +"107e1a29": "setEndTimeIco(uint256)", +"107e7b1f": "setBroker(address,uint256)", +"107e8b24": "setTimeSale(uint256,uint256)", +"107f3f6a": "setExeStatus(uint64,uint64)", +"107f587c": "deactivateEmergencyProtectedMode()", +"107f76c5": "cancelOrder(bytes32,uint64)", +"10802749": "maxPlayerNum()", +"1080b7b1": "token4DivsOwing(address)", +"1080f251": "ownerOfLand(int256,int256)", +"10814c37": "bot()", +"10816757": "crowdsaleClosingTime()", +"1081dc8a": "contractIndex(uint256)", +"10828bcc": "noOpenGameResult()", +"1082a128": "SaveRickAndMorty()", +"1082cda1": "Register(bytes32,address)", +"1082d51e": "COINESIA()", +"1083d2fe": "technicalAmount()", +"1083f761": "assetToken()", +"10840303": "alterAdmin(address,bool)", +"108456b4": "FIRST_AUCTIONS_MINIMUM_RAISE()", +"10848ddf": "getDaysInMonth(uint256)", +"1084a1fb": "transferToAccount(bytes32,uint256)", +"1084bc90": "farmSingle(address,address,uint256)", +"1084cc51": "canDoubleDown()", +"10855269": "setProxyStorage(address)", +"10861f40": "wasDelegate(address,address,uint256)", +"108623f2": "checkProofOfWork(uint256,uint256,uint256)", +"10867877": "eatUnicornWithoutCorn()", +"1086a9aa": "approve(address,uint64)", +"1087452c": "signatureOwner()", +"10875ac0": "getMembershipExpiryDate(address)", +"10878ea1": "REGISTRY_INTERFACE_REQUIREMENT()", +"10888f2f": "admin_exFeeRate(uint256)", +"1088996b": "_newOutgoingTransaction(address,address,uint256,string)", +"1088f03f": "crowdsaleCompleted()", +"10895087": "DDJXRP()", +"1089843c": "OAKTokenCrowdsale(uint256,uint256,uint256,address)", +"10898a3e": "currentStateStartTime()", +"1089b16e": "setPod(address,uint8)", +"1089f215": "ex(uint256)", +"108a101b": "hasEmptyEditionSlots(uint256)", +"108a936b": "_initGame(uint256,bytes32,bytes32,bytes32,uint256)", +"108afb9f": "getBonusAmount(address,uint256,uint256,uint32)", +"108b77ad": "tokenPresaleSold()", +"108c3708": "paoContactAddress()", +"108c8ae4": "completeTask(uint256,uint256)", +"108caf79": "whitelistTokens()", +"108d0c84": "enableDefinedGame(uint256,bool,bool)", +"108d40f8": "PutGift(address)", +"108d6f94": "ProjectOwner()", +"108d995b": "getContinuityNumber(uint32)", +"108e161b": "isBallotSealed(uint32)", +"108e4bdb": "isKycTeam(address)", +"108eaa4e": "resolver(uint256)", +"108f69f8": "verifyTetherLoss(address,uint256,uint256)", +"108fa161": "newEnglandBets()", +"108fe10c": "advisers(uint256)", +"109050bc": "jackpotLastQualified()", +"1090a638": "presaleGoalReached()", +"10922cc1": "testTransferCost()", +"1092735d": "Created(address,uint256,uint8,uint256,string)", +"10937b5a": "adminAddMoney()", +"1094252e": "reconciliationDate()", +"109447e1": "createHash(uint8[5],bytes32)", +"10947164": "changeCEO(address)", +"1094d009": "LowGasAmount()", +"10950708": "setInvoicePaid(address,address,uint256,uint256)", +"109538ca": "transferAdeptTokenOwnership(address)", +"10953c22": "ChangeChallengeAdditionFee(uint256)", +"1095b6d7": "withdrawFee(address,address,uint256)", +"1095f211": "PushInvestorList(address)", +"10961935": "Bionic()", +"10970fbb": "convertTransferredTokensToMny(uint256,address,address,uint256)", +"10971bee": "bonusDayPercent()", +"10972704": "getCurrentAward()", +"10978594": "depositSoul(uint256)", +"1097b9ee": "sellingPrice(bool)", +"1097c929": "episodePurchase(address,uint256)", +"1097d54a": "addMaster(address)", +"1097e579": "Enter()", +"1099107b": "apSaleIssue(address,uint256)", +"1099d3ec": "scheduleTransaction(uint256,uint256,uint256,bytes)", +"1099f6fa": "disablePOSReward(address,bool)", +"109a9dbc": "bulletAddress(address)", +"109ac462": "safebalance(uint256)", +"109b678a": "immortals(address,uint256)", +"109c2032": "LotteryToken()", +"109d42d3": "addTokenSale(uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)", +"109df68e": "rotateBitsRight(bytes,uint256)", +"109e591a": "SchmecklelToken()", +"109e8b21": "addOldMayors(uint256[],uint256[],address[])", +"109e94cf": "client()", +"109e9de6": "getMaxBuy(uint256)", +"109ef276": "newDutchPriceRate(uint256,uint256)", +"10a03b22": "PHASE1_SUPPLY()", +"10a0d2f1": "startOfCrowdsale()", +"10a101df": "getKeyData(bytes32,bytes32)", +"10a20b4c": "testMintGuy()", +"10a2f7cb": "createOption(uint256,string)", +"10a31091": "createRadar(uint256)", +"10a37c26": "getWinnerAddress()", +"10a3ec4f": "test_fiveAssertTrue()", +"10a4fd08": "Platinum()", +"10a5bbdb": "changeCharPrice(uint256,uint256)", +"10a64976": "ARLCToken(uint256,string,string)", +"10a6fdc2": "updateEtherPrice(uint256,uint256)", +"10a73f5e": "jackpotrate()", +"10a78f4a": "playerTwoReveal(bytes32,bytes32)", +"10a7a5f5": "secondStageWallet()", +"10a80397": "addBudget(uint256,uint256,uint256)", +"10a82579": "lockTokensAddress()", +"10a86088": "getIntField3()", +"10a942b4": "withdrawCoindropsToken()", +"10a9de60": "getOracle(uint256)", +"10aa3d8c": "VirsymCoin(string,string,uint256,address)", +"10ab96e1": "LYNDO()", +"10abda2b": "leaderAddress()", +"10abdb0a": "Dealer_HitOrStand(uint256,bool)", +"10acec5d": "_save(address,uint256,uint256,uint256,string,string,address,uint256,uint256)", +"10adb0ea": "sanMaxLength()", +"10adda0e": "feesAvailable(address,bytes4)", +"10ae4a73": "presaleAllocation(address,uint256,uint8)", +"10ae4ce2": "setReleaseValidator(address)", +"10af92ba": "eachCandy()", +"10b0a4cb": "updateServiceMaxCreditsPerProvision(address,uint32,uint256)", +"10b0b5d5": "add(uint256[])", +"10b1bf2c": "LongPlace(address[2],uint256[8],uint256,uint256)", +"10b23ceb": "isAdjacent(uint8,uint8,uint8,uint8)", +"10b3d502": "ICO_BONUS2_RATE()", +"10b44094": "LogUserRegistered(address,address)", +"10b60e65": "SimpleTrade(address,address,uint256,uint256)", +"10b787d1": "evaluate_model(uint256)", +"10b798d9": "countRef(address)", +"10b7d9ae": "view_get_maintenanceMode()", +"10b8b441": "PrediksiToken()", +"10b9e583": "shutDown()", +"10bc044f": "setUserLanguages(address,address,uint256[])", +"10bc3c75": "getCurrentMiner()", +"10bd0d9e": "LegendsToken(address,address,uint256,bool)", +"10bd6d2b": "__address2__()", +"10bdc6cc": "joingames(uint256)", +"10be0ab0": "getDaoist(address)", +"10be3808": "receivedWei(address,uint256)", +"10beb070": "getRaffleStats()", +"10bebe64": "OneExchangeToken()", +"10bf5068": "setProposalFee(uint256)", +"10c067d2": "setPriceForProtectedCrypton(uint256,uint256)", +"10c0afaa": "balanceForReward()", +"10c1181d": "memberId()", +"10c12917": "calculateWinnings(uint256,uint256)", +"10c193b9": "total_tokenwei()", +"10c19421": "born()", +"10c1952f": "setLocked()", +"10c1b414": "moveTokens(address,uint256)", +"10c1de19": "GeneratedNumber(uint256)", +"10c1ff21": "crowdsaleSuccess()", +"10c2a365": "PreICO()", +"10c2c1c1": "setArbiter(uint256,address)", +"10c36365": "SetExchanger(address,bool)", +"10c3b15f": "calculateAmountToRelease()", +"10c452ef": "deactivate_trading()", +"10c4610b": "exporterBanker()", +"10c49b78": "CarlosCoin()", +"10c4b19a": "minMakerBetFund()", +"10c4e8b0": "all()", +"10c5b269": "orderMatchSell(uint256,uint256,uint256,uint256,uint256)", +"10c5b328": "mintTokens(uint256,address)", +"10c70801": "setMaxAddresses(uint256)", +"10c74fc6": "setGlobal(uint256,uint256)", +"10c7868f": "sessionNumber()", +"10c9135e": "getTime3(address)", +"10c9ab39": "makeTrans(address,uint256)", +"10c9c76d": "updatePokecoinAndPokemarketAddresses(address,address)", +"10cad61f": "combinedGoalReached()", +"10cad69c": "getBrickIds(uint256,uint256,bytes32[],uint256,uint256,uint256)", +"10cb4302": "DstTokensIssued(uint256,uint256,uint256,uint256)", +"10cb4d64": "rejectCurrentPlayerDraw(bytes32)", +"10cb5628": "isPartOf(uint256)", +"10cb954c": "members_push(address,address)", +"10cbe445": "applyMC()", +"10cc6e21": "Dappster()", +"10cc969b": "sumbitForElection()", +"10ccbbdb": "_checkVotes(address)", +"10ccbe66": "setAltCapitalization(uint256)", +"10ce0516": "canSwap()", +"10ce2f3f": "buy3(address[],address[],uint256[],bytes,bytes,bytes)", +"10ce6452": "set_deposit_fee(uint256)", +"10cf5d47": "awaitingPayout()", +"10cfcc19": "left17(uint256)", +"10d0059c": "removeLock(uint256)", +"10d07e27": "_lotteryCard(uint256,address)", +"10d08ef4": "_check_winner()", +"10d0ffdd": "calculateTokensReceived(uint256)", +"10d26354": "greaterThan(bytes32,bytes32)", +"10d2f2e5": "set_whitelist_enabled(bool)", +"10d3bd2a": "transferMoneyMoney(address,uint256)", +"10d426f2": "_remove(address)", +"10d48cd3": "verificationAddressOn(address)", +"10d5105d": "offlineTransfer(address,address[],uint256[],uint8[],bytes32[],bytes32[])", +"10d58506": "transFeeCut()", +"10d5e276": "maxAttempt()", +"10d6a13a": "tokenSaleClosingTime()", +"10d72742": "removeFailedGame()", +"10d7b903": "DIALSSPUN()", +"10d89d37": "isExchangeUser()", +"10d8d74d": "setPrice(bytes32,uint256)", +"10d92060": "requiredGasPrice()", +"10d979f6": "tokenDivsOwing(address)", +"10da9f75": "StayBitContractFactory()", +"10dc0e3c": "decimalOfPrice()", +"10ddaa87": "_setCurve(uint256[],uint256[])", +"10ddd6fc": "_onPromo(address,uint256)", +"10debdf8": "isAuditFinished(uint256)", +"10dff452": "getStatsData(uint256)", +"10e04dcb": "BONUS_500()", +"10e0ebb3": "callStoWithBtc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"10e1c5e5": "getKrsFromApproved(address,uint256)", +"10e1d6db": "payoutEscrow(uint256)", +"10e22d41": "receivedWei()", +"10e2b914": "setTargetDiscountValue6(uint256)", +"10e3a28b": "iEther()", +"10e56973": "keyPrice()", +"10e5bff8": "setSuccessor(address)", +"10e6913e": "upDate()", +"10e6a223": "allocateSurvivorWinnings(address)", +"10e6be35": "getRewarder(int256)", +"10e6d3c9": "teamReservation()", +"10e6d746": "_mint(address,string)", +"10e6e06c": "vote(bool,uint256)", +"10e776ed": "lockBalanceOf(address)", +"10e7a9ce": "countMonths()", +"10e7e89f": "getLockingTimestampfrom()", +"10e80ded": "accumulate_to()", +"10e82384": "airdropAdmins(address)", +"10e89b22": "remove_deal(uint32)", +"10e96b3c": "createMorePaymentChannels(uint256)", +"10e9f2eb": "_getFetchVoteInterface(uint256)", +"10ea13df": "totalInvestment()", +"10ea6b34": "setReadOnly(bool)", +"10eae945": "wdToken(address,address,uint256)", +"10eaf707": "getWarehouseByAddress(address)", +"10eb3a32": "getContinuityNumber(uint32,int256)", +"10eb5a8c": "transferAndCallFST(address,uint256,bytes)", +"10ebb38d": "ASFBToken()", +"10ebf103": "getPokemonBet(uint256)", +"10ec5d2c": "funeralAndBirth(bytes32,int256,bytes32)", +"10eca945": "SetupMultipliers(uint256,uint256,uint256,uint256,uint256)", +"10ece9c6": "correctedHeroContract()", +"10ed5dfe": "_emitActiveChanged(bool)", +"10ee1910": "submitGameResultAndTriggerPayout(uint256)", +"10ee51ca": "GXVCSentByEther(uint256,address,uint256)", +"10eeb69a": "arbitrate(uint256,bool)", +"10ef0ac7": "endTimeICO()", +"10ef1976": "getEpmBalance(address)", +"10f01eba": "pIDxAddr_(address)", +"10f0c4da": "maximalInvestment()", +"10f13a8c": "setText(bytes32,string,string)", +"10f169e8": "disputeStatus(uint256)", +"10f1726d": "isDayTokenActivated()", +"10f1a274": "setMinWei(uint256)", +"10f226df": "addAction(bytes32,int256,int256,bytes32[],bytes32[],bool)", +"10f2bf3e": "closeSale2()", +"10f2e11c": "PrometheusX(address,address)", +"10f32982": "GetQueueLength()", +"10f3ac24": "EmergencyWithdrawNoAccountedTokens()", +"10f40804": "alottMainSaleToken(address[])", +"10f41715": "updateMintingData(uint256,uint256)", +"10f444ac": "ChinaInvestmentToken(uint256,string,uint8,string)", +"10f5f1b3": "get_participant_arbits_kyc_whitelist(address)", +"10f5f6b6": "free_vote_for_candidate_A()", +"10f66c54": "AirdropOne(address,uint256)", +"10f6e2a6": "setCountWinnerByPlace(uint256,uint256,uint256)", +"10f6fd02": "GetAllChallengeIDs()", +"10f74467": "kycRegisteredContributors(address)", +"10f7cf32": "statuses(bytes32)", +"10f85f44": "EAACoin()", +"10f88546": "declareCheater(address)", +"10f91e39": "walesaDawajMojeStoMilionow()", +"10f945c7": "withdrawToPoolOwner(uint256)", +"10fa01e6": "isBattleCreator(string,address)", +"10fa85c6": "HybridToken(string,string,uint8)", +"10fab6c7": "addReceivedMessage(address,address,uint256)", +"10fae6f4": "futureFundingWalletAddress()", +"10fb3c85": "addDelayedBonus(address,uint256,uint256)", +"10fb52bf": "createSaiFoundersEdition(uint256,address)", +"10fc0a6e": "RigCraftPresalePackageManager()", +"10fc0d39": "transferToMultisig()", +"10fc31ce": "balancesForPreICO(address)", +"10fccbf0": "presaleBurnPaused()", +"10fcda55": "DDFToken(uint256,string,uint8,string)", +"10fcdecc": "fechVoteInfoForVoter(address,uint256)", +"10fe42b8": "getBdpControllerHelper(address[16])", +"10fe5a2a": "rateEarlyStage3()", +"10fe7c48": "placeBet(uint256)", +"10fe9ae8": "getTokenAddress()", +"10feb0e5": "setPowerToken(address)", +"10ff4a1b": "lockedTokenBalance()", +"1100482d": "attach()", +"1100a9d8": "endGame(uint256,uint256,address)", +"1101a0fd": "claimWinnings(bytes32,bytes32[],address[],uint256[],bytes32[])", +"1101eaaf": "purchaserCount()", +"1101fa06": "WhaleChain(uint256,string,uint8,string)", +"1102610e": "setMarketplaceContract(address)", +"110466ed": "setOperatingStatus(bool)", +"110496e5": "allow(address,bool)", +"1104e09e": "SaddleShopSaleFee()", +"110506f0": "createCard(uint256,uint256)", +"11056874": "finishDApp(bytes32)", +"1105efe2": "_setExtraReceiverAmount(uint256,address)", +"11063eb1": "updateUnlockDate(uint256)", +"11071cb3": "CratesPurchased(address,uint8)", +"1107c3f7": "orderConfirmer(bytes32)", +"1107e77c": "removeRequester(address)", +"1107fa00": "thirdStageMintingDate()", +"1109a0a8": "blocksProducers(uint256)", +"1109ef92": "transferFromCrowdsale(address,uint256)", +"110ae711": "checkReferral(bytes8)", +"110b5f76": "ApprovalDenied(address,address)", +"110b8a6d": "changePlatformFlag()", +"110c478b": "uintRound(uint256,uint256,uint256)", +"110cee6b": "FlightDelayPayout(address)", +"110d35b8": "buyAsset(uint256)", +"110d9e68": "insert(bytes32,uint256,uint256,address,address)", +"110dc7a6": "doInvest(address[3])", +"110df916": "getChannelID(uint256)", +"110f8874": "withdrawRefund()", +"110fd65f": "toBeRaised()", +"111002aa": "createTask(string)", +"11102d4d": "devRatio()", +"11103599": "Token_Offer(address,address,uint16)", +"1110b13a": "getWinningPosition(uint32)", +"11115e38": "controlTime()", +"1111cd24": "getBuyReturn(uint256)", +"11125497": "setCodename(string)", +"1112b124": "setBuyPrice(address,uint256)", +"11136747": "_init(uint256)", +"1113ed0d": "KERNEL_APP_ID()", +"1113f2e6": "_addEth(uint256,address)", +"1114811a": "FACTOR_9()", +"111485ef": "individual_cap()", +"11149ada": "getProof(uint256)", +"1114fce5": "clearAdmins()", +"1116cba9": "WWNCoin()", +"1116f631": "setFunctionSevenPrice(uint256)", +"111723ed": "getShipDetails(uint256,uint256)", +"1118069c": "enforceKyc(bool,address)", +"111839d5": "rushTimeFloorCount()", +"11184392": "registrationDeadline()", +"111878f6": "addBonus(uint256)", +"11191186": "setReservingPercentage(uint256)", +"11196117": "setGameStateFCF(bool)", +"11196cc2": "tournamentFinished(uint256[])", +"11199872": "setSignatureChecker(address)", +"1119e8a6": "increaseNumber(uint256)", +"111a1fe9": "dividendsBuffer()", +"111a7427": "setNewAttributes(string,string)", +"111b30a7": "setFundariaTokenBuyAddress(address)", +"111b63ab": "CoinparkToken()", +"111b72c3": "accountCreated(address,bytes32,int256)", +"111bc51a": "VibeCoin()", +"111cf909": "setIntegerVaule(uint256)", +"111d7241": "tournaments()", +"111d8171": "getNews()", +"111da3a7": "popFirstFromArray(address[])", +"111e73ff": "SetAlias(uint256,bytes32)", +"111eaba0": "updateOwners(address,address[],uint256,uint8[],bytes32[],bytes32[])", +"111fba02": "NETM()", +"1120ba47": "ApolloSeptemCrowdsaleExtended(address,address)", +"112227ae": "TIER3_BONUS()", +"11223a2f": "phasePublicSale1_From()", +"1123adb1": "currentDividendPeriodNo()", +"1123cdd9": "decideSplit(uint256,uint256,string)", +"1123e608": "LogMigrate(address,uint256)", +"1123efd5": "getNumGamesStarted()", +"1123fcce": "getEmployeeCount(address)", +"11247233": "changeArrangerFeeRecipient(address)", +"1124c05a": "getLogs(uint256)", +"1124e9ea": "setfocuscardid(address,address,uint256)", +"11262105": "getLog(address,uint256,uint256)", +"11269de6": "setFreezeForCoreTeam(uint256,address,uint256)", +"1127be97": "recomputeLastAverageBalance()", +"1128798f": "isCrowdSale()", +"1128b59e": "bonusStage2FirstDay()", +"1128bbfd": "getProposalAddress(uint256)", +"112940f9": "addConsumer(address)", +"1129f644": "STAKE_START_TIME()", +"112a19af": "Enlisted(address)", +"112b3c52": "MuxeToken()", +"112b4495": "_appendTagged(string,string,string)", +"112b466e": "btcraised()", +"112c7075": "ManualDeposit()", +"112cc015": "ROLE_CRO()", +"112d6b34": "getRefBalSended()", +"112d761c": "addAnimal(uint8,address,uint32)", +"112dd4fd": "foundation_coins()", +"112e39a8": "scheduleCall(uint256)", +"112e40b5": "setBalanceOfETH(address,uint256)", +"112ea262": "authorizeProvider(address)", +"112ed3f5": "resetWeiBalance(address)", +"112f5eb8": "airdropCall(address,address,uint256)", +"112fb7c9": "finishGenerating(bool)", +"112fbe9b": "transferMinimumFee(address)", +"11302818": "addRefBonus(address,uint256)", +"11308d66": "freeLandsOf(address)", +"1132fae4": "_utoa(uint8)", +"113353a8": "changeMember(uint256,address,address)", +"1133f89d": "sendToGrowthContract()", +"11340c21": "getEGTTotalSupply()", +"1134269a": "convertForPrioritized(address[],uint256,uint256,address,uint256,uint256,uint8,bytes32,bytes32)", +"11349a6d": "dispute_end()", +"1134b7da": "emptyBody(uint256)", +"11355585": "setBlockLimit(uint256)", +"1135b3ac": "allocateInternalWallets()", +"113642e5": "getConfirmationCount(bytes32)", +"11367b26": "destroyer()", +"1136aa64": "rocketTravelTime(uint256)", +"1138001c": "lenghtenFrozenState(uint256,uint256)", +"11390441": "logic(address)", +"113990b8": "PRICE_MULTIPLIER()", +"1139a355": "releaseForTransfer()", +"113a8ed5": "Film()", +"113b2eff": "_userRefund(address)", +"113b5cf2": "checkBonus(address)", +"113bb8db": "EventTransfer(address,address,uint32)", +"113c589f": "SmartBillions()", +"113ca356": "ticket(address,bool)", +"113ce458": "winnerBidValue()", +"113d1975": "totalTokensForSaleDuringICO4()", +"113d32d0": "TournamentCreated(uint256)", +"113d8938": "addBytesSetting(string,bytes32,address,address,string)", +"113e2088": "votingData()", +"113e5b93": "dayToDate()", +"113e6b66": "fipsAddToLedger(bytes20,address)", +"113e9d4f": "DigitalKeyCoin()", +"113ee583": "aliceClaimsPayment(bytes32,uint256,bytes32,address,address)", +"113ee964": "transferFromByDate(address,address,uint256[],uint256[])", +"11400d8e": "priv_fastGetBlockHash__(int256,int256)", +"1141d7de": "URI()", +"11420f90": "MYINITIALSUPPLY()", +"11424eac": "implementInterface(string)", +"11428ce8": "DTXToken(address)", +"1142d47f": "spentFunds()", +"114385a0": "AddReward(uint256,string,string,string,uint256)", +"1143c026": "disableICOSwapLock()", +"11448a56": "scuttle()", +"11456b47": "addName(string)", +"11459f9c": "viewFinalScore(uint8)", +"1145a20f": "scheduleCall(address,bytes4,bytes32,uint256,uint8)", +"1145a49c": "test_oneTrueAssert()", +"1146015e": "setData_6(uint256)", +"11461614": "pushRatePlan(uint256,string,bytes32,bool)", +"114630e1": "ADVISORS_TOKENS_SUPPLY()", +"11463a01": "getChampion()", +"11466110": "Pretorian(string,string,string)", +"11467d7c": "deactivateUser(address,uint256)", +"1146eedd": "Referrer(address)", +"114719c5": "getLongGap()", +"11471e17": "tokensPerEther2()", +"1147b142": "MercatusDeals()", +"1148d93e": "initializedRatify()", +"1148da2f": "proposeWrittenContract(string)", +"11497c69": "PlayChapToken()", +"1149b5f5": "PendingManager(address)", +"1149f736": "unpackPrice(uint16)", +"114b4f1c": "howManyGuaranteed()", +"114beab3": "availableTokensforPreICO()", +"114d081d": "markHours(bytes32,bytes32,int256)", +"114d38a0": "notExceedingSaleCap(uint256)", +"114d69b2": "setCRLaddr(address)", +"114d8be1": "addNewOwner(address)", +"114da3e3": "mintWithEvent(address,uint256)", +"114de05e": "addMultipleRecords(uint256[])", +"114e4802": "congratulationsText()", +"114e6b37": "setDependencies(address,address,address,address,address,address)", +"114f0e49": "player4()", +"114f9511": "pay(bytes32,uint256,address,bytes)", +"11506970": "freezeTokensAmount()", +"11506d4b": "forgiveThis(address)", +"11513ba5": "setTTWTokenAddress(address)", +"11552212": "Hodl(address,uint256)", +"1155d042": "accumulateFee()", +"1155f60f": "RoundBetStarted(uint256,uint256)", +"11563b04": "ETokenAirdrop()", +"11566dd7": "fundingMax()", +"11567f95": "readnameXaddress(address)", +"115793d4": "newClockmaker()", +"1158183a": "isPreIcoActive()", +"11589260": "_createProxy(address,address)", +"1158f696": "createMarriage(bytes32,bytes32,uint256,bytes32,bytes32)", +"115976c4": "admin1()", +"1159f39b": "transferFromCroupier(address,uint256)", +"1159fd53": "isAContract(address)", +"115a43e9": "getWarriorOwners(uint256[])", +"115b7fa8": "setOverBalanceLimitHolder(address,bool)", +"115bd3f8": "rejectInvestmentWithdrawal()", +"115bdfe7": "currencyMap(address)", +"115ce332": "isAddressMember(address)", +"115d5376": "passPeriod(uint256)", +"115e397e": "getTotalchannels()", +"115e9375": "getUint256Min()", +"115ecc58": "fundStorageVault()", +"115ece4c": "getTokenAmount(address,uint256)", +"115f2be2": "customBuyerLimit(address)", +"115f2f2f": "tokensPerUSD()", +"115f6795": "cratesSold()", +"115fd072": "PowerStandardToken(uint256,string,uint8,string)", +"1160a807": "addWinTickets(uint256,uint256)", +"1160b93b": "calculatePayrollRunwayInMonths()", +"11610c25": "bet()", +"116134ee": "mask()", +"11613fc9": "godBank()", +"116191b6": "gateway()", +"1161a5c8": "registMyHns(string,address)", +"1161d226": "_participateIsAllowed(uint256)", +"1162247e": "lastTwoAmbassadorsAdded()", +"11642134": "produceEmeralds(address,uint256)", +"1164e11e": "getPurchaserAddressCount()", +"1165214d": "NotToRent(uint256,uint256,address)", +"1165dce2": "getTeamList()", +"11667335": "adminRetrieveContractConfig3()", +"1167ecb2": "finishPreICO()", +"116877cc": "changeAuthority(address)", +"116a6f6c": "BONUS_TIER_7_LIMIT()", +"116a8221": "airFropTracker_()", +"116b556b": "founder1()", +"116b7aa9": "setGameGiftOnceAmount(uint256)", +"116c347a": "_withdrawTokensTo(address)", +"116c6eab": "getProfitShare(address)", +"116c92b7": "addAccount(address,uint8,bool,address)", +"116d816b": "assetManagement(address)", +"116e4ca9": "flag_is_Online_Solidity_Decompiler_NB()", +"116e8726": "crowdsaleDasTokensChangeBeneficiary()", +"116ea900": "createETHCardCollectible(uint8,uint8,uint256,address,uint256,uint256,uint256)", +"116fb2a8": "setTokensPerETH(uint256)", +"116fe01b": "ClipperCoin(uint256,string,uint8,string)", +"11704f52": "tradingLive()", +"1170a759": "withdrawalCoolingPeriod()", +"11715316": "CorpCoin(address,uint256)", +"11715c94": "getBonusRateForAmountBased(uint256)", +"11717501": "IEFBR14Contract()", +"11719d7e": "getCrowdsalesForUser(address)", +"11725ac5": "Determine_FiveLinkGame_Result(uint32)", +"11728ecf": "toKey(address,uint256)", +"117328b9": "LogBidReturned(address,uint256,uint256)", +"11737d7b": "getFreeTime()", +"11738735": "bnbWithdrawEnabled()", +"1173ca7d": "CashBackToken()", +"11746e5e": "getSpaceshipProductCount()", +"1174ca26": "totalLossValue()", +"117546c5": "lastParentBlock()", +"1176205e": "setMaxRequestQuota(uint256)", +"1176f5f7": "setDisputeData(uint256[2])", +"1177275e": "ZferToken(address,uint256,uint256)", +"117735f0": "NewQuest(string,bytes32)", +"1177645b": "set_devContract(address)", +"11776737": "CrowdServe(address,uint256,uint256)", +"11777af7": "refundVault()", +"1177892f": "getBalanceByAdress(address)", +"1177dc34": "nullFace(address)", +"117803e3": "OWNER()", +"11780a01": "erc20tk()", +"11789bec": "njbToken()", +"1178f51a": "ubiatarPlayVault()", +"11791368": "removeCurrentIcoRound()", +"1179778b": "setBasePremium(uint256)", +"1179cf71": "lowEtherBonusValue()", +"117a0a22": "CosmoToken()", +"117a4425": "setII_S(uint256)", +"117a5b90": "games(uint256)", +"117b198e": "soldTokensLimit()", +"117b4705": "retract(bytes32)", +"117b652b": "rewardinterval()", +"117cae9a": "editStartlist(uint256[],uint256[])", +"117d4128": "getOrder(uint128)", +"117d82d6": "playCount1()", +"117d94f5": "sendFundsToWallet()", +"117ddaf9": "weiRaisedInPreICO()", +"117de2fd": "payout(address,uint256)", +"117df088": "withdrawDeposit()", +"117e1ebb": "lastRoundWinnerInfo()", +"117e62fd": "getLastAuctionsWinningBid()", +"117f8684": "changeBZxVault(address)", +"1180788e": "searchString()", +"1180d67e": "angelFoundationShareNumerator()", +"1180f83b": "changeFMPcontractAddress(address)", +"1181324b": "updater(address)", +"11815312": "grantTeamAdvisorSupply()", +"1181a459": "freezeAdministrationContract()", +"11822cb7": "UTPL()", +"11823d43": "OCMarket()", +"11823e04": "advisorAllocation()", +"1182c796": "debug_is_dry()", +"11831234": "testFailPullWhenStopped()", +"1183429a": "removeAddressesFromWhitelist(uint256,address[])", +"11844aae": "period2End()", +"11851b5e": "BOARD_3()", +"11857ed7": "spendAdvertising(uint256,uint256)", +"1185a6b9": "getBBFarm(uint8)", +"118644f6": "OxBtcDex(address,address,address,uint256,uint256,uint256)", +"118654f1": "XinXianToken(address,uint256)", +"1186560e": "increaseEthRaised(uint256)", +"11873ee7": "SetGuestName(string)", +"1187497e": "updateContractState(uint256,uint8)", +"1187648b": "testInstant(uint256[3])", +"11878333": "InitialToken(string,address,uint256)", +"1187d66e": "votedNo()", +"1188189e": "storeSomething()", +"1188263c": "MBOTCOIN()", +"1188324b": "soldCWC(address,uint256,bytes32)", +"11883c6d": "make_hash(uint256,uint256,address,address,uint256,uint256)", +"11886bd4": "view36()", +"118934cc": "ownerCommission()", +"118a0aae": "addHero(string,address,address,uint256,uint256)", +"118a9db3": "revenueShare(uint256)", +"118aa5a1": "convertToRate(bytes32)", +"118b0f04": "santToken()", +"118b53ec": "LogTeamTokensTransferred(address,uint256)", +"118cbccb": "etherWeiRate()", +"118ceab6": "lastAdjust()", +"118da6fb": "getGameCompleted(uint256)", +"118dd8fc": "bonusesAfterClose(uint256)", +"118e1f2e": "globalOrderSerial()", +"118e31b7": "getBorrowBalance(address,address)", +"118e4575": "get_branch(uint256)", +"1190516d": "GetByte(uint256,uint256)", +"1190647c": "buyerHistory(address,address,uint256,uint256)", +"11916ce7": "moveIcoTokens(address,address,uint256)", +"11933e4b": "Transmuted(address,address,address,uint256,uint256)", +"11937ccd": "adminUpdateStartEndTime(uint256,uint256)", +"1193e38e": "setPercent3(address,uint256)", +"1194ed46": "payerString()", +"11952369": "onRemove()", +"1196004f": "newCycle()", +"1196245b": "registerDIN()", +"1196493c": "getJobContracts(uint256,uint8)", +"119669cb": "GiveChipGitf()", +"1196deda": "sendTeamTokens(address,uint256)", +"1196fb60": "contributeToPrizePool(string,string,string)", +"119739ff": "privatesaleEnds()", +"11997dc6": "BASE_DURATION()", +"119aa5c8": "checkForward(bytes)", +"119b22b3": "roundNum()", +"119c1c23": "tokenAllowance(address,address)", +"119cb2ff": "tokenPriceDivides(uint256)", +"119cbed6": "rtm_contract()", +"119cc328": "setFoundersWallet(address)", +"119ce91b": "voteInfo(bytes32,address)", +"119d0cb5": "DumbCoin()", +"119d97ee": "team4Address()", +"119d9bfe": "KudosTokenFactory()", +"119dd1b0": "presaleLimitReached()", +"119e045b": "checkMaintenanceTime()", +"119e5cdf": "creationUnit()", +"119ebe89": "getExternalCurrencyProcessor()", +"119ecb35": "tokensaleStageNow()", +"119ee4ab": "batchCancelAuctions(uint256[])", +"119eeb9c": "darx()", +"119f118d": "ethToCash()", +"119f1edb": "claimPlatinum(uint64)", +"119f2546": "distributeEBTC(address[])", +"119f2c9f": "transferCard(address,uint256,uint256)", +"119f32dd": "adminIsDead()", +"119f8747": "support()", +"119fdee2": "sha256ofString(string,string)", +"11a00327": "deleteOrder(uint256)", +"11a09ae7": "airDropTracker_()", +"11a0c16c": "dsquare(uint256,uint256)", +"11a10508": "switchToNextSale(address)", +"11a10698": "ERC223Token(uint256,string,uint8,string)", +"11a153df": "getBlockNumSinceInit()", +"11a1b31e": "commandGetBonusTime()", +"11a4c710": "buyRecipient(address)", +"11a5a793": "percentageToKill()", +"11a5b9bc": "migrateBlock(string,uint256,uint256,uint256,address)", +"11a76729": "transferFromInBatch(address,address,uint256[])", +"11a76f37": "addStakeHolder(address)", +"11a800bc": "addressOf(uint256)", +"11a881e8": "setFee(uint256,uint16,uint256)", +"11a88e05": "preSale2()", +"11a8f413": "latestRoundId()", +"11a98193": "ETHfund()", +"11a9c3c2": "sellDOTCH(uint256)", +"11a9f10a": "noToken()", +"11aa2722": "assignOldUserFunds(address[],uint256[])", +"11aa7e26": "setKevin(uint256)", +"11aaf884": "HCPToken()", +"11ab19f8": "addTokenToTotalSupply(uint256)", +"11ab27d2": "HydroCoinPresale()", +"11ab31ed": "rejectProposal(bytes32)", +"11ac20c0": "cancelLottery(uint32)", +"11adbaad": "getListOfAddresses()", +"11ae40b2": "Presale(uint256,uint256,uint256,uint256)", +"11ae6aee": "_mint(int256,uint256,uint256,uint256)", +"11aee380": "memberCount()", +"11af07e2": "create_event(string)", +"11af3c68": "divest(address)", +"11af6564": "getCurrentGasPrice()", +"11affa5c": "setEggTable(uint16,uint32[])", +"11b059c6": "mintableProperties(uint256,bytes32)", +"11b2b22a": "FRKT()", +"11b35c48": "AGSCoin()", +"11b4bbdb": "mintTokens2(int256,address,uint256,uint256)", +"11b546f6": "firstWeekTokenPrice()", +"11b639d9": "currentTokenCount()", +"11b63a17": "CROWDSALE_TOKENS_NUMS()", +"11b70018": "bookingList(address,uint256)", +"11b7702a": "ImportTestA()", +"11b7d483": "addressGains(address,address)", +"11b8f957": "dayAfterDeadline()", +"11b97324": "participateCrowdsaleSelected(address[])", +"11b98e12": "isMainSaleTokenRaised(uint256)", +"11b9fee8": "ForkChecker(uint256,bytes32)", +"11ba65e5": "_setUpgradeabilityOwner(address)", +"11baae84": "Contribution(address,address,uint256,uint256)", +"11bab044": "getCreditFundAddress()", +"11bb20da": "withdrawBattleValue(address,uint256)", +"11bbb155": "goLong()", +"11bbdf53": "maxOpenAttacks()", +"11bc0a34": "BuyOrder(uint256,address,uint256,uint256,uint256,uint256)", +"11bc5315": "drawer()", +"11bcd573": "SetTest(address)", +"11bcd830": "MinDeposit()", +"11bd85ad": "Owned2()", +"11bdfe19": "revertBet(uint256)", +"11be40e0": "transfer(address,address,address[],uint256[])", +"11bec062": "EVT()", +"11bed352": "eip20Approve(address,address,uint256)", +"11bf68cf": "_issue(bytes32,address,address,uint256,bytes,bytes)", +"11bfe017": "playerWinItems(address)", +"11c07649": "getMainAccount(uint256)", +"11c09100": "calculateNumWeiToIssue(uint256,uint256)", +"11c0b024": "_setDamgeValue22(uint256)", +"11c0f931": "bindSmartIdentity(string,string)", +"11c12715": "LCToken()", +"11c134e1": "sumPreICO()", +"11c15dcc": "purchaseBalances(address)", +"11c19d3c": "SpiderFarm()", +"11c1dc82": "monakojima001()", +"11c1ddd9": "addMedalBurned(uint16)", +"11c28e1a": "initial_tokens()", +"11c33625": "royaltyInformationContract()", +"11c3a62f": "GetLuckyResults()", +"11c3fec5": "CreateLand(uint256,address)", +"11c4d4f4": "communityAddr()", +"11c4dbf4": "auctionReputationReward()", +"11c4e123": "rootHashOf(bytes32)", +"11c52ec0": "setMaxWagerWei(uint256)", +"11c57757": "tixPromoDeposit()", +"11c5a234": "logResult(int8,string)", +"11c60418": "remAdmin(address)", +"11c7d6bd": "issueNewSeries()", +"11c8efac": "lifeA(uint256)", +"11c911d9": "unreserve(address,uint256)", +"11c91914": "isUnderLimit(uint256)", +"11c93d03": "crowdsale_eth_refund()", +"11c94362": "COMMUNITY_RESERVE()", +"11c98718": "getMsgDataBefore()", +"11c99f3b": "FundsWallet()", +"11c9ccf6": "deleteCustomer(address)", +"11ca3c63": "satoshiRaised()", +"11cb0bcf": "getParticipantOriginWithIndex(uint256)", +"11ccf822": "beneficial()", +"11cd98ed": "convertToAllTable(uint256,string)", +"11cda415": "peer()", +"11cdf27a": "addVersion(address)", +"11ce0267": "storageContract()", +"11ce3d24": "postMonForMon(uint64,uint64)", +"11ce3d2c": "GQHToken(uint256,string,uint8,string)", +"11ce4556": "TOKEN_TO_CREATOR()", +"11ceb21c": "ZigZagSupply()", +"11cec8f0": "getTradeByIndex(uint256)", +"11cfb19d": "freezedTokenOf(address)", +"11d12402": "testEasyPropose()", +"11d15e17": "freeReadings(address)", +"11d17e78": "Blocker_destroy()", +"11d295bf": "_getShipName(uint256)", +"11d36bf5": "reservedSaleEther()", +"11d36c4f": "setBoolF1F2F3(bool,bool,bool)", +"11d40001": "EthernautsVendingMachine()", +"11d414af": "changeIcoStatus(uint8)", +"11d4f314": "setBounties(address[],uint256[])", +"11d60664": "ethtoeth(address,uint256,uint256)", +"11d62de9": "ownerShip(address,address)", +"11d634ac": "HamsterMarketplaceToken()", +"11d7b2fe": "unlockAccount()", +"11d817f2": "getUsers(address,bytes32)", +"11d8657a": "finalizeAndPayoutForHopeful(uint256,uint256,uint256,uint256)", +"11d87c4e": "initGame(uint256,bytes32,bytes32,bytes32)", +"11d89f3a": "setResearchAndDevelopment(address)", +"11d8cac7": "view_state()", +"11d986e6": "BlockSigner(uint256)", +"11da60b4": "settle()", +"11da9598": "add2MarketPlace(address,uint256,uint256,uint256)", +"11daa2d0": "jpPercentage()", +"11daa7a0": "gamessage(address,address)", +"11daca81": "joinPot()", +"11daea9c": "removeExchangeTestAccounts(address,address)", +"11daf56a": "MainFabric()", +"11db0176": "unLockFreeze(uint256)", +"11db3be7": "invokeVerification(uint256,uint256,uint256,string,bytes32[2])", +"11db6e0e": "ownsSouls(address)", +"11db8d1b": "burner(uint256)", +"11dbb12e": "removePolicyRule(bytes4,address,bytes32)", +"11dc273d": "currentBalances(address)", +"11dc45c9": "withdrawPrize(address)", +"11dc4703": "removeUser(uint256)", +"11dc6816": "getAllowanceOwnerValue()", +"11dcee2f": "priceCallback(bytes32,uint256,bool)", +"11dd2837": "_updateCurrentStage()", +"11dd39b4": "cancelApprove(bytes32)", +"11dd46b4": "calVoteResult()", +"11dd576d": "userCheck(bytes32)", +"11dd8845": "getRecord(string)", +"11ddf693": "debug_changeOwner(address)", +"11df19f7": "_medalTotalSupply()", +"11df9995": "coin()", +"11e0de8b": "tickets10kprice()", +"11e13c32": "BONUS_ICO_STAGE1_PRE_SALE4()", +"11e14b2e": "employees()", +"11e21245": "weiSoftCap()", +"11e3655f": "updateInstantToken(address)", +"11e38468": "MarketboardListingComplete(address,uint256,uint256,uint256,uint256)", +"11e3d606": "min_investment_eth()", +"11e48cdf": "tokensAllocatedTotal()", +"11e5b955": "Order_sell(address,uint256,uint256)", +"11e5ea57": "teamsWallet()", +"11e67c57": "totalBuyOrders()", +"11e6a0fd": "getProviderDetails(uint256)", +"11e847b6": "HATCHBACK()", +"11e84c71": "claim(bytes32,string)", +"11e956c8": "isMasterNode()", +"11e96ab6": "LockCredits(address,uint256,uint256)", +"11e99c22": "arrival()", +"11eb6d4b": "GxAuth()", +"11ebbf24": "createWallet()", +"11ec76cb": "LogClaimHalvingSubsidy(address,uint256,uint256,uint256)", +"11ec7b4a": "balancePrivateSale()", +"11ed1bf6": "artworkIndex()", +"11ed7b42": "thirdItemWrong()", +"11ee0ec5": "getZone(uint256)", +"11ef8d4b": "delegateBonusTokens(address,uint88)", +"11efbf61": "getFeePercentage()", +"11efec9b": "shareHolderByNumber(uint256)", +"11efff1f": "unlockRecordAdd(uint256,bytes32,string,string,uint256)", +"11f02c87": "createHybridization(uint256,uint256)", +"11f03b83": "GiftCrowdsale(uint256,uint256,uint256,uint256)", +"11f0b806": "getDutchAuctionToCraftAddress()", +"11f11b9c": "editName(string,uint256)", +"11f1507e": "getAssetToken(uint256)", +"11f15380": "clientKeysCount(uint256)", +"11f1fc99": "withdrawTreasury(uint256)", +"11f217c7": "getNodeAddress(address)", +"11f29729": "setsymbol(string)", +"11f2a395": "finalWithdraw()", +"11f2eed1": "convertEthToMet(uint256,int256)", +"11f37ceb": "get_price()", +"11f3eecd": "sellTokens(uint8)", +"11f43157": "openCrates()", +"11f45f23": "buyVIBET()", +"11f48166": "IntroToken()", +"11f4a9ce": "KernelProxy(address)", +"11f4ba60": "importBalanceOf(address)", +"11f54545": "SmatrOCrowdsale(uint256,uint256,uint256,address)", +"11f58e99": "maxTokensSold()", +"11f598cd": "editPersonalNote(string,uint256)", +"11f6649b": "authorizers(uint256)", +"11f6ad2b": "lastWinnerId()", +"11f72496": "testT()", +"11f82a2b": "_getPolishingPrice(uint256)", +"11fa3d14": "LeekCoinCrowdsale(uint256,uint256,address,address)", +"11fa3f4f": "weiUsdExchangeRate()", +"11fa7da2": "getInvestmentsInfo(address)", +"11fa9ea6": "narrowCyclePrize()", +"11facae2": "setValidatorCount(uint256)", +"11fb57e2": "TokenManager(address[],uint256)", +"11fb584a": "BloccaConto(address)", +"11fbad62": "_rejectTransfer(uint256,uint256)", +"11fdff0c": "advisorPool()", +"11fe12b3": "isRecovery(address,address)", +"11fe773d": "memcpy(uint256,uint256,uint256)", +"11ffb1d4": "deleteMember(address)", +"11ffe7c9": "getUserDocCount(address)", +"12005e53": "alexToken()", +"1200617f": "auction(uint256)", +"12007984": "addBalanceToGame(uint256)", +"120149a1": "readCube(bytes32)", +"120184fa": "gvCF()", +"1202be01": "eth2mnt()", +"12032e52": "getSecondaryRecord(string)", +"12035ca6": "setData_3(uint256)", +"12038a01": "totalDevelopmentFundEarned()", +"12039fed": "mintMedal(uint256)", +"12045d3f": "VKTToken(uint256,address)", +"1204bab4": "popcount(uint64)", +"1204ce91": "Debug(bytes32,uint256)", +"1204d27c": "coinIssuedBurn()", +"12055758": "checkOwner(address,uint32[11])", +"12058764": "lockBalanceGroup(address,uint256)", +"12059f68": "LoversAdded(string,string)", +"12065fe0": "getBalance()", +"1206dc5f": "transferMarketplaceOwnership(address)", +"12074a46": "getUserBets()", +"1207bb8e": "crowdsalePrice()", +"1207f0c1": "issueTo(address,uint256)", +"1208a256": "getLock(address,uint256)", +"1209073c": "updateBalances(uint256)", +"120960de": "depositInPot()", +"1209b1f6": "ticketPrice()", +"1209f7ed": "withdrawPledge()", +"120bd501": "approves(address,uint256)", +"120bd8f5": "setMinimumBetValue(uint256)", +"120c5194": "getCollectReporterAddress()", +"120c52ef": "calculateDemurrage(uint256,uint256)", +"120c7efd": "certifier()", +"120cc993": "isEmptyOwner()", +"120cf351": "bitdietecToken()", +"120dae83": "setMinimalContribution(uint256)", +"120e6c16": "_finneyToWei(uint32)", +"120e8f05": "calculateMintAmount()", +"120fe731": "Tropycoin()", +"120fe89b": "getPolls()", +"121114e1": "SuperTicketCoin(uint256,string,string)", +"1211540c": "withdrawPartial(uint256)", +"121166ef": "clearTrade(bytes,address,bytes32,address,uint256,int256,string)", +"1212c12f": "RecordManager()", +"12136918": "setMaxTranferLimit(uint256,uint256,uint256)", +"12136e57": "ERC777ERC20BaseToken(string,string,uint256,address[])", +"12146222": "highSupport(address)", +"1214ab82": "Lightning()", +"121557a3": "Avatarium()", +"121563ae": "Axioms()", +"12156c66": "snowflakeCall(address,string,string,uint256,bytes,bytes)", +"1215f8ef": "releaseValue3()", +"1216e771": "expiration(uint64)", +"12179a2d": "pendingReferals(address)", +"1217b6ff": "TransactionConfirmedByMediator(uint256,uint256)", +"121839f6": "addConfirmationNode(string)", +"1218d6bf": "decree()", +"12192649": "countOfParticipants()", +"12192b00": "getInitialHP(uint64,uint64,uint64)", +"1219bcfc": "MolToken()", +"1219d5c8": "APM_APP_NAME()", +"121a47ac": "nonceForPublicKeyX(uint256)", +"121a496b": "Lupecoin(address,address)", +"121ab65b": "LogChangeSponseeAddress(address)", +"121af083": "DFSCrowdsale(uint256,uint256,uint256)", +"121b5a25": "calculateCompensation()", +"121b68c1": "ERC223Received(address,uint256)", +"121c2b35": "burnPXLRewardPXLx2(address,uint256,address,uint256,address,uint256)", +"121c5e91": "putOnSale(uint256,uint256,uint256)", +"121d6426": "senderWeiBalance()", +"121dbc31": "changeMax(uint256)", +"121e0d4e": "godPause()", +"121e6832": "frozenDaysForPartner()", +"121e8122": "unQuarantineAddress(address)", +"121eb9e2": "createMintRequest(address,uint256,string)", +"121ef243": "createUser(string,uint256)", +"121f0a10": "resolve(uint256,uint256,string,bool)", +"121f2081": "testCreateWithForeignParent()", +"121fb72f": "ownerSetInterestSetter(uint256,address)", +"1220c6ed": "registerOwner(address)", +"12217378": "oldTokenTotalSupply()", +"1221a071": "cmctcybermovie()", +"1222c25a": "redeem(string)", +"1222e789": "isPublicSaleWithBonus()", +"122366fd": "PACCOIN(uint256,string,string)", +"1223716a": "masterHas()", +"1223f208": "withdrawadm(address,uint256,uint256)", +"12243b67": "deletePlayer(address)", +"12247a57": "IncentCoffeeToken()", +"12253a6c": "stopContract()", +"12263017": "setBool82(bool,bool)", +"122636b1": "getRemainingDaysToThirdPhase()", +"12267abc": "PRICE_6()", +"1226afde": "numtickets()", +"1226be3e": "NotifyMe(address,address)", +"1226cd98": "allocate(uint128,uint256)", +"1226f5f8": "wei_per_token()", +"12278825": "Git(uint256)", +"1227d0f4": "gameListOf()", +"122809dc": "deposits_refunded()", +"12285576": "Donated()", +"12286715": "SimpleSavingsWallet(uint256)", +"12287629": "consultantsKey()", +"1229987d": "collectProfitERC20(address)", +"1229af09": "FreshROI(uint256,uint256)", +"122a1949": "Group_1()", +"122a7723": "GetPriceMultiple()", +"122b0e85": "getVerificationLevel()", +"122bdc32": "ThemKhoaHoc(string,uint256,string,string,string,string)", +"122d34d9": "returnToken(string,uint256)", +"122d9a8d": "piEndTime()", +"122e04a8": "WITHDRAW_ADDRESS()", +"122e74f4": "getWeiLeft()", +"122fe685": "presaleAddress()", +"122ff73a": "_getStrengthDexterityVitality(uint256,uint256,uint256)", +"12302932": "reinvestAffiliate()", +"123119cd": "payer()", +"12317402": "betMinAmount()", +"123180a2": "testInitialBalanceWithNew()", +"12333b32": "StartGame(uint256)", +"123398aa": "johnnycoin()", +"1233f543": "distribute55M(address[])", +"12342248": "CreditleetToken()", +"12360151": "dayPotLeader()", +"123702e2": "profitAddress()", +"123731c4": "addressPositions(address,uint256)", +"1237b2a6": "TotalPot()", +"1237dd9a": "decimalMul(uint256,uint256)", +"123802e1": "forceRefundState()", +"123807b2": "markParticipantIdentifiend(address)", +"123841cf": "MintedGreen(address,uint256)", +"12386471": "sumExpOffset(int256,int256[],uint256,uint8)", +"1239ec8c": "batchTransfer(address,address[],uint256[])", +"123b06d5": "currentPendingParticipants()", +"123b1dae": "accountOfP(address)", +"123b5e98": "setAttributeSigned(address,uint8,bytes32,bytes32,bytes32,bytes,uint256)", +"123ba3e2": "changePrizeSplits(uint256,uint256,uint256,uint256,uint256)", +"123c047a": "createShares(uint256)", +"123c3a4f": "maxTokenSupplyICO2()", +"123c3ada": "getMedalInfo(uint256)", +"123cc082": "setJoinedCrowdsales(address)", +"123d997a": "removeAllowCnsContract(address,bytes32,address,bytes32)", +"123e4112": "arrayToCrabPartData(uint256[])", +"123f513c": "testDeadChickenCnt()", +"12407f98": "toSaleWallet()", +"1240adc8": "stoppCrowdsale(uint256)", +"1240b381": "PermarektToken()", +"1240de76": "testUnexpiredBalance()", +"124135c9": "exit(bytes,bytes,uint256,bytes,bytes,uint256,bytes)", +"1241d7a7": "setEnableRecord(bool)", +"1241ee7d": "profit(uint256)", +"1242031a": "ZhaoGuCoin()", +"12424e3f": "approve()", +"124279a7": "activeSignersCount()", +"1242e96d": "updateMarketPhase()", +"12432fee": "canSendWebGifAmount()", +"124442be": "approveIncrease(address,uint256)", +"1244861e": "addTokenData(uint256,string,string)", +"1245c653": "currentDrop()", +"1245e347": "teamWalletAddress()", +"1245f45e": "getRunningAuctions()", +"12460fdd": "confirmCeilingRaise(bytes32)", +"12468cc5": "getWifiPwd(string)", +"12474435": "unfreezeAwardedTokens(address)", +"1247caf4": "ChangeFounderMulSigAddress(address,uint256)", +"1248b101": "claimDay(uint256)", +"12491ad9": "ReverseRemoved(string,address)", +"1249209e": "returnExcess(address)", +"12494160": "isHolder()", +"12495a5d": "ContributionWallet(address,uint256,address)", +"1249c58b": "mint()", +"1249d3b8": "isEcoAllocated3()", +"124abb0a": "_checkAndCallSafeTransfer(address,address,uint256,uint256,bytes)", +"124b0939": "afterCallBack()", +"124c27a9": "addPrize(uint16,address,uint256,uint256,uint256)", +"124c2dde": "executeBet(address,address,uint256)", +"124c32a1": "enter(bytes32,bytes8)", +"124cf830": "isSecondaryOperator(address)", +"124cfc8c": "beneficiaryOf(uint256)", +"124d3396": "releaseICO()", +"124eaee6": "Identity()", +"124f0b31": "rewardDecimalPercentByTime(uint256)", +"124f2418": "deleteBytes32Value(bytes32)", +"124fc7e0": "increaseSupply(uint256,address)", +"124ff29b": "getAyantDroitEconomique_Compte_5()", +"12504109": "getLast24hSendingValue(address)", +"12508ea4": "play(uint256,bool)", +"1250ca3d": "getUserPaybackRate()", +"12511c14": "transferEnable(bytes20)", +"12514bba": "transfer(uint256)", +"12529d22": "getRank10()", +"1252aadb": "EightBitToken()", +"1252cc33": "processTickets()", +"125385f2": "COLOR_GREEN()", +"1253b82f": "travelPrice()", +"1254e64d": "transferEthers(address,uint256)", +"1254f0dc": "startRate()", +"12555df2": "zasxzasxqaqq()", +"12568c24": "blanceOf(address)", +"125716d6": "getContractStatus(address)", +"12571a33": "migrateInternal(address)", +"12582c1a": "setAdminMode(bool)", +"12592381": "incomeAllocation()", +"12599d3f": "GlobalEnergyDigitalChain()", +"1259c00d": "stampIndextodissolved(uint256)", +"125b8f06": "isInNextGeneration()", +"125bfb66": "claimToken(address,address,uint256)", +"125d5d71": "startEpochTimestamp()", +"125e527e": "Ether()", +"125f67e7": "SunriseCoin()", +"126004b8": "deleteRole()", +"12600aa3": "concatStrings(string,string)", +"1260c19a": "showInterval()", +"12610b5b": "pendingEditionsOf(address)", +"1261795d": "withdrawGas()", +"126262a3": "init(address,address,address,address,address,address,address,address,address,address,address,address,address,address)", +"1262d6be": "fortnightsFromLast()", +"1262eb73": "queryPlayer(uint32)", +"12630012": "LEOToken()", +"12635cd8": "I_store_ETH_to_contract()", +"12635d26": "getTotalWeiContributed(uint16)", +"1264299a": "endPresaleTime()", +"126596e7": "ownerSetCallbackGasPrice(uint256)", +"12660306": "getLogos()", +"1266cae2": "setCrowdsale()", +"1266d5f9": "getWitnessesCount()", +"126702a0": "DOW_TUE()", +"12671fb4": "balanceAirDropToken(address,address)", +"12675713": "getTestekTokenIssuance(uint256,uint256)", +"1267961b": "ERC777BaseToken(string,string,uint256,address[])", +"12686aae": "transferLocked()", +"1268cb71": "XBPToken()", +"1269359a": "enableWallet(address)", +"126a04b5": "transferFromSGNToken(address,uint256)", +"126a710e": "dnsrr(bytes32)", +"126af4af": "tokensContractBalance()", +"126b12e7": "initICO()", +"126b6e17": "downX(uint256)", +"126b85e7": "addLevelQuest(address,uint256)", +"126c1232": "addPanelist(address,address)", +"126c13c8": "toldYouSo(bytes32)", +"126c27b5": "setETHAssets(address)", +"126d20f1": "getBestPromouter()", +"126d5b83": "getPoolAmounts()", +"126d9882": "updateLogoFee(uint256)", +"126eac43": "getContribution(address,address)", +"126f992c": "forceOff()", +"126fb2a3": "getCurrentRoundPrizePot()", +"126fbb3a": "removeFunds(uint256,uint256,uint256,uint256)", +"127043c3": "feesRate()", +"12706ccd": "NIGIZ()", +"12709b90": "SuddenDecayingTokenFunction()", +"1270a4d3": "setMinSale(uint256)", +"12711ae3": "wtech2()", +"127157c3": "activateDevice(address)", +"1271bd53": "upgradeContract(string,address)", +"1271f09a": "approve(address,uint256,address)", +"12724689": "addToTokenTransferDisallowedList(address)", +"1273f6e7": "BIGSELL()", +"12746e9f": "changeParam(uint256,uint256,uint256)", +"1274c3f3": "announcementHash()", +"127616f9": "releaseMultiWithStage(address[],address)", +"127714c7": "getBudget()", +"12778e8d": "addDistributionContract(address)", +"1277b0c9": "createBid(bytes32,uint256)", +"1277b4f1": "createCandy(string,uint256)", +"1277e24f": "payOneTimeFee()", +"127810bc": "getCompany()", +"12783f2f": "VESTING_TIMES()", +"12788f97": "B0xPresale(address,address,address)", +"1278cec4": "WinnerPaidEvent(address,string)", +"12795d7f": "putSaveData(string)", +"127a0dd9": "setJypcBonus(uint256)", +"127afec6": "MakerTransferredAsset(address,uint256)", +"127b0901": "delayAutorelease()", +"127b0efd": "gauntletRequirement(address,uint256,uint256)", +"127b4da5": "getAmountForCharger(uint256)", +"127c3d45": "getUserLibrary()", +"127cc6bf": "medalTotalSupply()", +"127cf0b9": "multiInvokeWith3Args(address,string,address[],address[],uint256[])", +"127dd730": "donationNum()", +"127e499c": "firstBonus()", +"127eca3f": "totalDividendPayments()", +"127ecfa9": "getMinReward(string)", +"127effb2": "operatorAddress()", +"127f0b3f": "roundCount()", +"127f1068": "pieceprice()", +"127f2d2c": "shutForDai(uint256)", +"127f3374": "calculateselfOdd()", +"127f902f": "addressFundReserve()", +"12800751": "determineWinner(uint256,uint256)", +"12806653": "setMaxContributionPhase2(uint256)", +"1280db73": "donate(address,string,string)", +"12810fd8": "Lesson_6(address,uint256)", +"1281311d": "buy(uint256,uint256,uint256,uint256)", +"1281619b": "SeeleTokenLock(address,address,address)", +"12818f0c": "withdrawNac(uint256)", +"12819817": "setXauForGasCurrator(address)", +"1281d056": "test_threeValidEqBool()", +"12821b5e": "sellingPrice()", +"1282467d": "checkTip(uint8)", +"12826f30": "isEthereumBased(address)", +"1282cc2a": "getNumContributionsDID(address,address)", +"1283c377": "FixedCapSampleCoin()", +"1283e328": "bonusOf(address)", +"128424a7": "sort(address[])", +"1284c8f5": "transferSafety()", +"1286d9e8": "setRowColors(uint16,uint8,uint256,uint256)", +"1286e393": "removePartOwner(address)", +"12874688": "setMinBid(uint256)", +"12883df0": "lcSold()", +"12889639": "settleFeePub(address,address,uint256,address,uint256)", +"1288c42a": "Prism()", +"12892b7f": "setblnpereth(uint256)", +"128952e4": "addElements(bytes32[])", +"128a0b2c": "approveFund(address,bytes)", +"128a1c74": "createUpdateRisk(bytes32,bytes32,uint256)", +"128a3765": "clearTransferInsToken(address)", +"128b265f": "addBridgeTokenFeeReceivers(uint256)", +"128b3bc0": "_withdrawFunds(address,uint256)", +"128bad8d": "MFL()", +"128bfcae": "startStake(uint256,uint256)", +"128c785f": "ICACOIN()", +"128cf7c5": "SEC_PER_ETHER()", +"128d7215": "addRequest(string)", +"128d9281": "checkTransferFunction(address,address,uint256)", +"128e0423": "getSenders()", +"128e1329": "offerHelpUsingBalance(address,address,uint256)", +"128e1af0": "withdrawFromPot(uint256)", +"128e3761": "firstTeamContributorId()", +"128e87e0": "tokensAfterCrowdsale()", +"128eb401": "expiredCrates(address)", +"128ef181": "ticketMag()", +"128f04e7": "importPresaleBalances(address[],uint256[])", +"128f060a": "perETH(address)", +"128f8e04": "admin_active_payable()", +"12901f26": "purchaseTokens(uint256,address,address,address,address,address)", +"12907e08": "lastBlock_f6Hash_uint256()", +"1290a2b4": "rightSharePriceRateOfIncrease()", +"1290aed9": "AcornPotSplit(uint256)", +"12919d90": "setMoneyManager(address)", +"1291ebdd": "getAllowedTokenAt(uint256)", +"1292de0b": "sendTokensTo(uint256,address)", +"129441cf": "_cMoney(uint256,uint256,uint256,uint256)", +"129484b6": "changeFeeRecipient(int256,int256,int256,int256,int256,int256)", +"1294d4db": "assignReferral(address,address)", +"12950877": "setOrCacheValidityBond(uint256)", +"12958f1c": "getUserName()", +"1296830d": "transferPreSigned(bytes,address,uint256,uint256,uint256)", +"1296aef3": "timeInvestInMinute()", +"1296d47d": "signedApproveHash(address,address,uint256,uint256,uint256)", +"1296ee62": "transferAndCall(address,uint256)", +"12973afd": "isNotDuplicateTreasure(bytes32)", +"12974218": "tokensRemainingForSale()", +"12975687": "mediaTokensDecimalUnits(address)", +"12987c98": "large()", +"129893dc": "ParameterizedToken(string,string,uint256,uint256)", +"129932d5": "_spto(uint256,uint256,uint256,uint256,address)", +"1299c8fe": "GetAccountIsFrozenByDateCount()", +"1299f11e": "updateNextWindowAdjustmentRatio(int256,bool)", +"129a1a37": "Dissolved(address,uint256)", +"129a5b99": "getPropertyStatus(bytes32,address)", +"129a75a7": "viewSecondBatchOfContractState()", +"129a8d25": "LogKYCConfirmation(address)", +"129a9e99": "enterEvent(uint256[12])", +"129b873b": "addVote(uint256,address)", +"129bc044": "unlockAccount(bytes32)", +"129caa18": "haltICO()", +"129cf7cb": "ForeignBridge(uint256,address[],uint256)", +"129ed395": "accountLock(address)", +"129f80fb": "rewardAirdropMany(address[],uint256[])", +"12a00b21": "calculate_base_mining_reward(uint256)", +"12a0421c": "safeWithdrawal2(address)", +"12a06c35": "NFF()", +"12a0b32c": "transferRestrictedStock(address,uint256,uint256)", +"12a0b3ba": "VOLOP(uint256,string,string)", +"12a12106": "setPayoutAmount()", +"12a15b91": "BlocktorialTestToken()", +"12a187f3": "toggleTransfer(bool)", +"12a1c2f2": "Mether()", +"12a203c3": "getFinalAnswerIfMatches(bytes32,bytes32,address,uint32,uint256)", +"12a2716d": "affirmations()", +"12a3234c": "unlockAdvertisement(uint256)", +"12a3bbaf": "_addHorse(bytes32)", +"12a3cda2": "TokenOMG(uint256)", +"12a3ff95": "endPrivatesale()", +"12a49007": "p_setInvestorFundPercent(uint256,uint256)", +"12a4b899": "claimPresaleTokens()", +"12a63964": "Releaseable(address,uint256)", +"12a71ee0": "setBiddingAuctionAddress(address,address)", +"12a77dbd": "getLockedToken(address,uint256)", +"12a7b914": "getBool()", +"12a837b4": "transfer(address,address,uint256,bytes)", +"12a8c1ed": "testAllocatesTokensInSale()", +"12a916f9": "getPlayerWallet()", +"12aa2c0d": "getMinBal()", +"12aa5360": "addAlpha(string,string,bytes32)", +"12aaac70": "getKey(bytes32)", +"12aaafa7": "amount_milestone()", +"12ab7242": "setupStackDepthLib(address)", +"12abbaaf": "WhosItGonnaBe()", +"12ac18ff": "About()", +"12ac4a2e": "bonuscal()", +"12ac5bad": "GetContractStateCancelledByTenant()", +"12ac9b46": "_escrow(address,uint256)", +"12ad8bfc": "registerSecret(bytes32)", +"12ad8d20": "CryptoElections()", +"12addb94": "saleEnd4()", +"12ade015": "oneTokenInFiatWei()", +"12aef8c3": "tokensForSale()", +"12afbc78": "getOwnedPointCount(address)", +"12afef2e": "Reservation(address,address,address,uint256,uint256,uint256,uint256)", +"12b0b3ca": "transferFromToICAPCallGas()", +"12b0b627": "splitStr(string,string)", +"12b0d309": "restrictTokenTransfer(address)", +"12b1cc95": "createHash(uint256)", +"12b1f8a9": "removeLand(address,uint256)", +"12b27e3e": "miningActive()", +"12b2ecc6": "init_bounty_program(address)", +"12b392ee": "admin_profit()", +"12b3a445": "getERC721Nfts(uint256,address)", +"12b48d3c": "CountryCoin()", +"12b495a8": "delta()", +"12b4ba71": "emitTokenStateUpdated(address)", +"12b58349": "getTotalBalance()", +"12b62a07": "playerWinHeroes(address)", +"12b68263": "creditDragon(address,uint256)", +"12b68286": "whitelistMinTok(uint256,address)", +"12b6ef5c": "Decision(uint256,address,address[],uint256[])", +"12b706a7": "buyPreSale(uint256)", +"12b8854b": "redeemNewTalentsAndPartnerships()", +"12b8ca5e": "_isDiamondOutside(string)", +"12b93ec6": "ChallengeContract(uint256,string,uint256,address,address)", +"12b97812": "addOffering(address,bytes32,address,uint256)", +"12bae48d": "StartDate()", +"12bb05ff": "claim1Ply(uint64,uint64,uint64,uint64,uint64)", +"12bb65ca": "MANHATTANPROXY7THAVE()", +"12bb6df7": "LogRewardPicked(uint256,address,uint256,uint256)", +"12bb9d3e": "RefundableCrowdsaleWithCommission(uint256,address)", +"12bc74e2": "withdrawBondReward(address)", +"12bcc858": "claimTokensInBulk(address[],uint256[])", +"12bd2cea": "setImageDataCloud(uint256,uint256,string)", +"12bdc81b": "freedWinPoolForThirdStage()", +"12bddc9c": "changeRules(bool,bool,bool,bool,bool)", +"12be78d1": "freeze_pool(bool)", +"12bea6eb": "kickStartICO(address,uint256,int256)", +"12bff72f": "doTransferOwnership(address)", +"12c0af96": "getVoterOnElection(address,address,uint256,address,address)", +"12c0d1ea": "changeLuck(uint32)", +"12c1083d": "distributing()", +"12c2302e": "DocumentRegistered(uint256,string)", +"12c24128": "FootStarCrowdsale()", +"12c27c64": "contrp3d()", +"12c3ee37": "setStorageControllerContractAddress(address,address)", +"12c3f754": "modificationFee()", +"12c3f757": "soldiersinfo(address)", +"12c45f64": "maximumTokenSupply()", +"12c55a9b": "openDeposit()", +"12c59488": "setAddress(address,address,address,address,address)", +"12c61a20": "initambassadorsbags()", +"12c6651c": "MoralityAI()", +"12c6ac16": "Reconcile(address,uint256,uint256)", +"12c723e1": "createDeposit(uint256,uint256,bytes)", +"12c77207": "getLLV_edit_1()", +"12c7df73": "rewardValue()", +"12c8052f": "won()", +"12c82894": "compute(string,string,uint256,uint256)", +"12c82bcc": "sendRobust(address,uint256)", +"12c85095": "getRestrictedTokens(uint8)", +"12c89869": "getHeroCurrentPrice(uint256)", +"12c96f5f": "ZAYAToken()", +"12c99005": "startPREICO()", +"12cacbb5": "inPresaleMode()", +"12cc08f2": "getPackageReleaseHashes(string,uint256,uint256)", +"12cc1abc": "set_exchange_rate_in_eth(uint256)", +"12cc9dd3": "usdId()", +"12ccb421": "payPlatformIncomingTransactionCommission(address)", +"12cd2101": "transfered(address,uint256,bytes32[])", +"12cd24be": "funder(address)", +"12cd57c9": "inputauction(uint256,address,uint256,string)", +"12cdc37a": "OrderTake(uint256)", +"12ce73dc": "callFor(address,uint256,bytes)", +"12cef27a": "secondWallet()", +"12cf0ec8": "balanceOfAt(address,uint256,int256)", +"12cf85c8": "s26(bytes1)", +"12cf8a10": "getType(uint32)", +"12d00c2e": "soloWithdraw(uint256)", +"12d0e65a": "changeBeneficiaryAddress(address)", +"12d1456f": "requiredExpIncreaseFactor()", +"12d1612a": "closeContest(string)", +"12d1b19a": "poissonData()", +"12d2c9a5": "isWhitelistedInvestor(address)", +"12d43a51": "gov()", +"12d60f86": "fillUpAllowance()", +"12d6468d": "mathTransfer(address[],uint256[])", +"12d67c5f": "getLastDataLength()", +"12d69389": "maxUint32()", +"12d6c704": "getTMul(uint256)", +"12d72e99": "deregisterProduct(uint256)", +"12d96887": "getRollUnder()", +"12da6e2b": "fourthTime()", +"12dc006a": "racer_index()", +"12dc34a0": "disableSetTransferable()", +"12dc5ca0": "CrowdsaleToken(address,string,string,uint8,uint256,bool)", +"12dc6449": "test_remove_head()", +"12dc8c4b": "InitialTokensAllocated(uint256)", +"12dc9a5b": "assert(bool,bytes)", +"12dcb676": "remainPackage()", +"12dd4763": "_transItem(address,address,uint256)", +"12dd8700": "CevacFund()", +"12dd9b94": "addBet(address,address)", +"12de10fd": "setMinimumFundingLimit(uint256)", +"12de8a12": "addReferenceParentWineryOperationByRegulator(string,string,uint256,string,string,int256)", +"12df172d": "setScale(uint256,uint256)", +"12df2f49": "serviceStation()", +"12df9b63": "AddContact(bytes32,address)", +"12e135a0": "setBuyCommission(uint256)", +"12e228fd": "investorAddress()", +"12e26673": "maxMSC()", +"12e36530": "addMerkleTreeRoot(bytes32,bytes)", +"12e382b4": "lockFunds(address,uint256)", +"12e43d92": "AVAILABLE_PRESALE_SUPPLY()", +"12e43da5": "kycConfirmer()", +"12e530aa": "Hacksig(uint256)", +"12e56faf": "activeTransfer()", +"12e57fdc": "MONEYTREETOKEN()", +"12e5b7fa": "GetOwnertName()", +"12e6414e": "getCampaignStartDateById(bytes32)", +"12e753e1": "modifyContact(address,string)", +"12e7b2ba": "vanilAddress()", +"12e8e2c3": "setPlatformFee(uint256)", +"12e8ebdf": "unpauseWithdrawal(address,address)", +"12e905b0": "selfAddress()", +"12e9d888": "removeSkillFromSale(uint256)", +"12e9db2d": "get_deposit_balance(address,uint256)", +"12ea0b0e": "INV()", +"12ea7d20": "BoSToken()", +"12ea965d": "icoStartBlock()", +"12eabe7e": "approuver(address,uint256)", +"12eacf4b": "fundInsurance()", +"12eba773": "isAdvisorsTokensFirstReleased()", +"12ebca9c": "get_admin_list()", +"12ecaa62": "freezeAccountOf(address)", +"12ef900b": "getMaxLoanAmountAllowedByLtd()", +"12ef934b": "nCryptClubShare(address,address,address,address)", +"12efe5ad": "minDonationInWei()", +"12effc32": "rejectTransfer(uint256)", +"12f05418": "campaignCanceled()", +"12f0f9df": "createBountyContract(address)", +"12f11ed3": "getDenyPremium(bytes32)", +"12f17735": "calculateEntryHash(address[],uint256[])", +"12f20e2a": "withdrawFundsToOwner(uint256)", +"12f26140": "setWhitelistContract(address)", +"12f2b838": "updateReservedWei()", +"12f31b5f": "firstTeamWithdrawal()", +"12f3d1e0": "discoverResources(uint256)", +"12f4cbd9": "Vote(uint8)", +"12f53950": "refunded()", +"12f58b43": "RATE_CHANGE_THRESHOLD()", +"12f62bd6": "updateProperties(uint256,bytes)", +"12f63d96": "lockedByUser(address,address)", +"12f6e641": "okamiMaxPurchase_()", +"12f7cf74": "approve(address,uint8,uint8)", +"12f7fb6f": "RocketCoins()", +"12f8ae31": "getRedeemEst(address,uint256)", +"12f8b3db": "createCrowdsale(uint256,uint256,uint256,uint256,address,address,address,address)", +"12f95b16": "GIC()", +"12fa6feb": "ended()", +"12fa769f": "paidAmount()", +"12fb5b67": "purchaseTokensInICO(uint256,address)", +"12fc41a1": "MyScheme()", +"12fc848e": "_randomLucyAddr()", +"12fca967": "contract6function2()", +"12fd67ba": "getValidations()", +"12fdf767": "FuseaNetwork()", +"12ff2ad9": "Consent(address,address)", +"12ff658f": "DmitryCoin()", +"12ffb59b": "checkIcoStatus()", +"12ffe4df": "_decreaseApprovalAllArgs(address,uint256,address)", +"130067ca": "updateCostContract(address)", +"1300a6d1": "timeLeft()", +"1300cc41": "freezeTransferToken()", +"13012a3b": "doMap(address,string)", +"13019a5e": "EtherTool()", +"1301b876": "EmbiggenToken(uint256,uint256,string,string,uint8)", +"1301c4aa": "CryptoniumCoin()", +"1301ee02": "transferringETC(address)", +"1302188c": "getLastDataHash()", +"13028f44": "addUserRewardPayouts(address,address,uint256)", +"1302d03a": "setWhitelist(address,uint256)", +"130346d2": "icostart()", +"13037d22": "xioniCoin()", +"1303a484": "commitment()", +"13040bc1": "tokensFinalized()", +"13045155": "MONTHLY_INTERNAL_VAULT_CAP()", +"130497ac": "getCountryList()", +"1305413e": "BetMade()", +"1305d2de": "changeAllCosigners2(uint256,address[],bytes,bytes,bytes,bytes)", +"13063180": "doEscape(uint32)", +"13065fed": "MoneroClassic()", +"130766c5": "enterLarge()", +"1307d2d7": "EARLY_CONTRIBUTOR_STAKE()", +"1308c324": "setAddrForPrivilege(address)", +"1308d2c2": "gauntletRemovable(address)", +"1308e82d": "L19_PALToken()", +"1308e9e0": "startSweepStake()", +"130985f4": "GetcrowdsaleContract()", +"1309a563": "IsPaused()", +"1309d3bd": "RAVI_ALLOCATION()", +"130a39b1": "removePersonalTokenLock(address)", +"130bcaa2": "removePersonalLockMultiple(address[])", +"130c0e88": "advisoryVUPDestination()", +"130d04d0": "companyHolding2y()", +"130d7906": "register(uint32)", +"130d993d": "lifeFactor_iii()", +"130e54a1": "prizeshow(address)", +"130fbba4": "setPixelToken(uint24,uint256,uint24)", +"13110199": "twentyEndTime()", +"13110874": "preSaleFirstEtherCap()", +"1311457c": "transferToken(address[],address,address,uint256)", +"13114a9d": "totalFees()", +"1311b45e": "setGasForCMT(uint256)", +"1311c860": "KCoin()", +"131284c8": "FUNDING_START_TIMESTAMP()", +"13137731": "testThrowsUpdateLatestRevisionNotUpdatable()", +"1313c739": "getBidForAuctionByIdx(uint256,uint256)", +"1313f631": "Register(bytes4,bytes32,bytes32[8])", +"1314e272": "addAddressesToOperators(address[])", +"13151981": "to()", +"13155455": "legacyToken()", +"13163d53": "CTO_Signature()", +"13169ab7": "rewardManual(address,uint256)", +"131719e1": "testtop()", +"13174093": "bountyAccount()", +"13175b40": "_emitUserCreated(address,address,address,address,uint8[],uint256,uint256[],uint256[])", +"13178704": "ContributeToPool()", +"1317b559": "buyshares()", +"1318b88c": "GetPlayer_FromID(uint32,uint8)", +"1318cd2d": "NameInt()", +"13193936": "GEMERAToken(address[50])", +"13194658": "MossCoin(uint256)", +"1319b880": "borrowToken(uint256,uint256,address,address,bool)", +"131a0680": "store(string)", +"131ad118": "avaliableBets()", +"131ad146": "getWorksStatus(bytes32)", +"131b0563": "EITARD()", +"131b81ad": "transferExecutorOwnership(address)", +"131b9c04": "getEarnings(address)", +"131bb0d6": "ethCostTotal()", +"131be36c": "preICOregulations()", +"131c4305": "SoundcoinsAddress()", +"131d2873": "isContractFrozen()", +"131de517": "getKeyBlockNr(uint256)", +"131e03ba": "withdrawOtherEDEX(address)", +"131e1816": "setRetiro(address)", +"131fa183": "createBoard(address)", +"132002fc": "votingDuration()", +"1320f614": "callServer(string,uint256)", +"1320f838": "modify_ICOStartDate(uint256)", +"1321d291": "enact_liquidation_greater_equal(address,uint256,uint256)", +"1321ea19": "mulTransfer(uint256,address[])", +"13220305": "doTransferOther(address,address,address,uint256)", +"13222d0a": "payoutsETH(address)", +"1322311b": "LoanBit()", +"13224fc5": "missingTokensFallback()", +"1322e9d0": "checkPayoutReadyState()", +"13233cd9": "appointAgent(address)", +"13242733": "getRoundOfSixteenTeams(uint256)", +"1325c502": "debugSetNow(uint256)", +"13270bb8": "authorizedCount()", +"1327290d": "isAddressActivated(address)", +"1327487f": "activation(uint256,address)", +"1327d383": "hybridizations(uint256)", +"1327d3d8": "setValidator(address)", +"1327fbe5": "getPanda(uint256)", +"1328ec9b": "getAvatar(uint256)", +"1328fd8f": "getDetails(string)", +"13299604": "getWallet()", +"132ac1dd": "itemsForSaleCount()", +"132ae5e9": "numInvestors()", +"132c3bea": "setContractPrice(uint256)", +"132c8641": "given()", +"132d05e5": "_distributeJackpot()", +"132d807e": "upgradeTo(address,address)", +"132df661": "isPrePreSale()", +"132e4f3c": "fail(uint256)", +"132e63ba": "PRICE_8()", +"132e8bee": "batchWithdraw(uint16[])", +"132ff514": "SQUAD_SIZE()", +"133086a5": "SphereTokenFactory()", +"1330a21f": "calulateRate()", +"1332143c": "getGoldTransactionsCount(string)", +"133252a6": "grantToken(uint256,address)", +"13326f43": "transferTokenToSender(address,uint256)", +"1332dd07": "_isFreezeList()", +"13331391": "buyPreIco()", +"133323c8": "setLevToken(address)", +"13332c6c": "myVoteFactory()", +"133369c6": "GetRigData(uint256)", +"1334a5e2": "eventCallback(uint8,address,address,uint256)", +"13352334": "payOwners()", +"1335461c": "joinGameWithBalance(uint256,address)", +"13357914": "from(uint256)", +"1335b56b": "GasSell()", +"1335b598": "get_ptc_count(address)", +"1335ff36": "createEventAndMarketMaker(uint256,uint256,uint8,uint32,address,uint256,uint8,uint16,uint256)", +"13368364": "getMarketPriceOracle(uint256)", +"1336a756": "previousPeriodRate()", +"1336cff6": "isAccountFreeze(address)", +"13373786": "powerBalanceOf(address)", +"1337d6ed": "sendFlower(address,bytes32,string,bytes16,uint256)", +"13381fbf": "registrantsPaid(address)", +"1338736f": "lock(uint256,uint256)", +"1338c9e9": "SspStandardToken(uint256,string,uint8,string)", +"1338f493": "isClose()", +"13390cf2": "VASTToken(uint256,string,string)", +"133922ad": "setCompanyURI(string)", +"13392662": "totalTokensOfThisContract()", +"1339305f": "createRandomZombie_FreeZombie()", +"1339870e": "GetOrderBookScreen(address,uint256)", +"13399d10": "INCRYPT(uint256,string,string)", +"1339cba2": "getRemainingDaysToSecondPhase()", +"133a473e": "sleep()", +"133ae30b": "transferFunds(uint256)", +"133af8b3": "getIcoTokenHoldersAddressesCount()", +"133b5ba9": "honestisFort()", +"133c5ff5": "getAdminAccounts()", +"133cbe3a": "setLatestToNow(address)", +"133d10e6": "HPCToken()", +"133d27e1": "partner1_address()", +"133d2afe": "myfast(address,uint256)", +"133d5d4e": "setMultisignWallet(address)", +"133d8555": "withdrawTokenFromElc(address,uint256)", +"133e3f71": "getOld_BalanceOfr(address)", +"133f44dc": "removeVerifiedInvestor(address)", +"133f50f5": "checkUserExists(address)", +"133f6ac0": "earlyExchangeRate()", +"133f8a2f": "getStockReleaseTime(address,uint256)", +"133fe629": "calculateCuts(uint256,uint256)", +"134000c0": "getGrid()", +"134087a2": "gameLogic()", +"1340d09a": "isPoint(uint256,uint256)", +"13413858": "isFreelancerAvailable(address,address)", +"13414a4e": "doDisputeMemoryWrite(uint256,bytes32,uint256)", +"13419be3": "LifeFactor_v()", +"1341b33c": "releasableViewOrSend(address,bool)", +"13424bf0": "unpause_4()", +"13426d87": "addEmitter(bytes4,address)", +"13429e31": "newPrice(uint256,uint256)", +"1342c0e8": "VZT_WALLET()", +"1343a35f": "sendLoan(address,uint256)", +"1343ed05": "isStoreSet(string)", +"134538f3": "testRemoveGains()", +"134562a6": "SimpleToken(uint256)", +"13463751": "ThroneClaimedEvent(uint256)", +"13468929": "signedApproveCheck(address,address,address,uint256,uint256,uint256,bytes,address)", +"1346c20e": "canBuy(address,uint256)", +"134741f7": "SimpleERC20Token(uint256)", +"1347b972": "setICOWeek2Bonus(uint256)", +"1347b9ae": "CommonToken(address)", +"1348ab3a": "setRequiredTotal(uint256)", +"1348fdcc": "changeStarttime(uint256)", +"1349c273": "ClearExpiredFreezingEvent(address)", +"1349f5ec": "_provideChars(address,address,uint32)", +"134a04ea": "breedingDB()", +"134a153a": "buyVirtTokens(address)", +"134a5330": "updateTokenPrice(int128)", +"134abf66": "sendVesting(uint256)", +"134b684f": "SafeGiftTokens(uint256,string,string)", +"134c021b": "divForTransfer()", +"134c1a28": "L2Cash(address,address)", +"134c91be": "setFile(string,string,uint256,string,string)", +"134ccdfb": "IBIZACASH()", +"134dc5ad": "setManagerAddress(address,address)", +"134e3917": "setM2(address)", +"134f1893": "goWiner()", +"134fd7d0": "_convertToWei(uint256)", +"134ff97e": "startGame(uint32,bytes32)", +"1350a997": "AccessGrant(address)", +"1350acbd": "PRESALE_MAX_ETH()", +"135128c2": "CounterPartyDeposit()", +"13517fea": "maxCost()", +"1351cf51": "setAuthorizedAddress(address,bool)", +"135217e7": "requires_depth()", +"1352faec": "setReleaseDate(uint256)", +"1353e7b3": "purchaseMetal(uint256,uint256)", +"1356c5dd": "raceBet(uint8)", +"13574cd2": "calculateKnowledgeBuy(uint256,uint256)", +"1357b862": "contractSolidStamp()", +"1357e1dc": "totalPaidOut()", +"13582b6e": "HIDDEN_CAP()", +"135859c0": "distributeICOTokens(address,uint256)", +"135892bf": "FundUpdated(address)", +"1358937f": "TEAM_HOLDER()", +"13590153": "ManualChangeEndDate(uint256,uint256)", +"1359844a": "winNetworkFeeBasisPoints()", +"13598b71": "LightningEthereum()", +"1359cb2c": "getCommissionWithdrawn(uint32)", +"1359fc91": "setPublicKey(bytes32,bytes32,bytes32,bytes32)", +"135a2474": "joysoWallet()", +"135bada6": "setDungeonStatus(uint256,uint256)", +"135bf431": "gamerun()", +"135c0701": "purgeAccount(address)", +"135da3c2": "getBal(bytes32,address)", +"135da767": "LennartCoin()", +"135e9ad6": "fulFillTX(uint256)", +"135ec4bd": "AddAppraise(address,string)", +"135ed7bd": "priceRound1()", +"135f01df": "addDocument(bytes16,bytes32,uint8,bytes32,bytes32)", +"135fae64": "getOwnerProprietaryData(uint256)", +"135fc676": "loseHandler(address,uint8)", +"13601234": "checkRejectionRatio()", +"136047ab": "ticketTransferers(address,uint256)", +"13612119": "distribToken(address)", +"136125a7": "GoldFiatFee(string)", +"13618756": "readnationnameXteam()", +"1362180e": "setItemName(uint256,bytes32)", +"13622274": "prealocateCoins()", +"1362dd32": "testinx()", +"1364326c": "countVotes(uint256,uint256)", +"13643605": "crowdsaleTarget()", +"136439dd": "pause(uint256)", +"13651124": "WithdrawAmountFromBankAccount(uint256)", +"136512c9": "_checkPixelRight(uint256)", +"13653b24": "RECFToken(uint256)", +"1365e6a3": "REBELCOINSupply()", +"1366b970": "test_transfer_token_to_contract()", +"1367641e": "releaseAdvisorTokens()", +"1367944b": "getIdByName(string)", +"13683532": "getAccountCap(uint256)", +"1369f6fd": "getCurrentOwnerBallence()", +"136aa762": "Remmittance(uint256,uint256)", +"136ac4bf": "WillTestament()", +"136af582": "next(bytes,bytes,bytes,bytes,bytes,bytes,bytes)", +"136b4fea": "getActiveFish(uint256,uint256)", +"136bcbab": "Windlord()", +"136c545c": "transferToProjectWallet()", +"136c8744": "WBSToken()", +"136cf5c1": "deleteVestingFromStorage(address)", +"136d1057": "accountBalanceCount()", +"136d5a59": "giveKudos(bytes32,uint256)", +"136d6a39": "getBalanceByAddress(address)", +"136dbbab": "revenueFraction()", +"136e1949": "buyFunderSmartToken(string,string)", +"136e1c45": "suspendGame()", +"136ede68": "verifyCopieExecutoire(bytes32)", +"136ef18a": "allowTransfers(address[])", +"136f1016": "hasBet(address)", +"136f2bf4": "allowToken(address[])", +"136f5b5a": "ordersCanMatch_(address[14],uint256[14],uint8[6],bytes,bytes,bytes,bytes,bytes,bytes)", +"136fa2d7": "rateSeedStage()", +"1370128e": "free()", +"13711a31": "presale_allocation()", +"13714545": "GATEL()", +"137157c0": "changeBlock(bool)", +"1371dab9": "whitelisters(address)", +"13730838": "getCanvasPainters(uint32)", +"13734a9f": "setClaimDividendPercentage(uint256)", +"13737db2": "TiValueToken()", +"13740cf3": "isTrigger()", +"13748a40": "Withdraw_2()", +"1374b22d": "proposalExists(uint256)", +"1374eb6f": "getLockByIndex(address,uint256)", +"1375111e": "returnrandom()", +"13754f9a": "notUpgradableInStore()", +"13765838": "deposit(uint64)", +"13767204": "AirDropRedeemAFTK()", +"1376f2ce": "setCrowdsaleStartDate(uint32)", +"137759df": "ammendReceivedLand(uint256,uint256)", +"13776ba1": "buyPLATCards(address,uint256,uint256,uint256)", +"1377900b": "PreICODayOneCents()", +"1377ae65": "_getEarnings(address,address,uint256,uint256,uint256)", +"13788651": "test_oneValidEqBytesNoLog()", +"137935d5": "totalGuaranteedCollected()", +"1379c6e0": "getICOEndDate()", +"137a1464": "ifEmergencyStop()", +"137a3fa7": "transferPayment(uint256,address)", +"137b3bcd": "getBounsByAmount(uint256,uint256)", +"137b763d": "SetReferrer(address,address)", +"137b8721": "getTierWhitelist(address,bytes32,uint256)", +"137baa2a": "BigToken()", +"137c1feb": "buyCommonTTMByETH(uint256,address)", +"137c638b": "getExtraGas()", +"137ce088": "TokenReserveMinted(uint256)", +"137ce8e3": "HARD_CAP_USD()", +"137d7026": "abiEncode(bytes,bytes,address[])", +"137db23c": "updateWhitelist(address,address,bool)", +"137e37d9": "accountGet(address)", +"13801995": "getHopefulId(address)", +"13819313": "OTTToken()", +"1381e400": "cancel(uint32)", +"13823365": "setOneTokenInWei(uint256)", +"13827950": "getShareholderDB()", +"1382a652": "isTrustedShop(address)", +"1382e75e": "addUser(uint256,string,string,uint256)", +"13831693": "getLevitatingUnicorns(bytes32,uint64)", +"13844e60": "totalOVCSold()", +"13845d2f": "creation()", +"138495de": "SimpleToken(string,string,uint256,uint256)", +"1384dc12": "endTx(uint256,uint256,uint256)", +"1385053e": "FlyCareTokenSale(address,uint256,uint256,uint256,uint256,uint256,uint256,address,uint64[5])", +"1385625d": "MintTimelocked(address,uint256)", +"13857c1a": "foundersFundMultiplier()", +"13859f46": "_metadata(uint256)", +"1385d24c": "toggleContractActive()", +"138665ff": "testJoin()", +"13869333": "RealityCheck()", +"1386a244": "getSettingAddress(string)", +"1386dc2d": "orgName()", +"138716e8": "root_domain()", +"13872f8d": "test_againstFor()", +"13877deb": "FBLFund()", +"1387c80b": "test_invalidRuleChange()", +"1388483d": "BLING()", +"13887592": "multilocked()", +"13888565": "surplus()", +"13889727": "setHeroName(uint16,string)", +"138a7084": "_4_owner()", +"138a886e": "testGetTransactionDetails(bytes)", +"138acb80": "View_MediatedTransaction_Info(uint256)", +"138b3ab1": "numPlots()", +"138b806c": "addMultipleAddresseseToWhitelist(address[])", +"138bdf1b": "simpleTest(address)", +"138cc941": "testErrorTransferToRejectAuthority()", +"138e2317": "IcoTokenMock(address)", +"138e8da1": "getIncreaseAllowancePreSignedHash(address,address,uint256,uint256,uint256)", +"138efd00": "_createTot(string,address,uint256)", +"139020d1": "deedByIndex(uint256)", +"13902e9f": "initBonusPeriod(uint256,uint256,uint256,uint256)", +"13905905": "addWhiteListedAddressesInBatch(address[])", +"13907d22": "abrirDoacoes()", +"1390b247": "getNbSellOrder()", +"1390df6c": "oldXPAAssets()", +"1391697d": "weiRound1()", +"13916c2e": "bidOnCraftAuction(uint256,uint256)", +"1391c5f8": "EnddateICO()", +"1391fd60": "raised(address)", +"1391ff43": "fetchVoteInfoForVoter(address)", +"1392c495": "updateItemPrice(bytes32,uint256)", +"13930cf6": "setCurrentVersion(string)", +"13932337": "highTimeBonusLimit()", +"13943033": "RBOC()", +"1394f216": "addProjectManager(address)", +"139654e0": "window2StartTime()", +"13966db5": "mintFee()", +"1397d7ae": "setPI_edit_24(string)", +"1397fdbd": "getShares(address,bytes,int256[])", +"139818a1": "setFrozen(address,uint256)", +"1398bbf7": "getRanking()", +"1398e076": "lotteries(uint256)", +"139949fa": "sAssert(bool)", +"1399cc5b": "UWC()", +"139a667a": "_calcNextPrice(uint256)", +"139b3752": "_batch1_rate()", +"139c7048": "generateTokenAmount(uint256)", +"139ccd1e": "stopCollectSignatures()", +"139cd9d3": "drawnTokens(address,uint256,uint256)", +"139ddefe": "ProposeProposal(bytes32,bytes32,uint256,uint256,uint256)", +"139df200": "getAllMarketsInfo()", +"139e23b5": "getDividendInfo()", +"139f1838": "NoBonustimer()", +"13a070b7": "add_admin(address)", +"13a0c990": "BearTrap()", +"13a110b4": "getMin(uint64[])", +"13a19e1b": "initialCoach(uint256,uint256,uint8,uint256)", +"13a1da40": "tgrSettingsMinimalContribution()", +"13a22af9": "latest_buy_time()", +"13a24744": "BurnupGameAccessControl()", +"13a2852d": "setICOEndTime(uint256)", +"13a30010": "refund2(address)", +"13a396d8": "getRequiredDeposit(bytes)", +"13a3d9a1": "registerDocument(string,string,string)", +"13a460b7": "tourisToken()", +"13a46425": "getNumberOfDisputedStepsProDoctor()", +"13a46827": "fund(address,address,uint256,uint256,uint256)", +"13a4b3bc": "OwnershipRequested(address,address)", +"13a4fd37": "soldTokensIco()", +"13a517bf": "eighthTeamWithdrawal()", +"13a5aac7": "paymentRegularTokensPriority(uint256,uint256)", +"13a5d9e4": "remaingNTRY()", +"13a666a6": "hasReachedSoftCap()", +"13a7070f": "withdrawDeveloperCut()", +"13a7f56e": "internalAllocate(address,uint256)", +"13a8a080": "TokenDemo(uint256,address,address,address,address)", +"13a91cc8": "getVlsTokenAddress()", +"13a927c7": "toggleMatchStartEnd(uint256,uint256)", +"13a92f02": "frozenAccountForLogic(address)", +"13a931dc": "gasForOraclizedQuery()", +"13a9589c": "getSalt()", +"13a9cd8d": "lastDETCWC()", +"13aa48bf": "minePepe(uint256,address)", +"13aa7b6f": "viewUnclaimedDepositDividends()", +"13aa8133": "resolveChallenge(uint256,bytes32)", +"13abdd75": "ecosystemSupply()", +"13ac2bdb": "addNetworkMember(address,bool,bool,bool,bytes32)", +"13ac58bb": "increaseCredits(string,uint256,uint8,address)", +"13acb45b": "calcDoubleBindedBlindHash3(string,address,address)", +"13ad41d8": "getSkill(uint32)", +"13ad9ce1": "getRepMarketCapInAttoeth()", +"13adc129": "MIGG()", +"13ae4522": "token3MstepCAP()", +"13ae457d": "mainCapInUSD()", +"13af4035": "setOwner(address)", +"13afa97a": "readMarketplaceConfigs()", +"13b15b24": "setRoundGap(uint256)", +"13b18640": "participate(uint256,address)", +"13b222ba": "getMyPoohs()", +"13b2663b": "cash_received(string)", +"13b2807e": "setCampaignEndPointById(bytes32,string,int256)", +"13b2e657": "unfreezeAccount(uint256)", +"13b37a83": "getRandomUuid()", +"13b39b9c": "approveMint(address,uint256)", +"13b3cd91": "collectForREQBurning(uint256)", +"13b3cdf6": "ownersLUT(uint256)", +"13b3fffc": "updateChannelManagerContract(address,string)", +"13b4312f": "transferCollectedFees(string,address,uint256,bytes)", +"13b499ce": "PRE_ICO_TIER_FIRST()", +"13b53153": "isFunding()", +"13b57686": "self_last_result()", +"13b5a19e": "GBPsToken()", +"13b5d420": "returnWebsiteData()", +"13b63f60": "updateBuildingPrivacy(uint256,bool)", +"13b6c8a8": "setListingFeeInWei(uint256)", +"13b6f213": "ContributionReceived(address,uint256,uint256,uint256)", +"13b7423a": "setFundraiserCallData(string)", +"13b796f4": "getMilestoneTimeAndRate(uint256)", +"13b84004": "gameTokenAmount(address)", +"13b96a9e": "numOfSamples()", +"13ba350a": "Whales_group()", +"13bac8f2": "updateStorage(string,string)", +"13baf1e6": "removeToken(address,uint256)", +"13bb7b0d": "PreICO(address,uint256,address)", +"13bbae9b": "addProxyManager(address)", +"13bc33ca": "CryptonHotels()", +"13bc4bda": "operatorSendTo(address,address,uint256,bytes,bytes)", +"13bd05e4": "silo_addr()", +"13bd4e2c": "_prepareAndSendReward()", +"13bd53e6": "applySettings(uint8,uint256,uint256,uint256,uint256)", +"13bd9e3c": "fundFoundation()", +"13bdbb19": "getCustomer(address,address)", +"13bdfacd": "print()", +"13be31ae": "preSaleDeposit()", +"13bfabf0": "isCurrentOrPastAccountReader(address)", +"13bfcd2c": "growthContract()", +"13c03159": "payPlayers(uint256,uint256)", +"13c04769": "submitBallot(bytes32,bytes32)", +"13c10e44": "attackerExpAdjustment()", +"13c13d6b": "updateMarketContract(address)", +"13c1629c": "_getBlockIndexAtYear(uint256,uint256,uint256)", +"13c1e906": "RentaCoin()", +"13c25ba6": "subtr(uint256,uint256)", +"13c2beff": "processWithdrawalForAccount(address)", +"13c32148": "_computeFee(uint256)", +"13c3922f": "Aborted(address)", +"13c42ca1": "getPrice(bytes1)", +"13c4f953": "getTime(address,address)", +"13c52111": "amountOfTokens()", +"13c58cbb": "countNoClients()", +"13c667d1": "calculateAmountBoughtICO(uint256,uint256)", +"13c68344": "Verto()", +"13c709d4": "transferToGame(address,address)", +"13c7db1a": "limitOfBranch()", +"13c82b0b": "setIsForkingMarketFinalized(bool)", +"13c89a8f": "getAllowedTime(bytes32)", +"13c8a376": "recovered(uint256)", +"13c8e60d": "getCurrentDebt(uint256)", +"13c9134b": "setcoinfee(uint256)", +"13ca1464": "getDHandRank(uint32)", +"13ca18ac": "WatermelonBlockToken(address,address,address)", +"13ca43a0": "teamWallet1()", +"13cc22ea": "createController(address)", +"13ccca96": "limitbreak_RELEASE()", +"13cceb21": "getHolderWithdrawIndex()", +"13cd528a": "miadd(uint64,uint64)", +"13ce15a9": "left67(uint256)", +"13ce401b": "getPlayerRecommond(address)", +"13ceb89b": "getCopaMarketAddress()", +"13cfed7f": "deposits_until_jackpot()", +"13d033c0": "cliff()", +"13d073d0": "Sign(uint256,address,uint256,uint8,uint256,string)", +"13d19950": "stringsEqual(string,string)", +"13d1aa2e": "f(uint256,uint256)", +"13d1bdfb": "priceForMateAdvertisement()", +"13d40e71": "RefundableCrowdsaleImpl(uint256,uint256,uint256,address,uint256)", +"13d4bc24": "buyTokenProxy(address)", +"13d4c63a": "_purchaseWhaleCard()", +"13d53ca9": "check(bytes32,uint256,uint256,uint256)", +"13d5469d": "periodICOStage7()", +"13d557bc": "operatorRedeemByPartition(bytes32,address,uint256,bytes,bytes)", +"13d567ca": "isApprovedTAAddress(address)", +"13d59ca9": "upgradeAddr()", +"13d5d4fe": "test_insert_findWithHintNextRemoved()", +"13d5ee74": "accPartner()", +"13d5f1fe": "durationOfStatusSell()", +"13d65cd9": "test_34_assertGasUsage700Boards()", +"13d73a08": "AMOUNTWAGERED()", +"13d769de": "auctionCreated(uint256,uint256,uint256)", +"13d8867c": "mint(string,uint256,string,uint8,string)", +"13d8c840": "tail()", +"13d9028b": "Remain_burn(uint256)", +"13dc01bb": "BKBK()", +"13dce04f": "updateRoutingPreference(string,string)", +"13dcfa08": "AmountClaimed(address,uint256)", +"13ddb69a": "CROWDSALE_START()", +"13ddd3ae": "getTokePerWei()", +"13ddecd5": "withdrawICOReserve()", +"13de214e": "minimalSuccessUSDWEI()", +"13debf7c": "_getPersonalAirdropAmount(address,address)", +"13defbd9": "getMyCrabs()", +"13df20fd": "createTimeBasedVesting(address,uint256)", +"13df35d1": "publicTGEStartBlockTimeStamp()", +"13df7091": "mintAll(int256)", +"13e003dd": "ASStoken(string,string,uint8,uint256,uint256)", +"13e0e70d": "ownerRegistry(address)", +"13e1d1d2": "multiCancelVoteForCandidate(address[],uint256[])", +"13e1f2b0": "DATToken(address)", +"13e26d58": "minRequired()", +"13e28415": "ownerSetMarginRatio()", +"13e2cae1": "revealBid(bytes32,address,uint256,address,bytes32,bytes32,uint256,uint256)", +"13e2dfc1": "depositDividend(uint256)", +"13e3151b": "MyEPPToken()", +"13e33fb6": "calculateBonus(uint96)", +"13e41971": "setup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"13e468b3": "getVotingToChangeProxy()", +"13e4b51f": "putHash()", +"13e50ca4": "totalFiatValue()", +"13e5a3b1": "SetUp(uint256,address)", +"13e5d8b6": "icoStartsAt()", +"13e5e26e": "recirculateLateFees(uint256)", +"13e60074": "OwnerRetireHodl(uint256)", +"13e7323e": "fundingEnd()", +"13e75206": "getParentOf(uint256)", +"13e7a234": "getAccessor(bytes32,uint256)", +"13e7d076": "STERNIUMHUGEELLIGENCECOIN()", +"13e81119": "purchaseTicketsWithReferral(uint256[],uint256)", +"13e8360d": "commissionerAuctionComplete(uint32,uint128)", +"13e8e5d2": "address2a()", +"13e8e74b": "IexecHub()", +"13e8fdea": "TxExecuted(uint32)", +"13ecfbfa": "lastBuyer()", +"13ed0846": "calculateReward(uint256,uint256)", +"13ed5f31": "getTransactionConfirmerInfo(uint256,address,address)", +"13ee4bc5": "pay(bytes32,address[],uint256[])", +"13f06abc": "balanceFrozenTokens(address)", +"13f07317": "enableStaticLogic(address)", +"13f0790c": "tokensSoldWithBonus()", +"13f07f6f": "Object()", +"13f0ec1f": "withdrawDekla(uint256,bytes)", +"13f20d76": "fundDigitalMarket()", +"13f233c2": "ethReceiveMainSale()", +"13f25eb6": "NinjaToken(address,address)", +"13f29768": "addUnsoldAllocationOrder(bytes32)", +"13f4318e": "SetSubscriptionTo(address,int256)", +"13f44d10": "isAddressWhitelisted(address)", +"13f46d3e": "SponBToken(address,uint256)", +"13f47f24": "lockedDelegatingTokens(address)", +"13f4b42c": "pixelsPerCell()", +"13f4c7a5": "INVESTOR_LOCK_DURATION()", +"13f4e977": "minimumFundingGoal()", +"13f52533": "capitalLedger()", +"13f56f73": "changeMinInvestment(uint256)", +"13f5ef00": "Main(string,bytes)", +"13f652fe": "getText(string)", +"13f6ee53": "cliffAdvisorsTokens()", +"13f73570": "manualyAddReferralPayer(address,address,uint256)", +"13f94a43": "getSiteTokenIds(uint256)", +"13f9cf76": "disableBundlingMultitoken(uint256)", +"13fa095f": "setDestinationWallet(address)", +"13fac256": "xem()", +"13faede6": "cost()", +"13fb2324": "EndEvent()", +"13fc5ace": "depositForMySelf(uint256)", +"13fc6ac2": "getEventData(bytes32)", +"13fcaf54": "getDepositCount(address)", +"13fdcbec": "developer_Coin_Character(string)", +"13fdd2b4": "TilexSupply()", +"13fe2de0": "releaseLockedFund(address,uint256)", +"13ff962a": "privatesaleSupply()", +"13ffdbfc": "gameCountOf(address)", +"13fff718": "doBet()", +"14001f4c": "setSiringAuctionAddress(address)", +"14004ef3": "multimint(address[],uint256[])", +"14007c6d": "nextState()", +"1400d1e4": "checkName(string)", +"14012549": "isMainSaleTime()", +"14025dcd": "cancelFee()", +"14029756": "setaddress(address)", +"1402c310": "NEWSOKUCOIN()", +"1402f031": "triggerAttackManually(uint32)", +"1402f80d": "selectTemplate(uint8)", +"1403041b": "PegasusToken()", +"14036f62": "Vboom()", +"1403835f": "_isExpired(uint256)", +"140420a9": "isRateValid(uint256)", +"140529c2": "YCoin()", +"140575af": "LogTokenPriceChange(uint256,string)", +"140604cc": "getInitialState(uint256)", +"14061862": "setIcoMin(uint256)", +"14069b12": "MXMPDMToken()", +"1406b921": "vent()", +"1406d3be": "lowestGameWithoutQuorum()", +"14074135": "dividendsRightsOf(address)", +"140758a9": "disableServiceProvider(address,bytes)", +"1408073e": "GangnamToken()", +"14081570": "addEpisode(string,uint256)", +"14081e39": "setEscrowFee(uint256)", +"14082cd2": "findProductById(uint256)", +"1409b88f": "getManualByAddress(address)", +"140a681a": "_getVersion()", +"140a7ac6": "getFinalScore(int256[])", +"140ad293": "spitnetwork()", +"140aee46": "_0xDogecoinToken()", +"140b1706": "maxHLPMTMarkup()", +"140b2cdd": "calculateMyRewardDecreased(uint256,uint256)", +"140b4465": "executeSpendingRequests()", +"140cc562": "isCollectSignatureCorrect(address,address,uint256,bytes32,bytes32,uint8)", +"140cd7af": "issueToken(address,address,uint256,uint256,uint256)", +"140d3e95": "changeFiatFeeContract(address)", +"140da6b7": "getAddressField1()", +"140dcec4": "right23(uint256)", +"140f64b4": "GoyanToken()", +"140f7f8d": "Staged()", +"14102159": "presaleLimit(address)", +"14106b49": "JustifyClaim(address)", +"14107f3c": "buy(uint8)", +"14111a43": "isValidService(bytes32)", +"1411539d": "multiSend(address[],uint256[],address[])", +"14116c3c": "SetPeriodPreITO_startTime(uint256)", +"14117228": "getNoteKeyByIndex(uint256)", +"1411d713": "licenseIssuedTime(uint256)", +"1412409a": "whitelistSetterAddress()", +"14127f13": "setOrderFill_(bytes32,uint256)", +"141283f1": "setNewWallets(address,address)", +"14131611": "setChibiForFusion(uint256,uint256)", +"14133a7c": "setSaleAgent(address)", +"14139904": "directorB()", +"14143c91": "TotalSpecialFeeTakes()", +"1414a506": "falangiToken()", +"1414ef78": "createInvoice(uint256)", +"14162e8d": "IouRootsReservationToken(string,string,uint8)", +"14163a83": "setCrowdsaleContractAddress(address)", +"14167bf0": "oraclize_query(string,string[])", +"1416a6eb": "ROMAKELAPA()", +"14174f33": "withDraw(uint256)", +"14177dbf": "setLockTokensAddress(address)", +"14179865": "logos(uint256)", +"1417b946": "adminOwner()", +"1417c845": "Mortal()", +"14189a7e": "outstandingValue()", +"141926fa": "updateAccount(string)", +"14193456": "MainSaleEnd(uint256)", +"141961bc": "campaigns(uint256)", +"1419c3f3": "grand_factory()", +"141a8dd8": "approver()", +"141bd92a": "getBallotInfo(uint256)", +"141c4306": "AbroToken()", +"141c4e60": "challenge(uint256,address)", +"141c9422": "listingDate()", +"141ca2c7": "reservedIcoCrowdsale()", +"141d717b": "OC()", +"141dbe66": "distributeBTCB(uint256,address[])", +"141e26a5": "setEditionMaxSales(uint8,uint256)", +"141edaa1": "manufacture(address,address,address)", +"141f211c": "snapshotStakeAmount(uint256,address,address)", +"141f6800": "fundingMinimumTargetInUsd()", +"141fd3cf": "channelResultTimeout(uint64)", +"14204ca9": "QZG001TOKEN()", +"1420765a": "isBuyLocked(address)", +"14211803": "hasBuyTotal()", +"14219ff9": "sq(uint64)", +"1421c1a4": "vote_for_candidate_C_for_free()", +"14225b9b": "token_ratio1()", +"1423113a": "fluxFeed(uint256,bool,bool)", +"142359f4": "fillOrder(bytes32[],bytes32[])", +"1423649b": "cofounderApproveSwitchRequest(address,bytes32)", +"1423c40e": "setBudgetOfCampaign(bytes32,uint256)", +"1424c182": "recordDeposit(uint256)", +"14253887": "certify(address)", +"1425d2fa": "getBalanceToken()", +"14263f0c": "Dadice()", +"1427407f": "NINECOINTOKEN()", +"142769aa": "requestNumber(address,uint256,uint8)", +"14279086": "getIndividualCount(uint32)", +"1427f168": "log2Bounds(uint256)", +"14280bb8": "getBodyColorValue(uint256)", +"14287a07": "playerPrizeClaim()", +"1429a36b": "getOrCreateFeeWindowByMarketEndTime(uint256)", +"1429e26c": "User()", +"142b353d": "MultiTransferETH(address[],uint256[])", +"142bc2ae": "latestData()", +"142c99d2": "closingSettle(bytes32,address,uint256,address,uint256)", +"142d239a": "canPurchaseAmount(address,uint256)", +"142dc95d": "testAmount(uint256)", +"142e0bdf": "LogAllocate(address,uint256,uint256)", +"142e133f": "totalBalanceDown()", +"142e8e25": "setAdmin(uint256,address)", +"142e9ab8": "setTrade(bool)", +"142e9bc9": "weaponToOwner(uint256)", +"142f328e": "fundDao()", +"142f53c2": "sendInitialTokens(address)", +"14307c48": "addHpbBallotAddress(address)", +"143085c3": "updateRankBoard(uint256,uint256)", +"1430990a": "bidTransfer(uint256,address,uint256)", +"1431b23a": "getData(bytes)", +"143211ec": "newDaoRulesProposal(uint256,uint256,uint256,uint256,uint256,bool,uint256)", +"14325458": "calculateTokensFrom(uint256,uint256)", +"1432621a": "getPeakSupply()", +"14332c93": "SetConfirmRound(uint32,uint8,bool)", +"14350c24": "changeMinimumMakerProtocolFee(uint256)", +"143551e4": "timeExtension()", +"143580d0": "PGDA()", +"14359466": "NBTV()", +"1435e397": "setAllocation(address,uint256,uint8)", +"14361fd1": "singleWithdrawMin()", +"14363e65": "setPeriod(uint256[])", +"14367652": "revealStageActive(uint256)", +"1436fb39": "_isVotingAddress(address)", +"14371c33": "someMethod5(uint256,uint256,uint256)", +"14373817": "rateSoft()", +"1437f9a3": "Set_your_game_number(uint16)", +"14386a74": "saleToggle(bool)", +"143a1a2f": "pilfer(uint256)", +"143bb3e6": "StartRollDice(uint32)", +"143c56cf": "disprove()", +"143c6d4f": "TokenTransferTo(address,uint256)", +"143c7a3f": "OPAY()", +"143e55e0": "era()", +"143e6209": "setImagePartsCount(uint256,uint16)", +"143f68c9": "getRedemptionBalance()", +"143f9d1f": "week4Price()", +"143fb46d": "setRemainingTokensWallet(address)", +"143fcbbe": "cancelBooking(string,uint256[],uint256,bytes32,bool)", +"14404eb2": "roundOver()", +"144052b6": "C4coin()", +"1440f2bf": "PRE_SALE_PERCENT()", +"144136a1": "restartCrowdsale()", +"144138c8": "removeGlobalConstraintPre(address,int256,address)", +"1441a5a9": "referral()", +"1441c288": "showUnpaidInterest(address)", +"14423381": "GameConfig()", +"144267e0": "refundSecurity(address,uint256,uint256)", +"1442b548": "ZTST()", +"14432f6e": "Received(address,address,uint256,uint256)", +"144344b9": "setEth(uint256)", +"14442f54": "VERSION_NAME()", +"14447e11": "checkGamesReadyForSpinning()", +"14449c92": "finishRoundB()", +"14459309": "price_constant2()", +"1445c6da": "increasePosition(bytes32,address[7],uint256[8],uint32[2],bool,bytes,bytes)", +"1445f713": "hexstrToBytes(string)", +"14462b93": "findWhichCTD(address)", +"14468d32": "nextBidExpireBlockLength()", +"1447431e": "setCCH_edit_24(string)", +"1448b3ca": "tokenSaleAddress()", +"1449757d": "annulCertificate(address,address)", +"1449c321": "view_get_gameStates()", +"1449c6dd": "Staked(address,uint256,uint256)", +"144a2752": "getBuyAmount(address,address,uint256)", +"144a3260": "createWithDeposit(address,address,uint256)", +"144a3472": "inMaintenance()", +"144a88a0": "updatePlayerPoint(uint32,uint32,uint32,uint32,int256)", +"144b2a82": "transferICO(address,uint256)", +"144be7eb": "totalNumberOfCards()", +"144c7e40": "CRYPTOKEN(uint256,string,uint8,string)", +"144cbdfd": "NobeToken()", +"144f2f94": "_burn()", +"144fa6d7": "setToken(address)", +"145000ab": "PRICE_2()", +"14525b6b": "auctionFee()", +"14525bce": "INITIAL_BALANCE()", +"14526f8c": "Buy(string,address,uint256,uint256)", +"14534ad0": "LogCertifierAdded(address)", +"14534ba7": "ballotEncryptionPubkey()", +"1453671d": "changeWithdrawAddress(address)", +"1453bfb3": "visitingUnicorns()", +"1453d756": "bytes64ToString(bytes32,bytes32)", +"145538ea": "phase1StartBlock()", +"145671aa": "getValidations(address,bytes32)", +"14567b8b": "setSelfAsContributor(string)", +"1456974f": "setNameReaderId(address,bytes32,bytes32)", +"1456979f": "setNewValidator(address)", +"14572dff": "incrementUniquenessIndex()", +"14576a49": "NewSophonToken(address)", +"14577c55": "accountLevels(address)", +"14584a9d": "getAuctionIndex(address,address)", +"1458ffb3": "VREO_SALE_PHASE_1_END_TIME()", +"1459457a": "initialize(address,address,address,address,address)", +"1459cef4": "balanceOfMine()", +"1459ecc4": "lastrecordindex()", +"145a0adc": "setDataLink(uint256,string)", +"145a7f92": "social(address)", +"145af145": "getAllCardsLowestPrice()", +"145b2ab2": "CocoToken()", +"145ba84c": "_payAwardOwner(uint256)", +"145c03f2": "TransferFromCompanyInventory(address,uint256,bytes32)", +"145ca0b3": "UnLockTokens(address,uint256,string)", +"145cb459": "showCertificate()", +"145ccb0f": "planWithdraw(uint256)", +"145cf0c2": "decrementTokenIdsLength()", +"145d82d6": "setKingdomFactoryRP()", +"145e1944": "buy(bytes,int256)", +"145e6701": "SteemitFund()", +"145e818f": "BALVINDER()", +"145e8f5e": "HVB()", +"145eb4ee": "HuaTuoToken()", +"145ee04c": "pendingFeesWithdrawals()", +"145f3143": "releaseTime1()", +"145f8ba2": "getPainting(uint256)", +"145fa890": "setWhiteListDuration(uint256)", +"145fd87a": "getTotalHashRateOf(address)", +"145ff9cb": "terminateShortPosition()", +"146008e3": "grid(uint256,uint256)", +"14606109": "cap1(address)", +"14607fc2": "dispute(bool,address)", +"146091f1": "removeFromAllocationList(address)", +"1460b505": "setWeights(uint256[])", +"1460e603": "numDarknodes()", +"146124f9": "totalDistributedr()", +"146155bf": "createUserByEmailVerify(bytes32,bytes32,uint256)", +"14619c7f": "setContractAdmin(address,bool,uint256)", +"14627834": "GOVERNANCE()", +"14633039": "VanityToken_v3()", +"146483f9": "setCreateUnicornPrice(uint256,uint256)", +"1464bc45": "walletFacebook()", +"1464f516": "votosTotales()", +"14653f87": "SHIP(uint256,uint256,uint256)", +"14656957": "PeculiumToken()", +"1465aa97": "testingContract()", +"1466724a": "subUserBattleValue(address,uint256,bool)", +"14670850": "test_33_assertGasUsage200Boards()", +"14673d31": "setReserveAddress(address)", +"146740ee": "bulkAddMake(address[],uint256[],uint256[])", +"14679957": "GenesMarket()", +"14686ac2": "puntAmount()", +"1468d9cb": "Latium()", +"1468fc26": "changeSharedExpenseAllocation(uint256)", +"146901db": "setFailed()", +"14690be7": "TransactionSucceededICAP(bytes32,uint256,string,address)", +"14697cc8": "claimHalvingsSubsidies(uint256)", +"14698895": "Certification()", +"146b4955": "RICHERC20(uint256,string,string)", +"146b58df": "getInvestment(address)", +"146bea7b": "nextYear()", +"146c8710": "addressOf(address,uint256)", +"146ca531": "round()", +"146d2148": "setReaderId(address,bytes32,bytes32)", +"146dd227": "BLTToken()", +"146dd8e0": "BestEther()", +"146e3cb5": "getDroidsIds()", +"146e7eea": "soulsForSale()", +"146e91b5": "signContract(bytes32,string,bool)", +"146e9329": "summJenkins()", +"146ee571": "requestFreeDistribution()", +"146ef27d": "balancePreSale2()", +"147035ba": "processPublicPurchase(uint256,address)", +"14704d91": "getCCH_edit_26()", +"14709544": "BetCoin()", +"1470dfa8": "closeWindow(uint8)", +"1470fc6f": "approveRejectOrg(string,string,string,string,string)", +"14712e2f": "proxyApprove(address,uint256,bytes32,address)", +"147180ab": "feesA()", +"147288fb": "test_insert_findWithHint(int256)", +"1472d56a": "assertEq1(bytes1,bytes1)", +"1473248d": "SampleContract()", +"14743e7e": "activateRound(uint256)", +"1474b789": "burnXPTokens(address,uint256)", +"1475e751": "game_token()", +"1476e40f": "multiCall(address[],uint256[])", +"1478b6af": "abortUpdate()", +"1479290e": "removeBouncer(address)", +"14793058": "createPhoenixes()", +"14794702": "withdrawWinnings(uint256)", +"147a5640": "_getAllRevisionIpfsHashes(bytes20)", +"147aaa8d": "giveTokensTo(address,uint256)", +"147bfd66": "GuardedBeercoinICO()", +"147c9f6d": "updateWallets(address,address,address)", +"147d57b0": "send_bounty_token(address,uint256)", +"147d959a": "setUSDPrice(uint256)", +"147da3c9": "newSpaceshipProduct(uint16,bytes2,bytes2,bytes2,bytes2,uint256)", +"147e14a4": "retrieveTokens(address,address,address)", +"147e51f4": "freezeTheMoment()", +"14807045": "flipCapSwitchTo(bool)", +"148105ab": "addBankroll()", +"148174cd": "ownerSetCasino(address)", +"1481c04a": "getTXSValue(uint256)", +"1481d439": "deleteUserClaimInBulk(address[])", +"148222cf": "donateSkin(uint128,address)", +"1482bd40": "bountyBalanceMap(address)", +"148303a7": "SafePower(uint256,uint256)", +"14838617": "DEV_PORTION()", +"1483fc8c": "addBlockData(uint256,bytes)", +"14841164": "extraBalanceWallet()", +"1484abf4": "whitelistApplication(uint256)", +"1484cd32": "getWinners(uint16,uint8)", +"1484e9ad": "startICOStage2()", +"14852606": "setAccompliceBContract(address)", +"1485ffc4": "finalizeTDE()", +"14870a57": "setMonthClose(uint256,bool)", +"14870d2c": "withdrawAllToken()", +"14887c58": "isEntity(address)", +"1488f983": "LogFinalized(address)", +"148ab04e": "balance_in()", +"148ab078": "MEW_RESERVE_FUND()", +"148bea6b": "gamblerlist(uint256)", +"148cd939": "transferBecauseOf(address,uint256,address,uint32,uint256)", +"148ce4a4": "test_claimShare_isTranscoder()", +"148d3e7b": "FQCoin()", +"148da7f6": "disableInvestment()", +"148dd101": "thirdChangeBlock()", +"148f2e5e": "sendWei(address)", +"148fa780": "just10Send()", +"14900396": "changeRaceOwnership(address,address)", +"149148e0": "getCityPlanAddres()", +"1491858e": "calculateSetupAllowedUntil(address[16],uint256)", +"14918f5e": "performInitialWithdrawal()", +"14930d7e": "transferResidualBcoupons(address,uint256)", +"14941e80": "getFreeAmount()", +"14946a97": "CoreToken(uint256,string,string,uint8)", +"1494ecfc": "SentosaX()", +"14950f64": "RevokeAddressChanged(address)", +"14959741": "UserMessage(address,string)", +"149607d3": "EtherollToken()", +"149679b9": "GOE()", +"1496fc4c": "Telcoin()", +"14975cc7": "hardCapPrice()", +"14986f5b": "setCooldowns(uint32[100])", +"1498970a": "getDeployedblockbytesMarriages()", +"149947fd": "finding(address,bytes8,uint8[])", +"1499c592": "setParent(address)", +"149acf9a": "daoCreator()", +"149b8690": "supplyInCirculation()", +"149c5066": "ChanceOfWinning(uint256)", +"149cc1f6": "_finalizeBet(bytes32,address,uint256,uint256)", +"149cd0be": "alterCreatePetitionFee(uint256)", +"149dffc8": "numCancelledRequests()", +"149e6788": "heroClasses(uint32)", +"149e685a": "getFundById(uint256)", +"149eead5": "master_contract()", +"149f2fdb": "sellExchangeRate()", +"149fc918": "_rejectMint(uint256,uint256)", +"14a0069a": "getVoter(string)", +"14a03e7c": "concludedGameIndex()", +"14a06710": "TokenRelease(address,uint256)", +"14a091a9": "createLockTokenHistory(address,uint256)", +"14a1231f": "guardian2Vote()", +"14a26806": "setPreUri1(string)", +"14a2d99f": "Grant(address)", +"14a34ebd": "getMilestones(uint256,uint256)", +"14a3557b": "intrepidVoucherSoldCount()", +"14a3b19a": "transferIndexedByAddress(address,uint256,address)", +"14a47046": "add_blockedAddress(address,address)", +"14a4a273": "penalizationOpen()", +"14a528f2": "HasGift(string)", +"14a54912": "token_a()", +"14a57db7": "LogPreparePreContribution(address,uint256,uint256,uint256)", +"14a59e9d": "getStakeholderConfirmationCount(uint256)", +"14a5cd29": "getAssetEmitter(uint256)", +"14a6a1a5": "REQUESTED_STATUS()", +"14a7945a": "redeemAllOwnedAssets(uint256)", +"14a7c57d": "getData_26()", +"14a89904": "rollDie(address,uint256)", +"14a8bd0d": "EXCHANGE_RATE()", +"14a8ca20": "fromPercentage(uint256,uint256)", +"14aa0eaa": "claimBountyToken()", +"14ab260e": "retrieveCompletedProof(bytes32)", +"14ab9038": "setTTL(bytes32,uint64)", +"14aba0db": "MineAD(address,uint256)", +"14ac1102": "get_total_items_in_state(bytes32)", +"14ad47eb": "SwapToken()", +"14ae1229": "setRightForInterest(uint256,uint256,bool)", +"14aedbee": "TokenFactoryAirdrop()", +"14af0908": "XdacTokenCrowdsale(address,uint256[],uint256[],uint256,uint256)", +"14af1e92": "MinterGaveCWC(address,address,uint256)", +"14af35c3": "MyToken(string,string,uint256)", +"14afd79e": "ownerOf(address)", +"14b0519d": "AltExtraHolderContract(address)", +"14b08b4d": "getAllDepositors(uint256)", +"14b0e266": "addBid(uint256)", +"14b11606": "BONUS_ICO_STAGE2()", +"14b11651": "setPoolAndAmount(address,uint256)", +"14b11875": "verifyProposal(address,address,uint256,string)", +"14b1e1f8": "setRefer50x50(address)", +"14b24209": "multiGuess(int256[])", +"14b2cd55": "LightPool()", +"14b2d6dc": "isValidDate(uint256,uint256,uint256)", +"14b419c9": "getAllUsers(address)", +"14b49c36": "Police_5()", +"14b5202c": "stage_Discount()", +"14b546b4": "FreePublicity()", +"14b577ab": "addIdArrayItem(address,address,string,string,uint256)", +"14b72000": "txFeeCapInWei()", +"14b77798": "unsetMany(address[])", +"14b78abb": "cloneProposal(uint256,string,bytes32,uint256,uint256,uint256,uint256)", +"14b79e21": "_depositTransferCredits(uint256,uint256)", +"14b7c684": "DGD()", +"14b80402": "isStateDestructed()", +"14b85c1b": "removeSalesAgent()", +"14b87862": "getParticipant()", +"14b8e9a4": "checkpointLevel()", +"14b92721": "loveMessage()", +"14b933e1": "getWeiPerSatoshi()", +"14ba5c09": "getDay()", +"14bafeab": "getMessage2()", +"14bb4dd9": "WavesTransfer(address,string,uint256)", +"14bba4b8": "setDiscount(uint256,uint256,uint256,uint256,uint256)", +"14bba8a2": "updateRequestExpired()", +"14bbe21c": "transferBeneficiary(address)", +"14bc3efc": "endBorrowAgreement(string,string,uint256,uint256)", +"14bd0c21": "getServiceAddress(bytes)", +"14bd3d87": "acceptOffer(string)", +"14bd8acd": "massApproval(bool,uint256,uint256)", +"14be4ecc": "setWETHContract(address)", +"14be5169": "releaseLockAgencyLock2()", +"14be7793": "isPrivateSale()", +"14beb3a3": "latestParams()", +"14befc70": "parkingOff(address)", +"14bfd6d0": "admins(uint256)", +"14c01fb4": "_checkPixelAbove(uint256)", +"14c0a37a": "stateBorrowerDefaulted(uint256)", +"14c0bc27": "EtherBalanceOf(address)", +"14c0ffdc": "formula(uint256)", +"14c15569": "getAccountOutputSdcslength()", +"14c16f41": "updateStageWithInvested()", +"14c239a9": "_cappedReward(uint256)", +"14c259eb": "white_duration()", +"14c292ca": "finishITO()", +"14c2d2e0": "handleRef(address,uint256,uint256,uint256)", +"14c33c24": "setSystemEndingPrice(uint256)", +"14c3512d": "adminSetFeeUsdDialNumber(uint256)", +"14c3e29f": "NONEC()", +"14c411c7": "releaseTeamTokens()", +"14c44e09": "registrationFee()", +"14c485c9": "getMartialListInfo()", +"14c588de": "setPromoGen0(uint256)", +"14c5f158": "callModifiedTransfer(address,uint256)", +"14c65687": "_getWeightUntil(uint256,uint256)", +"14c72e9e": "_getFirstIndex(uint256,uint256[])", +"14c74834": "setHeir(address,uint256)", +"14c7763b": "MINTING_LIMIT()", +"14c78333": "batchResolveAquarium(uint256[])", +"14c7bddf": "manualRefund()", +"14c888da": "setFeeParams(uint16,uint256,uint256)", +"14c8e5f4": "requestHangingDividends()", +"14c9035e": "quickConvertPrioritized(address[],uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"14c9b8a5": "closeEarly(uint256)", +"14c9eed0": "onlyadmin()", +"14ca5200": "MiningRewardTransfer(address,address,uint256)", +"14ca5398": "submitFullBlock(bytes,uint256[],uint256[],bytes,bytes,bytes,bytes,bytes,bytes,uint256)", +"14ca6e01": "setBleachPrice(uint256)", +"14ca8e01": "validPlayer2(uint256,address)", +"14cabddb": "joinProof(uint256)", +"14cb1ae4": "ContractOwnable()", +"14cba002": "_forwardTransferFromWithReference(address,address,uint256,string,address)", +"14cbb90d": "yea()", +"14cbd993": "getRegisteredTokens()", +"14cbdb54": "EspCoin()", +"14cc3cf9": "FOUNDERS_LOCK_PERIOD()", +"14cd70bc": "FakeOwner(address)", +"14cddf9e": "whiteListMinAmount()", +"14ce2f61": "MappingDone(address,uint256)", +"14ce4059": "owner_fee()", +"14cf12d5": "softCapTime()", +"14cf19fe": "TIER1_PRICE()", +"14cf588f": "LBA()", +"14cf6983": "getBalanceCell(address)", +"14cfb977": "minFinneyPerSaleMoreThan()", +"14cffda2": "synertreeToken()", +"14d03ea6": "TrivialToken(string,string,uint256,uint256,address,address,uint256,uint256,uint256)", +"14d04e06": "FooozCrowdsale(address,address)", +"14d066d5": "addCertificator(address)", +"14d07a3e": "left28(uint256)", +"14d0f1ba": "moderators(address)", +"14d10920": "BetstreakToken()", +"14d140b0": "communityPool()", +"14d20606": "devTeamPrecent()", +"14d23c8b": "MaliciousSeller()", +"14d296f4": "getPremiums()", +"14d2d59d": "_approve(uint40,address)", +"14d30335": "assignInitialDays(address,uint256,uint256)", +"14d33a30": "addCandidateBatch(address[])", +"14d36f53": "checkVerifyAccess()", +"14d3df67": "getSMPTokensAmountPerEthInternal(uint256)", +"14d47bc9": "registerBeneficiaries(address[])", +"14d4ecd9": "defineCurrentPeriod(uint256,uint256)", +"14d547aa": "returnInvestments(address)", +"14d5d892": "changeMemberAddress(uint256,address)", +"14d67848": "setClass(uint256,uint256)", +"14d6c2b1": "_maint_updateOwner(address)", +"14d72106": "nextNumberOfWagersToFinalTimeout()", +"14d75e9d": "createProduct()", +"14d79e37": "GetRed(address)", +"14d8c981": "getItem(address)", +"14d9d2e5": "getCostForUprade(uint256,uint256,uint256)", +"14dacf5b": "disableWhiteUserList()", +"14db6d58": "hasUserPermission(address,bytes4)", +"14db8c7d": "getGladiatorPower(address)", +"14dba3ba": "PPToken(uint256,uint256)", +"14dbb508": "Project(string)", +"14dcd58f": "derpcoin()", +"14dcfd55": "vendorWallet()", +"14de9cc2": "tokenGenerated()", +"14dea8e7": "onCancel(bytes32,uint256,address)", +"14deb0ac": "addressAt(address,bytes,uint256)", +"14df96ee": "isRoundingError(uint256,uint256,uint256)", +"14dfad27": "_emergencyLoop()", +"14e0246a": "setMintSigner(address,int256)", +"14e2bc2a": "finishMinting(uint256)", +"14e3fad3": "extra_bonus_amount()", +"14e4a723": "SafePromo()", +"14e580ab": "LogIdentityCreated(address,address,address,address)", +"14e604b6": "EXPLOSION_DENOMINATOR()", +"14e6a86d": "doCheckBounds(bytes32)", +"14e8093f": "clientWithdrawAll()", +"14e887e8": "transactionCounter()", +"14e904e8": "LogBidCompleted(uint256,bytes32,bytes32)", +"14eaa43b": "withdrawToken(address,uint256,string)", +"14eb75bb": "assignRoles()", +"14eb76ac": "updateTeamAddress(address)", +"14eba026": "removeTeamMember(address)", +"14eba5d8": "affiliateList()", +"14ec4106": "createAuction(address,uint256,address,uint256,uint256,uint256)", +"14eda32c": "COZE()", +"14eea0dc": "IND()", +"14efaf86": "ChangedPaymentDestination(address,address)", +"14f0ff32": "FUNK()", +"14f1244c": "reclaimDeposit(address[],uint256[],bytes32[],uint256[],bytes,bytes)", +"14f1586a": "objective()", +"14f1dcac": "setFreeCoins(uint256)", +"14f2979f": "getTickets(uint256)", +"14f36e17": "getTokenIssued()", +"14f3f491": "preICOContract()", +"14f52c07": "Blogcoin()", +"14f604b8": "deposit_asset_to_session(uint32,uint32,uint64)", +"14f60881": "getJobClient(uint256)", +"14f64d6c": "PRESALE_START_WEEK1()", +"14f685a8": "Etherumble()", +"14f6c3be": "getETH()", +"14f72e50": "EightStandardToken(uint256,string,uint8,string)", +"14f7731b": "getAllowedAmount(uint256)", +"14f7789d": "GRAChain(uint256,string,string,string)", +"14f796ca": "changeStageAndReleaseETH()", +"14f80083": "setMultisigVault(address)", +"14f8917a": "initialSupplyPreSale()", +"14f8b424": "roundID()", +"14f8f160": "hasIssue(address,bytes32)", +"14f99533": "changeAuthorisedContract(address)", +"14f9e35b": "groom()", +"14fa0b45": "NenasChain()", +"14fa274c": "MigrationInfoSet(string)", +"14fbc22b": "createHero(uint256,address)", +"14fc2812": "setAuthorized(address)", +"14fc7b9d": "AscToken(address)", +"14fcb95c": "ubiatarPlayWallet()", +"14fd0c14": "deadlineVoting()", +"14fd24f0": "updateIndividualCap(uint256)", +"14fddb71": "devTeamBalance()", +"14fdecca": "getPromotion(uint256)", +"14fefca1": "set_hp(uint256)", +"14ff5ea3": "getTokenId(uint256)", +"14ff5f99": "punterAddress()", +"14ff89cd": "getContactByIndex(uint256)", +"14ffbafc": "startEthGet()", +"1500214e": "calcPercent(uint256,uint256)", +"15003368": "withdrawEMONT()", +"1500c257": "startTimePre()", +"1501bf03": "transferFunds(address,address,uint256)", +"15020cb0": "commandTookAway()", +"1502906d": "timeStep()", +"15036fa2": "update_dividend(address,uint256,uint256,uint256)", +"1504460f": "poke(bytes32)", +"150455a4": "HOTCASH()", +"15045c3e": "GenieToken()", +"1504ce95": "payout(string)", +"1504d8f0": "createSnapshot()", +"1504e40b": "RoundEnded(address,uint256)", +"150627bb": "minimumInWei()", +"15067c4e": "p_setRoundDuration(uint256)", +"15070401": "getSymbol()", +"150727ff": "getSecondAddressBalance()", +"15087f7d": "cancelBet(uint256,bool,uint256)", +"15093e03": "minimumAllowedWei()", +"1509c42a": "pr()", +"150a5655": "giveVote(string,uint8)", +"150a6480": "allowMinter(address)", +"150aaf74": "BHB(uint256,string,string,uint8)", +"150ad280": "review(uint256,bool)", +"150ad2a8": "owner_transfer_ownership(address)", +"150b52db": "removeAddressFromPartnerWhiteList(address)", +"150b60e6": "MAYNILAD()", +"150b6885": "genaroDevMultisig()", +"150b7a02": "onERC721Received(address,address,uint256,bytes)", +"150bc419": "unitMythGrowth()", +"150c3e8b": "getIdxArray(uint256)", +"150d6277": "setMinBetPerSpin(uint256)", +"150d7163": "UnfreezeTokensOfOneUser(address)", +"150eb4d9": "releaseTeam(uint32)", +"150f16ac": "stoppedPresale()", +"150fa89f": "FirstUser()", +"15105fa8": "clearCreator(uint256)", +"1510ca79": "MAX_CROWDSALE_TIME()", +"151110b0": "releaseLockedBalance(uint256)", +"1512cfc1": "_preValidateInvest(address,uint256)", +"15136fb5": "ChiTrader()", +"15139f09": "ExaGBP()", +"15142ed4": "shutDownVersion(uint256)", +"15143d6a": "buyOx()", +"1514617e": "vestingDuration()", +"15148649": "getAllowedTokensCount()", +"1514b9cb": "RKCToken()", +"1514bc48": "tokensForPurchase(address,uint256)", +"1514ea54": "getLossesShare(address)", +"15154aff": "ITO()", +"15158a10": "numberOfTokensToAvail25percentDiscount()", +"1515bc2b": "hasClosed()", +"151682a5": "HASH_RATE_MULTIPLIER()", +"1516bbc4": "setTeamVault(address)", +"1516db09": "allOwners(uint256)", +"1516def7": "multiSigAddress()", +"1517d107": "totalNormalCollected()", +"15183e2f": "twitterBotAddress()", +"15191c98": "hibernate(uint256)", +"15194a9f": "init(uint256,string,string,uint8)", +"151b0bed": "getSponsorshipsBalance(address,uint256)", +"151b2342": "getOraclizeCallbackFee()", +"151bc167": "Control()", +"151bcc06": "massAdvertiseTransfer(address[],uint256)", +"151c0d40": "crowdsaleEther()", +"151c3b12": "store(address,bytes)", +"151c61b6": "setUSDExchangeRate(uint256)", +"151d7d32": "flushDividends()", +"151e2a0a": "check_ptc_num(address)", +"151eeb55": "transferAllowed(address)", +"151fa6be": "delegateIsDeleted()", +"15226b54": "getReserveBalance(address)", +"1522f110": "preregvills(address)", +"15248362": "buy_bounty()", +"152583de": "getAttributes()", +"152592b0": "WALLET_ALLOCATION()", +"1525b4f5": "mintLockedTokens(address,uint256,uint256)", +"1525d680": "MainToken(address)", +"1525ff7d": "setTeamWallet(address)", +"15263ef7": "VHW()", +"15270ace": "distribute(address,address[],uint256[])", +"152713b3": "sumAcceptedVirtualContrib()", +"152744ea": "BondInfoById(uint32)", +"1527d657": "returnHowMuchMoreETHNeeded(uint256)", +"152826e9": "cashoutable()", +"15285aa3": "EventBid(uint256,address)", +"1528f43c": "getPOOL_edit_10()", +"152993a8": "addContract(string,bytes)", +"1529a639": "getCollateralBalance()", +"152a3f28": "getSponsorships(address,uint256)", +"152af8f9": "acceptFoundationTransfer()", +"152afab4": "adicionarAssinatura(string,string)", +"152b6f9a": "hasDNN(address)", +"152cf3af": "ethPayment(bytes32,address,bytes20,uint64)", +"152cf9db": "getDataPoint(int256,uint256,uint256)", +"152e84a7": "tokensDistributed()", +"152fb125": "SimpleMixer()", +"152fb5fd": "period_count()", +"15303771": "updateUnsold(string,uint256,uint256)", +"1531076c": "getAgonArray(uint64,uint64)", +"15312b50": "SimpleTokenVesting(address,uint256)", +"153154fd": "getRecommender(address)", +"1531c267": "fipsRegisterMulti(uint256,address,bytes)", +"1531dfdb": "ethtosend()", +"15328109": "parentAddr()", +"153345ce": "changePrice(uint256,uint256,uint256,uint256)", +"15334b77": "setGameStarterDividendPercentage(uint256)", +"15334fa7": "SOCToken(uint256)", +"15336f80": "setProof(string)", +"15338724": "mediaTokens(address)", +"1533ba50": "EMBCToken()", +"1534180f": "_transfer(address,uint256,bytes,string)", +"15347380": "priceInWeiToken(uint256)", +"1534b1fc": "getPlayerDepositData(address)", +"1534b392": "getNumLockers(address)", +"1534e8d2": "multiVesting(address[],uint256[],uint256[],uint256[])", +"1535884e": "notarizeHash(bytes32)", +"153677b7": "deployOtherVesting(address,uint256,uint256)", +"1536a614": "EphesusToken()", +"1536cabf": "addCertAdmin(address)", +"1536fec6": "get_end_time()", +"15370598": "getCurrentMode()", +"153737f5": "OWN_DistributeTokenAdmin_Multi(address[],uint256,bool)", +"15373e3d": "castVote(uint256,bool)", +"1537671c": "qtdePokemonsMapping(address)", +"15382559": "LogDepositReceived(address)", +"153913e3": "ICO_Live()", +"15398afe": "compareNumericStrings(string,string)", +"153a1f3e": "bulkTransfer(address[],uint256[])", +"153a6bd3": "test_sendFundsToContract()", +"153a79c9": "buySaleTokens(address)", +"153aa771": "totalSupplyBonus()", +"153b0d1e": "setBlacklist(address,bool)", +"153b31fd": "sign(string,uint256,uint256)", +"153cc53d": "hasCrowdsaleStarted()", +"153d3572": "deletePawn(uint256)", +"153debee": "FOUNDERS()", +"153e66e6": "buy(address,address,uint256)", +"153e6d70": "setPercentFrozenWhenAwarded(uint256)", +"153faf2c": "FOUNDER_WALLET()", +"153fbb81": "setCAPAddress(address)", +"153fe583": "getAddressFromSig(bytes32,uint8,bytes32,bytes32)", +"153fe6aa": "STATUS_INITIAL()", +"15408734": "addMake(string,address,uint256,uint256,bool)", +"15409c1d": "TradingAccount()", +"1540fe22": "weiMinimumLimit()", +"15413ccf": "logicProxies(address)", +"1541eb12": "JournetToken()", +"15420b71": "transferPreSignedHashing(address,address,uint256,uint256,uint256)", +"1542b365": "phase_4_remaining_tokens()", +"1543136c": "getDeployedLength(address)", +"1543d99f": "bonus_calculation()", +"1544fc67": "delegatorStatus(address)", +"15454cd2": "registerNameCore(uint256,bytes32)", +"15480c63": "createDefaultCobeFriend(uint256,uint256,uint256,address,uint256,uint256)", +"15490ebb": "transferReward(address,uint256)", +"154920b0": "firstEmptyId()", +"15497d2c": "lockStatus(address)", +"1549be43": "getOutstanding(address)", +"1549c1e2": "usePlayerToken()", +"154a7d71": "DATE_31_DEC_2019()", +"154ad3f7": "ChangeMemberName(address,string,string)", +"154af6b1": "sendShares(uint256,uint8,uint256,address)", +"154b3f4c": "executeSigned(address,uint256,uint256,address,bytes)", +"154d56db": "callHotel(address,bytes)", +"154d6e12": "buyPack(uint8,uint128)", +"154d7944": "newCarID()", +"154e3f61": "enroll(address,address,uint256)", +"154e45a4": "privateSold()", +"154e8152": "withdrawnBalance()", +"154e95f1": "changeNamespaceOwner(string,address)", +"154e9bd5": "PumaPayToken()", +"154f78dc": "FREETOKENTEST(uint256,uint256)", +"154faf5d": "getTodayIndex()", +"15502d73": "changeTokenFreezeDate(uint256)", +"15506bf1": "RemoveParticipant(address,address)", +"15519af1": "RANGESTART_PRESALE()", +"1551e636": "tokensReceived(bytes32,address,address,address,uint256,bytes,bytes)", +"15525991": "getMaxAmount(address)", +"15527006": "icoPhaseDiscountPercentage3()", +"1552cb04": "addBaseWhitelist(address[])", +"15544fc2": "Teaeum(uint256,string,string)", +"1554611f": "escapeHatch()", +"1554c243": "_setApp(address)", +"1555e337": "ConferenceCertificate()", +"1555fe7e": "RecordableRefundableCrowdsale(uint256)", +"1556195c": "LowRiskBag()", +"15574634": "requestTransferFundToSupplier()", +"1558687a": "DepositContract()", +"155897cc": "changeDeDeAddress(address)", +"1558ab7e": "sendEthBack(uint256)", +"1558ae4d": "Etheroll()", +"155949ca": "buyStores()", +"15598339": "GetPurchaseInfo(address)", +"155ac95f": "switchname(bytes32)", +"155bdaa0": "SEGFAULTCOIN()", +"155ce432": "Restitution_Historique_Transactions(address)", +"155dcb47": "ZJFTokenDeposit()", +"155dd5ee": "withdrawFunds(uint256)", +"155f0ebc": "dividends(bool)", +"155f1861": "claimBonusCard()", +"156014e8": "addAddressToPartnerWhiteList(address,uint256)", +"15613495": "earlyBackersWallet()", +"15613d9f": "chainIdValue()", +"15616d2b": "getCurrentResult()", +"1563f4ff": "adminOrInitializing()", +"1564d706": "lockIn()", +"15659dde": "getBidCount(bytes32)", +"1565b0b6": "PRICE_ICO4()", +"1565c3c8": "takeEther()", +"1565f12f": "createVote(bytes32,address,address,uint256,bool,string,string,uint256)", +"156773ca": "setAllStopper(address)", +"1567d7a7": "transferPromotionalShares(uint256,address,uint256)", +"1568a1a1": "vinciSold()", +"15691522": "AltSocialAccountPw(bytes32,bytes32,bytes32,bytes32)", +"15698812": "redeemExcluded(bytes32)", +"156a0528": "getBalancesPayer(uint256)", +"156a2f36": "bid(address,uint128)", +"156b1494": "removeExpiredAssignments(address,uint256)", +"156bf4c1": "getKtcAddress()", +"156c0ed4": "Scanetchain()", +"156c2e82": "withdrawGxTokens(address)", +"156c6baf": "isAllowCnsContract(address,bytes32,bytes32)", +"156cacc3": "Etheroneum()", +"156e29f6": "mint(address,uint256,uint256)", +"156e5039": "safeadd(uint256,uint256)", +"156e9507": "mineTotalBalance()", +"156f985c": "getFundsStatus()", +"157003d9": "tierCaps(uint256)", +"157024b3": "producerStatement(string)", +"15728a73": "GoBlockSupply()", +"1574126a": "preSaleEndBlock()", +"15748250": "freeze(address,address)", +"15752ac5": "bonusTokensAllocated()", +"15764334": "Hybrid()", +"15770d99": "disapprove(address)", +"15781c80": "checkPurchaseValid(address,uint256,uint256)", +"15786590": "lotteryTotalEarning()", +"1578a123": "Send_MediatedTransaction(address,uint256)", +"1579e5c5": "getAllCardAddressesOfOwner(address)", +"157a18b4": "ADMOToken()", +"157a68df": "createIssue(uint256,address,uint256[],address[],string)", +"157ad5a1": "canWithdrawBond(address,uint256)", +"157b5167": "fun2()", +"157bbbf5": "winJackPot(address,string,uint256)", +"157cb62c": "getPlayerDnas(address)", +"157d5956": "isGetFreeZombiew(address)", +"157daf2e": "returnChange(uint256)", +"157db359": "airdroper()", +"157ddf8f": "bonusTotalSupply()", +"157e2063": "ASTBToken()", +"157f33f5": "coinIssuedTotal()", +"157f5610": "showGameEnd()", +"157f67e8": "withdraw_my_tokens()", +"157f8f51": "feePaid(int256,int256,int256,int256)", +"157fbd8d": "emitAccessBlocked(address,bytes32)", +"1580391c": "set(bool,string)", +"158048a0": "settlePut(uint256,uint256,address)", +"158059e2": "changeVotingRules(uint256,uint256)", +"1580beb7": "HOPEtoken()", +"158163c8": "setMerculetPrice(uint256)", +"15817881": "saleStageStartDates(uint256)", +"1581b600": "withdrawAddress()", +"15830662": "assignTokens(address[],uint256[])", +"15834aed": "tournamentQueue(uint256)", +"1583deb2": "businessAddress()", +"15843245": "PeoplesToken()", +"158495df": "tokenIds(uint8)", +"15862aff": "lookupIndex(uint256,uint256)", +"158641f5": "getArtistId(bytes32)", +"158686b5": "change_admin(address)", +"15875f54": "getVestingEndTime(address)", +"158859f7": "disableTokenTrade(address)", +"1588ce09": "closeManualyMining()", +"158952da": "tipUser(bytes32)", +"15899670": "todaysBidTotal()", +"158a1184": "operation_amount(uint256)", +"158a4988": "distributeTokens(address,uint256)", +"158b8e54": "LastTokenId()", +"158be5a2": "WTF()", +"158d1fd4": "crowdsaleEndedSuccessfully()", +"158dec25": "maxSubmissions()", +"158e7986": "addBallotAndVoterWithPk(bytes32,bytes32)", +"158e7e53": "maxPreIcoAmount()", +"158ee887": "emergencySetOwner(address)", +"158ef412": "forceUpdateName(string)", +"158ef93e": "initialized()", +"158f7f5c": "reservedFounder()", +"15902a09": "removeOpenOrderFromBook(uint128)", +"159090bd": "take()", +"15910e5c": "logPurchaseViaToken(address,address,uint256,uint256,bytes32)", +"15915ddd": "directMintTokens(address,uint256)", +"15917977": "changeUniqueOwnership(string,uint256,address,address)", +"15919eed": "Arena()", +"1591bf51": "getPubKeyArr50(bytes32,uint256,uint256[])", +"1591dc6a": "BuyLoan(address,uint256,uint256)", +"159218d2": "setStagesManager(address)", +"15927801": "distributePrize(bool)", +"1592aa2e": "registHns(string,address)", +"1592c087": "transferTusdProxyOwnership(address)", +"1593796e": "didReveal(bytes32,address)", +"1593a8c7": "endLottery()", +"1593ecb8": "LOG_IncreaseInvestment(uint256)", +"1594060a": "HalvingInfo()", +"15945790": "_supply()", +"15949ed7": "getPermissionParamsLength(address,address,bytes32)", +"1594afd1": "setExchangeRateShift(uint256)", +"1595f207": "TKT(address)", +"159621d2": "getProfesor()", +"15969c4e": "minimumStageDuration()", +"1596b2bf": "getServiceFeeNumerator()", +"1596facb": "saleTime()", +"15977d45": "ledger(bytes32)", +"1597ee44": "encode(uint8[])", +"15980795": "freezeOf(uint8,uint8)", +"15981650": "setTicketPrice(uint256)", +"15983796": "getNextSnapshotBlock()", +"1598653d": "firstThousandUsers()", +"159887d1": "calculateFactor(uint256,uint256)", +"1598b2e0": "getSeatClaim(uint256)", +"15992cda": "uniq(uint16[])", +"1599a096": "mixStringAddressFunc(string,address)", +"159a3c33": "AWAXToken()", +"159a6475": "getFingerprint(uint256)", +"159ad680": "updateuser()", +"159b4e91": "sendTempTokens(address,uint256,uint256)", +"159bd2f3": "earnedFunds()", +"159c18bc": "removeWhitelistOperator(address)", +"159c2d9f": "BuyKeys(uint256,uint256)", +"159c60e8": "ZDMCoin()", +"159ce057": "getReturn()", +"159d3c24": "sellZone(uint256,uint256)", +"159d526f": "calcStateHash(bytes32[10],uint256[4])", +"159d8562": "ediv(uint256,uint256)", +"159da82d": "getInvitationValidPeriod()", +"159dbef7": "_0xDiaryToken()", +"159de07a": "FundariaBonusFund()", +"159e1e14": "EthereumPrivate()", +"159f82fc": "getEventResult(uint64)", +"159fb416": "transferCreditBotAddress()", +"15a03930": "TossMyCoin()", +"15a090c0": "getMiningWarRoundNumber()", +"15a0df43": "testThrowCreateNewRevisionNotOwner()", +"15a0ea6a": "claimFees(address)", +"15a269f7": "withdrawBalance(address,address)", +"15a29035": "getTask(bytes32)", +"15a2bd76": "allowOrRestrictMethod(bytes4,bool)", +"15a38bda": "isOldVersion()", +"15a3c611": "project_registry(uint256)", +"15a4806c": "EtherButton()", +"15a4d313": "NovaChain()", +"15a50aff": "getInvalidKeys()", +"15a51595": "TeamMembersAddress()", +"15a52302": "getService(address)", +"15a529b6": "getAllSalesByAddress(address)", +"15a55347": "reservedTokens()", +"15a5d9d8": "contractAddr()", +"15a60b76": "_calFrozenAccountCoin(address)", +"15a653a0": "numberOfSupportedTokens()", +"15a686f3": "PixelOperationsContract()", +"15a6a11c": "mintLeftOverZCOToWallet()", +"15a6a38d": "RedeemMTU(bool)", +"15a6f5c1": "setLatestTokenPayday(address,address,address,uint256)", +"15a75f9f": "playFor(address,bytes32)", +"15a9a145": "numRewardsAvailable(address)", +"15aaa09b": "PRECOE()", +"15aaefd5": "_transferPrimordialToken(address,address,uint256)", +"15ab250d": "setCresus(address)", +"15ab8302": "RoundASold()", +"15abc160": "createValidatedRequest(address[3],address,uint256[11],uint256,bytes)", +"15ac4c90": "setDayEthInLimit(uint256)", +"15ac534d": "closeBetting()", +"15aca0c4": "LogError(uint256)", +"15acce5e": "arpDeposited()", +"15ad1be3": "unrestrict(address)", +"15ae0629": "getHash(bytes,uint256)", +"15ae1972": "stageRate()", +"15aec1fb": "airdropadd()", +"15aec7ee": "BlockChainCourse()", +"15aee408": "FinaliseSale(address,address,uint256)", +"15af64e7": "JACToken()", +"15afa98e": "totalEth_()", +"15b02a4c": "totalICOable()", +"15b03fde": "getaddresstotal(uint256)", +"15b07f69": "nextCourse()", +"15b0821f": "mintDRSCoin(address,uint256)", +"15b21082": "requestCustodianChange(address)", +"15b23e47": "OncoToken()", +"15b2b1ae": "SaleStatus(string,uint256)", +"15b3433b": "dexjartoken()", +"15b37899": "setKyberNetworkAddress(address)", +"15b40ec0": "deployed(uint256)", +"15b4bc22": "getMinerHalving()", +"15b53beb": "TournamentOver()", +"15b556df": "getSellPriceAfterTax()", +"15b56b44": "checkReward(uint256[])", +"15b66fef": "calculateClaimableRewardTillRound(address,address,uint64)", +"15b73a1d": "ICOSupply()", +"15b7ab02": "setAgriChainProduction(address)", +"15b8003b": "buyChance(uint32,uint32,bytes32,uint256)", +"15b88b35": "PeaceToken(uint256,string,string)", +"15b9a8b8": "controllerCount()", +"15ba9ea2": "register(address,bytes32[5],address)", +"15bbc15d": "approveMP(address,int256,uint8)", +"15bc9441": "convertToDEF(uint256)", +"15bd73f1": "offerchangeprice(uint256,uint256)", +"15bd8bb2": "getTimestampByHash(string)", +"15bddfbe": "__setParameters(uint32,uint256,address)", +"15be2e7c": "totalSaleLimit()", +"15bef9cd": "changeMembers(address[],bool)", +"15bf2b51": "last10()", +"15bf430d": "Project()", +"15bf7cd7": "deployedPresaleContract()", +"15bf7ed2": "publicFundingPersonalEthLimit()", +"15c0251c": "getCoinWallet(bytes4)", +"15c12d4d": "totalWeiWon()", +"15c1c5b8": "EternaCoinContract()", +"15c2eed8": "RedlineFinancialLabCoin()", +"15c30006": "_payoutReferr(address,address)", +"15c32297": "setCanTrade(address,bool)", +"15c3cd94": "canTransferUST(bool,bool)", +"15c43aaf": "contractInfo()", +"15c4dc29": "MOSToken()", +"15c560c7": "addTotalInvoiced(address,uint256,uint256)", +"15c5c950": "isProcessedTx(bytes32)", +"15c6b117": "CRPA()", +"15c6b40a": "cloneFeePercentage()", +"15c73afd": "resolveEmergency()", +"15c7ff34": "isPaidUntil(address)", +"15c8276d": "_supportsInterface(bytes4)", +"15c83cac": "getNewItemId(address,bytes32)", +"15c8d628": "normalBuyLimit()", +"15c91115": "pbkdf2(bytes,bytes,uint256)", +"15c98193": "getCampaignCreator()", +"15ca41c3": "notarizeHash(uint256,bytes32)", +"15ca65f0": "purchase(uint256,uint256,uint256,address,bytes)", +"15cab9c0": "pre_active_time()", +"15cb75e3": "replaceChiphash(uint256,bytes32)", +"15cbfdc1": "SpendingBlockedEvent(address)", +"15cce224": "setFeeToken(address)", +"15cd8e0b": "SECOND_PHASE_MAX_SPAN()", +"15ce09ad": "winningTimestamp()", +"15cec355": "_escrow(address,uint40)", +"15cedef7": "TFCPTest(uint256,string,string)", +"15cf4a5f": "createElection(string)", +"15cf59b6": "getCreatefeeWindowIdValue()", +"15cf7a35": "fechVoteResultForCandidateBySnapshotBlock(address,uint256)", +"15cff546": "isOperationBlocked()", +"15d10f38": "decreaseICOcap(uint256)", +"15d28e11": "totalLendingAmount()", +"15d2fc8a": "setPreIcoEndsAt(uint256)", +"15d3b5d8": "getTotalAllocation()", +"15d3cfe2": "EtherCashPay()", +"15d3e0a3": "transferToSafe()", +"15d3f614": "Bet4Land()", +"15d42327": "testMulMod(uint256,uint256,uint256,uint256)", +"15d44202": "resultsValidationStep()", +"15d494c4": "test_chain2_1_increaseTimeBy5000()", +"15d4c5d5": "proposeMint(address,uint256)", +"15d4f2df": "_internalTransfer(address,address,uint256,uint256)", +"15d51761": "partner2_will()", +"15d5219f": "calLoanAmount()", +"15d53d7d": "_existPublicKey(address)", +"15d655c9": "claimPrice()", +"15d6af8f": "winnerList()", +"15d707af": "KD0Token()", +"15d7085f": "calcRankFundsFee(uint256)", +"15d7811e": "findYforX(uint256)", +"15d7b2c4": "setVestingManager(address)", +"15d7bf44": "register(bytes32,bytes32,address)", +"15d85401": "QbaseTalk()", +"15d87dc4": "vendorVerify(address)", +"15d887a7": "confirmedTotalToken(bytes32,uint256)", +"15d99a77": "CleanSweap()", +"15d9a9ee": "registerBarcode(bytes32,bytes32,string,bytes32,string,bytes32,bytes32)", +"15d9ad50": "illiquidBalance()", +"15d9aefd": "TeaToken()", +"15da0b02": "setCommunity(address)", +"15da42dc": "airdropSEEDSinWei(address[],uint256)", +"15da63a0": "thirdStagePriceOfTokenInWei()", +"15da65a5": "currentQuestionId()", +"15dacbea": "transferFrom(address,address,address,uint256)", +"15dae03e": "getType()", +"15dbfe28": "fromReal(int128)", +"15dc806e": "getStageBonus()", +"15ddf344": "getWhitelistStatus(address,bytes32,uint256,address)", +"15de4607": "getOwnFashions(address)", +"15de8027": "getAquaTokenAudCentsPrice()", +"15deaa3f": "INTARO()", +"15df1a09": "_fromToken(uint256,uint256,uint256)", +"15dfaccd": "delAdministrator(address)", +"15dff3b3": "RoleLookup()", +"15e04206": "Strings(string,string,uint8,uint256)", +"15e1146b": "deadlinePreIcoTwo()", +"15e1c65c": "added_to_the_bank()", +"15e28700": "addTokenPairWhitelist(address,address)", +"15e3187d": "amIBeneficiary(address)", +"15e33901": "digest(bytes,uint256)", +"15e3ab3a": "nccToken()", +"15e3d37d": "getAllCardsForClaim()", +"15e5ae1e": "Killer()", +"15e5c69e": "_purchase(address,uint256)", +"15e70102": "myTarif()", +"15e812ad": "getBaseFee()", +"15e82e87": "Free_vote_for_candidate_B()", +"15e839c1": "setHeroGenes(uint256,uint256)", +"15e89927": "JAR(uint256,string,uint8,string)", +"15e9c2d4": "PainPoints()", +"15e9fc28": "setBets(uint256,bytes32[])", +"15ea426d": "hasUserWon(uint8,uint256,bytes32,bytes32)", +"15eaef6b": "tokenTransfer(address,address,uint256)", +"15eaf224": "getlastJadeProductionUpdate(address)", +"15ed6d06": "totalBondSupply()", +"15ed97c5": "_preValidateAssign(address,uint256)", +"15ee1255": "overrideCharPrice(uint256,uint256)", +"15ee3726": "createMesa(uint256,address)", +"15eec1b6": "setPayerString(string,string)", +"15ef29c3": "configureTokenParams(string,string,uint256)", +"15efc893": "confirmAdminTx()", +"15eff89b": "DiamondToken(string,string,uint8,uint256)", +"15f063f7": "totalStores()", +"15f06ede": "placeBuyOrders(uint256[],uint256[])", +"15f0c220": "marketingAllocation()", +"15f17902": "updateCeleb(uint256,string,uint256[6],uint256[6])", +"15f2226e": "removeAccessor(address,address,address,string,uint32,string,string,bytes32,bytes32,uint8)", +"15f24053": "getBorrowRate(uint256,uint256,uint256)", +"15f28c5f": "walletB()", +"15f2e1bf": "getFunderCount(bytes32,string)", +"15f2e2f7": "LOCK_START_TIME()", +"15f2eb87": "getNumEndableGames()", +"15f2fe4f": "setDelegadoDeDistrito(bytes32,bytes32,uint8)", +"15f3161f": "issue(address,uint256,uint32,uint32)", +"15f3223c": "assertHash(bytes32,bytes32)", +"15f570dc": "burn(address,uint256,string)", +"15f59033": "setPropertyLastUpdaterLastUpdate(uint16,address,uint256)", +"15f5ea17": "stop_auction()", +"15f647fc": "setLoanProductActiveState(uint32,bool)", +"15f667ca": "phase2TokenSold()", +"15f73331": "invalidateName(string)", +"15f78c0c": "GetBank()", +"15f84d25": "isActiveContributor(address)", +"15f903a3": "setNameValue(uint256)", +"15f92e3b": "getBeat(uint256)", +"15fa168a": "setVerificationRate(uint64)", +"15fb1a65": "slashPower(address,uint256,bytes32)", +"15fb2185": "adminSetAdmin(address)", +"15fbba7a": "delPokemonFromMaster(address,uint256)", +"15fdf660": "mPerSellData()", +"15fe3b6c": "testTransferAfterFinalize()", +"15ff8f3c": "RESERVE_PORTION()", +"16002f4a": "totalAuctions()", +"16011bf1": "addReader(string,address)", +"1602a124": "allowMinting()", +"1602c424": "purchaseRect(uint256,uint256,uint256,uint256,uint256[])", +"160344e2": "startLottery()", +"16035ba0": "getTotalVolumeEth()", +"16038be8": "mintVestedTokens(address,uint256,uint64,uint64,uint64,bool,bool,address)", +"1603c521": "opensourceFundManager()", +"1604901b": "getGameByID(uint32)", +"1604a127": "calculateBetOutcome(uint256,bool,uint256)", +"1604c449": "numTilesClaimed()", +"1604f9ea": "requestPrice()", +"1604fa4d": "checkIfProjectExists(bytes32)", +"1605750d": "addToWhiteList(address,address)", +"1605782b": "sha1(bytes)", +"16059170": "onSubCanceled(uint256,address)", +"1605a889": "DecenterHackathon()", +"1605bc07": "SVDelegationV0101(address)", +"1605dd61": "getAddressBySymbol(string)", +"1606a1c9": "getAuditReportIPFS(address,bytes32)", +"1607dd9d": "distributeSpecial(address,uint256)", +"160849a7": "participateICONow(address,uint256)", +"1608e93f": "dice(uint256,uint16)", +"1608f18f": "disableTransfers(bool)", +"16090250": "getPolicyDetails(bytes4,address)", +"1609a397": "unhaltsTrades()", +"1609b182": "ReputationToken()", +"1609bbbf": "BarimCoin()", +"1609bdf2": "EEMWallet()", +"1609be1d": "sweepTokens(address,address)", +"1609e43b": "levelStartupTimestamp()", +"160a453e": "queryTokens()", +"160a7925": "getPermissions(address)", +"160abc9d": "tier1Rate()", +"160b01a1": "childTokenByIndex(uint256,address,uint256)", +"160b313d": "addAssociatedAddress(uint256,address,address)", +"160c5239": "read_total_global_purchased_today()", +"160d5240": "_toNanoNIL(uint256)", +"160d66ae": "voteToken()", +"160dc0ac": "buyItem(uint256,address,string,string,string)", +"160e3f3d": "grant(uint256)", +"160e915f": "canAcceptPayment()", +"160f202f": "send_ETH_from_contract_to_me()", +"160fc374": "cancelOrder(address[3],uint256[3],uint8,bytes32,bytes32)", +"160fe0e2": "getWtotalEth(uint8)", +"1610b59b": "infoFields(bytes32)", +"1610c734": "bonusLimit5()", +"16114acd": "recoverTokens(address)", +"161181ea": "getUserLengthOnToken(address)", +"1612ec4f": "applyToken(address)", +"1613520f": "priceTLP1()", +"1613ec9d": "getInitFunction()", +"161448df": "BossContract()", +"16145311": "ISAO()", +"161593a3": "landmarkToApproved(uint256)", +"1615d035": "airdropWallet5Pct()", +"1615e11d": "DARK()", +"16163c89": "encodeBool(bool)", +"16164467": "findRequiredSubscriberIndex(address)", +"16164b33": "icoTarget()", +"16164e15": "setInvestorData(address,uint256,uint256,uint256)", +"161666eb": "calculateAddress(uint8)", +"1616f54a": "FOURTH_TIER_SALE_START_TIME()", +"16173f39": "sin(int256)", +"1617adf7": "periodITO_softCapInUSD()", +"16180e8e": "reallocation(uint256)", +"16181a48": "insert(address,string)", +"16181bb7": "shortSellShares(bytes32,uint8,uint256,uint256)", +"16188c79": "isBadToken(address)", +"161895eb": "startBuy()", +"16192d2a": "accountInformation(address)", +"161965d9": "getRN()", +"1619fc14": "initOraclize()", +"161b5e46": "transferOwner(address,address,uint256)", +"161b75b2": "returnRemainingTokens()", +"161b9f5e": "ControllerManager()", +"161c389a": "NewImage(uint256)", +"161c8594": "setKpopArenaContractAddress(address,address)", +"161d2a59": "approveCertificate(bytes32,bytes32,bytes32,bool)", +"161dc300": "mintForSampleRegitry(address,uint32)", +"161fc5b3": "StartNewMiner(address)", +"161ff662": "proxyTransferFromWithReference(address,address,uint256,bytes32,string,address)", +"16201c24": "updateLastActive(address)", +"16205a7c": "RateDelivered(uint256,uint256,uint256)", +"162094c4": "setTokenURI(uint256,string)", +"16210e25": "verificationHoldersVerifierAddressMap(address)", +"16212265": "closeAirdrop()", +"16216f39": "return13()", +"16220188": "AddToWhiteList(address)", +"16222950": "golemFactory()", +"162255e1": "m_frozen()", +"1622dbe4": "buy(address,uint256,uint256,uint256)", +"16233f3f": "withdrawMortgageTokens(address)", +"1624288d": "balanceOfTokens()", +"16243356": "end_time()", +"16244907": "changeAnimal(uint256,uint256,bytes32,uint8)", +"1624f6c6": "initialize(string,string,uint8)", +"16260713": "isFrozenByAddress(address)", +"1626315c": "purchaseNew(uint256,string,string,uint256)", +"16265694": "validRateDurationInBlocks()", +"16265b4e": "isDatasetRegistred(address)", +"16266fbc": "returnPays()", +"1626ba7e": "isValidSignature(bytes32,bytes)", +"1626fe64": "checkApprovalStatus()", +"16270f7d": "ownerIndexBit(address)", +"1627540c": "nominateNewOwner(address)", +"16277952": "userLoveLocks(address)", +"16279055": "isContract(address)", +"1627c3c1": "divForTeamEthContract()", +"1627d3f2": "createToken(string,string,address,address,uint8)", +"16281405": "buyXaddr(address,uint256,bytes32)", +"162856f5": "_emitOracleRemoved(bytes4,address)", +"162897c0": "sendUnsoldTokenToRewardSupply()", +"16291032": "setQualifiedPartner(address,uint256,uint256)", +"162927b6": "approve(uint256,address,uint256,uint256,address)", +"162a8e5f": "distributeTokensAfterIcoByOwner()", +"162bb373": "disableERC721()", +"162bc80c": "WithdrawTokens(uint256)", +"162bf1ee": "getBurnRequestAddressMap(uint256,string)", +"162cbefe": "AVAILABLE_AIRDROP_SUPPLY()", +"162d563d": "withdrawGNO()", +"162d7daf": "buyQST()", +"162dd6da": "takeEtherProfits()", +"162e2f6c": "reservationFromEthereum(address,uint256,uint256)", +"162e4fd0": "getFinalOutcomeByEntity(uint256)", +"16317946": "notifyTestimonial(address)", +"16317e7e": "setLiquidationThresholdPercent(uint256)", +"1631eb07": "unlockReward(address,uint256)", +"1632070c": "setRewardDivisor(uint256)", +"1632612a": "TrustEURO()", +"16328378": "precrowdsale(address)", +"16330c55": "setRafEnd(uint256)", +"163317c6": "fundAdvisor()", +"16339604": "_FIVETHOUSAND()", +"1634ab52": "transferCrt(address)", +"1635717c": "getInstruments()", +"1635e13c": "initBuilding(uint256,uint256,uint256,uint256,uint256,uint256)", +"16367c63": "earlyParticipantWhitelist()", +"163687ab": "defaultOperatorsByTranche(bytes32)", +"1636ed74": "gatewayOpened()", +"163740d1": "HieToken()", +"16381382": "getBetUint(int8,int8)", +"1638e70d": "DIETSweets()", +"1638f628": "calculatePayout(uint256,int256)", +"163935a8": "BlokTokenSale(address,uint256)", +"163aa00d": "lastRewardEthBlockNumber()", +"163aa631": "isIssued(bytes32)", +"163aba3c": "getQueryFee()", +"163c0351": "reserveTeam(uint256)", +"163c17b1": "goldFreeze(address,uint256,uint256)", +"163c4e3c": "CryptoGripInitiative(uint256,uint256,uint256,address)", +"163db71b": "totalDistributions()", +"163dba92": "setBlocks(uint256)", +"163ebd3a": "MainExchangeNM()", +"163eec78": "_addFundkeeper(address)", +"163ef5cb": "tgrSettingsPartProject()", +"163f6691": "getAttribute(address,bytes32)", +"163f7522": "isUserRegistered(address)", +"163f9b4f": "withdrawalOwner()", +"163fa64a": "setSkillPointCost(uint256)", +"163fa8af": "addInvestmentPackage(string,uint256)", +"164116f8": "_getPrice(uint256)", +"16413515": "tokenIdToData(uint256)", +"16419aa7": "slice16(bytes,uint256)", +"1641bced": "jackPotGameLockedToken(address,uint256)", +"1642fcca": "SZ(uint256,string,string,uint8)", +"16431c5b": "CreateANM(address,uint256)", +"16443801": "Zigilua()", +"16448c99": "allocateTokens(address,address,uint256)", +"1644b20b": "Bhinnekamint(address,uint256,uint256)", +"1644ed01": "isVolumeReached()", +"16450092": "totalCap()", +"16458d74": "show_Candidate_Victorious_in_Election()", +"1645f0cb": "_mintIdentityToken(address,address)", +"16468fe2": "mintEndYear()", +"164745c5": "presaleendTime()", +"1648371d": "bboBalance()", +"1648be60": "lockSupplierAndLockPosition(address,address)", +"1648f38e": "createExchange(address)", +"16495308": "setReceiver3()", +"16496a15": "onceAddTime()", +"1649b76d": "maxDexSize()", +"1649cdcd": "testGetItemStore()", +"1649d72b": "proposeNewNotary(address)", +"164a009e": "WHITELISTING_DURATION()", +"164ba24b": "Payments()", +"164c9bf0": "Trust()", +"164ce703": "useless(uint256)", +"164ceb70": "getTradeByReferenceCode(bytes32)", +"164d3f3a": "Redeem(string,string,address)", +"164e68de": "withdrawFees(address)", +"164f81c3": "confirmAddress(address)", +"164fa4ef": "withdraw_token(uint256)", +"1650533f": "distroyIssuerToken(uint256)", +"16511a67": "removeHodler(address)", +"16512624": "setAgonValues(uint256[5])", +"16514052": "setPropertyDAppContract(address,bool)", +"1651f29a": "redeemForAllFeeWindows()", +"16521a2b": "getGameJackpot(uint256)", +"1652a9d3": "StartPeriod(uint256,uint256,uint256)", +"1652b365": "Xenith()", +"1652e7b7": "getAssetData(address)", +"1653441c": "donate(string,string)", +"16534bfc": "SKRToken()", +"16537a85": "makeschoolToken()", +"1654474b": "submitSellOrderWithPosition(bytes32,uint256,uint256,uint64,bool)", +"16552393": "creatorAddr()", +"1655a451": "PotPayout()", +"1656df0a": "_5_avto(uint256)", +"1658d496": "TamasCoin()", +"16597742": "announceWinner(uint8)", +"1659aecc": "timeoutYEnabled()", +"165a0e03": "channelsLimit()", +"165b22c1": "claimNxc()", +"165b2644": "getDepositN(address,address,uint256)", +"165b9ad0": "MOMO_FOUNDATION_WALLET()", +"165c4a16": "multiply(uint256,uint256)", +"165c86df": "rewardsWithdrawalRecipient()", +"165ca484": "USDDigital()", +"165cfea3": "TheImmortals()", +"165d35e1": "getChainlinkToken()", +"165db404": "AdvisorsAndPartnersMinted(address,address,uint256,uint256)", +"165e2eea": "setFund(address,string)", +"165f7d38": "buyIntoSyndicate()", +"165ffd10": "restart(bytes32,bytes32)", +"16603758": "setUserCategory(address,uint256)", +"16618e61": "ICOweek3End()", +"16628014": "setBitcoinRate(uint256)", +"1662da6a": "setWhitelisterAddress(address)", +"1663f4ee": "SplitEqual(uint256)", +"166428c0": "PoolSubmitted(address,uint256)", +"16643430": "setRateEarlyStage4(uint256)", +"1664b9cf": "create(uint8,uint8,uint64,uint64,uint64)", +"16654268": "getName(address,address)", +"1665e6b3": "approveOrder_(address[7],uint256[7],uint8,uint8,uint8,bytes,bytes,bytes,bool)", +"1666b514": "RipeXToken()", +"16670bcd": "resolveDispute(uint256,uint256,uint256,uint256)", +"16671990": "minCapMain()", +"166728cb": "feesend()", +"1667504e": "updateTitleTransfer(string,string,string)", +"1667590d": "GenesisRewardPerBlock(address,address)", +"1667d763": "changeRegulatorStatus(uint8)", +"16685890": "huntingPrice()", +"1668603f": "PFXTestCoin()", +"16687369": "chargeProtocolFee(address,address,uint256)", +"16691869": "addClient(address,address)", +"16694dd9": "isReportingActive()", +"166a3952": "createVoter(address)", +"166bf1b0": "createC1(uint256)", +"166c4b85": "len(bytes32)", +"166d3bbf": "payOutJob(address,bytes32)", +"166d561a": "FatPeople()", +"166d91fd": "FOUNDATION_RESERVE()", +"166dc43e": "setManagementProxy(uint32,int256,address)", +"166e55d9": "computeStablecoinFee(uint256,address)", +"166eb4cb": "Put(bytes32,uint256)", +"166ee1de": "newIdentityL1(address,bytes32,bytes32,bytes32,bytes32,uint256)", +"16706514": "MyDice75()", +"16708bc6": "metadataSize()", +"1670cb6f": "oracleA()", +"1671055d": "etherollBeneficiaryAmount()", +"16713b37": "receivedTotal()", +"1671719d": "MINIMUM_LOCK_AMOUNT()", +"16730131": "addHpbNodeWithString(address,string,string)", +"16735925": "setAllowErc20OwnerClaim(bool)", +"1673f758": "FundTransfer(address,uint256,bool,uint256)", +"1674bade": "setMinDuration(uint256)", +"16754c55": "createArea()", +"1675f455": "tokenUri(uint256)", +"1676503e": "updateParameters(address,uint256,uint256,uint256,uint256,uint256)", +"16772492": "HngCoinSale(uint256,string,string)", +"16772b6a": "SentPrizeToWinner(address,uint256,uint256,uint256,uint256,uint256)", +"1677496d": "withdrawART(uint256)", +"16783ba7": "assertEq18(bytes18,bytes18,bytes32)", +"16786ae2": "createMineral(bytes32,uint256)", +"1679657a": "isTrustedBy(uint256,address)", +"167aee44": "rewardPoolShare(uint256,bool)", +"167d219e": "ROLEX()", +"167d3e9c": "SetOwner(address)", +"167dde94": "affirmationWithinLimits(uint256)", +"167ddf6e": "getArtwork(uint256)", +"167e7921": "setTotumAllocation(address)", +"167f66c0": "startOfDay(uint256)", +"167ff46f": "openSale()", +"16801d17": "getBattle(string)", +"1680a070": "setPlotDataMultiple(uint256[],string,string,string,string)", +"1680f70d": "transferlottery(address,uint256,bytes)", +"168110f3": "Tokens_For_Sale()", +"16812d5b": "retreiveFinalResult()", +"16815137": "Poge(uint256,string,string)", +"168179e2": "ESCBCoin(address)", +"16821349": "ETH_RECEIVED_MIN()", +"16829de5": "changeEthPrice(uint256)", +"1682fa59": "GetMaximumBet_Ether()", +"16831877": "BMICOAffiliateProgramm()", +"16842582": "createLottery(string)", +"1684844b": "registerNameXaddr(string,bool)", +"1684c715": "TaskCompletedEvent(uint256)", +"168656e1": "OwnerWithdrewERC20Token(address,uint256)", +"16868752": "buyTicketWithRef(address)", +"16870257": "getTileDescription(uint8,uint8)", +"16876976": "addrTeam()", +"16878b07": "activeVerifiers()", +"16879344": "commitPeriodActive(bytes32)", +"1687f112": "left54(uint256)", +"168936a0": "Remain()", +"1689eb38": "batchSendTokens(address[],uint256[])", +"168a80d3": "deleteAllTopics()", +"168b3c69": "CertificationDeleted(string,address,uint256)", +"168b4a53": "changeColorBlack()", +"168b6231": "getCoinIds()", +"168b912d": "numOfDeclaredPublicOfferingPlans()", +"168bb279": "insertAllowedTokenInternal(address)", +"168c8120": "COMMISSION_DIV()", +"168cd7ae": "tokenQuota()", +"168d71e5": "mediaTokensSymbol(address)", +"168e41e8": "getHash(bytes32,uint256)", +"168ecec5": "revokeOperatorByPartition(bytes32,address)", +"168f3260": "calculateMinPriceForNextRound(uint256,uint256)", +"168f788e": "reRollMove(uint256,uint256,uint256)", +"168fb79d": "RANGESTART_7()", +"16907c12": "updatePlanetLiason(uint256,uint256,uint256,string)", +"1691473c": "getProducts(address)", +"16915743": "proofLink()", +"1691d6cb": "checkIfFrozen(address,address)", +"16922822": "getWarriorOwners(uint32[])", +"16925ee2": "changeTradingEnabled(bool)", +"1692823d": "getViewDatasCount()", +"16928a44": "updateProjectDescription(string,bytes32)", +"16937d56": "addressMoneyBalance()", +"1693b85d": "allowDelegate()", +"16948e9b": "changeSettings(uint256,uint256,uint256,uint256,uint256)", +"169509b6": "getOraclizedIndices()", +"1695533d": "signLease(string,string)", +"16958c79": "registerBid(int256,int256,int256)", +"1695d97c": "removeRange(uint256)", +"16962849": "changeBalanceReplenishmentStorage(address)", +"16962bc1": "setAllocationClosed(uint256)", +"16962d7f": "_createKittyToken(address,uint256,uint32)", +"16963872": "tokenPriceInitial()", +"16967407": "getAdministrator()", +"1697283a": "getRequesterLock()", +"169742f6": "ebyteBalance()", +"16985349": "standardGrowthRate()", +"1698755f": "claimToken(address,uint256)", +"1698933d": "myStrongHand()", +"1698c7ff": "removeOrc(address)", +"16992af5": "answerCompare(bytes32,bytes32)", +"16993811": "ptxHead()", +"16996713": "WXGToken()", +"169a7c3a": "eventWebsite()", +"169b15fa": "TechZU()", +"169b7012": "userToAccounts(address,uint256)", +"169b9890": "signByGroom()", +"169bd52d": "MyTestToken(uint256,string,uint8,string)", +"169bf233": "reportDoubleSpend(bytes32[],bytes32[])", +"169c13ed": "pendingTransaction(address)", +"169c4733": "feeForOrder(uint256,uint256)", +"169d16f4": "authorizerTwo()", +"169dc72c": "MBEToken(address,address,address)", +"169e18d9": "currentHitTotal()", +"169e2633": "tokenOwnerAdd(address)", +"169ea2f8": "dropCoins(address[],uint256)", +"169f66df": "monetarySupervisor()", +"169fab66": "TIXToken(address)", +"169ff375": "RANGEEND_2()", +"16a0390b": "BountyAmount()", +"16a0ea3c": "totalLockedSupply()", +"16a11ae5": "testFailPullWithoutTrust()", +"16a124e8": "setKeys(uint32,int256,bytes32,bytes32,uint32)", +"16a25cbd": "ttl(bytes32)", +"16a27019": "allowedAddr()", +"16a2a0cc": "setBountyFactory(address)", +"16a398f7": "effectiveBalance(address)", +"16a3feca": "_canOperate(address)", +"16a50228": "minLimitPublicFirstSale()", +"16a5290c": "purchaseWeapons(uint256,uint256,uint256,uint256)", +"16a54085": "setSideBetPercentage(uint256)", +"16a5410c": "Joined(address,uint256,uint256)", +"16a558d0": "_generateRandomhashNumber(uint256)", +"16a69a9a": "getDiscountStage()", +"16a7859b": "listService(uint32,string,uint256,uint256,address,address)", +"16a8e046": "setLuckThreshold(uint256)", +"16a92f39": "getDocByIndex(string,uint256)", +"16aa8508": "_leftSupply()", +"16aab1bf": "fundingEndTimestamp()", +"16aabcbd": "onlyAdvisorsCanDoThis()", +"16ab2b03": "getBid(address,uint256)", +"16ab4b17": "checkPoolsEnd()", +"16abdf7d": "setB(uint8)", +"16ad42ad": "holderList(uint256)", +"16ada547": "time()", +"16ae10f5": "USD_SOFT_CAP()", +"16ae4ec4": "FT_OPERATIONAL_FUND()", +"16ae5607": "KakToken(address,uint256)", +"16ae7944": "UpdateRateAgent(address,address)", +"16aee925": "saleDuringRestrictedPeriod()", +"16af001c": "calcBonusAt(uint256)", +"16af87a9": "getSavedReferral(address)", +"16afdf8e": "release(address,address,uint256,uint256)", +"16afe218": "setarg_1(uint256)", +"16b07323": "winsReported()", +"16b08755": "minorEditsAddr()", +"16b0c11e": "upgradePrefixPreSignedSecond(uint8,bytes)", +"16b0cc2d": "Extend(uint256,uint256)", +"16b0dc06": "getCitizenLevel(address,address)", +"16b0fc55": "removeAdmin(address,string)", +"16b14e19": "SingularityTest34()", +"16b15135": "getEscrowCount()", +"16b1f6b3": "CROWDSALE_PHASE_1_START()", +"16b208eb": "_clearApprovalAndTransfer(address,address,uint256)", +"16b21dfb": "getLockAccount(address)", +"16b2cd34": "airdroptotal()", +"16b3299d": "printListOfBooks()", +"16b33e74": "shuffleNDecks(uint256)", +"16b3d4ae": "_approved(address,uint256)", +"16b40451": "changeRandao(address)", +"16b4e79c": "setCampaignPriceById(bytes32,uint256)", +"16b57509": "killBounty(uint256)", +"16b60f2c": "mintMAYToken(address,uint256)", +"16b64898": "GEN0_TOTAL_COUNT()", +"16b65fac": "BITXOXO()", +"16b66016": "tier1Timestamp()", +"16b6824c": "CryptoWarriorCore()", +"16b6c75b": "changePeriods(uint256,uint256,uint256,uint256,uint256)", +"16b6c7bd": "withdrawUnallocatedRestrictedToken(uint256,bytes32)", +"16b78191": "decrementValue()", +"16b7d8f2": "VIP_MINIMUM()", +"16b86ed8": "amountOfMeatInUnicorn()", +"16b87739": "setCrowdsaleActive(bool)", +"16b8aa6b": "secondStageDatetime()", +"16b96f05": "addTotalDividendPoints(uint256)", +"16ba7197": "WITHDRAW()", +"16baa937": "AddMinter(address)", +"16bac350": "overthrow(string)", +"16bac7e5": "lockBet()", +"16bb1f6a": "isOriginalRoundContributor()", +"16bb6c13": "setBaseToken(address)", +"16bdb7b6": "stage3_price()", +"16bf3537": "SocialMediaIncomeCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"16bf4657": "getNumPayments()", +"16bfe25c": "emergencyRefund()", +"16c05aa2": "depositMoney()", +"16c0acde": "CryptoStars()", +"16c12746": "getAllOwners()", +"16c19739": "getPosition(address)", +"16c1df06": "WorkerPool(address,string,uint256,uint256,uint256,address)", +"16c24739": "uintInArray(uint256,int256,uint256[],uint256)", +"16c27c4a": "UNITSimplePaymentGateway(address)", +"16c3002e": "allowanceForContract(address)", +"16c38b3c": "setPaused(bool)", +"16c393a6": "oraclizeBytes()", +"16c45c7a": "areStringsEqual(bytes32,bytes32)", +"16c4fcbb": "gotransfer(uint256)", +"16c519ee": "hasRecentPrices(address[])", +"16c5792d": "transferCurator(address)", +"16c6ec92": "ChangeTarget(bytes32,address)", +"16c6f470": "addNewRaz(uint256,uint256,uint256,uint256)", +"16c72721": "forked()", +"16c72861": "nextFrontWindowAdjustmentRatio()", +"16c7f79f": "testTransferTokenAllowanceAndReturnFunds()", +"16c85710": "buyMasternode()", +"16c9b08d": "WenWanCoin()", +"16ca3b63": "increaseApproval(address,uint256,bytes)", +"16cac8c7": "Why(string)", +"16cb9100": "ETHER_MIN_CONTRIB()", +"16cb9a01": "assertFalse(bool,bytes)", +"16cba9d3": "checkEtherBalance()", +"16cbf987": "changeMemberGroup(uint256,string)", +"16cc7699": "getHistoryRecord(uint256)", +"16cc9022": "_newWallet(address)", +"16cd84c1": "AltCrowdsalePhaseOne(address,address,address,address)", +"16cdf170": "CoinTransfer(address,address,uint256)", +"16ce8a69": "setBuilding(uint256,uint256)", +"16ce8c98": "changeBiteCost(uint256)", +"16ceaa95": "getStageCount()", +"16cf1651": "setArbiters(address,address[])", +"16cf8f77": "createDroid(uint256)", +"16cff09c": "ETHER_MAX_CONTRIB_PRIVATE()", +"16cff511": "setFunctionFivePrice(uint256)", +"16d05042": "finalLoser()", +"16d061a5": "gettime()", +"16d0ba10": "putOwner(bytes32,uint256,address,bool,string)", +"16d190e3": "maxWin()", +"16d2bc5c": "getPlayerRoundInfoByID(uint256,uint256)", +"16d390bf": "addOwner(address,address)", +"16d3aa92": "removeTransferRate(address[])", +"16d41a5a": "setNFTContractInfo(string,string,string)", +"16d45615": "test_0_ensureDefaultRulesSetToFalse()", +"16d4c77c": "removeBlockeddUser(address)", +"16d4db19": "teamCompanyLock()", +"16d544f1": "resetActive()", +"16d63f17": "simFirstObligation(bytes)", +"16d64127": "_setReserveHolders()", +"16d6be4c": "buyOfferedStakes(address,address)", +"16d873cf": "TransferOddEther(address,uint256)", +"16d8b5a2": "ferromContract(uint256,string)", +"16d8f16c": "updateTentativeWinningPayoutDistributionHash(bytes32)", +"16d9356f": "oraclize_query(string,string[4])", +"16d93f3d": "getAddressAnswerKeccak256(uint256)", +"16d960b5": "createThing(bytes32[],bytes32[],uint88)", +"16d99cb0": "NewContribution(address,uint256,uint256)", +"16da1d50": "transferdissolvedFrom(address,address,uint256)", +"16da7d91": "reorganize(uint256,address)", +"16dabbf6": "getWalletSetting()", +"16db5172": "getStaker(bytes32,address)", +"16dc9704": "numberOfVestedContracts()", +"16dd68b1": "getFirstAuctionsEndDate()", +"16ddcef5": "WillCoin()", +"16de035a": "EtherBB()", +"16dfae3c": "setGenaroDevMultisig(address)", +"16e02e2a": "inventoryLocked()", +"16e10d6a": "ICOInvestorsAmount()", +"16e1286d": "BEXToken()", +"16e17852": "TAO()", +"16e1aed4": "setPartitionControllers(bytes32,address[])", +"16e242ca": "burnTotalSupply(uint256)", +"16e27349": "getFeeRecipient(int256,int256)", +"16e32d82": "_burnPlayerTokensFrom(address,uint256)", +"16e33aa2": "getData_27()", +"16e3cad0": "HAYATO_MAX_CARGO()", +"16e3cfc7": "testStoresUser()", +"16e457f0": "sellAll()", +"16e4822b": "calculateEarning(address,bytes32,uint256,uint256,uint256,uint256,address,address,bool)", +"16e4f677": "UpdateICOAddress(address)", +"16e55626": "getDogName(address)", +"16e58a1b": "detach(uint32,uint32)", +"16e7371f": "LiquidDemocracyController(address,address,address,uint256,uint256,uint256,uint256,uint256)", +"16e74f09": "getWinner(uint256[])", +"16e7c80d": "getTierStartAndEndDates(address,bytes32,uint256)", +"16e807c4": "addBid(address,uint256,uint256)", +"16e82dcf": "MMaker()", +"16e85b2e": "scapeHatch()", +"16e8f2c4": "Rectangle(address,address)", +"16e93702": "addTeam(bytes32,bytes32,address,bytes32)", +"16e9fe81": "resetValue()", +"16ea0728": "totalBuriedValue()", +"16eb6603": "right50(uint256)", +"16ebd6d5": "devResWithdrawal()", +"16ebf77d": "revealConsensus(address,bytes32)", +"16ecc686": "setup(address,address,uint256,uint256)", +"16ece9db": "GetContributionInfo(uint16,uint16)", +"16ed2ae4": "ONE_TOKENS()", +"16ed36fb": "EscapeHatch()", +"16ee94bf": "giveArraywords(string)", +"16eea70f": "RaffleResult(uint256,uint256,address)", +"16eebd1e": "launcher()", +"16ef376b": "getPhase(uint256)", +"16eff85d": "sendRefund(address,uint256,uint256,uint256)", +"16f0115b": "pool()", +"16f0e221": "configTimeMax()", +"16f25d16": "LindaCrowdsale(uint256,uint256,uint256,uint256,uint256,address,address,address,address,uint64,uint64)", +"16f33fc2": "getLockupCell(address)", +"16f36d74": "withdrawEtherHomeLocal(address)", +"16f38b63": "heroAsset()", +"16f3cb5e": "__kill()", +"16f4acf8": "changeHolder(uint256,address)", +"16f4d022": "tier()", +"16f573e6": "addtoblacklist(address)", +"16f60f5f": "SPIKE()", +"16f898fe": "LogCompanyTokensTransferred(address,uint256)", +"16f8e09b": "privateSaleEtherCap()", +"16f9ce49": "_slotCommitNew(address)", +"16fa2f7f": "getUsernameByAddress(address,address)", +"16fa99be": "totalSuplay()", +"16fc1a0b": "FaFengToken()", +"16fc1e64": "resetCreateShareToken()", +"16fc68cb": "PrivateSaleBuy(address)", +"16fcdb84": "minBuyPrice()", +"16fd381a": "settleBet(uint256)", +"16fd48a1": "ThreesigWallet()", +"16fd9869": "DepositProjectProfit()", +"16fed3e2": "receiverAddress()", +"16fef995": "sundown()", +"16ff1c76": "appreciateTokenPrice()", +"16ff5b87": "getNumProjects()", +"16ff83bf": "setLedger(uint256)", +"17011011": "BookERC20EthV1()", +"17019fb4": "givePoint(uint32,int256,address,bool)", +"1701feaa": "GobizToken()", +"1702ef0c": "getProposalOrganization(bytes32)", +"17031f9c": "advisersPeriodLength()", +"170381fe": "setIcoContractAddress(address)", +"17038cb2": "partialForwardFunds(uint256)", +"1703a018": "quorum()", +"1703b7fd": "eth4DivsOwing(address)", +"1703c11a": "setFundManagementContract(address)", +"17040713": "WithdrawRequest(address,uint256)", +"1704c271": "getShipCount()", +"170594c6": "totalTeamSupply()", +"1705a3bd": "migration()", +"17075992": "lastThreads(uint256)", +"1707e05a": "loanRequested(bytes32[8],bytes,bool,uint256)", +"170815ff": "InTokenTest10(uint256,string,uint8,string)", +"17089563": "rand(uint256,int256,int256)", +"1708a723": "setRootAddress(address,address)", +"1708d725": "unregisterFromPool(address)", +"1708f617": "gasPriceForOraclize()", +"170ab405": "setSize(uint256)", +"170ad53c": "totalUnclaimedTokens()", +"170b0782": "setSystemAddress(address,address)", +"170b99d9": "trivial()", +"170bdb36": "inPermissions(address)", +"170c28a2": "burnlvlToken(address,uint256)", +"170e1dcb": "bountyVault()", +"170e2070": "unfreezeAccounts(address[])", +"170e6d4c": "getLuckynumber()", +"170eb245": "secondTeamWithdrawal()", +"170eeb0f": "investmentRefunded(address)", +"170ff3e1": "addExtension(address)", +"171060ec": "setLocker(address)", +"17111edb": "DevvotePrefundClosed()", +"1712193f": "_requireERC721(address)", +"17124ed9": "LogCratePurchase(address,uint256,uint32)", +"1712649b": "rlc_reserve()", +"17126586": "getOwnerPercentage(address)", +"1712a72f": "ProofPresaleToken()", +"1712c489": "setDates(uint256,uint256,uint256)", +"17135b7b": "transferTokents(address,uint256)", +"17140bcf": "isSecond(bytes32,uint8)", +"1714b0c5": "testContract(uint256)", +"17154004": "checkIfRefundAvailable(bytes32)", +"17155659": "createBadge(string,string,string)", +"17158228": "signupUserWhitelist(address[],uint256)", +"1716b7f0": "longTermBudgetAllocation()", +"1716f47e": "getCurrAmount()", +"171755b1": "getQuote()", +"1717bb12": "VoxelPlaced(address,uint8,uint8,uint8,uint8)", +"171827e9": "tokenTransfertoKYC(address,address,uint256)", +"17183ca3": "maxCallFrequency()", +"17186ca3": "GetLastBetUser(address)", +"17191704": "refundToken(uint256)", +"17193854": "SetAngelCardDataContact(address)", +"1719b727": "_getTokenAmount(uint256,uint256)", +"1719d726": "stopBallot()", +"171c0077": "compare(uint8,uint256)", +"171d833c": "test_twoValidEqAddress()", +"171d9243": "TokenOfEightSilver()", +"171da314": "showPendingAdmin()", +"171dde3f": "devsTokens()", +"171dfb4f": "target_hit()", +"171ef0b2": "exchange_rate()", +"171efc3f": "refreshWaitPairBetIDsByCancelBet(uint256)", +"171fc143": "controllerLocked()", +"171fcb5a": "revealNumber(address)", +"17203e1d": "makeProfit()", +"1720684a": "whitelistBonusClosingTime()", +"1720ce1f": "addTxToRegistry(bytes32,uint256,uint256,uint256)", +"172110b4": "getCountTransactions(address)", +"1721117b": "UpgradeabilityProxy()", +"17214a8a": "GenesisInitialSupply(address)", +"17216484": "genericSender()", +"17219f03": "Ehfirst()", +"1721ebba": "mokenNameExists(string)", +"1722a8b0": "rateAngelDayEnd()", +"172325c7": "refundDuration()", +"17235779": "Tutorial()", +"1723934d": "setAvailableSupply(uint256)", +"17241962": "Zerk()", +"172419a8": "getCapByStage(uint256)", +"1724cf8a": "isCARegistered(address)", +"17255086": "blackjack(uint256,uint256)", +"1725b847": "voteAgree()", +"1725d8aa": "getOwnedShipAtIndex(address,uint256)", +"1726cbc8": "releasableAmount(address)", +"1726d2c5": "getRefPercents(uint256)", +"172727c0": "lastCheckBlockNo()", +"17274abd": "setBtcTokenBoughtAddress(address,address)", +"172775ef": "generateOrderWithPayeeByAdmin(address,address,address,uint256,string,string,string)", +"172820de": "KaliToken()", +"1728ac68": "SPTOKEN()", +"1728dd43": "GameFinished(address)", +"1728fb46": "ROLE_LOCKUP()", +"172960d4": "LogWhitelistAdd(address)", +"17299c04": "setDisputeFee(uint256)", +"172a735c": "updateDocumentPoll(bytes32)", +"172a9438": "ArsenalvsManCity()", +"172ab60c": "getPositionFromHolding(uint256)", +"172ac1ea": "isInvoice(bytes32)", +"172b319d": "GOOLA_UNIT()", +"172b95e1": "get_transaction_by_row(uint256)", +"172c453b": "setInventory(address)", +"172c61e6": "totalAdoptedAxies(uint8,bool)", +"172c9a0e": "inspire(address,uint256)", +"172cf717": "left55(uint256)", +"172d8a30": "setDirectorLock(uint256,uint256)", +"172e0456": "set_property_contact(uint256,string,string,string)", +"172e1e52": "priceView()", +"173029d7": "derivePayoutDistributionHash(uint256[])", +"173067a3": "priceStart()", +"1730e216": "setStartLockPeriod(uint256)", +"17324249": "playNumber(uint256[])", +"17324543": "nationalitiesOf(address)", +"1733043f": "getAllChildIds(bytes32)", +"1733cbb5": "ConfirmationNeeded(bytes32,address,uint256,address,bytes)", +"1733fea0": "SKYST()", +"17342859": "batchSetApprovalForAll(address[],bool)", +"17342d36": "init(address,address[],uint256[],address,string)", +"17349ad5": "TokenDecimals(uint256)", +"17356c22": "getVirusLength()", +"17367bc8": "VDN(uint256,string,uint8,string)", +"173817b6": "checkSellerOffer(address)", +"173825d9": "removeOwner(address)", +"1738c3ff": "removeVendorById(uint256)", +"17393f04": "PURCHASE_DIVIDER()", +"173975aa": "SetENGCommunityAddress(address,address)", +"173a0615": "Dealer()", +"173a21f8": "changeWethContract(address)", +"173a2b5c": "proposalAmount()", +"173a48a4": "distributeFUDD(address[],uint256,uint256)", +"173a4b70": "newProposal(address,uint256,bytes32,string)", +"173a705f": "transmitStatus()", +"173c9d27": "batchTransferForDifferentValues(address[],uint256[])", +"173cb7de": "getNumReleasesForNameHash(bytes32)", +"173d2795": "train1(uint256)", +"173d6ca2": "tier1Reached()", +"173dbd4e": "GoCryptobotCoinCore()", +"173dc741": "addBonusToUser(address,uint256,uint256,uint256)", +"173e49b7": "BoomstarterToken(address[],uint256)", +"173ea238": "changeBtcOracle(address)", +"173ea341": "isPrivilegeAddress(address)", +"173f22f0": "rmin(uint128,uint128)", +"173fc012": "preSignedCheck(bytes8,address,address,uint256,uint256,uint256,uint8,bytes)", +"173febeb": "Send69Wei()", +"17409b42": "registrarAlumno(uint256,string,string,string)", +"1740b479": "gameManagerSecondary()", +"1741526f": "getContractPayout()", +"17415d50": "_deleteRequest(address,address)", +"1741c48e": "getNextPoliceNode(address)", +"17421c8c": "withdrawAmountToken(address,uint256)", +"17431634": "LevelUp(uint256,uint32)", +"17436b1e": "RoundOpen(uint256,uint256,uint256)", +"1744215a": "EIP20()", +"1744cfe4": "GetLoansLenght(bool)", +"1744d5a5": "StageBonusUpdated(uint256,uint256)", +"17453358": "date01Oct2018()", +"1745422c": "addTx(address,uint256,string)", +"174609f8": "UNC()", +"17462891": "proofOfShit()", +"1746bd1b": "getGameInfo()", +"17473975": "breakDurationBetweenPresaleAndICO()", +"1747af0d": "AdminOwnershipTransferred(address,address)", +"1747b48b": "Reveal(uint256)", +"1747dfd4": "ContractPlay()", +"17484b0c": "RSOC()", +"17490da8": "modifyTrialDeadline(uint256)", +"1749bdf1": "getClassRank(uint32)", +"1749c16f": "isEnded(uint16)", +"1749e462": "getOwnersTokenList(address)", +"174a363a": "getpro(uint256)", +"174a6277": "getTxDataBlockNumber(address,bytes32)", +"174a84d8": "BetComplete(bool,uint256,uint256,uint256,address)", +"174b0093": "createDefaultGen0Zodiac(uint256,address,uint256,uint256,uint256)", +"174b9fa4": "getCurrentDayDepositLimit()", +"174c2002": "burnAndDist()", +"174cd9b3": "lastBlock_a19()", +"174dcea8": "getBalanceAndHolderByIndex(uint256,address)", +"174e7d55": "isReadyToAction(uint256)", +"174efd12": "minBidValue()", +"174f51eb": "winOdd()", +"174fa48e": "distributeBTCG(uint256,address[])", +"1750f564": "newProposal(bytes32,address,uint256,uint8,uint256,bytes)", +"1751dc90": "createMultiplePhoenixes(uint256[],uint256[],uint256[])", +"175207b7": "_readBlockBeneficiary(uint256,bytes)", +"17528c7f": "ReceiverAddressSet(address)", +"175323a8": "contributeETH()", +"1753a655": "singBy(address)", +"1753d61c": "AirdropToken()", +"175466ee": "proofVerifyFailed()", +"17548962": "SPTI()", +"17549ff0": "lovelock_price_LOV()", +"1754bd8e": "minerState(uint256)", +"1754de57": "sendleftmoney(address,uint256)", +"1755ff21": "poolAddress()", +"1756ffd9": "addMonsterClassBasic(uint32,uint8,uint256,uint256,uint8,uint8,uint8,uint8,uint8,uint8)", +"17570e80": "logReportingParticipantDisavowed(address,address)", +"1758078b": "trader()", +"175892b4": "previligedSubApproval(address,address,uint256)", +"17597b0f": "getLockedAmount_contributors(address)", +"175a0061": "install()", +"175a8bf4": "MigrationAgent(address)", +"175b0284": "closeChannel(uint256)", +"175b859d": "Bitwincoins(uint256,string,string)", +"175baaf1": "accrual(uint256,address)", +"175beead": "advisoryTokens()", +"175c6709": "TransferStatus(address,bool)", +"175c8640": "ZEEX()", +"175c9885": "POSSCOIN()", +"175d27e0": "MONTH_IN_SEC()", +"175ebfc7": "AdoptionOffered(bytes5,uint256,address)", +"175f6d9c": "JustAnIndex1()", +"17602ddf": "isFlowerAuction()", +"1760705f": "setAssetContract(address)", +"1761af6d": "upgrade(address,address,address,address,address)", +"1761eab4": "buyLong(address[2],uint256[5],uint8,bytes32[3])", +"17623c41": "isAllowedToParticipateNow()", +"17623e5b": "unauthorizeManager(address)", +"17634514": "creationBlock()", +"17634ec8": "freezeAccounts(address,bool)", +"176416ed": "getVotesBetween(uint256,uint256,uint256)", +"1764250a": "verifyWithdrawSignatures(uint256,address,address,uint256,bytes,bytes)", +"17645315": "migrate_participant(address)", +"1764dc3d": "GiveTokenPerm(address,address,bytes32)", +"17653b6e": "setChainRoot(address)", +"17655f6c": "transferOtherERC20Assets(address,uint256)", +"17659a1d": "Undelegate(address,uint256)", +"1766f424": "unsoldAllocationDelay()", +"17671962": "calcTotalWinnerKeys(uint256)", +"17674544": "deleteEntry(string)", +"17674e4d": "logMarketMigrated(address,address)", +"17676e4c": "valueSet(string,bytes)", +"1767da08": "addBalanceForOraclize()", +"176854f6": "setLastJadeSaveTime(address)", +"176898c9": "setRefundStatus(bool)", +"1768b436": "ETCSurvey()", +"1768fd6f": "getMaxLockAmountAllowedByLtd()", +"1769511c": "fidaTokenAddress()", +"1769af29": "removeFromOwnerlist(address)", +"1769d552": "indexextend()", +"1769f049": "fee_balance()", +"176b0eac": "gcStartTime()", +"176b63f4": "seedSourceA()", +"176b6742": "EtherFlip()", +"176b866f": "alterBankBalance(address,uint256,bool)", +"176cd40a": "PUBLIC_OFFER_SUPPLY()", +"176d0780": "createMicroWallet(uint256,uint256)", +"176e5f32": "withDrawMoney()", +"17700f01": "disableTrading()", +"17701ee6": "mission()", +"1770616c": "tier3LOT()", +"17711a46": "setTokenTimelockFactory(address)", +"1771b7dc": "bids_burned_count()", +"1771d4d4": "setAliasPrice(uint256)", +"1771ece6": "updateHouseFee(uint8)", +"17727a00": "withdrawCapital()", +"1773234b": "kscBatchBurnWhenUseInSidechain(address[],uint256[],string)", +"17733eac": "yank(address[],address[])", +"177378f0": "testRegularBuy()", +"17738cef": "placeEMONTBid(address,uint8,uint256)", +"177413da": "bet(bytes32)", +"1774218e": "CRAToken(address)", +"17743338": "MakeClaim(address)", +"17749a16": "adminRefund(address,address)", +"1774df3e": "distributeMAGGIE(address[],uint256,uint256)", +"1774e646": "setUint8(uint8)", +"1774f6c6": "confirmPurchase(uint256,address,address)", +"17753c44": "DIGTREX()", +"17759493": "TotalPoSRequests()", +"1776683e": "payDev(address)", +"1776b437": "countInvestorsRefundedInCrowdsale()", +"177766e6": "getOptionChain(uint256)", +"17776b86": "ExhibitToken()", +"1778f1df": "ICOStartDate()", +"177a9e9d": "refundFor(uint256)", +"177b3010": "registerProject(string,string)", +"177b979e": "initiatecontract()", +"177bd86e": "syncSubscriptions(address[],string[],uint256[])", +"177c75ae": "offerIndexedPieceForSale(uint256,uint256)", +"177cf218": "UNIX_DAY()", +"177cfaa2": "teamTwoShares()", +"177d8ee4": "emitSkillsSet(address,uint256,uint256,uint256)", +"177dc9e5": "getCompte_15()", +"177dcde9": "_transferTokens(address,uint256)", +"177e0f71": "setLockedWalletReleased(address,bool)", +"177e6ae4": "ETHERFLEXCrowdsale(address,address)", +"177ea52d": "buyTokensSigned(address,bytes,uint256,uint8,bytes32,bytes32)", +"178003e1": "BCTopCraftCannabis()", +"178021e3": "saleFee()", +"1780eb18": "charityFundations(uint256)", +"17813d37": "BitGCoin(uint256,string,uint8,string)", +"178228f1": "enterGame(address,uint256)", +"1782a789": "removeContact(bytes32)", +"17834d36": "isReachedHardCap(uint256)", +"178394bd": "LockedUnsoldTokens(uint256,address)", +"178407ca": "Board(address)", +"178450bd": "EbocoinToken()", +"1785478c": "_preValidatePurchase(address)", +"1785f53c": "removeAdmin(address)", +"1785f8dd": "PreTgeDisable()", +"1786351b": "AllbesticoContract()", +"1786e362": "orderTokensOf(address)", +"1787119c": "spendlarge(uint256,uint256,uint256)", +"17880b67": "getTotalBorrowingMonsters()", +"17888efc": "projectTokens()", +"1788de80": "enableTokenTransfers()", +"17897fcd": "RedRabbitToken()", +"178a8c8d": "accountsHolding(uint256)", +"178a8f34": "lotIdsByAddress(address)", +"178a9e2e": "tixGenerationContract()", +"178a9ffb": "HarborCrowdsale(uint256,uint256,address,uint256,uint256)", +"178ab6bb": "startICOStage8()", +"178af534": "createTokensWithoutReffer()", +"178afb39": "setSalesState(bool)", +"178b6de6": "getAllTokens(address)", +"178b8baf": "printCoins(uint256)", +"178b9d1a": "closeTicket()", +"178c02e9": "prometheusSoldCount()", +"178c17f0": "_createRandomNumber(bytes32,uint256)", +"178c4e40": "proof_of_public_key1()", +"178cec5c": "setBAU(bytes32,address,uint256)", +"178e6079": "APP_ADDR_NAMESPACE()", +"178ef307": "numberOfTokenHolders()", +"17904743": "bitpaintingStorage()", +"17905b2a": "Taur()", +"1790bd17": "contributorIndexes(uint256)", +"179101a6": "DECoin()", +"17916537": "clearDistributionDetail()", +"179194e1": "Bitnova()", +"1791cf01": "arr(uint256,uint256,uint256,uint256,uint256)", +"1791db21": "tokenMult()", +"1792b0bc": "transferTokens()", +"1792cc61": "tokenDecimalPlaces()", +"1793140a": "setO1(address)", +"179381d8": "setICOController(address)", +"1793b0f2": "addRecord(bytes32,string)", +"1793c314": "lastChance(address,address)", +"1794164b": "killcontract()", +"1794a463": "changeDevFees(address)", +"1794bb3c": "initialize(address,address,uint256)", +"17958e75": "omegaToken()", +"17961d0f": "ord()", +"17968fc9": "doPurchase(address,uint256)", +"1796b2ca": "unspent_supply()", +"17974399": "changeWithRef(address,address,uint256,uint256,address)", +"1797552b": "approveansCall(address,uint256,bytes)", +"1797814e": "IADOWR()", +"1797ec8a": "totalCrabTraded()", +"17986d83": "setRefferalFee(uint256)", +"17993e2f": "IREC()", +"17997878": "totalOwned()", +"179a5480": "masterresellercontract()", +"179ac197": "setOraclizeContract(address,address)", +"179b1b70": "LogFinalize(uint256)", +"179b51b1": "lotteries(int256)", +"179b73da": "killBoardProposal(uint256,address)", +"179c537e": "setSaleContractDepositAddressVerified(address)", +"179d375c": "addToken(uint256)", +"179dd216": "calculateMarketPixelPrice(uint256)", +"179dfbf3": "getBettingStatus()", +"179e91f1": "tokensLockedAtTime(address,bytes32,uint256)", +"179ee8bb": "acceptLoan(address,address)", +"179ef331": "nameRegistered(bytes32,address,uint256)", +"179fc99f": "etherBalanceOf(address)", +"179ffe76": "getMovie(uint256)", +"17a081bf": "queryTimestamp(uint40)", +"17a23ec6": "TOKEN_scaleDown(uint256,uint256)", +"17a2aaa4": "WithdrawalPremature(address,uint256)", +"17a2c026": "setCampaignEndDateById(bytes32,uint256)", +"17a3a329": "GLBX()", +"17a40e92": "updateAsset(address,bytes32,bytes8,uint256,string,string,address[2],uint256[],bytes4[])", +"17a432f5": "getActualPriceOfCardOnCraftAuction(uint256)", +"17a523c1": "useInsurance(uint256)", +"17a5d4df": "minTransactionAmount()", +"17a5f8cc": "createRatePlan(string,bytes32)", +"17a601b5": "MAX_STACK_DEPTH_REQUIREMENT()", +"17a650cc": "enter_square(uint256)", +"17a66006": "stageBaseRate()", +"17a689f3": "SuperSkyNet()", +"17a7cd10": "weeksFromCreation()", +"17a7eb4c": "vote02NoCount()", +"17a7f4cc": "feedOnKitty(uint256,uint256)", +"17a7f53e": "PriceHKGChange(uint256,uint256,uint256)", +"17a7f9b2": "countOfAddresses()", +"17a87b80": "changeInitialPrice(uint256,uint256)", +"17a950ac": "actualBalanceOf(address)", +"17a96982": "pullBounty(uint256)", +"17aa2899": "toB32(address,bytes)", +"17aaaea7": "BaseAltCrowdsale(address,address,address,address,bool,uint256,uint256,uint256,uint256,uint256)", +"17aad447": "FOUNDERS_LOCK_START_TIME()", +"17ab6cbb": "getRedCards()", +"17ac195a": "devTokensWallet()", +"17ac410f": "mintedtokens()", +"17ac896c": "GlobalBusinessSystemToken()", +"17adeb7c": "setClientProviderUID(address,uint256)", +"17adfa08": "confirmOneBuy()", +"17ae1f6c": "commission1()", +"17ae1fc5": "getIsActive(address)", +"17ae5d88": "unPreIco()", +"17af4d8a": "removeRoleAll(string)", +"17afa8a3": "set_refererPercent(uint256)", +"17afd19a": "decrementDID(address,address,uint256)", +"17b2e350": "deletePermissions(address,address[])", +"17b3a34b": "_addIdentities(uint256,bytes32[])", +"17b3c7ea": "getAllProposalVotersAndVotes(uint256)", +"17b4c4d3": "META()", +"17b54069": "setRoundOne(bool)", +"17b591e5": "closeContract(bytes32,bytes8,uint256,uint32,string,uint32,uint32,uint64,uint64,bytes32)", +"17b5f729": "_getAuctionIdArray(uint64,uint64)", +"17b65ae6": "hasEmployerMinRating(address,address,uint256)", +"17b75be6": "setBigICOStopped(bool)", +"17b7c328": "OpenPollCoin()", +"17b83aa6": "getSaleContractDepositEtherMax(address)", +"17b88dd7": "NEC(address,address)", +"17b98723": "isAuraSet(uint256,uint256)", +"17b9a28e": "calcWinner(uint256,uint256,uint256,uint256)", +"17b9e89c": "sumHardCapPreICO3()", +"17ba169a": "HybridEXToken(address,uint256)", +"17ba86af": "OpenContentIndex()", +"17bb0532": "AdminAddressChanged(address)", +"17bbcb6f": "newInvest(address,uint256)", +"17bd1251": "txsThreshold(uint256)", +"17bd5956": "withdraw_token(address,address,uint256,uint256)", +"17bd927c": "testNewCounterValueAfterADecrease()", +"17be3fa5": "lockToken(address,uint256)", +"17be85c3": "getEntries()", +"17be89f0": "createTradeContract(address,uint256,uint256,bool)", +"17bf2671": "PDOne()", +"17bf8f50": "sendTokenFromDex(address,uint256)", +"17bfdfbc": "borrowBalanceCurrent(address)", +"17c0b0f9": "Escrow(address,uint256,address)", +"17c163e9": "ROLE_STATE_LOCK_PROVIDER()", +"17c201a1": "getRemainingMineSupply()", +"17c208a0": "EtherGirls()", +"17c24891": "completeInternal()", +"17c2d98b": "minSizeInvest()", +"17c2f390": "getNumberOfSuccessfulSteps()", +"17c3119b": "TeamAndAdvisors()", +"17c32a58": "latestPhaseNumber()", +"17c35e88": "deedName(uint256)", +"17c3925f": "encodeBillingMetadata(uint256,uint256,uint256,uint256)", +"17c39286": "getCars()", +"17c4c7bb": "getShipPriceById(uint256)", +"17c4f0a0": "autoReleaseTokenSaleJM()", +"17c4fcbf": "getExpectedGameSize()", +"17c51080": "getMyLockedFundsReleaseTime()", +"17c520f9": "CerttifyToken(uint256)", +"17c5838a": "stopMinting(string)", +"17c59204": "determinateWinners(uint256,string,int256,int256[],uint256,string,string)", +"17c5fed8": "emergencyWithdrawalRatio()", +"17c63141": "getCountSenderCities(address)", +"17c65aa7": "getMaxLossAfterTrade(address,uint256,int256,int256)", +"17c6ee4f": "PaidOut(address,address)", +"17c70de4": "initiationTime()", +"17c73612": "ItlyCoin()", +"17c73ff0": "COMMISSION_WALLET()", +"17c83ed4": "getBindAddressAccount(address)", +"17ca1a6d": "getCrystalsSummary(address)", +"17ca2e41": "addBlacklist(address,bool)", +"17ca7f63": "getMintMarketMakerApproval(address,address)", +"17cacc1e": "_beingVIP(address)", +"17cb6426": "totalPaidOut(address)", +"17cbe981": "ChangeShipSellMaster(address)", +"17cc4138": "lastUETCWC()", +"17cc67b9": "firstRoundICOStart()", +"17ccf6a0": "rate5()", +"17cd4d5a": "setEtherPriceInEuroCent(uint256)", +"17cd802d": "repayment()", +"17cdb812": "TEAM_VESTING_AMOUNT()", +"17cdbac0": "usedvalue()", +"17ce42bd": "addEntry(string)", +"17ce9aae": "getIsSecondPhaseByTime()", +"17ce9d68": "getMeshPointByName(string)", +"17cfd0d6": "house_edge()", +"17cfde55": "onSubUnHold(uint256,address,bool)", +"17d01716": "unregisterPair(address,address)", +"17d077af": "NamiPool(address,address,address)", +"17d0aa13": "TXOtoken(address)", +"17d18cd6": "_capOwO()", +"17d28620": "toggleTransferFor(address)", +"17d2e4e4": "realDevRewardWeight()", +"17d35f47": "setLocked(uint256)", +"17d3953f": "tmed()", +"17d48fc7": "getMigrationAccount(address)", +"17d4e24c": "EXT_COMPANY_STAKE_THREE()", +"17d51877": "cancelLine(uint256)", +"17d55d13": "timeLeftToBid(address)", +"17d5e4be": "testDrip(address,address,uint256)", +"17d60394": "Briant2Token()", +"17d6de15": "setSnapshotBalanceBatch(address[],uint256[])", +"17d70f7c": "tokenId()", +"17d7a154": "getShipTotalEarned(uint32)", +"17d7a47d": "sendOtherTokens(uint8,address,uint256)", +"17d7de7c": "getName()", +"17d8405a": "setUserAccount(bytes32,address)", +"17d86154": "setStartPrice(uint256)", +"17d8fd7a": "acceptedBookingfc(uint256)", +"17d928a7": "ClaimNFT(uint256,uint256,uint256)", +"17d94ad3": "isMinterAllowed(address)", +"17d9adb7": "stage_3_tokens_scaled()", +"17d9b4ab": "checkPromo(string)", +"17d9bfcb": "withdrawAndTransfer(uint256,address)", +"17d9c090": "isCharged()", +"17da485f": "getMiningDifficulty()", +"17db59a4": "dEthereumlotteryNet(address,address,address)", +"17dba48c": "GRAC2Coin()", +"17dbaf9b": "unlockFirst()", +"17dbe4f1": "burnPassportToken(address,uint256)", +"17dc86c5": "minWeiContribution()", +"17dc92f5": "cash(uint256)", +"17dd0873": "Winner(address,uint256,uint256,int256,string)", +"17dd4cc1": "getPreviousPrice(bytes32)", +"17de15ad": "GreHackCoin()", +"17de2f1f": "defaultOwner()", +"17dec7af": "distributionFixed()", +"17df1773": "StopIco()", +"17df5696": "finishPreSale4()", +"17df74f9": "availablePercent(uint256)", +"17df9a73": "findBid(address,uint256,bytes32)", +"17e01c95": "isClientBlocked(address)", +"17e04e55": "PoSatoshi()", +"17e0aeb8": "setPropertyEarnUntil(uint16,uint256)", +"17e0dfb2": "backAtIndex(uint256,uint256)", +"17e139a7": "lockedTokenHolder()", +"17e1b09b": "minimumDeposit(uint256)", +"17e1bfb7": "addInstitution(address,string)", +"17e22621": "joinGameWithInviterID(uint256)", +"17e2912f": "Amount_of_AOC_for_One_ETH()", +"17e30f6b": "TimeChainToken(uint256,string,string,address)", +"17e398a5": "seizedTokensWallet()", +"17e3f5fa": "callModifiedContractBalance()", +"17e49dc9": "ETH033()", +"17e50791": "FundsReceived(address,uint256,uint256,uint256,uint256)", +"17e51f21": "CrowdsaleController(address,uint256)", +"17e5259e": "ETH_MAX_LIMIT()", +"17e63b79": "centsPerMonth()", +"17e63bff": "setupICOPeriod(uint256,uint256)", +"17e6a087": "markFunding(address,uint256)", +"17e72721": "VLToken()", +"17e760bb": "votingAllowed()", +"17e7dd22": "getBooleanValue(bytes32)", +"17e875e3": "Transparancy()", +"17e95fbc": "releaseAdvisorsAccount()", +"17e9884d": "OG()", +"17ea0a46": "getalldeatil(uint256,uint256)", +"17ea4a79": "Took(address,uint256,uint256,uint256)", +"17eb85e3": "contractBoost(uint256)", +"17eba34d": "MIN_PRICE_IN_CENTS()", +"17ed31f4": "TIACOIN()", +"17edfb06": "trade(uint256,uint256,string)", +"17ee9c1d": "agreeProposal(address)", +"17eef4cd": "setTotalTokensForPublicSale(uint256)", +"17ef67c6": "setContract1(address)", +"17efa370": "SmartTokenController()", +"17f143e1": "supplyExponent()", +"17f19efb": "ZoarToken()", +"17f1d65b": "hasIcoPhaseOneEnded(uint256)", +"17f1ee05": "paySecurityPool()", +"17f3679f": "testGetMixItemStore()", +"17f46c15": "getVoucher()", +"17f5de95": "MAX_TOKENS_SOLD()", +"17f5f53a": "XYTTEST()", +"17f6252f": "PRESALE_PERCENTAGE_4()", +"17f6c712": "ObjectPurchase(address,address,uint256,uint256)", +"17f708fb": "removeWhitelist()", +"17f7a530": "_computeNextMinerPrice()", +"17f80c13": "releaseJoyToken()", +"17f8252e": "tokenOwnerNumber()", +"17f95eac": "approveCloser(address,bool)", +"17f992ab": "SECOND_VOLUME_EXTRA_BONUS()", +"17fa664f": "callerDel(address)", +"17faa66f": "transferOwnershipWithBalance(address)", +"17fab0a0": "info(string)", +"17face84": "withdrawCommission(uint256)", +"17fad7fc": "batchTransferFrom(address,address,uint256[],uint256[])", +"17fafa3b": "test_sub(uint256,uint256)", +"17fb44c1": "returnAmountPaidBackSoFar(uint256)", +"17fb4d66": "Destroy(address,uint256,address)", +"17fb6c6e": "approveRequest(uint256,bool,string)", +"17fc01bf": "LegendsCrowdfund(address,uint256,uint256)", +"17fc3f55": "angelGoal()", +"17fc91f8": "holdAmount()", +"17fccb47": "erc20TokensContractAddress()", +"17fd9cc5": "tradeWithInputFixed(address,address,address,uint256)", +"17fe375f": "getComments(address)", +"17fe5b79": "apolloSpecialTransfer(address,uint256)", +"17fe6185": "log(address,address,uint256)", +"17fe72bb": "setEnabled(address,bool)", +"17ff0caa": "WeatherBet(uint256,address,address,address)", +"17ffa830": "tixFounders()", +"17ffc320": "reclaimToken(address)", +"17ffd225": "KittyTrained(uint256,uint256,uint256,uint256[5])", +"17ffe171": "lock(address,address)", +"18004bba": "transferArrayBalanceForPreSale(address[],uint256[])", +"18005d93": "JinuToken()", +"1800c0fe": "extraTime()", +"1800e68e": "calculateTokens()", +"1800ed8e": "manager_address()", +"18015191": "transactions()", +"1801db43": "ExaCHF()", +"1801f00f": "newProposal(uint256,uint256)", +"1801f38e": "restart(uint256)", +"1801fbe5": "mint(uint256,bytes32)", +"1801ff10": "getAllContact(bytes32)", +"18024acc": "voteStartTime()", +"1802f969": "PokeCentral(address,address)", +"18037b78": "issuerJurisdiction()", +"18039230": "getPlayerGoodList(address)", +"180489ed": "Withdrawal(address,uint256,bytes)", +"18051c4a": "targetWei()", +"18054275": "executeSpins(bytes32,bytes)", +"180603eb": "registrationFee_()", +"1806874a": "amountLockedInVestings()", +"1806be68": "CompanyReserve(address,address)", +"1806cb4e": "getGiftSoldFromType(uint256)", +"180773de": "MAXIMUM_CONTRIBUTION_WHITELIST_PERIOD_USD()", +"1808c6b6": "setDividendsDistributor(address)", +"1808eeb8": "pending(bytes32)", +"180941f0": "setPredictions(int16,string)", +"1809549f": "updateAllComponents()", +"1809ced7": "sendEther(string)", +"180a3277": "sendDiary(address,bytes)", +"180a351b": "getByteFromByte8(bytes8,uint8)", +"180a42a3": "LifeSet_006()", +"180aadb7": "underLimit(uint256)", +"180afbf6": "DaxtherCrowdsale()", +"180b0d7e": "feeDenominator()", +"180b2607": "lastRelease()", +"180c0da6": "GlobalAssentToken()", +"180c0dfe": "maxBuyTokenAmount()", +"180c9309": "hasOracle(address)", +"180ca180": "CooperativeToken()", +"180cb47f": "GOV()", +"180da450": "addTierRateAndTokens(uint256,uint256,uint256)", +"180db1b4": "getErrno()", +"180dc318": "owners(uint32)", +"180ee30d": "forgivedChars(uint256)", +"180eebba": "accumulatedGasFees()", +"180f4c2c": "submitTotalBuyOrder(bytes32,uint256,uint256)", +"180f8f4f": "nextPrice2Of(uint256)", +"18117abb": "changeOwnerWallet(address)", +"18126325": "getOrganBlog()", +"18128ec7": "buyMorty()", +"1812982c": "fechAllForCandidate(uint256)", +"1812d2aa": "setBonusToken(address,uint256,uint256)", +"1812d996": "signature(bytes32,uint256)", +"1813b684": "preIcoEnded()", +"18158e6b": "BdpController(bytes8)", +"18159bf3": "_addSGCUsers(address)", +"1815ce7d": "setBackendAddress(address)", +"18160ddd": "totalSupply()", +"181670e6": "isApprovedOnceFor(address,address)", +"18167416": "officialGameUrl()", +"1816e794": "getMainsale()", +"18178358": "poke()", +"1817c5a7": "revokeGrant(address)", +"181a916b": "getKeys(address,uint256,uint256)", +"181aa1fd": "takeFee()", +"181b3bb3": "functionOne()", +"181b591a": "phase_4_bonus()", +"181be00d": "getValue(uint8)", +"181c8ef9": "enter(bytes8,address)", +"181d85eb": "internalRedeem(address,uint256)", +"181da773": "EosPizzaSliceDonationraiser(address)", +"181dcbcd": "setMaxConfig(uint256,uint256)", +"181e0124": "getRemainingTime(uint256)", +"181f1437": "permissibleWithdrawal(uint256)", +"181f1965": "fillSellOrderPartially(uint256,uint256,uint256)", +"181f4456": "setAuctionStart(uint256)", +"181f4477": "getLockedStructStartTime(address,address,uint256)", +"181fd85b": "cancelSale(address,bytes32)", +"181ffc5f": "GetGift(bytes)", +"182092a8": "ChangeSymbol(string)", +"1820b575": "Team(uint256,address,uint256)", +"1821cd93": "jackPotFunds()", +"1821e7c6": "acceptOffer(address,address,uint256)", +"1822b886": "createTradeOffer(bytes32,bytes32)", +"1822cbc5": "mintingIsAllowed()", +"1822f8db": "finishSafe(address)", +"18237476": "getAccountTotal(address)", +"18237e0c": "enableBuyback(uint256)", +"182439de": "claim_PreICOTokens(address)", +"1824461d": "administror()", +"18248f2a": "sendToken(address,uint256,address)", +"182493f2": "plantedOf(address)", +"182499fe": "ico_address()", +"1824a46b": "onUpgrade()", +"18253234": "ticketsAvailable()", +"182575f1": "authorizeFloor(uint32,address)", +"1825d0e8": "_mintCUSD(address,uint256)", +"18264f33": "startMigration()", +"1826fb35": "_calculateShards(int256,uint256)", +"1827caf4": "getInfoB(uint256)", +"1827edbc": "Reaper11()", +"18285e6b": "secondPlay(bytes32,uint8,bytes32,bytes32,uint256)", +"18287ef2": "executeOption(address,uint256)", +"18289482": "currentIcoPeriodStartDate()", +"1828983a": "authorizedUsers(address)", +"1828b254": "nextTicketPrice()", +"1828db82": "ownerPayout(address)", +"182930ce": "AddedToWhiteList(address,uint256,uint8,uint8)", +"1829b73f": "buyoutAmount()", +"182a7506": "setMinimumFee(uint256)", +"182ae5f2": "getVotesForItem(uint256)", +"182af96b": "regularEndGame(address,uint32,int256,uint256,address)", +"182b0b00": "checkChangeToReceive()", +"182b144c": "incrementBatch(address[])", +"182b434b": "newRequest(address,uint256,bytes32)", +"182d326e": "getTeamAddress()", +"182d709a": "scaleWeights(uint256)", +"182db370": "getWhatHappened()", +"182df0f5": "exchangeRateStored()", +"182e0c49": "totalUnrestrictedAssignments()", +"182e7533": "getBetResult(bytes32,bytes32,bytes32,uint256)", +"182e8a67": "changeGroupActiveStatus(bytes32,bool)", +"182e9a1e": "getOwnerVehicleDetails(address)", +"182ee07f": "setDistributionMinimum(uint256)", +"182ef78e": "getTMul()", +"182f67a3": "reservedWei()", +"18300c1a": "CappedMintableToken(uint256)", +"1830d69d": "IsGot(uint256[],uint256[])", +"1830f493": "getPermission(bytes4)", +"1832425f": "registerAddress()", +"1833198f": "makeMemChange2(uint256,uint256,uint256,int256)", +"1833a548": "changeGas(uint256)", +"1833b7c6": "changeMyAddress(address)", +"1833fa4c": "update(uint256,string,uint256,uint256,uint256,uint256)", +"18342c9c": "BettingCore()", +"1834906c": "thisContractAddress()", +"1834ef4e": "addMoneyToContract()", +"1835e57d": "VESTING_DURATION_4Y()", +"183651d9": "tokenApprovalWithSignature(bool,address,address,address,uint256,uint256,uint256,bytes32,bytes)", +"18369a2a": "initialBalance()", +"183718d1": "getCheckoutTime()", +"18384df2": "getMetadataOf(uint256)", +"1838daab": "getRealmSale(uint256)", +"1839a417": "_cancelEthOffer(address)", +"1839babf": "zGetGameBalance()", +"183a7947": "pregnantKitties()", +"183abe66": "testRewardSB(string)", +"183b3159": "getAssetBalance()", +"183bfb4f": "AddBankerProfit(uint8,uint256)", +"183c5901": "DigitalGold()", +"183d255e": "SetWhat(uint256)", +"183d4cf7": "CNT_address()", +"183df5ef": "test_invalidSuicide()", +"183f9bcf": "isQuorum(address[3])", +"183ff085": "checkIn()", +"184018c6": "awardHighScore()", +"1840f0ca": "countVotes(uint256)", +"184188f2": "setStopTransfer(address,bool)", +"18423074": "ShowerToken()", +"18433bb7": "DrawPrepare()", +"1844fef1": "roundTotalWinnings(address)", +"18456048": "auctusTokenAddress()", +"18469491": "lastPlayerPaid()", +"18469dfe": "canStartDispute(bytes32)", +"1846d125": "isGroupExists(bytes32)", +"18476db4": "newRandomValue(uint256,address,uint256,uint256)", +"18477799": "Touch()", +"1847c06b": "ids(address)", +"18489f50": "thingExist(bytes32[])", +"18494108": "doPayout()", +"1849bd6a": "ExecuteTrade(address,address,address,uint256,uint256)", +"1849cb5a": "get(uint80)", +"184a9ce1": "Log2_fnc(address,bytes32,uint256,string,string,string,uint256,bytes1,uint256,uint256)", +"184ad5ff": "VjuCoin()", +"184b1912": "minimum_goal()", +"184b9559": "init(address,address,address)", +"184bd394": "changeSaleAddress(address)", +"184c703d": "LogVoteInitiate(uint256,uint256,uint256,uint256,uint256,uint256)", +"184d009b": "teamNameIndex(string)", +"184d1a77": "acceptBid(int256,int256,int256,int256)", +"184d69ab": "isWhitelistEnabled()", +"184db3bf": "initErc20Deal(bytes32,uint256,address,bytes20,bytes20,address)", +"184e8549": "getPI_edit_31()", +"184fb2bd": "signOwnerCount(uint256)", +"184fd65e": "addMomRelation(address)", +"184ffd9d": "RATE_CROWDSALE_S2()", +"18501714": "clearJackpotParticipantsAfterDistribution()", +"185061da": "undoIt()", +"18507210": "templatesOfOwner(address)", +"185190f6": "addCustomerwithETH(address,uint256,uint256)", +"1851e59e": "Omnidollar()", +"18520be5": "EventBid(uint32)", +"18520de3": "sendFrom(address,address,address,uint256,uint256)", +"1852e8d9": "calculateReward(address,uint256)", +"1853d033": "GetAskingTokenBought()", +"1854229a": "REFERRAL_BONUS_LEVEL1()", +"1855e405": "managerOff(address)", +"1856a6df": "coupleImageIPFShash()", +"1856bc0f": "BuyGenesis(address)", +"1856c1dc": "main_sale()", +"1856e01b": "setVotingController(address)", +"18573bf9": "calculeReward(uint256,uint256)", +"18577f8d": "calVote(address)", +"18579ece": "clearances(address)", +"18584a5d": "hasAlreadyPlayed(address)", +"185870f9": "developerWallet()", +"1858cb5b": "verifyProof(bytes,bytes32)", +"185917c5": "distributeToFound(address,uint256)", +"1859b2d7": "getDStructData(address,uint256)", +"1859c8e2": "getUserTicket(uint256)", +"185a5671": "setTransferAddress(address)", +"185a6284": "discountedMiningTarget(address)", +"185a7daf": "FundingRules(uint256)", +"185b9067": "QuadCoin()", +"185c4279": "hardCapCHF()", +"185cc751": "loan(address,uint256)", +"185d1af6": "setUncirculatedSupplyCount(uint256)", +"185d9e79": "AOL(uint256,string,uint8,string)", +"185e00fd": "getDisputeStateText(uint256)", +"185e4a00": "getCurrCanRefund()", +"185e9969": "getContractDetails(bytes32)", +"185f23c4": "_arbitrationPercent()", +"1861355b": "transferMintOwnership(address)", +"1861cb28": "getNowVestingType()", +"1861e523": "testOwnerToken()", +"1862c10b": "withdrawBalancesToLogic()", +"1862caec": "firstStageMinting()", +"186415c0": "releasesollidaTeamTokens()", +"18643d37": "raffleLimit()", +"1864db71": "getCompetitionInfo(uint256)", +"18656a1e": "founderAmount()", +"18659adb": "starbitWallet()", +"1865c57d": "getState()", +"186601ca": "activated()", +"1866191a": "editDiscount(uint256,uint256,uint256)", +"186690b0": "broadcastMessage(string)", +"1866ae7d": "PayRollHistory(address)", +"1866f761": "ConstantaToken()", +"18671d23": "Auditor(address,address,address)", +"1867b937": "_bytesToBytes32(bytes)", +"1868291f": "getIp(string)", +"1868516d": "KMEToken()", +"1868c2a1": "computeSeed(uint64,address)", +"18695c4d": "DSToken(bytes32,uint256)", +"1869a084": "releaseLockedBalance(address,uint256)", +"186b6f05": "updateFallbackDeposit()", +"186b79c9": "isProviderInitiated(address)", +"186ba9de": "lastUnlockMineBalanceTime()", +"186bbb05": "getAppCode(bytes32)", +"186bcaf0": "ontology()", +"186c9b11": "issueTokens(uint256,address,uint256,uint8[],bytes32[],bytes32[])", +"186cd7d2": "card_black_first()", +"186d9ce8": "allowAvatarCreation()", +"186d9d88": "unblockAddress(address)", +"186db237": "ecosystemBuildingTokens()", +"186e378a": "CCH_EDIT_4()", +"186e4297": "charityCut()", +"186e7047": "forceAdvance()", +"186eb86b": "cnt_per_eos()", +"186f0354": "safe()", +"1870082d": "inviteCollateralizer()", +"187047b5": "LogUserAdded(address)", +"1870a73a": "totalNTD()", +"1870ad14": "setAddress(string,address,bool)", +"1870c10f": "donateAndCreateGiver(address,uint64,address,uint256)", +"18714bc8": "purchaseWithFiat(uint256)", +"18718656": "XENCToken()", +"1873355e": "Emoji()", +"18737e07": "Redeemed(uint256,address,address,uint256)", +"18758480": "worldContract()", +"1875aa22": "transferWhiteList()", +"1875ccf3": "setGlobalCompositionFee(uint256)", +"18760eb3": "RequiringAuthorization()", +"18764471": "ANTDToken()", +"1876d0a9": "astutelandToken()", +"1877fc8a": "quickSort(address[21],int256,int256)", +"1878265a": "Rent()", +"1878d1f1": "ETH_TOKEN_ADDRESS()", +"187958ac": "VOCToken()", +"18797499": "ENTERED_MASK()", +"18797c35": "emitAccountFrozen(address,uint256)", +"1879c2da": "NewSale(address,uint256)", +"1879dcf3": "MIN_TOKEN_PRICE()", +"187a62d5": "voteEmergencyWithdrawal(bool)", +"187ac4cb": "migrationManager()", +"187adf2e": "failsafe_subtract(uint256,uint256)", +"187b1f2a": "VOZToken()", +"187cba25": "issueNomins(uint256)", +"187cbdd2": "subWallets()", +"187d2371": "LOG_MaxInvestorsChanged(uint256)", +"187d3954": "getClaimableBalanceFor(address)", +"187d8803": "updateKoCommissionAccount(address)", +"187ecd37": "Open(bytes)", +"187ed86e": "ROE()", +"187f707b": "AdvertisementFinance(address)", +"187fac20": "setStartStage1(uint256)", +"187fd079": "MINI_GAME_TIME_DEFAULT()", +"18804b0d": "setDescriptionHash(bytes32)", +"1880692f": "getPublicKeyCount()", +"1881656b": "canSpend(address,uint256)", +"1881b0f0": "kycVerify(address)", +"1881f980": "read_i64()", +"18821400": "TOKEN_NAME()", +"1882d267": "liquidityFundAddress()", +"18836994": "get_allowance(address,address)", +"1883d2a4": "IUPToken()", +"1884c517": "registerWorkerAffectation(address,address)", +"18856694": "deny(bytes8)", +"1887af2b": "LogicBase(address,address)", +"18886657": "purchaseLimit()", +"1889500c": "marketplaceManager()", +"18896972": "isBuyFull()", +"18898452": "saleMinimum()", +"18899745": "AffiliateMarketing(address,uint256)", +"1889fc0a": "_preValidateReserve(address,uint256,address)", +"188a1d68": "getOuverture_des_droits()", +"188af657": "generateWinner()", +"188b5372": "generateToken(address,uint256)", +"188b81b4": "getGameEnd(uint256)", +"188c668c": "recordDealRefundReason(uint256,address,uint32,uint32,uint256,string)", +"188cad26": "referralTokensAllocated()", +"188d0aae": "buyAndCreateGame(uint256,uint256,address)", +"188dbc1a": "setAccountIsFrozen(address,bool)", +"188ec356": "getTimestamp()", +"188f1fee": "notifyObservers(address,address,int256)", +"188fdbdc": "commission_rate()", +"189048fc": "getAccountLevel(address)", +"189052ac": "_setFreezingPeriod(address,bool,uint256)", +"18911bbe": "ProdFToken()", +"1891381d": "setROI(uint256)", +"1891c701": "AssignOwnerToProject(int256,address)", +"18921de4": "addSignature(string,uint256[],uint256[],uint256[],bool[],uint256[])", +"1892c15a": "fwdPayment(address)", +"18940084": "_getDestinationTranche(bytes)", +"18942a33": "new_record(address,address,uint256)", +"18946e8f": "voteOnParameter(bytes32,int256)", +"18954b3e": "collectEstimation(int256)", +"18955b1e": "willThrow()", +"1895687d": "issueLoan(address,uint256)", +"18958959": "individualClaim()", +"1895e858": "resetWallet()", +"1896367e": "setBlockSze(uint256)", +"18968a03": "finalize(uint256,address,address)", +"1896f70a": "setResolver(bytes32,address)", +"18976fa2": "closeVault()", +"1897bcf3": "sellToken(uint256,uint256)", +"1898a1c7": "addVendor(address,string)", +"189959de": "EXPC()", +"1899f1ad": "setChargerAddress(uint256,address)", +"189a5a17": "nodes(address)", +"189ae13c": "numArbiters()", +"189af42f": "powsm(uint256,uint256)", +"189aff3a": "authorizedSupply()", +"189b11fc": "AddSeed(address[])", +"189b600c": "setNameHashByWriter(bytes32,address,bytes32)", +"189c94ae": "testFallbackStaticSig()", +"189ca316": "setVoteWeight(uint256)", +"189d165e": "setBurnRate(uint256)", +"189e688a": "ClaimDividend(address,address,uint256,uint256,uint256)", +"189eeebe": "isMembershipAllowed(address)", +"189f0197": "getPlayersPick(string)", +"189f4d34": "setMinUCCoinSellingValue(uint256)", +"189f9041": "mintCoreToken(address[])", +"18a08d2d": "TheTokenH()", +"18a0e773": "UnlockGrant(address,uint256)", +"18a17df1": "DataDump()", +"18a24b5b": "unlockToken()", +"18a30d16": "getResponse()", +"18a39c54": "payForward()", +"18a3aad2": "ReserveCoin()", +"18a4155e": "calculatePrice(uint256,uint256,uint256,address,uint256)", +"18a45c41": "_receiveFundsUpTo(uint256)", +"18a51621": "getReadableSupply()", +"18a54ecd": "mintTokenForPrivateInvestors(address,uint256)", +"18a6217d": "comments1()", +"18a66563": "AQI()", +"18a689aa": "getNamePicture(bytes32)", +"18a6bc32": "tokenDistributor()", +"18a6d58b": "addTokenTeller(address,uint256)", +"18a6d765": "BANKROLL_LOCK_PERIOD()", +"18a6dec5": "getCountTokensByGame(uint32)", +"18a727c5": "_withdrawDev(address,uint256)", +"18a7bad6": "setFreezeAdmin(address)", +"18a8fac9": "icoInvestment(address,uint256,uint256)", +"18a94030": "putStoWithBtc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"18a991f7": "setEmeraldPrice(uint256)", +"18a9cc1b": "isUser(uint256)", +"18a9f29f": "setMetadata(uint128,string)", +"18aaaa51": "registerTickets(uint256)", +"18ab8888": "paymentSortId()", +"18ab8c37": "timeToCalm()", +"18abb75c": "createLibraryBounty(string,string,address,uint256)", +"18abfdfc": "totalSupplyFromCrowdsale()", +"18ad052b": "safeTransferByContract(uint256,address)", +"18ad28af": "icoWasSuccessful()", +"18ae15e4": "DBC(uint256,string,uint8,string)", +"18ae19c2": "get(bytes32,uint256)", +"18ae21e8": "NuoYiLian(uint256,string,uint8,string)", +"18af26fe": "setRestrictedWallet(address)", +"18af4099": "PARALLELNETWORK()", +"18af5e74": "addressesDeposited(address)", +"18af7021": "force_refund(address)", +"18b03ceb": "remainderPurchaser()", +"18b0bdf7": "getMensaje(uint256)", +"18b0efb6": "isEmptyName(string)", +"18b123d5": "hasBeenApproved(address,uint256)", +"18b15e2a": "Ongo()", +"18b20071": "setCurrentPrice(uint256)", +"18b2739d": "giveEthJackpotAddress()", +"18b31f94": "registerLengthFunction(string,string,address)", +"18b322a4": "update_instant()", +"18b38777": "fuzexAccount()", +"18b3a119": "getCrowdsaleMaxRaise()", +"18b3b58b": "Hamza__Coin()", +"18b3c724": "forceRecoverCollateralOnBehalfOfRecurse(address,address,bytes32,address)", +"18b3cd45": "qwecoin()", +"18b40adf": "maximumCirculation()", +"18b437aa": "COMMERCIALPOINTCHAINSYSTEM()", +"18b49ba4": "AMPIToken()", +"18b4a702": "EPACOIN()", +"18b4a924": "week_max()", +"18b64d5b": "unmint(int256,uint256)", +"18b749c4": "payEther(uint256)", +"18b7bb11": "EthRoi()", +"18b7fed8": "deliverPresaleTokens(address[],uint256[])", +"18b8275a": "addUser(string)", +"18b919e9": "ROLE_WHITELISTED()", +"18ba4218": "countAssetEvents(bytes32)", +"18ba5cdc": "ownerAddToWhitelist(address,uint256)", +"18ba6973": "setTrainingFormulaContract(address)", +"18bb2edb": "maxRegistrants()", +"18bb7c08": "_setNameToAddress(address,string)", +"18bbedf4": "Bulletin()", +"18bc1558": "Th_stage2(uint256)", +"18bcd3d0": "transferOwnership(address[])", +"18bd21f9": "_purchase(uint256,uint256)", +"18bd387a": "level_referrals_count_by_address(address,uint256)", +"18bd5108": "stopCrowdsaleTime()", +"18bd710b": "NewGirl(address,uint256,uint256,uint256,uint256)", +"18bd8dcb": "ufoodoToken()", +"18bdb1b0": "StartdateICO()", +"18bdc79a": "payOwnerOnly()", +"18bdffbb": "verifierAddress()", +"18bee97e": "Creator()", +"18beeeb4": "redeemInternal(uint256)", +"18bf0225": "etherFundsOf(address,address)", +"18bffce9": "voteToResult(uint256)", +"18c0e04f": "purchaseStake()", +"18c10ad0": "disabled(uint256,uint256)", +"18c1d9b2": "bonusWallet()", +"18c1fc68": "buyOne(address,address,uint256,bytes)", +"18c20f44": "entrarAJuego(uint256)", +"18c26389": "multivestMint(address,address,uint256,uint8,bytes32,bytes32)", +"18c2d4c9": "initialSingleWithdrawMin(uint256)", +"18c306bd": "checkSignatures2(bytes32,bytes,bytes,bytes)", +"18c3cf34": "EthPriceProvider()", +"18c41a80": "mint(bool)", +"18c48e96": "bitRegisters(address)", +"18c53aca": "tokenIsComponent(address)", +"18c5bddc": "PRESALE_THIRD_DAY_START()", +"18c5e3af": "addInvestmentProposal(uint32,bytes24,uint256)", +"18c5e502": "GetTime()", +"18c8bda5": "Procare()", +"18c93884": "_setCrowdsaleStage(uint8)", +"18c9ef97": "mintETHRewards(address,uint256)", +"18caa857": "emitJobBinded(uint256,uint256,bool)", +"18cadf30": "getVATTransactionData(uint256)", +"18cc4c65": "startEngines()", +"18cd55f3": "canCreateGrants(address)", +"18cda1e7": "lockInternalAccount(address,bool)", +"18ce1a23": "BailOutToken()", +"18cee8a4": "setPlatformCommissionRate(uint256)", +"18cf1c25": "lookupDonation(uint256,uint256)", +"18cf85d1": "adminSetCityData(address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"18cfa483": "invalidate(address,uint256)", +"18d0073e": "startNextMilestone()", +"18d0122a": "upgradeAgentStatus()", +"18d0376c": "getFastGap()", +"18d0a7cc": "incentFundAddress()", +"18d0c322": "EtherLambosCore()", +"18d0eb93": "finalizeAndDistributeToken()", +"18d30bfa": "setLastMoveTime(uint16)", +"18d32128": "CLVRCrowdsale()", +"18d43f0d": "userTokensValues(address,address)", +"18d4b4b3": "COCCToken()", +"18d4d326": "SAFethToken()", +"18d4e834": "getPrivilegeState()", +"18d62bc6": "PHXFlip()", +"18d6676c": "entityStructs(uint256)", +"18d69faa": "StopDistrib()", +"18d74c37": "deleteShare(address)", +"18d760be": "LogFinalize(bytes32,bytes32)", +"18d76b78": "CCIToken()", +"18d78358": "ICOCENTRAL()", +"18d80168": "startUnitRaffle(uint256,uint256)", +"18d80d4a": "check_prize()", +"18d84553": "calculatePayout(bytes32)", +"18d8ec5b": "validateWinnersCount(uint32,uint32,uint32)", +"18d8f9c9": "erc677token()", +"18d92a5d": "getRegistryDataCustodian()", +"18d95092": "domainOwner(string)", +"18d97731": "setPriceStep7(uint256)", +"18da0011": "treasuryContract()", +"18da650d": "WithdrawalInterCrypto(uint256)", +"18da754a": "setBuyMinLimit(uint256)", +"18dad1cd": "multiTransferFromValues(address[],address[],uint256[])", +"18db02e1": "etherToLEONRate()", +"18db0750": "contributionReward()", +"18db62fb": "checkValue(uint256)", +"18dcdfbe": "isRetirementAllowed(uint256,bool)", +"18dd97f0": "secondStageTokensForSale()", +"18de0afd": "getEnabled()", +"18deb066": "init(uint8,uint256,uint256,uint256,address[2],address[],uint256)", +"18debd27": "addWalletAddressAndTokens(uint256,address,uint256)", +"18def2a1": "DistributedCreditChain()", +"18df0038": "getSwapType(bytes32)", +"18df02dc": "Migrate(address,address,uint256)", +"18df11ee": "SpendingApproved(address,address,uint256)", +"18df6090": "mintBountytokens(address)", +"18dfcf7b": "_investorCount()", +"18e01199": "burn(uint256,bytes,bytes)", +"18e02bd9": "setTokenOwner(address)", +"18e0d683": "getBAI(bytes32,address)", +"18e124e4": "upgradePackageCountOf(address)", +"18e146f9": "InvestmentPolicyChanged(bool)", +"18e2d679": "describeTile(int32,int32)", +"18e2e4be": "getInvestor(address,address)", +"18e37cdd": "ITGToken()", +"18e3b44c": "setMemory(uint256,uint256)", +"18e3d998": "crowdSaleEndTime()", +"18e45427": "whitelistedContract()", +"18e4ac35": "isConfirmed(address)", +"18e4c3f3": "GMOON()", +"18e4d2db": "_AIExchangeSupply()", +"18e536bc": "comissionList()", +"18e6ab9c": "funding(address,uint256,uint256)", +"18e75a1c": "PresaleEDUSupply()", +"18e7eb4b": "PRE_SALE_1WEEK_BONUS()", +"18e857ab": "queried(uint256)", +"18e9e7ab": "listSimpleService(uint32,string,uint256,address[],address)", +"18eacb96": "GetDivs(address)", +"18ebcc8c": "takeOrder(uint256,uint256[5],uint256[3],bytes32[3])", +"18ecc6f4": "getTotalDividendsRounds()", +"18ece632": "superApprove(address,address,uint256)", +"18edf434": "_revokeConfirmation(uint256,address)", +"18ee00b6": "_changeRate(uint256)", +"18ee1b9f": "WithdrawEther()", +"18ee9d5e": "EtherIncognito()", +"18eeef80": "Wallet1()", +"18ef7adb": "transferAdvisorTokens(address,uint256)", +"18f0db29": "remainingBettingFor(uint256)", +"18f11de2": "BSSCoin()", +"18f2217a": "EPXtokenSupply()", +"18f2a0bb": "ownersConfirmedTransactions(address)", +"18f303a1": "SetInternalValues(uint8,uint256)", +"18f3a50d": "cooAddress2()", +"18f3fae1": "setOversight(address)", +"18f61c0d": "configRunTime()", +"18f729da": "founderLockance(address)", +"18f76a2c": "getCCH_edit_3()", +"18f7d5ad": "lastBlock_f13Hash_uint256()", +"18f80bb9": "createContract(string)", +"18f839bd": "Expensive()", +"18f873df": "chAllowTransfer(bool)", +"18f889c2": "setOracleGasPrice(uint256)", +"18f9266c": "talks(bytes32)", +"18f95486": "openPendingPartCrates()", +"18f96441": "getShipDetails(uint256)", +"18f96857": "Lazadex()", +"18f9b023": "addPayee(address,uint256)", +"18f9bdee": "allocationOpen(uint256)", +"18fa11ab": "revokeRequestorAddress(address)", +"18fa223a": "GGCT()", +"18fb75f4": "callDeposit()", +"18fc6513": "companyCurrentPeriod()", +"18fd3474": "HumaniqICO(address,address)", +"18fd8903": "refund(address,uint256,uint256)", +"18fdcaba": "getSumAmountOfDisputedDealsProDoctor()", +"18fe1a8d": "banToken(address)", +"18fe3df7": "_buildInternalSalt(uint128,address,address,address,uint256,uint64)", +"18fed50a": "getLast4Bytes(bytes32)", +"18ff1361": "manualyMintTokens(uint256,address,uint256,int256)", +"18ff318d": "thorToken()", +"190038dc": "supplyAdjuster()", +"190042b8": "CARA()", +"19006185": "getNumRefundTransactions()", +"1900aabf": "CollectChips(uint256)", +"190108b5": "getAyantDroitEconomique_Compte_3()", +"19013cf2": "detachFromStorage(address)", +"190151c6": "_createNumber(uint256,uint256)", +"19018557": "COCToken()", +"19022f20": "TTT()", +"1902e902": "adjustEntitlement(address,address,uint256)", +"190377a5": "getCategory(string)", +"1903bbe0": "_getQueryStr(uint256,uint256)", +"1903c10e": "setPI_edit_3(string)", +"190406b3": "customExchangeSecure(address,address,uint256)", +"19045a25": "recover(bytes32,bytes)", +"19055df2": "preSaleTokenExchangeRate()", +"19058903": "NewPassProject(address,address,string,string,bytes32)", +"1905fbf6": "setNewWallet(address)", +"19062b8f": "settleTransaction(uint256)", +"190663e4": "setGreeter(string)", +"1906a3d6": "getBonusFund(address)", +"1906ff98": "getVotePrice()", +"19077dca": "resetOwnership()", +"1908c425": "m_leeway()", +"1909773f": "get_milestone_information(uint256)", +"1909787f": "NextMint(uint256)", +"1909d314": "GCPrightToken()", +"190a2688": "changePrices(uint256[3],uint8)", +"190a338f": "_createAccount()", +"190a597b": "restartCrowdsale(address,uint256,uint256,uint256,uint256,string)", +"190a6aa9": "burn(address,uint256,bytes,bytes)", +"190a8613": "getNodeLeftChild(bytes32)", +"190a867e": "testThrowNoPartialTokens()", +"190bc9d4": "w_Advisers()", +"190bfa4d": "singleDVIPQty()", +"190bfcd0": "initialTokenValue()", +"190bfea8": "sellWei()", +"190c23c4": "adminSetTxFeePaidGame(uint256)", +"190c69a2": "unWhitelistUser(address)", +"190d9253": "testInitialContract()", +"190e4c77": "numOfProperties()", +"190e8266": "makeProduct(string,string,uint256,uint256)", +"190eaaba": "getDenominator()", +"190ef61d": "readAnalyticsMap()", +"190f4cfc": "doCalculate(uint256,uint256,uint256,bytes32)", +"190fe712": "payoutETH(uint256)", +"19110d05": "DTCC_ILOW_8()", +"19113b4a": "changeStatement(string)", +"19123c1f": "magnitude()", +"1912f84f": "BONUS2_LIMIT()", +"191313ae": "EndOfPayments(address,uint256)", +"191347df": "setStr(string)", +"1913742f": "appendSchellingSupplyChanges(uint256,uint256,bool)", +"191384d1": "viewMessage()", +"19141100": "bankRollDivest(uint256)", +"1914427f": "MultiSigWalletWithDailyLimit(address[],uint256,uint256)", +"19154616": "FART()", +"1916037d": "withReferrer(address)", +"19162a30": "getYumWithETH(uint256)", +"19165587": "release(address)", +"1916fcb7": "Galaxy100()", +"191723ed": "lockBalance(uint256,uint256)", +"191797df": "isStoped()", +"1917ab5c": "activate(string)", +"1917e6d1": "addDoctor(uint32,string,uint16,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)", +"19190495": "SimulateCurrentDate(uint256,string)", +"1919cf62": "allEthShares()", +"1919fed7": "setSalePrice(uint256)", +"191ad190": "open_free()", +"191af4bc": "thirdroundprice()", +"191b548e": "VIVACrowdsaleRound(bool,uint256,uint256,bool)", +"191b8260": "_createScene(string,uint256[],address,uint256)", +"191be7b7": "getQueryResults(bytes32)", +"191d7a7a": "TVToken()", +"191d8cd7": "passToken(address)", +"191e2fc7": "setTokenizedRegistry(address)", +"191e39b3": "setOwnerCut(uint256,uint256)", +"191e521f": "moken(uint256)", +"191e8daa": "_getRand(uint256)", +"191f06e7": "setEscrowFactoryContractAddress(address)", +"192014f4": "buyKeyWithReff(string)", +"1920b2a6": "BitOnBayToken(uint256,string,string,uint256)", +"1920ed48": "isOwner(uint32,address,address)", +"19213471": "addFRA(address)", +"192159a6": "ListingCreated(uint256,uint256,uint256,uint256,address)", +"19216c4d": "getPreIcoInvestorsCount()", +"19216e8d": "freezeForOwner(uint256,uint256)", +"19218eda": "secondTokenExchangeRate()", +"192193b9": "transferFrom(address,address,int256)", +"1921c454": "priceChangeBlock()", +"19220c69": "TAKLIMAKAN()", +"1922936d": "RegisterTransferBeneficiaryContract(address)", +"1922e9b4": "getJobApprovals(uint256)", +"1922ff39": "payOut(address)", +"1923350f": "ADVISORS_TOKENS()", +"19236b4e": "getSanTimeAlive(uint256)", +"192399d1": "vestingBalance(address)", +"1923a4a3": "issuePercentToReserve(address,uint256)", +"1923e5d4": "noActiveBallotExists()", +"19240661": "setTrusted(address)", +"19245155": "StartedSafeUnlock(uint256)", +"1924f74a": "PVP_INTERVAL()", +"1925259b": "ShroomFarmer()", +"19254e2e": "getInsuranceStatus(address)", +"19261e6f": "setERC20ApproveChecking(bool)", +"1926b63d": "savePost(bytes32)", +"1926de89": "readInt256(bytes32)", +"1927a754": "drainEther()", +"1927a8ea": "listFiles(uint256,uint256)", +"19287f3a": "withdrawBalanceAll()", +"1928b3cb": "getPosition(bytes32)", +"19291c74": "getGoldStatusLastauditid(address)", +"192a4422": "safeWithdrawalAmount(uint256)", +"192b3092": "mintPreAllocatedTokens()", +"192b3608": "Bond(uint256,string,string,string,uint128,uint128,uint128,uint128,uint16,string,string,address)", +"192b663d": "vestSupply()", +"192b7700": "CitrusCrowdsale(address,address)", +"192d65c9": "getRoundByRId(uint256)", +"192e571d": "getPlayerByName(string)", +"192e7a7b": "releaseFunds(address)", +"192ecd68": "getDistrito(uint256)", +"192f1076": "crowdsaleEndDate()", +"193080cb": "getLockedContract(address)", +"1930fc01": "FastmarketNetwork()", +"193115b4": "changeHiddenOwner(address)", +"193118fa": "CPCCrowdsale()", +"193237f5": "_isValidSignature(address,address,bytes)", +"1932bb33": "lastBlock_a12()", +"19337d6c": "setLink(string)", +"193402bb": "PRE_SALE_PRICE()", +"1934d55a": "isPermanentlyApproved(address,address)", +"19350aea": "nameFor(address)", +"19354750": "setRegistryLogic(address)", +"1935f8d2": "Instacocoa(uint256,string,string,address)", +"19362921": "CONTRIBUTORS_SHARE()", +"1936a8cd": "getSeedByWinner(uint256)", +"1936dd8f": "writeMessage(string,string,string,string,string)", +"1936e4be": "advisor()", +"19375602": "challengeOwner()", +"1937714b": "confirmDeployment(uint256,address,bytes32)", +"1937b7fa": "Burnfrom(address,uint256)", +"1938a238": "softcapInTokens()", +"19397ed0": "Transfer(address,address,address,address,uint256,bool)", +"1939805f": "TPPC2018Token(uint256,string,string,uint256)", +"1939c1ff": "transfer(address[],uint256)", +"193a4249": "minFunding()", +"193a824e": "_escrow(uint256)", +"193a8a83": "getCCH_edit_28()", +"193ab829": "addGood(address,string,uint256)", +"193c114b": "transferTokensOut(address,address,uint256)", +"193c8da4": "AkikToken()", +"193c9be1": "getCreateShareToken(uint256)", +"193ccc20": "depositTokenToUser(address,address,uint256)", +"193d5b77": "getGiffBlock(uint32)", +"193df7ea": "addBlacklist(address,address)", +"193e06c4": "CalcPeriod(address,uint256)", +"193e6679": "MarginBanc()", +"193f69a1": "getPhaseBonus()", +"193fc711": "_getBeginIndexKey(uint256)", +"19404c2f": "replayAnserWithReferrer(uint256,uint256[],string)", +"1940a936": "isPregnant(uint256)", +"19424222": "approveAndCall(address,uint256,bytes32)", +"1942c3ce": "_transfer(uint256,address)", +"194307bf": "terminated()", +"19447eb6": "userStructs(address)", +"19449cb2": "changeAuthorizedCaller(address)", +"1944bc3d": "priceThresholds(uint256)", +"1946283a": "CarRegistrationFailed(uint256)", +"19465953": "changeInfo(string)", +"1946fdf4": "logicVersion()", +"19476244": "icoNumeratorPrice()", +"1947bd2f": "getMap(address)", +"194809a6": "finalistTeamFIFAIdsSet()", +"19483cd1": "checkHash()", +"19498426": "BOUNTY_REWARD_SHARE()", +"194a7adc": "CONNECT(uint256,string,string)", +"194b546b": "_addRec(uint256)", +"194b81d0": "TGxToken()", +"194c78d0": "setApp(string,uint256)", +"194c8e15": "Update_START_ICO_TIMESTAMP(uint256)", +"194d0de2": "createOrder(address,uint256,uint256,address,uint256)", +"194d297f": "canSend(bytes32,address,uint256,bytes)", +"194dee32": "setTokenForSale(uint256,address)", +"194e10ce": "run(bytes,uint256)", +"194e4acd": "reqvehreg(address,string,string,string,string)", +"194eb01c": "CimbomCoin()", +"194f4795": "getItemsLength()", +"194f8806": "setMigrationHost(address,address)", +"194f97ba": "setColorGreen()", +"194fe9a4": "transferWithBonuses(address,uint256,uint256)", +"195055f1": "isTransferable(address)", +"19507d2c": "allowedToTransfer()", +"19509649": "ImpactRegistry(address,uint256)", +"1950c218": "checkWhitelist(address)", +"1950ee41": "unlockPresaleTokens(address,uint256)", +"195199f6": "setDeadline(uint256)", +"1951f9ba": "isRequestPending(address)", +"19530f76": "multiTransferFixed(address[],uint256)", +"19547404": "sendTokens(uint256,uint256,address)", +"1954f39e": "EndDate()", +"195629de": "initMETToken(address,address,uint256,uint256)", +"195743fc": "claimSMRforAll(uint256)", +"19583b05": "modifyCollectorAddress(address)", +"1958623f": "BitcoinPluse()", +"1958ccb1": "setParams(address[],uint256)", +"195977a6": "emit(uint256)", +"1959a002": "userInfo(address)", +"195aa377": "SportsChainToken()", +"195ad926": "authenticate(uint256)", +"195b616c": "_unmountSameSocketItem(address,uint256,address,uint256)", +"195d06ff": "addBigPromoBonus()", +"195de8a1": "CapReached(address,uint256)", +"195e38b2": "EnergyModulationProject()", +"195e8688": "Osiris()", +"195ec9ee": "getAllParticipants()", +"195f4807": "getTotalPayouts()", +"195fa903": "ownersNum()", +"195fd221": "issueAmount()", +"19608123": "Vetricoin()", +"1960d761": "AccommodationCoin()", +"19617fe4": "coinBurnIco()", +"19618a9b": "testDivideFractional()", +"196198fa": "getDepositWithdrawCount(address)", +"1962d041": "SayadyToken()", +"1962df71": "_performTransferWithReference(address,uint256,string,address)", +"19638ca5": "CryptolifeToken()", +"1963a0d1": "OWN_freezeAddress(address,bool)", +"1963a693": "IncreaseAllowance(address,uint256)", +"1963df66": "dtGetWorldData()", +"1964569b": "Aktium()", +"19648bed": "batchSend(address,address[],uint256[])", +"1964dcbf": "SCCCOIN()", +"19656b46": "teansferFrom(address,address,uint256)", +"1965e183": "MIN_TOKENS()", +"19663f7f": "TransferAmountFromBankAccountToAddress(uint256,address)", +"196667e4": "start_amount()", +"1966cdbe": "pickWinner(bytes32,uint256)", +"19677635": "TEAM_SALE_MULTIPLIER()", +"19679680": "emptyInactiveToken(uint256)", +"1967d701": "fuToken()", +"19682b09": "DonationDeposited4Doubling(address,uint256)", +"19689e76": "paySemiFinalWinner(uint256)", +"1968bf4f": "getPersonalStakeUnlockedTimestamps(address,address)", +"1968c160": "addPaymentDetail(address,bytes32,uint256)", +"1969c21a": "removePixelsFromMarket(bytes32)", +"196be409": "DLTESTToken(uint256,string,uint8,string)", +"196c16cb": "tokenPriceInEth()", +"196c9909": "_bounty()", +"196cd388": "isRangeInsideRange(uint256,uint256,uint256,uint256)", +"196e5c46": "sellSeeds()", +"196ecd25": "getOwnedCount(address,uint256)", +"196ee9c7": "remainingCats()", +"196f2f61": "njcoinToken()", +"196f5851": "transferAgents()", +"196f9aa5": "getLedger(uint8)", +"196fa707": "GAMEMAGICERC20(uint256,string,string)", +"19711d67": "campaignDurationDays()", +"1972172b": "satLimit()", +"19726b4e": "TheGoDigital()", +"1972b464": "emitJobOfferPosted(uint256,address,uint256,uint256,uint256)", +"1972c8dc": "Eggfrenzy()", +"19739117": "checkSignatures(bytes32,uint256[3],bytes,bytes,bytes)", +"1973c5de": "icoPreEnded()", +"1973cae7": "nextPriceDate()", +"1973e795": "setWorkpointSupportCancel(uint256)", +"197425c4": "testSupplyOf()", +"1974a003": "_startAuction()", +"1974a540": "RoundIndex()", +"1975a9e7": "o_deus(bytes32,bytes32)", +"1976804a": "TTCoin(address)", +"19774b86": "bulkWhitelistInvestor(address[])", +"19774d43": "orderFills(address,bytes32)", +"19775795": "aquariumCost()", +"1977bd68": "pepePremine(uint256)", +"1977f5c6": "Anubis()", +"197828b1": "bucketHolding(bytes32,address)", +"1978658b": "setCaps(uint32[],uint256[])", +"1978a87b": "TokenERC20()", +"197a1976": "setInvested(address)", +"197a2820": "depositarLucro()", +"197a9187": "NodeAction()", +"197b9454": "paintingsCount()", +"197bc336": "holderAt(uint256)", +"197c0f3d": "createPool(address,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"197c3555": "getPlace(uint256)", +"197c418f": "MyAdvancedToken7(uint256,string,uint8,string)", +"197cb5bc": "balanceLockedUp(address)", +"197d24ad": "changeModuleOwner(string,string,address)", +"197ea97e": "mintAsideTokens()", +"197f0f05": "getMarketInterestSetter(uint256)", +"197f3c29": "notLike(address)", +"197f8a82": "claimReveralTokens(address,uint256)", +"197f9508": "_getExchgAddr()", +"19806d8e": "s11(bytes1)", +"19810f3c": "withdrawShares(uint256)", +"19811fc9": "TPOMZ()", +"1981d521": "participate(uint8)", +"19825187": "changeMinToken(uint256)", +"1982640c": "walletOf(address)", +"1982c626": "withdrawOverpay()", +"1982ed58": "ChangeReuseCashInHarware(bool,uint16,uint16)", +"1983111d": "getTotalCompositionPrice(uint256[])", +"1983f4c2": "getDivsBalance()", +"1984a063": "StarbaseEarlyPurchaseAmendment()", +"1984a906": "preallocatedTokenAmount()", +"1984d419": "getProvisionBalance(uint256)", +"1985a440": "ContractRegistry()", +"1985acf0": "checkLimit(address)", +"1985f54a": "getScribe(address,address)", +"19863bb7": "ReDraw()", +"19869555": "evacuateToVault()", +"1986bc55": "stopBatchAssign()", +"1986f704": "setTrigger(address,bool)", +"1986fd4d": "getAccountWhitelist(uint256)", +"1987b887": "setTokenPorter(address)", +"1987da04": "secondPreSaleDate()", +"1987e50c": "getSellerAddressPayment(address,uint256)", +"1988f6fd": "didWithdrawProfit(bytes32,address,uint256,uint256)", +"1989a5ba": "canDoLoop(uint256,uint256,uint256)", +"1989d175": "YEAR_THREE_SUPPLY()", +"198a2085": "isATrustedContract(address)", +"198a5423": "presaleFundingGoalReached()", +"198ae785": "payTrnsTax(address,uint256)", +"198b5d0d": "MinimumPoStokens()", +"198c1f97": "getKeysfromETH(uint256,uint256,uint256)", +"198c548b": "supplyTokensSaved()", +"198df3b9": "LoginCheck(bytes32)", +"198e2b8a": "create(string,string)", +"198fa9a3": "isSigned(address,address,bytes32,uint8,bytes32,bytes32)", +"19901f1d": "TokenSale(uint256,uint256)", +"19901f20": "removeMultipleAllowedAddresses(address[])", +"19902b40": "changeCardAttr(uint256,uint16[5],uint16[5],uint16)", +"199099dc": "updateAccountState(address,uint256,bool)", +"1990ad6b": "private_delPermittedRoll(uint256)", +"1990f521": "fundings()", +"199156e4": "generatePresaleHouse()", +"1991d34a": "getDataColla_AB_02(string)", +"1991d6ac": "moveTokensFromSaleToExchange(uint256)", +"19921ad2": "AuthStart()", +"199317cf": "mining_uncle(bytes,bytes,uint256)", +"199326cb": "lastBlock_a2Hash_uint256()", +"1993584b": "countSecondWinners()", +"1994ad1e": "founderEggSupply()", +"19950c5b": "withdrawUnprotectedFunds(address,address,uint256,bool)", +"1995333b": "burnFunds(uint256)", +"1995b86d": "changeServerState(uint256)", +"199676c7": "TOKEN_RATE_40_PERCENT_BONUS()", +"19973261": "assigner()", +"19978a49": "rejectRequestUnpause()", +"1998524c": "updatePriceBottomInteger(uint256)", +"1998a5c4": "RHC()", +"1998aeef": "bid()", +"1998fb75": "addCar(uint80)", +"19996d50": "DinosaurFarmer()", +"1999cf37": "CHINESE_EXCHANGE_BUYIN()", +"1999eca8": "attack(uint8)", +"199a620a": "acceptNegotiationOwner(address)", +"199ba9e8": "basicFunctionReturn()", +"199c8b74": "SecvaultTest()", +"199cbc54": "totalVested()", +"199d70f4": "forceWithdrawRejected(address)", +"199d743a": "bountyTransfers()", +"199ed01b": "weightOf(uint256,uint256)", +"199f0791": "withdrawCntr(uint256)", +"199f4045": "NewRisk()", +"19a04a33": "SetDraftOrder()", +"19a08058": "setDelay(uint256,uint8,uint256)", +"19a0d492": "getValueOfInitialTokens()", +"19a0e572": "unverifyAddresses(address[])", +"19a17468": "ENS(address)", +"19a1b54f": "WEI_PER_ETHER()", +"19a1c691": "_removeChild(uint256,address,uint256)", +"19a1f592": "BONUS_AMOUNTS(uint256)", +"19a231eb": "getMilestoneDisputes(bytes32)", +"19a278b9": "getBAddress()", +"19a2bfd8": "unreadMessageCount(address)", +"19a32f66": "setHashByProvider(address,bytes32,bytes32)", +"19a3d0bb": "getMyStrippers()", +"19a3e3c0": "getAllRevenue()", +"19a50f49": "numUsers()", +"19a51554": "scheduleNextAuction(address,address)", +"19a523b0": "Violated(string,address)", +"19a5ce51": "oraclizeGasExtraArtwork()", +"19a64104": "Lockup6m(address)", +"19a6b356": "updateStrategyLabel(bytes15,string)", +"19a6fe7d": "setFixedAssets(bytes32,bool)", +"19a72fef": "DroneEmployeeROS(address,int256,address,address)", +"19a7e59d": "assertEq4(bytes4,bytes4,bytes32)", +"19a876c2": "stopPubTrade()", +"19a9119f": "prolongedDuration()", +"19a96e72": "setCarrotsMultiplier(uint8)", +"19a9c2f1": "generateId(string)", +"19aaff86": "claimAllDividends(address)", +"19ab453c": "init(address)", +"19ac2756": "TIER1_RATE()", +"19ac74bd": "userCampaigns(address,uint256)", +"19ac8c0f": "payComission()", +"19adda2c": "fairsaleProtectionOFF()", +"19ae8994": "test1(uint256)", +"19aec48a": "endTimeNumber()", +"19aec6a9": "newThreadEvent(uint256,string,string,uint256)", +"19af1bd9": "WeiRaised()", +"19af6f48": "crowdsaleTokenSold()", +"19afa824": "setFactoryInterface(address)", +"19afdfe1": "showMigrationAmount(address)", +"19b0297d": "info_BalanceOf(address)", +"19b05f49": "accept(uint256)", +"19b09f9b": "payWinner(address)", +"19b1f94b": "getLastAuditPass(address)", +"19b24684": "updateEntity(uint256,address,uint256)", +"19b35f3d": "organisationIndex(address)", +"19b36162": "updateParams(uint256,uint256,uint256,uint256,uint256,uint256)", +"19b3fa4b": "removeEmitter(address)", +"19b4006e": "get45(uint256,uint256)", +"19b500ef": "deposit_internal(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256,uint256)", +"19b5176e": "memberGroupNameHash(address)", +"19b587ad": "putCompanyOnsale(bytes32,uint256)", +"19b61c09": "createSaddle1(uint256,uint256,uint256,address)", +"19b64015": "connectorTokens(uint256)", +"19b667da": "setFinalizeAgent(address)", +"19b6eabe": "setBounty(bytes32)", +"19b7b0b4": "acceptBid(uint256,uint256,bytes32)", +"19b7d7bd": "getBudget(address)", +"19b97530": "setFundariaPoolAddress(address)", +"19b985b3": "fixamt()", +"19ba0b63": "getNumberOfProjects()", +"19ba567c": "cancelAddOwnerRequest()", +"19bad1b2": "Stage1MEI()", +"19bb3c3d": "Reddit(uint256,uint256,bytes,bytes)", +"19bba58b": "_updateInventories(uint256,uint256,uint16)", +"19bdfc7f": "returnTokensFromHoldProjectAddress(uint256)", +"19be28ec": "CurrencySwap()", +"19be65f0": "GetBalance(address,address)", +"19bece1b": "buytoken(uint256)", +"19bee474": "totalFundsDistributed()", +"19bf01c0": "firstLockTime()", +"19c02b27": "allowTransfer(address,uint256)", +"19c039bc": "airDropJoin(bytes32)", +"19c0737f": "WineChainToken()", +"19c2a5b5": "auctionClose()", +"19c2b4c3": "getLastRequestId()", +"19c2f201": "GEN0_AUCTION_DURATION()", +"19c32e0b": "hmacsha256(bytes,bytes)", +"19c35319": "extendCaller(address,address,uint256)", +"19c38c66": "inPermission(address,bytes4)", +"19c46f51": "kscBatchBurnWhenMoveToMainnet(address[],uint256[],string)", +"19c47214": "getBlockVersion(bytes)", +"19c4e40f": "envelopeTypes(uint256)", +"19c54359": "createData(uint256,uint256)", +"19c55a31": "SearchByGit(bytes)", +"19c55cea": "cancelBid(bytes32,uint256,uint256,uint256,uint256,uint8,bytes32,bytes32,uint8)", +"19c5ab4b": "addAccountReader(address,address)", +"19c5b887": "bonusSize()", +"19c5b89c": "DToken()", +"19c5ef1b": "oneStepRate()", +"19c61b6f": "dealEndOffer(bool)", +"19c6c6cd": "THRD()", +"19c6eeb8": "getIPFS(address,string)", +"19c76700": "withdrawBankroll(uint256)", +"19c85a4d": "RakugoCrowdsale(uint256,uint256,address,address,address[])", +"19c87f1f": "toAddress()", +"19c8b591": "ChangeCurrencyAdditionFee(uint256)", +"19c97154": "getLastTicketTime()", +"19c9a4f3": "platformTokensAddress()", +"19ca6feb": "_appendSchellingSupplyChanges(uint256,uint256,bool)", +"19ca964c": "_isOperatorForTranche(bytes32,address,address)", +"19cac495": "isYes(uint256)", +"19cae462": "difficulty()", +"19cb355d": "requiredStake()", +"19cbe072": "contractFallback(address,uint256,uint256,uint256,uint256,uint256,bytes32)", +"19cc02aa": "airdropped()", +"19cc1ec4": "maxContributionAmount()", +"19cddd4b": "hackoin(string,string)", +"19ce4432": "DMPhuongToken()", +"19ceb660": "Ticket_Price()", +"19d0f54d": "allowRecovery()", +"19d152fa": "vestingToken()", +"19d1997a": "supplyLimit()", +"19d1b6c6": "getRegistrationRight(address)", +"19d1d967": "MOAC()", +"19d2993e": "phase1DurationInHours()", +"19d2fe85": "_iD()", +"19d3237c": "setDataColla_001_002(string,string)", +"19d375f1": "isLeagueRosterContract()", +"19d3be48": "_getPartId(string,uint8,uint8,uint8)", +"19d40b08": "approved()", +"19d41c69": "ticket_price()", +"19d45925": "isJobHasFreelancer(bytes)", +"19d45a08": "launchContract()", +"19d46f71": "makeWeeklyInvest(uint256)", +"19d4c380": "setBestGuessSecondPlaceTentativeWinningPayoutDistributionHash(bytes32)", +"19d56f84": "BuyChestSuccess(uint256)", +"19d70e0b": "createSaleAuction(uint256,uint256)", +"19d7943a": "reLoadXid(uint256)", +"19d8ac61": "lastTimestamp()", +"19d9217c": "midTermHolding()", +"19d9c8df": "ScaleObs(address,bytes32)", +"19da8c99": "getICOStatus()", +"19dacbf8": "Deposit(address,bytes32,uint256)", +"19dad16d": "setOwnerCutPerMillion(uint256)", +"19dba3d2": "getBountyToken(uint256)", +"19dc2525": "closeChannelEcrecover(bytes32,uint8,bytes32,bytes32,uint256)", +"19dc831a": "withdrawHavvens(uint256)", +"19dd9455": "getContractTimestamp()", +"19ddd5a3": "_buyXname(bytes32,uint256,bytes32)", +"19de029a": "setBountyDuration(uint256)", +"19dec62a": "approveAgreement()", +"19e044f8": "MockToken(uint256)", +"19e06f20": "mintIssuerToken(address,uint256)", +"19e072ef": "updateStatus(bool)", +"19e0a0cf": "sendTokensWithLock(address,uint256,bool)", +"19e0eb0e": "currentBlockHash()", +"19e13c93": "winningTeamName()", +"19e1568c": "pause_1()", +"19e1d8d4": "Luckblocks()", +"19e1fca4": "allowed()", +"19e3897a": "UpdateUserExtraData2(address,bytes32)", +"19e3a1d8": "BoomstarterICO(address[],address,uint256,bool)", +"19e4540b": "getBankAccount()", +"19e5221a": "getBonusFee(uint256)", +"19e5bf3a": "Register()", +"19e5d0cb": "mintInPeriodCount(uint256)", +"19e66508": "ztToken()", +"19e6ab23": "icoDiscountLevel1()", +"19e6e158": "totalVotes(uint256)", +"19e740c0": "getNextVestingIndex(address)", +"19e743fe": "addICOToken(address,address)", +"19e77c34": "startSlotAt()", +"19e7998c": "votingInfo()", +"19e7fbc2": "totalEthPos()", +"19e82d86": "cfi_whitelist(address)", +"19e82e6f": "BrokerBank(address,uint256,address,address)", +"19e858e5": "processCollateral(address,address,uint256,uint256,uint256,uint256,bool)", +"19e860c1": "secondPrivateLockedAmount()", +"19e9e5de": "getGooProduction(address)", +"19ea61db": "testFailTransferDisabled()", +"19ea809b": "intercrypto_convert(uint256,string,string,address)", +"19ea8a98": "setPackSaleAddress(address,address)", +"19eae36b": "setMaxBlockPurchaseInOneGo(uint256)", +"19eaeccb": "getInfoCellLockup()", +"19eb4a90": "getValues()", +"19eb5dc6": "transferToken(address[])", +"19eb691a": "curUserId()", +"19eb8d48": "canVote(address,uint256)", +"19ecb310": "allocateTicket(address,address)", +"19eced6d": "mCURRENT_STATE()", +"19edc0aa": "minimalInvestment()", +"19ede85a": "Hydron(uint256,string,string)", +"19ee1f1c": "getPrizeFund()", +"19ee5bca": "BountyManagerEntity()", +"19f02ceb": "set(address,address,uint256)", +"19f1cded": "getStakedTeller(address)", +"19f1d7b0": "Kentkoin()", +"19f2b931": "removerAssinatura(string)", +"19f30aaa": "hire(uint64,address[])", +"19f353bb": "protectionPrice()", +"19f37361": "isToken(address)", +"19f3edec": "_released(uint256,uint256)", +"19f4ff2f": "setFeeRatio(uint256)", +"19f577b3": "placeBuyOrder(uint256)", +"19f8dee9": "isEthWithEnc(uint16)", +"19f97a46": "createContractPlace(string,string)", +"19fa55bd": "MinasAlbarit()", +"19fa8f50": "InterfaceId_ERC165()", +"19fa9f72": "DNNToken()", +"19fac8fd": "setCommissionRate(uint256)", +"19fb361f": "transferTo(address,address,uint256,bytes)", +"19fb52db": "mainPoolCutPercentage()", +"19fc36ed": "MIN_TRANSFER_TIMESPAN()", +"19fc3b9d": "getMyHolding()", +"19fc5b88": "minEthAmount()", +"19fc5dfa": "LogBeneficiarySet(address,address)", +"19fc9e54": "cashInvestment(address,uint256)", +"19fce740": "capCommitment()", +"19fd93f1": "unregisterSsp(address)", +"19feda7e": "addEmployee(address,address,uint256,uint256)", +"19ff1d21": "hello()", +"19ff7096": "cost_of_transfers()", +"1a000513": "getLotteryResultTotal(address)", +"1a0058f5": "getBatchInfo(uint256)", +"1a006503": "hasAlreadyClaimed()", +"1a009265": "setArrBoolField1(bool[])", +"1a013939": "gameStarted(string,uint256,uint256,uint256)", +"1a017f3f": "transferPrivileged(address,uint256)", +"1a026c96": "wallet1()", +"1a02af40": "tokensInAuctionsOfOwner(address)", +"1a036357": "removeDeactivatedList(address)", +"1a038873": "FREEZE_TIME()", +"1a041463": "retryOraclizeSetProof(uint256)", +"1a04d5c5": "startingFeeBalance()", +"1a053713": "unblockTokenFunds(address,uint256)", +"1a05619b": "infoTier()", +"1a05ba8d": "setPI_edit_12(string)", +"1a06008a": "dividendFund()", +"1a069c72": "contribute(uint256,uint256,uint8,bytes32,bytes32)", +"1a0725ce": "wagerIndex()", +"1a0726df": "getHatValue(uint256)", +"1a080a7a": "placeBet(uint8,int8,uint256,uint256)", +"1a081330": "isSaleOpen()", +"1a08a7bf": "ConfigAction()", +"1a08b189": "setFounderAddress(address)", +"1a0919dc": "unregister(bytes32)", +"1a092541": "getDescription()", +"1a09510a": "index(address[],address)", +"1a0a617d": "fetchVoteInfoForCandidateByIndex(uint256,address)", +"1a0a8fae": "creditJackpotTokens(address,uint256,uint256)", +"1a0a9ac7": "KNOXV()", +"1a0abd34": "getMyDepositAmount()", +"1a0b1b86": "crowdPrice()", +"1a0b4656": "LiveStarsToken()", +"1a0bc596": "pandora()", +"1a0be73f": "DispatchHub()", +"1a0c3479": "decreaseApproval(address,uint256,bytes,string)", +"1a0c83f8": "buyerLastPaidAt(uint256,address)", +"1a0d77b9": "ClaimAmount()", +"1a0ddce9": "setRewards(address[],uint256[],uint256[])", +"1a0de74c": "selectWinners()", +"1a0e722b": "LogDeliverEVN(address,uint256)", +"1a0f0bf1": "unrestrictedMintToPool(uint128,uint256,uint128)", +"1a0f2f5f": "BroToken()", +"1a0f518d": "updatePlayerBalance(address,int128,int128,uint256)", +"1a0faecf": "addNewMeme(uint32,string,string,string,string)", +"1a0fb847": "disperseRewards(address,uint256)", +"1a10cfc3": "delete_entry(uint256,uint256,uint256)", +"1a11415e": "PRIVATESALE_BASE_PRICE_IN_WEI()", +"1a120481": "enlist()", +"1a12e7a9": "setCreationFee(uint64)", +"1a144940": "codetokenIndexToOwner(uint256)", +"1a145c34": "getNumEthTweets()", +"1a148644": "newDocument(string,string)", +"1a14e94a": "buyAnimal(uint256)", +"1a14f128": "EventCreateAccessory(address,uint256)", +"1a14ff7a": "getD()", +"1a1542e6": "checkGameResult()", +"1a15b206": "holdTokens(address,uint256)", +"1a160fe9": "checkPermission(address,address)", +"1a170aa1": "buyTickets(bytes32)", +"1a1773f4": "otherchainstotalset()", +"1a182801": "createNewCertifier()", +"1a18e707": "setBlockReward(uint256)", +"1a197588": "availableAmount(address[3],uint256[4])", +"1a19b0da": "confirmEngineerQuest(address)", +"1a1a0d65": "distributeSRNT(address[],uint256)", +"1a1a0d76": "updateTopicDescription(bytes15,string)", +"1a1a4ed7": "HALVING_DELAY()", +"1a1a7993": "random(uint64)", +"1a1a8da8": "WebPay()", +"1a1aab46": "unlock_times(uint256)", +"1a1abe3d": "sizes(uint8)", +"1a1b8d08": "CompleteInit()", +"1a1c59e2": "setBidSubmissionProofsAdd(address)", +"1a1ceb11": "cloneProposal(uint256,string,bytes32,uint256,uint256,uint256,bool)", +"1a1d28aa": "ClaimAcornShare()", +"1a1dca07": "setLockFunds(address[],uint256)", +"1a1df394": "Play(bool)", +"1a1e01d5": "pushAllRemainToken(address)", +"1a1eea7d": "ProposalRequestSubmitted(bytes32,uint256,uint256,string,address)", +"1a1feae1": "txGasPriceLimit()", +"1a2084f1": "updateCreator(address)", +"1a209776": "isVerified(address,uint256)", +"1a21bb22": "PREVIPdeadline()", +"1a21c229": "gracePeriodMaxTarget()", +"1a2309f0": "CONTRIBUTION_MAX()", +"1a23bee3": "endOfROSCARetrieveFees()", +"1a24b91a": "setPriceFee()", +"1a24befc": "clearSaleSharesSold(uint256)", +"1a254884": "Coffeecoin(uint256,string,uint8,string)", +"1a256090": "sawan()", +"1a25e513": "upgradeProvider(address,address)", +"1a261fda": "scoreUp(address)", +"1a26ed1c": "validateReservedWindowSize(uint256,uint256)", +"1a2a4ab5": "withdrawDeadFund(address)", +"1a2a627c": "nextroundtotalsupplyGOTCH()", +"1a2ad007": "GetCurRoundInfo()", +"1a2b3431": "completeBooking(uint256)", +"1a2b3adf": "signedTransferFromHash(address,address,address,uint256,uint256,uint256)", +"1a2b4cd8": "airDropPool_()", +"1a2b6250": "canPerform(address,address,bytes32)", +"1a2c4334": "FortuneGodToken(address)", +"1a2c752a": "testLimiting()", +"1a2d3be8": "masterNodable()", +"1a2d72fb": "_api_PlaceBet(bool)", +"1a2d8629": "getinfo()", +"1a2e2b2c": "getHolderIndex()", +"1a2eaaeb": "Unicoin()", +"1a2f1640": "amountSecond()", +"1a300a98": "_setCooldownEndTime(uint256,uint256)", +"1a3057f3": "performAddToken()", +"1a30ec13": "ETHWallet()", +"1a311968": "roundICO()", +"1a3142bd": "depositAndWithdraw(uint256)", +"1a314552": "isUsernameExists(string)", +"1a31752a": "masternodes(uint256)", +"1a31e733": "WinningsClaimed(address,uint256)", +"1a327d97": "bitmask_rm(address,uint256)", +"1a3352c1": "getOrderBookSize()", +"1a3480b5": "rateDecimals()", +"1a34b59d": "OjtToken()", +"1a34fe81": "max_amount()", +"1a3538f3": "closeFailedInstallationAndWithdraw()", +"1a360f5f": "EWM()", +"1a363bf1": "giveMeTokens()", +"1a365f2b": "stampIndexToOwner(uint256)", +"1a3722b2": "grantPermission(uint8,address)", +"1a372eaa": "allPiranhasInfo(uint256)", +"1a3739ec": "getInitialReporter()", +"1a389eb9": "exploreFastenEMONTFee()", +"1a38fa06": "distributeBounty(address[],uint256[])", +"1a399698": "genDailySecondPrizeKey(uint8[4])", +"1a39d8ef": "totalAmount()", +"1a39e1cf": "addAffiliate()", +"1a3a67d8": "zGetGameID()", +"1a3ae67a": "getPlatBalance()", +"1a3b8bad": "CABoxCrowdsale()", +"1a3cb4f5": "getBalanceA(bytes)", +"1a3cd59a": "getInfo(uint256)", +"1a3d069b": "totalEuroUlps()", +"1a3d96ff": "IdentityManager(bytes32)", +"1a3dc39c": "getRewardPotSetting()", +"1a3de5c3": "_pay()", +"1a3e42d0": "setSignUpOnOff(bool)", +"1a3e5457": "validDestination(address)", +"1a3e91b9": "getTitle(bytes32)", +"1a3f9eb5": "getVanillaERC20BalanceSlot(address,uint256)", +"1a421103": "getProperty(address,bytes32)", +"1a426550": "claimBounty(uint256,string)", +"1a429a0e": "SCND_CRWDSALE_RATIO()", +"1a433daf": "withdrawProposedAction()", +"1a437780": "orderOnFightAuction(uint256,uint256,uint256)", +"1a43c338": "compute()", +"1a44731c": "statePhase()", +"1a454ea6": "COMMISSION_RATE()", +"1a45fac7": "removeOwner(address,address,address)", +"1a463a7d": "amountReceived(uint256)", +"1a464fa1": "claimProductOwnership(bytes32)", +"1a470b6a": "SweepBalances()", +"1a476260": "indiFundAndSocialVaultDeposit()", +"1a4813d7": "setBaseRate(address[],uint256[],uint256[],bytes14[],bytes14[],uint256,uint256[])", +"1a488a60": "zpzToken(uint256,string,uint8,string)", +"1a48fb3a": "testDeleteLawyer()", +"1a49803b": "investWithSignedAddress(address,uint128,uint8,bytes32,bytes32)", +"1a4a1a6c": "benefactorsBalance()", +"1a4b4cff": "updateWithdrawalModeByIndex(uint8,uint32)", +"1a4b746f": "CharacterRegistry()", +"1a4bcc4a": "validTokenBalance(address)", +"1a4be5d8": "HITSCoin()", +"1a4be6ff": "ConstantConfig(uint256,bool,bool)", +"1a4c24f9": "purchaseInternal(address,uint256,address)", +"1a4e0afd": "countBit(uint8)", +"1a4e1e78": "tips()", +"1a4e9a6c": "getWithdrawConfirmations(uint256)", +"1a4f5b67": "isFrontRunnerPeriodOver()", +"1a4fb653": "getGDemoc(uint256)", +"1a4fbee1": "committeesArrayIndexCounter()", +"1a514d97": "reActivate()", +"1a51a28c": "contributorsAllocation()", +"1a52691b": "refundForAll(uint256,uint256)", +"1a534fd1": "calcCanAcceptAmount(address,bool,uint256)", +"1a5375e1": "passTurn(uint256)", +"1a53cd90": "presaleBalancesLocked()", +"1a555b0c": "NewClonedToken(address)", +"1a55ad28": "_verifyProof(string,bytes,bytes,uint256)", +"1a55b8f7": "BACKUP_ONE()", +"1a582962": "isMintingFinished()", +"1a58349a": "fetchCreatedOrdersForPayerByAdmin(address)", +"1a5834aa": "start_game(string,string)", +"1a592bc1": "saasPayUser()", +"1a5ab391": "Wallet7()", +"1a5b189d": "NCASHTOKEN()", +"1a5b72c3": "endStage3()", +"1a5b8f96": "MAX_SITE_ID()", +"1a5bd7fc": "getTournament(uint256)", +"1a5d3b75": "getAssetIdOwner(uint256)", +"1a5d60bd": "removeBoard(address,address)", +"1a5dbe98": "iflea()", +"1a5e2110": "tokensPerEthPrice()", +"1a5e6f7d": "getOneBet()", +"1a5e7852": "kaliSupply()", +"1a5eba21": "invest(uint256,string)", +"1a5f9613": "DevMiningRewardPerETHBlock()", +"1a5f9bed": "exploreUsingETH(uint256,uint256)", +"1a620a3e": "AgriChainMasterContract()", +"1a6253ed": "ownerTransferPHX(address,uint256)", +"1a629b00": "AddTokensToMember(address,uint256)", +"1a62c928": "approveAllocation(address,address)", +"1a62f6f7": "escrowReturn(address,uint256,uint256)", +"1a63aa4d": "prolong(uint256)", +"1a64937b": "cleanupAbandonedGame(address)", +"1a64adae": "vestedTokens(address,uint256)", +"1a65569b": "placeBid(uint256,uint256,uint256,uint256,bytes32)", +"1a65d3c2": "SnakeFarmer()", +"1a65e283": "buyCountry(uint256)", +"1a668c42": "finishAirdrop()", +"1a67456e": "getNumberOfItemsByTypeAndOwner(string,address)", +"1a67d6e5": "MainSaleClosed()", +"1a68b1a1": "setRetirementManager(address)", +"1a690752": "UDCC()", +"1a695230": "transfer(address)", +"1a699085": "view64()", +"1a6a3c03": "GetEscrowOwner()", +"1a6a57f4": "getInviters()", +"1a6af7b7": "currTime()", +"1a6b0e73": "addArts(address)", +"1a6b13e2": "changeMinimumTakerProtocolFee(uint256)", +"1a6becd6": "getAllDividends()", +"1a6c0983": "getShipSell(uint32)", +"1a6c6e38": "MagicStore(address)", +"1a6c9c0d": "withdrawStart(uint256[],uint256,uint256,uint256)", +"1a6d7561": "getFundingInfoOfPhase(uint8)", +"1a6dafa6": "getJackpotRoundEndTime()", +"1a6e1315": "pay_salary(uint256)", +"1a6e2445": "changeRelease(uint256)", +"1a6ea411": "MANHATTANPROXY5THAVE()", +"1a6f1974": "disableNodeRegistration()", +"1a6f56a0": "balancesLocked2Y(address)", +"1a6f7be5": "voteNo(uint256)", +"1a6fb342": "getTransferStatus()", +"1a700013": "inWhiteList(address,address)", +"1a700a95": "QWHappy()", +"1a701609": "HEAD()", +"1a70388f": "shareToWei(uint256)", +"1a70d015": "exchangesTokens()", +"1a715bcf": "lauToken(address,address)", +"1a71733c": "determineAllocation(address,address[],uint256[])", +"1a71d3db": "freezingBalanceNumberOf(address)", +"1a7303de": "eddToken()", +"1a73293d": "updateWhitelist(address,uint256)", +"1a74d536": "hasExited(address,address)", +"1a750945": "vote03YesCount()", +"1a751b2c": "makeMonthlyInvest(uint256)", +"1a7626e7": "minimumFee()", +"1a76e30c": "BONUS_DAY2_DURATION()", +"1a776b3c": "reclaimSurplusEth(address)", +"1a7777bb": "getMarketSpreadPremium(uint256)", +"1a787915": "startConditions(bytes32)", +"1a790a2c": "_setPowerPool(uint256)", +"1a79464e": "setFeeBurner(address)", +"1a799617": "revokeRound(uint256)", +"1a79bbef": "addAddressToMaster(address)", +"1a79c5de": "setTimeWindow(uint256,uint256)", +"1a7a98e2": "getDomain(uint256)", +"1a7ae0ba": "updateCostUSD(uint256)", +"1a7aed0e": "_checkMyAging(address)", +"1a7b11f5": "epoch_fund()", +"1a7b9fe7": "setCouponRatio(uint32)", +"1a7c6eb0": "getHalvingBlocks()", +"1a7c7105": "__load128(bytes)", +"1a7cecb2": "recoverAddressFromCooperativeSettleSignature(uint256,address,uint256,address,uint256,bytes)", +"1a7cf619": "round0StartTime()", +"1a7e0c50": "totalBaseLareSoldInPreSale()", +"1a7f8588": "IRE()", +"1a7facff": "rcn()", +"1a7fae47": "pubkeys2(uint256)", +"1a8012e4": "is_active()", +"1a809b02": "unpauseRefund()", +"1a81284b": "CCH_FGRE_1()", +"1a81a01f": "configContract(uint256,address[],uint256[],uint256[],uint256[],uint256[])", +"1a81c3a2": "getUserContract(address,uint256)", +"1a81e7b4": "getExtender()", +"1a82844c": "getERC721AmountPawn(uint256,address)", +"1a82eeb4": "ocpTokenContract()", +"1a833d3f": "trancheNumerator()", +"1a83690d": "Work()", +"1a841b1b": "configureFromStorage()", +"1a8432ea": "isUnLockedAccount(address)", +"1a844205": "SaintCoinWorld()", +"1a859db8": "rewardsAccounts(uint256)", +"1a85bd57": "_find(uint256)", +"1a85c6cb": "RandomNumber(uint8)", +"1a85f4fb": "UrlHint(int256)", +"1a85f7d2": "applySettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"1a860d91": "AddUser(string,address,uint256)", +"1a861d26": "maxLimit()", +"1a86430e": "calcTotalShareRewardFee(uint256)", +"1a86535a": "GetWhoSignedAVersion(string)", +"1a86ac4f": "initialAddressSet()", +"1a86d5b6": "sendToOtherBlockchain1(string,string)", +"1a871a2c": "playerCharacter(uint256,uint8)", +"1a88bc66": "slot()", +"1a88cc31": "getCommissions(uint256)", +"1a88f306": "transferFromContract(address,uint256)", +"1a8932d9": "allocated2Year()", +"1a8943dd": "overflowResistantFraction(uint256,uint256,uint256)", +"1a895266": "unBlacklist(address)", +"1a8a5de1": "citizensAmounts()", +"1a8a85f3": "checksum(address)", +"1a8af7a8": "restartMint()", +"1a8b1874": "endprivate()", +"1a8c7243": "presale_finish()", +"1a8dc392": "checkAddressTeamTwo(address)", +"1a8f8f3e": "MJCCToken()", +"1a8fc985": "INITIAL_TOKENS_PER_ETHER()", +"1a9069cf": "signDate(bytes32)", +"1a90f0c4": "numTurnsToRevolve()", +"1a918bdd": "addTraps(uint256,bytes,uint256[])", +"1a92e6da": "Veegotoken(uint256,uint256)", +"1a9360dd": "checkDate()", +"1a93d1c3": "getGasLimit()", +"1a93fa4b": "reorganizeSubUsers()", +"1a9425c1": "verified(uint256)", +"1a94d49b": "BASE_BET_ETHER()", +"1a955061": "numToWei(uint256,uint256)", +"1a95bc99": "GreatHarmon()", +"1a95f15f": "TICKET_PRICE()", +"1a968069": "multiSig(bytes32)", +"1a974bb5": "KOCMOC()", +"1a97d1fa": "CLASSYToken()", +"1a98d0de": "whitelistedParticipantsLength()", +"1a991f0d": "approveSpenderDecimalAmount(address,uint256)", +"1a9938aa": "activateAddress(address,bool)", +"1a994fd2": "addVideoGame(string,address,uint256)", +"1a99bed2": "VestingSent(address,address,uint256,uint256,uint256)", +"1a9a01fb": "removeGame()", +"1a9a0426": "setDecimal(uint8)", +"1a9aa710": "ownerAuctionCount(address)", +"1a9aea0a": "lockTransfer()", +"1a9b0b7c": "isWinner()", +"1a9b26a2": "decode(bytes,uint256,uint256,uint256)", +"1a9b70f2": "destroyBlockFunds(address)", +"1a9be331": "getFastExtra()", +"1a9bf9cf": "bountyTokens()", +"1a9c4571": "listEggsIds()", +"1a9caab9": "createGen0(uint256)", +"1a9d64c8": "publicsale_address()", +"1a9df17b": "OrderPaid(uint256,address,uint256,uint256)", +"1a9df9d4": "getLowerSend()", +"1a9e3e18": "ownerBuyCut()", +"1a9f170d": "buyIcoToken1()", +"1a9f66c4": "StrimTeam()", +"1a9faa80": "setUpdateAddress(address)", +"1aa022bf": "UacToken()", +"1aa02d59": "set_fee(uint256)", +"1aa05ab6": "testSellTwoTokens()", +"1aa19567": "interruptLastRound()", +"1aa20b68": "verify(address,uint256,uint8,bytes32,bytes32)", +"1aa260c0": "withdrawAsSupporter(uint256)", +"1aa2852f": "DToken(address)", +"1aa359ff": "newTokenContractAddress()", +"1aa37733": "AudCoinToken()", +"1aa3a008": "register()", +"1aa43078": "minTime()", +"1aa44efd": "createNamedDistrict(uint256,string,bool)", +"1aa49291": "Getter()", +"1aa57ec5": "TokenLab(address,uint256,uint256)", +"1aa58bd3": "isAetherClockAuction()", +"1aa5b55c": "stageTwoStart()", +"1aa5c70e": "getDAI(uint256)", +"1aa6e29f": "hasOneYearWithdraw()", +"1aa7655c": "START_TOKENS()", +"1aa7e54c": "dungeonDifficulty()", +"1aa859d0": "remTokenPairWhitelist(address,address)", +"1aa86370": "updateXIPFSPublicKey(string)", +"1aab7bb5": "setParamsPreSale(bool)", +"1aab9a9f": "holderCount()", +"1aabaffe": "WhaleToken()", +"1aac38c8": "addPhase(uint256)", +"1aacd03c": "checkNewPlayer(address)", +"1aad5bc2": "_getRarity(uint256)", +"1aad8b82": "calculatemortiesell(uint256)", +"1aadadaa": "getRegistrantFund(address)", +"1aadcc34": "convertGreyGreen(uint8,uint8)", +"1aadddea": "investorGiven()", +"1aae3460": "investedAmountOf(address)", +"1aaf39ff": "check_dividend(address)", +"1ab06ee5": "set(uint256,uint256)", +"1ab08c61": "albosAddress()", +"1ab1025c": "tokensOutInMarket()", +"1ab12b10": "CurrentDevFee()", +"1ab268d6": "getCompleteSetCostInAttotokens()", +"1ab27060": "Unapproved(address,address)", +"1ab2935c": "VestingScheduleRegistered(address,address,uint256,uint256,uint256,uint256,uint256)", +"1ab30817": "gasLimitForOraclize()", +"1ab3a6c8": "getParentsForTokenId(uint256)", +"1ab3c515": "balanceOfLocked1Y(address)", +"1ab3d055": "removeAdminWhitelist(address[])", +"1ab46d4e": "referralBonusCalculate(uint256,uint256)", +"1ab51aec": "buyEPU()", +"1ab59612": "setAllowPriceLower(bool)", +"1ab5c5b8": "adduser(address,uint256,uint256)", +"1ab5d260": "transferTo()", +"1ab681e8": "withdrawEth(uint256,address,bytes32)", +"1ab733a3": "getTotalProfits(address)", +"1ab7df5f": "addUserTokens(address,uint256)", +"1ab86572": "calculateRoom(uint256,uint256,bool,uint256)", +"1ab8bc44": "_setMilestoneTo(address,uint256,uint8)", +"1ab8ff3b": "_finalization()", +"1ab961a1": "BSDB()", +"1ab971ab": "setFee(uint32)", +"1abb0ba9": "getTotalCurrentSaled()", +"1abb10e8": "chipSpeed()", +"1abb7192": "YCCToken(uint256,string,uint8,string)", +"1abca540": "Toptech()", +"1abd409d": "champsForSaleCount()", +"1abe8385": "InvestmentToken()", +"1abebea8": "LogSetAuthority(address)", +"1ac10d11": "testGreatherThanOrEqual()", +"1ac10f1f": "setPixelRate(uint256)", +"1ac14219": "testEns()", +"1ac25a81": "RegisterDrupal()", +"1ac25e99": "extractBalanceProofSignature(address,uint32,uint192,bytes)", +"1ac33b3d": "createTrack(bytes32)", +"1ac39336": "GelatoCoin()", +"1ac3ddeb": "withdrawFee(address)", +"1ac46290": "setProviderInfo(uint256,string)", +"1ac4754b": "redeemInternal(address,bool)", +"1ac47963": "functionSeven()", +"1ac589b4": "setJoiningFee(uint256)", +"1ac58dd5": "kimsCreated()", +"1ac5c96f": "test_4_someTest()", +"1ac61e8c": "testBlobCreate()", +"1ac68a12": "HavvenGoldSupply()", +"1ac7e1f9": "CollectedAllFees(address,uint256)", +"1ac84690": "powerOf(address)", +"1ac8a9b2": "teamlock()", +"1ac8aa4e": "minimowea()", +"1ac9180e": "tokenReinvest(uint256)", +"1ac96124": "numOfCommon()", +"1ac975ed": "UcCoinPriceChanged(uint256,uint256)", +"1ac9f70d": "multiplicate(address)", +"1aca00fd": "variable(uint256)", +"1aca120b": "updateAnimalSpecial(uint256,bool)", +"1acb2719": "getNextRequest(address,address)", +"1acb7077": "setCentsPerToken(uint256)", +"1acbf6e0": "alfatokenFee()", +"1acc26bc": "disableLimit()", +"1acc478a": "getContentMetrics(address,address,bytes32)", +"1acc57b8": "AGENCY_TOKEN_CAP()", +"1acd8237": "LEK(string,string,uint256,uint8)", +"1ace02a3": "RaptorsvsWizards425()", +"1ace4d05": "bigAmount()", +"1ace88a4": "realWorldPlayerTokenForPlayerTokenId(uint32)", +"1acf6485": "requestWithdrawalFromLimit(uint256,string)", +"1acfd02a": "changeAdmin(address,address)", +"1ad065f1": "prepare(uint256,address,address,uint256)", +"1ad11fd1": "TrieToken()", +"1ad2ad1a": "stopPresale()", +"1ad50586": "safePower(uint256,uint256)", +"1ad509f0": "MUIcoin()", +"1ad6037f": "LEXInContract()", +"1ad607da": "_addUserCity(address,uint256)", +"1ad614c3": "setRequireAuthorisation(bool)", +"1ad66d21": "earlyPurchasesLoaded()", +"1ad781b4": "PennyGrab()", +"1ad7c199": "callVote()", +"1ad874b4": "presaleOn()", +"1ad8f65b": "distribute_for_founders()", +"1ad8fde6": "changeSymbol(bytes32)", +"1ad95744": "START_ICO()", +"1ad9f190": "getUserHotGoldBalance(string)", +"1ada70a8": "lockupDuration()", +"1adadda8": "claimLockedTokens(address)", +"1adb4842": "setLockup_jishis(address,uint256,uint256)", +"1adb631b": "distributePuppyCoinMedium(address[])", +"1adbdfab": "SimpleApproveTransfer(address)", +"1adc36b9": "doesUserOwnCeleb(address,uint256)", +"1add4f5a": "tranferMoneyToName(bytes32)", +"1add5486": "Multiownable()", +"1add6bcf": "getDoubleKeccak256(uint256)", +"1adda83a": "calculateTokens(address,uint256,uint256)", +"1adf2bec": "CancelOrder()", +"1adf2d1a": "Offer(address,address,bytes,uint256,uint256,uint128,uint256)", +"1adf42fb": "setPreICO(bool)", +"1adf692f": "_changeSquarePrice(uint8,uint256)", +"1ae0a693": "SetApplicant(bytes32[])", +"1ae0b4d0": "master5invest()", +"1ae0c787": "getControlInfoMaxTotalImbalanceList()", +"1ae2379c": "excess()", +"1ae32b82": "disallowReceiver(address)", +"1ae3a94a": "devFeeRate()", +"1ae3d8d0": "protectedBalance(address,address)", +"1ae460e5": "isInPool()", +"1ae4dfb7": "getcardPrice(uint256)", +"1ae638f7": "times6()", +"1ae6b6ee": "cancelAuctionWhenPaused(address,uint256)", +"1ae6c09c": "showMyAnimalBalance()", +"1ae6d375": "AirSwapToken(address,address,uint256)", +"1ae7341f": "OneledgerToken()", +"1ae743ad": "withdraw_token_and_eth()", +"1ae7b7fb": "jackpotSmall()", +"1ae7b8e1": "newOffer(address,string)", +"1ae7ef0a": "QISHENG(uint256,string,string)", +"1ae8494e": "purchaseTopCompany(bytes32,bool)", +"1ae879e8": "walletOwner()", +"1ae8ab81": "setNickname(bytes32)", +"1ae8fc87": "addContract(address,address,uint256,string)", +"1ae97bd9": "updateName(bytes32)", +"1ae9fe6a": "cutOffBidID()", +"1aea4d0f": "setMaxSend(uint256)", +"1aea558a": "auditReport(address,uint256,uint256)", +"1aeb10a6": "testApprove()", +"1aebb44e": "firstBlockAllowedToMonitor(uint256,uint256,address,address,address,address)", +"1aebcb89": "getProfitPerShare()", +"1aec2cf9": "Subscribe(address)", +"1aeca515": "getTierIndex()", +"1aece0db": "PRE_SALE_END_TIME()", +"1aed001e": "_miningOneSelf(address)", +"1aed8e1e": "GigERC20(uint256,string,uint8,string,bool,bool)", +"1aedefda": "includes(address)", +"1aedf542": "ercOwnerClaim()", +"1aee3f91": "PRESALE_LIMIT()", +"1aef8058": "DECIMAL_MULTIPLIER()", +"1aefce3b": "ratioVote(bool,uint8)", +"1af11767": "CauldronsMinigamePresale(uint32,address)", +"1af217ab": "maxTokenPurchase(address)", +"1af26fc2": "isJobExpired(bytes)", +"1af2c9fd": "numberOfInvestors()", +"1af31d7b": "GetPoolEntranceFee(string)", +"1af32223": "get_owner(bytes32)", +"1af36a78": "level1(address,bytes32,uint256)", +"1af39907": "_inMoney(uint256,address)", +"1af476a6": "setEggTotal(uint8,uint256)", +"1af47cc7": "addSellTokensRequest(string,uint256,uint256)", +"1af48c85": "checkCertificates(uint256)", +"1af50c5e": "setDisbursementAmount(uint256)", +"1af5163f": "TokenBurned(address,uint256)", +"1af5205c": "period3Numerator()", +"1af526b0": "getSell()", +"1af5dd41": "balanceOfComision(address)", +"1af62808": "getLicensePrice()", +"1af6b60f": "ScamSealToken()", +"1af716ba": "transferFrom(address,address,uint256,string)", +"1af77842": "setE93ContractAddress(address)", +"1af82fbf": "viewDividendCooldown()", +"1af855f8": "Funding(address,uint256)", +"1af88bc1": "GetPatientFromAddress(address)", +"1af8c18a": "InitBalanceFrom961e593b36920a767dad75f9fda07723231d9b77(address,uint256)", +"1af97fb7": "getBabyGen(uint16,uint16)", +"1afa6542": "AirCoin(uint256,string,uint8,string)", +"1afaa8bf": "crowdfundPercentOfTotal()", +"1afc540d": "set_saleAddress(address)", +"1afcc95b": "getCCH_edit_21()", +"1afccfa5": "Proposal(address,address,address,bytes,bool)", +"1afd08a2": "setConfirmationTime(uint256,uint256)", +"1afd96dc": "withdrawForThreeYear()", +"1afe3e10": "getCurrentPhaseDivisor()", +"1afe56aa": "markRead(uint256)", +"1aff30dd": "getGameStats()", +"1affa814": "getProviderPriv(uint256)", +"1affcd7e": "createCollectible(uint256,address,uint256,uint256)", +"1b005a38": "authorizerOne()", +"1b00fe51": "testHypothesis()", +"1b011bd9": "test_insert_findWithHint()", +"1b027b44": "getBuyPosition(bytes32,uint256)", +"1b03316f": "getSecond()", +"1b044be7": "setFundScheme(uint256,uint256)", +"1b04803e": "contractModifierAddress()", +"1b04a435": "durationSecondsIco()", +"1b0569b2": "IPToken()", +"1b059c0a": "JoinRound()", +"1b05aeb5": "WinMatrix()", +"1b05c594": "newGame(uint256,uint256)", +"1b05ea8c": "CheckPrepare()", +"1b06128b": "burnLeftoverTokens(uint8)", +"1b06ec3b": "getAllTransactionIdsByEntityId(address)", +"1b0710b5": "TOZToken()", +"1b073c67": "XGEToken()", +"1b0762bb": "remunerationBalance()", +"1b076edc": "dataSource()", +"1b07fcc1": "linkImpact(string)", +"1b082009": "getCrowdsaleBalance()", +"1b088f70": "computeLeaf(uint256)", +"1b08d96f": "ret()", +"1b0a102c": "getPrediction(uint256,uint256)", +"1b0a5d4e": "totalPartnerSupply()", +"1b0a68f2": "decreaseMintApproval(address,uint256)", +"1b0b906b": "getMyPlayedAmount(address)", +"1b0ba14d": "InvestmentFailed()", +"1b0c72dc": "isRecipientActive(address,address)", +"1b0cb61f": "_whitelistAddress(address)", +"1b0d320f": "FriendsCoin()", +"1b0db7fe": "getAllValuesSum(uint256[])", +"1b0dbdaf": "manualReserve(address,uint256)", +"1b0dc452": "isAnOwner(address)", +"1b0e25e2": "onInitialized()", +"1b0e3061": "BCW(uint256,string,string)", +"1b0eaf78": "stop_or_resume_Contract(bool)", +"1b0f5395": "ChargeNetwork()", +"1b0f7ba9": "proxy(address,uint8,bytes)", +"1b0fa385": "transfeFrom(address,address,uint256)", +"1b0fc106": "acceptChallenge(uint256)", +"1b107f7b": "storeUnlockData(uint256,address,address,uint256,bytes32)", +"1b112541": "getPTicketSumByRound(uint256,address)", +"1b118984": "TOKEN_ICO1_LIMIT()", +"1b12b60f": "canBuyTokens(uint256)", +"1b130063": "sendPrize(address,uint256,string)", +"1b131bbd": "_split(uint256)", +"1b136c6f": "getPlayerRounds(uint256)", +"1b13756a": "getFirstBorrowAgreement(address,address)", +"1b14cd05": "verifyLockSignature(bytes32,uint256,address,address,uint256,uint256,bytes32,bytes)", +"1b1665ca": "updateLimitPerMonth(bytes32,uint256)", +"1b1686b6": "currentEthInvested()", +"1b17595f": "registerTrack(bytes32,uint256,bytes32,bytes32,bytes32)", +"1b181e58": "getOverTokens()", +"1b189efb": "EURsToken()", +"1b18f952": "test01()", +"1b18ffac": "random(uint256,int256,int256)", +"1b195a7c": "buildAddition(uint256)", +"1b19f6a3": "removeReferrer(bytes32)", +"1b1a7a58": "multiSendToken()", +"1b1b6069": "initEachPUST()", +"1b1c15d5": "tokensForInvestors()", +"1b1c6acf": "getUintField3()", +"1b1ccc47": "getDSTName()", +"1b1d6af8": "_PLUTOToken()", +"1b1d95ff": "getPow(uint256)", +"1b1da1af": "updateSharePrice(uint256,uint256)", +"1b1e5d5d": "rejectMany(address[])", +"1b1ef88d": "authorizedByUser(address,address)", +"1b1f2fb8": "preTGE()", +"1b1fe68a": "SOLO_MARGIN()", +"1b203b9d": "checkAndCloseRound(bool)", +"1b2051f6": "tempTokensPeriodOf(address)", +"1b208786": "delegatedTransfer(address,address,uint256,uint256)", +"1b2212f5": "forbidDirectDebit()", +"1b23cfd2": "AceguyToken()", +"1b258d50": "withdraw(bytes32,address)", +"1b25d0e6": "POST_ICO()", +"1b26fa6a": "priceStep1()", +"1b27274b": "testPure()", +"1b27c873": "advisorsTokensFirstReleaseTime()", +"1b27c8f2": "takeBountyTokens()", +"1b27ca21": "MonthsProfit()", +"1b27e705": "_forwardFunds(uint256)", +"1b28591c": "escapeFunds(address,uint256)", +"1b28985e": "MotorToken()", +"1b29d70a": "weiRefund()", +"1b2a8715": "notIn(bytes32[],bytes32)", +"1b2ace9d": "lockedProvider(address)", +"1b2ae899": "removeModule(uint8,uint8)", +"1b2ae964": "BuyPriceChanged(uint256)", +"1b2bd803": "issueAtIco(address,uint256,uint256)", +"1b2be5f8": "transferredAtSupplyValue(address)", +"1b2bf378": "BLM()", +"1b2d26e9": "OwOWorldToken()", +"1b2d515f": "setA(bytes32)", +"1b2d93a0": "load(address,bool,address,address,address,address,address)", +"1b2dba8c": "setCertifierId(address,string)", +"1b2e4002": "LIZAToken(string,string,uint8,uint256)", +"1b2f1109": "sntController()", +"1b302a16": "tokenUnpause()", +"1b31abda": "getGameDetails(uint256)", +"1b31c5c2": "RESERVED_TOKENS_OPERATIONAL_EXPENSES()", +"1b328100": "valueToBeSent()", +"1b33157a": "buyTickets(uint256[],uint256,bytes)", +"1b338905": "getActualDates()", +"1b33a497": "tranferToReserve()", +"1b33d412": "offer(uint256,address,uint256,address,uint256)", +"1b346a63": "testMoveWithTrust()", +"1b34737f": "setSCoinContractAddress(address,address)", +"1b347aae": "retrieveToken()", +"1b354a30": "kscIncreaseApproval(address,uint256,string)", +"1b357750": "setLegacyNFTAddress(address)", +"1b35f56f": "getCurrentlyRunningPhase()", +"1b360912": "transferTokensFromPartnersAddress(address,uint256)", +"1b369fad": "removeBlockListed(address)", +"1b36cbfc": "EtheremonDataEvent(address)", +"1b370abb": "getPreviousNode(bytes)", +"1b37cb3e": "VOCOToken()", +"1b3821e8": "addSentMessage(address,address,uint256)", +"1b385f34": "buyOmegaEgg()", +"1b3878f5": "addToEmployerTotalPaid(address,address,uint256)", +"1b391d09": "benefeciar()", +"1b393b9a": "emergencyRelease()", +"1b394dce": "_chkBuyerLmts(address,uint256)", +"1b397d79": "OurBank(address,address)", +"1b39f3d7": "timeset()", +"1b3a8e6f": "directionCount(int256,int256,int256,int256)", +"1b3a91ac": "addTiers(uint16,uint256[],uint256[])", +"1b3aaf06": "setRspTokenAddress(address)", +"1b3b5742": "PayJackpot()", +"1b3c72aa": "getAddressLevel()", +"1b3ca096": "MarketBase()", +"1b3d36de": "calculateToken(uint256)", +"1b3d803f": "TokenRegulatorService()", +"1b3e100d": "PRE_ICO_PRICE()", +"1b3e2002": "giftRock(uint256,address)", +"1b3e704a": "supplyICO(address)", +"1b3e8cda": "isEthPayable()", +"1b3ed722": "multiplier()", +"1b3efd15": "claimrefund(address)", +"1b3f2fd3": "checkAvailableTokens(address)", +"1b3f8a67": "addToSyncList(address)", +"1b3fddb8": "PRESALE_BONUS()", +"1b3ff96f": "getForecastCount(uint256,uint256,bool)", +"1b4032f5": "lastBlock_f7Hash_uint256()", +"1b40ee88": "sellArtwork(uint32)", +"1b411fc8": "createRound()", +"1b413d27": "getLuck()", +"1b414708": "hasDisclosureAgreement(uint256)", +"1b418207": "toUint64Throw()", +"1b41c096": "setStartsAtUTC(uint256)", +"1b41c134": "UsernameDoesNotMatch(bytes32,bytes32)", +"1b426d8d": "LOG_ProofFailure(bytes32,address)", +"1b42b7ab": "decreaseSalesBalance(address,uint256)", +"1b42f904": "LogFreezerAddition(address,uint256)", +"1b437d0c": "compareLastCalldata(bytes)", +"1b44a5ef": "handleSingleItem(address,uint256,uint256,uint256,uint256)", +"1b44f449": "Chain3()", +"1b45c301": "assetManager(bytes32)", +"1b4646bf": "setReferalsMinInvestLimit(uint256)", +"1b464764": "withdrawAdvisor(address,uint256)", +"1b468ed8": "addHandlerToWhitelist(address)", +"1b476945": "devTokensIco1()", +"1b477633": "determinePlayer(bytes32[],bytes32[],int256[],uint8,bytes32,bytes32)", +"1b47dbbe": "IdentityVerifier(address)", +"1b482452": "getWinnerUrl(uint256)", +"1b49d82b": "joinClub(address)", +"1b4a2001": "minReserve()", +"1b4a93aa": "SetupFuseaNetwork(string,string,uint256,uint256,uint256,address,address)", +"1b4b1cfa": "isICOPeriod()", +"1b4b546f": "ChooseA()", +"1b4c19ac": "startSale(uint256,uint256,uint256,address,uint256,uint256)", +"1b4c5a10": "SupportFund()", +"1b4c84d2": "isTradeable()", +"1b4cd2de": "ICO_START_TIME()", +"1b4cd4ef": "depositPAXTR(uint256)", +"1b4d02c2": "cryptoAgent()", +"1b4d18c1": "rateOfSpecificTranche(uint256)", +"1b4e1c4d": "increaseProductAvailability(uint256,uint256)", +"1b4f4285": "notifyNewAccount(address,address)", +"1b4f6c46": "acceptOwnership(bytes32)", +"1b4fa639": "ownerFinishContract()", +"1b4fa6ab": "getDefaultStackCheck()", +"1b503a09": "LogRmUser(address)", +"1b50ad09": "updateDuration(uint256)", +"1b5171f0": "BountyKilled(uint256,address)", +"1b517663": "mintPriceOffset()", +"1b520b68": "lethalBonusAtHitsLead(uint256)", +"1b52abde": "redeemRestore(address,uint256)", +"1b531d4b": "settings_added()", +"1b538bcc": "getCurrentVotes(uint256)", +"1b542aa7": "Swob()", +"1b55ba3a": "Start()", +"1b55c148": "BidPlaced(bytes32,uint8,address,uint256,bool,int32)", +"1b55ec45": "getTokenToBurn()", +"1b55fe4e": "setFourthAddressBalance(address)", +"1b561fe7": "getSeniorContract()", +"1b5631de": "ManualChangeStartDate(uint256,uint256)", +"1b5710ed": "_deleteAllPackedRevisionTimestamps(bytes32)", +"1b580620": "setOwner1(address)", +"1b58c88f": "restoreOwner(address)", +"1b58c943": "getNBallots()", +"1b5a8da6": "giveEthBankrollAddress()", +"1b5ac4b5": "abs(int256)", +"1b5ae2f7": "day0x1(address,address)", +"1b5c16bf": "setTargetRepMarketCapInAttoeth(uint256)", +"1b5c9ae3": "get_etc_balance(address)", +"1b5df453": "addUserWhoSell(address,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"1b5e42f5": "amountOfUnitsOutsideAdminWallet()", +"1b5e75be": "evalParams(bytes32,address,address,bytes32,uint256[])", +"1b5ee6ae": "mintToken(int256,address,uint256)", +"1b5f03a6": "getRoute(string)", +"1b5f6cea": "P3DtoTokens_(uint256)", +"1b61a179": "mulbonus()", +"1b61f340": "finishADrop()", +"1b6282e3": "issuerDelegate()", +"1b64b172": "core(uint256,address)", +"1b65144d": "burnTokensForSale()", +"1b6527b4": "GetAssignedAddress(uint256)", +"1b655054": "dataAddress()", +"1b660f15": "EthIdentity(bytes32)", +"1b66303d": "request(bytes32,uint256,uint8)", +"1b66cb00": "setTargetToken(address)", +"1b672154": "setMEAAttributes(uint256,uint256)", +"1b677b08": "total_snt_claimed()", +"1b67ab2b": "StreamNetworkToken()", +"1b68039c": "bitcoinblack()", +"1b688565": "PUBLIC_RESERVED_PERSENTAGE()", +"1b697bb2": "setBuyerAddress(address)", +"1b6aa580": "developer_new_address_for_funds(address)", +"1b6ad60a": "transferFromWithReserving(address,address,uint256)", +"1b6aed05": "grant_token_from_offchain(address,uint256,string)", +"1b6b405c": "UnableToAcceptPayment(address,bytes8,uint256)", +"1b6b6d23": "LINK()", +"1b6b8656": "setBureau(address,address,address)", +"1b6bb739": "getThreeLastInvestors()", +"1b6bc433": "addMemberAcct(address)", +"1b6c104e": "marketingAllocationTokenSend(address,uint256)", +"1b6caad9": "setPersonaAttributes(bytes)", +"1b6e37ee": "thirdWeekBonusInWeek()", +"1b6e66aa": "rescueInvestor(address,uint256)", +"1b7035ea": "getAccountStatus()", +"1b709561": "UnlockCredits(address,uint256)", +"1b70a2e1": "TerpCoin()", +"1b72194f": "getUserDivs(address,uint256)", +"1b72410b": "EladCrowdsale()", +"1b728ed4": "getAssetRawMeta(uint256)", +"1b748399": "TeamCoin()", +"1b753dad": "Mithril()", +"1b75738a": "enable(address[])", +"1b760719": "addMember(address,string,uint256)", +"1b7623be": "payInterest(address,uint256)", +"1b76929c": "getActiveGames()", +"1b769e74": "testThrowsRestartNotUpdatable()", +"1b76dd7c": "disapprove(uint256,string)", +"1b773df1": "withdrawAll(string,uint256)", +"1b775638": "ContributionReceived(address,bool,uint8,uint256,uint256)", +"1b776808": "_updatePixelMapping(address,uint256,uint256,uint256,bytes32,bytes32)", +"1b78240f": "Fixie()", +"1b78e3c4": "processHunting(uint256,uint256,uint256[])", +"1b7949e2": "supply_increased()", +"1b79a2f3": "lastStageSubmitted()", +"1b79d406": "getWhoPiad(uint256,address,address,address,address,address,address,address)", +"1b7aad1b": "AMOUNT_TOKENS_FOR_SELL()", +"1b7b7b0d": "latiumBalance()", +"1b7b7c3d": "Partnership(address[],uint256)", +"1b7bbecb": "challengeExists(bytes32)", +"1b7be47e": "STQToken(address[])", +"1b7c058e": "getLicensePrice(address)", +"1b7ccc3d": "_registerLockedDeposits(bytes32,uint256,uint256)", +"1b7ce6f3": "disableTokens(uint256[])", +"1b7cf899": "recentActivity(uint256)", +"1b7d5f8c": "release18m()", +"1b7d83e5": "addDefaultOperator(address)", +"1b7d8aaf": "End8()", +"1b7db340": "sysAdmin()", +"1b7e0902": "getcardOwner(uint256)", +"1b7e78f6": "updateFirstChangeBlock(uint256)", +"1b7f00c1": "purchaseBundle(uint8,string)", +"1b800a3d": "watchPreferersTasks(address,uint256)", +"1b814f02": "splitFunds()", +"1b8202a7": "LegalContractManager()", +"1b825e89": "detachmentTime()", +"1b82f68f": "kingdomFactory()", +"1b83b823": "notifyPlayer(uint256)", +"1b841fea": "nextDerivativeTokenTime()", +"1b848606": "blacklistEscapeToken(address)", +"1b84e72d": "_createEscrow(address,address,uint256,uint256)", +"1b851e10": "LogDeposit(address,uint256)", +"1b855044": "getHash(uint256,uint256)", +"1b85aa49": "MIN_INVEST()", +"1b862027": "save(uint256)", +"1b8689b6": "getInvestorTokensPurchasesLength(address)", +"1b878f71": "setUpgrader(address)", +"1b87945e": "buyPointer(bytes32,bytes1[64])", +"1b87ccae": "getAssetIdItemType(uint256)", +"1b87d58a": "bonusMin()", +"1b88094d": "getRecipient()", +"1b880bcf": "KareToken()", +"1b89ee31": "closeBridge()", +"1b8a0b46": "WowDiaondToken(address)", +"1b8a9031": "BetPlaced(uint256,address,uint256,uint256)", +"1b8ab64d": "testTodo()", +"1b8b13a7": "getRewardPool()", +"1b8b3605": "setInvestorList(address)", +"1b8b4787": "TOKEN_SALE2()", +"1b8b921d": "call(address,bytes)", +"1b8bd57c": "getCardInfo(uint32)", +"1b8beafe": "BLOCK_DURATION()", +"1b8ca217": "getProperties(uint256)", +"1b8d0e60": "getMyBanker()", +"1b8db774": "_deadline()", +"1b8de48c": "distributeTCASH(address[])", +"1b8e61c7": "setEndTimePreIco(uint256)", +"1b8e94a1": "Rate()", +"1b8ef0bb": "getRemainingCapacity(uint256)", +"1b8f2610": "quickCloseChannel(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)", +"1b8f3d23": "krakenTicker()", +"1b8f5d50": "multi()", +"1b8f66a4": "watchedURL(string,string)", +"1b8fc2f0": "setAllowedAddress(address)", +"1b8fc6e4": "marketorsTotalBalance()", +"1b900c27": "anotherOwner1()", +"1b924b7e": "enableInterface(string,address)", +"1b9265b8": "pay()", +"1b929940": "pushIntArray(bytes32,int256)", +"1b92bbbe": "maxDrawingTime()", +"1b92ce6b": "WOCC()", +"1b93aa8d": "getPackage()", +"1b93f66d": "claimedAirdrop(address)", +"1b9414ae": "itemBid(uint256)", +"1b94198d": "sellingAccepted()", +"1b94413f": "transferEth(bytes32,address,uint256)", +"1b949f85": "lockContractOwner()", +"1b953909": "authorizeOperatorTranche(bytes32,address)", +"1b955df4": "changeRefund(uint8,uint256,uint8)", +"1b962c65": "decodeCurrency(bytes32)", +"1b963742": "AwesomeToken()", +"1b968160": "wipeAndFree(address,bytes32,uint256,uint256,address)", +"1b96b2f9": "masterMint(address,uint256)", +"1b97429d": "EthToUsdChanged(address,uint256,uint256)", +"1b981d7f": "packedToSubmissionBits(uint256)", +"1b987c41": "retrieveExternalTokens(address,address)", +"1b98c54f": "getProviderCurveLength(address,bytes32,int256)", +"1b98cd68": "updateAffiliate(address,uint8)", +"1b98f6ac": "setProviders(address[])", +"1b9900b8": "userRollDice(uint256)", +"1b995aa7": "BitCompare(uint256,uint256)", +"1b998dac": "updateMCs()", +"1b9a91a4": "withdrawEth(address,uint256)", +"1b9b0b23": "KruhftsToken()", +"1b9bfa3a": "_oldOwnersOf(uint256)", +"1b9c7f31": "Werbecoin()", +"1b9cbdfb": "priceOfToken()", +"1b9ceef1": "purchaseTokenInPublicSale()", +"1b9d1bed": "setPOOL_edit_18(string)", +"1b9d4c8e": "setBudget(address,address,uint256)", +"1b9db2ef": "getParticipant(uint256)", +"1b9dbcaf": "kittensIssued()", +"1b9e16ad": "getAccountInfo()", +"1b9e9a27": "createComponent(string)", +"1b9f9647": "accessMyWallet(address)", +"1b9fec58": "getBlockToHashForResults(uint256)", +"1ba1648a": "changeTokensOwner()", +"1ba1f10b": "updateTaxPercentages(uint256,uint256)", +"1ba22084": "ecadd(uint256[3],uint256[3])", +"1ba23f1e": "setAllowedMultivest(address,address)", +"1ba326c4": "calcShare(uint256,uint256,uint256)", +"1ba39a4c": "calcMult(uint256,bool)", +"1ba3afd3": "getLocalGame(uint16)", +"1ba46cfd": "assetAddress()", +"1ba527d6": "gkAddress()", +"1ba54100": "distributeEbyteForEBYTE(address[],address,uint256,uint256)", +"1ba5b3e8": "currentTotalAirdrop()", +"1ba5e63f": "tournamentQueueSize()", +"1ba5eec0": "nextTurn()", +"1ba60f9b": "availableDgxNg()", +"1ba6e1bd": "externalPurchase(address,string,string,uint256,uint256,uint256)", +"1ba7013b": "distributedBountyTotal()", +"1ba83c3c": "ChargingGas(uint256)", +"1ba88666": "isBiometricLockedOnlyOwner(address)", +"1ba8ef21": "electrolightTestnet()", +"1ba9146e": "PethToken(uint256,string,string,uint256)", +"1ba91c20": "foundationMultisig()", +"1ba9998b": "advanceRound()", +"1baaeb91": "getSignature(bytes4,uint256)", +"1bab0908": "hasValidParam(address,uint64,uint64,uint64,uint64,uint64,uint64)", +"1bab8148": "fulfillMintRequest(uint256,string)", +"1bacbf4e": "secureTransfer(uint256)", +"1bacfd66": "Vote(address,bytes)", +"1bad1d2e": "monitorWallet(address)", +"1bad3903": "stakeWithCurrentPeriod(uint256)", +"1bad5558": "withdraw3(address)", +"1bad9e8f": "getUserTokenInfos(address,uint256)", +"1bada3c0": "closeKYC()", +"1badbd5c": "increaseAssuranvePayments(address,uint256)", +"1badfbae": "setWhitelistBallot(address,bool)", +"1baf1494": "QToken(address,uint256)", +"1baf7122": "custodyStorage()", +"1baf823f": "NewUsername(address,string)", +"1bafc373": "confirmNewHash(uint256)", +"1baffe38": "withdrawEtherTo(address,uint256)", +"1bb00447": "CryptonomicaVerification()", +"1bb02ffb": "MWAV()", +"1bb0b762": "A2ABToken()", +"1bb0c665": "toHexString(address)", +"1bb1151a": "Error(uint64)", +"1bb1bf2e": "team1Query()", +"1bb2921b": "getProjectedPayout(uint16)", +"1bb3fb67": "operatorSendTranche(bytes32,address,address,uint256,bytes,bytes)", +"1bb4067b": "checkPoolDone(uint256)", +"1bb409c4": "QueryBonus()", +"1bb460cc": "ContributionReceived(address,uint256)", +"1bb47b44": "appendVestingEntry(address,uint256,uint256)", +"1bb534ba": "fundingRecipient()", +"1bb58beb": "RECToken(uint256,string,uint8,string)", +"1bb5f0a2": "registerBarcode(bytes9,string,string,string,string,string,string)", +"1bb63d0c": "Nova()", +"1bb6cb47": "getPlayer2()", +"1bb73a2a": "batchCreateAuthorDrawings()", +"1bb797da": "isIcoStage()", +"1bb7c3c2": "UpdatedDonationAddress(address)", +"1bb7cc99": "WHITELIST()", +"1bb8365f": "calculateGoldBuy(uint256,uint256)", +"1bb96dff": "AuctionStarted(uint256)", +"1bbb4f63": "LogMoneyline(int256,int256)", +"1bbb696a": "swapContracts(address)", +"1bbb9a99": "claimEthers(uint256)", +"1bbc4b83": "ERC20Interface()", +"1bbc7952": "getPropertySalePrice(uint16)", +"1bbc99c6": "UpdateDividendPartners(address[],uint256[])", +"1bbce9a2": "bidState(bytes32)", +"1bbe1813": "getTotalSpecials()", +"1bbe2ff3": "TransferEtherInitiationEvent(uint256,address,address,uint256)", +"1bbe9d8c": "addFunder(address)", +"1bbec4e7": "coldWallet2()", +"1bbef399": "isVoting()", +"1bbfb029": "addTx(address,address,uint256,string)", +"1bbfce0e": "bidOnBreedingAuctionTutorial(uint40)", +"1bbfdaaf": "selectElf(uint8,uint16)", +"1bc0585f": "stopTokenSale()", +"1bc08834": "stsc()", +"1bc125f3": "finishMintingSTO()", +"1bc2b813": "divUInt(uint256,uint256)", +"1bc2dd5a": "doesContractExist(address,address)", +"1bc390dd": "reconfig(string,string)", +"1bc3c855": "setWhiteListERC223(address)", +"1bc41284": "uncleRate()", +"1bc44200": "Dasabi_ioToken()", +"1bc44213": "MAX_BID_FRAC_BOT()", +"1bc4c81b": "QuizQuestion()", +"1bc4cdb9": "ReceiveFund(address,uint256)", +"1bc4d6b2": "XXXXToken()", +"1bc50b05": "canUpdateNextGamePotSplit()", +"1bc59aa6": "bountyAllocated()", +"1bc5ee1a": "transfer_eth_to_contract()", +"1bc84458": "getAddOnSupport(uint16)", +"1bca179b": "RentedBlock(uint256,uint256,uint256,uint256,address)", +"1bca5689": "havvensReceivedForEther(uint256)", +"1bca7d6d": "NigelFundSum()", +"1bca989e": "setTokenInfoMaxPerBlockImbalanceList(uint256[])", +"1bcad37a": "getTotalCost()", +"1bcb6fa2": "snapshotValidators(uint256)", +"1bcbce52": "isEarlyInvestorsTokenRaised(uint256)", +"1bcc9b1a": "TruPreSale(uint256,uint256,address,address)", +"1bcd57c7": "ContributionAmount()", +"1bcdb8e0": "responder(uint256,uint256,uint256,bytes5,bytes14,bytes5,uint256,uint256,uint256,uint256,uint256,uint256)", +"1bcdd57d": "writeNextId(uint256)", +"1bce6ff3": "begin()", +"1bceeaa7": "resell(address,string)", +"1bcf468b": "costOfToken()", +"1bcf5241": "countCliTasks()", +"1bcf5758": "getOccupies(uint8)", +"1bcf659d": "getMinTalent(uint256)", +"1bd0c431": "updateETH()", +"1bd13df1": "GetSummFee(uint256)", +"1bd16dbf": "preSaleDuration()", +"1bd2511a": "addEarlyAccessAddress(address,address)", +"1bd27296": "_fetchCancelledOrdersForMerchant(address)", +"1bd2b37c": "isMasterRecruitment()", +"1bd2c21c": "playBigger(uint256[])", +"1bd2d4cc": "getNextIndex(uint8)", +"1bd3553e": "TheTokenA()", +"1bd5363c": "getBPaddress()", +"1bd5d127": "NaviToken()", +"1bd60ae9": "buyerBalance(address)", +"1bd61eee": "updateHeartBeat()", +"1bd6f596": "right56(uint256)", +"1bd6fb9f": "LockedFunds(address,uint256)", +"1bd72647": "round0Target()", +"1bd8b041": "PRICE_INCREASE_SCALE()", +"1bd8f9ca": "challengeFee()", +"1bd95155": "stringToUint(string)", +"1bd983a4": "PlaceSellOrder(uint256,uint256)", +"1bd9a7e7": "LogNewWhitelistUser(address,uint256)", +"1bd9c46e": "setImporter()", +"1bda6d55": "publicSaleSoldTokens()", +"1bda84b3": "getOfferIdsByToken(address)", +"1bda8781": "Taouaf(uint256,string,uint8,string)", +"1bdb3f65": "ZoomToken()", +"1bdbabdd": "registerProduct(uint256,bytes32,bytes32,uint256,uint256)", +"1bdbce49": "setWhitelist(address,address,bool)", +"1bdc4038": "_updatePurchasingState(address,uint256)", +"1bdd193a": "placeStar(uint8,uint8,uint16,uint256)", +"1bddcf48": "_asyncTransfer(address,uint256)", +"1bde9998": "getWhitelistStatus(address,bytes32,address)", +"1bde9bc1": "rebatelvlEconomy(string,string,string,string,string)", +"1be05289": "DURATION()", +"1be0717f": "_reward()", +"1be0f1ad": "getSpinOutput(uint256,uint256,uint256,address)", +"1be0f793": "USDExchange(address)", +"1be16003": "Answer()", +"1be1bf7f": "TessrX()", +"1be20ca1": "TokenCAP()", +"1be22528": "TechnicalRise()", +"1be3175e": "mortgage(uint256)", +"1be35b0c": "statusOperation()", +"1be4aaa1": "getTokenInfoHeritor(address,address)", +"1be4da5b": "MateriaPrima()", +"1be64997": "BucketCreated(bytes32,uint256,uint64)", +"1be6ce57": "decreaseOwnershipTokenCount(address)", +"1be6dd64": "points()", +"1be70510": "acceptAdoptionOffer(bytes5)", +"1be73e2b": "_fhMoney(uint256,uint256,uint256,uint256,uint256,uint256)", +"1be7c5ef": "fullfillFounder()", +"1be863bf": "PushData()", +"1be88614": "onetimeLaunch(uint256)", +"1be8dbfd": "dsMul(uint256,uint256)", +"1bea4a61": "getObjIndex(uint64)", +"1bea67b7": "BFDToken()", +"1bea69e3": "isAdmin(address,string)", +"1bea8006": "tokenBalanceOf(address,address)", +"1beafada": "PROMETHEUS_PRICE_THRESHOLD()", +"1beb2615": "destruct(address)", +"1beb375d": "proxyManagementAddress()", +"1beb4b5e": "fetchAllVoteResultBySnapshotBlock(uint256)", +"1bebf13c": "sendOrderEvent(address,uint256,uint256,uint256,address,uint256)", +"1bef9059": "ProtocolToken()", +"1befcbaf": "buyRareEgg(uint8,uint256,address)", +"1befd26a": "setDesignatedReporterWasCorrect(bool)", +"1bf028b1": "OddMoney(address,uint256)", +"1bf049b9": "Prediction(uint24,uint24,bool)", +"1bf0635b": "setGoldFeeAddress(address)", +"1bf1de9b": "COMMISSION_PERCENTAGE()", +"1bf20668": "testAdminTransfer()", +"1bf219de": "Faucet(uint256,address)", +"1bf2a90a": "totalPostIcoContributorIdsAllocated()", +"1bf38b28": "addAccessor(address,address,uint8,address,string,uint32,string,string,bytes32,bytes32,uint8)", +"1bf426ba": "Spendelotto()", +"1bf498b6": "registAgent(address)", +"1bf57f41": "salesAddress(address)", +"1bf5b38a": "finalizeDonation(address)", +"1bf5f736": "endOfDay()", +"1bf651ff": "YBHY()", +"1bf678cf": "setOtherNTech3D(address)", +"1bf6ba7e": "_transferFromOwner(address,uint256)", +"1bf6c21b": "USD()", +"1bf6e00d": "frozenOf(address)", +"1bf6e939": "accManager()", +"1bf703b2": "addCategory(string,string)", +"1bf7628b": "firstHolder()", +"1bf7d749": "curves(uint256)", +"1bf831cf": "initialOperatorValue(address)", +"1bf8c094": "setOwnedToken(address,uint256,uint256)", +"1bf983a6": "getTokenInfoMaxTotalImbalanceList()", +"1bf9b325": "deletePublicKey(address)", +"1bf9b387": "setIcoRate(uint256)", +"1bf9def0": "Transferable()", +"1bfa5d8a": "hash_pubkey_to_pubkey(uint256,uint256)", +"1bfa90bf": "getIntField1()", +"1bfaf155": "foundersWallet()", +"1bfb7245": "tToken(address,uint256)", +"1bfba595": "incrementTotalIssuerCount()", +"1bfc596b": "presaleBonusAddressColdStorage()", +"1bfc8bd1": "setRequestIdToMultiRequestId(uint256,uint256)", +"1bfce853": "vestedAmount(uint256)", +"1bfd4858": "hash_db(bytes32)", +"1bfd6814": "TRANSFERABLE()", +"1bfe0308": "removeRole(address,string)", +"1bfe3508": "triggerRecoveryAddressChange(address)", +"1bfe7831": "AllLockAccounts(uint256)", +"1bfe783e": "MaxDropReward()", +"1bfea87f": "by(bytes32)", +"1bff4786": "etherDeltaInfo()", +"1bff4bfa": "beneficiaryTwo()", +"1bff4c07": "LukaCoin()", +"1c0019c4": "getCostForTrait(uint8)", +"1c014c60": "casinoBalance()", +"1c0183e3": "TweedentityRegistry()", +"1c02708d": "killContract()", +"1c02a63d": "SetEcosystemContract()", +"1c0463de": "isUpgradeAllowed()", +"1c05123d": "LicenseIssuer(string,string,string,uint256,uint256,address)", +"1c054b14": "bonusRangeCount()", +"1c057493": "withdrawERC721(uint256,uint256,address,uint256)", +"1c07f0a3": "getAccountKeys(uint256)", +"1c080404": "contributed3(address)", +"1c08366b": "tokenPCT(string,string,uint8)", +"1c084385": "WhitehatWithdraw(address,address,address,address)", +"1c085a21": "totalRaiseWei()", +"1c088897": "MINER_AUCTION_DURATION()", +"1c08c08e": "claimBond(uint256)", +"1c09496a": "transferWithSignature(address,uint256,uint256,bytes,uint256,bytes)", +"1c09c194": "testInsertMultipleProductsIntoCart()", +"1c0acbd5": "bidOnDklSiringAuction(uint256,uint256,uint8,bytes,uint256,uint256,bytes,uint256)", +"1c0ad646": "coreAddress()", +"1c0b6367": "processTransaction(bytes,uint256)", +"1c0bbe26": "createAccountForUser(address)", +"1c0c3d33": "mintAuthorizedBatchWithBalances(address[],uint256[])", +"1c0ce15f": "TUBE()", +"1c0d1274": "setCCH_edit_21(string)", +"1c0de1b3": "LogResult(bytes32,uint8,bytes,bytes)", +"1c0e0225": "minDonation()", +"1c0e7109": "addFreelancer(address,uint256[],address)", +"1c0f12b6": "transferFrom(uint256,address,address,uint256)", +"1c0f96bb": "ManagerProxyTargetMockV1(address)", +"1c0f9a7c": "requestEURPrice(string)", +"1c114b38": "canReadInDataObject(address,bytes32[])", +"1c11fce2": "requestToken(address,uint256)", +"1c135881": "testHardCap()", +"1c1401e7": "OWNER_TRANSFER_TOKENS()", +"1c140bdd": "addCampaign(string,string,string,address,address,address,string)", +"1c14179a": "GavCoin()", +"1c14b340": "passMessage(address,string)", +"1c152982": "addEditwalletContractAddress(bytes8,address)", +"1c15b285": "getAmbientHumidityControlLimits(bytes32)", +"1c1697ae": "get_presale_arbits_per_ether(address)", +"1c169ba5": "closed_()", +"1c16c3ad": "calcAirDropAmount(uint256)", +"1c177502": "LogCollectEth(uint256,uint256)", +"1c1935ce": "getHistoricPrice(uint256)", +"1c196d77": "returnSubscriptionDesposit(uint256)", +"1c1b863b": "updateBetDataFromOracle(uint256)", +"1c1b8772": "update(address)", +"1c1bc850": "changePayee(address)", +"1c1bd814": "TIMEOUT_TIME()", +"1c1c2289": "userKey()", +"1c1d7517": "dedeNetwork()", +"1c1f6a3f": "removeTokenFrom(address,uint256)", +"1c203612": "battle(uint256,uint256,uint8[2])", +"1c20be7e": "getVestingBalance(address,address,address)", +"1c226164": "isAddressVoted(address,address)", +"1c22ac19": "aprovaDevolucao(bool)", +"1c22b196": "TransferTRAC()", +"1c22f765": "zhoudayiToken(uint256,string,uint8,string)", +"1c232194": "refundPreSale()", +"1c23281c": "GZSToken(uint256,string,uint8,string)", +"1c2353e1": "isCertifier(address)", +"1c235f5f": "getHipstermasterReq()", +"1c238e1f": "Signum(address,address)", +"1c23e280": "buyTicketsFor(address,uint256)", +"1c249494": "setStarted()", +"1c24f0bd": "applyForCertification(string,string,string,uint256,uint256,uint256,uint256,uint8,uint8,uint16)", +"1c25331d": "setMaximumNonWhitelistAmount(uint256)", +"1c25f452": "topupSupply(uint256)", +"1c27e291": "refundCoin(address)", +"1c27f30b": "Lover()", +"1c28b99e": "pressFee()", +"1c296b34": "cryptiblesAuctionContract()", +"1c2ac59d": "sosoToken()", +"1c2ac5ac": "IcoStatus()", +"1c2b1e54": "SalesManagerUpgradable()", +"1c2bbd18": "exchangeTemplate()", +"1c2d6356": "getActivityName(uint256)", +"1c2e2796": "ContractCallerProxy(address)", +"1c2e53ef": "promotionRate()", +"1c2f2f9f": "recoverAndSetSecretHash(string,bytes32)", +"1c2f38ff": "paid(uint64)", +"1c30549f": "set_rand_addr(address,uint256)", +"1c3101d3": "addRecipient(address)", +"1c3122ba": "BuyStartingSnails()", +"1c31f710": "setBeneficiary(address)", +"1c321f62": "executeLottery()", +"1c3274ff": "PlayX10()", +"1c338601": "setProviderInfoFields(uint256,string,string,uint256,string,address,uint8)", +"1c338644": "withdrawERC20Balance(address,address)", +"1c350d6b": "TRLToken()", +"1c35b76f": "VOLUME_BONUS_CONDITION()", +"1c35e7ba": "manualFinalizeRound()", +"1c363e14": "DeathFactor_v()", +"1c38f800": "currentIcoSupply()", +"1c398075": "sellClimateCoinsAgainstEther(uint256)", +"1c39b5c4": "Administrated()", +"1c39c375": "buyUninitializedPixelBlocks(uint256[],uint256[],uint256[],bytes32[])", +"1c3a36d0": "addComment(bytes3,string)", +"1c3a5713": "getProposalExternalTokenReward(bytes32,address)", +"1c3a8892": "closeRoom(uint256)", +"1c3ad417": "getBAS(bytes32,address)", +"1c3b093f": "Track(address,bytes,uint256,uint256)", +"1c3b3b9f": "expandPeriod(uint8)", +"1c3bc31f": "firstPreSaleEndDate1()", +"1c3c050c": "genTime()", +"1c3c0ea8": "setExecutor(address)", +"1c3c295e": "registerInstitutionAsset(string,string,address,address)", +"1c3cbf07": "TokenTest123()", +"1c3cf5d0": "setEditionPackPriceIncrease(uint8,uint256)", +"1c3d4f20": "ChangeBalance(address,uint256,address,uint256,uint256)", +"1c3db16d": "currentRuling(uint256)", +"1c3db9a8": "approveFlower(address,uint256)", +"1c3de07a": "calculateCoinSell(uint256)", +"1c3f2f8c": "dealsNumber()", +"1c3f7637": "isAllowedHICAddress(address)", +"1c3fe22d": "GaillardCrowdSale()", +"1c40baf5": "EUROCASH()", +"1c41d143": "KPTLToken()", +"1c41e2db": "getEducation()", +"1c423713": "addPromoCode(string,bytes32,uint256,uint8)", +"1c4261f4": "createGift(bytes32)", +"1c429165": "tryRollRoom(address,uint256,uint256)", +"1c42959c": "maximumCap()", +"1c42daf7": "winMeta(address,bytes32)", +"1c435872": "setInterRefreshLock(bool)", +"1c43814f": "registerAsSlaven(string)", +"1c43b4a6": "initAddressAsMultiOwner(address,string)", +"1c43d8b1": "EndEvent(bool)", +"1c442754": "participated(address,uint256)", +"1c448231": "SDToken()", +"1c44bac7": "tournamentBankCut()", +"1c465538": "DoFee(uint256)", +"1c465e87": "getTopOnce()", +"1c467dec": "HODLrSellWin(uint256)", +"1c47624b": "getUserProductContracts(address)", +"1c480cb6": "remove(int256,int256)", +"1c481767": "sendfrozen()", +"1c484766": "aloha()", +"1c484a34": "enableSuperDragon(bool)", +"1c488825": "MintTokens()", +"1c490883": "MelonBitIndex_Erc223Token()", +"1c49b101": "_preValidatePurchase(address,uint256,uint256,uint256)", +"1c49d19f": "finishRoundC()", +"1c4ad465": "custodyFactory()", +"1c4b0da6": "setMinSalePrice(uint256)", +"1c4b1ff7": "setGood(bytes32,uint256)", +"1c4b774b": "getReward(uint256)", +"1c4b8659": "getBoardSingleSpaceDetails(uint256,uint8,uint8)", +"1c4bcbb0": "distributePowerToAddress(address,uint256)", +"1c4be509": "forkTransfer(address,address,address,uint256)", +"1c4bfcfe": "BoxChange(address,uint256)", +"1c4c2681": "cirusToken()", +"1c4c710b": "getAreaIndex(string)", +"1c4d5608": "getSchemeParameters(address,address)", +"1c4d749b": "GetContractStateActive()", +"1c4e6cd0": "NameReg()", +"1c4ef6c2": "ethPriceInEuroCent()", +"1c4fda10": "tokenSafe()", +"1c50e880": "cancelAuctionHashing(uint256,uint64)", +"1c51a8e0": "setConfigString(string)", +"1c533a09": "Trupee()", +"1c535d96": "getuserdayeths(address)", +"1c53faf8": "backSggCoinOwner()", +"1c5412f7": "_computeCut(uint256)", +"1c54220d": "c_centsPerTokenSecond()", +"1c545049": "maxPresaleEDUSupply()", +"1c548c78": "foreignBridgeProxyOwner()", +"1c54e565": "getNextUserId()", +"1c54fbab": "getShip(uint16,uint16,address,address)", +"1c558b71": "ORIUMCOIN()", +"1c560f68": "CreatePreSale(address,uint256)", +"1c5633d7": "setPeriodLength(uint256)", +"1c566ef2": "setOperationAttributes(string,uint256,string)", +"1c568925": "addPendingUserListArr(address)", +"1c572f8c": "getICOPercentage(uint8)", +"1c5736ee": "add_record(string)", +"1c575f7f": "sendDivsToBankroll()", +"1c57a386": "oraclize_query(string,bytes[1],uint256)", +"1c581205": "targetAmount(address)", +"1c58c3ff": "totalMineSupply()", +"1c58d0d2": "_unsafeDecodeTokenId(uint256)", +"1c5992ff": "Zandar()", +"1c59a667": "disableBlacklist(address[])", +"1c59c177": "FCCContribution()", +"1c5a3942": "BPPOL()", +"1c5a5a58": "getRandomNum(address,uint256)", +"1c5a5bc4": "createShip(uint256,string,uint256,uint256,uint256)", +"1c5a9005": "HashRemoved(address,string)", +"1c5a9d9c": "activate(address)", +"1c5be3d7": "updateTimestamp()", +"1c5ca530": "IprontoToken()", +"1c5caa6b": "Rate9()", +"1c5d3c60": "stateIsWaitingProofs(uint256)", +"1c5d9faa": "setNickname(string)", +"1c5daad7": "_maint_withdrawFromPool(uint256)", +"1c5eaa23": "findByModuleText(string)", +"1c5ef50b": "Rasper()", +"1c5f2810": "setnewowner(address)", +"1c5f3176": "someMethod4(uint256,uint256,uint256)", +"1c5f8675": "getMyTuple()", +"1c5fe1a4": "TeamAmount()", +"1c606dd3": "GetConstructCost(uint256,uint256)", +"1c607f14": "setDynamicArraySize(uint256)", +"1c60a158": "TEAM_TOKEN_AMOUNT()", +"1c60f3bb": "buyEthCards(uint256,uint256)", +"1c61babe": "CelsiusToken(uint256)", +"1c61bd38": "showValue()", +"1c61eeb0": "acceptRelayedCall(address,address,bytes,uint256,uint256,bytes,bytes)", +"1c61f2bc": "fuckingClaim2(bytes,bytes)", +"1c623ddd": "reward(bytes32,uint8,bytes32,bytes32,bytes32,uint256)", +"1c624a60": "qtyInitiators()", +"1c624d19": "mintObizcoinTokens(address,uint256)", +"1c637987": "_setAuctionStatus(bytes32,uint8)", +"1c638376": "setProductAttributesByRegulator(string,string,uint256,uint256,string)", +"1c63c6c3": "setPartData(uint256,uint256,uint256[])", +"1c64065d": "myInfraList(address,uint256)", +"1c6416ad": "pubaddr()", +"1c65706e": "allowInvest(address,address)", +"1c657c63": "setEtherInUSDInternal(string)", +"1c668855": "getGenotype(uint256)", +"1c674fba": "createRandomBox(string,address,uint64,uint256,uint128)", +"1c67a7aa": "TransCompleted()", +"1c67e9a6": "setTokenStatus(bool)", +"1c68571d": "bonusLimit1()", +"1c6868c8": "adjustBonusPrice()", +"1c68fe82": "listProperty()", +"1c69ad00": "balance0()", +"1c6a0cf8": "GuangPengChain()", +"1c6a866c": "Collect_accrued_interest_and_transfer(address,uint256)", +"1c6b69b7": "rateCent()", +"1c6b7c1d": "EtherTransfer(address,address,uint256)", +"1c6ba386": "_claimReward(address,uint256)", +"1c6be97d": "allowanceRewriteTest(address)", +"1c6ce9a3": "executeSendCapital(address,uint256)", +"1c6d31f7": "xxx()", +"1c6d4575": "getTokensAmountAllowedToWithdraw(uint256)", +"1c6d6483": "approveMappingProposal(address)", +"1c6debbb": "UnionChainSupply()", +"1c6e3899": "getTierId(uint256)", +"1c6ef374": "recordingResultsOfBet(bytes32,bytes32[],uint8[])", +"1c6f609b": "cooperativeClose(address,uint32,uint192,bytes,bytes)", +"1c6f634e": "oracleItQuery(string,string)", +"1c70362c": "setSettingValues(uint8,uint8,uint16,uint16,uint16,uint16,uint16,uint8,uint8,uint32,uint32,uint8)", +"1c7040cc": "setProxyCurator(address)", +"1c7106e6": "setOracleAPIAddress(address)", +"1c7276f5": "updateLuck(uint256,uint8)", +"1c72961d": "setRandomSign(address)", +"1c72e225": "transformSeedToFlower(address,uint256)", +"1c7307f4": "get_topl_address(address,address)", +"1c732d83": "centsToWei(uint256)", +"1c73561f": "jobCompleted(bytes16,address,address,uint256,uint256)", +"1c73601e": "getUncorrelatedRN(uint256)", +"1c74d5c8": "Successor(address,address)", +"1c7564cb": "DWMP()", +"1c75b6b2": "setDevFee(uint256)", +"1c75f085": "teamAddress()", +"1c761245": "buyDOTCH(uint256)", +"1c762a27": "show_Balance_of_interest_bearing_deposit(address)", +"1c76e2b2": "getOrderBookKey(uint256)", +"1c77a4ec": "Lemmon()", +"1c77c58c": "collectRoundLength()", +"1c7a08ef": "isActivate(uint256)", +"1c7a39e2": "_distributeRewards(address,address,uint256)", +"1c7a3c9d": "setExchangeContractAddress(address)", +"1c7a3d31": "updateNextOrderUser(address,address,uint256,address,address)", +"1c7b10aa": "merkleTreeRoots(uint256)", +"1c7b530a": "secondTotalSupply()", +"1c7bfdce": "test_votingWhenCertified()", +"1c7cf44c": "claimCommit(bytes32)", +"1c7d5334": "DORCoin(address)", +"1c7f3a96": "getMarketCreatorSettlementFeeDivisor()", +"1c7f578a": "mintC()", +"1c7f6942": "getPlayerSpaceshipModelByIndex(address,uint256)", +"1c7f98ca": "getRunInfo()", +"1c800d64": "insert_helper(uint256,bool,uint256)", +"1c81525c": "NitinToken()", +"1c81bcfb": "dividendPathways()", +"1c81ed15": "raiseSupply(uint256)", +"1c8293c4": "PriceChanged(uint256,uint64)", +"1c82a013": "onOffCrowdSale(bool)", +"1c844171": "bakkaToken()", +"1c8499e5": "greeter()", +"1c857765": "sumElements(uint128[])", +"1c85d890": "productListing(bytes32)", +"1c85ee51": "getBasicIncome()", +"1c8670fc": "endEarlyStage4()", +"1c8685e0": "WXSLToken(uint256,string,string)", +"1c87055f": "Fund(address,address,address,address,address,address,address,address[])", +"1c870eee": "setUserPermission(address,bytes4)", +"1c878c97": "releaseLockAgencyLock1()", +"1c879c47": "getMarketHashes(bytes)", +"1c87deec": "returnTokenDepositState(address,bytes32)", +"1c895915": "getNumberOfPayments(uint256)", +"1c89f174": "calculateUserBid()", +"1c8a1e20": "membershipAddress()", +"1c8a3821": "AllocateFounderTokens(address)", +"1c8a7795": "archiveText(string)", +"1c8c4509": "addSiteSet(uint256,uint256)", +"1c8ca56d": "stopSelling(bool)", +"1c8cba3b": "getSubjectClaimSetSize(address,uint256,uint256)", +"1c8ce890": "disburse(address)", +"1c8d25bc": "proposed_beneficiary()", +"1c8d51e6": "getSentAmount()", +"1c8d5d38": "allowance(address,address,bytes32)", +"1c8dddbd": "editContributors(address[],uint256[])", +"1c8e9a6f": "commitWork(uint256)", +"1c8eac0f": "endFunding()", +"1c8f7570": "depositLogic(address,uint256,uint256,uint256)", +"1c90e9cf": "testwallet8()", +"1c9193c0": "TakeOut(uint256)", +"1c91a6b9": "startExit(uint256,bytes,bytes,bytes)", +"1c921e16": "claimHeirOwnership()", +"1c92b497": "crowdsaleInitialSupply()", +"1c92cab2": "auto_transfect(address[])", +"1c931313": "setDesignatedReportDueTimestamp(uint256)", +"1c931439": "getLockedContractAddress(address)", +"1c933e2f": "multiplyDecimalRoundPrecise(uint256,uint256)", +"1c946642": "intellisys()", +"1c949bdf": "setEtherollAddress(address)", +"1c95b42e": "payBonus()", +"1c95c89d": "authorizeForToken(address,address)", +"1c96b242": "balanceOfReal(address)", +"1c96ef03": "Presale(address,address,address)", +"1c9713bd": "transferTobucketOneContract(address)", +"1c973c57": "getSpecialityValue(uint256)", +"1c982066": "refreshGameTime()", +"1c983347": "maxBidPercent()", +"1c98680f": "_redeemByDefaultTranches(address,address,uint256,bytes,bytes)", +"1c990670": "realDividends(address)", +"1c991783": "mintUniqueTokenTo(address,string,uint256)", +"1c997344": "createBid(bytes32,address,uint256)", +"1c9981f8": "donate(address,address,bytes4)", +"1c99d341": "removeParty(uint256)", +"1c9a5ddf": "returnBox()", +"1c9ab3ad": "getBlockData(uint256)", +"1c9ad79d": "newCampaign(string,address,uint256,uint256,address)", +"1c9b612e": "ledTokensAllocated()", +"1c9c549d": "buyEggPrice()", +"1c9cae74": "removeScore(uint256,uint256)", +"1c9cafd7": "tan(int256)", +"1c9cf54c": "getStockAmount(address,uint256)", +"1c9e9999": "migrateDungeon(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"1c9f289d": "setCCH_edit_6(string)", +"1c9f369e": "purchase_propose(uint256)", +"1c9fbb11": "finishPreSale3()", +"1c9fe5d7": "BRONZE_AMOUNT_TPT()", +"1c9feaa5": "isExecuted()", +"1ca0076c": "multisend2(address,address,address[],uint256[])", +"1ca03b8e": "senderHasRole(string)", +"1ca0a28d": "multiTransfer(address,address[],uint256[])", +"1ca19ece": "IsaDalawa()", +"1ca2d6b7": "WalletChange(address,uint256)", +"1ca2e94a": "setPresalePhase(uint8)", +"1ca3630a": "updateComponent(string)", +"1ca3d4b7": "icoPhase4End()", +"1ca4399b": "DEV_TEAM_HOLDER()", +"1ca43cef": "ADMISSION_TIME()", +"1ca46d61": "bigChicken()", +"1ca5df03": "multiVesting(address[],address,uint256[],uint256[],uint256[])", +"1ca60aeb": "setMeltingContract(address)", +"1ca750f4": "privateSaleTokensSold()", +"1ca7bcc7": "toBytes32(bytes,uint8)", +"1ca84592": "RA(address)", +"1ca84efc": "secondTTaxAmount()", +"1ca89953": "batchFund(uint16[])", +"1ca8b6cb": "totalTokenSupply()", +"1ca9ad47": "createLockingTokenVaults()", +"1ca9fb9d": "updateContract(uint256,uint256,uint256,uint256)", +"1caa0c6d": "saleExchangeRate5()", +"1caa5ccb": "startDapp(address,address)", +"1caaa487": "tokenOwner(uint256)", +"1caba41f": "decimalUnits()", +"1cabc5ed": "userVoteFor(address,uint256,uint256)", +"1cabc785": "getPlayerDefend(uint256)", +"1cabe3ef": "pethPEReth(uint256)", +"1cac31d7": "setAdvisorsTokensWallet(address)", +"1cac7b7f": "MINERTA()", +"1cad5a40": "depositERC20(address,address,uint256)", +"1cadd93e": "initPlayers()", +"1cae7c2f": "TransferCoinsEther()", +"1cae947a": "firstPrivateLockedAmount()", +"1caf1752": "Coinvilla()", +"1cafc144": "distruggi()", +"1cb07902": "mintMore(address)", +"1cb08889": "MERIDIANERC20(string,string)", +"1cb0d481": "transferTokens(address,uint256[],uint256[])", +"1cb120d6": "ENSRegistry()", +"1cb1778a": "setup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256[],uint256[])", +"1cb20fe6": "Devcoin()", +"1cb252fe": "investorsTotal()", +"1cb2dbf6": "Reduction(string,address,uint256,uint256)", +"1cb3bbc0": "updateGlobalUnlockTime(uint256)", +"1cb3d9be": "grantEditorRights(address)", +"1cb5bfc4": "LogBet(bytes32,address,uint256,uint256,uint256,uint256)", +"1cb64196": "ethStore()", +"1cb6adec": "tubFab()", +"1cb6d99a": "buyTokensOthersCoins(address,uint256,string,string)", +"1cb78879": "TitleDelisted(uint256)", +"1cb82d79": "registrarOwner()", +"1cb9a02a": "calculateScore(uint256,uint256)", +"1cb9ce63": "makeCall(address,bytes)", +"1cba6f79": "_isERC721Contract(address,address,uint256,bytes)", +"1cbaaea7": "set_payment_details(uint256,string)", +"1cbaee2d": "saleStartTime()", +"1cbb67c4": "FooUser(address)", +"1cbc5ab1": "Buy(address,uint256,uint256)", +"1cbcb9b9": "BellaBluToken()", +"1cbcc77c": "test_suicide()", +"1cbd0519": "accountLevel(address)", +"1cbda93d": "p_update_mResalePlotDevPercent(uint256)", +"1cbea83d": "proposalReason(uint256)", +"1cbea99b": "getAddress(address[],bool,bool)", +"1cbeae5e": "winner(uint256)", +"1cbfbe47": "assignTokensToMultipleInvestors(address[],uint256[])", +"1cc0eb83": "kickcityWallet()", +"1cc13dff": "totalplayers()", +"1cc1cf46": "paymentInterval()", +"1cc1e7bc": "appendPacket(bytes)", +"1cc2502e": "auctionList()", +"1cc47026": "trans(address,address,uint256,uint256)", +"1cc48f08": "getResolverAllowance(string,address)", +"1cc54204": "totalGenesisAddresses()", +"1cc69ac1": "assignNewParcel(int256,int256,address)", +"1cc6ba74": "testWIP()", +"1cc6ea05": "populateStringMember()", +"1cc6f13d": "setComplianceService(address,address)", +"1cc70934": "getPolicyLockedPercentage(uint8)", +"1cc72c04": "CheckPoolOwnership(string,address)", +"1cc78eb6": "RANGEEND_1()", +"1cc8092f": "FOURTH_TIER_DISCOUNT()", +"1cca13d3": "is_watched(address)", +"1ccb2601": "FoodWithdrawEvent(address,address,bool,uint256,uint256,uint256)", +"1ccc7013": "setPriceAt(uint16,uint16,uint8,uint256)", +"1ccd2706": "CatholicCoin()", +"1cce70d4": "getHowManyWinners()", +"1ccf6955": "getBets(uint256)", +"1ccf8abe": "phiWon()", +"1cd01e3a": "collectPercent()", +"1cd07895": "DmlToken(address,uint256)", +"1cd0b87f": "B33RToken()", +"1cd23711": "nouveauContrat(address,address[],uint256[])", +"1cd30149": "paybackRequired()", +"1cd3072b": "transferSub(address,address,uint256)", +"1cd30a3a": "randomGen(bytes32,uint256)", +"1cd3b754": "preICOcoinsLeft(uint256)", +"1cd421cc": "Show_Product(uint256,uint256)", +"1cd45773": "getruns(address)", +"1cd58891": "requestRedemption(uint256,uint256,bool)", +"1cd60a85": "setFiscal(bytes32,bytes32,bytes32,uint256,uint256,uint256)", +"1cd732c1": "currentEthPrice()", +"1cd73845": "updatePremiumCalculator(address)", +"1cd76498": "crossForkFund()", +"1cd8b96c": "poolDLock()", +"1cd8d8a9": "checkTeam(address)", +"1cd95d2a": "_freeze(address,uint256,uint8)", +"1cda37f2": "eraseRecords(bytes32)", +"1cdadfae": "balanceNotEqual(address,uint256,string)", +"1cdb0989": "getMaxEmpruntable(address)", +"1cdb8571": "left2(uint256)", +"1cdc3f8a": "STQPreICO(address,address)", +"1cdc51e7": "requestRates()", +"1cdce200": "walletOne()", +"1cde0ff0": "withdrawScamEarnings()", +"1cde3cde": "BDIToken()", +"1cdeae52": "setSynopsis(string)", +"1cdef3ed": "agree(uint256,address)", +"1ce00c50": "registerUnlock()", +"1ce10a9d": "get_Sponsored_Amount_in_Job_By_Address(uint256,address)", +"1ce1e1b8": "White(address,uint256)", +"1ce26ecd": "addOwner()", +"1ce26faa": "fundingEndsAt()", +"1ce28e72": "getLimit(address)", +"1ce30927": "getOption(uint256,uint256)", +"1ce477d8": "createTransferEvent(bool,address,address,uint256)", +"1ce48441": "getrm()", +"1ce5e9a6": "getOption(uint256)", +"1ce62383": "expected()", +"1ce624d6": "Crypted_RPS()", +"1ce6717d": "CouponDeposit(address[2],uint256[8],uint256)", +"1ce6a810": "KBKJToken()", +"1ce7d9da": "ico_finish()", +"1ce7eff3": "bytecodeAt(address)", +"1ce817ab": "NoWinner(address,uint256,int256,string)", +"1ceb1b87": "setCanAcceptTokens(address,address)", +"1ceba89b": "getH3Bidder()", +"1cecb935": "isSignedNoEnc(uint16)", +"1ced2c75": "SpritzCoin()", +"1cedf8a3": "getDarknodeOwner(address)", +"1ceea715": "GetMyInvestFee()", +"1cef2b4e": "TokenCreated(address,uint256)", +"1cef3c13": "StandardTokenFreezer(address)", +"1cef92b1": "getRewardStatus(address)", +"1cf081f6": "changeProductionFee(uint256)", +"1cf190b0": "getAvailableInvestmentsBackValue(address)", +"1cf196df": "changeCommissionFee(uint256)", +"1cf19ad7": "Mundo()", +"1cf1bb72": "releasedAmount(address)", +"1cf25dc9": "incentivisingAddress()", +"1cf28a65": "expand()", +"1cf28ae3": "_bonusTime1()", +"1cf2de25": "MinterUpdated(address,address)", +"1cf3d16d": "LogRegularityConfirmation(address,bool,bytes32)", +"1cf41a81": "deployContract(uint256)", +"1cf43b63": "extractExportFeeChargeLength()", +"1cf52f2b": "isActiveRegistrant(address)", +"1cf57f67": "future_round_coins()", +"1cf67724": "getImplChangeReq(bytes32)", +"1cf73c13": "setStake(uint256,uint256)", +"1cf74ece": "left56(uint256)", +"1cf91bf2": "setOwnerAtomsCount(address,uint256)", +"1cf9c88a": "addAction(string)", +"1cfa42d0": "isReleaseRecordExist(uint256)", +"1cfa8e65": "_requireBalance(address)", +"1cfac68e": "BitSelectModerado()", +"1cfb4e1b": "InsureShares()", +"1cfb7c9a": "ifAllowed(string,address)", +"1cfbc7d0": "finalRewardPeriodEndBlock()", +"1cfc832e": "invalidateProposal(bytes32,bytes32)", +"1cfcc5bb": "checkGameSideAmount(uint256,uint256)", +"1cfce386": "calculateTarget()", +"1cfd11d5": "getDungeonDetails(uint256)", +"1cfdf90e": "updateWinnersList()", +"1cfe04a7": "canPay()", +"1cfe699e": "getFreezingSummaryOf(address)", +"1cfef64c": "SEELE_TOTAL_SUPPLY()", +"1cff272e": "show_Accrued_Interest(address)", +"1cff3e09": "testCreateBallotContract()", +"1cff79cd": "execute(address,bytes)", +"1cff87db": "burnMyQUATransferAndSendQUAToSomeone(uint256,address)", +"1d000b61": "BNT_TOKEN()", +"1d007f5f": "changeDAO(address)", +"1d010815": "createSaleAuctionERC20(uint256,address,address,uint256,uint256,uint256)", +"1d012c8e": "gameIsOver()", +"1d017b28": "setUnownedNumOfExoTokensBonus(uint256,uint32)", +"1d0192e1": "editEntity(address,bool,bytes32)", +"1d01ee9d": "BPX_per_ETH()", +"1d0205b8": "months(uint256)", +"1d029641": "rntTokenVault()", +"1d02fb06": "nCryptToken()", +"1d03842f": "onePlus(uint256)", +"1d048136": "setBaseStamina(uint256)", +"1d04c92b": "appendKeyValue(string,int256)", +"1d05bcb3": "dividendsRound()", +"1d05c57e": "_createCobeFriendWithTime(uint256,uint256,uint256,uint256,address,uint256,uint256)", +"1d05d1d8": "refundContributorEnd()", +"1d065dde": "_transferWithReward(address,address,uint256)", +"1d075862": "getUpgradeProposals()", +"1d079c20": "IETToken(address)", +"1d07b797": "destroyTheUniverse()", +"1d0806ae": "initialPrice()", +"1d08837b": "setBaseRate(uint256)", +"1d09ba2c": "right15(uint256)", +"1d0a3cb8": "suspendedPayments()", +"1d0ba36e": "transferToPartner(address)", +"1d0cc1e7": "fullfillTeamAddress()", +"1d0ced55": "IonicCoin()", +"1d0d35f5": "isContributor(address)", +"1d0d5992": "transferBetweenUsers()", +"1d0e8a4d": "isShop(address)", +"1d0f2c99": "setTarget(uint256,uint256)", +"1d103139": "commissionCheck()", +"1d107603": "totalInitialBalance()", +"1d111d13": "withdrawBNB()", +"1d121dfe": "communityGrantsAmount()", +"1d123801": "airDropNum()", +"1d124fe4": "setUtils2(address)", +"1d128687": "myDividendsNo()", +"1d12b52f": "AKBToken()", +"1d130935": "isSuspended()", +"1d143848": "issuer()", +"1d14e5ff": "crowdSaleDonate()", +"1d153624": "CIBNLiveInteractiveToken()", +"1d15f317": "SUFFICIENT_STATUS()", +"1d16d1bb": "setComponent(string,address)", +"1d16d9a0": "sendETH()", +"1d184872": "lastrandom()", +"1d18ee83": "getCurrentHardcap()", +"1d1997a0": "lengthNotEqual(int256[],uint256,string)", +"1d19a56d": "claimFeeRebate(uint256,bytes32,bytes32,bytes32,uint8)", +"1d19a78e": "deactivateHedge(address,uint256)", +"1d19ffc3": "uniqueIds(uint256)", +"1d1a696d": "contains(bytes32)", +"1d1a7c32": "concat(bytes,bytes1,bytes,bytes1)", +"1d1ac66a": "signOut(address)", +"1d1ada90": "manuallyAssignTokens(address,uint256)", +"1d1ca65b": "BROKER_RESERVE_ADDRESS()", +"1d1cc622": "CurrentDistribPublicSupply_()", +"1d1ce884": "VoteCommitted(address,uint256,uint256)", +"1d1eda5e": "setBonusesForTimes(uint32[],uint32[])", +"1d1eff42": "AccessRevoke(address)", +"1d1fe108": "burnInvestorTokens(address,uint256)", +"1d209605": "Controllable()", +"1d20a9c9": "setCardActive(bool)", +"1d211d74": "tokensToSale()", +"1d21f252": "getInvertedPrice(address)", +"1d222b77": "UserUpdate(address)", +"1d231b2c": "_blackListed(address)", +"1d24190c": "GetGiftInfo(string)", +"1d24310d": "setTransferMode(bool)", +"1d2531f3": "is_alive()", +"1d25a5eb": "CGToken()", +"1d25bba2": "addSomeCWCsTo(address,uint256)", +"1d25c1a5": "get_remaining_quantity()", +"1d2627bb": "setEidooWallet(address)", +"1d263b53": "callSecondTarget()", +"1d263f67": "flip(bool)", +"1d27769f": "participate(string)", +"1d289e57": "regulationsFulfilled()", +"1d291990": "getNumberOfBid()", +"1d293500": "gamePayOutWinner(address)", +"1d296e8d": "geneLabAddress()", +"1d29de63": "clearAllCandidates()", +"1d2a6dcf": "getNumArchers()", +"1d2aa5b3": "skip()", +"1d2aabcb": "MicroBitcoinToken()", +"1d2af28b": "pay055loyal(address)", +"1d2b4ae7": "BuyStartingSnail()", +"1d2b63bf": "GetNumber(address,uint256)", +"1d2b7155": "activateImportFeeChargeRecord(address)", +"1d2b8d96": "MintICO(address,address,uint256)", +"1d2bca17": "MyToken(uint256,string,uint8,string)", +"1d2bf543": "fetchCoinAge(address,address)", +"1d2c1b59": "query(uint256,bytes32,string,string,uint256,uint256)", +"1d2d4c34": "test_assert()", +"1d2d8400": "delegateToNewContract(address)", +"1d2d86dc": "setChecksum(bytes32)", +"1d2d9b06": "raiseEvent(string)", +"1d2dbb22": "CancelMyInvest()", +"1d2e18cd": "stageOneStart()", +"1d2e2cc4": "ENS()", +"1d2e5a3a": "setSale(bool)", +"1d2eda60": "DIUToken()", +"1d2ee278": "Angel()", +"1d2fd267": "getCarCurrentPriceAuction(uint32)", +"1d2fed16": "updateRates(bytes4[],uint256[],uint256)", +"1d300421": "NuruToken(uint256,uint256,string,string,uint8)", +"1d30d3db": "Transfer(address,address,string,uint256)", +"1d3231d4": "totalCommitted()", +"1d32a70c": "upgradeMining(uint256,uint256)", +"1d32ab99": "originTransfer(address,uint256)", +"1d32f106": "openZoneTeller(bytes2)", +"1d32f29a": "SetDescript(string)", +"1d33267a": "revokeGrant(uint256)", +"1d333265": "_removeCryptantFragments(address,uint256)", +"1d3390a1": "carefulSendWithFixedGas(address,uint256,uint256)", +"1d34be47": "updateRefund(uint256,uint256,uint256,bytes32)", +"1d34cf60": "getNumSuppliers()", +"1d351f53": "decreaseAllowanceToken(address,uint256)", +"1d356eef": "getDepositEtherForAddressValue()", +"1d3639ec": "preDGZTokensSold()", +"1d365669": "transferDirectoryToken(uint256,address,uint256)", +"1d36e06c": "tokenIndexToOwner(uint256)", +"1d36ee16": "RBC(uint256,string,string)", +"1d376a44": "PriceOracle(uint256)", +"1d3795e8": "startFreeGet()", +"1d37c8a6": "setPurchaseRate(uint256)", +"1d381240": "addKey(bytes32,uint256,uint256)", +"1d38869b": "ShopiBlock()", +"1d38bebd": "isInitialAuctionEnded()", +"1d38e433": "gasForIAD()", +"1d38fcda": "freeze(address[])", +"1d3a5dbe": "requiredPrefix()", +"1d3b9edf": "times(uint256,uint256)", +"1d3ce58d": "currentMintable()", +"1d3d4c0b": "make_contact(bytes32[])", +"1d3d93d4": "activateCurrency(address)", +"1d3e2d1b": "changeFriend(address,address)", +"1d3e43c8": "VCcoin()", +"1d3e904e": "BasicSPIKE()", +"1d3f6f1b": "setFounderMultiSigAddress(address)", +"1d3f864b": "campaignCaptain(uint256)", +"1d3f90c6": "bonusUnlockTime()", +"1d40bbcf": "_addMember(address)", +"1d411612": "EthernetCashAddress()", +"1d4233b9": "flushEth()", +"1d42cf72": "nochange()", +"1d433d52": "_getbonusRate()", +"1d43776e": "rngAddress()", +"1d43b653": "submitTransaction(address,uint256)", +"1d43cc98": "increaseTotalSupply(uint256)", +"1d4494f1": "changeApiUrl(string)", +"1d45e9e1": "notEqual(uint256[],uint256[],string)", +"1d461b83": "airdropMDL(address[],uint256)", +"1d46ef0a": "OxBitcoinExchange(address,address,address,uint256,uint256,uint256)", +"1d47ae34": "YShare()", +"1d47f8c1": "getApprovals(address,uint256)", +"1d480d8b": "addRefBonusWithRefs(address,uint256)", +"1d49e081": "EXECUTE_EXTRA_GAS()", +"1d4a48b7": "Start7()", +"1d4a9209": "initializeTokenSale(uint256,uint256,uint256,uint256,address)", +"1d4ac2b6": "yearteam()", +"1d4b0796": "updateTxStats()", +"1d4b11e4": "ownerOfLandMany(int256[],int256[])", +"1d4be3df": "getFoundAddress()", +"1d4c8e5d": "removeAddressesFromBonuslist(address[])", +"1d4cecaa": "setInfo(uint256,bytes32,string)", +"1d4d691d": "fill(address,uint256,address,address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)", +"1d4d8656": "donateAuthor()", +"1d4d8808": "_getFeeHistory(uint32)", +"1d4eaf06": "StoreFile(uint256,bytes32,string,string,string,string,string,uint256,bytes)", +"1d4f2c6d": "setMythicalGravatar()", +"1d4f3e8b": "getCLottery()", +"1d4f9bbf": "NewTTL(bytes32,uint64)", +"1d50169c": "sendToken(address,uint256,uint256,uint256)", +"1d5023c8": "setReferrerAddress(address)", +"1d511879": "buyTokensPresale()", +"1d523047": "COMMUNITY_TOKENS()", +"1d523107": "SOFT_CAP_IN_TOKEN()", +"1d52573f": "set_address_B(address,address)", +"1d532a97": "increaseAssetsCertified(uint256)", +"1d5407aa": "helpCoinAddress()", +"1d5459f7": "updateFundAddress(address)", +"1d545d09": "crowdsaleEndTime()", +"1d54ab74": "_getRateIndex(uint256)", +"1d54e16e": "reinvestPartial(uint256)", +"1d570166": "previligedAddApproval(address,address,uint256)", +"1d57b474": "updateMAX_BET(uint256,uint256)", +"1d57bcf7": "ProofLibInterface()", +"1d590771": "TeuToken()", +"1d598d10": "BitcoinBlue()", +"1d59cde3": "retrieveEarnings(address)", +"1d5a9f3f": "object_types(uint256)", +"1d5aca61": "ZITRON()", +"1d5b26b1": "presaleMarket()", +"1d5b9efe": "mintAfterSale()", +"1d5c7ef5": "getPaymentToAddRemoveCountry(string,bool)", +"1d5de3fb": "ECOToken()", +"1d5e3350": "transferReservedTokens(uint256)", +"1d5e3f6d": "sumOfN(uint256,uint256,uint256,uint256)", +"1d5ea379": "newUserFrom(address,string,string,string)", +"1d5f624a": "unPaidBurnTokens(uint256)", +"1d5fe710": "finalizeCurrentStage()", +"1d60208a": "TrezorMultiSig2of3(address,address,address)", +"1d608659": "onWhitelist(address)", +"1d60993b": "stakeScale(uint256)", +"1d62a312": "thirdPreSaleDate()", +"1d62a40f": "DungeonChallenged(uint256,address,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)", +"1d62c5bf": "PublicSold()", +"1d6456c4": "_transfer(address,address,uint256,uint256)", +"1d645b12": "getEventInfo(uint256)", +"1d6477e1": "reclaimableLand()", +"1d64976b": "HBCM()", +"1d65551d": "updateRenExSettlementContract(address)", +"1d659153": "CanObtainChip(uint32)", +"1d65d60e": "PRE_ICO_MAX_TOKENS()", +"1d66105b": "buyDrangon()", +"1d66ff8e": "getInvestorDividends(address)", +"1d68463e": "CreateSWP(address,uint256)", +"1d68b449": "crowdClosed()", +"1d6916ab": "buyTicket(uint256,uint256,string)", +"1d693910": "Piezochain()", +"1d69ccdc": "SuccessfulVote(address,bytes32,bytes32)", +"1d6a8bda": "enableTokenTrade(address)", +"1d6b5d2c": "setDnaMixerAddress(address)", +"1d6b867c": "getGamePlayer(uint256)", +"1d6c0dfa": "setActiveHero(uint256)", +"1d6c263c": "Election()", +"1d6ca15d": "Presale(uint256,address,address,address,uint256,uint256,uint256,uint256)", +"1d6d8d60": "modifyMilestoneTo(address,uint8,uint8)", +"1d6f5e03": "PubkeyChanged(bytes32,bytes32,bytes32)", +"1d6f757d": "withdraw(uint256,uint8,bytes32,bytes32,uint256)", +"1d6fe151": "ROSCtoken(uint256,string,string)", +"1d704684": "setBinanceCoinPrice(uint256)", +"1d706777": "getCertifier(address)", +"1d7099d3": "payFromAllowance(address,address,address,uint256)", +"1d709ab4": "set_transfer_gas(uint256)", +"1d718288": "referralTokensAvailable()", +"1d71929d": "MIAMIcoin()", +"1d71a1cd": "newIncome(string)", +"1d724a7a": "getFounderStatus(address)", +"1d731345": "calculateRoom(uint256,uint256,uint256)", +"1d7315cc": "storedAmount()", +"1d732304": "generateRand(uint256)", +"1d73268a": "PHDToken(uint256,string,string)", +"1d733337": "participantRegistered(address)", +"1d73fb93": "autoTransfer(address,uint256)", +"1d747131": "getTotalApprovers()", +"1d74c1a8": "_addToFund(uint256,bool)", +"1d74f3a5": "DIRT()", +"1d75493a": "setWinnerPlaceDistribution(uint256,uint256)", +"1d755c8d": "recieveVote(address,bytes32)", +"1d759214": "minMinBuyETH()", +"1d75a4b9": "viewAuthorized()", +"1d7630f0": "signedTransferFromCheck(address,address,address,uint256,uint256,uint256,bytes32,address)", +"1d7747d1": "addAuthByCode(string,string)", +"1d777856": "tokensForBurn()", +"1d7786e3": "numToksSwitchedOver()", +"1d77d696": "setMockUint256(bytes4,uint256)", +"1d780960": "pauseGame(uint256,bool)", +"1d786cd0": "widthdrawEtherDelta(uint256)", +"1d7876e7": "transferBack()", +"1d78ca63": "AuctionClosed(address,uint256)", +"1d790c99": "parseData(bytes,uint256)", +"1d7915ad": "setSeed(uint256,uint256)", +"1d793e9a": "batchChangeChannel(address[],uint256[],uint256,uint256)", +"1d7add35": "appendPricePoints(uint64[])", +"1d7b46b2": "tokensPurchasedTotal()", +"1d7b5baf": "setUint(int256,bytes32,string,uint256)", +"1d7b6d58": "forkAndRedeem()", +"1d7bb2db": "CasinoCoin()", +"1d7bc449": "getCeleb(uint256)", +"1d7c194e": "bulkRejectMints(uint256[],uint256[])", +"1d7c5cd1": "userServicesLength(address)", +"1d7c8894": "issueGoldTokens(address,uint256)", +"1d7ca2be": "subAddressToWhiteList(address[])", +"1d7d1f17": "BFX()", +"1d7d8d2e": "EthereumPoint()", +"1d7e1f68": "getContentRank(address,uint256)", +"1d7f2e0c": "SecondNode(address,string,string)", +"1d7f8039": "mineMany(bytes32[])", +"1d7fb62f": "initVote(uint256)", +"1d80009a": "rootHash()", +"1d80e62a": "changeTransfersPaused(uint256)", +"1d814480": "provideInfoCourseBaseOnIdStudent(uint256)", +"1d81564d": "minutesInPeriod()", +"1d819ef0": "testEqualityAddr()", +"1d82e9c7": "EXTRA_GAS()", +"1d833aae": "drop(address,address[],uint256)", +"1d834409": "totalOrders()", +"1d834a1b": "insert(uint256,uint256)", +"1d836ae9": "EQUIEX()", +"1d83e3a9": "withdraw_(address)", +"1d846f5c": "currentCancellationResults()", +"1d849220": "getTokenSaleTime()", +"1d84f303": "ETPC()", +"1d8557d7": "updateState()", +"1d862a81": "getPop(uint256)", +"1d87614a": "OPTION_POOL_PERIOD()", +"1d87a65c": "createBattleboard(uint8)", +"1d88c05b": "successorAddress()", +"1d898f52": "IM()", +"1d89dbc9": "updateExchangeRate(uint8,uint256,uint256)", +"1d8a8db9": "ethRaisedAddress()", +"1d8aa5ec": "currentSettlementPhase()", +"1d8acf1b": "getBoolValues(bytes32)", +"1d8adb7a": "setMaxUserPayment(uint256)", +"1d8ae626": "Security(string,string)", +"1d8b13a6": "setPersonal(address)", +"1d8b4dd1": "createContractExoplanet(string,uint256,uint32,string,uint32,uint8,string)", +"1d8b70da": "order_received(string)", +"1d8bab91": "RDN()", +"1d8c61c0": "setTMEXAddress(address)", +"1d8c7c20": "internalSellTokenFromAdmin(address,uint256,bool,uint256)", +"1d8ceb44": "extractClosingSignature(address,uint32,uint192,bytes)", +"1d902fe9": "currentBonusRate()", +"1d9046ce": "transferShip(uint32,address,bool)", +"1d90824b": "getMinPrivateSaleCompanyBuy()", +"1d90c509": "cardPresale(uint16)", +"1d91bd9f": "transferPaymentAddress(address)", +"1d927f21": "userDraw(uint256)", +"1d93d8d9": "WaboToken()", +"1d9400c2": "ManagerProxyTargetMockV3(address)", +"1d9680a7": "oldWriteMessage(string)", +"1d96d4c9": "VIRES()", +"1d976e05": "transferMultiple(address,uint256[])", +"1d978f9e": "ContributionRegistered(bytes32,address,uint256)", +"1d981758": "__signatureIsValid__(address,bytes32,uint8,bytes32,bytes32)", +"1d98532f": "_computeTournamentCut(uint256)", +"1d98f3c5": "safeTransferChild(uint256,address,address,uint256)", +"1d991ffe": "IsBoilerValid(address,uint256)", +"1d9976e9": "LedgerRandomProofVerifier()", +"1d9b0783": "withdraw(uint128,address)", +"1d9b1d6f": "schedule(uint256,uint256)", +"1d9b1d85": "ReFund()", +"1d9bd2b9": "totalSoldOnICO()", +"1d9becf5": "CatAdopted(bytes5,uint256,address,address)", +"1d9caa69": "sendMessage(address,string,string,uint256)", +"1d9cfd6d": "setSale()", +"1d9d1bdc": "buyTradeConfir()", +"1d9d281d": "add0xbtcnnAddresses(address,address)", +"1d9e6c34": "compose(string,address,uint256[])", +"1d9f3cb5": "changeSaddleShopPrice(uint256,uint256)", +"1d9f4f88": "VetCoin()", +"1d9f68ad": "updateMaxBonusTickets(uint256)", +"1da05199": "hasAvailableCard()", +"1da09dd5": "getUserActionOnStory(bytes12,address)", +"1da0fb1b": "updateSettings(uint256,uint256,uint256,uint256,uint256,bool)", +"1da16e8b": "FirstSaudiToken()", +"1da26a8b": "setToken(address,address)", +"1da2d92b": "IDRT()", +"1da3f151": "presaleVolumeBonus(uint256)", +"1da4eb7a": "_secondUnlockAmmount()", +"1da4ed85": "setRewardPool(uint256)", +"1da55b9f": "YeedToken(uint256,address)", +"1da5f94d": "acceptableAddress()", +"1da6822c": "testThrowsTransferEnableNotTransferable()", +"1da74e77": "wtToken()", +"1da790a1": "showTopWinners()", +"1da83550": "setWinner(address,uint256,uint256,uint256)", +"1da83eab": "canDefrostReserveAndTeam()", +"1da88cbe": "getNew(address,bytes32)", +"1da93873": "baseTokenPrice()", +"1da97544": "ETHtoZWeirate()", +"1da97ea3": "getSenderFromData(address,bytes)", +"1da97f36": "HunterCoin()", +"1da98538": "totalMEATonsClaimed()", +"1da9ea0c": "hardCapInTokens()", +"1daae314": "secondStagePriceOfTokenInWei()", +"1dab2271": "setSuggestedAdPrice(uint256,uint256)", +"1dacad8a": "CentralizedOracle(address,bytes)", +"1dacd8fd": "buyDisciple(uint256,uint256,uint256)", +"1dad202f": "ctz64(uint64)", +"1dad57fa": "notifyCollateralNotReturned(uint256)", +"1dad63e4": "ERC20Standard(uint256,string,bool)", +"1daee82d": "secondLockAmount()", +"1daf779f": "SDpay(uint256,string,uint8,string)", +"1db021c0": "mintedCoins()", +"1db046ad": "OneToken()", +"1db05ab8": "FXNOW()", +"1db087db": "_setAllocation(address,uint256)", +"1db0ad5a": "firstUnlockTime()", +"1db0ffe9": "ECHARGE()", +"1db19959": "RATE_SALESTAGELAST()", +"1db1c805": "setDefaultReputationForManufacturer(bytes32,bytes32)", +"1db256e4": "WCCCOIN()", +"1db29a20": "getPlotInfo(uint256)", +"1db2bbe8": "allocationIndicator()", +"1db2ea77": "_91_MR()", +"1db38da2": "ClaimExecuted(uint256,uint256,address)", +"1db4012d": "newProject(string,string,uint8,address[],address)", +"1db4b07f": "rntToken()", +"1db4d7a2": "returnBalance(address[2],uint256[8],uint8,bytes32[2])", +"1db580fa": "foundersAllocation()", +"1db5ca3b": "becomeAgent(uint256,uint256)", +"1db5f974": "highBonus()", +"1db625c3": "newInvestCommission(uint256)", +"1db71ffb": "doLoops(uint256)", +"1db834f0": "NextDouble(address,uint256)", +"1db87be8": "receivingAddress()", +"1db890a6": "getCassetteSize_()", +"1db894fc": "signToApproveTokenControlInfo()", +"1db93968": "transferProperty(uint16,address)", +"1db9ec2c": "ENDDATE()", +"1dba92ab": "setKeys(address,uint256)", +"1dbb0bff": "buyBlock(uint256,uint256,bytes32,bytes32,bytes32,bytes32)", +"1dbb9867": "buyEggFee()", +"1dbbda4d": "bytesToUint(bytes20)", +"1dbc04ae": "setVestingToken(address)", +"1dbcc5ad": "RiesGraham()", +"1dbd21c3": "Daereum()", +"1dbdd617": "LILITHCOIN()", +"1dbdd792": "MIDGRADE_TYPE_COUNT()", +"1dbde6c7": "maxTokenSupplyICOEND()", +"1dbe342d": "TRND()", +"1dbe6508": "bobClaimsDeposit(bytes32,uint256,uint256,address,address,bytes)", +"1dbf3bc7": "spend(uint256)", +"1dbf79a3": "TicketGlobalChain(uint256,string,string)", +"1dc05f17": "subtract(uint256)", +"1dc0819e": "_isBreedingPermitted(uint40,uint40)", +"1dc1166f": "horseSold(uint256)", +"1dc17cce": "VALUE_DISTRIBUTION_KEY_OWNERS()", +"1dc18c45": "editNode(uint256,address,bool,address,uint8,bool)", +"1dc18f7a": "hashAmount(uint256,uint256)", +"1dc1c5e3": "payMoney()", +"1dc30bdb": "payJackpot5()", +"1dc3ac22": "setOwnerNickName(address,string)", +"1dc436cd": "getIDChildRelationshipCountOperationParentProductPositionReferenceBinding(string,address,uint256,uint256)", +"1dc45248": "getMoveCount()", +"1dc45c6d": "spenderDecreaseApproval(address,uint256)", +"1dc55c2d": "GetDividends(address,uint256)", +"1dc615bc": "checkIfAllARTDistributed()", +"1dc76e78": "buyPlayerDataRecord(uint256,uint256,uint256)", +"1dc7f1b4": "getaddressname()", +"1dc82285": "oldBalance()", +"1dc8a3bb": "B123Token()", +"1dc9186a": "updateWeiAmountShare()", +"1dc9a3b9": "transferDomainOwnership(bytes32,address)", +"1dc9bb48": "hasDividends()", +"1dcb0d36": "goBackToPreSale()", +"1dcb304b": "fipsGenerate()", +"1dcb66ff": "coordinatesOf(uint256)", +"1dcd0305": "toStr(bytes32)", +"1dcd5312": "editMessage(string)", +"1dcd9b55": "substring(string,uint256,uint256)", +"1dcdf215": "getCoursesCount()", +"1dce0b5c": "getNoteKeysCount()", +"1dce77b8": "Linkmanagement()", +"1dce79cf": "blockchainExchange(uint256,int256,bytes32)", +"1dcea427": "erc20token()", +"1dd0c71b": "myPendingPayment()", +"1dd1349d": "getNameHash(bytes32)", +"1dd14317": "setProtocolVersion(address,bytes32)", +"1dd14a96": "totalSupplyPaillier()", +"1dd15fca": "tokenInWhiteList(address)", +"1dd16db6": "customBonus()", +"1dd17e7d": "setPreSaleParameters(uint256,uint256,uint256,uint256,uint256)", +"1dd300ce": "lastWithdrawal()", +"1dd319cb": "burnFor(address,uint256)", +"1dd46c1e": "getTxCount()", +"1dd4914b": "withdrawEtherOrThrow(uint256)", +"1dd49208": "getFeed(uint256,uint256,uint256)", +"1dd49cae": "remWhitelist(address[])", +"1dd5301a": "PRICE_PREBUY()", +"1dd572a0": "fortune_sell(uint256,uint256,uint256)", +"1dd637d8": "emergencyProtectedMode()", +"1dd6f85e": "CreateLOK(address,uint256)", +"1dd72454": "TransferManual(address,address,uint256,string)", +"1dd7335c": "allocateDividendsToWinners(uint256,address[],uint256[])", +"1dd7cf6d": "getHumanInfo(uint256)", +"1dd80586": "getPlayerSpaceshipBattleStakePaidById(uint256)", +"1dd85687": "adminSetEnviroment(uint256)", +"1dd8f053": "minPriceInWeiForIco()", +"1dd95a98": "AIRDROPS_COUNT()", +"1dd9a3cf": "_sendEthereum(uint256)", +"1dda5c7d": "testFailSubBalanceBelowZero()", +"1ddabf7a": "friends(address)", +"1ddb9105": "creditVault(uint256,address,uint256)", +"1ddc0ef0": "audit()", +"1ddd303d": "setV_R3(uint256)", +"1ddd39cc": "addcoinslimit()", +"1dddbf07": "confirmExchange(address,uint256)", +"1ddde716": "advisorsAccount()", +"1ddf147f": "assignedDoublrContract()", +"1ddf9729": "IncomeTaxCalc()", +"1ddfd7db": "supportsTradingPair(address,address,bytes32)", +"1de012cd": "TRUST()", +"1de032a5": "setIsStudio(address,address,bool)", +"1de0e877": "proposedControllerPendingUntil()", +"1de14175": "setDelegadoDeEscuelaVerify(bytes32)", +"1de1441f": "remainingEPXSupply()", +"1de1ee7b": "addPublicKey(bytes32,address)", +"1de21b76": "P1()", +"1de22867": "BeatTokenPurchased(address,address,uint256,uint256)", +"1de250bf": "bless(string,uint256)", +"1de26e16": "deposit(bytes32,uint256)", +"1de271a4": "cap_tmx()", +"1de28857": "getShareBalance()", +"1de38038": "makercoin(uint256)", +"1de3d4b9": "ReleaselockAddress(address)", +"1de4334a": "get_time_locked_contract(uint256)", +"1de46a78": "admin3()", +"1de473ea": "setC4FContractStatus(address,uint8)", +"1de54fcd": "unlockedNowBalanceOf(address)", +"1de7f3e3": "setBankrollpercentage(uint256)", +"1de95d74": "AREFWallet()", +"1de98d93": "deleteUserByEmail(bytes32)", +"1dea0c57": "getRealBet(uint256)", +"1dea157f": "getPaintingArtist(uint256)", +"1dea3f0c": "recordOffchainPurchase(address,uint256,uint256,string)", +"1dead827": "_percentSoldInICO()", +"1deb0a8f": "changeState(bool)", +"1deb112b": "initialSupplyPublicPreICO()", +"1deb9b9e": "EventBid(address,uint32)", +"1debbe2f": "addExp(uint256,uint32)", +"1dec8585": "getCurrentStageByTime()", +"1ded2d87": "Transaction(address[2],bytes,uint256,bytes32[2],uint256[3],bytes32[3],bytes,bytes)", +"1ded319d": "numberOfClaimed(address)", +"1ded587c": "Hotlist()", +"1dedc6f7": "consume()", +"1def4c9d": "TransferToBTCoE(uint256)", +"1def5033": "taskArray()", +"1df0187b": "BONUS_AMOUNTS_VALUES(uint256)", +"1df025d6": "updateGoalCheck()", +"1df0e359": "createForecasting(uint256,uint256,uint256)", +"1df13f28": "ICOBonusPercent2week()", +"1df19259": "Khabayan()", +"1df1ec82": "getProviderOwner(uint256)", +"1df224c1": "privateToken()", +"1df2bcbc": "setPresaleCont(address)", +"1df36e63": "delInvestor(address)", +"1df3e8a9": "GuardaProva(string,string,string,string)", +"1df411a6": "setOfferTime(uint256)", +"1df4241f": "StatEvent(string)", +"1df473bc": "newContract(bytes)", +"1df47aad": "ReplayProtection()", +"1df4ccfc": "totalFee()", +"1df4f144": "multiply(int256)", +"1df5a8f4": "GlobalBTC()", +"1df5e755": "Etherandom()", +"1df68102": "createSellOrder(uint256,uint256)", +"1df6d86e": "_buyLeader(uint256,uint256)", +"1df73f51": "getFreeSperm()", +"1df87cad": "raiseBuyOrderCancelled(address,uint256,uint256,uint256,uint256,uint256,int160)", +"1df8eaa2": "showAuthorizerTwoAmount()", +"1df93558": "fundingStartTime()", +"1df95786": "envelopes(uint256)", +"1dfa0cf6": "ConfirmDispose()", +"1dfa3ca8": "thirdPartyInvestments(address,uint256)", +"1dfa6329": "finishPVE(uint32)", +"1dfbf227": "makeInvestment(address,string,uint256,uint256)", +"1dfc91d4": "TokenPresalePurchase(address,uint256,uint256)", +"1dfd04b9": "buyEmptyPixel(uint256)", +"1dfd1ddd": "ListNotValSince(uint256)", +"1dfde4a5": "test_insert_findWithHintPrevAtPosition()", +"1dffa3dc": "cancelJob(uint256)", +"1dffd012": "getUserManager()", +"1dffdbe6": "trade(string,uint256,uint256)", +"1e0018d6": "investor()", +"1e010439": "getBalance(uint256)", +"1e0197e2": "tournament()", +"1e01a0e6": "doit(address)", +"1e01a172": "issueDescription(uint256)", +"1e021b2b": "getproductstatus()", +"1e02bf62": "checkOutstandingQueries()", +"1e02f805": "newInvestment(address,uint256)", +"1e031a00": "QuickFlip()", +"1e0419d4": "finalWinner()", +"1e04e856": "depositEth(address,address)", +"1e04eee9": "mintChipUnsafely(uint256,bytes32)", +"1e0582e9": "_daysFromDate(uint256,uint256,uint256)", +"1e05e0c8": "bonusesForTimesCount()", +"1e0610f6": "getRealty(address,uint256)", +"1e063d98": "MRDSTSCoinToken()", +"1e06c41f": "saleStartUnixTime()", +"1e06e25e": "Zoo721(address)", +"1e075aba": "batchUnlockVestedTokens(address[])", +"1e08045d": "getOwnedTanks(address)", +"1e084558": "licenseInfo(uint256)", +"1e08d687": "removeSubcontract(address)", +"1e095eb3": "GHPToken()", +"1e0976f3": "receiveVerification(uint256,uint256,uint256,bool)", +"1e09e67b": "Rasthen()", +"1e0a0f60": "info_CanBeClaimed(uint256)", +"1e0a24b1": "revertIfReturnLessThanMin()", +"1e0b760c": "Cancel(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", +"1e0b8c87": "hasSkills(address,uint256,uint256,uint256)", +"1e0c60e2": "SGem()", +"1e0c7ed4": "setConfigBool(bytes32,bool)", +"1e0e17a2": "claimMistake(bytes32)", +"1e0e3925": "numElements()", +"1e0e7c2b": "KODOKv()", +"1e0efae1": "claim_devidend()", +"1e0f6ed8": "TokenSaleFinished(uint256,uint256,uint256,uint256)", +"1e0f9795": "getNewFib(uint256)", +"1e11764e": "GameFinished(uint256,uint256,string,uint256,address)", +"1e120efb": "showEducationDetails(uint256)", +"1e1401f8": "getReturn(address,address,uint256)", +"1e141bb0": "releaseTime4()", +"1e14c48c": "setTokenFeeWithdraw(address,uint256)", +"1e14d823": "addMarketplaceContract(address)", +"1e16521b": "fulfillBurnRequest(uint256,string)", +"1e16980c": "setUnburnableWallet(address)", +"1e171d7c": "hasFunded()", +"1e172e90": "TransferHappened(uint256,bytes32,address,address)", +"1e1781af": "unfreezeAccount(address,bool)", +"1e179ae0": "getToken(bytes32,uint256)", +"1e17f292": "getAPRTx(uint256)", +"1e185b2a": "BTEcoin()", +"1e186e4c": "TestERC20()", +"1e18c404": "huroc()", +"1e191c0f": "goalSale()", +"1e1a48cf": "transferMethodId()", +"1e1a4eef": "setShareTokenAddress(address)", +"1e1a90a6": "onPayout(address,uint256)", +"1e1ad51c": "getFunding_Old(uint256)", +"1e1b13c0": "coinAge()", +"1e1b2e0f": "getLotteryPrizesLength(uint256)", +"1e1c72f4": "requestFreezeAccount(address,string)", +"1e1c86b7": "CCProject()", +"1e1d237e": "getSortedArray(uint256[])", +"1e1d696a": "changeLibAddress(address)", +"1e1ddacc": "saleController()", +"1e1e0a5e": "doHash(string,uint32,string,string)", +"1e1e3e0f": "vaultBalance(string)", +"1e20363a": "setTokenMetadataBaseURI(string)", +"1e204acf": "HODLrSoldWin(address,uint256,uint256,uint256)", +"1e20b4b9": "allocateAllUnsoldTokens(address)", +"1e215f70": "gbtAddress()", +"1e217bf8": "releaseUnclaimedFunds()", +"1e223143": "getFirst()", +"1e22648a": "setSnapshotBalance(address,uint256)", +"1e2273a7": "convert256ToReal(uint256)", +"1e22ffa5": "ClickRUB(uint256,string,string)", +"1e23300b": "createDiamond(string,address,string,string,string,string,string)", +"1e2466c6": "ICOTerminated()", +"1e24e029": "createRequestAsPayer(address[],int256[],address,uint256[],uint256[],string)", +"1e25dc54": "transFee()", +"1e2629e1": "initiateMigration(address,address,address)", +"1e26fd33": "setBool(bool)", +"1e273649": "getCountPartipants()", +"1e275d5f": "mock_getUInt(address,address)", +"1e279a37": "get_balance(address)", +"1e27a965": "JullarCrowdsale()", +"1e27ae4d": "getRecordHolder(uint256)", +"1e28a3a5": "attachCrowdsale(address,address)", +"1e28ba20": "YeojinToken()", +"1e28f29b": "initialTiers()", +"1e2a7105": "FromQueue(address)", +"1e2a9d4c": "topup(address,address,uint256)", +"1e2aebf9": "ETHERCREDIT()", +"1e2b6db2": "getBdpEntryPoint(address[16])", +"1e2bdfdf": "setAdvPrice(uint256)", +"1e2c23b3": "toEth(uint256)", +"1e2c74f6": "kill(bool)", +"1e2ca0f3": "updateLeftLottery(address)", +"1e2d5651": "totalContrib()", +"1e2da3e9": "PawsCoin()", +"1e2def3a": "saleStopTimestamp()", +"1e2e35a4": "sellPoohs()", +"1e2e3a6b": "getExchanges()", +"1e2e7a06": "registrationTime()", +"1e2ed152": "ECO_SYSTEM_BONUS()", +"1e2f48da": "assertOwnersAreConsistent()", +"1e2fc4f7": "test_mint()", +"1e2fee94": "CatDestinity()", +"1e2ff94f": "currentTimestamp()", +"1e2ffcef": "Show_All_Company()", +"1e30397f": "isValidName(string)", +"1e30b599": "Processables()", +"1e31264d": "_premiumPricePer30Days()", +"1e3339f0": "MTT()", +"1e335962": "token_multiplier()", +"1e33a6d5": "setGasUsage(bytes4[5],uint256[5])", +"1e34c585": "setConfig(uint256,uint256)", +"1e35e567": "fetchOrderByIdWithMerchant(string)", +"1e36d755": "sendTokenToOwner()", +"1e372dd3": "Advanced_Anemoi(uint256,string,string)", +"1e375ab9": "claimReferralBonus()", +"1e38046c": "address3()", +"1e38a011": "setRoutePrice(uint256)", +"1e391738": "minimumGoalInWei()", +"1e39499d": "scheduleCall(address,bytes,uint256)", +"1e3a5831": "Claimable(address)", +"1e3b92b4": "getGalaxy(uint256)", +"1e3b9de5": "getClaimant(address)", +"1e3ba116": "_supportsAllInterfaces(address,bytes4[])", +"1e3ba941": "StexTalk()", +"1e3c73bd": "BdpPriceStorage(bytes8)", +"1e3c9352": "grant(address[])", +"1e3d9c04": "removeLink(address,bytes)", +"1e3e6369": "GetMySnail()", +"1e3ea569": "SentTokens(address,uint256,uint256,uint256)", +"1e3f11ee": "getPlayerGeneralAttr(uint64,uint8)", +"1e3faf22": "airdropNum1()", +"1e40375f": "killTo(address,bytes32)", +"1e4092e5": "FOUNDER_AMOUNT()", +"1e4146b0": "generateCombinationKey(uint8[4])", +"1e41583b": "reclaimElement()", +"1e41be58": "deleteApplication(string,bool)", +"1e41f63e": "viewAll(string)", +"1e42698b": "setScrapAuctionDuration(uint256)", +"1e440e02": "TKCDStandardToken(uint256,string,uint8,string)", +"1e442919": "getAccessoryLockStatus(uint64)", +"1e4433c4": "getVar(string)", +"1e44b919": "KAPAYcoin(uint256,string,string)", +"1e44c112": "find_strike(uint64,uint32,uint32)", +"1e44e6af": "setPI_edit_10(string)", +"1e4532f1": "balances_bonus(address)", +"1e45de61": "GetWinningAddress()", +"1e4623e1": "segmentHash(string,uint256,bytes32)", +"1e464460": "AscendGod()", +"1e466eee": "triggerVolcanoEruption()", +"1e49d5ab": "getUserInfoAndConfig(address)", +"1e4a126e": "BeforeChipObtain(uint32)", +"1e4adcf7": "weiDonated(address)", +"1e4b5652": "setKNCRate(uint256)", +"1e4ba4d4": "swap(uint256,address,address,uint256,uint256,uint256,uint256)", +"1e4bb033": "HcoinToken()", +"1e4bd42c": "claimAllTokens()", +"1e4bdf27": "TransferActive()", +"1e4bffde": "_getBegin(int256)", +"1e4c6e7e": "gatito()", +"1e4c6f7c": "base_token_seed_amount()", +"1e4c7736": "updateManyLandData(int256[],int256[],string)", +"1e4ccdc4": "resultDraw()", +"1e4d17c5": "setFundraiserAddress(address)", +"1e4df315": "HRChainERC20()", +"1e4df938": "referralPool()", +"1e4f95c7": "pipeMoney()", +"1e504c9c": "setRegisterPrice(uint256)", +"1e5140dd": "closeTradeProfile(bytes,bytes32)", +"1e516c32": "OMIVIATEST()", +"1e519c4c": "getCurrentModifier()", +"1e51a907": "getServiceNames(bytes32,address[],address)", +"1e51cb10": "_MineId()", +"1e5253a4": "RegisterShareholder(address)", +"1e5296ef": "getMySellOrdersBlackMarketComplete()", +"1e52aa52": "startBetRed()", +"1e52ca35": "ROLE_SUPER()", +"1e52f7b5": "accoutToPayLevel(address)", +"1e5330ca": "checkBetResult(uint8,address,bytes32,bytes32)", +"1e5393cf": "setDividendAndPayOut(uint32,uint32)", +"1e53a3a0": "SetContracts(address,address)", +"1e53efe0": "getBonusAmount(uint256)", +"1e542fd4": "AddLock(address,uint256,uint256,uint256,uint256)", +"1e550ca2": "carTaxiTokenAddress()", +"1e552efc": "MarnieCoin()", +"1e5571bc": "getTankSell(uint32)", +"1e561d5e": "createSellingProposition(address,uint256,uint256,uint256)", +"1e566dae": "_moveToken(address,address,uint256,bytes,address,bool)", +"1e567582": "gxc()", +"1e57e3bb": "EtherReceived(address,uint256)", +"1e580615": "cashIn()", +"1e5890c4": "saveResult(uint256)", +"1e59b53f": "Medallion()", +"1e59c529": "register(string,address)", +"1e5a652b": "MDICOStage1(address,address,uint256,uint256,uint256,uint256)", +"1e5b433b": "testTransferControl()", +"1e5bd14a": "setRegulator(address,bool)", +"1e5c6176": "BitChordCrowdsale(address,address)", +"1e5d1a4c": "End(string)", +"1e5d2e41": "geneCore(uint256,uint256,uint256)", +"1e5d2e78": "_updatePools(uint8,uint256)", +"1e5d629d": "createChannel(bytes32,address,uint256,address,uint256)", +"1e5e668f": "fetchDataMain()", +"1e5e8aa9": "token_rate()", +"1e5f34af": "sub(uint8,uint8)", +"1e5f3569": "createEIP20(uint256,string,uint8,string)", +"1e5f35f3": "Prover()", +"1e5f9149": "getWinner(bytes32)", +"1e5fc8e7": "bonusThirdWeek()", +"1e5ff41a": "tier5()", +"1e6000c2": "AffiliateReceived(address,address,bool)", +"1e6090f4": "isContractDeprecated()", +"1e60ab84": "PalaceResidence()", +"1e625935": "SelfPayPreSale(uint256,uint256,uint256,uint256,uint256,address)", +"1e626456": "tokenFallbackData()", +"1e6288fa": "soldTokenValue()", +"1e629a75": "StartNextStage()", +"1e62a511": "cHWCtoEth()", +"1e62a915": "set_participant_topl_address(address,uint256)", +"1e62be25": "Bytes32Passer()", +"1e639798": "reset(address,address,address,address,address,address)", +"1e63b3d3": "bancorConverterAddress()", +"1e658b74": "_userSignUp(string,address)", +"1e659135": "PVBToken()", +"1e65dc88": "EtherMemes()", +"1e6704bd": "maintenanceSetAccountsList(address[])", +"1e688c14": "fulfillBounty(uint256,string)", +"1e6b0e44": "finderFee()", +"1e6b4c6f": "setStakePeriod(uint256)", +"1e6bd462": "getAllGamesCount()", +"1e6c3d0e": "BLACKCOIS()", +"1e6c593c": "checkClaim(string,string)", +"1e6d4180": "stageBonus()", +"1e6d58ce": "AHA_Token()", +"1e6e5d81": "addContact(bytes32,address)", +"1e6efc83": "setRestartGamePeriod(uint256,string)", +"1e6f01a7": "setPI_edit_23(string)", +"1e6f9c1e": "adjust_Transfer_data(bool)", +"1e701780": "MICRODAO(address,uint256,uint256,uint256,address)", +"1e70a239": "getAllGiftTemplateIds()", +"1e711ec0": "plan_active_time()", +"1e7230c5": "benReady()", +"1e7231b6": "disablePhenomenon(bytes32)", +"1e724447": "icoTill()", +"1e725589": "getAddressesFromUsernames(string[])", +"1e72a7fc": "calculateVariation(uint64,uint64,int64)", +"1e72d642": "BezantToken()", +"1e737709": "getSourceValue(uint256,uint256,uint256)", +"1e73b362": "withdrawContractEther(uint256)", +"1e7401d9": "ArconaToken(uint256,uint256,address,address,address,address,address,address,address)", +"1e7421a2": "changeKYC(address,bool)", +"1e745e61": "createContest(string,uint256)", +"1e74a2d3": "getMinimumEndowment()", +"1e74c414": "WashExchange()", +"1e7527b0": "setOwner(uint32,int256,address)", +"1e75c12d": "ETLTokenPresale(address)", +"1e7769de": "tryForcePublic(uint16)", +"1e77933e": "change(address)", +"1e77b2e0": "updateRate(string,uint256)", +"1e78cfe1": "minimumPayout()", +"1e79933f": "removeTagByModuleType(uint8,bytes32[])", +"1e7a505f": "register(address,bytes32)", +"1e7a5bf7": "testMintAuth()", +"1e7ae71f": "owner1Of(uint256)", +"1e7be210": "whitelists(address)", +"1e7bef65": "setIncubatorContract(address)", +"1e7c20ac": "getCompte_24()", +"1e7c27cb": "ADMIN_CONTRACT()", +"1e7c402b": "test_percOf2()", +"1e7cedb7": "TKTToken()", +"1e7d84cb": "getproduuct(uint256)", +"1e7de8cc": "setChibiGEN0Price(uint256)", +"1e7e2064": "addPeers(address[])", +"1e7e4b5e": "PREISSUED_AMOUNT()", +"1e7ea8d5": "getFreelancerCategories(address,address)", +"1e7fa008": "amountRemaining(address,bytes32[])", +"1e801c8c": "sealForChanges(uint256)", +"1e81086d": "setDirectMintAgent(address,int256)", +"1e815fcd": "isBuyOpen()", +"1e81ccb2": "pings()", +"1e820325": "finalizeRound()", +"1e822140": "transferToLockedBalance(address,uint256)", +"1e829230": "createGrant(bytes32)", +"1e82965e": "DCTR()", +"1e83409a": "claim(address)", +"1e83bab7": "singleInvokeWith2Args(address,string,address,uint256)", +"1e83cdab": "extract()", +"1e83ce17": "houseFeeThreshold()", +"1e83e697": "setTokenOptions(bool,bool,bool)", +"1e841271": "setTestFee(uint256)", +"1e84c725": "emergencyTransfer(address,address,uint256)", +"1e85107c": "bonusPercentages(uint256)", +"1e8551e3": "voteRewardPerUnit(uint256)", +"1e85e8f0": "TLN_TOKEN_SYMBOL()", +"1e860d43": "setNewInvestorsList(address)", +"1e86ccf5": "setOperatorCommission(uint256)", +"1e871309": "rewards_id(uint256)", +"1e872f55": "setPlayerLastUpdateTime(address)", +"1e8784c9": "SabrinaToken()", +"1e87fe1d": "setSmallCapWhitelistParticipant(address,uint256)", +"1e8812f3": "BonusCrowdsale(uint256)", +"1e891c0a": "setTimelock(uint256)", +"1e892c21": "returnForRedemption(uint256,uint256,uint256)", +"1e893437": "stageClose()", +"1e8997ec": "PUNCToken()", +"1e89c83b": "read_where_gadget(uint256)", +"1e89d545": "multiTransfer(address[],uint256[])", +"1e8a98cf": "UP_totalBets()", +"1e8b0d03": "EventBankrupt()", +"1e8b31dc": "batchPay(address[],uint256[],address[])", +"1e8bf006": "getNumbersFromString(string,string,uint16)", +"1e8bf1f9": "readInt256s(bytes32[])", +"1e8c72b4": "incrUserAvailBal(address,uint256,bool)", +"1e8d1510": "KeyFund(uint256,uint256)", +"1e8d15f8": "LasVegas()", +"1e8f11ab": "candleCost()", +"1e8fba36": "fortifyClaim(address,uint16,uint256)", +"1e909841": "getEmployerContracts(address,address)", +"1e912334": "maxDonors()", +"1e923f1b": "myAddr_test()", +"1e924bf8": "tokensReleasedPerPeriod()", +"1e92a65c": "teamAmounts()", +"1e935ab1": "requestPause()", +"1e93c209": "powerPool()", +"1e93d358": "multiStake(uint256,uint256,uint256,uint256,uint256)", +"1e9447f3": "hasDuplicate(string)", +"1e9493d8": "ETH_MAX_GOAL()", +"1e962e62": "F0002Token()", +"1e96bf0e": "separate(address,uint256)", +"1e9824ee": "setExchangeRates(uint8,uint8)", +"1e982b40": "saleOverInTime()", +"1e98d334": "initRace(uint8[4])", +"1e98d54a": "addGlobalConstraint(address,int256,bytes32,address)", +"1e9a04a7": "secondRoundICOStart()", +"1e9a6272": "onDelivery()", +"1e9a6950": "redeem(address,uint256)", +"1e9b1312": "accountAddress()", +"1e9b91db": "VictorieumNewICO2Token()", +"1e9be6a1": "usdEthPrice()", +"1e9bf0da": "disown()", +"1e9cefa3": "updateEmployeeWallet(uint256,address)", +"1e9d2d28": "NewGame(uint256,bytes32,bytes32,bytes32,address,uint256)", +"1e9d3bc9": "LZXToken()", +"1e9d48cf": "checkUser(address)", +"1e9d8232": "TheGame(address)", +"1e9da16a": "n_domains()", +"1e9dd927": "kycVerify(address,bool)", +"1e9e541c": "TEAM_TOKENS2()", +"1e9e6949": "ActiveChanged(address,bool)", +"1e9e928e": "GBPValue()", +"1e9ea66a": "balanceEther10000000(uint256)", +"1e9eb554": "deathData_v14()", +"1e9f3c24": "ETH888CrowdsaleS1(address)", +"1e9f6dcb": "ticketsFaceToFaceSold()", +"1e9fcc77": "activateAllowance(address,address)", +"1ea06b9e": "_allowManualTokensGeneration()", +"1ea0d0de": "endRace()", +"1ea103d0": "Registra()", +"1ea134b9": "PeculiumOld()", +"1ea1380c": "getScores()", +"1ea1e522": "claimF()", +"1ea333ea": "_generateDutchAuction(uint256,uint256)", +"1ea3cae9": "addressToAccountMap()", +"1ea48870": "isFunder(address)", +"1ea5a292": "endorse(uint256,uint256)", +"1ea5efc4": "partner1_voted_update_marriage_status()", +"1ea6af82": "reward9()", +"1ea6b97f": "getTotalTokensOwed(address,uint16[])", +"1ea7b0f9": "Bilibit()", +"1ea82655": "generatePartnerTokens(uint256)", +"1ea8b099": "endMark()", +"1ea906b5": "leftTokens()", +"1ea90acd": "fetchOrdersForPayer()", +"1ea92826": "currentTierIndex()", +"1eaa6c4b": "firstTokenExchangeRate()", +"1eab0a95": "testingContracts()", +"1eabc116": "buy(uint16)", +"1eabef31": "YKToken()", +"1eada765": "getConditions(uint256)", +"1eae5ff9": "getWaitPreselled()", +"1eae85cb": "priceOfDate(uint256,uint256,uint256,uint256)", +"1eaec76f": "FENIX(uint256)", +"1eafe00c": "isAmendedEarlyPurchase(uint256)", +"1eb02078": "getUIntTypesCount(uint8[])", +"1eb21875": "artistManifestoFundAddress()", +"1eb22b45": "sellerDatabase(address,uint256)", +"1eb25d13": "InitialSupply()", +"1eb25e0a": "configure(uint256)", +"1eb3957b": "requestDelegatedFrom(address)", +"1eb42523": "update(address,address,address)", +"1eb4dac6": "endSecondWeekICO()", +"1eb55c51": "CEI()", +"1eb5cb66": "resume(string)", +"1eb5de94": "privateExchangeRate()", +"1eb5ea2e": "returnFunds()", +"1eb726af": "contractAddress(string)", +"1eb79e44": "gasForGR()", +"1eb8befb": "setNewMediator(address)", +"1eb92366": "setRecommenderMulti(address[],address[])", +"1eb96a5c": "cancelOwnershipOffer()", +"1eb96f7c": "MahalaToken()", +"1eb9ef91": "getAccountsForUser(address)", +"1eba7c7a": "setDefaultClaim(string)", +"1ebb24bc": "_postTransferHook(address,address,uint256)", +"1ebbc515": "MakerWithdrewAsset(uint256)", +"1ebbe681": "getWinningById(uint256)", +"1ebcbc93": "transferAdminShip(address)", +"1ebcdba4": "getWactive(uint8)", +"1ebcf2fb": "reclaimParsecCredit()", +"1ebd8263": "setMinimumBuyAmount(uint256)", +"1ebd8e6d": "XEVENUE()", +"1ebdaf8b": "testNewAccountHasZeroBalance()", +"1ebdd39a": "getWithdrawalData(uint256)", +"1ebde78b": "getSecondsTimeLockedByString(string)", +"1ebe1827": "EthLongExercised(address[2],uint256[8],uint8,bytes32[2],uint256,uint256)", +"1ebe5051": "StarzToken()", +"1ebe5c0f": "sendWithAllOurGasExcept(address,uint256,uint256)", +"1ebe8105": "tokenPriceUSDWEI()", +"1ebeb80b": "getBools()", +"1ebebb9b": "_checkAndSub(bytes32,bytes32)", +"1ebedded": "setAllRates(uint256,uint256,uint256)", +"1ebeec82": "_withdrawNAC(address,uint256)", +"1ebf0d11": "sellAllAmount(address,address,uint256,address,uint256)", +"1ebf1f5b": "hasSellerGuarantee()", +"1ebf42e5": "TokenAFL(uint256,string,uint8,string)", +"1ebfa2df": "getDiscountsAmount()", +"1ebfa358": "dateToTimestamp(uint16,uint8,uint8)", +"1ebfdca0": "servicesLength()", +"1ec29a5f": "getPurchasedAmount()", +"1ec32d15": "companyWallet()", +"1ec41163": "lastWinnerAddress()", +"1ec42d50": "_createWarrior(uint256,address,uint256,uint256,uint256,uint256)", +"1ec68b92": "saveMetaData(address,bytes,bytes32,bytes32,bytes32,bytes,uint32,uint256,uint256,bytes,uint256)", +"1ec6b60a": "startVoting()", +"1ec6dba6": "SimpleSaleToken()", +"1ec75025": "developerWithdraw()", +"1ec762a4": "setlvlWebsite(string)", +"1ec7cda4": "addTokenInternal(address,address,uint256)", +"1ec7e345": "tokenValue()", +"1ec87b86": "getTravelPrice(uint256)", +"1ec8a460": "AdifyToken()", +"1ec8bb8c": "distributeReward(address,uint256)", +"1ec8d4ef": "setMinBetForJackpot(uint256)", +"1ec8d5f7": "initialReleaseDone()", +"1ec8f9ba": "purchaseTickets(uint256[])", +"1ec9c2c0": "Sub(uint256,uint256)", +"1ec9f7b5": "longTimeLock()", +"1ec9fc84": "pendingFeesWithdrawals(address)", +"1eca98ce": "transferToAdvisors(address,uint256)", +"1ecb3889": "EurocoinB()", +"1ecb450e": "Devpr()", +"1ecc05f2": "validDelegate(address,string,address)", +"1ecc17c4": "pauseTransfer(bool)", +"1ecc56f2": "initTimeOf(uint256)", +"1ecc644f": "vestStage()", +"1ecca316": "nextFreeTier()", +"1ecd0d03": "PoSPerCent()", +"1ecd3f30": "tokenReserved4()", +"1ecd9f21": "calculateDrugBuy(uint256,uint256)", +"1ecdfd2f": "setIEIAddress(address)", +"1ecfd4c3": "takeToken()", +"1ecfe64d": "_jSub(uint256,uint256,uint256,uint256)", +"1ed01f61": "maxWagerWei()", +"1ed0c2cc": "LifeSet_004()", +"1ed0e01c": "ltdParams()", +"1ed113ae": "getSignature(bytes)", +"1ed1d0f7": "KryptoGiftsMessages()", +"1ed1f196": "pf(address)", +"1ed20347": "cfo()", +"1ed24195": "getPeriod()", +"1ed2730a": "createInvoice(uint256,address,address)", +"1ed27a14": "setPoliceNodesPerReport(uint256)", +"1ed358e6": "recycleAppearance(uint128[5],uint256,uint128)", +"1ed378a1": "getHybridizationPrice(uint256)", +"1ed454a5": "memberLevel(address)", +"1ed5336b": "changeExerciseprice(uint256[],uint256[],uint256[])", +"1ed5da2f": "Controller_Address1()", +"1ed64f7b": "is_king_for_sale()", +"1ed692c0": "finalizeCrowdfunding()", +"1ed6a6ab": "emitFeeAuthorityUpdated(address)", +"1ed6f423": "changeDescription(address,string)", +"1ed77dc8": "presaleWallet()", +"1ed7830e": "partnerWallet()", +"1ed83fd4": "setHash(string)", +"1ed8f023": "BlockableContract()", +"1ed96e32": "disableTransmit()", +"1eda49be": "AheVotingBrainfood2()", +"1eda61d4": "customBonuses(address)", +"1edb0e73": "GILToken()", +"1edc44ed": "GameCoinToken()", +"1edc5ce0": "SUPPLY_FOR_MARKETING()", +"1edc8f03": "withdrawalEth(uint256)", +"1edc8f91": "openAuction(uint256)", +"1edd19e1": "bidExpireBlockLength()", +"1ededc91": "repayBorrowVerify(address,address,address,uint256,uint256)", +"1edf0c1e": "lockAndDraw(address,bytes32,uint256)", +"1edf0c3d": "TESTTOKEN()", +"1edf49ff": "myFirstToken()", +"1edfdb48": "addjoinlist_odd(address,uint256)", +"1ee04a3d": "TLTContract()", +"1ee13d0a": "creditDao()", +"1ee1665d": "WAMToken()", +"1ee17afd": "Thief()", +"1ee185ad": "roleRemove(address,string)", +"1ee284b1": "rockOwners(address,uint256)", +"1ee2e3cf": "unsetBlacklist(address)", +"1ee2fe6a": "defreeze(address,uint256)", +"1ee392c6": "getMaxProfitAsPercentOfHouse()", +"1ee426e1": "Eth2preNSP(uint256)", +"1ee44a5e": "listRequire(string,uint256,uint256,uint256)", +"1ee45da0": "sellEndTime()", +"1ee53e56": "presaleRate(address)", +"1ee55080": "getMotherCount(uint32)", +"1ee5f936": "stopTeamTokenTransfer()", +"1ee7c4bc": "LogNewAllocation(address,uint8,uint256,uint256)", +"1ee7ccc7": "preIcoInvestorsAddresses(uint256)", +"1ee952ad": "getPhysician(address)", +"1ee97dda": "_intervalFor(uint256)", +"1ee9f029": "PREICO_HARDCAP()", +"1eea92c1": "levelExpAdjustment()", +"1eeaa389": "lockSupply(bool)", +"1eeac5d5": "TradelizeToken(uint256)", +"1eebb48c": "___test(address,address)", +"1eeccead": "tokensAlreadyMinted()", +"1eed0347": "applicationNameHashTaken(bytes32,bool)", +"1eed0f27": "setPriceUSD(uint256)", +"1eed1192": "newUser(string)", +"1eed4e09": "getVoteBy(address)", +"1eee993a": "addChild(address)", +"1eef94bd": "setAwardedUnfreezePeriodSeconds(uint256)", +"1eefddb1": "grace()", +"1ef0625b": "player_2(uint256)", +"1ef085db": "price3rdWeek(uint256)", +"1ef09ccf": "executeDelegateCall(address,uint256,bytes)", +"1ef17972": "ChangeOwner(bytes32,address)", +"1ef2c6d1": "closeTurnByHand(uint256)", +"1ef31b0d": "erotixFund()", +"1ef3755d": "restart()", +"1ef410e2": "addAudit(uint256,bool)", +"1ef5b90f": "release_(address,uint256[],uint256[])", +"1ef60485": "returnAccounts()", +"1ef741fd": "interestPeriod_()", +"1ef75084": "getCompoundPlan(uint256)", +"1ef75b1a": "GGToken(address,string,string,uint256,uint256)", +"1ef7b68a": "purchaseReceiptById(bytes32)", +"1ef8766f": "reserveTokens(uint256,uint256,bytes)", +"1ef987c1": "getInvestedAmount(address)", +"1efad671": "isPreSaleReady()", +"1efb06e0": "LogNewWallet(uint256,address)", +"1efb17ee": "changeHouseAddress(address)", +"1efba6c2": "fixedPrice()", +"1efdebb2": "hodlersCount()", +"1efe3abf": "getNumTasks()", +"1eff2b2f": "advisorIssueVesting(address,uint256)", +"1effc0d8": "createPerRound()", +"1f00c55b": "TOKENS_CAP()", +"1f0276fc": "_getKey(bytes32,uint256)", +"1f03bc1b": "setNewUserBonusCardTradable(bool)", +"1f049a49": "tokensBank()", +"1f04b54c": "test_ConsensysReached()", +"1f04becc": "ppFinishTime()", +"1f05ff29": "fromWeiToFp(uint256)", +"1f065f56": "KangGuo()", +"1f06c859": "promises(uint256)", +"1f078962": "setFlowerContract(address)", +"1f078f56": "winTokens(uint256,address)", +"1f0815ce": "togglePromo(bool)", +"1f09b0a2": "getDisplayGenVault(uint256)", +"1f0a21ad": "setAdvisers(address[],uint256[])", +"1f0b2561": "getCurrentBonusPercentage()", +"1f0b5553": "setBalances()", +"1f0ba6c9": "trade()", +"1f0c03f4": "forwardEndTime(uint256)", +"1f0c1e0c": "getEventTokenAddress(bytes32,uint256)", +"1f0c5f26": "CashMove(uint256,bytes32,address,address)", +"1f0da298": "transferTokensAndEtherValue(address,address,uint256,uint256)", +"1f0de21c": "addrunmoney(address,uint256,uint256)", +"1f0f2ce4": "withdrawOrderRefund(uint256)", +"1f0f711f": "discontinue()", +"1f0fd191": "test_threeValidEqUint()", +"1f0fd905": "getAssetIdCargo(uint32)", +"1f101520": "preIcoMin()", +"1f107635": "ownerSetAdmin(address[])", +"1f1144dc": "ViewOffer(address,uint8)", +"1f11d503": "GameSicBo(string,uint256,uint256,uint256)", +"1f124116": "approveSettingUpdate(uint256,bool)", +"1f12da06": "getPropertyPrivateModeLastUpdateEarnUntil(uint16)", +"1f130761": "tokensSent()", +"1f130d1f": "insertAddress(address)", +"1f13b5ae": "NokuMasterToken(uint256,uint256)", +"1f13de92": "inEther(uint256)", +"1f13f165": "NecromeunToken()", +"1f14df69": "balances(address,bytes32)", +"1f150322": "LogUserUnregistered(address,address)", +"1f15bc1b": "disallowTransfersTo(address)", +"1f15e163": "LaunchRocket(uint32,uint32,uint32,uint32,uint32,uint32)", +"1f161533": "distributeXYZ(address[],uint256)", +"1f167829": "nextDraw()", +"1f16c8b9": "getEndDateOfCampaign(bytes32)", +"1f16fda4": "multiTransfer(address[],address,uint256[])", +"1f1836fa": "isPresalePurchase()", +"1f1886e4": "extendSale(uint256)", +"1f18e56e": "removeOwnersWithHowMany(address[],uint256)", +"1f194b9f": "getFreeKilo()", +"1f1953ad": "addPokemonToMaster(address,uint256)", +"1f1aea6e": "initSale3(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"1f1b11cc": "buyMinerFromSale(uint256)", +"1f1bd005": "getRocCoreAddress()", +"1f1bd692": "text()", +"1f1c827f": "StartGame(string,string)", +"1f1c84b7": "decreasePresetTransfer(address,uint256)", +"1f1cb62b": "peg()", +"1f1dc61b": "checkPayLoan()", +"1f1de456": "regName()", +"1f1e1295": "isApprove(uint256)", +"1f1e2cfa": "calcUnMaskedEarnings(address,uint256)", +"1f1e6c4e": "createCollectible(uint256,uint256,address)", +"1f1ea554": "HolahopToken()", +"1f1ec029": "updateKeyPrice(uint256)", +"1f1eef6b": "getContributionHashByIndex(uint256)", +"1f1f5e76": "addValueToContribution(uint256)", +"1f1f8240": "_parseIntScientific(string)", +"1f201d7e": "level_judgment(address,address)", +"1f201e39": "etherandomExecWithGasLimit(bytes32,bytes32,uint256,uint256)", +"1f20f762": "losingAmount(address,uint256)", +"1f212106": "startICOStage7()", +"1f218cf1": "ICO_PERIOD()", +"1f21f9af": "marketMaker()", +"1f220be0": "unlock(string,bytes32,address,address,uint256)", +"1f221d4c": "updatePublicityBalance(address,uint256)", +"1f227fc8": "importTokensFromSourceToken(address)", +"1f23a9bc": "getAcceptedAndRejectedVotes(uint256,uint256)", +"1f23c22b": "getOpenBids(bytes32)", +"1f25cfaf": "changeBot(address)", +"1f261939": "payBid(bytes32,uint256)", +"1f2698ab": "started()", +"1f275713": "prefixed(bytes32)", +"1f278d32": "MyartPoint()", +"1f27a8b5": "set_transferrable(bool)", +"1f28c821": "tokensPreMinted()", +"1f296600": "brickETHPrice()", +"1f299c1a": "updateRegistry(bytes32,address)", +"1f29bdcf": "setAStore(string,address,address)", +"1f2a3e06": "scissors()", +"1f2c6414": "getAddressBatchByUsername(bytes20[])", +"1f2d62bc": "gameStartedAtBlock()", +"1f2d8d66": "getNumberVote(uint256)", +"1f2dc5ef": "divisor()", +"1f2e5461": "LOUDEX()", +"1f2e886c": "testControllerTransferTriggersEvent()", +"1f2e97c8": "slaveWalletPercentInitialized()", +"1f2ea6e0": "dealership(address)", +"1f2ec9c9": "setHoldAmount(address,uint256,uint256)", +"1f2efa83": "allocateIntoHolding(address,uint256,uint256)", +"1f2f7fc3": "dispute(uint256,uint256)", +"1f305ec7": "removeFromKycTeam(address)", +"1f30edc7": "CTOSignature()", +"1f312375": "referralBonusRate()", +"1f32768e": "getSubscription(bytes32)", +"1f32c18f": "getDrink(uint256)", +"1f34556a": "changeMaxReward(uint256)", +"1f34563c": "newUser(string,string)", +"1f34d1d3": "registerAppVersion(bytes32,bytes32,address,bytes4[],address[])", +"1f35bc40": "setCrowdsaleAddress(address)", +"1f3634ed": "ink(bytes32)", +"1f368fa6": "ExtrabitToken()", +"1f378b8a": "refundEther(address)", +"1f38034c": "removeEmailAddress(string)", +"1f38c358": "allocateIds(uint32)", +"1f390975": "MAX_TOTAL_CONTRIBUTIONS()", +"1f3943df": "SURT(uint256)", +"1f39716c": "aggregateBet(uint256,uint256)", +"1f39a141": "getTokenAmount(uint256,address)", +"1f3a3a53": "mint(int256,uint256)", +"1f3a4c14": "addFreezableAddress(address)", +"1f3a7c0b": "FOUR_YEAR_KEEPING()", +"1f3a98d1": "getReferralRates()", +"1f3b3148": "endEpochTimestamp()", +"1f3bec3b": "secondarySaleReserveWallet()", +"1f3c99c3": "logout()", +"1f3ce938": "increasePresaleEndTime(uint256)", +"1f3ceb51": "getGameById(bytes32)", +"1f3d3261": "JustForward(uint256)", +"1f3dcc8d": "maxGasPricePenalty()", +"1f3e1c8d": "LogTokensPurchased(address,uint256,uint256,uint256)", +"1f3e50f6": "withdrawBCEO()", +"1f3e64e6": "getTXwithCode(address)", +"1f3ee21f": "setUsdEthValue(uint256)", +"1f3fd5ca": "PI_EDIT_1()", +"1f3fe8d1": "ICO_BONUS1_SLGN_LESS()", +"1f3fed8f": "tokensForMarketing()", +"1f400477": "inLendingMode()", +"1f402356": "markContractAsInited()", +"1f417317": "WalletSimple(address[])", +"1f42103c": "AworkerToken(uint256)", +"1f4356e4": "emissionFunds()", +"1f43f396": "startICOStage5()", +"1f4425f3": "checkCloseTimer()", +"1f44a40f": "airDropSame(address,address[],uint256)", +"1f44b1de": "ValithToken()", +"1f45006c": "checkEthRaised()", +"1f455922": "removeToken(string)", +"1f45ad5c": "modifyContentAccess(bytes32,bool,uint256)", +"1f461f0d": "withdrawableAmountFor(address)", +"1f468245": "calculateObtainedBUB(uint256)", +"1f46eb98": "agentPermission(address)", +"1f470b14": "lockUpAmountOf(address)", +"1f471ad0": "proxyMint(address,uint256)", +"1f47b50d": "MineablePOWCoin()", +"1f47ba29": "safeToMul(int256,int256)", +"1f4848ef": "setTakeFee(uint256)", +"1f48af0a": "updateWeapon(uint256,string,string,string)", +"1f48ff7c": "mintMarketMakerApproval()", +"1f49aff4": "ACLYDcid()", +"1f49caac": "canUseLock()", +"1f4a5c32": "confirmTransactionAfterExpiry(uint256)", +"1f4a6d32": "removeEth()", +"1f4ab41e": "createUser(bytes32,bytes32,uint256)", +"1f4ae468": "returnETHforNormalBuyers()", +"1f4b8e41": "getLastUpdateId()", +"1f4ca28f": "isAdvisorsTokensSecondReleased()", +"1f4d7ec4": "newParameterizerWithToken(uint256,string,uint8,string,uint256[])", +"1f4dba8e": "OPTinToken()", +"1f4dde9f": "Jade()", +"1f4e01d9": "absoluteEndBlock()", +"1f4e1504": "upgradeContract()", +"1f4e996b": "challenge(bool)", +"1f4f77b2": "timestampFromDate(uint256,uint256,uint256)", +"1f4f9ab1": "supervisorVote(uint256,bool)", +"1f4fc29c": "refShare()", +"1f502a13": "volumeDiscounts(uint256,string)", +"1f513660": "ctoAddress()", +"1f522595": "donationsCount()", +"1f52692b": "vaultOwner()", +"1f52cc35": "removeTrustedContracts(address[])", +"1f532b39": "getRelation(address)", +"1f534715": "ComplexChildToken(address,string,string,uint256,uint8,bool,int256,bool)", +"1f535833": "referralCodeAt(address,uint256)", +"1f53ac02": "setDevWallet(address)", +"1f54d80d": "verifyCustomer(address,bytes32,bytes32,uint8,bool,uint256)", +"1f5623f3": "ZebiToken()", +"1f572504": "JackToken()", +"1f57256f": "transferEth(uint256)", +"1f583087": "ClickGemTokenERC20(uint256,string,string)", +"1f59653c": "setprices(uint256,uint256)", +"1f59d30e": "unlockEarnings(address,uint256)", +"1f5a0bbe": "addExecutor(address)", +"1f5a0dd2": "courts(uint256)", +"1f5a177f": "registerVestingScheduleWithPercentage(address,address,address,uint256,uint256,uint256,uint256,uint256)", +"1f5a2a52": "getDamageValue(uint256)", +"1f5bb9f8": "Refund_TrustlessTransaction(uint256)", +"1f5bdf5d": "isRegisteredUser(address)", +"1f5c3a3c": "approveMultiple(address,uint256[])", +"1f5c6f67": "getOpeningTimeByStage(uint256)", +"1f5d0b4c": "address(address,address,uint256)", +"1f5dddab": "WithdrawContribution(uint256)", +"1f5dfcd5": "lastBlock_a7()", +"1f5e881f": "_buyTokens(address)", +"1f5e8f4c": "isRestricted()", +"1f5e9a2a": "CyberMilesToken()", +"1f5eeb13": "tokenSendFailuresCount()", +"1f6034fd": "getInt8FromByte(bytes14,uint256,bytes1)", +"1f60d9f7": "crowdfunding_allocation()", +"1f617a60": "setReceivable(address,bool)", +"1f6275bb": "issueTokenAndTransfer(uint256,uint256,address)", +"1f63a350": "settle(bytes32,bytes32,uint8,bytes32,bytes32)", +"1f64c1f2": "getInvestorInforValue(uint16)", +"1f66531d": "getEsgoTX(uint256)", +"1f67298d": "Daq()", +"1f677d8d": "ownershipLength()", +"1f68f20a": "baseRate()", +"1f69565f": "getTokenInfo(address)", +"1f69aa51": "left77(uint256)", +"1f69d230": "setMultiLedgerValue(string,address,address,uint256)", +"1f69f929": "teamVestingCounter()", +"1f6a1bf7": "lastDifficultyAdjustmentEthereumBlock()", +"1f6a1eb9": "execute(bytes,bytes)", +"1f6a3943": "icoBackend()", +"1f6b0a9d": "getReleaseLockfileURI(string,uint32,uint32,uint32,string,string)", +"1f6b28bf": "valueOf(string)", +"1f6b5b7d": "setRefundState()", +"1f6b9b97": "placeBet(uint8,int8,uint8,uint256)", +"1f6c0a9b": "ReleaseLockedBalance(address,uint256,uint256)", +"1f6c76f4": "reserveDeveloperTokens(address,uint256)", +"1f6ce1d3": "setDaySellAmount(uint256,uint256)", +"1f6d2086": "setCooldownIndex(uint256)", +"1f6d3d13": "AddrDevelopGroup()", +"1f6dc06c": "SetSaleStep(uint256)", +"1f6de588": "PiedPiperNetworkCoin()", +"1f6e5117": "getCallbackAddress()", +"1f6e6f3a": "DigitalThothToken()", +"1f6eb6e7": "escapeHatchCaller()", +"1f6ee77a": "setInitialData(address)", +"1f6eeb68": "canMintBurn()", +"1f6f3c0f": "getShipProductAmountByModel(uint16)", +"1f706c64": "EndTimeUpdated()", +"1f71f250": "updateTopicAddress(bytes15,address)", +"1f720e71": "testThrowTranferTooManyTokens()", +"1f7266e8": "owner_TransferFromTo(address,address,uint256)", +"1f7299c1": "processSell(address,uint256,uint256)", +"1f72d7d8": "increaseCap(int256)", +"1f7334e2": "TransferFlower(address,address,uint256)", +"1f74de51": "getAuditOutcome(address,bytes32)", +"1f772a34": "token_symbol()", +"1f77aac0": "queryUserContract(address,uint256)", +"1f790a94": "BananaGame()", +"1f794436": "getBlockHeader(int256)", +"1f7a41f1": "rawNameOf(address,address)", +"1f7a72f7": "bobClaimsDeposit(bytes32,uint256,bytes32,address,address)", +"1f7ab15d": "setdecimals(uint256)", +"1f7af1df": "canReceiveMintWhiteList()", +"1f7b4f30": "roll(uint256)", +"1f7b5318": "getBlocklancerToken()", +"1f7b6d32": "length()", +"1f7b8622": "getVotingDeadline()", +"1f7bf1eb": "_mintShares(address,uint64)", +"1f7c4bf3": "AccessControl()", +"1f7ccc09": "initAssetFile(string,string,string,string,string,string)", +"1f7cdd9b": "unicornsGifted()", +"1f7d16f7": "managementWalletAddress()", +"1f7df96f": "registLogo(address,address,string)", +"1f7e3e72": "test_oneValidEqStringUint()", +"1f7e495b": "systemSupply()", +"1f7f3082": "addForwarder(address,address)", +"1f7fe78b": "balanceAtSnapshot()", +"1f800e8e": "releaseVested()", +"1f803ac3": "getUnlockedTokens(address)", +"1f807736": "withdrawFreeAuctionBalances()", +"1f81582c": "returns()", +"1f816c6d": "hodlerReward()", +"1f820f52": "migrateEuroTokenOwner(address,uint256)", +"1f83bcd7": "withdrawlDeadline()", +"1f83d11a": "addMilestonesAndSeal(uint256[],uint256[],uint256[],uint256[])", +"1f83d75e": "updateProfileDetails(string)", +"1f83f440": "getPaymentByAddress(address)", +"1f86ab51": "confirmCollection()", +"1f86ffda": "UpdateBid(address,uint256,uint256)", +"1f8712af": "isValidPurchase(address)", +"1f871726": "getCategoryWorkClockTimeRef(uint256)", +"1f879433": "setSolver(address)", +"1f8814ad": "ElyERC20(uint256,string,uint8,string,bool,bool)", +"1f8864ac": "setStorageOwner(address)", +"1f887d56": "CryptoSagaDungeonVer1(address,address,address,address,address,uint32,uint256,uint256,uint32,uint256,uint32,uint32,uint32[4],bool)", +"1f8947c1": "extractUint(int256,bytes,uint256,uint256)", +"1f89e911": "getCompositionPrice(uint256)", +"1f8ac604": "mul0()", +"1f8ae3f0": "proofFailed(bool)", +"1f8c07b0": "startPhase(uint256,uint256,uint256)", +"1f8d1d50": "setTotal(uint256)", +"1f8d99a9": "assetIsRegistered(address)", +"1f8df2cd": "setGeneScientist(address,bool)", +"1f8e6fb3": "transferSale(address,uint256,uint256,uint256)", +"1f8e728c": "addMilestone(uint8,uint256[],uint8[])", +"1f8e9143": "AcceptsKDI(address)", +"1f8ea5e8": "EternalChainToken()", +"1f8eac47": "spentByTeam()", +"1f8f1d21": "addMember(uint256,address,bytes32)", +"1f8f69e3": "fechAllVoteResultForCurrent()", +"1f8f8100": "Tspace()", +"1f8fcc45": "Vantador(address)", +"1f903037": "getBytes32()", +"1f903b5d": "preSaleSpenderTxDetails(uint256)", +"1f90b2a5": "snapshotBlock()", +"1f90ffc8": "AddSupply(uint256)", +"1f91666d": "newOrganisation(string,string,string,uint8,bool)", +"1f91e309": "getBuyBackPrice(uint256)", +"1f922d06": "duplicate()", +"1f92f6b7": "setBtcUsdRate(uint256)", +"1f934299": "calcConfirmsNeeded(uint256,uint256)", +"1f960571": "picops_balances(address)", +"1f963f80": "getReportingWindowId(uint256)", +"1f96938d": "deliverSale(address,uint256)", +"1f96add4": "ChronoMint(address,address,address)", +"1f974fe4": "NExT()", +"1f979e23": "GetRigData(uint8)", +"1f97a238": "rejectCertificate(uint256)", +"1f97c00e": "tokenCreationMax()", +"1f97ea5d": "EDU_PER_ETH_PRE_SALE()", +"1f97f2ef": "issuedTokensForCommand()", +"1f98394d": "basicReward()", +"1f994137": "booleanStorage(bytes32)", +"1f995ef1": "HDCTestToken()", +"1f9988c9": "transferTokens(bytes32,address,uint256)", +"1f99c458": "listNamesLen()", +"1f99d862": "test_method_increaseTimeBy30000()", +"1f9a08ca": "reelIn(uint16,uint16,bytes32,bytes32)", +"1f9a391c": "setCanCreateGrants(address,bool)", +"1f9ab193": "place(uint8)", +"1f9b1153": "initiateMigration(uint256)", +"1f9c381e": "setTokenMinAmountBuy(address,uint256)", +"1f9c5580": "AMIS(address)", +"1f9c564f": "rubusOrangeAddress()", +"1f9c649f": "HashInvalidated(bytes32,string,uint256,uint256)", +"1f9d7ab8": "addTokens(uint256,string)", +"1f9ea25d": "_setDepositAccount(address)", +"1f9eba17": "bitcoinInvest(address,uint256,uint256)", +"1f9ecab1": "TowerImagesCoin()", +"1f9ef7fa": "getPayoutNumerator(uint8)", +"1f9f168e": "startNewRound(address)", +"1f9fed62": "checkMySellerOffer(address)", +"1fa03a2b": "isApprovedFor(address,address)", +"1fa08755": "upgradeDexterity(uint256)", +"1fa08ad8": "EtchReward(uint256)", +"1fa0914e": "buyStamps()", +"1fa096e6": "isInversor(address)", +"1fa0dc70": "saveReturnSatoshi(address,uint256)", +"1fa13a61": "longTermTokens()", +"1fa224bf": "setOraclizeAddr(address)", +"1fa24aa7": "makePermanantlyTradable(uint8)", +"1fa30523": "doMint(address,uint256)", +"1fa3c372": "redeemTokens(bytes32)", +"1fa3cfaa": "bmc(uint256,uint256,address)", +"1fa4070c": "TestCoinVN()", +"1fa422a2": "earliestNextSettlementTimestamp()", +"1fa45291": "arrayOfClones(address)", +"1fa498ce": "messagetodovie()", +"1fa4c486": "PublicResolver()", +"1fa4d9de": "completedAddingParsels()", +"1fa4ea66": "reservationAddress()", +"1fa59521": "FTBCToken()", +"1fa5e43b": "freezedBalanceOf(address)", +"1fa62fb7": "setCountrySlogan(uint256,string)", +"1fa6f19b": "getAddressForQuery(bytes32)", +"1fa96b96": "currentProposalResults(uint256)", +"1fa98406": "fundType()", +"1fa9d21f": "DASABI_IO_Contract()", +"1faae8b3": "getTypeValue(uint256)", +"1fab0265": "messiDev()", +"1fab3fd4": "setFinishedTx(address)", +"1fabb318": "MAX_ALLOWED_BY_STAGE_1()", +"1fabe6cf": "getActualCompletionDate(bytes16,address,address,uint256,uint256)", +"1fad4d46": "getShipOwner(uint32)", +"1fad4e79": "sevenWinnerWithdraw()", +"1fae75eb": "Xandra()", +"1fae9361": "changeTimes(uint8,uint8)", +"1faec182": "getBet(uint8,uint256)", +"1faf1ed4": "unlockTip()", +"1faf8995": "fillOrder(address,bytes32,uint256,bytes32)", +"1fafc2c8": "updateBusinessReserveAddress(address)", +"1fb00cdc": "investWithId(uint128)", +"1fb150c4": "_batch1_icosaleEndTimestamp()", +"1fb156ef": "ecmul(uint256[3],uint256)", +"1fb168ac": "setStopStatus(bool)", +"1fb1f18b": "getWinnings(address,uint256)", +"1fb25f07": "getCertification(bytes32)", +"1fb291cb": "registerInt(address,int256)", +"1fb2de2c": "sendTokensToTwo(address,address,uint256)", +"1fb2f2a0": "testUpdateLatestRevision()", +"1fb384cb": "RemoveRocketForSaleEvent(address,uint32)", +"1fb47fe8": "CulturePhilosophyFaithChain()", +"1fb4bcf8": "SetSaltPassword(bytes32,bytes32)", +"1fb4d1e7": "TheMutualCurrency()", +"1fb59f9d": "swapProxyTokens()", +"1fb6e99d": "paymentNeeded(uint64)", +"1fb82d26": "storeProof(string)", +"1fb8875d": "referralSent()", +"1fb8c0ed": "releaseEQUIWihtoutKYC()", +"1fb8d5de": "vaultUnlocked()", +"1fb97c34": "updateFirstAmount(bytes32,bytes32,uint256)", +"1fbab493": "checkPrice(address,address,bool,uint256,uint256)", +"1fbb408a": "RacingToken()", +"1fbb4def": "CalculateDividents(uint256)", +"1fbbf4bb": "setKillingGap(uint256)", +"1fbcf2c1": "_lotterySupply()", +"1fbd3564": "getContentsManager()", +"1fbd7771": "didSoftCapReached()", +"1fbd9a0b": "REFUNDSACTIVE()", +"1fbda78f": "LibraryToken()", +"1fbe1979": "rescue()", +"1fbe480e": "shipToMe(string,uint256)", +"1fbe7475": "findEndpointByAddress(address,address)", +"1fbeaa83": "PublicBatchTransfer(address,uint256)", +"1fbee22c": "updateSearchingFee(uint256)", +"1fbee6ed": "CNYTokenPlus(uint256,string,uint8,string)", +"1fbf7c3e": "increaseReserve(uint256)", +"1fbfe6f3": "auditReport(address,bool,bytes32,bytes32)", +"1fc03aa0": "getTypeByNumber(uint256)", +"1fc05f86": "minimalWei()", +"1fc06f0d": "niceGuys(uint256)", +"1fc083cf": "OurBit()", +"1fc0e5e9": "StartPaymens()", +"1fc1e25f": "listToken(address)", +"1fc242b9": "onVote(address,int256)", +"1fc24caa": "changeMaxTransactions(uint256)", +"1fc27ef2": "isIcoActive()", +"1fc2e0fb": "MinedThisYear()", +"1fc3a519": "computeReturn(uint256)", +"1fc5b4ee": "balancesByIndex(uint256,address)", +"1fc5c9b7": "setNextPeriod(uint256,uint256)", +"1fc62fce": "Trillionereum(address,address)", +"1fc6e13a": "getRoundKeyPrice(uint256)", +"1fc75e41": "preSaleWallet()", +"1fc7d658": "purchase(address[16],uint256)", +"1fc82e83": "allocateUnclaimedFees()", +"1fc86532": "endBlockBonus2()", +"1fc87587": "get_CountProfitsToken()", +"1fc928ae": "taxToken()", +"1fc97e34": "Genius()", +"1fc983fb": "ChelseavsArsenal()", +"1fca5278": "highScore()", +"1fca5fda": "IsRazRunning(uint256)", +"1fcafd8f": "FomoMasterCoin()", +"1fcb292d": "getTokenFunction(uint8)", +"1fcbbefa": "sendBooty(address,uint256)", +"1fcc02e8": "EthereumTestToken()", +"1fcc2515": "ChangeCrowner(address)", +"1fccc158": "tCampaignEnd()", +"1fcd08f0": "AaadharDemo()", +"1fcd7ea6": "getPOOL_edit_33()", +"1fcdfe14": "icoTokenAmount()", +"1fcf25be": "getTransactionSuccess(bytes32,uint256)", +"1fcf55ff": "withdrawApplication()", +"1fd01085": "_sellPresale(uint256)", +"1fd01de1": "_checkOnERC721Received(address,address,uint256,bytes)", +"1fd023ab": "FFCryptoCoinToken()", +"1fd22140": "CountCourses()", +"1fd2676f": "jackPotPercents()", +"1fd2e006": "changeClassFee(uint256,uint256)", +"1fd3dd97": "OneEtherEqualsInWei()", +"1fd41949": "setMaxInvestedLimit(uint256)", +"1fd476bd": "AutonomousSoftwareOrg(bytes32,uint8,uint8,bytes32)", +"1fd4b40c": "saleEtherCap()", +"1fd55a8a": "crowdsaleOpened()", +"1fd7b802": "ModifyMine(uint256,bool,string,uint256)", +"1fd7f431": "setCCH_edit_7(string)", +"1fd8088d": "minLimit()", +"1fd8291a": "endpresale()", +"1fd86a6a": "FundICO(uint256)", +"1fd96b69": "ManagedAccount(address,bool)", +"1fd97c12": "CNotesICO()", +"1fd982a5": "releaseForEarlyInvestor(address,uint256)", +"1fd9b2a4": "createValidatedRequest(address[3],address,uint256[12],uint256,bytes)", +"1fd9f187": "catNoLongerForSale(uint256)", +"1fda4271": "MindToken()", +"1fda5b45": "receivePlayerInfo(uint256,address,bytes32)", +"1fda8278": "drawCoach(uint256,address,address)", +"1fdaedf2": "BoomstarterPresale(address[],address,address,bool)", +"1fdaf3f2": "ServiceAgreement(string,string,uint8,uint256,uint256,uint256,address,address,uint256)", +"1fdb5a2b": "addInvestmentPreIco(address,uint256)", +"1fdba848": "BiekensToken()", +"1fdcf5a7": "lockEthBalance(address,uint256)", +"1fdd7695": "getbuyprice(uint256)", +"1fddbba4": "totalVUP()", +"1fde4607": "setCreditDaoFund(address)", +"1fde8469": "setExchangeRate(uint32)", +"1fdf071c": "approveMintAgent(address,bool)", +"1fdf6e0c": "protectKingdom()", +"1fdfa40d": "test_setupBoardRoomAndAssert()", +"1fdfec35": "calculateTotalDue(uint256,uint256)", +"1fe00a15": "individualMaxCapTokens()", +"1fe07274": "SDEToken(uint256,string,string)", +"1fe08e28": "how_many_arbits_do_i_have()", +"1fe0ff58": "finishRound(uint256)", +"1fe1516d": "sendToTeamEthContract()", +"1fe15db5": "MarketboardListingComplete(address,uint256,uint256,uint256)", +"1fe1b208": "totalavl()", +"1fe26e9d": "componentCount()", +"1fe2a6f2": "updateJugada(uint256,bool)", +"1fe2c933": "UpgradeByCredits(uint256,uint256)", +"1fe2d046": "assignRafflePrize(address)", +"1fe2e229": "getTotalTrust(address)", +"1fe3aec7": "CGCGToken()", +"1fe4ee7f": "getVoteItemDetails(uint256)", +"1fe51f82": "persistLimit()", +"1fe55867": "rew()", +"1fe6189e": "PARTNERS_ADDRESS()", +"1fe64f19": "MaximumHodlDurationChanged(uint256,uint256)", +"1fe74895": "Etherchicks()", +"1fe7b624": "resumeMint()", +"1fe7ff2c": "SpriteToken()", +"1fe8149e": "createTokenByHWC(address,uint256)", +"1fe8500e": "setItemRegistry(address)", +"1fe8629a": "giveMultipleItemsAndDestroyMultipleItems(address,uint256[],uint256[])", +"1fe93774": "totaleFrasi()", +"1fe97e45": "whoIsConcerned(address)", +"1fe9eabc": "setMax(uint256)", +"1fea96cd": "removeUserFromBlackList(address[])", +"1feac75b": "setCommissions(uint256,uint256)", +"1feaee17": "getSetupParametersByIndex(uint256)", +"1feb0c4f": "PreICOProxyBuyer(address,uint256,uint256)", +"1feb19d6": "initialize(uint256[],uint256[],uint256,address,uint256,address,address)", +"1feb3569": "transferToken_toBalance(address,uint256)", +"1fec0e96": "LogCampaignAdded(uint256,address,uint32,uint96,uint16,uint16,uint256)", +"1fec5a11": "Coin77()", +"1fec6dce": "createVestingPeriod(address,uint256,uint256,uint256,address,address)", +"1fedbc03": "getSharesPercentForPeriod(bytes32,uint256)", +"1fedd70b": "snipCoinToEtherExchangeRate()", +"1fee37c8": "ADDR_TKG_NODE()", +"1fee5c51": "set_min_max_FinneyPerSale(uint256,uint256)", +"1feef08e": "getTotal(uint256)", +"1ff13086": "size(int256)", +"1ff14311": "totalOutcomeAmounts(int256)", +"1ff1a378": "maxSalesAllowed()", +"1ff2c22b": "setCharityFund(address)", +"1ff2e214": "proposeAmendmentJUR(address,uint256[],uint256[],bytes32)", +"1ff42195": "minimum_cash_proof_amount()", +"1ff517ff": "totalDebt(address)", +"1ff5668c": "depositForDividends()", +"1ff5e17c": "_itemLength(uint256)", +"1ff6536c": "setCrowdSaleStart(uint256)", +"1ff6a54b": "cancelFavor()", +"1ff6ad55": "tokensForPeriod(uint256)", +"1ff6c241": "collectedUSD()", +"1ff75851": "updateICODate(uint256,uint256)", +"1ff76f86": "ROBReserveAllocation()", +"1ff7a278": "ownerNegTokens()", +"1ff858d0": "activateNextStage()", +"1ff8ac8a": "getFinalval()", +"1ff8d507": "toggleSwap()", +"1ff96c74": "getHonour(uint256)", +"1ffa27f9": "hasPermissions(address)", +"1ffa451c": "serviceTransfer(address,address,uint256)", +"1ffb6ca6": "unlockTransfer(address,uint256)", +"1ffbb064": "isAgent(address)", +"1ffbf32b": "MUSPRA()", +"1ffc973a": "HedgeCash()", +"1ffcb18c": "numQuestions()", +"1ffd3aef": "log10Floor(int256)", +"1ffd42ab": "getVotingScriptAction(uint256,uint256)", +"1ffd99f4": "saler()", +"1ffe3c9b": "UECToken(address,uint256)", +"1ffe4cca": "startline()", +"1fff2d8a": "payToPresale(address)", +"1fff5c2f": "bindEthereumAddress(address,bytes32)", +"1fff7a97": "CompositionPart(uint256,address)", +"1fffbe7a": "getJobSponsorships(uint256)", +"200138b9": "CrowdTmoney()", +"20020a3a": "createAsset(bytes,uint256,bytes,bytes,address)", +"20027275": "saleStartBlock()", +"2002c2f6": "slogans(uint64)", +"200308ee": "rewardVoteResultForCandidate(address,uint256)", +"20033848": "MagixRecordsCoin()", +"20035e36": "icoEth()", +"200373c9": "fees_()", +"2004b6a6": "TheWhaleWins()", +"2004dff6": "Basics()", +"2004ffd9": "mintToken()", +"200538c6": "DTE()", +"200576b5": "TchainToken()", +"2005db6d": "preIco(uint256,uint256,uint256,uint256[],uint256[])", +"2007474e": "theRelayer(address)", +"20076659": "Arbitrator()", +"2008c2ca": "destPercent(address)", +"2009a059": "setLandProductionMultiplier(address)", +"200a252a": "PhanToken()", +"200aa519": "addCustomerwithToken(address,uint256,address)", +"200aac9f": "burnAZLTEST(uint256)", +"200b0fa6": "initVote(uint8)", +"200b894d": "assertEq(int256,int256,bytes32)", +"200b8951": "_distribute(address,uint256,uint256,uint256)", +"200c1f19": "premiumPacks()", +"200c7295": "whitelistAddress(address,uint256)", +"200c7770": "bountyDuration()", +"200cdf8e": "becomePickleRick()", +"200d10dc": "OrpheusOrganicsLaos()", +"200d2ed2": "status()", +"200deb8b": "MessageSent(string,string,string,uint256)", +"200ebe34": "addTokensToGive(address)", +"200ef97e": "payNTS()", +"200f29e3": "advisorAccount()", +"200fbcf0": "getFullyVestedAmount(address,address)", +"201035ed": "getGunsIds()", +"20104dca": "engCommunityAddress()", +"2010bdce": "removeSupervisor(address,address)", +"20120dce": "ADMIN_SET_TEST_RANDOM(string)", +"20130753": "testThrowSetNotRetractableNotOwner()", +"20145328": "changeMelonportAddress(address)", +"2014c515": "tgrNextPartInvestor()", +"2014d703": "approveAllArgs(address,uint256,address)", +"2014e1fb": "W0keAFCrowdsale(uint256,uint256,address,address,address[])", +"2014e5d1": "isRunning()", +"20150e21": "sendDividends(uint256)", +"20153d38": "EarlyAdoptersAmount()", +"20154e78": "unpausePVP()", +"20158c44": "fills(bytes32)", +"201745d5": "disown(bytes32,address)", +"2017af61": "initialTokensHolder()", +"2017ee03": "nextDealIndex()", +"20183926": "EngagementToken()", +"20185aa2": "liquidityWithdraw(uint256)", +"20188d4f": "getAdjustedContribution(address)", +"20190ccd": "startCirculation()", +"201bafee": "TroneriumSupply()", +"201dcd7a": "newChallenge(uint256,uint256)", +"201de654": "mnemonicsCount()", +"201e8f0e": "changeWhitelistCornerstoneStatuses(address[],bool)", +"201e908e": "blockDuration()", +"201f1506": "EthereumEra()", +"201f6e02": "oldAppreciationRateWei()", +"201f96e5": "setRepMarketCapInAttoeth(uint256)", +"20202965": "expired(bytes12)", +"20204fb7": "genericCall(address,bytes,address)", +"2020e9ea": "bid(uint16,uint16)", +"2021dfcb": "BONUS_DURATION_3()", +"20226e17": "valueOnContract()", +"2022936f": "BalanceClaim(address)", +"202329cb": "get_all_activityn(uint256)", +"2024617e": "initialize(string,string,uint256,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"20250264": "setData_5(uint256)", +"2025867b": "qualifiesAsCommunityBallot(uint16)", +"2025e52c": "createSaleTokensVault()", +"20260697": "createWallet(uint256,address[],bytes32)", +"20263e87": "incentiveTokenAddress()", +"2026a0a7": "change_sale_address(address,string)", +"20277ed7": "GWGFPLUS(uint256,string,string)", +"2027d2c6": "ETHLottery(address,uint256,uint256,uint256,address)", +"2027d746": "getCustomerCount()", +"2027e1d3": "COCO()", +"20281990": "ProposalAddedEvent(uint256,address,uint256,string)", +"20283da9": "trustedWithdrawETH(address,uint256)", +"202920ef": "FST()", +"2029e599": "addCode(string,string)", +"202a46cf": "limitEther()", +"202a6ce0": "NFXCoin()", +"202ac3bc": "withdraw(bytes,bytes,bytes32)", +"202b876a": "allocateToMarketingSupporter(address,uint256)", +"202bb36d": "JTBlockchain()", +"202bc7e7": "getIntervalCoefficientMultiplier(uint256,uint256,uint256,uint256)", +"202c413d": "setNickname(uint256,bytes32)", +"202ca027": "setPayrollAddress(address)", +"202d5123": "STRTToEth()", +"202d6eaf": "addInvestorsValue(uint256)", +"202e3924": "getOperation(uint256)", +"202ece74": "sendToWinner(uint16)", +"202feb77": "test_2_assertGasUsage100Boards()", +"2030762a": "PoolICO()", +"2030f721": "num_objects()", +"20323763": "addPerformance(string,uint32,uint8,uint8,uint8,uint16,bool)", +"2032677f": "roundOpen()", +"20334668": "verify(uint256,uint256,uint256[],uint256,uint256,uint256[],uint256[])", +"20339891": "addGridMember(address)", +"2033d9ae": "switchToDistributionMode(uint256)", +"2033de43": "setNewRatesCustom(uint256,uint256,uint256,uint256,uint256,uint256)", +"20352a6e": "ChildDeposit()", +"2035d6b4": "addAccountData(string,bytes)", +"20364306": "setMaxLinkedWalletCount(uint8)", +"2036e2f7": "getCurrentExchangeRate(uint256)", +"20375692": "initVesting()", +"2037fcbf": "withdrawInvestment(uint256)", +"2038d1e5": "setTokenMintFeeAbs(address,address,uint256)", +"2038e2e6": "timestampLast()", +"2038e80a": "mixFormula()", +"20392160": "round1Sold()", +"20396553": "safeMul(int256,int256)", +"203967a5": "toDie(bytes32)", +"203985d6": "getWeeklyTickets(address)", +"20398971": "abiOf(uint256)", +"20398b83": "sendPrepaidEthTweet(uint256,string,uint256)", +"2039b386": "isHashSigned(uint256)", +"2039d9fd": "depositERC20Token(address,uint256)", +"203a318f": "ico_startdate()", +"203a79f6": "cutoffTimestamp()", +"203ab888": "collectOriginalBet()", +"203b2352": "_checkOpenings(uint256)", +"203c03fa": "Coinflip()", +"203cbee2": "ownerPetTransfer(address,uint64)", +"203d39ff": "getOrderBook(address,address)", +"203dacb9": "PrivatePreSale()", +"203e0dc9": "SupbToken()", +"203e3204": "goldIfFreeze(address)", +"203faa89": "lastState(address)", +"203fb521": "addTransaction(address,uint256,bytes,uint256)", +"203fec23": "LogTransfer(address,address,uint256,string)", +"204009d2": "transferForMultiAddresses(address[],uint256[])", +"20409b47": "updateContent(string,uint256)", +"2041518d": "calculatePrice(uint256[],address)", +"2041b997": "tokenizeProperty(string,address)", +"20422fd9": "setAutoInvestByAdmin(address,bool)", +"204241cb": "leaveTeam(uint256)", +"2042495b": "changeUsed(address,int256)", +"2042e5c2": "removeWhiteList(address)", +"2043285d": "getMarketMakers()", +"2044b21b": "exceedsSaleCap(uint256)", +"204525e6": "mul256()", +"204605ad": "ngrzicoToken()", +"2047e4af": "updateTokensState(uint256,uint256)", +"2048cba4": "inGroup(address)", +"2048e5f7": "PaytherToken()", +"20495427": "setBreedingAuctionAddress(address,address)", +"204a88c5": "hasAgreement(bytes32)", +"204b21d1": "AVAILABLE_BONUS3_SUPPLY()", +"204b676a": "numVestingEntries(address)", +"204d3d65": "getCountPlayersOfTeam(uint256)", +"204e6749": "rewardToken(address,uint256,uint256)", +"2050c26e": "preSaleFourthCap()", +"205140c7": "totalClaimableTokens()", +"20514abf": "tktotal()", +"20522347": "changeEndDate(uint256,uint256)", +"20523d0d": "closeAgreementWithTimeout(bytes,uint8[2],bytes32[2],bytes32[2])", +"2052de16": "checkContinuousPurchase(uint256)", +"2053480e": "ActionMiningPlat(address,uint16,address)", +"205360e0": "setReward(uint64,uint256)", +"2053e690": "turnOffOraclize()", +"20544010": "getWinningsForRecordId(uint256,bool,bool)", +"20547a42": "increaseDailyTransactionVolumeReceiving(uint256)", +"2054b2c6": "assert(address,address)", +"205525d2": "set_comp(uint256,string)", +"2055c2ff": "SerchUserPurchase(address,address)", +"20566ae8": "initMonsterClassSiteSet()", +"2056ab36": "NewNodePriceTicker(string)", +"20572943": "SignedMessageOracle(bytes32,uint8,bytes32,bytes32)", +"205730fd": "SELL()", +"2057420b": "withdrawVault(uint256,address)", +"2058308d": "_addPropertyValue(bytes32,address)", +"20592076": "HeyToken()", +"2059c548": "exerciseOptionsDeadline()", +"205b1946": "hasContributed(address)", +"205b931e": "addOracles(address[])", +"205ba186": "DSJL()", +"205c2878": "withdrawTo(address,uint256)", +"205c7cf5": "issueCenturion(address)", +"205c9cc7": "w()", +"205d0063": "feeTakeExporter()", +"205d6c86": "purchaseEgg(uint64,uint16)", +"205dc0ee": "poolAddressCapTier1()", +"205e0e26": "advisersCliff()", +"205e921c": "delegatedRefund(address,address)", +"205f3b58": "calculateOwnerCut(uint256)", +"2060a150": "props()", +"20610779": "deathData_a2()", +"20614514": "HHDToken()", +"20620f37": "onAuctionEnd(string)", +"206288d3": "deployBlockNumber()", +"2062e457": "setDirectPaymentThreshold(uint256)", +"2063165d": "union(uint256[],uint256[])", +"206369fa": "AthleteToken()", +"206465f7": "_getPendingOwner()", +"20647eb7": "externalFailure()", +"20651d5d": "batchTransferToken(address,address[],uint256[])", +"20654277": "ArtsCoinV1()", +"206545c2": "DIAMOND()", +"206607f2": "updateCanFetch(bool)", +"20675504": "hyperInterface()", +"2067c85c": "transferTokensFromMarketingAddress(address,uint256)", +"20688582": "saleIsRunning()", +"20689f29": "preSalePeriod()", +"2069381a": "multiPresaleMint(address[],uint256[])", +"20694db0": "addIssuer(address)", +"2069de94": "TonalQuantum()", +"2069f66c": "isPresalesNotEndedInAdvance()", +"2069fc46": "excludeAmbassadors(uint256,address)", +"206a44f3": "getNum(bytes,uint256)", +"206b64b4": "generateName(bytes16,uint256,uint256)", +"206cfd24": "cleanFinishedOperations(uint256)", +"206d0125": "getWithdrawnFromBatch(address,uint8)", +"206d1fde": "setMegaAddress(address)", +"206d468f": "PriceOracleInterface(address,address)", +"206ec7a1": "multisend(address,bytes32,address[],uint256[])", +"20701967": "confirmPlatformWithdrawal()", +"2070748c": "XeroBest()", +"20709b35": "jackpotPaused()", +"2070b6de": "donationPhase()", +"20714f88": "setSelfDestructBeneficiary(address)", +"2072343e": "MeowToken()", +"2072863b": "setCMO(address)", +"20729b83": "DistributeButtonIncome()", +"2072cde2": "NewsCash()", +"207368fc": "startSelling(uint256,uint256)", +"20745669": "ClaimedSignature(address,string)", +"2074cc86": "MikCoinToken()", +"2075281c": "Marko()", +"2075eec6": "tokenQuantities()", +"20768ee8": "getProposalID()", +"20770caf": "GRUCoin()", +"2079405b": "AmountToDistribute()", +"20799608": "convertDecimal(uint256)", +"2079fb9a": "signers(uint256)", +"207a6c33": "calculateCurrentVirus(address)", +"207a6d80": "TukBuk()", +"207aba24": "Migrate()", +"207acb53": "_calculateRequiredTokenBalance(uint256,uint256)", +"207b89e2": "purchaseLand()", +"207bd99d": "ableTransfer()", +"207beb59": "getRateIcoWithBonus()", +"207c64fb": "validate(address)", +"207cb710": "grantInvestorTokens(address)", +"207e6467": "pieBalances(address)", +"207f4f38": "contTransfer(address,uint256)", +"2080d8dc": "EVTCTLToken(address,uint256)", +"20813154": "deregister(bytes32)", +"2081e911": "Set()", +"208318bd": "Total_Amount()", +"20832219": "setOps(address,bool)", +"2083250d": "Atriark(uint256,string,uint8,string)", +"20834ed0": "AddPlayers(address,address)", +"20835e8c": "getBet()", +"2083c730": "_hatchEggs(address)", +"2083cbd8": "execAirDrop(address,address[],uint256[])", +"2083f44f": "lastFell()", +"20857295": "setErc20TokensContract(address)", +"2085f554": "approveAndCall(address,uint8)", +"20867ccd": "addEmployee(uint256,string,string,string,string,string,string,address)", +"2086ad60": "MiewGold()", +"20871322": "ForecastingFactory(address)", +"208838c8": "tokenPerWai()", +"20885d9e": "PGE02CH()", +"208904c7": "startFrom()", +"208972b4": "PartialPayment(uint256,address,address,uint256)", +"2089d0c9": "Swachhcoin(address)", +"208a099c": "createKitty(uint256,uint256,uint256,uint256,address)", +"208a9e37": "tweakRefundStatus()", +"208af09f": "setIsForking(bool)", +"208b080f": "changeExpiryLimit(uint256)", +"208b3116": "next(uint256,uint256)", +"208b7427": "AgriChainContext()", +"208c1019": "BLOCK_BASIC_PRICE()", +"208c8692": "mint(bytes,uint256,bytes,bytes)", +"208ca719": "SellIPG(uint256)", +"208df65f": "getValueByNumber(uint256)", +"208e1cc3": "writeConditions(uint256,string)", +"208e8914": "atFundDeposit()", +"208eba04": "_withdraw(address,uint256,address)", +"208ebf16": "lpBidVolume()", +"20907d9a": "BlockClout()", +"20909455": "triggerAirDrop(address[],uint256)", +"20909fa0": "communityCurrency()", +"2090b0a8": "m_allowPrivileged()", +"2090cf8b": "consultBalance(address)", +"2090d5e9": "lookupByProject(uint256)", +"2090d8a6": "trackOdd(uint256)", +"2090f3e3": "lethalBonusAtHitsLead()", +"209164d5": "_processPurchase(address,uint256,uint256)", +"20917902": "globalether()", +"2091f2d9": "ICOoverTimeStamp()", +"2092970f": "StartDistrib()", +"20940b13": "btcTransactionClaimed(uint256)", +"2094e9d8": "newJob(bytes32,bytes32)", +"20956341": "slice2(bytes,uint256)", +"2095f2d4": "endCrowdsale()", +"20965255": "getValue()", +"20968dc7": "rewardHistoryLengthOf(address)", +"2096b768": "getCoreAddress()", +"2096c958": "GEXAirDrop(address)", +"2096f2ff": "issueTokensMultiple(uint256[],uint256[])", +"2097dd04": "getLatestAuthorizedAddresses(uint256)", +"2097e5f0": "VaultbankToken()", +"209878b9": "lockReleaseTime()", +"20987e64": "addInvestment(address,uint256)", +"2098e37a": "LogBoonReleased(address,uint256,uint256,uint256)", +"2099940e": "freezOne()", +"209a5b8a": "moneySumAtSettlement(address,uint256,int256,uint256)", +"209ab711": "registerReferral(address)", +"209b7067": "CALLGToken(uint256,string,string)", +"209b80ce": "previousstageloser()", +"209bb163": "Ethex(address,address,uint256,uint256)", +"209cccd7": "channelCloseTimestamp(uint64)", +"209ebc08": "isPaid()", +"209f36d0": "registerApiKey(address,address,bytes32)", +"209f3c9c": "MINIMAL_PARTICIPATION()", +"20a0045a": "SALE_END_TIME()", +"20a0128e": "ICOEndDate()", +"20a09dec": "COMM_SUPPLY()", +"20a168b1": "coinsPerEth()", +"20a17b24": "dexWallet()", +"20a2b135": "forkThis()", +"20a3952b": "MyTestGameToken()", +"20a4e8f8": "_clearSnapshotDelegators(uint256,address)", +"20a60ace": "TokenBurner()", +"20a733df": "countPerformers()", +"20a7b2d7": "_setMintFeeProp(uint256)", +"20a7d5c3": "lend(uint256,bytes,address,bytes)", +"20a99bd0": "templates(address)", +"20aac36f": "getstopBlockNumber()", +"20aba08b": "rho()", +"20abf417": "stageFourCap()", +"20acbc83": "withdrawTokensFromWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"20ad3874": "vestingBonusMultiplierPrecision()", +"20ad8a81": "setTeamTokensPercent(uint256)", +"20ae2059": "setMaximumBet(uint256)", +"20af0841": "_payPayee(bytes32,address,uint256)", +"20af2042": "setCountPerStep(uint256)", +"20b023c8": "disavow()", +"20b0554e": "payoutBalance()", +"20b0747f": "start1stRound()", +"20b0961c": "pE(uint256,uint256,uint256,uint256)", +"20b0eafb": "PoWH4D()", +"20b0fe2c": "setGlobalParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint32)", +"20b1b0ab": "getStuckCoin(address,uint256)", +"20b1d054": "TAAS_VAULT()", +"20b27291": "setFinalized(bool)", +"20b28ade": "getIPFSHash()", +"20b2af52": "Author()", +"20b2d97b": "LiquidDemocracyRules(address,address[],uint256)", +"20b3c9c9": "InfinixSupply()", +"20b43094": "mulUInt(uint256,uint256)", +"20b431aa": "dividendDivisor()", +"20b44b29": "lockTransfer(bool)", +"20b4577e": "numBonuses()", +"20b4fc29": "setBbAddress(string)", +"20b519bb": "setBarrierAsOpen(bool)", +"20b652ba": "chainedFunctions()", +"20b748f4": "REGULAR_TYPE3()", +"20b7ceb8": "R2Xtoken()", +"20ba5b60": "insert(bytes,bytes)", +"20bacfbd": "addDoc(string)", +"20bb0ef6": "originalHash(uint256)", +"20bb280b": "buy5(address[],address[],uint256[],bytes,bytes,bytes,bytes,bytes)", +"20bb2adf": "setAllowedTransferFrom(address,bool)", +"20bc4425": "getHost()", +"20bcbee5": "EarlyTokenSale(address,address)", +"20bd0475": "resetLotteryBalance()", +"20bd46b7": "drawTertiaryAWinners(uint256)", +"20bf0c52": "Derived(uint256)", +"20bf2f47": "_setAddresses(address,address,address)", +"20bf92ca": "oldSeeleToken()", +"20bfa95c": "bookAndCalcRemainingPremium()", +"20bfde8b": "s24(bytes1)", +"20bfec70": "WatchFees()", +"20c0b493": "getWarriorChestPrice()", +"20c12f16": "penalizeInactiveJuries(address[],uint256[])", +"20c21ba5": "_setTypeValue3(uint256)", +"20c257f5": "_adjustReserve(uint256)", +"20c28b85": "schelling(address)", +"20c2d5e4": "withdrawAffiliatePot(address)", +"20c2f40b": "doCalculate(uint256,bytes32)", +"20c381af": "cityPoolTotal()", +"20c3be47": "_createZombie(string,uint256)", +"20c427b0": "sumBalance()", +"20c5429b": "revoke(uint256)", +"20c5478f": "RtBCoin()", +"20c55a8a": "AirDropAFTK5May()", +"20c58794": "PHN()", +"20c5b497": "recoverAddressFromBalanceProof(bytes32,bytes32,uint256,bytes32,bytes)", +"20c5e29a": "increaseDailyTransactionVolumeSending(uint256)", +"20c726b4": "view_product(uint256)", +"20c8580f": "getBalanceEthContract()", +"20c8651b": "makeFee()", +"20c90167": "distributeCDD(address[],uint256,uint256)", +"20c93c62": "trackFee(uint256)", +"20c9d73c": "validCountryId(uint256)", +"20c9f377": "OneUpToken(address)", +"20ca0418": "getEscrowById(uint256)", +"20ca292e": "AUFBToken()", +"20cad613": "isVersionLogic(address,bytes32)", +"20caea39": "surprisePanda()", +"20cb27fb": "requireWhitelistingBeforeDeposit()", +"20cb7bce": "takeFee(address,address,uint256)", +"20cc6889": "getAvatarByNickname(string)", +"20cc7b4e": "changeToken(address,address)", +"20cd2141": "advisorLockUp_address()", +"20cd3972": "grab(address,address,address,address,uint256)", +"20ce4c66": "getInteractive()", +"20ceb1bb": "SetCoinManager(address)", +"20ceb536": "grantToSetUnpausedWallet(address,bool)", +"20cf3e1f": "maintenance_mode()", +"20d00018": "jackpotTime()", +"20d01a7f": "ContestClosed(uint256,address[],address[])", +"20d0c13c": "getStatusModerator(address)", +"20d19181": "crowdsaleEndedBlock()", +"20d3a0b4": "unlockPeriod()", +"20d3fc20": "totalSeedStage()", +"20d615c2": "testControlTransferDisableNotEnabled()", +"20d71dad": "_repopTransaction(address,uint256,uint256)", +"20d76113": "admin_tokenBurn(uint256)", +"20d786b5": "withdrawalCounter()", +"20d7d367": "allowRegistryUpdate()", +"20d7d860": "ahmadToken(uint256)", +"20d8741f": "Feed()", +"20d8dad0": "checkWhitelisted(address)", +"20d95f90": "removeInt256(bytes32)", +"20d9822e": "setAnyoneCanCall(address,string,bool)", +"20d9a9e2": "getChallengeType(uint64,uint256)", +"20db0c7e": "B21Token(address,address,address,address,address)", +"20db31d6": "totalFortunes()", +"20db91e2": "createPartner(address,uint256,uint256,uint256)", +"20dc3d06": "bpLockUp(address)", +"20dc407a": "creditOwner()", +"20dc4677": "minPublicContribAmount()", +"20dcce99": "PRE_CROWDSALE_CAP()", +"20dce978": "setExchanger(address,address)", +"20dd60f5": "setEnvelopeType(uint256,uint256[2])", +"20ddf1de": "editEpisode(uint256,string,string,uint32)", +"20df7f35": "DATE_TOKENS_UNLOCKED()", +"20dfcd27": "purchaseCountry(uint256)", +"20dffb08": "testCancelSellOrder()", +"20e07e7f": "changeCardCost(uint256)", +"20e0dc9f": "RTCoin(string,string,uint8)", +"20e1063e": "toekensForBTCandBonus()", +"20e12a43": "createRound(bytes32,bytes32)", +"20e25965": "timestampRelease()", +"20e33b13": "GoodBit()", +"20e3dbd4": "setConfig(address)", +"20e537c7": "isTransactionAlreadySettled(address,bytes32)", +"20e561f3": "BecomePharaoh(uint256)", +"20e57371": "ownerVault()", +"20e59116": "startChampionGame()", +"20e62bbc": "StreamityEscrow()", +"20e647e1": "checkBetColor(uint8,address,bytes32,bytes32)", +"20e65a42": "stakeForAirdrop(address,uint256,bytes)", +"20e6a2cb": "getStrField1()", +"20e6e921": "transfer(address,uint8)", +"20e76d31": "_solveGame(uint256,uint256,uint256)", +"20e87093": "getDSTSymbolBytes()", +"20e89790": "POWR()", +"20e979b1": "assignBank(address)", +"20e98bf4": "setNick(string)", +"20e9aac3": "playerTimestamp(address)", +"20ea2533": "authorizePayment(string,bytes32,address,uint256,uint256)", +"20ea31f8": "giveTo(uint256,address)", +"20ea8d86": "revokeConfirmation(uint256)", +"20eb2a87": "setContract(address,address,address,address,address)", +"20eb6dec": "frozenControl(address,uint256,uint256)", +"20eba3f2": "gamesLength()", +"20ec0f01": "lastBlock_v12Hash_uint256()", +"20ec75c2": "searchStartIndex()", +"20ed1a52": "badge(address,address,uint8)", +"20ed9451": "set_active_contract()", +"20edae5a": "createChallenge(uint256,string,uint256)", +"20ee0c94": "setUrl(bytes32)", +"20ee5445": "addToPrivileged(address)", +"20eea675": "ESOPOffered(address,address,uint32,uint32)", +"20eeba1f": "testConstructorUsingNewContract()", +"20ef57ed": "bumpCounter(uint256)", +"20f067a8": "PRETDESupply()", +"20f06c9b": "start_LOCKUP(uint256)", +"20f06fef": "_createWarrior(uint256,address,uint256)", +"20f0751d": "turnOn(address)", +"20f0c28f": "MainContract(string,address,address,string)", +"20f0db91": "VerifCert(uint32,bool,bytes,bytes)", +"20f10ae7": "_supportsERC165Interface(address,bytes4)", +"20f10fdd": "tokenSupplyLimit()", +"20f1895c": "fechVoteSumNumForCandidate(address)", +"20f1d85b": "removeApprovedAddress(address)", +"20f317fb": "districtContractAddress()", +"20f320d0": "setBonusExtra(address,uint256)", +"20f361b3": "optionExercise(uint256)", +"20f3d413": "getTargetBlockNumber()", +"20f4014a": "ApolTestToken()", +"20f4914a": "changeMyString(string)", +"20f4d7aa": "redeemPayout()", +"20f541fa": "purchaseAsQualifiedPartner()", +"20f5a0b9": "readTeamByIndex(uint256)", +"20f5afdf": "OwnershipTransferInitiated(address)", +"20f5e8dd": "resetBalance()", +"20f65816": "extractToken(address,address)", +"20f71018": "Aqo()", +"20f727e2": "Caller(address)", +"20f756bd": "getArmySoldiersCount(uint256)", +"20f801d4": "payout(address,address,uint256)", +"20f86e9f": "_isBonusAvailable()", +"20fa6fd9": "ethSendSameValue(address[],uint256)", +"20fa70b0": "getAvailableWithdrawableCount(address,uint256)", +"20fb2bc2": "AllowClaimBTC(bool)", +"20fb36af": "Test8J()", +"20fb9bad": "LogSortedOffer(uint256)", +"20fc4881": "getCheckpoint(uint256)", +"20fcf2e5": "Castor()", +"20fd8861": "customerWallet()", +"20fea5cf": "getUserTaskAtIndex(uint256)", +"20fee8f1": "_timePer()", +"2100bf7a": "lolaToken()", +"21015328": "getLLV_edit_28()", +"21027354": "buyerHistory(address,uint256,uint256)", +"21029f47": "chickenHunt()", +"2102df31": "_totalDonations()", +"2104c2bb": "fundTeamInstant()", +"2104cdd2": "totalNumberOfScammers()", +"2104d832": "AddHelenium(address,uint256)", +"2104ebf1": "executeWithdraw(uint256)", +"2104fa0b": "skinIdToOwner(uint256)", +"21059e63": "createProposalAndPublish(bytes32,string)", +"2105c049": "setCSO(address)", +"21065f10": "mintInternal(address,address,uint256)", +"21067b3f": "startRoundWithFirstBet(uint256,uint256,uint256,bytes32)", +"210790c8": "signWholeConfiguration()", +"2107a796": "createGame(string,string,uint256,uint256,string,string,string,string,bool,string)", +"2108292e": "mint_(address,uint256)", +"210846ae": "is_kyced(address)", +"21090b31": "_decrementInventory(uint256,uint256)", +"210970c5": "update_count(uint256)", +"2109b408": "bitsMask()", +"2109cf80": "depositEth(address,uint256,bytes)", +"210a6eec": "sendMultipleAddress(address[],uint256[])", +"210a854b": "preIcoTokenHoldersAddresses(uint256)", +"210a8d0e": "changeGranularity(uint256)", +"210ab6af": "numOfJingles()", +"210ae4d5": "setTransferDisabled(uint256,bool)", +"210b7e0b": "tokenAllocation(address,uint256)", +"210ba961": "demurringFeeOwner()", +"210bc472": "ownerTokensMinted()", +"210bd306": "getCurrentHunterLicencePrice()", +"210c1f29": "closeBoard(uint256)", +"210c5a56": "_removeMinter(address)", +"210c5ff6": "getBlockNumber(bytes)", +"210d14b8": "burnPREICOTokens()", +"210d2bba": "PRICE_MULTIPLIER_PREICO2()", +"210dee2f": "setMigrateOut(bool)", +"210e2484": "icoDiscountPercentageLevel3()", +"210e734c": "isBoxItemId(uint256)", +"210e9a34": "getPendingReferals(address)", +"210f5dda": "createToken(string,string,uint8,uint256)", +"210fcbf6": "createPromoCutie(uint256,address)", +"210fd271": "sizeLimit()", +"210fe93b": "catIndexToAddress(uint256)", +"2110273d": "addToShareHoldersProfit(string,string)", +"21105d35": "addressForNonce(uint8)", +"21106109": "finalRate()", +"2110a57c": "User(address,bytes32)", +"2111006f": "create(address,address,bool)", +"21114904": "balanceOfEther(address)", +"2111871c": "endPreICOStage2()", +"2111c0f9": "freezeDeliverMuti(address[],uint256,uint256,uint256,uint256)", +"2111d1e2": "OnUpdateMessage()", +"21129137": "saleover()", +"2112e7fe": "getListGames()", +"2113342d": "totalDividendPoints()", +"2113aab4": "BTL_IMMORTAL()", +"21141c38": "updateInvestorFunds(uint256,uint256,address,uint128)", +"21141de0": "ReturnEthToEthero()", +"2114fd0f": "AxpireToken()", +"2115d328": "getSemiResult(uint256)", +"2115fd55": "RecievedEther(address,uint256)", +"21166476": "ARC()", +"2116b530": "ChangeOwner2(address)", +"21180138": "isCA(address,address)", +"21180722": "init(int256)", +"21187172": "Gate(address)", +"21188011": "maxIssuedWithAmountBasedBonus()", +"2119249f": "getNumTokens(uint256)", +"21194bc0": "devCutPercentage()", +"211a048a": "getFastestSpaceship()", +"211a04db": "totalToDistribute()", +"211a0f39": "ERC20TokenComplete(uint256)", +"211a1ba8": "changeTokenController()", +"211b2758": "changeBlockedTimeForInvestedTokens(uint256)", +"211b4f54": "startUpdate(uint256)", +"211b72a3": "sub1(uint256,uint256)", +"211db50d": "allowNewStakes()", +"211e28b6": "setLocked(bool)", +"211ed6c1": "freeTransfer()", +"211f0b93": "getCreateReputationTokenUniverse()", +"211f0ef9": "SaleOfChametz()", +"211f390e": "ECO_SYSTEM_HOLDER()", +"211feec5": "executeEtherDeltaSell(uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,bytes32,uint256)", +"211ff90c": "SpiceControlled(address)", +"2120e527": "stakingBonus(uint256,uint256,uint256)", +"21217668": "getDrawBlockNumberByWinner(uint256)", +"2121dc75": "isTransferable()", +"212257de": "changeCap(uint256,uint256,uint256)", +"2123015e": "test_insert_findWithHintNextIncreased()", +"2123476b": "startConstitutionPoll(address)", +"21235083": "cancelSubscription(uint256)", +"21241e44": "addressOfTokenUsedAsReward3()", +"21242279": "MintToKen(address,uint256)", +"2125b65b": "transfer(uint32,address,uint224)", +"2126a923": "reverse(address,uint256)", +"2127c30a": "setBlockHash(bytes32)", +"2127fe90": "addOnStage(address,uint256)", +"21288400": "lastPurchaseTick()", +"21289506": "MichaelCoin()", +"2128a580": "total_claim_codes()", +"212954dc": "setAddBonus(uint256,uint256)", +"2129e25a": "finalBalance()", +"212a6fd3": "CloseEntry()", +"212a850c": "showMyNumber()", +"212ac4b5": "UnicornChain()", +"212ac7d1": "mintNewSpinner(uint256,uint256,uint256)", +"212bf316": "setCaps(uint256,uint256)", +"212c3fce": "returnTokensToAirdropper(address)", +"212c5fea": "close(bool)", +"212c8157": "disallowTransfers()", +"212d6723": "payRoyalty()", +"212e2596": "sellOrderTotal()", +"212ebbd6": "addTokenLock(address,uint256,uint256)", +"212f6066": "enableInvestment(address[])", +"21309ae3": "setTimeBonuses(uint256[],uint256[])", +"2131c68c": "daoAddress()", +"2132626f": "_removeByIndex(uint256)", +"21326768": "finishGame(bytes32)", +"213294cd": "crowdsaleHasEnded()", +"2132ce0a": "BASE_AMO_TO_ETH_RATE()", +"2132eb23": "TreasurerToken()", +"21335ad5": "getDepositAggregate(address,uint256)", +"21338d1b": "rewardsWithdrawalProposed()", +"2133ddeb": "settleBetV1(uint256,uint8)", +"2133e3b9": "calculatePercentage(uint256,uint256)", +"213408da": "sendCreatorReward()", +"2134214b": "getPreorders(bytes32)", +"21346edd": "savedBalanceToken()", +"2134927e": "setAuctionParms(uint256,uint256,uint256)", +"21355869": "getAuctionTimeLimits(bytes32)", +"2135810e": "curRequestId()", +"2135d2e4": "lasttokencount()", +"213671bf": "mainSale_TokenCap()", +"213681cd": "getRecord(bytes32)", +"21370942": "updateEthPrice(uint256)", +"21376d07": "scheduledPayout()", +"2139c2aa": "setwinnerLimit(uint8)", +"213a2622": "offerAsSacrificeFromVault()", +"213a72a7": "LightofGalaxy()", +"213ac932": "addUser(address,uint256,uint8,bytes32,bytes32)", +"213ad495": "TimeWeekTwo()", +"213ae9ec": "newGame(uint256,bytes8,uint256,uint256,string)", +"213aedb8": "getAllGames(bool,uint256,uint256)", +"213b9eb8": "setAddr(string,address)", +"213c3375": "callCustomTokenFallback(address,address,uint256,string,bytes)", +"213d6771": "editionData(uint256)", +"213d8f4a": "setCurrentRewardNum(uint256)", +"213db226": "move(address,address,uint8,uint256)", +"213e609f": "getTknOfferAmount(uint256)", +"213e84d3": "maxIssueTokenLimit()", +"213ea6bb": "donationReceiver()", +"213f44ab": "getUserAddressList()", +"213f9ad4": "generateWinners(uint256)", +"213fe044": "getInstanceAddress(address)", +"213fe2b7": "getContracts(address)", +"21420a3d": "_depositTokens(address,uint256)", +"21424e7d": "ETHcollected()", +"2142adc9": "changeMargin(uint256)", +"21435e07": "setTokensWallet(address)", +"2143da91": "GameOfThrones()", +"214405fc": "addToWhitelist(address,uint256)", +"21446cfe": "unitDefense(uint256)", +"2145465a": "SOUNDBOY()", +"2145a455": "getRebackRate()", +"2145e36c": "testBitSetFailIndexOOB()", +"21462191": "bid3(address,uint8[],uint8[])", +"21464e71": "inOneYear()", +"2147783f": "smitToken()", +"21479265": "addToBlackList(address,address)", +"21484786": "notificationFee()", +"21486833": "maxRewardUnitsAvailable()", +"21491e82": "secondCurrentAmount()", +"214958ba": "BLOCKCURRICO()", +"214962d1": "identifierHash(string)", +"21499737": "setIco2Tokens(uint256)", +"2149c619": "functionThree(uint256,uint256,uint256,uint256)", +"214ab314": "searchDiplomaByID(uint256)", +"214af6b9": "acceptTokensFromUsers(address,uint256)", +"214b146f": "storeName(uint256,string)", +"214bb60f": "finalised()", +"214c2a4b": "getServiceURI(address)", +"214c9d50": "WritedrawStatus()", +"214cdb80": "registerInterface(bytes4)", +"214dda84": "regularPhase()", +"214e52ca": "transferAllowed(address,address)", +"214e5f3a": "setForwardUpdateFeesTo(address)", +"214e8a47": "getSingleLocker(address)", +"214f71fe": "tokenFulfillmentDeposit(address[2],uint256,uint256[7],uint8,bytes32[2])", +"2150097f": "timerInfo()", +"2150c518": "getKeys()", +"2150c75d": "newItem(uint256,string,uint256)", +"2150cd56": "setRateAdmin(address)", +"2151f9a0": "TCT(string)", +"21520c5f": "calculatePayout(uint8,bool,uint256)", +"215213dd": "updateTierTokens(uint256,uint256,uint256)", +"2152b483": "OWN_SmartContract_Allowed(address,bool)", +"2152c649": "LOVEYOUToken()", +"2152ebac": "getContributionAmount(uint256)", +"21537caf": "setRequiredBlockQueueTime(uint256)", +"21538acb": "approveCallGas()", +"2153bade": "ZJZJToken()", +"2153bf23": "x3Token()", +"21542702": "MakeBet(address,uint256)", +"215458b0": "salvageNotAllowedTokensSentToContract(address,uint256)", +"2154dc39": "maxMintable()", +"21554dca": "GetCurrentBonusStageTokenBalance()", +"2155af2f": "execute(address,uint256,bytes1[])", +"2156a96c": "getTotalSales()", +"2157320e": "votedAddress()", +"21575889": "distributionSupply()", +"2157ab24": "GetBankerRound(uint8)", +"21592a2b": "YaoMaoCoin(uint256,string,uint8,string)", +"21594110": "createProductionUnit1Beta()", +"215a3bcc": "setStatus(bytes32)", +"215a4862": "eligibleForBonus(uint256,address)", +"215a6ce4": "createBet(uint64,uint256)", +"215ac4be": "fillContract()", +"215ae66d": "mintForWebsites(address[],uint256[])", +"215afc5f": "totalTokenDistribution()", +"215b3e32": "fromBytes(bytes)", +"215b5411": "purchaseCallbackOnAccept(uint256,address[],uint256[])", +"215bad32": "TPTTransfer()", +"215bd303": "createWorkerPool(string,uint256,uint256,uint256,address)", +"215bf604": "addFreelancerFeedback(address,uint256,address,string,uint8)", +"215cb8df": "createIlliquidToken(address,uint256)", +"215cc031": "getAvatarByAddress(address)", +"215d6b61": "getTierOfMember(address)", +"215d902c": "extractString(bytes,uint8,uint256)", +"215de48a": "getParentCount(bytes32)", +"215de791": "getTankName(uint32)", +"215e25ea": "upgradeReferrer()", +"215f1cd1": "oraclizeSetWinner(uint256,uint256)", +"215f865e": "resetDropAddress(address)", +"215fce93": "changeExchangeRate(uint256)", +"216093aa": "getIsThirdPhase()", +"21614f62": "randomSkinAppearance()", +"2161d0e9": "tokensToP3D_(uint256)", +"21627dad": "getCart()", +"2163d49a": "lockedCore()", +"2163ef1a": "GangnamTokene(address,address)", +"216481d6": "icocontract()", +"21650145": "Revoked(bool)", +"2165e1aa": "withdrawRemainingBalanceForManualRecovery()", +"2165fef9": "allocateStrategicTokens()", +"21667940": "issueTokenAndApprove(uint256,address)", +"21670f22": "reward(address,uint256)", +"216716af": "ExoMiniumToken(address,address)", +"21687444": "newDAO(address)", +"2168c988": "transferToInternalLedger(uint256,bytes32)", +"2168ca06": "numberOfIndex()", +"216903f9": "confirmTx(bytes32)", +"216974cc": "refundNonCompliant(address)", +"216986b0": "entradaJugador(uint256)", +"216a5543": "getAllForSaleStatus()", +"216aa0ba": "proposalBlock()", +"216b8c95": "internalIsApprovedForAll(address,address)", +"216be181": "hodls(uint256)", +"216c1606": "_claimExistingCard(uint256,address)", +"216ced43": "setPenaltyDisbursal(address)", +"216d93d6": "pricers(uint256)", +"216de17a": "priceStage1()", +"216e2a97": "totalOrder()", +"216e3449": "changeToken(string,string)", +"216ea239": "miningResolve(uint256,uint256)", +"216ea5ec": "remainder(uint256,uint256)", +"216ec69b": "getColour()", +"216ecfa7": "Tbaol()", +"216ef940": "proxyUpgrade(address,address,bytes)", +"2170ebf7": "makerWithdrawEther(uint256)", +"2171454a": "bountiesKey(uint256)", +"2171526e": "Chewbaka()", +"21717ebf": "siringAuction()", +"2171dc73": "buyXaddr(address,address,uint256,string)", +"2172ac5a": "_requestExistsReverse(address,address)", +"217311ac": "getWords(uint64)", +"21733f6a": "sendDv(string)", +"2173a10f": "INITIAL_POLL_NONCE()", +"21745c15": "numberOfSales()", +"217477f6": "ICO_PERCENTAGE_3()", +"2174b88f": "transferBanker(address)", +"2174dcec": "ConfigPromoter(uint256)", +"21751df9": "BugBountyOne()", +"21752974": "compromiseContract()", +"21765510": "getLockedAvailable(address,string)", +"21765d23": "addLockedTime(address,uint256,uint256,uint256)", +"217720d7": "getHeldCoin(address,address)", +"21774f4b": "CUSTOMER_PERCENTAGE()", +"2177885d": "isOnAuction(uint40)", +"2177a36f": "getCountProof()", +"2178139d": "acceptAbstractToken_(uint256)", +"21795635": "TOTOAirdrop(address,address)", +"217987ad": "delBlackList(address)", +"2179f0f7": "EtherToken()", +"217aab68": "_updateCommission(uint256)", +"217ad35a": "minimalEther()", +"217af162": "whitelistKyberAddress(address)", +"217b97e4": "hatchMaxTime()", +"217bd046": "computePoolAmount()", +"217cab2b": "GetWhitelist(uint256)", +"217d9bbe": "depositExit(uint256,bytes)", +"217db8e8": "toBase(uint256,uint256,bytes8)", +"217f2d23": "CRVToken()", +"217fe6c6": "hasRole(address,string)", +"21815a1a": "updateHolderShareInfo(uint256)", +"21819e5c": "computeArtistTxFee(bytes32,uint256)", +"2181c11f": "batchNewAuctions(uint128[],uint256[],uint256[])", +"2182e6d8": "buy_lovelock(bytes32,string,string,string,uint256)", +"2182ebbf": "use(address,uint256,uint256,uint256,uint256,uint256,string)", +"2182f7b4": "MINIMUM_PURCHASE()", +"2182ff7e": "sellMNC(uint256)", +"21835af6": "__dig(uint256)", +"2183e390": "setTotle(address)", +"21842be3": "unlockTransfers()", +"218444ab": "Test2()", +"21844b08": "drWinChances(uint256)", +"21848580": "lastBlock_a14()", +"2184f977": "TRANSITION_WINDOW()", +"2184fe2c": "transferTechSupport(address)", +"2185072f": "SerpenSegmentCount()", +"21853009": "participantRoundRewarded(address,address,uint256)", +"21856b36": "interestOwed()", +"2185810b": "allowTransfers()", +"21858521": "tickets()", +"2185ca52": "BITRUS()", +"21860a05": "airdrop(address)", +"21861cce": "AUDITED_AND_APPROVED()", +"2187a833": "setGreenToken()", +"2187bdca": "getAllETH(address)", +"2187e6a6": "createHolder(string,address,uint256)", +"21887c3d": "has(address)", +"21895086": "RL(uint256,string,string,bool)", +"218a51e8": "UnFrozenTokenEvent(address,uint256)", +"218a7667": "addToBalances(address,uint256)", +"218a9640": "setTeamStatus(bool,uint256)", +"218bc5ec": "createBid(uint256,address,bytes32,bytes32,uint256,uint256)", +"218bd577": "enterGame()", +"218cd7a1": "POOPOO()", +"218d5637": "realSupplyWeight()", +"218d6ca2": "calcPurchase(uint256,uint256)", +"218d984b": "registryProxy()", +"218dd3dd": "checkIdentity(bytes32)", +"218e4562": "updateBalanceOf(uint256)", +"218e4a15": "getCooldown()", +"218e6877": "setDelegate(bool)", +"218e767d": "TokenFactory(address,address)", +"218eee82": "addAd(uint32,uint32,string,string,uint256)", +"218fbdec": "callWithdraw(address)", +"218fd1c4": "CompanyName()", +"218fe479": "generateRenown()", +"218ffb4c": "Fund(address,bytes32,address,uint256,uint256,address,address,address,address[],address[])", +"21901fa8": "WithdrawFunds(address,uint256)", +"219047f7": "MasternodeRewardSend(uint256)", +"2191207a": "setTAOFactoryAddress(address)", +"21914e29": "day2Start()", +"2191f4a9": "storjPrice()", +"2191f92a": "isInterestRateModel()", +"219285d2": "presaleClosedManually()", +"2192b99d": "mintContributors(address[])", +"219356bc": "GxConstants()", +"21937192": "finishedSTOMinting()", +"21938610": "set0xExchange(address)", +"2193cdba": "send_all()", +"2194f3a2": "fundsWallet()", +"21956036": "SmartRouletteDividend()", +"2195845f": "withdrawAltcoinTokens(address)", +"21958a50": "AddressSeries(address)", +"2196ae0d": "hint(bytes32,string,bytes20)", +"2196feac": "createMarketItem(bytes16,bytes16[],bytes16[],uint256[])", +"2197021b": "proxyVotingContract()", +"21970c0c": "pay_royalty()", +"21974a74": "EtherNetworkConfig()", +"21978e58": "_removeSale(uint256)", +"2197b236": "Goldjunge()", +"21981514": "totalUnclaimedBidsAmount()", +"219862d0": "marketKebabs()", +"2198e780": "addDollarAmount(address,int160)", +"21998504": "setCompte_7(string)", +"2199d5cd": "registerUser(address)", +"219a6ead": "MICRO_DOLLARS_PER_BNTY_PRESALE()", +"219a6f04": "getFounderMember(uint256)", +"219bc76c": "currentRoundInitialized()", +"219c7ad1": "getwinningaddress10()", +"219caaa9": "reclaimChildOwnership(address)", +"219d0ece": "transferAdminship2(address)", +"219da4ac": "ResumeTokenContract()", +"219dabeb": "registerDeposit(address,uint256)", +"219dc688": "technicalPercent()", +"219df7ee": "ZTHTKN()", +"219f5052": "updatePokeMarketAddress(address)", +"219f5b92": "revokeAuthorization(address,address)", +"219f72c9": "startICOStage3()", +"219fd010": "accredited()", +"21a19b2d": "neverdieSigner()", +"21a2ad3a": "nextSlasher()", +"21a2c72d": "BitcoinDublicate()", +"21a32e5c": "VanityCrowdsale(uint256,uint256,address)", +"21a33743": "DroidEIP20Token(uint256)", +"21a33e00": "gasReq()", +"21a389cc": "PRE_SALE_3WEEK_BONUS()", +"21a3fb85": "addValidator(address,bool)", +"21a49ec2": "LCoin()", +"21a4a5bb": "endDateOfSaleStageLast()", +"21a4c6c3": "openMarket(address)", +"21a4cdaf": "HDCToken()", +"21a4d259": "setMinAuditPriceLowerCap(uint256)", +"21a5065e": "returnableTokens(address)", +"21a5c1c3": "buyItem2()", +"21a5dcfe": "multivestBuy(address,uint256)", +"21a638d8": "addTerminal(address,uint256,address)", +"21a6c649": "privatePresaleWallet()", +"21a6c7aa": "megabossCutPercentage()", +"21a78f68": "ref()", +"21a7d652": "EQUIPMENT_REWARD_TOKENS_NUMS()", +"21a80189": "getBalance(address,address,uint256,bytes,uint8,uint256)", +"21a804fc": "SphereToken()", +"21a83738": "getDragonPriceNo(uint256)", +"21a8a771": "setPort(uint16)", +"21a91d2b": "PrcntRate()", +"21a9cf34": "setTradeAddress(address)", +"21aa1706": "startPresaleTrading()", +"21aace42": "setTokenForSP(uint256)", +"21ab13ab": "maxBet(uint256)", +"21ab3074": "transferOwnershipOfStorage(address)", +"21ab561d": "MIN_BID_FRAC_BOT()", +"21ab7fb4": "marketplace_admin_controller()", +"21ab9177": "fixPlayerGraphic(uint256,string)", +"21abf58b": "feesB()", +"21ac01d8": "ClaimedTokens(address,uint256,uint256,uint256)", +"21ac4982": "issue(bytes32,int256,bytes,uint256)", +"21ac5aba": "cityIndexToOwner(uint256)", +"21ac64af": "declareRCV(string)", +"21ac8967": "setPatentFee(uint256)", +"21b12a4b": "clearTransaction()", +"21b133ed": "icoTotalAmount()", +"21b1e5f8": "sendETH(address)", +"21b288d8": "endSecondBonus()", +"21b36a08": "setFee(uint64,uint256)", +"21b43777": "advisorCount()", +"21b48008": "getInvestorsETH(address,address)", +"21b4b3dc": "proposalsCnt()", +"21b55c42": "testConcat()", +"21b5b8dd": "extraBalance()", +"21b68d2b": "DyginoteToken()", +"21b6ac62": "lockGate()", +"21b6c321": "StoreProduct(bytes32,bytes1)", +"21b6fcbf": "SendFund(uint256,bytes32)", +"21b8092e": "setWithdrawalAddress(address)", +"21b8151e": "Mixer()", +"21b8b11e": "_addToDebtRegister(bytes4,uint256)", +"21b8d973": "returnHash(address[2],uint256[8])", +"21b920eb": "upgradeTank(uint32,uint8)", +"21bacf28": "getDefaultFee()", +"21bb79fe": "luckyDogInfo()", +"21bb86ab": "setExchange(uint256,uint256,uint256,uint256)", +"21bc84fd": "canCompose(string,uint256[],address,uint256)", +"21bc9a55": "buyTokens(address,address)", +"21bcc5e5": "multiBatchTransferFrom(uint256[],address[],address[])", +"21bdb26e": "maxPresaleSupply()", +"21bded12": "capitalPctBips()", +"21be2244": "PrivatePlacement(address,address,address,address,address)", +"21be26ed": "deauthorizeContractById(uint256)", +"21beba94": "lastTxBlockNum()", +"21beedf4": "BlocklancerToken()", +"21c0183e": "centralAdmin()", +"21c02472": "numberOfResolutions()", +"21c03a97": "setTradingOpen(bool)", +"21c0b342": "claim(address,address)", +"21c0e95d": "setBountyPool(address)", +"21c17ab8": "unproposeMilestones()", +"21c24081": "GDC(uint256,string,uint8,string)", +"21c26195": "distAirdrop(address,uint256)", +"21c4d650": "priceForBasePart()", +"21c5fb20": "Deposit_double_sum_paid_from_the_balance(uint256)", +"21c60ac6": "div(uint8,uint8)", +"21c60c74": "createMobster(string,uint256,uint256,uint256,string)", +"21c63a47": "getTicketCount()", +"21c6b951": "BetherCryptocurrency()", +"21c6d7b6": "BitbabeToken()", +"21c87627": "getUnlockedPercentage()", +"21c87ee8": "setMaxLevel(uint8)", +"21c882ef": "testGetCaseAtIndex()", +"21c88358": "anyTokenWithdrawal(address,uint256)", +"21c9a6b1": "localCheck(uint256,string,bytes32,bytes32,string,bytes32)", +"21cb1568": "registerArtwork(address,bytes32,uint256,string,string,uint256,address,bool,bool)", +"21cb18cd": "assignVested(address,uint256,uint64,uint64,uint64,bool)", +"21cbed35": "setOperationAttributesByRegulator(string,string,uint256,string)", +"21cda790": "tokensOwned(address)", +"21cdb03c": "shopShield()", +"21cde824": "fighterIndexToTeam(uint256)", +"21ce14a9": "injectTokens(address,uint256)", +"21cefec0": "tokenBuyRate()", +"21cf3514": "priceStalePeriod()", +"21cf5132": "setManualBonus(uint256,bool)", +"21cf59ac": "mintInternal(uint256,int256)", +"21cf9f22": "updPool(int8,uint256)", +"21d148ab": "weiForXau()", +"21d1a303": "checkRemained(uint256)", +"21d1b7a4": "TJ2()", +"21d269dc": "fastCashBank()", +"21d2daa0": "unFreezeToken(uint256)", +"21d3523c": "voteToHarvestFund()", +"21d36529": "feePercentage(uint256)", +"21d365af": "_processVestingRules(address,address)", +"21d376ce": "tokensOfOwner(bytes32)", +"21d3d2ee": "isMigrationFinished()", +"21d41bc2": "IRobo()", +"21d45bec": "getReverseFee(address,uint256)", +"21d4b08c": "numTicksTillAuctionStart(uint256)", +"21d50273": "createParty()", +"21d53fb9": "withdrawLockupTokens()", +"21d5c0f6": "finalizeAgent()", +"21d5cb51": "verifiedUser(bytes32)", +"21d65d80": "blockPart(uint64,uint64,uint64)", +"21d67daa": "internalFinishMinting()", +"21d6cdb6": "newPeriod(uint256)", +"21d739f1": "TokensIssued(address,uint256)", +"21d7bdff": "startCountDown()", +"21d800ec": "relayedMessages(bytes32)", +"21d80111": "getHero(uint256)", +"21d8ad4c": "getContractName(uint256)", +"21d9d5ba": "testRemoveLocked()", +"21da1719": "impl_unlock4Circulate(address,uint256)", +"21da94e7": "getSEScore()", +"21daae34": "getQuoteToBaseReturn(uint256)", +"21daf0f8": "TransferToReferrer(address,address,uint256,uint256,uint256)", +"21db06bc": "wolf4Balance()", +"21db087e": "getLevelCitizenById(uint256,uint256)", +"21db0f0d": "getImmortalsOnTheBattlefield(address)", +"21db2aa0": "getArtwork(uint32)", +"21dc04f4": "Vibranium()", +"21dc512e": "replaceSSPRegistry(address)", +"21dc74fa": "addWhiteLister(address,address)", +"21dcbbae": "HighJackpotHolder()", +"21de6b01": "setKtcAddress(address,bool)", +"21de861a": "narrowCyclePrizeView()", +"21df0da7": "getToken()", +"21df2ea5": "getNewInstance(address)", +"21df8b9b": "addTotalBondValue(uint256,uint256)", +"21e01596": "logCall(uint256,uint256,uint256)", +"21e0f228": "winningNumbers()", +"21e2933a": "setBasicIncomeLimit(uint256)", +"21e38e81": "ownerCheck()", +"21e3cdd0": "voteDn(uint256)", +"21e5383a": "addBalance(address,uint256)", +"21e53d77": "_buyTokens(address,address)", +"21e5d0e4": "PRESALE_START_WEEK2()", +"21e5e2c4": "shareOf(address)", +"21e69b42": "dataMerkle(bytes32[],uint256,uint256)", +"21e6b53d": "transferTokenOwnership(address)", +"21e76826": "Gamblr()", +"21e866be": "getCompanyCreationCost()", +"21e88888": "setColor8(uint256,uint8)", +"21e92d49": "transferByOwner(address,uint256)", +"21e96b88": "setProxyManagementCurator(address)", +"21e9b296": "ExtractedTokens(address,address,uint256)", +"21ea2b8d": "delayOfICOEND()", +"21ec0129": "HAUZ()", +"21ec5981": "Jekyll_Island_Inc()", +"21ed0f64": "removeEmployee(uint256)", +"21ed46ad": "Dollars()", +"21ed47b3": "annualPos()", +"21edbe24": "pricesAndInventoriesOfDate(uint256,uint256,uint256[],uint256)", +"21ee102b": "removeExtension(address)", +"21ee6457": "set_sale_arbits_total(uint256)", +"21eeb9a7": "LogSaleCapReached(uint256,uint256)", +"21ef10f0": "revokeSelf()", +"21ef8368": "DataSentToAnotherContract(address,address,bytes)", +"21eff7fc": "getContribution(address)", +"21f032d3": "BitDAOToken()", +"21f0a727": "node_right_child(uint256)", +"21f0b382": "unblockClient(address)", +"21f118a6": "createByCOO(string,uint256,uint256)", +"21f1a18c": "battleRemove(uint256)", +"21f1b677": "updateTime(uint256,uint256)", +"21f222dd": "minWeiAmount()", +"21f2a9a9": "_getUnlockedTokensPercentage()", +"21f2ca3b": "unregisterUser(address)", +"21f2ed2e": "dividendDistributionEndTime()", +"21f35609": "CAT_FIRST()", +"21f38c6e": "bundlingEnabled()", +"21f3f338": "proposalCensorshipFee()", +"21f3ff41": "maxMultiRolls()", +"21f408be": "tk()", +"21f4911a": "addFiveParticipants(address,address,address,address,address)", +"21f4d29f": "getPoolHistory(uint256)", +"21f610d3": "endEarlyStage3()", +"21f6b513": "Airdropper(address,uint256)", +"21f72d82": "YODCToken()", +"21f7ac0d": "codeExportCost()", +"21f8a721": "getAddress(bytes32)", +"21f8dab6": "THRESHOLD4()", +"21f9a878": "NewHashnodeTestCoin()", +"21f9caef": "cancelOrder(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32,address)", +"21fa1730": "Ballot(string,string,string,uint256,address[],uint256[],uint256[])", +"21faf403": "getStatusLogCount()", +"21fb39d4": "WithdrawEvent(address,address,bool,uint256,uint256)", +"21fb9869": "getAdminLog(uint256)", +"21fc2cd1": "NounToken()", +"21fda809": "payment(address,address,uint256,address)", +"2200919f": "addVersion(string,address)", +"22009af6": "BASE_REWARD()", +"2200cdec": "finishPVE(uint256)", +"22017c5f": "DSTokenBase(uint256)", +"2202dcad": "FACTOR_7()", +"22039f89": "isServiceContract(address)", +"2203ab56": "ABI(bytes32,uint256)", +"2204ef4b": "getMeTokens(uint256)", +"22054fe0": "updInvestorEnabled(address,bool)", +"22057bc7": "getAllRevisionBlockNumbers(bytes20)", +"2206e837": "undisapprove(uint256)", +"220772a9": "starUpZero(uint256,uint256,uint256)", +"2207a93a": "etherInUSD()", +"22081c12": "processPayment()", +"22082c72": "getDoneSelfDropAmount(address)", +"2208ee1d": "_releaseTime()", +"2209e991": "sendBet(address,uint256)", +"220a0e36": "LoggedERC20(uint256,string,uint8,string,bool,bool)", +"220a2247": "givePermission(address,string)", +"220b4a73": "TCPC()", +"220c166c": "hatchingSpeed()", +"220c773a": "changeMarketingRecipient(address)", +"220d5d8d": "YioCoin()", +"220d7a7f": "NoteToken(uint256)", +"220d8707": "BONUS_DAY3_DURATION()", +"220d9944": "MailHustleCrowdsale()", +"220e44d0": "_buy(uint256,uint256,address)", +"220e5d06": "qshdrop(address[],uint256[])", +"220e693f": "ALLOC_ADVISORS()", +"220eb9b6": "run(uint256,bytes)", +"220ee9ec": "purchase_dates(address)", +"220eeab4": "BonumPreSale(uint256,uint256,address,address,uint256)", +"220f1202": "lowestAskAddress()", +"220f1aee": "createVoting(string,string,uint256,bytes32,address)", +"220f52c5": "whoIsTheOwner()", +"220f9dfd": "getFighterInfo(uint32,uint32)", +"220fde2e": "setSellPrice(uint16,uint256)", +"221067a1": "JULIAN_ALLOCATION()", +"221086af": "buyerBonus()", +"2210d525": "getRareAddress()", +"2210e0f7": "MassPay()", +"2211218a": "ARMtest()", +"2211944a": "ActiveAdmin()", +"2211ae76": "canReceive(address,address,uint256,bytes)", +"2211c3b3": "eraseContribution(address)", +"22122cb3": "blockTokenFunds(address,uint256)", +"2212dbc3": "get_timestamp()", +"22132598": "numArtworks()", +"221353ca": "finalizeByAdmin()", +"22137935": "productsExported()", +"2213c7db": "tokenPreSaleRate()", +"2214f65d": "toWei(address,address,uint256)", +"221538f4": "BurnupHoldingCore(address,address)", +"22156bb2": "WerderCoin(uint256,string,uint8,string)", +"22159d89": "ticketsOwned(uint256)", +"2215fc82": "getONETIMESOLD()", +"2216573d": "internalIncreaseGoldKeyCounter(uint256)", +"22169ab3": "START_PRESALE_TIMESTAMP()", +"22174ebf": "TokenSBT()", +"2217bf78": "getReputationRewards(address,address,bytes32)", +"2219a95b": "DWBTPreICO(address,address,uint256,uint256,uint256,uint256)", +"221a66d9": "presaleFee()", +"221ab8e2": "setBlockResult(uint64,uint64,bytes32)", +"221b1c4a": "_NumOfStudentsPass()", +"221b30df": "btcPurchase(address,uint256)", +"221b5ec2": "setTimeBegin(uint256)", +"221b5fad": "getCardsCount()", +"221b850c": "changeInstallerEscrowAddress(address,string,address)", +"221d4dff": "create(string,uint256,string,string,uint8)", +"221e5da9": "GetContractStateEarlyTerminatedByTenant()", +"221e9370": "recordedCoinSupplyForRound(uint256)", +"221ed3cc": "CONSTELLATION()", +"221ed748": "shareCycle()", +"221ef94d": "userMigration(uint256)", +"222101d1": "vestingMappingSize()", +"222160c0": "isProposalExecutable(bytes32,uint256,address,bytes)", +"2221fb3e": "hasActiveBet()", +"22230fc4": "countFishAtBase()", +"22239e8e": "loanActivation()", +"2223a5da": "reserveCap()", +"2224044c": "calcWeiForTokensAmount(uint256)", +"22242382": "checkPriceAmount(uint256)", +"22245b64": "MAXCAP_TOKENS_ICO()", +"22246200": "deleteElementWithValue(uint256)", +"22250809": "BoardClaimed(uint256,uint256,address)", +"222594c5": "findModuleNameByAddress(address)", +"2226549e": "fixedLog2(uint256)", +"22284872": "Escrow(address)", +"22287914": "icoWallet()", +"2228c895": "getWinningRate(uint256)", +"2229d348": "attackMonster(uint256)", +"222a5343": "BOWTERC20()", +"222a95ee": "LastMsg()", +"222af991": "stringToUint(int256,string)", +"222b0d7d": "massRevoke(address[])", +"222b8947": "depositTokens(bytes32,uint256)", +"222c1390": "maxPublicSaleStage()", +"222cfe94": "myEtherBrosCount(address)", +"222d777a": "createEvent(string,uint256,uint8,uint256,uint256,uint64)", +"222d7e34": "currentRoundStart()", +"222f51e9": "getDailyHash()", +"222f5be0": "transferInternal(address,address,uint256)", +"22305fb7": "ShowSegmentation(address,uint256,uint256)", +"2231454f": "updateCampaignManagerContract(address,string)", +"223162e7": "WithdrawSharedExpense(address,address,uint256,uint256)", +"2231f72c": "setownership(uint16,uint16)", +"223208af": "walletName(address)", +"22326584": "WBE()", +"2233db62": "InvestorRegistry()", +"2233dbf4": "wantNewMinter(address)", +"22347d5b": "confirmTrade(address,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"22351b6b": "VibeToken()", +"22366844": "isRegistered()", +"223699c1": "units30percentExtra()", +"22372795": "HIT()", +"2237d55c": "setTargetDiscountValue1(uint256)", +"22384945": "checkPresaleBalance()", +"22393ef4": "bundleFirstTokens(address,uint256,uint256[])", +"223964bc": "queryAccounts(address)", +"2239c48a": "startUpgrade()", +"2239d43b": "uintMinimalSize(uint256)", +"2239e688": "getUrlFromKey(bytes32)", +"223a6399": "newAssociate(address)", +"223ab941": "transferForProjectTeam(address,uint256)", +"223b01db": "decimalsETHToUSD()", +"223b530e": "antiques()", +"223c217b": "withdrawTokenTo(address,address,uint256)", +"223c5939": "UnilotBonusTailToken(address)", +"223cd20e": "shareHolderByAddress(address)", +"223d0417": "viewUnpaidRewards(address)", +"223dad70": "sendMsgSndr(address,address)", +"223db315": "allow_refunds()", +"223dcc74": "left14(uint256)", +"223e5a9d": "pls()", +"223e8eff": "etherPriceAuditor(address)", +"223e97be": "setParent(uint256,uint256)", +"223e9f17": "_redeemSameClassAdoptedAxies(address,uint8,uint256)", +"223fcbc9": "_locked()", +"223ff4cc": "getShipsIds()", +"224076d4": "pegIsSetup()", +"22408401": "ArtSale(address,address,uint256,uint256,uint256,uint256,uint8,uint256)", +"2240b645": "GetClientCategory(address)", +"22412ded": "MyProducts(address,uint256)", +"2241a733": "GOLD_AMOUNT_XPER()", +"22425fa4": "feePeriodDuration()", +"22427047": "Payout(uint256)", +"22429085": "updateFees(uint256,uint256,uint256)", +"2242cf7f": "getConBal()", +"22434836": "setTimes(uint256,uint256)", +"2243fb15": "getHashratePerDay(address)", +"22446093": "editPerson(address,address,string,uint256)", +"2245675f": "setCustomerSignature(address,uint256)", +"22471e16": "identityApproved(address)", +"2247328c": "vote01YesCount()", +"224846de": "deletePaymentContract(uint8)", +"224854f7": "Trie()", +"224993c2": "setTimeBlock(uint256)", +"224a1775": "transferByOwner(address,uint256,uint256)", +"224a6ac3": "nextPE()", +"224a8174": "TESTER()", +"224a967c": "CTSCoin()", +"224b4bfd": "TYCOONCoin(uint256,string,string)", +"224b5c72": "consume(address,uint256)", +"224bed07": "transferIndexed(address,uint256)", +"224c1a21": "getMyEthBalance(address)", +"224c1c9b": "getNonVestedBalanceOf(address)", +"224c4657": "createOrder(address[3],uint256[3])", +"224ccc49": "chainLastMessageHash(bytes32)", +"224d5d54": "wylouToken()", +"224dc278": "dis()", +"224e5efd": "DNACoin(address,address)", +"224e7462": "removeToken(bytes32)", +"224f127d": "LogNewWhitelistedAddress(address,address,uint8)", +"224f143a": "setme()", +"22500af0": "OwnershipTransfer(address,address)", +"22518a75": "getVotersCandidateVote()", +"2251a8a9": "isSubscribed(address,address,string)", +"22526635": "payOut(uint256,uint8,uint256)", +"22529fff": "getReferral(address,address)", +"2252d5c1": "exemptMeFromFees()", +"225386fe": "SimpleERC20()", +"2253fff1": "initialCongress(address)", +"22542fb6": "collectTokenPhaseStartTime()", +"225435c0": "detach()", +"22547931": "registerOperation(uint256,string)", +"22551da7": "double(address,bytes32,uint8,uint256)", +"22554f34": "getT()", +"22555bea": "UNITv2(address)", +"22556bd7": "createRound(string,bytes32[],uint256)", +"2255ad10": "RefugeCoin()", +"225640ab": "getOrCreatePreviousFeeWindow()", +"225682d1": "test_contractBalance()", +"2257406e": "getMemory(uint256)", +"2257defa": "removeCustomerFromBL(address,address)", +"2259315d": "TokenFactoryCN()", +"22593300": "Small(address)", +"2259d221": "LifeSet_005()", +"225a1d46": "PODH()", +"225a905f": "NewSubscription(address,address,uint256,uint256)", +"225b6574": "hasBase(address,uint64)", +"225c4011": "cyberEntry(address)", +"225c5567": "withdrawLeftTokens()", +"225ce00f": "_createAuction(uint256,string)", +"225cf990": "setAgriChainContext(address)", +"225cfd59": "addPromille(uint256,uint256)", +"225da7e5": "transferManagerFactory()", +"225f406a": "buyInSaturday()", +"225f9d7d": "stopIt()", +"225fce8d": "getGameByPlayer(address)", +"22609373": "calculateEthereumReceived(uint256)", +"2260b98b": "finalizeVoting()", +"226187dc": "maxPreICOTokenAmount()", +"2261b07f": "getConverter()", +"2261c6d9": "AllowedAddressAdded(address)", +"2262cd94": "wroom()", +"22636e65": "setContractValue(address,string,uint256)", +"2263ae04": "POHD31()", +"2263e8b7": "routingCodes(uint256)", +"2263f2c5": "createTokens1()", +"22643a47": "JokerCoin()", +"226454c1": "getGoldDataDocumentation()", +"22657697": "priceForStage(uint256)", +"2265931d": "transferToken(address,uint256,uint8)", +"2265a94b": "ValyutaTestCoin()", +"22665bc9": "setICO(address,uint256)", +"22666da6": "makeGuess(uint256)", +"226685ee": "Visit()", +"22673030": "SALE_START()", +"2267b2e3": "veredictum()", +"2267b30d": "removeFounder(address)", +"22686250": "index(int256,uint256)", +"2268a358": "changeMultisig(address)", +"226942e6": "RollEvent(address,uint256,uint256,uint256,uint256)", +"2269d2ec": "addNewPotatoCoinsForSale(uint256)", +"2269f1c9": "voteA(uint256)", +"226ac321": "updateTokenRate(address,uint256)", +"226bf449": "addPackage(string,address)", +"226d2f86": "keyEmployeeAllocation()", +"226dd769": "howManyEtherInWeiToChangeSymbolName()", +"226e2b91": "setPaycarnita(uint256)", +"226e2d10": "manual()", +"226ee47c": "set_validator(address)", +"227185d6": "Send1Get2()", +"2272b0af": "csoAddress()", +"2272df67": "changeFounderAddress(address)", +"2272f879": "walletThree()", +"227326b1": "proposalPassed()", +"22734c0c": "createRawDeposit(address,uint256,uint256,uint256)", +"22742564": "quickConvertPrioritized(address[],uint256,uint256,uint256,uint8,bytes32,bytes32)", +"2274346b": "vaultContract()", +"22758a4a": "whitelister()", +"22760877": "getCurrentHeroOwners()", +"22763ae1": "stopInEmergency()", +"22766696": "bidEnd(uint256)", +"2276774c": "finalizeRemainders()", +"2277466b": "voteToClose()", +"22776478": "getDistrict(uint256)", +"2279295d": "resetPhoenixes()", +"22798c10": "MANHATTANPROXYACPBLVD()", +"2279fa4c": "numPayments()", +"227a7911": "etherGetBase()", +"227ac0cf": "GetPerSellInfo(uint16)", +"227ada37": "placeBet(uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"227bf6b8": "ethorseOracle(address,bytes32,string,bool)", +"227c74a7": "giveEntity(uint256,address)", +"227cade5": "maximumBet()", +"227d111e": "GetExistsCardList()", +"227d3fb4": "checkTxProof(bytes,uint256,bytes,bytes)", +"227d535f": "Wolk()", +"227dd788": "isFinal(bytes32[])", +"227e14e9": "currentDateTime()", +"227e26c4": "deleteChild(uint256)", +"227f592c": "TIXGeneration(address,address,address,address,address,uint256,uint256)", +"227f9633": "addOption(string,address,uint256)", +"227fb30b": "MosaiCoinContract()", +"227fda27": "BitcoinSamaritan()", +"2281411b": "allocateAndFreeze(address,uint256)", +"22817359": "_transferTokenToOwner()", +"22824bbd": "checkFind(address,address)", +"2282d9f2": "transferIsEnabled()", +"22848a0c": "TCTToken(uint256,string,string)", +"2284a6fa": "interest(uint8,bool,uint8)", +"2284b051": "gameRandon1()", +"2284e8fe": "push_or_update_key(uint256)", +"22855bf0": "CheckBest(uint256,address,address)", +"22855ef9": "registerTransfer(address,address,uint256)", +"22867d78": "repay(address,uint256)", +"2286b46b": "stakePathIDToAccountAndSubcourtID(bytes32)", +"2286b7de": "BONUS_ICO_STAGE1_PRE_SALE2()", +"2287d2ec": "donealready(uint256,address,bool)", +"2287dad2": "getTicketByHolderId(bytes32)", +"2287e96a": "withdrawEnabled()", +"2288193b": "testFundACampaign()", +"22888f35": "depositPremium(address[2],uint256[7],uint8,bytes32[2])", +"2288fad6": "earlyPurchases(uint256)", +"2289115b": "createPlanet(string,uint256)", +"228acf2f": "tokenTeam()", +"228b70d3": "registerNewPubKeyForHash(string,string)", +"228b7bf8": "Vasacoin()", +"228bbf45": "getItemsForSale(uint256,uint256)", +"228bff5a": "secToDays(uint256)", +"228c2df1": "hodl(address,uint256,uint256,uint256)", +"228c790c": "RudysToken()", +"228cb733": "reward()", +"228cc2aa": "maxQuanValues()", +"228ce144": "getKingdomType(string)", +"228d2820": "disableConversions(bool)", +"228d477f": "tokTakers(uint256,address)", +"228dff13": "setPepeName(uint256,bytes32)", +"228e41bd": "getdeptcount(uint256,address)", +"228e554a": "_refundBond(uint256,address)", +"228e892e": "icoStages(uint256)", +"228e92cf": "YuanLianToken()", +"229063fc": "discoveryCooldown(uint256)", +"2290d6e2": "entryFee_()", +"2290db50": "buyEnergy(address,address,uint256)", +"2290e106": "mintBuyerToken(address,uint256)", +"22923160": "updateWithdrawals(address,address,uint256,uint256)", +"229233b6": "FOR_FOUNDER()", +"22928b4d": "isIpoPeriodOver()", +"22928d6b": "removeUser(address,address)", +"22935caa": "setInitialAllocationUnlock(address)", +"22937ea9": "returnInt256(int256)", +"229460e7": "AdminstratorRemoved(address)", +"2294795d": "deuseth()", +"22949fb1": "TicketBought(address)", +"2294c48a": "initUsers()", +"2295115b": "adminWithdraw(address,uint256,address,uint256,uint8,bytes32,bytes32,uint256)", +"2295ee5b": "updateTokenBaseURI(string)", +"22968885": "getBalanceOfContract()", +"22969eac": "changeAuth(address)", +"22978e57": "unlockedAfter()", +"229824c4": "calculateTrade(uint256,uint256,uint256)", +"2298b9ce": "icoOver1()", +"229906b3": "updateStringSetting(uint256,string,address,string,string)", +"2299219d": "unlockTemporary(bytes32,address,bytes)", +"229a336b": "BodyMassIndex()", +"229a4978": "batFund()", +"229b04bf": "pauseMode()", +"229b5223": "weiScale()", +"229b9bc5": "buildingToUnitCount(uint256)", +"229cfc32": "calculateViralRewards(uint256)", +"229ddd9a": "foreignBuy(address,uint256,string)", +"229df5c6": "getSig(bytes)", +"229e0b16": "updateLoanAsLender(bytes32,uint256,uint256,uint256)", +"229eb105": "payaFinished()", +"229f3e29": "presaleEnd()", +"229f4caf": "minBetPrice()", +"22a036dd": "ico2Bonus()", +"22a15848": "btcOracle()", +"22a1ec8f": "setSomething(address[])", +"22a27f3b": "getDeveloperAddress()", +"22a3eab5": "withdrawn_balances(bytes32)", +"22a4381d": "fromTokenDecimals(uint256)", +"22a47143": "Tokensale(address,address)", +"22a4993c": "getReferedCount(address)", +"22a635c4": "Hodl(address)", +"22a7118d": "buyTokensFor(uint256,address,uint256,bool)", +"22a7533b": "deathData_a19()", +"22a7906f": "getOwnedPointAtIndex(address,uint256)", +"22a7ac34": "rake()", +"22a7ba2b": "totalSupplyCrowdsale()", +"22a8fb18": "freezelvlAccount(address,bool)", +"22a90082": "setInterval(uint256)", +"22a92c45": "sendTokensToHold()", +"22a993ca": "getKun()", +"22aa7196": "refund_window_end_block()", +"22aab53a": "temperatureRange()", +"22aacad5": "incCounter()", +"22aaea91": "setCurrentAuctionId(uint256)", +"22ab9433": "getPrecomputedEToTheHalfToThe(uint256)", +"22abb147": "ResolutionAdded(address,uint256,string,string)", +"22ac5f40": "fulfillEscrow()", +"22ad3b76": "fiatFee()", +"22ae634f": "getInvestment(uint256)", +"22aef13c": "requestChangeRequirement(uint256,string)", +"22af00fa": "bets(uint256)", +"22af1b27": "UnpackAccessDChain(bytes)", +"22af47e3": "tokensIssuedAir()", +"22b01343": "initializeAssetsToThisApplication()", +"22b05ed2": "getStatus(string)", +"22b08180": "purchaseVideoGame(uint256)", +"22b0e99a": "EARTHToken()", +"22b0f6ee": "getStatusOfPayout(uint256)", +"22b11169": "setWalletOwnerAddress(address,address)", +"22b152a3": "liquidateLosing()", +"22b19192": "imAlive()", +"22b1a226": "withdrawPaymentsRegistrar(address,uint256)", +"22b1f39c": "currentInvoice()", +"22b263b2": "nextPlayerID()", +"22b2678a": "hasBalance(address)", +"22b28aa4": "resetTimes(uint256,uint256)", +"22b2ea22": "registerHWCDep(string)", +"22b2f178": "minimumDifficultyThresholdWei()", +"22b36d88": "stopTde(bool)", +"22b45ddc": "EarlyBackerDeposit(address,uint256)", +"22b4891d": "capICO()", +"22b524fe": "getFreelancer(address,uint256)", +"22b53192": "arr(bytes32)", +"22b53b4b": "accruedLiq(address)", +"22b6fe9e": "getAgreementSetCount()", +"22b6ffca": "isSignedUp(address)", +"22b79623": "resetEpocum(address)", +"22b87601": "testRemovePending()", +"22b930f7": "VESTING_1_DATE()", +"22b954f8": "poolFeeRate()", +"22b96b63": "getIPFSHash(address,bytes32)", +"22b9b712": "BETTING_OPENS()", +"22b9bd35": "adjustPrizePoolAfterWin(uint256,uint256)", +"22bac568": "grantAdditionalShares(address,uint256)", +"22bae392": "setBenecifiary(address)", +"22bb06d8": "marketting()", +"22bb4f53": "retentionMax()", +"22bbad0b": "instruments(uint256)", +"22bc0d6c": "appendEncryptedBid(bytes32,uint256)", +"22bc3b8e": "getArgument(uint256)", +"22bc98b1": "basicPresaleRate()", +"22bcabcd": "TOKENS_ACCELERATOR()", +"22bd6d3f": "hired()", +"22bdf293": "grantVestedEDEX(address,uint256)", +"22be9342": "resolve(uint256,uint256,bool)", +"22beb9b9": "scheduleDoIt(uint256)", +"22bf1a2a": "addrLockUp()", +"22bf2e24": "ROLE_STAFF()", +"22bf9d7c": "slashTranscoder(address,address,uint256,uint256)", +"22bfba59": "drawRandomUnitWinner()", +"22bfdcbb": "RaffleStrangeLoop(bytes32)", +"22c07ad3": "indFutureDeposit()", +"22c1d0d2": "_withdrawAmount(address,uint256)", +"22c21e6c": "ZHIHUIGUO()", +"22c25c50": "Addr7()", +"22c25d8f": "set_presale_arbits_total(address,uint256)", +"22c2b9eb": "MakeOver(address)", +"22c30931": "calculateStep(uint256)", +"22c4d98f": "hasAllowanceToRecieveTokens(address)", +"22c4f168": "setTransferFeeProp(uint256)", +"22c51659": "getWhitelistedZone(address)", +"22c5b279": "addLayer(address,uint256,bytes32)", +"22c61e73": "createContractPoo(string)", +"22c66ae7": "decimal_precission_difference_factor()", +"22c69b15": "tradeDAI(uint256,uint256)", +"22c6aad9": "pigcoin(uint256,string,string)", +"22c6ae15": "mul(uint64,uint64)", +"22c83245": "clearBlackAccount(address)", +"22c8c2cc": "setEtherPriceAuditor(address,bool)", +"22c9427e": "recycleDividend(uint256)", +"22cacd6b": "setUSDBtc(uint256)", +"22cb1ec8": "teamTokensMinted()", +"22ccd000": "Blocksale(uint256,string,uint8,string)", +"22cd5ea8": "claimBet(bytes32)", +"22ce1f8f": "VixcoreToken2(uint256,string,string)", +"22ce61b2": "globalMetSupply()", +"22ce9bac": "numberOfVotesCast()", +"22ced0bd": "BTrustToken()", +"22cf1745": "USTToken(address,string,string,uint8)", +"22cf5011": "privilegedTransfer(address,uint256,bytes)", +"22cf981d": "proposeMintLocked(address,uint256)", +"22cfadc7": "isFundingNow()", +"22d0d31f": "OD1Coin(uint256)", +"22d122a9": "MyTestWallet7()", +"22d1bd32": "currentlyActive(bool)", +"22d2cfac": "getNextElement(uint256)", +"22d310f9": "setMarket2(address)", +"22d34212": "get_eth()", +"22d40b96": "defcon()", +"22d4e0fd": "pay2(address,uint256,address)", +"22d60d17": "tokensPerWei()", +"22d6eb87": "getInfo2(address,address,uint256)", +"22d7642e": "getScene(uint256)", +"22d85334": "isValidBicoinAddressPrefix(bytes)", +"22d8c8a8": "AddMaterial(address,uint256,uint256)", +"22d8cf5b": "CheckUserVote(uint8,uint8)", +"22d9f13e": "changeCUSD(address)", +"22da10b0": "checkPermissions(address)", +"22da3368": "IoMTToken()", +"22da5d04": "tokenCreationMaxPreICO()", +"22db2f7b": "processOffchainPayment(address,uint256)", +"22db4143": "BONUS_THRESHOLD()", +"22db61ab": "setunitDefenseMultiplier(address,address,uint256,uint256,bool)", +"22dbaf75": "test_oneInvalidEqBytes32()", +"22dbd0e4": "payComisionSponsor(address)", +"22dbf6d2": "reserveFeeToWallet(address,address)", +"22dc36e2": "processed(uint64)", +"22dc5a85": "ERC20address()", +"22dc8e71": "setIV_R1(uint256)", +"22dce86c": "getEscuelas()", +"22dd0d2c": "TEAM_KEEPING()", +"22dd9b8c": "templateSupply()", +"22ddde5b": "getLRCAmount(address)", +"22dde4cd": "secToNextMiningInterval()", +"22de2457": "clientVerifyKeyHash(bytes32,bytes32,bytes32,bytes32)", +"22df1caf": "grantPresaleTokens(address[],uint256[])", +"22e01192": "setPrice(string,uint256)", +"22e02b22": "ClaimEth()", +"22e113a3": "freezeTokens(address,bool,uint256)", +"22e12720": "MAX_HOLDERS()", +"22e256e2": "Addr5()", +"22e2b31f": "unlockAmount(address,uint256)", +"22e37189": "tklosses()", +"22e3989b": "multNumerator()", +"22e412ce": "strikePut()", +"22e465ee": "tolerantSub(uint256,uint256)", +"22e58557": "getFreeEggs()", +"22e5aa3a": "totalProportion()", +"22e5d0fa": "CoCoToken()", +"22e62038": "close_bank()", +"22e63356": "setValueAgent(address)", +"22e67e71": "maxTime()", +"22e6f1d0": "giveGoldenTicket(address)", +"22e77ff3": "plz(address)", +"22e78480": "getGoldDataSku()", +"22e803c2": "transferBounty()", +"22e84682": "isValidContributorAddress(address,address)", +"22e8571d": "legalsAddress()", +"22e8c87d": "getUserData()", +"22e8c8fc": "gamble(uint256,uint256)", +"22e8df23": "ICO_MINIMUM_CONTRIBUTION()", +"22e91248": "getLeaf(uint256)", +"22e95f6c": "payout_normalizer()", +"22e9afca": "cofoundersSupplyVestingTranches()", +"22ea2231": "purchaseTokens(address,uint256)", +"22ea2d96": "getBookInfo()", +"22eb2c02": "viewPreSaleRefunds(address)", +"22ebb3ac": "DieselPricePeg()", +"22ebc4a0": "fpartSigned(int256)", +"22ec1244": "shaBid(bytes32,address,uint256,bytes32)", +"22ed6302": "setCrowdsale(address,uint256)", +"22ed96a0": "getInvestorsFee()", +"22ee1db4": "uint32At(uint32,bytes,uint256)", +"22ee46db": "VapeToken()", +"22ef83ef": "AuthInit(address)", +"22efee2d": "get_participant_num_of_pro_rata_tokens_alloted(address)", +"22f06ae4": "isRecoverer(address)", +"22f0e6ae": "MarketingMethodAddress()", +"22f0f2f9": "unlockContract()", +"22f16c8d": "checkDividends(address)", +"22f256f8": "buyIOD()", +"22f2f89a": "allOperationsCount()", +"22f3e2d4": "isActive()", +"22f43bb5": "seedGame()", +"22f4596f": "_maxSupply()", +"22f48627": "SIACASHCOIN()", +"22f4afb5": "relayKingContract()", +"22f4e916": "GdprCrowdsale(uint256,uint256,address)", +"22f607f6": "Escrow()", +"22f6af6e": "TokensBought(address,uint256,uint256,uint256)", +"22f6fa7a": "contractorTransfer_Bcoupon(address,uint256)", +"22f709dd": "getEther(address,address)", +"22f77d2a": "Refundable()", +"22f7be85": "setFlight(uint16,uint16,uint256,uint256)", +"22f7d1f8": "normalFunc()", +"22f85eaa": "buyOrder(uint256)", +"22f872a7": "allocateBounty()", +"22f8a2b8": "getDayOfWeek(uint256)", +"22f905ec": "GetPartNum(uint8)", +"22f93f16": "updatingViaOracle(string)", +"22fa1ff4": "MAX_PROMO_GIRLS()", +"22fa85ca": "testFailRegisterContractAgain()", +"22faa5db": "removeURL(string,uint256)", +"22faf03a": "setInstructor(string,uint256)", +"22fb5303": "_transferFromWithReference(address,address,uint256,string,address)", +"22fb71f1": "getGoldStatusVendorverify(address)", +"22fb730b": "claimerOfTwitterId(uint256)", +"22fbde38": "qtdePokemons(address)", +"22fbf1e8": "addDeveloper(address)", +"22fc3149": "setWhitelistThresholdBalanceInternal(uint256)", +"22fec5e7": "VEToken()", +"22fefe31": "devuelvePuntuaciones(bytes32)", +"22ff1110": "CancelSellOrder(bytes32,address,uint256,uint256,address)", +"22ff79d8": "USA()", +"23017a3a": "rewardVaultContract()", +"2301e7b7": "isInPreSaleState()", +"23020be5": "SetfirstTTax(uint256)", +"23023aa4": "_doCatchFish(uint16,uint16,bytes32)", +"23024408": "fund(address)", +"2302c948": "EtherDank()", +"2303084b": "hasTransfers(address)", +"23037a85": "setNextPrice(uint256)", +"23040327": "oraclize_query(string,bytes[4])", +"230434d2": "Technology5GCrowdsale(uint256,address,address)", +"2304ede4": "ADSToken(address,address)", +"230614fb": "batchTransferToken(address[])", +"23063da2": "Hellina()", +"230662f8": "changeSaleManager(address,address)", +"23087c04": "_isWinnerOf(address,address,address)", +"230894f8": "transferTileFromOwner(uint16,address)", +"2308a41c": "amountRaisedBy(uint256)", +"23092560": "RecoverAddress(bytes32,uint8,bytes32,bytes32)", +"23098a9a": "burnAssessor(address)", +"230a1074": "getRegionCurrentImageId(uint256)", +"230a14c0": "RISK_LEVEL()", +"230a3c05": "constructWeaponTokenId(uint256,uint256,uint256)", +"230a8020": "getAddressValue(uint256)", +"230b1eb5": "totalReservedTokenAllocation()", +"230b9667": "getProviderInfoFields(uint256)", +"230b9da3": "parentContract()", +"230bd25d": "requestBounty()", +"230c50fe": "AuthorizePayments(bool)", +"230c96b9": "BuyTokensWithAffiliate(address)", +"230cf412": "test(uint256,int256,uint256,uint256,uint256)", +"230d3469": "canExchangeNum()", +"230d6ed8": "addCandidate(bytes32)", +"230dff66": "theclub()", +"230f49d9": "buy_token(address[])", +"230f6e83": "getCrydrViewStandardNameHash()", +"2310b384": "finalizeStake()", +"2311542e": "SSOrgToken(string,string,uint256)", +"2311bdb2": "isForgiven(string)", +"2311d39c": "dot()", +"2311dc0b": "postProduct(bytes32,bytes32,bytes1)", +"2311e345": "SaleFinalized(address,uint256)", +"23133115": "changeIncreaseStep(uint256)", +"23141fd0": "sendP(address,uint256)", +"23145ca0": "forceCheck()", +"23146c20": "getBuyerAddressPayment(address,uint256)", +"2314a5c8": "getReput(address)", +"2314aad6": "setExtensions(address)", +"2315550e": "add(address[],uint256[])", +"23158cae": "addBet(uint256,uint256)", +"23165b75": "acceptBidForPunk(uint256,uint256)", +"23169ec4": "medalName()", +"23169fca": "EDU_PER_ETH_EARLY_PRE_SALE()", +"2316d0cd": "deathData_a16()", +"2317880c": "requestArbitration(bytes32)", +"2317c28e": "mediaTokenIndex(uint256)", +"2317cd54": "_endRound()", +"2317ef67": "removeAsset(address,uint256)", +"2317f9f3": "setSanMaxAmount(uint256)", +"2318ffc7": "setRokBalance(address,uint256)", +"23191bf1": "finalizeByArbitrator(bytes32,bytes32)", +"231944e2": "moveUnits(uint256,uint256,uint256[])", +"23198b98": "setTokenHolderTribunal(address)", +"231a00cc": "changeBonusRate(uint256)", +"231a2be3": "minimumContributionPhase6()", +"231a439e": "setBlacklistDestroyer(address)", +"231ace68": "MiningRewardPerETHBlock()", +"231b0268": "firstBlock()", +"231b48aa": "settingsSetWeiPerMinToken(uint256)", +"231c1ce8": "unusedMethod(address)", +"231c1d43": "generate(uint256,string)", +"231cb6ab": "ENS_SUB_APP_NAME()", +"231d45a4": "addProduct(uint256,uint256,uint8,bytes32)", +"231d87e1": "competitorTeam(uint256)", +"231da56e": "getSenderValue()", +"231e0750": "register(bytes32,bytes32,bytes32,bytes32)", +"231e18a9": "pureFunc()", +"231fa805": "IsControledAddress(address)", +"23210c1a": "StfuToken()", +"23214fab": "maxProfitAsPercentOfHouse()", +"2321e625": "publicSaleSencPerMEth()", +"23221f1e": "getNbVersions(string,string)", +"2322f484": "balancesQuantity()", +"232397e2": "addAccount(uint256,uint16,bytes32,uint256)", +"2323a00e": "WagaToken()", +"23240d81": "getDailyTransactionVolumeReceiving()", +"23245216": "removeWhitelist(address[])", +"2324c67c": "getAllSignatureHashes(bytes4)", +"232523e8": "forceDivestOfAllInvestors()", +"23260a8b": "getPreviousPrice(bytes10)", +"23262615": "claimVaultOwnership()", +"23266dfe": "getOrganizersAddresses()", +"2326df93": "site_url()", +"2326ef22": "CreateDMSContract(address,bytes32,uint32)", +"2326faf9": "getResearchPerDay(address)", +"23285480": "RefundDeposit(address,uint256)", +"23290737": "logMarketTransferred(address,address,address)", +"2329b4f7": "CryptDash()", +"232a2c1d": "executeSignatures(uint8[],bytes32[],bytes32[],bytes)", +"232a3060": "setFundManager(address)", +"232a6b9d": "signed()", +"232c4d24": "sub_fCode(string,uint256)", +"232c6bab": "delIndividualCertificate(string,bytes32)", +"232cae0b": "last_offer_id()", +"232db034": "abortFunding()", +"232e57c1": "optionSupply()", +"232e7e91": "getproduct(uint256,uint256)", +"232e9051": "gunsFund()", +"232fd216": "getPoolDone(uint256)", +"233023de": "setCertifierInfo(address,bool,string)", +"23306ed6": "getMinimumBond()", +"2330f247": "isAuthority(address)", +"233104d6": "setPresidenteDeMesa(bytes32)", +"233120aa": "getChainyURL()", +"2331af61": "transferActive()", +"23338b88": "delMinter(address)", +"23343af3": "setConfigAddress(address,address)", +"2334623f": "totalETM()", +"23350e4a": "regainEther()", +"23355749": "IkokoToken()", +"2335d307": "IFSActive(address,uint256,uint256)", +"2337d9f1": "endOfferingImpl()", +"23385089": "emitApprove(address,address,uint256)", +"23389c5a": "docs(uint256)", +"2338c002": "_applyShare(address,address,uint256)", +"233907a3": "signedApproveAndCallSig()", +"23394e46": "TripAlly()", +"2339dd43": "HcftSale(address,address)", +"233a04ec": "setEditionSales(uint8,uint256)", +"233a74c9": "currentTokenDistribution()", +"233aacf9": "Announce_winner(address,address,uint256)", +"233ab10d": "setBaseEthCapPerAddress(uint256)", +"233b39c9": "_initCardDetails(uint8,uint256)", +"233b7451": "lastStakedFor(address)", +"233bf71e": "FOCToken()", +"233d264a": "startTicker()", +"233de126": "odds()", +"233dedf1": "averageBlockTime()", +"233e0877": "Purchase(address)", +"233e3220": "renounceSuperInvestor()", +"233e5d00": "WorldStage()", +"233ff4b2": "_fund(uint256)", +"23400cf6": "getLOCCount()", +"2340903d": "EEZcoin(address)", +"23412ede": "StorageEnabled(bool)", +"2341a1af": "receivePlayerInfo(uint256,address,bytes32,uint256,uint8)", +"2341d778": "giveTix(uint256,address)", +"2342293d": "collectionFees()", +"23437d50": "discountICO()", +"23447982": "replaceManager(address)", +"2344acdf": "pauseOffset()", +"2344b0e5": "url_white_paper()", +"2344e4ec": "getHint(uint256)", +"23452b9c": "cancelOwnershipTransfer()", +"2345fe81": "xperToken()", +"234638df": "PreICOHardcap()", +"23471d18": "setStakeAddress(address)", +"2348238c": "transferPrimary(address)", +"23483e45": "delRosenCertAdmin(address)", +"2348f1ee": "lockAttemp()", +"234917d4": "getCallTargetBlock(bytes32)", +"2349748d": "MenoroCashSupply()", +"2349e719": "processStepsByStep(uint256,uint256)", +"234a0ee7": "appHub()", +"234a6ed8": "initializeToken(address)", +"234ae1a0": "WallDirectory()", +"234b2cb4": "whitelistApplication(string)", +"234c0ae5": "combine(uint256[],uint256)", +"234c4bd9": "deployStepThree()", +"234e0056": "COIN_SUPPLY_ICO_PHASE_1()", +"234e5273": "tittyContract()", +"234e5f16": "TIMETHRESHOLD()", +"234ea19c": "lockRate()", +"234f1eb6": "JVToken(address,address,address,uint256)", +"234f9db2": "getBalanceIco()", +"235029ee": "SQT()", +"23509e69": "donkeysEligibleForFees()", +"2350e762": "participantWithdrawIfMinimumFundingNotReached(uint256)", +"2351299a": "createTokensToOwner(uint256)", +"2351baca": "fechVoteNum(address)", +"2351c2f8": "get_tokenReward()", +"2352551f": "bbPublicSaleWallet()", +"23525826": "maxNumbPerSubscr()", +"23526a34": "turnOffSale()", +"235304b2": "updateNextGameInitalMinBetSize(uint256)", +"23533138": "seedMarket(uint256,uint256)", +"23537880": "TestSale()", +"23539cd4": "mintResource(uint16,uint256)", +"235422fb": "_medalUnFreeze()", +"23548b8b": "maxCap()", +"2354b3ed": "requestSatsPrice(string)", +"2354bda7": "auditGuess(uint256,string,uint8,uint256,uint8,uint256)", +"2354ecf7": "balanceOfOnUpdate(bool)", +"2355300f": "unspentCreditsWithdrawn()", +"2355c602": "queryToAddress(bytes32)", +"2356f46a": "Kontlo()", +"23571ac9": "seenHereA(uint256)", +"2357cd3b": "invadeAddress()", +"23584a21": "initStats(string,address,uint256)", +"23586685": "recordSale(uint256,uint256)", +"23587733": "DEVELOPER_BONUS()", +"2359116d": "refill(address,uint256,string)", +"23594797": "createContractRegion(string)", +"235977ca": "ParadiseTokenSale(address,uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"2359bd08": "reinvestTokens(address)", +"235b1eb7": "getOverRate(uint8)", +"235bd895": "_getGameInfoPart1(address,uint256)", +"235c002d": "transferOther(address,address,uint256)", +"235c279f": "addEmitter(address)", +"235c9603": "getNextTranscoderInPool(address)", +"235e5d47": "isRoundEnd(uint32)", +"2360f5a1": "openSaleSupply()", +"2362189a": "defaultExchangeRate()", +"23624a10": "tokenFee(uint256)", +"23626067": "thirdCheckpointPrice()", +"23626df7": "setContractAddress(address,address)", +"2362b26d": "Awards(uint256)", +"23637e60": "votePrice(uint256,bool)", +"23647398": "testThrowRetractNotOwner()", +"23655d7b": "Fantom()", +"236571e2": "determineWinnerEven(string)", +"2365ceb3": "SetWagerData(bytes32,bytes15)", +"2367e1ae": "getLengthOfMatches()", +"2367f35d": "crowdsaleEnded()", +"23685b97": "bpToken()", +"2368d215": "multipleAddToWhitelist(address[])", +"236a160e": "isValidIssuance(uint256,uint256,uint256,uint256)", +"236a8d9d": "registerNode(uint256,uint256)", +"236ae025": "distributionThreshold()", +"236be3e2": "BlockcloudToken()", +"236dd0e8": "paidBidAllocationFee(bytes32)", +"236e06f6": "exchange(address,uint256,uint256)", +"236e1a15": "PromotionCoinMintFinished()", +"236ebbae": "setAuditNodePrice(uint256)", +"236ed5a6": "getVoterProposalsCount(address)", +"236ed8f3": "closeAuction(uint256)", +"236eeff7": "compensate_log(uint256,address)", +"236f86a1": "remainingTokens(address)", +"236ffad4": "initOwned(address)", +"237032da": "isBacker()", +"237082bd": "getCertifiedDocCount(address)", +"2371bb4b": "SetNumber(uint64)", +"23724ffd": "TransferManagerApproved(address)", +"237297a4": "claimWinner()", +"2372996a": "CUSTOM_ERC20_CREATE_SERVICE_NAME()", +"23732ad8": "OSTestToken()", +"2373f091": "_setMinter(address)", +"23749f69": "donationsEndedTime()", +"23751e95": "addRedbullQuest(address)", +"237548fa": "seriesFactory()", +"2375766a": "unlatchContract()", +"2375da83": "setIntArr(uint256,address)", +"2376fe70": "approveProxy(address,address,uint256)", +"23773f81": "calcTapAmount()", +"2378fe2d": "FAPFundDeposit2()", +"23797ed9": "getAppByIndex(uint256)", +"237a35b2": "professionalName()", +"237a4a7f": "requestOneUUID(address,uint256)", +"237b5e96": "child()", +"237c2b22": "MCTCrowdsale(uint256,uint256,uint256)", +"237c72ac": "replaceDecoration(uint256,uint256)", +"237d2628": "issueTokens(address,uint256,uint8)", +"237e9492": "executeProposal(uint256,bytes)", +"237f142a": "ownersLen()", +"237f1a21": "hasIdentity(address)", +"23807da8": "getInvoicingAddressCount(string)", +"2380c39d": "backUtcoinOwner()", +"2382534a": "STR()", +"2383b074": "getSurplus()", +"23845e4b": "getPoolSize()", +"2384c058": "account3()", +"23855c18": "updateDeposit(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)", +"23855cd3": "setBalanceForUser(bytes32,uint256)", +"23858314": "sizeOfProviders()", +"238604f0": "SuperContract()", +"23866438": "joinChannel(bytes32,uint256[2])", +"23867979": "getHealBalance()", +"2386d33e": "_tenuousToken()", +"2387c87d": "setTokensSold(uint256)", +"2387e75e": "RequestBitcoinNodesValidation(address,address)", +"23898138": "MoneyCoin()", +"2389a290": "joinGame(address)", +"238a3fe1": "transferDistribution(address,uint256)", +"238ac933": "signer()", +"238bf375": "PROMETHEUS_MAX_PRICE()", +"238bfba2": "getChannelWith(address)", +"238c5b06": "icoDiscountPercentageLevel1()", +"238d3590": "getTotalTheoreticalSupply()", +"238dafe0": "enabled()", +"238e5b14": "burnAmount(address)", +"238e9de7": "StopFuseaNetworkDistribution()", +"238efcbc": "acceptGovernance()", +"238f7743": "unlockSecondTokens()", +"238fcbf8": "DISCOUNT_TOKEN_AMOUNT_T2()", +"2390507b": "COMMUNITY_ADVISERS_STAKE()", +"239131af": "NEXUS()", +"2391ddf3": "handleLuckyPending(uint256)", +"2391f0b3": "isProtect(bytes32,uint8)", +"23924cff": "TeamLockingPeriod6Months()", +"23926732": "ifDestory(address)", +"23949cd1": "setNFTContractAddress(address)", +"2394a797": "makeHybridization(uint256,uint256)", +"2394cc40": "transferInternally(address,address,uint256)", +"2395e9b6": "specialAllowed(address)", +"23967d78": "FOUNDATION_HOLDER()", +"2397e4d7": "sellToken(uint256)", +"2397f92b": "KNDToken()", +"23985742": "STANToken()", +"23987690": "indFuture()", +"2398a6a6": "sendPrize(uint256)", +"2398b8fc": "SCHEMA_HASH()", +"2399a5af": "balanceAdd(address,address,uint256)", +"2399e1f2": "addPromotionalCompany(string,uint256,uint256,uint256)", +"2399f870": "updateFlipAndMDT(address,uint256,address,uint256)", +"239a2545": "totalNights()", +"239ab208": "notifyAssessors(uint256,uint256)", +"239aee06": "execute(address,address,address,uint256)", +"239b6dd1": "QUINToken(uint256,string,string,uint256)", +"239bb5a6": "getConstructorString()", +"239c02ba": "OPSToken()", +"239d339b": "updateStageByTime()", +"239da1a3": "SportStarMaster()", +"239da7de": "getServiceFeeDenominator()", +"239e7881": "GEBEC()", +"239e83df": "guardedArrayReplace(bytes,bytes,bytes)", +"239f26ee": "BethereumERC223()", +"239f29dd": "setConsensusPercent(uint256)", +"239fcf0f": "Balance(address)", +"239fd68f": "setCurrentPricePerWei(uint256)", +"23a08d97": "totalPreICOavailible()", +"23a1b159": "maxTimeBonusPercent()", +"23a1bd8f": "Dancoin()", +"23a1c271": "setPongval(int8)", +"23a1e00e": "openLeaderboard(uint8,string)", +"23a24a33": "setBAA(bytes32,address,address)", +"23a2725a": "LeS3coin()", +"23a27bcd": "checkProofOrdered(bytes,bytes32,bytes32,uint256)", +"23a31463": "setBlockLock(bool)", +"23a3335c": "BuufmanToken()", +"23a36d2b": "mintToken(address,uint256,uint256)", +"23a37c09": "addRNTBContribution(address,uint256)", +"23a3ad72": "checkRole(address,uint8)", +"23a50727": "endStage(uint256,uint256)", +"23a52674": "expandX()", +"23a58576": "zeroBool()", +"23a6b8ca": "currentBeneficiaryCap()", +"23a8792e": "ChangeTokenPrice(uint256)", +"23a8edb5": "LociBackend()", +"23a90e5e": "getCustomerTxTimestampPaymentMCW(address,bytes32)", +"23a9a156": "SNL()", +"23aa6a17": "issueTokenAndApprove(uint256,uint256,address)", +"23aa7e12": "controllerDelegate()", +"23aba14f": "iCapToken()", +"23abea43": "getPlayerKeys(uint256,uint256)", +"23ac3fd4": "getPOOL_edit_32()", +"23ac4b03": "addQuickPromoBonus(uint256)", +"23ac9ae2": "CcStandardToken(uint256,string,uint8,string)", +"23add736": "claim(uint256,uint256,uint8,bytes,bytes)", +"23adeb05": "OneChance(address,address,address)", +"23ae4438": "getLastRoundInfo(uint256)", +"23aea69d": "isNextBudgetPlanMade()", +"23aed228": "selling()", +"23aedc62": "startSale(uint256[],uint256[],uint256,uint256)", +"23afba86": "Lancer()", +"23b06313": "getPoolBonusFirstExpertFactor(uint256)", +"23b0abeb": "showPhaseInfo(uint256)", +"23b0bbea": "getBullsmasterReq()", +"23b0db47": "delegate_2x(address,uint256[],address[],bytes32[])", +"23b1131c": "unlockDate2()", +"23b11bb1": "getPropertyLastUpdate(uint16)", +"23b11d8d": "addProxy(address)", +"23b17715": "AddressDescriptionAdded(address,string)", +"23b1ed54": "getConstantName()", +"23b1f8e4": "lastPriceUpdateTimestamp()", +"23b2b48f": "addressToAccountMap(address)", +"23b364ab": "getAvailableTicketCount()", +"23b37bb6": "sqrt(uint64)", +"23b3af89": "addHolder(address,address)", +"23b3b704": "calculateUntaxedEthereumReceived(uint256)", +"23b3c771": "getFreeShrimp()", +"23b44cfc": "assignNewParcel(int256,int256,address,string)", +"23b493fe": "getUserFiatBalance(string)", +"23b5aa8d": "STAT()", +"23b5b257": "tokenHasFreeTrial(address,address)", +"23b62b75": "mainWallet()", +"23b6ce11": "buyDiscipleItem(uint256,uint256,uint256,uint256)", +"23b6fc8b": "verifyUrl()", +"23b715cb": "updateShare(address[],address,uint256[],uint256)", +"23b7b140": "setFreezTime(uint256)", +"23b7ec3b": "ownerOf(uint32)", +"23b7fc86": "count_token_holders()", +"23b80995": "saleOver()", +"23b872dd": "transferFrom(address,address,uint256)", +"23b8feb0": "safeMul_dec(uint256,uint256)", +"23b98f92": "getPOOL_edit_6()", +"23ba3420": "t_Michail()", +"23ba467a": "isLastRound()", +"23bb1f69": "prepareToScore(uint32)", +"23bb8022": "getCurrentRateByTokenSold()", +"23bb81ae": "transferSoldToken(address,address,uint256)", +"23bba494": "setContribPeriod(uint256,uint256,uint256,uint256,uint256)", +"23bc29a0": "systemEndingPrice()", +"23bcaae9": "newPost(string)", +"23bd4d7a": "organization()", +"23bd9914": "_calcReward()", +"23bda0ee": "MyCurrency()", +"23be45e2": "matchOrders(bytes,bytes)", +"23bef5dd": "storeWelfare(address,string)", +"23bf0425": "fastEnd()", +"23bf2973": "tgeSettingsPartFounders()", +"23bfc777": "changeRoundDelay(uint256)", +"23c0889a": "initMinerData()", +"23c105a2": "eliminateFrom(address,uint256)", +"23c1236a": "burnFromByAddress(address,uint256,address)", +"23c2460d": "rate(uint16,uint256)", +"23c2b4ea": "finishPREICO()", +"23c2de55": "SmartContractCasino()", +"23c32d74": "cstToMicro()", +"23c3dae7": "NewTranch(uint256)", +"23c4841e": "ToggleFreezeBuying()", +"23c4948c": "getDonator(address)", +"23c5a088": "updateCost(uint256)", +"23c5c55a": "buyImagePriv(uint256)", +"23c5e967": "mul2Throw(uint256)", +"23c639fe": "getback(uint256,uint256)", +"23c69d2a": "currentDividend()", +"23c6bc39": "addressThreshold()", +"23c6c98b": "activeShareholdersArray(uint256)", +"23c731f5": "isCanList()", +"23c79ab3": "CoinFuns()", +"23c850db": "registerGold()", +"23c860a8": "INTREPID_SHIP_PRICE()", +"23c89a00": "requestSignature(bytes32[8],bytes)", +"23c94353": "currentTokenBalance()", +"23c99826": "getDictJob(address,uint32)", +"23cadd34": "move(address)", +"23cafc3d": "voteNoLockByAdminBatch(address[],address[],uint256[])", +"23cb7b19": "_influenceAlgorithm(uint8,uint256)", +"23cba56f": "bonusProgramEnded()", +"23cc16be": "burnInvestorTokens(address,address)", +"23cc3496": "_setRunesValue11(uint256)", +"23cc75a8": "finalizeICO()", +"23cc7615": "userIdIndex()", +"23cc9a90": "addParticipant(address,address,address)", +"23cd5090": "registerToProvider(address)", +"23cd7cd5": "Model()", +"23cdd8e8": "log(string,bytes)", +"23ceb6d8": "mintTokenEscrow(address,uint256)", +"23d0601d": "getAccountIdFromSignature(bytes32,bytes)", +"23d17a40": "addrBRXPay()", +"23d1ab35": "donationReceiverLocked()", +"23d1b8eb": "etherPayout()", +"23d1c95e": "addProposal(string,string)", +"23d1fe56": "s22(bytes1)", +"23d24f24": "LogEscrowEth(uint256)", +"23d2691b": "addAuditRequest(address,string,uint256)", +"23d27633": "EtherLite()", +"23d2b3aa": "HaoCoin()", +"23d32d6a": "generatedBytes()", +"23d34f84": "setGuessAnswer(string)", +"23d44dee": "collectedSignatures(address)", +"23d533c8": "EBCBToken()", +"23d5a686": "getSpaceshipUpgradeCount()", +"23d669db": "setValidationClosed(uint256)", +"23d6b008": "assignedAmountToTheFoundation()", +"23d6c92f": "setFreelancerParams(uint256)", +"23d71b26": "mtrTokenFallBack(address,uint256)", +"23d73ca5": "test_invalidEmptyNotOne()", +"23d7caee": "BitMineToken()", +"23d7e089": "getPotCost()", +"23d808da": "getMatch(uint8)", +"23d80d3a": "IfContractRegist(address)", +"23d862ed": "getAddressLockedLength(address,address)", +"23d88efd": "preIcoTokenSupply()", +"23d9ea80": "getOfferPriceCandy(uint256)", +"23da9c4b": "WhiteListAccess()", +"23db3e50": "_checkAreaAndCategory(uint256,uint256,uint256)", +"23dbf825": "distributionComplete()", +"23dc1314": "failSafeLimit()", +"23dc14c0": "AdAgency()", +"23dc210f": "transferToAddress(address,address,uint256)", +"23dc33b9": "reward6()", +"23dc3f72": "_checkGrid(uint256,uint256,uint256)", +"23dc42e7": "query1(uint256,string,string)", +"23dca40f": "Submit(uint256,bytes32,uint16)", +"23dccbd6": "LogFollow(uint256,address,uint256)", +"23dd03c3": "getLLV_edit_23()", +"23dd523d": "unregisterMember(uint256)", +"23dd797b": "setESOP(address,address)", +"23dddaba": "simpleVotingDapp(bytes32[])", +"23de1915": "NewTicket(address,bool)", +"23de6651": "emitTransfer(address,address,uint256)", +"23defc77": "setHeir(address)", +"23df9df5": "_refund(uint256)", +"23dfed97": "emitCategoryEvaluated(address,address,uint8,uint256,uint256)", +"23e1d351": "buyKeyUseBalance(uint256)", +"23e1d8d0": "failedTimestampLength()", +"23e1f881": "PendingOwnershipTransfer(address,address)", +"23e25f7d": "sendReserveBalance(address,uint256)", +"23e26c43": "datestart()", +"23e375dd": "_computePrice(uint256,uint256,uint256,uint256)", +"23e3d7a9": "updateDescriptiveInformation(address,string,string,string,string,bytes20)", +"23e3fbd5": "depositOf(address)", +"23e4172d": "testValidationOfDecrease()", +"23e44848": "DPToken()", +"23e4d669": "getPlayerPortfolio()", +"23e53b2e": "setSiringAuctionAddress(address,address)", +"23e5942a": "initWallets(address,address,address,address)", +"23e5d13c": "declareWinner(address,bool)", +"23e5e822": "mintToken(int256,address,uint256,address)", +"23e5f1c5": "hour()", +"23e798e6": "getDocumentIdWithName(string)", +"23e7a900": "setIcoEnd(uint256)", +"23e7d9b2": "createInvoice(bytes32,address,uint256,string)", +"23e8cefc": "encodeIfElse(uint256,uint256,uint256)", +"23e957b6": "calculateScore(address)", +"23e9637f": "setSoftCapInCents(uint256)", +"23e9c216": "setBounty(address,string,uint256)", +"23eac4bd": "setTokenOwner(uint256,address)", +"23eb0197": "giveMemberAllowance(address,uint256)", +"23eb3831": "PurchaseCapChanged(uint256)", +"23eb861c": "unchainedMultisigVersionMajor()", +"23ec5939": "returnInvestoramount(address,uint256)", +"23ec8f62": "ownerUnlockFund()", +"23ecb66f": "getPreviousDate(bytes32)", +"23ecc4a1": "claimAmountSet()", +"23ecf108": "MartinKoToken()", +"23ed0a2e": "registerWorker(uint256,uint256,bytes32,bytes32)", +"23ed476f": "treasurySent()", +"23edfb89": "cancelSaleWhenPaused(uint256)", +"23ef2e4f": "stopPreIcoMint()", +"23ef2e56": "setBAI(bytes32,address,int256)", +"23ef604f": "removeOwnedNote(address,uint256,uint256)", +"23f02f56": "crowdEther()", +"23f0b2b6": "getProfile(address,string)", +"23f14e86": "setAutoAddress(address,address)", +"23f1dbe0": "minBidPercentage()", +"23f2cbb0": "sponsorGas()", +"23f3ad03": "ParminderToken()", +"23f4c025": "Cherrio()", +"23f5c64f": "get_data_owner(address,address,string)", +"23f614dd": "TinyOracleLookup()", +"23f64051": "setClaimToken(bool)", +"23f64140": "depositAgent(uint256,uint256,uint256[],uint256[],uint256)", +"23f685dd": "getUnclaimedHalvingSubsidy(uint256)", +"23f6e4fb": "Registered(address,address,uint256,uint256,uint256)", +"23f7dc66": "hasReadership(address,uint256)", +"23f806b7": "tokenAdvisoryBountyTeam()", +"23f809f6": "generateAddAddressSchemaHash(address,bytes32)", +"23f907d9": "MAXIMUM_ETHER_SPEND()", +"23f938ee": "isTransferLock(address,address)", +"23fa370d": "suspendedUntil()", +"23fa495a": "setFlatFee(uint256)", +"23fcdb20": "getRequiredSigs()", +"23fd0176": "destroyCredits(uint256)", +"23fd4524": "OMT()", +"23fe073e": "BancorQuickConverter()", +"23fe1da1": "purchaseWithETH(address)", +"23fe5b90": "hardCapFundingGoalInCents()", +"23fe6146": "pushIssuers(address[])", +"23fed09e": "hasEnoughFund()", +"23ff2af0": "setAttrs(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"23ffcc3e": "PenchantICO()", +"24008a62": "repayBorrowAllowed(address,address,address,uint256)", +"2400b582": "_issue(address,address,uint256,bytes,bytes)", +"2401db10": "sendFunding(address,uint256)", +"24021127": "_setOriginationFee(uint256)", +"2402598c": "BNSToken()", +"24026bfb": "getMarketOrderTrust(uint256)", +"2402ae57": "YudizCoin()", +"24032866": "checkExecutionAuthorization(address,uint256)", +"24038339": "updatePriceAndDenominator(uint256,uint256)", +"24038d2e": "purchaseArmy(uint256)", +"2404608f": "getSignatures(string)", +"24052927": "velReduction(int256)", +"240557b8": "cleanTokensAmount(address,uint256)", +"2405b1a3": "SwissBit(uint256)", +"2405d03e": "refundTokensPurchase(address,uint256)", +"2405e3c6": "initial_supply()", +"24064617": "getMom(address)", +"2406cedb": "setPackageOwner(bytes32,address)", +"2406e626": "createPool(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"2406e9fa": "playRandom(address)", +"240705eb": "withdrawWithFee(address,uint256,uint256)", +"24070feb": "_create(address,uint8,uint8)", +"240860f1": "setHasCommissionerAuction(uint32)", +"2408771e": "validateInvestmentGroups(address[])", +"240961db": "showPoolOwner(uint256)", +"2409dfa2": "drawback()", +"240ad8bd": "applyAsProvider(string,string,string,string)", +"240bd9e6": "DcorpProxyCreated(address,address)", +"240c2709": "toReserved(address,uint256)", +"240cf1fa": "changeOwnerSigned(address,uint8,bytes32,bytes32,address)", +"240dfd6e": "stopEnrollment()", +"240e07e0": "impl_apply4Redeem(address,uint256)", +"240e0b2e": "JinKuangLian()", +"240ecad5": "transferViaProxy(address,address,uint256)", +"24108475": "vote(uint256,string)", +"2411ca69": "startPrivatesaleDate()", +"2411e6a3": "NonEmissiveToken(address,string,uint8,string,string,uint256)", +"2412bdb8": "exchange(address)", +"2413372d": "TestETCCoin()", +"24141f14": "CRYPTOHEDGECoin(uint256,string,string)", +"2414b63e": "CasinoBank(uint256,address)", +"2414e134": "NEWCICO(address)", +"24153b73": "Tosh(uint256,string,uint8,string)", +"241673e8": "withdrawTokenToFounders()", +"24167745": "ShamelessUETRipoff()", +"2417f31d": "maxPresaleTokens()", +"2419217e": "teamAddresses(uint256)", +"2419ef4d": "Coverage()", +"241a2305": "MultiTransfer(address,address[],uint256[])", +"241b701f": "openPot()", +"241b88b6": "threeMillionTwoHundredThousand()", +"241d1108": "nextDerivativeToken()", +"241d2c76": "getCount(address,string)", +"241d7aea": "BeautyCoinToken()", +"241de9e9": "proxy(address,address,uint256,uint256)", +"241e0fa0": "updateBytes20inBytes(bytes,uint256,bytes20)", +"241ea03c": "Pregnant(address,uint256,uint256,uint256)", +"241f675d": "CMO_SHARE()", +"24206c2e": "updateTokenAddress(address,address)", +"2420703e": "transfer_tokens_through_proxy_to_contract(address,address,uint256)", +"2421101f": "returnAddress(address)", +"2422224e": "signatures(bytes32)", +"24223a3c": "allowanceItem(uint256,uint256,uint256,address)", +"2422d991": "getADR()", +"2423a088": "UNKNOWN_TYPE()", +"24241ebc": "challengeWithPastCustody(address,uint256,bytes32[],uint256[],bytes32[])", +"2424276c": "freezeMultiAccounts(address[],bool)", +"24248168": "getBracketScore(bytes8,bytes8,uint64)", +"24250852": "mintToPublic(address,string)", +"2425ce3e": "upgradeTank(uint256,uint8)", +"2426169a": "_getSwapType(bytes32)", +"24263f77": "mintICOTokens(address,uint256)", +"24265000": "canCollect(uint16,uint16,uint8)", +"24265408": "FaucetManager(address,address[])", +"242654a2": "transferEnable()", +"242655d4": "prefixedEncode(address)", +"24270d1e": "get_arbits_max_contribution(address)", +"24272479": "_finishBet(uint256)", +"24280cc4": "createPuppySaleAuction(uint256,uint256,uint256,uint256)", +"24285ade": "AlpineMegalith(uint256,string,uint8,string)", +"24294b1f": "startFirstRound()", +"2429b755": "isPrivateSaleRunning()", +"2429d61a": "isOnSale(uint32,uint64)", +"2429ee2a": "isBountyPayStage()", +"242a0087": "getParents(uint256)", +"242a60b5": "withdrawValue(bool)", +"242a7450": "validateTenant(address,bytes32,uint256)", +"242aa460": "presaleInvestors(address)", +"242aeac1": "DiscoverCoin()", +"242b0a73": "rewardPayedOf(address)", +"242be01a": "_setAppIfNew(bytes32,bytes32,address)", +"242c721e": "testSetOrganiserUsingDeployedContract()", +"242c9ce9": "_burnFrom(address,address,uint256)", +"242ce07b": "frozensTotal(address)", +"242d1259": "WeiWeiToken(address,uint256)", +"242d7dba": "totalAmountRaised()", +"242d9f69": "getOraclizeWinnerGasFee()", +"242db433": "getMarketManagerAddress()", +"242ddf37": "NewBook(bytes32,address,uint256)", +"242de145": "TokenCreationContract()", +"242ed69f": "setActiveTranscoders()", +"242fc36e": "cashback()", +"243056d6": "writeMerchandises(uint256,string)", +"2430731f": "cancelRecurringBillingInternal(uint256)", +"2430d881": "getLastAction(address)", +"2431676c": "getTotalWinsCount()", +"24318b5c": "numberOfHosting(address)", +"2431f164": "process_payment()", +"243222c0": "processFailedVerification(bytes32)", +"2432282d": "getLoanCountForAddress(address)", +"24323110": "McFlyCrowd(uint256,uint256,address,address,address,address,address,address,address,address,address,address,address,address,address)", +"2432eb23": "testThrowRetractLatestRevisionNotUpdatable()", +"2433c978": "setupOwners(address[])", +"2433f617": "getIIPTotalSupply()", +"24349551": "deleteContract(uint256,uint8[],bytes32[],bytes32[])", +"2434cf10": "UseBySoftware(address)", +"2434ec3e": "declareLost(address,bytes32)", +"243527a2": "addID(address,bytes32)", +"24355ea6": "isA(address)", +"24359879": "ownerAt(uint256)", +"24361cec": "picops_block()", +"2436219c": "doubleEntryPrice()", +"243669ad": "totalOwners()", +"2436b1d2": "NUM_COUNTRIES()", +"2436d4e3": "TwoStandardToken(uint256,string,uint8,string)", +"2436d5f8": "StorageBase(address)", +"2437160f": "TFTOKEN()", +"24372fa3": "SignCurrentVersion(string)", +"24378482": "bnOf(bytes32,bytes32)", +"2437e1c2": "setPresaleParams(uint256,uint32,uint32,uint256,uint256,uint256)", +"24386b3e": "testMultitransfer3()", +"243870bd": "createChannel(string,bytes,address,address,address[],uint256[],address,uint32[])", +"2438b674": "window2TokenExchangeRate()", +"2438db59": "setServices(address,address)", +"243a28eb": "returnedWei(address,uint256)", +"243af82d": "stageBuys(address)", +"243b22cf": "setGameResult(uint256)", +"243b2a39": "createDispute(bytes32,address,address,bytes32)", +"243c33a1": "testCreateShortId()", +"243d230c": "dateTo()", +"243d3827": "getRewardInfo(uint256)", +"243d51b4": "betD()", +"243dc8da": "getFoo()", +"243e280b": "publish(string)", +"243eb89f": "endIcoMainSale()", +"243f6b58": "removeKYC(address)", +"243f6e0c": "change_active(uint256)", +"243feeb0": "ADDR_TKG_ASSOCIATION()", +"24415953": "lengthEqual(int256[],uint256,string)", +"244159af": "getPriceOneToken()", +"24417f39": "getCostForHealth(uint8)", +"24425cbf": "TEST_CONTRIBUTION()", +"24429e34": "OliveGardensResort()", +"2442cfec": "putBtoWithStc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"2442e1cb": "getMilestone(uint256)", +"24434852": "buyOnBehalfWithCustomerId(address,uint128)", +"2443a30e": "ChangeInsurerOperationEvent(address,uint256)", +"2443f0ae": "derivePayoutDistributionHash(uint256[],bool)", +"24444749": "NUM_POTATOES()", +"2444d352": "setWhitelistOff()", +"24452f44": "tryBuy(uint256,uint256)", +"24453ed6": "getCustomerTxAmountMCW(address,bytes32)", +"24454fc4": "getTranscoderEarningsPoolForRound(address,uint256)", +"24455e7d": "createNetwork(string,string,uint256,uint256,uint256,uint256,uint8)", +"24457036": "LockChainFundDeposit()", +"2445caf1": "ERC20Token(uint256,string,string,uint8)", +"24463cbe": "AddressDailyReward(address)", +"2446e1de": "icoClose()", +"2447fe10": "initBridge()", +"2448fe2f": "redTeamSupply()", +"24496026": "removeQuoter(address)", +"244967b3": "start_game()", +"24497829": "ethFundAddress()", +"2449dd55": "sendCommission()", +"244b252a": "SaturnToken()", +"244b34c5": "Stage2Deadline()", +"244bfa6b": "buyCelebrity(uint256)", +"244c23ee": "Token(uint256,string,uint8,string)", +"244c757a": "getCurrentIcoNumber()", +"244c91d4": "setMaxIssuers(uint256)", +"244c96a1": "compareOrders(uint128,uint128,uint128,uint128)", +"244cb924": "EnableSelling(uint256)", +"244cee6d": "helloWorldWeb()", +"244d04f5": "finalizeTokensale()", +"244dad09": "createdUser(bytes32)", +"244ded7a": "ChangeOwnership(address)", +"244e0c87": "balanceOF(address)", +"244eab9e": "lovelock_price()", +"244eba55": "frozenDaysForBounty()", +"244f4894": "getWithdrawed(address)", +"244f828a": "SetHFee(uint16)", +"244fcd03": "removeRelease(bytes32,string)", +"24500e05": "tokenAdvisorPartners()", +"24503ab0": "setDefaultTransferGas(uint256)", +"24506e2a": "KoalaChain()", +"24516000": "getPOOL_edit_26()", +"24519a6a": "takeFee(address,address,uint256,uint256)", +"2451a899": "isSuccess(uint256)", +"2451b3d8": "accessProvider()", +"24528499": "_getSettingVariables()", +"24534192": "addMutagenFight(uint256,uint256)", +"2453759a": "setNoDataSubcontract(address,uint256,uint256)", +"2453ffa8": "orderCount()", +"24541f78": "getTransferProxy(uint32)", +"24545f82": "LULUToken()", +"2454d1f0": "incFightWin(uint256)", +"24562747": "tokensPerETH()", +"245678d6": "MINBET()", +"24571783": "NESTFAME()", +"2457d765": "CHSC()", +"2458d472": "getCurrentStage(uint256)", +"2458d606": "exchange(address,uint256,string,uint256)", +"2458f2a8": "swarmTree(uint256)", +"2458f679": "instContWallet()", +"245a03ec": "scheduleSetIt(uint256,uint256)", +"245a30ec": "setDataAuction(address)", +"245a367c": "GetParticipant(address,address)", +"245a6f74": "isProxyLegit(address)", +"245a810b": "addMetaData(bytes32,bytes32,bytes32,bytes32[],bytes32[])", +"245ae4a0": "slashUsername(bytes,uint256)", +"245b565d": "ballotEncryptionSeckey()", +"245ba519": "addVerifier(address,address)", +"245ccdb7": "setFeePrice(uint256)", +"245d1314": "signUserChange(address)", +"245d5556": "_deleteEntry(bytes32)", +"245e22de": "transferDirectly(address,address,uint256)", +"245e70f0": "_commitBallot(bytes32,bytes32,bytes32,address,uint64)", +"245f57a9": "asyncSendSilently(address,uint256)", +"245fa2ab": "newBankManager(address)", +"24600157": "CUBES()", +"2460053e": "LegionToken(uint256,string,string)", +"24600fc3": "withdrawFunds()", +"2460f09d": "MarketContract(string,address,address,uint256[5])", +"24612b5d": "GenbbyToken()", +"24619da7": "RechargeMain(address)", +"24627547": "vestingFunc(uint256,uint256,uint256,uint256,uint256,uint256)", +"2462a0d5": "funcFromC1()", +"2462f6f1": "setFadeoutStarts(address,uint32)", +"2463de5a": "getPastWinnerTimestamps()", +"24642510": "rechallengePossible()", +"24645254": "getBalance(uint8,address)", +"24645c5a": "totalTokenSale()", +"24646ce4": "getBuySellSum()", +"2464a69f": "_computePublisherCut(uint128)", +"24652ba2": "PeerBudsToken()", +"24664106": "mintRep(int256,address,uint256)", +"24667568": "ORGANIC(uint256,string,uint8,string)", +"24675116": "PK(uint8,bytes32)", +"24676ae3": "SmzdmToken()", +"246982c4": "getPerson(uint256)", +"2469a846": "terminateCrowdSale()", +"2469c14e": "setState(address,uint256)", +"246a3234": "getEthChfPrice()", +"246a44f8": "isNeedCloseCurrentGame()", +"246c01cd": "tryUpgrade(uint32,uint8)", +"246c02e6": "check_depth(uint16)", +"246cbacc": "test_twoInvalidEqAddress()", +"246d4098": "openToThePublic()", +"246d41a9": "incrementTotalVoters()", +"246eb968": "deleteUri(uint256)", +"246f02bb": "tickets_bought(string,uint256)", +"246f0ca4": "KuaiKanToken(uint256,string,uint8,string)", +"246f1e17": "createGuess(uint256,uint256,string,uint8,uint256,uint256,uint256[],bytes32[],uint8)", +"246f8b96": "removeOwner()", +"247121e3": "MakeAdministrator(address)", +"2471fa1c": "_building(uint256)", +"24724b5b": "changeAmisWallet(address)", +"24743d40": "f1(bytes32)", +"24749b59": "bonus(uint256)", +"2474a21c": "collectedEther()", +"2474e236": "TOKENS_MAXIMUM_SUPPLY()", +"24752467": "getParticipantPublicKey(bytes32)", +"247534cf": "WrapperLock(address,string,string,uint256,address,bool)", +"2475a9b3": "UTXORedeemed(bytes32,uint8,uint256,bytes,bytes,uint8,bytes32,bytes32,address,uint256)", +"24788429": "removeExecutor(address)", +"24788ed9": "ledgerContractAddr()", +"247956f1": "withdrawEtherInBatch(address[],uint256[])", +"24797d1b": "decreaseThreshold(uint256)", +"247ab51f": "markAsProcessed(uint256)", +"247aebbb": "tokensup(uint256)", +"247b127d": "MiIToken(uint256,string,uint8,string)", +"247b188b": "icoTotalSupply()", +"247b3bd6": "BitCronus()", +"247baa3e": "ALH2()", +"247bb39c": "privateOfferingCap()", +"247bb432": "test_addAndRemovePermissions()", +"247bbed7": "borrowTokenFromEscrow(uint256,uint256,address,bool)", +"247c6c70": "priceLC()", +"247cf1aa": "lengthNotEqual(bytes32[],uint256,string)", +"247cff43": "freezingManager()", +"247ecab5": "bonusDrop(address,uint256)", +"24804cef": "Deed()", +"24806d4a": "getBounsInRound(uint256)", +"2480d9e6": "saleAirdrop(address,uint256)", +"2481325a": "ExtremeCoin()", +"2481851a": "finalizeName(address,string)", +"24819384": "btycaddmoney(address,uint256)", +"2481c51c": "includesGblock(bytes32)", +"2481f92c": "setClockAuction(address,uint256)", +"2483761f": "buy1ktickets()", +"24841bbd": "interfaceBurnTokens(address,uint256)", +"24845131": "proclaimDeath()", +"2484a023": "verifyTetherCurrency(address,uint256,string)", +"24850e10": "releaseFunds(bool)", +"24851914": "isTeam(address)", +"2485484d": "clearGenVaultAndMask(address,uint256,uint256,uint256)", +"24854bd8": "updateThirdExhangeRate(uint256)", +"248582b0": "receivePaymentForGoodsSoldEarly()", +"24860443": "toBytes2(bytes,bytes,uint256)", +"24863354": "saleOverReachMaxETH()", +"24876434": "addPriceTier(uint256)", +"24880bcb": "getTierUnsoldTokens(uint256)", +"24884fc2": "startPeTime()", +"24887c04": "SieChain()", +"24888154": "Buy(uint64)", +"24888b4a": "isVoterLocked(address)", +"24889e37": "removeAmountForAddresses(uint256[],address[])", +"2488fd55": "countPlayersInPosition()", +"24896a47": "signPA(uint32)", +"248b0dba": "toBytes16(bytes,bytes,uint256)", +"248baabd": "FUND_ADDR()", +"248c4439": "setFunctionOnePrice(uint256)", +"248c6380": "_tokenBankrollBuyIn(uint8)", +"248d14eb": "allowPriceUpdate()", +"248dd407": "Transfer(uint256)", +"248e150a": "getFirstAuctionsExtendableStartDate()", +"248e1993": "setMinTarget(uint256)", +"248e4dd4": "pank13()", +"248e86e6": "ProjectToken(uint256,string,uint8,string)", +"248ec326": "DAILY_LIMIT()", +"248fcccc": "CRSAccount()", +"24900d7c": "initializeAddresses(address,address,address,address,address)", +"24902e24": "LOG2_E()", +"2490be24": "exchangeEurToEth(uint256)", +"2490e13f": "editPieceData(uint256,string,string)", +"2490e16e": "getDirectBoughtTokens()", +"24924bf7": "maxParticipants()", +"249292b9": "testUnlockedDay()", +"2493097b": "finalizeDestruction()", +"24932186": "enterOrder(uint128)", +"24937124": "fetchPaidOrdersForMerchant()", +"2493a2f2": "setBonusTokenRateLevelOne(uint256)", +"2493d006": "openWeek()", +"2493d669": "AllowanceGranted(address,uint256)", +"24941147": "cancelProject(uint256)", +"24943c7d": "resolveDispute(bytes16,address,address,uint256,uint16,uint8,bytes32,bytes32,uint8)", +"2494aef9": "TOKEN_AMOUNT_ICO_STAGE1_PRE_SALE2()", +"2494e267": "CXLExchangeRate()", +"24953eaa": "removeAddressesFromWhitelist(address[])", +"249559ad": "computeVoteOutcome(uint256)", +"249586f2": "editPayoutSetting(uint8,uint16)", +"2495c0ce": "stopVote()", +"24968a70": "getHomePost(uint256)", +"2496a431": "robPantry(address,uint256)", +"2496b796": "sellMyTokensElixir()", +"249830d8": "setUnclaimedPlotPrice(uint256)", +"24992680": "SelfKeyCrowdsale(uint64,uint64,uint256)", +"24999c9c": "bonusSignalValue()", +"2499a533": "Purchase(address,uint256)", +"249a1120": "licenseTermsMaxCostPerSec(bytes32,bytes32)", +"249a5438": "getInvestorsAndBalances(address)", +"249aa292": "preIcoPrice()", +"249b4d0b": "removeTrustedIssuer(address,bytes)", +"249b4d4f": "transferContractUser(address)", +"249b7c19": "presaleEndTime()", +"249bc291": "transferMintMaster(address)", +"249cb3fa": "canImplementInterfaceForAddress(bytes32,address)", +"249eae4d": "addInvestors(address[],uint256[])", +"249f1f22": "insertNodeSorted(uint256,address)", +"249f77ef": "CancelSimpleOffer(uint256)", +"249f7aa0": "exchangeRateChangesBlock()", +"249ff838": "getAddressByNames(bytes32[])", +"24a039c7": "CBToken(address,uint256)", +"24a084df": "sendValue(address,uint256)", +"24a12edf": "getAuctionIdForUserAndIdx(address,uint256)", +"24a1871e": "LOL2()", +"24a1c1e0": "addCertificateAndBind2Wallet(address,uint256,bytes32,bytes32)", +"24a1cd1e": "currentCoefficient()", +"24a20a25": "feed10(uint256)", +"24a23361": "getTeamAttribute(uint8,uint8,uint8,uint32[11])", +"24a27bd2": "tokensForAdvisory()", +"24a30e46": "m_claimingIsActive()", +"24a38383": "WhitelistedSmallCap(address,uint256)", +"24a3b013": "attachToToken(address)", +"24a434eb": "openCarousel()", +"24a43c51": "releaseMultiple(address[])", +"24a4411d": "DecoderTester(address,address,address,address,uint256)", +"24a47aeb": "merge(uint256)", +"24a4aff6": "adaCoin()", +"24a684e1": "get_perms(bytes32)", +"24a69051": "allowClaim(address)", +"24a6a409": "MINTY()", +"24a6ab0c": "freeSupply()", +"24a73e5f": "decreaseAllowance(address,uint256,bool)", +"24a779ca": "PELOMemberMap(address)", +"24a7d277": "removeAddressFromBlacklist(address,address)", +"24a80b31": "BusinessUnion(uint256,string,uint8,string)", +"24a852c6": "unset(bytes)", +"24a8e11d": "isAuthorized(address,address,bytes32)", +"24a9d3d9": "callAndReward(string,string,uint256)", +"24a9d853": "feeBps()", +"24aa62fe": "setObjectionPercent(uint256)", +"24aa6dd1": "ProxyManagementContract()", +"24aa93b9": "getVestedAdvisorTokens()", +"24abfc02": "getTournamentThresholdFee()", +"24ac4df1": "cancelNewOwnersCountRequest()", +"24ac4e65": "getServerUserNumber(address)", +"24accfa3": "refundMoney(uint256)", +"24acec2b": "PayeeWithdrawInterest(address,uint256,uint256)", +"24ad35e1": "PisangChain()", +"24addfc0": "swapMe()", +"24ae84cc": "participateCrowdsaleInvestor(address)", +"24aee933": "usePower(uint256,uint8,uint8,uint8,uint8[176])", +"24af4cdb": "setNewUserState(string,bytes,string)", +"24aff74d": "Debit(address,address)", +"24b04905": "gift()", +"24b06a96": "getAllElectionsOfOrganiser(address,address)", +"24b07165": "get_property_facility(uint256)", +"24b0ff0f": "approveTokensFromKingWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"24b1905b": "sendFirstBatch(address[],uint256[])", +"24b19da5": "TokenDistribution(address)", +"24b1a2fa": "disableArbiter(address)", +"24b1aa5c": "domain_build(address,uint16,uint8,uint8)", +"24b1babf": "claimEarnings(uint256)", +"24b1bfdf": "resetToken()", +"24b27fc8": "CoquiToken()", +"24b2c2f6": "GYUToken()", +"24b33f5d": "_auction(uint256,address)", +"24b35ef2": "mintTokens(address,uint256,uint8,bytes32)", +"24b3940a": "sayGoodBye()", +"24b492d7": "SetInitData(uint256,uint256,uint256,uint256,uint256)", +"24b4cee0": "openBatch(uint256)", +"24b4ec3d": "buyOwn(address,uint256)", +"24b4fc8e": "closeChannelWithoutReceipt()", +"24b508a3": "listByGroup(string)", +"24b50e43": "getMsgHash(address)", +"24b51369": "tgrSettingsPartFounders()", +"24b570a9": "totalPot()", +"24b5c134": "numCities()", +"24b5efa6": "RewardClaimed(uint256,address,uint256)", +"24b6b8c0": "_safeTransfer(address,address,uint256,bytes)", +"24b6f7d3": "TestBathTx(uint256,uint8,string,string)", +"24b72667": "buyprices()", +"24b77f05": "acceptCounterStack(bytes32,bytes32)", +"24b79a1c": "ICO_PHASE3_BONUS_PERCENTAGE()", +"24b82a76": "voterReward(address,bytes32,uint256)", +"24b89fa7": "unlockStepLong()", +"24b8fbf6": "register(address,bytes)", +"24b94ac6": "atto()", +"24ba1a46": "isSpawnProxy(uint32,address)", +"24ba506d": "getNumberOfTransactions()", +"24baeb12": "initCrowdsaleToken(bytes32,bytes32,uint256)", +"24bb49d6": "balanceMinusFeesOutstanding()", +"24bb7734": "mainSaleDuration()", +"24bb7c26": "pausedPublic()", +"24bbd049": "mintOpen()", +"24bc4e92": "QueenXChain()", +"24bcdfbd": "tradeFee()", +"24bce60c": "freeze(address,uint256)", +"24bdaf95": "about(uint256)", +"24bdf96a": "getUserRefBalance(address)", +"24c034a7": "ERC721Auction(address)", +"24c05c72": "requestLoans(uint256)", +"24c06d7d": "buyBreeding(uint256,uint256,uint256,bool)", +"24c0db84": "ico1receivedTotal()", +"24c12bf6": "code()", +"24c1f9c7": "stage_3_add()", +"24c2362b": "buyCrySolObject(uint256)", +"24c30182": "BleedFomo()", +"24c31975": "increaseJackpot(uint256,uint256,uint256)", +"24c33d33": "round_(uint256)", +"24c37507": "getMinBet()", +"24c4c9e4": "getCurrentPRETDEBonus()", +"24c4e3b9": "getPatientHealthData(address)", +"24c55380": "TicketPurchase(uint256,address,uint256)", +"24c65927": "createNewAuction(string,uint256)", +"24c65f35": "updateRefundGas()", +"24c6ef60": "SafeTokenTransfer()", +"24c74c1d": "LogClaim(address,uint256,uint256,uint256)", +"24c74c78": "certify(bytes32)", +"24c91c1b": "isDataResponseValid(address,address,address,string,bytes)", +"24c93343": "error(string)", +"24c9bf5e": "Prizes()", +"24ca77e5": "teamNum()", +"24ca984e": "addRouter(address)", +"24caf5e1": "sale_address()", +"24cb015a": "_ONE()", +"24cb57dc": "whitelistEntries(uint256,uint256)", +"24cc35a6": "_isTeam()", +"24cd2ae4": "beneficiaryUserIds(uint256)", +"24ce2562": "updateGameSpecifics(uint256,uint256,uint256,uint256)", +"24ce2917": "create(address,uint256,uint256,address,address)", +"24ce9d27": "sellOrder(address,uint256,uint256)", +"24cee3d6": "Change(address,address,address,uint256,uint256)", +"24d0cc0f": "getPayouts(address)", +"24d16a4d": "makeUnderlier(bytes32,address,int256)", +"24d1c28b": "changeVoteRules(uint256)", +"24d29cfb": "_removeSigner(address)", +"24d3048d": "cancelNode(string)", +"24d30d54": "enableMerge(bool)", +"24d3eaf3": "bonusEndTime333()", +"24d427a9": "print(address)", +"24d4e90a": "ln(uint256)", +"24d5336a": "deicmals()", +"24d6169c": "startLockPeriod()", +"24d6d601": "voteFor(address,uint256)", +"24d70dea": "hasEntered(address)", +"24d7378a": "m_totalTokens()", +"24d7806c": "isAdmin(address)", +"24d86f00": "decreaseStake(uint256,uint256)", +"24d89171": "changeNeedFightToAdult(uint256)", +"24d97a4a": "killme()", +"24da48a3": "updateMaxAllocation(uint256)", +"24da569a": "AGToken()", +"24daddc5": "setRestricted(bool)", +"24db1f50": "masFreezedTokens(address[],uint256[],uint256[])", +"24dbb91d": "BusinessCard(string,uint256,string,address)", +"24dc793f": "getKydy(uint256)", +"24dcd0ef": "transferFounders(address,uint256)", +"24dd24ed": "allowingClaimBTC()", +"24ddb58c": "performStepVerification(uint256,bytes,bytes,bytes)", +"24de30f1": "distributeEarlyBackerTokens(address,uint256)", +"24de3c0e": "gwei()", +"24de908d": "wins()", +"24df2d5b": "Filmpass()", +"24df75d9": "withdrawFromTicker(uint256)", +"24dfc9d7": "getBytes32(uint256)", +"24e04871": "horseForSale(uint256,uint256)", +"24e0be2e": "EVenToken()", +"24e1c3f3": "PRCT_ETH_OP()", +"24e1fa3a": "FIRST_WITHDRAW_RATE()", +"24e21cde": "sendTradeOffer(address,uint256[],uint256[])", +"24e2ca92": "withdrawSharedExpense(uint256,address)", +"24e2cda7": "TestOrder2(address)", +"24e2dbd3": "linkRecipientName(bytes32)", +"24e34476": "myStoredDividends()", +"24e5355e": "JerryToken()", +"24e581be": "transferAllToOwner()", +"24e5bdb9": "getEventsCount(string)", +"24e5eeaa": "slogan()", +"24e65e14": "Addr6()", +"24e7a38a": "setGeneScienceAddress(address)", +"24e7c824": "performTransfers(address[],uint256[])", +"24e846c7": "confirmedSaleEther()", +"24e8b3ec": "getClaimableRewards(bytes32)", +"24e998c3": "Ethershift()", +"24e9dad8": "_safeCall(address,uint256)", +"24ea8d1a": "Fortnitecoin()", +"24eaf1ea": "SendBadge(address,address,uint256)", +"24ec6f66": "cancelContest(uint32)", +"24ec7590": "minFee()", +"24ed1486": "getPeriodAliasFor(uint256,address)", +"24ed2d8b": "initOwnership(address,address)", +"24ed3dc0": "PolyAnalytixProjectToken()", +"24ed3e78": "BACKUP_THREE()", +"24eda713": "teamTwoWin()", +"24edc2a1": "WINT()", +"24ee0097": "myMethod(uint256,string)", +"24ee62ee": "secondWavePrice()", +"24ee9be4": "getVirtualBalance(address,address)", +"24eebc47": "SWAPCOINZ()", +"24efe4c3": "_addToClaimList(address,uint256)", +"24f07356": "batchIncreaseApproval(address[],uint256[])", +"24f073ad": "getTimeOfLastBid()", +"24f12f1e": "ProfitSharingMock(address)", +"24f159c2": "extensions()", +"24f1ec37": "multiAccessRecipient()", +"24f2cc02": "preIcoLimit()", +"24f32f82": "changeHardCap(uint256)", +"24f35549": "setup(uint256[])", +"24f3c639": "buyApprenticeChest(uint256)", +"24f481c8": "oracleItQuery(string,string,string,uint256,uint256)", +"24f48bc5": "setWatcher(address)", +"24f5445b": "transferFundToAccount()", +"24f55e29": "hasCompany(string)", +"24f618b6": "GetDOTRevokableHash(bytes32,uint32)", +"24f65ee7": "getTokenDecimals()", +"24f690ac": "cryptowars()", +"24f696fd": "LogFundTransfer(address,address,uint256,uint8)", +"24f731d5": "PlaceBet(uint256,bytes)", +"24f743dc": "freeSpaceOf(address)", +"24f74697": "callbackGasLimit()", +"24f7a980": "WaitStarted(uint256)", +"24f82526": "closeLong()", +"24f8fe9c": "EdgelessCasino(address,address,uint256,uint256)", +"24f91d83": "init(address,address,address,string)", +"24f9702e": "allocateArrayOfTokens(uint256,address[])", +"24f99ba4": "ChiMarket()", +"24fa6f3b": "requiredBlocksElapsedForVictory()", +"24fabb87": "setImageOwner(uint256,address)", +"24fad665": "enableMasterTransfers()", +"24fb563f": "PlayerTickets(address,uint256,uint256)", +"24fc253e": "eraIndex()", +"24fc65ed": "getId(uint256,uint256)", +"24fc70ff": "setBonusOn(bool)", +"24fcb80c": "parseAddress(bytes32)", +"24fcbc1c": "withdrowErc20(address,address,uint256)", +"24fd0a5c": "isAvailableForTransfer(uint64)", +"24fd2be1": "NationalCoin()", +"24fd5585": "fixedExp(uint256,uint8)", +"24fd6ec9": "zeroBonus()", +"24fe722e": "requestUnpause()", +"24fe73fe": "isRegularOrBoardMember(address)", +"24fe8e68": "MyToken(uint256,uint256,string,string,uint256,uint256)", +"24fef683": "OwnershipGranted(address)", +"24ff026b": "getScheduleDetails(bytes32)", +"24ff065a": "addressOk(address)", +"24ffca71": "visitCost(uint8)", +"24ffea1a": "presaleToken()", +"25005498": "updateEntityNew(uint256,bool)", +"2500ec4a": "getDHand(uint32)", +"25010816": "get_length(uint256,uint256)", +"25012699": "KERNEL_APP()", +"25017e10": "transferSubscription(bytes32,address)", +"2501faa5": "triggerRecoveryAddressChangeFor(uint256,address)", +"2502c19c": "setRBInformationStoreAddress(address)", +"250312ce": "bleachAppearance(uint128,uint128)", +"2503dce8": "updatePublisherFee(address,uint16,address)", +"25052d02": "getMyTokensReturns()", +"250537fc": "_createCollectible(bytes32,address)", +"250540cf": "calcMaxWithdraw(address)", +"25059052": "WhitelistedLargeCap(address,uint256)", +"2505c445": "finalizedEthFundAddress()", +"2505f349": "setTokenMinter(uint256,address)", +"25062287": "_ownerDist()", +"25068a28": "freezeAllowance(address)", +"2506bfe7": "validateBySymbol(string)", +"25074d73": "Registered(string,uint256,address,string)", +"25084b04": "manualOverrideEditionHighestBidder(uint256,address)", +"25096f28": "KryptopyTokenMock()", +"2509f1b9": "SLP()", +"250a1c1d": "Validate(string,string,string,bool)", +"250a8dc2": "isAccountAddress(address)", +"250a93cb": "POEXToken(address,address)", +"250ac096": "BuyRoseCoin()", +"250b1154": "tokenRate3()", +"250b35e8": "BidSaved()", +"250bc504": "Ambassador()", +"250c95fe": "setMaxBuy(uint256,uint256)", +"250ccce4": "getOutStreamOf(address)", +"250d5bc8": "LineToken3()", +"250de298": "EthlanceSearchJobs(address)", +"250dea06": "modifyBalance(address,uint256)", +"250e7d61": "CROWDSALE_CLOSING_TIME()", +"250e816b": "getPeriodSealedPurchaseOrderFor(uint256,address)", +"250e87c9": "pyramid()", +"250ef961": "checkCorrectPurchase()", +"250fe144": "setInvoice(uint256,bool,string,string,string,string)", +"25100b4d": "placeBet(bytes32,string)", +"25102f27": "PRESALE_START_TIME()", +"25107a47": "TransactionRefundedAfterEscalation(uint256)", +"25112004": "XCNTToken()", +"25112743": "getSaleContractStartBlock(address)", +"251139f6": "setPrevContract(address)", +"25119b5f": "channelManagerByToken(address)", +"2511b182": "minBuyableAmount()", +"25128b02": "CampaignResumed(uint256)", +"25137f46": "setSalesPipeAllowance(address,uint256)", +"251481c8": "testDecodeTransfer(bytes)", +"2514a6b4": "withdrawDividends(uint256)", +"251506fa": "SendFart(string)", +"25155eef": "JupiterToken()", +"25161e70": "HKDHToken(uint256,string,string)", +"2516a18f": "setMintableToken(address)", +"2516af82": "createLottery(bytes32,uint256,uint256)", +"2516c6c6": "min_tokens()", +"2516d738": "secureAddOrderFunds(address,bool,uint128,uint128)", +"25174f0e": "getOwnerIndex(address)", +"25182e79": "winAmount4()", +"25185d3e": "freeBalance()", +"25192fca": "issuanceDraft(address)", +"2519a378": "finalizeReplaceTrueUSD()", +"251a8096": "total_wins_wei()", +"251aaf67": "dividendsPaidPerShare()", +"251b5f8e": "team_fund()", +"251c1aa3": "unlockTime()", +"251c7182": "seed_multiplier()", +"251d3589": "setUseEIP712(bool)", +"251d8ffb": "setNav(uint256)", +"251e3843": "_preValidation(address,uint256,uint256,uint256,uint256)", +"251e3d7d": "registerMember(address,bytes,uint256)", +"251ed995": "walletSetWallet(address)", +"251fa3b1": "testFailRetractLatestRevisionNotOwner()", +"251fbe37": "get_training_index()", +"25200718": "requestAudit(string,uint256)", +"2520573f": "getProposalMetaHash(bytes32)", +"25209260": "PrepareRoll(uint256)", +"2520bf04": "shuffle()", +"2520d2e1": "readvalidrollsXaddr(address)", +"25221a4f": "addToBlacklistMulti(address[])", +"25223bd4": "donor()", +"25233782": "magicnumsig()", +"252348dc": "ratePerEth()", +"2524380f": "buy_Exchg_BkgChk(address,uint256,uint256,address,uint256)", +"25245b26": "sendEth(address[],uint256[])", +"25248587": "indexview(address)", +"252498a2": "setUrl(string)", +"25250519": "addGlobalAdmin(address,address)", +"2525aa78": "mintStart5()", +"2525f5c1": "cancelBid(address,bytes32)", +"25266f96": "isNewPlayerInBattle(string,address)", +"2526d960": "clawback()", +"2527331b": "transferToSimpleService(address,uint32,uint256,uint256,uint256)", +"252733f0": "registrantsPaid()", +"252786e4": "WatchBlockSizeInEther()", +"25280163": "RedFundCrowdsale(uint256,uint256,uint256,address,uint256)", +"25287c0e": "bonusesGiven()", +"2529b907": "setVaultDeposit(uint256)", +"2529d1a3": "fused()", +"252ba7a0": "userDeployCount(address)", +"252bb9c3": "PHOENIX_CORSAIR_EXTRACTION_BASE()", +"252cb4fe": "registerProposal(uint256,uint256[])", +"252ccac3": "getTotalActiveBets()", +"252cde48": "checkPrizesView(address)", +"252cedc3": "sendERC20Tweet(uint256,string,string)", +"252d1578": "init(address[],uint256,uint256,uint256,uint256)", +"252d7eb3": "getCurrentPayoutIndex()", +"252dbc36": "setTokenPoolReward(uint256)", +"252e40b1": "secondsPerYear()", +"252edb76": "setUInt8(bytes32,bytes32,uint8)", +"252f14ba": "_addArbiter(address)", +"252f34a7": "loserOne()", +"252f4977": "destroyTokensInBntyTokenContract(address,uint256)", +"252fb38d": "bytes32string(bytes32)", +"253089b5": "smxTeamAddress()", +"2530c905": "rand(uint256)", +"25316ff5": "getBetUint(uint8,int8)", +"2531a36a": "getDesignatedReportDisputeDueTimestamp()", +"25327b75": "latestErc20TxRequest()", +"2533bb9d": "dataCentreAddr()", +"2533ff94": "LogPersonUpdate(address,uint256,uint256,string)", +"2534076e": "cancelRemoveOwnerRequest()", +"253459e3": "feesSeperateFromBalanceApproximately()", +"253515d5": "accruedBuyout(address)", +"2535b150": "cryptoJingles()", +"2535dd53": "getAvailableWithdrawInvestmentsForBeneficiary()", +"2535f762": "transferWithData(address,uint256,bytes)", +"25361060": "getReferralStatus(address)", +"2536d7f1": "endOfCrowdsale()", +"25384770": "reserveAllocated()", +"25387eed": "tallyTheVotes()", +"253abf4a": "processSalesForAllBuyers(uint256)", +"253bc579": "companyClaimed()", +"253bd7b7": "check(address,bytes32)", +"253c8bd4": "change_owner(address)", +"253caf94": "setTasksAddress(address)", +"253d8195": "SavingsBank()", +"253e3447": "numberOfSpritesOwnedByUser(address)", +"253e7fdf": "becomePacifistmaster()", +"253ebd92": "isTierJoined(address)", +"253f029c": "performUpdatePC()", +"253f055b": "getStage2End()", +"253f2809": "offerCollectibleForSale(uint256,uint256,int256,uint256)", +"253f5c38": "addtoLeaderboard(uint64,uint64,uint64)", +"253f89b0": "minContributionUSDc()", +"25400abc": "buyPuzzle(uint8)", +"25402e6c": "vcxCount()", +"2540424b": "isDefIndexInRange(uint8)", +"25406480": "extendPeriod(uint256)", +"2540c420": "phaseOneRate()", +"2541edcc": "oferta()", +"25435704": "updateTokenSupply(uint256)", +"254439fe": "addTokenList(address,uint32)", +"25449c54": "ArteumToken()", +"2545686d": "is_slot_in_bid(uint8,uint8,uint8)", +"2545a07a": "MOEToken()", +"25461328": "MSPMock(address)", +"25464902": "AUCC()", +"2546559c": "Demo()", +"2546de10": "vest(address,uint256,uint256)", +"254747a5": "checkAvailableAmount(address,uint256)", +"25476ed8": "settleAndWithdrawCfd(uint128)", +"254800d4": "vestingStart()", +"2548bbbd": "WithdrawalCreatedEvent(uint256,uint256,bytes)", +"25495998": "getMinimumConsumerDeposit()", +"25498152": "setBuyDividendPercentageFee(uint8,uint256,uint256)", +"2549ad8f": "MANHATTANPROXYCNVNTAVE()", +"2549e0b1": "getLockedBalance()", +"254a46f4": "cycleMintSupply()", +"254b302d": "revokeAllMyId()", +"254bd326": "getUserAddr(uint256)", +"254c70ac": "getPlayerData(uint32)", +"254c91b3": "testBitNotSetSuccess()", +"254d2e12": "GetDemolishCost(uint256,uint256)", +"254dacba": "BurnTokens(address,uint256,string)", +"254dcfe2": "lastActiveTransaction(address)", +"254fd745": "transferUCASH(address,uint256)", +"255016c8": "checkIfExploded()", +"255074a9": "addManualContributor(address,uint256)", +"2550c435": "CRYPTO_USD()", +"2551858e": "getFlags(bytes32)", +"2552317c": "lastBlockNumber()", +"25524400": "placeBet(uint256[],bytes32,uint256,uint256,bytes32,bytes32,uint8)", +"25534a1e": "saleEtherReceived()", +"2553795a": "AragonSupply()", +"2553ac0d": "getPlayeds(uint256,address)", +"2553e0cb": "OwnedMortal()", +"2554a358": "queryCurrentTradablePrice()", +"2554b9b3": "kkkTokenSale(uint256,address)", +"2555611a": "AOKPAY()", +"25568fd7": "__setBeneficiaryForDasTokensChange(address)", +"2556befa": "feeBank(address)", +"255706f5": "start_service2(uint256,address)", +"25575a04": "peBalance()", +"25579702": "calculateDrugBuySimple(uint256)", +"25580656": "dataSourceGetRoundOfSixteenResult(uint256)", +"25583590": "_cancelAuction(uint256)", +"25585ee8": "diamondIndexToApproved(uint256)", +"255884ae": "discoveryPrice(uint256)", +"2559e0dd": "rateInSpecificTier(uint256)", +"255bd903": "signByBride()", +"255c8244": "amountRaisedPreSale()", +"255c8fee": "TestyTest()", +"255e2f81": "adjustDollarToEtherRatio(uint256)", +"255e444e": "scientists()", +"255e4685": "mintStart()", +"255eac5c": "newRegistration(address,uint256)", +"255f82e2": "sealed(uint256,bytes32)", +"25605c6a": "balanceOfSC()", +"2560a8c0": "houseedge()", +"2560baeb": "calculatePayrollBurnrate()", +"25616007": "getLandplayerFirstDefenderID(uint8,uint32)", +"25618ca8": "setBattleContractAddress(address,address)", +"2561ee35": "estimateBuyOrder(uint256,bool)", +"25625608": "FoundWinner(address,uint256)", +"2562b427": "declineKyc(address)", +"25630c9f": "fwithdrawal(uint256)", +"25635b68": "updateBaseInventory(uint256,uint256,uint16)", +"2564e1c4": "PaymentAddressFactory()", +"256540cd": "turnover()", +"256688fb": "UseRedEgg(uint256)", +"256697df": "ibcDistributed()", +"25672ee6": "OpenBids(address,uint256,address,address,uint256,uint256)", +"256738d1": "AGT()", +"25686e15": "getMarketsRocId(uint256)", +"25687e28": "tuneLastStageStartAt(uint256)", +"2569100d": "runtoeth(address,uint256)", +"256919c6": "fixSale()", +"25696308": "lastBlock_a10Hash_uint256()", +"25697337": "getLittAdminCount()", +"25698d89": "isLottery()", +"2569cd6c": "assistant()", +"256a9f81": "extendedTime()", +"256b8dfe": "Travelcash()", +"256bcaa0": "addToJackpot()", +"256bdaa4": "setEtherRate(uint16)", +"256c0926": "RocketPoolCrowdsale(address)", +"256c09d4": "_protocolInterestRate(uint256)", +"256c10a1": "market2021TokenCreated()", +"256c3232": "getPreICOBonusAmount(uint256,uint256)", +"256c5fc6": "LooisToken(uint256,string,uint8,string)", +"256df407": "test_spamFreeze()", +"256f992b": "organizers_percent()", +"256fa241": "distributeTokens(address[],uint256)", +"256fec88": "lastSender()", +"2570c13d": "GBCoin()", +"2570e31e": "getTokens(uint256,address)", +"2571a4ab": "MaxBetAmountChanged(uint256)", +"25731e97": "quitBanker()", +"257341a8": "vestingCountOf(address)", +"2573aa7d": "newShare(address)", +"2573ce27": "validateUserByHash(bytes32)", +"25746251": "canVote(uint256)", +"25750995": "updateChfCentsPerEth(uint256)", +"25756d90": "getWeaponRarityFromTokenId(uint256)", +"2575d47e": "EmitAccountChartDetails(address,uint256,uint256,uint256)", +"2576a779": "updateServiceFee(bytes32,uint256)", +"257714db": "getTransferRate(address)", +"257781e7": "deleteIPFSHash(bytes32)", +"2577929b": "settleContract(uint256)", +"257793f9": "getConstructorTouches()", +"2578117b": "getPotAsFixedPointForGameId(uint256)", +"25787747": "icoDuration()", +"2578e943": "RHYNOTE()", +"25799b18": "getUnapprovedArtists()", +"2579dd3c": "registrantToHopefulIds(address)", +"257bcd6a": "placeBet(uint256,bytes32,bytes32)", +"257c360d": "getCurrentBalanceForCampaign(bytes32)", +"257c88b5": "curQuater()", +"257d3db5": "setNumNumbers(uint256)", +"257d4166": "Partner()", +"257d5995": "updateSinglePayout(address,uint256)", +"257d849f": "ZegartToken(uint256,string,string,string)", +"257d9bb8": "MINIMUM_AMOUNT()", +"257e0523": "addLockedTokeD(address)", +"257e1f8f": "endUpgrade()", +"257e5c69": "matchStake()", +"257ef522": "approveBountyTransfer(address)", +"257ef70b": "fillSellOrder(address,address,uint256,uint256)", +"257f9abf": "removeFromList(address)", +"257fc838": "setResolveValueGasLimit(uint256)", +"258072e5": "display_rate()", +"2580ce84": "totalAndRemainOf(uint256,address)", +"2581021c": "depositCollateralOnBehalfOfRecurse(address,address,bytes32,uint256)", +"258108da": "slaveWalletPercent()", +"25818751": "test_oneValidEqUint3()", +"2581c674": "testBitsOrFailIndexOOB()", +"2581f5a4": "distributeAirdrop(uint256,address[],uint256[])", +"2582bf2a": "updateDelegateKey(address)", +"258315b3": "ATC(uint256,string,uint8,string)", +"2583373c": "distributeAndUnlockTokens()", +"2583a1d9": "oraclizeQueryId()", +"2583b2e4": "totalWithdrawTokenAll()", +"2583cfef": "removeFromBothSendAndReceiveAllowed(address)", +"2584295e": "userWhiteListContracts(address,address)", +"2586539e": "batchTtransferEtherToNum(address[],uint256[])", +"2587eb4e": "setRate(int256)", +"2588f9a5": "ReleaseAgentSet(address)", +"25892f92": "ApprovedBy(uint256,address)", +"2589af4a": "getProjectKudosByUsers(bytes32,address[])", +"258a61d6": "coordinateToIdentifier(uint256,uint256)", +"258a6ca6": "getStoryExpiry(bytes12)", +"258ae582": "verify(bytes32,bytes)", +"258b5a35": "challengeSettle(bytes,uint8[2],bytes32[2],bytes32[2])", +"258b5c06": "finalizeCrowdsale(uint256,uint256,uint256)", +"258b5da6": "recoverWETH()", +"258b85d4": "verifyHash(string,string)", +"258c047e": "getStatusEventClosed(bytes16)", +"258c0f1e": "deleteCaller(address)", +"258c2a2d": "Charity()", +"258c4f63": "channelManagerByToken(address,address)", +"258c5ddd": "softWithdraw()", +"258d3d6e": "PlayHallToken()", +"258da4b4": "seedStarted()", +"258dd544": "estimateSellOrder(uint256,bool)", +"258e60b6": "start(string)", +"258f6b8f": "GiveReferralRocket(uint16,address)", +"258fd4f3": "Stage1Allocation()", +"25910753": "addCourse(string,string,bytes32)", +"2591432d": "canary()", +"25925806": "tokensAllocatedForCs(address,address,address)", +"2592e921": "verifyParams()", +"2593ed21": "setICO1Phase()", +"2594b343": "walletTwo()", +"259653b8": "distributionClosed()", +"2596c93b": "manualBonusActive()", +"2596e62c": "test_oneValidEqBytesUint()", +"25973ef7": "CIFRCOINTOKEN()", +"25979983": "sendToAll(uint256)", +"25981559": "bluceTestCoin(uint256,string,string)", +"25982586": "AddressDemo()", +"259852f8": "updateGenVault(uint256)", +"2598ab9d": "createPromoSeedAuction(uint8,uint8,uint256,uint256,uint256,uint256,uint256,uint256)", +"25990d4d": "TokenFulfillment(address[2],uint256[8],uint256)", +"2599c661": "getgamecardsalemoneyuint256(uint256)", +"259a28cf": "UNLOCK_PERIOD()", +"259b2ce0": "whitelistRegistrants(address)", +"259b5181": "_batch2_rate()", +"259b5605": "PTL()", +"259bc6f5": "getWhiteUsers()", +"259c05f5": "DEV_TAX_DIVISOR()", +"259c29e8": "replaceShorter()", +"259c95c4": "_sendWebGiftToken(address,uint256)", +"259ceee5": "contractTokensTotal()", +"259d1cb4": "eth_decimal_num()", +"259d33c1": "roundStats(uint256)", +"259eb959": "privilegedTransfer(address,uint256,bytes,string)", +"259fddaf": "stakeCommunityTokens()", +"259fefcb": "angelAddress()", +"25a02ff6": "setGeneratorAddress(address)", +"25a10a70": "getChild(address)", +"25a190c9": "inicializaStatusPossiveis()", +"25a2219f": "promotionsUsed()", +"25a30145": "preSaleTime()", +"25a31135": "Disable()", +"25a34aca": "returnMargin()", +"25a3ba49": "getCertKey(string)", +"25a42081": "setPriceStep3(uint256)", +"25a43ea5": "setts10(uint256,address)", +"25a50636": "completeBountyAddresses(address[])", +"25a52d9d": "curentWinner()", +"25a583a3": "_reAdjustDifficulty(uint256)", +"25a6c545": "generalInfo()", +"25a7650a": "beginGame(uint256)", +"25a78057": "DeClubToken(uint256,string,string)", +"25a86d56": "ETH_USD_EXCHANGE_CENTS()", +"25a8e6f9": "addNewEditor(address)", +"25a9d450": "getClientBalance()", +"25a9e534": "DataToBlockchainKeeper()", +"25ab2d03": "getReturnSize(uint256)", +"25ab526d": "MITPurchase(address,address,uint256,uint256)", +"25ab9f43": "addDoubleChanceLine(uint256,string,uint256)", +"25abc312": "changeICOPrice(uint256)", +"25ac29da": "generateUrl(string,uint256)", +"25ace2a7": "checkExpired()", +"25ad7f2e": "OneStep()", +"25ad91ce": "createUser()", +"25adfc8f": "SetMaxMinersXblock(uint256)", +"25aeb4a2": "addPayment(uint256,string,int256,bool)", +"25aef744": "ValuePlaced(address,address,uint256)", +"25b05c88": "playerGameId(address)", +"25b10186": "INITIAL_PRICE_INCREMENT()", +"25b16c4a": "getWeis(uint256,uint256,uint256)", +"25b198eb": "inList(address)", +"25b1a072": "setGOPCreator(address)", +"25b29d84": "getEtherValue()", +"25b2ac77": "privateOfferingWallet()", +"25b31a97": "purchase(address)", +"25b3b5a8": "_totalMinedSupply()", +"25b3bfb8": "transferFrom0(address,address,uint256)", +"25b3edd9": "updateTraits(uint256)", +"25b5160c": "setICOPrice(uint256)", +"25b56727": "createProxy(address,address)", +"25b56dd4": "averageScrapPrice()", +"25b634c0": "approveDisbursement()", +"25b64bba": "signerConsumerNonce(address,address)", +"25b6ae80": "incSALESTATE()", +"25b72273": "SGT(address)", +"25b75b7b": "deregistrationDate()", +"25b825ab": "newMediaToken(uint256,uint8,string,string)", +"25b886eb": "constructors()", +"25b89c52": "AirDropToken()", +"25b901c8": "Refundlineinfo()", +"25ba0824": "grantOwners(address)", +"25ba0f51": "initContract(address,address)", +"25ba2d2e": "minimalPrice()", +"25bae118": "earlyPurchaseClosedAt()", +"25bb8e93": "_badgeUnFreeze(uint256)", +"25bccea2": "setFreeze(address)", +"25bd4639": "paymentId()", +"25bd713f": "tokensForPlatform()", +"25bdb2a8": "getSaleState()", +"25bdb73d": "benefitPercents()", +"25bdc110": "Resolve(bool,uint256)", +"25bddc18": "DGXCrowdsale(address,address)", +"25be124e": "token2()", +"25be53e7": "kickStartICO(address,uint256)", +"25c065b1": "minStakingAmount()", +"25c10247": "buyIPC()", +"25c2052f": "last_random()", +"25c24bc3": "folioToken()", +"25c302e4": "totalDonors()", +"25c33e13": "setMaxReward(uint256)", +"25c48f30": "MYDECIMAL()", +"25c50f97": "enablePhenomenon(bytes32)", +"25c54456": "existsContract(address)", +"25c5ce04": "availableOnStage()", +"25c5d4d4": "tileDrop(address[])", +"25c62d5a": "MAX_TOKENS_AIRDROPS_BOUNTIES()", +"25c70a44": "moveToArea(uint16)", +"25c782d7": "addStageCrowdsale(address)", +"25c7cd17": "getCurrentLeaderOwners()", +"25c843b9": "comments()", +"25c9307d": "lastBetBlockNumber()", +"25c93df3": "rewardTokenAmount(uint256)", +"25c95538": "isRepeated(string)", +"25c972ff": "JoinGameAsBanker(uint8,uint256)", +"25ca4c9c": "isAccount(address)", +"25ca5cc6": "candidateTillETHAssets()", +"25ca953d": "resetAirDrop(uint256,uint256)", +"25caa262": "getBal()", +"25caaa37": "getMyChicken()", +"25cb2bc6": "getBrokerAddress(uint256,uint256)", +"25cb366d": "manualMigrate(address)", +"25cb4f2c": "profitContainerAddress()", +"25cb5bc0": "getExpiryTime()", +"25cb6303": "isItIco()", +"25cb98d5": "removeVerifiedUser(address)", +"25cbd68e": "fifthTeamWithdrawal()", +"25cbe702": "tokenSupportLimit()", +"25cbeb0a": "DICIMALS()", +"25cbeb7e": "creatorsAddress()", +"25cc348f": "testDeployedValues()", +"25ccdb4c": "currentspudinfo()", +"25ccf381": "create_forwarder()", +"25ccf688": "KEO()", +"25cdca8d": "CommonWhitelist()", +"25cde42c": "addPayerRefundAddressAction(bytes32,bytes)", +"25ce77a0": "devuelveEncuestados(bytes32)", +"25ceb4b2": "submitBlock()", +"25cf512d": "setBytes32Value(bytes32,bytes32)", +"25cf98e5": "EduCloud()", +"25cfa566": "StartingPrice()", +"25d00041": "registrantIndex()", +"25d04034": "KT07Coin(uint256,string,uint8,string)", +"25d0b4ef": "minFundingGoal()", +"25d104d4": "returnVestingSchedule()", +"25d1da84": "revokeAll(bytes32,address)", +"25d30d8e": "cnt_per_Keos()", +"25d3a09d": "getProposal(string)", +"25d3b2c6": "check_array_add(address)", +"25d3bcd1": "saleHardcap()", +"25d3d0e3": "purchaseTimestamp()", +"25d4bdeb": "LookAtCollectedFees()", +"25d5971f": "withdrawStake(uint256)", +"25d5eafa": "total_points()", +"25d76e6d": "setCompte_27(string)", +"25d78d3b": "IcoPhaseManagement(address)", +"25d83bb3": "authorized_setCardPerkText(uint256,string)", +"25d85e12": "totalPopulation()", +"25d8a4b2": "SpiceToken()", +"25d8dcf2": "betAndFlip()", +"25d8f6a5": "dividendForHistory()", +"25d91125": "earlyWhitelistBeginTime()", +"25d92ee2": "updateFeeWallet(address,address)", +"25d988bb": "buy_token(address[],uint256,uint256)", +"25d998bb": "availableBalanceOf(address)", +"25d9d57d": "highTokensToSellGoal()", +"25d9ec83": "requestBuywithETH(address)", +"25dac5e3": "DocumentStored(uint256,uint256)", +"25db4dd0": "jackpotBlance()", +"25db6699": "tgrSettingsBlocksPerStage()", +"25dbe054": "setDonationUnlockTs(uint32)", +"25dccaf9": "postMessage(address,uint256,string)", +"25dd0ee6": "checkTotalBalance(uint256[])", +"25dd495a": "Recycle()", +"25ddda76": "changeMixEnable(bool)", +"25dfbfba": "addProduct(string,string,string,string,uint256)", +"25dfcf84": "saleAllocated()", +"25e023b3": "unlockOwnerBalance()", +"25e0671f": "areReservedTokensDistributed()", +"25e0c876": "sosTransfer(address,address,uint256)", +"25e11811": "addFunctions(address)", +"25e1350f": "insert_candidate(string,uint8,string,string)", +"25e16063": "withdrawEth(address)", +"25e1b5e4": "pricePerMessage()", +"25e1c6f7": "batchTransferORS(address[],uint256)", +"25e3172b": "AdminClaimAirdropMultiple(address[],uint256)", +"25e330fb": "_increaseRarity(uint256,bytes32)", +"25e37b2b": "delTournament(address)", +"25e3d3ba": "blockResult(uint64,uint64,uint64)", +"25e3d7b4": "assignSharedOwnership(address,uint256)", +"25e41da1": "getRandomValue(uint256)", +"25e524d3": "right8(uint256)", +"25e629f2": "fundraisingDelta()", +"25e65584": "getPlayerBossWannaCryData(address)", +"25e6c304": "totalPrizes()", +"25e6f516": "tokenDescription()", +"25e7514b": "remainAmount()", +"25e7c9ad": "getTotalAmountOfFirstInvestors(uint256)", +"25e7e3cf": "recoverAllEth()", +"25e89283": "mainSaleActive()", +"25e8f38c": "logUI(string,uint256)", +"25ea269e": "Scissors()", +"25eafb45": "AikcoinSupply()", +"25eb64c7": "buildingAddress()", +"25ede147": "depositSecretBid(bytes32,bytes)", +"25ee8abb": "winningTeamSet()", +"25eeecbc": "divisionByZero()", +"25ef9afa": "LOG_newSpinsContainer(bytes32,address,uint256,uint256)", +"25f08fc4": "decayedPriceOfTwitterId(uint256)", +"25f0f467": "updateTransferFeeRate(address,uint256)", +"25f0fd23": "_revoke(bytes32,address)", +"25f262c7": "draw(address[])", +"25f281b4": "changePriceSetter(address)", +"25f2f6db": "awardRoundPrize()", +"25f39a63": "div(int128,int128)", +"25f3da52": "GetBankAccountNumber()", +"25f3f2ef": "joinBuyRequest(uint256)", +"25f43ed5": "setMemsize(uint256)", +"25f4c703": "setFoundersPercent(uint256)", +"25f5cb1e": "getAllowedForTransferTokens(address)", +"25f5ec45": "getCheapestCardWager(address)", +"25f673f5": "Love(address,address,uint256)", +"25f731c8": "transferOwnershipBack()", +"25f885d0": "CashOut(bytes)", +"25f96b73": "ownerSupply()", +"25f9bfef": "CONTRACT_REGISTRY()", +"25f9f1e6": "lockOwnerBalance(uint256,uint256)", +"25fa0131": "isZero(address,string)", +"25fa5ae1": "createShapeShiftTransactionPost(string,string)", +"25fa8a4f": "_firstTokenId(address)", +"25fab539": "removeDragonFromSale(uint256)", +"25fad06a": "clearances()", +"25fb439c": "POW33()", +"25fb66b9": "getHeroItems(uint256)", +"25fc575a": "deregisterToken(uint32)", +"25fc5f02": "HIPHOP()", +"25fc790f": "te()", +"25fcdad8": "complaint(address)", +"25fced01": "sellTokensPreIco()", +"25fd1e29": "REFUND_TIME_FRAME()", +"25fda176": "notify(address,uint256)", +"25fdb725": "MIN_CONTRIBUTION_ETH()", +"25feb519": "fifthTime()", +"25ff68dd": "Initialized(address,uint256)", +"25ffba04": "updateTokenStatus()", +"26000ba2": "updateBalanceOnFunding(uint256)", +"2601d1bc": "checkGameState()", +"2602bc8f": "_transfer(uint256,uint256,uint256,bytes32,string,uint256)", +"26030a34": "report(bytes32)", +"2603ace6": "unRegOwn(address,string,address)", +"2603f70c": "ownerDeclareRefundFinish()", +"26044feb": "fetchdivs()", +"26046743": "assetOwnerRemoved(bytes32,address,address)", +"2604b767": "getEggsSinceLastHatch(address,address)", +"2604f424": "FUTURE_DISTRIBUTE_LIMIT()", +"26052ef6": "getCurrentSolver(address)", +"2605b3c7": "participant(address)", +"26066ad5": "offer(uint256,bytes,uint256,bytes)", +"2606a10b": "report()", +"26070774": "Token(address)", +"26073003": "congratulationFromNoel()", +"26086c70": "triggerVersion(address)", +"2608f818": "repayBorrowBehalf(address,uint256)", +"2609037c": "requestArbitration(address,bytes32)", +"26091cbe": "OwnersBySpinner(uint256,uint256)", +"26093bbc": "safeIncrement(uint256,uint256)", +"26094c60": "setUnsoldTokensWallet(address)", +"260958a5": "getTransfer(bytes32)", +"260993f9": "registerSister(address)", +"260a5227": "buyOnBehalfWithSignedAddress(address,uint128,uint8,bytes32,bytes32)", +"260a54d3": "getCA(address,address)", +"260a818e": "unregister(bytes8)", +"260abfa5": "EnableMember(address)", +"260b0bc8": "payToOracle(uint256,uint256)", +"260b8f6e": "GetEvaluate(address,uint8)", +"260bf85a": "updateAmountToTakeAsRake(uint256)", +"260c2214": "setValid(uint256,bool)", +"260c3af1": "IcapTransfer(bytes32,address,bytes32,uint256)", +"260d387b": "blacklistUserForTransfers(address)", +"260e6885": "BazraCoinToken()", +"260e9640": "lock(uint256,uint256,uint256,uint256)", +"260ea6c9": "myDividendBalance()", +"260edaaa": "surplusTokens()", +"260f836d": "intercrypto_getInterCryptoPrice()", +"26109699": "Withdrew()", +"26111ab2": "addToSet(uint256,uint256)", +"2611341b": "submitApplication(address)", +"26119a0b": "changeFeeETH(uint256)", +"26121ff0": "f()", +"26134334": "getProjectKudos(bytes32)", +"2613ba9a": "PlatformDeposit(address,address)", +"2614195f": "getNameFee()", +"2614d4a4": "spendCredits(address,uint256)", +"2614fff6": "lengthOfCommonPrefix(bytes32,bytes32)", +"26161670": "donkeyRanking(uint256)", +"2616501d": "defaultRate()", +"261669ba": "HeroesToken()", +"26168eed": "getTestimonial(uint256)", +"261775f6": "BlokGrup()", +"2617fc13": "resetcardPrice()", +"26180224": "newChallenge(uint64,uint64)", +"261879ed": "addKitty(uint256,uint256,uint256[5])", +"26188437": "tokenReserved(address,uint256)", +"26188a3f": "increaseAllowed(address,address,uint256)", +"2618a571": "DEVELOPMENT_TEAM_CAP()", +"26195901": "numAnimals()", +"2619ba7f": "ETHFee()", +"261a323e": "exists(string)", +"261aa1c5": "additionalBonusPercent()", +"261ac279": "getApiByIdWithoutDynamics(uint256)", +"261b2c5e": "stepVestingDuration()", +"261b4205": "equalBytesToBytes(bytes,bytes)", +"261bd0f1": "BUY_BACK_BONUS()", +"261c085e": "registerChallenge(bytes32,uint256)", +"261c42dd": "getAllRevisionTimestamps(bytes20)", +"261c70bd": "voteMessage(bytes32,uint256)", +"261cb08a": "burnPausedTime()", +"261de7c4": "right33(uint256)", +"261e9693": "balances4(uint256)", +"261eafc8": "addMasterTo(address,string,string,string,uint8,uint8,uint8,uint8,uint8,uint8,uint32,uint32)", +"261ed1d8": "farmCities(uint256)", +"262006e9": "getFirstDocumentIdBetweenDatesValidFrom(uint256,uint256)", +"262007c0": "getBetter()", +"26207bd1": "indices(int128)", +"26208591": "payDividendsTo(address)", +"2620f61c": "storeClaim(uint16,address,uint256)", +"2620fb2b": "getNextTime(address)", +"2620fd4a": "setupICO(uint256,uint256,uint256,uint256)", +"262199c3": "changeTokenOwner()", +"2621b6e3": "finalStageRefund()", +"2623297e": "zt()", +"26232a2e": "platformFee()", +"2623f687": "getRevenue(uint256)", +"2624597c": "createTokensForEvent(address,uint256,uint256,string)", +"2624b2d9": "EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH()", +"2624c4eb": "EtheremonEnergy(address)", +"2625e2e1": "post(address,address,bytes32)", +"26278f86": "unrestricted()", +"262799f7": "PaquariumTokenTest2(uint256,string,uint8,string)", +"262834da": "_addOperator(address)", +"2628803f": "migrateREP()", +"262933cb": "responseFromWS(address,uint256,bytes32)", +"26295b52": "createGalaxy(uint8,address)", +"262aa9fc": "DOGToken(uint256)", +"262af333": "sponseeAddress()", +"262af3dd": "getClassViewValue(uint256)", +"262b9f8c": "finishRoundA()", +"262bcb68": "mintBooster(address,uint32,uint8,uint8,uint32,uint24)", +"262c0b72": "getPayoutFreezePeriod()", +"262c3666": "forward(bytes32[],uint8,bytes32,bytes32)", +"262da6df": "TransferOwnershipOperationEvent(address,uint256)", +"262f8244": "HGSOCIAL(uint256,string,string)", +"262f8c0e": "addTimelock(address,uint256)", +"262fe547": "testCheckSavecEthBalance()", +"2630271d": "setlockaddress(address,bool)", +"2630c12f": "priceOracle()", +"2630d97d": "setAtomLev(uint256,uint8)", +"2630ee9f": "revealBid(bytes32,address,uint256,address,address,address,uint256,uint256)", +"2630ef36": "setNumOfTimesSteal(uint8)", +"263164b9": "getSalaryTokensTotalCount()", +"26316e58": "setMigrationMaster(address)", +"26324eff": "producers(address)", +"26325bd3": "allowEveryone()", +"2632924d": "left30(uint256)", +"2632bf20": "unblockMe()", +"2632fc3c": "MichiganvsLoyola()", +"2634592a": "logReportsDisputedCalled()", +"26345de2": "VendingMachine()", +"26348325": "smartContactForSale()", +"2634d90d": "ArcherFreeCoin(uint256,string,uint8,string)", +"263570c0": "addStorage(string,address)", +"2635f4de": "registerLibrary(bytes,address)", +"2635f59f": "InterfaceToken()", +"263631b4": "euroCents2wei(uint256)", +"2637bb2e": "isTransferProxy(uint32,int256,address)", +"26381b05": "canReceiveTokens()", +"26387b07": "Fortune()", +"2638b25c": "seedEndTime()", +"263a6d79": "initiateTransaction(address,uint256,bytes)", +"263b694a": "MIMIMUM_CONTRIBUTION_AMOUNT_ICO()", +"263c0a8d": "_setLagParams(string,uint16,uint8)", +"263c493a": "enable_deposits(bool)", +"263c6ec0": "usdToTokens(uint256,uint8)", +"263ce6a0": "getWinningPrediction(address)", +"263d4878": "triggerRefund()", +"263d5ad0": "vaultPercentage()", +"263dffba": "_releaseVouchers(address,uint256,uint16)", +"263e3d5d": "terminateContract(uint256)", +"263e6d0d": "INDOPAY()", +"263e74e6": "computeBonus(uint16)", +"263e79b5": "addCreditScore(uint256,string)", +"263eb5b6": "assertEq8(bytes8,bytes8)", +"263ef0cf": "needRefoundETH(address,uint256)", +"263f6a42": "rateFeesNumerator()", +"263fa1ad": "XYZToken()", +"263fbd45": "getContractUpdatedTimeById(bytes32)", +"263fbef2": "District0xNetworkToken(address,address)", +"263ff8b9": "buildTokenId(uint256,uint256,uint256)", +"26407e36": "calculateSharesInTheRevenue(uint256,uint256)", +"26409047": "BDACoin()", +"2640b401": "SetRate(uint256)", +"2640f62c": "getTokenToEthOutputPrice(uint256)", +"26413760": "reducePlayersGooProduction(address,uint256)", +"2641d381": "totalNumberTokenSold()", +"26423259": "viewCoinSupplyAndFunding(bool)", +"2642567e": "coinData(address)", +"264282f2": "markTokens(address,uint256)", +"26428430": "_deleteInt(bytes32)", +"2643fc13": "spermlordReq()", +"2644f9f8": "getAssetsOwners(uint256)", +"26452036": "InitCountry(uint256,uint256)", +"264534be": "OMC(uint256,string,string)", +"26458beb": "firstPreSaleDate()", +"2646754d": "TestTokenA()", +"2646b176": "getPaimentStatus(address,uint256)", +"2646bce6": "LogWinner(uint8)", +"2646bfcb": "pay(uint256,uint128,address,bytes)", +"26470ae4": "getBonusFactor(uint256)", +"26476204": "stake(address)", +"26483bcd": "tokenMultiTransfer(address)", +"26484a44": "start3XPhase()", +"26487265": "contractExecuted()", +"26488531": "banMember(address,string)", +"2648a7e2": "EtherRedeemAccepted(address,uint256)", +"264934de": "submitTokenForEdit(uint256)", +"26493a6f": "setAllocateAgent(address,bool)", +"26496cab": "Milestone_IcoSuccessful(string)", +"2649cb10": "pNumberOfLockedTokens(address)", +"2649d62e": "multiMint(address,uint256)", +"264a3edc": "setPolls(address,address)", +"264a6d10": "get_next_asset_document_from_document(bytes32,bytes32)", +"264ae918": "withdrawChannel(address,uint256)", +"264b2b8e": "returnBalance(address)", +"264c22bb": "getAmountOfGene(uint256)", +"264c2cdc": "generateRandomNumber(address,uint8)", +"264c8e9a": "whatWasTheVal()", +"264caf14": "addVestor(address,uint256,uint256,uint256)", +"264d26e1": "ICO_CAP1()", +"264d7797": "tokensBought(address)", +"264dac0f": "endBorrowAgreement(string,uint256,uint256)", +"264e3018": "EtherDeltaHandler(address)", +"264f28fe": "getOwnerDeposit()", +"264f5718": "rondaSilla()", +"264f630d": "DonationReceived(address,uint256)", +"264faeb8": "getReportsCounter(uint256)", +"26500c84": "ResolverNode()", +"265028c2": "GetMaxBuyIn()", +"2650a47c": "withdrawEther(uint256,uint256)", +"26529836": "ADVISER_STAKE()", +"2652b4a5": "UDA()", +"2652c0f4": "hasVerifiedAttributeValue(address,uint256)", +"2652c757": "submitBracket(bytes32)", +"26532df8": "subZero(uint256,uint256)", +"2653ab19": "getMC(uint256)", +"2654e624": "ResumePayment()", +"265580f5": "setRegistryExecID(bytes32)", +"2655dd0b": "storeId(address,address,uint256)", +"26563b40": "whitelistManager()", +"2656455f": "claimEthFor(address)", +"2656b77d": "addToBattle(uint64)", +"2656da30": "setFuelContract(address)", +"26571388": "xpaExchange()", +"26591e79": "BONES()", +"2659d8ef": "setExchangeFormula(address)", +"265a3afd": "registerBase(bytes32)", +"265a8636": "_mintFish(address,uint32,uint8,uint8,uint8,bytes16)", +"265af6d1": "withdrawFundsAndPayRoyalties(uint256)", +"265b3e6c": "calculateIssueGoldFee(uint256,uint256,bool)", +"265b5d93": "getMaxLockAmount(uint256,uint256)", +"265c920f": "setBonusParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"265cdd88": "Bet(address,string,uint256)", +"265cfbbc": "Emitter()", +"265d900b": "wtech()", +"265dcbd3": "StandardTokenWrapper(address)", +"265f0393": "KryptopyCrowdsale(uint256,uint256,uint256,uint256,uint256,address)", +"265ffe2b": "ethMin()", +"26602470": "hashEIP712Message(bytes32)", +"2660316e": "plyrNames_(uint256,bytes32)", +"26605772": "renameTulip(uint256,bytes32)", +"2660b56c": "setData_2(string)", +"26617c28": "_setPaused(bool)", +"26625e46": "formatDecimals(uint256)", +"26627d80": "third_whitelistSupplier()", +"266361f5": "getLottoData(uint8)", +"26637579": "_removePlayer(uint256,uint256)", +"26638a38": "spin(int256)", +"2663a4ed": "byteToLower(bytes1)", +"26654d57": "refundParticipant(address,uint256,uint256,uint256,uint256)", +"266578d0": "_isRateActual(uint256)", +"26657c77": "Validate(string,string,string)", +"26663203": "withdrawFromEscrow(address,bytes32)", +"266710ca": "manualUpdateBalances_only_Dev()", +"266716f6": "GTSToken()", +"2667f407": "__proxy(address,bytes)", +"2668748d": "applyAuditorsCheckUpdate(address,address,uint64)", +"2669268b": "FUC(uint256,string,string)", +"266987ef": "p2pLocker(address)", +"26699576": "playSystem(uint256,address)", +"266b059e": "setSendAmount(uint256)", +"266b2eb5": "Conserve()", +"266bd375": "MyPizzaPieToken()", +"266bd901": "check_price(uint256)", +"266c2132": "_prand()", +"266cc170": "Y2J()", +"266ce248": "createPlayer(uint16)", +"266cf109": "record()", +"266d7bda": "lockupEndTime()", +"266d8299": "DriveholicToken()", +"266fc436": "producedSilverCaps()", +"266fc5d5": "totalContributorsProfit()", +"2670bdf0": "setERC777(address)", +"2670cc14": "transfekbolPlutocrat(address)", +"267127ec": "getTokenSettings()", +"267177eb": "sendPayout(bytes32,uint256)", +"2671b61d": "OfferRouting(bytes32,bytes32,uint256,bytes)", +"2671e253": "resetTraps(uint256)", +"26728b14": "rewardPXL(address,uint256)", +"2672b3e2": "SplitterEtcToEth()", +"2672c952": "seed_coins()", +"26735c06": "TOTAL_POOL_COMMISSION()", +"26736363": "APRInflationToken(uint256)", +"26741c88": "IcoMessage()", +"26744071": "WLCoin()", +"26745909": "PRNG_Challenge()", +"26746f5f": "updateGenerationRatio(uint256,address)", +"26748804": "BlockPoints()", +"2674899b": "getSaleHour(uint256)", +"267490aa": "turnOnPresale()", +"26749ad7": "approvedContracts(address)", +"267502c9": "setAquarium(address)", +"2675c123": "CloseContract()", +"26760d1d": "setMaxTms(uint256)", +"26767298": "RimuoviMiner(address)", +"26767cfe": "shareProfits()", +"26768b83": "_emitDestruction()", +"2677ef1b": "_seal(address,address,uint256)", +"26782247": "pendingAdmin()", +"267822c1": "finalizeChangeBurnBounds()", +"267835a4": "_removeBurner(address)", +"26798494": "EusdContract(address,address,address,uint256,uint256,uint256)", +"26798680": "toReal(int216)", +"267acd6c": "getPricesPerInterval(uint8)", +"267b6922": "entries(bytes32)", +"267c4ae4": "exists()", +"267c8507": "authorizeManager(address)", +"267f20a2": "_transferTo(address,uint256)", +"267ff78c": "approveRequestUnpause()", +"26811c09": "NVBToken()", +"26815de3": "updateGoldPrice()", +"2682644f": "PURCHASE(address,uint256)", +"26826bf8": "setImage(bytes)", +"2682a0ac": "CrowdsaleTokenExt(string,string,uint256,uint256,bool,uint256)", +"26834988": "numListed()", +"26839e53": "getUintValues(bytes32)", +"26839f17": "depositEther(uint256)", +"26843251": "presale1_startdate()", +"268451a2": "testFail_set_price_unauth()", +"26848a86": "setPicture(string)", +"26848b68": "checkCrowdsaleBalance()", +"26866160": "secondsBetweenReadings()", +"2687c645": "contributeInternal(address,uint256)", +"26881518": "setupFee(address)", +"2688454a": "U()", +"268855a4": "ParsecCrowdsale(address,address,address)", +"26887303": "TourCashStandardToken(uint256,string,uint8,string)", +"268959e5": "removeAdmin(address,address)", +"268a4559": "competitionStatus()", +"268b0459": "getRecordBalance(address)", +"268b5344": "PlanetOfOwner(address)", +"268b946c": "toUint8Throw()", +"268bb78e": "propose(address,bytes,uint256,uint256)", +"268bc65d": "signatureDropMultipleAmount(address[],uint256[])", +"268c969a": "emergencyDrawingReset()", +"268cb5f7": "queryCost(address[])", +"268d50fe": "ownerSetHouseEdge(uint256)", +"268da061": "CRFtoken()", +"268e7075": "toBytes2(bytes)", +"268ea7f6": "ReInvest(uint256)", +"268eb055": "setDescription(uint64,bytes)", +"268ef7e8": "holdAddress1()", +"268efdaf": "StdInt64(int64)", +"268f1153": "changeState(uint8)", +"268fe426": "dailyReset()", +"2690f0d5": "foundationLock()", +"269106e9": "dayCycle()", +"2692281d": "requestChangeBurnBounds(uint256,uint256)", +"2692de22": "sendAllFunds(address)", +"2693c150": "getPlayersTickets(address)", +"2693eca0": "devSFTDestination()", +"2693ed9b": "calcTokenSold(uint256)", +"2693ee80": "bonusPool()", +"269445db": "phase_6_rate()", +"26949220": "withdrawWonCosFromGame(uint256,uint256,uint256)", +"2694f6bb": "Log1_fnc(address,bytes32,uint256,string,string,uint256,bytes1,uint256,uint256)", +"26961b8c": "Token99chain(uint256,string,uint8,string)", +"26965dad": "deployStepOne()", +"269695fe": "groomVow()", +"269714dd": "maximumTarget()", +"269724ef": "assertEq6(bytes6,bytes6)", +"26976e3f": "upgradedAddress()", +"26987b60": "currentIndex()", +"2698eec9": "logFeeTokenMinted(address,address,uint256)", +"269975d0": "GameDetails(uint256)", +"2699a7e7": "setPOOL_edit_31(string)", +"2699c808": "tradeOption(address[3],uint256[3],uint256[2],bool,uint256,bool)", +"269a7c3f": "buyAndTransfer(address,address)", +"269aacc8": "getDividendPayout(uint256,uint256,uint256)", +"269b0737": "DaoCasinoToken()", +"269c4bca": "viewFoundersTokens()", +"269c6ece": "lockedTwoHasEnd()", +"269cdaac": "withdrawLockedTokens()", +"269db987": "calculateBonusAmount(uint256,uint256)", +"269de5a0": "EpicExchange()", +"269e4f3c": "refundWei()", +"269eb58c": "setFeeFromPayer()", +"269ecc6d": "backersAddresses(uint256)", +"269ecf28": "submitBuyOrderWithPosition(bytes32,uint256,uint256,uint64,bool)", +"269f4663": "approveMintTokens(address,uint256)", +"269f96c9": "presaleSoldTokens()", +"269fe82e": "calcBurnAmountFromFeeBurner(uint256)", +"26a09392": "addSecondaryAddress(address,address)", +"26a1529e": "amountOfStakeReturnedOnCancellation(uint256)", +"26a18375": "setAvailability(bool)", +"26a21575": "tokenRaised()", +"26a26f71": "TgeTeamReleasingScheduleContract()", +"26a3bd4e": "subtractBalance(address,address,uint256)", +"26a3f45d": "initOwner1(address)", +"26a4861c": "CROWDFUNDING_PERIOD()", +"26a49e37": "price(uint256)", +"26a4c847": "maxLendingItem()", +"26a4e8d2": "setTokenAddress(address)", +"26a52019": "agentMakeOrder(address,address,uint256,uint256,address)", +"26a5a554": "removeFromReceiveAllowed(address)", +"26a65c10": "createDigitalArtFee()", +"26a6dfed": "toogleTransfers()", +"26a7985a": "getMaximumCallGas()", +"26a82e8b": "autoPreSaleSuccess(address,uint256)", +"26a8d1e5": "_changeManagerImpl(address)", +"26a934f5": "minResalePercentage()", +"26a9408c": "returnTokensFromHoldBountyAddress(uint256)", +"26a9de53": "verifiedTransferFrom(address,address,uint256)", +"26aa101f": "isTokenRegistered(address)", +"26aa7c58": "addBuyer(address,uint256)", +"26ab378b": "addMood(string)", +"26abc9ab": "CmctSale(address)", +"26abfe09": "burnUndistributed()", +"26ad3abc": "startTimeStage3()", +"26ad7b40": "_doesEveryTokenHaveLockupPeriod()", +"26ad8d1b": "getPositionStartTimestamp(bytes32)", +"26ae27d6": "lonmemay()", +"26aeba91": "FarziTokenSale()", +"26aebfac": "delPack(uint8,uint128)", +"26afe980": "queryOracle()", +"26b238d8": "doom()", +"26b3293f": "deposit(address,uint256,bytes32)", +"26b387bb": "pendingReturns(address)", +"26b3a6f8": "SelfKeyToken(uint256)", +"26b41613": "processFunding(address,address,uint256,uint256)", +"26b45b09": "rateTier4()", +"26b4ce7f": "NP(uint256,string,string)", +"26b51c8c": "finalBlock()", +"26b52faf": "firstWithdrawAmount()", +"26b66cb7": "amendedEarlyPurchases()", +"26b6c0b4": "settingsSwitchTransferAccess()", +"26b7d803": "getTotalBuyCount()", +"26b7fe35": "GainStuff(address,uint32,uint256)", +"26b85ee1": "myAddress()", +"26b85f0d": "mininumContributeUSD()", +"26b916b4": "Set_Interest_Rate(uint256)", +"26b92a0e": "SomniumToken()", +"26b93939": "Jokercoin()", +"26b9ce13": "setTransfersEnabled(bool)", +"26ba1c19": "addBagAndGiftAtTime(uint256,address,uint256)", +"26ba2e47": "paidETH(address)", +"26ba4319": "setDirector(address)", +"26baca1c": "getStats2()", +"26bca0f8": "get_my_info()", +"26bceb59": "mul256(uint256,uint256)", +"26bd4d96": "adPriceMultiple()", +"26bd78b9": "LogEvent(uint256,address,bytes4,bytes,uint256,uint256)", +"26bdd20b": "getNominatedMediator()", +"26bdd814": "refundPresale()", +"26bf02cf": "getBaseLevelUpFee()", +"26bf2051": "KickCommitteeVoteEvent(address,address)", +"26bfcde0": "GMCToken()", +"26bfd35c": "rewardAD()", +"26c009cb": "privateIcoSold()", +"26c0ad3a": "allowRefunding(bool)", +"26c19eba": "readValue(bytes32,uint8)", +"26c1e750": "planets(uint256)", +"26c21722": "getwithdrawEtherToAddressValue()", +"26c2bcb4": "checkBenefit(address)", +"26c30b50": "BITS(uint256,string,uint8,string)", +"26c32ff5": "demi(uint256,string,string)", +"26c387fa": "testFail_mint_without_add_authority_to_controller(int256)", +"26c3d6f8": "get_deposit_term(address,uint256)", +"26c435a9": "totalUsdFunding()", +"26c43d8f": "hodlerTotalCount()", +"26c47909": "SXCToken()", +"26c4b863": "XIOToken()", +"26c4fa3d": "setOfficialGameUrl(string)", +"26c5c154": "employeeAddress()", +"26c6d361": "FanCoin()", +"26c7edaa": "flip4(bytes)", +"26c81320": "lastgamewinner()", +"26c93389": "removeFreezableAddress(address)", +"26c989df": "holdBalance()", +"26c9959f": "LoveToken()", +"26c9bc42": "setTokenInformation(string,string,uint256)", +"26c9e547": "bestow(bytes32,uint256,address)", +"26ca1280": "_addToken(address)", +"26cb2257": "outRate()", +"26cb83b9": "setDescrutionContractAddress(address)", +"26cbb8ff": "inviterRegister()", +"26cbe6f5": "getHeroAvailableAt(uint256)", +"26cc2256": "blockRewardAmount()", +"26ccd77a": "withdrawStuckEther(address)", +"26ce3da0": "collectRefund()", +"26cee3a7": "getPlayerId(bytes32,bytes32,address)", +"26cf53b9": "BTL_PERSIAN()", +"26cf660d": "trustedOrderbook()", +"26cf9165": "pixelgrid()", +"26cfc76f": "TriPinCoin()", +"26d0d75a": "ResolutionProposals(uint256)", +"26d111f5": "note()", +"26d29ce0": "refundBid(uint256)", +"26d2b840": "addDadRelation(address)", +"26d2cba5": "updateMetaData(bytes32,bytes32,bytes32,uint256,bytes32,bytes32)", +"26d2eb11": "stopPostIcoAndBurn()", +"26d312f7": "sendWebGiftToken(address,uint256)", +"26d3325d": "getExpectedPayment(uint256)", +"26d3bde5": "execCUSEOption()", +"26d3df61": "deedsOf(address)", +"26d3e7e8": "inititalSupply()", +"26d3e889": "testCreateWithParentsForeign2()", +"26d3ed0a": "isSpentCustomerTxPaymentForMCW(address,bytes32)", +"26d541b0": "totalPlayerCount()", +"26d64f3b": "readTeam(bytes32)", +"26d6eca3": "retrieveReward(uint256)", +"26d7b3b4": "unRegister()", +"26d83db8": "LoveYToken(uint256,string,uint8,string)", +"26da881f": "setPrivateFundStart(uint16,uint8,uint8,uint8,uint8,uint8)", +"26da8e17": "ownerUpdateCostToCallOraclize(uint256)", +"26db3c0a": "tokenIssue(address,uint256)", +"26db7648": "proposedVersion()", +"26dcbcfc": "catPaymentCollector()", +"26dd1510": "pixelblockPrice(uint24,uint24,uint24,uint24)", +"26dd860a": "mintUniqueTokenTo(address,uint256,string)", +"26ddaebc": "getPriceWithBonus()", +"26dec45e": "getUserUsername(address)", +"26defa73": "addAuthority(address)", +"26df61f6": "permittedContractsCount()", +"26dfb6b4": "advteamPool()", +"26dfe583": "partialDivest(uint256)", +"26e010c8": "minInitialMarginAmount()", +"26e137c2": "getInterfaceImplementationStatus(address,bytes4)", +"26e23485": "renamingCostsPerChar()", +"26e33670": "NewQuiz(string,bytes32)", +"26e41a3e": "airdropTokens(bytes32,address[],uint256)", +"26e43db5": "TransferSell(address,address,uint256,string)", +"26e501a8": "BitonlineStore()", +"26e56c05": "SaleCapReached()", +"26e5ab38": "changeMaxWithdraw(uint256)", +"26e5afdf": "Yinfiniti()", +"26e5b0be": "stopMulti()", +"26e6050d": "setParamsIco(bool)", +"26e6074b": "frozenBalance()", +"26e683fb": "NotitiaToken()", +"26e72d31": "resetCurrentRoundSales()", +"26e770e9": "Information()", +"26e77179": "PaymentRefunding(uint256,address,uint256,string)", +"26e80650": "upPlayerRound(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"26e85250": "viewRequest(uint256)", +"26e89689": "applyForCertifition(address,string,uint256,string,uint256,bool)", +"26e8cd23": "bobMakesEthDeposit(bytes32,address,bytes20,bytes20,uint64)", +"26e90775": "calculatePrize(uint256,uint256,uint256)", +"26e97fce": "allowMint(address,uint256)", +"26e9fd9e": "remove(bytes20)", +"26ea66bf": "Mortal(address)", +"26ea74e2": "approvedDividendsOf(address)", +"26ea7ab8": "changeadmin(address)", +"26ea9268": "FEE_SELECT_MAX_VALUE()", +"26eaee92": "devReward()", +"26ebc8af": "UserAuthorizedForToken(address,address,address)", +"26ebe0bf": "totalCentsGathered()", +"26eca77c": "HelloGoldRound1Point5()", +"26ed274e": "decreaseBurnApproval(address,uint256)", +"26ed794b": "mobilinkTeamAddress()", +"26eda1ac": "putMessage(string)", +"26ef8ba1": "putEth()", +"26f08aec": "setotherchainstotalsupply(uint256)", +"26f09042": "testThrowNoFreeTokens()", +"26f1069f": "approvePresale(address)", +"26f21080": "allowedToTransferOf(address)", +"26f2458a": "RequestP(bytes32,bytes32)", +"26f35ff2": "activenessUpgrade(uint256,uint256)", +"26f3ceaf": "TSToken()", +"26f4739e": "LogBuyTokens(address,uint256,uint256)", +"26f489f6": "_updateCardPerkText(uint256,string)", +"26f4b3de": "userTakeOrder(address,address,uint256,uint256,address)", +"26f590f6": "setAttribute(string,string,bytes)", +"26f59b8b": "ProICOHardcap()", +"26f6ec3b": "getCities(uint256[])", +"26f743d0": "createGuess(uint256,uint256,uint256,uint256)", +"26f78835": "XXXChain()", +"26f86791": "_indexOf(string,string,uint256)", +"26f8abf9": "getRankOnePlayer(address)", +"26fa9082": "Enumivo()", +"26faae42": "addChild(address,bytes32,bytes32)", +"26facdb1": "TeamTokenDistribution(address)", +"26fae0d3": "setMaster(address)", +"26faf1e9": "SVLightIndex()", +"26faf9c2": "EatMeCoin(address)", +"26fc4c7f": "returnTokens(address,uint256)", +"26fc71eb": "isConfirmedGblock(bytes32)", +"26fd8422": "calculateEggBuy(uint256,uint256)", +"26fdb484": "OwnershipRevoked(address,address)", +"26fe18e2": "setMintingOracle(address,address)", +"26fe2024": "newRate(string)", +"26fe7cf2": "createStar(uint8,uint16,string,string)", +"26fe9951": "delegatedFrom()", +"26feba74": "MaorTestCoin()", +"26fed988": "addCancelledOrFilled(bytes32,uint256)", +"26ffa189": "setEnableWhiteList(bool)", +"2700615c": "_getShipInfo(uint256)", +"27018631": "icoBonus()", +"2701d40f": "ForSale()", +"2701ebd8": "NDT3()", +"27028aae": "voteOnBounty(uint128,uint256,bool)", +"27029357": "addToReceiveAllowed(address)", +"27029e83": "BurnToken(address)", +"2703506f": "CouponDeposit(address[2],uint256[8],uint8,bytes32[2],uint256)", +"2703e545": "projectInfoPublic(address)", +"2704355c": "setGenesisCallerAddress(address)", +"2704e8e9": "addRemovableIdArrayItem(address,uint256[],string,string,string,address)", +"2704ead4": "_isValidSkin(address,uint256,uint256)", +"27053417": "_updateSeed()", +"270537c0": "lockReserveTokens(address)", +"2705ce6a": "setAuditorDelegate(address)", +"27066ebb": "getOwnedTokensIds(address)", +"27071f6a": "_tokenOfOwnerByIndex(address,uint256)", +"270835d0": "allocateBid4a(bytes32)", +"2708a710": "MintHelper(address,address,address)", +"2708db73": "requestLeave(uint256,string)", +"270a3856": "startDist()", +"270a5420": "buyFST()", +"270a8ef7": "existingMarketOrder(uint256)", +"270abf36": "getChickenAmount()", +"270ba309": "getRegistryDataInitialized()", +"270bb8ad": "setImmigration(address)", +"270bfc07": "fundingAccount()", +"270cf206": "ENSReverseRegister(address,string)", +"270cfee1": "getTokenAccount()", +"270d13fb": "isCoinIdUnique(uint16)", +"270dc9fd": "changeName(string,uint256)", +"270e4cf0": "buyerAddressTransfer(uint256,address,address)", +"270ef385": "CLAIM_AMOUNT()", +"270f611f": "burnBalances()", +"270f7219": "getJntController()", +"270f9359": "Exploit(address)", +"270fdd1a": "GricCoin()", +"2710ddcb": "setMsg(bytes32)", +"27120de9": "numberOfStarsReserved()", +"27121069": "verify(bytes,uint8,bytes,bytes)", +"27121b76": "claimDailyLoot(uint256)", +"2712d916": "setSanTTTCost(uint256)", +"27132be6": "getCustomBuyerMappingCount(address)", +"27136e46": "changeTransactionService(address)", +"2713a1b4": "getUserWithdrawnBalance(address)", +"27150f01": "devFeeSize()", +"27151526": "nextBid()", +"27158b7b": "MFToken()", +"271619fb": "CreateContract(int256,int256,uint256,uint256,int256,address,string,uint256,int256,string,uint256)", +"27164f15": "getBuyOrdersInfo()", +"2716783d": "distributeERG(address[],uint256,uint256)", +"2716baa6": "startContruibute()", +"271761c0": "EventSuccessfulTraining(uint64,uint64,uint64)", +"271781ad": "getRestSumStageICO()", +"2717cc7c": "ParticipatedInVoting(address,address,bytes32,uint256)", +"27180e42": "wantItMoreThanYou(uint256)", +"27187991": "setEtherPrice(uint256)", +"271a50db": "setAgonFight(address)", +"271af8c1": "tokenCollector()", +"271b3e8a": "snakemasterReq()", +"271b5311": "getValidateSignatureAddress(address,string,uint256,uint8,bytes32,bytes32)", +"271bac4a": "setBonusPhase(bool)", +"271c34d7": "denyProposal(uint256)", +"271cacbf": "batchAddToWhitelist(uint256,address[])", +"271cd760": "getPackageDb()", +"271d9090": "HenryToken()", +"271dd15b": "getWinNumberAddress(uint256,uint256)", +"271dec50": "Invested(uint256,address,uint256,uint256)", +"271df6e5": "canLotteryFree()", +"271f88b4": "setAmount(uint256)", +"271fe8be": "buyNormal(address)", +"2720e4f6": "LC()", +"27213345": "totalSupplyToken()", +"2721a114": "queryWinner(string)", +"2722692c": "lastBlockSet()", +"2722c043": "raiseEventIfMinted(address,uint256)", +"27234ecc": "takeBalance(address,address,uint256,address)", +"2723639b": "getPixelAreaColor(uint256,uint256,uint256,uint256)", +"2724312a": "Micropayment(address)", +"27243160": "bookmark(string)", +"2724e032": "manualEndDay()", +"27258b22": "isRegistered(bytes32)", +"2726403a": "testCanTrade(address,address)", +"2726a530": "getHodlHasBeenWithdrawn(uint256)", +"2726b506": "getDeposit(address,uint256)", +"2726f061": "commitVotes(address[],bytes32[],bytes32[],bytes32[])", +"27270550": "swapAble(bool)", +"27275a35": "SuretlyToken()", +"2727d018": "PlusPayLite()", +"272870ac": "pausable(bool)", +"272894ca": "refundTokenBet(uint256,uint8)", +"27295d7c": "updateMaxPhase2(uint256)", +"272961ff": "depositAgent2(uint256,uint256,bytes,uint256)", +"2729f44e": "addTxToRegistry(bytes32,bytes32,uint256,uint256,uint256)", +"272a33e8": "allocateBid2(bytes32)", +"272a3e16": "PlayerWon(uint256)", +"272a847f": "HAICrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"272ae0b5": "MIMIMUM_CONTRIBUTION_AMOUNT_PREICO()", +"272caf69": "stakeContractAddress()", +"272cda88": "EternalDB()", +"272d20e7": "amount_direct()", +"272e20fa": "__abort__()", +"272edeac": "currentMineTokenAmount()", +"27301964": "withdrawDevTokens(address,uint256)", +"2730e4a2": "_arrangeMasternodeFlow()", +"273123b7": "delBot(address)", +"27315b5f": "Settlement(address,address,uint256,string,string)", +"27329380": "getRecentPlayersCount()", +"27329b05": "enableBot(address)", +"27332624": "_lottery(uint256,address,address)", +"27341c8a": "isEmpty(string)", +"2734242b": "BunnyToken()", +"273696cd": "SetImplementation(address,address)", +"2736a558": "removeBackdoor()", +"2736f6d9": "setTokenAndRate(uint256,uint256)", +"2737033f": "initialize(address,uint256,uint256,uint256,uint256,uint256,address,address)", +"27374015": "functionFive()", +"27378684": "price4()", +"27380c2c": "updateAngelCardSeries(uint8,uint64,uint64)", +"2738154e": "checkRokBounty()", +"2738a112": "triggerSelfDestruction()", +"2738bf4d": "addLeaderboard(string,string,uint256)", +"2738ed25": "Player_Bettings(uint256,uint256)", +"27393390": "setTokensMultiplier(uint256)", +"273a041c": "_self()", +"273a5729": "eligibleTokens()", +"273afe15": "ParisToken()", +"273b1dd3": "RealMadridvsLiverpool()", +"273b1fb3": "betbucketOne()", +"273b465b": "verifiedAgeOver(address,uint256)", +"273ba6bb": "ICO()", +"273bc3c9": "numberOfThrones()", +"273ca81c": "getMegaBalance()", +"273cb593": "isMasterOfCeremonyRemovedPending()", +"273cbaa0": "getTokenList()", +"273cc2a5": "depositOpen()", +"273dd51f": "_distributeHorse()", +"273e2c78": "F2UPay()", +"273ea3e3": "incrementNumber()", +"273f1de7": "paySellerFee(bytes32,address,uint256)", +"273f4940": "set(bytes32,uint256)", +"273f9ace": "getNumbers(bytes32[])", +"273f9bed": "signedTransferFromCheck(address,address,address,address,uint256,uint256,uint256,bytes,address)", +"273fd520": "EthlanceFeedback(address)", +"2740509d": "urbitTeamTokensVault()", +"2740e64b": "getInitializeParentPayoutDistributionHashValue()", +"27411dfd": "getPoliceFee(uint256)", +"27413437": "grantFounderToken()", +"2741876a": "totalPresses()", +"2742d511": "setWhitelistedStatus(address,address,uint256)", +"27436b59": "getCarCount()", +"274465b4": "payForMyself(uint128)", +"27457b3b": "getMyInventory()", +"27458664": "enableTokenMinting()", +"27458cbc": "disallowClaimer(address[])", +"274748e6": "setInactivityReleasePeriodForToken(address,bool,uint256)", +"2748503f": "ChangedOwner(address,address)", +"27486a7c": "combineCards(uint256[])", +"2748d7e4": "claimPlotWithData(uint256,string,string,string,string)", +"2749bd81": "getTimestamp(address,uint256)", +"274a1f29": "setNextLotteryTTMTokenId4(uint64)", +"274a9b1c": "addressToEtherContributed(address)", +"274acb35": "add(uint96,uint96)", +"274b1615": "keyValidations(address)", +"274b3df4": "deposit_eth()", +"274b9bc5": "ETHx2()", +"274bc107": "test_threeValidEqBytes()", +"274c343a": "HTCCToken()", +"274c7922": "privilegedAddress(uint256)", +"274db4d6": "_price_tokn_PRE()", +"274ed288": "debtBalanceOf(address,bytes4)", +"274f97bb": "buyReply(uint256,uint256)", +"274faa9f": "minContributionUnits()", +"274fadf6": "updateServiceDescription(address,uint32,string)", +"274ff7ce": "burnFrom(uint256)", +"27506099": "getCountPlayersOfOwner(uint256,address)", +"27507458": "isLive(uint256)", +"2750fc78": "setIsActive(bool)", +"275103fd": "hault()", +"27521702": "mint(int256,address,uint256,bool)", +"2752808a": "CAPcoin()", +"2752de56": "addMoneyPool(address,address)", +"27538e90": "getCapabilityRoles(address,bytes4)", +"2753d7f2": "artworksFactory()", +"2753f254": "workedTodayInSeconds()", +"2754ff69": "test_2_ensureProposalExecution_increaseBlocksBy100()", +"2755a13b": "forceClose(uint256)", +"2755cd2d": "tip()", +"275601f6": "getAllProviderParams(address)", +"27566b80": "transferCollectedEther(address)", +"275676cf": "ClassicVolkswagen()", +"27567c4c": "setIsPoop(string)", +"2756d38a": "IonChain()", +"27571087": "getBonus(bytes32,uint8)", +"2757a07c": "SSDDTT(uint256,string,string)", +"2757e976": "transferredIndex()", +"2758743c": "LATINOToken()", +"27589224": "minBuyingRequestInterval()", +"275893a9": "updateMaintenanceAddress(address)", +"27593eee": "ChangedName(address,string)", +"27597f0a": "costForProductCycles(uint256,uint256)", +"2759ea4a": "lookupSprite(uint256)", +"275a1334": "buySellPrices()", +"275a329a": "BCASToken(uint256,string,string)", +"275a92cf": "TokenPurchase(uint256,uint256,address,address,uint256,uint256)", +"275acbe3": "ln(uint256,uint256,uint256)", +"275b6eb0": "calculateSeedSell(uint256)", +"275babee": "getRareInfo(uint256)", +"275be02c": "MRBLToken()", +"275beec6": "createItem(uint256,string,address,uint256,string,string,uint256)", +"275bf230": "addAddressToAccount(address,address)", +"275c82ca": "GasUsed(uint256)", +"275cb687": "setNextPoolPercentage(uint256)", +"275ccb13": "computeLeaf(uint256[],uint256)", +"275d60bc": "getReturnAddress(address)", +"275e2d3f": "st4ckCount()", +"275e2f86": "MORCoin(uint256,uint256,uint256,address)", +"275e5da5": "probe(address)", +"275f3d92": "view_readyTime(address,address)", +"27608c24": "unsoldToken()", +"2760c57e": "lastPing()", +"276184ae": "erc20Address()", +"2762484a": "SBIToken()", +"2762cf10": "contract_transfer(uint256)", +"2763d8fb": "FabCoin()", +"2765faae": "MaximalInvestmentTimeTresholdChanged(uint256)", +"276605bc": "updateFundingStartBlock(uint256)", +"27669781": "emitInfo(uint256,uint256,address,uint256,uint256)", +"27678dca": "getHWCAddressCount()", +"27687d34": "advisersTokenTimelock()", +"276920eb": "setOwnerTokenPercentage(uint256)", +"276927c5": "sellSpaceship(uint256,uint256)", +"2769b96b": "updateItemPrice(uint256,uint256)", +"2769c89a": "setGameStartTime(uint256)", +"276a28a3": "isTokenLocked(uint256)", +"276b94e1": "copypaste()", +"276bf637": "isTimedout(uint256,uint256,uint256)", +"276c9d0a": "balanceOfOld(address)", +"276cd2e8": "BTTPERETH()", +"276e3968": "bits(uint256,uint256,uint256)", +"276e6472": "deleteById(string)", +"276ebc6a": "ChargeTest()", +"2770a488": "transferWithIndex(address,uint256,uint256)", +"2771083f": "setSpreadPercent(uint256)", +"27729e93": "openLottery(uint8)", +"2772dffd": "votes(bytes8)", +"27731e77": "setCCH_edit_9(string)", +"27734225": "getCommitteesNumber()", +"2774d052": "mintPresell(address,string)", +"277576ca": "theTurn()", +"27757c49": "isVariation()", +"2776a859": "computeResponseSecondHalf(uint16)", +"2776b163": "setstoredaddress(address)", +"27773ba2": "addrAirDrop()", +"27782e42": "refreshActiveShareholdersArray()", +"27783050": "getEntryHash(address,uint256,bytes32)", +"27793f87": "outcome()", +"277942db": "marriageLicenceImageIPFShash()", +"27796092": "t4tToken()", +"2779ea96": "addPostOnBoard(address,address,address)", +"2779eb52": "setUserRank(address)", +"277a6889": "calculateInterest(uint32,uint256)", +"277ad1f6": "amountSellForOneEth()", +"277ad5d8": "secondRoundMayDiscount()", +"277ad6d4": "PreSaleResumed()", +"277b2db6": "getPlayerVaults()", +"277b6527": "targetCrowdsale()", +"277b8ffc": "getBeneficialAddress()", +"277ccada": "unlistTrophy(uint256)", +"277ccde2": "getHKGPrice()", +"277d4725": "getEthereumToken()", +"277e1b16": "changeMaxDonationLimit(uint256)", +"277e1de7": "transferAccessory(address,address,uint64)", +"277e268e": "testFail_set_label_unauth()", +"277ea83d": "getTrustPlatform()", +"277f6331": "ETVRToken()", +"277fc0e9": "getSignature(address)", +"277fc17d": "daysToSeconds(uint256)", +"277fef99": "transferPoint(uint32,int256,address,bool)", +"27806a16": "DoxCoin()", +"2780d22b": "getMigrateMarketInFromNiblingCalled()", +"27810b6e": "burner()", +"27815883": "_setHairValue6(uint256)", +"27816235": "onSaleEnded()", +"27816932": "AdaptableToken(uint256,uint256)", +"27816ffc": "logMarketFinalized(address)", +"2781c3d1": "ownerSetdiceRollAddress(address)", +"2782ca8d": "MINIMUM_PURCHASE_IN_USD()", +"27836f77": "setImageData(uint256)", +"2784ad48": "computePayment(uint256,uint256)", +"2784d868": "getMiniPoolEdit_2()", +"2784e3f3": "refundVotingTokens(address,address)", +"27854452": "allocateAgents(address)", +"2785ed21": "LogCertificationDocumentAdded(address,bytes32)", +"2785fb98": "getContributionETH(address)", +"27860587": "TXToken()", +"27869c57": "gluon()", +"2786f089": "setUserAllocMin(address,uint256)", +"2787fac2": "LordCoinPreICO(address,address,uint256,uint256,uint256,uint256)", +"27880e1f": "KyberNetwork(address)", +"2788f4f3": "OraclizeCallback(bytes32,string)", +"2789192f": "isConfirmedSettingsRequest(uint256)", +"27895f13": "_advanceClock(bytes32,uint256)", +"27899ce2": "allowNewReceiver(address)", +"27899d9b": "LGOToken()", +"278a3684": "advisorAmount()", +"278a4c4f": "setMasterToReferral(address,address)", +"278a5e7c": "cancelScript(address)", +"278ab692": "startDispute(address)", +"278af72c": "isSaleClockAuctionStorage()", +"278b8c0e": "cancelOrder(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"278bb4a2": "EthealDeposit(address,address)", +"278bee92": "_receiveMakePlant(address,uint256,uint256)", +"278c284c": "CrowdsaleToken(string,string,uint256,uint8)", +"278c2977": "chooseOpponentForGladiatorBattle(uint256,uint256,bytes32)", +"278c3030": "phase_2_Time()", +"278c4d71": "peaceOfTRC20(address,uint256)", +"278c688e": "getBackToken(uint256)", +"278cc714": "getUsablePlayerFibokens(address)", +"278d6e5b": "funcArrayInArguments(address[],address[])", +"278d818c": "setMaxRankingSpots(uint8)", +"278d9637": "limitTransfer()", +"278e07ce": "setStatus(address,uint8)", +"278e72da": "_destroy(uint256)", +"278e9d03": "testMemoryIntegrityCheck33Bytes()", +"278ecde1": "refund(uint256)", +"278f05ba": "SolomexCrowdSale()", +"278f2ab8": "deposit(bytes32,uint256,uint256)", +"278f49b9": "SetupRaffle(string,string)", +"278fcffa": "accountsLastClearTime(address)", +"278ffa13": "confirmTopUpLimit(uint256)", +"279029b3": "remainingARXSupply()", +"27904ee0": "getRabbitMotherSumm(uint32)", +"2791cb17": "setClientLastSupplyID(address,uint256)", +"2792949d": "BTC()", +"2792e765": "transferCroupier(address)", +"27933ffa": "LYToken()", +"27939ea2": "issuerReservedMaximumPercentage()", +"2795348d": "KittenSelfDrop2()", +"279586f3": "AltBuy(address,uint256,string)", +"27960c5f": "validateEndowment(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"279616fe": "TransferDissolved(address,address,uint256)", +"27962fc1": "tokensAmount(uint256)", +"27970ea1": "updatePlayerRecommendFund(address,uint256,uint256)", +"27972584": "MintRestarted()", +"27972b99": "StarterToken()", +"27972e8f": "GRVToken()", +"27979b35": "genLevelExpGain()", +"2797e0c3": "getInitBlockNum()", +"27987533": "defaultResolverChanged(address,address)", +"2798cecd": "requestData(address,uint256,uint256,bytes32,address,bytes4,bytes32,bytes)", +"2798d1b2": "my_token_balance()", +"2799276d": "totalItems()", +"279a34f1": "switchSaleStage()", +"279a475f": "TJToken(uint256,string,uint8,string)", +"279aa01f": "getManualAddress(uint256)", +"279b4e76": "createAuction(uint256,uint256,uint64,uint256)", +"279b9562": "initIntervals()", +"279b9c7b": "HJToken()", +"279bad16": "fuel()", +"279c7425": "getTokensOwed(address,uint16)", +"279c94c0": "admin_add(address)", +"279cea35": "execScript(bytes,bytes,address[])", +"279ddc64": "SetBankerCandidate(uint8,address)", +"279e02a0": "getMemberDividendsAmount(address)", +"279e0912": "getDownloadPrice()", +"279e1c43": "_createCollectible(uint256,uint256)", +"279e79b5": "ZebiCoinCrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"279f5d31": "pop1()", +"279fdf6d": "trustedVault()", +"279fdf96": "setPresaleMarketAddress(address,address)", +"279fe967": "maxEthCapSellInFp()", +"27a030eb": "getRandomLotteryTicket()", +"27a06733": "setKycRequirement(address,bool)", +"27a099d8": "getOperators()", +"27a0d669": "getImplementation(string,string)", +"27a1a414": "allowedLocks(uint256)", +"27a1d948": "doubleDown(uint256)", +"27a1f35a": "setOpenStatusEgg(uint256,bool)", +"27a21061": "to_start_ico()", +"27a2aee2": "Commission()", +"27a3181d": "price2()", +"27a3e16b": "setBlockRewardContract(address)", +"27a3fe41": "getMintLimit(address)", +"27a49cbe": "BankrollLending(address,address)", +"27a5428b": "setLevel(uint256)", +"27a5b3bc": "transitivePath(bytes32,bytes32,bytes32)", +"27a5c7c6": "voteDecline(uint256)", +"27a5e952": "testDecimalsUsingDeployedContract()", +"27a69644": "checkTransferDelegated(address,address,uint256,uint256,uint256,bytes)", +"27a6a7de": "newMinimalEthers(uint256)", +"27a75474": "salvageNotAllowedTokensSentToContract(address,address,uint256)", +"27a7b827": "updateExistingMember(address,uint256)", +"27a7c883": "transferWithExtra(address,uint256,bytes32,bytes32)", +"27a822df": "smart()", +"27a82833": "_supportsInterface(address,bytes4)", +"27a8890e": "withdrawedCoummunityCounter()", +"27a910dc": "ownerWithdrawETH()", +"27a936d7": "BlockchainBattleground()", +"27a93cce": "playerGetPendingTxByAddress(address,address)", +"27a9ec0f": "IDice()", +"27ab6871": "addCandidateByIndex(uint256,address,bytes32)", +"27ab9f20": "botIndexToOwner(uint256)", +"27ac36c4": "reserveTokens()", +"27ac4b70": "getNamespace()", +"27ac7934": "transferPAIReceiptOwnership(address)", +"27ac9e5f": "periodNow()", +"27acfff9": "badgeFreeze(address,uint256,uint256)", +"27add9fb": "VoxelRepainted(uint8,uint8,uint8,uint8)", +"27ae587c": "MAX_TOKEN_REWARDS()", +"27ae949f": "buyFST0(address)", +"27aeafb7": "AuditorUnregistered(address)", +"27aedd10": "Founders()", +"27aeeaa8": "AxiePresaleExtended()", +"27af1d98": "disToken(address)", +"27af7d9c": "assertEqDecimal(uint256,uint256,uint256)", +"27af9e38": "space()", +"27b00b3e": "setUpdateState(bool)", +"27b022af": "MembershipChanged(address,bool)", +"27b075a7": "FlCToken()", +"27b0c674": "updateEtherBalance()", +"27b37367": "parseLoanOffering(address[9],uint256[7],uint32[4],bytes)", +"27b380f3": "withdrawalRequests(address)", +"27b3a83c": "buyAtIndex(uint256)", +"27b3bf11": "claimTime()", +"27b44a6c": "pendingWeiAmount()", +"27b4634e": "transmuteTransfer(address,uint256,address,string,string)", +"27b4e228": "setPoolFeeRate(uint256)", +"27b55475": "review(string,bool)", +"27b57aee": "emissionContractAddress()", +"27b57fcc": "sumValues(uint256,uint256)", +"27b5985b": "addToException(address)", +"27b5aaf8": "RESERVE_TOKEN_AMOUNT()", +"27b5db8a": "addPlayer()", +"27b752b8": "sha3HexAddress(address)", +"27b7a2f5": "nameRegistryAddress()", +"27b7cf85": "log(bytes32)", +"27b7d0a6": "EditDomain(string,string)", +"27b96df7": "pausePayment()", +"27b972f9": "getNameOwner(string)", +"27b9c257": "setRequestProcessed(uint256)", +"27bb020a": "altarCut()", +"27bb1db7": "SOPToken(string,string,uint256)", +"27bb2d82": "_checkPixelIdExists(uint256)", +"27bb3d0f": "eth_price()", +"27bb46f0": "removeActiveArray(address)", +"27bb6d8e": "buyoutCost(uint256)", +"27bbea3a": "setWhiteListAddress(address)", +"27bc39c0": "submitCanonicalCandidate(bytes,bytes,bytes,bytes)", +"27bcc9ca": "finalizeConfig()", +"27bce91b": "betId()", +"27bd56d9": "sendAuctionQuery(uint256,uint256)", +"27be1b35": "promoCode()", +"27bf6568": "authorityBalance()", +"27bfeaf5": "setGemPrice(uint256)", +"27c16605": "getBidByProducerAndDay(address,uint32)", +"27c1f423": "preBuy1()", +"27c2e437": "buyTokensFromBalance(address,uint256)", +"27c36a47": "specialAllowance(address,address)", +"27c39749": "test_oneValidEqBytesUint(int256)", +"27c42050": "buildIdentifier(address,address,address,bytes32,uint128,uint128,uint256,uint32,uint64,uint64,string)", +"27c4a208": "GSCoin()", +"27c4bde8": "Planethereum(address,address)", +"27c5cdea": "test2(address[5],uint256[5])", +"27c5e534": "mixDNK(uint256,uint256,uint256)", +"27c67440": "getWarranty(string,string,address)", +"27c6c720": "privateWallet()", +"27c725e1": "applyforCetification(string,string,string,string,string,string,bool)", +"27c78c42": "request(address)", +"27c7ff61": "noShares()", +"27c81eb8": "TestDRMK()", +"27c830a9": "emergencyPaused()", +"27c8dae5": "getAmountOfLinkerBuy(uint256)", +"27c96207": "WinnerAnnounced(uint8)", +"27c97fa5": "deauthorize(address)", +"27cadd13": "getSides(uint256,uint256)", +"27cc1fd8": "party_b()", +"27cca148": "lastClaimedBlock()", +"27ccdbc5": "setWalletContract(address)", +"27ccdd0a": "changeServiceReceiptAddress(uint32,address)", +"27cd0d96": "getLockedAmount_simus(address)", +"27cd933a": "RequestEvent(address,address,uint32)", +"27cda9d5": "AcceptsEtheropoly(address)", +"27cdab06": "fee(bytes32)", +"27cdbf4a": "existingNames(bytes32)", +"27ce5b8c": "getNumberOfOutcomes()", +"27ce6fa9": "unlockup(address)", +"27cef820": "hasForgivedChar(string)", +"27cfe856": "DAY()", +"27d120fe": "updateTransfer(uint64,uint256,bytes32,bytes32,bytes)", +"27d1913c": "buyerCancel(uint16,address,address)", +"27d1c3a6": "transferChamp(address,address,uint256)", +"27d1f39e": "mastery()", +"27d21602": "buildings_total()", +"27d23b86": "receive(address,uint256,bytes)", +"27d26d6e": "testCannotRedeployANT()", +"27d272c5": "getFirstBuyersFee()", +"27d3a8ad": "LogUpdatedComplianceProof(bytes32,bytes32)", +"27d42fc0": "setReservedWallet(address)", +"27d511ae": "activateCommunityFund()", +"27d51979": "getTokenTransferSetCount()", +"27d6ba21": "getDistributedToken()", +"27d6c032": "unregister(bytes)", +"27d6d6e0": "ownership(address)", +"27d6dfbf": "BITNT()", +"27d741df": "SALE_END_DATE()", +"27d7874c": "setCEO(address)", +"27d795d7": "start_date()", +"27d8455c": "setMainSaleStartAndEndTime(uint256,uint256)", +"27d87924": "registerNameXaddr(string,address)", +"27d8a9e5": "CofounditICO(uint256,uint256,address)", +"27d8fb97": "removeLaureato(string)", +"27d93a70": "addFighter(address,address)", +"27d94182": "MAX_PRIVATE()", +"27d95c8c": "getContaOuvidoria(uint256)", +"27d9ac67": "NewMarketMaker(address,string)", +"27da0078": "SpindleToken()", +"27da5ca5": "batlordReq()", +"27dad426": "init(address,string,string,uint8,uint256,bool,bool)", +"27db9e82": "reevaluateETHPrice(uint256)", +"27dba183": "getProcessablesSize()", +"27dba807": "buyWithBonus(address)", +"27dc297e": "__callback(bytes32,string)", +"27dc7085": "getInvestorInforValue(address)", +"27dd16e5": "paymentAction(bytes32,uint256[],uint256[])", +"27dd3873": "plantedTime()", +"27dd941e": "unlockDates(uint256)", +"27ddbb16": "mnyLeftInCurrent()", +"27de1a4d": "mintToAddressesAndAmounts(address[],uint256[])", +"27de1fc9": "fixPlayerCountryString(uint256,string)", +"27de2459": "HungerCoin()", +"27de2765": "Assert(bool)", +"27de9e32": "unbond(uint256)", +"27defa1f": "onlyAmbassadors()", +"27df664b": "minPrivateContribution()", +"27dffba6": "startRegularPhase()", +"27e056a5": "addMinter(int256,address)", +"27e07647": "setFundingFueled(uint256)", +"27e0feaf": "_allocateTokens()", +"27e10295": "storedProfit(address)", +"27e152bb": "maxCoinSides()", +"27e1f7df": "deleteAdmin(address)", +"27e235e3": "balances(address)", +"27e2dd48": "getRandomSeed(string)", +"27e44059": "VReetUp()", +"27e56719": "ENIGMA()", +"27e584d4": "TOTAL_PARSEC_CREDIT_SUPPLY()", +"27e65007": "min_investment_presale_eth()", +"27e728ec": "enableCodeExport(address)", +"27e72e41": "defaultDelay()", +"27e7c023": "sendTokensToFounders()", +"27e7e21e": "air()", +"27e7fe5a": "ONEPERCENT_TOKENS_PER_ETH()", +"27e8c2d8": "burnUnicornShares()", +"27e90a7e": "offerBorrowingItem(uint256,uint256,uint256)", +"27e95f87": "pubkeys2()", +"27e9a0b6": "files(bytes32,uint256)", +"27e9b1a0": "getArrLength()", +"27e9f294": "addItem(string)", +"27ea06b8": "numberOfTokensLeft()", +"27ea6f2b": "setLimit(uint256)", +"27eac914": "cancelAuction(uint32)", +"27eb95cf": "deathData_v13()", +"27ebcf0e": "sharesTokenAddress()", +"27ebe40a": "createAuction(uint256,uint256,uint256,uint256,address)", +"27ec2c03": "getAvgPps()", +"27ed31ff": "localityCode()", +"27ed810d": "setMaxBlockDrift(uint256)", +"27edf097": "burnPerTransaction()", +"27eea9cd": "CCCCCToken(address)", +"27eeefa6": "paymentOnTime(uint256)", +"27ef89bc": "DEV_TEAM_PORTION()", +"27ef986d": "ExternalToken(address)", +"27efc086": "TOTAL()", +"27f02f74": "core(uint256,uint256,uint256)", +"27f05e06": "distributeTokensPreIco(uint256)", +"27f06a6e": "permitChildContract(address[])", +"27f06fff": "requestFillUp(uint256)", +"27f12c8e": "registerAsImportingAuthority(address)", +"27f1bb7f": "prefixedHash2(address)", +"27f1f521": "Kurecoin()", +"27f2402b": "acceptSacrifice(uint256)", +"27f2db32": "finalizeChangeStaker()", +"27f397a9": "borrowerReturnFiatAmount()", +"27f39abf": "tokenOwnerWallet()", +"27f3a72a": "thisBalance()", +"27f3fb69": "setMachine(bytes32,bytes32,uint256,uint256,uint256,uint256)", +"27f498c9": "changeTokenSender(address)", +"27f4b056": "getDemocInfo(bytes32)", +"27f50a2d": "getDocuments(address)", +"27f576d1": "withdrawFromReserve(address,uint256)", +"27f69c37": "roundInvestorInfoByIndex(uint32,uint32,uint32)", +"27f6e676": "addApprovedGame(address)", +"27f7be99": "boosterContract()", +"27f85c13": "setUsdEth(uint256)", +"27f8ce38": "gamePause()", +"27f8d7ba": "setEndPreICO(uint256)", +"27f93e59": "createContractMeme(uint256,string)", +"27fa35c3": "getMarketsCount()", +"27fb1da7": "ICOState(bool)", +"27fbcac5": "getChannelFeed(address,uint256,uint256)", +"27fc2414": "follow(address,uint8)", +"27fde806": "erc20GST(uint8)", +"27fe0d10": "maximumWEI()", +"27fe75ed": "lockTokenLocker()", +"27ff1374": "TotalDeposited()", +"27ffb7b0": "purchaseRound()", +"28006b31": "makeLiquidPri()", +"28012606": "createAuction(uint256,uint256,uint256,uint256,address,uint256)", +"2801617e": "set(address)", +"2801e43a": "authorizedLoggers(address)", +"28026ace": "depositAndApprove(address,uint256)", +"2802cacc": "cancelOrderByAdminWithPayer(string,address)", +"280376b3": "CinderTokenSale()", +"2803d8e5": "MIN_TOKEN_UNIT()", +"28043306": "migrateTransfer(address,uint256)", +"28044357": "CollectibleIndex1()", +"280464ed": "fundsToTokens(uint256)", +"28046f30": "handleBlockBalanceLedger(address,uint256,uint256)", +"2804b2c0": "customer()", +"2807eece": "purchaseNo()", +"2808241e": "vote(uint8,bool)", +"28086f18": "bidETHMin()", +"2808c8ad": "thisContractBalance()", +"28090abb": "logSweep(address,address,address,uint256)", +"2809c5e1": "isBountyAllocated()", +"2809c7e1": "AuctionCancelled(uint256)", +"2809df16": "MetaUpdated(string,string)", +"280a3382": "fundariaTokenBuyAddress()", +"280af7d3": "setData(string,string,string)", +"280b8846": "Token(string,string,uint8)", +"280c2604": "SCADA_requires_hard_cap()", +"280ca666": "getAllElements()", +"280cd0e6": "getBetSizeAtRound(uint256)", +"280da6fa": "withdrawAllTokens()", +"280dd460": "adjustFeePercentage(uint256)", +"280e0359": "bonusLevel0()", +"280e682c": "mintImpl(address,uint256)", +"280f958e": "transferLockedFrom(address,address,uint256,uint256,uint256[])", +"281027b9": "isPrimaryOperator(address)", +"28102e54": "amountWon()", +"2810dd4a": "ParcelXToken(address[],uint256)", +"2810e1d6": "resolve()", +"28111984": "setIcoState(uint8)", +"281134bc": "noahToken()", +"2811d4e0": "sendSecondBatch(address[],uint256[])", +"2812988f": "object()", +"2812f8b8": "FutureCall(address,uint256,uint16,address,bytes4,bytes,uint256,uint256,uint256)", +"281318c8": "all_unfreeze()", +"281336b4": "terminateEmployee(address,uint32,uint32,uint32,uint8)", +"2813acc9": "indexAccount()", +"2813de17": "toggleTransferablePending()", +"28148d07": "setCategoryVerify(uint256)", +"2814a371": "createOfAthleteCard(string)", +"2814da3c": "transferDeposit(uint256)", +"28155727": "makerWithdrawEther()", +"2815741c": "Sort()", +"28159ef6": "removeIcoContract()", +"2815cc38": "discoverNewPlanet(uint256,uint256,bool)", +"2815f054": "setTCoinContractAddress(address,address)", +"2815f50f": "addManyToBlacklist(address[])", +"28169ec1": "testProvidedValues()", +"2816bd78": "incentiveForHolder()", +"28171882": "customText()", +"28180023": "closingBlock()", +"2819598d": "removeManyFromAllocationList(address[])", +"28195d2c": "GDO(uint256,string,string)", +"281972af": "getExplorerList()", +"281989bf": "ComputeSquare(uint256)", +"28198eab": "RLCSentToBTC()", +"281a0ff7": "revokeDelegate(address,address,string,address)", +"281ae558": "ETH_TOKEN_EXCHANGE_RATIO()", +"281bdaf8": "weightedMultiplierByAddress(address)", +"281c08ad": "totalAuctorCount()", +"281ca73e": "write(uint256,uint64,bytes8)", +"281cee59": "_approveOwner(address,uint256)", +"281dfbb6": "sendPlatformSupplyToken(address)", +"281e1856": "deAuthorize(string)", +"281e399c": "Token(string,string,uint256)", +"281fa792": "givenBonus()", +"281fe829": "addFirstBuyers(address[],uint256[])", +"2820d6a5": "totalPresaleBonus()", +"2820f454": "setNewBeneficiary(address)", +"2821ca71": "nextPrice(uint256)", +"2822f62d": "fixedLoge(uint256)", +"282303b5": "_buy(uint256)", +"2823c24d": "howManyTokens(uint256)", +"2823e871": "canTransfer(bytes32,address,address,uint256,bytes,bytes)", +"2823fbe5": "walletLockBothForever(address)", +"28242dd4": "setLLV_edit_25(string)", +"282440ed": "allowWorking(uint32)", +"28249577": "getContractCode(address)", +"28250d43": "ETH_QCO()", +"28252bc4": "saleIsGoing()", +"28261850": "getProfits(bytes6)", +"28262dd1": "TOKEN_HODL_9M()", +"282651fe": "getWinTokenAmount()", +"28276ed6": "totalT8EXSold_GENERAL()", +"28278d0a": "makerich4(address,uint256)", +"2827d4ca": "TokenSale(uint256)", +"2828fc39": "getAllReporterMarketsCount()", +"2829104b": "ElectricUniverse()", +"28292af2": "chAirDropFadd(uint256)", +"282b065a": "setEmail(string)", +"282b5b19": "IsFreezedAccount(address)", +"282ba1b8": "GetPreSale()", +"282c3c47": "DEFAULT_MAX_LOCK_DURATION()", +"282c3cf7": "MAX_TOTAL_TOKEN_SUPPLY()", +"282c8749": "setParameters(uint256,uint256,uint256,uint256,uint256,uint256)", +"282d3fdf": "lock(address,uint256)", +"282d60bb": "eButton()", +"282de6b8": "priceCents()", +"282e0fe0": "updateIndexOrderToken(uint256,address,uint256,uint256,uint256)", +"282ef05c": "collectorsCount()", +"282f7cdd": "isDispositionDue()", +"28310f10": "percentageRecipient1()", +"2831ed5a": "YOUQIANBI(uint256,string,string)", +"2832b5cc": "setInstantFee(bool)", +"2832e44b": "addPrediction(bytes32,uint256,uint256,uint256,uint8,uint256,address,address)", +"28331152": "getActives(uint256,address,address)", +"28334e64": "subTokens(bytes32,uint256)", +"2833747f": "test_oneTrueFalse()", +"28339175": "getCreateSharesOwner()", +"28339320": "deleteRegion(address[16],uint256)", +"283506fb": "buySqr(uint256)", +"283557ac": "getContributorTokens(address)", +"2835b45c": "getETH(uint256)", +"283654c3": "storjBalance()", +"28368e0f": "OppToken()", +"28376f05": "testCreateAuthority()", +"2837919d": "impl_mining_uncle(address,bytes,bytes,uint256)", +"283890ef": "checkGetFreeQuest(address)", +"28392315": "sellerCancel(uint16,address,address)", +"2839e928": "ackermann(uint256,uint256)", +"2839fc29": "exchanges(uint256)", +"283a4576": "Tomeka()", +"283a6e88": "mgmtBodyWalletAddress()", +"283acbfc": "enableRefund(address)", +"283b19bf": "addReward(uint256,uint256,address)", +"283b31a6": "addWorks(bytes32,bytes32,uint8,uint256,uint256)", +"283b5f95": "getUndistributedBalanceOf_(address,uint256)", +"283ba681": "transferAirdropTokens(address[],uint256[])", +"283bcbed": "ChannelToppedUp(address,address,uint32,uint192)", +"283ced9d": "FOUNDATION_CAPPED_VALUE()", +"283ceee2": "cryptaurToken()", +"283dc942": "ReferralWeToken(address,uint256)", +"283f7820": "_totalFee()", +"2840f290": "addTier1Member(address)", +"28412d70": "KING()", +"284131c7": "buyApple()", +"284180fc": "getSecret(address)", +"284237e4": "bitm(uint256,string,uint8,string)", +"28428a42": "importBalances(uint256,address)", +"2843314e": "getAccountList()", +"28439961": "setTimePeriods(uint256,uint256,uint256,uint256)", +"2844328f": "submitVote(uint256)", +"28444381": "setPeriods(uint256,uint256,uint256,uint256,uint256,uint256)", +"28450159": "_updateSnapshot(address)", +"28459871": "OreOreCoin(uint256,string,string,uint8)", +"2845c8cd": "totalPreSaleStage()", +"28469c36": "littafiAccount()", +"2846a35b": "mainSaleEndTime()", +"28470b40": "_axiesPrice(uint8,uint256)", +"28472c6c": "claimComputation(bytes,bytes)", +"2847a7af": "newDocument(bytes32)", +"28491003": "getAllTurnover()", +"28491b3f": "SetPresaleAmountLimits(uint256,uint256)", +"284b1e8e": "generatedByte()", +"284cb916": "endMintingTime()", +"284cfedb": "m_proofs()", +"284d2fd4": "mintVested(uint256,address,uint256)", +"284d94e1": "lockAssetEscrow(bytes32,uint256,address)", +"284e1567": "addrFWD()", +"284e4175": "changeGBTAddress(address)", +"284e650a": "vanbexTeamVestingPeriod()", +"284f083a": "processJackpot(address,bytes32,uint256)", +"284fb363": "deploy(uint256,uint32,uint256)", +"284fd42f": "gasEpoch()", +"2850c72a": "debug_extendCoinbaseTxOutput(uint256,uint256)", +"2850d4e6": "KNOWToken()", +"285109d1": "getTotalInfo()", +"285137c9": "registerNameXaddrFromDapp(address,bytes32,bool)", +"2851f27b": "PrizePaid(string,uint256)", +"2852b71c": "accept()", +"2852bdf2": "whitelist(uint8[],address[])", +"2852ca81": "getTypeFromEdition(bytes16)", +"2853a0d7": "BRXToken()", +"2853f925": "unfreezeFoundingTeamBalance()", +"28543417": "removeOrderOfOwner(address,uint256)", +"2854ba7d": "getCreatedPayoutDistributionHash()", +"2854bc7e": "setTokenCap(uint256)", +"285669e9": "setRegionNextImageId(uint256,uint256)", +"28579137": "remove(uint80)", +"2857bc60": "triggerStealManually3(string,uint256)", +"28583dcc": "getRoundCounter()", +"2858507f": "IDD()", +"2858c764": "checkStatus(uint256)", +"285a4639": "Rotterdam()", +"285a9b32": "payoutfordividend(address,uint256)", +"285b5dde": "MoreTokensMinted(uint256,string)", +"285bf4c7": "CryptoCopyToken()", +"285c22b1": "addOrigin(bytes32)", +"285c51c3": "getRemainingEthersForCurrentRound()", +"285c7f37": "addUpgrade(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"285d70d4": "setMintable(bool)", +"285da5a9": "ceilTokens(uint256)", +"285dfc1c": "AmigoCoin()", +"285e1406": "changeFeeAddress(address)", +"285e8516": "advisor2Sum()", +"285f2346": "getNotApprovedProposals()", +"285f6a55": "ADDR_BOUNTY_TOKENS_ACCOUNT()", +"285fc97f": "TestChain()", +"285fe426": "bet(uint256[],uint256[])", +"286012b0": "getDealCancelRate()", +"286294b3": "buyByTomo(address,uint256)", +"286362f8": "AllowTransferExternal()", +"28636578": "setMultiRequestRequestor(uint256,address)", +"2863cd7e": "batchMintWithData(address[],uint256[],bytes)", +"2863f9f3": "emergencyStopSale()", +"286401df": "is_claim_period(uint256)", +"28640599": "fetchCreatedOrdersForMerchant()", +"2864ddde": "nextPriceOfElement(uint256)", +"28657aa5": "bankBalance()", +"2865dc2e": "getUserRewardPayouts(address)", +"2866bae1": "HarryCoin()", +"286707a1": "genToExtraStats(uint256,uint256)", +"28675325": "PURCHASER_MIN_TOKEN_CAP()", +"2867586e": "setInvContract(address)", +"286781c7": "suspend(address)", +"2867bc92": "refreshGames()", +"28680c1e": "bonusUnlockAt()", +"28687e61": "checkPriceCalled()", +"2868eda3": "admin_withdraw(uint256,uint256)", +"286a8993": "_clearBridgeNativeFee(uint256)", +"286b583b": "offerCanvasForSale(uint32,uint256)", +"286c1a9b": "confirmJoinAirdropQuest(address)", +"286c241a": "releaseTimeOf(address)", +"286d2e3a": "setContractAddr(address)", +"286dd3f5": "removeAddressFromWhitelist(address)", +"286dd83c": "unPauseCrowdsale()", +"286eab15": "getSnailmasterReq()", +"286ec4d1": "erc20_contract()", +"28707f3d": "addCharacter(uint32,uint16)", +"28713d0c": "SunContractToken(address)", +"2871587d": "MAX_PAYOUT_FRAC_BOT()", +"2871b1b9": "setRate1666()", +"2871f2c0": "getMySquirrel()", +"28720849": "verifyReport(uint16,int8[],uint32[])", +"2872a8e7": "kkk()", +"287301c1": "COMMUNITY_PERCENTAGE()", +"287418e7": "query(uint256,uint16)", +"28753dc2": "ApprovedFunds(address,bool)", +"28761ea5": "calcDividend()", +"28762e3a": "rdDoisToken()", +"28764b44": "rnBlock()", +"2877af10": "STARToken()", +"2877c748": "claimVotingProposal()", +"2878d3a7": "getClue3()", +"287977d6": "updateScore(uint8,bytes32,uint24)", +"287ad39f": "upgradePrice()", +"287ad3e5": "endPeTime()", +"287b020b": "founderMembers()", +"287b7cc1": "setStageLimit(uint256)", +"287b8862": "s35(bytes1)", +"287b895c": "MAX_OBR_CAP()", +"287bd206": "MAX_ALLOCATIONS_COUNT()", +"287cc96b": "getTotalEthBalance()", +"287dd8d2": "HIcToken(uint256,string,string)", +"287e85e9": "getTimeoutBlock(bytes32)", +"287e9fbc": "setGameIdCntr(uint256)", +"287eda92": "setIntervalSize(uint256)", +"287efb57": "setMixFormulaAddress(address)", +"287fcbfc": "PEPEso()", +"28802f19": "stare(uint256,uint256)", +"28805407": "refundToken(bytes32,address,address,uint256)", +"2880ebe7": "underdogPayoutMarkup()", +"28811f59": "F()", +"288169fd": "_changeAddress(address)", +"28828b1e": "claimMultipleAndWithdrawBalance(bytes32[],uint256[],bytes32[],address[],uint256[],bytes32[])", +"2882ab48": "BurnGas()", +"28831187": "setCompanyWallet(address)", +"288343e4": "Start(address,uint256,uint256,uint256,uint256,uint256)", +"288365a7": "foundation_vesting_contract()", +"2884c115": "_finishICO()", +"28852b61": "allOfferingPercentage()", +"2885b593": "extractMasterKeyIndexLength()", +"28861d22": "market(uint256)", +"2886b47a": "PERC_TOKENS_TO_RELEASE()", +"2886d76f": "setColorTeal()", +"288714be": "getPreviousWinner()", +"2887318f": "RATE_ETH_WXW()", +"2887cecd": "QYTestingToken()", +"288811cb": "grantAdvisorToken()", +"28889862": "setRandomPlayerAddress(address,address)", +"2888bb9c": "fixedAssets(bytes32)", +"2888c701": "setClearingPrice(bytes32,uint256)", +"2888f9d0": "updateMaxBet()", +"28896066": "transfer_owner(address)", +"2889e822": "team3Address()", +"288a6535": "_getPurity(uint16,uint16)", +"288aa69b": "VirusGame()", +"288b7ad8": "homeMaxPerTx()", +"288bcfb5": "getIntegerVaule()", +"288bd8fd": "mintReserveTokens(uint256)", +"288c4602": "WRTCCToken(address,uint256)", +"288c6ed2": "getSeedCost(uint256)", +"288cdc91": "filled(bytes32)", +"288dca30": "softCapFundingGoalInCents()", +"288dd331": "getTotalBidded()", +"288ddec7": "reversePercent(uint256,uint256)", +"288fa739": "isValidVote(uint256,address)", +"2890e0d7": "burnNFT(uint256)", +"289120cf": "goToNextState()", +"28916184": "createProduct(string,bool,uint256,address)", +"28918296": "verifyBBODocument(bytes32,bytes)", +"28919b47": "best_gamer()", +"2891da02": "tokensCounter()", +"28929072": "setMaxAssignedRequests(uint256)", +"28931484": "SmartLinkToken(uint256,string,string)", +"2893c5b0": "mint(address,uint64)", +"289471d5": "getOnTokenTransferFromValue()", +"2894ceda": "publisherRegistry()", +"28962b94": "DS1Token()", +"28968872": "minusFreezingTime(uint256)", +"289768b7": "_checkForJoin(uint256,address,uint256)", +"2897768d": "grantJoinAddr(uint256)", +"289799b7": "setUnitTime(uint256)", +"2898410b": "totalMintedToken()", +"289850b7": "FundTree()", +"28985c17": "returnsTwoUnnamed(uint256,uint256)", +"289912cc": "CLXTokenSale(address,address)", +"28997e32": "token(uint256,string,string)", +"2899a870": "claimAllInvestorTokensByOwner(address)", +"289aac50": "teamWithdrawSupply()", +"289ae4c7": "AddressWhitelist(address)", +"289b3aab": "Arith()", +"289b45fb": "subtractAction(bytes32,uint256[])", +"289b5b15": "setTypeName(uint32,string)", +"289cb681": "testSetPresale()", +"289cd94f": "setWhere(address)", +"289cf1e2": "PRESOLD_TOKENS()", +"289de615": "getTokenDetail()", +"289e0f82": "STAGE_1_START()", +"289ea30b": "requireNotZero(uint256)", +"289fd839": "presaleBonusTier3()", +"28a006af": "ethBalance(address,address)", +"28a07025": "liquidate()", +"28a1cab8": "setVicepresidenteDeMesa(bytes32,uint256,uint256,uint256,bytes32)", +"28a20a2f": "transferXPAAssetAndProfit(address[],uint256)", +"28a24f30": "set_base_token_as_seeded()", +"28a3dd2c": "_redeem(uint256)", +"28a42e9d": "getUpgradeInfo(uint256)", +"28a45038": "testTryProxyCall()", +"28a49874": "regPrice()", +"28a52d3e": "maxHistoryRecordID()", +"28a5be59": "getExchangeRateAtTime(uint256)", +"28a5c5e9": "address_to_tokens_prev_week0(address)", +"28a5e6f0": "regularOpen()", +"28a741db": "publicityFunds()", +"28a76045": "setAsMinter(address,bool)", +"28a767b0": "ClaimAirdropMultiple(address[],uint256)", +"28a7f25d": "transferJokerOwnership(address)", +"28a852db": "SOFTCAP_LIMIT()", +"28a8ee68": "minimumTakerProtocolFee()", +"28a92ef7": "requestRemoveAdmin(address,string)", +"28aa1a22": "IlumXXToken()", +"28aa48b4": "heroTypeToHeroSales(uint16)", +"28aa5257": "updateTransfer(bytes)", +"28aa69cf": "end_race()", +"28ab4f76": "changeSupply(uint256,bool)", +"28ab7375": "p_update_tokensRewardsAvailable(uint256)", +"28abda51": "resetUrls(bool,bool)", +"28acb002": "collectFees(uint128)", +"28acb520": "IdentityManager(uint256,uint256,uint256)", +"28ae8ea3": "redeem(uint256,bytes32,bytes)", +"28aea735": "getCreatedDate()", +"28af792c": "fundBTC(address,uint256)", +"28af94c8": "addData(bytes32)", +"28b070e0": "contractIndex()", +"28b0e795": "advance(bytes32,uint32,uint64,uint64,int64,uint64)", +"28b1b051": "external_call(address,uint256)", +"28b2105c": "endCrowdfund()", +"28b2362f": "custodianRegistry()", +"28b2e781": "minprice()", +"28b34ef6": "updateLandData(uint256,uint256,string)", +"28b3f3ae": "getBetAmount(uint8)", +"28b44b4b": "getBalanceOfContract(address)", +"28b4e62a": "numTokenPerEth()", +"28b53247": "_burnCarbonDollar(address,address,uint256)", +"28b59782": "Initiate(address,uint256)", +"28b5a8e6": "fechPreAllForCandidate()", +"28b5dde8": "setPI_edit_9(string)", +"28b5e965": "artDescription()", +"28b60031": "ownerTokens(address,uint256)", +"28b6c658": "maxAgonCount()", +"28b7bede": "getTokenContract()", +"28b7e183": "enableAffiliate()", +"28b8b108": "withdrawStoreBalance()", +"28b8e9cf": "buy_the_tokens()", +"28b94289": "isPreICOPrivateClosed()", +"28ba671f": "_getBonusTokens(uint256)", +"28baf31d": "EscrowVault(address,address)", +"28bb6f24": "webGiftTotalAmount()", +"28bc5dcc": "promotionIndexToHost(uint256)", +"28bc5ee4": "beginVote()", +"28bc8a04": "airdropSpent()", +"28bcd985": "PRIVATE_PHASE()", +"28bdbdca": "productionUnitIdRange()", +"28be67f9": "get_amount_get_sell(uint256)", +"28bf2448": "availableForWithdrawalAt(uint256)", +"28bf4079": "initStage(uint256,uint256)", +"28bf794d": "set_price(uint256)", +"28bfdeee": "distributeInsurance()", +"28c05d32": "shortSell(uint8,uint256,uint256)", +"28c0898b": "ZAR_Omnidollar()", +"28c0b0ef": "_partialPaid(address)", +"28c11fd6": "SetIPR(string,string,address,string,string,uint256,string,string,string)", +"28c23a45": "renounceOwner()", +"28c32be6": "refundPeriodStart()", +"28c3d685": "logPlaying(address)", +"28c4b676": "maxPaysPer()", +"28c4e24c": "retrieve(address,address,uint256)", +"28c4f410": "getShifterByToken(address)", +"28c5cf0a": "finalizeContract()", +"28c69eb2": "hasStake(address,address)", +"28c6cd05": "minBuyTokens()", +"28c6d8e3": "preBuyersDispensedTo()", +"28c743e6": "WelfareTokenFund()", +"28c78227": "openBoxPlayer(uint256,uint256)", +"28c8b217": "approveProject(address,uint256)", +"28c8ed98": "disableAutoDividends()", +"28c8f3ba": "airDropManager()", +"28c9ca90": "ethereumWei()", +"28c9f19a": "exchangeAndPay(uint256[10],address[5],uint256[4],bytes32[4])", +"28ca3062": "testCannotSetPresaleTokensAfterActivation()", +"28ca5a1c": "InvestmentEvent(address,uint256,uint256)", +"28cab0d6": "TokenBought(address,uint256,uint256)", +"28cbe9ac": "useKnowledge(address)", +"28cc413a": "getProof(uint256,uint256,uint256)", +"28cc4150": "tokenSaleRate()", +"28ccffe7": "etherFromAltar()", +"28ce213e": "setBalanceOf(uint256)", +"28ce5cdb": "withdrawMinerFee()", +"28ce8845": "addToTotalSupply(uint256)", +"28cf8b6f": "ERC223Token()", +"28cffcd8": "YFT()", +"28d005e9": "firstTTaxAmount()", +"28d08142": "getCurrentHighscoreUser()", +"28d0d223": "withdraw_amount()", +"28d18745": "getMiningAuthority()", +"28d2a961": "chkBSize(uint256,uint256)", +"28d3ad3f": "getPot(uint256)", +"28d3e3e1": "min_goal_amount()", +"28d42350": "endIco1()", +"28d445f6": "_afind(address)", +"28d4cc24": "window2TokenCreationCap()", +"28d5e117": "numberOfPossibleChoices()", +"28d6ce3d": "startSale(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"28d76403": "dataForSell(address,uint256)", +"28d84c9b": "delAltOracle(address)", +"28d879e4": "depositEtherBalance()", +"28d8f102": "ABOX()", +"28d905e5": "getAssetIdTripCompletedTime(uint256)", +"28d90b63": "ChangeFee(uint8)", +"28d936fe": "numImages()", +"28d969a5": "resetIndex()", +"28d969e2": "initialARXtokenSupply()", +"28d9dcd4": "createErc20Token(string,string,uint256)", +"28da6ba3": "PreSaleComplete(address)", +"28da740f": "firstTimeLine()", +"28da75fa": "addAddressToCaller(address)", +"28da850b": "buyAllOutcomes(uint256)", +"28db5470": "getPrivateName()", +"28db90a4": "BadgeCoin()", +"28dc38e6": "calculateWithdrow()", +"28dcce7c": "addWinner(address,address)", +"28dcfdac": "getSignsCount(uint256)", +"28de15b2": "MajorityList()", +"28de4426": "setLockupPeriodSeconds(uint256)", +"28de78d0": "WandtChaintest(uint256,string,uint8,string)", +"28dee1d2": "transferEtherOut(address,uint256)", +"28df192d": "releaseSbtToken()", +"28df3707": "HawkToken(uint256,uint256)", +"28df7755": "TravellingFreeToken(uint256,string,uint8,string)", +"28e07244": "getTurn()", +"28e08186": "ownerAllocateTokens(address,uint256,uint256)", +"28e0b502": "getDrawStatus(uint256)", +"28e0ba9a": "affsend(uint256,uint256,uint256,uint256,uint256)", +"28e158d0": "TokenVestingContract(address,address,uint256,uint256,uint256,uint256,bool)", +"28e1a604": "BurnFrom(address,uint256)", +"28e36ab8": "_getPrice(uint256,uint256)", +"28e3844c": "Member_AssignTokensToProject(int256,int256)", +"28e3c4f8": "checkLock(address,address)", +"28e454ee": "setDusting()", +"28e47076": "testFailCreateWithParentsParentSameItemId0()", +"28e53bb2": "approveKYCAndDeposit(string,address,uint256,uint256,string)", +"28e5617e": "weeklength()", +"28e5e5d3": "snowflakeCall(address,string,address,uint256,bytes,bytes)", +"28e665ef": "releaseTokenForTransfer()", +"28e68ebe": "getLastFundId()", +"28e69b16": "setBalances(address,uint256)", +"28e70c4e": "getPosition(uint256,uint256,address)", +"28e8776e": "getAyantDroitEconomique_Compte_9()", +"28e8bc61": "endTokensale()", +"28e8ed1b": "resetCrowdSaleaddress(address,address)", +"28e96cb0": "setDefaultAllowedLock(uint256)", +"28e98537": "logicProxiesStatic(address)", +"28e9bff8": "presaleAllocations()", +"28ea0fc3": "transferCollectorship(address)", +"28ea6aab": "addToBlackList(string,address)", +"28ea9203": "___setTarget(address)", +"28eaa326": "_noThrowCall(address,bytes)", +"28ec4173": "UnicornCrowdsale(address,address,address,address)", +"28ecb74e": "Grow()", +"28ed5c0d": "MCC()", +"28ef26cc": "JEXToken()", +"28ef42ce": "preICOSwapRate()", +"28ef6f40": "openCrowdsale()", +"28efa3a6": "processRebond(address,uint256)", +"28effe67": "gasForPBTT()", +"28f03554": "ProcessDividend()", +"28f0d47b": "ticketTransfersAmount()", +"28f22cc1": "getRemovedServicesForApplication(address)", +"28f28529": "fstUnitPriceNumerator()", +"28f2d4da": "identifiers(uint256)", +"28f3402b": "changeRuningState(bool)", +"28f371aa": "isApproved()", +"28f3ebd6": "BitPrize()", +"28f4c7de": "getMaximumReportingFeeDivisor()", +"28f4dbb6": "thresholdAmount()", +"28f5c7b3": "totalETHRaised()", +"28f66b77": "getAllHead()", +"28f68d39": "getVestingPeriodsCompleted(uint256,uint256)", +"28f6a48a": "getBidCount()", +"28f798a8": "toBinary(uint256)", +"28f7f13b": "Acandy(uint256,string,uint8,string)", +"28f833b7": "depositAddress()", +"28f90e4b": "Etheramid2()", +"28f9a563": "maxPreCrowdAllocationPerInvestor()", +"28fa17b6": "estateData(uint256)", +"28fb29d7": "_transferEvent(address,address,uint256)", +"28fbd958": "registerContract(bytes32,address,address,bytes20,bytes32)", +"28fbf28a": "revealPeriodActive(bytes32)", +"28fce8c8": "ZEUSCoin()", +"28fd287c": "_addmoney(address,uint256,uint256)", +"28fd72e2": "updateRndSeed()", +"28fdcdf7": "safeMemoryCleaner()", +"28fe549a": "STATE_BET_ENABLED()", +"28fe9a7f": "founder1Address()", +"28fecd48": "reinstate()", +"28ff498a": "presaleTokenLimit()", +"28ffe6c8": "join(address)", +"28fff8d6": "NokuConsumptionPlan(address,address)", +"2902320a": "totalTokensToSend()", +"2902b093": "addnewOwner(address)", +"2902df61": "remove_helper(uint256)", +"29033133": "clearValueBonuses()", +"290382dd": "DFCToken()", +"29055edd": "createNew(uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,address,address)", +"2905be9a": "IronHands(uint256,address)", +"29062d76": "startGame(address[],uint256)", +"29079291": "RVRCoin()", +"2907eb16": "finalizeContract(uint256)", +"290842a1": "setPI_edit_1(string)", +"2908fb5a": "Y1_release()", +"29090202": "Resolver(address)", +"29092d0e": "remove(address)", +"2909acef": "isSpawnProxy(uint32,int256,address)", +"2909cc5d": "left16(uint256)", +"2909f638": "setData(uint256,uint256,uint256)", +"290a9fa0": "setRangeGameAttr(uint256,uint256,uint256)", +"290b1e5f": "initTokenBank()", +"290b7dfd": "getTransactionLength(bytes32)", +"290c292d": "preMint(address,uint256)", +"290c398f": "getChipIds(bool)", +"290c8eb1": "doMint(int256,address,uint256)", +"290cb460": "MitkeyCoin()", +"290cba7f": "getLen(string)", +"290cf4fb": "payBonusToAddress(address)", +"290d2494": "startBuffer()", +"290d256e": "ExchangeLinkToken()", +"290e1c20": "AutoFare(uint16,uint16)", +"290ed1be": "RESERVED_MARKETING_GROUP()", +"290fe2df": "getEscrowAddress(uint256)", +"29107555": "soldByChannels()", +"29108d1b": "transferReserveToMain()", +"2910a32b": "setTokenBuyRate(uint256)", +"2910f159": "LogBidMade(address,uint256,uint256)", +"29113bc8": "hotWallet()", +"29114d65": "winnerPoolTotal()", +"291194b2": "NOT_AUDITED()", +"2911982e": "balanceOfPlayer(address)", +"2911c9e7": "dashId()", +"29143bdd": "onwerfee()", +"29147530": "setValidKYC(address)", +"29148c0c": "changeOwnerBook(uint256,address)", +"2914fb3e": "porcodr(uint256)", +"29153250": "withdrawalList(uint256[],address)", +"2915a915": "determineNumber()", +"2915fd3d": "subToZero(uint256,uint256)", +"29161820": "Base(uint256)", +"29163502": "addWhitelistedTransfer(address[])", +"291675f2": "add_another_owner(address)", +"291681b5": "signupUserWhitelist(address[])", +"2916f075": "check_invalidator(uint256)", +"2917f162": "getCooldownIndex(uint40)", +"2917f66b": "distributeAllTokens()", +"2918435f": "fun_sandbox(address)", +"29189c9e": "ATTToken()", +"291948ff": "date_ico_end()", +"29194964": "setUsdCap(uint256)", +"2919fccd": "Gaoguans(address)", +"291bc657": "Predecessor()", +"291bd15c": "confirm(string,int256)", +"291c0dbb": "setEtheremonAddress(address)", +"291cef95": "startSlammerTime(address,uint256[5],address,uint256[5])", +"291d1185": "updateCurrentBonusPeriod()", +"291d4f98": "transfered_total()", +"291d778c": "CancelSellOrder(bytes32,address,uint256,address)", +"291d9549": "removeWhitelisted(address)", +"291e6777": "sendVote(uint256,uint256)", +"291ea526": "constructionEnd()", +"291f028d": "calculateRoom(uint256,uint256,uint256,bytes32)", +"291f3665": "balanceOfFund(address)", +"291f37a4": "CHESSToken()", +"291f5a1f": "ORIGINAL_IPFS_HASH()", +"291fce73": "TmoneyTest2()", +"291fd18f": "issueCertificate(string,string,uint256)", +"292005a2": "TOKEN_SUPPLY_LIMIT()", +"29213a2f": "approveMember(address)", +"2921441e": "mysteriumPricing()", +"29216d20": "setLockTime()", +"2921be51": "ALLOC_SALE_GENERAL_1()", +"2921e6fc": "IfModuleRegist(string,string)", +"29223bdb": "changeServiceUpdateAddress(uint32,address)", +"2923f101": "Set_eth_gift(bytes32)", +"2924416f": "validateAndGetRedeemFee(address,address,uint256)", +"29245dd1": "startCall(uint256)", +"2924e254": "getInterestTimestamp(uint256)", +"2924f0dc": "_lockProjectToken()", +"2925827c": "preallocated()", +"2925ffc2": "modifyCommunityTaxes(uint256,uint256,uint256,uint256)", +"2926050f": "pubEnd()", +"29263630": "initialiseContract(address,uint256,uint256,uint256)", +"29274fe1": "buyBOTx(uint256,string,string,address,uint256)", +"2928859c": "runsOutOfGas()", +"29291054": "setContract(address,address,address)", +"2929abe6": "distribute(address[],uint256[])", +"2929dc09": "WithdrawAllReserves()", +"292a2879": "setFundAccount(address,address)", +"292a7409": "processBuyCard(uint256,address)", +"292a9873": "attackTileForNewUser(uint16,bytes32,bytes,bytes32,bytes32,address)", +"292b79b9": "HashReleased(bytes32,uint256)", +"292c1323": "vestAddress(address)", +"292c8aaa": "getPayOutAmount()", +"292ca2fe": "Jeopardy()", +"292cbbba": "DAYSECONDS()", +"292cdfa5": "getForthRoundReleaseTime()", +"292d64e0": "transferHotel(address,address)", +"292d98cd": "allSet()", +"292eb75d": "openAccount()", +"292f4a6e": "Token(address,address)", +"292fec04": "isClaimable(address)", +"2930cf24": "red()", +"2930fa49": "PLATFORM_FEE_RATE()", +"293100a9": "meleeElementBySubtypeIndex(uint256)", +"293100c1": "tournamentsReserve()", +"2931ebb3": "AdminshipTransferred(address,address)", +"29322e05": "sendTokens(uint256,address)", +"293230b8": "startTrading()", +"29325ebd": "zeroUInt()", +"2932ea90": "creatUserPurchase(string,string)", +"29337bda": "personalisationCost()", +"2933cc47": "getIdeaDate(uint256)", +"2933ee88": "get_account_id(address)", +"293528c9": "GOL()", +"2936981c": "setNumRewardsUsedForAddress(uint256,address)", +"2936c27a": "getFoundersTokens()", +"2936ce62": "crowdSaleOngoing()", +"2936d35c": "millLeconteRate()", +"29372ad0": "getWarrior(uint256)", +"29372d21": "testLog()", +"29377d61": "receiveFunds(uint8)", +"293849f4": "addLimitation(uint256)", +"293877d7": "bthFundDeposit()", +"29388f8d": "setArbitration(address)", +"29390370": "setPricer(address)", +"293a9169": "getSpawnCount(uint32)", +"293b1103": "Bitlike()", +"293b682f": "fSub(uint256,uint256)", +"293be456": "setReward(uint256)", +"293c2958": "getRoundState()", +"293c29de": "swapHotCold()", +"293c33b5": "authorizedFundsAvailable()", +"293c6a3a": "mint(bytes32,address)", +"293d5050": "getPlayerNum()", +"293d7663": "refundErrCombat(uint256)", +"293ee91f": "_fillOrder(uint64,uint64)", +"293f2ad7": "teamTokensIssueDate()", +"293f3fa9": "setBatman(address)", +"293f4825": "fire(uint64,address[])", +"293f5e6a": "get_first_user_recast(bytes32)", +"293f9a9c": "showDemurrageConfigs()", +"293f9f4f": "recordBounty(address,uint128,uint256)", +"293fc820": "setData(string,string,string,string,bytes32)", +"293ffca3": "AddressReg()", +"2940ff1e": "cancelBet(bytes32)", +"29415664": "buy_part_amount_show(bytes32,uint256)", +"294247aa": "BlackjackTipJar()", +"29432e0d": "setaddressname(string)", +"29434e33": "insertUser(address,bytes32,uint256)", +"29435cde": "TadamWhitelistPublicSale()", +"2943fd5e": "TokensIssuedCrowd(address,uint256,uint256)", +"29441674": "DOW_SUN()", +"2944363f": "updateAllDependencies()", +"2944e740": "changeProfitContainerAddress(address)", +"29457483": "register(uint256[2],uint256[4],uint256[2])", +"2945a57d": "findClaim(uint32,string,string)", +"2946ae5d": "changePauseTranfser(bool)", +"29477e03": "exCount(uint256)", +"294914a4": "j2Timeout()", +"294919a1": "rate(address,uint256,uint256,bytes)", +"2949b11d": "mutiSendETHWithDifferentValue(address[],uint256[])", +"294a6511": "checkRefundExistanceByOwner(address)", +"294afbf2": "sendBigPromoBonus()", +"294bbc09": "ggcd(address)", +"294cd2e8": "BACA()", +"294cdf0d": "tokenOfOwner(address)", +"294cedb8": "resolveOffer(uint256,bool,bool)", +"294cf912": "getBoosterPrice(uint256)", +"294e47e3": "FlipToken()", +"294f3d4d": "setUpLimit(uint256)", +"294f4025": "pendingWhitelistRemoval()", +"294fa425": "MIN_BUYIN_VALUE()", +"29501ad6": "changeManagerAddress(address,address)", +"29516a47": "PoWMLottery()", +"29516ba7": "purchasedTokensRaisedDuringPresale()", +"29516c41": "betMatch(uint8,uint8)", +"29519c9c": "LAFINAL7()", +"2952438e": "transfer(string,address,address,uint256)", +"295310bf": "setTransferRate(address[],int16)", +"2953a286": "setGenesisToken(address)", +"2953ee6f": "InvalidPullRequest(uint256)", +"2953f198": "addEntity(string)", +"29546713": "claimableHalvings()", +"2955d4ce": "setRealisation(uint256)", +"29560980": "getCapital(uint256)", +"2956262b": "ownersStakeAdded()", +"29569e80": "accountPubICOSale()", +"29575f6a": "superAdmin()", +"29576c82": "generalExp(uint256,uint8)", +"295777be": "releaseFundsNotification(uint256)", +"295780ea": "RequestInfo(uint64,uint8,address,uint256,address,bytes32,uint256,bytes32[])", +"2957ca33": "BONUSTWO_DATE()", +"2957d848": "batchWhitelistAddresses(address[])", +"2957da23": "ownerDestroy()", +"2957fef4": "redeemBalanceOf(address)", +"2958263a": "lastBucket()", +"29589f61": "tradeWithHint(address,uint256,address,address,uint256,uint256,address,bytes)", +"2959275d": "increaseCompanyCountByOne()", +"29594e4f": "hash(bytes32,address,uint256)", +"295961b1": "checkMinerQuest(address)", +"295a1cc2": "getNowTotal()", +"295a49ca": "Unclosed()", +"295a5212": "mode()", +"295a8b34": "update(uint256,uint256,bytes,bytes)", +"295b3299": "submitTopUpLimit(uint256)", +"295b4e17": "paid()", +"295c219c": "getMarketMakerAddress(address,address)", +"295c25d5": "addAmbassador(address)", +"295c39a5": "getNumMarkets()", +"295c6e4d": "setBytes32Slice(bytes,uint256,bytes32)", +"295d0eb5": "_buyAndCreateToken(uint256,bool,uint256)", +"295d2d69": "BotManageable(address)", +"295d4756": "PARSECS_TOTAL_AMOUNT()", +"295dad5e": "TriedToken()", +"295e0503": "transfreFrom(address,address,uint256)", +"295e1421": "getSaleOrderSeller(uint256)", +"295e3362": "getCutoffTime(uint256)", +"295f6ce7": "launchGame()", +"295fe611": "valueAtAddressLUT(uint256)", +"2960109d": "etherReceivedCrowd()", +"296032f2": "pauseContribution(bool)", +"29605e77": "transferOperator(address)", +"29610252": "payFee()", +"29613086": "payoutRewards()", +"2961320c": "retrieveToken(address,address)", +"29638223": "greet(bytes)", +"29638eee": "GetTheWho()", +"2964a643": "checkPartner(address)", +"2964e4e6": "totalAccounted()", +"2965486a": "safeTokenWithdrawalFromCrowdsale(address,address,uint256)", +"2965558f": "getSignerIndex()", +"2965fa54": "ethers_collected()", +"2966d1b9": "unset(address)", +"2966e97b": "kscApprove(address,uint256,string)", +"29678a53": "playerInDraw()", +"29684907": "numerai()", +"29689a8c": "ergo()", +"2968d629": "YLCToken(uint256,string,uint8,string)", +"2968e640": "playerTakeOff(uint256)", +"29699a88": "viewSentBonuses()", +"2969b226": "batchTransferETHS(address[],uint256[])", +"2969d202": "weiBalance()", +"296b11b2": "getWeightedRandomArbiter(uint128)", +"296b76bb": "drawPhone()", +"296ba4ca": "LogValue(bytes32)", +"296ca48a": "weiLimitPerAddress()", +"296cab55": "setPresaleStartTime(uint256)", +"296cc401": "roundPrice()", +"296d84d5": "teamAdvisorsReserveTokensAddress()", +"296d9009": "calculate_should_return_bix(address[],address,uint256[])", +"296dbf31": "sendGameGift2(address,uint256)", +"296e3661": "removeClaim(uint32,string,string)", +"296ed88f": "testFailControllerInsufficientFundsTransferFrom()", +"296f1ce1": "getHasStartedState()", +"296f4000": "delegateApprove(address,uint256,address)", +"29700653": "fundTransfer()", +"297072a1": "cNiceGuyIdx()", +"2970c9c6": "TEAM_TOKENS_RESERVED()", +"29710388": "isProxy(address)", +"29712ebf": "accountBalancePublish(string,string,uint256,string,string,uint256)", +"29713781": "HumanToken(address,address)", +"29713f86": "cheapredeemvillage()", +"29723ade": "setMediumPrice(uint256)", +"29724d54": "offerOn(uint256)", +"2972b0f0": "isAuthorized(address,uint256)", +"29730ea4": "buyIdeas()", +"29735a89": "getSubmissionsForCommit(bytes32)", +"297398b5": "hourlyProduction()", +"2973e372": "isAlphaUpper(bytes1)", +"29745306": "tgrSetLive()", +"2974a822": "CustodianRegistry(address)", +"29750e85": "depositEndTime(address)", +"2975659d": "determineStatus()", +"2975c690": "SetLimited(address,bool)", +"29760657": "setStarDistance(uint8,uint16)", +"2977b1b1": "testAllowanceStartsAtZero()", +"29780a4e": "eventTransfer(address,address,uint256)", +"29781ec8": "addExemptedAccount(address)", +"29784d90": "shortenTde(uint256)", +"297882d5": "createDistrictOmni(uint8,uint8,uint8,uint8)", +"2978b826": "assignRevenue(uint256)", +"297a1677": "getAllHpbNodesCache()", +"297a1f56": "carCount()", +"297a9dc4": "WalletFunded(address,uint256)", +"297b5dce": "private_setminRoll(uint256)", +"297c4143": "PUBLIC_START_TIME()", +"297c9cd9": "regStopTime()", +"297cb974": "FlightDelayAccessController(address)", +"297d1a34": "returnOwnership()", +"297d7964": "investors_locked(address)", +"297f119d": "transferToAdmin()", +"297f407b": "addWinner(address)", +"297f9af0": "membersCount()", +"29803b21": "join(string,string)", +"2980a7b6": "specialManagerOn(address)", +"2981155e": "weiPerDTH()", +"29816998": "right63(uint256)", +"2981cceb": "_mintFromDeposit(address,uint256)", +"29822734": "Win()", +"2982add7": "notContains(address)", +"29832c0f": "hasSigned(bytes32,address)", +"2983d752": "advisory()", +"29842d15": "TokenClaimed(address,address,uint256,uint256)", +"29846afe": "freezeAccount(address,uint256)", +"2984a077": "setFemaleBonus(address[])", +"2984bc4d": "getAreaInfo(address,uint256)", +"2984f486": "setBU(bytes32,uint256)", +"2984f999": "totalLockTokenAllocation()", +"298503d9": "createCategory(string,string,uint256)", +"298569f0": "SetApplicant(string,uint32,string,int256,string)", +"2985aacf": "getSponsorsN(uint256)", +"29864547": "feeIndex()", +"2986c0e5": "index()", +"2987ace5": "getCapsuleInfo(uint256)", +"2987c8f7": "checkProduct(bytes32)", +"2988e36b": "migrateBalance(address)", +"29893dcf": "checkKhFundDepositAddress()", +"298994c6": "getCET6InfoById(uint32)", +"2989ac22": "rollDie(address)", +"298a49da": "_0xDogecoin()", +"298aa634": "nextContributorToReturn()", +"298ac61c": "AgencyWallet(string)", +"298ad569": "CFOAddress()", +"298c0733": "send(address[])", +"298c154e": "addListing(string,string,uint256)", +"298c1e14": "COIN_PER_ETHER_SUPPORT()", +"298c3dc4": "addStrip(uint256,uint16,uint8,uint8,string,string,string,string,string,string)", +"298c3fc1": "changeFrozenBalance(address,uint256)", +"298c61e3": "TOTAL_TULIP_SUPPLY()", +"298d075f": "tokenPoolAddress()", +"298d3567": "depositBBO()", +"298d5f33": "getPI_edit_1()", +"298e4f79": "depositTokens(address,uint256,address)", +"298e685a": "getFrozen(address)", +"298fb0d2": "setEvenDistThresh(uint256)", +"298fbf1c": "ClaimBTC(string)", +"298febed": "towncrierCallback(uint64,uint64,bytes32)", +"2990194a": "setICOStage(uint256)", +"29913150": "createTicket(address,uint256)", +"29917954": "exitPool()", +"2991835f": "extract(address,address,uint256)", +"2991964c": "GameLoose(address,uint256,uint8,uint8,uint8,uint256,uint256)", +"29928852": "NoteChanged(string)", +"2993ed2d": "cancelSellOrder(address,uint256)", +"299453ca": "cb0f5ef7()", +"299550d9": "LogBetStart(uint256)", +"299599cc": "preICO(address,address,uint256,uint256)", +"29965a1d": "setInterfaceImplementer(address,bytes32,address)", +"2996f972": "tokenBurner()", +"29976934": "ModifyPublicKeySize(uint8)", +"2997ec89": "getStudentIDText(uint32)", +"29981db4": "setAdvocate(address,address)", +"2998dff2": "SuperUltraPowerCoin()", +"29991a5b": "checkMilestones(address[],uint256[])", +"29995f4c": "MoonStone()", +"2999c76b": "initNameSymbol(string,string)", +"299a017c": "getCurrentMilestone()", +"299a7bcc": "setOwner(address,address)", +"299af64b": "setContract(address,bytes32,bool)", +"299b861e": "changeUnitsPerEth(uint256)", +"299c55f7": "TOKEN_BOUNTY()", +"299cc524": "updateEarlyIncome(address,uint256)", +"299cdc9d": "changeEtherCost(uint256)", +"299df3f1": "WithdrawDividendsAndCoupons()", +"299e6b07": "Wallet(address)", +"299e7318": "resolveVoting()", +"299e7abb": "calculateWinners(uint32)", +"299e952f": "buyKeys(address)", +"299ed37a": "emergencyCall()", +"299ee814": "OraclizeBet()", +"299f5f1a": "cumAlienDeposits()", +"299f7200": "burnOwnership(address)", +"299ffcbc": "latestReleaseTime()", +"29a0097c": "internalSend(address,uint256)", +"29a00e7c": "calculatePurchaseReturn(uint256,uint256,uint32,uint256)", +"29a03d8d": "distributionReward(uint256,string,bytes32)", +"29a065bd": "getLOg(uint256)", +"29a19987": "teamVesting4Years()", +"29a2629c": "showRoundNum()", +"29a2aa2d": "thankYou(address)", +"29a2c27b": "finishLastCount()", +"29a2d339": "chknodenumber(uint256)", +"29a36e0a": "addScheduleCall(address,uint256,uint256,uint256,uint256)", +"29a3fab9": "finilize()", +"29a40403": "submitCounterStack(bytes32,uint256,uint256,uint256,uint256,uint256)", +"29a52db6": "getCurrentUserLocalTokenBalance()", +"29a5c0f4": "WithdrawAllETH()", +"29a5dd7c": "refund_bix(address,uint256)", +"29a6344a": "removeSupporter(address)", +"29a64dd1": "startCrowdsalePhase2Date()", +"29a67202": "UHUGIN()", +"29a6f31b": "oraclize_query(uint256,string,string[2],uint256)", +"29a742aa": "HappyLifeCoin()", +"29a7d5c1": "joinAirdrop()", +"29a81222": "getOwnerName(uint8)", +"29a833ee": "getSumData(bytes32)", +"29a86dde": "getGameWin(uint256)", +"29a8cda5": "PolarisToken(address)", +"29a8fcd2": "Proxy(address,address,uint256,uint256,uint256)", +"29a9c91d": "setCurrentPeriod(uint256)", +"29aa1408": "getTotalFlips()", +"29aa7ec5": "removeSignature(string)", +"29aa9cbe": "min(int256,int256)", +"29aab068": "Pen(address)", +"29aacd10": "InitalPos()", +"29ab0ca7": "ownerSetResolverPercentage(uint256)", +"29abdeed": "addCoinBalance(address,uint256)", +"29ad27d7": "maxDays()", +"29ad4a34": "_transferMoneyMother(uint32,uint256)", +"29ae4c70": "isSenderEmergencyMultisig()", +"29aebf05": "initialMoySupply()", +"29aec173": "levelUp(uint256,uint16,uint16,uint16,uint16,uint16,uint16)", +"29b03cfd": "getBid(bytes32,uint256)", +"29b0de1e": "unsetManager(address)", +"29b0ffea": "numberOfPreviousEntries()", +"29b1ce4d": "addWhitelistedUserAddr(address)", +"29b1e640": "claimReporterReward(address)", +"29b20bb6": "numCharactersXType(uint8)", +"29b26bc1": "clearTradePreSignedHashing(address,address,bytes32,address,uint256,int256,string)", +"29b43a68": "createDepositAddressFor(address)", +"29b49825": "ADVISOR_POOL_INIT()", +"29b4d111": "price_start()", +"29b65a2e": "POCY()", +"29b6cdd5": "Alphacoin()", +"29b737ae": "LerToken()", +"29b84c9c": "transferExchange(uint256)", +"29b8caff": "totalInvestors()", +"29b8dab4": "currentBidNumber()", +"29b981bb": "operationAdress()", +"29b9f367": "addressDataProviders()", +"29ba1cb4": "setPrivelegedWallet(address,address)", +"29ba2e07": "TokenPoolExhausting(uint256)", +"29ba725a": "setTransformTarget_miner(address,uint256)", +"29ba7bb2": "initialOwner()", +"29ba8780": "executeTransaction(uint256,address)", +"29ba8d03": "getMigrateMarketInFromSiblingCalled()", +"29bb4bf2": "showCollectorsBalances()", +"29bc3b85": "isAccepted(uint256)", +"29bc5d0f": "finalyzeContract()", +"29bcb186": "transferToContributor(address,uint256)", +"29bd028a": "startIcoPreICO2ndRound()", +"29bd58b4": "revokeToken(address,uint256)", +"29bed3bf": "EthereumRoulette()", +"29bee342": "Get_Last_Value()", +"29bf56c3": "setUnitAttackIncreases(address,address,uint256,uint256,bool)", +"29bf960a": "getResultTable(uint256,uint256)", +"29c08ba2": "payPremium()", +"29c10e37": "filter(string)", +"29c19304": "setInitialVaribles(uint256,uint256,address,address,address)", +"29c1c61e": "modifyPowPrice(uint256,uint256)", +"29c1ee0d": "TOKENS_address()", +"29c2e15d": "_calculateInterest(uint256)", +"29c3340f": "dividends_share()", +"29c36bb5": "feedAddress()", +"29c40d5f": "CheckSoilHumdtyException(bytes32,uint32)", +"29c50df4": "getEIN(address,address)", +"29c510b6": "reveal(bytes32,bytes32,address)", +"29c660a4": "ComputeAcornBuy(uint256)", +"29c6647b": "addCET6(uint32,string,uint32,uint32,uint32,uint32)", +"29c71c1b": "modifyFeeShare(uint256)", +"29c78e0b": "Ethash()", +"29c886bf": "TokenCampaign(address,address,address,address,address,address,address,address,address,address,address)", +"29c8d3ce": "activateTokens(uint256)", +"29c8dae7": "create21PizzasTokens()", +"29c90b63": "onTapPollFinish(bool,uint256)", +"29c924cf": "setFundingGoal(uint256,bool)", +"29ca9dca": "updateRelay(address)", +"29caf0c9": "getStringValueByKey(string,string)", +"29cb924d": "getCurrentTime()", +"29cbdc86": "buyin(address,uint256)", +"29cca3ae": "getYouTubemasterReq()", +"29ccb4df": "getCompte_11()", +"29cd00f7": "approve(address,string)", +"29cd5777": "_tryEraseSingleNode(bytes32)", +"29cd62ea": "setPubkey(bytes32,bytes32,bytes32)", +"29cd7767": "_NT()", +"29cd92cf": "deleteHelper(bytes32)", +"29cdda23": "newVersion()", +"29ce0939": "Timeout(uint256,uint256)", +"29ce1ec5": "addFactory(address)", +"29ce3b69": "increaseApprovalAllArgs(address,uint256,address)", +"29ce7fc1": "getAllRightHand()", +"29cee59e": "finishCrowd()", +"29cf90f3": "sellUnicorn(uint256,uint256,uint256)", +"29d00d64": "ReloadKeys(uint256,uint256)", +"29d017b5": "TestWithConstructor(address,uint256[])", +"29d07c23": "registerForVoting()", +"29d0807b": "addone(uint256,uint256)", +"29d10b6e": "addSupervisor(address)", +"29d11b32": "btycbalanceOf(address)", +"29d24cbe": "TOKEN_SUPPLY_SEED_LIMIT()", +"29d287ec": "isFinishDateReached()", +"29d28aad": "Broker(address)", +"29d368e3": "curMax()", +"29d428ca": "requiredTokenAmount()", +"29d50682": "setupPlotOwnership(uint256,int256[],int256[])", +"29d56381": "balance_factor(uint256)", +"29d592bf": "arconaToken()", +"29d6ec95": "cancelBuy(uint256,uint256,uint256,uint256)", +"29d6f899": "BetOnBlue()", +"29d729ac": "ticket_addresses(uint256)", +"29d77446": "WhitelistSet(address)", +"29d87fbf": "setSeasonal()", +"29d91164": "delWhiteList(address,address)", +"29d98a7b": "change_individual_cap(uint256)", +"29da2fda": "UpdateToken()", +"29da3b4d": "removeBorrowingItem(uint256)", +"29da5738": "actionCount()", +"29daaa5e": "numFactories()", +"29dacb60": "getEthRaised()", +"29daf3ce": "create(bytes32,address,address,uint256)", +"29db191f": "approveForAll(uint256)", +"29db1a4f": "burnForInsurance(uint256)", +"29db3256": "getRandomBox(string)", +"29db8ec4": "getAccountSpendingRemaining(address)", +"29dbdd77": "updateDetails(bytes32)", +"29dcb0cf": "deadline()", +"29dd07eb": "KarlisToken()", +"29dd0b86": "lastSaleDate()", +"29dd0d7d": "requestBlokTokenOwnershipTransfer(address)", +"29dd8b26": "EGTToken()", +"29de3653": "register(uint256,uint256,bytes,bytes)", +"29de91db": "setMsg(address,uint256)", +"29df8972": "Nilometer()", +"29dfdded": "addNewDonkey(address)", +"29e10c13": "getAd(uint256,uint256)", +"29e1ddb8": "freeLottoInfo()", +"29e206bd": "forceDivestAll(bool)", +"29e21cbd": "UIWish(address)", +"29e286c6": "boughtWithoutWhitelist()", +"29e2b478": "addAddressToWhitelist(address,address,uint256)", +"29e30910": "testThrowCreateExistingNonce()", +"29e341f1": "adminAddRole(uint256,address,uint256)", +"29e3ae3d": "virtualTradesSummedCount(bytes32)", +"29e46d3f": "openingTimePeriodOne()", +"29e5dab7": "BytomGoldToken()", +"29e614ee": "addDrop()", +"29e63cd7": "addImmutableContract(string,address)", +"29e67fce": "Rate2()", +"29e6b5be": "VPTToken()", +"29e6f3f8": "setPI_edit_6(string)", +"29e80a80": "_iWantXKeys(uint256)", +"29e81c79": "isJobCancel(address,bytes)", +"29e846df": "dividends(address,uint8)", +"29e8bc0a": "getShareToken(uint8)", +"29e94503": "VersionedBlob()", +"29e94ef6": "getProjectedJackpot()", +"29e99f07": "test(uint256)", +"29e9a3b9": "tokensReceived(address,address,uint256)", +"29e9afc9": "EnterCode(uint32)", +"29ea110c": "maxCapInCents()", +"29eae053": "setService(address,address)", +"29eae264": "EosChain()", +"29eae797": "oldController()", +"29ec09cc": "GetConfirmRound(address,uint8)", +"29ecd1e0": "PriceChanged(string,uint256)", +"29ed0f06": "BitcoinLegendToken()", +"29ed1297": "setItem(address,address,string,string,string,bool)", +"29ed82a1": "getDeflator()", +"29ed9a6a": "depositERC721(address,uint256,address)", +"29edd574": "buyCopper(uint256,uint256,uint8,bytes32,bytes32)", +"29edfbb8": "GetApplicant(address)", +"29ee0480": "FlatPricingExt(uint256)", +"29ee1580": "setMyPrice(uint256,uint256)", +"29ef1919": "discountPercent()", +"29ef5552": "setupZoomLvl(uint8,int256,int256,uint256)", +"29ef56b1": "getAskOrderBookStats()", +"29f0a422": "MakeTransfer(address,uint256)", +"29f11c8d": "edit(uint256,string,string)", +"29f1bff4": "withdrawFromChildDAO(uint256)", +"29f20618": "createLineItem(string,uint256,uint256,uint256,uint256[])", +"29f27577": "InvestorList(uint256)", +"29f321e4": "buy_Vault(uint256,bytes8)", +"29f3533c": "setPriceStalePeriod(uint256)", +"29f4071b": "RegistrationStatusChanged(address,bool,uint256)", +"29f46429": "WIE()", +"29f5fb9c": "icoTokenSales()", +"29f62f70": "logSendEvent()", +"29f69427": "o2Address()", +"29f6d9c3": "clearTokenApproval(address,uint256,bool)", +"29f75dc2": "samePooling()", +"29f799cb": "Studio()", +"29f7bd2f": "transferToContributionPool(uint256)", +"29f958dc": "publish(uint16,uint16,bytes4,string,bytes3)", +"29fa7266": "setSuperOwner(address)", +"29fb598e": "bountyTransfer(address,uint256)", +"29fc550f": "getChallengesForUser(address)", +"29fc7bd8": "PERCENT_DIVIDER()", +"29fcfe2b": "VestingScheduleConfirmed(address,address,uint256,uint256,uint256,uint256,uint256)", +"29fcfeb0": "AUCTION_STARTED()", +"29fd06cf": "Qripplex()", +"29fd50eb": "libAddress()", +"29fd8201": "setReputationAddress(address)", +"29fe6199": "dailyPercent()", +"29fec030": "MAX_DAILY_TOKEN_SOLO_SPEND()", +"29ff42e1": "revealHiddenPosition(uint32,int64[],bytes32,uint64,bytes16,bytes32,bytes32)", +"29ff4f53": "setReleaseAgent(address)", +"29ff7d04": "revertReservation(address,address)", +"2a004bd0": "deleteChannel(address,address,address,address,address)", +"2a00d284": "rewardReferrer(address,address,uint256,uint256)", +"2a00ff6f": "endianConvert256bit(uint256)", +"2a013925": "setFundingCap(uint256)", +"2a0213f6": "FeeOnAllocation(uint256,uint256)", +"2a022f22": "ALLOC_SALE_GENERAL_2()", +"2a035b6c": "endGame(address)", +"2a03b48b": "Campaign(uint256,uint256,uint256,address,address)", +"2a03ffa5": "CryptoGOToken()", +"2a0401f0": "confirmOrder(bytes32,bytes32)", +"2a040c16": "TemboCoin()", +"2a04e88a": "ethRateInUsdCents()", +"2a0763ce": "endGameConflict(uint8,uint256,uint256,int256,uint256,bytes32,bytes32)", +"2a095c14": "getCompte_3()", +"2a095fbe": "unlinkEID(bytes,bytes,address)", +"2a096397": "myDeposit()", +"2a0a3b53": "NewText(string,string)", +"2a0a5f50": "BidCanceled(uint256,uint256)", +"2a0acc6a": "ADMIN()", +"2a0b2617": "getAccountDetails(uint256)", +"2a0b9cb5": "check_authorization(address,address)", +"2a0bb7ea": "mulIsSafe(uint256,uint256)", +"2a0bba0e": "ImperoCoin()", +"2a0c5221": "battle(uint256,uint256)", +"2a0d06ec": "getTotalPctx10()", +"2a0d479f": "TutorialToken()", +"2a0d79ef": "totalSupply(bytes)", +"2a0deab4": "getDataAndOwner3(uint256,uint256,uint256,uint256)", +"2a0f189a": "setCallPtr(uint256)", +"2a0f3c35": "rentableSetup(uint256,uint256,uint256)", +"2a104d8d": "withdrawLoan(uint256)", +"2a10abc3": "CrypteloERC20Address()", +"2a10ff23": "product2()", +"2a11b950": "contractEvents(uint256)", +"2a11ced0": "holders(uint256)", +"2a12b54d": "_transferToLock(address,uint256,uint256)", +"2a139f75": "PLATprice()", +"2a14314f": "satoeLocked()", +"2a143af4": "_calculatePercent(uint256)", +"2a14b80a": "partition()", +"2a151090": "canPerform(address,address,bytes32,uint256[])", +"2a16a9ee": "emitCategorySet(uint256,uint256,bytes32)", +"2a16cca4": "isApproved(address,uint256)", +"2a1727f8": "checkExistAddress(address)", +"2a174710": "getAttackForCost(uint32)", +"2a179054": "setTokenFeeTake(address,uint256)", +"2a17e397": "multiTransferTightlyPacked(bytes32[])", +"2a1828fb": "attController()", +"2a18ca16": "currentSaleLimit()", +"2a19642c": "setSpawnProxy(uint32,address)", +"2a1a3303": "getNumberOfFlips(address)", +"2a1a8d4a": "updateIcoStatus()", +"2a1ab57e": "register(address[],uint256[])", +"2a1bbc34": "generate()", +"2a1be747": "rateFirstWeekEnd()", +"2a1c70e7": "Indemnisation_1()", +"2a1cdf7a": "enableReturnContribution()", +"2a1e37de": "armyCountBattlesLost(uint256)", +"2a1eafd9": "targetSupply()", +"2a1eb7cc": "MintToOwner(uint256)", +"2a1ef0ca": "teamAllocation(address)", +"2a1f63f8": "MiningRewardSent(address,address,uint256)", +"2a1fc45d": "decreaseArrayOfBeneficiariesBalances(address[],uint256[])", +"2a21566f": "grantPositionOwnership(bytes32,address,address)", +"2a21a3af": "isNormalUser(address)", +"2a22196d": "getVoucherDetails(uint256,uint256)", +"2a2235f2": "winAmount0()", +"2a226857": "AlbaritTokenV4(address,string,string,uint256,uint256)", +"2a228fc2": "processWithdrawals()", +"2a23475f": "blockCrowdsale(address)", +"2a23ac02": "eBitcoincash()", +"2a24b8e1": "instruct_4()", +"2a24f46c": "auctionEnd()", +"2a2514a2": "AceFundToken()", +"2a258842": "ETHOS()", +"2a2604dd": "bidRefund(uint256,uint256)", +"2a272974": "tokensIssuedForBonusRangeTwo()", +"2a27fd4a": "forGenesis()", +"2a286a19": "rewardSplitPercent()", +"2a286eda": "productAccounts(uint256)", +"2a2879d3": "createPromoCar(address,string,uint256)", +"2a28822e": "create(address,int256,address)", +"2a288272": "setUpgradesOwned(address,uint256)", +"2a28c610": "uint256_to_bytes(uint256)", +"2a292cce": "openCrowdSale(uint256)", +"2a29312a": "recoverAddressFromSignedMessage(bytes,bytes)", +"2a295c1f": "ChainMonstersCore()", +"2a29700f": "setForceExecuteOfContracts(bool)", +"2a2998a0": "houseFeeVal()", +"2a29c8d9": "getLoansLengthByClient()", +"2a29d109": "rewardController(address)", +"2a2a62f6": "removePrivelegedWallet(address)", +"2a2a6434": "register(bytes32,bytes32,address,bytes32,bytes32,string)", +"2a2acdce": "getMyFrontEndTokens()", +"2a2ad4df": "ExpiringMembership()", +"2a2b48f5": "largestRetro()", +"2a2bb728": "ElephantsPaymentCoin()", +"2a2d78b0": "DeDeContract(address,uint256)", +"2a2dd486": "_computeAura(uint256,uint256)", +"2a2e00be": "MintingClosed(bool)", +"2a2e1320": "isEven(uint256)", +"2a2e2f0c": "convertInternal(address,address,uint256,uint256)", +"2a2e6358": "setMinRecharge(uint256)", +"2a2e6ee6": "countCrowdsalesForUser(address)", +"2a2eddde": "setVesting(address,uint256,uint256,uint256,uint256)", +"2a2f366c": "getPlayer(uint8[176],uint8,uint8)", +"2a2f7bda": "daysRemaining()", +"2a2fbd4b": "min_required_amount()", +"2a2fe110": "isCosignerSet()", +"2a304900": "getHunting(uint256,uint256)", +"2a305613": "transfer(uint152,uint152,uint256)", +"2a308b3a": "transfer(address,address,uint64)", +"2a30b0b8": "addARA(address)", +"2a316353": "JMTOKEN(uint256,string,string)", +"2a31c5b8": "_addBonusOfTop(address,uint256)", +"2a332b2a": "setLotteryAddress(address)", +"2a335c17": "getTotalSalaryBunny(uint32)", +"2a337d30": "submitMatch(bytes32,bytes32)", +"2a3386e5": "covmanagerAddress()", +"2a33fec6": "proceed()", +"2a3520e1": "addDataInstance()", +"2a3590b9": "mimetype()", +"2a35d251": "_move(uint256,address,address)", +"2a3602b2": "DayLimitMock(uint256)", +"2a369647": "getEndpointParams(address,bytes32,int256)", +"2a36b7ac": "TotalRate()", +"2a37d540": "CrowdToken()", +"2a37eaea": "buyWithHash(address,uint256,uint256,bytes32)", +"2a387bdd": "bsx(uint256,string,string)", +"2a388b1f": "cancelDeposit(bytes32,uint256,uint256)", +"2a389fdc": "Pray4Prey(uint128[],uint8[])", +"2a38d484": "getNumEntries(uint256)", +"2a3966ff": "setActiveStatusEgg(uint256,bool)", +"2a396734": "burnPXLRewardPXL(address,uint256,address,uint256)", +"2a39a069": "minInvestmentInWei()", +"2a39c1ea": "officialUrl()", +"2a3a236f": "setMasterContract(address)", +"2a3b1228": "RobotnikToken(address)", +"2a3c2c56": "getConversionFeeAmount(uint256)", +"2a3d05cc": "getSignedIndex()", +"2a3d30c2": "coinValue()", +"2a3dc703": "updateRewardLedger(address,uint256,uint256)", +"2a3de92f": "getCurrentBonusPct()", +"2a3e6ba1": "TOKEN_AMOUNT_ICO_STAGE1_PRE_SALE5()", +"2a3ec4ff": "takeICOInvestmentsEtherCommission(address,address)", +"2a3ef566": "EscapeCalled(uint256)", +"2a410068": "updateShares()", +"2a41360d": "processOfflinePurchase(address,uint256,int256)", +"2a41d1ff": "ArrAccountIsNotFrozen(uint256)", +"2a42e85f": "MiBoodleToken(uint256,uint256,uint256,uint256,uint256)", +"2a437269": "RCCCToken()", +"2a43b847": "TEACHToken()", +"2a43db3a": "Creature()", +"2a45a39a": "Post(address)", +"2a4654ab": "getAnimecard(uint256)", +"2a46d079": "MAT_UNIT()", +"2a472ae8": "checkIfCalled(bytes32)", +"2a4735c1": "EXOTokenSale(address,address,address)", +"2a47e08a": "Potato()", +"2a4802bc": "JINS()", +"2a4843a7": "freezeHeight()", +"2a486a28": "raisedETH()", +"2a48cabb": "testSwapTop()", +"2a491877": "lastTimeOf(address)", +"2a49222b": "isUsernameTaken(bytes32)", +"2a4a1a9b": "addFunds(address)", +"2a4a1b73": "vote(address,uint256,uint256)", +"2a4a8d68": "PRESALE_WEI_WITH_BONUS()", +"2a4a8e02": "stakedAmount(address,address)", +"2a4c7c6d": "initiateClaim(bytes32)", +"2a4caf67": "setDistenseAddress(address)", +"2a4d1a12": "CardExists(uint32)", +"2a4dc687": "callLib2(uint256)", +"2a4e0d55": "getTranscoderPoolSize()", +"2a4e4a84": "forx()", +"2a4ef2a3": "wpxTeamAddress()", +"2a4f1f21": "ACLYDTOKEN()", +"2a4f370f": "forTesting()", +"2a4fe4ef": "ClimateCronToken()", +"2a4ff14a": "Vlogchain(uint256,uint256)", +"2a50097b": "getPlayerBets(uint256,address)", +"2a501a43": "grantBonusDrops(address,uint256)", +"2a50d71d": "transferWithLock(address,uint256,uint256,uint256)", +"2a513dd9": "changeMinimum(uint256)", +"2a515949": "_attack(uint256,uint256,uint256,uint256)", +"2a523e89": "maxReferrerTokens()", +"2a52ee60": "createAuthority()", +"2a548276": "AddStaticProfit(address,uint16,uint256)", +"2a54d313": "pay(address,address,address,uint256,uint256,uint256)", +"2a555650": "HoneySuckleTimes()", +"2a55c47d": "TrumpFarmer()", +"2a55cab6": "UniCoinSize()", +"2a55feec": "isBuyer(address)", +"2a560845": "ownerWithdrawUnsupportedTokens(address,address)", +"2a571b15": "strikersChecklist()", +"2a583b90": "withdrawRake()", +"2a5854d9": "getFreeSquirrel()", +"2a58b330": "nextOrderId()", +"2a59143a": "HIKI()", +"2a595dd2": "GridcubeToken()", +"2a5b204a": "subCoinBalance(address,uint256)", +"2a5b51c3": "TokensIn(uint256)", +"2a5b68fd": "validate(bool)", +"2a5bfc7b": "isFunctionAuthorized(bytes32)", +"2a5c0e7c": "HomeBridge(uint256,address[],uint256,uint256,uint256)", +"2a5c2a64": "ITGCToken()", +"2a5c4675": "reservation()", +"2a5c65e4": "lookupInterest(uint256,uint256)", +"2a5c792a": "getAllTokens()", +"2a5cd45e": "getModuleIDByName(string)", +"2a5da7cd": "AnimatixToken()", +"2a5e695e": "Clean()", +"2a5eb26a": "BITCOINGAME()", +"2a5ed678": "currentContributionLimit()", +"2a5f6239": "_addReferrer(address,address)", +"2a5f6a0f": "setVariationCycle(uint256)", +"2a607962": "minCutValue()", +"2a608c0c": "VicoOwner()", +"2a60cf07": "FUTURE_DEVELOPMENT_FUND()", +"2a61ae19": "LockBalance(address)", +"2a61d47b": "getResourceSetCount()", +"2a62738b": "icoEndDate()", +"2a62b7fa": "IcoContract()", +"2a632eb5": "setUsdTokenPrice(uint256)", +"2a6389dc": "IsTransferFromOldContractDone()", +"2a649d6a": "returnFixed()", +"2a64e635": "simpleToken()", +"2a64fb63": "getSaleDate(bytes)", +"2a663686": "fpartSigned(int128)", +"2a666e01": "_fight(uint32,uint32)", +"2a66ede5": "giveMeETH()", +"2a677fb9": "getTokensForValue(uint256)", +"2a6852bf": "KOKOCoin()", +"2a6865e3": "PibbleToken()", +"2a69d486": "changeCraneStatus(bool)", +"2a69e1c6": "onlyWhitelistedCanDo()", +"2a69e7d9": "transfer(address,uint48)", +"2a6a5394": "TokenCappedCrowdsale(uint256)", +"2a6b157a": "CrowdsaleClosed(address)", +"2a6c703b": "RATING_EXPAND_INTERVAL()", +"2a6c7757": "kjhcoin()", +"2a6cc9bf": "QRReal()", +"2a6d474d": "usdPerEthMin()", +"2a6d6c08": "ReleasableAmount(address,uint256)", +"2a6dd48f": "approvedFor(uint256)", +"2a6dd8c9": "getPercent()", +"2a6dd9cb": "getInfoA(uint256)", +"2a6e3803": "getSoldAreasCount()", +"2a6e3e5e": "correct_check_match(uint256[39])", +"2a6efd76": "additionalRewards()", +"2a6f39ed": "deleteAllParents()", +"2a6f65c7": "getRoundToGroupToInput(address,uint256,uint256)", +"2a70214a": "TWD_Omnidollar()", +"2a707d2c": "personal_withdraw(string,uint256)", +"2a709b14": "tokenManager()", +"2a70d1e7": "registerInit(address)", +"2a711ab4": "voteTeam(bool)", +"2a714078": "triggerAuth()", +"2a71e729": "NAGACOIN()", +"2a724f2a": "reclaimAllAndBurn(address)", +"2a729061": "IDXToken()", +"2a7292d0": "createToken(uint256,address,uint256)", +"2a7318ac": "changePresaleEndDate(uint256)", +"2a73db5c": "GetContributorInformation(address)", +"2a741385": "subTokens(uint256,string)", +"2a745971": "BlockKing()", +"2a745ae6": "flowerAllowed(address,address)", +"2a74833d": "getUserSupportInTournament(uint256)", +"2a7575ee": "availableBalanceOf(address,address)", +"2a75a2ac": "addressFundAdministration()", +"2a75cb71": "removeOwnerRequest2(address)", +"2a764406": "CreateLRP(address,uint256)", +"2a76a169": "freezeMultipleAccounts(address[],bool[])", +"2a76ffae": "depositEtherForRefund()", +"2a774c27": "totAllocation()", +"2a776e3d": "setKYCLimited(address[])", +"2a7781cc": "postData(address,string,bytes32)", +"2a77b4af": "FEE_MUL()", +"2a77f2b7": "minMaxBuyETH()", +"2a7806e4": "noTokenLocked()", +"2a7813a4": "BitcoinBlackPearl()", +"2a781f78": "getKYCPresalePayload(bytes)", +"2a782802": "creatorBalances(address)", +"2a792f57": "buyAKeyWithAmount(uint256,address,uint256)", +"2a795d79": "bounty_allocation()", +"2a79fa0e": "TakePrize(uint256)", +"2a7a3ac7": "claimUnallocated(address)", +"2a7a50a5": "Intro(string,string,string,string)", +"2a7a80a4": "trade(address,address,uint256,address,address,uint256,uint256,address,bytes)", +"2a7b0172": "dontSellRock(uint256)", +"2a7b2c93": "split(string)", +"2a7b3d4d": "resumeWhitelist()", +"2a7c24f1": "power(int256,int256)", +"2a7ca11f": "getMemeData(uint256)", +"2a7caaec": "FOUNDATION_WALLET()", +"2a7e0cc0": "createtoken(string,string,string,string,string,uint256)", +"2a7e5018": "timeVault(address)", +"2a7e60b6": "setRevealClosed(uint256)", +"2a7ef0cc": "IDEA()", +"2a7f26c4": "GetAllCurrencyIDs()", +"2a8014ca": "escrowAmount(address,uint256)", +"2a804835": "setCooldownEndBlock(uint256,uint64)", +"2a805069": "createToken(uint256,uint256)", +"2a808899": "getSkillCount(address)", +"2a8092df": "isMinting()", +"2a812941": "getInitializeDesignatedReporterAddressValue()", +"2a816e65": "factorWeight()", +"2a8219e2": "setFundingBlock(uint256,uint256,uint256)", +"2a827f99": "getTokenOwnerReward()", +"2a82fdbd": "approveAdd(uint256,address,bool)", +"2a835d67": "changePreIcoStartTime(uint256)", +"2a83cd70": "MrReaperToken()", +"2a845b9f": "ADPay()", +"2a8565b4": "GACT()", +"2a856fcf": "debit(bytes32[],uint256[],uint64[],uint8[],bytes32[],bytes32[])", +"2a858126": "tickerRegistry()", +"2a8587f9": "unAuthorized(address,address)", +"2a85a45d": "right38(uint256)", +"2a85b7dd": "getBackEtherFor(address)", +"2a862f1a": "notLessThan()", +"2a86eef3": "countDiscount(uint256)", +"2a874f34": "finishCampaign(bytes32)", +"2a87a86f": "shift(address,uint256,bool)", +"2a882d1d": "TokenHolderSnapshotter(address,address)", +"2a887299": "bid_threshold()", +"2a89d1bc": "TranchorToken(uint256,uint256,address,address)", +"2a89d6fd": "registerForGetTogether(address)", +"2a8a8b19": "bonusList()", +"2a8a8ebb": "unitStake()", +"2a8ab73c": "getProductOrderPayer(uint256)", +"2a8ade3a": "TotalCapacity()", +"2a8d1c61": "maxMask()", +"2a8d26e8": "approveTransfer()", +"2a8d7baa": "claimCompanyReserve()", +"2a8de0ca": "DranMe()", +"2a8e251f": "BitcoinNature()", +"2a8e391d": "OperationsFund()", +"2a8e5eae": "isInGroupOf(uint256,uint256,address)", +"2a8eb9a3": "arpToken()", +"2a8ec8cc": "numberOfPledges()", +"2a8f368b": "RESERVED_COMPANY_GROUP()", +"2a8f6aa8": "TOKENS_FOR_OPERATIONS()", +"2a8faf95": "secondaryGasLimit()", +"2a8fd223": "Flagged(address,bool)", +"2a9043e4": "sellValue()", +"2a9046d8": "disableGeneration()", +"2a905318": "TOKEN_SYMBOL()", +"2a905ccc": "getAdminFee()", +"2a9078d6": "OWNERS()", +"2a909257": "MultiCappedCrowdsale(uint256,bytes32,uint256)", +"2a9121c7": "ethereumToTokens_(uint256)", +"2a91ab16": "doAirDrop(address[],address,uint256[],uint256)", +"2a922d54": "collectedAddresses(uint256)", +"2a92362c": "getPaid(uint256)", +"2a9278c5": "optionPoolLockTotal()", +"2a92bb17": "OPRAH()", +"2a92bffa": "setEditionPackPrice(uint8,uint256)", +"2a93b5bb": "pausePreIco()", +"2a943be1": "LIRAX(string,string,uint256,string)", +"2a952b2d": "process(bytes32)", +"2a952b4b": "setParents(uint256,uint256,uint256)", +"2a970043": "create(string,uint256,uint256,uint256)", +"2a98e802": "setPerformanceBonus(uint256)", +"2a9a86c1": "createBucket(bytes32[])", +"2a9af123": "DOMTOK()", +"2a9b4921": "testManager(address)", +"2a9b6975": "SuperNanoCoin()", +"2a9b6dee": "pastFiveMinutes()", +"2a9ba092": "resizeIssuersArray(uint256)", +"2a9d04f0": "TOKEN_PRIVATE_SALE_CAP()", +"2a9e97f1": "matured_block_number()", +"2a9edf6f": "ownerSetStakeStartTime(uint256)", +"2a9f0fb2": "getPriceWithInterests(uint256)", +"2a9f1a79": "acceptPayment(address)", +"2a9fabd2": "betMatch(uint256,uint256)", +"2a9fb933": "MintExecuted(uint256,address,uint256)", +"2a9fb9b2": "userTransfer()", +"2aa0426c": "getAllBlocksByOwner(address)", +"2aa056cd": "shares_holders_count()", +"2aa073c5": "icoActive()", +"2aa0da47": "paymentSettings(string)", +"2aa1e848": "getPlayerAffT2(uint256)", +"2aa2b7eb": "T8CToken(address,uint256)", +"2aa2c381": "initialize(address,address,uint256,uint256,uint256,uint256,uint256,address)", +"2aa2f7a4": "getOwnOrderByIndex(uint256)", +"2aa3177a": "self_store()", +"2aa37a41": "substractBalance(address,uint256)", +"2aa49dd7": "Pixiu()", +"2aa4c051": "setifoodDevAddress(address)", +"2aa531d9": "getPlayerData(address)", +"2aa5411f": "jadeRec(uint256,uint256)", +"2aa5ed61": "DayLimit(uint256)", +"2aa6f98b": "ledToken()", +"2aa71e24": "init(bytes32,address)", +"2aa852b3": "removeListener(address,address)", +"2aa8be8d": "createPermission(address,address,bytes4,address)", +"2aa9466b": "updateMyWorks(bytes32,address,address,bytes32,uint256,uint256)", +"2aaa308e": "finalize(address,address,address,address)", +"2aaa49f5": "percentageQuarter3()", +"2aaa9de1": "AlicToken()", +"2aab1351": "receiveFromSigned(address,bytes,uint256,uint8,bytes32,bytes32)", +"2aab22ff": "BonusReferrerCrowdsale(uint256)", +"2aab80dd": "optionPool()", +"2aabb48e": "nextContributionCap()", +"2aabffdf": "disableSaleAgent(address)", +"2aac6911": "poolBLock()", +"2aac8ad4": "getFirstAndSecondItem()", +"2aad292e": "setOperatingOfficer(address)", +"2aadafe8": "refundAdvertiser(address,uint256)", +"2aae7f26": "Arcturus()", +"2aae88f6": "removeFromGeneration(uint256,address)", +"2aaee1a5": "Drawer()", +"2aaef20c": "sixth_withdrawal(uint256)", +"2aaefa9f": "centsExchangeRate()", +"2aaf1685": "testControlCreateWithParentSameItemId()", +"2aafbf7c": "Getether()", +"2aafe9e7": "metToken()", +"2ab0252d": "getERC721AddrPawn(uint256)", +"2ab08396": "OwnersDb()", +"2ab0be77": "getTicketCode(uint256)", +"2ab0bf3c": "GetContributorData(address,uint256)", +"2ab13037": "votesNo()", +"2ab19a7e": "GoalMaximumReached(address,uint256,uint256)", +"2ab2174e": "subOnOneStage(address,uint256,uint256)", +"2ab22592": "updateWinnerBid(bool,bytes,uint256,bytes,bytes,bytes)", +"2ab24e3b": "commitVote(address,bytes32,bytes32,bytes32)", +"2ab26831": "getRateIco()", +"2ab28ce4": "buyTree(uint256,address)", +"2ab290fc": "updatejingzhi(uint256,string,uint256)", +"2ab34a91": "claimEnergy()", +"2ab4672a": "BatchCreateSaleAvgPrice(uint256[],uint256,uint256,uint256,uint64,address)", +"2ab4d052": "maxTotalSupply()", +"2ab4ebfa": "AddItem(address,address)", +"2ab6a50e": "payoutBigBonus(address)", +"2ab6f3f0": "BteamBets(uint256)", +"2ab6f8db": "renounceOperator()", +"2ab7173b": "lockup_startdate()", +"2ab72d2f": "assetIdOfToken(uint256)", +"2ab76377": "icoEndTimestampStage3()", +"2ab7961e": "aDeleteMessage(uint256,string,string)", +"2ab7d104": "_getAllRevisionIpfsHashes(bytes32)", +"2ab8de9b": "hash_ripemd160(string,uint256)", +"2ab8fc2d": "reservesPerTokenSrc(address,uint256)", +"2ab90d66": "ownerrestart()", +"2ab924d2": "HRCoin()", +"2abaa0c9": "picosCap()", +"2abaca23": "participate_in_arbits_presale_fiat(address,uint256)", +"2abd7fc8": "withdrawDao()", +"2abdbeb8": "forceOverStage()", +"2abdf1ef": "_update(string,uint256,string,uint256,uint256,uint256)", +"2abe4f60": "getInStake(uint256)", +"2abe5a2d": "getCandidate(uint32)", +"2abf2aae": "payMaxAuctionEther()", +"2abfab4d": "donationCount()", +"2abfaf1f": "setFreeTransfer(bool)", +"2abfbd28": "mintCommunityRewards()", +"2ac016ad": "addBackend(address)", +"2ac025ab": "removeAddressFromRole(address,string)", +"2ac08739": "getCurrentDuke(string)", +"2ac110c5": "icoPhase2Start()", +"2ac12622": "cancelled(bytes32)", +"2ac197c4": "IPMCOIN()", +"2ac1a995": "HiBTCToken()", +"2ac1db5a": "getEthToTokenUpdateOrderHint(uint32,uint128,uint128)", +"2ac20ed4": "createInitialDays(uint256)", +"2ac2af53": "updateParameters(bytes32)", +"2ac306b0": "BitCoin()", +"2ac364b4": "PalavraCoin()", +"2ac394a4": "durationBetweenRewardMints()", +"2ac48524": "getTokensCount(address)", +"2ac4a51d": "OVALExchangeToken()", +"2ac50df1": "tokenPriceOracle()", +"2ac68b78": "acceptPayment(address,uint256)", +"2ac69167": "StockLocation(string)", +"2ac6f15f": "exchangePreDGZTokens()", +"2ac71c16": "maxUSD()", +"2ac7f8ce": "CrowdSaleChanged(address)", +"2ac85e46": "isValidNode(uint256)", +"2ac87112": "ETHRaised()", +"2ac9bf09": "bid(uint256,uint256,uint256)", +"2aca2b16": "setInvestxPlatform(address)", +"2acada4d": "getAllAssets()", +"2acc204c": "killMeshPoint(int256,address,address,string,address)", +"2accf2f7": "splitFunds(address,address)", +"2acd1a95": "sling(string,string,string,string,uint256)", +"2acd2000": "removeFreezer(address)", +"2acd7e41": "transferOwnerToTest()", +"2acefd0f": "setCitySlogan(uint256,string)", +"2acf3908": "StealthGridToken(uint256,string,string)", +"2acf8551": "playMeta(address,address,uint256)", +"2ad02172": "MAX_PREICO_SUPPLY()", +"2ad0a4e9": "pauseNotice()", +"2ad11b9e": "getMinerals()", +"2ad12937": "OwnableToken()", +"2ad1bc09": "steal(int128,string,address)", +"2ad2a9f8": "transfer(bytes32,uint256,address)", +"2ad2ae2e": "collectLocalBounty(uint16,uint256)", +"2ad3274f": "UpgradeScheme()", +"2ad3509b": "ExcreteumToken()", +"2ad389e3": "constructHashRs1Rs2(bytes,bytes)", +"2ad3e8bc": "GreenChain()", +"2ad3ef70": "randContract()", +"2ad45312": "WEI_MINIMUM_PURCHASE()", +"2ad4d818": "userCreate(string,string)", +"2ad64a4d": "MAXCAP_TOKENS_PRE_ICO()", +"2ad8016e": "changeDiscount(uint256,uint256,uint256)", +"2ad8aaa6": "bonusAmmount(uint256)", +"2ad8d875": "getPayeeExpectedAmount(bytes32,uint8)", +"2ad8fbd2": "MerrierToken(string,string,uint256,uint256,bool)", +"2ad92740": "tokensPurchased(address)", +"2ad9527e": "h_pwd()", +"2ad95786": "winner(address)", +"2ad9618c": "startCrowdsale(uint256,uint256,uint256,uint256[],uint256[])", +"2ad99825": "setOwnerCutPercentage(uint256)", +"2ad9efc0": "UbayToken(address,uint256)", +"2ada2596": "getMember(address)", +"2adbb84d": "onFreezing()", +"2adbc396": "BurnableCrowdsaleToken(string,string,uint256,uint256,bool)", +"2adc2cd2": "COIN_PER_ETHER_ACTIVE()", +"2adc7da3": "setCentralBanker(address)", +"2add5a50": "cofounders(uint256)", +"2add78bb": "StartQ(string,string)", +"2addeab6": "getSolver(uint256)", +"2ade6c36": "getNodeAddress(bytes32)", +"2adf68bb": "UTPLToken()", +"2adf7d2f": "tenZero()", +"2ae1158d": "votingWeightOf(address,uint256,uint256,uint256)", +"2ae26d8e": "tenDecimalPlaces()", +"2ae3594a": "hit()", +"2ae418a4": "getPrivatePreSaleTokenBalance(address)", +"2ae4b85f": "MAX_HOST_PERCENT()", +"2ae524c2": "mintRiskTokens(address,uint256)", +"2ae6218d": "getBurnPrice()", +"2ae67563": "GameSicBo(string,uint256,uint256,uint256,address)", +"2ae6f9c2": "Ownerburn(uint256,address)", +"2ae72544": "length(int256)", +"2ae7c2df": "Ethernite()", +"2ae7c313": "Injected(address,uint256,uint256)", +"2ae8284a": "_newGame(uint256)", +"2ae8636d": "withdrawPRSTokens(address)", +"2ae87a70": "getNumContents(address,uint256)", +"2ae8a2d2": "sendFunds(address,uint256,uint256)", +"2ae8a7e3": "checkRole(address,bytes32)", +"2ae8b4a3": "actualGotETH(address)", +"2ae9782c": "MARRON()", +"2ae9c600": "protocolVersion()", +"2aea4d21": "sealer()", +"2aeaa291": "checkRewards()", +"2aeabfbf": "getLiquidityAndPositions(bytes32,address)", +"2aeacd4a": "exchangeTokensFromOtherContract(address,address,uint256)", +"2aebcbb6": "finishVote()", +"2aec3169": "setThirdWinner(address[])", +"2aec3a71": "ProofOfHumanityAddOn()", +"2aec9466": "updateInfo(uint256,uint256,uint256)", +"2aed1390": "kyberContract()", +"2aed1905": "setMatchingEnabled(bool)", +"2aed256e": "inRangeToDisembark(uint16,uint16,address)", +"2aed7f3f": "reclaimContract(address)", +"2aee19c7": "testCreateWithNonce()", +"2aef3898": "ChangeMinSaleAmount(uint256)", +"2aef6ff6": "serviceTrasferFromDist(bytes32,address,uint256)", +"2aefb7c5": "funds_claimed()", +"2af004e7": "setReferralAddress(address,address)", +"2af05c4e": "lastMintingTime()", +"2af05d07": "unlockCurrentAvailableFunds()", +"2af0ac71": "getAmountSoldAfterPowerDay()", +"2af123b8": "diffHours(uint256,uint256)", +"2af1616d": "MissionToken(uint256,string,uint8,string)", +"2af1b5a2": "protectedUnlock(address,uint256,string)", +"2af1c247": "mint(string,uint256,uint8,string)", +"2af22e3b": "getJobs(address,uint256)", +"2af37ba0": "Donate(string)", +"2af38eab": "totalBspAmount()", +"2af39bab": "AssetBackedTokens(string,uint8,address)", +"2af3b7f8": "updateState(bytes32,uint256,bytes,bytes,bytes)", +"2af4c31e": "changeOwnership(address)", +"2af52312": "TRAToken(address)", +"2af5356a": "claimTeamTokens()", +"2af5cfdd": "priceOfEthOnEUR()", +"2af5e6b2": "setPriceEther(uint256)", +"2af6fb10": "ERC20TokenImpl()", +"2af7ac0a": "rtu(uint256)", +"2af7c4d7": "Certifiers()", +"2af7ceff": "testPrice(uint256)", +"2af7ecc7": "addRosenCertAdmin(address)", +"2af8afca": "dgt()", +"2af8b645": "release(bytes32,bytes32)", +"2af8fd94": "ISmartCert()", +"2afaca20": "buy(uint256,address,uint256)", +"2afb21bc": "InvestWithdraw()", +"2afb9fb1": "isCardTradeable(uint64)", +"2afbbacb": "canStake(address,uint256)", +"2afbc38f": "Annexe_SO_DIVA_SAS()", +"2afbe339": "QQQToken()", +"2afcdfbc": "createGen0Auction(uint256,uint256,uint256,uint256,uint256)", +"2afcf433": "PriceTwoEnable()", +"2afcf480": "invest(uint256)", +"2afd1a7d": "getReleasableAmount(address)", +"2afe4c37": "tokensleft()", +"2afe9f1e": "TestTokenContract()", +"2afed67e": "amountFundBounty()", +"2aff101c": "LinearDecayingTokenFunction()", +"2aff2843": "servusMultiSig()", +"2aff49d7": "setSizeAndRate(uint256,uint256)", +"2b000f00": "calculate_next_expected_wei(uint256,uint256,uint256,uint256)", +"2b00c6fd": "createHorseShoe1(uint256,uint256,address)", +"2b019692": "RYNote()", +"2b01bf51": "isValidMember(address)", +"2b028bbb": "LKCExchangeRate()", +"2b02d9af": "NIMBUS()", +"2b03b8d4": "IMDEXdeposit()", +"2b03d70e": "undisputeFavor()", +"2b04451a": "totalExtraOptions()", +"2b048f77": "getMyDeployAt(uint32,uint32)", +"2b04b478": "removeUsersFromGroup(bytes32,address[])", +"2b04d8f7": "takeOffer(uint256,address)", +"2b04e840": "getBalance(address,uint256)", +"2b051b50": "revealVoteOnProposal(bytes32,uint8,bool,bytes32)", +"2b05d346": "CallScheduled(address)", +"2b069816": "getJobValue(uint256)", +"2b071e47": "spread(address[],uint256[])", +"2b07682a": "withdrawFoundersTokens()", +"2b086b92": "convertToTMEX(uint256,address)", +"2b08fef7": "buy_token(address[],uint256)", +"2b093fe9": "TOKEN_MULTIPLIER()", +"2b0999f3": "initialYear()", +"2b09e707": "amountHives()", +"2b0aa1ed": "updateEthFee(uint256)", +"2b0ac7c4": "_createToken(uint256,uint256,uint256,uint256,uint256,address)", +"2b0cb194": "mintRawTokens(address,uint256)", +"2b0d0180": "luckyBuy()", +"2b0d0c6a": "afterFirstRefundRoundFundsReleaseNumerator()", +"2b0e16bf": "PRESALE_BALANCES()", +"2b0e64b3": "determineCommissions()", +"2b0ebfe9": "activatedJuryTokens(address)", +"2b0fbf72": "getMobster(uint256)", +"2b0fd89e": "ARcoin()", +"2b0fdb72": "MINIMUM_MANUAL_SIGN_PERIOD()", +"2b0ff02d": "listCard(uint64,uint128,uint128,uint24)", +"2b100a31": "setStatsSumHours(uint256,uint256)", +"2b1071c9": "testTransferToNullAuthority()", +"2b112e49": "getCirculatingSupply()", +"2b11e7f6": "SILVER_AMOUNT_SKL()", +"2b124245": "selfRegisterDINsWithResolver(address,uint256)", +"2b12553b": "saleExchangeRate()", +"2b13d799": "redeemedList(uint256)", +"2b1453dd": "addSwap(string)", +"2b146407": "PrivateSale()", +"2b14b712": "addClient(address,address,uint256)", +"2b14ca56": "sellFee()", +"2b151096": "placeSaleOrder(bytes8,bytes8,uint256,uint256,uint256)", +"2b15eb9b": "TongTong(string,string,uint256)", +"2b16b56a": "setIndex(uint256,uint256)", +"2b16f1ef": "nextPoolPercentage()", +"2b17355e": "balancesPrivate(address)", +"2b17b6a9": "bnbToken()", +"2b1841d2": "openCdp(uint256,uint256,uint256,address)", +"2b1857a5": "dividendPathways(address,uint256)", +"2b190f18": "getFreeTokens()", +"2b193ac4": "INITIAL_AC_SUPPLY()", +"2b198366": "addCertifier(address)", +"2b198808": "BloccaConto(address,bool)", +"2b1c511f": "getAvailability(address)", +"2b1c6982": "testTemp2()", +"2b1dd8da": "refundFees()", +"2b1e27f1": "migrateDomain(uint256,bytes32)", +"2b1e5016": "releaseTheHodl()", +"2b1ed01a": "warehouses()", +"2b1f7660": "PRZTToken(uint256,string,uint8,string)", +"2b1fcc10": "impl_cancelOrder(address,uint256,bool)", +"2b1fd58a": "acceptBid(uint256)", +"2b20e397": "registrar()", +"2b214618": "listAllBuyBalance(address,uint256,uint256)", +"2b21502f": "totalEthRcvd()", +"2b21d01b": "rateBTCxETH()", +"2b223264": "BitcoinBrand()", +"2b22a18c": "allocate8ProjectToken()", +"2b232741": "pullFromCirculation(uint8)", +"2b2443db": "canRaiseUsing(uint256)", +"2b2449b5": "setMaxCAP(uint256)", +"2b24aa6e": "rateA()", +"2b252d17": "_randomize(uint256,uint256)", +"2b25303b": "USDTUBE()", +"2b25a7e4": "giveKudos(address,uint256)", +"2b28d2d0": "totalFrozenAccountsMapping()", +"2b291eb6": "UserAddTicket(bytes)", +"2b29532b": "distributeLCASH(address[],uint256,uint256)", +"2b297f9e": "registerDao(address)", +"2b29908d": "BGB_address()", +"2b29fbfa": "testFail_voterNotCertified()", +"2b2b2882": "mintIcoTokenMultiple(address[],uint256[])", +"2b2badb3": "getAuditor(address)", +"2b2c71af": "doTradeofCollateral(address,address,uint256,uint256,uint256,uint256)", +"2b2c91b9": "refundApprove(address,uint256)", +"2b2dc12e": "RECEIVER_PAYOUT_THRESHOLD()", +"2b2e7159": "typeB()", +"2b2e76f3": "LA_wallet()", +"2b2f4d84": "setVestingParams(uint256,uint256,uint256)", +"2b2f88a8": "quantidadeDeAutorizacoes(address)", +"2b2fbd68": "minTicketEur()", +"2b302b60": "fairymasterReq()", +"2b30a84e": "rollTwo(address,uint8,uint8)", +"2b30d2b8": "invoke(uint256)", +"2b318568": "AddDynamicProfit(address,uint32,uint256)", +"2b321633": "testCloseChannel()", +"2b3297f9": "swapper()", +"2b337152": "totalissue()", +"2b343100": "newPlayerFee()", +"2b359e6b": "fundingTokens()", +"2b35d08a": "_computePrice(uint256)", +"2b36316e": "updateStageCap(uint256)", +"2b36a657": "profits()", +"2b379218": "globalDailySupply()", +"2b37d313": "tdeIssuer()", +"2b38ee56": "exitFee_()", +"2b3a4ae3": "adjustFeeEntitlement(address,uint256)", +"2b3b885d": "BGJC(uint256,string,string)", +"2b3c7562": "tierThreePurchase()", +"2b3da717": "BOBOTOKEN2()", +"2b3eae40": "MatchmasterTakeover(address,address,uint256)", +"2b3eb76c": "awardAmountPrime()", +"2b3ed526": "setFiatContract(address)", +"2b3ede1c": "WithdrawAll(address)", +"2b3f9f01": "_setSpendAvailable(uint256)", +"2b3fbbbb": "setPixelColor(uint16,uint16,uint24)", +"2b3ff9e9": "DLVO()", +"2b4143bd": "BasketRegistry()", +"2b4158cb": "buyFreePixels(uint256,uint256,uint256,uint256)", +"2b41a901": "grandTotalAllocated()", +"2b423b05": "changeRequiredMinor(uint256,bool,bytes)", +"2b42a89a": "setWhitelistOnlyPermission(bool)", +"2b42f4b2": "TokensCreated(address,uint256,uint256)", +"2b435366": "fund(address,bool)", +"2b4353f2": "payoutRate()", +"2b44d05f": "LISA()", +"2b44e5be": "distributeTokenToAddress(address,address,address,uint256)", +"2b44fd38": "dayLimit_()", +"2b455ac6": "insertMilestone(uint8,uint256,uint256,uint256)", +"2b459e81": "SpermLabsReborn()", +"2b45bcf9": "minimumHydroStakeUser()", +"2b4656c8": "initialize(address,address,address,uint256,uint256,uint256,uint256)", +"2b46e7f8": "SLUTZToken()", +"2b47571a": "resetWithdrawTimer(uint256)", +"2b47cb17": "TopToken()", +"2b49c9c2": "updateBanqueAddress(address)", +"2b49d425": "currentProposal()", +"2b49d9e5": "setFighters(uint32,uint32,uint256[])", +"2b4a27cb": "fechPreAllSumNumForCandidate()", +"2b4a2d0a": "getInfoFromCreateAuction(bytes)", +"2b4a3b31": "doTransferFrom(address,address,uint256)", +"2b4a964b": "networkGrowthAmount()", +"2b4bdf76": "getBdpController(address[16])", +"2b4ca103": "TXQToken(address,uint256)", +"2b4cbcc3": "getCombat(uint256)", +"2b4d0450": "BaseToken(string,string)", +"2b4d7c3e": "getPositionLender(bytes32)", +"2b4e8413": "userNumber()", +"2b4f79b3": "buyMessage(bytes32,uint256,string)", +"2b5129f5": "WaterMeterAcorn(bytes32,uint8,uint256,uint256,uint256)", +"2b513549": "mokenNameBytes32(uint256)", +"2b514749": "getTeamPrice(uint256[])", +"2b5184a6": "addSponsorship(address,address,uint256)", +"2b5187fd": "STCC()", +"2b521416": "features()", +"2b549b82": "createAuction(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"2b54c3ce": "addToken(uint256,string)", +"2b554142": "redeemMany(address[],uint256[])", +"2b556813": "twitterDropMultipleAmount(address[],uint256[])", +"2b5570ad": "PatientFactory()", +"2b5630c2": "displayvehicledetails(address,uint256)", +"2b57298b": "getDate(uint256)", +"2b577ec4": "PREMINE_RELEASE(address,uint256,uint256)", +"2b58072f": "getDatasetsCount(address)", +"2b58150b": "setLotteryDuration(uint256)", +"2b587555": "privateTransfer(address,uint256)", +"2b58e202": "tokensOfOwnerFromIndex(address,uint256,uint256)", +"2b5914fe": "setUserName(string)", +"2b5947e7": "checkDivsRndView(address)", +"2b596a23": "balanceOfShares()", +"2b597e4d": "updateBool(bytes32,bool)", +"2b59d1fc": "borrar()", +"2b5ad2ad": "secondTimer()", +"2b5af004": "appendDecryptedBid(uint256,uint256,uint256,address,address,uint256,uint256,uint256)", +"2b5b6872": "AIRDROP_AMOUNT()", +"2b5da915": "Property(string,string,uint256,uint256)", +"2b5daa86": "newModule(string,address,bool,bool)", +"2b5f227e": "encodeBytes(bytes,uint8)", +"2b5fa90a": "currentselectorchoosegiverandreceiver(address,address,address,address)", +"2b5faebd": "_calcTokens(uint256,uint256)", +"2b5fc4ce": "RSUNToken()", +"2b603c71": "allowances(address)", +"2b6133f5": "checkTierCap(uint8,uint256)", +"2b625874": "distributePeerTokens()", +"2b62ef2a": "CryptoCurrencyToken()", +"2b633f77": "ballotCancelingThreshold()", +"2b644ac8": "_setAvatarIfNoAvatarIsSet(address,uint256)", +"2b65d18a": "wireLimit()", +"2b65e040": "ownerPool()", +"2b664d8a": "getUsersByDocHash(bytes32)", +"2b680932": "ANNOUNCE_WINNER_DEADLINE()", +"2b68b9c6": "destruct()", +"2b68bb2d": "cancelContract()", +"2b68fc21": "guarenteedPaybackTime()", +"2b69f40d": "PaymentServ(address,address,address,address)", +"2b6a8b46": "addSpace(uint256,uint256,bytes,uint256,uint256,uint256,uint256,string,string,uint256)", +"2b6aa69d": "NewFunds(address,uint256)", +"2b6ada6d": "WalletWithDailyLimit(address[],uint256,uint256)", +"2b6b7c69": "airdropIndividual(address[],uint256[],uint256,uint256)", +"2b6bbc31": "testingOnly()", +"2b6bc920": "answerRequest()", +"2b6bd13a": "ChainInfo()", +"2b6c750f": "loseSponsor(uint32,int256)", +"2b6d0ceb": "test(address,address)", +"2b6d7706": "transferTokensManuallyToMany(address[],uint256[],uint256)", +"2b6d7a66": "hasActivePass(address)", +"2b708fc9": "usageFee(bytes32,uint256)", +"2b70faf1": "game_paused()", +"2b711051": "investorsCount()", +"2b713d71": "rankToAddress(uint256)", +"2b71b0e5": "getStat()", +"2b7216e5": "donateToCampaign(uint256,uint256)", +"2b726758": "ETIC()", +"2b72c5fc": "FANCY(uint256,string,string)", +"2b73a83b": "CBS(string,string,uint8,uint256,uint256,uint256,bool,bool)", +"2b741ed6": "claimedFees(uint256,address)", +"2b7423ab": "average(uint256,uint256)", +"2b747a29": "buy_tickey(address)", +"2b750f4f": "DIVISOR_PRICE()", +"2b75289b": "placeBet(uint8,uint8,uint8,int256)", +"2b7568d9": "admin_withdraw_all(address)", +"2b7582c0": "sendEthForReward()", +"2b76823c": "ICOBuyer(address,address,uint256,uint256,uint256)", +"2b770ee9": "Ddjtab(uint256,string,string)", +"2b774d46": "XWALLET()", +"2b78194f": "GAS_REFUND()", +"2b7832b3": "adminCount()", +"2b783bc8": "addCredentials(bytes32,bool)", +"2b785960": "testBitAndSuccess()", +"2b788e33": "MAX_BOUNTYTOKENS_AMOUNT()", +"2b790ee4": "calcProfitFromTotalWon(uint256,uint256)", +"2b791053": "getDailyLimitRemaining()", +"2b791d6e": "storedDividendsOf(address)", +"2b79d7ba": "testFailMoveWithoutTrust()", +"2b7ac3f3": "verifier()", +"2b7b3a6c": "createBuildingAuction(uint32,uint8,uint8,uint8,uint8,uint8,bool)", +"2b7be84b": "AfterSchoolCrowdsaleToken()", +"2b7c3138": "MANETokenPartnerCrowdsale(uint256,uint256,address,address,address,address,address)", +"2b7ce9cd": "updateThresold(uint256)", +"2b7d13cc": "withdrawRemainingToken(uint256,address)", +"2b7d177b": "isvalidOrg(address,address)", +"2b7dd488": "totalLBSold_GENERAL_3()", +"2b7e063e": "GenOutChipsNum(uint256,uint256,uint256)", +"2b7e2169": "getTotalSell(uint256)", +"2b7e4295": "invadePlanets(uint256,uint256[],uint256[])", +"2b7ec7fe": "getLotInvested(uint256,address)", +"2b7fda2f": "mintAllowed(address,address,uint256,int256)", +"2b81b8a4": "alreadyRegisteredMessage()", +"2b82714f": "deliverAngelsREDAccounts(address[],uint256[])", +"2b828e4a": "addTx(bytes32,bytes4,address)", +"2b82aed6": "setPayerAddr(address)", +"2b82cf1f": "unFroze(address,uint256)", +"2b84aabe": "trust(uint8)", +"2b84fe83": "reserveFeeToBurn(address)", +"2b85ed9c": "purchaseCount()", +"2b860e6d": "transferToThroughVariable(address,uint256)", +"2b861629": "storeBlockHeader(bytes)", +"2b865dea": "airdropTokenDistributionMulti(address[],uint256[])", +"2b86d48a": "MDKToken(address)", +"2b876784": "ZHOUToken()", +"2b877dfd": "sendCoin(bytes4,bytes32,bytes32,uint256)", +"2b878c7c": "KYCValid(address)", +"2b88c42d": "buyItem1()", +"2b88cbbf": "getExcludes(uint256)", +"2b8a1c00": "t2tokenExchangeRate()", +"2b8a1c5a": "setGuardian(address,bool)", +"2b8a36e0": "freezeTransferTime()", +"2b8a789b": "ChangeGameHidden(address)", +"2b8af65b": "INTERFACE_SIGNATURE_ERC165()", +"2b8b09d4": "REDGIL()", +"2b8b1bc4": "transferAndFrostTokens(address,uint256,uint256)", +"2b8b6667": "deregister(address[])", +"2b8bbbe8": "add(uint256,address)", +"2b8c8a20": "Sale(address,uint256,uint256,uint256,string,uint256)", +"2b8cc346": "acceptRequest(address)", +"2b8cd2f7": "withdrawUncommittedTokens(uint256)", +"2b8cd5c6": "getComponentSupport(uint16)", +"2b8d0cd7": "setIcostart(bool)", +"2b8e4df1": "vest(bool)", +"2b8f2042": "withdraw_funds()", +"2b8f7a49": "depositMoney(string)", +"2b8f899e": "OzoneToken()", +"2b901a0a": "getOwnerByName(bytes32)", +"2b90557c": "minSet()", +"2b905bf6": "TEAM_WALLET()", +"2b90bb3a": "distributeGoTokens(address,address)", +"2b9122df": "getTimeTillEnd()", +"2b913151": "secondCapEndingBlock()", +"2b919aa6": "validPurchaseSize()", +"2b920a6b": "CampaignAccountFactory(address)", +"2b925b25": "minimumInvestment()", +"2b92b8e5": "hashValue()", +"2b92c776": "cancelBuyOrder(address,uint256,uint256,uint256,uint256)", +"2b9530d8": "transferTokens(address,uint256[])", +"2b956ff7": "getUserId(address)", +"2b968958": "revokeOwnership()", +"2b96a0a1": "getGamesMeta(uint256[])", +"2b96c00e": "abortGame(address,uint256)", +"2b97c6e4": "Cilox()", +"2b98222e": "getInstitutionByAddress(address)", +"2b985942": "LittleStoreERC20Token()", +"2b985f7c": "testNegatives(int256)", +"2b9897fb": "smallCapLimitOf(address)", +"2b991746": "approveFor(address,address,uint256)", +"2b99a087": "getLpIsWorking(int256)", +"2b99db6a": "tokensApproved()", +"2b99f359": "carOfByIndex(address,uint256)", +"2b99f3e1": "setIsTurnDataSaved(bool)", +"2b9a5c34": "_getTileAt(int32,int32)", +"2b9a7fae": "_updatePlayerOverrideId(uint256,uint256)", +"2b9b7573": "MAX_TRANSFERS()", +"2b9be92e": "GanaTokenAirdropper(address)", +"2b9cb4f8": "uniq(uint64[])", +"2b9cd08b": "submitAddOwnerTransaction(address)", +"2b9ce01e": "currentIcoTokenPrice()", +"2b9e05d1": "Betportchain(uint256,uint256)", +"2b9e5088": "filterTransactions(bool)", +"2b9e98b1": "changeFundingPercentages(uint256,uint256,address)", +"2b9edee9": "softCapReached()", +"2b9fd446": "isHatchOnCooldown()", +"2ba00198": "setBaseCap(uint256)", +"2ba0ab78": "EyeToken()", +"2ba0b09f": "AddNewCategory(bytes4,uint8,uint8,address)", +"2ba11f2a": "CONVERSION_DECIMAL_FACTOR()", +"2ba1e439": "createOraclizeCallback(bytes32,uint256,uint8,uint256)", +"2ba25366": "mintInBatches(address[],uint256[])", +"2ba29217": "canExecute(uint256,uint256)", +"2ba2a853": "thelnwaonToken()", +"2ba2d714": "LordXChain()", +"2ba2ed98": "setMagicNumber(uint256)", +"2ba5390f": "isFirstPartReleased()", +"2ba5b90d": "get_number_of_DBs()", +"2ba665e5": "getDoc(uint256)", +"2ba6d8fe": "PRESALE_WEI_CAP()", +"2ba73c15": "setCOO(address)", +"2ba7910a": "provider1()", +"2ba7fc87": "tgeIssuer()", +"2ba8b7e4": "getMinimumAuctionPrice(uint256)", +"2ba8f526": "OfferToGuardian(uint256,uint256)", +"2ba96462": "supportsERC165Interface(address,bytes4)", +"2ba996a5": "getListedTokens()", +"2baa2c58": "disqualifyBid(address,bool)", +"2baab935": "Fuschain(address,uint256)", +"2baabbf7": "finalSupply()", +"2babd014": "sellSecond(uint256)", +"2bac0b3b": "vendingCreateCollectible(uint256,uint256,address)", +"2bac276b": "badgeTransfer(address,uint256)", +"2baeceb7": "decrement()", +"2baf2acb": "mintTo(address,uint256,uint256)", +"2baf4f22": "_safeFalse()", +"2bafc817": "EpietherToken()", +"2bb03ab9": "earlyPresaleEDUSupply()", +"2bb03f6d": "ValidateCitySnapshot(address,uint256)", +"2bb0e10b": "serviceAccount()", +"2bb14104": "myData()", +"2bb20f4a": "soulsSold()", +"2bb22480": "calculateDrugSell(uint256)", +"2bb3dcc8": "totalInvocations()", +"2bb4c7d5": "STribeToken()", +"2bb51a05": "EDEX(address,uint256,uint256,uint256)", +"2bb685bc": "kill2()", +"2bb6ccf1": "delAuditAddress(address,address)", +"2bb70e54": "lockMasterTransfers()", +"2bb768f0": "adminGetCityData(address)", +"2bb77b8e": "setRewardAddr(address,address)", +"2bb81546": "getClaim(string)", +"2bb9cb1d": "buyXid(uint256,uint256,bytes32)", +"2bb9ffef": "startBalance()", +"2bba2d6d": "changeInvitedReward(uint256)", +"2bbb44b8": "adminCreat(address)", +"2bbc50b5": "getTotalInvestedEur()", +"2bbc9396": "periodICOStage2()", +"2bbd3c93": "ART_CONTRACT_ADDRESS()", +"2bbd59ca": "messages(bytes32)", +"2bbd84e8": "totalPurchaseValueInWei()", +"2bbd88f3": "LOBO()", +"2bbd9530": "unregisterAddress(bytes32)", +"2bbdb18a": "hasEnoughApproval(uint256,uint256)", +"2bbe62d6": "createSetup(address,uint256,uint256,bool,address,uint256)", +"2bbeac91": "lockTokenHolder()", +"2bbf532a": "isUnlocked(address)", +"2bbf54e8": "isBuyStopped()", +"2bc06a92": "canSend(address)", +"2bc0fe34": "infoMining(address)", +"2bc24d52": "IXTPaymentContract(address)", +"2bc31ca4": "developers()", +"2bc3217d": "forbid(address,address,bytes32)", +"2bc3656c": "buyTokensPreSale(address,uint256)", +"2bc38531": "setup(string)", +"2bc3a349": "GWTCrowdsale()", +"2bc402fa": "TOTAL_PREALLOCATION()", +"2bc40f9a": "setAddressUInt8(bytes32,bytes32,address,uint8)", +"2bc43fd9": "claim(address,uint256,uint256)", +"2bc46f27": "getQuestionIndex(uint256)", +"2bc4aa1a": "showInvestEther(uint256)", +"2bc53254": "priceFci()", +"2bc542a4": "votePublic(address,bool)", +"2bc57d73": "_doTransferFrom(address,address,uint256,bytes,address,bool)", +"2bc588ee": "release(uint256[],uint256[])", +"2bc5ca7a": "fullCycleSellBonds(uint256)", +"2bc5f9cb": "updateRateInWei()", +"2bc6597c": "depositsTillNow()", +"2bc67bde": "MIN_TASK_VALUE()", +"2bc80f3a": "T()", +"2bc85d5d": "updateTokenPriceProvider(address)", +"2bc86dc0": "AddBankerRound(uint8)", +"2bc89ff6": "REV()", +"2bc8ba53": "solicitaPagamento(uint256)", +"2bcb849c": "updateFeeProvider(address)", +"2bcbdf7f": "s29(bytes1)", +"2bcbe1b5": "getCelebrity(uint256)", +"2bcc79a7": "MockDeed(address)", +"2bccf04e": "createSale1()", +"2bce9e7b": "updateToken(address,uint256)", +"2bcef221": "signOne()", +"2bcf300e": "LC(uint256,string,string)", +"2bcf5760": "addToken(address,address,uint256,uint256,uint256,uint256)", +"2bcf892c": "div32(uint32,uint32)", +"2bcfcd7b": "getBonusAmount()", +"2bcfe0a6": "FitToken()", +"2bd00610": "numberOfCyclePlayers()", +"2bd0bb05": "totalSpentPerDay(uint256)", +"2bd0ce0f": "cancelBuyTokenOrder(uint64)", +"2bd152f0": "_getCollectibleDetails(uint256)", +"2bd15c25": "_doCancel(uint256)", +"2bd185e5": "appendTokenHolders(address)", +"2bd21738": "CAIDCrowdsale(address,address)", +"2bd2523e": "cooAddReviewer(address)", +"2bd2a965": "openNextSale(uint256,bytes24,uint256,bytes24,uint256)", +"2bd30ca3": "costContract()", +"2bd4aa40": "total_amount(string,uint256,uint256)", +"2bd543c7": "calcTimedQuota(uint256,uint256,uint256,uint256)", +"2bd55918": "confirm_token_deposit()", +"2bd57604": "claimPlotMultiple(uint256[],uint256)", +"2bd579fc": "ico(uint256,uint256,uint256,uint256,uint256[],uint256[])", +"2bd5a48d": "finishMintingToken(uint256)", +"2bd5e353": "phase3Duration()", +"2bd71875": "hasMissedCheckpointSubmission()", +"2bd75c3c": "sendMarketingAndRNR()", +"2bd7cd17": "killToken()", +"2bd7e5fc": "getSGNAuthorizationManager()", +"2bd928e4": "commonDeposit(address,uint256)", +"2bd9530a": "editGas(uint256,uint256)", +"2bd97c6d": "getDawexSignature(string)", +"2bda04c5": "autoFreeze()", +"2bda1a55": "frozenReserveTeamRecipient()", +"2bda2a49": "BHIMToken()", +"2bda4eee": "getBridgeValidatorsInterfacesVersion()", +"2bdad637": "tokensSupply()", +"2bdb0d92": "getShareToken()", +"2bdb33c3": "getNumberOfDisputedDealsProPatient()", +"2bdb7097": "setRate(address,uint256)", +"2bdbc0ce": "ContractTokensReclaimed(uint256)", +"2bdc05c5": "assertEq26(bytes26,bytes26,bytes32)", +"2bdcd90d": "claimChip(uint256,string)", +"2bdd2290": "setBlockNum(uint256)", +"2bdd530b": "holderReferalTokens()", +"2bdd5958": "Purchased(address,uint256,uint256,uint256)", +"2bddb9b5": "canTransferIfLocked(address)", +"2bddc31c": "coauthor()", +"2bde41e1": "submitRing(address[3][],address,uint256[7][],uint256,uint8[1][],uint8,bool[],uint8[],bytes32[],bytes32[],uint256,uint16)", +"2bde8e96": "getGPShashRandomValue()", +"2bdf66d5": "SmartToken(string,string,uint8)", +"2bdfbd39": "finaliseCrowdsale()", +"2be09561": "startMint()", +"2be10384": "_removeKey(address)", +"2be29d71": "addressPartnerships()", +"2be2ad3c": "logUniverseForkedCalled()", +"2be2d95e": "amountOfInvestments()", +"2be2f085": "getCostForRace(uint8)", +"2be32dbb": "categoryCount()", +"2be3d1c9": "_getDroneDefaultAbility(uint256)", +"2be3d2df": "CreamCoin()", +"2be4a903": "removeUsers(address[])", +"2be4f3f5": "boardCost()", +"2be4fd9c": "getRemainManus()", +"2be51660": "calcTime()", +"2be521b2": "increaseBalance(address,address,uint256)", +"2be52293": "setExchangeOracle(address)", +"2be596ee": "unpauseInternal()", +"2be5e93a": "TOTAL_SUPPLY_UPPER_BOUND()", +"2be64f51": "RegisteredCampaign(address,uint256,address)", +"2be65e2a": "getFree()", +"2be65e45": "setMarketingRates(uint256,uint256,uint256)", +"2be6d43c": "ARKTagger_1_00()", +"2be6ec1f": "NULL_ENCRYPTION_ALGORITHM_ID()", +"2be79833": "nonFungibleRegistry()", +"2be86e01": "jcrUsdRate()", +"2be8c2a5": "transferTokensTo(address,uint256)", +"2be8f373": "changeWLMWallet(address)", +"2be90846": "enableBonus()", +"2be98d38": "HourglassV2()", +"2be9da97": "getBestAngel()", +"2beaead0": "lastDivideRewardTime()", +"2beaf416": "ShareXERC20()", +"2bec76fd": "maxBetCoinDice()", +"2becb6f7": "STARTING_SPERM()", +"2bed55b0": "buildDSEasyMultisig(uint256,uint256,uint256)", +"2bed69e0": "founderPercent()", +"2beea5c5": "testhash(uint256,uint256)", +"2beeaca4": "whitelist(address,string)", +"2bef4595": "authorize(address,address)", +"2bf04304": "whitelistAddresses(address[])", +"2bf0aeda": "DigiToken()", +"2bf1aa1d": "EthHodler(string,uint8,string)", +"2bf1f9da": "restart(bytes32,bytes)", +"2bf29ddb": "EventRedeemRisk(address,uint128,uint256,uint256)", +"2bf34551": "setRate340()", +"2bf34e60": "getUuid(uint256)", +"2bf37c42": "addFunds(uint256,address)", +"2bf435f9": "myMethod(string)", +"2bf4760b": "getEthPerfit(address)", +"2bf4d812": "AumentaToken(uint256,address)", +"2bf4e53d": "getCurrentShareholders()", +"2bf59135": "addLootbox(address,uint256)", +"2bf5a2ea": "mintForFounders()", +"2bf6e0a5": "setContract(address,address)", +"2bf7299b": "setMaxParticipants(uint256)", +"2bf79c94": "getTokenByOwner(address)", +"2bf7d279": "shouldRevertWithReturn(bool)", +"2bf7f6ba": "privateSell1LockEndTime()", +"2bf81dd3": "NPTToken()", +"2bf82843": "pay(address,uint128,string,uint32)", +"2bf885f0": "addNote(bytes32,bytes20,string)", +"2bf8faba": "AimiToken(address,uint256)", +"2bf9ab0b": "getPresellUpToTime()", +"2bfacd62": "calculateLockedBalance(address)", +"2bfaf3da": "Oracle(bytes32)", +"2bfc33ee": "KDI()", +"2bfc4c69": "getStringValue()", +"2bfd2a13": "calculate_dividend(uint256,uint256)", +"2bfd2e06": "buyBasicUnit(uint256,uint256)", +"2bfd91d4": "getMessageSigner(bytes32,uint8,bytes32,bytes32)", +"2bfda313": "getFile(uint256)", +"2bfe243f": "minStartPriceForCommishAuctions(uint128[])", +"2bfea0e4": "unpauseTransfer()", +"2bfefd5c": "calcMultiStage()", +"2bff4b66": "reapFarm(address,address)", +"2bff5630": "coachTakeOff(uint256)", +"2bff5fc4": "Incomplete()", +"2bffc7ed": "add(string,address)", +"2c011e7b": "winning_month()", +"2c01bb1c": "LogNewOwner(address)", +"2c01d52b": "_createRegion(string,address,uint256)", +"2c027eb9": "getDeployArrayLength(uint256)", +"2c02d622": "precalculate()", +"2c035157": "calculate_minimum_contribution()", +"2c044779": "getPublic()", +"2c04bf0c": "transferIXT(address,address,string)", +"2c052031": "getInsertPointForNumTokens(address,uint256,uint256)", +"2c0657c2": "additionalBonusAmounts(uint256)", +"2c06862b": "setCanBuy(bool)", +"2c07398d": "registerObserver(address)", +"2c0784ce": "send_DividendToAddress(address,uint256)", +"2c089048": "tokenCreationInit()", +"2c08ab0c": "ENJCrowdfund(uint256,address)", +"2c08eb0b": "changeTokensPerEther(uint256)", +"2c0994c1": "getMicroWalletAddress(uint256)", +"2c09bef7": "priceSetter()", +"2c0a036b": "resetICO()", +"2c0a33ef": "BethereumToken()", +"2c0a3f89": "castVote(uint256,uint256)", +"2c0a5c08": "BuyIn()", +"2c0a7e33": "pendingEthWithdrawal()", +"2c0aadc1": "nextGameInitialMinBetSize()", +"2c0b9685": "distributeeBTG(address[])", +"2c0bec2f": "sendCurrentPayment()", +"2c0c6488": "AirTrafficController(string,address[],address,address)", +"2c0c8563": "SetCoin(address,address)", +"2c0d0dbe": "AddProduct(uint256)", +"2c0d4e70": "RYNOTE()", +"2c0e0054": "lockInGuess(uint8)", +"2c0e3850": "storeInContract(address,address)", +"2c0f13a7": "icoStartTimestampStage3()", +"2c0f7b6f": "numCampaigns()", +"2c0fc8cb": "registerHandle(bytes32)", +"2c10e90c": "update(address[],uint256[])", +"2c1169ac": "ELOT()", +"2c12cc79": "HuumanStandardToken(uint256,string,uint8,string)", +"2c1352cf": "contacts(address)", +"2c135b93": "marketCap()", +"2c138236": "reservedTokensWallet()", +"2c142511": "_offlineHash(bytes32,bytes32,bytes32)", +"2c145eef": "DutchAuction(address,address,address,address,uint256,uint256,uint32)", +"2c154345": "getParticipantStake()", +"2c16c6ca": "addPrivilegeAddress(address)", +"2c16cd8a": "record(uint256)", +"2c174073": "PeriodSale(uint256,uint256)", +"2c181929": "getChainWork()", +"2c183fad": "mintTokenWithUnit(address,uint256)", +"2c197985": "VirtualExchange(address,address)", +"2c199889": "request(string)", +"2c19d480": "emitAccessGiven(address,bytes32)", +"2c19fbbb": "getUserTX(address,uint256)", +"2c1b17e4": "BonBonToken(address)", +"2c1b38ee": "isValidTokenId(uint256)", +"2c1bcb4f": "ContractLocked(uint256,string)", +"2c1cf6f6": "updateTradeStatus(bool)", +"2c1cf78b": "ETHinvested()", +"2c1d68d4": "countStakeHolders()", +"2c1e064b": "_translateWSIC(uint256)", +"2c1e6e48": "getADminFromDutchProxy(address)", +"2c1e816d": "setAdminAddress(address)", +"2c1ea461": "nextController()", +"2c1eed5f": "isPlayer(address,address)", +"2c1f1f8f": "getFreeBalances()", +"2c1fecfe": "isRefundable()", +"2c1ff9f8": "mInviteAddr()", +"2c203edd": "getOrderDetails(uint256,uint256)", +"2c2146aa": "verify(address,address)", +"2c215998": "updateStatus(string)", +"2c21ec94": "ethUpdates(uint256)", +"2c2206e4": "setAuditReportHash(uint256,string)", +"2c22af02": "cidTokenSupply()", +"2c22f2e2": "burnSplitPercent()", +"2c232609": "dislikeCelebrity(uint256[],uint256[],uint256)", +"2c237912": "processSellRequestFiat(uint256,uint256)", +"2c23f91a": "ignoreTokenFallback(address,bool)", +"2c244618": "calculateVestedOptions(uint256,uint256,uint256)", +"2c24909c": "getVotedTokensPerc()", +"2c24ecc7": "BecToken()", +"2c2622db": "LOCK_SLOTS()", +"2c2689b5": "getModuleAddress(string,string)", +"2c270617": "TempleDonationTrackingNote()", +"2c270c7e": "tokensFor1EthP2()", +"2c276699": "CheckOut(uint256)", +"2c27e581": "publicEndTime()", +"2c28aa1b": "RATE_FOR_WEEK3()", +"2c28f579": "goLive()", +"2c296656": "changeRequiredDevSignatures(uint256)", +"2c297478": "prolongH(uint256)", +"2c29eedd": "startPrivateSale(address,uint256,uint256)", +"2c2aa66c": "PokeCentral()", +"2c2aecf5": "isProcessNeeds()", +"2c2b4358": "setPercentOfPool(uint256[])", +"2c2bc50b": "LOWIQ()", +"2c2ccdfb": "kittyCoreAddress()", +"2c2da3cf": "expPercentage()", +"2c2de40a": "setMaximumSellableTokens(uint256)", +"2c2e3abe": "allocateFoundersTokens()", +"2c2fdc35": "getBalanceFromRound(address)", +"2c305abf": "updatePlayedNum(address,address,uint256)", +"2c308714": "returnBetAndOffer(uint64)", +"2c321ea1": "abToken()", +"2c327538": "ProofOfDiligenceToken()", +"2c329e99": "Last_block_number_and_bloctime_used()", +"2c344d14": "tokenRewardPreDGZ()", +"2c349627": "pauseToken()", +"2c34ce05": "increasedPrice()", +"2c34e6b9": "addDepositQuest(address)", +"2c354067": "executionBlockOf(uint256)", +"2c3597a1": "testToUint64()", +"2c3599a5": "VINToken()", +"2c3788b1": "registerUserIfNeeded(uint256)", +"2c37a512": "bountyLockEndTime()", +"2c39d855": "confirmAndForward(address,uint256,bytes,bytes32,uint256,uint8,bytes32,bytes32)", +"2c39da94": "batchSend(address,uint160,uint256[])", +"2c3a15a0": "EidosToken(address,address)", +"2c3a1d5d": "Nerotoken()", +"2c3af973": "GStarToken()", +"2c3ba9e1": "addManyRegistered(address[])", +"2c3c42b2": "WLM()", +"2c3ca924": "handleProductionIncrease(address,uint256)", +"2c3ccb98": "levelUpByPenguinId(uint256)", +"2c3d3453": "csale()", +"2c3d38f0": "mintTokens(int256,uint256,address,address)", +"2c3dcdcf": "issueDuringICO(address,uint256)", +"2c3dfca7": "getPhException(bytes32)", +"2c3ee88c": "getRedeemAmount(uint256)", +"2c3f1304": "getSlotLength()", +"2c3f6a4f": "getMineCooldown(uint256)", +"2c3f9b80": "getActiveFlagRate(uint16)", +"2c408059": "getFallbackAddress()", +"2c409871": "MobileTokenAlert()", +"2c416754": "doBurn(address,address,uint256,bytes,bytes)", +"2c420201": "getDataCounterForSubject(uint256)", +"2c421074": "exploreETHFee()", +"2c425687": "EthTeamContract(string,string,address,uint64,uint64,address)", +"2c42f2e8": "toSendFromStorage()", +"2c4449ab": "_rankByNumber(uint256)", +"2c445273": "_payEthereumAndDistribute(uint256)", +"2c4464d4": "Dryad()", +"2c4482c5": "_assignCountry(uint256)", +"2c44a261": "updatePrivateSaleCloseTime(uint256)", +"2c45f068": "transfer(uint128,bytes16,uint32)", +"2c4617d7": "getMethodState(string)", +"2c46b205": "query()", +"2c46d8d5": "EndRound(uint256)", +"2c47413f": "ERC20PGEToken()", +"2c4806d8": "ordersFor()", +"2c4879d1": "AFWBurn(uint256)", +"2c4881ff": "withdrawMoneyByAdmin(uint256)", +"2c48e7db": "confirmTransfer(uint256)", +"2c4a84f7": "StaxToken()", +"2c4ab666": "enact_withdrawal_greater_equal(address,uint256,uint256)", +"2c4ac770": "sendMessage(address,bytes,bytes32)", +"2c4aecc1": "sampleBoolRetFalse()", +"2c4b2334": "setTeamWalletAddress(address)", +"2c4b27ae": "burnAirDrop(address[],address)", +"2c4bca2c": "crowdsaleDeadline()", +"2c4bf8bc": "increasePresetTransfer(address,uint256)", +"2c4c2719": "MAXIMUM_CAP()", +"2c4cb4be": "removeRegistryFromNameIndex(address)", +"2c4d25f5": "DeathFactor_ii()", +"2c4d4d18": "changeMinter(address)", +"2c4e55c5": "killedContract()", +"2c4e591b": "totalGames()", +"2c4e722e": "rate()", +"2c4e8885": "unLinkFromMasterWalletInternal(address,address)", +"2c4e9d2b": "AuctionWon(uint64,uint64,address,uint256)", +"2c4ee4d4": "ObirumTalk()", +"2c4fa8b2": "assignAnotherOwner(address)", +"2c5104f5": "MTC()", +"2c511788": "addToWhitelistAllocation(bool,address,uint8)", +"2c512d6e": "getTokens(address,uint256)", +"2c526196": "_mint(uint256)", +"2c52d930": "feeForArtWorkChangeRequest()", +"2c532a71": "ChangeCrowdSaleDate(uint8,uint256)", +"2c5337dd": "winnerAnnounced(address,uint256)", +"2c53f31b": "bonusWindow2EndTime()", +"2c54357f": "lifeReserveAllocation()", +"2c54de4f": "transferToken(address,address,address,uint256)", +"2c54e6d9": "getCanvasCount()", +"2c560ec0": "queryInfo()", +"2c56462f": "addAllowedContract(address)", +"2c566ae5": "length(address)", +"2c572eb5": "_isFuture(uint256)", +"2c574a94": "next_tower_index()", +"2c577347": "changeMakeFee(uint256)", +"2c57fdf4": "create(uint8,uint8,uint64,uint64)", +"2c580a35": "revokeAndReclaim()", +"2c58139c": "teamRelease(address)", +"2c5a736f": "distributeInitialFunds()", +"2c5af544": "isAllocatedLending()", +"2c5b3b5b": "UniverseChain()", +"2c5c8f7c": "getDailyProfitSumForAllUsers()", +"2c5c9dc5": "BeldenCoin(address)", +"2c5cb666": "setCollectFeeWindowReportingFees(uint256)", +"2c5d0546": "KuaiToken(address,uint256)", +"2c5d690d": "getBlocksUntilReset(address)", +"2c5e52d1": "CandyDropIsOpen()", +"2c5f5234": "collateralisationRatio()", +"2c5fac89": "isIcoSucceeded()", +"2c6009a6": "viewPeerToPeerMarketplaceTransactionFee()", +"2c60a055": "MapTest()", +"2c6105f9": "setElectedMediator()", +"2c6127c7": "availableBets()", +"2c6287b2": "yunosupporttuples(bytes4,int32,bool)", +"2c629299": "allOperations()", +"2c62fa10": "assetsOf(address)", +"2c62ff2d": "deleteBool(bytes32)", +"2c638806": "totalPaymentsHeld()", +"2c63b326": "memoryArray(uint256)", +"2c63e4b9": "removeExpiredAssignments(address,uint256,uint256)", +"2c642950": "createBallot(string,bytes32[],uint256)", +"2c642f51": "sendDividends(address,uint256)", +"2c64b05f": "LockEDUTeam()", +"2c664701": "profit_per_token()", +"2c66a604": "Blizzard()", +"2c678c64": "migrated()", +"2c67a8e5": "getItemsByOwner(address)", +"2c684eb6": "afterVoteNoCashBackTime()", +"2c684f30": "postListed(address,string,string,uint256,string,string,string)", +"2c68fcd4": "determineBonus(uint256,uint256,address)", +"2c69e64e": "refundBet(address)", +"2c69ed89": "BerryLake()", +"2c6a0140": "cutoffBlock()", +"2c6b2c92": "checkProfitLossSinceInvestorChange()", +"2c6b77e1": "admin_isPayable(bool)", +"2c6c1108": "autoTearDownAndDestruct()", +"2c6e38d0": "modifyNextPremiumSale(uint8,uint256)", +"2c6e4aea": "withdrawFundBeneficiary()", +"2c6e7598": "toAsciiString(address)", +"2c6e879f": "settingsSwitchState()", +"2c6ed612": "stringToBytes5(string)", +"2c6f11b8": "listApproval()", +"2c6f39fd": "setLicenseSalesContractAddress(address)", +"2c6fa230": "getServiceInformation(address,uint32)", +"2c6fa84c": "Pausable()", +"2c7077c0": "enableFeatures(uint256,bool)", +"2c70b7ca": "emitEntityResolution(address,address)", +"2c70d64e": "unVote()", +"2c710cc8": "closeInvest(uint256)", +"2c71d524": "IcoBonus(uint256)", +"2c71e60a": "grants(address,uint256)", +"2c71ecb6": "_startBlock()", +"2c72fdfc": "getProposals(uint256)", +"2c735ef8": "tradeStartTime()", +"2c740844": "setStakingRegistry(address)", +"2c757eed": "startPhase3(uint256)", +"2c7622b0": "txorigin()", +"2c767201": "admin_account()", +"2c76d586": "zint_bytes32ToString(bytes32)", +"2c78ba6f": "ArbTokFromHGame(uint256)", +"2c78bfdc": "burnCrown(uint256)", +"2c791826": "moiTestToken()", +"2c792276": "endRound(uint8)", +"2c79aea3": "minedTotalSupply()", +"2c7a64c7": "isOperationActive(bytes32)", +"2c7a8559": "setMaxGift(uint256)", +"2c7b0085": "PocketChain()", +"2c7ba564": "setTransferProxy(uint32,address)", +"2c7c4549": "PurchasableToken(uint256)", +"2c7cc1f0": "emergencyEthDrain(uint256)", +"2c7cce9e": "auctionMinPriceIncrease()", +"2c7e06a4": "rateEarlyStage1()", +"2c7ec2c2": "_fulfillPayment(address,address,uint256,uint256,address)", +"2c7ee894": "B2Lab_TokenPlus(address)", +"2c7ee946": "setting(uint256,uint256)", +"2c8082a6": "PiBetaSupply()", +"2c828e46": "TransferToken(address,uint256,uint256)", +"2c837334": "getPlot(uint256,uint256)", +"2c83d77e": "goforit()", +"2c84bfa6": "generate(address,bytes)", +"2c84d560": "OwnerWithdraw()", +"2c84e31f": "addAccounts(address,address,address[])", +"2c85448d": "isInt256ValidIn64(int256)", +"2c854d13": "AUTH_REMOVEOWNER()", +"2c8595bc": "updatePartnerMap(address,uint256,uint256,uint256)", +"2c85f8e0": "oraclize_query(string,string,string,uint256)", +"2c86033e": "checkAddressTeamOne(address)", +"2c8668d4": "withdrawNoLimit(address,uint256,uint256)", +"2c868287": "withdrawToTeamStep3(uint256)", +"2c86d091": "buyTokens(address,bytes32)", +"2c86d98e": "leverage()", +"2c86e3b4": "setContributor(string)", +"2c873761": "getMyDragons()", +"2c87aecc": "orders_sell_list(uint256)", +"2c87ba12": "getTitulaire_Compte_2()", +"2c882333": "vota_un_candidato(uint256)", +"2c887399": "confirm(bytes32,bytes32,bytes32,uint8,bytes32,bytes32)", +"2c88837e": "VotingRightsWithdrawn(address,uint256)", +"2c88fad9": "addWhitelistedAddr(address)", +"2c890550": "toPower2(uint256)", +"2c899ab6": "CecCoin()", +"2c89a84c": "ChronosAccessControl()", +"2c8ab429": "registerMeDao(address)", +"2c8ace6c": "TokenERC20(uint32,string,uint8,string,address)", +"2c8af2d8": "s_rand(address,uint256)", +"2c8b2ad7": "calculatePaymentGoal(uint256,uint256,uint256)", +"2c8b8b94": "addAccreditedInvestor(address,uint64,uint64,bool,bool,uint256,uint256)", +"2c8bcd1a": "createBid(uint256,address,address,bytes32,uint256,uint256)", +"2c8be60e": "ONO()", +"2c8c047a": "ownerOperationsAt(address,uint256)", +"2c8c28a7": "loadNewTickets(bytes32[])", +"2c8c892b": "allocateSalesTokens(address,uint256)", +"2c8ca0ea": "isFinish()", +"2c8cbe40": "setFreeze()", +"2c8df693": "ServiceProviderEnabled(address,bytes)", +"2c8e3ebb": "secondRefundRoundRateDenominator()", +"2c8ed4c4": "_toToken(uint256,uint256,uint256)", +"2c8ee2ec": "checkWin(uint256,address)", +"2c8f1b71": "socialIdentityOfClaimerAddress(uint256,address)", +"2c906ba2": "finishLottery()", +"2c90ccba": "getNextAuditByPrice(uint256,uint256)", +"2c90d20d": "getWarriorsFromIndex(uint32,uint32)", +"2c91324c": "usersAddress(uint256)", +"2c915aa3": "assetAddresses()", +"2c92a2bc": "minWithdrawalThreshold()", +"2c92c071": "_addPayTable(uint16,uint16,uint16,uint16,uint16,uint16,uint16,uint16,uint16)", +"2c92e5b7": "BlockspacesToken()", +"2c92fb99": "getFilter(uint256)", +"2c948034": "longTermbudgetAllocAddress()", +"2c94a235": "profitTransferTimeSpan()", +"2c95ad52": "addItem(bytes32)", +"2c960569": "updatePriceOraclize()", +"2c9619ce": "FCOIN1036Token(uint256,string,string,uint256)", +"2c96bee2": "MultiSigTokenWallet(address[],uint256)", +"2c9868df": "approveAndCall(address,uint32,bytes)", +"2c98bf4a": "WelcomeMsg(string)", +"2c995e1b": "AllowTransferGlobal()", +"2c9a0a95": "getPricingStartsAt()", +"2c9a86d2": "payCarnita(uint256,uint256)", +"2c9afb18": "addrFabricContract()", +"2c9b1625": "FUTMOTO()", +"2c9c0fb5": "modifyTransferableHash(address,bool)", +"2c9cdfd9": "Provider(string,string)", +"2c9d6989": "withdrawDklBalance()", +"2c9d9e9e": "getCommitByContent(string)", +"2c9e1885": "setBZxVault(address)", +"2c9ea1b7": "nextSkinId()", +"2c9f092f": "refundToOwner(address)", +"2c9f4f62": "isPurchased(uint256)", +"2c9f6792": "emaPeriods()", +"2c9f9fed": "tokenInit()", +"2c9fcd8c": "Donator()", +"2ca0228a": "initialTokenPrice()", +"2ca0c835": "referrerBonusCalculate(uint256)", +"2ca0d7ca": "batchTransfer1(address[],uint256)", +"2ca126f8": "endtime()", +"2ca15122": "sign()", +"2ca16a37": "publish(bytes32,string,uint256)", +"2ca1aa16": "currentSaleLimitPerAddress()", +"2ca1b7da": "CROWDSALE_ETH_WALLET()", +"2ca23c4f": "KapelaToken()", +"2ca2537e": "changeNotSoldTokens(address)", +"2ca26866": "Tccchain(uint256,string,string)", +"2ca33e70": "YoutubersCoin()", +"2ca36da0": "left39(uint256)", +"2ca38363": "priceEth()", +"2ca59abf": "changeCollateralTaker(address)", +"2ca5a623": "change_flag(uint256)", +"2ca5e3f5": "replyAlice(uint256)", +"2ca5e626": "getOrder(uint32[8])", +"2ca60d85": "versionIdent()", +"2ca6d2c0": "getAccountSize(address)", +"2ca76003": "checkWinner(uint32)", +"2ca781f1": "firstPay()", +"2ca8c6d3": "numberOfBets()", +"2ca8cbd0": "minePhx()", +"2ca9cbe8": "distributeToken(address,uint256)", +"2caafb54": "totalFreezeTokens()", +"2cab00de": "buildPrice()", +"2cab6c6a": "editTile(uint16,uint16,uint8,uint16,address)", +"2cacb97c": "GetProfitEarnedByPartner(address)", +"2cacd13a": "takeOrder(uint256,uint256,uint256)", +"2cad9404": "salvageFinished()", +"2cae0c76": "crowdSaleIsOver()", +"2cae249a": "rvDepositAddress()", +"2cae66d8": "encodeRequest(uint128,address,address,address,uint256,uint64,address,bytes)", +"2cae8ae4": "getPayload()", +"2cae9add": "rawTokenSupply()", +"2cae9ca1": "spendWithGas(address,uint256,uint256)", +"2caeb8fc": "checkMyUndistributedBalance(uint256)", +"2caed832": "partOf(uint256,uint256)", +"2caef765": "setBoardController(address)", +"2caf1f15": "set_tickerQuery(string)", +"2cb0d48a": "setEditable(bool)", +"2cb0de18": "setFeeAccountToken(address)", +"2cb15864": "initialBlock()", +"2cb2f52e": "updateTokenMetadata(uint256,string)", +"2cb3ce8c": "TIER3_RATE()", +"2cb44156": "minterGivesCWC(address,uint256)", +"2cb4f63e": "price_target()", +"2cb51970": "_batch4_icosaleStartTimestamp()", +"2cb58378": "getStateRoot(bytes32)", +"2cb676be": "NVBSupply()", +"2cb6a435": "oneTimePrice()", +"2cb71af3": "startBuyback(uint256,uint256)", +"2cb8460c": "PlutusDex()", +"2cb856f3": "dgxContract()", +"2cb86824": "preIcoStartAt()", +"2cb8f2e9": "executeBet(uint256,bool)", +"2cba85c6": "popcontract()", +"2cbb827f": "withdrawToSelf(uint8)", +"2cbbbd2d": "SHIPToken(address,address)", +"2cbbd738": "getPoll(bytes32)", +"2cbcaba9": "SimpleICO()", +"2cbdb5fb": "addChunk3ToWhiteList()", +"2cbe679b": "Travelerscash()", +"2cbef0f3": "getAffiliateCommission()", +"2cbf1b12": "CirclePay()", +"2cbf1f0d": "left62(uint256)", +"2cbf4e27": "removeParticipant(address,address)", +"2cbf9cf6": "MintableToken()", +"2cbfd034": "intCallWithArray(uint8[4])", +"2cc0a28c": "_matchedTags(bytes32[],bytes32[])", +"2cc0b254": "init(address,bytes32)", +"2cc138be": "rewardStartTime()", +"2cc1b92a": "addr_communityBuildingToken()", +"2cc205d9": "totalStakedFor(address,address)", +"2cc27341": "setMinMargin(uint256)", +"2cc361a6": "removeTank(address)", +"2cc53743": "GxEvents(address)", +"2cc5cfd6": "withdrawDevelopersFund(address)", +"2cc5d662": "arawWallet()", +"2cc63332": "returnCoupon(address[2],uint256[8],uint8,bytes32[2])", +"2cc689f9": "markRewardsSet()", +"2cc695de": "addCertification(address)", +"2cc6cf4a": "BABI()", +"2cc6d768": "RecordingRefundVault(address)", +"2cc75331": "getTeamsOnLeaderboard()", +"2cc763e7": "milliPercent()", +"2cc7c475": "TokenSaleCreation(uint256,address)", +"2cc7fc36": "ICOPurchased(uint256)", +"2cc82225": "setPriceCreatingChannel(uint256)", +"2cc82655": "setPhase(uint256)", +"2cc88401": "wirePurchase(address,uint256)", +"2cc8b455": "recoverAddressFromWithdrawMessage(bytes32,address,uint256,bytes)", +"2cc92b2b": "isICOOpened()", +"2cc9636c": "buyerCancel(bytes16,address,address,uint256,uint16)", +"2cc9c151": "verifyOwnership(address)", +"2cca179d": "addPoll(uint256,uint256,bytes,uint8)", +"2cca23f1": "Timeless()", +"2cca5ce3": "setEngine(address,bool)", +"2cca664b": "totalPlayerWinnings()", +"2cca75d3": "StupidCoin()", +"2ccaa3e9": "getPropertyOwner(uint16)", +"2ccb1b30": "transferTo(address,uint256)", +"2ccbd053": "set(uint256,string,string,string,string,string)", +"2ccc452d": "pushByte(bytes32)", +"2ccc9057": "RATE_CROWDSALE_S3()", +"2ccce58a": "cancelGame(string)", +"2ccd0991": "extraData1FromHash(string,string,string,string,string)", +"2ccd9623": "referralManager()", +"2ccdbc25": "prometheusVouchersMinted()", +"2ccde4bd": "withdrawAllUncommittedTokens()", +"2cce0c60": "eth_to_usd()", +"2cce4abe": "_finishNoCallback()", +"2cce753a": "batchAddAddresses(address[])", +"2cce81aa": "getBlockHash(int256)", +"2ccf16f9": "CashPoints()", +"2ccf27bb": "PatrickHuynhToken()", +"2ccf8d40": "HVAL()", +"2ccfc58c": "FeesReceived(address,uint256)", +"2cd046eb": "countMembers()", +"2cd05122": "ZENOSEarlyPurchase()", +"2cd05248": "lastBlock_f3Hash_uint256()", +"2cd11849": "depositAdvisor(address,uint256)", +"2cd19faf": "_getAdminInterface(uint256)", +"2cd1bab2": "partnerID()", +"2cd2338f": "thawAddress(address)", +"2cd23d7a": "createCommit(bytes32,bool,bytes32,string,uint256)", +"2cd33a54": "eth_amount()", +"2cd3fd70": "BurnTokens(uint256)", +"2cd44064": "UNHCToken(uint256,string,string)", +"2cd53cfe": "addEducation(string)", +"2cd6305f": "unsellpause()", +"2cd64f65": "TokenMintGeneral()", +"2cd78450": "activateExportFeeChargeRecord(address)", +"2cd8c9ae": "fillPhase(uint8,uint256,uint256)", +"2cd9e233": "Quarters(address,uint256)", +"2cda1bf7": "titles(uint256)", +"2cdad41c": "isInspector(address)", +"2cdb0213": "dailyHourLimit()", +"2cdb8eec": "updateTokenValue(address,uint256)", +"2cdba70e": "_getMaxPooling()", +"2cdc1c74": "lister()", +"2cdcb1fc": "wrongManagerOrUnsetInClaimer()", +"2cddc488": "transferTaxes(address,bool)", +"2cde15d1": "weiTotalRaised()", +"2cdedd5c": "StateChannel(address,address,address,address,uint256,bytes)", +"2cdf2bfd": "sellPatent(uint16,uint256)", +"2cdf37d4": "_admin(uint256,uint256)", +"2cdf55af": "RC()", +"2ce04b20": "tokenLockoutPeriod()", +"2ce0a6ee": "setBalanceLimit(uint256)", +"2ce0b4f6": "ICO_FINISH()", +"2ce0ca6b": "setChainFees(uint256[10])", +"2ce14d90": "_willFallback()", +"2ce1ec67": "HelloCoin(uint256,string,uint8,string)", +"2ce20579": "mutagen2Face(uint256,uint256)", +"2ce21999": "fees_(uint256)", +"2ce2907b": "CryptoCourt(uint256,string,string)", +"2ce2d7c0": "completeRegionAuction(uint16)", +"2ce37b10": "getListCount()", +"2ce3d440": "updateAccount(address)", +"2ce47de4": "payWinners(uint32,uint32,uint256,bool,uint32,uint32)", +"2ce52d9b": "shareCycleSessionSize()", +"2ce5c284": "processed()", +"2ce5fb75": "getHorseShoe(uint256)", +"2ce68269": "registerByList(address[],bool)", +"2ce78fc0": "getDemande(uint256)", +"2ce7900b": "getTokenTimelockCount(address)", +"2ce82189": "balanceTransferred(address,uint256,bytes)", +"2ce90c11": "killTokens()", +"2ce91d08": "TokensWorld()", +"2ce92dfd": "updateMinGasForDrawing(uint32)", +"2ce946a5": "teame()", +"2cea0654": "setStateClosedIfClosed()", +"2cea53bd": "returnChametz()", +"2cea70e4": "isAds()", +"2cea905a": "IAMEPrivateSale()", +"2cea9442": "totalUsdRaised()", +"2cead42c": "_createIntention(address)", +"2cead658": "Companion()", +"2ceae552": "AVAILABLE_BONUS1_SUPPLY()", +"2ceb1bb3": "addPreEntranceMembers(address[],uint256,uint256)", +"2ced7cef": "log(string,string,string)", +"2cedc5ec": "enableTokenAiTransfers()", +"2ceee12e": "seeBidders()", +"2cef4dac": "updateMasterCopy()", +"2cefc429": "sellCard(uint8,uint256)", +"2cefeb07": "setname(string)", +"2cf003c2": "referrer(address)", +"2cf033a0": "setNewTokenAddress(address)", +"2cf0be44": "transferToService(address,uint32,uint256,uint256,uint256)", +"2cf0d6ca": "PLAT()", +"2cf1a5fb": "airdropStatus()", +"2cf2f1d1": "rndReduceThreshold_()", +"2cf32bc9": "PayoutEarnings(address,uint256,uint8)", +"2cf3f1f3": "setTokenPerEther(uint256)", +"2cf42a6c": "cancelHybridization(uint256)", +"2cf45905": "addHpbNodeBatch(address[],bytes32[],bytes32[],bytes32[])", +"2cf4db51": "amountVote(bool,uint8)", +"2cf4e56f": "withdrawBounty()", +"2cf5346a": "totalSupplyAt(uint256,int256)", +"2cf5702a": "verifyPublic(bytes32,uint256,uint256[],uint256[],bytes32[])", +"2cf5fe89": "maxChildCount()", +"2cf65a06": "logite(string)", +"2cf6b532": "STARL()", +"2cf6e740": "adminSum()", +"2cf75c11": "_generateLog(uint32,uint8,uint32,uint8,uint8,uint8)", +"2cf86006": "calculateDividends(uint256)", +"2cf8a1d6": "CCRToken()", +"2cf91024": "getFlightInfo(uint16,uint16)", +"2cf9185c": "getMyPlayedCount(address)", +"2cf975af": "isPreferredTokensAccount(address)", +"2cf99422": "publish(address)", +"2cfa606d": "tvcEthFund()", +"2cfa74da": "buyKeys(uint256,string)", +"2cfac6ec": "teamSupply()", +"2cfbb031": "claimReward(bytes)", +"2cfbd0b9": "addNewBlock(bytes32,bytes32,bytes32[])", +"2cfc1f4c": "updateGift(uint256,uint256,string,string)", +"2cfc42f5": "blacklistParty(address,address,bool)", +"2cfd10a0": "CrowdsaleMain()", +"2cfd3005": "mint(address,bytes32)", +"2cfd35bb": "employeeMigratesToNewESOP(address)", +"2cfdd7df": "newReward()", +"2cfed9f0": "setSpeaker(address,address)", +"2d0041c5": "setAmbassador(address,bool)", +"2d00b442": "_createBid(bytes32,address,uint256)", +"2d0104a5": "updateFirstDuel1(uint256)", +"2d014833": "e93Contract()", +"2d01564c": "littContentExists(bytes32)", +"2d019a71": "get_asset_info(bytes32)", +"2d021624": "BTBToken()", +"2d02a5b2": "setGoldPrice(uint256)", +"2d0335ab": "getNonce(address)", +"2d03c4eb": "nxcPerBcy()", +"2d040add": "updateRegistrationState(bool,uint256)", +"2d042a7f": "PonziRevolutionBeam()", +"2d045780": "isAllowedToBuyByAddressWithoutVerification(address)", +"2d04d07d": "goTokenCollection()", +"2d04f820": "DEV_WALLET()", +"2d06177a": "addManager(address)", +"2d062140": "SiringClockAuction()", +"2d067d4c": "isBurn()", +"2d06a1fa": "ALFA()", +"2d06fd13": "getTotalDeveloperCut()", +"2d077ad0": "Latch()", +"2d07bf2f": "CryptoHarborExchange()", +"2d087944": "hasBuyNowOffer(uint256)", +"2d08d408": "Send(address[],uint256[])", +"2d09839f": "tokens_push(address)", +"2d0a8809": "testAddVoters()", +"2d0b1451": "DevotteToken()", +"2d0b7d53": "registerVariation(uint256,address)", +"2d0cc13c": "MoonMinerToken(string,string,uint8,uint256)", +"2d0d4827": "startIco1(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"2d0d9c2a": "getCompletedGamesStatistics()", +"2d0d9e0f": "getUserProductsKeys(bytes32)", +"2d0daca8": "assertEq25(bytes25,bytes25,bytes32)", +"2d0e6636": "tokenToEtherAllowed()", +"2d0f5573": "right35(uint256)", +"2d0ff779": "claimEOSclassic()", +"2d103ed4": "addAllowedHICAddress(address)", +"2d10d4d1": "getCityActiveBuildings(uint256,uint256)", +"2d116186": "deityBalance()", +"2d118bbf": "getUserPaybackPool()", +"2d11fa16": "throwsWhenTransferingPresaleTokensBeforeCliff(address)", +"2d123aa4": "useDefaultRegistry()", +"2d126239": "calcAndGet()", +"2d126d2b": "indCommunityDeposit()", +"2d129442": "mountainHeight(uint256)", +"2d132467": "buyPreIcoTokens()", +"2d133eee": "KYC_THRESHOLD()", +"2d136dd6": "TrillionToken()", +"2d139417": "migrateToNewNewControllerContract()", +"2d13c164": "_computePayMoney(uint256,address)", +"2d144e6b": "totalPlayerSupply()", +"2d1608db": "YouLongToken()", +"2d162c70": "distrust(address,uint256,bytes)", +"2d171243": "getUnitsProduction(address,uint256,uint256)", +"2d17d956": "buildRequest(string)", +"2d19413c": "setJackpotToken(address,uint256,uint256,address,uint256,uint256,uint256)", +"2d1a330b": "marketmorties()", +"2d1a6477": "lengthEqual(address[],uint256,string)", +"2d1a67e1": "Ledger(address,uint256,uint256)", +"2d1b42f5": "encryptCounter(uint256)", +"2d1babed": "setRates(uint256)", +"2d1c56a9": "totalTxVolume()", +"2d1ced82": "priceBox1()", +"2d1d744a": "isPass()", +"2d1d9627": "changeAddress(bytes32,address)", +"2d1d9feb": "removeRRA(address)", +"2d1e0516": "setBal(bytes32,address,uint256)", +"2d1f0021": "NextItemID()", +"2d1f0097": "getData_18()", +"2d1fb389": "authorize(address,bool)", +"2d1fdef6": "extendDeadline(uint256,uint256)", +"2d202d24": "setNextOwner(address)", +"2d20fbf3": "ownedBonus(address)", +"2d215518": "pause(uint256,uint256)", +"2d217d43": "AntasCoin()", +"2d21ca88": "ICOTokenHardCap()", +"2d226a10": "allocateServusTokens()", +"2d22a4e3": "isPrivateInvestmentPhase()", +"2d22b464": "createEgg(string,bytes32)", +"2d241248": "getFeeBurnerAddress()", +"2d24447a": "LBCoinJ()", +"2d247cc6": "coinPriceInWei()", +"2d278518": "EtherReceived(uint256,address,uint256)", +"2d278e9e": "picosPerEther()", +"2d27c8cd": "ALLOC_SALE_GENERAL()", +"2d2800f1": "react()", +"2d287e43": "insert(bytes32)", +"2d2899b6": "getIntArray(bytes32)", +"2d28bb02": "setTokenStart(uint256)", +"2d28d4cf": "transferIfTokenAvailable(uint256,uint256,address)", +"2d28e89d": "MINIMUM_DURATION()", +"2d290d8b": "MAX_CROWD_SALE_TOKENS()", +"2d2925c7": "transferInitialTokens()", +"2d296bf1": "buyToken(uint256)", +"2d29842c": "upgradePhoenixStats(uint256)", +"2d29953f": "withdrawByFoundation(address,uint256)", +"2d29a47b": "execute(uint256,uint256,uint256)", +"2d29b29b": "migrateSome(address[])", +"2d29c72d": "stopUpgrading()", +"2d2bb154": "kycWallet()", +"2d2bcd37": "setRelayContractAddress(address)", +"2d2c44f2": "Vault()", +"2d2c5565": "TREASURY()", +"2d2c9ed8": "softcapReachedCallabck()", +"2d2d23f7": "Cordbank()", +"2d2e3bb2": "deleteFincontract(bytes32)", +"2d2f7e4d": "withdrawBidForStar(uint256)", +"2d2f8f9b": "getAddListSize()", +"2d2fa531": "hank()", +"2d2fe9d4": "stakeWaived_Eth()", +"2d30ae45": "distributeCrowdsaleTokens(address,uint256)", +"2d31908f": "PRICE_7()", +"2d31d9c9": "sales(bytes16)", +"2d31f270": "UNTToken()", +"2d328551": "numberOfHalvings()", +"2d345670": "revokeAdmin(address)", +"2d345799": "balanceOfPretty(address)", +"2d349a1f": "icoLtc()", +"2d34ba79": "setup(address,address)", +"2d354cf8": "_isContract(address,address)", +"2d358710": "HARJToken(address,string,uint8,string)", +"2d35a8a2": "candidatesCount()", +"2d364687": "toLucky()", +"2d36ad42": "cleanUp(address)", +"2d370378": "switchSaleAuctionERC20For(address,address,uint256)", +"2d3727bf": "CloseDiv()", +"2d37329a": "lastBlock_v4Hash_uint256()", +"2d37e6dc": "getCrowdsaleInfo()", +"2d381f84": "ATTR_GOLDENGOOSE()", +"2d38bf7a": "rewardEra()", +"2d3a926a": "computeCut(uint256)", +"2d3b3141": "ERC20Standard(uint256,string,string,bool)", +"2d3b4643": "coresale()", +"2d3b634c": "Crowdsale(uint256,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"2d3b9e59": "isFinished(uint8)", +"2d3c5d28": "DonatedEthPayout(address,uint256)", +"2d3cb6bd": "mulX(uint256,uint256)", +"2d3d165d": "parameterizerFactory()", +"2d3d403a": "challengeContract(address,address,address)", +"2d3e2065": "minBetWei()", +"2d3e474a": "marketing()", +"2d3e579a": "hasRole(address,bytes32,address)", +"2d3e9efe": "mint(int256,bytes32,bytes,uint256[],bytes,bytes)", +"2d3ec656": "setMinimumIcoRate(uint256)", +"2d3ed075": "Certificate(bytes32,string)", +"2d3fb0d5": "getCrowdsaleState()", +"2d3fb721": "secondRoundICODiscount()", +"2d3fcc23": "beingVIP()", +"2d405b43": "Win(address,uint8,uint256,bytes32,bytes32,uint256)", +"2d40957f": "TheWinner()", +"2d4147e3": "bountyToken()", +"2d416b4d": "bindCertificate2Wallet(address,bytes32)", +"2d41777f": "SnapshotUpdated(address,uint256,uint256,string)", +"2d4194c7": "getAuditRequestBlockNumber(uint256)", +"2d41bc9b": "store(uint8[],uint256,uint256,uint256,uint256)", +"2d41c7a4": "Nikone()", +"2d434139": "addCustomerNReqAcc(address,address,address)", +"2d43573d": "landmarks(uint256)", +"2d4364ae": "placeTokens(address,uint256)", +"2d448c49": "setO2(address)", +"2d449b5e": "Etokenchain()", +"2d44c049": "modifyCreator(address,bool)", +"2d459dd6": "transfer(address,uint48,bytes)", +"2d45c78d": "requireAuthorisation()", +"2d46253f": "CommunityWithDraw()", +"2d462dbb": "rollLo()", +"2d467358": "LAPTOPTOKEN()", +"2d46a9ce": "getVestingCreatedAt(address,uint256)", +"2d46b54e": "hashMsg(bytes32,address,bytes32,address,uint256,bytes32,string,string)", +"2d46f5df": "registerProduct(address)", +"2d475386": "ownerWithdrawUnclaimedCredits()", +"2d47adcb": "BancorNetworkToken()", +"2d47c29e": "otherchainstotalsupply()", +"2d480a80": "thankYou()", +"2d483bec": "setNewRate(uint256)", +"2d48bcec": "pool_drain(address)", +"2d493910": "_computeNextPrice()", +"2d49f5fc": "verifyERC20(address)", +"2d49ffcd": "getLocked()", +"2d4a170a": "calculateBid(uint256)", +"2d4c4aea": "GOTGCOIN()", +"2d4d671f": "startRevealingPhase()", +"2d4e4472": "LandClaimExecuted(address,uint256,bytes)", +"2d4ede93": "deleteNode(address)", +"2d4f40c6": "setBotAddress(address)", +"2d4fd9dd": "rejectDispute(uint256)", +"2d501611": "PERCENT_BONUS()", +"2d50e2d5": "getSupercedesRegistryInterfaceID()", +"2d5132cd": "getOuvidoriaEnteNome(address)", +"2d5134f7": "setApplication(address,address)", +"2d52164b": "stopsell()", +"2d5216a5": "PHASE_CHALLENGE()", +"2d52d1a2": "rewardDistributionEnded()", +"2d54ab45": "initTokenSale(address,address,address,uint256,uint256,uint256)", +"2d54f04d": "changeVotingBlocks(uint256,uint256,uint256,uint256)", +"2d5505b6": "_setAreas(address,uint256)", +"2d550c0b": "optionality()", +"2d55dd31": "_agreeAmendment(address)", +"2d56acce": "setMinAcceptedInPublicSale(uint256,uint256)", +"2d56af6c": "burnCoin()", +"2d56d572": "releaseMany(address[],uint256[])", +"2d571013": "getFeedBackFeeAward(string)", +"2d571cc4": "createToken(uint256)", +"2d578304": "update(address,uint16,bool)", +"2d57b6c8": "getInvestorDeposit(address)", +"2d57ea40": "FundariaTokenBuy(address)", +"2d580ef6": "add(address,bytes32)", +"2d581e71": "add_user(address)", +"2d5858a3": "publicSoftCapReached()", +"2d58c9a2": "gy()", +"2d58fab1": "pauseCWC()", +"2d592a34": "sellKissBTC(uint256)", +"2d5949a0": "setNumMarkets(uint256)", +"2d596330": "bmcPlatform()", +"2d59680d": "pool_name()", +"2d598d7b": "isAccredited(address)", +"2d599750": "updateUrl(bytes32,string)", +"2d59dc12": "displayMessage()", +"2d59ea6c": "oscarGuindzbergAddress()", +"2d5a5d34": "blacklistAccount(address,bool)", +"2d5a858c": "checkCompanyNameAvailability(bytes32)", +"2d5b2e15": "CLIForGas()", +"2d5b778b": "refundingDeadline()", +"2d5b8d99": "paymentsOf()", +"2d5bbf60": "subscriptions(uint256)", +"2d5c3ed1": "KWHToken(address,uint256)", +"2d5cb5d5": "CryptoKitties()", +"2d5cd1d6": "getPrize(address)", +"2d5ea8e3": "numplayers()", +"2d5f1f61": "getSlashAmount(uint256)", +"2d5fd89f": "getClaimData1(uint256)", +"2d60a72c": "DEPOSITS_KEPT()", +"2d614ad2": "Webpuddg()", +"2d620e1e": "deedsOfOwner(address)", +"2d62ce38": "collectAirdrop(bytes32)", +"2d62f428": "coinIssuedSale()", +"2d63e9f4": "Registration(uint256,uint256,uint256,uint256,uint8,uint8,uint8,uint8,string)", +"2d63f728": "mintWithMetadata(address,uint256,string)", +"2d646742": "executeGameProposal(uint256,bytes)", +"2d658888": "RobotarTestToken(address)", +"2d6653a9": "seed_coins_vault1()", +"2d668da4": "returnAmountOfTmexAddressCanProduce(address)", +"2d66acf1": "fortune_open(uint256)", +"2d67a79e": "verifyAccount(address,string,string)", +"2d67bb91": "World()", +"2d6842b5": "admin_MinimalPayValue(uint256,uint256)", +"2d685f15": "takeSell(address,uint256,uint256,address)", +"2d68bad7": "withdrawForTo(address,address,uint256)", +"2d68bc6e": "saleProceedsEther(uint256)", +"2d68de95": "currentStageTokensCap()", +"2d690f28": "LogSetTokenPrice(uint256)", +"2d6a3482": "TradeListing(bytes32,address,address)", +"2d6acb3a": "RESERVE_POOL_ADDR()", +"2d6afbd0": "unlockWithSpend(uint256,address)", +"2d6b113a": "in_sharing_phase()", +"2d6c17a3": "rewind(uint256)", +"2d6c25fa": "recommendedPrice(uint16)", +"2d6c5a84": "reverter(uint256)", +"2d6d1646": "untokenize()", +"2d6d372d": "getAccountWei(uint256)", +"2d6d4caa": "addtoContributos(address,address,uint256,uint256)", +"2d6ddfda": "closeModifyCountdown()", +"2d6df368": "borrarRegistro(bytes32,bytes32)", +"2d6e2bb0": "regularHold()", +"2d6ef310": "closeGame(uint256)", +"2d6f70f7": "transferViaTokenTransferProxy(address,address,address,uint256)", +"2d6f8049": "setBountyTokensReserve(uint256)", +"2d6fc906": "setBonuses(uint256,uint256,uint256)", +"2d703f88": "getMeeting(uint256)", +"2d706a34": "isName(address)", +"2d710551": "UlleToken()", +"2d7243ef": "payTodayReward(address)", +"2d740722": "close_pre_ico()", +"2d75c39a": "_removeClearingPriceValidator(address)", +"2d762b0d": "changeTokenContractAddress(address)", +"2d76a85a": "PundiXCash()", +"2d76be2d": "player_getPendingTxByAddress(address,address)", +"2d76d7b0": "releaseTokensByAddress(address)", +"2d774da2": "isSetFund()", +"2d776793": "downvoteComment(bytes32,bytes32,bytes32)", +"2d7788db": "rejectRequest(uint256)", +"2d78737b": "CreateUpgradeCards(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"2d78b7fc": "_withdrawInvestorTokens(address)", +"2d7aa82b": "initialize(uint256,uint256,uint256,uint256,uint256,uint256)", +"2d7ae086": "MarkHours(bytes32,bytes32,int256,bool)", +"2d7af0f4": "transferLoan(bytes32,address)", +"2d7b299d": "setNote(string)", +"2d7b8c98": "returnInvestmentsTo(address)", +"2d7bf927": "Migrations2()", +"2d7c597f": "whois(bytes32)", +"2d7c93e9": "register_claim(string)", +"2d7cd4cd": "rand1()", +"2d7cdeb1": "withdraw(string,uint256,address,bytes)", +"2d7da889": "ruleA(uint256)", +"2d7dc81c": "sendAfterIco(uint256)", +"2d7deae2": "testDeployMultiSigWallet()", +"2d7e92a5": "CWCCTokenIssue(address)", +"2d7eba3f": "ganaBalance()", +"2d7ed15c": "BNB_TOKEN_PRICE_DENOM()", +"2d804ca2": "amountFilled(address,uint256,address,uint256,uint256,uint256,address)", +"2d806bfd": "createProduct(bytes32,bytes32,address[],int256,int256,address)", +"2d806cdd": "setRefund(address)", +"2d80bc86": "getNumberOfParticipantsOrigins()", +"2d80f13c": "EthlanceSponsor(address)", +"2d817a91": "withdraw(uint32[])", +"2d81844e": "_createPrecious(address,uint256,string)", +"2d81e877": "Gocc9()", +"2d826eda": "updatetoken(uint256,string,string,string,string,string,uint256,bool)", +"2d829146": "buyshares(address)", +"2d83549c": "escrows(bytes32)", +"2d839989": "clearingPriceCode()", +"2d83f5a3": "divAmt()", +"2d84c3e8": "_getSigner(bytes32,bytes)", +"2d852552": "CreditDAO()", +"2d85db6b": "ChangeEndByManager(uint256)", +"2d873f21": "CrowdDevAllocation(address)", +"2d87cdd6": "DmlContribution(address,uint256)", +"2d883a73": "getByIndex(uint256)", +"2d884a51": "icoOpeningTime()", +"2d888869": "toAddress(bytes)", +"2d88af4a": "setPauser(address)", +"2d88df6f": "lvePay(string,string,uint256)", +"2d89560a": "TOKEN_INFORMATION_ADDRESS()", +"2d897146": "changeBonusIncreasePercentage(uint256)", +"2d8a08b6": "DepositEvent(address,uint256)", +"2d8a4dca": "committeeKickVotes(address)", +"2d8aa855": "playerInput(address)", +"2d8c1c35": "level_up()", +"2d8c4416": "airDropMonster(uint32)", +"2d8d488c": "getProductContractCommissionWei(address)", +"2d8d96fa": "stockSellCertainOrder(uint256,uint256,uint256,uint256)", +"2d8df871": "alimtoken()", +"2d8e3250": "Version(string)", +"2d8e3278": "grantPermission(address)", +"2d8ebff1": "joinAndDeposit(uint256,uint256)", +"2d8ed84a": "getExpiryDate()", +"2d8f0981": "setPI_edit_14(string)", +"2d9029ca": "earlyResolve(bytes32,uint256,bytes32,bytes)", +"2d9068ed": "matchpoolAddress()", +"2d906a19": "Solario()", +"2d90ae94": "transferToOwner()", +"2d910376": "valueFromPercent(uint256,uint256)", +"2d91657b": "giveConsent(string,string)", +"2d91ad22": "Group_5()", +"2d91bf11": "foxcoin(uint256,string,string)", +"2d923561": "sellItem(uint256,uint256)", +"2d9240f3": "pauseCrowdSale(bool)", +"2d92b1c0": "setupPhases(uint256,uint256[],uint256[],uint256[],bool[])", +"2d92b371": "addVal(address,bytes32,address)", +"2d9346ab": "setAgentVerificationByAdmin(address,address,bytes32)", +"2d935d11": "calculateTokenOnlyBuyPrice(uint256)", +"2d936763": "hasTeamKeepingWithdraw()", +"2d937fe8": "isBeginnerQuestContract()", +"2d93a44e": "getEndClaimDate()", +"2d93d3ac": "getFirstStageWallet()", +"2d94d41e": "DEVCLASS_FTL_SPEED()", +"2d9525d6": "YankeesOrioles48()", +"2d957790": "testRemoteWithdraw(uint256,uint256,uint256,uint256,address,address,uint8,bytes32,bytes32,address)", +"2d958dfc": "Payout(address,address,uint256,uint256,bool)", +"2d95fdb5": "_isApprovedForAll(address,address)", +"2d962d0f": "burnLeftTokens()", +"2d969204": "KingJamesToken()", +"2d96a297": "addStore(uint256,uint256)", +"2d976404": "upgrade_token(address,address,string)", +"2d978678": "left23(uint256)", +"2d97fc5d": "rand(uint256,address)", +"2d980646": "allowanceEliminate(address,address)", +"2d985cfb": "testControlRestartNotUpdatable()", +"2d98d251": "ArtaoToken(uint256,string,string)", +"2d992bde": "applyAffiliate(address,uint256,uint256)", +"2d9a37d3": "getMaxPayout()", +"2d9abaed": "Purchase(uint256,address,address)", +"2d9b1530": "Electrocoin(uint256,uint256)", +"2d9b4ab7": "blnpereth()", +"2d9c3052": "createPaper(string,uint256,uint256)", +"2d9c6001": "prometheusVoucherSoldCount()", +"2d9d5ab7": "withdrawByAdmin(address,uint256,address,uint256,uint8,bytes32,bytes32)", +"2d9de472": "setVerified(uint256)", +"2d9e84b4": "userCampaignID(address,uint256)", +"2d9e87c5": "setRefundable(bool)", +"2d9e8ed6": "addEntryInYears(address,uint256,uint256)", +"2d9ec349": "TOKETH_PRESALE_THREE()", +"2d9eceb5": "BETHERcoin()", +"2d9f669d": "sendProportion(address,uint256)", +"2d9fab98": "suscribeTrial(uint256)", +"2d9ff1d0": "m_Owner2()", +"2da03409": "flushForwarderTokens(address,address)", +"2da09fac": "sellBkgAtExchg(uint256,uint256)", +"2da0c25c": "priceChanger()", +"2da0d1ea": "etherSold()", +"2da11b2e": "biddingClosed()", +"2da13d5e": "CONTRIBUTIONS_MIN()", +"2da1670f": "deAuthoriseSale(uint256,uint256)", +"2da2440c": "registerAuditor(address,address)", +"2da39239": "updateUserShares()", +"2da40888": "TaskUpdated(uint256,uint8)", +"2da40ac7": "emitTokens(address,uint256,uint256)", +"2da4dddd": "createSystemSaleAuction(uint32,bytes,uint16)", +"2da5a444": "deleteSire(uint32)", +"2da5b88e": "remoteSetWinner(uint256,uint256,uint256)", +"2da5deb4": "addBuyTokensRequest(string,string)", +"2da64861": "bulkReserveTokensForAddresses(address[],uint256[],bool[])", +"2da6a0d8": "getBomb(uint8)", +"2da6b8f8": "_getMinersAt(uint32,uint32)", +"2da7293e": "isSuperseded(address)", +"2da758b0": "ResearchAndDevelopment()", +"2da80893": "phase_3_rate()", +"2da8b2be": "TokenSubtracted(address,uint256,uint256)", +"2da8d3e6": "woe()", +"2da8f764": "submitVideo(string,string)", +"2da92e05": "setEmissionCap(uint256)", +"2da9a6cc": "collectMilestoneInvestment(bytes32)", +"2da9b51e": "setBuilding(uint8[176],uint8,uint8,uint8)", +"2da9d048": "startQueue(address)", +"2dab0374": "sendFutureFundingBalance(address[],uint256[])", +"2dab3e7a": "setTransferPlan(address,uint256,bool)", +"2dab7ee2": "convertToBytes(uint8[])", +"2dabbeed": "reclaim(uint256)", +"2dac17cd": "getBattleKuns(uint256)", +"2dacdaf7": "_createGirl(string,address,uint256)", +"2dad2f97": "getLeastExpensiveShare(uint256,uint256)", +"2dad5872": "newAttack()", +"2dad6b6a": "_distributeToken(address)", +"2daddb32": "VVToken()", +"2dadf781": "KudosOrganisations(address)", +"2dae35c4": "RGXBonus(string,string,uint256,uint8)", +"2dae9878": "BankOwner_EnableConnectBankAccountToNewOwnerAddress()", +"2daeb49a": "fundPuppets()", +"2daedd52": "stake(bytes32,uint256,uint256)", +"2daf0e1c": "presaleLevel()", +"2db0d129": "VIDALCOIN()", +"2db237bb": "MARGIN_SPLIT_PERCENTAGE_BASE()", +"2db25e05": "getTrade(uint256)", +"2db26de1": "checkBalances(address[])", +"2db2caef": "rmExchangeAccount(address)", +"2db3dc12": "FrozenAccount_event(address,uint256)", +"2db4f279": "createRoom(string,uint256)", +"2db579f2": "ETHPToken()", +"2db59e2b": "MyOwned()", +"2db6ad32": "testEmpty()", +"2db6e0fe": "fixPlayerFlag(uint256,string)", +"2db6fa36": "batchAddToWhitelist(address[])", +"2db78d88": "adminSealBallot(uint32)", +"2db78d93": "indexes(address)", +"2db8069f": "makeMemberOfCommunity(address,uint256)", +"2db89533": "Auth(uint8,address)", +"2db9395a": "availableTo(address)", +"2db93fc7": "buyBag(uint256)", +"2db95aa9": "getTomatoCount()", +"2dba1a44": "stockCancelSellOrder(uint256,uint256,uint256)", +"2dba3614": "app_address()", +"2dba5cfa": "transferCoins(address,uint256)", +"2dba9e63": "EMACToken(uint256)", +"2dbacf5f": "premiumOpen()", +"2dbb9050": "setSecurityTokensPercent(uint256)", +"2dbc62cc": "BlindCroupierTokenDistribution(address[16],uint256[16])", +"2dbcc104": "getAddressFromList(uint256)", +"2dbce390": "setDepositary_function_control(uint256)", +"2dbd606e": "set_sale_address(address,bytes32)", +"2dbe713d": "EOSPlusToken()", +"2dbede89": "next(bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,bytes2)", +"2dbf7b98": "certificate()", +"2dbf8bf0": "getRolled()", +"2dbffa6a": "executeBuyRequest(uint256)", +"2dc03259": "registerUser(bytes32)", +"2dc03b22": "createNTVU()", +"2dc0562d": "taxWallet()", +"2dc09c39": "protectedReclaim(address,uint256)", +"2dc26661": "unlockOutcome(string,uint256)", +"2dc2dbf2": "makeSimpleDeal(address,address,uint256,bytes32)", +"2dc47153": "datafeed()", +"2dc62c4d": "MintProofOfStake()", +"2dc70b2a": "getCorrectedTotalBPOfTokens(uint256[])", +"2dc7a2e5": "testSetupMultisig()", +"2dc88138": "submitCoin(address,string)", +"2dc8b9de": "f1(address)", +"2dc8be64": "buyoutWallet()", +"2dc8d88d": "privatesale_beneficiary()", +"2dc95548": "adjustTokenExchangeRate(uint256)", +"2dc9ad7f": "multisend(address[],uint256)", +"2dc9b8f7": "createGuess(uint256,uint256,uint256,uint256,uint256)", +"2dc9d3e5": "placeSellTokenOrder(uint32,uint256)", +"2dca374f": "FBToken()", +"2dcac811": "TTNCoin(uint256)", +"2dcb4691": "EventBuyTank(address,uint256,uint256,uint256)", +"2dcb5c8d": "xaurumProxyWorking()", +"2dcbac97": "getGen(uint256)", +"2dcbfdfa": "endEarlyBird()", +"2dcca1f9": "TokenRetriever()", +"2dccba89": "MAX_DEPARTURE_LIM()", +"2dcd4e41": "getGain(uint256)", +"2dcdcd0c": "minChild(uint256)", +"2dce6a1f": "KHT(uint256,string,string)", +"2dcebd16": "setWorldTreasuryAddress(address)", +"2dd02e92": "weGotAWinner(address,uint256)", +"2dd0e79e": "getMarket_CommunitUsedTokens()", +"2dd117e0": "RESERVED_TOKENS_BOUNTIES_ADVISORS()", +"2dd1a932": "WE3TOKEN()", +"2dd1cc27": "MichCoin(uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"2dd28736": "view50()", +"2dd2995a": "ETHERCOINSupply()", +"2dd2f86b": "maxTokenSale()", +"2dd306f7": "getTearBalance()", +"2dd31807": "unlistOpenProposals(bytes32)", +"2dd34f0f": "Whitelistable(address)", +"2dd395ae": "SUN()", +"2dd3ed9a": "addWorkRecord(uint256,bytes16)", +"2dd40301": "amountJurors(uint256)", +"2dd407f9": "Vag()", +"2dd4f8d4": "totalSupplyYear()", +"2dd522c6": "ATN()", +"2dd5b58e": "setNewGameLogic(address)", +"2dd608ce": "setPreICOLimit(uint256)", +"2dd694ff": "EntryExistAlready(bytes32,uint256)", +"2dd6ba7e": "release_remain()", +"2dd7030b": "removeAuction(uint256)", +"2dd78759": "affAddr_()", +"2dd7ab99": "BlackSnail(uint256,string,uint8,string)", +"2dd81ed3": "CROWDSALE_REWARD_TOKENS_NUMS()", +"2dd854d4": "addLoanToPortfolio(uint256,uint256)", +"2dd8a25e": "MakeTransaction(address,uint256,uint256)", +"2dd96c84": "presaleGranteesMap(address)", +"2dda04fa": "enterContest(uint32,uint32[])", +"2dda30a7": "transferAndFreeze(address,uint256,uint256,uint256)", +"2ddae32d": "UTCoin()", +"2ddbc04a": "play2(address,uint256)", +"2ddbc97e": "addAuthor(address)", +"2ddbd13a": "total()", +"2ddc36ba": "BRC()", +"2ddcac03": "_checkLimit(uint256)", +"2ddcb21f": "limitSupply()", +"2ddd196f": "bookGuest(string)", +"2ddd6fa5": "incomingRandomNumberError(address)", +"2dddd8e0": "CROWDSALE_HARDCAP()", +"2dddf3e1": "request_withdrawal(uint256,uint256)", +"2dde1911": "balancesImporter2()", +"2dde7241": "priceWithDiscount(uint256,uint256)", +"2dde7dbc": "MAX_DTH()", +"2dde9aca": "deployment()", +"2dde9f81": "getLockWFee()", +"2ddea5fc": "enableEscapeHatch()", +"2ddeac16": "getForeignTokenBalance(address,address)", +"2de02bfa": "allocate(address,address,uint256)", +"2de05136": "unregisterVerifier(address)", +"2de16fdb": "fetchDayTokens()", +"2de1e234": "requestUSDPrice(string)", +"2de22cdb": "currentMintedTokens()", +"2de39dbe": "DifficultyOracle(uint256)", +"2de3ad02": "getUserWalletByUsername(string)", +"2de3cddc": "setCostToCreate(uint256)", +"2de40ce3": "registered()", +"2de4ca59": "Check()", +"2de4fbd8": "DaoRulesProposalAdded(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,address)", +"2de541e0": "updateAvatarInfo(address,uint256,string,uint256)", +"2de5aaf7": "getAgent(uint256)", +"2de61d1f": "changeIcoTimeRange(uint256,uint256)", +"2de6fac6": "delKYC(address)", +"2de86c5b": "transferPlayerBudget(address)", +"2de896f6": "MaxTokensPerAccountUpdated(uint256)", +"2de90801": "hashtagToken()", +"2de954af": "fixedLog2(uint256,uint8)", +"2de9a13a": "ToGoConcert()", +"2dea5f6d": "markCombatStarted(uint256)", +"2dea82b4": "checkActualPrice()", +"2deb65c7": "GetPoolInformation()", +"2deb7571": "queryByAddr(address)", +"2deb79b6": "getStockShares(uint256)", +"2ded516e": "giftIsTo()", +"2dee466d": "getAllActiveAuctions()", +"2def6620": "unstake()", +"2df056bd": "ServiceProvider(string,string,string)", +"2df05a3e": "payoutIndex()", +"2df33eee": "ShareEstateTokenCrowdsale(address,address,uint256,uint256)", +"2df38460": "unFreeze(address,uint256)", +"2df39546": "_generateRandom(bytes32,uint32,uint32)", +"2df3f82a": "setClaim(string,string)", +"2df456d4": "SetAllPaymentsSent(uint256)", +"2df56bb2": "unitBattleEthCost(uint256)", +"2df5a559": "year4LockAddress()", +"2df5ce67": "WorkOrderCompleted(uint128,uint256,string)", +"2df6e80a": "cancelTradeOffer(bytes32)", +"2df7c637": "ensureCurrentStage()", +"2df80280": "lastState()", +"2df80c87": "privilegedMintLock()", +"2df8e00d": "becomeMortal(uint256)", +"2df939cd": "Banglatoken()", +"2df9feaa": "stopElection()", +"2dfaf204": "executeContract(uint128,uint128)", +"2dfd27e8": "fecharDoacoes()", +"2dfdaf59": "CheckSoilTempException(bytes32,uint32)", +"2dfdf0b5": "depositCount()", +"2dff0d0d": "getById(bytes32)", +"2dff3498": "Relay()", +"2dff692d": "orderStatus(bytes32)", +"2dff6941": "content(bytes32)", +"2dff7a2b": "authoriseMaker(address)", +"2e0025c1": "ROLE_BACKEND()", +"2e011136": "deployTokens(address[],uint256[])", +"2e012698": "validate(bytes32)", +"2e01783d": "calcprice()", +"2e0179b5": "increaseApprovalWithSender(address,address,uint256)", +"2e01d229": "Attacker(address)", +"2e02583c": "wordlist()", +"2e028287": "test_oneInvalidAssertFalse()", +"2e029c65": "HARDCAP_TOKENS_ICO()", +"2e02b24c": "PMCToken(address,uint256)", +"2e038aaf": "randaoAddress()", +"2e04d730": "BuyGoods(uint32)", +"2e05177f": "OpenTransferToken()", +"2e055bcc": "preSaleSupply()", +"2e05b37b": "settleFee(address,address,uint256,uint256)", +"2e06c756": "post(string,string,string,uint256,uint256,address)", +"2e071db3": "updateUserAge(address,uint256)", +"2e081f31": "pause_3()", +"2e08c3d1": "checkUserWhiteList(address)", +"2e08eb77": "InitialTreeICO()", +"2e09c32f": "playRound(address,uint256)", +"2e0a020e": "refunduingStartDate()", +"2e0b1834": "periodByDate()", +"2e0bee7b": "createCampaign(string,string,uint256[],uint256,uint256,uint256,uint256)", +"2e0c6c36": "RANGEEND_3()", +"2e0ca1ee": "first_pay()", +"2e0cb498": "hashValue(bytes32)", +"2e0de515": "setTip(uint256)", +"2e0dfafc": "addBlockListed(address)", +"2e0e11b2": "OrderMatchFailure(address,int256,address,int256,uint256,uint256)", +"2e0e5ce8": "getBonusNames()", +"2e0eb6fd": "Lucy()", +"2e0eb943": "doSend(address,address,uint256)", +"2e0ef395": "voteOnNewEntryFees_only_VIP(uint8)", +"2e0f2625": "DECIMALS()", +"2e0fb349": "mainSaleSecondEndDate()", +"2e0fc7a6": "updateContributor(address,uint256,uint256)", +"2e102ee4": "setGasPrice(uint8)", +"2e108133": "qshdrop(address[],uint256)", +"2e10870f": "makeAnotherContractOwnerOfToken(address)", +"2e10feff": "addSigByProvider(bytes32)", +"2e13bd10": "not()", +"2e14ef92": "mutiSendCoinWithSameValue(address,address[],uint256)", +"2e15ba63": "forwardData(bytes32,address)", +"2e16cf54": "retrieveWallet(address)", +"2e16e82e": "BitcoinCityCoin()", +"2e17de78": "unstake(uint256)", +"2e18270f": "receiveBTC(address,string,uint256,string)", +"2e18762c": "LogUpdateInvestorProfitSum(uint256)", +"2e18cead": "PrivateSale(address,uint256,uint256,uint256,uint256)", +"2e18d8a9": "becomeBullsmaster()", +"2e190d03": "IncreasingPriceCrowdsale(uint256,uint256)", +"2e19599c": "getTargetRepMarketCapMultiplier()", +"2e19d31b": "proposalText()", +"2e19ebdc": "pIDxName_(bytes32)", +"2e1a348e": "TicTacToeGame()", +"2e1a37ee": "TCToken()", +"2e1a7d4d": "withdraw(uint256)", +"2e1a9ffe": "getPepe(uint256)", +"2e1b2098": "PlayerCreated(uint8,address,uint256)", +"2e1b7f08": "SetClaimRate(uint256)", +"2e1bbe98": "setLimitEth(uint256)", +"2e1c1d63": "BoardMeetingClosed(uint256,uint256,bool)", +"2e1c49d9": "testInitalBalanceUsingNewContract()", +"2e1d22b6": "getPlayerDividend(address)", +"2e1dc4b8": "setTokenReward(address)", +"2e1dea6b": "updateHours()", +"2e1e786d": "setWhitelist(address[],address[],uint256[])", +"2e1eb7fe": "slice32(bytes,uint256)", +"2e1ef07a": "getAmountOfTokens(uint256,uint256)", +"2e1faf75": "transferToken(address,uint256,uint256)", +"2e1fbfcd": "getProposalObjectionByIndex(uint256)", +"2e20255e": "MasterToken(uint256,string,uint8,string)", +"2e20b66a": "setThings(address[],uint256[],uint256)", +"2e217405": "limitedWallets(address)", +"2e21b085": "lastPriceOf(uint256)", +"2e226c84": "rewardForDrawing()", +"2e23062d": "increaseBase()", +"2e2326d5": "isPrivileged(address)", +"2e247e4f": "SRGToken()", +"2e25aa96": "setCharPrice(uint256)", +"2e25d2a6": "marketPlace()", +"2e26328d": "RaiToken()", +"2e271ff3": "getEmail(address,address)", +"2e276499": "minPayment()", +"2e279344": "getLunckyInfo()", +"2e27c10a": "setPI_edit_25(string)", +"2e283b94": "TokenClaim4BTC(address,address,uint256,uint256,uint256,uint256)", +"2e28b3f5": "SGX_ADDRESS()", +"2e28d084": "setBytes(bytes32,bytes)", +"2e28fd42": "complete(uint256,string)", +"2e293e58": "setClientPaidUpTo(address,uint256)", +"2e297a44": "getSmartContractsLength()", +"2e298f75": "setPositiveGrowth(int256)", +"2e2a51bd": "WitdrawTokenToHolder(address,address,uint256)", +"2e2a6488": "evaluation_stage_block_size()", +"2e2aad44": "NIMFAToken(address,address,address,address,uint256,uint256)", +"2e2b3f61": "TokenCreated(address)", +"2e2b5809": "Insurechain(address,address)", +"2e2bac04": "addControllerContract(address)", +"2e2bec5c": "getMinerLevel(uint256)", +"2e2cce55": "icoRound5()", +"2e2d6ab1": "DelayedPayment(address,uint256,address,uint256)", +"2e2e4149": "minTomoContribution()", +"2e2ed6a7": "PALToken(uint256,address)", +"2e2fe8a9": "ZYL()", +"2e2ff7c6": "transferPreSaleTokens(address,uint256)", +"2e3196a5": "set(string,bytes32)", +"2e323f5d": "Update(uint256,uint256,string)", +"2e325020": "getStage(uint256)", +"2e33178a": "zRefundAllPlayers()", +"2e334452": "getPublicKey()", +"2e336eea": "testDieIfMinReturn0()", +"2e338df5": "transferInner(address,uint256)", +"2e33cd7a": "distructVault(bool)", +"2e340599": "info(uint256)", +"2e340823": "cancel(uint256[])", +"2e35d7a8": "companyTokensCurrent()", +"2e368e03": "beneficiariesPercentage(address[],uint256[])", +"2e36a709": "Error(uint256)", +"2e3712c4": "Bitelectroneum()", +"2e376ada": "whitelistIndexMap(address)", +"2e379264": "AIRDROP_CLAIM_AMMOUNT()", +"2e37fa97": "doneOptions()", +"2e39c2b1": "Prize(string,uint256,string)", +"2e39ff84": "isGeneSynthesis()", +"2e3a0a7c": "destroyMultipleItems(uint256[])", +"2e3a4d12": "handleRSMCUpdateTx(address,bytes32,uint256,address,uint256,address,uint256)", +"2e3a4def": "isTier2(address)", +"2e3a5611": "create(string,string,string,uint256,string,string,uint256,string)", +"2e3a71d5": "futureFundingBalance()", +"2e3acf6b": "contractPreICO()", +"2e3aff3b": "getSpinnerPrice(uint256)", +"2e3b3123": "_multiSet(address[],uint256[])", +"2e3b96bf": "developersTokens()", +"2e3be78d": "setPrecisionDirect(uint8)", +"2e3c2259": "playingNTVU()", +"2e3c9e99": "managerAddr()", +"2e3ca08c": "WALLET_MARKETING()", +"2e3cbb3b": "sellPop(address,uint256,uint256)", +"2e3ced61": "periodPreITO_startTime()", +"2e3db828": "getAddressForUsername(bytes32)", +"2e3edd0f": "ntsDepositAddress()", +"2e3fa349": "isLpStart()", +"2e4040b0": "releaseTeamTokensAfter6Months()", +"2e404c0f": "_setDOwner(bytes32,address)", +"2e4054cf": "vest2advisors(address,address)", +"2e4099bd": "transferAirdrop(address[],uint256,bytes)", +"2e414890": "challenge(uint256,uint256)", +"2e415444": "transferUniqueId(bytes32)", +"2e416162": "tkstest()", +"2e4176cf": "chairperson()", +"2e4216c1": "setMinInvestmentInWei(uint256)", +"2e42b012": "LockAccount(address)", +"2e42f80c": "CDC()", +"2e42f860": "toUint32(bytes)", +"2e430824": "trackable(address,address)", +"2e43bdfd": "approveDecrease(address,uint256)", +"2e440403": "rounding()", +"2e448f4b": "transferAngel(address,address,uint64)", +"2e450881": "PRESALETOKENMAXSALES()", +"2e4644bf": "sellDragon(uint256,uint256,uint256,uint16,bool)", +"2e465465": "provideIndex(string,uint256)", +"2e466373": "resumePlaying()", +"2e46cb09": "AddChipTempTime(uint32,uint256)", +"2e46ed94": "uint8ToString(uint8)", +"2e471d47": "addInvest()", +"2e478dd8": "provideCertificate(uint256,uint256)", +"2e4837ea": "pickUp()", +"2e48f65d": "UpdateMoney()", +"2e49d78b": "setStatus(uint8)", +"2e4a3657": "returnToken()", +"2e4ab29e": "technicalContract()", +"2e4b3d59": "setSecurityPercent(uint256)", +"2e4bd18a": "ApproveFinishMintingRequest()", +"2e4c4a9f": "lunyrPercentOfTotal()", +"2e4c697f": "pow(uint256,uint256)", +"2e4d2a09": "DMC()", +"2e4d3189": "withdrawal(address,uint256,uint256)", +"2e4d59c4": "CheckBalance(address)", +"2e4d8c8f": "exerciseToken()", +"2e4eaa15": "destroyToken()", +"2e4f43bf": "allOf(uint256)", +"2e4fd0ca": "addReferrer(uint256)", +"2e502569": "emitTransferred(address,address,uint256,address)", +"2e504bdb": "distributeTokens(uint256,uint256,uint256)", +"2e50e3ff": "simulateOptions(uint32,uint32,uint32,uint32,uint32,uint8,uint32)", +"2e5113b7": "benefit()", +"2e519ad5": "joinGameReferred(bytes32,address,uint8)", +"2e519dd5": "updateLottoParams(uint256,uint256,uint256)", +"2e51cdf6": "getAddressFromBytes(uint8,bytes)", +"2e52d606": "n()", +"2e532ba2": "getBackgroundImage(address,uint256)", +"2e533630": "sendBatches(address[],uint256[])", +"2e541234": "AllThingsTokens()", +"2e558a2d": "ETTToken()", +"2e56f71e": "deactivateMint()", +"2e56fd7a": "currentDelayOnNewLevel()", +"2e574191": "NEURAL()", +"2e58e65a": "getTokenInitialPrice()", +"2e597ada": "ChenToken()", +"2e599054": "depositETH(address,uint256)", +"2e5a6f17": "releaseAdvisorsTokens()", +"2e5a79fc": "_withdraw(string,address,uint256)", +"2e5ab94f": "BLOCKS_PER_PHASE()", +"2e5ac9b1": "createToken(address,address,address)", +"2e5b02ae": "setCrcWithdrawAccount(address)", +"2e5b2168": "maxBet()", +"2e5b4c43": "allowTrading()", +"2e5b604e": "lockBonus(address,uint256)", +"2e5c4cef": "RRRR_Token()", +"2e5cc103": "createDefaultEtherDog(uint256,uint256,uint256,address,uint256,uint256)", +"2e5d1042": "requestPayout(uint256,uint256,bytes32,uint256,uint256)", +"2e5d89bd": "BlockmoXyz()", +"2e5df0fe": "signUpDelegatedUser(string,address,uint8,bytes32,bytes32)", +"2e5e00e1": "_FIFTY()", +"2e5ec035": "_ApplicationRemoved(bytes32)", +"2e5fe746": "communityTokens()", +"2e609c10": "presaleStartsAt()", +"2e61319d": "getNumberOfAddresses()", +"2e617512": "getAddressFromName(bytes32)", +"2e62190c": "valueWithFee(uint256)", +"2e6245c6": "internalBalance()", +"2e62efbb": "getOpenOrderInfo(address,address)", +"2e63046d": "mybUSDPrice()", +"2e63756f": "PriIcoSale(address,uint256,uint256,address,address)", +"2e639fd5": "GetPlayerInfo()", +"2e63cfe1": "Twoandtwo()", +"2e63dc80": "get_description_url()", +"2e63fa72": "calculateFillHash(address[],uint256[],uint8,uint8)", +"2e64bcf1": "weiWantedOf(address)", +"2e64cec1": "retrieve()", +"2e65280d": "ListNotValidated()", +"2e660475": "PonziTokenV3()", +"2e66ee1b": "currentStateToString()", +"2e69e69b": "getQuantity(address)", +"2e69e8c5": "CarolToken()", +"2e6aa830": "testInitialBalanceWithNewMetaCoin()", +"2e6b2662": "sponsoredBonusMin()", +"2e6b921c": "claimTokensByAdmin(address)", +"2e6bbde5": "_updateCurrentAnswer(bytes32,bytes32,uint32)", +"2e6c4933": "getchilds()", +"2e6ccbf6": "getFactorybyIndex(uint256)", +"2e6d18ec": "getRoomData(uint256)", +"2e6d561b": "sendUnsoldTokensToTreasury(address)", +"2e6e190e": "Play(uint256,uint256)", +"2e6e504a": "trusteeWithdraw()", +"2e6e795c": "shareHoldersOf(uint256)", +"2e6f2136": "emitToken(address,uint256)", +"2e6f3e4a": "PERCENT_RATE()", +"2e6f456c": "updateCrowd(uint256,uint256,uint256,uint8)", +"2e70bd4f": "mintOperationCount()", +"2e712cc1": "getAdminComission()", +"2e71e68f": "IDX()", +"2e72057e": "GetLiasonURL(uint256,uint256,uint256)", +"2e722561": "CrowdsaleController(uint256,address)", +"2e7248bf": "MINIMUM_SELLING_UCCOIN()", +"2e729daf": "totalTRsWagered()", +"2e73dba0": "FeneroToken()", +"2e76a6d4": "allocateMarketingTokens(address,uint256)", +"2e771b17": "Spent(address,uint256,string)", +"2e77b3d0": "annual_circulating_supply()", +"2e788443": "resolve(string,address,uint256)", +"2e788faf": "HOLODECKS()", +"2e78f9a7": "getCardValue(uint256)", +"2e79477f": "SGD()", +"2e799a77": "GainChip(address,uint32,bool)", +"2e79d702": "addPolicyRule(bytes4,address,bytes32,uint256,uint256)", +"2e7a26d6": "Delineto()", +"2e7a9409": "_winJackPot(address,string)", +"2e7bcc55": "put(bytes32,bytes32,bytes32)", +"2e7ceb0f": "THIRD_TIER_RATE()", +"2e7d6253": "Sale(address,address,address)", +"2e7db440": "prepurchase(uint32)", +"2e7dc6af": "src()", +"2e7e33df": "sendFunds(address,uint256,bytes)", +"2e7e9af8": "addDistributee(address,uint256)", +"2e7e9d82": "ModerateBill(uint256,bool)", +"2e7f5107": "_processCredit(address,uint256)", +"2e7f9127": "setSize(uint8,string)", +"2e7fa0bb": "ReyNetMax()", +"2e8057ba": "NucleusVisionToken_ASTER87901()", +"2e80a85d": "last_jack()", +"2e80cc56": "crowdSaleMin()", +"2e80d9b6": "QUORUM()", +"2e80e77c": "minimumWeiAmount()", +"2e817963": "set_sdl(address)", +"2e81cdda": "setItemOptions(address,uint256,uint256,uint8)", +"2e82aaf2": "lock(bytes32,uint256,uint256)", +"2e831cd1": "update_bitcoin_ratio(uint256)", +"2e834576": "tokensForEth(uint256)", +"2e83faee": "CustodianUpgradeable(address)", +"2e84a374": "reclaimEtherTo(address,uint256)", +"2e84bed8": "VESTING_2_AMOUNT()", +"2e84e8ca": "ItsComingHomeToken()", +"2e8511f0": "getReg1()", +"2e85dd54": "getGPSMaxEth()", +"2e860fc2": "setRaiseLimit(uint256)", +"2e867c77": "PRESALE_BONUS_PERCENT()", +"2e86cb13": "publicGetAsset(uint256,uint256)", +"2e875a9f": "RnMmasterReq()", +"2e87b461": "getPlayerFrontDataForMarketPlaceCards(uint256)", +"2e87edd9": "MINIMUM_PARTICIPATION_AMOUNT()", +"2e87f4a5": "_emitRoleAdded(address,uint8)", +"2e881918": "setVariantCount(uint256,uint256)", +"2e894203": "delLitAddress(address)", +"2e898ddc": "validateTemporalUnit(uint256)", +"2e8a34a7": "addTo(bytes32,uint256)", +"2e8ac384": "SmartIdentityRegistry()", +"2e8ac517": "TokensMinted(address,uint256,uint256)", +"2e8b73cd": "getPoolUrlOfAuditReport(uint256)", +"2e8c0ac2": "balancing(int256,int256,uint256)", +"2e8c5793": "BonumPromoToken()", +"2e8cbf7d": "_determineAttack(uint256)", +"2e8e66b9": "newRequest(address)", +"2e8e9bb9": "Venuscoins()", +"2e90610d": "auditActivity(uint256,string,uint256,uint256)", +"2e9066b2": "lastBlock_v6()", +"2e90aae8": "cuck()", +"2e913118": "txTaskMap(uint256)", +"2e91812b": "setSmallCapWhitelistParticipants(address[],uint256)", +"2e92abdd": "withdrawDividends()", +"2e932961": "setTimeEnd(uint256)", +"2e93497e": "ownerRandomHash()", +"2e9392bb": "marketEggs()", +"2e9453c2": "stateOfICO()", +"2e94afe0": "EDN()", +"2e94c0df": "_withdrawTokens(address)", +"2e9501d6": "maxThreshold()", +"2e963adc": "timelocksContracts(address)", +"2e97766d": "getBlock()", +"2e97c5a5": "ethToLoveyRate()", +"2e97f1bb": "setCustomerTxAsSpent(address,bytes32)", +"2e984745": "partnerID(address)", +"2e9868f8": "issuerName()", +"2e986b54": "TransferMinimumFeeConfirmed(uint256,address,uint8)", +"2e98a401": "preCheckAndPay(string,uint256,address)", +"2e993994": "changeUnforked(address)", +"2e995fd7": "setOraclizeAllowance(uint256)", +"2e99df84": "InitiateTeams()", +"2e9a06fd": "isValidIPFSMultihash(bytes)", +"2e9a3869": "MORCO()", +"2e9b4414": "getSpawnLimit(uint32,int256,uint256)", +"2e9b50bd": "addPeer(address)", +"2e9bbbb8": "transferOwnershipUpdateToken(address)", +"2e9be9d5": "signWithdraw(address,address)", +"2e9c135b": "proxydeposit()", +"2e9c5e77": "doStackExtension(uint256)", +"2e9c91a8": "getStartParams(bytes32)", +"2e9efb8e": "commitToWeek(uint256,uint256)", +"2e9f86cd": "create0(uint256,bytes)", +"2ea0dfe1": "transferFrom(address,address,uint64)", +"2ea1f9aa": "getEpisodeLength()", +"2ea23b11": "testTransferFromDoesNotAllowTransferByAddressThatHasNotBeenApproved()", +"2ea38693": "testCreatePrizeUsingNewContract()", +"2ea3ad74": "finishPreIco()", +"2ea3f9fc": "gelerCompte(address,bool)", +"2ea459b8": "claimThrone(bytes)", +"2ea60e35": "fourthWeekBonus()", +"2ea68d4b": "LazyCoderCoin()", +"2ea6d6da": "absMin(int256,int256)", +"2ea7b4d0": "ALPHA_DIVISOR()", +"2ea7e0d2": "Test5(uint256)", +"2eaa7be9": "PoolSegregationCrowdsale(uint256)", +"2eaad0b0": "_getAllChildren(bytes32)", +"2eabb38d": "doTransferIn(address,uint256)", +"2eac3a7d": "divCashCoin()", +"2eac5a77": "Getscoins()", +"2eac5ca2": "deleteUsername(bytes20)", +"2eacfd0f": "admin_withdraw(uint256)", +"2ead28fa": "BBTToken(address)", +"2eadda54": "number_to_hash(uint256)", +"2eae0018": "setMaxChildCount(uint256)", +"2eae0d0a": "SetTimes(uint256,uint256)", +"2eaf7fe0": "buyTokenPostIco(address,uint256)", +"2eaf81f9": "concludeTournament(uint256,uint256)", +"2eafb9fa": "setMintTokenOwner(address,address)", +"2eafc2aa": "installWinner(uint256)", +"2eb0111c": "currentPhaseAddress()", +"2eb0b45a": "setGlobalsSize(uint256)", +"2eb1482a": "isHorseInStud(uint256)", +"2eb1ee9e": "CandyLand(address)", +"2eb255ec": "divpaid()", +"2eb2c2d6": "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)", +"2eb37466": "removeWhitelistedAddress(address,address)", +"2eb3a797": "getBetKey(uint256)", +"2eb44efc": "ICOSaleType()", +"2eb4a7ab": "merkleRoot()", +"2eb51417": "isWithinSaleLimit(uint256)", +"2eb516b8": "setGNR(address,address,address)", +"2eb56ad4": "getUserTokensByGame(address,uint32)", +"2eb5c61f": "testThrowsUpdateLatestRevisionEnforceRevisions()", +"2eb61d15": "getAdvisorStatus(address)", +"2eb67f53": "isERC20()", +"2eb73307": "internalRefund(address,uint256)", +"2eb77b44": "PNNP(uint256,string,uint8,string)", +"2eb9526e": "GetBoilersInfo()", +"2eb95fd4": "doHijack(uint256,uint256,uint256,uint256)", +"2eb96988": "getMetBalance()", +"2eb98d34": "hosp_count()", +"2eb9a518": "ChangeRateOfToken(uint256,uint256)", +"2eb9f831": "markAsFounder()", +"2eba1c40": "deleteName(address)", +"2eba9ca9": "liquidateUser(address,uint256)", +"2ebabea0": "preSaleRaise()", +"2ebba2cf": "unitsPerEthAt(uint256)", +"2ebbac6c": "ico4Cap()", +"2ebbc58c": "getAllRouter()", +"2ebc4293": "getEthereum()", +"2ebc760b": "AvPresale()", +"2ebd1e28": "setTokenAddr(address)", +"2ebd632a": "addSystem(address,address)", +"2ebd9242": "TOTAL_TOKENS_ICO()", +"2ebe14b0": "timeoutBlocks()", +"2ebec916": "withdrawalProfit()", +"2ebeee0f": "increaseMinPurchaseQty(uint256)", +"2ebfa208": "checkFreeze(uint256)", +"2ebfeaac": "setCCH_edit_33(string)", +"2ec0090a": "withdrawEtherBalance()", +"2ec0faad": "createPassport()", +"2ec19f0f": "itemTransfer(address)", +"2ec21efd": "OuCoin()", +"2ec29c59": "ICOSALE_BONUSJOINTTOKENS()", +"2ec2c246": "unregister(address)", +"2ec40ac8": "reached()", +"2ec449d7": "MedexTestToken()", +"2ec47069": "assignFoundationSupply(address)", +"2ec6b4f6": "getUnitCoinProductionMultiplier(address,address,uint256)", +"2ec6ea30": "Hodl()", +"2ec82b8f": "balanceOfInt(address)", +"2ec86103": "booleanToUInt(bool)", +"2ec90e34": "decrementOwnedArea(address,uint256)", +"2ec9322d": "returnStartTime(uint256)", +"2ec9ad44": "removeAccessor(address)", +"2ec9c537": "MyFiChain()", +"2eca51e2": "elements(uint256,uint256,uint256)", +"2ecad13f": "getSaleEndDate()", +"2ecae90a": "getLeverageList()", +"2ecb0d64": "getNumber(bytes32)", +"2ecb20d3": "fromHexChar(uint8)", +"2ecb9279": "yesHash()", +"2ecbd6d8": "allowedForWithdrawn()", +"2ecc8703": "guardInterval()", +"2ecca4e6": "_destroyNinja(uint256)", +"2ecd071e": "Freezed(address,uint64,uint256)", +"2ecd7020": "getTotalTokenSold()", +"2ecde40e": "getRefWallet(address,address)", +"2ece07c3": "setUserAirDropRate(uint32)", +"2ecf307e": "_addrNotNull(address)", +"2ecf66e4": "softCapToken()", +"2ed028da": "addGift(address,uint8)", +"2ed0d097": "_getTotalTokenBalancePerShard(uint256)", +"2ed196bd": "ccLockedUpBalances(address)", +"2ed1a7f6": "setProposalTTL(uint256)", +"2ed1e521": "generateWinMatrix(uint16)", +"2ed1f26e": "unlockBatchOfAddresses(address[])", +"2ed20ec7": "Yiha()", +"2ed23a73": "_releaseTo(address)", +"2ed252cb": "toERC20(uint256,uint256,uint256)", +"2ed42bf7": "_config()", +"2ed44309": "setIcoParameters(uint256,uint256,uint256,uint256)", +"2ed4595a": "participantContributionInEth(address)", +"2ed4a2c7": "changeState(address,uint8)", +"2ed4b68a": "creditFundNIMFAAddress()", +"2ed5016a": "SolidStampRegisterAddress()", +"2ed5ca29": "recordFillOrder(bytes32,uint256,uint256)", +"2ed604c8": "secondsLive()", +"2ed73df6": "starterPackCardLevel()", +"2ed94f6c": "bulkWithdraw(address[])", +"2ed9859f": "hasSongWriterSigned(address)", +"2ed9cf65": "editPerson(address,string,string,string,uint256,uint256)", +"2edb5389": "replenishTokens(address,uint256)", +"2edcc661": "crowdsaleStartDate()", +"2edcedc6": "parkingSwitches(address)", +"2edefc26": "founderMultiSigAddress()", +"2edf8042": "collectProvisions(uint256)", +"2ee01240": "getUnitJadeStealingMultiplier(address,address,uint256)", +"2ee057ca": "deallocateItem(uint256,uint256)", +"2ee07c00": "closeEvent(uint256)", +"2ee07cbf": "AxieClockAuction(uint256)", +"2ee119cb": "demint(address,uint256)", +"2ee1e64c": "toRLPItem(bytes,bool)", +"2ee2a7af": "getContractPartner()", +"2ee3cf83": "cancelOrderByAdminWithMerchant(string,address)", +"2ee40908": "stakeFor(address,uint256)", +"2ee551bf": "RESERVED_BOUNTY_GROUP()", +"2ee56469": "cancelGoldBuyOrder()", +"2ee5d2e3": "last_forwarder_created()", +"2ee6807a": "raiseCoinsDeducted(address,uint32,uint256)", +"2ee6f8b6": "changerType()", +"2ee6fe55": "_addOwnerPlayerToTeam(uint256,address,uint256,uint256)", +"2ee79ded": "change()", +"2ee86973": "resolveHTLC(uint256,uint256,uint256,bytes32,int256,bytes32,uint8,bytes32,bytes32)", +"2ee8dda9": "allocateFoundationToken()", +"2ee92639": "purchaseCancel(address)", +"2ee94319": "RecievedEth(address,uint256)", +"2eea1efe": "getCCH_edit_20()", +"2eebdeb8": "_setStakeHolder(address,uint256)", +"2eebe94f": "weiRaisedAmount()", +"2eecbc7f": "deployMeDao(string)", +"2eecc46c": "sendTokensToInvestor()", +"2eed0079": "createMicroModule(uint256,string,uint256,uint256,uint256,uint256,uint256)", +"2eee5a3e": "totalPresaleTokensYetToAllocate()", +"2eef13cd": "changeArt(bytes32,string,string,string,string,string,address)", +"2eef3d65": "query(bytes32,string)", +"2ef01862": "subscriptionDetails(uint256)", +"2ef0a28d": "seraphims(address)", +"2ef140ef": "send(address,uint256,uint256,uint256)", +"2ef22b34": "setExpRewards(uint256,uint256)", +"2ef2b51d": "OWNER_TAKE_SHARE()", +"2ef2d55e": "channelTimeout()", +"2ef2edb8": "endICOStage1()", +"2ef345e4": "DAppSky()", +"2ef35214": "setVestingRate(uint256)", +"2ef3a7e1": "setBalancePercentageLimit(uint256)", +"2ef3accc": "getPrice(string,uint256)", +"2ef4940f": "withdrawalsVotes()", +"2ef4d922": "revertMe()", +"2ef5c784": "allTimePlayers()", +"2ef6d6c0": "countWebsite(address)", +"2ef70523": "SVDelegation()", +"2ef75ebc": "STAGES_PERCENT_RATE()", +"2ef761d3": "buyTile(uint8,uint8)", +"2ef771ae": "hodlFor(uint256)", +"2ef82db9": "getCandidatePollingResesult(address,uint256)", +"2ef875fb": "div10(uint256,uint8)", +"2ef8c22b": "FunWorldCoinToken()", +"2ef9b4aa": "EngkusTechResearch()", +"2ef9b5a7": "changeBonusMultiplier(uint256)", +"2efa3c87": "TokensSpent(address,uint256)", +"2efa79d3": "tokensFrozen()", +"2efaa460": "testActivateSale()", +"2efad59d": "EmployeeServ(address)", +"2efb3f04": "getNumberOfScams()", +"2efb77c4": "changeDates(uint256,uint256)", +"2efbb80c": "addMeaningToCovfefe(uint256,string)", +"2efc5013": "Ask(uint256,uint256,address)", +"2efcb5e0": "TransferCommissionToken(uint256)", +"2efd08df": "totalPaintingsCount()", +"2efd5632": "candyLandAddress()", +"2efeb4e5": "LogSale(address,uint256,uint256)", +"2effbada": "eligibleTestAndIncrement(address,uint256)", +"2f0019f2": "getFeatureStatus(string)", +"2f002511": "viewTotalPaid()", +"2f004218": "PERCENT_COMMISSION()", +"2f00b84a": "SECToken(uint256,string,string)", +"2f0160e7": "fromOtherCurrencies(uint256,address)", +"2f034f35": "PerformingMonthlyMinting(uint256)", +"2f038fd5": "enable(uint8)", +"2f0573d9": "DSToken(bytes32)", +"2f0579db": "_isBreedingPermitted(uint256,uint256)", +"2f0746bf": "unsetWildCardToken(uint256)", +"2f078b12": "HashGenerator()", +"2f087a28": "getTokenCap()", +"2f08acfa": "Extreme()", +"2f0989ec": "release12m()", +"2f0ae513": "calculateTotalWithdrawableTokenAmount(address,address)", +"2f0b0222": "numberOfRound()", +"2f0b15f6": "testGetUnset()", +"2f0b5cb5": "setTokenTransferPercentage(uint256,uint256)", +"2f0b9dcb": "getArray2()", +"2f0c2c7c": "getReward(uint32)", +"2f0c59e7": "DISTRIBUTION_INVESTORS()", +"2f0c9387": "TestCitySnapshot(address,uint256)", +"2f0cca79": "dataMerkle(uint256[],uint256,uint256)", +"2f0d2079": "getEventBanks(uint256)", +"2f0d8962": "ChangeFeed(bytes32,uint256)", +"2f0dbae1": "MaxICOpublicSupply()", +"2f0ddcb2": "getTechBonus2(uint256)", +"2f0e23fb": "purchaseEndTime()", +"2f0e3a6c": "status(address,address)", +"2f1017cb": "getwinnerloser()", +"2f109d2b": "afterWhtelisted(address)", +"2f113f27": "LOCK_STAKE()", +"2f121ada": "companyBalance()", +"2f12bc02": "LiquexPrivateSale()", +"2f1335cf": "splitFunds(uint256)", +"2f13b60c": "isExpired()", +"2f148f55": "showMoseEvent(uint32)", +"2f156f69": "deployTgeTeamVesting(address,uint256)", +"2f158162": "setHKHcoinAddress(address,address)", +"2f16753c": "ShellToken(uint256,string,uint8,string)", +"2f16c072": "getPeaks(uint256)", +"2f1766c5": "addCA(address,address,string,string,string,string,string,string)", +"2f17a466": "terminateSchedule(address)", +"2f186785": "showProfit(address)", +"2f18a920": "setDeputy(address)", +"2f1927cb": "prepareRoll(uint256,uint256,uint256)", +"2f194e40": "isMintDone()", +"2f1a2e72": "allocate(address,int64)", +"2f1a332a": "OwnerRandomNumber(uint256)", +"2f1a8177": "weiToBnty(uint256)", +"2f1a8b63": "modify_ICOEndDate(uint256)", +"2f1af169": "EscrowMyEther()", +"2f1afbac": "doAirdrop(address,address[],uint256[])", +"2f1c34ef": "buyStar(uint256)", +"2f1c6494": "tgeSettingsAmount()", +"2f1c935e": "setSkinContract(address)", +"2f1cae85": "isIssuable()", +"2f1cc35b": "getRoundBetNumber(uint256,uint256)", +"2f1d29fd": "HarjFarmer()", +"2f1d3e28": "sendAwardToLastWinner()", +"2f1d5a60": "setOperatorAddress(address)", +"2f1ddbe3": "nodalblockShortLink(uint256,string)", +"2f1de784": "getPoolsAllot(bytes32)", +"2f1e4968": "makeNewProposal(string,uint256)", +"2f1ee5e1": "recycleUnreceivedBonus(address,address)", +"2f1f1d43": "getownership2(uint16,uint256,uint256)", +"2f20270a": "addNewUrl(string)", +"2f2035ed": "test_feePoolShare_notTranscoder()", +"2f204237": "setupSaleContract(address)", +"2f212780": "KYCbit4()", +"2f220d7a": "executeEscrow(uint256,address)", +"2f237e82": "create(string,string,bytes)", +"2f24bdc7": "is_transaction(bytes32)", +"2f254d09": "UGVCToken()", +"2f262471": "GetPlayerCards(address)", +"2f265cf7": "totalVotesFor(bytes32)", +"2f26b5d1": "delayIcoEnd(uint256)", +"2f26f6f5": "getIsCompany(address)", +"2f2712f8": "getStat(bytes32,address)", +"2f274d91": "buyVotes(uint8)", +"2f2769d1": "assertEq(address,address,string)", +"2f2770db": "disable()", +"2f278ecb": "reverseBytes(bytes)", +"2f27b556": "card_start_minamount()", +"2f29d8c5": "elapsed()", +"2f2b348d": "setBeneficiary1(address)", +"2f2bd5ac": "testTransferCorrectlySendsTokens()", +"2f2c00f3": "PTMCrowdFund()", +"2f2d783d": "claimReward(address,address,uint256)", +"2f2d783e": "rewardRoto(address,bytes32,uint256)", +"2f2d9109": "changeAirdropTotalQty(uint256)", +"2f2dc6e2": "setCardsCount(uint256)", +"2f2e2d7f": "fstUnitPriceDenominator()", +"2f2e3cea": "userDividendsWei(address,address)", +"2f2ebe41": "setToken4Gas(uint256)", +"2f2f010c": "OCLotteryContract()", +"2f2f20c1": "INCH()", +"2f2f4859": "helloworld()", +"2f2f4a63": "buyWorldCupTeamToken(uint256)", +"2f30283e": "testSomething()", +"2f3085d6": "LEGAL_EXPENSES_TOKENS()", +"2f30c6f6": "set(uint256,address)", +"2f30cd5f": "addLockAddress(address,uint256)", +"2f310bad": "redeemToken()", +"2f318039": "isTransferable(address,address,uint256)", +"2f32013d": "Kolidat()", +"2f330041": "transfers(address,uint256[])", +"2f334131": "lastAddYear()", +"2f334652": "teamClaimed()", +"2f335a6a": "getTitulaire_Compte_9()", +"2f3423b8": "grantTokenStartNow(address,uint256,uint256,uint256)", +"2f347e48": "DigitalTicks()", +"2f34adb4": "airdropNum2()", +"2f34c645": "endBounty(address)", +"2f35a71e": "Blockchain()", +"2f366637": "buyTickets(uint256)", +"2f36cacf": "dispute(uint256,uint256[])", +"2f377902": "CandyDropOpen(bool)", +"2f379fc8": "isInStage2()", +"2f381df0": "London()", +"2f38262a": "GetBankBalance()", +"2f384523": "removeFunds(uint256)", +"2f386a8e": "sellingDisable()", +"2f38b55a": "_checkDetail(uint256,uint8)", +"2f39bf80": "LirkToken()", +"2f39f5cd": "PresaleMarket(address)", +"2f3a212e": "test_oneValidEqUint2()", +"2f3a26ee": "TransferTimeSet(uint256)", +"2f3a77fd": "narrowRoundPrizeView(uint256)", +"2f3b24d2": "GenesisManager(address,address,address,address)", +"2f3b5603": "setPayoutLimit(bool)", +"2f3c8bd1": "returnTokenBalance(address,bytes32)", +"2f3d8035": "grantVestedTokens(address,uint256,uint256,uint256)", +"2f3e5408": "takerFeePercent()", +"2f3e9bc5": "canSelfDestruct()", +"2f3f2092": "ARIONTOKEN()", +"2f3f234a": "RLCSentToETH()", +"2f3fecaa": "startOffering()", +"2f3ff501": "getDynamicElementAt(uint256)", +"2f401300": "EPAchain()", +"2f405bb7": "getCoversForPacks(uint256[])", +"2f408990": "testAccessPermissions()", +"2f430e17": "approveTx(uint8)", +"2f434748": "setMintAndBurnOwner(address)", +"2f443315": "get_liquidity_account(address)", +"2f443785": "ComputeAcornCost()", +"2f455d51": "changeRate(uint8)", +"2f45aa21": "getblockRevenuePerTicket(uint256)", +"2f4675cd": "OranguSale(uint256,uint256,uint256,uint256,uint256,address,address,uint256,uint256)", +"2f46b3cc": "getMyReport(bytes32,bytes32)", +"2f46ba70": "DAOToken(string,string,uint256)", +"2f4736da": "_canTransferBatch(uint256)", +"2f47571f": "isCapabilityPublic(address,bytes4)", +"2f475c32": "withdrawPart(address,uint256)", +"2f482935": "SFTToken()", +"2f48ab7d": "usdt()", +"2f48c4aa": "setFoundersTokensWallet(address)", +"2f48f151": "addFee()", +"2f4a81df": "howManyOwnersDecide()", +"2f4c0b08": "joinGreatHarmon(string,string)", +"2f4c3a84": "transferPlayer(uint256)", +"2f4cf60f": "MultiSigWalletWithTimeLock(address[],uint256,uint256)", +"2f4e32f5": "FlexiERC20Token()", +"2f4e4c27": "ErrorContract()", +"2f4ea4ee": "release_1()", +"2f4ee5d4": "registerThrone(bytes,uint256,address,uint256,uint256)", +"2f4f3316": "isInstantiation(address)", +"2f4fda30": "BIG_NUMBER()", +"2f512b6b": "LomeliMultilpleTokens()", +"2f520081": "setPurchaseTimestamp(uint32,uint64)", +"2f53cc96": "CHINESE_EXCHANGE_3()", +"2f53e929": "emitBurn(address,uint256,string)", +"2f540d94": "BONUS_MID()", +"2f54a61e": "setClaimerForTile(uint16,address)", +"2f54bf6e": "isOwner(address)", +"2f553d31": "isCreated(bytes32)", +"2f554288": "listPrycto2()", +"2f554d53": "agreeFromPod()", +"2f5552f5": "KAL6Token()", +"2f55745b": "getPendingCrateForUserByIndex(address,uint256)", +"2f558ba0": "setFinish(uint256)", +"2f55f125": "decreaseAllowanceOrEmtpy(address,uint256)", +"2f56dc5f": "prepareContinuousPurchase()", +"2f570a23": "test(bytes)", +"2f576f20": "doNothing()", +"2f581480": "CandyCoinBigBang()", +"2f5867b3": "changeRates(uint8,uint256)", +"2f58768f": "contractors()", +"2f591a6a": "setRateForTransaction(uint256,address,uint256)", +"2f593404": "payoutCycleInDays()", +"2f597e71": "testLongInput()", +"2f598404": "getCatDetails(bytes5)", +"2f599242": "getEvaluationByStudentID(uint32,uint64)", +"2f5a5c5b": "timegame()", +"2f5bb661": "getNextVestingEntry(address)", +"2f5c3102": "Make_Deposit()", +"2f5c5a08": "setEthealToken(address,address)", +"2f5d3916": "testControllerApproveTriggersEvent()", +"2f5e80c3": "withdrawToken(address,uint16)", +"2f5e8d29": "setDAIRate(uint256,uint256)", +"2f5ebbaa": "marketState(address,uint256)", +"2f5f3b3c": "pointer()", +"2f605106": "getSponsor(uint256,uint256)", +"2f6113dc": "assignICOState(address,uint256,uint256,uint8)", +"2f6174ef": "getSig(bytes,uint8,bytes32,bytes32)", +"2f62a6ff": "fipsRegister(uint256,address,bytes)", +"2f634a90": "getOwner(address,uint256)", +"2f635c6a": "VolumeImbalanceRecorder(address)", +"2f63e2fa": "_incrementTokenBalance(uint16,uint16,uint8,address,uint256)", +"2f640a09": "setConfirmer(address)", +"2f646bd5": "ArmMoneyliFe()", +"2f65142c": "getTransfers()", +"2f653279": "getReceivedTrade(address,uint256)", +"2f658c3f": "Raffle(uint256)", +"2f65be54": "transferBonusEarnings()", +"2f65e086": "NardoTest1()", +"2f661946": "cliffPeriod()", +"2f668c5c": "etherFeeMin()", +"2f66d5a7": "KPOP_ITEM_CONTRACT_ADDRESS()", +"2f6701b0": "withdrawalList(bytes32[],address)", +"2f674ab9": "maybeUpdate()", +"2f677038": "grantUserRole(bytes32,string,address)", +"2f67cf56": "eth_fallback(address,bytes)", +"2f684b83": "addDecimals(uint256,uint256)", +"2f695053": "getCertifierAtIndex(uint256)", +"2f69ca13": "createCounts(bytes32,address)", +"2f69f161": "getGameResultPrice(uint256)", +"2f6a638b": "GetMaxEther()", +"2f6a6e20": "calculateMaxEggG0(uint64)", +"2f6ae467": "transferDocument(bytes,address)", +"2f6b7bbd": "Gubberment()", +"2f6b8143": "wethBalance()", +"2f6b9099": "completeOrder(address,address,address,address,bytes32,uint256)", +"2f6c493c": "unlock(address)", +"2f6dc6b3": "removeBorrowingOfferItem(uint256)", +"2f6e2711": "Int256Oracle(int256)", +"2f6e931f": "changeBurnPausedTime(uint256)", +"2f6f1c68": "speciesSymbol(uint256)", +"2f700fb6": "autoJudge()", +"2f70197c": "_getBalanceFactor(bytes32)", +"2f7146cc": "setLockingTimestampFromTo(uint256,uint256)", +"2f71d022": "updateTokenInfo(string,string)", +"2f723c7f": "RewardHoDLers()", +"2f72d697": "GCOXOWNToken(string,string,uint8,uint256)", +"2f72ffaf": "getEmployerContractsByStatus(address,address,uint256[],uint256[])", +"2f73010a": "ratePerWeiFirstPhase()", +"2f7359a3": "TOKEN_STANDARD_ERC223()", +"2f73ef91": "getFundsWalletBalance()", +"2f743591": "burnFinished()", +"2f7442bb": "transferBounty(address,uint256)", +"2f745c59": "tokenOfOwnerByIndex(address,uint256)", +"2f75a929": "extractRepository(string)", +"2f76c31d": "roundTwoLimit()", +"2f77428e": "collectdustatcontract()", +"2f774e44": "getMsgSigner(bytes32,bytes)", +"2f77688b": "TestingUseCoin(uint256,string,string)", +"2f77dba4": "tokenPerEther()", +"2f781228": "IjasCoin()", +"2f781393": "setDiscountStep(uint256)", +"2f782b32": "weiContributed()", +"2f78bab1": "LockDiv(address,uint256)", +"2f78dc14": "ErrMsg(address,string)", +"2f7907e4": "calculateBestPrecision(uint256,uint256,uint256,uint256)", +"2f7981c2": "getWealthOfUser(address,address)", +"2f798500": "clockAuctionStorage()", +"2f7a163b": "nearestKnownBlockHash()", +"2f7a407b": "exchangeFormula()", +"2f7a7192": "capFiat()", +"2f7b3677": "getMetadataUrl(uint256)", +"2f7cdb0e": "DEV_DECIMALS()", +"2f7dbc9b": "fromInt256(int256)", +"2f7f3ecf": "findNextHour(uint256,bytes)", +"2f7f7f55": "approveFee()", +"2f80324c": "EURO()", +"2f8061d4": "repayment(address,uint256,address)", +"2f815ed1": "transferToContractCustom(address,address,uint256,bytes,string)", +"2f81bc71": "multiMint(address[],uint256[])", +"2f83e16d": "_allocateTokens(address)", +"2f83f781": "fetchSuccessfulSaleProceed()", +"2f851184": "H4DAddress()", +"2f85577f": "changeACAddress(address)", +"2f85f092": "destTokensAdvisors()", +"2f86282e": "CheckGameStart(bool)", +"2f865568": "liquidate(address)", +"2f869d26": "getAssetPoolAddress(address)", +"2f86f2ee": "MAX_OPEN_SOLD()", +"2f8803bb": "addressCOO()", +"2f885f79": "trakToken()", +"2f88ae5f": "setIco3Tokens(uint256)", +"2f899fec": "Pharmatron(uint256)", +"2f8a12fe": "setMsg2(string)", +"2f8abfbe": "roundIt(uint256)", +"2f8b023d": "allowedTransferFrom(address)", +"2f8b0250": "setEndTimeIcoStage1(uint256)", +"2f8bd891": "directMint(address,uint256)", +"2f8c239f": "giveAdvisers(address,uint256)", +"2f8c98c2": "flipMovingSwitchTo(bool)", +"2f8cfe0e": "deleteResources(address[],bytes4[])", +"2f8d2d19": "BurnAssignedFees(address,address,uint256)", +"2f8de810": "tokenPriceInWei()", +"2f8e7133": "lockBBK(uint256)", +"2f8eed98": "adminTransfer(address,uint32)", +"2f8f0c92": "canDeposit(bytes32,address)", +"2f8f175c": "seal(address,address,uint256)", +"2f8f8c0b": "approveCertificate(address)", +"2f8ffce8": "allItemsWrong()", +"2f9021fd": "withdrawToCooperate(address,uint256)", +"2f90daf4": "raisedForEther()", +"2f91822c": "ETHCollector()", +"2f91b591": "RemoveMinter(address)", +"2f923c59": "tokenCapForFirstMainStage()", +"2f926732": "register(bytes32,bytes32)", +"2f92acc5": "test_4_accessRestriction_execute_shouldThrow()", +"2f92b151": "HotLove()", +"2f92f5a0": "query1_fnc(uint256,string,string,uint256)", +"2f94afba": "cao()", +"2f94e335": "_createLambo(uint256,address,uint64)", +"2f95055e": "deleteHiddenPosition(uint32,int64[2],bytes16)", +"2f95b833": "requiredStackDepth()", +"2f969d43": "MAX_UNSOLD_RATIO()", +"2f977b3f": "newTask(string,string,uint256,uint256)", +"2f978ec0": "getProviderInfo(address,uint256)", +"2f98511c": "createHistory(bytes32,address,address)", +"2f991b5a": "hasMemberAccess(address)", +"2f99c6cc": "BENEFICIARY()", +"2f9a7c22": "TransferToWaves(uint256,string)", +"2f9a8bf2": "StreamerContractChanged(address,uint256)", +"2f9b3126": "founderShare()", +"2f9b4096": "removeExternalController(address)", +"2f9c1df6": "createDeposit(address,uint256,uint256)", +"2f9cb9aa": "getClosingTime()", +"2f9ffab9": "Airstayz()", +"2fa00e58": "fipsTransfer(bytes20,address)", +"2fa05208": "minimalGoalReached()", +"2fa06ff1": "exchangesLockEndingAt()", +"2fa07bfc": "_increaseApproval(address,uint256,address)", +"2fa146d8": "officialEmail()", +"2fa1df4f": "RIG()", +"2fa241fc": "playerBook()", +"2fa267fc": "ReadBible(uint16,uint16,uint16,uint16)", +"2fa26aaa": "minimalEthers()", +"2fa30d33": "calcResolve(address,uint256,uint256)", +"2fa3a41e": "testLowestTranch()", +"2fa3e006": "CreatedToken()", +"2fa49c06": "SetTxFee(uint256,uint256)", +"2fa4f694": "setAssessorPool(uint256,address,uint256)", +"2fa553d3": "sendMinerByOwner(address,uint256)", +"2fa5620a": "Mpay(uint256,string,string)", +"2fa61cd8": "generate(address)", +"2fa6512f": "clearWalletPending()", +"2fa69585": "strikeCall()", +"2fa78393": "returnUserBalance(address,address[2],uint256[7],uint8,bytes32[2])", +"2fa7cbfb": "getExecCost(uint256)", +"2fa80164": "AgruCoin()", +"2fa8591e": "TACTICALCRUISER()", +"2fa92dde": "jackpotConditionPercent()", +"2fa94fb3": "teamTrustAccount()", +"2fa975c5": "seatsList(address,uint256)", +"2fa99791": "completeOrderBySafePeriod()", +"2faa2998": "startICO_20_December()", +"2faa3014": "uintFunc(uint256,uint256)", +"2faa5e3c": "changeMerchantAccount(uint256,address)", +"2faa9bbb": "LockClaimed(address,uint256)", +"2faad46f": "addAllowedTransactor(address)", +"2fab662a": "_decreaseMintApprovalAfterMint(address,uint256)", +"2fabc174": "multFracCeiling(uint256,uint256,uint256)", +"2fac1a54": "newOrder(bool,uint256,uint256,uint256,uint256)", +"2fac1d36": "isReadyFor(address)", +"2facc4e8": "depositGovernance(uint256,address)", +"2faccbeb": "changerProprio(address)", +"2fad380d": "burnWithDecimals(uint256,uint256)", +"2fae43dc": "m_ETHPriceLowerBound()", +"2faebb20": "getBettersArrayLength()", +"2faef47a": "AbcToken()", +"2faef4e5": "getGranteesSize()", +"2faf1895": "saveContractEvent(string,string)", +"2faf9a93": "checkUnsold()", +"2fafb11d": "get_profit_by_roll_under(uint256,uint256)", +"2fb07482": "restoreWebGift(address)", +"2fb131d4": "preicoClosed()", +"2fb1746d": "turnOnTradable()", +"2fb1b25f": "sign(uint256)", +"2fb22cfa": "ECO_SYSTEM_STAKE()", +"2fb260f6": "EthertokenDelta(address,address,address,uint256,uint256,uint256)", +"2fb27669": "preSaleComplete()", +"2fb2a061": "rateForDays(uint256)", +"2fb2bcf4": "postTwit(string)", +"2fb2f3dd": "updateFrozenToken(address)", +"2fb556f7": "tokenNeedForBonusLevel0()", +"2fb565e8": "update(uint256,uint256)", +"2fb5b5f6": "setNextSnapshotBalance(address,uint256)", +"2fb61f7d": "dispute(address,bool,uint256)", +"2fb767c5": "failSubtractWhenALessThanB()", +"2fb840f5": "transferFrom(bytes32,bytes32,uint256)", +"2fb88284": "parseRLPHeader(bytes)", +"2fb9d203": "VoteSubmitted(address,bytes8)", +"2fbaba26": "setHash(uint256,string)", +"2fbac05c": "transferManagment1(address)", +"2fbbc9c9": "calcCoinsReceived(uint256)", +"2fbbde2d": "buyDrago()", +"2fbc0bf1": "getSalePrice()", +"2fbc2449": "COLETOKEN()", +"2fbc8353": "ownerCanBurn(bool)", +"2fbcf568": "getCurrentCryptantFragmentPrice()", +"2fbd2134": "_migrateExpiredCrates()", +"2fbd2432": "transferExternalToken(address,address,uint256)", +"2fbebd38": "foo(uint256)", +"2fbf6f73": "TRNDToken()", +"2fbfbc85": "PETTCOIN()", +"2fbfc252": "changeTeamETHAddress(address)", +"2fbfc376": "HRY(uint256,string,string)", +"2fbfe951": "change_min_amount(uint256)", +"2fbfeba9": "getTokenAddressByName(string)", +"2fc0aad3": "isNumericString(string)", +"2fc15517": "kelly()", +"2fc17e40": "TdeStopped(uint256)", +"2fc17f8b": "setCompte_3(string)", +"2fc35948": "SCWhitelist()", +"2fc3f13f": "WindowPeriodClosed(address,uint256)", +"2fc4eea0": "removeName(bytes32)", +"2fc516e3": "COMMON_BUDGET_AMOUNT()", +"2fc52220": "setPOOL_edit_19(string)", +"2fc5a8ec": "Joules()", +"2fc60405": "TANK_TYPE()", +"2fc64ff7": "organizer8()", +"2fc6e8b7": "isEnd()", +"2fc71565": "setMarketplaceAddress(address,address)", +"2fc761a6": "createItem(uint256,string,address,uint256,uint256,uint256,uint256)", +"2fc77d85": "TotalETHGivenToNorthPole()", +"2fc8124d": "setSecondWallet(address)", +"2fc84de8": "XCTToken()", +"2fc8c39d": "TADPOLE_BASE_REQ()", +"2fc94ba6": "getAddressArrayLength(bytes32)", +"2fc9a415": "_emitAccessGiven(address,bytes32)", +"2fca3b0d": "TBECrowdsale()", +"2fca5414": "isTAO(address)", +"2fcaa8fa": "removePresaleHolder(address)", +"2fcb20e9": "changeReserveTeamRecipient(address)", +"2fcb6628": "_stringGas(string,string)", +"2fcd410a": "MiniPoolEdit_2()", +"2fcd6075": "BlocktekUniversity(address)", +"2fcdeba1": "fund_owner()", +"2fce1291": "EcroContract(uint256,uint256,uint256,uint256,uint256)", +"2fce1b7a": "GetSocioFromCuenta(address,address)", +"2fcf84bf": "getEthereumFromPreIco()", +"2fd0f37e": "claimConsolationPrizeLoot(uint256,address)", +"2fd1b320": "myMostRecentAssignedAudit()", +"2fd23817": "MFTU()", +"2fd3bd2e": "passFoundation()", +"2fd3dee8": "testDisputedValidMemoryAccessSequence()", +"2fd3fc9d": "bthFoundationWallet()", +"2fd463e1": "STARTMETADOLLAR()", +"2fd47643": "getRoundIssued()", +"2fd4ec28": "terminateIco()", +"2fd4f2f9": "changePreICODates(uint256,uint256)", +"2fd55265": "depositToken(address)", +"2fd5a13d": "GetClientCategory()", +"2fd5ecda": "b66AdvisorFundDepositAmt()", +"2fd61f92": "unstakeEther(uint256)", +"2fd6d40b": "getBetValueByGamble(uint8)", +"2fd949ca": "terminateContract()", +"2fd95a6f": "createGen0(uint256,uint256,uint16,bool)", +"2fd97c7d": "AllotAward()", +"2fda7166": "stopReceiveTicket()", +"2fdadc21": "sendtoA(uint256)", +"2fdae3c5": "addProposal(string)", +"2fdaf6af": "claim_tokens(address,uint256)", +"2fdb3e6c": "getBalanceETH(address)", +"2fdbb3d4": "cumAcceptedDeposits()", +"2fdc505e": "mine(bytes32)", +"2fdcfbd2": "sendToken(address,address,uint256)", +"2fdd653e": "getFortune(uint256)", +"2fdde1d4": "setUseTimeBasedBonus(bool)", +"2fddf859": "getLockedTokens_(address)", +"2fdeca37": "DEFAULT_TEXT()", +"2fdf15d5": "usernameToAddress(bytes32)", +"2fdf795a": "BOUNTY_TOKENS_PERCENT()", +"2fdfd2ae": "checkSecret()", +"2fe045fa": "initiateClaimDelegated(string,bytes32,uint8,bytes32,bytes32)", +"2fe1c0f8": "tokenTransfer(address,uint256,address[])", +"2fe20e94": "totalRestrictedTokens()", +"2fe29c78": "auctionIdToSeller(uint256)", +"2fe45a8d": "RetailSale(address,address,address,uint256,uint256,uint256,uint256)", +"2fe4b2d9": "submitSteak(address,address,bytes32)", +"2fe55632": "NexxusToken()", +"2fe69430": "TokenERC20(uint256,string,uint8,string)", +"2fe6a47c": "largestPro()", +"2fe6ecb2": "PHASE3_SUPPLY()", +"2fe71915": "request(uint256,address,address,bool)", +"2fe7a0bd": "burritoData(uint256)", +"2fe8ace3": "changeSuperOwnership(address)", +"2fe9541f": "addIssueBounty(string,uint256)", +"2fe97e3a": "approveAndCall(address,uint256,string)", +"2fe9950e": "adminSetDuel(uint256,uint256)", +"2fe99bdc": "insert(string,string,string)", +"2fe9e1a9": "change_address(uint256,address,address)", +"2fe9f821": "startRefunds()", +"2fea0c40": "revealBid(bytes32,uint256,address,address,bytes32,uint256,uint256)", +"2fea6915": "weiReqFund()", +"2fea7b22": "GetIndex(uint256,uint256,uint256)", +"2fea7b81": "getIdentity(address)", +"2fea9624": "DepositorsQty()", +"2feceb46": "extend_end_block(uint256)", +"2fed3c9e": "VoteCast(address,uint16)", +"2fed7da0": "getNextBackUserId()", +"2feda2fa": "POI()", +"2fee26ce": "addApp(address,uint32,uint32,string)", +"2feee782": "YWBToken()", +"2feef2ec": "expectedAmount()", +"2ff077be": "updateBettingOpensTime(bytes32,uint256)", +"2ff284c2": "computeFee(uint256,uint256)", +"2ff2e9dc": "INITIAL_SUPPLY()", +"2ff36e9b": "BTHBCoin()", +"2ff420ef": "CHF_CENT_PER_TOKEN()", +"2ff42757": "approveAndCall(address,address,address,uint256,bytes)", +"2ff4f24e": "createLoveStory(bytes16,bytes32,bytes32,uint256)", +"2ff50b51": "modifyEscrowPrice(uint256,uint256)", +"2ff59dec": "getEthartRevenueReward()", +"2ff59ee7": "miningIncentiveWallet()", +"2ff5e00c": "setAttaccContract(address)", +"2ff5ec3f": "armyTanksCount(uint256)", +"2ff6c55f": "DEVELOPMENT_FUND_LOCK_TIMESPAN()", +"2ff6fe76": "priceToken()", +"2ff76163": "getAdres(uint16)", +"2ff7a81f": "getAvgReportingGasPrice()", +"2ff92323": "oraclize_query(uint256,string,string[4])", +"2ff98d53": "getStageClosingTime(uint256)", +"2ff9b03a": "hackDecisive(address,uint256)", +"2ff9f017": "exchangeNominsForHavvensAtRate(uint256,uint256)", +"2ffa815b": "changeHouse_and_Owner_Addresses(address,address)", +"2ffb054e": "setMarketplaceManager(address)", +"2ffb8631": "getReleaseLockfileURI(bytes32)", +"2ffb9e64": "updateGasForXaurData(uint256,uint256)", +"2ffbf988": "packedBytes(uint256)", +"2ffc7b7e": "firstDiscountPrice()", +"2ffda1e0": "setBlackflag(uint256,bool)", +"2ffda952": "walletWithdrawTokens(uint256)", +"2ffdaa44": "BDToken()", +"2fff7bb3": "assignMultirequest(uint256)", +"2fffaa00": "Kingdom()", +"2fffb3f9": "getLockFundsReleaseTime(address)", +"2fffe0dd": "rocketArrivalTime(uint256)", +"2fffee92": "setContingencyFunds(address)", +"30007ed3": "tgeStartBlock()", +"30008b48": "pullDividendPayment(uint256)", +"30012940": "checkTeamFreezePeriodOver(address,address)", +"300182b8": "sale1(address,uint256)", +"30021bae": "SubDiv(uint256)", +"300240d6": "MAX_REGULAR()", +"300309f0": "setUserPaybackRate(uint256)", +"30043d4e": "AddedToHolder(address,uint256,uint256)", +"3004ea88": "EOSDRAM()", +"30067bc8": "setRegistrationOpen(bool)", +"3006f513": "coinSendDifferentValue(address[],uint256[])", +"30073514": "_allocation(address,address,address,address,address)", +"30074c6c": "publicSaleRaised()", +"30092ded": "changeVoteWeight(address,int256)", +"30093319": "_setRevealsCount(uint256,uint256)", +"3009a265": "isReg(address)", +"3009bc01": "claimFreeDragon()", +"300a1a7f": "mixWithStringFunc(int256,string,bool,string)", +"300a246f": "can_get(address,bytes12)", +"300a411e": "getRecording(address,uint256)", +"300abd61": "m_numMembers()", +"300ac0e9": "priceTimeToExpiration()", +"300b59da": "initTokens(address[],uint256[],bool,bool)", +"300ba0ec": "prevTweetTime()", +"300ba8ab": "_decode()", +"300c229f": "changeMaxDepositAmount(uint256)", +"300c3091": "setMigrationContractAddress(address)", +"300c7063": "SbToken()", +"300cc37a": "paySomeRewards(uint32,uint32)", +"300d55a5": "transferAdvisor1Tokens(address,uint256)", +"300d9e90": "icoOver3()", +"300e4b3c": "setminprice(uint256)", +"300e7b2d": "firstAuctionsExtendedDuration()", +"301058c9": "DURATION_PRESALE()", +"30106b17": "calckeys(uint256)", +"3010b5cd": "clearWizzType(uint256[2])", +"3010f39d": "playersToBetIndices(address,uint256)", +"3011b4c2": "CreateARTL(address,uint256)", +"30124349": "balanceLoc(address)", +"301249eb": "setPercentWeiMC(uint256)", +"3013ad89": "RangeToken()", +"3013ce29": "paymentToken()", +"30140053": "burnIcoTokens()", +"3015394c": "cancelRequest(uint256)", +"30155f5e": "setzAddress(address)", +"3015a521": "totalSignatures()", +"3016a439": "getImageBlurredAt(uint256)", +"3016e108": "removeGameMachine(address)", +"3017fe24": "callAPIVersion()", +"3018205f": "getController()", +"30183a2c": "GemstoneToken()", +"30184635": "getMinCap(address)", +"3018579e": "TokenSampleG()", +"30188fdf": "BFreeContract()", +"3018c90a": "getSubOrderStatus(uint256,address)", +"301997ae": "fundEscrow(address,uint256,uint256,uint256)", +"301a9b09": "startPhase(uint256,uint256,uint256,uint256)", +"301b7a86": "inquire_totdomains_amount()", +"301b9307": "getABsort()", +"301c42d7": "issueRateDecDuringICO()", +"301cbcb3": "STARTING_RICE()", +"301cf6e7": "payoutsPaused()", +"301d5209": "delegatecall_selfdestruct(address)", +"301d5eda": "change_start_block(uint256)", +"301dd027": "TIER_2_CAP()", +"301df7ab": "_create(address,uint256)", +"301ea971": "lockReleaseDate1Year()", +"301ecf82": "_createEtherBro(uint16,address)", +"301f0464": "ratePerEthPhase3()", +"301f2dac": "getRegionPrice(uint16)", +"301f93e0": "calculateEthereum(uint256)", +"301fbdef": "totalWeiToBeDistributed()", +"301fdb54": "getPayouts(int32,int32)", +"30203994": "stage2_price()", +"3020a18e": "setSaleEnabled(bool)", +"3020ea8a": "retrieveEarnings()", +"3020fc3b": "sendIPFS(address,address,string)", +"302155e5": "CHAToken()", +"30223c12": "del_product(uint256)", +"30226121": "CCXCrowdsale(address,address)", +"30228a12": "YouAreRichToken()", +"30230796": "setTradeABIHash(bytes32)", +"30231ea4": "canRenounce()", +"30232cb0": "buySeele(address)", +"3023641d": "removeTokenGrant(address)", +"30238687": "ALLOC_NEW_USERS()", +"3023d0c4": "Ethstick()", +"302579c6": "getWarlordChestPrice()", +"30257bf7": "getByAddress(address)", +"3026a128": "LOG_InvestorExit(address,uint256)", +"3026aedf": "getTopBidders()", +"30288f03": "setFile(string,string,uint256,string)", +"30289c61": "getDetails(address)", +"3029300f": "nextSellTime(address)", +"3029948a": "phase_2_bonus()", +"3029ba69": "withdrawBountyTokens(address,uint256)", +"302a4100": "decayedTransferFrom(address,address,uint256,address)", +"302a7ff3": "getDAdmin(bytes32)", +"302bcc57": "playerCount()", +"302bda24": "getSell(uint256,address,address)", +"302c46ba": "ReleaseTokenForTeamAdvisersPartners()", +"302cc9c3": "setroommoney(uint256)", +"302d350e": "firstChainedCallback(uint256)", +"302dfe97": "commissionPer()", +"302eb389": "transferFund()", +"302f3915": "LockFunds(address,uint256)", +"302f4303": "setRandomGenerateMethod(uint8)", +"30311898": "Account(address)", +"3032236f": "depositAndVest(address,uint256,uint256,uint256,uint256)", +"30322b12": "weiForMcr()", +"30323542": "_delOwner(address)", +"30324370": "fetchOrderByIdWithPayer(string)", +"30324f55": "DutchAuctionToBuy(address,address,address)", +"30326c17": "proposal(uint256)", +"3032f951": "advisorsBalanceMap(address)", +"30332aea": "P2()", +"3033f4d3": "pastOneHour()", +"30347537": "STARTING_CAT()", +"30366d5f": "getEventsCount()", +"3036d769": "minGasPriceGwei()", +"3037408d": "balanceOfAtTime(address,uint256)", +"3037801e": "recordNum()", +"3037cea3": "knownRoleNames(bytes32,bytes32)", +"3037e694": "disburseDividends(uint256)", +"30381f5f": "getHistoricalDelegation(uint64)", +"30389c45": "round1BonusSteps()", +"3038e357": "returnTokensToContractFrom(address)", +"3039b1ce": "changeETHLockingAddr(address)", +"3039e6f9": "CHARITY()", +"303a2372": "getDSP(address)", +"303a36e2": "getRow(uint256)", +"303a88b4": "convertRate(address,bytes32,bytes,uint256)", +"303b069f": "enableEmergencyWithdrawals()", +"303b5d3b": "toInt(string)", +"303b8144": "MobilinkToken()", +"303b9379": "SetLogFile(address)", +"303bef74": "deleteAllMessages(address)", +"303c2569": "payRakeInternal(address,uint256)", +"303c7d69": "allocatePrivateSaleTokens(uint256,uint256,uint256,address[],uint256[])", +"303d0870": "limitForChecklistId(uint8)", +"303e74df": "descriptor()", +"303ed73a": "setSkills(address,uint256,uint256[])", +"303ee989": "isPendingDeregistration(address)", +"303f5f51": "LEGEND()", +"303ff1d8": "YDTC()", +"30406423": "payJackpot()", +"30411a27": "testAddGains()", +"3041ba2a": "setForecasting(address)", +"3042b17d": "setUmkaAddress(string)", +"304318d3": "editDuration(uint256)", +"3043cbc5": "newTankType(uint256,uint256,uint32,uint32,uint32,uint32)", +"30443062": "penultimateFeePeriodStartTime()", +"3045a299": "Society(string,address)", +"3045aaf3": "Symbol()", +"3046868d": "AccountStructs(address)", +"3046fe26": "XulToken()", +"30473c2f": "getSelectedName()", +"30490e91": "processProposal(bytes32)", +"304a45c2": "getvalues()", +"304a87b7": "setOpenGroup(uint256)", +"304ab76a": "DebtTokenCreated(address,address,uint256)", +"304bac6f": "func_0A6E()", +"304c69ed": "_packItemData(address,uint256)", +"304cb3d8": "setTrusted(address,address,bool)", +"304d50b2": "addStar(address,uint8,uint8,uint16,uint8,uint8,uint8,uint256)", +"304d95a6": "RefundPoll(address,address,uint256,uint256,uint256,bool)", +"304dd754": "IsActive()", +"304ddebe": "eventSetWinner(uint256,address,uint256)", +"304de747": "MARKET_CAP_PER_ROUND()", +"304dfd33": "_onRandomFailed(bytes32)", +"304e48bb": "LogFundingReceived(address,uint256,uint256)", +"304e6ade": "setContenthash(bytes32,bytes)", +"304f34a0": "splitBid(uint256)", +"304f5027": "myUserWallet(address)", +"304f8af4": "sendBountyTokens()", +"30500684": "addEarlyBird(address,uint256)", +"3050226a": "addTransferableAddresses(address[])", +"30507451": "receiveBonus()", +"305075db": "NormalizeRanks()", +"305094ab": "ispackagesaleClosed()", +"30509bca": "claimBalance()", +"3050caa4": "calculateStake(bytes8,bytes5)", +"3050f769": "transactionsClaimed(uint256)", +"3052b75e": "changeEndTime(uint256)", +"3053aedc": "capDoublingTimestamp()", +"3054c79a": "transform()", +"3055e5e8": "JEMBUT()", +"30573dfa": "auditGuess(uint256,string,uint8,bytes,uint256)", +"305788fa": "newTransferProposal(address,string)", +"3057d5e0": "residualAmountPromille()", +"305876a7": "isRoundOver()", +"305939b0": "setReceiptAsset(address,address)", +"305997c8": "addIsSafe(uint256,uint256)", +"30599ba7": "SOSBOTTOM()", +"30599fc5": "recoverTokens(uint256)", +"3059ac30": "Escrow(address,address)", +"305a67a8": "cancelListing(uint256)", +"305a762a": "getTicketsCountByBuyer(uint256,address)", +"305a99c1": "Kemonocoin()", +"305b73d9": "configure(address,address,uint256,uint8,bytes32,bytes32)", +"305bcfab": "TrustlessTransaction_Protection_Seconds()", +"305d6d31": "stopFundRaising()", +"305e3552": "eggPrice()", +"305eae79": "updateBusinessWallet(address,address)", +"305ec69e": "finish(address)", +"305ed015": "giveReward(address)", +"305f17d5": "setCrydrController(address)", +"305fcef3": "decide()", +"306023a3": "allocateTeamTokens()", +"3061d568": "GOC()", +"3061e0ef": "changeRecovery(address,address,address)", +"3062cd8a": "purchaseETH()", +"30630699": "testDisputedWriteDifferentValueInState()", +"306387a4": "dealStatus(uint256)", +"3064061b": "checkNotSmartContract(address)", +"3064448e": "ASCCToken()", +"30659e74": "moneyBack()", +"3065a575": "setAElfDevMultisig(address)", +"3065d22c": "setVariationProbably(uint256)", +"30677b83": "multiplierFactor()", +"306781c1": "getCurrentPayoutBlock()", +"3068bffd": "grantIssuer(address)", +"30690468": "atleastZero(int256)", +"306a2ea8": "disapproveUser(address,bytes32)", +"306a401d": "delMarketMakerAddress(address,address)", +"306a8589": "p_update_mNewPlotTaxPercent(uint256)", +"306ab1ba": "forwardFundsAmount(uint256)", +"306ae57b": "standAndRebet(uint256,uint8[],bytes32,uint8,uint8,bytes32,bytes32,uint256,bytes32,bytes32,bytes32)", +"306b031d": "getGenerationEndAt(uint256)", +"306b0d84": "SetSharedStorage(address,address)", +"306b4dea": "addQuantityListItem(bool,address,address,uint256,uint256)", +"306c4ebe": "getCurrentTrancheVolume(uint256)", +"306c7290": "eth_balance()", +"306d4ed9": "userHasWithdrawn(address)", +"306df22d": "GPSDestination(int256,int256,uint256)", +"306e3e99": "COMPANY_SHARE()", +"3070352b": "buyAMI(string)", +"3070c38b": "checkTermination()", +"30710f01": "Crack(address,uint256,uint256)", +"30725c46": "_ownerOfPopInAnyPlatform(uint256)", +"3072cf60": "_initialized()", +"3073530b": "release_2()", +"3073c916": "cancelEscrowByProvider(uint256)", +"3073ef42": "calculateOperationFee(uint32)", +"307482cf": "POINT_ROOTNODE_ROLE()", +"3074cca7": "change_data(bytes32)", +"3074f556": "Compra_Ticket(uint256,uint256)", +"307540f6": "keys()", +"30756ab6": "MyTestToken()", +"3075f552": "getMax()", +"30762e2e": "allowManuallyBurnTokens()", +"30765517": "fechAllSumNumForCandidateByStage(uint256)", +"3076dc42": "intervalDuration()", +"3076e56a": "tankOut()", +"3077fdf1": "startNewICORound(uint256,uint256)", +"3078db6c": "transferAuthority(address)", +"307970b2": "addEntry(uint8)", +"3079ddc3": "isCanBuy()", +"307a1f46": "paramsValid()", +"307c6f8e": "job(string,string,uint256,uint256)", +"307c7a0d": "withdrawExcessBalance(address,address)", +"307ca045": "get_amount_minus_fee(uint256)", +"307d2a90": "priceEUR()", +"307e38ca": "isICAP(address)", +"307e8614": "returnUserBalance(address[2],bytes32)", +"307edff8": "endTokenSale()", +"307f35e6": "AobcToken()", +"307f6244": "changeMedia(address)", +"307f6b12": "findWinners(uint256)", +"30807e8e": "updateCSV(string,uint256)", +"3080b9c7": "SocialBlock()", +"30818189": "bonus1()", +"3082538f": "decimalMultiplier()", +"30835cc5": "BDCC()", +"3083a4f9": "withdraw_2()", +"3083ab1f": "closeContest(uint32)", +"30840c31": "testControlCreateWithParentForeignNotInUse()", +"3084e3ac": "nDEX(address,address,address,address,uint256,uint256,uint256)", +"30852db8": "newGame(uint256,uint256,uint256)", +"30859963": "getAttrVal(uint64,uint8)", +"3085c91d": "SellOrderCanceled(uint32,address)", +"30865362": "withdrawRemainingRewards()", +"308655b1": "A2AToken()", +"3086719a": "_setTokenUri(uint256,string)", +"3087110a": "donors()", +"30880441": "borrowFor(address,address,uint256)", +"308879bf": "setVoteCost(uint256)", +"308a9717": "_distribute(address)", +"308af165": "lastProcessedDay()", +"308b2fdc": "getProposalValueByIndex(uint256)", +"308b7fea": "rakeToken()", +"308c0065": "currentPrice(uint32)", +"308d6613": "getSignData(uint256,uint8)", +"308dc720": "DissolveBusiness()", +"308dccac": "EtherMinerals()", +"308e1b2f": "ltcId()", +"308e25ac": "InvestorsToken()", +"308e63f4": "TigerToken(uint256,string,string)", +"308f505b": "sellSupply()", +"308fb3ee": "GrapeToken()", +"3090bef7": "releaseLockedBalance(address)", +"3091bc8b": "acceptAndPay(bytes32,uint256[],uint256[],uint256)", +"30920505": "createInvestContract(address,uint256,uint256)", +"3092afd5": "removeMinter(address)", +"3092e73f": "getNoOfTokensTransfer(uint32,uint256)", +"30935e4b": "LogOrderCancel(address,uint256,uint256)", +"309424fe": "get_all_names()", +"30943fcf": "ownerCounter()", +"30945443": "update(address,string,string)", +"309593ee": "emergencyThaw()", +"30962d4d": "KyberContirbutorWhitelist()", +"309652ec": "getPoolMoney()", +"3097324c": "saleShare()", +"30977ab8": "recordMove(address,address)", +"3097f94c": "blok()", +"30982855": "setPublisherStake(bytes32,uint256)", +"30986dea": "timeToFinishPresale()", +"3098d33a": "payoutPartners()", +"309945ba": "collectedFees(uint256)", +"30996897": "placeBet(address)", +"309ab7e1": "getIsParticipate(address,uint256)", +"309b40b2": "liquidityStatus()", +"309b7ed3": "deleteParent(uint256)", +"309ba120": "upgradeClass(uint256)", +"309bdcf7": "createContract(uint256,string,string)", +"309c1769": "ProspectorsObligationToken()", +"309c315d": "calcTokenPriceFactor()", +"309c3ee2": "_grandPVPWinnerReward(uint256)", +"309d094b": "RELEASE_DATE()", +"309d6669": "addVerification(address,string,string)", +"309d8210": "ICOPart()", +"309d9358": "XENTToken()", +"309e078a": "destTokensBounties()", +"309e21a9": "rewardPromille()", +"309e36ef": "getNumberOfAccounts()", +"309e6005": "batchTransferEther(address[],uint256)", +"309e63e5": "SimpleConstructorInt(uint256,uint256)", +"309f7421": "buildTeamMapping(string,string,string)", +"309f955a": "updateTopicDescription(bytes15,bytes32)", +"309fcbdd": "MakeTradable(bool)", +"30a0b231": "oraclize_query(uint256,string,bytes[])", +"30a1d746": "shareholdersWalletAddress()", +"30a24abd": "create(bytes4,bytes)", +"30a3160d": "approveInternal()", +"30a35ce2": "getPOOL_edit_20()", +"30a39d5d": "preCoinSentToEther()", +"30a3ce81": "getNumChips()", +"30a55316": "smsCertifier()", +"30a65fdf": "set_buyPriceEth(uint256)", +"30a69955": "setFeeInfo(string)", +"30a69b53": "PlutocracyAchieved(string,string)", +"30a7351c": "removeFromApprovedAddress(address)", +"30a7a11c": "setRateEarlyStage1(uint256)", +"30a8b2c9": "NUM_TEAMS()", +"30a95aa7": "payService(address,uint256,uint32,string,uint64,uint64,uint64,uint64,uint64,uint64)", +"30a95e67": "withdraw_eth(uint256)", +"30a9ef5b": "checkTokBalance(address)", +"30aa311a": "QMQCoin()", +"30aa81c6": "getPayer()", +"30aacc0a": "setProjectAgent(address)", +"30ab0a16": "setInstructor(address,address,string,string)", +"30abac7b": "randomNext(uint256,uint256)", +"30abf433": "signBBODocument(bytes32,bytes)", +"30ac3052": "sendText(string,string)", +"30ac324b": "apply(uint256,uint256)", +"30acd249": "oneEtherInKicks()", +"30aceb89": "validateRequestParams(address[3],address,uint256[11],uint256,bytes,uint256)", +"30acedf1": "ownerFreezeTokens()", +"30ad12a6": "initializeFundraiserToken(address)", +"30adce0e": "etherReceived()", +"30ae8d0c": "Xinfin()", +"30af41b3": "getValidatorByIndex(uint256)", +"30b0e001": "airdropTokenDistribution(address,uint256)", +"30b0faab": "changeSettings(uint256,address,uint256)", +"30b2b8aa": "mintPresaleTokens(address,uint256)", +"30b3409e": "getInitialDeposit()", +"30b39a62": "withdraw(string,uint256)", +"30b3a90c": "_setCurrentPassportLogic(string)", +"30b4429e": "submitBlock(uint256,bytes)", +"30b5198f": "blockNumberUpdated()", +"30b57b1e": "player(bytes32)", +"30b66475": "VerifSignature(bytes,bytes)", +"30b66cee": "claimProxy()", +"30b69426": "calculate_eligible_token_balance(address,uint256)", +"30b7222f": "mintcoin()", +"30b751d9": "rivetzRelease(uint256)", +"30b823f7": "userGrowthAddress()", +"30b8f85d": "HSB()", +"30b9af98": "withdrawFunding()", +"30ba040a": "TOKENOMICX()", +"30ba2d4d": "eidooSigner()", +"30bb7499": "_batchActivenessUpgrade(uint256[],uint256[])", +"30bbb55e": "instructions()", +"30bd2ba9": "MassivelyMultiPlayerOnlineVideoGames()", +"30bd3eeb": "tokenRewards(address)", +"30bd60ef": "marginCall(bytes32,uint256)", +"30bdd344": "getPossibleWinAmount(uint256,uint256)", +"30bdf202": "RobinHood()", +"30be5990": "updateThirdChangeBlock(uint256)", +"30bf00cd": "mintFresh(address,uint256,int256)", +"30bf2d3e": "whaleBalance()", +"30bfeded": "EffectAdded(uint256,uint256[])", +"30c0f8d6": "scheduleTransaction(address,bytes)", +"30c2927d": "concludeUFT()", +"30c2fb04": "UserAuthManager(address)", +"30c308d8": "testInsertCase()", +"30c30a50": "authorizeMintFulfiller(address)", +"30c33da7": "_addPresale(uint256,uint256)", +"30c3eaa8": "grant()", +"30c47f77": "getEtherCoinPrice()", +"30c5375e": "ConstructHuntStart()", +"30c5a614": "ethereumToTokens_(uint256,uint256)", +"30c74e04": "tokenWithdraw()", +"30c8a488": "ERCToken()", +"30c8f372": "getTrustedShopCount()", +"30c93307": "GetPermissionIdx(uint256)", +"30c97068": "plockFlag()", +"30ca0a53": "DELEGATION_HASH_EIP712()", +"30cb14d2": "pop(bool)", +"30cc1d18": "airDropShadowTag()", +"30cc248e": "increaseProfit()", +"30ccc891": "testTransferHandlesNegativeAmountRequest()", +"30ccebb5": "getStatus(address)", +"30cd90b8": "transferToAddress(address,address,uint256,bytes)", +"30cd9ac6": "TokenAuctionCompleted(uint256,address,address,uint256)", +"30cdc195": "xclusivecoinSupply()", +"30cdcc63": "MAX_ISSUED_FROM_OTHER_CURRENCIES()", +"30cddc83": "checkIfCustodiesServedETH(address[])", +"30ce7b5d": "generateWinNumber()", +"30ce8bd5": "_rightChild(uint8)", +"30ced655": "EventRandomLedgerRevealed(address,uint256,uint256,uint256,address)", +"30cf7af6": "FreeZombieCount()", +"30cfac6c": "assignTo(uint256,address,uint256)", +"30d02d83": "batchWithdraw(uint256,uint256)", +"30d07d61": "getParticipantName(uint256,uint256)", +"30d12640": "disableWithdrawal()", +"30d15b0a": "lockInQuarterFinalPrize()", +"30d1c191": "MetaPoc(address)", +"30d2219b": "add(string,string,string,string,string,bytes32)", +"30d2474f": "buy1ticket()", +"30d281e0": "getChannelInfo()", +"30d323ae": "NHC()", +"30d4b967": "Octogram()", +"30d4d8d0": "_verifyHistoryInputOrRevert(bytes32,bytes32,bytes32,uint256,address)", +"30d500bf": "CFO()", +"30d636a0": "SmartVerifying()", +"30d65b72": "getPaymentsFor(address)", +"30d68214": "transactionReplay(address,uint256)", +"30d86516": "verifyTransferSignature(bytes32,address,uint8,bytes32,bytes32)", +"30d88a9e": "DISPLAY_VIDEO()", +"30d9161d": "cancelCreatorAuction(uint40)", +"30da4684": "buyPriceFinal()", +"30db7654": "activeBuy()", +"30dbb4e4": "isUnlocked(address,uint256)", +"30dce923": "getDeactivatedList(address)", +"30dcf0e8": "calculatedTokens(address,uint256)", +"30dd6a42": "totalSoldToken()", +"30dd9ee4": "confirmMinerQuest(address)", +"30de7e88": "FINXToken()", +"30df2c47": "currentSeller()", +"30df7727": "canRemove()", +"30dfc62f": "fundValueCount()", +"30dfe1da": "getTransactionCount(bool)", +"30e0789e": "_transfer(address,address,uint256)", +"30e07be0": "getMaxAmountToWager(uint256)", +"30e08a6e": "adjustMinter(address,bool,int256)", +"30e0f7e9": "setToppingUpBankroll(bool)", +"30e1e4e5": "freeze(address,uint256,uint256)", +"30e1f16f": "claimDividendAll()", +"30e26cb8": "disableBundling()", +"30e290e4": "Twitter()", +"30e34360": "setValue(bytes32,bytes15)", +"30e44278": "howVotesHasDispute(uint256)", +"30e45c14": "preSaleHasEnded()", +"30e4f9aa": "contractbalance()", +"30e57b67": "getNumberOfCrySolObjects()", +"30e5be52": "Prototype()", +"30e656d8": "addAnimal(uint256,bytes32,uint8)", +"30e6570b": "BucketSell(bytes32,uint256,address,uint256)", +"30e664f6": "getBuy()", +"30e6c333": "producedGoldCaps()", +"30e6d8d3": "addInitialInvestor(address)", +"30e7002c": "POCN()", +"30e76dae": "getContractEtherBalance()", +"30e77c75": "EthTranchePricing(uint256[])", +"30e804d1": "withdrawFromProject(address,address,uint256)", +"30e80864": "setTrustedAddr(address)", +"30e82803": "balanceOfByPartition(bytes32,address)", +"30e8b963": "reserveMember()", +"30e9c341": "updateTimeLock(uint256)", +"30e9f6ed": "STATUS_NO_DEAL()", +"30ea55a0": "updateEventStartsTime(bytes32,uint256)", +"30eaa9b5": "priceIncrease_20_February()", +"30eb4934": "_validateRefundTimestamp(uint256)", +"30eb4ba8": "setHoldDuration(uint256)", +"30ebf88c": "createGuess(uint256,uint256,string,uint8,uint256,uint256,uint256[],bytes32[],uint256)", +"30ec0e2b": "setHolder(address,address,address)", +"30ec98a1": "OKFToken()", +"30ece116": "setOpeningTime()", +"30ed54ed": "setVestingToken(address,address)", +"30ee776c": "StopTransferToken()", +"30ef3d56": "takeNumber(uint256)", +"30efac4e": "changeCardPrice(uint256)", +"30efb8d3": "doUnpause()", +"30f1154f": "updateNodeIPFSHash(bytes)", +"30f12642": "createContractPreciousForEdition(address,uint256,string)", +"30f1fe82": "checkLength(string)", +"30f20847": "CandyBox()", +"30f24455": "_getProductShopInfo(uint256)", +"30f3f0db": "increase(uint256)", +"30f46b70": "power(uint8,uint8,uint8,uint8[176])", +"30f4babb": "Fetch_User_Profile(uint32)", +"30f4f396": "UTBTokenTest(uint256,string,string)", +"30f4f4bb": "getMarketData(bytes32)", +"30f56d21": "RoundEndTime()", +"30f59c1b": "lastTicketBought(uint256)", +"30f6716f": "HFCoin()", +"30f6eb16": "mintedForAccountInBlock(address,uint256)", +"30f75890": "MilestonesEntity()", +"30f7cf80": "stox()", +"30f7f148": "ONEPAY()", +"30f857f3": "addPrivateSaleWithMonthlyLockup(address,uint256[],uint256)", +"30fa27cc": "_BTC()", +"30fa9ef3": "SantimentWhiteList()", +"30faa3e9": "compareHands(uint8,uint8)", +"30fb641b": "PurchaseFailed(address,uint256,uint8)", +"30fb6bfb": "setMessage(uint16,string)", +"30fb7541": "_createSkull(uint256,uint256,uint256,uint256,address)", +"30fba22f": "changeManipulatorAddress(address,bool)", +"30fbe411": "endIco3()", +"30fd300f": "registerBytes32(address,bytes32)", +"30fd7696": "createLoveStoryWithData(bytes16,bytes32,bytes32,uint256,string)", +"30fe86b7": "declarePulicOfferingPlan(uint256,uint256)", +"30fee9b1": "setICOtime(uint256,uint256)", +"30ff2ad5": "needVerifiedAccount(bool)", +"31002556": "getAmountToGive(bytes,uint256)", +"310092b9": "REFUND_TIME()", +"3100ef7b": "Fulcrum()", +"3101170b": "addPixelPayable(uint256,uint256,uint256,uint256,uint256)", +"31014853": "buySWL()", +"3101ab7f": "confirmEjectment()", +"3102b21a": "setAllocation(address[],uint256[])", +"3102be4c": "ownerHistoryOf(uint256)", +"3102deb7": "SetPlayerBetInfo(uint8,address,uint256,uint8)", +"3103fa26": "firePaidProposalEvent(address,uint256)", +"310441fa": "payees(address)", +"31047973": "lightpool()", +"3104b21a": "unApprove(address,uint256)", +"3106aa80": "getLLV_edit_21()", +"3106e50e": "joinBet()", +"3106fea0": "voteOnProposal(uint256,bool,uint256)", +"31076417": "setTokenUSDRate(uint256)", +"310774a3": "setContractPreICO(address,address)", +"310781e7": "LogCertificationDbRegistered(address)", +"310815ee": "setDesignatedReporterShowed(bool)", +"31085c5f": "getAddressByNickname(string)", +"31088032": "MTOKEN()", +"310883a8": "player2Timestamp()", +"3108bd87": "voteNoLockBatch(address[],uint256[])", +"3108f0d7": "isNotZero(uint256,string)", +"310b065b": "cerotest()", +"310bc5fc": "newAsset(uint256,uint256,uint256,bytes32,bytes32,uint256,bytes32)", +"310bd74b": "reset(uint256)", +"310c0c1e": "minRollUnder()", +"310c87cc": "NFTAddress()", +"310ce4e2": "execute(bytes32,address,int256)", +"310d3f69": "token_description()", +"310e5ce7": "isBreedingMarket()", +"310ec4a7": "setAllowance(address,uint256)", +"310efb48": "setResult(uint256,uint256)", +"310eff5d": "pageByGroup(string,uint256)", +"310f4cdd": "mint(uint256,string,uint256,uint256,address)", +"3110235a": "maxInvest()", +"311028af": "initialTotalSupply()", +"311104f3": "getMintRequestsLength()", +"31119b4d": "changeDeveloper(address)", +"3111dcfd": "_nextAmount(uint8,uint256,uint256,uint256,uint256,uint256)", +"311277c1": "PHASE3_RATE()", +"3112fb6e": "BackToLife()", +"311325bd": "totalPledgedFees()", +"31134651": "donateToLovers(bytes32)", +"311385f4": "oraclize_query(string,bytes[3],uint256)", +"3113b8fa": "initDebris(bytes32,uint256,uint8)", +"311515a3": "disableInterface(string)", +"311551ad": "_getCalculationStartDate(bytes32)", +"311551d7": "MasternodeMinedTokens(address,uint256)", +"31159923": "isAllocatedICO()", +"3115b4c4": "bulkStoreHeader(bytes,uint256)", +"3115c3ee": "exploreEMONTFee()", +"3115d2ce": "ZitKOIN()", +"31170c0e": "Joyso(address,address)", +"3117d6bb": "request(bytes32,string,string)", +"31184dc3": "get2(uint256)", +"3118879a": "removeSurvey(bytes32)", +"3118dc71": "aSites(uint256)", +"3119255c": "setMinBetPerTx(uint256)", +"31198d19": "transferEthFromContract(address,uint256)", +"311a6c56": "rule(uint256,uint256)", +"311a985f": "testNotEnoughMemory()", +"311b2e98": "totalBetsMade()", +"311bcda6": "stage1Sale()", +"311c2644": "ironTokensaleRunning()", +"311d5a2a": "recordBalance(address)", +"311fb64f": "countInvestorsRefunded()", +"3120cefa": "NickoinToken()", +"31212a6b": "unicornRanchAddress()", +"3121369d": "validateRequiredStackDepth(uint256)", +"3121c7c0": "buyMultiplier()", +"3121db1c": "setName(address,string)", +"312212c1": "stoptransfer()", +"312220bc": "payoutQuickBonus(address)", +"312253ae": "newOption(uint256,uint256,bytes32,bytes32)", +"31225ad1": "icoThreshold3()", +"31226f71": "writeMerchandises(uint8,string)", +"3123016d": "calcCostLevel(int256,int256[],uint256)", +"31230e23": "createWithParent(bytes32,bytes32,bytes32)", +"31232cd3": "pre_amount_stages(uint256)", +"312386b7": "techDevelopmentEthWallet()", +"3123bd9d": "memberProfitShare()", +"3124167b": "_getTokenAmount(uint256,bool,address,address)", +"312452b3": "mLoadAndReturn(uint256)", +"3125443d": "secondChangeBlock()", +"31277306": "buyByEth(address,uint256)", +"3128012a": "logEthDeposit(address,address,uint256)", +"31288397": "payWithoutChecksum(uint128,address)", +"3128d1be": "buyName(string)", +"312975a6": "setReservedHolder(address,address,address)", +"312983dc": "LogForkAnnounced(string,string,uint256)", +"3129be35": "calculateCoinsPerWeiAndUpdateAvailableIcoCoins(uint256)", +"3129e6d4": "RATE_SALESTAGE3()", +"3129e773": "getItem(uint256)", +"312ad4b9": "banThreshold()", +"312c0684": "Organicco()", +"312cba69": "EternalStorageProxyForPayinMultisender(address)", +"312dae8a": "changeCrowdsaleClosingTime(uint256)", +"312defb4": "INITIAL_ENDTIME()", +"312df321": "p_update_mRefPercent(uint256)", +"312f8b19": "blockedTime(uint256)", +"31302244": "approveAsInvestor(address,int256)", +"3130e89d": "EtherShot()", +"313138e1": "tuneLambo(uint256,uint256)", +"313186e7": "_calculateTotalLockedBalance(address)", +"3131d8de": "etherflipContract()", +"31324b0a": "IOXOwned()", +"3132605d": "DinoToken(uint256)", +"313354dc": "maxSellable()", +"3133f2a7": "outstandingBalance()", +"31347482": "CSELToken(uint256,string,string)", +"3134e2e1": "_setCollectRoundLength(uint256)", +"3134e9be": "verifyLinkPrivateKey(address,address,address,address,uint8,bytes32,bytes32)", +"3134f4f1": "SpecialRatedCrowdsale()", +"3135471d": "privateEtherFunded()", +"3135ed16": "race_start_block()", +"313602d4": "claimRemainingTokens()", +"31361399": "setICODate(uint256)", +"31363c86": "esteem(bytes32,string,address)", +"3136fa86": "NeuroProtect()", +"3136fbb8": "totalBaseLareSoldInMainSale()", +"31375242": "ownerSetTreasury(address)", +"31378811": "updateUserDetailsInBulk(address[],uint256[],uint256[],uint256[])", +"3137f3d4": "FhnwToken()", +"31380c89": "TokenSale()", +"3138d328": "gameMining(address,uint256)", +"3138d8d5": "Bid(uint256,address,uint256,uint256)", +"3138ee5c": "getPermittedContracts()", +"31391828": "_computeTournamentIncentiveReward(uint256,uint256)", +"31399b4d": "indexOfOperator(address)", +"3139c691": "_isInWhiteAddresses(address)", +"313a9204": "addPurchased(address,address,uint256)", +"313aaf96": "Double(bytes32,uint8)", +"313b7b19": "finance()", +"313c4093": "newExit(address,uint256)", +"313ce567": "decimals()", +"313d98f3": "getTokensTo(uint256,address)", +"313dab20": "treasuryBalance()", +"313f5a57": "tradeAirswap(address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)", +"313f944f": "externalPurchase(address,uint256)", +"313fc3fc": "getMyRevenue(uint256)", +"314094c2": "devfee()", +"3140b09e": "distributeBonusTokens()", +"314312d3": "setEtherDeltaExecutor(address)", +"31434041": "burnSTCDR(uint256,uint256)", +"3143d97c": "setTimeLock(uint256,uint256)", +"3143fd60": "dev_allocation()", +"314475b2": "TokenEntity()", +"31447a32": "KeplerTokenCrowdsale(uint256,address,address)", +"3144c859": "executeCode(bytes)", +"31462b96": "the_nominal_annual_interest_rate()", +"3146a6bb": "transferTeam(address,uint256)", +"3146d282": "HyperTestToken()", +"31477b9b": "getString(bytes32,bytes32)", +"31483bdc": "PushToken()", +"314848fa": "CICoin()", +"3148ac62": "InitialRateChange(uint256)", +"3148f14f": "modExp(uint256,uint256,uint256)", +"3149694a": "burnHackingAmount(address,string)", +"314989b2": "SimplePHXSalesContract()", +"3149c440": "transferDomain(bytes8,string,address)", +"314a05db": "ownerRetrieveContractConfig2()", +"314a522e": "getTermsContractParameters(bytes32)", +"314aabb5": "EthDice50()", +"314cd12c": "createPromoToken(uint256,address)", +"314dd783": "GoldiamICO()", +"314e0fb6": "scheduleTransaction(address,bytes,uint256[3],uint256)", +"314e39c3": "trustContract(address)", +"314e99a2": "abdicate()", +"314ec2e5": "set_sale_owner(address,bool)", +"314ef8cb": "Besiktas()", +"31503ec4": "setFeeWalletAddress(address)", +"3150456e": "GenChipIndex(uint256,uint8,uint256[],uint256[],uint256[])", +"3150a7da": "HarvestedBabyBrain()", +"3150efbd": "beneficiaryMultisig()", +"31511e61": "getAffiliateCount()", +"31513039": "transferTokensFromAnyWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"3151609e": "setMetadata(uint256,bytes32)", +"3151ecfc": "myDividends()", +"3152dd00": "fundingActive()", +"31543cf4": "getTemplate(uint256)", +"3154d790": "rentByAtom(uint256,uint256)", +"3155625c": "setCleide(uint256)", +"3155c856": "getTotalF5()", +"31561b0d": "isGauntletExpired(address)", +"3156560e": "setApprover(address)", +"31577cc0": "getModuleIDByAddress(address)", +"3157be49": "imageVerified()", +"3157d347": "nonVestedTokens(uint64)", +"31580446": "acceptDividends(uint256)", +"3158923d": "setReferralshipAddr(address)", +"3158c52b": "isSoftCapAchieved(uint256)", +"3158f643": "ico1Ended()", +"315a095d": "withdrawTokens(uint256)", +"315a0a09": "BasicForecasting(address,uint256,address,address,address)", +"315a6001": "purchaseUniqueSpinner(string)", +"315a6d65": "withdrawTeamToken(address)", +"315ad5ce": "resetGroupInfo(uint256)", +"315b86da": "MNPYToken()", +"315ccd21": "MAX_ETHER()", +"315d142d": "GayCoin()", +"315d758f": "_setERC20compatibility(bool)", +"315e2f1b": "setTestString(string)", +"315e3124": "pack(bytes4,address)", +"315e6c0a": "UpgradedContract(uint256,address,address)", +"315ebe81": "LockedOutTokens(address,address,uint256,uint8,uint256,uint256)", +"315f81c5": "useVaults(uint256,uint256)", +"315fd022": "MyToken(uint256,uint256,string,string)", +"315fdea3": "TreasureChest()", +"315fe684": "getMyPrize()", +"31601d09": "AuctionCreated(uint256,uint256,uint256,address)", +"31606828": "registrationDeposit()", +"3160d63b": "removeSupport(address)", +"31616395": "crowdsaleContract()", +"3162360d": "_emitBoardRatingGiven(address,uint256,uint8)", +"31629388": "setPendingValue(uint256,bytes32)", +"31638ced": "getDatasetByIndex(uint256)", +"3163b41a": "AdjustableRoundsManager(address)", +"31641629": "releaseSomeKims(uint256)", +"31649233": "allocatedTotal()", +"316524e5": "setGene(uint256,bytes)", +"31657926": "ticketsOf(address)", +"3165a051": "revealHiddenPosition(uint32,int64[],bytes32,uint64,bytes16,bytes32)", +"3165b26e": "transferOnBehalf(address,uint256,uint256,uint8,bytes32,bytes32)", +"31666144": "BTCproxy()", +"31666156": "latestReferenceBlockNumber()", +"3166e133": "Metropolis()", +"3166f49f": "balances_for_refund(address)", +"31670619": "GROWCHAIN()", +"31670ea7": "resetWithdrawEtherToValues()", +"31671a02": "TokenClaim(address,address,uint256,uint256)", +"31671f57": "Litecoinprivate()", +"31677980": "migrationCompleted()", +"3167e9d2": "infoUrl()", +"316866bf": "getRatingsForAddress(address)", +"3168e98a": "getExtensionFor(bytes4)", +"316943cc": "transferExtOwnership(address)", +"31694d6f": "TEAM_TOKENS_SUPPLY()", +"3169ff3e": "LooneyLottery()", +"316a0131": "viewWinningOption()", +"316b08a0": "scheduleTransaction(address,bytes,uint256[7],uint256)", +"316b13b4": "setMemberContract(address)", +"316b8cab": "Oogroll()", +"316bc682": "setKYCLockupIgnoring(bool)", +"316cb1b4": "withdrawKittenCoins()", +"316db7f2": "updateInfo(uint256)", +"316e539e": "currentStanding()", +"316f2f06": "requestUnclaimed()", +"316fb7c4": "updateGoal(uint256)", +"316fda0f": "cycleCount()", +"317053f8": "setStringMember(string)", +"31707a05": "initOwner(address,address)", +"31711884": "tokenRate()", +"31711abe": "bookkeep(address,uint256,uint256)", +"31719c69": "lastPriceSetDate()", +"31723abd": "DMTokenC()", +"31729a45": "setCommission(address,uint256)", +"31748401": "_investorAddresses(uint256)", +"3174cc87": "refundToBuyersIfSoftCapNotReached()", +"31757f2e": "collisionCount()", +"3176bd18": "MyTestingToken()", +"3176d373": "updatePriceFci(uint256,uint256)", +"3176e734": "addHiddenPosition(uint32,bytes32)", +"3176f912": "getPlayersBattlePower(address,address)", +"3177029f": "approveAndCall(address,uint256)", +"3177b83a": "isCustomerHasACC(address)", +"317830b4": "crowdsalePaused()", +"31787b91": "maxIcoDuration()", +"31798893": "DistributedSoFar()", +"317a71ea": "_removePendingRequestId(uint32)", +"317ab6dc": "getChampsCount()", +"317b0b77": "_setCloseFactor(uint256)", +"317b4b76": "setPreIcoMin(uint256)", +"317c00be": "maxTokensPerArticle()", +"317c0ae9": "tokensByZecTx(string)", +"317c1291": "isCrowdFundActive()", +"317cd9fb": "setethtoken(address)", +"317d5d9b": "rand(uint32)", +"317d7a2b": "depositInfo(uint256)", +"317d9453": "getContractTokenBalance()", +"317ebc79": "scoreTeams(uint32[],int32[],uint32[])", +"317ec08b": "removeMaliciousValidator(address)", +"317ed7dc": "rebateTwoFenzi_()", +"317ffcf2": "getCreateUnicornPrice()", +"31806aaf": "unlockBalanceByKey(uint256,uint256)", +"318077a1": "Logo(address,address,string)", +"31809eac": "dayAfterInMinutes()", +"3182c3aa": "createSale(uint256,uint256,uint256,string,uint256)", +"31836cb9": "testMiddleTranch()", +"31839753": "getVolumeBonusAmount(uint256,uint256)", +"3183a55c": "Alchemy(uint256,uint256)", +"3183ef3d": "_release(address)", +"31845f7d": "setPublic(uint256)", +"31852177": "ConsToken()", +"31852a02": "allocate6ProjectToken()", +"31859556": "startPreico()", +"3185a61e": "getSellOrder(uint80)", +"31861423": "_deleteAllPackedRevisionTimestamps(bytes20)", +"3186f390": "tokensToPartner()", +"3187878b": "Follor()", +"31885119": "mintSelf()", +"3188949a": "DIT()", +"3188c5b1": "updateTotalChild(address,address)", +"3188da5f": "meltCoin(address,uint256)", +"3188ed13": "UNSOLD_ALLOCATION_SIZE()", +"3189418f": "connect_to_nodelist()", +"318992d0": "RewireToken()", +"318a3fee": "relayTx(bytes,int256,int256[],int256,int256)", +"318b526c": "AIGInvestment()", +"318cbe20": "BountyBG()", +"318dbcae": "releaseFundsBuyer()", +"318e6c78": "getAdminAddress(address,address)", +"318f0fe9": "acceptRequest(address,address)", +"318fd7e4": "HomeChainToken(address)", +"318fd93d": "registerSeller(string,string)", +"31906ebd": "airdropTotal(address)", +"3190abc0": "addCustomer(string,string)", +"3192164f": "idle()", +"31921cad": "headerColor()", +"319288d8": "setNVTface(address)", +"3192b995": "developer_crowdsale_text(string)", +"3192cccb": "queryTokenGrant(address)", +"31933916": "getMessageCount()", +"3193c749": "placeBet(uint256,uint256,uint256,int256)", +"31950032": "createContract(bytes32,uint16,bytes8,uint256,uint32,string,uint32,uint64[],bytes8[],uint32,bytes32)", +"319609fa": "EtherPiggyBank()", +"31970bd8": "nextRangeID()", +"31978b99": "changeBoardMetadata(bytes32,bytes32,string)", +"3197cbb6": "endTime()", +"31985b51": "sendGiftCard(address,address)", +"3198a38f": "findAllCliWithPendingTask(address)", +"3198acad": "Billionsgame()", +"319983f8": "FoundationSupply()", +"31999749": "getTimePeriodsUsed(uint256)", +"319a2494": "getBlockOf(address)", +"319a30d4": "setConfiguration(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"319a9395": "setGlobalLock(bool)", +"319ae4b2": "spaceCount()", +"319af333": "log(string,address)", +"319b0cd2": "calculateRate(uint256)", +"319b0e75": "getTotalInvested(address)", +"319c068c": "current_round()", +"319c33cc": "setOrganization(string)", +"319c7748": "_KiwiToken()", +"319dac48": "polishRoughStone(uint256)", +"319db3be": "advisorWallet()", +"319df3bf": "icoManager()", +"319f0852": "MSCTToken(uint256,string,string)", +"319f21b6": "placeGame(uint8,uint256,uint256,uint8,bytes32,bytes32)", +"319f3930": "mintFraCoins(uint256)", +"319f7700": "SealCrowdsale()", +"319f9887": "SnowdenAffect()", +"31a02bce": "requestMint(address,uint256)", +"31a06772": "scrap(uint256)", +"31a079ca": "ArtexToken()", +"31a14db3": "getParticipantName(bytes32)", +"31a2aba8": "create(address,uint256,uint256,address,address,address)", +"31a360b4": "LUVITOKEN()", +"31a36424": "getAllAdmin()", +"31a38c89": "executed()", +"31a3a506": "closeFunding()", +"31a3b36f": "blockDotTimestamp()", +"31a3b873": "ICO_MIN_CAP()", +"31a40b62": "delAuthorized(address)", +"31a51f46": "getTransactionConfirms(bytes32,uint256)", +"31a642db": "getTransferInfoValue(address,uint256)", +"31a73991": "GetUserIdByAddress(address)", +"31a76bca": "FOUNDERS_VESTING_CLIFF()", +"31a7d4c2": "LogPause(uint256,bool)", +"31a83ca2": "oraclize_randomDS_setCommitment(bytes32,bytes32)", +"31a8aeb3": "stakeFrom(address,uint256)", +"31a95c7a": "redeemTokens(address,address,uint256)", +"31a97ff0": "noteInitialReportingGasPrice()", +"31a9b2f2": "maximumPurchase()", +"31aa01c4": "contributed2(address)", +"31aa91fc": "completeContribution(address)", +"31aaa74a": "accountParent(address)", +"31ab4066": "testAuthorityTryAuth()", +"31ab6055": "TMCoin()", +"31abdd2a": "calculateEthValueFromTokens(uint256,uint256)", +"31ac7253": "releaseState3()", +"31ac76c7": "getSiteTokenLength(uint256)", +"31ad6b62": "sendToEthertoteDevelopmentWallet()", +"31ad836e": "Flabba()", +"31adba2f": "victimsCount()", +"31ae0019": "KissBTC()", +"31ae450b": "getAdmins()", +"31ae6b6e": "isFactProviderInWhitelist(address,address)", +"31af56ed": "transTo(address,address,uint256)", +"31afa55f": "decreaseMonsterExp(uint64,uint32)", +"31b0795c": "registerAddress(address,address)", +"31b259cf": "setUser(address,address,string,string,string,bytes32)", +"31b27c44": "DeusMarketplace(address,address)", +"31b28664": "PAGE_SIZE()", +"31b29629": "ownerAddBankroll()", +"31b2d49c": "cancelOrder(address,address[5],uint256[8],bytes32,uint8,bytes32,bytes32)", +"31b31b88": "setTokenFee(uint256)", +"31b36c45": "CHECKgamberTwo()", +"31b39a56": "addWalletConfig(uint256,uint256,uint256,uint256)", +"31b3eb94": "withdrawPayments(address)", +"31b4784e": "lastUpdateOverall()", +"31b48f86": "setPeriods(uint32,uint256)", +"31b57b46": "initialize(address,address,bytes32,address,int256,bytes32,address,int256,bytes32,uint256)", +"31b59508": "LDIT()", +"31b5da2a": "numMC()", +"31b61ece": "getAllLeftHand()", +"31b62fae": "GetCardInfo(uint32)", +"31b6421e": "Approve(uint256,bool)", +"31b77da4": "getEmptyIndex()", +"31b7a196": "emitGenericLog(string,string)", +"31b7c458": "claimedAirdropTokens()", +"31b8b100": "Static()", +"31b93ae6": "MIN_PRESALE2()", +"31b97e45": "addGame(bytes32,bytes32)", +"31b9d81d": "kscBatchTransferToEcosystem(address,address[],uint256[],uint256,uint256[],string)", +"31ba7ede": "create(address,bytes32,address,bytes32,bytes32,address,bytes32)", +"31baa8ae": "getCitizenCharacteristics(uint256)", +"31bab608": "getVersionSelectors(bytes32,bytes32,bytes32)", +"31bac434": "unpauseMint(uint256)", +"31bae156": "getPartialAmountRoundedUp(uint256,uint256,uint256)", +"31bbb695": "takeCapital()", +"31bcce1c": "CryptoAtoms()", +"31bcd2b7": "sendTokens(uint256,uint256)", +"31bd1fa5": "levAddress()", +"31be23e4": "getLotteriesLength()", +"31be6985": "testBitXorSuccess()", +"31be6a17": "addNewGroup(bytes32,uint256,uint256)", +"31beedd9": "setOWhitelist(address[])", +"31bf0667": "tokensaleWallet()", +"31bf0b42": "setSB(uint256,uint16)", +"31c0018b": "listApi(uint256,bytes32,bytes32,string,string)", +"31c05b8f": "getWalletAddress(bytes8)", +"31c15301": "maxRandom(uint256,address,uint8)", +"31c1eea4": "delCEx(address)", +"31c29c25": "newContribution(address,uint256)", +"31c2b6e6": "animator()", +"31c2bd0b": "propose(address,bytes,uint256)", +"31c33669": "GetChequeInfo(string)", +"31c359fa": "getReferralAddress()", +"31c3e2c9": "VotingProxy(address,address)", +"31c3e456": "update(string,string,string)", +"31c420d4": "unfreezeTransfers()", +"31c42ca6": "testSell()", +"31c571f5": "setLastStellar(address,uint256,uint256,uint256)", +"31c5e407": "PaymentSubmitted(address,bytes8,uint256)", +"31c5e56b": "init(address,uint256,uint256,uint256,uint256,uint256,uint8)", +"31c6c4cf": "transferFromWithReference(address,address,uint256,bytes32,string)", +"31c78498": "Metadollar()", +"31c89d3e": "FromQueue(address,address)", +"31c91117": "withdrawAllEther()", +"31c9472a": "constantname()", +"31ca0bae": "DAO(address,uint256)", +"31ca208c": "greylist(address)", +"31ca4340": "GetTokenData(uint256)", +"31ca6b67": "setWinnerManually(uint256)", +"31cb27d7": "processHandEndSplit(uint256,uint256)", +"31cba838": "BOUNTY_ADDRESS()", +"31cbf288": "createContract(string,address,address,string)", +"31cbf5e3": "pay(uint256,address)", +"31ce6b47": "getTicketCounter()", +"31cfcf84": "IDAGToken()", +"31d03594": "getOfferPrice(uint256)", +"31d0e3f5": "setChainlinkToken(address)", +"31d1c995": "_batch1_icosaleStartTimestamp()", +"31d29af1": "getMyWallet(address)", +"31d2f891": "crowdsaleAddress()", +"31d31647": "hasSenderVoted(uint256)", +"31d3518a": "IvoryToken()", +"31d35cb2": "getDayEthIn(uint256)", +"31d36cf0": "relaySellerCancel(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32)", +"31d397ef": "initialWallet()", +"31d4116f": "nextsize()", +"31d41325": "isMonethaAddress(address)", +"31d42bf2": "addBlackAccount(address)", +"31d4ac45": "bookWithLif(uint256,uint256,bytes,string,uint256[],bytes32)", +"31d4ed2e": "_isUnderLimit()", +"31d4fad4": "refundPayment(uint256,address,string)", +"31d6183b": "tokensToEth(uint256,uint256)", +"31d67353": "transfer_data(address,uint256,string)", +"31d694a0": "NEBC()", +"31d78a50": "signedApproveAndCall(address,address,address,uint256,bytes,uint256,uint256,bytes,address)", +"31d87de2": "setRBACAddress(address)", +"31d90e04": "canClaimPayout()", +"31d98b3f": "getPrice(bytes32)", +"31d9931f": "setOwnedTokensIndex(uint256,uint256)", +"31daabb7": "updateOwner(uint256)", +"31db4b95": "doTriggerAuth()", +"31db6c48": "TYPE_EXPLORER()", +"31db9efd": "right88(uint256)", +"31dbd8a5": "feeAuthority()", +"31de13e8": "tBonusStageEnd()", +"31de7e72": "iceFund()", +"31deb7e1": "nodeCost()", +"31e12c20": "setowner()", +"31e19cfa": "getStrategyCount()", +"31e396c8": "calculateYourValue1(uint256)", +"31e3e2fe": "WithDraw()", +"31e41fba": "_localFight(uint32,uint32)", +"31e5144c": "isAvailable(uint32)", +"31e574a5": "addProduct(address,uint256,string,string)", +"31e59772": "deletenullarr()", +"31e5f055": "one_card()", +"31e63199": "codename()", +"31e6a707": "getWalletInfoByIndex(uint256)", +"31e7b060": "constructProof(bytes32,bytes32[],bytes1[])", +"31e7bf9d": "Multivest(address)", +"31e88fee": "claimedPartnerPreICO(address)", +"31e8c7ba": "CertID()", +"31e8ebbb": "DenToken()", +"31e92f32": "blocksPerMonth()", +"31e99e2b": "getCurrentSmartSpeedPrice()", +"31e9e9c0": "unlockToken(address,uint256)", +"31e9ea8a": "PlaceBet(address,uint256,uint256,bool)", +"31e9ee7c": "currentIcoWallet()", +"31ea1a39": "cancelDeal(uint256)", +"31eaa5c9": "erc20CTH()", +"31ebd13f": "logAllStart()", +"31ee080d": "setComisionInvesorInTokens(address,bool)", +"31ee6c2e": "dividePerfectlyBy(uint256,uint256)", +"31ee8277": "_createship(uint256,address)", +"31ef107f": "SetProfitAddr(address)", +"31ef916a": "approve_timed(address,uint256,uint256)", +"31f01140": "getUserInfoById(uint256)", +"31f0528e": "updateNextGameMinAndMaxBlockUntilGameEnd(uint256,uint256)", +"31f070d9": "getSet()", +"31f09265": "withdraw(address,uint256,bytes)", +"31f0fca1": "_addTokenToTranche(address,bytes32,uint256)", +"31f170c2": "coinSupply()", +"31f1fd2b": "setCriterionTime(uint256)", +"31f25330": "initialRound()", +"31f27c96": "isWarriorChest(uint256)", +"31f2c8a5": "whitelistedSenderAddresses()", +"31f2d72d": "TelegaSend(address)", +"31f3af90": "removeAuditorFromMultiRequestAssignment(uint256,address)", +"31f4a23f": "EtherDeltaWithdrawToken(address,uint256)", +"31f4f682": "investmentMin()", +"31f53447": "operatorProductCommissionInPerc()", +"31f607a5": "Coin_Character()", +"31f6eac8": "availableVolumeEtherDelta(address,uint256,address,uint256,uint256,uint256,address,uint256)", +"31f72b44": "NewPhase(uint8)", +"31f76043": "resetSymbol(string)", +"31f850e6": "create(address,uint256,uint256,uint256,bool,string)", +"31f9a211": "getOrderState(uint128)", +"31f9a8f2": "accessToken(address,uint256)", +"31f9c919": "mintingActive()", +"31fa0a45": "withdrawAdamcoins()", +"31fa76db": "short_tokens(uint256)", +"31fa7c84": "cancelRent(uint256,uint256)", +"31fa8e73": "payrolls()", +"31fa90d8": "stopIssuingIndividualTokens()", +"31fb4c1d": "preIcoFinishTime()", +"31fb67c2": "withdraw(string)", +"31fc5b18": "MIN_BID_FRAC_TOP()", +"31fd725a": "PassHasBeenSet(bytes32)", +"31fdb712": "getFlight()", +"31fea236": "testFailTransferFromWhenStopped()", +"31ff1ed9": "linkDirectly(string,uint256,uint256)", +"31ffc9fa": "DentacoinTimeLock()", +"3200aa7a": "startRoundB()", +"32013ac3": "preallocate(address,uint256,uint256)", +"320228ca": "minimunEth()", +"32033229": "writeAddr()", +"32035ca6": "madeOperatorForTokens(address,address,address,uint256,bytes,bytes)", +"3203fe4b": "softcap1Reached()", +"3204dbc5": "distributeELTC(address[])", +"3205c5c1": "intunderflow(uint256)", +"3205f5fc": "division()", +"3206163f": "Drawcolor(uint256,address,uint256,uint256)", +"32064946": "start_buyer(address,address,uint32)", +"32064db7": "left20(uint256)", +"320665a6": "BCCB()", +"3206b2c6": "getLog(uint256)", +"3207230d": "purchaseVehicleSpace(address,uint256,uint256)", +"3207408f": "PrivateSaleCents()", +"32075c49": "buySCTK(address,uint256)", +"3207b544": "BRI()", +"32083c44": "payoutForWagerAndOutcome(uint256,uint8)", +"320878d5": "BFYToken()", +"32089b74": "LEGLToken(uint256)", +"32098d4c": "setCalculateFloatingValue(uint256)", +"3209943e": "proceedsAddress()", +"3209c6de": "iterate_start()", +"3209e9e6": "setMinimum(uint256)", +"320a352a": "ExposureCollected(bytes32,address,uint256)", +"320a3c5e": "AJinToken()", +"320a5018": "MilestoneInput()", +"320a6c73": "transferFor_(address,address,uint256)", +"320a8ef8": "transferTokensToTeamMany(address[],uint256[],uint256)", +"320a98fd": "lock(string)", +"320b2ad9": "_pause()", +"320bebaa": "setPromoMinPurchaseEth(uint256)", +"320cffcd": "getCostForCards(uint256,uint256,uint256)", +"320d2800": "finalizeSale(address,uint256)", +"320d2fa0": "liquidationThresholdPercent()", +"320d4534": "setMinSwapAmount(uint256)", +"320d46d4": "canRegister(address)", +"320dc63a": "TotalSTC(uint256,uint256)", +"320e028d": "setCountryToken(address)", +"320e6c01": "set_default_approval_duration(uint256)", +"320ea024": "isVerificator(address)", +"320fdc75": "one(uint256,uint256)", +"321022a5": "updateSettlementInstitution(address)", +"3210318e": "PotaosBucks()", +"3210bb1d": "moneybuy(uint256)", +"3211bb90": "OwnerAddFunds()", +"32121896": "GDK()", +"32139a0e": "platformOperatorNeumarkRewardShare()", +"32145dd2": "gamePlayerNumber()", +"321489d4": "getDataByIndex(uint256)", +"3214e6ba": "cpow2(address,uint256)", +"3215b483": "getTokensByMerkleProof(bytes32[],address,uint256)", +"3216255b": "setCertificate(string,string,string,string,string,string,string)", +"3217e44e": "RGHTC()", +"3218b99d": "gameStart()", +"3218ebcc": "SUBMISSIONREWARD()", +"32191017": "updateFeeForCurrentStakingInterval()", +"3219ac2a": "showMyVote()", +"3219e73f": "addScore(string)", +"321a7c8c": "createVestingByDurationAndSplits(address,uint256,uint256,uint256,uint256)", +"321b3157": "firstPartOfTeamTokensClaimed()", +"321bbc1c": "test_insert_findWithHintNextUpdateHead(int256)", +"321c48f2": "getTemplate()", +"321cb98a": "creationMaxCap()", +"321d43cd": "approve_sell_proposal()", +"321db4d4": "getQueryAddress()", +"321de1d4": "BuyToken(address,uint256,string)", +"321f0013": "do_nothing()", +"321f4584": "DataRegistered(bytes32)", +"321f63a2": "HMToken()", +"322062b8": "FixBet31()", +"3220ad89": "refundSuccessful(address,bytes32)", +"3220b95a": "getEscrowOrder_seller(uint256)", +"32214874": "verifyAmount(address,uint256,uint256,bool)", +"3221e125": "addBag(uint256)", +"32227425": "stopReceiveTicket(uint256)", +"3222ae71": "airdropFinished()", +"322370ff": "BetexStorage()", +"32246e9f": "auctionEnd(uint256)", +"322471cf": "createAffiliate(uint256,uint64,uint64,address,address)", +"3224ba23": "submitPoliceReport(uint256,bytes,bool)", +"32254992": "getPrevHash(int256)", +"32255d90": "confirmShipping(uint256)", +"32258794": "removeAddressesFromBlacklist(address[])", +"322671cd": "_checkLockUp(address)", +"32268c01": "artistsArtworks(address,uint256)", +"3226a94e": "TRNCoin()", +"3227563a": "logPriceAfter()", +"3227bd8b": "DragonCoin()", +"3228556f": "setPOOL_edit_8(string)", +"3228afcb": "HyperIslandCoin()", +"32293954": "LogTokenPreissued(address,uint256)", +"322a5e5f": "balanceContract()", +"322a7050": "addHospital(uint256,string)", +"322a8957": "teamTokenTimelock()", +"322b1bc0": "getarray_length()", +"322b8c7e": "dKERNEL_PANIC()", +"322e5021": "Penalty(address,uint256)", +"322eccdc": "withdraw_all_admin(address)", +"323046b1": "date()", +"32307c67": "LCASH()", +"323082d7": "Vote(string)", +"3230d486": "getHeroRequiredExpForLevelUp(uint256)", +"323162a9": "getDisputeParticipants(uint256)", +"3231a2b9": "voteSnapshotBalanceAutoBatch(address[],uint256[])", +"32326b44": "Invested(address,uint256,uint128)", +"3232f204": "SPAMed()", +"32331418": "ExchangeTokenToZWC(address,address,uint256)", +"3233b455": "appFundDeposit()", +"3233c686": "claimerDeposit()", +"3233c791": "nextlotnumber()", +"32347487": "forwardFundsToWallet()", +"32353fbd": "resumeAuction()", +"323560b5": "ZebraToken(uint256,string,uint8,string)", +"32363b47": "period1End()", +"32363e0a": "calculateMultiplierAfterBurn(uint256,uint256,uint256)", +"323661f6": "releaseLockedBalance()", +"32366ea5": "isOMITokenContract()", +"32366fb9": "makeTomatoes(address)", +"32369e38": "GetPlayerDynamicRatio(address,uint256)", +"32373e25": "CREATED_STAR4()", +"323772ee": "unlocktime()", +"3237d63c": "tgeLive()", +"32383a69": "WashCrowdsale()", +"3238c832": "updateDBZHeroDetails(uint256,string,address,address,uint256)", +"32395c2b": "addPayee(address,address,uint256)", +"3239825c": "edCoreContract()", +"3239d232": "weekProcessed(uint256)", +"323a5e0b": "deposits()", +"323a73d9": "generateId(uint256,uint256,uint256)", +"323a7acb": "Joyreum()", +"323aca70": "InterCryptoNode()", +"323b1b87": "FreezeTokenTransfers(address,bool)", +"323b2c26": "MAX_RELEASE_DATE()", +"323bc818": "_createTeam(string,string,uint256,address)", +"323be1c5": "canPause()", +"323bf0b8": "icoPhase2EndTime()", +"323c20fa": "tokenPtx()", +"323c59c4": "Common()", +"323cb59b": "uncooperativeClose(address,uint32,uint192)", +"323d5c68": "sendPer()", +"323dc51a": "MomoToken(address,uint256)", +"323ded4d": "_getLegendaryPlusRarity(uint32)", +"323df879": "MILLION_TOKENS()", +"323e71fd": "turnOffCanUpdateFrontWindowAdjustmentRatio()", +"323ea3f9": "photoText()", +"323efacd": "checkAndCallSafeTransfer(address,address,uint256,bytes)", +"323f6fe0": "VESTING_OFFSET()", +"323fe92c": "setPriceAttr(uint8,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"32414926": "CarTaxiToken(address)", +"32418558": "stakeTokensManually(address,uint256,uint256)", +"32424aa3": "_decimals()", +"324298ff": "ArrayDemo()", +"32434a2e": "register(address,string)", +"324365b1": "createCollectible(uint256,uint256,address,address)", +"3243c791": "distributeDividends(uint256)", +"32443d7d": "developmentFundUnlockTime()", +"324536eb": "totalSupply_()", +"3245a55f": "mintFull(address,uint256)", +"3246887d": "setLedger(address)", +"3246bac5": "getGameIpfs(uint256)", +"3247dd8b": "ySignToken()", +"32484dab": "totalContributedUnits()", +"3248687a": "getLockSize(address)", +"32492f96": "getStellarBalance()", +"32495c58": "requiredEntries()", +"3249759c": "TAToken()", +"324a5562": "setMaxNumber(uint8)", +"324ab080": "MIN_BONUS()", +"324b0085": "createBlogger()", +"324b8ad2": "totalBurnLotsByAddress(address)", +"324b8d6e": "oracleConfig()", +"324c6add": "KBV01()", +"324cb3cb": "contractLocked()", +"324cf51a": "setPurchaseParamCount(uint256)", +"324da66f": "removePromoCode(bytes32)", +"324dd3b0": "getFighterArray(uint256[])", +"324ecd96": "power10(uint256)", +"3250e151": "PakEKO()", +"32513ce5": "newContractAddr()", +"32519e0e": "roundEth()", +"32525f09": "testTransferFromDoesNotAllowTransferOfMoreThanAllowedByDelegate()", +"325294e5": "calculateEthers(uint256)", +"3252b8fb": "returnGrantedToken(uint256)", +"3253277c": "badge(address,uint256)", +"3253ccdf": "burnNomins(uint256)", +"32546f7e": "HammerChain()", +"3254de48": "ITSEndTime()", +"32555f06": "dissBlock(uint256)", +"325586dc": "checkStateProof(bytes,uint256,bytes,bytes)", +"32564d82": "identifierToIndex(bytes32)", +"325654ae": "secondPrivateLockTime()", +"3257bd32": "getDepositorMultiplier(address)", +"3257d818": "hasResponded(bytes32)", +"32581fb0": "getArtefactById(uint256)", +"3258e255": "setWithdrawBeforeTime(uint256)", +"325a19f1": "created()", +"325ab9ac": "buildCharging()", +"325ad39b": "UltraNote()", +"325add98": "sellDaiForEth(uint256,uint256)", +"325c25a2": "auctionLength()", +"325c35c5": "setFightsAddress(address)", +"325cf9e6": "splitPayment()", +"325da1c0": "LogAllocateTicket(uint256,address,string)", +"325dfddf": "waittokens()", +"325ecf99": "addMarketingToken(uint256,uint128)", +"325f33e0": "checkUserByWallet()", +"325f9f41": "processShares(uint256)", +"32606387": "_draw3()", +"32608243": "Iou()", +"3260db59": "UnityToken(address,uint256)", +"32611e2b": "stage2_start()", +"32615457": "FullAssetRegistry()", +"32617353": "GoldBlockTickets()", +"32619375": "ChangeMiningReward(uint256)", +"3262207c": "isTransferProxy(uint32,address)", +"32624053": "blocksToWaitShort()", +"32624114": "isValidAccessMessage(address,uint8,bytes32,bytes32)", +"3262fd9a": "getMoney(uint256)", +"326360fe": "uncommittedTokenBalance()", +"32643513": "_computeContendersTotalHp(uint256,uint256,uint256,uint256,uint256,uint256)", +"32644829": "removePlayerFromBoard(bytes32,bytes32)", +"3264a34b": "getBoard()", +"3264a844": "hundredtimes()", +"3265bf5b": "registerPlayerToBoard(uint256)", +"3265c436": "btcsAddress()", +"32665ffb": "getProperty(uint256)", +"32666a31": "setMonsterObj(uint64,string,uint32,uint32,uint32)", +"326687b9": "onSale()", +"3266c856": "WanToken(address,uint256,uint256)", +"3266fb05": "lockedTime(address)", +"32670d10": "contributors_locked(address)", +"3267a2c5": "returnedToOwners()", +"3267db34": "setCurrentBadge(bytes32)", +"3268215c": "getPuppyAttributes(uint256)", +"3268419f": "PreSale(uint256,uint256,address,address,uint256)", +"32691d18": "updateLastTransactionTime(address)", +"326959cc": "MMMToken()", +"32696a92": "totalpatient()", +"326a794d": "safeMathSub(uint256,uint256)", +"326a7d77": "LEVEL_MAX_VALUE()", +"326abfce": "curent_mul()", +"326b0c7e": "BuyPresalePackage(uint8,address)", +"326b1001": "crowdSaleHardCap()", +"326b7a14": "WthdrawTo(address,uint256)", +"326cf61c": "toBytes(bytes32)", +"326dd62d": "migrationStartedTime()", +"326e8d60": "getTurnover(bytes32)", +"326fac6e": "getCurrentGames()", +"326fd584": "maxEtherCap()", +"32708966": "setMonsterIndexToApproved(uint256,address)", +"3270f753": "depositHouseTakeout()", +"327107f7": "targetToken()", +"32715bf2": "userContentByIndex(uint256)", +"32716063": "calcTotalFee(uint256,bool)", +"3272b28c": "allowedSenders()", +"32733a08": "balanceB()", +"32736fb0": "RoundsManager(address)", +"3273b110": "setMinDuration(uint32)", +"327419b7": "NeedsCoin()", +"327428b1": "Lockable(uint256)", +"32750350": "setcardaddress(address,address,uint256)", +"3276249f": "vrcWallet()", +"327683bb": "setIII_R3(uint256)", +"3276eaa9": "incrementContinuityNumber(uint32,int256)", +"32773ba3": "challengeExit(uint256,uint256,bytes,bytes,bytes,bytes)", +"3277bbda": "setUintF1IntF3AddressF3(uint256,int256,address)", +"32780d05": "closeChannel(bytes32,uint256,address,uint256,address,uint256,bytes32,bytes32,bytes,bytes)", +"3278ba2f": "getNumBounties()", +"3278c960": "terminateSelfDestruct()", +"3278dc67": "Founder()", +"327942a2": "move(bytes32,uint256)", +"32794823": "withdrawToOwnerCheck()", +"32797f44": "failedTimestampSecondsAt(uint16)", +"327a765a": "_getString(address,bytes32)", +"327a943a": "getUserAmount(address)", +"327b95b5": "USDXCoin()", +"327c0dd9": "resetLotteryManually()", +"327cc732": "registrantIndex(address)", +"327e36dc": "RefundVault(address,address[])", +"327efb0c": "supplylimitset()", +"327f0b6b": "pollTitle(uint256)", +"327fc33c": "isUpcoin()", +"32807be0": "PrymexPreICOCrowdsale(uint256,uint256,uint256,address)", +"3280922b": "TOKENS_SALE()", +"3280a836": "getPayment(uint256)", +"328175cd": "editorSignUp(address)", +"3281c4e1": "salesAllocation()", +"3281c4fa": "upRound(uint256,address,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256)", +"3281d576": "isContractMiniGame()", +"32820d5f": "setupWeiCaps(uint256,uint256)", +"328243d5": "changeSale(uint256,uint256,uint256,uint256)", +"32828d9e": "BbbToken(uint256,string,uint8,string)", +"32829a23": "OpenBankAccount()", +"3282aa8a": "individualMaxCapWei()", +"32833d51": "power(uint256,uint256,uint32,uint32)", +"3283f641": "task()", +"32842c39": "picture(address)", +"32846270": "goldSaleLimit()", +"3284d75c": "sendRefTVs(address)", +"3284fd79": "issue(address,uint32)", +"32859392": "dividendDecreaseFactor()", +"3285ecde": "tokensMintedDuringPreICO()", +"3285f406": "GetWithdrawalFunds(address)", +"3286b611": "Generate(address,address,uint256,uint256)", +"3286fb75": "addressNotSet(address,address)", +"3287c399": "isSignedBy(bytes32,address,bytes)", +"3287d0dc": "ownerLocked()", +"3287d0f6": "switchReserve(address)", +"3287db4b": "lockFunds(uint256,uint256)", +"3288eb0b": "ChineseCookies()", +"32892177": "TOKEN_VERSION()", +"328929e0": "Offer(address,address,bytes32,uint256,uint256,uint128)", +"32895c2a": "ERH()", +"3289e004": "redeemPackage(uint256,address,uint256,bytes32[])", +"3289fba6": "getSanPrevOwner(uint256)", +"328a2c2d": "updateStartDate(uint256,uint256)", +"328a7e97": "setKyber(address)", +"328a8cc4": "addRestaurant(address)", +"328b10d7": "vestingStarts()", +"328c0ec0": "endPreICOTime()", +"328d15f4": "_getCurrentWeek()", +"328d8f72": "setEnabled(bool)", +"328db985": "getPotCnt(string)", +"328ede54": "DAFZOToken(address,address,address,address)", +"32902924": "signSendDiamond(bytes32,string,string,address,string,bytes16,uint256)", +"3290bd90": "getInfoFromBidding(bytes,bytes32)", +"3290ce29": "purchaseTokens()", +"3290f515": "addInterest(uint256)", +"32911111": "getroundinfo(uint32)", +"3291b39a": "addReserve(address,uint32,bool)", +"32921690": "checkDepth(address,uint256)", +"3292b71f": "transferCrowdSale(bool)", +"3292cd37": "payWithDailyFreePoint()", +"32931fbb": "left1(uint256)", +"329350ea": "storeOwnership(address,address)", +"3293d007": "isValidDateTime(uint256,uint256,uint256,uint256,uint256,uint256)", +"329430ca": "teamAllocated()", +"32947122": "updAirDropTokenDestroy(bool)", +"32948515": "QLinkToken()", +"3294ab00": "withdrawBtc(bytes,uint256)", +"3294c2d7": "updateDocument(uint256,uint256)", +"32958fcb": "boolToBytes32(bool)", +"3295feb3": "numAuthorities()", +"32967ea0": "isOlderOwner(address,address)", +"3296a373": "createPromoPerson(uint256,address,uint256)", +"3297ef5b": "voting_started()", +"32985244": "joyTokenContract()", +"3298caa3": "getDoneRegistrationAmount(address)", +"3298e6c8": "GanaPublicSale(address,address,address)", +"32990ad2": "rewardTokensForClient(address,uint256)", +"3299ad23": "PapushaToken()", +"329a23b8": "Wallet(address[])", +"329a27e7": "getWalletBalance()", +"329a88d5": "UBIATARPLAY_CAP()", +"329b1c92": "getReferral()", +"329b59d1": "fallback(uint256)", +"329b8f38": "yesCount(uint256)", +"329bfc33": "getCurrentWinner()", +"329c095b": "getLatestReading(string)", +"329ccce1": "vmaxEtherPerPurchase()", +"329cd958": "get_next_item_in_state_from_item(bytes32,bytes32)", +"329ce1b7": "delOwner(address,address)", +"329ce29e": "buyTile(uint256)", +"329d1a35": "testReentracyGuard()", +"329d1a8b": "depositIndex(uint256)", +"329d3346": "closeVote()", +"329d5f0f": "setApprovedUser(address)", +"329da011": "addNewToken(string,address,address)", +"329daf90": "onlyPauserMock()", +"329eac15": "phase2Price()", +"329f36b5": "BONUS_TIER_2_LIMIT()", +"329f5b21": "DiatomAirdrop(address,address)", +"32a16f4e": "isLocked(bytes32)", +"32a21a28": "registerInvitor(address,address)", +"32a2c5d0": "getContractAddress()", +"32a2fda7": "isPermissionGranted(address,string)", +"32a36e53": "enterRound(bool)", +"32a3869a": "getBonusPercentage(uint256)", +"32a3abbb": "LALATokenAddress()", +"32a42882": "buyPropertyInPXL(uint16,uint256)", +"32a45ac5": "addMessage(address,uint256,uint256)", +"32a521c1": "disallowToLock(address,address)", +"32a52fcd": "FOR_ICO()", +"32a54712": "DecalinxCoin()", +"32a55bb4": "swapActivity()", +"32a58dc2": "change_client_manager(address)", +"32a6baf6": "isTimePassed()", +"32a71b36": "AleaCoin()", +"32a7ae95": "deleteClaim(address)", +"32a7d7c2": "AddressOwnershipVerification()", +"32a7dbda": "getMintManager()", +"32a7e45a": "eosBlanceOf()", +"32a80329": "getTokenTransferable()", +"32a8589a": "FercCoin()", +"32a89e50": "NextBabyIs(address,uint256)", +"32a8bb33": "getParticipantIds(string,uint256,uint256)", +"32a8d49e": "ADV_TEAM_TOKENS()", +"32a8e74c": "participateBuyback()", +"32a92229": "creditBalanceOf(address)", +"32a9a43b": "removeLeverage(uint256)", +"32a9df46": "setSecondBonus(uint256)", +"32aa952f": "UpdateSellAgentCreators(address,address)", +"32aae34d": "LogVoteToFreeze(address,uint256,uint8,bool)", +"32aaf9d7": "addCommissionAmount(uint256,address)", +"32ab6af0": "newRepoWithVersion(string,address,uint16[3],address,bytes)", +"32aba656": "stillAvailable()", +"32abff8e": "lastBlock_v5Hash_uint256()", +"32ac752b": "matches(string)", +"32ace499": "getNextOrderPrice(address,address,uint256)", +"32aeaddf": "lockingPeriodInMonths()", +"32af5858": "behalfBet(address,uint256,uint256)", +"32afa2f9": "claimEtherOwner(uint256)", +"32b12eac": "setFallback(address)", +"32b182c3": "eligible(address,uint256)", +"32b1ad5a": "checkContructIsLocked()", +"32b28b95": "edoPerWeiDecimals_()", +"32b30b64": "calculateUnsoldTokens()", +"32b3c323": "anyoneEndICO()", +"32b431da": "setPlanetAuctionAddress(address)", +"32b45055": "EREEBERRY()", +"32b4623a": "shareCertificate(string,string,string,address,address,string)", +"32b4b5ed": "openProvider(bool,string,string,uint256,string,uint8,bool,address)", +"32b4d74c": "getNumRemainingSeats()", +"32b525bb": "beginMotion(address)", +"32b5b2d1": "missedVerificationSlashAmount()", +"32b65a95": "getSplitCount(string)", +"32b680d6": "payReceiver(address)", +"32b693b0": "PetCoin()", +"32b6f97a": "UXDToken()", +"32b7214e": "setNextSnapshotTime(uint256)", +"32b734b7": "awardsEnd()", +"32b85a44": "currentWeight()", +"32b8c086": "testSuperUser(address)", +"32b98616": "updateCardDetail(uint256,uint256,bytes32)", +"32ba36d6": "EtherShare()", +"32ba4b8b": "RANGEEND_5()", +"32ba65aa": "clearBalance(address)", +"32baa8d9": "existingCategory(uint256)", +"32bace54": "invest_cin(address,uint256)", +"32bafb2c": "withdrawMln(address,uint256)", +"32bb2c0d": "calc(uint256,uint256)", +"32bbb8cc": "mgrVotes(uint256)", +"32bbc1c8": "WEI_PER_USD()", +"32bc873d": "AZExchange(address,address,address,uint256,uint256,uint256)", +"32bc934c": "MILLION()", +"32bd8644": "MPYRefund(address,uint256)", +"32be9502": "getOwnerInAnyPlatformById(uint256)", +"32bf1def": "FACTOR_2()", +"32bf775d": "testControlTransferDisabled()", +"32bf9e5b": "AfricacoinToken()", +"32bfaa23": "initializeRefundableFundraiser(uint256)", +"32bfdc38": "ROC()", +"32c0c583": "setDenyPremium(bytes32,bool)", +"32c0f801": "tokenFacebook()", +"32c0fba5": "airDrop(address,address,uint256)", +"32c1eb82": "getActualRate()", +"32c22154": "livepeerToken()", +"32c26957": "isTimeout()", +"32c2ed9a": "inquire(uint256,uint256)", +"32c35352": "marketSale(uint256,string,address,address)", +"32c3de5d": "listCreatedTokens()", +"32c442d6": "Super87Coin()", +"32c468fa": "setPreFundingStartTime(uint256)", +"32c4903d": "getAllParents(bytes32)", +"32c514d5": "getJobDetailsIPFSHash(uint256)", +"32c66a9d": "Nome_vincitore()", +"32c6f294": "deadline120()", +"32c6f315": "exchangeIsRunning()", +"32c716b6": "dividendsAcc(address)", +"32c7de60": "_RamenCoin()", +"32c862ed": "inSalePeriod()", +"32c896d4": "REFERRAL_BONUS_LEVEL4()", +"32c9635b": "_getEthUsdPrice()", +"32c990b4": "getUserKeys(address)", +"32ca5587": "isWoidRegistred(address)", +"32ca966e": "toTileId(int32,int32)", +"32cae0a8": "userPoolFund()", +"32cb46e0": "totalContributedWei()", +"32cb6b0c": "MAX_SUPPLY()", +"32cb93d9": "getPaintingName(uint256)", +"32cba128": "_deleteShareholder(address)", +"32cc0105": "setAmountForDeal(uint256)", +"32cc6a9f": "modifyNextCap(uint256,uint256)", +"32cce1e4": "_unlockTokenByIndex(uint256)", +"32cd0487": "delist(address[])", +"32cd0b3d": "totalRemainSupply()", +"32cd3148": "CashmoneyToken()", +"32cd724a": "getStateStartTime(bytes32)", +"32ce92cb": "setFIRST_STEP_MULTIPLIER(uint16)", +"32cea83e": "birth(bytes)", +"32cee2eb": "getMinableSupply()", +"32cfbe90": "initialBalance(address)", +"32d05a53": "IdToAdress(uint256)", +"32d05c6d": "withdrawXPA(uint256,address)", +"32d0cf68": "setOutOfLimitAmount(uint256)", +"32d17917": "SPECIALIST_THREE()", +"32d1ae2e": "RepairCenter(address,address)", +"32d2e55c": "subSafe(uint256,uint256)", +"32d2fb9f": "getRefRemainingTime(uint256)", +"32d33cd0": "isRedeemed(uint256)", +"32d3725b": "burnStage(uint256)", +"32d3b711": "getPI_edit_29()", +"32d540af": "_clearExtraReceivers()", +"32d5fe98": "revealCampaign(uint256,uint256)", +"32d68fd5": "transferFeeNum()", +"32d69342": "terminateServer(uint256,uint8)", +"32d6eeb5": "changeQueryDelay(uint256)", +"32d72694": "updateGameTimes(uint256,uint8)", +"32d79689": "currentNiceGuyIdx()", +"32d80490": "Dandy()", +"32d8a3bd": "initCommunityReputation(address)", +"32d8eee5": "testFailSetNotUpdatableNotOwner()", +"32da1329": "setStartEndTime(uint256,uint256)", +"32da3fe3": "upgradeComponent(uint256,address,address)", +"32da57cf": "getTheStocksTokens()", +"32da7448": "amout()", +"32da7840": "isWhitelistAgent(address)", +"32dae2a5": "maxAmountICO()", +"32db8e2b": "MAX_RECEIVED_PER_PERIOD()", +"32dbc7d4": "NECPToken()", +"32dbeb21": "GoalMinimumReached(address,uint256,uint256)", +"32dc04aa": "changeBlockTimeAverage(uint256)", +"32dc2a01": "setmsgprcnt(uint256)", +"32dc9e81": "functionFive(uint256,uint256,uint256,uint256)", +"32dcb01c": "createBytes32s(bytes32[],bytes32[])", +"32dea130": "finishCrowdsaleMinting()", +"32deac1b": "setThirdBonusPercent(uint256)", +"32dee40b": "withdrawAllFunds(address)", +"32df3068": "clearKeys(uint256)", +"32df52aa": "LigmaToken()", +"32e07a20": "howManyEthersToKillContract()", +"32e12734": "addSpecialOffer(address,uint8)", +"32e1ed24": "updateAccountOwner(bytes32)", +"32e26d24": "CROWD_WAVE1_BONUS()", +"32e30e84": "INTERFACE()", +"32e43a11": "dummy()", +"32e43b5b": "PlayerTransported(uint256,address,uint256,uint256)", +"32e459b4": "LogFinalized(uint256)", +"32e45b8b": "guessTotalBeanOf(uint256)", +"32e54f72": "proxyPayable(address,string,string)", +"32e5535a": "ticketString(uint256)", +"32e5645d": "_computeNextArtworkPrice()", +"32e5905b": "film()", +"32e5d676": "c_priceRiseTokenAmount()", +"32e5e595": "getTimestamp(string)", +"32e62358": "_platformSupply()", +"32e70029": "MGCGameToken()", +"32e7179a": "MintedLocked(address,uint256)", +"32e7c5bf": "B()", +"32e7ecd8": "tierMin(uint256)", +"32e7f81f": "allocateLiquid(address,uint256)", +"32e94e81": "setPlayerEngineersCount(address,uint256,uint256)", +"32e991cf": "sellScale()", +"32e99708": "getMiningTarget()", +"32eb2314": "OraclizeQueryTest()", +"32eb2564": "initGame()", +"32eb5e44": "getaddtime(address)", +"32ec39a4": "mntpMigrationsCount()", +"32ec7a4e": "_emitDayLimitChanged(bytes32,uint256,uint256)", +"32ec991c": "ballotOf(uint256,address)", +"32ed3d60": "startPoll(uint256,uint256,uint256)", +"32ef78c4": "remove_scribe(address)", +"32ef8dfa": "previousDistribution()", +"32f04209": "evReleaseFund(address,uint256)", +"32f05fd1": "releaseAndUnlock(address,uint256)", +"32f07d01": "LogRedeemNET(address,uint256,bytes32)", +"32f16c74": "claimPepe()", +"32f2129a": "getBetArr()", +"32f23601": "setSubTourFreezingPrice(uint256)", +"32f289cf": "claimToken(address)", +"32f2bb50": "HouseInfoListing(address)", +"32f402c5": "createGrant(address,uint256,uint256,bool,bool)", +"32f46374": "create(string,address[],address,address)", +"32f58fc8": "retrieveRemainingCoinsPostSale()", +"32f5ea27": "UbiRewardToken()", +"32f637db": "createVesting(address,address,uint256,uint256,uint256,uint256)", +"32f6438b": "setCFO(address,bool)", +"32f72c27": "remove(int256)", +"32f72e39": "setSubmissionDeposit(uint256)", +"32f7470b": "DATE_31_DEC_2018()", +"32f76167": "isLockedWalletEntity(address)", +"32f76c11": "didTradePosition(bytes32,address,address,uint256,uint256)", +"32f7b41b": "setCCH_edit_29(string)", +"32f8290c": "returnMachine()", +"32f896af": "getSettingIdByTAOName(address,string)", +"32f8d1e4": "RockCoin()", +"32f8db38": "mainSaleMinEth()", +"32f8e034": "finalizeIcoDate()", +"32fac3a3": "listAddresses(bool,bool,bool,bool,address[])", +"32fb082f": "hasOrderedRobotParts(uint256[])", +"32fb5833": "AutomatedExchange()", +"32fb9860": "getSettledScoreAmount()", +"32fbe8d3": "setSavedBalance(uint256)", +"32fd8478": "artistCommission(uint256)", +"32fe334b": "totalEtherPaid()", +"32fe5afc": "setICOEthPrice(uint256)", +"32fefb4c": "add_account(address,address)", +"32ff6e21": "setAirDropToken(address)", +"32ffe442": "getExpectedPrice(address,address,uint256)", +"33007cdf": "deposit(address,uint152)", +"33012507": "addMemberInternal(address)", +"33016c6a": "FOUNDER_FUND_3()", +"3302363b": "_nextMonth1stDayTimestamp(uint256,uint256)", +"33026bb6": "addDeposit(address,uint256)", +"330278e0": "betPlaced(address,address,uint256,uint256)", +"3302ece0": "setStopDate(uint256)", +"33039d3d": "MAX_TOTAL_SUPPLY()", +"3305cf85": "weiToCap()", +"33065ac5": "firstTokenId(address)", +"330696c8": "PREMINER_CHANGED(address,address,address)", +"330738a3": "KetherHomepage(address,address)", +"3308ecf1": "coinanx()", +"3308f42d": "getPlayer()", +"33091bd2": "returnTokenBalance(address[2],uint256[7],uint8,bytes32[2])", +"33099beb": "theCyber()", +"330a4822": "_createOrder(address,uint256,uint256,uint256)", +"330aa207": "frozenAccountCoinByTime(address,uint256,uint256)", +"330ae38f": "disableAmbassadorPhase()", +"330ae7b3": "addUserBattleValue(address,uint256)", +"330c3fe5": "finalise(address)", +"330c4ce0": "burnedToken()", +"330ca427": "removeValidationPreSigned(address,bytes32,uint8,bytes32,bytes32,uint256)", +"330cbc75": "createEdition(uint256)", +"330d57f9": "maxbuyinQuantity()", +"330f412b": "MorphToken()", +"330f9588": "xrt()", +"330fb148": "setETHRateAgent(address,bool)", +"330fb4a3": "putEther()", +"330fd319": "MMTOKEN()", +"33102ff9": "openRoom(uint256,uint256)", +"33105218": "isVerifier(address)", +"331172f3": "getDisputeRoundDurationInSeconds()", +"33132860": "EcRecover(bytes32,bytes)", +"331350ee": "finishAllocation()", +"3313d27e": "verifyAllSigned(uint256,uint256[3],uint256[3],uint8[176])", +"3313d9bf": "bytesToString(bytes,bytes1)", +"3313e95d": "strcpy(string,uint256,string)", +"33140016": "feesByPeriod(address)", +"331450dc": "minerPreTime()", +"3314b33a": "BoardMeetings(uint256)", +"3314b62d": "AuPetitCoinToken()", +"3314c351": "Trade(address,uint256,address,uint256,address,address,uint256)", +"33158ba4": "openNetfRevenueRound(uint256)", +"331670c5": "getIsEnabled(uint256)", +"3316d122": "log(uint32,address,address,uint256,uint256,uint256)", +"331725b5": "callAndReward_0(string,string,uint256)", +"3317bbcc": "getLockedTokens()", +"3318d4a5": "incomeFees()", +"33195fca": "getApprobation(uint256,address,address)", +"3319bf1a": "upgradeGalleass(address)", +"331a6bf5": "setOwnerAddress(address)", +"331a72bb": "s7(bytes1)", +"331a72d1": "getRetractable(bytes32)", +"331a9d73": "availableSTCTokens()", +"331b6f66": "sizeOfAddress()", +"331c4594": "TalentICO()", +"331c55b4": "addTeamTimeMints(address,uint256,uint256,bool)", +"331c5d60": "LogSetName(string)", +"331d03d1": "BubToken(address)", +"331d8e5d": "unlock(address,address,bytes)", +"331e58a1": "adjustedRaised()", +"331e6b78": "setToNotForking()", +"331eac01": "SendPreReserved1()", +"331fbc1d": "tokensCreationMin()", +"331fef86": "bonusStrategy()", +"33210356": "setDelegadoDeDistrito(bytes32,uint256)", +"332129a7": "getJYPCBonus(uint256)", +"3321c76c": "RITUAL_COMPENSATION()", +"33223f1b": "materializeBalanceIfNeeded(address,uint256)", +"33228b9b": "E_AuctionFinished(address,uint256,address,uint256,uint256)", +"33232609": "blake2b(uint64[],uint64[],uint64)", +"33242b60": "getODEMClaim(address,bytes32)", +"332514d8": "totalT8EXSold_PRIVATE()", +"332559d3": "getcanuse(address)", +"33260fe7": "getInteractionPrice(address)", +"332659e0": "getBountyAddres()", +"33267961": "run2(uint256,bytes32[],uint256[],uint256,uint256,uint256,uint256)", +"3327057c": "Arina_judgment()", +"33271a3b": "getTokensPerWave(uint256)", +"33278aae": "setUntradeable()", +"3327f4fa": "setInstrumentRegistry(address)", +"33281815": "getRate(address,uint256,uint256)", +"33283e59": "usedReveralSupply()", +"33285fb4": "confirmAtkPlayerQuest(address)", +"33287446": "setMinTokensRequiredForMessage(uint256)", +"33289a46": "withdrawDeposit(uint256)", +"3328bd24": "lockAddress(address,uint256)", +"3328d3f0": "numberOfDates()", +"3328f396": "totalLevBlocks()", +"33291126": "_tavern(uint256)", +"332954c0": "YumeriumTeamWallet()", +"3329578b": "SpectrumNetwork()", +"33298e25": "invoke(uint256,uint256)", +"332a2219": "_goodAddress(address)", +"332ad859": "buyTokensBonus(uint256,uint256)", +"332ae26c": "test_insert_findNoHintUpdateHead()", +"332b0b34": "oraclize_randomDS_getSessionPubKeyHash()", +"332b3177": "totalTimelockedBeneficiaries()", +"332b9f06": "consumeNextOrderId()", +"332bb4c1": "approvalCallback(address,uint256,bytes)", +"332c26d6": "getSecretAtLevel(uint256)", +"332db078": "setTicketsPerPlayerLimit(uint256)", +"332e1a81": "getContributors(bool,bool)", +"332e25be": "getCCH_edit_19()", +"332ea814": "amIAgent()", +"332ea9ed": "VRCoinCrowdsale(address)", +"332eb83e": "steal_reveal(address,uint256)", +"332ec5f9": "unblockMember(address)", +"332efa80": "clearNewOwnerBid(address,uint256)", +"332f7acf": "amountCollected()", +"332f7d6e": "Lpktransfer()", +"332f93a9": "nextPayoutGoal()", +"332fa285": "nextGameMaxBlock()", +"332fa5bb": "ownerCountInt()", +"332ff6f9": "Buyin(address,uint256,uint256,uint256)", +"3330a6bd": "set_min_max_CWCsPerReturn(uint256,uint256)", +"3331f391": "giftAsset(address,uint256)", +"33324445": "changeClientCategory(address,uint256)", +"3332baa3": "PreSaleDeadline()", +"3332f720": "transfer_remaining_funds_to_project()", +"333432fe": "_withdrawBonuses(bytes32,uint256)", +"3334f1f8": "getAmountWithBonus(uint256)", +"3335aa78": "eRefund(address,uint256,string)", +"33360632": "getNumParameters()", +"33360978": "EndTime()", +"3336d5e5": "addABaddress(address,address)", +"33377f32": "turnOnFurnace(bytes32,bytes32,bytes32,bytes32)", +"33379137": "transferCoinToUser(address,address,uint256)", +"333885a0": "createBill(address)", +"3339451b": "fireDeliveryProposalEvent(address,uint256)", +"33397816": "withdrawAccountBalance(address)", +"3339f96d": "floaksAddress()", +"333a653e": "PeakAssetCoin()", +"333ab570": "WeiSent(address,uint256)", +"333abd90": "acceptKinTokenOwnership()", +"333aed82": "nextGameSettings()", +"333bfec5": "delegatedSignedEscrow(bytes,address,address,address,uint256,uint256,uint256)", +"333cfa14": "checkBlockMature(uint256,uint256)", +"333cffe5": "withdrawWithholding(uint256)", +"333dbda8": "paymentsInOtherCurrency(uint256,uint256)", +"333e1a72": "investorsLoses()", +"333e5180": "setOperatorPrivileges(uint256,address,bool)", +"333e99db": "isBlacklist(address)", +"333f55ed": "managerSelfRemove()", +"333f57b3": "contractStarted()", +"333f7f70": "changeFrozenStatus(address,address,bool)", +"33403a81": "_calculateWinner(uint256)", +"334191f7": "donatorReward()", +"3341b445": "proposals(address)", +"334249a7": "getProviderCountry(uint256)", +"334340d2": "EthCoin(address)", +"3343c18c": "AddBTCTransaction(address,uint256,uint256,bytes4)", +"334460a4": "createMetadata(bytes32,bytes32,bytes32,string,bytes32,bytes32,uint256)", +"3344e0b3": "WWW()", +"33455dd0": "PRICE_5()", +"3345854d": "NewGame(bytes32,bytes32,bytes32,address,uint256)", +"3345b65f": "listNextFourCards(uint128)", +"3345b784": "tokenSaleWeiMin()", +"33465c5f": "auctionStartTime(uint256)", +"3347d025": "teamUnlock3()", +"3348904b": "amountOfBets()", +"3348cad7": "_breedWith(uint40,uint40)", +"3348f537": "massClaimLimited(uint256,uint256)", +"33492138": "joinFraction(uint256,uint256,int16)", +"3349bc19": "nonActivationWithdrawal(address[2],uint256[7],uint8,bytes32[2])", +"334b8771": "AIRDROPBounce()", +"334b9f14": "initializeArray(uint256)", +"334c5997": "JavaSwapTest(uint256,string,string)", +"334cc3e5": "TimeDecayingTokenFactory(bool,address)", +"334d86bf": "getPI_edit_7()", +"334dc700": "CanaryV7Testnet()", +"334df120": "getBeneficiaryById(address,uint256)", +"334ef224": "testThrowsUpdateLatestRevisionNotOwner()", +"334ef43d": "tokensToCounter(uint256)", +"334f0611": "cnd()", +"334f22c7": "getUrl(bytes32)", +"334f45ec": "currentStepIndex()", +"334f5224": "bettorMap(address)", +"334fe638": "getProvisionCreditsRemaining(address,uint32,uint256)", +"33500e26": "bid(uint8)", +"33506115": "setPauseSave()", +"335094c2": "setPreICOEnd(uint256)", +"3350ae36": "fitCollectedValueIntoRange(uint256)", +"3350b915": "setDungeonPreparationTime(uint256)", +"3350c3ba": "BlockEstateToken()", +"33512aa9": "getUserReward(address,bool,bool)", +"33513739": "lowerCeiling(uint256)", +"335154ed": "setRateSteps(uint256[],uint256[])", +"3351886e": "getFilm(uint256)", +"3351ee19": "donatePurchase(uint32)", +"33533e84": "NeterContract()", +"33545d48": "setIdentity(address,address,string)", +"3354741a": "eveFromEth(uint256,uint256)", +"335494a4": "getMintingPowerById(uint256)", +"3354d682": "destroyVoxel(uint8,uint8,uint8)", +"335611d9": "makeOrder(uint256,address,address,uint256,uint256)", +"3356294b": "setAyantDroitEconomique_Compte_3(uint256)", +"335665c4": "canBuyCompany(bytes32)", +"3357162b": "initialize(string,string,string,uint8,address,address,address,address)", +"335721b0": "NewResolver(bytes32,address)", +"33575f64": "buyRank(uint256)", +"3357db75": "SALE_ENDED()", +"33580959": "poolFees()", +"33588dfa": "doCalculateRoom(uint256,bytes32)", +"3358d2d3": "buildDSTokenFrontend()", +"33592a1f": "getProviderById(uint256)", +"335a6b7d": "Wicflight()", +"335aa61a": "setMaxPrizeOneDay(uint256)", +"335ae0cb": "GetEscrowBalance()", +"335b496e": "totalTransfersInSchedule()", +"335b52f2": "initGameAt()", +"335b61e8": "enableArea(string)", +"335b7c13": "phase5EndBlock()", +"335b942a": "arbitrateC4FContract(address,uint8)", +"335c8b63": "packPrice()", +"335d43a3": "Kubera()", +"335e8067": "tricklingSum()", +"335eb60f": "getCoursesLength()", +"335f463d": "DVChain(uint256,string,string)", +"335f5642": "getinfowin(address,uint256)", +"335f9303": "PunchToken()", +"335fba7e": "calculateRedeemReturn(uint256,uint256,uint32,uint256)", +"336077c3": "getApprovedBuyer(address,address)", +"3360ac90": "transferByOwner(uint256)", +"3360caa0": "publicSaleStart()", +"336120fe": "removeTokenList(address,uint32)", +"336137c8": "updateMember(address,uint256)", +"33613cbe": "getBondBalance(address)", +"33637d5a": "getPendingBlock(uint256)", +"33641775": "change_sale_address(address)", +"336481d4": "dSetCommunityBallotsEnabled(bytes32,bool)", +"3365aa3b": "description2()", +"3365d358": "addContractAddress(address,address)", +"336634bb": "MASIKIToken()", +"3366eeb2": "getLockedToken()", +"33670c1c": "SupportsInterfaceWithLookup()", +"33677c30": "recycling(address,uint256)", +"3367aeb2": "maxPVB()", +"33683ec6": "safeHolderOf(uint256)", +"3368a120": "dividendBalance()", +"3368db4f": "DCE_Coin()", +"3368e968": "init(bytes32[])", +"336989ae": "customers(address)", +"3369c33d": "pregnantDogs()", +"3369c3b6": "ReturnEthersFor(address,uint256)", +"3369dace": "flipTheCoinAndWin()", +"336abddc": "allocateCash()", +"336b739a": "setCovmanager(address)", +"336b9f80": "updatePublisherFee(address,uint16)", +"336c6d39": "setPrizePool(address)", +"336c9b97": "_updateEditionTypeLookupData(uint256,uint256)", +"336ce69e": "CyberyTokenSale()", +"336da059": "MAX_TOTAL_TOKEN_AMOUNT_OFFERED_TO_PUBLIC()", +"336e24aa": "getQuestionAnswerCount(uint256)", +"336fa72c": "addTransferableAddress(address)", +"3370204e": "enter(bytes8)", +"33705526": "p5()", +"337176cd": "getVideoGameItemOwner(uint256)", +"337188d9": "secSaleSpenderTxDetails(uint256)", +"33722c47": "testGetLawyerAtIndex()", +"33731c04": "plxToken()", +"3373739b": "usedTokens()", +"33739483": "etlContract()", +"33751fec": "WeatherToken()", +"33756534": "LogVote(address,bool,uint256)", +"33759ee1": "CrowdSaleTokenPurchase(address,address,uint256,uint256)", +"3375e38a": "CreatedBlock(uint256,uint256,uint256,address,bytes32,bytes32,bytes32,bytes32)", +"3376887a": "test_oneValidEqInt2()", +"3376e2dc": "callDividendAndUserRefund()", +"33771860": "setGoldContract(address)", +"337748b8": "StartFuseaNetworkDistribution()", +"3377f212": "set4RoundTime(uint256)", +"33783b9e": "PapaToken()", +"3378eb29": "ElectricQueue(address)", +"33791c36": "Fundraiser(address,address)", +"3379d7a3": "greedyowner()", +"337a693c": "AkiCoin(address)", +"337a8cdb": "allowMoveTokens()", +"337b1cf9": "setIpfsHash(bytes)", +"337b5988": "testSimpleNameRegister()", +"337b68ba": "takenProfit()", +"337bd656": "HashSolved(address,string,bytes32)", +"337c1e28": "getIndexRoot(bytes)", +"337c445d": "increaseWordSize(string)", +"337cc706": "transferContract(string,string,string,string,string)", +"337d2aea": "PHASE3_START_TIME()", +"337f4c46": "gameDeveloper()", +"3380104a": "Streamity()", +"3380c0d8": "cancelTransaction(uint256)", +"338116b0": "checkContract()", +"3381ffe0": "transferTrusteeOwnership(address)", +"338246e2": "minSwapAmount()", +"3382ac57": "customCreateTokens(address,uint256)", +"3382ddab": "tokenBurnAddress()", +"33833037": "allBalance()", +"33835161": "setConfig(uint256,uint256,uint256,uint256,uint256,uint256)", +"3383e335": "LogTake(bytes32,bytes32,address,address,address,address,uint128,uint128,uint64)", +"33840712": "checkImageInput(address[16],uint256,uint256,uint256[],bool,bool)", +"338410f2": "setUnicornBreeding(address)", +"33848008": "newDepositWallet(address)", +"33849e55": "voteOnSolution(uint256,uint256,bool)", +"3384d2af": "PARKToken()", +"3384e128": "soldSS()", +"33862708": "changeServiceAddress(address)", +"33862914": "SOYA()", +"33863ed9": "order(uint256,uint256)", +"3387e52f": "LLV_311_EDIT_3()", +"33882479": "multiplyDecimalRound(uint256,uint256)", +"3388e429": "ecrecoverDecode(bytes32,uint8,bytes32,bytes32)", +"3388fa72": "Duranium()", +"33893071": "checkMyWithdraw(address)", +"3389f273": "setManyAllocations(address[],uint256)", +"338a0261": "rhi()", +"338a1379": "_setPackedBlockNumber(bytes20,uint256)", +"338a63a4": "_createKitty(uint256,uint256,uint256,uint256,address)", +"338b5dea": "depositToken(address,uint256)", +"338bfcd6": "refundTokensPresale(address[])", +"338cdca1": "request()", +"338d43f6": "_decrementTokenBalance(uint16,uint16,uint8,address,uint256)", +"338dbf59": "startPrivateSale()", +"338dfafa": "HVNToken()", +"338e22ff": "ProcessablesMock()", +"338e4fd6": "setTokenForSale(uint256,uint256,bool)", +"338e579e": "tryFinalize()", +"338e93d1": "active_dividend(address)", +"338ed326": "createCustomCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address,uint256,address)", +"338ef191": "GetBetGamblers(uint256)", +"338f3039": "amountAvailableToWithdraw()", +"338f43a0": "getReservedTokensListValInTokens(address)", +"338f4ad6": "withdrawMineralTo(address,uint256)", +"338f4dd9": "limitTier2()", +"338ff5e3": "updateInvested(uint256)", +"33902973": "createReserveTokensVault()", +"33904cb1": "MasterNet(uint256,string,string)", +"33905d41": "highFunding()", +"3390e6c7": "getIsSecondPhaseBySoldedTokens()", +"33911763": "greenshoeActive()", +"3391c265": "transferManagment2(address)", +"33920f65": "getEarliestPosition(address)", +"33921b2c": "DEXHIGH_V1()", +"339282b7": "isRegisteredAuthority(address)", +"3392f927": "hasConverted(address)", +"3392ffc8": "testExp(int256,int256,uint256)", +"3393385f": "disableUpdates()", +"3393780f": "DdosMitigation()", +"3393b069": "nothingLib2()", +"339594f9": "logMarketMailboxTransferred(address,address,address,address)", +"3395dc70": "acceptTransfer(address,address,uint256)", +"33966cb6": "_bid(uint256,address,uint256)", +"33967c74": "isZero(bytes32,string)", +"3396c405": "tokensAreLiquid()", +"3396c780": "b21TeamTokensAddress()", +"3397c60a": "getpubprize()", +"3397ca17": "numBalanceRecords(address)", +"3397d5d5": "setTokenPrice(uint8)", +"33985caf": "Exera()", +"33989396": "requestNewEtherRealID(string,string,string)", +"339a7670": "mineToken(uint256)", +"339a95f6": "secondCrowdSaleEndDate()", +"339ab6f2": "getPurchaseAmount(address)", +"339ac174": "playerSurrender()", +"339b6b39": "isRevokedBefore(bytes32,uint256)", +"339cfb9a": "isHolderAddress(address,address)", +"339e23d1": "ownerVote(bytes32,uint256,address)", +"339e2604": "setPayBackRate(uint256)", +"339e2c45": "isRegisteredToFirm(string,address)", +"339e9550": "_sendReward(uint256)", +"339f890d": "setMinBlockPurchase(uint256)", +"339fd959": "getLockAmount(address,address)", +"339ff96d": "transferCommitment(address)", +"33a02a6d": "openLandEthSale()", +"33a02c22": "betAdded(uint256,uint256,address,uint256)", +"33a263e6": "peggedSymbol()", +"33a27f75": "estimateNextPotSeedAmount()", +"33a3b654": "managementAmount()", +"33a3d023": "finalizationCrowdsale()", +"33a3e669": "setClientLastPaidRate(address,uint8)", +"33a4ec8d": "NCMToken(uint256,string,string)", +"33a581cd": "createPeerWallet(address,address[],address[],uint256[])", +"33a581d2": "MAX_UINT256()", +"33a5bae4": "verifyTx(uint256[2],uint256[2][2],uint256[2],uint256[5])", +"33a5ec7e": "changeTokenAmount(uint256)", +"33a738c9": "_executeTransfer(address,address,uint256)", +"33a7d2e3": "BONUS_DURATION_2()", +"33a8319e": "EtherJob()", +"33a87ade": "gasInTokens()", +"33a8c45a": "contact()", +"33a8dc1d": "nextPack(uint256)", +"33a9824a": "PopulStayToken()", +"33a99e04": "selectWinner()", +"33aac4aa": "BaseModule()", +"33ab0541": "setBaseLevelUpFee(uint256)", +"33ac2009": "countValidations()", +"33ac67c3": "ShowChargeCount(address)", +"33ac7256": "getParent(bytes32,uint256)", +"33ad846d": "getStringValue(string)", +"33ad9495": "WithdrawPotShare()", +"33adb264": "invokeTop()", +"33ae6e19": "distributeTimelockedTokens(address,uint256)", +"33ae7166": "tier4()", +"33ae88ad": "numberOfKingdoms()", +"33af060f": "accountInGoodStanding(bytes32)", +"33b0f7f7": "paidCreateWikiPage(string,string,string,uint256)", +"33b1503d": "PostWish(address,uint256,bytes,bytes,uint256,uint256)", +"33b16d93": "determineWinner()", +"33b186c1": "AdvisorsPartnersAmount()", +"33b19417": "NodeManager(address[])", +"33b1f812": "totalPromotions()", +"33b37915": "setOrderEnd()", +"33b3dc04": "castVote(string,uint8)", +"33b416db": "BaseICOToken(uint256)", +"33b56638": "testGetAllLawyers()", +"33b58484": "WEEKS_104()", +"33b5b62e": "minPurchase()", +"33b5fa75": "buyTokensWithRef(address)", +"33b6baf5": "developerAddr()", +"33b7d187": "getDCategory(bytes32,uint256)", +"33b85b73": "modifyCommunityRates(uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)", +"33b8b1c1": "transferInt(address,address,uint256,bool)", +"33b8c29d": "updatePriceOfEth(uint256)", +"33b91db5": "GetTocPrice()", +"33b9d3f4": "_buyCoins(address,uint256)", +"33ba2ef9": "hipstermasterReq()", +"33bb70ee": "getCoinAge()", +"33bbae93": "end_date()", +"33bc1c5c": "publicSale()", +"33bc6283": "TruReputationToken()", +"33bd8036": "addressPayableFunc(address)", +"33bd943e": "abandonListingService(uint256)", +"33bebb77": "forceTransfer(address,address,uint256)", +"33bfaf4e": "MickeyToken()", +"33bffccc": "openPreSale()", +"33c023ef": "doInvestment(uint256,address,string,uint256,bool)", +"33c1420a": "raffle()", +"33c24bd3": "accountIds(uint256)", +"33c4a1d6": "SetScndOwner(address)", +"33c5da42": "setGaspriceMax(uint256)", +"33c6c1af": "setCentralAccount(address)", +"33c6cdd3": "modifyRatePlan(uint256,string,bytes32)", +"33c724ee": "setLosers()", +"33c74e79": "participantContribution(address)", +"33c77a6d": "pauseICO()", +"33c7b38f": "withdraw_to_eti()", +"33c7c026": "feePayment()", +"33c7d1cc": "restart(bool)", +"33c84990": "setNewClaimer(address,address)", +"33c8adce": "enterLeague(uint256[],uint256,bytes)", +"33c90632": "createTransferAuction(uint256,uint256,uint256,uint256)", +"33c91611": "safePay(uint256,uint256,address,bytes)", +"33c9b83c": "preIcoSoldTokens()", +"33c9ccf5": "isKeyOwner(bytes32,address)", +"33c9f271": "get_project_information(uint256,address)", +"33ca4773": "getBrandData(address)", +"33ca55d7": "requestTransferChildrenOwnership(address)", +"33caaa43": "tokenRewardContract()", +"33cbee23": "teamTwoDivsTotal()", +"33cc4f9f": "FIDAToken()", +"33cc9c3e": "getLuckyPendingSize()", +"33cd3383": "investmentsOf(address)", +"33cd7ede": "totalJackpotOdd()", +"33cdfc76": "accountOf()", +"33ce1cda": "JSJC()", +"33ce724a": "sendSoldTokens(address,uint256)", +"33ce7787": "transferInvestorAccount(address,address)", +"33ced321": "genLevelExp()", +"33cf3ca0": "icoDeadline()", +"33cf58f9": "Accepted()", +"33cfc5e3": "DEFToken()", +"33d020ae": "getManifestId(address,bytes32,bytes32)", +"33d072e2": "processFunds(address,uint256,uint256,bool)", +"33d0a56b": "Melt(address)", +"33d14097": "DoRollEvent(address,uint256,uint256,bool,bool,bool,bool,uint256,uint256,uint256)", +"33d1e5b9": "lockupAccount(address,address,uint256)", +"33d24dc4": "setTypeAdvantages()", +"33d2cea2": "getDiceWinAmount(uint256,uint256,uint256)", +"33d34bad": "nextlotnr()", +"33d52c71": "ico3Cap()", +"33d58ca6": "F2UToken()", +"33d59f0a": "setJobStatus(uint256,uint8)", +"33d5d29b": "containsOperator(address)", +"33d5e4ca": "LogErrorMsg(string)", +"33d634df": "getSpinResults(uint256,uint256,uint256,address)", +"33d63869": "icoReserveSupply()", +"33d64a6f": "Start_Resume_ICO()", +"33d6c065": "PenCrowdsale(uint256,address,address)", +"33d764a2": "transferPreSigned(bytes,address,uint256,uint256)", +"33d9529a": "Totalbalance(address[])", +"33d97457": "GRAPE_SECS_TO_GROW_VINE()", +"33da67a0": "setForceNsfw(uint16[],bool)", +"33daaa5e": "setMakerFeeRate(uint256)", +"33db82fd": "outToken()", +"33dd1b8a": "setAllowed(address,address,uint256)", +"33dd5fb8": "TransferAntique(bytes32,address,address)", +"33dddc3a": "openLootbox(address)", +"33de06d5": "changeEscapeHatchCaller(address)", +"33de61fb": "Marvin()", +"33de96c6": "cancelTransaction(address)", +"33decdc6": "returnVolAdjuster(uint256)", +"33df4155": "setSPARCAddress(address)", +"33dfc93c": "untokenizePosition(bytes32,address)", +"33dfe91d": "isDefValueInRange(uint8)", +"33e06ee7": "buyTokensAtRate(address,uint256)", +"33e11ec4": "getBcouponTransferCost()", +"33e13ecb": "Execution(uint256)", +"33e2df5c": "newTeamCreated(bytes32,bytes3,bytes3,bytes3,bytes3,bytes3,bytes3)", +"33e2df5d": "isTokenValid(string)", +"33e335a0": "fromPaymentGateway(address)", +"33e364cb": "resumeSale()", +"33e36c50": "FundsLoaded(uint256,address)", +"33e3e86a": "isValidSan(string)", +"33e5bce1": "allow_spend(address)", +"33e663a4": "BonusEarned(address,uint256)", +"33e665eb": "setMonsterAuctionAddress(address,address)", +"33e67012": "disableChain(uint256)", +"33e712fe": "functionEight()", +"33e747b3": "setCapAtWei(uint256)", +"33e7ed61": "submitPool(uint256)", +"33e7fb97": "modifyExecutorAddr(address)", +"33e85eac": "get_king_price()", +"33e8b084": "dePesoToken()", +"33e8b8ac": "setFounderAllocation(address,uint256)", +"33e8df7e": "get_property_address(uint256)", +"33e90f98": "migrateMntp(string)", +"33e9698c": "tokenIssueDeadline()", +"33ea3dc8": "getTransaction(uint256)", +"33ea7a2b": "setBundinha(string)", +"33ea80cb": "getProposalUint(int256,uint256)", +"33eb5564": "mid(uint256,uint256,uint256)", +"33eb647f": "ECNcoin()", +"33ee2297": "MintedGrey(address,uint256)", +"33eeb147": "isFrozen()", +"33ef5698": "setShareTradingEnabled(uint256,bool)", +"33f0779d": "sendWhitelistReferralRewards(uint256)", +"33f08327": "generate_paymentID(uint256)", +"33f1da25": "BiQToken(address,address,address,address)", +"33f1dfb5": "withdrawTokenByAdmin(address,uint256)", +"33f2da95": "test_insert_findWithHintNextUpdateTail(int256)", +"33f2e7f8": "takeOffer(uint256)", +"33f30a43": "getNarco(uint256)", +"33f3197e": "Bet(uint256,string)", +"33f327be": "FeemCoin()", +"33f3344c": "readQuantity(address,uint256)", +"33f35c40": "webdToken()", +"33f37304": "tTokens()", +"33f44026": "mintFoundingTeamTokens(address,uint256)", +"33f4406a": "addressCommunity()", +"33f472b9": "MPO()", +"33f50b1c": "extendICO()", +"33f707d1": "ownerWithdraw(uint256)", +"33f7c9fe": "UsersList()", +"33f8845d": "GetTotalRigCount()", +"33f88d22": "mintOwner(uint256)", +"33f8e8c7": "getUserTokenInfosLength()", +"33f9942b": "awardPoint(bytes32)", +"33f9b36f": "getIcoStartDate()", +"33fa59f0": "creationProfit()", +"33fb1e05": "withdrawChamp(uint256)", +"33fb9e35": "killSelf(uint256)", +"33fba1ed": "_getFightData(uint32)", +"33fbff32": "setSaler(address)", +"33fc56d9": "withdrawUnclaimed()", +"33fc5f47": "proposePurge(address,bytes32)", +"33fc6367": "updateRefundState()", +"33fcffa8": "Option(uint256,uint256,string,string,string,string,string,string,bytes32,address,string,address,uint256)", +"33fd066d": "doBalanceFor(address)", +"33fd40ec": "oraclize_query(string,bytes[4],uint256)", +"33fd9397": "buyBackPriceWei()", +"33fdb097": "BTSC()", +"33fdbbe5": "DECIMAL_FACTOR()", +"33ff588d": "ownerChangeRunning(bool)", +"3400a6dd": "crowdsale(uint256,uint256,uint256)", +"3400d00d": "PayTokens(address,uint256,uint256)", +"3401c277": "subtractAmount(address,uint256,uint256,uint256)", +"3402b841": "closeVoteCommitPhaseIfAllowed(address,bytes32,bytes32)", +"34032f4f": "teamSupply12Months()", +"3404ab6a": "calcEthersToTokens(uint256,uint8)", +"3405321d": "_setPrice(uint256,uint256)", +"34057a45": "rollAddress()", +"3405ae40": "setMaxSubscribers(uint256)", +"3405deed": "alwaysReverts(uint256)", +"34065b66": "getSmallBonus()", +"3406784d": "arbitrateC4FContract(uint8)", +"3406956a": "bountyTokenFund()", +"340695c0": "PRESALE_RATE()", +"3406e3fb": "singleTransGasCost()", +"340700e5": "Satochi4()", +"34075cbd": "proposalStatuses(uint256)", +"34083a28": "HoneyToken()", +"34085549": "buildAt(uint256,uint256,uint256)", +"340867a0": "setMiniPoolEdit_1(string)", +"3408f73a": "getStorage()", +"340955fc": "isNotDuplicateMembers(bytes32)", +"3409952b": "setStorageInterface(address)", +"340a247c": "getQueryCost(string)", +"340a773a": "LockedToken(uint256,string,string)", +"340adb29": "getExportingParty()", +"340dc485": "addEmailHash(uint256,address)", +"340ddda6": "MeatConversionCalculator(uint256,uint256)", +"340df28f": "finishUpgrade()", +"340e47f8": "activateStore(string,bool)", +"340e4fd5": "totalRequestsAmount()", +"340ea558": "isFavorEscrow(uint256,address)", +"340f4fea": "setBetExpirationBlocks(uint256)", +"340f5920": "winningTicketNumber(uint256)", +"340f5e4e": "get_all_num_levels()", +"340fef94": "MMMbCoinCrowdsale(uint256,uint256,uint256,address,address,address,address)", +"34100027": "withdrawLegalContingencyFunds()", +"34103ee4": "setCrowdsaleAgent(address)", +"3410452a": "getRequestsCount()", +"34106c89": "updateRenExTokens(address)", +"34107282": "signer1()", +"3410cbd5": "layersRec(uint256,uint256)", +"3410eb5b": "userRefundTo(address)", +"3410fe6e": "DIVISOR()", +"3411231c": "ANXToken()", +"341176d6": "crowdsaleManager()", +"34119d15": "setSellFeeBps(uint256)", +"3411c81c": "confirmations(uint256,address)", +"3411cb08": "getFreelanceAgent(address)", +"34122952": "build(uint256,int256,int256,uint8)", +"34127649": "JvaToken(address)", +"3412a15c": "testConnection()", +"3412a4ac": "setFundingEndTime(uint256)", +"34133df9": "TR()", +"341367ec": "getMaxCAP()", +"34140748": "_upgradeTo(address)", +"34145808": "totalRewardToken()", +"3415650e": "buyStatus()", +"3415bdd4": "buyAKeyWithDeposit(uint256,address,uint256)", +"3416f9d4": "subtractSafely(uint256,uint256)", +"34174331": "selfHybridization(uint256,uint256)", +"3417f8d3": "addHolder(address,uint256,uint256)", +"341855bf": "HappyBirthdayToken()", +"341881e6": "endPreIco()", +"34190567": "DebugInt(int256)", +"341912ad": "SOCIALXBOUNTY()", +"341b96c2": "WalletAddressChanged(address)", +"341b9cc2": "ValueToken(uint256,string,string)", +"341bae0e": "refBonusPercentAtNow()", +"341bcbc1": "endIco2()", +"341c3304": "presaleTokensSold()", +"341cc817": "preicobrandingWallet1Pct()", +"341ceb42": "updateAmountOfEachChoice(uint256,uint256)", +"341f13f2": "authorizeDeploy(address)", +"341f5ee2": "omsairam18()", +"341f6623": "toAddress(bytes32)", +"3422e048": "getFirstTokens()", +"3422ede1": "Vault(address,address,uint256,uint256,address,uint256)", +"3422f709": "totalSencCollected()", +"34231e72": "getMyTransferredWine()", +"342368e4": "SubFromDividends(uint256)", +"3423a768": "finalizePreICO(uint256)", +"342442bd": "lockTeamAndReserve()", +"342454c7": "isDigit(bytes1)", +"34247b9b": "changeDBAddress(address)", +"34253af5": "isICORunning()", +"34256ab2": "createQuote(uint256,bytes32,bytes32)", +"34265c48": "releaseTime(address)", +"34273351": "withdraw2(uint256)", +"34289460": "cleanupTo(address)", +"3428e7ba": "checkForNewDay()", +"342930aa": "peekHatch()", +"342b7e71": "setTokenList(address[])", +"342b88ba": "setIcoTier(uint256)", +"342ba8de": "getGen0IVs()", +"342bd327": "GenesisRewardPerBlock(address)", +"342c17cd": "finalReserveAllocation()", +"342ca5d6": "pricePointsLength()", +"342d9185": "pricePerTokenAtCurrentTier()", +"342d9a04": "challengeClearing(bytes32)", +"342e0260": "gettruelevel(address)", +"342e515c": "Electrium(uint256,string,uint8,string)", +"34302882": "ETY(address)", +"34302d82": "midTimeBonusLimit()", +"34306cb8": "placeMessage(string,bool)", +"34309e97": "tokensOwner()", +"3430f7b1": "TitleAdded(uint256,address,uint256,string,string,string,uint256)", +"3431024f": "disApproveUsers(address[])", +"3431a0be": "RegisterSeller(address,string,string,string,string)", +"3432000c": "kittiesContract()", +"343214ae": "isFundFreezePeriodEnded()", +"34334e9e": "removeBlacklistedUser(address)", +"34335c01": "getPresale2()", +"343458e2": "withdraw(uint256,bytes32,address,uint256)", +"34354f93": "ABC()", +"3435dea2": "PoolJoined(uint8,uint8,uint256,uint256)", +"3435e5f3": "newChief(address,uint256)", +"3435ea80": "adduser(address,uint256)", +"34364afa": "modifyICOStartDate(uint256)", +"34376542": "OwnerUpdate(address,address)", +"34376ca0": "authorizeBurner(address)", +"3438c758": "DelayedPayments(uint256,uint256,uint256)", +"34399ea8": "considerCurrentInterest()", +"3439b433": "RSPLT_E()", +"343a875d": "getUint8()", +"343a8d56": "Lucky888Token()", +"343aad82": "flow()", +"343ab4cd": "getMiningPoolAddres()", +"343ab68b": "getFreelancerContractsCount(address,address)", +"343bd7eb": "insertOwner(address)", +"343c018b": "GarudaToken()", +"343d5048": "FighterCore()", +"343dbeb6": "isServiceRemoved(address,uint32)", +"343dfb7e": "referralPercent()", +"343efc6c": "WorthlessToken()", +"343f3acb": "GetAllBetIDs()", +"343f40a0": "testFailCreateSameItemId()", +"343ff8c7": "deductshares(uint256,address)", +"3440465e": "addElement(bytes32)", +"34406f33": "sha3Docs(bytes32)", +"344090f2": "Ownable1()", +"34409e38": "_generateNewSaddle(uint256,uint256,uint256,address)", +"3441ecf2": "Calculator()", +"34428440": "tokenExchangeRateMile1()", +"3442a868": "getBtcForkCoins()", +"3443c64a": "changeEEMWallet(address)", +"3444189b": "newKudosPoll(string,string,uint8,uint256,uint256,uint256)", +"34452f38": "disableMint()", +"3445679a": "USDto1ETH()", +"34457cbe": "ExponentialDecayingTokenFunction()", +"344605f4": "ETFloorPresale(address)", +"344615ab": "unSell()", +"3446bac4": "retirarDividendos()", +"34475d8d": "getERC721Addrs(uint256)", +"3447a7ef": "addInWhiteList(address)", +"3448348d": "getEventSize()", +"34484b47": "functionSix()", +"34486434": "ConsentFactory()", +"3448c7d6": "createHistory(bytes,address,address)", +"3448ec4a": "checkMatchBatch(address,uint256[16])", +"344929e4": "CTS(uint256,string,string)", +"3449387b": "GetFileLocation(bytes32)", +"3449f61c": "_getBonus(uint256,uint256)", +"344b8386": "firstYearPeriods()", +"344bcc7d": "signedTransferFrom(address,address,address,uint256,uint256,uint256,bytes,address)", +"344bcd7d": "allCrowdSaleTokens()", +"344c0dd5": "newChamp(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,address)", +"344c5ea1": "Mino()", +"344c5fd6": "firstPeriodOfICO()", +"344cc2b8": "getAllBidsByAdunit(uint256)", +"344d1ef2": "getCarSelling(uint32)", +"344d9576": "ReinvestWallet()", +"344e23cf": "previligedBalanceOf(address)", +"344eca75": "amountRaisedICO()", +"345006b6": "getGenerationForCall(address)", +"34501134": "get_pre_kyc_bonus_denominator(address)", +"34516038": "getSellCount()", +"34523cbc": "numberOfWhitelists()", +"3452f51d": "push(address,uint128)", +"345393f0": "getOuLianPublicAddress()", +"34552a0a": "RegisteredContract(string,address)", +"34553a44": "getRequiredSubscribers()", +"34556035": "icoCompleteB()", +"345591ec": "inDistributionMode()", +"345607ab": "StoreProofOfUplinePaid(address,address,address,address,address,address,address,uint256)", +"34574ff3": "XFMSold()", +"345899fe": "addRoles(bytes32[],address,address)", +"34592491": "infoWithdraw2()", +"345942c8": "revealBet(address,string)", +"3459b1af": "SaleNew()", +"3459d2ba": "getTilePriceAuction()", +"3459fb6f": "unpack_data_groups(int256[],bool)", +"345a1ae4": "LASTTRIAL123()", +"345a3899": "Insurence()", +"345a4423": "win(uint8)", +"345a5fe4": "addRecoveryAddress(address,uint8)", +"345a8e5b": "uint2bytes(uint256)", +"345ac602": "fixAmount()", +"345b256a": "projectStorageVault()", +"345b3d3a": "newOrder(address,address,string,string,uint256,uint256,uint256)", +"345bc544": "maxAllowedBetInTokens()", +"345c8fca": "setFreezeTx(address)", +"345cad7e": "useItem(address,uint256,uint256)", +"345d116f": "LotteryRoundWinner(address,bytes4)", +"345da007": "setClassName(uint8,string)", +"345e2f91": "transferEarningsToOwner()", +"345e3416": "adminRetrieveDonations()", +"345efa4e": "CurrenseeCrowdsale(uint256,address,address)", +"345f342e": "concludeVoting(uint256)", +"345f58b2": "AcceessoryWrapper721()", +"34610182": "getFuelsIds()", +"34615bef": "_discipleVendPrice(uint256,uint256)", +"3461a5e8": "ARCO()", +"346223f5": "Cocoon(address[],address,address)", +"3462f32d": "execWithGasLimit(bytes32,bytes32,uint256,uint256)", +"3463934b": "Bqt_Token()", +"3463c5c7": "patentValidTime()", +"3463d76d": "databaseDownloadUrl()", +"34646163": "getDataset(address,uint256)", +"3464af6a": "testCopyAddress(address)", +"3464e4da": "grantTokensCommonPool(address,uint256)", +"3465d6d5": "record(address)", +"346692b7": "tokenKeys(uint256)", +"3466f07f": "DRAKE()", +"34686b73": "numberOfAddress()", +"346896c0": "getMinerLv1(address)", +"3468b4a8": "OxTokenInitialized(address)", +"3469a55b": "getDepositID(address)", +"3469acbb": "initCard2()", +"3469f6e2": "finalizeRound(uint256)", +"346a2f9e": "percentBank()", +"346a37d2": "markComplete(bytes32)", +"346b306a": "oraclize_query(string,string,string)", +"346b783c": "refundToPlayer(address)", +"346b7939": "icoReservedSupply()", +"346bfd9f": "eventBurn(address,uint256)", +"346c1aac": "getNextAvailableBond()", +"346c95df": "SuNFT()", +"346c96e9": "addFund(uint256)", +"346cabbc": "scheduleCall(address,bytes4,uint256,bytes,uint256)", +"346cf356": "tradeCards(address,uint256)", +"346e8cea": "allCarsInfo()", +"346e9a26": "getCanWithdraw(address,uint256)", +"346f2eb7": "set_bonus_received(bool)", +"346f5991": "sendTokensToTeamLock(address)", +"346f8827": "addWineryOperation(bytes32,address,string,string,string,uint256,uint16,string)", +"346f9f95": "collectAddr()", +"346fc0dd": "maxCrowdsaleSupplyInWholeTokens()", +"346ff6b3": "getNumRounds()", +"346ffa4b": "changeValues1(bool,bool,bool,bool,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"34701db8": "totalTicketsSold()", +"34705c2f": "validateTransferAmount(address,uint256)", +"3470b833": "blackListERC223(address)", +"34716f67": "post(string,bytes20[])", +"3471728a": "masterContractAddress()", +"3471aef0": "handbreak()", +"3471b034": "Submission(uint256,string,address,address,uint256,string)", +"34721e08": "test0Alice()", +"3473bf30": "setEndingTime(uint256)", +"3473f5e4": "HashOfDB()", +"34746d86": "killTokensForGPower()", +"347518c7": "validPurchaseTime(uint256)", +"34757fa9": "correctPreICOPeriod(uint256)", +"34758cb3": "currentEggPrice(uint256)", +"3475c1e7": "attemptPublishOfArticle(uint256)", +"34762a94": "ethHandleIsRegistered(bytes32)", +"347632e8": "getShareholderAdressByID(uint256)", +"34763586": "FoundersAndPartnersTokensIssued(address,uint256,address,uint256)", +"347637b3": "setBDApprove(address,uint256,bytes32)", +"34766ecc": "PauseOff(uint8)", +"3476aeb0": "signer2_proposal()", +"34771f81": "setData_5(string)", +"34776c6e": "DEAToken()", +"347820eb": "previousUpdateTime()", +"34785e79": "setEthRelief(address)", +"34786d1d": "totalTokensToTransfer()", +"3478ab86": "HYToken()", +"3478ac2b": "createShow(uint256)", +"3478dc44": "getRecordOffers(bytes32)", +"3479101f": "setProviderSupply(uint256,uint256,uint256)", +"34791ae5": "POPPToken()", +"3479f017": "ServiceContract(uint256,uint256[],uint256[],string,uint256,uint256,uint256[],uint256[],address,address,address,address,address)", +"347aa903": "SDOGE(uint256,string,uint8,string)", +"347aba23": "evePerEth()", +"347acf2f": "mintingFactories(uint256)", +"347b3923": "putProfit()", +"347b5193": "LiquexPrivateInvestment(address)", +"347caeb4": "PhxHell(address)", +"347cda88": "needsBlockFinalization()", +"347d5bc2": "setPayoutOdds(uint256)", +"347e26c0": "icoEtherContributed(address)", +"347f5f00": "TokenPurchase(address,uint256,uint256,uint256)", +"347f8f54": "_setDiscount(uint256,uint256)", +"347ff187": "changeAirAmount(uint256)", +"34805e7c": "targetBlockNumber(uint256)", +"34809ee7": "doge()", +"34810336": "discountEndTime()", +"34814e58": "transferBalanceWithFee(address,address,address,uint256,uint256,address)", +"34825a23": "playGame(uint256,uint256)", +"3482e0c9": "cancelAuthorization(address,address)", +"34831b79": "VENSale()", +"34833a6d": "icoBalanceOf(address,address)", +"34835560": "innerlockStartTime()", +"348378d0": "Whitelisted(address,uint256,uint256,uint32)", +"348508cf": "thirdDueDate()", +"34854101": "ETH_TO_WEI()", +"3486645f": "forkReceive(address,uint256)", +"3486fb30": "mintLockPeriodBatch(address[],uint256[],uint256)", +"3487d97c": "setPriceCredentialItemId(bytes32,bytes32)", +"348a653a": "CONFIG_DURATION()", +"348b1b7d": "temperatureMin()", +"348be311": "LogBidOpened(uint256,address,uint256,bytes32,uint256,uint256,uint256,bytes32)", +"348c5b20": "basicApproveTest(address)", +"348e9779": "Restart(uint256)", +"349136af": "BonusScheme()", +"3491a19d": "TokenDemo(string,string,uint8,uint256)", +"3491d0f1": "processTransactionFee(address,uint256)", +"349221be": "ColorCoin(address,address)", +"349296a5": "SaleAuction()", +"3493075e": "getLevelCitizenLength(uint256)", +"3494ab3d": "validEAContract(uint32,address)", +"3494f222": "issueSuperMetal(address,uint256)", +"3495015a": "UnlimitedIPToken()", +"349501b7": "checkDepth(uint256)", +"34950dcf": "approvedSubmissions(uint256)", +"34954a99": "updateBalance(address,address,uint256)", +"34955a2b": "setTavernContract(address)", +"3495b21e": "setNewReleaseEndTime(address,uint256,uint256)", +"349718ed": "MarketCoin()", +"34971dd6": "totalEtherCap()", +"34984add": "signedTransferFrom(address,address,address,uint256,uint256,uint256,bytes32,address)", +"34988b95": "ExToke()", +"3498aaaf": "LogAllowedFromAddress(address,bool)", +"3498b00f": "getSectionIndexFromIdentifier(uint256,uint256)", +"3498c518": "StageClosed(uint256)", +"349a1f03": "getNumSums()", +"349a373b": "batchcreatevillage(uint256)", +"349a6edb": "_purchaseTokens(uint256,address)", +"349aa97e": "ethereumToTokens2_(uint256)", +"349ab992": "divCutAdmin()", +"349ae23b": "collectFor(address)", +"349b586c": "isCrowdsaleFinalized()", +"349b6486": "revokeGrant(address,uint256)", +"349c1ee3": "enableCrowdsale()", +"349c3d75": "changeSaleBonusRate(uint256,uint8)", +"349c870c": "initChainLedger(address,address)", +"349ca600": "Tags()", +"349cdcac": "reLoadXid(uint256,uint256,uint256)", +"349d1661": "BuyToken(address,uint256,bytes32)", +"349d3dc5": "breedTimeout()", +"349d8b4e": "communityMultisig()", +"349dc329": "miner()", +"349eb329": "jsonCat(string,string)", +"349f7173": "lastOraclePrice()", +"349f939a": "SaleEnded(address,uint256)", +"349fcf85": "UpdateAddressPayForService(address,address)", +"349fdb09": "setUnPaused()", +"34a014dc": "lastWithdrawalTime()", +"34a042d8": "bountyPoolAddress()", +"34a2b766": "getMarketData(address,address)", +"34a3312e": "setStore(string,address,address)", +"34a3b820": "getNewFallbackDepositPeriod()", +"34a4a527": "getCountHolders()", +"34a4b10b": "allocatetokensAndWL(address,uint256,uint256)", +"34a503e8": "_utfStringLength(string)", +"34a5eaa9": "_createPerson(string,address,uint256)", +"34a6074e": "buyWithBalance()", +"34a6301e": "setmessager(string)", +"34a6d832": "canPurchase()", +"34a6e514": "updateTaskState(string,string)", +"34a7ed17": "wikiAddTokenTo(address,uint256)", +"34a814a3": "setMyEthBalance(address,uint256)", +"34a8c392": "webSite()", +"34a8eb53": "getarg_1_input()", +"34a8f866": "setMatured(uint32)", +"34a90d02": "lockAddress(address)", +"34a9918e": "DEWCOIN()", +"34a991db": "enableManager(address,bool)", +"34a9a1ae": "getTokenDefaultPartitions()", +"34a9bb34": "getCurrentPublicBracket()", +"34aa0e7f": "dividendRegistration()", +"34aa982a": "getInfoForDisputeAndValidate(bytes32,address,address,address)", +"34ab32e1": "minerTotalYears()", +"34ab8256": "RUDAWORLD()", +"34abd1b1": "updateMaxPhase3(uint256)", +"34ac6f5e": "AVAILABLE_FOUNDER_SUPPLY()", +"34acc716": "projectDone()", +"34ad1e53": "giveBalance(uint256,uint256,uint256)", +"34ad324c": "sendToOwners(uint256)", +"34ad6f00": "TimePassBy(string,uint256)", +"34ae6984": "view66()", +"34aeefd5": "RemovePlayer(address)", +"34af370f": "lockTime(address,uint256)", +"34b0e5ed": "icoPrice()", +"34b122cb": "addTokensToReturn(address,address,uint256,bool)", +"34b20591": "createERC20Token(uint256,string,uint8,string)", +"34b3ae71": "_distribute()", +"34b3b014": "resolveSupply()", +"34b4eef2": "setStartIcoPreICO2ndRound(uint256)", +"34b55235": "registerAffiliate(address,string)", +"34b63592": "addre(address)", +"34b73591": "DevMiningRewardTransfer(address,address,uint256)", +"34b768c7": "summonHero(address,uint8,int256)", +"34b7ac9b": "END_MINTING()", +"34b88e04": "claimCoreTokens(address,uint256)", +"34b8b690": "Yuri()", +"34b98747": "onlyOwnerGetTeamWallet()", +"34bafed3": "date_string(int8,int8,int16)", +"34bb1a9e": "founderTimeLock()", +"34bb3ee1": "updateEthICOVariables(uint256,uint256)", +"34bb447f": "getDiceWinAmount(uint256,uint256,bool)", +"34bbabbd": "RaffleTshirt(string,uint256)", +"34bc5156": "Crowdsale(uint256,address)", +"34bc98b7": "latestPing(uint256)", +"34bd08c4": "getLargeAmountBonus(uint256)", +"34bdcd0a": "getLedgerValue(string,address,address)", +"34bdea85": "setICO2Phase()", +"34bdf2c4": "setReference(address)", +"34be5fab": "mintParcelTokens(address,uint256)", +"34be9ffb": "confirmApplication(uint256,bool)", +"34beb204": "ZZC(uint256,string,string)", +"34bed16c": "bountyRefund(address,uint256)", +"34bf97ea": "setBonuses(uint256[])", +"34c05ca8": "modifyMetadataHashes(uint256,bytes32,bytes32,bytes32[],bytes)", +"34c0c9c6": "RemoveApprovedAddress(address,address)", +"34c0d654": "setPackageDb(address)", +"34c19b93": "getCallGracePeriod(bytes32)", +"34c1b4ba": "sha(bytes)", +"34c1ef77": "publicSaleTokensAvailable()", +"34c2904b": "giveDividend(uint64)", +"34c2b620": "getNickname(uint256)", +"34c31392": "breakParentsHaveGreaterPriority(uint256,address)", +"34c3236a": "signatureDropSingleAmount(address[],uint256)", +"34c39d1c": "ThreeDLTokenDeposit()", +"34c42106": "BOXT()", +"34c5c059": "addEtherToSphere()", +"34c6766f": "getImportingAuthority()", +"34c6a9ae": "getTokenTimelockDetails(address,uint256)", +"34c721a9": "getExploreResult(uint256,uint256)", +"34c73884": "Mint()", +"34c757cf": "NBAT102(address,address,address,address,address)", +"34c7b8e8": "getReadMessages(address)", +"34c7dcf8": "proposedUserKey()", +"34c8e114": "reservedDestinations()", +"34c8ea26": "SetupiBird(string,string,uint256,uint256,uint256,address,address,uint256)", +"34caa999": "setMinimumFundingAmount(uint256)", +"34cac67e": "investorsArray(uint256)", +"34cad6b8": "retreiveTokens()", +"34cad836": "coinsaleDeadline()", +"34cbbef9": "EndRateChange(uint256)", +"34cc0a12": "_addWhitelister(address)", +"34cc182b": "updateDiamond(string,string,uint256)", +"34cc4b8f": "ratePerWeiInPrivateSale()", +"34cdb15f": "addressToTimestamps(address,uint256)", +"34cdf78d": "blockHashes(uint256)", +"34cec84d": "maxCapCompanyInventory()", +"34d05b1f": "freezeDeliver(address,uint256,uint256,uint256,uint256)", +"34d09ff1": "DemoraCash()", +"34d0cb6d": "CNYToken()", +"34d1c0e6": "transfer_bond_token(address,address,uint256)", +"34d2485c": "tribeTokens(address)", +"34d24bff": "no(uint256,string,uint256)", +"34d2c4cb": "mintProxyWithoutCap(address,uint256)", +"34d31de3": "length(uint8)", +"34d33f9f": "kycRefuse(address)", +"34d40382": "nextSection(bytes32)", +"34d4776b": "removeApprovalStatus(address)", +"34d4cd82": "getTokenForTeam(address,uint256)", +"34d55cd9": "SerpentCountDown()", +"34d56b0a": "Currentproposal()", +"34d5751a": "approveContractCall(address)", +"34d5f37b": "round(uint256)", +"34d5fc4b": "transferInitialAllocationWithTimedLock(address,uint256,uint256)", +"34d609ac": "auditorHasStaked(uint256,address)", +"34d64e50": "getDoneAirdropAmount(address)", +"34d71238": "sencBalance()", +"34d722c9": "minterAddress()", +"34d83dab": "PhaseICO()", +"34d8521b": "quarterlyWithdrawable()", +"34d8c24d": "init(uint256,uint256,address,address,address,address,uint256,uint256,address,uint256,uint256,bool,bool)", +"34d92490": "changeFuckyou()", +"34d95bf0": "ShitCloneslordAddress()", +"34d9aee3": "assertEq7(bytes7,bytes7)", +"34dbe44d": "getLastBlockNumberUsed()", +"34dc2176": "inventoryProduct(bytes32)", +"34dc3c32": "pricePerWei()", +"34dc864c": "YYYToken()", +"34dcfec4": "minimalETH()", +"34df4222": "hasBeenLinked(uint32,int256)", +"34df8b63": "PER_USER_MAX_AVATAR_COUNT()", +"34df9b60": "getCow(uint256)", +"34e19907": "setSwapFee(uint256)", +"34e1ad21": "EmontFrenzyTool(address)", +"34e22921": "Call()", +"34e23416": "lastcombo()", +"34e24640": "distr(address,uint256)", +"34e24853": "encode(address)", +"34e255a4": "WTechTestCoin()", +"34e415db": "growWeed(uint256)", +"34e41bbf": "RATE_DAY_1()", +"34e4c06d": "maxSupplyGenerable()", +"34e5a5f8": "getPlayerInfoWithRoundID(uint256)", +"34e5a692": "distribute(uint128)", +"34e5e97a": "assignProduct(uint256,uint256,uint256,uint256)", +"34e70cc2": "tub()", +"34e73122": "calculateFee(uint256,uint256)", +"34e73f6c": "getAuctionCost(bytes32,uint256)", +"34e7a57a": "nonWLBalanceOf(address)", +"34e80c34": "getKeys(address)", +"34e8980f": "bootUpHangouts()", +"34e8c679": "retrieveTokens(address,uint256)", +"34e8ecea": "FindTheCureCoin()", +"34e8f247": "setStartTimeIcoStage3(uint256)", +"34e98037": "batchAssignment(address[],uint256[])", +"34e9d146": "EstateToken(uint256)", +"34ea5fe5": "setNumeratorDenominator(uint256,uint256)", +"34eaa923": "moveEther(address,uint256)", +"34eac76f": "withdrawalDeployed()", +"34eaf154": "investorAmount(address)", +"34eafb11": "totalCount()", +"34eb0cf5": "isUserBlacklisted()", +"34eb3200": "setRequiredProgressOfPreviousDungeon(uint32)", +"34ebb615": "maxTokenToBuy()", +"34ec514b": "setInitialPrize()", +"34ec96bf": "dAddCategory(bytes32,bytes32,bool,uint256)", +"34ed557f": "setTokenIpfsHash(address,bytes32)", +"34eea4a2": "executeRoom(uint256)", +"34ef39f1": "owner_withdraw()", +"34ef801e": "wcOnCrowdsaleSuccess()", +"34efcb8e": "getPlanet(uint256)", +"34f00e83": "setCrowdsaleStart()", +"34f03321": "PCM(uint256)", +"34f0e39e": "addCurator(address)", +"34f10c39": "chkcan(address,uint256,uint256)", +"34f110e5": "getPoolMaxPayoutQspWei(uint256)", +"34f1f9b1": "lbToken()", +"34f20f31": "setExchangeRateAuth(address)", +"34f245c2": "hasSecondUnionIds(bytes32,bytes32)", +"34f25146": "numOfReleased()", +"34f2d1ec": "scheduleUnsoldAllocation()", +"34f361a4": "bonusSecondWeek()", +"34f42df8": "testerc20()", +"34f50813": "PreICOToken(address)", +"34f64dfd": "bobMakesErc20Payment(bytes32,uint256,address,bytes20,address)", +"34f682e2": "GetPriceOfRigs(uint256,uint256,uint256)", +"34f6bef3": "allTokensDecimalsBalances()", +"34f6d0b3": "Congress(address)", +"34f71c5d": "InDetailToken()", +"34f732e8": "withdrawalLockTime()", +"34f8cc6d": "DrAgentToken()", +"34f9445e": "consumeEnergy(address,uint256)", +"34f96971": "lockedBalanceCount()", +"34fa0606": "getControlInfoTokenlist()", +"34fa17cb": "getTeamBet(string)", +"34fa37da": "grantTokens()", +"34fb032e": "getAddr(string,string)", +"34fb11ed": "setMintingFeeEnabled(bool)", +"34fc2591": "toggleFreeze()", +"34fc62ff": "_badgeOwnerChange(uint256,address)", +"34fcc3e7": "getBetting(uint256,address)", +"34fcf437": "setRate(uint256)", +"34fe00b1": "getDocumentMajorities()", +"34fe0cf5": "payFee(address,address,address,bytes32,address,address,bool)", +"34fe5473": "largestDonation()", +"34fec467": "transferAllowed()", +"34fee3e4": "AuctionSuccessful(uint256,uint256,address,uint256)", +"34ff37f3": "returnLongCouponAmount(address[3],bytes32,uint256)", +"34ffea2c": "token_iso_price()", +"35001a1a": "internalMint(address,uint256)", +"350078b8": "staticblock()", +"3500a48d": "transferCommunityCommune(uint256,address)", +"35013592": "getStageCap(uint256)", +"35020cb9": "getReferenceType(bytes32)", +"35021991": "PresaleStarted(uint256)", +"350279c6": "getStage3Cap()", +"3502be27": "TaxTillNow(uint256,uint256)", +"35039525": "isBarCode(bytes32)", +"350460f8": "basicTokensPerEth()", +"35046722": "getAddressBalance(address)", +"350486da": "AgiCrowdsaleMock(address,address,uint256,uint256,uint256,uint256,uint256)", +"35058a2a": "approveOperatorTo(address,address,bool)", +"3505e844": "userExists(address,address)", +"350604f1": "rakesOwing(address)", +"3506b32c": "FailedTransfer(address,uint256)", +"35082933": "setAdminWallet(address)", +"350845f5": "maxStage3AllocationPerInvestor()", +"35085b58": "weekThreeStart()", +"350896f7": "setEtherPriceManually(uint256)", +"3508eddb": "AnkitToken()", +"3508f2e8": "Monday(uint256,string,string)", +"350a6429": "minAmountETH()", +"350b4c6f": "setWLMTBounce(uint256)", +"350b4cb6": "BaseAirdrop(address,address)", +"350bb144": "createContractGirl(string)", +"350c0acf": "checkWithrawStock(address)", +"350c35e9": "withdrawCollateral(address,uint256)", +"350cf91c": "createManufacturer(address,address,string,string)", +"350d141e": "getWasApprovedBeforeDeadline()", +"350d9b96": "walletWithdraw(uint256)", +"350dbcc5": "get_Sponsors_list_by_Job(uint256)", +"350dd4a4": "Nettekcoin()", +"350ee628": "addVerifiedInfo(address,address,string,uint8,string,string)", +"350f4270": "specificTransfer(address,uint256)", +"350f9e01": "swypes()", +"350fbe2e": "calcNextDrawTime()", +"35100acc": "credit_token(address[],uint256)", +"35101d8e": "balancesForOutcome(uint8,address)", +"35105e3b": "executeChildDaoProposal()", +"35109cc6": "PRE_SALE_TOTAL_TOKENS()", +"3510b66c": "reduceTotalSupply(uint256)", +"3511c1af": "getMySnake()", +"3511ca9c": "Freezing(address,uint256,uint256)", +"351210b3": "BpxToken()", +"35126330": "GanaTokenLocker(address,address)", +"35130678": "additionalPreMine(uint256)", +"351314a5": "oIDIndex_()", +"3513651c": "Spin(address,int256,uint256)", +"35139014": "preICOstart()", +"3513cab2": "getWeeklyBuyVolume()", +"3513d339": "ForceSendTokens(address)", +"351509a8": "TEAM_ADDRESS()", +"3515519c": "getInitialval()", +"3516df21": "supplyBurn(uint256)", +"3517a740": "getNodeParent(bytes)", +"35181711": "SetStartTimeIco(uint256)", +"3519786f": "setAvailableFlat()", +"35197d6b": "sendData(address,uint256,uint256,bytes)", +"3519932e": "authorized_recordStashedPayout(uint256)", +"3519a2f8": "fundContract(uint256)", +"351a97f8": "accountKind(address)", +"351abe61": "getBusinessVATStatus(uint256,uint8,address)", +"351adcb0": "SocialPay()", +"351b68db": "SWAP_LENGTH()", +"351be6ad": "releaseProduct(address)", +"351bf518": "transferFeeRate()", +"351c2576": "completeFavor()", +"351c9133": "userkeys_push(address,uint64,uint64,uint64)", +"351dadf4": "support_ban_of(address)", +"351df92a": "setBattleAddress(address,address)", +"351e46de": "setBLInterface(address)", +"351f42c3": "msgs(address,uint256)", +"351f98d9": "icnq()", +"35209715": "burritoPoolTotal()", +"35209821": "metadataContract()", +"35213a69": "abandonedFundWithdrawal()", +"35216bba": "enableTokenTransfer(bool)", +"3521d7da": "prvd()", +"3522e868": "changeLogicContractAddress(address)", +"35259f1a": "ThriveToken()", +"3525d66d": "CanvasFrag()", +"35269662": "importerBanker()", +"3527cae0": "_deleteUint(bytes32)", +"3528351d": "bouleDevMultisig()", +"3528a0c8": "GlobalTransfersLocked(bool)", +"3528c022": "days_interval()", +"3528f564": "allowancePerYear()", +"352a482f": "havedDistFoundCoin()", +"352a950c": "updateCnyBtcRate(uint256)", +"352bbdff": "referralContracts(address)", +"352c93b7": "getFess()", +"352d2790": "UUID4()", +"352d5cd0": "setPhaseSupply(uint256,uint256)", +"352e0891": "_isValidSignatureAndMethod(address,bytes)", +"352e1dff": "getWorkflowActivity(uint256,uint256)", +"352f43a8": "RongWQToken(uint256,string,uint8,string)", +"352f64f9": "getOwnerFee(uint256)", +"352fd696": "PERCENTAGE_OF_TOKENS_SOLD_IN_SALE()", +"352ff2bd": "setPreSaleRate(uint256)", +"352ffb9a": "Trident()", +"35300990": "propExists(bytes32)", +"353086e2": "MAX_BET_VALUE()", +"3530e895": "getClaimEst(address)", +"3531f0de": "LogWeiWithdrawn(address,uint256)", +"35347560": "getLamboAttributes(uint256)", +"35353b03": "parseAndRound(string,uint8)", +"353559cb": "Controller_Address3()", +"35359a3f": "tokenHolderAddress()", +"3535ab2a": "btcUsdRate()", +"3535cd52": "setDailyCosts(uint256)", +"3536046a": "getUInt(string)", +"35361909": "withdrawStart()", +"35371218": "closePositionDirectly(bytes32,uint256,address)", +"3538b13a": "MAX_TOKENS_FOUNDERS()", +"3538b9db": "test_twoValidEqBytes32()", +"3538e747": "rePayLoan(uint64)", +"35390714": "maximumFee()", +"353928d8": "helpRed()", +"35393197": "setReferer(address)", +"35396c1c": "createItem(uint256,uint256,uint256,uint256,uint256,uint256)", +"3539c468": "remainingTokenAmount()", +"353a3475": "setTargetAddress(address,address)", +"353ba8e9": "vvc(uint256,string,string)", +"353be218": "ToorToken()", +"353c0573": "burnInternal(address,uint256)", +"353d90ec": "numTickets()", +"353db436": "setCosts(uint128[])", +"353e65e9": "wallets(address,uint256)", +"353edf58": "presaleEndtime()", +"353f0e40": "getCurrGameInfoPart1()", +"353f1bc7": "setIsAllocatingInterest(bool)", +"353fe553": "BNDToken()", +"35400daf": "setTier2Participants(address[])", +"3540233b": "set_status_user(address,address,bool)", +"3540b529": "readIncUpdatedOn(string)", +"3540e96c": "tokenOWL()", +"35410f85": "KPCoin()", +"3541d365": "GPUMining()", +"3541fd53": "setStake(bytes32,uint256)", +"3541fe94": "teamVestingAddress()", +"354211c9": "TriwerToken()", +"35423643": "totalmoneyearned()", +"354271b4": "test_7_accessRestriction_UnderscoreRemoveMember_shouldThrow()", +"3542758f": "addOwner(address,string)", +"354284f2": "party()", +"3542aee2": "mintByOwner(address,uint256)", +"3542d0f6": "msgQPut(string)", +"35436725": "CoinMovement(address,address,int64)", +"3543b23c": "assign(address,string)", +"35446c78": "setAirDropPayableTag(bool,uint256)", +"3544a864": "whiteList()", +"354537da": "safeCloseSale()", +"3545acb0": "after_test_1_method()", +"354685fb": "setSellDividendPercent(uint256)", +"35468963": "rentModified(address,uint256,uint256)", +"354709dd": "trade(address,address,uint256,uint256,uint256,address,uint256)", +"3547800a": "lockTokens(address[],uint256[])", +"354836b9": "setIsReportingActive(bool)", +"3548fcd7": "getCardAttrs(uint256[])", +"35490ee9": "setPublicOfferPrice(uint256,uint256)", +"3549345e": "setPresalePrice(uint256)", +"35493e98": "icoEtherReceivedPreSecondSale()", +"35496d82": "POWHclone()", +"354a5137": "setWinnerTimeStatus(bool)", +"354b2735": "testDeploy()", +"354b7b1d": "updateVerified(address,bytes32)", +"354d68f2": "validate(address,address,bytes32,address,uint256,bytes32,address,uint256,bytes32,uint256,uint256)", +"354d7e40": "Payout()", +"354d89ee": "setTokenSaleContract(address)", +"354e1063": "setExtraConfig(uint256,uint256)", +"354e6ca7": "HippieCoinv2()", +"354eb40b": "emojisan()", +"354f1651": "completeBountyDistribution()", +"354f6398": "insert_candidate(string,uint8,string,string,string,string)", +"35509937": "changeWithdrawal(address,address)", +"3550b6d9": "getTokenAddressBySymbol(string)", +"3550e2e2": "changeBlockedTimeForBountyTokens(uint256)", +"3551a6ca": "nullifyFrom(address)", +"3551c8b9": "tokenesia()", +"355255f5": "totalSyndicateShares()", +"35527354": "submitNewHash(bytes32,uint256,uint256)", +"355274ea": "cap()", +"3552f552": "_random(uint256,uint256,uint256)", +"3552f9f6": "GetBetReadyTime()", +"3553f60d": "getPoolAdmin(uint256)", +"355421a8": "create(uint256,uint256,uint256,address,address)", +"355473d0": "setuped()", +"355474d2": "commitReading(address)", +"35548c02": "WINNERTAX_PRECENT()", +"35552dbc": "transferDSPRecord(address,address)", +"35554e58": "SearchUserPurchase(address,string)", +"3555fa90": "contractSpend(address,uint256)", +"35566ff0": "rewardSources(uint256)", +"3556afd8": "m_exchangeRate()", +"355784cb": "settleToken(bytes32,address,uint256,uint256)", +"35579f0c": "withdraw_token(address,address,uint256)", +"3557c1f6": "labAddress()", +"3557c70a": "removeMintingFactory(address)", +"3557d0e9": "testThrowIfNotExist()", +"35593bcf": "vestedAmountAvailable()", +"35595c95": "getSkillName(uint256)", +"355ae09c": "Fluzcoin()", +"355ba211": "emergencyOverwrite(bytes32,uint8,uint8)", +"355c6457": "tryToRecord(address,uint256)", +"355d59aa": "publicTokensAvailable()", +"355d7d03": "batchAllocate(address[],uint256[],uint256[])", +"355d7e05": "withdrawByMint(address,uint256)", +"355d8c64": "Uptrennd()", +"355dd1b3": "Donate_LuGoddess()", +"355df00b": "getTicketNumber(address)", +"355e0c5d": "tokenUri()", +"355e1b84": "Mstcoin()", +"355e56b9": "Assembly(address)", +"355e6b43": "setCommission(uint256)", +"355eb2c0": "canWrite(string,address)", +"355f41a9": "pay(uint256,uint256,address,bytes)", +"355f51a0": "right49(uint256)", +"355f7ea7": "canUpdateNextGameMinAndMaxBlockUntilGameEnd()", +"355fd8db": "thirdTimeLine()", +"35603440": "sections(uint256)", +"3560f05e": "AsX()", +"356282db": "changeMinBidMultiplier(uint256)", +"3562a1db": "CoderForge()", +"3562fd20": "setUIntValue(bytes32,uint256)", +"35639e11": "updateMinGasPriceForDrawing(uint32)", +"356442b9": "lockPercentage()", +"356594ab": "EtherTransfer()", +"35671214": "prev(uint256)", +"3567950c": "blockchainExchange(uint256,uint256,bytes32)", +"3567d5ef": "BuyGoods(address,uint32)", +"3567d637": "getTransactionListLength()", +"3568bd39": "mintStart2()", +"3568fb04": "createUint256(bytes32,uint256)", +"356b00af": "tranferMoneyToAddress(address)", +"356c22ec": "teamOne()", +"356ca551": "ZhkCoin(uint256,string,uint8,string)", +"356d414c": "transferFrom(address,address,address,uint256,uint256,bool,bool)", +"356d4a3a": "createJaroSleep(address,uint256)", +"356d6b24": "fifthBonusSalesEnds()", +"356e2927": "icoFinished()", +"356e7e9d": "mintToAccount(address,uint256)", +"356eeaab": "payAndReset()", +"356f056f": "releaseTime3()", +"356f083e": "_bytes32ToString(bytes32,bytes32)", +"356f55b7": "adminDropETH()", +"356f8964": "transferMed(address,uint256)", +"356f9865": "tokenPerWei()", +"356fefb3": "developer_edit_text_crowdsale(string,string)", +"357006c4": "Propellerhead()", +"3570c2ee": "PosRewards()", +"3570f217": "CarbonTOKEN()", +"3571e567": "PausableCappedDividendToken(uint256)", +"3572a28e": "EPT()", +"35734ba5": "ExternalSale(uint8,string,address,uint256,uint256)", +"35735226": "returnBonus()", +"3573df50": "CreateMND(address,uint256)", +"357401f5": "cancelBet(uint256)", +"35743ac9": "proposalActive(uint256)", +"3574da8c": "deployShop(address)", +"35759333": "checkList(uint256,address)", +"3575ecc6": "BreakbitsToken()", +"35765828": "addSystemUserEarnings(uint256)", +"3576a32f": "setBackupOwner(address)", +"3577d94e": "loanTerm()", +"35785e09": "sweepsState()", +"3578abf4": "QuintessenceToken()", +"3578b7b3": "setBuyPrice(uint256,string)", +"3578bb7f": "calculateScore(uint8[])", +"35796635": "numEndedGames()", +"3579c0df": "newAward()", +"357a0333": "initWithdrawal(address,uint256)", +"357a05cd": "cram(address,uint256,string)", +"357a05f1": "Crowdsale(address,address,address,address)", +"357a0ba2": "sgt()", +"357af806": "Restart()", +"357bd7d6": "ROHH()", +"357be177": "DemSoKhoaHoc()", +"357d0173": "removeArbiter(address,uint256)", +"357d4d1a": "ICloudSecAddress()", +"357e2e57": "addRequiredBlockHash(uint256)", +"357ee486": "createDonationsBank()", +"357fe12a": "createPromoMonsterWithTokenId(uint32,bytes,address,uint256)", +"3580031a": "consumesGas()", +"358049ea": "setDiscountTime(uint64)", +"35804a88": "returnBook(uint256,address,address)", +"35815b95": "FACTOR()", +"35817773": "getContract(string)", +"3581b257": "_addDividendsForAddress(address,address)", +"35828c8d": "TransactionInitiated(uint256,address,address,address,address,address,uint256,bytes32)", +"3583727f": "tokenSetSpeedBump(address,address,bool)", +"358373bd": "withdrawalInterCrypto(string,string)", +"35842f74": "depositDai(uint256)", +"358455b4": "testDefaultWallet()", +"3584fa38": "setDelegate(uint8,address)", +"358507d7": "claimRefundOnUnsuccessfulEvent()", +"3585609b": "getJobCanCancelAfter(bytes16,address,address,uint256,uint256)", +"358564ee": "allocateLoyaltySpend(uint256)", +"358592ce": "_freeze(address,bool)", +"3585e500": "nTransfers()", +"35862824": "isIcoOpen()", +"35866368": "transferFromWithCustomReservingNet(address,address,uint256,uint256)", +"35875623": "get_list_deposit_key(address)", +"35876476": "initialize(address,address,address,address,address,address,address)", +"3587904b": "limitOfTeam()", +"3587b26c": "setAutoBuy(uint256)", +"3588aa0b": "BMV()", +"358a074c": "admin_isRequireData(bool)", +"358a08cb": "activate(address,uint256,address,uint256,uint256,uint256,bool,bool)", +"358a11b4": "change_data(string)", +"358a18b2": "ThePatriotCoin()", +"358a2a84": "toHorse(uint256)", +"358c24b1": "CONFIG_MIN_PLAYERS()", +"358cc6f6": "acceptKyc(address)", +"358cfa25": "setTotalEtherPool(uint256,uint8,bool)", +"358d1e26": "HitToken(string,string,uint8,uint256,address,address)", +"358d5dc2": "getIsCashed(uint256,uint256)", +"358dff07": "minEthPerTransaction()", +"358f7f3a": "numberRange()", +"358fa6c6": "calcBuyout(uint256)", +"358fcee9": "fetchdivs(address)", +"358ffd79": "Controller(address,address,uint256)", +"3590699d": "_newSchellingRoundEvent(uint256,uint256)", +"359170e6": "setTransfersEnabled()", +"3591a1a9": "canDrip(address,address)", +"3591f5bd": "removeSomeDETsFrom(address,uint256)", +"3591fadc": "STAGE_2_FINISH()", +"3592336c": "getRetailerStatus(address,address)", +"3592c3b5": "uintToString(uint256,uint256)", +"3592dfea": "updatePackage(uint256,string,address)", +"3592f369": "disableTokenSwapLock()", +"35930e13": "setMinimalRewardedBalance(uint256)", +"359320de": "getCurrentVelocity()", +"35953108": "removeAddressesFromWhitelist(address[],string)", +"359531f4": "allowCnsContracts(bytes32,address,bytes32)", +"35956083": "Parabola()", +"35956c42": "ABCPresale(uint256,uint256,address,address)", +"35958196": "getGamesPool(uint256[])", +"359582ca": "downstream()", +"3595b570": "copyBalance(address)", +"35960028": "payMeFor(uint16)", +"359627e5": "canPay(address,uint256)", +"35967501": "setManualOverride(bool)", +"35972f46": "techAccount()", +"35975a37": "setStart()", +"3597727c": "EtherDLT()", +"359803cd": "pauseMinting(bool)", +"359819cc": "Group(address,bytes32,address[])", +"359829db": "numOfBackers()", +"3598ac34": "Cider()", +"35995022": "getPhaseCount(uint256)", +"359976a7": "getCheckSum(bytes20)", +"359ae0f3": "set_Shops(address[],address[])", +"359bc19e": "finalize(uint64)", +"359c1912": "setUintF1(uint256)", +"359c1f72": "getGravatar(address)", +"359c8a93": "claimD()", +"359cc28e": "changeIcoDeadLine(uint256)", +"359cf2b7": "requestTokens()", +"359d04a2": "voteRuling(uint256,bool)", +"359d393d": "votes_against()", +"359d9277": "XXXXXXXX01(address,uint256)", +"359db8c8": "partialDistributeDivident(uint256,address[],address)", +"359dbafe": "validatorWrotePart(uint256,address)", +"359ef75b": "init(address,address,address,address,address)", +"359f517e": "confirmWithdrawal()", +"359fe132": "getSharesByShareOwner(address)", +"359fe780": "increaseMintApproval(address,uint256)", +"35a063b4": "abort()", +"35a07291": "makeAssessment(uint256,uint256,uint256,uint256)", +"35a1529b": "dripAmount()", +"35a1bf6e": "test_insert_findWithHintNextRemovedUpdateTail(int256)", +"35a1d95d": "requestSnapshots(uint256)", +"35a21728": "multiERC20Transfer(address,address[],uint256[])", +"35a23659": "miningTimePerTrip()", +"35a26787": "AuthAddr(address,address,address)", +"35a374dc": "issueLottery(uint8)", +"35a3a96f": "marketingRecipient()", +"35a3cfa0": "transferMarketallocationTokens(address,uint256)", +"35a3e83c": "getCurrencyDecimals(uint256)", +"35a3fbb0": "_triggerStashedPayoutTransfer(uint256)", +"35a4015d": "numberOfBudgetPlan()", +"35a49063": "personalityTypes()", +"35a4fa30": "createPromoWhale(address,string,uint256)", +"35a53379": "_increaseWinPotChance()", +"35a568b9": "setLockPostion(address,uint256,uint256,uint256)", +"35a5c43a": "get_FTVTOKEN_EURCENT(uint256)", +"35a5e06d": "getRoots()", +"35a5e8bf": "SectorUpdated(uint16,address,string,string,string,bool)", +"35a66ef8": "arrayOfAccountsThatHaveClaimed()", +"35a6861a": "login(address)", +"35a6c1e0": "totalPausedSeconds()", +"35a6ed92": "calculateBonusAmount(address,uint256,bytes32)", +"35a8076b": "Accounts(address,address)", +"35a951b8": "endTime(bytes32)", +"35a9731b": "approveRefund()", +"35a9a5c7": "setWithdrawAccount(address)", +"35a9c82f": "setSecret(bytes32)", +"35a9d051": "ETH_address()", +"35aa6bec": "checkExpectedTokens(uint256[],uint256)", +"35aa6c31": "getMoney(address,uint256)", +"35acac4e": "abort(string)", +"35acbcab": "makeStudentID(bytes)", +"35ad84f9": "buyFromValue(uint8)", +"35ad9581": "saleRateSecondDay()", +"35adc0c5": "sellerCancel(bytes16,address,address,uint256,uint16)", +"35ae20bb": "AddEthBalance(address,uint256)", +"35ae41c9": "godAutomaticCollectFee()", +"35aec024": "findTwoPercent(uint256)", +"35aed70f": "getNumAnimalsXPlayerXType(address,uint8)", +"35af1986": "div27(uint256,uint256)", +"35af2c4f": "unsetIdentity(uint256,address,address)", +"35af5a9c": "MOTCToken(uint256,string,string)", +"35b05d1e": "purchaseRequest(uint256,uint256)", +"35b09a6e": "someFunction()", +"35b1097e": "communityTokensHolder()", +"35b1114a": "REQUEST_CANCELED_BY_BORROWER_STATUS()", +"35b11b72": "setColors(uint16,uint256[5],uint256)", +"35b21ceb": "totalChildTokens(uint256,address)", +"35b28153": "addAuthorization(address)", +"35b2b51b": "getAllInvestmentsWithdrawnByOwner()", +"35b3caf0": "cancelOrderWithPayerByAdmin(string,address)", +"35b3ee0e": "NGA()", +"35b46459": "distribute(uint256,address[],uint256[],uint256)", +"35b4a6d9": "updateBTCPrice()", +"35b4a93e": "HSDJCoin()", +"35b55d98": "SUBSCRIPTION_MODULE()", +"35b643d4": "getBalanceTimestamp(uint256)", +"35b6a6c6": "tokensForAdvisors()", +"35b6cc03": "RankingBallGoldCrowdsale(bytes32[5])", +"35b6df5d": "BurnableCrowdsaleToken(string,string,uint256,uint256)", +"35b6eaea": "isPayed(address)", +"35b75391": "test_validProposalExecution()", +"35b7588f": "allowedMinting()", +"35b8e820": "getCandidate(uint256)", +"35b94b5d": "MIOTToken(uint256,string,string)", +"35ba1d0a": "closeOnBehalfOf(address,address,bytes32,uint256)", +"35ba66de": "ACATokenSale(address,address,uint256,uint256,uint256)", +"35ba9af8": "availableForWithdrawal()", +"35bb0398": "didSign(address,bytes32,uint8,bytes32,bytes32,uint8)", +"35bb3e16": "grantAdmin(address)", +"35bb5fd2": "isToonInterface()", +"35bbe70e": "getAllVoters()", +"35bce6e4": "transferMulti(address[],uint256[])", +"35bd8b94": "Noblebit(uint256,uint256)", +"35bdac34": "withdrawToAddress(address,uint256)", +"35be7bf3": "getSecondRoundReleaseTime()", +"35bf82f6": "setChallengeFee(uint256)", +"35bf90ca": "getContributorByNumber(uint256)", +"35bfe158": "changeGoldIssueBurnFeeContract(address)", +"35c019e2": "LogFundTransfer(address,uint256)", +"35c05ab0": "hodlFor3y()", +"35c0cbaf": "upgradeDragonGenes(uint256,uint16[10])", +"35c1d349": "participants(uint256)", +"35c23200": "computeNextPrice(uint256)", +"35c2d49d": "minInvestETH()", +"35c40fe3": "testParamOutOfBoundsFail()", +"35c42d7f": "getPetByIndex(address,uint256)", +"35c4de7a": "OracleRequest(address)", +"35c5b475": "getExpectedReturn()", +"35c648c5": "POMDA()", +"35c6511b": "endMiniGame()", +"35c699c4": "getUnclaimedEtherIfAny(uint256)", +"35c72df0": "bryan()", +"35c7421b": "testMinReturn32WithReturn()", +"35c77e6f": "configurer()", +"35c80c8c": "isCustodian(address)", +"35c8518b": "setCloseBlock(uint256)", +"35c914c2": "finishPayaning()", +"35c969ea": "Presale(address,address,address,uint256,uint256,uint256,uint256)", +"35c990d4": "getGameCalculationProgress(uint256)", +"35ca8ce1": "setPriceToRegSale()", +"35caecc3": "getPeriod(uint256,uint256)", +"35caf648": "DonationMatched(address,uint256)", +"35cb1f07": "wethDeposit()", +"35cb27b5": "minedToken(uint16)", +"35cbdc25": "AcceptsProofofHumanity(address)", +"35cbe716": "getRemainingAirdropSurplusAddressesLength()", +"35cc2d80": "isInState()", +"35cc59a9": "createSchema(bytes)", +"35cd2358": "setAffiliation(address,uint256)", +"35cd4cc4": "getLastKicker()", +"35cd78b3": "saveMetaData(address,bytes32,bytes32,bytes32,bytes,uint32,uint256,uint256,bytes,uint256)", +"35cf60df": "enableFreezePriceRateRecalc(uint256)", +"35d0b444": "LogRedeemToken(address,uint256)", +"35d129f6": "untag(string)", +"35d13969": "SendAllMoney()", +"35d1f606": "destroyCard(uint256)", +"35d1f869": "setAtomOwner(uint256,address)", +"35d357ac": "logCeiling(int256,uint8)", +"35d37dbb": "mgmtFeePercentage()", +"35d4a49a": "setSubFreezingPrice(uint256)", +"35d65132": "canClaimPayout(address)", +"35d6d214": "getBids(uint256[])", +"35d6d611": "DAY_LENGTH()", +"35d79fad": "CertificationDb(address,uint256,address)", +"35d7a052": "freeze(uint256,uint256)", +"35d7d09a": "next_diary_id()", +"35d7f149": "takeBuyOrder(address[3],uint256[3],uint256,uint8,bytes32,bytes32)", +"35d82d16": "setGeneralInfo(bool)", +"35d91b85": "cancelOrder_(address[7],uint256[7],uint8,uint8,uint8,bytes,bytes,bytes,uint8,bytes32,bytes32)", +"35d94797": "verifyBetMask(uint256)", +"35d97405": "dividends()", +"35d99f35": "masterMinter()", +"35d9ba1f": "getTill()", +"35d9ceee": "uintMax()", +"35da3c1a": "createNewGalaxy(string,uint256)", +"35daa731": "ordersCount()", +"35db2829": "sendStableReward(address,address,uint256,uint256)", +"35db2b72": "Winchain()", +"35de5e89": "setPixelBlockPrices(uint256[],uint256[],uint256[])", +"35de74b8": "PBC()", +"35decc5f": "updateTargetToken(address,uint256)", +"35dfcc92": "totalCastle()", +"35dffde5": "updateReleaseAmount(uint256)", +"35e04fab": "prePayment()", +"35e09095": "decTotalSupply(uint256)", +"35e0f450": "stageMaxBonusPercentage()", +"35e24a6b": "preICOstate()", +"35e49e5f": "sellBlocks(uint8,uint8,uint8,uint8,uint256)", +"35e4d30f": "nonzeroAddressesElementForApi(uint256,uint256)", +"35e5f617": "transfer_erc20(address,address,address,uint256)", +"35e608be": "addUpgrade(address,address,bytes)", +"35e60bd4": "setTransferLocked(bool)", +"35e64aaa": "transferLand(int256,int256,address)", +"35e6a7af": "addab()", +"35e6e5b6": "removedSalesAgent()", +"35e82f3a": "removeAddressFromBlacklist(address)", +"35e83446": "testInitialBalanceWithNewMySale()", +"35e9d83b": "transferToAddress(address,uint256,bytes)", +"35ea6821": "masternodeTransferOwnership(address)", +"35ea94ad": "TokenSold(address,uint256,uint256)", +"35eb5208": "registerAgent()", +"35eb702f": "getPlayerWinning(address,uint256)", +"35eb8479": "showBidder()", +"35ebbfd1": "weekTwoStart()", +"35ec6dab": "earlyWallet()", +"35ed3fd6": "BONUS_PERCENTAGE()", +"35ed548f": "getPositionRequiredDeposit(bytes32)", +"35ed64c3": "CZToken(string,string,uint8,uint256)", +"35ed663d": "ENJToken(address,address,address,address)", +"35ee2783": "Alarm()", +"35ee2f8a": "initCanOffsetTime()", +"35ee72c7": "ISSToken()", +"35eead41": "addNote(bytes32,string,string)", +"35eec76a": "privatePreSaleSoldTokens()", +"35f067cf": "updateTokenURIPrefix(string)", +"35f097f3": "isOnBattle(uint64)", +"35f0d665": "reloadStoreByName(uint256)", +"35f10cc3": "sendWinnings(address[],uint256[])", +"35f1bd11": "EcoCrypto()", +"35f21f0a": "GladiethersOraclize()", +"35f2507f": "recoverUser(address)", +"35f27b20": "collectAirDropTokenBack()", +"35f2fbaf": "_bid(address,uint256,uint256)", +"35f3cf85": "setSaleManagerAddress(address)", +"35f4581b": "pwn(uint256)", +"35f46994": "die()", +"35f4de27": "HumaniqICO(address)", +"35f64a30": "albosWallet()", +"35f6806b": "addNewAccount(string,address,uint256,uint256,uint256)", +"35f68424": "getTokensByBTC(uint256)", +"35f6c161": "createWallet(uint8)", +"35f79b83": "LordCoin()", +"35f7ff63": "stringStorage(bytes32)", +"35f80a1b": "UbiatarPlayVault(address,address,uint256)", +"35f82876": "fillOrderNoThrow(uint256,bytes)", +"35f84393": "contructor(string,string)", +"35f88860": "listScam(uint256,string,uint256)", +"35f8a2c6": "RefundableCrowdsale(uint32,uint32,uint256,address,uint256)", +"35f931cb": "AmberToken(uint256)", +"35f96a7d": "goldBought(uint256,address,bytes32,string,string,string,string,string)", +"35fa3128": "BTTSToken(address,string,string,uint8,uint256,bool,bool)", +"35fa3843": "setend()", +"35faa416": "sweep()", +"35facf78": "createProposal(string,uint256)", +"35fb2125": "onlyBouncerTransferOwnership(address)", +"35fb337c": "finalCap()", +"35fb8e36": "triggerTestEvent()", +"35fc3e90": "claimRefundEther(address)", +"35fc7506": "StatsSold()", +"35fd8877": "isCashBack(address)", +"35fe3660": "MID_GRADE_CATEGORY()", +"35ff058a": "pushArray(bytes32,uint256)", +"35ff217d": "CrowdfundFinalized(uint256)", +"35ff3a51": "getRaisedEther()", +"35ffa20d": "handleWithdraw(address,bytes32,address,address,uint256,uint256,bytes32,bytes32)", +"35ffbe74": "verifyClaim(bytes,uint256,uint256,uint256[],uint256[],uint256[],uint256[])", +"35ffd687": "getStageLimit(uint8)", +"360035c6": "RepoToken()", +"360038b5": "CheckOver()", +"3600af8b": "updateProfileImgurl(string)", +"3600e1e2": "controlLimits(address)", +"36013189": "randomness()", +"360184e9": "Fouracoin()", +"3601dd87": "TNTToken(uint256,string,uint8,string)", +"36025bf8": "licenseTermsHasMaxCost(bytes32,bytes32)", +"3602627d": "BdpImageStorage(bytes8)", +"3603b0b0": "MULTISIG_WALLET_ADDRESS()", +"36044ecc": "changeTokenReward(address)", +"36046916": "generatePresciptionCode(int256)", +"3604caa1": "lockAddress(address[])", +"36054f51": "affiliatThreshold4()", +"360583c6": "getUsersGunsIds()", +"36066f71": "Token(address,string,uint8,string,address,address)", +"36067543": "FirstEtherLimit()", +"3606c983": "createClaimMsg(bytes32,string,string,address)", +"36080694": "deleteRate(bytes4)", +"360821e8": "setMinimumBitcoinToInvest(uint256)", +"3608672c": "liveBetexICO()", +"3608c9eb": "MULT_FACTOR()", +"360998e6": "Cryptex(address,address,address,uint256,uint256,uint256)", +"3609ac8f": "START_PRICE()", +"3609bf09": "updateBusiness(uint256,uint256)", +"360aa28b": "isVersionContract()", +"360aac67": "accountGameResult(address,uint256)", +"360b3b31": "setAirdropEnabled(bool)", +"360b8115": "VipMigration(address,uint256)", +"360c97dd": "frozenAnnually()", +"360c9ed0": "deprecateBodySubtype(uint8)", +"360cdf5e": "AsOyToken()", +"360e5f54": "TokenGift(address,uint256)", +"360ec1b8": "processPurchase(bytes32,int256[],int256[])", +"360ed9c2": "receiversCount()", +"360f1d07": "bonusRatePrivateSale()", +"360f6b21": "chargingSwitches(address)", +"360ff695": "timeTier3()", +"3610724e": "buyTokens(uint256)", +"361228ea": "weiForToken()", +"36127d7e": "updateEMA(uint256)", +"36134a4b": "shouldBeStarted()", +"3613b781": "revokeVesting(address,address)", +"36144c9a": "getUserReferrer(address)", +"3614ac6f": "test4_searchSameNode()", +"36157f5a": "totalDivSupply()", +"361698ff": "adminSetWorldSnapshot(uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"36169d90": "sweep(address,uint256,uint8[],bytes32[],bytes32[])", +"36170ae5": "startingDateFunding()", +"36173764": "frozen(address,uint256)", +"3617653e": "powerContract()", +"3617d5c6": "viewIndexNumber()", +"36181026": "tryToFinalize()", +"361819e8": "RANGEEND_4()", +"36186868": "icoWeek2Bonus()", +"361893f7": "getBrand(address)", +"3618b290": "hodlFor2y()", +"3618c2a2": "removeAddressesSet(address)", +"36199817": "setFinalTimestampOfBonusPeriod(uint256)", +"3619cd99": "myHalfDividends()", +"361a4eb8": "Party()", +"361a5468": "testFailMoveWhenStopped()", +"361ae621": "LifMarketValidationMechanism(address,uint256,uint256,uint8,address)", +"361b5eaa": "token(bytes12)", +"361b94be": "contributorMinCap(address)", +"361bb340": "left48(uint256)", +"361bfc5b": "ETH_per_BRA()", +"361c14b0": "teamUnlock4()", +"361cac82": "marketStores()", +"361cc3ab": "getUserTotalPromoBonus(address,address)", +"361d004f": "changeBank(address)", +"361d292e": "getCarAuctionID(uint32)", +"361d4e53": "usedTokenBalance(address)", +"361d55be": "callback_ForUnderwriting(uint256,string,bytes)", +"361f10e5": "setSiteAccountAddress(address,address)", +"361fab25": "setSupplyLimit(uint256)", +"361fd603": "First_pay_clientmanager()", +"3620f56d": "addQuest(address)", +"3622b5ef": "PIGGY_BANK(address)", +"36234138": "registerPair(address,address)", +"362344b8": "MAX_YAYS()", +"3623c225": "bid(uint16,uint256)", +"3623f548": "getAllWinner()", +"36249140": "third_withdrawal(uint256)", +"36261907": "setting(address,address)", +"36262665": "getOwnershipTokenCount(address,address)", +"362698a2": "Unlocked(string,bytes32,address)", +"3626aae7": "getMedalType(uint256)", +"36274669": "Poll()", +"3627d195": "FuckToken()", +"3627d3a1": "mintPrivate(address,uint256)", +"36281b38": "uppercaseOf(string)", +"36285df7": "bonusWindow1EndTime()", +"3628731c": "addAddresses(address[])", +"3628ca60": "getEpisodeList()", +"3628e6f3": "BMTToken()", +"3629c8de": "activation()", +"362a0c27": "_withdrawWonCosFromGame(uint256,uint256,uint256)", +"362a198d": "nextBurnFeeAbs(uint256)", +"362a36b4": "bidFeePercents()", +"362af076": "createRequest(address[3],address,uint256[11],uint256,bytes)", +"362bd679": "updateFreeStorage(address,uint256)", +"362c160e": "changeWithdrawalDate(address,uint256)", +"362c78b9": "invitedReward()", +"362cb8ff": "icoSucceeded()", +"362cba6f": "PlotSale(uint256,uint256,address,address,uint256,bool)", +"362e1c76": "updateparentdynamicprofis(address)", +"362e2565": "returnDeposits()", +"362e4945": "lengthAddresses()", +"362e669a": "BarrosTest()", +"362ec5e2": "createProductionUnit5()", +"362f04c0": "participantCount()", +"362f5fb2": "getDogInfo(uint256)", +"362f74e7": "updateBatchSupport(bool)", +"362f8833": "stakeRoto(address,bytes32,uint256)", +"362fe943": "MainBridge(address,uint256,address[])", +"36304e91": "allFactories()", +"3631826a": "multiline(uint256,uint256)", +"3631ecd9": "privateStart()", +"36321001": "will()", +"363210c9": "_delegatecall(bytes32,uint256)", +"363221fe": "advisorTokens()", +"3632803f": "calculateGrapeSell(uint256)", +"3632b4d9": "withdrawCoin(bytes32,uint256)", +"36330b0c": "updateInitialZero(uint256)", +"363349be": "fillOrdersUpTo(address[5][],uint256[6][],uint256,bool,uint8[],bytes32[],bytes32[])", +"36335e19": "contributePublic()", +"3633b1ad": "createRealmSale(uint256,uint256,uint256)", +"3633c522": "GiftPoolContribution(address,uint256)", +"36344022": "testAuthorizedTransfer()", +"363487bc": "currentInterval()", +"3634a1b7": "createSeries(bytes32,string,bytes32,uint256)", +"3634b376": "GATcoin(uint256,string,string,uint8)", +"3634dcd8": "sub0(uint256,uint256)", +"36351c7c": "recharge(address,uint256)", +"36354b2f": "updateEtherAndtokenAmount(address,uint256,uint256)", +"3635e329": "getCurrentPeriodByEntity(uint256)", +"363626ad": "addressesToTotalWeiPlaced(address)", +"36371722": "chunk4IsAdded()", +"36382941": "changeTokenOwnerWalletAddress(address)", +"3638ae05": "transferETHtoProviders(address,address,uint256,address,uint256)", +"3638fb00": "transferOwnership(address,bytes32[3],bytes32[3],uint8[3])", +"3639dda5": "monthly_token_growth()", +"3639e955": "addToBothSendAndReceiveAllowed(address)", +"363a0903": "Creatable()", +"363a4708": "setMintFeeReceiver(address,address)", +"363ad06f": "getFrozenAmData(address,uint256)", +"363bc3a2": "alreadyAutoAirdropAmount()", +"363bf964": "setAddresses(address,address,address)", +"363c3747": "TestBalance(address)", +"363c51dc": "set_savings_goal(uint256)", +"363c6b81": "MAX_PENDING_REQUESTS()", +"363c76f3": "HLChain()", +"363c9bca": "runTimeAfterSoftCapReached()", +"363db35d": "IcoTotalSupply()", +"363dc725": "_unpackProtectionParams(uint256)", +"363dd19e": "summon()", +"363df59a": "UNGTToken(uint256,string,string)", +"363ef9dc": "APB()", +"363f7746": "validSignature(uint8,bytes32,bytes32)", +"363fa6b2": "renameChibi(uint256,string)", +"36400cd2": "ALM()", +"3640599c": "getPI_edit_6()", +"364083f4": "makeSale(uint256)", +"3640ca5b": "SupermarketKontrak()", +"3640e413": "YunPengToken(uint256,string,uint8,string)", +"3640f613": "cancelMatch(uint8)", +"3640f910": "LogEndSale(bool,uint256,uint256)", +"36422e49": "_createEtherDogWithTime(uint256,uint256,uint256,uint256,address,uint256,uint256)", +"3643d14b": "withdraw_to(address,uint256,uint256,uint256)", +"3645ebfb": "indFundDeposit()", +"36470665": "battleboardDataContract()", +"36471908": "ownerPerThousandShareForMating()", +"36475668": "getCommunityData(string)", +"3647b084": "setAmountBonuses(uint256[],uint256[])", +"3647b87a": "buildFactory()", +"364832cd": "isStrongHand()", +"36484ea0": "PHASE2_START_TIME()", +"36489775": "USDZAR(uint256)", +"364aa98d": "createDate(uint256,uint256,uint256,uint256)", +"364c7815": "addCredit(uint256,address)", +"364cc73e": "isEatingAndDrinking(address)", +"364d0b53": "getAddress(bytes32,uint8,bytes32,bytes32)", +"364d279a": "phase2Duration()", +"364d2a06": "queryCreatureOwner()", +"364ddb0e": "left52(uint256)", +"364ddc2d": "getmemberposition(uint256,address)", +"364deeef": "Sceatt()", +"364e022f": "buyProduct(string)", +"364e0af3": "_createEdition(string,uint256,uint256)", +"364e1c59": "publicsalesendTime()", +"364e69b7": "canBet(uint256)", +"364e74eb": "releaseTokenTime()", +"364ea9e7": "set(uint256,uint256,bool[],uint256[])", +"364ee75d": "getRoundEnd()", +"364f4896": "emission(address,address,uint256,uint16,uint16)", +"364f6695": "earlybird_coins()", +"365044a8": "priceDivider()", +"36516a8a": "publisherAddress()", +"3651b401": "commissionGetter()", +"3651b5df": "setTargetWallet(address,address)", +"36525c4e": "resetStorage()", +"36527357": "getUint(int256,address,string)", +"3653cf9f": "getOldESOP()", +"36540b3b": "amountFundPlatform()", +"36548b58": "arrayIndexOutOfBounds(uint256)", +"36555b85": "add(string,uint256)", +"36566f06": "togglePaused()", +"3656de21": "getProposalById(uint256)", +"3656eec2": "balanceOf(uint256,address)", +"36579ff6": "Burnable()", +"3657ba36": "getSharedAccountPw(bytes32,bytes32,bytes32)", +"36585cd3": "getBatchStartTimesLength()", +"3658964c": "totalBal(address)", +"3659078c": "DailyDivs()", +"3659467b": "registerName(uint256,bytes32)", +"3659887c": "isAlreadyUser(address,address)", +"3659a8b2": "bonusEnds1()", +"3659cfe6": "upgradeTo(address)", +"3659d90f": "month12Allocated()", +"365a5306": "loan(uint256)", +"365a86fc": "hub()", +"365af466": "failedWhitelist(address)", +"365b1b15": "upgradeKiOS()", +"365b29e8": "WEBPOUND()", +"365b5055": "isAccountFreezed(address,address)", +"365b94ad": "saleFinished()", +"365b98b2": "users(uint256)", +"365c2e95": "hasEnough(address,uint256)", +"365c81fb": "pubsaleRate()", +"365ccbef": "didTakeOrder(bytes32,address,uint256)", +"365ce233": "removeAccountReader(address,address)", +"365db060": "acquireExternalGauntlet(uint256,address)", +"365e304d": "DATE_31_DEC_2021()", +"365e808d": "transferFromHyperstakingdisbursementfund(address,uint256)", +"365ede48": "setReport(string,uint256,string)", +"365f6e9f": "getCellsSinceLastEvent(address)", +"365fe9fd": "isDistributionTransferred()", +"36600999": "fundRepository()", +"366077ee": "addToPot(uint256)", +"3660943d": "checkState(bytes)", +"3660a084": "transferSigner(address)", +"3660bef0": "setDemandCurve(uint256,uint256)", +"3660fcd0": "setGuestName(string)", +"36610cb9": "storeOptions(address,uint256)", +"36645e01": "Election(uint256,uint256,uint256,address)", +"3664a0ea": "getLastCallKey()", +"3664b12d": "erc223Activated()", +"36651d2a": "setDestoryAddress(address)", +"3665708e": "nextMinPlay()", +"3666750e": "fillHeldData(address[],uint256[])", +"3667551c": "Partial8Send()", +"36682d5d": "Transtoken()", +"366859c4": "job(address,address[],uint256)", +"3669acad": "_newChallenge(uint64,uint64,address,uint256)", +"366a4120": "release(uint256,uint256)", +"366a68dc": "setBlockLock(uint256)", +"366ac8e0": "LGCCoin()", +"366b6e9e": "secureUnapprove(bytes32)", +"366ba691": "CBX()", +"366bb03c": "totaTeamRemaining()", +"366bc343": "AssignFeeToWallet(address,address,uint256)", +"366bc401": "collectedUSDWEI()", +"366d2b4e": "CancelledBySeller(bytes32)", +"366df51d": "initializeMintableTokenFundraiser(string,string,uint8)", +"366dff9c": "walletAllowances(address,address,address[])", +"366e81d6": "TokenSold(uint256,uint256,uint256,address,address)", +"366e881a": "commitScores(uint256[],uint256[])", +"366f2d86": "paymentDue(address)", +"366f77b7": "checkChoice(uint8)", +"3670e072": "gettoday()", +"3672404e": "getServiceCount()", +"367265fb": "transferTokensManual(address,uint256)", +"36730467": "split(uint256,uint8,uint256,address[],address,uint256[])", +"36733fa0": "addRange(address,uint256)", +"36738b41": "Crowdsale(address,address,address,uint256,uint256,uint256,uint256,address,uint256)", +"36746413": "PrivateInvestment()", +"367488ce": "roulette(uint256)", +"36751a6b": "uploadCode(string,bytes)", +"36756935": "FinalConfirmation(address,bytes32)", +"36756a23": "constructor(address[],uint256)", +"3676049b": "setFundFeeAddress(address)", +"367605ca": "setApprovalForAll(address,address,bool)", +"36760fd2": "HULKtoken()", +"36767205": "increaseTokenLock(address,uint256)", +"3676b342": "createAddOn(string,uint256)", +"3677b5f2": "LATokenMinter(address,address)", +"3677c333": "authorizeBurnRequester(address)", +"3678933c": "isEpochDataSet()", +"3678f179": "crosairShipMinted()", +"367a0f97": "getReputationProblems(address,string)", +"367ad6ea": "redeemPack(uint256)", +"367afa7a": "_nextPrice(uint256)", +"367ba52c": "submitOrder(uint8,uint8,uint64,uint64,uint16,uint16,uint16,uint16,uint16,uint16,uint256)", +"367bbd78": "strlen(string)", +"367bc8d3": "TransmutedTransfer(address,address,uint256,address,string,string)", +"367bf2f9": "currentBlockHeight()", +"367c574f": "DIP_Pool()", +"367cad89": "alternative_Exchanges_links()", +"367ebb99": "deathData_a12()", +"367edd32": "enableContract()", +"367f0708": "ico1Raise()", +"367f20f6": "_unpackBaseDamageValue(uint256)", +"367f34de": "performALU()", +"36805961": "setStr(string,string)", +"368186ef": "DigiberyToken()", +"3682905e": "RICOStandardPoD()", +"36829419": "AddrInvestor()", +"3683b44a": "checkPrizeAlreadyReceived(address,uint256,uint256)", +"3683ec67": "CavsvsPacers425()", +"3683ef8e": "preSign(bytes32,address,bytes)", +"36840423": "AddAdrJullarTeam(address,address)", +"36842110": "wasCrowdsaleStoped()", +"36851957": "CustodianInterface(address)", +"36865384": "BuyShare(uint32,uint32,address,address)", +"368691fc": "comprarTicket(uint256,uint256)", +"3686ca3e": "beneficiaryWithdrawal()", +"3686d52a": "ppsBase()", +"3686edc7": "_getBmcDaysAmountForUser(bytes32,uint256,uint256)", +"368701b9": "firsttestnetico()", +"3687e257": "TenantTerminate(string)", +"3687e921": "readInfo(address,uint256)", +"3687f24a": "setFee(uint128)", +"36880b82": "recordOwnerOf(bytes32)", +"368818aa": "FrozenMediaTokenFunds(address,address,bool)", +"3688632e": "setAvgSalesCount(uint256)", +"3688c272": "getTokenPriceListByIds(uint256[])", +"3688fa2c": "issue(address,uint64)", +"3689a651": "paymentFrom(uint256,bytes,address,address)", +"368a5773": "SpermLab()", +"368a5e34": "AIRDROPPER()", +"368aa9ca": "p_update_priceUpdateAmount(uint256)", +"368af7f3": "availablePonzi()", +"368b069d": "deployEscrowClone(address)", +"368b2842": "safeBatchTransfer(address,uint256[],uint256[],bytes)", +"368b3c81": "PTTYC(uint256,string,string)", +"368b8772": "setMessage(string)", +"368bf74e": "TEAM_LIMIT()", +"368d09d8": "requestOracleValue()", +"368d6b25": "setRushTimeChallengeRewardsPercent(uint256)", +"368daf8f": "goldMigrationsCount()", +"368dde4b": "currentCost()", +"368e5d4e": "BTC_SUISSE_TIER_4()", +"368e85ff": "IICO(uint256,uint256,uint256,uint256,uint256,address)", +"368f3492": "AnemoiSaleContract()", +"368f76a9": "bossCutPercentage()", +"36909ddd": "isATMHolder(address)", +"3690fd03": "CPLPrivate()", +"3691125a": "LianPaiToken()", +"36917dfa": "getPony(uint256)", +"3691dd11": "userApprove(address,uint256,uint256)", +"3692d61a": "log(string,bytes32)", +"3693396a": "getLastSignedTime()", +"36937781": "initialize_proposal()", +"369388cc": "EMISSION_FOR_BOUNTY()", +"3693db0a": "FOUNDER_ONE()", +"36944e49": "secondRefundRoundRateNumerator()", +"36945328": "setAddrContractCaller(address)", +"3694566e": "getRate(uint256,bytes32)", +"3694569e": "IHateEos(string)", +"3694629a": "getQuestionFinalizable(uint256)", +"3695507b": "IRC_PER_ETH_PRE_SALE()", +"3695672b": "newBurnableOpenPayment(address,uint256,bool,uint256,string)", +"36958413": "weaponEntities(uint256)", +"36965e3a": "SetAElfDevMultisig(address,address)", +"3697d0a7": "renderLandingHash()", +"3697efb2": "MinerEdgeCommunity()", +"3697f055": "withdrawFunding(uint256)", +"36988bc4": "currentLoanPerson()", +"3698de0a": "soliditySha3(bytes32)", +"369ac28f": "deltaTime()", +"369b1ce5": "initialBuy(address[])", +"369badf1": "getCreditsAtIndex(uint256)", +"369bcd64": "_checkPixelUnder(uint256)", +"369cbbb4": "checkMonthlyLimit(address)", +"369cd460": "totalPilfered()", +"369d32f1": "Items()", +"369d8138": "createAsset(string,string,string,uint256)", +"369de07d": "PDTX()", +"369e2422": "updateTokenPricePerUSD(uint256)", +"369e8c1d": "commit(address)", +"369f927f": "initBlockEpoch()", +"369fe962": "getDisputeMemorySize(uint256)", +"36a013c8": "LogInvestment(address,address,uint256)", +"36a09eae": "SetPriceMultiple(uint256)", +"36a0f511": "getPeriodMinting(uint256)", +"36a128c2": "MyJioCoin()", +"36a1bbfd": "baseTargetReached()", +"36a1c184": "IsArt()", +"36a1fb5f": "changeUserStatus(address,bool)", +"36a23dbf": "freezing(bool)", +"36a26b99": "END_TIME_PRESALE()", +"36a26fd9": "TokenDeactivated()", +"36a2f0f1": "changeLocked()", +"36a31de5": "getRequestOwner(uint256,uint256)", +"36a33f99": "isLimitMint()", +"36a3668a": "teamTokensPerPeriod()", +"36a36f7c": "betexStorage()", +"36a39882": "_proceedStage()", +"36a42675": "combineInterest(uint8,uint8)", +"36a4f2ba": "createBtcAddress(uint256,int256,uint256,int256)", +"36a60891": "setTrainingFeeMultiplier(uint256)", +"36a6412b": "buyMicroKeysWithHandle(string,bytes32)", +"36a6ad58": "mintPartnershipTokens()", +"36a716da": "createOrderHash(address,address[3],uint256[5],int256)", +"36a7cf1f": "setBallotFactory(address)", +"36a9f2f7": "xactionFeeNumerator()", +"36aa972e": "FullPayChain()", +"36ab0f15": "getNewAllowancesEffectuation()", +"36ab753e": "startRefunding()", +"36abffd4": "_receiveFunds()", +"36ac732e": "updateSecondChangeBlock(uint256)", +"36ad6e46": "SendTokensToFounders(uint256,uint256,uint256)", +"36add1df": "interestDistribution()", +"36ae22f0": "emitFeePeriodRollover(uint256)", +"36ae31ec": "getCatOwners()", +"36ae5040": "isMinted()", +"36aec5a3": "amountContributed(address)", +"36af1954": "withdrawnReadable()", +"36af50fd": "setSale(address)", +"36af8151": "setSpareRecommAddr(address)", +"36b024ab": "setTransferableDate(uint64)", +"36b09474": "winningNumbersPicked()", +"36b1315c": "min64(uint64,uint64)", +"36b19cd7": "adminWallet()", +"36b1f6a3": "getDApp(uint256)", +"36b222b3": "fillOptionOrder(address[3],uint256[3],uint256[2],bool,uint8,bytes32[2])", +"36b2e0f9": "acceptBidForCollectible(uint256,uint256,uint256)", +"36b2fe94": "setPurchaseAdmin(address)", +"36b324ff": "unMap(address)", +"36b33415": "modifyMemberInfo(string,string,string,string)", +"36b3da05": "chargeBalance()", +"36b40bb6": "leftOnLastMint()", +"36b61e3c": "otc()", +"36b641c2": "MakeMyToken(string,string,uint256)", +"36b69367": "parentFees(address)", +"36b77107": "lastDeposit()", +"36b81feb": "Deed(address)", +"36b97fd5": "TestToken5(address,address,address,address,address,address,address,address)", +"36b9856d": "newOraclizeSetProof(string)", +"36bacc7c": "getTentativeWinningPayoutDistributionHash()", +"36bb9ffa": "MANHATTANPROXYPARKAVE()", +"36bc32a2": "expectedPayout(address)", +"36bcb4c9": "changeAge(uint8)", +"36bcb4cd": "ViteToken()", +"36bdee74": "totalETH()", +"36be2a73": "setLedger(uint8,int256)", +"36bee178": "add_to_withdraw_bounty()", +"36bf094b": "BonusPeriodsCount()", +"36bf2e15": "ERC20ImplUpgradeable(address)", +"36bf392b": "distributeInvestorsFee(uint256,uint256)", +"36bffe1e": "nextCommonTTMTokenId7()", +"36c0aada": "setValueAll(uint256)", +"36c0c834": "buySignature(bytes16)", +"36c1a50f": "notZeroNotSender(address)", +"36c28466": "Panel()", +"36c2a922": "KryptopyToken()", +"36c2d72d": "getTotalSlaves(address)", +"36c35f94": "finalize1()", +"36c4a520": "Volks()", +"36c4ad0c": "getEthFromKeys(uint256,uint256)", +"36c4db09": "setCOO(address,bytes)", +"36c4ff7a": "payoutAddr()", +"36c5787e": "setTokensWave(uint256,uint256[10])", +"36c5bf8c": "_ownerReleaseLimit()", +"36c5d724": "removeToken(uint256)", +"36c5ff5d": "addToTransactionDisallowedList(address)", +"36c61b60": "_buyToken(uint256,uint256,uint256)", +"36c63b8d": "AbstractVirtualToken()", +"36c6a410": "BatanCoin()", +"36c7d4bd": "processReinvest(uint256,uint256,uint256)", +"36c802a0": "priceStage2()", +"36c84de5": "getPlayerDataByAddress(address)", +"36c8af5d": "_getId()", +"36c8c0e9": "addBonusBatch(uint256[],address[])", +"36c8c5ee": "voteForCandidate(uint256)", +"36c8e831": "PhillionToken()", +"36c92c3f": "setRoundDuration(uint256)", +"36c9c62d": "transfer_opt(address,address,uint256)", +"36ca97d6": "tokenFeePercent()", +"36cb4c48": "log256(uint256)", +"36cb8098": "BouCrowdsale(uint256,address,address)", +"36cb8740": "test_3_accessRestriction_vote_shouldThrow()", +"36cbee23": "bountyFunds()", +"36cc17a7": "clientClaim(uint256,uint64)", +"36cc18b5": "setPriceIdv(bytes32,address)", +"36cc1ebb": "setCCH_edit_13(string)", +"36cc6a10": "modifyTokenFee()", +"36cd24aa": "prepareVote(bytes32,uint256)", +"36ce94bf": "bytesToAddress1(bytes)", +"36cf7c87": "dead()", +"36cfe3eb": "starbaseEarlyPurchase()", +"36d0288c": "CL()", +"36d02c94": "changeSettings(uint256,uint256)", +"36d03356": "setAdvisorsTeamAddress(address)", +"36d10e45": "LemonsRemainingToDrop()", +"36d1535d": "getEbola()", +"36d15f2a": "_validateSettleSignatures(bytes32,bytes,bytes,bytes,bytes)", +"36d18b67": "RED()", +"36d1f54b": "UnitedfansTokenCrowdsale(address)", +"36d213ec": "TRToken(uint256)", +"36d22de7": "pokerbox(uint256,uint256)", +"36d26647": "getReportHash(uint256)", +"36d300b3": "addAction(uint256,uint256,uint256)", +"36d373c0": "writeDefinitions(uint8,string)", +"36d38bd4": "scs()", +"36d43c24": "withdrawId()", +"36d505cf": "_breedWith(uint256,uint256,uint256)", +"36d61112": "getVendingStepQty(uint256)", +"36d647cf": "bonusLine()", +"36d81f07": "getUser1()", +"36d90c2d": "Dillionworldcoin()", +"36d9377e": "GetAllNode()", +"36d938d8": "Transaction(uint256,uint256,address,uint256,uint8,uint256,uint256,bytes)", +"36d95f56": "MIN_FUNDING_GOAL()", +"36da1471": "crowdSaleCheck()", +"36da4468": "supplier()", +"36da5cd8": "atomToken()", +"36da9ec9": "roundTwoRate()", +"36dac2cc": "getMeta(uint256)", +"36dc1dd2": "createBSMHash(string)", +"36dc58f6": "total_SDCC_supply()", +"36dd20a7": "getJobWorker(uint256)", +"36dd58f2": "dispatch(address,uint256,string)", +"36de44e0": "GFC(uint256,string,string,uint8,address)", +"36df05bc": "wholesaleLeft()", +"36df99b6": "blackswanToken()", +"36dfe260": "payOneTimeReward()", +"36e0004a": "multiSig()", +"36e05d94": "fundariaShare()", +"36e0e824": "asset(uint256,bytes)", +"36e0f6cc": "allowSell()", +"36e4e8fd": "tulipToOwner(uint256)", +"36e4f915": "claimToken(bytes32,string,address)", +"36e520bc": "verifyAddresses(address[])", +"36e61cf7": "decTap(uint256)", +"36e685f5": "setCLevelAddresses(address,address,address,address)", +"36e6b92e": "taskProcessedWithCosting(uint256,uint256)", +"36e73918": "getRegionNextImageId(uint256)", +"36e9f43f": "SMRDistributionVault()", +"36ea1938": "executeTrade(address,address,uint256,uint256,address)", +"36ea76e2": "Hyperion()", +"36ea8189": "DetailsUpdated(bytes32,bytes32,uint256)", +"36ea8702": "makeMetaPublic(uint256,bool)", +"36eb3aa9": "LGBT()", +"36eb5b47": "getResoSCParams()", +"36ebc4dc": "__allocateTokens(address)", +"36eda23f": "setRST(address)", +"36edbe17": "createPlayer(address,uint256)", +"36ee1f2b": "SDTToken()", +"36ee46f5": "killAnimal(uint8,uint16)", +"36ee7773": "getBallotsStorage()", +"36ee83f9": "getOrderPriceTotal(uint256)", +"36ee8812": "updateReleasedBalance()", +"36eec28e": "allocated4Year()", +"36eed01f": "getScoreWithCustomerAddr(address)", +"36ef0cea": "createStartingColors()", +"36ef1abb": "disburseDividends()", +"36ef6c82": "addEmbassyOfCountry(address,uint256)", +"36ef80db": "getId(address,address)", +"36f00e8a": "setFeeFlat(uint256)", +"36f19b77": "getPurchasedBlockhash(uint256)", +"36f2393e": "changeTokenURIPrefix(string)", +"36f26095": "minimalCap()", +"36f2b803": "Oceans8RT()", +"36f3dc2d": "STAGE_FOUR_ETHRaised()", +"36f54767": "VitaminToken(uint256,string,string)", +"36f656d8": "assertEq(string,string,string)", +"36f66528": "EtherDelta(address,uint256,uint256)", +"36f78d77": "newGroup(address[],uint256,uint256)", +"36f7992b": "putOnSale(uint256,uint256)", +"36f7ab5e": "contactInformation()", +"36f7cd70": "setPricePerStake(uint256)", +"36f8edc2": "getPlayerShipBattleLossesById(uint64)", +"36f93a99": "cofoundersSupplyVestingStartDate()", +"36f9825f": "accountIndex(uint256)", +"36f9f49c": "etherandomSeed()", +"36faa509": "ssps(uint64)", +"36fbedd3": "existsAuditorFromMultiRequestAssignment(uint256,address)", +"36fc75ee": "setRegsitrarAddress(address)", +"36ff37f4": "UpdateEvent()", +"36ffa905": "getMyProposals()", +"370014f2": "sendFundHome()", +"370097ac": "donotUSBDappToken()", +"370099d4": "airSwap()", +"370158ea": "info()", +"37016a5f": "getAuctionStartedAt(uint256)", +"3701fada": "PFC()", +"370292eb": "clearApproval(address[16],address,uint256)", +"3702ab03": "buyBasicCards(uint256,uint256)", +"37033be6": "processReservationFundContribution(address,uint256,uint256)", +"37034853": "ownerHistoryCount()", +"3703d911": "createItem(string,uint256,uint256,address,uint32,string,uint32)", +"370419e5": "arm()", +"37048f8f": "_newValidatorSetCallable()", +"37049b06": "getTier(uint32,uint256)", +"3705f69e": "canRelease()", +"37072ec7": "getHealthCitizens(uint256)", +"37074dae": "receivedEther(address)", +"37077409": "_updatePurchasingState(address)", +"3707a967": "putForExchange(uint256)", +"3707cfc1": "update(uint256,uint256,address)", +"3707ed7e": "gettops(address)", +"37086c8e": "airdropWithLockup(address,address,uint256,bytes)", +"3708c99e": "openWhitelistEndTime()", +"370943e3": "ZionToken()", +"370b6939": "AdminSetDrawer(address)", +"370b8c90": "info(bytes)", +"370c6001": "abortTransaction()", +"370d4c6e": "setGameOn(bool)", +"370d62ad": "anyRateIsStale(bytes4[])", +"370e052b": "addPreSaleTokensMulti(address[],uint256[])", +"370e9161": "rollDice(uint256,uint256)", +"370ec1c5": "_fillOrder(address,uint256)", +"370f2827": "finishJackpot(uint256,uint256)", +"370f388e": "MegaCandy(address)", +"370fb47b": "triggerTime()", +"370fc812": "set_stopsell(bool)", +"370fed6e": "setProfile(string,string,string,uint32)", +"37110967": "eTokensToSend(address,uint256)", +"371115d1": "LamboToken(uint256,string,uint8,string)", +"3711d9fb": "saleDuration()", +"3711e829": "withdrawnAmountForSalePromotion()", +"37126b38": "getTime5(address)", +"3712880c": "changeTokenExchangeRate(uint256)", +"37128a12": "initBoostData()", +"371303c0": "inc()", +"3713513a": "TOKENO()", +"3713ab41": "WPXSold()", +"37142391": "GetPartManager(uint8,uint256)", +"3714ae13": "newTokenPrice()", +"3714e274": "mintAllBonuses()", +"3715ae53": "sendApprovedTokensToInvestor(address,uint256)", +"37164433": "withdrawConfirm(uint256,address)", +"3716b8b4": "DonatorSetBanner(string)", +"3716bd22": "showCertificationDetails(uint256)", +"3716ca33": "updateGenerationRatio(uint256)", +"3716f65d": "withdrawDthShop(address)", +"3717798b": "auctionStarted(string)", +"3717a7a7": "Omnic(string,string,uint256,uint256)", +"3717f34c": "divRemain(uint256,uint256)", +"37180750": "getTaskKeyAtIndex(uint256)", +"3718766b": "EventQuitBattle(address,uint256)", +"37189157": "checkWithdrawalAvailability(address,address)", +"3718a923": "canShelf(string)", +"3719427e": "acceptDividends(uint256,uint32)", +"371a4ea8": "getProposalById(uint32)", +"371aa158": "init(address[],uint256[])", +"371ab702": "getMicroModuleByIdPart2(uint256)", +"371be589": "getconfig()", +"371c7dba": "setAllowPriceUpdate(bool)", +"371db7af": "BlockPaymentSystem()", +"371dd5ed": "initRound()", +"371e8e27": "gameResultsLogged()", +"371ecfde": "_directTransfer(address,uint256)", +"371f468c": "GlobalSuperGameToken(uint256,string,string)", +"371fe247": "_checkHashAndTransferExecutorFee(bytes32,bytes,address,uint256,uint256)", +"37205d76": "isCrowdSaleSetup()", +"3720e5b6": "E_AuctionStarted(address,uint256,uint256)", +"3721a634": "requestSpectatorRewardForGladiatorBattle(uint256)", +"3721ee15": "ownerAccessoryCollection(address,uint256)", +"372210d1": "addGenesis(address,bool)", +"37227c07": "logFeeTokenTransferred(address,address,address,uint256)", +"3723100d": "mutiEthTransfer(address[],uint256[])", +"37235758": "currentEndsAt()", +"3723bc0e": "shareholders()", +"3723f149": "FOUNDATION_SHARE()", +"37246f43": "getVoteRulesOfTransaction(address,uint256,bytes)", +"37247af5": "_recalculateAvailable(address)", +"3724fb24": "tradeSpreadInvert()", +"372500ab": "claimRewards()", +"37253e35": "defrostTokens(uint256,uint256)", +"37254184": "jvCoin()", +"3725814a": "getMaxAddresses()", +"37258302": "SubwooferToken()", +"37268dbb": "_internalExchange(address,bytes4,uint256,bytes4,address,bool)", +"37270069": "maxWeiRaised()", +"37270936": "commander()", +"37271cc7": "withdrawBid()", +"37273b86": "PRICE_STAGE_PRESALE()", +"3727ae2d": "AthTokenBase()", +"3728aa4c": "saleCapReached()", +"3728bec2": "getCharacter(uint32)", +"3728f1f7": "EthereumOne()", +"37292eeb": "AVAILABLE_COMPANY_SUPPLY()", +"3729847b": "processSalesForSingleBuyer(uint256,address)", +"372a2a36": "DigitalArtChain()", +"372a49bd": "mspController()", +"372c1aff": "getPublicKeys(uint256)", +"372c6533": "START_DATE()", +"372c66e3": "updateAsset(uint256,string,string,string,uint256,address)", +"372cb1d9": "CallCount()", +"372cd183": "addAdmin(address,bytes32,bool)", +"372cd7ad": "clearAuthOfPermission(address)", +"372cfcc3": "noteSaleLocked(address,uint256,uint256,uint256)", +"372d6b27": "getStatistics()", +"372e80c3": "FLIPPINESS()", +"372ea717": "test_oneInvalidEmptyAddress()", +"372ed8cc": "setOraclizeDelay(uint256)", +"372f6bfe": "_refererUpdate(address,address)", +"372f88b6": "ICC()", +"372fc8d3": "HTSupply()", +"372ff945": "isInPhase(uint256)", +"37305e2a": "withdrawFromCustody(uint256,address,address)", +"37306299": "BurnableToken()", +"3730bb40": "yxkTOKEN()", +"37321bd7": "callstoredaddress(address)", +"37323d19": "LuckyETH()", +"3732c86b": "doubleTransferWithBurn(address,address,uint256,uint256)", +"3732e153": "ETHPrice()", +"37334878": "SHORTADDRTOKEN()", +"37338b05": "requireDing(uint256)", +"37339506": "restrictedPercent()", +"3733b378": "transferStackAndCall(address,uint256,uint256,uint256,uint256,uint256,bytes32)", +"3733faba": "forceStopCycle()", +"3733ffca": "convertTo(uint256,string,string)", +"37354a68": "luckyNumberOfAddress(address)", +"3735ab75": "buyCastle(address)", +"3735d57d": "PRESALE_BONUS_LIMIT()", +"3736d853": "setAverageBlockTime(uint256)", +"37371bc5": "getRandomRouter()", +"37375a43": "createContractEditionForCollection(string,uint256,uint256)", +"37376ca8": "cancelProposal(bytes32)", +"37383c2d": "getEventStart()", +"3738aa19": "ReleaseFundsToInvestor()", +"3738eb8a": "GolfCoin()", +"37391ce2": "testUnescapedQuoteInString()", +"373a1bc3": "scheduleCall(address,bytes4)", +"373a3af8": "intersect(uint256[],uint256[])", +"373a7c01": "fundTotalSupply()", +"373ae230": "checkLimit(address,address,uint256)", +"373c1df9": "test_3_destoryTokensAccrossBlocks_increaseBlocksBy1000()", +"373c98a2": "authCall(address,bytes32)", +"373d46b0": "IPOI(uint256)", +"373dde4f": "countPurchasedPixels()", +"373e0c80": "setFreezeAccount(address,bool)", +"373e441c": "addUserRole(string)", +"373eef4b": "ABsCoins(address,uint256)", +"373f5ff0": "COLOR_GREY()", +"3740eee9": "SetFund(address)", +"37411dc3": "createRandomZombie_Ether()", +"3741b92b": "jrecover_y(uint256,uint256)", +"3741c90b": "setAuthorizedWithdrawalAmount(uint256)", +"3743f0bf": "teamReserveAllocation()", +"3746010d": "createPrizeFighter(uint16,uint256,uint8,uint8,uint8,uint8,address)", +"3746b446": "Predictor()", +"37472c4b": "setDepository(address)", +"3749ea8e": "contribute(address,address,uint256,uint256)", +"374abace": "contractstarttime()", +"374aed97": "getCells()", +"374b8cda": "getTrade(uint256,address,address)", +"374b94c8": "MEC()", +"374ba203": "get_hosp1(uint256,uint256,uint256)", +"374bb090": "isAddressSet(address,address)", +"374bfba7": "claimFreeReferralPack()", +"374e164c": "addVirusDef(address,uint256)", +"374e9aa1": "stageForBlock(uint256)", +"374f7b7e": "checkLoanStatus(address,uint256)", +"375023f2": "total0xbtcReceived()", +"3750e05a": "TOKENS_BOUGHT()", +"37516ead": "microTip()", +"375188dc": "nextTask()", +"3751e6bc": "get_last_global_audit_document()", +"37525ff0": "listItemFromRegistry(uint256)", +"37528882": "calculateIntervalEarning(uint256,uint256)", +"37531b45": "StudentCoin()", +"37542d10": "addReferrer()", +"37548549": "setRecipientString(string,string)", +"37567d49": "maintenanceDeactivateUser(address)", +"3756b62b": "toB32(uint256,address)", +"3756bb45": "noOfTicketsOwned(address)", +"3756e207": "ExtremiumToken()", +"37574b3d": "TOKEN_FOR_TEAM()", +"37593f46": "queryN_fnc(uint256,string,bytes,uint256)", +"375a8131": "addStudent(string,bytes32,string)", +"375b3c0a": "minStake()", +"375b74c3": "custodian()", +"375c0117": "BurnTokens(address,uint256,bool)", +"375c21b0": "random(bytes32,uint32)", +"375c405d": "canIssueIndividual()", +"375c4627": "supplyPICO(address)", +"375c86dd": "m_pools()", +"375d6d90": "received_ethers(address)", +"375d9dc6": "isLimited(address,address,uint256)", +"375dce69": "getIssuable()", +"375e3ea8": "payoutForBudget(uint256,uint256)", +"375e88bd": "increaseBTCRaised(uint256)", +"375f2b96": "getCost(uint8)", +"375f3a9d": "PERC_TOKENS_TO_INVESTOR()", +"375f4498": "SetEditMode()", +"3760153c": "ETHero()", +"37603132": "RollLottery(uint64)", +"3760ceb0": "WAITTIMEUNTILWITHDRAWORTRANSFER()", +"37612672": "producer()", +"3761a3d6": "buyUcCoins()", +"3761d23f": "setFeeDistributionAndStatusThreshold(uint8,uint8,uint256)", +"3761dea8": "MarketPlace(address,address,uint256,uint256,address)", +"37621da0": "setMinChildCount(uint256)", +"3762346b": "externalPurchaseTokens(address,uint256,uint256)", +"37624204": "endPreIcoDate()", +"37629dda": "getArticleItem(uint256,uint256)", +"3762f0fe": "initMembers()", +"37632065": "claimUnderlying(address[2],uint256[7],uint8,bytes32[2])", +"37633f29": "TokensGate(uint256,uint256,uint256,address)", +"37638119": "getHouseEdgeAmount(uint256,uint256)", +"3763965f": "private_profits()", +"3763d4b4": "generalSaleEndDate()", +"3764cf3f": "NUMUS()", +"3764e2be": "setup(string,string,uint256,uint256)", +"37664643": "retractLatestRevision(bytes32)", +"376678e3": "BABYT()", +"37668a8b": "create(bytes32,address,bytes32,address,bytes32)", +"3766baba": "transferAllFromForcibly(address,address)", +"3767aec6": "handleTimedTransitions()", +"3767ea7e": "setTotalCapacity(uint256)", +"37680f18": "ERC20Standard(uint256,string,string)", +"37681083": "incrementReputation(uint256)", +"3768304c": "autoMint()", +"37689317": "generateLockedTokens(uint256)", +"3768bd09": "mulToFraction(uint256,uint256,uint256)", +"3769862f": "isAllowedUser(address,uint256,address)", +"376a4ce0": "setstring(uint256,string)", +"376b9c25": "depositProvider()", +"376c7374": "w_Bounty()", +"376d1555": "sendAuto(address)", +"376d567c": "setMod(address)", +"376db394": "setFreeze(address,uint256)", +"376ed9c6": "totalHedgelyWinnings()", +"376edf93": "getBidsByAdslot(uint256,uint256)", +"376ef9b8": "fromContractAddr()", +"376fc790": "fullTransfer(address)", +"376fc952": "setMaxReferrerBonusRequirement(uint256)", +"376fe102": "userId(address)", +"376ff7f0": "isRefundAllowed()", +"377002fb": "beArbitrator()", +"37714274": "FrancevsArgentina()", +"37717342": "breedOwn(uint256,uint256)", +"3771ab97": "payDividents()", +"37721ab7": "getDougName(string)", +"377272b3": "createValue(address,uint256)", +"3772c371": "getprize()", +"3773930e": "ConfigureFunction(address,uint256,uint16,uint16,uint16)", +"377481ca": "unlockedAddress()", +"3774e6f5": "starbaseMarketingCampaign()", +"37751b35": "doTransfer(address,address,uint256)", +"3777261d": "approvedFactories(address)", +"37775807": "buyerBalances(address,address,uint256,address)", +"3777f5d0": "tokensPerWeiBonus333()", +"3778e5b2": "groupInfo(uint32)", +"37790454": "PrintWinningInfo(bytes32,uint256,uint256)", +"3779a3b6": "saleRunning()", +"377a0f53": "bankAccount()", +"377ab651": "nextTurn(uint256,uint256[3],uint8[176])", +"377b2009": "isCanSell()", +"377b47a3": "logIn()", +"377c6a3e": "eth(uint256,uint256)", +"377d54ce": "assertOnlyParticipants(uint256)", +"377d78ce": "defineProjectWallet(address)", +"377dda1a": "NamiCrowdSale(address,address,address)", +"37800bde": "calculateTransferFee(uint256)", +"37806f07": "galleryOne()", +"3781afbc": "_isCorrectFullBuyin(uint256)", +"3781d882": "setRate347()", +"3781e576": "isOperatorForTranche(bytes32,address,address)", +"37820c57": "bulkMint(address,string,uint256)", +"378252f2": "closeAuction()", +"37828c52": "OTHER_STAKE()", +"3782cae2": "set_max_contribution(uint256)", +"37831b97": "payReward(address,address,uint256,uint256)", +"37848b6b": "getOwnedShipCount(address)", +"3784f000": "setEndDate(uint256)", +"378525bd": "bestAngel()", +"378544df": "timeAfterSoftCap()", +"378652d2": "MultiTransper(address[],uint256)", +"3787a30a": "ownerWithdrawEth(address)", +"3787b748": "WalletChange(address)", +"3788036f": "isAgreementSigned(bytes32)", +"37881299": "getCompare()", +"37881810": "setCallbackAddress(address)", +"3788e371": "BaldcoinCore(string,string,uint8,uint64,uint64,uint16,uint256,address[])", +"37890f94": "maliceReported(address)", +"378a2178": "tallyVotes()", +"378aa701": "getCurrentState()", +"378afddb": "withdrawMYB()", +"378b6a89": "canContribute(address,uint256)", +"378bc89d": "findAddress(bytes32,bytes32)", +"378c0605": "buyTickets(address)", +"378c4c1c": "computeMerkleRoot(bytes,bytes)", +"378c7cd9": "logCheck(uint256,string,uint256)", +"378c93ad": "setClaimable(bool)", +"378ca888": "setMaxFinalizationTime(uint256)", +"378cdb62": "proxyList(uint256)", +"378dc3dc": "initialSupply()", +"378e061e": "inactive_payable()", +"378e0fc1": "checkKwhDeployerAddress()", +"378e25f2": "withdraw_2Completed()", +"378ebf93": "setTokenToEtherAllowed(bool)", +"378efa37": "divider()", +"37900d5a": "issuedFromOtherCurrencies()", +"3790613f": "minChildCount()", +"379080da": "PRICE_MULTIPLIER_PREICO1()", +"379119af": "SJT()", +"3791759c": "migrateFeesDueToFork()", +"3791792a": "mintPack(uint256,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"37918bcb": "declareMvpLaunched(uint256)", +"3792a018": "left8(uint256)", +"3792a865": "MacroTokenContract()", +"3792e117": "GaiaToken()", +"37930615": "extend(bytes16[],uint64)", +"3793c1e8": "get_num_of_uses(address,address)", +"3793ccb3": "isPlayerOnBoard(uint256,address)", +"37941589": "test123token(uint256,string,string)", +"3795ad25": "lockStartDate()", +"379607f5": "claim(uint256)", +"37960cd5": "publicKeySize()", +"379698c1": "calculatePie()", +"37970dbe": "shouldAirdrop()", +"379725ee": "queryName()", +"3797528e": "IllusionDust()", +"3797b4de": "forwardRemaining()", +"37981c32": "pre_maxGoal()", +"37983aed": "getMyCards(address)", +"37986d2b": "freezeAndConfiscate(address)", +"37989eb6": "setOwnerBurner(address)", +"379930f7": "WHEEL_SIZE()", +"379986d9": "executeBurnProposal(uint256)", +"379995c3": "getDealerAndLuckyInfo(uint256)", +"3799bbd3": "privatePresaleAllocatingToken()", +"3799c5eb": "test_insert_findWithHintPrevRemovedUpdateHead()", +"379abed8": "ANPlaceholder(address,address)", +"379b7589": "signedTransfer(address,address,uint256,uint256,uint256,bytes32,address)", +"379ba1d9": "setTradingStatus(bool)", +"379ba2ab": "exchangeForQIU()", +"379ba3b7": "currSaleActive()", +"379bad0b": "addProofOfPerfBlock(uint32,string,bytes32,bytes32,bytes32)", +"379c1bd9": "createHorseShoe4(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"379c5131": "getByOwner(address)", +"379c5d3f": "ModuleToken(uint256)", +"379c8f6c": "_keepLastTransaction()", +"379ca09e": "priceStep5()", +"379dbdeb": "accessAllowance(address,address)", +"379e00d4": "maxTextLength()", +"379e2919": "setDevFeePercent(uint256)", +"379e9957": "fiveMatchPayoutInPercent()", +"379f946a": "initGeneralAttr(uint32,uint64)", +"379fed9a": "isMasterOfCeremonyRemoved()", +"37a0b958": "DATAToken()", +"37a14b52": "changeICODates(uint256,uint256,uint256)", +"37a1c540": "founder1Wallet()", +"37a1c84f": "registerNameResolver(string,address)", +"37a2890d": "eraByIndex(uint256)", +"37a28979": "setSettings(uint256,uint256)", +"37a30d3b": "current_price_atto_tokens_per_wei()", +"37a31079": "pointsLimit()", +"37a31895": "withdrawSelect(address)", +"37a366d8": "loggedBalances(address,uint256)", +"37a38bb1": "StateChanged(uint8,uint256,string)", +"37a3931f": "invalidate(address)", +"37a47106": "create(uint256,bytes32,uint256,uint256,uint256)", +"37a58bb4": "KudosPollFactory()", +"37a59139": "estimate(string)", +"37a5ae1f": "withdrawSingleBucket(address,uint256,uint256,uint256)", +"37a5fbab": "SaleStart()", +"37a66d85": "setPaused()", +"37a6b9f8": "recordCallback(address,uint256,bytes,bytes)", +"37a6d42b": "participant()", +"37a7095b": "LeviathanToken()", +"37a74f7e": "p_update_currentPlotEmpireScore(uint256)", +"37a7983b": "changeminContribAmount(uint256)", +"37a7b7d8": "feed()", +"37a7f2b7": "MIN()", +"37a87dfa": "updateList(address,address,bool)", +"37a91776": "OSATOKEN()", +"37a920f1": "Universe()", +"37aa1689": "getIcoDiscount()", +"37aa7f91": "isAuthorisedMaker(address)", +"37ab8f20": "notifyPlayer(uint256,uint256,uint256,uint256)", +"37ab9dcf": "getCPFee()", +"37ac8236": "getPunchCardsOf(address)", +"37ac9153": "Retrieve(string,address)", +"37adf3a3": "hasRefBonus()", +"37ae31c7": "DemSinhVienRequests()", +"37ae43a3": "BetOnHashV81()", +"37af5c32": "ANYtoken()", +"37aff76d": "getSystemAvaliableState()", +"37b0574a": "isClassic()", +"37b0786a": "icoInvestmentWei(address,uint256)", +"37b0ac71": "confirmTeamWithdrawal()", +"37b0f257": "setConfirmAddr(address)", +"37b34974": "reverse(bytes32)", +"37b475d4": "SOFT_CAPACITY()", +"37b4d863": "maxbet()", +"37b4f299": "IMTERC20()", +"37b54140": "buyTokensForAddress(address)", +"37b5dce4": "PDP()", +"37b6efeb": "engraveDefault(bytes32,string,string)", +"37b7bf11": "Tile(int256,int256)", +"37b89705": "getAgilityValue(uint256)", +"37b8cade": "raisedEthAmt()", +"37b8db1a": "executeVerdict(uint256,bool)", +"37b9756b": "totalIssuanceDebt_limitedSum()", +"37ba1b4d": "Fpgcchain(uint256,string,string)", +"37ba682d": "END_TIME()", +"37bb223e": "CUC()", +"37bb25bc": "withdrawalLimit(address)", +"37bd0d28": "howManyFucksGiven(uint256,bool)", +"37bd1868": "setHatchedEgg(uint64,uint64)", +"37bd78a0": "secondsTimeLocked()", +"37bdc146": "weiFounded()", +"37bdc99b": "release(uint256)", +"37be04b4": "EZStandardToken(uint256,string,uint8,string)", +"37be827d": "Sum()", +"37c08923": "totalContributions()", +"37c0a5ef": "Finished(uint256,uint8,uint8,uint8,uint8,uint8)", +"37c2afda": "signJUR(address)", +"37c30a98": "round_()", +"37c345cd": "specialManagerAddressMap(address)", +"37c35157": "updateTerm(uint256)", +"37c390e3": "allow_move(uint16)", +"37c3d50d": "buyAlt(address,uint256,string)", +"37c3ee6e": "doDistro(address[],uint256)", +"37c43088": "hashesSize()", +"37c44802": "initMonsterClassConfig()", +"37c57718": "ListingBought(bytes32,address,uint256,uint256,uint256,address)", +"37c62ed6": "createUnicornPriceInCandy()", +"37c6fcba": "LandlordTerminate(uint256,string)", +"37c74948": "getPropertyPrivateMode(uint16)", +"37c75992": "mintingIsFinished()", +"37c8d21f": "echo(string,string)", +"37c8f1d1": "AIgathaToken(address,uint256,uint256,uint256,uint256,uint256)", +"37caa8b6": "getTop(uint256)", +"37cb3c86": "distributeSlotBuy(address,uint256,uint256)", +"37cc7761": "contractReservedBalance()", +"37cc7cc0": "bannedCycles(uint256)", +"37ceb05b": "getFixtures()", +"37cef791": "getRate(address)", +"37d004b3": "bulkRelayCMCT(address[],uint256[],bytes32)", +"37d0208c": "bribe()", +"37d044cd": "tokenCreationPreSaleCap()", +"37d05434": "getCurrentRoundIssued()", +"37d1eb35": "setOffChainManagerAddress(address)", +"37d2649a": "Ownedfunction()", +"37d2d350": "setBOPSAddress(address)", +"37d33438": "totalHedgelyInvested()", +"37d3433f": "calculateAmountBoughtPreICO(uint256)", +"37d35507": "tokenCreationMinConversion()", +"37d365de": "admin_set_shopStoreRegister(address,address)", +"37d3ec7a": "ZBillionaire()", +"37d45088": "transferAllowed_(uint256,address,address,uint256)", +"37d48628": "totalSaleCapUnits()", +"37d4fc84": "Alpha()", +"37d76636": "item(uint256,uint256,bytes)", +"37d876b6": "GVTTeamAllocator()", +"37d9d7fc": "getBytes32(bytes32,bytes32)", +"37d9ffd1": "registerClient(address,uint32,uint256)", +"37da8058": "in_top_n(uint256,uint256)", +"37daa09e": "getUpCount()", +"37dac676": "getPOOL_edit_8()", +"37daf0ed": "getETHBalanceInfo()", +"37db0703": "isClean(string)", +"37db12c4": "PausePayment()", +"37dbbac4": "deleteMyEntity(uint256)", +"37dc414b": "balanceOfTarget(address)", +"37dc4b14": "setSpeedBump(bool)", +"37dd186b": "removePermission(address,string)", +"37dd5dd6": "poicoin()", +"37dda1ae": "setTktPrice(uint256)", +"37de1334": "rand16(uint256,uint16,uint16)", +"37de84d0": "createGame(string,string,bytes32[],string,uint256,uint256,uint256,uint256,uint256)", +"37df00c9": "receiveToken(uint256)", +"37df4828": "buy_planet()", +"37df6c03": "setAccountC(address)", +"37dfc70c": "getInvitationMultiple()", +"37e05590": "setKYCManager(address)", +"37e0e290": "numTokensSold()", +"37e12ab7": "checkGoalReach(uint256)", +"37e15240": "addRecord(uint256)", +"37e16f40": "currentAfterIcoPeriod()", +"37e246ad": "isOnAuction(uint256)", +"37e29e93": "BlueHillMining()", +"37e50f39": "awardPrizes()", +"37e531c0": "fechVoteNumForCandidate(address,uint256)", +"37e582b9": "LogRefundsEnabled(address)", +"37e58bd8": "GlowEther()", +"37e6b280": "verifyCommit(uint256,uint256,uint8,bytes32,bytes32)", +"37e6e03b": "setMultisigPre(address)", +"37e7a739": "Token3G()", +"37e822b8": "addRank(uint256,uint256,uint256,string)", +"37e87c7d": "OwnerManage(uint256,uint256,uint256,uint256)", +"37e8c09e": "getBet(bytes32)", +"37e922d7": "TERMS_AND_CONDITION()", +"37e94529": "setHardCapDividends(uint256)", +"37e94853": "TakerBoughtAsset(address,uint256,uint256,uint256)", +"37e9af0c": "IsAdmin(address,address)", +"37e9ebb5": "getExists(bytes32[])", +"37ea010a": "transferWithRef(address,uint256,uint256)", +"37ea1f63": "getWithdrawalCounter()", +"37eb6f91": "LiquidSwapToken()", +"37ebd0e0": "whitelist(address,uint256,uint32)", +"37ec33b7": "startDateOfUseTeamTokens()", +"37ec757f": "getStrFromId(uint256)", +"37ed2bef": "tokensToLock()", +"37ed89b2": "BitcoinPro()", +"37ede426": "WhaleWater()", +"37ee1837": "isCrowdSaleRunning()", +"37ee3edb": "buyTokensWithReferrer(address)", +"37efa397": "cryptoRomeWallet()", +"37f03888": "panicButton(bool)", +"37f0fa43": "PricingDay(uint256)", +"37f1353f": "PayPoolEntranceFee(string)", +"37f13fd6": "prova2()", +"37f1a470": "appoint(address)", +"37f1e7f2": "getPrice(uint8)", +"37f265e6": "get_session(address,uint32)", +"37f26746": "Remainder(uint256)", +"37f2beed": "getProposalVoterList(uint256)", +"37f2eaf6": "addTransaction(address,uint256,bytes,bytes)", +"37f33bd5": "EvenCoin()", +"37f344ff": "WhitelistedEarlyParticipant(address,bool)", +"37f3cb24": "testInitialBalanceUsingDeployedContract()", +"37f42841": "queryBalance(address)", +"37f4494b": "castLine(uint16,uint16,bytes32)", +"37f46e7e": "mintTokensByETH(address,uint256)", +"37f4c00e": "anchorGasPrice()", +"37f4dfea": "unsafeWriteBytes(uint256,bytes)", +"37f50f57": "wishes()", +"37f50f5b": "leggiFrase(uint256)", +"37f531ea": "_addHolding(bytes12)", +"37f534b6": "Blocform(address)", +"37f57d05": "StarterTokenBase()", +"37f7151b": "MTPToken()", +"37f7c4d4": "pow2()", +"37f80a58": "INVESTMENT_CAP_ICO_PHASE_ONE_POUNDS()", +"37f83291": "monuments(uint256)", +"37f86dce": "giveupBid(uint256)", +"37f9034d": "getAnimal(uint32)", +"37f944cc": "raiseBy()", +"37fa33fe": "EVATOKEN()", +"37fb217a": "valueForTranches(uint256)", +"37fb7e21": "distributionAddress()", +"37fbd30f": "etherHolder()", +"37fbec96": "totalTaxed()", +"37fc55bf": "give(string,uint256,string)", +"37fc91e3": "balanceWosPoolToTeam()", +"37fcb747": "TestERC20Token()", +"37fcb779": "sendAllFeesToAddress(address)", +"37fd25c7": "balanceOf(address[],address)", +"37fd6128": "tokenRate15()", +"37fd686f": "balanceOf(string,address,address)", +"37ff2506": "PRESALE_CONTRACT()", +"37ff65da": "Bugis_Crowdsale()", +"3800a119": "closeGateway()", +"3800d0a3": "get_proposal_count()", +"38014395": "originalAuction()", +"3801cde7": "Foodiecoin()", +"3801e6b6": "Cloud(uint256,uint256,string,string,address)", +"3802a4a2": "getEthDealRange()", +"3802d3ef": "totalTokensEmitted()", +"38039479": "setCandidate(uint256,string,string)", +"3803b7d3": "readAddressList(address,uint256,uint256)", +"3803f80e": "cancelCall(bytes32,address)", +"3804482a": "setMaxDistributions(uint256)", +"3804ab8d": "getTokensOnAuction()", +"3804c73d": "gameStartBlock()", +"380547c0": "addCompany(string,address,uint256,bool)", +"3806153e": "tier2()", +"3806422a": "stagesCount()", +"38075446": "shouldStopCoinSelling()", +"3807aabd": "generate(address,uint256)", +"3807ba1b": "poi()", +"380862b2": "getSynthesizeApproved(uint256)", +"3808ac11": "DXN()", +"38095a4a": "fccController()", +"3809b240": "settlementContract(uint64)", +"3809c0bf": "doInfinite()", +"380b5450": "getPrecomputedEToThe(uint256)", +"380ba30c": "confirmPrint(bytes32)", +"380bbf78": "getTokenIdOfAddressAndIndex(address,address,uint256)", +"380be68e": "open_new_node()", +"380bf002": "mintCountByTemplate(uint256)", +"380c686d": "setTokenPriceByOwner(uint256,uint256)", +"380c7a67": "authenticate()", +"380d831b": "endSale()", +"380e5e44": "makeProposal(string,string,uint256)", +"380e809e": "batchTransferFromMany(address[],address,uint256[])", +"380f3087": "addHashes(uint256)", +"380f3771": "viewRand()", +"3811264a": "ErrorLog(address,string)", +"38116187": "buySpike()", +"38118614": "sigTeamAndAdvisersEDUSupply()", +"3812783e": "getDeployedEvents()", +"38131bc5": "redeemOrSellCoinsToICO(uint256,uint256)", +"38132838": "setProviderSupply(uint256,uint256)", +"3813a7f2": "getWineIdentifierAt(address,uint256)", +"3813be76": "currentGameBalance()", +"3814253f": "grantFoundersTokens(address)", +"3814a7a3": "CardsBase()", +"3814b764": "setBridgeWidth(uint256)", +"381501e6": "SwapManager()", +"38151862": "SHSToken()", +"38151930": "isTokensPreIcoDistributed()", +"38158549": "NENCToken(uint256)", +"3815c742": "Koyo()", +"38164d41": "SGDsToken()", +"381656e2": "declineAll()", +"3816a292": "setToken(address,bool)", +"3816d4ee": "iICO()", +"381731be": "approveAndCall(address,uint256,uint256,bytes)", +"38178fbe": "addString(string,string)", +"3817ffda": "_limitedTotalIssuingCollateral(uint256)", +"3818657b": "isActiveFreelancer(address,address)", +"3818d907": "addPrecommitment(address,uint256)", +"38194aab": "_addNewCompanyTraders(uint256)", +"38198c65": "totalEtherGooResearchPool()", +"3819986e": "createNewPoll(string,uint256,uint256,uint256)", +"3819ea68": "SimpleMarket()", +"381a0161": "TRONIXGOLD()", +"381a730e": "withdraw_3()", +"381abeb5": "RonaldoChain()", +"381ae69a": "createReferee(address,address)", +"381c215f": "SEXYCOIN()", +"381cec91": "isVestingStarted()", +"381d5441": "roger()", +"381db641": "distributeTokenAndLock(address,uint256,uint256)", +"381ee645": "lastBlock_v0()", +"381f4b9e": "RRROToken()", +"381fe9ca": "DgxDemurrageCalculator(address,address,address,address)", +"38200801": "getExtensionPublication(string)", +"3820a686": "canBurn(address)", +"3821891e": "requestRegistration(string,address)", +"38218aa1": "getBettorInfo(uint256,uint256,address)", +"38219832": "spendEther(address,uint256)", +"38222858": "setThrowOnIncompatibleContract(bool)", +"3822de0f": "kvtToken()", +"38235781": "checkICO()", +"382396ee": "getGameStatus()", +"3823d66c": "withdrawn(bytes32)", +"3823df95": "testPop()", +"38241c16": "setKYC(address[],address[])", +"3824d8ee": "buy100DaoFor1Eth()", +"3824ea31": "getHighScore()", +"38266b22": "getData(address)", +"3827d0bf": "_createDank(string,address,uint256)", +"38280e6b": "setTokenDistributor(address)", +"38284f36": "release(uint256,uint256,uint256,uint8[],uint256,uint256,uint256,string,string)", +"38285534": "gameDeveloperSupply()", +"3828b522": "serviceApprovedBy(address,address)", +"3828becc": "setBountyAmount(uint256)", +"3829111f": "BuyNowEvent(address,address,uint256,uint256)", +"382964a5": "withdrawForTeam(address)", +"38299afd": "recommendPaused()", +"3829dd22": "tokensForOneEth()", +"382b6f69": "test_oneInvalidEqBytes()", +"382c52cd": "transferableTokens(address,uint256,uint256)", +"382cbc79": "userDelete(address)", +"382cf0a6": "gamesPlayed(uint256)", +"382d39bb": "planCount()", +"382d606b": "CROSAIR_VOUCHER_PRICE()", +"382db937": "finishContributionPeriod(uint256)", +"382df05d": "getInvestmentByAddress(address)", +"382e5272": "addGameRecord(address,uint256,uint256,uint256,uint256)", +"382ef945": "Contributed(address,uint256,uint256,uint256,uint256,uint256)", +"382f431b": "open(bytes)", +"382f8411": "_createPassport(address)", +"382faa6a": "cancelToken(uint256)", +"382fc09f": "CoinVilaStart()", +"382fd819": "kyc(address,address)", +"38300f19": "setCAORatio(uint256[])", +"38302989": "getUsernameForAddress(address)", +"38304483": "pauseAllTransactions()", +"3830901a": "assignImmortalsToBattle(uint256)", +"3830ceeb": "totalriskcoinsSupplys()", +"38310f49": "weiMinimumAmount()", +"3831a8d5": "BurgerKapija()", +"3832677d": "partsMinted()", +"38331353": "MoreAI()", +"38350541": "_ownerOf(uint256)", +"38353104": "setBlockDotTimestamp(uint256)", +"38360ed8": "balance(bytes32,string)", +"3836a6d2": "setKYCLevelsBulk(address[],uint8[])", +"3836d3f4": "JapanvsPoland()", +"3836fe6e": "addPermittedContract(address)", +"38376154": "setGasForOraclize(uint256)", +"3837e9bd": "getGooCostForUnit(uint256,uint256,uint256)", +"3838a099": "aboutItem(uint256)", +"383a194c": "buyUnicornWithEth(uint256)", +"383bb22a": "setMinorEditsAddr(address)", +"383cf18f": "getGovtApplicationsCount(string)", +"383e3a5d": "buyPriceAt(uint256)", +"383e4b27": "submitRing(address[4][],address,uint256[6][],uint256,uint8[1][],uint8,bool[],uint8[],bytes32[],bytes32[],address,uint16)", +"383e9a3a": "claimTokensFromTokenDistrict0xNetworkToken(address)", +"383eea0e": "transferDevship(address)", +"383f61b3": "refundPlayersInRoom(uint256)", +"383fcd3a": "getLastPlayDateTime(address,address)", +"383fe467": "transferTokenOwnership(address,address)", +"383fe6d3": "setCentsPerMonth(uint256)", +"3840369b": "triggerEvent(int256)", +"3840d63d": "unknownReserved()", +"38416341": "getbetData(uint8,int8,address)", +"38419800": "taylorToken()", +"38421476": "changePaused(bool)", +"3842c57c": "petCollection(uint256)", +"38436c60": "transferEgg(uint256,address)", +"38439bb6": "update_tree()", +"3844426c": "EST(uint256,string,string)", +"3844e1c4": "getClientBalance(address)", +"38453f29": "registerCat(uint256,uint256,uint256,uint256,uint256,uint256)", +"384711cc": "vestedAmount(address)", +"38471dd6": "athenians()", +"3847807a": "stopGamGetToken()", +"38478ae7": "setMinterContract(address)", +"38495d66": "updateVault(uint256)", +"3849794f": "setDataSourceAddress(address,address)", +"384a6494": "setStartPreSale(uint256)", +"384af0de": "setMinimumprice(uint256)", +"384b1393": "follow(uint256)", +"384b93f2": "pullTheLever()", +"384baa8a": "round1StartTime()", +"384bb70b": "getData_17()", +"384bfacb": "cofounderIndices(address)", +"384c3335": "requiredToAddress()", +"384c440b": "DISTRIBUTION_TEAM()", +"384c4d2f": "reserveFeesInBps(address)", +"384d0b12": "claimByProof(bytes32[],bytes32[],uint256)", +"384d2e0c": "getNumberByWalletUser(address)", +"384db9fc": "WithdrawEther(uint256)", +"384ddc32": "JM_ETH_ExchangeRate()", +"384e04c9": "setarg_2(uint256)", +"384e2bf5": "MNLTOKEN()", +"384e5018": "etherandomCallbackAddress()", +"384f58eb": "contract_owner()", +"384fae3b": "hashDataStream(address,string,bytes32)", +"38503f55": "AdjustDifficulty(uint256)", +"3850f804": "castVote(uint256,uint256[],uint256,uint256)", +"38516064": "getFeePool()", +"3852c53f": "battlesTillBattleCooldown()", +"3853682c": "Try(string)", +"38536878": "getOwed(address,address)", +"3854bc2e": "setUSD(uint256)", +"3855323f": "updateKey(address,uint256,address,address)", +"38556c3a": "contract8function2()", +"38557648": "executeSellOrder(address)", +"3855b3dc": "GetEscrowNotifierAddress()", +"3855cf0e": "Proxyable(address)", +"3855dcd6": "getContrarians_by_index(uint256)", +"3855f32e": "keysRec(uint256)", +"385794c4": "MAGENDAVID()", +"38597911": "appendKeyValue(string,uint256)", +"3859d609": "raccoltaMessaggi()", +"385ab2d7": "allowSelling()", +"385ae665": "getNumberOfAnnotations(address)", +"385af1c3": "setChainPrev(address)", +"385c0ecf": "whitelistMaxWei(uint256,address)", +"385cd083": "tgeActive()", +"385d8590": "Committed(address)", +"385df389": "tokenURIEdition(uint256)", +"385e27ed": "testSubtract()", +"385e9e2e": "MintNFT(address)", +"385fae43": "setBetclose(uint256)", +"385fb8a6": "STAGE_3_MAXCAP()", +"385fbe24": "ListingContractEntity()", +"385fea5c": "countCliManagers()", +"38613690": "agentAddress()", +"38616105": "LogDestroy(uint256)", +"3861ee08": "EventBuyCar(address,uint32,uint32)", +"3862822d": "buyHo(uint256)", +"3862e6ee": "getEvaluationCountByRecorderID(uint32)", +"3862ea9d": "lockedBitmask()", +"386304e4": "receiveFromGame()", +"38634337": "CrowdsaleToken(uint256,uint8,address,address)", +"386381db": "fundariaTokenAddress()", +"38644538": "setAdditionPrice(uint256)", +"38649b2a": "isConstructedOwned()", +"3865bf3a": "joinNetwork(address[6])", +"3866ecdd": "forceWithdrawToken(address)", +"38670cb4": "founders_address()", +"386741fa": "onSubNew(uint256,uint256)", +"386762fb": "withdrawSnowflakeBalanceFromVia(string,address,address,uint256,bytes,bytes)", +"386892d8": "endICOStage3()", +"38689772": "FixBet16()", +"38692ca6": "setRegistrationPeriod(uint8)", +"3869416b": "getDisputeStartTime()", +"3869eaff": "USEaddress()", +"3869ffd0": "newIteration()", +"386a646e": "QDToken()", +"386b5fe7": "aelfDevMultisig()", +"386c5a74": "LogFeeTopUp(uint256)", +"386c69f2": "setCanBurn(bool)", +"386ca47e": "minCompanyValue()", +"386dd46e": "BTK()", +"386e0d75": "setPopName(uint256,string)", +"386e2b29": "registHnsBatch(bytes32[],address[])", +"386e3441": "tokensIssuedPrivate()", +"386e69dc": "nextRoundStartsAt()", +"386ee512": "Crowdsale(uint256,uint256,uint256)", +"386f36f3": "Deployed(uint256,uint256,uint32)", +"386fcda8": "testCreateCostToken()", +"387008c2": "updateStatus(uint256,bool)", +"3871b694": "LogSell(address,uint256,uint256,uint256)", +"3871bdd7": "depositPresaleWithBonus(address,uint256,uint256,uint256)", +"38721fa4": "getOperationCost(uint256)", +"3872b3ec": "setCoolDungeon(uint32)", +"387349fc": "numberOfTokensToAvail50PercentDiscount()", +"38734c33": "OnContribution(address,bool,uint256,uint256,uint256)", +"3873eeb8": "approveForBurn(address,uint256)", +"38742685": "pegglebot()", +"38743904": "moderator()", +"38752e58": "batchApprove(uint256[],address)", +"38756a89": "getLevelsCount()", +"38759ce9": "getFhMoney(uint256,uint256,uint256,uint256)", +"38760f13": "NewAccreditedInvestor(address,address)", +"387621fb": "cleanupDelay()", +"3876c137": "FRAC_TOP()", +"3876df0e": "ProjectWithBonds(string,uint256,uint256)", +"3876e05e": "appWallet()", +"3876e6d3": "securityTokenVersion()", +"3876f81d": "getPeriodBounus()", +"38771242": "completedAt()", +"387787ed": "setProperty(address,bytes32,bytes32)", +"38785014": "lastBlock_f4Hash_uint256()", +"3878f423": "remainingInvocations()", +"3879aa23": "firstCheckpoint()", +"3879c9f3": "teamCliff()", +"387a54d9": "callInternalTransfer(address,address,uint256)", +"387a76ce": "tokenChanger()", +"387b6c2f": "OwnedResolver()", +"387be94f": "minimumAmountRequired()", +"387bef56": "nodeAllocation()", +"387c0cb4": "hashRegistrar()", +"387d3821": "increaseMarketValue(uint256,uint256)", +"387d49d4": "setBountyBeneficiariesCount(uint256)", +"387da66c": "MCoinToken()", +"387dd9e9": "slots(uint256)", +"387e01fd": "ITO_TOKENS_PERCENT()", +"387e7bb4": "SingularityTest4()", +"387eaedb": "jypcBonus()", +"387ed59b": "hardCapTxWei()", +"387f4172": "GorillaSale(uint256,uint256,uint256,address)", +"388085be": "module(address)", +"38811792": "disallowWrite(uint256,uint256)", +"38812e58": "setStartTime(uint64)", +"38813ee0": "allEther()", +"3882f333": "partnerSaleTokenValue()", +"3882f742": "exitStake()", +"3883aee2": "checkGoalsReached()", +"388415e5": "Exchange(address,uint256,address,uint256,uint256,address)", +"38848911": "AmountRaised(address,uint256)", +"3884d635": "airdrop()", +"3884f307": "withdrawTo(address,uint256,address,bytes)", +"38856ecb": "assertEq5(bytes5,bytes5,bytes32)", +"38857786": "presaledeadline()", +"3885ce81": "avgEtherBetValue()", +"3885fd3d": "sendEther(address,address,uint256)", +"3886b116": "chkConsul(address,uint256,bytes32)", +"3886c957": "tokenLedger()", +"38874945": "developersWallet()", +"388777f1": "setlimits(bytes32,uint32[],uint32[],uint8[])", +"38879da8": "Transfer(address,address,uint256,uint256,uint256,uint256)", +"3887abb7": "checkPeriod()", +"3888188d": "releaseLockFoundation()", +"3888624b": "trueOrFalse()", +"3888dca0": "q_test(string)", +"388911dc": "sudoEnabled()", +"3889c8dc": "Payiza()", +"388a1526": "defaultTreesPower()", +"388a74ab": "validPurchaseSize(address)", +"388aef5c": "WAIT_TIME()", +"388b5786": "econReserveTimeLock()", +"388b9f37": "LogTokenDistribution(address,uint256)", +"388ba4b5": "COIN_SUPPLY_MKT_TOTAL()", +"388e28f9": "stop_all()", +"388f2c39": "recover(bytes32,bytes32,bytes32,uint8)", +"388f3cd3": "cashin(address,uint256)", +"388f58cd": "addMarket(bytes6)", +"388fb0af": "reservedTokensPercent()", +"388fe911": "new_tablet_created(address,bytes32,address)", +"38905bea": "lulaToken()", +"38906dbd": "Token(uint8,uint256,string,string)", +"38909b68": "getBonusUnlockAt()", +"3890d77f": "esopState()", +"3891c320": "vote(int256)", +"3892be14": "payoutPreviousRoll()", +"3893966d": "distribute(address[],uint256[],uint8)", +"389435e8": "calculateTotalWithdrawableAmount(address)", +"389439bb": "OwnerSigneture(address[])", +"389441b2": "getvaluejoinlist_even(uint256)", +"38948c53": "finalizeable()", +"3894ca57": "catOwners(bytes5)", +"3894e516": "generateToken(string,uint256)", +"38953534": "BTCEX()", +"3895f466": "buyoutWithData(uint256,string,string,string,string)", +"38960027": "aliveSince()", +"38969d64": "changeZipper(address)", +"389755a7": "setDefaultTransferRate(uint16)", +"3898ee61": "generateTicketData(uint256,uint8,uint8)", +"3899ad41": "unlockSecondary()", +"389aa67c": "addOrder(string,address,uint256,uint256,string,address)", +"389ab31c": "networkDevelopmentWallet()", +"389ae4d1": "foundersKey()", +"389b5bd2": "CryptobullsCoin()", +"389b7533": "extendDeadline(uint256)", +"389b75d6": "resetPool(uint32)", +"389cabee": "ceoWallet()", +"389cd1ae": "setGasPrice(uint256,uint256,uint256)", +"389d9636": "buyDiamond(uint256)", +"389db4f1": "_adjustDifficulty()", +"389e40d2": "PACOIN(uint256,string,string)", +"389e4839": "setState(bytes32,bytes32)", +"389eb9f9": "withdrawalTime()", +"389ece2f": "changeTelephoneOwner(address)", +"389f0846": "balanceUpdate(address,address,int256)", +"38a003e0": "getOrderAddressesForDay(uint256)", +"38a0615f": "TabooToken()", +"38a0fc9a": "registerPool(string,uint256,uint256,uint256,uint256)", +"38a0fdde": "setSnapshot()", +"38a1187d": "calculateEthAmount(address,uint256,uint256,uint256)", +"38a18cbe": "createTradeContract(address,uint256,uint256,uint256)", +"38a211b7": "lockTopLevelDomainOwnershipTransfers()", +"38a21db8": "create(bytes32,bytes32[3],bytes32,bytes32)", +"38a2cd0f": "setData_3(string)", +"38a2fb4f": "TransferBaseContract(address)", +"38a326e4": "activatedSalesTotalCount()", +"38a332eb": "EndGame(address,uint8,uint256)", +"38a4045e": "despoit(uint256)", +"38a4ba0b": "getAdPriceHalfDay()", +"38a52fb1": "setEthPlan(address,uint256,uint256,bool)", +"38a57d0c": "buildShip(uint16,uint16,uint8,bytes32)", +"38a5e016": "acceptTokenOwnership()", +"38a699a4": "exists(bytes32)", +"38a6e813": "updateAllowedAddressesList(address,bool)", +"38a74bbf": "endGameInternal()", +"38a7543e": "issuers(address)", +"38a8a0ca": "DeadCow(address,uint256)", +"38a964d6": "getFeeValue(address)", +"38a9a6f8": "bonusPreset()", +"38a9f25a": "PlayerLab()", +"38aa156c": "getKeccak256Address(address,address)", +"38ab0287": "nextMintPossibleTime()", +"38ab8ef4": "RelentlessConscienceToken()", +"38abdf41": "CraigGrantShrimper()", +"38af3eed": "beneficiary()", +"38af4eff": "tokenCents()", +"38b025b2": "parseInt16Char(string)", +"38b09889": "VictorieumNewToken()", +"38b0ea85": "startRedemption(uint256)", +"38b15dab": "setMyTokenBalance(address,uint256)", +"38b3e983": "Better(uint256,uint256,uint256)", +"38b52627": "supportsInterfaces(address,bytes4[])", +"38b5491b": "getInvestmentProposal(uint256)", +"38b56ead": "setURIToken(string)", +"38b59359": "ChangeEthPrice(uint256)", +"38b59be6": "addPercents(uint256,uint256)", +"38b5e0fe": "numElementsEven()", +"38b6e407": "endGrantAuthentication(address)", +"38b7a530": "addToAvgRating(address,address,string,string,uint8)", +"38b88052": "staleTime()", +"38b90333": "CONTRACT_VERSION()", +"38b93440": "replaceModule(string,address,bool)", +"38b9499b": "circulationStartTime()", +"38b9d61e": "bonusLimit4()", +"38b9ef9c": "betWithRound(uint256,bytes32)", +"38bb3977": "JuventusvsRealMadrid()", +"38bbbceb": "test_failed_payment_nonthrowing_token()", +"38bbfa50": "__callback(bytes32,string,bytes)", +"38bbfc51": "FCOIN1050Token(uint256,string,string,uint256)", +"38bc01b5": "getAddresses(bytes32[])", +"38bc1b96": "_airdrop(address,uint256)", +"38bcdc1c": "getURL()", +"38bd44f3": "createSDCC(address,address,uint256)", +"38bd8357": "next_week_timestamp()", +"38bde636": "GoodBoyPoints()", +"38be706d": "__callback(uint256)", +"38beb446": "PlayerToken()", +"38beb67f": "getCertificateHash(address,address,uint256)", +"38bef35c": "CFCdistrubution()", +"38bf77c3": "setFeesPerTenThousand(uint256)", +"38c0ac5f": "signer2()", +"38c1b824": "transferBookKeeping(address,address)", +"38c20499": "accMinterTwo()", +"38c33862": "wineries(bytes32,uint256)", +"38c3d4ed": "PORNCASH()", +"38c4090b": "getMarketOrderValue(uint256)", +"38c4d4a6": "pairTransfer(address,uint256)", +"38c59de9": "getNumberInvestors()", +"38c5a3dc": "changeRealUnicornAddress(address)", +"38c67b73": "setCurrentStage(uint256)", +"38c68f8f": "right84(uint256)", +"38c72883": "DealFullyFunded(uint256)", +"38c73f9f": "by(bytes32,uint256)", +"38c7db75": "getUnredeemedBalance(address,address)", +"38c80857": "unlock1Y()", +"38c80fc3": "getWhitelistStatus(uint256,address)", +"38c8e611": "getPreorderInfo()", +"38c8ec85": "convert1(string,string)", +"38c9027a": "calc(uint256)", +"38c92ef0": "propose(bytes,address,string)", +"38c97949": "StandardGame()", +"38c9dbf3": "TEAM_STAKE()", +"38ca59cf": "createTargetedValentineRequest(string,string,string,address)", +"38ca60a2": "IBST()", +"38ca683b": "MARKTY()", +"38ca830c": "updateWhiteList(bool)", +"38caa2c6": "MaxCapReached(uint256)", +"38cb252f": "getBonusPercent()", +"38cb583d": "checkAndUpdateTokenForManual(uint256)", +"38cc17ee": "setGameState(bool)", +"38cc4831": "getAddress()", +"38cc639d": "_setUserAttribution(bytes32,address,uint256)", +"38cd2c1a": "TransferSellAgentSiteRegMulti(address[],uint256)", +"38cdaab1": "changeICOState(bool,bool)", +"38cde380": "changeWeight(uint256)", +"38ce1df8": "sideServicesCount()", +"38ce4d51": "canRedeemUTXO(bytes20,uint256,bytes32[])", +"38ce61b2": "transferAndFreeze(address,string,address,address,uint256,uint256,uint256)", +"38ceaf1b": "LicenseManager(address,string)", +"38cef1ab": "ESCBCoinPlaceholder(address,address)", +"38cf2087": "parametersAreSet()", +"38cf22e3": "getHoldingsSupply()", +"38d084b5": "address4a()", +"38d0ae6c": "stakeFunds(uint256,uint256)", +"38d0e36f": "SBSEducationToken()", +"38d16011": "verifyKYC(address)", +"38d1ed57": "getTotalFeesDistributedCount()", +"38d28d4c": "setTicketCountMax(uint256)", +"38d28de3": "getGoldInfoWeight(address)", +"38d2b172": "lowCapTxWei()", +"38d33337": "RoundAHardCap()", +"38d335ef": "ShowTestB(bool)", +"38d40ced": "changelp15(address)", +"38d44ad5": "recall(uint256,string)", +"38d480a6": "bulletAddress()", +"38d4d73e": "isVotedGood(uint256)", +"38d52e0f": "asset()", +"38d560b6": "gmtAddress()", +"38d65020": "JackpotAccessControl()", +"38d67d88": "changeContractName(string,string)", +"38d762ef": "LogBurn(address,uint256)", +"38d7be3c": "WXBET()", +"38d888a6": "impToken()", +"38d93280": "ProfitContainer(address)", +"38da5b07": "verifyIncludedAtIndex(bytes,bytes32,bytes32,uint256)", +"38dacaab": "teamTimeLock()", +"38db6dd3": "registerVoter(address)", +"38dbb74a": "initialize(uint256[],uint256[],uint256,address,uint256,address)", +"38dbdae1": "player3()", +"38dc25d1": "KMCToken()", +"38dc92bc": "NCP()", +"38dca34a": "AddStudent()", +"38dd22f0": "isOwnerOrAdmin(address,address)", +"38dea895": "auction(address)", +"38dec0fa": "RefundAdded(address,uint256)", +"38df6fb2": "CollateralPosted(address,uint64,uint256)", +"38dfe2f5": "getString2()", +"38e078b4": "FixBet76()", +"38e11779": "OriginalAddress(address,address)", +"38e1294c": "updateBuyStatus(bool)", +"38e288f1": "airdrop(address[],uint256,uint16)", +"38e29ef0": "ICO_BONUS_TIME_1()", +"38e2c296": "processJackpotDeposit(uint256,uint256,address)", +"38e3aaf1": "Error(uint256,uint256)", +"38e43840": "collected(address)", +"38e45c65": "endCall()", +"38e47639": "getHighWater()", +"38e48f06": "save(string)", +"38e48f70": "getDonation(address,uint256)", +"38e4b06b": "releasedTeam()", +"38e55e89": "SigmaToken()", +"38e586fd": "right5(uint256)", +"38e64f9e": "milestoneReached()", +"38e771ab": "refundAll()", +"38e7920a": "setTokenRate(uint256,uint256)", +"38e7a375": "textaaaToken(address,uint256)", +"38e8feed": "TokensTransfer(address,address,uint256)", +"38e91e41": "devHolder()", +"38e95d55": "amountToRaiseInUsdCents()", +"38e998a7": "buyLand(int32,int32)", +"38e9e6b5": "setClaimingCosts(uint256)", +"38ea1c4d": "setTransferCreditBot(address)", +"38eada1c": "addAddress(address)", +"38eaf913": "setDirectorNode(string)", +"38ec18c3": "changeAccountModifiers(address)", +"38ec6ba8": "getAddressOfName(string)", +"38ec8672": "newAvto(string)", +"38ec8736": "assertEq11(bytes11,bytes11)", +"38ecadac": "bountymanagerShare()", +"38ecdca9": "claimProduct(address,uint256)", +"38ed85b0": "_claim(address)", +"38eda0e5": "createCalcFunc()", +"38ededc9": "getNoteOwner(uint256,uint256)", +"38ee95ab": "_emitCapabilityRemoved(address,bytes4,uint8)", +"38eee93e": "scheduleCall(address,bytes,bytes,uint16,uint8,uint256[5])", +"38ef2dc0": "testSign2of3()", +"38eff6c6": "backETH(uint256)", +"38f0de1f": "_fFinish()", +"38f14845": "deleteUser(uint256)", +"38f196b2": "COR()", +"38f22b42": "viewSpecific(string,uint256)", +"38f23e18": "recoverContractBalance()", +"38f41711": "updateCapAndExchangeRate()", +"38f42d41": "GameWin(address,uint256,uint8,uint8,uint8,uint256,uint256)", +"38f46240": "StartRefund()", +"38f4b734": "getShit()", +"38f4cc7a": "QtumToken()", +"38f50b6f": "modifyAuth(bytes8,bytes8,bool)", +"38f55e59": "doVote(bytes32)", +"38f736c5": "step(uint256,bool)", +"38f77d69": "getDistributeProfitsInfo()", +"38f817c5": "getUsersEnginesIds()", +"38f84614": "useGoldenTicket(string)", +"38f88ee0": "tokenOwnerRemove(address)", +"38f8f3cc": "quarter1()", +"38f98d09": "getWeaponValue(uint256)", +"38fa1570": "showDevCut()", +"38fa4029": "currentStageIndex()", +"38fa8ef9": "isFundkeeper(address)", +"38fab8c5": "lifToken()", +"38fbf0b9": "destroyShares(uint256)", +"38fdba18": "doSplit()", +"38fe48b8": "batchReturnUNT(uint256)", +"38fff2d0": "getPoolId()", +"390063f0": "fundsToMSF(uint256)", +"39009094": "Cooperium()", +"39009482": "returnTuple()", +"3900f8f6": "minusFreezingTime(uint256,uint256)", +"390209c1": "getMetadata(uint128)", +"390246b2": "bid(bytes32,uint8,bool,int32)", +"3902b9fc": "getBbAddress(address)", +"3902bf72": "donate(bytes32,bytes32,bytes)", +"3902cb92": "TERATO()", +"3902d417": "resumeAirdrop()", +"39035d56": "record(address,address)", +"39048f02": "setSchellingRoundReward(uint256)", +"3904c5c1": "sweepFunds(address,uint256)", +"3904e1bf": "userBuys(uint256,address)", +"39055172": "UpgradeTokens()", +"390576d9": "Sogan()", +"3905910e": "MultiEventsHistory(address)", +"3905cab8": "drpsToken()", +"39069d8c": "setRegistryAdmin(address)", +"3906f560": "SUPPLY_LIMIT()", +"39074f59": "getDelayedBonusAmount(address)", +"390a05a8": "getParticipantBalances()", +"390b4f0c": "NaGeBi()", +"390b8482": "fillWithHashes()", +"390c0ddd": "purchaseCollectible(uint256)", +"390c3434": "nextrafflenr()", +"390c5874": "getCashbackRate(address)", +"390ce0d3": "getSellOrder(uint256)", +"390d70f5": "getTransformTarget_miner(address)", +"390e16c1": "EXTENDED_SLACK_PERIOD()", +"390e4855": "MilestoneTracker(address,address,address)", +"390eca6b": "finish(string)", +"390ff134": "isApprovedFor(address,uint256)", +"39106821": "memberId(address)", +"3910814b": "diamondAuction()", +"391193ae": "getTotalF2()", +"3911e1e1": "totalEthxCollected()", +"3912253e": "betConditions()", +"39125215": "sendMultiSig(address,uint256,bytes,uint256,uint256,bytes)", +"3912572d": "TokenCLC(uint256,string,string)", +"3912657a": "lastBlock_f11Hash_uint256()", +"3912b99f": "FOUNDERS_SHARE()", +"391363b5": "reducetime()", +"3913848e": "changeMerchantChargingAccount(uint256,address,bool)", +"3913a0fe": "getPlayerAward(address)", +"3913d6e0": "burnEnergyAttributionToken(address,uint256)", +"3913f487": "RIPAC(uint256,string,uint8,string)", +"3914010a": "getPartnerCash(uint8,bool,address,bool,uint256)", +"3915111e": "getRoundPrize(uint256)", +"39166ee9": "holding(address)", +"391687e3": "raiseTraderRegistered(address)", +"3916a402": "ShowInfoStr(string)", +"391714f8": "closeSale(bool)", +"39179ef9": "BitcoinFast()", +"3917b761": "product2_sell()", +"39181e6c": "Monthprofitstart()", +"39192fd7": "mintReserveTokens(address,uint256)", +"391b11ce": "updatePartner2_vows(string)", +"391c44b2": "addToWhiteList(address,uint256,uint256)", +"391c918e": "transferFromOwner(address,address,uint256,uint256)", +"391d2eb4": "MottoCoin()", +"391ecc2c": "_setOwners(address[])", +"391efaf2": "getEscrowFullInfo(address)", +"391f2e96": "InvestCancel()", +"391f3b2d": "_nextPotJackpot(uint256)", +"39203874": "ALpay(uint256,string,string)", +"392087fd": "changeSoftCap(uint256)", +"392114b7": "sellingAccept(bool)", +"392212c8": "EvaCash()", +"39221913": "_forwardT4T(uint256)", +"392327b5": "owner_set_fraction(uint256)", +"392338f5": "createPost(string,string)", +"39236bef": "claimGame(uint256)", +"3923afee": "allocateToEarlyContributor(address,uint256)", +"39246290": "getB2()", +"39246d75": "VersionModel()", +"3924b718": "m_tokenPrice()", +"3924f089": "getRunning()", +"392542fb": "unFreeze(bytes32)", +"39255494": "setAdminAccounts(address[3])", +"3925ad8a": "getRank07()", +"392603d3": "_getCsAddr()", +"3926384d": "setMaxWithdrawal(uint256)", +"392664e5": "GenesisAddressSale(address,address,uint256,uint256)", +"39269596": "endPrivateIco()", +"3927010d": "ownerPauseGame()", +"392752b9": "lifeFactor_iv()", +"3928bc8b": "setBoostData(uint256,address,uint256,uint256)", +"39293113": "earlyBirdCap()", +"39298633": "forceTransferFrom(address,address,uint256)", +"39298f4a": "listAssets(uint256,uint256,bool)", +"3929e43f": "proposalExpireAt(bytes32,uint256)", +"392a2cb6": "withdrawFromFailedLottery(uint32)", +"392aa4d5": "openRefund()", +"392c00a2": "mint(int256,address,uint256,bytes)", +"392c6238": "currentNiceGuyIndex()", +"392c623e": "docIndex()", +"392cb9ed": "DhaCoin(uint256,string,string)", +"392d42ae": "left38(uint256)", +"392da9b4": "fetchCancelledOrdersForMerchant(address)", +"392db91e": "genuine(address)", +"392e53cd": "isInitialized()", +"392e6678": "validCandidate(bytes32)", +"392eaafa": "HackDao()", +"392ec230": "PaymentForwarder(address,address)", +"392ec66b": "bobClaimsPayment(bytes32,uint256,address,address,bytes20,bytes)", +"392ecfa6": "buyWithTokens(bytes32)", +"392ee145": "jackPotA()", +"392f37e9": "metadata()", +"392f5f64": "roles()", +"392ffcfb": "test_twoValidAndInvalidEqAddress()", +"39300836": "fundCrowdfund()", +"3930d3dd": "minBuyETH()", +"3931845d": "registraAluno(address)", +"3931c9a8": "purchaseWithToken(uint256)", +"39332b05": "foreignBridgeErcToErcImplementation()", +"39333bbe": "tokenBankrollBuyIn()", +"39341dde": "unseatKing(address,uint256)", +"39347d52": "setMarketers(address)", +"39354244": "percentAllocationFeeNumerator()", +"3935ae8f": "POKERCOIN()", +"39363923": "invalidationBounty()", +"3936dbe4": "decimals(address,bytes32)", +"3936e99a": "releaseAssets(uint256)", +"39384126": "getCampaignValidById(bytes32)", +"3938bd78": "updatePayment(uint256,address)", +"3938faa1": "_emitErrorCode(uint256)", +"393a1955": "crowdfundingTarget()", +"393a4d34": "getStorageAddress()", +"393b011c": "setOwnerPercentage(uint256)", +"393b9b0f": "TransferPreAllocatedFunds(uint256,address,uint256)", +"393bb56e": "setApprovalStatus(address)", +"393bbbf8": "mokenName(uint256)", +"393cb7e3": "feesPerMillion()", +"393e0c63": "maxPreICOandICOSupply()", +"393e77c9": "minMonsterHit()", +"393ebbf8": "setSlashPercentage(uint256)", +"393eec7b": "setSafeToken(address)", +"393eefb8": "withdrawMyDividend()", +"393f4605": "getProviderWebsite(uint256)", +"393f7cd4": "init_dev_and_presale_allocation(address,address)", +"393fb37b": "gettruelevel(uint256,uint256)", +"39408c83": "icoFinishedDate()", +"3940e9ee": "total_supply()", +"3941456c": "frontendAddress()", +"39419d60": "grandConsolationRewards()", +"394218b1": "electNewMayor(address)", +"3942a979": "s6(bytes1)", +"39431308": "commissionPercentForCreator()", +"3943380c": "key()", +"3943807b": "insert(bytes,bytes,int256)", +"3943909e": "ScamStamp()", +"39443b8e": "canDeposit(uint256)", +"3944615c": "getCompanyAddress()", +"3944750d": "ACCEPT_EXCHANGE()", +"394479c5": "TestKeiosToken()", +"39451a88": "tokenBurn(uint256)", +"394580d2": "distributeManyTokens(address[])", +"394610cf": "tokensTotal()", +"39464884": "entryInfo(uint256)", +"3947050f": "randomTicket()", +"39478568": "isFounder()", +"39495f8e": "RealTract(uint256,string,string)", +"3949630e": "before_test_method()", +"3949b636": "doDaysFollowEachOther(uint256[])", +"394a0926": "addUnicorn(address,uint256)", +"394a3f61": "updateFollower(uint256,bool)", +"394a8698": "getTotalBondValue()", +"394b0ba9": "RetengoToken()", +"394bcb49": "updateClient(address)", +"394c21e7": "cancelOrder(address[5],uint256[6],uint256)", +"394cd121": "qryModuleDetail(string,string)", +"394d57a2": "EtherPriceUpdate(uint256)", +"394da86b": "WEECoin()", +"394dfffb": "GFCI(uint256,string,uint8,string)", +"394e0cdd": "standingOrdersByOwner(address,uint256)", +"394f4ec6": "User(bytes32,bytes32,bytes32,bytes32,bytes32)", +"394fc3a6": "MaecenasToken()", +"39500019": "voteWithSpecifiedAmounts(bytes32,uint256,uint256,uint256,address)", +"39500105": "egcd(int256,int256)", +"39509351": "increaseAllowance(address,uint256)", +"3950d1b2": "p1_duration()", +"3950f3a2": "disavowTokens()", +"39515e3c": "bonusOver30ETH()", +"39518b5e": "startingTime()", +"39527ed6": "withdrawTatAmount(uint256)", +"395382ee": "squareWins(uint256,uint256)", +"3953ca8b": "setPropertyRowColor(uint16,uint8,uint256)", +"3953f4a1": "setLastEditionOf(uint256,uint256)", +"3954a389": "c_MaximumFunds()", +"3954b4ee": "pricePerEther()", +"3955b070": "unhold(uint256)", +"3955b6af": "_createToken(uint256,address)", +"3955c147": "MatchmasterPrevails(address,address,uint256,uint256,uint256)", +"3955f0fe": "sellEggs()", +"3955f12e": "crowdSaleOn()", +"39564561": "isCapper(address)", +"3956e963": "Mydo()", +"39575795": "getBalances1()", +"395764ff": "OilToken(string,string,uint256)", +"3957f093": "calculateTokensAmountToSale(uint256,uint256)", +"39580054": "getOpponent()", +"3958884b": "unblock(bytes32)", +"3959b945": "getSolver(bytes32,string)", +"395a9ab3": "Success()", +"395acdeb": "lockedCounts()", +"395b6f71": "getOrderBookInfo(address)", +"395b9467": "totalSUM()", +"395c22c9": "submitNewPolicy(string,string,string,string,string,string,string,string)", +"395deefa": "RefreshDayBonus()", +"395ea0c9": "Medikia()", +"395eda08": "MINIPOOLS_LLV_FIFA_1()", +"395ede4d": "collectToken(address)", +"395eec79": "studInfo(uint256)", +"3960c001": "buy(uint32,uint16,uint32,bytes16,bytes32)", +"3960eddf": "SupeciesToken(uint256,string,uint8,string)", +"3960f787": "decrypt(uint256[])", +"39612b0e": "refundingIndex()", +"39614759": "toBase58Checked(uint256,bytes1)", +"39614e4f": "bytesToString(bytes)", +"39624847": "getNumWinners()", +"39625faf": "pokerbox()", +"3962c4ff": "TimeStart()", +"3962d9f1": "User(bytes32,bytes32,uint256)", +"3962f82d": "getTokensCount()", +"39631849": "transferOutBalance()", +"39633cee": "getCompte_39()", +"39635d13": "withdrawToTeamStep1(uint256)", +"39636504": "teamPool()", +"39637616": "setTimedCrowdsale(uint256,uint256)", +"39639fbd": "trackToken(address)", +"3963d0c1": "MonthlyPaySend(uint256,address)", +"39658245": "ChannelTimeout()", +"3965e75d": "cancelEnter(address)", +"3966291e": "StaticEthAvailables(address[])", +"396724c3": "getCCH_edit_1()", +"39673345": "EPCToken(string,string,string)", +"396773b7": "getHeader(uint256)", +"3967d46a": "updateDeposit(bytes32,address,uint256,address,uint256)", +"39681333": "get_last_global_audit_time()", +"396876bd": "mintAllowance()", +"39688256": "tokenHardCap()", +"39694f47": "totalUnClaimed()", +"396ad86f": "setpatient(uint256,uint256,string,string)", +"396bf78a": "WalchainToken()", +"396c8228": "purchase(uint16,address)", +"396d1ddf": "totalAdvisor()", +"396e70e0": "reducePlayersJadeProduction(address,uint256)", +"396ed0ab": "Burn()", +"396ff799": "setFoundersTokensWalletMaster(address)", +"3970f698": "tokenForSale()", +"39714adb": "trackHolder(address)", +"397182ef": "buyInSharePrice()", +"3971ee42": "promo(address[])", +"3971eea1": "bidReferral(uint256,uint256)", +"3972323a": "lockedBalances(uint256)", +"39737ea4": "proposalData(string,address,uint256,bytes)", +"397388af": "getAllRegisteredUsers()", +"3973e87e": "betSizeFINNEY()", +"397412cb": "setMinPrivateSaleBuy(uint256)", +"39745791": "removeWhiteList(address[])", +"3974874b": "drop(address[],uint256)", +"39754b9a": "internalContribution(address,uint256)", +"3975e32b": "RequestTest(bytes32,bytes32)", +"3976304e": "topupEnergy(uint256)", +"397656c6": "enableTuneOption(uint256)", +"3976b022": "LOG_SuccessfulSend(address,uint256,uint256)", +"3976be0b": "DCToken(uint256,string,uint8,string)", +"39774576": "isMiBoodleToken()", +"39785281": "winAmount3()", +"39785550": "withdrawAnyERC20(address,address,uint256)", +"39787fbd": "payeeArray(uint256)", +"39788bc8": "approval()", +"397895f3": "HoldChanged(address,uint256,uint256)", +"397986a1": "setUpAllowance()", +"39799e5d": "test_updateKey_missingId()", +"397a6b3d": "PrizeResultCalculated(uint256,uint256[])", +"397ab649": "Bet(address,uint256,address,uint256,uint256,uint256,address,uint256)", +"397b3378": "rewardPoolSupply()", +"397b8b17": "buyTokensForFiat(address,uint256)", +"397b90a5": "issueReserveToken(uint256)", +"397de27f": "changeServicePercent(uint256)", +"397e0287": "setIdentityExtended(bool,bool,bool)", +"397e8091": "betFeeMin()", +"397e953f": "ERC721Contract()", +"397eb91b": "closeLoanOnBehalfOf(address,address,bytes32,uint256)", +"397edab9": "ChangeOperatorAccount(address)", +"397efdbc": "CodeMailStampSale()", +"397f2a71": "getNbNamespaces()", +"397fa015": "updateCrowdsaleInfo(address,string)", +"397fe617": "CROSAIR_PRICE_THRESHOLD()", +"3980b680": "isHolidayToday()", +"3982316c": "getAllStorages()", +"3982b10d": "read_collectors_addresses()", +"3982b55d": "XCareToken(uint256,string,string)", +"3983af00": "setYearTwoMultiplier(uint256)", +"3983d5c4": "calcBaseFee(uint256)", +"398427e6": "sendByCheque(address,uint256,bytes,uint256,uint8,bytes32,bytes32)", +"39846a67": "sol_clean(uint256,uint256)", +"39849771": "maxBetDivisor()", +"39849a67": "isSpaceExist(uint256)", +"3984a89b": "updateFamedStarOwner(uint256,address)", +"3984ae12": "bountiesMinted()", +"3985a4ab": "crowdsaleEndDeclarationTime()", +"398712b5": "clearTheSeason(uint32)", +"3987fcb4": "setGasForFLKD(uint256)", +"39882a2d": "setUseWhitelistFlag(bool)", +"39885b23": "finishPreSale()", +"3988bad8": "pendingRewardsOf(address)", +"39895801": "allowPublicTransfer()", +"3989c666": "setRate(uint256,uint256,uint256)", +"398ab9a7": "totalPrizePool()", +"398af892": "Jimtoken()", +"398b35b1": "setShouldBlockPublicTrade(bool)", +"398bd6b2": "Cancelled(address)", +"398c1a89": "migrateOutByPayout(uint256[],bool,uint256)", +"398c7424": "getBalanceTokenContract()", +"398d07f0": "LightLemonUnicorn()", +"398d3c37": "getAyantDroitEconomique_Compte_1()", +"398d92bb": "withdrawTokens(uint256,address)", +"398e92a5": "updatePlotPrice(uint256,uint256)", +"398eb93c": "NardoT2()", +"398f0970": "secondsInBlock()", +"398f2648": "change_max_amount(uint256)", +"39900857": "closeTournament()", +"39900dcc": "totalBuriedCapsules()", +"39901be8": "getBoosterData(uint256)", +"39903398": "test_twoFalseAsserts()", +"399075da": "RES(address,uint256,string,string,uint8)", +"39907af1": "getSecurityValue()", +"39909f0b": "withdrawFundToOwner()", +"3990b7c7": "registerGold(address,address,bytes32)", +"39918c4f": "crowdsaleAllocation()", +"3991c09d": "addMatch(uint256,uint256)", +"3992503d": "TRIPAGO()", +"39927ebe": "registerGame(address,bool)", +"3992b494": "energyContract()", +"3994789d": "onICO(address,uint256)", +"3994b883": "SoccerBet(address,address)", +"3994bce4": "SALE_CAP_USD()", +"3995943b": "FUND_FRAC_TOP()", +"39960940": "registryRequestWeight()", +"39965233": "awardPrizes(uint256)", +"3998e2a9": "EBCoin()", +"39995511": "freezeAllTransactions()", +"3999968c": "mintRefCredits(address,uint256)", +"3999bbce": "SmartBitcoin()", +"399a24b1": "invokeFallback()", +"399ae724": "init(address,uint256)", +"399c0425": "buyingPrice()", +"399c6f55": "NewStage(uint256,string,string,uint256)", +"399cd55f": "ReferralRewarded(address,address,address,uint256,uint256,uint256)", +"399d6465": "getLockAmount(address)", +"399d7bf5": "against_ban_of(address)", +"399e3ca8": "PrivateSaleFinished()", +"399e7195": "CentraAsiaWhiteList()", +"399f6248": "ContractOwnershipBurn()", +"399fa840": "removeItem(address)", +"399fd8d9": "getDiaryLength()", +"399fdb86": "testFailNormalWhitelistReset()", +"39a12c3b": "Trade(uint256,uint256,bytes32,address,address)", +"39a13fb3": "enableTokenSale()", +"39a1e9ff": "SmallProject()", +"39a1ec37": "getInvestorDatePayout(address)", +"39a248f3": "feecounter()", +"39a26069": "housePercent()", +"39a2616c": "_removeDefaultOperator(address)", +"39a2a7bd": "confirmDeposit(uint64)", +"39a2b580": "_initialDistribution()", +"39a2bc8d": "SynchroCoin(uint256,uint256,uint256,address)", +"39a2eb2a": "selectWinners(uint256)", +"39a3f168": "secondPeriodWindows()", +"39a45a5c": "createGun(uint256,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"39a5a400": "TOKEN_SOFT_CAP()", +"39a5fdda": "earlyBackerSupply()", +"39a6ea72": "getEndICO()", +"39a73978": "unpackInvestment(bytes32)", +"39a7919f": "changeSupply(uint256)", +"39a7c3d9": "onMint(address,address,uint256)", +"39a7cb16": "retrieveCurrentTokensToOwner()", +"39a87bd9": "left31(uint256)", +"39a897fc": "Builded(address,address)", +"39a89c1a": "getNumberOfCapsules()", +"39a90f7a": "IS_MAINNET()", +"39a9144b": "_isTokenDiscounted(uint256)", +"39a9e6c5": "clearRequests()", +"39aa7599": "ITDollar(uint256,string,uint8,string)", +"39aaba25": "get_status()", +"39ac2d9b": "SuperTroopersRTscore()", +"39ac3300": "EtalonTokenPresale(address,address)", +"39ac7a08": "isMember(address,address)", +"39ad0212": "purchasers(address)", +"39ad8847": "fifth_withdrawal(uint256)", +"39ade9aa": "dDeployBallot(bytes32,bytes32,bytes32,uint256)", +"39ae662c": "setFactors(uint256,uint256,uint256,string)", +"39aee3b1": "CCCoin()", +"39af0513": "backlog()", +"39af0a81": "OPENCUKUR()", +"39b09ed8": "is_owned(uint256)", +"39b0b6c2": "updatePosition(address,int256,uint256)", +"39b0bc59": "getNonce(address,uint256,bytes)", +"39b0bde9": "Constrctor()", +"39b21937": "issue(address,bytes32)", +"39b22120": "contractBurn(address,uint256)", +"39b2447e": "addCutie(uint40,uint256)", +"39b25269": "makeOrder(address,address,uint256,uint256,address,uint256)", +"39b25ad1": "XcelToken(address)", +"39b26735": "TicTokenERC20()", +"39b333d9": "Play(uint8,uint8,uint8,uint8)", +"39b35753": "authCancel(address)", +"39b37ab0": "fee(uint256)", +"39b3fba8": "setRabbitData(uint256,uint32,uint32,uint32,uint256,uint8,bytes32,bytes32)", +"39b50688": "cancelSellOrder()", +"39b55e74": "developReserveAllocation()", +"39b57835": "multWee(uint256,uint256)", +"39b5ca6d": "MintFinished(address)", +"39b61914": "DescriptionPublished(string,address)", +"39b651c6": "paymentContractAddress()", +"39b6b1e5": "cancelBid(address,uint256)", +"39b73122": "createDataset(string,uint256,string)", +"39b73771": "_b3(string,uint256)", +"39b7e62f": "GENPCoin()", +"39b80e1b": "recoverAddressFromCommonSignature(bytes32,uint256,address,address,uint256,address,address,uint256,bytes)", +"39b83b68": "allowBank(string,address,bool)", +"39b860d9": "findPlayerIndex(address,uint256)", +"39b8ce98": "weiCollected()", +"39b8dc40": "sunsetWithdrawalPeriod()", +"39b8e0ff": "proposeAllocation(address,address,uint256)", +"39b8e63c": "getPI_edit_9()", +"39ba645b": "revokeKYC(address)", +"39bbaed2": "SNOOP()", +"39bc91fa": "OwnerICOsupply()", +"39bea1f0": "coindropsWallet()", +"39bef274": "setRegionCoordinates(uint256,uint256,uint256,uint256,uint256)", +"39bf03b4": "NBAOnlineLaunchPromotion()", +"39bf5462": "MANHATTANPROXYWSHWY()", +"39c09753": "setBombAddress(address)", +"39c0c415": "toB32(uint256,uint256)", +"39c0ea6e": "rateProperty(uint256)", +"39c0f29d": "laxToken()", +"39c1852d": "withdrawal_party_b_gets()", +"39c2697c": "DELIVERED_FEE_FLAG()", +"39c27bd4": "substr(string,uint256,uint256)", +"39c28e82": "SSPParametersChanged(address)", +"39c294be": "minMargin()", +"39c2f6a0": "setConfiguration(uint256,uint256,uint256,int256)", +"39c38266": "manualBuy(address,uint256)", +"39c480c9": "endDate2()", +"39c5a13e": "secondVestAmount()", +"39c5dde6": "setInitialOwners(address[],uint256[])", +"39c5f3fc": "getNetworkId()", +"39c64f1b": "setPOOL_edit_5(string)", +"39c65ca6": "updateDates(uint256,uint256,uint256,uint256)", +"39c670f0": "claimedAirdropTokens(address)", +"39c73169": "totalSupplySale1()", +"39c7967d": "vote(address,uint256,uint256,string)", +"39c79cfc": "HJHToken(uint256,uint256)", +"39c79e0c": "close(bytes32)", +"39c7a376": "LogCreate(address,uint256,uint256)", +"39c7b6fc": "getMaxSend()", +"39c98a1b": "getCarOwner(uint32)", +"39c9ffe3": "deleteTeam(bytes32)", +"39ca6e86": "registryBase()", +"39cace6d": "PradxToken()", +"39caf7bb": "makeSwap(address,uint256,bytes32)", +"39cc8a8e": "GorToken()", +"39ccdd49": "createRef(bytes32,string)", +"39cd9dba": "KiwiCoin()", +"39cdde32": "ecverify(bytes32,bytes,address)", +"39ce3983": "debatingPeriod()", +"39ce743e": "replaceCharacter(uint16,uint16)", +"39cef0b7": "issueTokensForAssets(uint256)", +"39cfc56a": "ETHERanate()", +"39d00f12": "transferTokens(uint256,address[],address)", +"39d05fdd": "cetokToken()", +"39d08c2a": "saleOngoing()", +"39d1f908": "actualBalance()", +"39d2036d": "_validateMaxSellAmount(uint256)", +"39d20a5f": "read_user(address)", +"39d216f2": "chefOwner()", +"39d26051": "getOrCacheTargetReporterGasCosts()", +"39d2be30": "setDistributedAutonomousExchange(address,address)", +"39d319e5": "unblockUser(address)", +"39d31e14": "CoroToken()", +"39d34323": "product3_sell()", +"39d396b5": "amountRemaining(bytes32[])", +"39d428ea": "AddToken(address,address,uint256,bool,uint256)", +"39d4e21a": "addToSellList(uint256,uint256,uint256)", +"39d51cc0": "get_testing_index()", +"39d66fc0": "effectiveValue(bytes4,uint256,bytes4)", +"39d8db86": "setICOPhase()", +"39d8dc9b": "BEST()", +"39dad8f5": "minusTourFreezingTime(uint256,uint256)", +"39dba209": "keysRec(uint256,uint256,uint256)", +"39dc5ef2": "depositTokens(address,address,uint256)", +"39dd134c": "advisoryPool()", +"39dd437b": "isWithinICOLimit(uint256)", +"39dea537": "registerNickname(string)", +"39df1608": "setPongAddress(address)", +"39e028ba": "AdviserTimeLock(address,address)", +"39e0c751": "setDiscountStage(uint256,uint256,uint256,uint256)", +"39e1038f": "getaddressfocuscardid()", +"39e1e859": "exchangeRateFUTX()", +"39e20523": "setWriter(address)", +"39e22509": "isCustomerHasKYC(address)", +"39e2637f": "TokenERC20(uint256,string,string,address)", +"39e301ff": "numWinnersToPay(uint32)", +"39e31ceb": "addressNotUpgradable()", +"39e33636": "EKK()", +"39e3407b": "isInFinalState()", +"39e395e2": "bidOnSynthesizingAuction(uint256,uint256)", +"39e3af9b": "isCanceled(uint256)", +"39e3ea83": "checkNotConfirmed(bytes32,uint256)", +"39e44ca4": "oraclize_network_name()", +"39e46ebe": "Quotation(uint256,string)", +"39e4dc18": "sendETH(bytes32,bytes32)", +"39e525f9": "resolveCallback(uint256)", +"39e53ca3": "updateUsersIndex(bytes32,uint256)", +"39e54c34": "_takeOffItem(uint256,uint8)", +"39e5a487": "BETSQUARE()", +"39e613d9": "mintVested(address,uint256,uint256,uint256)", +"39e65b46": "setIsRentByAtom(uint256,uint128)", +"39e7fddc": "feeAddr()", +"39e84cef": "EXT_COMPANY_STAKE_TWO()", +"39e851a3": "_isApproved(address,uint256)", +"39e899ee": "setWhiteList(address)", +"39e8bd48": "killMeshPoint(address,address,string,address)", +"39e8d1a4": "round1EndTime()", +"39e9eda1": "BackupChanged(address,address)", +"39ea68ba": "transferEntityOwnerPush(address,address)", +"39eabf7f": "bar(string,string)", +"39eb3491": "getMaximumPlayers()", +"39eb54d2": "bookExtendedVisit(uint256)", +"39eba5f9": "XXXXXXXX02(address[],uint256)", +"39ec68a3": "getRound(uint256,uint256)", +"39ecacac": "addContribution(address,uint256)", +"39ecc94f": "scamStampTokenAddress()", +"39eda73b": "jsonUpdate(string,string,string)", +"39edb660": "priceForDate(uint256)", +"39ede2b1": "SubmitNote(string)", +"39ef16f2": "Test2J()", +"39ef9105": "PhenixToken(uint256,string,uint8,string)", +"39efa270": "setClout(address)", +"39f05521": "withdrawVestedTokens()", +"39f165c6": "ParticipantAdded(address,uint256,uint256)", +"39f36220": "addThing(string,bytes32,string,string)", +"39f47875": "totalAmountOfWeiPaidToUsers()", +"39f4da78": "setSucessor(address)", +"39f4debc": "fillOrderAuto()", +"39f5b6b6": "fundsTreasury()", +"39f636ab": "changeRequiredSignatures(uint256)", +"39f64289": "quarter2()", +"39f64b52": "calcTokenPrice()", +"39f663ec": "isFundingFailState()", +"39f73a48": "fee2()", +"39f8e560": "setRewardAddress(address,address)", +"39f931b2": "placesSold()", +"39f95e63": "finaliseICO()", +"39fb1043": "_callRecipient(address,address,address,uint256,bytes,bytes,bool)", +"39fb435d": "initSiteSet(uint256)", +"39fc04f4": "setGftFundWallet(address,address,uint256)", +"39fc978d": "createCeleb(string,uint256,uint256[6],uint256[6])", +"39fd2003": "QPSEToken()", +"39fd615c": "complexityForBtcAddressPrefixWithLength(bytes,uint256)", +"39fdc5b7": "setExpectedStart(uint256)", +"39fded47": "Swap(address)", +"39fdf2fd": "OVERALLSOLD()", +"39ff8ff9": "CreatedBallot(address,uint256,uint256,bytes32)", +"39ffb234": "createContractScientist(string)", +"39ffd774": "getNamelessTouches()", +"39ffe67c": "withdrawOld(address)", +"3a000f23": "preallocate()", +"3a0046a3": "preIcoTokenHolders(address)", +"3a015ef9": "transferpoints(address,uint256)", +"3a01e53a": "getActivity(uint16)", +"3a02263c": "newController()", +"3a024d1c": "withdrawRewardedTokens(address,uint256)", +"3a027b26": "countDownToEndCrowdsale()", +"3a02a2cc": "addValidated(address)", +"3a03171c": "HARD_CAP()", +"3a031bf0": "getIsLocalOperator(address,address)", +"3a035edf": "sendWinnerPriceToAll(uint256,uint8)", +"3a03ce87": "lockBatch(address[],uint256[],uint256[],uint256[])", +"3a051334": "adjustMOTFeeDiscount(uint256)", +"3a05369f": "getMax(uint32[])", +"3a060bc9": "isOnLent(uint256)", +"3a062acd": "LogEscrow(uint256)", +"3a067e64": "transferJackpot(address)", +"3a079bda": "AmethystCoin()", +"3a07e78a": "icoIsFinishedDate()", +"3a080e93": "rebondFromUnbonded(address,uint256)", +"3a089d17": "addressLength(address)", +"3a0936ce": "contributeMsgValue(uint256[])", +"3a0a377b": "new_id()", +"3a0aec6c": "distributeDEXT(address[],uint256,uint256)", +"3a0d6350": "batchTransfer()", +"3a0d649a": "fundsToBank()", +"3a0e0418": "Prepare()", +"3a0e2475": "etherDonation(bool)", +"3a0f12dc": "grantTokensByShare(address,uint256,uint256)", +"3a0f5500": "lastBlock_a6Hash_uint256()", +"3a1053a1": "TokenBlockPay()", +"3a10a614": "get_hidden_layers(uint256[])", +"3a11aa20": "mutiSendETHWithSameValue(address[],uint256)", +"3a11b6cf": "AnotherParticipant(address,uint256,uint256)", +"3a122e65": "SPECTRUM()", +"3a12e933": "startPublicSale(uint256,uint256)", +"3a134c00": "isFreeTransferAllowed()", +"3a1460ac": "mint(address[16],address,uint256)", +"3a14bf4c": "binomial(uint256,uint256)", +"3a15021a": "confirmAndForwardOnBehalf(address,uint256,bytes,bytes32,uint256[2],uint8[2],bytes32[2],bytes32[2])", +"3a157860": "freezeBlock()", +"3a15bbee": "changeInvestmentFee(uint16)", +"3a15e7ca": "migrateFromLegacyRepContract()", +"3a16c51e": "readyOracles()", +"3a16e81e": "determinePID(address)", +"3a16f2ef": "crowdsaleStop(bool)", +"3a1767e5": "callerAdd(address,address)", +"3a178d99": "isAvailable(uint256)", +"3a180fee": "sellQuantity()", +"3a190e60": "LeeroyPoints()", +"3a1a635e": "createNewRevision(bytes20,bytes32)", +"3a1ca19e": "get_property_layout(uint256)", +"3a1d9a7d": "secondPriceTime()", +"3a1e08e0": "setAllowedTokens(address,uint256,address[])", +"3a1e7130": "teamBonuses(uint256)", +"3a1e7430": "TestTokenERC20(uint256,string,string)", +"3a20bade": "registerIncome(address,uint256)", +"3a20e9df": "getProduct(bytes32)", +"3a21cb9d": "vestingAgent()", +"3a21ec8d": "bleachPrice()", +"3a22a593": "advisorAllocatedTime()", +"3a22a94d": "lockedTokensOf(address)", +"3a232c2d": "getCurrentBonusInPercent()", +"3a23399c": "getBidCountByToken(address)", +"3a237322": "superchain()", +"3a23a483": "approveTransferManager(address)", +"3a24d701": "doSuicide()", +"3a2524c1": "enableAllowBuy()", +"3a253cee": "removeOwnerRequest(address)", +"3a256daa": "getProposalExecutionTime(bytes32,address)", +"3a257fdc": "checkFwdAddressUpgrade()", +"3a2647cf": "addMessageToQueue(string,string,uint256)", +"3a283d7d": "templates()", +"3a289d1b": "updateEscrowGoalReached()", +"3a2960e1": "numAllocations()", +"3a29c32e": "MCBA(uint256,string,string,address)", +"3a29ff34": "tokenClaims(bytes32,address)", +"3a2a0af2": "MCSToken()", +"3a2b4cdf": "addAgree(bytes32)", +"3a2b9c37": "GxCallableByDeploymentAdmin(address)", +"3a2bc42b": "fundPrize()", +"3a2c7a37": "ICOstate()", +"3a2d8784": "getDepositMultiplier()", +"3a2f1289": "BitQuickpay()", +"3a2f6e57": "transferAnyERC20Token(address,int256)", +"3a300490": "MarkRead()", +"3a300d6b": "updateAccountAmount(uint256,uint256)", +"3a30452a": "withdrawOverflow(address)", +"3a306682": "GSContract(uint256)", +"3a30cdec": "postWalletPayment(uint256)", +"3a311b84": "SimpleNameService()", +"3a31427b": "AcceptTxTaskEvent(address,uint256)", +"3a314b24": "SendETH(address)", +"3a319eff": "NZToken()", +"3a323bdf": "internalBurn(address,uint256)", +"3a32a387": "lockAmount(bytes32,bytes32,bytes32)", +"3a333d30": "TelewaveCoin()", +"3a338256": "getarg_1()", +"3a344ab8": "DragonToken(address)", +"3a349d20": "getOpenBidsByLine(bytes32)", +"3a34f09a": "getRandom(uint8,uint8,address)", +"3a357b1d": "isCrowdSaleStateICO()", +"3a36399e": "address1()", +"3a3650cf": "eurRaised()", +"3a365403": "maxWeis()", +"3a373db7": "batchTransferToken(address,address,uint8,bytes32[])", +"3a375a92": "allowsAllowance()", +"3a377c82": "_magic(uint256)", +"3a37a917": "KHCToken()", +"3a38a08c": "verifyOperation(address,uint32)", +"3a38b90f": "fusionChibis(uint256,uint256,uint256,string,string,uint8)", +"3a393ed3": "claimReward(uint256,address,address,address,address)", +"3a3ab672": "isOnWhitelist(address)", +"3a3af53f": "getMasterNodes(address,uint256)", +"3a3b0382": "PLATFORM_FUNDING_SUPPLY()", +"3a3b955b": "enableExchange(uint256)", +"3a3bc0cb": "feeCoownerAddress()", +"3a3bdf56": "claimOwnerFee(address)", +"3a3cd062": "clientWithdraw(uint256)", +"3a3d12d4": "numberOfItemsForSale()", +"3a3d523f": "setTokenLogic(address)", +"3a3e49fe": "referalAirdropsTokensAddress()", +"3a3e8e84": "getAuthorizer(uint256)", +"3a3eaeef": "repayBorrowFresh(address,address,uint256)", +"3a3eda84": "blockNumberForVictory()", +"3a3f7279": "getProductRetailer(uint256)", +"3a3f8239": "claimOrder(uint256)", +"3a3fdf05": "remainAirdrop()", +"3a4027bb": "createWithReward(string,bool,uint256,address)", +"3a40c544": "exchangeERC20(address,address,uint256)", +"3a4148de": "setPreSalesSpecialUser(address,uint256)", +"3a4268e7": "doCall(bytes32,address)", +"3a42f7de": "changeShop(address)", +"3a447341": "SplendSale(uint128,uint128,uint128,uint128,uint256,uint256,uint128,uint128,uint128,uint128,address,address,address,address,address,address)", +"3a45268b": "LocklistAddressenable(address)", +"3a45af86": "modifyProductLimit(bytes32,uint256)", +"3a45d3ef": "setAllowanceBeforeWithdrawal(address,address,uint256)", +"3a4634e4": "changeCrytiblesAddress(address)", +"3a470b9e": "removeAccountMinter(address)", +"3a47de24": "Match()", +"3a47e629": "nCurves()", +"3a48f8c1": "removeFreelancer(address,uint256[],address)", +"3a49b95a": "getMyInvestment()", +"3a4a4233": "how()", +"3a4a921e": "revokeVested()", +"3a4ac6c7": "calculateCardHolderDividend(uint256)", +"3a4ac98a": "tokensToEth(uint256,bool)", +"3a4b3664": "ownerBurn(uint256)", +"3a4b4532": "comission()", +"3a4b5e6d": "disallowOwner()", +"3a4b66f1": "stake()", +"3a4b948f": "hardBurnSMS(address,uint256)", +"3a4bece2": "CollectFromTransaction(address,uint256)", +"3a4c11b0": "setHydroStakingMinimum(uint256)", +"3a4cb854": "BrehonContractFactory()", +"3a4cba05": "SetCustomerInfo(uint64,bytes18,bytes32,bytes11)", +"3a4dcc88": "TronToken(address,address,uint256,string,uint8,string)", +"3a4de190": "repost(bytes32)", +"3a4e3342": "rate_BTCUSD()", +"3a4f6999": "maxNumber()", +"3a4faf7f": "max64(uint64,uint64)", +"3a50083d": "getRealXaurCoined()", +"3a500ae7": "JOYToken()", +"3a501155": "crowdSaleBalance()", +"3a50ccb7": "getMilestoneBonus()", +"3a5167e9": "forwardCollectedEther()", +"3a518b95": "functionName4(bytes32)", +"3a51d246": "getBalance(string)", +"3a525983": "TotalICOSupply()", +"3a531998": "getDisputeRoundDurationSeconds()", +"3a537b0c": "deliver(address,uint256)", +"3a5381b5": "validator()", +"3a551c6d": "HarborPresale(address,uint256,uint256,uint256,address,uint256,uint256,uint256)", +"3a559de6": "iGniter()", +"3a55f1f1": "BitcoinBravado()", +"3a562b78": "getOwnTokens(address)", +"3a573e02": "_badgeTotalSupply()", +"3a579abc": "withdrawTokensForEtheeraTeam(uint256,address[])", +"3a57e698": "registerGuide(address)", +"3a5860c4": "ETHERCExchange()", +"3a5b2080": "updateEducation(uint256,string,uint16)", +"3a5b5bde": "encrypt(string)", +"3a5d73d1": "airdrppReward()", +"3a5dd603": "chunk2IsAdded()", +"3a5e2576": "updateOwnerPercentage(uint256)", +"3a5ec2f8": "lemonsDroppedToTheWorld()", +"3a5eefc0": "EOSpace()", +"3a5f32cd": "updatePriceFreq()", +"3a600ce7": "sendToken(address,address)", +"3a60703b": "_transfer(uint256,address,address,uint256)", +"3a6120c5": "stopThinking(uint256)", +"3a6128db": "setLLV_edit_5(string)", +"3a6157cf": "richDatabase(uint256)", +"3a61738d": "calcReward(address)", +"3a618d26": "triggerRsclearRefund()", +"3a61dbfe": "ownerAddWorkRecord(address,uint256,bytes16)", +"3a621018": "unFreezeAccounts(address[])", +"3a62244f": "activateTransfers()", +"3a629ab3": "issueToken(address,string,string,uint8,uint256)", +"3a62a9d7": "AddressRegistered(address,string)", +"3a62cd2e": "currentCapEther()", +"3a62f663": "getAllPelvic()", +"3a63d886": "resource()", +"3a645c6d": "getLastTranche()", +"3a6514c8": "OddCoin()", +"3a669dd9": "TokenVesting(address,uint256,uint256,uint256,bool)", +"3a66caef": "ColuLocalCurrency(string,string,uint8,uint256,string)", +"3a672722": "ccSupply()", +"3a674500": "finalizeApprovedContracts()", +"3a677696": "setMigrateFrom(address)", +"3a67a0f6": "disableTransfers()", +"3a689082": "withrawFee()", +"3a693759": "changeRescueAccount(address)", +"3a6991ce": "luckVegas(uint256)", +"3a699294": "Schmeckle()", +"3a69ab39": "getItemId(bytes4)", +"3a69db94": "multiDynamic(uint256[2][])", +"3a6a0474": "VisualTechnologyToken()", +"3a6a2a69": "lockAssetHolder()", +"3a6a43f4": "marketingTokenAllocation()", +"3a6a4d2e": "distributeFunds()", +"3a6ab569": "setMemberInfo(address,bytes32)", +"3a6ddf70": "sendit(address,uint256)", +"3a6e3d98": "calcCommission(uint256)", +"3a6eb318": "getMiningReward(uint256)", +"3a6f85b1": "TIER2_BONUS()", +"3a6fbacb": "currentAmountReceivedDeposit1Ether18Decimals()", +"3a6ffc92": "GetBetResult()", +"3a70491e": "incrementBattles(uint256,bool)", +"3a70eabd": "GetMinerUnclaimedICOShare(address)", +"3a7104d1": "updateFlag()", +"3a71386f": "functionName2(bytes32)", +"3a7221e0": "bestInvestorInfo()", +"3a72cd49": "preSaleFinishedProcess(uint256)", +"3a7327a3": "setAccessLevel(address,uint256)", +"3a7343ba": "setBeneficiary(address,uint256,uint256,uint256)", +"3a73b0ad": "HypeToken()", +"3a740a63": "getBonus(address)", +"3a74a767": "_setAdmin(address)", +"3a74b05b": "changeDesigner(address)", +"3a74c05b": "updateMasternode(uint256)", +"3a750183": "_commitHash(bytes32)", +"3a752c31": "HARDCAP_TOKENS_PRE_ICO()", +"3a7562ee": "addLegitRaceAddress(address)", +"3a762f73": "getRunningRazInstance(uint256)", +"3a764462": "enableTokenTransfer()", +"3a76a282": "getBlocksTillMatthew()", +"3a76abff": "_eraseNode(uint256,bytes32[],bytes32)", +"3a7749c0": "bonusRatePeriodTwo()", +"3a774b48": "register(address,uint256,uint256,uint256)", +"3a777ce0": "_C_sendToToteLiquidatorWallet()", +"3a77c91a": "setNotes(string)", +"3a789ffb": "setMinAndMaxEthersForPublicSale(uint256,uint256)", +"3a78e324": "updateIsAttached(uint256,uint256)", +"3a79311f": "Ploutos()", +"3a79a55c": "needsLotteryFinalization()", +"3a7a1ba9": "EscapeHatchCalled(uint256)", +"3a7a302c": "LogCrowdsaleStarted()", +"3a7a52d2": "HasCard(address,uint32)", +"3a7bd7b5": "isMixGen()", +"3a7befc6": "checkUserTokenBalance(address)", +"3a7c92af": "LogWeekRate(uint32,uint256)", +"3a7d22bc": "getElement(uint256)", +"3a7d280c": "login(string)", +"3a7d8df3": "ClubToken()", +"3a7e6854": "setnewPlayerFee(uint256)", +"3a7f5e2c": "LogFundsUnlocked(address,uint256,uint256)", +"3a7fb796": "mintGreen(int256,address,uint256)", +"3a80bd25": "CoinVillaTalk()", +"3a830a96": "Leimen()", +"3a8343ee": "confirmCustodianChange(bytes32)", +"3a838636": "withdrawTeam(address)", +"3a842044": "getDeviceById(uint8)", +"3a8468f7": "isToOffChainAddress(address)", +"3a84f002": "commitDispute(uint256)", +"3a8504b5": "NewSale(address,uint256,uint256,bool)", +"3a876e88": "setMDAPPSale(address)", +"3a878528": "setlvlNominalValue(string)", +"3a88594d": "isOptionPairRegistered(address,uint256,address,uint256,uint256)", +"3a8a0a5c": "prizeMoneyAsset()", +"3a8a7907": "getbetData(int8,int8,address)", +"3a8ac516": "toKiwi(uint256)", +"3a8b069e": "depositCreator()", +"3a8ba4f6": "removeResolvers(address[],bool)", +"3a8bcc91": "startPrice(uint256)", +"3a8c5065": "developer_add_Exchanges(string)", +"3a8d1eb1": "creditWinner()", +"3a8d6e5e": "viewKYCAccepted(address)", +"3a8ed5c4": "deathFactor_v()", +"3a8f1585": "createChannel(uint256,address,address)", +"3a8fdd7d": "getExchangeCost(address,address,uint256,bytes)", +"3a903dfa": "LEYBAERT()", +"3a911d30": "getAppsCount(address)", +"3a9143e6": "CCHToken(uint256,string,string)", +"3a91db97": "onNewCampaign(uint256,address)", +"3a920766": "WALLET_TEAM()", +"3a9214d2": "AsiaPropertyCoin()", +"3a9253a3": "BurnMe(address)", +"3a92a590": "YuanTaiToken(uint256,string,uint8,string)", +"3a9407ec": "abstractFunc()", +"3a94ab31": "_upgradeTo(uint256,address)", +"3a95152d": "getEvaluationCountByStudentID(uint32)", +"3a9588ba": "changeOwnerWithTokens(address)", +"3a95a332": "left57(uint256)", +"3a95a3c8": "init(uint8,uint256)", +"3a963033": "_addIndexGame(address)", +"3a96d16d": "setInitialAllocationTimelock(address,uint32)", +"3a96df81": "bbwallet()", +"3a96fdd7": "compare(string,string)", +"3a98c533": "getElementOwners(uint256[])", +"3a98ef39": "totalShares()", +"3a9c0ae7": "issueDividendReward()", +"3a9c7d3d": "maxMultiplierByAddress(address)", +"3a9c9ffc": "historyCount()", +"3a9d8be8": "moveAccountOut()", +"3a9db5a7": "_withdrawBonus(address)", +"3a9de0b8": "settleDevFund(uint256)", +"3a9e7433": "scheduleCall(bytes4,uint256,uint256,uint8)", +"3a9e9d0d": "prizeCooldowns(uint256)", +"3a9ebefd": "decrement(uint256)", +"3a9eea12": "Impressio()", +"3a9f967e": "TOKENS_SOFT_CAP()", +"3aa0145a": "getFinalAmount(uint256,uint8)", +"3aa0396a": "mintFromICO(address,uint256)", +"3aa0eafb": "registrarUsuario(bytes32,bytes32,bytes32,bytes32)", +"3aa2ad63": "_setPlayerId(uint256,uint256)", +"3aa36dd4": "GetSaleInfo_Presale(uint8)", +"3aa3f154": "TokenSale(address,address,uint256,uint256)", +"3aa3f75a": "isOpenForSale()", +"3aa435a5": "DST_TEAM()", +"3aa4868a": "computeCacheRoot(uint256,uint256,uint256[],uint256[],uint256)", +"3aa49656": "phase2MaxEtherCap()", +"3aa51e41": "vaultFunds()", +"3aa5f4f7": "changeTokenSettings(uint16,uint256,uint256)", +"3aa5fe59": "hashAddress(address)", +"3aa612b9": "FT_TEAM_FUND()", +"3aa6608e": "processOrder(uint128,uint256)", +"3aa6c4f9": "withdrawableBalanceOf(address)", +"3aa6f0ee": "getRedemptionRequest(uint256)", +"3aa718d5": "changeDeveloperCATDestinationAddress(address)", +"3aa7429c": "TestX()", +"3aa89e83": "preICOActive()", +"3aa90889": "frozenPauseTime()", +"3aa935cb": "setDonationProportion(uint256,uint256)", +"3aa9376c": "releaseTokenSaleJM(address,uint256)", +"3aa94b1d": "getCoinStats(uint256)", +"3aaa36e6": "Fees()", +"3aaa3f24": "setPhaseSold(uint256,uint256)", +"3aaa74b2": "withdrawTips()", +"3aab3306": "SmartController(address)", +"3aab47b2": "UnpackDOT(bytes)", +"3aac430c": "TAKE()", +"3aac7661": "changeMonsterNickname(uint256,string)", +"3aaec03d": "kingGladiator()", +"3aaec5c5": "addToWhiteList(address[],uint256)", +"3aaf1898": "supplement(uint256)", +"3aaf3232": "maxRoundDelay()", +"3ab1a494": "setWithdrawAddress(address)", +"3ab1b765": "MainstreetCrowdfund(uint256,uint256,uint256,uint256,uint256,address,address,address,address)", +"3ab1e703": "roundMoneyDown3SF(uint256)", +"3ab207a3": "Flash()", +"3ab2dcec": "countCows()", +"3ab337b9": "addData(uint8,string,string,string)", +"3ab3bfc1": "splitFunds(string)", +"3ab4c395": "STARTING_SQUIRREL()", +"3ab50a9c": "getVersion(string)", +"3ab55c44": "getCurrentTokenPriceICO(uint256)", +"3ab562f2": "nextTarget()", +"3ab5657d": "getSourceConstraint(uint256,uint256,uint256)", +"3ab58703": "coldStorageYears()", +"3ab64c33": "beneficiaryMultiSig()", +"3ab71189": "_detailsLength()", +"3ab81062": "GOGO()", +"3ab89b78": "testFailHitPresaleCapPreDistribute()", +"3ab8e61a": "querybalance2()", +"3ab8ee2f": "HonestisnetworkICOregulations()", +"3ab966f4": "lastTokenPriceWei()", +"3aba9e9b": "WiredToken()", +"3abbf56a": "_setHourlyValueDecayRate(uint128)", +"3abc2106": "suicideContract()", +"3abcf3e7": "checkAssetListLength()", +"3abd0136": "totalBuyers()", +"3abd3a68": "summPartnershipsAndExchanges()", +"3abd8e4e": "getother()", +"3abdad4e": "totalCascadingPercentage()", +"3abdf792": "BATTLE_POINT_DECIMALS()", +"3abe2280": "updateTemperature(uint8)", +"3abee034": "emitRLC(uint256)", +"3abf30fc": "hash(bytes32,uint256)", +"3ac07183": "setDeprecated(bytes32)", +"3ac0feac": "getApprovedProposals()", +"3ac14078": "SEEDWhitelist()", +"3ac140e8": "distributorCount()", +"3ac163a7": "RepToken(address,uint256,address)", +"3ac19acf": "GenChipLevel_General(uint256,uint256,uint256)", +"3ac256d8": "getCurrentMilestonePostponingProposalDuration()", +"3ac2f3cc": "YinchengToken(address,address)", +"3ac31e02": "icoBalance()", +"3ac39d4b": "updateDarknodeDeregisteredAt(address,uint256)", +"3ac3a2fe": "teamPrizeClaim(uint256)", +"3ac4217c": "setJackpot(address,uint256)", +"3ac46b25": "getWithdrawableAmountPES(address)", +"3ac46e6b": "Irb()", +"3ac4aeeb": "amountFunded(bytes32,string,address,address)", +"3ac5cb73": "GeometricPonzi()", +"3ac6dd9d": "createPromotionalPurchase(uint256,uint256,address,uint256)", +"3ac70266": "setType(uint256,uint256)", +"3ac7d6fe": "pendingAddress()", +"3ac7fe84": "TestUtils()", +"3ac87121": "currentWorkStagePercent()", +"3ac8858b": "setMinimalBet(uint256)", +"3ac8b026": "storeShip(uint16,uint16,uint8,uint256,bytes32)", +"3ac8ca63": "beginContrib()", +"3ac9a77a": "createGen0Auction(uint256,uint16,uint16,uint16,uint16,uint16)", +"3ac9dfa3": "AgrolotToken()", +"3aca3788": "UCCoinSaleIsOn(uint256)", +"3aca9ffd": "createNewMsgAwaitingAudit(string,uint256)", +"3acab680": "SafeMath()", +"3acacfbe": "capitalFundable()", +"3acbd9eb": "doesOwnBase(bytes32,address)", +"3acbe450": "sow(uint256)", +"3acc2712": "partialUnlockAngelsAccounts(address[])", +"3accb428": "distributionMinter()", +"3acce2b2": "addRecord(string,address,string,address)", +"3acd8b80": "initExAlice(address,uint256)", +"3acddfc1": "marker()", +"3acde419": "addSellOrder(uint256,uint256)", +"3ace049e": "allowedSenders(uint256)", +"3acf4f9f": "ownershipUnits(bytes32,address)", +"3acf597c": "globalParams()", +"3acfad2b": "toB32(uint256,address,bytes)", +"3acfc185": "moduleAddress(string)", +"3acfd909": "getOption(string)", +"3ad0486b": "Token_1()", +"3ad04d8f": "setupFundingTime(uint256,uint256)", +"3ad06d16": "upgradeTo(uint256,address)", +"3ad075ea": "maximumSellableTokens()", +"3ad0d840": "setAvailableSeats(uint256)", +"3ad10beb": "cup()", +"3ad10ef6": "devAddress()", +"3ad14af3": "add(uint32,uint32)", +"3ad15258": "getProfits()", +"3ad17019": "changeDepositStopTimeFromNow(uint256)", +"3ad17f6d": "getWinnerAndBestMinorty()", +"3ad213e0": "connectOrderUser(address,address,uint256,address)", +"3ad359cf": "setDelegateWallet(address)", +"3ad389f2": "SanJaviercoinforwe()", +"3ad49222": "getMinimumAmount(address)", +"3ad520d8": "interestArray(uint256)", +"3ad55b83": "Tyzon()", +"3ad5b3a2": "createFunding(address,uint256,uint256,uint256)", +"3ad6f8ac": "getMaxClaimableWeiAmount()", +"3ad77392": "getTiersData(uint256)", +"3ad7c15c": "setDefaultClaimPercentage(uint256)", +"3ad84c89": "TXOsaleTwo()", +"3ad9248c": "fillInvestorAccountWithBonus(address)", +"3ad9801d": "importReward(address,uint256)", +"3ad9a928": "setFeePercent(uint256,address)", +"3ad9f722": "sendPoolMoney(uint256)", +"3ada121c": "Ballot(address)", +"3adb2de7": "bet_this_spin()", +"3adb3ad5": "querySeed(uint256)", +"3adbb3a4": "mint(uint32,uint32,uint32)", +"3add5a99": "getContractCreationGas()", +"3adda69a": "doBuy()", +"3addedd3": "getCostForAttack(uint8)", +"3adf7280": "getTotalHashRate()", +"3adf96d7": "_createProxy(address)", +"3ae01f84": "USDOracle()", +"3ae033a0": "payBounties(address[],uint256[])", +"3ae0e63f": "BtradeWhiteList()", +"3ae15692": "EEFcoin(address)", +"3ae1786f": "returnTokens(uint256)", +"3ae192bd": "changeFactorySubscriptionFee(uint256)", +"3ae2119b": "selfKill()", +"3ae24412": "addAddWhitelist(address)", +"3ae25075": "_getBonusAmount(uint256,uint256)", +"3ae26afa": "getRate(bytes32,bytes)", +"3ae34403": "stage1Bonus()", +"3ae46aed": "UruguayvsPortugal()", +"3ae49204": "setWaracoinPerEther(uint256)", +"3ae4b008": "createBounty(string,address[],uint256)", +"3ae50ce7": "createPresaleUnicorns(uint256,address)", +"3ae69708": "cryptaurBackend()", +"3ae7cdfa": "fipsLegacyRegister(bytes20[],address)", +"3ae7f938": "hash(uint256,uint256,uint256,uint256)", +"3ae83bd4": "transferFreeze()", +"3ae9133d": "coupon(uint256,uint16,uint8,bytes32,bytes32)", +"3ae983a8": "OriginalMyAccessControl()", +"3ae9b510": "getLatestMajorTree(bytes32)", +"3ae9de9b": "StatusSecurity()", +"3aeac4e1": "withdrawToken(address,address)", +"3aeaccf5": "Address()", +"3aeb512c": "updateTranscoderWithFees(address,uint256,uint256)", +"3aeb6c71": "vestingPercent()", +"3aeb850a": "DaysTillUnlock()", +"3aebe2a3": "GluuTokenCrowdSale(uint256,uint256,uint256,uint256,uint256,uint256,address,address,uint256,address,address,address)", +"3aec4439": "NSCBurnToken()", +"3aec5458": "callEmitter(uint256)", +"3aecca37": "newManuscript(bytes32,string,address[])", +"3aecd0e3": "getTokenBalance(address)", +"3aedded5": "PUBLIC_SALES_3_RATE()", +"3aedf90a": "wei_raised()", +"3aedfb8b": "withdrawl()", +"3aee0254": "addWinner(uint256)", +"3aee69bb": "changeTeamAddress(address)", +"3aef157b": "wingsTokensReward()", +"3aef3900": "proposalContract()", +"3aefaa75": "computeHash(string)", +"3aefaeb8": "setTransferRate(uint256)", +"3af05903": "deleteApprovedWalletAddress(address)", +"3af0dbc1": "contributionsOf(address)", +"3af1e17e": "createCelebrity(string,address,address,uint256,uint256,bool,uint256[])", +"3af242fd": "_createTrainer(string,uint16,address)", +"3af2b770": "BOBOTOKEN3()", +"3af32abf": "isWhitelisted(address)", +"3af34254": "LogChangeAccountAddressForSponseeAddress(address)", +"3af39c21": "undefined()", +"3af3c72d": "changeBonusUntilDate(uint32)", +"3af3db55": "channelValidator(uint64,uint64)", +"3af3f24f": "totalCalls()", +"3af41dc2": "adminDeleteRegistry()", +"3af5b3aa": "month48Unlock()", +"3af5dbb6": "mandateInBlocks()", +"3af6486e": "testStartNewCampaign()", +"3af690c2": "claimId(bytes32,uint256)", +"3af74940": "setRemainingTokenHolder(address)", +"3af75ee1": "storeBlockWithFee(bytes,int256,bytes,int256)", +"3af76638": "deployAndSetANT(address)", +"3af7d71c": "LogN(address,bytes32,uint256,string,bytes,uint256,bytes1,uint256)", +"3af826a4": "auctionCancel(uint256)", +"3af8286f": "ContractFPC()", +"3af8470d": "Rate6()", +"3af88261": "deleteTokens(address,uint256)", +"3af8e4ab": "backupOwner()", +"3af90f35": "requiresAuction(bytes32)", +"3af91491": "convertMinimalToSignal(uint256)", +"3af923ff": "CreateRCN(address,uint256)", +"3af946d2": "testnetWithdrawn(address,uint256)", +"3af94817": "getPongvalRemote()", +"3af9e169": "setStartIcoMainICO(uint256)", +"3af9e669": "balanceOfUnderlying(address)", +"3af9f8ac": "ArrowCOin()", +"3afa476c": "unstash(uint256)", +"3afa895f": "deleteSecondaryAddress(address,address)", +"3afb01d4": "testGetProgress()", +"3afbf039": "pastTenMinutes()", +"3afc7282": "getVoting(uint256)", +"3afd4b5e": "coef()", +"3afd716f": "setVIPLibraryAddress(address)", +"3afdbd83": "Activate(bytes32,string,string)", +"3afdce53": "newCrowdSale(string,string,string,uint256)", +"3afe3a8a": "GetEntityDelegatedRevoker(bytes32,uint8)", +"3b0007eb": "MinterChanged(address,address)", +"3b0107fc": "calculatePerformanceBonus(uint256)", +"3b011b30": "getSeedForTokenId(uint256)", +"3b016d83": "getAllBonus(uint256,uint256)", +"3b01788a": "throwIfSetPresaleTokensAfterActivation()", +"3b0363fa": "summFutureInvest()", +"3b039176": "CreateEvidence(bytes32,string)", +"3b040fb8": "failedKycCount()", +"3b048123": "onlyInEmergency()", +"3b048284": "totalCoinCap()", +"3b0506f7": "getVoteByAddress(address,uint256)", +"3b05a861": "setEthDepositAddress(address,address)", +"3b05c869": "StoreTest()", +"3b066dd7": "BunkToken()", +"3b06903e": "reassignModerator(address)", +"3b06a6fc": "toggleAuthorization(address,bytes32)", +"3b0732a4": "interaddtoken(address,uint256,uint256)", +"3b078de3": "changeIsPayableEnabledForAll()", +"3b079e10": "manualTransferToken()", +"3b0819b8": "create(uint256,uint256,address,address,uint256,uint256,address,uint256,bool)", +"3b08d35e": "setAuditReportBlockNumber(uint256,uint256)", +"3b098c8c": "assertEq13(bytes13,bytes13,bytes32)", +"3b0a895d": "setUsdEthRate(uint256)", +"3b0a9555": "_callReturn(address,bytes,uint256)", +"3b0ad68a": "InitializedToken(address)", +"3b0b037a": "getPriceChange(uint256)", +"3b0c197e": "getBook()", +"3b0d2764": "SNT(address)", +"3b0da260": "revokeVesting(address)", +"3b0da3b8": "updatePolicy2(bytes32,string,uint256,uint32,string)", +"3b0f0f2f": "getReferral(address)", +"3b0f343b": "getDividendAmount(address,address)", +"3b0f3ed3": "attend(uint32,string)", +"3b1019ef": "getAdvisersConsultantsTokens()", +"3b102248": "withdrawFromBalance(address,uint256)", +"3b107682": "DualIndex()", +"3b111bf3": "EtherTwitter()", +"3b116370": "GalacticX(uint256,string,string)", +"3b11b577": "CampaignOpen(uint256)", +"3b130649": "div256_128By256(uint256,uint256,uint256)", +"3b13873c": "addValidationPreSigned(address,bytes32,uint8,bytes32,bytes32,uint256)", +"3b13f8a6": "setDealerCut(uint8)", +"3b143184": "Congress(uint256,uint256,int256,address)", +"3b143b51": "untrustedProposals(uint256)", +"3b14ab12": "GetAquiredAssetBalance()", +"3b15a398": "rewardContributor(address,uint256)", +"3b161361": "VoidAccount(address,address,uint256)", +"3b1663be": "changeAdvisor(address)", +"3b16c27a": "ta()", +"3b16f5f6": "releaseMultiWithStage(address[])", +"3b172a32": "bancorToken()", +"3b172fb9": "AuctusToken()", +"3b17ebb1": "adminAddWinner()", +"3b186bfc": "logFeeWindowRedeemed(address,address,uint256,uint256)", +"3b192105": "_getLastDate()", +"3b19a17d": "resetOrderIdTo(uint256)", +"3b19c868": "BookingUpdate(address,uint256,uint8,uint256)", +"3b19d67a": "dateICO()", +"3b19e84a": "getTreasury()", +"3b1a4170": "cmulpow2(uint256)", +"3b1a520d": "testSimpleBurning()", +"3b1b69f9": "Upgradable(string)", +"3b1b8ca0": "trustedClients(address)", +"3b1bebd1": "referee()", +"3b1cbad8": "getArraySize()", +"3b1cda49": "GetBaseN(uint256)", +"3b1d21a2": "getCash()", +"3b1e2542": "updateToken(uint256,address,uint8)", +"3b1ecef0": "private_getGameState()", +"3b1ede9a": "LOOMIA2_ADDR()", +"3b1ef91c": "NeyrosNetwork()", +"3b1fe51b": "changeTimestamp(address,uint256,uint256)", +"3b20c3f3": "rocketLaunch(uint256)", +"3b215823": "taxFeeBps()", +"3b22263c": "move(uint16,uint8,uint8)", +"3b2269cf": "systemAcc()", +"3b22c8e3": "resolveGameByHand(uint32,uint32)", +"3b23a5ca": "switchStatus(bool)", +"3b242439": "ratioDenominator()", +"3b24b547": "getTransactionData(uint256)", +"3b25a6b9": "processDeposits(address,uint256)", +"3b25cf37": "PintOd()", +"3b265d35": "MatchingEngine()", +"3b270710": "ico1stPrice()", +"3b278f2a": "icoPaused()", +"3b2812ad": "newWindow(uint8,uint256)", +"3b283ff9": "TransferAllowanceFor(address,bool)", +"3b29c470": "calcTokensAvailableToBuyback()", +"3b29fe55": "isSecondLockTimeEnd()", +"3b2aa8cd": "getWeaponEntity(uint256)", +"3b2b7fec": "setCompte_21(string)", +"3b2b8ce9": "setAirdropped(address)", +"3b2dbb7f": "token2Player(address,uint256)", +"3b2e5f94": "getDepositValue(address)", +"3b2f3d4d": "BitCoin(address,uint256,uint256,uint256,address,address)", +"3b2fd34d": "backProjectXOwner()", +"3b2fe781": "sendEth(address[])", +"3b304147": "draw(uint256)", +"3b305964": "accBonusTokens()", +"3b30ba59": "ZRX_TOKEN_CONTRACT()", +"3b31cbad": "ContractFunded(address,uint256,uint256)", +"3b33175b": "setWhitelistIn(address,bool)", +"3b338da0": "getActionsCount(bytes)", +"3b33fe73": "setAuctionPrice(uint256)", +"3b340ceb": "DWEToken()", +"3b343a13": "getNodeAddress(bytes)", +"3b3493d3": "lost()", +"3b355af6": "baseData()", +"3b3561ea": "PresaleCapUpdated(uint256)", +"3b356d71": "playerKiller()", +"3b3571f1": "setMinHouseClassic(uint256)", +"3b357f4e": "determineInviter(uint256,bytes32)", +"3b35cde5": "Genesis(address)", +"3b360c7f": "getInvestorsAndTheirBalances()", +"3b3672bd": "getAddressLength()", +"3b37044d": "WWWToken(uint256,string,string)", +"3b3783e7": "ETHLotteryManager()", +"3b38e7d1": "totalSupplyByAsset(bytes32,int256)", +"3b393b03": "Zorro02Token()", +"3b39becd": "isMainSaleRunning()", +"3b3a1a7a": "tokenIdPointer()", +"3b3ae670": "getBaseRandom()", +"3b3b57de": "addr(bytes32)", +"3b3c0717": "switchRecycleAllowed(bool)", +"3b3c594b": "updateOldToken(address)", +"3b3c5aed": "addSpecialRateConditions(address,uint256)", +"3b3d5b88": "completeUnlock(bytes32,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"3b3d9485": "calcRandomNumber()", +"3b3dca76": "rand()", +"3b3df3d5": "tradeIn(address,uint256)", +"3b3e672f": "transferBatch(address[],uint256[])", +"3b3fa917": "setStartTimePreIco(uint256)", +"3b3fb38b": "rebuySum(address)", +"3b404266": "getDeployAt(uint32,uint32)", +"3b4159da": "voteProposal(address,address,uint256,string,bytes)", +"3b41b5f2": "setTotalProjectEscrow(uint256)", +"3b421f9e": "greeter(bytes32)", +"3b424f09": "setPermission(address,bytes32,bool)", +"3b427b20": "changeWhitelistCornerstoneStatus(address,bool)", +"3b428c9b": "tokenForWei(uint256)", +"3b42dfad": "saleWeiLimitWithoutKYC()", +"3b434169": "setUsdPerHundredEth(uint256)", +"3b43fa0a": "DSAuth()", +"3b441344": "setOtherRich3D(address)", +"3b442edf": "deathData_a14()", +"3b44383f": "TokenERC20(uint256,string,string,uint8)", +"3b45afed": "internalTransferFrom(address,address,uint256,uint256)", +"3b462d5b": "bounty(address[],uint256[])", +"3b46321f": "setMultisendLimit(uint256)", +"3b4656a1": "removeAssociatedAddress()", +"3b4664f0": "addToResult(int256)", +"3b46a7df": "ivote(bool)", +"3b46aca3": "fetchSnapshotBlockByIndex(uint256)", +"3b4700fa": "releaseLockToken()", +"3b470582": "getOverall()", +"3b4719d0": "getJockey(uint256)", +"3b47513b": "onlyWhitelisted(bytes,address,uint256,uint256,uint256)", +"3b478fc5": "ethUsdRate()", +"3b4793fc": "sendGift(address,uint256,string)", +"3b47d37a": "RealTimeRayTracing()", +"3b47dab6": "setSaleMinter(address,uint256)", +"3b4920b8": "batchMintPresaleTokens(address[],uint256[])", +"3b495d6b": "Petcoin()", +"3b496f53": "IssueAccepted(uint256)", +"3b49a77b": "hasConfirmed(bytes,address)", +"3b49c216": "_createSchedule(address,uint256,uint256,uint256,uint256,uint256)", +"3b49f84b": "TokenD(uint256,string,uint8,string)", +"3b4a00b4": "unPauseBuy()", +"3b4a20f2": "getExternalFundsRaised(string)", +"3b4a40cc": "ManagerAdded(address)", +"3b4b7808": "returnEthReceived()", +"3b4c4b25": "setSupply(uint256)", +"3b4cb5e5": "GoldFees()", +"3b4cc7a3": "totalCompanies()", +"3b4d75d8": "withdrawRemainPrivateCoin(uint256)", +"3b4d900a": "NANO()", +"3b4dbf8b": "setSecret(uint256)", +"3b4e06e6": "getTokenAmounts(uint256)", +"3b4e8dbf": "tokenDev()", +"3b4fb68f": "LXKToken()", +"3b52147f": "LogFundsCommitted(address,address,uint256,uint256,uint256,address)", +"3b5251b7": "getPlayerVoteRewards(address,uint256)", +"3b52f2be": "winnersLength()", +"3b53f274": "LogInt(string,uint256)", +"3b540814": "transferFundWallet(address)", +"3b545d2f": "etherToSendCharity()", +"3b5535b9": "getLastWeekStake(address)", +"3b55d26f": "workDone(address)", +"3b561709": "initTransferArr(address[],uint256[],uint256[])", +"3b563137": "transferBeer(address,uint256)", +"3b574beb": "minTokensToBuy()", +"3b57aa90": "setHash(address,uint16,bytes32)", +"3b57fdff": "emitMint(address,uint256)", +"3b58524d": "setAddress(address,address)", +"3b58d5d7": "getPremiumCarSupply(uint256)", +"3b58f49a": "setMinBounty(uint256)", +"3b591ea7": "AmountToForgeTheNextBlock()", +"3b594cd0": "_delegateAssetOwnerRemoved(bytes32,address)", +"3b599b18": "ChainclubToken()", +"3b59cb24": "bulkApproveMints(uint256[])", +"3b5a3357": "transferForFinanceTeam(address,uint256)", +"3b5a938a": "kick(uint32)", +"3b5adcef": "reservedFundsCharging(address)", +"3b5ae589": "Bitcash()", +"3b5b64f4": "conversionsCount()", +"3b5c020d": "BOT_ELEMENT_4()", +"3b5dd70b": "bigBonusPercent()", +"3b5e295c": "maxmoneypercent()", +"3b5e5376": "baseComparable()", +"3b5f24eb": "percentile(uint256)", +"3b5f30db": "EKKChain()", +"3b5fdb83": "buyP3D()", +"3b615624": "getEndorsements(bytes32)", +"3b61db4c": "stopIco(address)", +"3b61f5f5": "ChangeAuctionMaster(address)", +"3b623c19": "StripperToken()", +"3b62545b": "getNBAIWallet(address)", +"3b626b83": "getWidthrawStatFor(string)", +"3b630493": "DAPPToken()", +"3b632a74": "getInterMixed()", +"3b64e77e": "enableCrowdsaleRefund()", +"3b653755": "seedMarket(uint256)", +"3b663195": "init(bytes32)", +"3b664dc7": "addRoleForUser(address,string)", +"3b666e48": "getCurHash()", +"3b668059": "ContractBalance()", +"3b66c415": "EmergencyWithdrawalFailed(address)", +"3b66d02b": "tokenFallback(address,uint256)", +"3b68f8aa": "deleteDonator(address)", +"3b69eed4": "updatePlanetName(uint256,uint256,uint256,string)", +"3b6b639c": "luckyStoneEarning()", +"3b6b9a5e": "fuckingkill()", +"3b6c35c3": "MubsToken()", +"3b6c6c72": "SALE_MIN_CAP()", +"3b6cbaeb": "OverseasReturneesToken()", +"3b6ccee7": "switchMinting()", +"3b6d05c7": "mdtTeamAddress()", +"3b6d2544": "Found(uint8)", +"3b6dde13": "getRandomNumber(address)", +"3b6e2970": "ContractStakeToken(address)", +"3b6e31bb": "isAllowedToUpdateProxy(address)", +"3b6e750f": "isAcceptedToken(address)", +"3b6e8ec3": "doProvideMemoryAccesses(uint256,bytes32,uint256[],uint256[])", +"3b6ea083": "startTimeIco()", +"3b6ed0a7": "processSteps(uint256,uint256)", +"3b6ed992": "STBToken()", +"3b6eeb23": "HighestBidChanged(address,uint256)", +"3b704588": "BCT()", +"3b709e8d": "WeiN()", +"3b70b171": "saveBlock(string)", +"3b70cf44": "firstRoundCosmosEnd()", +"3b7104f2": "checkStatus()", +"3b7169fb": "setopVaultAddr(address)", +"3b72a1b6": "approveDeliverable(bytes32)", +"3b7404bc": "createDepositProxy(address)", +"3b746963": "minLimitPrivateSale()", +"3b750f86": "DDJDTCoin()", +"3b751f7f": "claimThroneRP(string)", +"3b7616ff": "fwdToResolver(bytes)", +"3b76594d": "depositFunds(uint256)", +"3b768433": "getByReferenceCode(bytes32)", +"3b77227c": "_addIndex(address)", +"3b7773cd": "WanchainContribution(address,uint256)", +"3b784e9e": "SafeOwnable()", +"3b789750": "transferAllFunds(address)", +"3b7a3b7f": "thisVotersName()", +"3b7a8ff5": "addInvestors(address[],uint256[],bool[])", +"3b7b9d83": "marketToken2021()", +"3b7bfda0": "boolStorage(bytes32)", +"3b7cbfcf": "depositPercents()", +"3b7d0946": "removePool(address)", +"3b7da659": "changeLocalCryptoContract(address,string)", +"3b7dc55e": "onMintCalled()", +"3b7e9825": "appendArray(uint8[],uint8)", +"3b7f7cfa": "getValidity()", +"3b7f9649": "localsTruth(address,uint256)", +"3b7ff404": "getVotersPartyVote()", +"3b809273": "unlockedReserveAndTeamFunds()", +"3b80938e": "setDeposit(address)", +"3b80fac0": "updateVisa(address,uint256,uint256,bytes32,uint256,uint256,uint256,uint256)", +"3b80fc5f": "elc()", +"3b81a5a4": "assertEq23(bytes23,bytes23,bytes32)", +"3b81b785": "showVotes(address)", +"3b81caf7": "TransferAdminPending(address)", +"3b825302": "deleteTokenGrant(address)", +"3b82fe0e": "sellItem(string,string,uint256,string)", +"3b84333e": "FaucetToken()", +"3b84bec7": "setTIME_TO_MAKE_TOMATOES(uint256)", +"3b84edbd": "setRNG(address)", +"3b85746f": "existsCountsByName(bytes32)", +"3b86758a": "window3TokenCreationCap()", +"3b8678de": "setDefenceBoss(uint256)", +"3b871b4a": "awards(uint256,uint256)", +"3b874521": "withdrow()", +"3b87ec2d": "ecoSystemFund()", +"3b882832": "updateIsReverted(bool)", +"3b8908f2": "investmentsCount()", +"3b8918df": "submitMilestone(bytes32)", +"3b89332e": "verify_signature(uint256[4],bytes32,uint256[2])", +"3b893c2d": "icoTotalBalance()", +"3b895f28": "stageTwo()", +"3b89a83a": "adminRefund()", +"3b89be73": "registerUser(address,string,uint256,uint256)", +"3b8a3d5e": "setPI_edit_4(string)", +"3b8b44d0": "getUnissuedBP(uint256,uint256,uint256)", +"3b8b4a61": "createRefund()", +"3b8dbf6d": "operatorSendByTranche(bytes32,address,address,uint256,bytes,bytes)", +"3b8e2a26": "weiCapReached()", +"3b8e603c": "outputb(bytes32)", +"3b8e6f2e": "balanceAt(address,uint256)", +"3b8ea9e7": "getValuePayment(address,uint256)", +"3b8ecdf9": "right3(uint256)", +"3b8eee6d": "checkDistance(uint256,uint256)", +"3b8f0ef4": "counterRequest(uint256)", +"3b8ff7be": "getBB0()", +"3b8ffa5e": "addVoters(address[],bytes32[])", +"3b90176f": "getTotalNormalTokensByAddress(address)", +"3b903521": "setModel(address,uint256)", +"3b9056bf": "userWithdraw(uint256)", +"3b9178f7": "transferEntireStake(address)", +"3b91c253": "getSkillNames(uint256,uint256)", +"3b91ceef": "setMax(uint256,uint256)", +"3b91ee26": "agency()", +"3b92015e": "setTokenDiscountThreshold(uint256)", +"3b92d384": "barrierStrength()", +"3b92f3df": "payment(address)", +"3b930294": "voteTokenBalance(address)", +"3b932584": "buyTokens(address,string,string)", +"3b9341f4": "setTransactionFeeRefundSettings(bool,uint256,uint256)", +"3b936961": "HuatUSD03()", +"3b942742": "totalCoinSupply()", +"3b947d2b": "removeStablecoin(address)", +"3b949785": "raiseDollarsWithdrawalCancelled(address,uint160,int160)", +"3b94b012": "restartMinting(string)", +"3b957b67": "getSumAmountOfDisputedStepsProDoctor()", +"3b95f23e": "deactivatePackage(uint256)", +"3b968963": "shortAirdropTime()", +"3b971f9f": "_tokenPrice()", +"3b97e856": "tokenDecimals()", +"3b9855ea": "experienceToLevel(uint256)", +"3b9901cc": "getChannelsByRanks(address,uint256,uint256)", +"3b9927df": "HVZSupply()", +"3b996f40": "quarter(uint32,uint32,uint32,uint32)", +"3b99915d": "getMarketWallet()", +"3b9aa6f8": "getRare(string)", +"3b9aaae4": "avt()", +"3b9bbb2f": "withdrawTotalBalanceCommissionWei(address)", +"3b9bd54d": "ClientsHandler()", +"3b9c0fdc": "deleteRound(uint256)", +"3b9c67e1": "Press(uint256,uint256)", +"3b9c7ac2": "claimLockedTokens()", +"3b9ca2d0": "migrate(address,uint256,address)", +"3b9e1497": "updateVirus(address)", +"3b9e9c91": "testSettle()", +"3b9ed710": "caculateFill(uint256,uint256,uint256,uint256)", +"3b9f7d6b": "m_unclaimedHolderIdx()", +"3b9f87a5": "setNeedToReserve(uint256)", +"3b9ff58e": "Academicon(uint256,uint256)", +"3ba04463": "p_setInvestorsPercent(uint256,uint256)", +"3ba0b9a9": "exchangeRate()", +"3ba1356c": "earnedOf(address)", +"3ba15036": "getWei()", +"3ba2a67e": "lockFund(uint256)", +"3ba2aaf2": "setOwnerToken(address)", +"3ba2cfc1": "createBitcoinAddressPrefixTask(bytes,uint256,uint256,int256,uint256,int256)", +"3ba308dd": "preSaleTokenBalances()", +"3ba72b88": "checkAvailability(address,address)", +"3ba7ecc0": "BuzFinancialStrategy()", +"3ba86465": "oraclizeQueryCost()", +"3ba87e3e": "setMultiRequestFirstRequestId(uint256,uint256)", +"3ba8b0a8": "setPendingSignatureStatus(address,uint256)", +"3ba8c9a7": "mintingFinish()", +"3ba8f108": "SetOwner(string,address)", +"3ba93114": "getEtherMonsterInfo(uint256)", +"3baa8170": "setName(string,uint256)", +"3baad248": "delWhitelist(address,address[])", +"3bab3088": "DOCTokenSale()", +"3baba4d7": "milestonesLength()", +"3bac2837": "SSAToken()", +"3bacf5ed": "changeTokenHolder(address,address)", +"3badca25": "batchTransfers(address[],uint256[])", +"3bae15df": "deleteOwner()", +"3bae795e": "ActionAuction(address)", +"3baf35fb": "nPayments()", +"3baf4e1e": "newPayment(uint256,uint256)", +"3baf6e3f": "setReferral(address,address,uint256)", +"3baf77aa": "increaseClaimsBalance(address,uint256)", +"3bafc5c0": "removeBankroll(uint256)", +"3bb0cc55": "tokensReceived()", +"3bb168a1": "isPresaleFull(uint256)", +"3bb197cf": "icoPhaseAmount3()", +"3bb1a882": "TradeListing(address,address,address,uint256,uint256,uint256)", +"3bb28957": "p2_start()", +"3bb2dead": "resolveAddressLight(address)", +"3bb33d56": "checkAtkPlayerQuest(address)", +"3bb3a24d": "getTokenURI(uint256)", +"3bb4218a": "requireContractExists(uint256,bool)", +"3bb4497c": "getAllProviders()", +"3bb54b4c": "LOG_ContractStopped()", +"3bb5a02c": "unsetAllowedMultivest(address)", +"3bb5d604": "ExchangeWhitelist(address,address)", +"3bb66a7b": "getETHBalance(address)", +"3bb735e7": "Arrholders(uint256)", +"3bb81b60": "total_bet_purchased()", +"3bb8a87f": "getConsideredTokens()", +"3bb8bd85": "TICDist(uint256)", +"3bb8da29": "GetWorldData()", +"3bb91c77": "calculatePayout(uint256)", +"3bb9f133": "listSimpleService(uint32,string,uint256,address,address)", +"3bba16da": "ifClaimedNow(address)", +"3bba21dc": "swapTokenToEther(address,uint256,uint256)", +"3bba340c": "dateMainEnd()", +"3bba72c3": "TzTToken()", +"3bbac579": "isBot(address)", +"3bbacb55": "STVCOIN(uint256,string,string)", +"3bbb0025": "ownerOfRobot(uint256)", +"3bbb11a1": "getImageMetadata(uint256)", +"3bbb44ca": "eth_is_seeded()", +"3bbbce82": "computeCurrentPrice(uint32)", +"3bbca7b4": "ImpToken(string,string,uint256,uint256)", +"3bbe0b5c": "OKFCrowdsale()", +"3bbed4a0": "setRecipient(address)", +"3bbf41d9": "GameState()", +"3bc0461a": "devFee(uint256)", +"3bc058c7": "setBS(bytes32,string)", +"3bc17b28": "round3TokensRemaning()", +"3bc17fc3": "CreateNewPool(address,address,uint256,uint256,uint256,bool,address[],uint256,uint256)", +"3bc19bba": "webGiftSentAmount()", +"3bc1e0f1": "depositCoin(bytes32,uint256)", +"3bc261bb": "balanceTokenContract()", +"3bc273b0": "changeWelcome(string)", +"3bc2859e": "blockOffset(uint256)", +"3bc2b866": "getBla()", +"3bc2bc42": "AddSubscriber(address,string,string)", +"3bc325ee": "withdrawTokenToInvestor()", +"3bc3c7f9": "ERC20Token(string,string,uint256,uint256)", +"3bc45598": "update_SRNT_price(uint256)", +"3bc47fbe": "campaignEnded()", +"3bc4be52": "ownersTokenIndex(address,uint256)", +"3bc518ea": "getTokenBySelf()", +"3bc578fe": "getClosingTimeByStage(uint256)", +"3bc58532": "hodler()", +"3bc5a0b7": "updateBytesSetting(uint256,bytes32,address,string,string)", +"3bc5b73e": "_saleSupply()", +"3bc5de30": "getData()", +"3bc5f48a": "addBook(string)", +"3bc6db30": "settleAndClose()", +"3bc70184": "getPurchase(uint256,uint256)", +"3bc756d0": "NACToken(uint256,string,uint8,string)", +"3bc764f7": "depositCPT(address,uint256,bytes32)", +"3bc7ebac": "pinnedCode()", +"3bc834fc": "usersAddress(address)", +"3bc867f5": "getLockedEth()", +"3bc91e28": "setCurrentRound(uint256)", +"3bc983d3": "decreaseAssuranvePayments(address,uint256)", +"3bca915f": "NickSterBate()", +"3bcb1edb": "_payoutDividends(address,address,uint256)", +"3bcbb6d8": "Zarina()", +"3bccbbbc": "phase3TokenSold()", +"3bcd6624": "approveTokensAndCall(address,uint256,uint256,bytes)", +"3bcdbd22": "TweedentityClaimer()", +"3bce14c8": "numberOfRecentPlayers()", +"3bceb170": "raisedByAddress(address)", +"3bced141": "transcodeReceiptHash(string,uint256,bytes32,bytes32,bytes)", +"3bcf7d22": "newBribedCitizen(address)", +"3bcff3b0": "getProjectCount()", +"3bd04d69": "addWhiteList(bytes32)", +"3bd099d3": "ICO_RATE()", +"3bd0a6e5": "clickButton()", +"3bd0aa47": "modifyItem(string,address,uint256,address,uint128)", +"3bd0dd47": "getBackEther()", +"3bd0f412": "changeMin(uint256)", +"3bd10bf1": "_seekOdd(uint256,uint256)", +"3bd137e0": "makerDAOMedianizer()", +"3bd13b4a": "completeBounty(address)", +"3bd3593f": "_PurchaseInsurance()", +"3bd4aab7": "_thirdLevelEth()", +"3bd575fa": "acceptTrustSC(address)", +"3bd5aceb": "nProposals()", +"3bd5c209": "getContractCreationData()", +"3bd6695e": "testCoin()", +"3bd74880": "HARDCAP()", +"3bd756b6": "addPrivateFund(address,uint256)", +"3bd794d0": "solveDispute(address,bytes32,address,bool)", +"3bd797b0": "Tasks(address,address)", +"3bd7a51a": "IfContractRegist(string,string,string,string)", +"3bd87ebd": "hardCapTime()", +"3bd89deb": "DAX()", +"3bdc5173": "disallowNorthPoleMinting()", +"3bdcaab9": "getEndpointBroker(address,bytes32,int256)", +"3bdd504a": "rateOfZNT()", +"3bde045f": "numberOfRounds()", +"3bde3072": "onAssetReceived(uint256,address,address,bytes,address,bytes)", +"3bde5ba8": "targetReached()", +"3bdebbe1": "withdrawERC20Token(address)", +"3bdf157a": "setoraclegasprice(uint256)", +"3bdf2c0c": "setBaseValue(uint256,uint256)", +"3bdfafac": "randomJackpot()", +"3bdff827": "StaticArbiter(address[])", +"3be08dab": "setAddress(address,address,address)", +"3be1212b": "approveValidDurationData(uint256)", +"3be1c410": "dev2Wallet2Pct()", +"3be1e952": "freezeTo(address,uint256,uint64)", +"3be258bb": "getBuyPriceDecimals()", +"3be272aa": "createRoom()", +"3be2b60c": "joinwithreferral(address)", +"3be31d63": "updateVerificationStatuses(address[],bool)", +"3be32f7d": "deleteAccount()", +"3be3a3f5": "setCloseTime(uint256)", +"3be3bdd9": "offTimeLock()", +"3be46378": "getAffiliate(uint256)", +"3be4ee30": "getUserTokenLocalBalance(address,address)", +"3be52c2c": "setStatusBurn(bool,bool)", +"3be546a2": "raiseDollarsAdded(address,uint160,int160)", +"3be554d4": "setCostPerDay(uint256)", +"3be59443": "_setOracle(address)", +"3be64ed7": "addPeriod(uint256,uint256,uint256)", +"3be6ccd9": "freezeWithdraw(address,uint256,uint256,bool)", +"3be746b6": "lockState(string)", +"3be75aa3": "shareLimit()", +"3be86ba1": "setIcoAgent(address,bool)", +"3be8fd6a": "setContent(string)", +"3be924fa": "hasAuth(string)", +"3be92863": "burnLotById(bytes32)", +"3be93b98": "createCountry(string,string,string,uint256)", +"3be94219": "purchaseAttack()", +"3be9cfb7": "changeDropper(address)", +"3bea92a3": "addToTipperQueue(uint256,address)", +"3bead271": "sale3(address,uint256)", +"3beb0044": "hminus(uint256,uint256)", +"3beb26c4": "setTime(uint256)", +"3beb4db1": "setIcoStage(uint256)", +"3bed33ce": "withdrawEther(uint256)", +"3bed93f2": "MAX_COLLECTORS()", +"3bee0613": "updateExchangeStatus(bool)", +"3bee8726": "getMaxContenders()", +"3beea695": "corruptElite()", +"3beedf6d": "lotteryAddress()", +"3befedea": "getPersonParents(uint256,bool)", +"3bf03e9e": "HelloWorldContract()", +"3bf11a6c": "initToken(address,address,uint256,uint256)", +"3bf12c88": "Rate1()", +"3bf13ded": "changERC20(address)", +"3bf17f75": "initializeCompanyTokens(uint256)", +"3bf2313d": "__transferToICAPWithReference(bytes32,uint256,string)", +"3bf2a861": "cancelOrder(bool,uint32)", +"3bf2b4cd": "approveDisband()", +"3bf2cade": "justPureFunction(int256)", +"3bf30f85": "execute(address[],bytes)", +"3bf329bf": "fraction(int216,int216)", +"3bf3d531": "miningThreePlat()", +"3bf47720": "totalTransfers()", +"3bf48672": "BattleToken(address)", +"3bf4ac5c": "day3Start()", +"3bf53a89": "unVoteAll()", +"3bf5b9c0": "getNumberByChoice(uint256)", +"3bf5f781": "Trendercoin()", +"3bf6de96": "max(uint256[])", +"3bf81b91": "testAddVoter()", +"3bf8f34a": "designatedReporterShowed()", +"3bf99b3f": "buyTokensByBTC(address,uint256)", +"3bf9b801": "_Hit()", +"3bfa0de9": "changeFundWallet2(address)", +"3bfa4449": "createFreeToken(string,address)", +"3bfb3246": "_detectInvestorGroup(uint256,address)", +"3bfb3c35": "fourthBonusEnds()", +"3bfca20f": "TokenToken(address)", +"3bfd7fd3": "incrementValue()", +"3bfdd7de": "transferManagment(address)", +"3bfecbf0": "setNeverdieSignerAddress(address)", +"3bfed5dc": "DolyToken2()", +"3bffb839": "Cryptolotto1Hour(address,address,address,address)", +"3bffd31e": "depositaPagamento()", +"3bfffc49": "getSumOfValues(uint256[])", +"3c0093a6": "MithrilToken()", +"3c01a9fa": "getEscapeRequests(uint32)", +"3c027d4f": "isTokenSelling(uint256)", +"3c0359a4": "certifications(uint256)", +"3c03d8be": "judgeAddress()", +"3c0471a2": "pregnantLinglongCats()", +"3c05187b": "execute(uint8,bytes32,bytes32,address,address,uint256,bytes,address,uint256)", +"3c067945": "fundBalance()", +"3c06ae68": "raiseBuyOrderMatched(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int160)", +"3c070b60": "dataSourceCallbackFinals(uint256,uint8[4])", +"3c077a48": "getAll(uint256)", +"3c0870ae": "challenge(uint256,uint256,uint256,bool)", +"3c096005": "managerAmount()", +"3c09ee26": "Token(address[],uint256)", +"3c0ab650": "buyAllAmount(address,address,uint256,address,uint256)", +"3c0afb59": "changeStartDate(uint256,uint256)", +"3c0b0279": "KhawCoin(uint256,string,string)", +"3c0b1c41": "AFTBToken()", +"3c0b8577": "getUserApproval(address)", +"3c0b9db2": "PolyDistribution(uint256)", +"3c0ba651": "getDutchAuctionToBuyAddress()", +"3c0cd36b": "manualPurchaseTokens(address,uint256)", +"3c0ce567": "fetchConfirm(address,bytes32)", +"3c0cfb3d": "mintMigrationTokens(address,uint256)", +"3c0dabdb": "getMidgradeCarSupply(uint256)", +"3c0dde1c": "_addPools(address,address)", +"3c0de47c": "probabilities()", +"3c0e1cc2": "revealPhaseMinSecondsWaitForClearMajority()", +"3c0e5d74": "frozenCheck(address,address)", +"3c0e6adc": "reset_individual_shares(address)", +"3c0f60ad": "setSecondaryStorage(address)", +"3c0f92e3": "supportAddOn(uint16,uint256)", +"3c0fc6ea": "kill(address[])", +"3c0fcdd1": "depositEgereg(uint256)", +"3c1008bb": "internal_transferFrom(address,address,uint256)", +"3c107402": "LongPlace(address[2],uint256[7],uint8,bytes32[2],uint256)", +"3c10d7cd": "bonusInPhase2()", +"3c11845e": "ContractConstructor(string)", +"3c11f969": "sentSecond()", +"3c121ef5": "is_empty()", +"3c126795": "OMIVIA()", +"3c130d90": "tokenURI()", +"3c133818": "winningVote(bytes32)", +"3c13ec32": "team1LockEndTime()", +"3c13fc33": "transferBase(uint256)", +"3c1593ab": "endFirstWeek()", +"3c15d28f": "createQuestion(string,address,uint128,uint256)", +"3c1650ff": "getData_23()", +"3c16761f": "SUM()", +"3c168093": "addOrder(uint256,uint256,address,address,uint256)", +"3c173bf0": "ZarfundsToken()", +"3c17494d": "set(uint16[],string,string,string,bool)", +"3c17622a": "setFreelancerSkills(address,address,uint256[])", +"3c17b656": "investmentGateway()", +"3c1800cd": "isPresaleEnd()", +"3c1853e7": "etherBack()", +"3c18d318": "sweeperOf(address)", +"3c198047": "RollToken()", +"3c19df06": "stakeCreativeCommonsContent(uint256,uint256,bytes8,uint256,string,string,string,string,uint256)", +"3c19fc06": "Holder()", +"3c1a7c6f": "getCountApplyForCertification()", +"3c1a7e2d": "adminWithdrawBCEO(uint8)", +"3c1a7eda": "certificate(bytes32,bytes32)", +"3c1a88d7": "blockTokens(address,uint256)", +"3c1ab2a3": "URL()", +"3c1b81a5": "getInstructor()", +"3c1b87f9": "setSettings(uint256,uint64,uint64,uint256)", +"3c1c423c": "getInfoLibra(bytes32)", +"3c1c5931": "promoCodeToContractAddress(bytes16)", +"3c1cc14e": "stopTokenSwap()", +"3c1ce6a5": "mintDigm(uint256)", +"3c1d28a3": "redeemLevAndFee(address)", +"3c1d7078": "BookCreated(address)", +"3c1e60a6": "tokenParametersSet()", +"3c1f1cb7": "ethSaver()", +"3c20307b": "CTWtoken()", +"3c203d44": "PreCrowdAllocation()", +"3c2040c1": "setInviteAdmin(address)", +"3c20485e": "limitIcoTokens()", +"3c205b05": "currAdminEpoch()", +"3c206900": "disableEmergencyBlock()", +"3c2087c9": "Withdrawal(address,uint16,uint256)", +"3c20d1a5": "getStageCap(uint8)", +"3c20ee6e": "_end()", +"3c21001d": "getMySentTradeOfferId()", +"3c21acc6": "extraMintArrayPending(address[])", +"3c21b968": "loadBalances(uint256[])", +"3c21db0a": "theGames(uint256)", +"3c21f0a1": "GHIToken(address)", +"3c21fa2e": "setELHeroTokenAddr(address)", +"3c226cd9": "ChangeDeadLine(uint256,bool,uint256)", +"3c22c935": "processMilestoneFinished()", +"3c232bb6": "set_traded_token_as_seeded()", +"3c237167": "getProductivityCitizens(uint256)", +"3c240a63": "updateFourthExhangeRate(uint256)", +"3c24550c": "isRefundTime()", +"3c263cf4": "savingPoints()", +"3c264820": "getWinningPayoutNumerator(uint256)", +"3c26777b": "StartedGame(address,uint256,uint256,uint256)", +"3c2698d5": "YUNLAI()", +"3c269b96": "setExchange(bool)", +"3c26cfe3": "drawLottery(string)", +"3c275e24": "getInfo(address,uint256,uint256)", +"3c276d86": "saleStartTimestamp()", +"3c278bd5": "lift(address)", +"3c279f1f": "submitWithdrawTokenTransaction(uint256,address,uint256)", +"3c28308a": "rndNo()", +"3c287a3f": "BitcoinDiamondToken()", +"3c28b9c0": "expirationInSeconds()", +"3c28ee5b": "addDeactivatedList(address)", +"3c2aba9f": "manageApprovedTransferModule(address,bool)", +"3c2b0725": "delegateContract()", +"3c2b2508": "PREMINER_ADDED(address,address,uint256)", +"3c2c21a0": "scheduleCall(address,uint256,bytes4)", +"3c2c4b5e": "MASTER_WALLET()", +"3c2cf368": "BIGTTokenDeposit()", +"3c2d55e6": "GetSubscribers()", +"3c2d6447": "setIcoPercent(uint256)", +"3c2d70e9": "start(address,uint256)", +"3c2dba23": "stakedForPollID(address,bytes32)", +"3c2e2624": "transferManyDirect(address[],uint256)", +"3c2e2a75": "depositTokenForUser(address,uint256,address)", +"3c2e671e": "founder3Wallet()", +"3c2e6b32": "AquaSale(address,uint256,uint256,uint256,uint256,address,address,address,address,address,address,uint256)", +"3c2e7d54": "priv_inMainChain__(int256,int256)", +"3c2efb22": "isContributionRegistered(bytes32)", +"3c2f24af": "loopFor(uint256,uint256,uint256)", +"3c2f7df5": "incGen0Limit()", +"3c306250": "mybalance(address)", +"3c311f3c": "previous(uint256)", +"3c314a91": "playerGetPendingTxByAddress(address)", +"3c31762c": "setMinPurchaseValue(uint256)", +"3c31fa62": "setFeeRates(uint16,uint16,uint16)", +"3c324c2e": "totalCollectableToken()", +"3c32673f": "BTTSTokenUpdated(address,address)", +"3c329dc4": "delModule(string)", +"3c32d8ef": "getOffChainIdentity(address,address)", +"3c3313a8": "registerLoan(address)", +"3c335b0e": "getRetractable(bytes20)", +"3c33808d": "preallocateSecondStage(address,uint256,uint256)", +"3c33863c": "computeGroupPhasePoints(uint8,uint8)", +"3c33d473": "setLargeCapDelay(uint256)", +"3c345335": "addSignature(uint256)", +"3c347cbd": "_0xTestToken()", +"3c358483": "setData_10(string)", +"3c35a858": "processProcessableAllocations()", +"3c35c88a": "sendFundHome2()", +"3c37a88b": "stage4_start()", +"3c37b640": "commitHash(bytes32)", +"3c3861b6": "getRace(uint32)", +"3c389cc4": "erc20Impl()", +"3c391c95": "preSaleBonus2Time()", +"3c3a8c39": "UpcToken()", +"3c3ad016": "forceUpgrade(address[])", +"3c3b4b31": "getHouseTraits(uint256)", +"3c3b7995": "privateLimit()", +"3c3bdb7a": "changeExchange(address)", +"3c3be494": "dtCreateCityData(address,uint256,uint256)", +"3c3c22b3": "oldest()", +"3c3c88b1": "initializeOnTransfer()", +"3c3c9c23": "totalEth()", +"3c3ccc44": "startNextRound()", +"3c3ce17d": "insure()", +"3c3d1385": "tinhtong(uint256,uint256)", +"3c3d3af6": "amountInvested(address)", +"3c3d9ada": "_bctc(uint256,uint256,uint256,uint256,address)", +"3c3deb54": "contractCreatedTimestamp()", +"3c3e1662": "ctf_challenge_add_authorized_sender(address)", +"3c3e2447": "MINIMUM_BUY_AMOUNT()", +"3c3e6af4": "QTX()", +"3c3efdc9": "calculateEarnings(uint256)", +"3c3f4c63": "maxSpend()", +"3c3ff394": "IRECToken()", +"3c40066d": "investByLegalTender(address,uint256,uint256)", +"3c402bd1": "AMTBToken()", +"3c41c816": "EthlanceUser(address)", +"3c4293d8": "refund_my_ether()", +"3c42f95a": "setMetadata(string,uint256,bytes)", +"3c43b91d": "setStage2Ends(uint256)", +"3c444637": "setSaleBonus(uint256)", +"3c454d7f": "getper()", +"3c45b373": "addVoting(address,uint256)", +"3c46f604": "testDeleteCase()", +"3c473336": "isEndedTrack(bytes32)", +"3c4857a7": "_approve(uint256,address,address)", +"3c489238": "HappyFutureToken()", +"3c48d7de": "shapeshiftTransfer(uint256,string,string)", +"3c490a70": "getGlobal(uint256)", +"3c4961ff": "_processAirdrop(address,uint256)", +"3c49dde4": "registerDonation(address,uint256)", +"3c49ec88": "getMyKebabs()", +"3c49ff0c": "StarCoinPreSale(uint256,uint256,address,address,address,uint256,uint256,uint256)", +"3c4a2989": "POPCHAINCASH()", +"3c4a4b1e": "createTokenTimelock(address,uint256)", +"3c4b07de": "extUnlockBot(uint256,uint16)", +"3c4b303d": "token_decimals()", +"3c4b40b8": "fundingWallet()", +"3c4b5e2b": "setInviteeAccumulator(address,uint256)", +"3c4c51c9": "getClue()", +"3c4dbb17": "PriceWeekOne()", +"3c4e7d9f": "setESCBDevMultisig(address)", +"3c4ec769": "VCT()", +"3c4f3c12": "issueTokensSale(address,uint256)", +"3c4f5a66": "getActivePlayers()", +"3c4f5be3": "registrantOfToken(uint256)", +"3c50afe1": "_icoSupply()", +"3c50edbd": "getSidesById(uint256,uint256)", +"3c5192b7": "EscrowEscalation(uint256,uint256)", +"3c520944": "getPromoCodeForFish(bytes16)", +"3c526ef1": "_divideDecimalRound(uint256,uint256,uint256)", +"3c530ace": "registerProducer(address)", +"3c536938": "executeTransaction(uint256,uint256)", +"3c5395b2": "revokeAdmin(address,address)", +"3c53cb96": "lastBlock_v0Hash_uint256()", +"3c53dabe": "BeggarBetting()", +"3c540687": "txCount()", +"3c54ca8c": "trade(address,address)", +"3c54caa5": "reclaimTokens()", +"3c5524d8": "listContractByModuleName(string,string)", +"3c552556": "verify_signature(bytes32,uint8,bytes32,bytes32,address,address)", +"3c55563e": "cards_metal_total()", +"3c560064": "mintPartner(address,uint256)", +"3c566f0f": "shopStoreAddress(uint256)", +"3c56d236": "HashLotto()", +"3c56e2ae": "register(address,uint8,bytes32,bytes32)", +"3c56eae3": "setForceReadyTime(uint256)", +"3c5746dd": "recipientExtraMIT(address)", +"3c580e92": "setLocalGame(uint16,address)", +"3c584d86": "convertWT(uint256)", +"3c58795d": "hasFetchedProfit(address)", +"3c58d378": "lockChanges()", +"3c58ef44": "getWishIdxesAt(address)", +"3c594844": "leftToday()", +"3c5972ff": "multiSetWhiteList(uint256[])", +"3c59c17a": "AgentWallet()", +"3c5a12cb": "getVal(string)", +"3c5ad147": "Debug(string,uint256)", +"3c5b7d3f": "buyTkn(uint256)", +"3c5bd949": "mine_jade()", +"3c5bdcc4": "FCOIN0939Token(uint256,string,string,uint256)", +"3c5c6331": "addAddressToUniqueMap(address)", +"3c5d1812": "totalPhases()", +"3c5e270f": "teamSupplyAddress()", +"3c5e28d6": "setClientIdentRejectList(address[],uint8)", +"3c5e417e": "_mintApproveClear(address,address)", +"3c5e57e4": "_getRarity(uint8)", +"3c5e94dd": "bulkRegisterPoA(bytes32,bytes32,bytes32,uint256)", +"3c5f10a3": "winning_ticket()", +"3c5f2bf2": "getFullRace(uint256)", +"3c5fc608": "preDGZtoDGZExchangeRate()", +"3c612c11": "authorize(address,address,address,uint256)", +"3c617685": "SocialMediaPay()", +"3c61d003": "advertisingDeposit(uint256)", +"3c6251bd": "test_oneValidEqUint1()", +"3c627c9b": "releaseAndDistribute()", +"3c630356": "AirCrash()", +"3c63d000": "setBurnRequestStringMap(uint256,string,string)", +"3c6403b4": "GetAccountIsNotFrozenCount()", +"3c647fbd": "angelMaxAmount()", +"3c648ddd": "voteSvp01(bool)", +"3c64f9aa": "ClusterToken()", +"3c65c506": "adjust_difficulty()", +"3c6677d6": "promoBun(address,address)", +"3c667b13": "rentalsContract()", +"3c671e53": "collectPayout(address)", +"3c673470": "createGroup(address,bytes32,address[])", +"3c673c19": "deleteTopic(uint256)", +"3c67b6b7": "getClaimLeft(address)", +"3c67c51e": "testLogs()", +"3c67dad5": "revertLuckyCoin(address)", +"3c6806b8": "getDiary(uint256)", +"3c681da0": "getCandy(string)", +"3c6867c3": "CallBack(string,bytes32)", +"3c68eb81": "transferFunds()", +"3c695d4e": "authorityAddress()", +"3c69a5e6": "mintPresaleBonuses()", +"3c6a2929": "setArrIntF2ArrUintF3ArrBoolF1(int256[],uint256[],bool[])", +"3c6a71f7": "exchangeRatePreIco()", +"3c6aa9f1": "decimalsValue()", +"3c6b97c9": "TokenContribution()", +"3c6b9d8c": "captains()", +"3c6bb436": "val()", +"3c6bc24b": "getBrickDetail(uint256)", +"3c6bf582": "ElementBought(uint256,uint256,uint256,address,uint256,uint256,uint256)", +"3c6c67e2": "etherAllowance()", +"3c6d2610": "TalentToken(address)", +"3c6d2e19": "contributionsETH(address)", +"3c6d736d": "ZZZCoinERC20Token()", +"3c6d7b47": "setDebugNumber(uint256)", +"3c6dfba1": "buy(uint8,bytes6,uint32,uint32)", +"3c6e03d7": "thewhalegame()", +"3c6e5927": "getMonsterCurrentStats(uint64)", +"3c6ea2a5": "HooyToken()", +"3c6eab08": "KICKICOCrowdsale(address,address,address,address,address,address,address)", +"3c6ee392": "createTokens(uint256,uint256)", +"3c6f2cc4": "sendICOTokens(address,uint256)", +"3c704089": "DigitalCash()", +"3c7045fe": "takeEtherBack()", +"3c7066d1": "feeCMT(uint256)", +"3c7097a3": "setMaxCharId(uint32)", +"3c70bd42": "sell_(uint256)", +"3c716e08": "updateAuthority(address)", +"3c71b186": "ElementeumToken(uint256,address[],address[])", +"3c71b7b6": "validDelegateSignature(address,string,uint8,bytes32,bytes32,bytes32)", +"3c71faf2": "BMToken()", +"3c72751e": "lerp(uint256,uint256,uint256,uint256,uint256)", +"3c72a83e": "getKyberNetworkAddress()", +"3c72e9bf": "IMDEXadminWithdraw(address,uint256,address,uint256)", +"3c72f070": "initialTokensBalance()", +"3c73db77": "RecycleToken()", +"3c745371": "finalAddress()", +"3c745ad5": "nextProfile()", +"3c74db0f": "expirations(address)", +"3c76aa19": "CWCreturnQueryData()", +"3c771309": "setSiringRate(uint256,uint256)", +"3c774dbb": "buyChickenParkCoin(address)", +"3c775b08": "airdropLimit()", +"3c77b95c": "testExpUnroll16(int256,int256,uint256)", +"3c77e474": "_updateKeyPrice(uint256)", +"3c7818a1": "startRoundD()", +"3c78929e": "lockUntil()", +"3c78fe07": "getReceiver(uint32)", +"3c796430": "getOneTimePayment()", +"3c799547": "amountAvailable()", +"3c7a337a": "InDeepToken()", +"3c7a3aff": "commit()", +"3c7b3d90": "rewardAirdrop(address,uint256)", +"3c7b682d": "PunkOffered(uint256,uint256,address)", +"3c7b6869": "finishPresale(uint256)", +"3c7c2563": "createtoken(string,string,string,string)", +"3c7cc806": "validateOrderAuthorization_(bytes32,address,uint8,bytes32,bytes32)", +"3c7d6f30": "publicStartRegularPhase()", +"3c7e03c1": "getRelayingKing()", +"3c7e31f0": "addCutie(uint32,uint128,uint128,uint128,uint128)", +"3c7fdc70": "fibonacciNotify(uint256)", +"3c807878": "stageOne()", +"3c811ee0": "putSellOrder(address,uint256,uint256,uint256)", +"3c8161c5": "KVC(uint256,string,uint8,string)", +"3c816217": "killBoard(uint16)", +"3c81df21": "getMultisig()", +"3c8259b4": "SACoin()", +"3c837b7d": "changeSettings_only_Dev(uint256,uint256,uint8,uint8,uint256)", +"3c8394ac": "ICORaised()", +"3c83f7aa": "rateForPhase2()", +"3c842a26": "_Test_Oraclize()", +"3c847e52": "withdrawVested(address)", +"3c84f868": "set(int256,address,uint256)", +"3c8515b1": "_createCrypton(string,address,uint256,uint256,bool,uint8)", +"3c86063c": "insertInfo(string,uint256,uint256)", +"3c875a35": "buyFuel(uint256,uint256,uint256,uint256,address)", +"3c8766c6": "sendProfitsReward(address)", +"3c876c6f": "newIdShipProduct()", +"3c87b8ef": "get_player_state()", +"3c889e6f": "getBid(uint256)", +"3c889fe1": "masterCalculator(uint256)", +"3c890e4c": "getVoteStake(uint256,uint256,uint256,bool)", +"3c893718": "transferCity(address,address,uint256)", +"3c894475": "scheduleTransaction(address,bytes,uint8,uint256[6],uint256)", +"3c89f9d4": "accept(uint256,address[],uint256[])", +"3c8a072e": "temporalUnit()", +"3c8a321c": "setPaymentGatewayList(address)", +"3c8ac88e": "createIdentityWithCall(address,address,address,bytes)", +"3c8b0c55": "set_arbits_min_contribution(address,uint256)", +"3c8b6597": "addPrivateSaleTokensMulti(address[],uint256[])", +"3c8bb3e6": "wmultiply(uint256,uint256)", +"3c8bccd9": "getCommission(uint256)", +"3c8c681a": "RoundCSold()", +"3c8c6a1e": "sendToken(address,address,address,uint256)", +"3c8ca83d": "gameBeginTime()", +"3c8cd434": "getCabCoinsAmount()", +"3c8d284b": "receiveBtcPrice(uint256)", +"3c8da588": "priceInWei()", +"3c8e3b52": "getTotalPercent()", +"3c8e66fb": "calculateTotalDirectDebitAmount(uint256,uint256,uint256)", +"3c8eac87": "getTransactionState(uint256)", +"3c8f202e": "Dashicoin(uint256,string,uint8,string)", +"3c8f3278": "hmax(uint128,uint128)", +"3c8f96f1": "bonusTokens(uint256)", +"3c9046c9": "yearTwoClaimed()", +"3c9070b5": "ConsultaProva(address)", +"3c90861c": "Enigma()", +"3c90ee6a": "DNARtoGoldXchgRate()", +"3c918bae": "wallet3()", +"3c920d0d": "liquidityPoolTotal()", +"3c925f16": "getAccountHolder()", +"3c9266e0": "sendSalary(address)", +"3c9340ae": "orderForDays(bool[])", +"3c936e97": "lockBonusTokens(address,uint256,bytes1)", +"3c93d8be": "uint2hexstr(uint256)", +"3c941423": "getDesignatedCaller(bytes32,uint256)", +"3c959aca": "CheckTickets()", +"3c960be9": "transferFromSenderPaysFee(address,address,uint256,bytes)", +"3c961202": "getHighscore()", +"3c96a7a8": "withdrawOwnerFee()", +"3c96d048": "setnow(uint256)", +"3c9719a7": "getReleasableFunds(address)", +"3c984f4a": "sellTokensForEur(string,address,uint256,uint256)", +"3c993482": "_payfee()", +"3c9a4baa": "requestOutput(bytes)", +"3c9a5d59": "getAuditAuditor(uint256)", +"3c9ad41b": "tokenIssuedToday()", +"3c9af31c": "getSponsor(uint32,int256)", +"3c9c4001": "whitehat()", +"3c9c97f0": "setBlocksPerRound(uint64)", +"3c9d377d": "f5()", +"3c9d93b8": "removeAllowedAddress(address)", +"3c9ee04c": "previousstageplayer2()", +"3c9f861d": "totalBurn()", +"3c9ff012": "timeRangeCreateGen0()", +"3ca1595a": "addNewRaz(uint256,uint256,uint256,uint256,string)", +"3ca19952": "getBookingCount(address)", +"3ca22916": "dollarPerEtherRatio()", +"3ca520f5": "LaunchPartnersAmount()", +"3ca5c69c": "AllMake()", +"3ca5c8b8": "createFilmToken(string,uint256)", +"3ca6268e": "log(string,int256)", +"3ca63675": "getNumberOfVotes(uint128)", +"3ca65e77": "JMJToken()", +"3ca6a437": "assignedGameContract()", +"3ca6b228": "getEmployee(address,address)", +"3ca6c07a": "setTokenAdd(address)", +"3ca6d100": "create(string,string,uint256)", +"3ca6d5a9": "initialBuyPrice()", +"3ca7aad7": "xorReduce(uint8[],uint256)", +"3ca805ba": "pwrFloat(uint256,uint256,uint256,uint256)", +"3ca84001": "transferFromContractTo(address,uint256)", +"3ca88a2f": "canBuy(uint256)", +"3ca8b002": "isDeploymentAdmin(address)", +"3ca95c89": "getCompte_26()", +"3ca967f3": "getCurrentExchangeRate()", +"3ca96e0e": "teamBonusAllocatedTokens()", +"3cab648a": "getModuleAddressByName(string)", +"3cac14c8": "returnArray()", +"3cac2387": "trustedTokens(address)", +"3cac38e4": "advanceStep()", +"3cacf895": "doPayments()", +"3cad71cf": "RetStatic(uint128)", +"3cad7c4e": "setLockQtyToAllowTrading(uint256)", +"3cae09ac": "silencePeriod()", +"3caebce4": "BRFToken()", +"3caed876": "submitTransaction()", +"3cb00fd2": "get_presale_iconiq_arbits_per_ether(address)", +"3cb025e2": "SimpleSafeToken()", +"3cb0b51b": "Redeem200AFTK16SeptSandbox()", +"3cb21103": "isAllowedFactProvider(address,address)", +"3cb260b2": "set_dimensions(uint256,uint256)", +"3cb27169": "receiverVestings(address,address)", +"3cb32f77": "currentHolders()", +"3cb3d027": "getTokenBankrollAddressFromTier(uint8)", +"3cb3ea68": "LAMBO_TYPE()", +"3cb40e16": "withdrawToOwner()", +"3cb4986a": "ZeusToken()", +"3cb4ff3c": "getActiveCards()", +"3cb579c1": "setValueParam(uint256)", +"3cb5bc74": "setMintLimits(uint256,uint256,uint256)", +"3cb5d100": "contributors(uint256)", +"3cb5d170": "sendTokenReleasedToBalanceInternal(address,address,address)", +"3cb5d1df": "TicTacPotato()", +"3cb6465e": "numOfWinner()", +"3cb6e20c": "LeadcoinSmartToken()", +"3cb802b9": "unclaimedDividends()", +"3cb83751": "getCofounderCount()", +"3cb8cfc8": "acceptTokens(address,uint256)", +"3cb8cfcd": "totalEthInWeiForPreIco()", +"3cb9032e": "getInvoicesCount(address,uint256)", +"3cb94596": "addressOf(bytes)", +"3cb960a6": "calcCORtoETC(uint256)", +"3cba3c77": "OperationalSplit(uint256)", +"3cba41bf": "store(bytes,address)", +"3cbcf9a4": "RatingToken(address,uint256)", +"3cbd4285": "addWinnigs(address[],uint256[])", +"3cbd6429": "playerId(address)", +"3cbdfcd9": "bountyTokensToAddress(address)", +"3cbe7309": "AgriChainDistribution()", +"3cbeb49a": "setColorBlue()", +"3cbec314": "FRUT()", +"3cbf41d2": "completeCrowdsale()", +"3cbfed74": "getBondBalance()", +"3cc0be9a": "setCompte_37(string)", +"3cc0fb45": "testFailRetractNotOwner()", +"3cc12603": "ABCToken(uint256)", +"3cc136e0": "destroyRoto(address,bytes32)", +"3cc1429c": "createEthAuction(uint256,address,uint256)", +"3cc15011": "_calculateExcessTokens(uint256,uint256)", +"3cc1635c": "deleteBooleanValue(bytes32)", +"3cc228fd": "minVotes()", +"3cc26b71": "admin_active_dividend(address)", +"3cc3c3b5": "terraformReserve()", +"3cc45596": "updateCar(uint256,bytes32,uint256,uint256,uint256,uint16,uint8,uint8,uint8,uint8,uint8)", +"3cc4c6ce": "resumeGame()", +"3cc54aae": "updateGenGuVault(uint256,uint256)", +"3cc626b6": "PotoToken()", +"3cc6441d": "Smile()", +"3cc71c3f": "COMMUNITY_ALLOWANCE_LIST()", +"3cc7508f": "uncooperativeClose(address,uint8,uint256)", +"3cc75749": "volumeType2()", +"3cc7790a": "GSI()", +"3cc7fd84": "infoTokenSilverRatio()", +"3cc8626d": "set_sellPriceEth(uint256)", +"3cc86b80": "GetMoney(uint256,address)", +"3cc86b9a": "takeAllNotClaimedForRefundMoney()", +"3cc8daf7": "setNameOwner(bytes,address)", +"3cca2420": "contractData()", +"3cca779b": "gameOpen()", +"3ccad6fc": "getNamedAddresses()", +"3ccaf593": "createReport(string,string,string,string,uint8)", +"3ccb25a2": "setRequiredBlocksElapsedForVictory(uint256)", +"3ccb47cb": "roundPot()", +"3ccb4ae4": "initLocalNodeReputation(address)", +"3ccb6c31": "setWallet2(address)", +"3ccb7dc9": "CrowdFund(uint256,uint256)", +"3ccbad50": "initialize(address,address,address,address,address,bytes32,uint256,uint256,uint256,uint256,uint256)", +"3ccc5e2c": "icoSale()", +"3ccc8193": "lastWiningTicketNumber()", +"3cccfc1b": "promotionCommisionPercent()", +"3ccd1c7f": "getFactoryProfit(uint256,address)", +"3ccdbb28": "withdrawToken(address,uint256,address)", +"3ccf127e": "raisePreSale()", +"3ccf5861": "TOSInstitutionsIncentiveContract()", +"3ccf5c8f": "setDelegadoDeEscuelaVerify(bytes32,bytes32,uint256,uint256)", +"3ccfd60b": "withdraw()", +"3cd02acd": "airdropTokens(bytes32,address[],uint256,uint256)", +"3cd109cb": "addAuthorizedOwners(address)", +"3cd17060": "getProposalHash(string)", +"3cd1b6b1": "isSponsorable(address,uint256)", +"3cd1e213": "GetRecordID(address,address)", +"3cd21d88": "ClosePeriodEvent(uint256,uint256,uint256,uint256)", +"3cd260e6": "doWorkAndPayEBT()", +"3cd2df82": "calculateTokensWithoutBonus(uint256)", +"3cd35429": "DQCoin()", +"3cd36358": "_getApproved(address,uint256)", +"3cd510ee": "getWinNumbers(string,uint256,uint256)", +"3cd5d5fc": "Sacar_BlackList(address)", +"3cd5f8ea": "addCourse(address)", +"3cd78a2b": "addToSpecialRatesMapping(address,address,uint256)", +"3cd8045e": "splitter()", +"3cd99b70": "setMaxDepartureLim(uint256)", +"3cd9a0fa": "stage_2_maxcap()", +"3cda0103": "supplyOf(string)", +"3cda0b45": "contribute(bytes8)", +"3cda6524": "addUnlockedAddress(address,address)", +"3cdb01ae": "atxChangeAddrCount()", +"3cdb3aa6": "activateRefund()", +"3cdb9762": "getTokenBalance(string,address)", +"3cdb982b": "getNumeroDeOuvidorias()", +"3cdbd414": "multivestBuy(bytes32,uint8,bytes32,bytes32)", +"3cdd37e1": "WatchedWallet(address,address)", +"3cdd9262": "peMaxPerPerson()", +"3cde5627": "SendEtherToDex(uint256)", +"3cdf60e2": "TurkCoin()", +"3cdf6783": "withdrawDeferred()", +"3ce0a093": "getHash(bytes8)", +"3ce0c432": "TokenPurchased(address,address,uint256,uint256,bytes)", +"3ce123dc": "highBidder()", +"3ce1314f": "setUnlockStart(uint256)", +"3ce17f24": "_createPlayer(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"3ce1f4e7": "testFailUpdateLatestRevisionNotUpdatable()", +"3ce24239": "AddSharedAccount(bytes32,address,bytes32,bytes32,bytes32)", +"3ce276f5": "setFreezeTransfer(bool)", +"3ce32c0a": "AWAToken()", +"3ce3480a": "closeStageOne()", +"3ce39a3d": "proposeTx(address,uint256)", +"3ce54ac3": "testFailCreateWithParentParentSameItemId()", +"3ce5facd": "HeyfanToken()", +"3ce6d89b": "approveTaxData(uint256)", +"3ce70aac": "getDocumentSequence(bytes16,bytes32)", +"3ce716f9": "WalletChanged(address)", +"3ce7da3d": "setTokenSymbolName(string)", +"3ce819e2": "captcha()", +"3ce948c8": "Token_3()", +"3ce97eb9": "GetManifestoById(uint256)", +"3ce9d22e": "setupFinal(uint256)", +"3cea6965": "gasMin()", +"3ceb7783": "rankNumbers_()", +"3cebb4d7": "setOpGas(uint256,uint256,uint256)", +"3cebb823": "changeController(address)", +"3cebff9c": "airdropPool()", +"3cec21c8": "register_(uint256)", +"3cec475a": "connectTest()", +"3cec9309": "segmentSize()", +"3cecd719": "cleanup()", +"3cece78b": "__getEthPrice(uint256)", +"3cecf2e6": "exchangeRateArray(uint256)", +"3ced516c": "descriptionHashes(bytes32)", +"3ced842b": "make_offer()", +"3cedd004": "setMinimumInitialBudgetForAudits(uint256)", +"3cee32e3": "set_allow_withdraw_amount(uint256)", +"3ceeafa7": "amountOfTokensPoolA()", +"3cef162a": "allocatetokensAndWL(address,uint256)", +"3cef51c5": "maxWeiTier3()", +"3cefc1e0": "hasTokens(address)", +"3ceffd41": "TokenPurchased(address,uint256,uint256)", +"3cf0659a": "right25(uint256)", +"3cf26a33": "transferAssetOwner(address)", +"3cf274a5": "bighype()", +"3cf2eb85": "dispossess(address,uint256)", +"3cf39ed3": "ini_supply()", +"3cf3a338": "WithdrawTithes()", +"3cf3d6d8": "getAllCellInfo()", +"3cf3ecd7": "StartGuess_tw(string,string)", +"3cf3f105": "checkInvarience()", +"3cf43e08": "revertTokens(address,address)", +"3cf43e2c": "btcId()", +"3cf46fee": "RoundClose(uint256,uint256,uint8)", +"3cf5040a": "getHash(bytes32)", +"3cf5161c": "Th_stage0(uint256)", +"3cf52ffb": "proposedTimestamp()", +"3cf572a7": "setNotice(string)", +"3cf5da75": "getTokenInvocations()", +"3cf679a5": "lastBlock_v19Hash_uint256()", +"3cf682b8": "CikkaCoin()", +"3cf6ed95": "stageForDate(uint256)", +"3cf7cbdb": "showTimeLockValue(address)", +"3cf7d47b": "IncreaseInvestedWeiAmount(uint256,uint256)", +"3cf885c4": "isBitSet(uint256,uint8)", +"3cf8acec": "allocateBid5(bytes32)", +"3cf9db41": "drawWinner(uint256,uint8)", +"3cfa92de": "BAToken(address,address,uint256,uint256)", +"3cfaa9ed": "mintedWallets()", +"3cfaaca0": "DMRToken()", +"3cfac38e": "validatePrediction(bytes32,uint256,uint8)", +"3cfb35aa": "ensSubdomainRegistrarBase()", +"3cfba0e3": "ethBalances(address)", +"3cfc47ea": "getPostPoster(uint256)", +"3cfc83f5": "addGame(string,address)", +"3cfd1f80": "VirginToken()", +"3cfd78f3": "onlyBouncerAddExtension(address)", +"3cfd86f1": "CashPokerProToken()", +"3cfe25cf": "cap_ACE()", +"3cfe6731": "claimfordividend()", +"3cff5b66": "getIsAuth(address)", +"3d00b8e3": "buyTokens(uint256,uint256,bytes)", +"3d0141f6": "whatProposal(bytes32)", +"3d01bdec": "CTO()", +"3d02c85b": "rejectTokens(address,uint256)", +"3d03582f": "collectBack()", +"3d0383c2": "getthismuchethforyourspud(uint256)", +"3d03886a": "setRobotAddr(address)", +"3d03a284": "getMyBat()", +"3d03ec29": "createCoin()", +"3d05d0e6": "MintFToken()", +"3d06242a": "setVIPFee(uint256)", +"3d062adf": "deleteMember(address,address)", +"3d0673d4": "getTotalToken()", +"3d080bd9": "dateRelease3()", +"3d089bf6": "GlobalBusinessSystem(uint256,uint256,uint256,uint256,address)", +"3d092b3d": "getMatch(uint256)", +"3d0977e1": "CROWD_WEEK2_PERIOD()", +"3d0a8dab": "endExclusive()", +"3d0ab170": "feePerUnitOfCoin(uint256)", +"3d0ab7e8": "PresaleContribution(address,uint256)", +"3d0acdaa": "getReservedPercentageUnit(address)", +"3d0c3836": "emergencyERC20Drain(uint256)", +"3d0c46d0": "getMessagesCount()", +"3d0c4924": "MAXIMUM_SUPPLY()", +"3d0c7eb6": "purchaseTicket(uint256,address)", +"3d0c9cc4": "PACK_SIZE()", +"3d0e6afc": "crownFreeze(address,uint256,uint256)", +"3d0ed048": "delBlacklist(address)", +"3d0ef823": "DepositReturn(address,uint256)", +"3d0f963e": "updateWhitelist(address)", +"3d11fa43": "delUnicornContract(address)", +"3d124c9d": "PointGameParticipate(address,uint256,uint256)", +"3d125f03": "buyTokens(address,address,address,uint256)", +"3d126a45": "devTokensPercent()", +"3d126e57": "SparkChainToken()", +"3d13341c": "_bytes32(string)", +"3d13aec8": "save(address,uint256,uint256,uint256,string,string,uint256)", +"3d140d21": "approve(address,bool)", +"3d14263a": "FailedSend(address,uint256)", +"3d147789": "UpgradeCommited(address)", +"3d160de9": "pricesAreStale()", +"3d160e0b": "UNLOCK_PHASES()", +"3d1657ff": "getIncreaseBalance(uint256,uint256)", +"3d1678f4": "redeemEnableTime()", +"3d16991a": "getStep(bytes16)", +"3d17a2d8": "merchantHistory()", +"3d182c42": "private_SetPause(bool)", +"3d1843c3": "callAndFail()", +"3d18678e": "setFees(uint256)", +"3d18b912": "getReward()", +"3d18bb7f": "HP()", +"3d18c615": "LastProposalID()", +"3d18e7b5": "amIH1()", +"3d1930ac": "mintBounties(address)", +"3d19481f": "balancePreSale5()", +"3d1a653f": "Ticket_Ganador(uint256,uint256)", +"3d1aa963": "chargeFee(address,address,uint256)", +"3d1aac95": "setWalletToClientAccount(bytes32,address,bytes32)", +"3d1b9d00": "TRCToken()", +"3d1bd1bf": "totalLockedHavvens_byAvailableHavvens_limitedSum()", +"3d1ced2b": "candyuser(address,address,uint256)", +"3d1cefc4": "SurveyToken(uint256)", +"3d1d2202": "getMinersOnSale()", +"3d1d4703": "newTribe(string,string)", +"3d1e215d": "redistributeTokens(address,address)", +"3d1e40a7": "changeTimeWithoutUpdate(uint256)", +"3d1ea04a": "getUnitCoinProductionIncreases(address,address,uint256)", +"3d201fcf": "MatchEnd(uint256,string)", +"3d20d9b0": "BONUS_ICO_ROUND2()", +"3d20e09e": "lpBidPrice()", +"3d20e3d7": "SetMemberLevel(address,address,uint8)", +"3d21aa42": "sendApproval(address,uint256,address)", +"3d226146": "createEvent(bytes32,bytes32[],bytes16[],uint256[])", +"3d2271fd": "setBytesRaw(string)", +"3d228ce8": "presaleTokenCreationRate()", +"3d22d571": "userBanning(address)", +"3d235d88": "KPRToken()", +"3d23af26": "newRegistryWithToken(uint256,string,uint8,string,uint256[],string)", +"3d24081c": "randomSkinAppearance(uint256)", +"3d249031": "Multicoin()", +"3d26851a": "_transferFrom_byProxy(address,address,address,uint256)", +"3d2796f5": "Forwarder(address)", +"3d289a76": "irbg(address,uint256)", +"3d28bab2": "SetGasBuy(uint256)", +"3d28ce75": "ChooChooCoin()", +"3d28e2ac": "totalDividendPayOuts()", +"3d2a9b9b": "getPartIndexes(uint256)", +"3d2c8d18": "lastEvidenceCheck()", +"3d2ce522": "setdaily(uint256)", +"3d2d812f": "MultiTransferValues(address[],uint256[])", +"3d2d8263": "tokenFund()", +"3d2dea63": "transferAny(address,address,uint256)", +"3d2e7538": "IPv6Token()", +"3d2f5bda": "startVoting(uint256)", +"3d2fbd0a": "usdEstimateInContract()", +"3d30276b": "Presale(uint256,address)", +"3d30dbe9": "updateBonusEligibity(address)", +"3d316134": "maxTokensToSale()", +"3d31e97b": "appendDebtLedgerValue(uint256)", +"3d32cb63": "updateReputationScore(bytes32,bytes32)", +"3d330c49": "findElevenPmUtc(uint256)", +"3d34a3e7": "setStage2()", +"3d34f921": "HexelErc20Token(string,string,uint256,address)", +"3d35d7ba": "getBuyRate()", +"3d36f7dd": "assertCorrectAllocations()", +"3d37542b": "launchOutcome()", +"3d37ef8c": "RESERVED_PARTNERS_LOCKED_SIDE()", +"3d380ff3": "releaseBatch()", +"3d389faf": "buyEnable()", +"3d38abd9": "MercadoMoeda()", +"3d3984bf": "ironProcessed(address)", +"3d39c260": "managers(uint256)", +"3d3b1c02": "SendEtherToBoard(uint256)", +"3d3b1fdf": "STRAToken()", +"3d3b2056": "getReadableTime(uint256)", +"3d3b26a6": "inflate(address,uint256)", +"3d3b4738": "GXVCReplay(uint256,address)", +"3d3bc43e": "getMessageRequestHashUsingProviderAddress(address,uint256,address)", +"3d3c3f2d": "snapshotUpdate(address,uint256,string)", +"3d3c5c9f": "trustedFillOrderTransfer(address,address,uint256)", +"3d3cba10": "decrementIncome(address,uint256)", +"3d3da831": "valueAfterAddingPremium(uint256)", +"3d3db8eb": "getOutcomes()", +"3d3eb22a": "desapprove(address)", +"3d3f5114": "MEW_CROWDSALE_FUND()", +"3d405342": "fechAllCandidatesBySnapshotBlock(uint256)", +"3d40c266": "takeSellTokenOrder(address[3],uint256[3],uint256,uint8,bytes32,bytes32)", +"3d412396": "JBXPERETH()", +"3d4197f0": "setVal(uint256)", +"3d424dc0": "ViewtBet(address)", +"3d4311e2": "getRoundCasteValues(uint256)", +"3d432808": "destroyTokens(uint256,address,uint256,uint8[],bytes32[],bytes32[])", +"3d436ea1": "getEthBullet()", +"3d438c1e": "TheHumanFund(uint256,string,uint8,string)", +"3d43bd1e": "replaceDSPRegistry(address)", +"3d44c476": "getLinkDigest(bytes32,address)", +"3d456aa5": "extendFreezeBy(uint256)", +"3d45b9ef": "TokenCLCC(uint256,string,string)", +"3d46b819": "getNonce(uint256)", +"3d472d4d": "devGiveBlockReward()", +"3d488c52": "getPackageNameOfCampaign(bytes32)", +"3d48c067": "testSmartContract(string)", +"3d48f3af": "costOfOrder(uint256,uint256)", +"3d493572": "setSoftCapReached()", +"3d49ba0f": "updateMemeUrl(uint256,string)", +"3d4a7c1e": "setStage1Ends(uint256)", +"3d4a8b4e": "ScholarToken()", +"3d4af864": "CatToken()", +"3d4b2c2c": "totalTokenBalance()", +"3d4ba37a": "setMajorityThreshold(uint256)", +"3d4d3600": "itemList(uint256)", +"3d4d8d4f": "withdrawEarnings(address)", +"3d4ee7a0": "FundariaToken()", +"3d4ef007": "vestingCount(address)", +"3d509c97": "removeRewardToken(address)", +"3d532ac5": "SWEET(uint256,string,string)", +"3d532bde": "removeSchedules(uint256,uint256[])", +"3d536a2e": "joinGame(string)", +"3d54b48a": "CreaEther()", +"3d561f73": "getBattleboard(uint16)", +"3d565121": "lockup_enddate()", +"3d568185": "createSpecialCards(uint32,uint16,uint16)", +"3d56dca3": "getBecomeHostSignatureAddress(address,string,uint8,bytes32,bytes32)", +"3d582391": "setEndsAtUTC(uint256)", +"3d584063": "getManager(address)", +"3d58650a": "BreakCoinToken()", +"3d58d0c3": "DROP()", +"3d5905a9": "setHolderAddress(address,uint256)", +"3d595134": "changeDubiAddress(address)", +"3d59995c": "remoteSetWinner(uint256,string,uint256,uint256)", +"3d59cd60": "changeRoot(bytes32)", +"3d5a3016": "canGotoState(uint8)", +"3d5aed1d": "_subGene(uint256,uint256,uint256)", +"3d5b0124": "RCR()", +"3d5b2b4e": "GxDeploymentAdmins()", +"3d5bb7f4": "setDaVinci(address)", +"3d5d0720": "totalContributedETH()", +"3d5db1c2": "incrUserOnholdBal(address,uint256,bool)", +"3d5dfb63": "_Approval(address,address)", +"3d5dff53": "tokensOwed(address)", +"3d5ef471": "nfcIdOf(uint256)", +"3d608572": "testControlCreateWithParentsSameItemId()", +"3d614def": "deployWillWallet(uint256)", +"3d619212": "basePublicPlacement()", +"3d62fa80": "getByFromAndTo(uint256,uint256,uint256)", +"3d637ebe": "tokensCreationVIPsCap()", +"3d639d84": "_getItemPrice(uint256)", +"3d64125b": "balanceof(address)", +"3d6571e5": "blub()", +"3d65a59d": "ICG()", +"3d65cf9c": "initParams(address)", +"3d65ecdf": "payToProvider(address)", +"3d662cff": "tokenDestroy()", +"3d66da8e": "claimRefund(address,address)", +"3d6759ec": "_createAsset(address,uint256,uint256,uint256,address)", +"3d677067": "buyProp(uint256,uint256,uint256)", +"3d68011a": "PRCT_TEAM()", +"3d6839c6": "REAL(address)", +"3d6859f2": "investorInfo(address,uint256)", +"3d68d33f": "BTCP()", +"3d694f30": "approveSettingCreation(uint256,bool)", +"3d695002": "_addressNotNull(address)", +"3d69b403": "isOutcomeSet(bytes)", +"3d69f4d6": "outsourceDelivery(uint256,uint256,int256,int256,int256,int256)", +"3d6a2231": "DrepToken()", +"3d6a32bd": "createTradeContract(address,uint256,uint256,uint256,bool,bool)", +"3d6a3664": "setNewOracle(address)", +"3d6a58ea": "convertSgnToSga(uint256)", +"3d6a71e4": "endedAt()", +"3d6a9750": "ShowTickets(uint256,uint256,uint256)", +"3d6ab68f": "CREATE_PERMISSIONS_ROLE()", +"3d6ad962": "claimPrizes()", +"3d6b0cb7": "testFailCreateWithParentForeignNotInUse()", +"3d6b6c70": "increaseJackpot(uint256,bytes32,address,address,uint256)", +"3d6b7301": "readAddresses(bytes32[])", +"3d6bc807": "cancelEtherBroAuction(uint256)", +"3d6bcaef": "GetWagerData(bytes32)", +"3d6c4df7": "updateWallet(address,string)", +"3d6df0d5": "docHash()", +"3d6e38b8": "changedp1(address)", +"3d6e87c1": "cancelSaleByAddress(address)", +"3d6ea8b2": "confirmMany(bytes32[],address[],uint256[],uint8[],bytes32[],bytes32[])", +"3d6eec6b": "RootNo3(uint256,string,uint8,string)", +"3d6f3366": "TokenCrowdsale()", +"3d6fc91d": "SetDestination(address,address)", +"3d6fda19": "stopIssue()", +"3d709ff1": "getRemixCount(uint256)", +"3d724027": "setLock(address[],uint256[])", +"3d725831": "getFundedTokensByIndex(bytes32,string,uint256)", +"3d72c71b": "SimpleToken()", +"3d72f40f": "getUserP3DInfo()", +"3d73c2de": "reserveCATDestination()", +"3d73ddfc": "SGNL()", +"3d7403a3": "update(string)", +"3d7417a1": "removePrMemberById(uint256,address,address)", +"3d741994": "preIcoStart()", +"3d747f67": "invalidateToken(address)", +"3d74e856": "setMinJackpotBet(uint256)", +"3d750b28": "found()", +"3d756973": "getWrapperData()", +"3d75c49e": "OEBCBank()", +"3d75e106": "ImportTestC()", +"3d7646f7": "getRok()", +"3d769e3d": "EXT_COMPANY_ONE()", +"3d76b7a3": "checkHash(uint256)", +"3d79c332": "ALU()", +"3d79d1c8": "bal()", +"3d7a8baf": "setQuoteKey(uint256)", +"3d7a8c0e": "POPKOIN()", +"3d7bed99": "addProxyForSender(address,address)", +"3d7c9f8c": "THB_Omnidollar()", +"3d7d20a4": "mintFungibles(uint256,address[],uint256[])", +"3d7d3f5a": "createSaleAuction(uint256,uint256,uint256,uint256)", +"3d7daab3": "_isValidSignatureAndData(address,bytes)", +"3d7e1048": "TransferredUnlockedTokens(address,uint256,bytes32)", +"3d7f09a3": "editEtherLimit(uint256)", +"3d7f6536": "getGraffiti(uint256)", +"3d80b532": "balance(string)", +"3d80ea28": "claimUSInvestorTokens()", +"3d813d8b": "setBountyAmounts()", +"3d814377": "window3StartTime()", +"3d820a90": "TOKEN_RATE_PRESALE()", +"3d8270f5": "getContributor(address)", +"3d82cf5a": "maxBattleRounds()", +"3d82e1b1": "assertEq3(bytes3,bytes3,bytes32)", +"3d82f71e": "distributeEGOX(address[])", +"3d832080": "ownerSetJackpotOfHouseEdge(uint16)", +"3d83230f": "auctionSuccessful(uint256,uint128,address,address)", +"3d83ed36": "increaseQuota(uint256,uint256,address)", +"3d84b8c1": "mintedForAccount(address)", +"3d856c9b": "getCmasByOwner(address)", +"3d8731ac": "LOCK_MAX()", +"3d8807f8": "cardsOfOwner(address)", +"3d888aa5": "PerformAirDrop()", +"3d88eb3f": "replOne(address,address)", +"3d8a03af": "getMatch()", +"3d8a63e4": "scam()", +"3d8b41f3": "createBurnRequest()", +"3d8c3dc9": "addTotalSupply()", +"3d8c5af4": "oddsSingle(uint256)", +"3d8c9b8c": "purchaseWolk(address)", +"3d8d020a": "withdraw(address,address,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"3d8d0db4": "totalBuyPrice(uint256,uint256)", +"3d8e0f4e": "checkRevert2(uint256)", +"3d8e1b7c": "sumICOStage6()", +"3d8e2947": "getFileAddress(bytes)", +"3d8f89d7": "setBooleanValue(string,bool)", +"3d908c82": "distributeTokensToAllUsers()", +"3d90d44d": "addPowerSource(address,uint256,uint256)", +"3d90eeb9": "getCartSubtotal(address)", +"3d91eec0": "NebbexToken(uint256,address)", +"3d922f90": "depositar()", +"3d9277f0": "unlockTip(bytes32)", +"3d9287fa": "whitelisted()", +"3d937410": "CokecoinTokenTest()", +"3d937824": "setCompte_35(string)", +"3d93a355": "InTokenTest12(uint256,string,uint8,string)", +"3d944953": "withdrawCollectedResources()", +"3d946410": "isPreSalePeriod()", +"3d946c53": "restartElection()", +"3d94e23b": "viewXCAT(address,address,bytes32)", +"3d955aa3": "poll(uint256)", +"3d956691": "tokensToSell()", +"3d957b0b": "third_bonus_amount()", +"3d960ec3": "round2Sold()", +"3d96c758": "TreeLim()", +"3d96fa3c": "getAllDelegatorAddress()", +"3d972839": "withdraw(uint16)", +"3d9aa932": "oraclize()", +"3d9ad7ce": "SENIUM()", +"3d9aeef0": "isBetStorage()", +"3d9af4d1": "setMigrateDueToNoReports(bool)", +"3d9ce89b": "scheduleCall(bytes4,bytes,uint256)", +"3d9dcb07": "getFamedStarByID(uint256)", +"3d9e23ca": "PartnersFund()", +"3d9e4233": "registerAlbum(bytes32[],bytes32[],bytes32[],bytes32[],bytes32,bytes32)", +"3d9f01fb": "renterOf(uint256)", +"3d9f923b": "updateDenomination(bytes8,address)", +"3da01325": "blockUser(address)", +"3da04e4a": "getUserGroups(address)", +"3da06d6c": "getTemporaryWinningFaction()", +"3da09d40": "Ripple()", +"3da0ac79": "compare()", +"3da1c0c3": "isVerifiedUser(address)", +"3da1eff5": "claimOwnerSupply()", +"3da1f79a": "revokeSignature(uint256)", +"3da216da": "LuckyMoneyToken(uint256,string,uint8,string)", +"3da32dc5": "FcsCoin()", +"3da368c0": "ETHcomeback820()", +"3da4ba4a": "AiboCoin(address,uint256)", +"3da55aba": "setZlotsAddress(address)", +"3da5c3ce": "puzzle(address,bytes32)", +"3da5d173": "ZeroExExchange(address,address)", +"3da611cd": "ContractEthLimitChanged(uint256,uint256)", +"3da64a06": "issueTokenToGuaranteedAddress(address,uint256,bytes)", +"3da69ff4": "Salome()", +"3da76788": "getDataLength()", +"3da79946": "allEthOUT()", +"3da80d66": "contains(address[],address)", +"3da98498": "Crowdtes()", +"3daa33d5": "buyAndSellPrice()", +"3daad222": "asmTransferFrom(address,address,address,uint256)", +"3dab45b6": "setMtdPreAmount(uint256)", +"3dabb0f6": "verifySignature(address,address,uint8,bytes32,bytes32)", +"3dac68b7": "setAddressAdv(address)", +"3daceda1": "createSyndicate(address,uint256,uint256,uint256,uint256)", +"3dad1583": "getAyes(uint256)", +"3dae94f0": "cumulativeIndexOf(uint256[],uint256)", +"3daee1b8": "weekThreeRate()", +"3daefe4b": "Election1()", +"3daf099f": "transferEthereum(uint256,address)", +"3daf31b5": "withDecimals(uint256,uint256)", +"3dafbf92": "SNPToken()", +"3db05068": "toForecastData(uint8,uint8,bool,uint8,uint8)", +"3db08826": "isProofValid(bytes32[],bytes32)", +"3db13fec": "PalletOneToken()", +"3db1c253": "projectFailed()", +"3db1f00a": "TOSMidHoldingContract()", +"3db2254b": "deleteAllReports()", +"3db2a12a": "Empty()", +"3db36b5f": "transferTokensFromTeamAddress(address,uint256)", +"3db3f2cf": "submitBid(address,bytes32)", +"3db62953": "currentExchangeSystem()", +"3db7a118": "blockDotDifficulty()", +"3db7c149": "SmartCityCrowdsale(address,address,address,uint256,uint256,uint256)", +"3db7e347": "contributorAt(uint256,uint256)", +"3db80346": "closeGroup(uint32)", +"3db8352d": "setEvaluator(uint256)", +"3db8433c": "setLeagueRosterAndCoreAndContestContractAddress(address,address,address)", +"3db8493a": "put(uint256,string,string)", +"3db9c4aa": "createIntention(address)", +"3dba0b57": "MCTTokenAddress()", +"3dba6197": "etherAccumulator()", +"3dbad089": "Contribute(address,address,uint256)", +"3dbae017": "EasyToken()", +"3dbae9f9": "startIcoTwo()", +"3dbb07ac": "s28(bytes1)", +"3dbb270d": "AshCashToken()", +"3dbb7f46": "setPrizeFundFactor(uint256)", +"3dbb874e": "getPetClaims(uint64)", +"3dbba05c": "callDefaultRelease()", +"3dbc7c69": "totalApproval(address)", +"3dbe56f0": "getUnfreezedTokens(address)", +"3dbe6469": "ChangeBuyer(address)", +"3dbedbd4": "StopICO()", +"3dc02266": "fipsRegister(uint256)", +"3dc09a70": "OwOToken()", +"3dc0d600": "nome_vincitore()", +"3dc11dd1": "ethSwapRate()", +"3dc1579a": "RELEASE_TIME()", +"3dc19db8": "addAdministator(address)", +"3dc1a6bc": "getSkillLength()", +"3dc1d46b": "auditGuess(uint256,string,uint8,uint256,uint256,uint256)", +"3dc1ef34": "limitMaxSupply()", +"3dc23486": "_addBalance(address,uint256,address)", +"3dc268a6": "oraclize_query(uint256,string,bytes[2],uint256)", +"3dc286ae": "getEncSeckey()", +"3dc37539": "reveal_test_data(int256[],int256)", +"3dc38fc1": "addCourse(uint256,uint256)", +"3dc4cac9": "Mycryptonline()", +"3dc58149": "getDepositRecord(address)", +"3dc5bf97": "acceptRegistrarTransfer(bytes32,uint256)", +"3dc60e52": "getKittyCount(address)", +"3dc6e9b0": "changeMaxLockDuration(uint256)", +"3dc7426e": "setMaximumMintableQuantity(address,uint256)", +"3dc7c549": "sumHardCapICO()", +"3dc7ea7f": "recently_added_address()", +"3dc9124e": "numOfLoadedCrowdsalePurchases()", +"3dcb0b81": "PollManagedFund(address,address,address,address,address,address,address,address[])", +"3dcb66db": "Storer()", +"3dcbab40": "UnFrozenFunds(address,uint256)", +"3dcbf7eb": "addAddressToAccountFor(address,bytes,bytes,address,bytes32)", +"3dcd351f": "getAllReceipt()", +"3dcd6176": "returnTokenBalance(address[2],bytes32)", +"3dce1ea9": "curPayoutId()", +"3dced193": "getPI_edit_33()", +"3dcf59ca": "initiateMigration(address,address)", +"3dcfbdd0": "getBrickAddress()", +"3dd00c42": "getMyMinersAt(uint32,uint32)", +"3dd02f06": "setCoinStorage(address,address)", +"3dd16673": "teamETHAddress()", +"3dd287d4": "monsterNFTContract()", +"3dd297da": "safeMultiply(uint256,uint256)", +"3dd2b811": "CSNO()", +"3dd2e0f0": "optionTotalTimes()", +"3dd35279": "memberIndex(address)", +"3dd49939": "ext(address)", +"3dd5b2da": "withdrawContractETH()", +"3dd5e0ec": "NewSouth21Token()", +"3dd7609a": "ETHER_AMOUNT()", +"3dd7b14b": "optionPoolBalance()", +"3dd7c1b9": "newProduct(string,string,uint256,uint256)", +"3dd82637": "Transformers()", +"3dd83fe1": "newPlayer(address,uint256,uint256)", +"3dd86478": "isFromState(address,address,uint256)", +"3dd93a8a": "getUsersGeneratorsIds()", +"3dd95d1b": "setExecutionDailyLimit(uint256)", +"3dda1aff": "Football()", +"3dda37dc": "flags(address,address)", +"3dda7b1d": "fuddToken()", +"3ddac459": "changeminpresale(uint256)", +"3ddb77bd": "_distDay()", +"3ddc3277": "charityFoundationIdx()", +"3ddc8e9c": "fixedLoge(uint256,uint8)", +"3ddcbace": "Escrow(address,address,address)", +"3ddd4698": "registerNameXaddr(string,address,bool)", +"3ddd5313": "acceptPayments()", +"3dde1598": "redeemBattleCrates()", +"3dde3918": "removeAdministrators(address)", +"3de035bf": "endWork(uint256)", +"3de1a4bc": "getDepositPool()", +"3de24c17": "refundInvoice(address,address)", +"3de33a32": "doIssueTokens(address,uint256)", +"3de377ec": "mock(uint256)", +"3de39c11": "maxGasPrice()", +"3de3ebf8": "getPlayerEnergy(address)", +"3de3fbd9": "totalTokenRewards()", +"3de46340": "getBlockVoterBalance(uint256,address)", +"3de478cc": "validateSignatures(bytes32,bytes,bytes)", +"3de4ca9e": "Karma(address,address)", +"3de4eb17": "getAdopters()", +"3de696d3": "percentFeeTimes5()", +"3de6a03f": "checkStatusICAP(bytes32,uint256,string,address)", +"3de7dfb1": "Amount_of_Chi_for_One_ETH()", +"3de8c792": "BUYER_STEP_4(bytes32,uint256,bytes1,address)", +"3de8d340": "dividendsBlocks()", +"3de9c8e6": "haltFundraising()", +"3de9e4c6": "__transferFromWithReference(address,address,uint256,string)", +"3dea6b9a": "getMeme(uint256)", +"3deaa297": "transferAllDividends()", +"3deaa323": "minPurchaseLimit()", +"3dead9e8": "Mythereum()", +"3deaf6d4": "MAXIMUM_FIRST_DAY_CONTRIBUTION()", +"3deb23d2": "STANDARD_RATE()", +"3deb91c7": "setMinReserve(uint256)", +"3debd2d8": "sendToAddress(address,uint256)", +"3dec4cb3": "pre_ico_start()", +"3dedc36e": "getGunByIdPart2(uint256)", +"3dee7237": "amountOfBPs(address)", +"3def449b": "FipsNotary()", +"3defb962": "heartbeat()", +"3df08c6a": "privateSalesTokensSold()", +"3df16377": "make_move_and_claim_victory(uint256,uint8,uint8,uint8,uint8,uint8,uint8,uint8)", +"3df18d2a": "model(address)", +"3df18e0a": "bytes32ToHex(bytes32)", +"3df19507": "intToDec(uint256)", +"3df2b29d": "powerDown(address,address,uint256)", +"3df2b723": "adminClaimAirdropMultiple(address[],uint256[])", +"3df2d6fd": "FIGHTMONEY()", +"3df40c7a": "startPreIcoDate()", +"3df4a282": "setCurrentSaleDayAndBonus(uint8)", +"3df4ddf4": "first()", +"3df5140c": "setIsTokenCanBeSell(bool)", +"3df5958f": "VillanovavsRadford()", +"3df6b23c": "angelRound()", +"3df76482": "fipsPublishData(bytes20,bytes)", +"3df77c0e": "testBalanceOf()", +"3df7c86d": "mom()", +"3df86f79": "split32_20_12(bytes32)", +"3df91162": "getUpdatable(bytes20)", +"3df95fc9": "HAYATO()", +"3df96853": "carIdToRenter(uint256)", +"3dfa0384": "messageSenderAddress()", +"3dfa1c46": "LLV_v31_5()", +"3dfb4843": "renewDeed(bytes32)", +"3dfc42c8": "TdeFinalized(uint256)", +"3dfc6980": "set_verifiedUsersOnlyMode(bool)", +"3dfca2ad": "finishVoting(address,uint256)", +"3dfcdf2b": "CoinVila(address)", +"3dfd288a": "checkVotingForTransferWeiFromExchangeToPayment()", +"3dfd83c6": "SPARCToken()", +"3dfeac48": "MaximalInvestmentChanged(uint256)", +"3e00b910": "buyTokenPreIco(address,uint256)", +"3e011b11": "getTokensBackAFterCorwdsale()", +"3e032a3b": "slippage()", +"3e03c84f": "tokenIsLocked(address)", +"3e03d50f": "isTeam(uint256)", +"3e0448c2": "ChangedId(address,string)", +"3e045845": "issueSecurityTokens(address,uint256,uint256)", +"3e04bf23": "upgradeShip(uint32,uint8)", +"3e058664": "getBonusPercentRate()", +"3e05c964": "withdrawnByBeneficiary()", +"3e05ca7c": "get_PendingGains(address,address,uint256,bool)", +"3e05e01b": "ethReward()", +"3e0663e0": "AdminDrawProcess()", +"3e06be20": "downgradeToBasic(bytes32)", +"3e0764ba": "set_payment_details(uint256,string,address)", +"3e07905e": "endBuffer()", +"3e0807ca": "numberBtcUpdates()", +"3e0831e2": "putStoWithBto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"3e083f7d": "deals(uint256,uint256)", +"3e085c3d": "airDropToOldTokenHolders(address[])", +"3e085d0e": "transfer(address,uint48,bytes,string)", +"3e087d01": "addEligibleBurner(address)", +"3e0912ec": "KangEOS()", +"3e093f38": "testPullWithTrust()", +"3e09876a": "vehicleFound(address,uint256)", +"3e0a322d": "setStartTime(uint256)", +"3e0a51b4": "TweetAccount()", +"3e0a7ab5": "addONG_AUDIT(bytes32,string,string)", +"3e0aba92": "fourth_release(uint256)", +"3e0ad2d4": "TPC(uint256,string,string)", +"3e0aedaf": "TreePlusToken()", +"3e0b7eb2": "updateTranscoderWithRewards(address,uint256,uint256)", +"3e0bd52e": "setAccountMaster(address)", +"3e0c1f2a": "fetchNextSnapshotBlock()", +"3e0c5d2c": "earlySafeWithdrawal(uint256)", +"3e0d4f4a": "ApproveContractorProposal()", +"3e0dfbdf": "getInvestorByAddress(address)", +"3e0efe67": "putBtcWithSto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"3e0fddbd": "ClaimHodlToken(address,uint256,uint256)", +"3e1092f2": "changeModuleRegisterOwner(string,string,address)", +"3e109a19": "minBid()", +"3e112bf3": "calcResult(uint256,uint256,uint256)", +"3e112ed7": "reserveCoins(address,uint256)", +"3e11456f": "PRIVATE_SALE_ACCOUNT()", +"3e11741f": "sellToken(address,uint256,uint256)", +"3e118dbe": "_version()", +"3e118f1f": "weiMinSaleIco()", +"3e11b765": "batchApprove(address[],uint256[])", +"3e11e378": "changeController(address,address)", +"3e127ab7": "maxPoly()", +"3e127e76": "safe_add(uint256)", +"3e129967": "SpaceWar()", +"3e1457a1": "initRates(uint256[],uint256[])", +"3e152d8e": "maxBonusTickets()", +"3e15346d": "removeGlobalConstraintPost(address,int256,address)", +"3e156601": "p_setMinInvestment(uint256)", +"3e15ef90": "GetDataPoint(uint256,uint256,bool,string)", +"3e165810": "initBMC(address,uint256,uint256,uint256,uint256)", +"3e175c0b": "goldUnFreeze()", +"3e17b882": "mutateCrabPart(uint256,uint256,uint256)", +"3e18117a": "AhooleeToken()", +"3e182d3f": "addSelctFight2Death(address,uint256,uint256,uint256,uint256)", +"3e184adf": "BucksTecToken()", +"3e18e78e": "endTimeinMinutes()", +"3e1a3376": "updateInvestorsComission(uint256)", +"3e1a420f": "publishRewardlessTaskListing(string,address,uint256,uint256)", +"3e1a9300": "getLastIndex()", +"3e1b0d29": "fechAllVotersBySnapshotBlock(uint256)", +"3e1b4645": "qualifiedAddress(address)", +"3e1b5b3e": "rateEarlyStage4()", +"3e1ba676": "subBountySupply(uint256)", +"3e1c01b5": "capitalAllocation()", +"3e1c2d5a": "RegisterKey(address,string)", +"3e1cc152": "fundWallet2()", +"3e1d09be": "changeSubcourtMinStake(uint96,uint256)", +"3e1d8156": "Issue(uint256,address,uint256)", +"3e1da046": "isDelegateOf(address,bytes8)", +"3e1e292a": "testCopy(bytes)", +"3e1eab35": "VUTEST2()", +"3e1fd0da": "checkAccess(bytes32,address)", +"3e20f7fb": "HashnodeTestCoin()", +"3e214e96": "changeAirDroper(address)", +"3e2153bf": "viewBeneficiaryDetails(address)", +"3e21b00f": "C40Coin()", +"3e239e1a": "getHour(uint256)", +"3e23ee7e": "executeTrade(address,address,uint256,uint256,uint256)", +"3e23ee9c": "BlackHorseWallet()", +"3e24fcbf": "capHicsToken()", +"3e254a0c": "YTCOMMUNITY()", +"3e2557c5": "_price_tokn_ICO_second()", +"3e25e837": "withdrawCommission()", +"3e25fdd4": "getLastStellar()", +"3e260a2c": "allocateReserveTokens()", +"3e262e46": "getTradeOfferSender(uint256)", +"3e2640d6": "extendClosingTime(uint256)", +"3e2729bf": "isRevocated(bytes)", +"3e275f06": "crowdSaleStart(uint16,uint16[5])", +"3e27e1be": "validateResetDeadTokens(uint256)", +"3e28912f": "getStrField3()", +"3e2cd68b": "get_share_by_address(address,address)", +"3e2d6cf6": "_emitWithdrawn(address,uint256,address)", +"3e2d7004": "getTokenRate()", +"3e2d7de1": "mintTokensWithIncludingInJackpot(address,uint256)", +"3e2ddb60": "changeMajorThreshold(address,uint256,bool,bytes)", +"3e2e806d": "rewardTokensFloor(address,uint256,uint32)", +"3e2ee39e": "debug_resetuser()", +"3e2fce37": "updAutoFreeze(bool)", +"3e2fe149": "getNewOwner()", +"3e30046a": "maxSale()", +"3e30838d": "delOperator(address)", +"3e313f28": "_changeColour(uint256,uint8,uint8,uint8)", +"3e31c77f": "setZoPrice(uint256)", +"3e321249": "PdexToken(address)", +"3e32224a": "BF1Token()", +"3e325589": "init(address,address,uint256,int8)", +"3e326048": "initWallet()", +"3e32bea2": "priceIncreasePerPurchase()", +"3e33c37b": "gameContext(uint256)", +"3e345bd8": "FatherToken()", +"3e34f34e": "isUserHasPermissonToModify(address,string)", +"3e351a45": "lotteryWinner()", +"3e352d49": "updateTokensForEtheeraTeam(uint256)", +"3e361281": "betsWon()", +"3e362c96": "bountyCount()", +"3e363696": "BuyWithPathwayFromBeneficiary(address,uint256)", +"3e3657a5": "addConfigEntryInt(bytes32,uint256)", +"3e3756db": "PauseOn(uint8)", +"3e379d64": "setBonus()", +"3e38a2b7": "delegateCount()", +"3e38dab8": "refundFlip(bytes32)", +"3e3926e4": "whitelist(address,uint256,uint256,uint32)", +"3e3b429a": "canPurchase(address)", +"3e3bc743": "AmazingDex(address)", +"3e3c9eae": "qsize()", +"3e3cba8f": "changeBalancesDB(address)", +"3e3ce4f3": "GSEN()", +"3e3d64e2": "hatchingsNeeded()", +"3e3dae41": "maximumSaleLimitUnits()", +"3e3deb8b": "MyMonsterCount(address)", +"3e3dff65": "GainsCalculated(address,uint256,uint256,uint256,uint256)", +"3e3e0b12": "stopMinting()", +"3e3ee859": "NewQuestion(string,bytes32)", +"3e3f4e24": "RealEstateCryptoFundAirdrop(address)", +"3e40aab4": "returnActions(uint256[8],uint256)", +"3e412533": "Easy()", +"3e415358": "transfer(address,uint256,address,address,uint256,uint8,bytes32,bytes32,uint256)", +"3e41d5eb": "addOwnersWithHowMany(address[],uint256)", +"3e427e89": "returnHostAndCreatorCut(uint256)", +"3e42ad79": "Instantium()", +"3e42ed80": "ProgressiveToken(string,uint8,string,uint256,uint256,uint256,address)", +"3e43b652": "betValueOf(address)", +"3e43e8b4": "AnimeToken(address,uint256)", +"3e441ef4": "SetItem(address,uint256,address)", +"3e445446": "STARTING_KILOS()", +"3e445506": "successfulPreSale()", +"3e44694f": "DID()", +"3e4476a3": "addAddressToJackpotParticipants(address,uint256)", +"3e450fff": "adminDeleteAccount()", +"3e4565d2": "testErrorUnauthorizedNameRegister2()", +"3e4604b3": "robotAddr()", +"3e460a84": "distributeBooking(uint256)", +"3e46eb60": "fortune_endauction(uint256)", +"3e476053": "moveFunds(address,uint256)", +"3e4852bd": "getGroupData(uint256)", +"3e4882fc": "AddressChangeConfirmed(address,address)", +"3e49077a": "createSaflokKey(bytes32,bytes32,bytes32,bytes32)", +"3e49776b": "VOLUME_5()", +"3e49820d": "changeTicketCap(uint256)", +"3e499dff": "addKYC(address)", +"3e49bed0": "setInt(bytes32,int256)", +"3e4a9263": "enforceSecondLock(address,address)", +"3e4b20cf": "updateGameSpecifics(uint256,uint256)", +"3e4b2570": "investorsAllocation()", +"3e4bdce4": "hasAccountPendingOrders(address)", +"3e4bee38": "GOLD()", +"3e4c0c82": "player_1(uint256)", +"3e4c9534": "getInvestmentMin()", +"3e4d914e": "lastBlock_f12Hash_uint256()", +"3e4e0432": "notifyOfArbitrationRequest(bytes32,address)", +"3e4f49e6": "state(uint256)", +"3e4ffa9b": "getImage(uint256,bytes32[],uint256,uint256)", +"3e5087cc": "testBasicThing()", +"3e50b0b8": "sendOwnerEther(address)", +"3e50de30": "calculateRewards()", +"3e510870": "transferOPSPool()", +"3e52d5c6": "openBoxes(uint256[])", +"3e530e5b": "find(uint256)", +"3e531e0d": "queryGameStatus(uint256)", +"3e53ccee": "actualPriceDivisor(uint256)", +"3e5442bd": "getBitsoAddress()", +"3e546675": "DelegateDualOwnable(address,address)", +"3e55eab0": "parcipateCrowdsaleInvestor(address)", +"3e5615bc": "FourToken()", +"3e568fe7": "GetDaysInOffice()", +"3e56f9f9": "getPayout(uint256)", +"3e57324e": "EmergencyPause()", +"3e586a81": "BeatTokenEthPriceChanged(uint256)", +"3e589050": "changeKeys(string,bytes1[])", +"3e58a465": "getShareList()", +"3e58c58c": "send(address)", +"3e592d50": "ResourcesOwner(uint8,address)", +"3e5933fe": "removeAll(address[])", +"3e5a2024": "MyActive()", +"3e5a907f": "addSrNOfBallotPapper(uint256,uint256,uint256,uint256,uint256)", +"3e5ac28f": "toggleTransfers()", +"3e5b15e1": "addCoin(bytes4,address)", +"3e5b5e39": "addPrecommitment(address,uint256,bool)", +"3e5b7fec": "TwoPhaseAuction()", +"3e5beab9": "allowance(address)", +"3e5cee05": "issueIOU(string,uint256,address)", +"3e5d5cee": "sellPriceAtIndex(uint256)", +"3e5d901e": "autoTokenSent()", +"3e5daf02": "startRoundC()", +"3e5edb1d": "REFUND_LOCK_DURATION()", +"3e5efd92": "clearProcessedBet(uint256)", +"3e5fbedd": "NOTNCoin()", +"3e5fd9b5": "dEthereumlotteryNet(address,address,bool,address)", +"3e604f48": "registerAadharDetails(string,string,string)", +"3e6075a4": "battleCountOf()", +"3e60c83a": "acceptMediation(uint256)", +"3e62d835": "setNumberOfOutcomes(uint256)", +"3e6357a9": "UserFund(address)", +"3e650c15": "withdrawalUser()", +"3e65a153": "longMul(uint256,uint256)", +"3e675cb0": "changeMaxValueBetForEmission(uint256)", +"3e6784b8": "ATLToken()", +"3e68119b": "setDebugNumber2(uint256,uint256)", +"3e681375": "totalDropAmount()", +"3e68680a": "create(address,address)", +"3e68aa3a": "getTopWinners(uint256)", +"3e68dea3": "BaseAccountService(address,address)", +"3e693ffd": "AppSet(address)", +"3e6968b6": "getCurrentDay()", +"3e6a569a": "claimReward(address,string)", +"3e6a6a31": "beneficiarySend()", +"3e6b16d9": "setShowInterval(uint256)", +"3e6c0637": "getFirstStartableIndex()", +"3e6d4e12": "getOptional(uint40)", +"3e6d6a6b": "setAdvisorAddress(address)", +"3e6d6d0b": "removeMastercardUser(address)", +"3e6d6d26": "withdrawAllTokens(uint256)", +"3e6d9770": "investments(address,uint256)", +"3e6e0adf": "whiteListPeriod()", +"3e6e2a73": "_mintEstate(address,string)", +"3e6eaa03": "mint(uint32,address)", +"3e6f118a": "blastOff(address)", +"3e6f4160": "roundParameters(uint256)", +"3e709982": "isDefValid(uint8,uint8,uint8,uint8,uint8)", +"3e715da2": "logPromiseFulfilled(uint256)", +"3e721015": "getFunds(uint256)", +"3e72b2bb": "addMembers(address[],uint256[])", +"3e72df41": "ff(string)", +"3e76018b": "getNextMinimumBet()", +"3e7614cd": "TIER3_PRICE()", +"3e764fdb": "_getNewFloorGene(uint256)", +"3e774409": "_mint(address,address,uint256,bytes,bytes)", +"3e77dcfb": "setPercentages(uint8,uint8,uint8,uint8,uint8,uint8)", +"3e786d80": "DickheadCash()", +"3e788ba3": "getRequestState(address,address)", +"3e78afd8": "ReferrerBonusTokensTaken(address,uint256)", +"3e78cf7a": "transactionFeeMin()", +"3e798e83": "calculateUserCommission(uint256)", +"3e799335": "RefundManager()", +"3e79e4c2": "customerPolicies(address,uint256)", +"3e7b5e80": "getUserRemainingAlloc(address)", +"3e7b684d": "NBAT(address,address,address,address,address)", +"3e7bb43c": "transferKycOwnerShip(address,address)", +"3e7cb0d3": "verify(uint256,bool)", +"3e7d081a": "emitBoardClosed(uint256,bool)", +"3e7d1acc": "currentAllocationLength()", +"3e7e250e": "GetDynamicCardAmount(uint32,uint256)", +"3e7e30ba": "poolPercentage()", +"3e7e42fa": "initialCreatorAccount(uint8)", +"3e7e70a4": "tokenBuyerWallet()", +"3e7e730d": "addressToReceiverToAmountAllowed(address,address)", +"3e7f26a5": "heroIdToBuyer(uint256)", +"3e7f54a9": "updateAppInstance()", +"3e803343": "subIsSafe(uint256,uint256)", +"3e80cbc6": "adminUpdateWallet(address)", +"3e81ba66": "preBountyAdded()", +"3e81d56e": "calculateProviderFee(uint256)", +"3e82055a": "addSignature(uint256,bytes16,bytes)", +"3e82eca7": "getAddressOne(address)", +"3e83f6cd": "Nickelcoin()", +"3e83fe36": "getMyShares()", +"3e84b266": "priorityPassContractAddress()", +"3e853128": "getGasForXau(address)", +"3e85713d": "marketingReserve()", +"3e85755a": "bonusInPreSalePhase2()", +"3e859fcb": "updateCap(uint256,uint256)", +"3e8616c8": "setBullAmount(uint256)", +"3e867089": "setDelegadoDeEscuela(bytes32,bytes32,uint256)", +"3e8686cc": "getSubmission(uint256)", +"3e86a2e5": "transferToAddress(address,uint256,bool,bytes)", +"3e870d63": "subHashrate(address,uint256)", +"3e8786a1": "reclaimFund(address)", +"3e87d301": "tokenPriceInEuroCents()", +"3e8817aa": "getPaymentAmount()", +"3e88d93b": "getRecorderID(address)", +"3e89340f": "lockStatus()", +"3e8a0585": "Bidding()", +"3e8a0bc9": "lockdown()", +"3e8a76e4": "CommerceBlockToken(address)", +"3e8a9439": "proposalDestination()", +"3e8b1dd7": "claim(bytes32,uint256,uint256,uint8,bytes32,bytes32)", +"3e8be2e1": "reTweetRewardPool()", +"3e8c34e5": "cardboardUnicornTokenAddress()", +"3e8cc273": "doBlockContract()", +"3e8ce607": "successfully_closed()", +"3e8cee07": "getPOOL_edit_5()", +"3e8cfa26": "Nut(uint256,string,uint8,string)", +"3e8d6e9f": "multyTx(address[100],uint256[100])", +"3e8d97e7": "underwriteToken()", +"3e8eca23": "plusFreezingTime(uint256)", +"3e8f5b90": "setConfig(string,uint256)", +"3e8f682f": "setETHFee(uint256)", +"3e8ff43f": "converterType()", +"3e904876": "devexit()", +"3e9196b4": "NokuTokenBurner(address)", +"3e91a622": "LOCToken()", +"3e92128c": "gettruelevel(address,uint256)", +"3e92fa26": "claimComputation(bytes,bytes,uint256)", +"3e9439cf": "removeLockedWalletEntity(address,address)", +"3e9491a2": "revenue()", +"3e94c904": "collectionOf(address)", +"3e955225": "getN()", +"3e95c9b6": "MOONTRAIL()", +"3e95f06d": "_handleProductionDecrease(address,uint256)", +"3e96c107": "People(uint256,string,uint8,string)", +"3e96d28e": "setReleaseAgent()", +"3e96e868": "addRole(string)", +"3e9744da": "walletBountyAndAdvisors()", +"3e9761b4": "projectIndex(uint256)", +"3e97db0d": "changeMainWallet(address)", +"3e97ee6c": "isOwnerOfAllPlayerCards(uint256[],address)", +"3e98039a": "multiOwnerSides()", +"3e9836c6": "oraclizeGas()", +"3e98b93a": "getAvatarCount(address)", +"3e99633f": "haltIEO()", +"3e997e71": "isPeronalLock(address)", +"3e99a35e": "BitMantas()", +"3e99c395": "isValidPublicKey(uint256,uint256)", +"3e99d2c9": "Foo(string,string)", +"3e99e26a": "SellableToken(address,address,address,uint256,uint256,uint256,uint256)", +"3e9b4c24": "CNToken()", +"3e9bee1b": "getBalanceDivis(address)", +"3e9c77f9": "ListingRegistry(uint8,uint8,uint8,uint8)", +"3e9e9f26": "distributeCallback(uint256,uint256,address[])", +"3e9eb6c1": "recursive_read(uint256)", +"3e9ed7e4": "burnSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"3e9f0d52": "userOddsRound(address)", +"3e9f9664": "withdrawItem(address,uint256)", +"3ea053eb": "deactivate(address)", +"3ea0fb3e": "getCurrentPrice(uint32)", +"3ea11222": "createGame(uint256,address)", +"3ea14a4f": "escFund()", +"3ea252eb": "finalOptions()", +"3ea2cde5": "addFiatCurrencyRaised(uint256)", +"3ea376fc": "changeAdmin(address,address,bytes32[3],bytes32[3],uint8[3])", +"3ea3c2bb": "_updateFundingGoal()", +"3ea3e42f": "AgriChainRootData()", +"3ea3f6c5": "activateRegistrar()", +"3ea51dc2": "ZIRC()", +"3ea556da": "getEtherForTokens(uint256,uint8)", +"3ea5cdba": "MIN_INVESTMENT_ICO_PHASE_ONE_POUNDS()", +"3ea69d76": "setEmployee(address,bytes32,bool)", +"3ea6c986": "ltcRaised()", +"3ea75e3d": "addJobContractMessage(address,address,address,string,uint256)", +"3ea79cb1": "MSCToken()", +"3ea89fd1": "popQueue()", +"3ea97009": "initialToken()", +"3eaa7643": "eligibilityRate()", +"3eaa8128": "buyCovfefe(uint256)", +"3eaab2dc": "FabotCoin()", +"3eaaf86b": "_totalSupply()", +"3eac48a0": "getTotalVoter(address,address)", +"3eac5cac": "PayingBackContract()", +"3ead67b5": "changeContractOwner(address)", +"3eadb6db": "nextPhase()", +"3eae396f": "GodzSwapGodzEtherCompliance()", +"3eae8ac8": "SkillChainPresale(uint256,uint256,uint256,address,uint256,address,address)", +"3eaf5d9f": "tick()", +"3eaf7591": "makeVote(uint256)", +"3eaf9923": "right68(uint256)", +"3eafec21": "sellTokens(address,address,uint256)", +"3eb10ab3": "FundAccount()", +"3eb1d777": "setStage(uint256)", +"3eb1eb1a": "issuingBody()", +"3eb2a37d": "priceCreatingChannelChanged(uint256,uint256)", +"3eb2b5ad": "addTeamMember(address)", +"3eb2cb02": "totalSquareStakesByUser(address,uint256,uint256)", +"3eb34e09": "AlterContactName(bytes32,address,bytes32)", +"3eb3aaad": "_getClosingObligation(bytes32)", +"3eb51dc4": "releaseForTeamAndAdvisor(address,uint256)", +"3eb54d80": "Pele()", +"3eb578bf": "ADVISER_STAKE2()", +"3eb5caca": "setProductType(uint8,string)", +"3eb610f5": "_requestContractApprove(bytes32,address)", +"3eb76b9c": "castVote(uint256)", +"3eb78420": "mainFundAccount()", +"3eb7dbc0": "FoxTradingToken()", +"3eb96aed": "DrunkCoin()", +"3eba223c": "CopyTokens()", +"3eba9ed2": "setBooleanValue(bytes32,bool)", +"3ebb047f": "allowanceTransfer()", +"3ebb2a17": "CreateTokenToMarket(address,uint256)", +"3ebb2d6b": "instructOracleToDistribute(uint256)", +"3ebbf394": "BergCoin()", +"3ebc2ab3": "isCompromised(address)", +"3ebc457a": "closeCurrentFeePeriod()", +"3ebd6092": "checkPermission(uint8,address)", +"3ebdc754": "setDiscipleSale(uint256,uint256)", +"3ebfc934": "transferFrom(address,address,string)", +"3ebfdaaf": "Swap()", +"3ebfde04": "proceedPreIcoTransactions(address[],uint256[])", +"3ec045a6": "auditor()", +"3ec16194": "calculateShares(uint256)", +"3ec1d668": "Vendor(bytes,uint256)", +"3ec27341": "getConfigAddress()", +"3ec27c4a": "setTimeRangeGen0(uint256)", +"3ec36b99": "commitVotes(uint256[],bytes32[],uint256[],uint256[])", +"3ec3aedc": "executeSell(address,uint256,uint256)", +"3ec414c8": "editMeta(string,uint256)", +"3ec48a2e": "move()", +"3ec548b6": "initLottery(uint16,uint256,uint8,bytes32)", +"3ec6a4c4": "getContributorsCount(address)", +"3ec6dac2": "getSize(bytes32)", +"3ec862a8": "hatchEggs(address)", +"3ec8d571": "TronToken(address,address)", +"3ec8ec5a": "getFinish()", +"3eca264e": "getWithdraw(address)", +"3eca443b": "generatedTokensSale()", +"3eca48db": "BonusesAllMinted(address)", +"3ecaabca": "ownerSetEarningsRate()", +"3ecae564": "canSend(address,address,bytes32,uint256,bytes)", +"3ecafef5": "isIcoStart()", +"3ecb9884": "frozensDetail(address)", +"3ecbbf39": "list(address,address)", +"3ecbf72a": "_find(address)", +"3eccca1e": "transferAllTokens(address,address)", +"3eccd456": "initializeSale(address[5],uint256[6],uint8,bytes32,bytes32,uint256,uint256)", +"3ece9c61": "teamHoldAmount()", +"3ecf965f": "rateETH_BCDT()", +"3ed01e02": "takerDispute(uint256,uint256,uint256)", +"3ed03798": "addToStat(uint256,uint256)", +"3ed0619b": "stabilityBoardProxy()", +"3ed08dc9": "balanceOfEthFee()", +"3ed0a373": "getDepositAtIndex(uint256)", +"3ed0f52c": "setCustomBonus(address,bool,bool,address)", +"3ed10b92": "allowances()", +"3ed23f91": "BlockPayeeToken(uint256,string,string)", +"3ed28f39": "getUniCoinSize()", +"3ed2d908": "buyerTokenName()", +"3ed35855": "removePayee(address)", +"3ed38181": "setInvalid()", +"3ed3d6a6": "getthird(uint256[])", +"3ed4006b": "OwnerCashout()", +"3ed4c4c8": "phaseAddtlInfo(uint256)", +"3ed58536": "record_human_readable_blockhash()", +"3ed5d456": "finishReplayPhase(uint256)", +"3ed620a4": "updatePrices(uint256,uint256,uint256)", +"3ed66d3d": "sellMintingAddress(uint256,uint256)", +"3ed70628": "SCPSToken(uint256,string,string)", +"3ed72caf": "icoTokenAddress()", +"3ed731bc": "makeCollectibleUnavailableToSale(address,uint256,uint256,uint256)", +"3ed7530d": "amountOfPerRelease()", +"3ed8ff25": "TotalFeesReceived()", +"3ed9bc86": "initializeToken()", +"3eda009b": "rewardRound(uint256)", +"3eda062c": "updateTap(uint256)", +"3eda7b88": "contractorTransferFrom_Scoupon(address,address,uint256)", +"3edab9d0": "AuctionCanceled()", +"3edaf264": "stopBounty()", +"3edbd76e": "GetChallengeCreator(uint256)", +"3edc65d3": "recordWithdraw(address)", +"3edc69b8": "maxAbsKindness()", +"3edcd61f": "times8()", +"3edd1128": "deposit(address,uint256,bool)", +"3edd90e7": "NewOwner(address)", +"3edddc0a": "incrementWrite()", +"3edef04b": "limitPreIcoTokens()", +"3edfd954": "mint(address,uint256,uint256,uint256,string)", +"3edfe35e": "ethPriceInCents()", +"3ee066e5": "sspRegistry()", +"3ee0c627": "currentBadge()", +"3ee2dd16": "FunGame()", +"3ee39cee": "testCannotActivateBeforeDeployingANT()", +"3ee3f499": "validateHash(bytes32)", +"3ee5313f": "SetState(uint256)", +"3ee58d13": "testBurnGuyAuth()", +"3ee5f2e4": "BreakToken()", +"3ee6d933": "rndInit_()", +"3ee6de34": "work(bytes32[])", +"3ee71e85": "NortontokenERC20(uint256,string,string)", +"3ee788e1": "_updateLoveStory(bytes16,bytes32,bytes32,uint256,string)", +"3ee7ab85": "airdropUpdateToken(address[],uint256[])", +"3ee822f4": "setAllLocations(uint256[])", +"3ee8747a": "isOrganisationExits(address)", +"3ee89a63": "withcom()", +"3ee90a29": "FOUNDER_STAKE()", +"3ee9d648": "lastGameId()", +"3eea5150": "milkTotalSupply()", +"3eeafccc": "getCountryStats(uint256)", +"3eeb3235": "geCompoundTimestampsFor24Months(uint256)", +"3eebc589": "isMarketManager()", +"3eed3822": "bigPrice()", +"3eed5d17": "Cipher()", +"3eeda7d3": "deliverTokens(address,uint256,string,bool)", +"3eedabcf": "getMelonAsset()", +"3eedf7d8": "getCurrentAuctionPrices(uint128[])", +"3eee36c6": "_split(uint256,uint256,uint256)", +"3eee83f1": "addAcceptedToken(address)", +"3eeeb1c3": "fastEscape()", +"3eefe239": "mintReservedTokens()", +"3eefef7b": "testFailTransferFromSelfNonArbitrarySize()", +"3ef06b6b": "previousprice()", +"3ef0784e": "configurationGenericCrowdsale(address,uint256,uint256)", +"3ef13367": "flushTokens(address)", +"3ef14cc8": "getTotalAuctions()", +"3ef37e30": "REFUND_PERCENT()", +"3ef39571": "isRequireData()", +"3ef4691f": "MyFreeCoin(uint256,string,uint8,string)", +"3ef4c16b": "withdrawVPC0xTokens(address)", +"3ef4f4ca": "world(uint256)", +"3ef530da": "_reduceReservesFresh(uint256)", +"3ef5aee9": "maxProportion()", +"3ef5d325": "getBaseValue(uint256)", +"3ef5e445": "subtract(uint256,uint256)", +"3ef5f368": "payMultiple(uint256)", +"3ef7c687": "getExpiringUnitList()", +"3ef84fcb": "withdrawCommonCoin(uint256)", +"3ef87414": "getRevisionCount(bytes20)", +"3ef8e872": "numberOfTokensOfOwner(address)", +"3ef8ec78": "announce_numbers(uint8,uint8,uint8,uint8,uint32,bytes32)", +"3ef92150": "ICO(uint256)", +"3efa31b0": "initialAddress(address)", +"3efa8d51": "feesD()", +"3efab21b": "icoTokensIssued()", +"3efb537e": "getPastGameResults(uint256)", +"3efb760d": "nextLevel()", +"3efcad6d": "EMPR()", +"3efcd2e0": "transferPreSigned(address,uint256,uint256,uint256,uint8,bytes)", +"3efd1403": "createGame(uint8,bytes32)", +"3efe54d4": "percentWeiDividend()", +"3efe6441": "getRemainingToken()", +"3efea4d1": "buy(uint256,uint256,uint256,uint256,string,string,string)", +"3eff1ef3": "DYBToken()", +"3f001dd7": "MIC(uint256,string,string)", +"3f003d59": "removeAddressFromGrantAccess(address)", +"3f00f5aa": "HAOToken()", +"3f01dc99": "ETHFINEX_FEE()", +"3f01e642": "roundCount(uint256,uint256)", +"3f0218ac": "startThirdPhase()", +"3f021e2e": "oracalize_gaslimit()", +"3f02e4f0": "getTotalValidTk()", +"3f03aab4": "communityAddr_()", +"3f045e61": "inArray(address[],address)", +"3f047053": "songTokenExchange()", +"3f04b06d": "shareLove(address,address,uint256)", +"3f050f02": "subdomainSale()", +"3f0547bb": "changeAllowAllTransfers(bool)", +"3f056d2a": "StrongHoldTEST()", +"3f06e17c": "changeDonation(address)", +"3f073031": "addCredits()", +"3f07618d": "createDragon(address,uint256,uint256,uint256,uint256,uint240)", +"3f08882f": "assertIsWhitelisted(address)", +"3f089de9": "GameRefunded(uint256)", +"3f09ba9c": "TupleDemo()", +"3f0a0797": "exchangeContract()", +"3f0a9f65": "requiredBlockConfirmations()", +"3f0adce9": "setSmallWalletAddress(address)", +"3f0b67e9": "_addIndex(address,address)", +"3f0b70b6": "itgTokenTransfer(uint256,bool)", +"3f0cea3f": "withdrawOwner(address)", +"3f0cf183": "MockSale(uint256,uint256,address,address)", +"3f0d9ad5": "contractBalance_()", +"3f0ec70b": "RequestFactory(address)", +"3f0ed0df": "setContract(string,address)", +"3f0f42e2": "addWalletToWhitelist(address)", +"3f0f7248": "SpaCoin()", +"3f109205": "setFoundationInterface(address)", +"3f10dea6": "canUse(address,uint256)", +"3f10f08a": "nextCommonTTMTokenId3()", +"3f117b85": "setPaymentContractAddress(address)", +"3f1199e6": "buried(address)", +"3f11e43d": "newEtherdelta(address)", +"3f124f1d": "totalMintContracts()", +"3f13d339": "getTxnNum(address,uint256)", +"3f14710d": "GameEnded(address,address,uint256,uint256,uint8)", +"3f14e2db": "withdrawfund()", +"3f152d11": "Coin(address)", +"3f15457f": "ens()", +"3f174064": "crowdsalePause()", +"3f181ef2": "getTotalUniqueCards()", +"3f18400e": "owlmasterReq()", +"3f1887e9": "Gamblers_Until_Jackpot()", +"3f18acb4": "CarRoute(string)", +"3f19bfbf": "allocateLedTokens()", +"3f19d043": "getContributions(address)", +"3f1a1cac": "useSingleItem(uint256,uint256,uint256)", +"3f1a3d9e": "dropEnabled()", +"3f1ae30f": "ReverseConfirmTransaction(uint256)", +"3f1b1267": "icoSince()", +"3f1bfdee": "testFailCreateShortIdAlreadyExists()", +"3f1da980": "lastBlock_v11Hash_uint256()", +"3f1e600a": "PHASE_3_PRICE()", +"3f1f59a4": "ICO_START2()", +"3f1f8f68": "seventh_withdrawal(uint256)", +"3f202951": "SampleCrowdsale(uint256,uint256,uint256,uint256,address)", +"3f20fa9e": "requestDispute(bytes16,address,address,uint256,uint256)", +"3f2266c2": "ownerAngelCollection(address,uint256)", +"3f22b0fb": "last50plushacker()", +"3f23503d": "minBtcValue()", +"3f23a566": "mintingCap()", +"3f242990": "tokenHardcap()", +"3f24ef7c": "setGidMax(uint8)", +"3f250493": "Crowdsaled()", +"3f257776": "getN2ControlLimits(bytes32)", +"3f265ddd": "FructusToken()", +"3f266242": "getSubjectCountByAddress(address)", +"3f26c5ee": "addMilestone(uint256,uint256,uint256,uint256,string,string)", +"3f26fa01": "InvestmentPolicyChanged(bool,bool,bool,address,address)", +"3f27e9e1": "recoverAddressFromBalanceProofUpdateMessage(bytes32,bytes32,uint256,bytes32,bytes,bytes)", +"3f27f105": "batchTransferSame(address[],uint256)", +"3f2885cb": "publish(string,string,address,bytes32)", +"3f288f05": "addPubKeyHash(bytes20,uint8,bytes,bytes)", +"3f28b20e": "Bemo()", +"3f28e9fb": "createBounty(uint256)", +"3f28f24c": "claim_rest_of_tokens_and_selfdestruct()", +"3f2965f0": "registerSeller(address)", +"3f29cd27": "set(bytes12,bytes32,uint40)", +"3f2b1040": "enableTokenWithdrawals()", +"3f2c0e35": "getNumberOfRequest()", +"3f2c736a": "tokenSetBurnFeeAbs(address,address,uint256)", +"3f2cb5d4": "popEducation()", +"3f2cba2b": "airdropMVP(address[],uint256)", +"3f2cdb53": "setETHPriceLowerBound(uint256)", +"3f2e0564": "setIcoWallet(address)", +"3f2e907c": "resumeTransferToken()", +"3f2e917c": "changeLimits(uint256)", +"3f2eed3b": "publicPresale()", +"3f2f1596": "setupTreasury(address,uint256)", +"3f2f46b4": "revealRock(string)", +"3f31281a": "changeUserKey(address)", +"3f3173f3": "MyTokenyy()", +"3f31b3ac": "extCustomerPolicies(bytes32,uint256)", +"3f3246a0": "getLastBuyer()", +"3f32aa70": "removeFromWhiteList(bytes32,address)", +"3f32af65": "calculateFare(string,string)", +"3f33252d": "changeDisown(uint256)", +"3f332792": "getGiftsCounter()", +"3f34dd5c": "setVestingAmoundAndApproveCrowdsale(address,address,address)", +"3f35d033": "transferToContract(address,uint256,bytes)", +"3f36d33d": "getpotReward()", +"3f37c9d4": "servicePercentage()", +"3f384026": "setStatusBuySell(bool,bool)", +"3f392b42": "trade(address[5],uint256[11],uint8[3],bytes32[6])", +"3f3935d1": "confirmReverse(string)", +"3f395781": "Capsule(uint256,address)", +"3f3a1ed2": "alottTokensExchange(address,uint256)", +"3f3a279d": "getBetResult()", +"3f3a4966": "getVotingPower(uint256,uint256,address)", +"3f3a78d5": "rateAngelDay()", +"3f3bdc6c": "upgradeAllowance(address,address)", +"3f3c212d": "kittenTalk()", +"3f3c51c3": "Setmyadress(address)", +"3f3c594c": "TestingToken()", +"3f3cde05": "whitelistFilteringSwitch()", +"3f3d83c3": "purchasable()", +"3f3e4c11": "setMaxTotalSupply(uint256)", +"3f3edfa4": "RootCoin()", +"3f3f43a8": "setPreDGZtoDgzRate(uint256)", +"3f402dfc": "CreateGameIco(address,uint256)", +"3f40adb8": "createPetition(string,string,uint256,bool,string)", +"3f415772": "releaseExists(bytes32)", +"3f419c40": "getMessageMaxCharacters()", +"3f423afe": "DIVISOR_STAKE()", +"3f4263ef": "x(uint256)", +"3f430616": "getThirdRoundReleaseTime()", +"3f43c7cf": "open(uint256,uint256,uint256,string)", +"3f444db1": "internalDoRoll(bytes32,bytes32,uint256,uint256,uint256)", +"3f44d89f": "NigerianNairaToken()", +"3f450915": "_mateWith(uint256,uint256,uint8)", +"3f454406": "tokenEscape(address)", +"3f4628c1": "disputeLimitedReporters()", +"3f46a2ea": "DucLongToken()", +"3f478372": "newDeposit(uint256)", +"3f479562": "kingGladiatorFounder()", +"3f47e662": "decimals(uint256)", +"3f487b8b": "securityGuardLastCheckin()", +"3f48ae1a": "initInsecure(address)", +"3f493a1d": "Playforfreetoken()", +"3f497d52": "batchAirDrop(address,address,address[],uint256)", +"3f4a6484": "removeCapper(address)", +"3f4acbe8": "_teamTax(uint256,bool)", +"3f4ad13d": "LOTE(uint256,string,string)", +"3f4b1401": "releaseDragonTokens()", +"3f4ba83a": "unpause()", +"3f4be889": "callContractAddress()", +"3f4c0733": "batchTransferEtherWithSameAmount(address[],uint256)", +"3f4c89ca": "show_minimum_amount()", +"3f4d2fc2": "addConnector(address,uint32,bool)", +"3f4d97f0": "TOTAL_TEAM_TOKENS()", +"3f4dd268": "releaseTokens(uint256,uint256)", +"3f4e5ab9": "getB1()", +"3f4e6d66": "CryptoFamous(address)", +"3f4e95d7": "investorsAccounts(address)", +"3f4eb701": "updateUnderlying(string,uint256)", +"3f4f057f": "candidateBlockNumberHash()", +"3f4f070c": "newSpaceshipUpgrade(bytes1,uint8,uint256)", +"3f4f3075": "setRenewable(uint256,bool)", +"3f4f50c8": "EvtUnlock(address,uint256)", +"3f50331d": "batchTransferPaidTokens(address[],uint256[])", +"3f516018": "setCreator(address)", +"3f5174df": "numberOfEarlyPurchases()", +"3f5228c7": "fifishICO()", +"3f52c660": "TokenPerETH()", +"3f52e589": "setStartingTime(uint256)", +"3f541d08": "burnTokens(address,address)", +"3f541ffc": "exchangeEtherForHavvens()", +"3f549d87": "contributeByOracle(address,uint256)", +"3f55b895": "delegate(uint8,bytes32,bytes32)", +"3f572432": "investment(uint256,address,string,uint256)", +"3f5750c6": "distributeCoins()", +"3f576af0": "GoodDayTokens()", +"3f579f42": "executeTransaction(address,uint256,bytes)", +"3f58774b": "ecbuy(uint256)", +"3f58a043": "ceoEtherBalance()", +"3f58f8c0": "voteRuling(uint256,uint256,uint256[])", +"3f590062": "getTokenCreationTime(string)", +"3f59b1ab": "TokenImpl(string,string,uint256)", +"3f59e45a": "bincentiveLogger()", +"3f5a0bdd": "selfDestruct(address)", +"3f5a9e22": "getAmountOfTitties()", +"3f5ab2fe": "seed_eth()", +"3f5adb8e": "LIRAX()", +"3f5b7675": "periodTwo()", +"3f5bc9b6": "makeACall(address,uint256)", +"3f5c6a50": "MinimumDonation()", +"3f5cbdb6": "returnWei()", +"3f5cd055": "advisorsVesting()", +"3f5d0203": "getCreationWeiCost()", +"3f5d2b79": "CrowdsaleFinished(uint256,uint256)", +"3f5d8056": "currRound()", +"3f5e268f": "convictInitial(uint256,uint256)", +"3f5e3ec1": "changeTransactionStorage(address)", +"3f5ea068": "addLockAccount(address,uint256)", +"3f5f5217": "sellAth(uint256)", +"3f601972": "TotalToken()", +"3f606cfc": "enableAutoSeller()", +"3f60efa2": "HANDLE()", +"3f615272": "sendICO(address,uint256,address)", +"3f61dcf6": "enableTransfering()", +"3f62c084": "collectMessage(address,address,uint256)", +"3f635e30": "ethTransfer(uint256,address,uint256)", +"3f64a7ab": "devFeePercent()", +"3f64b318": "initSale(address,address,address,address)", +"3f651bab": "TOURNAMENT_ENDS()", +"3f65d97f": "removeEndorsement(bytes32,bytes32)", +"3f67364a": "PayValsToList(address[],uint256[])", +"3f67a94e": "getOffChainAddresses()", +"3f683b6a": "isStopped()", +"3f6849eb": "listedMonForMon(uint64)", +"3f686170": "freezeAll(bool)", +"3f68fde4": "removeVote(uint256)", +"3f69034f": "enableGeneration()", +"3f697ce9": "startBlock(address)", +"3f69babd": "cancelEvent(uint256)", +"3f6a2c97": "calculatePoints()", +"3f6a6792": "Bribed(uint256,uint256)", +"3f6b33c4": "ping(address,uint256,uint256)", +"3f6b5fde": "generate(address,string)", +"3f6b6f2e": "Airdrop()", +"3f6c0696": "superMint(address,uint256,uint256)", +"3f6c0c60": "isTransferNotExpired(uint256,uint256)", +"3f6c3567": "listSales(uint256)", +"3f6c4a1b": "getTeamA(uint256)", +"3f6c4cfd": "withdrawBountyAndAdvisory()", +"3f6c71c5": "edgePigmentR()", +"3f6c95fe": "increaseLotteryBalance(uint256)", +"3f6d8256": "validatorFee()", +"3f6dd911": "multisig_owner()", +"3f6ddb75": "Allocated(address,uint256,bool)", +"3f6ea2a8": "MIN_LEADER_FRAC_TOP()", +"3f6ec73a": "itemVoteUp(address,uint256)", +"3f6f7ed6": "updateEthRate(uint256)", +"3f6fa655": "resolved()", +"3f6fff4e": "closeCycle(uint256)", +"3f70c2b4": "getProductById(uint256)", +"3f720922": "setConfig(uint256,uint256,uint256,uint256,uint256)", +"3f723c62": "addRecord(string,string,string)", +"3f73365f": "getOneFree(address)", +"3f738402": "goalIncrement()", +"3f74a3b7": "MINIMUM_VESTING_PERIOD()", +"3f74a8be": "totalEthJackpotCollected()", +"3f74fecb": "DSTrueFallbackTest()", +"3f751ad0": "addTxToCustomerRegistry(address,uint256,uint256)", +"3f7525bf": "getAddressesSet()", +"3f76fbd3": "dhopakcoin()", +"3f77b560": "newDocument(bytes)", +"3f77e1e9": "testFee()", +"3f79a0a9": "NewGame(bytes32,bytes32,bytes32,bytes32,address,uint256)", +"3f7a0270": "setN(uint256)", +"3f7aea39": "getCET4ById(uint32)", +"3f7b2ea9": "testMintInvalid()", +"3f7b54f9": "DevChangeMiningReward(uint256)", +"3f7b6be8": "createProductionUnit2()", +"3f7c42a7": "setJob(address,uint256,address,string,string,uint256[],uint256,uint256,uint8[],uint8,bool,address[])", +"3f7ca612": "FMWL()", +"3f7d3969": "fetchAllCandidates()", +"3f7d5361": "changeSafetyLimit(uint256)", +"3f7d72d8": "rSetE(address)", +"3f7da39a": "whitelisterAddress()", +"3f7e2120": "CloseGift()", +"3f7eabc9": "setRobot(address)", +"3f7eb0fe": "func_1()", +"3f7f2eda": "Order(address,uint256,address,uint256,uint256,uint256,address)", +"3f7f4f17": "getUserAccountBalance(address)", +"3f7f6d23": "BuyWithBonus(address,address,uint256,uint256,uint256)", +"3f7f8b24": "getAllocationProposal(uint256)", +"3f7f9faf": "attachTicker(address)", +"3f80135f": "test_threeInvalidEqAddress()", +"3f801f91": "proxyAssert(address,uint8,bytes)", +"3f802220": "ProposalAdded(uint256)", +"3f802ca0": "singleValueBatchTransfer(address[],uint256)", +"3f806783": "potSizeChanged(uint256)", +"3f807199": "changeParticipants(address[])", +"3f80a82b": "getbuyPrice()", +"3f80db69": "_totalTokenSold()", +"3f811b80": "createContract(bytes32)", +"3f8126d5": "GetStatus(uint256)", +"3f817449": "tokenSmartcontract()", +"3f81e4be": "lastBlock_a9Hash_uint256()", +"3f82065b": "setDiscipleVend(uint256,uint256)", +"3f82e2c6": "PUBLIC_RESOLVER_NODE()", +"3f836dcf": "addAsAddress(bytes32,address)", +"3f83acff": "get_contract(bytes32)", +"3f8416fb": "doUpgrade(address)", +"3f85be9c": "calcChanges(uint256,uint256,uint256)", +"3f85f916": "founderContract()", +"3f862a19": "remainUserTokenBalance(address)", +"3f87f870": "checkRequest(string,string,string)", +"3f883dfb": "transferExternalValue(bytes32[])", +"3f887fad": "buyShares(uint256,uint8,uint256,uint256)", +"3f89b09c": "update_fee(uint256,uint256)", +"3f8a04aa": "getCurrentUserPromoBonus()", +"3f8a4c13": "previousSnailPot()", +"3f8a92b3": "setmangeruser(address,bool)", +"3f8ae6d9": "GetUserExpire(address)", +"3f8af40c": "amendedEarlyPurchases(uint256)", +"3f8b0a1d": "getIssuedBy()", +"3f8c2582": "ethSale(address)", +"3f8c75a6": "_createLicense(uint256,uint256,address,uint256,address)", +"3f8cfba6": "lifeVestingStages()", +"3f8d9568": "buyins(address)", +"3f8d95bd": "_delete(address)", +"3f8df98d": "calculateMyReward(uint256)", +"3f8e0298": "parseTicket(uint256)", +"3f8f0714": "SimpleLife()", +"3f900962": "manualRaffle()", +"3f914aef": "setWhitelistAddress(address,bool)", +"3f923f9d": "NIZIGEN()", +"3f92edaf": "getMaxDropsPerTx()", +"3f935379": "_isSingleFlag(uint256)", +"3f94904a": "bankValReserve()", +"3f95c0c2": "timeboundTest(address,uint256,uint256)", +"3f9628e8": "addOldWithdrawals(address[],uint256[])", +"3f966082": "exchangesOwner()", +"3f96f3a3": "toInt()", +"3f97b106": "GetSuspend()", +"3f97d995": "VALIDITY()", +"3f982b74": "createInitialAllotment(string,uint256)", +"3f9942ff": "canceled()", +"3f9945d2": "ByThePeople(address)", +"3f99a12b": "saleEndBlock()", +"3f99fa54": "addInitialMember(address,uint256)", +"3f9a3886": "OWNERS_ALLOCATED_TOKENS()", +"3f9af464": "AK4Token()", +"3f9b250a": "getDocument(uint256)", +"3f9b8fdc": "updateAllowedTransfers(address,address,bool)", +"3f9c7822": "print(int256,uint256)", +"3f9cbd65": "mainSaleTokenWallet()", +"3f9ce517": "getRefAddress()", +"3f9d0954": "FarChainToken()", +"3f9d95ed": "addAcceptedToken(address,uint256,uint256)", +"3f9da856": "_addFreezer(address)", +"3f9e0eb7": "_getDaysInMonth(uint256,uint256)", +"3f9e23e5": "migrationFinished()", +"3f9e3494": "ReleaseSupply(address,uint256,uint256)", +"3f9e50fd": "LitToken()", +"3f9e9a37": "getBonusesAmount(uint256)", +"3f9e9df2": "removeInWhiteList(address)", +"3f9f5b68": "setPreviousID(uint256,int256)", +"3f9f7779": "BitCronus1()", +"3fa10e0a": "CountryJackpot()", +"3fa1436e": "updateTokenSaleState()", +"3fa1930d": "getPlayerBet(uint256)", +"3fa19804": "updateTeller(int8,bytes16,int8,int16,bool)", +"3fa21806": "lastHash()", +"3fa2dd2a": "getStage2Cap()", +"3fa2fe7a": "getActiveUserCount()", +"3fa40f94": "mintTokens(address[])", +"3fa4687b": "bytesToAddres(bytes)", +"3fa4ed06": "updateValue(bytes32,uint256)", +"3fa4f245": "value()", +"3fa54ed8": "setTileTypeAt(uint16,uint16,uint8,uint16)", +"3fa58b61": "Whitelistable()", +"3fa6010f": "setGallerySixPrice(uint256)", +"3fa615b0": "minCap()", +"3fa6497f": "AdminAddFunds()", +"3fa68836": "removeParticipant(uint8)", +"3fa69faa": "testtoken()", +"3fa6c7ca": "findLaptopUsage(address,address)", +"3fa8543a": "IMEXToken()", +"3fa8a7b8": "releaseTokenOwnership(address)", +"3fa911ae": "refundAllowed()", +"3fa9fcf8": "createPlayer()", +"3faaef28": "BurnFSATokens(uint256)", +"3faaffdb": "SCToken()", +"3fab8fb0": "EatToken()", +"3fabf8c0": "developmentAuditPromotionTokensPercent()", +"3fac68d5": "payOff()", +"3facd57c": "registerBill(uint256,address,address,uint256,uint256,uint256)", +"3facdfb6": "gatFund()", +"3fad1834": "getRequestCount()", +"3fad9ae0": "question()", +"3fadbd3e": "minTokenPurchase()", +"3fadc388": "current_plot_price()", +"3fae1928": "timenow()", +"3faed436": "setXTVTokenAirdropStatus(bool)", +"3faf511f": "vouch(bytes32)", +"3faff9d5": "purchaseTokens(uint256,address,bool)", +"3fb0b2c9": "CancelRoundAndRefundAll()", +"3fb18aec": "contains(string,string)", +"3fb1ab52": "_getUserSupportForTeamInTournament(uint256,uint256)", +"3fb1fed4": "startingExchangePrice()", +"3fb23166": "TeamVesting()", +"3fb23865": "fundingStatus()", +"3fb27b85": "seal()", +"3fb326ba": "MAX_ETHER_CONTR()", +"3fb39b8b": "rewardBeneficiary(address,uint256)", +"3fb3bec2": "deactivateTime()", +"3fb3ec28": "delegatedAmountsByDelegate(address)", +"3fb48c4c": "AAACoin()", +"3fb51a76": "frozenDaysforTestExchange()", +"3fb58819": "getMinGasPrice()", +"3fb5c1cb": "setNumber(uint256)", +"3fb64e75": "gameInProgress()", +"3fb655a3": "CPLTokenDeposit()", +"3fb8b692": "affiliateAddresses(uint256)", +"3fb92b10": "gameNbr()", +"3fb97857": "getCouponMulFactor()", +"3fbb539d": "scheduleCall(address,bytes,uint256,bytes)", +"3fbb8f98": "drawTertiaryDWinners(uint256)", +"3fbc2a1e": "preSaleTLYperETH()", +"3fbc6345": "Token_Remaining()", +"3fbd40fd": "ProcessDraw()", +"3fbda23f": "CharityToken()", +"3fbfdefc": "checkMyAging(address)", +"3fbffca6": "getTeamB(uint256)", +"3fbffcef": "bidsCount()", +"3fc0234d": "train1(uint256,uint256)", +"3fc15f15": "mainToken()", +"3fc22c51": "buyPreSaleTokens(address)", +"3fc3e53f": "Funding()", +"3fc44ab3": "setCustomEvent(uint256,uint256,bool,string,uint256)", +"3fc499b2": "ihomekey()", +"3fc4caa1": "levelThreeBonus(uint256)", +"3fc4e866": "RudiantoToken()", +"3fc50b92": "agingTime()", +"3fc523c7": "test_fourInvalidEqUint()", +"3fc5b69b": "set_sale_arbits_per_ether(uint256)", +"3fc5ed50": "_openGameResult(uint256,string)", +"3fc6a97a": "sellNow()", +"3fc6bc94": "payDAO()", +"3fc6d75a": "crowdsaleTokenPrice()", +"3fc7e3d5": "volumeType3()", +"3fc821ee": "getStackholderConfirmationCount(uint256)", +"3fc86d32": "newInvestor(uint16,address,uint256,uint256)", +"3fc8b029": "testSaleHasOwnerOnCreation()", +"3fc8ca58": "JetherToken()", +"3fc8cef3": "weth()", +"3fc90f7c": "addresses1(uint256)", +"3fc98bd5": "robotInfo(uint256)", +"3fcb21d3": "ecoFundingSupply()", +"3fcce626": "setDeprecated(address,string,string)", +"3fcd06fa": "checkMinimalGoal()", +"3fcdd2d3": "transfertoken(uint256,address)", +"3fce1b82": "addAnimal(uint8)", +"3fcead58": "TKRPToken()", +"3fd01a77": "is_purchase_allowed()", +"3fd0f727": "isIcoTrue()", +"3fd1f232": "LookAtAllTheseTastyFees()", +"3fd2300d": "curveIntegral(uint256)", +"3fd2799d": "newShortPosition(address[7],uint256[4],uint32[3])", +"3fd29369": "offer(string,string,string,uint256)", +"3fd3370a": "FooTime()", +"3fd3a371": "stageThreeEnd()", +"3fd3c997": "assetProxies(bytes4)", +"3fd68ca7": "lastCheckedToken()", +"3fd6b1db": "InoCoin(uint256,string,string)", +"3fd76a98": "MANAGEMENT_LOCKED_ALLOC()", +"3fd8b02f": "lockPeriod()", +"3fd8cc4e": "isPermitted(address)", +"3fd8cd9b": "ETHReturn(address,uint256)", +"3fd94686": "changeEligibleDonkeys(uint256)", +"3fd97621": "testTransferHandlesTooLargeRequest()", +"3fd9c56d": "checkDoubledProfit(uint256,uint256)", +"3fda1281": "get_keys()", +"3fda417a": "LADCoin(uint256,string,string)", +"3fda5389": "fill(uint256)", +"3fda926e": "addGame(address,string)", +"3fdb03ca": "getselfaddress()", +"3fdb3628": "aggregateCDPValues(bytes32)", +"3fdb372a": "buildWinery()", +"3fdb571f": "reGround(uint256)", +"3fdb705b": "platformTokenSupply()", +"3fdb8cbd": "dt()", +"3fdbb6c7": "RATE_THRESHOLD_PERCENTAGE()", +"3fdccd8d": "setDCNForGas(uint256)", +"3fdcef0d": "PRICE_BEFORE_SOFTCAP()", +"3fdcefe0": "doSelfdestruct()", +"3fddd97d": "XCoin(uint256,string,string)", +"3fdddf01": "EGGS_TO_HATCH_1PACIFIST()", +"3fdde728": "MTP_PER_ETH_SALE()", +"3fddee64": "isAgency(address)", +"3fded490": "referralDiscountPercentage(address)", +"3fdeef90": "fstSold()", +"3fe0522c": "setTravelCore(address)", +"3fe14e03": "setAuthor(string)", +"3fe3347a": "assetType()", +"3fe3df76": "leaf_from_address_and_num_tokens(address,uint256)", +"3fe3f427": "depositTokens(address,address,uint256,uint256,bytes32)", +"3fe43020": "decreaseRepAvailableForExtraBondPayouts(uint256)", +"3fe43822": "Collect(uint256)", +"3fe75b8d": "Unity()", +"3fe80d6e": "begin(uint256)", +"3fe97ead": "left49(uint256)", +"3fe9bf0e": "createContract(bytes,uint256)", +"3fe9f2a4": "EventCentsPerEtherChanged(uint256,uint256)", +"3fe9f2b2": "totalPublicFundingSupply()", +"3fea1c2b": "getIHand(uint32)", +"3fea2313": "ProposalAdded(address,address,uint256)", +"3feab517": "DreamCoin(uint256,string,uint8,string)", +"3feafa87": "NucleusVisionToken_ASTER8793()", +"3feb1bd8": "transfer(bytes32,address,uint256)", +"3feb4f83": "BankeraToken(uint256,uint64)", +"3feb5f2b": "investors(uint256)", +"3febb070": "backlogAmount()", +"3febe823": "ClapClapToken()", +"3fec0561": "addclip(address)", +"3fec156b": "timeLockTeam(address)", +"3fec1a75": "setIcoDiscount(uint256)", +"3fec4a4c": "queryjingzhi(uint256,string)", +"3fec91a4": "addProposal(uint256)", +"3fecde21": "setTilePrice(uint8,uint256,address)", +"3feced03": "minAmountWei()", +"3fed491f": "testStoreBalanceAfterCheckout()", +"3fedcc31": "transfer(uint256,address,address,address,uint256,bytes,bytes)", +"3fee28b1": "logEthTx(bytes32)", +"3fefc25d": "getFundByManager(address)", +"3fefdb01": "setStageGenomes(uint8,string,string,string,string,string)", +"3feff510": "showMainERC20()", +"3feff76d": "tokenaddress()", +"3ff00ba5": "airdropMinting(address[],uint256[])", +"3ff0a1e5": "FoundToken()", +"3ff0ab0b": "updateUserDetails(bytes32)", +"3ff11c8b": "right85(uint256)", +"3ff1a578": "IsCheckNeeded(uint256,uint256)", +"3ff1d68f": "_totalXT()", +"3ff1dcf6": "PermianICO()", +"3ff1e05b": "viewBalance()", +"3ff20c8a": "setPause(uint8)", +"3ff26c01": "catches(address)", +"3ff33185": "newCaller(address)", +"3ff42b92": "marketingAddr()", +"3ff4d491": "checkFile(bytes32)", +"3ff5481d": "cancelSellBlock(uint256,uint256)", +"3ff54c71": "issueTokens(address)", +"3ff66381": "ACCC()", +"3ff69113": "myEntityCount()", +"3ff7f21c": "mulFactor()", +"3ff8c954": "addAnimals(uint8)", +"3ff8da5f": "recipient3()", +"3ff98455": "set_participant(address,address,uint256,uint256,uint256,bool,uint8)", +"3ff9a877": "makeXID(uint256)", +"3ffa274a": "transfersAllowedTo(address)", +"3ffb8f27": "changeMinter(address,int256,address)", +"3ffbd47f": "register(string,string)", +"3ffc2832": "_buyIcsTokens(address,uint256)", +"3ffc813f": "toCompare(uint256,uint256)", +"3ffd2798": "distributeAdviserBounty(address,uint256,bool)", +"3ffdabda": "poi_token()", +"3ffe5eb7": "claimWork(uint256,uint256[2],bytes32)", +"3fffebbd": "setBonusUser(address)", +"400002c4": "modifyOpenStatus(bool)", +"4000164d": "getClaimData2(uint256)", +"4000601f": "sellStakes(address,address,uint256,uint256)", +"4000aea0": "transferAndCall(address,uint256,bytes)", +"4000d5c3": "BACTest1Token(uint256,string,uint8,string)", +"4001261e": "activeTier()", +"40015d99": "getProviderInfo(uint256)", +"4001cee6": "getPeerOwnership(address)", +"4001e364": "SendEthOff()", +"40026c87": "getSubcourt(uint96)", +"4002d3fd": "LargeFunction()", +"4002eda6": "nextRoundId()", +"4002f0b0": "CheckCourse(uint256)", +"40032d8d": "checking(string,uint8,bytes32,bytes32)", +"400351cb": "applyForCandidate(string,uint256,string,string,string,uint256,bool)", +"4004b6da": "getAmbassador(address)", +"40058f61": "TIER2()", +"40066733": "getTotalVotersCount()", +"40067c91": "VoteFactory()", +"4006ccc5": "exchangeRatio()", +"400718ea": "expressBuyNumSec(uint256,uint256[],uint256[])", +"40079df0": "getDividendIndex(uint256,int256)", +"40086158": "calculateHash()", +"40086aa0": "directDebit(address,address)", +"400a44b2": "EE(uint256,string,uint8,string)", +"400a4deb": "sendPresaleTokens()", +"400aaab7": "CTOC()", +"400aae08": "isInCurrentGeneration(address)", +"400adee3": "releaseByCount(address,uint256)", +"400b56e5": "setReg2(uint256)", +"400b8bf8": "releaseMintTokens()", +"400ba069": "calculateFee(uint256,address)", +"400bb308": "SimpleTGE(address,uint256,uint256,uint256,uint256)", +"400bbbd8": "rebalanceGetTokensToSellAndBuy()", +"400d1f45": "dtGetEthBalance(address)", +"400e3949": "numProposals()", +"400eb4f5": "ParaType()", +"400ee783": "TOKENS_LOCKED_1Y_TOTAL()", +"400f7a1e": "getPairInfo(address,address)", +"400ff9a4": "BuyGold()", +"4010a018": "fundAvailable(address)", +"40111f6d": "RESERVED_TOKENS_BACE_TEAM()", +"40117f50": "CanalToken()", +"4011baf9": "MARKETING_POOL_TOKENS()", +"401214a7": "updateParams(uint256,uint256,uint256,uint256,uint256)", +"40128db3": "registerAsDelegate(bytes32)", +"40129a40": "updateAddress(bytes32,address)", +"4012e02e": "Info()", +"401356f1": "Salt()", +"40135913": "releaseImpl(uint256)", +"4014c1c7": "changeMutagen2FaceContract(address)", +"4015e83b": "renExTokensContract()", +"401611ed": "acceptEndorsement(bytes32,bytes32)", +"4016535a": "parseBlock(bytes,uint256)", +"4016e969": "allowOwner()", +"4018e263": "stageTwoCap()", +"40193883": "goal()", +"40193d17": "getPongvalConstant()", +"40194596": "RealBloq()", +"4019fc54": "masterTokenBalanceHolder()", +"401b57b5": "transferLockedToken(uint256)", +"401bd3fe": "distributeEth(address[],uint256[])", +"401c3ba1": "LogClaimRefund(address,uint256)", +"401d7175": "_buyShip(uint256,address)", +"401dc09f": "setGeneSynthesisAddress(address,address)", +"401e3367": "transferFrom(address,address,uint256,bytes32)", +"401e77de": "GameCreated(bytes32,address,string,string,uint16,uint64)", +"401f2be5": "collectRemainingFunds()", +"40202f9d": "LogTransaction(address,uint256)", +"4021581a": "dollarBalance(address)", +"40217452": "ProdBToken()", +"40217786": "setRatePerOneEther(uint256)", +"4021d93c": "Alibabacoin()", +"40220b03": "previousVersion(bytes32,bytes32)", +"40222b64": "allocationsIndex(uint256)", +"40229e14": "B_Com()", +"4023da38": "Bacini(uint256,string,uint8,string)", +"40243ecd": "SimplePaymentChannel(address,uint256)", +"402456c0": "bank1Val()", +"4024a33e": "stageBonusPercentage(uint256)", +"4024db80": "license(bytes32)", +"4024eb2a": "approveAndCallN(address,uint256,uint256)", +"4025005a": "SmartIdentity()", +"4025b22d": "getShip(uint256)", +"4025b293": "redeemAllOutcomes(bytes32,uint256)", +"4025b5a8": "ownerUpdateContractBalance(uint256)", +"40267e53": "updateWhitelistBatch(address[],uint8)", +"4026b261": "PlatoToken()", +"4026c101": "deathFactor_iii()", +"4026eb92": "endround()", +"4027522c": "DanetonToken()", +"40275f73": "addMapping(string)", +"40275f85": "getPersonalDepositAddress(address)", +"40277604": "collectedFeesInTwei()", +"40278124": "setListedTime(uint256)", +"4027b475": "MasterCardEscrow()", +"4027d4d8": "spendFromSwap(bytes32,uint256,address)", +"4028354b": "PlaceADiceBet(uint8)", +"40285ad5": "setfees(uint256)", +"4028db79": "isFrozenAccount(address)", +"402914f5": "claimable(address)", +"402962bc": "deleteAddressesFromWhitelist(address[])", +"4029a3ce": "mintMany(address[],uint256[])", +"402a1533": "angelAmountRemaining()", +"402b2bca": "IcoStartDate()", +"402bf0ab": "_delHolder(address)", +"402c5644": "XNON()", +"402c569c": "unlockBonusTokensClaim()", +"402caccd": "RANGESTART_6()", +"402d1c9c": "CONFIG_MAX_EXPOSURE_MUL()", +"402d5f2e": "unlockTokenPriceChange()", +"402d8883": "repay()", +"402e46b9": "finito()", +"402e6230": "getTotalGambles()", +"402e912f": "issuedInsurance()", +"402eb694": "reliabilityPercentage()", +"40307cdd": "setCOMMUNITY_POOL_ADDR(address)", +"4030bc19": "sendRTB(address,uint256)", +"4030ddc0": "blockVContractAddr()", +"4031f60d": "INMCOIN()", +"40326686": "paymentsFinished(uint256)", +"4032b72b": "addKeeper(address)", +"4033236e": "getProofOfStakeReward(address,address)", +"4033c268": "isFullInvest(address,bytes5)", +"4033cd77": "applyForCertification(string,string,string,uint256,bool)", +"403446bd": "getPlayersFibokens()", +"4034af00": "setWhitelistInternal(address,bool)", +"4034b817": "loadVersion(address)", +"4034cfed": "fundWallet1()", +"403575f7": "setMaxMessagesTop(int32)", +"4035d16a": "createPromoCovfefe(address,string,string,uint16,uint256)", +"403639d5": "StartSale(address,uint256,uint256,address,address,uint256,uint256,uint256)", +"40365852": "roundStart()", +"4036778f": "reveal(uint256,bytes32)", +"4036ab78": "getType(uint256)", +"4036ff30": "changeHouseCutPercentage(uint256)", +"403911a6": "tokenSaleStart()", +"40394dcc": "freezeAccountByTime(address,uint256)", +"403988c6": "setCustodianName(address,bytes32)", +"403a0a78": "placeBet(uint256,uint256,uint256,uint256,bytes32,bytes32,uint256)", +"403a734a": "MMMbCoin(uint256)", +"403a8f53": "registerForRaffle2()", +"403abbc7": "updateFirstActiveGamble()", +"403b0cfd": "LogErr(uint256)", +"403b3757": "getValueTip(uint256)", +"403b7d9b": "secondRoundICOEnd()", +"403bb94e": "StatsEthereumRaised()", +"403c617e": "Hydrogen()", +"403c9fa8": "getPot()", +"403d8a6a": "initialMartialTimes()", +"403dca55": "totalIssuedSynths(bytes4)", +"403de107": "executeDecision(uint256)", +"403e73ea": "_DemSinhVienDat()", +"403f6cff": "putInWinnerPool(uint256)", +"403fbf54": "initiateEthUsdOracleUpdate(address)", +"40400fa7": "getBurnedItemCount()", +"404239f6": "validateLegalRate(uint256,uint256,bool)", +"40426fb0": "stopIssuing(uint256)", +"40429946": "oracleRequest(address,uint256,bytes32,address,bytes4,uint256,uint256,bytes)", +"4042b66f": "weiRaised()", +"40440891": "Donate_some_amount_and_save_your_stake_rewards(uint256)", +"40441eec": "balance2()", +"40445a4f": "numTiers()", +"4044856a": "preIcoEthers()", +"4044e8ec": "cancelOrderWithPayer(string,address)", +"4045c846": "setAccreditationActive(bytes32,bytes32,bool)", +"404635db": "_canBreedViaAuction(uint256,uint256)", +"404704b9": "sendBounty(address,uint256)", +"40477126": "exchangeTokens(uint256)", +"404823d1": "wagerPool()", +"40482475": "startTokenSwap()", +"4048c449": "getParent(bytes32)", +"40490a90": "getMultiplier()", +"40496aef": "SecuredWithRoles(string,address)", +"404983fb": "addsm(uint256,uint256)", +"40499ae8": "approvedTill()", +"404a9272": "promoEndTime()", +"404ae80c": "_randomCardSetIndex(uint256,uint256)", +"404cbffb": "entityList(uint256)", +"404cf932": "mintStart3()", +"404d0e3e": "gen0CreationLimit()", +"404ed1fa": "_founder_two()", +"404ef602": "disapproveToSell(uint256)", +"404efc53": "left26(uint256)", +"404f7d66": "challengeExit(uint256,uint256,uint256,bytes,bytes)", +"404f8dc8": "KRW_Omnidollar()", +"404fdfdf": "_setTempHeroPower()", +"4050a394": "getWishName(uint256)", +"40510399": "miningKing()", +"40512dcc": "TotalDividendsPerShare()", +"405136fa": "multiSendEth()", +"40517083": "dig(uint256)", +"4051ddac": "getSummary()", +"4051ed26": "BONUS_SLAB()", +"40520f85": "tokenToEtherRate()", +"40523946": "spectreTeam()", +"40528f98": "ownerUnlock(address,uint256)", +"4052c02a": "ProToken(uint256,string,uint8,string)", +"405353b5": "NPToken()", +"4053873c": "_safeTransferTkn(address,address,uint256)", +"4053c797": "save(bytes32)", +"40543538": "get_asset_events_count(bytes32)", +"4054834a": "refferedBy()", +"4054f5de": "EthVentures3()", +"40556191": "getCrowdsaleWhitelist()", +"40557cf1": "saleRate()", +"40557e87": "totalBondSupply_BEAR()", +"405665fb": "isMeInWhiteList()", +"4056675e": "transferTokenOwnership()", +"4056f8a8": "minimumTokens()", +"4056fe06": "MAX_GOAL_EBC()", +"405710a8": "sentTokensToCompany()", +"40582f13": "getWeiRaised()", +"405871e5": "SealPrivateCrowdsale()", +"4059240c": "intervalNow()", +"405a66da": "claimOtherTokens(address)", +"405abb41": "updateRate(uint256,uint256)", +"405b8816": "testIsContractZero()", +"405bd7bb": "getCurrentNumberOfVoters()", +"405c649c": "timeLeft(address)", +"405c6f6e": "addDelegate(string)", +"405cae3b": "LOG_SpinExecuted(bytes32,address,uint256,uint256,uint256)", +"405cb7f6": "KimJCoin()", +"405d1c32": "_getVATToPay(uint256,uint256,address)", +"405d3adf": "exchange(bytes4,uint256,bytes4,address)", +"405dd87c": "EAT()", +"405df338": "start_PREICO()", +"405f63e7": "MANHATTANPROXY9THCOLAVE()", +"405f8006": "BlocToken()", +"405fea2f": "setTokenAudit(address,address,address,address)", +"4060d9f5": "isCarSpecial(uint256)", +"40621412": "BetexICO(uint256,uint256,uint256,address,address,address)", +"4063d563": "advertise(address)", +"406499d2": "Redhorse()", +"40650c91": "MIN_CONTRIBUTION()", +"40652435": "BURENCY()", +"40654e14": "balanceOfEth(address)", +"40656963": "contribute(bool)", +"40664496": "getTransferFee(address,address,uint256)", +"4066fdea": "feeProvider()", +"4067ffda": "transactionsOnForHolder(address)", +"406838b3": "etoken2()", +"40684172": "getICORaisedAmount()", +"406843ee": "recommendProportion()", +"4068665d": "TokenVesting(address,uint256,uint256,uint256,bool,address)", +"40695363": "floor()", +"40695625": "testRetractLatestRevision()", +"40698729": "withdrawERC20s(address,uint256)", +"4069925a": "releaseVested(address)", +"4069de8b": "MultiSender(address,address)", +"406a0e61": "VOLUME_50()", +"406a1180": "FATRANSOM()", +"406a318e": "getCitationRecordsLength(bytes32)", +"406a6f60": "attachToken(address)", +"406af848": "ArenplayToken()", +"406b0593": "tokenHoldersByIndex()", +"406b9394": "level0(address,bytes32,uint256)", +"406c22d3": "getLocalNodeReputation(address)", +"406c52d5": "changeElectorate(address)", +"406c5590": "FILO()", +"406c6633": "moveToNextCeiling()", +"406c92b5": "PRIVATE_SALE_MAX_ETHER()", +"406d7e98": "isAllowingTransfers()", +"406d81c7": "safeSendFunds(address,uint256)", +"406f1d22": "crowdSaleApprove(address,uint256)", +"406f390c": "_unsafeCall(address,uint256)", +"407001c6": "TruSale(uint256,uint256,address,address)", +"4070372d": "earlyInvestorsMintedTokens()", +"40710587": "usersCanSell(bool)", +"407167b6": "cantEntidades()", +"40716fc7": "DunderBet()", +"4071f89b": "payCharity()", +"40722e3e": "getNameReaderId(bytes32)", +"407235ba": "LogStop()", +"407255b5": "getWhitelistByIndex(uint256,address)", +"407299ba": "getWarriors(uint32[])", +"4072eee2": "getTopic(address,uint256)", +"4073002e": "AssetCollectionNum()", +"40731c24": "getPost(uint256)", +"40732c89": "makeDeposit()", +"40734387": "termination()", +"407456d1": "fundsOf()", +"407489ff": "concat_nodes(address[])", +"4074c648": "createPromoCollectibleWithMining(uint256,address,uint256,uint256,uint256,uint256)", +"407532bb": "presaleFundingTargetInEther()", +"40753a76": "addSupply(uint256)", +"40754714": "blockClient(address)", +"407617e5": "updateAmountIncrease(uint256)", +"4076a248": "BetPower()", +"40773279": "pay_Bounty(address,uint256)", +"407787e6": "Division(uint256,uint256)", +"4077aa14": "coreStaffAmount()", +"4077aaf8": "totalBountyTokens()", +"4077ef5d": "getMiniPoolEdit_4()", +"40784ebd": "slashInvalidUsername(string,uint256,uint256)", +"40786dec": "mint(bytes32,uint256,bytes32)", +"4078fca8": "feeETH()", +"40799f4c": "currentDayRate10000()", +"407a5c92": "getAdminLogN()", +"407a6727": "totalVIP()", +"407b899b": "returnInt64(int64)", +"407c554a": "getTSTTokenAddress()", +"407ca6f8": "BsktToken(address[],uint256[],uint256,string,string)", +"407cba67": "buyKNOW()", +"407cfe5e": "get_all_players()", +"407d0cd0": "addGame(string,uint256,bytes32[])", +"407d1a0c": "unstoreHorsey(uint256)", +"407d2a67": "_figthCommander(address)", +"407d552a": "jackpotTokenWinRewardRate()", +"407e5e5d": "newVoting(bytes,string)", +"407e9588": "rejectMintRequest(uint256,string)", +"407e9e2c": "setcommissionCompany(uint256)", +"407ea214": "getPortion(uint256,address)", +"407ed2e2": "ComputeSell(uint256)", +"407f56e5": "HEAL()", +"407f8001": "secondsPerPeriod()", +"407fb687": "exchangeEtherForNomins()", +"407fc2e8": "eggsSold()", +"407fcc31": "tokenPriceUSD()", +"407fce7b": "left12(uint256)", +"4080277f": "guhb(address)", +"408056e4": "weiMinInvestment()", +"408057c4": "getStockCount(address)", +"40806f7c": "getAvailableFees()", +"40807049": "transferManyLands(uint256,uint256[],address)", +"40809acd": "stake(uint256,uint256,address,address)", +"40809f9d": "calcEma(uint256,uint256,uint32,uint256)", +"4080c884": "XstarToken()", +"40811e90": "transferDataAuthority(address)", +"4081c065": "massGrant(address[])", +"4081d916": "checkPlayerExists(address)", +"408275bb": "transferToVault(bytes32,address,address,uint256)", +"40828698": "s(address,address,uint256)", +"4082b499": "totalNumberOfPurchases()", +"4082defb": "isBasicAccount(address)", +"408318ae": "addAllowCnsContract(bytes32,address,bytes32)", +"4083c555": "Oasis(uint256,string,uint8,string)", +"4083cdbb": "changeTokensLimit(uint256)", +"4083e2af": "getFinalRoundPoints(uint160)", +"4083e935": "transferEthersInternal()", +"40844a8d": "safeDeduct(uint256,uint256)", +"40848af5": "markMyWord(bytes32,uint32)", +"4084c3ab": "finalizedBlock()", +"40857e02": "create(address,address,uint256,bytes32,int256)", +"4086b620": "sweepsCreationTime()", +"408760b8": "setAngelLastVsBattleTime(uint64)", +"40876f6e": "getMaxMakerAmount(address,address,bytes)", +"4087908f": "RicoToken()", +"40884c52": "getOracles()", +"40890bc2": "getCurrentProvider()", +"408938d0": "testUpdatePackageDb()", +"4089462d": "registerPackage(bytes32,string)", +"40896550": "bountyTotal()", +"4089b170": "totalPayouts()", +"4089d22a": "buyDepo(address)", +"408a2ac9": "addNewSupplier(address,address,uint256)", +"408a8094": "releaseTeamTokensAfter24Months()", +"408aee81": "removeVendorByAddress(address)", +"408b9945": "getBuyerNumber()", +"408bcbda": "getBalancesLength()", +"408bf4c3": "getAllCompanies()", +"408c1932": "distributeDisputeFunds(address,address,address,address,uint8,bool,address,uint256,uint256,uint8)", +"408cfe24": "iToken()", +"408d407d": "getClaimData(uint256,uint256,uint256)", +"408d5773": "createContractCovfefe(string,string,uint16)", +"408d947e": "SmartToken(string,string)", +"408d9e35": "ExecutorChanged(address)", +"408e097c": "createDestructibleCloneToken(address,uint256,string,uint8,string,bool)", +"408e2727": "votingActive()", +"408e2eb4": "ico2Tokens()", +"408ee7fe": "addAlerter(address)", +"408fef2e": "requiredMessageLength()", +"40901b08": "p_setLimitedReferralsMode(bool)", +"40908298": "allowedAddress(address)", +"4090cb64": "getWToken()", +"4090e696": "GetMinCost(uint256,uint256,uint256)", +"4091adf5": "onlyOwnerGetCompanyWallet()", +"4091ca4c": "gettopuser(address)", +"4091f4c6": "refreshMonarchyGames()", +"409242fc": "citation(uint256)", +"4092a611": "upVote(bytes12,bytes12)", +"4092acdd": "tokenFulfillmentDeposit(address[2],uint256[8],uint8,bytes32[2])", +"4092e2c2": "addMember(bytes32,address)", +"409315ce": "executePure()", +"4093b49c": "votes_for()", +"4094ac75": "ProofOfWeakHandsClassic()", +"4094ef5e": "addDataRequest(string)", +"40953102": "scheduleCall(address,uint256,bytes,uint256,uint256,uint8,uint256)", +"40954254": "addPublicSalesSpecialUser(address)", +"4095fbba": "SubmitTransaction(bytes32)", +"40966a97": "CMCEthereumTicker(address,uint256)", +"40976b60": "setNewAgent(address)", +"4097d865": "increaseRound()", +"40980953": "setWhitelistOff(bool)", +"409817b1": "FOTToken(address)", +"40992e9d": "getTotalAirDroppedAmount()", +"40998845": "_recordName(address)", +"409a3d8f": "ALLANCOIN()", +"409b479c": "GetTotalPlayers()", +"409bc43c": "changePersonalMaxcap(uint256)", +"409bd95b": "getProductionTimeBusiness(uint256)", +"409c7baf": "BONUS_MIN_DURATION()", +"409c962e": "view34()", +"409dba83": "calcKeysReceived(uint256)", +"409e81a4": "Create(uint256,uint256,uint256,uint256,bool)", +"409ed1db": "setCCH_edit_5(string)", +"409f2607": "ESCOToken()", +"409f33c1": "sumPublicSale()", +"409fb4c0": "configMaxKeys()", +"409fc358": "canGiveMoneyBack()", +"40a0dd4b": "updateStateBasedOnTime()", +"40a141ff": "removeValidator(address)", +"40a19a71": "BLOCKSUNTILCLEANUPSTACK()", +"40a1b96e": "getTickets(uint8)", +"40a1f4d5": "invalidateStage(uint256)", +"40a1f87d": "getTotalLockedTokensPerUser(address)", +"40a203c4": "CoinVillaIssued()", +"40a2bfc1": "setXPAAssets(address)", +"40a3a9c7": "createTokenLocker(address,address)", +"40a3d246": "toggle()", +"40a401d0": "setMonsterIndexToOwner(uint256,address)", +"40a4437e": "setBattleProviderAddress(address)", +"40a45440": "getPlayerBetNumbers(address)", +"40a49a96": "searchSmallestInvestor()", +"40a4c3cc": "loanCreator()", +"40a4c580": "validateTransfer(address,address,uint256,bytes,bytes)", +"40a50a5e": "setNormalBuyLimit(uint256)", +"40a51199": "PubPresale(address,address,address)", +"40a53017": "FeedEgg()", +"40a53ab9": "replaceAuditorRegistry(address)", +"40a5737f": "setIndex(uint256)", +"40a57cb8": "makeAdmin(address,bool)", +"40a5bfc5": "PentacoreToken()", +"40a72363": "sigTeamAndAdvisersAddress()", +"40a7ed8b": "uintFunc(uint256,uint256,uint256)", +"40a806ed": "_borrowTokenFinal(address,bytes32,uint256,uint256,address,address,bool)", +"40a8a96c": "KingdomCreatedEvent(uint256)", +"40a915a5": "setTokensLocked(bool)", +"40a92f0f": "setMinSign(uint40)", +"40aab81b": "UpdatedBlock(uint256,uint256,bytes32,bytes32,bytes32,bytes32,address)", +"40aad0fe": "getUserPair(address)", +"40ab2634": "lastBlock_f8()", +"40ab4879": "pePrice()", +"40ab7b8c": "bnt()", +"40ac40b2": "setInvitationMultiple(uint256)", +"40ac89a2": "returnInvestment()", +"40acbee3": "TokenFactoryAirdropToken()", +"40acf805": "setCompanyInfo(bytes32,string)", +"40ad654c": "transferForVote(address,uint256)", +"40adf94e": "setOraclizeGasPrice(uint256,uint256)", +"40ae0851": "withdrawEtc(address,uint256)", +"40aec640": "bonusState()", +"40aee1a9": "numHashTypes()", +"40af1a45": "PrivateSaleDays()", +"40b00033": "deposit(string,uint256,bytes,uint8,bytes32,bytes32)", +"40b0a77f": "updateInstantTrade(address)", +"40b0c3d1": "DiligenceToken()", +"40b12b40": "testIsTrue()", +"40b14606": "getOverPLayer()", +"40b1ad52": "slashReservedUsername(string,bytes32[],uint256)", +"40b31937": "pledgeDecline(uint256)", +"40b359f5": "markTaskCompleted(address,bytes32)", +"40b43701": "getSetting(uint256)", +"40b5336d": "_updateDepositCountry(uint256,uint256,uint256)", +"40b5886b": "getHotWalletAddress()", +"40b5ce01": "fightStartTime()", +"40b60b85": "forceBuyback(address)", +"40b61fe9": "removeOperator(address,address)", +"40b6290f": "acceptSale()", +"40b6c71f": "EthLyteToken()", +"40b73897": "getFeeWindow(uint256)", +"40b74c91": "dislikeArtist(address)", +"40b7802d": "GiveUpTheDough(address)", +"40b7b240": "calculateAmount(address)", +"40b80684": "TOKEN_AMOUNT_ICO_STAGE1_PRE_SALE4()", +"40b8783d": "raiseSlammer(bytes32,bytes32,bytes32)", +"40b8d53a": "startFeeExit(address,uint256)", +"40b98253": "canContribute()", +"40ba0e94": "getRegion(uint256)", +"40bb28e8": "watchVideoB(address)", +"40bb8474": "RENEETOKEN()", +"40bbf5b9": "ChunksToken()", +"40bc9308": "startTimeRound1()", +"40bcff15": "bet1000_01eth()", +"40bd8720": "_changeOslikiFoundation(address)", +"40bdd3e9": "bytesEqual(bytes,bytes)", +"40bea8d2": "lockedEndTimeOf(address)", +"40beafc9": "depositToTWI(uint256)", +"40beee2b": "setPermanentPlatinumLevel(address,string)", +"40bf6424": "removalPrice()", +"40bff23d": "_createCard(uint256,address)", +"40c00acf": "invest_mined()", +"40c05401": "getWithdrawableAmountFIIT(address)", +"40c0bcb9": "checkBetNumber(uint8,address,bytes32,bytes32)", +"40c0c5ff": "PityToken()", +"40c0ece3": "updateMyReturns(uint256)", +"40c10f19": "mint(address,uint256)", +"40c243c9": "totalEthRefunded()", +"40c2dc4a": "getCCH_edit_6()", +"40c3198e": "getBenzByOwner(address)", +"40c3418c": "sendCrowdsaleBalance(address,uint256)", +"40c36524": "getFreeHatchCnt()", +"40c37ed2": "sellGameLockedToken(uint256)", +"40c3a6db": "MaxNumberOfBetsChanged(uint256)", +"40c3b187": "left37(uint256)", +"40c3b18e": "approveTransferableToggle()", +"40c44c5b": "DivisibleFirstCommonsForumToken()", +"40c44f6a": "setNewCFO(address)", +"40c48c8d": "setNewPriceInFinney(uint256)", +"40c48dfa": "Entropy()", +"40c558b2": "releaseCatIndexUpperBound(uint256)", +"40c58b2b": "get_foreign_balance(address)", +"40c5b34e": "currentPhaseId()", +"40c65003": "bonusEnds()", +"40c657c7": "buyTokens(address,uint256,uint256,uint256,uint256)", +"40c73d17": "changeAnimator(address)", +"40c7535b": "TangToken()", +"40c7e279": "requiredPlayers()", +"40c7e707": "contributeBTC(address,uint256)", +"40c85a59": "getLestCommonMulArray(uint256)", +"40c87214": "_startNewMiningEpoch()", +"40c8a90a": "GetLastMsg()", +"40c91c05": "submod(uint256,uint256,uint256)", +"40c92ae6": "multisigwallet(address[],uint256)", +"40c97617": "getReferralAddressShare()", +"40c9adcf": "_cancelOffer(uint256)", +"40c9e804": "SanityRates(address)", +"40ca0f05": "W0keAFPresale(uint256,uint256,uint256,address)", +"40ca925d": "ChannelManagerContract(address,address)", +"40caae06": "setOwner()", +"40cc1239": "TokenEmission(string,string,uint8,uint256)", +"40cc35ce": "teamWithdrawalProposed()", +"40cc8854": "bite(bytes32)", +"40cd988d": "refundBroadcaster(uint256)", +"40cde403": "exchangeBalanceOf(address)", +"40ce1d43": "EWWCOIN()", +"40ce5062": "isPublicSaleNoBonus()", +"40ceb451": "increasePromoCreatedCount()", +"40d0a103": "MarketOrderEvent(uint256,uint128,uint8,uint16,uint256,uint256)", +"40d113da": "sqrtAsm(uint256)", +"40d1d255": "claimEndTime()", +"40d1df53": "etStringValue(bytes32)", +"40d21e6a": "getRelations(uint256)", +"40d22cf8": "completedTasks(uint256)", +"40d2e73c": "VanHardwareResourcesChain()", +"40d32df9": "MetaIdentityManager(uint256,uint256,uint256,address)", +"40d3d25a": "playersStorage(address)", +"40d40a72": "MANAGE_CAP()", +"40d48958": "_endTime()", +"40d67116": "setTokensPerOneETH(uint256)", +"40d681cb": "setupPresaleClaim()", +"40d699b7": "deathData_a4()", +"40d75432": "provideExchangeRate(uint256,uint256,uint256)", +"40d7b7b8": "dollarPrice()", +"40d7f7e8": "Staked(address,bytes32,uint256,uint256,uint256,uint256)", +"40d815cf": "Cyberium()", +"40d84b52": "updateCase(address,uint256)", +"40d8c74f": "checkForPayout()", +"40d96e6c": "finalizeSale3()", +"40da948f": "updateUnit(uint256)", +"40db4b09": "tokensOwedByInterval(uint256,uint256,uint256)", +"40dca307": "buyCoinsUpdateState(uint256)", +"40dda9af": "USER_LOCK_BLOCKS()", +"40de2784": "buildICOStageTwo()", +"40debefd": "SomeCoin(string,string,uint8)", +"40dee0c5": "LogRedeem(address,uint256,bytes32)", +"40df280e": "alliesContract()", +"40df78b6": "bankBurnFrom(address,uint256)", +"40e0653c": "_getLevel(uint256)", +"40e099ac": "makePromise(uint256)", +"40e15134": "presaleDist()", +"40e1e62b": "RedSoxYankees412()", +"40e2ad58": "buyOwnedPixels(bytes32)", +"40e31490": "killAnimal(uint16)", +"40e40765": "setTokenSaleHardCap(uint256)", +"40e424ee": "chooseWinner(bytes32)", +"40e4ebf4": "GenDayRatio(uint256)", +"40e50d00": "gcsc(uint256)", +"40e58ee5": "cancel(uint256)", +"40e5f3cb": "getEtherBalanceOnCrowdsale()", +"40e63ef3": "getPubKeyByHash(string)", +"40e687a9": "blockno()", +"40e6b00a": "createRefundPoll()", +"40e7261d": "Golem()", +"40e87f13": "dropTokenV2(address[])", +"40ebe5bc": "SHARD()", +"40ec0b6a": "isCurioAuction()", +"40ecb7f2": "isTransferValid(address,address,uint256)", +"40ed79f4": "hashimoto(bytes32,bytes8,uint256[],uint256[],uint256)", +"40eddc4e": "getCollectedEther()", +"40ee2485": "CryptoCovfefes()", +"40eedabb": "leader()", +"40ef4704": "getState(bytes10)", +"40ef78a7": "getExploreData(uint256)", +"40f03605": "existingContribution(address,address)", +"40f04616": "_buyDiscountTTW(uint256,uint256,address,address)", +"40f0a21f": "ceil(uint256)", +"40f10af2": "revokeAttribute(address,address,string,bytes)", +"40f12a02": "getPureWeaponDamageFromTokenId(uint256)", +"40f13c0f": "mintingFoundersFinish()", +"40f13db5": "addWhitelisted(address,address)", +"40f19da7": "isFinish(bytes32,bytes32)", +"40f29da3": "testReturnsProductInformation()", +"40f2a50b": "findDsp(address)", +"40f313b9": "ImportRemappingTestA()", +"40f354f3": "insertTopic(bytes15,address,string,string)", +"40f3633e": "icoMin()", +"40f3b6f1": "yourShares(address)", +"40f3c364": "ProjectTag()", +"40f47d41": "registerNameByCOO(string,address)", +"40f523f9": "TourMEToken()", +"40f54c08": "TrumpCoins()", +"40f56cfb": "PYPToken()", +"40f5c954": "sumICOStage8USD()", +"40f5ed88": "XPS()", +"40f702b4": "userInfo(string,uint256)", +"40f81cb5": "providerAllowance(address,bool)", +"40f828a2": "setLiquid(bool)", +"40f9b34c": "BetrTokenPurchase(address,address,uint256,uint256)", +"40f9c62c": "setLargeWalletAddress(address)", +"40f9cdf9": "get_tokens_count(uint256)", +"40fa368c": "getOrderHash(bytes32,uint256[2],address,bool,uint96)", +"40fa61f7": "upgradeFee()", +"40fc5e7a": "upgradeableTarget()", +"40fdef80": "administration(uint256,string,uint256,uint256,address)", +"40fdf515": "issuetender(address,uint256,uint256)", +"40fe90d0": "setFreezeOut(address[],bool)", +"40ff26ba": "adminAdd(address,string)", +"40ff38b2": "rootDomain()", +"40fff80c": "setCommissionAddress(address)", +"41002439": "amIReady(address,address)", +"410085df": "refund(address,uint256)", +"410090db": "ChangeEmissionGrowthCoefficient(uint8)", +"410158cd": "Winsshar(address)", +"4102bf5c": "getAvailableAmount(address[8],uint256[6],uint256,uint8,bytes32,bytes32)", +"4102f4e8": "mToken(address,uint256)", +"41031b1d": "NutzEnabled(address,address)", +"4103257e": "ReceivedETH(address,uint256)", +"410366c1": "settleDispute(bytes32,uint256,uint256)", +"4103c4c4": "OwnedHelper()", +"410453ae": "serverEndGame(uint32,int256,bytes32,bytes32,uint256,address,address,bytes)", +"4104df21": "cardsMinted()", +"4105048d": "Revealed(uint256,uint8)", +"410520f7": "PrivateReserveCoin()", +"4105e02f": "remark1()", +"41061c04": "addVestingMember(address,address,uint256,uint256,uint256)", +"410646e0": "getUnclaimedAmount(address,uint16)", +"41068ae2": "LicenseCore()", +"41080cfa": "getLLV_edit_7()", +"41095b60": "voteForUltimateOutcome(bytes,uint16)", +"410968d8": "MajLastNotVal()", +"41097886": "LogAirDrop(address,uint256)", +"4109a71a": "CerttifyCrowdsale(address,address,address)", +"410a1d32": "getDonation(address)", +"410a1db1": "setCommunityPool(address)", +"410a6734": "setAllBlockHashes()", +"410a68b5": "setOraclizeCallbackGasPrice(uint256)", +"410ace1f": "EOSBetSlots()", +"410af6b6": "allowAddressDelegate(address,address)", +"410b1da8": "currentTotalSupply()", +"410bf4bf": "CloudMoolah()", +"410c2601": "testGetAccountBalance()", +"410c47a0": "bb(uint256)", +"410c8005": "SetReciver(address)", +"410c83a3": "get_amount_get_buy(uint256)", +"410cbcc6": "YaoToken(uint256)", +"410da27d": "surveyEndAt()", +"410dbad6": "setaddress(address,address,address,address)", +"410dcc42": "setSeedHash(uint256,bytes32)", +"410e05b3": "bdevIssue(address,uint256)", +"410e7b42": "TestCoin()", +"410e8340": "checkAndConfirm(address,bytes32)", +"41104ef9": "GlobalOperatorChanged(address,address)", +"41107bee": "parseSums(bytes)", +"4110a489": "validatorsState(address)", +"4110b2c9": "addCapital()", +"411273d8": "getTokenToEthAddOrderHint(uint128,uint128)", +"4112987c": "strConcat(string,string,string)", +"4112b7f1": "tryGetNameOwner(bytes)", +"4112ea75": "SongTokenExchangeContractSet(address,address,bool)", +"41130267": "fxxkicotestToken()", +"4113d05b": "createGen0TokenWithDna(uint256)", +"4115f883": "requestAuditWithPriceHint(string,uint256,uint256)", +"411615fd": "investorWithdrew(address,address)", +"41161aac": "X(uint256,string,string)", +"41163f7c": "deedCount()", +"4116dfc3": "getMetaDataCount(address,bytes32)", +"411735ee": "getAddressGains(address)", +"41179685": "finalizeContruibute()", +"4118cbc9": "setTokenExchangeRate(address,uint256)", +"41192788": "refund(address,address[],uint256[])", +"41193c18": "blockPlaylist(string)", +"411a1714": "setOperational(address[],bool)", +"411a1ac1": "BitcoinEye()", +"411a3dcf": "forward(address,uint256,uint256)", +"411a42ea": "ConeTest()", +"411a492e": "getNumOfLotteryTickets()", +"411ae567": "setSlogan(uint256,bytes)", +"411b007e": "founders()", +"411b65ef": "setPropertyLastUpdate(uint16,uint256)", +"411c4e72": "ModifyFeeFraction(uint256)", +"411cc791": "transferWithParams(address,uint256,uint256,uint256,uint256)", +"411d3021": "MahalaCoin()", +"411d6e19": "USDETH()", +"411dddb2": "TrueVeganCoinPresale()", +"411e6832": "tokenObj()", +"411f93d1": "transferTicket(address,address)", +"411fcce5": "BitcoinSoft()", +"41203243": "dateOfBonusRelease()", +"4120a236": "FreeNapkins()", +"4120a800": "PrepareRollEvent(address,uint256)", +"4120bcec": "forceRecoverCollateralOnBehalfOf(address,bytes32,address)", +"41215aff": "NewUpgradeMaster(address)", +"4121b9f8": "SBECoin()", +"41224405": "get_planet_price()", +"41225b0e": "broadcastSchellingRound(uint256,uint256)", +"412282cd": "addOwnerAccount(address)", +"41228803": "updateBalance(address,uint256,bool)", +"4123057e": "update_oraclize()", +"41237fd5": "levBlocks(address)", +"4123a0ac": "deleteToken()", +"4123a482": "transferTx(address,uint256)", +"4123cb6b": "m_numOwners()", +"41240314": "teamTwoSharePrice()", +"4124a6a7": "getLockedFunds()", +"41252b55": "FreezeTransfers(address,bool)", +"41264107": "TEChain()", +"412648bf": "setAvatarIndex(uint256)", +"412661c4": "_setAuth(address,address)", +"412664ae": "sendToken(address,uint256)", +"41266ae8": "Composed(uint256,address,uint32[5],uint32[5],string,string,uint8[20])", +"4126d29e": "justFailRequire()", +"412740c5": "balanceWithInterest(address)", +"41275358": "feeAddress()", +"4127d54a": "tokensForPresale1()", +"41282fe0": "usersCanUnfreeze()", +"41288e76": "sendEtherToMultisig()", +"412956ce": "goBackToPrivateSale()", +"412988e7": "subSupply(uint256)", +"4129912c": "misub(uint64,uint64)", +"4129a9d5": "newIcoRound(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"4129b2c9": "getWinner(uint256)", +"4129b8ed": "remainingTokenHolder()", +"4129d7d1": "MessageSent(address,address,uint256,string,string,uint256)", +"412a5a6d": "createContract()", +"412a7be0": "athlete()", +"412b2ee0": "forkMe()", +"412c0b58": "initiate(bytes32,address,bytes32,uint256)", +"412c0c2d": "getWin(uint256)", +"412c7dfb": "FOUNDER_WALET()", +"412cbc06": "assetsCount(address)", +"412e829f": "LoveTracker()", +"412ec94f": "updateTokenPoolAddress(address)", +"412edecd": "setDAOAndMultiSig(address,address)", +"412eee05": "enactProp(uint256)", +"412f83b6": "getDelegatorUnbondingLock(address,uint256)", +"41300d03": "secondBonusRate()", +"41304fac": "log(string)", +"413100e0": "getLeftoverWei(address)", +"4131775e": "_removeUserCity(address,uint256)", +"4131f609": "verifyWining(uint256,uint256,uint256,bytes,bytes,bool,bytes32,bytes32)", +"41326679": "inVaults()", +"4132bae8": "calculateRAUS()", +"4133e7a1": "GxCancelOrders(address)", +"41348053": "ratePlanOfVendor(uint256,uint256)", +"413499f1": "deleteVoters()", +"4134a92a": "registerResource(bytes32,uint256,bytes32,string)", +"41354590": "setAtomIsBuy(uint256,uint128)", +"413699de": "setOwnerName(address,string)", +"4136aa35": "isAlive()", +"41388aed": "TokenHash(string,string,uint8,uint256)", +"41388c71": "DolyToken()", +"41395efa": "dgxBalance()", +"41398b15": "ethAddress()", +"413992b3": "createWarranty(string,string,address,uint256,uint256,uint256)", +"413a7f9a": "MethNSupply()", +"413ab4a8": "_reserve()", +"413abc3d": "min_share_price()", +"413bac7a": "jackpotinfo()", +"413bba97": "withdraw(uint256,bytes,address[])", +"413bc8eb": "TableDeRapprochement_322()", +"413c6d13": "setAddressValue(string,address)", +"413d18cb": "currentMessage(uint256)", +"413d7b08": "mainSaleTLYperETH()", +"413d9c3a": "LOCK_TIME()", +"413dc451": "countPerfClients(address)", +"413e31a8": "Testita()", +"413e4aaf": "calculateOwnerFee(uint256)", +"413e90e7": "putHashes(uint256)", +"413e920d": "oneMillion()", +"413ed292": "logState(string,uint8)", +"413f50da": "addAddressToWhitelist(uint256,address)", +"413f7d4c": "SECONDS_BETWEEN_ROUNDS()", +"414053be": "best_adjustment_for(bool,uint128)", +"41409437": "publishMetaData(bytes32,bytes1)", +"4141a121": "ETHERlemon()", +"4142f460": "segundos()", +"4143125f": "dusttorafflepot()", +"41431908": "setManagerAddress(address)", +"41434351": "oneday()", +"41445fd2": "c4c()", +"41446e0a": "bankersAcceptanceOfDeal()", +"4145aa9d": "grantMythexTokens(address,uint256)", +"41461bad": "gracePeriodStartBlock()", +"414689ff": "unlockAmount()", +"4146e099": "getCurRoundInfo()", +"4147060a": "LogRequirementChange(uint256)", +"41470877": "returnVesting()", +"4147e15e": "verifyOptionPoolMembers(address)", +"4147ffe5": "bitfwdToken()", +"41481372": "Fight(uint256,uint256,bool,bool)", +"41488cc9": "depositData(bytes32,address,uint256,address,uint256)", +"4149953d": "transferRestore(address,address,uint256)", +"414b49a2": "setFreeLOT(address)", +"414b7ad6": "updateAff(uint256,uint256,uint256,uint256)", +"414b85e4": "isPreIco(uint256)", +"414bbda2": "declineCoins(address,uint256)", +"414c2aab": "MemberHandler(string,address)", +"414c377b": "updateSaleLimit(uint256)", +"414c4a8d": "maxAmountToSell()", +"414ceac0": "investorAddFee(uint256)", +"414d784e": "DECIMAL_ZEROS()", +"414db054": "Loss(address,uint8,uint256,bytes32,bytes32,uint256,uint256)", +"414db89e": "tokenForSale(uint256)", +"414e2e9e": "walkTowardsBlock(uint256)", +"414e5738": "panicOn()", +"414ee145": "lastBlock_f18Hash_uint256()", +"415016f4": "getBalance(uint16)", +"4150f4cd": "setSysAcc(address)", +"415194fb": "referral_ledger(address)", +"41522e41": "setHighWater(uint256)", +"41524433": "sellKissBTCWithCallback(uint256,address,uint256)", +"4153090e": "startFavorEscrow(uint256,uint256,uint256)", +"41533ba7": "getRateByTime()", +"4153d65b": "securePay(uint256)", +"4153d751": "onTransferOwnership(address,address)", +"41541318": "createPromoNinja(uint256,address)", +"4154aede": "refund(address,uint256,address)", +"415510df": "addressPreSale()", +"41554a2e": "issua(uint256)", +"41555acd": "storeOwner(address)", +"41562e69": "insertNodeBatch(bytes32,bytes32[2][5])", +"41566585": "whitelistAddress(address)", +"4156fdb7": "createSwap(uint256)", +"41583c4b": "_updateCardClaimerAddress(uint256,address)", +"4158506a": "participantsLength()", +"41585a0c": "increaseCount(bytes32)", +"41587b08": "addWeapon(uint8[176],uint8,uint8)", +"4158d848": "fundChecking()", +"41595f04": "ALLOC_RESERVED()", +"4159712a": "LogOwnerEthWithdrawn(address,uint256,string)", +"415a0d46": "_preValidateTokenTransfer(address,uint256)", +"415bc701": "HCPTToken()", +"415bd3fa": "_report(bool,string)", +"415c7593": "autoRentByAtom(uint256,uint256)", +"415dd7d8": "newRandomValue(bytes,address,uint256)", +"415eea1b": "vaultNum()", +"415ef37c": "weiSold()", +"415efb15": "setup(string,string,string,uint256,string,string,uint256)", +"415f1240": "liquidate(uint256)", +"415f47ea": "decodeOrderUserId(uint256)", +"415f9498": "commission2()", +"415fad10": "test_threeInvalidEqInt()", +"415ffba7": "close(uint256,bytes)", +"416108e2": "ERRLCoin()", +"4162169f": "dao()", +"416232af": "CampaignContract(address,address,address,address,uint256,string)", +"4163afb6": "MANHATTANPROXY8THAVE()", +"4163b5a4": "weiUsdRate()", +"4163d75d": "delPokemonFromSellingList(address,uint256)", +"4165295a": "getMixParticipantIdByAddress(bytes32,uint256,address,address)", +"416608a9": "updateTemplate(uint256,uint256,uint256,string,string)", +"4166c1fd": "getElevation(uint8,uint8)", +"4166eab4": "zeastadscredits()", +"41676f15": "isOrganizer(address)", +"4167c2fd": "setVaults(address,address,address,address,address)", +"416851a0": "testOracleQuery(string,string)", +"4168614a": "volumeBonus(uint256)", +"4168de57": "teamIssueVesting(address,uint256)", +"41696fa8": "updateMyEntity(uint256,bytes32,bytes32,bool,address,uint256,uint256)", +"416a1b62": "Liquet()", +"416ae768": "getUserState(address)", +"416bc7f6": "createSplitter(address[],string)", +"416c0d38": "adminRetrieveContractConfig()", +"416c334d": "withdrawDistributedToPoolOwners()", +"416c3f16": "eligibleAmount(address,uint256)", +"416c6383": "testConcatMemory31Bytes()", +"416c8701": "beyond()", +"416c9627": "updatePresaleBonus(uint256)", +"416ccd02": "limitVIP()", +"416cf34e": "ULCToken(address,uint256)", +"416da702": "TOKEN_USDCENT_PRICE()", +"416dc762": "endThirdPeriodTimestamp()", +"416dffb0": "cleanupURLs()", +"416e517e": "setOutcome(uint256)", +"416e6d5e": "balanceManager()", +"416e70f6": "linkToMasterWallet(address,address)", +"416f222a": "submitBid(uint256,uint256,uint256)", +"416f5483": "changeEthAddress(address)", +"41709748": "getTotalDrone()", +"4170a419": "setCCH_edit_34(string)", +"4170e191": "MiniMeBaseCrowdsale(address)", +"4170ee08": "reVote(uint256)", +"41713a37": "directTradeAllowed()", +"41718066": "hitFoundationPrecent()", +"417297a0": "issueTokensSale(address[])", +"4172d080": "tokenExchangeRate()", +"41733f7a": "fooToken()", +"4173b181": "setWeiPrice(uint256)", +"4173c27a": "REEFToken()", +"4173ffbc": "getRand(uint256,uint256)", +"41744dd4": "feeRatio()", +"4174a943": "Deposited(address,address,address,uint256)", +"4174f1a5": "TOKEN_RATE()", +"4175b307": "addAddresses(address[],string)", +"41760afc": "_setEventsHistory(address)", +"41763225": "createRewardCollectible(uint8,uint8,uint256,address,uint256,uint256,uint256)", +"4176368f": "paymentSizeE()", +"4176ce68": "IsAuthority(address)", +"41771b62": "changeFees(uint8)", +"4177340d": "openGamePlayNo(uint256)", +"4177afa6": "TIER_2_BUYIN()", +"4178617f": "addAllowedToken(address)", +"41796bea": "OfferCreated(uint256,bytes,address)", +"41799883": "decreaseSoldSaleSupply(uint256)", +"417a2909": "getUpdateTimes()", +"417a767e": "getBetsBlock()", +"417a7d60": "checkMessageData(address)", +"417b3409": "DownloadMusic(uint256,address,uint256)", +"417b86fb": "getPolicyDetailsByHash(bytes32)", +"417ba840": "checkMemberLevel(address)", +"417c73a7": "addToBlackList(address)", +"417c8d40": "SEK_Omnidollar()", +"417cb353": "totalDecimals()", +"417d5fb4": "advisersPeriodsNumber()", +"417de5b5": "mintAirdropToken(uint256)", +"417e8e67": "getCompoundedInterest(uint256,uint256,uint256)", +"417ea2dc": "platformSupplyRemaining()", +"417f204e": "GATC(uint256,string,string)", +"417fd6b6": "setMinBidAmount(uint256)", +"41808d4a": "test_remove_tail()", +"4180b70d": "KKday()", +"4180c2d5": "payout(address[])", +"4180f6ec": "RESERVED_TOKENS_FOUNDERS_TEAM()", +"4181641b": "engrave(string,bytes32)", +"41829445": "createNewCE(bytes32)", +"4182e5eb": "deleteContract(uint256,address,uint8[],bytes32[],bytes32[])", +"4182fa46": "getHouseAddressShare()", +"41831218": "maxPerPersion()", +"41832bed": "generateOrderHashes(address[4],uint256[8])", +"4183689f": "initSignetures()", +"4183f0b3": "startCardSale()", +"41843aa5": "subusermoney(address,uint256)", +"4184907e": "ESPlatts()", +"41852eb2": "BuyToken()", +"418599cb": "SerenityTeamAllocator()", +"4185f8eb": "receiveEth()", +"4185fdc5": "decreaseFrozen(address,uint256)", +"41863a7d": "victorieumICO1Token()", +"41867384": "new_bonus_for_next_period()", +"41868769": "CallAborted(address,bytes)", +"4187a193": "stageThreeStart()", +"41883b78": "withdrawHouseEarnings()", +"4188d79c": "releaseExists(string,uint32,uint32,uint32,string,string)", +"418939c0": "fillBid()", +"4189a68e": "sell(uint256,address)", +"418ae602": "verificationAddressHoldersListCountMap(address)", +"418bc2ee": "updateHatchingRange(uint16,uint16)", +"418bc76c": "gasForKWH()", +"418c7de1": "currentFulfillment(string)", +"418ca0c7": "subOnStage(address,uint256,uint256)", +"418cb077": "CustomToken()", +"418cf199": "setEstimateCost(uint256,uint256)", +"418d4dcc": "collectPayoutForAddress(address,address)", +"418d75b6": "getBuyerOption()", +"418f1487": "confirmDividendsFromPot()", +"418f3a9b": "Invest(address,uint32,uint32,uint256)", +"4190af2e": "walletTokenReservation()", +"4190cfc1": "getAllQuestionAddresses()", +"4190f365": "PUBLIC_MAX_CONTRIBUTION()", +"41910104": "returnSuspendedPayments(address)", +"41910112": "DecentBetToken(address,address,address,uint256,uint256,uint256)", +"41910f90": "BASE_RATE()", +"41923c0c": "PRICE_ICO1()", +"419259ef": "reissueCert(bytes32,bytes,bytes32,uint256,bytes32,bytes,uint256)", +"4192610e": "callThisToStop()", +"419308f7": "getPreviousNode(bytes32)", +"4193b8b7": "bytesToUint(int256,bytes)", +"4193e15f": "OrbusToken()", +"419469fe": "calculateCellSell(uint256)", +"41953e90": "CoinTel()", +"4196cd4a": "stateIndexToApproved(uint256)", +"4196fad9": "mop()", +"419759f5": "depositAmount()", +"41976e09": "getPrice(address)", +"4198d24a": "mintAllocations()", +"4198e94d": "setbounty(uint256)", +"419905e5": "pray()", +"419945f8": "ExpiringMarket(uint256)", +"4199dbe6": "avvia_votazioni()", +"419a3de6": "allotItem(uint256,uint256)", +"419a88b6": "XPA()", +"419ab31e": "USERS_address()", +"419b96fa": "removeBusiness(address)", +"419bd6c0": "Nairotex()", +"419ce264": "ercToNativeBridgesAllowed()", +"419db07b": "generousFee()", +"419e6e5c": "getTotalNamesCount()", +"419e7589": "setProviderDetails(uint256,string,string,uint256,string,uint8,address)", +"419eafdc": "winPercent(uint256)", +"419ef898": "IBRToken()", +"419f6a3a": "isAirdropOver()", +"419ffa03": "fipsRegister(address)", +"41a0894d": "getReferrals(address)", +"41a08aaf": "judge(uint256,bool)", +"41a0be7b": "renameHorsey(uint256,string)", +"41a1053f": "strRemoveLastCharacter(string)", +"41a1a582": "getOwnerPayout(uint256)", +"41a1d66c": "sendTokensToExchange(uint256)", +"41a2625f": "endPreico()", +"41a28df6": "setAdminAddr(address)", +"41a292be": "calcPriceAt(uint256)", +"41a41523": "TIMEDEX()", +"41a42ba2": "updateNetworkConnection(string,string,address)", +"41a461fb": "SDAToken()", +"41a49409": "setWhitelistManager(address)", +"41a494c5": "award()", +"41a4c309": "_burnApproveClear(address,address)", +"41a4c5bf": "changeBonus(uint256,uint256,uint256,uint256,uint256)", +"41a51d00": "total0xbtcBalance()", +"41a5518f": "getMineInfoInDay(address,uint256,uint256)", +"41a59cef": "SDGT(uint256,string,uint8,string)", +"41a5b33d": "withdrawFromToken(address,address,uint256)", +"41a6cfda": "ROSCcoin(uint256,string,string)", +"41a6f46e": "FIESTA()", +"41a70b4c": "addArgumentToRequestString(uint256,bytes32,bytes32)", +"41a76287": "updateUintSetting(uint256,uint256,address,string,string)", +"41a7726a": "subscribe(address)", +"41a806ca": "addFamily(address)", +"41a82cc1": "ruleB(uint256)", +"41a84a0d": "getTokensForContribution(address,uint16)", +"41a928fe": "downTick(uint256,uint256)", +"41a943e2": "addAdmin(address,address,bool,bool,bytes32)", +"41aaccb0": "claim_eth_by_address()", +"41abe705": "doCount(address)", +"41ac59b7": "massTransfer(address[])", +"41ac5dd0": "updateFulfillment(uint256,uint256,string)", +"41ad3f57": "chickenToAltar(uint256)", +"41ad5c72": "createGroup(bytes32,uint256)", +"41ad785e": "payAndDonate(address,address)", +"41adb3f5": "saveInfo(string)", +"41ade6b7": "setRegisteredFirm(string,bool)", +"41aeaea7": "restWei()", +"41aed7cb": "isActiveEmployer(address,address)", +"41af1524": "verificationCodeHash()", +"41affe19": "publicSaleWallets(uint256)", +"41b0b4cd": "distributedTeamStakes()", +"41b2121c": "newInvestor(address,uint256,uint256)", +"41b2485b": "fiatContract()", +"41b280d2": "getTXwithCode(bytes32)", +"41b3203c": "PlaySimpleGame(uint8,bool)", +"41b3a0d9": "contractEnabled()", +"41b3d185": "minDeposit()", +"41b44392": "removeDarknode(address)", +"41b4a626": "cashSale(address,uint256)", +"41b4be87": "getPoolbyGtype(uint8)", +"41b5467a": "getUnpaidPerfit(uint32,uint32,uint256)", +"41b6f6ce": "getStatusDeal(bytes32)", +"41b6fcf7": "paymentDigest(bytes32,uint256)", +"41b80184": "lastProfitTransferTimestamp()", +"41b8547c": "Dev_Supply()", +"41b94f10": "_toTaxed(uint256)", +"41b989d0": "CashDeposit(address,uint256)", +"41b9c14c": "getShipsByOwner()", +"41b9dc2b": "has(bytes32,bytes32)", +"41ba4738": "GOLD_AMOUNT_NDC()", +"41ba9a17": "removeMilestones(uint8)", +"41bb0559": "symbol(string)", +"41bb26d3": "handlePayment(address)", +"41bb50f7": "eachIssuedAmount()", +"41bc0b6a": "LivepeerVerifier(address,address,string)", +"41bc2bea": "setProviderOwner(uint256,address)", +"41bc7b1f": "getOracleDetails()", +"41bcd712": "RTPToken()", +"41bd84aa": "_removeAffiliate(uint256)", +"41be0a14": "SPOT9()", +"41be44d5": "XAUDToken()", +"41be84cf": "getWingsValue(uint256)", +"41beb00c": "getResult(bytes32,uint256)", +"41bec0d2": "setERC20Address(address)", +"41becaef": "tokenIssueIndex()", +"41beef9d": "getSpareRecommAddr()", +"41c06b2a": "_reached(uint256)", +"41c0aa0e": "lockUnsoldTokens(address)", +"41c0dc59": "PAYOUT_FRAC_TOP()", +"41c0e1b5": "kill()", +"41c12a70": "voteNo()", +"41c14eb4": "BrokerImp(address,address,uint256,address)", +"41c173e2": "preICO(address,uint256)", +"41c1f017": "CONFIG_MAX_EXPOSURE_DIV()", +"41c1f5b4": "dreamToken()", +"41c1f60e": "instruct_5()", +"41c2c8f6": "FutaToken()", +"41c3e7c7": "report(address,bytes32,uint256[],bool)", +"41c41025": "updateFunders(address,bytes32,string,uint256)", +"41c41923": "freeze_contract()", +"41c46ff7": "PALToken8(uint256,address)", +"41c4c7eb": "sellBreeding(uint256,uint256,uint256,uint16,bool)", +"41c5cf5c": "ICOend()", +"41c61383": "totalClaims()", +"41c6f609": "registerNewMember(address,uint256)", +"41c7eb41": "populateTrancheRates()", +"41c8146c": "changeTimeBonuses(uint256,uint256,uint256,uint256,uint256,uint256)", +"41c838cb": "getSANitized(string)", +"41c8b1de": "lendingInterestRatePercentage()", +"41c8ba1e": "MIN_CONTRIBUTION_CHF()", +"41c9692b": "phase1Duration()", +"41c96964": "getInvestorInfo(uint256)", +"41c9c72d": "updateDelegatorRewards(address[],uint256[])", +"41ca641e": "getShareholders()", +"41ca7242": "maxCapPre()", +"41caea7d": "EventWithdraw(address,uint256)", +"41cbd6ea": "getTrustedPartner(address)", +"41cbfc7b": "getKeysByType(uint256)", +"41cc0aa5": "RET_MUL()", +"41cc8912": "renameToken(string,string)", +"41ccf987": "ownedPool()", +"41cd47bf": "FEE_NUMERATOR()", +"41cdd253": "TestFMA(uint256,string,string)", +"41ce7f23": "BACToken(uint256,string,uint8,string)", +"41ce909f": "Bitroneum()", +"41ce979d": "VanityReleased(string)", +"41ce9f0e": "setBZRxTokenContractAddress(address)", +"41cfbb96": "test_someOtherFalseTest()", +"41d003cb": "setBonusCreationRate(uint256)", +"41d00774": "CoefRew()", +"41d00b1d": "EBIToken()", +"41d03085": "NEWONE()", +"41d09fbe": "sendWinnings()", +"41d0fcb6": "setSanctuaryAddress(address,address)", +"41d15b54": "createProductionUnitTokenContract(uint8,uint8,uint8,uint256,uint256,uint256,uint256)", +"41d1a4d6": "getStrategyAtIndex(uint256)", +"41d1da19": "Cloudeb()", +"41d20767": "ethMinContribution()", +"41d2c748": "applyCoeff(uint256,address)", +"41d31feb": "get_read_only_keys()", +"41d45f4a": "UNEK()", +"41d4a1ab": "bonusToken()", +"41d4a39e": "setCrowdsaleClosed(bool,bool)", +"41d5da6b": "getMyStatus(bytes32,bytes32)", +"41d5e10c": "BittwattToken(uint256)", +"41d5f7ac": "eligibleAmountCheck(address,uint256)", +"41d76a9c": "firstTime()", +"41d80050": "FundsGot(address,uint256)", +"41d875dc": "setStr(uint256,string)", +"41d8bc5f": "setExchangeRateOracle(address)", +"41d966a3": "sendFyle(address,address,string,string)", +"41d9cc43": "forgeItems(uint256,uint256)", +"41da7538": "getJadeProduction(address)", +"41da7555": "ownerPercentage()", +"41db1875": "makeBuyOrder(address,uint256)", +"41db61e1": "toGMT(uint256)", +"41db7e16": "RGN()", +"41db8c93": "_startCrowdsale(address,uint256)", +"41dbb51e": "IsFrozen()", +"41dbbb61": "SmartexFundsManager()", +"41dbe546": "HedeCoin()", +"41dc02cf": "changePatentSale(uint16,uint256)", +"41dcf454": "tokenURI(uint256,string)", +"41de2164": "getPhaseStartTime(uint256)", +"41de4181": "fireDepositToChildEvent(uint256)", +"41de4f16": "queenchUSBToken()", +"41dedc58": "gradeinfo()", +"41defd82": "cancelJobByAdmin(bytes32,uint256,address,uint256)", +"41df696e": "start_play_quiz(string,string)", +"41dfed3a": "viewCurrentPrice()", +"41e0b5d4": "Fenerbahce()", +"41e0c407": "getStudentCount()", +"41e1234e": "presaleFemaleStart()", +"41e14251": "devuelveUsers()", +"41e18398": "batchTransferFromManyToMany(address[],address[],uint256[])", +"41e2cdf4": "myGauntletType()", +"41e34be9": "unitSellable(uint256)", +"41e3a6b5": "updateSplitBalances()", +"41e50814": "DEVCoin(uint256,uint256)", +"41e51e89": "approveZeroTokensTest(address)", +"41e60c86": "unsign()", +"41e62be6": "VRToken()", +"41e6fd4b": "hasSecret(uint256)", +"41e7a787": "ERC223StandardToken(string,string,uint8,address,uint256)", +"41e7c47e": "FBR2()", +"41e831b0": "Oboc(uint256,string,string)", +"41e884d4": "viewLastClaimedDividend(address,address)", +"41e8b94c": "isThereABlockAtCoordinates(uint16,uint16)", +"41e8da52": "makeBet(uint256,uint256,address,uint256,uint256)", +"41e8fe9f": "EventRandomLedgerRevealed(address,uint256,uint256,address)", +"41e906e5": "getExercised(address)", +"41ea5127": "BaseAuction()", +"41ea59a9": "isFoundationSupplyAssigned()", +"41eb1a4a": "setUintCoinProduction(address,address,uint256,uint256,bool)", +"41eb24bb": "renouncePauser(address)", +"41ebb063": "KRHCoin(uint256,string,uint8,string)", +"41ebe9c6": "ScarcecoinStart()", +"41ecd1cd": "withdrawOwnerUnrevealed(uint256,address)", +"41ece976": "updateMinInvestmentForPreIco(uint256)", +"41ecf95b": "ParticipantJoined(uint8,uint16,uint32,address)", +"41ed2c12": "marketManager()", +"41eddf00": "checkIfCurrentlyActive(uint256)", +"41ee903e": "clear(uint256,uint256)", +"41eeb105": "doRelease(bytes16,address,address,uint256,uint16,uint128)", +"41ef3879": "stage1_price()", +"41ef6bb7": "uncirculatedSupplyCount()", +"41ef858f": "whitelistAddress(address,address,uint256)", +"41ef9184": "Pretorian()", +"41f18b43": "claimEarlyIncomebyAddress(address)", +"41f1d4dd": "whitelistControl()", +"41f1e76c": "minFundingGoalReached()", +"41f1f3e5": "getPayeeIndex(bytes32,address,address)", +"41f2ce14": "setABalance(address,uint256)", +"41f31724": "Tzedakah()", +"41f36984": "collectGamePayout(uint256,uint256)", +"41f4793a": "getCurrentImpeachmentVotesSupporting()", +"41f48ebf": "currentIco()", +"41f4ab98": "addManyToPresaleWhitelist(address[])", +"41f4fcaf": "isDrop(uint256,address)", +"41f51941": "doActivateSale(address)", +"41f59e81": "initBonuses()", +"41f64b85": "deleteBag(uint256)", +"41f65507": "pendingOracleA()", +"41f6e77e": "FindTheCureCoin2()", +"41f70465": "startCoinOffering(uint256,uint256,uint256,uint256)", +"41f77260": "withdrawSyndicateTokens()", +"41f8a524": "Verificator()", +"41f99b69": "setWithdrawalCoolingPeriod(uint256)", +"41f99e2f": "getPostDonationAmount(address,uint256)", +"41fa4876": "multiBlockRandomGen(uint256,uint256)", +"41fade8f": "getconfig(address)", +"41fb55c6": "mMaxAppCode()", +"41fbb050": "foundation()", +"41fcb0f7": "buyNapkins(address)", +"41fd32cf": "SafecontractsTREXCrowdfunding()", +"41fe0a24": "buyCrystalDemand(uint256,uint256,string,string)", +"41fee898": "refundPercent()", +"41ff4275": "_calculateUnlockedTokens(uint256,uint256,uint256,uint256,uint8)", +"41ffbc1f": "ringIndex()", +"42007fd3": "MarkRazAsComplete(uint256)", +"4202d214": "isActiveUser(address)", +"4203ea57": "minInvestmentPreICO()", +"4204f7d5": "deployMinersTest(uint32,address,uint32[],uint32[],uint32[])", +"4205875f": "ROUND_6_PRESALE_BONUS()", +"4205e5af": "pauseClosingTime()", +"4206311b": "TimeLockSend(address,address,uint256)", +"420714bd": "requestIndex()", +"42071a73": "bltRetained()", +"4207d648": "directorJurisdication()", +"42091137": "addStringSetting(string,string,address,address,string)", +"42091e76": "saltoken(address,address)", +"42095679": "lindyhanCoin()", +"420977d8": "viewStudent(uint256)", +"4209a1ef": "registerPlayer(string,uint256)", +"4209fff1": "isUser(address)", +"420a83e7": "tokenHolder()", +"420a8ac8": "NanoPyramid()", +"420a8b76": "Dancer()", +"420aa07d": "serviceTrasferToDist(bytes32,uint256)", +"420aadb8": "_execute()", +"420ae446": "allocatetokensAndWLExp(address,uint256,uint256)", +"420b5fe0": "initializeVestingFor(address)", +"420b81f6": "peekData()", +"420b9921": "ecsubtract(uint256,uint256,uint256,uint256,uint256,uint256)", +"420c96ea": "newArtwork(bytes32,uint256,string,string,string,uint256)", +"420d0ba4": "nobodyCanDoThis()", +"420d23fd": "POOL_EDIT_1()", +"420d4a02": "getUnlockedAmount(address)", +"420d4bdd": "CRYPTAU()", +"420dd15a": "getLast(string)", +"420ddaa6": "encodeKYCFlag(bool)", +"420e1f51": "tokenExchanges()", +"420e7ea6": "tokenAmountRasied()", +"420ef2b3": "TargetHash()", +"4210ad0e": "newBurnableOpenPayment(address,uint256)", +"42111339": "contributeLocal()", +"42118f51": "manualLCs()", +"4212616b": "localsUser()", +"4214352d": "write_what_where_gadget(uint256,uint256)", +"4214d52f": "updateIndex(address,address)", +"421521b1": "finalizeOpenSale()", +"42154e9c": "countAddress()", +"42159ca3": "getMaxDelayDays()", +"4215a39b": "getCreateMarketNumOutcomesValue()", +"4215da7d": "investorsStorage()", +"4216503c": "setFunStr(string)", +"42170736": "secondPhaseStartTime()", +"421715c2": "canBorrow()", +"42172a6a": "_emitERC20DividendDepositedEvent(uint256,int256,uint256,uint256,address,uint256,uint256,uint256,bytes32)", +"42173c98": "purchaseCompany(bytes32,bool)", +"42193473": "DUST_LIMIT()", +"421983d7": "confiscate(address,address)", +"421a5727": "stealPot()", +"421ae949": "thawTokenTransfers()", +"421aeba2": "setEditedFalse(address)", +"421aeda6": "Set_your_game_number(string)", +"421b2395": "UltiCoinICO()", +"421b2d8b": "addUser(address)", +"421c0d9c": "unregisterDsp(address)", +"421d72e2": "isPaymentForked(uint256)", +"421db384": "leftICOTokens()", +"421e2dc2": "getPartnerAmount(address)", +"421e52e3": "card_gold_minamount()", +"421ed7dd": "balancesInitialized()", +"4220324b": "mainSaleStart()", +"42207083": "getGameRoundOpen(uint256,uint256)", +"4221115c": "SfomoToken(uint256,string,string)", +"42226e02": "setMaxEth(uint256)", +"4222e211": "getPhaseState(uint256)", +"42235da6": "minimumTarget()", +"4223ac0f": "ABCToken()", +"4223ad89": "NewRefundTransaction(uint256,uint88)", +"4224f2ca": "HzxhcToken(address,address)", +"42261ea4": "cancelSale(address[])", +"422624d2": "destroycontract(address)", +"422627c3": "getDna(uint256)", +"42263aa2": "set_token_address(address)", +"422752bf": "getPartialAmountFloor(uint256,uint256,uint256)", +"42279e82": "removeFromPreSaleRefunds(address,uint256)", +"422810ea": "transData(address,uint256,bytes)", +"42285bc5": "_ensureRef(address)", +"42287b66": "createPromoPerson(address,string,uint256)", +"4228974c": "Videos()", +"4229616d": "collectPercentOfFees(uint256)", +"4229c35e": "setItemPrice(uint256,uint256)", +"422b00bb": "dataentryclerk()", +"422b1c70": "setMinweiAmount(uint256)", +"422b423e": "getCheatWarrant()", +"422b7964": "_approve(uint256,address)", +"422c29a4": "getWallets(address)", +"422c3ad9": "changeEndTime(address,uint256,uint256)", +"422cbb48": "MarkosToken()", +"422d3374": "tbitfwdToken()", +"422d37c4": "mintWithEvent(int256,address,uint256)", +"422d4cd6": "increasePayout(uint256,uint256,uint256)", +"422dabac": "allocateEther(uint256,address)", +"422e33f3": "migrationNewAddress(address)", +"422e82a7": "EthToCoins1()", +"422f1043": "addLiquidity(uint256,uint256,uint256)", +"422f3a2c": "nestedFirstAnyToSome(uint256,uint256)", +"422fcbd5": "MCST()", +"4230bb10": "badgeLedger()", +"42317bbc": "flipRefundSwitchTo(bool)", +"42318e3d": "percent(uint256,uint256)", +"4231a2c3": "getLastRound()", +"4231e2d7": "transferFreezership(address)", +"4231ee16": "addInBountyProgramMap(address)", +"42320732": "allSupply()", +"423252f9": "buscarDocumentoPorTitulo(bytes32)", +"4232a399": "XC()", +"42340458": "disable(uint8)", +"42346c5e": "parseInt(string)", +"423592ce": "startTde()", +"4235e336": "BetDirectory()", +"4235e98e": "Buy(uint8,string,string)", +"42367389": "test_twoValidEqInt2()", +"4236b312": "dealContract(uint256,string,uint256,uint256,string)", +"4236da98": "INTREPID_PRICE_INCREMENT()", +"42382353": "restartTheQueue()", +"4238b84c": "DMBToken()", +"423948fd": "changeCollateralAmount(uint256)", +"42399220": "setCampaignOwnerById(bytes32,address)", +"423a7954": "developerfee()", +"423a968d": "_setRSPScienceAddress(address)", +"423b1ca3": "battleContract()", +"423c3a48": "burnTokens(address,address,uint256)", +"423c485a": "depositFee(uint256)", +"423d4ef2": "createChannel()", +"423da88e": "Unix_Timestamp_Binary_Trading(uint256)", +"423dcf29": "dustToEtherPrice()", +"423e1298": "setDoNotAutoRefundTo(bool)", +"423e7e79": "_dispatchEarnings()", +"423f0b6e": "replaceModule(address)", +"423f6cef": "safeTransfer(address,uint256)", +"423fb140": "CrowdsaleToken(string,string,uint256,uint256)", +"423fcd5e": "_promo()", +"42402c2c": "fipsTransferMulti(bytes20[],address)", +"4240a978": "ICO_TILL()", +"42419336": "ICO_BONUS_RATE()", +"42427bf8": "upgradeController(address,address)", +"4243cb36": "payConversionFromTransaction(uint256,address,uint256)", +"4244e09f": "getBetterBettingInfo(address)", +"4245508a": "getRoundMaxNumberOfBets(uint256)", +"424592ca": "calculateDistributedIntervalEarning(uint256,uint256)", +"424599c4": "seedSaleTokenLeft(address)", +"4245b0f7": "Lottery()", +"4245d48e": "getHashes()", +"4245f3da": "tokenOfOwnerByIndex(uint256)", +"42465a1e": "getTokenUnits(address)", +"42469e97": "_setBonusRate(uint256)", +"4246ad24": "calculateMinedCoinsForTX(uint256,uint256)", +"4247f52d": "DoRoll()", +"4248083b": "approveUser(address,uint256)", +"4248aefe": "awardMiniGamePrize()", +"4248afe8": "addCrowdSaleTokensMulti(address[],uint256[])", +"424976f9": "registryRead(bytes32,bytes32)", +"42498389": "transferLimitedFundToAccount(address,uint256)", +"424a8993": "selectOfferingProposal(uint8)", +"424a8c0d": "constructorReconToken(address,string,string,uint8,uint256,bool,bool)", +"424aa0e5": "StockusToken()", +"424b828f": "CharityReservesWallet()", +"424bc2e9": "newGame(string,string)", +"424d6bb1": "changeApi(address,address)", +"424ddaac": "get_available_interest_amount()", +"424e418f": "setMinSecondaryAmount(uint256)", +"424e94da": "VoteHub(address)", +"424ea3b2": "refund_deposits(string)", +"424ea872": "startTimestampIco()", +"424eb9fe": "getInitBalance(address)", +"424f4fef": "vendingMachine()", +"424f9947": "privateIcoBonus()", +"424fa9ec": "Prismacoin()", +"424fed48": "EBPtandardToken(uint256,string,uint8,string)", +"424fffda": "updateContact(string)", +"4251447a": "WhiteListSet(address,uint256)", +"42516f1d": "startAirdropBy0Eth()", +"425189e0": "getFashion(uint256)", +"4251a7a4": "totalNihilum()", +"4251ecb4": "nMsg()", +"42526e4e": "bytesToAddress(bytes)", +"425432b1": "tokensPerAddress(address)", +"42545825": "hasVoted(address,uint256)", +"4254704f": "TOKEN_CLAIM_WAIT_PERIOD()", +"4254b155": "register(bytes32,string,address,address,address)", +"425543f1": "CreateDummyPlayer(bytes32,uint8,uint256,address)", +"4255e808": "jackpotContract()", +"42565405": "setNeuroChainAddress(string)", +"42569ff3": "limitedPrinter()", +"4256dbe3": "setReserve(uint256)", +"4256fa5a": "timeToBorn()", +"4256fa9f": "exchangeTokens(address,uint256)", +"4257347e": "freezeAccountToken(address,uint256,uint256)", +"42577935": "createPanda(uint256,uint256)", +"4257d3e0": "currentGameBlockNumber()", +"42585b34": "getSnap(uint256)", +"42587795": "deploySimpleContract(string,string,uint256)", +"4258cb76": "Ultracash()", +"4258d771": "funding_ended()", +"425946e3": "setCurrentMember(address)", +"4259701b": "getSocialAccountPw(bytes32,bytes32)", +"4259b52e": "configurationCrowdsale(address,uint256,uint256,address,uint256[],uint256,uint256,uint8)", +"425adae7": "isBonusEnabled()", +"425d4980": "mintAddress()", +"425d512a": "setDAOContract(address)", +"425e0d3c": "BasicToken(uint256,string,uint256,string)", +"425ef4b5": "modify_str(string)", +"425f7857": "taxTokenCreated()", +"4260c779": "start_ico()", +"42616d21": "goldTotalSupply()", +"42618b91": "buyRoundKey(uint256)", +"426201ef": "lastBlock_v19()", +"42623360": "stakeOf(address)", +"426365ad": "setForceOffsetAmount(uint256,uint256)", +"42636c09": "existIdAfterVersion(bytes32)", +"4263ed83": "hasNextSeedHashA()", +"4264b4e0": "ownerPayout()", +"4266806b": "cf1Wallet2Pct()", +"4266873f": "setAicPrice(uint256)", +"426695c6": "getDeedId(bytes32,uint256)", +"4267e19c": "getOwnedTokensIndex(uint256)", +"42686bbe": "GetPartLimit(uint8,uint256)", +"4268a257": "updateRoundInformation()", +"4268db7d": "cite(string,string)", +"4269d8ef": "_safeSend(address,uint256)", +"426a0af3": "updateManyLandData(uint256,uint256[],string)", +"426a8493": "approve(address,uint256,uint256)", +"426aa87f": "deleteRecording(uint256)", +"426ad3f5": "getChainName(uint32)", +"426b7113": "tokensSoldPre()", +"426bc60c": "Educoin(uint256,string,uint8,string)", +"426d4f22": "expandNegative128BitCast(uint256)", +"426d5ef1": "oraclizeCallbacks(bytes32)", +"426d70fa": "isPrivateIcoActive()", +"426dd27c": "getGroup(uint256,uint256)", +"426e0b20": "daoStakeClaimed()", +"426e5ae6": "senderTokenBalance()", +"426e6f8e": "updateValueAndMint(uint256,uint256)", +"426eae45": "bondingManager()", +"426eb017": "uri(address)", +"426f5531": "maxAllProfit()", +"426f8f6b": "viewNumberOfRequests()", +"426fa499": "isIcoStarted()", +"426fe411": "contributorDeposit()", +"4270d48a": "nextmarketoffer()", +"42714978": "removeInvestor(address)", +"427163dc": "refundBid(bytes32)", +"4272f2d5": "heroTokenContract()", +"4273601c": "factoryOwner()", +"4273bc59": "bids_sorted_refunded()", +"42740286": "maxMintPoS()", +"42750020": "tokensCreated()", +"42753e7e": "isInSale()", +"4276016f": "oversightAddress()", +"427654da": "getDailyLimitUsed()", +"42767018": "smallRate()", +"4276d082": "FrozenEther()", +"42772947": "callEndRoundControl()", +"4277b5b1": "check(address,address,address,uint256)", +"4277e497": "PaymentRejected(address,bytes8,uint256)", +"4277e823": "TravelHelperToken(address,address,address,address,address,address)", +"42787798": "grantedContracts(address)", +"4278ff31": "setTangibleAssetAddress(address)", +"427913f2": "getClaimedFinancialData()", +"4279523e": "serviceChangeOwner(address)", +"427982f2": "tokenSaleMax()", +"427a2fc2": "getClaim(uint256,uint256)", +"427ac5e4": "checkForUpdates()", +"427b59d3": "HiPrecious()", +"427b72fc": "proofFailed(address,uint256)", +"427c854d": "_createSkull(uint256,uint256,uint256,address)", +"427c9aca": "LogPayoutFailed(address,uint256,uint256)", +"427d5f2e": "tierAmountCaps(uint256)", +"427da275": "redeemUTXO(uint256,bytes32[],bytes,bool,uint8,bytes32,bytes32)", +"427e024a": "AdministratorRemoved(address,address)", +"427e332f": "lastBlock_a8()", +"427eebfc": "returnOwnershipOfToken()", +"427f0b00": "roundInfo(uint256)", +"427f56ff": "bonusAllocAddress()", +"427f9614": "getReference(bytes32)", +"427fa1d2": "getLastNode(address)", +"427fc2df": "preIcoPeriod()", +"4280606b": "addCondition(bytes32,bytes32,address,int256,bytes32,address,int256,bytes32)", +"4281267b": "buyLCARS()", +"4281a651": "SponsoredItemGooRaffle()", +"4281b13f": "getAllbetByNum(uint8,int8)", +"4281b34b": "play(uint256,uint256[])", +"42836c2e": "hasAddress(address,address)", +"4283fbe5": "dummyGasBurner()", +"42842e0e": "safeTransferFrom(address,address,uint256)", +"42846c09": "Bonus(address)", +"42849570": "myReward()", +"4285d477": "teamTokensFreeze(address)", +"428657f7": "storeNewVesting(address,string,uint256)", +"4286ed3e": "callBtoWithStc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"4287eef9": "fechStageBlockByIndex(uint256)", +"4287f14a": "teamReserve()", +"428840f6": "fadd()", +"4288d759": "betOf(address)", +"4289c781": "setSellPrice(uint256,string)", +"428a2ece": "createTokenVault(uint256)", +"428a8120": "tier0Total()", +"428afcd1": "setUpgraded(uint256)", +"428be33f": "ReleaseFundsAndTokens()", +"428c91ae": "genAddressFromGTIN13date(string,string)", +"428d189c": "takeTokens(uint256)", +"428d475a": "beConstant()", +"428d5630": "mintOnDemand(address,uint256)", +"428d64bd": "getShares(address,bytes32[])", +"428e2d64": "getMsg(address)", +"428e357b": "getUInt8(bytes32,bytes32)", +"428e5aaa": "addToPrize()", +"428eb006": "batchAirdropWithLock(address[],uint256,bool)", +"428eb5cf": "getRandomNumber(int256,int256)", +"428f180c": "minimumSpend()", +"428f4146": "SimplePHXExchange()", +"42906029": "newManager()", +"42909a9e": "create_game()", +"4290a5b9": "uninject(address)", +"4290bd4d": "isTokenOfferedToken(address)", +"4290db52": "burnFromAnotherAccount(address,uint256)", +"4290e6b6": "setTokenName(address,uint256,string)", +"42915914": "test_dispersal()", +"4292327c": "_isMyLeague(uint8)", +"42923409": "ArinToken()", +"4292a797": "ZAZA()", +"4293253c": "tokenSaleLowerLimit()", +"429374f3": "ScorpioCoin(address)", +"42946d88": "getIGOAccoountByAddr(address)", +"4294857f": "isRevoked(bytes32)", +"42948e18": "getSenderAddress()", +"4294bea0": "BarcelonavsRoma()", +"4294cdb2": "BixcPro(uint256,string,uint8,string)", +"42958b54": "issue(address[],uint256)", +"42966c68": "burn(uint256)", +"4296a9cb": "getNodeRightChild(bytes)", +"4296b4a7": "freezePlayer(address)", +"42974b1e": "freeReferralPacksClaimed()", +"42980e20": "LifeToken()", +"429838e0": "Allow_Entries()", +"42992dd5": "icoStartTimestampStage2()", +"4299431e": "REALMock(address)", +"42995e12": "canReceiveMintWhitelist()", +"4299c213": "lastReading(address)", +"4299f706": "PonziScheme(uint256)", +"429a2591": "convertAmountToTokens(uint256)", +"429aa0a4": "DAILYC()", +"429adcb9": "minSumICOStage7USD()", +"429b62e5": "admins(address)", +"429b92bf": "getProposalName(uint256)", +"429c1561": "setReputationProblems(address,string)", +"429c6e5b": "getClaimedAmount(uint256)", +"429cddca": "selectOwnerAddressForTransactionFee(address)", +"429d15ba": "testCorrectFunctionIsCalledOnTransfer()", +"429d6a69": "walletBeneficiary()", +"429f3b48": "blockAccount(uint256)", +"42a04fea": "getBadges()", +"42a173a5": "transferByCasino(address,address,uint256)", +"42a1928b": "initSale(uint256,uint256,uint256)", +"42a19c71": "giveProjectTokens(address,uint256)", +"42a1f3eb": "ProvToken()", +"42a37176": "showMyEtherBalance()", +"42a38a00": "mediatorWallet()", +"42a4af66": "updateCatReleasePrice(uint32,uint256)", +"42a5000d": "startPRESALE()", +"42a63361": "updateTribeProducts(address)", +"42a657fd": "primaryListing()", +"42a6617d": "stepTwoRate()", +"42a66f68": "totalRate()", +"42a6739b": "acceptRandom(bytes32,bytes)", +"42a6b21a": "getContributionLimit(address)", +"42a6c4dd": "getBidByToken(address,uint256,uint256)", +"42a745cb": "testBitEqualSuccess()", +"42a787fa": "determinePlayer(int128,uint128,uint8,bytes32,bytes32)", +"42a7a8e0": "SmartzToken()", +"42a7c40e": "ThiccCoin()", +"42a7cfd5": "naturalUnit()", +"42a8f2f4": "internalTransfer()", +"42abfde8": "getLunckyIndex(uint256)", +"42ad2c6f": "maxPreIcoDuration()", +"42ae07c0": "RateRemove(address)", +"42ae0a16": "crowdsaleBalance()", +"42aeba30": "Shipment(address,address,string,string,int256,int256,uint256,uint256)", +"42af2478": "PartialFundsTransfer(uint256)", +"42af4821": "TUDOR()", +"42af8f0c": "buy(uint256,uint256,address,address,address)", +"42b053ce": "SyedaMahaAliTestCoin()", +"42b07d6d": "cashBackFromProject(address)", +"42b1295a": "addMultipleAllowedAddresses(address[])", +"42b2106c": "FoundationTransferred(address,address)", +"42b222bd": "showTokenValue(address)", +"42b31b1f": "Elythrium()", +"42b38674": "isValidValidatorSignature(address,bytes32,address,bytes)", +"42b41aa4": "sendCoin(address,address,address,uint256)", +"42b4632e": "canPropose(address)", +"42b4807a": "getRegionCoordinates(uint256)", +"42b4ef95": "Helper()", +"42b50a7a": "getOrderById(uint256)", +"42b594cb": "buyTicketByEth(uint256,bytes32,bytes32,bytes32)", +"42b5a2a9": "maxTxGasPrice()", +"42b614a9": "round_after()", +"42b64a59": "VisionX()", +"42b8c415": "balanceTotal()", +"42bb5709": "FundsTransfer()", +"42bb66c4": "setInvest(uint256,uint256)", +"42bd0959": "setIsBuyByAtom(uint256,uint128)", +"42be5eea": "thing(string,string,uint8,string)", +"42be9307": "changeSale(bool)", +"42beb58b": "setPreSaleOff()", +"42bf1270": "cslToken()", +"42bf41ae": "drainStrayEther(uint256)", +"42bf4431": "orderMatchTest(uint256,uint256,uint256,int256,uint256,uint256,address,address,int256)", +"42bf5347": "getUserFreezeInfo(address,uint256)", +"42bf8db3": "getRate(string,uint64)", +"42bff0d0": "setExchangeAdapterManager(address)", +"42c01f66": "setRateEarlyStage3(uint256)", +"42c102a5": "GetSnail(address)", +"42c1867b": "mintAgents(address)", +"42c1ea29": "evidenceInterval()", +"42c23db5": "AddToDividends(uint256)", +"42c2d31a": "EtheremonToken(address,address,address,address)", +"42c304be": "accountsListLength()", +"42c3301a": "showJackpotThisRd()", +"42c469e0": "GameSpiritCoin()", +"42c501a1": "LogOwnerTransfer(address,uint256)", +"42c50f75": "TeamMembersAmount()", +"42c549c0": "getMilestones(uint256)", +"42c5d7ad": "sendAdvisorsBalance(address,uint256)", +"42c62865": "withdrawsCount()", +"42c62882": "getMyDividends(bool)", +"42c6498a": "genesisTime()", +"42c65ae5": "eUSD()", +"42c69566": "get_address(address,string)", +"42c71f1d": "getApp(bytes32)", +"42c74c73": "EPVToken()", +"42c7551e": "tokenRemain()", +"42c7ea5f": "totalNumberAvailable()", +"42c80fc9": "isUpgraded()", +"42c81f45": "MLB_Legal()", +"42c8705b": "Mine()", +"42c87205": "VirgoContract()", +"42c96767": "EtherHiLo()", +"42ca08cf": "applyFadeoutToOptions(uint32,uint32,uint32,uint256,uint256)", +"42ca2fe3": "FCOIN1110Token(uint256,string,string,uint256)", +"42cb1fbc": "ETHER()", +"42cbb15c": "getBlockNumber()", +"42cc6b04": "addAuthorizedEditAgent(address)", +"42cde4e8": "threshold()", +"42cdfe37": "tokenWithdrawEther(address)", +"42ce0555": "DisableSuicide()", +"42ce0aff": "registerAndValidateToken(address,string,string,uint256,uint256)", +"42ce0f30": "testThrowUpdateLatestRevisionNotOwner()", +"42ce1488": "upload(string)", +"42cf0a4b": "increaseEthBalance(address,uint256)", +"42cf0e72": "searchByOwner(address)", +"42cf2f81": "getSequence(bytes)", +"42cfd792": "postJob(uint256,uint256,uint256,bytes32)", +"42cffda9": "TREETOKEN()", +"42d01878": "keyRequired()", +"42d02b30": "HARD_CAP_IN_TOKENS()", +"42d16748": "getMinDailyWithdrawalLimit()", +"42d1b202": "_adoptSameClassAxies(address,uint8,uint256,address)", +"42d1f17f": "bankrollerTable()", +"42d2c127": "getStagesBeginEnd()", +"42d46a9a": "castVote(uint256,uint256,bytes32,string,bytes32)", +"42d544fb": "disallowSale()", +"42d596e0": "isPoint(int256,uint256,uint256)", +"42d64601": "pacifistmasterReq()", +"42d7cc8e": "Tx(address,uint256,string)", +"42d8f5be": "customPayment(address,uint256)", +"42d928fc": "SWIFTSCO(address)", +"42d9643c": "KYCLimitValue()", +"42da3b6b": "getAmount(uint256,address)", +"42daedea": "win_by_timeout()", +"42daf6ee": "icoStartP6()", +"42db2fba": "renounceRecoverer()", +"42dbad44": "makerOf(string)", +"42dbcdba": "weiRaised(address)", +"42dca9ea": "getManifestIdsByRegistrant(address)", +"42dd519c": "getClients(uint256)", +"42dd96f7": "killswitch()", +"42df7085": "ROLE_EXCHANGER()", +"42dfb036": "calcRateFromQty(uint256,uint256,uint256,uint256)", +"42e06ee7": "HotCold()", +"42e11316": "claimReadership(uint256,string)", +"42e1452a": "PolarisUniversalToken()", +"42e15c74": "managedTokenLedger()", +"42e16015": "AddedBlackList(address)", +"42e296d3": "soundEffects(uint256,uint256)", +"42e2d18c": "presaleIsRunning()", +"42e2da09": "QuantorPreSale(uint256,uint256,address,address,address,uint256,uint256,uint256)", +"42e2f54c": "shutDownFund(address)", +"42e35f63": "addGoal(string)", +"42e3b919": "NMFToken()", +"42e49d5a": "FUNDING_GOAL()", +"42e4d72b": "oxen()", +"42e5033e": "mainSaleEndDate()", +"42e59afa": "reloadRound(address,uint256)", +"42e5b9f1": "totalDistributedDividends()", +"42e5d5c8": "getPI_edit_17()", +"42e5da0d": "UpdatePlatformContract(string,address)", +"42e6377f": "LabtorumToken()", +"42e6c88a": "approveObjectReception(uint256)", +"42e7ba7b": "hasManagerAccess(address)", +"42e8051c": "testExternal()", +"42e81b0c": "dislikeCelebrity(uint256,uint256)", +"42e86d27": "callData(address,bytes)", +"42e90c33": "Store()", +"42e94c90": "contributions(address)", +"42e9555e": "getProviderLastSupplyID(uint256)", +"42e956f6": "addtoMarketingBusinessDev(address,address,uint256,uint256)", +"42e9c6ce": "pullTokens(address)", +"42ea74c0": "getTokenPriceInWEI()", +"42eabc29": "posibleRedemptionOf(address)", +"42ead91f": "getMegabox(uint256)", +"42eafaf5": "showFPInfoAll()", +"42ec38e2": "tokenOf(address)", +"42ed00da": "getSenderArmyDetails()", +"42ed567c": "tmpQuerySeed(uint256,uint256)", +"42ed5816": "ethDailyLimit()", +"42ed6072": "publicBattlepm2()", +"42ee4e0b": "ICO_PRICE5()", +"42ef4c1a": "hodlerTime6M()", +"42ef8c76": "alsToken()", +"42efdebf": "exchangeAdmin()", +"42f030e4": "minusTourFreezingTime(uint256)", +"42f0b07e": "BountyFund()", +"42f0ca0d": "setPreSaleEndDate(uint256)", +"42f1181e": "addAuthorizedAddress(address)", +"42f362aa": "registerNameCore(uint256,address,uint256,bytes32,bool,bool)", +"42f39381": "presaleRate()", +"42f39a6f": "ARXPackageSale()", +"42f3f7e0": "activate_reserve()", +"42f45790": "testAddress(address)", +"42f57e4c": "enableUser(address,bool)", +"42f5b7e0": "setGenome(uint256,uint256[4])", +"42f5d95d": "AllUnLock()", +"42f6208e": "lock(address[])", +"42f6487a": "payment()", +"42f6e389": "isModule(address)", +"42f81580": "CLAIM_DEADLINE()", +"42f85ce5": "pay(address,uint256,uint256[])", +"42f88548": "updateRegionPixelPrice(address[16],uint256,uint256)", +"42f88699": "ExShellToken()", +"42f9192a": "nameFilter(string)", +"42f91e9e": "BcxssToken()", +"42f989e2": "setUnlockTimeStamp(uint256)", +"42f98b14": "buyIssuerTokens()", +"42f9b306": "teamLockTransfer(address,uint256)", +"42fa3967": "toSlice(bytes,uint32)", +"42fa98e0": "Orange()", +"42fba0f5": "grantedTokensHardCap()", +"42fbbc9c": "managerPercentage(bytes32)", +"42fc63be": "DebugHash(bytes)", +"42fd6acc": "checkProof(bytes32[],bytes32)", +"42fd7d4c": "_buy(address)", +"42fdbed7": "isDeDeContract(address)", +"42fea02b": "confirmPayer(uint256,uint256)", +"42feba84": "arbiterResponseRate(address)", +"42ff1c1a": "getMetadataURL()", +"42ffb76b": "getWorkflowName()", +"4300705d": "withdrawGTO()", +"4300e8ef": "addContract(address,string)", +"4301b55b": "MintOpened()", +"4301cbe5": "getAllNames(string)", +"43021054": "BTestToken(address,string,string,uint256,uint256)", +"43021202": "fundValuePublish(uint256,uint256,uint256)", +"4302b3c8": "myTotalSupply()", +"43031e9b": "getSumOfPlayers()", +"4303707e": "generateRandomNumber(uint256)", +"43039433": "handleReturnData()", +"43046844": "placeBet(uint8)", +"4304a43f": "updatedBalance()", +"4304a6b9": "setUnfreezeStartTime(uint256)", +"430558c2": "buyGifto()", +"43062beb": "getAvailableTokensToSellTillPhaseIdxValue(uint256)", +"43062ea7": "changePurchaseCap(uint256)", +"430694cf": "getProposal(bytes32)", +"4306cc3f": "queryEarnings(address)", +"4307d081": "jazzxToken()", +"4308a36b": "getIcoPrice()", +"43090357": "readUserPurchasedToday(address)", +"4309b4b2": "getPollIdentifier(address,bytes32,bytes32)", +"430a74b7": "CrypcenToken()", +"430ab56a": "sendAllLocalEthers(address)", +"430ae7a2": "AvtcToken()", +"430bf08a": "vaultAddress()", +"430c2081": "isApprovedOrOwner(address,uint256)", +"430c2a69": "crdjetToken()", +"430c73c5": "setMarketAddress(address,address)", +"430c9247": "changeDebt(address,uint256)", +"430ca46f": "finishAuction()", +"430d2803": "getTotalPossibleTokens()", +"430d6eb2": "ParadiseToken(address)", +"430de98a": "GetCardNumber(uint8,uint8)", +"430e484a": "setupNetwork()", +"430ecff8": "blksze()", +"430fe5f0": "changeWorkerPrice(uint256)", +"430fe9c1": "getDate()", +"4310033d": "Gotoken()", +"43102eab": "isItConstantinopleYet()", +"43104d92": "addMultipleRecordsStrict(uint256[])", +"43107290": "createRequest(address,address[],int256[],address,string)", +"43114842": "acceptChallenge(uint256,uint256,uint256)", +"4311de8f": "ownerWithdraw()", +"43128a4c": "feeUSD()", +"4312f19c": "setTransferEmittables(address,bool,bool)", +"4312fece": "addAddressToIndex(address,address)", +"43133b07": "gameBeginPlayNo()", +"4313b9e5": "setup(uint256)", +"4313de82": "closeBidOrder()", +"4314162d": "untsqm()", +"431454fb": "totalMintedBountyTokens()", +"43146f36": "resetBet()", +"431562b9": "countWithdraws()", +"43156db6": "withdrawOldToken(address,uint256)", +"4315f545": "proofType_NONE()", +"43160e3d": "rootOfTrust()", +"4316abbb": "newJester(address)", +"4316fae5": "NABC()", +"43171485": "tokensHasSoldOut()", +"4317f04a": "Transfer(address,string,address)", +"431851ad": "NenoToken()", +"431993b9": "endPrivate()", +"4319dfd9": "defence(address,uint256,uint16,bytes,uint256[])", +"431a4d46": "getContractSample(string)", +"431ab1f2": "xmasFundWallet()", +"431ab233": "allOperations(uint256)", +"431adcb1": "isSellOpen()", +"431bff74": "MINING_POOL_AMOUNT()", +"431cc3dd": "batchWithdraw(address[])", +"431d6256": "Conversion(address,address,address,uint256,uint256,uint256,uint256)", +"431dac16": "registerUser(address,string,uint256,uint256,uint256,string,bool)", +"431dbd9e": "getLatestRaffleInfo()", +"431dc4b6": "current_period()", +"431dc892": "OwnedProxy(address)", +"431e0a48": "AnteilToken()", +"431e83ce": "absMaxFee()", +"431ec601": "get_exchange_count()", +"431ef9b5": "OptionsConversionOffered(address,address,uint32,uint32)", +"431f188c": "set_presale_arbits_per_ether(uint256)", +"431f21da": "createAuction(uint256,uint256,uint256,uint256)", +"431f63c9": "setTokenPrice(address,uint256)", +"4320ea1c": "CrowdsaleBase(uint256,uint256,uint256,address,address[])", +"43212413": "Addr2()", +"43212c3c": "getHighestMilesAt(uint256)", +"43214675": "setMintAgent(address,bool)", +"43216a11": "MAX_NUM_AVAIL()", +"43226631": "CURRENTLY_ISSUED()", +"4322b73b": "getAdd(uint256)", +"43235a24": "_transferProperty(uint16,address,uint256,uint256,uint8,address)", +"43243797": "fundsOf(address)", +"43245816": "tokensToEther_(uint256)", +"43245953": "CoinToken(uint256,string,uint8,string)", +"4324aa21": "classOf(uint256)", +"4324ae4f": "PhoenixExchangeDeposit()", +"4325f6bb": "OfferToCastle(uint256,uint256)", +"432607fc": "cancel(address,address,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"4326e22b": "getMerkleTreeRoot(bytes20,uint8)", +"4326f3f6": "setMinimumPriceCount(uint256)", +"4327115b": "_AddedToGeneration(address,uint256)", +"4327979a": "getPaymentParams(uint8)", +"4327acda": "addDeal(address,address,address,uint256,uint256,uint256,uint256,string,uint256)", +"4328894f": "showReportForMonth(uint16,uint8)", +"4329db46": "transferETH(uint256)", +"432a042b": "makeRegistration(bytes32)", +"432a3dfb": "roundState(uint256,uint256)", +"432a805b": "changeDailyRate(bytes32,uint256)", +"432a84d9": "ownerDepositInterest()", +"432a89aa": "GetBuildingParam(uint256)", +"432af6e9": "calculateTokensForMonth(address)", +"432b3f85": "fetchVoteResultForCandidateBySnapshotBlock(address,uint256)", +"432ba8be": "voterToBallotID(address)", +"432c4209": "IQT_DECIMALSFACTOR()", +"432c685f": "trustClient(address)", +"432ce549": "sendToUser(address,address,uint256)", +"432ced04": "reserve(bytes32)", +"432d7a1e": "_dividendsOutstanding(address)", +"432e83c5": "resetReferedCount(address)", +"432e8946": "disableTransfer(address)", +"432f0d20": "EVA(uint256)", +"432f3223": "AceFund()", +"432f3c22": "request_until()", +"43302ff3": "getMaintainFee()", +"4330301f": "_ratio()", +"4331576f": "BITVM()", +"4331e00f": "pay_claimed(address)", +"4331e8dd": "setLeader(address)", +"433288a2": "setCurrency(string,address,address,uint8,bool)", +"4334614a": "isBurner(address)", +"4334a8a5": "CHAD()", +"433503f6": "ChangeEmissionSumm(uint256)", +"4335b046": "CRAWDSALE_EARLYBIRD_END_DAY()", +"4335dfc0": "getPurchaseTimestamp()", +"43361a6e": "MineralBase()", +"4336a5a8": "EtherGold()", +"433740f8": "Purchase(address,uint256,uint32)", +"4337b391": "PriceDiscovery(address,address)", +"433836dc": "scheduleTransaction(address,bytes,uint8,uint256[3],uint256)", +"43386ea9": "getUniqueValue(uint256)", +"433900db": "presaleTokensLimit()", +"433914c9": "VeChainX()", +"43398685": "BancorFormula()", +"4339bc30": "changePool(address)", +"433a8323": "UnityCoin()", +"433adb05": "tokensReserved()", +"433b409f": "BTTSTokenListing(address,address,string,string,uint8,uint256,bool,bool)", +"433b64b1": "eventId(uint256)", +"433b77c7": "getCampaignOwnerById(bytes32)", +"433bb0e4": "fillOrder(address,address,address,bytes32,address,address,uint256)", +"433bd924": "getBreed(uint32)", +"433c39ff": "transferVoteController(address)", +"433cdc26": "PriceAdjusted(uint256,uint256)", +"433d0f33": "canUserCancelArtwork(address,address)", +"433d4aab": "resolve(uint8,uint8)", +"433d7110": "provas(address)", +"433e852d": "flushDividends(uint256)", +"433fc1da": "Bandit()", +"43406182": "enableLotteryGiveHunt()", +"43409bc5": "linkData(bytes)", +"4341274f": "_sameClassAxiesPrice(uint8,uint256)", +"4341aebc": "distributeTokensToRank(uint256[],uint256)", +"434253ff": "createItem(string,address,uint256,uint256,uint256,uint256)", +"43428e45": "minimumNumberOfBlocksToEndGame()", +"4342e966": "approve(address,uint8)", +"4342ffe5": "changeMinimumContributionForPrivatePhase(uint256)", +"4343ede6": "currentStageNumber()", +"43441a2c": "totalGivenBountyTokens()", +"4344f73d": "AssToken()", +"4345c7c9": "_upgradeTo(string,address)", +"434622fe": "additionalMint()", +"43463b98": "getconf()", +"43463c3a": "UnityToken(uint256)", +"4346aa58": "ITTM()", +"4346ea77": "PrimasToken()", +"43471101": "getSenderFunds(address)", +"434786f4": "getBalacne()", +"434847e0": "withDrawFees()", +"4349168e": "GenesisSalesPriceCount()", +"43496568": "timeLock(address)", +"434a55eb": "bonusFirstTwoDaysPeriod()", +"434afdfc": "totalObol()", +"434b1208": "rescueOrder(uint256)", +"434b14e7": "randomGen(uint256)", +"434b349c": "LCEToken()", +"434b635e": "getMaxBetAmount(uint256)", +"434c4498": "EthperPoe()", +"434cb64c": "startNextGeneration()", +"434d16f5": "rotate_left(uint32,uint32)", +"434d185c": "getKingdomOwner(string)", +"434df07e": "NewSerpent(uint256)", +"434e0618": "addMedicalProviderReply(address,string,string)", +"434e6a55": "addWebsite(address,string)", +"434ea7d3": "_lottery5(uint256,address,address)", +"434ec416": "EXT_COMPANY_STAKE_ONE()", +"434f5f27": "checked_in(address)", +"434f811b": "partIndexToApproved(uint256)", +"434fb2ae": "PRICE_MULTIPLIER_ICO3()", +"435010d8": "SrcToken()", +"43503fac": "getWord(uint256)", +"43509138": "div(int256,int256)", +"43516832": "getSuppliers()", +"43525d73": "MAX_FUNDING_SUPPLY()", +"435263ef": "ecosystemWallet()", +"4352e407": "RozetkaCoins()", +"4352fa9f": "setPrices(address[],uint256[])", +"4353401f": "NetkillerAdvancedTokenAirDrop(uint256,string,string,uint256)", +"43543242": "isSignatureOkay(address,bytes32,uint256[3])", +"4355644d": "addMonths(uint256,uint256)", +"43558826": "exchangequeue(address)", +"43559743": "edgePigment(uint8)", +"4355b9d2": "approveTransfer(address)", +"43562bd0": "NextRewardBonus()", +"4356f35b": "addIntermediary(address)", +"43574d9e": "owner2Of(uint256)", +"4357855e": "fulfill(bytes32,uint256)", +"43579fe8": "deleteShop()", +"4357b3de": "getCrowdsaleTier(address,bytes32,uint256)", +"4357da58": "pausePreSale()", +"4357e20f": "MinSlippageFactorSet(uint256,uint256,address)", +"4357e289": "Multiplexer(address,address[])", +"43581c80": "tdeFundsRaisedInWei()", +"4358630f": "Certificate(address,address,address,address,address)", +"4358c156": "isBonus()", +"43596b8b": "getLLV_edit_25()", +"435a0803": "testNowClock()", +"435a1220": "createERC20TokenNetwork(address,address)", +"435ad5c1": "getMixedStack(bytes32)", +"435adacc": "EtherrateUpd(uint256,uint256)", +"435ae547": "ResumeTokenAllOperation()", +"435afa54": "changeRepoSettings(uint256,uint8,uint8)", +"435bb6b9": "nextJackpotTime()", +"435c35b6": "startGeneralSale()", +"435ce40a": "isAccount(address,address)", +"435cebda": "createMember(address,address,bool,bool)", +"435cf753": "winCount(bytes32,address,address)", +"435dc3fb": "setGenesisAddress(address,address,uint256)", +"435e119e": "SetupRaffle(uint256)", +"435e33a5": "TokenRewardsAdded(address,uint256)", +"435f02f9": "ACIFToken()", +"435ffe94": "setHello(string)", +"4360617b": "Sell(bytes32,address,uint256,uint256,address,address)", +"4360f90f": "getOfferState(bytes)", +"436108ce": "changePasswd(bytes32,address,uint8,bytes32,bytes32)", +"4361443f": "getClaim(address,bytes32)", +"43614f8b": "endFinalStage1()", +"4361b3f9": "TokensCreated(address,uint256)", +"43620f24": "startWork(uint256,bytes32,bytes32)", +"43626c52": "AllInvestorsRefunded(uint256)", +"4362c088": "affiliateLevel()", +"4362c116": "transfert(address,uint256)", +"43634c39": "useSuperPowers()", +"436393ab": "AlrzshTest()", +"4363e888": "withdrawERC20Tokens(address,address,address,uint256)", +"43655fd3": "votesItem(address,uint8)", +"436577ae": "createIssuance(uint256,uint256,uint256,uint256,string,string,uint8,uint256)", +"4365e11e": "BingoLight()", +"43668efa": "ProposalAdd(uint256,address,string)", +"4366af55": "RTC(uint256,string,string)", +"43677ca7": "checkInternalBalance()", +"4367aa3c": "_isReserveUnlocked()", +"4368600c": "initDeposit()", +"436962b4": "_setTarget(address)", +"4369a2c2": "charityAmtToCharity(address)", +"4369c250": "rewardsFactor()", +"436a66e7": "length(string)", +"436a88c1": "DEV_FEE()", +"436b6158": "card2PowerConverter(uint256[])", +"436b8fa5": "Salman_nomaniTestCoin()", +"436d4ff5": "hash(string,address)", +"436d796c": "startPreIco(uint256)", +"436d8fd6": "setGameBanker(address)", +"436da5fe": "transferLog(uint256)", +"436e1e2e": "computeAirdrop(address)", +"436e388d": "enterWallet()", +"436ee4af": "SEEDS_TO_HATCH_1RICE()", +"436f64ac": "rInFp()", +"436fdc0e": "getBattleCardsInfo(uint256)", +"436fedc3": "getRegionUpdatedAt(uint256)", +"43700afe": "strConcat(string,string,string,string,string,string)", +"43703b0e": "getEventData(bytes)", +"437159de": "SYCPrivateEarlyPurchase()", +"4371c465": "isWeekEnd(uint256)", +"4371e46e": "blockCount(uint64)", +"43722993": "NPSTToken(address)", +"43722b09": "extOwner()", +"437257bd": "handlePointer(uint256,int256,uint256)", +"4372df99": "getNotaryForSeller(address)", +"4373f3b4": "setFunding(uint256,uint256,uint256,uint256,uint256,bool,uint256)", +"4374356b": "DRUGS_TO_PRODUCE_1KILO()", +"437583a9": "updateReserveToken()", +"4376890e": "egcToken()", +"437764df": "getBridgeMode()", +"43777117": "getMarketOptions()", +"4377cf65": "numberOfContributors()", +"4377d12c": "ChooseWHGReturnAddress(uint256)", +"437852b6": "getRefererAddress(bytes)", +"4378a6e3": "getAttributes(uint256)", +"437933cc": "setDataFeedHash(string)", +"437a8ae6": "multiple()", +"437b1a1d": "KITTY_BURN_LIMIT()", +"437c58a8": "YourtekToken()", +"437c9162": "pre_mined_supply()", +"437cfa4a": "setContractICOAddress(address)", +"437d07d5": "mktCoinCap()", +"437dbf49": "_isAuctionAble(uint256)", +"437f5b65": "isLUNVault()", +"437f6a4b": "userMakeOrder(address,address,uint256,uint256,address)", +"437fa667": "appAccountsLength()", +"4380ab6d": "clock(bytes32)", +"438195f9": "MAX_WHITELISTED_COUNT()", +"4381a07b": "setCustomDisputeFee(bytes32,uint256)", +"4381e1c5": "verificationAddressHoldersListNumberMap(address,uint256)", +"4383603b": "setAllowHalfLife(bool)", +"43846074": "getPreviousDarknodes(address,uint256)", +"43846fc8": "shortLock()", +"4384d53a": "BunnyCoin()", +"43859632": "hasVoted(uint256,address)", +"43863045": "addUintSetting(string,uint256,address,address,string)", +"438652e0": "addTransferWhiteList(address)", +"4386fe0d": "changeMinTokenSale(uint256)", +"43876776": "setPubKey(uint256,uint256)", +"4387d35a": "lockedWallet()", +"43886946": "getPlayerTeam(uint256)", +"43894ac3": "setMintMarketMakerApproval(address,address,address)", +"438af924": "buy(uint256,bool,uint256)", +"438b2aed": "setSettings(uint256,uint256,uint256)", +"438b7b99": "setProfitRatio(uint256)", +"438b9ff2": "payForUrl(address,string)", +"438c3585": "releaseTokensBlock()", +"438c3aff": "contractIds(uint256)", +"438c9068": "ownersProductCommissionInPerc()", +"438c9509": "test_invalidTokenFreeze()", +"438cd2d3": "UnPause()", +"438d1bd7": "storeBubbleSort(uint256[])", +"438d359e": "buyXname(bytes32)", +"438e1316": "next(uint80)", +"438e15fc": "contains(uint256,uint256)", +"438f1eee": "PowZoneToken()", +"4390921e": "distributeOne(address,uint256)", +"43909d76": "EthCannabis(address)", +"4390a4f8": "batchTransferToken(address,address,address,uint8,bytes32[])", +"439198af": "timeLeftToContestStart()", +"4392281e": "SCTX()", +"43923258": "addAddressToAccessControl(address,uint8)", +"43925cc3": "getRoomPlayers(uint256)", +"43927707": "NehalCoin()", +"43928cfd": "addClient(address)", +"439370b1": "depositEth()", +"4394aaad": "getNextAvailableReward(address,uint256)", +"4394cc96": "versionBase(bytes32,bytes32)", +"43951999": "getReportingWindowForForkEndTime()", +"4395dc06": "getTokenInfoTokenList()", +"43973140": "check_lock_period(address,address)", +"439766ce": "pauseContract()", +"43977911": "addFreezeList(address)", +"4398da85": "tokensPercentageForKeyHolder()", +"4398fbd6": "treeWater(uint256,uint256)", +"439abc5b": "getLockByIdx(address,address,uint32)", +"439b91c4": "addBlockeddUser(address)", +"439be05c": "getLoanFilledAmount(bytes32)", +"439d4265": "recordToTransfer(address,uint256,uint256)", +"439d7275": "issuerSymbol()", +"439e10e5": "createUniqueSpinner(string,address,uint256)", +"439e97c4": "alertCreators(uint256)", +"439f5ac2": "getEndTime()", +"439f7d3c": "getSponsor(uint32)", +"439fab91": "initialize(bytes)", +"43a085c2": "ProsperPresaleToken(address,string,string,uint256,uint8)", +"43a335d6": "CreditCarToken()", +"43a4344f": "calcNetworkFee(uint256)", +"43a44f1e": "bonusTimes(address)", +"43a468c8": "delegateBalanceOf(address)", +"43a47345": "floatHolder()", +"43a47ae2": "EthTermDeposits()", +"43a61a8e": "rootOwnerOf(uint256)", +"43a68f3a": "NegToken(uint256,string,uint8,string)", +"43a6e680": "DonationSentButNotDoubled(address,uint256)", +"43a77530": "serviceAgent()", +"43a78b50": "MyAddress()", +"43a7f749": "getInitialPriceOfToken(uint256)", +"43a8775a": "amountOfBagTypes()", +"43a886ea": "filterBrick(uint256,bytes32[],uint256,uint256,uint256)", +"43a88da6": "buyOpen()", +"43a8d9d5": "authorizeWithdrawal()", +"43a92f24": "getAvatarInfo(uint256)", +"43a98caf": "reinvest(bool)", +"43aa8784": "endedGameCount()", +"43ab599f": "EPSCoin()", +"43ab850b": "setDividends(uint32)", +"43abab26": "whitelist_addys(address[])", +"43acb067": "ChefICO()", +"43acd7bc": "Bailout()", +"43ae2695": "propertyToken()", +"43aefca0": "withdrawThetokens(address)", +"43af755a": "blockedDeadLine()", +"43b03d37": "i(address,address,uint256)", +"43b0e8df": "set(uint256,uint256,uint256)", +"43b114fd": "getMyCoins()", +"43b12e95": "BCEToken()", +"43b1938d": "getPhaseSale(uint256,uint256)", +"43b1c529": "getSig(string,bytes4)", +"43b25452": "createPortfolio(uint256)", +"43b3181c": "AIOS()", +"43b3769e": "checkStatus(address,uint256,string,address)", +"43b37dd3": "executionDailyLimit()", +"43b3aa46": "getTokenAmountOf(address)", +"43b50d8e": "evKickoff(address,uint256,uint256)", +"43b5126d": "getVendingPrice(uint256)", +"43b6c7d0": "setClaimedFlag(bool)", +"43b6caf3": "setMintPerBlock(uint256)", +"43b7d9c8": "ITToken()", +"43b7fd58": "RoomRoundAdd(uint8)", +"43b812ef": "r2VaultAddr()", +"43b89c62": "getTransactionAtIndex(address,uint256)", +"43b8aedf": "gimmeTendies(address,uint256)", +"43b978b3": "playerNames(address)", +"43ba2cf5": "transferPreSaleTokens(uint256,address)", +"43bb6a63": "getmemreqscount(uint256)", +"43bc1612": "artist()", +"43bc867e": "claimStupidFluffyPink(uint64)", +"43bcf52a": "bbdToken()", +"43bd262e": "injectAvatarService(address)", +"43bd6e6f": "changeColorYellow()", +"43bdaacb": "getPlayerInternalWallet()", +"43bddf40": "horses()", +"43bdfb72": "updatedTime()", +"43bf63e8": "priceInWeiEdition(uint256)", +"43bf6756": "getMixItemStore(bytes32)", +"43bf718e": "getHashOfTheProposalDocument()", +"43bf74ef": "setKYC(address,uint256,uint8,uint256)", +"43bff765": "tokensPerMicroEther()", +"43c09e77": "updateNote(uint64,uint16,bytes12,bytes)", +"43c0d38c": "getSlotId(address,uint256)", +"43c14b22": "revokeVote()", +"43c1598d": "maxProfitDivisor()", +"43c1f0ed": "timeBeforeJackpot()", +"43c238db": "POMCOIN()", +"43c273c7": "DevSupply_Released()", +"43c29522": "PUBLICSALE_USD_PER_MSENC()", +"43c33ac9": "submitShares(uint256,uint256)", +"43c35651": "completeCrowdSale()", +"43c3658e": "EmporeumToken()", +"43c37393": "solveTask(uint256,uint256)", +"43c569f4": "TotalWin()", +"43c5d889": "locationOf(bytes,uint256)", +"43c639e7": "ownerResetLockedShares()", +"43c6b1f2": "_transferAsset(address,address,uint256)", +"43c6d558": "SportsBet(string,uint256)", +"43c6e10d": "getAffiliateCommision()", +"43c6eff1": "submitClaim(uint256,uint256,uint256,uint256,bool)", +"43c8124d": "PoolAdvisors()", +"43c885ba": "inited()", +"43c8c30e": "removeModeratorship()", +"43c9a189": "allocate1ProjectToken()", +"43ca46dd": "_ownsToken(address,uint256)", +"43ca57bc": "getRetailerStatus(address)", +"43ca78a2": "getNotaryInfo(address)", +"43ca86c6": "nukeApps()", +"43ca9d26": "onNewCampaign(uint256,address,uint256)", +"43cade1c": "reStartPreIco()", +"43caf0dc": "distroyToken(address)", +"43cb0af7": "getBytesArrayLength(bytes32)", +"43cb2b03": "getCurrentTokenCost()", +"43cb3189": "ETHZToken()", +"43cbbce6": "icoRound2()", +"43cc113b": "holdersBonus(address)", +"43cd1638": "deposit3()", +"43cd2c40": "UpdateForecast(bytes32,bytes32,bytes32,bytes12)", +"43cd5ea1": "sendBussinessByOwner(address,uint256)", +"43cd9655": "XBTexToken()", +"43cdaad2": "modelId()", +"43cdc49e": "unlockTokens(address,uint64)", +"43ce179e": "issueOwnerMore(uint256)", +"43ce7422": "getMyEggs()", +"43cf5f0c": "PunaniSupply()", +"43cfbd65": "getCompanyName()", +"43cfd44c": "recover_unclaimed_bets()", +"43cffefe": "challenge(bytes32,string)", +"43d018a0": "whitelistMaxTok(address)", +"43d0ee54": "userRounds(address)", +"43d111ae": "binScan(uint256,address)", +"43d1498b": "setCoAuthor(address)", +"43d1be7b": "setPresalePhase()", +"43d24a5e": "addUpdater(address)", +"43d2b618": "_removeToken(address)", +"43d32e9c": "getSellPrice()", +"43d3a4c1": "getTotalVoters(uint256)", +"43d42780": "icoSoldTokens()", +"43d4759f": "HuuuumanStandardToken(uint256,string,uint8,string)", +"43d47f82": "ProjectFund()", +"43d4b78b": "stateIsWaitingReplay(uint256)", +"43d5773b": "SpaceCraftCore()", +"43d64976": "OwnershipDeleted(address,address)", +"43d6add1": "accessoryOnLeaderboards(uint64)", +"43d6cac5": "removeTokenMetadata(uint256)", +"43d6ec16": "LIFEFORM()", +"43d6fab6": "RegularContract()", +"43d726d6": "close()", +"43d77c7b": "platContract()", +"43d7bfcb": "mintBountyTokens(address[],uint256)", +"43d7cce6": "getToken(address,uint256)", +"43d84d49": "updateCrowdsaleInfo(string)", +"43d8b570": "isTeamVestingInitiated()", +"43d9e070": "sencSold()", +"43db053e": "withdrawDevShare()", +"43db24ad": "EthereumWings()", +"43db5324": "ownerSetCanMining(bool)", +"43db7821": "BINKEY()", +"43dbb2de": "MAX_ETH_FUND()", +"43dc3ab2": "register(address[])", +"43dc7233": "getTokenCreationRate()", +"43dcbc86": "hasNotaryBeenAdded(address)", +"43dd8b30": "updateWhitelistMapping(address[],address,bool)", +"43ddc1b0": "callETH(address)", +"43de34dc": "impl_cancelRedeem(address,uint256)", +"43de6f90": "createHero(string,uint16,uint16)", +"43de82f3": "revealVote(uint256,uint8,bytes32,bytes32,uint32,bytes32)", +"43deb064": "LemonSelfDrop()", +"43deb8e5": "START_SKO1_UNITS()", +"43ded8e3": "MyGlobeToken(uint256,string,string)", +"43defc10": "getVendorByAddress(address)", +"43defdac": "AudtStandardToken(uint256,string,uint8,string)", +"43e08ad1": "addHash(bytes32)", +"43e09695": "deactivatePass(bytes32)", +"43e0c65a": "allowToBurn(address)", +"43e0dfdd": "Leverage()", +"43e1b94f": "AnyName()", +"43e1eb82": "setSiftContractAddress(address)", +"43e204b3": "isTokenLock(address,address)", +"43e20f97": "getPoolbyGtype(int8)", +"43e271ad": "woodworksCities(uint256)", +"43e2e504": "GetBalance(address)", +"43e332c5": "Last_block_number_and_blockhash_used()", +"43e3e527": "Weko()", +"43e41c44": "Kotlind()", +"43e4cef1": "processPrivatePurchase(uint256,address)", +"43e57976": "EthMsig(address[])", +"43e6125d": "Badge(address)", +"43e6cc40": "issueTokens(uint256[])", +"43e6cc64": "StopToken()", +"43e72c5a": "totalPotHomeTeam()", +"43e74f46": "sendPrepaidEthTweet(uint256,string,string,string)", +"43e76a26": "SellerRequestedCancel(bytes32)", +"43e7aa1d": "commitPhaseLength()", +"43e91384": "setICOEndDate(uint256)", +"43e92866": "reservingPercentage()", +"43ea0313": "setRitualFee(uint256)", +"43ea8d7b": "newWithdraWallet(address)", +"43eb37e2": "initChargeJNT(address,string)", +"43eb5ac7": "getData_21()", +"43ec31e2": "TdToken(address)", +"43ec3f38": "toSliceB32(bytes32)", +"43ed2863": "StandardToken(string,string,uint8)", +"43edcb07": "_itransfer(address,address,uint256)", +"43ee67cf": "_transferFallback(address,uint256,bytes)", +"43f0179b": "takerFee()", +"43f29372": "redeemWinningTokens()", +"43f294a6": "setCrowdsaleStop()", +"43f3d27c": "setPrPercent(uint256)", +"43f415d0": "executeDecayFunction(uint256,int256,int256,uint256,uint256)", +"43f46a5c": "getPolicyState(uint256)", +"43f48fbd": "rates()", +"43f4cb4b": "GetCurrentTypeDuration(uint256)", +"43f58f9f": "createNetwork(string,uint256,uint256,uint256,uint256)", +"43f6c643": "purchaseRequest(uint256)", +"43f6c741": "HGToken()", +"43f70917": "create(address,address,address,address,address,address)", +"43f70f60": "dna5(uint256)", +"43f73a3d": "UpdateCurrency(uint256,string,string,string,string)", +"43f76b98": "generateLuckyNumbers(uint256)", +"43f8c639": "tickets100kprice()", +"43f97628": "EcosystemFund()", +"43f98345": "calculateAllReclaimedNow()", +"43f98a56": "tradingDate()", +"43f99e68": "refundExternalPurchase(address,uint256,uint256)", +"43fb86d2": "getGameLength()", +"43fce818": "createAngelCardSeries(uint8,uint256,uint64,uint8,uint16,uint64)", +"43fd377a": "ChannelNew(address,address,address,address,uint256,uint256,uint256)", +"43fd6b21": "revokeStackholderConfirmation(uint256)", +"43fe32fc": "activateProvider(address)", +"43fedd01": "setDisputeData(uint256[3])", +"44004cc1": "withdrawERC20(address,address,uint256)", +"44013585": "setPaymentTime(address,uint256)", +"44017cd6": "test_BondPostedButNoMajority()", +"44019db3": "testCreateWithParents()", +"4401a6e4": "safeSend(address)", +"4401c905": "INTREPID_PRICE_THRESHOLD()", +"4401ff5c": "sellShares(bytes,uint8,uint256,uint256)", +"440208c3": "right12(uint256)", +"440235c0": "changeTrade(address,address)", +"44030e71": "getIsBlockRevenueCalculated(uint256)", +"44036b6f": "setFeePercentTenths(uint256)", +"44036c41": "getTrustedTransferDestinationValue()", +"4403e2ab": "nextLotteryTTWTokenId3()", +"4403ee2b": "setIFS(address,uint256)", +"44048aa5": "getContributorUSD(address)", +"440574eb": "adminUpdatePayout(uint256,uint256,uint256,bool)", +"4405a339": "logReputationTokenBurned(address,address,uint256)", +"4406bc60": "guessHash(bytes)", +"4406face": "lock(string,string)", +"4406fbab": "NectarCrowdsale(uint256,uint256,uint256,address,address)", +"44074cc7": "MaxCoin()", +"4407a75d": "BasicCrowdsale(address,address,address,string,string,address,uint256,uint256)", +"440878c4": "store(bytes,address,uint256,uint8)", +"4408c38a": "HIKEN(uint256,string,uint8,string)", +"4408f3f9": "place_bet(uint8)", +"44090448": "to(bytes32,uint256)", +"440961c3": "adjustPointsDecayFactor(uint256)", +"44097d70": "costWei()", +"440991bd": "freezeDuration()", +"440a16c4": "SEC(uint256,string,string)", +"440a7a0c": "unblockFirstStake()", +"440a926a": "home(uint256)", +"440adb38": "BullsFundToken()", +"440d2437": "designatedReport()", +"440d2ad0": "PRICELESS()", +"440f19ba": "draw(bytes32,uint256)", +"440f807e": "loadMesa(bytes32,bytes32[],uint8[])", +"4410121f": "test_voteSpammingFor()", +"441156cf": "Plutaneum()", +"4411b8f8": "disputeFavor()", +"4411c36f": "avgTokenlossValue()", +"441230e4": "registerHandle(bytes32,bytes32,address)", +"4412e104": "getZombiesByOwner(address)", +"4413a688": "setPreallocations()", +"4414356b": "sale3Accepting()", +"44146c26": "setExpectedTimes(uint256,uint256)", +"441478c3": "prepareToRewardProcess()", +"4414a5c8": "totalLose()", +"4414d940": "napkinPrice()", +"4415516b": "getType(uint16)", +"4415a0bf": "preSaleDiscountPrice()", +"441628f1": "sendTokensToBountyWallet(address)", +"441666c5": "SimpleContract()", +"441691f2": "LexitToken()", +"44169752": "WALLET_ADDR()", +"4417bc66": "VESTED_TEAM_ADVISORS_SHARE()", +"4417f4db": "burnOWL(address,uint256)", +"44187d45": "HerdiusToken()", +"44188b72": "openPreICOPublic()", +"44191d9d": "TokensCreated(address,address,uint256)", +"44195fd2": "ApolloSeptemFinalized()", +"4419cd81": "isContractNodeOwner()", +"4419da33": "changeInvestorAddress(address,address)", +"4419f969": "QuaLed()", +"441a174c": "multiCallTightlyPacked(bytes32[],address)", +"441a2ee3": "Mangocoin()", +"441a3e70": "withdraw(uint256,uint256)", +"441b09d9": "allShares()", +"441b1b44": "getPartialValue(uint256,uint256,uint256)", +"441b4f01": "investContractDeposited()", +"441c3499": "getRefers()", +"441c77c0": "revealPeriodActive(uint256)", +"441d6a61": "timeWait()", +"441deede": "getSafeContract(address)", +"441e354c": "_checkoutCost()", +"441ea478": "GetLandId(uint256)", +"442085b2": "contributorCap(address)", +"4420e486": "register(address)", +"44210bbd": "claimPlotWithData(uint256,uint256,string,string,string,string)", +"44219b05": "getGamePlayingStatus()", +"442484ff": "ExtTokenPurchase(address,address,uint256)", +"44249f04": "tokensForCharity()", +"4425c0eb": "claimWhitelistPack(bool)", +"4425d66d": "backup_exchangeEthStb(uint256,uint256)", +"44261964": "claimFullPrize(address)", +"44268655": "addCroupier(address)", +"4426cdc9": "changeEtherContract(address)", +"44276733": "getRole(address)", +"442890d5": "getContractOwner()", +"4428b072": "getReply(bytes32,uint256,uint256)", +"44292e88": "setZRXToken(address)", +"442a494f": "NewRegistrar(address)", +"442b7ffb": "pow2(uint256)", +"442b8c79": "addYears(uint256,uint256)", +"442bc74f": "placeQuestion(uint256,uint8,uint256,string)", +"442cbcb3": "addParticipant(address,uint8)", +"442cf0ee": "sellTokensForLtc(string,address,uint256,uint256)", +"442d0927": "isSellPossible()", +"442d1759": "GIRLToken()", +"442d27dc": "getLoanTuple(uint256)", +"442d31ca": "ChefToken()", +"442dfae2": "mktSupply()", +"442e1079": "MIN_ICO_GOAL()", +"442e501d": "createDeposit(address,uint256)", +"442eb683": "YouthToken()", +"442edd03": "listItem(uint256,uint256,address)", +"442efdc1": "MigrateController(address)", +"442f52ab": "bilateralCancel(address,address,address,address,bytes32)", +"44304edf": "TGCTokenBase(uint256,string,string,uint8)", +"44314116": "totalRollsByUser()", +"44326354": "pauseITO()", +"4432ce5f": "setTradersProxyContract(address)", +"44337ea1": "addToBlacklist(address)", +"4433a440": "ADXSold()", +"44346e3b": "cancelOngoingTxByAdmin(bytes32)", +"44348a78": "referralIndex(uint256)", +"44350d5f": "neo()", +"4435947c": "CoinyMcCoinface(uint256,string,uint8,string)", +"4435f1c3": "SlashToken()", +"4437152a": "setPool(address)", +"44377ebb": "getTokenAmount(uint256,uint8)", +"4437e7a0": "FlogmallAirdropper(address,uint256)", +"4438744b": "unlockGrant()", +"44389678": "isAcceptedExportingAuthority(address)", +"4438c8ab": "ExchangeRate()", +"4438cf6f": "burnRestTokens()", +"4438d222": "userHasKYC(address)", +"4439ab32": "addRecordEntry(address)", +"4439defa": "getNonce(bytes32[])", +"443ace5b": "InitiateWhaleCard()", +"443af072": "percentToPresalersFromICO()", +"443afe2b": "bssTotalSuply()", +"443b22e6": "ActiveSalesPhase()", +"443bd56f": "getHandleOwner(bytes32)", +"443bdc43": "setStepOneRate(uint256)", +"443d4c9c": "sendPayout()", +"443d8967": "batchWithdraw(uint128[],address[],uint256[],uint128[])", +"443de10c": "getCurrentStaked(address)", +"443e1cf7": "isFightClockAuction()", +"443f19f4": "numberOfTokens(uint256,uint256)", +"443f41d5": "tokenDeposit(address,uint256)", +"443f45a4": "awardprize(uint256)", +"443f577e": "getTotalBalance(bytes4)", +"443f95dc": "allStart()", +"444115f6": "acceptOffer(uint256,string)", +"444195a3": "partnersFundAddress()", +"4441bbd9": "schemaRegistry()", +"44420311": "setInt(uint256)", +"444257a3": "_includes(string[3],string)", +"4442bf02": "closeArea(uint256)", +"444316e8": "MiniMeToken(address,uint256,string,uint8,string)", +"44431e52": "minOVC()", +"44440a59": "isDistributionReady()", +"44447f47": "lockTokenSupply()", +"4444c51f": "_recalculateTopQuestionsOnVote(uint256,uint256,uint256)", +"4444e3cd": "totalSupply(address,bytes32)", +"444581da": "createCloneToken(string,uint8,string,uint256,bool,address)", +"4445b569": "voteWeightOf(uint256,uint256)", +"4446bb11": "verify_signature(bytes32,uint8,bytes32,bytes32,address)", +"4446c98c": "foundersFundTimelock1Address()", +"4447e48c": "configureKeys(uint32,bytes32,bytes32,uint32,bool)", +"44482ab8": "w0keAFPresaleAddress()", +"4448604b": "testFailPreDistribute()", +"4448f5fb": "getEscapeRequestsCount(uint32)", +"4449307b": "addKycAddress(address,bool)", +"44495d7e": "migrateGold(string)", +"444b0c90": "bonusThirdWeekPeriod()", +"444b6048": "setMerchantDealsHistory(address)", +"444bb28d": "TownCrier()", +"444c3d9a": "isCompetitionActive()", +"444c8daf": "tipoCongelamento()", +"444cef88": "sentToken()", +"444d95b0": "proofs(bytes32)", +"444da733": "isRoundEnd()", +"444da951": "extractWei(uint256)", +"444dd6f3": "Elcoin()", +"444e8b43": "pubkeys1(uint256)", +"444e984b": "triggerAttack(uint32)", +"444fda82": "subYears(uint256,uint256)", +"44501404": "goldPrice()", +"445045cc": "_bid(uint256,uint256,address)", +"4451967c": "FOUNDATION_POOL_ADDR()", +"4451cfd9": "DeductFees(address,uint256)", +"4451d89f": "claimToken()", +"44525ace": "roundLatLng(uint8,int256)", +"445264db": "adventurePresale()", +"44536d27": "Create_AutoGame(uint256)", +"44539c72": "setManyWhitelist(address[],bool)", +"44540e57": "ownerBurnOccurred()", +"44554cef": "getRedbulls()", +"44558192": "FMT_Crowdsale()", +"44559f80": "start_token_time()", +"44566fe0": "HumanStandardToken()", +"4456eda2": "isOperator()", +"44578558": "addPlayerMapping(string,string,uint256,uint256,uint256)", +"4457ce5b": "CCH_LLV_303()", +"4457d5f0": "createProject(string,string,uint256,address)", +"44587e3e": "_setNumber(uint256)", +"4458ddca": "ChristCoin()", +"44598c11": "hasOfferingStarted()", +"445a7a23": "isOracleProxy()", +"445b8477": "transferAuditor(address)", +"445cb2df": "getVoting(bytes32)", +"445d1397": "maxTransfers()", +"445d1eff": "_getMyDividents(bool)", +"445d46e1": "onlyInvestor(address)", +"445d60d3": "placeBuyRequest(uint256,uint256,uint256)", +"445d688b": "COTTToken()", +"445d9936": "setTempHeroPower()", +"445df0ac": "last_completed_migration()", +"445df9d6": "getAllPrices()", +"445e4979": "_rejectCertificate(uint256,bool)", +"445f153a": "showBlockmaticsCertificate()", +"44602a7d": "testFallbackReturn()", +"44605ea0": "phase_1_remaining_tokens()", +"4460a2ca": "initializeVesting(address,uint256,uint256,uint8)", +"4460fb6d": "burn(address,bytes32,uint256)", +"4461550b": "devETHDestination()", +"44621145": "goodsOK(uint256)", +"446294ad": "multiAccessGetOwners()", +"446298e2": "Rubid()", +"446303f3": "preSaleCap()", +"4464aec7": "testTryGet()", +"4464c35e": "GNTAllocation(address)", +"4465e38c": "EligmaTokenContract()", +"4466862a": "randomtest()", +"44669e40": "purgeVoter(address,uint256)", +"44673b2d": "NextOwner()", +"44691f2b": "Dispute()", +"44691f7e": "hasStarted()", +"4469981f": "arrayInfoForDeposit(uint256)", +"446a45b7": "fun1()", +"446a7974": "Fokitol()", +"446b512e": "orderedTokens(address)", +"446bffba": "add(bytes32)", +"446c0955": "addWifi(string,string)", +"446d5aa4": "getAttributes(address)", +"446d750b": "setMonthly()", +"446da9c2": "xper()", +"446dba8f": "getBonus(uint256,address)", +"446dde9b": "MilestoneCashBackTime()", +"446e0b40": "onSubExecuted(uint256)", +"446e5079": "SendDividend(address,uint256,uint256)", +"446f608c": "EscrowEscalation(uint256,uint256,address)", +"446f6c1f": "sellStorj(uint256)", +"446fbcd1": "CredSign()", +"446fcf22": "refundPlayer(address)", +"44708f7d": "change_time_stamp_status(uint256,uint256,string)", +"4470da90": "register(bytes32,bytes32,address,bytes32,bytes32)", +"44710181": "parseChannelCompatible(bytes)", +"44720ed5": "TigerCash()", +"4472287e": "numDistributions()", +"4472d3bc": "getShopOwnerAllProductList(string)", +"447400bf": "mutate(uint256,uint256)", +"4474809f": "tournamentEndBlock()", +"4474e057": "ICOSwapRate()", +"44751760": "read(bytes,uint256)", +"44751e3c": "starCoinAddress()", +"447615df": "Whitelist(address,uint256)", +"44767548": "rectangle(uint256,uint256)", +"4476d23b": "destructor()", +"4476d66a": "mintedInBlock(uint256)", +"4476e9a9": "epcwallet(address)", +"44772899": "round6StartTime()", +"44773a6c": "sendToMultipleAccount(address[],uint256[])", +"4477c5da": "stopFunding()", +"44781a00": "notEqual(bool,bool,string)", +"447843cf": "approveChild(address,address)", +"447885f0": "get(bytes32,address,address)", +"4478fbb2": "chOwner(address,bool)", +"44795c13": "RecoverySha256(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"447a64c4": "usdContribution(address,uint256)", +"447cd682": "scheduleTransaction(address,uint256)", +"447d7a1d": "_toLower(string)", +"447e2dc6": "c(address,address)", +"447e52a0": "answerQuestion(uint256,string)", +"447e6967": "endPublicSaleStage()", +"447ee48f": "maxUserCreatedPerformance()", +"447fa561": "CAST()", +"447fa8b7": "setDex(address)", +"447fbbe3": "manualSendEther(address,address,uint256)", +"447ffa91": "MineCooldown(uint256)", +"44804664": "OriginSportToken(address)", +"44816e2d": "readhistoricalrounds()", +"4481a486": "transferECOMTokenToContract(uint256)", +"448246c3": "updateReferralMasks(uint256)", +"44830788": "estimateTokensWithActualPayment(uint256)", +"44831edf": "developmentTeamTokensMinted()", +"44834aca": "buyerAddress()", +"44845c28": "MediaCash()", +"4484780b": "checkRecentInvestment(address)", +"4484a2a6": "forceBuyback(address,uint256)", +"4484d92b": "getTotalCommission(uint32)", +"4485cece": "EndTimeChanged(uint256)", +"4485d32c": "storePortfolio(uint256,uint256[],uint256[],uint256[])", +"4486598e": "zeeshanabbc()", +"44866955": "champion()", +"448735e7": "BTN4()", +"4487b392": "removeVerified(address)", +"448883d7": "claimTax()", +"4488ca9b": "hasApproval(address,address)", +"4488cc43": "_addExcluded(address)", +"44890014": "setFxBpsRate(string,uint256,string)", +"4489b2ec": "getABaddressByIndex(uint256)", +"448a064f": "YunMint(address)", +"448a0ceb": "setRoughSupply(uint256)", +"448a5e11": "mintForDisputeCrowdsourcer(int256,uint256)", +"448a5f0b": "getTestimonialCount()", +"448a627c": "SetConfirmRound(bytes32,uint8,bool)", +"448a9915": "oneBillion()", +"448b1f29": "tokensForTrivial()", +"448c0341": "FXRATE()", +"448c6656": "nodePhases()", +"448d76a3": "grantReserveSupply()", +"448d8910": "solve(int8)", +"448f1ec1": "tranferPresaleTokens(address,uint256)", +"448f30a3": "nothing()", +"448f8c86": "Acentiex()", +"44909c99": "Doftcoin()", +"4490efe3": "EthernetCashWebsite()", +"449106ac": "stageCap()", +"4491fe8f": "onlyPay()", +"44938e94": "checkPartner(address,address)", +"4493b8a4": "addrDevTeam()", +"4493ff1c": "vestedBalanceOf(address,address)", +"44947b9d": "getOutcomeOfSecondPeriodByEntity(uint256)", +"4494fd9f": "getGame()", +"4495147b": "RtcCoin(uint256)", +"4495bbf7": "DOXYCOIN()", +"44964dcb": "theList()", +"4496a7ea": "_getCurrentRoundInfo()", +"4497ce22": "getLicenseReimbursement(address)", +"4498acba": "provenAddress(address,bool)", +"44997a58": "MinusToken()", +"4499af81": "setChainLedger(address)", +"4499e043": "UNSOLD_ALLOCATION_EXPONENT()", +"449a058d": "getParentsLength()", +"449a09a4": "interfaceAddr(address,string)", +"449a52f8": "mintTo(address,uint256)", +"449c198d": "setSealed()", +"449c7ad3": "withdrawHouseCutFromGame(uint256)", +"449d0eb1": "checkAccountSchedule(address)", +"449d0f29": "disavowCrowdsourcers()", +"449d1ba4": "fundBountyAndTeam()", +"449d2712": "LEF()", +"449daa9a": "setCostPerEnergy(uint256)", +"449de356": "isIncluded(uint256)", +"449e815d": "getPrice(address,uint256)", +"449ed7e0": "callback(bytes32,string)", +"44a040f5": "getRewardAmount(address)", +"44a08b36": "checkAccess(string,address)", +"44a0d68a": "setCost(uint256)", +"44a17516": "Configurable()", +"44a2542a": "initiateRefund(bytes32)", +"44a2d0d2": "contributorsKeys(uint256)", +"44a3982d": "getTokenPriceForPeriod(uint256)", +"44a3bb82": "getGameIndex()", +"44a5450f": "PRESALE_WALLET()", +"44a5b69c": "Reederem(uint256)", +"44a60878": "DCXToken(string,string,uint256,string)", +"44a6a8f0": "getDonationLength()", +"44a71bc6": "fundingMaxCapInWei()", +"44a7a992": "ParametersChanged(uint256,uint256,uint256)", +"44a7f501": "getOwnersGeneration()", +"44a926f9": "assigned_shares()", +"44a9ff76": "getLastHatchPrice(address)", +"44aa1826": "_minChild(uint256)", +"44aa470a": "addressVerified(address,string)", +"44aa5782": "LagToken()", +"44aa768f": "getLLV_edit_26()", +"44aa8b0e": "createAgreement(string,string,uint8,uint256,uint256,uint256,address,address,uint256)", +"44ab1c2f": "calcHouseEdge(uint256)", +"44ab6970": "redeemBool()", +"44ab6efa": "comB_()", +"44ab7e6f": "setParamsUnOrdered(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"44abc212": "adminWithdrawEIP777(address,uint256,address,address,bool,uint256,uint8,bytes32,bytes32,uint256)", +"44abd790": "makePlant(uint256,uint256)", +"44ac423a": "Collect(uint256,uint256)", +"44ac9d81": "resumePreSale()", +"44acb8da": "crowdsaleTokenSupply()", +"44ace7c3": "Tribe(address,string,string,address)", +"44ad5535": "ProofOfContractSnipers()", +"44ae0567": "advisorsReleased()", +"44ae2c03": "getAppNickname()", +"44ae58f6": "Bittrees(uint256,string,string)", +"44af11a3": "startBuyBackOne()", +"44af18c2": "goolaTeamAddress()", +"44af1f4b": "replaceOfficials(address[])", +"44af24d6": "getCurrentPercentage(address)", +"44af946f": "calculateEndTime()", +"44afda9c": "_isValidBaseLayersOnly(uint256[],uint256)", +"44b0245d": "addPurchased(uint256,uint256,uint256)", +"44b07838": "setPaidPackage(uint256,uint256,uint256,uint256)", +"44b07a3e": "newProposal(uint256,string,bytes32)", +"44b11f26": "Registry(bytes32,uint16)", +"44b1231f": "vestedAmount()", +"44b1d6e3": "DEXLITE()", +"44b1e09d": "checkTargetReached()", +"44b1e61a": "isFirstInit()", +"44b20e7a": "drawNum_()", +"44b28d59": "enableMint()", +"44b2a172": "cards_metal(uint256)", +"44b49958": "presaleEtherRaised()", +"44b4d279": "payoutDividends()", +"44b55187": "DollarToken()", +"44b55c3a": "setParking(uint32)", +"44b70d79": "LiquidityNetwork()", +"44b76b9e": "ICOTimer()", +"44b77680": "init(address,address,uint256[])", +"44b786a1": "setRate_BTCUSD(uint256)", +"44b7a3b7": "_createScrapPartAuction(uint256)", +"44b8074c": "changeTotalAmount()", +"44b81854": "STSTEST1()", +"44b81a77": "BitcoinToken()", +"44b88a6d": "scannedBronzeCaps()", +"44b8ccda": "EthLongExercised(address[2],uint256[8],uint256)", +"44b9cab5": "roundBlockCount_()", +"44b9efb2": "setInputData(uint256,uint256,uint256)", +"44ba16a2": "COLOR_PINK()", +"44bb3b2f": "stopBlock()", +"44bb60cf": "sigDestinationApprove()", +"44bc3e27": "BetWEA(address,uint256)", +"44bd7186": "GestiToken()", +"44bd7b71": "setBountyPercent(uint256)", +"44bec848": "thirdRoundPercent()", +"44bee639": "distributeSupply(address,uint256)", +"44bfa56e": "getBytesValue(bytes32)", +"44c010c6": "_getReferralBonus(uint256)", +"44c040a6": "MyAdvancedToken(uint256,string,string,address)", +"44c11fe4": "currentTransferableTokens(address)", +"44c18aa7": "setPayout(uint256)", +"44c20957": "setPhase(uint8,uint256,uint256,uint256)", +"44c20e6f": "retrieveExcessEther()", +"44c2dd52": "RDPMoney()", +"44c2dd71": "HSCToken(uint256,string,string,address)", +"44c3cb29": "validPlayer(uint256,address)", +"44c3cc68": "BasePoll(address,address,uint256,uint256,bool)", +"44c47561": "whiteListed()", +"44c4bf10": "setBlacklist(bool)", +"44c4dc31": "totalContributedAmount()", +"44c4dcc1": "purchasedAmount(address)", +"44c526c1": "devRewardClaimed()", +"44c55801": "setVaribles(string,string,uint256)", +"44c5bbf8": "updateStatus(address,uint8)", +"44c5e758": "getCustomerPolicyCount(address)", +"44c63eec": "vesting()", +"44c71ef2": "changeSaleSettings(address,address,uint256,uint256,uint256)", +"44c73459": "weiPerBlock()", +"44c7d6ef": "claimStake(uint256)", +"44c9716a": "BVA()", +"44c9af28": "getState(uint256)", +"44c9e83d": "purchaseAuthorizer()", +"44ca361f": "Log1(string,uint256)", +"44caa8d6": "isArrAccountIsFrozen(address)", +"44cb1c33": "lastTokens(address)", +"44cc129e": "count_bytes(uint256)", +"44cc5f7e": "m_externalMintingEnabled()", +"44cc7f5e": "validWithdrawToken(address,address,uint256)", +"44ccbed0": "getAssetCollectedOreBallances(uint256)", +"44cef69b": "CreateTokenToOperation(address,uint256)", +"44cf262a": "addressChangeBlock(address)", +"44cff104": "setMarketManagerAddress(address,address)", +"44d02c2a": "infoICO()", +"44d03ac6": "BlockhashFetch(address)", +"44d0afbc": "signingLogic()", +"44d15446": "setDevelopmentAuditPromotionTokensPercent(uint256)", +"44d19d2b": "reservedSupply()", +"44d1a074": "marketsubscribers()", +"44d1a9ae": "setCardDrawPrice(uint256)", +"44d1ef3b": "setTCRHelper(address)", +"44d345f9": "UnclaimedRewardTransfer(uint256,uint256)", +"44d4fd19": "Now()", +"44d60e67": "TransferAssets(address,uint256,address)", +"44d6d259": "AdminAdded(address)", +"44d75fa9": "updateMinorTree(bytes32)", +"44d7e4ed": "stopIssuing()", +"44d9bc5f": "gameEndTime()", +"44daf94a": "showEthBalance()", +"44dbb571": "SALE_START_TIME()", +"44dbc282": "processCallback(bool,address,address,uint256)", +"44dc028d": "lockedtokensOf(address)", +"44dc4dec": "registerForRace(uint256)", +"44dd4b3b": "lookupGeneration(uint256)", +"44dd4b5e": "scheduleTransaction(address,uint256,bytes)", +"44dedf4d": "returnFundsForUsers(address[])", +"44defdfd": "paidInstallments()", +"44df8e70": "burn()", +"44dfdce0": "getNameOwner(bytes)", +"44e02dbc": "returnCollateral(uint256)", +"44e14e59": "lockReferralTokens(uint256,address,uint256)", +"44e191fa": "increaseApproveAndCall(address,uint256,bytes)", +"44e2024f": "createNewFreelanceContract(string)", +"44e20fd2": "EasyPocketCoin(uint256,string,uint8,string)", +"44e2651c": "whiteListOf(address)", +"44e2adeb": "claimedFlag()", +"44e2cc24": "JackpotTimer()", +"44e2f9ad": "buyerInfoOf(address)", +"44e43cb8": "depositRevenue()", +"44e44e0d": "Profeee()", +"44e4c366": "rmTrusted(address)", +"44e4d226": "alreadyVoted(string)", +"44e52420": "TRADERSCOIN()", +"44e5d154": "GenesisGlobalTestToken()", +"44e63717": "LaboToken()", +"44e66ee2": "updateMeterValue(uint256,uint8,uint256)", +"44e780b7": "PrepareRollEvent(address,uint256,uint256,uint256)", +"44e78d93": "wipeDAI(uint256,uint256)", +"44e796de": "doubleBonusArray(address[])", +"44e7faa4": "limitedWalletsManager()", +"44e86b2f": "left71(uint256)", +"44e880c1": "gasAfter_()", +"44ea1c71": "addNFBTNY(address,uint256)", +"44ea4a7c": "TokenCreated(uint8,uint8)", +"44ea54fe": "changeSoundcoinsContract(address)", +"44ec1a0d": "getContestStatusForDateAdmin(uint32)", +"44ec2c03": "addTransaction(uint256,uint256,uint256,uint16,bytes32,uint256)", +"44eccf16": "PSTBCoin()", +"44ed9039": "FLTTToken()", +"44edf6b2": "preIcoEndDate()", +"44ee398b": "secondThawDate()", +"44ee3a1c": "extendLock(uint256)", +"44eef96c": "sellShip(uint32,uint256,uint256,uint256)", +"44ef231b": "argumentCount()", +"44f04404": "forging(uint256,uint256)", +"44f06bc7": "getChampStats(uint256)", +"44f09d2a": "createDungeon(uint256,uint256,address)", +"44f0a4a8": "tdeStartTime()", +"44f0c3ce": "totalLost(address)", +"44f11e7e": "tokenBoughtPerTime(uint256)", +"44f1bbad": "giftRatioOf(address)", +"44f1beed": "Marble()", +"44f1ee5b": "Proof(address)", +"44f2428a": "adjustL(uint256)", +"44f252a0": "confiscate(address)", +"44f26d89": "forceUnstake(address)", +"44f27e30": "getAuctionData(uint256)", +"44f34576": "setTokensBought(uint256)", +"44f38756": "icoState()", +"44f396fa": "startStage2()", +"44f39803": "setBubbled(address)", +"44f5e447": "operatorFeeAcct()", +"44f6d70c": "giftOwnerByIndex(address,uint256)", +"44f7335b": "_verifyAvailability(uint256)", +"44f75cbd": "isAffiliate()", +"44f7636c": "publicOfferingWallet()", +"44f7787f": "ln(uint256,uint256)", +"44f7d03d": "valueOf(uint8,bool)", +"44f84579": "JP_winner()", +"44f96b36": "getRemainingPartnerTokensAllocation()", +"44f96bc6": "matured_timestamp()", +"44f977de": "setStore(string,address,uint256)", +"44f9ac5c": "getPendingWithdrawals(uint256)", +"44f9d060": "_getMinimum(bytes32)", +"44fa961d": "deleteLawyer(address)", +"44fa9ca6": "oracleIsUpdating()", +"44faa139": "Withdraw(uint32)", +"44fb5a1a": "Category(string)", +"44fbaf08": "bountyAmountLeft()", +"44fbc1ef": "Dollar()", +"44fbd125": "increasToken(uint256)", +"44fbe5f5": "NewBiggestDick(string,string,uint256)", +"44fc2a9b": "NOLLYCOINCrowdFund()", +"44fc364c": "setMarket3(address)", +"44fc709e": "set_property_facility(uint256,bool,bool,string)", +"44fc83dd": "LogTokenReward(address,uint256)", +"44fc9361": "maximumInvestmentInWei()", +"44fcbd79": "getLocksForAddress(address,uint256)", +"44fd1557": "ERC20Token(string)", +"44fd584d": "cancelLeaseOffer(uint8)", +"44fdbf5b": "releaseAllTokens()", +"44fddeb7": "BLOCKAPPS()", +"44fe2eb0": "totalPaidDividends()", +"44fe7cd5": "Eliminated(address)", +"44ff5a3e": "CWC_Address()", +"44fff35c": "openCrowdfund()", +"4500054f": "isCancellable()", +"45004310": "signUpUser(string)", +"4500e64f": "showLockValues(address,address)", +"4504169a": "_createFlower(uint256,uint256,uint256,uint256,address)", +"45044611": "TimeCapsule()", +"45048ced": "Presale(uint256,uint256,uint256,uint256,address)", +"450531e7": "aidPoolTokens()", +"4505d53f": "unclaimedPoolsPresent()", +"45061bf8": "tsc()", +"4506e64d": "putOn(uint256,uint256)", +"45078531": "PRESALE_LEVEL_5()", +"4507a545": "shouldBeTrusted(address,address)", +"4507fccf": "addDeal(uint256,bytes32,bytes32,uint256,bytes32,bytes32)", +"45083f73": "appendTranch(uint256,uint256)", +"4509052f": "scannedCaps()", +"4509fd81": "partnersPercent()", +"450a03dd": "getKunsNum()", +"450a9105": "setYctContractAddress(address)", +"450b6079": "RetRisk(uint128)", +"450c4b7b": "LogTokensBought(address,uint256,uint256,uint256,uint256)", +"450c99d3": "etherRealID(address,address,string,string,bool)", +"450cabcb": "publicGetExchangeRate()", +"450d94ef": "TransactionConfirmedAfterEscalation(uint256)", +"450db8da": "ContractUpgrade(address)", +"450dccf6": "cancelOrderWithMerchantByAdmin(string,address)", +"450e2ed3": "startNextCycle()", +"450eefae": "execute(address,uint256,string)", +"450efe21": "getTokens(address)", +"45102ca7": "generateCarId(uint256)", +"451048e2": "isALCDistributed()", +"45104b16": "EXECUTION_GAS_OVERHEAD()", +"45115a17": "PUBG()", +"4511cc7d": "Transfer_nodata_enabled()", +"45126711": "createRandomNumber(string)", +"4512b39b": "sendAndFreeze(address,uint256,uint64)", +"4513a44e": "Saturn()", +"4513a7f4": "IsTransferTempFromOldContractDone()", +"451450ec": "upgrade(uint256,uint256)", +"45145281": "CurrencyFactory(address,address)", +"451512ed": "forceDispute(uint256)", +"451515db": "addProduct(uint256,uint256,bytes32,address)", +"45152b14": "makeUnicTaskHashId(address)", +"45164b3e": "TRANSFER_PROXY_VEFX()", +"451659d9": "exchange(uint256,bytes8,bytes8)", +"45166351": "FRB()", +"4516b707": "DCOIN()", +"45176f8d": "CloutToken(uint256,address)", +"4517a273": "releasePremine()", +"4517bd42": "RetractRoutingDR(bytes32,bytes32,uint256,bytes)", +"4518982c": "firstBonusTokensLimit()", +"45190584": "remainPantry()", +"45196535": "calculateOrderHash(address[],uint256[],uint8,uint8)", +"45199e0a": "getPendingList()", +"4519a069": "toUint32(bytes,bytes,uint256)", +"4519c454": "tokenFallbackExpanded(address,uint256,bytes,address)", +"4519ef8e": "getMinutes(address,address)", +"451a308f": "buyProperty()", +"451b5f47": "preMaxContribution()", +"451bd752": "currentUniqueSpinnerPrice()", +"451bedb3": "getSettingsChangeConfirmationCount(uint256)", +"451beefc": "addressToSplittersCreated(address,uint256)", +"451c3d80": "acceptedToken()", +"451cd22d": "clnAddress()", +"451d65d3": "Debug(uint256,address,string)", +"451df00f": "SongTokenRemoved(address,bool)", +"451e3ec5": "_createName(bytes32,address)", +"451e422e": "windowPeriod()", +"451f0601": "advisersPartners()", +"451f7763": "admin_set_payable(bool)", +"451febcc": "equal(bytes32[],bytes32[],string)", +"452030c4": "end_PRIVATESALE()", +"4520d416": "getReserveminted()", +"45232370": "fechVoteMainInfo()", +"45239b90": "setBeneficiary()", +"4523be0d": "Daily()", +"45243120": "setFiatContractAddress(address)", +"4524c0cd": "defineReleases(uint256[],uint256[],uint256[])", +"4524c70b": "addEmployee(address,bytes32,bytes32,uint256,uint256)", +"4525f804": "constructor(address,address)", +"45261106": "maxBetsPerBlock()", +"4526196e": "addressB()", +"45262b05": "setDefaultExecuteTime(uint256)", +"45266d7e": "BrandAdded(address,address,string,bool)", +"452757f6": "changeContainer(address)", +"452766a5": "EGGS_TO_HATCH_1Cat()", +"45278394": "updateDemurrageReporter()", +"45279c81": "effectiveMaxBet()", +"4527b4b6": "HGUATToken()", +"4528f3ec": "lastPurchase()", +"45293f0e": "Luckybuy()", +"4529cae7": "getTotalPlayers()", +"4529cd71": "SOFT_CAP_IN_ETHER()", +"4529cd8a": "AdvertisementStorage()", +"452a33f0": "grantTrophy(address,bytes32)", +"452a344f": "MintStarted()", +"452ae331": "attack(address,uint256,uint256)", +"452af6c6": "ForegroundPaymentResult(bool,uint256,address,uint256)", +"452b7757": "AirDropPayBitsR3(address[])", +"452ccadb": "changeBountyFulfillmentAmount(uint256,uint256)", +"452d3c59": "transferPreSignedPayloadHash(address,address,uint256,uint256,uint256)", +"452d44dc": "checkBothNotNull()", +"452ddecc": "startBallot()", +"452e0d25": "sURL()", +"452e880b": "readArticle(string)", +"452e9802": "getDetails(address,address)", +"452e9acb": "setMsgHash(bytes32)", +"452fa483": "TOXToken()", +"452fbc41": "USN(address,address,bytes,uint256,uint256,uint128)", +"45301024": "ownerDispute(uint256,uint256,uint256)", +"4530a6c6": "getWishTribute(uint256)", +"4531aaa3": "EverydayTokenStandardToken(uint256,string,uint8,string)", +"45327fef": "calcSharePriceAndAllocateFees()", +"45334894": "setTeleportPrice(uint256)", +"4533f779": "determineWinnerOdd(string)", +"45350759": "addTier(uint256,uint256)", +"45350b6b": "readFromStorageView()", +"45362978": "query1(string,string)", +"4536be70": "periodITO_hardCapInWei()", +"4537544c": "makeAccountIterable(address)", +"4537b7de": "developingFund()", +"45385448": "BEERS()", +"45387d2c": "_getTournamentSupportAmount(uint256)", +"4538b7ec": "CallExecuted(address,uint256,uint256,uint256,bool)", +"453920cb": "changeTokenName(string,string)", +"45395b03": "tokensIssuedOwner()", +"4539bf18": "date01Feb2019()", +"453a6e0d": "getAmountConverted()", +"453aa450": "vote_proposed_address(string,string)", +"453b7eab": "totalControlledBalance()", +"453c2310": "maxPerWallet()", +"453ca7ee": "RewAddr()", +"453cbb11": "canConvertTokens()", +"453cddaf": "performPhase()", +"453dc243": "setWoodAddress(address)", +"453dd97f": "getDevWallet()", +"453dfcae": "payExtraTokens(uint256)", +"453e5a2c": "registerMarket(bytes32,address,address)", +"453e6fa0": "schedulableAmount()", +"453eca78": "getRealmNum()", +"453fe8cb": "calcUnMaskedEarnings(address)", +"453fef69": "setPrepaid(address,uint256,uint256,string,uint256)", +"454052ea": "relent()", +"45406101": "TTCToken(address)", +"45408a8a": "minCashout()", +"4540a396": "importBalancesOf(address[])", +"45411c8d": "checkAllowedTier(address,address,uint8)", +"45414df1": "b2s(bytes)", +"4541c39c": "to_end_ico()", +"4541e154": "sumICOStage4()", +"45421d9b": "reembolsar(uint256,uint256)", +"45426082": "countdownDecrement()", +"454274f9": "BroFistCoin(uint256,uint256)", +"4543754f": "totalUserStakes(address)", +"4543f79e": "withdrawERC20ToOwner(address)", +"454431c1": "RangeGameWithITG(address,uint256)", +"454481dd": "nextLotteryTTMTokenId4()", +"45448a28": "approveAddOwnerRequest()", +"4544ad22": "allByAuthor(address,uint256)", +"4544c48c": "distributeWinnings(uint256)", +"454584e6": "_setProviderInvitedUser(uint256,address,bool)", +"45458643": "setPI_edit_16(string)", +"45461e78": "MToken()", +"4546ad06": "sendProposal(string)", +"4548821c": "ExBatallionCoin()", +"45488ac1": "buyStake()", +"45493057": "validateClaimTokens(address)", +"454a2266": "dhopakexchange(address,address,address,uint256,uint256,uint256)", +"454a2958": "foundersTokenTimelock()", +"454a2ab3": "bid(uint256)", +"454aa6cf": "getPhoenix(uint256)", +"454b0172": "Created(address,address,address)", +"454b0608": "migrate(uint256)", +"454bccd0": "mininumContributeWei()", +"454bf426": "sysFeePermillage()", +"454c57ee": "getStockBuyOrderPrices(uint256)", +"454c5d34": "allocateBalance(uint256,address)", +"454c87b3": "matured()", +"454ca9fd": "get_my_tokens()", +"454ccc2f": "totalAngels()", +"454d3e24": "investorsBalance()", +"454d9bb4": "MerkleMine(address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256)", +"454dd6d2": "GetMinimumBet_Ether()", +"454dfaaf": "claimSale()", +"454f7b8f": "totalPayout()", +"455052b9": "getInstanceMetadata(uint256)", +"4550fa72": "isConsensusObtained(uint256)", +"4551b1d7": "ProxyPayment(address,address)", +"4551dd59": "isCrowdsale()", +"455259cb": "getGasPrice()", +"45528aa8": "addItemToInternal(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"4553c343": "getEarningMetrics(address,bytes32)", +"4553fd4d": "token_ratio2()", +"455501d3": "Submission(address,uint8[])", +"45550a51": "recoverAddressFromSignature(bytes32,bytes)", +"455530a6": "TestRandomNumber()", +"45556969": "DealerSocketCoin()", +"4555d5c9": "proxyType()", +"4555db10": "tokenRecovery(address,address,uint256)", +"4556611e": "weiToShare(uint256)", +"45576f94": "createToken(string)", +"455770a4": "setIcoPhase1(uint256,uint256)", +"455778ed": "advisorsTokensSecondReleaseTime()", +"45579b1f": "transferShares(uint256,address)", +"4557a579": "addWeapon(uint256,string,string,string,address)", +"4557b4bb": "init(uint256,address,address)", +"4557c70d": "CrowdWallet(address,address,uint256)", +"45585afe": "manageInvitations(uint256,address[],address[])", +"4558850c": "apps(bytes32,bytes32)", +"4558d717": "changePaymentToken(address)", +"45590ec8": "addTag(uint256,string)", +"45596e2e": "setFeeRate(uint256)", +"45598b4a": "cancelCampaign(uint256)", +"45599136": "tokenFee()", +"4559b2e8": "holderAdvisorsTokens()", +"455a2a37": "MyAdvancedToken(uint256,string,uint8,string)", +"455a380d": "getTotalAmoutStageAddress(address)", +"455b33ab": "gambler2()", +"455bf142": "refundeesListLength()", +"455c06e4": "mintTokens(address,int256,uint256)", +"455c7050": "EscrowManager()", +"455ca9bd": "refundTokens(address)", +"455d4077": "_startLockup()", +"455d86b8": "revenueShareOwnerAddress()", +"455dc46d": "nextMinimumEpochInterval()", +"455df579": "left84(uint256)", +"455ea98c": "getInUse(bytes32)", +"455eb777": "canStake(address,uint256,uint256,bytes8,uint256,string,string,string,string,uint256,uint256)", +"455ef8f9": "coinsCount()", +"455f1725": "getTotalAmountOfBlocks()", +"455f6f31": "totalTokensBurnt()", +"455fd623": "totalWithdraw()", +"455fea46": "getTankDetails(uint32)", +"455ff9a4": "lastBlock_v16Hash_uint256()", +"456176eb": "PCDStartTime()", +"45622c31": "setContractAllowance(address,uint256)", +"45624260": "getNumPositionOperation(string,address,string)", +"45626ecb": "removeStages()", +"45629402": "changeDefaultWithdraw(address,address)", +"45639e37": "distributeEtherToAllShareholders(uint256)", +"4563b743": "getPAAttributes(uint32)", +"4563f30a": "transfersPaused()", +"45644fd6": "removeOracles(address[])", +"45645572": "presale(address,uint256,uint256)", +"4564ea36": "forceVoidExternal()", +"45653a6d": "creater()", +"45656757": "p1_start()", +"45668923": "Aikcoin()", +"45668f2b": "ORACLIZE_GAS()", +"45669c8d": "protectedTransferToMint(uint256,bytes32)", +"4567a6a7": "getXCPlugin()", +"4567c5f7": "buySharePriv(uint256)", +"45680e09": "createPixels(uint256)", +"4568fb50": "finishRoundAndStartNew()", +"4569db8a": "getCustomerTxAmountKWh(address,bytes32)", +"456a09c8": "withdraw(uint256[],uint256[],address)", +"456c2892": "finalizeLottery()", +"456c64e0": "getGamesOdds(uint256[])", +"456c8cac": "saleStopped()", +"456cb7c6": "authorized()", +"456cbafc": "AddressWarsBeta()", +"456cee82": "setAmountPerEther(uint256)", +"456f3c3b": "internalIcoFinished(uint256)", +"456fe579": "notate(address,uint256,uint256,uint256[])", +"4570160e": "MotionToken()", +"45705906": "isLeading4FF(address)", +"45705d93": "BwinToken()", +"457094cc": "fire()", +"45710074": "sell()", +"45714c7b": "TOKEN_CLAIM_WAITING_PERIOD()", +"4571a7f1": "maxStage()", +"4571d4c4": "FutureCall(address,uint256,uint16,address,bytes,bytes,uint256,uint256,uint256)", +"45734d2b": "sizeOfInt(uint16)", +"45737b1e": "changeEndDate(uint256)", +"457391e5": "createGame(bytes32)", +"4573a421": "ico4Sold()", +"4574dea5": "setBreedingFee(uint256)", +"45751137": "newDeposit(address,uint256,uint256)", +"457556c2": "getUBetChecks()", +"45755dd6": "returnFunds(uint256)", +"457610e5": "cancelTransaction(bytes32,string,bytes32,bytes32,uint256,uint256,uint256,uint256,uint256)", +"4576a635": "setCategoryCap(uint256,uint256)", +"45773e4e": "sayHelloWorld()", +"457750a4": "marketIncentivesAllocation()", +"457770d8": "PreICO(address,address,uint256,uint256)", +"4577942c": "lastTransactionTime()", +"45787fed": "WolframExchangeTimes()", +"45788ce2": "prev(address)", +"4579268a": "getOffer(uint256)", +"45798593": "Certification(string,string,string,string,string,string,string)", +"4579c805": "createDistritoVerify(uint256)", +"457a21bc": "GullitCoin()", +"457a893f": "upPlayer(address,bytes32,uint256,uint256,uint256,uint256)", +"457b4e1b": "_setMoreDetails(uint256,uint256,uint256,uint256,uint256,address)", +"457bb613": "initializeUsers()", +"457c600c": "getItemAllowanceAmount(uint256,address,address)", +"457ce032": "getTokensFromExchange(address,uint256)", +"457cf77a": "couponToken()", +"457d13ca": "getPlayerBet(string,address)", +"457dd8b3": "setMasterKey(address)", +"457e5521": "getAllPolicies()", +"457e8fc7": "calculateReward(uint32,address,address)", +"457eff2f": "GetMySnails()", +"457f4d41": "hammer()", +"457f55fb": "updateRightLottery()", +"4580a950": "setDecreaseRepAvailableForExtraBondPayouts(bool)", +"4580cc5e": "setFinished(uint256,uint256)", +"458284fb": "setACLRole7123909213907581092(address)", +"45837e5f": "updateLandData(uint256,string)", +"4584117e": "mintParts(uint16,address)", +"45848dfc": "GetAllAdmin()", +"4584afe5": "buyLambo()", +"45850658": "closeAssignmentsIfOpen()", +"4585ad02": "delayDefaultAction()", +"4586a517": "addTotalSponsored(address,address,uint256)", +"4586e4ab": "balanceInPlay()", +"45871918": "raceToBaseStats(uint256)", +"4587327a": "doAirdrop(address[],uint256)", +"45874c93": "PersonaIdentity()", +"4587501e": "baseIcoPrice()", +"4588c1ef": "setPI_edit_2(string)", +"45895620": "getAvatar(address,uint256)", +"458a645d": "resolveDeposit()", +"458b1471": "mintingFinishedTime()", +"458c9ca4": "year3Unlock()", +"458d5968": "getMyTokensEmits()", +"458d96bb": "transferLockedMultiply(address[],uint256[],uint256[],uint256[])", +"458da775": "_makePlant(address,uint256,uint256)", +"458e18d7": "AMLOveCoinVoting(address)", +"458e78d5": "getSchellingRound(uint256)", +"458efde3": "vest()", +"458f837f": "minSumICOStage1USD()", +"458fa428": "summDividendReserve()", +"458ff74f": "authorizeBurnFulfiller(address)", +"45906baf": "Restrictable()", +"45909a6f": "getBalanceOfUser(address)", +"4591a980": "verifyStep(uint256,bytes,bytes,bytes)", +"4591b7c6": "fillBonds(address)", +"4591c060": "fork()", +"4592282e": "LBC()", +"4592cd1d": "claimContractOwnership()", +"4592fec8": "returnBids(uint256,address)", +"459348dc": "BISTEXToken()", +"45934d0b": "getIdentityName()", +"45941a38": "lastTimeOfNewCredit()", +"45945a45": "isRoundActive()", +"459469e0": "FundsRegistry(address[],uint256,address)", +"4594762a": "getSkill(uint256,uint256,uint256)", +"459497fc": "ownerAddressInLUT(uint256)", +"4594d06a": "delMinter(int256,address)", +"45950cd4": "selfairdrop()", +"4595343f": "dividendsRightsOf_(address)", +"459659a4": "Exchange(address)", +"45967555": "deployedContracts(address,uint256)", +"45977d03": "upgrade(uint256)", +"45977ebb": "LINCToken()", +"4597dc8e": "CooldownThreshold()", +"45983b24": "isReferralSupported()", +"4599308f": "buyCow()", +"459a2192": "cardDetailsList(uint256)", +"459a585a": "testCreateToken()", +"459a6589": "transferInGame(address,address,uint256)", +"459ae9b3": "addMembers(address,bytes32,address[])", +"459b0d97": "SimpleConstructorBytes(bytes32,bytes32)", +"459b2cd6": "OwnableWithRecovery(address[],uint8)", +"459b3926": "Airdrop_Limit()", +"459c7d0b": "tokenIcoUsdCentPrice()", +"459cb2be": "agreedTermination(uint256)", +"459ccde6": "modifyRandomNumber2(uint256)", +"459ebb8c": "BCMtest()", +"459ec508": "betOnColumn(uint8)", +"459f93f7": "getBuyers(uint256,address)", +"45a058c1": "flag_is_Ethereum_Function_Signature_Database_Is_Big()", +"45a132d4": "LemonSelfDrop1()", +"45a15388": "marketPrice()", +"45a1b92c": "onBurn(address,uint256)", +"45a1d72a": "_tobuy(uint256,address,uint256,uint256)", +"45a1f1b9": "getInitials()", +"45a2556c": "getBucketOwedAmount(uint256)", +"45a2a3df": "withdrawTeamPerfit()", +"45a37bd6": "kycManagerWallet()", +"45a3816c": "forfietCollat()", +"45a3b0bf": "resolveFailPledge()", +"45a3c7c6": "_createReleaseAuction(uint256,uint256,uint256,uint256,uint256)", +"45a40478": "downs(address)", +"45a45695": "baseTargetInWei()", +"45a48de6": "getBigPromoRemainingBlocks()", +"45a4a39c": "completePost(address,address)", +"45a727de": "checkForUpdaterUpdate()", +"45a743d1": "TOTAL_AIRDROPPED_TOKENS()", +"45a7b991": "getContributionHashes()", +"45a88ff6": "claimPlotMultiple(uint256[])", +"45a8d80e": "PiPiCoin()", +"45aa257a": "VICCoin()", +"45aa324c": "start_service(address,uint32)", +"45aa6e98": "tokensCreated(uint256,uint256)", +"45aa7f69": "OffMenuMorselToken()", +"45aa83d8": "blockoptions()", +"45ab17bf": "setRefunding()", +"45ab63b9": "walletFeesInBps(address)", +"45ab8e07": "CoinsdomCoin(uint256)", +"45abc063": "totalLoadedRefund()", +"45abe20a": "investorsIndex(uint256)", +"45acc490": "executeAmendmentMandate(uint256)", +"45ad35bc": "lastCallAddress()", +"45ad55cc": "PRE_ICO_DURATION()", +"45ade051": "getUtilizationRate(uint256,uint256)", +"45ae47fd": "CardFactory()", +"45aeff61": "getStockKey(bytes6,bytes6)", +"45af4bc2": "JJToken()", +"45af7ceb": "invalidateHash(bytes32)", +"45b0f6d2": "sealBurner(bytes32)", +"45b17abb": "distribute_private_sale_fund(address,uint256,uint256)", +"45b1c336": "icoWeek3Bonus()", +"45b21736": "getCBAStatusMessageLength(address)", +"45b26383": "contributeFund(string)", +"45b30e7a": "GTBToken()", +"45b35f56": "getAllRewards()", +"45b3fe42": "Y()", +"45b426f2": "option30symbol()", +"45b50255": "getBooking(string,uint256,uint256)", +"45b5143b": "TUMITOKEN(uint256,string,uint8,string)", +"45b581a2": "getPotentialProfit(address,string)", +"45b5a47a": "GetEther()", +"45b64133": "HHRLocker()", +"45b660bd": "IssueTokensToInvestors(address,uint256)", +"45b6ccfd": "MAX_MIDGRADE()", +"45b727f3": "getShop(uint256)", +"45b748ab": "SSPUnregistered(address)", +"45b7d5da": "setFrozenAccount(address,bool)", +"45b7fdd4": "TheGreatWishOfChina()", +"45b8bafc": "floorLog2(uint256)", +"45b8c0c2": "parcelGzeWithBonusOffList()", +"45b8fa03": "TokenLongExercised(address[2],uint256[8],uint256,uint256)", +"45b9ca21": "getEther(uint128)", +"45bae1eb": "carAccts(uint256)", +"45bae539": "getContributeParticipant()", +"45bbee71": "rmAsset(address)", +"45bbf9b5": "TotalPayment(uint256)", +"45bcd68f": "BitVideoCoin()", +"45bd3752": "intMemoryArray(int256)", +"45bd7f03": "addBountyAddresses(address[])", +"45bda564": "SPECIALIST_STAKE_THREE()", +"45bddbb8": "thanksAllGenesisUsers()", +"45bdfedb": "getAdrByIndex(uint256)", +"45be66eb": "SportsBet()", +"45beb6e0": "matchAgainstBook(uint128,uint256,uint256,uint256)", +"45bf5cb2": "testInitialBoardUsingDeployedContract()", +"45bfdca6": "addWalletAddresses(uint256,address)", +"45c08718": "updateCredit(address)", +"45c1234c": "Sent(address,uint256,string,string)", +"45c12560": "LogMoneyToPreICO(address,uint256,string)", +"45c1523a": "OzsToken()", +"45c16a22": "getSaleStage()", +"45c1c9fc": "setBuyEnable(bool)", +"45c35fd5": "publicOfferingTokens()", +"45c38053": "tankAllowance()", +"45c41132": "_emitPaymentReleased(uint256)", +"45c41478": "getMarkets(bytes,address)", +"45c46619": "addWhitelistedBurn(address)", +"45c531f3": "secondDiscountPrice()", +"45c5904f": "malangtoken()", +"45c5b8ac": "set_game(address)", +"45c5de81": "listTeamTokens(uint256)", +"45c654eb": "TravelToken()", +"45c6a874": "adminMultiSig()", +"45c7a092": "isValidSignature(address,uint40,uint40,uint128,uint256,uint8,bytes32,bytes32)", +"45c8b1a6": "unfreeze(address)", +"45c8e118": "view44()", +"45c917ec": "closeDeposit()", +"45c9a11a": "maxProfitPercentage()", +"45c9a558": "getPeriods()", +"45ca25ed": "changeName(address,string)", +"45cb3dde": "withdrawTime()", +"45cb3f4d": "highestBidPrice()", +"45cb4559": "gameGiftUserTotalTimes()", +"45cb9994": "Lookup()", +"45cbf879": "getStageByBlockNumber(uint256)", +"45cc13c3": "tokenize()", +"45cc50ce": "endTimeIco()", +"45ccd426": "ObokContract()", +"45cd4820": "participate(address,uint256,bytes32,address)", +"45cdb714": "changeColorWhite()", +"45ce0dc1": "addLambo(string,uint256,bool)", +"45ce691a": "buy(uint256,uint256,uint256,uint256,uint256,uint256)", +"45ce86eb": "whitelistApplication(bytes32)", +"45cf093a": "sumDividend()", +"45cf8467": "getSqr(uint256)", +"45cfad3e": "TOKEN_PRICE_N()", +"45cfcc42": "getKeyVotes(string,string)", +"45d0695f": "arr(uint256,uint256)", +"45d1b657": "PRE_SALE_3000_ETH()", +"45d27edf": "forward_method(bytes,address,uint256,bytes)", +"45d30a17": "releasedAmount()", +"45d3292b": "receiveDonation()", +"45d3b8db": "superAddress()", +"45d3cc81": "getAnimal(uint256)", +"45d4cf2b": "createPrivilege(string,address,address)", +"45d5149f": "minContributionAmount()", +"45d53788": "numOrders()", +"45d58a4e": "getWalletOut()", +"45d607fe": "referralFee_()", +"45d63b07": "BrokerNekoNetwork()", +"45d63b66": "recommit(uint256)", +"45d6c9db": "PVP_BATTLE()", +"45d78d08": "getTokenAllocations()", +"45d7fd3e": "setCreationAddress(address)", +"45d8a232": "targetTime()", +"45d8a6df": "tablePrices(uint256)", +"45d9a1ce": "withdrawBalance(address,address,uint256)", +"45d9bd15": "getBookmarks()", +"45da75d3": "setPresidenteDeMesaVerify(bytes32,uint256,uint256,uint256)", +"45dafed2": "Marcellocoin()", +"45db72ff": "lastLoveLetter()", +"45dc16ca": "trade(uint256[12],address[4],uint8[2],bytes32[4])", +"45dc3dd8": "setMin(uint256)", +"45dcb788": "dataSourceGetRoundOfSixteen(uint256)", +"45ddc85d": "voteOf(uint256,address)", +"45ddcf99": "unlockUntradeableCards(address)", +"45de2567": "transferTokens(uint256,uint256)", +"45df30d2": "transferPlusFee(uint256)", +"45df925f": "ratingList()", +"45dfe7f3": "restrictedWallet()", +"45e05f43": "affiliate()", +"45e09e54": "getBoard(uint256)", +"45e0e324": "FoodStore()", +"45e0e412": "forwardTokens(address,uint256)", +"45e231a6": "XCONToken()", +"45e26105": "updateMaintenanceMode(bool)", +"45e29057": "_myLuckyNumber()", +"45e3553e": "setMaxProtoId(uint16)", +"45e373ed": "getCertificateById(string)", +"45e381a9": "set_minFinneyPerHedgeTransfer(uint256)", +"45e39705": "addMember(string,address)", +"45e3b8c0": "SHOP()", +"45e41468": "placeSell(address,uint256,uint256)", +"45e479f6": "GetDiv()", +"45e4c361": "rteamVaultAddr()", +"45e4db40": "addTxInBuffer(address,uint256,uint256,uint256,uint256)", +"45e4fd6e": "listItem(uint256,address,string)", +"45e5da07": "ETHAssets()", +"45e5fd8b": "nonActivationShortWithdrawal(address[2],uint256[7],uint8,bytes32[2])", +"45e63f22": "getNumberOfMessages()", +"45e7e140": "getReservedPercentageDecimals(address)", +"45e7e14b": "ReputationUpdated(string,uint256,uint256,string,string,address)", +"45e82175": "level_5_percent()", +"45e8baa7": "checkSignatures(bytes,bytes,bytes,address)", +"45e93903": "SpooksterCoin()", +"45e965cd": "strConcat(string,string,string,string)", +"45e971bf": "updateStatus(uint256,bytes32)", +"45ea375f": "viewPot()", +"45eada10": "setProvider2(address)", +"45eb4b28": "destinationAddress20()", +"45eb7c8e": "CompleteAddOn(uint256,address)", +"45ebc145": "publish(uint256,string,string,string,bool)", +"45ebe153": "moveIcoEndDateByOneMonth(uint256)", +"45ec26ac": "distributedCount()", +"45ec7670": "WallStreetCoin()", +"45ec9e87": "Eurovision()", +"45ecd02f": "isActiveMember(address)", +"45ed68e8": "defaultSalePrice()", +"45ede900": "setPropertyOwnerSalePrice(uint16,address,uint256)", +"45ee49b9": "getUltimateOutcomes(bytes)", +"45ee9151": "BountyTransfer(address,address,uint256)", +"45ef8217": "clear_market()", +"45f00b06": "setNewTalentsAndPartnerships(address)", +"45f03f31": "EthereumLottery(address,address,address)", +"45f09140": "chargebackCoins(uint256,address)", +"45f0db24": "get_coin(uint256)", +"45f11fc8": "trancheAmountPct()", +"45f23f10": "crowdsaleFundsWallet()", +"45f28864": "Appitoken()", +"45f28e77": "genToStartPrice(uint256)", +"45f32b02": "currentModifier()", +"45f32b6d": "totalCirculating()", +"45f32e77": "currBlock()", +"45f412b0": "removeStakeHolder(address)", +"45f45449": "EtherCash()", +"45f472fc": "saltNHash()", +"45f4c1ba": "pay(uint128,address)", +"45f536f7": "sendPer2()", +"45f63927": "increaseGame()", +"45f67eb4": "setTolerance(bytes32,uint256)", +"45f6ee41": "setPrice(uint16,uint16,uint8,uint256)", +"45f7f249": "totalAllocated()", +"45f826da": "setMinimumInvestment(uint256)", +"45f8567c": "paySmartContract(bytes32,address[],uint256[])", +"45f8f1e8": "RajTestICO(address)", +"45f9072b": "setColorOrange()", +"45f988a4": "priceT2()", +"45f99d51": "claimFailed()", +"45fa4045": "getVestingPeriodNumber()", +"45fa53e7": "pieAccounts(uint256)", +"45fb0cd6": "addMultipleAddressesToCappedAddresses(address[])", +"45fbe9cb": "spawnChild(string)", +"45fbfbca": "investment()", +"45fc916c": "setPricingPlan(address)", +"45fcceb4": "foundersTokensReserve()", +"45fd2478": "_getShipType(uint256)", +"45fd3666": "isTurnDataSaved()", +"45fd4040": "addAllowCnsContract(address,bytes32,address,bytes32)", +"45fd865a": "HazzaToken()", +"45fd9e23": "claimOwnership1()", +"45fdab4c": "sellSkill(uint256,uint256)", +"45fdef65": "addCandidate(address,bytes32,bytes32)", +"45fe5850": "OrganFunction(string,string)", +"45fe5a83": "deliveryTime()", +"45fe5aea": "useKey(address,uint256)", +"45fe6e2a": "Scheduler()", +"45febc32": "BugisNet()", +"45ff59b2": "createTokensForCrypton()", +"45ff8b75": "get_HoldersProfit(uint256,address)", +"45ff8fde": "request(bytes32,uint256,uint8,uint256)", +"460123cf": "findAddressByEndpoint(string)", +"4601cded": "getNumSides()", +"46021deb": "getLastAuctionedShipId()", +"4603032a": "withdrawByTeam(address,uint256)", +"46032178": "MigrateAgentSet(address)", +"460485e0": "fundsWithdrawnByOwners()", +"46051eb7": "getProductHistoryUser(bytes32)", +"46054144": "ASIEX()", +"46055acd": "Decline(address)", +"46057b70": "timeOver()", +"46061579": "check1(uint256)", +"4606ccd1": "spinAllTokens()", +"4607c26e": "periodsPassed()", +"4607ef57": "preICOTokenRewardRemaining()", +"46080a94": "subResearch(address,uint256)", +"46082aaf": "approveDeprecation(uint256,address,bool)", +"460885ab": "_createNewLottery()", +"46091499": "transferFrom(address,address[],uint256[])", +"46093b0e": "setOracleAddress(address,address)", +"460a6507": "giveReward(address,address,uint256)", +"460ab47b": "proposeChangeOwner(address,address)", +"460ad570": "newOraclizeResult(bytes32,string)", +"460b4a45": "getTotalBonusesAmountAvailable(bytes32)", +"460c1a7a": "cancelOrders()", +"460c3be5": "owner_LockUpdateTokenAccount(address,bool)", +"460d674b": "keyFromIndex(uint256)", +"460e2049": "getPlayers(uint256)", +"460f740e": "createData(string,string,string)", +"460fce3b": "milestoneStarted(uint256)", +"4610a448": "vestingBeneficiaryForIndex(uint256)", +"461105c7": "withdrawBoth(uint256,uint256)", +"4611636e": "erc20VGC(uint8)", +"46116e6f": "sireAllowedToAddress(uint256)", +"4611a5e3": "calcRefund(address,address)", +"4611efde": "changeTBrate(uint256)", +"4611fb0e": "RSC()", +"4612b88d": "deleteDiniRequest(uint256)", +"46134e33": "getPrivateSaleEndDate()", +"46141657": "SetdivForTank(uint256)", +"4614185a": "IkuraTransfer(address,address,uint256)", +"46143a39": "setMessageSpan(uint16)", +"4614689c": "showWinners(uint256)", +"4614874e": "createEscrow(address,uint256)", +"46156ea0": "odds(uint256)", +"461645bf": "window()", +"4616caa9": "pushCoin(uint256,address,string)", +"4616fc3f": "setSystemSaleAddress(address)", +"46172c04": "calculateRewardForAddressAt(address,address,uint256)", +"461751e6": "resetMistCallLoad()", +"46183d06": "getTktPrice()", +"46190e16": "getSpecId(bytes)", +"46190ec4": "nextId(address)", +"461998fc": "cancelRecurringPayment(address)", +"4619aa19": "pvpOwnerCut()", +"4619c0ca": "insertBeneficiaries(address,address,uint256,uint256,uint256)", +"461a2df9": "PretherICO()", +"461a4478": "resolve(string)", +"461ac019": "deployedTime()", +"461ad9e9": "saveGenCode(address,uint256,string)", +"461c89b3": "massMint(uint8[],address[],uint256[])", +"461db9ad": "GoCryptoCoin()", +"461df016": "getQuantities(address)", +"461e0be5": "ElphToken()", +"461efbf8": "testEtherFundMeCrowdfunding()", +"461f48cb": "setUsersBounty(address[],uint256[])", +"461fd83b": "myEtherBros(address)", +"46203efe": "frozenAccountCoinByHour(address,uint256,uint256)", +"46205ac3": "hodlFor1y()", +"4620adbb": "tokenPricePerUSD()", +"4621a5d9": "activateRevenueShareReference(uint256)", +"4621e552": "decreaseRemainLockedOf(address,uint256,uint256)", +"462219f8": "batchTransfer(bytes32,address[],address,uint256[])", +"46226514": "isPresidenteDeMesa()", +"4622ab03": "names(uint256)", +"46238c69": "nextRedemptionRequest(uint256)", +"4623beb6": "InterestTest(address,address)", +"4623c81e": "TIMELOCK_DURATION()", +"4623c91d": "setValidator(address,bool)", +"4624321e": "decreaseApprovalWithData(address,uint256,bytes)", +"46256be7": "getAgentAdressById(uint256)", +"46272a6d": "mySavings()", +"4627de42": "getIncrease()", +"46280a80": "sell(uint8,uint256,uint256)", +"46285e45": "checkBalanceAt(address,uint256)", +"46286c18": "_validateUserActive(address)", +"46287ddb": "rateLastWeekEnd()", +"4628b375": "TokenLeft()", +"4628bc22": "teamTokensVesting()", +"4628e45e": "ABAToken()", +"4629e619": "raceNum()", +"4629ffea": "newToken(string,string)", +"462a8e05": "setRabbitSirePrice(uint32,uint256)", +"462aa19e": "setToken(address,bytes)", +"462b2fca": "isRedeemLocked(address)", +"462c1bff": "H4D()", +"462c6070": "getLockedAmount_jishis(address)", +"462c6edb": "highBonusRate()", +"462dcfa0": "newMaster(address)", +"462e91ec": "addCandidate(string)", +"462f9a28": "get(bytes32,bytes32,uint256)", +"463079b5": "resetFactories()", +"4630a0ee": "changeTicketPrice(uint256)", +"4630d82e": "upgradeTokens(uint256)", +"4630f1d5": "toggleKillSwitch()", +"463107d4": "buyerfeeDivide()", +"46315237": "fiveHours()", +"46317712": "lastDebtLedgerEntry()", +"463193c7": "startselfdrop()", +"4631db54": "_burnTokens(uint256)", +"4631e15b": "assertEq15(bytes15,bytes15)", +"46325b48": "CTCoin()", +"46336cd3": "read(uint256,uint64)", +"4634009a": "getIdx(string,string,uint256)", +"46340b37": "RakugoPresale(uint256,uint256,uint256,address)", +"46348e0b": "calculateArea(uint256)", +"4634d81c": "getDividends(address)", +"4634ea79": "countCurrentPayment()", +"46352ad9": "transferToGrowthReserve()", +"4635b449": "raisedUSD()", +"4635ecd5": "lastTicketNumber()", +"4636a159": "newPhoneToAddr(address,uint256)", +"4636db04": "changeBid(bytes32,uint8,uint8)", +"4636e095": "acceptBet(uint32)", +"4637c85d": "wildcardTokenId()", +"4637d827": "trust(address)", +"4637de3c": "removeMod(address)", +"4637fd1a": "_transferEther(address,uint256)", +"463959fa": "minJackpotBet()", +"4639888b": "jockeyForSale(uint256,uint256)", +"463ac31b": "buyStore()", +"463c3347": "getMyLandMultiplier()", +"463c75b3": "GreenworldFarmToken()", +"463cde9e": "PUBGtoken(uint256,string,string)", +"463cf730": "maxEthCapBuyInFp()", +"463d3cda": "acceptExternalTransfer(string,uint256,string,uint256)", +"463d50b8": "transferFromVault(address,address,uint256)", +"463d5ce1": "isUserWithdrawalTime()", +"463dcf0a": "merge(address,uint256,uint256)", +"463dfae6": "setTrg(address)", +"463ee88a": "createBusiness(uint256,uint256,uint256)", +"463f2c21": "giveCredits(address,uint256)", +"463f7a7d": "_updateDependencies()", +"463f7a89": "getProperty(bytes32)", +"463fb5f1": "Bogotcoin()", +"463fbb76": "setTransportationFeeMultiplier(uint256)", +"46405ffc": "OhNoToken()", +"464066f5": "vote03NoCount()", +"4640f28d": "createPlayerToken()", +"4641257d": "harvest()", +"464299f9": "getReturnFromMonster(uint64)", +"46435fa1": "createPiranhaToken(string,address,uint256,uint8,uint8)", +"4643db5b": "DonationClaimed(address[2],uint256[8],uint256,uint256)", +"4644d17e": "getAirDropTokens()", +"46463941": "calcBonusReferrers(address,uint256)", +"4646939e": "updateWhitelistMapping(address[],bool)", +"464695b3": "tokensSoldTo(address)", +"4646f62a": "setAvatarFrom(address,string)", +"46478e91": "increaseGlobalInterestAmount(uint256)", +"46479541": "setWalletId(address)", +"4647d0c6": "CUNCoin()", +"464858c6": "NVT()", +"46488459": "getTopMigrationDestination()", +"4649bfee": "setCCH_edit_25(string)", +"464ae89f": "SponsoredLink()", +"464bb7a3": "findAccess(address)", +"464cccc8": "round4Cap()", +"464cecb8": "getHyper(address)", +"464d1208": "claimReward(address,address,uint256,address,uint256)", +"464da87e": "cofoundersSupplyVestingTranchesIssued()", +"464deba6": "TridentToken(uint256,string,uint8,string)", +"464e1d46": "setBalanceOfAddr(address,uint256)", +"464e47b4": "wasSoftCapMet()", +"464f37c9": "trustedChildRefund()", +"46503676": "_useCitizenAsLumberjack(address,uint16,uint16,uint8,uint256)", +"46503c01": "KansasvsClemson()", +"4650c308": "genericCall(address,bytes)", +"465105f0": "releaseAllETH()", +"46517145": "createNewCardType(uint256,uint256,uint256,uint256)", +"4651f716": "assertEq14(bytes14,bytes14)", +"4651ff39": "setopen()", +"4652e9fe": "getStartDateOfPlan()", +"46530c34": "activityExist(uint256)", +"46533d60": "setNewReleasePeriod(address,uint256,uint256)", +"46534649": "referralBalanceOf(address)", +"46538e07": "checkExistsOwnedMedal(uint64)", +"4653a1fa": "setAttackBoostCap(uint256)", +"4654b6e2": "addMonsterObj(uint64,uint256,uint32,address,string,string)", +"46567a07": "getTotal(address[],uint256[],uint256)", +"46570653": "_share(uint256)", +"4657681b": "set_num_of_uses(address,address,uint8)", +"4657ad8e": "payTxFees(bytes32,uint256)", +"4657d848": "getVendorIds(uint256,uint256)", +"46581235": "unlockToken(address,uint16)", +"465941e5": "ATMHolders(uint256)", +"4659f42a": "withdrawAfter(address)", +"465a092d": "PRESALE_ETH_CAP()", +"465aaeb7": "windowBonusMax()", +"465af554": "setLockJackpots(address)", +"465b43d0": "joy()", +"465c2cec": "SmartBonds()", +"465c8ce0": "getRobot(uint256,uint256,uint256)", +"465ce877": "HashnodeTenaraCoin()", +"465d1cbe": "getDepositsAmountLeft(uint256)", +"465d5c27": "_tokenIsApproved(address,uint256)", +"465d6e1a": "CAUSE()", +"465e759b": "testRestart()", +"465e920e": "getLineData(uint256)", +"465f1d07": "CrowdTmoney5()", +"465f41b1": "multiOwner(address[])", +"465fa408": "calculatePriceForTokens(uint256)", +"465fe311": "KEP()", +"46601278": "TotalTOkenSupply()", +"46602ce7": "FOUNDERS_POOL_ADDR()", +"4661bb98": "setClassWhitelist(uint32,bool)", +"46621234": "tmpAddr2contractAddr(address)", +"4662299a": "issuanceFinished()", +"4662fbdf": "promotorSale()", +"466339fb": "_rewards(uint256,uint256)", +"46642921": "changeModerator(address)", +"4664611e": "winningNumber()", +"4664b235": "bytes32_to_bytes(bytes,bytes,bytes)", +"4664fe1b": "changeMinFunds(uint256)", +"4665096d": "expiration()", +"46653287": "createInitialTokens(address,uint256)", +"466551f1": "LinqToken()", +"466559e2": "S26ICO()", +"46656c46": "OxToken()", +"4665975d": "registerCustodian(address,address)", +"46682cab": "canFinishTournament()", +"46683308": "freezeAccountForLogic(address,bool)", +"46689c64": "startPlaceOrder(uint256,address)", +"4668b43b": "updateTelegram(uint256,string)", +"4668f372": "MaxMiningReward()", +"466916ca": "pauseStatus()", +"466985f3": "escape(uint256)", +"4669e680": "getPreEntranceMemberCount()", +"466a3443": "getIndividualPercent()", +"466ae314": "forwardedOutcomeSetTimestamp()", +"466bb312": "getDeposited(address)", +"466bc3bd": "GOXX(uint256,string,string)", +"466bf275": "getFreeToad()", +"466c35fc": "MINT_ADDRESS()", +"466c3a2b": "getChecksumAlgorithmCount()", +"466ccac0": "forSale()", +"466cf98f": "giftBalance(address)", +"466d3d38": "setDragonTactics(uint256,uint8,uint8)", +"466df592": "votingPeriodBlockNumber()", +"466e37e7": "newTapProposalFromTokenHolders(uint256)", +"466e561f": "updateReserve(address,uint8,bool,uint256)", +"466ebdf6": "setAddressOut(address)", +"466f0004": "getData_10()", +"466f8870": "Solar()", +"4671e65e": "proposeEmergencyWithdrawal(address)", +"4672f555": "pow(int128,int128)", +"46743691": "transferPublisherRecord(address,address)", +"467523fa": "setBuyerRate(address,uint256)", +"46755c68": "setEndingBlock(uint256)", +"46758d0b": "setAgentRate(address,uint256)", +"4676b897": "balanceOfUnclaimed(address)", +"467730fb": "toFound()", +"4677b540": "ATOToken()", +"4677fe53": "validUnitId(uint256)", +"467abbbd": "addPlayerHistory(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"467aeec9": "addShareholderAddress(address)", +"467d7289": "clearRound(uint256,uint256,bytes32,bool,uint256,uint256,uint256,uint256)", +"467de087": "withdrawAdvisorsTokens(address,uint256)", +"467eb43f": "verifyIdentity(address,bytes32,uint256)", +"467ed261": "getDSTNameBytes()", +"467f0b7b": "del_rank(uint256)", +"467f85e4": "DividendPayment(uint256,uint256)", +"468014e1": "startTimeSale1()", +"46804137": "bonusStep()", +"46807803": "_payoutMining(uint256,address)", +"4681067d": "incAdminEpoch()", +"468129a5": "setUnit(uint256,uint256,uint256)", +"46817362": "importersBanksDraftMaturityDate()", +"46822869": "BTFM()", +"4682ff71": "redeemMarketingToken(string)", +"4683ef63": "delayedOwner()", +"46848114": "startOffering(uint256,uint256,uint256,uint256,bool)", +"4686030f": "promethExecute()", +"468628e1": "getActivityById(uint256,uint256)", +"46862c8f": "mintOnce(string,address,uint256)", +"4686753d": "Crowdfunding()", +"46875458": "ARM()", +"4688a372": "withdraw(address,bytes8)", +"4689ab4d": "right21(uint256)", +"468a0413": "parseResult(bytes32,string,address)", +"468ae69d": "multiMint(address[],uint256[],string)", +"468b0c1d": "AllPay()", +"468b0fcd": "preSaleGoalReached()", +"468b0fe2": "setBridgeNode(address,address,bool)", +"468b3b33": "unlockedBalanceOf(address,uint256)", +"468c17d7": "_sendMsgSndr(address,address)", +"468e1b53": "DEC15Contract()", +"468e4509": "setAutoridadElectoral(bytes32)", +"468ed002": "INITIAL_VUP_TOKEN_SUPPLY()", +"468eeece": "revertGame(address)", +"468f02d2": "getUnderlyingPrice()", +"468f3dcd": "getTokenHoldersCount()", +"46904840": "feeRecipient()", +"46906982": "amountRaisedEth()", +"46911b64": "testDisputedWriteValid()", +"46912a4d": "PERC_TOKENS_TO_BIZDEV()", +"46915fc4": "getAllShareholders()", +"4691a998": "addVesting(address,uint256,uint256)", +"4692a481": "WilliamCoin()", +"4692d7e3": "BitQ()", +"4693667a": "changeMdtFoundationAddress(address)", +"469450cc": "disableLockDown()", +"4694fe85": "isUseContractFreeze()", +"469506bf": "getFinalSeed(uint256,uint256)", +"469507c6": "transferReward(uint256,address)", +"4695cf7a": "getSteakPrize()", +"4696890e": "ethworld()", +"469737d5": "forceRejectVotes(bytes32,address)", +"46975b9a": "swypeCode()", +"4697f05d": "setAllowed(address,bool)", +"4698ad05": "transferWhileLocked(address,uint256)", +"4698d110": "numMembers()", +"4698d920": "setMintAuditApproval(address,address,address)", +"4698da9d": "releaseVestedTokens(address,address)", +"469912d7": "Crowdsale(uint256,address,address)", +"46999ee5": "addNamespaceMember(string,address)", +"469a6947": "unlockTimeOf(address)", +"469aaa98": "BitSTDLogic(address)", +"469ab1e3": "contractNameHash()", +"469bb426": "failedDonations(address)", +"469c62a6": "buy_tokens()", +"469c7f4d": "transferOwner2(address)", +"469c8110": "sendMessage(string)", +"469c8dbb": "ExternalSale(uint8,bytes32,address,uint256,uint256)", +"469e2d5c": "submitPresetTransferes()", +"469e9067": "records(address)", +"469ef000": "hasValue(address[],address)", +"469f4c41": "setPreIcoStatus(uint256)", +"46a06ddb": "getPreviligedallowed(address,address)", +"46a06eb9": "LogTimedTransition(uint256,uint8)", +"46a1749a": "AgingTransfer(address,address,uint256,uint256)", +"46a1cd08": "getAvailableReward(address)", +"46a1d95f": "closeMarket(bytes)", +"46a1fabf": "Withdraw(address,uint256,uint256,bool,bool,string)", +"46a2679a": "getSubpotsCount(uint256)", +"46a2b53e": "GAS_REQUIREMENT()", +"46a3e290": "Defreeze(address,address,uint256)", +"46a3ec67": "TheAnswerIs(string)", +"46a54e15": "privatesale_start_time()", +"46a5b318": "DutchAuction(address,uint256)", +"46a5bf0c": "airDropStage()", +"46a60e99": "buyRoseGRLC(bytes32,string,uint256)", +"46a672bd": "createCard(string)", +"46a6c499": "freezeMyFunds(uint256,uint256)", +"46a7551d": "isOnBattle(address,uint64)", +"46a79a4e": "changeGameSettings(uint256,uint256,uint256,uint256,uint256,uint8,bool,uint256)", +"46a9d680": "EthereumGold()", +"46aa6644": "sendAllFeeToAddress(address)", +"46aaf139": "getSignersCount(bytes32)", +"46ab3d5e": "evaluateProposalMarket(uint256)", +"46abf8a8": "setVariables(uint8,uint16,uint16,uint16)", +"46ace8fd": "removeServer(string)", +"46ad5859": "getTokensRemaining()", +"46ade2de": "RESERVED_TOKENS_FOR_PRE_ICO()", +"46ae38a8": "getHexSymbol(string)", +"46aee903": "changeminBuy(uint256)", +"46af23f5": "InstantLottery(address,address,bool,address)", +"46afb963": "CrowdsaleState()", +"46b04e53": "PlayerInfoPerZone(uint256,uint256)", +"46b1d3be": "endTimePreICO()", +"46b207b8": "checkExpiry()", +"46b249b9": "tokenSaleOnHold()", +"46b305d6": "lockBetsForWithdraw()", +"46b33bc2": "getDonebountyAmount(address)", +"46b33e05": "getFreeTurtle()", +"46b4320c": "showUserBalance(address)", +"46b45af7": "isMintable()", +"46b55416": "subBuy(bytes32,bytes32,bytes32,address)", +"46b56bf6": "contract_sha256()", +"46b5d107": "testFailMintGuyNoAuth(int256)", +"46b5e202": "set_num_levels(uint256,uint256)", +"46b61083": "GoDigit(uint256,string,string)", +"46b65ffd": "getModule(uint8,uint256)", +"46b7068c": "returneth(bytes32)", +"46b753a2": "setChargeFeePool(address)", +"46b77d9f": "areFundsReleasedToBudget()", +"46b84cad": "getPackageById(uint256)", +"46b8c49e": "setReserveData(address,uint256,address)", +"46b98d0c": "startContract(bytes32,uint64)", +"46ba6f61": "setSuppressedGame(uint256,bool)", +"46ba7783": "setDistributionMinter(address)", +"46bb2833": "founderAddress()", +"46bbb6cf": "removeSshKey(string)", +"46bc29bf": "getGoldMigration(uint256)", +"46bd7067": "requestCoinMarketCapPrice(address,bytes32,string,string)", +"46bdca9a": "equal(string,string)", +"46be2310": "export(bytes8,address,address,uint256,uint256,bytes)", +"46be2e0c": "left32(uint256)", +"46be6f87": "newGame(uint8,string,string,bytes32)", +"46be96c3": "amountFilled(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", +"46be9c48": "lockState()", +"46bf3df3": "_setWallets(address,address,address,address)", +"46bf5864": "ERC223Token_STA()", +"46c017b5": "zhuchu(uint256)", +"46c068c3": "testEndsWith()", +"46c092b2": "presaleGuaranteedLimit(address)", +"46c13d28": "changeAccessTokenFee(address,string,uint256,uint256)", +"46c2997a": "notMoreThan()", +"46c3166f": "testThrowRetractLatestRevisionNotOwner()", +"46c34832": "WinnerProvidedHash()", +"46c49c58": "CustomToken(string,string,uint8,uint256)", +"46c4e533": "withdrawUpdate(bytes32,uint256,address,address,uint256,uint256,bytes32,bytes,bytes)", +"46c52b1a": "blockHexCoordsValid(int8,int8)", +"46c59373": "ethManagementPropagate()", +"46c66b27": "_transferAll(address,uint256)", +"46c6f325": "TEACHTokenToken()", +"46c715fa": "original()", +"46c797e2": "updateMarriageLicenceImageIPFShash(bytes)", +"46c7c126": "getChallenges()", +"46c968db": "blocktubeClip(string,uint256,uint256,uint256)", +"46c9b457": "privatePreSalePrice()", +"46ca48a2": "freeAmount(address)", +"46caf5e8": "BTB()", +"46cc3179": "getComponent(string,string)", +"46cc43fb": "decodedSecret()", +"46cd9b23": "_triggerNewPVPContender(address,uint256,uint256)", +"46cdb099": "shareholderID(address)", +"46ce33d4": "clearLockBalance(address)", +"46cee8f7": "TemporaryPyramid()", +"46cf1bb5": "lockState(address,uint256)", +"46cf6d2e": "_validate(uint256,uint256,uint256,uint256,uint256)", +"46cffffd": "NewAreaStatus(uint256,uint8,uint8,uint8,uint8,uint256)", +"46d0a022": "transfer(address,address,address,address[],uint256[])", +"46d0e892": "makeOptions(uint256,address,uint256)", +"46d0eb60": "addAlias(address,string)", +"46d0fb60": "isUserLicenseValid(address,string)", +"46d1501a": "PoP()", +"46d17bfd": "LongBought(address[2],uint256[2],uint8,bytes32[3],uint256)", +"46d17c3a": "Unregister(address,uint256)", +"46d1c605": "balanceOfButter(address)", +"46d22c70": "canBreedWith(uint256,uint256)", +"46d24cbb": "refundedWei()", +"46d36fa0": "ChristopherRobinRT()", +"46d46a6a": "CashTelex()", +"46d47cdf": "testFailCreateWithParentsParentNotInUse0()", +"46d5688e": "RATE_CROWDSALE_S1()", +"46d64aa2": "Kuberand()", +"46d667db": "setBytes32(bytes)", +"46d6b1e8": "getChampsForSale()", +"46d6c93b": "addFeed()", +"46d7195d": "vote_until()", +"46d73def": "hasHalted()", +"46d7df42": "setTokenContactInformation(string)", +"46d89444": "getCrowdsaleTierList()", +"46d95146": "anvlTechToken()", +"46db63d7": "rewardUser(uint256,address,uint256)", +"46dbf9b0": "pickupProduct(uint256)", +"46ddb7db": "setAccountBalance(address,uint256)", +"46de0fb1": "isFrozen(address,address)", +"46deb279": "ElementUpgraded(uint256,uint256,uint256,address,uint256,uint256,uint256)", +"46df1578": "refferBonus()", +"46df2ccb": "setRate(uint256,uint256)", +"46e04a2f": "claimTokens(uint256)", +"46e06634": "approveKYC(address,bool,uint256,string)", +"46e0c223": "_createOfAthlete(address,string,address,uint256,uint256,uint256)", +"46e184da": "Olife()", +"46e1bfbb": "acceptAtGroup(address,uint256)", +"46e1f732": "investorsProcessed()", +"46e1fa55": "_removeDefaultOperatorByTranche(bytes32,address)", +"46e2577a": "addProvider(address)", +"46e2a174": "preIcoTokensSold()", +"46e33afc": "getFACTOR()", +"46e34823": "tan(uint256,string,string)", +"46e36060": "subBalances(address[],uint256[])", +"46e3cb1a": "sellTradeConfir()", +"46e44f63": "getCheckRecordTS(bytes)", +"46e4959d": "mintMulti(address[],uint256[])", +"46e4d35d": "numOfLoadedEarlyPurchases()", +"46e5500f": "LogFinalized(address,uint256)", +"46e5c323": "largestHODLERBalance()", +"46e6ffdd": "OwnableStorage()", +"46e767bc": "Log2(address,bytes32,uint256,string,string,string,uint256,bytes1,uint256,uint256)", +"46e780b0": "getLinkHash(address)", +"46e7ccac": "isAuthorizer(address)", +"46e7f38e": "BayCoin()", +"46e87b1e": "RgiftTokenSale()", +"46e93dbc": "maturityProcess(string,bool,uint256,uint256)", +"46e9ab22": "Gateway()", +"46e9e3c2": "reclaimPeriod()", +"46ea2552": "transferManager()", +"46eac50e": "superTransfer(address,uint256)", +"46eba0c1": "fundWithdraw(address,uint256)", +"46ebb5e2": "TimedPresaleCrowdsale(uint256,uint256,uint256,uint256)", +"46ec56c5": "getNumInvestments()", +"46ed24a3": "setAirdropToken(uint256)", +"46ed3199": "ATCToken()", +"46edef6c": "accICO()", +"46eea9a1": "secondStageRaised()", +"46eeed5f": "rolloverFee(address,uint256,uint256)", +"46ef6660": "createTokenContract(address,bytes32)", +"46f02832": "queryPermissions()", +"46f04694": "periodICOStage8()", +"46f0975a": "signers()", +"46f19888": "get_total_info()", +"46f24c6a": "functionSix(uint256,uint256,uint256,uint256)", +"46f25cad": "setAuthor(string,string,address)", +"46f2e880": "payForMyselfWithChecksum(uint128,bytes1)", +"46f42dff": "Win(uint256,uint256,uint256,address,uint256)", +"46f43f15": "StierBitToken()", +"46f74c6d": "setArbitrationPercentage(uint8)", +"46f76648": "getTotalEthSended()", +"46f7a883": "BuyTicket(uint8,uint8,uint8)", +"46f7cf87": "insert(address,uint256,address,address)", +"46f84dc4": "grantPermission(address,address,bytes4,address)", +"46f8e5ec": "getBlocksUntilStart()", +"46f92818": "setCreditDaoAddress(address)", +"46f99063": "totalSent()", +"46f9bedf": "costPerTicket()", +"46fa14e5": "MyFeed2Token()", +"46fa2574": "preIcoMembers(address)", +"46fae630": "getAllCardsAttack()", +"46fbf68e": "isPauser(address)", +"46fc0294": "senderRefund(bytes32,uint256,bytes20,address,address)", +"46fc9037": "__beneficiaryTransfer(uint256)", +"46fcafe2": "etherContributions(address)", +"46fcff4c": "availableFunds()", +"46fd9446": "setUsdEtherPrice(uint256)", +"46fde171": "closeCdp(address,uint256,uint256,address)", +"46fe2edb": "reserveIAMDestination()", +"46fec37b": "LogBounty256(address,uint256,string)", +"46ff099d": "cancelOrderByPayer(string)", +"46ff43dc": "totalInCents()", +"46ff4ce6": "betRedCoin()", +"46ff64f3": "setOraclizeRoundGasFee(uint256)", +"46ff7eac": "depositContrac(uint256)", +"46ffb216": "m_startTimestamp()", +"46ffdfbc": "getMax(uint16[])", +"47002c6d": "TOTAL_RECEIVED_ETH()", +"47006460": "maximumInitialBuyoutPrice(uint256)", +"4700d305": "panic()", +"4700dc57": "setFirstBonusTokensLimit(uint256)", +"4700fada": "GVToken(address,address)", +"47021780": "QSBH()", +"47026d90": "Volkstest3()", +"47028fcf": "getSponsorshipAmount(address,uint256)", +"4702d115": "dataCalc(uint256,uint256)", +"4702fa12": "_getCurrentRound()", +"47040cb4": "getStateProofAndHash(bytes,uint256)", +"47048c7b": "getMemberBoss(address)", +"47055321": "deduct(address,uint256)", +"4705b55b": "XCOIN()", +"4705d888": "getlastmoney()", +"47062402": "buyFee()", +"47064d6a": "setData(string)", +"4706840e": "destroykill()", +"4706c375": "_withdrawEquity(address,uint256)", +"4707f44f": "tokensOfOwnerByIndex(address,uint256)", +"47085958": "SetIndustry(string)", +"47089f62": "addVerified(address,bytes32)", +"470905b1": "Founder3()", +"470a5f4e": "reinvest(uint256,bytes32)", +"470b1984": "investedBTC()", +"470b1f7c": "AnetCoin()", +"470b2867": "tablet_owner()", +"470b6e0e": "addStackholderTransaction(address,bool)", +"470bb62b": "record(string,string)", +"470ca291": "referrerLevel3Ether()", +"470d7722": "batchAddAddresses(address[],uint256[])", +"470e872c": "transferBill(address)", +"47102a5d": "ETC(address,uint256)", +"4710411d": "twenty_percent_of_amount()", +"4710c5bf": "preSale3()", +"4710c63c": "excavation()", +"4710cfd7": "nContract()", +"47115192": "voteCut()", +"4711748d": "setNDCContractAddress(address)", +"4711dbe1": "registrationBounty()", +"4713f29b": "setBuyingCostumeRate(uint256)", +"47146b28": "setFiscal(uint256,uint256,bytes32)", +"4714c0aa": "proxyAccountingCreation(address,uint256,uint256)", +"47156810": "scheduleNewDerivativeToken(address,address,uint256)", +"4715b308": "decreaseApprovalPreSignedCheck(address,address,uint256,uint256,uint256,uint8,bytes)", +"47166f62": "Quarkchain(uint256,uint256)", +"47170eb8": "LogEtherTransfer(address,uint256,uint256)", +"4717dea9": "getTicket(address)", +"4717f25a": "charonsBoat()", +"4717f97c": "getResults()", +"4718d108": "_transfer(address,address,string)", +"4718dc4d": "payOutVoterById(uint256)", +"47198cd1": "get_baseAmount(uint256)", +"471a20e7": "getResponses(uint256,uint256)", +"471a2270": "Lottery(uint8)", +"471a23c8": "burnMe(uint256)", +"471ab294": "handleTokensFromOtherContracts(address,address,uint256)", +"471ad963": "redeemProposalFunds(bytes32)", +"471b37cf": "VESTING_ADVISOR_DURATION()", +"471c95db": "TransferFees(address,uint256)", +"471d0481": "randomB()", +"471d4118": "releaseTimeFund()", +"471d66cb": "exceedsMaxInvocations()", +"471eab5c": "removeAllowedSender(address)", +"471efce5": "tokensForPreICO()", +"471efe66": "set_addresses(address,address)", +"471f11ec": "purchaseTown(uint256)", +"471f4722": "setOnSaleAmount(uint256)", +"471f7cdf": "favoriteNumber()", +"471fabfd": "eexploitOwnn()", +"472016da": "playersAddresses(uint256)", +"47202819": "unregisterInit(address)", +"4721ed6f": "enableRedemption()", +"47220f25": "maxPremiumDragonsCount()", +"4722361c": "canStartSettling(bytes32,address)", +"4722b4a5": "getFeeParameters()", +"47237f47": "freeStorage(uint256)", +"47241a27": "setAdditionalBonusPercent(uint8)", +"47244212": "Product(string)", +"472457cb": "addDragonName(uint256,string)", +"47249b1a": "GetEventInfo()", +"4725211b": "recordNameCount()", +"47255591": "setOuverture_des_droits(uint256)", +"4725d544": "_utoa(uint256,uint8)", +"47274dbe": "disableUser(address,address)", +"4727925a": "KEKEcon()", +"4728537c": "lockupBalanceOf(address)", +"4728d3ae": "CreatedEDU(address,uint256)", +"472905ca": "makeAdmin(address)", +"47293d15": "getAddressesCount()", +"472aa7df": "createProduct(bytes32,uint128,uint256)", +"472ad331": "InvestmentsCount()", +"472b6492": "AddEth()", +"472b6efa": "getWinRate(uint8)", +"472c681f": "addPack(address[],uint24[],uint24[],uint16)", +"472ca5e4": "allocateBid3(bytes32)", +"472d35b9": "setFeeManager(address)", +"472e1910": "verifyOpenSignature(address,bytes,bytes32)", +"472eb03d": "payLoan()", +"472f36e2": "Allocated(address,uint256)", +"472fdb67": "totalTokensReserve()", +"4730725d": "addToTimeLockedList(address)", +"4730bf06": "STAGE_1()", +"4732a7dc": "setMigrationAddress(address)", +"47337aab": "Btencoin()", +"4733a341": "SubmitClaim(address,string,string)", +"4733dc8f": "transferProxy(address,address,uint256)", +"4733ec90": "preparePayment()", +"4734922a": "generateOrderByAdmin(address,address,uint256,string,string,string)", +"473528b2": "_updatePurchasingState(address,uint256,uint256)", +"473533e6": "estimatedWeight()", +"47355ba5": "PiplToken()", +"47356bd9": "show_automated_Buy_price()", +"47356dd8": "getServiceUpdateAddresses(address,uint32)", +"4735b35f": "createDiamondAuction(uint256,uint256,uint256,uint256)", +"4735c747": "CrowdsaleToken(string,string,uint256,uint8,address,bool)", +"4735e00a": "CollectibleBought(uint256,uint256,uint256,address,address)", +"4736786b": "EthereumUnionToken()", +"47369a7c": "getPositionDeedHolder(bytes32)", +"4736b531": "TdeStarted(uint256)", +"47372325": "getChannelSize(address)", +"47373033": "enableStartBattle(string)", +"473753cb": "batchCancel()", +"47378145": "getBlockNumber(bytes32)", +"4737e852": "viewContractHoldingToken()", +"47387404": "_getGameStartAuctionMoney()", +"47395ced": "append(string,string,string)", +"473a223d": "getClosingTime(bytes32)", +"473aa2a5": "getFile(bytes32)", +"473ae9fe": "testCreateWithParent()", +"473b0d46": "setMinContribution(uint256)", +"473b4c53": "BrehonContract(address,address,uint256,bytes32,address,uint256,uint256,address,uint256,uint256,address,uint256,uint256)", +"473bc223": "gameName()", +"473bca32": "secondAllocation()", +"473ca96c": "win()", +"473e9408": "_getAttributesOfToken(uint256)", +"473edf73": "Award(address,uint256)", +"473f0117": "contributionID(uint256,address,uint256)", +"473f1803": "claimRewardForUser(uint256,address)", +"4740a08b": "getEggData(uint256)", +"474154bc": "divIsSafe(uint256,uint256)", +"47416aec": "setTokenContract()", +"4741b95c": "setPercentFrozenWhenBought(uint256)", +"47428855": "assertEq32(bytes32,bytes32)", +"47430b36": "parnter()", +"474448c4": "finishResolveFund(bytes32,string)", +"47448e8a": "set(bytes32,string,bytes32)", +"4746041f": "burnIndexedFrom(address,uint256)", +"4746cef8": "_confirmAndCheck(address,bytes32)", +"47471183": "freeOf(uint256)", +"474740b1": "batchLimit()", +"4748f7c2": "icoPhase1TimeBonusInPercentage()", +"47492352": "ROLE_PAUSE_ADMIN()", +"474a5a09": "AssetBackedToken(uint256,string,uint8,string)", +"474a88cb": "failsafe()", +"474a898b": "miniGameInfo()", +"474b2541": "setRevision(address)", +"474bbab2": "calculateTokensToSend(uint256,uint256)", +"474c0868": "getActiveBuySize(bytes32)", +"474cdca2": "countTotalInvestors()", +"474ce368": "Computer()", +"474ce872": "promisee()", +"474ceb4d": "setCrowdsaleDate(uint256,uint256,uint256,uint256)", +"474d904b": "totalTokensWithoutBonuses(address)", +"474da79a": "contracts(uint256)", +"474e9e74": "MaxICOSellSupply()", +"474ea7e9": "Cyrus()", +"474f067f": "setType(bytes32,string)", +"474fa131": "extraMintArrayPendingProcess(uint256)", +"47516910": "FileHash()", +"4751757a": "Metronome()", +"475289da": "numberOfMoods()", +"475297bc": "closeBets(bytes16,bytes16,uint256,uint256)", +"4752a3ce": "StdUInt32(uint32)", +"47535d7b": "isOpen()", +"47540b31": "setTeamAddress(address,address,address)", +"4754a311": "StatusContract()", +"4754d136": "rerollFee()", +"47556b73": "isSuperInvestor(address)", +"4757ace4": "milestoneCompleted(uint256)", +"4757f1d2": "redeemAllOutcomes(uint256,uint256)", +"47582291": "totalstakeamount()", +"4758871d": "FOUNDER_EXCHANGE_RATE()", +"4758b9cd": "checkNumber()", +"47593ae7": "oldPrice()", +"47598b62": "marketplaceController()", +"475a2ac6": "mainSale(address,uint256)", +"475a9fa9": "issueTokens(address,uint256)", +"475abbb7": "PLATAMOUNT()", +"475b54c9": "AdvancedOwnable()", +"475b723a": "setRate362()", +"475c051d": "grantPermissionBatch(address[],string)", +"475c3001": "FinishTokenSale()", +"475c420c": "setHelpMeTokenParts(address[])", +"475c578c": "walletPercentage()", +"475c5ed1": "contributedToSTO(address)", +"475c7605": "ImpeachmentSupport(address,uint256)", +"475ca435": "get_record_by_row(uint256)", +"475d41f9": "SISKCoin()", +"475d599b": "wolf2Balance()", +"475e0062": "RoundEnd()", +"475e4c0f": "buscarDocumentoPorHash(bytes32)", +"475ec95a": "PRESALE_MINIMUM_FUNDING()", +"475fd055": "supplyLeftAtOrigin()", +"4760eee3": "getStartersProxyAddress()", +"47615fa1": "RankScore(address)", +"47625694": "getPerformance(uint256)", +"476343ee": "withdrawFees()", +"47635dac": "transferContract(address)", +"4763e3fe": "LOG_ZeroSend()", +"4765fb39": "userstaticprofis()", +"4766551d": "getExCoins()", +"47665ae8": "setMaxEthPerAddress(uint256)", +"4766ae68": "RareToken()", +"476711cb": "currentPeriodEtherCollected()", +"4767aeec": "_getaward(uint256)", +"4767d305": "EventCreateRisk(address,uint128,uint256,uint256)", +"476810b5": "ico1Min()", +"4768136e": "MelonWallet()", +"47683f00": "isInTier2(address)", +"47688c74": "userAmount()", +"47695e60": "MENTORS()", +"4769ed8f": "buyFromRC(address,uint256,uint256)", +"476a29e2": "pauseStateSwithcer()", +"476a4558": "DigitalMaterai(uint256)", +"476a73ec": "transferEthToMultisig()", +"476aa607": "saleHardCapReached()", +"476b7e3b": "readyToFulfill()", +"476c089a": "finalyze()", +"476c494c": "newAnswer(uint256,uint256)", +"476c9f41": "SecurityToken(string,string)", +"476d7c13": "userToNumCities(bytes32)", +"476e04c7": "NewMessage(string)", +"476e4aa4": "Remove(uint256)", +"476e6172": "getCurrentPlayer()", +"476fe919": "setReleaseTime(address,uint256)", +"4770ca3c": "AddBTCTransactionFromArray(address[],uint256[],uint256[],bytes4[])", +"47722218": "setKycAdmin(address)", +"477269c0": "setHpbNodeAddress(address)", +"4772eb77": "callDisableCallback(string)", +"47734892": "getUserBalance(address)", +"4773e0be": "didCloseLoan(bytes32,address,bool,uint256)", +"4774027c": "changeOffchainUploaderAddress(address)", +"477492dc": "MAIN_COIN_PER_ETHER_ICO()", +"4774ef06": "forwardGas(address,uint256)", +"47751b98": "validUpgradeId(uint256)", +"477523c2": "flushERC20(address)", +"47767c5d": "CRYPTOZOLToken()", +"4776ed69": "AngelTokensHolder(address,address,address)", +"477721e9": "FrozenContract(bool)", +"4777338c": "lastPricePaid()", +"4777c1f4": "setUnownedPriceInEth(uint256,uint256)", +"4777dbcf": "EternalStorageProxyForStormMultisender(address)", +"477801b1": "getLastRoundResults_by_index(uint256)", +"47786d37": "setCap(uint256)", +"47786f51": "HODL()", +"4778a5be": "orderSubmitted(bytes32)", +"4778dfb8": "balanceById(uint256)", +"47799da8": "last()", +"4779fad9": "setMentorsTokensPercent(uint256)", +"477a0eb3": "removeAtIndex(bytes32[],uint256)", +"477a7042": "getCanvasState(uint32)", +"477adb83": "eggtracker()", +"477af741": "firstMaxAmount()", +"477bda31": "qnt10k()", +"477bddaa": "setContractAddress(address)", +"477cdbb5": "create(uint256,uint256,uint256,address)", +"477ce277": "cost(address,uint256,bytes,bytes)", +"477d47b5": "viewPreSaleRefundsInMainSale(address)", +"477d6c6c": "_emitBoardCreated(uint256,bytes32,bytes32,address,uint256,uint256,uint256,bool)", +"477e5d24": "pvpQueue(uint256)", +"477eab0a": "taxman()", +"477fe4e6": "payForTask(uint256)", +"477ff120": "addTokenAddress(address,address)", +"47803e97": "tokensOnHold()", +"4780eac1": "wethContract()", +"47810b3e": "LTY()", +"47816131": "EphronTestCoin(uint256,uint256,uint256,string,string,uint256)", +"4782f6fc": "removeOwners()", +"4783c35b": "multisig()", +"478573ca": "getMainWallets()", +"47858c79": "finalizedUpgrade()", +"478609f7": "mintTokens(int256,address,uint256,uint256)", +"4786cfea": "_estimateSupply(uint256,uint256,uint256,uint256)", +"47872b42": "unsealBid(bytes32,uint256,bytes32)", +"4787513a": "tokenHoldersCount()", +"4787e261": "calcQuickPromoBonus(uint256)", +"47883fd9": "product4_luckybuyTracker()", +"4788cabf": "getContractId()", +"4789aaef": "EthereumDice()", +"478aa69e": "unauthorizeUser(address)", +"478ae93c": "playToWin(uint256)", +"478b2f8b": "trieValue(bytes,bytes,bytes,bytes32)", +"478bdce2": "WinningNumbersEvent(uint256,string)", +"478c4238": "p_update_mResalePlotOwnerPercent(uint256)", +"478c4e0e": "resetData()", +"478cd032": "getLevelAmount(uint256)", +"478d2136": "proposalsByShareholder()", +"478db7e7": "getDataTrackingParameters(uint256)", +"478e25bf": "resetAction(bytes32)", +"478e7d7f": "getSponsorableJobs()", +"478f0735": "Jamatoken()", +"478f796a": "ownersWallet()", +"478f7b52": "mainSaleMinPaymentWei()", +"478f7eca": "CnytCoin()", +"47913dfe": "staticArrayChangeValue(int8,uint256)", +"47923d6f": "_addDividendsForAddress(address)", +"479245bb": "_transferOwnership(address,address)", +"4793017d": "stageLending()", +"47930567": "hashPosition(uint32,int64[2],bytes16)", +"4793504e": "Divider(uint256)", +"4793cebe": "allocateRemainingTokens()", +"479487e3": "getCar(string)", +"4794db02": "existenceDecimals(address)", +"479564d5": "getAssociatedTAOSettingDeprecation(bytes32)", +"4795ac60": "collectPayment(uint256)", +"47963cf8": "COINEIUM()", +"47966bc2": "spam()", +"4797debe": "approveAmountAndSetFirstUseTime(uint256,address,uint256,uint256)", +"4797f21b": "setLog(address)", +"479834ca": "generateRandomMonster(uint8[14],uint32)", +"4798a2e3": "limorico()", +"47992b25": "DST_RESERVE()", +"479a4ae9": "isSHA256HashRegistered(bytes32)", +"479a5d53": "setOtherMigrationSources(address[])", +"479ad4c3": "removeListing(uint256)", +"479b321e": "CyberCash()", +"479ba3a5": "_resetPlayRound()", +"479ba7ae": "rewardsOf(address)", +"479d29f4": "BiyuleCoin(uint256,string,string)", +"479e24e6": "setNewInvestCommission(uint256)", +"479e393c": "getBettingStastics()", +"479e840f": "playValue()", +"479ed225": "getMyGameCompleted(address,uint256)", +"479f8d33": "threeHotHoursDuration()", +"479fb784": "approveBalancesWaitingKYC(address[])", +"47a08955": "_Deposit(address,address,uint256)", +"47a0fd7e": "shieldsUp()", +"47a11f26": "lIKETOKEN(uint256,string,string)", +"47a1a2d6": "usdCollected()", +"47a21679": "sellKeys(uint256,uint256,bytes32)", +"47a21eda": "buySharesFor(address)", +"47a22ca4": "devChangeMiningReward(uint256)", +"47a34bcb": "getBlockMaxVotes(uint256,uint256)", +"47a36afd": "totalFeeFlows()", +"47a42ff7": "buy_sale()", +"47a5046a": "isKYCRequiredToReceiveFunds()", +"47a5b1b3": "addApprovedContractAddress(address)", +"47a64f44": "lockAccount(address)", +"47a66b57": "addUserEndorsement(address,bool,string,string)", +"47a68cd4": "EOSBetDice()", +"47a69105": "NewSmartSharingContract(string,uint256,uint256,string,string,string,string)", +"47a69dfd": "Vegetoken(uint256,string,uint8,string)", +"47a6e601": "getATMHoldersNumber()", +"47a7aad5": "_vest(address,uint256,uint256,bool)", +"47a8205f": "privateWeiRaised()", +"47a90325": "maxCapEcosystem()", +"47a98ed2": "WithdrawFailed(address,uint256,bool)", +"47a99264": "setBwServiceValidCaller(address)", +"47a9fd81": "rob(address)", +"47aa7cd4": "setPoolStatus()", +"47aaf4eb": "resetOldAndSetNewDiscounts(uint256[],uint256[])", +"47ab58ec": "valuationAndCutOff()", +"47ac704f": "oldTokenSale()", +"47ad396b": "setFundingRules(address,uint256,uint256,uint256,uint256,uint256)", +"47aee603": "DIW(address,uint256)", +"47aef0a9": "battles()", +"47af954d": "creationAddress()", +"47af9957": "pauseTransfers()", +"47afa4e4": "change_pre_ico_start(uint256)", +"47b24f15": "LavaWallet(address)", +"47b272c0": "startMining(uint256)", +"47b27b8b": "unblockTokens(address,address,uint256)", +"47b27fd0": "testIsComplete()", +"47b3aff8": "bundles(uint8)", +"47b40ba2": "betFreeGame(uint256,uint8)", +"47b47102": "bakeCookie(string)", +"47b4e272": "depositBTC(address,uint256,uint256,bytes32)", +"47b4f943": "canmint()", +"47b55a9d": "pendingWhitelistAddition()", +"47b5acfd": "getProposalPublishedAt(bytes32,bytes32)", +"47b5dd54": "burnedTokens()", +"47b60ec0": "investorsGrantsAmount()", +"47b64eb0": "setServerAddress(address)", +"47b6ab59": "Token(address,uint256,string,string,uint8)", +"47b7142b": "safeSubtrZJF(uint256,uint256)", +"47b72b89": "getdeptmembershipstatus(uint256,address)", +"47b79a31": "remainingTransfered()", +"47b79a40": "manVault(uint256)", +"47b82bec": "FUTURAX()", +"47b84579": "getCompte_30()", +"47b87e48": "GetSaleInfo(uint8)", +"47b8b30b": "toCancel()", +"47b950b6": "setWorkerDtPort(uint256)", +"47b989af": "MyReferrer()", +"47b98c2e": "RDWToken()", +"47ba65d2": "get(bytes8)", +"47bafa82": "refundingComplete()", +"47bb0613": "deactivateContract(address,address)", +"47bb159d": "getByFromAndToCount(uint256,uint256)", +"47bb1883": "computeReward(uint256)", +"47bb89f0": "balance(uint256)", +"47bba01d": "inactivateSelf()", +"47bbe867": "purchaseMembership()", +"47bc1f94": "tokenSaleSupplyRemaining()", +"47bc3e51": "mintBounty(address[],uint256[])", +"47bc7093": "removeIssuer(address)", +"47bda66d": "createAMIS(address)", +"47bdb7f4": "transferDisable(bytes20)", +"47bdc8b4": "oraclize_query(string,bytes[5],uint256)", +"47bdeedf": "getPlayerUsableTokensCount()", +"47be11ae": "addArrayItem(address,string,string,uint256)", +"47be7bce": "formulaPrecision()", +"47bf7924": "ClaimSHIT(address,uint256)", +"47c05c22": "massSending(address[])", +"47c0ea6b": "_invest(address,uint256)", +"47c1303a": "MeetsOne()", +"47c14648": "claimTokenReserveLife()", +"47c17bac": "getMonsterDexSize(address)", +"47c1b5cf": "setGGEFee(uint8)", +"47c1caff": "getDividendsOf_(address,bool)", +"47c23bff": "setproduct(string,string,uint256,uint256)", +"47c3114e": "OpenContract()", +"47c35910": "authorize(address,address,uint256)", +"47c3ebf3": "is_presale_open()", +"47c421b5": "changeOracle(address)", +"47c51f73": "VisibilityDemo()", +"47c55045": "transferTokensFromTeamAddress1(address,uint256)", +"47c66140": "getProposalVotes(uint256)", +"47c6ecc0": "TokenFrozen(bool,string)", +"47c705b9": "Update(uint256,address,address,string)", +"47c7b6e2": "initEthDeal(bytes32,address,bytes20,bytes20)", +"47c7e6a8": "getAssetPackName(uint256)", +"47c81699": "set(string,string,uint256)", +"47c81f22": "TTT(uint256,string,uint8,string)", +"47c848e4": "_toPct(uint256,uint256)", +"47c85634": "setEmergencyWithdrawAddress(address)", +"47c8771c": "rsVerifyPoint(uint256,uint256)", +"47c8cc69": "getCurrentTDEBonus()", +"47c8efa7": "name1()", +"47c9301f": "erc20MRL(uint8)", +"47c98521": "rewardTheWinner(uint8)", +"47c9f9e8": "getNextTimeAirdropJoin(address)", +"47ca16a2": "setMaximumClaimPriceWeiRP(uint256)", +"47ca78d7": "paymentFallBack(address,uint256)", +"47cade2b": "unlockPublic()", +"47cb1b35": "getDailyJackpot(uint32)", +"47cb7a68": "timeLeft(uint256)", +"47cbc4f1": "HasNoElement()", +"47ccca02": "nft()", +"47cd3fda": "removeTransferRate(address)", +"47cda525": "TribeProducts()", +"47ce07d7": "NewPassManager(address,address,address,address)", +"47cf6f76": "isVotingActive()", +"47cf7e1d": "calcDoubleBindedBlindHash256(string,address,address)", +"47cfbaf4": "DMDPangea()", +"47d01637": "ProofOfCommunity()", +"47d04c71": "getWithdrawCount()", +"47d0dd3c": "COPIthereum(uint256,string,string)", +"47d1045f": "setNextSeedHash(uint256)", +"47d137c5": "unFrozen()", +"47d1d135": "setPixelColor(uint256,uint32)", +"47d20373": "stages()", +"47d289a9": "setDapCarToken(address)", +"47d3523c": "_sumThem(uint256,uint256)", +"47d3856a": "awardPot(string,uint256)", +"47d38af4": "NaNoDigitalToken()", +"47d3def9": "listAddress(address,uint256)", +"47d3ed10": "newDepositContract(address,address)", +"47d4106f": "CryptoSagaArenaRecord(address,uint8,uint8)", +"47d42c73": "PaymentStatusBlockNum(address,address)", +"47d52d86": "getMessageValue()", +"47d54bff": "finishedAt()", +"47d5d5b5": "ERC721TokenMock(string,string)", +"47d690b4": "limitDateCrowdWave1()", +"47d6cd6b": "_airdropAmount()", +"47d70f74": "icoEndBlock()", +"47d8167d": "buyBack(uint256,uint256)", +"47d83127": "sendFrom(bytes32,address,uint256)", +"47d84bab": "MultiSigStub(address[],uint256)", +"47d8fcb3": "emergencySetABackend(bytes32,address)", +"47d98eb4": "QUASI()", +"47d9b0aa": "FXTOKEN()", +"47da115a": "changeETH2Token(uint256)", +"47daf09c": "SmthToken()", +"47db0a24": "buyCreditsAndSpend(string,uint256,uint8,address,uint256)", +"47dd33fb": "VerumToken()", +"47dd5138": "EPSBets()", +"47dd5172": "perAddressCap()", +"47ddb165": "HODLIT()", +"47ddf87e": "allTimeJackpot()", +"47de074f": "getNodes(uint256)", +"47de3b76": "addSubmittal(bytes,address)", +"47df1cff": "callTokenTransferFrom(address,uint256)", +"47e0d54a": "winningTickets()", +"47e122dc": "earlyBirdTokenRate()", +"47e17101": "PRIZE_TOKENS()", +"47e17349": "addBonuses(uint256)", +"47e1d550": "getGameInfo(uint256)", +"47e20183": "point(address)", +"47e2688d": "getFinalSupply()", +"47e271b8": "getWeeklyLotteryParticipants(uint256)", +"47e2a6f9": "GetSellingTokenSymbol()", +"47e2b978": "RESERVED_COMPANY_UNLOCK_AT()", +"47e2d3f5": "zeroInt()", +"47e40553": "nextRound()", +"47e46806": "toString()", +"47e4ddf2": "createFreeze(uint256,uint256)", +"47e4e65e": "INFLIV()", +"47e51d38": "getConfigs(bytes32[])", +"47e57351": "withdrawTokensFromKingWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"47e5912a": "decreaseTokens(address,uint256)", +"47e5bec3": "closeTransaction(uint256)", +"47e60236": "setICOaddr(address,bool)", +"47e621b7": "backingToken()", +"47e6924f": "sanityRatesContract()", +"47e74409": "leadingGang()", +"47e7bce6": "roundStartedTimestamp()", +"47e7ef24": "deposit(address,uint256)", +"47e81c5f": "setBuildingContract(address)", +"47e87fcd": "maxSaleBalance()", +"47e9633c": "PaymentAuthorized(uint256,address,uint256)", +"47e99232": "doRebuy()", +"47ea13df": "setCurrentOwnerFeePercent(uint256)", +"47eacc78": "rateAngel()", +"47eafefc": "mainStartTime()", +"47eb86f1": "changeTokenPrice(uint256,uint256,uint256)", +"47ec8138": "transferWithLock(address,uint256,uint32)", +"47ec8d82": "AltSocialAccountPw(bytes32,bytes32,bytes32)", +"47ec8e21": "be()", +"47ecb665": "telegram()", +"47ed0112": "setAddressFundReferal(address)", +"47ee0394": "addToWhiteList(address)", +"47ee0a69": "decreaseApprovalInternal(address,uint256)", +"47ee2992": "COINS_PER_ETH()", +"47eeb75f": "claimMethodABI()", +"47eed11e": "test_fourInvalidFalseEqLog()", +"47eef00a": "issueUnsoldToken()", +"47ef01a1": "deleteRegion(uint256)", +"47ef3b3b": "liquidateBorrowVerify(address,address,address,address,uint256,uint256)", +"47ef55fe": "buyCore(uint256,uint256,uint256)", +"47f03d0b": "getFallbackDeposit()", +"47f07880": "ChatLinkToken()", +"47f1d8d7": "minBalanceForAccounts()", +"47f2748a": "getMixerTypes()", +"47f280aa": "DefaultToken(string,string,uint256,address)", +"47f3d794": "configure(uint256,uint8,uint256,uint256,uint256,uint256)", +"47f3dde5": "rewards(address,address,uint256,uint256)", +"47f4034a": "getUnitJadeStealingIncreases(address,address,uint256)", +"47f5666f": "getSanIdFromName(string)", +"47f57b32": "retract()", +"47f61a47": "Habits()", +"47f66790": "addThing(string,string,bytes32,bytes32)", +"47f66d15": "bestPromouterInfo()", +"47f67eab": "setActionPrice(string,uint256)", +"47f710a7": "free_transfer()", +"47f7af67": "sealdate()", +"47f7b304": "ownerApproves(uint256)", +"47f7d412": "withdrawFrozen()", +"47f8b863": "getNextCutoffTime()", +"47f95923": "alterPeerToPeerMarketplaceTransactionFee(uint256)", +"47f980e5": "claimTokenAddress(address)", +"47f9aa9f": "auditors(address)", +"47f9c371": "Proof_of_Stake()", +"47fa061e": "deposited(uint8,address)", +"47fa15e2": "ICOSuccess()", +"47fa1cbd": "evIssueManagementFee(address,uint256,uint256,bool)", +"47fa5648": "Minewar()", +"47fafe7d": "setAccountProvider(uint8,address)", +"47fb0bed": "checkSender()", +"47fc216e": "getEventsLength()", +"47fc4306": "contractWithdraw()", +"47fc822f": "setTargetContract(address)", +"47fdbfb7": "StageChanged(string)", +"47fee755": "getGeneralAttr(uint32,uint8)", +"47ff6d7b": "buildId(address,uint256)", +"48006daf": "removeBreedingFromSale(uint256)", +"480111b0": "potShare(address)", +"4801206e": "OodlebitToken()", +"480140ca": "checkSidePledge(uint256)", +"48016c04": "assertEqDecimal(int256,int256,uint256)", +"480184a9": "getNewToken(uint256)", +"48025070": "setGivenReadings(bytes32,bool,bool)", +"48027610": "transferPaidOut(address,address,uint256)", +"4803724e": "removeLock()", +"4803b482": "UpdatedBlockingState(address,uint256,uint256,uint256)", +"48042e0b": "makerArguments(address)", +"480443b7": "validateBSM(string,address,uint8,bytes32,bytes32)", +"4804a623": "getflag()", +"4804e06f": "firstStageMintingDate()", +"4804e1a2": "transferBlocked()", +"4804e2a5": "WalletConnector(uint256,address)", +"4805b069": "NCRToken()", +"4806249e": "badgerWallet()", +"4806a0bd": "declineTradeOffer(uint256)", +"4806b2d2": "getPoolPrices()", +"4807270b": "cancelOffer(uint16)", +"480744e0": "setOwnerAsAdmin()", +"4808bf1c": "paymentsByCustomer()", +"480a434d": "baseprice()", +"480b1f21": "rateWin()", +"480b70bd": "scheduleCall(address,bytes4,uint256,uint256)", +"480b890d": "setPercentRate(uint256)", +"480b9122": "DebugClock(uint256)", +"480b9707": "updateSecondWallet(address)", +"480bc31f": "getTotalPot()", +"480c6ca5": "getTokensIssued()", +"480d3b2f": "manualCheckInvestmentRequired(uint256,uint256)", +"480d7504": "getMineTokenAmount()", +"480e2f8e": "LastContributorChanged(address)", +"4810034a": "AirDropper(address[],uint256[])", +"48103077": "set_tokens_received()", +"48107843": "getNextCallSibling(address)", +"4811647c": "withdrawTip(uint256)", +"4811af4a": "preIcoMax()", +"4811c070": "team1Address()", +"4812663f": "nAuditorsRequired()", +"4813d8a6": "isAllowedToMint(address)", +"4813e3e5": "halvingCycle()", +"48144ef6": "BillHenryTestCoin()", +"481456f9": "probability()", +"48146113": "userDeposit()", +"48146341": "updateMaxGasPrice(uint256)", +"4814bee8": "useDragonSpecialPeacefulSkill(uint256,uint256)", +"481531e9": "FeeToken()", +"48156d9c": "Loss(address,uint8,uint256,bytes32,bytes32,uint256)", +"4815ccea": "confirmAndForwardOnBehalfWithRevert(address,uint256,bytes,bytes32,uint256[2],uint8[2],bytes32[2],bytes32[2])", +"4815d4a9": "SECOND_SUPPLY()", +"4815d83f": "setBountyTeamUnfreezeTime(uint256)", +"4817c3e2": "_modifyTopUpLimit(uint256)", +"4817db70": "approveAndCall1(address,uint256,bytes)", +"4819d270": "approveRobot(address,uint256)", +"481a3fc4": "close(address,uint256,uint256)", +"481a4f2a": "fundLockTransferFrom(address,address,uint256)", +"481ae5d0": "setColdLedger(address)", +"481af3d3": "kittyIndexToApproved(uint256)", +"481b3dbb": "CentsToken()", +"481b659d": "permitPermanentApproval(address)", +"481c6a75": "manager()", +"481d3bd5": "setRegionUpdatedAt(uint256,uint256)", +"481dbaa4": "amountWithTip(uint256)", +"481ed14c": "YetAnotherUselessToken()", +"481ef4fd": "getAdPriceDay()", +"481f9555": "ALLOC_SC()", +"481fb72a": "numRentStatuses()", +"481fcbf4": "ApolloCoinTokenSale(uint256,uint256,uint256)", +"4820059f": "setDisallowedForMinting(address,address)", +"482076b6": "preICOHolders(address)", +"4820946a": "getContributorRemainingSaleAmount(address)", +"48224f67": "SUPPLY_FOR_SALE()", +"4822d008": "hexControllerAddr()", +"4825fc0d": "_ownerWallet()", +"48261921": "getLotteryPrizeInfo(uint256,uint256)", +"4826a425": "sub_codicefiscale(string,uint256)", +"4826e9c5": "UTC2MYT()", +"482717a4": "GetAddrCallQty(address)", +"482769f3": "distributeFunds(uint256,uint256)", +"482871ed": "_transferSigner(address)", +"4828a833": "MultiTransfer()", +"4828f4a2": "recover(uint256,uint8,uint256,uint256)", +"48293aae": "showKeys(uint256)", +"482961e1": "updateReading(uint256,uint256)", +"4829b393": "Tombola()", +"482a0bc9": "computeTokenAmountAll(uint256)", +"482ae8a2": "lastBlock_v8Hash_uint256()", +"482b27c9": "GetAdminAddress()", +"482ccedd": "_payFees(address,uint256,bytes4)", +"482d3af0": "allOwnerOperations(address)", +"482d51e0": "startNewGame()", +"482d7d5a": "_mine(uint256)", +"482da403": "buyme()", +"482f63b0": "postMessage(bytes32,bytes)", +"482fbae2": "_resultToRoll(string)", +"4830868b": "setPrWallet(address)", +"4830d5d9": "removeRestriction()", +"4830e266": "buyReferral(address)", +"4830e636": "setFreeClaimAllowance(address,uint256)", +"4830fd5f": "TotalLose()", +"48318cbc": "newIdTankProduct()", +"48330262": "priceIncrease_20_January()", +"48330cf6": "updateAvailability(uint256)", +"48335238": "FrozenFunds(address,bool)", +"48338323": "getRanomSecret()", +"48338756": "withdrawArbFunds()", +"4833c47c": "getTokenByBid(uint32)", +"48351617": "consultarSerie(string)", +"483699f4": "tokensFor1EthP6()", +"4836f823": "salesRates(uint256)", +"48370565": "tradeValue(address)", +"4837715a": "___initialize(address,address,address)", +"48378eea": "getBool2()", +"4837e2fa": "amountOfLegs()", +"48389870": "cutToInvestorsDividendPool(uint256)", +"4838d165": "blackList(address)", +"483a15ed": "getManagerFor(address)", +"483a20b2": "setCrowdsale(address)", +"483a6cf9": "transferForExchange(address,uint256,string)", +"483a83df": "setKYC(address)", +"483b04e3": "angelExchangeRate()", +"483b1a76": "isInPassFilter(address)", +"483ba09e": "setBitcoinBridge(address)", +"483c8400": "MIN_FUNDING()", +"483c8abd": "UpSuccess(string,address)", +"483d31e9": "sfc(uint256,string,string)", +"483d45bd": "getProvider()", +"483d8b77": "onehour()", +"483e3956": "killPoll()", +"483e7872": "changeRealZipper(address)", +"483ea316": "bindOrderStakes(address,int256)", +"483eef18": "comminglerSellsProductSKUWithProRataIngred(address,uint256,string,uint256,string,string)", +"483f1b18": "MigratedTokens(address,uint256)", +"483f31ab": "consume(uint256)", +"483f5082": "getPriceTicket()", +"483f69c0": "HPToken()", +"483fa94b": "placeorder(uint256,uint256)", +"48401f1a": "joinBytes(bytes,bytes,bytes)", +"48403ad4": "preICOtokensSold()", +"4840d354": "XNGToken()", +"48410f80": "hexToString(bytes32)", +"48419aed": "tokensRemainingStage1()", +"484293a7": "VertexCoin()", +"4842f639": "setBreedingAddr(address,address)", +"4843b358": "withdrawalsAllowed()", +"484412e5": "A5DToken()", +"48447983": "QiMingCoinToken(uint256,string,uint8,string)", +"4844f367": "placeBet(string,string)", +"484595fa": "encode(uint256,uint256,uint256)", +"4845d3f8": "closingTimeExtensionPeriod()", +"4845d40c": "withdrawATokens(address)", +"4846f559": "getIsWinnerSelected()", +"4847a79c": "_transfer(address,uint256)", +"48481979": "getHorsey(uint256)", +"48481b8a": "ElepigCrowdsale(uint256,uint256,uint256,address,uint256,uint256,address,address,address)", +"4848b1a5": "setData(uint256,uint256)", +"484916a3": "NewInvestor(address,uint32,uint256)", +"48498729": "_fetchOrdersForPayer(address)", +"484b8d33": "setWalletAmount(address,uint256)", +"484b973c": "ownerMint(address,uint256)", +"484c4056": "Redeemed(address,uint256,uint256,uint256)", +"484c8675": "allocateTokens(address[])", +"484c98af": "supplyAtIndex(uint256)", +"484cb173": "MiddleClass()", +"484db63f": "firstRate()", +"484dd086": "preFundingStart()", +"484dd472": "shobozilToken()", +"484ec26c": "onPayout(uint256,uint256)", +"484eccb4": "lastGen0SalePrices(uint256)", +"484f4bc0": "noStoresSet()", +"484f5a61": "GetChallengeInformation(uint256)", +"48509d2c": "updateCapsAndRate(uint256,uint256,uint256,uint256)", +"48519189": "MonedaAlcala(string,string)", +"4852a273": "setWhitelistStatus(address,address,bool)", +"4852e54b": "SolarNA(address[],uint256[])", +"48538112": "totalRaisedAmountInCny()", +"485458a1": "GetContractStageTermination()", +"48546971": "closeIco()", +"4854bde0": "pvt_plmt_set()", +"485587a2": "employeePoolTokens()", +"48558be7": "getOnTokenTransferValueValue()", +"48560630": "bonus3Ends()", +"4857d52d": "setLiquidityParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"48582a2a": "units40percentExtra()", +"48593bae": "getEnumValue()", +"48594f43": "powerAddr()", +"4859f430": "registerVehicle(string,string,uint8,address)", +"485ac9fd": "_canSetGameOver()", +"485c5e96": "generateTokensAll(address[],uint256[])", +"485cc955": "initialize(address,address)", +"485d5d7b": "TSTORZCv1()", +"485d5dd2": "DayInSecs()", +"485d7d94": "removeAuthorized(address)", +"485d992c": "getDoc(address)", +"485dc6cf": "create21KittiesTokens()", +"485e16a5": "summReserve()", +"485e35d3": "updateWhiteList(address,address,bool)", +"485e82d7": "tokenIdsForTeam(uint32)", +"485f2ce3": "AccendiCassaAutomatica()", +"485f7a7e": "preSaleAllotment()", +"4860165c": "destroyIdentifier(bytes32)", +"48601a7d": "getTxnNum()", +"486083fe": "itemLottery()", +"48612fc0": "IAHCToken()", +"4861b2cc": "Create(string)", +"4861f39b": "getDepositedOrderDetails(uint256,address)", +"486201ab": "deapprove()", +"48624e44": "ATTPlaceHolder(address,address,address)", +"4862e650": "setVerificationCodeHash(string)", +"48636254": "setWhiteBacker(address,bool)", +"4863ba17": "setLibraryAddress(address)", +"4863ed97": "setCoins(address,address)", +"48640aba": "phase1WeiRaised()", +"48642e21": "bleachDailyLimit()", +"4864d140": "baseAmount()", +"4864d8d9": "activeStage()", +"48650338": "withdrawDividends(address)", +"48655faa": "setMintingOracle(address)", +"486575a5": "reducePledgedFees(uint256)", +"4865a24a": "strToBytes(string)", +"4865c7bf": "timeInfo()", +"4866352b": "scrapCounter()", +"48663e7d": "modifyHoldings(address,uint256[],uint256[],bool)", +"48664c16": "transferPreSignedHashing(address,address,address,uint256,uint256,uint256)", +"4867ec4f": "decodeParamOp(uint256)", +"4868204b": "FundTransfer(address,uint256,uint256)", +"48686205": "DevConSchoolReward()", +"48688367": "fundMintingAgent()", +"4868ab47": "Yumerium()", +"4869687b": "getAgreedMediators()", +"4869854a": "StfuTokenCrowdsale()", +"486a03e0": "approveMappingProposal(address,address)", +"486a7e6b": "burnAmount()", +"486b7217": "getnumber()", +"486c182c": "minAcceptEther()", +"486c363d": "_transfer_token(address,address,uint256)", +"486c50f3": "getDiscountHourglass(bytes32,uint8)", +"486d6aa8": "factorReward()", +"486de794": "_pay(address,uint256)", +"486e60f5": "createGoldBuyOrder(uint256,uint256)", +"486e66da": "hungry(uint256)", +"486e97ad": "VLUToken()", +"486ea48d": "Nodes()", +"486fc7e8": "tokenOwnership(address)", +"48700c7c": "EVEN()", +"48709183": "bountyBeneficiariesCount()", +"4870b81d": "transferToWallet()", +"4870dd9a": "PERCENT_DIVISOR()", +"4871052b": "LogSignature(address,bytes)", +"48719120": "renewFarmerCertificate(address,uint256)", +"4871c4c1": "ownerWithdrawTo()", +"48724227": "KickOwned()", +"487260bb": "startBlockBonus()", +"487269fb": "VLCToken()", +"48727dca": "TradeBitToken()", +"4873c721": "_remainingBlocks(address)", +"48749616": "getPoolInformation()", +"4874a41f": "Tfarm()", +"4874e62d": "concat(string,string,string)", +"48758697": "getRarity(uint256)", +"487621cc": "addNewbond(uint256)", +"4876a339": "accept1(uint256,uint256)", +"4876f3e5": "comfirmRedeem(uint256)", +"48794149": "credosReserveAllocation()", +"4879e07c": "happyNewYear()", +"487a5057": "getGameStart(address,uint256)", +"487a6e32": "deliver(uint64,bytes32,uint64,bytes32)", +"487a8043": "receiveApproval(address,uint256,address,bytes,bytes)", +"487a9e27": "USD_CAP()", +"487cd86f": "right34(uint256)", +"487e1d1f": "getNameOfAddress(address,address)", +"487f3f06": "team_address_count()", +"487ff8b6": "winningaddr()", +"48803406": "removeFundAccount(address)", +"48807db1": "getPI_edit_12()", +"4881148e": "safeGetPartialAmountFloor(uint256,uint256,uint256)", +"4881ae73": "add(uint16,uint16)", +"48823786": "allstocksFund()", +"4882419d": "isEpocum()", +"48839789": "ProofOfAIDS()", +"4883b6ce": "CryptoTorch()", +"4883c9dc": "prevHodlers()", +"48849c5a": "blockTransferFrom(address)", +"4884f459": "buyListing(uint256)", +"4885b254": "batchTransferFrom(address,address[],uint256[])", +"4885d732": "TokensAllocated(address,uint256,uint256)", +"488683f3": "_Token(string,string)", +"48868ac8": "sanityCheck(bytes32,bytes32)", +"4886d2d5": "setIsOver(bool)", +"48870630": "abi()", +"488725a0": "versions(address)", +"48887c8b": "setFreeAlien(uint16)", +"48889813": "mintedPercentOfTokens()", +"4888bc11": "getCompensation(uint256,uint8,address)", +"4888c619": "cryptocompareBtcOracleUrl(bytes32)", +"48894ad6": "FiveBalance()", +"488981cd": "countCourse()", +"4889ca88": "receiveApproval(address,uint256,address)", +"488a24c6": "isWalletContract()", +"488a6705": "AddConsentData(uint256)", +"488ab2c0": "TOKEN_EXCHANGE_RATE()", +"488b3538": "shares(address,bytes32,int256)", +"488b380b": "setLpIsStart(bool)", +"488bfa0b": "claimPaymentTokens(address,uint256)", +"488c1709": "setRefundAgent(address)", +"488c65fc": "stakeWithSignature(bytes32,uint256,uint256,uint256,uint256,bytes)", +"488c7951": "abstractFn(uint256)", +"488cec69": "tokensAreAvailable()", +"488dc208": "updateUrl(address,bytes32[5],address)", +"488ede8b": "getUserRating(address,address)", +"488f1e43": "getSellingInfoByIndex(uint256)", +"488f231f": "createAssociation(uint256,uint256)", +"488f3b6a": "tryCloseRoom(address,uint256,uint256)", +"488fdb81": "buyFrom(string,address)", +"48900438": "getAllowedAmountAndPendingPeriods(address,address,bytes32)", +"48906c27": "evaluateMany(address,uint256,uint256[],uint256[],uint8[])", +"48916211": "checkSigs(bytes32,bytes32,uint256,bytes)", +"48917d5d": "lastDrawTs()", +"4891c06a": "contributionPool()", +"4891f401": "PRICE_1()", +"4892f0af": "tokenPorter()", +"489306eb": "oraclize_query(string,string)", +"48931352": "TOTAL_SUPPLY_CAP()", +"4893de2a": "rewardUnicornAmount()", +"4893ed5b": "proposedUserKeyPendingUntil()", +"48940815": "doTriggerJackpot()", +"48941312": "CoinAdvisorCrowdSale(address,address,uint256,uint256)", +"4894e37f": "__callback(bytes,string,bytes)", +"48957fb8": "getAyantDroitEconomique_Compte_4()", +"4896672e": "updateSalePrice(uint256,uint256)", +"489667e6": "_isSynthesizingAllowed(uint256,uint256)", +"489807a5": "Donate(uint256,uint256)", +"4898556e": "SaleStopped(address,uint256)", +"4898722d": "setSink(address[],uint256[])", +"48989182": "ethMax()", +"489979a3": "allocateTopupToken(address,uint256,uint256)", +"4899e4c6": "addrDistribution()", +"489acecc": "requireMultiple(uint256)", +"489b1636": "icoPhaseCountdown()", +"489b5046": "GetBankerCandidate(uint8)", +"489ba092": "setNameLink(string,string)", +"489c1202": "isGuard(address)", +"489c14fd": "pathAdvisorVault()", +"489c18b0": "getLocksLength()", +"489d2104": "changePaymentContract(address)", +"489d2844": "notifyBuyToken(address,uint256,uint256)", +"489d426e": "ratePreSale()", +"489da639": "COIN_SUPPLY_COMPANY_TOTAL()", +"489e5656": "MAX_CANVAS_NAME_LENGTH()", +"489f3c88": "ping(address,uint256,uint256,uint256)", +"489fde35": "setEnforce(bool)", +"48a0c8dd": "isDepositable()", +"48a0d754": "available()", +"48a0fa29": "toggleTokenExchange()", +"48a15250": "setBurnRequestUintMap(uint256,string,uint256)", +"48a16b8c": "_itoa(int256,uint8)", +"48a1befb": "UserFactory(address)", +"48a3cbdf": "fundTeam()", +"48a46bd3": "isRejected(address)", +"48a490fb": "transferFromTreasury(address,uint256)", +"48a50a54": "saleClosedTimestamp()", +"48a54fc5": "checkContract(bytes32)", +"48a5d7bb": "AssetPool(address,uint256,uint256,uint256,uint256)", +"48a60b6c": "getPlayerBets()", +"48a73e96": "getFreeNapkins()", +"48a76740": "TokenData(uint256,uint256)", +"48a7f1f9": "proposeOfferingContract(address,address)", +"48a860dd": "confirmTransactionAfterExpiryFee(uint256)", +"48a87fa8": "emptyTTT()", +"48a8b427": "calculateShareCrystal(uint256)", +"48a935e2": "setIndividualCaps(address[],uint256[])", +"48a9866b": "kill(address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"48aa71f4": "isInCrowdsale()", +"48aac336": "getNumberOfParticipantsPerLevel()", +"48ab41d3": "getPOOL_edit_3()", +"48ac0f3c": "CORPORATE_SUPPLY()", +"48acce46": "ponziAddress()", +"48acd9b1": "changeFeeAccount2(address)", +"48ad5cd0": "product3()", +"48adfbdb": "getModerator()", +"48afc0fe": "FOMO3DLite()", +"48afd1b3": "hasReturns(address,uint256)", +"48afe4f5": "currentPersonalLimit(address)", +"48b15166": "blockTime()", +"48b17b64": "currSaleComplete()", +"48b24b88": "IAM_PER_ETH_BASE_RATE()", +"48b43020": "_setDistrictAddresss(address,address)", +"48b45d92": "isRequestApprove(bytes32)", +"48b49fa7": "buyGem(uint256)", +"48b4d3a4": "EmitTransactionIds(uint256[])", +"48b52c7d": "_transferFrom(address,address,uint256,string)", +"48b537ce": "MaggieToken()", +"48b5677f": "delegatedSignedRemittance(bytes,address,address,address,uint256,uint256,uint256)", +"48b59dd6": "changeCourse(uint256,uint256)", +"48b5b15c": "testHasCorrectPriceForMultistage()", +"48b5de18": "setEscapeHatch(address)", +"48b741de": "greaterPriceMsgComparator(uint256,uint256)", +"48b75044": "release(address,address)", +"48b84cde": "testCreateElectionOptions()", +"48b8ff83": "tokensForArtist()", +"48b9ed30": "getdisdone()", +"48b9f88f": "blockDiff()", +"48ba2d51": "LogBidRewardClaimed(uint256,address,uint256)", +"48bafd0e": "newGame(string)", +"48bb4067": "teamIssuedTimestamp(address)", +"48bb4347": "_checkOpenings()", +"48bc2a21": "bonusSecondIco()", +"48bc3e2a": "twoStepRate()", +"48bc4edf": "startAndSetParams(uint256,uint256)", +"48bd64c0": "getArrayHashLibry(bytes16)", +"48bdaaff": "TradeStatus(address,address,uint256,uint256)", +"48be4030": "INDToken()", +"48beae6a": "kkTestCoin1()", +"48bf51f5": "setInterestRatePunitory(uint256)", +"48bf9179": "Extradecoin(address,address)", +"48bf9cea": "serialNumberIsUsed(string)", +"48c0b782": "intermediariesCount()", +"48c0dc5b": "Inonit(uint256,string,string,string)", +"48c1ee9b": "wadmin_transferOr(address)", +"48c20a24": "getChildsAmount(address)", +"48c22f3f": "RateClient(uint256)", +"48c26e22": "purchaseRate()", +"48c2f845": "purchased_tokens()", +"48c40dbd": "transferTokensThroughProxyToContract(address,address,uint256)", +"48c44712": "refundERC20(address,address,uint256)", +"48c4cae9": "setNameReaderId(bytes32,bytes32)", +"48c4d7ce": "descendingCount()", +"48c54b9d": "claimTokens()", +"48c5be67": "numDistributionsRemaining()", +"48c6af04": "test_oneInvalidEqString()", +"48c6e2f7": "BaoFengCheng(uint256,string,uint8,string)", +"48c7a0bf": "SharePrice()", +"48c7f438": "setOldest()", +"48c81c16": "GamersToken()", +"48c834c0": "tier4Rate()", +"48c875cf": "resetRequest(string)", +"48c8cd41": "dateTime()", +"48c91284": "setM1(address)", +"48c981e2": "sendEther(address)", +"48c9ecf8": "allowTokenOperations(address)", +"48cb5aeb": "Easticoin(uint256,string,string)", +"48cc38e1": "nestedFirstAllToAll2(uint256)", +"48cc7b6e": "startForge()", +"48cd4cb1": "startBlock()", +"48cd65d9": "getInPlayGames()", +"48cdb451": "initializeVesting(address,uint256,uint256)", +"48ce382d": "addActivityAccount(address,uint256,string)", +"48cebd67": "presaleSold()", +"48cf9e5c": "getGroupIndex(uint256)", +"48cfa939": "minContribution_mBTC()", +"48cfc6c6": "crowdSaleEnabled()", +"48d0aff3": "drainexcess()", +"48d21789": "burnFunction(address,uint256)", +"48d24f35": "transferMintingAddress(address,address)", +"48d26dd1": "finalizeType()", +"48d2df48": "userBuys(address)", +"48d317ce": "stepTwo(int256)", +"48d3297c": "stageStatus(uint16)", +"48d34bc6": "getHashInternal(address,uint256,uint256,uint256,uint256)", +"48d37a58": "withdrawPrize()", +"48d453ee": "gcEndTime()", +"48d47e7e": "clc()", +"48d4eaf7": "storeData(bool,uint256,address,bytes32,string)", +"48d51a0d": "submitProposal(bytes32,uint32,uint32)", +"48d597e5": "addFromMapping(uint256,uint256)", +"48d5a5c0": "consensusAddress(address)", +"48d6002a": "otherPlayer(address,address[])", +"48d6047c": "WhitelistWalletUpdated(address)", +"48d64fd5": "changeTradeTracker(address)", +"48d6ca55": "getChangeFeeAmount(uint256)", +"48d7de63": "setTenant(bytes32,address,uint256,string)", +"48d82608": "InvestmentPolicyChanged(bool,bool,address)", +"48d848d0": "returnBoolean(bool)", +"48d8bb3f": "setIco(address,address)", +"48d9614d": "GetFee()", +"48d9a374": "blockTransfer(address,uint256)", +"48da08e6": "SilverCoin()", +"48da1532": "node_side(uint256)", +"48da60af": "limitClosedSale()", +"48da95b8": "VirtualExchange(address)", +"48db409a": "createContract(bytes32,uint16,bytes32,uint256,uint64,bytes32,uint64,bytes32,uint64)", +"48db5f89": "player()", +"48ddc01f": "changeFisherMansFeeCalculator(address)", +"48dddca8": "minSpend()", +"48de0cdc": "withdrawInBatch(address[],address[],uint256[])", +"48dfe175": "tier3Total()", +"48e021e9": "weiCostOfToken()", +"48e06300": "isEquipedAny2(address,uint256,uint256)", +"48e071d4": "denyUser(address)", +"48e0f410": "fundRaising()", +"48e11f70": "OMGCatCoin()", +"48e12ae3": "getAllowancePeriod()", +"48e1a760": "getttttttt(uint256)", +"48e1c18b": "itemsOwned(address)", +"48e252ab": "CryptoMilitary()", +"48e25bd2": "WinToken()", +"48e278f9": "NauticusToken()", +"48e37220": "presaleDateStart()", +"48e3a033": "mulPay(address[],uint256[])", +"48e3a064": "StandardCampaign(string,uint256,uint256,address,address)", +"48e4e297": "allowedToPurchase()", +"48e591ac": "getVote(address,address,uint32)", +"48e5c71f": "whoIS(string,bool)", +"48e61782": "left4(uint256)", +"48e624eb": "holderAdvPercent(address)", +"48e66722": "getRedeemRequestsLength()", +"48e68e30": "synthesizeWithAuto(uint256,uint256)", +"48e6b393": "test_logs()", +"48e7575d": "ecrecoverFromSig(bytes32,bytes32)", +"48e76563": "oraclize_setNetworkName(string)", +"48e7a100": "reparametrizeMultisig(bytes32,uint256)", +"48e837b9": "createGame(uint256)", +"48e9657d": "getSignatureAtIndex(string,uint256)", +"48e9f1ea": "EPXCrowdsale()", +"48ea97be": "tokenSalePausedDuration()", +"48eaa435": "safeExp(uint256,uint256)", +"48eab053": "fourthTeamWithdrawal()", +"48eaeb72": "BPCC(uint256,string,string)", +"48eb4ac1": "getAllMilestonesHashes()", +"48eb76ee": "attacker()", +"48ec8a0c": "getSecurityLimits()", +"48ed190a": "lastBlock_f11()", +"48ed1e3b": "LookUpAvailableDivInt(address)", +"48ed3e00": "date610()", +"48ed994c": "newLottery(uint256)", +"48edbf1d": "SKS()", +"48ef245b": "createFaucet(string)", +"48ef5aa8": "UpdateMaintaining(bool)", +"48ef670e": "UportRegistry(address)", +"48f001e6": "decreaseFreezeValue(address,uint256)", +"48f05187": "scheduleCall(address,bytes4,bytes,uint256)", +"48f082e8": "dayToMinusToken()", +"48f0b8e3": "getNumberOfGamesCompleted()", +"48f134f6": "closeSetup()", +"48f1e9c2": "getCertificationDocument(address,uint256)", +"48f2090b": "distributionPercent()", +"48f213e0": "PER_USER_AMOUNT()", +"48f221b6": "changePartner1(address)", +"48f36144": "claimOracle()", +"48f3e6f4": "getFourthAddressBalance()", +"48f549a4": "CreateToken(address,uint8,uint16)", +"48f6647b": "matchWithTheirs(uint256,uint128,uint16)", +"48f69212": "YELLQASH()", +"48f6cc0a": "_removeManager(address)", +"48f7f2a3": "daoFactory()", +"48f83e86": "authorizeAccess(address,address)", +"48f8fe69": "fnv(uint256,uint256)", +"48f918e0": "reclaimLeftoverEth()", +"48f95a7d": "depositsCountForUser(address)", +"48f9e246": "requestImplChange(address)", +"48fab2b0": "emitOracleUpdated(address)", +"48fb7332": "INTREPID_MAX_PRICE()", +"48fc66e9": "NzmLToken()", +"48fcb4e8": "getFrozenAccountCoinCount(address)", +"48fdb8c1": "partnernames()", +"48fee60f": "Criptohubcoin()", +"48fefd9b": "supportsToken(string,address,address)", +"48fefed2": "setNewGreeting(string)", +"48ff05b8": "removeUint256(bytes32)", +"48ff0c47": "testF4(uint256)", +"48ff1387": "rebuy(uint256)", +"48ff15b3": "acceptManager()", +"48ff30ff": "Breakup(uint256)", +"48ff6525": "applyRedenomination()", +"490052a8": "playerRoll(uint8,uint8)", +"49007329": "CCCRSale(address)", +"4900b48c": "checkOracle(address,address,address,bytes32,uint256[])", +"4901a205": "canShelf(string,address)", +"490203a7": "getMiningReward()", +"4902d163": "pendingOwnedOwner()", +"4902e4aa": "removeSuperAdmin(address)", +"490377a7": "setParameters(address)", +"4903c401": "Admins(address,address,address)", +"49041903": "getGame(uint64)", +"49044cc5": "premiumValue()", +"49051c1d": "threshold2()", +"49055da2": "getCurrGameInfoPart2()", +"4905c5b0": "_isUserInGame(address)", +"4905c769": "newLoan(bytes32,bytes32,bytes32,address,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"490618d1": "deregisterBroker(address)", +"49063d37": "checkDivs(address)", +"4906da1e": "getMaxEther()", +"4907cd0f": "subscribe(address,uint256,uint256,uint256)", +"490825a9": "testControlTransferEnableNotTransferable()", +"49082bef": "TWO_YEAR_KEEPING()", +"4908d1de": "allUnsoldTokensAllocated()", +"490a32c6": "message(bytes32)", +"490a65c8": "PlutonDistribution()", +"490a6dac": "setWinner(uint256,bytes32,uint256,uint256,bytes32)", +"490b4f92": "coinAgeForAddressAt(address,address,uint256)", +"490bf04f": "rateToEther()", +"490c58f0": "addTokenTo(address,uint256)", +"490cce74": "FincontractMarketplace()", +"490d6d11": "Resume()", +"490e25c1": "C4FEscrow(address,uint256,address,uint256,uint8)", +"490e2bd1": "Autolen()", +"490f027a": "setPrizes(uint256[28])", +"490f611e": "Or(bytes32,bytes32)", +"490fc399": "votedKickoff(uint256,address)", +"490fdbd7": "transferTile(uint16,uint16,uint8,address)", +"490fea4d": "addBounty(address,address,uint256)", +"491045af": "LifeSet_002()", +"491274a8": "presaleContributorCount()", +"49128cdb": "updateRoundState()", +"49135b0f": "getAllAlgos()", +"4913732e": "buyTokenFromModerator(uint256,address,uint256,bool)", +"49137bca": "reading_cards()", +"4913ec88": "EnergisToken()", +"49144618": "Wasted(address,uint256,uint256)", +"4914fb27": "approveWithdrawal(address)", +"4915020f": "verifyLinkPrivateKey(address,address,address,uint256,uint8,bytes32,bytes32)", +"4915ef4a": "refund_contract_eth_value()", +"49164b41": "CryptoDivert()", +"491737f2": "ico3cap()", +"491759aa": "sendEthTweet(string,string,string)", +"4917c302": "ACCEPTED_AMOUNT()", +"4918d588": "test_BondPostedAndOverMajority()", +"491a6155": "REFERRAL_BONUS_PERMILLE()", +"491a7904": "transferTokenTo(uint256,address)", +"491abe0c": "servicePayment(uint256)", +"491b0712": "snpb(uint256)", +"491b8c45": "setWARTokenAddress(address)", +"491c8e08": "lastBlock_a6()", +"491cfc1c": "setNextRoundDuration(uint256)", +"491d525a": "pMintTokens(uint256,int256,address,uint256,uint256)", +"491d75f4": "configurationTokenTranchePricing(uint256[])", +"491dcfe9": "batchActive()", +"491e0df0": "totalContributorsContribution()", +"491e55db": "GAME_COST()", +"491e74f3": "YICHAINCoin()", +"491eeb3a": "resumeInvest()", +"491fd263": "updateMessage(uint256,bytes32)", +"49200d77": "numberOfOutcomes()", +"4920781b": "GATcoin(uint256,string,string)", +"4920adcc": "MysteriumCrowdsale(address,address,uint256,uint256)", +"4920ff15": "SetHome(string)", +"49212c92": "preValidateChecks(address,uint256,uint256)", +"4921a91a": "giveMe()", +"4921cea6": "transferFeeOwner()", +"4921e147": "setMinWeiToPurchase(uint256)", +"4921f9e9": "AnonReport(uint256)", +"4922d481": "recovery(address)", +"49231598": "fetchAllVotersBySnapshotBlock(uint256)", +"49231b28": "changeRates(uint256,uint256)", +"49239e10": "refundStageStartTime()", +"492430f6": "DissolutionRoom(uint8,bool)", +"4924d397": "Respond(address,uint256)", +"49251b18": "FrozenFunds(address,address,string)", +"4925480e": "fireAdmin(address)", +"49260304": "nDEX()", +"4926248f": "setListener(address,address)", +"49264032": "Spendcoin()", +"49266f2f": "maxBidEth()", +"4927f408": "Vertex_Token(uint256,address,uint256)", +"49285b58": "getVotingToChangeKeys()", +"492abc67": "signerIsApproved(bytes32,bytes)", +"492b3bf7": "baseTokenCapPerAddress()", +"492b67ea": "Etherdoc()", +"492b8d45": "POWToken()", +"492bd276": "getIntervals()", +"492c0325": "calculateNewRate(uint256,uint256)", +"492c70fb": "swipeToken()", +"492c981b": "entryInformation(address,bytes32)", +"492cc769": "buy(string)", +"492d06cf": "unFreeze(uint8)", +"492dda05": "reTweetReward()", +"492e333f": "allocate5ProjectToken()", +"492e672e": "DCETToken()", +"492eec25": "bountyOfflineTokens()", +"492f190d": "availableCommission()", +"492f8724": "subscriptionStatus(uint256)", +"492fb343": "feeBeneficiary()", +"492fea53": "_createPet(uint256,uint256,address,uint256,uint256,uint256,uint256)", +"4931b3b4": "setData_30(string)", +"4932a80b": "unownedPlanet(uint256)", +"4932ce32": "changeGame(address,uint256)", +"4932f35e": "NomToken()", +"49330cb8": "getVote(uint256,uint256)", +"493322c0": "calculateRewardInternal(address,address,uint256)", +"49336245": "getEntry(bytes)", +"49337227": "testCanCloneAfterTransfer()", +"49339f0f": "Delegate(address)", +"4934453a": "TPIToken()", +"4935b3b6": "PDTC()", +"4935e740": "withdrawMyFunds()", +"49361cfe": "lastInvestmentTime()", +"493770cc": "setTransferStatus(bool)", +"4938649a": "stopEverything()", +"49386f26": "getlistedItems()", +"493953de": "addOwnToken()", +"49399729": "minimumBidAmount()", +"4939bfde": "requestedBy()", +"4939ce85": "CLASS_BEAST()", +"493a64e4": "SetParticipantRole(address,address,uint8)", +"493a7209": "stopBuy()", +"493a8d0c": "tokenActive()", +"493b284e": "exchangeNominsForHavvens(uint256)", +"493bccc8": "awardMissedBlockBonus(address,bytes32)", +"493ca31a": "EPAYCLUB()", +"493caeea": "removeMemberWithAddress(address)", +"493dbd02": "forceEndGame(address)", +"493f8d30": "read_demurrage_config_underlying()", +"493fcf1c": "taxRateNumerator()", +"49403183": "isPassed(uint256)", +"49404d25": "lastBlock_v13()", +"494054f4": "createNota(string,string)", +"49407a44": "claimEther(uint256)", +"4940c807": "sumElements(uint8[])", +"49416e45": "RCD()", +"4941d059": "editRestrictedAddress(address,bool)", +"4941d296": "periodITO_startTime()", +"49420759": "changeWithdrawable(uint256)", +"494278e3": "getgamecardaddress(uint256)", +"4942a71f": "getFromBank(uint256)", +"49432923": "participationHistory(address)", +"49433942": "PointerChanged(uint8)", +"49435c0d": "whitelistSupplier()", +"49437210": "getUpdatable(bytes32)", +"49440b91": "lockMntpTransfers(bool)", +"49441fc3": "MIN_ETHER_CONTR()", +"4945a575": "childApproved(address,uint256)", +"494630cd": "PullRequestAlreadyClaimed(uint256,uint256,bool)", +"49463b8e": "SeeleToken()", +"49465a50": "changeTakerDeadline(uint256)", +"49465d33": "lastPriceFeed()", +"4946c574": "getTransformMineInDay(address,uint256,uint256)", +"4946e206": "rescueCat(bytes32)", +"4947c8d0": "setFinishTime(uint256)", +"49480bc1": "releasePrivilege()", +"49484450": "ProofOfNoSnipers()", +"4948c2db": "stage4_price()", +"4948d91d": "SicBo(address)", +"4948e51a": "freezeToken(address,uint256)", +"49499e14": "setCompte_15(string)", +"4949d9fa": "bankrolledBy(address)", +"494ac14c": "LOTTERY()", +"494b46f9": "_changeAdmin(address,address)", +"494b5e0f": "setUserFactoryContract(address)", +"494b90e8": "teamPoolAddress()", +"494bf608": "distributeEther()", +"494c2a0f": "STQCrowdsale(address[],address,address)", +"494cf333": "getAddressUIntMapping(address)", +"494cfc6c": "getTokens(uint256,uint256)", +"494d93cc": "result_block()", +"494e49a4": "createAccountWithBalance(string,uint16)", +"494e4bc3": "fundtransfer(address,uint256)", +"494fb622": "SetData(uint256,string,string,string,string)", +"494fee7d": "estimateDistribution(address)", +"4950b392": "exerciseCall(uint256,uint256,uint256)", +"49517b41": "addSolution(uint256,string,string,string,string,string)", +"4951a18f": "crowdsaleCap()", +"495289be": "setIssuer(address,bool)", +"4952d2dd": "logPromiseUnfulfillable(uint256,address,uint256)", +"4953b57d": "isAdminOwnersValid()", +"49550d66": "tryTakeBack(uint256,uint256)", +"49556aff": "fulfillEthereumLastMarket(bytes32,bytes32)", +"4955a79e": "transferOwnershipOperation()", +"4955f280": "createContractPerson(string)", +"4956cf1c": "migrating()", +"4956eaf0": "deploy(address,uint256)", +"49570293": "_addPurchasedTo(address,uint256)", +"49573edd": "tgeSettingsChange(uint256,uint256)", +"495816b4": "BOUNTY_TOKENS_AMOUNT()", +"49582509": "ICO_ON()", +"49582a20": "initializeSupply(uint256,uint256,uint256)", +"4958abb7": "switchFeePolicy(bool)", +"4958ace2": "restartSale(address)", +"49593f53": "submit(string,uint64,uint32,uint32,bytes32)", +"4959642c": "isUserKyced(address)", +"49596a65": "initProject(string,string,string)", +"495b3bcc": "LSEscrowContract()", +"495bbcae": "testNeededBalanceForContractCreation()", +"495bf26b": "lengthOf(string)", +"495c167f": "sumPayments()", +"495c5891": "getTotalAuthorizedForPayment()", +"495c9588": "minEligibility()", +"495ccca3": "WEEFundWallet()", +"495d32cb": "par()", +"495d7b26": "processScore(bytes32,string)", +"495df195": "CollectEarning()", +"495e1b3d": "etherEscrowAddress()", +"495f9bae": "getProposalVoterVotesCount(uint256,address)", +"495fe25b": "transferTo(address,uint256,bytes)", +"49602f5c": "OpusToken()", +"49606455": "take(bytes32,uint128)", +"49606d51": "Nihilum()", +"4960ae42": "numberOfVerifiers()", +"4960d2bc": "getLandTaxRate(uint256)", +"496128ec": "prosperaToken()", +"49614e91": "isRegisteredAddress(address,address)", +"4961b40c": "getReleaseValidator()", +"4962aa66": "discountedRates(uint256)", +"4962ab01": "removeMembers(address,bytes32,address[])", +"4962ad08": "approveAlgo()", +"4962b964": "getPuppetCount()", +"49630dda": "removeQuestion(address)", +"4963513e": "Reserved(bytes32,address)", +"49649fbf": "withdrawAllFunds()", +"4965fc89": "getForfeited(address)", +"49661fcf": "stage2Tokens()", +"49671d28": "setAmountSoldPerPeriod(uint256)", +"4968694a": "setCoolness(uint256,uint32)", +"496a698d": "currentAuction()", +"496bd844": "round_up_division(int256,int256)", +"496be2cf": "atxControllerAddr()", +"496c4fad": "setPriceAgent(address)", +"496c5ad8": "throwsWhenGettingTokensWithStoppedSale()", +"496e41d2": "quotaUsed(address)", +"496fbeb3": "transportationFeeMultiplier()", +"496fc976": "setC4FContractProvider(address,address)", +"496fd2c5": "ICOStartToken(uint256)", +"4970fb36": "armagedeon(address[])", +"4971129d": "CatTransfer(address,address,uint256)", +"49713811": "winnersCount()", +"49714815": "ownerKillContract()", +"49716f5a": "originalTotalWeight()", +"4973219d": "outputi(uint256)", +"497347b2": "_storeContent(address,string,uint256,bytes32,address)", +"4973dbf6": "RATE_ETH_CUE()", +"4973dd25": "unBlockExternalTransfer()", +"49741098": "admin_set_min_pay(uint256)", +"497484f6": "applyBonus(uint256,uint8)", +"4974af1f": "testPublic(uint256[20])", +"4974bc27": "download()", +"4974da81": "addWord(string)", +"49752baf": "chronoBankPlatform()", +"49755b9e": "issueSynths(bytes4,uint256)", +"4975d202": "balanceOfOwner()", +"4975e893": "getProposalCreatedAt(bytes32,bytes32)", +"49776581": "getDocumentUpdatedVersionId(uint256)", +"497777d5": "collect(bytes32)", +"4977d6a4": "DreamToken()", +"49786571": "Economeme()", +"4978ddcc": "transferAPIOwnership(address)", +"4979440a": "getHighestBid()", +"4979c012": "ClosingTimeForCloning()", +"4979d6ec": "setUserManagerContract(address)", +"497a7b48": "taskRewardVote(bytes32,uint256)", +"497aed49": "PRIMARY_START_PRICE()", +"497b383e": "buyReferTokens(address,uint8)", +"497b8018": "getBallotOptNumber()", +"497cc504": "claimE()", +"497cd327": "TMONEY272708()", +"497cd426": "updateRewardDistributor(address)", +"497d709d": "icoNumberBalanceOf(address,uint256)", +"497dbce9": "_assertAmount(uint8,uint256,uint256,uint256,uint256,uint256,uint256,uint8,uint256)", +"497dd0cb": "migrateContributors(address[])", +"497f3132": "getLastRegistration(string,int256)", +"497fb5b9": "tokensWithdrawn()", +"498022ea": "evalTransitionState()", +"49813e26": "MenovaToken()", +"4981b3ca": "performSell(address[8],uint256[6],uint256,uint256,uint8,bytes32,bytes32)", +"49843982": "Coin(uint256)", +"4985acee": "getTransferFromToValue()", +"4985b325": "addSurplus()", +"49866ec0": "finishTokensSale(uint256)", +"4988ef98": "LOCK_TOKENS_DURATION()", +"4989ae8e": "RESERVED_TOKENS_FOUNDERS()", +"4989b0b6": "setCustomBuyerLimit(address,address,uint256)", +"498a37f0": "setSmallInvestor(address,uint256,uint256)", +"498a3944": "setNameWriterId(bytes32,bytes32)", +"498a4c2d": "startBlockNumber()", +"498a690f": "issuingRecordAdd(uint256,bytes32,uint256,uint256,uint256,string,uint256)", +"498a6de7": "setRevenueContract(address)", +"498b7718": "J8T_DECIMALS_FACTOR()", +"498be109": "FAPFounderFund()", +"498c07f3": "startCrowdsale1(address)", +"498cb7cb": "setDelegadoDeEscuelaVerify(bytes32,uint256,uint256)", +"498cc70d": "getResult(string)", +"498d2ae0": "getMintRequestAddressMap(uint256,int256,string)", +"498e78b1": "unregisterManager(address,address)", +"498e87a9": "setPI_edit_21(string)", +"498eecb2": "getLimitedReportersDisputeBondToken()", +"498f27ae": "countCampaigns(address)", +"498f6fbe": "NewSubscription(address,uint256,uint256)", +"498fd833": "priceDT()", +"498ff49a": "repayImmediately(uint256)", +"49911610": "getDay(uint16)", +"49912f88": "appeal(uint256,bytes)", +"49917511": "buyCoinsCrowdSale(address,uint256,address)", +"49926028": "typeHash()", +"499260d6": "get_activity_by_id(uint256,uint256,address)", +"49937e25": "buyPrimordialToken()", +"49942483": "ICO_PHASE2_BONUS_PERCENTAGE()", +"49942ccb": "scheduleCall(bytes,bytes,uint256,uint256)", +"49943a13": "PARTICIPATION_FEE()", +"49955431": "cupi()", +"4995b458": "week()", +"4995e9fb": "FOUNDER_ADDRESS2()", +"4996e899": "getGuaranteedContributorsLenght()", +"49970e16": "forwardPlay(address,address,bytes,bytes32,bytes)", +"499831f2": "pauseGame()", +"4998ce40": "setbonusTokens(uint256)", +"49996698": "trustedAddressSize()", +"499a1bcd": "setAQL(address,uint256)", +"499a8fea": "setClue3(string)", +"499ac979": "redistributeTokensForAddresses(uint256,address[])", +"499af77c": "current_spin_number()", +"499caf09": "secondTime()", +"499cd176": "endAttack(address,address,bool,uint256,uint256,uint256,uint256)", +"499cf7ce": "BOXEX()", +"499d1081": "mint(address,uint256,uint128)", +"499dae56": "getMultiRequestRequestor(uint256)", +"499e2c81": "getOrCreateWaitingBoard(uint256)", +"499e6c10": "isTheContract()", +"499fa529": "ALLOC_SALE()", +"499fd141": "getDrupeCoin()", +"499ff236": "maxAnonymousContribution()", +"49a0a3b3": "resetTokens(address[],uint256[])", +"49a0c976": "unlockEmission()", +"49a0e681": "rst()", +"49a24a7d": "DolyToken4()", +"49a3d2bb": "updateAllowed(address,address,uint256)", +"49a51839": "EGGS_TO_HATCH_1LOBSTER()", +"49a634f0": "LTS()", +"49a67b55": "commitStart(bytes32)", +"49a69078": "lastBlock_f5()", +"49a6a4de": "showAssetInfo(bytes32)", +"49a742eb": "validRate(uint256)", +"49a76444": "Hygen()", +"49a7a26d": "solver()", +"49a86c9e": "addToAccesslist(address)", +"49a8d337": "lockedTeamAllocationTokens()", +"49a92910": "setPlayer(address,uint64,uint64,uint64,uint64,uint64,uint64)", +"49a9d5ad": "CGENToken(uint256)", +"49aa480a": "VixCoin()", +"49aa4ee2": "removeVote()", +"49aafad7": "allowedToBurn(uint256)", +"49ab1d86": "setGeneLab(address)", +"49abee50": "phaseStart()", +"49abf2d6": "staticoins(uint256)", +"49acce72": "AnkitVictoContractToken()", +"49ad12a5": "getItemRarity(uint256)", +"49adf14f": "Claim_TRAC_1850()", +"49adf314": "_updateDividends(address)", +"49ae1f17": "KWHToken(address,address,address)", +"49ae8dc3": "getChildren(uint256)", +"49ae9b31": "canReadName(address,bytes32)", +"49af0af1": "baseEthCap()", +"49af63a9": "setWaitTime(uint8)", +"49afc6e5": "tokenBalance(uint256)", +"49afcc0e": "dataSourceGetSemiResult(uint256)", +"49b11f24": "dailyAuctionStartTime()", +"49b1b2d9": "newBonus_and_newPeriod()", +"49b2f5ff": "technicalCommunitySupply()", +"49b3b29f": "costs(uint256)", +"49b40402": "exchangeThreshold()", +"49b48e66": "setCheckOwner(bool)", +"49b54685": "updateDps(uint256)", +"49b5b541": "compute(address,uint256)", +"49b6313c": "getCurrentSellOffer(uint32)", +"49b71e47": "distributeWinnerPool(string,uint256)", +"49b76501": "getStorageRate()", +"49b7a9c2": "dividendManagerAddress()", +"49b7ef6c": "lockedSell()", +"49b85a16": "kycAddress()", +"49b88203": "declareProjectDefault()", +"49b88919": "setImageDescriptor(uint256,uint16)", +"49b8f5d9": "tokensDuringPhaseOne()", +"49b90557": "isAuditor(address)", +"49b9734d": "changeMainEndTime(uint256)", +"49b9a2d0": "address_to_tickets(address)", +"49b9a7af": "lastPriceUpdateTime()", +"49ba5a48": "checkSavedEthBalance(address)", +"49babd2a": "initiate(address,uint256,bytes32,address)", +"49bac542": "E4RowEscrowU()", +"49bedf42": "setLookup(address)", +"49beee4f": "adjust_Transfer_nodata(bool)", +"49bf2caf": "disputeTransaction(uint256)", +"49bf66d3": "addRegistryIntoNameIndex(address)", +"49bfb061": "txFeeDenominator()", +"49bff0d7": "setPI_edit_29(string)", +"49c03373": "changeGTOAddress(address)", +"49c04f27": "WorldBitEvent(address,bytes2,bytes2,uint256,uint256,string,string,string,string)", +"49c15bd9": "Purchase()", +"49c16cc3": "CMCLToken(uint256,string,string)", +"49c16e15": "toUint()", +"49c1ad0f": "gotoNextState()", +"49c1d54d": "trusteeAddress()", +"49c2a1a6": "createProposal(string)", +"49c3567c": "ArbaCoin(uint256,string,string)", +"49c37f8c": "main(address,address)", +"49c3a91e": "getSponsorshipsTotal(address,uint256)", +"49c462d7": "createInvite(bytes)", +"49c53b2d": "doMidnightRun()", +"49c60cc9": "MICROMINESx()", +"49c6353c": "getInvId()", +"49c71fa8": "unholdTeamTokens()", +"49c7634f": "WorldwideGiftCode()", +"49c83e86": "unlist(address,uint256)", +"49c91267": "getSeedByWinner(address)", +"49c9d17a": "updateReceivers(address[])", +"49c9dcf5": "awardRafflePrize(address,uint256)", +"49ca30ab": "receiveIndex(uint256,uint256,uint256,uint256,bool)", +"49ca7656": "changeOwnerOfMonethaUserClaimStorage(address)", +"49ca8cc9": "getEventId(address,bytes32)", +"49cacb12": "dropOwner(address)", +"49cbe338": "tryRead(uint64)", +"49cc2eb1": "Fairsale(uint256,uint256)", +"49cc635d": "receivePlayerInfo(uint256,address,bytes32,uint256)", +"49cc8513": "_geneOfCrab(uint256)", +"49cc954b": "twoYearsPassed()", +"49cd4554": "afterIco(uint256)", +"49ce0a11": "hexToken()", +"49ce5804": "setSectorOwnerCut(uint256)", +"49cf211e": "storenumber()", +"49cf2eae": "certifierAddress()", +"49cf5f1b": "DSProxy(address)", +"49d0cd85": "functionSignatures()", +"49d10b64": "updateRegistry()", +"49d246e5": "getBetBasic()", +"49d24ae8": "withdrawAdmin(uint40)", +"49d2ca11": "Election(address,address,address,address,address)", +"49d3060f": "selectWinner50()", +"49d45693": "changeminprivatesale(uint256)", +"49d463e6": "sendBoard(bytes10,uint256,uint8,bytes32,bytes32)", +"49d4a344": "right99(uint256)", +"49d55d9d": "receiveTransfer(uint256)", +"49d596fe": "FSM()", +"49d689f4": "setJackpotAddress(address,address)", +"49d7e0b3": "mutiTransferFrom(address,address[],uint256[])", +"49d800a1": "ReleaseableToken(uint256,uint256,uint256)", +"49d834cd": "TSTEST()", +"49d8ef13": "ETHERFUNDME_ONLINE_FEE()", +"49d94871": "bonusRates(address)", +"49d94c83": "CappedCrowdsale(uint256)", +"49da847b": "iPay()", +"49daca7a": "tradeAddress()", +"49dbdf30": "initializeRefund()", +"49dc2b83": "miningFinished()", +"49dc5376": "getTokensBack(uint256)", +"49dc8fab": "Menu06(address,address,uint256)", +"49dcbc5e": "sendEth(address,uint256)", +"49dcd756": "getCurrentEthCapPerAddress()", +"49dd0fe3": "minechain()", +"49dd1262": "updatePrices()", +"49dd2880": "Gold(address,uint256)", +"49de0485": "addContributorManually(address,uint256,uint256)", +"49de3995": "EthlanceMessage(address)", +"49df7208": "addMember(address,bytes32)", +"49df728c": "withdrawTokens(address)", +"49e09da6": "genesisTransfer(address,uint256)", +"49e0cf2a": "createComunity(bytes32,bytes32)", +"49e0dada": "level_4_percent()", +"49e123c8": "monsterHealth()", +"49e1432c": "donateToPot()", +"49e1c2b7": "ATMToken()", +"49e284d1": "ZoologicalGarden()", +"49e347ae": "getContents(uint256[],uint256)", +"49e3ec5e": "setMediator(address)", +"49e4347b": "completeICO()", +"49e44f44": "ManagerProxy(address,bytes32)", +"49e4b3e5": "setPermissionManager(address)", +"49e51970": "CostilNetworkToken()", +"49e588df": "refundSubmission(address,uint256)", +"49e627d2": "getPreIcoTokenHoldersAddressesCount()", +"49e65440": "setSymbol(bytes32)", +"49e67544": "TeamFund()", +"49e6c454": "getMyEntityOwner(uint256)", +"49e77c8b": "hasEnoughTokensToPurchase(address,uint8)", +"49e9449a": "presalesCap()", +"49e9cee9": "GetMaxPrestigeLevel()", +"49ea33df": "icoEndDatetime()", +"49ead9b4": "createAsset(string,uint256,uint256)", +"49eb6d6f": "NumberAddresses()", +"49ec1ff0": "setSoftwareTokensWallet(address)", +"49ec7c3f": "giveBirth(uint256,uint256,uint256,bytes)", +"49edfb94": "FEE_OWNER()", +"49edfed9": "getEtherForStakes(uint256)", +"49ee161b": "getLockPosition1(address)", +"49ee2ae1": "getAllJingles(address)", +"49ee39ba": "nullBonusMessage()", +"49ee6c50": "getNewItemId(bytes32)", +"49ee72fc": "addCountryCities(uint256,uint256[],uint256,uint256)", +"49eee1a4": "setRoundRate(uint256,uint256,uint256)", +"49ef026f": "raisedFunding()", +"49efdbbf": "purchaseShow(uint256)", +"49f00964": "founders_2()", +"49f02baf": "YondToken()", +"49f0726d": "Centhereum()", +"49f0c90d": "adminSetAccountAdministrator(address)", +"49f12aa7": "hashState(address,uint256,uint256)", +"49f16ad1": "setTransferEnabled()", +"49f194a1": "setIco(address)", +"49f1fa67": "GetLiasonName(uint256,uint256,uint256)", +"49f202ff": "getTokenIdByIndex(uint256)", +"49f209af": "testThrow_3_invalidOwner_accessRestrictionThrow()", +"49f22b4a": "biddingComponent()", +"49f27c25": "ProdEToken()", +"49f298c6": "wallock()", +"49f2a049": "registerInternal(string)", +"49f30178": "nextFinalTimeout()", +"49f307a6": "setNewPriceToItem(string,uint256,uint256)", +"49f41a42": "updateAgent(address)", +"49f4cc17": "transferAssets(address,address,uint256)", +"49f4f5da": "XLifeCoin()", +"49f6444e": "buyLuckyStone()", +"49f65ce4": "handleDividends()", +"49f73d3d": "calculateCountryCut(uint256)", +"49f7825b": "lockAddressByKYC(address)", +"49f856ea": "setERC820compatibility(bool)", +"49f9231d": "LightCoinToken()", +"49f97939": "notEqual(string,string,string)", +"49f9b0f7": "calculateSaleReturn(uint256,uint256,uint32,uint256)", +"49f9c0e4": "transferEth(uint256,address)", +"49f9e95e": "withdraw_arbitrary_token(address,uint256)", +"49f9f4d0": "burnOwnerTokens(uint256)", +"49fa84ef": "hon1ninja()", +"49fa991f": "removeAttestation(address)", +"49fb2dc5": "add_to_association(uint256,uint256,uint256)", +"49fcea4a": "Lyfecoin()", +"49fcfce7": "saleInited()", +"49fd5791": "_removeLastOwnerHoldingsFromToken(address,uint256,uint256)", +"49fd5f64": "getAllAssembly(address)", +"49fdaea6": "isBrickOwner(uint256,address,address)", +"49fe5261": "CROSAIR_PRICE_INCREMENT()", +"49ffeb8f": "recursiveCalculation()", +"4a0023cd": "findAuraComposite(uint64,uint64)", +"4a00a522": "homebase(int256,int256)", +"4a00dc38": "getAreaPrice(uint8,uint8,uint8,uint8)", +"4a013296": "canEscapeTo(uint32,uint32)", +"4a024928": "D00KIE()", +"4a03707c": "draw(address,uint256)", +"4a03e7e3": "TrinityContract(address,address,uint256)", +"4a042f0d": "joinBattle(uint256)", +"4a046d82": "usdPerEther()", +"4a0473fe": "votings_(address)", +"4a0483c5": "trustedAddressLUT(uint256)", +"4a0767cc": "setIsPreventedAddr(address,bool,bool)", +"4a084736": "updateTokenToEthOrderWHint(uint32,uint128,uint128,uint32,int256)", +"4a09d3cf": "withdrawAdvisersTokens(address,uint256)", +"4a0a7f2d": "doDistributionRange(uint256,address[],uint256[])", +"4a0af245": "startPreSale(address,uint256,uint256,uint256)", +"4a0b132a": "TIME_TO_MAKE_1_SHITCLONE()", +"4a0ba49d": "pay(address,address,address,uint256)", +"4a0bb6a4": "WeQuest()", +"4a0cd926": "addBankerAddress(address)", +"4a0d89ba": "getSwap(uint256)", +"4a0d8b53": "setHasMaxPurchaseLimit(bool)", +"4a0f0bfe": "ServiceRegistry(address)", +"4a0f3134": "FundTransfered(address,uint256)", +"4a0f5974": "left27(uint256)", +"4a122266": "getForwardPurchaseFeesTo()", +"4a12389a": "MyToken(string,string,uint8,address)", +"4a123e1d": "setLev2(uint256)", +"4a1281c6": "numTokensIssued()", +"4a1311f9": "openingManualyMining()", +"4a14e3b2": "SentAmountToOwner(uint256,address)", +"4a150e2c": "getDonationsCount(address)", +"4a15ebce": "addCbAddress(address,bytes1,address)", +"4a16673b": "shouldSelectWinner()", +"4a168859": "getAvaIcoAmount()", +"4a169e4b": "setCoinInfo(address)", +"4a173383": "determineWinner(address,uint256,bytes32)", +"4a1753a6": "setCurrentGame(address)", +"4a176017": "finalizeAdd(uint256,address)", +"4a176ba5": "getaddr(uint256)", +"4a17bbde": "getEventId()", +"4a180cb3": "removeSpecialFeeTake(uint256)", +"4a184f51": "startCrowdsale(address,address)", +"4a186d69": "buyTokenFor(address)", +"4a187785": "aaandItBurnsBurnsBurns(address,uint256)", +"4a18c25e": "EUEBToken()", +"4a197057": "GameEnded(uint256,address,uint256,uint256,uint256,uint8,uint8)", +"4a1993e4": "firstDepositDate()", +"4a1a27a8": "qtAccount()", +"4a1a342b": "getOrderMoneyEscrowed(bytes32)", +"4a1a3ded": "createNewTask(uint256,uint256)", +"4a1a650d": "RecordNum()", +"4a1a89f1": "PHXTKNADDR()", +"4a1aa767": "claim_victory(uint256,uint8,uint8,uint8)", +"4a1ad538": "checkTransferMultipleDelegated(address,address[],uint256[],uint256,uint256,bytes)", +"4a1b13f0": "setPoliceTimeoutInBlocks(uint256)", +"4a1b504f": "distributeBonus(address[])", +"4a1b98b2": "exchangeUnderwrite(address,uint256)", +"4a1ba4ba": "Multibot()", +"4a1c13cd": "setIcoStartDate(uint256)", +"4a1c6549": "ETHBITA()", +"4a1d08af": "drawRandomItemWinner()", +"4a1df335": "addressCEO()", +"4a1e004c": "blockedTimeForInvestedTokens()", +"4a1f05f0": "setSaleImg(uint256,bool,address,uint256)", +"4a1f0bf6": "inheritToNextGeneration(address)", +"4a1f11a7": "MT()", +"4a1fb241": "fttIssued()", +"4a1fe393": "withdrawEther(uint32)", +"4a208c38": "setIV_R2(uint256)", +"4a21f8f7": "joinToPool(uint256,uint256)", +"4a2228f7": "_reducemoney(address,uint256)", +"4a222b74": "ecoLock23()", +"4a22c7fb": "tokens_rewards_allocated()", +"4a23418a": "foundersTokensWallet()", +"4a2388ff": "setAllowedForMinting(address,address)", +"4a23dc52": "FileStore()", +"4a2479c0": "initialOwnersShares()", +"4a24edd6": "startSale(uint256,uint256,uint256,uint256)", +"4a24f6d9": "getVendorApplicationScoringTrackCount(string)", +"4a254431": "MappingProposalIssued(address,address,uint256)", +"4a25780b": "RedRibbonCoin()", +"4a25b2fd": "deductCoin(address,uint256)", +"4a26410b": "SetGenesisBuyPrice(uint256)", +"4a268f52": "ExchBtcToken()", +"4a26920b": "sendTokens(address,address,address[],uint256[])", +"4a2697fc": "balanceOfIssuer()", +"4a272bff": "GetHoga(address,uint32,bool)", +"4a275a1e": "Blockdrop(address)", +"4a280a55": "transferFrom(address,address,address,uint256,bytes)", +"4a2929ee": "betLockTime()", +"4a2951d2": "AsianCapitalChain(uint256,string,uint8,string)", +"4a2a197e": "addBonus(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"4a2a4ebc": "countries(uint8)", +"4a2b0c38": "DividendProfit()", +"4a2b22f9": "GameBase()", +"4a2b5235": "_addWhitelistAdmin(address)", +"4a2c3204": "getUserFLCEarned(address,address)", +"4a2cd48f": "getPreviousDate(bytes10)", +"4a2d5b6b": "getReleaseRatios(address)", +"4a2db4d8": "GetWinCards()", +"4a2dfbb4": "artWorkChangeRequest(uint256,string,uint8,bytes32,bytes32)", +"4a2e7752": "hashBid(address,uint256,address,address,address,uint256,uint256)", +"4a2ee75f": "addArticle(bytes,bool)", +"4a2f2333": "BitcoinMobile()", +"4a2f37a6": "updateItemTraits(uint256,uint256)", +"4a2fb1e4": "_mentors()", +"4a2fed3d": "test_SixtyPercentRules()", +"4a2ff078": "getRateFor(string)", +"4a303d30": "optAddressIntoHolding(address,uint256)", +"4a30f976": "censorship(uint256,bool,bool)", +"4a31259f": "totalNtsSoldWithBonus()", +"4a31dee2": "setTokenIdByIndex(uint256,uint256)", +"4a3270d7": "bytesStorage(bytes32)", +"4a330319": "tokensaleEndTime()", +"4a3310b8": "hasConfirmed(bytes32,address,address)", +"4a334c1c": "closePlacingPhase()", +"4a348da9": "getProductCount()", +"4a35035a": "dropNumber()", +"4a3573f1": "assignReservedTokens(address,uint8,uint256)", +"4a35d3ba": "SetBuildingSale(uint256,uint256,uint256,uint256)", +"4a35db7c": "restartValidation()", +"4a363fbc": "testNetworkDeployment()", +"4a366c46": "Th0m4z()", +"4a367140": "FoundersContract(address)", +"4a367827": "mintingStopDate()", +"4a367c68": "PrivateSaleStartTime()", +"4a367d73": "UpgradeMaster()", +"4a36870a": "firstRewardPeriodPercent()", +"4a36df25": "setMigrateContract(address)", +"4a375bc4": "FlagUint(uint256)", +"4a376c97": "OpenToThePublic()", +"4a37b5f7": "MyWill(address,string,string,string,address)", +"4a382c36": "freezeAccount(address,bool,uint256)", +"4a387bef": "removeLock(address)", +"4a393149": "onTransfer(address,address,uint256)", +"4a398c11": "SWIFTStandardToken(uint256,string,uint8,string)", +"4a39a5f4": "ALC_DECIMALSFACTOR()", +"4a3a835c": "withdrawAfterEnd()", +"4a3a87e2": "CreateProxyWithControllerAndRecoveryKey(address,address,uint256,uint256)", +"4a3a92f6": "minusFreezingTime(uint256,uint64)", +"4a3b0eec": "authorizeOpen(uint256,bool,string)", +"4a3b68cc": "referrers(address)", +"4a3bd672": "time1()", +"4a3bf377": "totalVotesFor(string)", +"4a3c4375": "getAllConsentTemplates()", +"4a3cdf21": "m_ETHPriceLastUpdate()", +"4a3d239c": "weiWithdrawed()", +"4a3d3510": "updateVotesOnTransfer(address,address)", +"4a3d3c09": "castleMinBrick()", +"4a3d5ec9": "ProofImpl(address)", +"4a3d72a1": "balancesContract()", +"4a3db7e7": "_generate(uint256,address)", +"4a3e2b21": "unpaid(bytes12)", +"4a3e4f90": "scamFlags(address)", +"4a3e8078": "emissionAddressUpdate(address)", +"4a3f17e7": "hodlers(address)", +"4a40e85b": "setMAYExchangeRate(uint256)", +"4a411f5a": "EventLuckyNumberRequested(address,uint256,uint256,uint8,address)", +"4a418b95": "logFlush(address,address,address,uint256)", +"4a418fb7": "numOfTransferableCompanysTokens()", +"4a41d1ac": "verify(address,bytes)", +"4a41d6f5": "_clearAllApproval()", +"4a41e045": "getUint8(int8)", +"4a420138": "scheduleHeartbeat()", +"4a4226a5": "TeamHeadsChoice(address)", +"4a42a397": "TakeSellOrder(bytes32,address,uint256,uint256,uint256,address,address)", +"4a42d99b": "donGameGiftLineTime()", +"4a432a46": "updatePrice(string,uint256)", +"4a443471": "_money()", +"4a44664b": "withdrawVPCxTokens(address)", +"4a44bdb8": "getBlock(uint256,uint256)", +"4a4507ff": "testInitialBalance()", +"4a45b60b": "unregister(address,address)", +"4a45beed": "Accept(bytes32,string)", +"4a45d2e6": "setParam(uint256)", +"4a4666c1": "addAuthorizer(address)", +"4a4753bc": "BonusesDistributed()", +"4a48314f": "hodlerTime3M()", +"4a49ac4c": "removeFromBlackList(address)", +"4a4a2569": "getAudCentWeiPrice()", +"4a4a26d7": "EnChangToken()", +"4a4a2a97": "performReentrancyAttack()", +"4a4a2b52": "unfreezeAdministrationContract()", +"4a4b4eb0": "WISDOMCOIN()", +"4a4b674a": "setPenalty(uint256)", +"4a4b7202": "PPBC_API()", +"4a4b7de6": "deedContract()", +"4a4baed7": "setTokenControlInfos()", +"4a4c1bcd": "LeviusDAO()", +"4a4c560d": "whitelistUser(address)", +"4a4c5e59": "proceedTokenDeals(uint256)", +"4a4c82c6": "_resetSpentToday()", +"4a4e3bd5": "emergencyUnpause()", +"4a4e5776": "stepDuration()", +"4a4e6f95": "addFeedOut(address,address,int256,uint256,uint256)", +"4a4e8884": "getUserAddress(bytes32)", +"4a4ede50": "transferSalesAgentPermissions(address)", +"4a4ef738": "addAddressToPrivateWhiteList(address,uint256)", +"4a4f76d5": "getInitializeEndTime()", +"4a4fbeec": "isLocked(address)", +"4a4fd24d": "addMileagePoint(address,uint256,int256)", +"4a5033eb": "Reverted()", +"4a504a94": "Confirmation(address,uint256)", +"4a50c3a7": "EtherToWei(uint256)", +"4a5163b5": "numDefinedGames()", +"4a51dcea": "TIER3_CAP()", +"4a522e4e": "winCosFromGame(uint256,uint256,string)", +"4a52a5f8": "TerraFirma()", +"4a52e506": "enableLostAndFound(address,uint256,address)", +"4a53c127": "setTargetDiscountValue7(uint256)", +"4a54315c": "registerUser(bytes32,string)", +"4a54c00d": "sendRemainingTokensBool(address)", +"4a54fb0a": "updateProduct(bytes32,string,address,uint256,uint8,uint256)", +"4a55308c": "firstSellPrice()", +"4a562d81": "returnDeed(address)", +"4a574d18": "bonusMode()", +"4a5791e0": "UnFreezeProduct(uint256)", +"4a57c032": "IcoDiscountLevelsChanged(address,uint256,uint256)", +"4a57e1c9": "finalizeTransaction(uint256)", +"4a583ec5": "confirmSettlement(uint256,uint256)", +"4a588d87": "CYB(uint256,string,string)", +"4a5891ac": "changeEternalStorageContractAddress(address)", +"4a58c409": "changeStartSale(uint256)", +"4a58cf22": "totalSupplyInWei()", +"4a58db19": "addDeposit()", +"4a5a3d76": "setETHPriceManually(uint256)", +"4a5a831b": "EthlanceConfig(address)", +"4a5baa1b": "VULCAN_POD_EXTRACTION_BASE()", +"4a5c2d6e": "Change(address,uint256,address,uint256,address)", +"4a5c8f1a": "getEarnEachBlock()", +"4a5db3b5": "authorizeAddress(address)", +"4a5dcb5b": "Candy(address,address)", +"4a5dcdc9": "RANGEEND_9()", +"4a5dddd2": "proxyPurchase(address)", +"4a5df250": "nextContributionCaps(uint256)", +"4a5e1cf3": "initLottery(uint16,uint256,uint8)", +"4a5e4fa8": "setExpReward(uint32)", +"4a5e70c0": "ObitanChainToken()", +"4a5ecc66": "Sale(address,address)", +"4a5f41b6": "checkCanInvestInternal(address,uint256)", +"4a5fca4f": "offChainTokens()", +"4a5ff749": "teamAddr()", +"4a601994": "WesTechToken()", +"4a606c53": "_db()", +"4a60751f": "refundingEndtime()", +"4a61179b": "MANHATTANPROXY11THWEAVE()", +"4a617faa": "shaBid(bytes32,uint256,bytes32)", +"4a617fba": "gooDepositDivPercent()", +"4a61f347": "resetEditionLimits(uint256)", +"4a61fc1e": "getWinners(bytes32)", +"4a6213a1": "MAKERDAO_FEED_MULTIPLIER()", +"4a624310": "getAngelInfoByTile(uint16,uint8)", +"4a627e61": "someValue()", +"4a62cc73": "auditQueueExists()", +"4a62f5eb": "_isTokenActive()", +"4a63464d": "adminClaimAirdrop(address,uint256)", +"4a635d05": "testCampaignGoalReached()", +"4a63864b": "RATE_RATIO_SCALE()", +"4a63b3d3": "lockBlock()", +"4a63f8a4": "presellTimer()", +"4a6458ae": "Rescued(address,uint256,uint256)", +"4a64c23f": "removeCbAddress(address)", +"4a661152": "get_exchange_wei()", +"4a66ddff": "twin_contract()", +"4a67fa7d": "setLotteryFee(uint256)", +"4a681b1b": "EXPECTED()", +"4a683a65": "addBTCTransaction(uint256,bytes16,address)", +"4a68492c": "setTransferAgentStatus(address,bool)", +"4a6a225e": "proxyPayment(address,bytes4,bytes)", +"4a6aac33": "DATE_31_DEC_2020()", +"4a6b0b05": "NewArtwork(address,bytes32,uint256,string,string,uint256,address,bool,bool)", +"4a6b8cf6": "setPretgeAddress(address)", +"4a6b9473": "registerActionEvent(bytes32)", +"4a6bb4a5": "updateWallet(address,address)", +"4a6bfa2d": "salesActive()", +"4a6c121d": "uintToBytes32(uint256,uint256)", +"4a6cfca7": "getAccessory(uint256,uint256)", +"4a6d0292": "addSale(address)", +"4a6de5c3": "_getAvailableBalance()", +"4a6e2ffe": "calculateReferral(uint8)", +"4a6f2691": "setBoolF1(bool)", +"4a7004b9": "getTotalTokenDepositByAddress(address)", +"4a700545": "PrivateSaleAddress()", +"4a701fc3": "setownerInfo(address,bytes32,bytes32,bytes32)", +"4a7084bb": "setPublicOfferDate(uint256,uint256,uint256)", +"4a714378": "toggleVending(uint256,uint256)", +"4a714c24": "payers(address)", +"4a7160a2": "addSet(bytes32)", +"4a716adf": "transferVotes(uint256,address)", +"4a719a27": "getTargetRepMarketCapInAttoeth()", +"4a71a768": "setWeiCapPerAddress(uint256)", +"4a71d469": "collectRev()", +"4a720287": "setEarlyEndTime(uint256)", +"4a729fe1": "pay(address,bytes12)", +"4a733ded": "paybackContribution(uint256)", +"4a738bea": "withdrawWithFee(address,uint256,bytes32,address,uint256,bool)", +"4a74ca99": "disconnectOrderPrice(address,address,uint256,uint256)", +"4a751072": "rateBoundaries(uint256)", +"4a7510fc": "StealResources(uint256)", +"4a75c0ff": "StoreDocument(bytes32,string,string)", +"4a75e6c3": "servicePayment(address,uint256)", +"4a75e741": "add_owner(address)", +"4a765625": "AliParsafar()", +"4a76564e": "tokenReleased()", +"4a76869f": "commitOrder(string)", +"4a768eaa": "buytoken(address,uint256)", +"4a7759f8": "BALL()", +"4a776104": "canFinishPVP()", +"4a77f870": "migrateAll()", +"4a78a594": "getClaim(string,string,address,uint256)", +"4a78cdba": "jackPot()", +"4a7902d2": "changeRoot(address)", +"4a790540": "getPastWinnerPrizes()", +"4a793c0c": "cidTotalTokenSupply()", +"4a797494": "priceRound3()", +"4a7987a2": "setProvider(bytes32,address)", +"4a79d50c": "title()", +"4a7b1acc": "MapDemo()", +"4a7b26ec": "join_game(uint256)", +"4a7b7ec3": "mintMarketMakerCancel(address,address)", +"4a7b8f21": "addHarvestOperationEndorsement(string,bool,string,string)", +"4a7bb697": "AssignGGCPoolOwner(address)", +"4a7c7e46": "uintToAscii(uint256)", +"4a7cb0f5": "FoundationRequested(address,address,bytes32)", +"4a7d505c": "initBetType()", +"4a7d5899": "payOut(address[])", +"4a7d8bcc": "getCurrentTokenPricepreICO(uint256)", +"4a7d9f0f": "getSettlementPeriodEnd()", +"4a7dd523": "generate(uint256)", +"4a7de068": "finalizeSetDelegatedFrom()", +"4a7e00de": "rejectCompanyAllocation(address)", +"4a7e049e": "getFullCompany(address,uint256)", +"4a7e130e": "remainTime()", +"4a7ffcbc": "daoContract()", +"4a800b98": "cancelChampSale(uint256)", +"4a803387": "insert(uint256,uint256,uint256)", +"4a8075ac": "SaleAuction(address)", +"4a80dcab": "getProjectMilestonesCount(bytes32)", +"4a80f2ba": "registerKey(string)", +"4a812023": "logUniverseForked()", +"4a81db9a": "moneybackaddr()", +"4a81dc0f": "forceUpdatePrizes(uint256[])", +"4a82534b": "create(address,address,address,uint256,uint8,uint8,uint256)", +"4a825c68": "checkRoundEnd()", +"4a826823": "setCastle(uint64,uint64,uint64,uint64,uint64,uint64)", +"4a82804e": "setNewMessage(string)", +"4a8302a2": "SynixToken(uint256,string,uint8,string)", +"4a8305b4": "newCoinOwner(address)", +"4a838caf": "ethfortnite()", +"4a83cfa9": "burnMedal(uint256)", +"4a84fa81": "checkRokSold()", +"4a85223b": "addUser(address,string,string,int256,string)", +"4a85280e": "isAuthorizedAddress(address)", +"4a85512f": "awardInvation(bytes32)", +"4a85d0d5": "HeliumNetwork()", +"4a85dbcd": "setVal(string,uint256)", +"4a8646c3": "HomeLoansToken(uint256,string,uint256,string)", +"4a8671f1": "newWallet()", +"4a867488": "setVestingPercent(uint256)", +"4a87b419": "cancelApproveFee()", +"4a87e08a": "BUY_CITY_FEE()", +"4a881ac6": "addAddressDescription(string,address)", +"4a88eb89": "altDeposits()", +"4a88f9c7": "exFees(uint256)", +"4a891e7f": "FinalizeMove(address,string,string)", +"4a896384": "ask()", +"4a8967a6": "_today()", +"4a8a6eac": "CarRegistered(uint256)", +"4a8a83db": "calculateVestedTokensTime(uint256,uint256,uint256,uint256,uint256)", +"4a8b2b27": "testOne()", +"4a8b5389": "allocateBountyAndEcosystemTokens()", +"4a8beaf4": "decline(string)", +"4a8c1fb4": "isActivated()", +"4a8c2d64": "TopsXToken(uint256,string,uint8,string)", +"4a8c3129": "MultiOwners()", +"4a8cbae1": "charityPercent()", +"4a8e4d78": "getDuesIn(uint256)", +"4a8e5651": "resultAccept()", +"4a8ef4bd": "setOrderBookAcount(address)", +"4a8ef851": "pushTicketSetToAccount(uint256,uint256)", +"4a909d5f": "transferWithLockup(address,uint256,uint256)", +"4a910046": "getLastHash()", +"4a914e8c": "calculateTotalExpenseWithdrawableAmount()", +"4a915ea2": "votedHarvest()", +"4a91e536": "getWinnerDetails(uint256)", +"4a91ec80": "prospectors_dev_allocation()", +"4a91ee2a": "allowByPassword(bytes8,bytes)", +"4a91f195": "totalBought()", +"4a923199": "maximumTNB()", +"4a92fa06": "createPromoRide(address,string,bytes7,uint256)", +"4a92fb3a": "proxyTransfer(address,address,uint256)", +"4a943eb3": "numsuccesses()", +"4a945f8d": "setAddresses(address,address,address,address)", +"4a947bdb": "putMatingRequest(uint256,uint256)", +"4a950db6": "tradetxToken()", +"4a950f00": "TurkeyBurgerToken(uint256)", +"4a955659": "_getNewLotteryCreatedAt()", +"4a96712e": "confirm(bytes32,address,uint256,uint8,bytes32,bytes32)", +"4a96d129": "OfferTime()", +"4a975d6b": "allocateRestrictedTokenTo(bytes32,bytes32,bytes32,uint256)", +"4a980b49": "IRideToken()", +"4a98146a": "VILLAGE_START_PRICE()", +"4a994d22": "_getReleaseDate(uint256)", +"4a994eef": "setDelegate(address,bool)", +"4a9952c7": "setMintTokenOwner(int256,address,address)", +"4a9a6f15": "getFromFaucet(string)", +"4a9b3f95": "personUpdateName(uint256,string)", +"4a9b5c2e": "CREATOR_TOKEN_END()", +"4a9bdb65": "byuoutCount()", +"4a9cdfad": "setPlayerLAff(uint256,uint256)", +"4a9d367b": "RecipientChanged(address,address)", +"4a9d9172": "test_testableStandardCampaignAbsolvementAfterPayout()", +"4a9f0110": "setSellDailyLimit(uint256,bytes2,uint256)", +"4a9f6d4a": "setMaxPreCrowdAllocationPerInvestor(uint256)", +"4a9fefc7": "getReferrer(address)", +"4aa16737": "enter(uint8)", +"4aa1acb3": "withdrawEth(uint256,bytes)", +"4aa1d21b": "transferDryRun(address,address,uint256,uint256)", +"4aa1dde4": "isDisclosureFullySigned(uint256)", +"4aa2f0f5": "HKD_Omnidollar()", +"4aa3fcd3": "_getSkillConfigs()", +"4aa41e53": "minFinneyPerHedgeTransfer()", +"4aa47a50": "isIntermediateVault()", +"4aa4ba9b": "storeBatch(string)", +"4aa5a05d": "maxP1Cap()", +"4aa5b398": "voteCurrentResult()", +"4aa669d8": "Buy_Wall_level_in_wei()", +"4aa66b28": "getBonus(uint256)", +"4aa678c3": "getMyUnlockValue()", +"4aa6c09a": "setTargetDiscountValue3(uint256)", +"4aa735c0": "BST()", +"4aa74c27": "_emitFuture(bytes32,uint256,uint256,uint256)", +"4aa77c71": "Visualrocktoken()", +"4aa83079": "setSaleContractFinalised(address)", +"4aa880c1": "SetFactoryParams(bool,bool,uint256)", +"4aa8e57e": "buyBox1()", +"4aa8e773": "Cancel()", +"4aab421d": "tgrAmountCollected()", +"4aab8c14": "setPonzi(uint8,uint256)", +"4aabcec7": "SimpleWallet()", +"4aac390a": "hasLanguage(address,address,uint256)", +"4aac75a7": "setMainSaleDates(uint256,uint256)", +"4aaca86d": "saleStage()", +"4aacd437": "freezeAccountPartialy(address,uint256)", +"4aaceed3": "icoBonus2()", +"4aada45f": "KittensDroped(uint256,uint256)", +"4aae385f": "preSaleFirstStartDate()", +"4aaf4a12": "getOwner(string)", +"4aaf6b86": "contract_state()", +"4ab0c0ee": "testConcatMemory32Bytes()", +"4ab0fc08": "setDefaultURIEnd(string)", +"4ab1c98f": "requestControllerContractMigration(address)", +"4ab24cf3": "pornToken()", +"4ab273f0": "SellEggs()", +"4ab320b4": "viewSettingsChange(uint256)", +"4ab358c7": "recoverFunds(uint256)", +"4ab3bbdc": "_brokerFeeDistribute(uint256,uint256,uint256,uint256)", +"4ab3bc23": "getSelfCardDatas()", +"4ab3d487": "newEntry(uint256)", +"4ab40ac6": "allOpenTradesAmounts()", +"4ab5439b": "TEAM_POOL_ADDR()", +"4ab54530": "inPreSale1Period()", +"4ab5cc82": "latestValue()", +"4ab6d337": "getContributorsLength()", +"4ab74a1e": "tok()", +"4ab7508a": "multiWallet()", +"4ab788cb": "prebridge()", +"4ab798f1": "toggleTransfer()", +"4ab7cbfe": "getMinerHalvingHashRateOf(address)", +"4ab89400": "cancelRefund(address)", +"4ab9792d": "setTokenFrom(address)", +"4aba5f34": "getCandidatesList()", +"4aba76a3": "ESlotsToken()", +"4aba7f96": "setMixGenAddress(address,address)", +"4abad407": "startCrowdfund(uint256)", +"4abb525a": "moonIncContract()", +"4abb9d39": "depletable()", +"4abc8652": "inPrivateSalePeriod()", +"4abd89bd": "MDICOStage2(address,address,uint256,uint256,uint256,uint256)", +"4abd8e01": "putStcWithBtc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"4abd8f65": "updateEnabled()", +"4abdf2e0": "setWithdrawLimit(uint256)", +"4abe1a62": "settleEtherPolicy(address[],uint256[],uint256[],uint256[])", +"4abe34f2": "TecToken(string,string,uint8,uint256)", +"4abefa36": "getEmployees()", +"4abfacfd": "createTeam(string,string,uint32,uint32,uint256)", +"4abfbbe3": "getBlockInfo(uint8,uint8)", +"4ac0b6b0": "preparePaymentReferrer(address,uint256)", +"4ac0d66e": "newGreeting(string)", +"4ac1ad78": "getWeekday(uint256)", +"4ac1b5ff": "GoldmintUnsold(address,address)", +"4ac25224": "isChannelOpen()", +"4ac2d103": "miningReward()", +"4ac36201": "Yachtco()", +"4ac365c2": "DividendTransfered(uint256,address,uint256,uint256,uint256)", +"4ac38f13": "BlupassToken()", +"4ac39f37": "unsafeIsSigned(uint16)", +"4ac429f2": "ConstantinopleCheckFunction()", +"4ac54245": "_fulfill(bytes32)", +"4ac5aae5": "getTotalBonus()", +"4ac5dea9": "getRoundPointer(uint256,uint256)", +"4ac6b2be": "getCheckRecordCreator(bytes)", +"4ac6d5f4": "frostTokens()", +"4ac79795": "removeLogic(address)", +"4ac7becf": "SimpleSign()", +"4ac84218": "RequiredFeeNotMet(uint256,uint256)", +"4ac84242": "CWT(uint256,string,string)", +"4ac87af7": "frozenToken(uint256,string)", +"4ac87e47": "Bittwatt(uint256)", +"4ac8a529": "createDispute(uint256)", +"4ac9f0d7": "behalfer()", +"4ac9f881": "takeSellOrder(address[3],uint256[3],uint256,uint8,bytes32,bytes32)", +"4ac9fc37": "updateConvertionRate(uint256)", +"4acb17c8": "getPeggedTokenAddress(address,address,uint256)", +"4acb232b": "percentWeiMC()", +"4acb3e59": "QCOToken(address,address,address,address,address)", +"4acc50eb": "Invoked(address,address,bool,uint256)", +"4acceeea": "togglePrebrdige()", +"4acd058e": "auctionBonus(uint256)", +"4acd44db": "offChainManager()", +"4acd4d5c": "mintLockCashout(address,uint256)", +"4acdc150": "setupCrowdsale(uint256)", +"4acdd29a": "statusPred(address,uint256[],uint256)", +"4acddfa0": "register(address,string,uint256,string,string,string,bytes20)", +"4ace9ccc": "ratePlansOfVendor(uint256,uint256,uint256)", +"4acea254": "inviteAmountLimit()", +"4acefeb1": "ethartArtAwarded()", +"4acf071c": "setStepTwoTime(uint256,uint256)", +"4acf4a27": "withdraw(uint128,address,uint256,uint128)", +"4acf8867": "PillarToken(address,address)", +"4ad07b0e": "oracleOutcomes(bytes32,address)", +"4ad0a529": "currentMigrationTarget()", +"4ad1cbad": "withdrawTeamTokens(address,uint256)", +"4ad25557": "getMonsterNum(uint256)", +"4ad27ae1": "claimInternal(address,address)", +"4ad32970": "setUserAllocs(address[],uint256,uint256)", +"4ad37241": "destroyCard(uint256,uint16)", +"4ad37538": "DJPToken()", +"4ad42500": "ico26()", +"4ad447ba": "PutinCoin()", +"4ad4fa5d": "ERC223()", +"4ad59c54": "overpays(address)", +"4ad5a68c": "returnIdImage(uint32)", +"4ad5f440": "totalIcoTokensSold()", +"4ad6e648": "fightFactor()", +"4ad6f9f3": "checkTx(string)", +"4ad7799f": "VestingReleased(address,uint256)", +"4ad857a1": "etherSent(uint256)", +"4ad88363": "reset_application(address)", +"4ad8c869": "reCommentReward()", +"4ad8c938": "createSiringAuction(uint256,uint256,uint256,uint256)", +"4ad9b1c3": "addWallets(address[])", +"4ad9d7ab": "getGoldStatusRegistered(address)", +"4ada218b": "tradingEnabled()", +"4ada3b32": "approvedAccount(address,bool)", +"4adaedef": "send_allowed()", +"4adaf5f6": "changeFundOwner(address)", +"4adaf748": "eBlockPower()", +"4adbe551": "whitelistAdmin()", +"4adc0b09": "setMembershipPrice(uint8,uint256)", +"4adcbd19": "isThisHardforkedVersion()", +"4adf6591": "setReportTimestamp(uint256)", +"4ae00041": "call(address,bytes,uint256)", +"4ae0ac60": "FobsCoin()", +"4ae0f543": "publicAllocation()", +"4ae12e9f": "FHFToken()", +"4ae184f2": "createStandingOrder(address,uint256,uint256,uint256,string)", +"4ae2b849": "PHASE_DURATION()", +"4ae2c351": "createCrowdsaleTiers(bytes32[],uint256[],uint256[],uint256[],uint256[],bool[],bool[])", +"4ae3164d": "getNewGens(address,uint256)", +"4ae34a96": "changelp16(address)", +"4ae34bb1": "EfectiveToken()", +"4ae3643f": "phase_4_token_price()", +"4ae4dd6b": "KeyRewardPool(uint256,address,address)", +"4ae4e9ea": "m_currentTokensSold()", +"4ae51a9a": "transferDevTokens(address)", +"4ae55dd0": "amendedEarlyPurchaseIndexes()", +"4ae5d478": "setNodesVars(address)", +"4ae5eecb": "getUserP3DDivEarnings(address)", +"4ae6ab70": "_getRevisionTimestamp(bytes20,uint256)", +"4ae85627": "grindUnicorns(uint256)", +"4ae86038": "MultiBonusCrowdsale()", +"4ae8c55f": "getWwLength()", +"4ae8ef06": "setLastTier(uint16)", +"4ae8f9fb": "FSCP()", +"4ae90a40": "isNotaryAdditionValid(address,address,uint256,uint256,string,bytes)", +"4ae931cc": "setPresellUpToTime(uint256)", +"4ae96e77": "setTransformTarget(uint256)", +"4ae9af61": "getBotStats(uint256,uint256)", +"4aea0aec": "lendFee()", +"4aea5f0f": "Artcoin(address,uint256,uint256)", +"4aea7aa9": "SetIDChain(address,address)", +"4aeb0241": "LisaToken()", +"4aeba1a5": "removeCustomerService(address)", +"4aec4677": "migrateLosingTokens()", +"4aec6416": "removeTransferAndCallWhitelist(address)", +"4aecf91d": "_emitContractRemoved(address,address)", +"4aed8a76": "inPreSalePeriod()", +"4aeda70d": "changeAuctionContract(address)", +"4aeddad0": "ConvertBkp(uint256)", +"4aef05a5": "addSongWriter(string,uint256,address)", +"4aef8b7c": "_isOddFlag(uint256)", +"4aefc3c4": "ContributionStateChanged(address,uint8)", +"4af0700b": "isUniqueBlindedProposal(uint256,bytes32)", +"4af153a9": "_message(uint256)", +"4af165cb": "EPause(address,string)", +"4af1b8a7": "pullAddr()", +"4af1f96a": "getActiveSellSize(bytes32)", +"4af27ba2": "_redeem(address,address,uint256,bytes,bytes)", +"4af3182a": "move_x(uint8,uint8)", +"4af350eb": "transferTokens(address,uint256,address)", +"4af4a127": "bonusPeriod()", +"4af4c191": "TIER4_RATE()", +"4af54311": "burnSomeTokens(uint256)", +"4af56cb0": "getUseRegistry()", +"4af69189": "sponsoredJackpotToken()", +"4af6ffc2": "attest(uint256)", +"4af79ba2": "getChallengesForMentor(address)", +"4af7eedf": "VID(uint256,string,uint8,string)", +"4af80f0e": "setConversionWhitelist(address)", +"4af98f1b": "setFeeDivider(uint256)", +"4afb07c4": "getAccountActivity(address)", +"4afb09c2": "listDTH()", +"4afbac9c": "removeFromTokenList(address,uint256)", +"4afbb7d7": "getDepositary_function()", +"4afc0476": "RedPillCoin()", +"4afc7774": "_is()", +"4afce471": "test_requires_depth(uint16)", +"4afd74ff": "getRefunded(address)", +"4afd8a19": "getLendingInfo(address,uint256)", +"4afd8a98": "testEthIcoToken()", +"4afdcbde": "pauseOperator()", +"4afe2f80": "setRate(uint8)", +"4afe62b5": "placeBet(uint256,uint256)", +"4affb863": "isPartner(address,address)", +"4b00ebfb": "CheckExecution(string)", +"4b013f85": "_addVestor(address,uint256,uint256,uint256,bool)", +"4b023cf8": "setFeeAccount(address)", +"4b02e328": "IncorrectFee(address,uint256)", +"4b0304ab": "DonationReceived(address,uint256,uint256)", +"4b031397": "killAdminOnly()", +"4b031d0f": "shortSellShares(bytes,uint8,uint256,uint256)", +"4b03a15e": "_terminateSchedule(address)", +"4b042c0b": "specialsInfo(uint256)", +"4b05de75": "seventhTeamWithdrawal()", +"4b0697e4": "Manager(address)", +"4b06e1c7": "declareWininingFighter(address)", +"4b06fb28": "eatUnicornsAlive()", +"4b0720a7": "customGasPrice()", +"4b079fa6": "ownerof()", +"4b084d49": "checkEnd()", +"4b089b12": "withdrawManagerBonus()", +"4b09b72a": "reserveAmount()", +"4b09ebb2": "e_exp(uint256)", +"4b0a0d04": "checkRequestSignature(bytes,address[],uint256,bytes)", +"4b0ad8fa": "getStakedShop(address)", +"4b0adf6c": "MintingAgentChanged(address,bool)", +"4b0babdd": "releaseTokens(uint256)", +"4b0bbf84": "addEntropy()", +"4b0bddd2": "setAdmin(address,bool)", +"4b0c79aa": "turnOnOraclize()", +"4b0d5417": "disableSellToken()", +"4b0daadb": "getStaticArray()", +"4b0df486": "assertEq23(bytes23,bytes23)", +"4b0e2c90": "enableInternalLock()", +"4b0e5044": "HoldToken(address)", +"4b0e7216": "setBurnAddress(address)", +"4b0ee02a": "totalBalanceOf(address)", +"4b0f43fd": "canExecute(address,uint256)", +"4b106893": "inactive_withdraw(address)", +"4b11281e": "returnCreatorAddress(bytes32,uint8,bytes32[2])", +"4b11452c": "changeFoundationAddress(address)", +"4b114691": "playerInfo(address)", +"4b1146ca": "TOKEN_SUPPLY_BOUNTY_LIMIT()", +"4b11982e": "setCooldown(uint64)", +"4b11e7a0": "getVotingStart()", +"4b12416c": "setHeroTokenContract(address)", +"4b12dd39": "BTSCoin()", +"4b1325ea": "setNewOwnersCountToApprove(uint256)", +"4b143bb5": "harapan()", +"4b14e003": "transferAll(address,address)", +"4b16304f": "setTokenAddress(address,bytes)", +"4b1700df": "TokenListingManager()", +"4b1740ad": "tier3()", +"4b17bdd8": "transferTokensFrom(address,address,address,uint256)", +"4b18be1d": "moveLeftOvertokensToartistPool()", +"4b19eb09": "isStatePublic()", +"4b1a5773": "createSwapTarget(bytes20,address,address,uint256,address)", +"4b1be424": "getVotesBetweenFor(uint256,uint256,uint256,address)", +"4b1c5597": "dissolveFund()", +"4b1c8506": "bonusesList(uint256)", +"4b1cab4e": "calculateEthToToken(uint256,uint256)", +"4b1cdc2d": "token6DivsOwing(address)", +"4b1cff0b": "pot_()", +"4b1d00ee": "releasedCount()", +"4b1d29b4": "maxLockPeriod()", +"4b1dc225": "founderWithdrawablePhase3()", +"4b1dd21a": "getWhitelistLimit(address)", +"4b1dd591": "firstDiscountCap()", +"4b1ebc5a": "perpetuum()", +"4b1ec20c": "setPropertyPrivateMode(uint16,bool)", +"4b1ef6e1": "getMyRecord(address,uint256)", +"4b1f15d1": "updateDragonPrice(uint256)", +"4b1fb6d4": "removeNacFromNetf(uint256)", +"4b1fe17e": "ENSResolver(address)", +"4b200fac": "ClearCoin()", +"4b20ae39": "create(address,address,address,uint256,uint256,uint256,uint256)", +"4b21433a": "CoolICOToken()", +"4b21a587": "sellerfeeDivide()", +"4b21aaae": "getBondPrice(uint256)", +"4b2233df": "buyTokenSub(uint256,address)", +"4b227176": "pID_()", +"4b236401": "claimPlot(uint256,uint256)", +"4b242252": "levelByToken(uint256)", +"4b24ea47": "controllerAddress()", +"4b24f3a6": "setJackpotFee(uint256)", +"4b24f7aa": "CSpacesToken()", +"4b24fd0d": "getKeyType(address)", +"4b256137": "lockingContract()", +"4b259b5c": "getCumulativeAllowance()", +"4b25bfce": "whitelist(uint256,address)", +"4b269a00": "withdraw(int256[])", +"4b2702b3": "TokenSwitch(address,address,bool)", +"4b272c4a": "Greenbit()", +"4b274458": "getUncleAmount(uint256)", +"4b27a2ca": "fechVoteMainInfoForVoterBySnapshotBlock(address,uint256)", +"4b28a674": "organizer2()", +"4b28bdc2": "allRevealed()", +"4b2930d0": "IsICOrunning()", +"4b29c448": "setGoal(uint256)", +"4b2a12da": "changeMinDeposit(uint256)", +"4b2a4e18": "TradersWallet()", +"4b2a649c": "ECRecoverWrapper(string,uint8,bytes32,bytes32)", +"4b2ac3fa": "swapID(bytes32,uint256)", +"4b2acaa0": "openGateway()", +"4b2ba0dd": "originalSupply()", +"4b2be022": "BinaxToken()", +"4b2c0706": "getPeriod(uint256)", +"4b2c2596": "MerchantDealsHistory(string)", +"4b2c89d5": "redeemDeposits()", +"4b2cbc9d": "etherCollected()", +"4b2d5164": "transfer_tokens_after_ICO(address[],uint256)", +"4b2f249a": "isTileLive(uint16,uint8)", +"4b2f9eb7": "declareNewMaster(address)", +"4b313043": "preIcoMaxLasts()", +"4b314b34": "LogPause()", +"4b319713": "totalWithdrawn()", +"4b321502": "addHours(uint256,uint256)", +"4b331ca0": "getCitation(uint256)", +"4b33eac2": "updateTicketStructure(uint256,bytes32[],uint256[],uint256[],uint256[],uint256[],uint256[])", +"4b341aed": "totalStakedFor(address)", +"4b3544d5": "Jakov()", +"4b35ae33": "setTimeLimited(uint256)", +"4b369820": "setEntry(string)", +"4b36bca9": "WagerGames()", +"4b3727fb": "SshKey()", +"4b374fbe": "BTEN()", +"4b376513": "lastBlock_v13Hash_uint256()", +"4b376e45": "BoodooToken()", +"4b37c73f": "removeFactory(address)", +"4b37cf47": "littIsCapsule(bytes32)", +"4b3881ff": "StakeDestroyed(uint256,uint256,address,bytes32)", +"4b3955a5": "tier0LOT()", +"4b396ade": "TicketMultiTear(string,string[],uint256[])", +"4b3985a4": "shareTime()", +"4b398a5c": "mainnetLocked()", +"4b3a5fa6": "saleStartFirstDayEnd()", +"4b3ab5bf": "paySubscriptionFee()", +"4b3ab9c5": "getShare(address)", +"4b3afdd2": "setEthernautsStorageContract(address)", +"4b3b1d69": "notZero(uint256)", +"4b3b548f": "preMine()", +"4b3b6168": "SetNewBigContract(address)", +"4b3c45db": "getDealDataByNumber(uint256)", +"4b3ce14d": "set_minUETsPerReturnMoreThan(uint256)", +"4b3d81b6": "initialBlockTimestamp()", +"4b3ec03a": "TEAM_ACCOUNT()", +"4b3f3987": "_updateLock(uint256,address)", +"4b419b5f": "setcardPrice(uint256,uint256)", +"4b41c74a": "Ticker()", +"4b41cb60": "withdrawPreSigned(address,uint256,address,uint256,uint256,address,uint8,bytes32,bytes32)", +"4b41eb4a": "ZyryanovKubSU2018()", +"4b41f4df": "transferableTime()", +"4b42d208": "getUint8FromByte32(bytes32,uint8)", +"4b432966": "max_fortunes()", +"4b43b582": "changeAdminWallet(address)", +"4b43dc51": "testTokensAreLockedDuringSale()", +"4b449cba": "auctionEndTime()", +"4b452958": "_setStakingEpochStartBlock(uint256)", +"4b467105": "walletCommunityReserve()", +"4b467157": "stopEmergencyWithdrawal()", +"4b468b0e": "JDAnteil()", +"4b469490": "RichToken(address)", +"4b471dd0": "setWithdrawalAndReinvestmentContracts(address,address)", +"4b496444": "azatipToken()", +"4b4a456a": "ChargeFix(uint256)", +"4b4a5088": "switchCompatible20(bool)", +"4b4af4db": "allocateTeam(address,uint256)", +"4b4b6338": "MECoin(uint256)", +"4b4b87c0": "PowerCoin()", +"4b4bb75b": "DSToken(string,string)", +"4b4c01f4": "RobincoinERC20(uint256,string,string)", +"4b4c0d7c": "BONUS2()", +"4b4c2039": "_B_sendToEthertoteDevelopmentWallet()", +"4b4e23e1": "TIMESTAMP_BUCKET_SIZE()", +"4b4e38df": "GetCurrentPoolAmount()", +"4b4f8e36": "addCZRLock(address,uint256,uint256,uint256)", +"4b4f90ef": "saleIsOn()", +"4b504ecd": "logNewPlayer(address)", +"4b50c9f0": "getGameStartTime()", +"4b513e82": "RegistrantApproval(address)", +"4b5243b5": "ETGTestCoin()", +"4b52f48f": "withdrawLeft()", +"4b52f89b": "setGiftToken(address)", +"4b530090": "nextDiscountTTWTokenId1()", +"4b534c48": "unlockProjectToken()", +"4b54d131": "wipeProposedActions()", +"4b54f1fb": "S1Coin()", +"4b561a16": "getMatchInfo(uint256)", +"4b563657": "setMessages(bytes32,bytes)", +"4b56b10d": "preIco()", +"4b56cd27": "depositBoth(address,uint256)", +"4b56dcf4": "LogChangeIsPayableEnabled()", +"4b57b0be": "wethToken()", +"4b57ed55": "EnonRToken()", +"4b57fbaf": "SetMinChequeValue(uint256)", +"4b5830b4": "SENC_CONTRACT_ADDRESS()", +"4b58484d": "_createPlayer(address,address)", +"4b58bb40": "timeUntilNextRound()", +"4b58d0bb": "reserveFundAddress()", +"4b59e880": "puzzle(address,bytes32,bytes32)", +"4b5a0e65": "getWinningStageInfo()", +"4b5a726d": "getProgramInfo(uint256)", +"4b5c0234": "throwsWhenHittingHardCap()", +"4b5c4277": "log(string,string)", +"4b5c8bdf": "stakeTotal()", +"4b5dc8cb": "roundMoneyDown3SFExt(uint256)", +"4b5dcad7": "ServiceStation(address)", +"4b5e8d63": "registerInvestor()", +"4b5f297a": "hasAttribute(address,uint256)", +"4b5f2fa4": "TravelZediToken(uint256,string,uint8,string)", +"4b5f3e0a": "getDate(bytes32)", +"4b5fd350": "withdrawHeldToken(uint256,uint256,uint256,uint256)", +"4b5fea8a": "milestoneRecipients(uint256)", +"4b602673": "artworks(uint256)", +"4b603a83": "mintTokens_(address,uint256,address)", +"4b61cf17": "SWLPerEther()", +"4b623178": "removeFromPublicWhitelist(address)", +"4b627107": "setValidatorDescription(address,string)", +"4b62e0d9": "buyIns(uint256)", +"4b63036d": "holderContract()", +"4b63189c": "softcapPreSale()", +"4b63e601": "scheduleCall(address,uint256,bytes)", +"4b641f52": "coinbaseInit()", +"4b64a00f": "DiscountApplied(uint256,uint256,uint256)", +"4b64e492": "execute(address)", +"4b650d0b": "getPlayerClickCount(uint256,address)", +"4b656b41": "totalWeiRaisedDuringPhase1()", +"4b66cb7e": "teamHolder()", +"4b6753bc": "closingTime()", +"4b67f6af": "name2()", +"4b689cf0": "setCommunityAccountOwner(address)", +"4b69c3d4": "getRegistryDataVendor()", +"4b6a3334": "setEtherPrices(uint256,uint256)", +"4b6a8604": "setBiddingRate(uint256,uint256)", +"4b6a9f1d": "STORES_TO_UPGRADE_1CENTER()", +"4b6acafb": "totalDividend()", +"4b6ad918": "isCurrentUserRefAvailable()", +"4b6b2300": "updateTopicAssetClass(bytes15,string)", +"4b6bc655": "isFreeze(address,address)", +"4b6bdf1d": "poker()", +"4b6c144a": "getClaimById(string)", +"4b6dfe4e": "initialFundBalance()", +"4b6e7d78": "Data()", +"4b6ea677": "oracleURL()", +"4b6ede29": "Users()", +"4b702afa": "accountS()", +"4b70cec4": "getTime(address)", +"4b71bff3": "airdropReward()", +"4b726f61": "checkCustomer(string,string)", +"4b729aff": "buyNumber(uint256)", +"4b72bbaf": "getSirePrice(uint32)", +"4b739b61": "payByEth(uint256)", +"4b73ca04": "flipsCompleted()", +"4b741395": "requestNewMint(address,uint256)", +"4b749535": "hardCapTokens()", +"4b750334": "sellPrice()", +"4b75f046": "tokensIssuedCrowd()", +"4b75f54f": "formula()", +"4b760612": "localsCointoken(uint256,string,uint8,uint256,string,string)", +"4b763fe7": "PersistLimitChanged(uint256)", +"4b766b95": "markRewardsSet(string)", +"4b76cb13": "get_status_user(address,address)", +"4b76fe19": "EtherPredict()", +"4b778445": "addRound(uint256,uint256,uint256)", +"4b77b8d3": "stopCrowdfunding()", +"4b77c468": "invite(address)", +"4b77d17d": "is_king_found()", +"4b7829f1": "token_claim_waiting_period()", +"4b7863fe": "setIBalance(uint256,uint256)", +"4b78ab61": "notarizationList(uint256)", +"4b798b82": "setFixes(string,string)", +"4b79e8ef": "getVariablesForDapp()", +"4b7a5cc6": "PLATINUM_AMOUNT_NDC()", +"4b7a7a14": "PresaleFirst(uint256,uint256,address,address)", +"4b7ae9f6": "returnMe()", +"4b7b2ed1": "confirmTransaction(address)", +"4b7b45b4": "DreamMaker()", +"4b7bb8e3": "CfoAddress()", +"4b7c1d2c": "TransactionConfirmed(uint256,uint256)", +"4b7e23b3": "ShapeshiftBotLookup()", +"4b7fa6db": "viewFn(uint256)", +"4b7fcee7": "ownerPausePayouts(bool)", +"4b802dde": "rentals()", +"4b803095": "processReferralSystem(address,address)", +"4b813478": "FinishBallot(uint256)", +"4b81780e": "ADDR_MAYA_ASSOCIATION()", +"4b82d416": "preSaleSecondEndDate()", +"4b82ee28": "frozenDaysForEarlyInvestor()", +"4b82f437": "setFirstReporterCompensationCheck(uint256)", +"4b836181": "BuyTicket(address)", +"4b8399f4": "setEnum()", +"4b841fa9": "redeem(string,uint256,uint256,uint8,bytes32,bytes32)", +"4b84ee81": "LogAddTokenPairWhitelist(address,address)", +"4b851b23": "hasDefaultRelease()", +"4b852c03": "setDuration(uint64)", +"4b855c62": "purchaseKingdom(string,string,bool,address)", +"4b8574ad": "AttestationManager()", +"4b85fd55": "setAutoBirthFee(uint256)", +"4b8624c4": "BONUS()", +"4b865846": "suspend(uint256)", +"4b866981": "LP(uint256,string,string)", +"4b869e15": "investeth2017()", +"4b86c225": "lock(address,address,uint256,uint256)", +"4b86faba": "claimHodlReward()", +"4b86fc5b": "isEligible(address,string,string)", +"4b8772c1": "buyUnit(uint256,uint256)", +"4b886f09": "VantageCoin(uint256,string,uint8,string)", +"4b891518": "_grantAccess(uint256,address)", +"4b89c41d": "setClosingTime(uint256)", +"4b8a3529": "borrow(address,uint256)", +"4b8adcf7": "pauseContribution()", +"4b8b4cee": "postExternalPayment(address,uint256,uint256,uint8,uint256)", +"4b8b704e": "icoTokensCount()", +"4b8b7a2a": "addCourse(string,uint256,string,string,string,string)", +"4b8ca215": "Ornament()", +"4b8d12f0": "migrateAddress()", +"4b8dbd1a": "VRFtoken()", +"4b8dc588": "closeRefundVault(bool)", +"4b8e1ba8": "isMinter(int256,address)", +"4b8e31a2": "_erc20token()", +"4b8e38db": "test(uint32[26],uint32[4])", +"4b8f4b5e": "MordernToken()", +"4b8f9f87": "ownerSetMinJackpoBet(uint256)", +"4b8fe5eb": "setPendingUserListLength(uint256)", +"4b8feb4f": "multiSigWallet()", +"4b901b72": "balanceOfByTranche(bytes32,address)", +"4b9081bf": "getBonusSale(uint256,uint256)", +"4b90ac86": "isBountySent()", +"4b9143f7": "setSold(uint256)", +"4b915a68": "aliceClaimsDeposit(bytes32,uint256,address,address,bytes20)", +"4b91ab35": "unfollow(bytes32)", +"4b922b12": "getDataColla_AB_01(string)", +"4b92738e": "migrateBalances(address[])", +"4b92f39e": "tradingClass(address)", +"4b930503": "registerName(address,string)", +"4b931600": "evaluateCategory(address,uint8,uint256,uint256)", +"4b932327": "novaluetoken(uint256,string,string)", +"4b93fec0": "BetContract()", +"4b944b9b": "post(bytes32,bytes32)", +"4b94f50e": "getTokenPrice()", +"4b95dcc0": "ViberateCrowdsale()", +"4b960794": "spotsLeft()", +"4b963025": "addUniqueSaleTokensMulti(address[],uint256[])", +"4b96b0ee": "registerZone(bytes8)", +"4b96f855": "burnPercentageDefault()", +"4b97aed9": "numOptions()", +"4b97e6cc": "withdrawEthBalanceSave()", +"4b991bde": "challenge(uint64,uint256,bytes,bytes,bytes)", +"4b997d9a": "sendTokens(uint256,address,bool)", +"4b99f0c5": "setTradingPairCutoffs(bytes20,uint256)", +"4b9a22af": "teamWon()", +"4b9b808d": "setResetVoteKindnessEvery(uint256)", +"4b9c4358": "betPlaced(address,uint256,uint256)", +"4b9c78e5": "buyEngineer(uint256[])", +"4b9cdbe7": "addCurrencyInternal(uint256)", +"4b9ce83c": "recordAssetPrice(uint128,uint128,uint128)", +"4b9d5047": "PlutoToken()", +"4b9d8624": "getLinks(address)", +"4b9de7a2": "dataIdentifiers(uint256)", +"4b9de81e": "endTimeRound2()", +"4b9e7ecd": "test_1_restrictDoubleVote_shouldThrow()", +"4b9eb771": "CAT_PER_ETH_FIRST_EARLY_BIRD_RATE()", +"4b9ed302": "setEarlyInvestorsBonus(uint256)", +"4b9ee106": "setMetaBetWeight(uint256)", +"4b9eea9b": "decodeKYCFlag(uint128)", +"4b9f5c98": "vote(bool)", +"4b9faf4c": "setTokenBalance(uint256,bool)", +"4ba034dc": "unlockGrowthPoolTokenSupply()", +"4ba0dd3c": "BotFarmer()", +"4ba1f098": "acceptRequest(uint256)", +"4ba20050": "getProduct()", +"4ba2363a": "pot()", +"4ba26466": "TPP2018TOKEN()", +"4ba2ab8a": "RockPaperScissorsAdvanced()", +"4ba2d5ff": "setThreePowerAges(uint256,uint256,uint256,uint256,uint256,uint256)", +"4ba336e5": "calculatePoolCut(uint256)", +"4ba4079a": "enableSwitch(bytes32)", +"4ba4c16b": "guess(uint8)", +"4ba4d784": "getMinutes(uint256)", +"4ba5b7b3": "crowdsaleRefund()", +"4ba6e72e": "advisoryTotalSupply()", +"4ba71f3c": "OxToken(address)", +"4ba79dfe": "removeAddress(address)", +"4ba8fde0": "_computeIncentiveCut(uint256,uint256)", +"4ba90201": "setFinishPreICO(uint256)", +"4ba9bb67": "arr(address,address,uint256)", +"4ba9fb71": "closeAskOrder()", +"4baa39be": "editBet(uint256,uint256,uint256)", +"4baa8160": "triggerAttack(uint32,uint128)", +"4baa9dc7": "addCashback(string,address,uint256[],uint256[])", +"4baaab80": "MyToken(string,string,uint256,uint256,address,address)", +"4bab0236": "wercoin()", +"4bad0881": "P4WDToken()", +"4bad294d": "asFunc(uint256)", +"4bad3327": "_mul(uint256,uint256)", +"4bae2ef1": "referrerBonus()", +"4bae6659": "fixedDeposit(uint256)", +"4baf4a76": "addToWhiteListMultiple(address[],address[])", +"4baf7a30": "TypesToBytes()", +"4bafa2a4": "totalMIT()", +"4bafa437": "setSECOND_STEP_MULTIPLIER(uint16)", +"4baffdc6": "_withdrawHoldVault(uint256)", +"4bb017a1": "destroySalesManager(address)", +"4bb07665": "whitelistUser(address,uint128)", +"4bb13055": "returnAllAvailableFunds()", +"4bb13e63": "setTripleRoomMin(uint256)", +"4bb22b5a": "execReturnValue(uint256)", +"4bb24399": "survive(address,address,uint256)", +"4bb278f3": "finalize()", +"4bb2e417": "SokToken()", +"4bb32e8c": "setDNoEditors(bytes32)", +"4bb37790": "restrictionExpiraton()", +"4bb4b260": "cashAllOut()", +"4bb593b2": "updateUser(address,string,uint256,uint256,uint256,string,bool)", +"4bb6e766": "checkTransferAllowed(address,address)", +"4bb72dea": "setPriceStep4(uint256)", +"4bb77d9d": "updateRates(uint256[])", +"4bb8596e": "managerSet()", +"4bb89c4d": "sendBounty()", +"4bb9962f": "HexelErc20Token(string,string,uint256)", +"4bba32fb": "round3StartTime()", +"4bba38b8": "getRef(address,address)", +"4bba863e": "getEthOfferor(uint256)", +"4bba8a58": "RepostiX(address,address)", +"4bbaa946": "getAllArea()", +"4bbb216c": "_target(address)", +"4bbb58b2": "setVirusInfo(uint256,uint256)", +"4bbbe0cc": "exporter()", +"4bbc142c": "allowOwnership(address)", +"4bbc2a4a": "changebank(address)", +"4bbcc1bc": "payoutSelf(address)", +"4bbcd6e8": "buyPresaleTokens(address)", +"4bbd3061": "DateCreateToken()", +"4bbf2c69": "excludeInvestor(address)", +"4bbf3a7a": "swapToken(uint256)", +"4bc091a3": "getCrowdsaleStartAndEndTimes()", +"4bc18a64": "deleteLock(address,uint8)", +"4bc1aa42": "VESTING_ADVISOR_CLIFF()", +"4bc24ec5": "right61(uint256)", +"4bc2a657": "setVoter(address)", +"4bc32ea2": "getBidCountForAuction(uint256)", +"4bc36600": "reorganizeMembers()", +"4bc3b153": "REWARD_FORWARD_POSITION()", +"4bc3df81": "BuyBooster(uint256)", +"4bc4549c": "todaySold()", +"4bc4d2ba": "KIN_PER_WEI()", +"4bc4e892": "startNextEra(bytes32)", +"4bc53249": "toB32(uint256,bytes,uint256,address)", +"4bc57a7c": "Medis()", +"4bc5d101": "CreatorWithdraw(uint256)", +"4bc70b1e": "withdrawFunds(uint16)", +"4bc8c477": "VirtualRealEstate()", +"4bc935d7": "verifyProof(bytes32[],bytes32,bytes32)", +"4bc9fdc2": "calcMaxWithdraw()", +"4bca4626": "ethWeiRaised()", +"4bca5cc0": "_setAdmin(address,bool)", +"4bca7f95": "NigeriaNairaToken()", +"4bca893d": "Count(uint256,uint256)", +"4bcb776f": "sliceIndexThrow()", +"4bcbcd89": "getEngineerLv1(address)", +"4bcd245d": "gameStatusSet(bool)", +"4bce2e9b": "totalEnjSold()", +"4bce79a1": "getAllSocialAccounts(bytes32)", +"4bcf244b": "ECRecoverWrapperF(bytes32,uint8,bytes32,bytes32)", +"4bcf74b2": "AccountMinterAdded(address,address)", +"4bcf8645": "returnFundsToClient()", +"4bd09c2a": "distributeTokens(address[],uint256[])", +"4bd1c253": "ChipExists(uint32)", +"4bd21127": "setAdminLevel(address,uint8)", +"4bd22521": "Electricity(string,string)", +"4bd22766": "refundETH(address,uint256)", +"4bd3a225": "setMultiplePreSalesSpecialUsers(address[],uint256)", +"4bd3af72": "sellGolds()", +"4bd3b4c6": "allowAuditor(address)", +"4bd4d93a": "transferFromWithMsg(address,address,uint256,string)", +"4bd4ddb9": "testThrow_invalidZeroValue1()", +"4bd4e770": "CheckSign(string,string)", +"4bd50dcf": "sendFromContract(address,uint256)", +"4bd544e8": "isEligibleToPlay(address)", +"4bd54f04": "dynamic()", +"4bd5610d": "jsonCat(string,string,int256)", +"4bd58c92": "LogBuyForFiat(address,uint256)", +"4bd67ced": "get_last_asset_document(bytes32)", +"4bd70ea3": "testFailGetUnset()", +"4bd7730b": "Senpona(uint256,string,uint8,string)", +"4bd79ac1": "lastCalculationRewardTime()", +"4bd889b4": "removePersonalLock(address)", +"4bd8ae6f": "endCoinFlip(bytes32,bytes32,bytes32)", +"4bd9d10e": "backOut()", +"4bd9d76c": "payUnderwriter()", +"4bda2ad0": "addNote(bytes20,string)", +"4bda3f2b": "test_insert_findWithHintPrevUpdateTail()", +"4bda87b5": "GCHToken(string,string,uint8,uint256)", +"4bdb7369": "hasBoughtEgg(address)", +"4bdbb944": "GodviewChain(uint256,string,uint8,string)", +"4bdbea2f": "latestBalanceCheck(address)", +"4bdc44ae": "setNote(uint256,bytes20,string)", +"4bdc4ffe": "ProposalTallied(uint256,uint256,uint256,bool)", +"4bdd6a8e": "KPOPIO_CONTRACT_ADDRESS()", +"4bde38c8": "platform()", +"4bdec44a": "VotingRightsGranted(address,uint256)", +"4bdf1b0e": "receiveApproval(address,uint256)", +"4bdf6667": "IsGenesisAddress(address)", +"4bdf7e8b": "_updateExperience(address)", +"4bdfa061": "postGenesisSales(bytes32,uint256,uint256)", +"4bdfa999": "Given(uint256,address)", +"4bdfbb75": "isCanvasFinished(uint32)", +"4be02f32": "getPlayerWithdrawal(uint256,uint256)", +"4be04fd9": "getMyLastScore()", +"4be185f0": "editionOf(uint256)", +"4be36323": "bonusRoundId_()", +"4be366d5": "purch(address,address,uint256)", +"4be39f2f": "FEED2()", +"4be422ae": "logOut()", +"4be42c08": "updateRewardAmount(bytes32,bytes32,uint256)", +"4be4343d": "InterfaceApp(address,address)", +"4be5739e": "PUBLIC_SALE_LIMIT()", +"4be62668": "MainSaleDistributed()", +"4be6c20a": "Error(uint8,address,address)", +"4be7183a": "init(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"4be7ced7": "withdraw_team_fund(address)", +"4be860eb": "getMinGas()", +"4be9b992": "THRESHOLD3()", +"4be9d332": "jsonCat(string,string,string)", +"4bea4df7": "addLeaderboard(string,uint256)", +"4beb031b": "numBallots()", +"4beb536e": "allWagered()", +"4beb9e32": "approveByAddress(address)", +"4bebbf14": "setother(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"4bebdab7": "uintArrayToString(uint256[])", +"4bec70a8": "setAffirmationsSigned(bytes32,bool)", +"4bec8335": "changeSafeguardStatus()", +"4becfd56": "getCurrentGameInitialMinBetSize()", +"4bed33b8": "SHARE_PURCHASERS()", +"4bed6c23": "donationAmount()", +"4bed81c8": "getWalletUser(uint152)", +"4beda18b": "BILLION()", +"4bee09e1": "changeTicket(address)", +"4bef5e51": "assetRegistrant(bytes32,int256)", +"4bef6de9": "determinePrize(uint256)", +"4bef71ac": "changeColorTeal()", +"4befc326": "temperatureMax()", +"4bf003fa": "After(uint256,bytes32)", +"4bf02421": "calculateAttributeTotals(uint256)", +"4bf0d331": "canDeposit(address)", +"4bf1b68d": "setTokenSupplier(address)", +"4bf1e60a": "newDev(address)", +"4bf2c7c9": "setBurnFee(uint256)", +"4bf2d314": "setAdvisoryPool(address)", +"4bf365df": "mintable()", +"4bf49313": "requestPayment(uint256,uint256,string,address)", +"4bf4e421": "client_address()", +"4bf5ac36": "saleAgent2()", +"4bf69206": "stakeFor(address)", +"4bf79cd9": "OutCloud(address,address)", +"4bf80d39": "giveConsent()", +"4bf899a3": "buyPosition(address,uint256)", +"4bf8e7a2": "getPriceInPastAuction(address,address,uint256)", +"4bf9407f": "changeRecipientAddress(address)", +"4bf96e60": "nextPurchasableBlocknumber()", +"4bfa0d11": "TDEEndDate()", +"4bfa798a": "getWarlordChestAvailable()", +"4bfad14d": "WinnerPicked(uint8,address,uint16)", +"4bfaf2e8": "getPendingVersionTimestamp()", +"4bfbe5df": "eventDate()", +"4bfc4782": "change_a(address)", +"4bfde393": "myWinShare()", +"4bfe2779": "setETHRate(uint256)", +"4bfe642d": "proWallet()", +"4bff1b95": "STARTING_KEBAB()", +"4bff5009": "getUserByName(string)", +"4bff8e51": "_runAdvanceClock(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"4bffc5e4": "allowance(address,uint256,uint256)", +"4c0019c3": "logDisputeCrowdsourcerCompleted(address,address,address)", +"4c007b35": "BigerToken()", +"4c0348ee": "nInvalidatedHashes()", +"4c04f7f2": "addTranslatorContent(address)", +"4c05a636": "Registrar(bytes32,uint256)", +"4c05b40e": "createShortId(bytes32,bytes32)", +"4c05df98": "startEarlyBird()", +"4c062c81": "moveNapkinsTo(uint256,address)", +"4c07fb4f": "editAddressDescription(address,string)", +"4c081138": "assign(uint256)", +"4c097cb4": "trigger(bytes32)", +"4c0999c7": "bytes32ToBytes(bytes32)", +"4c0a6532": "lrcTokenAddress()", +"4c0aac9a": "WithdrawFunds()", +"4c0b1c90": "getMarketer()", +"4c0b2973": "mfrOf(bytes32)", +"4c0bcfe5": "getTransferableBalance(address)", +"4c0bd3ef": "getLLV_edit_16()", +"4c0c0ac2": "rewardsAllocation()", +"4c0ddea8": "decodeTokenImbalanceData(uint256)", +"4c0e207a": "__outputCallback(uint256)", +"4c0e9e6a": "acquisitionsWallet()", +"4c0eceb5": "plusOnePonzi()", +"4c0ee2e1": "unPausePriceRaise()", +"4c0eed51": "addMarketMaker(address,address)", +"4c10d0a5": "addFrostTokensMulti(address[],uint256[],uint256[])", +"4c123019": "tokenFallback(address,address,uint256,bytes)", +"4c125e79": "cancel(uint64)", +"4c12b33f": "burning()", +"4c12d8b9": "recipientETH(address)", +"4c12f8bb": "creditCEO()", +"4c13017e": "Transfer(bytes32,address,uint256)", +"4c1334a8": "GoodTo(uint256,string,string)", +"4c1344b7": "isGuilty(address)", +"4c136ea8": "totalEDUSAllocated()", +"4c13fbb2": "ImageToken()", +"4c146f38": "getFrontEndTokenBalanceOf(address)", +"4c14743b": "UnlockedBalanceOf(address)", +"4c148efb": "CollectPayment(address,address,uint256)", +"4c14f334": "getCouponBonus(string)", +"4c15469c": "tresholds()", +"4c1674e5": "descOf(uint256)", +"4c167a6e": "approvePreSigned(bytes,address,uint256,uint256)", +"4c1736a0": "subFrozen(address,uint256,uint256,bool)", +"4c174ef0": "isWitness(address,address)", +"4c176b21": "WALLET_SALE()", +"4c17b322": "performRead2()", +"4c182a95": "doDeveloperGrant()", +"4c18e57e": "PositiveWhuffiesSent(address,address,uint256,string)", +"4c18e960": "allowRecurringBilling(uint256,uint256,uint256,uint256)", +"4c19a199": "openGameResult(uint256,uint256,uint256,string)", +"4c19dd1c": "VicDemToken()", +"4c1b2446": "transmitInteger(address,bytes,bytes,uint256,uint16)", +"4c1b64cb": "deleteAccount(address)", +"4c1b8ffd": "voteCost()", +"4c1bbef8": "claimerKey()", +"4c1ccadf": "SmartexInvoice(address,address)", +"4c1d1fde": "withdrawTokens(address,uint256,uint256)", +"4c1d79ee": "setSalePeriod(string)", +"4c1d9d48": "tokenIndexById(uint256)", +"4c1e4169": "BIZDEV_WALLET()", +"4c1f20ec": "CEO_TEAM()", +"4c1f524f": "convertToMiniTtc(uint256)", +"4c1f7635": "getAccountRest(address)", +"4c1f85ae": "updateHydroMap(address,uint256,uint256)", +"4c1fbde8": "getPlayerColor(uint256,address)", +"4c20179e": "devAllocation()", +"4c2067c7": "expired()", +"4c207ac8": "setTraps(uint256,uint16,bytes)", +"4c21eb07": "put(string)", +"4c21fa45": "getNoteByIndex(uint256)", +"4c2233a5": "withdrawAll(uint256,address)", +"4c228656": "advisorsAllocationTokenSend(address,uint256)", +"4c22a8d1": "kvcAdd(uint256,uint256)", +"4c22b792": "calc_wei_rewards(uint256,uint256,uint256)", +"4c22c119": "isUser()", +"4c2324bb": "toBytes(uint256[])", +"4c23ba50": "removePeer(address)", +"4c24d4dd": "isPoliceNode()", +"4c25162a": "Babatoken()", +"4c2516de": "swapToken(uint256,address)", +"4c25727b": "viewPollData(uint8)", +"4c258eb1": "getQtyFilledOrCancelledFromOrder(bytes32)", +"4c25deb5": "USER_GROWTH_TOKENS_RESERVED()", +"4c26064b": "MVGcoin(uint256,string,string)", +"4c266e11": "setExchangeGroup(address,uint256)", +"4c26aaa2": "TokenExchange()", +"4c26b6eb": "total_buy()", +"4c281603": "getPlayerMax(uint256)", +"4c28a043": "adminGetFeeDial()", +"4c294188": "customer_tickets(address,uint256)", +"4c2a664b": "purchaseNotes(uint256)", +"4c2a799f": "checkFileProof(bytes32,bytes32[10],uint256[4],bytes32[],uint256)", +"4c2bc9a9": "assertEq26(bytes26,bytes26)", +"4c2bd226": "getDescriptionHash(address)", +"4c2d0378": "getAllTransactionIds()", +"4c2d71b3": "setConfigAddress(bytes32,address)", +"4c2d8649": "transferComplete(address,uint256,bytes)", +"4c2db6d8": "buyCoin(uint16)", +"4c2f04a4": "AddMessage(address,uint256,string)", +"4c2fac53": "requireFunction()", +"4c2fc8b2": "acceptProposedMilestones(bytes32)", +"4c2fe456": "right94(uint256)", +"4c2ff0ae": "getLLV_edit_31()", +"4c3052de": "submissionGasPriceLimit()", +"4c316f70": "mineCoins(uint256)", +"4c31a0ca": "mintFoundersRewards(address,int256)", +"4c31df50": "nextroundsolsforhire()", +"4c3221e1": "complexityForBtcAddressPrefix(bytes)", +"4c32a444": "_onCanvasCreated(uint256)", +"4c330471": "getReferralBalance()", +"4c33fe94": "cancel(address)", +"4c34c8de": "USDCToken()", +"4c34d7e9": "UNITED_NATIONS_FUND()", +"4c352323": "getNewVoting(uint256,bytes32[],address[],uint256[])", +"4c364ceb": "createAccessory(uint8)", +"4c36c36e": "resolveBet(uint256)", +"4c36cf16": "addRoundPrice(uint256,uint256,uint256,address[])", +"4c37077f": "chargeBuyer(uint256,address,uint256,uint256)", +"4c381350": "meteredPrice(uint256)", +"4c382d99": "terminateEmployee(address,uint32,uint8)", +"4c38661d": "lastPing(address)", +"4c387d82": "NSCToken()", +"4c38c366": "reLoadXaddr(uint256)", +"4c3997d4": "cancelBuyAuction(uint256,address)", +"4c3a00cb": "totalTradeRecords()", +"4c3a1a1a": "returnUserGrowthPoolTokens(address,uint256)", +"4c3a6ae0": "isMultiSigWallet()", +"4c3a9675": "ManagerProxyTargetMockV2(address)", +"4c3acb86": "debug(string,string)", +"4c3b67b4": "withdraw_for(address)", +"4c3ba268": "getBySemanticVersion(uint16[3])", +"4c3bf0b5": "changeInitialCost(uint256)", +"4c3d1f00": "EthDailyLimitChange(uint256)", +"4c3dff01": "InitialBasicBalance()", +"4c3ec50b": "FarziToken()", +"4c3eea9e": "generalLog(uint256)", +"4c3ef6dc": "minimumTokenThreshold()", +"4c3f333f": "Kalypso()", +"4c3f8ec0": "Tier_Wildcat_Registration()", +"4c409b80": "ChangeWallet(address,address)", +"4c413139": "minutesToPost()", +"4c418879": "getMyDino()", +"4c41a6c7": "blockThreshold()", +"4c41bf9d": "getOnBurnTargetValue()", +"4c4316c7": "donate(uint64,uint64,address,uint256)", +"4c433843": "parityOwner()", +"4c439436": "getTicketsAtAdress(address,address)", +"4c44d53f": "test_fourInvalidEqBytes32Message()", +"4c45c7ec": "setPhase(uint8,uint256,uint256,uint256,uint256,uint256)", +"4c466d37": "signer(bytes)", +"4c46e52c": "trancheOneBalanceOf(address)", +"4c46fb73": "stageCaps(uint256)", +"4c471cde": "scheduleCall(address,bytes4,bytes,uint256,uint256,uint8,uint256)", +"4c4766e8": "KittenRegistry()", +"4c478b62": "ERC827TokenMock(address,uint256)", +"4c47e9ee": "setLockedConfig(address[],uint256[],uint256[])", +"4c480c2a": "ownerCandidat()", +"4c4870c6": "checkGoal()", +"4c488dac": "getChannelValidUntil(bytes)", +"4c49515d": "presaleTokensIssued()", +"4c4a386f": "refundEnabled()", +"4c4a4c67": "assertEq2(bytes2,bytes2)", +"4c4a9761": "tokenRate4()", +"4c4aea87": "getReleaseData(bytes32)", +"4c4bf936": "landData(int256,int256)", +"4c4c23dd": "upgradeGreatCoin(address)", +"4c4c447e": "cancelBattle(uint256)", +"4c4cb69e": "INVEST_AMOUNT()", +"4c4cea5a": "completeAt()", +"4c4cfc3b": "tokensForEcosystem()", +"4c4d07e7": "isBouncer(address)", +"4c4d460e": "LogCampaignCreated(address)", +"4c4dc6e0": "docCount()", +"4c4deecb": "__callback(uint256,string)", +"4c4e03f2": "_getExtraParam(bytes)", +"4c4e829c": "TransactionRevoked(uint256)", +"4c4efef7": "totalCLNcustodian()", +"4c4f1386": "WartecToken()", +"4c4fa89a": "getChildBranch(bytes32)", +"4c50ea27": "RHOC(uint256,address)", +"4c515fb5": "TEAM_VESTING_CLIFF()", +"4c51b021": "substract_individual_shares(uint256)", +"4c524be4": "selectWinner(uint256)", +"4c53adb0": "blackFridayEndBlock()", +"4c54cc1d": "managerETHaddress()", +"4c56e992": "refillContract()", +"4c574afe": "unblockSecondStake()", +"4c575fcc": "numberOfRawEarlyPurchases()", +"4c57fc28": "setTokenMintFeeReceiver(address,address,address,address)", +"4c5802c1": "getPhaseAddress()", +"4c585ce4": "approveMultipleUsers(address[])", +"4c5879cf": "WidinShares()", +"4c58994c": "TrypCrowdsale()", +"4c594c1e": "limitDateCrowdWave3()", +"4c59b47c": "EthereumLottery(address,address)", +"4c59f021": "CakCrowdsale(uint256,uint256,uint256,address)", +"4c5a2044": "licenseCostDenominator()", +"4c5a628c": "renounceWhitelistAdmin()", +"4c5a82cb": "reportTemperature(int8[],uint32[])", +"4c5a94fe": "_removeToken(address,uint256)", +"4c5b632a": "addcoin(string,string)", +"4c5be574": "getOdds()", +"4c5cbe9a": "getBalancesForTeam(address)", +"4c5d6d93": "totalCrowdSale()", +"4c5df57a": "createLoan(address,address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,string)", +"4c5df737": "addCar(string,string,string,uint16,string,address)", +"4c5f338b": "CheckStudentofCourse(uint256)", +"4c5f97b6": "PayThrone()", +"4c610ba4": "totalRewardThisYear()", +"4c611268": "balanceOfUnclaimedCookie(address)", +"4c6226fc": "oraclizeFee()", +"4c62a644": "withdrawComission()", +"4c64384c": "maxPrivateSale()", +"4c64cf92": "mint_time_locked_token(address,uint256)", +"4c65b2b3": "ethOwner()", +"4c65c62e": "AgentContracteGalaxy(address,address,address,uint256,uint256)", +"4c661a2c": "DaoOwnershipTransferred(address,address)", +"4c66326d": "deregisterCallback(address)", +"4c6686d8": "CONFIG_FEES()", +"4c66bcc1": "WorldWideLoveToken()", +"4c67567a": "firstLockAmount()", +"4c676725": "fundTeamCompany()", +"4c68df67": "totalReserve()", +"4c69c00f": "setOracleAddress(address)", +"4c69ec93": "changeReceiver(address,address)", +"4c6a3334": "buyEthLootbox(address)", +"4c6adb31": "firstReporterCompensationCheck(address)", +"4c6b25b1": "results(bytes32)", +"4c6b6cad": "newProposal(string,bytes)", +"4c6c27a1": "judgeCustom(bytes32,bytes32,bytes32,uint256,bytes32,uint256[4],bytes32[10],uint256[4],bytes32[])", +"4c6c6a5c": "upgradeFrom(address,address,uint256)", +"4c6c8bc3": "distribute(address[],uint256[],bytes32[])", +"4c6d1d9e": "checkOutTag(string)", +"4c6d350b": "approveShutdown(uint256)", +"4c6d8aac": "hasParameters()", +"4c6e4453": "EcoLend()", +"4c6e5926": "send_to_side_chain(uint256,address,uint256)", +"4c6ebbbe": "maxIcoTokenLimit()", +"4c6fc20f": "setDisbursingAddr(address)", +"4c703ccd": "FirstERC20TestToken()", +"4c70b6b2": "deList(address)", +"4c714ed4": "DescriptionChanged(string,string)", +"4c7241f8": "Potentl()", +"4c738909": "getMyBalance()", +"4c73eef6": "card_black_minamount()", +"4c743c45": "FCTOKEN()", +"4c750bca": "bountyFunds(address,uint256)", +"4c75dc8f": "EFOcallBack(string)", +"4c75fbca": "getThirdAddressBalance()", +"4c76318e": "award(bytes32)", +"4c77a28d": "AppleCoin()", +"4c77c0e2": "period2Numerator()", +"4c77e5ba": "getAddressValue(bytes32)", +"4c780596": "UpgradeSpace(uint8,uint16)", +"4c783bf5": "isControllable()", +"4c78529e": "setOfficialUrl(string)", +"4c78b276": "getShare(address,uint256)", +"4c7940c5": "getWithFrozenStockBalance(address,address,uint256)", +"4c79afe0": "EventBuyShip(address,uint32,uint32)", +"4c7a0271": "buyMiner(uint256[8])", +"4c7a2254": "checkMyWithdraw()", +"4c7a5c0f": "ArtifactCoin(address)", +"4c7ab28d": "setMaxToSell(uint256)", +"4c7ae3ac": "getNameFromKoikeToken()", +"4c7b18fd": "ratioUpdateTime()", +"4c7b8fba": "contributionHashes(uint256)", +"4c7c3ca1": "KryptopyCrowdsaleMock(uint256,uint256,uint256,uint256,uint256,address)", +"4c7c71fe": "startTimes()", +"4c7ce18a": "withdrawReturns()", +"4c7cfd9b": "MarketboardListingPriceChanged(uint256,uint256)", +"4c7d3e3f": "icoIsClosed()", +"4c7d7d3f": "standardToken()", +"4c7e6bab": "tokensPerCentsDayOne()", +"4c7f0bdd": "isBackend(address)", +"4c7f74df": "EtherDelta(address,address,address,uint256,uint256,uint256)", +"4c7fa728": "getPlayerLeftDividend(address)", +"4c803feb": "fib1(uint256)", +"4c808da8": "StageUpdated(string,string)", +"4c80b03b": "minTransAmount()", +"4c80c937": "getEpochData(uint256,uint256)", +"4c80f5c1": "minimumAmountToParticipate()", +"4c813d6d": "sendItDv(string)", +"4c81a1db": "addressPayableFunc(address,address)", +"4c81c4d7": "startStage2Time()", +"4c81e13a": "incentiveDistributionRoundDenominator()", +"4c81e48b": "testToUint()", +"4c8316a6": "showTokensStaked()", +"4c833532": "resumeTransfer()", +"4c839beb": "getContributionTokens(address)", +"4c840214": "getBackToken(address,address,uint256)", +"4c841e5d": "_setBlacklistedUser(address)", +"4c85a8f3": "isAllowedToMint(address,address)", +"4c85b425": "buyShares(address)", +"4c85d2e6": "addImmigrationOfCountry(address,uint256)", +"4c86c2e5": "setPortUpdate(uint16)", +"4c86e97b": "bonusTokensLeft()", +"4c873c48": "tokenSetup(address,address,address)", +"4c87effd": "delete(bytes32)", +"4c88bc26": "YEAR_TWO_SUPPLY()", +"4c899118": "getProposalFromID(bytes32,uint256)", +"4c89c4c7": "getHash(bytes10,uint8)", +"4c8b16f4": "setTimeStep(uint256)", +"4c8b8ca7": "distroyBuyerToken(uint256)", +"4c8bae93": "_isTradeable(uint256)", +"4c8c121e": "getGameHash(address,uint256)", +"4c8cab79": "largestStake()", +"4c8cc20b": "toContentID(address,string,string,address,uint256)", +"4c8d1e42": "DockCrowdsale(uint256,address,address)", +"4c8f3562": "computeCooldownSeconds(uint16,uint16)", +"4c8f4810": "buyMCT(address,uint256)", +"4c8fe526": "next()", +"4c8fea7d": "_convertSgnToSga(uint256)", +"4c90aaeb": "randomize(bytes32)", +"4c9151e6": "TransferStarted(address,address,uint256[],uint256)", +"4c922a9f": "changeColorPurple()", +"4c9297fa": "scheduleStart(uint256)", +"4c93505f": "setRevoke(bool)", +"4c9362aa": "addActiveUserListArr(address)", +"4c93c1a6": "GetUpTickPrice(uint256)", +"4c9478ce": "_yearThreeClaimed()", +"4c947c86": "getInitInputDataBytes(address,address,address,address)", +"4c94ac6a": "clearMilestones()", +"4c9599f2": "validityDate()", +"4c95baf3": "compoundingFreq()", +"4c95ca9c": "setRatePreICO(uint256)", +"4c95cb98": "OracleBase()", +"4c966822": "winnerWithdrawal()", +"4c96a389": "deploy(address)", +"4c96f0cc": "transferAllTokens()", +"4c96f281": "getAllPublishers()", +"4c97057a": "LogWinner(string)", +"4c970b2f": "foo(int256)", +"4c977972": "Soft_Cap()", +"4c97c836": "upgradeConstitution(uint256)", +"4c982872": "ElextroCoin()", +"4c985dfb": "newTokens(address,uint256)", +"4c98aec9": "CASHX()", +"4c990cc7": "startAirdrop(address[],uint256[])", +"4c9b30b4": "allow(bytes8)", +"4c9b60dc": "changeUserEthAddress(address,address)", +"4c9b760d": "changeMaxContribution(address,uint256)", +"4c9e2779": "balancesLocked2Y()", +"4c9e502e": "totalLoanAmount()", +"4c9ed763": "requestTokensBack()", +"4c9f166d": "bettingAllowed()", +"4c9f2bfc": "SOBU()", +"4c9f45eb": "repossessionBountyPerHundred()", +"4c9f66c7": "feePot()", +"4ca0a305": "GlobalIdolCoinToken()", +"4ca14270": "AddressChanged(string,address,address)", +"4ca15352": "airDropCount_()", +"4ca168cf": "register(bytes,uint256,address,string,uint256)", +"4ca18ebd": "reject(uint256,string,uint256)", +"4ca1c417": "isValidNameLength(string)", +"4ca1fad8": "addRequest(uint256)", +"4ca3a111": "getWeiPriceMicroKeys()", +"4ca3e9b8": "getProjectAddress(uint256)", +"4ca40518": "ReBornEnergyCoin(uint256,string,uint8,string)", +"4ca43f41": "transferAny(address[],uint256)", +"4ca50f59": "sellsTokens()", +"4ca5558c": "AllCaptcha()", +"4ca63a84": "TimeLimitedStoppable()", +"4ca64b3a": "bulkTransfer(address[],uint256)", +"4ca6ba2f": "AporooToken(uint256,string,uint8,string)", +"4ca6d7e6": "tier2Time()", +"4ca6fcfc": "registerVIP(address,address,uint256)", +"4ca7fbd0": "updateTokenPriceWeekTwo()", +"4ca82b52": "finalLoos()", +"4ca8b0d0": "registerExistingThrone(bytes,address,uint256,uint256)", +"4ca8c1e8": "isInMaintainance()", +"4ca92e08": "deductExtraBalance(address,uint256)", +"4ca98997": "getAmount(uint256,uint256)", +"4ca9b258": "contributorRefund()", +"4caa1a09": "_calculatePaymentToOwner(uint256)", +"4caa7f37": "withdrawSnowflakeBalanceFromVia(string,address,string,uint256,bytes,bytes)", +"4caaf45f": "changeSigningAddress(address)", +"4cad12e0": "orders_sell_price(address)", +"4cad3438": "setRateFinalStage1(uint256)", +"4cad42d3": "testWager()", +"4cae5f99": "loanRepaymentNotification(uint256)", +"4caeebd0": "STAGE_FOUR_TIME_END()", +"4caf6231": "COLOR_WHITE()", +"4cb0c7a1": "getOrdersOfVendor(address,uint256,uint256,bool)", +"4cb10ed3": "hasStartTimePassed(bytes32)", +"4cb44f8d": "getConfigEntryAddr(bytes32)", +"4cb532db": "socWarefareAddr()", +"4cb5465f": "transferWithLock(address,bytes32,uint256,uint256)", +"4cb5a45d": "GSUMedal()", +"4cb5ef77": "closeVoteRevealPhaseIfAllowed(address,bytes32,bytes32)", +"4cb5f1c6": "totalsum()", +"4cb6bf73": "FZTToken(address)", +"4cb6d6af": "finalizeCrowdsale(address)", +"4cb6f4a5": "voteRequest(uint256)", +"4cb71b9b": "getAllReleaseHashes()", +"4cb79536": "presaleStartBlock()", +"4cb7da65": "abortMatch(uint256)", +"4cb7dd6f": "popLeader(address)", +"4cb84b9a": "getIcoCap()", +"4cb85312": "_addInvestor(address)", +"4cb85356": "BranchSender(uint256,bytes32)", +"4cb88ad8": "ABEToken()", +"4cb93ff8": "capTokenAmount()", +"4cba4ca4": "updateGene(uint256,bytes)", +"4cba5c6a": "setResults(uint256[4])", +"4cba67ce": "addAddressToAccountForUser(address,bytes,bytes,address,bytes32)", +"4cbabcdc": "invest(bool)", +"4cbac3d2": "calculatePurchasedTokens(uint256,uint256)", +"4cbb4a0a": "_removeTokenFromAllTokensEnumeration(uint256)", +"4cbb7532": "setBorrowAgreement(uint256,uint256,string,string)", +"4cbbb987": "DOSXToken()", +"4cbc07f2": "weisPerBigToken()", +"4cbc49ad": "claimRewardManually(address)", +"4cbc82cd": "getTrackByArtist(address,uint256)", +"4cbd2b74": "allowanceByLegacy(address,address)", +"4cbd7a26": "withdraw(address[],uint256[],bytes,bytes,bytes32)", +"4cbe02a5": "createAuthorDrawings(bytes32,bytes32,address,string)", +"4cbe552c": "myEntityStructs(uint256)", +"4cbee813": "logout(string)", +"4cbf3d4c": "getNumbersOfPick(uint256,uint8)", +"4cbf6ba4": "hasDNSRecords(bytes32,bytes32)", +"4cbf867d": "intervalSecs()", +"4cbfafd9": "DefaultReleaseDelayed()", +"4cbfbf47": "REAPER_INTREPID_MAX_CARGO()", +"4cc05a71": "withdrawCount()", +"4cc09eac": "tokenRatePre()", +"4cc0a885": "maxRevealSeconds()", +"4cc0ee3c": "modifyDescription(address,string)", +"4cc22528": "setRateForOrder(bytes32,uint256)", +"4cc22f9d": "getSaleEnd()", +"4cc2a4bb": "_preValidateTransfer(address,address,uint256)", +"4cc2b5d0": "addPolicy(bytes32,uint256,uint256,uint256,string)", +"4cc2c0fe": "getTotalFor(uint256,uint256)", +"4cc3a6b0": "ConvertQuote(uint256)", +"4cc45f50": "changeAddressQueen(address)", +"4cc47910": "oraclizeQueryIdsToBetIndices(bytes32)", +"4cc53838": "getSaleContractTargetEtherMin(address)", +"4cc60757": "getOperator(address,address)", +"4cc6083a": "totalTrading()", +"4cc62409": "EOSOwned()", +"4cc653c8": "calculateDividends_(uint256)", +"4cc682ee": "getPubKeyHash(bytes20,uint8)", +"4cc747c8": "unlistAllOpenProposals()", +"4cc78983": "setPreviousDungeoonId(uint32)", +"4cc7a88d": "sendLoveToken(uint64,string,string,string)", +"4cc82215": "remove(uint256)", +"4cc87328": "adminWithdrawMiscTokens(address,uint256)", +"4cc885d4": "right65(uint256)", +"4cc9f4e1": "lockTokenController()", +"4ccb5a33": "canClosePot(string)", +"4ccb908f": "auctionSuccessBonus()", +"4ccbd06b": "MIN_DEPARTURE_LIM()", +"4ccbe888": "getLongExtra()", +"4ccbf17b": "presaleAddressAmountHolder()", +"4ccc4c36": "getPendingOracleFor(address)", +"4ccc5da0": "sold(bytes32)", +"4cccb7ba": "unrestrictedWithdraw(uint128,address,uint256,uint128)", +"4ccd0e1e": "Flippitt(string,string,uint8,uint256,string)", +"4cce4d63": "addNewCompany(string,uint256,uint256,uint256,uint256)", +"4ccee9b6": "getAddr(bytes32)", +"4cceeccd": "setFee(uint32,address)", +"4ccef7e0": "averageSoldPrice()", +"4ccf05cd": "CompanyTokenPushed(address,uint256)", +"4ccf8a35": "TokenSupplied(address,uint256,uint256)", +"4cd06a5f": "iterateNext(uint256)", +"4cd08d03": "register(string,string,string)", +"4cd11943": "NewManualInvestor(address,uint256)", +"4cd18a83": "gimmeEtherr()", +"4cd217b7": "getPreEntranceTo()", +"4cd273d1": "tilePrice()", +"4cd280bc": "popClient()", +"4cd28aa6": "_queue(address,address)", +"4cd2b343": "RedBlueToken()", +"4cd36fb7": "Mine(address,uint256,uint256)", +"4cd3745d": "getRandomClassId(uint256)", +"4cd412d5": "transferEnabled()", +"4cd44519": "stageTokensBought(uint8)", +"4cd52207": "_claim(address,uint256,bool)", +"4cd5af91": "CrowdFundClosed(uint256)", +"4cd5d776": "FundingWithdrawn(address,uint256)", +"4cd6bd32": "withdraw(address,uint256,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"4cd7699a": "eventCardRangeMax()", +"4cd85837": "mintICOTokens(address,uint256,uint256)", +"4cd88b76": "initialize(string,string)", +"4cd995da": "registerCompany(address,string)", +"4cd9c3e4": "crowdsaleEndsAt()", +"4cdabb16": "MAX_PREMIUM()", +"4cdb48e4": "isValidNym(address)", +"4cdc6a73": "Marriage()", +"4cdc9549": "_isApprovedOrOwner(address,uint256)", +"4cdc9c63": "genesisBlock()", +"4cdcb334": "transferrers(address)", +"4cdd3002": "setNote(uint256,bytes32,bytes20,string,string)", +"4cdd3b43": "getScoreForName(string)", +"4cddae28": "recharge()", +"4cdfc605": "Refund_user()", +"4ce0032f": "TutorialToken(address)", +"4ce01d86": "totalBetValue()", +"4ce02a33": "overdraftCliff()", +"4ce053ab": "approveAndPayout(uint16)", +"4ce0ef95": "getStatus(address,uint256)", +"4ce11c52": "children(bytes32)", +"4ce149d7": "setCandyLandSale(address)", +"4ce14f8c": "FOMOCoin()", +"4ce18d6b": "getAmount(bytes)", +"4ce18ec3": "addInterval(uint256,uint256,uint256,bytes32)", +"4ce197f3": "GetTempStuffExpire(address,uint32)", +"4ce1e317": "TeamAndAdvisorsAllocation(address,uint256)", +"4ce309f8": "getElection(address,address,uint256)", +"4ce37426": "EtherOlympics()", +"4ce4f927": "getJackpot(uint256)", +"4ce51b92": "WithdrawSpecialEth(address,uint256)", +"4ce56c5d": "ethAvailable()", +"4ce61604": "InitializedTier(uint256,address)", +"4ce63074": "test_increaseBlockBy5000()", +"4ce6962c": "numPurchasers()", +"4ce6a521": "emitAdditionalTokens()", +"4ce6a74e": "testerNonReentrant()", +"4ce7033d": "LogWithdraw(address,uint256)", +"4ce71fac": "getRegionPurchasePixelPrice(uint256)", +"4ce75274": "setEnableSell(bool)", +"4ce99591": "Vegan()", +"4cea7af0": "MembershipChanged(address)", +"4ceab75e": "newIdTank()", +"4ceab858": "multiplex_add(address)", +"4ceaeb35": "PleasePayMe(uint256,uint256)", +"4ceb0173": "to(bytes32,bool)", +"4ceba015": "LogCollect(uint256)", +"4cec73b1": "checkClaimTokenByAddress(address)", +"4cecac6d": "requestReward()", +"4ced0a26": "SetData(string,string)", +"4ced4734": "isPreSale()", +"4cedf74e": "get_party1()", +"4cedfc02": "TornadoChain()", +"4cedfc0c": "activateWhitelist(bool)", +"4cee81cb": "Marriage(address,address,string,string)", +"4cef0cb9": "usdPerEthMax()", +"4cef0ff6": "approveMore(address,uint256)", +"4cef2221": "ZazToken()", +"4cef5a5c": "negligibleRateDiff()", +"4cf00716": "getCreateFeeTokenFeeWindowValue()", +"4cf045d5": "addSoftwareExecRecord(bytes32,bytes32,uint256,uint256)", +"4cf088d9": "staking()", +"4cf0afca": "changeWallet(address,uint8)", +"4cf1115d": "ethFee()", +"4cf125de": "Ledger()", +"4cf127bf": "modelSupply()", +"4cf178c6": "POWEROFTHREE()", +"4cf2010e": "addCar(uint256)", +"4cf21f5f": "CFNDToken()", +"4cf2c2a2": "Dexter()", +"4cf2e2dc": "GameStart()", +"4cf32de3": "getNumTransactions()", +"4cf33010": "purchaseShare(uint256)", +"4cf373e6": "addFortune(string)", +"4cf37429": "AMOCoinSale(address,address)", +"4cf43440": "Megaloh()", +"4cf439d8": "_addToPools(address)", +"4cf4a292": "getHouseEdge()", +"4cf50009": "genesisCreation()", +"4cf52fa2": "buyBulkPremiumCar(address,uint256[],address)", +"4cf5b6c7": "millWeiRate()", +"4cf61aba": "_canTransfer(bytes32,address,address,address,uint256,bytes,bytes)", +"4cf6475d": "getPlayerShipCount(address)", +"4cf76cca": "thirdDiscountPrice()", +"4cf78170": "allowedAddress()", +"4cf812ea": "rateRoundSeed()", +"4cf8b0f5": "BlipToken(string,string)", +"4cf8dce7": "balanceOfOre(address)", +"4cf91026": "isAirdropping()", +"4cf93599": "getPaidInfo(string)", +"4cf95c21": "shareholderIsToken()", +"4cf96509": "safeWithdrawalAll()", +"4cfb4c28": "roundProfit(address,uint256)", +"4cfc4d30": "VESTING_DURATION()", +"4cfd5a82": "phaseOneLimit()", +"4cfddcfb": "getMarketOrderCategory(uint256)", +"4cfe3e7f": "debitAccount(address,uint256)", +"4cfe4c69": "getProviderRateHistory(uint256,uint256,uint8)", +"4cfe50cb": "BAFCToken()", +"4cfe59a7": "simulateWithdrawalAmount(address,address)", +"4cfe62c7": "transferRole(string,address)", +"4cfea68a": "blocksPerDay()", +"4cfef220": "getSpankPoints(address,uint256)", +"4cff5d75": "setTokenAllocator(address)", +"4cff6ae5": "AltToken(address)", +"4cff7a82": "createDefaultGames()", +"4d003070": "timestamp(bytes32)", +"4d015fcc": "Pong()", +"4d0217b7": "firstSaleComplete()", +"4d023404": "removeIntermediary(address)", +"4d02438b": "getMaximumBetHome()", +"4d02a8fb": "judgeFakeToken(uint256)", +"4d047055": "monsterIdToNickname(uint256)", +"4d053af6": "removeAds(address)", +"4d056f6d": "coolDown()", +"4d057803": "TEAM_LOCK_TIME()", +"4d05a822": "JusticeTokenV2()", +"4d06068a": "airdropToken()", +"4d0633f6": "assignedAmountToCornerstoneInvestment()", +"4d07b23d": "buyPrice(uint8)", +"4d08e0b4": "mediaTokensName(address)", +"4d0a32db": "minAmount(address)", +"4d0a391c": "addPayment(uint256,uint256)", +"4d0a5dbd": "addPermission(address)", +"4d0ad141": "CAP_USD()", +"4d0b2a29": "NUM_TILES()", +"4d0c381a": "Token99(uint256,address)", +"4d0c5be4": "redemptionLocked(address)", +"4d0c69d9": "EnterSwap(uint256,uint256,bool,address)", +"4d0cac9d": "sendCancelValue(address,uint256,bool)", +"4d0d1cb9": "processTransfer(address,address,uint256,bytes)", +"4d0d35ff": "getPlayerAddr(uint256)", +"4d0d80a2": "_getRandom(uint32)", +"4d0de225": "getWorkerBalance(address)", +"4d0e8a5f": "MYEX()", +"4d126774": "validateWhitelisted(address)", +"4d1271e3": "VersionedToken(address)", +"4d129486": "max_shares_to_sell()", +"4d129fb5": "startPre()", +"4d12b695": "unbanUser(address)", +"4d12fca4": "exchanger()", +"4d130369": "interestPaid(address)", +"4d130e64": "_collectFee(address,address,uint256)", +"4d134f2f": "createAddresses(bytes32[],address[])", +"4d13507d": "releaseFund(address)", +"4d1387b4": "changeRatio(uint256,uint256)", +"4d13a583": "PrepaidTokensClaimedEvent(address,uint256,uint256,uint256)", +"4d13c565": "bVideoCost()", +"4d13d134": "publicAllocatingToken()", +"4d140467": "EARLY_CONTRIBUTOR_VESTING_CLIFF()", +"4d14c57e": "claimBasicResources()", +"4d14e344": "numberOfChoices()", +"4d15642a": "startMEAMission(uint256,uint256,uint8,uint256)", +"4d15d797": "_exists(int256,int256)", +"4d1636c3": "onSold(address,uint256,uint256)", +"4d16dd41": "communityUnvested()", +"4d17ed11": "LUVIToken()", +"4d17f7fc": "sta()", +"4d182bfc": "getEpisodeDataRandom(uint256,uint256,uint256)", +"4d1975b4": "gameCount()", +"4d199766": "WEI_CAP()", +"4d19cdf8": "DME()", +"4d1a08cd": "MIN_LIMIT()", +"4d1a9763": "T8CToken(address)", +"4d1b93b3": "allowedTransferWallet()", +"4d1bc2df": "expertThreshold()", +"4d1bd1fa": "product2_luckybuyTracker()", +"4d1bfe99": "BenefitGameToken()", +"4d1c43b2": "ETHUSDPRICE()", +"4d1c5f83": "EditMode()", +"4d1ed74b": "maxGuaranteedLimit()", +"4d1f8c31": "owner(uint64)", +"4d1f97ba": "LastResult(address,uint8,uint256)", +"4d1ff181": "setPaymentEnabled(bool)", +"4d207d9a": "identify(address)", +"4d20b992": "setLargeCapWhitelistParticipants(address[],uint256[])", +"4d20d4bc": "BET_TYPEHASH()", +"4d21a24c": "generateLockId()", +"4d22b9c8": "DMSContract()", +"4d22d1d1": "vestTime()", +"4d2301cc": "getEthBalance(address)", +"4d238c8e": "addValidator(address)", +"4d23aaa8": "foreignBuy(address,uint256,uint256)", +"4d242bbc": "adjustTotalSupplyCheckpoints()", +"4d253629": "updateChangeAttemptCount(address)", +"4d25cc91": "transfer_token(address,uint256)", +"4d268ddd": "payImporterBankForGoodsBought()", +"4d269617": "XENIACOIN()", +"4d27a548": "rICO(address,address)", +"4d28ca02": "addMultipleContracts(bytes32,bytes32,bytes32,bytes32,address[],bytes32)", +"4d298265": "isWhitelistedPresale(address)", +"4d2a16e6": "myTradeValue()", +"4d2a30c1": "customerDepositedEther()", +"4d2a99a5": "GVOptionProgram(address,address,address)", +"4d2b1444": "WAITING_TIME()", +"4d2c29a0": "tokenOfferingAddr()", +"4d2d0a3d": "token_totalSupply()", +"4d2d35bc": "TokenPartners(address,address,uint256)", +"4d2d3dfc": "_generateHash(bytes32,uint256,address,uint256)", +"4d2db81f": "alreadySold()", +"4d2e9d04": "ShowDepositInfo(address)", +"4d2ee8e7": "GetLoanInfo(uint256,bool)", +"4d2efe4e": "collectOwedDividends()", +"4d305073": "uintRound(uint256,uint256)", +"4d307e3f": "getCurrentReward(address)", +"4d30b6be": "balanceOf(address,bytes32)", +"4d314b5a": "ERC20MIST(uint256,string,string)", +"4d318b0e": "tallyVotes(uint256)", +"4d32a117": "documentsIds(uint256)", +"4d32ef8c": "hurifymint(address,uint256,uint256)", +"4d3314f4": "TotalFee()", +"4d33e6d7": "hasDisputeSolved(uint256)", +"4d341bbc": "findSubscriberIndex(address)", +"4d3465fd": "weicap()", +"4d34dce1": "AHS(uint256,bytes32,bytes32)", +"4d358a00": "PreSale(address,address)", +"4d366398": "runPeerBalance()", +"4d36dd87": "finalizeTransferChild(uint256)", +"4d37ec46": "__generateOrderHashes__(address[4],uint256[8])", +"4d380a0d": "revealBid(uint256,uint256,bytes32)", +"4d3820eb": "registerUser()", +"4d3830e5": "releaseFunds(uint16,address,address)", +"4d387d35": "lockAccount(address,address,uint256)", +"4d38f6c5": "signTruelove(bytes32,string,string)", +"4d3915e9": "testF3(uint256)", +"4d392341": "ICO_BONUS1_RATE()", +"4d392e49": "getSubjectById(uint256)", +"4d395384": "configString()", +"4d399cb3": "updateWhitelist(address,uint8)", +"4d39ed06": "initialFoundersAmount()", +"4d39f535": "transferFrom(uint40)", +"4d39fa7d": "getMultiplierAtTime(uint256)", +"4d3a01b1": "setLongAirdropPicker(address)", +"4d3a2f10": "lastReceivedMessage(address)", +"4d3b915e": "minTokenSale()", +"4d3bdb82": "KickcityToken()", +"4d3cd84e": "setCanAnyMint(bool,int256)", +"4d3ceef1": "freezeCheck(address,uint256)", +"4d3cf035": "tokens2ether(uint256)", +"4d3cfbcd": "NextStep(uint8)", +"4d3d096b": "isExist(string)", +"4d3d14f2": "calculateTransferFee(address,address,uint256)", +"4d3e7682": "DataSellToken()", +"4d3ec092": "LogReplaceToken(address,uint256)", +"4d3eff3c": "setICOSpec(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"4d3f0a6e": "becomeRenown()", +"4d3fac53": "getRatingRange(uint256,uint256,uint256)", +"4d40ed9c": "setSanMaxFree(uint256)", +"4d40f03c": "SovietCoin()", +"4d414c18": "Victim()", +"4d41fee4": "logit()", +"4d425812": "getCountryCount()", +"4d428204": "getTransferTime()", +"4d4282e9": "bytes32IsEmpty(bytes32)", +"4d42b0e5": "getUserLogin(address)", +"4d42c7e4": "getTotalIndividualWeiAmount(address)", +"4d42c952": "destroyedToken()", +"4d42fc66": "gen0Profit()", +"4d437034": "getInvestedTokenBalance(address)", +"4d437a62": "TPCToken()", +"4d43bec9": "emitEvent(uint256)", +"4d4439fa": "ZipperMultisigFactory(address)", +"4d444fac": "isDepositAllowed()", +"4d4479a8": "FLC_address()", +"4d44f108": "checkProof(bytes32)", +"4d4549fb": "GDCNumber1()", +"4d4582a1": "submitChallenge(bytes32,bytes32)", +"4d461ed1": "completeSale()", +"4d46474a": "option10symbol()", +"4d474898": "mine(uint256)", +"4d474d63": "MAPT()", +"4d4765dc": "complete_buy_exchange()", +"4d47ae8c": "setPartyB(address)", +"4d47ce56": "seek(uint256,uint256,bool)", +"4d47feaa": "ShareholderDB(uint256)", +"4d480faa": "setMaxDelay(uint256,uint256)", +"4d486406": "addEmbassy(address)", +"4d492b50": "transferMulti(address[])", +"4d493f24": "maximumTokenIssue()", +"4d49451c": "candidateExchange()", +"4d4a919f": "bailout()", +"4d4aa77f": "getTicketDetails(int256,uint256,uint256,address)", +"4d4af36f": "setMins(uint256,uint256)", +"4d4b1a88": "addTokenTrust(address)", +"4d4b298e": "creditAccount(address)", +"4d4b3202": "getTrustedTransferSourceValue()", +"4d4ba1d7": "changeDivestFee(uint256)", +"4d4c277d": "MAINTENANCE_FEE_PERCENT()", +"4d4d2b1c": "hasVoted(address,address)", +"4d4eeaa8": "logoPng()", +"4d50169e": "distributionThresholds(uint256)", +"4d50d5f2": "firstPreSaleEndDate2()", +"4d51fad6": "Bittoq(uint256,string,uint8,string)", +"4d52a512": "getSoftCap()", +"4d536c03": "buySaleNonReferral(uint8)", +"4d536f9f": "validateNameExt(bytes)", +"4d536fe3": "doit()", +"4d53c30f": "t4tRaised()", +"4d547ada": "worker()", +"4d54dc96": "isNonlistedUser(address)", +"4d55a924": "KudosRouter()", +"4d561721": "etherandomSetNetwork()", +"4d562c82": "freezeProhibited()", +"4d563540": "HUN(uint256,string,uint8,string)", +"4d56a130": "BitfuryToken()", +"4d586512": "_rand(uint256,uint256)", +"4d589c5b": "curatorIDOf(address)", +"4d58e413": "pushDividendPaymentToAddresses(uint256,address[])", +"4d597b2d": "totalTokensCompany()", +"4d5a1173": "calculateMaximumBurnAmount(uint256,uint256,uint256)", +"4d5a225c": "ethCoin()", +"4d5ad11e": "getAnnualGrantsLength()", +"4d5b0081": "reward(address,address)", +"4d5b080c": "scheduleTransaction(uint256,address,uint256)", +"4d5b335d": "mintHeroAsset(address,uint256)", +"4d5b608b": "testTransfer(address)", +"4d5b85f1": "createLighthouse(uint256,uint256,string)", +"4d5c07aa": "CryptoSim()", +"4d5d528a": "FeibeiContract()", +"4d5de6ba": "stageThreeSupply()", +"4d5e58a4": "purchasedTokensRaised()", +"4d5e9a2a": "getInterestRatePunitory(uint256)", +"4d5eceac": "nextAssigneeIndex()", +"4d5f327c": "supportsToken()", +"4d5fc38a": "amountOfGames()", +"4d610837": "indPreSale()", +"4d61537f": "secretSigner()", +"4d620299": "postSale(address,bytes32,uint256)", +"4d622831": "getLast()", +"4d624906": "PriceChanged(address,uint256,uint256)", +"4d628c44": "setWagerWinner(uint256,address)", +"4d62a9da": "MindCoin()", +"4d62f83c": "_distributeAuctionTax(uint256,address)", +"4d655aff": "db()", +"4d65beb1": "getVipInfo(uint256)", +"4d66a3ab": "testtxorigin()", +"4d66d44d": "ArtToujourICO(uint256,uint256,uint256,uint256,uint256,address)", +"4d677d32": "Manager(address,address,address)", +"4d6804c2": "transferTokensFromVault(address,address,uint256)", +"4d68282f": "releaseFunds(uint256)", +"4d689543": "mmLibAddress()", +"4d6a26be": "tryOpenRoom(address,uint256,uint256,uint256)", +"4d6a304c": "GetLatestCheckpoint()", +"4d6a7d33": "collect(address,uint32[])", +"4d6a813a": "isCutieCore()", +"4d6aa2e5": "generateReferralAddress(address)", +"4d6aed53": "getIssued()", +"4d6b3d83": "Brave()", +"4d6bc04e": "totalPerTokenPayout()", +"4d6c3427": "REGULAR_TYPE_COUNT()", +"4d6c3b6b": "setCompte_4(string)", +"4d6f49b3": "updateChainlinkOracleWithENS()", +"4d6f58d5": "proveOwnership(bytes,int256)", +"4d70d1d7": "generateId(uint256)", +"4d712228": "Storesumdata(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,uint64)", +"4d71d6be": "finalizeDelegation()", +"4d720209": "withdrawDistributionCRL()", +"4d722c4c": "checkWinner(address)", +"4d729be4": "calculateFishermansFee()", +"4d730d51": "numOfPurchasedTokensOnEpBy(address)", +"4d73452e": "START_WEEK_3()", +"4d7439cb": "getBusiness(uint256)", +"4d7480ea": "_allowPublishSecret()", +"4d74d3b4": "setMetadataContractAddress(address)", +"4d754715": "burningEnabled()", +"4d7559a8": "totalGoldSupply()", +"4d7569ac": "TOKEN_SUPPLY_CROWD()", +"4d77551a": "eleventhTime()", +"4d782655": "confirmCertificate(uint256)", +"4d782cbc": "executeSellOrder()", +"4d78fdc6": "unblockAccount(address)", +"4d794cfc": "START_ETH_TO_CENTS()", +"4d79874e": "validateLandTakeover(address,uint256,uint256)", +"4d79ddb2": "getVotesForItemFromVoterIndex(uint256,uint256,uint256)", +"4d7a2052": "getTicketPrizeFromIndex(uint256)", +"4d7a7577": "DURATION_VIPPLACEMENT()", +"4d7ad1dd": "deleteProposal(bytes32,string)", +"4d7ad205": "gasRewardPercent()", +"4d7b8d2f": "DWBTICO(address,address,uint256,uint256,uint256,uint256)", +"4d7b9bd5": "checkBalance(address,uint256)", +"4d7ba587": "setDecider(address)", +"4d7bc8c9": "removeCompanion(address)", +"4d7c0192": "changeCanUpgrade(bool)", +"4d7c7485": "getActiveFlag(uint16)", +"4d7d003f": "dropCoinsSingle(address[],uint256)", +"4d7d13e1": "getUniqueIdOfPlayerByPlayerAndCountryID(uint256)", +"4d7d87b2": "prodTokens(address,uint256)", +"4d7d8a60": "marriageDate()", +"4d7d9a91": "transferCoadminship(address)", +"4d7dcfbd": "parseVarInt(bytes,uint256)", +"4d7e2a6a": "Token_Unlocked()", +"4d7e897f": "rollOne(address,uint8)", +"4d7ec628": "requestToken()", +"4d7ece70": "advisorVesting(address[],uint256[])", +"4d7edc15": "assignTokens(address,uint256)", +"4d7ee4ee": "changeGlobalOperator(address)", +"4d804e60": "WITHDRAWAL_TRIGGER_AMOUNT()", +"4d80bf14": "NewManager()", +"4d82f25c": "VestingTrustee(address)", +"4d831535": "allocatePVT_InvTokens(address[],uint256[])", +"4d83ffdd": "createUser(address,uint256,bytes32)", +"4d840bcc": "isWithdrawable()", +"4d843acd": "getSalaryTokensTotalAddress(uint256)", +"4d846a99": "getMin(uint128[])", +"4d846c8e": "getCurrentCandyAmount()", +"4d84ba37": "depositsAddress()", +"4d85006d": "Incredibles2RT()", +"4d853ee5": "founder()", +"4d8589c5": "getProofOfStakeRewardUpdateToken(address,address)", +"4d85b8d0": "checkEndOfChallenge()", +"4d86b498": "BucoTestCoin()", +"4d87a49b": "updateInvVault(uint256,uint256)", +"4d882c97": "EthPenis()", +"4d88a639": "getOrder(uint80)", +"4d88a8cf": "getExitBySlotId(uint64)", +"4d894d24": "getLevelByIndex(uint256)", +"4d8a666b": "EnterEntidadesdonaciones(address)", +"4d8a9310": "isCrowdsaleStopped()", +"4d8b7056": "Dd(address,address)", +"4d8bd784": "getGuestToken()", +"4d8c10a6": "AJCMToken()", +"4d8c3ea6": "getTxVoteDetails(bytes32)", +"4d8c61c1": "LogChangeTimestamp(address,uint256,uint256)", +"4d8caa7e": "setTokensPerWei(uint256)", +"4d8d9e92": "tokensPerSecond()", +"4d8dcc7a": "initDeposit(uint256)", +"4d8de4fc": "unbond(bytes32,uint256)", +"4d8e15f2": "KockToken()", +"4d8f00f4": "RatingsContract(address,address)", +"4d8fef1c": "produceWiner()", +"4d908a55": "InitiateCars()", +"4d909110": "EtherBank()", +"4d912393": "mintReservation(address[],uint256[])", +"4d918282": "addmoney(address,uint256,uint256)", +"4d91c096": "stakeCommence()", +"4d91d4f1": "incrementBasketsMinted(uint256,address)", +"4d9250c4": "TakeMyEther()", +"4d936889": "ConsentTemplate(string,uint256,string,string,string)", +"4d93d1db": "EventCreateAngel(address,uint64)", +"4d94994c": "lucky_number()", +"4d94cee7": "opetWallet()", +"4d9577af": "getFirstMilestoneStartsAt()", +"4d95a7a2": "tokensToRecieve(uint256)", +"4d95c76c": "activeCanvasCount()", +"4d964da6": "GBBCOIN(uint256,string,string)", +"4d96e062": "whenStakeCanBeReturned()", +"4d986c8f": "icoSalesSupply()", +"4d98a6ff": "createGroup(string,string,string,uint256,uint256,uint256,uint256,uint256,bool)", +"4d99055c": "getBonus(uint256,address,uint256)", +"4d9994e8": "setAccountNickname(string)", +"4d999756": "tokensPreICO()", +"4d9a3136": "findByName(string)", +"4d9a81d4": "IsDistribStarted()", +"4d9aa424": "crowdsaleEnd()", +"4d9b3735": "getFunds()", +"4d9b3d5d": "getbalance()", +"4d9b8fcf": "allowTransfer(address,bool)", +"4d9bcac4": "getProviderParameter(address,bytes32)", +"4d9c1bf3": "payTokenBatch(bytes32[],uint256[],address,address,bytes)", +"4d9e40af": "TOKEN_CREATORS_SUPPLY()", +"4d9e4e22": "Etheria()", +"4d9fb121": "Trade()", +"4d9fcee9": "getExportingAuthority()", +"4da07fe5": "getCardType(uint32)", +"4da0a4fc": "promoToken()", +"4da1397c": "durationOfLock()", +"4da1668d": "giftNFT(address,uint256,uint256)", +"4da1b25d": "weiFundingCap()", +"4da1e0b7": "cancelTokenSale(uint256,address,bool)", +"4da2317f": "payoutAll()", +"4da25c74": "triCmp(uint256,uint256)", +"4da2906b": "updateUser(bytes32,bytes32,bytes32,bytes32,bytes32)", +"4da2b48e": "getCat(uint256)", +"4da36913": "migrationIndex()", +"4da3b6db": "otherF3D_()", +"4da47ba0": "TokenSale(address,uint256)", +"4da51208": "OKMcoin(uint256,string,uint8,string)", +"4da5160f": "getFirstDocumentIdStartingAtValidFrom(uint256)", +"4da5598a": "syndicatePrecision()", +"4da5d4c0": "isEthernautsExplore()", +"4da5ed85": "disableContinuousDelivery()", +"4da74ee6": "setVoteIntention(uint256,bool,bool,string)", +"4da7c5d6": "LendingBlockTokenEvent(address)", +"4da837e3": "transferDevelopment(address)", +"4da845b3": "swapWinner()", +"4da86598": "getFileMd5(uint256)", +"4da8a771": "INHERITANCECrowdsale(uint256,uint256,uint256)", +"4da946d9": "TakeOffWorldwide()", +"4da9cb07": "LilithToken(uint256,string,string,uint8)", +"4daa1208": "SetPoolCreationFee(uint256)", +"4daaa98f": "doReward()", +"4daade18": "TravelCoinToken()", +"4daadff9": "extractCLNfromMarketMaker()", +"4dab54fd": "removeFromInxWhitelist(address)", +"4dab63ff": "_unpackItemData(uint256)", +"4dabb674": "changePhaseToNormalLife()", +"4dac7d6f": "renewableOf(uint256)", +"4dad66f5": "divForTank()", +"4dad9003": "transferManyLand(int256[],int256[],address)", +"4dadac8f": "STAKING_UNIT()", +"4daea42a": "TOWN_INCREASE_RATE()", +"4daf490c": "getFarm()", +"4daf890a": "invokeLottery()", +"4dafdc50": "exchangeId()", +"4db0040e": "createWonderNotAuction(string)", +"4db08aea": "SALE()", +"4db08e5b": "getSaleContractTokensMinted(address)", +"4db19e7e": "assertEq(bool,bool,string)", +"4db1ba5a": "repossessionBountyPerTen()", +"4db1c7b2": "changeId(uint256,uint256)", +"4db208ba": "Titanization()", +"4db2beef": "distroyToken(uint256)", +"4db347a3": "acceptChallenge(address)", +"4db3c6d7": "buyTokensWithReferal(address)", +"4db3da83": "scheduleCall(bytes4)", +"4db3eef8": "delegateFromBonus(uint88)", +"4db4eae6": "_topBonus()", +"4db4eff0": "hatchCoins(address)", +"4db52924": "setNumMessagesSigned(bytes32,uint256)", +"4db53a70": "VTest()", +"4db59565": "getHistoryRoundInfo(uint256)", +"4db5d52b": "getWagerOwner(address)", +"4db61d21": "compareNoCase(string,string)", +"4db6397f": "calculatePlayerValue(address)", +"4db77d9d": "getMaxJump(uint256)", +"4db8349e": "buyerToSentWeiOf(address)", +"4db8cbc9": "wordCounter()", +"4db94441": "limitAgentBets()", +"4db9bfe6": "getPostVoteCount(uint256)", +"4dbaa16b": "recoverLeftoversPreICO()", +"4dbac733": "INITIAL_RATE()", +"4dbb1964": "setSalesAgent(address)", +"4dbb37eb": "checkLeftToken()", +"4dbb4da5": "increaseMaxContribTime()", +"4dbb51f6": "Hashfex()", +"4dbbddff": "BOBTokenVesting(address,uint256,uint256,uint256,bool)", +"4dbbfcc6": "stageLength()", +"4dbc355a": "releaseTeam()", +"4dbdb0fd": "signUpForPVP(uint256)", +"4dbddc18": "getPoolID()", +"4dbe5889": "ownerClaim()", +"4dbf27cc": "follow(address)", +"4dbfb6fb": "PredictionMarket(uint256)", +"4dc0884f": "playerCards(uint256)", +"4dc08ce2": "GameWon(uint256,address)", +"4dc133a5": "stopTge(bool)", +"4dc13951": "vendingAttachedState()", +"4dc189ef": "createContractWhale(string)", +"4dc18c02": "finalSendTokens()", +"4dc1dbec": "priceToMint()", +"4dc266b4": "submitAnswerReveal(bytes32,bytes32,uint256,uint256)", +"4dc2c67a": "veriPass(string)", +"4dc3141b": "CalcAll()", +"4dc3ba8f": "assignVoterMoreVotes(address,uint256)", +"4dc3f289": "changeCommonDiscount(uint256)", +"4dc41210": "preStartTime()", +"4dc415de": "reject()", +"4dc43eaf": "setTreasury(uint256,uint256)", +"4dc49b25": "InitialPointUnit()", +"4dc59196": "icoAllocation()", +"4dc5c69f": "getTotalDiscount(address)", +"4dc5c771": "dividendsAccount()", +"4dc5fa4e": "MEDIA_SUPPORT_WALLET()", +"4dc65411": "GEM()", +"4dc666b3": "sendTokensManually(address,uint256,uint256)", +"4dc6b523": "divestFee()", +"4dc73428": "transferFromByModule(address,address,uint256,bool)", +"4dc7cc55": "terminateAlt()", +"4dc7d31b": "transferRwrd(uint256)", +"4dc8ed02": "ICObonusStages(uint256)", +"4dc936c0": "mintItem(uint256,address)", +"4dc958e1": "addToBounty(uint256)", +"4dc996d5": "updatetoken(string,string,string,string)", +"4dca2770": "BecomeMemberCandidate(bytes32)", +"4dcad927": "tokensSoldTotal()", +"4dcb05f9": "depositBond(uint256)", +"4dcbb8ee": "getAllAuditors()", +"4dcc889d": "Conference(string,uint256,uint256,uint256,string)", +"4dcd4fb1": "MetaChanged(bytes32,bytes32,bytes32)", +"4dcd85d8": "setPriceOfApis(uint256)", +"4dce4142": "opVaultAddr()", +"4dcee2e0": "hashes(uint16)", +"4dcf2917": "allowUpgrades()", +"4dcf7430": "receiveTokenLoot(uint256[],uint256,uint8,bytes32,bytes32)", +"4dd0f157": "getWinnerType(uint256)", +"4dd12329": "rightSharePrice()", +"4dd19434": "getLeaf2(uint256)", +"4dd1e81c": "tokenBuyable(uint256,uint256)", +"4dd33832": "tokensSoldAtIco()", +"4dd36a0e": "buyTokens(uint8,address)", +"4dd37f19": "getHashRateOfCurrentHalving(address)", +"4dd3e575": "endMinting(bool)", +"4dd4547d": "fireOnChanged(bytes32,uint256[])", +"4dd49680": "SetEvaluate(uint32,uint8,uint8)", +"4dd49ab4": "get(bytes,uint256)", +"4dd49e08": "deliverTokens(address,uint256)", +"4dd5df8c": "setPOOL_edit_16(string)", +"4dd60ff9": "buyNDC(uint256,uint256,uint8,bytes32,bytes32)", +"4dd7f293": "Kayako()", +"4dd83243": "hasNextKey(uint256)", +"4dd83cb1": "refreshPublicFundingTime(uint256,uint256)", +"4dd850fb": "UfoPonzi()", +"4dd8aefd": "DTT()", +"4dd93bd3": "getInvestmentValue()", +"4dd9e437": "transferUserToUser(address,address,address,uint256)", +"4dda1764": "CafeMaker()", +"4dda71a8": "newAuction(uint128,uint256,uint256)", +"4ddad616": "genesMarket()", +"4ddb5f01": "ROPCOIN()", +"4ddbf2b3": "teamTokenFund()", +"4ddc36df": "renounceClearingPriceValidator()", +"4ddc8f74": "SPEX()", +"4ddd108a": "money()", +"4ddd648b": "buyer_profit_pool_amount()", +"4ddddd4c": "SearchIPR(string)", +"4dde3fe1": "redemptionAddress()", +"4dde88ad": "getGroupMembers(uint256,uint256,uint256)", +"4dde8de6": "registerUBetCheck(address,string,string,string,uint256,string,int256)", +"4ddf6795": "getVoteRulesOfProposal(uint256)", +"4ddfd20f": "offer_id()", +"4de0089a": "becomeHipstermaster()", +"4de037c7": "getTitulaire_Compte_8()", +"4de0cdf2": "setICOParams(uint256,uint256,uint256)", +"4de1454f": "targetReached(uint256)", +"4de16053": "getLockProductCount()", +"4de162e4": "extractAccountLength()", +"4de1fc55": "submitAnswer(uint256[],uint256[])", +"4de2578c": "reproduce(uint8,address,uint256)", +"4de260a2": "hack()", +"4de261ef": "presalecap()", +"4de2d5d5": "checkPrize()", +"4de2eee9": "zapVillain(uint256,uint256)", +"4de2f146": "SentAmountToNeighbours(uint256,address)", +"4de315ea": "unlockAddressToken(address)", +"4de4145f": "_transferSenderPaysFee_byProxy(address,address,uint256)", +"4de4f479": "RiskPrice()", +"4de504cd": "setTransferLockFree()", +"4de5120e": "lastWithdrawalTime(address)", +"4de62cd6": "removeGemmyMusicLock(address)", +"4de799c2": "cancelTeamWithdrawal()", +"4de85639": "failDivideFractionalByZero()", +"4de8a799": "addPrivateSaleBuyer(address,uint256)", +"4de90f34": "minForNewTopic()", +"4de94320": "logic_contract()", +"4de946bf": "ideaProofDocument(bytes,uint256)", +"4de952c7": "cmulpow2(address,uint256)", +"4de970fd": "RATE4()", +"4de9e482": "ENDHarvest()", +"4dea208b": "upgradeKingdomType(string,uint256)", +"4dea4d15": "setConfig(uint64,string,uint256,uint256,address,string)", +"4deaad5f": "reverseBytes(uint256)", +"4deb68a3": "auctionStart(bytes32,uint256,uint256)", +"4deb9f47": "UnlockRig(uint8)", +"4deba2e0": "LogCreateToken(address,uint256)", +"4dec1014": "stageFokenCap(uint16)", +"4dec5dc4": "employeeExerciseOptions(bool)", +"4dec9b57": "testView()", +"4ded452e": "InviteCreated(address)", +"4ded6e89": "airdropParticipants()", +"4ded9bfe": "releaseMultiAccounts(address[])", +"4dee529a": "Muggelo()", +"4def0453": "setContentURI(uint256,string)", +"4defd1bf": "setCrowdsaleManager(address)", +"4df0b78a": "withdrewThisYear()", +"4df0ca7e": "EarlyAdoptersAddress()", +"4df17cdc": "maxEtherInvestment()", +"4df28ae4": "capTime()", +"4df34124": "RyxEx(address,address,address,uint256,uint256,uint256)", +"4df3ad68": "setTokenPriceInCent(uint256)", +"4df498b2": "getPreSaleEnd()", +"4df53a0f": "testSetApprovalDb()", +"4df62441": "percentOfPresaleSold()", +"4df65873": "getDefaultRgb(address)", +"4df679e3": "BonusAllocation(address,string,string,uint256)", +"4df68ada": "enable(bool)", +"4df6b45d": "delegateTransferFrom(address,address,uint256,address)", +"4df6ca2a": "setQuestionFee(uint256)", +"4df6d6cc": "allowedRecipients(address)", +"4df7e3d0": "b()", +"4df86126": "SECONDS_PER_HOUR()", +"4df93196": "Joe223()", +"4dfa2722": "CryptoWuxiaVoting()", +"4dfa3f18": "createNewUser(string,string)", +"4dfad511": "_redeem(address,uint256)", +"4dfb10bc": "realVotedSupply()", +"4dfb4807": "etherTotal()", +"4dfc7aa1": "existsDistrito(uint256)", +"4dfc97c5": "policyTokenBalance()", +"4dfcf67a": "NeroSupply()", +"4dfd14b2": "EMACCrowdsale(uint256,uint256,uint256,address,address)", +"4dfd1b02": "setUint8(int8,uint8)", +"4dfd964f": "TSTCallAPI()", +"4dfdc21f": "maxNum()", +"4dfdebe9": "ClientQty()", +"4dfe13e7": "distributeTokensToWallets(address[])", +"4dfe28e7": "releasedTokenOf(address)", +"4dfe950d": "purgeUpgrade()", +"4dfff04f": "approveSiring(address,uint256)", +"4e010942": "LogOraclizeCallback(uint256,bytes32,string,bytes)", +"4e0128fb": "watchPrice()", +"4e012918": "whitelister_address()", +"4e017994": "capEth()", +"4e01bb60": "RefundPeriodOver()", +"4e01bd10": "emergencyTokenWithdrawal(uint256)", +"4e02107a": "getWeddingData()", +"4e022f11": "setSpark(address)", +"4e023fc9": "FakeXUC()", +"4e028c67": "SAC()", +"4e02ed40": "CESCoin(uint256,string,string)", +"4e039d26": "setPreallocationWhitelist(address,bool)", +"4e0416a6": "DaoRulesProposalAdded(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,address,uint256)", +"4e054a67": "setBlacklist(address)", +"4e05ded6": "ClassicCheck()", +"4e06369c": "getPurchasableAmount()", +"4e077f2a": "addGasEther()", +"4e07a7a5": "thirdStageMinted()", +"4e088eb7": "stopPrivateSale()", +"4e0896a1": "teamIndexToExist(uint256)", +"4e0a0f21": "preICOstartTime()", +"4e0a3379": "setCFO(address)", +"4e0ade00": "SmartWallet(address,address,address)", +"4e0b7888": "_updateStage()", +"4e0ba39d": "reserveAdd(uint256,uint256,uint256,uint256)", +"4e0be991": "removeChild(address,address)", +"4e0c4a9c": "setCommissioner(address)", +"4e0ce969": "moduleToken(uint256,uint8)", +"4e0d93a3": "increasePriceForNeighbours(uint256)", +"4e0e9675": "isIdentity(address)", +"4e0f1064": "getMonthlyTransactionVolumeReceiving()", +"4e102951": "can_claim(address,address,address)", +"4e1053cc": "RobinHoodPonzi()", +"4e10c212": "TxAttackWallet()", +"4e10c3ee": "transferWithoutReward(address,uint256)", +"4e116eb8": "unRegisterCertificationDb(address)", +"4e1243b6": "AddClaim(uint32,string,bytes32,bytes32,address,uint32)", +"4e1273f4": "balanceOfBatch(address[],uint256[])", +"4e12e51a": "getBonusList()", +"4e1339fe": "HALT()", +"4e13f066": "RedSoxRays48()", +"4e140274": "isDiscount()", +"4e1415ab": "testThrowExecuteSellOrderDaoChallengeRefusesZeroFunds()", +"4e14e4c8": "CyberCapitalInvestToken()", +"4e153418": "CreateLottery(uint32)", +"4e159a05": "clacCooperateNeedLockAmount(uint256)", +"4e15dfe9": "wholeTokensPerEth()", +"4e16bef5": "jack_max()", +"4e16e0c7": "participantCanParticipate(address)", +"4e18405d": "TOTAL_ARK()", +"4e18c1a7": "IcoPhaseAmountsChanged(uint256,uint256,uint256,uint256)", +"4e191701": "lamboPresaleAddress()", +"4e194cc0": "getCreateFeeToken()", +"4e195faf": "totalEthereumRaised()", +"4e19c112": "deleteOwner(address,uint8)", +"4e1a150b": "netherToken()", +"4e1a1853": "ParentCoinAddress(address)", +"4e1a50b7": "setBonuses(uint256,uint256,uint256,uint256)", +"4e1bdfdf": "withdrawOlder()", +"4e1cfa8c": "batchAddCandidateByIndex(uint256,address[],bytes32[],bytes32[])", +"4e1dc0d7": "LAYA()", +"4e1f6c14": "FUTURE_WALLET()", +"4e1fa837": "TestERC721()", +"4e205cee": "signedApproveAndCallHash(address,address,uint256,bytes32,uint256,uint256)", +"4e209678": "testFailBreach()", +"4e2133ba": "addExchangePartnerAddressAndRate(address,uint256)", +"4e21f25e": "soldPresale()", +"4e22102b": "LIMITS_END_DATE()", +"4e2280c4": "clearQuickBuyPath()", +"4e228d8f": "ExchangeableToken(address)", +"4e23176c": "buyRBCTokens()", +"4e232730": "ownerOn(address)", +"4e233065": "delKeyValue(uint256,bytes32)", +"4e23a144": "fundUser(address,uint256)", +"4e25658e": "setSegment(string,uint32,uint32,string,string,string,string)", +"4e2567d0": "addToAccountList(address)", +"4e25c92e": "ttlSply()", +"4e2611ae": "vnetToken()", +"4e2659a8": "createTeam(bytes32,bytes3,bytes3,bytes3,bytes3,bytes3,bytes3)", +"4e26c95e": "EASYLIFE(uint256,string,string)", +"4e272768": "remove_bounty()", +"4e2743b3": "setStack(uint256,uint256)", +"4e275295": "tokensSell()", +"4e2786fb": "roundNumber()", +"4e27e916": "voteLock(address)", +"4e2808da": "cancelOwnership()", +"4e280fd6": "SolarioToken()", +"4e284af1": "INCENT_FUND_NON_VESTING()", +"4e285acb": "setsendgoods(uint256)", +"4e29cba6": "disbursements(uint256)", +"4e2a953a": "gameStartedAt()", +"4e2aae36": "setzUint256(uint256,int256)", +"4e2ab933": "transferFrom(address,address,uint256,bytes,string)", +"4e2ad943": "mainSaleBonusEndTime()", +"4e2b57fe": "mincap()", +"4e2ba115": "DFVToken()", +"4e2bd9ce": "rescind(address)", +"4e2bdfd4": "getBetMutableData()", +"4e2c9524": "upgradeDuties()", +"4e2de9e1": "setGzeBonusOffList(uint256)", +"4e2e8a10": "setTime3(address,uint256)", +"4e2e94f7": "MAX_PRE_SALE_AMOUNT()", +"4e2f220c": "createCentralizedOracle(bytes)", +"4e2f2af4": "PayoutRedemption(uint256,uint256,uint256)", +"4e2fa68f": "crowdsaleStarts()", +"4e2fd44e": "setPriv(address)", +"4e304bfb": "CRAIC()", +"4e30506f": "dropLast()", +"4e30a66c": "safeToAdd(uint256,uint256)", +"4e317ead": "cancelTemplateProposal(address,uint256)", +"4e31aea3": "firstThawDate()", +"4e329bd3": "HealthCoin(uint256)", +"4e358ce7": "DITCOIN()", +"4e35aacf": "createCompany(string,uint256)", +"4e360eaf": "EmergencyStopActivated()", +"4e3673a6": "connectCrowdsaleContract(address)", +"4e36fddf": "XdacTokenCrowdsale(address,uint256[],uint256[],uint256)", +"4e37af4e": "offlineCallback(bytes32)", +"4e38413f": "setBytes32(bytes32,bytes32,bytes32,bool)", +"4e385512": "setCampaignValidity(bytes32,bool)", +"4e38f205": "generateWithdrawalHash(string,uint256,address)", +"4e390f2a": "initLottery(uint256,uint256,uint256,uint256)", +"4e395e2a": "isExecutable(uint256)", +"4e3acafe": "Cr1tikalIsShort()", +"4e3b33d4": "prepareRefund()", +"4e3b52fe": "metaCoin()", +"4e3c2f47": "getCardDivs(uint256,uint256)", +"4e3c50a0": "addBuyTokensRequest(address,string,string)", +"4e3d2745": "ManoloToken()", +"4e3d539a": "newChainlinkWithENS(address,bytes32)", +"4e3dc2f1": "STAT_MAX()", +"4e3df857": "removeEA(uint32)", +"4e3e4035": "notEqual(int256,int256,string)", +"4e400bda": "getSenderStatus(address,uint256)", +"4e406167": "setContractICO(address)", +"4e4081ef": "pregnantBots()", +"4e41108d": "Bank()", +"4e417a98": "callData()", +"4e41a1fb": "symbol(uint256)", +"4e41ebf6": "createCommissionerAuction(uint32,uint256,uint256,uint256)", +"4e42b632": "WEBcoin()", +"4e43502a": "BDSMTOKEN(uint256,string,uint8,string)", +"4e43603a": "getUserStats(address)", +"4e448ffa": "winnerLuckyNumber()", +"4e44b5cc": "Kiwi(address,uint256,string,string,uint8,uint8)", +"4e44c855": "setGameStatus()", +"4e44d956": "configureMinter(address,uint256)", +"4e458cc2": "setNewEndTime(uint256)", +"4e458eb6": "posstoken()", +"4e45fba9": "getProviderDetails(address,uint256)", +"4e46869c": "accountAndSubcourtIDToStakePathID(address,uint96)", +"4e46fc2c": "finalizePreICO()", +"4e47d99a": "WubCoin(address)", +"4e4831d8": "removeDelegatorById(uint256,address,address)", +"4e485c52": "closeTransfer()", +"4e48a495": "checkTransfer(address,address,uint256,uint256)", +"4e4965ff": "AIPAY()", +"4e49954e": "createReceipt(address,string)", +"4e49acac": "setParams(address)", +"4e4a8c0d": "sendMessage(address,uint256,uint256,bytes)", +"4e4ab830": "amIOwner()", +"4e4ac577": "claimFeesForRound(address,uint256)", +"4e4afa1b": "minimumTickets()", +"4e4cf65c": "forwardMoney()", +"4e4d02db": "DeathFactor_iii()", +"4e4d3e56": "get_funds_left_for_reinvestment()", +"4e4e2d6d": "PaymentForwarded(address,uint256,uint128,address)", +"4e4e7862": "addWithdrawal(address,address,uint256)", +"4e4f776c": "TCT(uint256,string,uint8,string)", +"4e4fbee1": "renounceProxyManager()", +"4e4fe306": "getData(uint256,uint256)", +"4e500760": "CreditUnits()", +"4e504313": "Addr3()", +"4e505367": "initialTokenAmount()", +"4e51193b": "sealTimestamp()", +"4e5141eb": "buyTokens(uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"4e5146a9": "hexToAscii(uint8)", +"4e520a94": "getNumRecords(address)", +"4e521a2a": "INCUToken()", +"4e523b91": "MonethaToken(address,uint256)", +"4e52622b": "eth6DivsOwing(address)", +"4e52678e": "digix()", +"4e53a0b9": "update(address[],uint256[],uint256[],uint256[])", +"4e53b564": "adminTransferContractBalance(uint256)", +"4e542bff": "_triggerPVPSignUp(uint256,uint256)", +"4e542c5f": "deleteById(uint256)", +"4e543b26": "setResolver(address)", +"4e5497de": "BuyoutDividend(address,address,uint256,uint256,uint256)", +"4e55936d": "NorthPoleMintingEnabled()", +"4e56925f": "updateMasternodeAsTeamMember(address)", +"4e57d27d": "_getAllRevisionTimestamps(bytes20)", +"4e58e920": "officialFacebook()", +"4e599551": "getPreviousWinners()", +"4e59f947": "SucToken()", +"4e5a33c5": "executeTokenRepartition(uint256)", +"4e5aabe6": "resetStellarBalance()", +"4e5ac744": "PDPCoin()", +"4e5acb1a": "changeAutherOwner(address)", +"4e5b0d29": "getVisaEntered(address,uint256,uint256)", +"4e5b3cb8": "EtherusPreSale(address,address,address,address)", +"4e5b5f54": "purchasePresale(address,uint256)", +"4e5bec6e": "addTypeAddressById(uint256,address,address,uint256)", +"4e5c0595": "tokenAdvisorsAllocated()", +"4e5d49a0": "DariumToken(address)", +"4e5d7186": "LogAccountRegistered(address,address,bytes32,bytes32,bytes32,bytes32)", +"4e5d793f": "setAsset(address,uint256,uint256,uint256)", +"4e5d8edd": "VOLUME_70()", +"4e5ed65b": "_indexAccount(address)", +"4e5f13bc": "landPriceCurrent()", +"4e5f8751": "newInvestWallet(address)", +"4e60321d": "userOddsMiniGame(address)", +"4e605688": "setBtcBuyer(address)", +"4e6093f8": "HeirChanged(address,address)", +"4e6106c5": "getRealisation()", +"4e61c362": "transferMul(address,uint256)", +"4e61df06": "DigixbotEthereum(address)", +"4e61efc5": "getWizzTypeOf(uint256)", +"4e637fab": "DepositsTransferred(address,uint256)", +"4e659145": "levPerUser()", +"4e6630b0": "ethBalance()", +"4e68354e": "LogLockStateTransition(uint8,uint8)", +"4e6885f3": "depositPresale(address)", +"4e6944cf": "totalStaticoinSupplys()", +"4e696d3c": "startCoinSale(uint256,address)", +"4e69d560": "getStatus()", +"4e6ab570": "insert_order(address,bool,uint32,uint128)", +"4e6b29ee": "returnIsParentAddress(address)", +"4e6b558a": "removeVerifiedAddress(address)", +"4e6b97f3": "transferMultiSameVaule(address[],uint256)", +"4e6ba0a9": "testCreateCostMultisig()", +"4e6c61aa": "testFailAddForeignChildNotChild()", +"4e6d1405": "invoices(uint256)", +"4e6d35ea": "currentlyReleased()", +"4e6d739d": "getSupernovaBalance()", +"4e6d73da": "LogUserUserRemovedFromWhiteList(address)", +"4e6e5d69": "unMint(address)", +"4e6e6928": "latestFriend()", +"4e6ec247": "_mint(address,uint256)", +"4e6f42ba": "changeSeizedTokensWallet(address)", +"4e6fedb7": "remainOfStage(address,uint256)", +"4e705549": "setDefinition(uint8,uint8,uint8,uint8,uint8)", +"4e7073f1": "setMinETH(uint256)", +"4e70a604": "Withdrawal(uint256)", +"4e70b1dc": "num()", +"4e7196c7": "setReg1(uint256)", +"4e71d92d": "claim()", +"4e71e0c8": "claimOwnership()", +"4e724f0f": "numBlocksLocked()", +"4e725b7a": "test_hasClaimableShares_nonZeroClaimableStake()", +"4e72ec91": "setPointer(uint8)", +"4e72f19e": "SendFundsToReceiver(uint256)", +"4e730025": "register(uint256,uint256,uint8,uint8,uint8,uint8,string)", +"4e7343ea": "verifyOrder(address,uint256,uint256,address)", +"4e7344d5": "ABitcoin()", +"4e7355d6": "RegistrantRemoval(address)", +"4e7445c8": "drainRemainingToken(address)", +"4e7455d0": "createMilestones(uint256,bool,uint256)", +"4e7602d3": "setRecipients(address[])", +"4e761a91": "STEP_SIZE()", +"4e7654fe": "buyTokens(uint256,uint256,bytes16,uint256,uint8,bytes32,bytes32)", +"4e76a725": "test_withAssertTrue()", +"4e76a846": "numParticipants()", +"4e76f5d2": "GetMinimumBet_ether()", +"4e77a38e": "releaseTrickleDownBonuses()", +"4e78e0c2": "setVerificationSlashingPeriod(uint256)", +"4e79909c": "WithdrawalApproved(uint256,uint256,bool,uint256,bytes)", +"4e79fd7c": "stepLockedToken()", +"4e7a540b": "doUpgradeInternal(address)", +"4e7a6978": "PersianTokenICO(uint256,uint256)", +"4e7ad367": "fireEventLog1Anonym()", +"4e7b1ce1": "PayNihilumToContract()", +"4e7ceacb": "getFeeAddress()", +"4e7cff38": "toBytes20(bytes,uint256)", +"4e7d656a": "EtherSpermBank()", +"4e7dbb29": "TTARD()", +"4e7e96f1": "buyBackInvestedValue()", +"4e7ec0e4": "setGlobalTimeVault(uint256)", +"4e7ec7e3": "RANGEEND_6()", +"4e7f1264": "leaveMessage(string)", +"4e7f9b19": "getReport(uint256)", +"4e80f241": "YCStandardToken(uint256,string,uint8,string)", +"4e8127f6": "icoSupply()", +"4e815698": "removeBlacklistAddress(address,address)", +"4e8182c8": "addJugada(uint256,string,string,uint256,uint256)", +"4e81b17d": "createMonthlyBill(uint8,uint256,uint256)", +"4e81eec9": "EventProductEndSale(uint32)", +"4e8204a4": "NewRoundStarted(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"4e82844d": "countWishes()", +"4e82c134": "getAddressFromUsername(string)", +"4e83977a": "validationWallet()", +"4e840bea": "IGTToken()", +"4e84c614": "getWaitingState()", +"4e85a0e1": "cancelVoteForCandidateByIndex(uint256,address,uint256)", +"4e860ebb": "disableTokenIssuance()", +"4e876ecc": "directSellRate()", +"4e87c715": "DEFAULT_INITIAL_COST()", +"4e880082": "distributeTheSameAmountOfTokens(address[],uint256)", +"4e89eb98": "bonusDicrement()", +"4e8a411b": "deallocate(address,address,uint256)", +"4e8afc5f": "getRegister(string,bytes32)", +"4e8b759c": "BuyOrdersOf(address,uint256)", +"4e8b75d0": "IRtokenChain(uint256,string,string)", +"4e8be64d": "TokenToken(uint256,string,string)", +"4e8c185b": "setFeePropMaxGlobal(uint256)", +"4e8c2927": "FreeToken()", +"4e8eaa13": "cancelAuction(uint256,address)", +"4e8ec73e": "jockeyPr(uint256)", +"4e8f05d1": "setGrowthTokensWallet(address)", +"4e8f7fdf": "allocateTokenForTeam(address)", +"4e8fb35c": "referralBountyTokensAddress()", +"4e91025e": "Liquidate(address,uint256,uint256,uint256,uint256)", +"4e91ca3a": "updateModuleStatus(address,bool)", +"4e91db08": "setBytes32(bytes32,bytes32)", +"4e91f906": "getNewPetCard(uint8,uint8)", +"4e922731": "calcRefBonus(uint256)", +"4e926eab": "getInviteePIDs()", +"4e9282af": "setBDApprove(uint256,bytes)", +"4e930483": "addbtycmoney(address,uint256)", +"4e9384da": "addSecondPreferences(bytes32[],bool)", +"4e938539": "preSaleSecondBonus()", +"4e93bf32": "maximumBuyBackAmountInWEI()", +"4e9466f7": "withdrawToMany(address[])", +"4e94917a": "Claim_TRAC_20000()", +"4e94c829": "getAugur()", +"4e94fbcf": "setIntervalCoefficient(bytes2,uint256,uint256,uint256)", +"4e954f87": "IsEthereum()", +"4e961921": "getCurrentTokenRate()", +"4e96ea53": "addContract(address,address,address,string)", +"4e97bcfc": "EmergencyStop()", +"4e98323c": "setReturnAgent(address)", +"4e9833ac": "changeHoldingTaxInterval(uint256)", +"4e989a5b": "importPlayers(address,address[])", +"4e98a5b3": "receiveAssets(uint256)", +"4e99b800": "tokenBaseURI()", +"4e9b5db0": "BASEPRICE()", +"4e9c6b1f": "million()", +"4e9cc134": "JPG1Token()", +"4e9cf5b1": "changeOperational(bytes32,bool)", +"4e9de828": "registerAuthContract(address)", +"4e9e456b": "oraclize_query(uint256,string,bytes[1])", +"4e9ec8a6": "transferETHtoContract(uint256)", +"4e9ee738": "test_8_basicTransfersBetweenAccounts_increaseBlocksBy300()", +"4e9f0f06": "GimmerTokenSale(address,address,uint256,uint256)", +"4e9f9d37": "startTimeTwo()", +"4e9faaba": "_sell(address,uint256)", +"4e9feee6": "changeFrozenTime(uint256)", +"4ea05686": "countSet()", +"4ea0db6c": "HardCapReached(address,uint256)", +"4ea10c74": "FounderAllocationTokens()", +"4ea14479": "setProjectToVerify(address,uint256)", +"4ea1fcb6": "getWithdrawAmount(address)", +"4ea201cc": "betInfo()", +"4ea28ee6": "MyToken(uint256,uint256)", +"4ea2ea9f": "allocLastTxRewardByHand()", +"4ea2f66a": "_claimIfNeededThenSteal(uint256,uint256,address,uint8,bytes32,bytes32,uint256,uint256)", +"4ea34cdb": "getActionContract(address)", +"4ea37fec": "presaleStartTimestamp()", +"4ea412f4": "setPrice3(uint256)", +"4ea44358": "setGen0Step(uint256)", +"4ea5195a": "participantRoundCalced(address,address,uint256)", +"4ea5a6ac": "getRocIndexToOwner(uint256)", +"4ea611cd": "setPartnerDurance(uint256,uint256)", +"4ea640da": "ManoAntrasToken()", +"4ea66c38": "buyinInternal(address,uint256)", +"4ea6c89e": "isPreviousStageFinalized()", +"4ea73b07": "APOTokenCrowdsale()", +"4ea7d483": "priceStar5Now()", +"4ea801c5": "writeRate(string,uint256)", +"4ea8b6d0": "changeProfilePicture(bytes32)", +"4ea9560e": "FoshaAirdrop()", +"4ea9a27a": "registerHolder(bytes32,address,uint256)", +"4ea9ea71": "_submitTransaction(address,uint256,bytes,bytes,address)", +"4eaaad7b": "left72(uint256)", +"4eab38f4": "depositReclaim(uint256,uint256)", +"4eab3998": "Allocations()", +"4ead4771": "getBIDList()", +"4eae51f4": "getHeirs()", +"4eae8e30": "isSenderApprovedFor(uint256)", +"4eaef8a2": "getCEOHashing(address,uint256)", +"4eb03f6e": "updateMinter(address)", +"4eb054e6": "createPinMoTrade(bool,uint256,uint256)", +"4eb06f61": "manualLockFunds()", +"4eb09bf4": "getParametersHash(uint256,uint256,uint256,uint256,address,address)", +"4eb1483d": "IcoAddress()", +"4eb166af": "right73(uint256)", +"4eb1e71c": "HashTestCoin()", +"4eb1f578": "saleValve(bool)", +"4eb21301": "currentSaleCap()", +"4eb259aa": "burnAndReturnAfterEnded(address)", +"4eb2a8fb": "Banear_Oraculo(address)", +"4eb3148e": "feesTakenFromPrize(uint256,uint256)", +"4eb333c7": "setSynthesizingAuctionAddress(address,address)", +"4eb37fe7": "Tournament(uint256,uint256,uint256,uint256,uint256)", +"4eb396cd": "mintByMintable(address,uint256)", +"4eb421e5": "MockFailUpgradeableToken()", +"4eb4fe80": "getBackLendingItem(uint64)", +"4eb5162e": "collectSellFee()", +"4eb56999": "claimRefundVaultOwnership()", +"4eb665af": "setLockDuration(uint256)", +"4eb7221a": "nameRegistry()", +"4eb7d857": "getSite(uint256)", +"4eb81ba4": "getSchellingRoundDetails()", +"4eb8ffb4": "ORACLIZE_GAS_LIMIT()", +"4eb933bf": "withdraw(bytes32[],address[],uint256[],uint64[],uint8[],bytes32[],bytes32[])", +"4eb94102": "setAuctionManagerAddress(address,address)", +"4eb94872": "Err(string)", +"4eb95b97": "DropNotice(uint256,string,string,string)", +"4ebab5cf": "specificApprove(address,uint256)", +"4ebc31f3": "managerETHcandidatAddress()", +"4ebc7a9c": "processReinvest(address,bool)", +"4ebcdc2b": "SwapStarted(uint256)", +"4ebd7741": "extraMint(address)", +"4ebe2d46": "createMultisig()", +"4ebfa8bc": "getUserBettingInfo(address,uint256)", +"4ebfd6e8": "freeForAll()", +"4ebfff02": "setAddressAPI(address,address)", +"4ec06982": "paybackToDepositer(address,uint256)", +"4ec0744d": "UtrustToken()", +"4ec109f4": "receiveToken(address,address,uint256)", +"4ec1646d": "claimFreeAnimalFromAnimalFactory(string,string)", +"4ec18db9": "poolSize()", +"4ec19512": "calculateRunway()", +"4ec1adf1": "callAMethod2(uint256)", +"4ec24fa0": "getManagementProxy(uint32,int256)", +"4ec2b417": "getBankKYC(address)", +"4ec2cde6": "totalSupplyForCrowdsaleAndMint()", +"4ec2d0b6": "buyMiner(uint256[])", +"4ec32507": "parentBlockInterval()", +"4ec42e8e": "antToken()", +"4ec4878b": "donateJackpot()", +"4ec6396d": "TransChain()", +"4ec6a61a": "InitializeCoinToUser(address)", +"4ec70fde": "publicMin()", +"4ec7344e": "MetaFoxToken()", +"4ec735ae": "revokePermission(address,address,bytes4)", +"4ec79937": "approve(bytes32,bool)", +"4ec7a6e7": "externalSale(address,uint256,uint256,uint256)", +"4ec7b58b": "delSaleOwner(address)", +"4ec7ddc0": "addCommitteeVote(address)", +"4ec883d1": "editRestrictedAddress(address)", +"4ec8a8ff": "unpausecontract()", +"4ec9ef9c": "calculateTokenPurchase(uint256,uint256)", +"4eca4b19": "sendCoins(address,address,uint256)", +"4ecb02aa": "firstTierDiscountUpperLimitEther()", +"4ecb1390": "saleTokens(address,uint256)", +"4ecb35c4": "confirmations(address)", +"4ecb5e79": "IamGROOT()", +"4ecb8d0f": "transferOwnershipSend(address)", +"4ecc6eab": "setDefaultBuyerLastPaidAt(uint256)", +"4ecc7f59": "assignPreicoTokens()", +"4ecd4aa9": "createRequestAsPayeeAction(address[],bytes,int256[],address,bytes,string)", +"4ecd73e2": "DistributeDividends(uint256)", +"4ecd81b3": "redeemUTXO(uint256,bytes32[],bytes,bool,uint8,bytes32,bytes32,address)", +"4ecdf165": "rareIdRange()", +"4ece90a8": "getERC20()", +"4ecf77d3": "getUnfinishedGames()", +"4ed0694f": "kkICOTest77()", +"4ed0efd1": "selfdestructs()", +"4ed250bf": "freezeTime(uint256,uint256)", +"4ed3881e": "setTokenTransferIdentifier(string,bytes4)", +"4ed3885e": "set(string)", +"4ed4831a": "all(bool[7])", +"4ed4d42a": "transferTokenAddress(address)", +"4ed577bb": "IssuedToken(string,string,uint256,uint256)", +"4ed600d1": "confirmVestingSchedule(uint256,uint256,uint256,uint256)", +"4ed767a1": "totalFinalised()", +"4ed7cb10": "XXXXXXXX10(address)", +"4ed8579e": "setGPSMaxEth(uint256)", +"4ed87713": "ADVISORS()", +"4edac8ac": "num_claimed()", +"4edba7bf": "adapterEnabled()", +"4edbca6e": "getCategory(uint256,uint256)", +"4edbe9f7": "MintCommandBonus()", +"4edc689d": "allowAddress(address,bool)", +"4edc8ccf": "registerEIP777Interface()", +"4edccd31": "replace_square(uint256,bool,uint256,address)", +"4edce4e1": "push(int256,bool)", +"4edd0d07": "setConsumeTokenAddress(address)", +"4edd74e8": "reservesBalance()", +"4eddbd8d": "getCurrentPrice(uint128,uint128,uint24,uint64)", +"4eddcf5b": "setReleaseBlockNumber(uint256,uint256)", +"4ede23c8": "addressNotNull(address)", +"4edefd31": "setExpireDelay(uint256)", +"4edefe83": "doBroadcast()", +"4ee0ab0d": "forceEnd()", +"4ee0b9a9": "DaoHubVerify()", +"4ee0cb8a": "CutieBit()", +"4ee0cd98": "setFundMintingAgent(address)", +"4ee0d066": "setTotalsContract(address)", +"4ee16aba": "contributeToPurse(uint256)", +"4ee1d045": "secPerBlock()", +"4ee29ec5": "getNumberOfAssertions(uint128)", +"4ee2a3df": "setTargetDiscountValue2(uint256)", +"4ee2cd7e": "balanceOfAt(address,uint256)", +"4ee3659d": "AGC()", +"4ee3ad07": "HareemCoin()", +"4ee3c579": "DurioToken(string,string,uint8,uint256)", +"4ee3dc91": "publicToken()", +"4ee4d731": "enableMETTransfers()", +"4ee4d8fa": "isGlobalConstraintRegistered(address,int256,address)", +"4ee51a27": "airdropTokens(address[])", +"4ee67d33": "Etheradium()", +"4ee7ca3a": "erc20FOBS(string,uint8,string)", +"4ee9eb70": "InformRebuyTo(uint256,address)", +"4eea636f": "GROWCHAIN(uint256,string,string)", +"4eea9a8d": "withdraw2(address)", +"4eec0185": "aomracoin()", +"4eec44b4": "beforeBalanceChanges(address)", +"4eeca076": "Counter()", +"4eecafdb": "ifEndGetting()", +"4eed8a45": "LogTokenAllocation(address,uint256,uint256)", +"4eed965e": "_createGame(string,address,uint256)", +"4eee121f": "setOrCacheTargetReporterGasCosts(uint256)", +"4eee424a": "removeClaim(bytes32)", +"4eee59b3": "guess(string)", +"4eee8c25": "tokenBuyCost()", +"4eee966f": "setTokenInformation(string,string)", +"4eeea29d": "transferPreSaleBalance(address,uint256)", +"4eeedef1": "BCALAttToken()", +"4eeee8ac": "updateFighterBattleStats(uint256,uint64,uint16,uint64,uint16,uint16)", +"4eef440c": "bonusLevel0PercentModifier()", +"4eef683d": "PALAIR()", +"4ef02cf3": "preicoEndDate()", +"4ef05de3": "evacuate()", +"4ef1a23a": "manualInsuranceResolution(bytes32,uint8,bytes32)", +"4ef20030": "_setTokenMeta(uint256,bytes)", +"4ef37628": "getChallengeNumber()", +"4ef39b75": "finalize(address)", +"4ef3f235": "changeMaintenanceTime(uint256,uint256)", +"4ef45cac": "Announcements()", +"4ef50711": "apply4Redeem(uint256)", +"4ef5710a": "WatchNumberOfPlayerInCurrentRound()", +"4ef65c3b": "setUint(uint256)", +"4ef6b8ce": "Certificate()", +"4ef8086a": "switchManagerAndRemoveOldOne()", +"4ef83a70": "withDrawEth(uint256)", +"4ef85140": "CAOsale(uint256,uint256,string,string)", +"4ef8885f": "getSocialAccountPw(bytes32,bytes32,bytes32)", +"4ef8ff33": "MIN_INVESTMENT()", +"4ef94e34": "setMilestones(uint32[],uint8[],uint32[])", +"4ef98616": "CelebsPartyGate()", +"4efa45a1": "addAddressSetting(string,address,address,address,string)", +"4efb023e": "totalModerators()", +"4efb04ff": "created_contracts(address)", +"4efb7296": "updatePlotData(uint256,string,string)", +"4efbb734": "PublisherRegistryReplaced(address,address)", +"4efbe933": "buyForHackerGold(uint256)", +"4efc067f": "getAuraValue(uint256)", +"4efcc69e": "ExMoneyToken(uint256,string,string,address)", +"4efd0848": "_refreshVoteForVoter(address)", +"4efd1551": "add(address,address,uint256,uint256)", +"4efd9e2c": "updateMinContribution(uint256)", +"4efdd4f9": "viewUnclaimedResearchDividends()", +"4efddcd9": "artWorkChangeByAdmin(uint256,string,uint256)", +"4efeb2cf": "crowdDistribution()", +"4eff13dc": "OFFER_SIZE()", +"4eff86e7": "RBFToken(uint256,string,string)", +"4f0016d0": "endContract(uint256,uint256,uint8,bytes32,bytes32)", +"4f002522": "set_creature_builder(address)", +"4f011d9d": "getIntermediary(uint256)", +"4f013184": "investInTheSystem()", +"4f013ea6": "_THOUSAND()", +"4f01541e": "setReceiverAddress(address,address)", +"4f01d77e": "manual_lottery(bytes32)", +"4f02c420": "minted()", +"4f03c340": "proposeTx(address)", +"4f046439": "updatePurchaseSize(uint256)", +"4f04a36e": "setDesignatedReportPayoutHash(bytes32)", +"4f04af35": "CORReserveAllocation()", +"4f052648": "XaurumDataContract()", +"4f052b82": "UNLOCK_OUTINGRESERVE()", +"4f057506": "Limit()", +"4f059a43": "getClaimAmountForBlock()", +"4f062c5a": "getTier(uint256)", +"4f065672": "Start(string,bytes32)", +"4f0693a1": "BONUS_LATCH()", +"4f069517": "removePublicSalesSpecialUser(address)", +"4f07307b": "setLoanCreator(address)", +"4f073130": "takeOrder(bool,uint256,uint256)", +"4f07a663": "close(address,uint32,uint192,bytes,bytes)", +"4f07b5f0": "startSale(uint256,uint256,uint256,uint256,uint256,address)", +"4f07cc4f": "ETH_MIN_LIMIT()", +"4f082843": "enableChain(uint256)", +"4f084c0c": "payLast(uint256)", +"4f089298": "Etch(bytes32)", +"4f089898": "updateBlackListTrader(address,bool)", +"4f090ab4": "burnPrimordialToken(uint256)", +"4f0913ef": "MANHATTANPROXY6THST()", +"4f092510": "allowIgnoreTokenFallback()", +"4f09cfc5": "changeDiviRate(uint256)", +"4f09eba7": "proxyApprove(address,uint256,bytes32)", +"4f0a195e": "totalBasicIncome()", +"4f0a746f": "blacklistAddress(address,address)", +"4f0a97b9": "test_basicThrow()", +"4f0b0deb": "gameCreate()", +"4f0b584e": "getCCH_edit_18()", +"4f0b8374": "addToPrivilegedList(address)", +"4f0b9a2b": "KarTokenERC20(uint256,string,string)", +"4f0c563f": "depositBonus()", +"4f0ca055": "getMiniPoolEdit_5()", +"4f0cae88": "balanceThis(address)", +"4f0cc59d": "swapID(address,bytes32,uint256)", +"4f0cd27b": "getCount(address)", +"4f0cdd29": "getAddressByUserName(string)", +"4f0cf7e1": "fillTradesInfo(bytes32,uint256,uint256[])", +"4f0d8533": "addNewStreetType(string)", +"4f0ddd27": "getTemplate(string,string)", +"4f0e3333": "wedaddress()", +"4f0e3dad": "USD_GOAL()", +"4f0e760a": "_takeOwnershipOfTokenFrom(uint256,address)", +"4f0e8656": "showAdmin()", +"4f0eaf96": "oraclizeCallbackGas()", +"4f0f4aa9": "getNode(uint256)", +"4f0f539e": "getActiveMessage()", +"4f0f97ab": "TokenForSale()", +"4f1069ad": "serchIndexByAddress(address)", +"4f10a0bd": "_createAvatar(string,address,uint256)", +"4f10acc1": "updateGoldFeeData(uint256)", +"4f1157aa": "EtheriumWall(string)", +"4f118ad7": "GenericToken(string,uint8,string,uint256)", +"4f11ca65": "distributeTeamTokens()", +"4f11e07d": "getProof(address,uint8,bytes32)", +"4f1243d7": "pepsToken()", +"4f139314": "compensateLatestMonarch(uint256)", +"4f13e130": "fightAsuriMonster()", +"4f13fc0a": "setCompte_30(string)", +"4f150787": "batchFillOrKillOrders(address[5][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[])", +"4f161245": "getUIntValue(string)", +"4f162f8f": "icoEndTimestampStage4()", +"4f18d6fb": "BITAD()", +"4f190ed2": "changeDekzAddress(address)", +"4f192fa3": "MajestyAssetsJunction()", +"4f197ee7": "transferPackageOwner(string,address)", +"4f19e977": "INVALID_ORDER_SIGNATURE(bytes32)", +"4f1a5b86": "tokenReserved1()", +"4f1a7678": "getInsuranceDataByID(uint64)", +"4f1a892b": "setSectionForSale(uint256,uint256)", +"4f1ae61a": "releaseFeesAndBountyJM(address,uint256)", +"4f1afb63": "ownerforce()", +"4f1b2d4f": "toBool()", +"4f1bbc4d": "SuccessAuctionEvent(address,address,uint256,uint256)", +"4f1c3417": "getSpawnProxy(uint32,int256)", +"4f1c3b66": "setAccountData(address,uint8,bytes32)", +"4f1c8d0f": "milkBalanceOf(address)", +"4f1d38c0": "activeCrowdsalePhase3(uint256)", +"4f1d76ef": "buyabletoken()", +"4f1e0d0b": "getGoldInfoCustodian(address)", +"4f1e4334": "setMinBalanceForContractCreation(uint256)", +"4f1ea770": "bc(uint256,address)", +"4f1eb4b2": "proposalInProgress()", +"4f1ef286": "upgradeToAndCall(address,bytes)", +"4f1f421b": "SuMain()", +"4f1f99aa": "changeOzreal(address)", +"4f1fa7ef": "streamityContractAddress()", +"4f20f35a": "payExpenses(address,uint256)", +"4f219ceb": "getPlayRate(uint256,uint256)", +"4f223fe3": "StatefulFactory(string,string,string)", +"4f224baa": "setMetaBaseUrl(string)", +"4f2253d4": "addStudent(string,string,string,bytes32)", +"4f22bcf8": "allocationAddressList(uint256)", +"4f232f77": "transferFromRoot(address,address,uint256)", +"4f238029": "getSaleAuctionAddress()", +"4f23cce0": "ownerBetsCount(address)", +"4f23e50a": "defineReward(string,address,uint256,uint256)", +"4f24186a": "newProposal(string)", +"4f242cde": "startICO(uint256,address)", +"4f245ef7": "auctionStart()", +"4f248409": "endICO()", +"4f24e471": "numRewardsAvailableSetForChildAddress(address)", +"4f255b80": "getCharacterIndex(uint32)", +"4f256693": "addFile(bytes32,bytes32)", +"4f2578ba": "getVestedFounderTokens()", +"4f25a319": "PUBLICSALE_STARTTIMESTAMP()", +"4f25d6dd": "solveTime()", +"4f25ec6e": "_transferFee(address,uint256,address)", +"4f25eced": "distributeAmount()", +"4f26ef80": "buyAd(uint256,string,string)", +"4f271740": "UNFREEZE_DATE()", +"4f27869e": "defaultExit(uint256,bytes,bytes32,bytes,bytes,bytes32,bytes,bytes)", +"4f27ce68": "setSlogan(uint64,string)", +"4f27de64": "ByteExtractor()", +"4f28216a": "lowContributionAward(address)", +"4f284594": "info_TotalSupply()", +"4f28af6a": "handleBet(uint256)", +"4f28c443": "AIRDROP_TOKENS_PERCENT()", +"4f297b2b": "TokensGiven(address,uint256)", +"4f2989af": "indexExists(bytes32)", +"4f2996ab": "getBalanceByEscrowId(uint256)", +"4f2af869": "lastCalculatedToken()", +"4f2b0e41": "preSaleFund()", +"4f2be91f": "add()", +"4f2c9196": "getUsedBySoftwareLength()", +"4f2cc469": "transferZeroTokensTest(address)", +"4f2cd9cc": "auditConfirm()", +"4f2d7ab5": "contributionMinimum()", +"4f2eebc3": "PreSaleStartTime()", +"4f318dd8": "confirmVestingSchedule(uint256,uint256,uint256,uint256,uint256)", +"4f31cc51": "frozenTokenTransfer(address,uint256,uint8)", +"4f31e3ec": "minRoundSize()", +"4f32c65b": "emitFuture(bytes32,uint256,uint256,uint256)", +"4f32de0a": "request_payout_holder()", +"4f33428a": "setConsolationRewardsRequiredFaith(uint256)", +"4f33a013": "artHash()", +"4f346a7d": "emit(address,uint256,uint256)", +"4f348b46": "getTokenAmountOnAdd(uint256)", +"4f3655a8": "verifyBet(uint256,uint256)", +"4f36fbdc": "setMinMaxPriceInWei(uint256,uint256)", +"4f36fec8": "hardCapSale()", +"4f3741b5": "RateChanged(address,uint256,uint256,uint256)", +"4f37edfd": "burnAndRetrieve(uint256)", +"4f383934": "setMyTokenList(address[])", +"4f39ca59": "drop(bytes32)", +"4f3b1fb6": "unlock(string,address,bytes32,string)", +"4f3b8938": "mythexTokenAddress()", +"4f3bb920": "lockDownPeriod()", +"4f3c1542": "getMarginRatio()", +"4f3d057a": "push(string)", +"4f3d1416": "SetOriginator(string,string,string,string,string,string,string,string,string,address,string)", +"4f3d1c27": "setLpMaxVolume(uint256)", +"4f3d3003": "participantRoundValue(address,address,uint256)", +"4f3d520c": "getClearance(address)", +"4f3ded8a": "getFinalPaymentAmount()", +"4f3df0a8": "getRemainingTimeOf(uint256)", +"4f3f2cbc": "changeFeeModifiers(address)", +"4f3f4211": "awardDailyLottery(address,uint256)", +"4f3f5746": "participatingIn(address)", +"4f3fc162": "removeOriginByIndex(uint256)", +"4f3fd173": "get10Animals(uint16)", +"4f3fed94": "tokenIncrease()", +"4f4027d0": "SHAREHOLDERS_SHARE()", +"4f4200e5": "setAddressOfERC20Token(address,address)", +"4f424da3": "Bounties_Wallet()", +"4f438a12": "provideTransactionFeedback(uint256,uint8,bytes32)", +"4f438ddb": "changePercent(uint256,uint8)", +"4f44728d": "ownerChangeOwner(address)", +"4f4522b0": "getIntelligenceValue(uint256)", +"4f452b9a": "isStormBirdContract()", +"4f4548f9": "registerAudit(bytes32,bytes,bool)", +"4f45779f": "mintTokensWithinTime(address,uint256)", +"4f45c308": "DocumentSigned(uint256,address)", +"4f466ce6": "TOTAL_T8EXTOKEN_SUPPLY()", +"4f4821e1": "createGiftTemplate(uint256,uint256,string,string)", +"4f48e46d": "get_all_payment(uint256)", +"4f494cad": "createAuction(uint256,uint128,uint128)", +"4f495513": "privateSaleTokens(address,uint256)", +"4f4a69c8": "TestTokkSale()", +"4f4a6a66": "GovernanceDelOwner(address,address)", +"4f4b30ba": "dropManualState()", +"4f4b890a": "getCET6ById(uint32)", +"4f4cd650": "getAllTellers()", +"4f4d022b": "upgradeQualificationByTokens()", +"4f4d4728": "offeringEnded()", +"4f4df442": "approve(address,uint256,uint256,uint256)", +"4f4e1b74": "founderSwitchRequest(bytes32,bytes32)", +"4f4e47f1": "stopAirdrop()", +"4f4ec991": "PubToken(uint256)", +"4f4ef121": "firstBonusSalesEnds()", +"4f4f23ef": "SundayFundayToken()", +"4f4fa5a6": "removeReferral(address)", +"4f501f27": "changeOuts(address,address,address)", +"4f504d72": "getBalanceInPlay()", +"4f50ef53": "allBids()", +"4f511102": "setDeveloper(address,address)", +"4f51bf46": "getBidIdList()", +"4f52b2bc": "findLockupIfCTD(address)", +"4f52ccfa": "beneficiary1()", +"4f53126a": "pauseGame(bool)", +"4f538ae1": "rain(address[],uint256)", +"4f53e83e": "smartProperty(uint256,string,uint8,string,address,uint256,uint256,uint256)", +"4f54f4d8": "getMatchDetails(bytes32)", +"4f5539c0": "SetPrice(uint256)", +"4f556b23": "onceoutTimePer()", +"4f558e79": "exists(uint256)", +"4f55f292": "convertIntoHtlc(bytes32,address,uint256,uint256,uint256,bytes32)", +"4f573cb2": "withdrawRevenue()", +"4f57641c": "getHorse(uint256)", +"4f58704c": "ARI()", +"4f58d5c9": "getTokenUSDRate()", +"4f5963fb": "calculateYourValueEven(uint256)", +"4f5a4eb9": "setAssetOwner(uint256,address)", +"4f5af739": "getBirthTime(uint256)", +"4f5b3318": "dateEndIco()", +"4f5b9f23": "power2(uint256,uint256,uint32,uint32)", +"4f5ba601": "airdropOn()", +"4f5c6e0a": "bonusOne(uint256)", +"4f5d06c2": "getPurchasePrice(uint256,uint256)", +"4f5d5295": "chairBalance()", +"4f5e6a8d": "whitelistedTransfer(address)", +"4f5f560a": "founderOf(uint256)", +"4f5fca97": "LimitEther()", +"4f5fcb34": "authorize(string)", +"4f6065e0": "get_presale_arbits_total(address)", +"4f60ae2e": "DividendReceived(address,uint256)", +"4f60f334": "multiAccessAddOwner(address)", +"4f610e74": "getDeclaration()", +"4f617b81": "unsetSectionForSale(uint256)", +"4f61db15": "VEGAS()", +"4f61ff8b": "kyberNetworkContract()", +"4f6247f8": "setThirdAddressBalance(address)", +"4f645993": "lastMiningBlock()", +"4f64808d": "createCustody(address)", +"4f64aa09": "advisorsLock()", +"4f64b2be": "tokens(uint256)", +"4f653f09": "_scheduleTournament()", +"4f655a61": "setMinimum(uint256,bool)", +"4f65cc3c": "ethToTokens(uint256,bool)", +"4f66a8ec": "getVotingData(uint256)", +"4f6716d3": "whitelistAddressArray(address[])", +"4f674164": "addBookSigner(bytes16,address)", +"4f67498e": "updateUSeqIndex()", +"4f6754d7": "tenEndTime()", +"4f67bd9e": "numberFor(uint256)", +"4f67fe22": "LOG_OwnerAddressChanged(address,address)", +"4f69dd3d": "triggerWithdraw(address)", +"4f6a441c": "getRandom8(uint8,uint8)", +"4f6a461a": "CatalogPlayers()", +"4f6acaa1": "getLedgerCount(string)", +"4f6adf48": "setPayOuts(uint256,string)", +"4f6b1a70": "vuePayETHDestination()", +"4f6b472d": "tokenSupplies()", +"4f6c3372": "CrowdSale_Halt()", +"4f6c63ea": "TeamRegistered(string,address,string,bool)", +"4f6c87fb": "STARTToken()", +"4f6cb43f": "advisers()", +"4f6ccce7": "tokenByIndex(uint256)", +"4f6d04e7": "createSeedCollectible(uint8,uint8,uint256,address,uint256,uint256,uint256)", +"4f6d150d": "LuvCoin(uint256)", +"4f6d20a9": "getRewardForAddress(address,address)", +"4f6d3aed": "refundGas()", +"4f6d97ed": "MakeTransaction(address,uint256,uint256,string,string,uint8)", +"4f6d9e16": "_settleAndRestart()", +"4f6dcf74": "PoS()", +"4f6de652": "_getDepositedOrderDetails(uint256,address)", +"4f6de831": "testComplexCombination()", +"4f6fcc46": "getAirdropList()", +"4f7035b4": "DeleteAllRequests()", +"4f7132c0": "TokenDemo(uint256,string,uint8,string)", +"4f71473e": "withdrawAll(address,address[])", +"4f71ef81": "parse(bytes32)", +"4f72e1c3": "buyChamp(uint256)", +"4f731087": "checkTokenBalance()", +"4f734965": "setBBDPrice(uint256)", +"4f73928a": "setComment(bytes3,string)", +"4f739ff0": "addHouseStake()", +"4f73b7fa": "EthernityFinancialOracle()", +"4f73b8e6": "STAKE_BONUS_MIN_THRESHOLD()", +"4f73f1f8": "withdrawToAdress(address,uint256)", +"4f73f71d": "getOwlmasterReq()", +"4f7474cb": "closeAnnouncement(uint256)", +"4f74acfe": "buyEggs()", +"4f74d4f6": "ftechiz()", +"4f755fe7": "financialAccount()", +"4f75af3a": "tokensSuppliedFromReferral()", +"4f75c464": "startExit(bytes32[],uint256)", +"4f75e930": "UNLOCKINTERVAL()", +"4f7666a9": "VisionG8()", +"4f76a077": "addInvestorToWhiteList(address)", +"4f76c87c": "createSportEvent(string,uint8,uint256)", +"4f76cb02": "testGetBitFailIndexOOB()", +"4f772420": "changeFundContract(address)", +"4f779753": "DimaCoin()", +"4f77feec": "getPositionInterestRate(bytes32)", +"4f79409f": "LogBuy(address,uint256)", +"4f7ac7ab": "toteLiquidatorWallet()", +"4f7aede9": "add(uint8,address,uint256)", +"4f7baec0": "test_mint(int256)", +"4f7c6552": "calcDividends(address)", +"4f7cd683": "setReportRegistrationFee(uint256)", +"4f7d4951": "addVIP(address)", +"4f7d5de9": "setTimeRC(uint256,uint256)", +"4f7d87ac": "PoiseToken()", +"4f7dad6a": "buyToken(uint256,string,string)", +"4f7e7086": "iconiqToken()", +"4f7eb571": "getHowMuchUntilHardCap_(uint256)", +"4f7fc13f": "CLIENT_TIME_TO_DECIDE()", +"4f801270": "releasableBalanceOf(address)", +"4f802f8a": "unagreeAmendment()", +"4f803516": "getOrCreatePreviousPreviousFeeWindow()", +"4f8115a2": "tokensAddress(uint256)", +"4f817a2a": "tInstance()", +"4f81b930": "_sendFunds(address,uint256)", +"4f829ee8": "set2(uint256,uint256)", +"4f82ff41": "isCertified(uint256)", +"4f83fe64": "timeLocked(address)", +"4f840761": "demandTrial(uint256)", +"4f840c2b": "setMigrateToAddress(address)", +"4f8411e5": "_approvedFor(address,uint256)", +"4f851d73": "BineuroToken()", +"4f85769a": "closingTimePeriodOne()", +"4f8632ba": "user()", +"4f868b94": "etherSince20()", +"4f86bde2": "BuyFromFollower(address)", +"4f879ff0": "StackLottery()", +"4f883783": "CheckProofOfOwnership(bytes32)", +"4f88cc3c": "returnAllPollStakes(bytes32)", +"4f895031": "finalizeSale(uint256,uint256,uint128)", +"4f896d4f": "resolve(uint256)", +"4f8b9e64": "getBuyersList()", +"4f8c2a8a": "block02w()", +"4f8d40e1": "closeTournament(bytes32)", +"4f8da1fe": "RewardWallet(address,address,address,uint256)", +"4f8dd40a": "getOpinion(uint256)", +"4f8e2fdf": "LinkToken()", +"4f8e624e": "Greeter(string)", +"4f8fb544": "erc223Received(address,uint256,address,uint256)", +"4f8fc8ef": "setNonceForPublicKeyX(uint256,uint256)", +"4f8fe6a4": "THREE_YEAR_KEEPING()", +"4f8ffd1f": "set_contrib_arbits_min(uint256)", +"4f9000a0": "nextPrizePoolPercent()", +"4f932d44": "_generateIdentity(uint256,uint256,uint256,uint256)", +"4f935945": "capReached()", +"4f93995d": "saleNotEnd()", +"4f93b9e8": "setCommunityLock(address)", +"4f945a8a": "transferOwnCoins(address,uint256)", +"4f9559b1": "cancelOrdersUpTo(uint256)", +"4f958146": "LongLegs()", +"4f95a04b": "ethTransfer(address,uint256)", +"4f95ddec": "shopStorePrice()", +"4f95e960": "getTotalDropsOf(address)", +"4f961a6b": "RATE_TIER3()", +"4f962b72": "setPriceRate(uint256,uint256)", +"4f9660ed": "sendToTeam()", +"4f968868": "PauseTokenContract()", +"4f96ab8e": "retrieveUportInfo()", +"4f96baf1": "createNewAccount(address)", +"4f96bc00": "records(bytes32,uint16,bytes32,uint16)", +"4f96cddd": "calculatePreBonus(uint256)", +"4f96decf": "migratePlayerData1(uint256,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"4f96e039": "waitingOracles()", +"4f96f446": "tier1LOT()", +"4f96fba7": "setAuditAssignBlockNumber(uint256,uint256)", +"4f97f97f": "lastCrowdsale()", +"4f9899c3": "PythonCoin()", +"4f990ef0": "card2PowerConverterSingle(uint256)", +"4f995d08": "getPeople()", +"4f996a07": "callerDel(address,address)", +"4f99a96e": "getBorrowingItemByObjId(uint64)", +"4f99b7c5": "currentDate()", +"4f99b82d": "setBurntWalletAddress(address,address)", +"4f9b7bc8": "totalTokensSale()", +"4f9bf601": "totalTxFeePercent()", +"4f9bfdac": "OVISBOOKED_BONUSTOKENS()", +"4f9c5253": "Store(string)", +"4f9c5bf3": "airdrop_percent()", +"4f9d482a": "HALF_TIME()", +"4f9d719e": "testEvent()", +"4f9da09f": "getAddressByIdSorteo(int256)", +"4f9de158": "_sendTokens(address)", +"4f9e01c3": "OCCT()", +"4f9ea1c3": "flightDone(uint32)", +"4f9ebe09": "getDonationPrice()", +"4fa037c4": "setTokenMintFeeProp(address,address,uint256)", +"4fa07325": "adddraw(uint256)", +"4fa0a4b7": "_getCanvas(uint32)", +"4fa10cfc": "getdata()", +"4fa11dd2": "setAirdorpList(address[],bool)", +"4fa20a52": "isDelayed()", +"4fa232fe": "getIcoDeflator()", +"4fa2cb50": "solved(string,string)", +"4fa3d029": "setSTFactory(address)", +"4fa3eeff": "withdraw3()", +"4fa406ee": "BeforeChipCost(uint32)", +"4fa43991": "getArtistTrack(bytes32,address)", +"4fa48a88": "isSameDay(uint256,uint256)", +"4fa4a531": "getbackTB(uint256)", +"4fa4d01a": "_averageSalePrice(uint256,uint256)", +"4fa519fa": "setValue()", +"4fa65d58": "WRLToken()", +"4fa679d8": "forward(uint256)", +"4fa6a6d5": "crowdSaleStartTimestamp()", +"4fa6caf6": "getSigner(bytes32,uint256)", +"4fa6cde4": "requestEthUsd(uint256)", +"4fa7e353": "pledgeFees(uint256)", +"4fa87fd3": "frozenFunds(address,uint256)", +"4fa88720": "setBypassStatus(address,bool)", +"4fa972e1": "maxSupplyForEra()", +"4fa99402": "spinnerCountsByType(uint256)", +"4fa99dd0": "Matching_Ethers()", +"4fa9b5d5": "seed_base_token()", +"4fa9e4dc": "getArticlesOwn()", +"4faa2d54": "getTimeElapsed()", +"4faa8a26": "depositEtherFor(address)", +"4fab2035": "newSchellingRound(uint256,uint256)", +"4fab2ca4": "testGetFrontend()", +"4fac7e41": "getOwnedTokenIds(address)", +"4fac9c65": "bonussale_WeiRaised()", +"4faca8f4": "sendTokenTeamAdvisor(address,address)", +"4fad404a": "confirmProposal(string,uint256)", +"4fad5c8a": "depositAgent(uint256,uint256,string,string)", +"4fad96dd": "DST_ICO()", +"4fae3254": "setMaxAuditDuration(uint256)", +"4faea4d6": "FrankTestToken1()", +"4faed396": "checkVotingForSendWeiFromExchange()", +"4faf9420": "airdropFor(address)", +"4fafee40": "lottoPrice()", +"4fb057ad": "ContractInstantiation(address,address)", +"4fb0a3cd": "claimTeamReserve()", +"4fb0d95e": "getLocalBountyBalance(uint16)", +"4fb19db5": "dollarCost()", +"4fb2e45d": "transferOwner(address)", +"4fb30d8b": "txs()", +"4fb31a6a": "replaceProto(uint16,uint8,uint8,uint8,uint8,uint8,uint8)", +"4fb320b2": "setClaimRate(uint256)", +"4fb34523": "deployStepFour()", +"4fb3d3b1": "getUserHistory(address)", +"4fb3fef7": "totalExecutedPerDay(uint256)", +"4fb46d5c": "getRoundStatuses(uint16)", +"4fb4bcec": "step5()", +"4fb4e833": "entryStorage(bytes32)", +"4fb4f5a3": "ETHMCoin()", +"4fb55858": "setTargetDiscountValue4(uint256)", +"4fb67111": "utfStringLength(bytes4)", +"4fb764c9": "orders()", +"4fb7f1d7": "getPastWinnerAddresses()", +"4fb8843c": "getAllBonus()", +"4fba68c5": "pWhitelist(address)", +"4fbc7e11": "enableTokenWithdrawals(address,bool)", +"4fbcd6d5": "DepositFunds()", +"4fbd051d": "verifyCertification(address,uint256)", +"4fbda01f": "LogPenaltyDisbursed(address,uint256,address,address)", +"4fbe30d4": "changeTokenRate(uint256)", +"4fbea8ea": "approveKyber(address[])", +"4fbf6e9f": "getFish(uint32)", +"4fbf6fbb": "getMultiRequestLastRequestId(uint256)", +"4fc09275": "tokenOfCreatorByIndex(address,uint256)", +"4fc0ee17": "setCreditMCCurator(address)", +"4fc28f68": "getUndistributedBalanceOf(address,uint256)", +"4fc2d3be": "setBaseExchangeRate(uint256)", +"4fc3f41a": "setCooldown(uint256)", +"4fc4b5a0": "highEtherBonusValue()", +"4fc573c7": "addrDevelopment()", +"4fc59e6b": "set_Rate(uint256)", +"4fc5a549": "StartAuction(string,uint256)", +"4fc63e02": "ExToke(address,address,address,uint256,uint256,uint256)", +"4fc78cf1": "add_reward()", +"4fc7a47d": "extra_time_bought()", +"4fc84791": "senderAddress()", +"4fc91633": "setNotLessThan(uint256)", +"4fc9584a": "messageSpanStep()", +"4fc9c91a": "identityOf(bytes32)", +"4fca3159": "rawBuy(bytes32)", +"4fca329a": "drawBookLotto()", +"4fcaadae": "_createDivCard(string,address,uint256,uint256)", +"4fcb2968": "kingSpirit()", +"4fcb9e2f": "getLastPayoutDate()", +"4fcc30d9": "AuctionSuccessful(uint256,uint256,address)", +"4fcc9e07": "getDynamicArraySize()", +"4fced032": "OneKeyToken(uint256,string,string)", +"4fcf1f39": "revealWinner(string)", +"4fcf8210": "eraseRecord(bytes32)", +"4fd0fcb6": "partnerAmountLimit(address)", +"4fd1519c": "getValidDurationBlocksData()", +"4fd23dd4": "transferMulti(address,address,address,address,address,address,address,address,address,address,uint256)", +"4fd2ee52": "getTargetContactPubKey(bytes32,address)", +"4fd394ba": "getMax(uint128[])", +"4fd3d125": "onlyAdminsCanDoThis()", +"4fd42e17": "_setLiquidationIncentive(uint256)", +"4fd4dbaa": "_emitError(bytes32)", +"4fd61333": "DataChanged(bytes32,address,string,string)", +"4fd6194d": "setup(string,address[])", +"4fd64591": "tokenClient()", +"4fd6b325": "test_5_generateSecondAccountBalance_increaseBlocksBy1000()", +"4fd6e8ac": "andTheWinnerIs()", +"4fd6ff6e": "CROSAIR_SHIP_PRICE()", +"4fd7718b": "firstStageDuration()", +"4fd798b1": "TsingDaToken()", +"4fd81926": "setMaxDividendDepth(uint256)", +"4fd839c6": "getRabbitDNK(uint32)", +"4fd8411c": "AddressChangeRequested(address,address)", +"4fd88a1c": "spendFunds(address,uint256,string)", +"4fd9c9ac": "ExposureClosed(bytes32,address,uint256,uint256)", +"4fdb7c47": "RtbRpay(address,uint256)", +"4fdb91ab": "TOKEN_AMOUNT_ICO_STAGE1_PRE_SALE1()", +"4fdbe2c3": "changeFoundationAddress(address,string,address)", +"4fdc1a70": "icoCore(uint256)", +"4fdc4295": "_offerCanvasForSaleInternal(uint32,uint256,address)", +"4fdc53f6": "setTokenOwner(address,uint256)", +"4fdc5f65": "LiverpoolvsManCity()", +"4fdcd18d": "setHistory(address,uint256,uint256,uint256,uint256,uint256,string,string)", +"4fdd228d": "ownerOfPosition(bytes32)", +"4fde7cd9": "tokenToFounder()", +"4fdf4c9a": "Icebox(uint256)", +"4fdf64ce": "totalBorrowingItem()", +"4fdf8a03": "VLTMultisig()", +"4fdfcd42": "removeBytes32s(bytes32[])", +"4fe01d38": "setTokenReward(uint256)", +"4fe06988": "toTimestamp(uint256,uint256,uint256)", +"4fe0bd1e": "fundsAvailable()", +"4fe0ff1a": "submitInitialMerkleState(bytes32,uint64,bytes32[],uint256[],uint256,uint256,bytes32,uint256[2],bytes32,bytes32,uint8)", +"4fe2e15a": "checkTicket(uint256,uint256)", +"4fe2f085": "INVESTORS_TOKENS_RESERVED()", +"4fe47cb4": "emitStoreAndPay()", +"4fe47f70": "setMaxAmount(uint256)", +"4fe4a909": "returnToken(address,address,uint256,uint256)", +"4fe50bc6": "baseTokenGetRate()", +"4fe51ee6": "ValkyrieNetwork()", +"4fe5c2b4": "Vidnix()", +"4fe5f587": "CCXToken()", +"4fe61b9e": "disableBonus()", +"4fe6adb4": "NewToken(string,string,string,address)", +"4fe71e95": "withdrawUserReward()", +"4fe72439": "DEVELOPER_SUPPLY()", +"4fe7940b": "show_Balance_available_for_Sale_in_ETH_equivalent()", +"4fe81ffd": "artistsArtworks()", +"4fe82444": "addEthContribution(address,address,uint256)", +"4fe85563": "RAGTOKEN()", +"4fe87fe0": "FundsWithdrawnEvent(address,address,uint256)", +"4fe8b1a8": "changesoldierreplenishrate(uint256)", +"4fe8b4c1": "deleteData(uint256)", +"4fe8d03f": "bountyTokensTransferred()", +"4fe917fe": "reduceallmoney(address[],uint256[])", +"4fe9cc63": "InitHostBalance(address,uint256)", +"4fea572e": "ERC20Token(string,string,uint8)", +"4febb4f9": "WorldCupTeam(address,string)", +"4febe793": "NewText(string,string,address,uint256)", +"4fecf22d": "delegateManagement(address)", +"4fecf9cf": "Helex()", +"4fed1c94": "isTokenForSale(uint256)", +"4fed6a10": "teamTimelock()", +"4fed9a60": "Bonus(uint256,uint256)", +"4fedebf6": "numOfTeam()", +"4fee13fc": "startAuction(uint256,uint256)", +"4fee2437": "tokensaleStartTime()", +"4fee5360": "transferLike(address,uint256)", +"4fee63da": "securitiesOf(address)", +"4feeb18a": "priceQuerySent()", +"4ff0b071": "SILENT_Token()", +"4ff13571": "x2()", +"4ff1ddec": "TransactionConfirmedAfterExpiry(uint256,uint256)", +"4ff2bcb7": "getStageBonus(uint256,uint256)", +"4ff30c5f": "nextMintPossibleDate()", +"4ff3a989": "BLOCK()", +"4ff44fda": "_holding()", +"4ff45d73": "unapproveDisbursement()", +"4ff4ab6c": "ticketsOwners(address,uint256)", +"4ff57e9f": "airdropAndBurn()", +"4ff62627": "convertCore(address,uint256,uint256)", +"4ff6aa46": "deactivateTeam()", +"4ff6e86e": "getProviderPublicKey(address)", +"4ff7ff32": "withdrawERC20Tokens(address)", +"4ff92d6f": "getAssignedSupply()", +"4ffb01ce": "RemoveEvidence(bytes32)", +"4ffb32d3": "BlackSnailE()", +"4ffb861e": "_addAuthorization(address,address)", +"4ffc9204": "centralBankAddress()", +"4ffcd9df": "exchangeRates()", +"4ffcfefe": "m_weiBalances(address)", +"4ffd23a7": "sell(uint32)", +"50003ca6": "calculate(address)", +"5000a443": "jingZhiManager()", +"50010427": "bet(address,uint256,uint256,uint256)", +"50013a53": "LICERIOToken()", +"5001780b": "maxFundingGoal()", +"5001f3b5": "base()", +"50020560": "Accessible()", +"5002b2b9": "FusoraToken()", +"50035eb8": "getInUse(bytes20)", +"5003c2cc": "setPriceProgression(uint16)", +"5003c81d": "ERC223StandardTokenFactory(address)", +"5003d58f": "returnTokenBalance(address[2],uint256[8],uint8,bytes32[2])", +"5003e4d1": "Token(uint256,string,uint8,string,address)", +"5003efca": "extendedTokenCap()", +"50048174": "addItemLendingList(address,uint256)", +"5004e7a6": "CoinFast()", +"50050769": "changeRegistrationFee(uint256)", +"50051c20": "CELToken()", +"50058508": "getPubkey(address,address)", +"5005ba47": "setDestroyEnabled(bool)", +"50060f34": "getBatch(address,uint8)", +"5006bf0b": "internalExecuteDelegatecall(address,uint256,bytes)", +"5006e60a": "ownershipToCreator()", +"5007364f": "getLeaderboard(uint16)", +"50077f00": "jsonCat(string,string,uint256)", +"5007e47e": "getIntrospectionRegistry()", +"5007ec95": "IbzCoin()", +"5007ff15": "GridcubePlatformToken()", +"500844dd": "setTotalStakingHistory()", +"5008b7dd": "buyProduct(address,address,uint256)", +"5008cfcc": "votePerETH()", +"5008f699": "setRollover(uint256)", +"5009432d": "MAX_PRIVATE_FUNDING_SUPPLY()", +"500b6b3e": "calculationTotalSupply()", +"500b9426": "accountLocked(address)", +"500c6755": "DepositAmount(uint256,uint16)", +"500c6f21": "setManagementFeeChargePercentage(uint256,uint256)", +"500d22db": "setData_14(string)", +"500e73a4": "SSChainToken()", +"500e9eaa": "finishZeroDistribution()", +"500ec41b": "setAirState(bool)", +"50107c77": "addThing(string,bytes32,string,bytes32)", +"501146b4": "_updateNextPeriodPoints(address,uint256)", +"50114925": "transferDelegated(address,address,uint256,uint256,uint256,uint256,bytes)", +"50116afb": "decreaseAssetsCertified(uint256)", +"5011e399": "replaceSigner(address,uint256,uint8,bytes32,bytes32)", +"5012416f": "processAndCheckParam(string,address,uint8[],bytes32[],bytes32[])", +"50125546": "cancelRequest(bytes32)", +"50127418": "Question(address,string,uint256,uint256,string)", +"5012adca": "packInfo(address,bytes)", +"5012b772": "call_addr(address)", +"5012eb67": "trFee()", +"50133d50": "MinimumViableToken(uint256)", +"5013bb79": "TheTokenB()", +"50140fe5": "distributeBountyTokens(address,uint256)", +"50148ed2": "initEpochBalance()", +"5014a18e": "node_parent(uint256)", +"501578ca": "EntryAdded(bytes32,uint256,uint256)", +"50159de6": "ownerRemoveCeo(address)", +"5016128e": "isLock(address)", +"5016b9b1": "buyFromBlackMarket(uint256,uint256)", +"5016d29f": "refundedAmount(address)", +"5017f1f1": "constructor_()", +"50180944": "NEST()", +"50188301": "withdrawable()", +"5018a0fd": "withdrawAddr(address)", +"50192ae6": "test_31_assertGasUsage50Boards()", +"501957b8": "getManifest(address,bytes32,bytes32)", +"50197646": "rId()", +"501a4d68": "changeNameSymbol(string,string)", +"501a7a74": "uint256Min(uint256,uint256)", +"501b0b18": "receiveLoanOwnership(address,bytes32)", +"501bae76": "setr2VaultAddr(address)", +"501bfb60": "transferStampsToOwner(uint256)", +"501c5205": "_updateLandData(uint256,uint256,string)", +"501e3a2c": "_icoPercent()", +"501e8428": "getPart(bytes,uint256)", +"501fdd5d": "setSpecID(bytes32)", +"5020dcf4": "convertToEach(uint256,string,uint256)", +"5021051e": "setInflation()", +"50213c9f": "EXPERTS_POOL_ADDR()", +"502146db": "modify_addr(address)", +"5021783a": "addPerformer(address,string,uint8,string)", +"5021e534": "_dividendsSum(uint256[])", +"5022238f": "AVAILABLE_IN_PRE_SALE()", +"50228201": "getCollector()", +"5022d232": "CelebrityBreederToken()", +"5022e940": "experty()", +"50234173": "addNotary(address,uint256,uint256,string)", +"5023d124": "TestFactory()", +"50240158": "rejectContribution(address)", +"50240a34": "onLotteryInsurance(address)", +"502414e4": "marketMaker(string)", +"50248cd1": "ownerYHT()", +"50259cd3": "privatePreICOFreeBonusPercent()", +"5025b9ae": "expire(uint256,uint256,uint8,bytes,bytes,bytes)", +"5028594a": "setBlockDotGasLimit(uint256)", +"502a86bf": "gameGiftUserDayTimes()", +"502aa3b5": "usersList(uint256)", +"502b31d2": "splitEther()", +"502b8bda": "synths(bytes4)", +"502be15e": "unregisterByList(address[],bool)", +"502c9bd5": "userAddresses(uint256)", +"502cc114": "KittyToken()", +"502d7599": "IssueTokens(address,uint256,uint256)", +"502dadb0": "disableWhitelist(address[])", +"502e3b46": "EffectAdded(uint256,uint8[])", +"502f2dee": "sendFromTeamWallet(address,uint256)", +"502fe251": "getUidLastUpdate(string)", +"5030c325": "signBuyer(uint256)", +"503129c3": "ISC()", +"50312c9e": "checkContractBalance()", +"503248fe": "minPriceForMiningUpgrade()", +"5032f33b": "TokenLocker(address,address)", +"50357beb": "buyCard(uint256,address)", +"5036258b": "disableAddress(address)", +"50364825": "InsertImage(string)", +"503667bd": "_burnFor(address,uint256)", +"503687bc": "getTokenReleasePercentage()", +"5036d610": "Presale()", +"50372085": "isTokenContract()", +"503765c6": "LOCKTokenCOINLock(address,uint256,uint256,uint256)", +"50379b5b": "IPFSHashStore(uint256)", +"5037ec62": "changeDelay(uint256)", +"5038c9c5": "getListingAtPosition(uint64)", +"50391932": "findContractVersionByAddress(address)", +"503919b1": "unblockTokens(address)", +"50392bcc": "CleanFoodCrypto()", +"50395188": "tan_lian()", +"5039c62c": "inviteHandler(bytes32)", +"503a0ef8": "requestLoans(address,uint256)", +"503a3609": "mainSaleSecondStartDate()", +"503adbf6": "changeableToken(uint16)", +"503b64c0": "setRequestProcessed(uint256,uint256)", +"503c449f": "decreasePregnantCounter()", +"503c849e": "cashOutRate()", +"503caa1b": "performPayout()", +"503caa53": "phase2TokenPriceInEth()", +"503de95b": "newCash()", +"503e11de": "getAssetIdCargoArray(uint32)", +"503e9d33": "changeWeTrustSigner(address)", +"503eb429": "destEthFoundation()", +"503ef9fe": "changeFeeAmt(uint8)", +"50400128": "RiskPrice(uint128)", +"5040307c": "amountOfOrderQueue()", +"50405fdf": "setMemberLevel(address,uint8)", +"50409041": "_computeSalesCut(uint256)", +"5040c6e7": "HardCap()", +"50411552": "challengeWinnerReward(uint256)", +"50416b93": "batchClaim(uint256,uint256)", +"5041742a": "bidOnEthSiringAuction(uint256,uint256,uint8,bytes)", +"50428f84": "insertLastPlys(uint256)", +"504291f0": "maxToSell()", +"5042ffbe": "contributeInIco()", +"504321e0": "toTeamEthContract()", +"504334c2": "setNameSymbol(string,string)", +"50449d9d": "whiteListPreSaleDuration()", +"5044b112": "getChecksumCount()", +"50473c82": "deathData_f15()", +"50479065": "cancelCreation()", +"5047b337": "changeName(bytes16)", +"5047f867": "setAirdropParams(bool,uint256)", +"5049b238": "potentialWinner()", +"5049f497": "nominate(address,address)", +"504ac982": "transfer(string,string)", +"504b0ae8": "LOG_ValueIsTooBig()", +"504b122f": "readMulti(bytes32,bytes32[])", +"504b91b5": "GeishaCoin()", +"504b97ae": "getcertifieddata(uint256)", +"504bcde7": "getAuctionTokenIDsOfOwner(address)", +"504c9582": "PARTNERS_SHARE()", +"504cceac": "purchaseTokens(uint256,address)", +"504d080b": "getActions()", +"504d27fd": "transferAmount()", +"504e6827": "setWhiteListInvestor(address)", +"504f1671": "getSize(address)", +"504f5e56": "floor(uint256)", +"504f6085": "serviceTransfer(address,uint256)", +"504fac70": "getGiftTemplateById(uint256)", +"504fbb19": "LifeChain(uint256,string,string)", +"50500934": "right28(uint256)", +"50500fac": "LaunchPartnersAddress()", +"50512420": "getPlayerDiscount(address)", +"505158bb": "getRecordsCount()", +"50515d5a": "resolveDispute(bytes16,bool)", +"50520b1f": "contribution()", +"5052587f": "Show_automated_Sell_price()", +"5052abad": "viewContribution(address)", +"50548d85": "LogMakeDeposit(address,uint256,string)", +"5054e8bf": "collectDevFees()", +"5055225f": "preSaleStartDate()", +"5055557a": "perform_selfdestruct(uint256)", +"50558dd5": "setPropheth(address)", +"5055d7c3": "withdrawnMelon()", +"50560a1a": "_oraclizeQueueWinner(bool)", +"5056a36a": "AuthorizationSet(address,bool)", +"5056b309": "getSetting()", +"50584827": "getInvestorBalances(address)", +"5058c460": "safeWithdraw(address,uint256)", +"5058f013": "periodWeek()", +"505903ba": "GetEthBalance()", +"50591478": "getChainDrawingsByChainID(bytes32)", +"5059d25a": "setContributor(address,bool)", +"5059fad1": "transferIssuer(uint256,address,address)", +"505a202b": "priceChangeName()", +"505a7bce": "pullEther(uint256,address)", +"505ba497": "processInvestment(address,uint256,address)", +"505c3c58": "MasAnu()", +"505c3d5e": "piecesOwned()", +"505d394d": "GetSeries2()", +"505da5c7": "_bonusToFighters(uint32,uint8,uint256)", +"505e71d0": "test_twoInvalidFalseEqLog()", +"505ed108": "createPetCardSeries(uint8,uint32)", +"505f2697": "rejectCertification()", +"505f5a8c": "freezeByValue(address,uint256)", +"505fb46c": "add(uint256,uint256,uint256)", +"505ff574": "register(address,uint256,bool)", +"506092f7": "getAmbientLightException(bytes32)", +"50609cea": "onTokenTransferCalled()", +"5061029d": "MINE()", +"50613afe": "getDropNotice()", +"5062ef16": "readOpentasks()", +"50635394": "claimBonus()", +"50635e2f": "CYPHERX()", +"50636a68": "ERC223Token(uint256)", +"50637dd2": "stageName()", +"5063f361": "addMembers(bytes32,address[])", +"50648403": "registerWithInviterID(uint256)", +"506535f3": "verify(address,bytes32,uint8,bytes32,bytes32)", +"50655d8c": "maker()", +"5065cbab": "geteth(address)", +"50669508": "DatasetHub()", +"50669a03": "unpauseToken()", +"5066a9ac": "setLPTargetPostion(uint256)", +"5066e2bd": "teamKeepingWithdraw(uint256)", +"5067f32d": "KALToken()", +"50685c81": "SwarmRedistribution()", +"50692d9a": "toContentID(address,string,string,address,bytes32)", +"50699e89": "requestBuywithFX(uint256)", +"5069a6a6": "calculateKebabSell(uint256)", +"506a0aaa": "reverseSplitTokensBeforeDistribution(uint256)", +"506a6a10": "tokenBonusForThird()", +"506aaede": "issueDividend()", +"506b56da": "centralBanker()", +"506bd3a6": "removeExchanger(address)", +"506bff11": "left7(uint256)", +"506cb188": "NewOrder(uint256,address,address,address,uint256,uint256,uint256,uint256)", +"506cf560": "blackil()", +"506d54c7": "getBigWinner()", +"506d9ebd": "getData_8()", +"506dc7e1": "getUsageDetails()", +"506e106c": "setToS(string)", +"506ec095": "periodEnd()", +"506ee1ef": "traderNonces(address)", +"50710ef5": "_finalRoundWinnersFight()", +"50713dc0": "transferOwnershipManualMinter(address)", +"5071fcf0": "recoverSouls(address[],uint256[],uint256[])", +"5072a21b": "_createPotato(uint256,uint256,uint256,uint256,address)", +"5073eda3": "setPOOL_edit_25(string)", +"5074449d": "isTradable()", +"50750497": "VestingTransfer(address,address,uint256,uint256)", +"50754fac": "totalNetworkCollateralisation()", +"5076d445": "AdminClaimAirdrop(address,uint256)", +"5077ac0e": "registerImage(uint256,bytes,uint256)", +"507843f8": "assemblyShamir(uint256,uint256,uint256,uint256)", +"50787341": "normalizedEarlyPurchases()", +"507959e1": "newBeneficiary(address)", +"507a83ea": "arand(address,uint256)", +"507a8e40": "AssetToken(uint256,string,uint8,string,address)", +"507afbec": "processBuyAmount(uint256)", +"507b3450": "getKNCRateRangeSignatures()", +"507bbc7e": "isRunUpStage()", +"507d17bb": "MultiplyContract(address,address,uint256,uint256,uint256,uint256)", +"507d5954": "stopCrowdsale()", +"507d8887": "setCompte_19(string)", +"507e7888": "subscribe(string)", +"507e97a9": "setBUA(bytes32,uint256,address)", +"507eeff9": "trade(address[2],address,bytes,bytes)", +"50807ecc": "getSellerfee()", +"50818fbb": "internalGetHowMuchUntilHardCap(uint256)", +"50833515": "RestartReceivingContributions()", +"508335e6": "maxRentPeriod()", +"508343d6": "initiateEscrow(uint64,uint256,uint256,address,address,address,address)", +"5083b29f": "changeBookingFee(uint256)", +"508493bc": "tokens(address,address)", +"50849c3b": "placeoffer(uint256,uint256)", +"5084b2a3": "MintAuthority(address)", +"5084da18": "fipsOwner(bytes20)", +"5085c9f1": "numTokensInCurrentCompactData()", +"50867236": "debug_token_balanceof_faucet()", +"50872d1e": "onTransferFrom(address,address,address,uint256)", +"50872e32": "EUROQUINNToken(uint256,string,string,uint256)", +"50875b6c": "remainingLockDate()", +"508762c1": "right10(uint256)", +"5087abc7": "joinOutBattle(string)", +"50894456": "manuallyMakeOraclizeCall(uint256,uint256,bool,bool,bool)", +"508a0a9e": "NitrToken()", +"508a8976": "saleSuspended()", +"508ab47a": "showPoolContract(uint256)", +"508b0955": "testNoTokensTwoCalls()", +"508bb866": "getMyBet(uint256)", +"508cde13": "getMappingID(string,address)", +"508d0f57": "getNumberOfPeriods(uint256,uint256)", +"508d60aa": "teamETHUnlock2()", +"508df5df": "numResponseOptions()", +"508e3718": "setValidKYC(bool)", +"508f352d": "heapSort(uint16[])", +"508f46a0": "getGameSettings()", +"50904081": "purchasesCount()", +"509065b8": "mintTokensForFirstStage()", +"50909851": "ownerEmit()", +"5091c49e": "bonusSeed()", +"5091e7c4": "selfdestroy()", +"5091f881": "updateArtistCommission(uint256,uint256)", +"50921b6c": "EGGS_TO_HATCH_1CROCS()", +"509239c0": "amountContributedBy(address)", +"50928ba4": "canCreateGames()", +"5092f97e": "Company()", +"50930ca5": "doFailingTransferFrom()", +"50933a0f": "Bitnusu()", +"5093cb38": "setEtherDelta(address)", +"5093dc7d": "setValue(int256)", +"50944a8f": "setMembership(address)", +"509484d5": "setStakeContract(address)", +"509515b5": "getWinnerAccount()", +"50963bc4": "returnTokensTo(address)", +"50965f57": "currentWulinMasterPrice()", +"509720a6": "putUint(bytes32,uint256)", +"50977faf": "fetchTokenBalance()", +"5097e51f": "Public()", +"509a13dd": "RoundId()", +"509a7e54": "getRoot(bytes32,uint64,bytes)", +"509bf2bf": "axe()", +"509c3fc8": "createTestNetContract(address,address,address,uint256,uint256,uint256)", +"509c5df6": "reservedFunds()", +"509c5eee": "ASGToken()", +"509c90b3": "callTokenFallback(address,address,uint256,bytes)", +"509cd360": "Board()", +"509d6d72": "mediumPrice()", +"509d8c72": "VALUE()", +"509f0fe4": "setupFundingTime(uint256,uint256,uint256)", +"509f6ff8": "AquaToken(uint256,string,string,uint8,uint8,address)", +"509f7cf2": "testingForFun(uint256[])", +"509f8633": "create_account()", +"50a09c7a": "refBonusPercent()", +"50a09d60": "SaleIsLive()", +"50a0f733": "final_shares_sold()", +"50a107cc": "setVotingPhase()", +"50a13702": "denyChangesMultitoken(uint256)", +"50a14ea4": "returnPreSaleTokens(address,uint256)", +"50a1676e": "createdAt(uint256)", +"50a1debd": "robAll()", +"50a22ee1": "BancorGasPriceLimit(uint256)", +"50a2f067": "getfromid(address)", +"50a3bd39": "enterPool()", +"50a49f5f": "getBurnDelegates()", +"50a58b3f": "exist(address,address[])", +"50a5c872": "host_reveal(uint256)", +"50a5ebd9": "updateSpaceshipStatus()", +"50a675fe": "QQBToken(address)", +"50a6887c": "UpgradedNodelist()", +"50a6b423": "settlementPayOut(bytes32,uint256)", +"50a7755e": "newDad()", +"50a82265": "EventEmergencyStop()", +"50a8246f": "testRIPEMD160()", +"50a85d36": "DeathNode()", +"50a8d2b9": "getNumSigsOwned(bytes32)", +"50a9b541": "bootyToken()", +"50a9cbd1": "partyCoincieded(address,uint256,address)", +"50a9e127": "backup()", +"50a9eddb": "testControlSetNotUpdatableNotOwner()", +"50ab6f7f": "getMsgs()", +"50ac9828": "FileData()", +"50ad2f76": "vendGuardian(uint256)", +"50ad7321": "GPSDecayingTokenEnvironment(uint256,uint256)", +"50adc70a": "winning_country_string()", +"50adcdb7": "fundToken()", +"50ae28ea": "StandardCertificate(string,string,string,string,uint256)", +"50ae85d8": "reservedAddr()", +"50aeddcf": "censorChatMessage(uint256)", +"50b0021c": "currentRandom()", +"50b04a4e": "getCountryById(uint8)", +"50b066b2": "changelp13(address)", +"50b149a9": "setPriceStep1(uint256)", +"50b1a697": "toReferrer(uint256)", +"50b1ab69": "PET(uint256,string,string)", +"50b1f058": "fetchPaidOrdersForPayer(address)", +"50b2ae66": "transferChips(address,address,uint256)", +"50b44712": "tickets(uint256)", +"50b48c5e": "autonomousConverter()", +"50b58c06": "JuggernautToken()", +"50b5bc93": "unlockFirstTokens()", +"50b62939": "getAddressBalance(address,address)", +"50b6ba0b": "getWtoken(uint8)", +"50b79722": "setSanLength(uint256,uint256)", +"50b7b7a2": "setRating(bytes32,uint256)", +"50b7e942": "acquireTokens(uint256,uint256,address,uint256)", +"50b82a48": "objectSack()", +"50b91881": "setKycWhitelist(address,address,bool)", +"50b926fd": "UnityToken()", +"50b93b3b": "sendBuzzCafe()", +"50b9963f": "_continueTokenPurchase(address,uint256)", +"50b9c428": "oraclizeGasLimit()", +"50baa622": "withdrawToken(uint256)", +"50bacea9": "icoPhaseAmount1()", +"50bb117a": "defrostDate(address)", +"50bb4e7f": "mintWithTokenURI(address,uint256,string)", +"50bc051e": "lockedForAsset(bytes32)", +"50bc373d": "regionAvailable(uint256,uint256)", +"50bc4ae6": "_joinToProvider(uint256,address)", +"50bc6bba": "createSaleAuction(uint40,uint128,uint128,uint40)", +"50bd1933": "UberDelta()", +"50bd5cb9": "logDisputeCrowdsourcerTokensTransferred(address,address,address,uint256)", +"50bda35a": "setCharge(bool)", +"50bda77e": "updateJobRate(bytes32,uint256)", +"50be7503": "giveToken(address,uint256,address,bool)", +"50beb835": "getDeploy(uint256,uint256)", +"50beca78": "isTrainer(address)", +"50bed043": "sendFunds(address,uint8,uint256)", +"50bfeadc": "initialTokens()", +"50c007c6": "verifyTx(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[5])", +"50c0f2b9": "licenseTermsRegistry()", +"50c0fbe4": "getBlockNumber(uint256)", +"50c15c93": "depositChecking(address,uint32)", +"50c2e4f6": "ADVISOR_SUPPLY()", +"50c34878": "priceOfAUnicornInFinney()", +"50c35227": "central_account()", +"50c38479": "resetCurrentTokenOfferingRaised()", +"50c3e676": "resolveErrorReport(uint256,bool)", +"50c40877": "Nai()", +"50c42921": "replicate()", +"50c4b64c": "_unpackAuraValue(uint256)", +"50c4ebc4": "finalTimestampOfBonusPeriod()", +"50c5c99a": "setScrapyard(address)", +"50c67734": "setPricingStrategy(address)", +"50c6784d": "ShareableMock(address[],uint256)", +"50c6a4e0": "_buyPixelBlock(uint256,uint256,uint256,uint256,bytes32)", +"50c6ef88": "setChampsName(uint256,string)", +"50c7ac75": "addint8(int8,int8)", +"50c8512b": "CollectibleNoLongerForSale(uint256,uint256)", +"50c88103": "setEruptionThreshold(uint256)", +"50c8dbd2": "totalBlocksMined()", +"50c90136": "fixedLog(uint256)", +"50c90af0": "unLockAddr()", +"50c946fe": "getNode(bytes32)", +"50ca6227": "getTokenInfoData()", +"50ca73c8": "aSetLaunch(uint256)", +"50cc5d4b": "totalWeiVolume()", +"50cca1e1": "rejectMail(uint256)", +"50ccf36b": "getWeiPriceOneUsd()", +"50cd4df2": "o()", +"50cd4f3f": "ScratchTickets(string,uint256,uint256,address)", +"50cdbb6b": "setEarlyParticipantWhitelist(address,uint256)", +"50ce761d": "NumberCreated(address)", +"50cee5a0": "addToWallet(address,uint256)", +"50cf20dd": "richtestff(uint256,string,uint8,string)", +"50cf569c": "getUserAttribution(bytes32,address)", +"50d00b95": "authorizeProcessor(address,address,string,string)", +"50d0b060": "createVestingForFounder(address)", +"50d12a72": "payReferrer(address,uint256)", +"50d15fbe": "skills(uint256)", +"50d17749": "BuyLimits(uint256,uint256)", +"50d279bd": "changeRewardMintingAmount(uint256,int256)", +"50d2bfab": "set_exchange_rate(uint256[])", +"50d491ab": "userGetPendingTxByAddress(address,address)", +"50d4a2b9": "crowdsaleGoalReached()", +"50d4bf15": "buy100ktickets()", +"50d50324": "stopSaleDepo()", +"50d5914a": "TOKENS_PER_ETHER_PRESALE()", +"50d6d893": "_rejectTransaction(uint256,address)", +"50d78f7d": "QueryFrozenCoins(address)", +"50d7bf09": "record(string,string,string,address,bool,string,string,string)", +"50d7d290": "withdraw_refund()", +"50d7da00": "GSH(uint256,string,string)", +"50d808d4": "StartTradable()", +"50d80fef": "addOffChainAddress(address,address)", +"50d8bcf3": "SMLToken(address)", +"50d925fb": "REBELCOIN()", +"50d9b932": "PatronOneWithdrawal()", +"50d9d472": "numberOfAuctions()", +"50da9f6d": "SellENS()", +"50dad350": "Hodling(bool)", +"50db7247": "maxCapPreSale()", +"50dc26ec": "TokenUser(address)", +"50dc43a1": "addGameMachine(address)", +"50dc4bfe": "addUserFeedback(address,uint256,address,string,string,string,string,string,string,uint8)", +"50dcce5a": "upPrice()", +"50ddd6f7": "addToEmployerAvgRating(address,address,uint8)", +"50de84c1": "CesiraeToken()", +"50deda1c": "addtoken(address,uint256,uint256)", +"50dede35": "marketDrugs()", +"50df10c3": "lockTill(address,uint256)", +"50df7eb4": "unsoldTokensAmount()", +"50df8f71": "isReady(uint256)", +"50e01e16": "Registered(address,bytes4,string)", +"50e036ff": "allowedContractsCount()", +"50e06b57": "Etherization()", +"50e08ddb": "devidendsOf(address)", +"50e14731": "BKEXComToken()", +"50e17308": "maxMineSize()", +"50e17975": "_badgeFreeze(uint256)", +"50e1b95a": "getShipProductClassByModel(uint16)", +"50e26c23": "getAssetBaseInfo()", +"50e27f2d": "TicTacToeLockedState(address,address,address,address,address)", +"50e28cb3": "SECOND_USER_CUT()", +"50e2ccad": "CoreTeamAndFoundersSupply()", +"50e343d0": "prWallet()", +"50e37961": "setWhitelisting(address,uint128)", +"50e38e63": "groupMemberInfo(uint32,address)", +"50e3b157": "sharesValue(uint256)", +"50e43c9c": "c(address,int256,int256)", +"50e4b069": "set0xExchangeWrapper(address)", +"50e513ac": "destroyUser()", +"50e59eb3": "isMinter()", +"50e706fb": "getProposalFunds(uint256)", +"50e72f61": "Break()", +"50e78690": "getHomeGasPrice(bytes)", +"50e7dde2": "setParetoToken(address)", +"50e81a3b": "setProviderCompleted(bool)", +"50e81e08": "_releaseToken(address)", +"50e84925": "saleEnd3()", +"50e8587e": "multiApprove(address[],uint256[])", +"50e862db": "mint(bytes32,string,uint256)", +"50e86e1e": "setOwnerValidateAddress(address)", +"50e878df": "updateOrderAmount(address,address,uint256,address,uint256,bool)", +"50e9f948": "initialFiatPerEthRate()", +"50ea1932": "lookupISO3116_1_alpha_2(bytes)", +"50ea1c95": "MyIdolCoinToken()", +"50ea53db": "transferIncorrectDisputeBondsToWinningReportingToken()", +"50ea9274": "TokenRefund(address,uint256)", +"50eb2d02": "BBNToken()", +"50eb7ec4": "SupercarToken()", +"50eba4eb": "voteSnapshotBalanceBatch(address[],uint256[])", +"50ec2a6a": "batchCancel(address[5][],uint256[6][],uint256[])", +"50ec5903": "blackListSwithcer(address)", +"50ec6b1b": "getNamelistLength()", +"50ed2a2c": "poke(uint128,uint32)", +"50ed6264": "lastStakings(address)", +"50edd8c2": "nestedFirstAnyToAny(uint256)", +"50ee6de2": "candyLand()", +"50eebaf7": "mininumPurchaseTokenQuantity()", +"50ef3bae": "getQuestionVote(string,uint256)", +"50efc7c0": "districtToBuildingsCount(uint256)", +"50f07cf9": "setReadingDelay(uint256)", +"50f0880e": "sendLimitTokensToCompany(uint256)", +"50f0f83d": "getTransferFromFromValue()", +"50f1179a": "setPriceOfAss(uint256,uint256)", +"50f1c695": "authorizedLoggers()", +"50f2fb7f": "getCalls()", +"50f3dd7a": "assembleUnicorn()", +"50f4556b": "WhiteRhino()", +"50f462a4": "validationFailed(address)", +"50f46eef": "calcToken(uint256)", +"50f49db1": "getSlideEndTime(uint256)", +"50f4f9f8": "addShare(address,uint256)", +"50f503c1": "isSspRegistered(address)", +"50f5ef78": "getWork(address,address,uint256)", +"50f71526": "necashToken()", +"50f7c204": "maxTokenSupply()", +"50f8fc97": "LogCertificationDocumentRemoved(address,bytes32)", +"50f91ee3": "withdrawTokensRemaining()", +"50f93381": "logDisputeCrowdsourcerContribution(address,address,address,address,uint256)", +"50f956db": "nextAmount()", +"50f96b5d": "minEthPerNotification()", +"50f9b39e": "getReward(address,uint256,uint256)", +"50fa5d13": "stage4BeginTime()", +"50fb5a92": "buyWithReferral(uint128)", +"50fcff5c": "extCheckHalfLife()", +"50fdb01a": "setNewWinner(address,uint256)", +"50fe533b": "getLevitatingBirds(bytes32,uint64)", +"50feacc5": "PriceManual()", +"50fed3b4": "buy(address,uint256,uint256,uint256,bool)", +"50fef2e4": "tokenAirdropLeft()", +"50ff0761": "R_N_D_WALLET()", +"50ff2015": "endAtBlock()", +"50ff722b": "getChannelsGuids()", +"50ffbe81": "checkBan(address)", +"51003cab": "minimumIcoRate()", +"510040cb": "releaseLocked()", +"5100602a": "preallocate(address,uint256)", +"5100beab": "luxuriumGold()", +"5100db6f": "SYCC()", +"51017702": "isOutcomeSet(bytes32)", +"5101880f": "CPXWallet()", +"510219cd": "defaultAuctionDuration()", +"51027320": "EUNOMIA()", +"5102ad69": "setImpactRegistry(address)", +"5102bc9d": "setTitle(uint256,string)", +"5102e238": "test_oneInvalidEqAddress()", +"5103a5a3": "certify(address,bytes32)", +"5104a3a7": "burnedTokensCount()", +"5104cb5c": "refundOnBehalf(address)", +"5105df3b": "buyTicketByEth(uint256,bytes32,bytes32,bytes32,bytes32)", +"5106b8fe": "transfer(address,address[],uint256)", +"510792c8": "hydroPartnerMap(uint256,address)", +"5107c0a8": "FBEE()", +"5107fde8": "lockedTeam()", +"510a3e2a": "round2Bonus()", +"510ae121": "Yangshuai(uint256,string,uint8,string)", +"510b1529": "issueTranche(uint256)", +"510b5158": "creator(uint256)", +"510bf040": "launchVesting()", +"510c27ad": "getOracleList()", +"510c58c9": "Gig9()", +"510c8243": "CategoryDeleted(uint256)", +"510ccb43": "getRewards(address[])", +"510de15a": "ICOSaleExtended(uint256)", +"510e23eb": "invalidEarlyPurchaseIndexes(uint256)", +"510e4235": "_createForecast(uint256,uint256,uint256)", +"510ea296": "_createDiamond(string,address,string,string,string,string)", +"510ec598": "computeCurrentReward(address,address)", +"510ef1ce": "changeQuarterSeason(int8)", +"510ef1de": "setTokenMetadata(uint256,string)", +"510f44cb": "TestFactoryUser()", +"510fbf8d": "setValue(address,string)", +"511075a9": "getIpfsForAssets(uint256[])", +"5110d31c": "TradeEthShop(address,uint256)", +"5111249e": "checkMultOverflow(uint256,uint256)", +"51114b24": "interSendWithOtherEvent(address,uint256)", +"51118f1d": "transferFromSystem(address,address,uint256)", +"5112f02c": "getCard()", +"51131017": "setUpdateGasCost(uint256)", +"511354a1": "phase2MaxTokenForSale()", +"5113d5f7": "BTCETC(uint256)", +"51142cc3": "secondStageCap()", +"5114a9aa": "TheBestICO()", +"5114cb52": "makePayment(uint256)", +"51172285": "TwoAfrica(uint256,string,string)", +"51175e01": "setNumRewardsAvailableForAddresses(uint256[],address[])", +"51180c63": "removeValue(bytes32)", +"51192814": "GenesisBuyPrice(address,address)", +"51193bad": "LUVTOKEN()", +"5119a342": "GetUserInfo()", +"511aae8b": "addFreelancerContract(address,address,uint256)", +"511acd53": "TOKEN_RATE_30_PERCENT_BONUS()", +"511b1df9": "addr(string)", +"511b445b": "nowperiod()", +"511bb41c": "rebateTwoFenmu_()", +"511bc0f6": "_addOwner(address)", +"511c5d66": "SetAddressForReturn(address)", +"511d2299": "processBNBContribution()", +"511e2613": "getoddAndEvenBets(uint256,uint256)", +"511e5639": "KamuToken()", +"511e84ce": "setIsAutoRestart(bool)", +"511eb8da": "confirmOrder(address,address,address,address,bytes32)", +"511fa487": "getMinSell(address)", +"5120429c": "TokenSold(uint256,uint256)", +"51206d81": "getRefWallet()", +"5120bb20": "transactionsOn()", +"5120f028": "sendAmount(uint256,address)", +"512202d7": "getOuvidoriaEndpoint(int256,address)", +"51223fdc": "LogClaim(uint256,address,uint256)", +"512267b0": "rewardScarcityFactor()", +"51228c4e": "addReferralProfit(address,address,uint256)", +"5122c6d1": "onSell(bytes32,uint256,address,uint256,address,uint256,address,address,uint256,uint256,uint256)", +"512392cc": "BITCOIMINIG()", +"51239fde": "multiDistribute(address[])", +"5123e1fa": "etch(address[])", +"51243676": "LogBookTicket(uint256,address,string)", +"5124ae95": "getNonces(address)", +"51252412": "crowdsaleTargetBRA()", +"51254729": "CynkciarzToken()", +"512570d6": "updateBrand(address,string,bool)", +"5125796a": "changeOraclizeProofType(bytes1)", +"51259770": "GetEthShop(address)", +"51274842": "logEvent(uint256,string,uint256,uint16,address,uint256,uint256)", +"5127a94a": "getRaisedAmount(string)", +"5127ad4c": "getTokens(address,uint256,uint256,uint256,uint256)", +"5127cab5": "rateFirstRound()", +"5128ab7b": "GetSaleInfo_Airdrop(uint8)", +"5129096c": "INGCL()", +"51290d06": "cofounderB()", +"51297cc6": "airDropTokenEnabled()", +"512a9c33": "startCrowdsale(string,string,uint8,uint256,uint256,uint256,uint256,uint256,uint256,address,string)", +"512b64c6": "_productDoesNotExist(uint256)", +"512b658d": "mintToAddress(uint256,address)", +"512c0b9c": "randomDS_updateSessionPubKeysHash(bytes32[])", +"512d62df": "getClass(uint256)", +"512d8a87": "EdwanzToken()", +"512dd020": "getItemsCount()", +"512f1e64": "orderBookLength()", +"512f8f92": "changeLottery(address)", +"512f9890": "airDropFinished()", +"512fcd60": "changeOwner3(address)", +"512ff2c9": "CHEXToken(address,address,uint256,uint256)", +"51306a80": "_isVotable(bytes32)", +"5130b405": "setMinimumBidAmount(uint256)", +"5130c857": "forking()", +"5131d3e9": "setUseFreeze(bool)", +"5131f01d": "available_shares()", +"51327a6a": "emptyToWallet()", +"513284c6": "createShop(address)", +"5132faca": "stakeTokenContract()", +"51331732": "ICO_start()", +"51331ad7": "getRoleManager()", +"513419e3": "updateStartTimeManually(uint256,uint256)", +"513485fc": "CallRejected(address,bytes32)", +"51349d5f": "scheduleTier(uint256,uint256)", +"5135077b": "setContentName(string)", +"51355362": "transferWithFee(address,uint256,uint256)", +"51355cfb": "getTier(uint256,uint256)", +"51356817": "doPull(address,uint256)", +"5135d28d": "getScore(uint256,uint256,uint256[])", +"5135dffa": "NonActivationWithdrawal(address[2],uint256[8],uint256)", +"5135f714": "Basic(address)", +"5136099c": "premium(bool,address,address,address,address[],uint256[])", +"513611e5": "setStatusTransferFrom(bool)", +"5136260d": "getLockedFundsReleaseTime()", +"51379adb": "Crowdsale(address[],uint256,uint256)", +"5137aa7b": "reveal(bytes32,uint256,bytes32)", +"5137dd99": "only666()", +"5137de7a": "privateReleaseTime()", +"5138574b": "setNextCommonTTMTokenId3(uint64)", +"51392041": "getDividendTokenBalanceOf(address)", +"513a0149": "setRocCoreAddress(address)", +"513a976e": "YaqootToken()", +"513ad9cb": "EvTokenRm(uint256,uint256,uint256)", +"513cb145": "convertToUSD(uint256,uint256)", +"513d085b": "Pandemica()", +"513d16a7": "setFundingStartTime(uint256)", +"513de1d3": "changeDivisor(uint256)", +"513f7d1e": "tokenValue(address)", +"513f99e7": "tokenFrozen(uint256)", +"513fdce9": "addClearingPriceValidator(address)", +"51401d4d": "gameMaxBetAmount()", +"51404cbe": "forceDivestOfOneInvestor(address)", +"51409f51": "currentTradingSystem()", +"5142ba74": "rolloverFeePeriod()", +"5142bc1e": "getAllowedRangeOfChoices()", +"5142c3ec": "assertEq13(bytes13,bytes13)", +"51430cb3": "claimMaxAmount()", +"51431800": "getSendableEther()", +"5143284d": "start4NormalPeriod()", +"5143659d": "claimCooldowns()", +"51436641": "convertToMiniCQS(uint256)", +"5143821e": "_moveToArea(uint16,address)", +"514385be": "disableConnectorPurchases(address,bool)", +"5143a9fe": "deposit(address,uint256,address,bytes)", +"5143e246": "mintLocked(address,uint256)", +"5143eea2": "addOwnerFromRecovery(address,address)", +"514403b3": "setnodemoney(address,uint256)", +"5144417c": "news()", +"51446e85": "CITRUX()", +"51464905": "updateGoldInvestor(address)", +"5146585a": "calcInterestRateNumerator(uint256)", +"5146690e": "reservesWallet()", +"5147af92": "buyGasLimit()", +"51489551": "getToken(bool)", +"5148ccb9": "DynamicCeiling(address,address)", +"5148de8d": "minimumTimeBeforeUpdate()", +"5149ffcb": "calculateSubmissionIndex(uint256)", +"514a48ae": "_changeApproveDate(uint256)", +"514a88ae": "revokeSchedule(address,address,address,address)", +"514ae8a6": "MagneticsToken(uint256)", +"514b13f2": "presaleConversionRate()", +"514d6e07": "horseShoeFS(uint256)", +"514d7067": "workOrderCallback(address,string,string,string)", +"514d717c": "developReserveWallet()", +"514dcfe3": "seller_accept()", +"514ec8ae": "TOKEN_CENTS()", +"514f0330": "changeProtocolFeeRecipient(address)", +"514f310f": "_NewChallenge(address,bytes32,uint256)", +"514f4711": "In(address,uint256)", +"514fcac7": "cancelOrder(uint256)", +"515053c6": "depositBond(address,uint256)", +"5150e8ce": "CPPGToken()", +"515134b3": "TianZhuCoin()", +"5151e2cc": "GREENBIT()", +"5152249c": "Paladin(uint256,string,string)", +"51524e5b": "AirDrop(address[],uint256[])", +"5152abf9": "OrderCancelled(bytes32)", +"515361f6": "assertEq(address,address)", +"515371a3": "getWinnerAddress(uint256)", +"5154865a": "crowdFundAddress()", +"51548a2d": "TOKEN_AMOUNT_ICO_STAGE2()", +"5155287a": "whitelistedMin(address)", +"51553205": "PreSale(address)", +"5155bafa": "maxPeriods()", +"5155d9c6": "getPetCardSeries(uint8)", +"51560da9": "topDogInfo()", +"51563527": "passDao()", +"51576510": "bountiesWallet()", +"51582ef3": "sendProxyTransaction(address,uint256,uint256,bytes)", +"51584916": "allowexternalContract(address,uint256,bool)", +"5158c829": "RECFCO(address,address)", +"5158ea5e": "disallowUsers(address,address[])", +"51593759": "carCountOf(address)", +"515a20ba": "setExpiration(uint256)", +"515b1e41": "zss()", +"515b3557": "STARTING_CROCS()", +"515c1457": "emitTransfer(address,address,bytes32,uint256,string)", +"515cbcb4": "dropCoinsMulti(address[],uint256[])", +"515ced53": "best_submission_index()", +"515d4503": "getBarCodeDataAtIndex(bytes32,uint256)", +"515d4d52": "totalAmountsBet(uint256)", +"515da4b9": "transactionList()", +"515f128b": "COMMUNITY_POOL_TOKENS()", +"515f25ae": "launchShipOnMEA(uint256,uint8)", +"515fdde3": "migrateFunds(address,address[])", +"51602590": "threeHotHoursPriceOfTokenInWei()", +"51605d80": "imageHash()", +"5160a21e": "AddDomainInfoDocument(string,string)", +"51613683": "crowdSaleStart()", +"5162b2b2": "isAddressWhitelist(address,address)", +"5163311e": "getLastWinnerTicket()", +"51640fee": "getCertificate(uint256)", +"5164bb4d": "getCurrentStinkyLinkys()", +"51651003": "redenom_dao_fund()", +"516517ab": "make(uint256)", +"51656af5": "GuigsTokenSale(uint256,uint256,uint256,uint256,address,address,address,uint256)", +"51656f08": "AgesToken()", +"5165749e": "createToken(string,string,uint8,uint256,address)", +"516583fe": "depositFrom(uint256)", +"5165a03d": "payout(uint256,bytes32,bytes32,uint8)", +"5166b68f": "unfreezeTransfersUntil(string)", +"5166cf3d": "canAttack(address,address)", +"5168afa4": "getPackageHash(bytes,uint8,uint8,uint8)", +"5169ed0e": "getCCH_edit_29()", +"516a6b22": "PingoToken()", +"516ae993": "setChargeFee(uint256)", +"516af259": "setCurrentStage()", +"516b48fb": "insertList1(uint256,string,string,string,string,string)", +"516c731c": "setOwner(address,bool)", +"516cbe1a": "efwtest()", +"516cd39b": "revokePermissionFrom(address)", +"516d70c3": "lockAllocationAddress(address)", +"516dde43": "expiryDate()", +"516de876": "go(bytes16)", +"516dea30": "post_relayed_call(address,address,bytes,bool,uint256,uint256)", +"516e7be7": "contractFailed()", +"516e9aec": "lockAndDraw(address,uint256)", +"516ed622": "registerDINs(uint256)", +"516edc99": "UNITYCOIN()", +"516f279e": "location()", +"516f6afd": "Project_Enable(uint256)", +"516f8986": "TOKENADDRESS()", +"5170a9d0": "returnSender()", +"517125fa": "minTokensForSale()", +"51714d2d": "CIRCLECOIN()", +"517186f3": "ownerModOperator(address,bool,uint256)", +"5171bdec": "AllocationProcessed(address,address,uint256)", +"51720b41": "targetContractId()", +"51731f21": "changeFreezeTrading(bool)", +"51751612": "EtchToken()", +"51758666": "getMesa(uint256)", +"5175f65c": "_ownerApproved(address,uint256)", +"51764a94": "Lesson_3(address,uint256)", +"51768e4d": "updateItem(uint256,string,uint256,uint256,uint256)", +"51777183": "private_setRandomAPI_extract(string)", +"5177942a": "setFeeRate(uint8)", +"51780fdb": "w(address,address,uint256)", +"51784a75": "withdrawPlat()", +"517880df": "secondaryICO(bool)", +"51788439": "hashRequest(address,address,uint256,uint256,address)", +"517a626f": "getUserLengthOnEther()", +"517a70d4": "mintAmount3()", +"517a9d64": "share(address,address)", +"517afbcf": "votingController()", +"517b1d8f": "setRegionCurrentPixelPrice(uint256,uint256)", +"517b2fa8": "depositDaiFor(uint256,address)", +"517c48c3": "LATPToken()", +"517c8b12": "GetTicketOwner()", +"517cf73e": "getSupplyRate(address,uint256,uint256)", +"517d95fa": "addusermoney(address,uint256)", +"517e62ab": "getTxTimestampPaymentKWh(bytes32)", +"517ebace": "eosOf(address)", +"517ee2e8": "CSLottery()", +"517ee30d": "CreateHOLY(address,uint256)", +"517f4a23": "SalesManager()", +"517f6c51": "HardcodedCrowdsale(uint256,uint256,uint256,uint256,address)", +"517fe4de": "showUser(address)", +"51804743": "LandAccessControl(address)", +"5180629d": "transferByOwnerContract(address,uint256)", +"5181500d": "ExoplanetToken()", +"51819edb": "emergencyWithdrawParsecs(uint256)", +"5181aa01": "RELEASE_END()", +"51838717": "addSmartContract(address)", +"5183f10b": "getDataOfIdentity(bool)", +"51843b06": "supporterBalances(address)", +"51846028": "setColorsX8(uint16[8],uint256[40],uint256)", +"518496b2": "proposedWithdrawal()", +"5184c96d": "escrowList()", +"5184cc43": "getFactor()", +"5184ffc9": "setAmbiAddress(address,bytes)", +"51858e27": "emergencyPause()", +"5185b724": "allocateReservedTokens(address,uint256)", +"51867b19": "withdrawnFrom(address)", +"5187527f": "reversePurchase(address)", +"5187a7d7": "GetSign(string,address)", +"51883f6e": "RecievedAnonDonation(address,uint256)", +"5188875b": "withdrawalToken()", +"51888969": "weiRaisedPreIco()", +"5188f996": "addContract(bytes32,address)", +"51892c0f": "BIGER(address)", +"51892f07": "changeMintingAddress(address)", +"518995cd": "addClip(string)", +"518999f2": "TSTORZCo()", +"518a5b7a": "implementsMethod(address,bytes4)", +"518ab2a8": "tokensSold()", +"518ada3b": "GetUserBets(address)", +"518adacd": "notifyAuthority(string,string)", +"518b1a33": "ALLOC_LIQUID_TEAM()", +"518b4372": "getInvoices(address,uint256)", +"518b7a29": "totalDETsSold()", +"518bddd9": "getCustomer(string)", +"518bed3f": "calculateTokensAmount(uint256)", +"518c0f17": "tokensOnThisChain()", +"518d3b64": "getTotalSent()", +"518d6c2d": "_preApprove(address)", +"518d7981": "adjustBalance(address,address,int256)", +"518e62db": "createOrder(address,address,uint256,uint256,uint256)", +"518f2f10": "setAddressAuthorization(address,address,bool)", +"518fd40e": "cdtTokenAddress()", +"5190674b": "resignAsCurator(address)", +"51906bb0": "endTimeStamp()", +"51913124": "batchTransferMSM(address[],uint256[])", +"5191e37f": "listMultipleItems(uint256[],uint256,uint8)", +"51922341": "transferICOFundingToWallet(uint256)", +"5192f3c0": "boolToInt(bool)", +"519559ed": "contractMax()", +"5195e8c5": "mintData()", +"51965e75": "getRocrocId(uint256)", +"51971109": "UntungWaluyo()", +"51973391": "sentBonus()", +"51973ec9": "log()", +"5197c7aa": "getX()", +"519903f1": "unionBalance()", +"51992fcb": "addTokenAddress(address)", +"519936db": "StartAuction(string,uint256,uint256)", +"5199f1de": "lastYearTotalSupply()", +"519a078f": "getCommunitybyIndex(uint256)", +"519a1a41": "getSetup(address,bytes32)", +"519a73c3": "stopAcceptingDonation()", +"519af30e": "withdrawAllEth()", +"519be2f5": "resetDemo()", +"519bf602": "reward8()", +"519c6377": "signup(string)", +"519d1059": "setPurchased(address,address,uint256,uint256)", +"519e55da": "getStorage(string)", +"519e9a92": "Log2(address,bytes32,uint256,string,string,string,uint256,bytes1)", +"519ee19e": "tokenSold()", +"519f9590": "appointNewCFO(address)", +"51a073fb": "removeFromSpecialRatesMapping(address,address)", +"51a0aff0": "stockBuyOrder(uint256,uint256,uint256)", +"51a0c395": "myUsingOraclize()", +"51a11e94": "tokenIssued()", +"51a14c9f": "GetPartWeight(uint8,uint256)", +"51a1ad6b": "VikkyTokenAirdrop(address,address)", +"51a1c192": "get_solution()", +"51a282ae": "bidEMONTIncrement()", +"51a28572": "SALE0_RATE()", +"51a36e34": "changeCrowdfundContract(address)", +"51a3aed5": "getCompanyPreferences(string)", +"51a4cd73": "sellCoins(uint256)", +"51a4f7f2": "Har(address,address,address,uint256,uint256,uint256)", +"51a5f2f2": "ConsultingHalf(address,address)", +"51a6b851": "actual_feedout()", +"51a76924": "getSpeed(uint64,uint64)", +"51a784e3": "currentCirculating()", +"51a88a38": "PictureLibraryCoin(uint256)", +"51a8a8a4": "clearDividends(address)", +"51a8c3d7": "PausableCrowdsale(bool)", +"51a9111a": "BONUS_PRE_ICO()", +"51aa0199": "ethereumPrice()", +"51aa0a30": "modifyPMTAccount(address)", +"51aadcdf": "crowdSaleContract()", +"51ab351c": "BONUSONE_DATE()", +"51ab720d": "numOfTimesSteal()", +"51ac0d10": "getTimeBasedBonusRate()", +"51ad0299": "Ship(string,uint256)", +"51ae7f95": "COMPANY_TOKENS_LOCK_PERIOD()", +"51ae8754": "calcSectionTickets(uint256[],uint256[])", +"51af083b": "MONTH_IN_MINUTES()", +"51afc4af": "_getMinAuctionSeconds()", +"51b07a96": "getUSDT(uint256)", +"51b0b931": "updataLockPercent()", +"51b2270f": "getICOLength()", +"51b30900": "generateMemoryProof(uint256[],uint256)", +"51b3666f": "applyBooster(uint256,uint256)", +"51b3d7b9": "_transferWithReference(address,uint256,string)", +"51b41b62": "getAllOwnersOfCard(address)", +"51b42b00": "deactivate()", +"51b46399": "triggerUnpauseEvent()", +"51b488d4": "throwsWhenGettingTokensInNotInitiatedSale()", +"51b546af": "EDCoreVersion1(address,address,address,address)", +"51b59341": "MoncryptToken()", +"51b644c0": "roundedDiv(uint256,uint256)", +"51b6914a": "Lara(uint256)", +"51b699cd": "isAuthorised(address)", +"51b6fe96": "distributeTokens(address,address[],uint256[])", +"51b72a9a": "removeActivator(address)", +"51b79495": "performFeelessTransaction(address,address,bytes,uint256,bytes)", +"51b79d55": "maxPremium()", +"51b95400": "SophosToken()", +"51b98927": "_withdrawProfit()", +"51b9a2f8": "ballotVoters(uint32,address)", +"51b9c785": "step_level()", +"51ba24c7": "Token_ExchangeValue()", +"51ba5f04": "registerImpact(string,uint256,uint256)", +"51ba7534": "LastExec()", +"51babf0c": "sellToken(address,uint256,uint256,bool)", +"51bba1cc": "itemTransferred(bytes32,uint256,address,address)", +"51bcc53e": "checkFloatingOwnSupply(address,uint256,bool,uint256)", +"51bdd585": "currentChallenge()", +"51bdf229": "DummyContract(uint256,uint256,uint256[10])", +"51be2361": "InterCrypto_Wallet()", +"51c03b85": "makeBid(uint16)", +"51c08f4d": "gameTimeOut()", +"51c13af3": "MAX_ALLOWED_BOUNTY()", +"51c15991": "endGamblingParty(uint256,int256,int256)", +"51c1ae00": "DGClubCoin()", +"51c1bba1": "offlineGame(address)", +"51c221ec": "holderReserveTokens()", +"51c3934f": "getContractsByStatus(address,uint256,uint8)", +"51c3a2c6": "CPCEFundDeposit()", +"51c3a5d3": "getPollsSize()", +"51c3b8a6": "setFreezing(address,uint256,uint256,uint8)", +"51c40c6f": "setIntrospectionRegistry(address)", +"51c4e395": "logMarketCreatedCalled()", +"51c54c68": "buySprite(uint256)", +"51c54ec6": "transferAllBalance(address)", +"51c5d54d": "rateSecondWeekEnd()", +"51c65298": "exportFund()", +"51c69b12": "twoMonthsLater()", +"51c72c87": "ProofTeamVote(address)", +"51c74a9e": "addCertificate(bytes,bytes,bytes,address)", +"51c81f01": "setBursar(address)", +"51c85565": "nextTournamentBank()", +"51c875d2": "DB()", +"51c8d4d0": "get_arbits_whitelist(address,address)", +"51c8e02a": "setStore(int256)", +"51c9b233": "changepublicbonus(uint256)", +"51ca0eb8": "FACTOR_PRESALE()", +"51ca6966": "RefundableCrowdsale()", +"51ca7a94": "addNodes(string,address)", +"51cb21ff": "getgamecardname(uint256)", +"51cb6ecd": "addRandomFight2Death(uint256)", +"51cb860a": "setAccountNote(string)", +"51cb9712": "newExpertise(uint256,uint256)", +"51cbb299": "getClosingObligation(uint256)", +"51cc391d": "MULTI_SIG()", +"51cc4d1d": "payDemurrage(address,address)", +"51cc508d": "Zeinun()", +"51cc7cbe": "PawCoin()", +"51cd7c0f": "MatchPayoff(uint256,uint256,uint256,uint256)", +"51cdac6b": "find(address)", +"51ce3207": "getStockOwnerInfo(address,address)", +"51cf6b22": "burnInvestorTokens(address,address,uint256)", +"51cfa44b": "getStarTotalSupply(uint8)", +"51cfc731": "transferFromContract(address[],uint256[])", +"51cfdd58": "Dewcoin()", +"51cff8d9": "withdraw(address)", +"51d10161": "boughtToday(address)", +"51d20c7c": "Exchange_ETH2LuToken(uint256)", +"51d24a33": "addNewBoard(bytes32,string)", +"51d28a7e": "saleTokenPrice()", +"51d2a1e4": "getDepositRoot(bytes)", +"51d2a8fe": "BIKSPRO(uint256,string,uint8,string)", +"51d2cc8f": "grid(uint256)", +"51d31822": "setMarketAddr(address)", +"51d34040": "returnBet(bytes32)", +"51d38d5f": "addDeveloper(address,string)", +"51d467f5": "getLogFillArguments()", +"51d53bee": "HRHToken(uint256,string,uint8,string)", +"51d550d2": "getPendingBalance(address)", +"51d59a20": "impl_incomeOf10k()", +"51d5d98d": "hasEnoughTokensLeft(uint256)", +"51d5f44f": "saleHero(uint256)", +"51d6e547": "getNonce(bytes)", +"51d74ce5": "SetWageredWei(bytes32,uint256)", +"51d75dc6": "BUYER_STEP_2(bytes32)", +"51d962e1": "endRelease()", +"51d977a6": "TEST()", +"51d997b2": "isAbstainAllow()", +"51da463a": "_revokeAccess(bytes32,address,address)", +"51dabd45": "disapproveAll(address)", +"51dbc419": "_drainGame(bytes32,address,uint256[10])", +"51dc7659": "winNum()", +"51dc7f7d": "setPreferredCurrency(address,bytes4)", +"51dd3164": "getCurrentMinimum()", +"51dd8119": "announceFork(string,string,uint256)", +"51de097f": "e_Withdraw(uint256,uint256,uint256)", +"51de5541": "castUpgradeVote(uint8,address,bool)", +"51dea0ae": "updateOwnerShares(address[],uint256[])", +"51ded741": "rateThirdWeekEnd()", +"51df6d27": "GlobalLotteryToken()", +"51df9db9": "newPrice()", +"51dfc14d": "tokensOfferedOf(address)", +"51dff989": "redeemVerify(address,address,uint256,uint256)", +"51e00935": "Arrays()", +"51e09631": "totalVestedTokens()", +"51e0e26b": "allowedContracts(address)", +"51e10aa6": "calculateToFund()", +"51e16546": "_payFee(uint128,address)", +"51e1d427": "boolMemoryArray()", +"51e1ee12": "ContractorProposalClosed(uint256,uint256,address,uint256)", +"51e22125": "addPresaleWhitelist(address,uint256)", +"51e4eb07": "setContributionLockPeriod(uint256)", +"51e51b55": "startPreSalePhase()", +"51e55767": "getWeiPerContributor(address)", +"51e699a8": "setMainSaleDates(uint256)", +"51e6ba1d": "toggleContractFreeze()", +"51e6edee": "RETZO()", +"51e7f12e": "_doDestroyTokens(address,uint256)", +"51e82eec": "totalSetCredit()", +"51e94406": "weiRaisedPreSale()", +"51e946d5": "freezeAddress(address)", +"51ea468b": "getSupportersAddress()", +"51eace10": "unfreezeStartTime()", +"51eb5e93": "overdraftPeriodLength()", +"51ebe2f1": "bursarAddress()", +"51ec4285": "unvote(uint256)", +"51ec4525": "first_player()", +"51ec4fc7": "limitAddress(address)", +"51ec8433": "STTadmin2()", +"51ecabd6": "toPayable(address)", +"51ecfd16": "getCatPrice(uint256)", +"51ed17a4": "reservedTokensList(address)", +"51ed8288": "buyNFT(uint256)", +"51ed96b9": "enableContribPeriod()", +"51edbdbb": "setForeignBridgeErcToErcImplementation(address)", +"51edffed": "identifierIsOriginal(uint256)", +"51ee387d": "dividendsAvailable(address)", +"51ee43e5": "lottery(int8)", +"51eec810": "setCapitalization(uint256)", +"51eecc23": "setupBounty(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"51f1333e": "relievePool(uint256)", +"51f1fa97": "POHStartTime()", +"51f2f1d1": "timeTransferbleUntil()", +"51f364d5": "currentCostToPress()", +"51f3a7bd": "CoinFlip()", +"51f3b4bd": "collectFees(uint256,address)", +"51f468c0": "setClaimPrice(uint256)", +"51f4ec50": "setWriterId(bytes32,bytes32)", +"51f514d3": "computePayeeBalance(address,address,uint256)", +"51f550be": "IcoSupply()", +"51f59db2": "test_claimShares_emptyFeePool_notTranscoder()", +"51f68d80": "calculateLRCUnlockAmount(uint256,uint256)", +"51f6d8c6": "setBalances(address[],address,uint256[])", +"51f6f870": "createMicroModule(uint256)", +"51f80746": "DXBToken()", +"51f91066": "tag()", +"51f93215": "bond(bytes32,uint256)", +"51f96d33": "verifySignature(address,address,address,uint8,bytes32,bytes32)", +"51f9ff35": "lastDividendIncreaseDate()", +"51fa5810": "getEnginesIds()", +"51fa7efd": "returnAmountToMainAccount(uint256)", +"51fab7ff": "transferRemaining()", +"51fae45d": "astroIDPool()", +"51fafb72": "setSubscribe()", +"51fafd95": "cashierAddr()", +"51fb012d": "whitelistEnabled()", +"51fb3043": "tokensForPresale2()", +"51fb4001": "rateIcoMainSale()", +"51fba575": "NRB_Users()", +"51fbd91e": "donationsReceiver_()", +"51fbfe9d": "migrationCountComplete()", +"51fc6f59": "TokenManagerEntity()", +"51fd2c69": "quantityHeldInCustodyOfExchange(address)", +"51fdaf92": "checkExpiredfunds()", +"51ff1a06": "PaparazzoToken()", +"51ff4847": "signature()", +"51ffcab3": "bid(uint32)", +"51ffd9e7": "getRatePerTimeUnits(uint256,uint256)", +"52006050": "setBurnBounds(uint256,uint256)", +"5200d643": "OPENING_TIME()", +"52013484": "CalcWinnersAndReward(uint256[],uint256)", +"52019dc3": "payTokens()", +"5201effb": "setCompletionTime(uint256)", +"520282d0": "getBcouponAllocationFactor()", +"5202b615": "numberOfClosedGames()", +"52030899": "preSaleBlockNumber()", +"5204cfe1": "OpenRedEnvelope(string)", +"520543ab": "endStage2()", +"52058d8a": "tokenSupplyCap()", +"5205b80f": "getLeftToken()", +"52063985": "unlockAddr()", +"5206fea3": "_transfer(string,string,uint256)", +"5207c391": "setWhitelistedBatch(address[],uint256)", +"5208a157": "getCardsFromHash(uint256,uint256,uint256)", +"5208ce36": "STQPreICOTestHelper(address,address)", +"52091047": "changeVotingRules(address,uint256,uint256)", +"520929b6": "AlgeriaToken()", +"520aea97": "setNote(uint256,bytes32,bytes20,string)", +"520b1b65": "testGetAllCases()", +"520ba154": "changeAcct2(address)", +"520bbba3": "generateRequestAttestationSchemaHash(address,address,address,bytes32,uint256[],bytes32)", +"520bf4d8": "SmallInts()", +"520c37b7": "setOCGFee(address)", +"520c3db7": "relayRelease(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32)", +"520c5828": "whitelisting()", +"520c7c8c": "bountiesAllocation()", +"520c7d6f": "PAYOUT_ATTEMPT_INTERVAL()", +"520ce36a": "Permian()", +"520ce39e": "DamnRocks()", +"520d3f0d": "getrate()", +"520e12d7": "getCertAddressByID(string)", +"520e7b0e": "offer_energy(uint32,uint32,uint64,uint64)", +"520e8143": "returnTokenToWallet()", +"520eb620": "getTemplateByProposal(address,uint8)", +"520ee757": "NewSandwichTicket(string,address,string,string)", +"520fa2c1": "BetleyToken()", +"520fd799": "Nplay()", +"52108d4c": "setCCH_edit_30(string)", +"5210eb56": "targetAddress()", +"5211ac2e": "withdrawWei()", +"5211e91e": "CSTToken()", +"5211f843": "bbNetworkGrowthWallet()", +"52122abf": "JackpotHits()", +"52125b86": "eventcount()", +"5212e6ea": "firstExtendedBonusSalesEnds()", +"5213cca8": "AdvisorPoolAddress()", +"52146744": "AteamBets(uint256)", +"52159bcf": "CreateCityData(address,uint256,uint256)", +"5215ad0b": "batchTransfer(address,address[],uint256)", +"5215cb88": "onPresaleComplete()", +"5216509a": "numCandidates()", +"5216aeec": "totalInvested()", +"5217b774": "redeem_withdraw(address,address,uint256)", +"5217cdff": "greyToken()", +"52180208": "take(address,uint256)", +"5218402d": "claim_bix_with_not_start()", +"52185f0e": "isWithinAllocation(address,uint256)", +"5218bfbb": "getOffer(bytes32,address)", +"5218c37d": "bulkRejectTransfers(uint256[],uint256[])", +"5218f3b3": "CoinStocker()", +"52194acf": "addBank(address,address,uint256)", +"52196812": "getLoanCount()", +"5219823a": "hashMessage(bytes)", +"52199094": "setBurningPercentage(uint256)", +"5219a566": "hashForSignature(bytes32,uint256,address,bytes32)", +"5219a72a": "mcgregortoken()", +"5219ffb8": "withdraw_tokens_for(address)", +"521af962": "DataBrokerDaoToken(address)", +"521b20ec": "highestBidAddress()", +"521b601a": "setData_26(string)", +"521b7499": "setStageVolumeBonuses(uint256,uint256[],uint8[])", +"521be69c": "applyTokens(address,uint256)", +"521c82be": "getCCH_edit_17()", +"521cd656": "playersAmounts(address)", +"521ceba7": "pusherTracker_()", +"521d56c6": "regeneration()", +"521d80f8": "fundsTransfered()", +"521e5770": "fechCurrentSnapshotBlockIndex()", +"521eb273": "wallet()", +"521ec3af": "MGLTToken()", +"521ee1ae": "purchaseFor(address,address)", +"521f4195": "isOwn(address,uint64)", +"521fba45": "setTokenInfo(string,address,address)", +"521fba71": "getRandom256()", +"521fbd3a": "deploytime()", +"521fd5be": "getSingleBet(uint32,uint32)", +"52200a13": "getNumHolders(uint256)", +"522103fa": "changeUnicorn(uint256,address)", +"5222cd8a": "Deal(bool,uint8)", +"5223478a": "setIsPoop(bool)", +"52238fdd": "calculateFees(uint256)", +"522471fc": "setTotalWithdraw(uint256,address,uint256,address,bytes,bytes)", +"5224dfbe": "mainTokensPerDollar()", +"52251884": "setForwardPurchaseFeesTo(address)", +"52253542": "playSingleDiceBet(uint256,uint256)", +"5225528e": "getBadAddresses()", +"522567c8": "transferedTokenOf(address)", +"52256d44": "MuratCoin()", +"522577e9": "totalIncome()", +"522637e7": "CMCLToken(uint256,string,string,address)", +"52279295": "interestRatePerCycle()", +"52288195": "Sell(uint256)", +"5229c56f": "getDecreaseAllowancePreSignedHash(address,address,uint256,uint256,uint256)", +"522a6cf3": "computeMilkSellPrice()", +"522afaec": "increase(address,uint256)", +"522bb704": "run(address)", +"522c8401": "bidOnSiring(uint256,uint256,uint256)", +"522dba5b": "GoldTokenMinter()", +"522dc0b1": "walletsFromUser()", +"522dd549": "advisor3Sum()", +"522de7d3": "verifySubmissionIndex(uint256,uint256,uint256)", +"522dff9a": "setMocount(uint256)", +"522e1177": "complete()", +"522e2d3c": "BiathlonToken(address,address,string,string,uint256,address)", +"522e35fb": "changeIssueManager(address)", +"522e4c8a": "addStaff(address)", +"522f6815": "withdrawEther(address,uint256)", +"522f9585": "setNewWallet2(address)", +"52306f4a": "isCBE(address)", +"52314508": "registerOutcome(string,uint256)", +"5232d457": "PayoutEvent(uint256,address,uint256)", +"52337ab0": "interact()", +"52346412": "transfers(address[],uint256[])", +"52353e5b": "assetsOnDeposit()", +"52357779": "currentRId_()", +"523615aa": "AddApprovedAddress(address,address)", +"52374af1": "bitPremiumToken()", +"52375093": "m_lastDay()", +"5237d235": "getRightToken()", +"5237e325": "getAdIdByCat(uint256,uint256)", +"52380eba": "entitled()", +"52380f65": "MoneyAddedForRefund(address,uint256,uint256)", +"52388c1b": "AndreisToken()", +"523898f4": "cooperativeClose(address,uint8,uint256,bytes,bytes)", +"523934bb": "registerExport(bytes8,bytes8,uint256)", +"52393d45": "SGDT()", +"523a0b0d": "privateMaxEtherCap()", +"523a3f08": "withdrawReward(uint256)", +"523ad959": "bullAmount()", +"523aee69": "changeTokenContract(address)", +"523afb0d": "bet(bool)", +"523b6ae3": "MycoinToken(address,address)", +"523c02f5": "getRateForExternal(string)", +"523ccfa8": "isKnownCall(address)", +"523d897e": "wsub(uint128,uint128)", +"523da442": "getCurrentBonusTier()", +"523deadb": "getOwner(address,address)", +"523e27d4": "currentInvestor()", +"523e57be": "mintForHolders(address[],uint256[])", +"523e9551": "increaseCap(uint256)", +"523f110e": "updateRegion(address[16],uint256,uint256,uint256[],bool,bool,uint8[128],bool,address)", +"523f52c6": "setTgeIssuer(address)", +"523f53a6": "IntigoTest()", +"523f891c": "totalEligibleVotes()", +"523fba7f": "tokenBalances(address)", +"5240346d": "TV()", +"52405f56": "getMilestoneInformation(uint256)", +"52411891": "add(uint256[2])", +"52415840": "testMe()", +"5241590d": "addToAddressBalancesInfo(address,uint256)", +"52416347": "ParameterSet(string,string)", +"5241b39d": "renewal()", +"52437187": "callLib(uint256)", +"5244128a": "_claimableTokens(address)", +"52441d7d": "getCurrentUserShareBonus()", +"52447ad2": "doMint(int256,uint256)", +"52447d92": "burn_from(address,address,uint256)", +"5244d9a8": "removeIdentifier(bytes32)", +"5244ed87": "joinToTrack(uint256)", +"524559a3": "periodPreICO()", +"5245849e": "allowedAmountToTransferToPool()", +"5246a8df": "verifySig(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,uint256,address,bytes,address,address)", +"524705ef": "getsysdayeths()", +"52476ceb": "shareTimeGap()", +"524773ce": "burnCount()", +"5247b9e9": "firstMintRound0For(address[],uint256[],bool[])", +"5248f2c8": "removeBankroll()", +"52494a14": "_isOwner()", +"5249be25": "tokenPriceUsd()", +"524a2ed9": "setBAUU(bytes32,address,uint256,uint256)", +"524a8131": "STARTING_ASSET_BASE()", +"524aa413": "ValidateWorldSnapshot(uint256)", +"524aae98": "getPromoLOTEarnt(uint256)", +"524b5cb9": "approveMintDelegate(address,int256)", +"524bd747": "getNbDemandes()", +"524d5ddb": "wagerPool5()", +"524d7daf": "verifyGame(uint256)", +"524d81d3": "numContracts()", +"524dcda3": "MINT_LOCK_DURATION_IN_WEEKS()", +"524e1149": "joinCreateGame()", +"524e2444": "setPI_edit_32(string)", +"524e4e61": "testDistribution()", +"524e65b9": "_getWinnerBetted(uint32,uint32)", +"524e915d": "player4Timestamp()", +"524eb29c": "setRequestBurnerContract(address)", +"524ee639": "setSpaceImpulse(address)", +"524f3889": "getPrice(string)", +"524fa7b9": "whitelistAdd(address)", +"52507790": "transferAfterDeadline()", +"52512599": "latpToken()", +"5251a343": "stopPurchaseTokens()", +"52529852": "W0kiT0ken()", +"5252cb2f": "generateUnsoldTokens(uint256)", +"525417f1": "getNextKeyTime()", +"52541b68": "takeAGuess(uint8)", +"525426fd": "increaseUSDRaised(uint256)", +"52545021": "AkshayToken(uint256,string,string)", +"52548946": "isSimple()", +"5254a38c": "onERC721Received(uint256,address,bytes)", +"5254b595": "TransferIndex()", +"5254b660": "canDeCompose(string)", +"5254c846": "getAction(uint8)", +"525550ea": "rescueAddress()", +"52556421": "getIssuer()", +"52556a46": "State(address[])", +"52558c2b": "CSPTToken()", +"5255a07b": "HeroTokenAuction(uint256)", +"5256a36e": "MAX_ICO_GOAL()", +"5256fcaf": "_giveRNG(uint256,uint256)", +"52573529": "setupPeg(address,address)", +"52578012": "createService(string)", +"5257c2b3": "soldTokenInPresale()", +"5257c508": "ico1Cap()", +"5257c825": "registerNameXIDFromDapp(address,bytes32,uint256,bool,uint8)", +"5257cd90": "randomNumbers(uint256)", +"5258d9f4": "unequipSingle(uint256)", +"5259347d": "default_helper()", +"52595c0d": "getOraFee()", +"5259fcb4": "centsRaised()", +"525a0ac8": "Claim(address,uint256,bool,string)", +"525a8cf0": "add_product(uint256,uint256,string,string,string,string,string)", +"525b25b1": "getDeploymentReward()", +"525b3fe3": "presaleLimit()", +"525c3966": "GMCB()", +"525cedae": "TeamTokensAllocation()", +"525d0537": "getWinnerFunds(uint256[])", +"525f8a5c": "setSaleStartTime(uint256)", +"525ffb7c": "ownersPayed()", +"52608d85": "rateEth()", +"5260de57": "numberOfTokensPerUser()", +"52613423": "OLOVE(uint256,string,string)", +"52617234": "changeSalePeriod(uint256,uint256)", +"5261ee83": "amountOfOwners()", +"5262c873": "calcGain()", +"52631ab4": "lastNonce()", +"52638d75": "create(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"5263ba87": "getLatestPatchTree(bytes32,uint32,uint32)", +"5263dbf3": "RooToken()", +"52642070": "DinarETHCrypto()", +"526441bb": "ExecutionFailure(uint256)", +"5264ff53": "test_forAgainst()", +"5265440c": "checkIsAttached(uint256)", +"5265565e": "_ecosysSupply()", +"5265a078": "getMemoryWordsLog2()", +"5265db80": "setPriceRatePhase1(uint256)", +"526606c9": "addFreezer(address)", +"52666403": "lockRewardToken(address)", +"5266cc7b": "init(address,uint256[],uint256,uint256,uint256,uint256,uint8,string,string,uint8,bool)", +"52675be3": "getElectionName(uint256)", +"5267bd0c": "allowedRefund()", +"5267e681": "Tokens_Per_Dollar_Numerator()", +"526825af": "updateFcontracts(uint256)", +"526938f8": "left35(uint256)", +"5269660c": "createInvestment(uint8[])", +"526a6b48": "transferTo(address,uint256,bytes,bytes)", +"526a99c8": "getJackpotLoseSide(address,address)", +"526aadc2": "mintBaseLockedTokens(address,uint256,uint256,uint256)", +"526b71f4": "InvestboxToken()", +"526b8462": "getPersiansOnTheBattlefield(address)", +"526b91d1": "transferSysAdmin(address)", +"526ba9fa": "TSB()", +"526bc7fa": "getGenCode()", +"526cb803": "getAllOfferingProposals(address)", +"526de5ea": "addChunk2ToWhiteList()", +"526e4d79": "requestRemainingTokens()", +"526e7f3a": "AWD()", +"526f652d": "propertyIdToOwner(uint256)", +"526ff1f0": "TLB()", +"52700ef0": "_changeClosingTime()", +"52704644": "transferFromInternalstaffdisbursementfund(address,uint256)", +"52709725": "owner2()", +"5270aa7d": "EtherGoToken()", +"5270d70d": "readBytes32s(bytes32[])", +"5271027b": "rentFlatDaily(uint256)", +"5271309f": "migrationInfoSetter()", +"5271500b": "batchAddCandidate(address[],bytes32[],bytes32[])", +"52736814": "dutchAuctionToBuy()", +"52748cfe": "addDataResponseToOrder(address,address,address,string,bytes)", +"52753640": "registerXRateProvider(address)", +"52757292": "getEventSecond(uint256)", +"527596bf": "getDeployedChildContracts()", +"5276b91c": "BlackHToken()", +"52772264": "Contract(bytes32)", +"52774565": "getMyLockedFunds()", +"527749a4": "add_bounty(uint256,bytes32)", +"5277fda5": "bookWithEth(uint256,uint256,bytes,string,uint256[],bytes32)", +"52782648": "emitSkillAreasSet(address,uint256)", +"527942ac": "secondWeekPreICOBonusEstimate()", +"52798dae": "buyTicketByEarnings(uint256,uint256,string)", +"5279a5f8": "levelThreeTokenNum()", +"527aea0a": "getWeiBalance(address,address)", +"527ba1e1": "setIV_S(uint256)", +"527c08ec": "Max_CAP()", +"527cc85a": "Zxcvbnm()", +"527d8f12": "ping(uint256,bool)", +"527f0900": "IncPrivateSupply(uint256)", +"527f4ff1": "setTransferAddressUser(address,address)", +"52802121": "depositEther(address)", +"528050a9": "salePreiodChanged(uint256)", +"5280b8ad": "getAmountBounus(uint256)", +"5280c3ee": "dealToken()", +"52810d5e": "UnitToken(uint256,string,string)", +"52812053": "outstandingQuarters()", +"5281947d": "cancelAdoptionOffer(bytes5)", +"5281bbe9": "contractExpirationTime()", +"5282f649": "risedUSD()", +"5283f339": "getAddress(address,string)", +"5283fd87": "giveReward(uint256[4],bool,uint32[4])", +"52848d8d": "kcck256strstr(string,string)", +"5284a4c7": "allocateReferalBonus(address)", +"5284b044": "Products()", +"5284e3d8": "RobotTradingIco(address)", +"5284e660": "_getEndOfLastMiningDay()", +"52855882": "confirmAddress(bytes16)", +"52860ea2": "ADDITIONAL_BONUS_DENOM()", +"528626fc": "updateNextStealTimeByOperator(uint32)", +"52879334": "requireNotZero(address)", +"52879ba6": "roleCheck(string,address,address)", +"5287ce12": "getDepositInfo(address)", +"52883fc6": "addTokenBalance(address,address,uint256)", +"52892478": "disburseAuthorizedPayment(uint256)", +"52892baf": "localConst()", +"52894449": "lastBlock_f17Hash_uint256()", +"528976de": "issueRefunds(address[])", +"528a683c": "keyExists(string,string)", +"528b5176": "zgetOtherContract()", +"528b8ed8": "MaxBusiness()", +"528ce7de": "withdrawByRndNo(uint256)", +"528d4156": "authorizedCreateTokens(address,uint256)", +"528d8797": "ModiTokenERC20(uint256,string,string)", +"528d9479": "FeeUpdated(uint256,uint256)", +"528eb417": "Demome()", +"528ebdd5": "noSales()", +"528eedcb": "sendSafe(address,address,uint256)", +"528ef5a1": "UNINAcoin()", +"528fa135": "changeStartTime(uint64)", +"528fd7b0": "manualPayExpiredDuel()", +"52909fc2": "dynamicExchangeChecks(bytes,uint256)", +"5290d773": "amountBurned()", +"52911bd8": "doesOwnEthHandle(bytes32,address)", +"52916687": "setAuditRegistrar(uint256,address)", +"52929a0c": "disable_throwing()", +"5292af1f": "sendBalance(address)", +"5292c1a9": "testThrowsRestartEnforceRevisions()", +"5292c8f1": "validContribution(address,address,uint256)", +"5293a436": "EscapeHatchCallerChanged(address)", +"5293f22f": "EOSRegistration(string)", +"5294157f": "sendWithAllOurGasExceptExt(address,uint256,uint256)", +"5294188b": "randomizerLottery(bytes32,address)", +"5294409f": "Mineable()", +"5294924d": "getMyLastFreeLotteryTimestamp()", +"5294bb2b": "unpayPooling()", +"5294d0e8": "tokensUnlockable(address,bytes32)", +"52954e5a": "makerTransferAsset(address,uint256)", +"52959d16": "ambiC()", +"5296085e": "callServer(address,uint256)", +"529865c9": "preBuy2()", +"5299ccc6": "isSubjectApproved()", +"529a7d6c": "BurnProposalAdded(uint256,address,uint256)", +"529ae0bf": "maxEthPerAddress()", +"529af369": "createAndSellAllAmountPayEth(address,address,address,address,uint256)", +"529b8e60": "ergebnis()", +"529d15cc": "sequence()", +"529d4800": "getLockedWalletGroup(address)", +"529db099": "viewAllControls(bool)", +"529dbdb5": "getMs(uint256)", +"529e65e1": "removeShopModerator(address)", +"529e6713": "setCustodyFactory(address)", +"529f0fb8": "setFee2(uint256)", +"52a00779": "bountyDelivered()", +"52a08c29": "jackpotPersent()", +"52a0b5ac": "registerBasket(address,address,string,string,address[],uint256[])", +"52a0cf38": "p2pUnlocker(address)", +"52a16bb0": "amountSold()", +"52a23bbb": "approveTokenTransfer(address,address,uint256)", +"52a2695c": "isReachedGoal()", +"52a2720c": "extraTokensTransferred()", +"52a27baf": "read_user_daily_limit(address)", +"52a36938": "initDisabled()", +"52a554a1": "voteBoardProposal(uint256,address,bool)", +"52a5b002": "lastInterestCycle()", +"52a6f970": "ZHEY()", +"52a74b82": "getDebugNumber()", +"52a7cae5": "BitAlphaAirdrop(address[])", +"52a80129": "unlistQualifiedPartner(address)", +"52a82b65": "digest()", +"52a8aeab": "controller1()", +"52a8fe93": "kscBurnWhenUseInSidechain(address,uint256,string)", +"52a9039c": "allocations(address)", +"52a94adb": "TRMCrowdsale()", +"52a982d3": "distributeTokensRange(uint256,uint256)", +"52a9a35e": "retireAdmin(address)", +"52a9cd2d": "changeOwnerVault(address)", +"52aa2ae9": "enterPreSale()", +"52aadf3b": "generateLuckFactor(uint128)", +"52aaead8": "priceLastUpdated()", +"52ac3235": "amountOfQuotations()", +"52ac882c": "retirementManager()", +"52ad2aa8": "__getStore(uint256)", +"52ad4116": "getCrowdsaleStartAndEndTimes(address,bytes32)", +"52ad6468": "SHARE_FOUNDATION()", +"52ae68f6": "getRoundBonusPot(uint256)", +"52af1c04": "parseMessage(bytes)", +"52af719f": "initialize(uint256,address[],address)", +"52af89af": "getsum(uint256[])", +"52afbc33": "scheduleCall(address,bytes4,bytes32,uint256,uint8,uint256)", +"52b1e14a": "insertUser(address,string,uint256)", +"52b33d64": "clientmanagerShare()", +"52b4643c": "Fallback()", +"52b4be89": "totalBuyCardNumber()", +"52b566e4": "CitiDynamicsCoin()", +"52b5e85c": "firstPhaseEndTime()", +"52b5ff39": "RBAC()", +"52b75219": "freezeToken(address,uint256,uint256)", +"52b7fddb": "createMechVRC(uint256,address)", +"52b860eb": "tokenBonusForFifth()", +"52baee20": "getAllHpbNodesByStageNum(uint256)", +"52bafbfa": "vestingBeneficiaryForIndex(address,uint256)", +"52bafde9": "playersSignedUp()", +"52bbde34": "BiddingRing(address,uint256)", +"52bca4c3": "phaseOneCap()", +"52bd6945": "sellReply(uint256,uint256,uint256)", +"52bd9914": "TimeEnd()", +"52bddee6": "uintCeil(uint256,uint256)", +"52bf74b3": "airDropCoin(uint256)", +"52c01fab": "isEntrant(address)", +"52c05ca5": "setWeiPerBlock(uint256)", +"52c0b9f7": "ICO_START3()", +"52c1c03a": "removeUnlockedAddress(address,address)", +"52c1d3d5": "ZenomeCrowdsale()", +"52c204d0": "ICOMeetupToken()", +"52c22a72": "cancelContract(address,address,uint256,string)", +"52c28fab": "add(address,address)", +"52c34e68": "getStandardRobot()", +"52c53cb7": "checkPoint(int256,uint8,int256,uint16)", +"52c5785b": "purchaseTokensPreSale(address)", +"52c5b4cc": "setAuthorizations(address,address[])", +"52c5d892": "withdrawOwnersFunds()", +"52c700ea": "crowdsaleStop()", +"52c743d2": "callDestination()", +"52c76b8e": "TokenGame(uint256)", +"52c76de9": "addDiscountPhase(string,uint8,uint256,uint256)", +"52c790ee": "confirmTokens(address)", +"52c7c9e4": "isSubmission(bytes32)", +"52c8df64": "getFund(uint256)", +"52c91d43": "getLinkedWETHAddress()", +"52c944b2": "removeFromTokenLocked(address[])", +"52c98e33": "checkClaim(address,uint256,uint256)", +"52c9b906": "founderTokenWithdrawnPhase1()", +"52cb2a7b": "calcTransfer(uint256)", +"52cb36cd": "_getUtTotal()", +"52cb7688": "suspendSale(bool)", +"52cbfe09": "summAirdrop()", +"52cc5fdc": "retrieveMyEth(string)", +"52cd972d": "PreSaleCloseTime()", +"52ceac34": "bytesToUint(bytes,int256,bytes)", +"52cf4078": "transfertWDiscount(address,uint256)", +"52cf46d4": "transferAllowed(address,uint256)", +"52cfd41f": "advisorFee()", +"52d005d6": "findNewExchangeContract()", +"52d08730": "DogeCoin()", +"52d0bf14": "setDataColla_AA_02(string,string)", +"52d214a7": "removeUnitMultipliers(address,uint256,uint256,uint256)", +"52d23633": "getNumDividends()", +"52d28a17": "muscFundDeposit()", +"52d2d83d": "setBoolValue(bytes32,bool)", +"52d35197": "JLL()", +"52d3592a": "VoteExecuted(uint256)", +"52d3642d": "sellToContract()", +"52d3a9dd": "rentAuctionContract()", +"52d472eb": "rewardPercentage()", +"52d4747f": "BurnTokensFrom(address,uint256)", +"52d48a95": "getXPub(address)", +"52d4e76c": "ControllerRetiredForever(address)", +"52d50408": "statusContribution()", +"52d5ad25": "currentRecords()", +"52d63b7e": "setNextSale(address)", +"52d6804d": "minimum()", +"52d714e8": "approveMintingManager(address)", +"52d7d861": "AddrChanged(bytes32,address)", +"52d850d1": "tstinx()", +"52d8bfc2": "recoverEther()", +"52dbb027": "newModelShipProduct()", +"52dc09a5": "test_4_assertGasUsage700Boards()", +"52dca247": "ttlInvestCount()", +"52dd336a": "_tokenAllocate(uint8)", +"52e021c2": "securityReg(address)", +"52e0d025": "maxUserPayment()", +"52e0d0fa": "BIPOOH_DAO_32_a()", +"52e11d12": "DanCoin()", +"52e1ea89": "setDonator(address)", +"52e2525f": "ownerSetFee(uint256)", +"52e2f9ea": "MerculetToken(uint256,uint8,string,string)", +"52e32a55": "bounty0xToken()", +"52e34245": "disputeTX(uint256)", +"52e3d369": "saleConversionRate()", +"52e40d96": "PPKToken()", +"52e43613": "approveToMint(uint256)", +"52e536ad": "icoLeftSupply()", +"52e578ad": "LOG_EmergencyAutoStop()", +"52e57d1f": "makeLogError(uint8,uint256,uint256)", +"52e60b90": "setTalentCardAddress(address)", +"52e686a0": "EnableReturnFunds()", +"52e68c46": "list_token_ask(address)", +"52e8f2c3": "deleteRecord(uint256,string,string,bytes32)", +"52e94beb": "setPrice(uint256,bool)", +"52e97326": "changeTotalSupply(uint256)", +"52ea5667": "getMPbyIndex(uint256)", +"52ea8a71": "setRandomApiKey(string)", +"52eae80b": "doProvideStateRoots(uint256,bytes32,bytes32[])", +"52eb2580": "Tethered(address,string,string,uint256,uint32,uint256,uint256,string)", +"52eb5751": "MedicoHealthContract()", +"52ec8a58": "mint_and_transfer(address,uint256)", +"52ece9be": "freezeAllowance(uint256)", +"52ecf7c4": "pickWinner(uint256,bool,bool,bool,bool,bool,bool)", +"52efd35f": "INCENT_FUND_VESTING()", +"52efea6e": "clear()", +"52effe11": "transferOwnershipTo(address)", +"52f17ce9": "pomda()", +"52f18042": "addAdditionalBonusMember(address)", +"52f1e07b": "ethRefundAmount(uint256)", +"52f1f48c": "setInv3(address)", +"52f29a25": "nextPunkIndexToAssign()", +"52f37c40": "isHodler(address)", +"52f445ca": "setAssociatedContract(address)", +"52f46769": "InitializedTier(uint256,uint256,uint256,uint256,uint256)", +"52f50db7": "initiate(uint256,bytes20,address,address,uint256)", +"52f59e0e": "AICH()", +"52f62195": "picops_enabled()", +"52f662bb": "sendTokensToInvestors(address)", +"52f6747a": "rules()", +"52f6ca76": "deadDragons()", +"52f6ee58": "exponent()", +"52f775c8": "ViewSecretBet(address)", +"52f7c988": "setFee(uint256,uint256)", +"52f804a8": "burnPollStake(address,bytes32)", +"52f84b1b": "BlangsakToken()", +"52f8a766": "TimeStampSubstructOneDay()", +"52f9058b": "getFreeRickAndMorty()", +"52f91acf": "triggerDispute()", +"52f97117": "createContract(bool,string)", +"52fa1ac2": "createUnicornForCandy()", +"52fa2650": "withdrawPercents(uint64)", +"52fa3712": "makeBet(address,uint256,bytes32)", +"52fb0561": "setWhitelistedTransferer(address,bool)", +"52fba25c": "attack(address,uint256)", +"52fbeb57": "transferToContractWithCustomFallback(address,uint256,bytes,string)", +"52fc01f9": "func_1(uint256,uint256)", +"52fd2c15": "ServiceStation()", +"52fdcc65": "GAME_SUPPLY()", +"52fdeef5": "_addToFundHWC(uint256)", +"52fe8163": "randomDS_sessionPubKeysHash()", +"52fea23c": "teamAllocator()", +"52fedceb": "getMarketComissionRatio()", +"52fedefa": "decrementBalance(address,address,uint256)", +"52ffeb30": "highestBidTime()", +"52ffff99": "addAllowContractList(address)", +"5300a306": "changeTransactionFee(uint256)", +"5301fa52": "setPromoCode(address)", +"5302470a": "submitPlaintext(uint32,uint32,uint256,uint256)", +"530266c7": "getSellOrderInfo(address,address)", +"5302a136": "fourthPriceTime()", +"53030d91": "investmentAddress()", +"5303a5d7": "RESEARCH_DEVELOPMENT()", +"53043490": "ownerTransferFrom(address,address,uint256)", +"53047154": "createPromoMovie(address,string,uint256)", +"53055262": "awardMarble(uint256,address)", +"53055481": "totalDeposited(address)", +"53056351": "DIGIPLACEDS()", +"53067968": "GetSellingTokenContractAddress()", +"53069df6": "getRepaidAmount()", +"5306a5af": "LogRollbackTransfer(address,address,uint256)", +"530795fb": "initNormal()", +"5308db4b": "finalizeBundleIPFS(bytes32,string,bytes32)", +"5309ce38": "PrintLimiter(address,address,address,uint256)", +"530abf0f": "distributeTokensToContributor(uint256,uint256)", +"530b1e1a": "recording(address,uint256)", +"530c435f": "whaleWantMyEther()", +"530c4ca6": "setGames(address)", +"530c515e": "stake(uint256,address,uint256,uint256,uint256)", +"530c6868": "getContributorETH(address)", +"530d26b0": "MattewWon(string,address,uint256,uint256)", +"530d44f4": "normalRate()", +"530dfad3": "addItemToUserDebt(address,bytes32)", +"530e3543": "addMemberToGroup(address,uint256)", +"530e784f": "setPriceOracle(address)", +"53105fbc": "tokenConversionFactor()", +"5310f0f4": "priceInUsd()", +"531163c1": "TOKEN_MAIN_CAP()", +"53127b88": "encrypt(uint32[26],uint32[4])", +"5312918b": "VestingEndedByOwner(address,uint256,uint256)", +"5312aa24": "Bigchaintoken()", +"5312ab19": "HoviiExchange()", +"5312b4bb": "pyrBalanceOf(address)", +"53135ca0": "presaleActive()", +"5313d890": "_markCredit(address,uint256)", +"53147d4f": "TokenCrowdsale(uint256,uint256,address,uint256,address,address)", +"531571a9": "connectTokens(address,address)", +"5315810e": "isSponsor(uint32,int256,uint32)", +"53176195": "witnesses()", +"53179413": "transfersBlocked()", +"5317e444": "removeUserPermission(address,bytes4)", +"5319418a": "transferLockedBalance(address)", +"5319ae10": "generateInstance(address[2],bytes,bytes32[2],uint256[3],bytes32[3],bytes,bytes)", +"531a7f29": "dateProductCompleted()", +"531b6d98": "LogHodlSetStake(address,address,uint256)", +"531b97d7": "oneCentOfWei()", +"531c1b33": "getOperatingBudget()", +"531c267e": "getGameResolverData(uint256)", +"531c8628": "amount_referral_invest()", +"531c9a56": "iPayStar()", +"531ca478": "VantageCrowdsale(uint256,uint256,uint256,uint256,uint256,address)", +"531ce262": "bankWithdraw(address,uint256)", +"531d1974": "testThrowRetractLatestRevisionEnforceRevisions()", +"531e1ee0": "EarlyPurchaseInvalidated(uint256)", +"531e4827": "poolTimeLastMinted()", +"531ebce5": "getReceiverAddress()", +"531ef079": "setBvToBpFee(uint256)", +"531efbee": "_score(bytes32)", +"531f0ade": "_adjustValue(uint256,uint256,uint256)", +"531f4c40": "accept(bytes32,bytes32)", +"531ff93b": "setMrkContract(address)", +"53214e5a": "kilo()", +"53216223": "TravelCoin()", +"5321fe04": "subFromBalance(address,address,uint256)", +"5322f0c5": "getChannelOwner(bytes)", +"5322f9d1": "switchSale()", +"532399d9": "setTransContractLocked(bool)", +"5323c6cf": "calcCostsBuying(bytes,uint256,uint256[],uint8,uint256)", +"5323df9e": "getShipDetails(uint32)", +"53240172": "midiv(uint64,uint64)", +"53251389": "addBridgeNativeFeeReceivers(uint256)", +"5325dc16": "test_validShouldBe3()", +"53269475": "loveToken()", +"5326ba37": "setSaleAuctionERC20Address(address,address)", +"53270910": "deedOfOwnerByIndex(address,uint256)", +"5327f96e": "OwnerTransfer(address,address)", +"53286957": "CuboToken(uint256)", +"53290b3a": "setStateLoading()", +"53290b44": "getBalanceOf(address,address)", +"53290d1c": "founderGrant(address,uint256,uint256,uint256,uint8)", +"53295e44": "OtcgateToken(uint256,uint8,string,string,address)", +"53297b71": "completeReleaseAuction(uint256)", +"5329c681": "checkTimeout(uint256)", +"532af7d2": "calculateResult(uint256,uint256)", +"532b581c": "round2()", +"532b5f86": "createBytes32(bytes32,bytes32)", +"532c3dc5": "nAuditors()", +"532da8f9": "getDelayDays(uint256)", +"532e4849": "setTokenUriPrefix(string)", +"532e7e6a": "calcEarningsSelling(bytes,uint256,uint256[],uint8,uint256)", +"532e87e4": "setTimeForCrowdsalePeriods()", +"532eb619": "_sellTokens(uint8,address)", +"532f1041": "setFormat(bool)", +"532f1179": "refundsEnabled()", +"532fb092": "isApproveConfirm(uint256)", +"532ff308": "setBonusRates(uint256[],uint256[])", +"532ff568": "Tutancoin()", +"533019cb": "kyberReserve()", +"5330a4c6": "buyMicroKeys(string)", +"5330bc61": "disallowTransfer(address,bool)", +"533178e5": "get_rate()", +"53322527": "EthlanceViews(address)", +"5332510b": "EthernautsLogic()", +"533265e6": "Database()", +"53329856": "secondBuyPrice()", +"5333c507": "allowTransferFor(address,bool)", +"5333ee4d": "buyEgg(uint256,uint256)", +"533425a5": "icoPeriod()", +"5334398f": "addRecordwithReward(bytes32,string,string,address)", +"53344481": "isInTier1(address)", +"5334c231": "currentSwapRate()", +"533574ca": "getLastDividends(uint256)", +"53358fc4": "castVote(address)", +"5336cd16": "_getEndIndexKey(uint256)", +"5337421a": "TrumpBingo()", +"5337448e": "payWinners()", +"53376d1f": "revokeAuthentication(address)", +"5337fa10": "awardPoint(int256,bytes32)", +"53384da7": "updateTier(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"5338b3e4": "miningTokenLeftInCurrent()", +"533945df": "editMemeTemplate(uint256,string,string,string,string)", +"53397be3": "lastConsolationPrize(uint256)", +"53398119": "emergency(bool)", +"533a645c": "minTx()", +"533ae8e5": "inTipperQueue(uint256,address)", +"533b180e": "LAcoin()", +"533c023b": "getGroupRight(string,string)", +"533d4270": "ClipperCoin(uint256,uint8,string,string)", +"533da8df": "getAreaOwner(string)", +"533de9e5": "addSmartContractByAddress(address)", +"533e00ec": "approveAndDo(address,uint256,address,bytes32,string)", +"533f6730": "clearInventory(uint256)", +"53400e7f": "debugNow()", +"534104df": "UnilotTailEther(uint256,address)", +"5341903b": "upgradeMe(address)", +"5341d618": "setDataColla_AB_02(string,string)", +"53423e50": "MaengDevToken()", +"5342da41": "testBeyond()", +"5343e6a4": "rateFinalStage1()", +"5343f1a0": "cancelOrderWithMerchant(string,address)", +"534439a3": "mintingDec()", +"53448316": "MIN_SALE_AMOUNT()", +"53449d26": "TourPool()", +"534514ee": "adminCharge_p3()", +"53458f5e": "defaultTreesOwner()", +"5345c415": "LogOwnerAdded(address)", +"534607fb": "info_OwnerOfContract()", +"53462d6b": "getReleaseTime()", +"53462fd8": "NCPTokenDeposit()", +"5346dcc5": "calculateTokensEnabledforAirdrop(address[],uint256)", +"5347d58c": "Paradime01()", +"534844a2": "withdrawAmount()", +"534878fb": "reply(address,address,bytes32,bytes32)", +"53488f0a": "activateAuction(uint256)", +"5348ac95": "makeTokensTransferable()", +"53490c67": "earlySuccessBlock()", +"53490fbb": "EPR()", +"53497794": "RepublicKey(address[])", +"534992c8": "showTokenBalance(address)", +"5349a335": "setThirdAdmin(address)", +"5349cdb6": "Testcoin()", +"5349efdc": "generatetoken(uint256)", +"534a2f7c": "WTechCoin()", +"534b0391": "getVerifiedInfo(address,address,string)", +"534c2609": "checkBtcRequestSignature(bytes,bytes,uint256,bytes)", +"534d5acb": "initialBSTSupply()", +"534d5ce3": "RobaToken()", +"534ddf19": "reclaimContributionDefault(address)", +"534e05c1": "_goldFreeze(uint256)", +"534e2645": "getLucy()", +"534e3f81": "finishPVP()", +"534eb1d4": "offerBonus(uint256)", +"534eec2c": "Yacksoncoin(uint256,uint256)", +"534f6a2d": "LogGrantClaimed(bytes32,uint256)", +"53501052": "extraTokensPercent()", +"53511819": "triggerAssertError()", +"53515226": "getEtherProceedsAccount()", +"5351ad81": "FrellyToken()", +"5352aadb": "allowedBetAmount()", +"5352b889": "isNewRound()", +"53535db9": "deployWallet()", +"53537303": "bonusRatePeriodOne()", +"5353a2d8": "changeName(string)", +"5353e168": "rlc_team()", +"53547d3f": "mintBooty()", +"53554015": "newZeusPriceTicker(string)", +"53556559": "exchange(uint256)", +"5355ee2f": "CryptoSneakersCoin()", +"535779ef": "removeFromAddresses(address)", +"5357b989": "calculateFee(uint256,uint256,uint256)", +"53584939": "bytesToBytes32(bytes,uint256)", +"5358677c": "BACKUP_FOUR()", +"5358c119": "getFaucetByCreator()", +"535999aa": "getarg_3_input()", +"535a920c": "setLANDRegistry(address)", +"535b27dd": "BitImageTokenSale()", +"535b4e58": "adminResetLottery()", +"535bf003": "appVersionList(bytes32)", +"535c69b6": "setEthAuction(address)", +"535d1ab3": "claimWork(uint256,uint256,uint256)", +"535d3f22": "RankingBallGoldToken(address)", +"535d4156": "killWithBenefits()", +"535d9289": "RDPTicks()", +"535dc2b0": "_b1(string,uint256,string)", +"535e401c": "check(bytes32,bytes32,bytes)", +"535f23ad": "mainSaleStartDate()", +"53601ec5": "_transferFees(uint256,uint256[],uint256)", +"5360cd82": "GetContractInfo(string)", +"53613273": "setTymTokensWallet(address)", +"53613769": "setDistributorAmount(address,bool,uint256)", +"53613dd3": "creatorFeePercent()", +"536253a9": "getRandomForContractClanwar(uint256,uint256)", +"53636220": "depositToExchange(uint256,uint256)", +"53645caa": "rewardDays()", +"5364e45d": "setStartBalance(uint256)", +"5364f721": "getArbInfo(uint256)", +"536529dd": "WarpSpeed()", +"5365939c": "unlockedTokensInternal(address)", +"5365ccf7": "CCH_MENA_1()", +"53661f87": "initStorageOwner(address)", +"53663c0b": "distributeAIC(address[],uint256)", +"53667f10": "getContracts(address,address[],uint256)", +"5366d0fd": "operationalExpensesWallet()", +"5366f338": "publishFor(bytes12,address)", +"53677154": "placeAnswer(uint256,string)", +"5368cc55": "getBack2()", +"536942b6": "finalizeAndRestart()", +"536a3ddc": "currentGameId()", +"536aace8": "setUserSignupTokens(uint256)", +"536ab151": "onFailedAffirmation(address,uint256,bytes32)", +"536bd93a": "SetAccessoryDataContact(address)", +"536c1ddd": "SampleERC23Token(address,uint256)", +"536c26e5": "MiniMeIrrevocableVestedToken(address,address,uint256,string,uint8,string,bool)", +"536c2e4a": "sendEmail(address,string,bytes32,string)", +"536c8c15": "jurySize()", +"536c9a7f": "dividendFundAddress()", +"536cb736": "setPreUri2(string)", +"536cfceb": "todaysSupply()", +"536d888b": "isServiceOwner(bytes32,address)", +"536d97c2": "setDividendsPercent(uint256,uint256)", +"536db4a8": "getParametersHash(uint256[14])", +"536dd8f9": "maxTokensToSold()", +"536e08bc": "getTokensBalance(uint256)", +"536e2800": "buyForWorkOrder(uint256,address,address,address,string,address,address)", +"536e2c75": "challengeCanBeResolved(uint256,bytes32)", +"536e3f6a": "getOracleData(uint256)", +"537038c3": "BOUNTY_PERCENT()", +"5370a049": "thebank()", +"5370e3d4": "Ozreal()", +"53718569": "generateRandomStats(string)", +"537187a3": "transferWithMsg(address,uint256,string)", +"53719b6e": "lockedTokens(address,uint256)", +"5371e490": "Presalezillion()", +"53729273": "getLLV_edit_9()", +"5372a9ce": "addService(address)", +"5372c1db": "PeriodicTokenVesting(address,uint256,uint256,uint256,uint256,bool)", +"53734dc5": "refundContribution()", +"53738a4c": "distributeOwnedTokensFromOtherContracts(address,address,uint256)", +"53749313": "PortToken()", +"5374eec3": "hijack(uint256,uint256)", +"5375a828": "createLibraryWithFounder(string,string,address)", +"5375f182": "IronHandsCoin()", +"5376a03d": "getProfitOrLoss(address,address,uint256,uint256)", +"53770f9a": "isStateless()", +"53775572": "_claimOreAndClear(uint32,uint8)", +"53779c11": "claimDividendByIndex(address,uint256)", +"5377f047": "allowedMultivests(address)", +"53790097": "Exhibition()", +"53799e7d": "frozenType(string)", +"537a082c": "withdrawSaleRequest(uint256)", +"537a924c": "Pay()", +"537afe94": "eastadscreditsx()", +"537b9c93": "NotFomo3D()", +"537bf9a3": "updatePermissionName(address,bytes32)", +"537ca660": "_setPetValue13(uint256)", +"537dbb80": "claimUserToken(address)", +"537df3b6": "removeFromBlacklist(address)", +"537f5312": "updateSymbol(string)", +"537f74fc": "_transferFrom_byProxy(address,address,address,uint256,bytes)", +"537fcd6b": "_computeAndSetBaseParameters16_18_22(uint256)", +"537fdf59": "user_redeem()", +"538082af": "UKG_FUND()", +"53811553": "getCertificate(bytes32,bytes32,bytes32)", +"53813af8": "getmy(address)", +"5381464c": "PRE_SALE_START_TIME()", +"53819e85": "getTotalComission(address)", +"53822cda": "createShortId(bytes32)", +"53844552": "addPayees(address[],uint256[])", +"5384527a": "tokenResend()", +"5384602d": "craetePartnerBytes(address,address)", +"5384734e": "isConfirmedStackholder(uint256)", +"53850db3": "getParticipantById(uint256)", +"538548c5": "recevedEthFromEvabot(address,uint256)", +"538564de": "assegna_diritto_di_voto(address)", +"5385726e": "maxTIPSupply()", +"53865562": "CLOSING_TIME()", +"5386b7ad": "dtTestWorldSnapshot(uint256)", +"538739fa": "operatorManager(address[],uint8)", +"538741c5": "getAllowedContracts()", +"5387a233": "feeLottery()", +"538811cf": "hasAllocated()", +"5388842c": "mintTicket(address,string)", +"53892496": "finney2LemoRate()", +"538a289a": "getSandwichInfo(uint256)", +"538a3f0e": "initializeFactory(address)", +"538a849c": "newRound(uint256,uint256,uint256,uint256,uint256,bytes32,uint256)", +"538a8c21": "giveawayReserve()", +"538b9618": "createElectionVerify(bytes32,bytes32[])", +"538c91b2": "validCandidate(string)", +"538d1267": "Announcement()", +"538df6f2": "claimedPrepaidUnits()", +"538dfcac": "contributionRejected()", +"538e0759": "refill()", +"538e0ff4": "totUsers()", +"538e8ae0": "assertEq19(bytes19,bytes19,bytes32)", +"538eae06": "ZuperToken()", +"538f5997": "getBalanceSize()", +"538fb98c": "getCarProductCurrentPrice(uint32)", +"53900bdd": "incirculation()", +"5392279d": "CryptoWCRC(uint256,uint256,bool,address,address)", +"539407f6": "committeesNumber()", +"53941a74": "addInviteId(uint256)", +"5394772a": "MIN_BET_VALUE()", +"5394e49e": "getRandomPosition(uint8,uint8)", +"53954574": "withDrawBack()", +"5395dbb1": "createSchedule(address,uint256,uint256,uint256,uint256,uint256)", +"5397c83c": "distr0(address,uint256)", +"53994d51": "ThreeDJSToken(uint256)", +"53999040": "buyLandForCandy(uint256)", +"53999339": "prepareLiquidityReserve()", +"539af982": "changeStartDate(string)", +"539b9648": "icoSmartcontract()", +"539c0f14": "deposit2()", +"539e2bfb": "secondChainedCallback(uint256)", +"539f70d8": "setOperationState(uint8)", +"539ff41a": "ADVISORS_WALLET()", +"539ffb77": "cancelRedeem(uint256)", +"539fffc9": "WithdrawPrize()", +"53a01f68": "createWizzPanda(uint256[2],uint256,address)", +"53a023d1": "EUSBToken()", +"53a04b05": "play(uint8)", +"53a06609": "_incrementInventory(uint256,uint256)", +"53a1c51e": "getInitializeMarketValue()", +"53a3b71e": "tossIntoTheFire()", +"53a40850": "userHasPattern(address)", +"53a454e0": "SubtractAmount(uint256)", +"53a47bb7": "nominatedOwner()", +"53a4c8a3": "TriggminePresale()", +"53a4caee": "getMajorThreshold(address)", +"53a50f0f": "addDeal(uint256,uint256,string,string,uint256,bytes32)", +"53a5e2d9": "teamGrantsAmount()", +"53a5e68f": "CircusToken(address)", +"53a636dd": "updatePrice(uint256,uint256,string)", +"53a6e2c9": "Mantapjar()", +"53a73f6e": "setTotum(address)", +"53a8b307": "getObjective()", +"53a94aa6": "_computeNextSeedPrice(uint256,uint256)", +"53a9698a": "isProviderFor(uint256,address)", +"53a97873": "getPrice(bytes10)", +"53a9fc9c": "ELVToken()", +"53aa3f5e": "getUInt(bytes32,bytes32)", +"53aa7dcd": "setCallerFee(uint256)", +"53aaa63f": "collectBack2()", +"53aab098": "addPriceFeed(uint256,uint256,uint256,uint256,bytes)", +"53aab434": "buyIn()", +"53aaef7d": "weiToTokens(uint256)", +"53aaf7c7": "OperatorProductCommissionChanged(uint256)", +"53abf7f4": "parseTrade(bytes)", +"53ac36f4": "DropReward()", +"53acae4a": "RANGESTART_4()", +"53acb23f": "unlockPriceChange()", +"53adce21": "getGroup(address)", +"53ae8de6": "modify_Presale1StartDate(uint256)", +"53af5d10": "closingAddress()", +"53afda90": "initDiscounts(uint256[],uint256[])", +"53b0b620": "allocateBid1(address,bytes32)", +"53b15f31": "get_asset_details(bytes32)", +"53b1b49b": "Human()", +"53b239c7": "setPoWtfContract(address)", +"53b2dd41": "WGCToken()", +"53b382ea": "manuallyEnded()", +"53b5015c": "getClientSupply(address)", +"53b5306b": "getUnfreezingPrice(uint256)", +"53b54f5e": "transferWithoutDecimals(address,uint256)", +"53b5b427": "team4LockEndTime()", +"53b5b50a": "publish(bytes32,string,bytes32)", +"53b64b0b": "setNumDepositsSigned(bytes32,uint256)", +"53b6f766": "addTotalIndividualWeiAmount(address,uint256)", +"53b7a59b": "destinationWallet()", +"53b7b2e9": "cEthereumlotteryNet(bytes)", +"53b86342": "withdrawOwnersMoney()", +"53b8e278": "upgradedContract()", +"53b90b5b": "addWalletEmail(address,string)", +"53b93358": "_getPoS(address)", +"53ba11d0": "icoWalletAddress()", +"53babaf9": "processStellarReward()", +"53bad0b9": "boschcoin()", +"53bb2eb6": "buyOffer(uint256,uint256,address,bytes32)", +"53bc147e": "lastKickoffDateBuffer()", +"53bc1c12": "getJobState(uint256)", +"53bc1d9b": "ONTOPToken(uint256,string,string)", +"53bc373d": "SIT(address)", +"53bc7399": "play_stone()", +"53bc7d62": "setInvalidWithReturn()", +"53bd353b": "EarlyTokenSale(uint256,uint256,address,address)", +"53bd755a": "__setTokenPrice(uint256)", +"53bd8bdb": "isRequestExecutable(uint32)", +"53beb1f8": "checkHalfLife()", +"53bfd3d0": "getUserTearAward(address,uint256,uint256)", +"53c048ce": "TICToken()", +"53c06966": "startMining(address)", +"53c194af": "createIco(uint256,uint256,uint256,uint256,uint256,address)", +"53c1b31f": "MooToken(uint256,string,string)", +"53c24064": "EasyMineTokenWallet()", +"53c2828f": "rentalBalanceRemaining()", +"53c2e8ab": "FacebookCoin()", +"53c3419b": "bet(uint256,uint256,uint256,uint256,uint256,uint256)", +"53c37276": "frozenDaysForPreICO()", +"53c3a57d": "recalcFlags()", +"53c3cc1f": "ResumeEmergencyStop()", +"53c3fe8a": "hasICOClosed()", +"53c4aeac": "crowsaleSlots(uint256)", +"53c549da": "LemonContract()", +"53c64fbc": "peekQueue()", +"53c66d90": "YEEToken()", +"53c7186c": "test_token_creation()", +"53c7801c": "second_round_start()", +"53c8388e": "updateMetadata(uint256,string)", +"53c84526": "setSmartAffiliateContract(address)", +"53c86cfc": "UvoCash()", +"53c9843f": "preIcoCashedOut()", +"53ca1aa8": "GOLD_TO_COLLECT_1SWORD()", +"53cae7b8": "distributeAirdropMultiPresale(address[],uint256[],uint256[])", +"53caf582": "testThrowSetNotUpdatableNotOwner()", +"53cb26c6": "preciseDecimalToDecimal(uint256)", +"53cb430f": "setoldtoken(address)", +"53cc2fae": "unFreezeAccount(address)", +"53cc3e7a": "sysPrice()", +"53ce0a71": "USACoin()", +"53ce7de9": "participantIndex()", +"53ce910e": "getSafeKey(uint256)", +"53cea153": "claimableOwnerEth(uint256)", +"53ceee6c": "icoBuy()", +"53cf4d2b": "indexshow(address)", +"53cf51bc": "rewardSent()", +"53cfdda3": "setMonthlyPrice(uint256)", +"53d0f255": "STEP()", +"53d142a7": "setTokenInfo(uint16,string,address,uint64,uint256)", +"53d2822d": "isVesterManager(address)", +"53d3e848": "abortICO()", +"53d3ed60": "isBotAt(address,uint64)", +"53d3eeee": "profitsRatePercent()", +"53d413c5": "removeKey(bytes32,uint256)", +"53d590bc": "softUndelete(bytes32)", +"53d69b07": "setPreSaleStartAndEndTime(uint256,uint256)", +"53d6fd59": "setWhitelist(address,bool)", +"53d70700": "setVotingParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"53d736ed": "CreateCard(uint256,string,string,string,string)", +"53d73718": "voting_info()", +"53d74fdf": "totalHolders()", +"53d797c9": "GetGoodsInfo(uint32)", +"53d7edbc": "_crowdsalePaused()", +"53d838b6": "getMatchAwayPlayers(uint256)", +"53d97e65": "setPrizes(uint32[])", +"53d99c2a": "tokenToEthRate()", +"53d9d910": "create(address[],uint256,uint256)", +"53da0c7e": "bonusesForAmountsCount()", +"53da4859": "ACT()", +"53dad947": "oraclizeContract()", +"53db1deb": "DredgrSwap()", +"53db5fdb": "getCreatorTAOSettingDeprecation(bytes32)", +"53db6b21": "AUMToken()", +"53dba812": "Horizon0x()", +"53dc4cf1": "Greedy()", +"53dd1902": "strcat(bytes,string,bytes,string)", +"53dd8881": "tweakDailyDividends(uint256,uint256)", +"53de63e3": "isMasterWallet(address)", +"53e0b78f": "LandClaimContractSet(address)", +"53e0c46d": "nuoyilian(uint256,string,uint8,string)", +"53e1509c": "addExchangePartnerTargetAddress(address)", +"53e1a169": "doPayment(address)", +"53e1ead9": "companyAddress()", +"53e215f4": "getNodeInfo(uint256)", +"53e3926c": "compareNums()", +"53e4d8ef": "admin_set_withdrawable(bool)", +"53e4e607": "get_parameters()", +"53e551ff": "createContractItem(string,bytes32,address,address)", +"53e68147": "emissionInternal(uint256)", +"53e68720": "sendToBeneficiary()", +"53e7168b": "setUInt(bytes32,bytes32,uint256)", +"53e7d39c": "batchTtransferEther(address[],uint256[])", +"53e7daf2": "NewStandardToken(uint256,string,uint8,string)", +"53e86a88": "contributorsTotal()", +"53e8c040": "Winn()", +"53e9574a": "FOUNDERS_TOKENS_PERCENT()", +"53e9dcae": "attributeType(uint256)", +"53ea04fe": "AgencyLock2()", +"53ebf6bd": "setContractLock(bool)", +"53ecbdd2": "getTankType(uint256)", +"53ed5143": "getAll()", +"53ed589b": "LogNewProvider(address,string,bytes32)", +"53ee9114": "PassDao()", +"53eeb430": "allPurchasedSprites(uint256)", +"53ef5e03": "amount5()", +"53ef6781": "_start()", +"53efb13f": "setContractDurationInDays(uint16)", +"53f072e3": "numApis()", +"53f11cb3": "asm_clean(uint256,uint256)", +"53f24e33": "isUpgradeInterface()", +"53f25ca6": "isNameEmpty()", +"53f3807c": "STATE_PLAYING()", +"53f4a519": "queryResource()", +"53f4b36f": "calcFin()", +"53f4db01": "totalWeiRaised()", +"53f63bb3": "setPreSaleFinishDate(uint256)", +"53f65cf7": "forceRecoverCollateral(bytes32,address)", +"53f6740d": "setKpopItemContractAddress(address,address)", +"53f6ef28": "EUFBToken()", +"53f6f01f": "ADVISOR_STAKE_TWO()", +"53f754e0": "tokensDue(uint256)", +"53f818d6": "checkBetValue()", +"53f81ef8": "getSubscriptionTo(bytes32)", +"53f8e415": "SetDonateStep(uint256)", +"53f92e49": "UnableToRejectPayment(address,bytes8,uint256)", +"53f95cc6": "THIRD_TIER_DISCOUNT()", +"53f9ca96": "CCC(uint256,string,string)", +"53f9ec67": "setIsInvalid(bool)", +"53faa9a9": "changeRecovery(address,address)", +"53fafd15": "makeTransfer(uint256)", +"53fb9233": "checkDocument(string)", +"53fc3923": "safeAdd40(uint40,uint40)", +"53fc79d1": "setTargetDiscountValue5(uint256)", +"53fd0670": "sellArtworks(uint32[])", +"53fe12b0": "setusertoken(address)", +"53fe189c": "setAElfMultisig(address)", +"53fe7a59": "PURCHASER_MAX_TOKEN_CAP_DAY1()", +"53fefd7d": "changeMaxDeposit(uint256)", +"53ff7766": "_escrowTheAOPaymentEarning(bytes32,uint256,uint256,uint256)", +"53ffab1d": "disableconstruction()", +"53ffe1f9": "setRentalPricePerSecond(uint256)", +"5400a93e": "payoutMatch(uint256,uint8,bool)", +"54019949": "getShopOwnerCategorizedProducts(string,string)", +"540273bb": "changejp1(address)", +"54032862": "ZapCloud()", +"5403a0e5": "getTeamToken()", +"5404bbf7": "getEntropy()", +"54057aa6": "setPriceClaim(uint256)", +"5405e4f4": "SMILE()", +"54063f4e": "sendETHfromContract()", +"54070f83": "getTournamentAdmissionBlock()", +"54091a20": "removeFromTransactionDisallowedList(address)", +"540a5e4e": "cs()", +"540a9db3": "getVestingAccount(address)", +"540ae26f": "MassERC20Sender(address)", +"540b2255": "_invest(address,address)", +"540b34a0": "listMOC()", +"540c755f": "ethWithdraw()", +"540c97c8": "getAllRevisionIpfsHashes(bytes20)", +"540cafe0": "storeHeaderWithFee(bytes,int256,address)", +"540cc484": "getPreSaleTokensSold()", +"540cf75e": "getPendingPresaleTokens(address)", +"540d888e": "SendTaxFee(address,address,address,uint256)", +"540d915e": "serviceGroupChange(address,uint8)", +"540e2f5b": "customTokenDefrosting(address[])", +"540ea6db": "getuseraddress(uint256)", +"540f3d6d": "feeProcess()", +"540f5631": "isUnderwriter()", +"540fd4df": "addressFundFoundation()", +"54105974": "AdHiveToken(address,string,string,uint256,uint256)", +"54107401": "declareLove(string,string)", +"5410ac50": "raiseCap(uint256)", +"5411029d": "_validSignature(address,uint256,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"54114dee": "Caps()", +"5412af17": "Watsondog()", +"541334f6": "isUnicornContract(address)", +"5413d6f4": "ImmlaToken(address)", +"54147ecb": "withdrawForTokens(address)", +"54149777": "getAirDropedToday()", +"54149975": "DeleteToken()", +"54151bc3": "createPostboyAccount(uint256,uint256,bytes16)", +"54153f91": "getArrIntField1()", +"5415b8f8": "setAssetFeesList(address[],uint256[],uint256[])", +"5415c86e": "chngReNo(uint256)", +"5415f3a7": "buyStudioStake(address,uint256)", +"5416707c": "getEthOfferAmount(uint256)", +"541694cf": "get_exchange(uint32)", +"5416995e": "TGCToken()", +"5416a724": "isUserKYCed(address)", +"54186bab": "SolarDaoToken()", +"5418796c": "pubKeyToEthereumAddress(bytes)", +"5418bea9": "getCountReadyPlayerByTrackId(uint256)", +"5418ecdd": "setTokenHash(uint256,uint256)", +"54192046": "setAuctionStart(address,address,uint256)", +"541a01ed": "presaleTokenVault()", +"541a3656": "optionOrderCancelled(bytes32)", +"541ac2b3": "locked_since()", +"541aea0f": "put(uint256,uint256)", +"541afaf6": "getWarriorDistributedRandom(uint256)", +"541b2173": "IKT(uint256,string,uint8,string)", +"541bb358": "setRarityTargetValue(uint8,uint256)", +"541c15eb": "changeLock(address,uint256,uint256)", +"541d920c": "commit(bytes,string)", +"541dc9ba": "redeemPreSale(address,address)", +"541e22ea": "sendRefBonuses()", +"541e34a7": "QuantumPay()", +"541ee050": "bonusEnd10()", +"541f631a": "transferInternal(address,uint256)", +"54203101": "CTWorld()", +"54204ad4": "triple()", +"54215767": "upgradeTradeProfileImplementation(address)", +"54217c21": "Q2(address)", +"5421b037": "getDepositTransaction(address,uint256)", +"542241d0": "fifthExtendedBonusSalesEnds()", +"5422cf34": "sellPop(uint256,uint256)", +"54238645": "closeICO()", +"5423a05d": "GoToken(address,address,address,address,uint256)", +"54244518": "coinIssuedRewardPool()", +"54260cb6": "getBuyLandInfo(address,uint256)", +"5427789c": "MINT_AMOUNT()", +"54279bdd": "createAuction(uint256,uint256,address)", +"5427e4e1": "APS(string,string,uint256)", +"5427e8fa": "getTicketIsPaid(uint256)", +"54280260": "balancesLocked()", +"54290065": "getAsksCount()", +"54292c53": "rewardAvailableCurrentDistribution()", +"5429a417": "getBasicBallotsPer30Days()", +"5429d4b5": "mitfwdToken()", +"542a3368": "randomly_select_index(uint256[])", +"542a90bd": "remove_quote(bytes32,bytes32)", +"542aa99f": "stopSetup()", +"542aee37": "getTotalTonsClaimed()", +"542b5111": "MANXERC20()", +"542b9a40": "ProjectOwner_DisableProject(int256)", +"542bdb4d": "testMathOverloaded()", +"542bee82": "addGlobalBlockValueBalance(uint256)", +"542c8f37": "isOnSell(uint256)", +"542cad3d": "setCopaCoreAddress(address)", +"542cae98": "checkGameOverByUser()", +"542ccddb": "claimRoundReward(uint16,address)", +"542ceaad": "countRequest()", +"542cfdf0": "extendItem(address,uint256)", +"542d397c": "tokensBlocked()", +"542d3e34": "NewImage(uint256,uint8,uint8,uint8,uint8,string,string,string)", +"542d8dc0": "Mag50()", +"542de573": "BITHALALToken()", +"542df7c7": "getGameConstants()", +"542e8618": "dynamic_profits(address)", +"542e898e": "STC()", +"542e9b18": "logFeeWindowBurned(address,address,uint256)", +"542fce21": "KergToken(uint256,string,uint8,string)", +"542fd556": "getMakerProjects(address)", +"542fe6c2": "withdrawFromAbandoned()", +"54311422": "giveTokens(uint256)", +"54313b22": "tonextround()", +"5431dfb8": "stage3Sale()", +"5432202a": "isServiceAccount()", +"54353f2f": "example()", +"543577f3": "LandManagement(address)", +"543594b8": "verifySignature(uint8,bytes32,bytes32,address,bytes32)", +"5435a774": "Permissioned()", +"5435bac8": "itemsForSaleLimit(uint256,uint256)", +"5435dbd4": "CPF()", +"54361699": "registerContributorPool(address,uint256,int256)", +"54367179": "updateRealWorldPlayer(uint32,uint128,uint64,uint32,bool,bool)", +"5436c163": "createVillain(string,uint256,uint256,uint256)", +"5436e5a0": "getValueByHash(bytes32)", +"54370a8d": "QueryMyBonus(address)", +"5437988d": "setVerifier(address)", +"5437b39b": "hasUnprocessedDividends(address)", +"5437e401": "withdraw(address,bool)", +"5437f098": "changeStartBlock(uint256)", +"54385526": "setStatus(uint8,uint8,string)", +"5438a64e": "getContractSigners(bytes32)", +"5438c5d2": "hasListener()", +"54392a96": "simTotalObligation(bytes)", +"5439af13": "getIdeaDescription(uint256)", +"5439c6a1": "nonFungibleByIndex(uint256,uint128)", +"5439e185": "buyTreeTokens(address,uint256)", +"5439f5d2": "TimeToken(uint256,string,uint8,string)", +"543a3d62": "token_call()", +"543a86f6": "dblShaFlip(bytes)", +"543a9ce4": "setAStore(string,address)", +"543ad1df": "MIN_TIMEOUT()", +"543b4f6f": "endTimeTwo()", +"543ba50a": "FundsDeposited(address,uint256)", +"543e0a7b": "stringsEqual(string)", +"543e10b4": "contributeTo(address,uint256)", +"543e4dcd": "testFailUntrustedTransferFrom()", +"543e9954": "freeBalanceOf(address)", +"543e9c10": "containsAdmin(address)", +"543f8101": "activateOversightAddress(address)", +"54400c60": "right19(uint256)", +"544082e5": "authorShare()", +"54409599": "SHIVToken()", +"54413d29": "withdrawAllForAccount(address,address[])", +"544447bb": "unicornToken()", +"5445cbf3": "assetsCertified()", +"5445e38c": "_isCycleValid(uint256)", +"5446b604": "unlockMintDate2()", +"5446d669": "ShitToken()", +"544736e6": "isStarted()", +"544743d6": "getCharAt(uint256)", +"5447ad71": "newGame(bytes32)", +"5447b86f": "ipart(int256)", +"5447c05d": "updateTemplateReputation(address,uint8)", +"5447fab0": "serviceController()", +"5448c674": "IBCA()", +"544a026b": "protectCharacter(uint32,uint8)", +"544aa2cf": "LOG_BetLost(address,uint256,uint256)", +"544b1b24": "onlyHarvest(uint256)", +"544b9606": "ICO_BONUS2_SLGN_LESS()", +"544be427": "finalizeBurnUtility(address,uint256)", +"544c465c": "calcReward(uint256)", +"544cdbda": "send_to_owner(address,uint256,uint32)", +"544cfead": "reignBlocks()", +"544d6544": "transferPrivateSale(address,uint256)", +"544d8ca2": "registerLog(string,string,uint256)", +"544d9723": "itemAt(uint256)", +"544f113b": "startingAmount()", +"544f43e3": "getRatePlansOfVendor(uint256,uint256,uint256,bool)", +"544ffc9c": "proposalVotes(uint256)", +"5451436d": "EthLyte()", +"54517ddf": "transferFromByCrowdsale(address,address,uint256)", +"5451a1e1": "addressFounders()", +"5451cbcc": "ZEToken()", +"5451fb26": "increaseLoanOnBehalfOf(address,bytes32,uint256,uint256)", +"5452644d": "createNewDynamicPaymentAddress(uint256,address)", +"5452b7d4": "getReservedTokens(uint256)", +"545305fb": "finalizeCrowdsaleAndToken()", +"5453095b": "buyMNC(string)", +"545342a0": "ZaiZaiCoin()", +"5453f4e7": "createTokenUri(address,address,address,address,address,address,address,uint256)", +"545464ff": "ConsentFactory(string,address)", +"5454d6e0": "isMilestonesSetted()", +"5454fb7c": "ico1Sold()", +"54557250": "getAgentIdByPositionBet(uint256)", +"545599ff": "END_DATE()", +"5455e1b8": "setAddressesThatCanList(bool,address[])", +"54567923": "addServiceReward(uint256)", +"54569a86": "Needit()", +"5456d8d2": "removeSpecialBonusConditions(address)", +"54573835": "withdrawEtherInternal(address,address,uint256)", +"54573cfc": "setRule(uint256,uint256,uint256,uint256)", +"545842ff": "redeemLevAndFeeToStakers(address[])", +"545921d9": "providerRegistry()", +"545a153a": "getId(uint256)", +"545a5896": "changeSolidStampContract(address)", +"545ae0f6": "TokenFundTransfer(uint256)", +"545b2f0d": "getUpgradeAmt(uint256)", +"545c50f0": "pointRootNode(int256,address)", +"545c5a02": "setStepTwoLockEndTime(uint256)", +"545c5d54": "deliveryService(uint256,uint256,uint256)", +"545d2e29": "invalidateAdvertiserRefund(uint256)", +"545d5988": "claimCheckPriceReward()", +"545d8b55": "minCapFail()", +"545e6362": "PRE_ICO_BONUS_TIME_1()", +"545e7c61": "deploy(address,address)", +"545f6837": "returnSenderBalance()", +"54604eec": "stopAssign()", +"54605549": "setCoinBalance(address,uint256,uint8,bool)", +"5460687c": "test_chain2_3()", +"5460ef10": "sendWithExtraGas(address,uint256,uint256)", +"54610cea": "setProvider(address,uint256,uint256)", +"54612e27": "freeze(bytes32,bytes32,uint256,bytes)", +"54616911": "burnICOTokens()", +"54619b69": "eAccessTOKEN()", +"546216f1": "winningScore()", +"54622cef": "multiMintPreIco(address[],uint256[])", +"5462870d": "multisigAddress()", +"5463a2e4": "reasonableDiffInBps(address)", +"546434e3": "TwoStageSale(bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address,uint256,uint256,uint256)", +"546455b5": "assert3(uint256)", +"54653352": "beView()", +"54657f0a": "setHiddenCurves(bytes32[])", +"54659685": "getTicketsCount(address)", +"54659d99": "SPINFund()", +"546639cf": "JacksToken(uint256)", +"546668bb": "conquesting()", +"54672768": "Instrument()", +"54674ebc": "HackableToken()", +"54675320": "EventProduct(uint32,string,uint32,uint32,uint256,uint256,uint256,uint256)", +"5467e0a7": "redemption()", +"5467f508": "indPresaleDeposit()", +"5468e4e1": "setGameStateFusion(bool)", +"5469a173": "getFifthRoundReleaseTime()", +"5469aabb": "_diviSplit(uint256,address,address,uint256)", +"546b270d": "getServer(uint256)", +"546b48b1": "makeSimpleBundle(uint256,address,bytes32,bytes32)", +"546c2b93": "paid(uint256,uint256,bytes32)", +"546d08fe": "dividendAddress()", +"546dc0ac": "collectAsset(address,uint256)", +"546dc71c": "approveWithdrawAddress(address,address,bool)", +"546dd883": "privateAmount()", +"546e1959": "changeOwnerStart(address)", +"546e428c": "modifySender(address,bool)", +"546ea281": "currentAction()", +"546efd98": "indiFundAndSocialVault()", +"547069bf": "crowdsaleWeiRaised()", +"5470b13b": "getWallet(uint256)", +"5470f6db": "setMaxSet(uint256)", +"547173da": "endPresaleDate()", +"54717ea9": "getValueBonusTokens(uint256,uint256)", +"54718917": "determineWinner(string)", +"5471d5d8": "VetLite(uint256,uint256)", +"5471dd4c": "FourthAddressBalance()", +"54722412": "OfferZone()", +"54734f7d": "setBoardAdd(address)", +"54738157": "OwnerCloseContract()", +"5473b4e9": "getTransactionConfirmCount(bytes32,uint256)", +"5473c701": "test_oneInvalidFalseEqLog()", +"54741525": "getTransactionCount(bool,bool)", +"54741f8d": "getMemBestPromouter()", +"5474d4d7": "_transferBag(address,address,uint256)", +"5474fbd3": "isDayThirtyChecked()", +"547505e3": "tokenAdministrator()", +"5475c22e": "bindOrderFunds(address,bool,int256)", +"5476bd72": "addToken(address,address)", +"5476ea9e": "auctionAddress()", +"5476f49d": "m_totalAppCount()", +"5477d33f": "price_constant1()", +"5477e571": "handleMultipleItems(address,uint256,uint256,uint256,uint256,uint256)", +"54786b4e": "getDSTSymbol()", +"5478786c": "IDLE()", +"5478dbb7": "play(uint256[3])", +"5478f06f": "updateMDTRewardAmount(uint256)", +"5478f468": "getHistoryLength()", +"54790b7d": "isOvertime()", +"547916ea": "finishRound()", +"54791f36": "_transferWithReference(address,uint256,string,address)", +"5479d940": "isUpgradable()", +"547a5168": "TomocoinTokens()", +"547a5eee": "setWhitelistSetter(address)", +"547ac053": "saveInitialParametersToStorage(uint256,uint256,uint256,address)", +"547c165f": "getApprenticeChestAvailable()", +"547c1b6a": "SALE_START_DATE()", +"547c4137": "setLLV_edit_32(string)", +"547c8011": "DemocraticPalette()", +"547cae29": "uintToString(uint16)", +"547cbaa5": "addFrozen(address,uint256,uint256,bool)", +"547dd162": "_newAgon(uint64,uint64,address,uint256)", +"547dfaf5": "WthdrawAllToCreator()", +"547e3f06": "changeReceiver(address)", +"547e6a5b": "simulate(uint256,uint8,uint8,uint8,uint8,uint8,uint8[176])", +"547eeac1": "acceptTransfer()", +"547fd950": "getTotalFrozenBalance()", +"54812d17": "initialize(address,address,uint256,uint256,address,uint256)", +"54817301": "setFreezeEnd(uint256)", +"5481c1ff": "referBenefitRate()", +"5481f43e": "getProviderTitle(address)", +"54823e66": "getStateHash(uint256)", +"54828eb7": "placeBetEven(uint256)", +"54829cad": "dubi()", +"5482d73c": "getDocument(bytes16,uint256)", +"5482d88e": "telcoin()", +"54830df7": "getApprovedTokenCount()", +"54840c6e": "tradable()", +"5484b5bf": "thelocation()", +"5485868a": "roundFactory()", +"5485bb82": "w_Team()", +"5486dfb3": "distributeSupply()", +"548707cd": "_bid(uint40,uint128)", +"54876921": "withdrawMoney(uint256)", +"5487e055": "PRICE_MID()", +"5488cc80": "currentCheckpointId()", +"548942e1": "UbecoinICO()", +"548ad42e": "chfScale()", +"548b273a": "outstandingEther()", +"548b5e6b": "contractStartDate_()", +"548c0ef4": "getRank(address)", +"548c20be": "getMyName(bytes32)", +"548d4a54": "updateTransferFeeRate(uint256)", +"548d91b1": "getPage(uint256[],uint256,uint256,bool)", +"548db174": "removeFromWhitelist(address[])", +"548dd51e": "newContract(address,address,uint256)", +"548e0846": "lastCallBlock(address)", +"548f896c": "setHouseEdgeMinimumAmount(uint256)", +"548fe136": "doWorkAndPayTOT()", +"549060bb": "Competition(address,address,address,uint256,uint256,uint256,uint256,uint256)", +"54919a6c": "sendTokensSingleValue(address[],uint256)", +"549215a3": "amendEpoch(uint256)", +"54924aec": "adminsDisabledForever()", +"549262ba": "put()", +"5493a7f4": "importAmountForAddress(uint256,address,address)", +"549400bd": "valuee(uint256)", +"549503e5": "executeSell(address,uint256)", +"5495699f": "teamFund()", +"5495794b": "initialWei()", +"5495ca36": "MDC9Token(uint256,string,uint8,string)", +"5496b217": "createMintableBurnableToken(string,string,uint256,string)", +"549737e3": "setIBalance3(uint256,uint256,uint256)", +"549767c7": "balanceSpot(address)", +"5498e9e5": "AmericanAirlinesCoin()", +"5498eae4": "PAYA()", +"54990b15": "sendTranche(bytes32,address,uint256,bytes)", +"54999f6d": "initAmount()", +"5499c84e": "changeBonus(uint256,uint256,uint8)", +"5499dca5": "getMyStake()", +"549a9ffd": "changePiranhaName(uint256,string)", +"549aa194": "unreleasedAmount()", +"549bc193": "changeSwitchTime(uint256)", +"549bf4bf": "Liberty()", +"549bf9b9": "SFCapitalToken(string,string,uint8,uint256)", +"549c4627": "depositsOpen()", +"549c6bbb": "refundTokens(address,uint256)", +"549c7b58": "getAgon(uint256)", +"549caf35": "oxced()", +"549cbc7a": "startSale(uint256,uint256,uint256,address)", +"549d5e3b": "claimByAddress(address,address)", +"549d776a": "upgradeContract(uint256,address)", +"549ddcbd": "setFreezeHybridizationsCount(uint256,uint256)", +"549df19f": "resetAllWallets()", +"549eca74": "fpDiv(uint256,uint256)", +"54a019e2": "FOUNDER_FUND_2()", +"54a035aa": "_evaluateCategory(address,uint8,uint256,uint256)", +"54a04d2f": "setMigrateAgent(address)", +"54a0ebf5": "updateEntityName(uint256,bytes32)", +"54a1b431": "getVoteDetails(uint256)", +"54a1e232": "setSellOrdersContract(address)", +"54a28ded": "bhCheck()", +"54a2b2b8": "initialize(address,uint256,uint256,uint256,uint256,uint256,address,uint256,uint256,address)", +"54a325a6": "setKyberNetwork(address)", +"54a46211": "_removeInvestor(address)", +"54a598b0": "globalTokenTransferLock()", +"54a6c8c4": "toSmallrtc(uint256)", +"54a6ff68": "isVersionLogic()", +"54a874b4": "isSolved(address)", +"54a8b217": "qryModules()", +"54a8ca69": "transferAnyMEPToken(address,uint256)", +"54a8ed7b": "USD_CENT_PER_GZE()", +"54a9409e": "charge(address,uint256,uint256)", +"54a9de1c": "referrerBonus(address)", +"54aa0546": "MCNC()", +"54aa4e44": "setDisableBuyingTime(uint256)", +"54aac764": "SALE2_CAP()", +"54ab5561": "setOwnerTwo(address)", +"54ac2119": "EMJACTestToken()", +"54aca207": "iwithdrawal(uint256)", +"54acbe7b": "setSaleShare(uint256,bool,address,uint256)", +"54accc88": "OOREDOOCHAIN()", +"54ad2d22": "BitcoinCrown()", +"54ad7e1c": "setDividendDistributionPool(address)", +"54ad9718": "feePrice()", +"54adb7b1": "doNotAllocateBid(bytes32)", +"54adc686": "claimRewards(bytes32[],uint256[])", +"54ae8492": "CustodialForward()", +"54aee843": "MANHATTANPROXYMANAVE()", +"54af0d4c": "validAfter(address)", +"54af3548": "getSigner(address,uint256,address,uint256,bytes32,bytes32,uint8)", +"54afc9a9": "MyFirstToken()", +"54b025c5": "deleteRole(address)", +"54b02ba4": "cutoff()", +"54b0a26a": "getCPModel(uint256)", +"54b16510": "CreateProduct(string,string,string,string)", +"54b2a080": "valueAtIndexHasNext(uint256)", +"54b302c5": "maximumDeposit()", +"54b3fa58": "ServiceTask(string)", +"54b48428": "endTGE()", +"54b49859": "fmpContractAddress()", +"54b51fcc": "testNumberOfElements()", +"54b5aeac": "deleteDataPatternVoteRules(uint256)", +"54b61723": "round3Cap()", +"54b67057": "setTranformed(uint64,uint64)", +"54b6a520": "ICOFinished()", +"54b6ba95": "durationInDays()", +"54b6d871": "TempusToken()", +"54b6ed85": "AddNewCurrency(string,string,string,string)", +"54b7636e": "isKYCVerified(address)", +"54b84910": "needToReserve()", +"54b8c024": "fieldOrder()", +"54b8d5e3": "getName(bytes32)", +"54b8dd66": "countryItems(uint256,uint256,uint256)", +"54b8dfcb": "settleBuyer(address,uint256)", +"54b9b4fa": "UNLOCK_TEAM_1()", +"54ba34b5": "available_slots()", +"54ba7daa": "enter(bytes,bytes)", +"54bbd376": "getNextDate(uint32)", +"54bc16f2": "Exchanges()", +"54bdbd4d": "changeMinPeriod(uint32)", +"54be44f0": "updateMinimumStakingTokenPercentageEnabled()", +"54be50a5": "lastHoldingTax()", +"54beb2f4": "ProfitSharing(address)", +"54bec662": "removeValidation(address,bytes32)", +"54bef3b4": "getPlayerVaultsHelper(uint256,uint256,uint256,uint256,uint256)", +"54bf3a73": "playerToDungeonID(address)", +"54c0775f": "GetItems(address)", +"54c15020": "awardReferalBonus()", +"54c15b82": "isGeneScience()", +"54c29ce6": "assertOperationIsConsistent(bytes32)", +"54c35a3c": "setup(address,address,address,address)", +"54c3b0c4": "icoPhase3EndTime()", +"54c41fb9": "viewMerkleHash(uint16,uint8,uint8)", +"54c51813": "setFreelancer(bool,string,uint256,uint8,uint256[],uint256[],string)", +"54c552db": "setNumber(bytes32,uint256)", +"54c58dc9": "_getAllStorages()", +"54c5aee1": "collectReward()", +"54c5b696": "maxBonus()", +"54c5f850": "withdrawTokensFromAnyWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"54c72ead": "_getHardCap()", +"54c86628": "etsContract()", +"54c91295": "getEloScore(address)", +"54c916a1": "setOCPTokenContract(address)", +"54c93a4e": "lockTeamTokens()", +"54c990cf": "periodTimeFrame(uint256)", +"54c9cc44": "changePlayersName(string)", +"54ca435f": "PRESS_MARKETING()", +"54ca9095": "newEntity(bytes32,bytes32,uint256,uint256)", +"54cacaba": "QuarkChain()", +"54caf101": "bonus(uint256,uint8)", +"54cb5081": "getPromoMinPurchaseEth()", +"54cbe1e6": "gamePayoutResolver(address,uint256)", +"54cbffc4": "LimitOfMinutes()", +"54cc463b": "PreICOPrice()", +"54cc61bc": "Krown(uint256,string,uint8,string,address)", +"54ccdb0d": "seriesCSupply()", +"54cdac25": "usd2weiTopSales(uint256)", +"54ce0851": "round5TokensRemaning()", +"54ce7616": "TestTalk()", +"54cecb21": "AuthPending(address)", +"54cf2aeb": "swapFee()", +"54cf6668": "setEarlyInvestorExchangeRate(uint256)", +"54cfcd1b": "DEAWCOIN()", +"54cfe7d0": "nextForkName()", +"54d03b5c": "changeFeeMake(uint256)", +"54d05ad2": "changelp10(address)", +"54d06009": "whiteListAddress()", +"54d15005": "isDestroyed(string)", +"54d15347": "adminSuspendDeposit(bool)", +"54d18864": "totalProjectToken()", +"54d1b356": "GetBankerProfit(uint8)", +"54d1f77c": "UnpaidDivInt()", +"54d24f33": "TOKEN_PRESALE_LIMIT()", +"54d271fb": "unpause_1()", +"54d29b9a": "bidderWhitelist(uint256)", +"54d2a34a": "getHouseFee()", +"54d30c87": "release(uint256,bool)", +"54d3f3e4": "getTopInfoDetail(address)", +"54d41bbd": "unregisterAdmin(address)", +"54d4b7b2": "DateOfDeath()", +"54d4da57": "extractInvoicedLength()", +"54d50378": "winner_pool_amount()", +"54d5e127": "withdrawSettle(bytes32,bytes32)", +"54d68405": "LogFundAnswerBounty(bytes32,uint256,uint256,address)", +"54d6a2b7": "cancelSwap(uint256)", +"54d734e2": "createSubscriptionOffer(uint256,uint16,uint256,uint256,uint256,uint256,uint256,bytes)", +"54d79868": "getPositionBalance(bytes32)", +"54d7c34d": "transferAidrop()", +"54d87002": "showContributed()", +"54d89c92": "numberParticipants()", +"54d92ba9": "getCurrAuctionPriceTankID(uint256)", +"54d9d6f8": "findNextDay(uint256,bytes)", +"54da44db": "GetUserBetsInRaz(address,uint256)", +"54da5393": "Utils()", +"54da80c9": "Patney()", +"54dacb96": "numWhitelisted()", +"54daedc3": "transferCoins(address)", +"54db4547": "ethbuy(uint256)", +"54dcc49b": "_withdraw(address,uint256,bool,uint256)", +"54dcfb9b": "LinkToken(uint256,string,string,address)", +"54dd1da4": "releaseVestedTokens()", +"54ddd5d6": "retrieveRefund()", +"54dea00a": "getTokenRate(address)", +"54dfbca8": "setExtra(uint256,address)", +"54dfefb4": "DEEPPAYMENT()", +"54e030b7": "bonusDistributionAddress()", +"54e031cb": "setLockAccInfo(address,string)", +"54e08f76": "theInvestor()", +"54e0b451": "claimReward(bytes32,uint256)", +"54e0b464": "ICO_ADDR()", +"54e16753": "BLUECoin()", +"54e2cf2d": "_getPartLevel(bytes,uint256)", +"54e2dc8d": "getAdditionalTime(uint256)", +"54e30c37": "earlyBirdPrice()", +"54e33cf0": "getRewardsIndex()", +"54e35054": "getRoundResultInfoWithRoundID(uint256)", +"54e35ba2": "issueTokens(uint256,uint256)", +"54e4df26": "test_0_testGenerateTokens()", +"54e707a0": "START_WEEK_2()", +"54e76d74": "minimumPoolPurchase()", +"54e7aed8": "Frozenable(address)", +"54e7e98c": "PiexT(uint256,string,uint8,string)", +"54e8561b": "RDOCrowdsale(address,address)", +"54e8e4e4": "Test_SignedInteger_AdditionOverflow(int256)", +"54e921cb": "setFreezeMustCalculate(uint256,bool)", +"54e9244e": "orderFills()", +"54e9d5e1": "refundDonation(address)", +"54ea1538": "sellDrago(uint256)", +"54ea1af9": "flyDrop(address[],uint256[])", +"54ea4000": "identify(address[])", +"54eae3e6": "streamEnd()", +"54eb3f74": "getOptionState(address[2],uint256[7])", +"54eb9e88": "_preValidateICOPurchase(address,uint256)", +"54ec5d9b": "weiRaisedRound()", +"54ec6a43": "taxPaid()", +"54ecaba4": "COMPETITION_VERSION()", +"54ecd994": "ALLOC_BOUNTIES()", +"54ed08c8": "getPurchasedTokens(address)", +"54ed44f7": "generateCostFromAttributes(uint8[14])", +"54ed7b6e": "addHash(bytes)", +"54ee4d4b": "addCommunityGrant(address,uint256)", +"54eea796": "setEpochLength(uint256)", +"54ef356f": "isUserAdmitted(address)", +"54ef9c3c": "getEpisodeBranchData(uint256,uint256)", +"54f10ed0": "IknewToken()", +"54f11256": "retrieveCadvsLeftInRefunding()", +"54f12a2c": "isAllowed(string,string)", +"54f1469c": "shuffle(uint256[])", +"54f1bb4b": "Etheraffle(address,address,address,address)", +"54f363a3": "addition(uint256,uint256)", +"54f47346": "lastBlock_f12()", +"54f47be7": "transformSettingContract()", +"54f4824d": "myLastRef(address)", +"54f50f1b": "nicknameOf(uint256)", +"54f5164b": "isLocked(bytes32,uint256)", +"54f51d32": "SetCitySnapshot(address,uint256,bool,uint256,uint256,uint256,uint256)", +"54f5675c": "OfferedForSale(uint256)", +"54f56df1": "Shop(address)", +"54f60aea": "ONE_EMONT()", +"54f6127f": "getData(bytes32)", +"54f63105": "maxMintingPower()", +"54f63ee5": "resumePresale()", +"54f703f8": "factor()", +"54f78dad": "setBalanceSheet(address)", +"54f7b493": "getMinimumFundsInEuroCents()", +"54f7dd8c": "lotOfOwnerByIndex(address,uint256)", +"54f81786": "startTokenVotes(address[10])", +"54f83483": "needsTick()", +"54f8c2df": "getShipName(uint32)", +"54f9962a": "getAffiliateLevel()", +"54f9cbb3": "newVote(uint256,string)", +"54fa8044": "sendKrs(address,uint256)", +"54fac919": "decay()", +"54fbde65": "USDWEI()", +"54fbed37": "tokenIsBeingTransferred(address,address,uint256)", +"54fc85ac": "maxEth()", +"54fd4d50": "version()", +"54fead44": "_removeRecoverer(address)", +"54fef819": "throwsWhenRedeployingANT()", +"54ffb323": "MaxOffer()", +"54ffe626": "_getBonusTokenAmount(uint256,uint256)", +"550052b5": "iaOnInvested(address,uint256,bool)", +"5502109e": "actualCap()", +"550271c9": "Candle()", +"5502be83": "getBountiesByParticipant(address)", +"55036214": "priceRound2()", +"5503a659": "smallponzi()", +"5503d9ba": "numberOfPledgeAdmins()", +"55042668": "jobStarted(bytes16,address,address,uint256,uint256)", +"55044042": "CreateGUNS(address,uint256)", +"5504bf71": "attackerPrizeByToken(bytes32,address,address)", +"5504f45e": "getFrontEndTokenSupply(address)", +"5505075b": "validArb(address,uint256)", +"550538f6": "getOneTimeCosts()", +"550563ba": "Iscm(uint256,string,string)", +"55061ccc": "setImageBlurredAt(uint256,uint256)", +"55064d85": "exists(uint256,uint256,uint256)", +"5506aa6c": "weiMaximumGoal()", +"55072fef": "PRIVATE()", +"5507a82e": "setCalculatorAddress(address)", +"5507e9c0": "lockForAll(bool)", +"5509b160": "weightLostPartLimit()", +"5509f0f3": "minPurchasePreICO()", +"550b1f48": "eighthTime()", +"550b47b8": "setCoinPrice(uint256)", +"550bcd8d": "testThrowUpdateLatestRevisionEnforceRevisions()", +"550c99c6": "_createCutie(uint40,uint40,uint16,uint16,uint256,address,uint40)", +"550d8dca": "secondPeriodSupply()", +"550dd006": "calcCostsBuying(uint256,uint8,uint8,uint256)", +"550e4f2b": "withdrawRemainingIPCToken()", +"550ed1f0": "getMaxBetAmount()", +"550ed61b": "jpyc()", +"55107916": "distributeMarketingShares()", +"5510f804": "acceptToken()", +"5510f8d7": "forkApprove(address,address,address,uint256)", +"55119b1a": "addBeneficiary(address,uint256,uint256,uint256,uint256)", +"55121498": "getLenderBalance(uint256)", +"55126d30": "LogEvent(address,uint256,uint256,string)", +"5512a353": "BONUSROLL()", +"5512a8d8": "myohoTest()", +"551336c5": "prophecise(bytes32,bytes32)", +"55138534": "Transaction()", +"55138d97": "addCar(address[4],uint256,uint256)", +"55139163": "refereesRateBonus()", +"5513a2ac": "claimByProof(address,bytes32[],bytes32[],uint256)", +"5513a34e": "getProductHistoryPrice(bytes32)", +"5514738f": "_packWarriorPvpData(uint256,uint256,uint256,uint256,uint256)", +"55152b9d": "DxChainToken()", +"55161913": "charge()", +"5516b6c5": "SECCoinSold()", +"55171365": "bitshmToken()", +"55173bb1": "ColaTokenToken()", +"55176f51": "FOUNDATION_POOL_TOKENS_VESTED()", +"55177ef1": "addressCoreSupply()", +"55181fba": "TEXBToken()", +"55186c99": "auditorCanWithdrawStake(uint256,address)", +"55189100": "payRewards(address,uint256)", +"551a450a": "tokenIdToListing(bytes5)", +"551a5376": "haltTokenTransferFromAddress(address)", +"551cacfd": "extractEther(address)", +"551dc401": "StateChanged(uint8)", +"551e2e39": "changeDefaults(uint256,uint256,uint256,uint256,bool)", +"551e44ca": "withdrawTokenForUser(uint256)", +"551e4c27": "setPeggleBot(string)", +"551e6ba6": "BoardRoom(address)", +"551ef860": "newRole(bytes32,address[])", +"551f3108": "versionSelectors(bytes32,bytes32,address)", +"551f8e2a": "add(address,address,uint256)", +"5520002a": "viewSharesSold()", +"552033c4": "RAY()", +"552079dc": "fallback()", +"55207a07": "changeMood(string)", +"55212c89": "seeleToken()", +"55219d5a": "tokenAllowed(address)", +"5521d17b": "betOnColor(bool)", +"552200f5": "check_part_location(uint256)", +"55234ec0": "remaining()", +"5523ec91": "fghcoin()", +"552405b0": "createCommunity(string,string,string,string,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)", +"55241077": "setValue(uint256)", +"55247a52": "wantToBeWhale()", +"5524defd": "onPayoutFailure(address,uint256)", +"5524e97a": "placeBet(uint256,uint256,uint256,bytes32,bytes32)", +"552548b5": "setMaxDiscountPermille(uint256)", +"55258a11": "updateAllScores()", +"5525d87f": "setOracleQueryType(string)", +"55265669": "showSupply()", +"55274378": "updateInterCrypto()", +"55291dbd": "claimEther()", +"552984b3": "stabilize()", +"552a41a3": "getRemainingBountyTokens()", +"552a6915": "getGood(uint256)", +"552ac31e": "prod(address,bytes32,uint128)", +"552b71aa": "executeDistributeCapital(uint256)", +"552c190e": "_DoubleDown()", +"552d2d5c": "getPerson(address)", +"552e387d": "XBVHandler(address,uint256)", +"552eb9e2": "ETStarPresale(address,uint256,uint256)", +"552f1270": "startWeek(address,uint8)", +"552f27f5": "setupEventsAdmin(address)", +"552f8224": "fechAllForCandidate()", +"552fee9d": "airdropTokens(address,uint256,uint256)", +"55302ebd": "hasUnionId(bytes32)", +"5530c519": "validate_pko(address,bytes32,bytes)", +"5531680c": "transferableBlock()", +"55325d87": "prizeWinners(uint256)", +"55326893": "setPOOL_edit_24(string)", +"5532edf2": "autorizadoraNuncaAutorizouCandidata(address,address)", +"5533639e": "toB32(bytes,uint256,bytes32,bytes)", +"5533ffad": "setUserNotifications(bool[],bool,uint8[],uint8)", +"5534236e": "AirDropPromo(string,string)", +"55347cce": "Setuppackagesale(uint256,uint256)", +"55348d9b": "addBeneficiaryVestor(address,uint256,uint256,uint256,uint256)", +"55352638": "updatePresaleMaxWei(uint256)", +"553543c5": "tokenSoldPreSale()", +"553594e4": "getActionHistorySize()", +"5535cd2f": "setPOOL_edit_1(string)", +"5535e7a8": "GameCreated(address,address,uint256,uint256,bytes32)", +"55367ba9": "pauseSale()", +"55368442": "removeMetadataObject(string)", +"5536deb6": "finalizePhase()", +"5536e2d6": "OCTACrypto()", +"5537f0ef": "betFinalize(uint256,uint8)", +"55380ed8": "GOOGToken()", +"5538210e": "tokenSweep(address,address)", +"5538689c": "changePartner3(address)", +"5538c964": "getPartnerInfo(uint256)", +"55390b0d": "PrestoToken()", +"5539a9c2": "refreshPublicFundingPersonalEthLimit(uint256)", +"5539d400": "authorizedAddress()", +"553a48fd": "isFunctionRemoveAuthorizedAddress(bytes)", +"553a5c85": "mintedTotally()", +"553a90b8": "updateStopGameOnNextRound(bool)", +"553aaafe": "MSPPlaceHolder(address,address,address,address)", +"553b196f": "setPurchasingPaused(bool)", +"553b6975": "setAmbassador(address)", +"553b6f83": "lastOracleFee()", +"553b74aa": "getNumberWallets()", +"553bf56d": "accept(uint256,string,uint256)", +"553c02ec": "getCountryBet(uint256)", +"553c6de9": "getPreIcoInvestor(uint256)", +"553cc48d": "Player(string)", +"553cd9c6": "MLC()", +"553d0d12": "transferTokensThroughProxy(address,address,uint256)", +"553df021": "deal()", +"553eb4db": "registerRewards(address[],uint256[],uint256)", +"553ec6be": "batchCancelSale(uint256[])", +"553f4fb3": "requestRand()", +"553f9157": "completeSale(uint256,uint256)", +"553fd043": "setMoneyRange(uint256)", +"553fd8ee": "ALLOC_FOUNDATION()", +"5540e6c1": "iMMCoinsellPrice()", +"55416e06": "voteA()", +"5541b817": "_leftChild(uint8)", +"554249b3": "delegateIncreaseApproval(address,uint256,address)", +"55426bad": "processPresaleOrEarlyContributors(address[],uint256[])", +"55427b42": "getBalanceofModifiedWeth()", +"5542f680": "retrieveToken(uint256)", +"55434bc9": "ToggleFreezeSelling()", +"55456f58": "maxcap()", +"554571db": "updateNarco(uint256,string,string)", +"5545f12b": "OnChainOrderBookV013bFactory()", +"5545f584": "soldForForth()", +"554600fa": "setOraclizeTimeTolerance(uint256)", +"554644d5": "_removeHolding(bytes12)", +"554652ce": "airdropToken(address[],uint256[])", +"554680f2": "updateActivation()", +"5546a12c": "setInformation(string,string)", +"5546e1ab": "getMyRefund()", +"5547d2d9": "setHtlcSettlePeriod(uint256)", +"554803c7": "RTCCOINTOKEN(uint256,string,string)", +"55485779": "minGas4Accts()", +"5548c837": "Deposit(address,address,uint256)", +"554917f5": "processMyRefund()", +"55491da8": "distributeJST(address[],uint256,uint256)", +"55494d1e": "fillBuyOrder(address,address,uint256,uint256,uint256)", +"5549563c": "claimManyTokenFor(address[])", +"5549ce5e": "WarriorSanctuary(address,uint32[])", +"5549ce6d": "ticketTransfersPerAmount(uint256)", +"5549f46c": "CustomerInsert(string,address,string,int256)", +"554a854e": "TransferCryptibles(address,uint256)", +"554ad7ff": "queryNTVUs(uint256,uint256)", +"554bab3c": "updatePauser(address)", +"554d0429": "getArrBoolField2()", +"554d184b": "getPrices(address,address[],address[])", +"554d27ca": "createOffer(address,uint256,uint256,bool,uint256)", +"554d578d": "getCap()", +"554d758e": "houseStatsOf(address)", +"554dbfc2": "EMISSION_FOR_SALESTAGE6()", +"554e00b4": "miniGameStart()", +"554e6c61": "getTargetBNumber()", +"554ed8b6": "escrowTransferList(uint256)", +"5550e4f3": "blackBoxAddress()", +"5551b6b6": "isDelegateEnable()", +"5551d1b7": "isAllowToIssue()", +"5552a483": "newOffer(address,uint256,string,uint256,uint256)", +"5552d1cb": "prizeIncr()", +"55532953": "LOCKED_ADDRESS()", +"5553dc1e": "THToken()", +"55540004": "createCampaign(address,uint256,string)", +"5555d6d6": "exist(uint256,address)", +"55560fd5": "mLoadAndReturn(address)", +"55566036": "getGamePool(uint256)", +"5556db65": "totalMined()", +"5556f3f6": "RareCards()", +"55575ddb": "setRevokeAddress(address)", +"55589cdd": "addressOf(address,string)", +"5558e1c3": "setMinToken(uint256)", +"555984fd": "cancelMintRequest(uint256,string)", +"5559d8d9": "getClamTax()", +"555aaff6": "calculate_range_attempt(uint256,uint256)", +"555ab116": "AhooleeTokenSale(uint256,uint256,uint256,address,address,uint256,uint256,uint256)", +"555ae2c6": "STQPreICOBase(address)", +"555af8f4": "addressFundHolder()", +"555b6162": "allBalances()", +"555be5bd": "assignNewPlanet(address,uint256,uint256,uint256,string,string,string)", +"555befa8": "set1RoundTime(uint256)", +"555c4758": "distributeTimelockedTokens(address[],uint256[],uint256[],uint256[])", +"555d8e3c": "_printACourse(uint256)", +"555db767": "test_2_accessRestriction_newProposal_shouldThrow()", +"555e6582": "executeMintProposal(uint256)", +"555ea48c": "becomeHost(bytes32,uint8,bytes32,bytes32,string,string,string)", +"555f323a": "totalBurnedTokens()", +"555f498a": "getInvestorsTokens(address,uint256)", +"555fe48a": "batchTransferFrom(address,address,uint32[])", +"55605eee": "claimTokenReserveEcon()", +"5560ada8": "rateAddress(address,uint256)", +"5560d365": "horseShoeForSale(uint256,uint256)", +"5560ede2": "LYToken(uint256,string,uint8,string)", +"55616107": "setCOOAddress(address,address)", +"55619911": "emergencyTransfer(uint256,address)", +"5561c0e2": "registerChain(bytes8,uint256)", +"5563d919": "cancelCraftingAuction(uint256)", +"55642be7": "getRoundBets(uint16)", +"55642cf9": "CappedBonusSale(uint256)", +"55642e53": "blacklist(bytes32)", +"5564a08e": "setGame()", +"5565ca9d": "buyShip(uint16,uint16,uint8,bytes32)", +"5565ee7a": "exchangePointToCoin(address,uint256,string)", +"556665db": "expireTimeLimit()", +"55674064": "totalSupplyWithoutDecimals()", +"55674efe": "BondkickToken(string,string,uint8,uint256,int256)", +"55684aa6": "originBurn(uint256)", +"55688000": "burnIndexedFromByAddress(address,address,uint256)", +"5568fd5d": "icoPhase2End()", +"5569e58c": "EthereumPocket()", +"5569f5d0": "preSaleFinished()", +"5569fc0b": "CreateSale(uint256,uint256,uint256,uint64,address)", +"556a3689": "mint_Crowdsale(address)", +"556ae598": "depositBomb(uint256)", +"556b22c1": "get_record_count()", +"556b6384": "removeBlacklistDestroyer(address)", +"556bcece": "reinvest_color(address,uint256,uint256,uint256)", +"556cbc03": "setDefaultWhitelistVestingParameters(uint256,uint256,uint256,uint256,uint256)", +"556d5139": "getAverageTokenPrice(address)", +"556db16a": "validatePurchase(address,uint256)", +"556e2eb9": "TBL4TokenSale()", +"556e56d1": "BurnupGameFinance(address)", +"556e6edc": "indice()", +"556ed30e": "deactivated()", +"556f0dc7": "granularity()", +"556fe562": "notEqual(bytes32,bytes32,string)", +"55710346": "createTokensFromOther(address,uint256,address)", +"557119db": "withdrawForCharity(address)", +"5571954d": "_distributeRegistrationBonus(address)", +"55728d04": "setIssuer(address,uint256)", +"5572f9c6": "exchangeEther(uint256)", +"55737391": "LBRSMultitransfer(address,address)", +"5573a34c": "FP_SCALE()", +"5573c582": "walletTransfer(address,address,uint256)", +"5574cff5": "LOVEYOUFOREVER()", +"55764c81": "updatedTokensPerEth(uint256)", +"55765e9a": "createMeme(string,uint256)", +"5576af7d": "TransactionConfirmedAfterDispute(uint256,uint256)", +"5576b791": "transferWithVesting(address,uint256)", +"5577e89f": "testEqualityUint()", +"5578b51e": "CorelliCoin(uint256,string,string)", +"5578d24e": "addOldPresidents(uint256[],address[])", +"5579996d": "CHW()", +"5579ac74": "dna3(uint256)", +"5579ff8e": "walletBlogs()", +"557b0dc9": "addCar(string,string,string,uint16,string)", +"557bed40": "SocialMediaPayToken()", +"557d0195": "SuomenMarkka()", +"557d0479": "aidrop(address[],uint256)", +"557d0999": "userreinverst()", +"557dc796": "endRoundSeed()", +"557ed1ba": "getTime()", +"557f4bc9": "changeContractOwnership(address)", +"557f9ea6": "aDeposit(uint256,uint256)", +"557feee1": "setRegionCurrentImageId(uint256,uint256)", +"5581004d": "createThrone(bytes,uint256,uint256,uint256,uint256)", +"55810d11": "appFund()", +"5581800c": "isCappedInEther()", +"5581be8d": "privatePresaleSupply()", +"558225fc": "setAtomSons(uint256,uint32)", +"558234f0": "USD_PURCHASE_AMOUNT_REQUIRING_ID()", +"55827137": "refreshVault(address,uint256)", +"5582c08d": "startMonarchyGameReward()", +"5582df33": "performInitialAllocations()", +"558305f9": "isFreezeEnabled()", +"55832ffc": "purchaseStartTime()", +"5583318a": "TOL()", +"55838881": "STAGE_ONE_BET_LIMIT()", +"5584002b": "_isSimulation()", +"55843fda": "getAdOwner(uint256)", +"5584c4f9": "getActiveProposals()", +"558599ea": "SQR_TOKEN_DECIMALS()", +"55866c8d": "isRefunded(uint256)", +"55869af1": "fromVersion()", +"558790d8": "testInitialTokenBalanceShouldBeZero()", +"5588227e": "restCrowdSaleAddress(address)", +"55889d01": "setMaxLockPeriod(uint256)", +"5588b929": "streamerContract()", +"558a7297": "setOperator(address,bool)", +"558a8f47": "sendFutureSupplyToken(address,uint256)", +"558b5aab": "setSellingToken(address,uint256,uint256)", +"558da2e3": "preSaleprice()", +"558e223f": "_buyPutToOpen(uint256,uint256,uint256,uint256,address)", +"558e44d3": "MAX_FEE_PERCENTAGE()", +"558f285f": "unsetMyIdentity(uint256)", +"558f46c8": "getZTKChecks()", +"55909da3": "spreadTokens()", +"5590e4d2": "toBytes32(bool)", +"55915b97": "initialSuppy()", +"55923471": "fiveHourCap()", +"55923cc5": "ElementToken(string,string,uint256,uint8)", +"5592d687": "settleBounty(uint128)", +"5592fc71": "getLotteryWinners()", +"55947d16": "XJJ()", +"5594e88c": "delegateToken(address,address)", +"559510d8": "left53(uint256)", +"55951e15": "dollarToLoveyRate()", +"55954b49": "initVesting(address,uint256)", +"559659fa": "getTotalRefund()", +"55976b05": "depositNotification(uint256)", +"5597801a": "addwhitelistedBatch(address[],address)", +"5597e9dd": "setCompte_36(string)", +"5597f3a5": "createRecord(string,uint256,address,string,string,string)", +"5598c576": "reveal_move(bytes32,uint8,bytes32,bytes32)", +"5598f8cc": "getCampaign(uint256)", +"559ac092": "getAirdropIdsByContractAddress(address)", +"559b0432": "yearCap()", +"559b0ed5": "giveBackOwnership(address)", +"559b1df4": "TokenStoreUpdated(address,address)", +"559b678c": "IsLimitPart(uint8,uint256)", +"559e5e06": "updateTokenAge()", +"559ec80d": "settleDeposit()", +"559ed339": "setTokens()", +"559f05dc": "canTrade(address)", +"559fb6f5": "assertAvailable(uint256)", +"559fd7ee": "setYearOneMultiplier(uint256)", +"55a01845": "forceFinished()", +"55a05335": "totalDragonLotteryNumber()", +"55a0b387": "getFreeToken(bytes32,bytes32,uint8)", +"55a129bd": "Tier(uint256,uint256,uint256,uint256,uint256,uint256)", +"55a36746": "newDigitalContract(string,address[])", +"55a373d6": "tokenContract()", +"55a392ac": "ExerciseEndTime()", +"55a3f425": "getBalanaceOf(address)", +"55a53ed0": "EtherSteem()", +"55a5a8d4": "DHUBTest02()", +"55a5dc3c": "SpegniCassaAutomatica()", +"55a5f702": "right45(uint256)", +"55a6b827": "setPrices(uint32,uint32)", +"55a85240": "random(bytes32,uint32,uint256)", +"55a964a7": "distributeALLY(address[],uint256,uint256)", +"55a9794a": "extract(uint256,uint256[])", +"55a9a87c": "fightMonster(uint16,uint8,uint8)", +"55aa8ad4": "Filesystem()", +"55ab314e": "setOrders(uint224,uint32,uint8,uint8,uint64,uint64,uint64)", +"55ad798f": "removeRobot(address)", +"55ae603e": "sell(uint16,uint16,uint8,address,uint256)", +"55aea767": "batchClaim(uint256)", +"55aed629": "SpinnersByAddress(address,uint256)", +"55af5c59": "editBalanceOf(address,uint256)", +"55afb12d": "isStbMintedForStaEx()", +"55afee43": "validateKYC(address,bool)", +"55aff5ba": "minTokParticipate()", +"55aff703": "updatedBet(uint256)", +"55b09c58": "myuseOf(address)", +"55b1182c": "stakeholdersPoolAddress()", +"55b12570": "TransferError(address,uint256)", +"55b1aa23": "DEEPPASA()", +"55b23f4c": "econVestingStages()", +"55b2bb0f": "MIN_FUND()", +"55b32c83": "sendFoundation()", +"55b37685": "balancePreSale3()", +"55b4bb4b": "HeavyLitecoin()", +"55b4f231": "vestTokensDetail(address,uint256,uint256,uint256,bool,uint256)", +"55b5ec64": "proceeds()", +"55b62dcf": "getThresold(uint256)", +"55b6ec79": "endCall(bytes32,uint256,uint8,bytes32,bytes32)", +"55b6ed5c": "allowances(address,address)", +"55b700af": "PRESALERATE()", +"55b71344": "FlexibleToken(string,string,uint8,uint256)", +"55b726bc": "adjustRate(uint256)", +"55b72f38": "getLongitude()", +"55b775ea": "setFeed(address)", +"55b8415e": "processReward()", +"55b860e1": "_updateDiscount(uint256,uint256)", +"55b8ef5e": "UserInfo()", +"55b93031": "minNumber()", +"55b954ad": "getRestTokenBalance()", +"55b9b9cf": "PXLToken(uint256,uint256,uint256,address,address)", +"55b9ca40": "withdrawCell(uint256)", +"55ba13da": "VaN(address)", +"55ba343f": "getMarket(bytes)", +"55bb34e5": "enableEmission(bool)", +"55bc0f07": "returnLongTokenAmount(address[3],bytes32)", +"55bc8725": "bannedAddresses(address)", +"55bcaf06": "halfMultiplier()", +"55bdd4ac": "offerCatForSaleToAddress(uint256,uint256,address)", +"55be1168": "view42()", +"55bf3dbb": "OrangeToken()", +"55bf5656": "crowdfundStartDate()", +"55bfe5b1": "chfRate()", +"55c01345": "coupon()", +"55c081d4": "setTier(address)", +"55c08200": "setSpecialPeacefulSkill(uint256,uint8)", +"55c0a5f4": "appendSource(address[],uint256[])", +"55c1743d": "SEOS(uint256)", +"55c1e611": "cancelBets()", +"55c208ad": "TimeDecayingTokenBoundaryRange(uint256,uint256,uint256,uint256,address)", +"55c28ed0": "zeuscoin()", +"55c2a0ac": "addQuantity(address,address,uint256,uint256)", +"55c33624": "mock_set(address,address,uint256,uint256)", +"55c39193": "removeBoardOnUser(address,address)", +"55c47867": "withdrawTokensForCloudexchangeTeam(uint256,address[])", +"55c4a8bf": "vig()", +"55c4b226": "pushUpdate()", +"55c4c5b3": "Cartycoin(uint256,string,string)", +"55c4e704": "enableAgency(address)", +"55c60500": "setRemainAirdrop(uint256)", +"55c623c6": "bidEth(uint256)", +"55c64ce1": "resetReward()", +"55c797ce": "setBonusWallet(address)", +"55c79f49": "payToEvaluator(uint256,uint256)", +"55c81595": "raffleState()", +"55c81ae9": "recipientContainer()", +"55c8c6fd": "tokensSupplied()", +"55c94f04": "closePosition(bytes32,uint256,address,address,bytes)", +"55c9e290": "DOI()", +"55c9e926": "getNumPlayers()", +"55ca92f8": "createBallot(uint256,uint256,address,string)", +"55cacda5": "minimumEpochInterval()", +"55cb155a": "WebcoinToken(uint256,address[])", +"55cb61ca": "EthTransferContract(address)", +"55cc4e57": "setIssuer(address)", +"55cd1915": "GA_chain()", +"55ce15f4": "transferAmount(address,uint256,uint256)", +"55ce3b9a": "setFundWallet(address)", +"55ce596b": "flowingHairAddress()", +"55ce76e6": "feeAmountThreshold()", +"55cf1008": "numberOfValidPartners(uint256,uint256)", +"55cf4e30": "setAccesser(address)", +"55cf969d": "transferReverseProxy(address,address,uint256,uint256,uint8,bytes32,bytes32)", +"55cfa833": "clientmanager()", +"55d0012d": "signupUserWhitelist(address[],uint256[])", +"55d04877": "_payRefund(bytes32)", +"55d13efe": "sha_data_group(int256[],int256)", +"55d17201": "OHC_Crowdsale(uint256,uint256,uint256,address)", +"55d17251": "CROWDSALE_CAP()", +"55d1b4d3": "softCapPrice()", +"55d1c5c7": "getEuroCollected()", +"55d1f799": "triggerSkill(uint32[11][32],uint8[32],uint8[4][31],uint8[3][3][31],uint8[5][11][32],uint16[11][32],uint32[3][11][32])", +"55d28f20": "configure(address,address,address)", +"55d374e9": "setPrices(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"55d39bc0": "setETHPriceUpperBound(uint256)", +"55d4956f": "setEndSaleDate(uint256)", +"55d55a76": "isActionAccount(address)", +"55d56ddd": "_adoptAxies(address,uint8,uint256,address)", +"55d595d1": "rollbackContract(uint256,address)", +"55d66c3e": "getMarketOrderWorkerpoolOwner(uint256)", +"55d67ba0": "Begin(string)", +"55d6d06e": "XIDToken()", +"55d6f3c0": "Telephone()", +"55d72a7d": "ActionStarUp(address)", +"55d7592d": "emergencyETHDrain()", +"55d79248": "miningTenPlat()", +"55d7fe2b": "RATE_SALESTAGE5()", +"55d8bbd5": "beginSell()", +"55d9275e": "payMoneytoAuthor(address)", +"55dac078": "SecuredNotes()", +"55daf6e6": "setInitialOwners(address[],uint256[],uint256[])", +"55db4092": "setTOS(address,bool)", +"55dc3b65": "DAVCoin()", +"55dd16cd": "CrowdsalePhase1(uint256)", +"55dd574c": "startPreSale()", +"55dd8171": "bbFounderCoreStaffWallet()", +"55ddc9f0": "mainSaleFirstStartDate()", +"55de28ae": "burnBadge(uint256)", +"55de5a93": "getCurrentEdition()", +"55de97ac": "OBR_Duration()", +"55deb8fc": "tell(uint256)", +"55df34f2": "leftOverTokens()", +"55dfb430": "Test1(int256)", +"55dfc97c": "limitSupplyPerYear()", +"55e0aece": "getListingService(uint8)", +"55e1726c": "LogSetStageStartTime(bytes32,uint256)", +"55e17544": "Tardis()", +"55e21474": "firstRoundCosmosTokensLimit()", +"55e2305e": "preauthorize(address)", +"55e37cec": "discountRatePreIco()", +"55e38f9b": "canAddNewClient(address)", +"55e3f086": "startRound()", +"55e40d98": "updateItem(uint256,string,uint256[6])", +"55e447aa": "queryBalanceOf(address)", +"55e46476": "createA()", +"55e61dcd": "operationsInQueue(uint256)", +"55e6b18e": "victorieumStaticToken()", +"55e6fc50": "deposit_fee()", +"55e79d29": "regex()", +"55e7a663": "setLowerPricePercentage(uint256)", +"55e7db94": "GBCToken()", +"55e97e93": "closeGenesis()", +"55e9c358": "weekLength()", +"55e9caa1": "log_move_fees(address,address,uint256)", +"55ea14f2": "atomicxSupply()", +"55ea2cf3": "GameBit()", +"55eb27c8": "getActualUserTokenBalance(address)", +"55ebcc83": "Market(bytes,uint256)", +"55ec4da9": "VaultMint(address)", +"55ec671a": "canBet()", +"55ee684d": "initLogo()", +"55ee6afb": "Wallet(address,address)", +"55eed9de": "developerFunds()", +"55ef2913": "isOperatorAuthorizedFor(address,address)", +"55efe565": "Caligula()", +"55f03816": "orderOnSaleAuction(uint256,uint256)", +"55f0690d": "transferAndLockMulti(address[],uint256[],uint256[])", +"55f0d02c": "ResidualValue(uint256,string,string)", +"55f13278": "presaleTokenCreationCap()", +"55f14c30": "minter2()", +"55f150f1": "desc()", +"55f1a3c8": "disableTokenSale()", +"55f21eb7": "getProvider(address)", +"55f25e3f": "getLavaTypedDataHash(bytes,address,address,address,uint256,uint256,uint256,uint256)", +"55f28260": "getOwnerAt(uint256)", +"55f29166": "cancelUpgrade()", +"55f2dcb2": "GouBi()", +"55f2de40": "abioSold()", +"55f39677": "phase2WeiRaised()", +"55f3c49c": "bookrequest(uint256)", +"55f413c9": "presale3_startdate()", +"55f48a46": "CUSTOM_ERC20_BURN_SERVICE_NAME()", +"55f54552": "setPaySize(uint256)", +"55f57510": "positions(address)", +"55f5856f": "transferToLimited(address,address,uint256,uint8)", +"55f6a412": "modify_NovumAddress(address)", +"55f78af8": "getLockBalance(address)", +"55f804b3": "setBaseURI(string)", +"55f82589": "tryExec(address,uint256)", +"55f86501": "exec(bytes)", +"55f92d23": "privateSaleContribution(address,uint256)", +"55f953e6": "getTokensCountOfUser(address)", +"55fa1348": "minimum_donation()", +"55fb8cee": "userCountsInAccount(uint256)", +"55fb9765": "UniversalGamingCoin()", +"55fbc8c2": "UpdateEthBalance(uint256,uint256)", +"55fbf10e": "PanterX(uint256,string,uint8,string)", +"55fe13ea": "setBuyingEscrowAddress(address)", +"55fecb0b": "payTheWinner()", +"55ff440a": "castStringToUInt(string)", +"55ff85c3": "returnBet(uint32)", +"56000acf": "processPayment(address,uint256,bool)", +"56003f0f": "createTemporary(bytes32)", +"5600e827": "elapsedMonthsFromICOStart()", +"5600f04f": "url()", +"5601477b": "addMilestone(uint256,uint256)", +"5601da3d": "innerTransfer(address,address,uint256,uint256)", +"5601eaea": "execute(uint256,uint256)", +"56025c9e": "DatareumCrowdsale(address)", +"5602a812": "sumICOStage5USD()", +"5602c05f": "AREF()", +"560334c6": "angelPool()", +"5603a50d": "checkVesting(uint256,uint256)", +"5603ac35": "NewBudget(address,uint256)", +"5603b9f9": "registerReferral(address,address)", +"56048edc": "getThresold()", +"56049a86": "riddle()", +"5604af49": "battleProvider()", +"560667f1": "setDocToAddress(address,bytes)", +"56075a98": "becomePlayer()", +"56078480": "GoneTrippinToken()", +"560791a9": "returnHolder(uint256)", +"5607a548": "m_ownerIndex()", +"5607f324": "checkLicense(address,address)", +"5607f408": "freezeTokens(address)", +"56084329": "SAATCoin()", +"5608b6d9": "changeprivatebonus(uint256)", +"5609825e": "partyOwnsAsset(address,address,string)", +"56098295": "getCandidateVotesByIndex(uint256)", +"560a665a": "buyTokensByReferrer(address,address)", +"560bb612": "SignatureValidator(address)", +"560bd3ec": "addCollaborate(uint256,address,bytes32,uint256)", +"560cb0a5": "SikobaContinuousSale(uint256)", +"560d3ca5": "toEXTwei(uint256)", +"560ecab5": "setSellCeiling(uint256)", +"560ed6a1": "refundEther()", +"560ef1bf": "getLockedToken(address)", +"560f5d4b": "currentStateSales()", +"561015e2": "notEqual(uint256,uint256,string)", +"56104861": "addEjariRule(string,string,uint256,uint256)", +"56105a08": "DgxSwap()", +"56111751": "respond(uint256,uint256,bytes32)", +"561187ae": "russianBounty()", +"5611bf3e": "AlerterAdded(address,bool)", +"56129134": "createPromoKitty(uint256,address)", +"561296e4": "GetReferralDataOfAddress(address)", +"5612acd3": "getScenariosInfo(bytes32)", +"5612e139": "getWebsite(address,uint256)", +"56131736": "wcf(address,uint256)", +"561337eb": "contractMessage()", +"5613680a": "whitelistInvestors(address[])", +"561387b1": "setPrice(string,string,string,uint256)", +"5614678c": "calculateDayOwnerCut_(uint256)", +"5615f415": "q2()", +"56161605": "TestGOATToken()", +"5616cafd": "setGasForCLI(uint256)", +"5616f7df": "getHatchCooldown(uint256)", +"5617fb0d": "TKDToken()", +"56189cb4": "approveInternal(address,address,uint256)", +"561960b5": "activateStartBlockOf(address)", +"56196d87": "pickReward(uint256)", +"56196dc9": "getTagByModuleType(uint8)", +"561a0d65": "serviceClaimOwnership()", +"561a28df": "market2018TokenCreated()", +"561a4873": "buyAd(string,string,string,uint256,uint8,address)", +"561b1d72": "iDeal()", +"561bbe1e": "getluckyprize()", +"561cce0a": "LONG()", +"561cd462": "balanceOfETH(address)", +"561e91a1": "makeBet()", +"561ef5b6": "for_sale()", +"561f1ba1": "sendToken(address,address,uint256,uint256)", +"561f39c0": "getGameMaker()", +"561fe29c": "createDeposit(address)", +"56200819": "updatePayoutAddress(address)", +"56206581": "MyInvestments()", +"5620d1d7": "lastCompleteEpoch()", +"56216916": "changeFinishSale(uint256)", +"5621df99": "ESMBCoin()", +"5622d195": "SvEnsRegistry()", +"562328ec": "LogBidConfirmed(bytes32,address,bytes32)", +"5623715b": "updateUpgradePoll(address)", +"56238b02": "setTokensPerEth(uint256)", +"56240b38": "PalestinePound()", +"56242e07": "customerDeposit()", +"56247e6d": "createKingdom(address,string,string,uint256,bool)", +"5624e064": "makePurchase(address,uint32)", +"562557f7": "accountsUsed(uint256,uint256)", +"56257ae1": "getFUTTotalSupply()", +"562605f1": "refundOn()", +"56264d6c": "setMaxTickets(uint256)", +"5626e246": "Stage2Allocation()", +"56277619": "setFiatRaisedConvertedToWei(uint256)", +"5628d443": "BTYCT(uint256,string,string)", +"5628fc09": "initialize(address,address,uint256,uint256,uint256,uint256,uint256,address,address,address,address,address)", +"5629365b": "playerWithdraw(uint256)", +"5629c69e": "ArtBC(uint256,string,uint8,string)", +"5629c6d9": "doExecution(address)", +"5629e70b": "NobarToken(uint256,string,string)", +"562b2ebc": "orderCalldataCanMatch(bytes,bytes,bytes,bytes)", +"562bde28": "transferMyName(address)", +"562bfb9f": "getAllCardsModifier()", +"562c45da": "withdrawDragonsPrime()", +"562c4784": "targets(address)", +"562c82ec": "aboveSevenBets()", +"562c9dfa": "test2_verlappingIntervalNewNode()", +"562cad23": "startCycle()", +"562cb622": "setAffiliateLevel(uint256)", +"562cc70c": "minWeiWhitelistInvestment()", +"562d4570": "refundStart(address,uint256,address)", +"562df3d5": "COMMISSION()", +"562e9df9": "addressTeam()", +"562ea884": "Explain()", +"562fa0df": "deposit(address,address[],uint256[])", +"56304e33": "addBalanceBlocks(address)", +"563183fc": "maskerOf(address)", +"56318820": "setTokenSwarmHash(address,bytes)", +"56323b5d": "BenderCoin()", +"5632b1fa": "payrolls(uint256)", +"56330403": "getDocsCount(string)", +"5633af60": "HeliumNetworkAddress()", +"5633c442": "lockedUpCount(address)", +"563433d7": "setStock(address)", +"5634653d": "verificationCountInt()", +"5634c88c": "sumOfNGeom(uint256,uint256,uint256)", +"563540a2": "startQueueing()", +"5636548f": "enableWithdrawal(bool)", +"56378983": "validTokenAmount(uint256)", +"56387fa3": "toogleMinting()", +"56394455": "getStageStartDate()", +"56397c35": "ledger()", +"5639bb3c": "buyPriceEth()", +"5639d152": "NewRC(address)", +"5639eb64": "IngridIsAHorribleHumanCoin(uint256,string,uint8,string)", +"563ad62b": "ConfToken()", +"563b1358": "approvePack(address)", +"563b54b9": "getQueuesLength()", +"563baca1": "fundForBounty()", +"563bd001": "tokenPriceForPreICO()", +"563bef94": "ShipSellMaster()", +"563bf264": "slash(address,address,address)", +"563c23a0": "timePaused()", +"563c78b0": "SendPreReserved4()", +"563e8233": "envio_dinero(uint256)", +"563ed6d0": "delAdminAddress(address,address)", +"563fce0b": "mappings()", +"56410637": "ethernautsStorage()", +"56411a0f": "ChrizzxToken()", +"56412d85": "getVote(uint256,uint32)", +"56416147": "getopenDdaListAssets()", +"5641ec03": "emergencyExit()", +"56423986": "DecreaseTheAllowance(address,uint256)", +"56430201": "InvestmentMade(address,uint256,uint256,string,bytes)", +"5643a711": "increaseMonsterExp(uint64,uint32)", +"56442869": "destroyCrowdsale()", +"56447520": "dteamVaultAddr4()", +"56451bc2": "removeBalances(address[],uint256[])", +"564566a8": "isSaleActive()", +"5646435b": "burnTokens(address,address,address,uint256)", +"564952d5": "trickleSum()", +"5649efbc": "superFeed()", +"564a187f": "getPopRemainingAsFixedPointForGameId(uint256)", +"564a565d": "disputes(uint256)", +"564a6b94": "cos(uint16)", +"564ad142": "testSubItem(bytes,uint256)", +"564ca533": "setRelayedMessages(bytes32,bool)", +"564e406f": "changeAgencyOwner(address)", +"564ef91d": "PRNG()", +"564f8d23": "rightmost_leaf(uint256)", +"564f9728": "get_row(uint256,uint256)", +"5650152b": "getNextAvailableReward(uint256)", +"5650e5e0": "Couchain(uint256,string,string)", +"565118f7": "lockReleaseDate2year()", +"565135ce": "removeUsersWhitelistB(address[])", +"56514d83": "distributeReserveFunds()", +"5651ce38": "priceStepDuration()", +"5652077c": "finalizeProposal(uint256)", +"56522390": "addEditTokenFee(bytes8,uint256,uint256)", +"565287c9": "votar(uint256,bytes32)", +"5652ced0": "OpnMind()", +"5652ec7e": "GnosisIssued()", +"5653de64": "tokenSold(uint256)", +"56544af0": "taxTillNow()", +"5654a341": "gameIndex()", +"5654b526": "sumHardCapICOStage8()", +"5654edb8": "btcUpdates(uint256)", +"56553a95": "transferIssue(address,uint256)", +"5655c490": "setProviderCurrentRate(uint256,uint8)", +"5655e37b": "CONTRIBUTION_MAX_NO_WHITELIST()", +"56570671": "GetContractStageLiving()", +"565707a8": "getDErc20(bytes32)", +"56575bd7": "setParticipateDailyLootContribution(uint256)", +"5658d212": "getFactoryForCountry(string)", +"565974d3": "details()", +"56597e65": "circulationCap()", +"5659856c": "addApprovedAddresses(address[],uint8)", +"565a2e2c": "getBeneficiary()", +"565a2ecf": "classicTransfer(address)", +"565a7c4c": "epm_system()", +"565af6a8": "referralRegistration(address,address)", +"565b3324": "intMin()", +"565cee48": "ALLOC_ILLIQUID_TEAM()", +"565e2220": "view24()", +"565e4fa1": "subtractScalar(int256[],int256)", +"565eab8e": "TransferMyGGTokens()", +"565ed5a2": "LogMigrationFinalized(address,address,address)", +"565f2da9": "lockTokensForTeamAndReserve(address)", +"565f3297": "bindkey(uint256)", +"565f3624": "testArgOutOfBoundsFail()", +"565fd2a7": "registerCoinData(address,uint256,uint256)", +"5660000a": "tokenRewardRate()", +"566038fb": "cancelTransferRight(address)", +"56605326": "DTFCToken()", +"56610400": "Proposals()", +"566150a3": "GenerateTokenContract()", +"5661ba15": "setDungeonTokenContract(address)", +"5661bcd8": "saosao3()", +"56624ce6": "minVoteWeightK()", +"56630bce": "KycVerified(address,bool)", +"56632637": "node_dupes(uint256)", +"5663896e": "setSecondsPerBlock(uint256)", +"56639a8e": "fixUSDPriceTime()", +"56639ef6": "PikewoodFund()", +"56640afe": "getCampaignLength(uint256)", +"5664a5a3": "MonsterCreatorInterface()", +"5666496a": "_applyForCertifation(string,uint256,bool,string,string,uint256)", +"5666da53": "RYXEX(address,address,address,uint256,uint256,uint256)", +"566735d8": "PreVNK(uint256,string,string,uint8)", +"5669c94f": "issueToken(address,string)", +"566a3cb5": "getTokensHolder()", +"566b28f0": "m_tokenDiscountThreshold()", +"566bbee7": "EventCentsPerTokenChanged(uint256,uint256)", +"566bd6c3": "offerSigner()", +"566c20fc": "writeMessage(string,string,string,string)", +"566c23ad": "setLock(bytes32,string)", +"566c37de": "teamTokenHolder()", +"566c8ed2": "TCI_client(bytes32,address,address)", +"566da66c": "OwnableContract()", +"566dccf4": "enableSaleAgent(address)", +"566dd702": "chargeAdvertiser(address,uint256,uint256,address)", +"566e638e": "createCard(address,uint16[5],uint16)", +"566e78fe": "TokenDistributionMock(uint256)", +"566eebd8": "test_claimShares_emptyRewardPool_notTranscoder()", +"566f4ac5": "payMasters()", +"566fc6de": "getProfitPercent()", +"566fca87": "GazpromCoin()", +"5670d6f1": "stopAirdrop(bool)", +"5670ef72": "setConfigs(bytes32[],uint256[])", +"56715761": "minDuration()", +"567188da": "getTotalBuyBySkull(uint256)", +"5671ec30": "totalCardCount()", +"5672f548": "physicalString()", +"5674a3ed": "runLottery()", +"5675527f": "EtherIco(address,uint256,uint256)", +"567556a4": "fundsTransfer()", +"5675db9c": "setShouldGenerateDna(bool)", +"5675ef9d": "BetPlaced(bytes32,uint8,address,bool,uint256,int32)", +"56765c51": "WITHDRAWAL_WINDOW()", +"56768538": "registerForeignAddress(address)", +"5676d075": "hardCapETHInWeiValue()", +"56780085": "TOKEN_DECIMAL_MULTIPLIER()", +"56782e5b": "hplus(uint256,uint256)", +"5678494f": "ProvePrivKey(bytes32,uint8,bytes32,bytes32,bytes32,bytes32,address,uint256)", +"5678524f": "nextBuyoutPrice(uint256)", +"5679623b": "initializationDelay()", +"567990ae": "LogNoticeMsg(address,uint256,string)", +"5679f636": "toggleBankrollReachedCap(bool)", +"567a03a7": "grantBurner(address,bool)", +"567a0f35": "testHitSoftCapPreDistribute()", +"567a9c79": "claimedBountyTokens(address)", +"567c08e2": "set_minFinneyToKeep(uint256)", +"567c31f7": "taxEarningsAvailable()", +"567c5b70": "getTicketParticipant(uint256)", +"567cc2b6": "setProduction(uint256)", +"567dbf18": "__forward(address,uint256,uint256,bytes)", +"567e75c4": "getLoanState(uint256)", +"5680a3ad": "childExists(address,uint256)", +"56813535": "const_contract_eth_value()", +"56814312": "NekoToken()", +"5681e00b": "getContractMetrics()", +"56820930": "purchaseMakeCard(uint256)", +"56826ee6": "receiveApproval(address,address,uint256,bytes)", +"568287ee": "ShopperlyGlobalToken()", +"5682d43d": "checkWithdrawAddress(address,bytes32,address)", +"56833b16": "AYA()", +"5683a9e0": "LASTTRIAL456()", +"56841b36": "payToReferer(address,uint256,string)", +"56845ca0": "updateProposalOwner(uint256,address)", +"56848c05": "awardMILsTo(address,uint256)", +"5684c219": "getReportingPeriodDurationInSeconds()", +"568531cc": "accountRegistryLogic()", +"5685f6bd": "DELTA_Token()", +"56860ddc": "GTDNToken()", +"56861322": "RecievedTip(address,uint256)", +"56861450": "isAtLeast(int256,int256,string)", +"5686b54b": "cancelAgreement(uint256)", +"5687f2b8": "emitApproval(address,address,uint256)", +"56885cd8": "crowdfunding()", +"56891412": "totalLocked()", +"568a2c55": "setNewStart(uint256)", +"568a8077": "gameResult(uint256,address)", +"568ab21e": "enter(bytes32)", +"568b5915": "votesMaskByOperation(bytes32)", +"568c2163": "END_OF_MINT_DATE()", +"568d13eb": "calculateRegionInitialSalePixelPrice(uint256)", +"568d3900": "getAgentIdByAddress(address)", +"568f57e1": "removeFromApproveList(address)", +"568f7830": "SECoin(uint256,string,string)", +"568f910d": "createPost(address,address,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"568f9ce1": "activateDevice(bytes32)", +"5690d326": "initialize(address,address,uint256,address[],address,address,address,uint256,uint256,address)", +"5692b273": "finalTier()", +"5692e367": "decodedExpiration()", +"5692e54e": "test_0_ensureRegistryFunctions()", +"5693077a": "registerCampaign(uint256,address)", +"56930b55": "tokenOperationsFinished()", +"56939048": "disqualified(address,uint256)", +"5695dd8c": "FindX()", +"5695fa58": "getTotalDistributed()", +"56963c31": "setDistributeAgent(address,bool)", +"56979da7": "assignmentsClosed()", +"5698176a": "getPlayersPoints(address)", +"56982986": "lastBlock_a11()", +"5698fb44": "getTokenBonus()", +"56990301": "FoundersVesting(address,address)", +"56996f6b": "TDESupplyRemaining()", +"56997fb4": "potReserve()", +"5699c7b1": "getPendingWithdrawal(address,address)", +"569a7aab": "isLowercase(bytes32)", +"569aa0d8": "getPlayerSubmissionFromCompetition(string,uint8,address)", +"569bf836": "GYTToken(uint256,string,uint8,string)", +"569c5f6d": "getSum()", +"569ca935": "_setRolePermissions(address,address)", +"569d617b": "postRelayedCall(address,address,bytes,bool,uint256,uint256,bytes32)", +"569d623f": "setEstimatedWeight(uint256)", +"569e9c82": "burnByAgent(address,uint256)", +"569eaf61": "isPaidOut(uint256)", +"569f76e1": "teamOneDivsTotal()", +"569fa9f9": "releaseRecordsCount()", +"56a041fc": "exception(address,address)", +"56a060a2": "isTradingOpen()", +"56a24be0": "getPositionCallTimestamp(bytes32)", +"56a3015c": "Generation()", +"56a3f4ef": "collectMyReturn()", +"56a49b7a": "getStakeLockedStatus(address)", +"56a4e7f9": "GetGlobalProduction()", +"56a61fc4": "_trainPart2(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"56a620aa": "decreaseAfterBurn(address,address,uint256)", +"56a6d9ef": "transferBalance(address,uint256)", +"56a70646": "giveBackEthers()", +"56a7564e": "undistributedTokens()", +"56a765c4": "whitelistBonusAmount()", +"56a7b0bf": "Burner(address,address)", +"56a807d9": "mintvestedTokens(address,uint256)", +"56a8a270": "competitionAddress()", +"56a9399d": "YUNXIN3Token(uint256,string,uint8,string)", +"56a9a68b": "updateAllowances()", +"56aa3892": "FooContract(address)", +"56aa772f": "Use_EmergencyCode(uint256)", +"56aa7cef": "PaymentFinished()", +"56ab4b5d": "TokenPurchased(address,uint256,uint256,uint256,uint256,uint256)", +"56abf07c": "giftStar(uint256,address)", +"56ac1efa": "AcceptsProof(address)", +"56ad2931": "_moveToken(address,address,uint256,bytes,bool)", +"56ad41c8": "XandraSupply()", +"56ad609e": "Addr1()", +"56ad9f57": "CROWDSALE_SUPPLY()", +"56ae89a3": "UpdateUserBitFlag(address,uint256)", +"56af3f2b": "PredatexTiga()", +"56af4d4e": "AanshuToken()", +"56afad92": "TSTORZContract()", +"56afd6e3": "howMuchCanIContributeNow()", +"56afeed6": "SQUIRREL_BOOST()", +"56b00cb5": "Horizon0x(uint256,string,string)", +"56b0443f": "getMarketPrice(uint8)", +"56b09382": "creditDaoAddress()", +"56b15308": "deleteProvider(address)", +"56b1ddbb": "HDT()", +"56b2c5bb": "doSucceedingTransfer()", +"56b30aec": "getPendingWithdrawlListCount()", +"56b30f33": "minAmountForDeal()", +"56b32da1": "gameStarter()", +"56b49ef0": "AuctusWhitelist(uint256,uint256)", +"56b4d760": "getHeroOwner(uint256)", +"56b54bae": "blockRewardContract()", +"56b558d3": "kingContract()", +"56b5d0eb": "_replaceModuleHandler(address)", +"56b6274b": "verifyEmail(address,string)", +"56b62e2d": "JetCoin()", +"56b63df7": "tokenLocks(address)", +"56b644b0": "changeRake(uint256)", +"56b6cb70": "foundersTokensWalletSlave()", +"56b6dbe9": "AustraliavsPeru()", +"56b7538b": "nextRoundDonation()", +"56b760f2": "numFabrics()", +"56b83dc5": "info_Symbol()", +"56b86bc2": "EtherDogCore()", +"56b8c164": "getCreatorTAOSetting(bytes32)", +"56b8c724": "transfer(address,uint256,string)", +"56b8edf0": "TransferEther(uint256)", +"56b9a8ab": "tokenSales()", +"56b9e9de": "getBrehonContract(bytes32)", +"56bb4d4a": "ICO4Period()", +"56bb9b43": "getAppCode(address)", +"56bc0c5e": "UserManager()", +"56bccf91": "depositTokens(address)", +"56bd182d": "privateSupply()", +"56bd928a": "platformLaunchDate()", +"56bdb5c4": "isMainSaleBonusTime()", +"56bdc4ae": "TokenLoot(address,address,address,address,address,address,address,address,address,address)", +"56c11ba3": "priceSelectFight2Death()", +"56c190ec": "processRefundEther(address,uint256)", +"56c21897": "PowerCoin(uint256,string,string)", +"56c23836": "transferDirect(address,uint256)", +"56c26f25": "getPlayerOwner(uint256)", +"56c290b8": "t_wallet()", +"56c2c1f6": "VESTING_TEAM_CLIFF()", +"56c38b2e": "vestingGrant(address,address,uint256,uint256)", +"56c3e31a": "mintContract(address,uint256)", +"56c4339f": "isMainBridgeContract()", +"56c46ac2": "getLockedContract(address,address)", +"56c49c2a": "contractFeeMinAmount()", +"56c4b246": "WrapperLock(address,string,string,uint256,address)", +"56c4e05a": "_balance()", +"56c51ea2": "getRestrictionStatus(uint256)", +"56c5df29": "PCFF()", +"56c686b1": "getPendingWithdrawl()", +"56c6a608": "WeBuyAnyHouse()", +"56c7627e": "tokenLimit()", +"56c7eb7c": "_destroyTokens(address,uint256)", +"56c7f461": "refundContributors()", +"56c82ae5": "sendBalanceForDevelop(uint256)", +"56c88f5f": "mintAll(address)", +"56c8c30c": "maxPossibleWithdrawal()", +"56c8e12e": "refundBalance(address)", +"56c8eaba": "KRE8()", +"56ca528f": "right18(uint256)", +"56ca623e": "toString(address)", +"56ca7143": "INITIAL_FUND_BALANCE()", +"56ca8d75": "setBuyingAmountRanges(uint256[])", +"56cac2e0": "letItRain(uint8,uint256)", +"56cb6655": "stopTokenMinting()", +"56cba008": "stopSales()", +"56ccdadb": "last_roll()", +"56ccf300": "ToptalToken()", +"56cd26eb": "Digiblock()", +"56ce0e6c": "updateMetadata(string,string)", +"56ce3f5c": "dCoinswapToken()", +"56ce4bc5": "receiveEtherFromForegroundAddress(address,address,uint256,address)", +"56ce6377": "WaveVoteContractRegistery()", +"56cea4b2": "addressFounders1()", +"56cff99f": "calcGav()", +"56d0adac": "freeToExtraMinting()", +"56d0bc9a": "updateProfileEmail(string)", +"56d13e6e": "setMaxReferrerBonus(uint256)", +"56d1c866": "getMsg(string)", +"56d1d4a2": "setExchangeThreshold(uint256)", +"56d26468": "appBase(bytes32,address)", +"56d27150": "TheMMORPGToken()", +"56d2ec1b": "internalBurn(uint256)", +"56d399e8": "stakingRequirement()", +"56d3e57d": "_generateRandomNumber()", +"56d400a1": "approveDispute(uint256)", +"56d40468": "lockBountyTokens(uint256,address,uint256)", +"56d44694": "PRICE_4()", +"56d58452": "containsSender()", +"56d59777": "setAdministrator(address[])", +"56d5f541": "_getApprovedAddress(uint256)", +"56d6cad0": "iFx()", +"56d73ad1": "getCertifierDb()", +"56d7bc54": "altCreateTokens(address,uint256)", +"56d7c0da": "ChooseAwea()", +"56d7c2c8": "transferERC20Token(address)", +"56d88e27": "len()", +"56d89b1f": "AuctusBonusDistribution()", +"56d906c7": "setBounty(address[],uint256[])", +"56d95932": "getActualTokensPerEther()", +"56d9bb9a": "viewAllCertificate(address)", +"56d9c0e3": "requestReading(address)", +"56da7743": "getBetsNums(address,uint256)", +"56da934e": "addTowardsTarget(uint256,uint256)", +"56daf2c1": "paymentWeiOwed(uint256)", +"56daf906": "THAW_CYCLE_LENGTH()", +"56db3df0": "weiForToken(uint256)", +"56db6353": "buildChainlinkRequest(bytes32,address,bytes4)", +"56dbc007": "isChild(address,address)", +"56dcd2fa": "ICO_LEVEL_3()", +"56ddbe7a": "setVRC(address,address,uint256)", +"56ddeea2": "getIcoDiscountPercentage()", +"56ddf404": "Executed(string)", +"56de9219": "Arina_amount()", +"56de96db": "setState(uint8)", +"56dfe628": "viewa2(address)", +"56e19e6e": "DDNToken(uint256,string,uint8,string)", +"56e1c40d": "burnFeeNumerator()", +"56e27ce6": "LuxToken()", +"56e2eab8": "listAddress(address,uint256,uint256)", +"56e379c1": "setICOLimit(uint256,address)", +"56e39c58": "ProtectedTransfer(address,address,uint256,bytes32)", +"56e3df97": "getGeneration(uint256)", +"56e40a32": "auctionEthEnd(address,uint256,uint256,bytes)", +"56e428fc": "LogAccessChanged(address,address,bytes32,address,uint8,uint8)", +"56e44954": "setExchangeRates(address)", +"56e49287": "auctionsEndTime()", +"56e4b68b": "supervisor()", +"56e4bc1f": "payed()", +"56e4e073": "TestETHToken()", +"56e523e2": "OpenSourceChainToken(address)", +"56e52cbb": "getMinWeiForDInit()", +"56e567e5": "balanceOfa(address)", +"56e5cf2e": "setBytesArray(bytes32,bytes32[])", +"56e5e12b": "fundariaPoolAddress()", +"56e60a31": "TokenExchangeFailed(address,uint256)", +"56e62326": "createMultiple(uint256[],uint256[],uint256[],address)", +"56e721b3": "_getRefBonus(uint256)", +"56e789eb": "checkTotalSold()", +"56e7bcd1": "putUsername(string)", +"56e7f6c7": "layerCount()", +"56e83e81": "randao()", +"56e8596f": "grantContributorTokens(address)", +"56e8b3ac": "PabloPlusToken()", +"56e8efd4": "EventNotarise(address,bytes,bytes)", +"56e8f53e": "_crownTotalSupply()", +"56e97617": "bullcrapToken()", +"56e9ae71": "OCTCOIN()", +"56e9d1f3": "deList(bytes32)", +"56e9ec88": "equipmentItem(uint256[],uint256[],uint256)", +"56ea84b2": "getMarketCurrentIndex(uint256)", +"56eaf1c0": "commissionPoints()", +"56eb5a79": "Bags()", +"56ebb303": "rewardContributors(address[],uint256[])", +"56ebd52d": "STRAAToken()", +"56ed8636": "membershipStatus(address)", +"56eeb3b0": "startAtBlockNumber()", +"56ef9296": "getMultiRequestFirstRequestId(uint256)", +"56f09125": "getConverters()", +"56f10988": "GDCNumber4()", +"56f14cf6": "_burn(address,uint256,uint256,uint256)", +"56f1594e": "UpdateMoneyAt(address)", +"56f19703": "rejectedBookingfc(uint256)", +"56f1d2dc": "increaseSystemCreatedCount()", +"56f1dd6b": "ifoodDev()", +"56f2b308": "GDCNumber2()", +"56f2eb90": "pendingRewardsToMint()", +"56f2fc89": "deployIdeas(address)", +"56f399a7": "getContractInvoices(uint256,uint8)", +"56f43352": "tradingFee()", +"56f464ea": "releaseFundsWhenBothSigned()", +"56f50473": "downPayment()", +"56f66f4c": "reportResult(uint32[],int8[],uint32,uint32,uint32,uint32,bytes32)", +"56f6e184": "addToWhitelist(uint8,address)", +"56f7cafe": "registry_exec_id()", +"56f91399": "trCut()", +"56f99fcb": "freezeLottery(uint32,bool)", +"56fa47f0": "split(address)", +"56fa9f6b": "allowRating(address,address,uint256)", +"56fadf8e": "createItem(string,uint256,uint256,address,uint256[6])", +"56fb46d7": "COOPERATE_REWARD()", +"56fb8a34": "getPivot(uint256,uint256,uint256)", +"56fbd029": "Saflok(bytes32,bytes32,bytes32,bytes32)", +"56fbdca3": "whitelistInvestor(uint256)", +"56fbf488": "setPrix(uint256,uint256)", +"56fc35d3": "BunzolaToken()", +"56fc6dae": "getUpline()", +"56fcb29f": "selfPayout()", +"56ff2318": "usersWithdrew(address)", +"56ff55d1": "_isSchemeRegistered(address,address)", +"56ff83c8": "crowdsaleWallet()", +"56ff918d": "getNextKillingAfter()", +"57006864": "checkBetParity(uint8)", +"5700cb10": "getMainRemainCoins()", +"570136ad": "liuToken(address,address)", +"57014fee": "domainOwner(string,string)", +"57016ded": "transfer_to_reserves(address,uint256,uint256)", +"57019b37": "setControllerAddress(address,address)", +"5701ac59": "calculateReferralFee(uint256,uint256)", +"5701e9c0": "TrustlessTransaction_Refunded(uint256,uint256)", +"570200c0": "setStarterPack(uint256,uint16)", +"5702b530": "byteToString(bytes1)", +"57035b60": "SWIZERStandardToken(uint256,string,uint8,string)", +"570468f0": "SupportRemoved(address)", +"5704b927": "ASXC(uint256,string,string)", +"57056261": "insert(uint256,bytes32[])", +"5705b612": "getUserId(address,address)", +"5706d99a": "STAGES()", +"5707812e": "addToLists(address,bool,bool,bool,bool)", +"5709013e": "changeToStage(uint8)", +"570919a6": "retrunError()", +"5709d7bd": "DevPromotionsMarketingWallet()", +"570a2a16": "right53(uint256)", +"570a8496": "uploadData(bytes32[])", +"570b615a": "tournamentDataIPFSHash()", +"570bc25f": "makeOrder(address,address[5],uint256[8],bytes32,uint8,bytes32,bytes32)", +"570ca735": "operator()", +"570d2f8f": "trustedWallet()", +"570d31b7": "ConsultaRegistro(bytes32)", +"570e0db5": "addDestination(bytes32)", +"570e6729": "getOptionHash(address[3],uint256[3])", +"570e997d": "gettnode(address)", +"570f65c4": "getProjectArbitrationFees(bytes32)", +"570fceb0": "updateHashrate(address,uint256)", +"570fe8c3": "cancel_payment(uint256)", +"571080ae": "getMyLobster()", +"5710ac73": "unlock(address,address[],uint256[])", +"5710de14": "newProof()", +"5710ed95": "contractBlock()", +"5711b311": "executeRemoveAuthorizedAddress(uint256)", +"571218fa": "priceModel()", +"57128ec1": "userGrowPoolAddress()", +"57135859": "BBBToken(uint256,string,string)", +"57138106": "verifyKyc(address)", +"5713fcb7": "compatible20()", +"5714db23": "AdvisoryPool(address,address)", +"5714e01f": "ownsAddress(string,address,address)", +"5714f6a1": "getTotalAvailableRelays()", +"57157189": "getListMarkets(address,uint256)", +"5715b530": "claimReservedTokens(string,address,uint256,string)", +"5715c5b7": "getTokenAddressByIndex(uint256)", +"57163cc3": "initAtx(address,address,address,uint256)", +"571694cd": "getHashOfSecret(bytes32)", +"57183698": "addProject(uint256)", +"57183c82": "instantiations(address,uint256)", +"5718b760": "withdrawSize(address)", +"5718b994": "checkEvent(address,bytes,bytes,uint256)", +"571959e0": "getServiceProvider()", +"57199334": "insertUser(address,bytes32,bytes32,bytes32,uint256)", +"5719a565": "SignerChanged(address)", +"5719dd22": "getTokenListLength()", +"571a045d": "change_game_stic(string)", +"571a0830": "withdrawAndKill()", +"571a1f66": "erc165UpdateCache(address,bytes4)", +"571a26a0": "auctions(uint256)", +"571af13b": "unlock10PercentTokensInBatch()", +"571b0227": "createUserLottery(uint32,uint32)", +"571b3d52": "createCitizen(address,uint16,uint16,uint8,bytes32,bytes32,bytes32)", +"571c4539": "askQuestion(address,uint256,string,address[])", +"571e4a6d": "addEngineer(address,uint256,uint256)", +"571ebd3c": "addCandidate(address,bytes32)", +"571ec8d9": "addBoardScore(bytes32,bytes32,uint256)", +"571f4d9a": "getOffsets()", +"571fe016": "MAX_SALE_SUPPLY()", +"57204a1d": "unlockat()", +"57207703": "initBank(uint256)", +"5720988b": "QLANCE()", +"57211ac0": "getPaidOut(address)", +"5721b89a": "withdrawNoMoney(bytes32,address)", +"5721e419": "getBuyer(address)", +"5722e24a": "setLogger(address)", +"57230ff8": "createCity(uint256)", +"57240913": "vouched(bytes32,uint256)", +"57241f8e": "tokensOnSale()", +"5724630c": "Disbursed(address,uint256)", +"57246c1c": "getPartnerCash(uint8,bool)", +"57246d23": "jackpotSize()", +"57257a67": "startPrivateSales()", +"5725b8c5": "_initRandom()", +"57260364": "changeSubcourtTimesPerPeriod(uint96,uint256[4])", +"57263ce1": "_isProviderValid(uint256)", +"57266803": "casinoWithdraw(uint256)", +"57271a93": "bountyP()", +"57277b92": "storeEth()", +"5727dc5c": "BB()", +"5727e25d": "getCurrentRoundId()", +"5727e30b": "makeOraclizeQuery(uint256,string,string,uint256)", +"5727eec0": "speed_limit()", +"572816ef": "audit(uint8,uint8,uint256)", +"57282b96": "bobMakesErc20Deposit(bytes32,uint256,address,bytes20,bytes20,address,uint64)", +"5728ab6c": "kyberTrade(uint256,address,address,bytes32)", +"57292af8": "bonusRateOneEth()", +"572b130f": "addItem(uint256,uint256,uint256,uint256)", +"572b7a03": "minimumFeePlusDividendsPercentage()", +"572bcb3e": "setLockByPass(address[],bool)", +"572bcfe1": "deliverRewardedTokens(address,uint256,string)", +"572c1517": "transfer(uint256,string,bytes)", +"572c62ca": "poolSale()", +"572d5298": "setProduct(string)", +"572e85ec": "getCurrentPhase(uint256)", +"572f37b4": "notePrepurchase(address,uint256,uint256)", +"57315881": "getdoctor(uint256)", +"5731d433": "balanceInLottery(uint32,address)", +"5731d9cb": "seriesInfo(bytes32)", +"5731d9e3": "onefive()", +"5731f357": "oraclize_query(uint256,string,string,string)", +"5732788a": "validateCompanyName(bytes32)", +"57329424": "getPorscheByOwner(address)", +"5732a273": "backup_drawdown_amount(uint256)", +"573328ef": "advertising()", +"57332f08": "Lexcoin()", +"57337044": "randomByWeight()", +"57344e6f": "getCredit(address)", +"57347f24": "playerWithDraw(uint256)", +"573618f3": "eXchangeQualityCoin()", +"5736c9d4": "getStageBuyers(uint8,uint16,uint8)", +"57381228": "betInStageAndReturnExcess(uint256,uint256)", +"57381ee4": "sendTokens(address,uint256,uint256,bytes32)", +"57386c2a": "smallId()", +"5738fa56": "hasDataStream(bytes32)", +"57393674": "exhaustFusion(uint256)", +"573939de": "_resetFrozenInfo(address)", +"573c0bd3": "updateValue(uint256)", +"573d2411": "VeraCoinPreSale(uint256,uint256,address,address,uint256,uint256,uint256,uint256)", +"573d3a23": "makeTransfer(uint256,uint256,uint256,bytes32)", +"573d559f": "_handleCoolDown(uint256)", +"573d72b7": "PERIOD_AFTERSALE_NOT_TRANSFERABLE_IN_SEC()", +"573dea96": "toWei()", +"573f642d": "_productDigest()", +"573f7af5": "mintNFTsForSale(uint256[],bytes32[],uint256[])", +"57400cf3": "currentJackPot()", +"57405301": "creatorad()", +"57408a98": "getNode(int256)", +"5740a4be": "CertifyDelegate(address,uint256)", +"5740d43c": "setDeprecated(address,bool)", +"57411a67": "getAddressDigit(address,uint8)", +"57417e78": "insetMoney()", +"5741fbce": "isPresellOpen()", +"574356b4": "VULCAN_PROMETHEUS()", +"5743cee0": "BwwToken()", +"57446636": "createContractOfAthlete(string,address,uint256,uint256,uint256)", +"574479e6": "currentPot()", +"574490cd": "ERC721Address()", +"57451104": "bonus_for_add_stage()", +"57478e38": "Free_Ether_A_Day_Funds_Return()", +"5747baf5": "Roles()", +"57481222": "get_all_project_information(uint256,address)", +"574844f4": "BLMFund()", +"574a5e31": "weiPerAtom()", +"574a89e9": "GOOGLE()", +"574bea92": "bonusPhaseOneDeadline()", +"574c339a": "HackerSpaceBarneysToken()", +"574c8776": "addAddressesToRole(address[],string)", +"574cc0fe": "addManyToWhitelist(address[],uint16,uint256)", +"574d6554": "setIPFSHash(string,string)", +"574e9063": "crowdfundPercentOfTokens()", +"574edd28": "updatePropertyData(uint256,string)", +"574f9a81": "setAttr0(uint256)", +"5750644a": "setProviderParameter(bytes32,bytes)", +"5750abfa": "BONUS_TIMES(uint256)", +"5750daa0": "GameToken()", +"57518243": "addToWhitelist(address,address)", +"575185ed": "createGroup()", +"5751892f": "increaseProjectCompleteLevel()", +"57530017": "setReservedTokensWallet(address)", +"57536e64": "GuessTheRandomNumberChallenge()", +"5753a6b2": "construct(bytes32,string,bytes32,address,uint128,uint256,uint64,uint64,uint256)", +"57548f32": "_tokenPurchased(address,address,uint256)", +"5754a042": "attempts()", +"5754aadc": "getEntryByName(bytes32)", +"57553101": "updateDetails(string,string,string)", +"5756572e": "Show_the_name_of_Option_B()", +"5757a66a": "_deployBallotChecks(bytes32,uint64)", +"5757dcdf": "getCooldownIndexFromGeneration(uint16)", +"5758537b": "payBonusAffiliate(address,uint256)", +"57593c23": "TokensDelegated(address,uint256,address)", +"57595e2a": "get_previous_global_audit_document(bytes32)", +"57597321": "_findpos(uint256,uint256)", +"57599dff": "curatorAddressOf(uint256)", +"5759e7af": "getMilestonesLength()", +"575a4187": "getClaimableStake()", +"575a7722": "setPOOL_edit_29(string)", +"575ab848": "MatCashToken()", +"575b4071": "currentPeriodEndTimestamp()", +"575b6efe": "EARLY_INVESTORS_SUPPLY_LIMIT()", +"575b8cc8": "kcck256str(string)", +"575cb0f6": "block()", +"575cea6b": "getUserReferrals(address)", +"575d462a": "phase1EndBlock()", +"575dfc4a": "Sale(uint256,uint256,uint256,uint256,address,address,uint256,uint256,uint256,uint256,string,string,uint8)", +"575eaf98": "fractionalize(address)", +"575ed3de": "ViewGold()", +"575f7832": "InterestFinal(address,address)", +"5760168b": "ElearningCoin(uint256,string,uint8,string)", +"576077e2": "realtransfer(address[],uint256[])", +"57607ddd": "PUBLIC_SALE_END()", +"57611ba3": "offerCollectibleForSaleToAddress(uint256,uint256,uint256,address)", +"57614c2a": "resetLockReleaseTime(address,uint256)", +"576168fc": "partnerAddress()", +"57623d59": "AttachAsset(uint256)", +"5762a880": "standFeeBefore500()", +"5762f25f": "test_1_validShouldBe5()", +"57635dc1": "validate(address[5],address,uint256[12],uint256,bytes,uint256)", +"5763e103": "powercontract()", +"57646d5d": "OkkamiToken()", +"57650592": "getPlayerBackDataForMarketPlaceCards(uint256)", +"57651be6": "replaceUser(address)", +"57652f13": "assingAdminship(address,uint8)", +"5765a796": "addRegistered(address)", +"5765cc2a": "setmessiDevAddress(address)", +"5765dd1a": "MTC(address,address,address,address,address,address,address)", +"57670366": "getTargetReportsPerReporter()", +"576709a2": "finishingWithdrawing()", +"5767b9ab": "retrieveV(uint256)", +"5768bc4a": "_createArmy(string,string,uint256,uint256,uint256)", +"5768fca3": "paymentDestination()", +"57693e9a": "NBB()", +"576b8bba": "SeedMemberCanDraw()", +"576bc138": "NKCToken()", +"576c3de7": "getTier(uint16)", +"576c51bc": "countOfPublicKey()", +"576cecdc": "checkStubs(bytes32,bytes32,address)", +"576cfdd7": "window2EndTime()", +"576d067b": "StageOneDisable()", +"576d1ce1": "internalVerifyCert(bytes32,bytes32,address)", +"576d4e13": "_createLinglongCat(uint256,uint256,uint256,uint256,address)", +"576e6d4e": "_buyXaddr(address,uint256,bytes32)", +"576eac66": "setFundingGoal(uint256)", +"576f35e3": "setBatchSize(uint256)", +"576f7e31": "getApprovedBuyerMappingCount(address)", +"576f9cba": "isInDirectory(address)", +"577000a3": "onlyPartnersOrAdmin(address)", +"57712f37": "CappedBurnToken(uint256)", +"577131ac": "bankrupt(address[])", +"57717090": "transferWinnings(uint256,address)", +"5771d6e4": "readMessage(string)", +"5772437f": "unfreezeOf(address)", +"57727a04": "ZZCoinToken()", +"5772ae70": "setLoanManager(address)", +"5773faf9": "modifyVariable(address,uint256,uint256,uint256,uint256)", +"5774ce4d": "sendBonus(address,address,uint256)", +"5775b57e": "totalBuyOrdersOf(address)", +"57764094": "getRate(uint256)", +"5776af28": "shardAward(address,uint256,uint256)", +"57771a23": "del(uint256)", +"5778472a": "getOrder(bytes32)", +"57786394": "feeMake()", +"57788716": "doKeccak256(uint256)", +"577890f6": "presaleFallBackCalled()", +"5778bec2": "Deal()", +"57796e1c": "setVote(uint256,uint256)", +"577a75a0": "CRAWDSALE_END_DAY()", +"577bd336": "progress()", +"577c78f1": "SitcomToken()", +"577ccfe0": "tokenFrozenUntilNotice()", +"577ec5ae": "cookieProductionMultiplier()", +"577ef53d": "SetA(uint256)", +"577f7133": "PHOENIX_CORSAIR()", +"57806705": "addpatient(uint256,uint256,string)", +"5781d9e7": "isRegisteredRetailer(address,address)", +"57820829": "UP_etherWin()", +"578242c3": "CompositeCoinCrowdsale(uint256)", +"57831809": "payoutCount()", +"57835720": "setSetupCompleted()", +"578436a7": "CoinDisplayNetwork()", +"57850fc7": "getPotentialAmount(address)", +"578551aa": "goods(uint32)", +"5785b3f9": "VIRALTOKEN()", +"57861e65": "VVDBCrowdsale(address,address)", +"5786a552": "registerEmployee(address)", +"5786cbdc": "sendBackSurplusEth()", +"5786f28c": "regionsIsPurchased(uint256)", +"5786fd40": "getProductsCount()", +"57875631": "setAccessPolicy(address,address)", +"578799b3": "QRTok()", +"57880042": "bulkPurchageEgg()", +"57880c04": "releaseForce(address,uint256[],uint256[])", +"57885380": "ChannelAudited(uint256)", +"5788a081": "ownerAddressMap(address)", +"57894c1b": "createClone(address)", +"57895ca2": "setManagerContract(address)", +"5789a722": "LocusToken()", +"5789b1cd": "transferAdminMessage(address,address)", +"5789baa5": "isUnlockedBoth(address)", +"578a791d": "setExchangeFeeRate(uint256)", +"578aa665": "_createToken(string,address,uint256)", +"578affb4": "Logger(string,bool)", +"578b08e2": "GPUxToken()", +"578b2dab": "euroTeams(uint256)", +"578b3a56": "normaliseCardIndices(uint256[])", +"578bbdc1": "isSaleContract(address)", +"578bcc20": "reduceDebt(address,address,uint256)", +"578bcf35": "distributed(address)", +"578bcfca": "AddedToHolder(address,uint256,uint8,uint256)", +"578c3485": "iWantToKillMyself()", +"578c6642": "BONUS_BATCH()", +"578cf4a9": "testTemp1()", +"578d52b6": "GetDidPayOut(bytes32)", +"578de482": "OCE()", +"578de8aa": "addressToAsciiString(address,address)", +"578e2f7d": "verifiPost(uint256,bool)", +"578e9825": "burnEscrow(uint256)", +"578ee866": "getCurrentTimeBonusRate()", +"578f9658": "shopTome()", +"578ff67a": "new_hash(bytes32)", +"57901b19": "genRandomArray(uint256,uint256,uint256)", +"57902a75": "rateTier2()", +"579078cf": "TestAnyChain()", +"5790de2c": "ProposalAdded(uint256,address,uint256,bool,string)", +"579140e8": "BITSEACoinERC20Token(uint256,string,string,uint256)", +"579140f4": "tokenInitialized()", +"57915897": "faucet(uint256)", +"57918052": "setPriceIncreasingRatio(uint16)", +"5792b512": "Bettereum()", +"5792e1de": "CheckCarToken()", +"5792e262": "registration_fee()", +"579327fd": "TOTAL_ETHER_HARD_CAP()", +"5793511f": "playersList()", +"57938b2a": "requestCancellationMinimumTime()", +"5793bfdc": "createSDC(address,address,uint256,uint256)", +"579424e7": "HOWLToken()", +"579425b7": "feeBurnerContract()", +"57945e3e": "anyAssetHasChanges()", +"57945ed1": "FindMyFish_EnterBarcode(bytes9)", +"57946897": "Test11()", +"57946a86": "SPEKToken()", +"57950697": "testState()", +"57955f3b": "ExampleIntervalTree()", +"579599bd": "canCreateEdition(uint256,uint8)", +"57978a75": "updateInviteInfo(address,uint8)", +"5797cd52": "Settle(uint32,uint32)", +"57987d38": "PSCN()", +"57988a55": "card_gold_first()", +"57989b4c": "IsCityNameExist(bytes32)", +"5798d5bc": "rSetA(address)", +"579952fc": "transferFromTo(address,address,uint256)", +"579b9499": "estimatePurchasePayment(uint256,uint256)", +"579badf6": "UniversalFunction(uint8,bytes32,bytes32,bytes32,bytes32,bytes32)", +"579cd3ca": "conversionFee()", +"579cdf17": "getAdminName(address)", +"579d4f7a": "changeHouseFeePercent(uint256)", +"579d5fba": "debug_hash3Int(uint256)", +"579da090": "needUpdate()", +"579db769": "getIudex(address)", +"579e0b87": "assignAnotherOwner2(address)", +"579f0789": "BNN_ALLOCATION()", +"579f20d8": "submitProxyVote(bytes32[5],bytes)", +"579f61d8": "valueDelete(string)", +"579fc25e": "contractFallback(address,uint256,bytes)", +"579fe761": "vote(uint80,uint80)", +"579fea7d": "setDolRate(uint256)", +"57a0685b": "privateSaleMinEth()", +"57a15c4f": "createOffspring(address,string,uint256,uint256)", +"57a1a58e": "setCycleResetTime(uint256)", +"57a218e6": "WeSource(bytes32)", +"57a27a76": "checkCompletedCrowdsale()", +"57a2e60c": "VoiceCoin()", +"57a373a1": "uintInArray(uint256,uint256,int256,uint256[],uint256)", +"57a533e9": "logPromiseCreated(uint256,address,uint256,uint256)", +"57a756d3": "walletC()", +"57a83f25": "TKRToken()", +"57a858fc": "shares(uint256)", +"57a8c01f": "registerUser(address,uint256,uint256,uint256,uint256)", +"57a967ca": "waitingForClaimTokens()", +"57a96dd0": "proxyTransferWithReference(address,uint256,bytes32,string,address)", +"57a9838a": "Tronerium()", +"57aaafe2": "toggleArtworkVisibility(uint256)", +"57aaf08b": "getAlgosByCreator(address)", +"57abd75d": "_weiToMth(uint256)", +"57acc118": "setForward(address)", +"57ad693b": "MIN_UPDATE(bytes32,uint256)", +"57adc83a": "angelTime()", +"57aeb5c8": "convertToMiniCFT(uint256)", +"57aee888": "_eraseNodeHierarchy(uint256,bytes32[],bytes32)", +"57aeeb25": "becomeSquirrelmaster()", +"57af3eec": "STARTING_HIPSTER()", +"57afb890": "collectRemaining()", +"57b001f9": "unpause(address)", +"57b021f3": "dynamic_profits2(address,address,uint256)", +"57b07cd9": "getReleaseHash(uint256)", +"57b16811": "totalsInfo()", +"57b34be7": "_moveStage()", +"57b394bf": "walletWithdrawal(address,uint256,uint256)", +"57b45386": "removeCode(string)", +"57b473e2": "okamiMinPurchase_()", +"57b543e2": "getOwnersLength()", +"57b69e72": "_kittenContract()", +"57b70510": "parseResult(bytes)", +"57b7247e": "UserWallet(address,address)", +"57b7a0b6": "Paye()", +"57b8e8c3": "devcon2Token()", +"57ba8652": "getRank02()", +"57babe2e": "collectedBcy()", +"57bbf921": "salesaccount()", +"57bcccb6": "revokePermanentApproval(address)", +"57bce8b0": "sendWei()", +"57bcfc09": "HomeChain()", +"57bd2a65": "allocated3Year()", +"57bd4f7b": "getTime1(address)", +"57bf04be": "changeOwnedOwnershipto(address)", +"57bf66d4": "accountForIncrease(uint256,uint256)", +"57bfab93": "getAllABaddress()", +"57c07055": "scheduleCall(address,address,bytes4,bytes32,uint256,uint8,uint256)", +"57c19b4f": "postFreezeDestination()", +"57c1a709": "travelUnitFee()", +"57c1f9e2": "removeDistributor(address)", +"57c1feca": "BonusChanged(uint256,uint256,uint8)", +"57c393fa": "transferSuperuser(address)", +"57c3b376": "updateRandContract(address)", +"57c3f997": "isReserved(address)", +"57c508d3": "IsThisExternal()", +"57c60982": "calcProfit(address)", +"57c67ad1": "RobotTradingIco()", +"57c6c642": "MultiTranser()", +"57c85787": "batchMint(address[],uint256[],uint128[])", +"57c8b724": "addPresetTransfer(address,uint256)", +"57ca94fa": "_addUser(address)", +"57cb2fc4": "getInt8()", +"57cb48c9": "issuerTokenName()", +"57cb4947": "mintRequest(address,uint256,uint256)", +"57cc2d52": "testStoresParentChallenge()", +"57cc5941": "getTileClaimerAndBlockValue(uint16)", +"57ccbe28": "isPreICOPrivateOpened()", +"57ccc80e": "putSmartContractOnSale(bool)", +"57cd23a6": "TeamLockingPeriod24Months()", +"57cd650d": "sealDataStream(address,address,uint256,bytes32,uint256,bytes32)", +"57cdd078": "isIcoInProgress()", +"57cdf799": "createContractItem(string,bytes32)", +"57ce0ec0": "MIN_PRE_ICO_SLOGN_COLLECTED()", +"57cea5c0": "weaponTokenIdToDamageForEncounter(uint256,uint256)", +"57cf9add": "showOwnerContract()", +"57cfd296": "getFurnace(address)", +"57cfeeee": "transfer(address,uint256,bytes32)", +"57cff409": "tpt()", +"57cff437": "getKunsByOwner(address)", +"57d0354b": "NothingToCancel(address)", +"57d083b5": "_evaluateSkill(address,uint8,uint256,uint256,uint256)", +"57d13917": "getCompany(uint256)", +"57d15c6a": "_time()", +"57d17805": "getTokensSold(uint256)", +"57d1c582": "TokenData(address,uint256,address)", +"57d25a0f": "retrieveAssets(address)", +"57d4021b": "nextPayoutWhenPyramidBalanceTotalsApproximately()", +"57d444fd": "detachController()", +"57d4617b": "getAllocatedTokenAddress(address,address,uint256)", +"57d4f398": "unfreezeBalance(address)", +"57d55116": "_safeApprove(address,uint256)", +"57d55367": "publishResult(uint32,string)", +"57d56267": "getModuleCount()", +"57d5927f": "LogOraclizeCall(uint256,bytes32,string,uint256)", +"57d5939c": "IsValidated(string)", +"57d61f3c": "TokensSold(address,uint256)", +"57d62a30": "accountFeeModifiers(address)", +"57d6f5f2": "canLogIn(address)", +"57d70c0b": "getIcoRuleList()", +"57d713d5": "getPendingUserCount()", +"57d775f8": "epochLength()", +"57d786da": "_checkPolicyEnabled(uint8)", +"57d93329": "endCrowdsalePhase3Date()", +"57d9fd41": "orderLastDate()", +"57da1fb2": "isMonsterChampionship()", +"57da9166": "Dodol()", +"57db8024": "adminDeposit(address)", +"57dbefdd": "addExcluded(address,address)", +"57dc2658": "setLastCrowdsale(address)", +"57dc561f": "assignTokenIJK(address,uint256)", +"57dc5d9d": "adminer()", +"57dc9760": "DaoChallenge()", +"57dd2f26": "AntriexToken(uint256,string,string)", +"57dd8366": "jackpotGuaranteed()", +"57ddf217": "gameoverGetYUM(uint256)", +"57de26a4": "read()", +"57df844b": "getTokenTotalSupply()", +"57e07140": "testTransferFromCorrectlyAllowsDelegationOfTokenOwnership()", +"57e0b222": "ERC20Store(address)", +"57e18886": "reserveTokens(address,uint256,uint256,uint256)", +"57e1fae2": "transferChild(address,address,uint256)", +"57e233e2": "hardcapUSD()", +"57e25a79": "PullPaymentCapable()", +"57e2880d": "scheduleTransaction(uint256,uint256)", +"57e49ca8": "safeTransferChild(address,address,uint256)", +"57e4e95d": "burnerChangeable()", +"57e53d4e": "currentStageETHContributions()", +"57e5be05": "current_mul()", +"57e5eea5": "getCurrentBonus()", +"57e60c27": "removeAccountReader(address)", +"57e6a64c": "AddrRewardPlan()", +"57e6a6af": "METS6()", +"57e6c2f4": "isAuthorized()", +"57e71cd7": "setPreIcoHardCap(uint256)", +"57e7afd0": "addIPFSFile(string,uint256,string,bytes32,uint256)", +"57e871e7": "blockNumber()", +"57e8f401": "getUserLandLimit(address)", +"57e984cf": "changeMonthlyRate(bytes32,uint256)", +"57ea563a": "tokensByLtcTx(string)", +"57ea89b6": "Withdraw()", +"57eabab4": "defaultMintingAddress()", +"57eaeddf": "_isContract()", +"57eb3431": "recordPresalePurchase(address,uint256)", +"57eb95a7": "trainSpecial(uint256,uint256,uint256[2])", +"57ebc286": "approve_fixed(address,uint256,uint256)", +"57ebc7a8": "logLargeContribution(address,address,uint256)", +"57ee24af": "getNum(bytes32,uint256)", +"57ef58c1": "canDefrostAdvisors()", +"57f011b6": "destTokensEarlyInvestors()", +"57f032e7": "changeAgent(address)", +"57f04d2b": "updateLedger(uint256,address[],address,uint256[],uint256[])", +"57f1935f": "refundTokens(address,address)", +"57f196fa": "lastBidID()", +"57f1f6ca": "rareStartPrice(uint256)", +"57f232e1": "buyFucks()", +"57f2c6b7": "withdrawOfferForCollectible(uint256,uint256,int256)", +"57f2d763": "LongTerm()", +"57f32591": "changePriceChangeName(uint256)", +"57f46cbe": "collect(uint256[])", +"57f47bf9": "sh_doAgree()", +"57f4d5ec": "processDividends(address,uint256)", +"57f5abe5": "setERC20TotalPromo(uint256,uint256)", +"57f6280e": "FundManager()", +"57f65e24": "setArray(bytes32,string[])", +"57f664ed": "TOKENS_ALLOCATED_TO_PROOF()", +"57f70b21": "WorldToken(uint256,string,uint8,string)", +"57f7b905": "balanceBonusOf(address)", +"57f86b6a": "theRiver()", +"57f91458": "sacredToken()", +"57f94c82": "airDropTokenIssuedTotal()", +"57f9fb11": "internalRefund(address)", +"57fa7044": "_changeCycleValue(uint256,uint256)", +"57faa161": "TokenBonusGiven(address,uint256)", +"57fb25cc": "initialize(address,address,uint256,uint256,address)", +"57fbac06": "setAllowTransferExternal(bool)", +"57fbb9df": "withdrawContractBalance(address)", +"57fc3991": "returnTokens(address,address,uint256)", +"57fc8a20": "custom(address,bytes)", +"57fc990f": "_createAuction(uint256,uint256,uint256,uint256,address)", +"57fdf2b2": "transferrableBalance(address,uint256)", +"57fe5a5f": "FREEREWARDPPOINT()", +"57ffd7cc": "createNewContract(uint256,address,address,address)", +"57ffd863": "deleteHiddenPosition(bytes32)", +"5800827c": "mintExtraTokens(int256,uint256)", +"580101c8": "startingSnailAmount()", +"580215fc": "transferFinal()", +"580225d5": "HomeBridge(uint256,address[])", +"58022de4": "recoverSigner(bytes32,bytes32,bytes32,uint8)", +"58022e3f": "AkbulutTokenICO()", +"5802c695": "setPendingValue(uint256,bool)", +"5802f02d": "SavingsAccount()", +"58047913": "getWrappedContract()", +"58056392": "setLockBalance(address)", +"58057468": "confirmTransferOwner()", +"58057d81": "transferDomainToBuyer(uint64)", +"58058304": "clearFund(uint256)", +"580588a1": "havedAirDrop()", +"58062e66": "VIRTVEN()", +"5806ba15": "InbotToken(string,string,uint8)", +"580709cb": "downTheDrainImmediate()", +"58074d8b": "keyIndex()", +"5807630f": "transferEthToOnwer()", +"5807703d": "getMainGasPrice(bytes)", +"580786cf": "getRoundOpen(uint256)", +"58078a5a": "_checkAndAdd(bytes32,bytes32)", +"58079e7b": "setStartOfPresale(uint256)", +"580822da": "CoinLordToken(address)", +"5808e1c2": "betOnNumber(uint256)", +"5808ee15": "setDefroster(address)", +"5809ea99": "hitPrice()", +"580b72e1": "approveTokens(address,uint256,uint256)", +"580bd977": "distributeFunds(uint8)", +"580bdf3c": "disableBetting_only_Dev()", +"580c0fd8": "COMIKETCOIN()", +"580c2ae9": "numberOfPurchasers()", +"580c5072": "IsPremature(uint256)", +"580cf318": "tokenRemainCap()", +"580e77d4": "startMainSale()", +"580ea491": "PatronageRegistry(address)", +"580efd6b": "totalWageredForAddress(address,address)", +"580f2427": "LeeSungCoin()", +"580f3904": "requestTokens(address)", +"5810291a": "getplayerpool()", +"581191f7": "DNATIXToken()", +"58128969": "cycleStart()", +"5812f78a": "A2UToken()", +"58144fbd": "covmanAddress()", +"58150c8b": "GameRegistry()", +"581515fd": "howManyEtherInWeiToBecomeOwner()", +"5815528c": "setInviterEdge(uint256)", +"581627bc": "ownerWithdrawl(uint256)", +"58163c23": "calcBonus(uint256,bool)", +"5816ba9d": "unFrozen(address)", +"58172da1": "payBankroll()", +"581732dc": "setLev1(uint256)", +"5817465c": "RidgeToken()", +"58178168": "punkIndexToAddress(uint256)", +"581847d6": "changeDeveloperSFTDestinationAddress(address)", +"58189259": "CerradoToken()", +"58189e03": "processExits()", +"5819dde2": "getNumbersFromBytes(bytes3)", +"581a3aea": "ActiveSCO(bool,uint256)", +"581a81c1": "setMinHouse(uint256)", +"581aa8a3": "SRVSKCOIN()", +"581bdd23": "createCampaignAndChannels(address,uint256,string,address[],address[],address[],uint256[],address,string,bytes,uint32[])", +"581c1f47": "isFreeze(address,uint256)", +"581c281c": "getVotingStatus()", +"581c5ae6": "invest(address,uint8)", +"581c71d0": "ifClaimedNowPublic()", +"581ca8bb": "adjustCash(address,int160,string)", +"581d1015": "publicsalesTokenPriceInWei()", +"581d1d04": "devTokensIco3()", +"581d416a": "Paid(uint256)", +"581e69de": "pauseRoundD()", +"581f1125": "returnUnsoldSafeSmall()", +"581f3c50": "createAndOpen(address,address)", +"581fc2ad": "getNextReleaseTimeOf(address,address)", +"581ff6e2": "VerifyPublishedResults(uint16)", +"5820c9ae": "round4()", +"5820dce5": "abbuchen(uint256)", +"5821c831": "AcceleratorStart()", +"58226a76": "isInTime()", +"58229d91": "MasToken()", +"58240d5f": "listPrycto4()", +"582420bb": "calculateMatchPrice_(address[14],uint256[14],uint8[6],bytes,bytes,bytes,bytes,bytes,bytes)", +"582518ac": "updateclaimableTokens(address,uint16)", +"582527f8": "setNewData(uint256)", +"5825884f": "setOwner2(address)", +"5826344b": "frozenAccount()", +"582681d2": "compareDateTimesForContract(uint256,uint256)", +"582747ba": "PLCCToken()", +"58275869": "ETHReceived()", +"5827834a": "DecenturionToken(uint256)", +"5827b250": "completeInitialization()", +"5827c0c8": "SSE()", +"5828fa47": "ThawTokenTransfers(address,bool)", +"58292a3d": "emission(uint256)", +"58294575": "updateComplianceAddress(address)", +"5829d310": "entries(int256)", +"582a466a": "burnGasAndFree(address,uint256,address,address[],bytes)", +"582a5c83": "HWGCToken()", +"582ab0b4": "setup(uint256,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"582b4019": "updateCheckHourly(bool)", +"582b6add": "isDataSourceCallback()", +"582b6fe4": "crowdsaleUncappedTime()", +"582bd287": "snapshotDelegators(uint256,address)", +"582ca57b": "get_associations()", +"582cca06": "SafeCoin()", +"582d14f8": "updateHpbNodeWithString(address,string,string)", +"582d2d32": "removeFreeRoom()", +"582d6033": "listDda(address,uint256,uint256)", +"582d9008": "willyWantTalkToken()", +"582ee26e": "PendingFees(address)", +"582f5009": "calculateBonusToken(uint256)", +"58306772": "getAmountOfEtherSell(uint256)", +"5830da9c": "Escrow(address,uint256,uint256,bool,address)", +"5830f2ea": "subPrivateSale(uint256)", +"58317685": "getBuy(uint256,address,address)", +"5831e95d": "_burn(address,address,uint256,bytes,bytes)", +"58339a40": "CryptoScalper()", +"58341922": "totalSupplyLocked()", +"5835ac93": "extract(uint256,uint256,uint256)", +"5836746d": "deployStep()", +"58371ccd": "endSaleTime()", +"5837bb11": "ALLOC_FOUNDER()", +"5837e083": "move_history(uint256)", +"58392aaa": "setSibling(address)", +"583ae991": "BitCharityToken()", +"583b4715": "createTitty(uint256,string,uint256,address,string)", +"583ba757": "getrestrictTime(address)", +"583be14e": "isCampaignRegistered(uint256)", +"583c4be9": "PurchaseUnlocked()", +"583d175f": "clientClaim(address,uint64)", +"583d5435": "queryTokensOf(address)", +"583dbacc": "specialKitties(uint256)", +"583dbc09": "updateBonuses(address,bool)", +"583ed080": "End7()", +"583f0ae6": "purchaseMembership(address,address)", +"583f18ff": "totalRemainingTokens()", +"583fe287": "ReussitexCoin()", +"584084d9": "_setString(bytes32,string)", +"5840b0f8": "getPixelData(uint256)", +"5840f4ec": "applyRate(uint256,uint256)", +"58410259": "onBuy(bytes32,uint256,address,uint256,uint256,address,uint256,uint256,address,address,uint256,uint256)", +"58413194": "lmda()", +"5841b9bf": "kingCost()", +"58428322": "grantAccessDeploy(address)", +"58439b9f": "EtheraffleLOTPromo(address,address)", +"5843b811": "_setPendingUpgradeabilityOwner(address)", +"58441a58": "minimumBid(string)", +"58451f97": "totalAccounts()", +"58453569": "initializeSpendLimit(uint256)", +"58453fef": "updateBalance(uint256,uint256)", +"5845d13c": "NamdoToken()", +"58462b36": "contBuy(address,uint256)", +"58463e11": "FeedBackedCall()", +"58469cd1": "generateStakeForDelegationSchemaHash(address,uint256,bytes32,bytes32,uint256[],bytes32,uint256)", +"58476a7a": "mintForSale(address,uint256)", +"58480d41": "setVotesPerProposal(uint256)", +"584855f0": "shopShoes()", +"58487bee": "request(uint8,address,bytes4,uint256,bytes32[])", +"5848a7fa": "getOwnerPotatoes(address)", +"58491ad9": "ICNQCrowdsale(uint256,uint256,uint256,address,uint256,address)", +"58491ecb": "companyPeriodsElapsed()", +"5849cf77": "registerDINWithResolver(address,address)", +"5849f66b": "claim_ico()", +"584af2c3": "approveOwnerTransfer(bytes32)", +"584df977": "LimitPerUserEBC()", +"584e492a": "arr(address,uint256)", +"584e86ad": "suggestUrl(bytes32,bytes32)", +"584ed064": "getBattleCardList(address)", +"5851166c": "endOfRound()", +"58516661": "agents()", +"5851bc4f": "FJH()", +"5851f1e2": "trexdevshop()", +"58525fda": "tokenAllocation()", +"5852f5c1": "buildingToUnits(uint256,uint256)", +"58541aba": "jackpotLastPayout()", +"58543fbd": "getRoomIdxByNameElseLargest(string)", +"5855279e": "whitelistAccounts(address[])", +"58553baa": "cycleInfo()", +"5855da3d": "extractAddress(bytes,uint256)", +"5856db43": "isIcoClosed()", +"585789cd": "startPreDistribution(uint256,uint256,address,address,address)", +"5857b86f": "getAuctionByAuctionId(uint64)", +"5858e7d0": "bigBearCoin()", +"5858ef10": "testErrorNonOwnerCantBreach()", +"58593578": "toss(bool)", +"585a8aba": "getCredit(address,address)", +"585a9385": "icoProceeding()", +"585aa91e": "setSpecialDefense(uint256,uint8)", +"585ac3e8": "icoEnded()", +"585b0f05": "BitcoinMax()", +"585b143a": "getVariableReleasableAmount(address)", +"585b7752": "setOraclizeString(string,string,string,string)", +"585bc25b": "weiRaisedDuringRound(uint8)", +"585bc523": "cooAddManager(address)", +"585bf3e4": "totalLux()", +"585c6fc9": "EtherHealth()", +"585ce259": "VitToken()", +"585d2133": "newDeliverable(uint256)", +"585da351": "setUnitAttackMultiplier(address,address,uint256,uint256,bool)", +"585e1af6": "hard_cap()", +"585eb90c": "withDrawAmount(uint256)", +"585f9b7a": "addVoteOption(uint256,string)", +"58613568": "estimateNeumarkReward(uint256)", +"58619076": "OwnerRemoved(address)", +"58620daf": "RegistryAddress()", +"58623642": "minStartDelay()", +"5862fd31": "ethCrowdsale()", +"5863115e": "parseId(uint256)", +"586360ce": "distributedTokens()", +"5864c56c": "numberOfSuccessfulPings()", +"5865c60c": "getOperator(address)", +"58669d6d": "updateMinimal(uint256)", +"586a2d02": "Anastomos()", +"586a2d79": "_decreaseBalance(address,uint256)", +"586a4be5": "Bitsurge()", +"586a52e0": "GenerationSupply()", +"586a69fa": "getMaximumStackCheck()", +"586a94ba": "MassivelyMultiplayerOnlineGameToken()", +"586ab7a9": "MYSYMBOL()", +"586ac27d": "ProofOfPassiveDividends()", +"586b1c8f": "DetherCore()", +"586ccfa7": "deathData_f11()", +"586cf767": "MintedEthCappedCrowdsale(address,address,uint256,uint256,uint256,uint256)", +"586cf845": "setTierEndTime()", +"586dd1d5": "CCXTokenERC20()", +"586e416e": "updateMaxWei(uint256)", +"586e8283": "deliveredEth()", +"586facb4": "adminSetMarket(address,uint8,uint256)", +"586fc5b5": "lastMint()", +"58708479": "setWinningChance(uint256)", +"587097ab": "test_FiftySixPercent()", +"58712633": "GetCommission()", +"587181d1": "getVaultLock(address)", +"5872282d": "icoReferralBonusInPercentage()", +"5872fe45": "getAccountAddress(address)", +"5873533d": "playGame(uint256)", +"587378a4": "updateQualifiedPartnerCapAmount(address,uint256)", +"5873cbe6": "setFile(string,string,uint256,address)", +"587419d5": "depositStartTime()", +"58750784": "getUniqueKey(string,string,uint32)", +"5875caaf": "objectKnife()", +"587631eb": "PlayX5()", +"587695cd": "tokenGiveAway()", +"58769981": "transferAdminship1(address)", +"5876d2ef": "rwGas()", +"58793050": "Setup()", +"58793ad4": "submitHKGProposal(uint256,string)", +"5879f7ad": "myDroneList(address,uint256)", +"587ac47c": "sendFromAdvisorWallet(address,uint256)", +"587af98d": "GetConfirmRound(bytes32,uint8)", +"587b060e": "_setUpgradeContract(address,address)", +"587c2b8e": "setContributionDates(uint64,uint64)", +"587cde1e": "delegates(address)", +"587d044f": "saveHistory(address,address,uint256,uint32)", +"587d6a20": "ICOactive()", +"587ed791": "getPoolPayPeriodInBlocks(uint256)", +"587f2e50": "putInStud(uint256,uint256,uint256)", +"587fa8dc": "closeHouse()", +"587fae93": "release(uint8,address)", +"58802e24": "BancarCrowdsale()", +"5880b7da": "CAAction(address)", +"588100d4": "DIP_TGE()", +"588198c4": "getBonusByETH(uint256)", +"5882128d": "tradeActive()", +"588268a8": "tokensForCreators()", +"588378c8": "fillGoldSellOrder(address,uint256,uint256)", +"58838594": "anacoContract()", +"5884afe1": "setBetLimit(uint256,uint256)", +"5884f2f5": "GeneralUpdate(uint256,uint256,uint256)", +"5885c626": "allocateTokensToMany(address[],uint256[])", +"58864d04": "Clost(uint256,string,string,uint256)", +"588666e2": "updatePriceManualy(uint256)", +"5886c51e": "setnotice(string,string)", +"58883688": "setAvailableToken()", +"58888b40": "_calculateUnlockedTokens(uint256,uint256,uint256,uint8,uint256)", +"58892f63": "setCrowdsaleStartDate(uint256)", +"588a9db5": "CoreBuyShare(address,address,uint32,uint256,uint32,address,address)", +"588b1578": "contractEth()", +"588b5c7b": "approveExchange(address,address)", +"588bf28b": "addBonusForOneHolder(address,uint256)", +"588bf923": "removeEmailHash(uint256)", +"588c2a6d": "WithdrawReserve(address)", +"588cbbea": "changeSettings(uint64,uint8,uint8,uint8,uint8)", +"588cff4c": "emitPublicCapabilityRemoved(address,bytes4)", +"588d376f": "BoleroToken()", +"588d6a17": "findSemiRandomWinner(uint16)", +"588dadc6": "contestChampion(uint256)", +"588e6b83": "giveTurnToPlay(address)", +"588e730c": "numOfMythical()", +"588ec17f": "minContributionInUsdCents()", +"588ee29b": "debug()", +"588f27e6": "CloudCredit()", +"588f7e12": "lotteryRatio()", +"588f85b3": "IHPM()", +"588f9acc": "toggle(address)", +"58902cc6": "sendFromGftWallet(address,uint256)", +"5891215c": "getAllGas()", +"58919155": "DOGE()", +"5891c8aa": "removeExceptAddress(address,address)", +"58924b81": "getClaim(address,string)", +"589316f6": "level_2_amount()", +"58931f7a": "buyWhiteByName(bytes32)", +"58932f50": "btcTokenBoughtAddress()", +"58933dbc": "totalTokensRemind()", +"5893d481": "rndTmEth_(uint256,uint256)", +"58950108": "BucksCoin()", +"58958be3": "_getTxDataBlockNumber(address,bytes32)", +"58963c85": "setBilateral(bytes32,bool,bool)", +"5896521b": "getCurrentTotalFunders()", +"5896749a": "getAssetRate(address)", +"5896f37f": "getDistritos()", +"5897164a": "ADDR_MAYA_ORG()", +"589737fb": "getOwnPartnerMessage(uint256)", +"5897a1c6": "getValueToInvest()", +"5897a5a0": "setupInitialState()", +"5897e3e4": "splitTheBet(address)", +"5898f402": "compaundIntrest(uint256,bytes5,uint256,uint256)", +"58990372": "changeColorBlue()", +"589a1743": "creatorOf(uint256)", +"589b88bd": "pauseRoundC()", +"589c6beb": "_deleteDefender(uint32,uint8)", +"589d7a3c": "setupViaAuthority(string,string,string,string,address,uint8,bytes32,bytes32,uint256)", +"589dca45": "_emitEmission(bytes32,address,uint256)", +"589e5edd": "InvestorsQty()", +"589e74be": "giveSticker(address,uint256)", +"589f30c7": "FAPFundDeposit5()", +"589fd72a": "vehicleDates()", +"58a0bcdd": "checkPayout(address,uint32)", +"58a122a2": "cancelRequestUnpause()", +"58a191c3": "changeFactorySetupFee(uint256)", +"58a1cabf": "lastPayoutTime()", +"58a2982a": "_deleteSmallestBidder()", +"58a356d0": "sendMoney(uint32)", +"58a383fd": "jsonArrayLength(string,string)", +"58a3d1a1": "getUnclaimedTokenAmount(address,address)", +"58a4903f": "cards()", +"58a50ce8": "setEtherAddress(address)", +"58a53130": "getABaddress(uint256)", +"58a5b0f6": "tournamentStartTime()", +"58a687ec": "finalizeSale()", +"58a70a15": "acceptReturning(uint256)", +"58a74333": "singularDTVFund()", +"58a79319": "GetWildCardOwner(uint256)", +"58a87b69": "withdrawTokenFromCrowdsale(address)", +"58a94e73": "DigitalValleyToken()", +"58aa0f1b": "numOfRare()", +"58aabdf8": "MaxMinersXblock()", +"58aaf48a": "gasForShuffle()", +"58ab010d": "buyParticipationTokens(uint256)", +"58aba00f": "updateManager(address)", +"58acf31b": "findJob(uint256)", +"58ad4673": "LEXTokensContract()", +"58adc9ae": "transferToWalletAfterHalt()", +"58ae6242": "AOIS()", +"58ae8bcf": "voteInMasterKey(address)", +"58af7794": "create_payment(uint256,uint256,bytes32,bytes32,uint256,address,bytes32)", +"58b092d7": "addRaiseTapProposal(string,uint256)", +"58b0a2aa": "setPriorityPassContract(address)", +"58b1effb": "bidOfBidder(address,uint256)", +"58b1f29c": "refundBounty(uint256)", +"58b255ea": "fechVoteNumForCandidate(address)", +"58b435fb": "MeritICO()", +"58b4370b": "round(int256)", +"58b4a3c4": "testInitalBalance()", +"58b4c035": "createNewGoBoard(uint256)", +"58b5525d": "depositCharge()", +"58b5e775": "batchAllocateExp(address[],uint256[],uint256[])", +"58b8dc61": "promoCreationPlayerCount()", +"58b92d57": "UserAuthorized(address,address)", +"58b9dcef": "registerVotingPrepareFailure()", +"58bad3eb": "setEarlyParticipantWhitelist(address,bool)", +"58bafdbc": "contribute(address,uint256,uint256,bytes)", +"58bb7d70": "checkEthSold()", +"58bc3456": "addtokensWL(address,uint256,uint256)", +"58bcdb5e": "collectCredits(address)", +"58be0830": "_refSystem(address)", +"58be98dd": "migrateBlockjack()", +"58beec9f": "summBounty()", +"58bf7067": "setBlockedAccount(address,bool)", +"58c0bde0": "feeNewThread()", +"58c16557": "disableTypeById(uint256,uint256)", +"58c1c328": "_validateId(bytes32)", +"58c23767": "setCXLExchangeRate(uint256)", +"58c264f6": "preico_holdersAmountInvestWithBonus()", +"58c31603": "loanCollectionNotification(uint256)", +"58c3b0eb": "updateTokensApproved()", +"58c3b870": "memo()", +"58c3c193": "newBatch(bytes32)", +"58c56f1e": "C20Token()", +"58c60d5e": "gracePeriodCap()", +"58c62b12": "SingularDTVWorkshopFee()", +"58c6bce8": "getCustomBuyerForIndex(address,uint256)", +"58c6f08b": "takeTokensBack()", +"58c721ce": "majorEvents(uint256)", +"58c75136": "currentPremiumSale()", +"58c757ba": "associateWithSig(bytes32,bytes32,address,uint256,uint256,bytes32,bytes32,uint8)", +"58c8c0a7": "getVoteNumberList()", +"58c8ca0c": "_clearInventory(uint256)", +"58c9e484": "buyPoints(uint256)", +"58ca5419": "CheckBest(uint256,address)", +"58cb7323": "MainnetETCSurvey()", +"58cc13f3": "asserts(bool)", +"58cda0ab": "requestData(address,address,uint256)", +"58cdddf9": "getRoundDifficultyBlock(uint32)", +"58ce4b48": "setFundingStartTime(uint256,uint256)", +"58cea888": "getWinOutcome(bytes16)", +"58cf7c71": "unfreezePrice()", +"58cf9570": "transferFeeRate(address)", +"58d0390b": "getCurrentICORoundInfo()", +"58d10aae": "BlackJack()", +"58d162da": "potSplit_()", +"58d168b7": "generatePermutationKey(uint8[4])", +"58d1aebd": "claim(string,string,string,bytes32,bytes)", +"58d213ae": "InToken()", +"58d25b93": "LogSendFunds(address,uint8,uint256)", +"58d2ab45": "numberOfPixels()", +"58d37dc5": "lastMintingAmount()", +"58d38231": "broughtSprites(uint256)", +"58d3b2c8": "babyBornEndVoting(string,uint256)", +"58d3b617": "Notifier(string)", +"58d3ce8a": "thirdExchangeRate()", +"58d40f7e": "existsUserByEmail(bytes32)", +"58d4e051": "YSS(uint256,string,string,uint8,address)", +"58d63255": "GandhiJi()", +"58d6a99e": "CTChinaCoin()", +"58d75180": "ECToken()", +"58d782be": "getLotteryDetails(uint16)", +"58d7bf80": "reserveRate()", +"58d80a8c": "doSetSettings(uint64,uint64,uint256)", +"58d8652e": "addIssue(string)", +"58d8f76f": "getPlayerBet(uint256,uint256,address)", +"58d90108": "COLOR_RED()", +"58d9e758": "DeleteUserByID(uint32)", +"58d9f95d": "VIETNAMTOKENTEST()", +"58d9fa04": "addUser(uint256,address)", +"58da3ca9": "jdecompose(uint256,uint256,uint256)", +"58da9bbc": "getAssetPackData(uint256)", +"58db3258": "removeFromPrivateWhitelist(address)", +"58dc03f9": "TigerCashToken()", +"58dc2a8b": "RESEARCH_AND_DEVELOPMENT_WALLET()", +"58dc8807": "updateMintAuthority(address,int256)", +"58dd0eb1": "propose(address,string,string,string,string,uint256,uint256,uint256,uint256)", +"58dd6f23": "setTokenTransfer(bool)", +"58df0383": "burnFinish()", +"58df8ed8": "adminGetEnabled()", +"58dfb058": "LNCH()", +"58e039bd": "listContractByModTextAndCttName(string,string,uint256,uint256)", +"58e0a9d7": "YanToken()", +"58e1c174": "RTI()", +"58e29e17": "initiateProof()", +"58e2cd76": "watch(address)", +"58e3815c": "BASalesPrice()", +"58e3e914": "devuelveNombreApp(address)", +"58e46275": "calculateTheEndPrice(uint256)", +"58e55365": "marketingBalance()", +"58e59c32": "get_entry(uint256,uint256,uint256)", +"58e5d5a5": "PunkBought(uint256,uint256,address,address)", +"58e61e12": "contribute(uint256[],bool,uint256)", +"58e66522": "CoolTourToken()", +"58e69c5a": "hashimoto(bytes32,bytes8,uint256,uint256[],uint256[],uint256,uint256)", +"58e71b15": "Organization()", +"58e756b6": "NewQ(string,bytes32)", +"58e77a92": "setSelfPretorian(address,address,address)", +"58e85e03": "LogTokensBought(address,uint256)", +"58e868c9": "DisableMember(address)", +"58e879f3": "nextThaw()", +"58e8922b": "payImportTax(address,uint256)", +"58e92fb0": "setFreezeForPEInvestors(uint256,address,uint256)", +"58e9a706": "checkLargeContributionsLock(address,address,uint256)", +"58e9b208": "Controlled()", +"58ea80e5": "setThroneCreationPrice(uint256)", +"58eae004": "awardBuyers()", +"58eafc37": "addVirusDefence(uint256)", +"58ebde43": "generic_holder()", +"58ec63bc": "setAccountMilestone(address,uint8)", +"58ecaa45": "StgThreebonusEnds()", +"58ed766d": "priceETHUSD()", +"58eda67a": "get_Holders(uint256)", +"58edaa9c": "getController(uint256)", +"58edbc84": "mkDelegation(bytes32,bytes32,uint256)", +"58ef82a0": "setMilFold(address)", +"58efa06f": "bytesToBytes5(bytes)", +"58efe3cd": "changeLink(bytes,address)", +"58f0cbc7": "changeTiming(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"58f10528": "eggExists(uint256)", +"58f11566": "ReserveAccount()", +"58f1490f": "addTransaction(address,uint256,bytes,bytes,uint256)", +"58f24f3d": "transferFromGate()", +"58f33e98": "isTaker(address)", +"58f35f10": "createT513(uint256,address)", +"58f3a115": "tokenDistribution(address[])", +"58f3da21": "adminGetContractBalance()", +"58f4996f": "verifyIncluded(bytes,bytes32,bytes32)", +"58f4be1e": "getIntention(uint256)", +"58f4f160": "Halo3D()", +"58f5382e": "challenge(string)", +"58f65330": "_checkPixelUnderLeft(uint256)", +"58f693de": "tokenForSP()", +"58f7f6d2": "BNB()", +"58f816bf": "redeployProduct(bytes32)", +"58f8e99e": "Jackypot()", +"58f94f13": "CarParkCoin()", +"58fa67f9": "calculateMintTotal(uint256,uint256,int256)", +"58fa812b": "TRANSFERS_PER_TRANSACTION()", +"58fb9f36": "_addBonus(uint256)", +"58fc0151": "getRequired(address,uint256,bool,uint256)", +"58fd6aec": "register(bytes32,string,string)", +"58fd6fe2": "getBonusMultiplier(uint256)", +"58fd955c": "rateETHUSD()", +"58fd989b": "getLockedStructPulseLockHash(address,address,uint256)", +"58fe54a1": "GetBoilerInfo(address,uint256)", +"58fe8847": "BIRC()", +"58feb4a3": "earlyCommunityAddress()", +"58ff5111": "buyTokenForAddress(address)", +"58ff7613": "RxEALSaleContractExtended()", +"5900477a": "settleCancel(bytes,bytes)", +"59004b28": "checkIfExists(uint256,uint256[],uint256)", +"5900a09c": "addFunder(address,address,uint256,uint256)", +"59011400": "RewardDAO(address,address,address)", +"59015ed5": "getAccountModifiers()", +"59016c79": "getContent()", +"59032232": "setPatch(uint256,uint8,uint8)", +"59032614": "FipsTransfer(bytes20,address,address)", +"5903eff2": "root_10(uint256)", +"5903f01b": "giveEthBankRollAddress()", +"5904941b": "CoinealToken()", +"590528a9": "sellShares(uint256,uint8,uint256,uint256)", +"590589fd": "WithdrawToMember(address,uint256)", +"5905b171": "getNextAssignedRequest(uint256)", +"5905d314": "Added(bytes32)", +"5905e1c5": "askPrice(address)", +"590731b7": "secondarySaleCut()", +"590791f2": "getOwnerBalance()", +"59084ea9": "setWhitelistedWallet(address,bool)", +"5908984b": "foreignPurchase(address,uint256)", +"59092c29": "XtremCoin()", +"5909e897": "buyRate(uint256,uint256)", +"590a1c78": "LogBidFailed(address,uint256,uint256)", +"590a4595": "createNewChain(bytes)", +"590ba734": "getUint(int256)", +"590d431a": "wavesId()", +"590d5a67": "multipleTokenDistribute(uint256)", +"590daaec": "setTokenDeskProxy(address)", +"590def78": "IndonesiaRupiah()", +"590e1ae3": "refund()", +"590efa59": "setContrAddr(address,address)", +"590efee1": "isExec()", +"590f9ece": "getShow(uint256)", +"590fcc5b": "debugVal2()", +"591016bc": "generateId(bytes32,address)", +"591090ee": "ELIXAddressSet()", +"5910a18b": "addEntry(bytes32)", +"5910ce39": "_mint(string,string,uint8,uint256,bool,uint256)", +"591108a5": "setIcoStart(uint256)", +"59111d83": "add32(uint32,uint32)", +"59112e79": "payCow()", +"59117bae": "getRoomID(uint256)", +"59118221": "setTokenData(uint256,bytes32[])", +"59118ff2": "amount4()", +"5911fb9a": "setRate(address,address,uint256)", +"59125397": "indexedDocs(uint256)", +"59137533": "PillowCoin()", +"5913cacc": "unlockBonusDrop(address,uint256)", +"59144baa": "setFundContract(address)", +"591451fe": "setHostingProfitAddress(address)", +"5914589c": "RLC()", +"59151701": "VerifiedUser(bytes32,address)", +"591552da": "currentFee(address)", +"5915589e": "Dataset(address,string,uint256,string)", +"59161e57": "releseToken(address)", +"59167b9d": "setTokenContract(uint256,address,uint8[],bytes32[],bytes32[])", +"59167fcc": "getUserAccountInfo()", +"59169d06": "setBountyTokensPercent(uint256)", +"5916c2c9": "NeuroWire()", +"5916c5fa": "sellEgg(uint256,uint256,uint256,uint16,bool)", +"59179dbd": "createSaleAuction(uint256,uint256,uint256,uint256,uint256,uint256)", +"59187cec": "getEarningAmount()", +"5918bc7f": "addTerms(string,string)", +"5918f00c": "fillOrder(address,address,uint256,address,uint256)", +"5918f348": "hmcAddress()", +"59193981": "token_sale_end_block()", +"59194d0c": "totalEthBalance()", +"59197f51": "ethEt4Rate()", +"59198827": "initiateDocumentVote(string,bytes32)", +"5919896f": "Taracoin()", +"5919978b": "create_safe(address,string,string)", +"591a0d87": "foundersWallet2()", +"591a6ec4": "toBeDistributedFree()", +"591a89b2": "Voted(address,bool,uint256)", +"591b05b1": "domainHtml(bytes32)", +"591b41c6": "Multisend()", +"591beea8": "guardIntervalFinished()", +"591c515f": "append(string,string)", +"591d5236": "getDifference(int256,int256)", +"591d8bd0": "constantFn(uint256)", +"591ead36": "SplitTransfer(address,uint256,uint256)", +"591f36a6": "updatePreICOMaxTokenSupply(uint256)", +"5920375c": "thaw()", +"59208b8a": "userRefundWithoutGuaranteeEther()", +"59214765": "sendBonus(address,uint256)", +"5922b831": "refundPlayers(uint256)", +"592311ed": "freeze(address,address,bool)", +"592341df": "whatsMyJuryNumber(uint256,address)", +"5923c7f9": "maxSaleToken()", +"59242d11": "SmartIndustrialToken()", +"59245ff3": "fundAnswerBounty(bytes32)", +"59249c46": "duper()", +"5924f811": "tier2Reached()", +"592572e2": "getLoanCanceledAmount(bytes32)", +"5925cfe3": "getCCH_edit_7()", +"5926651d": "addBeneficiary(address)", +"592685d5": "getWindowStart(address,address)", +"5926b55a": "setArray(bytes1[],bytes8[],bytes32[],int256[],uint256[],bool[])", +"5926c826": "Mitronex()", +"5926cf13": "setGameId(uint256)", +"59275c84": "minerAddress()", +"59276653": "getTicketCount(address,string)", +"59287ce9": "setPbulicOfferingPrice(uint256,uint256)", +"5928aedc": "setEndStage2(uint256)", +"5928bdc4": "LatiumLocker()", +"5928c7db": "changeDividendWallet(address)", +"5928e80c": "updateNoteTitle(uint64,bytes12)", +"59291e2f": "MinedBlocks()", +"59292ef3": "gasLimitDepositRelay()", +"59296490": "CharityCommonweal(uint256,string,uint8,string)", +"59296e7b": "getCredit()", +"5929b837": "_setRate()", +"592a5f9b": "ValidToken()", +"592a97de": "encodeUInt(uint8,uint256)", +"592af188": "GaonToken()", +"592b5d17": "haltFX()", +"592b700a": "updateRegistrar(address)", +"592b71ab": "isRequestingEscapeTo(uint32,int256,uint32)", +"592bd705": "setowner(address)", +"592c0f09": "onLotteryFinalized(uint32)", +"592c518f": "ADDR_TKG_CHARITY()", +"592d4c7e": "CAD_Omnidollar()", +"592dc0a6": "setAyantDroitEconomique_Compte_2(uint256)", +"592e6f59": "initialise()", +"592ea64f": "LLV_v30_12()", +"592eef5a": "postIdToDonationAmount(address,uint256)", +"592efdab": "presaleWhitelistTokensLimit()", +"59301cb2": "_callRecipient(bytes32,address,address,address,uint256,bytes,bytes,bool)", +"5930a295": "changeBetLimits(uint256,uint256)", +"5931228b": "endTimeDay()", +"59317ea2": "buyImplementation(address,uint64,uint256,uint8,bytes32,bytes32)", +"59318b2c": "unFrozenBalanceByIndex(uint256)", +"59328401": "getPlayerInfo(address)", +"5932c02c": "tradesCount()", +"59330b8e": "hashDetails(uint256,address,uint256,uint8)", +"59354c77": "changeSubcourtJurorFee(uint96,uint256)", +"59355736": "lockedBalanceOf(address)", +"59357045": "getDueTime(uint256)", +"5935fba5": "addContractor(address,uint256)", +"5936259c": "BullsFarmer()", +"59362835": "JPCoin()", +"5936387c": "checkOpposited(uint256,bool)", +"59366245": "bonusInPhase5()", +"5936812b": "changeLockedBalanceManually(address,uint256)", +"5937de14": "STATUS_DEAL_RELEASE()", +"5937e534": "appealSkip()", +"5937e86a": "setTokensQuantity(uint256[],uint248[])", +"5938748e": "changeVotingRules(address,address,uint256,uint256,uint256)", +"59388d78": "decreaseApprovalPreSignedHashing(address,address,uint256,uint256,uint256)", +"59391a67": "earlyResolve(bytes32,uint256,bytes)", +"5939a84e": "isLawyer(address)", +"5939dd31": "setEthartRevenueReward(uint256)", +"5939ee04": "registrationPeriod()", +"593a5bff": "KUISToken()", +"593a6297": "getPlayerLaff(uint256)", +"593aa283": "setMetadata(uint256,string)", +"593af09f": "assertEq20(bytes20,bytes20)", +"593af4f1": "_fYou(address,uint256,string,string)", +"593af56a": "editionType(uint256)", +"593b4530": "proxyMergeMint(uint256,bytes32,address[])", +"593b79fe": "toBytes(address)", +"593be1f8": "_removeAuctionManager(address)", +"593c993c": "presaleWeiContributed()", +"593cca56": "checkExplore(uint256,uint256)", +"593d280d": "KToken()", +"593ea3e7": "VERDICT()", +"593efdf1": "setCurrentPassportLogic(string)", +"593f3a6c": "AllMarkingsProcessed(address,uint256,uint256,uint256)", +"5940f55c": "setEncryptionPublicKey(string)", +"594151e0": "Dice()", +"5941bb80": "transferFromBatch(address[],uint256[])", +"5941d8d4": "RtbSettlementContract(address,address,address,uint256)", +"5941ff52": "impl_yield7Day()", +"59423a7f": "BuySnail(address)", +"59424b78": "approveArtist(address)", +"594337a9": "investorsLength()", +"5944427b": "getRequestResult(uint256)", +"5944b7d9": "setCCH_edit_1(string)", +"594548d5": "newStakesAllowed()", +"5945793d": "getCorrectedTotalBPOfAddress(address,address)", +"5945841b": "ELIXAddress()", +"5945bdc5": "token2GT()", +"59462295": "WhiteWallToken()", +"5946e7eb": "Tier_Rainmaker_Registration()", +"594733c6": "getInvestorId(address,address)", +"594742da": "forecastOfToken(uint256)", +"59475891": "TransferHash(bytes32,bytes32,uint256)", +"59478411": "modifyProductPrice(bytes32,uint256,uint256)", +"5947cc6a": "level_2_percent()", +"5947d616": "updateAskingPrice(uint256,string)", +"59485790": "_emitPricesUpdated(uint256,uint256)", +"5948f733": "getAddressArray(bytes32)", +"5949a8f7": "notifyDeposit(uint256)", +"5949e525": "fundingUnlockFractionInvert()", +"594aa668": "getCourseList(string)", +"594afcff": "tgrContributedAmount()", +"594b18b5": "_transferToLock(address,uint256,string)", +"594bbe8f": "Corolexcoin()", +"594de857": "getDealsCount()", +"594eda64": "getBackend()", +"594ffb4e": "setReferralFee(uint8)", +"5950cb8c": "setCasinoName(uint16,string,string)", +"5950cee4": "checkProviderSupported(address,address)", +"5950d395": "recallPercent()", +"5951317a": "doFinalizeSale()", +"59514593": "addFreezableAddresses(address[])", +"595210ad": "openDispute(string)", +"5952176e": "removeBusinessOwner(address)", +"5953c806": "setSendCost(uint256)", +"5954c8c5": "manualWithdrawEther()", +"5954ee54": "actualPriceInCents()", +"595539cd": "modexp_naive(bytes,uint256,bytes)", +"5956b853": "soldAddresses(address)", +"5957eb17": "PeterToken()", +"5957ee49": "getProjectUsedTokens()", +"5958188d": "MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress(address[],uint256,uint256,address)", +"5958611e": "finishTime()", +"5958621e": "setRewardWallet(address)", +"595882b3": "mintAll()", +"5958978c": "day_blocks()", +"595a161b": "amountOfZeros(uint256,uint256)", +"595a30f1": "RateChanged(uint256)", +"595a4fc2": "recomputeAccountLastAverageBalance(address)", +"595a69e8": "add_address(address,address)", +"595a7273": "QbaseIssued()", +"595aed65": "_getChild(address,uint256,address,uint256)", +"595b1a3e": "getUsersLength()", +"595b35d1": "NUMBER_OF_COUNTRIES()", +"595c3f61": "FactomTalk()", +"595cb7a3": "changePrice(address,bytes32,uint256)", +"595d0392": "transferHoldFrom(address,address,uint256)", +"595d71a5": "MintFinished(uint256)", +"595da94d": "has_owners(uint256)", +"595dcb68": "BIFAToken()", +"595e1e20": "placeToken()", +"595e615f": "betPool(address)", +"595ecbb3": "Int256(uint256)", +"595ee7a4": "MajListVal()", +"595f0e5e": "test_CuratorRules()", +"595f40d6": "getDevelopersFee()", +"5960b74f": "advisorTimelock()", +"59622aa6": "maxAmountForSalePromotion()", +"5962581e": "isInRoundOneState()", +"59626877": "AiToken(uint256)", +"59627b84": "getReduce(uint256,uint256)", +"5962a941": "totalPurchases()", +"5962ad30": "dkSB(string)", +"59633a1c": "removeBeneficiary(address)", +"59647984": "isValid(address,uint256)", +"5965e7c3": "SimpleCrowdsaleBase(address)", +"59667c24": "withdrawRound(uint256)", +"59679b0f": "_implementation()", +"5967dee8": "transferLOT()", +"5968c2a4": "getOrderTokenAllocationStatus(uint256)", +"596925d6": "expByTable(uint8)", +"596939f5": "addAgent(address,uint256)", +"5969549e": "modifyBeneficiary(bytes32,address)", +"59695754": "setMinimumPayout(uint256)", +"5969c0e1": "resetSignature(bytes32)", +"596a072c": "setOraGasLimit(uint32)", +"596a2735": "DICE_RANGE()", +"596aadaf": "transferFromCrowdsaleToUserAdoptionPool()", +"596b975a": "maxFunding()", +"596bda14": "_set9()", +"596c02fb": "assertEq22(bytes22,bytes22,bytes32)", +"596c0531": "bch()", +"596c49bd": "TimeControlled()", +"596c8976": "close(uint256,uint256)", +"596d6f08": "Blizzard(uint256,string,string)", +"596ea3db": "allowTransferTime()", +"596f3473": "applyToBeAReviewer()", +"596fab6c": "calculateLockAmount(uint256)", +"59704013": "setVar(string,string)", +"5970c40a": "addForecast(bytes32,uint256,uint8)", +"59716eed": "lockedEthBalanceOf(address)", +"59724977": "getwin011050(address,uint256)", +"59727e83": "registryTransfer(address,address,bytes32,uint256)", +"5972e062": "deleteNodeGroup(uint256,uint16)", +"5973016b": "Multiven()", +"59748c98": "plain()", +"5974ec50": "founderTokenUnlockPhase3()", +"59756526": "getJobHash(bytes16,address,address,uint256,uint256)", +"59758ebe": "repayLoan(address,uint256,string)", +"5975ce80": "mintApproveReset(address,address)", +"59761fcb": "test(address[5],uint256[5])", +"59764714": "MyDFSToken()", +"59769073": "totalBalancingTokens()", +"5976ddd0": "getScenarioNamesAndEventStatus(bytes32)", +"59770438": "getToken(address)", +"59780224": "joinGameWithInviterIDForAddress(uint256,address,address)", +"59790701": "updateFeeSchedule(uint256,uint256,uint256)", +"59793b3a": "derivativeTokens(uint256)", +"597c255f": "receiveChild(address,uint256,address,uint256)", +"597c69cc": "saveToColdWallet(uint256)", +"597cae8d": "getFeeWindowBurnAmountValue()", +"597d4601": "crowdsaleFinalized()", +"597d5c6e": "BiSaiToken(address,uint256)", +"597d6640": "getFreeFairy()", +"597df768": "buyPixelBlocks(uint256[],uint256[],uint256[],bytes32[])", +"597dfbaf": "confirmNode(uint256)", +"597e1fb5": "closed()", +"597ea5cc": "getUint8FromByte32(int8,bytes32,uint8)", +"597efd85": "UblastiToken(uint256,string,string)", +"597f7c35": "transferTechSupport(address,address)", +"597fef79": "funderBalance_()", +"59802e15": "makeBonus(address[],uint256[])", +"598052a3": "winPooling()", +"598077b9": "ownerPart()", +"5980d0d7": "_crowdSaleSupply()", +"5980e72d": "getSeedPercentageForGameId(uint256)", +"59810024": "VICETOKEN_ICO_IS_A_SCAM()", +"59813a0e": "allowToken(address,address,uint256,bool)", +"5981f187": "bookingBalanceOf(address,address)", +"5982688f": "revenueShareList(address)", +"59828c99": "FLIPPINESSROUNDBONUS()", +"5982a30f": "setFriendsFingersRateForCrowdsale(address,uint256)", +"5982a6bb": "DiipCoin()", +"59830bf4": "LogBidCompleted(bytes32,bytes32,bytes32)", +"5983ae4e": "hasher(address,bytes32,uint256)", +"59841fe9": "newRun(bytes32,address,string)", +"59849d30": "maxCreatorWithdraw()", +"5984d7ad": "buyHeart(address)", +"59852686": "transferEth()", +"5985ac40": "affiliateNetwork()", +"598647f8": "bid(uint256,uint256)", +"59869576": "TestERC20Token(string,string,uint8)", +"5986ce23": "setdteamVaultAddr1(address)", +"5986dbe4": "ccUserCount()", +"5987e370": "canJoin(uint256)", +"5987f859": "setInputs(string,string,string)", +"5988899c": "estimateDaiSaleProceeds(uint256)", +"59890fd2": "mod_product(uint256,uint256,string,string,string,string,string)", +"5989c283": "createChannelERC20(address,uint192)", +"598aa1fc": "checkEndorsement(address,uint256,address)", +"598ab2c9": "supplyRest()", +"598abc9c": "getListTeam(uint256)", +"598ac8f2": "permille(uint256)", +"598adef6": "addDepositor()", +"598af9e7": "allowance(address,address,uint256)", +"598b771d": "IOVContract()", +"598d34b7": "distributeBTR(address[])", +"598d772a": "changeEtherVault(address)", +"598db132": "setProviderIsForRent(uint256,bool)", +"598e3183": "newToken(string,string,uint256,address,uint256)", +"598e728a": "TIXIToken()", +"598e9eeb": "transferir(uint256,address)", +"598f512b": "Token(uint256,string,uint8,string,bool)", +"598f6dec": "reserveTimeLock()", +"5990e665": "NetworkSocietyToken()", +"59912df1": "totalTokensDestroyed()", +"59915fd3": "CheckRefundIsFair()", +"5991c0dd": "TSTEST3()", +"5991db0f": "contains(uint8[],uint8)", +"5991faf5": "contributors_countdownDate(address)", +"59923274": "sendFromBountyWallet(address,uint256)", +"59927044": "teamWallet()", +"5992f2a1": "_createVoter(string)", +"599312ec": "rescueCatHashCheck(bytes32)", +"599362d0": "_setBackgroundValue15(uint256)", +"59939e21": "getApprove(uint8)", +"599466fe": "abortCrowdfund()", +"5994d984": "TRUE()", +"59953744": "createVestingContract()", +"5996228e": "upgradeResistance(uint256)", +"599651f3": "setStartAuctionFee(uint256)", +"59966ae1": "allowClaimer(address[])", +"5996769e": "_getDefaultOperators(bool)", +"59970a08": "OneKeyToken(uint256,string,uint8,string)", +"59974e38": "distributeRewards(uint256)", +"5997ed4c": "DevFee()", +"59988dce": "newQuestioner(address)", +"5998e641": "getStrategyTokenByIndex(uint256,uint256)", +"5999917c": "get_cross_chain_nonce()", +"5999d385": "walletICO()", +"599b3e21": "buytokens2()", +"599b6808": "balanceList(uint256)", +"599c8761": "decodeParamsList(uint256)", +"599db6bd": "unsowed(address)", +"599dc6be": "setItemStoppedStatus(bool)", +"599e2364": "tokenItems(uint256)", +"599efa6b": "refundEscrow(address,uint256)", +"59a02589": "ico_PRICE()", +"59a02652": "miningWarContractAddress()", +"59a0b995": "AiraEtherFunds(address,string,string)", +"59a0e583": "lastBlock_v9()", +"59a131e2": "CrankysLottery()", +"59a23200": "authorizeTransaction(uint256,address)", +"59a29c6f": "no_of_tokens()", +"59a2c86f": "requestPayout(uint256,address,address)", +"59a3e577": "createClaim(address[],uint256,address)", +"59a4669f": "increaseJackpot(string)", +"59a536b0": "presaleWei()", +"59a547b0": "recordCommission(uint256)", +"59a58647": "setMaxCards(uint256)", +"59a591be": "setCrowdsaleTimes(uint256,uint256,uint256)", +"59a5f12d": "player2()", +"59a69426": "setStatuses(address)", +"59a765f9": "sendInvoice(string,string,string,string)", +"59a78c1a": "deathData_v8()", +"59a7b3fe": "hourlyRate()", +"59a7f754": "acquireWildcard(uint16)", +"59a80f0f": "setCurs(uint256)", +"59a83074": "set_participant_num_of_pro_rata_tokens_alloted(address,uint256)", +"59a87bc1": "buy(uint256,uint256,address)", +"59a8b6a3": "OptaToken()", +"59a941a6": "setApp(string,string,string,uint256)", +"59a9a63f": "isVulnerable(uint64,int8)", +"59a9a980": "isCosd(string)", +"59aa80b8": "getTransfer(string,uint256)", +"59aaa456": "tryAltOracles(bytes32,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"59aaaf86": "changeBlocPerEth(uint256)", +"59ab0306": "BuyTickets(uint256)", +"59ab0dd1": "JACKPOT_TOKENS_PERCENT()", +"59ac5b32": "createProject2()", +"59ac5c6d": "_shift(uint8)", +"59ac70ae": "totalTimeRange()", +"59acb42c": "createdAtBlock()", +"59acbcb1": "crownTransfer(address,uint256)", +"59adb2df": "returnUint256(uint256)", +"59adda9b": "checkOwnerFailedToSetTimeOnMeeting()", +"59ae2073": "GameNeedsTick(uint256,address,uint256)", +"59ae340e": "resumeMinting()", +"59ae6e34": "placeImage(uint8,uint8,uint8,uint8,string,string,string)", +"59aef196": "pauseCutoffTime()", +"59af143d": "beBanker()", +"59b09b25": "makeCount()", +"59b0a174": "transferLockUntil(address)", +"59b0d931": "removeBlockList(address)", +"59b112d8": "getServicesForApplication(address)", +"59b119dc": "ComeCoin()", +"59b11d6c": "setBetclose(bool)", +"59b17b43": "getTellerBalance(address)", +"59b25720": "fillUpTo(address[5][],uint256[6][],uint256,bool,uint8[],bytes32[],bytes32[])", +"59b2da20": "Raffled(uint256,address,uint256)", +"59b350fb": "time_of_token_swap_start()", +"59b36e3e": "partnerSaleWei(address)", +"59b373f2": "getExistsStatus(uint256)", +"59b4993c": "userAddressCheck(bytes32)", +"59b4ee89": "addVpf(bytes32,uint256,uint256,uint256,string,uint256,uint256[])", +"59b51bd1": "approveCertification()", +"59b563b5": "addRobot(address)", +"59b56a59": "HYIPToken(address,string,string,uint256,uint256)", +"59b58dba": "createCloneToken(address,uint256,string,string)", +"59b62658": "AddFishByToken(address,uint256)", +"59b6a0c9": "maxCapacity()", +"59b6f377": "transferFromContract(address,uint256,uint256)", +"59b79610": "sendUnsoldTDETokensToPlatform()", +"59b8d74e": "ACasadiAmiciToken()", +"59b910d6": "setStorageAddress(address)", +"59b9510a": "isAddressAllowedInPresale(address)", +"59b95f5a": "buyBlocks(uint8,uint8,uint8,uint8)", +"59b9a192": "buildToken(uint192,uint192,uint160,uint32)", +"59ba1dd5": "_fulfillPreapprovedPayment(address,address,uint256,address)", +"59ba2628": "transferCampaignCreator(address)", +"59ba59f1": "ETHFundDeposit()", +"59badbec": "CheckPhException(bytes32,uint32)", +"59baef40": "setNewController(address)", +"59bb6b5f": "TretanToken()", +"59bb7867": "setTournamentEntranceFeeCut(uint256)", +"59bc3d47": "Agreement()", +"59be5e45": "getTotalSoldTokens()", +"59be7e99": "getDonationAmount()", +"59be9cc0": "devTokensHolder()", +"59bed9ab": "Transacted(address,address,bytes32,address,uint256,bytes)", +"59befd58": "releaseTime2()", +"59bf1abe": "getBlackListStatus(address)", +"59bf5d39": "getReserve()", +"59bf77df": "confirmationCount(bytes32)", +"59bfd388": "setupPeriodForSecondStep(uint256,uint256)", +"59c13403": "FEE_MIN()", +"59c140be": "insertBonus(uint8,uint256,uint256)", +"59c14cf1": "mastery(address)", +"59c19cee": "batchWithdraw(bytes32[])", +"59c21fd8": "initDepth()", +"59c27917": "GenChipLevel_Extra(uint256,uint256,uint256)", +"59c281da": "openFirstRound(uint256,bytes32)", +"59c2aad0": "unitsToSell()", +"59c2af55": "StagedCrowdsale()", +"59c2b584": "reserve_fund()", +"59c2e1ef": "changeEthDefaultBackRate(uint8)", +"59c2edee": "CrowdsaleContribution(address,uint256,uint256)", +"59c33f94": "PriceUpdate(uint256,address)", +"59c39094": "withdrawDate()", +"59c3f3e0": "setPoolContract(address)", +"59c3f7f0": "createWallets(uint256)", +"59c42f75": "unreleasedCount()", +"59c44539": "GotecoinToken()", +"59c4e612": "icoSoftcap()", +"59c55429": "refundBond(uint256)", +"59c634b0": "getContributorAmount()", +"59c656df": "allowRefunds()", +"59c77133": "createNewHodl(uint256)", +"59c7a893": "participantsOf(uint32)", +"59c87d70": "request(bytes32)", +"59c88347": "isEmitting()", +"59c8969e": "withdraw(address,uint256,bytes32[],uint256[],bytes32[],uint256)", +"59c8bf9c": "OrpheusMarinaBangkok()", +"59c8d647": "buy(bytes32,bytes32)", +"59c9e118": "buyAndTransfer(address,address,uint8)", +"59cbf125": "GetETH(address,uint256)", +"59cc334a": "getItem(uint256,uint256)", +"59cc721c": "BONUS_TIER1()", +"59ce0a8f": "RuletkaIo()", +"59ce0bb8": "_saveParams(uint256[])", +"59ceb36f": "last_demurrageable_balance()", +"59cf3173": "Reclaim(uint256)", +"59cf901a": "preIcoTokensDistributed()", +"59cfaf6e": "gameWithdraw(uint256)", +"59d1d43c": "text(bytes32,string)", +"59d20b55": "committedValidators(uint256)", +"59d213fe": "contributePreSale()", +"59d27be8": "endEthGetToken()", +"59d2af39": "testFooSend()", +"59d313de": "MatchResetDeadline(uint256,uint256)", +"59d33d73": "bountyReserveTokens()", +"59d3ce47": "Activate()", +"59d3d57e": "totalUserLost()", +"59d3d632": "verifierAllocation()", +"59d3dad9": "miscNotLocked()", +"59d4447a": "MingToken()", +"59d52e2b": "XmonetaSale()", +"59d5335b": "refPercent()", +"59d55194": "getPet(uint256)", +"59d5d02a": "transferFee(address,address,uint256)", +"59d5dc11": "PhardusNetwork()", +"59d667a5": "bid(address,uint256)", +"59d6b35b": "lastProof()", +"59d7d46f": "doInvest(address,uint256,address)", +"59d89175": "setSellCommissionBps(uint256)", +"59d90c19": "addLockedAmount(uint256)", +"59d96db5": "terminate(uint256,string)", +"59d998e4": "transferHashOwnership(uint256,address)", +"59d9b2b7": "getTokenOwnership()", +"59dac714": "hashTo256(bytes)", +"59db5bac": "VisitCount()", +"59db9eb0": "deallocate(address,uint256)", +"59dc6d5c": "setDollarBalance(address,int160)", +"59dc735c": "getClient()", +"59dd35da": "ICOPrice()", +"59dd7ad4": "batchTransferFroms(address,address[],uint256[])", +"59dd8f34": "NRB_Tokens()", +"59dfdec8": "totalPlayCount()", +"59e026f7": "internalTransfer(address,address,uint256)", +"59e02dd7": "peek()", +"59e05c5f": "delay_pool_drain_block(uint256)", +"59e08fe1": "isSaleOver()", +"59e09fec": "getLockedAmount_dakehus(address)", +"59e0b91a": "LMOSupply()", +"59e0cf23": "setOraclize(address)", +"59e148fc": "getLastOfferId()", +"59e1667d": "testControlCreateWithForeignParentNotInUse()", +"59e20f69": "addJobInvitation(uint256,address,string)", +"59e239af": "donateAsset(address)", +"59e23ccf": "computeBlockPrice(uint256,uint256,uint256)", +"59e2d30e": "testThrowBlobStoreNotRegistered()", +"59e30226": "getTradeOfferSenderItems(uint256)", +"59e33e35": "indexdate()", +"59e3e1ea": "testDivAdd(uint256,uint256,uint256,uint256)", +"59e415d3": "crowdETHTotal()", +"59e4c4ca": "createLover(string,string,string)", +"59e4eec9": "startMarket(uint32,uint256)", +"59e529cc": "extra_bonus()", +"59e54095": "getRefundValue()", +"59e541af": "getTokenInfoMaxPerBlockImbalanceList()", +"59e5d4b5": "hicsToken()", +"59e6800c": "depositToken(address,uint8,uint256)", +"59e777f6": "newHeir(address,uint256)", +"59e86488": "hasteamadjacency(uint16,uint16)", +"59e94862": "getEthToTokenOutputPrice(uint256)", +"59e994ca": "endTimeOfBids()", +"59e99db2": "_mint(bytes32,uint256,bytes32,address)", +"59e9fb1b": "IPFShash(string)", +"59ea2647": "yearTwoMultiplier()", +"59ea287d": "pre()", +"59ea6d80": "setNegativeArray(int256,int256)", +"59eb8224": "trancheCount()", +"59ebb321": "isManagementProxy(uint32,int256,address)", +"59ebbe35": "cancelFinishMintingRequest()", +"59ebeb90": "Open()", +"59ec29fe": "successICO()", +"59eca3e2": "manipulateSecret()", +"59eddf34": "getSchool(uint256,address)", +"59eecbf9": "assert1(bool)", +"59eee5c7": "hosting(uint256)", +"59efcb15": "execute(uint256,bytes)", +"59f02c4d": "getOraclizePolicyId(bytes32)", +"59f121a8": "setCreator()", +"59f1286d": "queryCredit(address)", +"59f47523": "newUserBonusCardTradable()", +"59f4bbd2": "indexPaidAffiliate()", +"59f568b9": "setDefaultNumberJuror(uint16)", +"59f5e0ce": "purchase(string)", +"59f61c74": "nextKey(uint256)", +"59f62cdc": "buyCalcAndPayout(address,uint256,uint256,uint256,uint256)", +"59f69ab6": "enforceWhitelist(bool)", +"59f769a9": "activeBalanceOf(address)", +"59f8714b": "changeableTokenCount()", +"59f96737": "convertMetToEth(uint256,uint256,int256)", +"59f96ae5": "postSellOrder(address,address,uint256,uint256)", +"59f974ce": "checkFundingGoalReached()", +"59f9a58f": "_vouchersInSharedPool(uint16)", +"59f9edd0": "sultantoken()", +"59fa0663": "setWhitelistOut(address,bool)", +"59fa34df": "findCurrentIndex(address)", +"59faf062": "bidPrice(bytes32)", +"59fb34bd": "_createRide(string,bytes7,address,uint256)", +"59fc2ba4": "DRONEXTOKEN()", +"59fd510a": "extraBalanceNeeded(uint256)", +"59fd95ae": "BTCCToken()", +"59fde1e0": "distributeRevenue(uint256)", +"59fe2720": "updatePollDescription(uint256,bytes,uint8)", +"59fe7279": "ADMINISTRATOR()", +"59ff5b55": "getMagicNumber()", +"59ff6473": "redistributeFees(uint256)", +"5a0024ae": "VerifyCheque(string,string)", +"5a0089d3": "getChildContractAddress(uint8)", +"5a012b17": "landsSold()", +"5a0178af": "update(uint256,uint256,bytes32)", +"5a018e01": "RESERVES_STAKE()", +"5a02dcde": "budgetWallet()", +"5a02ec19": "depositVault(uint256)", +"5a0391f2": "BuyForEtherTransaction(address,uint256,uint256,uint256,uint256)", +"5a044e91": "get_difficulty_list()", +"5a04ce5b": "setMinBalance(uint32)", +"5a051c47": "_purchaseLoopFifo(uint256,uint256)", +"5a052dff": "buyPixel(address,uint16,uint24,string)", +"5a055a33": "Enterprise()", +"5a059a44": "composeJingle(address,uint256[5],uint256[5],string,string)", +"5a05fff0": "bountyRewards(address)", +"5a061a7a": "TradexOne(address,address)", +"5a0646e2": "InitAssignCTC()", +"5a06f1e3": "TMEXAddressSet()", +"5a071517": "existPublicKey(address)", +"5a0718d0": "ICOadvisor1()", +"5a0753ac": "devFeeBalance()", +"5a079207": "Hydro()", +"5a083f54": "transferFromCheck(address,address,uint256)", +"5a09f2f4": "setHouseFee(uint256)", +"5a0ae8d5": "emitSkillRatingGiven(address,address,uint8,uint256,uint256,uint256,uint256)", +"5a0b7663": "getMaxResponseStates(uint256)", +"5a0ce676": "setParams(uint256,uint256,uint256)", +"5a0d9627": "updatePlayerMask(uint256,uint256,uint256,uint256,uint256)", +"5a0db89e": "test_mul(uint256,uint256)", +"5a0ebf94": "TokensReceived(address,uint256)", +"5a0f385a": "reverseTransfer(address,uint256)", +"5a0f3c40": "_foundationSupply()", +"5a1024d5": "setSinistre(uint256)", +"5a10d868": "Diyflex()", +"5a119ef2": "addIcoAddress(address)", +"5a1230bf": "computeCallKey(address,address,bytes4,bytes32,uint256,uint8,uint256)", +"5a129164": "vestingBeneficiary()", +"5a129e97": "byte32ToString(bytes1[32])", +"5a12b581": "GetUser(string)", +"5a13340f": "GetApplicant(bytes32)", +"5a140df0": "_remove(uint256)", +"5a142887": "grantAccessDeposit(address)", +"5a149f08": "finalizeNextUpgrade()", +"5a15656c": "developerCommissionFee(uint256)", +"5a15c373": "transferByOwner(address,address,uint256)", +"5a17877a": "LCDToken(address,address,address,address,address,address)", +"5a17aa41": "getContentTip(bytes32,address)", +"5a181478": "setPayoutCumulativeInterval(uint256)", +"5a182b8b": "SellLoan(uint256,uint256)", +"5a186c77": "init(address,uint256,uint256,uint256,uint256[],uint256,uint256,uint8)", +"5a18ae3d": "apply(string)", +"5a18f9ff": "isFundingNeeded(address,address)", +"5a1a1b67": "zTransferWinningBets()", +"5a1a8593": "bidBatch(uint256[],address)", +"5a1b0c0b": "LogBidCanceled(uint256)", +"5a1b472c": "getmykeyid(address)", +"5a1b96a2": "FiduxaCoinCrowdsale(uint256,uint256,uint256,uint256,uint256,address)", +"5a1bdaa1": "deusETH()", +"5a1cc358": "getChannelRank(address,uint256)", +"5a1e0a46": "cancelVote(uint8)", +"5a1e6ca1": "endRound(uint256)", +"5a1e6fc6": "setEmployeeAddress(uint256,address,address)", +"5a1e921b": "isTradeSupported(address,address,uint256)", +"5a1e9c79": "ProofOfKennyCoin()", +"5a1f3c28": "getCollection(uint256)", +"5a1f892c": "addPresaleContributors(address[])", +"5a2056ba": "rejectPayments()", +"5a212e99": "stringandbytes(bytes)", +"5a22d81a": "buyCEO()", +"5a236389": "getFileLoc(uint256)", +"5a237491": "nextWithdrawDayTeam()", +"5a23932b": "cryptaurus()", +"5a2450c3": "EventHub(address)", +"5a24c6a9": "chart_call()", +"5a272403": "SetAdmin(address)", +"5a275879": "toHex(address)", +"5a2791ed": "block24h()", +"5a28340a": "accessOperatingBudget(uint256)", +"5a297cae": "claimApis(address)", +"5a29ee7b": "sendRemaningBalanceToOwner(address)", +"5a2a3039": "setTopWinnerPrizes()", +"5a2a4452": "_addRole(address,string)", +"5a2a553f": "isCollateralWithinMargin(uint256,uint256,uint32)", +"5a2a75a9": "getTranscoderPoolMaxSize()", +"5a2b043c": "updateNextRound()", +"5a2b31d9": "B24Token()", +"5a2b488e": "calculateRefundedEth(uint256,uint256)", +"5a2bcc18": "mintAmount()", +"5a2bf25a": "setAddressValue(bytes32,address)", +"5a2c0f78": "mintMarketMakerApproval(address,address,uint256)", +"5a2de12f": "ChipTreasury()", +"5a2e311b": "capDefault()", +"5a2e4a11": "raisedWithdrawal()", +"5a2e73a2": "usd2Foken(uint256)", +"5a2ee019": "m()", +"5a2f71d4": "setEquipmentTrainingFeeMultiplier(uint256)", +"5a2fe63a": "isInMainSale()", +"5a30b194": "__address0__()", +"5a317cb3": "SHA256HashRegister()", +"5a31ab2f": "PresaleClosed(bool)", +"5a325fb3": "_setPlatformFeeRate(uint128)", +"5a32d070": "trickleDownBonusesReleased()", +"5a3320ff": "isCrowdsaleOpen()", +"5a338506": "airdropToAddresses(address[],uint256)", +"5a34508b": "delistAddress(address)", +"5a34ced1": "disableFundingWallets(address,address)", +"5a353193": "KrakenPriceTicker()", +"5a353f98": "T20coin()", +"5a354e04": "ProxyUser(address)", +"5a35eb7c": "isWinSlot(uint256,uint256)", +"5a36c394": "executeOrder(uint256,address,address,uint256,uint256,uint256,uint256)", +"5a36e0da": "getProjectCreator(uint256)", +"5a36f4f3": "setMintableProperty(uint256,bytes32,bytes32)", +"5a37ae58": "Show_the_name_of_Option_A()", +"5a388a43": "MVM()", +"5a390a5f": "breedingMarket()", +"5a3a05bd": "subRegistrar(bytes32)", +"5a3a6ef8": "TXL()", +"5a3b7e42": "standard()", +"5a3c0287": "claimTokensFromTokenAiNetworkToken(address)", +"5a3c8826": "dynamicCeiling()", +"5a3dd13f": "getScoreTotal()", +"5a3e251f": "halvingPeriod()", +"5a3f2672": "tokensOf(address)", +"5a3f88f0": "changeGeneration(uint40,uint16)", +"5a4071fe": "lockInternalAccount(address,bool,uint256)", +"5a40bb8f": "setAllergies(bool)", +"5a40ec7e": "verify(uint256,uint256,uint256,string,bytes32[2],bytes,bytes)", +"5a41217e": "underMaintenance()", +"5a414ff6": "getAuthorizedOwners()", +"5a416920": "swapFor(address,uint256,address,address,uint256,uint256,uint8,bytes32,bytes32)", +"5a41d508": "setFlightPrice(uint256)", +"5a42e85f": "SICX()", +"5a4362e5": "closeDown()", +"5a43fa90": "getTokenProposalDetails(uint256)", +"5a4426bc": "proposeLOC(string,address,uint256,string,uint256)", +"5a444139": "canBurnWhiteList()", +"5a446215": "setNameAndSymbol(string,string)", +"5a4528c2": "distributionContract()", +"5a4537b0": "TransferableMultsig(uint256,address[])", +"5a46bb2b": "initChain(bytes,uint32)", +"5a46d3b5": "lockOf(address)", +"5a46f06c": "BANCOR_CONVERTER_FACTORY()", +"5a470aff": "setNthByte(uint256,uint256,uint8)", +"5a470b65": "gamePlayedStatus()", +"5a476e5a": "buyOrderBalances(bytes32)", +"5a481a7e": "ARBITRAGEToken(address)", +"5a4877c0": "timeLockedBeneficiariesDisbursedTo()", +"5a4a04a7": "OWNER_CLAWBACK_DATE()", +"5a4bffb8": "tokenPurchaseAmount(address)", +"5a4c07a0": "fillBlank()", +"5a4c822d": "setAdminPercent(uint256,uint256)", +"5a4cc5da": "Dunhil()", +"5a4d8e59": "getBAU2Length(bytes32,address)", +"5a4ded51": "tokenBuyCalc(uint256)", +"5a4e69f0": "KyberContirbutorWhitelistOptimized()", +"5a4fc9c5": "lookup(int256)", +"5a500066": "WSXToken()", +"5a5132be": "ambix()", +"5a51d1df": "sendReward(uint256[])", +"5a520f8b": "buyDragon(uint256,uint256,bool)", +"5a525491": "safeIndexOfTaskId(uint256)", +"5a527afb": "testFooApprove(uint256)", +"5a52da30": "didVoteForName(address,string)", +"5a52ecf6": "getSignedConfiguration()", +"5a531015": "getLotteryAtIndex(uint256)", +"5a5383ac": "canExitPool()", +"5a53fe20": "multiApprove(uint256[])", +"5a543683": "BuyerLotteryTimes(address)", +"5a54cd46": "proceedEtherDeals(uint256)", +"5a54e755": "hashMachine()", +"5a55c1f0": "getVote(uint256)", +"5a5638dc": "policyTokenBalanceFromEther()", +"5a56a31c": "FeeApplied(string,address,uint256)", +"5a57a901": "VIPSToken()", +"5a5804b3": "getAllocation(uint256)", +"5a589fc9": "authUser(string)", +"5a58cd4c": "deleteContract()", +"5a591a4e": "promotionDataRecord(address,uint256)", +"5a592380": "vestingPlans(uint256)", +"5a593a6e": "totalreleaseblances()", +"5a596aa4": "CheckBalance(address,address)", +"5a5a433b": "checkHash(uint256,uint256,uint256)", +"5a5b32b7": "_setHatValue10(uint256)", +"5a5c8068": "oraclize_setNetworkAuto()", +"5a5d096c": "isOwner(uint256,address)", +"5a5d3350": "KKToken()", +"5a5ddcf6": "startStopICO(bool)", +"5a5e0024": "SecondEtherLimit()", +"5a5e0074": "etherForOwner()", +"5a5e861e": "currentPayment()", +"5a5ebebf": "withdrawRent(address)", +"5a5ec54a": "neglectOwner()", +"5a609b96": "investorsIter()", +"5a61c40a": "setwithtoken(address)", +"5a625393": "ValueTokenBase(uint256,string,string,uint8)", +"5a628525": "reveal(address,bytes32)", +"5a628e17": "getWishIdxAt(address,uint256)", +"5a63cba0": "checkSaleLimit(uint256)", +"5a63feb8": "__targetExchangeAndSpendCallback(address,uint256)", +"5a648bc5": "WithdrawAll()", +"5a64ad95": "mintingFee()", +"5a64b786": "deposit_dividends()", +"5a650f45": "numBountyCredits()", +"5a6535fc": "call(bytes)", +"5a657452": "COD()", +"5a658f6b": "directorNode()", +"5a65f004": "isSynthesizeAllowed()", +"5a67a20d": "endingPrice()", +"5a67f389": "timeGone(uint256)", +"5a6814ec": "thisisfine()", +"5a686699": "post(uint128,uint32,address)", +"5a69fe0e": "TokenERC20(address)", +"5a6ad1e1": "multivestBuy(address,uint8,bytes32,bytes32)", +"5a6af33b": "subtrBalance(address,uint256)", +"5a6b26ba": "withdrawal(address,uint256)", +"5a6b3a79": "assignBounty(address,uint256)", +"5a6c6408": "updatePolicy(bytes32,address,uint32,uint32,uint256,uint256,bool)", +"5a6c787e": "updateWithMPO()", +"5a6cd237": "latestTokenBalance()", +"5a6d663c": "notifyTransfer(address,address,uint256)", +"5a6dad3c": "setFreelancerParams(uint256,uint256)", +"5a6e8980": "editusetaddress(uint256,string)", +"5a6f7aef": "tweakUpgrading()", +"5a703223": "GetToken(address,uint256)", +"5a70686a": "mintChip(bytes32)", +"5a70fe72": "GetInvestedAmount()", +"5a71be21": "ethEur()", +"5a732dd5": "CCPayoutArb()", +"5a74a715": "setWeiForMcr(uint256)", +"5a74dee5": "multiAccessRemoveOwnerD(address,address)", +"5a7511d0": "put(uint256,string)", +"5a753c6e": "getWarlordDistributedRandom(uint256)", +"5a75aa1c": "ChangeRate(uint256)", +"5a75b8d5": "currentHodlerId()", +"5a764631": "setSkillName(uint256,bytes32)", +"5a766620": "neglectGuess(int256)", +"5a768e4a": "ECONOMY_BOOST_TRADE()", +"5a769366": "sadf(address)", +"5a76e73e": "getNoOfTokens(uint256,uint256)", +"5a778cf9": "batchPresale(address[],uint256[])", +"5a78897b": "setFunctionSixPrice(uint256)", +"5a7a4c1e": "_applyPct(uint256,uint256)", +"5a7a8850": "rollWithSeed(bytes32)", +"5a7adf7f": "preSale()", +"5a7b4097": "fundBalanceOf(address,address)", +"5a7b57f2": "MadoffCoin()", +"5a7cb38f": "tokenTransferAddress()", +"5a7da6b5": "burnUpdateTokenFrom(address,uint256)", +"5a7db533": "getRef(address)", +"5a803611": "addDealerForSender(string)", +"5a81018a": "getClientCount()", +"5a811766": "replaceAdmin(address,address)", +"5a813fd5": "test_insert_findWithHintPrevAtPosition(int256)", +"5a8194d2": "getVersionIndex(bytes32,bytes32,bytes32)", +"5a81b5b9": "collectMegaJackpot(uint256)", +"5a825cbb": "getPayment(uint256,uint256)", +"5a851ffb": "calculateDiceWinner(bytes32,bytes32,uint256)", +"5a857565": "buyTokensInternal(address,uint256)", +"5a85d2fa": "playerSignUp(address)", +"5a861838": "addHpbNodeBatch(address[],bytes32[],bytes32[])", +"5a8654ad": "End6()", +"5a86c914": "getRateIcoWithBonusByDate(uint256)", +"5a87053e": "privateBonus()", +"5a87c380": "getRewardListLength()", +"5a8830e2": "partial_refund_my_ether()", +"5a88b15f": "Halo3DShrimpFarmer(address)", +"5a89b376": "contractDecimalsUpdate(uint256,bool)", +"5a8ac02d": "second()", +"5a8b1a9f": "upgradeTo(string,address)", +"5a8b55e2": "IsWildCardCreatedForCategory(string)", +"5a8bbba9": "createNewSecret(string,bytes32,bool)", +"5a8bbee1": "Group_4()", +"5a8cadb1": "migrateAll(address)", +"5a8cf571": "changeControlWallet(address)", +"5a8d580e": "forceNSFW(uint256)", +"5a8d6cea": "transferUnsoldIcoTokens()", +"5a8dd79f": "getDesignatedCaller(address,uint256)", +"5a8e9d66": "settle(address,uint32)", +"5a8ef28a": "GBP(uint256)", +"5a90a49e": "exemptFromFees(address)", +"5a9156f0": "LogAddUser(address)", +"5a91e5e9": "removeFabric(address,address)", +"5a93bf71": "delReferral(address,address)", +"5a93cc8f": "addBonus(address,uint256)", +"5a93f1a1": "_deleteCompany(bytes32)", +"5a9448e2": "multisigFunds()", +"5a94cd0c": "requestChangeStakingFees(uint80,uint80,uint80,int256,uint80,int256,uint256,int256,uint80,uint80,uint256)", +"5a95edd9": "OTHERCRUISER_FTL_SPEED()", +"5a960216": "ethUsd()", +"5a969f94": "InternationalModelChain()", +"5a975128": "minGamble()", +"5a979a5c": "LockContractOwner(address)", +"5a97b84a": "finishUserDistribution()", +"5a983451": "totalTokenMintedAngel()", +"5a992188": "getUserBet(uint256,uint256)", +"5a99719e": "getMaster()", +"5a998a09": "totalRoyalty()", +"5a99b525": "payoutRoyalties()", +"5a99d123": "unsetNotaio(address)", +"5a9a49c7": "verify(bytes32[],bytes32,bytes32)", +"5a9aa592": "currentWallet()", +"5a9b0b89": "getInfo()", +"5a9bb087": "claimContractTokens(address)", +"5a9c0a49": "setBasePrice(uint256[20],uint256,uint256,uint256,uint256)", +"5a9c2724": "create(string,string,address)", +"5a9c3ee4": "mainSaleDeadline()", +"5a9c84f3": "maximumTokensForSecond()", +"5a9cfac8": "hasPosts()", +"5a9d27dc": "createReleaseTokenAuction(string,uint256,uint256,uint256)", +"5a9d5c3c": "PCPP()", +"5a9e03ca": "isIssuedBefore(bytes32,uint256)", +"5a9e426b": "refundMe()", +"5a9e75a2": "maxBorrowAmount(address)", +"5a9e91df": "zlotsJackpot()", +"5a9f2def": "scheduleCall(bytes4,bytes,uint256,uint256)", +"5a9f97d1": "currentSaleDay()", +"5a9ffc35": "circulatingFame()", +"5aa00cc4": "_emitJobCanceled(uint256)", +"5aa037dc": "purchasedTokenBalanceOf(address)", +"5aa1eb4c": "createAdjudicator()", +"5aa23a52": "sendRewardBILL(address,uint256)", +"5aa3952a": "GERCoinCrowdsale(uint256,uint256,uint256,address)", +"5aa3d2b0": "purchasedAmountBy(address)", +"5aa4470f": "setLogicContract(address)", +"5aa451e9": "updateOfferingReputation(address,uint8)", +"5aa4c8a9": "addToMap(uint256,uint256)", +"5aa5b9d1": "LogPersonNew(address,uint256,uint256)", +"5aa61ec6": "getExchangeRatesLength()", +"5aa63592": "DeadMansSwitch(address,address,uint256)", +"5aa68ac0": "getParticipants()", +"5aa6b1f0": "reduceFiatCurrencyRaised(uint256)", +"5aa6cf97": "payout(uint256,uint256)", +"5aa720c3": "linkTaskToUser(address,address)", +"5aa77d3c": "pendingContractOwner()", +"5aa83129": "store(bytes,uint256,uint256,address)", +"5aa86386": "getMinNextBet(string)", +"5aa8a42c": "updateOwners(uint256,address[])", +"5aa8e281": "freezeAccountCoin(address,uint256)", +"5aa94a68": "computeResultVoteExtraInvestFeesRate()", +"5aa97a3b": "agreeNeg(string,uint256)", +"5aa97e16": "BBCPrimeEx()", +"5aa97eeb": "getMarkets(bytes32[],address)", +"5aaa250a": "TokensCappedCrowdsaleImpl(uint256,uint256,uint256,address,uint256)", +"5aaac1d1": "fundingMaxCapUSD()", +"5aab1822": "stateEndDate()", +"5aab25b6": "isRedenominated()", +"5aab4ac8": "motd()", +"5aac8aad": "ICO_TokenValue()", +"5aad0450": "addVestingAllocation(address,uint256)", +"5aad507b": "userTotalCredit(address)", +"5aad7c56": "calculatePMAFromFiat(uint256,string)", +"5aae456a": "potatoTotalSupply()", +"5aae843e": "doPreAllocations()", +"5aaec2b1": "isdelegatinglisted(address)", +"5ab01088": "joinPreSale(address,uint256)", +"5ab027b0": "masterAddress2()", +"5ab0e470": "getShortPositionState()", +"5ab14385": "doProxyAccounting(address,uint256,uint256)", +"5ab1a0e2": "JungleScratch()", +"5ab1bd53": "getRegistry()", +"5ab2ff61": "read_u64_array()", +"5ab30d95": "bobMakesEthPayment(bytes32,address,bytes20,uint64)", +"5ab31a60": "drawNumber(uint256,string)", +"5ab35302": "ProofofHumanity()", +"5ab3ae21": "privatesaleTokens()", +"5ab3ded3": "changeDonationWallet(address)", +"5ab3fbc9": "BGB_Token()", +"5ab47550": "firstDayCap()", +"5ab4f162": "getVote(address,address)", +"5ab50913": "_recalculateAirdrop(address)", +"5ab58d64": "totalLockedHavvens_limitedSum()", +"5ab5956e": "startICOStage6()", +"5ab5d07d": "CROWDSALE_MAX_ACES()", +"5ab68072": "carTaxiCrowdsale()", +"5ab6eb7a": "Tabbo()", +"5ab7603a": "multivestBuy(address,address,string)", +"5ab7f1a8": "donatedAmount()", +"5ab81246": "newItem(uint256,string,string)", +"5ab827f6": "claimableRefund()", +"5ab89248": "AAcontributors()", +"5ab92022": "frozenTransfer(address,uint256,uint256,bool)", +"5ab98b8d": "DragonReleaseableToken(address)", +"5ab9bb26": "changeBonus(uint8)", +"5abaaa01": "unicornTokenAddress()", +"5abacc89": "RANGESTART_9()", +"5abb37d6": "cancelGame(address)", +"5abc3339": "create(bytes32,bytes32,bytes32)", +"5abc52d4": "SALE2_RATE()", +"5abcc417": "createCastle(address,uint256,string,uint64,uint64,uint64,uint64,uint64,uint64)", +"5abd7728": "setMinTaskValue(uint256)", +"5abedab2": "getAllTheFunds()", +"5abfafe2": "holdAddress3()", +"5abfc588": "CreatedDebt(uint256,address)", +"5ac04bed": "CreateMUSC(address,uint256)", +"5ac0dc11": "doTimeoutForComplainant(uint256)", +"5ac14935": "test_0_createOpenController_test_methods()", +"5ac1caa0": "_getCurrentRound(uint256)", +"5ac207ff": "totalLossAmount()", +"5ac2523a": "minimalTokens()", +"5ac26ebd": "devuelveTodasEncuestas()", +"5ac31e68": "getOrdersForNotary(address)", +"5ac36d70": "setTeams(address[],uint256[])", +"5ac3835d": "verifyTransferSignature(address,address,uint8,bytes32,bytes32)", +"5ac44089": "setHardCapInCents(uint256)", +"5ac48043": "slice(uint256[],uint256,uint256)", +"5ac49ba1": "CORE_TEAM_TOKENS()", +"5ac5c4f7": "Out(uint256)", +"5ac5ec65": "UsableToken(uint256,string,uint8,string)", +"5ac5f82c": "computeBonus(uint256)", +"5ac72734": "tkt()", +"5ac77ad1": "isLockedOpen()", +"5ac7a8d0": "UTBToken(uint256,string,string)", +"5ac7b9f3": "reapFarm()", +"5ac7d17c": "getMarketIsClosing(uint256)", +"5ac801fe": "setName(bytes32)", +"5ac849d2": "liveBlocksNumber()", +"5ac87d76": "addToWhiteList(address,uint256)", +"5ac942a7": "getIdentifierByIndex(address,uint256)", +"5ac9e90f": "readLib()", +"5aca6153": "setJackpot(uint8[4])", +"5acb053b": "toggleDead()", +"5acb6787": "createRegion(uint256,uint256,uint256,uint256)", +"5acba201": "canOverride(address,address,address,uint256)", +"5acbd8e1": "ProxyStorage(address)", +"5acce36b": "getEndowmentBalance()", +"5ace5128": "_emitBoardClosed(uint256,bool)", +"5ace83d7": "approveWinner()", +"5acee3d6": "getFutureTransLength()", +"5acf061a": "validateContract(address)", +"5acf34df": "check_data(bytes32)", +"5acf36ca": "fwithdrawal(uint256,uint256)", +"5acfefee": "sendProfits()", +"5ad1854b": "advisersPeriodAmount()", +"5ad22eb3": "canonizedPLCR()", +"5ad35ac0": "numberOfTokensAllocated()", +"5ad4997e": "getResult(uint8,uint8)", +"5ad550bc": "testAbsMax()", +"5ad55aa5": "setCurrentSchellingRound(uint256)", +"5ad5ca74": "createXMLYTrade(bool,uint256,uint256)", +"5ad64dc5": "deletePick(uint256)", +"5ad6ba47": "getChronus()", +"5ad701c2": "getTier()", +"5ad74742": "ICO_Contract()", +"5ad7c05c": "getUserRequests()", +"5ad82148": "getUserid(address)", +"5ad871d5": "CrowdWithUs(uint256,string,address,uint256)", +"5ad8803d": "mintAndCall(address,uint256,bytes,bytes)", +"5ad95948": "wmin(uint128,uint128)", +"5ad9ca10": "changeBonus(uint8,uint256,uint256)", +"5ada0f51": "setTkContractAddress(address,address)", +"5ada7bee": "updateVerifier(uint256)", +"5adada87": "getPaymentsHeld(address)", +"5adb5813": "_setTokenURIBase(string)", +"5adb6ddb": "unfreeze(address,address)", +"5adbe6fb": "ComputeMyEgg(address)", +"5adc02ab": "confirmWhitelistAddition(bytes32)", +"5adc0c68": "getAddTokenParameters()", +"5adcba0e": "getEntryStatus(address,uint32)", +"5adcf475": "loikikdidad()", +"5addc540": "forceToken()", +"5addcc8f": "finishFromDutchAuction()", +"5ade3f8f": "NectarChina()", +"5ade7c8a": "getMyChest(address)", +"5ade9c3a": "removePass(bytes32,address)", +"5adf292f": "updateKittenCoinsRemainingToDrop()", +"5adfafdf": "updateRewardPercentageByIndex(uint256,uint256)", +"5adfff91": "_hashTheSecret(bytes32)", +"5ae11d5d": "order(address,uint256,address,uint256,uint256)", +"5ae17907": "getLossCount(address)", +"5ae23da2": "host_claim_earnings(address)", +"5ae23f84": "getTimeRangeInfo()", +"5ae270aa": "GToken()", +"5ae28fc9": "setMaxAge(uint256)", +"5ae46e93": "RaffleDappBook(string,uint256)", +"5ae4c04a": "viewprice()", +"5ae59132": "havvensReceivedForNomins(uint256)", +"5ae5b24f": "eosPizzaSliceSafe()", +"5ae5df8f": "deleteRef(string)", +"5ae61377": "getMaxBusinessesPerCity(uint256)", +"5ae63989": "WaraCoin()", +"5ae7ab32": "revokeKey(address)", +"5ae81492": "canceloffer()", +"5ae82dfd": "ariseWarrior(uint256,address,uint256)", +"5ae8a1e0": "updateUserPolicy(bool,bool,bool,bool)", +"5ae8daea": "getRoundJackPot(uint256)", +"5ae9c4d8": "getLineData2(uint256)", +"5aea5955": "ltc()", +"5aea92f5": "LingYanToken()", +"5aea9905": "BitrustToken(address,address,address,uint256)", +"5aeb45dc": "TetherToken()", +"5aebd1cb": "isRefundable(address)", +"5aebf21a": "getProviderAdmin(address)", +"5aebfd14": "createFile(bytes)", +"5aec11d4": "canUnshelf(string)", +"5aec2247": "balanceOfPreSale(address)", +"5aec57d8": "NewRound(uint256,uint256,uint256)", +"5aec6259": "getUInt(bytes32)", +"5aed37ef": "manualWithdrawEtherAdditionalOnly()", +"5aed4fa0": "safetyCheck(uint256)", +"5aee1bc0": "AirdropBeggarsCommunity()", +"5aee42bc": "createICOToken()", +"5aee9431": "method1()", +"5aeee9f9": "incFightLose(uint256)", +"5aef2447": "getClaim(uint256)", +"5aef447c": "presaleBonusTokens()", +"5aef7de6": "avatar()", +"5aefd89d": "Freezing()", +"5af0649e": "confirmNewNotary(address)", +"5af0dc98": "blockSkills(address,uint256[])", +"5af0e1ae": "MyWillCrowdsale(uint32,uint32,uint256,uint256)", +"5af0f053": "approveMove(address,bool)", +"5af123f4": "bonusRate()", +"5af14603": "GetSetting(uint8,uint8)", +"5af1cf27": "foundersWallet1()", +"5af1e55d": "op1()", +"5af25671": "HugMathou()", +"5af2f821": "getCounterProposals()", +"5af36e3e": "refund(uint256,uint256)", +"5af3741b": "getAddressAnserKeccak256(uint256)", +"5af3d5bf": "CWCfallback(address,uint256,bytes)", +"5af3e9d7": "bonusLOT()", +"5af40b77": "buildPreICOStage()", +"5af4cd99": "canBurnAddress()", +"5af5f7ba": "setWhitelisting(bool)", +"5af6333d": "getGoldInfoSerial(address)", +"5af73f3f": "getMinimalBalance(uint256,address)", +"5af77fff": "Contract()", +"5af82abf": "director()", +"5af86018": "VPE_Token()", +"5af89094": "getPMul()", +"5af95010": "Lenders(address)", +"5af9f68f": "getTxPaymentMCW(bytes32)", +"5af9f9d5": "TheSchmeckle()", +"5afa5036": "isCertified(address)", +"5afa5bb6": "minValue2()", +"5afb408a": "Penchant()", +"5afb540c": "getTokenCount(bytes32,string)", +"5afbfd4f": "getPublicBattlePokemon2()", +"5afc190d": "DrawHouse()", +"5afc250f": "getDad(address)", +"5afc7e59": "issueFrts(address,address,uint256,uint256,uint256,address)", +"5afd7627": "setCrowdsaleCompleted()", +"5afdc02c": "_9_dataSmerti()", +"5afe16ca": "GetProfile(uint256)", +"5afe5207": "setTokenSaleAddress(address)", +"5afe9ee1": "verifySignedBy(bytes32,bytes,address)", +"5afeb106": "Sqrt()", +"5afecaaa": "getAllArtworksByOwner()", +"5aff457f": "createAuctionFromArray(address,uint256[],uint256,uint256)", +"5aff59e3": "addrCanPurchase(address)", +"5aff7e54": "returnBalance(address,bytes32)", +"5affcbb0": "cancelIndexedSaleByAddress(address)", +"5b00763e": "ProofOfTrevonJames2()", +"5b0088fb": "setPlotData(uint256,string,string,string,string)", +"5b01b5b3": "teamEmail()", +"5b01e233": "getyestodayget()", +"5b02b729": "setLockUpPeriod(uint256)", +"5b04cbb5": "current_state()", +"5b04e512": "defaultLockin(address,uint256)", +"5b050e77": "isInGame()", +"5b053c04": "maxPreSale1Token()", +"5b054f9b": "chainStartTime()", +"5b060530": "createToken(string,string,uint256)", +"5b064754": "LogChiSale(address,uint256)", +"5b067cce": "testCreateCostMain()", +"5b06fc49": "HASHPERETH()", +"5b07371e": "getAttackRanking()", +"5b0783f3": "setCapRec(uint256[],uint256[],uint256)", +"5b07d7d6": "_generateGene()", +"5b091f92": "updateID(address,uint256)", +"5b09a518": "process(bytes32,bytes[])", +"5b0a3843": "emergencyWithdrawal()", +"5b0a6c58": "EasyMineIco(address)", +"5b0ad787": "getBonusSetter()", +"5b0b02ec": "deathData_f4()", +"5b0b7cc8": "payday(uint256)", +"5b0c12a1": "DeploymentInfo()", +"5b0cfcd8": "KillContract()", +"5b0d4eff": "mineral()", +"5b0d5b55": "getTankEarning(uint32)", +"5b0d823a": "referalFundBalanceMap(address)", +"5b0dad8e": "bcdcMultisig()", +"5b0e1a2f": "releaseMyTokens()", +"5b0e52b0": "unlockExternalTransfer()", +"5b0e70ff": "RetireHodl(uint256)", +"5b0e8b82": "admin_list()", +"5b0ec73e": "MNCToken()", +"5b0ef4a4": "getEtherTicket()", +"5b0efb03": "MintAndTransfer(address,uint256,bytes32)", +"5b0fc9c3": "setOwner(bytes32,address)", +"5b1052f1": "getCoinBySlotId(uint64)", +"5b10b796": "_removeCapper(address)", +"5b10d05d": "donotDKKDappToken()", +"5b113414": "mul(uint32,uint32)", +"5b11380d": "ExTokeB()", +"5b1214c6": "setCrowdsale(uint256,uint256,uint256)", +"5b1295d2": "LNDToken()", +"5b12f1b6": "getAuthorizeContractIds(uint256,uint256)", +"5b135806": "test_basicWithTwoAssertAfterThrow()", +"5b14f183": "isPaused(address)", +"5b151fd2": "fifty_fifty()", +"5b154394": "GANA()", +"5b15afb6": "isOuvidoriaCadastrada(address)", +"5b16ebb7": "isPool(address)", +"5b174f0b": "EtheremonTransform(address,address,address,address,address)", +"5b17b190": "onLEXpaContract()", +"5b18056b": "contributionCount()", +"5b195526": "getMyCenter()", +"5b195c86": "transfer(address,uint24)", +"5b196dae": "getOuvidoriaNome(address)", +"5b19a8f3": "prossWinOrLoss(uint256)", +"5b1a77fe": "sentTokensToBountyOwner()", +"5b1aa9b1": "eugToken()", +"5b1b5d90": "getTransfer(bytes32,uint256)", +"5b1b9316": "firstRoundCosmosStart()", +"5b1c1625": "prepareClaim(bytes32)", +"5b1c893a": "UBC()", +"5b1cba31": "freezeAddress(address,address,bool)", +"5b1d0d1e": "getOwnerAccessoryCount(address)", +"5b1dac60": "getSharePrice()", +"5b1dadc7": "PRICE_PRESALE_WEEK2()", +"5b1ea858": "signedTransferSig()", +"5b1eca38": "getTotalDevs()", +"5b1fe0cb": "sendGift(uint256,address)", +"5b1fef12": "GetPVPData(address)", +"5b206edb": "initAmount_()", +"5b208f76": "PlayX2()", +"5b209615": "ecrecover1(bytes32,uint8,bytes32,bytes32)", +"5b21a8b0": "NILEX()", +"5b21ba6f": "calculateProfit(uint256)", +"5b21e539": "decline(uint256,bytes32,bytes)", +"5b225526": "permissions(address,bytes32)", +"5b225d25": "getLatestManifestByName(address,bytes32)", +"5b228f88": "CLCToken()", +"5b229869": "getSenderArmyCount()", +"5b2298c8": "getSumAmountOfDisputedDealsProPatient()", +"5b229ae4": "dungeonRequirements(uint256)", +"5b22bbd2": "maxRaiseAmount()", +"5b2329d4": "checkGoalReached(uint256)", +"5b23bf8a": "forcePayout()", +"5b24f87d": "addManyToAllocationList(address[],uint256[])", +"5b250462": "join_private_room(bytes32)", +"5b251342": "KAnsariCoin()", +"5b25c137": "kycVerifiedBonusBps()", +"5b25ed6a": "tokensLimit()", +"5b284ecd": "InsertRank(uint256,uint256,uint256)", +"5b28919c": "getShipType(uint256)", +"5b28ad15": "dna6(uint256)", +"5b290c1d": "continueRedeeming(uint256)", +"5b29f2e4": "icoSold()", +"5b2a0e96": "multiSend(address,address[],uint256)", +"5b2a372d": "setTxDataBlockNumber(bytes32,bytes)", +"5b2aa4ae": "getMatchInfoList01()", +"5b2b0168": "_refundTokensPurchase(address,uint256)", +"5b2b2194": "addRange(address)", +"5b2b345c": "TOKENS_ACCOUNT_MAX()", +"5b2c44e1": "updateWhitelistInternal(address,address,uint8)", +"5b2ccdec": "hirerCancel(bytes16,address,address,uint256,uint256)", +"5b2cdda3": "returnWalletAddress()", +"5b2d2bcf": "set_car_dealer(address)", +"5b2d7ad1": "calculate_shares_and_return(uint256,uint256,uint256,uint256,uint256,uint256)", +"5b2e1eb1": "ETHPonzi()", +"5b2e299c": "Hypercoin()", +"5b2e39e0": "releaseEcosystemJM(address)", +"5b2e9a81": "UpdateSellAgentSiteReg(address)", +"5b2ec3a5": "createInternalAuction(bytes32,bytes32,uint256,uint256,uint256,string)", +"5b2f515b": "artistName()", +"5b2f8752": "claimLoss()", +"5b303e16": "eatUnicorns(uint256)", +"5b30535d": "updateFactorReward()", +"5b30a647": "checkapproval(uint256,address,bool)", +"5b31035d": "getReward(uint64)", +"5b325e94": "AddTransactionAgainstExistingEntity(address,uint256,uint256,string,string)", +"5b329058": "DSGroup(address[],uint256,uint256)", +"5b33233b": "increaseOwnershipTokenCount(address,address)", +"5b34b966": "incrementCounter()", +"5b34f4e2": "newUserAccount(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"5b353cfa": "PMC()", +"5b35f9c9": "rewardsWallet()", +"5b364f3b": "chkend(uint256)", +"5b366096": "changeHDXcontract(address)", +"5b36fea6": "transferToICAPWithReferenceCallGas()", +"5b372532": "press()", +"5b378d39": "ContractorCreated(address,address,address,address)", +"5b379044": "dateTier3()", +"5b37e150": "create(bytes32,bytes)", +"5b387273": "allowWhiteList()", +"5b38863a": "btcRateMax()", +"5b389666": "USDCryptoToken()", +"5b389dbb": "powerUpContract()", +"5b38a8e6": "updateAssets(address,int256)", +"5b3a4895": "totalInvestedWithBonuses()", +"5b3a6f9e": "DomusToken()", +"5b3b136a": "getMyTokens()", +"5b3b20e1": "CLN_PER_ETH()", +"5b3b449f": "incentiveTokensLimit()", +"5b3bab74": "NeCashTokenSale()", +"5b3be4d7": "mintAirDropTokens(uint256,address[])", +"5b3bf07a": "getPrizeNumbers()", +"5b3d386b": "transferAnyCaerusToken(address,uint256)", +"5b3d4b16": "SCUDO()", +"5b3ddbf2": "firstAuctionConcluded()", +"5b3de1c8": "getBankEth(string)", +"5b3ea961": "ChangeSharedExpense(uint256,uint256,uint256)", +"5b3f4d24": "PrelievoProprietario(uint256,uint256)", +"5b405418": "CallSpread()", +"5b4078de": "decodePriceFeed(uint256)", +"5b40a584": "curId()", +"5b40d5dd": "unlockInBatches(address[])", +"5b419a65": "join(bytes32,bytes32)", +"5b42109d": "getNarcoLocation(uint256)", +"5b4246d4": "proportion()", +"5b440596": "getWithdrawValue(address)", +"5b453810": "changeEtherBonuses(uint256,uint256,uint256,uint256,uint256,uint256)", +"5b454832": "declareDefaultAsBorrower(uint256)", +"5b45b999": "setMiniMeToken(address)", +"5b46016e": "KickTheCoinFactory()", +"5b467404": "getCounts(address)", +"5b472771": "level_8_amount()", +"5b475e22": "STARTING_ANTHILL()", +"5b477c53": "updoot(uint256)", +"5b4786ea": "getValusTokenIssuance(uint256,uint256)", +"5b48165f": "lastBlock_v17Hash_uint256()", +"5b482ec1": "disconnectModule()", +"5b485314": "IEFBR14()", +"5b48684e": "optIn()", +"5b48c11b": "regRefcode(bytes32)", +"5b48e66a": "changeCroStatus(address,uint8)", +"5b49ebdf": "GiantWeedKiller()", +"5b4a54a9": "isCrowdsaleOver()", +"5b4b1c0e": "orientation()", +"5b4b73a9": "setData(uint256)", +"5b4be32b": "setSellStatus(bool)", +"5b4c084a": "updateHpbNode(address,bytes32,bytes32)", +"5b4c3543": "options(bytes32)", +"5b4c6994": "setArbitratorI(address)", +"5b4cc249": "newSale(address,uint256,uint256)", +"5b4cc320": "onOwnershipTransfer(address,uint256,bytes)", +"5b4ccc9d": "addParticipants(address[])", +"5b4d20d2": "requireWhitelistedAddress()", +"5b4df1ca": "ROLE_CONTROLLER()", +"5b4ef70b": "eth(uint256)", +"5b4ef819": "increaseNumber()", +"5b4f472a": "tradingStarted()", +"5b4f5feb": "assignCardOwner(address,uint64)", +"5b500996": "bringuPort(address)", +"5b508cf0": "createRegulatorProxy(address)", +"5b511030": "activateSecondPreIco()", +"5b519132": "getInitHash(bytes32)", +"5b51a6d8": "getMintDelegates()", +"5b51acff": "migrationTarget()", +"5b525b2c": "changeItemName(uint256,string)", +"5b528aaf": "KaiKuangChain(uint256,string,string)", +"5b528ba1": "bonusPer(uint256)", +"5b52b9db": "WLMTfinney()", +"5b52c7fb": "GROWTH_SUPPLY()", +"5b530196": "tokensOfkitty(uint32)", +"5b53d291": "advisersTotal()", +"5b5416ca": "unfreezeTimestamp()", +"5b548ab4": "mixAuto(uint256,uint256)", +"5b54f077": "promissoryUnits()", +"5b55169c": "minContribAmount()", +"5b556bf0": "ZeroExHandler(address,address)", +"5b56af1e": "freezeAccountTimeAndValue(address,uint256[],uint256[])", +"5b56be8b": "prevEndTime()", +"5b56d57f": "getGameStartBlock(uint256)", +"5b588f26": "cfoWithdraw(uint256)", +"5b59af9c": "OwnershipAdded(address,address)", +"5b5a9160": "JackCoin()", +"5b5ae956": "Bytes4ToByteArrayWithLength4()", +"5b5aed3a": "identityExists(uint256)", +"5b5b45ef": "privateOfferingExchangeRate()", +"5b5bbb31": "changeSettings(uint64,uint64,uint8,uint8,uint16)", +"5b5c7705": "withdrawPlayer()", +"5b5cf8cf": "PacersvsCavaliers420()", +"5b5d1d88": "TMRToken()", +"5b5d2c8f": "updateValue(bytes32,uint256,uint256)", +"5b5ddb94": "read(bytes,uint256,uint256)", +"5b5e450b": "masterKeyIndex(uint256)", +"5b5e760c": "getTokenWinValue(uint256)", +"5b5e7bbe": "setAssetsOnDeposit(uint256)", +"5b5ecf19": "CryptoSagaArenaRecord(address,uint32,uint8,uint8)", +"5b5f8b88": "transerFrom(address,address,uint256)", +"5b5fa6ba": "ownerTemp()", +"5b60fa6b": "createTeam(uint256,uint256)", +"5b61291c": "aekS()", +"5b621b2c": "_setMintableProperty(uint256,bytes32,bytes32)", +"5b624b6e": "setinfo(string,string,string)", +"5b630d59": "EFH(uint256,string,uint8,string)", +"5b633cf2": "getItemsIdsByTypeAndOwner(string,address)", +"5b63831a": "getMinimumPurchaseVZTLimit()", +"5b6427fc": "nextNumberOfWagersToMinimumTimeout()", +"5b65b9ab": "setFee(uint256,uint256,uint256)", +"5b65da64": "getPhaseSupply(uint256)", +"5b6682aa": "Tom(uint256,string,uint8,string)", +"5b66cc84": "transferLog(address,uint256,string)", +"5b680aa6": "spentAllowance()", +"5b68a49d": "cancelVoteForCandidate(address,uint256)", +"5b68e09b": "appAccounts(uint256)", +"5b68f3a6": "Loggable()", +"5b6a42b8": "setNewMonster(uint256,uint32,address,string,string)", +"5b6a54bc": "adjustTransactionFee(uint256)", +"5b6a9eb4": "minCost()", +"5b6aa3c2": "isMinTokensReached()", +"5b6accb2": "manualBatchTransferToken(uint256[],address[])", +"5b6b431d": "Withdraw(uint256)", +"5b6beeb9": "getHash(string)", +"5b6c508c": "exitAll()", +"5b6ca99a": "setHint(string)", +"5b6e2492": "getDesignatedReporter()", +"5b6e7be2": "updateTokenBalance()", +"5b6edf78": "DISCOUNT_TOKEN_AMOUNT_T1()", +"5b7121f8": "getMinter(uint256)", +"5b714690": "valueBeforeFeesWereReduced(uint256)", +"5b715ae0": "referralProgrammeWallet()", +"5b7214b6": "m_ETHPriceUpperBound()", +"5b72b9fe": "pushId(bytes32)", +"5b72c3b7": "eraFromMokenData(uint256)", +"5b72cdd0": "estimateBalanceOf(address)", +"5b73024a": "opAddr()", +"5b73b332": "extendTge(uint256)", +"5b7450fc": "isOperable(address)", +"5b752d5d": "getjackpot()", +"5b754491": "transferFromTx(address,address,address,uint256)", +"5b75dd8d": "getSubscription(address,address)", +"5b7633d0": "signerAddress()", +"5b764811": "_jMul(uint256,uint256,uint256,uint256)", +"5b766089": "isCreditor()", +"5b766196": "hasWon(address,uint256)", +"5b767e86": "getArbiter(address)", +"5b791420": "isProxyForSender(address,address)", +"5b7991cd": "extensionsCount()", +"5b79b275": "_currencyToToken(address,uint256,bytes)", +"5b79dbe5": "reserveForTeam(address,address,uint256,uint256)", +"5b7a50f7": "setOldToken(address)", +"5b7a78c8": "test1_overlappingIntervalSameNode()", +"5b7ab891": "BAT()", +"5b7b716c": "tgrSettingsMaxStages()", +"5b7b72c1": "createCloneToken(address,uint256,string,uint8,string,bool)", +"5b7baf64": "claimRefund(uint256)", +"5b7c2dad": "getUserPosition(address)", +"5b7c38ad": "getLLV_edit_22()", +"5b7c569a": "trustedServer()", +"5b7ca9c6": "addPrizePool(uint256)", +"5b7d47a9": "betOnColor(bool,bool)", +"5b7d9043": "creditAccount(address,uint256)", +"5b7da338": "_balanceOf(uint256,bytes32)", +"5b7db24d": "addRemoveCountry(string,string,bool)", +"5b7dc56a": "updateLuckyblockSpend(bytes32,address[],uint256[],uint256)", +"5b7eed81": "T1898Token()", +"5b7f415c": "TOKEN_DECIMALS()", +"5b7fc27f": "getInitializParentUniverseValue()", +"5b7fd9b5": "brands(address)", +"5b806645": "badgeCount()", +"5b80f497": "getAvailableIds()", +"5b814e16": "freezing()", +"5b824208": "changeMinimumTimeBeforeUpdate(uint256)", +"5b82d694": "SetClaimFee(uint256,uint256)", +"5b8315e4": "TokenSCADAEntity()", +"5b833f1e": "nextTokenOwner()", +"5b839dd2": "initBonusSystem()", +"5b83b7f1": "investorExists(address)", +"5b84bb27": "MYTOKENNAME()", +"5b850d92": "PollCreated(address,address)", +"5b859394": "PunkBidEntered(uint256,uint256,address)", +"5b859500": "hardcapInEther()", +"5b863b5a": "ZenomeSale(address,address,uint256)", +"5b86914d": "bet_value()", +"5b869e68": "DeviceAddr()", +"5b86ce97": "buyEggWithToken(address)", +"5b86f599": "increaseBalance(address,uint256)", +"5b8710e5": "checkTransferRequirements(address,address,uint256)", +"5b87a2f2": "confirmreward()", +"5b8807d9": "claimReserveTokens()", +"5b88349d": "claimAirdrop()", +"5b889ab8": "ammount()", +"5b8943ff": "addAffiliate(address,address)", +"5b89a48a": "lockEpochsMap(address,uint256)", +"5b8aa811": "setRequiredParticipation(uint256)", +"5b8ad515": "isUtilityHolder(address)", +"5b8b4f91": "refererAllowed(address,address,address)", +"5b8bcb53": "CappedSale(uint256)", +"5b8be30c": "TheCoinSale()", +"5b8c6b58": "RoundBHardCap()", +"5b8d02d7": "payoutAddress()", +"5b8d8807": "setTokenMinAmountSell(address,uint256)", +"5b8e48df": "swypes(address)", +"5b8fa846": "payDividends(string)", +"5b8fb4ae": "EthKing()", +"5b905b6c": "newProposal(string,bytes32,bytes32,bytes32,string,uint256,uint256)", +"5b90ed39": "emitEscrowUpdated(address)", +"5b91aa6b": "underNumber()", +"5b91fd60": "performTheMagicTrick()", +"5b9248aa": "correctResult(int8)", +"5b9283e7": "isInvalidEarlyPurchase(uint256)", +"5b92cdee": "bountyAffiliateWallet()", +"5b92e548": "CreateCBT(address,uint256)", +"5b93c2bc": "getWinnerAddressList()", +"5b940081": "releasableAmount()", +"5b945c0e": "getLableList()", +"5b947f36": "ItasToken()", +"5b94db27": "nominateOwner(address)", +"5b95f65e": "getAddressesByDocHash(bytes)", +"5b9632ca": "minValue1()", +"5b96c1e7": "oracleMasterCopy()", +"5b980628": "collectFunds()", +"5b984ff6": "enableWithdraw()", +"5b9900ce": "getWeiforTokens(uint256,uint256,uint256,uint32)", +"5b99cb2b": "joinGame(uint256,uint256,bytes32)", +"5b99df7f": "transferWithFee(address,address,uint256,address,address,uint256)", +"5b9a4690": "convertToMiniRYC(uint256)", +"5b9af12b": "addValue(uint256)", +"5b9b0609": "maxContribAmount()", +"5b9b44bf": "startDefinedGame(uint256)", +"5b9eb8ab": "CONVERSION_NUMINATOR()", +"5b9f0016": "stakedBalance()", +"5b9f7cbe": "createNode(bytes32,bytes32,bytes32,address)", +"5b9fdc30": "getSecret()", +"5ba05024": "getInsuranceByAddress(address)", +"5ba0cd78": "BitcoinZ()", +"5ba13abf": "createMulti(uint256,address[])", +"5ba17b2d": "NewtonTree()", +"5ba1a1d4": "viewKarmaVotesBySymbol(string,address)", +"5ba2dd22": "conflictRes()", +"5ba32008": "FDKToken()", +"5ba39782": "getCommentAccounts()", +"5ba3e63e": "MultiSigRules(address[])", +"5ba58955": "beneficiaryBalance(address)", +"5ba5b1b2": "setSoldPreSaleTokens(uint256)", +"5ba67330": "SendDivs()", +"5ba6c017": "setTotalSpentPerDay(uint256,uint256)", +"5ba83c0d": "getMEATime()", +"5ba87a4d": "getWithdrawedToken()", +"5ba88490": "privlocatumICO()", +"5ba88c28": "debug2()", +"5ba8c608": "activePoll()", +"5ba8eb42": "getClearance(address,address)", +"5ba91006": "Sports3D()", +"5ba92d7d": "_freeze(address,uint8)", +"5ba9e48e": "nextPriceOf(uint256)", +"5bab1a63": "totalEthxRecieved()", +"5babb758": "testSetUp()", +"5babe01b": "distributedBountyStakes()", +"5bac1e11": "ReclaimBegun()", +"5bad05bd": "hardCancelOrder(uint224)", +"5bad9fa7": "walletOut2()", +"5badbe4c": "requestCount()", +"5badcd08": "TokenFulfillment(address[2],uint256[7],uint8,bytes32[2],uint256)", +"5badf100": "fireOnChanged(bytes32)", +"5bae2120": "test_doubleVotingFor()", +"5bae3f75": "CategoryAdded(uint256,string)", +"5bae4e98": "getOwnerRating()", +"5bae510d": "deposits(uint32)", +"5bae8c36": "isNewParent(address)", +"5bae9ce9": "blacklisted()", +"5baef4f3": "INCREMENT_RATE()", +"5baf039f": "add(address,address,address,address)", +"5baf4a09": "ausgroupTransfer(address,uint256)", +"5bafecf5": "calculateFloatingValue(uint256,uint256,uint256,uint256,uint256,uint256)", +"5bb0fa46": "RESERVE_EXCHANGE_SHARE()", +"5bb18362": "isReadyToBear(uint256)", +"5bb2b102": "registerNameCore(uint256,address,uint256,bytes32,bool,bool,uint8)", +"5bb31436": "transferKnightOwnership(address)", +"5bb3e5f6": "fixNoCallback(bytes32)", +"5bb41203": "test_oneAssert()", +"5bb447a8": "NOTtoken()", +"5bb47808": "setFactory(address)", +"5bb4df3c": "assignFrom(address,address)", +"5bb59815": "claimWarranty(string,uint256,string)", +"5bb5b917": "insureClient(address,address,uint64)", +"5bb5bb86": "dtGetBuildingData(address,uint256)", +"5bb7cf11": "ERC20(address,uint256,string,uint8,string)", +"5bba11bd": "bonusTicketsPercentage()", +"5bba3307": "splTransferFrom(address,address,uint256,uint256)", +"5bba6a7c": "propagateRequest(address,uint256,bytes32,bytes32)", +"5bba7aa5": "_assignBlocks(bytes16,bytes16,uint8,uint8)", +"5bbb7c42": "CPCEFund()", +"5bbdc7c5": "accrueTeamTokens()", +"5bbe66a7": "lastBlock_a15Hash_uint256()", +"5bbe6790": "Electronero()", +"5bbe8a33": "EGYPTTEST()", +"5bbee518": "investmentETH()", +"5bbf9c94": "arbLocked(address)", +"5bbfd0d7": "mintedGBT()", +"5bbfe9b6": "_myGroupHelper()", +"5bc008a0": "getAccessLevel(address)", +"5bc02d5c": "GooGameConfig()", +"5bc07110": "numArticlesPublished()", +"5bc0b4db": "ONESATOSHIToken()", +"5bc22d1b": "getStart(uint256)", +"5bc24dd3": "changeSubcourtAlpha(uint96,uint256)", +"5bc34f71": "currentStep()", +"5bc4e163": "drainRemainingToken(address,uint256)", +"5bc550fe": "mining(bytes)", +"5bc5c1a8": "getRoundDividendPerBBTHelper(uint256)", +"5bc5cf42": "mocatoken()", +"5bc60cfc": "win(uint256)", +"5bc6d41d": "doDisableSellerCancel(bytes16,address,address,uint256,uint16,uint128)", +"5bc6e107": "GetEscrowCreationDate()", +"5bc72460": "alterBannedStatus(address,bool)", +"5bc7285f": "sumICOStage3USD()", +"5bc789d9": "tokenVault()", +"5bc7e259": "updateRelease(uint32,uint32,uint32,bytes,bool)", +"5bc8a672": "setDetachmentTime(uint256)", +"5bc91b2f": "createRound(uint256,uint256,uint256,uint256)", +"5bc97d73": "Purchase(address,uint256,uint256,uint256)", +"5bca7f38": "set_pre_kyc_iconiq_bonus_numerator(address,uint256)", +"5bcabf04": "baseUrl()", +"5bcafcf3": "ProfitByCard(address,uint32)", +"5bcb2fc6": "submit()", +"5bcbc0f9": "PRICE_DIVIDER()", +"5bcc1072": "addressesToChatMessagesLeft(address)", +"5bcc209d": "getTokenAmountForEther(uint256)", +"5bcc29d7": "setDefaultURIStart(string)", +"5bcc437c": "revokePastDelegations()", +"5bcc7928": "saleType()", +"5bcc8198": "tokenCommissionReceiver()", +"5bcd3dba": "ACAToken(uint256,address,address)", +"5bcf6674": "setMinimumAllowedWei(uint256)", +"5bd1b8c5": "countCars()", +"5bd1f067": "OONE()", +"5bd26361": "sentTokensToPartner()", +"5bd2cc9f": "Notified(address,uint256)", +"5bd4349b": "getTotalGames()", +"5bd475fd": "destTokensDevs()", +"5bd479ac": "SoccerBet(string)", +"5bd489e1": "HelperPortion()", +"5bd54fa3": "setCryptoSagaCardSwapContract(address)", +"5bd5e89c": "decreaseArrivalTime(uint256,uint256)", +"5bd674dd": "gallerySeven()", +"5bd74490": "regProxy(address,address)", +"5bd7b9fd": "Rbank()", +"5bd7c609": "getEtherDiceProfit(uint256)", +"5bd7ebc5": "changeMinInvest(uint256)", +"5bd91213": "TransferKO(address,address,uint256)", +"5bd9279c": "placeBuyNowOffer(uint256,uint256)", +"5bd948b1": "useEIP712()", +"5bd9749c": "initialValidators()", +"5bd9abfb": "CreateTestCoin()", +"5bd9e637": "buyLC()", +"5bd9ea2e": "out5Done()", +"5bda1af0": "startCrowd(uint256,uint256,uint256,uint8,uint8)", +"5bda8fa4": "setSecondTime(uint256)", +"5bdaa6dd": "Token_Price()", +"5bdaeba2": "PausableTokenMock(address,uint256)", +"5bdb280f": "RESERVES_SHARE()", +"5bdb9ddf": "changeStepPricesLimits(uint256,uint256,uint256)", +"5bdc3c53": "setImmigrationCtrl(address)", +"5bdcc165": "batchTrasferByValue(address[],uint256[])", +"5bdcd0b0": "lifetimePayouts()", +"5bdf7b4f": "initilSupply()", +"5bdfaaff": "ASIABITSToken(string,uint8,string)", +"5bdff855": "gettotalCardDivs(uint256)", +"5be0497e": "getAdjacentCells(uint8)", +"5be1d5c3": "buyBlueStarEgg(address,uint256,uint16)", +"5be2aca0": "tokenRegistryAddress()", +"5be4d442": "setTrustedContract(address,bool)", +"5be53284": "GlobaleCash()", +"5be54515": "assignBountryToReferals(address,uint256)", +"5be5d9e3": "XdacToken(uint256)", +"5be5e3ec": "castVote(uint256,uint256,uint256)", +"5be60644": "sendcdd(address,uint256,address)", +"5be62401": "createUserWithProxyAndRecovery(address,address,uint8[],uint256,uint256[],uint256[])", +"5be6affc": "CloverCoin(address)", +"5be6d2eb": "exitPot()", +"5be782d1": "WORLDMOBILITY()", +"5be7cc16": "transferAdminship(address)", +"5be7fde8": "releaseAll()", +"5be80e85": "markCompromised()", +"5be89fac": "dAlterPull(uint96)", +"5be989d1": "CRYPTOBITECOIN(uint256,string,string)", +"5bea05b1": "getUSDBtc()", +"5bea0e1c": "calculateDividend(uint256,address)", +"5bea2941": "LYBT3Token(uint256,string,uint8,string)", +"5bea641a": "change_admin_commission(uint256)", +"5beb1d8f": "currentIcoPhaseMinimum()", +"5beb3f61": "WhitelistedStatusUpdated(address,uint256)", +"5bebe2c6": "getData_32()", +"5bebefdc": "checkForInterest(uint256,bool)", +"5bec1496": "ChangeQuota(uint256)", +"5bec9e67": "infinite()", +"5becf24c": "confirmChannel(uint256)", +"5bee29b7": "retrieveData(uint256)", +"5bee29be": "setSalary(uint256,uint256,uint256)", +"5bef1208": "getModuleIDByHash(bytes32)", +"5bef95a2": "setFiscalVerify(uint256,uint256,bytes32)", +"5befbb9b": "calceth(uint256)", +"5bf042e5": "setTradeAddress(address,address)", +"5bf0cb1f": "isTransferAllowedadv()", +"5bf1f2f8": "numberOfAbilitiesSold(uint256)", +"5bf2a4e9": "contains(bytes32,bytes32)", +"5bf339b1": "DogCore()", +"5bf3a315": "isTrustedContract(address)", +"5bf4063d": "minEthValue()", +"5bf47d40": "bntyController()", +"5bf5c29c": "_createHero(uint256,address)", +"5bf5d54c": "currentStage()", +"5bf608b8": "getBuyer(uint256)", +"5bf6e582": "getAllHpbNodesExtByStageNum(uint256)", +"5bf72bb1": "use_test_data()", +"5bf85c28": "CryptomniumChain()", +"5bf8633a": "nftAddress()", +"5bf95e43": "strategicAllocated()", +"5bf9755e": "setUint256(uint256,uint256)", +"5bfb1dab": "EIP20Token(uint256,string,uint8,string)", +"5bfb8ff2": "getRegistration()", +"5bfbbe39": "_transfer_internal(address,address,uint256,bool,bytes)", +"5bfc61c0": "claimPlot(uint256)", +"5bfd1ab8": "unBlockAddress(address)", +"5bfd8efe": "blockSettlementHash(uint64,uint64)", +"5bfdab26": "queryWithdrawed(uint256)", +"5bfdb8b2": "crowdsaleStartingBlock()", +"5bfdc700": "registerData(address,int256,bytes,address)", +"5bff1aa8": "EOSCToken()", +"5bfface4": "setBuyComission(uint256)", +"5c003af9": "TOKEN_WITHDRAWAL_END_DATE()", +"5c004bcc": "sendFrom(address,address,uint256)", +"5c006f75": "changeHoldByAddressIndex(address,uint256,uint256,uint256)", +"5c00ad5e": "ShowPercent(address)", +"5c0133d9": "filled()", +"5c016b91": "ownerDisablePayee(address,address)", +"5c01943a": "bountiesBalance()", +"5c0252fe": "setOnlineTime()", +"5c025e03": "authorizeOperatorByTranche(bytes32,address)", +"5c0286c0": "changeLOT(uint256)", +"5c0305ec": "EUTBToken()", +"5c042d0f": "BiQCrowdFund(address,address,address)", +"5c044b86": "roundThreeTime()", +"5c04e9f8": "firstXRChangeBlock()", +"5c062d6c": "currentDifficulty()", +"5c06d880": "getRateWithoutBonus()", +"5c071492": "hardCapLow()", +"5c073ac4": "basicTransferTest(address)", +"5c0796fd": "emitUserCreated(address,address,address,address,uint8[],uint256,uint256[],uint256[])", +"5c07993b": "investorInterest()", +"5c07ac94": "changeCrowdsaleRate(uint256)", +"5c084a25": "get_pvn_token_balance(address)", +"5c0a8177": "claimOCDividend()", +"5c0a9b8d": "transferToContractAddr(address,uint256)", +"5c0b51fb": "theList(address)", +"5c0ba18e": "BitBoscoin()", +"5c0c3dce": "setUserList(address)", +"5c0cc07a": "TAXChain()", +"5c0e6166": "Bill(address,string,uint8,string,uint256,uint256,uint256,uint256,uint256)", +"5c0e6bc4": "icoTokenPrice()", +"5c0f82b7": "GetIdByAddr(address)", +"5c0f9a3e": "getStrandGenesisBlockHash(uint256)", +"5c0fc34c": "freedomcryptotoken(uint256,string,string)", +"5c0fed8e": "EOBIToken()", +"5c100cc2": "setPreIcoDiscount(uint256)", +"5c1020f9": "addPhenomenon(string,string,string,string,uint8)", +"5c102782": "reward(address,uint256,string)", +"5c10286a": "auctionsEnabled()", +"5c1098c3": "crowdSaleOverTimestamp()", +"5c109a59": "updateStatus(address,address,uint256)", +"5c10b2e8": "contributionsAddress()", +"5c10cab8": "collected_crowd_wei()", +"5c10ec87": "preSaleDurance()", +"5c10fe08": "proofOfWork(uint256)", +"5c12a0e8": "DroneShop()", +"5c12cd4b": "getPlayer(address)", +"5c12f040": "emergencyWithdraw(bool)", +"5c131d70": "burnMax()", +"5c135535": "gooBalanceOf(address)", +"5c1397de": "signup(bytes32)", +"5c13a439": "checkAccount()", +"5c13d06f": "checkLockedToken()", +"5c13e2b5": "end_ICOs()", +"5c142f2b": "freezeAccountWithToken(address,uint256)", +"5c146b80": "_existCaller(address)", +"5c148b47": "calcClaimableTokens()", +"5c1548fb": "getCollateral()", +"5c164624": "decisionOf(bytes32)", +"5c1671a6": "hasSameArrayLength(address[],uint256[])", +"5c16e323": "__executeOrderInputIsValid__(address[4],uint256[8],address,address)", +"5c1796ef": "sponsored(address)", +"5c17f9f4": "approve(address,uint256,bytes)", +"5c19a95c": "delegate(address)", +"5c1b3a68": "setPrvdWallet(address)", +"5c1b3ca1": "getConfigUint(int256,bytes32)", +"5c1b9377": "TestBNB(uint256,string,uint8,string)", +"5c1b94d1": "publicGetRound()", +"5c1bc695": "addSubDivision(address)", +"5c1d2215": "mintTokensLocked(address,uint256)", +"5c1f71af": "setAllowBurns(bool)", +"5c206c6b": "FreeTokensIssued(address,address,uint256)", +"5c206f41": "finalValue()", +"5c207547": "wantsBusiness(bytes32,bytes32,address)", +"5c20ad9e": "multiValueBatchTransfer(address[],uint256[])", +"5c20c1dc": "distributePuppyCoinSmall(address[])", +"5c20eec6": "twentyThirtyTokens()", +"5c221385": "preciowea()", +"5c221816": "burnAccountMoeny(address,uint256)", +"5c222bad": "getAsset()", +"5c22aaae": "setGameTransferFlag(address,bool)", +"5c2323e7": "authorizedToTransfer(address)", +"5c239e58": "createItemSaleMarkets(uint256,uint256)", +"5c23bdf5": "resolve(bytes32)", +"5c23d56f": "checkInbox()", +"5c242c59": "query1(uint256,string,string,uint256)", +"5c243f03": "GetLengthofList()", +"5c251cbf": "releaseStake(address,bytes32,uint256,uint256,uint256,bool)", +"5c253f52": "o_novo_problema(uint256)", +"5c25e903": "_lockNinja(uint256,uint16)", +"5c261556": "initFrozenTokenMap()", +"5c26a007": "IsEnable()", +"5c272fb2": "Unblocked(address)", +"5c27bbf6": "CryptoCompare()", +"5c27cdc3": "mintTeamTokens(uint256)", +"5c28c7e0": "privateSaleList()", +"5c2930ad": "shareholders(address)", +"5c2a8763": "percentageToReinvest(address)", +"5c2b0287": "BOXSToken()", +"5c2b1119": "getTop()", +"5c2b18e9": "VestingFund(address,uint256,uint256,address)", +"5c2bdc9f": "GainCard2(address,uint32)", +"5c2c2005": "issuePrice()", +"5c2c8db7": "withdrawToAddress(address,address)", +"5c2cc46d": "findResNameByAddress(address)", +"5c2ccaba": "GslStandardToken(uint256,string,uint8,string)", +"5c2d0e53": "KUNAsToken()", +"5c2e7a00": "setTokenBurnFeeProp(address,address,uint256)", +"5c2e7a13": "QuestionStore(address)", +"5c2e891c": "ECAP()", +"5c2eb1ef": "honestisFortbackup()", +"5c2ee908": "updateWinners(address[])", +"5c3004da": "getPpls(uint32)", +"5c30be8e": "callOracle(address,uint256)", +"5c314df0": "MINER_STAKE()", +"5c31f93b": "unpublish()", +"5c320516": "changeAmount(uint256)", +"5c32460b": "isAddress(address)", +"5c328e3d": "getMyAcceptance(address,uint256)", +"5c35b4e1": "exchangers(address)", +"5c35f464": "_modAccountBalance(bytes32,uint256)", +"5c361091": "PeerBetting()", +"5c36901c": "isActive(bytes32)", +"5c36a0bb": "collect(int32,int32)", +"5c36b186": "ping()", +"5c36e11c": "identified(address,address,bytes32)", +"5c37a17c": "saySomething(bytes)", +"5c390f82": "tokenEquivalent(uint256,uint256)", +"5c398d86": "_getHash(address,uint256,uint256,uint256,uint256,uint256)", +"5c39b671": "sendOwnerCommission()", +"5c39c1ab": "collectedAddressesCount()", +"5c39ec58": "addClaim(address,uint256,uint256,bytes,bytes,string)", +"5c3a4c3d": "startRick()", +"5c3c8c87": "putHere()", +"5c3cd827": "allOfferingSupply()", +"5c3cdec8": "getTotalFeeStake()", +"5c3d005d": "demote(address)", +"5c3d6a7d": "setSaleAuction(address,address)", +"5c3dcfde": "listedTokensAsBytes(uint256,uint256)", +"5c3e38ee": "updateMinSpend(uint256)", +"5c3e426c": "adminRetrieveDonations(address)", +"5c3f9765": "endDateClose()", +"5c3ffada": "getPlayerCardIdsForTeam(uint256)", +"5c40329e": "setPresaleTime(uint256,uint256)", +"5c40839f": "GenevExch(address,address,address,uint256,uint256,uint256)", +"5c40f6f4": "setStatus(bool)", +"5c416306": "extractApprovedIndexLength()", +"5c417695": "burnMana(uint256)", +"5c4271c9": "issueDividendRewardBips()", +"5c42d079": "getProvider(uint256)", +"5c4301f2": "multiExecute(address[],uint256)", +"5c435396": "show_the_name_of_Option_D()", +"5c43fce3": "showteam(address)", +"5c44a837": "RemainingTokenStockForSale()", +"5c44c3e5": "addAdv(address,string)", +"5c45079a": "dropToken(address,address[],uint256[])", +"5c45872e": "_addCategory(address,uint256,uint256)", +"5c4633a4": "_revealNumber(address)", +"5c469570": "ReiDoCoinToken()", +"5c473764": "RESERVE_FUND()", +"5c474f9e": "saleStarted()", +"5c475676": "getProposal(uint256,bytes32)", +"5c47e306": "advisorsTokensPercent()", +"5c47ead7": "getParticipantData(address)", +"5c481d8b": "convertToWei(bytes32,uint256)", +"5c492129": "totalGamesPlayed()", +"5c49660a": "privateIcoTokensForEther()", +"5c4978e0": "getCurrentYearGameMiningTokenCap(uint256)", +"5c49d96c": "nTickets()", +"5c4a627f": "totalPreICOAmount()", +"5c4b4c12": "transferPreSignedHashing(address,address,uint256,uint256)", +"5c4bade1": "transferEtherTo(address)", +"5c4bfa10": "buyout()", +"5c4c9f6f": "WithdrawToken(address)", +"5c4d3609": "getTargetDesignatedReportNoShowsDivisor()", +"5c4e10e8": "sendLimitTokensToFounder(uint256,uint256)", +"5c4f4024": "tryRoundEnd(uint256)", +"5c4fb1c5": "comisionGetter()", +"5c5020e7": "setValidatorStake(bytes32,uint256)", +"5c50c356": "getTotalBonded()", +"5c50c63a": "isTokenTransferLocked()", +"5c511a2a": "OrphanWalefareToken()", +"5c5204d6": "changeOwnerTo(address)", +"5c52b434": "Boxicoin()", +"5c52bba7": "countParticipants()", +"5c52c2f5": "resetSpentToday()", +"5c52e51e": "processPayout()", +"5c53ec59": "setReasonableDiff(address[],uint256[])", +"5c54305e": "InsufficientFunds(address,uint256,uint256)", +"5c552879": "bytesToBytes8(bytes)", +"5c552fab": "getMetadataUser(address)", +"5c5557e7": "setKWHForGas(uint256)", +"5c561fff": "removeAllowedTransactor(address)", +"5c56afa3": "priorTokensSent()", +"5c58ad8e": "processDiceBet(uint256,uint256,int256,bytes32,bytes32)", +"5c590683": "SomeRegister()", +"5c5991d4": "token_ratio()", +"5c5a8ad5": "LogBid(address,address,uint256,uint256,uint256)", +"5c5b9f8f": "depositTokens(address,uint256,uint256)", +"5c5ce16e": "NXTokenCoin()", +"5c5d625e": "getProof()", +"5c5dc9a0": "embark(uint16,uint16,uint256)", +"5c5df66a": "setRequiredExpIncreaseFactor(uint32)", +"5c5e0aca": "setGrowingMaxPerDay(uint256)", +"5c5e20b6": "revertAuction(uint256)", +"5c5e274e": "mMaxChainCode()", +"5c5e54c9": "hasBothAttributes(address,bytes32,bytes32)", +"5c5f786e": "s4(bytes1)", +"5c5f7c5b": "setAdvisorsTokensPercent(uint256)", +"5c60da1b": "implementation()", +"5c60f226": "deleteUser(address)", +"5c612167": "newMultiService(address[])", +"5c613a03": "bountyReservedBalanceOf(address)", +"5c617279": "registeredApps()", +"5c61c853": "getProposalIndex(uint256)", +"5c61d628": "changeFundingLimit(uint256,uint256)", +"5c61f9b4": "getBlockResult(uint256)", +"5c6224c9": "Operational(address)", +"5c622a0e": "getStatus(uint256)", +"5c622c09": "getIsSendingLocked(address)", +"5c629788": "totalLevel(uint256[])", +"5c634241": "CanaryV6()", +"5c64bb72": "getCurrentSale()", +"5c658165": "allowed(address,address)", +"5c659bdb": "declareHanged(address,uint256[])", +"5c665f89": "getFunds(address,bool)", +"5c66bd58": "addWeapon(address)", +"5c679f7b": "batchVote(address[],uint256[])", +"5c67a5db": "approvalRatio()", +"5c67ae76": "PRE_COIN_PER_ETHER_ICO()", +"5c67dd1e": "getBlockRoot(uint256,uint256)", +"5c67f7b0": "transferFromTgefund(address,uint256)", +"5c68908b": "CategoryCatalog()", +"5c693657": "setMaxPower(uint256)", +"5c69d5d6": "completeOrder(bytes32,uint256)", +"5c6a0246": "fundsClaimed()", +"5c6a6edd": "bloquear_contrato()", +"5c6ae355": "removeAuthorizeduser(address)", +"5c6baf3d": "createProxyAddressFor(address)", +"5c6bcad4": "transferFromOrigin(address,uint256)", +"5c6bd930": "calculateBonusToken(uint8,uint256)", +"5c6c8903": "Buy(address)", +"5c6cad31": "storeCryptoNames(string)", +"5c6ce321": "RDT()", +"5c6e0ebf": "getScenariosInfo(bytes32,string,string)", +"5c6eb2d2": "atl()", +"5c6eb7ae": "withdrawStock()", +"5c707f07": "setName(string,string)", +"5c714e90": "starterPackPrice()", +"5c71ae10": "EEZOToken()", +"5c71dec8": "FreezeAdmin()", +"5c72b160": "invalidatePendingWithdrawl(uint256)", +"5c72de09": "BONUS_ICO_ROUND3()", +"5c7460d6": "userRegistry()", +"5c752f6b": "incGen0Count()", +"5c7584b9": "isEarlyInvestors()", +"5c75df30": "churn()", +"5c76ca2d": "paidOut()", +"5c770267": "RefundVault()", +"5c7713d4": "CountCow(address)", +"5c77582f": "changeTeamCosts(uint256[])", +"5c778605": "borrowVerify(address,address,uint256)", +"5c78f9e2": "getDepositorsTokens()", +"5c796720": "CurrentIceDelta()", +"5c7a281d": "HugsByMathou()", +"5c7ae6e3": "ethDivsOwing(address)", +"5c7b0288": "gemAttackConversion()", +"5c7b35f8": "resetTokenOfAddress(address,uint256)", +"5c7b79f5": "cashOut(uint256)", +"5c7b9ccf": "BASE_POS()", +"5c7c43fa": "maximumBuyBack()", +"5c7c49c9": "validateKey(bytes32)", +"5c7c9aa4": "checkAccountState(address)", +"5c7cbb0f": "_decode(bytes32,bytes32)", +"5c7d6425": "setPVPEntranceFee(uint256)", +"5c7f3d9a": "hatchMorties(address)", +"5c7f7f63": "getGrantees()", +"5c7fe08e": "PURCHASE_AMOUNT_CAP()", +"5c803f19": "alarmRaised(uint256)", +"5c803f36": "empties(address)", +"5c80461e": "isInStage1()", +"5c80b448": "setMatingSeason(bool)", +"5c810f09": "disableSellerCancel(bytes16,address,address,uint256,uint16)", +"5c812737": "payoutMultiplier()", +"5c8136c2": "retrievedTokens()", +"5c81662e": "internalMint(uint8,address,uint256)", +"5c81b8f9": "MIRCOOToken()", +"5c838081": "getNota(address,uint256)", +"5c852231": "updateSizeBonus(uint256)", +"5c85267b": "PaymentChannel(address,uint256)", +"5c85974f": "setTxLimit(uint256)", +"5c8747cd": "getSoftwareVersionRecords(uint32)", +"5c87e40f": "SignatureCheckerChanged(address)", +"5c88da6f": "getUSD()", +"5c894469": "getPlayersByTrackId(bytes32)", +"5c89c10d": "setBannedCycles(uint256[])", +"5c8a1053": "extend(string)", +"5c8a694e": "FundableToken()", +"5c8a733a": "b32toString(bytes32)", +"5c8b94e7": "applyWithdraw(address,uint256,uint256)", +"5c8c02b3": "getWinnerById(uint256)", +"5c8cb8c0": "DBIPToken(uint256)", +"5c8cf750": "cancelTransaction()", +"5c8d1a6b": "setAtomMoth(uint256,uint64)", +"5c8e7376": "stageEco()", +"5c8f66f3": "getMinAuditPriceLowerCap()", +"5c8fe438": "books()", +"5c908ee5": "DawnX()", +"5c90b9a8": "createRequest(address[3],address,uint256[12],uint256,bytes)", +"5c919aa3": "getDemurrageableBalance()", +"5c91cdfa": "createPenguin(string,uint256,uint256)", +"5c91fa67": "test_3_assertGasUsage200Boards()", +"5c92abfd": "GameVerified(bytes32)", +"5c92e2f6": "castCommit(uint256,uint256[],bytes32)", +"5c9302c9": "currentDay()", +"5c9442a1": "addAdminList(address[])", +"5c97404a": "domainPrice()", +"5c975abb": "paused()", +"5c978499": "checkValidityOfBalance()", +"5c979fe4": "setRegistrar(uint256,address)", +"5c97efd6": "updateIcoStartTime(uint256)", +"5c97f464": "WNTOToken()", +"5c9920fc": "vaultClosed()", +"5c9a7a8b": "getCarType(uint256)", +"5c9b62b4": "comprarSala()", +"5c9c5a6f": "checkGameIndex()", +"5c9cc81f": "getFundDetails(address)", +"5c9d0fb1": "CROWDSALE_ALLOWANCE()", +"5c9d4528": "mainCapInWei()", +"5c9fa6ad": "bidSpread(bytes32,bool,int32)", +"5ca11c34": "minSalePrice()", +"5ca177cb": "LINK(uint256)", +"5ca1bad5": "CallScheduled(bytes32)", +"5ca1c5a0": "getNodeValue(bytes)", +"5ca1cacc": "changeMinEth(uint256)", +"5ca1e165": "getRoot()", +"5ca20102": "_checkPixelUnderRight(uint256)", +"5ca21490": "BitMilleCrowdsale()", +"5ca26ff9": "updateGuPhrase()", +"5ca3400c": "WithBeneficiary(address)", +"5ca3bf76": "setSendErrorValue(address,uint256)", +"5ca48d8c": "tokensLocked(address,bytes32)", +"5ca4d4bb": "disableScriptExecutor(uint256)", +"5ca5b054": "metherToken()", +"5ca5b334": "enableManager(address)", +"5ca6fa4a": "Nostradamus()", +"5ca7f2f0": "LivepeerVerifier(address,address[],string)", +"5ca81139": "createOnDay(uint256)", +"5ca86447": "put(address,uint256,uint256,uint256,uint256)", +"5ca8bc52": "returnIt()", +"5ca8e2ad": "ModultradeStorage()", +"5ca91d7f": "faddress(address)", +"5caa0dec": "currentSeries()", +"5caaa536": "confirmReference(address,uint256,uint256)", +"5caabecf": "transferFromWithReservingNet(address,address,uint256)", +"5cac0176": "MJT()", +"5cac79b2": "LockedCrowdSale(address)", +"5cac8b27": "amazing()", +"5cacd319": "nfcDetails(bytes32)", +"5cacdf29": "testChickenCnt()", +"5cad249c": "getLastWinNumber()", +"5cad7cfb": "getCrowdsaleStatus()", +"5cade372": "payAllOut()", +"5cae7767": "removeTrustedPartner(address)", +"5caed029": "tokenDecimal()", +"5cafbafb": "newMember(address)", +"5caff1a7": "Criptolira()", +"5cb047e8": "toInt(bytes,uint8,uint8)", +"5cb0887c": "contractExists(address,address)", +"5cb0c16f": "totalInCirculation()", +"5cb10016": "offchainSale(address,uint256)", +"5cb1470e": "_createRabbitInGrade(uint256,address,uint8)", +"5cb18a6d": "fipsLegacyRegisterMulti(bytes20[],address,bytes)", +"5cb24756": "unitEthWei()", +"5cb2d86e": "totalBlockContribution(uint256)", +"5cb2ffb5": "updateMinCapEthOnce(uint256)", +"5cb318bf": "unregisterUser(address,address)", +"5cb3ce15": "calculateMemoryState(uint256)", +"5cb4502c": "SCORE_TO_WIN()", +"5cb4f548": "partnerInfo(address)", +"5cb5de63": "recReward(uint256,uint256)", +"5cb603dd": "_getYearIndex(uint256,uint256,uint256)", +"5cb7226d": "prePreIcoStartAt()", +"5cb732be": "refundToken()", +"5cb7dd98": "BlueChipGame()", +"5cb85cd2": "changeCost(uint256)", +"5cb8dd09": "isAllowed(address,bytes32)", +"5cb92dc7": "_enableRefunds()", +"5cb9ceaa": "okAddress(address,address)", +"5cba658f": "setState(address[],uint256[],address,uint256)", +"5cba6caa": "notarizeHash(uint256,string,string,bytes32,string,string,string)", +"5cbaa74b": "canAttack(address)", +"5cbad0b5": "sumHardCapICOStage1()", +"5cbb122c": "transferBctToken(address,uint256)", +"5cbb2ac3": "purchaseTokenPointer()", +"5cbb7caa": "getFriends(address)", +"5cbbdfc9": "currentApplicationEntityAddress()", +"5cbc65b2": "getplayersurplus()", +"5cbc85d0": "returnBounty(uint256)", +"5cbcb302": "pre_ico_allocation()", +"5cbdf177": "emailVerified()", +"5cbe5f8f": "DIV_DIST()", +"5cbee9ba": "releaseLockedTokens(address)", +"5cbf0850": "BTN()", +"5cbfdd8d": "preBuy(address,uint256,bool)", +"5cc15001": "getContent(bytes32)", +"5cc18780": "StabilizationFund()", +"5cc1ad7f": "toTileId(uint8,uint8)", +"5cc2e6aa": "getFirstAuctionsRemainingDuration()", +"5cc2f6d8": "_processPurchaseInWei(address,uint256)", +"5cc3623a": "currentSection()", +"5cc373c7": "TestJ()", +"5cc39659": "preSaleBonus2Amount()", +"5cc3c951": "purchase_with_dai(uint256,address,uint256,uint256,uint256,address,bytes)", +"5cc3f5d7": "Deauthorization(address,address)", +"5cc41dad": "initiateCertificate(bool,string,uint256,uint256,uint256,uint256)", +"5cc422a1": "sumofsquares(uint256,uint256)", +"5cc501ce": "testFailSetNotTransferableNotOwner()", +"5cc52fba": "claimTokensBC(uint8)", +"5cc53bc7": "matchOpponents(uint256)", +"5cc57501": "_computeHeight(uint256,uint256,uint256)", +"5cc5c5cf": "jackpotDifficulty()", +"5cc5ca50": "formulaContract()", +"5cc8a6ed": "PRE_SALE_4WEEK_BONUS()", +"5cc8ce33": "dev_settledBalance()", +"5cc95422": "getVestingReleasedAmount(address,address)", +"5cca3905": "getDeveloperMiningPowerForGameId(uint256)", +"5ccb4f8f": "UmbrellaCoin()", +"5ccb5460": "ethInvestedDuringICO()", +"5ccb54c4": "BGD()", +"5ccbddeb": "IcelandvsCroatia()", +"5ccc3eaa": "roundMoneyUpToWholeFinney(uint256)", +"5ccd2f9b": "_deleteAllPackedRevisionBlockNumbers(bytes20)", +"5cce7dbb": "removeHolderAddress(bytes32,address,address)", +"5ccee1de": "newValidatorSet()", +"5ccf49ed": "isGenome()", +"5ccf9f43": "BonusCrowdsaleMock()", +"5ccfe157": "getDataById(uint8)", +"5cd03621": "periodRound()", +"5cd03a3f": "removeIdArrayItem(address,uint256[],string,address)", +"5cd137b4": "LogDonation(address,string)", +"5cd27e8d": "init3(int256[],int256)", +"5cd2f4d3": "approve(address,bytes32)", +"5cd31795": "HavenToken()", +"5cd31e83": "LastWillContract(address,address[],uint8[])", +"5cd3b917": "numberOfDeployedTokens()", +"5cd3f3a1": "decompress(bytes)", +"5cd42150": "KY8000Token()", +"5cd45e61": "getUuidsSize()", +"5cd48caa": "bet(uint256[],address)", +"5cd50b3f": "quater2()", +"5cd60dad": "add(address,int256)", +"5cd689e6": "sell_label(address,uint256)", +"5cd6bd0e": "getPlayerDividendByStage(uint256,uint256,address)", +"5cd72340": "SetEpochData(address,uint256,uint256)", +"5cd72b15": "setAllowedMultivest(address)", +"5cd7815b": "testInternalCall()", +"5cd7c8bc": "createLastDay()", +"5cd7d478": "isYesWinning()", +"5cd82ee5": "Act()", +"5cd85187": "MIN_ETHER()", +"5cd87c71": "supportsTradingPair(address,address)", +"5cd8d2ad": "buyAndTransfer(uint256,address,address)", +"5cd925cd": "assetSize()", +"5cd96091": "enable_refunds()", +"5cd9814f": "Mybalance()", +"5cda31dd": "GTN()", +"5cda4b41": "checkApproval(address,address)", +"5cdaab48": "previousEpoch()", +"5cdb0798": "burnMemberToken(address)", +"5cdb1bd7": "setRefundPercent(uint256)", +"5cdb88bc": "addClaim(string,string,uint256,string)", +"5cdbd2d1": "Constructor(string)", +"5cdc9eda": "peggedETHUSD()", +"5cdcf33d": "milieurs_per_eth()", +"5cdd7560": "STEToken()", +"5cdd95e3": "MintableToken(uint256,address,bool)", +"5cddb74b": "becomeShitClonelord()", +"5cddd93d": "referalsMinInvestLimit()", +"5cde15b9": "_Application(bytes32,uint256,string)", +"5cde871e": "_depositOrderBalance(uint256,address,address,uint256)", +"5cdf3450": "changeParticipationLimits(uint256,uint256)", +"5cdf76f8": "setServiceFee(uint256)", +"5cdfcd69": "car_expense(uint256)", +"5cdfd08c": "managementFees()", +"5cdfe733": "fastBuyBonus()", +"5ce1d810": "SmartN()", +"5ce22019": "getEtherInContract()", +"5ce2fea1": "CleosContract()", +"5ce308a7": "addEntry(string,string)", +"5ce32aca": "getAirdrop(bytes32)", +"5ce398c4": "Riddle()", +"5ce3dec1": "self_destruct()", +"5ce49fbf": "amountBets()", +"5ce4f8dc": "PoWHrGlass()", +"5ce57b50": "setPenalizedStatus(uint256,address,bool)", +"5ce5ba9b": "queryParent()", +"5ce62aa4": "checkStoredFile(address)", +"5ce7514e": "allowPublicWithdraw()", +"5ce75c7c": "PRESALE_SECOND_DAY_START()", +"5ce7c7e0": "tokenSetCrowdsaleManager(address,address)", +"5ce800ac": "user_off_freeze()", +"5ce8050f": "BuildCoinUtilityToken()", +"5ce83f70": "updateEndsAt(uint256)", +"5ce885ee": "initial_withdrawal(uint256)", +"5ce94328": "balanceOf(uint152)", +"5ce97dbb": "totalAirdrop()", +"5ceaa0bf": "modifyCurrentHardCap(uint256)", +"5ceb8bc8": "isPromoPause()", +"5cebcbf0": "setMaxGamePerBlock(uint256)", +"5cec2054": "dteamVaultAddr1()", +"5cec4cb9": "fundsTokensHaveBeenMinted()", +"5cec5ded": "balanceComisionOf(address)", +"5cecd728": "setWillContents(address,bytes)", +"5cedff32": "takeTokensForBacking(address,uint256)", +"5cee9ea7": "buyNew(uint256,uint256,uint256)", +"5cef51a6": "BdpDataStorage(bytes8)", +"5cf00394": "getResoPeriod()", +"5cf054f8": "SetRewAddr(address)", +"5cf0769c": "ETHERCOIN()", +"5cf1469d": "addPayout(uint256,string)", +"5cf28fa4": "minDai()", +"5cf29ecf": "forOwner()", +"5cf2befc": "getEthAddressesLength()", +"5cf2f261": "ProofOfBitconnect()", +"5cf3125c": "NASDAQ()", +"5cf34bcf": "getMinFee()", +"5cf3508a": "whiteListControllerAddress()", +"5cf38f24": "togglePlotBlockedTag(uint256,bool)", +"5cf3cd96": "payNode(bytes32,bytes32)", +"5cf3d346": "names(address)", +"5cf469ca": "tokenPreSaleCap()", +"5cf4ee91": "getPrice(uint256,uint256)", +"5cf5ad2e": "registerNameCore(uint256,address,uint256,bytes32,bool)", +"5cf5e386": "guardian2()", +"5cf6040b": "ERC20Token(uint256,uint8,string,string)", +"5cf6208a": "oraclizeTimeTolerance()", +"5cf625f0": "OffChainManagerImpl(address,address)", +"5cf6a536": "InternetWall()", +"5cf6a763": "receiveApproval(address,int256,address,bytes)", +"5cf858aa": "TOKEN_ESCALE()", +"5cf89f1e": "setDateRelease(uint256)", +"5cf8ca60": "isCase(uint256)", +"5cfa353a": "updateTotalGasCost(uint256)", +"5cfae3ba": "UNPC()", +"5cfaf2ef": "setNameTAOPositionAddress(address)", +"5cfb4aa4": "getMessageTimestamp(uint256)", +"5cfbcdbb": "committedEther()", +"5cfc1a51": "capacity()", +"5cfc53c1": "calculateForValue(uint256)", +"5cfc6432": "EcosystemPart()", +"5cfd5f89": "product4_pot()", +"5cfd8c24": "ResetPonzi()", +"5cfe237a": "TCGC(address)", +"5cfe585a": "calcDisputeEnds()", +"5cfea6fb": "TokensPerWei()", +"5cff876b": "carrotsCaught()", +"5d000c07": "getFreeFuck()", +"5d004e85": "getCommentsCountByAd(uint256)", +"5d01615f": "queryFusionData(uint256)", +"5d01b261": "_placeBet(uint256,address)", +"5d0213f7": "transferTokenOwnerShip(string,address)", +"5d029d1e": "indexedByTag(bytes32,uint256)", +"5d02b2f7": "hasPresaleEnded()", +"5d03147a": "ownership()", +"5d0341ba": "approvals(address)", +"5d036c8b": "payEther(address[],uint256[])", +"5d0413d1": "calculatePlotPrice()", +"5d04af9c": "iMMCoinbuyPrice()", +"5d064bab": "MoreGainCoin(uint256,string,string)", +"5d068051": "sendFees(address)", +"5d06a05c": "lockupAccounts(address[],uint256,uint256)", +"5d0792b7": "minimumInvest(uint256)", +"5d0808f2": "listedMartialsLength()", +"5d08225e": "getGidOfId(uint64)", +"5d088fc6": "changeRandomFight2DeathContract(address)", +"5d08c1ae": "salePaused()", +"5d09e625": "setMustSkipFee(address,address,bool)", +"5d0a740a": "GetSeries()", +"5d0a7628": "lockPresaleBalances()", +"5d0ad8d0": "testFail_set_owner_unauth()", +"5d0b4e5c": "isTradeFeasible(address,address,uint256)", +"5d0b6774": "counterFor(address)", +"5d0be9de": "softWithdrawRevenueFor(address)", +"5d0c0161": "IXCASHToken()", +"5d0cb15d": "TOKEN_SALE_SUPPLY()", +"5d0dd712": "bet_amount()", +"5d0e550a": "safetyModeOn()", +"5d0ef098": "burnUnsoldCoins()", +"5d0f4ee0": "isChampionAccount(address)", +"5d108ca2": "TokenChanged(address)", +"5d109aea": "maxResult()", +"5d10a60d": "createPost(string,string,bytes32)", +"5d113b03": "PayWinners(uint256,address)", +"5d121289": "addPreSaleEndDate(uint256)", +"5d123014": "setGameTax(uint8)", +"5d12ace4": "playGame(uint256,uint256,uint256)", +"5d12fc0c": "ONE_BILLION()", +"5d14076c": "lowercaseString(string)", +"5d145c5b": "setIcoTimeStartEnd(uint256,uint256)", +"5d14f925": "Invested(address,uint256,uint256,string)", +"5d15001e": "SupplyOp(uint256,uint256,uint256)", +"5d15b46a": "emitSkillCategoriesSet(address,uint256,uint256)", +"5d161310": "DataMining()", +"5d161c3f": "useAbility(uint256)", +"5d16a6f9": "lockedBalances(address,uint256)", +"5d16b8de": "take_back_money()", +"5d183b60": "supplyRound2()", +"5d184107": "AddCategory(string)", +"5d19212e": "markUserAsFounder(address)", +"5d19606e": "transferIssuer(uint256,address)", +"5d19a99f": "isLimitReached()", +"5d1a3b82": "getOutcome(bytes32)", +"5d1b45b5": "getEntityCount()", +"5d1b56c4": "TestUser(address,address,address,bytes32)", +"5d1bd962": "getArrayValue(uint256)", +"5d1be4e5": "deathData_f14()", +"5d1be58e": "pecunioToken()", +"5d1c01e0": "signedApproveAndCallCheck(address,address,uint256,bytes32,uint256,uint256,bytes32,address)", +"5d1c3171": "luck()", +"5d1c985b": "setReceivers(address,address,address)", +"5d1ca631": "getId()", +"5d1ce03f": "tokensRaisedDuringRound(uint8)", +"5d1e2d1b": "split(address,uint256)", +"5d1edfa0": "checkContributedETH(address)", +"5d1f8098": "RoshaanCoin()", +"5d200f84": "GetPlayer(uint256)", +"5d201596": "getCategoryInfo(address,uint256,uint256)", +"5d202249": "totalCollectedETH()", +"5d204869": "slice(bytes,bytes,uint256,uint256)", +"5d208872": "setTimesEnabled(uint8,bool)", +"5d216562": "changeLockTransfer(bool)", +"5d2195dc": "getToBalance(uint256)", +"5d2230d7": "numfails()", +"5d2247a5": "stakeAirdrop(uint256,bytes)", +"5d228eb0": "getProviderDetailFields(uint256)", +"5d22a352": "manualWithdrawToken(uint256)", +"5d22e222": "BTCAir()", +"5d2392d6": "latchContract()", +"5d239d3e": "getSlice(uint256,uint256)", +"5d240c58": "addExperience(uint256,uint256)", +"5d2434ec": "transferFromTangibleassetdisbursementfund(address,uint256)", +"5d25cccc": "createVesting(address,uint256,uint256,uint256,uint256,bool,address,uint256)", +"5d25d021": "withdrawForeignTokensMultiple(address,address[],uint256)", +"5d267042": "PointlessToken()", +"5d268629": "Refund()", +"5d2694da": "BlackPearlETH()", +"5d270cdc": "setExpectedRate(address)", +"5d272468": "isLiquid()", +"5d27976a": "Final(string,string,uint8)", +"5d27bff3": "registerWithEncryption(string,string)", +"5d27e9a6": "SEPARATOR()", +"5d281384": "_isValidSignatureAndMethod(address,address,bytes)", +"5d285eca": "preICOspecial()", +"5d29206b": "createTokenEscrow(address,uint256,address)", +"5d293581": "ApplyForCertification(string,string,string,string,uint256)", +"5d2946f5": "futDevAddr()", +"5d295f67": "maxDGAME()", +"5d2973cd": "applyVIPLevel(address,uint256)", +"5d29bd40": "rollThree(address,uint8,uint8,uint8)", +"5d2a5d3d": "sentPreSaleTokens()", +"5d2a70a8": "getActualFee()", +"5d2a9b6a": "_randomIndex(uint256,uint8,uint8,uint8)", +"5d2aa757": "getSides(string,uint256)", +"5d2b811d": "getLastRegisterDate()", +"5d2bafed": "gee()", +"5d2c0af2": "Invest(address,bool,uint256,uint256,uint256)", +"5d2c53a7": "withdraw_funds(uint256)", +"5d2cce82": "LemonsDroppedToTheWorld()", +"5d2d5c37": "registered(string)", +"5d2dc5fa": "FraCoinAuct(string,uint256,address)", +"5d2dec87": "PRNG(address)", +"5d2fea9d": "reissuedTransactions(uint256)", +"5d302ba1": "UpgradeAgentEnabledToken(address)", +"5d306f34": "getRefundAmount(address)", +"5d307c6f": "giveToVoter(uint256,uint256)", +"5d3171d9": "transferFromPrivileged(address,address,uint256)", +"5d31c3bc": "deliveryApprove(address)", +"5d3235bd": "NutrioCoin()", +"5d3278f0": "LooneyFifty()", +"5d337b01": "largeSize()", +"5d3458ea": "DolToken()", +"5d346bd6": "addSaleOwner(address)", +"5d34b70c": "LavaDeposit(address)", +"5d354b4d": "foundingTime()", +"5d355804": "endPtopDeposit(address,address,bytes32)", +"5d359fbd": "transfer(address,uint64)", +"5d35a3d9": "approve(uint256,uint256)", +"5d3601d2": "_isRegularAddress(address)", +"5d36a791": "PartyToken()", +"5d36d182": "recycle(address,uint256)", +"5d37c840": "level_4_amount()", +"5d383eaa": "registerTokenPayment(address,uint256)", +"5d385031": "getCustomerTxOrigMcwTransfer(address,bytes32)", +"5d3899af": "place_to_push(uint256,bytes32)", +"5d397767": "publicBattlepm1()", +"5d3a08d7": "setNodePhases(address)", +"5d3a1f9d": "setText(string)", +"5d3a5e3b": "teamTokenAddress()", +"5d3a70f9": "YayyyToken()", +"5d3aac49": "PublishInterfaces()", +"5d3afb19": "CNYB()", +"5d3b2f37": "getNextGameId(address)", +"5d3bb19e": "XXXXXXXX09()", +"5d3c1d4c": "_getRequest(uint256)", +"5d3c7c9b": "AGASCrowdsale()", +"5d3c81a5": "feeWithdrawTokenAmount(address,uint256)", +"5d3ca4ab": "lotteryReinvest(string,uint256)", +"5d3cd79f": "endPrivateICO()", +"5d3d08a8": "cancelExchange(uint256)", +"5d3e64bf": "ttlPlayers()", +"5d3f4fe4": "withdrawMyTokens()", +"5d3fdd19": "updateDiscount(uint256)", +"5d40124e": "YunJiaMi(address,address,address,uint256,uint256,uint256)", +"5d40533f": "AnemoiToken()", +"5d40c0ae": "createAccessorySeries(uint8,uint32,uint256)", +"5d41363f": "rateRound1()", +"5d416cc2": "setIsTokenCanBeBuy(bool)", +"5d41dd6f": "ExampleToken(address[])", +"5d42513b": "test_withdraw()", +"5d428e08": "addTrader(address)", +"5d4293a0": "hatchPoohs(address)", +"5d439cf3": "transferEvent(address,address,uint256)", +"5d43e769": "batchTransfer(uint256,uint256[])", +"5d444ffb": "minMintingPower()", +"5d4453ba": "getGuess(address,uint8)", +"5d449d7d": "refererFeePercent()", +"5d44b508": "calculateRewardToWithdraw(uint32,address,address)", +"5d450bab": "setJobRating(address,uint8,uint256)", +"5d451a9a": "Wallet8()", +"5d4521dd": "updateWeedTotal(uint256,uint16)", +"5d452201": "ico()", +"5d4559ca": "get_coins_count()", +"5d45b4a7": "increaseMonthlyTransactionVolumeSending(uint256)", +"5d461de5": "sendAmount(address,uint256)", +"5d4626f6": "getInvoiceStatus(bytes32)", +"5d468d38": "releaseAuctionEnded(uint256)", +"5d469b74": "redeemUnderlyingInternal(uint256)", +"5d47762d": "Member_AssingTokensToProject(uint256,uint256)", +"5d47f4f2": "CanHandleAuth(address)", +"5d484e17": "StaticEthAvailables()", +"5d485e5d": "_hostContent(address,bytes32,string,string,string)", +"5d495aea": "pickWinner()", +"5d49705b": "getEmployer(address,uint256)", +"5d49719d": "SHA3_512()", +"5d49c199": "finishPreSale2()", +"5d4a8f74": "ATTRToken()", +"5d4aaf1c": "registerWithUserAgreement(address,bytes32)", +"5d4befc0": "emitSynthAdded(bytes4,address)", +"5d4c5cca": "participantsForPreSale(address)", +"5d4d061e": "keyValueStorage()", +"5d4dda72": "DirectInput()", +"5d4e1e5c": "substract(uint256,uint256)", +"5d4f012b": "tgeCurrentStage()", +"5d4f30e7": "get_address(address)", +"5d50601b": "getsumdata1(bytes32)", +"5d506a2e": "minPotSum()", +"5d51b550": "haltCrowdsale()", +"5d52fe64": "buyRemaining(address)", +"5d54322d": "canPurchase(address,uint256)", +"5d5483b3": "WatchAppliedFeePercentage()", +"5d54cb1f": "is_transfer_allowed()", +"5d54e612": "whitelistAll()", +"5d552c72": "BasicToken()", +"5d5576f8": "renounceCapper()", +"5d56550a": "buyCore(address,uint256,string)", +"5d5655dd": "BOOKIE()", +"5d567259": "bobMakesErc20Deposit(bytes32,uint256,address,bytes20,address,uint64)", +"5d56e0a4": "developerMiningPower()", +"5d57135a": "KEBABER_TO_MAKE_1KEBAB()", +"5d582870": "requestInvestment(uint256,uint256,address)", +"5d585176": "GolemSupply()", +"5d586bfd": "deposit(string,address,uint256,string)", +"5d59072a": "OFFICAL_VOTING_DAY_OF_MONTH()", +"5d593462": "init(address,address,string,string,uint256,uint256)", +"5d5a1614": "STQCrowdsaleTestHelper(address[],address,address,address)", +"5d5aa277": "tokenSaleContract()", +"5d5b35f3": "dividendsTotal()", +"5d5b82fd": "Blockjack(address,address)", +"5d5b9021": "acceptTradeOffer(uint256)", +"5d5b92b1": "teamOneSharePrice()", +"5d5bc4cb": "BetOnRed()", +"5d5c3011": "ctyCoin()", +"5d5c606f": "DAOPolskaTokenICOregulations()", +"5d5d4fab": "TACTICALCRUISER_EXTRACTION_BASE()", +"5d5e22cd": "transferFromWithSender(address,address,address,uint256)", +"5d5e507b": "create_price()", +"5d61dd5a": "removeSingleAddressFromWhitelist(address)", +"5d62917b": "pickWinners(uint8,address,address,address,uint8,uint8,uint8)", +"5d63b758": "minAcceptedETH()", +"5d63b77c": "divideSafely(uint256,uint256)", +"5d644069": "request_face_proof(string,address)", +"5d6470a4": "STAGE_1_TIME()", +"5d64aa68": "dragonIndexToOwner(uint256)", +"5d651b62": "TimeLockSendCreated(address,address,uint256,address)", +"5d6542af": "way()", +"5d65432d": "IndorsePreSale()", +"5d65c37b": "Assessment(address,uint256,uint256,uint256,uint256)", +"5d666d3c": "getRurus(string)", +"5d667464": "usePrecompiledContracts(bytes32,uint8,bytes32,bytes32)", +"5d66ccf0": "updatePerSell(uint16,uint256,bool)", +"5d66d73f": "notarizeHash(uint256,string,string,uint256,bytes32)", +"5d671fc0": "switch_period()", +"5d6720b4": "getFreeMineral(address)", +"5d67830a": "doLogFighter(uint32,uint256,uint256)", +"5d685185": "periodITO_softCapInWei()", +"5d68564e": "ZontoToken()", +"5d6952d7": "changeSaleStartBlock(uint256)", +"5d69864e": "Bitscors()", +"5d69d600": "presold()", +"5d69f16f": "offerAsSacrifice()", +"5d69f68c": "getVotersName()", +"5d6af2af": "getOffChainRootAddress()", +"5d6b2f26": "destroyAllTokens()", +"5d6b70ae": "getSignedTable()", +"5d6b7798": "BCQ()", +"5d6c3ea7": "mined_coin_supply()", +"5d6c8e10": "getDHash(bytes13)", +"5d6cb67e": "ecosystemTokenSupply()", +"5d6cdfae": "EthereumPot()", +"5d6ceeb5": "returnMoneyToBuyers()", +"5d6d2992": "ownFiles(address,string,string)", +"5d705fe2": "MBCashSupply()", +"5d711db1": "get_candidates()", +"5d718818": "getHolderCountryCode(bytes32)", +"5d71cf46": "spendableAllowance(address,address)", +"5d723298": "PartialPayment(address,address,uint256)", +"5d728582": "hasAuthoritySignedSideToMain(address,bytes)", +"5d72b30d": "changePlayerName(uint256,string)", +"5d73e2bf": "startPlay(bytes32,uint8,bytes32,bytes32)", +"5d740d62": "YFJToken()", +"5d751443": "updateWebappMinBalance(uint256)", +"5d760b45": "forceWithdrawPayments(address)", +"5d766d35": "INITIAL_GLOBAL_DAILY_SUPPLY()", +"5d76a039": "PresaleReStarted()", +"5d771933": "BOUNTY_SUPPLY()", +"5d777893": "GetPlayers(uint8)", +"5d77aec8": "receiver3()", +"5d77d8d0": "getBlacklist(address)", +"5d78650e": "getAccountData(address)", +"5d796c05": "mintAuditCancel(address,address)", +"5d79eda7": "Digixbot(address)", +"5d7a6b10": "nextDerivativeTokenScheduled()", +"5d7b0758": "controllerMint(address,uint256)", +"5d7c3ad2": "ICO(address,address,uint256,uint256,uint256)", +"5d7c3b78": "costructor()", +"5d7c829d": "_messageToRecover(address,uint256)", +"5d7cf3e2": "Meltdown(uint256)", +"5d7e6b8d": "Schengencoin()", +"5d7e7219": "setFeeFor(address,uint128[2])", +"5d7e8c15": "ethToCents()", +"5d7e994a": "RewardStart()", +"5d801ec4": "SetmaxTokens(uint256)", +"5d80effc": "TimeBonusPricing(uint256[])", +"5d80f643": "Kujira()", +"5d818e6b": "recordDeal(uint256,address,uint32,uint32,bool,uint256)", +"5d81b206": "P3NGCT_v1(uint256,string,string)", +"5d8214db": "lastFactChangeValue()", +"5d8227e6": "FactoryBase(string,string,string)", +"5d82ddc8": "freezeEnabled()", +"5d8302f2": "CrypTollBoothToken(uint256,string,uint8,string)", +"5d831ca1": "FUT5()", +"5d8749ed": "workStages(uint256)", +"5d878b4f": "isInWhitelist(uint256,address)", +"5d88383e": "retrieveEth(address,uint256)", +"5d891d12": "foundersTokensWalletMaster()", +"5d895dac": "parse(string,uint256)", +"5d89c01a": "getCatIds()", +"5d8a776e": "award(address,uint256)", +"5d8aef9f": "_calculateLockedBalance(address,uint8)", +"5d8bc2a8": "assertEq12(bytes12,bytes12,bytes32)", +"5d8c5b87": "orderPlace(address,bool,uint256,uint256)", +"5d8ca2ac": "getApprovalsFor(address)", +"5d8d1585": "getUserInfo()", +"5d8d2904": "setKeyPermissions(bytes32,bool,bool,bool)", +"5d8d4415": "rawUseName(bytes32)", +"5d8dd304": "founderTokensAvailable()", +"5d8e0c2c": "isManualTradingAllowed()", +"5d8e7376": "DAOBalanceSnapShot()", +"5d8e772f": "gameCore(uint256,uint256,uint256,bytes32)", +"5d8f2640": "store(bytes32,bytes32,bytes32)", +"5d8f3b76": "createPercentageRequest(uint256)", +"5d90df32": "TRONIX()", +"5d9169f0": "ICO(address,address,address,address)", +"5d91e27b": "MVM24PeriodsCapUSD()", +"5d92e5d2": "ipyh()", +"5d946afa": "trashed(address)", +"5d94e35c": "contractRefundStarted()", +"5d94f108": "platformLogout(address,uint256)", +"5d956b3e": "changeGroveAddress(address)", +"5d95738b": "vHasVoted(uint256,address)", +"5d95a08b": "MizuCoin()", +"5d969f8f": "updateCustomerACC(address,address,address)", +"5d96ec65": "setAdministrator(address,string,bool)", +"5d975d70": "mx(bytes32)", +"5d977c02": "withdrawalFor(uint256,uint256)", +"5d9796eb": "WELTCOIN()", +"5d989a0c": "NyronChain_Crowdsale()", +"5d98d9ee": "ChannelCreated(string,address)", +"5d98fd9f": "Presale(address,address)", +"5d990791": "getDenominationByIndex(uint256)", +"5d99e02f": "myPinerTokenTest1()", +"5d9adc94": "withdrawPendingTransactions()", +"5d9c4f0f": "getFeeRecipient(address)", +"5d9d595c": "sendWingsRewardsOnce()", +"5d9d5b9a": "CreatedCAT(address,uint256)", +"5d9d8dd9": "makeupShiny(uint256)", +"5d9dacb5": "OPEN_VOTE_PERIOD()", +"5d9ec210": "signTransaction(uint256)", +"5d9fa6fc": "getContractBal()", +"5d9fd8b0": "listPersons()", +"5da01a5b": "configure(bytes32,bytes32,uint256,uint256,uint256,address)", +"5da03ff8": "EthergotchiOwnershipV2(address)", +"5da05e2e": "setCoinLimit(uint32)", +"5da08c42": "createSeedTeam(uint8,uint256[9],uint256[9])", +"5da0a987": "Run()", +"5da12d50": "Oduwacoin()", +"5da24f90": "closeTimer()", +"5da34093": "bonusRemain()", +"5da3d3d2": "minHEXCap()", +"5da47721": "getVIPLevel(address)", +"5da4a1d3": "setPercentage(uint256)", +"5da54cee": "DragonCrowdsale()", +"5da5a9b1": "ownerUpdateMinMaxNumber(uint256,uint256)", +"5da5f5ab": "Distribution()", +"5da6628a": "transferExt(address,uint256)", +"5da6bf67": "movePlayer(uint8[176],uint8,uint8,uint8)", +"5da6c04d": "getFeesOwedToOperator()", +"5da6c418": "burnMintFrom(address,uint256)", +"5da6e035": "_openAndJoinCDPWETH(uint256)", +"5da6ec5b": "t8exToken()", +"5da85a16": "setCEx(address)", +"5da888aa": "ChainKeyToken()", +"5da89ac0": "weiRefunded()", +"5da96520": "transferTeam2Tokens(address,uint256)", +"5da9781b": "readUint256s(bytes32[])", +"5da99f5e": "upgradeCardDamage(uint256)", +"5daa0c37": "referrerLinkedSales(bytes32)", +"5daa87a0": "Initialized()", +"5daab236": "runIco()", +"5dab2e0f": "left82(uint256)", +"5dac1601": "SimpleStablecoin()", +"5dac48bb": "approvePreSignedHashing(address,address,uint256,uint256)", +"5dac5682": "removeAuthorization(address,address)", +"5dac7044": "checkHardCap(uint256)", +"5dacf084": "THACO2()", +"5dada964": "expectedRateContract()", +"5dadf485": "takePosition(uint256)", +"5dae4e50": "makeItRain()", +"5daf08ca": "members(uint256)", +"5daf7514": "redeemTokens(uint256,uint256,bytes32[])", +"5daf8a71": "DestroyToken(uint256)", +"5db07aee": "mintFeeDenominator()", +"5db09db5": "getSplitPotAsFixedPointForGameId(uint256,bool)", +"5db17dab": "CDTToken(uint256)", +"5db2a233": "awailableDividends(address)", +"5db30bb1": "getMaxTotalSupply()", +"5db38c63": "nDemocs()", +"5db39a1e": "totalFails()", +"5db39d74": "HayaCoin()", +"5db3f963": "registerSimple()", +"5db3ffa5": "getUBetCheck(address,address)", +"5db42841": "createContractGameItem(string,uint256)", +"5db46961": "proxyExchange(address,uint256,string,bytes32)", +"5db4cd21": "ir()", +"5db524ad": "finishDividends()", +"5db5301f": "unsubcribe(address)", +"5db5d1fb": "startTimeTLP2()", +"5db5fc24": "alterInitialPricePerShare(uint256)", +"5db62dab": "getBalanceForUser(bytes32)", +"5db6687b": "Dev_TokenReleased()", +"5db6a31f": "transferBroker(address,uint256,uint256)", +"5db7ef3d": "intoverflow_mul(uint256)", +"5db8e202": "evaluateProposalAction(uint256)", +"5db8f084": "getNeighbourReward()", +"5dbb0ef8": "TuZaiCoin(uint256,string,uint8,string)", +"5dbbd139": "CentraSale()", +"5dbbfc47": "getMaxLoss(address)", +"5dbc374f": "UBCoin()", +"5dbe47e8": "contains(address)", +"5dc10a45": "whitelistMultiForTier(uint256,address[],uint256[],uint256[])", +"5dc11a89": "setNumTicks(uint256)", +"5dc1ba1b": "closeLotteryAndPickWinner()", +"5dc1bb52": "removeLocked(address,uint256)", +"5dc1c79d": "KANYE()", +"5dc2157d": "getBalancesOfAddress(address)", +"5dc22cce": "attackPlayer(address)", +"5dc2944a": "ratesForCurrencies(bytes4[])", +"5dc3d02d": "rc5()", +"5dc43f6e": "AddAuthority()", +"5dc49bf8": "SellENSCreated(address)", +"5dc4d8a6": "proposalTarget(uint256)", +"5dc4dcd1": "TicketPurchased(address,uint256,uint256,uint256,uint256)", +"5dc54308": "KickSportsManager()", +"5dc5aefe": "startIncentiveDistribution()", +"5dc6bfe4": "distributeLRN(address[],uint256)", +"5dc6f3df": "registerNameCore(uint256,address,bytes32,bool,bool)", +"5dc70cda": "_shareToPreviousOwner(address,uint256,uint256)", +"5dc774d7": "DrawingPrintToAddress(uint256)", +"5dc77e26": "andThen(string,address)", +"5dc824b9": "voteNoLock(address,uint256)", +"5dc86b85": "adminGetAmountAddressDial(address,address)", +"5dc94af6": "getTokensTotal()", +"5dc96d16": "burnEnabled()", +"5dca53d3": "right30(uint256)", +"5dcb6774": "_createBid(address,uint256,address,address,address,uint256,uint256)", +"5dcb71f2": "yoshicoin()", +"5dcb98c4": "CPO()", +"5dcbac7a": "registerBytes(address,bytes)", +"5dcbc01e": "addSellTokensRequest(string,string)", +"5dcbd8bb": "setLimit(uint16,uint64)", +"5dcc6dbc": "spawnAxie(uint256,address)", +"5dcd967d": "ndc()", +"5dcdddd1": "testSafeToAddFix()", +"5dce431b": "addGame(address,uint256)", +"5dce9948": "getTranscoder(address)", +"5dcf1b77": "fileMerkle(bytes32[],uint256,uint256)", +"5dcf451b": "CoinDogToken()", +"5dcf7c8c": "proxies(address,uint256)", +"5dd18a22": "setItemsNotForSale(uint256[])", +"5dd19463": "angelFoundationAddress()", +"5dd283cb": "pickSmallWinner()", +"5dd284e3": "getAllGoldTransactionsCount()", +"5dd39c12": "SOD()", +"5dd4599a": "usersCanTrade()", +"5dd48b04": "PURCHASE_PREMIUM_RATE()", +"5dd4a65f": "lookup(address,bytes32)", +"5dd588df": "isAuthorizedToTransferFrom(address,address,address)", +"5dd672ec": "latestBid()", +"5dd68acd": "setAddresses(address,address,address,address,address)", +"5dd68f36": "getTotalInvest()", +"5dd871a3": "canMint(uint256)", +"5dd8e1d5": "kek()", +"5dd8eb50": "rate4()", +"5dda837f": "mineBalance()", +"5ddae283": "transferRegistrars(bytes32)", +"5ddaf07f": "StarbaseToken(address,address,address)", +"5ddb2585": "icoStartTimestampStage4()", +"5ddb8a2e": "sendBonusTokens(address[],uint256[])", +"5ddbc632": "setHardCapToken(uint256)", +"5ddc98ba": "updateKYCWallet(address)", +"5ddd81b0": "firstPeriodCap()", +"5ddd8248": "setBurnerOwner(address,address)", +"5dddea66": "updateState(uint256,uint8,uint256)", +"5dde2066": "addBlocks(uint256,bytes,uint256[])", +"5ddf2998": "setOwnerValidatorAddress(address)", +"5de01497": "ownerWithdrawERC20Token(address,uint256)", +"5de047d3": "existPlatform(bytes32)", +"5de0e689": "startPromotion()", +"5de270c5": "adminFixCurve(uint32)", +"5de28ae0": "getStatus(bytes32)", +"5de2a21b": "onIncreaseApproval(address,address,uint256)", +"5de3ba97": "getAllIdentifiers()", +"5de40f30": "innerContract()", +"5de4381b": "_addItemToParent(bytes32,bytes32)", +"5de4c6fc": "lock(address,bool,uint256[],uint256[])", +"5de4ccb0": "upgradeAgent()", +"5de52fb7": "TakeMyEtherTeamAddress()", +"5de6dc55": "getTokensOfOwner(address)", +"5de6f040": "unlockFundrBal(bool)", +"5de7e350": "getTokensFromAddressEmits(address,address)", +"5de81534": "getEditionsCount(uint256)", +"5de910bc": "subSegmentation(address,uint256,uint256,uint256)", +"5de924bf": "DeepCoinToken()", +"5de97c8d": "setIntervalTimeAdjust(uint8)", +"5dea186c": "accept_relayed_call(address,address,bytes,uint256,uint256)", +"5dea19f5": "getHolderExternalIdByAddress(address,address)", +"5deab0ec": "grantLoanOwnership(bytes32,address,address)", +"5deb2cec": "fundsRecord(address,uint256)", +"5debb827": "SCFToken()", +"5debc7af": "get_tokenTime()", +"5dec18d4": "motto()", +"5dec74f8": "_finishTheBattle(uint256,uint256,uint256,uint8)", +"5dec7d49": "Transaction(bytes32,bytes32,address,bytes,bytes32,bytes32,address,bytes,bytes32,uint256,uint256,bytes)", +"5ded0235": "iRide()", +"5ded1865": "getCategoryProducts(address,uint256,uint256,uint256,uint256,uint256,bool)", +"5dedd9cc": "resetWinners(uint256)", +"5dee2492": "AIR_2_SUPPLY()", +"5deeab39": "freeTokensIssued()", +"5deeffb2": "getSoftcapReached()", +"5def5814": "getByDistrict(uint256)", +"5defaec6": "createVirtualAddress()", +"5defe3d9": "grantAccessDeposit(address,address)", +"5deff965": "getEtherum()", +"5df285c8": "getBonusTokens(uint256,uint256,uint256)", +"5df29b4f": "settleBetUncleMerkleProof(bytes20,bytes20,uint40)", +"5df2df2f": "multiSendTokenComplete()", +"5df34ff2": "buyMintingAddress(uint256,uint256)", +"5df350ee": "setStableCoinAddress(address,address)", +"5df3bdb9": "ABRATOKEN()", +"5df3d87e": "bet1()", +"5df58352": "calculateScoresIfCellIsBought(address,address,uint256)", +"5df5f96f": "initialize(address,uint256,uint256,uint256,uint256,address)", +"5df607f0": "getMyEntry()", +"5df60977": "updateFrozenAddress(address)", +"5df6461d": "LOTTERY_FUND_SHARE()", +"5df6a6bc": "unbond()", +"5df70904": "giveToken(address,uint256,bool)", +"5df73398": "loadMesaVerify(bytes32,bytes32[],uint8[])", +"5df75bdf": "totalTokensICO2()", +"5df8122f": "setManager(address,address)", +"5df86d29": "etherInContract()", +"5df8d74e": "bytesCallWithArray(bytes,bytes32[4])", +"5df8f17b": "createVote(uint256,address[])", +"5df93f99": "MICL()", +"5df95255": "Rating(address,address,int256)", +"5dfb94cf": "nextBurnFeeProp(uint256)", +"5dfc09a4": "getCurrencySymbol()", +"5dfc273c": "Cloudbric(address)", +"5dfc2e4a": "noop()", +"5dfc3459": "maxIncrease()", +"5dfd1bff": "MeetingTimeSetFailure()", +"5dfd3278": "VOTE_AGAINST()", +"5dfde910": "STELLARGOLD()", +"5dfed2bb": "setCompte_14(string)", +"5dfee9bb": "refundTokens(uint256)", +"5dffe6dc": "contrEntrance(address)", +"5e0055e7": "ThreeStarToken()", +"5e007742": "Propethy()", +"5e00a177": "revokeVesting(address,string)", +"5e00b9a9": "incompletePercent(uint256[3])", +"5e00bd96": "DoNotBloodyDeployThisGetTheRightOne()", +"5e00e7b2": "getNoContributors()", +"5e01b2e6": "Gobi()", +"5e01d395": "getCapAtTime(uint32)", +"5e01eb5a": "getSender()", +"5e01ed34": "associatedAddresses(uint256)", +"5e02b84d": "Voiptoken()", +"5e031606": "round2TokensRemaning()", +"5e03d0c6": "getCreationDateOfHistoricalMetadata(string,uint256)", +"5e03d393": "setAccountFrozenStatus(address,bool)", +"5e04672b": "approveSynthesizing(address,address,uint256)", +"5e047822": "fundOf(address)", +"5e047975": "recoverSigner(bytes,address,uint256,uint256,uint256)", +"5e05bd6d": "timestampFromDateTime(uint256,uint256,uint256,uint256,uint256,uint256)", +"5e05e84d": "buyCells()", +"5e068da5": "proxyVersion()", +"5e06911e": "SpecialTrained(uint256,uint256,uint256,uint256[2])", +"5e079aa5": "giveEthFundAddress()", +"5e07c354": "vestingTokens()", +"5e07f240": "shiftBitsLeft(bytes,uint256)", +"5e0842d7": "VEToken(uint256,string,string)", +"5e08f5fa": "setCGO(address)", +"5e0a6049": "LOG_newGasLimit(uint256)", +"5e0b1259": "end_block()", +"5e0b1597": "_unpackRatingValue(uint256)", +"5e0b4cb6": "setData_2(uint256)", +"5e0b5d9b": "changeStartAndEndTime(uint256,uint256)", +"5e0be607": "unlockAllTokens()", +"5e0be75c": "setDividendPayout(uint256,uint256)", +"5e0c8c8c": "getCountSales(uint256,uint256)", +"5e0c923a": "RinneganToken()", +"5e0d0f30": "krsUsd()", +"5e0e2118": "removeSignature(string,int256)", +"5e0e2957": "dumpOut()", +"5e0fac2e": "unlockedBalance(address)", +"5e0fec6a": "knownReserved()", +"5e0ff394": "setCompetitionAdmin(address)", +"5e10177b": "confirmDelivery()", +"5e101e51": "editionController(uint256)", +"5e1045ec": "addWhiteList(address[])", +"5e11544b": "newPeriod()", +"5e11dc0b": "openDistribution()", +"5e123ce4": "gameStarted()", +"5e131fa2": "removeLocker(address,address)", +"5e1372f4": "lockup(address,uint256,uint256)", +"5e159cd4": "LogOwnerRemoved(address,address,address)", +"5e15d642": "totalNumberOfTokensForSale()", +"5e1665f3": "SmartParkApp()", +"5e172fa3": "allowtransferaddress(address)", +"5e17580a": "setTime5(address,uint256)", +"5e1758fa": "addPermission(address,bytes32)", +"5e17b694": "promisedTokens()", +"5e17d423": "getBountyRate(address,address)", +"5e191293": "emitBoardRatingGiven(address,uint256,uint8)", +"5e1936d4": "testThrowSetNotTransferableNotOwner()", +"5e199157": "setWalletOut1(address)", +"5e199892": "forwardFee(uint256,address)", +"5e19b305": "isActive(uint32)", +"5e19d316": "clearICObyAddress(address)", +"5e19deda": "preCap()", +"5e1a01c3": "createAndJoinCDPAllDai()", +"5e1a6c17": "requesters(uint256)", +"5e1bd33e": "getBuildCost(int32,int32,bytes16)", +"5e1c8f89": "scoreOf(address,address)", +"5e1ce5b0": "phasePresale_To()", +"5e1d5482": "about()", +"5e1d7ae4": "changeFeeRebate(uint256)", +"5e1d832d": "giveChamp(address,uint256)", +"5e1d8cb7": "TextChanged(string)", +"5e1d9aba": "sanCurrentTotal()", +"5e1dca04": "shareholder1()", +"5e1e1004": "setPaymentAddress(address)", +"5e1e547d": "unsign(uint256)", +"5e1e5c88": "betByte()", +"5e1eabd2": "soldPerCurrentRound()", +"5e1f3fa8": "CREATE_REPO_ROLE()", +"5e1f56d9": "changeWalletOwner(address)", +"5e1f8b59": "_totalAssetSupply(uint256)", +"5e1fc56e": "close(uint64,uint256,bytes32,bytes32,bytes)", +"5e217162": "availableSTCDRTokensOF(address)", +"5e21f687": "getMarketID()", +"5e22a2fb": "getTokenIdByHash(string)", +"5e22b760": "buyDEV()", +"5e23464e": "TOTAL_REQUEST_TOKEN_SUPPLY()", +"5e24de11": "ownerSetCrowdsaleClosed(bool)", +"5e25495e": "getProviderSupply(uint256)", +"5e25f96d": "setYccContractAddress(address)", +"5e2642c9": "isInitialSupplied()", +"5e280e4e": "validateTransaction()", +"5e280f11": "endpoint()", +"5e29c47c": "walletCreatedTimestamp(address)", +"5e2a725c": "enableEmergencyBlock()", +"5e2bd421": "enableLogic(address)", +"5e2cb4f1": "BluToken()", +"5e2d13af": "addONG_AUDIT(bytes32,string,string,bool)", +"5e2d1f0d": "withdrawAfterTime()", +"5e2d285a": "GICTLock(address,uint256,uint256,uint256)", +"5e2d3798": "ETHERberry()", +"5e2dff7a": "foundersTokensLockedPeriod()", +"5e2e555f": "RogisterToVoteOnTransfer(address)", +"5e2ea5bd": "FIRST_PHASE_MAX_SPAN()", +"5e2ea799": "currentFlowerPrice()", +"5e2fe372": "getLastOrderIndex()", +"5e3013f1": "PlayX30()", +"5e3045c8": "getImpactTotalValue(string)", +"5e30b8a6": "refund(address,address)", +"5e30c961": "premium(address,address)", +"5e31005d": "scoreThresholdParams(address)", +"5e310670": "cancelTokenToEthOrder(uint32)", +"5e311cd7": "largestDonor()", +"5e318e07": "withdrawFees(uint256)", +"5e326b92": "setPreSaleStatus(bool)", +"5e331e62": "iterate_get(uint256)", +"5e33f94d": "ApolloSeptemCappedCrowdsale()", +"5e35359e": "withdrawTokens(address,address,uint256)", +"5e355dcc": "PJRToken()", +"5e3568b8": "session()", +"5e377b51": "Jackpot()", +"5e383d21": "values(uint256)", +"5e38ab4c": "BabyCoin(uint256,string,string)", +"5e38c77d": "getProductHistoryDate(bytes32)", +"5e393973": "get_contrib_arbits_max()", +"5e3b456c": "creatTokens()", +"5e3ba8ac": "usersGetter()", +"5e3bb4cc": "minimalSuccessTokens()", +"5e3bcaf7": "Fee(address[],string,uint8,string)", +"5e3cb7b0": "setTotalUsdAmount(uint256)", +"5e3cbb7c": "dayWithdraw()", +"5e3ced74": "callSurplus()", +"5e3d3b8a": "isPREICO()", +"5e3dbedb": "getTokenDescriptions(address,uint256[])", +"5e3df83f": "setFundingtokens(uint256)", +"5e3e2687": "transferFromParent(address,uint256,address,uint256,bytes)", +"5e3e37d1": "XfiniteAsset()", +"5e3e6092": "newService()", +"5e3e9158": "createWine(string,string,string,string,string,string,bytes32)", +"5e3fa843": "registerContract(string,bytes)", +"5e3fcbd1": "mintNewTokens(address,uint256)", +"5e402ae2": "getCurrentTokensPerEther()", +"5e402bb5": "setInfoTokenSilverRatio(string)", +"5e403a9c": "phase7Price()", +"5e404de3": "setMaximumCredit(uint256)", +"5e4293ba": "i_am_generous()", +"5e431709": "sealedBids(address,bytes32)", +"5e431a6f": "phasePublicSale1_To()", +"5e439f66": "changeAge(uint256)", +"5e43f719": "enablePublicTransfers()", +"5e44423c": "ChangePreSaleDates(uint256,uint256)", +"5e44daf3": "vote(uint256,int256)", +"5e44e0a4": "modifyHorseyTier(uint256,uint8)", +"5e46f419": "leed()", +"5e475bb6": "createKT(string)", +"5e48379a": "changePriceContract(address)", +"5e488540": "claimRefund(address,bytes32)", +"5e4887bd": "initializeTime()", +"5e48ce0f": "dequeue(bytes32)", +"5e48f58f": "PRESALE_PERCENTAGE_2()", +"5e49db8c": "getUsersFuelsIds()", +"5e49fbfc": "WOS()", +"5e4a1d36": "getSavingsBalance(address)", +"5e4a627d": "RN()", +"5e4a8a20": "setAppCode(bytes32,address)", +"5e4b587b": "_BLOCK_REWARD()", +"5e4b5f7d": "setColdAddress(address)", +"5e4ba17c": "remove(address[])", +"5e4e7cbc": "record(string,string,string,address,bool)", +"5e4f63ec": "extendLockPeriods(uint256,bool)", +"5e5098c2": "setmangerallow(address,uint256)", +"5e50f037": "reward(address,address,uint256,uint256,uint256)", +"5e511afa": "sendTokensBackToWallet()", +"5e5144eb": "change(address,address,uint256,uint256)", +"5e520c29": "tokensPerWei10()", +"5e5294b7": "endingTimestamp()", +"5e52a00b": "getReferrer()", +"5e53e2f9": "EXACOIN(uint256,string,string)", +"5e556a4a": "faucetTo(address,uint256)", +"5e5571ac": "pay(address,uint256,bytes32)", +"5e5650ef": "admin_set_Apply_Store_Id_Fee(address,address)", +"5e571440": "presalesTokenPriceInWei()", +"5e57966d": "addressToString(address)", +"5e58217d": "hardCapIco()", +"5e58331c": "SAGA()", +"5e585889": "claimDeposit(bytes32)", +"5e58f141": "shares(address,bytes,int256)", +"5e593cd3": "Funding_Setting_cashback_duration()", +"5e5a77e6": "getQuestionAnswer(uint256,uint256)", +"5e5a7eb0": "createCase(uint256,address,address,uint256)", +"5e5ae1fe": "invalidateAllPendingMints()", +"5e5b1e61": "closeTokensale()", +"5e5ca8d4": "BuyerSeller()", +"5e5d2adb": "HUBUToken()", +"5e5d4320": "deleteUser(bytes32)", +"5e5d73b5": "CloseSaleFund()", +"5e5d926c": "makeDai(uint256,address,address)", +"5e5de297": "getUidAsInteger(address,address)", +"5e5e305e": "bbAirdropWallet()", +"5e5e4cc5": "ownerToArmy(address)", +"5e5f2e26": "allowedTokens(uint256)", +"5e5f2e37": "startedNewVote(address,uint256,string,uint256)", +"5e5ff24b": "addUsersToGroup(bytes32,address[])", +"5e601fed": "changePaymentAddress(address,uint256)", +"5e604b60": "addWhiteListedContracts(address)", +"5e6096c5": "setMinimumTokenSell(uint256)", +"5e60d438": "LicerioToken()", +"5e615a6b": "getParams()", +"5e62463a": "TransferLimitedToken(uint256,address,address[],address)", +"5e62af4d": "grandJackpot(uint256,uint256)", +"5e645680": "getRegulatoryAuthorities(address)", +"5e64f392": "_completeTask(uint256)", +"5e6558e5": "addAtkPlayerQuest(address)", +"5e65db7f": "deleteThis(uint256)", +"5e66dfee": "regularPayment()", +"5e66eb1b": "phaseClaim()", +"5e675098": "addFoundation(address,uint256,uint256,uint256)", +"5e68ac2c": "Kingdom(string,address,address,address,uint256,uint256,uint256,uint256,uint256)", +"5e68d459": "_getRNGValue(uint256)", +"5e6911af": "hardcapReached()", +"5e6936ac": "HitToken(uint256,string,uint8,string)", +"5e6992e3": "rcnFundDeposit()", +"5e6a7777": "setCompte_39(string)", +"5e6ad49d": "_setCosignerAddress(address)", +"5e6b4ee5": "increaseRate(uint256,address)", +"5e6b7a5c": "getUnitsDefense(address,uint256,uint256)", +"5e6c5d77": "number_of_deals()", +"5e6cbd6d": "_getRandom(uint256,address)", +"5e6db193": "Bithenet()", +"5e6e91ac": "Mint(uint256,address,string)", +"5e6eb33a": "CampaignClosed(uint256)", +"5e6f6045": "vestingContract()", +"5e6fa5ea": "inclusionEnExchange()", +"5e6fc129": "isRecord(string)", +"5e6fc8b4": "getChildrenCount()", +"5e7037d0": "removeSpriteFromSale(uint256)", +"5e7051cd": "setQuickPromoInterval(uint128)", +"5e70a6dc": "increaseLock(uint256,uint256)", +"5e715c16": "ICO_CONTRACT()", +"5e717e2d": "readDeal(string,address)", +"5e71823b": "numPositions()", +"5e71c7fa": "testCheckRokSold()", +"5e733baa": "openEgg(uint64,uint16)", +"5e734f5c": "revealBid(bytes32,uint256,address,bytes32,bytes32,uint256,uint256)", +"5e73dd37": "tokenCapPhaseOne()", +"5e7591e2": "register(bytes32,address,address,bytes32,bytes32)", +"5e763377": "ModifyMarking(bytes32,uint256,uint256)", +"5e763946": "setTaxationPeriod(uint256)", +"5e76a101": "onlyOwnerSetTeamWallet(address)", +"5e77eec0": "setAdminsAddress(uint256,address)", +"5e7893e2": "showprize()", +"5e78998e": "BatLimitAsk()", +"5e79f1cb": "approvedByAdmin(address,uint256)", +"5e7aa842": "createEvent(bytes32,bytes32[],address,uint256)", +"5e7b9832": "updateItem(uint256,uint8,uint8,uint256,uint256,uint256,uint256,uint256,bool,bool)", +"5e7be40d": "getBeneficiaries(address,address)", +"5e7c85b1": "totalContrib(address)", +"5e7cafa4": "startPayments(uint256,uint256)", +"5e7d6fd0": "airdropHasExpired(address,uint256)", +"5e7f092c": "_createNFTCollectible(uint8,uint256,address,uint256,uint256[5])", +"5e7f22c2": "postBuyOrder(address,address,uint256,uint256)", +"5e7f322b": "exchangeEthToEur(uint256)", +"5e8023d1": "cascades(uint256)", +"5e80377b": "buySaleReferred(uint8,address)", +"5e815320": "forward_pass2(uint256[],int256[],int256[],int256[],int256[],int256[])", +"5e816740": "rollDice(uint256,address)", +"5e81b958": "isNonFungibleItem(uint256)", +"5e81ba96": "DestroyedBy(uint256,address)", +"5e8254ea": "commitVoteOnProposal(bytes32,uint8,bytes32)", +"5e825564": "setFactory(address,address)", +"5e83b463": "placeBet(uint256,uint256,uint256,uint256,bytes32,bytes32)", +"5e84d723": "publicSupply()", +"5e850225": "closePeriod(uint256,uint256,uint256)", +"5e8507f8": "destTokensAngel()", +"5e855f14": "Dice(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"5e85db0a": "getMinSkills(uint256)", +"5e8714d5": "changeSaleAgent(address)", +"5e871f0c": "dividendDistributionDuration()", +"5e885c63": "getPack(uint8,uint128)", +"5e89d92a": "Credentials(bytes32,bool)", +"5e8a6044": "foundersFundTimelock3Address()", +"5e8a79e1": "setRef()", +"5e8a8b00": "setDocHash(string,bytes32)", +"5e8aedce": "SubajToken()", +"5e8af735": "placeBet(uint256,string)", +"5e8be190": "getCar(uint256)", +"5e8c63bb": "vehicle_assembled(uint256)", +"5e8e9589": "_createPenguin(string,uint256,uint256)", +"5e8f5022": "issueTokensWithReferral(address,uint256)", +"5e8f6597": "distributeInvestorsTokens(address,uint256)", +"5e90852d": "proposeTransaction(address,uint256,bytes)", +"5e90a9ff": "_getLotteryNum(uint256,uint256)", +"5e916b46": "rinkeby2()", +"5e91ba21": "checkSecret(address,string,bytes32)", +"5e91c37d": "tokensSoldInPresale()", +"5e91c5ed": "specialTransfer(address,uint256)", +"5e91d8ec": "updateEmployee(address,uint256)", +"5e943a30": "calculateReferralBonus(uint256)", +"5e949fa0": "changeDestination(address)", +"5e956abf": "createMeshPoint(string)", +"5e959287": "getSignature(string)", +"5e95ff98": "updateFreeze(address)", +"5e968a49": "ownerSetMaxProfitAsPercentOfHouse(uint256)", +"5e97894a": "TNPC()", +"5e983156": "getJudgeVoted(uint256,address)", +"5e983d08": "setPrices()", +"5e986ec7": "PoezenVoting(uint256,uint256)", +"5e987d32": "last_slot()", +"5e98e4c7": "abstain()", +"5e9a1849": "numDonations()", +"5e9a31fb": "MINBET_perSPIN()", +"5e9a523c": "assetPrices(address)", +"5e9a8c42": "get_deal_state(uint256)", +"5e9afc0e": "ERC223TestToken(string,string,uint8,uint256,address)", +"5e9bcab0": "getReferrerRates(address)", +"5e9d2b1f": "roundSize()", +"5e9d2e7b": "exchangesWallet()", +"5e9dbcb7": "_tag(string,string)", +"5e9e2226": "setOraclizeWinnerGasFee(uint256)", +"5e9f9613": "availableReserve()", +"5ea050ec": "InitiateCompanies()", +"5ea102b0": "Base()", +"5ea187c9": "BuildByteArray(bytes)", +"5ea194a3": "createScalarEvent(address,address,int256,int256)", +"5ea1bb17": "winInternal(address,bytes32)", +"5ea1d6f8": "commissionRate()", +"5ea1fc6a": "NAME_SATOSHI()", +"5ea27e40": "PRESALE_END_TIME()", +"5ea36bd6": "MultiHolderVault(address,uint256)", +"5ea39624": "ATTR_SEEDED()", +"5ea3ad0a": "doWithdrawal(uint256)", +"5ea40983": "addMember(address,uint256,bool,string)", +"5ea4cf50": "AMPTToken()", +"5ea56918": "BIAToken()", +"5ea63913": "getInvestorBalance(address)", +"5ea6474d": "getPVPBattleResult(uint256,uint256,uint256)", +"5ea67956": "CrowdtesICO()", +"5ea81231": "ownerAddRole(address,string)", +"5ea81e07": "editAccountData(address,string,bytes)", +"5ea82efb": "MariaToken()", +"5ea8cd12": "setMinPrice(uint256)", +"5ea8cf00": "PardiICO()", +"5ea94bcf": "updateUserTrustRankForMultipleChannels(address,bytes12[],int256[])", +"5ea95215": "SpaceXToken()", +"5ea98520": "changeNewExchange(address)", +"5ea9caff": "FrozenFund(address,bool)", +"5eaa6ca4": "_cancelMarkets(uint256)", +"5eaaa699": "SALES_SUPPLY()", +"5eaad235": "getDataByDeviceId(uint8,uint8)", +"5eab15e4": "devuelveApps(bytes32)", +"5eabc684": "updateIssuanceData(address,uint256,uint256)", +"5eabe01e": "saleSuccessful()", +"5eac1414": "UNIQ(uint256,string,string)", +"5eac6239": "claimRewards(uint256[])", +"5eac85d5": "burnGasAndFreeFrom(address,uint256,address,address[],bytes)", +"5ead330c": "getDungeonFloorDetails(uint256)", +"5ead8846": "updateFundsOwner(bytes32,bytes32)", +"5eadd607": "debugResetSubmissions()", +"5eae177c": "isTransferAllowed(address,uint256)", +"5eaefac1": "reservePricing()", +"5eaefb31": "CARD_TAKE_SHARE()", +"5eafe515": "newDeveloper(address,string)", +"5eb08d8a": "setBurnRate(uint8)", +"5eb101c3": "capped()", +"5eb17cdb": "setBeginTime(uint256)", +"5eb19ad1": "recalcAmountWithFees(uint256,bool)", +"5eb19eda": "InitiatePlanets()", +"5eb1f936": "JBToken()", +"5eb28fb2": "Robot()", +"5eb332da": "updateAward(uint256)", +"5eb38bef": "setcommissionPer(uint256)", +"5eb3f639": "assertTrue(bool,bytes)", +"5eb456c1": "goldIssueBurnFee()", +"5eb51d3c": "setTrancheMinTx(uint256)", +"5eb53bfa": "test_standardCampaignConstructionValuesFailsDueToNoParameterValidation()", +"5eb604bc": "GongChuangToken()", +"5eb61aa9": "executeSignedCall(address,uint256,uint256,bytes,bytes)", +"5eb62178": "getMinAmount(address)", +"5eb62d75": "sendPrivateSaleTokens(address,uint256)", +"5eb6a78f": "gamesCounter()", +"5eb7413a": "lockedTokens(address)", +"5eb7556f": "currentRoundIsActive()", +"5eb9bbf7": "founderTokenUnlockPhase4()", +"5eba2472": "Migrations3()", +"5ebad2ab": "GrowthPool_Supply()", +"5ebaf1db": "staker()", +"5ebb7077": "mkDomain(bytes32,address)", +"5ebc1db8": "positionScount1(address,address)", +"5ebc7826": "CasCoin()", +"5ebca187": "testFailTransferWhenStopped()", +"5ebcaf7e": "sendBuyAgent(int256,int256,int256,int256)", +"5ebcc621": "endFundraising()", +"5ebcfe50": "taxTransfer(address,address,uint256)", +"5ebd2196": "getMyBalanceDNT()", +"5ebd9a83": "add(bytes32,address,address)", +"5ebdd159": "tokenAvailable()", +"5ebe4746": "CCPLUS(uint256,string,string)", +"5ebe7c72": "reply(string)", +"5ebfed78": "buyRegion(uint256,uint256,uint256,string)", +"5ec01e4d": "random()", +"5ec0c707": "winnerFromGas(uint256)", +"5ec112a2": "setPreSaleOpened(bool)", +"5ec1b499": "AnythingAppTokenPreSale(address,address,address,uint256,uint256,uint256,uint256,uint256)", +"5ec1fc19": "convertMint(address,uint256)", +"5ec211a1": "accountOfN(address)", +"5ec2c7bf": "auctioneer()", +"5ec2dc8d": "depositReward()", +"5ec30be2": "assignListingDB(address)", +"5ec38bec": "updateFundWallet(address)", +"5ec3f160": "secondsInDay()", +"5ec4eb95": "GoldWhitelist(address,bool)", +"5ec5bc8e": "pushOrderOfOwner(address,uint256,bool)", +"5ec5bed6": "coupon(uint256,uint8,uint8,bytes32,bytes32)", +"5ec70cd2": "_getProviderPriv(uint256)", +"5ec72a90": "maxCumAcceptedDeposits()", +"5ec81130": "calcBonusRate()", +"5ec88c79": "getAccountLiquidity(address)", +"5ec93cb2": "withdrawal_gas()", +"5ec94770": "RhinexFundCoin()", +"5eca2aeb": "getBytesArrayIndex(bytes32,uint256)", +"5ecb16cd": "withdrawTokens(address[])", +"5ecb6594": "isCoreContract()", +"5ecb7d20": "testGetCaseCount()", +"5ecc33ac": "testPrivacy()", +"5ecc7975": "YUPVesting(address,uint256,uint256,uint256)", +"5ecd62b9": "divCut()", +"5ecef65f": "setTactics(uint256,uint8,uint8)", +"5ecf36f7": "Print(string,uint256)", +"5ecf71c5": "decreasePower(uint256)", +"5ecfdcfc": "KnownTokens(address,address,address)", +"5ecff851": "p_setDevAddress(address)", +"5ed0f3fd": "changeVariables(address[],uint256[],address,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"5ed16294": "nacBalance()", +"5ed188c9": "MNTToken(address)", +"5ed18d95": "CollatLending()", +"5ed31991": "lastLockingTime()", +"5ed411e5": "setNewToken(address)", +"5ed4382f": "fourthStageMinting()", +"5ed49e9b": "ADVISERS_AND_FRIENDS_WALLET()", +"5ed4d7ae": "_getTokenAmount()", +"5ed50033": "myetherpay(uint256,string,string)", +"5ed5684c": "HCHToken(uint256,string,string)", +"5ed570f3": "toggleCanCreateGames()", +"5ed5ea28": "whiteListContract()", +"5ed65228": "sponsoredJackpotMin()", +"5ed66172": "getCertificateForWallet(address,address,address)", +"5ed66998": "usingOwnership()", +"5ed6a8e7": "setData_13(string)", +"5ed73bc7": "distribute(address,uint256,address[],uint256[],uint256)", +"5ed75366": "DEVELOPER_FEE_FRAC_TOP()", +"5ed7ca5b": "halt()", +"5ed81ebe": "getInspireTokens(address,address,uint256)", +"5ed84aa6": "getNymCenterAPIURL()", +"5ed85753": "ergoam(uint256,string,string)", +"5ed9ebfc": "soldTokens()", +"5eda17bc": "_tuneLambo(uint256,uint256)", +"5eda232d": "getTokenStakeByIndex(uint256)", +"5eda5b9a": "interestCollected()", +"5edabc99": "getPresaleEndTime()", +"5edb2fb3": "uint256ToBytes32(uint256)", +"5edc1ac8": "discountDecimal()", +"5edc9bff": "upgradeUnitMultipliers(address,uint256,uint256,uint256)", +"5edca2b4": "unsuccessfulWithdrawal()", +"5edd4436": "newOffer(bytes32,string)", +"5eddd157": "claim(uint256,uint256,bytes)", +"5edf34d4": "Transfer(address,address,address,address)", +"5edf413e": "burn(bytes32,address,uint256,bytes)", +"5edf8d3c": "SetAdOwner(uint256,address,address)", +"5edfa1f8": "calculateFees()", +"5edfd788": "completedGames()", +"5ee0f535": "_mint(address,bytes32,string,uint256)", +"5ee10f3b": "instruct_2()", +"5ee2a018": "deployMultiToken()", +"5ee2cec2": "issuerDateMinutes()", +"5ee345e4": "computeEndowment(uint256,uint256,uint256,uint256,uint256,uint256)", +"5ee4e3f8": "LocklistAddressisListed(address)", +"5ee58efc": "distribution()", +"5ee5a409": "transfer_token1_toContract(address,address,uint256)", +"5ee5e9ee": "SaleStarted(uint256,uint256,uint256)", +"5ee679f9": "removePolicyFrom(address)", +"5ee6cc38": "buyToken(address,address)", +"5ee7144c": "_removeTopic(string)", +"5ee759e8": "encodeCurrency(string)", +"5ee760a5": "hashHardCap(uint256,uint256)", +"5ee7b392": "sendToken_internal(address,uint256)", +"5ee7cd23": "isBCFBuyMarket()", +"5ee7e96d": "grant(address,uint256,uint256,uint256,uint256,bool)", +"5ee857d1": "test_insert_findWithHintPrevUpdateTail(int256)", +"5eeb9ff9": "get_transferLock()", +"5eebc031": "newReadAddr()", +"5eebea20": "pending(address)", +"5eec743b": "minContributionMainSale()", +"5eec9df0": "softCapWei()", +"5eecbad8": "getFunderByIndex(bytes32,string,uint256)", +"5eecdec0": "unLockup()", +"5eed1f1a": "setTotalIndividualWeiAmount(address,uint256)", +"5eed3dcb": "donorList(uint256)", +"5eed886b": "minimumPerTransaction()", +"5eedbceb": "emitTransferFeeUpdated(uint256)", +"5eee006a": "secondStageStartsAt()", +"5eee7078": "sendETH(uint256)", +"5eeeee22": "setMaxWin(uint8)", +"5ef013d0": "Ico()", +"5ef17eff": "getSettingValuesById(uint256)", +"5ef1bfdb": "landPriceWei()", +"5ef27d1a": "hasRazCompleted(uint256)", +"5ef2a3f4": "giveAwayInProgress()", +"5ef2c79a": "getMyNmBet(uint256,uint256)", +"5ef3f3d1": "voteRelease()", +"5ef3f9e1": "BETS_CLOSING_TIME()", +"5ef4d2af": "_calculateTokenAmount(uint256)", +"5ef4ed42": "setBattleTokenAddress(address,address)", +"5ef505c0": "discoveryBlocksUntilAllowed(uint256)", +"5ef572ad": "stageMgmtSystem()", +"5ef5cdb2": "doFailedOffer(uint256)", +"5ef6228c": "bytesToAddr(bytes)", +"5ef652ad": "EtherFarmDevSim()", +"5ef6543c": "YDMediaToken()", +"5ef680df": "flushTokens(address,address)", +"5ef6ad57": "Delivery()", +"5ef74958": "Epam()", +"5ef78561": "cashWallet(address)", +"5ef79434": "DATE_PRESALE_END()", +"5ef7ac4d": "startRedeem(uint256,bool)", +"5ef7b303": "getPI_edit_14()", +"5ef80c87": "create20ContractToy()", +"5ef82429": "tixPromo()", +"5ef8ce5d": "setPollType(uint256,address)", +"5ef8da77": "Altruism()", +"5ef97145": "BokkyPooBahsAutonomousRefundathonFacility()", +"5ef9dde8": "removeApprovedGame(address)", +"5eface14": "numStakersForPoll(bytes32)", +"5efb4dc5": "deathData_a7()", +"5efb8266": "setGoldContractAddress(address)", +"5efbb728": "transferold(address,uint256)", +"5efbcfba": "minWeiToBuy()", +"5efbdc47": "setLastBidId(bytes32)", +"5efc156f": "Roles2LibraryAdapter(address)", +"5efd1682": "transferPreSigned(address,address,uint256,uint256,uint256,bytes,bytes32,bytes32,uint8)", +"5efd3c41": "whiteListEndBlock()", +"5efdb1e4": "percentToTakeAsSeed()", +"5efe2fcf": "releasedLockedAmount()", +"5eff7d8f": "getAccountLiquidityInternal(address)", +"5eff7dae": "getInstructors()", +"5eff8b48": "Prakashcoin()", +"5effd20d": "withdrawForAddress(address,uint256)", +"5f01b42f": "alloweRefund()", +"5f02116f": "claimRewards(uint256[],uint256[])", +"5f024e91": "testCheckEthBalance()", +"5f0379f5": "firstPriceChange()", +"5f038b6d": "refillFunds()", +"5f05b3e4": "HappyToken(uint256,string,uint8,string)", +"5f05b9df": "removeTWhitelist(address)", +"5f065346": "pay(address,uint256,uint256)", +"5f06541d": "resetOwner()", +"5f065b4a": "checkItem(bytes32)", +"5f06900b": "changeBattleFee(uint256)", +"5f073f49": "gatherDetails(uint64[])", +"5f07a3e5": "addAllNewTicket(uint256,bytes32[],uint256[],uint256[],uint256[])", +"5f07bd15": "take_fees_eth_owner()", +"5f09952e": "voteAllowTransactions(bool)", +"5f0b37e4": "VeritokenToken()", +"5f0d5296": "reserveAllowance()", +"5f0d995b": "developer_string_contract_verified(string,string)", +"5f0da25b": "sendDeposit(uint256,address,uint256,bytes32)", +"5f0da5c9": "create(string,address,address,address,address,bool)", +"5f0e3855": "ownerRefundUser(bytes32,address,uint256,uint256)", +"5f0edfb8": "create(bytes,bytes32,bytes1)", +"5f0f1f85": "transferProposalEnd()", +"5f0f7786": "IssuedToken(address[],uint256[],uint256,uint256,address,string,uint8,string)", +"5f0fc2e8": "RealMoneyToken()", +"5f104c5f": "SalesAgentPermissionsTransferred(address,address)", +"5f111074": "picopsCertifier()", +"5f112c68": "renounceMinter(address)", +"5f11301b": "setServiceURI(string)", +"5f1231ea": "getMemberInfo(address)", +"5f141a0f": "confirmWrite(bytes32,address)", +"5f14af16": "Subscribe(address,address,uint256,uint256,uint256)", +"5f14e108": "openTokensale(address)", +"5f159e60": "TimeBoundaryChanged(string,uint256)", +"5f167276": "getNumElements()", +"5f17114e": "TimeDeposit()", +"5f1768c1": "buyerHistory()", +"5f1845f6": "transferDecimalAmountFrom(address,address,uint256)", +"5f184eda": "withdrawFactoryResourceBalance(uint16)", +"5f185329": "submitOrder(bytes)", +"5f1877a8": "productPrice(string)", +"5f18aa0c": "decimals(bytes32)", +"5f196876": "allPromotions(uint256)", +"5f19c7b2": "doSetSettings(uint256)", +"5f1a6f4b": "BARL()", +"5f1b3ee6": "getAPAddressSize()", +"5f1b46ab": "inflateToken(address,uint256)", +"5f1ca2fc": "ReferralRegistered(address,address)", +"5f1d146e": "eeeeeeeeeeeee()", +"5f1d7037": "KEDToken()", +"5f1d804f": "checkTxProof(bytes32,bytes,uint256[],bytes,bytes)", +"5f1d90ae": "getCurrentOpinion()", +"5f1e1c28": "__transfer(address,address,uint256,bytes)", +"5f1e580d": "ETUToken()", +"5f1e8c1b": "MAX_MODULES()", +"5f1f6c5e": "delFromList(uint256,address[])", +"5f1fc571": "set_prices(uint256,uint256,uint256)", +"5f1ff549": "issued()", +"5f222da1": "latestMomentOf(uint256,address)", +"5f227bfc": "totalPlayerTokenContracts()", +"5f22c42f": "getBuyerReceipt(address)", +"5f238402": "lastAllowancePaymentTimestamp()", +"5f241c8e": "AnythingToken(uint256)", +"5f24f6fe": "setUpgradedAddress(address)", +"5f2536f7": "calculateMaxContribution(address)", +"5f27e47d": "GetWinnerAt(uint256)", +"5f27f6e3": "getPlayerGeneralAll(uint32)", +"5f27f946": "handleTokens(address,address,uint256)", +"5f28213b": "SCTC(uint256,string,string)", +"5f28b383": "minPerUser()", +"5f28cb74": "getSubscription(bytes32,address)", +"5f2961e1": "walletFounder1()", +"5f2a9f41": "MAX_GAS()", +"5f2aeae9": "executeCreator(uint256)", +"5f2af8d9": "Logocoin()", +"5f2b9ac0": "startPhase3()", +"5f2bb66e": "BatchTransfer(address)", +"5f2befb9": "hasTerminated()", +"5f2bf49a": "BitcoinRateUpdated(uint256,uint256)", +"5f2da7ec": "todayDays()", +"5f2e0c20": "giveConsent(uint8,bytes32,bytes32)", +"5f2e2b45": "freeFrom(address,uint256)", +"5f2e4b31": "testDisputedInvalidSequenceWrongWriteAddress()", +"5f2e686d": "Ethereum_eight_bagger()", +"5f2e8493": "addmoney(address,uint256)", +"5f2ebcf2": "GMRToken()", +"5f2ef12d": "tokenFactory(uint256)", +"5f2f83ba": "getMul(uint256)", +"5f2fb08e": "removeElement(address)", +"5f3040bf": "getMIRABALANCE()", +"5f304615": "earlyAllocation()", +"5f309123": "sale2(address,uint256)", +"5f30ed2a": "withdrawAmountFromToken(uint256,uint256)", +"5f31ea82": "holdTokenInvestors(uint256)", +"5f32714d": "ChannelSettled(address,address,uint32,uint192,uint192)", +"5f3292d7": "DMCTCoin()", +"5f330669": "dateMove(uint256)", +"5f33afdb": "preallocCoins()", +"5f33c5e1": "Payout(bytes32,address,address)", +"5f34165d": "isRightBranch()", +"5f3616eb": "getNextOnce(address,uint256,uint256,uint256)", +"5f3619b1": "getProfitFromSender()", +"5f373c22": "setHydroContractAddress(address)", +"5f37b43f": "_getType(uint256,uint256)", +"5f3893ef": "getReward(address,uint256,address)", +"5f399d28": "TokenIceBox(address)", +"5f39fd73": "approveUpdate(uint256,address,bool)", +"5f3aa2bb": "checkIfRewarded(bytes,uint256,bytes,bytes)", +"5f3bc04c": "addressFundInvestment()", +"5f3c15ed": "radtokenSupply()", +"5f3c23be": "isProposalNotExpired(bytes32,uint256)", +"5f3c6686": "challengeBook(address,address)", +"5f3c91ad": "accrueEther()", +"5f3ca167": "crowdSaleInitialized()", +"5f3cebcd": "incrementalInverse(uint256,uint256)", +"5f3d634f": "freezeMulti(address[],uint256[],uint256[],uint256[])", +"5f3d7fa1": "maxAttendees()", +"5f3e3db0": "increaseWeeklyTransactionVolumeSending(uint256)", +"5f3f703c": "gifter()", +"5f403edc": "addThenSub(uint256,uint256,uint256)", +"5f40fc27": "withdrawGoldMoney()", +"5f412d4f": "releaseTokenTransfer()", +"5f412ff1": "ownerEnablePayee(address,address)", +"5f41ccef": "multMint(address[],uint256[])", +"5f421776": "switchONfreeForAll()", +"5f429ba5": "Risk()", +"5f437e48": "settingsState()", +"5f43e49c": "isDataYes(bytes)", +"5f4402c5": "distributeTokenToAddressesAndAmounts(address,address,address[],uint256[])", +"5f45161f": "payToInviter(uint256)", +"5f45221d": "retrieveIncompleteProof(bytes32)", +"5f452df1": "approveCrowdsale(address)", +"5f456c1f": "assignedAmountToEcoReward()", +"5f45c179": "ABYSS(address,address[],address)", +"5f46d750": "amountOfDividendsPayouts()", +"5f4784a5": "allOf(address)", +"5f478f74": "Milestone(string,uint8)", +"5f47ba42": "Plendito()", +"5f4821ab": "ContractFactory()", +"5f4874e4": "multiTransfer(address[],address[],uint256[],string)", +"5f48f393": "maxAmount()", +"5f493f63": "convertToMini(uint256)", +"5f495491": "claimsCreated()", +"5f4964e0": "setMarketComissionRatio(uint256)", +"5f497a09": "adminCharge_p1()", +"5f49c5ac": "_addRecoverer(address)", +"5f49d562": "QSTPerEth()", +"5f4a47c3": "updateUpdater(address,string)", +"5f4b125b": "get_pre_kyc_bonus_numerator()", +"5f4b2873": "getDepositedValue(address)", +"5f4b9b4f": "getPolicyCount(address)", +"5f4c71f1": "getTotalETH()", +"5f4dd2d8": "mintPreico(address,uint256)", +"5f4eab65": "hasEditionInProgress(uint256)", +"5f4ed0b1": "rebalanceBucketsInternal()", +"5f4f35d5": "setFullName(string)", +"5f504a82": "ownerCandidate()", +"5f5082dd": "setLast(uint256,address)", +"5f51028d": "checkIsReleaseRecordExist(uint256)", +"5f515226": "checkBalance(address)", +"5f516131": "ReserveUnknown(bool,uint32,uint256,uint256)", +"5f51d526": "balanceMapPos(address)", +"5f51db02": "Memes()", +"5f52583b": "processStorageRoot(address,uint256,bytes,bytes)", +"5f52e9fd": "WithdrawCashForHardwareReturn(uint256)", +"5f538fd4": "openMigrationPhase()", +"5f539d69": "addContract(address)", +"5f53e077": "setPausedTransfers(bool)", +"5f5404af": "PriceProvider(string)", +"5f542c94": "emitAreaEvaluated(address,address,uint8,uint256)", +"5f54a1c7": "requestEndCall()", +"5f54ae17": "buy50Price()", +"5f54fa98": "conventionId()", +"5f561763": "rolloverPosition(address,uint256,uint256,address)", +"5f56315b": "enableSell()", +"5f56b6fe": "safeWithdrawal(uint256)", +"5f56e134": "averageArtworkSalePrice()", +"5f5810ea": "UBIT2018069()", +"5f5868db": "freezedValue()", +"5f589599": "resultsPublished()", +"5f58ed2a": "disableBot(address,uint64)", +"5f596681": "setShpExchangeRate(uint256)", +"5f598510": "KVMToken()", +"5f59940c": "addressToSpentEther(address)", +"5f5a98ee": "dragonGirlLotteryPrice()", +"5f5bb161": "set(bytes20,uint256)", +"5f5d867b": "CryptoPoosToken()", +"5f5db5dc": "setVariables(string,address,uint256,int256,bool,bytes32,address[2],uint256[2],int256)", +"5f5df710": "updateCertifier(address)", +"5f5e38b6": "setBuyPrice(uint16,uint16,uint8,address,uint256)", +"5f5f23a0": "charityFactor()", +"5f5f2aef": "amendRetention(uint8,uint8)", +"5f5f62f9": "setControler(address)", +"5f5fa782": "getCurrencyByte(uint256,uint256)", +"5f5fca9a": "setEnforceAddressMatch(bool)", +"5f6076bf": "Access()", +"5f60a5d4": "CompleteWildcard(uint256,address)", +"5f60ef47": "get_heaps(uint256)", +"5f60f485": "updateStatus()", +"5f61a26e": "PRESALE_ETHER_MIN_CONTRIB()", +"5f61bf99": "claimG()", +"5f623e15": "divisible_units()", +"5f645f16": "setInputFile(uint256,bytes32)", +"5f647d5a": "ethSignedMessagePrefix()", +"5f64b55b": "tokenB()", +"5f65545d": "Raffle_Prize()", +"5f65d621": "setSkill(uint256,uint256,uint256,bytes32)", +"5f65d703": "setInfo(bytes32,uint256)", +"5f65faf1": "isProduct(bytes32)", +"5f677404": "INITIAL_VALUE()", +"5f68688f": "endFirstBonus()", +"5f68804e": "SimpleLotto()", +"5f689fed": "startPVE(uint256)", +"5f6a1301": "clearPending()", +"5f6a4546": "ROLE_REVIEWER()", +"5f6acfe9": "_updateRate(uint256,uint256)", +"5f6d0ded": "ReservationFund(address)", +"5f6dd297": "getProjectEndDate(bytes32)", +"5f6e388a": "ProofOfCloneWars()", +"5f6ea340": "revokeAccess(address,address)", +"5f6ecea0": "vestedTransfer(address,uint256,uint256)", +"5f6edff8": "assureDAppIsReady()", +"5f6f8b5f": "setExclude(address)", +"5f7033e5": "getCurrentStartTime()", +"5f704f3e": "updatePrice(bytes32,uint256)", +"5f70d9ac": "getBot(uint256)", +"5f7118c7": "setRevealOpen(uint256)", +"5f71249c": "changeOrganisationName(string)", +"5f722859": "updateHashValue(bytes32,bytes32)", +"5f723b50": "getInitialReportMinValue()", +"5f72a508": "playerPopMining(uint256,bool)", +"5f72f450": "check(uint256)", +"5f73d6c0": "promisedTokenBalance()", +"5f746233": "dispense(address)", +"5f74a5ec": "pecunioWallet()", +"5f74bbde": "vote(address,uint256)", +"5f74c16c": "getPrizePot()", +"5f75b5ef": "whitelistAddress(address,address)", +"5f75cb6b": "getCountTransferInsToken(address,address)", +"5f75d62d": "addCard(uint256,string,bool)", +"5f7619a4": "takeFee(uint256)", +"5f766118": "salutaAndonio()", +"5f76e49a": "addPerson(bytes32,bytes32,bytes32,bytes32,uint256,bytes32,address)", +"5f770d47": "HyperSale()", +"5f77ace0": "stop_token_time()", +"5f7807a4": "transferToUser(address,uint256)", +"5f788531": "buy5Price()", +"5f791c7c": "ZRSToken()", +"5f7a7bb5": "returnRegDate(address)", +"5f7b68be": "addKey(address)", +"5f7b73b2": "getInvestorCredit()", +"5f7b764f": "_getLuckySpaceshipMoney(uint256,uint256)", +"5f7bb7f1": "setMaxProfit(uint128)", +"5f7c944f": "mintAccount(uint256,uint256,uint16,bytes32,uint256)", +"5f7cbc39": "addressOfTokenUsedAsReward2()", +"5f7cfe49": "internalSalt(bytes32)", +"5f7d897e": "checkVendor()", +"5f7dfd3f": "totalPaidToFunders(bytes32)", +"5f7e61fa": "SendTo(address)", +"5f7e7138": "setDth(address)", +"5f7ee166": "setupOpenDistribution(uint256,uint256,address,address)", +"5f7eed5d": "LeajoeToken()", +"5f7f9482": "statusQuery()", +"5f800348": "balancesImporter1()", +"5f802448": "specialAttacks(uint256)", +"5f8162bb": "transferTokenContractOwnership(address)", +"5f824297": "SellOrderPlaced(uint32,address)", +"5f84d0f9": "tokenR0()", +"5f84e343": "Artemine()", +"5f84f302": "setInterestRate(uint256)", +"5f852975": "randomtests()", +"5f8534ae": "claimDeposit(uint256)", +"5f856dbf": "Token_AllowTransfer()", +"5f85abdc": "contains(int256,int256)", +"5f865912": "addContract(address,address,uint256,string,bool)", +"5f877108": "sendToCharger(uint256)", +"5f88bff0": "presaleFundingGoal()", +"5f88e83d": "checkAndCallTransfer(address,address,uint256,bytes)", +"5f88eade": "opened()", +"5f88ffed": "wallet10()", +"5f8909bd": "biddingPeriod()", +"5f8a3029": "Standard_4()", +"5f8a7eab": "getReleaseAmount()", +"5f8aaa69": "sourceToken()", +"5f8aaef7": "contractStakeToken()", +"5f8af054": "getMessageLength(string)", +"5f8b93d2": "SingularityTest13()", +"5f8bad42": "getCommunityBallotWeiPrice()", +"5f8c1fce": "nextBracket()", +"5f8c494f": "IntIDQuery(address)", +"5f8cb3f6": "bounty_paid()", +"5f8cf6c4": "SMILO_SALES_AMOUNT()", +"5f8cf7c5": "PermissionGroups()", +"5f8d96de": "getDeadline()", +"5f8e38e1": "depositERC20Compatible(address,uint256,uint256,uint256)", +"5f8eb4c7": "jsub(uint256,uint256,uint256,uint256,uint256,uint256)", +"5f8f0483": "buyBankerAgreementFromImporterBank()", +"5f9094f5": "GetCreditsPerEth()", +"5f9145ef": "RefundReceived(uint256)", +"5f918b05": "ServiceProviderDisabled(address,bytes)", +"5f91af39": "_increasePlayerDivis(address,uint256)", +"5f9209ad": "getPositioninterestPeriod(bytes32)", +"5f92dee8": "adminGetWorldSnapshot(uint256)", +"5f932d71": "walletSetSigner(address)", +"5f945733": "getTotalInvested()", +"5f94e3de": "setSecondaryOperator(address)", +"5f94e82c": "setBridgeValidatorsProxyOwner(address)", +"5f956244": "TribePlatform()", +"5f9590fc": "_isValidDataHash(bytes32,bytes)", +"5f95ad43": "HasNoEtherTest()", +"5f9602e8": "perClaim()", +"5f96d9fa": "gemSpeedConversion()", +"5f972df8": "_jDiv(uint256,uint256,uint256,uint256)", +"5f984bf6": "changeFounder(address,string)", +"5f9973b9": "WeiToken()", +"5f99c1b2": "_landholderJackpot(uint256)", +"5f99e8f5": "GetSeries1()", +"5f9a2c23": "endFourthWeek()", +"5f9aa94f": "SpiceRates(address,uint256)", +"5f9ac1a5": "distributeLeaderboardRewards()", +"5f9adf84": "getUserSentTradeOfferId(address,address)", +"5f9b71ce": "bet(uint256,address)", +"5f9bad28": "saleBonus()", +"5f9c84b5": "transferirSala(address,uint256)", +"5f9cb50d": "updateMasks(uint256,uint256,uint256,uint256,uint256)", +"5f9dfc79": "minBuyTokenAmount()", +"5f9e1080": "settleBet(uint256,address,uint256)", +"5f9e3c98": "canSetNewOwnerPercentage(uint256)", +"5f9f3f46": "MakeSharesFromAmount(uint256)", +"5f9f4734": "birthday()", +"5fa13b49": "shweta()", +"5fa21f1f": "enableBetting()", +"5fa27af0": "GITC()", +"5fa382ea": "getPixelsOwned(address)", +"5fa3df98": "changeKYCStatus(address,bool)", +"5fa413b0": "ownerShareInPercent()", +"5fa44602": "tokenCreationDate()", +"5fa458b7": "buysoldiers(uint256)", +"5fa51277": "emergencyExtract()", +"5fa513d5": "findPtr(uint256,uint256,uint256,uint256)", +"5fa58268": "approveRequestPause()", +"5fa60fc8": "DCAsset(address)", +"5fa67c00": "Credit(address,address)", +"5fa77dac": "all(bool[6])", +"5fa7b584": "removeToken(address)", +"5fa7dc56": "getCurrentRateWithBonus()", +"5fa7df6b": "setDelegateAndLockTokens(uint256,address)", +"5fa87163": "viewlisting(uint256,uint256)", +"5fa8c869": "_getRandomPartSubtype(uint256,uint8[])", +"5fab11a5": "startICO(uint256,uint256,uint256)", +"5fac4996": "findSignedSubscriberIndex(address)", +"5fad18e4": "Visualrockcoin()", +"5fad3b1a": "initialiseContract(address,uint256)", +"5fad663e": "expectedDividends(address)", +"5fae0576": "isWhitelistedAddress(address)", +"5faeb944": "setData_22(string)", +"5faeced2": "removeFromUserCounter(uint256)", +"5faf2880": "changeDna(uint256,uint256)", +"5faf6675": "forecastInfo(uint256)", +"5fb02f4d": "startContract()", +"5fb07a62": "getDrugs()", +"5fb0ac18": "birthDragon(uint256)", +"5fb130af": "retry(address)", +"5fb135f9": "distributeAff(uint256,uint256,uint256,uint256)", +"5fb1552c": "GanaLocker(address,address)", +"5fb1ef8e": "checkOrder(address)", +"5fb1f1d7": "getSketchesOnOffer()", +"5fb3b944": "privateSaleSoldTokens()", +"5fb3e119": "Auction()", +"5fb42c59": "goldListPeriod()", +"5fb437f2": "setWithdrowRate(uint256,uint256)", +"5fb4f78c": "finishConfiguration()", +"5fb500a5": "ETT(uint256,string,uint8,string)", +"5fb64fd6": "checkMembership(address)", +"5fb6bca2": "fighterCore()", +"5fb77b9c": "revealBracket(bytes8,bytes16)", +"5fb7a643": "enableServiceProvider(address,bytes)", +"5fb80f20": "weiPerAnimal()", +"5fb8dc8b": "MasternodeTransferred(address,address)", +"5fb8fed6": "PJR()", +"5fb93bb7": "transferDataEntryClerk(address)", +"5fba26a6": "getBorrowedBooksCount(uint256)", +"5fbaa390": "haltSale()", +"5fbabc49": "setSkill(uint32,uint8,uint32,uint32,uint32,uint32,uint32)", +"5fbddcf3": "isLivingMonarch()", +"5fbe4d1d": "tokenAddr()", +"5fbf0577": "sayYes(uint256)", +"5fbf17ac": "totalUBetCheckAmounts()", +"5fbf79a2": "EmergencyStopSell(bool)", +"5fbfd9f6": "crowdsaleController()", +"5fbff3e2": "preferentialRate()", +"5fbff3fc": "KuangJinLian()", +"5fc02dcd": "freezeAccountForOwner(address,bool)", +"5fc13e0f": "initTransaction(address,uint256,bytes)", +"5fc1a4b8": "treasurySupply()", +"5fc1afac": "forwarders_count()", +"5fc2b479": "unlock(address,uint256,uint8)", +"5fc2cb39": "buyTokensWithProperEvent(address,uint8)", +"5fc31aeb": "_rawGetTokenDelegation(address,address)", +"5fc378df": "sawcoin()", +"5fc3ea0b": "withdrawERC20(address,uint256,address)", +"5fc42ebf": "KTZ()", +"5fc483c5": "OnlyOwner()", +"5fc4a6f3": "getCurrentBonusSystem()", +"5fc5d48b": "burnUnsoldCoins(address)", +"5fc5e727": "investedSumOnIco()", +"5fc6bd17": "pendingParsecs()", +"5fc71288": "GOTPAY()", +"5fc75bf2": "viewCreatePetitionFee()", +"5fc7e71e": "liquidateBorrowAllowed(address,address,address,address,uint256)", +"5fc8cc16": "returnAmountOfELIXAddressCanProduce(address)", +"5fc9309c": "transferFrom(address,address,uint256,address)", +"5fc93ed7": "BirthdayBoyClickHere()", +"5fc9d392": "setMessageStatus(bool)", +"5fc9e75e": "historyCountOf()", +"5fca5a92": "set_arbits_max_contribution(address,uint256)", +"5fcb568c": "release(string,uint32,uint32,uint32,string,string,string)", +"5fcba9ae": "DURIANX()", +"5fcbd5b6": "countDown()", +"5fcc2edb": "IndividualityTokenRoot(address)", +"5fcc6277": "changeModuleBudget(uint8,uint8,uint256)", +"5fcc7ea1": "nextScheduledQuery()", +"5fcc9d0f": "hardCapPreIco()", +"5fcce279": "announcementType()", +"5fccf40a": "redeemBonusLot()", +"5fccfda4": "postICOSale()", +"5fcd7fe6": "OWNER_TOKENS()", +"5fce627e": "hasArea(address,uint256)", +"5fceab11": "incomingTransaction(uint256)", +"5fcee7a0": "CEOAddress()", +"5fcf0455": "interestEarnedAccount()", +"5fcf92ef": "received_tokens()", +"5fd030c0": "setLicenseNFT(address)", +"5fd0526e": "getReleasableBonusAmount(uint256,address)", +"5fd0f8b2": "smartContractSaleEnded()", +"5fd1bbc4": "publicStartTime()", +"5fd23730": "LogSwapToken(address,uint256)", +"5fd33b1b": "freezeTrading()", +"5fd357fc": "PortfolioContent(uint256,uint256,uint256)", +"5fd4b08a": "getName(address)", +"5fd56dfc": "AllInOne()", +"5fd56e98": "whoHadTheBiggestDick(uint256)", +"5fd5e3b4": "newEvent(uint256,address[],uint256,uint256)", +"5fd65f0f": "swapStorage()", +"5fd72d16": "addAllowance(address,address,uint256)", +"5fd7793a": "setStreamerContract(address,uint256)", +"5fd8c710": "withdrawBalance()", +"5fd8d3d1": "maxInvestorCap()", +"5fd9d610": "verifyGameResult(bytes32)", +"5fd9dff6": "allowance(address,address,bytes)", +"5fd9e124": "pStopBlock()", +"5fd9e693": "Crear_rifa(uint256,address)", +"5fda0dc1": "isOnExchange(uint256)", +"5fda83f6": "TokenTransferDisallowed(uint256,address)", +"5fdba1de": "setIBalance5(uint256,uint256,uint256)", +"5fdbba04": "debatePeriodOf(uint256)", +"5fdc1a97": "AllSportsCoin()", +"5fdc9e0a": "dropSupply()", +"5fdcd306": "check_status()", +"5fdd59f8": "messages(address)", +"5fde0ed5": "getCountBySeller(address)", +"5fde731c": "wdiv(uint256,uint256)", +"5fdf05d7": "two()", +"5fdf5357": "sortDescBy(uint256[],uint256[])", +"5fdf60fb": "circulation()", +"5fe07013": "revokePermission(address,bytes32)", +"5fe0e081": "changePeriod(uint256,uint256)", +"5fe16454": "Fragment()", +"5fe22c8b": "testFailTransferWithoutApproval()", +"5fe27ab0": "createHKG(address)", +"5fe2d689": "getInterest(uint256)", +"5fe36964": "TEAMS_TOTAL()", +"5fe3854e": "calculatePrice(uint256,bool)", +"5fe3b567": "comptroller()", +"5fe44141": "getRegistryDataRegistered()", +"5fe4c0f3": "validationTime()", +"5fe59b9d": "setMotd(string)", +"5fe5b825": "AuthComplete(address,address)", +"5fe6fb19": "ConsultaProva(string)", +"5fe736e9": "createContractPlayer(string,uint256)", +"5fe745ea": "unlockOwnFunds()", +"5fe75764": "specialAccounts(address)", +"5fe772c6": "buyStakes(address,address)", +"5fe78b9b": "_getCurrentBonus()", +"5fe825f8": "getHodlOwner(uint256)", +"5fe8e7cc": "getHolders()", +"5fe9219a": "transferToMainViaRelay(address,uint256,uint256)", +"5fe98f99": "_getPayOut()", +"5fea13f8": "distributeToken(address,uint256,uint256)", +"5fea3de9": "getDuration(uint256,uint256)", +"5fec4be9": "issue(address[],uint256[],uint16[])", +"5fec5d0b": "isDelegate(address,address)", +"5fed2091": "addLovers(bytes32,string,string)", +"5fed22a4": "payOffClientDebt(uint256,uint256)", +"5fed2edd": "pushArray(bytes32,bytes32)", +"5fee0aac": "giveBattleBonus(address,uint256)", +"5fee63c3": "calculatedTo()", +"5fee8a4b": "getCommitThreshold()", +"5fef2094": "qryModuleDetail(string)", +"5fef4d34": "setOwner(address,address,bool)", +"5ff149ba": "UpdateEthBalance(uint256,uint256,uint256,uint256)", +"5ff1569e": "developmentPercent()", +"5ff19392": "strToUnderlierType(bytes32)", +"5ff1a9c0": "setPlAAdress(address)", +"5ff3b980": "getCooloffPeriod()", +"5ff456cb": "refundToOwner(uint256,uint256)", +"5ff46857": "getEthToTokenMakerOrderIds(address)", +"5ff4909b": "setAbel(address)", +"5ff4ae32": "setGasForDCN(uint256)", +"5ff4f876": "NFTBalanceOf(address)", +"5ff63abc": "ETimesChain()", +"5ff65026": "addNodeToStakedList(address)", +"5ff65efe": "MaxPoSXblock()", +"5ff6b342": "getValidDurationNonce()", +"5ff6cbf3": "getMessages()", +"5ff6e9d0": "investtokens()", +"5ff77b22": "checkTeamToAdd(uint64,uint64,uint64)", +"5ff79c07": "DenmarkvsFrance()", +"5ff7ec2f": "SoldTokensFromCroupier(address,uint256,uint256)", +"5ff7f947": "setSinistre_effectif(uint256)", +"5ff85cc0": "feeUnit()", +"5ff8b778": "findWinners()", +"5ff97818": "setMetadata0(string)", +"5ffabbce": "teamReserveTimeLock()", +"5ffb1578": "pushArrayValue(uint256)", +"5ffbba3f": "relativeDateSave()", +"5ffc7cc7": "transferProfit(uint256,uint256)", +"5ffcb734": "setTokensControlInfo()", +"5ffcbe30": "voteForCandidateViaProxy(uint256,address)", +"5ffce121": "getTopCompanyCount()", +"5ffd59bd": "GetBalanceOwnerForTransfer(uint256)", +"5ffde7be": "priceUpdateInterval()", +"5fffad5a": "setselfdropvalue(uint256)", +"5fffb7c7": "changeTokenAddress(address,int256,address)", +"600005b3": "Delegation(address)", +"60003918": "AllWorksToken()", +"6000eb9f": "getTeamInvest(uint256,uint256)", +"6001279f": "decreaseApprovalByLegacy(address,address,uint256)", +"600160a3": "bet_luse()", +"6001b23e": "getCustomerTxAtIndex(address,uint256)", +"60027c25": "bankrollLockedUntil()", +"60035c3f": "swipeHoney()", +"600440cb": "upgradeMaster()", +"60048290": "Kanzhang()", +"60063887": "transferDebt(address,address,address,uint256)", +"6006eb9b": "Demor(uint256,string,string)", +"6006f178": "WitdrawLenderProfit()", +"600720c2": "sponsoredJackpotAmount()", +"6007c4f8": "isTokenSaleOngoing()", +"6007c836": "setIndividualMaxCap(uint256)", +"60084004": "getRectangleArea(uint256,uint256)", +"6008fb07": "EtherGit(address)", +"60095dcb": "stopCharging()", +"60098088": "deleteCar(uint256)", +"6009eed3": "crowdSaleOpen()", +"600a686e": "setResponse(address,string)", +"600b1ff2": "setBlackBox(address)", +"600c200e": "ANIToken(uint256,string,string)", +"600c523b": "LogIssue(address,uint256)", +"600cf0d9": "getOrdersOfOwner(address,uint256,uint256,bool)", +"600d05ac": "XZARToken()", +"600d0beb": "isInRaffle(address,address)", +"600d7003": "retrieveTokens()", +"600da23a": "checkTimeBonusPercentage()", +"600de26a": "getDigitFromUint(int256,uint256,uint256,uint8)", +"600e0ee7": "getMySeeds()", +"600e85b7": "tokenGrant(address,uint256)", +"600f8cfc": "registerByList(address[])", +"60104cef": "createGame(uint256,uint256)", +"6010d60c": "lockomio()", +"60116397": "Registrar(address,bytes32,uint256)", +"6012042e": "verifyPayment(bytes32,uint256,uint256,uint8,bytes32,bytes32)", +"60136123": "NTToken()", +"6013aa44": "testControlCreateSameNonce()", +"6013d092": "tokenSaleLimit()", +"6014e37c": "getLLV_edit_15()", +"60154e85": "payComision()", +"60155673": "TEC_TEAM_WALLET()", +"601570ea": "getResponseString(uint256,bytes32)", +"6016db70": "getAssetMinAmount(address)", +"6016dd4a": "credentials(address)", +"60173ede": "FondoNetwork()", +"60175bcb": "ActivityCore(address,address)", +"6017bb61": "Death()", +"6017d51d": "testInt(int256)", +"6019061b": "createSale(uint256,uint256)", +"60192799": "steps()", +"60196008": "replaceLevel(uint256,uint256,uint256)", +"601a0bf1": "_reduceReserves(uint256)", +"601a0e77": "pseudoRandomUint8(uint8)", +"601ab918": "CashBetCoin(uint256)", +"601b349c": "removeCollaborator(uint256,address)", +"601ba73a": "setMainSale(uint256)", +"601cd624": "transfersAreLocked()", +"601d3910": "reconcile(address[],int256[],uint8[],bytes32[],bytes32[])", +"601d54eb": "ZTCrowdsale(address,address,address,uint256)", +"601ee75e": "SPINToken(address,address,uint256,uint256)", +"601fba02": "activateBuyback(uint256,uint256)", +"601fc832": "getObserverAtIndex(uint256)", +"6020b90a": "_internalTransfer(address,address,uint256,bytes)", +"6020d2c5": "_newSaddle(uint256,uint256,uint256,bool,address)", +"60213b88": "getInitialWithdrawal()", +"60214c6f": "test_method()", +"60217267": "stakedBalance(address)", +"60219c7b": "totalTokensForSale()", +"6022e6f8": "createProposal(address,uint256,string,bytes)", +"602451ea": "showAuthorizerOneAmount()", +"60246c88": "getPoolInfo()", +"60249827": "Puzzle()", +"602501a1": "SGD_Omnidollar()", +"602512e1": "setDifficulty(uint256)", +"6025d3e5": "finalizeAll()", +"60261ce6": "deadlinePreIcoOne()", +"6026bb86": "battleUnitIdRange()", +"6026c151": "offerGanTokenForSale(uint256,uint256)", +"60274396": "createDutchAuctionToBuy(uint256,uint256,uint256,uint256)", +"60281080": "HBVToken()", +"6029755e": "_generatePersonalNumber(string,uint256)", +"60299843": "minWeightDeduct()", +"6029b13f": "collect(address,address,uint256,bytes32,bytes32,uint8)", +"6029bf9f": "distributeFees(uint256)", +"6029d66f": "setRecoveryContract(address)", +"6029f53f": "getOrderTakerTokenAmount()", +"602a3fee": "sendMiningProfit(address[],uint256)", +"602acca1": "InchainICO(address[],uint256)", +"602b7001": "updateRefundApplications(address,uint256,bool)", +"602bc62b": "getUnlockTime()", +"602cd226": "DelayedPayment(address,uint256,address)", +"602cf359": "IOXToken()", +"602d7d62": "stateFail(uint256)", +"602e2533": "_fee(uint256)", +"602e496c": "fundcruVaultLockTime()", +"602e6623": "minePool()", +"602ea880": "AlphoTestTokenCoin()", +"602fbd79": "afterCrowdSale()", +"603066a4": "foundationReserve()", +"60312cdd": "LazyToken()", +"60316801": "getTokenMetadata(uint256)", +"6031749c": "updatePassport(address,uint256,bytes32,bool)", +"60319f71": "EOEToken()", +"6032f4a6": "fulfill()", +"603318ad": "getContributions(uint256,address,address)", +"60339c7b": "resetUserPromoBonus(address,address)", +"6033abd5": "CafePayed()", +"6033cdc6": "voteToUpdateMaritalStatus()", +"60344938": "changeCongress(address)", +"603510cb": "USDYToken()", +"60351748": "genericAction(bytes32[],address)", +"603546b9": "UnMint(address,uint256)", +"603553df": "ReederemEvent(address,uint256,uint256,uint256)", +"603601d5": "esercita_potere_pubblico()", +"60368a33": "totalBribery()", +"60368f30": "XLedger()", +"603709e3": "get10Characters(uint16)", +"60393a55": "addPeriod(uint256,uint256)", +"6039c60c": "fiveTimes(address,uint256)", +"6039fbdb": "addTokens(address,uint256)", +"603a552e": "engineer()", +"603c1370": "onNewLoan(uint256,address,uint256)", +"603c5e52": "SetCreditsPerEth(uint256)", +"603ccf5e": "AMBASSADOR_SEVEN()", +"603d1b98": "guardian1()", +"603d1d1c": "setSellOpen(bool)", +"603d1ed9": "createdOn(uint256)", +"603daf9a": "getBuyer()", +"603e3a40": "bulkBuy(uint8[],bytes6[],uint32[],uint32[])", +"603f4d52": "saleState()", +"60425c48": "TokenSellPercentage()", +"604269d1": "isMain()", +"6042a760": "icapTransfer(bytes32,address,bytes32,uint256)", +"6042fbe1": "maxPower_()", +"60434dcf": "getGitHub()", +"60445142": "depositCntr()", +"604497a2": "_transferFrom(address,address,uint256,bytes,bool)", +"6044ce6e": "cancelAgonForce(uint64)", +"60456068": "appreciationStep()", +"60457034": "setVerificationStatus(bytes32,bool)", +"6045804f": "delManager()", +"60464627": "totalWithdrawals()", +"6046c37f": "activateEmergencyProtectedMode()", +"6046d718": "loggedTransfer(uint256,bytes32,address,address)", +"6046f71d": "getProposalEthReward(bytes32,address)", +"6047a00e": "bonusTokensPool()", +"6047f7f5": "getTotalBmcDaysAmount(uint256)", +"60483a3f": "submitEtherProposal(uint256,string)", +"6048e89e": "setEthToBeClaimed()", +"60493ea4": "ico4Raise()", +"604a4bc8": "createTrackFromBack(bytes32,uint256)", +"604a4f9d": "regularTicketPrice()", +"604a6fa9": "Random()", +"604aa2cb": "backResiliumOwner()", +"604b2399": "_hasFlag(uint256,uint256)", +"604bf292": "safeSubtrNCP(uint256,uint256)", +"604c0b60": "transferBuyer(address,uint256)", +"604c7ef4": "BCBtuCoin()", +"604ca461": "addStory(bytes12,bytes12,uint256,uint256)", +"604cc1a5": "startGiveaway(uint32,uint256)", +"604ce56c": "MAX_ACTIVE_CANVAS()", +"604d3943": "poolCut()", +"604e3588": "SmartDollar()", +"604e4732": "tryFinializeLastProposal()", +"604e5fb8": "structureIco(uint256)", +"604e7af6": "totalDropTransactions()", +"604f87d8": "transferFromCallGas()", +"604f90a8": "getGladiatorChestAvailable()", +"604fc446": "getAddOnNeeded(uint16)", +"60500245": "registerName(string,bool)", +"60506aff": "initialDeposit(address)", +"6050eeb4": "_createLibrary(string,string,address,address,uint256,uint256)", +"6051c7cd": "acquireTokens(uint256,uint256,address,uint256,address)", +"6051fa2c": "logTradingProceedsClaimed(address,address,address,address,uint256,uint256,uint256)", +"60521116": "showPoolInfo(uint256)", +"60528e7b": "proxyWithdraw(address)", +"6052a22b": "toTimestamp(uint256,uint256,uint256,uint256,uint256)", +"6052a849": "getEtherToBuy(uint256,bool)", +"60536172": "takeOwnership()", +"60542557": "SmartExchange(string,string,uint8,uint256)", +"60546602": "isAbsent(bytes32)", +"6054da0b": "setNextCommonTTMTokenId8(uint64)", +"60566675": "LeoCoin()", +"6056969b": "announce(bytes32)", +"6057361d": "store(uint256)", +"60577043": "tixFund()", +"6057f2ca": "addDealer(string,address,uint256)", +"60583488": "get_info()", +"60585358": "getByte()", +"60589137": "ListingCancelled(bytes32,uint256)", +"60595433": "Pass()", +"6059838b": "tierTwoPurchase()", +"605a18c2": "setTokenTransferFeeProp(address,address,uint256)", +"605a42db": "superDragon(uint256)", +"605a8ea3": "AvailableCommission()", +"605ae1d0": "BIDTToken(address)", +"605b24be": "gcard(uint256,address)", +"605c0209": "ZorffToken()", +"605c2dbf": "ManagerChanged(address,address)", +"605c43de": "getBetById(uint256)", +"605cee71": "delWallet(uint256)", +"605de51d": "getTotalSponsorship(uint256)", +"605e5ee1": "delWhiteList(address)", +"605f2ca4": "distributeTokensToContributorByIndex(uint256)", +"605ff295": "CelebrityToken()", +"60608438": "setCurrentAndNextSnapshotBalance(address,uint256,uint256)", +"60616ae2": "BllotPro(bytes32[])", +"6061d692": "month30Unlock()", +"60621984": "Mining24(uint256,uint256)", +"606224f8": "sendPendingAmounts(uint256,uint256,address)", +"60643652": "maxEntrants()", +"6064d863": "revealedCeilings()", +"6065140b": "setKYCVerificationContract(address)", +"60654e47": "getLotteryBalance()", +"60659a92": "tokensAvailable()", +"6065fb33": "genesisAddress()", +"60662fe2": "TOKENS_TOTAL_SUPPLY()", +"60668e58": "getData_5()", +"6066b066": "isSaleMarket()", +"6066ed11": "getCombatsCount()", +"6067be79": "getInvestedSumToRound(uint256)", +"60689557": "Rock()", +"6069272c": "getAllEntityIds()", +"60694549": "withdrawUserPrize()", +"60699026": "mulSafe(uint256,uint256)", +"60699d92": "createPersonalTime(address,uint256)", +"606a1f7a": "EtheremonTrade(address,address,address,address)", +"606a405e": "getAddressPlayNumber(uint256,uint256,uint256)", +"606a7f01": "Addr4()", +"606a9584": "_forwardPoly(address,address,uint256)", +"606aed30": "withdrawOwedToken(uint256,uint256,uint256)", +"606baff8": "minCrowdsaleAllocation()", +"606bc9a5": "setOwnerHoverText(address,uint256[2])", +"606ce3bf": "set(uint256,uint256,uint256,uint256)", +"606d0d14": "executeOffer(uint256,bytes)", +"606d2e96": "battles(uint256)", +"606d55b1": "getY(uint256,bool)", +"606da54e": "XBLContract_addr()", +"606dc104": "openRaceCount()", +"606deecd": "requestData()", +"606ec65d": "TransferUpdated(address,uint256)", +"60702417": "MakeERC20(uint256,uint256,string,string)", +"60704108": "getAssetProxy(bytes4)", +"60708ae3": "issueAndCommit(address,address,uint256,uint256)", +"6070f1be": "NodeMCU_Endpoint()", +"60711058": "getUserDeposit(address,uint256)", +"6071eb5c": "ecosystemReserve()", +"60721b7c": "debitAmountToRefund()", +"607267d3": "getPlayerRoundDividend(address,uint256)", +"60726abb": "copy()", +"60727416": "newUserFrom(address,string,string)", +"6072ec64": "auditData()", +"60733572": "setUnicornToken(address)", +"60734859": "changeSaleTokenLimit(uint256,uint256)", +"6073660a": "findNextDay(uint256,bytes2)", +"60737a7c": "FaucetToken(string,string,uint8)", +"6073d045": "userDepositedWei(address,address)", +"6074123c": "AthlierToken()", +"607485fe": "firstYearMinedTokenCap()", +"6074b806": "updateOrderbook(address)", +"607531b6": "bitownToken()", +"6075eb7d": "openChest(uint256)", +"6076a3d5": "setEarlyParams(bool,uint256,uint256)", +"60771261": "scalarBaseMult(uint256)", +"6077759c": "bubbleSortAllMatches()", +"6078268b": "advisorsTokens()", +"60785bd1": "easyUpdateMatriarch(address)", +"6078b87e": "communityPeriodLength()", +"60795d80": "requestAllowance()", +"607a124f": "setAttrs(address,address,address,uint8,uint256,uint256)", +"607af216": "getRepresentedDTH(address)", +"607afbb5": "mySum(uint256,uint256)", +"607b463a": "getCash(address)", +"607b9169": "toOwner()", +"607b9f97": "safetyWallet()", +"607cbaff": "viewPetitionShareholder(uint256)", +"607d35c4": "uint5ToStr(uint256[5])", +"607db616": "tokenAllocate()", +"607dbae5": "ProofOfIdleness()", +"607dc1d6": "createNewCSCResource(string,string,uint256)", +"607eaf70": "investorBankroll()", +"607ecd96": "checkAccBalance()", +"607fa5a4": "updateRequired(uint256)", +"60805e5a": "unlockAddress(address,bool)", +"60808037": "numTokensForContributor(uint256)", +"6080af05": "setVoterStakesContract(address)", +"6081f5cb": "calculateBonus(uint256)", +"60820d80": "getOwnedTokens()", +"60827be8": "IDChain()", +"60829f8a": "unstake(address,address,uint256)", +"6082a02c": "getPriceIdv(bytes32)", +"6082a6ad": "Punani()", +"60834493": "Veetune(uint256)", +"60836aa4": "changeDevCut(uint256)", +"6083e59a": "maxDeposit()", +"608427e6": "ApolloSeptemTokenPurchase(address,address,uint256,uint256)", +"608458eb": "TOKEN_FOR_SALE()", +"6084747f": "mostRecentBlock()", +"60851f28": "viewThirdLotOfClauses()", +"6085e6af": "tokenSellData()", +"6086e22f": "calculateInitialPayerDeposit(uint256)", +"608716ad": "CryptoMoviesToken()", +"60874b27": "SpankICO()", +"60887081": "IEOStarted()", +"6088a917": "artworkRegister()", +"6088caf3": "tier4Time()", +"608980eb": "intervalsAt(uint256,uint256,int256)", +"6089e3c4": "BitCashPlatform()", +"608a0ff0": "transferBet(address,address,uint256)", +"608bc08c": "airDrop(address,address,address[],uint256,bool,address)", +"608bd7f4": "setLong(address)", +"608be57f": "_startNextAccountingPeriod()", +"608cadb8": "Goldmint(address,address,address,address,address)", +"608cb457": "SLACK_PERIOD()", +"608cc40a": "createRules(address,address[])", +"608d031a": "checkMiningActive()", +"608d576b": "getMultiRequestRegistrar(uint256)", +"608d670a": "XfStandardToken(uint256,string,uint8,string)", +"608e7fa6": "addAlias(bytes32,address)", +"608e9122": "InbestToken()", +"608eaa6a": "setFiscalVerify(bytes32,uint256,uint256,uint256)", +"608eba96": "_createCard(uint256,uint256,address,address)", +"608f102e": "District0xContribution(address,address,address,address,address[])", +"608f1f7e": "DGDTalk()", +"608fc07a": "updateSalesWallet(address)", +"60900c88": "coinprice()", +"60909c51": "closeDataResponse(address,address,bool,bool,bytes)", +"6090befe": "setCompanyWalletAddress(address)", +"60913244": "botOnSale(uint256,uint256)", +"6092019a": "MAX_FUNDING()", +"6092e55b": "createCDPLeveragedDai(uint256)", +"60938601": "approveOnly()", +"6094fae8": "finishTransfer(uint256)", +"609526c2": "generateRandomNumber(uint256,uint256)", +"60953744": "Mul(uint256,uint256)", +"60958192": "getProposalTTL()", +"6095c2d5": "setExchangeCommissionAddress(address)", +"60961955": "addFakeVisitors()", +"609619b4": "SecurityDepositRegistryReplaced(address,address)", +"60965dc0": "firstRoundWMStart()", +"609669eb": "StopIcoManually()", +"6096bbde": "_getGameAuctionGap()", +"60970da4": "updateCustomer(address,string)", +"609725ef": "getCurrentPassportLogic()", +"60972a84": "reissuedTransactions()", +"60975988": "PING_ORACLE_INTERVAL()", +"60979759": "p_setOwner(address)", +"6097bca9": "atnSent()", +"60994bb0": "_createRoc(uint256,string,uint256,address)", +"6099af40": "setConfigBool(bytes,bool)", +"6099ecb2": "pendingRewards(address,uint256)", +"609a54b0": "get_all_sellable_token()", +"609ab538": "newSchellingRoundEvent(uint256,uint256)", +"609ada00": "logEntropyTxDetails(string,uint256)", +"609b5785": "_mainsaleSupply()", +"609b8394": "setAnimator(address)", +"609ba988": "approveAdvertiserCharges()", +"609bdc71": "MintableMultiownedTokenTestHelper(address[],uint256,address)", +"609bec67": "period3Denominator()", +"609bf323": "VestedTokenMock(address,uint256)", +"609bf6ba": "GetGuestCount()", +"609d2bc5": "oraclize_setConfig(bytes)", +"609da897": "setupCompleted()", +"609df32f": "listNode()", +"609e5ca4": "getTournamentAmt()", +"609ec605": "toBytes(bytes4)", +"609f8fe2": "verify(string,uint8,bytes32,bytes32)", +"609f9a8e": "betFromGame(uint32,bytes32)", +"609ff0fb": "developersRecipient()", +"609ff1bd": "winningProposal()", +"60a10fa7": "setBridgeHeight(uint256)", +"60a11672": "safeTransferFromWithData(address,address,uint256,bytes)", +"60a1623f": "_withdraw(string,string,bool)", +"60a1f397": "_evaluateArea(address,uint8,uint256)", +"60a22932": "totalSaledToken()", +"60a22fe4": "nextMinimumBond()", +"60a31921": "dividendsOf(address,address)", +"60a4a929": "Assigned(address,uint256,uint256)", +"60a4d104": "dteamVaultAddr2()", +"60a4d1a5": "AddNewCard(uint32,uint32,uint8,uint16,uint16,uint16,uint16,uint32[])", +"60a4d599": "getPreICOLength()", +"60a59bdb": "random_number()", +"60a60fd8": "testProxyCallWithValue()", +"60a64947": "getAdv(address)", +"60a703ea": "ReceivedOwnership(address)", +"60a72c29": "getAppData(address)", +"60aa0e1c": "ICO_token_supplyCap()", +"60aa6b9e": "changeDueDate(uint256)", +"60ab5852": "issueTokens()", +"60acf888": "token_transfer(address,address,uint256)", +"60ad2391": "settlement(uint256)", +"60ad5bd0": "getCountrySpots(uint16)", +"60ad970d": "getLoansForAddress(address,uint256)", +"60ad9d7b": "burnByAddress(address,uint256)", +"60ae1eb5": "buySaleCardFromSys()", +"60aeac18": "neverPayBack()", +"60aef331": "buyTokensBonus(address)", +"60af9f91": "masterRecruitment()", +"60b0b0f0": "contribute(uint256,address)", +"60b1e057": "EVMSCRIPT_REGISTRY_APP_ID()", +"60b1e173": "getProof(uint256,address,address)", +"60b2a56a": "drawWinner(uint256)", +"60b35739": "_multiMint(address[])", +"60b38880": "TemperatureMeasurementA(address,int8,int8,uint16,string)", +"60b431a4": "testGetSig()", +"60b4a8fd": "getLastBidId()", +"60b6aa92": "privateIcoEndTime()", +"60b6ff5c": "ioucoin()", +"60b73223": "refundMoney(address,address)", +"60b7b3f6": "getCurLotIndex()", +"60b82e2e": "getRandomNumberList()", +"60b831e5": "cancelCall(bytes32)", +"60b95da5": "YclDoCoins(uint256,string,uint8,string)", +"60b99afb": "getIconiqMaxInvestment(address)", +"60baabf3": "nizk_setup()", +"60bba03d": "setTeamMember(address,bool)", +"60bc59b7": "__addressToString(address,address)", +"60bc5a06": "airdropManually(address,uint256)", +"60bce2f4": "usdPerEth()", +"60bd409e": "setAllowSellLands(uint16)", +"60bd7a9d": "statuses()", +"60bddc04": "getRateScore(uint256)", +"60be3547": "newLottery(uint256,uint256)", +"60be5f70": "newUser(address,bytes20,uint64)", +"60bea672": "createPorscheTicket(address,uint256)", +"60bebe98": "translateTileToWidth(uint16)", +"60bf1d2f": "ownsHive(address)", +"60bf46ea": "setQuotePriority(address,uint256)", +"60bf4dd5": "PGO_INTERNAL_RESERVE_CAP()", +"60bf9a84": "getbetData(uint256,uint256,address)", +"60bfe04e": "setRewardOpen(uint256)", +"60bff45c": "_addHolder(address)", +"60c1461f": "setNewICOTime(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"60c17d1d": "freedWosPoolForSecondStage()", +"60c17eec": "eventPaid(address,uint256,uint256,uint256)", +"60c1e433": "getSellerTransaction(address,uint256,uint256)", +"60c20c16": "addOffer(string,uint256,address)", +"60c2db45": "walletTwitter()", +"60c2f663": "toUINT128(uint256)", +"60c311fd": "doBurnFromContract(address,uint256)", +"60c31544": "exporterReceivedPayment()", +"60c326ea": "setModel(address)", +"60c46821": "fundContractForRefund()", +"60c5cc3a": "acceptProposal(uint256)", +"60c6171c": "calculateGoldBuySimple(uint256)", +"60c66c5c": "maxNumOfPayoutCycles()", +"60c677ff": "commanderAlive()", +"60c6b3a5": "claim(bytes,address,uint256,uint8,bytes,bytes)", +"60c6ccb2": "removeMonsterIdMapping(address,uint64)", +"60c6ec6f": "validState()", +"60c71546": "enableTransferEarlier()", +"60c72285": "submitRemoveOwnerTransaction(address)", +"60c79d00": "setNumTranscoders(uint256)", +"60c7bb5a": "host_lottery(bytes32)", +"60c7d295": "cache()", +"60c82d6f": "addAddressToWhiteList(address,address)", +"60ca46cd": "toTokens(uint256)", +"60ca6890": "_submitTransaction(address,uint256,bytes,bytes,address,uint256)", +"60cb5fac": "deleteChannel(bytes32)", +"60cb66d0": "sum(int256[])", +"60cb8884": "TokenBank()", +"60cb96be": "CollectibleIndex0()", +"60cc2e8c": "maxGoalReached(uint256)", +"60cce8a5": "getValuableTokenAmount()", +"60ccf311": "getPlayerMerits(address,uint256)", +"60cd4ba4": "getTimeBasedBonus(uint256)", +"60ce03d5": "totalTokenIssued()", +"60cf7133": "testSetPermissions()", +"60cfc624": "setLLV_edit_26(string)", +"60cfd359": "mainSale()", +"60d12fa0": "getExecutive()", +"60d1c056": "usedPaymentSupply()", +"60d1ce36": "collectibleIndexToApproved(uint256)", +"60d26f01": "ownerTransferWei(address,uint256)", +"60d2bee9": "addArtistSignature(uint256,bytes)", +"60d3b4b0": "frwd()", +"60d3e4c5": "isDistributionInProgress()", +"60d4c79b": "burnOneBroGlobal(uint256)", +"60d50130": "FineArtsToken(uint256,string,string)", +"60d586f8": "getValue1()", +"60d60d2e": "countcomp()", +"60d60dad": "mainSaleFirstEndDate()", +"60d63425": "StakePool(string,string,uint8,uint256,uint256)", +"60d704db": "getBank()", +"60d8c2d2": "oneTokenWei()", +"60d938dc": "isPresaleActive()", +"60d975c9": "GG()", +"60d9c823": "removeClientAuthority(address)", +"60d9f0a8": "setNotarius(address)", +"60da4bd7": "batchCancelVoteForCandidate(address,address[],uint256[])", +"60dab6be": "ActionAgon()", +"60dccd89": "getContentAccount(uint256)", +"60dd5f90": "getPolicy(string)", +"60ddd8e8": "sumICOStage2USD()", +"60dddfb1": "votingWeightOf(address,uint256)", +"60dde4c2": "queueFront()", +"60de94d0": "setCCH_edit_11(string)", +"60e036a0": "EtheremonAdventurePresale(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"60e092c6": "cancelOrder(address,address)", +"60e11e16": "Lira()", +"60e232a9": "changeVault(address)", +"60e2f6e8": "createProxyAndCall(bytes)", +"60e30a02": "ChinaInvestmentExchangeToken(uint256,string,uint8,string)", +"60e393c6": "DEVELOPER2()", +"60e39f73": "PotatoToken()", +"60e45f04": "UBSexToken()", +"60e474e3": "_issue(address,uint256)", +"60e4c1ac": "LogReceived(address,uint256)", +"60e519c0": "computeMarginAmount()", +"60e587f9": "goldReward()", +"60e5ef3a": "getPrice(uint8,uint8)", +"60e65bb8": "startTrading(bool)", +"60e68a25": "dash()", +"60e6cfd8": "addKey(bytes32)", +"60e6fb26": "resumePurchases()", +"60e708b3": "balanceOfUnlockTokens(address)", +"60e794de": "stageDataStore(uint256)", +"60e7a381": "o_aprendiz(uint256)", +"60e805c5": "LogMigrationCanceled(address,address,address)", +"60e85674": "checkLogin(address)", +"60e99b77": "getProposalState(bytes32,bytes32)", +"60e9c78b": "isNeedCheckTickets()", +"60e9f17e": "CRDToken()", +"60ea110b": "fromToken(uint256,uint256,uint256)", +"60eabebd": "CreateAPP(address,uint256)", +"60eb2826": "Badge()", +"60ebb498": "adminCancelWithdrawal(address,uint160,string)", +"60ec4f73": "starVoting(uint256,uint8)", +"60edc4c4": "timeOf(uint256)", +"60ee66c9": "setSubcontinentDiscoveryVotingContract(address)", +"60ef6037": "buySaddleShop(uint256)", +"60f01452": "updateEggs()", +"60f14509": "hodl()", +"60f17941": "tokensGranted()", +"60f1d148": "getMaximumBetAway()", +"60f247b5": "confirmTransaction(uint256,address)", +"60f2b9af": "setDocumentData(string,string,string,string,string)", +"60f2e1c0": "buyAndCrave(string)", +"60f2f673": "setcoe(uint256)", +"60f38d91": "endEarlyStage1()", +"60f5ac86": "campaignOpen()", +"60f5d0d8": "ReloadKeys(uint256,uint256,uint256)", +"60f61a4c": "buyUnitRaffleTicket(uint256)", +"60f66701": "useCoupon(string)", +"60f69dc0": "partnerReservedSum()", +"60f6e71d": "KuendeToken()", +"60f6fb2e": "chunkedWeiMultiple()", +"60f75530": "countRemaining()", +"60f75f3b": "closeMarketOrder(uint256)", +"60f8af90": "refundRound()", +"60f8bbb8": "setPuppySports(address,address)", +"60f8dab7": "userRefund()", +"60f8e036": "manageStatus()", +"60f96a8f": "parent()", +"60fb4aa0": "founder4Wallet()", +"60fd0668": "WAVcoin()", +"60fd0e91": "mintlist(address[],uint256[])", +"60fd1e66": "_movePendingToSetting(uint256,uint8)", +"60fd902c": "gnosisToken()", +"60fdd1c9": "setStakeRate(bytes32,uint256)", +"60fdf8ff": "GameEnded(uint256,uint256,uint256)", +"60fe103e": "logFeeWindowMinted(address,address,uint256)", +"60fe136e": "BogdanoffCoin()", +"60fe47b1": "set(uint256)", +"60fece43": "percentForTeam()", +"60ff77cc": "ledgerRecordAdd(uint256,bytes32,uint256,string,uint256,bytes32,uint256)", +"61001cd3": "testIsStarted()", +"61004364": "depositTokenTo(address,address,uint256,uint256)", +"6100b1e1": "resetDiscounts()", +"610103d9": "changeTxFee(uint256)", +"61012e15": "phaseLength()", +"6101a1f7": "unitStealingCapacity(uint256)", +"6101d16b": "getNumberOfSharesForAddress(uint256,address)", +"6101d4f5": "payTheMan(uint256)", +"6101f748": "FundsRegistryWalletConnector(address[],uint256)", +"61025532": "permitBurning(bool)", +"61027f78": "paying()", +"610285d2": "testControlRetractLatestRevisionDoesntHaveAdditionalRevisions()", +"6102c049": "getBatchNumber(address)", +"6102d419": "getEthForMetResult(uint256)", +"6102e4e4": "verifyProof(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[11])", +"610358ae": "removePrivelegedWallet(address,address)", +"61039bef": "releaseLocked(address)", +"6103ae75": "AGENCY_ADDR()", +"6103d70b": "withdrawPayments()", +"6103d915": "Winners(uint256)", +"6103dda6": "mutate(bytes32,bytes32)", +"6104464f": "previousPublishedVersion()", +"61046d8b": "setRLCPerETH(uint256)", +"61047ff4": "fibonacci(uint256)", +"6104d75a": "deathData_f13()", +"61050bb7": "_fetchPaidOrdersForPayer(address)", +"61053cd3": "tokensByUsdTx(string)", +"6105b499": "artCopyright()", +"6105c8af": "stubFunction(address,uint256)", +"61064b48": "GetInvestorAddress()", +"61064b5a": "processMarkings(address,uint256)", +"61066dc3": "enableServiceMode()", +"610757e4": "_wallet()", +"6108b5ff": "channel_deposit_bugbounty_limit()", +"6108bd0e": "sowCorn(address,uint8)", +"61096820": "CETH()", +"6109e255": "EtherSent(address,uint256)", +"6109ff33": "BihuaToken()", +"610af570": "voteOnDraft(bytes32,bool)", +"610b16ab": "onTransferStack(address,uint256,uint256,uint256,uint256,uint256,bytes32)", +"610b1abd": "lottery(uint256,uint256)", +"610bafaa": "getTotalBPOfAddress(address)", +"610bbebd": "Sensor()", +"610be654": "closeContract()", +"610c1d68": "addNtf(bytes32,uint256,address)", +"610c3009": "badgeName()", +"610cbcc7": "logHash(uint256)", +"610d006c": "getSourceConstraint(int256,uint256,uint256,uint256)", +"610d5de8": "validateEndowment(uint256,uint256,uint256,uint256,uint256)", +"610da891": "debug3()", +"610e9ed0": "postDisputeEth()", +"610efc86": "RegisterMine(string,uint256)", +"61101bed": "getTAmount(uint256,uint256)", +"611067a1": "Rate7()", +"6110e614": "duringSale(uint16)", +"61116d1d": "masternodeDeregister()", +"6111bd91": "cyberEntry2(address,bytes32)", +"6111ca21": "enroll(address,uint256)", +"6111dd02": "calcCostsSelling(uint256,uint8,uint8,uint256)", +"61129a80": "getEarlyIncomeMul(uint256)", +"6112c2ab": "summPartnerships()", +"6112c7c9": "RedirectChanged(address,uint256)", +"6112e8ac": "mint(address,uint256,uint8)", +"6113611f": "stakeVoted_Eth()", +"611408ff": "latestReleaseUrl()", +"6114dc0f": "lastFlight(address)", +"61150aae": "ethusd()", +"61161aae": "bury()", +"61162182": "storeDoc(string)", +"6116ec49": "VotingFinished(address,bool)", +"6117525b": "initialClaesOffering()", +"6117b80c": "getFixedAndShareFees()", +"6117c9db": "retainedTokensVault()", +"61186e23": "getCountdownDate()", +"611a20ae": "IotcToken(uint256,string,uint8,string)", +"611b4095": "isWhitelisted()", +"611c4662": "getPriceByDayIndex(uint16)", +"611c7f50": "Core()", +"611cb25f": "failStage()", +"611cb6aa": "Vault(address,uint256,uint256,uint256)", +"611daa7e": "EmergencyBalanceReset(uint256)", +"611eb470": "maximumICOCap()", +"611ef452": "cancelDelivery(string)", +"611efc09": "sale(address,uint256)", +"611f1fbe": "itsLikeChicago()", +"611f64f9": "setTokenPrice(uint128)", +"611f69de": "__proxy_motion(address,uint256,uint256,bytes)", +"611fd026": "showApproveToken(address)", +"61203265": "organizer()", +"6120ada7": "setAuto(uint256)", +"6120e125": "TUMIYUNTOKEN(uint256,string,uint8,string)", +"6120ffbc": "accountsPayableHeld()", +"61211087": "firstAuctionsHighestBidder()", +"6121e522": "teleportPrice()", +"612249fb": "communityContributionSupply()", +"6123218b": "registerPurchase(bytes32,address,uint256)", +"61235639": "AcreToken(address,address)", +"6123c63f": "removeEmbassy(address)", +"6123dfc3": "NoWinner(string)", +"6123f7ba": "onlyWithValidSignatureAndMethod(bytes)", +"61241c28": "setTokenRate(uint256)", +"612472fe": "toZT(uint256)", +"6124a577": "whitelistController()", +"6124e4e7": "dividendContract()", +"612544b3": "getReservedTokens(address)", +"6125fd20": "voteForRefund(bool)", +"6126cb99": "registerAsset(address,bytes32,bytes8,uint256,string,string,address[2],uint256[],bytes4[])", +"6127421d": "tokenPayments(address)", +"6127a1ad": "_setRarityValue1(uint256)", +"6127cfd9": "verify_withdraw()", +"6127f246": "getActiveTasks()", +"61282631": "tokenMintedSupply()", +"612845fc": "claimQueen(uint8)", +"612867c2": "calcRefund(bytes32)", +"6128a4f3": "investorsLosses()", +"61296540": "rewarded_refresh()", +"6129f25f": "setReferralPercent(uint256)", +"612a711f": "SimpleERC20Token(uint256,address)", +"612a7562": "setBountyRegistry(address)", +"612ab238": "balanceOfOnForHolder(address)", +"612acecc": "frozenForever()", +"612bfae2": "description4()", +"612c0968": "privateSaleRate()", +"612c56fa": "submitVote(uint256,bool)", +"612c9dea": "unreserveFor(address)", +"612d6061": "getExpectedMinReturn(address,address,uint256)", +"612d669e": "setMinStakingAmount(uint256)", +"612e45a3": "newProposal(address,uint256,string,bytes,uint256,bool)", +"612e731d": "TheGreatEtherRace(string)", +"612eb5e7": "revokePermission(uint8,address)", +"612ecc48": "MINIMUMCONTIB()", +"612ed785": "winningTeamIndex()", +"612ee726": "isOnAuctionToBuy(uint256)", +"612ef473": "betRevealed(uint256)", +"612ef6e9": "isRefundApplied(uint256)", +"612ef80b": "marketLiquidity()", +"612f2f37": "setMaintenance(bool)", +"612ff19e": "PolicyPool(address)", +"61301409": "minereum()", +"61309e2a": "tryFinalizeProposal(uint256,address[],bool,int256)", +"6130ced2": "UniCoin(uint256,string,string)", +"6130d537": "createPartnerPlayer(uint256,uint256,uint256,address)", +"61314ee3": "managerAddressMap(address)", +"6132ca1a": "getResult(uint32,int8)", +"6133a0eb": "PRE_SALE_300_ETH()", +"61347782": "getStakingRegistry()", +"6135a0ad": "getCallback(bytes32)", +"6135e084": "myDividendTokens()", +"6135f602": "contractPartTwo(uint256)", +"61362b68": "reInitialize(address,address)", +"613696eb": "burnCadvsLeftInRefunding()", +"6137412c": "monethaGateway()", +"6137d670": "submitWhitelistRemoval(address[])", +"6138889b": "distribute(address[])", +"61389e8b": "getTokensManual(address)", +"6139a008": "numTokensLimit()", +"6139faa6": "getAllTimes()", +"613a626b": "SnipCoin()", +"613aa6e7": "ResetCardPriceAdmin()", +"613bc081": "ExternalAccountWalletConnector(address)", +"613c36ae": "sendToStocks()", +"613d8fcc": "oracleCount()", +"613de7cb": "subWizard()", +"613e0fb8": "reservationWallet()", +"613e2de2": "getContractInfo(bytes32)", +"613f4594": "totalBetAmount()", +"613f5b9f": "TokenContractAddress(address,address)", +"613f5fe8": "MAX_USER_TOKENS_BALANCE()", +"613f7665": "getClosedSaleWallet()", +"613f8dac": "sellShitClones()", +"613fd87a": "calcBigPromoBonus(uint256)", +"613fd998": "messageSpecial()", +"613ff46f": "rewardPerNode()", +"6140128f": "getTupleDetails()", +"61402596": "setInitialSupply(uint256)", +"6140af43": "preICOcollected()", +"6140c54c": "createProxy(address)", +"6140ca78": "setIsMiningOpen(bool)", +"6141b54b": "FundsWithdrawn(uint256,address)", +"6141d5d0": "CoffeeToken(address)", +"6142101a": "last_buyer()", +"61425d79": "numRequesters()", +"61426df4": "STCListing()", +"6142e78f": "allowedAmountTransferedToPoolTotal()", +"6142ff70": "createShipment(address,string,string,int256,int256,uint256,uint256)", +"61432e81": "ConsumeGas(uint256)", +"6143a80a": "isGameEnded(bytes32)", +"6143abba": "totalCreatedOfType(uint256)", +"6144a8a1": "ZJFPrivate()", +"61461954": "execute()", +"61463838": "getMyPlumbers()", +"61463b64": "_hashToAscii(bytes32)", +"61465a32": "distribute(uint256,uint256,uint256,uint256)", +"61472fd4": "CSGOBets()", +"61476d55": "GetTotalAmountForMultiplicator()", +"614781f9": "atkBoss(uint256)", +"6147a55c": "SwapPaused(uint256)", +"6147bcb9": "getPVPState()", +"6148fed5": "pollMap(uint256)", +"614939b2": "allocateTokensForTeam()", +"61493b97": "set_minimum_payment(uint256)", +"61494714": "_createNewGame(uint64)", +"61496b83": "endSplitAgreement()", +"614984d1": "getUnicornGenByte(uint256,uint256)", +"614a31bf": "setII_R2(uint256)", +"614af914": "_updateMargins()", +"614b3e7f": "BCSToken()", +"614baf5c": "withdrawAffiliateRewards()", +"614bbc33": "privateContribution(address,uint256)", +"614be0c4": "getRemainShareAmountInternal(address)", +"614cb904": "isFinalizeAgent()", +"614d08f8": "CONTRACT_NAME()", +"614d5f07": "stepForPrice()", +"614d85e1": "timeOut()", +"614f2b3a": "_diff(uint256,uint256)", +"614f3994": "SpeedyNetwork()", +"61515334": "returnUserAccountAddress()", +"615155dd": "getVesting(uint256)", +"61523f2e": "changeEthReward(uint256)", +"61537010": "Whitelisted(address,uint256,uint32)", +"6153b827": "BancorHandler(address)", +"6154274d": "deleteProposal(string)", +"61543801": "currentPeriodIndex()", +"6154c16f": "MineOwner(uint256)", +"6154db6e": "UroToken()", +"61558349": "BitTeamToken()", +"615664ba": "Market()", +"6156e892": "checkOnlyContractOwner()", +"61571ddd": "distributionFinishing()", +"6157c5ec": "getGoldInfoSku(address)", +"615815f5": "releaseSecondUnlock()", +"61584936": "sealedBids(bytes32)", +"615878c8": "SkrumbleCandyToken()", +"61591a7c": "personUpdateDOB(uint256,int256)", +"61592b85": "getOrderDetails(uint32)", +"615a4e0f": "ChangeMainAccount(address)", +"615a604f": "setMarketer(address)", +"615acbae": "Freeze()", +"615af5fb": "areTokensSended()", +"615c2971": "Gametest()", +"615dbebb": "setContract(address,address,address,address)", +"615df83a": "remainderHolder()", +"615dfa5c": "defaultParams()", +"615ea899": "changeHello(string)", +"615ef639": "tokensClaimedAirdrop()", +"615f9f1f": "testFailTransferNotEnabled()", +"615fa416": "totalAtom()", +"61616292": "STCBonus(uint256,uint256)", +"6161eb18": "_burn(address,uint256)", +"61625c3a": "setLockByPass(address,bool)", +"61632d4d": "institutionStageSetting()", +"616361a7": "getArrUintField3()", +"61638ed5": "depositFunds(uint256,uint256)", +"61641bdc": "add(bytes32,address)", +"61649472": "getPoolFreezePeriod()", +"6165234c": "setPermissions(address,bool)", +"61665e40": "_premoveByValue(address)", +"61669dfa": "setSpecialBonus(address,uint256)", +"61679629": "UniversalRewardProtocolToken()", +"616852e9": "GoldBought(uint256,address,bytes32,string,string,bytes32,string,string,bool)", +"61688a85": "Lwcoin()", +"6168ba3c": "getWeiAggregateMayInvest()", +"6168c9c3": "tosell(address,uint256,address,uint256,address,uint256,uint256)", +"6169a7ed": "CashForHardwareReturn()", +"616a0997": "TokenPurchase(address,address,uint8,uint256,uint256,uint256,uint256)", +"616a3420": "verifySig(bytes32,bytes,bytes)", +"616a6371": "SingleAccountRules(address)", +"616b40e3": "totalInvest()", +"616b59f6": "deleteBytes(bytes32)", +"616b829d": "SwappedTokens(address,uint256,uint256)", +"616c9469": "Finalized(address,uint256,uint256)", +"616ceda7": "setJOYTokenAddress(address,address)", +"616d1fab": "distributeToAlternateAddress(address,address)", +"616d5058": "userAccounts(uint256)", +"616d50c3": "GCToken()", +"616dcf0c": "calculateTotalSupply(uint256)", +"616e2fd0": "FortaToken()", +"616e9f8f": "getInterval(uint256)", +"616eba4a": "getLocksrootIdentifier(address,address,bytes32)", +"616f7bc9": "addAddressesSet(address)", +"616fbee7": "changeMinimumBet(uint256)", +"616fca9b": "adopt(address)", +"616fe92a": "emitFeePoolUpdated(address)", +"616ffe83": "read(string)", +"61708908": "prepareDisputeValid()", +"6170a23e": "transferTech(address)", +"6170b162": "join(bytes)", +"6170feec": "getWinIndex(address,uint256)", +"61711115": "RegistrationStatusChanged(address,bool)", +"61718141": "totalSupplyIsLocked()", +"61719785": "clockmaker()", +"6171d7fc": "adjustTotalCoins(int32)", +"61725795": "setAquaman(address)", +"6172c0df": "updateDeposit(address,uint256,uint256)", +"6172f071": "setIsAllTransfersLocked(bool)", +"6173a70c": "initRandom(address)", +"6173e456": "setAMLWhitelistedBulk(address[],bool[])", +"617421c9": "calTripleRoom(uint256,uint256,uint256,bytes32)", +"61751577": "addCET6(uint32,uint64,uint64,uint64,uint16,uint16,uint8,uint8,uint8)", +"6175adee": "icoStandardPrice()", +"6175bc9c": "preStartBlock()", +"6175f9e2": "dragonHandler(uint256)", +"617605a1": "Zillion()", +"61764f59": "BitDATAToken()", +"6176caed": "HeroTrained(uint256,address,uint256,uint256,uint256,uint256,bool,uint256)", +"617708dd": "getEscapeRequest(uint32,int256)", +"61774704": "verifyBid(bytes32,bytes32)", +"61775ee1": "onlyBouncerRemoveExtension(address)", +"6177a197": "GoGoPay()", +"6177fa04": "setGenerateAddr(address)", +"6178a8b1": "splitStarFunds()", +"6178ac90": "_createCompanies(bytes32[],bytes32[])", +"6178efee": "returnToken(uint256)", +"617914be": "AUTH_CHANGEOWNEDOWNER()", +"61794267": "oldExecuteDecayFunction(uint256,int256,int256,uint256,uint256)", +"61798287": "safeToNextIdx()", +"6179ed72": "ProofOfSecret()", +"617a0951": "feeModifiers()", +"617a2a15": "icoStartP2()", +"617ac9a1": "SOSRcoinToken()", +"617b293e": "getInvestStatus(uint256)", +"617b390b": "approvePreSigned(bytes,address,uint256,uint256,uint256)", +"617bb8f5": "reject(uint32,uint32)", +"617c2fb8": "sell_Exchg_Reg(uint256,uint256,address)", +"617d2c84": "PRIMEx()", +"617d3c47": "RemovalPriceSet(uint256)", +"617d6bb4": "distributeEarningsBasedOnNumberOfCells(address,address)", +"617e80b4": "getPlayerShipModelByIndex(address,uint256)", +"617ee3a7": "MoonInc()", +"617f171f": "reopenDO()", +"617f4e3e": "set_got_refunded()", +"617f8666": "testFailRestartNotOwner()", +"617fba04": "getRecord(address)", +"617fc592": "priceStages()", +"61806891": "idVerification(address,address,uint256)", +"6180e4ac": "getAvailableNumbersForRaz(uint256)", +"6181d565": "getExpectAmount(uint256,uint256,uint256)", +"6181fb0a": "ERC20(uint256)", +"618293ba": "_updateState(uint256,uint256)", +"61829677": "claimdivs()", +"61836b0e": "lastUpdateEtherPrice()", +"61837e41": "get_stats()", +"6183c5d6": "EthereumAI(address)", +"618407e5": "tokenDrain()", +"61840c69": "getSaleSold(uint256)", +"61851416": "modifyCurrentVideoGamePrice(uint256,uint256)", +"61851679": "Protecthor()", +"6185bb50": "AOC_available()", +"6186b3e3": "showMoneyTransfer(uint256)", +"6186fe71": "CloseForecasting(uint16)", +"6187ce34": "gameRandon2()", +"61886014": "combineDice(uint8,uint8)", +"61888b40": "_percentSoldInPreICO()", +"618943c3": "WhitelistItemChanged(address,bool,uint256,uint256)", +"6189be15": "columnround(uint256,uint256)", +"618a057a": "_bidFirstShip(uint256,address,address)", +"618a1ec2": "getGoldDepositOfAddress(address,address)", +"618b870f": "setAmount2Claim(uint256)", +"618c5772": "removeTransferableAddresses(address[])", +"618cb85b": "GitCoinCrowdsale(uint256,uint256,address,address)", +"618ce6d7": "setWhitelistedAddressMain(address[],bool)", +"618de286": "addWhiteListMulti(address[])", +"618ea1c4": "terra()", +"618fa9ce": "getBotBillingIndex(uint256,uint256)", +"618fb1a6": "unsoldContract()", +"61903971": "MajListAll()", +"6190c931": "unclaimedCreditsWithdrawn()", +"6190c9d5": "cycle()", +"6190e9ca": "authorizedTokenUsers(address,address)", +"61919a08": "getWorks(bytes32)", +"6191fe9d": "FFC()", +"61927adb": "setDelegatedFrom(address)", +"61930630": "tokenStore()", +"61931f39": "zGetBothContractBalances()", +"61936d0a": "Wings(address,address,address,address)", +"619385bd": "newShare(address,uint256)", +"619419d8": "setTopic(uint256,string)", +"6194416b": "getProof(string,string,string)", +"6194acb6": "_validateOrder(uint256,uint256,bytes32,address,uint256,uint256,uint256,uint256)", +"6195c713": "against_proposal()", +"61962265": "PRESALE_MAXIMUM_FUNDING()", +"6196ac5b": "RubidSupply()", +"619792ba": "OwnershipGranted(address,address)", +"6197aadd": "JANDA()", +"6197bbab": "createRareAuction(uint256,string)", +"61983863": "MintedTokenCappedCrowdsale(address,address,uint256,uint256,uint256,uint256)", +"6198e339": "unlock(uint256)", +"61990759": "maxRandom(uint256,address)", +"6199ca26": "AmbrosusSale()", +"619a794d": "setAtomIsReady(uint256,uint32)", +"619c83ed": "completeTransfer(uint256)", +"619c89fe": "changeForeignBridge(address)", +"619caafa": "Reward(address,uint256)", +"619cba1a": "requestEthereumChange(address,string)", +"619cec73": "DSHAckCoin()", +"619cf5f9": "batchtransfer(address[],uint256[])", +"619d2671": "acceptContract()", +"619d3063": "getNftId(uint256,address,uint256)", +"619d36ef": "DRAW()", +"619d5194": "setLock(bool)", +"619e6e7c": "userWalletTokenBalances(address)", +"619ebc4f": "GetTimeWeightedBet(uint256,uint256)", +"619f5e72": "takeExcess()", +"619fabfd": "addMultiplePublicSalesSpecialUser(address[])", +"619fc641": "backup_exchangeStaStb(uint256,uint256)", +"61a00f6d": "Ballot(bytes32[])", +"61a07bc9": "AhihiToken(address,address)", +"61a12160": "getPendingAddReserveData()", +"61a1d8fa": "SchmeckleToken()", +"61a215e4": "Controller(address,address,address,address)", +"61a227b6": "mtdAmount()", +"61a23f42": "loadReferredInvestors(bytes32[],address[])", +"61a2493a": "Jancok()", +"61a255b5": "vote(string,string,uint256,bool)", +"61a25f07": "lotteryFinished()", +"61a2d076": "isWhitelistOnlyPermissionSet()", +"61a39946": "depositAgent(uint256,uint256,address[],uint256[],uint256)", +"61a3a281": "deployDefaultVestingContract(address,uint256)", +"61a5c4bd": "updateTokenAmount(uint256)", +"61a65433": "pot_total()", +"61a65e2a": "discountSaleEnd()", +"61a71303": "setMainSaleTLYperETH(uint256)", +"61a76900": "decode(uint256)", +"61a7b2f5": "transferFromIco(address,uint256)", +"61a99c4b": "ethDeposits()", +"61aa19d3": "icoAmountBonus1()", +"61aa8d93": "processFee()", +"61ab8904": "updateStats(uint256,uint256,uint256)", +"61ad08b5": "setSupervisor(address,address)", +"61ad487c": "PRESALE_PERCENTAGE_3()", +"61adeef4": "setUUID4Bytes(bytes16)", +"61aebe59": "stopSell()", +"61af1abd": "increasePriceAndDifficulty()", +"61afc1d5": "IsActiveUser(address)", +"61afd5ac": "denyAccess(address)", +"61b121f5": "OneCoinOneBeerToken()", +"61b1bd04": "HumanEvent(address,uint256,address,address)", +"61b20d8c": "retrieveFunds()", +"61b2bb37": "setHalfLifeTime(uint256)", +"61b3516e": "MyCoins()", +"61b3b8e3": "p_setInvestorFundPercent_out(uint256,uint256)", +"61b46d61": "buyHunterLicence()", +"61b65fbe": "UpdateRank(address,uint256,uint256)", +"61b6683c": "destroyedBots()", +"61b69abd": "createProxy(address,bytes)", +"61b6f889": "handleOffchainWhitelisted(address,bytes)", +"61b7542d": "absMax(int256,int256)", +"61b79ea4": "incentiveDistributionRound()", +"61b7d7f4": "FiveBalanceToken()", +"61b87f0d": "getTokenAddressIndex(address)", +"61b8ce8c": "nextId()", +"61b930ae": "ICOfundsReceiverAddress()", +"61b94bc7": "LiverpoolvsRoma()", +"61b9739a": "setPayTo(address)", +"61b97435": "Register(address,bytes4,bytes18)", +"61b98cb3": "buyShips(uint256,uint256,bool)", +"61b9c6a3": "useBottle(address,uint256)", +"61b9c9f4": "buySeat(string,string,string)", +"61b9e2bb": "proveInUnconfirmedBalances(bytes,bytes32,bytes32)", +"61ba228b": "LukSevenToken()", +"61ba3377": "WatchLastTime()", +"61ba89d4": "NSCDistributionContract()", +"61bb246c": "secondBonus()", +"61bb9c52": "baseValue()", +"61bc1a49": "depositBalance()", +"61bc221a": "counter()", +"61bc6c57": "unauthoriseAddress(address)", +"61bcbe6f": "goodluck(uint256)", +"61bd12e0": "FAILED_STATUS()", +"61bdc978": "unfreezeFrom(address,uint256)", +"61be8456": "updateMarketData(address,address,uint256,uint256,uint256)", +"61beb1d7": "createAuction(address,uint256,uint256,uint256)", +"61bec256": "setContractActive(bool,bool)", +"61bec4fd": "QLANCEGO()", +"61bedcdc": "registerEmployee(address,address)", +"61bf2829": "RegistrationStatusChanged(address,bool,uint256,uint256,uint256,uint256)", +"61bf49ee": "plots(uint256)", +"61bf7692": "withdrawFoundationFunds()", +"61bf9c2a": "updatePoolContract()", +"61bfdc5d": "PatentCoinPreICO(address,address)", +"61bfe61b": "testAddUser(address,uint256)", +"61bffe01": "addIdentities(bytes32[],bytes32[])", +"61c003a7": "buyerNumDeals()", +"61c028e7": "getTokenURI(address)", +"61c083b9": "updateInflationRate()", +"61c1f224": "Q8ECOIN()", +"61c2c9c0": "getHowMuchUntilHardCap()", +"61c2e349": "create_a_new_market(address,address,uint256,uint256,uint256)", +"61c3b7f1": "setCharityBeneficiary(address)", +"61c52660": "Said(address,bytes)", +"61c5623d": "Vanadium()", +"61c61309": "setTokenController(address,address)", +"61c651b9": "oneQuarterInSeconds()", +"61c6a8e4": "addMutagenFace(uint256,uint256)", +"61c6bc82": "create(string,string,uint8,address)", +"61c748c7": "TressexToken()", +"61c76231": "resetBeneficiaryList()", +"61c7eb81": "Millionaire()", +"61c91c69": "webGiftLineTime()", +"61c9559b": "get_arbits_presale_open()", +"61c99b92": "msgsender()", +"61cac1fb": "partnersReward()", +"61cb5a01": "testString(string)", +"61cc576d": "evaluateOdds()", +"61cd5683": "testToByte(bytes)", +"61cd756e": "prevRegistry()", +"61cd90b0": "revealY(uint256,uint256)", +"61cdb1d7": "getByMesa(uint256,uint256,uint256)", +"61cdd2dc": "rightAndRoles()", +"61cec717": "changeCurrentCirculating(uint256)", +"61cf6d1c": "investeth2018()", +"61d027b3": "treasury()", +"61d0ad9e": "TransferFunds(uint256,uint256)", +"61d11318": "RedEnvelope()", +"61d161ea": "unitsPerTransaction()", +"61d3ba8a": "addWhitelistAddresArray(address[])", +"61d3d7a6": "isUpgradeAgent()", +"61d3d902": "getPlayerReferrerID(uint256)", +"61d43971": "updateGasCost()", +"61d49ea8": "reveal(uint256,uint256,bytes32)", +"61d51df8": "SKYSWAP()", +"61d5593c": "calculatePoohSell(uint256)", +"61d585da": "state(bytes32)", +"61d5f225": "minBetSize()", +"61d60021": "getCourseID(address,address)", +"61d61998": "implementsERC721YC()", +"61d689fa": "register(uint8)", +"61d68b54": "requestConsent(address,address,uint256)", +"61d6d385": "withdrawUnsold()", +"61d7c713": "validPayDest()", +"61d81aed": "exitBuyRequest(uint256)", +"61d942f3": "_removeLicenseTerms(bytes32,bytes32)", +"61d97c41": "GetPartyRole(address,address)", +"61da1439": "read(bytes32)", +"61da46c4": "joinDraw(uint256)", +"61db17ab": "_validatePurchase(uint256)", +"61dbbc80": "LARGE_PURCHASE()", +"61dbfc3f": "changeConfig(uint32,uint256,uint8)", +"61dc648f": "LogExternal(uint256,address,bytes32)", +"61dcd7ab": "createTime()", +"61dd8d13": "DexAlpha()", +"61ddf923": "_getTokenAmount(address,uint256)", +"61df46f6": "DatCoin()", +"61df5c4d": "getEncounterResults(uint256,address)", +"61dfacf2": "removeBuildingFromServer(uint256,uint8[10],uint8[10],uint8)", +"61dfdae6": "setData(address)", +"61e01356": "randNonce()", +"61e062a4": "_emitHardcapFinishedManually()", +"61e0f7a8": "swypeCode(address)", +"61e1077d": "decreaseApprovalWithSender(address,address,uint256)", +"61e1fe91": "setFreeDino(uint16)", +"61e214d8": "isValidPurchase(uint256)", +"61e25d23": "numActiveTranscoders()", +"61e3564f": "approveAccount(address,bool)", +"61e360b7": "maximumIndividualCap()", +"61e3c944": "setUint(uint256,uint256)", +"61e3f0a4": "setTimeBasedBonus(uint256[],uint256[],uint256[])", +"61e42039": "priceString()", +"61e49344": "buyinReturn(address)", +"61e4a23a": "expireGame(uint256)", +"61e4fd2b": "approveEscrow(address,uint256)", +"61e539da": "testFailWrongAccountTransfers()", +"61e5f5f2": "balEth()", +"61e60550": "TransactionDisputed(uint256)", +"61e6e66b": "DestroyedBlackFunds(address,uint256)", +"61e76056": "denyByDelegate(bytes8,bytes8)", +"61e7662b": "getAccountSpendingLimit(address)", +"61e88f9a": "test_0_validOwner_construction()", +"61e8ee04": "TOXTToken()", +"61e91ea1": "getDataContractAddress()", +"61ea6ed7": "transferFromBase()", +"61eb2e1a": "UNITStagesManager(bool,address)", +"61eb3836": "getProjectStatus(address)", +"61eb71c1": "setSellable(bool)", +"61eba552": "getMetaData(uint256)", +"61ecc8b5": "isLogo(address)", +"61ed2094": "demicals()", +"61ed373b": "comment(uint256,bytes32,bytes32)", +"61ed8097": "SEOToken()", +"61eda968": "cancelAssessment()", +"61edfe6e": "p_setBankOfEthProfitPercent(uint256,uint256)", +"61ef265b": "spaceAfterReturns()", +"61ef669b": "dateTier2()", +"61ef8d91": "setErc20Rate(string,uint256)", +"61efc7db": "resolveDelegation(address,address)", +"61efc807": "transferbatch(address[],uint256[])", +"61f00da2": "OMIVIAToken()", +"61f127dd": "_price_tokn()", +"61f134fa": "OZRealestatesToken()", +"61f15236": "addHolder(address,uint256)", +"61f17532": "tune(uint256,uint256)", +"61f188de": "createTree(string,string)", +"61f1c5ba": "vaultWallet()", +"61f1d889": "setFlag(uint256,uint256)", +"61f2c8b0": "_addShareToNewOwner(address,uint256,uint256)", +"61f2de50": "spawn(uint256,address)", +"61f30408": "emitTimeAdded(uint256,uint256)", +"61f37dff": "calculateIcoTokenAmount(uint256)", +"61f3c006": "setRoundMaxPerUser(uint256,uint256)", +"61f3c62e": "remain()", +"61f3cfb1": "updateExistingRaz(uint256,uint256,uint256,uint256,uint256,string)", +"61f43285": "gubberment()", +"61f529af": "initEthMultiplicator(address)", +"61f54a79": "getNextUnsortedOffer(uint256)", +"61f61867": "addSettingDeprecation(uint256,uint256,address,address,address)", +"61f66dc4": "updateUserClaim(address,uint256)", +"61f6b429": "myAvailableFunds()", +"61f70161": "placeOrder(bytes16,address,address,uint256)", +"61f7025f": "fetchBalanceByAddress(address[])", +"61f721e8": "HGFCToken()", +"61f76d67": "withdrawEtherToOwner()", +"61f82156": "receiveCashback(uint256,address)", +"61f8cdd6": "transferETHToContract()", +"61f8e91a": "unitTestModifyStaker(uint256,uint256)", +"61f9ca4d": "modifyGroup(uint256,string,string,string,uint256,uint256,uint256,uint256,uint256,bool,uint256)", +"61f9e04d": "getWithdrawn(uint256)", +"61faee9e": "noTransfer(address)", +"61fba37d": "investorBalanceOf(address)", +"61fbdf4e": "gameIsCalculated(uint256)", +"61fc3790": "Monthprofitend()", +"61fc65a0": "checkBirth(uint256)", +"61fc703c": "Danku_demo()", +"61fd718f": "getOrderAllocatedToFundPool(uint256)", +"61fd8f1b": "sendTokensToCompany()", +"61fda640": "ownerUpdateContractBalance(uint256,uint256)", +"61fdfa9b": "returnDeed()", +"61fe51a1": "rootAuthority()", +"61fec3a4": "clearSponsorableJobApprovals(address,uint256,address[])", +"61ff715f": "deploy(uint256,bytes)", +"61ff8191": "CirculationEnabled()", +"6200979e": "AngelInvestmentAddr()", +"6201124f": "employeeDenyExerciseOptions()", +"6201510a": "getPreSaleRank(address,uint256)", +"62016083": "removeDestinationChain(bytes8)", +"62017ebc": "left46(uint256)", +"6201d683": "createTokenUri(string)", +"62024dce": "forceCrowdsaleRefund()", +"62026229": "validateLand(address,int256[],int256[])", +"6202745f": "specialPeacefulSkills(uint256)", +"62027c1e": "changeCJTeamWallet(address)", +"620346c6": "setStopReceive(bool)", +"6203f09f": "MAX_INVESTMENTS_BEFORE_MULTISIG_CHANGE()", +"62040de3": "numberOfBoardMeetings()", +"62040e50": "Bitscreen(bytes32,uint8,uint8,uint8,uint8,string)", +"62043bd8": "DIVIDER()", +"62059839": "_setOwner(uint256,address)", +"62066eb3": "getMinimumAmount()", +"6206880b": "contributorsLockdown()", +"62074c31": "getProjectMaker(bytes32)", +"62075af4": "giff(uint32,address)", +"6207c802": "getSubjectIdentById(uint256)", +"6207d239": "privSaled()", +"620892bd": "NRB_address()", +"620a9c95": "BITSToken(uint256,string,uint8,string)", +"620b0f23": "getMyAnthill()", +"620b2731": "_getClientProviderUID(address)", +"620b5cd2": "Crypto()", +"620b75df": "portfolioManager()", +"620d025c": "roundFunds()", +"620db609": "rubyToken()", +"620eb8ee": "setDisbursementEndTime(uint256)", +"620edb32": "allocatePrivateToken(address[],uint256[])", +"620ffe99": "testFooUdate(uint256)", +"6211db22": "querybalance1()", +"621277cb": "hardCaps(uint256)", +"62133a6c": "getPlanetName(uint256)", +"62135491": "distributeTokensToMembers(uint256,uint256)", +"62150b3f": "KaoPuToken(address,uint256)", +"6215be77": "depositToken(uint256)", +"6215f292": "updateBasePrice(uint256,uint256[],uint256[],uint16)", +"62161235": "getRandomNumber(uint16,uint8,address)", +"6216bde5": "TokensRewarded(address,address,uint256,address,uint256,uint256)", +"6217229b": "sellRate()", +"62173282": "updateMVNRate(uint256)", +"6217903f": "BNB_TOKEN_PRICE_NUM()", +"62182636": "setParams(uint256[],uint256[])", +"6218e5cd": "setGuardianVend(uint256,uint256)", +"6218fd8b": "icoEndsAt()", +"6219004d": "setPosttgeAddress(address)", +"621a25f8": "right66(uint256)", +"621a61ac": "STATE_NOT_FINISHED()", +"621ab11a": "bonustokn()", +"621b23e2": "getOwner(uint32)", +"621bc379": "setReverseRate(address,int16)", +"621bd8d7": "getPreviousReportingWindow()", +"621c3275": "disembark(uint16,uint16,uint256)", +"621d388c": "senderIsAdmin()", +"621de5ac": "AUSBToken()", +"621ded8b": "FinishCompetitionEvent(uint32)", +"621df4be": "getCurrentElectionCycleBlock()", +"621e9a45": "BAQToken()", +"621f7e45": "setPeriodRound(uint256)", +"621fb946": "getLLV_edit_27()", +"62205bd8": "privatesaleFinalized()", +"622104d9": "integration()", +"62219866": "getPercent(uint256,uint256)", +"6221c805": "supplyRound3()", +"6221dc20": "HackableETH()", +"6221e77b": "Logs(address,uint256,uint256)", +"622235e6": "getPage(address[],uint256,uint256,bool)", +"62228c17": "CTADevilleToken()", +"62246c41": "setNickName(bytes32)", +"62251182": "_withdrawOwnerTokens()", +"6225924e": "_mint(bytes32)", +"6225a8ad": "GetResult(uint256)", +"6225b759": "setForceExecuteOfUsers(bool)", +"6226bddb": "getProductStructById(uint256)", +"6226d4b2": "addAddressToAdmin(address)", +"6227ed6e": "createPerson(string,string,uint256,uint256,uint256)", +"6227fd3a": "firstItemWrong()", +"622a0a19": "playerBudget()", +"622a10fd": "CORECoin()", +"622a2d31": "setDistanceAndPrice(uint16,uint16)", +"622ac8ed": "countWishesAt(address)", +"622ae7aa": "getDeployedTokens()", +"622af809": "setMintContactAddress(address)", +"622b0b29": "StakeEvent(address,uint256,uint256,uint256)", +"622b2a3c": "validDelegate(address,bytes32,address)", +"622b6659": "doBigDrop(uint256,uint256,uint256,uint256)", +"622c77fe": "totalSupplyLocked2Y()", +"622d6c97": "ExecutionError(string)", +"622d82df": "Buddha()", +"622dda96": "chooseRandomNumber()", +"622ddaba": "getGenesForSaleBySeller(address)", +"622e5026": "Insurance()", +"622e88cb": "testBitsXorSuccess()", +"622f9730": "forward(bytes,address,address,uint256,bytes,address,uint256)", +"622fe39f": "getLoanData(uint256)", +"6230ebda": "defrostFrozenTokens()", +"6231775b": "miniGameId()", +"623195b0": "setABI(bytes32,uint256,bytes)", +"623406d2": "setRecordContract(address,address)", +"6235e3a2": "getAddressCreatorById(bytes32)", +"6235eef3": "getCurrentReportingWindow()", +"62362cc2": "COIN_SUPPLY_TOTAL()", +"623659b4": "doTransfer(address,address,uint256,uint256)", +"623670b2": "sendTokensToPartner()", +"62373537": "current_start_divholder()", +"6237564c": "isDopeRaiderDistrictsCore()", +"6239f13d": "triggerSoftCap()", +"623ba5c9": "callBackGasAmount()", +"623d2295": "Minado(address,address)", +"623d2b62": "getRequiredBetAmount(uint256)", +"623d5652": "projectExists(address)", +"623d5e56": "devolverBici()", +"623d96ed": "preDuration()", +"623decaa": "unlockedTokensOf(address)", +"623e4fb8": "BBCToken()", +"623eff55": "tokensTransferred()", +"62400e4c": "supplyOf(address)", +"6240282c": "LiquidDemocracyControllerFactory(address)", +"6240c7aa": "COENXToken()", +"6241bfd1": "Token(uint256)", +"6244326d": "humanityFund()", +"6244b7ed": "unWhiteListInvestor(address)", +"624522f9": "accountFrozen(address)", +"6245adff": "DirectlyDeposited(address,uint256)", +"6245eb07": "setProvenance(address,uint256)", +"62463079": "tier2End()", +"62464576": "stage_2_add()", +"62465f0a": "GenesisManager(address,address,address,address,uint256)", +"62469353": "firstDepositTimestamp()", +"6247c38f": "updateChargingRate(uint256)", +"6247cfd9": "priceForKeys(uint256,uint256)", +"6247f6f2": "whitelistToken(address)", +"62486d42": "getTokensAmount()", +"6248cf49": "_donationSupply()", +"6248d6bf": "getOracleMetaData(address)", +"6248fd10": "SLC()", +"62491332": "lockPurchase()", +"62492e9d": "preIcoBonus()", +"624964c3": "getBancorContractAddress()", +"6249a5c7": "UnpauseEvent()", +"624a8bc3": "MyTotalWithdrew()", +"624aba21": "_getWinCountWeight(uint256)", +"624adc4c": "OwnershipTransferCompleted(address)", +"624ae5c0": "rID_()", +"624ba0a4": "maxImports()", +"624bb58f": "marketingSupply()", +"624bb8b3": "setCBaddress(address,address,address)", +"624bd6c4": "depositToken(address,uint16,uint256)", +"624c3dbd": "imageUploadComplete(uint256)", +"624c5673": "USDollars()", +"624cc0a5": "teamMemberAtIndex(uint256)", +"624d4309": "USBcoin()", +"624dd6a9": "getInvestmentsByCountry(uint16)", +"624de3d9": "InterfaceSignature_ERC721Optional()", +"624dee7c": "_release(address,address,uint256)", +"624e3b36": "totalearners()", +"624ecda9": "Sleep()", +"624f011d": "doStop()", +"62502169": "sendCollateral(address,uint256)", +"62502fe7": "getNameDigest(string)", +"6250bfa3": "createOrder(bytes32,bytes32,address)", +"625101d5": "getOwnerMoney()", +"625126ed": "shift_left(uint32,uint32)", +"6251aee6": "icoPhase3End()", +"625295fd": "distributeCollectiblesTo(address)", +"6252c127": "onCrowdsaleEnd()", +"6252d651": "setForegroundColors(bytes3[])", +"62531721": "getStack(uint256)", +"6253367a": "queryChallenge(bytes32)", +"6254add1": "PRIVATE_SALE_POOL()", +"6254cf80": "setGameHostAddress(address)", +"62564c48": "getProposals()", +"62568d83": "min_buy_block()", +"62571cac": "getTodayOwnerName()", +"625785bb": "productionCardIdRange()", +"62581b79": "CubaazCoin()", +"6258683e": "devMiningRewardTransfer(address,uint256)", +"6258d524": "saveEther()", +"62598ae6": "PaymentExpected(bytes8)", +"62599964": "usesThem()", +"625a6726": "fixClock(bytes32,uint64)", +"625adaf2": "setTokens(address[])", +"625b666c": "Luxury()", +"625b8e60": "_redeemByPartition(bytes32,address,address,uint256,bytes,bytes)", +"625bc37b": "releaseTeamTokensAfter12Months()", +"625becbc": "showLockState(address)", +"625cbb23": "setWhiteListAddresses(address)", +"625cc465": "baseDonation()", +"625cfc46": "sellRateZeroQuantity(uint256)", +"625d1fe2": "viewSecondBatchOfClauses()", +"625fcce7": "dealer_cut()", +"625fe9ec": "updateCrowdsale(uint256,uint256,uint256,uint256,uint256)", +"6260f55b": "ETH_USD()", +"62612c6d": "PatronTwoWithdrawal()", +"62614ae6": "BNT_CONVERTER()", +"6261c662": "bonusStart()", +"626263c5": "calculateEthToChargcoin(uint256)", +"626340b2": "block0()", +"626452df": "test_feePoolShare_noClaimableStake()", +"6266e135": "Gmt()", +"62674e93": "getStepFunctionData(address,uint256,uint256)", +"62676d78": "RANGEEND_8()", +"6267967b": "batchReservedTokenAllocation(address[],uint256[])", +"6267c456": "organizer7()", +"6268a0cd": "stakeSDC(address,address,uint256)", +"6268e921": "acceptGame()", +"6269420e": "seedAndPresaleTokenIssuedTotal()", +"62694b68": "lastSignedBlockNumber()", +"62695eae": "allowedTransfer(address)", +"62697f69": "getLLV_edit_17()", +"6269ae48": "tokenToContributor()", +"6269f9fc": "getGameId(string,string,uint16,uint64)", +"626a0e1c": "addSoundEffect(uint256,uint256[])", +"626a413a": "activateBounty(uint256,uint256)", +"626b1070": "beneficiaryDeposit(uint256)", +"626be567": "totalToken()", +"626c0a45": "stock(uint16,uint16,address,uint256)", +"626c6bc6": "ETO()", +"626d0358": "setTokenDefaultPartitions(bytes32[])", +"626d4a36": "right55(uint256)", +"626d666c": "theDao()", +"626e4675": "directorLockDays()", +"626e8fd3": "setBonusDate1(uint256)", +"626ebe39": "toggleReceiveEth()", +"626f9e20": "calculateMaxEthIssued()", +"626fc458": "finalizeTrade(address,uint256,address,uint256,uint256)", +"626fd353": "getSelection(uint256)", +"627045bf": "changeActiveNameIndexTo(uint256)", +"6270b780": "DebitClient(address)", +"62714a14": "getPhone(address)", +"62715547": "castVote(bytes32[])", +"62721129": "getMultiSigWallet()", +"6273106a": "payoutPool()", +"62731ff1": "onDeposit(address,address,uint256,uint256)", +"62735618": "finalizedCapital()", +"62738998": "getInt()", +"62744fee": "PallyCoin()", +"6274a35c": "team_total_lock_days()", +"6274ca4b": "setWeiPerUSDinTGE(uint256)", +"62751a06": "SFT_PER_ETH_FIRST_EARLY_BIRD_RATE()", +"6275448e": "batchApprove(address,uint32[])", +"62754563": "CelebsParty()", +"62765eb7": "receiveApproval(address,uint256,address,string)", +"6276b368": "rateOfCharging(address)", +"62770252": "needsFuneral(uint256)", +"62773951": "TrustReso(uint256[3],address,address,address[])", +"627749e6": "closeTime()", +"62779e15": "payFees()", +"62797ef5": "dayPotHighscore()", +"627992c7": "VULCAN_POD_MAX_CARGO()", +"627a326b": "getBytes32Slice(bytes,uint256)", +"627a3311": "QvoltaToken(address)", +"627aa6d2": "buyAndTransfer(address,address,bytes,uint8)", +"627adaa6": "revealMulti(uint256[],uint256[],uint256[],bool[],bytes32[])", +"627b3d9a": "BTCAUC()", +"627c2516": "WizardsvsCeltics()", +"627c2d1e": "getTX()", +"627c34ad": "removeSubscriber(address)", +"627c81ff": "erc20ContractByIndex(uint256,uint256)", +"627d6f9f": "get_multiple(uint256,uint256)", +"627e64d2": "getQuote(address,uint64)", +"627e667b": "StandardToken(address,uint256)", +"627eb56c": "setMaxContributionPhase1(uint256)", +"627f09c3": "setConfiguration(address)", +"627f22fe": "GiftMetadata(uint256)", +"627f47c6": "transferWithLock(address,uint256,uint256[])", +"627fd3bb": "addCbAddress(address,bytes1)", +"6280382a": "cancelTrade(address,uint256,address,uint256,uint256)", +"62806296": "transfer_coins(address,uint256)", +"6280b0bb": "batchRegularTransfer(bytes32[],bytes32[])", +"6283051f": "setOraclizeQuery(string)", +"6283440b": "wingsTokensReserv()", +"62838d8b": "getLastAddress(bytes32)", +"628392bd": "bonusPhase1()", +"62848f36": "tokenRate30()", +"6284ae41": "exitFee()", +"6284fd22": "getMyPubKey(bytes32)", +"62850233": "transferWithDividends(address,uint256)", +"6285a259": "calculateTokensEnabledOne(address,uint256)", +"6285d703": "NERO()", +"6288020f": "endThirdWeekICO()", +"6288a63c": "NotaryChain(uint256)", +"6288a9a3": "maxUserContribution()", +"62890063": "WhitePrivilegeToken()", +"62891b5d": "multiAccessChangeRequirement(uint256)", +"6289fdbe": "VenomToken()", +"628a01ce": "stakingMintRate()", +"628b75bf": "slashDownRequest(uint256,address,uint256,bytes32)", +"628c225c": "roomNight(uint256)", +"628c2778": "DEXToken()", +"628c866e": "setCurrentActiveGameID(uint256)", +"628d5ef1": "setWeiUsdRate(uint256)", +"628da35e": "get_termAmount(uint256)", +"628dda8d": "VDGToken()", +"628e50b5": "brokerFee()", +"628e7a38": "_initializeVesting(address,uint256,bool)", +"628eaa88": "GeocashToken(uint256,uint256,uint256,address)", +"628ee84f": "in_dispute_phase()", +"6290a009": "bids_sorted_count()", +"62932301": "importer()", +"62935a98": "getContractDataSK()", +"6293a989": "TRONVSupply()", +"6293b5bb": "presaleMaxEtherCap()", +"6293fd1e": "payBack(address)", +"6294f858": "distributeFinancialAward(address[],uint256[])", +"6295c61a": "transferItem(address,address,uint256)", +"6297c16c": "deleteToken(uint256)", +"6297dbf4": "existsMesa(uint256)", +"62981b18": "deployBallot(bytes32,bytes32,bytes32,uint64[2],bool[2])", +"62985882": "VSTA(string,string,uint8,uint256)", +"62985b87": "NebuliToken()", +"62986e27": "Canary(address,uint16)", +"629873b2": "createRequestAsPayeeAction(address[],address[],int256[],address,address,string)", +"6298c93a": "usdCap()", +"6299a6ef": "update(int256)", +"6299f8cf": "stop(uint256)", +"629a9ce7": "coreTeamUnlockedAt()", +"629ad124": "chancesBought()", +"629aef56": "QuintToken(address)", +"629b656e": "PryzeToken()", +"629b9cb1": "takeProjectBonus(address,uint256)", +"629bc0b4": "getPlayerPayout(uint256)", +"629bf9a8": "updateMinMaxBetPrice(uint256,uint256)", +"629c1b67": "SoftCapReached()", +"629c37c2": "HSShopSaleFee()", +"629cefee": "adjustTiming(uint256,uint256)", +"629d0f2f": "teamd()", +"629d93db": "removePromo(bytes32)", +"629e89a0": "setMinDai(uint256)", +"629f1486": "YoonContract()", +"629f4028": "getVoteNum(address)", +"629f4b3b": "StatsTotal()", +"629fb53d": "getOrderbookLength()", +"62a09477": "changeOwner()", +"62a0b56b": "testUnset()", +"62a1029c": "YUPIE_PER_ETH_PRE_SALE()", +"62a144d9": "safeMod(uint256,uint256)", +"62a17a46": "AXPCoin()", +"62a31c4a": "dynamicLength(bytes4,bytes)", +"62a36a54": "Application()", +"62a39ff7": "setShareHolder(address)", +"62a44fe9": "has_voted()", +"62a49ae3": "depositTokensFor(address,uint256,address)", +"62a4b230": "setLockedRatio(uint256)", +"62a4be31": "buyTokensByProxy(address)", +"62a4cd14": "endFunding(uint256)", +"62a51eee": "move(uint80,uint80)", +"62a52ed6": "set_price(bytes12,uint256)", +"62a59ade": "distributePuppyCoinCLarge(address[])", +"62a5af3b": "freeze()", +"62a76ce1": "accrueAdvisorsTokens(address,address,uint256)", +"62a7c5a6": "nextWithdrawDayFoundation()", +"62a80b42": "newToken(string,address)", +"62a87466": "STATE_DONATION_ROUND_1()", +"62a974b6": "vote01NoCount()", +"62aa9a00": "enehtoken()", +"62aabb9e": "SafeToken()", +"62aac84d": "setHaltSale(bool)", +"62aaf089": "getExchangeRate(uint256)", +"62ab1216": "updateWithOracle()", +"62ab8cc1": "howMany()", +"62abb560": "transferSuperOwnership(address)", +"62abda69": "totalIssuanceDebt()", +"62ac6115": "updateRequireKYC(bool)", +"62aca822": "setNation(address)", +"62ad1b83": "operatorSend(address,address,uint256,bytes,bytes)", +"62ad9bda": "newProvider(address,string,bytes32,uint256)", +"62addeed": "HumanX()", +"62ae4d29": "OBIMOLOGIA()", +"62aecc47": "totalBondSupply_BULL()", +"62aee544": "ADVISOR_SHARE()", +"62afd64a": "unpaidPercentage(bytes32)", +"62aff4d5": "commitPeriodStartedTimestamp(bytes32)", +"62b08e70": "setVotingContractAddress(address)", +"62b0ae87": "pack(bytes)", +"62b24189": "DepositToBankAccountFromDifferentAddress(uint32)", +"62b26f95": "totalFish()", +"62b3b833": "createCoupon(string)", +"62b40489": "businessPlannedPeriodEndTimestamp()", +"62b40918": "addPersonalCaps(address[],uint256)", +"62b40f9f": "destroy(address,address)", +"62b45318": "exchangeEtherForNominsAtRate(uint256)", +"62b4faa7": "Edujano(uint256,string,uint8,string)", +"62b52b49": "LADCToken()", +"62b6a282": "left42(uint256)", +"62b6a963": "_batch2_icosaleEndTimestamp()", +"62b6dc8e": "RektToken()", +"62b78bc4": "team_coins()", +"62b83c6b": "balanceAsCreator()", +"62b96a18": "teamUnvested()", +"62ba1649": "stopLottery(bool)", +"62ba4aef": "payInvoice(bytes32,uint256)", +"62ba9687": "toTimestamp(uint16,uint8,uint8,uint8,uint8)", +"62bb7533": "getTokenToEthOrderList()", +"62bb758f": "userSecurity(address)", +"62bc56e6": "getCompany(address)", +"62bc63c4": "getCozyAgain(uint256)", +"62bca778": "withdrawalFX(uint256)", +"62bd689c": "setBonusPercent(uint256)", +"62be3172": "Message(address,address,address,string)", +"62beaa82": "toData()", +"62bf6fa7": "medalDecimals()", +"62c01b2d": "apply_compensation(uint80)", +"62c06767": "sweep(address,address,uint256)", +"62c0e3b7": "SpoutMintableToken()", +"62c0ffa8": "getDCountedBasicBallotID(bytes32,uint256)", +"62c13ff3": "initSale(uint256,uint256)", +"62c19061": "getYearDay(uint256)", +"62c1adb0": "KittenCoin()", +"62c1f389": "swap(bytes32,address[5],uint256[6],uint8,bytes32,bytes32)", +"62c24067": "blockFunds(uint256)", +"62c2b7c8": "getTTTAddress(string)", +"62c335c1": "checkCallback(address,uint256,bytes,bytes)", +"62c375a7": "library15function()", +"62c3dd5a": "prepareForRefund()", +"62c3fdb2": "getFundsOwner(bytes32)", +"62c47064": "setArbitrator1and2(address,address)", +"62c48e20": "capFiatAndETH()", +"62c49256": "whitelistBasketFactory(address)", +"62c4c89e": "getMixParticipantByPubKey(uint256)", +"62c509c3": "XYTgas()", +"62c5aecc": "getEthToTokenAddOrderHint(uint128,uint128)", +"62c5c03a": "getbalance(uint256)", +"62c5c254": "changeFounderMultiSigAddress(address)", +"62c63e31": "NotFinalized(bytes32,bytes32)", +"62c655f5": "removeVoters(uint256[])", +"62c6beea": "_buy(uint256,address,uint256)", +"62c7855b": "getConfigBytes(bytes32)", +"62c7e96c": "deathData_f16()", +"62c7fa76": "lockStartTime()", +"62c95aa1": "getMaxTickets()", +"62c99e84": "_Approval(address,address,bytes32)", +"62c9da62": "setCompte_1(string)", +"62caf484": "GDCAcc03()", +"62cb1ac2": "validateOrderHash(bytes32,address,uint8,bytes32,bytes32)", +"62cdd872": "verifySignatures(uint8[],bytes32[],bytes32[],bytes32)", +"62ce071c": "publicTokenCap()", +"62ce7043": "reloadEarnings(uint256,uint256)", +"62cee7ad": "staffInfo()", +"62cf0197": "getVIATokens()", +"62cf54c8": "setDeposits(uint64,address,uint16,uint64)", +"62d020d9": "addVersion(address,string,string)", +"62d027bf": "GXVCSentByToken(uint256,address,uint256)", +"62d05c78": "cancelOffer()", +"62d0af7a": "set_BCDB_contract()", +"62d0ce45": "TOKEN_RATE_05_PERCENT_BONUS()", +"62d176cb": "buyTokens(bytes32,address)", +"62d1dac2": "setUnofficialApplicationSignUpFee(uint256)", +"62d1fee3": "addLegitDevAddress(address)", +"62d21602": "bkaddress()", +"62d246a4": "getBetsMas(uint32)", +"62d2c393": "GenkiProject()", +"62d2ecb9": "setMaxSpend(uint256)", +"62d3755b": "fullTokenWallet()", +"62d3b5c5": "maxAmmount()", +"62d55b6d": "VOTING_TIMESPAN()", +"62d576bd": "periodITO_mainCapInUSD()", +"62d590ac": "GrantToken(address,uint256,string)", +"62d5acb1": "rebateOneFenzi_()", +"62d6b7fb": "percentageOfRaisedAmountThatRemainsInContract()", +"62d7216c": "unregister(uint256,bytes)", +"62d72c08": "RozowkaCoin(uint256,string,string)", +"62d73eb8": "startElection()", +"62d91855": "delAdmin(address)", +"62d93527": "setBrokerFee(uint256)", +"62d966c9": "changeEmployee(address)", +"62d9c267": "ICOEnded()", +"62dbc55c": "DevTokensHolder(address,address,address)", +"62dbdfef": "CompanyToken()", +"62dbf261": "getTokensForEther(uint256)", +"62dc0133": "HIGHER_PRICE_RESET_PERCENTAGE()", +"62dc6e21": "PRESALE_PRICE()", +"62dc9ced": "Roulette(uint256)", +"62dd748c": "toUpper(string)", +"62dd9c71": "checkWinNobody(uint32)", +"62de871e": "startBattle(string)", +"62df5b7d": "BD0Token()", +"62e05175": "setMotionDB(address)", +"62e1de00": "test_polarBoardInstance()", +"62e23e9e": "NAME_NOT_AVAILABLE()", +"62e26e45": "loanCompleted(uint256,uint256)", +"62e28f7d": "channelModule(uint64)", +"62e2aa00": "burn(uint256,string,uint256)", +"62e2d0de": "get_foo()", +"62e4aeb8": "customExchange(address,address,uint256)", +"62e534d2": "setBlocklancerToken(address)", +"62e5b1f2": "_owns(address,address,uint256)", +"62e69886": "RecipientUpdated(address,address)", +"62e6e7c7": "disTrustDealer(address)", +"62e76013": "management(uint256)", +"62e7707e": "whitelistAddresses(address[],bool)", +"62e7ba3f": "consumptionPointer()", +"62e838ef": "returnBet()", +"62e881a4": "nextTournamentRound()", +"62e888bb": "STRIKE_PRICE()", +"62e8b948": "stepOneLockEndTime()", +"62e8e8ac": "changeTokenPrice(uint256,uint256)", +"62ea82db": "bids(address)", +"62eb0068": "redeemByPartition(bytes32,uint256,bytes)", +"62eb33e3": "cr()", +"62eb4c89": "is_started_payouts()", +"62eb5789": "setLLV_edit_33(string)", +"62eb6da1": "registeredToken()", +"62eba54c": "doesUserOwnItem(address,uint256)", +"62ebcdcf": "setRtmContract(address)", +"62ec8e53": "adminAddBallot(string,uint256,uint256)", +"62ed4f04": "SSBToken()", +"62ee0082": "setTokenContractsAddress(address)", +"62ee37aa": "InfluToken()", +"62ee4b26": "AUORANEX()", +"62ee6d29": "changeHashtoLowOrHigh(uint256)", +"62ee7b03": "startTakeToken()", +"62ee922b": "unofficialApplicationSignUpFee()", +"62ef0e65": "withdrawPresale(address[])", +"62ef1f81": "confirmPayment()", +"62ef7738": "total_money_back()", +"62f03290": "payRefund(bytes32,uint256)", +"62f2296e": "_transfer(address,address,uint256,string)", +"62f3ed92": "PowerQuantumCoin()", +"62f3febf": "isUserBlockedByContract(address)", +"62f44d8a": "Dadyys()", +"62f4ed90": "isAuthorized(bytes32)", +"62f54c18": "removeAllowedTokenInternal(address)", +"62f57ff6": "GudTesteContratoF()", +"62f5a23f": "transferToToken(address[])", +"62f5aa4c": "getAirdropIds()", +"62f5c2e3": "maxContributionPhase1()", +"62f5ed61": "add_to_bounty()", +"62f60954": "_reAdjustDifficulty()", +"62f63c6e": "EarthMedz()", +"62f69039": "unlockVault()", +"62f6cf7f": "getRegisteredModuleAt(uint256)", +"62f91eff": "AnythingAppToken()", +"62f927d4": "getDefaultReportingFeeDivisor()", +"62f96fc1": "splitBalanceAccordingToRatings(int256,int256,int256)", +"62fb09b2": "getRefDescr(uint256)", +"62fb0ff8": "morties_TO_HATCH_1RickAndMorty()", +"62fb6fe1": "getMonster(uint256)", +"62fb9697": "diffSeconds(uint256,uint256)", +"62fc178b": "gasPriceOraclize()", +"62fca3fa": "mintTokenBulk(address[],uint256[])", +"62fdaf1d": "removeFromBattle(uint64)", +"62fde48a": "LogDeposited(address,uint256)", +"62fe3b4d": "setEndOfPresale(uint256)", +"62fec51b": "icoEndTimestampStage2()", +"62feff3a": "developerAllocation()", +"62ffb195": "REFERRAL_REWARD_PERCENTAGE()", +"62ffb3bf": "trueUSD()", +"630061f3": "getTokensDistributeds()", +"6300c768": "takeEther(address,uint256)", +"63018e1a": "minTokensToSale()", +"63036f86": "totalIssuedEarlySale()", +"63037b0c": "payees(uint256)", +"6304335b": "betsCloseAt()", +"6304fa3a": "Test(uint256,string,uint8,string)", +"63052d82": "getOwnersIndex(address)", +"63055d79": "fetchRate()", +"6305d010": "registerTeam(string,address,string,bool)", +"63066434": "getPlayerVaults(uint256)", +"63069a35": "assign2(address,uint256)", +"63079315": "lengthOfCommonPrefix(bytes,bytes)", +"63086b5e": "afterSoftCapDuration()", +"6308769e": "LogFinishICO(address)", +"6308a76f": "_approveMint(uint256)", +"6308ae65": "managersCount()", +"6309242c": "setUserHatchRate()", +"630a9f94": "viewMemory(uint256)", +"630babac": "WhitelistParticipant(address)", +"630bae99": "payoutWithFee(uint256)", +"630bcd99": "drawRandomItem(string,uint256)", +"630c010e": "getElements(uint256[])", +"630cd1e9": "ratePrivateSaleStage()", +"630cea8e": "submitSignature(bytes,bytes)", +"630d0552": "ColorPurchased(address,address,uint256,uint256)", +"630d43cc": "DoroDiamond()", +"630db9ee": "getRemoveMarketCalled()", +"630dbe79": "StandardERC20Token(string,string,uint8)", +"630dc19d": "_payoutJackpot()", +"630dd52f": "TOKEN_TREASURY()", +"630e07f1": "RESERVED_TOKENS_FOR_ICO()", +"630e0ae6": "createPersonGen0(string,string,uint64,bool)", +"630e1d5f": "hasEnoughStake()", +"630eb125": "getAuditAssignBlockNumber(uint256)", +"630f1e6c": "withdrawAsset(bytes,uint256)", +"630f479e": "perStageNxc()", +"630f6f47": "betWithAff(address)", +"630fd0ac": "totalSupplied()", +"6310c722": "convert(address,uint256,uint256)", +"6310d902": "getAddressBoughtCount(uint16,address)", +"631121ca": "ISCToken()", +"63121665": "countPeriod(address,bytes5)", +"6313bd30": "DEP()", +"631407a2": "setTokenSupplierAddress(address)", +"6315592b": "orderModify(uint256,uint256,uint256)", +"63155d2b": "craft(uint16[16],uint16[16],uint16[16],uint16[16])", +"63157e2b": "issue(uint32,uint8,uint256,bool)", +"6316f6d1": "getNotConstant()", +"63175913": "StandardSale(bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"63176ad9": "changeDealDate(uint256,uint256)", +"6317cc5b": "tokenCapForThirdMainStage()", +"631859d0": "calculatePotentialPayout(uint256)", +"6319d32f": "DOJI()", +"631a4231": "createContract(string,string)", +"631a925c": "Weekycoin()", +"631b0520": "getPaimentTime(address,uint256)", +"631b3672": "roundSetUp()", +"631b7e83": "LogResult(bytes32,address,uint256,uint256,uint256,int256,bytes)", +"631bdb63": "playerCurrentlyRegistered(address)", +"631c07f0": "getBonusByDate()", +"631c42ae": "ethExchangeWallet()", +"631c56ef": "depth()", +"631ccb1d": "getInfoMarketItem(bytes16)", +"631d3f3b": "liveDragons()", +"631d551b": "FAMEToken()", +"631d9b1f": "LuxProject()", +"631dc853": "EquitySharingSystem()", +"631dd1a2": "transferFreeze(address,uint256)", +"631de4d6": "replace(address,address)", +"631e0c69": "addMessage(string,string)", +"631f0d66": "upgradeAddress()", +"631f637f": "preSaleMaxCapInWei()", +"631f9852": "isSealed()", +"63200443": "FindLettuce()", +"6320212b": "refreshReputation(bytes32,address[])", +"63204648": "setMultiWallet(address)", +"6321f298": "MeraToken()", +"632261c3": "removeVendor(uint256)", +"63228b57": "KarmaToken(uint256,string,uint8,string)", +"6322961d": "getAddressByUsername(string)", +"6322bb39": "tradeEtherDelta(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,uint256)", +"6323b526": "transferFromTokenSell(address,address,uint256)", +"6323dc26": "GCRTokenERC20()", +"632447c9": "updateReward(address)", +"632473da": "CNC()", +"632488ff": "POOH()", +"6324af1f": "advisorsBalance()", +"6324e70b": "offerToLend(uint256,uint256,uint256)", +"63258462": "setHomeMaxPerTx(uint256)", +"63263858": "ethartArtReward()", +"6326cb5b": "_purchaseCompany(uint256)", +"6328af59": "YeedToken(uint256)", +"63299226": "teamOneId()", +"6329cfa5": "settleLend(bytes32[8],bytes,address,uint256,bytes,bytes,bytes,bytes)", +"632a3e52": "vestTokens(address,uint256)", +"632a8144": "midasFounderAddress()", +"632a9a52": "vote()", +"632ca5c9": "getArts()", +"632ccecd": "IkuraAssociation()", +"632ce0f8": "whoIsAdmin()", +"632e082a": "isMainFirstDay()", +"632e1dfe": "OWNER_ADDR()", +"632e2b95": "addWire(address,uint256,uint256)", +"632e44af": "distributeBonusTokensByList(address[])", +"632ebd6b": "changeIsOpenFlag(bool)", +"632f0ba6": "descriptionHashes(bytes)", +"632f83eb": "realWorldPlayerFromIndex(uint128)", +"632fbda4": "replaceController(address)", +"63301198": "AetherCore()", +"63302789": "TOKEN_FOUNDERS()", +"63304bc3": "m_lastFundsAmount()", +"6330ac09": "get_price(string)", +"6331e7d4": "beforeEach()", +"6331eae0": "saveTokenValues()", +"63334c58": "transferETC(address)", +"63340338": "fuint32(uint32)", +"633423be": "paymentAddress()", +"6335010d": "getVestingRevokeDate(address,address)", +"63365651": "InterfaceId_ERC721Enumerable()", +"63367f4d": "tagline()", +"6336ac19": "setTTGCoin(address)", +"63385ad1": "addNewAccount(address,uint256,uint256)", +"63385b64": "BerryToken()", +"633891c4": "getPlayerAff(uint256)", +"6338977e": "setMetadataUser(string)", +"6338f693": "Airdropped(address,address,uint256)", +"63391689": "withdrawForFourStep()", +"63392843": "decrease(bytes32)", +"63396109": "createGen0Token(address)", +"63397825": "changeMerchantAccount(address)", +"633982c5": "viewLatestEthTransactionRequest()", +"6339b5f6": "SUSIToken(uint256,string,string)", +"6339be39": "totalStarSupplyRemaining(uint8)", +"6339fbcb": "finishGame(uint32,bytes32)", +"633a6dde": "deathData_a9()", +"633a7574": "CowToken(address,address,uint256)", +"633ab5e0": "callchecked()", +"633b1954": "finalizeMigration(address)", +"633b4c04": "o_velho_problema(uint256,uint256)", +"633b5b1f": "presaleTotalWei()", +"633c78b5": "create(uint256[],uint256[])", +"633ce1d2": "premiumDomainK()", +"633d17eb": "toAscii()", +"633de6aa": "setTime2Rest(uint256,uint256)", +"633dfc70": "vote(bool,address)", +"633f7a82": "queryType()", +"6341b3fe": "subBrokerNum()", +"6341ca0b": "retrieveTokens(address,address)", +"634363f3": "amountOf()", +"63443679": "rateUpgrade(uint256)", +"6344a898": "setWeiRaiseLimit(uint256)", +"63453ae1": "distribute(address)", +"63456fa9": "getTokenById(uint8)", +"634663a5": "setPriceRatePhase2(uint256)", +"634667b2": "claimAndTransfer(address)", +"634710ae": "BYTC()", +"63472fad": "setVote(address,string,uint256,address,bool)", +"634758e5": "TodaNetwork()", +"6347a377": "nextAuction()", +"6347bb42": "SGACoin()", +"63482cf0": "eachUnlockCounts()", +"63488772": "WanersiLinkToken(uint256,string,string)", +"6348c4cf": "Money(address)", +"6348eae6": "neverPauseAgain()", +"634965da": "sendEther(uint256,address,address)", +"634993c6": "refill(bytes32)", +"6349cafa": "changePrice(uint16,uint256)", +"634b3df9": "minPriceInWeiForPre()", +"634b4a8f": "setOperater(address)", +"634b5043": "collectWinnings()", +"634b8dc3": "Altn()", +"634bc7db": "create(bytes32,bytes32)", +"634c5c51": "authorized_triggerStashedPayoutTransfer(uint256)", +"634c688a": "burnAllowed()", +"634d27c3": "getProviderIsForRent(uint256)", +"634d6e57": "investorFullInfo(address)", +"634df88e": "ENTA()", +"634e66ac": "admin_isWithdrawable(bool)", +"634eaff1": "ETERNAL_APPROVAL_VALUE()", +"634ec9f9": "buyKnowledge()", +"634ef3ce": "Mqthereum(uint256,string,string)", +"634ef8da": "_setSetting(string,uint256)", +"634f752b": "optionLibrary()", +"634fcb8e": "setupCrowdsale(address,bool)", +"634fe2a6": "others_prize()", +"63505ae8": "getBidsCount()", +"63506c16": "transferfromOwner(address,uint256)", +"6350b2c2": "mints(uint256)", +"6350ec6f": "changeYumAddress(address,address)", +"6351546d": "settleTransactionByMediatorFee(uint256,uint256)", +"635179ca": "setHiddenCeilings(bytes32[])", +"6352211e": "ownerOf(uint256)", +"6352585c": "ENCToken(uint256,string,uint8,string)", +"6352c538": "TokensWithdrawn(address,uint256)", +"63534dd8": "seedContract()", +"6353586b": "reward(address)", +"63542c26": "approvedToken(address,uint256,bytes)", +"635439ac": "updateCurrentGameCardId(uint256,uint256)", +"635550a6": "blockchainExchangeFrom(address,uint256,uint256,bytes32)", +"63558f5c": "transferEscrowship(address)", +"6355bf2f": "optionsSet()", +"635639b4": "_unpackPlayerData(uint256)", +"6356443e": "TokenPreSaleTransfer(address,address,uint256)", +"6356739d": "Sent(address,uint256,uint256)", +"63567673": "createBet(address,address,uint256,uint256,bytes32[])", +"63569ca8": "rewardProjectCompletion(uint256)", +"6356cdac": "Bonus(uint256)", +"6357cc12": "startpublicBattle(uint256,uint256)", +"6357ddaa": "getRandomTime(uint256)", +"63581c04": "setFactoryAsset(uint256,uint16)", +"63586d6a": "claimBondReward()", +"635875d9": "changeMinimumCommission(uint256,uint256)", +"6358aac0": "isInterestStatusUpdated()", +"6359036b": "redeemDaoBounty(bytes32,address)", +"63591d09": "poolMaxAmount()", +"635994fd": "create(address,bytes32,address,bytes32,address,bytes32)", +"6359a656": "EUnpause(address,string)", +"6359a974": "TOTAL_TOKENS_TO_DISTRIBUTE()", +"6359b5b1": "totalIssuingCollateral_limitedSum()", +"635a5d7b": "setHeartbeatTimeout(uint256)", +"635b9047": "ExpandCoin()", +"635ba8a1": "ApexTalk()", +"635ca669": "addBoardOnUser(address,address)", +"635cfda2": "Incrementer()", +"635d0239": "toUint(bytes,uint8,uint8)", +"635da243": "autorizar(address)", +"635e2abf": "_btcToken(address)", +"635eecea": "privateEventTokens()", +"635f6a79": "method3(string)", +"6360edc1": "getAllForPubKeyBetween(bytes32,uint256,uint256)", +"6360fc3f": "bought_tokens()", +"63615149": "withdraw(bytes32,bytes32)", +"63617328": "setJackpotCompleted()", +"6361d3e0": "unpauseActivity(uint16)", +"6361d9e9": "testConstructorUsingDeployedContract()", +"6362102d": "rebalanceEtherDelta(address,uint256)", +"63621532": "setGasUpperBound(uint256)", +"6362ffd3": "rebuyInformTime(address)", +"63637c87": "createNewPlayer(string)", +"636544be": "changeVeredictum(address)", +"63655ebb": "DiaryLog(uint256,bytes)", +"63657855": "_removeFromDebtRegister(bytes4,uint256)", +"6365dfd9": "RaisrToken()", +"63665f2e": "addAirdrop(address,uint256)", +"63669424": "EthBird()", +"6366b936": "freeUpTo(uint256)", +"63670e42": "UpdateSellAgentSiteReg(address,address)", +"636760a2": "Cyncrohnis()", +"636822fa": "FearOfMissingOut()", +"63689b4a": "moveTokens(address)", +"6369313d": "isHouse()", +"636a36e3": "ThingsbookChain()", +"636ae15d": "BROYALCOIN()", +"636b2ac3": "createDefaultGen0LinglongCat(uint256,address,uint256,uint256)", +"636b7e56": "pendingFunding()", +"636bb5ae": "CalculateStageValue()", +"636bd9dc": "cooAddress3()", +"636c6524": "Superpack()", +"636ca6c2": "EAAS()", +"636ce4d7": "BTL_SPARTAN()", +"636d37b1": "precrowdsalepricing(address,uint256)", +"636d98b1": "referrerPercent()", +"636f12fe": "b2sother(bytes32,bytes32)", +"636f6159": "tokenExchange()", +"636fa3c6": "preIcoToken()", +"636ff44e": "BAGToken()", +"63704e93": "getDocCount()", +"6370920e": "grant(address,uint256)", +"6370ef19": "updateDomainPrice(bytes32,uint256)", +"63722de4": "AllowSomeoneToViewMyKeys(address,string)", +"63723373": "checkSignature(address,uint8,bytes32,bytes32,bytes32)", +"63727449": "getMfgDetails(string)", +"6372ba1a": "dateEndICO()", +"63732cf0": "RCN()", +"63735598": "getPriceOfCampaign(bytes32)", +"6373786a": "SaturnPresale(address,address,uint256)", +"637431ae": "testCreatePricelevelUsingNewContract()", +"63746113": "resetCrowdSaleAddress(address)", +"63746b03": "createContractRide(string,bytes7)", +"63749225": "getPVPEntranceFee(uint256)", +"63750dfb": "changeLedger(address)", +"63755c16": "withdrawStandardTokens(address)", +"637666ce": "removeFromBlackList(string,address)", +"6376c910": "StageThreeEnable()", +"63772f33": "growthTokensPercent()", +"6377aaa6": "setAdsContractAddress(address)", +"6377ebca": "close_time()", +"6377ff20": "totalInactive()", +"6378378a": "NxahCoin()", +"63784191": "frozenForTeam()", +"63791e3c": "setPriceSetter(address)", +"63798661": "payPlace(uint256)", +"6379a852": "multiOperatorSend(address,address[],uint256[],bytes,bytes)", +"6379ed9d": "distributeFUD(address[],uint256,uint256)", +"637af51c": "updateUpdater(address)", +"637b2541": "_allocateTokens(address,uint256)", +"637b55eb": "exchangeEtherToToken()", +"637b93ed": "getInsuranceBalance(address)", +"637bcd2a": "userIsWhitelisted(address)", +"637c39d8": "systemAddresses(address,address)", +"637cc5c6": "XBlockToken()", +"637d3e00": "ProjectOwner_EnableProject(int256)", +"637dda3f": "getBalanceByIndex(uint256,address)", +"637e12f7": "getBlocksDesc(uint256,uint256)", +"637e86eb": "totBOTs()", +"637ea3e5": "setlogaddr(address)", +"637ec389": "activated_time_()", +"637fcf95": "getBoardMember(address)", +"63808773": "acceptContribution(bytes32)", +"63809953": "secondsPerDay()", +"6381ca26": "refundTransactionByMediator(uint256)", +"63820550": "OwnerEvents(address,uint8)", +"63822fdc": "addConsentTemplate(string,uint256,string,string,string)", +"6382789d": "currentLowestCount()", +"63839777": "getReturns(address,address)", +"63844a57": "mul32(uint32,uint32)", +"638560cf": "registerBool(address,bool)", +"6385cbbe": "minimalGoal()", +"6385f2fb": "DAZ()", +"63860139": "nextPrizePool()", +"63862fd5": "isSenderOriginalOwner()", +"6386c1c7": "getUserInfo(address)", +"63875261": "paladinAddress()", +"6388fafa": "niceguy1()", +"63891019": "testFailStartTooEarly()", +"63892068": "create(string,string,bool)", +"6389654e": "changeDailyWithdrawalLimit(uint256)", +"63897c7e": "changeSettings(string,string,uint256,uint256,address,address,address,address,uint256)", +"6389e019": "graceTransfer(address,uint256)", +"638a9ce9": "setProxy(address,bytes32)", +"638b1b14": "developmentAddress()", +"638b4463": "completeClosed()", +"638b9119": "soldCards()", +"638bcce3": "multilevel(uint256)", +"638c5ddc": "BonusListUpdated(address,address)", +"638d4788": "draw(uint8,uint8)", +"638dd56a": "getNumberOfEligibleMembers()", +"638e1e5d": "payTip()", +"638e3724": "Locker(address,uint256,address[],uint256[])", +"638eea8d": "PLATFORM_MONTHLY()", +"638f6575": "timeStarted()", +"638f8da4": "castleMaxLevelGap()", +"638fade2": "getMerchantPublicKey()", +"63905232": "balanceAll(address[])", +"63907180": "getDebrisNum(bytes32)", +"6390f519": "getNumTeams(uint16,uint8)", +"6391c315": "FundsWithdrawnAndTokenStareted(address)", +"6391d3b2": "getCountSenderLands(address)", +"63921a74": "canReceiveListing(bytes32,uint256,bool,address,uint256,uint256)", +"63929d3e": "getPendingKNCRateRange()", +"6392a51f": "balancesOf(address)", +"63937651": "batchTransferDiff(address[],uint256[])", +"6393b4eb": "expect(address,uint256,bytes,bytes32)", +"6394536d": "cosign(uint256,uint256)", +"639475ca": "TRIANGLE()", +"63958b5f": "sellSpecialTokensForPublicSale(address,uint256)", +"63981b33": "changedeposito(address)", +"63981bbc": "TotalSpenders()", +"63991a36": "getGenomeChildren(uint32,uint32)", +"639937d7": "maxSpinners()", +"639a9a67": "saleOpened()", +"639ab80b": "YTTD()", +"639bbb37": "donated()", +"639bd0bf": "proposeBountyTransfer(address,uint256)", +"639bef41": "setRecommender(address,address)", +"639cba6e": "getDetailsBattles(uint256)", +"639cd59c": "totalFeesAvailable(bytes4)", +"639d3e69": "listSubName(bytes32,bytes32,uint256,uint256,uint256)", +"639d57f2": "testGetBitSuccess()", +"639d71eb": "mixAmt()", +"639e01dd": "Team()", +"639ec4d2": "checkTokDev()", +"63a0557b": "teamAvailable(address)", +"63a0607b": "buyRock(uint256)", +"63a10042": "approveComponents()", +"63a1512e": "setOPM(address)", +"63a167f2": "collectorWeiCap()", +"63a24174": "GxCoinTotals(address)", +"63a2c393": "safeMulPercentage(uint256,uint256)", +"63a2de29": "crearJuegos()", +"63a2fdbf": "claimZeronium(uint64,uint64,uint64,uint64,uint64,uint64)", +"63a37503": "test_rewardPoolShare_noClaimableStake()", +"63a3c452": "getUnsold()", +"63a3cc80": "currentTotalTokenOffering()", +"63a3d383": "edoToken_()", +"63a411c0": "addDriver(address)", +"63a4b67b": "setArray(bytes32,uint256[])", +"63a599a4": "emergencyStop()", +"63a5bc71": "eitherAdminOrAdvisorCanDoThis()", +"63a6568f": "getPropertyLastUpdaterBecomePublic(uint16)", +"63a66d59": "bountyDeposit()", +"63a6cc7d": "getBuyers(uint16,uint8)", +"63a846f8": "admin(address)", +"63a8b945": "removeCounter(address,uint32)", +"63a8dac2": "changeSettings(uint256,uint256,uint256,uint8,uint256,uint256,uint8,uint8)", +"63a97d3f": "decreaseAllowed(address,address,uint256)", +"63a999cc": "uddr()", +"63a9c3d7": "verify(address)", +"63aa109c": "summFounders3()", +"63aa289b": "ownerTreesIds(address,uint256)", +"63aa56b1": "amend(address[],address[])", +"63ab7a25": "clearWaitPairBets()", +"63aba603": "AlphaToken(string,string)", +"63abc381": "alreadyParticipated(address)", +"63abfbaa": "tokensToFunds(uint256)", +"63abfd86": "CCChainToken()", +"63ac0f99": "depositBonus(address,uint256)", +"63ad0bbe": "templateProposals(address,uint256)", +"63ad803f": "EditTile(uint256,uint256,string,string,string,uint256)", +"63ae10fe": "getClientProviderUID(address)", +"63ae2bae": "updateUserCertification(string,string,string,string,uint16)", +"63ae71ca": "affiliateProgramWalletAddress()", +"63ae8d6c": "setBuyPrice(uint256)", +"63aea3e0": "PlayerInfo(uint256)", +"63aec5ce": "getActiveUserLists()", +"63af8570": "tokensToGenerate(uint256)", +"63b03896": "gcd(int256,int256)", +"63b0545f": "transferfrom(address,address,uint256)", +"63b0a5c3": "IdentityRegistry()", +"63b0e66a": "helper()", +"63b1152a": "releaseVault()", +"63b1806f": "NewReferralTransfer(address,address,uint256)", +"63b20117": "totalTokensSold()", +"63b2c2a9": "unlockTeamBBT(uint256,string)", +"63b3c007": "canDefrost()", +"63b3f4e6": "WinnerPayedTicketBought(address,address)", +"63b452fb": "ICO_RATE4()", +"63b45bd9": "socoreCheck()", +"63b4f786": "about(address,uint256)", +"63b56431": "PRCT100_ETH_OP()", +"63b57e34": "remainCap()", +"63b6240d": "computeEndowment(uint256,uint256,uint256,uint256,uint256)", +"63b68040": "lastBlock_v14Hash_uint256()", +"63b6b31f": "transferBalance(address)", +"63b700ff": "getStoryExpiryTime(bytes12)", +"63b75b59": "setAssetValue(uint64)", +"63b7f00a": "calculatePercentsFor(address)", +"63b80379": "AcceptDiscipleOffer(uint256)", +"63b82524": "ethReceivedPresaleTwo()", +"63b851b9": "updateMinimumEpochInterval(uint256)", +"63b87bb8": "openSale(uint256,uint256,uint256,uint256)", +"63b8bd44": "getBalanceofEthAgent()", +"63b8f7f7": "W4T()", +"63ba26fa": "QwasderToken()", +"63ba2c76": "toUintThrow()", +"63ba5e44": "fundem()", +"63ba7319": "BUILDING_PRICE()", +"63bafb96": "Log1(address,bytes32,uint256,string,string,uint256,bytes1,uint256,uint256)", +"63bb51a9": "setHash(address,bytes32,address,bytes32,uint256,uint256)", +"63bbe1b5": "transferAuthorizations()", +"63bce4e7": "softCapUsd()", +"63bd1d4a": "payout()", +"63be8fc8": "createNew(address)", +"63beeab1": "executeConstant()", +"63bf15c2": "_buildTimberCamp(address,uint256,bytes)", +"63bf8194": "mineFor(address,address,uint8,bytes32,bytes32)", +"63bf81cf": "createDiscipleSale(uint256,uint256,uint256,uint256,uint256)", +"63bf8d6a": "removeToken(uint8)", +"63bfe3d8": "SkillBeatsLuck()", +"63bfe52a": "addAddressToCraneList(address[])", +"63c05650": "addAddress(address,uint256)", +"63c06fe9": "mintForwarder(uint256,bytes32,address[],int256)", +"63c194f1": "NTFoundationAddr_()", +"63c1b753": "getAddressIndex(uint256)", +"63c281a1": "hitFoundationBalance()", +"63c3600b": "__stringToUint(string)", +"63c36549": "QueueIsEmpty()", +"63c37984": "thirdExchangeRatePeriod()", +"63c3e2e3": "clearTransferValue(uint256)", +"63c43415": "view60()", +"63c439a6": "secondCrowdSaleDate()", +"63c454ca": "ifFreeze(address)", +"63c4f031": "stop(bytes32)", +"63c6082f": "buyWithCustomerIdWithChecksum(uint128,bytes1)", +"63c65056": "TradeEthShop(uint256)", +"63c69f08": "getUserOrders(address)", +"63c6fe04": "addCities(bytes32[],uint256[],uint256[])", +"63c78e87": "withdrawEtherFromTrade(uint256)", +"63c7d473": "GoldAmountMelted()", +"63c988f9": "isAlive(uint8[176],uint8)", +"63ca7aaf": "FeeUpdated(address,address,uint256,uint256)", +"63cb2afb": "reserve1Address()", +"63cb344e": "setNctEthExchangeRate(uint256)", +"63cbab8c": "SELLER_STEP_1_OPEN()", +"63cc23ae": "Lesson_4(address,uint256)", +"63cc4aa2": "transferRemainingTokens()", +"63ccedfe": "MensariiCoin()", +"63cd1c51": "_createLottery()", +"63cd1da7": "dspcoin()", +"63cd44c9": "GetType(bytes32)", +"63cd99cb": "moo()", +"63cdcc57": "motionConfirming(uint256)", +"63cea450": "closePresale()", +"63ceb60d": "sponsor(uint256,address)", +"63cf1442": "JACK_DIST()", +"63cf2ef3": "limitLessThan(uint256,uint256)", +"63cf6ffa": "sellFish(uint16,uint16,uint8,address,uint256)", +"63d06dd4": "createContractPow(string,uint256,uint256)", +"63d08ae5": "Timebankc(uint256,string,string)", +"63d1055c": "proposeGame(string,string,uint256,bytes)", +"63d177e6": "unpauseICO()", +"63d17806": "operatingFund()", +"63d1e70e": "PHXroll()", +"63d256ce": "revoked()", +"63d29135": "SetEventData(uint256,string,string)", +"63d292d7": "STQCrowdsale(address[],address,address,address)", +"63d2be9d": "ratingOf(uint16)", +"63d36c0b": "calculateFinalPrice(uint8,uint8,uint256,uint256,uint256,uint256)", +"63d494ea": "becomeVoter()", +"63d4d4a9": "bonusRateInPercent0()", +"63d5243a": "getDaysPassedSinceLastTeamFundsBallot()", +"63d5502f": "presaleCap()", +"63d578c5": "ApolloSeptemTokenSpecialPurchase(address,address,uint256)", +"63d60745": "transferCreditsInternally(string,uint256,uint8,string)", +"63d64159": "max(uint8,uint8)", +"63d6519a": "CPCEPrivate()", +"63d6727a": "setStartStage3(uint256)", +"63d74226": "add_bounty()", +"63d7edb9": "VRCOIN_DECIMALS()", +"63d8c5b7": "RefundVaultWithCommission(address,address)", +"63d91851": "PUBLIC_CROWDSALE_CAP()", +"63d93f88": "transferFromWithoutAllowanceTest(address)", +"63d9b4b1": "sendGift(address,uint256)", +"63d9b770": "exploit()", +"63d9df85": "presaleContract()", +"63da5531": "tokenPerUsdNumerator()", +"63da9cf8": "signAttribute(uint256,uint256)", +"63db30e8": "minInvestedAmount()", +"63db3e63": "IPST()", +"63dc5400": "queryCurrentContractFunds()", +"63dcf376": "offChainPurchase(address,uint256,uint256)", +"63dcfa9e": "athleteAlreadyClaimed()", +"63ddbb99": "WBToken()", +"63ddc54d": "mmLib()", +"63de5323": "applicants(uint256)", +"63de6ad6": "purchaseCard(uint64)", +"63de882b": "wlStopBlock()", +"63deb2c5": "changeMemberAddress(address)", +"63def590": "untrustClient(address)", +"63df9769": "setReached(bool)", +"63e0c2f8": "whitelistAccount(address)", +"63e0f8c3": "StanleyNickels()", +"63e0f8c7": "referalBonus()", +"63e12cdc": "addCCUser(bytes32)", +"63e16fff": "nextGen()", +"63e1d57c": "getMaxSize()", +"63e27a63": "unlockTeamTokens(address)", +"63e2c349": "transferTokenAndLock(address,uint256)", +"63e321fe": "setDefaultHashes(uint8,uint8)", +"63e33e96": "totalSupplyUnits()", +"63e38ff3": "id_for_nym(uint256)", +"63e3eab3": "batchDeleteCandidateCache(address[])", +"63e3fbbd": "StopQuiz()", +"63e49fcd": "startPtopDeposit(address,address,bytes32,uint256,uint256)", +"63e4bff4": "giveTo(address)", +"63e4e5cc": "bountyPercentage()", +"63e561b6": "checkOrder(uint32[])", +"63e60df5": "GolemNetworkToken(address,address,uint256,uint256)", +"63e79315": "TokenERC20(uint256,string,string,uint256)", +"63e8dd96": "getCurrentOwners()", +"63e94cee": "getStage0End()", +"63e95a3c": "isNegligable(uint256,uint256)", +"63ea0143": "setTotalDeposit(uint256,address,uint256,address)", +"63ea6e44": "NewKing(address,uint256)", +"63eaa14d": "relock(address,uint256,uint256,int256)", +"63eac2d4": "getMyFalcon()", +"63eb963a": "dat()", +"63ebb3cf": "isValidSubmitter(address,bytes32)", +"63ebd4ff": "getFunctionAuthorized(address,address,string,bytes32)", +"63ebf801": "ChelleToken()", +"63ec3eb5": "WHENToken(string,string,address,address,address)", +"63ec96b7": "LogVictory(uint256,uint8)", +"63ed6d5d": "LogWhitelistRemove(address)", +"63eda29d": "prevSeriesSelloutHours()", +"63ee7c8d": "totalEscrows()", +"63ee8b88": "ico2Sold()", +"63eeb79a": "setMinEsteemAmount(uint256)", +"63eed1d7": "Alice(address)", +"63ef8d9e": "resetLotto()", +"63f019f6": "canBurnSecurity(address,uint256)", +"63f07aa4": "preSaleTokens(uint256,uint256)", +"63f0ae2e": "ProfitDelivered(address,uint256)", +"63f0ca5a": "BOUNTY_TOKENS()", +"63f114f2": "checkWithdrawValueForAddress(address,uint256)", +"63f160e6": "sentReveal(uint256,address)", +"63f1a089": "_mint(uint256,uint256,uint256)", +"63f1a9dc": "LogInvestorMigrated(address,uint256,uint256,uint256)", +"63f1de17": "ICONSORT()", +"63f225a7": "addLOCtoLHT(address,address)", +"63f22c24": "checkDelegation(address)", +"63f2493f": "settleETHBatch(address[],int256[],uint256,uint256)", +"63f32f63": "Price(uint256)", +"63f3dbe5": "VESTING_CLIFF()", +"63f55fc0": "setHolderGroup(address,uint256)", +"63f5679e": "changeDragonsStatsContract(address)", +"63f6100d": "buySome(uint256,uint256,uint256,uint256)", +"63f6271f": "LEGLToken()", +"63f75343": "setF2mAddress(address,address)", +"63f80de3": "issueCoin(address,uint256,uint256)", +"63f8a211": "sellOneStep(uint256,uint256,address)", +"63f9cb0e": "HLWCOIN()", +"63fa32f1": "newWinner(uint256,uint256,address,uint256)", +"63fa5716": "changeSoulReward(uint256,uint256,uint256)", +"63fa9888": "PredatexDua()", +"63fb5a1a": "putBuyOrder(address,uint256,uint256,uint256)", +"63fbc7bc": "expectPayment(bytes8,bytes32)", +"63fc98e3": "judgeEnableForTransfer(address,uint256)", +"63fcabcb": "BilancioMinimoAccount(uint256)", +"63fcf5de": "addtoContributos2(address,address,uint256,uint256)", +"63fd420c": "payoutMining(uint256)", +"63fd7552": "owedAt(uint256)", +"63fd7eb0": "chickenOf(address)", +"63fd91dc": "signUpForTournament(uint256[])", +"63fd9e38": "minInvest()", +"63fdca37": "HitCash()", +"63feeaaf": "smartContractStartDate()", +"63ff195d": "stakeOnBehalf(address,uint256,bytes32,uint256,uint256,uint256)", +"63ff6125": "donateToFeePool(uint256)", +"64004ea5": "getUserTotalPromoBonus(address)", +"640075f3": "isPositionClosed(bytes32)", +"64009184": "threeHotHoursEnd()", +"64017ea7": "submitExit(uint64,address,uint256,address,uint256)", +"640191e2": "channelManagerAddresses()", +"64020842": "isDisavowed()", +"640241b8": "acceptOnwership()", +"64027fbb": "minbet()", +"6402aca9": "getAllCardAddressesPriceOfOwner(address)", +"6402efd3": "tier2Rate()", +"64030441": "addCardsHash(uint256,string)", +"6403a9ed": "getVoteCountForOption(uint8)", +"6404865e": "OneOhana()", +"6406605b": "MetadataUpdated(uint256,address,string)", +"640708d6": "PRIORITY_SALE_START()", +"64070b6f": "p_setNextRoundSeedPercent(uint256,uint256)", +"6407e432": "mintTokens(uint256,address,address)", +"640853bb": "amountSoldPerPeriod()", +"640959bc": "getQuoters()", +"6409a4e3": "giveTokens(address,uint256,string)", +"640a404a": "getgamecardpos(uint256)", +"640a4d0c": "_deposited(address,address,uint256)", +"640bdd70": "setDividendFee(uint256)", +"640c3dbd": "isChipPassword(uint256,string)", +"640d3017": "SetMinSum(uint256)", +"640d84b5": "SetApplicant(uint32[],uint64[],uint32[],uint64[],int256,uint64[])", +"640ec47a": "assertTrue(bool,bytes32)", +"640efb0d": "setTravelPrice(uint256)", +"640f244b": "findSuitableGen()", +"640fe1e9": "availableForWithdraw(address)", +"64100038": "deleteUserClaim(address)", +"64109848": "tokemon20()", +"64109ae0": "MAINT_PRICE()", +"6410c41a": "priviledgedAddressBurnUnsoldCoins()", +"6411273f": "tapFab()", +"6412aeb1": "setBountyTokens(uint256)", +"641446eb": "splitPayment(uint256)", +"641579a6": "setMultiplier(uint256)", +"641620a2": "createMulti(uint256,uint256)", +"6416ec30": "Geet()", +"64179c1b": "ActivatedContract(uint256)", +"6417c08b": "implementsERC721d()", +"6417dec3": "setHSShopSaleFee(uint256)", +"6418345e": "updateMinimumInvestment(uint256)", +"6418b903": "transferRewardPool()", +"6418f643": "ClaimBlessings()", +"641a5f66": "getSendCoin()", +"641a8cb3": "MANHATTANPROXYBRDWY()", +"641ad8a9": "poolState()", +"641b58c2": "checkBet(uint256[],uint256[],uint256[],uint256,uint256)", +"641bbdfe": "claim(uint256,uint8,bytes32,bytes32,uint8)", +"641ca23f": "availableICO()", +"641d55e0": "buyClixToken()", +"641d6075": "getDailyWinners()", +"641e3f15": "notifyTokenIssued(uint256,uint256,uint256)", +"641e6b9d": "TestingEnabled()", +"641e8cca": "updateGameProprietaryData(uint256,string)", +"641e90de": "price5()", +"641f3b46": "isTokenExchange()", +"641f83a1": "calcEnvHash(bytes32)", +"6420e71c": "rateForPhase1()", +"64217bdf": "requestInterest(uint256,uint256)", +"6421fc04": "LockedMANA(uint256)", +"642231a6": "legendsCrowdfund()", +"6422816b": "betBLenght()", +"64228857": "getRevisionCount(bytes32)", +"642289f2": "MarketEnabled(address,address,address)", +"6423690f": "SmartDice()", +"64239cce": "purchaseUpAndSpend(uint256,uint256,bytes32)", +"6423b5f0": "miniMeToken()", +"6423db34": "Reset()", +"6423dbad": "getGreeter()", +"64245502": "STRegistrar()", +"6424bd8c": "Remove()", +"6424d686": "getEngineerCurrentVirus(address)", +"64253d2f": "HashnodeTest()", +"64256611": "collectedFunds()", +"6425fbed": "getJobStatus(bytes16,address,address,uint256,uint256)", +"64265b1a": "share_transfered(string)", +"6428366a": "payToGorgona()", +"6428925d": "toSTAR(uint256)", +"6428a652": "setPornstarsContractAddress(address,address)", +"6428fed4": "pendingJackpotForWinner()", +"6429161b": "createSaiLimitedEdition(uint256,address)", +"642ab4b1": "lastBidTime()", +"642b1759": "getMerkleLeave(uint256)", +"642b4a4d": "mainNetLaunchIncentiveReserveWallet()", +"642bdd15": "calculateNewPrice()", +"642c53e2": "GetData(bytes32,string,bytes32)", +"642c7aa2": "snatchHero(uint256)", +"642d345c": "byMaximum(bytes32,uint256)", +"642d63a3": "buyLottery(uint8)", +"642dfe55": "Bitmos(uint256,string,uint8,string)", +"642e8271": "NigeriavsArgentina()", +"642f1ddc": "nome_candidato_da_indice(uint256)", +"642f2eaf": "transactions(bytes32)", +"642f722c": "createRecord()", +"642f825a": "randomPetAuraBoost(uint64,uint8)", +"642fd0f6": "getPixelColour(uint256)", +"64308a6a": "_getPartSkillColor(bytes,uint256,uint256)", +"643124cf": "INZEI()", +"64319ae6": "updateUserEmail(address,string)", +"64322c9c": "drawingIdToCollectibles(uint256)", +"64325ddb": "currentClaimPrice()", +"6432679f": "getUserCapInWei(address)", +"64326c71": "getTotalGas()", +"64329400": "setHardParticipationCap(uint256)", +"6432dc4e": "sell_ppc()", +"6432e3cd": "CaDataContract()", +"6432e9e0": "calculatePayrollRunway()", +"6433ef42": "adjustWithdrawRate(uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32)", +"64341c0c": "getIPFSCode(bytes32)", +"643537aa": "getBFEX(address)", +"64362587": "SetRevealBlock(bytes32,uint32)", +"6436434e": "getAddressDnaIds(address)", +"6436b1b9": "getSpawningForCount(address)", +"64370755": "removeDistributionSources(address[])", +"64371977": "set(uint256,string)", +"64377452": "getUserHash(address)", +"64379150": "setNumberClaimToken(uint256)", +"6437ab0b": "checkCommitPeriod(bytes32)", +"64385828": "setDataColla_AB_01(string,string)", +"6438c43e": "getCurrentSchellingRound()", +"6438f449": "noviceDungeonId()", +"64392a80": "balanceOfOwnerInVault(address,address)", +"6439437e": "cloneIt()", +"643a7695": "verifyParticipant(address)", +"643ac0bd": "_unregisterAttack(bytes32)", +"643aff0f": "investorWallet()", +"643b18b6": "teamWallet_1()", +"643c6d1f": "PureChainToken()", +"643ce525": "teamLimit()", +"643d1be5": "setMainSaleStart(uint256)", +"643d6dc0": "getInfos()", +"643d71a2": "KODB(address)", +"643e1aa5": "SetStartTimeTLP2(uint256)", +"643e7365": "initialSaleContract()", +"643e77d8": "calculateProfit(uint8,uint256,uint256)", +"643f7cdd": "DAOpaidOut(address)", +"643f9b72": "SherolexToken()", +"643fcd27": "addieren(uint256,uint256)", +"64422ede": "createPoolsIfNeeded()", +"64422f3c": "multiDeltaBalances(address[],address,address[])", +"64425055": "returnedDataDecoded()", +"644280e2": "tokensForBounty()", +"6442af8d": "_totalRemaining()", +"644443ed": "addContractRole(bytes32,string)", +"64445d9e": "adminEditBallotOption(uint32,uint32,string)", +"6444a288": "setMinTokenForSP(uint256)", +"6446169b": "sellStar(uint256,uint256)", +"64461a55": "Synergy(address)", +"6446a339": "addAddressToPublicBuyerList(address)", +"6446afde": "getMappingElement(uint256)", +"6446ebd8": "deleteResources(address,address[],bytes4[])", +"644843f3": "LogNote(bytes4,address,bytes32,bytes32,uint256,bytes)", +"6448adc6": "tierLevel()", +"6448b46f": "pushCap(uint256)", +"6448b6cb": "closeVaultAccess()", +"644998ae": "maintain(int256,uint256,uint256)", +"644a3d42": "ANKR()", +"644a803d": "BlockTogether(address,uint256,uint256,uint256)", +"644a9db8": "sign(uint256,address,uint256)", +"644b1d1a": "CompetitionCompliance(address)", +"644b7a43": "getTokenByIndex(uint256)", +"644b7dc6": "_isOperatorFor(address,address)", +"644cf307": "preSaleBonus2Percent()", +"644d8164": "getDesc()", +"644d8cce": "burnMas(address[],uint256[],uint256)", +"644e4e4e": "LogVotes(uint8,uint256)", +"644e8b24": "getPrices(uint256,uint256,uint256[],uint256)", +"644fab74": "setTimeLock(address,uint256)", +"64506302": "okamiCurrentPurchase_()", +"6451447d": "buyoutFeePercentage()", +"6451ab58": "activeuser()", +"6452a10f": "emergencybeneficiary()", +"6452f344": "sayGoodbye()", +"6453558e": "founderTokenWithdrawnPhase3()", +"6455058e": "getStakedAudits(address)", +"6455780c": "getImportingParty()", +"6455cb97": "EPTest()", +"64561370": "oraclize_query(uint256,string,bytes[5],uint256)", +"6456d071": "addPatientReply(address,string,string,address)", +"64571245": "withdrawATN(address)", +"6457237b": "indexOf(uint256[],uint256)", +"64584b14": "executeOrders(address[],bool[],uint256[],uint256[],address[],address[],address[8][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[],uint256)", +"64584d16": "CardFootballers()", +"6458de1e": "ensOwnerPx()", +"6459361d": "setDetail(string)", +"6459a8dc": "PerseiToken()", +"645a8570": "teamAndAdvisorsAllocation()", +"645ac00b": "transferSignership(address)", +"645b8b1b": "status(address)", +"645bcd3a": "checkBasketExists(address)", +"645bd436": "clearDelegateAndUnlockTokens()", +"645c4625": "get_orderAddress(address,address,uint256,uint256,uint256)", +"645c6fae": "registerContract(bytes32,address)", +"645c9931": "SHPToken()", +"645c9ac8": "returnMixType()", +"645cd046": "bundleToken(uint256)", +"645d95d4": "LogBidAccepted(uint256,address,uint256,bytes32,uint256,bytes32)", +"645dbfd4": "updateRandom()", +"645dce72": "updateRelease(uint32,uint32,uint32,bytes20,bool)", +"645dfad7": "sellATR(uint256)", +"645e175c": "publicGetNote(uint64,bytes2)", +"645e6ddc": "bookingBalanceOf(address)", +"645f0d11": "toggleFactoryPower()", +"645f754a": "OZTToken()", +"6460c353": "PoWMiB()", +"64610c73": "ADA(uint256,string,string)", +"646156aa": "cancelTournament()", +"6461ed00": "TOTAL_TOKENS_SUPPLY()", +"6461fe39": "transferFromWithReference(address,address,uint256,string)", +"64631be6": "signatureOf(uint256,uint256)", +"6463d6bc": "getMaxBidder(uint256)", +"646439a3": "tradeStream()", +"64648589": "fundICO()", +"6464b107": "TRIUM(uint256,string,string)", +"6465d25a": "Aliencoin()", +"64663ea6": "withdrawAndSend(address,uint256)", +"646668b6": "getMaxBet()", +"64669d1b": "BadBitchCoin()", +"6466cfa1": "changeSellFee(uint256)", +"64679356": "Controller()", +"64679806": "last_number()", +"6468328e": "executeTransfer(address,uint256,bytes)", +"6468c099": "addAnimalType(uint128)", +"6469c348": "maintain()", +"6469c89b": "getNiceBets(uint256)", +"6469e87f": "isKickoffEnabled()", +"646cd69b": "postponeDueDate(uint256,uint256)", +"646cf24d": "assignTokenContract(address)", +"646d4f53": "PlayX100()", +"646d525a": "NetCents()", +"646d978b": "getKudosById(uint256)", +"646e90e7": "getAddBal()", +"646eba48": "releaseTokens(bool)", +"646f22c5": "getTicketsLeft()", +"646f2942": "CryptoJade()", +"646f7834": "lockCountingFromTime()", +"646fe5ee": "OwnershipTransferConfirmed(address,address)", +"646fec02": "ProposalAdded(uint256,address,uint256,string)", +"6470db2f": "removeAllowed(address)", +"647151b5": "sellUnicorn(uint256,uint256)", +"647308ee": "verifyWithdrawSignatures(bytes32,address,address,uint256,bytes,bytes)", +"64738c23": "makeOrder(address,address,address,uint256,uint256)", +"6473b34a": "batchAllocate(address[],uint256[])", +"64744d22": "getPoolDepositQspWei(uint256)", +"6474dd4c": "LuckyWorldCupToken()", +"6475e3d3": "MIN_BET_AMOUNT()", +"6475e47d": "DGT_contract()", +"647734b2": "setValidationAddress(address)", +"64779ad7": "pausedOwnerAdmin()", +"647846a5": "feeToken()", +"64794403": "setAddressOfERC20Tocken(address,address)", +"647aac0c": "race(uint32)", +"647b5ced": "pubsaleCap()", +"647b6065": "tokenIdToOwnerArrayIndex(uint256)", +"647d02d2": "closeFail()", +"647d5f14": "dividendinfo()", +"647dd08c": "callSender(address,address,address,uint256,bytes,bytes)", +"647e61f1": "setLargeInvestorApproval(address,uint256)", +"647f7058": "Commitment()", +"64801da1": "reliefRatio()", +"64802918": "div(uint16,uint16)", +"6480d014": "preicostarted()", +"64812751": "finaliseState()", +"6481f081": "sellVouchers(uint256)", +"64821338": "hasVoted()", +"648236e3": "acceptBidForSketch(uint256,uint256)", +"64826b7a": "publicSaleCap()", +"6482c535": "rateOfParking(address)", +"64832c4c": "heatUp(address,uint256)", +"648345c8": "setMessage(uint256,string)", +"648351b9": "MarbellaCoin(uint256,string,uint8,string)", +"64836227": "notifyWatcher()", +"64838603": "skinColor(string)", +"6483a330": "getPeriodInDispute(uint256)", +"6483ec25": "append(bytes32)", +"64847739": "isProposePhase()", +"6484ae80": "_addCharacters(address,uint8)", +"648583b4": "updateCandidate(address,bytes32,string)", +"6485cc52": "GBP_Omnidollar()", +"6485d678": "setActive(bytes32,bool)", +"6485e2e5": "_removeController(address)", +"64861329": "DiamondProjectToken()", +"648619dc": "serviceUnpause()", +"648621ec": "xnotify(string)", +"64864ca6": "Expand(address)", +"64868f97": "roundTokenLeft(uint256)", +"6486aa51": "isConfirmed(bytes32)", +"64887334": "setCompactData(bytes14[],bytes14[],uint256,uint256[])", +"6488c20e": "TransferableChanged(bool)", +"64893fcb": "totalVestedAmount()", +"648a0c91": "updateExchange(address)", +"648a5903": "isShortPositionExpired()", +"648aa3b1": "getComponentByName(string)", +"648ad97f": "setMain(uint256,uint256,uint256,uint256,uint256)", +"648b3514": "CheckpointToken(string,string,uint256)", +"648b45f6": "unequipMultipleUnits(uint256[])", +"648b7ce8": "Increment()", +"648bf774": "recover(address,address)", +"648c51eb": "isMyPlanet(uint256)", +"648c925e": "backToAll(uint32)", +"648d6367": "DocumentaryContract()", +"648d7219": "setOCG(address)", +"648d9e26": "startPublicIco(address)", +"648e3006": "getPurchasedTokens()", +"648e49e6": "dSET_XBL_ADDRESS(address)", +"648e625a": "confirmTransaction(uint256,address,uint256)", +"648f0bde": "Play(string)", +"648f4f0f": "tokenStoreAddress()", +"648fb06f": "mintMultiple(address[],uint256)", +"648fd473": "EBRK()", +"6490c7a8": "getArea(uint256)", +"64913477": "setMultisigWallet(address)", +"64916fcf": "WhitelistedCounterUpdated(uint256,uint256)", +"6491f0b7": "setLLV_edit_6(string)", +"64921844": "getTimePassed()", +"64928d24": "wasSaleEnded()", +"649371e0": "oracleCurrentInt()", +"649375da": "addEarned(uint256)", +"6493d7fc": "CircuitBreaker(address,address,uint256,uint256)", +"6493e64c": "upgradeTo(string)", +"6494b55b": "ceoAddCoo(address)", +"6494cde1": "endTransfer()", +"6494d477": "saltHash()", +"649564b3": "getOtherContractParticipant(address,uint256,address)", +"649677e1": "entranceFee()", +"64968f58": "set_presale_iconiq_arbits_per_ether(uint256)", +"6497129c": "getRoundNumber(uint256)", +"64976b4d": "setNplay(address)", +"64978c7f": "jembex()", +"6497b400": "_getFashionParam(uint256)", +"6497bd3a": "newPriceTicker(string)", +"6497d32e": "setCCH_edit_18(string)", +"6498156e": "preICOBuy()", +"64994978": "setFounder()", +"64996a43": "_computeCycleSkip()", +"6499e2d9": "ERC777DemoToken(string,string,uint256)", +"649ae9c6": "lockDate()", +"649c07d5": "is_contract(address)", +"649c0b21": "addressOfMSF()", +"649d56db": "getContractProps()", +"649e3c46": "createDoc(string,string,string,string)", +"649eea7f": "_transferCar(address,uint256,bool)", +"649efd6e": "mintForEverybody()", +"649f0153": "fiatBalance()", +"64a04d07": "ReconOwned()", +"64a08260": "adminRemoveRole(uint256,address,uint256)", +"64a20e2d": "getImpactDonor(string,uint256)", +"64a237f4": "VEGANToken()", +"64a31b80": "getRequiredReportsPerReporterForlimitedReporterMarkets()", +"64a41399": "contributeInCreditsToken()", +"64a48499": "getIntegerValue()", +"64a4a5d7": "testBitsEqualSuccess()", +"64a5a632": "getCompanyByName(bytes32)", +"64a640ef": "Bosscoin()", +"64a666f2": "getAuthorizedInsertAgents()", +"64a68943": "dividentSent(uint256,address,uint256)", +"64a7cc4b": "purchase(uint128)", +"64a7d7c7": "bidAuction(uint256)", +"64a80c0c": "openStream(address,uint256)", +"64a83d8b": "_removeTokenFromTranche(address,bytes32,uint256)", +"64a8a11f": "voteJUR(address,address,uint256)", +"64aabe92": "tryExec(address,bytes,uint256)", +"64ab23c9": "finalizeChangeStakingFees()", +"64ab374b": "getUnreadMessagesArrayContent(uint256)", +"64ab4702": "voteWeightUnit(uint256)", +"64aba263": "setInternalInfo(address,uint256,uint256,uint256,uint256)", +"64ac12b1": "multisig(address[],uint256)", +"64ac2c4a": "WavesPresale()", +"64acdb77": "disablePurchasing()", +"64acef7d": "newBP(bool,address,uint256,uint256,string,string)", +"64ad6027": "updateOrderNumber3(uint256)", +"64adc403": "getUserRewardPayouts(address,address)", +"64ae4451": "stateIs(uint8)", +"64aea551": "randnum()", +"64afab72": "remove(address,bytes32)", +"64afcf2e": "minSecondsBetweenPublishing()", +"64b09402": "setMetadataProvider(address)", +"64b13270": "registerDeed(string,string)", +"64b2eb2c": "publicOfferingExchangeRate()", +"64b3302d": "safeMult(uint256,uint256)", +"64b3b844": "getSaleInfo(uint256)", +"64b494d9": "setValInt(uint256)", +"64b4e6eb": "payRef(address,uint256)", +"64b55e8b": "SULTANT()", +"64b7571f": "distributeDividends(address,uint256)", +"64b7f1d3": "Rules()", +"64b837ab": "stopBlockjack()", +"64b9ca08": "noAdvert()", +"64bc6a74": "AllPartnersSet(uint256)", +"64bc82c3": "delegateAddresses(uint256)", +"64bd3066": "dispute(address,bool)", +"64bd7013": "wait()", +"64bd87d6": "scheduleCall(address,bytes,bytes,uint256,uint256)", +"64be8453": "NewUserAdded(address,address)", +"64beb745": "lockOwnership(uint256)", +"64bebead": "_FreeDom()", +"64bfc9a5": "stopBountyMint()", +"64c176eb": "setSmartToken(address)", +"64c2555d": "buyDay(uint16,uint256,string)", +"64c27f2a": "isOwnerOrOps(address,address)", +"64c2b768": "powered_up()", +"64c33c33": "setPrice(uint16,uint16,uint8,address,uint256)", +"64c34364": "hodl(uint256,uint256,uint256)", +"64c37043": "buyRareItem(address,uint256,uint256)", +"64c403d4": "getETHx2(uint256)", +"64c40bbc": "DCoin()", +"64c422d0": "participantToUBObought(address)", +"64c487ef": "isStoppingIcoOnHardCap()", +"64c638d5": "withdrawTokenToClientAccount(bytes32,bytes32,address,uint256)", +"64c66395": "getUIntValue(uint256)", +"64c76117": "endDistribution()", +"64c79bf3": "AddresstoString(address)", +"64c7b3bf": "Journal(uint256)", +"64c7b78c": "addOrg(string,string,string,string,string,string)", +"64c877f1": "depositLiquidateThePool(uint256)", +"64c88d62": "calcDemurrage(uint256)", +"64c8cd8c": "unlockMinedBalances(uint256)", +"64c8e825": "PooCoin()", +"64c96322": "setAllocationOpen(uint256)", +"64c96572": "TokenLMTC(uint256,string,uint8,string)", +"64ca55d0": "checkUserDivsAvailable(address)", +"64ca6478": "createImage(uint256[],uint256,uint256,bytes32[],string,string,string)", +"64cab0e3": "setCurrentPrizePool(bytes4)", +"64caf214": "setPlayerDetectGroup(address,address,uint8,uint32)", +"64cb5338": "FundedAmount(uint256)", +"64cbbd34": "WalletChanged(address,address)", +"64cbbdc7": "addDividendsForAddress(address,address)", +"64cbfdd6": "p_update_planetCryptoUtilsAddress(address)", +"64cc7327": "retrieve(string)", +"64cc7719": "getUserDataOnEther(uint256)", +"64ccd7a0": "getAutomatedReporterDisputeBondToken()", +"64cd1f69": "requestInvestment(uint256,uint256,bool)", +"64cd4a1a": "round4TokensRemaning()", +"64ce1068": "lockExpiration()", +"64ceed99": "foundersTimelock()", +"64cefc90": "fliqToken()", +"64cf6d71": "toBytes1(bytes,bytes,uint256)", +"64cf9167": "Numisma()", +"64d03095": "getSpecificTransaction(address,uint256,uint256)", +"64d03144": "Plaak(uint256)", +"64d05519": "createLastWill(address,string,string,string)", +"64d0bbc4": "increaseGenerationCount(uint256,uint8)", +"64d0d64c": "testControlCreateWithParentNotInUse()", +"64d0e83b": "jackpotWinCount()", +"64d12ec6": "getRevisionIpfsHash(bytes20,uint256)", +"64d17c08": "setServiceTokenAddress(address)", +"64d188eb": "fixAssetsAboveLimits(bytes32,bool)", +"64d34045": "setCCH_edit_20(string)", +"64d3e7c9": "ReserveToken(string,string)", +"64d40354": "limitAmount(uint256,uint256)", +"64d414bf": "getTokens(uint256,uint256,uint256)", +"64d4702f": "getNextKeyPrice(uint256)", +"64d4c819": "TYPE_HASH()", +"64d538d3": "StartIco()", +"64d563f1": "doubleClaimSegmentSlash(uint256,uint256,uint256,uint256)", +"64d57a03": "GainTempStuff(address,uint32,uint256)", +"64d582c0": "incentiveDistributionInterval()", +"64d5922f": "pingBlock()", +"64d5d024": "isValidBox(uint8,uint8,uint16)", +"64d6a95f": "changeGameParameters(uint256,uint256)", +"64d75891": "XXXXXXXX03(uint256)", +"64d79f20": "internalRegisterCertWithID(bytes32,bytes,bytes32,uint256,bytes32)", +"64d85348": "deleteOffer(address,address)", +"64d905c0": "awaitingParticipants()", +"64d98bd3": "ownerTransferJackpotToken(address,uint256)", +"64d98f6e": "isSolved()", +"64d9a9e9": "AirDropToken(string,string,uint8,bytes32,uint256)", +"64da8ad3": "settleSeller(address,uint256)", +"64dab033": "landmarkPriceStepDenominator()", +"64dab283": "getWHGDonationAddress()", +"64dad32f": "isTokenUser(address)", +"64db3a8a": "buyAura()", +"64db5aa8": "ARDBatchTransfer()", +"64dc68b8": "ILove0xBTC(string)", +"64dc807a": "burnUndistributedTokens(uint256)", +"64dd891a": "attack(uint256)", +"64ddc605": "lockupAccounts(address[],uint256[])", +"64dde40f": "isTournament()", +"64ddedc6": "Triangle(uint256)", +"64ddfa29": "getAdminAddresses()", +"64de4c1d": "setTatAddress(address,address)", +"64df049e": "protocolFeeRecipient()", +"64df19da": "removeCustomTimeLock(string)", +"64dfe85e": "Dsteem()", +"64e08644": "stakeRemainingToVote_Eth()", +"64e0bbc5": "checkMyTransactions()", +"64e19bdd": "ownerAirdrop(address,uint256)", +"64e1f38b": "howManyKeysCanBuy(uint256)", +"64e21c9e": "DirectFundingProcessed()", +"64e24f4b": "UpdateClientTokenAccount(address)", +"64e28148": "clear(address,uint256,uint256)", +"64e28636": "getLateFee(address)", +"64e2ec50": "collectOtherTokens(address)", +"64e2fdfa": "ToukenToken()", +"64e31d74": "RaffleLedger(string,uint256)", +"64e36d04": "hardCapInEther()", +"64e39b87": "setFundsWallet(address)", +"64e40eb9": "withdrawTokens(address,address,address,address)", +"64e4596e": "_getPVPContendersCut(uint256)", +"64e48fcd": "testResetBet()", +"64e48fde": "findPossibleDelegatorsOfRaw(bytes32)", +"64e4a8fb": "xaurCoined()", +"64e50fb9": "setIco()", +"64e593c0": "setStartTimeIco(uint256)", +"64e5c8be": "getRoundPrizeShare()", +"64e62afc": "setSegmentOwner(string,uint32,uint32,string,string)", +"64e749ff": "getPosition(bytes12)", +"64e779b1": "unmint(uint256)", +"64e7e4a4": "transferNotification(address,uint256,uint256)", +"64e8687f": "withdrawTalao(uint256)", +"64e8d682": "pre_startdate()", +"64eaa454": "crowdsaleAmountLeft()", +"64eaff54": "getSquirrelmasterReq()", +"64eb7327": "_getContent(bytes32)", +"64ebd70d": "the365address()", +"64ec8bdb": "creatorWithdraw()", +"64ed31fe": "authVotes(address)", +"64eda74b": "setIsFrozen(bool)", +"64eded20": "_getTokenAmountWithBonus(uint256)", +"64edfbf0": "purchase()", +"64ee49fe": "scheduleCall(address,uint256,bytes4,uint256,uint256,uint8)", +"64ef212e": "proxyTransferWithReference(address,uint256,bytes32,string)", +"64ef563c": "reveal_registration(uint256,address,address)", +"64f018d8": "issue(address,uint256,string,string)", +"64f05fd7": "calculateWithdrawableAmount()", +"64f06b39": "setPC(uint256)", +"64f101f0": "closeMint()", +"64f15430": "fundVesting(address,uint256)", +"64f1873b": "ICOstarttime()", +"64f39b47": "return_funds()", +"64f40a3c": "RESERVED_TOKENS_FUTURE_OPERATIONS()", +"64f42a99": "addUser(address,bytes32)", +"64f4b094": "getLowestBid(uint8)", +"64f54a17": "getLatestItemRaffleInfo()", +"64f65cc0": "setFinished()", +"64f67f33": "DIPToken()", +"64f6f7b9": "setup(address,uint256,uint256)", +"64f8ad1f": "get_default_approval_duration()", +"64f951e9": "sessionBlockSize()", +"64fa3070": "getEscrowFee(address)", +"64faf22c": "left18(uint256)", +"64fb7d68": "coinMinter(uint256,uint256)", +"64fc2d9d": "_tryCreateEtherMonster(uint256,uint256)", +"64fe5cde": "MAX_UINT48()", +"64ffb47b": "getTotalMicroKeys()", +"65011760": "DOCToken()", +"650271d2": "makeMove(uint8)", +"65030adb": "RESERVED_TOKENS_ICO()", +"65030e75": "setSecretContract(address,uint256)", +"6503178a": "setMinVeriAmount(uint32)", +"65033845": "XiaoshiToken()", +"65036ca9": "zethrBuyIn()", +"6503a701": "InitiatePayout(address,string,string)", +"6503e5ff": "mFUNDING_BONUS()", +"65045a2b": "bottomName()", +"650462ab": "tokensMasterNodes()", +"650500c1": "whatIsTheMeaningOfLife()", +"65050e27": "checkCandy(address)", +"65054e55": "claimSellerFunds(address,address,address,uint256)", +"65058f4c": "requestPayout()", +"65061957": "EMPTY_RESOURCE_SET_ID()", +"65066810": "WHITELIST_SALE_LIMIT()", +"650669d2": "getCompte_1()", +"6506b0d6": "setData(string,string,string,string,string,string)", +"6506b623": "rotateBitsLeft(bytes,uint256)", +"65084b76": "OpenRegistryRules(address)", +"6508978b": "updateLatestSaleState()", +"65089dd8": "freezeStatsSumHours(uint256)", +"65093661": "newCommunity(address)", +"650944a6": "beneficiaryStash(address)", +"650955d4": "HashToken()", +"65098bb3": "calculateCrossConnectorReturn(uint256,uint32,uint256,uint32,uint256)", +"6509c195": "setPartnerPool(uint256,uint256)", +"6509e776": "CC()", +"650b147d": "paidToPartners()", +"650c2b28": "tokensPerDollar()", +"650c4226": "changeFees(uint256,uint256,uint256,uint256)", +"650ce14c": "registerPublisher(address,bytes32[5])", +"650d0aa3": "ChangeFee(uint16)", +"650d22e8": "countryTimeLock()", +"650d5d6b": "get_status(uint256)", +"650d993b": "getCustomer()", +"650dd4fb": "_createCountry(string,uint256)", +"650e1505": "createLock(address,uint256,uint256)", +"650e85af": "setUserRoles(address,uint256)", +"650ee1ee": "NewSale(uint256,address,uint256)", +"650f1dd3": "isSupplier(bytes16)", +"651006c0": "getCreateMarketDenominationTokenValue()", +"6510076f": "giveTokensOne(address,uint256)", +"65103f6e": "hasFees()", +"651044a2": "BitcoinpalletToken()", +"6510cc17": "INITIAL_mulFactor()", +"6510ef4d": "oraclize_query(uint256,string,string[5])", +"65113528": "getBoosterType(uint256)", +"65114459": "getOpenPackageId()", +"6511a98b": "testRegisterProduct()", +"6511eadb": "marketingProfitAddress()", +"65121205": "calculateDevCut(uint256)", +"65121f68": "add1Y(address,uint256)", +"6512c9b5": "OwnersProductCommissionChanged(uint256)", +"65131f63": "getMembersOfTier(uint256)", +"65132ad3": "Police_3()", +"651398e6": "allocateTokenForAdvisor(address,uint256)", +"6513fafe": "resistWhiteList(address)", +"65141c20": "setRemixCount(uint256,uint256)", +"65147784": "Pasband()", +"65149a76": "calculateWinnings(bytes32,address)", +"6514aaca": "minimumCommission()", +"65153632": "assertEq11(bytes11,bytes11,bytes32)", +"65158b3b": "contributor(uint256)", +"6515c1fa": "defineMecenas(address)", +"6515c6a9": "paused2()", +"6515d28c": "getLockingTypeCount()", +"6516395a": "lockCustomer(address)", +"651680af": "stage5Deadline()", +"65170435": "FASDF(uint256)", +"651738a3": "setMinScaled(int8)", +"6517ef33": "getNumberOfOrders(uint256)", +"65181ad3": "GET_METADATA()", +"6518361e": "SCT(uint256,string,uint8,string)", +"651883c1": "batchSpawnAssetWithCreator(address[],uint256[],uint256[],uint256[],address[])", +"6518ad22": "placeETHBid(uint8)", +"65195bc7": "DPNPlusToken()", +"6519fac2": "userExisted(address)", +"651bb617": "tokenlength()", +"651bc2fb": "reserveNIMFAAddress()", +"651bfd2d": "itemPrice(address,uint256,uint256)", +"651c2ff9": "preTge()", +"651c45d2": "addTicket(address,uint256)", +"651c5c84": "TokenWalletHolder()", +"651c5d2d": "getGiver()", +"651c9e99": "GOGRN()", +"651cd08d": "validateStart(address,address)", +"651dd0de": "values(bytes12)", +"651ed944": "startPreICOStage()", +"651f066a": "playerBalance()", +"6520715a": "approveClaim(bytes32,string)", +"6520768d": "modName(string)", +"652084c0": "storeKey()", +"6520ca0d": "levelUpMining(uint256)", +"6520fde5": "auctionPaused()", +"652106d8": "tokenTribe(uint256)", +"65213840": "prizeMoney()", +"652139e2": "setAngelFinishDate(uint256)", +"65216a41": "airDrop(address[],uint256[])", +"6521c03c": "createContribution(address,uint256)", +"65225665": "getPlayerAddress(uint256)", +"65227c7d": "RenCap()", +"65228934": "setOperationsCallGas(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"6522bff1": "update(uint256,string,string,string)", +"65243f87": "findNextWeekday(uint256,bytes2)", +"6524f107": "BlobStore()", +"6525a233": "ORACLIZE_COMMISSION()", +"6525c29d": "rejectAdvertiserCharges()", +"6526db7a": "remove(uint256,uint256)", +"6526ecee": "KingOfTheEthill()", +"652740a7": "TransparencyRelayer(address)", +"6528ef46": "BBY(uint256,string,string)", +"6528f4cb": "getDivRate(uint256)", +"652918bc": "updateProfit(uint256)", +"6529abba": "setSellComission(uint256)", +"6529d1c9": "pricesOfDate(uint256,uint256,uint256[],uint256)", +"652b51eb": "RefundEnabled(uint256)", +"652b810c": "setInternalStakingAddress(address)", +"652c00c9": "maintainPlayer(address,uint256)", +"652ca8f4": "cofoundersSupplyDistributed()", +"652d38fc": "getTotalIn(address)", +"652da5ff": "b(bool)", +"652dad7b": "batchDecreaseApproval(address[],uint256[])", +"652db9ab": "_distribute(address,uint256)", +"652de5ad": "countPerfManagers()", +"652ebb4c": "tokenPriceInETH()", +"652edd41": "purchaseDatesEdition(uint256)", +"652f1f16": "addSignature(string)", +"652f6494": "treasuryOfficials(uint256)", +"652f78cc": "allocateCommunityToken(address[],uint256[])", +"6530b7f9": "_createDrink(string,address,uint256)", +"6530e008": "STAGE2_TIME_END()", +"6531041b": "updateMIN_CONTRIBUTION(uint256)", +"6531a708": "getHolderEditions(address)", +"6531dbff": "totalFundedEther()", +"65325871": "transferableTokensOf(address)", +"6532b646": "SFI()", +"65343fcb": "TrustEth()", +"6534b4e2": "IsPayoutReady__InfoFunction(bytes32)", +"6534ccd2": "addHouse(address)", +"6534eb76": "recycling(uint256)", +"653704b1": "_changeName(string,uint256)", +"65372147": "result()", +"65375f38": "updateCustomerKYC(address,address,address)", +"6537e401": "setIII_S(uint256)", +"653853c0": "AMLToken()", +"6539335a": "toTipoEnte(uint8)", +"65395242": "MathisTestToken()", +"65397d5e": "refundOIDIndex_()", +"653a8f14": "getNumTilesFromBoard(uint16)", +"653abf37": "setDecision(bytes32,address,address)", +"653ac422": "invest(address,address,uint256)", +"653c3174": "investorsNumber()", +"653c95b8": "getContribution(address,uint256)", +"653c968a": "Bethopia(address,address)", +"653c9eea": "isBS(address)", +"653cfd2f": "testTemp4()", +"653d1ca4": "getPI_edit_21()", +"653e0f7f": "participants(bytes32)", +"653e2e0d": "setLastPositions()", +"653f23f8": "registerJuryMember(string,address)", +"653f7219": "AddVerifiedInfo(bytes32)", +"653fbca1": "payableEtherReceived()", +"653fcf4c": "pewdiepie()", +"65401882": "setDB(address)", +"6540742f": "MIN_BET()", +"6540dc07": "_destroyImpl()", +"6540fcc2": "PRICE_PRESALE_WEEK1()", +"654142c7": "getBoolField2()", +"65419516": "bettingStart()", +"654259dd": "availableAmount(address)", +"654286d1": "changeFrozenBalanceAll(uint8)", +"6542fed7": "evaluateShareholders(address,address)", +"65433e7f": "AntFundRobotToken()", +"654470fc": "getTotalSellingItem()", +"65449436": "CryptoConseilSuisse()", +"65450a90": "ACEBlock()", +"6545bed3": "Dice(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"65472731": "lastBlock_a5()", +"6547c080": "Renmin(uint256,string,uint8,string)", +"65483f69": "getBNTBalance(address)", +"65488541": "Harimid(uint256)", +"6548b40d": "depositErc20(address,uint256)", +"6548e9bc": "setRelayer(address)", +"65497caf": "limitDateSale()", +"654a1855": "CentToken(uint256,string,uint8,string)", +"654a95f2": "calculateEggSell(uint256,address)", +"654a9f69": "CappedCrowdsale(uint256,uint256,uint256,uint256,address)", +"654af496": "callDividend(address)", +"654b3110": "allowIssua()", +"654b6105": "DestiNeedToken()", +"654c2111": "Cash311()", +"654c6daf": "totalTeams()", +"654c7381": "listItem(uint256,uint256,address,bytes32)", +"654c8748": "setBitSTD(address,address)", +"654cf88c": "store(bytes32)", +"654d146a": "costAndBuyTokens(uint256,uint256)", +"654e27f9": "callBtoWithSto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"654e51e7": "setRewards(uint256,uint256)", +"654f18b1": "DragonPriceUpdated()", +"654f1ccb": "getGamesLength()", +"654f4575": "getTopN(uint256)", +"654f4b61": "bidHash()", +"654f7d40": "ETHERRED()", +"654f97a3": "setClaimStatus(bool)", +"655012a9": "sumPrice()", +"655042ee": "OSCoinToken()", +"655059db": "create(bytes32,bytes32[])", +"655187b2": "Aragon()", +"6551fb11": "localsStore(address,address)", +"65521111": "isAble(address,uint8)", +"6552a562": "updModule(string)", +"6552d8b4": "removeReceiver(address)", +"655330f4": "NLog(uint256)", +"65536ab3": "BFEXToken()", +"655388be": "walkTowardsBlock()", +"65538c73": "fireEventLog0()", +"65538da0": "preSaleOpened()", +"655391c9": "updateBaseTokenURI(string)", +"6553b03c": "cloneContractor(address,uint256)", +"65540940": "partnerAllocateRestrictedTokenTo(bytes32,bytes32,uint256)", +"6554d179": "attachedSystemActive()", +"65550e70": "getNextAvailableCard()", +"6555394b": "updatePrice(address,bytes32[],uint256[],uint256)", +"655584d6": "ChangeDate(uint32)", +"6556f767": "getBytes(address,bytes32)", +"6557a47c": "Tier_Wildcat()", +"6557b677": "lowTokensToSellGoal()", +"6557dfc8": "AnimeToken()", +"65581793": "S2()", +"6558488a": "scheduleSetBool(address,uint256,bool)", +"6559aeb2": "transferTimelocked(address,uint256)", +"6559c08d": "checkProblemsSolved()", +"655a4ebf": "revokeAttribute(address,address,bytes32,bytes)", +"655b08eb": "getRandom(uint256,uint256)", +"655b3667": "TOKEN_SUPPLY_AIRDROP_LIMIT()", +"655b97db": "ownershipLookup(address,uint256)", +"655bb0e8": "transferSubcontractsOwnership(address)", +"655bb565": "changeGasPrice(uint256)", +"655c737c": "getPositionOwedToken(bytes32)", +"655cc366": "LogGoalReached(address,uint256)", +"655d0862": "createSignedMessageOracle(bytes32,uint8,bytes32,bytes32)", +"655d225f": "myTime()", +"655d65c4": "limitSell(uint256)", +"655dc4c2": "getLawyerCount()", +"655e0d38": "changeBroker(address)", +"655e4224": "addEntryInSecondsPeriods(address,uint256,bool,uint256,uint256)", +"655e51f2": "MIN_GOAL_EBC()", +"655ec3e4": "transferSoul(address,address)", +"655f8294": "PreviousTime()", +"655fc4db": "vault_releaseDeposit()", +"655fcaf5": "feeReceiverWallet()", +"65604a11": "VESTING_WALLET()", +"6560a307": "suggestedGas()", +"656104f5": "_setOrganiser(address)", +"6561e6ba": "feeWithdraw()", +"6561e921": "becomeRenown(bytes32)", +"6561ffb9": "LOTTECHAIN()", +"65620283": "transferTokens(address[],uint256[])", +"65622cfd": "transferFor(address)", +"65630493": "ERC20Impl(address,address,address,address)", +"656362b5": "regFactory()", +"6563b2fc": "tokensLeftInPhase(int8)", +"6564a7af": "DeployENS()", +"6564ad28": "IFNToken(address,address,uint256,string,uint8,string)", +"65651b6e": "addSkillName(address,bytes32,address)", +"65670adc": "teamSupply18Months()", +"65675074": "getAllTokensOfUser(address)", +"65676c9e": "baseExchangeRate()", +"65679536": "month24Unlock()", +"65687008": "fundraiserAddress()", +"65688182": "recomputeLastAverageBalance(address)", +"65688cc9": "newGuard()", +"6568a279": "withdrawAll(address[])", +"656afdee": "register(string,bytes32)", +"656b275c": "expandY()", +"656b9952": "produce()", +"656ca11d": "CONFIG_FEES_MUL()", +"656d2f63": "ManagedAccount(address)", +"656d3091": "createEthSaleAuction(uint256,uint256)", +"656d677e": "releaseTotal()", +"656e8d6f": "getTutorialBabyGen(uint16)", +"656ea1f6": "snikerts()", +"656f416d": "uponTransferFrom(address,address,address,uint256)", +"656f64f5": "pendingGDPOracle()", +"656f6873": "ActualizePriceBeforeStart(uint256,uint256,uint256,uint256)", +"65704506": "currentGame(address)", +"657128a2": "altTokenOf(address,address)", +"657157e5": "canTrade(address,address)", +"657206ef": "getSignedAddresses()", +"6572ab5b": "shareCycleIndex()", +"6572ae13": "calculateWinner(uint256,uint256)", +"6573ee1e": "doFailingApprove()", +"6574bdd2": "newDream(address,string,string)", +"65757eeb": "removeDiscounts(uint256[])", +"65766b64": "stageBegin()", +"6577ab77": "_checkSeal(address,address,address,uint256)", +"65781994": "SESAPACToken()", +"65783c66": "checkTicket(uint32)", +"6578d920": "_canSendGameGift()", +"65791e46": "setTimeTransferAllowance(uint256)", +"65794de3": "secondStageDuration()", +"657a2ffa": "Register(uint8,string)", +"657a37ad": "depositAndSell(address,address,uint256)", +"657ad078": "moveOwner(uint256[3],uint256[4],uint8[176],bytes32,bytes32,uint8)", +"657ad479": "presalePerEth()", +"657ba57b": "show_The_name_of_option_C()", +"657c5dae": "ApproveTitle(uint256)", +"657d38b8": "endICOp3()", +"657db38d": "ten_wallet()", +"657edc11": "removeLootbox(address)", +"657f3ab0": "getPricePoint(uint256)", +"657f4783": "getRealGoldBought()", +"658030b3": "tokenInstance()", +"65826666": "executePullPayment(address,string)", +"658268c1": "StableCurrencyToken(uint256,string,string,uint256)", +"658311ab": "jackpotLevel()", +"658389cb": "isFromCountry(address,address,uint256)", +"6583e239": "STATUS_DEAL_APPROVE()", +"6584a5b5": "removeLock(address[])", +"6584ceb0": "StartNewEpoch()", +"6584fcce": "ATCReserveLocker()", +"658523d9": "StrategicToken()", +"65855010": "rateSale()", +"658577e9": "buyXid()", +"65857a5e": "parkingOn(address,uint256)", +"65859862": "add_arbits(address,address,uint256)", +"6585c27c": "getrandoms()", +"6585dc12": "enableRefundPeriod()", +"658612e9": "gasFee()", +"65862330": "TestableStandardCampaign(string,uint256,uint256,address,address)", +"65863b24": "getTotalCollectedPromoBonus()", +"6586bb25": "MAXIMUM_PARTICIPATION_AMOUNT()", +"6586bd51": "getNodalblockSender(string)", +"65879e72": "JED()", +"6587ab3d": "toggleSafetyMode()", +"6588875e": "ShutterToken()", +"6588c11c": "_startSwap()", +"658a5692": "_totalEthCollected()", +"658b98a9": "pointMultiplier()", +"658bc083": "initDistribution(address,address,uint256)", +"658bf147": "setArea(uint256,bytes32)", +"658c55ed": "saleProceedsFiat(uint256)", +"658cc376": "getCensuringCount(uint16)", +"658d3423": "getGameMinAmountByBet(uint256)", +"658dc76f": "addChunk4ToWhiteList()", +"658df3f7": "approveCompletedMilestone(uint256)", +"658e587f": "getWithdrawConfirmationCount(uint256)", +"658eefd1": "notifyRefundToken(uint256,address)", +"658f2ad6": "CrowdSale_Resume()", +"658fbfbc": "transferOnError(address,uint256)", +"659010e7": "m_spentToday()", +"65909081": "Brothel(address)", +"6590f0ed": "DUKCoin()", +"65921f02": "paladinEquity()", +"65926a20": "changeSaleOn(uint256)", +"6593643c": "CreateIND(address,uint256)", +"65937ab9": "isUpdateAuthorized(address,uint256)", +"659382fb": "payoutETH()", +"6594479f": "LTYP()", +"6594d99b": "isDataNo(bytes)", +"6594ea6c": "EGGS_TO_HATCH_1SQUIRREL()", +"65957bf5": "getShareToken(uint256)", +"6595c94e": "calculateTierBonus()", +"6596217b": "HAYATO_FTL_SPEED()", +"659621b5": "r0()", +"65968727": "innocoinToken()", +"6596cff3": "setCrowdsaleContract(address)", +"65975691": "getDividends(uint256,uint256)", +"6597a076": "getBonuses()", +"6598afb9": "yearlyBlockCount()", +"65995733": "getSalaryTokenValue(address,address,address)", +"65995cc8": "uploadAdvertisement(uint256,string,address,uint256)", +"659a46e8": "coinLockRmoveMultiple(address[])", +"659a7486": "inTradingTime()", +"659a9cbc": "coinsUnit(uint256)", +"659ae215": "saleDateFinish()", +"659b586e": "readQuantityList(address,uint256,uint256)", +"659b9c72": "UsersNumber()", +"659bd174": "TransferredTimelockedTokens(address,address,uint256)", +"659d1185": "angelTimeLock()", +"659d20eb": "getFoundersGames(address)", +"659d6bd1": "readPower()", +"659d7aaa": "sendEtherManually(address,uint256)", +"659de63b": "distributeToken(address[],uint256[])", +"659e0729": "getFirstAmount(bytes32,bytes32)", +"659e27b0": "setWhitelistingAddress(address,address)", +"659e69e9": "setDelegateAdmin(address,address,string,bool)", +"659eeabc": "tokensWithAmount()", +"659eeef1": "increasePaymentsBalance(address,uint256)", +"659f9e3c": "lastEpochBlockHeight()", +"659fb968": "getOracleOutcomes(bytes32[],address[])", +"65a096dc": "changeWithdrawableRound(uint256)", +"65a114f1": "resetTime()", +"65a178c0": "getTlength01()", +"65a20ef9": "hasRole(uint256,address,uint256)", +"65a26185": "updateGranted(address,address)", +"65a31545": "doDeposit(address,uint256)", +"65a3d8f0": "setEtherCentPrice(uint256)", +"65a4c957": "resultsDelay()", +"65a4dfb3": "oraclize_query(uint256,string,string,string,uint256)", +"65a572dc": "EGREngravedToken()", +"65a5e708": "Upgraded(uint256)", +"65a5f1cd": "changeFoundation(address)", +"65a61ab4": "RWSC()", +"65a6bb29": "getAllOracles()", +"65a707bf": "DrugDealer()", +"65a7dcec": "addWinners()", +"65a8a483": "setColdWallet2(address)", +"65a91d4a": "createAmountFromTmedForAddress(uint256,address)", +"65aa96bd": "postJobOffer(uint256,address,uint256,uint256,uint256)", +"65aade1a": "getEmployeeId(address)", +"65ababe9": "createERC20Token(string,uint8,string,uint256)", +"65abb3f2": "_doAddPollOption(uint256,bytes)", +"65ac0d8b": "Withdrawl(address,uint256)", +"65ac2320": "ownerName()", +"65ac4341": "getTotalAmount()", +"65ac8c2a": "getSellOrdersInfo()", +"65ad9f34": "setHardCap(uint256,uint256)", +"65ae247e": "issueLockedTokensCustom(uint256,uint64)", +"65aebe7b": "ind(address,address)", +"65aec658": "_createCitizen(uint16,uint16,uint8,bytes32,bytes32,bytes32)", +"65af2a7d": "investedDDT(address)", +"65afa594": "Member_GetMyTokens()", +"65b040c8": "setPriceWithBonus(uint256)", +"65b051b8": "MEWSToken()", +"65b06136": "makePayouts()", +"65b0bc85": "createNameAndPoint(bytes32,address)", +"65b0d711": "updateApprovalOfToken(address[],bool)", +"65b0e5b3": "setethrate(uint256)", +"65b1b92d": "unLinkNewHouse()", +"65b1c987": "resetBurntTokens()", +"65b1fdf4": "scheduleIssuePOIs()", +"65b27205": "testFailMintWhenStopped()", +"65b2a863": "revoke(string)", +"65b36bbb": "countpat(uint256)", +"65b37d70": "HotManChain(uint256,string,uint8,string)", +"65b3a7ca": "isGameExpired(uint256)", +"65b686b0": "burnRemainTokenOffering()", +"65b6cd66": "setUserTransactions(string)", +"65b6d9e2": "a(uint256,string)", +"65b70e45": "UpMineLVL(uint256)", +"65b7a89d": "DeDeContract(address,address,address,uint256,uint256,address,address,uint256)", +"65b7b357": "getVotersAnswer()", +"65b892a1": "withdrawForOneStep()", +"65b980ab": "performTransaction(address,bytes32)", +"65b9e37d": "hardParticipationCap()", +"65ba12b8": "percentWeiJackpot()", +"65ba331b": "IcoStagePeriod(uint256)", +"65ba36c1": "interfaceHash(string)", +"65baf5db": "tier2Start()", +"65bb193e": "createInsurance(string,address)", +"65bbb26a": "Linamyd()", +"65bc35fa": "Streem(uint256,string,string,uint8)", +"65bcaf4a": "Ubiou(uint256,string,string)", +"65bcfbe7": "payouts(address)", +"65bdadf6": "ninthTime()", +"65bf1ffc": "authorizedStartTrading()", +"65bfdb0b": "_receiveChild(address,uint256,address,uint256)", +"65c04faf": "random(uint32,uint256)", +"65c09830": "changeStatusGame(uint8)", +"65c0eecf": "BitcoinLiza()", +"65c13fdb": "changeGasPriceLimit(uint256)", +"65c19af0": "getStringLength(string)", +"65c24799": "getYayNum(uint256)", +"65c2c60f": "checkName(bytes32)", +"65c2d3a0": "romper()", +"65c2e8a1": "bossAdmin()", +"65c2fab2": "NewIssue(address,uint256,uint256)", +"65c301ab": "getDriver(address)", +"65c40b07": "bonusesDates(uint256)", +"65c4a861": "cordY(uint256)", +"65c4b463": "_tag(bool,string)", +"65c5826f": "ENC()", +"65c5e683": "mine(address,uint8,bytes32,bytes32)", +"65c683cf": "metadataOfToken(uint256)", +"65c724cd": "dividendsCollected()", +"65c72840": "getDay(uint256)", +"65c7b711": "MockToken()", +"65c91b0b": "testFailTransferOnlyTrustedCaller()", +"65c95a6b": "setUFee(uint256)", +"65c9e51e": "setDepositPeriod(uint256,uint256)", +"65cacaa4": "getVaultAddress()", +"65ccb687": "PULSToken()", +"65cd048b": "setDividendFee(uint8)", +"65cd1bea": "PayToken(address,address,uint256)", +"65cd3686": "setIsSendingLocked(address,bool)", +"65ce47fb": "_myDecimal()", +"65ce5222": "specificTransferFrom(address,address,uint256)", +"65ce7395": "setMinVote(uint256)", +"65cf3a48": "bonusPrice()", +"65d0a890": "Daio(uint256)", +"65d0e4a7": "addBot(address,address)", +"65d1926d": "dropAddress()", +"65d1df24": "s2s()", +"65d27248": "setSellPrice(uint16,uint16,uint8,address,uint256)", +"65d300ea": "CreateAds(address,uint256)", +"65d43868": "allowedOracleChangePercent()", +"65d48d0b": "freezeBalancesOf(address)", +"65d4bdab": "targetEth()", +"65d51dd5": "_phase2Supply()", +"65d5b48d": "PRECOMMITMENT_VESTING_SECONDS()", +"65d61ad6": "PwdHasBeenSet(bytes32)", +"65d6759a": "getGenome(uint256)", +"65d68308": "receiveTokenLoot(uint256,uint256,uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"65d6dbbd": "unPromisedPop()", +"65d6e6a4": "jackpotMaxTime()", +"65d73851": "calculatePrizeCut(uint256)", +"65d7d3d0": "LegacyReputationToken()", +"65d80117": "getResource(string)", +"65d8a20a": "updateTransactionFeePercentage(uint8)", +"65d8e32e": "setProfileHash(string)", +"65d967b0": "ETH_HARD_CAP()", +"65d9d8e2": "depositEtherForUser(address)", +"65d9df9c": "totally_decrease_the_supply(uint256)", +"65d9f31e": "addressFounders3()", +"65d9f55a": "removeValidationPreSigned(address,bytes32,uint8,bytes32,bytes32,bytes32)", +"65da1cfc": "AdminClaimed(address,address)", +"65da5603": "produce(uint256)", +"65db63d0": "kittensDroppedToTheWorld()", +"65db6c8c": "OPTIONAL_POOL()", +"65dba2b3": "removeTeamMember(address,bytes32)", +"65dbcc0f": "addThenSubUInt(uint256,uint256,uint256)", +"65dc128e": "p_setAirdropPercent(uint256,uint256)", +"65dc4e3a": "addCollateralMarket(address)", +"65ddf33b": "productsShipped()", +"65de1eb3": "getVendor(uint256)", +"65df517e": "CTHToken()", +"65df7933": "totalDevelopers()", +"65dfc20f": "setWalletFees(address,uint256)", +"65e00beb": "createFlowerAuction(uint256,uint256,uint256,uint256)", +"65e0c718": "DisputeResolved(bytes32)", +"65e0e117": "getSendersCalcTokens(address)", +"65e0e9a2": "preIcoState()", +"65e14731": "_kittenOwner()", +"65e16933": "buyPRETDETokensWithoutETH(address,uint256,uint256)", +"65e16a09": "transferadmin(address,address,uint256)", +"65e17c9d": "feeAccount()", +"65e1cc85": "foundersPercent()", +"65e21cb0": "transferNewBunny(address,uint32,uint256,uint256,uint32,uint32)", +"65e23ce3": "minimumEther()", +"65e2406a": "takeEthForExchange(uint256)", +"65e2409b": "getPlayerEnergyByAddress(address)", +"65e4349c": "NewStage(uint256,uint256)", +"65e44d06": "BITOToken()", +"65e47208": "lcBalance()", +"65e49444": "claim_bix_with_maturity()", +"65e4ad9e": "isAuthorized(address,address)", +"65e60ef2": "read(bytes32,bytes32)", +"65e62ee6": "getInvestorKycLimit(bytes32,uint8)", +"65e7096d": "allMaskGu_()", +"65e7ee50": "RCCContractTest()", +"65e807ab": "getTokenLossValue(uint256)", +"65e83ae1": "getCrowdsaleTokens()", +"65e8faf6": "isValidIndex(uint256,uint256)", +"65e93b3f": "getUserVotes()", +"65e9cc4e": "contributionPending()", +"65ea19a8": "set_notary(address)", +"65ea2b77": "ethaddrc()", +"65ea62ff": "initTransfer(address,uint256,uint256)", +"65eb0dec": "changeAllowedTakerBetsPerMakerBet(uint256,uint256)", +"65ec4c2e": "retirarDinero(uint256)", +"65ed16af": "_addBridgeNativeFee(uint256,uint256)", +"65ed4a45": "getVerifiedNumOrganizers()", +"65ed6e23": "getAllocations()", +"65ed8a4a": "proposedTotal()", +"65eec589": "_markWithdraw(address,uint256)", +"65ef1a3f": "setHotWalletAddress(address,address)", +"65ef617d": "AdminWalletUpdated(address)", +"65ef7b95": "getStoreAddressById(uint256)", +"65efd3a3": "addCertAdmin(address,bytes32)", +"65f0a00b": "ONETIDC()", +"65f17913": "monarchsByNumber(uint256)", +"65f27bea": "testSubBalanceFailsBelowZero()", +"65f2bc2e": "unitsOneEthCanBuy()", +"65f3c31a": "Put(uint256)", +"65f41211": "validStoreDest()", +"65f42e7a": "APTV()", +"65f4d9f6": "failInvestPercents()", +"65f520a7": "kittyData()", +"65f5463e": "CLIP()", +"65f594a7": "revealCurve(uint256,uint256,uint256,bool,bytes32)", +"65f63c1b": "queryToken(uint256)", +"65f68c89": "getId(address)", +"65f6a049": "sellGrimReapersAgainstEther(uint256)", +"65f6c15e": "ordersOf(uint256,uint256)", +"65f6d6a2": "FOUNDERS_TOKENS()", +"65f77c63": "getCertAddressByID(string,bytes32)", +"65f7aaff": "endRoundDecision()", +"65f84cbe": "_createWeightedMultiplierLot(address,uint256,uint256)", +"65f88c0d": "getNumUsers()", +"65f926ff": "getIdArrayItemsCount(address,address,string)", +"65f937ed": "sumOfAvailableIcoCoins()", +"65f97082": "startIco2(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"65fa2b97": "calculate_with_fees(uint256)", +"65fa2f7f": "getLastPrice(uint256)", +"65facff0": "_isMember()", +"65fae654": "Mychatcoin()", +"65fb99ba": "findUnConference(string)", +"65fba60d": "crowdsaleAllowance()", +"65fbc99f": "distributedSaleStakes()", +"65fc1253": "setExternalDependencies(address[])", +"65fc535b": "withdrawBenefit(address,uint256)", +"65fc783c": "getNumOfVoters()", +"65fcb49e": "maxContractBalance()", +"65fcf1b5": "releaseFirstUnlock()", +"65fddc81": "reducer()", +"65ff0f5a": "TradeListing(address,address,address,uint256,uint256,uint256,bool,bool)", +"65ff8220": "sampleContract()", +"65ffe43d": "lastFund()", +"66003666": "bountyTokens(address,uint256,string)", +"66005ede": "vc1Wallet4Pct()", +"6600811c": "tokenSaleHalted()", +"6600d282": "releaseAngelFirstVested()", +"6601345c": "changeTierController(address)", +"66013bdd": "withdrawToken(address,address,uint256,address,uint256,uint256,address)", +"6601cd77": "getExchangeDetails()", +"66025047": "isCategory(uint256,uint8)", +"660357f2": "removeWhiteListedContracts(address)", +"66035cc0": "adPriceHalfDay()", +"66040458": "signedApproveAndCall(address,address,uint256,bytes32,uint256,uint256,bytes32,address)", +"66042e7a": "etherToSendFund()", +"6604ca6b": "STO_KEY()", +"66056e8b": "destructSale()", +"6605bfda": "setTreasuryAddress(address)", +"6605ff66": "totalSales()", +"660686de": "cutBAU2Length(bytes32,address,uint256)", +"6606873b": "setMem(uint256)", +"6606b7d4": "democFee()", +"6606fe1e": "CABCrowdsale()", +"66081ec1": "JACKPOT_WALLET()", +"66092ea8": "ignited()", +"66098d4f": "plus(uint256,uint256)", +"66099706": "getChannelCred(address,uint256)", +"660a333e": "assetOwnerAdded(bytes32,address,address)", +"660aab8e": "profileOf(address,bytes32)", +"660b24b4": "emergencyTokenDrain(uint256)", +"660b7ad5": "rentDue(bytes32,string)", +"660ba74e": "_availableBetting(uint256,uint8,uint256)", +"660c325e": "evPayOut(address,uint256,address,uint256)", +"660c6813": "crowdsaleStopDate()", +"660d0d67": "dataStore()", +"660d5887": "registeredUsers()", +"660dee82": "addTask(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"660ef82d": "advisersAllocation()", +"660f77aa": "CVDToken()", +"6610a38a": "mountCitadel(address,address)", +"6610f7a8": "previousBurners(address)", +"6611611c": "MIN_INVESTEMENT()", +"661195bc": "transferFromLowFunds(address)", +"6611f5f2": "ZTR_ETH_extra_price()", +"6612283d": "subdivisionEnabled()", +"66125b25": "boolFunc(bool,bool)", +"661309ac": "allowedTransfers(address)", +"6613221f": "burnLand(uint256)", +"66134794": "exploreCount()", +"6613ee9c": "_isSigned(address,address,bytes32,uint8,bytes32,bytes32)", +"66154885": "getIncomingValueAsEth()", +"6615827b": "LogEscrowEthReq(uint256)", +"6615dd83": "setSeedSourceB(address)", +"6615e357": "setPortfolio(bytes32,bytes32[],uint256[])", +"66161ed4": "setStopContract(bool)", +"66167617": "bet_various()", +"66167663": "subdomainTarget(string,string,string)", +"66168bd7": "depositTokens(address,uint256)", +"6616c886": "canSetBanker()", +"6617e11a": "NiceGuyTax()", +"66180bc7": "testTransferTwoTokensAndReturnFunds()", +"66188463": "decreaseApproval(address,uint256)", +"66188a26": "forwardable(address)", +"6618b008": "cancelSellOrder(address)", +"66194d72": "childToken(address,uint256)", +"661956fb": "depositInvestment()", +"661990bc": "earlyInvestorWallet()", +"661aba0d": "setMntpMigrated(address,bool,string)", +"661ad427": "setOraclizeUrl(string)", +"661b6dae": "eth2qiuRate()", +"661b9065": "getRelationWith(address)", +"661be157": "account_address()", +"661c866c": "requestNewEtherRealID(string,string,string,bool)", +"661d3470": "LUXREUM()", +"661e3605": "ConstructorContract(uint256)", +"661e5ec2": "getPlayerValues(uint8[],uint8[],uint8[])", +"661edfee": "rewardFor(address)", +"6620a935": "sendToOwner()", +"6620cc3c": "GanNFT()", +"6620ffd3": "getNumAnimalsXType(uint8)", +"66210532": "setVestingMasterAddress(address)", +"6621b7be": "fiatValueMultiplier()", +"66234c4a": "ReleaseManagerSet(address)", +"6623fc46": "unfreeze(uint256)", +"662457c6": "nextProposalID()", +"6625123b": "COINBIG()", +"662512f1": "testThrowTranferZeroTokens()", +"6625b349": "RESERVE_ALLOWANCE()", +"6626b26d": "off()", +"66272374": "setWithdrawRate(uint256)", +"662723bb": "bulkTransfer(uint32[],address[],uint256[])", +"66273fc6": "bountyTokenSupply()", +"6627ace5": "getDCommBallotsEnabled(bytes32)", +"662959cc": "southadvisor()", +"662a3b81": "getHouseAddressTwo()", +"662a6137": "developmentTokensWallet()", +"662a719b": "RewardHalvingTimePeriod()", +"662ad59b": "pixels()", +"662bca97": "SetInRate(uint256)", +"662c6230": "LogResultNoWinner(uint256,uint256,bytes)", +"662d2ec8": "freeze(address,uint256[],uint8[])", +"662d5aa9": "EduMetrix()", +"662da459": "newCostToken(uint256)", +"662dbe96": "getNodeHeight(bytes)", +"662de379": "registerAddress(bytes32,address)", +"662e2536": "cordZ(uint256)", +"662e3470": "getSectionIndexFromRaw(uint256,uint256)", +"662e4db0": "c_preICOBonusPercent()", +"662e4ee4": "changeowner(address)", +"662f0763": "sendTokenReward(address,uint256)", +"662f94c0": "approveBlacklistedAddressSpender(address)", +"662fa2fb": "ProofOfRarePepe()", +"662fac39": "mining()", +"662feffc": "addStore(string)", +"663083f6": "moneyTotal()", +"663152d1": "phaseOneEnd()", +"6631ff1d": "grantToken(address,uint256,uint256,uint256,uint256)", +"6632a507": "testSetupPrecondition()", +"66331bba": "isPriceOracle()", +"6633a2bb": "_newPresserFee(uint256)", +"66341c97": "changelp14(address)", +"6634cec6": "findProductAndIndexById(uint256)", +"6634d917": "startEarlyStage2()", +"66357f57": "descriptionUpdate(string)", +"6635da25": "Voting(bool)", +"6635e0ea": "BlocklabTokenV1()", +"6635e511": "availableForInvestment()", +"66365082": "dealRevert(uint256)", +"6636fca8": "retainers(address)", +"6637324a": "Deploy(address,uint256,uint32,uint256)", +"6637b882": "setDao(address)", +"66383d32": "getCurrentRoundIndex()", +"663890b1": "FinalizableCrowdsaleImpl(uint256,uint256,uint256,address)", +"66389f1f": "OwnerProclaimedDead(address,address,uint256)", +"6638c087": "createCloneToken(string,uint8,string,uint256,bool)", +"6638d82f": "freezeTo(address,uint256)", +"6639016b": "releaseETH()", +"663960cd": "NewWinner(address,uint8)", +"6639dc8e": "emissionLimit()", +"663a0ebb": "tokensAmount()", +"663a339d": "IsSetReferrer()", +"663b0534": "disablePayable()", +"663b3f62": "balancesImporter6()", +"663b8c5a": "_newTuneOption(uint32,uint32,uint256,bool,bool,uint128,uint64)", +"663bc990": "test_1()", +"663c01af": "getAllProductIds()", +"663c2e30": "claimPrize(bytes4)", +"663c920a": "redenomiValue()", +"663cebfc": "VeiagCrowdsale(uint256,uint256,uint256,uint256,address,address,address,address)", +"663d1e84": "createVotacion(bytes32,bytes32[],uint256[])", +"663d6612": "defaultOperatorsTranche(bytes32)", +"663e0f88": "getSpecifiedDecimal()", +"663e90d9": "setBuyNowListing(bytes32,uint256,bool)", +"663f2670": "AccountLinked(address,address)", +"663f70c3": "calculateBounty(uint256)", +"663f8549": "mintReserved(address,uint256,uint256)", +"663f9c0d": "loginState(address)", +"663fc7e0": "highRoller()", +"663ff5a9": "create(bytes32,address)", +"6640ca84": "AgreementPen(address)", +"6641179e": "artistsEditions(address)", +"66417115": "positionOfJingle(uint256)", +"6641cc27": "eliminarVotacion(bytes32)", +"6641cc64": "kycApproved(address)", +"6641ea08": "ROUND_DURATION()", +"6642c0bc": "executeExploit(address,address)", +"66435abf": "getWeight(bytes32)", +"6643caba": "generousDonation()", +"6645167d": "YourCrowdSale()", +"664519bd": "wwamICOcontractAddress()", +"6645c0dc": "transferVotes(address,uint256)", +"66476fcc": "flipTokenReward()", +"66479c08": "payOraclize(uint256)", +"6648cb52": "setPurchasePeriod(uint256)", +"66494ab6": "THAW_CYCLE_FUNDER()", +"6649dfd5": "preCrowdsaleOn()", +"664a1ad6": "fundWallet()", +"664abc0f": "packedToEndTime(uint256)", +"664b3350": "createTransfer(address,uint256,bytes)", +"664b885e": "AddNewPrestige(uint256,uint256,uint256)", +"664c7bf7": "ethEurFraction()", +"664d8629": "withdrawAuctionDklBalance()", +"664dcb93": "getMHTTotalSupply()", +"664dd24f": "getUserTransactionIndexes(address)", +"664e9704": "RATE()", +"664eb12e": "updateCompanyPrice(uint256,uint256)", +"664f4904": "sealMinter(bytes32)", +"66505d1d": "BitcoinisDumb()", +"665289d2": "adjustPriceAndOwnerOfPlayerDuringPresale(uint256,address,uint256)", +"66533014": "supportMessage(uint256)", +"6653be1a": "getGameCardId(uint256)", +"665502ec": "ContractToken(address,string,string,uint256)", +"66550624": "CityLifePlusToken()", +"66552e15": "addVestingForBeneficiaries(address[],uint256[])", +"6655d7dd": "RedeemTokens(uint256)", +"6655ff3d": "WebsiteHostingToken()", +"66566947": "associateWithTeam(bytes32)", +"66566abd": "multSender(address[],uint256[])", +"66576514": "mintDRSCoin()", +"665788f8": "firstCrowdSaleDate()", +"6657b2c0": "reloadTickets(uint256,uint256)", +"665814d8": "_presaleStartTimestamp()", +"6658238c": "Peculium()", +"6658357e": "setCINTokenAddress(address,address)", +"665851bb": "wangxihaoToken(address,address)", +"66587cf6": "MIRT()", +"665905c6": "manuallyResetGame()", +"665939cc": "setupFundingRate(uint256)", +"6659889d": "setPromoWallet(address)", +"66599a40": "setEtherPriceInPoundPences(uint32)", +"665a11ca": "liquidityPool()", +"665a6ab0": "calcBurntFees()", +"665b0d5b": "_taskError(string)", +"665b1bc0": "_mint(string,uint256)", +"665b51ce": "getusedAPI()", +"665bcc32": "ProcessGames(uint256[],bool)", +"665beae7": "ExecutableBase(bytes)", +"665c0b8e": "purchaseMembership(address)", +"665ca475": "VUToken()", +"665d8a53": "MAIN_SALE_END_TIME()", +"665de19b": "mutiSendCoinWithDifferentValue(address,address[],uint256[])", +"665df460": "sqrt(int256)", +"665e06ac": "OATToken(address,uint256)", +"665eba29": "playerForceGameEnd(uint256)", +"665f09fa": "addCoinAmount(address,uint32)", +"665f5149": "JOZ()", +"665f9719": "investInfo()", +"665fb66a": "YBToken(uint256,string,uint8,string)", +"66605ba4": "rename(string)", +"66605c47": "GetBuildingData(uint256)", +"6660b210": "kMinStake()", +"6660da77": "addDiscountStruct(bytes32,uint256,uint256[2],uint256[],uint256[],uint256[])", +"6660ead1": "RANGEEND_11()", +"66612f66": "MAX_DAILY_COSIGN_SEND()", +"666192b9": "___upgradeToAndCall(address,bytes)", +"66625bbd": "revokeContract()", +"6662e4be": "isWinningBet(uint256)", +"66634a16": "getAnimalCount()", +"666375e5": "set_allow_contributions(bool)", +"6663bbec": "orderMatch(uint256,uint256,int256,uint256,uint256,address,uint8,bytes,bytes,int256)", +"66648dd3": "setRateIco(uint256)", +"6665e0fd": "tradeActive(address)", +"66663d78": "XPAAssets(uint256,address,address,address)", +"6666490c": "getPlayerSpaceshipBattleLossesById(uint256)", +"66666aa9": "rewardPool()", +"6666d22c": "timeBetweenRounds()", +"66671c30": "FBLFounderFund()", +"66671c71": "BaseScheduler(address,address)", +"66675c57": "updateDecimals(uint256)", +"66679ac7": "interfaceTransfer(address,address,uint256)", +"6668df7f": "subCoinAllowance(address,address,uint256)", +"6668ffc6": "isAuditor(address,address)", +"666923ea": "lastBlock_v15Hash_uint256()", +"6669749f": "HamzaCoin()", +"666a3427": "removeOwnership(address)", +"666afadc": "preparePreContribution(uint256,uint256,uint256)", +"666b7d32": "disableICO()", +"666b9132": "PartialCoin()", +"666be68a": "setIcoTokenSupply(uint256)", +"666c11fa": "getuserdayruns(address)", +"666c7ed0": "WIZE()", +"666cd4bd": "calcId(uint128,address,address,address,address,uint256,uint64,bytes)", +"666cdaa0": "getAnime(uint256)", +"666da64f": "claimShare()", +"666de8d5": "setSecretBonusFactor(uint256)", +"666e1b39": "owner(address)", +"666e587d": "fundICO(uint256,uint8)", +"666efa0a": "walletFees()", +"666f0354": "getMonthRefferals(address)", +"666f4cad": "totalWeiWagered()", +"666f6843": "reservedAddress()", +"666fc4d4": "minimunEthereumToInvest()", +"6670bdd8": "getDOwner(bytes32)", +"66731e95": "LogNewWhitelistUser(address,uint256,uint256)", +"667336d8": "available_without_bonus()", +"66734eb0": "MainController(address,address)", +"66735f4e": "_pickWinner()", +"667390c7": "SendmoneyTransfer(uint256)", +"6673ce2b": "Results_of_the_last_round()", +"6673d5c6": "totalSoldTokenCount()", +"6674bfaf": "closeOption(address[3],uint256[3])", +"6676871d": "reserved_funds()", +"6676aaa2": "MplusCrowdsaleB(address,address)", +"66772438": "computeResponse(uint16)", +"6677cef1": "getCrowdsaleManager()", +"6677febe": "get_all_accepted()", +"667815a2": "getCanSellBalance()", +"6678887f": "replacesOldContract()", +"66792ba1": "send(string)", +"667a2f58": "createDepositAddress()", +"667b39b9": "nameOfToken(uint256)", +"667cb72d": "soldIdeaWeiPreIco()", +"667d5d22": "wager()", +"667ec46c": "getCurrentTierStats()", +"667f1656": "preSaleBotReserve()", +"667f9510": "getBundinha()", +"667fc6b9": "IchigoToken()", +"66801384": "STAGE_2()", +"6680285a": "AuthorizedCreateToPrivate(address,uint256)", +"66802a92": "tokenGenerationState()", +"668038e0": "claimDividends()", +"66805de5": "closePool()", +"6680624e": "gasPriceMaximum()", +"66816e2a": "setBaseStrength(uint256)", +"6681b9fd": "fundsRaised()", +"66829b16": "changeToken(address)", +"6682eaf1": "setsecure(uint256)", +"6683381b": "setDiscountToken(address,uint256,uint256)", +"66836acf": "updateBlock(uint256,uint256,bytes32,bytes32,bytes32,bytes32)", +"6683ee49": "BlockPlanet()", +"6683f9ae": "isSettling(bytes32)", +"6684ffcd": "burnerSet()", +"66855dcc": "removeInt256s(bytes32[])", +"6686e174": "tokensReleasedAmount()", +"66874cc5": "brokers(address)", +"66875554": "resumeTokenSale()", +"66875a31": "FOUNDER_TWO()", +"668767bd": "transferFromForExchange(address,address,uint256,string)", +"6687aa35": "onExecuteAffirmation(address,uint256)", +"6688e305": "EIP20(uint256,string,uint8,string)", +"66894d76": "releaseThreeHotHourTokens(address)", +"6689e28b": "distribution(uint8,address[],uint256[],uint256[])", +"668a0f02": "latestRound()", +"668a2001": "removeParticipant(address)", +"668a2f67": "boom(address)", +"668aa824": "oraclePrice()", +"668abff7": "lastRoundLengthUpdateStartBlock()", +"668ad45f": "MyToken(uint256,string,uint8,string,string)", +"668b1b7e": "AOCTrader()", +"668bd511": "BithelloToken()", +"668c1a46": "refundBNBContributor()", +"668c8573": "DATING()", +"668cc7d8": "registerContest()", +"668cf93d": "LOSER_LOCK_TIME()", +"668d5f48": "addBrick(uint256,string,string,uint32,string,bytes32[],uint256)", +"668e0f6a": "addEntry(string,string,string,string,address)", +"668e157f": "StandardQuickConverter()", +"668eef5b": "test_2_method()", +"668faae8": "CollectibleIndex3()", +"668fde45": "advSend(address,uint256,bytes)", +"66901c5b": "clearTimeMap()", +"66901efb": "getOwnerInfoByIndex(uint256)", +"66905ba0": "overwrite(string,string)", +"66907d13": "setNextOrderId(uint80)", +"6690864e": "setTeamAddress(address)", +"6690f30b": "set_Name(string)", +"66914614": "getJackpotTotalValue()", +"6691461a": "updateTokenAddress(address)", +"6693b694": "unfreezeSupply()", +"669459a7": "removeRegistryFromOwnerIndex(address)", +"66949b56": "endMatch(uint256,int256,int256)", +"6694e845": "numRewardedAxies(address,bool)", +"669529df": "removeFromWhitelistMultiple(address[])", +"669541d6": "setGasCost(uint128)", +"66957377": "batman()", +"669585a4": "_figthExecutor(address)", +"6695b592": "stemPriceInWei()", +"6695f930": "calculateAndSetRate(uint256)", +"6696ca51": "forceBurnFrom(address,uint256)", +"66971c8a": "setCurrentFundingRound(uint256)", +"66973129": "PHEPToken()", +"6697aa84": "getRequiredMinor()", +"6698baaa": "STAGE_TWO_TIME_END()", +"6698f141": "releaseTeamTokensAfter18Months()", +"6699d9cd": "Securities_2()", +"6699e4c7": "isReadyForClose(uint256)", +"669a55ec": "initialPrizeBov()", +"669a828b": "getProgramsValue()", +"669b7e69": "getBlockAddressCount(uint256)", +"669cab39": "cancelBetByOwner(uint256)", +"669d8dff": "AddorModifyRig(uint256,uint256,uint256,uint256)", +"669dafe8": "toWei(uint256)", +"669e48aa": "get(uint256,uint256)", +"669e6684": "_rebalanceTree(bytes32)", +"669eb768": "registerDonation(uint32)", +"669ee827": "RegisterDevice()", +"669ef86d": "getPriceByDayIndex(uint256)", +"669f6d80": "bountyRewardPercent()", +"66a03098": "receivedFrom(address)", +"66a0b81e": "safeMode(bytes4,bytes1,address)", +"66a11615": "revokeMintingManager(address)", +"66a192c6": "CurrentRate()", +"66a200ba": "TokenDemo(uint256,string,uint8,string,address,address,address,address)", +"66a23c01": "ETOKEN2()", +"66a26419": "cancel(address,uint256,address,address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)", +"66a39350": "FAIL_FLAG()", +"66a3de2a": "_safeTransferFrom(address,address,uint256,bytes)", +"66a4b6c0": "usdDecimals()", +"66a51d1d": "UcCoinMinimumSellingChanged(uint256,uint256)", +"66a659b3": "readcolorXteam()", +"66a65c99": "getLegacyCount()", +"66a6cf1a": "mateWithAuto(uint256,uint256,uint8,bytes)", +"66a78b40": "depositAgent(uint256,uint256,string,string,uint256)", +"66a78e6c": "maxReward()", +"66a857f4": "ChangeTokenSymbol(address)", +"66a8c45b": "StarmidFunc()", +"66a908a5": "foundersTokensUnlockTime()", +"66a9234c": "addPhase(uint256,uint256,uint256)", +"66a92cda": "releaseOnce()", +"66a9bc0d": "teamTokenVesting()", +"66aa01ca": "permittedAddresses(address)", +"66aa56c5": "initiate()", +"66aa6f26": "payFee(bytes)", +"66aa9aff": "adminDeposit()", +"66aac9e4": "TPLusToken()", +"66ab4e5f": "Grid(uint256,uint256,uint256)", +"66ab5290": "transferSgaToSgnHolder(address,uint256)", +"66ac1c36": "stageFokenUsdPrice(uint16)", +"66ac777e": "rotate_right(uint32,uint32)", +"66ac8075": "payoutPrizes(address[])", +"66ad3ffc": "building(uint256)", +"66ad484c": "newfirst_player(address)", +"66adeb3a": "SmartToken()", +"66adeb8c": "transferBalance()", +"66adf835": "_setup(address,address,uint256,bool)", +"66adfbbd": "sgc(uint256)", +"66ae924b": "toUint16Throw()", +"66ae935f": "balanceEqual(address,uint256,string)", +"66aecfa7": "bankToCharm(string,uint256)", +"66aee0fc": "investorsProfit()", +"66aef95b": "increaseTimeIfBidBeforeEnd()", +"66af3914": "getTradeIsOpen()", +"66af77ca": "totalMarks()", +"66b005ee": "QueryUnlockTime(address)", +"66b0a536": "MomaCoin()", +"66b10f70": "learnMove(uint256,uint256)", +"66b3e4b9": "stageMarketing()", +"66b3f6bf": "invested(address)", +"66b3fe66": "setTimeScale(uint256)", +"66b42dcb": "register(address,string,uint256,string)", +"66b43da5": "computeSha3(uint256[8])", +"66b46149": "fstring(string)", +"66b464de": "goldBoxPrice()", +"66b4ad74": "KudanilToken()", +"66b52b93": "addMeByRC()", +"66b567da": "getNumMyHatchingUnits()", +"66b5e2d8": "getCountMembers()", +"66b625d4": "bountiesAllocAddress()", +"66b62bde": "isSetTeamWallet()", +"66b668de": "RFUDToken()", +"66b68516": "Finalized(address,uint256)", +"66b728d5": "getVoteOptionId(uint256,string)", +"66b7afbf": "init_level()", +"66b7d5c6": "receivedWais()", +"66b847e5": "assertQuantity(uint256)", +"66ba2670": "setOriginalPriceGen0()", +"66ba707f": "ConsultaRegistro(string)", +"66bab099": "getCurrentSupplyVote()", +"66badf4b": "BITCOINGAM()", +"66bb28be": "_transferMultiple(address,address[],uint256[])", +"66bb83b6": "batchlimits()", +"66bc0d6d": "withdrawFundsAndStartToken()", +"66bcc860": "TransferSiteReg(address,uint256)", +"66bd6ff6": "DecentralizedExchangeHotPotato()", +"66bd78fd": "getBalanceContract()", +"66be24ba": "blockUntil()", +"66bea821": "sendSupplyTokens(address,uint256)", +"66c0276e": "CryptonewsIndonesia(uint256,uint256)", +"66c0e5e0": "revealPhaseMinSecondsWaitForReveals()", +"66c14e0a": "dropCount()", +"66c2355c": "requestNameChange(string,string)", +"66c2aa0e": "getStackholderTransactionCount(bool,bool)", +"66c2ae95": "setHgtRates(uint256,uint256,uint256,uint256,uint256,uint256)", +"66c2d620": "getTot(uint256)", +"66c2d6a0": "BettingToken()", +"66c313c6": "ETHER_THRESHOLD()", +"66c31f12": "emitUserBinded(uint256,address,bool)", +"66c376a1": "setResult(uint32,int8,int8)", +"66c42517": "refundToken(bytes8,address,uint256)", +"66c49da5": "viewThirdBatchOfClauses()", +"66c5c4a0": "unfreezeAll()", +"66c5cdf8": "updateTotal(uint256)", +"66c618d4": "sameWhiteList(address,address)", +"66c630bc": "honourWhitelistEnd()", +"66c71952": "setDiscountPercent(uint256,uint256)", +"66c76592": "_raffleDraw()", +"66c7d1ed": "RozelCoin(uint256,string,string)", +"66c7fb77": "generateDeed(string,bytes)", +"66c82de8": "ContributorPool(address,uint256,int256,uint256,int256)", +"66c89a13": "getAssetEmmiter(uint256)", +"66c91053": "doubleTransfer(address,address,address,uint256,uint256)", +"66c99139": "trans(uint256)", +"66c9bc38": "etherExchangeLikeCoin()", +"66c9d697": "executeVerdict(bool)", +"66ca2bc0": "sendSignal(bytes32)", +"66cab1f3": "isSponsorshipRefunded(address,uint256)", +"66cab95c": "isDeployer()", +"66cc6064": "getPayout(uint256,uint256,uint256)", +"66cd0663": "setCrowdsaleFinished()", +"66ce10b7": "publicKeyVerify(uint256,uint256,uint256)", +"66ce3bd2": "walletBalanceOf(address)", +"66ce5c52": "minWeiToPurchase()", +"66cf058a": "endIcoSaleRound2()", +"66d003ac": "recipient()", +"66d0c603": "addExternalContributor(address)", +"66d10688": "getBoughtTicketCount()", +"66d11c1a": "ContractAddress()", +"66d12fad": "getStakeInOutcome(bytes32)", +"66d16cc3": "profit()", +"66d1cac9": "updatePost(uint256,string,string)", +"66d29324": "defrosting()", +"66d2da12": "setUser(address,address,string,string,bytes32,uint256,uint256,uint256[],string,string)", +"66d38203": "setup(address)", +"66d39035": "getContribution(bytes32,bytes32)", +"66d42b3f": "Betting(uint256,uint256)", +"66d49bab": "updateTotalSupply(uint256)", +"66d598f0": "E18()", +"66d5c8ed": "node_left_child(uint256)", +"66d5eb9b": "openZoneShop(bytes2)", +"66d76bb2": "rateETH_ROK()", +"66d7ffde": "left24(uint256)", +"66d8c463": "reveal(bytes32,string)", +"66d8d040": "dividendsRightsFixUpdate_(address,address,uint256)", +"66dacc48": "afterFirstRefundRoundFundsReleaseDenominator()", +"66db11e7": "nodeExists(bytes32,bytes32)", +"66db2a59": "competitorPAY(uint256)", +"66dc860a": "getBreedingFee(uint40,uint40)", +"66dd3bc0": "terminateAccount()", +"66de5a4f": "createWorkerPool(string,uint256,uint256,uint256)", +"66de6fa4": "isReachedLimit()", +"66de84ec": "withdrawBonus()", +"66df8fe6": "secondStageTotalSupply()", +"66e13d36": "stakeForWithLockup(address,address,uint256,bytes)", +"66e144f9": "Futurescoin()", +"66e159b8": "CreatedNIMFA(address,uint256)", +"66e16aff": "mdbToken()", +"66e1aa99": "assignCertificate(address,string,string,string,string)", +"66e1cebd": "getStakingGains(uint256)", +"66e20b51": "crowdsourcers()", +"66e20e77": "priceNumerator()", +"66e23276": "ADVISERS_SUPPLY()", +"66e264be": "p2Of(uint256)", +"66e305fd": "isEligible(address)", +"66e34dc6": "registerUsername(bytes32)", +"66e3c230": "callLibSet2(uint256)", +"66e3cb68": "upgradedFrom(address)", +"66e3e5e4": "contractTokenBalance(address)", +"66e41cb7": "test2()", +"66e41cd7": "GetTime(uint8)", +"66e4f8c8": "getLastSpinOutput(address)", +"66e5cb50": "stopTransfer(uint256)", +"66e61a31": "outProjectBinding(uint256,address,address)", +"66e65eb1": "checkLocked(address,uint256)", +"66e6c8af": "authorise(address)", +"66e7107e": "SCARABToken()", +"66e722b0": "SecurityToken(string,string,uint256,uint8,address,uint256,uint256,uint8,address,address,address)", +"66e72baa": "transferWithLock(address,uint256,uint256,uint32)", +"66e7ea0f": "incBalance(address,uint256)", +"66e84652": "resetContribution()", +"66e8a4d7": "testGetBonus()", +"66e8cd81": "allBalances(address,address[])", +"66e98c31": "createCoin(string,uint256,uint256,string,string,address)", +"66e99a11": "lxhcoin4()", +"66e9b336": "removeReturnableToken(address)", +"66eb463f": "changeRootAdmin(address)", +"66eb50b2": "startLeaderboard(uint64,uint64,uint64)", +"66eba165": "PlaceBuy(address,address,uint256,uint256,uint256)", +"66ec60c7": "getFineLevelOfUsername(string)", +"66ecc9e2": "require_limited_change(uint256)", +"66eccfbf": "token_batchTransfer(address,address[],uint256[])", +"66ecded4": "setRelativeAddress(address)", +"66eec532": "getSellerFullInfo(address)", +"66f0a3f6": "getTokenRemain()", +"66f1e438": "getMiniPoolEdit_7()", +"66f2d859": "setSellRatio(uint256)", +"66f36b34": "Birth(uint256,string,address,bytes32)", +"66f3882f": "setIcoPhase(uint256,uint256)", +"66f3a2b8": "totalPreBuyers()", +"66f4e1c7": "MAX_GRANTEE_TOKENS_ALLOWED()", +"66f516fe": "changeTimeAndMax(uint256,uint256)", +"66f5f332": "Log1_fnc(address,bytes32,uint256,string,string,uint256,bytes1,uint256)", +"66f7d730": "WithdrawalEnabled()", +"66f7d9da": "accumulatedHours()", +"66f83e91": "getRandom(address)", +"66f84d30": "setParent(uint256,string)", +"66f8bbe0": "DMarketToken(address,uint256,uint256,uint256,uint256)", +"66f8e86f": "MLQD()", +"66f928d3": "updateShareRuleGroup(uint256,uint256,uint256,uint256,uint256)", +"66f9785a": "EtherShuffle(address[])", +"66f99a11": "setOpenValueGasLimit(uint256)", +"66f9c99e": "setUpgradeAddress(address)", +"66fa2be9": "tickets(bytes4,uint256)", +"66fa6efb": "unverify(address,address)", +"66fb3831": "VALUEBACK()", +"66fbc154": "earlier()", +"66fc0dd7": "walletTeamAdvisors()", +"66fc6937": "lastCharge(address)", +"66fcf285": "distributeMulti(address[],uint256[])", +"66fd3cd8": "commit(bytes)", +"66fd555f": "Comission(address,bytes32,uint256)", +"66fda50b": "removeOracles(uint256,address[])", +"66fe16e9": "emitIssued(address,uint256)", +"66fe25a0": "IcoEndDate()", +"66fe513a": "free_supply()", +"66fe825a": "Gruptecoin()", +"66fea1d4": "setRandomSeed(uint256)", +"66ff8201": "GetChipNum(address,uint32)", +"66ffebb8": "changeHolderPercentage(uint256)", +"67013719": "enableControl(bool)", +"67016c14": "issueTokensToBuyer(uint256)", +"6702416e": "addDoctorTo(address,string,string,string,uint8,uint8,uint8,uint8,uint8,uint8,uint32,uint32)", +"67025dcf": "transferAll(address,uint256[])", +"670396e7": "CashToken()", +"6703c429": "ETCReturn(address,uint256)", +"67043001": "isEIP20Token()", +"67043cae": "registerOffChainDonation(address,uint256,uint256,string,bytes32)", +"67061a55": "teamSharePercent()", +"67069544": "issueAssetToAddress(bytes32,uint256,string,string,uint8,bool,address)", +"67069916": "OwnershipTransferCanceled()", +"670733b5": "setBitwordsWithdrawlAddress(address)", +"670744cf": "_createCobeFriend(uint256,uint256,uint256,uint256,address)", +"6707b8aa": "BestEtherSupply()", +"67080f6e": "testThrowsSetEnforceRevisionsNotOwner()", +"67084eb3": "houseBalance()", +"67085633": "getMyGenes()", +"67085dab": "bnCheck()", +"6708cc63": "becomeKing()", +"6708f91d": "Rurchase(address,uint256,uint256)", +"6709b337": "Token(string,string,uint256,bool,bool,string,string,uint256,uint256,uint256,bool)", +"670a1e6f": "getEligibleAmount(address,uint256)", +"670be445": "initialEPXSupply()", +"670c00d0": "getMotPrice(bytes32)", +"670c1500": "CoinCool()", +"670c314e": "TimeFinish()", +"670c3ac2": "priceUpdateTimeline()", +"670c5370": "addCandidateByIndex(uint256,address,string,string)", +"670c884e": "setup(address,uint256,uint256,uint256,address)", +"670ca672": "NTVToken()", +"670d14b2": "keys(address)", +"670da6f8": "getOwnerPetCount(address)", +"670e2e7f": "DatumGenesisToken()", +"670e64c8": "setWhitelistingAgent(address,address,bool)", +"670eedba": "strConcat(string,string,string,string,string,string,string)", +"670f4bd4": "releaseDivTokens()", +"670f8755": "_0xZibitToken()", +"670fe0ff": "TootrTokenSale()", +"6710e801": "_createRabbit(uint256,uint256,uint256,uint256,uint256,address,uint8)", +"6712a67f": "addNodesCache(address[],bytes32[],bytes32[],bytes32[])", +"6712e0be": "tokenGenerationMin()", +"67130e8c": "getWeiOwed(address)", +"6713263d": "crowdsaleTokens()", +"6713640d": "TierStarterDividendAddress(address)", +"6713e230": "isTrusted(address,address)", +"67141690": "getEnabledTokensInformation()", +"67141732": "createContractCity(string)", +"6714cfe2": "GetLuckyGamblers(uint256)", +"6714e027": "deal(uint256[3],uint256,bytes32,bytes32,uint8)", +"671528d4": "isCapped()", +"6716a692": "setDVIP(address)", +"6718484f": "create(uint256,address,string,string)", +"67194bee": "AirdropClaim()", +"67198207": "EARLY_CONTRIBUTION_DURATION()", +"671baae3": "Sepp(uint256,string,uint8,string)", +"671bd594": "setBigPrice(uint256)", +"671bdc3d": "PrimebankCoin(uint256,address)", +"671c7d68": "test02()", +"671d3315": "bookAfternoonVisit(uint256)", +"671d6429": "setTreasurer(address)", +"671dacdc": "CalculateSqrt(uint256)", +"671de554": "mintPreICO(address,address,uint256,uint256,uint256)", +"671e4405": "isFinalize()", +"671ec66c": "setDomainOwner(bytes32,address)", +"671fa0a0": "Inscription(string)", +"67202d40": "fetchAllVotersByIndex(uint256)", +"6720ceb1": "sendPayment()", +"6721ebe2": "airdropThroughput()", +"67220fd7": "adminClaimAirdropMultiple(address[],uint256)", +"67221df0": "isPendingA(address)", +"672324ac": "cashInRate()", +"672350bd": "getFreeExtension(bytes32)", +"6723c20d": "testTrip(uint256[3])", +"6723eab5": "batchCreateETHCardAsset(uint8[],uint256[],uint256[],uint256[],address[])", +"67243482": "airdrop(address[],uint256[])", +"67249254": "mintWithLock(address,uint256,uint256,uint256)", +"672566a0": "Upgradeable()", +"6725bed6": "CCH_RE_2()", +"67268bbc": "removeTransfer(uint256)", +"67272999": "claimETH()", +"672781ed": "priceClaim()", +"6727cc2d": "removeWhiteListAddress(address[])", +"67286a83": "getGoldStatusAuditcount(address)", +"6728b711": "RealAssetToken()", +"672acef0": "participantCapTier2()", +"672c8dca": "ownerTakesAllNotClaimedFunds()", +"672ce152": "HodlBox(uint256)", +"672d2921": "zasxzasxqaq()", +"672e06d0": "withdrawForOneYear()", +"672e20fe": "allocateRemainingTokens(address)", +"672f412c": "setAllowDisbursePaymentWhenPaused(bool)", +"672fcd82": "createBet(uint256,bool)", +"67301dde": "IWWEE()", +"67316b3f": "addWhiteListAddress(address[])", +"67337d1a": "ReporterTokenSale()", +"673441db": "TokenAltPurchase(address,address,uint256,uint256,uint256,string,string)", +"673448dd": "isApproved(address)", +"673478c3": "getAssetIdOwnerIndex(uint256)", +"6735a1cc": "previousStage()", +"67374f3a": "setTargetWallet(address)", +"673756d8": "SOFT_CAP_EUR()", +"6737c877": "setAttributes(bytes)", +"6738426c": "enablesTransfers()", +"67387d6b": "testThrowCreateWithNonceExistingNonce()", +"67389944": "voteB(uint256)", +"67389d17": "SuppliedTo(address,uint256)", +"6739afca": "network()", +"6739f3a4": "getAuctionDuration(uint256)", +"6739fc52": "testOrd()", +"673a2a1f": "getPools()", +"673a456b": "setNumActiveTranscoders(uint256)", +"673a5ae3": "Sale(address,address,uint256,string,uint8,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"673a7e28": "updatePrice()", +"673b57e9": "deauthorizeProvider(address)", +"673c0e53": "readAllFrzAcc()", +"673cd98e": "total_amount()", +"673df0e0": "horseMaster()", +"673f3807": "sell(uint256,uint8)", +"673fa8c9": "APaymentToken(uint256)", +"674106d8": "checkDragon(uint256)", +"67412045": "balanceOf(address,uint8)", +"6741629c": "wasEmergencyCancelled()", +"6741953e": "getPOOL_edit_15()", +"674197f8": "getBuyRequestCount()", +"67426ba4": "callgDistributed()", +"67441f52": "LOOMIA1()", +"6744ea49": "GetEscrowTokenSymbol()", +"67457022": "rmul(uint256,uint256)", +"67460c25": "createWikiPage(string,string,string,uint256)", +"67460d58": "setGate(uint256,uint16)", +"67465daf": "StorageExample()", +"6747830d": "calculateRequiredFillingAmount(uint256)", +"6747a33f": "accrualDeposits()", +"6747f09e": "cashOutFallbackAmount()", +"6748a0c6": "releaseFinalizationDate()", +"6748a106": "powLimit()", +"674942eb": "VOTING_PREPARE_TIMESPAN()", +"6749ec48": "issueLicenseNFT(bytes32)", +"674a1574": "claimedIdeas(address)", +"674a62d0": "coinIssuedMkt()", +"674aaa44": "transferToAnotherAddr(address,address,uint256,bytes32)", +"674b3bd5": "originalArtwork(bytes32,address)", +"674c20a1": "test0_firstInterval()", +"674c5eaf": "setReceiver3(address)", +"674c85a7": "mdiv(uint128,uint128)", +"674cc1f5": "getMarketHashes(bytes32[])", +"674d13c8": "totalReservedSupply()", +"674d4691": "_getWeiValueOfTokens(uint256,bool)", +"674e4e0e": "extendUnlockDate(uint256)", +"674ea3cb": "closeAgreement(bytes,uint8[2],bytes32[2],bytes32[2])", +"674ebb3e": "cancelKimAuction(uint256)", +"674ed066": "minQuorumDivisor()", +"674ef6c3": "initializeTier(uint256,address)", +"674f220f": "previousOwner()", +"6751676f": "recentBuyers(uint256)", +"6751ad3d": "_insertAttackLog(uint256,uint256,uint16,uint32,uint8,uint32,bool)", +"67524d62": "setJackpotThreshold(uint256)", +"67532c8e": "sendPurchase()", +"67535a42": "setEthmainAddress(address,address)", +"6753a3c1": "setMajorEvent(string,string,string)", +"6753fc59": "PurchaseAdmin()", +"67541efa": "AlfaCoin()", +"67546967": "EthBtcEscrow()", +"6754ff3a": "addcrontime(address)", +"67550a35": "vox()", +"67551857": "clearAllRequest()", +"675518b8": "mintAndCreatePreIcoBitex(address,address)", +"67558b3a": "AzlanToken()", +"67561d93": "authorizeContract(address)", +"675629fe": "appendOnly()", +"6756b1ae": "GameTable()", +"67571f68": "handlePayouts_(uint256,uint256,uint256,address,address,address)", +"67578f65": "users(bytes20,uint8)", +"67579ad4": "currentwealth()", +"675879d5": "GrantedOrganization(bool)", +"6758aa3f": "requestApproval(string,string)", +"6759fac0": "CatsToken(address)", +"675a1f0f": "batchAddCandidate(address[],bytes32[])", +"675a4633": "dnaMixer()", +"675a54b9": "getHalvingOf(address)", +"675a690c": "setBleachDailyLimit(uint256)", +"675abc96": "corporateSupply()", +"675ac67a": "escrowCount()", +"675b09cd": "Niobium()", +"675c3048": "getTxTimestampPaymentMCW(bytes32)", +"675c9fcd": "setSecretSignerList(address[])", +"675cc788": "getDiplomaOrganizerById(uint256)", +"675cef14": "etherMinimum()", +"675d43cf": "buyPixel(uint16,uint16,uint24)", +"675d9c35": "XRT()", +"675df16f": "updateSubmissionGasPriceLimit(uint256)", +"675ec1cf": "minimalUSD()", +"675f6537": "settleBet(bytes32)", +"675f6d1e": "callBackVariations()", +"675f818e": "disapproveInvestor(address)", +"675f9ad9": "initStages()", +"6760115a": "BuyerFund()", +"67602c59": "burnSequence()", +"67608d38": "ICO_TOKEN_SOFT_CAP()", +"676095b2": "profit2eggs()", +"67630f43": "buyNapkins()", +"6763150e": "setKyberAddress(address)", +"67636574": "consumed()", +"676391d3": "_removeWhitelister(address)", +"6763da56": "dish(string,address)", +"67642794": "_withdraw(address,uint256,bool)", +"676452f4": "t3tokenExchangeRate()", +"6764765d": "burnMyTokens(uint256)", +"67653f3b": "test_threeInvalidEqUint()", +"6765b49b": "getPunishXPA(address)", +"67669e29": "rocketIsLaunched(uint256)", +"6766d1ba": "getTimeUntilStart()", +"6766fafe": "disableTransferWhitelist()", +"676796b6": "releaseFounderCoins()", +"6767e368": "ValueTrader()", +"67682441": "UserUpdate(address,address)", +"6768893c": "AppHub()", +"6769c20b": "setPicture(address,bytes)", +"6769d1f9": "soldToken()", +"6769eb46": "createMasker()", +"676a38d7": "get_current_price()", +"676a675a": "changeJohanNygrensAddress(address)", +"676aa496": "IbnzEtc20TestToken()", +"676b064e": "allForPopulate(uint256)", +"676b57ad": "getNays(uint256)", +"676c0d77": "updateTokenPrice(uint256)", +"676c902f": "drawNumbers()", +"676cb63d": "getMintingFinished()", +"676cdcd6": "BurnExecuted(uint256,address,uint256)", +"676cfec6": "rocks(uint256)", +"676d1d9c": "WEI_TO_COGS()", +"676d20ba": "WorkerToken(uint256,string,uint8,string)", +"676d23a5": "isChangePriceLocked()", +"676d2e62": "migrationMaster()", +"676d7769": "test_curatorDoesNotVeto()", +"676e2eb1": "_addDemoc(bytes32,address,address,bool)", +"676fc32b": "maximumTokensForThird()", +"67701187": "updateFighter(uint256,uint8,uint8,uint8,uint8,uint32,uint64,uint16,uint64,uint16,uint16)", +"6770260e": "ContributionMade(address,uint256)", +"67707337": "CryptocarToken()", +"6770da62": "_stealCardWithSocialIdentity(uint256,uint256)", +"67716abc": "learnFee()", +"677170e1": "_span(address,address)", +"677342ce": "sqrt(uint256)", +"6773b75f": "propertyIndexToApproved(uint256)", +"6774f8e1": "getMonarchyController()", +"67756fe9": "depositPayment(address)", +"6776ddd0": "currentHodler()", +"6776e56a": "validateProposedKingdomName(string)", +"6777d177": "icostarted()", +"6777e4eb": "dollarMultiplier()", +"677885d3": "BITIFEX()", +"677913e9": "setAmount(int32)", +"677978ec": "increaseTokenCap(uint256)", +"6779da43": "setAwardTokens(bool)", +"677a7444": "Votaciones(bytes32)", +"677a7735": "Shares(bytes32,bytes8,uint256,uint256)", +"677a8870": "TeamWallet()", +"677ab197": "processContribution()", +"677ab667": "INITIAL_STARTTIME()", +"677b1f0d": "_buyTokensFromSystem(uint256)", +"677ba3d3": "onTokenTransfer(address,address,uint256)", +"677bcb89": "regularMinPerPerson()", +"677c102d": "getHostOrders(address,address)", +"677cee54": "SafeConditionalHFTransfer()", +"677e2dc4": "setDailyPrice(uint256)", +"677e2ef2": "getReplyFee(uint256)", +"677e6fa4": "betOnColumn(uint256)", +"677ebf2c": "InvestmentAsset(address,address,address,string,string,uint256,uint256,uint256,address)", +"677f768d": "isOnTrading(uint256)", +"677ffb0d": "exerciseLong(address[2],uint256[8],uint8,bytes32[2])", +"6780a311": "transferStop()", +"6780b32e": "moveAccount(bytes32)", +"67814109": "_mintTimelocked(address,uint256,uint256)", +"6781cc04": "addPolicy(uint8,uint256[],uint8[])", +"678212d9": "tokensAuctioned()", +"67821686": "setETHUSDRate(uint256)", +"67823a4a": "limitDateCrowdWeek2()", +"678365ca": "RHEMA()", +"678377d2": "core(address,uint256,address)", +"67845835": "Irapid()", +"67845daf": "claimTokensERC777(address,address,address,uint256,uint256,bytes,uint8,bytes32,bytes32)", +"67848d9c": "PayEther(address,uint256,uint256)", +"6784b075": "removeValidContract(address)", +"6784ccb7": "Deceum()", +"67854643": "getGenerationMemberLength(uint256)", +"6785744d": "phase1Price()", +"6785a8f6": "getCandidateIndexArray()", +"6785b500": "getChannelsAddresses()", +"67863c07": "earlybird()", +"6786ed0e": "setPriceRate(uint256)", +"6787416d": "NRM()", +"6788317a": "UnitySale(address,bool,uint256,uint256,uint256,uint256,uint256,uint256[])", +"678886b4": "updateTokens2PerEth(uint256)", +"678892c0": "rand_num()", +"67899248": "processKick()", +"678a1013": "monsterNFT()", +"678a6baf": "ROUND_3_PRESALE_BONUS()", +"678a7dca": "setShareFee(uint8)", +"678ae6a1": "updatePools(bytes32,uint256)", +"678bbf24": "getEarningsAmountByGoodsIndex(uint256)", +"678d2204": "shouldFail()", +"678d6eff": "createFuel(uint256)", +"678d9758": "setTile(uint256,string,string,uint256)", +"678dd961": "getProviderClosed(uint256)", +"678ee795": "ComputationService()", +"678f4467": "allocateTokenForTeam(address,uint256)", +"678f7033": "set_percent_reduction(uint256)", +"679019ba": "freezeDeliverMultiStandalone(address[],uint256[],uint256[],uint256,uint256)", +"67907404": "recruitNarco(uint256,string,string)", +"6790d2b5": "getRoomInfo(uint256)", +"6790f3fe": "getAccumulatedDistributionPercentage()", +"67923240": "hatchsubscribers(address)", +"6793c8e1": "currentMilestone(uint256)", +"6793d383": "registryContractAddress()", +"67946ea4": "getIdMax()", +"67955ffa": "maxGIRL()", +"679577a5": "getEmployerFeedbackOn(address,uint256)", +"6795dbcd": "getAddress(bytes32,string)", +"67975213": "AddSWAndClaim(string,string,bytes32,bytes32,bytes32,string,bytes32,bytes32,address,uint32)", +"6797b106": "strikePricePctX10()", +"6799c0e0": "vpe_per_Keos()", +"6799d737": "releaseForEcosystem()", +"679a7a46": "WhoisOwner()", +"679aefce": "getRate()", +"679b4567": "preicoStartDate()", +"679b948b": "switchSplitBonusValue(address,bool)", +"679b9935": "setLeagueRosterContractAddress(address,address)", +"679c0d40": "invariantBroken()", +"679d0ecb": "getMetForEthResult(uint256)", +"679d38e0": "selfdestruct()", +"679dffb4": "getProfit()", +"679e1149": "AcoraidaMonicaWantsToKnowTheNewAnswerHash(bytes32)", +"679e5977": "EventRemoveAdmin(address,address)", +"679ebf1a": "transferTicket(uint256,address)", +"679f4d63": "CEEDCOIN()", +"679f699e": "EOSERC20(uint256,string,string)", +"679fecd6": "refillArray(address[],uint256[])", +"67a09c23": "payment(address,uint256)", +"67a0a550": "_cancelOrderWithMerchant(string,address)", +"67a19b20": "withdrawEthMaker(uint256,address)", +"67a1b7dd": "addTicket(uint256,uint256,uint256)", +"67a1bd55": "withdrawStuck()", +"67a1d653": "YOO_UNIT()", +"67a1f526": "curatorWrite(uint256,bytes32[])", +"67a2072c": "setEtherHolder(address)", +"67a2534b": "test(address[5])", +"67a26cbc": "DuqueBrewingCompany()", +"67a27811": "BonusGranted(address,uint256)", +"67a3eb65": "totalHardCap()", +"67a449b8": "getLastRoundData()", +"67a4e7c4": "isDecentBetToken()", +"67a52fdb": "purchaseGold()", +"67a59d91": "scheduleCall(address,bytes,bytes,uint256,uint256,uint8)", +"67a5cd06": "drip(address)", +"67a6ae62": "TOKEN_RATE_25_PERCENT_BONUS()", +"67a7390d": "fundTransferred()", +"67a7804b": "influenceByToken(uint256)", +"67a884e5": "latestBidder()", +"67a88f78": "createBitcoinAddressPrefixTask(bytes,uint256,int256,uint256,int256,address)", +"67a9c971": "tgrSettingsAmount()", +"67aa23e2": "getTicketsByOwner(address)", +"67aa50ae": "updateBrokerVerifierContract(address)", +"67aa863f": "setXto2()", +"67ab263a": "thisIsTheEnd(address)", +"67ab4381": "UnConf(string,address)", +"67ab5486": "GET_MAX_UINT256()", +"67aba225": "sellableToken()", +"67acd805": "lowerMinWager(uint256)", +"67ae9e8f": "hybridizationList(uint256)", +"67aea7d5": "buffs(uint256,uint8)", +"67af1c81": "getRoundIndex()", +"67af1cff": "ethRec(uint256,uint256)", +"67af26fb": "transferOtherFrom(address,address,address,uint256)", +"67aff484": "setUserRole(address,uint8,bool)", +"67aff919": "autoreleaseInterval()", +"67b07d48": "entangleQuanticCloudIOTData(uint256)", +"67b0e070": "FaceTech()", +"67b14a21": "getProposal(uint16,uint16)", +"67b16407": "buyCup()", +"67b16cd6": "getRealRndMaxTime(uint256)", +"67b172c9": "Bloxxor(address,address,address,uint256,uint256,uint256)", +"67b1f5df": "setExchange(address)", +"67b21506": "claimTokenReserveDevelop()", +"67b220a5": "unblock(address)", +"67b26cab": "getLastMaxInvestments()", +"67b327fa": "proposeMilestones(bytes)", +"67b40639": "Dain()", +"67b50af9": "gasAmount()", +"67b5496a": "loseWager(uint256)", +"67b55bf9": "getClickMetadata(uint256)", +"67b65656": "setStateStartTime(bytes32,uint256)", +"67b78d00": "fromHexChar(bytes1)", +"67b7a4aa": "START_PRICE_IN_CENTS()", +"67b7c034": "on()", +"67b7d525": "getBlockPointer()", +"67b830ad": "fillOrder(uint256)", +"67b886e8": "left97(uint256)", +"67bb474f": "allowBundling()", +"67bb6d63": "maxWiteList()", +"67bc480e": "MYSTERYCLASSICCOIN()", +"67bd15e3": "contractInitializationTime()", +"67bd69a6": "getLastDuel2()", +"67be0854": "partyHash(address,address,address,address)", +"67be5eac": "claimLeftTokens()", +"67be97a5": "BYToken()", +"67bea493": "whitelistedPools(address)", +"67beaccb": "scheduleCall(bytes)", +"67bfc445": "AddNewChallenge(uint256,uint256,uint256,uint256,uint256,bool,string)", +"67c1fb11": "christmasStocking()", +"67c21fe5": "setFiscalVerify(uint256,bytes32)", +"67c25a14": "TeamCreated(uint256,uint256[])", +"67c281a9": "validateContentHash(address,uint256,bytes32)", +"67c2a360": "authorizeUser(address)", +"67c33c80": "getInt8FromByte(bytes14,uint256)", +"67c353b3": "LKCTotalSupply()", +"67c36757": "IranToken()", +"67c3a6d9": "Khatamor()", +"67c3ad8e": "burnStake(uint256,address)", +"67c3e25e": "revokeAccessDeploy(address,address)", +"67c45872": "ZzStandardToken(uint256,string,uint8,string)", +"67c51be7": "viewTokensSold()", +"67c5d6b1": "multihash(bytes32,string)", +"67c623cf": "getTokenMetaData(uint256)", +"67c6389e": "refreshlockedBalances(address,bool)", +"67c6e39c": "convert(address,uint256)", +"67c7f3a8": "setBwValidCaller(address)", +"67c84919": "issueByPartition(bytes32,address,uint256,bytes)", +"67c9b017": "getEthPrice()", +"67c9d266": "freezeUntil(address,bool)", +"67ca1fdf": "market_communityStorageVault()", +"67ca2298": "updateTokenName(uint256,string)", +"67cab29d": "testGetAbiVersion()", +"67cb103a": "PartnerUrl()", +"67cb61b6": "getChoice()", +"67cb9316": "get_header(uint256)", +"67cc4882": "TokenHolder()", +"67cd3f64": "UNLOCKSTART()", +"67cd5323": "PUBLIC_SALES_SPECIAL_USERS_RATE()", +"67cd64dc": "LENDXCOIN()", +"67cdbe8f": "newShip(uint16,uint256,uint256)", +"67cdc1c2": "percentageToTeamEthContract()", +"67ce38fb": "Vertex_Token(uint256,address)", +"67ce940d": "getOverhead()", +"67cf17c2": "transferPrimordialTokenFrom(address,address,uint256)", +"67cf7d9c": "createTeamTokens()", +"67cf91c9": "lastKickoffDate()", +"67cfdfc9": "getBrokerIncoming(address)", +"67d0661d": "doPause()", +"67d13f27": "receiveFromVendor(address,bytes32)", +"67d15775": "PromToken()", +"67d198cc": "getVaultsRoot()", +"67d22967": "set_iconiq_pre_kyc_bonus_numerator(uint256)", +"67d326ef": "finalizeFundAddress(address)", +"67d3d0ec": "changeEthBalance(address,uint256)", +"67d3eff4": "setTeamWallet(address,address)", +"67d41253": "secondCheckpoint()", +"67d42a8b": "release(bytes32)", +"67d49909": "secondWinnerTimestamp()", +"67d4e98c": "RemoveShare(address,uint256,uint256)", +"67d4f541": "window1TotalSupply()", +"67d520bb": "deployWill(uint256)", +"67d5fae1": "getPremiumCount()", +"67d6bcbf": "distributeBonusTokens(address)", +"67d6d142": "getPI_edit_19()", +"67d96c24": "compensatePreSaleInvestors(address[])", +"67da2831": "revealHiddenPosition(uint32,int64,bytes16)", +"67da299b": "mcrAmmountForGas()", +"67da7b7a": "LabCoin(uint256)", +"67dbaf93": "updateValueAndBurn(uint256,uint256)", +"67dbf587": "Bridge(uint256,uint256,address,address)", +"67dcec06": "WealthInternet(uint256)", +"67dd1730": "destPrecision(address)", +"67dd74ca": "buyTicket(uint256)", +"67dd7bb4": "tradingLocked()", +"67de698d": "adjustCap()", +"67de80db": "createMultiple(uint256[],uint256[],uint256[],address[],uint8[])", +"67de81e8": "fundSucceeded()", +"67deced2": "checkIn(uint256,string)", +"67df1187": "buysubscribers()", +"67df5189": "archiveCrowdsale(uint256)", +"67dfe2d3": "addEthForSell()", +"67e04a22": "initInviteAddr(address,uint256)", +"67e06858": "Add()", +"67e0badb": "getNum()", +"67e0d78f": "sendFundHomeAmt(uint256)", +"67e13ee0": "getDeveloper(address)", +"67e1aee9": "setStage1()", +"67e1c253": "getMyInviteCode()", +"67e22888": "bigMoney()", +"67e2a647": "createAwardTokens()", +"67e2d2ad": "wireInvestment(address,uint256,uint256)", +"67e33df5": "SwftCoin(uint256,string,uint8,string)", +"67e404ce": "sender()", +"67e4373f": "CARIToken()", +"67e43e43": "gsf()", +"67e445d9": "FOMO()", +"67e476d7": "getPublicSaleInfo(address)", +"67e4ac2c": "getAssets()", +"67e4d41d": "ProdAToken()", +"67e523bb": "iPeso()", +"67e53196": "getAuthByCode(string)", +"67e54367": "battleContractAddress()", +"67e5f18c": "getCurrentTierRatePercentage()", +"67e6869d": "Withdraw_4()", +"67e6bc2e": "hash(string,uint256,uint256,uint256)", +"67e6bf06": "testPresaleRefund()", +"67e70e99": "setselfrdroplist(address[])", +"67e7646f": "removeDelegate(address)", +"67e817f4": "XOV()", +"67e828bf": "source()", +"67e874c0": "testMeta(uint256)", +"67e8cd0f": "bidOf(bytes32,uint256)", +"67e8d3d2": "bonus2()", +"67e8f6e1": "_multipleTransfer(address,address[],uint256[])", +"67e8f90c": "heightAt(uint256)", +"67e902c7": "right92(uint256)", +"67e902d9": "ListingBought(uint256,uint256,uint256,address)", +"67e933f6": "checkCustomer(address,address)", +"67e94ae0": "listingFeeInWei()", +"67e988e7": "bountyAvailabilityTime()", +"67e9b860": "CreateSwap(uint256,uint256,bool,address)", +"67ea2fa0": "tasksSize()", +"67ea43bd": "producedBronzeCaps()", +"67eae672": "sendCoinFrom(address,uint256,address)", +"67eb5fbe": "_train(uint256,uint256,uint256,uint256)", +"67eb9bab": "createIssuerContract(string,string,string,uint256,uint256)", +"67ec00c0": "depositFrom(string,address,uint256)", +"67ec68c4": "winningNumbersFor(uint256)", +"67ecb82d": "transferAndLock(address,uint256,uint256,uint256,uint256)", +"67eccc12": "founderTokenWithdrawnPhase2()", +"67ed583f": "addPresaleHolder(address)", +"67edad0a": "preSaleSecondEtherCap()", +"67ee5f09": "getTotalDividends()", +"67eeba0c": "dailyLimit()", +"67ef5a37": "debugStuff()", +"67ef5cb9": "setPrice(uint32,uint32)", +"67efbab1": "changeAssignedAdmin(address,uint256,string)", +"67f01c04": "ETH(uint256)", +"67f04688": "LIMIT_TRANSFERS_PERIOD()", +"67f06f78": "_checkPixelAboveRight(uint256)", +"67f12ecf": "validate(address,uint256,uint256[101][])", +"67f17405": "majorEvent(bytes32,bytes,uint256)", +"67f239dd": "entry()", +"67f4224f": "eventPause(bool)", +"67f690b5": "hasRequestedForMigration()", +"67f6a258": "verifyCert(bytes32,bytes32,address)", +"67f718a9": "getTokenIds()", +"67f76863": "EnishiCoin(address[])", +"67f809e9": "DynamicPyramid()", +"67f83481": "isFounderUser()", +"67f8a8b8": "emergencyRefund(address,uint256)", +"67f8ca42": "usingCanvasBoundaries()", +"67f8df84": "playerId(uint256)", +"67fad28d": "RCLTOKEN(uint256,string,string)", +"67fbb7ba": "ownerAddSanSlotBatch(address[],uint256[])", +"67fbd289": "destroyTokens(uint256)", +"67fc1c6a": "validateProposedMonarchName(string)", +"67fd9da3": "multicastTransfer(address[],uint256[],uint256[])", +"67fdc2fe": "CricketToken()", +"67fdd509": "setIdRange(uint256,uint256)", +"67fdff26": "REQUIRED()", +"67fe5a0c": "accepted()", +"67fe6b47": "contractIsCompleted(string)", +"67fe6f0e": "checkOverExceed(address)", +"68014cec": "participantExists(address)", +"68019d75": "COCTokenBase(uint256,string,string,uint8)", +"6801db98": "devoteToCar(string)", +"6802c8a1": "FreeCoin()", +"6802ff77": "seedSupply_()", +"6803641c": "claimAllTokensForInvestor(address)", +"680478b1": "offerAsSacrifice(address)", +"68049361": "teamWallet_4()", +"6805b84b": "getPaused()", +"680660d4": "bulkAddCompany(address[],uint256[])", +"6806fdce": "assignGenesisAddresses(address[])", +"6807b84d": "Timebound(uint256,uint256,bytes32)", +"6807f752": "deleteBuyRequestInternal(uint256)", +"680819eb": "setRate(bytes32,uint256)", +"680a50cb": "shortenDeadline(uint256)", +"680add7b": "preSoldSharesDistributed()", +"680b0c5c": "tresholds(uint256)", +"680b3bdf": "migrateAll(address[])", +"680b5eba": "setHouseAddressTwo(address)", +"680b9d49": "getStakedAddresses()", +"680bd2f4": "RiseCoinToken()", +"680c26bc": "ATP(address,address)", +"680caed2": "Contract(address)", +"680def61": "market2019TokenCreated()", +"680e354a": "setSaleWindow(uint256,uint256)", +"680e6c9b": "receiveTokens()", +"680eba27": "GEN0_CREATION_LIMIT()", +"680f07b4": "getinitializeFeeWindowIdValue()", +"680f0938": "pay_dividend(string)", +"680f0eda": "set_harvest_amount(uint256)", +"680fb685": "OpenClose(bool)", +"6810e139": "shopSack()", +"68111cce": "getProduct(string)", +"6811444a": "getLastComment(address)", +"68116177": "getbalance(address)", +"681185ab": "_extractRawResource(address,uint256,bytes)", +"68118e95": "numberOfBlocksToEndLimitationPeriod()", +"6811c332": "distributeTeamTokens(address,uint256)", +"681232ad": "cosigner()", +"68125a1b": "isFriend(address)", +"681312f5": "setRoundLength(uint256)", +"6813947f": "contributionOf(uint256,address)", +"681478ab": "LegacyRepToken(address,uint256,address)", +"68155ec1": "transferTokens(address,address,address,uint256)", +"6815c19c": "DropdCoin()", +"6815c992": "grantPermissionP(address,address,bytes32,uint256[])", +"681617c7": "changeEscapeCaller(address)", +"68163034": "defaultTimeoutLength()", +"6816521a": "teamAllocation()", +"6816d920": "guaranteedBuyersLimit()", +"6816fcd6": "evMgmtDistributed(address,uint256,uint256,bool)", +"6817031b": "setVault(address)", +"68171516": "assetMethodIsAllowed(address,bytes4)", +"68173bcf": "deactivateToken(address)", +"68177733": "MixinToken()", +"6817c76c": "mintPrice()", +"681833d9": "bindAddr(address,bytes)", +"6818da44": "setPlatformManager(address)", +"68197360": "getVotes(uint256,address)", +"681b23dd": "senderETH()", +"681b3314": "get_pre_kyc_iconiq_bonus_numerator()", +"681b5651": "setEthToUSDRate(uint256)", +"681b742f": "changeFund(address)", +"681c2ad0": "getTknOfferPrice(uint256)", +"681c3251": "addTotalSuply(uint256)", +"681c7808": "setMinTime(uint40)", +"681c7e2b": "VAAToken()", +"681cb449": "VIcoin()", +"681ce98a": "getNextPrice()", +"681d52de": "tokenImporter()", +"681d8345": "getATMTotalSupply()", +"681e237d": "CommonToken()", +"681e3356": "transferBankOwnership(address)", +"681f01f2": "IsICOOver()", +"681f3e6d": "getUsername()", +"681f6486": "SimpleBid(address,uint256,uint256)", +"681f8116": "makeTradeable(uint8)", +"681fd129": "addInvestContract(address)", +"681fe70c": "isEmpty()", +"68203417": "thirdStage()", +"6820f8d2": "setOneContract(uint256)", +"68213256": "crr()", +"68216ca7": "addNewBranchInEpisode(uint256,uint256)", +"6821928b": "AddAuthority(address)", +"6822abae": "getMinimumCallCost(uint256)", +"68234a27": "getTransactionDescription(uint256)", +"68240412": "calculateWeiForStage(int256)", +"68250963": "preICODeadline()", +"682594db": "totalAllowedFreeze()", +"68259880": "ChangeOfRules(uint256,uint256,address)", +"6825c843": "_address(uint256)", +"682677e8": "TunDrMahathirMohammad()", +"6826ebf8": "r(bytes)", +"6827b9db": "getMonsterGender()", +"6827e764": "devFee()", +"682806a0": "ICOContract()", +"68281708": "restrict(address)", +"68283f4d": "claimBets()", +"6828d549": "rejectContribution(bytes32)", +"68296073": "setSnowflakeAddress(address,address)", +"682a5e89": "returnDuration(uint256)", +"682a90d2": "Store(bool,uint256)", +"682a9449": "setCustomerService(address,address,bool)", +"682ab756": "LogItemRegistered(address,uint256,uint256,bytes32,bytes32,bytes32)", +"682b6706": "___Kill()", +"682b7100": "deleteRoom(uint256)", +"682baa3a": "HATCH_COOLDOWN()", +"682bc77e": "setStarterPackOnSale(bool)", +"682bea5c": "setCallTable(uint256,uint256)", +"682d1138": "failExecute()", +"682d3bb0": "pdfCertificateProof(bytes)", +"682e1bb0": "isSTOProposed()", +"682e60a9": "presses()", +"682ed9ea": "sanMaxAmount()", +"682f3d36": "OrderMatch(address,int256,address,int256,uint256,uint256)", +"68302467": "paySeller(uint256)", +"68306e43": "dividends(address)", +"6830cdc4": "getJobCount(address)", +"6831c169": "totalPayedOut()", +"6831e272": "mintTokens(address,uint256,uint256)", +"683328bf": "takePet(uint64)", +"6833716f": "ProofShrimpFarmer(address)", +"6833d54f": "contains(string)", +"6833f60d": "triggerPause()", +"68342b33": "ownerInfoOf(uint256)", +"683431e2": "SelfDesctruction()", +"68347fdf": "ICO_MIN_DEPOSIT()", +"68348dfe": "_newGame(bytes32)", +"6835df3e": "SFT_PER_ETH_BASE_RATE()", +"6835f32c": "build(bytes)", +"68365eb7": "NewProject(address)", +"683674dc": "disconnectOrderUser(address,address,uint256,address)", +"683799e6": "setMaximumPurchaseFraction(uint256)", +"6837ff1e": "newContract(address)", +"68381874": "Trade(address,uint256,address,uint256,address,address,bytes32)", +"68381b96": "getHighestUnitPriceIdxFromSell()", +"68388b80": "banAccounts(address[])", +"6838e7c5": "PrinzeToken()", +"68393a4c": "getBonusByTime(uint256)", +"683a6858": "Recoverable()", +"683ad727": "getDeed(uint256)", +"683b4184": "inflation_complete()", +"683cde49": "upgradeBalanceOf(address)", +"683cecc2": "addressFunc(address)", +"683d4a4b": "minWithdrawalCoolingPeriod()", +"683d69e4": "checkEligibility(bytes32,address,address)", +"683de015": "switchUpgradable(bool)", +"683e0bcd": "ethPriceInUsd()", +"683e2929": "getPSlotLength(address)", +"683e3451": "CioCoinERC20Token(uint256,string,string,uint256)", +"683e70b6": "createWhaleTokens(address,uint256)", +"683f7f27": "removeParticipant(uint256)", +"68402460": "scheduleCall(address,bytes4,uint256,uint256,uint8,uint256)", +"68404cd9": "setValueSome(uint256,uint256)", +"6840721d": "searchReport(string)", +"6840c67d": "vestPartnerEquityReserve()", +"6840f8e8": "returnEth(address,uint256)", +"68412058": "getRank06()", +"68412063": "distributeTokens(address,uint256,uint64,uint64,bool,bool)", +"6841f253": "currentRoundLocked()", +"6841fd27": "remining(uint256)", +"68428a1b": "saleActive()", +"68437b58": "bet_purchased(address)", +"6843aef9": "increaseLockReward(uint256)", +"68445ce1": "insertNodeBefore(uint256,uint256,address)", +"68447a55": "fetchFunds()", +"68447c93": "referrer()", +"6844ab43": "testControlCreateSameItemId()", +"68458fcf": "assignInitialAddresses(address[],address)", +"6845950f": "getScriptActionsCount(bytes)", +"6846187f": "farmItems(address[],uint256[])", +"684641b4": "cumulativeInverse(uint256,uint256,uint256)", +"684649a6": "createProxy()", +"6846fe64": "_sellCallToClose(uint256,uint256,uint256,uint256,address)", +"684876a1": "migratePlayerRoundsData(uint256,uint256,uint256,uint256,uint256)", +"6849cb9d": "transferIssuer(address)", +"684b369e": "everisumToken()", +"684b49f5": "PriIcoSale2(address,uint256,uint256,address,address)", +"684bd9d6": "getRemainCount(address)", +"684d63bf": "mintAuditApproval()", +"684d9a04": "quarterSecond()", +"684e2345": "AishaCoin()", +"684ecd59": "getData_9()", +"684edea8": "ponziPriceInWei()", +"684efc40": "TravelNationCoin(uint256,string,uint8,string)", +"684f19c9": "WorldCupFactory(uint256)", +"684fa447": "AppAdded(address,string,address,uint256,bool)", +"684fbfdb": "sinLimited(int256,int216)", +"68503cdf": "getAvailableBalanceByAddress(address,address)", +"68504158": "toggleTransfers(bool)", +"68507757": "faucetBB0()", +"6850fa6d": "onoff()", +"6853367f": "withdrawDevelopersCut()", +"68533a1d": "closeUndercollaterizedPosition()", +"68536341": "ratePerOneEther()", +"6853920e": "removeRole(address,bytes32)", +"6853e3a4": "setToKnown(address)", +"685485fb": "eth_sent()", +"6854df55": "scannedDiamondCaps()", +"6854f668": "buyDragoOnBehalf(address)", +"6855ded3": "WHITELIST_END_DATE()", +"685705ae": "getWeiValue()", +"68573107": "batchMint(address[],uint256[])", +"6857ab40": "seq()", +"6857cb06": "manualTransfer(address,uint256)", +"68581ebd": "getJobs()", +"68583bc0": "FC1Token()", +"68586e57": "setPet(uint8,address,string,uint8,uint16,uint16,uint16)", +"6859274b": "checkMembership(bytes32,uint64,bytes)", +"6859d08f": "addToActiveGroup(address)", +"6859dc10": "rejectRequest(address,uint256)", +"685a73e0": "claimHodlRewardsFor(address[])", +"685adf5e": "ALDEToken(uint256,string,uint8,string)", +"685ae2a9": "itoEndTime()", +"685b2d8f": "transferPermissions(address)", +"685b47c7": "updatePresaleNumbers()", +"685c234a": "checkAuthorization(address,address)", +"685c60de": "transferERC23(address,uint256,bytes)", +"685ca194": "withdrawalAllowed(address)", +"685d1135": "recyclingRemainToken()", +"685e2486": "migration(address)", +"685e78fb": "SecondPriceAuction(address,address,address,address,address,uint256,uint256)", +"685ffd83": "registerNameXname(string,bytes32,bool)", +"6860dc1f": "isRefAvailable()", +"6860fd58": "Fees(uint256)", +"686174ec": "QQQTokenBase()", +"6861d3b8": "firstStageStartsAt()", +"68621711": "assetMeta()", +"68624bd7": "lockedValueOf(address)", +"68639a29": "setActivation(address)", +"6863d3c7": "CreatedIRC(address,uint256)", +"68649c8a": "setTiersInfo(uint8,uint256[],uint256[],uint256[],uint8[3][4])", +"68654ef8": "bonusBalanceOf(address)", +"68660b93": "updateDonateTokenAddress(address,uint256)", +"68664430": "supplyDAICO()", +"6866537d": "getCardPrice(uint256)", +"6866566a": "Priced(uint256)", +"6866d144": "_tokenPrice(uint256)", +"6866da59": "_lockOrUnlockAmount(uint24,uint256,uint256,uint256,uint256,uint256,uint8)", +"686790e5": "freezeSignatureChecker()", +"6867edeb": "getBuyOrderPrices()", +"68690dd0": "NeedRefresh(uint256)", +"68699224": "offlineAdjust(uint256,uint256)", +"6869b20e": "saveToken(uint256)", +"6869fb30": "maxWeiTier0()", +"686b2812": "addWhitelistUsers(address[])", +"686b88cd": "calculateWinnerGameType1(uint256,uint256)", +"686caf04": "lastBlock_a1()", +"686d2d5c": "getCurrentBonusPct(uint256)", +"686d5e00": "unRegisterCampaign(uint256)", +"686da8ab": "UpdateRecord(uint256,address,uint256,bool)", +"686e2284": "isCosmosSale()", +"686e8aaa": "GetMoney()", +"686f21ba": "gainKarma(int256)", +"686f2c90": "collectAllFees()", +"686f4564": "redeemedCards()", +"686fa3f7": "getGameId(address,string,string,uint16,uint64)", +"68700891": "RLPReaderTest()", +"6870c65a": "InitialRateChange(uint256,uint256,uint256)", +"6870ef86": "getCurrentTokenFee()", +"68715a75": "GCCHToken()", +"68716e7a": "EutinMokoToken()", +"6871819b": "getUserCollegeEducationDetails(string)", +"6871d26b": "addMeterPoint(int256,address,int256)", +"6872e300": "COPPER_AMOUNT_SKL()", +"68742da6": "withdrawFunds(address)", +"68750bbc": "sendReserveTokens()", +"6875b6eb": "changeRestrictions()", +"6875b746": "updateRelease(uint256)", +"6875c319": "escalateDisputeToMediator(uint256)", +"687711ec": "s25(bytes1)", +"6877dca7": "Token1_Transfer(address,address,uint256)", +"68784493": "votesUser(address,uint256)", +"68788868": "decodedAmount()", +"6878ac7d": "applicableRate()", +"68794b87": "setState(string)", +"687981ac": "getValidatorIndex(uint64,address)", +"687a46c4": "upgradeQualificationByEther(uint256)", +"687a48a1": "getBurnedCarCount()", +"687bf382": "_useName(address,bytes32)", +"687c317c": "setTokensUsedForReinvestment(uint256)", +"687cc2fd": "preSaleTokensAvailable()", +"687cde1a": "tokenSelled()", +"687d493c": "EverOwnedTokens(address)", +"687d5aa9": "setBuyAllowed(bool)", +"687db864": "END_ICO_TIMESTAMP()", +"687e6b5f": "MavenCoin()", +"687e6f44": "withdrawEthers()", +"687f8427": "devCATDestination()", +"68802712": "get_hedge()", +"688057fc": "registerWalletForFeeSharing(address)", +"68808769": "backers(address,uint256)", +"6880ff5b": "secondReserveWallet()", +"6881385b": "payday()", +"6881f6f1": "minTradingStartTime()", +"688225d6": "onemonth()", +"688257e0": "SmartContractWorkshop(string)", +"688263d7": "largestPenisOwner()", +"6882d481": "priceStar4()", +"68832d14": "___proxyTarget()", +"6883477f": "canBePurchasedByEMONT(uint16)", +"688507e1": "SellEgg()", +"688511bb": "timeoutBlock()", +"688521b4": "coinsIssuedTotal()", +"6885c572": "allowByDelegate(bytes8,bytes8)", +"6885edcd": "desiredPrice(uint256)", +"6885f63b": "TrustToken()", +"6886bf1c": "mostSent()", +"6886ce25": "ForkEthereum()", +"68873375": "CBRToken(uint256,string,string)", +"6887398d": "getContestTeamCount(uint32)", +"68879e5f": "RecoverySha3(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"68882b30": "buyCrab(uint256)", +"68888300": "updateAngelCardSeries(uint8)", +"68889db8": "setFreezingPeriod(address,bool,uint256)", +"68894a16": "changeMaxContribution(uint256)", +"68895979": "getUint256()", +"6889cf86": "icoOver5()", +"6889d646": "transferMoneyToOwner()", +"688a54dc": "ATxAsset()", +"688a7044": "CryptoRoulette()", +"688abbf7": "myDividends(bool)", +"688af37f": "QRL_Token()", +"688b410f": "sendTokenUpdate(address,uint256)", +"688b5c2b": "isMiningWarContract()", +"688ba636": "walletTeam()", +"688bf035": "calculateUSDcValue(uint256)", +"688cdba8": "ownerRate()", +"688cf404": "setAyantDroitEconomique_Compte_4(uint256)", +"688d3922": "isHardCapReached()", +"688d54b7": "getLLV_edit_34()", +"688dcfd7": "setProofType(bytes1)", +"688def07": "MMOToken()", +"688e69d8": "ownerPowerUpContract()", +"688f5ed2": "gracePeriodAfterRound1Target()", +"688fad5d": "updateIdentitySocialURL(address,bytes32)", +"68907360": "setRewardsContractHash(address,bytes32)", +"68915c14": "seedInvestors()", +"6891656e": "buyWithCustomerId(address,uint256,uint256,uint128,uint256,bool)", +"68927cd2": "isValidBNBContribution()", +"68931b21": "getTotalBooks()", +"68934e54": "approveBurnDelegate(address)", +"6893cc22": "toUint(bytes32)", +"6893e8d2": "_setLimits(uint256,uint256)", +"6893f63f": "getTokensPerEth()", +"689490a0": "whitelistedAddresses()", +"6895179d": "testToken()", +"68955fb1": "icoPhase()", +"6895adbb": "_addModule(address,bytes,uint256,uint256)", +"68963dee": "ICOMinTresholdReached(uint256)", +"68968564": "SaveYouAndMeToken()", +"6896a342": "ADVISOR_STAKE_ONE()", +"6896b999": "xConvertPrioritized(address[],uint256,uint256,bytes32,bytes32,uint256,uint256,uint8,bytes32,bytes32)", +"6896ef4b": "currentRoundIndex()", +"6896fabf": "getAccountBalance()", +"68970ab4": "Created(address,address,uint256,bool,uint256,string)", +"689786d0": "test_oneValidEqBytes32Message()", +"6897a1a2": "startingCostToPress()", +"6897c1b6": "PrepareToStart(string,uint256,uint256,uint256,address,address)", +"6897e974": "removeWhitelistAdmin(address)", +"689827b0": "modInverse(int256,int256)", +"6898730f": "eip20Transfer(address,address,uint256)", +"6898f148": "beforeSale()", +"6898f82b": "play(uint256)", +"68999d76": "exportTank(address,uint32)", +"6899d8c2": "recoverAll()", +"6899dac5": "finishVotingTeam(uint256)", +"689a4608": "Test20()", +"689a521d": "changeContractState(bool)", +"689b2d24": "AcceptsElyxr(address)", +"689b3e2d": "Moonraker(address,address)", +"689b732c": "FundValue(uint256,uint256,uint256,uint256)", +"689da08e": "dad()", +"689dcb02": "Buyin(address,uint256,uint256)", +"689e87c1": "GIRLBUFFERSIZE()", +"689effad": "BookingTimeUtils(address)", +"689f2456": "partial_refund()", +"689f3f99": "unclaimedPlotPrice()", +"689ffd82": "addressSalesSupply()", +"68a1e07f": "_currencyToToken(bytes,bytes)", +"68a287d8": "getTeamVault(address)", +"68a29a31": "balanceEthPrivate(address)", +"68a52509": "getLastOrderId()", +"68a52851": "setTokensContract(address)", +"68a596c7": "ownerToTokenIds(address,uint256)", +"68a59805": "setPayoutDistributionHash(bytes32)", +"68a67030": "finalizeSale1()", +"68a6b26b": "setWeiRaisedInPresale(uint256)", +"68a6e74b": "preICO()", +"68a72fba": "crowdTarget()", +"68a7d7ea": "setAgriChainData(address)", +"68a7e1c4": "setDelegadoDeEscuela(bytes32)", +"68a7effc": "getOrCreateCurrentFeeWindow()", +"68a7f6d6": "playerFastFlight(uint256,uint16)", +"68a8659d": "SellOrdersOf(address,uint256)", +"68a8c5eb": "WyvernDAOProxy()", +"68a958bc": "payrollSystem()", +"68a9674d": "depositFrom(address,address,uint256)", +"68a9de13": "changeEndtime(uint256)", +"68a9f31c": "secondOwner()", +"68aafcd9": "setUsageReportingAddress(address)", +"68ab3db2": "createDefaultGen0EtherDog(uint256,address,uint256,uint256)", +"68ab56ca": "get_bounty_count(uint256)", +"68abf22b": "BAC(uint256)", +"68acb7b7": "TOTAL_COMMUNITY_ALLOCATION()", +"68acfcbb": "changeLinkedAddress(address,address)", +"68ad1412": "registerUser(address,bytes32,address,bytes32,bytes32)", +"68ad6719": "valueChanged(string,string)", +"68aee9e8": "wed()", +"68af1378": "playerGuess(int8)", +"68af37df": "letter()", +"68af4971": "registerListening()", +"68afc7c4": "test_rewardPoolShare_isTranscoder()", +"68b017ec": "sarahtoken()", +"68b07ebb": "_getMaxAuctionSeconds()", +"68b0d82e": "TransferredGNS(address,address,uint256)", +"68b1a6d0": "GetBestWalletAddress(uint8)", +"68b2cee0": "removeAssetsOwner(address)", +"68b35396": "gemPerMiner()", +"68b43f38": "privateLockTime()", +"68b47d87": "SSOTHEALTH_FUNDS_ADDRESS()", +"68b49b78": "changeKey(address,address)", +"68b51ac7": "checkValidSignature(address,bytes)", +"68b5c351": "tokenTrueUSD()", +"68b670af": "wmulfloor(uint128,uint128)", +"68b6d55d": "potSize()", +"68b85aa5": "maxTimeout()", +"68b8c5a1": "numberOfAuthorizedPayments()", +"68b91201": "createInvestorTokenTimeLock(address,uint256,uint256,address)", +"68ba170c": "isRegisteredTranscoder(address)", +"68ba745c": "releaseTeamVested()", +"68bae934": "getAuctionItem(uint256)", +"68bba4d0": "HARD_CAP_T()", +"68bd6efa": "getContract(address,address)", +"68be7887": "getOrganisationByAddress(address)", +"68be8007": "_updateRegionOwner(address[16],uint256,address)", +"68be948d": "setRegisteringContractAddress(address)", +"68bee793": "LevelWhitelistedIICO(uint256,uint256,uint256,uint256,uint256,address,uint256)", +"68c14a61": "AirdropCentral()", +"68c197dd": "isWorkerPoolRegistered(address)", +"68c31649": "checkWithdrawAmount(address,uint256,uint256)", +"68c35c4b": "setEmail(address,string)", +"68c49cc9": "collectOtherTokens(address,address)", +"68c4cac6": "tokensPerEther1()", +"68c4eb74": "changeInvestorsAddress(address)", +"68c51f8e": "lhkjTNB()", +"68c64670": "RapidProfit(address)", +"68c646f3": "LifeFactor_i()", +"68c6b11a": "subtract(address,uint256)", +"68c6f45e": "issuedByStabilityBoard()", +"68c84260": "addEmployee(address,address[],uint256)", +"68c92b51": "doCall(address,uint256,bytes4,bytes32[])", +"68cbce31": "setWinner(uint256,uint256)", +"68cdafe6": "tokenTransfer(address,uint256)", +"68cdf759": "getReffAdd(string)", +"68ce77d0": "grant(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"68ce90ac": "handlePayment(address,uint256)", +"68cf5cf8": "setAdvisor(address)", +"68cff8a9": "notEmpty()", +"68d06724": "weisSoftCap()", +"68d12938": "setDonatorReward(uint8,uint256[],uint8)", +"68d155a0": "remove_participant()", +"68d317f1": "buildGame(address,string,string,uint256,uint256,uint8,uint8,uint8)", +"68d324e7": "changeCrowdSale(address)", +"68d32aed": "getVerifiedHashID(address,bytes32)", +"68d3d433": "specialDefenses(uint256)", +"68d3fb7b": "initRegister()", +"68d5a014": "reveal(uint256,uint8[5],bytes32)", +"68d5cb1a": "purchaseBuilding(uint256,uint256,uint256)", +"68d64514": "getRemovableIdArrayItems(address,uint256,string,string,string)", +"68d6a790": "timeOfreservations(address)", +"68d77366": "Coinlancer()", +"68d7e4b5": "addDeal(uint256,string,string,uint256,string,bytes32,string)", +"68d7f8d6": "nextPrice(uint256,uint256)", +"68d830ae": "get_unlock_time()", +"68d85d3e": "CloudexchangeCrowdsale(uint256,address)", +"68d88c25": "serviceRedirect(address,address,uint256)", +"68d89792": "setCatAttributeValue(uint256,uint256,string)", +"68d967dd": "changeDoublr(address)", +"68d9e8c4": "DKoin()", +"68da480b": "maxWeightBonus()", +"68da5ee5": "guess(uint256[])", +"68dae6bb": "RoundClose(uint256,uint8,uint256,bytes32)", +"68db96a6": "whitelistBonusRate()", +"68dbc6c1": "fortune_bid(uint256)", +"68dc3926": "unchanged(address)", +"68dc9528": "giveTokens(address,uint256)", +"68dd43f6": "maxNumInterests()", +"68df0d53": "_removeTokenFromOwnerEnumeration(address,uint256)", +"68df4dda": "removeWhitelistedTokenAddr(address)", +"68df5ca4": "testMinReturn0WithoutReturn()", +"68e03bf9": "setEthEurRate(uint256)", +"68e09ab5": "tokenEscape(address,uint256)", +"68e114db": "PFG(uint256,string,string,bool)", +"68e12fa8": "addressCallWithArray(address,address[3])", +"68e1569a": "parking()", +"68e1bba4": "eth_ratio()", +"68e1f526": "WeMediaChainToken()", +"68e2076a": "Hub()", +"68e39aac": "proxyWorking()", +"68e453ed": "totalSaled()", +"68e47f59": "accept(address,bool)", +"68e4bd99": "testSetBitSuccess()", +"68e5a07e": "getExcludes(uint256,uint256)", +"68e5e22f": "buyAnalysis(address)", +"68e67402": "RoomPlayersAdd(uint8,address,uint256,uint8)", +"68e757a0": "create_public_sale_token(address,uint256)", +"68e76403": "getTotalFeesCollectedCount()", +"68e7bdba": "disableApi(address)", +"68e7e309": "_saveVerification(address,address,uint32)", +"68eb59b0": "startGladiatorWithCoin(uint8,uint8,address)", +"68ebd450": "bioLock()", +"68ec0d99": "refundable(address)", +"68ec8446": "RentartoICO()", +"68ec9dba": "emptyPendingUserList()", +"68eca613": "numShareholders()", +"68ecabcf": "ankcwdsleToken()", +"68ee137e": "bonusClaimedTokens()", +"68ef7946": "zazSupply()", +"68ef8661": "isValidParticipant(bytes32)", +"68efa030": "Dao1901()", +"68efb367": "exile(uint8,uint8,uint8,bytes4)", +"68f04bbb": "openAirDrop()", +"68f06b29": "redeemable(bytes32)", +"68f0bcaa": "atomicize(address[],uint256[],uint256[],bytes)", +"68f15aac": "DMChainToken(string,string,uint8,uint256)", +"68f16293": "transferCooldown()", +"68f169e1": "sellCut()", +"68f269b4": "RATE_ETH_TXK()", +"68f2ab8e": "Currency(string,string)", +"68f2c86a": "changeUserPerms(address,bool,bool,bool)", +"68f2d6e2": "GEN0_MINIMAL_PRICE()", +"68f319b1": "placeBet(uint8,bool,uint256,uint256,bytes32,uint8,bytes32,bytes32)", +"68f399f4": "BetSetAnswer(uint256)", +"68f5aa0f": "setShareholderDB(address)", +"68f5ccdf": "devFeePaid()", +"68f5d173": "addAdminister(address)", +"68f65f02": "ChangeShownDenomination(bool,bool,bool,bool)", +"68f67330": "finalizedCrowdfunding()", +"68f6e75f": "percent1()", +"68f7ef1b": "BLKToken(address)", +"68f88a26": "getMatchSummarizeInfo(uint256)", +"68f8957a": "setAyantDroitEconomique_Compte_1(uint256)", +"68f8fc10": "buyToken(address,uint256)", +"68f91814": "mainMultisigEther()", +"68f9dab2": "hash(bytes,bytes,uint256)", +"68fa8134": "removeAdministrator(address)", +"68faaa6f": "getTotalSellCount()", +"68fad504": "burnExtraTokens()", +"68faecdb": "depositedMYB(address)", +"68fb81b7": "iCoTokensSold()", +"68fbbab8": "giveMultipleItemsToMultipleRecipients(address[],uint256[])", +"68fbd0a8": "TPTSchedules()", +"68fcb6ee": "purchaseCard(uint256,uint256)", +"68fd0455": "contractorCancel(bytes16,address,address,uint256,uint256)", +"68fd22d3": "_addToList(address[],address)", +"68fe4405": "getBondHolder()", +"68ff8c4c": "UserList()", +"68fff456": "blackMask()", +"69008fb6": "buyTileAuction(uint8,uint256,address)", +"6900a3ae": "toString(uint256)", +"6901f668": "validate()", +"690252c8": "addSshKey(string)", +"69025b5f": "_addTokenToOwnerEnumeration(address,uint256)", +"6902a416": "AUMXToken()", +"69030397": "addLocker(address,address)", +"69032f15": "cantSetReferrer(address)", +"69043895": "exOwner(address)", +"6904c104": "getCampaignValidity(bytes32)", +"6904c94d": "company()", +"6904efc5": "BeatTokenIcoPhase3Started()", +"6904f583": "econVestingStage()", +"6905877a": "totalOwedForApi(uint256)", +"69061355": "claimOwnership(uint8,bytes32,bytes32)", +"6906679b": "getHistory(uint256,uint256)", +"6906a137": "checkCharger(uint256)", +"69070772": "MyFreeCoins(uint256,string,uint8,string)", +"69071418": "poolCLock()", +"6907baa9": "Campaign(address,address,address)", +"69081199": "WithdrawFunds(address)", +"69086c21": "a(bool,bool,bool)", +"6908d99c": "Extract(address,uint256)", +"6908ea00": "_checkVotes(uint256,bytes32,bytes32)", +"690973b6": "placeSpectatorBetOnGladiatorBattle(uint256,bool,uint256)", +"6909f5bf": "generateTokenWithAttributes(string,string,string)", +"6909fd44": "isWhitelisted(uint256,bytes32)", +"690a946b": "getProjectEndDate(uint256)", +"690b1897": "AragonTokenSale(uint256,uint256,address,address,uint256,uint256,uint8,bytes32)", +"690c11d5": "getcoursesLenght()", +"690c5de8": "phase4Cap()", +"690cf0d1": "preSaleStarted()", +"690d0b1d": "STARCrowdsale()", +"690d23be": "getItemAmountOf(uint256,address)", +"690d3750": "lockBalances()", +"690d8320": "withdrawETH(address)", +"690e1d22": "showLockNum(address,address)", +"690e7c09": "open(uint256)", +"690eb3f8": "getTicketSumToRound(uint256)", +"690f2f8e": "_addTokenAddress(address)", +"690f411b": "VividoTokenTMP()", +"690f4559": "createPersonalDepositAddressFor(address)", +"690fa5df": "getPlayerRefById(uint256)", +"69102190": "checkCount(address)", +"69111865": "LINDOToken()", +"69115768": "hasItBeenReleased(uint256)", +"69129b4f": "StandardToken(uint256,string,string)", +"6912c8ba": "thirtyPercentWithBonus()", +"69132d43": "useBalanceOf(address)", +"69132f72": "SALE2_END()", +"6913a63c": "addGuard(address)", +"6913d82d": "adminSetBlock(uint256,uint256)", +"6914db60": "tokenMetadata(uint256)", +"6914f40f": "getPI_edit_27()", +"69161b9e": "addAddressToGrantAccess(address,uint256)", +"6917fd5e": "BONUS_ICO_PERIOD_ONE()", +"6919d09a": "Y(uint256,uint256)", +"6919ff17": "test_insert_findNoHintAtPosition(int256)", +"691a38ab": "canBeWhitelisted(bytes32)", +"691a3f64": "buyFrom(address)", +"691a5842": "totalEtherRaised()", +"691ae7c9": "setCandyPowerToken(address)", +"691b7ce0": "transferCMO(address)", +"691ba73a": "race()", +"691bf023": "LockTokens(address,uint256,string)", +"691bfc89": "goods(uint16,uint256)", +"691c65d4": "mintItem(address)", +"691c71bd": "endTime2()", +"691c9484": "registerInvestor(address)", +"691cdb51": "CoinoorCrowdsale(address,address,address,address,address,uint256)", +"691d58e7": "_applyRefund(uint256)", +"691d933a": "getDeedByAddress(string,uint256)", +"691de4a4": "add(string,bytes32)", +"691e9961": "we_test_token()", +"691ed382": "THIRD_TIER_SALE_START_TIME()", +"691edfda": "devAccount()", +"691f2216": "User_1()", +"691f3431": "name(bytes32)", +"691fb8ea": "jumpIn()", +"692058c2": "dex()", +"69205dfc": "TUNEZ()", +"6921278a": "rateFee()", +"69215eb3": "ethMined()", +"692193cc": "MarketplaceAccessor(address)", +"6921af97": "payOutBounty(address,address)", +"69229b43": "ChangeOwnerContract(address)", +"6922eb06": "sellPackToAddress(uint16,uint16,address)", +"692345ee": "elapsedPeriods()", +"692397a4": "testIssueTokens()", +"69244c55": "getIcoReward(uint256)", +"69245009": "cage()", +"6925ad77": "multiplex_target(address)", +"6925b015": "contributionBy(address)", +"6925ebb9": "fluxFeed(uint256,bool)", +"6926890b": "createSale3()", +"69269371": "newAmendment(string,uint256,uint256)", +"6926cc7b": "_canSetReferrer(address,address)", +"692740b6": "_areStakeAndWithdrawAllowed()", +"6927bc38": "_isValidSignature(address,bytes)", +"6927cac5": "trustedSender()", +"6927e45a": "TOKEN_SHARE_OF_ADVISORS()", +"6927f800": "Tango1Token()", +"69288540": "setDEV(address)", +"6929dd0b": "confirmOrderCompletionByDoctor(bytes16,bool)", +"692aa97e": "isOpened()", +"692ad3a9": "round(uint256,uint256,uint256,uint256)", +"692b3712": "DMINT()", +"692bf818": "isIntermediary(address)", +"692cd610": "nextRewardPlayNo()", +"692d9ee5": "SALE_TOKENS()", +"692dfe8e": "maxStakeHolders()", +"692f74aa": "getvehreqdetails(uint256,address)", +"69306f24": "numberOfCommittees()", +"69307c80": "rotateBits(bytes,int256)", +"6930a020": "bruler(uint256)", +"6930a7e9": "adminMode(bool)", +"6930c5da": "depositSavings(address,uint32)", +"6930fd2a": "claimAll(uint256)", +"693103a0": "addAffiliates(address[],uint256[])", +"69318a79": "makeComment(string)", +"6931b550": "claimEthers()", +"6931e19f": "productPrices(bytes32)", +"69328dec": "withdraw(address,uint256,address)", +"6932af36": "proxies(bytes32)", +"6932c9c5": "getSaleContractDepositAddress(address)", +"6932cf81": "getName(string)", +"69335938": "vestedDate()", +"693382a9": "addToWhiteList(bytes32,address)", +"693391fe": "createNewUser(address,address,string)", +"69347990": "ownerWithdrawl()", +"69358e2e": "getCompanyList()", +"6935a0d0": "addNewEventToBusiness(uint256,address,string,string,uint256,uint256,uint256,uint256)", +"6935a290": "OriginsTraceChainToken(address)", +"69361de3": "I21Token()", +"69361fe2": "FeeCalculated(uint256,uint256,uint256,uint256,uint256)", +"693649aa": "mintRewardCore(address,uint256,uint256,uint256,uint256,uint256)", +"6936c1cf": "XoloChain()", +"69389cac": "setPlayerForm(uint256,uint8)", +"6938d9b0": "allocatePresaleTokens(address,uint256,uint256)", +"6939864b": "lotteryState()", +"693ac4fb": "getProof(bytes)", +"693b2b3f": "ticketTransferersAmount(address)", +"693bd2d0": "cardContract()", +"693cf8ce": "amountToSeedNextRound(uint256)", +"693d0141": "retireWildEasy(uint64,uint64,uint64,uint64,uint64,uint64)", +"693d0df2": "claimFunds(address)", +"693dde5c": "getAppId()", +"693e2279": "burntFounder()", +"693e26dd": "createVirtualEntity()", +"693ec85e": "get(string)", +"6940030f": "disableTrade()", +"69401027": "acceptClockmaker()", +"694094fd": "M5Token()", +"69414e7b": "SaveCryptoNetwork()", +"6941a061": "IdxCoin()", +"69422924": "hasVotedOnDocumentPoll(uint8,bytes32)", +"69423429": "getMyDividendAmount()", +"694244f8": "PreSaleStart()", +"694278da": "publicKeyYForX(uint256)", +"69428d97": "OwnableSimple()", +"6942dc03": "EnvironToken()", +"6942eac7": "Currency()", +"6942eff7": "_unverifyAddress(address)", +"69431ab6": "TokenCreation(uint256,uint256,address,string,string,uint8)", +"69433e12": "setExchange(uint256)", +"6943935e": "DPOS()", +"69443bf4": "CTAuction(address,address)", +"694463a2": "totalEntrants()", +"69454b86": "pairs(address,address)", +"6945c5ea": "setPlatform(address)", +"6946e33b": "GXVCNoToken(uint256,address)", +"694702ec": "CommonTokensale(address,address,address,address,uint256,uint256)", +"694719d8": "MIN_REFUND_RATE_DELIMITER()", +"69488271": "AllocatePresale(address,uint256)", +"6949a058": "sendOwnerEther()", +"6949e1d4": "AngleToken()", +"6949ed67": "omec(uint256,string,string)", +"694a813f": "bet1deltaOf(uint256)", +"694b1727": "addServer(string,uint8,uint256,uint256)", +"694c00d1": "reclaimBySender(address,address,bytes32)", +"694c11eb": "buyCore(address,address)", +"694d3757": "isAuthDisabled(uint256)", +"694dcecc": "preCrowdsaleStartTime()", +"694df50a": "freezeAddress(address,bool)", +"694e0d5b": "StringPasser(uint8[])", +"694e4277": "payment(uint256,address,uint256,bool)", +"694e80c3": "changeThreshold(uint256)", +"694ebe05": "createEscrow(address,uint256,address,uint256)", +"694f5a08": "_clearTotalNormalTokensByAddress(address)", +"694f6276": "_approvedFor(address,uint40)", +"6951b995": "grantCompanyCoins(address,uint256)", +"695338b9": "ChillIssued()", +"6953ace4": "finalTokenExchangeRate()", +"6953ba9a": "nextStarIndexToAssign()", +"69541be8": "DefaultReverseResolver()", +"6954abee": "owner_supplied_eth()", +"69557669": "changeContracts(address,address,address,address,address)", +"6955c8fc": "getBuyPriceAndPreviousRecord(bytes32)", +"69569a51": "setFrontend(address)", +"6956f3d5": "_totalTokens()", +"69573648": "remove(bytes,bytes)", +"695741f8": "waitTimeBlocks()", +"69580f63": "setVendorName(address,bytes32)", +"6958420b": "arbYes(uint256,address,uint256,string,uint256)", +"69594cfa": "transactionLog(uint256)", +"69598efe": "totalPartitions()", +"69599168": "onEmergencyChanged(bool)", +"6959d5c7": "getCitationRecord(string,uint256)", +"695a4cad": "finishTransferFeePayment()", +"695a7e9d": "CheckAmbientLightException(bytes32,uint32)", +"695addc9": "newProposal(bytes32,address,uint256,bytes)", +"695b4700": "transfer_token_from(address,address,uint256)", +"695c5a26": "getCurrentPhaseCloseTime()", +"695ca8c8": "Rhodium()", +"695d027b": "EMoney(uint256,string,string)", +"695d7297": "updateRewardForDrawing(uint256)", +"695d7797": "makeWallet(uint256)", +"695dcfa4": "createContract(bytes32,uint16,bytes32,uint256,uint64,bytes32,uint64,bytes32,uint64,uint64)", +"695e1341": "UNGT()", +"695e2a30": "METAXCrowdSale()", +"695e54c3": "setCountWinnerPlace(uint256)", +"695ec793": "secondRelease()", +"695f9db3": "createRocSaleMarkets(uint256,uint256)", +"69606c61": "CompalTestCoin1(string,string,uint256,uint256)", +"6960947d": "stockSize()", +"6960a0ed": "getArtWorkChangeFee(uint256)", +"69615c0c": "TransferSalPay(address,address,uint256)", +"69623ae2": "addPlugin(address,address)", +"6962b010": "freezeEndsAt()", +"69632f56": "unitAttack(uint256)", +"69639749": "getMemberRole(address)", +"696495f9": "GetLettuce(address)", +"6965193f": "_processTransactionFee(address,uint256)", +"69652fcf": "resign()", +"69658cf3": "checkMyTokens()", +"69666811": "collectAllReturnBalance(address)", +"69671622": "depositToken(address,uint8,uint256,uint256)", +"69683080": "totalRestrictedAssignments()", +"6968ce29": "refundNonKYCInvestor()", +"6969d216": "topLevelDomainOwner(string)", +"6969d5d8": "appointAdministrator(address)", +"696a7253": "setConstraint(bytes32,bool,bool)", +"696b1030": "enableLimit()", +"696b5fb7": "getAssetID()", +"696bda86": "submitProposal(uint256,bytes)", +"696c58c4": "getRefund(address)", +"696c9c0a": "create(address,uint256,bytes)", +"696cd82c": "_register()", +"696d25fb": "calcVestableToken(address)", +"696d7ee9": "airdropPrize(address)", +"696d816a": "endSell()", +"696df08e": "FULL_TOKEN_WALLET()", +"696e6a6a": "Octiron()", +"696e7a85": "listPrycto3()", +"696ecc55": "trade(uint256,uint16[],uint8,bytes32,bytes32)", +"696f541c": "getOrg(string)", +"696f8a95": "CrowdCoinICO(address,address,address)", +"696fcc7c": "abortTime()", +"696fd28a": "SBSToken()", +"696fd68c": "makeTransferable()", +"697025b6": "transferEnablingDate()", +"6970402c": "areAllTokensRegistered(address[],address)", +"69706d9d": "unlockAmounts(uint256)", +"69708616": "push(address,uint16,uint256[4],uint256[2],uint8[11])", +"6970f46b": "BitFwdToken()", +"69712ffa": "removeTokenLock()", +"69719706": "Huangdashi(uint256,string,uint8,string)", +"6971d64c": "func_0AB9()", +"69732d4b": "ProjectX()", +"6973a4f8": "backTransfer(address,uint256)", +"6973cf58": "createEthSiringAuction(uint256,uint256)", +"6973e6db": "extraDataToNbJurors(bytes)", +"6974c632": "getItemPriceById(string,uint256)", +"6975846a": "getCurrentBidAmount(uint256)", +"6975aa9f": "minGoalReached()", +"69766079": "buyin()", +"6977083e": "updateStrategyAddress(bytes15,address)", +"69774c2d": "topup()", +"69776b1b": "tranchePeriodInDays()", +"6977aa62": "mintUnreleasedCard(uint8,address)", +"6977d9de": "addEmployerTotalInvoiced(address,address,uint256)", +"6977edc6": "dataControlAddOwner(address,address)", +"69793570": "_deleteOperation(bytes32,bool)", +"69794795": "getRiskParams()", +"697952af": "updateHolder(uint256,bytes32,bytes32,bytes32,bytes32)", +"697a2902": "HDhundun()", +"697a3083": "destroyforsecurities(uint256)", +"697a60b3": "updateContract(string,address)", +"697aefe2": "certificato(string)", +"697b139e": "changeGift(uint256)", +"697c37c5": "cd1(address)", +"697ca8bf": "getContributorInfo(address,string)", +"697cca66": "safeRelease()", +"697d1eaf": "getGroupTeamInvest(uint256,uint256)", +"697d2e19": "getDisputeTimeoutState(uint256)", +"697ee181": "DemeterCrowdsaleInstance()", +"697fa3e6": "forCommand()", +"697fa43d": "isBatchCeateDrawings()", +"697fb220": "addLockAddressInternal(address,uint256)", +"697fc672": "creatorClaimFundTransfer(uint256)", +"697fd39e": "randomNumberIncome()", +"6980f4fb": "heroTypeIds(uint16,uint256)", +"69810d0c": "TOTAL_SHIP()", +"69815435": "isAbove(uint256,uint256,string)", +"69817410": "investHappened(address,uint256)", +"69817dd4": "ProspectorsDevAllocation(address)", +"6981b5f4": "getLength(string)", +"6981c879": "updateDate(address)", +"69820a80": "birthBlock_()", +"698232fe": "balances1(uint256)", +"6982c6f4": "tickets100price()", +"6982f45a": "AutomobileCyberchainToken()", +"69833668": "allocateEndBlock()", +"69837721": "accForBounty()", +"6983f908": "isAllowedToBuyByAddress(address)", +"69843940": "getValue(bytes32)", +"6984d4a8": "getBigPromoPercent()", +"6985a022": "Pause()", +"6985a1b0": "endInstance(address,address)", +"6985c57e": "createRare(string,uint256)", +"6985e46e": "getConflictResolver()", +"69863520": "getOrganizerName(uint256)", +"6986ab82": "getNeedLockFundsFromPeriod(uint256,uint256)", +"6986d405": "elapsedDays()", +"6988e9cc": "tokenTotalSupply(address)", +"69898d64": "removeGift(uint256)", +"698a92fe": "CNKTToken(uint256,string,string)", +"698afd98": "withdrawFrom(string,address,uint256)", +"698bdd6f": "ViewtMyBets()", +"698c1d17": "CoinBX(address)", +"698d67aa": "registerBarcode(bytes9,bytes3,string,string,bytes19)", +"698d8a1e": "completeProvision(address,uint32,uint256,uint256)", +"698edc76": "getLawyer(address)", +"698f16aa": "pauseTrueUSD()", +"698f2e84": "setVirtualExchange(address)", +"698fbe92": "setWhitelisted(address,uint8)", +"69902ffb": "buyPerUnit(address,uint256)", +"699084f4": "CNBCoin(uint256,string,uint8,string)", +"69919447": "sclToken()", +"6991bad0": "number_of_token()", +"6991cb13": "EthlanceSponsorWallet()", +"69921c26": "checkAccount(address)", +"6993176a": "setMtdAmount(uint256)", +"69934ee7": "becomeRichest()", +"6993b507": "getDoublePeriod()", +"69940d79": "getRewardToken()", +"6994436e": "Shefo()", +"699450e8": "student()", +"699487c2": "getRecordNameToken(bytes32)", +"69949c77": "getRestricted()", +"6994a62b": "getRedemptionStatus(bytes32)", +"6994a7a0": "getPlayerAmount(uint256,uint256,address)", +"69950bd6": "addNewVendor(address)", +"69953501": "setUtils(address)", +"69958ab9": "cancelGame(uint256)", +"69972e07": "unvouch(bytes32,uint256)", +"6997545f": "SetParticipantStatus(address)", +"6997bcab": "totalSpending()", +"6997d166": "USER_VOTE(uint256,uint256)", +"6997f429": "MacroProxyContract()", +"69986073": "mainSaleSuccessfull()", +"6998a85b": "setTimeToBorn(uint256)", +"69995128": "updateAccount()", +"6999579f": "consolationRewardsClaimPercent()", +"69997696": "updateLoveStoryWithData(bytes16,bytes32,bytes32,string)", +"69997987": "distributeIQTToken()", +"6999d38f": "cancelBetByB(uint256)", +"699a195d": "addEA(string,string,string,uint32,address,address,string)", +"699a3a7f": "etherSince100()", +"699abb3c": "setTaxPercentage(uint256)", +"699ac46f": "mintTransfer(bytes32,uint256,bytes32,address)", +"699b328a": "randomize()", +"699be1bb": "lastBlock_v9Hash_uint256()", +"699c1687": "getProductBuyer(uint256)", +"699c181e": "currentTokenPerETH()", +"699c267a": "Jii()", +"699dc8ff": "proxyMintTokens(address,uint256,bytes32)", +"699dde66": "SiniCoin(string,uint256,uint8,string)", +"699e2bc6": "getTradeInfo(uint256,address,address)", +"699ef40c": "updateProfileAboutMe(string)", +"699f0c72": "getOfferPriceEth(uint256)", +"699f1fa9": "thisIsFork()", +"699f200f": "addresses(bytes32)", +"699ffd88": "get_database_id()", +"69a0188a": "setHashToFalse(bytes32)", +"69a046f2": "wadd(uint128,uint128)", +"69a0b5c0": "isSolved(uint8[9][6])", +"69a1aa95": "bulkPurchageLand()", +"69a1b0e2": "claimB1()", +"69a1bca9": "refundSale()", +"69a26fb8": "BuyStatus(uint256)", +"69a300f6": "getRangeID(uint256)", +"69a3a65a": "HBXToken(address)", +"69a44176": "aTransfer(address,address[],uint256[])", +"69a479e2": "IPETToken()", +"69a4c408": "AdminSupply()", +"69a4eda5": "calculatePositionProfit(uint256)", +"69a56df4": "testNewCounterValueAfterAIncrease()", +"69a5e902": "multiAccessCall(address,uint256,bytes)", +"69a683f1": "pollCompleted()", +"69a68f5f": "setPhase1AccountTokensMax(uint256)", +"69a69658": "createCoreRequestInternal(address,address[],int256[],string)", +"69a75868": "firstYearGameMiningTokenCap()", +"69a8c3bf": "CurrentGameId()", +"69a9e6b8": "togglePayment(uint256,string)", +"69aa2c9f": "burnMultNom()", +"69aaa388": "changeMultiSignatureWallet(address)", +"69aab7e3": "withdrawNAC(uint256)", +"69aad305": "getFromBalance(uint256)", +"69ab0005": "setThreshold(uint256,uint256,uint256)", +"69ab3404": "withdrawPartialDevelopersCut(uint256)", +"69ab7895": "get_payment_by_id(uint256,uint256)", +"69ab8c76": "ADVISORS_MONTHLY()", +"69ab8e52": "IsICONotStarted()", +"69ab98dd": "worldCupResultPart4()", +"69abed8f": "updateReferralBonus(uint256)", +"69ac5721": "unlockDate()", +"69ad56de": "_nextFifoStorageKey(uint256)", +"69add113": "tradeBancor(address[],uint256,uint256,address)", +"69addb6e": "IssueToken(uint256,address,uint256,uint256)", +"69ae7757": "registerAntique(bytes32)", +"69af0634": "cancelAllBuyOrders(address,uint256,uint256)", +"69afa869": "setRoundTwo(bool)", +"69b041bb": "swarmFundAddress()", +"69b0abea": "remainingPurchaseAmount()", +"69b144eb": "testThrowsCreateNewRevisionNotOwner()", +"69b29b51": "saleLimitReachedForCurrentStage()", +"69b31548": "ForwarderDeposited(address,uint256,bytes)", +"69b41170": "DELAY()", +"69b492f9": "weisMinInvestment()", +"69b4a1ef": "NUM_STAGES()", +"69b59e75": "collectFee(address)", +"69b5fb58": "setAuthorName(string)", +"69b6438e": "FUNDS_WALLET()", +"69b71e06": "unblockFunds(uint256)", +"69b7215d": "doesProofExist(bytes32)", +"69b7ca85": "getCaptainInfo(uint256)", +"69b8f38d": "ICO_PERCENTAGE_2()", +"69b94cf0": "_transferWithData(bytes32,address,address,address,uint256,bytes,bytes,bool)", +"69b9b787": "deposit2(address,address)", +"69b9e96b": "setBuyoutDividendPercentage(uint256)", +"69ba0fe9": "getStringValues(bytes32)", +"69ba3c06": "rejectErx20TransactionRequest()", +"69ba820e": "retrieveWalletForVanity(string)", +"69baa4ba": "TransferredToken(address,uint256)", +"69bb4dc2": "availableTokens()", +"69bba72f": "getAirdropStats(address)", +"69bbe5c7": "checkRound()", +"69bc1a55": "testFail_doubleVoting()", +"69bc513a": "setGGEAddress(address)", +"69bcdb7d": "getCommitment(uint256)", +"69bd01c4": "getvalue()", +"69bd28f0": "_buyToken(address)", +"69bd3436": "debatingPeriodInMinutes()", +"69bd4ec5": "processSellRequest(string,address,uint256,uint256)", +"69bdd5dd": "appSet()", +"69bdfd3a": "toContractDie(bytes,bytes,uint256)", +"69be51bb": "TOKENS_EARLY_BACKERS()", +"69bee8a1": "getWorkerPoolsCount(address)", +"69bef517": "balanceOfOnForHolderUpdate(address,uint256)", +"69c0ad93": "setInternalDependencies(address[])", +"69c19d4c": "getOutcomeTokenDistribution(address)", +"69c1a712": "lastHeartbeat()", +"69c1da7c": "GetManifestoByCategory(string)", +"69c212f6": "getUserByAddress(address)", +"69c254b9": "getSSPRegistry()", +"69c261ed": "setFreelancerCategories(address,address,uint256[])", +"69c338ff": "SomeContract()", +"69c4113d": "setNewBudget(uint256,uint256,uint256,uint256)", +"69c46821": "checkReferrer(address)", +"69c5c229": "testControlUpdateLatestRevisionNotUpdatable()", +"69c5f36e": "getTokensForContribution(uint256)", +"69c63434": "RaffleInternetBook(string,uint256)", +"69c6a5d2": "derive_sha256(string,uint256)", +"69c6f18d": "_transferItem(address,address,uint256)", +"69c74033": "withdrawSnowflakeBalanceFrom(string,address,uint256)", +"69c7c180": "m_orderCount()", +"69c7e386": "decreaseICOStartTime(uint256)", +"69c87817": "minimumWithdraw()", +"69c89774": "removeWhitelistedTransfer(address[])", +"69c8b344": "ownedToken(address)", +"69c8c7ef": "subtrReferralDeposit(address,uint256)", +"69c92c5a": "removeAddressFromBackend(address)", +"69ca02dd": "Transfer(address,uint256)", +"69ca16fa": "eventLogHand()", +"69cb418a": "RTeamCoin()", +"69cbb042": "getEncPubkey()", +"69cbd0fe": "MintableBaseCrowdsale(address)", +"69ccacd4": "setPercent4(address,uint256)", +"69cd5df1": "icoTokens(uint256,uint256,uint256)", +"69cd61be": "lockOwner()", +"69cdba9a": "approveChangeOwner(uint256)", +"69cef46c": "uploadData(bytes)", +"69cf7ac3": "miningToken()", +"69d01268": "concatUInt(uint256)", +"69d0292d": "addPresale(address,uint256,uint256)", +"69d03738": "setNFTAddress(address)", +"69d0b5e2": "buyInMarket(uint256,uint256)", +"69d0e33c": "getPlayerPlayedTimes(uint256)", +"69d0ef84": "callAndFailWithDivisionByZero()", +"69d196e1": "canAcceptPayment(uint256)", +"69d19c19": "BDSM()", +"69d1d1ca": "postGoods(string,uint32,string,uint256)", +"69d20762": "MassivelymultiplayeronlineVideoGames()", +"69d24f63": "lifetime()", +"69d25ff2": "updateCustomFee(uint256,address,address,address,address)", +"69d29832": "startBonuses()", +"69d2ce29": "countGames()", +"69d38ed2": "FINAL_AML_DATE()", +"69d3b252": "newVox()", +"69d3e20e": "mint(uint128)", +"69d4e250": "_safeSubtract(uint256,uint256)", +"69d4f28e": "officialSold()", +"69d516b3": "acceptExecutorOwnership()", +"69d565a9": "closeWithoutCounterparty(bytes32,uint256,address)", +"69d58d41": "minimumContributionPhase5()", +"69d5f38a": "setMembershipPrice(uint256)", +"69d62bf4": "revertTransfer(uint256,uint256,uint256,uint256,uint256,uint256)", +"69d6b880": "mintAmount1()", +"69d714c3": "getLargeInvestorApproval(address)", +"69d77740": "left92(uint256)", +"69d79ad5": "moneySumAtSettlement(address,uint256,uint256,int256,uint256,uint256)", +"69d87ab1": "setETHUSDPrice(uint256)", +"69d89575": "releaseFunds()", +"69da1b43": "NonceTick(uint256)", +"69da66ea": "referralPromille()", +"69dae8b0": "callAndReward_3(string,string,uint256)", +"69db054c": "userComment(uint256)", +"69dbe3e1": "StepFunction(uint256,uint256,uint256)", +"69dcafe9": "createGovernance()", +"69dceb6a": "getCoinAge(address,address,uint256)", +"69dd312f": "mintForContributorPool(uint256)", +"69dd3b2e": "transfer(address,bytes32,bytes32)", +"69dd4524": "crowdsaleTransfer(address,uint256)", +"69ddaad1": "resetQuote()", +"69dded0e": "validateSet(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"69de374d": "getProposalUint(uint256)", +"69de4e84": "NimCoin()", +"69ded293": "reserveBountyRecipient()", +"69df3671": "friendsWith(address)", +"69dfae6e": "productTokens(string)", +"69dfc66e": "TestableStandardSale(bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"69e01731": "setDesignatedReportDisputeDueTimestamp(uint256)", +"69e01e8d": "dividendsOwing()", +"69e0e346": "inWhiteList(address)", +"69e111ba": "needRelease()", +"69e15404": "feeAmount()", +"69e1b5ce": "NewStage()", +"69e22b20": "addRequest(address,string,string,address)", +"69e24b48": "getCrabStats(uint256)", +"69e255c9": "removeHorseOWN(uint256)", +"69e2c927": "canRecvEthDirect()", +"69e6bcdf": "smartUnBlockAddress(address)", +"69e6e6c9": "amountOfPopDeveloperShouldMine(uint256)", +"69e78499": "removeKey(address)", +"69e795be": "teamTokensCap()", +"69e7ae85": "ipfsAttributeLookup()", +"69e82500": "SoundbitToken()", +"69e8d80f": "ednation()", +"69e91994": "getReturnValue(uint256)", +"69e936f0": "isMultiply()", +"69e9ca8a": "calculatePayoutForAddress(address)", +"69e9f8a8": "activateCurrentRound()", +"69ea1771": "updateRate(uint256)", +"69ea80d5": "HEIGHT()", +"69eac83a": "_emitOracleAdded(bytes4,address)", +"69eadd76": "canAcceptTokens_()", +"69eb6d32": "Annihilated(address,uint256,uint256)", +"69ebb7e9": "getCurrentRound(uint128)", +"69ecc3cf": "invalidate(bytes32)", +"69ed1b83": "callSomeFunctionViaInner2()", +"69ed87b0": "FeesCalculated(uint256,uint256)", +"69ed8a42": "LRKToken(uint256,uint256)", +"69edd4fe": "callElection(uint256)", +"69efe2bf": "stageAdmin()", +"69efe471": "transferLimits(address)", +"69f08449": "m_sale()", +"69f0a549": "mintOther(address,uint256)", +"69f10ce1": "issueRIU(address,uint256)", +"69f1256f": "createTokensFromEther()", +"69f173dc": "waveCap4()", +"69f18967": "testSetBitFailIndexOOB()", +"69f18b8c": "ROB()", +"69f30401": "bid(address,uint256[],uint256[])", +"69f3331d": "nextOwner()", +"69f35883": "updateBloomFilter(bytes,address,bytes32[])", +"69f3c66e": "Movieum()", +"69f40ebc": "forwardInvestorTransaction(address,bytes)", +"69f467c1": "unicorns(uint256)", +"69f4aefc": "LATPTransaction(uint256,uint256,uint256)", +"69f66950": "holderBountyTokens()", +"69f6b766": "getSumInByLottery(uint32)", +"69f80b4a": "addAddress(address,address,uint256,address)", +"69f80c7a": "additionPrice()", +"69f8408a": "MigratableToken()", +"69f8ef0c": "flushETH()", +"69f94209": "NewDrawReadyToPlay(uint256,bytes32,uint256,uint256)", +"69f95967": "vminEtherPerPurchase()", +"69f99001": "hashDataBlock(string)", +"69f9ad2f": "char(bytes1)", +"69fa2cae": "createMintableSale(uint256,uint256,uint256)", +"69fbad65": "_depositOldTokens(address,uint256,address)", +"69fbae6c": "_sendToTeam(uint256)", +"69fbfcc4": "upgradeStructure(uint256)", +"69fc3481": "fundsRaisedFinalized()", +"69fc551a": "create(address,uint256,string)", +"69fcbf70": "setPreSaleAmounts()", +"69fd75b1": "GUPToken(address,uint256)", +"69fe0e2d": "setFee(uint256)", +"69ff2d11": "TOT()", +"69ff5277": "set_activity_details(uint256,string,address)", +"69ffa08a": "claimTokens(address,address)", +"69ffadc9": "TDz(uint256,string,uint8,string)", +"6a00da87": "sellBuyerTokens(uint256)", +"6a011ae5": "minRandomPrivilegeValue()", +"6a018302": "mul2Revert(uint256)", +"6a01b6e6": "createToken(uint256,uint256,uint256,uint256,uint8,uint256,address)", +"6a01f09c": "swapLimit()", +"6a02209c": "getMaxParticipants()", +"6a028692": "totalAvailableEdition(uint256)", +"6a0323b2": "MusiconomiToken()", +"6a0324b0": "_getBool(address,bytes32)", +"6a032a3b": "isTimelocked(address,address)", +"6a032a73": "generateTokensManually(uint256,address)", +"6a03eaf9": "finalizeTime()", +"6a048ddb": "createContractChar(string,uint256)", +"6a049b62": "_buyMulti(address,bytes32)", +"6a054250": "update(uint256,uint256,uint256)", +"6a0665a4": "calculateGoldSell(uint256)", +"6a06bf92": "enjinTeamAllocation()", +"6a07089f": "Contents()", +"6a08b403": "setFine(uint16)", +"6a092e79": "transferTokens(address,address)", +"6a0a1f8e": "claimGrant(uint256)", +"6a0ac115": "libpow2(address,uint256)", +"6a0b50e4": "pickFood(uint256,string,string,uint256)", +"6a0b96b7": "IkuraTransferFee(address,address,address,uint256)", +"6a0c3809": "likeArtist(address)", +"6a0c5068": "getParticipantesA()", +"6a0c5723": "getHasVoted(uint256,address)", +"6a0c8730": "getTransactionPrice()", +"6a0cd52e": "admin_commission_activated()", +"6a0d017c": "inviteReferee(address,address)", +"6a0d3450": "sentTokensToFounders()", +"6a0d783c": "Crowdsale(string,uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"6a0e605f": "MyToken(uint256,string,uint8,string,address)", +"6a0e7c24": "teamVesting(address[],uint256[])", +"6a0f7b7c": "getProductContractClients(address)", +"6a0fd45c": "getMeter(string)", +"6a100f37": "startAuctionFee()", +"6a10ad64": "tokenAllocToCrowdsale()", +"6a10c71c": "secondsLeft(address)", +"6a10d4d6": "createToken(address,uint256)", +"6a11138c": "doRandom(uint64)", +"6a12209c": "setRequestLimit(uint256)", +"6a12b86c": "continueGeneration()", +"6a1353c9": "setMintPayoutThreshold(uint256)", +"6a13af72": "giveRiskToken(address,uint256)", +"6a140b27": "_transferToContract(address,address,uint256,bytes)", +"6a142015": "assignGenesisCallerAddress(address)", +"6a146024": "WAD()", +"6a14d131": "creatorsCreatedCount()", +"6a15a080": "distribute_NRT(uint256)", +"6a16ae40": "wct2()", +"6a172536": "firstPreSaleDate1()", +"6a1729aa": "paymentAffiliate(address)", +"6a19b647": "addSuperPlayer(address,bytes32,uint8)", +"6a1af8b8": "setHeroData(uint256,uint16,uint16,uint32,uint32,uint32,uint64,uint64)", +"6a1b52e1": "expirationCheck()", +"6a1be7c6": "approveCollateral(address,uint256)", +"6a1bf209": "setCCH_edit_8(string)", +"6a1c3a4c": "getLastAPPeriod()", +"6a1c6fc0": "costs(string,uint256)", +"6a1cd82c": "crowdsaleRaised()", +"6a1cdefb": "incBlockCount(uint256,uint256,bytes32,uint256)", +"6a1cf721": "voteYes(uint256)", +"6a1d8713": "setMaxReferrals(uint256)", +"6a1db1bf": "changeFee(uint256)", +"6a1dbf03": "getTokenMinted()", +"6a1eb83f": "MeDao(address,address,address,address,address,uint256)", +"6a1ecbbf": "maxHopefulsNumber()", +"6a1f9e19": "breakIt()", +"6a206137": "cancelOrder(address,uint256)", +"6a2129d6": "delegateRecordExists()", +"6a21857f": "manualSend(address,bytes5)", +"6a221688": "TokenSaleQueue(address,address,address,address,uint256,uint256,uint256)", +"6a226077": "bidOnBreedingAuction(uint256,uint256)", +"6a226a49": "addMessage(string)", +"6a22b09a": "lastAssigned()", +"6a23b9df": "sumICOStage2()", +"6a23e308": "getIncubatorHashing(address,uint8,uint256)", +"6a23e7cf": "setFeeDistributionAndStatusThreshold(uint8,uint8[5],uint256)", +"6a24d595": "ModifyVigencia(uint256)", +"6a25000c": "token_per_wei()", +"6a254198": "ClaimTokensEvent(address,uint256,uint256,uint256,uint256)", +"6a256b29": "settle(address)", +"6a261353": "Lesson_5(address,uint256)", +"6a263f02": "_sqrt(uint256)", +"6a26b7fe": "setClaimableToken(address)", +"6a272462": "sell(address,uint256,uint256)", +"6a27c41d": "revealVote(address,bytes32,bytes32,address,uint256,uint256)", +"6a280317": "isAuctionManager(address)", +"6a2875c1": "incrementDIDFromContributions(address,uint256)", +"6a28db13": "getQrLength()", +"6a28f000": "unfreeze()", +"6a28f828": "issueIndex()", +"6a29150e": "totalFundsWithdrawn()", +"6a293d04": "setAlias(string)", +"6a294a80": "maxActivatedSalesTotalCount()", +"6a29605f": "BOHUpgradeableToken(address)", +"6a2a4c06": "get_released_by_manager()", +"6a2a6657": "validateToken(address,uint256,uint256,uint256)", +"6a2aac2b": "flowerBalances(address)", +"6a2ab790": "PRIVATE_STAGE_MAX_CAP()", +"6a2b171a": "applyDiscount(address,uint256)", +"6a2b5656": "changeTransactionFeeRecipient(address)", +"6a2b9e9d": "ERC20WithMetadata(string)", +"6a2c1ace": "getStateHash(bytes,uint256)", +"6a2d1cb8": "MIN_INVEST_ETHER()", +"6a2d5028": "getRaisedAmountOnToken(address)", +"6a2dda87": "SettingAutoGame_BettingRankRange(uint256,uint256,uint256)", +"6a2ddfce": "dragonsStatsContract()", +"6a2e882b": "getBlockLimit()", +"6a2f78a6": "submitStakeholderTransaction(address,bool)", +"6a2f9536": "calculateFraction(uint256,uint256,uint256)", +"6a30eb24": "hogsmashToken()", +"6a310bac": "bizp()", +"6a31c6df": "getAdjustedAccountValues()", +"6a327b7d": "getSupportManager()", +"6a333e51": "removeAvailablePack(uint256,bytes4)", +"6a33440a": "MANHATTANPROXY12THAVE()", +"6a3350c8": "invalidAirDrop(address)", +"6a33803b": "mintSaleTokens(uint256)", +"6a343df3": "allowPrice()", +"6a34480b": "MAX_INVESTORS()", +"6a357465": "payHours(address,uint256)", +"6a368486": "Ethraffle()", +"6a369137": "AfterSaleTransferableTime()", +"6a3845fe": "artTokenoken()", +"6a385043": "approveTokenTo(uint256,address)", +"6a385ae9": "getBalances(address,address[])", +"6a38c0fa": "DragonLock()", +"6a3a2119": "injectEther()", +"6a3b5aea": "setC4FContractProviderLock(address,bool)", +"6a3baaea": "newForge(bytes32,bytes32,address)", +"6a3bb8cc": "setFiscal(uint256,bytes32)", +"6a3c1198": "_projectCancelNew()", +"6a3c167b": "setInitialize(bool)", +"6a3c62a7": "beginReclaim()", +"6a3c7945": "RequestUpdated(uint256)", +"6a3d2a15": "AdvisorsAmount()", +"6a3d42ef": "ANT(address)", +"6a3d5a07": "AuctionCancelled(uint256,address,uint256)", +"6a3f3b97": "HolderBase(uint256)", +"6a3f5146": "auctionExpired()", +"6a3f79f4": "RaffleIssued(uint256,uint256,uint256)", +"6a3f89f4": "setProofImpl(address)", +"6a40515a": "enhancer()", +"6a40dbd6": "mintInvestor(address,uint256)", +"6a4113c7": "releaseLockFounders2()", +"6a41ade3": "walletCoreTeam()", +"6a420614": "setFreeCount(uint256)", +"6a420bbc": "setHaltPurchase(bool)", +"6a42b8f8": "delay()", +"6a4349a9": "getMicroModulesIds()", +"6a43aae7": "removeName(string)", +"6a43dc9a": "totalSupplyByLegacy()", +"6a4509f0": "paymentMax()", +"6a457ee9": "allocatedBonus()", +"6a470988": "getkEthPhiRate()", +"6a474002": "withdrawDividend()", +"6a47aa06": "halvingInterval()", +"6a48c04d": "GenExtWeightList(uint256,uint256,uint256)", +"6a4967d6": "addToWhitelist(address,uint256,uint8,uint8)", +"6a4987dc": "MARKETING_POOL_ADDR()", +"6a4a39e9": "presaleEndsAt()", +"6a4a6b6e": "_myAddressHelper()", +"6a4ad948": "setConvertionFee(uint256)", +"6a4aef9d": "fromReal(int256)", +"6a4b1b10": "setPresidenteDeMesaVerify(bytes32)", +"6a4b22da": "changeFallbackAccount(address)", +"6a4b27f4": "getRenter(address)", +"6a4b3eca": "checkBankBalance()", +"6a4b6aa5": "untrustedChildWithdraw()", +"6a4b8a3d": "BoxxToken()", +"6a4b96d5": "PledgePayed(uint256)", +"6a4c62ef": "getSecondUnionIds(bytes32)", +"6a4d4bb8": "getInvestorPosition(uint256)", +"6a4f5495": "test_0_ensureServiceRegistryFunctions()", +"6a4f8f39": "RNGenerator()", +"6a4fcddb": "Remyt()", +"6a502578": "totalSoldOnPresale()", +"6a50e3df": "PayWinners(address,address,address)", +"6a514db7": "REOToken()", +"6a51b918": "cities(uint256)", +"6a523c5e": "depositForUser(address)", +"6a5371b8": "nextTier()", +"6a537e40": "getCollectiblePrice(uint256,uint256)", +"6a5392d7": "generatedGze()", +"6a53ab64": "undestroyable()", +"6a53f98a": "pendingTxs(uint256)", +"6a54293a": "internalOwnerOf(uint256)", +"6a54932c": "processTransaction(address,uint256)", +"6a561c11": "ownerResumeGame()", +"6a561cb8": "testSender()", +"6a5690f6": "ICO_GOAL()", +"6a56947e": "transferVerify(address,address,address,uint256)", +"6a56a48b": "_getRandomMineralId()", +"6a570b98": "InGRedientToken()", +"6a585fa3": "tokensPerWei20()", +"6a596455": "getBatlordReq()", +"6a59d0a4": "transferAndLockForever(address,uint256)", +"6a59dc8c": "_unpackAgilityValue(uint256)", +"6a5a3625": "getTotalReqAmt(uint256[],uint256[])", +"6a5b0151": "setGasForKWH(uint256)", +"6a5b459c": "receivedWeiMin()", +"6a5bbc1d": "withdrawToOwner(uint256)", +"6a5c2cf2": "getTotalDividendsByAddress(address)", +"6a5c44a9": "STTadmin1()", +"6a5cf2d0": "WifiBonusCoin()", +"6a5d7206": "doSafeSendWData(address,bytes,uint256)", +"6a5da6e5": "followCampaign(uint256)", +"6a5e2650": "unlocked()", +"6a5e4628": "externalFundDAO()", +"6a5fd362": "shitFund()", +"6a61e5fc": "setTokenPrice(uint256)", +"6a625bc8": "issueToMany(address[],uint256[])", +"6a627842": "mint(address)", +"6a62936b": "PLUTUSTOKEN()", +"6a630559": "tokenLocked()", +"6a630ee7": "__transferWithReference(address,uint256,string,address)", +"6a63606c": "set_tokens_total(uint256)", +"6a63d2f9": "getLastestRequestFundID()", +"6a643ce6": "setBB(bytes32,bytes)", +"6a64790c": "toWholeShareUnit(uint256)", +"6a666c86": "addressToPunkIndex()", +"6a66a693": "beneficiaryContract()", +"6a67acc5": "getAuctionData()", +"6a67ec63": "minimum_buy_value()", +"6a68d2d5": "nextGamePotSplit()", +"6a69424b": "PaymentTimer()", +"6a6ae271": "assertPause()", +"6a6b8077": "StartICO()", +"6a6ba5d7": "addressIsCrowdsale(address,address)", +"6a6c526e": "AcceptsLYNIA(address)", +"6a6d31db": "externalEnter()", +"6a6e79bb": "WithdrawPaymentForTest(address,uint256)", +"6a6e88ba": "getBuyerInfoAt(uint256)", +"6a6f03a0": "returntrueifcurrentplayerwinsround()", +"6a704d7b": "AddedToGeneration(address,uint256)", +"6a7149f6": "changeAgency(address)", +"6a71a584": "getFreeAllowance()", +"6a71df43": "amountOfTokensPoolB()", +"6a7245ef": "changeBurnBoundsOperation()", +"6a7254a3": "specUWallet()", +"6a7283ac": "buyTokenFromGame(address,address,address)", +"6a7301b8": "setDestroyer(address)", +"6a7360d8": "updateNav(uint256)", +"6a7381bd": "TokensBought(address,uint256,uint256,uint256,uint256,uint256)", +"6a739a9b": "getTokensUnlockedPercentage()", +"6a739c44": "checkRegistrationStatus(address)", +"6a73de2c": "ZZZToken(uint256,string,uint8,string)", +"6a745ce9": "PRESALE_ETH_RAISE()", +"6a748ecf": "upLimit()", +"6a749986": "issuePreferedTokens(uint256,uint256)", +"6a749f6d": "indexshow2(address)", +"6a751710": "transferTraderBalance(address,address)", +"6a75f03d": "partnersAddress()", +"6a75fac0": "pullBack(address)", +"6a7625ca": "setRegionForSale(uint256,uint256,uint256)", +"6a76c522": "totalContractMiniGame()", +"6a7798ee": "EndAuction()", +"6a77e17a": "initialSeedFarmingAdress()", +"6a785191": "referralTokens(address,uint256)", +"6a7882f2": "requiredGoldIncreaseFactor()", +"6a7a88aa": "isValidSignature(address,address,bytes)", +"6a7b28a2": "show_the_minimum__reward_period()", +"6a7b988c": "votePopularity(bytes32)", +"6a7bf76a": "create_game(bytes32,uint32,uint32,uint8,uint16,uint8,address,uint256,bool)", +"6a7c09a0": "rewardPrivate()", +"6a7c0bae": "OWN_burnAddress(address,uint256)", +"6a7c0e81": "setBatchLimit(uint32)", +"6a7c4cdf": "H2G2()", +"6a7c594e": "CTVToken(uint256,string,uint8,string)", +"6a7d1a7e": "getPlayersUnitTickets(address)", +"6a7d3c1c": "FishbankChests(address)", +"6a7d6b52": "updateOldOwnerProfit(uint256)", +"6a7dabb9": "DEVCLASS_MAX_CARGO()", +"6a7eaf8f": "vestingRules()", +"6a7f0c69": "toTimestamp(uint256,uint256,uint256,uint256)", +"6a7f42e4": "closeBetByCanceling(uint256)", +"6a7fc8b7": "setDailyWithdrawLimit(uint128)", +"6a8141a1": "ParrotCoin()", +"6a816548": "cancelOrder()", +"6a81af17": "setConfigClass(uint32,uint8,uint8,uint8,uint32)", +"6a822760": "betB()", +"6a8269b4": "frozenList(address)", +"6a8296d7": "_setPrizePoolAddress(address)", +"6a833a6c": "addDelegateSigned(address,uint8,bytes32,bytes32,string,address,uint256)", +"6a83662e": "getYESVotesByEntity(uint256)", +"6a83b924": "btycownerof()", +"6a84e143": "destroyUnsoldTokens()", +"6a85ac88": "answerCompare(uint256,bytes32)", +"6a85d12e": "changeOuts(address)", +"6a85e252": "ElementTransferred(uint256,uint256,uint256,address,uint256,uint256,uint256)", +"6a868363": "CreatedVUP(address,uint256)", +"6a86a0f0": "DCCAdvancedToken(uint256,string,string)", +"6a871e27": "airDropHeight()", +"6a87f66d": "specialManagerOff(address)", +"6a8896b6": "getPots()", +"6a893a8c": "stopWorkInternal()", +"6a897999": "drainStack(bytes32,bytes32)", +"6a89a51e": "_delete_()", +"6a8aa343": "m_maxTotalSupply()", +"6a8ae136": "getContractBalance(address,address)", +"6a8b9f7b": "BecomeSpiderQueen()", +"6a8ba0fa": "createPromoPet(uint256,address,uint256,uint256,uint256,uint256)", +"6a8be019": "cancelEscrow(uint256,uint256,address,uint256)", +"6a8c2437": "totalRescues()", +"6a8c55b8": "_getSaleRound()", +"6a8c9cce": "BITMUZE()", +"6a8cdb52": "setBondAddress(address)", +"6a8d0bf4": "ReceiverChanged(uint256,address,address)", +"6a8d3575": "UniversalToken(uint256,uint256,uint256)", +"6a8d7eb3": "isLSNFT()", +"6a8d86db": "rawTransfer(address,address,uint256)", +"6a8e8711": "max_bet()", +"6a8ef2d3": "getMyShitClone()", +"6a8f91ff": "createAccount(bytes32,bytes32,address,address)", +"6a907a78": "UserAddTicket(bytes5[])", +"6a90ac63": "unlockWithdrawals(uint256)", +"6a91205a": "rentLand(uint256,bool,uint256)", +"6a91431e": "RefundableCrowdsale(uint256,uint256)", +"6a914911": "getPlayerByBoard(bytes32,uint8)", +"6a92a8b8": "UserAddressLoaded(bytes32,string)", +"6a92fcf6": "paymentEnable()", +"6a931aa8": "tokenVendor2()", +"6a93316c": "getInvestorStatus(address)", +"6a938567": "isValid(bytes32)", +"6a9412bd": "refundAvailable(address)", +"6a95dff4": "NOBSToken()", +"6a96c63e": "getCreateUnicornFullPrice()", +"6a98085a": "totalAmountToWhale()", +"6a9812f9": "getPolicyByTaxCode(string,uint256)", +"6a993130": "Ownables()", +"6a9b4daf": "Etros()", +"6a9b515d": "TokenAuctionCreated(uint256,address,uint256)", +"6a9ba3ce": "maxCapNotReached()", +"6a9c97d6": "refundSender(address,uint256)", +"6a9cd450": "upgradeKernel(address)", +"6a9d02e9": "tokenFrozenSinceNotice()", +"6a9d2afd": "playToWinTest(uint256)", +"6a9d69a7": "rentalTotalTime()", +"6a9d7629": "getOpenInterestInAttoEth()", +"6a9db57a": "playerAmountOfBets(address)", +"6a9dc9a8": "enrollUser(address)", +"6a9e8480": "FinalLottery(address)", +"6a9e8f27": "stockTransfer(address,uint256,uint256)", +"6a9ecd21": "BidFailedEvent(address,uint256,string)", +"6a9f9ff9": "isVisible(uint256)", +"6aa084d7": "getBoardStatus(uint256)", +"6aa0fd32": "performRebalance(bool,address,uint256,bool,uint256,uint256,address,bytes)", +"6aa179d9": "_secondRoundLosersFight()", +"6aa3141f": "removeCustody(address,uint256)", +"6aa31b1f": "starSell()", +"6aa3bf8b": "finishBetFrom(address)", +"6aa3e64d": "emptyTo(address)", +"6aa4b3cc": "calculateId(address,bytes32)", +"6aa52288": "FisrtSupply(address,uint256)", +"6aa5b37f": "maxBuyLimit()", +"6aa5cdfa": "setLatestEdition(uint8)", +"6aa633b6": "isEnabled()", +"6aa66cd4": "targetDiscountValue10()", +"6aa68a15": "phase2EndBlock()", +"6aa737e0": "enableSellToken()", +"6aa8e220": "WeaponRegistry()", +"6aa96d7c": "Storychain()", +"6aa9c59b": "_addMinions(uint32,uint8,uint64)", +"6aa9c82b": "withdrawControl()", +"6aaaae68": "tokensForFoundersAndTeam()", +"6aaab6f2": "updateTreasury(address,uint256)", +"6aaacb3f": "CreateCaptainToken(address,uint256,uint32,uint32,uint32,uint32,uint32,uint256)", +"6aab223d": "bonusMatchPayoutInPercent()", +"6aaba012": "ErrorGenerator()", +"6aabd369": "verifyGame(uint256,bool)", +"6aabe577": "getPuntos(uint256)", +"6aad1a6b": "adminSetGasLimit(uint256)", +"6aad70b6": "getAddTokenSignatures()", +"6aaee3f7": "biAdvance(uint32,uint64[2],uint64[2],int64[2],uint64)", +"6aaf0a0d": "endRegisterTime()", +"6aafb887": "getNewMaxProfit(uint256,uint256)", +"6aafd194": "Fosha(uint256,uint256,uint256,uint256,uint256)", +"6ab03a7f": "OGPToken()", +"6ab09a5e": "listUsersBets()", +"6ab15436": "price(bool)", +"6ab22536": "SMEToken(uint256,uint256,uint256,uint256)", +"6ab28bc8": "lockedAmount()", +"6ab368f8": "Burned(address,address,uint256)", +"6ab3846b": "updateEndTime(uint256)", +"6ab3c5bd": "KING_WIN_MULTIPLE_PER()", +"6ab4936d": "presaleFail()", +"6ab5bcd0": "withdrawedTokens()", +"6ab71276": "getOwners(address,uint256)", +"6ab76510": "bulkTransferFrom(uint32[],address,address[],uint256[])", +"6ab872f0": "setMaxBetThresholdPct(uint256)", +"6ab8bd2b": "POOH_TO_CALL_1PLUMBER()", +"6ab92ba7": "PEPL()", +"6ab9aa21": "MAX_REVENUE()", +"6ab9eb45": "getItemAllowancePrice(uint256,address,address)", +"6aba2a0d": "donatorBonus(uint256)", +"6aba899b": "refundStartTime()", +"6abac115": "getActiveState()", +"6abacfa4": "etherMasterWallet()", +"6abb4a50": "getPartner()", +"6abb51a5": "_completeTask(uint256,uint256)", +"6abc3fe4": "directMintAgent()", +"6abd3b88": "getWins(uint256,uint256,uint256)", +"6abf31eb": "confirmTransaction(address,uint256,uint256)", +"6abfbf6f": "allowTokenContract(address)", +"6ac084fe": "OrderFilled(address,uint256)", +"6ac0bf9c": "transferableSynthetix(address)", +"6ac0fe25": "BUYER_STEP_5_CANCEL(bytes32)", +"6ac26d3d": "executeAddMemberProposal(uint256)", +"6ac290e7": "getFirstReferrer()", +"6ac29bcc": "FBR()", +"6ac36029": "get_invester_length()", +"6ac3a100": "HLCN()", +"6ac47db5": "CloudbricSale(address,address)", +"6ac4d582": "registrants(uint256)", +"6ac4d97c": "createInitialCards(uint32,uint16,uint16)", +"6ac4e08b": "dynArrayFunc(int256[])", +"6ac4f8e4": "StocksAddress()", +"6ac50065": "getBidsByAdunit(uint256,uint256)", +"6ac50f2f": "sizeOfUserAddresses()", +"6ac54d62": "stopPreIcoAndBurn()", +"6ac54eb0": "posMint()", +"6ac59dd5": "setIcoParametersSet(bool)", +"6ac5db19": "max()", +"6ac6016f": "pepFarm(address,address,address,address,uint256)", +"6ac6205c": "addDataPoint(int256,uint256,bool,string)", +"6ac68f7f": "getBestBidder(uint256)", +"6ac777d3": "EEFucksToken()", +"6ac878f3": "multiTransferDecimals(address[],uint256[])", +"6ac96df8": "removeAddressesFromRole(address[],string)", +"6ac98840": "SGCC()", +"6acd58d4": "arrayIndexOf(address[],address,address)", +"6acd89f6": "Testerr()", +"6acd8e4a": "getAddedTime(uint256,uint256)", +"6acdf42b": "arrayOfNonTrivialAccounts(uint256)", +"6ace6dc8": "setApprovedBuyer(address,address,bool)", +"6ace7d87": "getLastCandidates()", +"6acf5cb3": "isUserKYCVerified(address)", +"6acfb852": "ZiggleToken()", +"6ad001a5": "metalworksCities(uint256)", +"6ad03feb": "GBTAddress()", +"6ad0d6ce": "_startNewRound(address)", +"6ad1246e": "content(string,uint256,uint256,address,uint256,uint256)", +"6ad1a6d5": "PauseTradable()", +"6ad1fe02": "sale()", +"6ad26611": "removeFee(address)", +"6ad2a0b3": "buildContract(address)", +"6ad34a7a": "BAILSToken(uint256)", +"6ad34dab": "getstartBlockNumber()", +"6ad35d1a": "CMO()", +"6ad38e61": "transmit(address,address,uint256)", +"6ad3f723": "getContentAddress()", +"6ad43a54": "setRateICO(uint256)", +"6ad44174": "getVolumebasedBonusRate(uint256)", +"6ad49245": "FundingManagerEntity()", +"6ad50ed4": "investmentEntryInfos()", +"6ad5b3ea": "walletAddress()", +"6ad60e3d": "BubbleToneToken(address)", +"6ad6d45b": "setLister(address)", +"6ad7541c": "Kokos()", +"6ad7aeb5": "BitsumCash()", +"6ad80326": "walletFounder3()", +"6ad95317": "batchInvests(address[],uint256[])", +"6ad95843": "icoUnitPrice()", +"6ada94e0": "setDataInt(string,string)", +"6adacb48": "priceStep4()", +"6adc674e": "WaltixToken()", +"6adcef6b": "payDividends(uint256)", +"6addb663": "tokenInfo()", +"6addc649": "weekBonuses(uint8)", +"6addf029": "setReferralRequirement(uint256)", +"6ade6cea": "currentstageplayer2()", +"6ade8aa2": "emptyWallet(address)", +"6ade9bd1": "tokensFortorch()", +"6adf3279": "leekStealOn_()", +"6ae00c4f": "ShareRoomDATA(address,string)", +"6ae0646a": "_computeRollFee(uint256)", +"6ae17283": "MinterAdded(address)", +"6ae1a976": "numAffirmationsSigned(bytes32)", +"6ae22740": "reward7()", +"6ae38577": "accPreICO()", +"6ae413ab": "updateWebappAddress(address,address)", +"6ae459bd": "bulkMint(address[],uint256[])", +"6ae4feed": "subtract(address,address,uint256)", +"6ae6151e": "acceptOffer(bytes32,address,uint256)", +"6ae6921f": "_addPayee(address,uint256)", +"6ae6b459": "setLockup(uint256)", +"6ae76777": "addressBounty()", +"6ae81ae1": "icoPhase3TimeBonusInPercentage()", +"6ae85216": "countAssets(uint256)", +"6ae85e0d": "isAddressNotVoted(address,address)", +"6ae8f49a": "WebCoin()", +"6ae8fefa": "NetareumToken()", +"6ae9eea8": "s39(bytes1)", +"6aea5f1b": "current_supply()", +"6aea6cce": "breakCompleteness(uint256,uint256,address)", +"6aeaef97": "inheritedView()", +"6aeb1ce7": "m_paymentChannels(uint256)", +"6aebbbd9": "subUIntValue(bytes32,uint256)", +"6aebc603": "Villj()", +"6aebff5d": "lccxTeamAddress()", +"6aec47b4": "getBalancesAgent(uint256)", +"6aec82b3": "setSalesPipe(address)", +"6aec95cc": "registerBalanceForReference(address)", +"6aedc282": "MarriageContract(address,address,uint256,string)", +"6aede5cd": "globalTimeVault()", +"6aedf1d1": "SupportAdded(address)", +"6aeeec7f": "_setStakingEpochDuration(uint256)", +"6aefef17": "test01CrowdsaleInit()", +"6af04a57": "newContractAddress()", +"6af1898a": "refundErc20(address,address)", +"6af1fdf7": "delegateTokens(address,uint96)", +"6af2da2f": "testKeyedHash()", +"6af41534": "withholdToken()", +"6af422fc": "RSPLT_H()", +"6af53f2f": "MaPToken2()", +"6af58d83": "getMin(uint256)", +"6af630d1": "DARKNODE_FEES_DENOMINATOR()", +"6af6b06f": "setNextLotteryTTMTokenId9(uint64)", +"6af6e64a": "VendorRegistry(address)", +"6af78ab1": "startWeekFour()", +"6af79112": "priceInWei(uint256)", +"6af7dbbe": "sendPriceRequestToOracle(bytes16,uint256)", +"6af81d6f": "_mintCategory(string)", +"6af91799": "totalTokenSaled()", +"6afa0381": "minInvestmentLimit()", +"6afa7b80": "toETH()", +"6afb434f": "getPreIcoInvestment(address)", +"6afb92a1": "MeepCoin()", +"6afbd04f": "Mintable()", +"6afc3474": "saleRoundsSet()", +"6afd767f": "addParticipant(address,bool)", +"6afe74c9": "test_oneValidEmptyAddress()", +"6afeada3": "finishBountyAt()", +"6afef23f": "submitPoliceReport(address,address,uint256,bytes,bool)", +"6aff1a64": "TIER2_PRICE()", +"6affdc39": "saleEndDate()", +"6affe07b": "CirclesTokenOffering(address,uint256,uint256,uint256,uint256,uint256,address)", +"6b0028b9": "initialSupplyInFrac()", +"6b007e4f": "logMarketFinalizedCalled()", +"6b015897": "minimumRewardWithdrawalLimit()", +"6b01acf5": "counterToTokens(uint256)", +"6b0235a0": "tla()", +"6b038742": "Archetypal()", +"6b03ed5f": "clearClaim()", +"6b041da2": "SEVENTNET()", +"6b04f110": "mint_for(address,uint256)", +"6b061d7a": "changeRestarTime(uint32)", +"6b06548c": "EarlyInvestorsTokensHolder(address,address,address)", +"6b068e01": "collectWorks(bytes32,bytes32)", +"6b069710": "scheduleCall(address,bytes,uint256,uint256,uint8)", +"6b06afe7": "getEcoSystemWallet()", +"6b06c3d4": "ActivateEscrow(uint256,uint256,uint256,uint256,address)", +"6b06ea88": "ElementToken(uint256,string,string)", +"6b06f908": "buyToken(string,address,uint256)", +"6b074a07": "isProvider(address)", +"6b08a833": "EDUTURN()", +"6b08f2ef": "convertForPrioritized2(address[],uint256,uint256,address,uint256,uint8,bytes32,bytes32)", +"6b091695": "getReward(address,address)", +"6b095ca1": "apply(uint256,uint256,bytes32,bytes)", +"6b097cd0": "KKOGToken()", +"6b0bfc80": "feedAndMultiply(uint256,uint256,string)", +"6b0c537b": "generateRequestId()", +"6b0c932d": "lastDay()", +"6b0c9d6a": "distributeA()", +"6b0cba9c": "getUniqHash()", +"6b0cc513": "_DifficultyCalulate(uint16,uint16)", +"6b0d0329": "getTicketInfo(uint256,uint256)", +"6b0dd90f": "getVote(address,uint256)", +"6b0dfb76": "getLandDefender(uint8,uint32)", +"6b0ead6a": "iudexIdToString(bytes32)", +"6b0f02e6": "firstExchangeRate()", +"6b0f182e": "changeCofounderA(address)", +"6b0f65d7": "indSeedDeposit()", +"6b1092f2": "ADV_BTY_SUPPLY()", +"6b11c87a": "RealEstateCryptoFundBounty(address)", +"6b11dabd": "MTYToken()", +"6b128b2f": "upgradeFinance(address)", +"6b12a7bf": "buyRealm(uint256,uint256,uint256)", +"6b13fabf": "SampleToken()", +"6b140854": "totalWinValue()", +"6b1426a4": "getWinners(uint256)", +"6b149aac": "Cryptassist()", +"6b14dfe1": "SPEED_STAT_MAX()", +"6b14ea36": "ASK_STAKE_RATIO()", +"6b153322": "activateCampaign(string,uint256)", +"6b15c47c": "tokenCalculate(uint256,uint256)", +"6b1781b6": "Emergency()", +"6b17864f": "CommunityPool(address,address)", +"6b1786bb": "cVideoCost()", +"6b178b90": "NBACoin()", +"6b178f47": "poolIssue()", +"6b190ee1": "MemeNetworkToken(address,uint256)", +"6b194a4a": "ALLOCATION_LOCK_END_TIMESTAMP()", +"6b1970ab": "TheCoin()", +"6b199471": "updateMasks(uint256,uint256,uint256)", +"6b19e692": "getPaymentSupply()", +"6b1ac900": "setPXLPropertyContract(address)", +"6b1af75e": "sendReward(address,address,uint256)", +"6b1b3997": "ChronoDragonPowerCoin()", +"6b1b68ad": "URMBToken(uint256,string,string,address)", +"6b1bfd33": "setFundAccount(address)", +"6b1c86fe": "sendBreakup(address)", +"6b1cb549": "orderMatch(uint256,uint256,uint256,int256,uint256,uint256,address,uint8,bytes32,bytes32,int256)", +"6b1d4db7": "ethToTokenSwapOutput(uint256,uint256)", +"6b1da364": "getWinnerInfo(uint256)", +"6b1e0420": "blockPendingTx(uint256)", +"6b1e564a": "challengeWinningOutcome(bytes32,uint16)", +"6b1f513b": "makeDailyInvest(uint256)", +"6b1f78c8": "joinSqr(uint256)", +"6b1fbfdb": "sendWithSignature(address,uint256,uint256,bytes,uint256,bytes)", +"6b1feeeb": "get_my_sig()", +"6b212960": "offer(address,uint256)", +"6b2148c2": "Deluxo()", +"6b21a636": "startDisbursement()", +"6b227a8f": "OrderApprovedPartTwo(bytes32,bytes,address,bytes,address,uint256,uint256,uint256,uint256,uint256,bool)", +"6b2327d2": "previewStageEndTime()", +"6b2351aa": "lockWithAfter(address,uint256,uint256)", +"6b235bdc": "ChangeBeneficiary(address)", +"6b236730": "solveChallenge(bytes32)", +"6b24d827": "WalletHolder()", +"6b252b47": "advisorsWallet()", +"6b256f57": "DAOSecurity(address,address,bytes,uint256,uint256,uint128)", +"6b259690": "feesPool()", +"6b263efa": "multiOwnableCreator()", +"6b270056": "Corporation()", +"6b27909d": "getStopLockTime()", +"6b27be9f": "mayorcoin()", +"6b281b64": "totalBalanceUp()", +"6b28d7a2": "blockTransfer()", +"6b28f834": "getPeggedTokenCount(address,address)", +"6b298df0": "disbursements(address)", +"6b2a2691": "winBrickReturn()", +"6b2a77ed": "End5()", +"6b2a86be": "dropToken(address[])", +"6b2accac": "toDRP(uint256)", +"6b2ae2ab": "Notify_String(string,string)", +"6b2bb92a": "finishTournament()", +"6b2c0f55": "removePauser(address)", +"6b2c116c": "AmateurPlatinumToken()", +"6b2cd752": "getGpgKey()", +"6b2ce4ce": "stakeForDuration(address,uint256,uint256,bytes)", +"6b2ce7f1": "togglePresale(bool)", +"6b2d95d4": "getLockedTokens(address)", +"6b2e36b0": "canUpdateAmountToTakeAsRake()", +"6b2ec90f": "_vestedDown(uint256,uint256,uint256,uint256)", +"6b2ed1c0": "sellFci(address,uint256)", +"6b2f4632": "totalEthereumBalance()", +"6b2f65b0": "isArtist(address)", +"6b2f68f5": "assertEq22(bytes22,bytes22)", +"6b2f73c2": "preICOLedger()", +"6b2fa6cc": "lastBlock_v7Hash_uint256()", +"6b2fafa9": "getHash(uint256)", +"6b2fd0e7": "catGenes(uint256)", +"6b3032c6": "getSingleGuessInfo(uint256)", +"6b308ee7": "subTourFreezingPrice()", +"6b30f243": "VCChainToken()", +"6b318270": "addFile(bytes32)", +"6b319f36": "tokenUnfreezeTime()", +"6b31ee01": "jackpot()", +"6b32bb25": "containsValue(address,uint256,string,uint8[])", +"6b32c591": "userClaimAmt()", +"6b334e49": "senderCheck(address,address)", +"6b335b8c": "buyXname(uint256,string)", +"6b33aeb8": "YSH()", +"6b33e45d": "setWithdrawTo(address)", +"6b3416b5": "transfer(uint256,uint256,uint256,uint256,uint256,uint256)", +"6b342eb8": "_minimumBuy()", +"6b3559e1": "mintAndSetData(address,uint256)", +"6b3578f2": "paymentEnabled()", +"6b35bed2": "addAirdropParticipants(address[])", +"6b35f7c1": "deleted()", +"6b36028e": "setReferenceType(bytes32,string)", +"6b361c80": "TokenPriceUpdated(uint256)", +"6b36a76e": "MIPCoin()", +"6b3868db": "getMemberByIdx(uint256)", +"6b3905c4": "getNextVestingTime(address)", +"6b392680": "setFeeAmount(uint256)", +"6b3a87d2": "WatchWinningPot()", +"6b3a8e90": "tournamentJackpot()", +"6b3ac430": "crowdsaleLive()", +"6b3ad4f8": "setColorWhite()", +"6b3b1d17": "tHasBeenPenalized(uint256,address)", +"6b3b261c": "addSpaceshipMoney(uint256)", +"6b3bc4b6": "ovcPerEther()", +"6b3c9757": "advisorSecondLockTime()", +"6b3ce49b": "getRoomBalance(uint256,uint256)", +"6b3cedd6": "mintTokensForCrowdsaleParticipants(address[],uint256[])", +"6b3d998c": "Apputoken()", +"6b3e2f97": "updateDiamond(string,string,string,string,string,uint256,uint256,string)", +"6b3e8ca0": "setPrePresaleTokens(uint256)", +"6b3ec0ac": "vestingExists(address)", +"6b3f5f84": "OwnerReclaim(address,uint256)", +"6b3f94ab": "GoldMintToken()", +"6b3fb674": "noHash()", +"6b3fdc5a": "oraclize_setNetwork(uint8)", +"6b3fdf16": "EXT_COMPANY_THREE()", +"6b3ffb91": "changevanity(string,address)", +"6b404955": "depositDelta()", +"6b407837": "sellerRequestCancel(bytes16,address,address,uint256,uint16)", +"6b4097b2": "_runAdvanceClock(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"6b40bba1": "requiredPeriodSeconds()", +"6b424d47": "h2g2()", +"6b425093": "sortTopPosts()", +"6b433ccf": "_totalLandholderTax(uint256)", +"6b440e9a": "finalAllocation()", +"6b441abc": "VIRTUALTALK()", +"6b453fac": "hardWeiCap()", +"6b454d4c": "next_item_index()", +"6b45adf3": "cellsOf(address)", +"6b45c9f2": "getPiece(uint256)", +"6b462936": "transferQueue(address[],uint256[])", +"6b4660f8": "getStockLength()", +"6b46c8c3": "payoutAmount()", +"6b475df7": "release6m()", +"6b486818": "hashFirst()", +"6b489028": "DEVCLASS()", +"6b4a6ded": "TOKENS_PER_ETHER()", +"6b4a8b78": "token_allowance(address,address)", +"6b4b1f3a": "stringToAddress(string,address)", +"6b4b63fa": "Bank_With_Interest()", +"6b4bfeae": "checkClaimExpiry()", +"6b4c0789": "freezeContract(bool)", +"6b4c5856": "WyeContract()", +"6b4ca2a8": "getMatchData()", +"6b4dd158": "getPrice(bytes)", +"6b4dff1f": "validateGasPrice(uint256)", +"6b4e243d": "callOperator(address,address,address,uint256,bytes,bytes,bool)", +"6b4e8bb0": "lastInflationUpdate()", +"6b4ed21b": "holdersCount()", +"6b4f518a": "preICOTokenReward()", +"6b4f6865": "unlockForWork(address,address,uint256)", +"6b50b6b3": "_multiSigWallet()", +"6b512327": "_deleteIPFSHash(bytes32)", +"6b516ef0": "_handleDeposit(address)", +"6b523b68": "periodCrowdsale()", +"6b52a071": "SALE_FUNDS_ADDR()", +"6b52a86f": "DesTokenSale(address,address)", +"6b5396dc": "batchPresaleVesting(address[],uint256[],uint256[],uint256[],uint256[],uint256[])", +"6b5424b3": "HACHIKO()", +"6b54821f": "setupAuthentication(address,bool)", +"6b550dd3": "setAgriChainDocuments(address)", +"6b55264d": "setRegionName(uint16,string)", +"6b55ddd0": "getJobEmployerName(uint256)", +"6b55e991": "transferEther(address)", +"6b56476b": "removePost(address,address)", +"6b5648f5": "enabledMint()", +"6b565345": "CANAToken()", +"6b57825c": "getCurrentUserTotalPromoBonus()", +"6b57cb34": "lockedStagesNum(address)", +"6b584b10": "testFreeSpace()", +"6b588775": "rateOfSpecificTier(uint256)", +"6b58b2bc": "calculateInternalTokensAmount(uint256,uint256,uint256)", +"6b590248": "getDigit()", +"6b59084d": "test1()", +"6b59f495": "tokenized()", +"6b5a61ac": "changeTeamNIMFAAddress(address)", +"6b5ae41c": "execute0(address,uint256,bytes)", +"6b5aed93": "executeTransfer(string,string,uint256,uint256)", +"6b5b6285": "PBKtoken()", +"6b5bbf5f": "setCommunityMultisig(address)", +"6b5c4b16": "dateRelease12()", +"6b5c5f39": "croupier()", +"6b5c8fba": "confirmParties()", +"6b5ca27d": "finalizeCampaign(uint256)", +"6b5caec4": "setBot(address)", +"6b5cd8d0": "getWeaponDamageFromTokenId(uint256,uint256)", +"6b5d18fd": "getProposedIpfs(bytes32)", +"6b5d3287": "sellTokensForUsd(string,address,uint256,uint256)", +"6b5de05a": "tokensForTournament()", +"6b5e1a18": "payoutThreshold()", +"6b5e3ca4": "StaffWallet()", +"6b5e7b06": "getPenndingBalances()", +"6b60386d": "init(uint256,uint256,address,address,address,uint256,uint256,address,uint256,bool)", +"6b6093c2": "FreezeBalances(address)", +"6b61c3c7": "acceptBet(bytes32,bytes32,bytes32,bool)", +"6b628816": "getYumerium(address)", +"6b6292d9": "securityTokensPercent()", +"6b62cb1b": "createName(bytes32,address)", +"6b62cd65": "bankerAllDeposit()", +"6b634440": "tokensForPartners()", +"6b63d145": "OWNER_TOKENS_PERCENT()", +"6b6438cc": "payoutCursor_Id_()", +"6b64c769": "startAuction()", +"6b655e45": "getJuryMembers(uint256)", +"6b6566f0": "DiceOffline()", +"6b65a834": "ratePlanIsExist(uint256,uint256)", +"6b65be60": "usedPositions()", +"6b668601": "preSaleConversionRate()", +"6b676966": "tokenNeedForBonusLevel1()", +"6b683896": "getImplementation(string)", +"6b6872c7": "OeTestCoin()", +"6b68db6a": "FipsData(bytes20,address,bytes)", +"6b68dd4b": "tokensOfOwnerWithinRange(address,uint256,uint256)", +"6b693027": "collateralizations(address,uint256)", +"6b698377": "DogecoinPrivate()", +"6b69ac58": "upgradeHealth(uint256,uint256)", +"6b6a08dc": "hashRevealedPositions(uint32,int64[])", +"6b6a53fa": "testThrowsRestartNotOwner()", +"6b6b2740": "RetailLoyaltySystemBase(uint256,string,string,uint8)", +"6b6c5a7e": "getBracketData()", +"6b6cc239": "isMaintenanceMode()", +"6b6d294e": "worldCupResultPart3()", +"6b6d5c82": "encryptedBallots(uint256)", +"6b6e71b9": "makeTransaction(address,uint256,uint256)", +"6b6ece26": "ban(uint256)", +"6b6ee875": "tokenSealer(uint256)", +"6b6ef0ed": "transfer0(address,uint256)", +"6b6f4826": "minInvestmentICO()", +"6b6f4a9d": "discount()", +"6b7006d7": "lockMana(address,uint256)", +"6b709a36": "lockWorker(address,address)", +"6b7128ec": "getBetCount(uint256)", +"6b71d93b": "VerifiedProxy(uint256)", +"6b722a32": "christmasTree()", +"6b727312": "easyCommit(uint256,uint256,uint256)", +"6b7285d7": "transferP2P(uint256,address)", +"6b74401a": "BuyTokensDirect(address,uint72,uint88,uint88)", +"6b74c3d8": "getTxn(address,uint256,uint256)", +"6b755aa2": "reCommentRewardPool()", +"6b764632": "KongToken()", +"6b76484e": "swap(address,address)", +"6b76bd94": "CreateUser(string)", +"6b78aa08": "MarketHub(uint256)", +"6b790be4": "getWeightMinusFees()", +"6b792c4b": "emergencyWithdrawETH(uint256)", +"6b7976c8": "calculateObtainedINA(uint256)", +"6b7a247e": "setlvlSign(string)", +"6b7ae8dc": "foundationWallet()", +"6b7ae8e6": "left74(uint256)", +"6b7b0472": "getLastHash(bytes10)", +"6b7c0379": "HOPPToken()", +"6b7cc44f": "detail()", +"6b7d5205": "Diamond()", +"6b7d5dfd": "setTangibleAssetDisbursementAddress(address)", +"6b7d90ff": "unVerifyKyc(address)", +"6b7d9a5c": "createPromoPuppy(uint256,address,uint16,uint16,uint16,uint16)", +"6b7db8fc": "sendDividend(address,uint256)", +"6b7e4175": "EphronIndiaCoinICO(address,address,address)", +"6b7eba7d": "instantTransfer()", +"6b7f3a32": "Jojo(uint256,string,uint8,string)", +"6b7fad1b": "ethToDividendsNeeds()", +"6b7ffb92": "revote()", +"6b802108": "checkValidSignatureAndMethod(address,bytes)", +"6b8184e2": "ImpeachmentAccepted(address)", +"6b8263ed": "resumeOffering()", +"6b8287a6": "getetherpriceinUSD(address,uint256)", +"6b8393dd": "getSold(address,uint256)", +"6b845d7e": "updateWithdrawalMode(uint32[])", +"6b847dc0": "setDayWithdraw(uint256)", +"6b8487be": "GigToken(bool)", +"6b84dfcd": "setTransferRight(address[],address[])", +"6b863578": "noVoteSum()", +"6b872309": "x(address,uint256,address,uint256,bytes32,bytes32)", +"6b87d9f7": "BUBBLEToken()", +"6b881724": "assetWallet()", +"6b886888": "isTemporary(bytes8)", +"6b88719a": "PHOENIX_CORSAIR_FTL_SPEED()", +"6b889cce": "call_test()", +"6b88f4ae": "resetIndex(uint256)", +"6b89be03": "getActiveShareholdersArrayLength()", +"6b89bfc7": "getStatusOf(address)", +"6b8ab97d": "reset(address)", +"6b8b3268": "mintCrown(uint256)", +"6b8c261e": "prizeByNow()", +"6b8c4c48": "setDaxInBtcSatoshi(uint256)", +"6b8c7180": "setupPeriodForPreSale(uint256,uint256)", +"6b8cc89d": "INVESTMENT_USER2()", +"6b8ce30e": "partnerInfo_for_Owner(address,bytes32,uint8,bytes32,bytes32)", +"6b8da9a2": "tgrLive()", +"6b8f155a": "numberWhitelisted()", +"6b8f9c43": "setPayoutWallet(address)", +"6b8fd600": "priceOfElements(uint256[])", +"6b8fe0f0": "NewPlayer(address,uint256)", +"6b8ff574": "getName(uint256)", +"6b90ce93": "simulated_snt()", +"6b915d43": "melonToken()", +"6b9168e6": "clearAngelsFromBoard(uint16)", +"6b919488": "removeOwner(uint256)", +"6b930927": "preTgeTokenSupply()", +"6b931cad": "replaceAdministrator(address,address)", +"6b944bd6": "GoBlock()", +"6b946680": "parentKidsLink(uint256,string,string)", +"6b94692a": "isPresaleBuyer(address)", +"6b95767d": "giftSpaceship(uint16,address)", +"6b962c27": "transaction_internal(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[4])", +"6b963f20": "changeOVISReservedToken(uint256,int256)", +"6b96668f": "setRateContract(address)", +"6b97be1f": "transferPayable(uint256)", +"6b97c6d7": "_transferOwnershipOfItemsStorage(address)", +"6b97e5eb": "UnicronToken()", +"6b9808a1": "buyWine()", +"6b98419a": "_approveFor(address,uint256)", +"6b9896ba": "AddAccountsInfo(address,uint256)", +"6b98c85c": "bltMasterToSale()", +"6b98d78c": "setLandSlogan(uint256,string)", +"6b99a13e": "editNumber(uint256)", +"6b9a1db9": "wanUnit()", +"6b9b1006": "TransactionRecorder()", +"6b9b2679": "setReserveForFoundersFirst(address)", +"6b9c1d22": "managementFeeWallet()", +"6b9c6116": "PULSCrowdsale()", +"6b9c9b9c": "TerraByte()", +"6b9cadc1": "isValidMsgValue(uint256)", +"6b9cf534": "_minimumBuyAmount()", +"6b9da657": "sendNewEntry(string)", +"6b9db4e6": "getLock(address)", +"6b9f96ea": "flush()", +"6ba0b4f2": "isKnownSelector(bytes4)", +"6ba0b8bc": "getBonusPercent(uint256,uint256)", +"6ba0f114": "EtherChain()", +"6ba15807": "evntCreateContract(address,address,address,address,uint256,string)", +"6ba20015": "maxplayers()", +"6ba2482d": "GetUserNickName(address)", +"6ba2aefc": "transferMultisig(address,address,uint256)", +"6ba42aaa": "isKeeper(address)", +"6ba44d3c": "get_address(string)", +"6ba47299": "buyDiscountTTWByETH(uint256,address)", +"6ba4c290": "modifyEscrowPrice(uint256,uint256,uint256)", +"6ba4f143": "_setAuraValue23(uint256)", +"6ba4fadb": "changePhaseToPreICO2()", +"6ba55c6d": "coinIssuedFoundation()", +"6ba5ef0d": "setMin(uint96)", +"6ba6984c": "setHBT(uint256)", +"6ba6e2e0": "TGCToken(address)", +"6ba75608": "claimAssetPack(uint256)", +"6ba7d28a": "checkVestingWithFrozen(address)", +"6ba7e31c": "PriceSet(string,uint64,uint8)", +"6ba7ffd5": "requestCnt()", +"6ba8d421": "transferHackoinTokenOwnership(address)", +"6ba951c4": "EtherModifierTigro()", +"6ba9a40b": "withDrawBalance(uint256)", +"6ba9fd38": "openMinting()", +"6baa0f8e": "createSystemAuction(uint256)", +"6baa2ff7": "preSale(address,uint256)", +"6baae8e5": "_prand(uint256)", +"6bacc0fa": "hasSaleEnded()", +"6bacdc87": "InterestFreeLending(address,address,uint256,uint256)", +"6bacfe43": "getCCH_edit_16()", +"6bad77e1": "getNumProducts()", +"6bad8ed8": "freezingPercentage()", +"6bae05cf": "preRegister(address)", +"6bae116f": "getBonusMultipierInPercents(uint256)", +"6bb0ae10": "print(uint256)", +"6bb15940": "getCurrentSaleRate()", +"6bb1605b": "filehash()", +"6bb164c9": "isCantonEmployee(address)", +"6bb20f9b": "searchWhitelist(address,address)", +"6bb27584": "capRound1()", +"6bb2c12f": "createRequest(address[4],address,uint256[12],uint256,bytes)", +"6bb3130e": "disbursementWei()", +"6bb35840": "PowerGiggs()", +"6bb3c065": "round4Sold()", +"6bb4cf76": "createToken(string,string,uint8,address[],uint256[],uint256[])", +"6bb4d573": "evMinTokensReached(address,uint256,uint256)", +"6bb50f4c": "_openGamePlayNo(uint256)", +"6bb53c90": "ticket(uint256,uint256,uint256,uint256,uint256)", +"6bb56e8b": "crowdsaleEth()", +"6bb60475": "_insertSortMemory(uint32[11])", +"6bb6126e": "exec(address)", +"6bb6ea30": "createInterceptor()", +"6bb72c97": "numTokensInLottery()", +"6bb7b7a4": "rare()", +"6bb7f336": "updateUnsoldTokens()", +"6bb7f98e": "getHighestMilesOwnerAt(uint256)", +"6bb80acc": "_createCovfefe(string,string,uint16,address,uint256)", +"6bb80d51": "dividendPercentage()", +"6bb82e82": "addToWhitelist(address,uint256,bool)", +"6bb9b9ab": "getTodayDividendsByAddress(address)", +"6bba3f2f": "kappa()", +"6bba5c15": "changeParameters(uint256,uint8,uint256,uint256,uint256)", +"6bbadf09": "addPokemonDetails(string,uint256,uint256)", +"6bbae823": "LIMIT_STAR4()", +"6bbbc182": "addVerified(address[])", +"6bbbec85": "updateGameMeta(uint256,string,string)", +"6bbc5748": "FeeChanged(uint256)", +"6bbe0410": "NewTransaction(string,uint64,string,uint64,uint8)", +"6bbe24d4": "dataSourceGetQuarterResult(uint256)", +"6bbe6f7f": "buyCoinsPreview(uint256)", +"6bbea781": "getApproveValueFor(address)", +"6bbeb9de": "loginUser(address)", +"6bbeba8a": "setService(bytes,address)", +"6bbf54a4": "PCF()", +"6bbf592d": "bytesCallWithArray(bytes32[4])", +"6bc02730": "approveBreeding(address,uint256)", +"6bc0b3ba": "jackpotAddress()", +"6bc0f7fb": "isProxyLegit(address,address)", +"6bc138f6": "getNumberOfIds()", +"6bc1f1e4": "updatePriceAndInventories(uint256,uint256,uint256,uint256,uint256,uint16)", +"6bc21808": "CategoryAuction(address)", +"6bc2805d": "cancelAllEnter()", +"6bc31311": "EFFCoin(address)", +"6bc32c7b": "get_train_data_length()", +"6bc344bc": "payforflag(string)", +"6bc388b2": "canFreeze(address)", +"6bc3b437": "newService(string,string)", +"6bc3e0f0": "verifySecondHalf(uint256[4],uint256[4],uint256[4])", +"6bc3e4a8": "claimMultiple(address,uint256)", +"6bc46fb2": "totalHatcheryShrimp()", +"6bc5063c": "VestedTokensReleased(address,uint256)", +"6bc507b1": "getBlackflag(uint256,address)", +"6bc59f13": "transferFromChangeAllowanceTest(address)", +"6bc5b964": "getMemberWhisper(address)", +"6bc5c0cd": "releaseBonus()", +"6bc6147e": "unlockMainSaleToken()", +"6bc64e0f": "preSaleEnd()", +"6bc65778": "getAllProductList()", +"6bc789cd": "getONG_AUDIT(bytes32)", +"6bc85107": "isMemberInDescendant(address,bytes32)", +"6bc8a260": "getUserWinInTournament(uint256)", +"6bc99824": "VoltToken()", +"6bc9b0d7": "getPromiseIds(uint256,uint256,address,bool)", +"6bca81d4": "revealBid(bytes32,address,uint256,address,address,bytes32,uint256,uint256)", +"6bcaaed9": "PetmancoinToken()", +"6bcab76c": "setDApp(address)", +"6bcc035a": "getStatusAndOutcome()", +"6bcc28a9": "kittensRemainingToDrop()", +"6bcc311c": "tokensForBonus()", +"6bcc7241": "getPriceWei(uint256)", +"6bce23be": "setupTokenRate(uint256)", +"6bce6569": "reservedPercentTotal()", +"6bce8a96": "whitelistedAddressCount()", +"6bceead7": "setSquareWins(uint256,uint256,uint256)", +"6bd0021c": "bonusPhase()", +"6bd31a56": "hardCapLowUsd()", +"6bd37274": "Pixiu_Beta()", +"6bd3a1c3": "PresiamDrop()", +"6bd3d406": "totalPresale()", +"6bd46bd2": "setTokenBurnFeeReceiver(address,address,address,address)", +"6bd484c4": "oracleCallbackGasLimit()", +"6bd4dfce": "setStarterClass(uint256,uint32)", +"6bd5084a": "number_of_claims()", +"6bd50cef": "getConfiguration()", +"6bd58db5": "Total_Patient(uint256)", +"6bd5e26a": "lockTo(address,string)", +"6bd61a66": "nonHighestBidderRefund()", +"6bd6775f": "Presale(address,address,address,address,uint256,uint256)", +"6bd68a8f": "referralAmount()", +"6bd70a1f": "MIN_IVESTMENT()", +"6bd7e7dd": "CatBought(uint256,uint256,address,address)", +"6bd7eeeb": "maximumTokensForFirst()", +"6bd87c86": "Try2222()", +"6bd8fd12": "currentMinBid()", +"6bd92f7c": "activateAllowanceRecord(address,address)", +"6bd9b4da": "setMinETHin(uint256)", +"6bda3422": "Token(uint256,string,string)", +"6bdaa520": "forciblyRequest_callback()", +"6bdbc918": "BaseTransactionService(address,address)", +"6bdbf8e6": "concat()", +"6bdc06f5": "cancelRegistration(address)", +"6bdc1d2a": "GoldRex()", +"6bdc62b9": "composeJingle(string,uint256[5])", +"6bdc9546": "setCommunicationUri(bytes32)", +"6bdcdb2d": "getAutomatedReportDueTimestamp()", +"6bdcdeaa": "setMagicStore(address,address)", +"6bdd44aa": "createCard(string,uint256)", +"6bde2e7f": "_setBodyColorValue3(uint256)", +"6bdea7eb": "AddBonus(uint256)", +"6bdebcc9": "destory()", +"6bdee200": "enableTicker()", +"6bdee235": "Zeroexchange()", +"6bdfd723": "getNewEnglandBets(address)", +"6be00229": "exitAddress()", +"6be03bd2": "configTimeInc()", +"6be050d2": "FibokenUsed(uint8,address,uint256)", +"6be0c670": "chipSize()", +"6be13c92": "coldWallet()", +"6be202cf": "addSomeDETsTo(address,uint256)", +"6be24a47": "create(address,address,address,address,address,address,address,string,string,string)", +"6be2f28e": "totalAmountOfWeiCollected()", +"6be32e73": "tokenCallback(address,uint256,bytes)", +"6be343cc": "setFoundAcc(address)", +"6be39bda": "getTerms(bytes32)", +"6be4097c": "currentLotteryId()", +"6be422b2": "determinReferrer(address)", +"6be47418": "latchFciUserController(uint256,address)", +"6be47618": "deleteContract(uint8[],bytes32[],bytes32[])", +"6be4cf1f": "buyTokensFor(address)", +"6be4d9b0": "changeResolverAllowances(address[],uint256[])", +"6be505f5": "selectWinner(bytes32)", +"6be598b4": "SIGTToken()", +"6be5f4a6": "checkVictoryByScore(uint256)", +"6be60f8b": "underwrite(uint256)", +"6be67db3": "contractNameUpdate(string,bool)", +"6be6fa14": "getTransferFromValueValue()", +"6be7eeba": "Vtoken(uint256,string,uint8,string)", +"6be80de7": "investorIDs(address)", +"6be82168": "NeycoinToken()", +"6be86f21": "bonussale_TokesSold()", +"6be9564a": "ListingBought(bytes5,uint256,uint256,address)", +"6be99794": "getTransferToValue()", +"6be9a8df": "GetGuestQueueNumber()", +"6be9f7a0": "emitDeposited(address,uint256,address)", +"6bea0b79": "getAccountData(address,string)", +"6bea8215": "createGenerator(uint256,string,uint256,uint256,uint256)", +"6bea989d": "AUTH_FREEZEACCOUNT()", +"6bea9d81": "BLOCKPIX_Coin()", +"6beace8f": "AllocateFounderTokens(address,uint256)", +"6beadfc7": "approveandcall(address,uint256)", +"6beb509d": "updateCanRefund(bool)", +"6bec32da": "mintToken(address,address,uint256)", +"6bec454a": "buyCity(uint256)", +"6bec51cc": "generate(address,address,uint256)", +"6bece548": "preSaleBonus1Time()", +"6bed09be": "buyTokensUpdateState()", +"6bed6de5": "sendObjectWithApproval(uint256,address)", +"6bedb845": "MultiSig()", +"6bee2cc3": "registerLottery(uint256)", +"6bee5131": "FW(uint256,string,uint8,string)", +"6bee73db": "testAllowance()", +"6bee76ea": "withdrawBond(address,uint256,uint256)", +"6bee9cfa": "offsetFeeRate()", +"6bef2a94": "earlyPurchaseTokenAmount()", +"6bef90f8": "VUP_PER_ETH_BASE_RATE()", +"6befa297": "WCT1(address)", +"6bf006c8": "capReached(uint256)", +"6bf06fde": "transferToNewContract(address,uint8,bytes32,bytes32,bool)", +"6bf0873a": "birth(uint256,uint64[])", +"6bf0a3bf": "LIQUID_ALLOCATION_PPM()", +"6bf0c7fd": "getBracket(address)", +"6bf0f4a1": "roll(uint8)", +"6bf13959": "endAtCheck(uint256)", +"6bf20a77": "unfrozenATAccount(address,address)", +"6bf2606a": "PATCH_VERSION()", +"6bf30259": "checkIncentivisingBalance()", +"6bf32504": "markAsFailed(string)", +"6bf341e7": "_fundowner()", +"6bf4223b": "getRoundEnd(uint256)", +"6bf42646": "holdTokenInvestorsCount()", +"6bf42ea5": "TokensBought(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"6bf4398d": "saniwallet()", +"6bf51a18": "stepLockCheck()", +"6bf52ffa": "Vote()", +"6bf5595d": "CrowdSale(uint256,uint256,uint256,address)", +"6bf6dd6f": "associate(bytes32,bytes32[],address[])", +"6bf807fc": "unlockTimes(address)", +"6bf82d74": "ethFundMain()", +"6bf84e51": "BECEXTEAMTOKENS()", +"6bf8b92d": "changeSeed(uint32)", +"6bf8bfab": "DutchAuction(address,uint256,uint256)", +"6bf8f85a": "forceFinish()", +"6bf91c63": "configOf(uint64)", +"6bf99bbf": "ICOResumed(uint256,uint256,uint256,uint256,uint256)", +"6bf9b3e7": "approveWithdraw(address,address,uint256)", +"6bf9b731": "claimFor(address,address,address)", +"6bf9e633": "winnerIsA()", +"6bfa379e": "readyTokens(address)", +"6bfa5edc": "operatingOfficerAddress()", +"6bfaa903": "increaseOwnershipTokenCount(address)", +"6bfae928": "calcReserve(uint256,uint256,uint256)", +"6bfb0d01": "itemCount()", +"6bfbbdf5": "DutchAuctionToCraft(address,address,address)", +"6bfbc9f7": "HongToken(uint256,string,uint8,string)", +"6bfbf5e6": "levelChanger()", +"6bfc8bb5": "setIPFSHash(bytes32,string)", +"6bfc9561": "sellStake()", +"6bfd9716": "SaleTracker(bool)", +"6bfdb7eb": "getBeneficiary(address,address)", +"6bfdd3dd": "_sanMint(uint256,address,string,string)", +"6bfe6bc0": "setEthPricies(uint8)", +"6bfee863": "CipherToken(uint256,string,string)", +"6bff1901": "coreTeamSupply()", +"6bff6575": "DaysToNextDestroy()", +"6c00161a": "distributeWithMilestone(address,uint256,uint8)", +"6c00bb44": "AuctionSuccessful(address,uint256,uint256,address)", +"6c012923": "feeForSplitterCreation()", +"6c021968": "RefundTransfer(uint256,uint256,uint256,address)", +"6c026f59": "ii()", +"6c02a931": "tokenName()", +"6c0360eb": "baseURI()", +"6c03cd49": "getInviteRate()", +"6c04066f": "BlockLockSet(uint256)", +"6c042689": "endStage1()", +"6c043773": "sendPacket(address,bytes)", +"6c047c36": "evaluateProposalMetricStart(uint256)", +"6c049b89": "toggleCrossForking()", +"6c04c1c9": "LuckyEthereumLotteryToken()", +"6c050eae": "look()", +"6c052cd8": "getGroupMembers(bytes32)", +"6c054113": "setPhaseSale(uint256,uint256,uint256)", +"6c054ad0": "createContractor(address,address,bool,address,string,string,bool)", +"6c055ce2": "withdrawToPartner(address,uint256)", +"6c060a7a": "_batchPopularitySetting(uint256[],uint8[])", +"6c062806": "addAdminAddress(address,address)", +"6c062cc7": "Forge()", +"6c064d63": "_setCompositionPrice(uint256,uint256)", +"6c08729e": "TransferToSAToE(address,uint256)", +"6c08faf7": "getCaseCount()", +"6c096192": "fetchCreatedOrdersForPayer(address)", +"6c0a1117": "doCancelAll()", +"6c0a1605": "EthTurnWCG(uint256)", +"6c0b1e8c": "VESTING_START_TIME()", +"6c0b66b9": "PGO_UNLOCKED_LIQUIDITY_CAP()", +"6c0c27e1": "acceptBet(uint256)", +"6c0d2c8b": "getHeroPower(uint256,uint256)", +"6c0daed8": "getRate(string)", +"6c0db60e": "CatexToken()", +"6c0e1ccd": "getAllCitizens()", +"6c0eb56f": "LOG_EmergencyWithdrawalProposed()", +"6c0ebc6c": "perform_withdrawal(address)", +"6c0f7ee7": "multiAddDSource(bytes32[],uint256[])", +"6c10dcdf": "ProvidenceCasinoToken()", +"6c118f46": "TimeWindowUpdated(uint256,uint256)", +"6c11bcd3": "sellTokens(uint256)", +"6c1247e5": "databaseContract()", +"6c131dbe": "multiMint(int256,uint256[])", +"6c1334bf": "SetDescript(string,string)", +"6c13b5f2": "totalReceive()", +"6c1475ad": "tryAdvance()", +"6c14bb42": "buyAutos(uint256)", +"6c14f2d1": "m_ETHPriceLastUpdateRequest()", +"6c150f42": "initLeftICOTokens()", +"6c15e8e6": "GlobalConstraintRegistrar(int256)", +"6c169818": "isFreezeAccount(address)", +"6c16c740": "Start9()", +"6c172095": "gameCenter()", +"6c17729b": "JoygoEOS(string,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"6c17b018": "airDrop(uint32,uint64)", +"6c182e99": "lastTokenIsTransferableDate(address)", +"6c188593": "setMinBetAmount(uint256)", +"6c189c46": "releaseAmisToken()", +"6c18cc1e": "firstSellHSShop(uint256,uint256,uint256)", +"6c194b59": "lastTransactionRec()", +"6c197ff5": "sell(address,uint256)", +"6c19e783": "setSigner(address)", +"6c1a5b8c": "TOKEN_TARGET()", +"6c1c6d93": "setVipAddress(address,address)", +"6c1c86f7": "PlanEX()", +"6c1d0157": "distributeMoney(address,address,uint256)", +"6c1d4fd9": "advisorsTokensThirdReleaseTime()", +"6c1e039a": "playerRoll(uint8,uint8,address)", +"6c1f05d2": "breakIdMaintenance(int128,address)", +"6c1f27fe": "icoBonus5()", +"6c1f2fb3": "ico3Sold()", +"6c1ff101": "Crowd()", +"6c204fd7": "certifyMany(bytes32[])", +"6c2066bf": "MAX_TOKENS_ADVISORS_PARTNERS()", +"6c20ceb4": "DeltaChainToken()", +"6c20d755": "getItemRafflePlayers(uint256)", +"6c20fcdd": "MerkleTreeRootAdded(uint8,bytes)", +"6c2187e7": "GameEnded(uint256,address,uint256,uint256,uint8,uint8)", +"6c224487": "DEHT()", +"6c226eef": "_processGameEnd()", +"6c231060": "buyCar(uint256)", +"6c237c1c": "admin_token_burn(uint256)", +"6c23c7b0": "canOperatorTransferByPartition(bytes32,address,address,uint256,bytes,bytes)", +"6c2412ae": "GetChipInfo(uint32)", +"6c241bb1": "getCityData(uint256)", +"6c24a76f": "getAvailableBalance(address)", +"6c24c87d": "latestSenderOf(uint256)", +"6c24d0e6": "toTimestamp(uint256,uint256,uint256,uint256,uint256,uint256)", +"6c24e2db": "maskpot()", +"6c26493c": "MyTestToken1()", +"6c265dc3": "calcFeeE8(uint64,uint256,address)", +"6c26df09": "addFootballMatch(uint256)", +"6c27149f": "testInt(uint256)", +"6c27b211": "registerBalanceForReference(address,uint256)", +"6c286ff1": "removeCrowdsales(address,address)", +"6c28faee": "migration(address,uint256,bool)", +"6c295936": "changeOptional(uint40,uint64)", +"6c295e34": "Add_Doctor(uint256,uint256,string,string,string)", +"6c29d714": "totalMarketplaces()", +"6c2af4e5": "MithrilAxe()", +"6c2b04fd": "isGovernment(address)", +"6c2bcfdd": "MAXSALESCAP()", +"6c2c5a19": "addCarSigned(string,string,string,uint16,string,address,bytes32,bytes32,uint8)", +"6c2d5d26": "symbol(address,bytes32)", +"6c2ec9ef": "guess_tx(bytes32)", +"6c2f64fe": "removeContractAddress(address,address)", +"6c303e1b": "Bitescia()", +"6c3051c9": "setWonTeam(uint256)", +"6c30ba53": "setTitulaire_Compte_4(uint256)", +"6c30d170": "renounceIssuance()", +"6c30f765": "testing(uint256)", +"6c326a46": "prizeFundHWC()", +"6c32c0a6": "gap()", +"6c32e01c": "sendJackpot(address,uint256)", +"6c33e7eb": "setMockAddress(bytes4,address)", +"6c341889": "toUint(bytes,bytes,uint256)", +"6c343afc": "destTokens(address)", +"6c343ffe": "withdrawfunds()", +"6c349e57": "addrunmoney(address,uint256,uint256,uint256)", +"6c34c97a": "setFIRST_STEP_LIMIT(uint256)", +"6c376cc5": "maintenance()", +"6c3772fd": "totalpaidout()", +"6c3824ef": "removeTokens(address[])", +"6c38d4e4": "pauseMint(uint256)", +"6c3919fc": "getProviderCurrentRate(uint256)", +"6c39b7ee": "gamesPlayed()", +"6c3a208d": "VistaToken()", +"6c3a4b80": "canBePurchasedByETH(uint32)", +"6c3aaab7": "snailPot()", +"6c3aacf9": "getTokenToEthOrder(uint32)", +"6c3b6591": "right83(uint256)", +"6c3c221b": "setFunctionTwoPrice(uint256)", +"6c3e6a75": "forceBonds(address)", +"6c3e6e0c": "iconomiTokenSupply()", +"6c3e8e19": "_vestedAmount(address)", +"6c3ea721": "memberHasRight(address,string)", +"6c4019f4": "createContest(string,address,uint32,uint64,uint64,uint128,uint128,uint32,uint32,uint8,uint32[])", +"6c4040c5": "firstSaleSpenderTxDetails(uint256)", +"6c419326": "STC(address,uint256,uint256,uint256)", +"6c43a2ca": "increaseAllowance(address,address,uint256)", +"6c4470fb": "participants()", +"6c456d0f": "getERCContractAddress()", +"6c457528": "createUsername(string)", +"6c463635": "getDistValues(string)", +"6c464c3d": "recieveRelocation(address,uint256)", +"6c46a2c5": "addOwners(address[])", +"6c46ae22": "phasePublicSale3_To()", +"6c4820bb": "callModifiedWithdraw(uint256)", +"6c48a097": "amount_investments()", +"6c494843": "multiAccessChangeOwnerD(address,address,address)", +"6c4b3197": "getSecureFees()", +"6c4be791": "hasAirdrop(address)", +"6c4bf16b": "icoOwner()", +"6c4c174f": "hack(address)", +"6c4ceaff": "getSourceHash(uint256,uint256,uint256)", +"6c4d032e": "SOFTCAP_TIME()", +"6c4d0c00": "wasGoalReached()", +"6c4d4f21": "setVotingProxy(address)", +"6c4d7c59": "getBetProps(bytes32)", +"6c4db7cc": "sendFoundersBalance(address[],uint256[])", +"6c4dfffe": "BIKS(uint256,string,uint8,string)", +"6c4e5c86": "decreaseLockBalance(address,uint256)", +"6c4e838a": "wantNewTokens(uint256[])", +"6c4e86af": "dailyGrowth_ppm()", +"6c4eca27": "tokenTransfer()", +"6c4ef21e": "canUnstakePartial(address,uint256,uint256,bytes8,uint256,uint256,uint256,uint256)", +"6c4f5e51": "testingContracts2(string)", +"6c4f8c65": "DeviceIsActivated(address)", +"6c4fbaa4": "requestCore()", +"6c4fe255": "p_setMaxInvestment(uint256)", +"6c5077b1": "MintPaused(bool)", +"6c5091e3": "getERC721AddrPawn(uint256,address)", +"6c50bc2e": "getGeneralLength()", +"6c510377": "transferOutAllEthers()", +"6c51af67": "setPOOL_edit_17(string)", +"6c525b13": "unregisterSelf(address)", +"6c525d04": "endMigration()", +"6c526503": "AmountRaised()", +"6c52660d": "checkIfNameValid(string)", +"6c530ee3": "weiPerEth()", +"6c5376c9": "addPassword(string,string,string)", +"6c543c08": "_emitSkillCategoriesSet(address,uint256,uint256)", +"6c54d1c1": "KRYPSTRONG()", +"6c54df52": "getCurrentPrice(address,uint256)", +"6c5541b5": "changeSpender(address)", +"6c556859": "createGame(string,string,uint256,uint256,string,string,string,string)", +"6c55e385": "minimalFreeze()", +"6c5649d8": "setCommunityBallotCentsPrice(uint256)", +"6c56a3f1": "startRelease()", +"6c56bf3e": "CreateARCD(address,uint256)", +"6c56bfc0": "InitiateGame()", +"6c572104": "TotalSantaCoinsGivenByNorthPole()", +"6c57c01f": "MAXIMUM_CONTRIBUTION()", +"6c57dbaa": "_max(uint256,uint8,uint256)", +"6c57f5a9": "isDisabled()", +"6c587491": "playGame(address,uint256)", +"6c595451": "addApp(string,address,uint256)", +"6c597e41": "getCreditBitAddress()", +"6c59fb29": "allocateToken()", +"6c5a7d1e": "setDisabled(bool)", +"6c5aad6e": "fetchOrderByIdWithMerchantByAdmin(string,address)", +"6c5aaf50": "getDelegateDetails(address)", +"6c5af719": "getHoldEarnings(address)", +"6c5b685f": "icoPart()", +"6c5bde2a": "CoInsureBlockToken()", +"6c5c671f": "cancelIntl()", +"6c5ca1fa": "exchangeRateRoundOne()", +"6c5ccfe8": "distributeFundsInEscrow(address,address,uint256,address)", +"6c5d2787": "setTymTokensPercent(uint256)", +"6c5d6156": "burn(address[])", +"6c5dc78b": "setPublicSaleFinishDate(uint256)", +"6c5dee17": "getFileAt(uint256)", +"6c5e9ac1": "cmpEq(uint256,uint256,bool)", +"6c5e9e18": "_phase1Supply()", +"6c5f71c7": "numberOfPingsReceived()", +"6c5f8394": "DeneumToken()", +"6c609906": "getTotalTokensAgainstAddress(address)", +"6c6101fd": "ContractManagementUpdate(string,address,address,bool)", +"6c610f53": "getMinUnitPrice(uint8)", +"6c617048": "reinvestFor(address)", +"6c61d60f": "directTransfer(address,uint256)", +"6c626ec6": "removeWinner(address,address,address)", +"6c6288e4": "Thechampcoin()", +"6c6295b8": "setValidRateDurationInBlocks(uint256)", +"6c64a678": "unfreezeToken()", +"6c658a2c": "UpdateICOPhase(address,uint256,uint256)", +"6c65c455": "swapETHMKR(uint256,uint256)", +"6c65fd6a": "isFreezer(address)", +"6c675ae6": "tokens_buy()", +"6c677d82": "SpentTokens(address,address,uint256)", +"6c68b5d5": "TicketOwner(uint256,uint256)", +"6c68c837": "verifyBalanceProof(address,uint32,uint192,bytes)", +"6c690142": "redeemAllowedInternal(address,address,uint256)", +"6c698882": "getActualNum(uint256)", +"6c699905": "revealWinner()", +"6c69ab24": "multitokensCount()", +"6c6b23d2": "updateBalances(address,address)", +"6c6b298a": "getMigrateInBonusIfInForkWindowValue()", +"6c6b9870": "updAirDropTokenEnabled(bool)", +"6c6c21af": "CappedCrowdsale(uint256,uint256,uint256)", +"6c6c39fb": "votersLength()", +"6c6c7e05": "amountLocked()", +"6c6ce21a": "setInvoice(bytes32,uint256,bool,string,string,string,string)", +"6c6d2653": "CrowdsaleChanged(address,address)", +"6c6e5108": "StoriqaCash()", +"6c6eb9d1": "base(uint256)", +"6c6f1d93": "getContractCreationValue()", +"6c6f31f2": "allow(address,uint256)", +"6c6f360e": "userRegister()", +"6c6fbd70": "EnergiToken()", +"6c7018cf": "single_card()", +"6c706093": "logUniverseCreatedCalled()", +"6c70abda": "use(uint8,uint8,uint8,uint8[176])", +"6c70ad0d": "PublicMineCallsCount()", +"6c7113e4": "getFundManager()", +"6c712471": "testControlRetractLatestRevisionEnforceRevisions()", +"6c71b1aa": "setGasReq(uint256)", +"6c71d01d": "ratings(bytes32)", +"6c720446": "isVotingPrepare()", +"6c7272ce": "registerVendor(address,address)", +"6c73d230": "logResult(string)", +"6c741950": "setTTL(uint256)", +"6c749c26": "EXA()", +"6c74e341": "setFoundingTeam(uint256[],address[])", +"6c751622": "MacQueenToken()", +"6c7521cb": "updateReputationScoreInBulk(address[],uint256[])", +"6c767f20": "playerOneReveal(bytes32,bytes32)", +"6c768200": "burnByOwner(address)", +"6c76b8f4": "_changeReward(uint256)", +"6c779d57": "levelSplits(uint256)", +"6c77f989": "joinLottery()", +"6c780868": "getBurnLine()", +"6c784995": "getBeneficiaryMarket()", +"6c786b65": "bonusAccountCount()", +"6c787229": "availableOwnerWithdraw()", +"6c788a0d": "bookingFee()", +"6c789092": "Resource(bytes32,bytes32,bytes32,address)", +"6c78cb81": "ETCToken(address)", +"6c78da22": "getPrefixPrice(string)", +"6c79e379": "setGallerySevenPrice(uint256)", +"6c7afaba": "regSpots(uint16,uint16,bytes32)", +"6c7bc902": "tgrCurrentPartInvestor()", +"6c7c7c73": "bePure(uint256,uint256)", +"6c7c909f": "FreshWaterFlow()", +"6c7ca99f": "RequestBankrollPayment(address,uint256,uint256)", +"6c7cc6d8": "sell(uint256,address,bool)", +"6c7d4c4c": "unwhitelistAddress(address,address)", +"6c7dde15": "validPayBuff()", +"6c7de422": "investmoretokens()", +"6c7e0236": "isNotaryVeredictValid(address,address,address,bool,bool,bytes)", +"6c7e7082": "overflowAmount()", +"6c7f1542": "balanceOf(bytes32)", +"6c7f3f17": "totalBuys()", +"6c811247": "showPlayerSafeByAddress(address,uint256)", +"6c814509": "setAdAccount(address)", +"6c81fd6d": "AddModerator(address)", +"6c82337e": "payJackpot4()", +"6c825035": "withdrawLRC()", +"6c830f4b": "getCompletedTasks()", +"6c83444d": "FLOQI()", +"6c8381f8": "candidate()", +"6c8429fd": "jpMinBet()", +"6c843605": "BrownieCoin()", +"6c84a4bf": "tokenContributionCap()", +"6c84ae04": "setFirstYearAllowancePercentage(uint8)", +"6c85acec": "RNCTokenERC20(uint256,string,string)", +"6c85c727": "removeBankroll(uint256,string)", +"6c85cf67": "canTransfer(address,address)", +"6c86888b": "testTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address)", +"6c86ac5a": "getPublicData(uint256)", +"6c8716d8": "etherLowLimit()", +"6c876e5d": "s2(bytes1)", +"6c8830c5": "_maxtotalSupply()", +"6c8a59f2": "addresses6(uint256)", +"6c8ae38c": "r()", +"6c8b052a": "numStakers()", +"6c8b37eb": "MTRCToken(address,string,string,uint256,uint256)", +"6c8b4e60": "communityLock()", +"6c8d0b1e": "getSubscriberStatus()", +"6c8d0bcf": "getUserDAOsId(address,uint256)", +"6c8d65dc": "phepsToken()", +"6c8dea3b": "claim_ENS_name()", +"6c8e44c3": "ProductionUnitToken(address,uint8,uint8,uint8,uint256,uint256,uint256,uint256)", +"6c8e53e0": "PreSale()", +"6c8f093d": "PayForServiceCHLEvent(address,uint256)", +"6c8f455c": "checkMembership(bytes32,uint256,bytes32,bytes)", +"6c90c3df": "setCanClaim(bool,bool)", +"6c90fe09": "CcoindDigital()", +"6c912080": "minListingSeconds()", +"6c922038": "CMAPToken()", +"6c9230db": "getCurrentTimestamp()", +"6c94d0e4": "INBETToken()", +"6c953719": "CCASH(uint256,string,string)", +"6c958f74": "tokensOfferedOf()", +"6c963fc7": "PoWAdvCoinToken()", +"6c965a81": "claim(address,bytes32,string,bool,uint256,bytes32,uint256,bytes)", +"6c973248": "getVoteCount(uint256,uint256,uint256)", +"6c9740c1": "transferOwnership(address,uint8)", +"6c9784b1": "_getTokenRaised(uint256)", +"6c9789b0": "finalize(bool)", +"6c97a812": "UTExchangeRate()", +"6c97b731": "TimeEndChanged(string,uint256)", +"6c97c237": "firstSellSaddleShop(uint256,uint256,uint256)", +"6c981488": "paymentPeriods()", +"6c996bbd": "disputeOpened(address)", +"6c99b0da": "setFWDaddrETH(address)", +"6c9a1e2a": "setPOOL_edit_12(string)", +"6c9a5c61": "resolveExpiredBets(uint256)", +"6c9c1d41": "checkServiceFee(address)", +"6c9c2faf": "getSupply()", +"6c9c5944": "freeze(address,uint256,uint256,uint256)", +"6c9c97d8": "refundByToken(uint256)", +"6c9cb82f": "freeCash()", +"6c9d99da": "teamTokensWallet()", +"6c9e27d6": "ALLOC_WINGS()", +"6c9e89b6": "addVesting(address[],uint256[],uint256[])", +"6c9eafe7": "stillAllowed()", +"6c9f65c5": "getBidInfo(uint32)", +"6c9fa59e": "shareToken()", +"6c9fca89": "updateAppInstance(bytes32)", +"6ca0101e": "unopened_bid()", +"6ca06072": "getAttributeAdminAddr(address,bytes32)", +"6ca0a099": "getInitialBlockHeight(uint256)", +"6ca0f321": "setValue1(uint256)", +"6ca100fb": "firstWeekMainICOBonusEstimate()", +"6ca13df1": "decreaseOwnershipTokenCount(address,address)", +"6ca1f933": "setTest(uint256)", +"6ca32280": "percentageBuyBackFund()", +"6ca34ea2": "balances_(address)", +"6ca35ae4": "addDoctor(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)", +"6ca3b5f6": "set_maxgasprice(uint256)", +"6ca3daf2": "_vouchersDistributed(uint16)", +"6ca3fc3b": "distributePrizes(uint256)", +"6ca562d6": "switchCompatible223ex(bool)", +"6ca596fa": "isPreICOClosed()", +"6ca5b5b0": "r1()", +"6ca5bdf2": "testIntDynArray(int256[])", +"6ca621bd": "setEmbassy(address)", +"6ca78a1c": "anyRequestAvailable()", +"6ca78a1e": "setBorrowerReturnEthPerFiatRate(uint256)", +"6ca7b99b": "getDirection(uint256,uint256)", +"6ca7c216": "gas()", +"6caa2bda": "OxyToken()", +"6caa736b": "fundDeposit()", +"6caabc6f": "addCompany(string,address,uint256)", +"6caca63a": "WhiteTigerToken()", +"6cad3fb0": "updateFeePercentage(uint256)", +"6cadd040": "EtherAuction()", +"6caddb04": "orders(uint256,address)", +"6cae8f67": "setSellableToken(address)", +"6caed305": "changeBonus(uint256,uint256)", +"6caf25ce": "price1()", +"6caf3673": "getPlayerSpaceshipBattleStakeById(uint256)", +"6cb04993": "forceNeuroChainAddress(address,string)", +"6cb0e9f0": "TXToken(address)", +"6cb136ba": "isActive(uint16)", +"6cb1630f": "withdrowTokens()", +"6cb24199": "withdraw(bytes32,uint256,address,uint256,address)", +"6cb30fee": "nettingContractsByAddress(address)", +"6cb31171": "_currentHalfYear()", +"6cb39448": "getMarketerKey()", +"6cb3c94e": "Filler()", +"6cb3d30a": "triggerTryAuth()", +"6cb3e8ef": "getApprovers()", +"6cb45694": "LogDisbursement(address,uint256)", +"6cb520c6": "_play(string,uint256)", +"6cb5291e": "ICO_PRICE1()", +"6cb5714c": "_sendByTranche(bytes32,address,address,address,uint256,bytes,bytes)", +"6cb5d070": "getCoinsSinceLastHatch(address)", +"6cb69c2c": "setDevTokensWallet(address)", +"6cb69f42": "getSystemInfo()", +"6cb6ea82": "CBITokenCrowdsale(uint256,uint256,uint256,uint256,uint256,address)", +"6cb7223c": "maxPurchaseOnce()", +"6cb76408": "returned()", +"6cb78983": "purchaseMIT(address)", +"6cb90a2c": "pre_ico()", +"6cb942ab": "GameItemNew()", +"6cba45b8": "setDayFirst()", +"6cbad471": "Rappo()", +"6cbae51b": "firstPreSaleDate2()", +"6cbaecbd": "normalRoomMin()", +"6cbb1afa": "setTokenBag(address)", +"6cbb9d19": "releaseEscrow(bytes20,address)", +"6cbc2ded": "endGame()", +"6cbc9ca0": "ADDR_OWNER()", +"6cbceeec": "theAddress()", +"6cbdb7d0": "takers(uint256)", +"6cbec01c": "Steel()", +"6cbef5a7": "sumVote()", +"6cbf3c8c": "ICO_POOL()", +"6cbf9c5e": "commitVote(uint256,bytes32,uint256,uint256)", +"6cc03315": "getPaymentLogN()", +"6cc09081": "getActualPrice()", +"6cc23437": "setIsContainerForFeeWindow(bool)", +"6cc25db7": "ticket()", +"6cc2c668": "_presaleEndTimestamp()", +"6cc301e3": "permitted(address)", +"6cc341f1": "getIndexOrder1(uint256)", +"6cc37048": "EFFToken(address)", +"6cc48d81": "_emitHeartBeat(bytes32,int256,int256)", +"6cc5ab24": "digithothToken()", +"6cc5f3ad": "getGames(uint256[])", +"6cc5fdaa": "setBytes32(bytes,bytes)", +"6cc61d86": "setSingleWithdrawMin(uint256)", +"6cc67aa5": "resetExplicitState(uint32,int64[2],int256,uint64,int8)", +"6cc6971b": "setNewStartDate(uint256)", +"6cc6cde1": "arbitrator()", +"6cc70ee1": "GovernanceChangeMinApproval(uint8)", +"6cc762d8": "lastWeiPricePerCWC()", +"6cc7d828": "investBalanceGot()", +"6cc919c8": "updateConfig(address)", +"6cc95f8d": "ALAX()", +"6cca5065": "QripplexToken()", +"6cca60ba": "gripWallet()", +"6cca7023": "DoubleSend(address,address,uint256)", +"6cca940a": "RusgasCrowdsale()", +"6ccab1f3": "wwasCoin()", +"6ccb5d02": "getShareholder(uint256)", +"6ccbb0ab": "withdrawBalances()", +"6ccbdbf9": "getHodlAmount(uint256)", +"6ccc3bdd": "whitelistBonusPercentage()", +"6ccce7a8": "getCapOfWei()", +"6ccd563d": "queueAuditRequest(uint256,uint256)", +"6ccd5cbe": "getClassInfo(uint32)", +"6ccd993b": "getDestroySharesFxpValueValue()", +"6ccde640": "getGoodPreset(bytes32)", +"6cce15d8": "ICOFails()", +"6ccf93d3": "HeyueToken(address,uint256)", +"6cd02297": "processOfflinePurchase(address,uint256)", +"6cd05e41": "takeAllTheMoney(address)", +"6cd0f102": "setHouseEdge(uint256)", +"6cd186ce": "setUncleSafeNr(uint256)", +"6cd1b26c": "setQueue(uint256)", +"6cd22eaf": "updateAuthority(address,bool)", +"6cd2ad56": "distributeTo(address)", +"6cd2b458": "splitsTotal(uint256,uint256)", +"6cd2f731": "setTimePerPeriod(uint256[5])", +"6cd38ea0": "NebulasToken(address,uint256)", +"6cd3d326": "getTotalChild(address,address)", +"6cd40993": "setNeironixProfitAddress(address)", +"6cd44d55": "pushOrderOfVendor(address,uint256,bool)", +"6cd49925": "currentLocation()", +"6cd51833": "initiateWithdraw(uint176,uint64)", +"6cd522f2": "getContributionRNTB(address)", +"6cd56641": "EYrickCoin()", +"6cd56878": "setDeveloperWallet(address)", +"6cd5c39b": "deployContract()", +"6cd6043a": "emitAndStore()", +"6cd61739": "getbuyprice()", +"6cd69864": "Total_Companies()", +"6cd7d86e": "setClaimRepository(address)", +"6cd8015d": "setVestingWithDefaultSchedule(address,uint256)", +"6cd8c204": "BuyEgg()", +"6cd8f433": "canExport()", +"6cd8f772": "fights()", +"6cd8fa85": "burnTrusted(address,uint256)", +"6cd902d0": "Casa()", +"6cd9786a": "setCapETH(uint256)", +"6cd98f30": "getResponseQueryType(uint256)", +"6cd9db29": "sub_matricola(string,uint256)", +"6cdacfc4": "startStage(uint256,uint256,uint256)", +"6cdae459": "YuanBaoCoin()", +"6cdb3389": "getEntriesCountForCompetition(uint256)", +"6cdb711e": "ProposalAdded(uint256,address,uint256,uint256,address,uint256,uint256)", +"6cdc644d": "CMTC()", +"6cdcb1ca": "DEVELOPER_supply()", +"6cde3c75": "frozenAccountICO()", +"6cde6380": "setHash(uint256,bytes32)", +"6cde71ee": "enteredTotalAmount()", +"6cde95ee": "getAccountAllowance(address)", +"6cdf4c90": "ownerSetMinBet(uint256)", +"6cdf7cdf": "FRO()", +"6cdfcc6e": "getTokenList(address,uint8,uint256,uint256)", +"6cdffb3c": "fetchJugadas()", +"6ce066af": "Give(bytes32)", +"6ce079fe": "getNumGames()", +"6ce07efa": "AddSale(uint256,string,string,string,uint256)", +"6ce0a6a4": "SafeBoxCoin()", +"6ce12737": "OX_TOKEN()", +"6ce1417e": "Fund()", +"6ce15a54": "genericAction(address,bytes32[])", +"6ce27c7b": "DECIMAL_INDEX()", +"6ce37387": "KindAdsToken()", +"6ce3fc06": "sendPrize()", +"6ce41ab4": "Garuda()", +"6ce4499c": "adjustCoins(address,int32,string)", +"6ce4a9a8": "RAMTOKEN()", +"6ce5b3cf": "releaseHeldCoins()", +"6ce62c61": "changeAllowances(address[],uint256[])", +"6ce6833d": "test_updateKey_increaseNoHint()", +"6ce768dd": "GetMainInvestor()", +"6ce76ae3": "openOldCrates()", +"6ce7e739": "getBonusRate(uint256,uint256)", +"6ce912ab": "LongevityToken()", +"6cea50a1": "crowdSaleStarted()", +"6ceac6e1": "TankDeposit()", +"6ceba55e": "change_fee(uint256)", +"6cebad98": "newUser()", +"6cebd885": "waraCoinTransfer(address,uint256)", +"6cec0ceb": "setDenominator(uint256)", +"6cec7f92": "canManage(uint32,int256,address)", +"6ceccc82": "changeICOAddress(address)", +"6cecdad9": "UpdateAttribute(uint256,address,bytes32,bytes32)", +"6cedc6ea": "tHasSubmitted(uint256,address)", +"6cee0d8b": "checkIfAllIQTDistributed()", +"6cee2d45": "STTR(uint256,string,uint8,string,address,address)", +"6ceec70d": "whitelistAdd()", +"6cef5ff4": "FundingAssetAddress()", +"6cf124c6": "toJackPotfromEveryTicket()", +"6cf1a452": "chgExchangeRate(uint256)", +"6cf1cb29": "setGen0SellerAddress(address)", +"6cf27311": "randomNumbers(address)", +"6cf32dde": "getMyGolds()", +"6cf339f8": "CardiumToken()", +"6cf35782": "m_funds()", +"6cf3b9e9": "checkBalance(uint256[])", +"6cf3c25e": "small()", +"6cf3d099": "dropEnd()", +"6cf43347": "returnString()", +"6cf49694": "tweakDailyDividends(uint256)", +"6cf4c88f": "removeApprover(address)", +"6cf69811": "trade(address,uint256,address,address,uint256,bool)", +"6cf6d675": "unbondingPeriod()", +"6cf70679": "removeFees(uint256)", +"6cf72694": "OAToken()", +"6cf75170": "cancelVote(address,uint256,uint256)", +"6cf761d4": "getMinConfirmationsByAddr(address)", +"6cf7cff6": "icoETHContributionLimit()", +"6cf7da53": "setMinerPrice(uint256)", +"6cf843ac": "LuckyToken()", +"6cf9bbf8": "setJackpotFactor(uint256)", +"6cf9cc58": "registerResource(bytes,uint256,bytes,string)", +"6cf9ea99": "Rhinex()", +"6cfab740": "RequiredBondRules(address)", +"6cfb0a4a": "test_oneValidEqBytes()", +"6cfb2c9c": "payoutToAddress(address[])", +"6cfb7101": "_emitMonthLimitChanged(bytes32,uint256,uint256)", +"6cfb782f": "TestWithdraw()", +"6cfc4512": "authorSignUp(address)", +"6cfc4ac5": "getGameEnd()", +"6cfc82ed": "trancheSize()", +"6cfdc242": "isSalesManager()", +"6cfe5947": "getCurrentICOPhaseBonus()", +"6cfedade": "refundTeamTokens()", +"6cff6f9d": "payoutOrder()", +"6cff8244": "controllerSucceeded()", +"6cffa0cd": "_transter(uint256)", +"6cffd817": "burnByAmount(uint256)", +"6cfff605": "releaseThreeHotHourTokens()", +"6d011a12": "scribes_hisory(uint256)", +"6d013618": "mint(address,uint256,uint256,string,string)", +"6d01d12b": "XeToken()", +"6d022003": "ALLOC_SALE_PRIVATE()", +"6d029f6a": "totalYUPIESAllocated()", +"6d02a595": "_setMintFeeAbs(uint256)", +"6d03d3ec": "HolderAdded(address,uint256,uint256,uint256)", +"6d03fa87": "getReferer(address)", +"6d04f50d": "mtronix()", +"6d0501f6": "mediator()", +"6d052b37": "getRequestByIndex(uint256)", +"6d052f56": "testBitsSetSuccess()", +"6d05c24d": "calcWidthraw(string,uint256)", +"6d05cef4": "getStageSupplyLimit()", +"6d05da7e": "tranchesCount()", +"6d061b69": "deathData_a3()", +"6d064875": "transferEducatedTokenOwnership(address)", +"6d064962": "getOwnerByShipId(uint256)", +"6d069c10": "_updateRaceWinner(uint256,uint256)", +"6d06bf0d": "celebOf(uint256)", +"6d06de2d": "haveAttributes(address,bytes32,address,bytes32)", +"6d076966": "VESTING_1_AMOUNT()", +"6d0797fc": "_isMatingPermitted(uint256,uint256)", +"6d07e3de": "sexToken()", +"6d07f295": "minEatable()", +"6d081d83": "zero_fee_transaction(address,address,uint256)", +"6d082bbb": "startSpreadingBlock()", +"6d0831f0": "BNNToken()", +"6d08bad2": "currencyToHash(string)", +"6d08e8f9": "initiateChallengeWithPastCustody(address,uint256,bytes32[],uint256[],bytes32[])", +"6d09e2ec": "commitCurrency(address,uint256,uint256)", +"6d0a98cc": "blockResolveDispute(uint64,uint64,bytes)", +"6d0b5ee2": "TeamFundsTokens()", +"6d0ca12a": "tokensBack()", +"6d0cc895": "getVersions()", +"6d0def6c": "SimpleDividendToken()", +"6d0e5c03": "stampToken(uint256,uint256,uint256)", +"6d0ecb88": "SohaibCoin()", +"6d0f131a": "DrawEvent(uint256,uint8,uint8,uint8,uint256,uint256,uint256,uint256)", +"6d0f157d": "setAllFreeze(uint256,uint256)", +"6d0f2a84": "changeDefendFee(uint256)", +"6d0f8806": "refundAdveriser(uint256)", +"6d102f71": "acceptOrder(bytes16)", +"6d106885": "unitUserBalanceLimit()", +"6d1150de": "endCurrentPhaseIn(uint256)", +"6d11cf72": "berrycoin()", +"6d11fe82": "_initAwardInfo()", +"6d121b91": "getMaxCap10X()", +"6d12301c": "getBetValue(bytes32,uint8)", +"6d12fb5b": "setSellable(uint32,bool)", +"6d1478e9": "_addToDebtRegister(address,uint256)", +"6d14b2a8": "JackpotAmount()", +"6d156add": "finalizePRETDE()", +"6d15a659": "Distribution(address,address,uint256,uint256)", +"6d15cecd": "getTokenRaised()", +"6d15dc5a": "BetPayout()", +"6d15f208": "reject(string,uint256,uint16,address,uint256)", +"6d160f31": "confirmReservedTokens(address,uint256)", +"6d161bc1": "setdot(address)", +"6d1669e1": "approveAndCall(address,address,uint256,bytes)", +"6d16f79c": "__transferWithReference(address,uint256,string)", +"6d16fa41": "transferControl(address)", +"6d171f0e": "changeRemainingSupply(uint256)", +"6d17af94": "ContributionMinted(address,uint256,uint256)", +"6d181a42": "FTV(address,address,address,address,address)", +"6d1821aa": "OrenCoin()", +"6d1884e0": "getEvent(uint256)", +"6d189422": "EtherFlipRaffleToken()", +"6d18c778": "PSIToken()", +"6d18dc63": "ATTR_TRADABLE()", +"6d1909fc": "transferIDCContractOwnership(address)", +"6d1917b5": "maxPurchaseNonWhiteListed()", +"6d19ce04": "STARTING_Dragon()", +"6d1a0d34": "ShowTime()", +"6d1af018": "getAmountRaised()", +"6d1b229d": "burnTokens(uint256)", +"6d1d71c5": "Note(address,string)", +"6d1da953": "createWithNonce(bytes32,bytes)", +"6d1e1f8d": "updateSale(uint256,uint256,uint256)", +"6d1e2194": "SALES_ALLOCATION_PPM()", +"6d1e8095": "transferGameOwnership(address)", +"6d1e839c": "changeMaxCap(uint256)", +"6d1ea3fa": "approvedTokens(address)", +"6d1eab7d": "getRegistryVersion()", +"6d1f00a6": "ThroneMaker(uint256)", +"6d1f451b": "multiSigWalletAddress()", +"6d201095": "PRICE_PRESALE_START()", +"6d214c66": "MBSibalCoin()", +"6d21f638": "SmartshareStandardToken(uint256,string,uint8,string)", +"6d224b7b": "weiPerABIO()", +"6d236703": "createMemoryArray(uint256)", +"6d2381b3": "addressAndBalance()", +"6d23bf0b": "ingresarFondos()", +"6d23c516": "s8(bytes1)", +"6d23cda3": "sub(uint16,uint16)", +"6d245bda": "lockUnlockGamblingPartyForBetting(uint256,bool)", +"6d2570fe": "Before(uint256,bytes32)", +"6d25924d": "setn(uint256,uint256,uint256)", +"6d25ba1d": "setTechBonus1(uint256,string)", +"6d2666b9": "lockInLastSixteenPrize()", +"6d275e9e": "distributeEbyte(address[],address,uint256,uint256,uint256)", +"6d277279": "getAuctionsCreated(address)", +"6d278b29": "setHoldMax(uint256)", +"6d27a326": "turnOnFurnace(uint16[5],uint128)", +"6d28e805": "getInsurance(bytes32,uint256)", +"6d290d34": "setAllocation(address,uint256,uint256,uint256,uint256)", +"6d295e24": "callDefaultAction()", +"6d2980f6": "TEAM_LOCK_DURATION_PART1()", +"6d2a7c8b": "createAuction(uint256,uint256,uint256,uint256,address,uint64)", +"6d2ab982": "presaleFemaleDiscount()", +"6d2bf99c": "updatePercentBase(uint256,uint256,uint256)", +"6d2c51a7": "countrySupply(uint256)", +"6d2cb794": "airaTransfer(address,address,uint256)", +"6d2d4e52": "lockSupplierAndLockPosition1(address,address)", +"6d2d525d": "FFUELCoinTokenCrowdSale(uint256,uint256,uint256,uint256,uint256,address,address,address,address,address,uint256)", +"6d2dd1a9": "getDividendsForOnePeriod(uint256,uint256,uint256,uint256)", +"6d2ff3d3": "Geniota(uint256,string,uint8,string)", +"6d301f38": "MIDO()", +"6d3036a7": "MAGNITUDE()", +"6d308c40": "changehiddenOwner(address)", +"6d30921c": "proceedDividends(uint256)", +"6d30d07f": "getMiniPoolEdit_6()", +"6d312683": "feeInCirculation()", +"6d32028d": "bigAward(address,uint256,uint256)", +"6d320b17": "minimumEntryThreshold()", +"6d32a4a6": "finishRoundD()", +"6d32dc4b": "startElection(uint256)", +"6d338bd0": "setCCH_edit_22(string)", +"6d339f02": "_oldConfig()", +"6d33b42b": "changeLimit(uint256)", +"6d33f5a6": "updateNoteContent(uint64,bytes)", +"6d34a775": "getDatas()", +"6d35b1dc": "getExtraDays()", +"6d35bf91": "seizeVerify(address,address,address,address,uint256)", +"6d361694": "getModel(uint256)", +"6d36ebf8": "addPlayer(address,bytes32)", +"6d37a9dc": "LCT()", +"6d38156f": "getCountOfIntegerTypes(uint8[])", +"6d399eb7": "MAX_AIRDROP_VOLUME()", +"6d3b5f18": "getUserByID(uint256)", +"6d3c7ec5": "setDefaultPrice(uint256)", +"6d3d0a8f": "disagree()", +"6d3de7ea": "beManagerInsurance()", +"6d3e141e": "functional(address,uint256)", +"6d3e1a74": "PiBetaToken()", +"6d3e4502": "DatToDtrcDenominator()", +"6d3f008a": "FinalizedTier(uint256,uint256)", +"6d3f1277": "flagAndFinalize(uint256)", +"6d4045a8": "EXOSO()", +"6d40ee41": "CloseDonation()", +"6d40f3b0": "PHASE_OPEN()", +"6d417064": "expirationBlock()", +"6d41a3fb": "firstAuctionsExtendedChunkDuration()", +"6d425249": "minerNum()", +"6d435421": "transferOwnership(address,address)", +"6d43b489": "freeTokens(address,address,uint256)", +"6d4419e5": "listTopics()", +"6d44a9cf": "KudosPresaleTokenLockup(address,address)", +"6d4546a2": "changeTsaLink(string)", +"6d46398b": "newChannel(bytes32,address,address,bytes,uint256,bytes,bytes)", +"6d467f04": "ContractTransfer(address,address,uint256,bytes)", +"6d46c6f5": "referrer1Percent()", +"6d4717fe": "noFeesList()", +"6d47ab72": "sellers(address)", +"6d47fb71": "changeICO(address)", +"6d47fc60": "Changepro()", +"6d489314": "terminateLastMilestone(bytes32,address)", +"6d48ae25": "best_submission_accuracy()", +"6d492f54": "sendFyle(address,address,string)", +"6d493bf9": "SOLARCHAINToken(string,string,uint8,uint256)", +"6d498093": "presaleFinalized()", +"6d49817b": "refundPayment(address)", +"6d4a37ef": "cancelEscrow(bytes16,address,address,uint256)", +"6d4b38a2": "infraIndexToOwner(uint256)", +"6d4bae72": "_register2(address,bytes32)", +"6d4be70f": "ethereumSHA3(bytes20,uint24,uint32)", +"6d4c80ea": "removeNamespaceMember(string,address)", +"6d4ce63c": "get()", +"6d4d907c": "maxNumVotesPerAccount()", +"6d4ee68f": "SendBobsCoin()", +"6d4fd0ad": "isNull(address[])", +"6d4fd338": "PPToken()", +"6d4fe435": "counter_in()", +"6d505b49": "randgenNewHand()", +"6d50a2b5": "deleteAllBackgroundImages()", +"6d50ef2a": "timelockedTokensDisbursed()", +"6d510a64": "ourTEAM()", +"6d510f6c": "updatePartners(address)", +"6d5210d9": "showprize(address)", +"6d522b19": "multiAccessChangeRequirementD(uint256,address)", +"6d52f9d5": "mapToNewRange(uint256,uint256)", +"6d53393b": "getInitializeCreatorValue()", +"6d538264": "setMigrateAddress(address)", +"6d53aa4e": "GetProd(address)", +"6d540318": "revokeOracle(address,uint256)", +"6d5433e6": "max(uint256,uint256)", +"6d54340a": "Blockbin()", +"6d544e6e": "setStackSize(uint256)", +"6d54ec91": "registerAndActivateDevice(bytes32,bytes32,bytes32)", +"6d568c43": "weiToCents(uint256)", +"6d56d9f4": "setAuction(uint256,uint256,uint256)", +"6d578781": "changeStageBlcok(uint256)", +"6d57b2b1": "tokenInitialDetails()", +"6d57dee4": "sendTokenAw(address,address,uint256)", +"6d57e2a9": "getAgonIdArray(address)", +"6d580320": "G2UFundDeposit()", +"6d580bcb": "FOUNDERS_CAP()", +"6d584266": "ALLOC_SALE_GENERAL_3()", +"6d5860d4": "revert(string)", +"6d58c88f": "changeDepositAddress(address)", +"6d599136": "personal_withdraw(uint256)", +"6d59c3be": "buyUFT(address)", +"6d5b0f6f": "transferCustodian(address,address)", +"6d5b9427": "onlyWithValidSignature(bytes)", +"6d5c1621": "LogInsert(address,uint256)", +"6d5cae52": "QiongB(uint256,string,uint8,string)", +"6d5d21a9": "setStubFund(address,address)", +"6d5d7612": "MAX_WITHDRAW_PCT_DAILY()", +"6d5da09a": "LockChain()", +"6d5e136d": "_getApproved(uint256)", +"6d5e3587": "needsEther(string)", +"6d5e53f6": "createInt256(bytes32,int256)", +"6d5e78f9": "depositorLimit()", +"6d5f3e15": "settleBet(address)", +"6d5f6639": "objectProposal(bytes32)", +"6d608402": "sendBPESOToken(address,uint256)", +"6d60bf39": "getPreEntranceFrom()", +"6d60e6b4": "trustAddress()", +"6d619daa": "storedValue()", +"6d624e86": "SideJobCoin()", +"6d62a4fe": "canTransfer(address,address,address,uint256)", +"6d63fa32": "getPixelNumber(bytes1,bytes1)", +"6d640637": "testBetId()", +"6d643308": "icoDeadLine()", +"6d64694f": "etherdelta()", +"6d64a472": "claimSalesAgent()", +"6d64abd6": "takeEther(address)", +"6d650b2d": "level_7_percent()", +"6d66264f": "specifyController(address)", +"6d6712d8": "hasPermission(address,address,bytes32)", +"6d6755a6": "gvpe_per_eos()", +"6d6908bd": "mintTokensBatch(uint256,address[])", +"6d69fcaf": "addSupportedToken(address)", +"6d6a01f6": "second_partner_address()", +"6d6a2859": "assetID()", +"6d6a4889": "nextReleaseTime()", +"6d6a6a4d": "decimalFactor()", +"6d6a761e": "setCouponToken(address)", +"6d6bc5f5": "identifierToCoordinate(uint256)", +"6d6c0ec4": "mintProxy(address,uint256)", +"6d6c2074": "totalTokensForSaleDuringICO3()", +"6d6caeb2": "poolCapUSD()", +"6d6d69b6": "allowedToSell()", +"6d6d70d9": "connectModule()", +"6d6dcbe7": "deleteResponse(uint256)", +"6d6e2710": "clearCrowdsaleOpenTimer()", +"6d6e8312": "addProviderAdmin(address)", +"6d6ead75": "reject(uint256,address,uint256,uint256,address)", +"6d6ebb01": "thawSomeTokens(address,uint256)", +"6d6f385c": "isSaleFinished()", +"6d6fa6b1": "FNKOSToken()", +"6d6fb665": "CUSTOM_ERC20_MINT_SERVICE_NAME()", +"6d701f0a": "Eos()", +"6d704159": "wdBefore()", +"6d705ebb": "register(address,uint256)", +"6d70f7ae": "isOperator(address)", +"6d717daf": "Albarit()", +"6d71be4c": "increaseReserve(uint256,uint256)", +"6d7221d5": "doubleClaimSegmentSlashAmount()", +"6d72da47": "addElection(address,uint256)", +"6d72dc38": "getSwapLifetimeLimits()", +"6d730453": "TokensTransferedToOwner(address,uint256)", +"6d736fac": "feeAccount2()", +"6d763a6e": "getLeaderboard()", +"6d771f77": "one_month()", +"6d773cd0": "balance_out()", +"6d77cad6": "isOperatorForPartition(bytes32,address,address)", +"6d77e144": "removeBlacklistItem(address)", +"6d786740": "billingPeriod()", +"6d788933": "_distribution(address[],uint256[])", +"6d78a434": "IntegrativeWalletToken(uint256,uint256,uint256,address)", +"6d78e48a": "candidateTillXPAAssets()", +"6d79207c": "SALE_DURATION()", +"6d796253": "configRoundKey()", +"6d7a0f89": "EmptiedToWallet(address)", +"6d7a2609": "setSpenderAddress(address)", +"6d7a37b6": "OCPresale(address,address,uint256)", +"6d7ab187": "AcceptsGMOON(address)", +"6d7b3706": "setfees(uint256,uint256,uint256,uint256)", +"6d7bc487": "RESERVED_TOKENS_FOR_FOUNDERS_AND_FOUNDATION()", +"6d7bd3fc": "BANCOR_FORMULA()", +"6d7cb00c": "CoinMarks(uint256,address)", +"6d7d083f": "handleFunds()", +"6d7da0b1": "MyContract()", +"6d7fa14e": "CQC(uint256,string,uint8,string)", +"6d7fd1bf": "getIpfs(uint256)", +"6d7fd8a3": "pauseRefund()", +"6d80244d": "createUnitOmni(uint32,address)", +"6d805b2d": "withdrawMana(uint256)", +"6d813e63": "owner_viewOnFlight()", +"6d81779b": "teamCap()", +"6d836cde": "updCouponBonusEnabled(bool)", +"6d8370e9": "upgradeTusdProxyImplTo(address)", +"6d842ad5": "NewBOP(address,address,uint256,uint256,string,string)", +"6d843c2f": "participatedInAirdrop(address)", +"6d84dbb0": "BeijingCoin()", +"6d853ab6": "isSubUser(address)", +"6d863fd7": "airDropSingleAmount(address[],uint256)", +"6d86ac59": "DUMPSACK()", +"6d871c44": "set_a(uint256)", +"6d8758c7": "editCuts(uint256[6])", +"6d877f91": "Bob()", +"6d87b65c": "setPropertySalePrice(uint16,uint256)", +"6d88885e": "schoolOrdering()", +"6d892f7e": "deauthorize(address,address)", +"6d893a5a": "deathData_a8()", +"6d8941cb": "smallBonusPercent()", +"6d8a3650": "dedex(address,address,address,uint256,uint256,uint256)", +"6d8a5f8f": "CAP_ICO()", +"6d8a74cb": "getRoom(uint256)", +"6d8a9f92": "setSavedEthBalance(address,uint256)", +"6d8ab124": "containsPosition(bytes32)", +"6d8b529a": "OwnerBase()", +"6d8c3912": "AicToken()", +"6d8ccf2a": "sellToEther(uint256)", +"6d8d151b": "determineBonus(uint256)", +"6d8d16b9": "StandardToken(string,string,uint8,uint256)", +"6d8f01d1": "CEOSignature()", +"6d8f4221": "masternode()", +"6d8f83cf": "_getBonusAmount(uint256)", +"6d90164e": "GetPrice()", +"6d916598": "stakingUnits(address)", +"6d91acba": "proposalText(uint256)", +"6d9218e5": "Notes(address,address)", +"6d927db0": "withdrawBalanceMaxSteps(uint256)", +"6d94425c": "_maxPeriodSalesLimit()", +"6d94dce1": "createAndBookCanvas(address)", +"6d952117": "maxBuyPrice()", +"6d9634b7": "releaseTokens(address[])", +"6d963a81": "buyp3d(uint256)", +"6d96a2aa": "delegateAddress()", +"6d96b537": "_computeIncentiveReward(uint256,uint256)", +"6d974ee2": "AcceptRealmOffer(uint256)", +"6d97537a": "TestRushCoin()", +"6d97786e": "sell(address,uint256,string)", +"6d97c665": "tokenBonusForSecond()", +"6d9814e1": "BToken()", +"6d98571a": "generalTokens()", +"6d9860d0": "makeFinality(uint256,address,address,bytes32,bytes32,uint256,uint256)", +"6d98c5e7": "AppleToken(uint256,string,string,bool)", +"6d98e9fc": "totalWei()", +"6d98ee4e": "getInitialState()", +"6d991cce": "openGroupNumber()", +"6d99aafd": "Collected_Ether()", +"6d99f652": "resetRaffle()", +"6d9aa034": "setNamePublicKeyAddress(address)", +"6d9af813": "updateprice(uint256,uint256)", +"6d9b06e8": "setProposalDeposit(uint256)", +"6d9b501a": "returnWalletTxCount()", +"6d9c2bda": "ADV_TEAM_LOCK_TIME()", +"6d9c8e86": "getCurrentSaddlePrice(uint256)", +"6d9cb37d": "govtAccount()", +"6d9cdbc6": "WALLET()", +"6d9cebb2": "setDiscount(uint8)", +"6d9d39b6": "isItOpen()", +"6d9d495f": "minMktTokens(address,uint256)", +"6d9dcdb9": "tgrNextPartContributor()", +"6d9f4eeb": "artistTrackCount(address)", +"6d9fed84": "getJackPotInfo()", +"6da05cc7": "sectionAvailable(uint256)", +"6da05f0f": "_requestRandom(uint256)", +"6da1339c": "_deposit(address,uint256)", +"6da1833c": "getInstitutionByName(string)", +"6da1d37a": "sumWei()", +"6da246ac": "approvePartnerAllocation(address)", +"6da28481": "balanceOfLockup(address)", +"6da36c06": "contract_admin()", +"6da3cd1a": "verifiedUsersOnlyMode()", +"6da44d61": "SportX()", +"6da49b83": "nodeCount()", +"6da4edff": "getPriceSpeedPercent()", +"6da4fd5c": "TheBeardToken()", +"6da4fe26": "nextReward()", +"6da50777": "FreddieToken(address)", +"6da61d1e": "payoutOf(address)", +"6da66355": "pause(string)", +"6da705f5": "isOwnerOfJob(address,bytes)", +"6da72e7a": "reclaimByReceiver(uint256,address,bytes32)", +"6da78903": "SwapCreated(address,uint256)", +"6da79a93": "bid(uint256,uint256,uint256,address)", +"6da84ec0": "calcMarketFee(bytes32,uint256)", +"6da9a969": "toBRFWEI(uint256)", +"6daa212f": "applyPayback(address,uint256)", +"6daa2d44": "raiseDispute()", +"6daa9f56": "setExhaustionTime(uint256)", +"6daaf67b": "REFERRAL_PROGRAMS()", +"6dabccc9": "setmsg(address)", +"6dabd069": "emission(address,uint256,bytes32,uint256)", +"6dac8bea": "PREMIUM_CATEGORY()", +"6dacda85": "LOCKPERIOD()", +"6dad2a91": "getWinningAmount()", +"6dae014c": "test_basic_sanity()", +"6dae022f": "verifyTx()", +"6daf0866": "Hungrify()", +"6dafc6b7": "destructOne(bytes32)", +"6db1218d": "getAPSchedule()", +"6db14a1c": "PaulSportsCoin()", +"6db17f8d": "KriptoNeed(uint256,string,uint8,string)", +"6db19eb8": "specialGym()", +"6db31c25": "pay(string,address,uint256,bool,bytes)", +"6db3a788": "createHero(string,uint256,uint256,uint256,uint256)", +"6db4ba51": "requireNotEmptyAddress(address)", +"6db4bbf0": "donotYYYDappToken()", +"6db5c8fd": "maxDuration()", +"6db5d3b7": "modifyCommission(uint256,uint256)", +"6db66268": "remainingTokensPerPeriod()", +"6db736df": "Writers(address)", +"6db75799": "set_amount(uint256,uint256)", +"6db76efd": "decreaseFrozenBalances(address,uint256)", +"6db7f77c": "requestEarlySettlement()", +"6db90900": "returnAllRoomsBalance()", +"6db9ec44": "IWTfund()", +"6db9ee4d": "MixenCoin()", +"6dba46ac": "aprMintAdjustment()", +"6dbb7bcd": "getExecutorRegistry()", +"6dbd6689": "gupSold()", +"6dbe060d": "hashTest(string)", +"6dbe21b8": "setBounty()", +"6dbe2ebc": "calcUserDivsTotal(address)", +"6dbe31eb": "testSubBalance()", +"6dbe4bee": "MoonToken(uint256,string,string)", +"6dbf8108": "withdrawBounty(address)", +"6dc043d7": "draw_number()", +"6dc0a997": "pushAllocation(address,uint256)", +"6dc12f1c": "EvMigration(address,uint256,uint256)", +"6dc1a075": "setMaxOpenAttacks(uint256)", +"6dc1f360": "VersionControl()", +"6dc214af": "bitCrystalEscrow()", +"6dc34462": "Timed(uint256,uint256,uint8)", +"6dc37dee": "changeReviewRules(uint256)", +"6dc3e97e": "addGame(bytes32,address,address,uint256)", +"6dc3edcf": "executeExecutable(uint256,uint256)", +"6dc455a4": "WinnerWithdrew(address,uint256,uint256)", +"6dc4faea": "withdrawnTeam()", +"6dc51f1e": "advisoryBoardFundManager()", +"6dc55f7e": "RANGEEND_7()", +"6dc56397": "career_path()", +"6dc57da6": "getTimestampOfDayStart(uint256)", +"6dc585b6": "toRICH(uint256)", +"6dc7a627": "canClaim()", +"6dc7d164": "addSignature(uint256,uint256,address)", +"6dc88e1f": "addAngelIdMapping(address,uint64)", +"6dc8dbd4": "calculateMaxTokensIssued()", +"6dc92426": "makeSellOrder(address,uint256,uint256)", +"6dc944f6": "withdrawTotalDevEarned()", +"6dc9ab89": "get_orderAddress(address,address,uint256,uint256,uint256,uint256)", +"6dca35da": "newCampaign(uint256,address,uint256)", +"6dcb0cf8": "typeOf(address)", +"6dcb672b": "EBanker()", +"6dcba059": "goToNextStep()", +"6dcd16d7": "computeBids(uint256)", +"6dcd6eb9": "withdrawPendingAmounts()", +"6dcdd00f": "Allowance(address,address)", +"6dce14cd": "LBTokenSale(uint256,uint256,uint256)", +"6dcea85f": "setMarket(address)", +"6dd01116": "getWishContent(uint256)", +"6dd0c3d8": "setENGDevAddress(address)", +"6dd0c51e": "RESERVED_STAFF_GROUP()", +"6dd0d091": "retaliate()", +"6dd13a29": "ICOStarted(uint256,uint256,uint256,uint256)", +"6dd186c4": "YeYingOil()", +"6dd1f71c": "RTokenMain(uint256,string,string,uint8,address)", +"6dd22ccd": "getMixParticipant(bytes32,uint256,uint256)", +"6dd23b5b": "constructor(address,address,address)", +"6dd28241": "deprecatedSince()", +"6dd2bfca": "setDevfee(uint256)", +"6dd35c7b": "topBalance(address,uint256)", +"6dd3a823": "Neptun()", +"6dd40168": "preSaleMinimumWei()", +"6dd40905": "getQuestionVotesAllCount(string)", +"6dd43d1f": "attachSubscriptionModule(address)", +"6dd4927b": "reName(string,string)", +"6dd4c13c": "allowsSignup()", +"6dd5b69d": "getConfig(bytes32)", +"6dd5bb11": "oraclize_query(string)", +"6dd6e673": "buySanSlot(address,uint256)", +"6dd6e87b": "checkOut(int256)", +"6dd749ba": "getSpaceById(uint256)", +"6dd77c5d": "etherToUSDRate()", +"6dd7d8ea": "vote(address)", +"6dd8d3bf": "buy_energy(address,uint32,uint32,uint64,uint32,uint64)", +"6dd9fde9": "transferTokensToNonEthBuyer(address,uint256)", +"6dda1291": "hotPotatoPrize()", +"6dda9b24": "bva(address,uint256,address)", +"6ddc7e65": "gracePeriodAfterRound0Target()", +"6ddcb442": "getPhaseStatus(uint256)", +"6ddd07f8": "getEngineById(uint256)", +"6ddd707f": "TDTToken()", +"6dde33ea": "deathData_a13()", +"6dde8b18": "removeWhitelistedTransfer(address,address)", +"6ddeaae0": "investorReferrals(address,address)", +"6ddf09c4": "ICToken()", +"6ddf12ae": "ecdouble(uint256[3])", +"6de00927": "GetUserRank(uint8,address)", +"6de09e28": "affiliatesAllocAddress()", +"6de0b375": "openBet(uint256)", +"6de12905": "updateMeta(string,string)", +"6de343cd": "SNTPlaceHolder(address,address,address,address)", +"6de3afc9": "EduCoin()", +"6de53001": "clearApproval(address,uint256)", +"6de5897c": "ECOMCASH()", +"6de60a07": "ContinueSuspendedEmployee(address,uint32,uint32)", +"6de6220b": "OwnerO()", +"6de65097": "OwnerRemoved(address,bytes32)", +"6de685f6": "START_TIME_SALE()", +"6de725a3": "callTx(bytes,address,uint256,bytes)", +"6de74bbe": "setratePreSale(uint256)", +"6de758a1": "PWGLToken(address,address)", +"6de79d17": "TIANYECoin()", +"6de7a31d": "getEvotTokenAddress()", +"6de84a4f": "bankMultisig()", +"6de996b4": "getPlayerSpaceshipAuctionPriceById(uint256)", +"6de9ebb1": "setBlogRegistry(address)", +"6de9f32b": "tokensMinted()", +"6dea2088": "MAX_FUNDS_RAISED_DURING_PRESALE()", +"6deaf623": "calculateEthToVibe(uint256,uint256)", +"6deb515d": "disapproveInvestorsInBulk(address[])", +"6dec665e": "motionWaiting(uint256)", +"6dec7a93": "setInfo(string,string,string)", +"6ded82f8": "isPaid(address)", +"6dee2032": "getOpenOrdersOf(address)", +"6dee275a": "c_STQperETH()", +"6deebae3": "subtract()", +"6deefc7a": "sellable()", +"6def1efc": "getPreviousFeeWindow()", +"6defbf80": "ready()", +"6defd595": "getCovfefe(uint256)", +"6defe0b9": "isTimeOver()", +"6defe888": "Criptomedicina()", +"6df006f3": "frozenToken()", +"6df03165": "setTimeOutAuthentication(uint256)", +"6df088bf": "winnerDecided(uint256,address,uint256)", +"6df0a7e7": "setContract(string,string)", +"6df0b557": "getPlayerSpaceshipAuctionById(uint256)", +"6df15719": "STWY()", +"6df1667c": "same(string,string)", +"6df26327": "additionalEmission()", +"6df26d14": "startEarlyStage1()", +"6df3edef": "getSavedBytes()", +"6df55024": "LogBuyTokens(address,uint256,string)", +"6df5ee2b": "withdrawPresale()", +"6df6ca7a": "getDivsBalance(address,address)", +"6df7f38f": "sellForBitcoin(address,uint256)", +"6df83012": "startLockUpSec()", +"6df8359f": "WorkOrderStarted(uint128)", +"6df86816": "ActionAgonPlat(address)", +"6df99d81": "CCH_TEL_AVIV_01()", +"6dfa8d99": "totalEarned()", +"6dfada86": "mintToken(address,uint256,address)", +"6dfc15a4": "changelp6(address)", +"6dfc2fa8": "isInProgress()", +"6dfd3c5a": "interestReceived()", +"6dfe512e": "initPGOMonthlyInternalVault(address[],uint256[])", +"6dfe869b": "Preallocation(address,uint256)", +"6dfe8a34": "setSkillName(address,uint256,bytes32)", +"6dff8216": "cbAddresses()", +"6e008b35": "calculateResult()", +"6e034f4d": "tokensaleBuyTokens()", +"6e038c4f": "firstTotalSupply()", +"6e051dba": "ReserveTokensHolderMock(address,address,address)", +"6e0550e5": "stepOneEndTime()", +"6e0560c3": "doNotAutoRefund(address)", +"6e05d3ca": "Z1CoinGenesis(address)", +"6e064f6a": "HedglyStakingToken()", +"6e06a9ce": "changeTimeOneSession(uint256)", +"6e06ac9d": "UNSPAM(string,string,uint256,uint256,bool)", +"6e0712b1": "setIcoParams(uint256,uint256,uint256,uint256,bool,bool,uint32,uint32,uint256)", +"6e075e30": "reinvestAmount(uint256)", +"6e0763f3": "RPNCoin()", +"6e07979d": "tokenBlogs()", +"6e080d86": "register(string,string,bool,string,address,uint256,uint256)", +"6e083bc7": "credoEthExchangeRate()", +"6e094b67": "TPS()", +"6e09a4ab": "diff(uint256[],uint256[])", +"6e0b0c80": "MIToken()", +"6e0bd282": "destroy(bytes32)", +"6e0c7867": "createDataObject(bytes32,address,bytes32,address,bytes32)", +"6e0cd415": "isPositionCalled(bytes32)", +"6e0d98fe": "setProbabilities(uint32[])", +"6e0da3ee": "WoodToken(uint256,string,string)", +"6e0da971": "tokensSoldIco()", +"6e0dd984": "setCapUsd(uint256)", +"6e0e7e85": "withdrawERC20Compatible(bytes32,uint256,uint256,uint256[])", +"6e0f8d68": "stage_1_price()", +"6e0fb1c5": "FOUNDER2_STAKE()", +"6e101967": "set_iconiq_pre_kyc_bonus_denominator(uint256)", +"6e106628": "getWinningReportingParticipant()", +"6e114511": "decreaseTotalSupply(uint256)", +"6e1180f8": "setOversightAddress(address,bool)", +"6e120023": "TimestampScheduler(address,address,address)", +"6e125009": "contractTokensAvailable()", +"6e1286fc": "getReward(uint256[])", +"6e12b46e": "requiredPoints()", +"6e13cdfe": "claimH2()", +"6e13d418": "stakeAddress(uint256)", +"6e140e6c": "TetherToken(uint256,string,string,uint8)", +"6e1479c0": "testControlCreateNewRevisionNotOwner()", +"6e14b71b": "PetsCoin()", +"6e15266a": "fifty_two_weeks()", +"6e1636bb": "logOrderCanceled(address,address,address,bytes32,uint8,uint256,uint256)", +"6e164e23": "claimTokens(uint256,address)", +"6e16f9ed": "iBird()", +"6e173a7f": "storeBlockHeader(bytes,bytes)", +"6e17e7c2": "nextFieldIndex()", +"6e18980a": "transferByLegacy(address,address,uint256)", +"6e18eba5": "ethUSDPrice()", +"6e18ff05": "getRefInfo(address,address)", +"6e1907cc": "test21(uint256)", +"6e1a1336": "setString(string,string)", +"6e1b6bcc": "checkMyBet(address)", +"6e1bd323": "MAX_TOKEN()", +"6e1cf038": "getNumNiceBets(uint256)", +"6e1d3c0d": "sudoku()", +"6e1d7d5e": "EtherIbe()", +"6e1e063f": "claimableRefund(address)", +"6e1e34c7": "TokensBoughts(uint256)", +"6e1ece25": "totalFeesValue()", +"6e1f777d": "createTokenToTeam()", +"6e2117f7": "forFunction()", +"6e217d30": "setBuyCourse(uint256)", +"6e219667": "p3()", +"6e21fc87": "_airdrop(address)", +"6e223710": "getRockInfo(uint256)", +"6e224034": "totalCrowdCoin()", +"6e22aea0": "AIW(uint256,string,string)", +"6e22d33e": "getBytesValue(string)", +"6e22e32b": "setMonethaAddress(address,address,bool)", +"6e233918": "buyTank(uint32)", +"6e241c5c": "_createExoplanet(string,address,uint256,uint32,string,uint32,uint8,string)", +"6e247f29": "Transfer_of_authority_logic(address)", +"6e2653ca": "AirSwapHandler(address,address,address)", +"6e275bd2": "transferFrom(address,address,address,address,uint256)", +"6e27d889": "lockTokens(uint256)", +"6e2857f2": "setEscrow(address,address)", +"6e287154": "setLocalRevenuPercent(uint256)", +"6e293817": "transferWithReference(address,uint256,bytes32,string)", +"6e2940eb": "NhCoin()", +"6e2a2d0a": "result_amount()", +"6e2adeee": "SweetToken(string,string,address)", +"6e2bf348": "getDiscountByAmount(uint256)", +"6e2c10a1": "unitedNations()", +"6e2c732d": "add(uint64,uint64)", +"6e2cde85": "drawPot(string,string)", +"6e2d53a6": "TreasureCoin()", +"6e2d604a": "thrash()", +"6e2da4b3": "proposeAction(address)", +"6e2db8d7": "addWhiteList(address,uint256)", +"6e2e2e4d": "showMessage(bytes32,uint256,string)", +"6e2e9c3b": "contributedUsd()", +"6e2e9ee1": "setKYCRequiredToReceiveFunds(bool)", +"6e2ede03": "getCollateralMarketsLength()", +"6e2edf30": "ETCSurvey(address)", +"6e2f0bb8": "newSaddleryCon(address)", +"6e2f10bd": "changeMerchantBeneficiaryAddress(uint256,address)", +"6e2f5f12": "sendToFaucet(uint256)", +"6e2fd470": "sharedExpenseWithdrawn()", +"6e30418b": "totalPlayerBalance()", +"6e30d411": "showDevBalance()", +"6e317da7": "changeRedeemer(address)", +"6e31f704": "DARIC()", +"6e321105": "losePercent()", +"6e32295e": "mDestroyTokens(address,uint256)", +"6e329aa9": "getPotato()", +"6e32cf8e": "admin_transfer_tempLockAddress(address,uint256,uint256)", +"6e33bc13": "COINS_TO_HATCH_1STRIPPERS()", +"6e349188": "MAXSOLD_SUPPLY()", +"6e34b4e4": "getPoolOwner(uint256)", +"6e3532fa": "getSubscriptionFee()", +"6e353435": "inputauction(uint256,uint256,string)", +"6e353a1d": "emergencyWithdrawal(address)", +"6e359afa": "changeTrueUSDOperation()", +"6e36893a": "ICOInvestment(address,uint256,uint256,uint8)", +"6e3706c8": "PRE_DURATION()", +"6e377202": "isAuthed(address,address)", +"6e3825d2": "checkMyTicket(uint32)", +"6e39891c": "currentDividendAmount()", +"6e39eb85": "resetNumberOfCandidates()", +"6e3a1e5c": "requestEthereumChange(string,string)", +"6e3ae353": "changeOrigDev(address)", +"6e3aff90": "getOrderString()", +"6e3bbebd": "ZJLTToken()", +"6e3c5759": "claim_partnerPreICOTokens(address)", +"6e3d5a9d": "getTopCompanyBlocksInBetween()", +"6e3de78a": "UNFOMO(string,string,uint256,uint256,bool)", +"6e3e1318": "takeFee(uint32)", +"6e3e82f9": "_computeCut(uint256,uint256)", +"6e3f3f1a": "proposal(address,uint256,address)", +"6e3f7ba0": "TokenFrozen(uint256,string)", +"6e3f8550": "walletReserve()", +"6e403cd7": "sendBread(address,uint256)", +"6e40975d": "ICOToken()", +"6e415d37": "farewellTo(address)", +"6e417c69": "executeRequest(uint256)", +"6e41a78f": "DRC()", +"6e41b1ad": "nameTaken(uint256)", +"6e41efb2": "ThawTransfers(address,bool)", +"6e4264ce": "initiateDeposit()", +"6e4324a3": "Cryptopus()", +"6e439078": "makeLogCancel(address,address,address,address,uint256,uint256,uint256)", +"6e441752": "teamToken2019()", +"6e44fcea": "isHoldTokens()", +"6e459cf1": "CrowdSale(address,uint256)", +"6e4602c8": "TimereumX()", +"6e46408d": "indexOfOwners(address,address)", +"6e4647d6": "vendingCreateCollectible(uint256,address)", +"6e468a8a": "CelticsCoin()", +"6e48670f": "zeroSub(uint256,uint256)", +"6e48a035": "closeVote(uint256)", +"6e49b1e1": "AnythingAppTokenPreSale(address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"6e4a6874": "setReceiver4()", +"6e4a7b26": "initializeCoins()", +"6e4a9f4d": "Nguen()", +"6e4ac25f": "TokenData(address,address)", +"6e4b0222": "setactivelevel(uint256)", +"6e4bfb37": "GenaroTokenSale(uint256,uint256,address,uint256,bytes32)", +"6e4c42a0": "getGameSides()", +"6e4c9829": "amountsOf(address)", +"6e4ca716": "totalEthRecieved()", +"6e4dd931": "GetPotInfo()", +"6e4df96e": "produceWine()", +"6e4e5c1d": "revealedCurves()", +"6e4e87e0": "sendQuickPromoBonus()", +"6e4eb9cb": "getSeedsSinceLastEvent(address)", +"6e4ed796": "blocksPerRound()", +"6e4f33b0": "change_delay(uint256)", +"6e4f68b5": "PONO()", +"6e4f749e": "freezeMethod(address,bool)", +"6e500306": "Bst()", +"6e50640c": "WinikToken()", +"6e506ee4": "managementTokenAllocation()", +"6e50c39c": "serializeState(uint256,int256[2],uint256[2],int256,bytes32,address,uint256,uint256)", +"6e50eb3f": "setEndsAt(uint256)", +"6e51be3d": "UmmahDinar()", +"6e52dcd6": "pauseChannels()", +"6e5320d1": "changeTokenInformation(string,string)", +"6e53909a": "setLockAdmin(address,bool)", +"6e5390d2": "woodAddress()", +"6e5406e3": "_0xLitecoinToken()", +"6e54181e": "right75(uint256)", +"6e5452fe": "OUTCOME_RANGE()", +"6e553f65": "deposit(uint256,address)", +"6e555a18": "testCreateContract(bytes32,uint16,bytes32,uint256,uint64,bytes32,uint64,bytes32,uint64,uint64)", +"6e556725": "initialEndPrice()", +"6e56dce5": "collectEtherBack()", +"6e56e5eb": "_emitUserBinded(uint256,address,bool)", +"6e56e895": "test_defaultPermissions()", +"6e575537": "MAX_OWNER_PERS_SITE()", +"6e57e7e0": "payOut(address,uint128,int256)", +"6e581673": "buyPackWithERC20Tokens(uint8,address)", +"6e593210": "getActiveSellOrders(uint256)", +"6e596aef": "moveCeiling(uint256)", +"6e59e570": "sendToOtherBlockchain2(string,string,address)", +"6e59f3f3": "createChannel(address)", +"6e5ac882": "root(address)", +"6e5aef4d": "getInitTime(uint256)", +"6e5b064c": "basicPricePerEth()", +"6e5deca4": "YaoDun()", +"6e5ecdff": "updateDependencies()", +"6e5f375e": "setGameStartedDividendPercentage(uint256)", +"6e5fd38d": "registerMultiple(address[],bool)", +"6e609af2": "FulfillmentUpdated(uint256,uint256)", +"6e60cf61": "freedWinPoolToTeam()", +"6e6260fa": "thresholdNewTokenPair()", +"6e62825a": "SCDCToken1()", +"6e62cdab": "nextRoundWinner()", +"6e62de19": "fundFailed()", +"6e63015c": "getCertifiersCount()", +"6e630649": "changeState(uint256,uint8)", +"6e635673": "deletePullPayment(uint8,bytes32,bytes32,string,address,address)", +"6e638d3b": "claimIFSReward(address)", +"6e640f4c": "candidat()", +"6e658fbe": "myFundsExpireIn(uint256)", +"6e6656d8": "setCallStackSize(uint256)", +"6e66644d": "changeStakingFeesOperation()", +"6e667c35": "contentURI(uint256)", +"6e66cc38": "TraceToToken(address,uint256,uint256,address)", +"6e66f6e9": "tokenReward()", +"6e676b69": "changeVotingRules(uint256,uint256,uint256)", +"6e67b803": "bid3(address,uint256[],uint256[])", +"6e680ee7": "CREATORS_WALLET_ADDRESS()", +"6e68751c": "revokeVestedTokensFor(address)", +"6e68ec59": "getSoilHumdtyException(bytes32)", +"6e69e7d7": "maximumNumberOfLoops(uint256,uint256)", +"6e6a1dc3": "weightedVoteCountsOf(uint256,uint256)", +"6e6a42ec": "retraitStandard_1()", +"6e6b4bed": "getArt(string)", +"6e6b8004": "upgradeGemsSpecial()", +"6e6beb07": "PreSaleBuy()", +"6e6bfca0": "cancelJobByProvider(bytes32)", +"6e6c4c58": "CrowdTmoney2()", +"6e6ca42f": "RefundError(address,uint256)", +"6e6ca6f5": "getLastTransferred(address)", +"6e6d83d2": "cancelLoanRequestAtIndexByLender(uint256)", +"6e6d9a6c": "Token(address[],uint256[])", +"6e6e8a02": "addWhitelist(address,address[])", +"6e6ed399": "priceValidSeconds()", +"6e6f2fe5": "DentacoinToken()", +"6e6fe3d6": "ClaimMTU(bool)", +"6e6ff8a9": "lockDays()", +"6e70096e": "withdrawEarnings(uint256)", +"6e70cb07": "getAssetHolders()", +"6e70de82": "transitionState()", +"6e720693": "RevokeEvent(address,address,uint32)", +"6e722fcb": "getIsBonusClaimed(uint256,address)", +"6e725302": "getRatio(uint256,uint256,uint256)", +"6e730a67": "setSecondStageEndsAt(uint256)", +"6e733f50": "getCap(string)", +"6e743fa9": "punkBids(uint256)", +"6e74774a": "MHCTokenIssue(address)", +"6e752548": "finalizeStartTime()", +"6e754efb": "daysnumber()", +"6e761a73": "claimDevReward(address)", +"6e76a89f": "validateReserves()", +"6e76fb4c": "MemberRemoved(address)", +"6e779481": "ADVISORS_CAP()", +"6e77d4bb": "CryptoMountainsToken()", +"6e787a48": "correctOriginalSupply()", +"6e78e95f": "CryptoLeaders()", +"6e79ae56": "deleteOpenAction(string,string,string,string,string)", +"6e7a824f": "TestCoin(uint256,string,string)", +"6e7b698f": "drops(address[],uint256)", +"6e7bc3e5": "addContractOwner(address)", +"6e7c1700": "getJobName(uint256)", +"6e7c1c2b": "getWithdrawDigest(bytes32,address,uint256,uint64)", +"6e7c77b6": "testClaimTokens()", +"6e7d9dc6": "transferCreatureOwnership(address)", +"6e7e3b2b": "contributors()", +"6e7f26ab": "distributeToken(uint256,address[])", +"6e80a869": "minimalInvestmentInWei()", +"6e823b47": "controlledBurn(address,uint256)", +"6e82e86a": "getHash(uint256[])", +"6e843a74": "AgreementUrlRu()", +"6e8480e0": "TokenMetadata(string,uint8,string,string)", +"6e8595f5": "CheckAddressVerified(address)", +"6e861c0e": "deauthorizeContract(address)", +"6e8755af": "updateRewardsFor(address)", +"6e880e4d": "PreminedAsset()", +"6e88147e": "tradeReport()", +"6e88274b": "GetBetBalance()", +"6e883095": "checkPrizes(address)", +"6e8851a9": "initSale2()", +"6e885bd7": "workerPoolHub()", +"6e88865a": "teamAddressFreezeTime()", +"6e88a7bd": "referrerFee()", +"6e88b4ef": "tgeStageBlockLeft()", +"6e88d5fa": "judgeFakeTokenAndTransfer(uint256,address)", +"6e899550": "setString(bytes32,string)", +"6e89d517": "Deposited(address,uint256,bytes)", +"6e8a3438": "TransferStatusChanged(bool)", +"6e8a3d4b": "SerpentIsRunning()", +"6e8a6d12": "updatePriceAddress(address)", +"6e8ab641": "Arbitragebit()", +"6e8ac0c8": "developersAllocation()", +"6e8add02": "setMainsale(address)", +"6e8b7c23": "numcalls()", +"6e8c2caf": "gameRunning()", +"6e8c57e6": "minBalanceToAllowContractCreation()", +"6e8d3007": "CapitalTechCrowdsale(address,address,address)", +"6e8d82af": "swapToken(address)", +"6e8dad74": "retrieveAccountBalance(bytes,bytes)", +"6e8dba91": "getInitialData()", +"6e8dc135": "WinnerSelected(address,uint256,uint256,uint256)", +"6e8ddc7a": "LuxArbitrageToken()", +"6e8de595": "setBoardMember(uint256,uint256,uint256)", +"6e8e39d1": "QRG(uint256,string,string)", +"6e8f7142": "put(address,string,string)", +"6e8f8d69": "getInvestorsCount(uint256)", +"6e900256": "addData(bytes32,bytes32,bytes32,bytes32[],uint256[],uint256[],uint256[],uint256[])", +"6e9067fb": "getRole(string)", +"6e90a590": "expectedTotalSupply()", +"6e914d97": "requestAdminTokenTransfer(address,address,uint256,string)", +"6e929838": "PAXToken(address,address,address,bool)", +"6e929d4c": "sendIBTCTokenToMultiAddr(address[],uint256[])", +"6e932270": "dewhitelist(address)", +"6e939d05": "moveFromState(bytes32,int8[128],uint256,uint256,bytes)", +"6e93dbdc": "koCommissionAccount()", +"6e940a29": "changeHost(address)", +"6e942390": "howMany(uint256,uint256)", +"6e942f82": "buildingCostWei()", +"6e947298": "getETHBalance()", +"6e94d278": "burnReputation(uint256,address,address)", +"6e95a066": "IouRootsPresaleToken(string,string,uint8)", +"6e96433f": "multiPartyTransferFrom(address,address[],uint256[])", +"6e96463f": "BonusesUpdated(address,bool)", +"6e965a89": "calculateWeeklyTokensSupply()", +"6e968bca": "getSidesArray(uint256)", +"6e96bbeb": "crowdsalePurchasesLoaded()", +"6e96dfd7": "_setPendingOwner(address)", +"6e97041e": "SCPS1Token()", +"6e970dfd": "retireMaster(address)", +"6e974fd6": "approveWalletFeeData(uint256)", +"6e977865": "dadFab()", +"6e978d91": "right90(uint256)", +"6e98a92b": "fundManagementAddress()", +"6e995bd9": "updateChannelState(uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"6e9960c3": "getAdmin()", +"6e997972": "modSymbol(string)", +"6e99d52f": "COOLDOWN_PERIOD()", +"6e9a41c3": "DraftCrowdsale(uint256,uint256,uint256)", +"6e9af3f7": "giveForce(address)", +"6e9b134e": "LogCancelDelivery(address,string)", +"6e9b41d4": "releaseForGoolaTeam()", +"6e9c3683": "getIndexByProposalId(bytes32)", +"6e9c4650": "prepaidUnits()", +"6e9c4d0a": "rateTenant(uint256)", +"6e9c931c": "stake(uint256,address,uint256)", +"6e9cfb79": "itemReturn()", +"6e9d3b9d": "AtoOneCoin(uint256,string,uint8,string)", +"6e9e48ef": "tokenIdToOwner(uint256)", +"6e9ffe2b": "updateTransferRestrictionVerifier(address)", +"6ea007b3": "dailyLimitLeft()", +"6ea056a9": "sweep(address,uint256)", +"6ea07a36": "recoverSimple(bytes32,uint8,uint256,uint256)", +"6ea11f65": "togglePublicMatches()", +"6ea141cb": "AddBonusToList(bytes32,uint256,uint256)", +"6ea150e2": "changeWithdrawTimeRange(uint256,uint256)", +"6ea16f3a": "tryRefund()", +"6ea16f81": "houseTraits(uint256,uint256)", +"6ea34ce4": "getPartById(uint256)", +"6ea38199": "getMoreAuctionDetails(uint256)", +"6ea3b6d1": "ICO_Finished()", +"6ea3f1cb": "GetFreebie()", +"6ea405d3": "Tax()", +"6ea412b1": "Exchanged(address,uint256)", +"6ea42555": "pack(uint256)", +"6ea451e4": "setSaleLimit(uint8)", +"6ea51811": "icoStartP4()", +"6ea521d9": "_voteAs(address,uint256,uint256,uint256,string)", +"6ea68360": "newMasterCopy()", +"6ea69c91": "closePositionOnBehalfOfRecurse(address,address,address,bytes32,uint256)", +"6ea6b71b": "tokensRaised()", +"6ea6d76d": "initGame(string,bool,uint256)", +"6ea6db3c": "token(uint256,string,uint8,string,address,uint256)", +"6ea6f0c3": "initializeTopUpLimit(uint256)", +"6ea7064b": "contractorProposal(uint256,address,uint256,string,bytes32,address,uint256,uint256,uint256)", +"6ea79583": "team_wallet()", +"6ea798bc": "MyMiniToken(uint256)", +"6ea8efea": "getGameNum()", +"6ea928d9": "getSymbolHash()", +"6ea96bcd": "defaultBuyerLastPaidAt()", +"6eaa0f16": "CCTOKEN()", +"6eabb2f6": "getWineryOperation(string,address,uint256)", +"6eabcd69": "__abortFuse()", +"6eac86d4": "settleTransaction(bytes32)", +"6eaccf4c": "privilegedTransfer(address,address,uint256)", +"6eacd48a": "ownerPauseGame(bool)", +"6eadcc87": "tokenSetup(address,address,address,address,address)", +"6eaddad2": "setDevPercent(uint256)", +"6eadeba0": "resolve_block_hash(uint256)", +"6eae0843": "getTeam(uint16,uint8)", +"6eae555d": "amendDisputeDispersal(uint256[])", +"6eaefc87": "tokenExchangeRateBase()", +"6eafbe88": "ChangeTeamHolder(address,address)", +"6eb060ea": "setMinBuyPublic()", +"6eb09ce2": "ethbalance(address)", +"6eb1546d": "_removeBid(uint256)", +"6eb1e09a": "fechVoteMainInfoByStage(uint256)", +"6eb21929": "softcapReached()", +"6eb227ce": "getCurrentWeek()", +"6eb25ed8": "distributionOne(address)", +"6eb267ab": "CxNtoken(address)", +"6eb2a749": "isMaySale()", +"6eb2f0cc": "payShareholders(uint256)", +"6eb305aa": "getTimestampInSeconds()", +"6eb47ea7": "linkTeamToUser(address,bytes32)", +"6eb5197d": "getFirstAdmin()", +"6eb58224": "castDocumentVote(uint8,bytes32,bool)", +"6eb5ad4f": "lockPriceChange()", +"6eb5bef0": "addressSupporters()", +"6eb5ebae": "FidgETHSpinner()", +"6eb6c8fb": "MoneyToken()", +"6eb6ffa7": "initialQuorumPercent()", +"6eb769d2": "tokenTotalSold()", +"6eb7b4c2": "underdogInfo(uint256)", +"6eb7c67b": "_getEthPrice()", +"6eb85627": "Stalincoin()", +"6eb86537": "getAllPackage()", +"6eb91683": "donateForContractHealth()", +"6eba2b13": "getOrder(address)", +"6eba68f9": "ICOFactoryVersion()", +"6ebb6d80": "attack(address,uint8)", +"6ebbe863": "updatePublishContract(address)", +"6ebbfd5a": "addItemTo(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"6ebc0af1": "tranche()", +"6ebc6200": "CURRENSEE(address,address,address)", +"6ebc8c86": "getContract(uint256)", +"6ebcf607": "_balances(address)", +"6ebd9d7f": "setApiRegistryContractAddress(address)", +"6ebdac12": "removeProductFromCart(uint256)", +"6ebe299f": "adventureDataContract()", +"6ebf10fe": "storeHeader(bytes,address)", +"6ebf5223": "ProofOfSheepM()", +"6ec012e7": "saleIndex()", +"6ec03f7a": "removeCrydrView(string)", +"6ec05f13": "EURWEI()", +"6ec069f8": "teamOneDivsUnclaimed()", +"6ec0ce6e": "_isController(address)", +"6ec232d3": "gasprice()", +"6ec236ed": "calculateTaskDeposit(uint256)", +"6ec23e53": "OPTIToken()", +"6ec25a06": "tokenCreated(address,uint256,string)", +"6ec2e979": "bothHaveAttribute(address,address,bytes32)", +"6ec2f223": "createVestingInternal(address,uint256,uint256,uint256,uint256,bool,address,uint256)", +"6ec32f9c": "getRepayAmount(uint256)", +"6ec386d3": "AutoChainTokenCandy()", +"6ec3af26": "addTrustedIssuer(address,bytes)", +"6ec40f9e": "GAME_POOL_INIT()", +"6ec4c951": "claimWithdraw(address,uint256)", +"6ec4e5b8": "callERC165SupportsInterface(address,bytes4)", +"6ec5239f": "setAvatar(string)", +"6ec62f29": "assertEq28(bytes28,bytes28)", +"6ec6d4a6": "setMinLimit(uint256)", +"6ec7743d": "getSubjectClaimSetEntryAt(address,uint256,uint256,uint256)", +"6ec782d9": "changeWaitTime(uint32)", +"6ec84711": "organizer6()", +"6ec99dd0": "testGetBlobStore()", +"6ec9b125": "EtherSphere()", +"6eca017e": "releaseForYoobaTeam()", +"6eca4a50": "UKTTokenController(bytes32,bytes32)", +"6eca6a9e": "updateRecordName(uint256,string)", +"6ecaa195": "coolness(uint256)", +"6ecb97cd": "getInitializeNumOutcomesValue()", +"6ecbb556": "UAPCrowdsale(uint256,uint256,uint256,address,address)", +"6ecc7bcf": "CeezetTokin()", +"6ecc9ad9": "getInstallments(uint256)", +"6ecd1129": "nextAvailableLevel()", +"6ecd7b70": "CancelSale(uint256)", +"6ece5937": "endGame(uint256,string,address)", +"6ece7d88": "doVote(uint256,uint256)", +"6eced029": "getMsgGasAfter()", +"6ecf9f7b": "hype()", +"6ed0b9d7": "changeStage(uint8,uint256,uint256)", +"6ed28ed0": "store(uint256,uint256)", +"6ed2d8c6": "giantFYou(address,uint256)", +"6ed2fc5c": "PRESALE_WEI()", +"6ed33343": "dsp()", +"6ed33b98": "addSupportedToken(address,address,uint256,uint256,uint256)", +"6ed34394": "totalLockPrincipal()", +"6ed3f468": "sendsignature()", +"6ed40f9d": "isValid(string,string,uint256,uint256)", +"6ed43eb0": "getInvestorList(uint256)", +"6ed4d0c7": "dataCenterGetResult(bytes32)", +"6ed51d94": "isValidBuyOrder(address,address)", +"6ed55eb5": "setUserRating(address,uint8)", +"6ed5777e": "BuyHORSEtokens()", +"6ed5f880": "withdrawGTA(uint256)", +"6ed65dae": "sendCount()", +"6ed6da9e": "getUserById(uint256)", +"6ed6e17a": "updateCurGamePrizeInfoWithDraw(uint256,address,uint256)", +"6ed776b2": "createToken(address,address)", +"6ed7c013": "move_monsters()", +"6ed7e058": "rememberAllRequiredBlockHashes()", +"6ed84231": "TOURNAMENT_BATTLE()", +"6ed89fbc": "_transport(uint256,uint256)", +"6ed963b7": "EthereumTravelCrowdsale(uint256,address,address)", +"6ed9c19f": "calculateMasked(address,uint256)", +"6ed9fd89": "avgGas(address)", +"6edb2e8a": "sellPropertyAndChangeOwnership(address)", +"6edb4cf6": "testThrowRetractLatestRevisionDoesntHaveAdditionalRevisions()", +"6edb9ab0": "batchDepositTo(address,address[],uint256[])", +"6edbba2e": "numFree()", +"6edbd134": "hasHash()", +"6edbeb1c": "verificationHoldersTimestampMap(address)", +"6edc7ba7": "getExchangeFunctionSignatures(address)", +"6ede2106": "EtherIn(address,uint256)", +"6ede696b": "PaymentProcessor(address)", +"6edf1cc4": "getWithdrawalForAddress(address,address,uint256)", +"6ee0400d": "ICOBonusPercent1week()", +"6ee1844e": "KnownOriginDigitalAsset(address)", +"6ee18573": "addWhitelistOperator(address)", +"6ee2627b": "maxFundLimit()", +"6ee2e362": "CleanCurrentRoomAndRound(address)", +"6ee2ed5d": "totalSpinners()", +"6ee31a18": "upgradeToken(address)", +"6ee3d453": "modifyGameItemPrice(uint256,uint256)", +"6ee3e896": "setDefeats(uint256,uint16)", +"6ee4b475": "InitialBlockCount()", +"6ee4d553": "cancelOracleRequest(bytes32,uint256,bytes4,uint256)", +"6ee5d676": "getSumCourse()", +"6ee61483": "changeBuyin(uint256)", +"6ee63f1f": "MineableToken()", +"6ee64345": "endMainSale()", +"6ee678ae": "_burn(address,address,uint256)", +"6ee74b3c": "Test5()", +"6ee7826f": "_getRoundedPrice(uint256)", +"6ee78aea": "isMultiple(uint256)", +"6ee7a063": "createInstance(address,bytes32,address,bytes32,bytes)", +"6ee8067f": "whitelistManagerAddr()", +"6ee84bb7": "SDD_Erc223Token()", +"6ee88301": "getRoomOwner(uint256)", +"6eea4820": "QBT()", +"6eeb553f": "pollBurnCompleted()", +"6eeb7a36": "setCreator(address,bool)", +"6eeba5c6": "short_party()", +"6eebad9e": "Jitech(uint256,string,uint8,string)", +"6eebb73f": "activateZone(int32[],int32[],uint8[],uint8[])", +"6eec21d6": "vault_deposit(address,uint256)", +"6eec2dd2": "Released(bytes32)", +"6eec3db6": "allocateAdvisorTokens()", +"6eecb7c2": "getDomainTypehash()", +"6eecf81a": "SetPrcntRate(uint256)", +"6eedc46d": "tokenWalletChange(address)", +"6eee2dad": "mintRewardTokens(address,uint256)", +"6eeeca03": "finalizeSale2()", +"6eef0326": "placeBetOdd(uint256)", +"6eef2cb7": "functionTwo()", +"6eef7a05": "bytesToString(bytes32)", +"6eef908f": "startReceiveTicket()", +"6ef0a5cf": "singleTransferToken(address,uint256)", +"6ef0c864": "SetDataAddress(address)", +"6ef0f37f": "setHome(address)", +"6ef181a8": "setRarityMultiplier(uint8)", +"6ef1a114": "transfersRemaining()", +"6ef1f3a6": "luckyOne(uint256)", +"6ef27042": "CentraToken()", +"6ef33b8f": "getInfo3(address,address)", +"6ef3732d": "fixDividendBalances(address,bool)", +"6ef3ef7e": "approveData(address,uint256,bytes)", +"6ef4e8db": "getCalcToken()", +"6ef61092": "withdrawn(address)", +"6ef72aaa": "BattleResult(address,address,uint256[],uint256[],bool,uint16,uint256,uint32,uint32)", +"6ef791bb": "WylSistContract()", +"6ef8c661": "addInfoListItem(bool,address,address,uint256,string)", +"6ef8d66d": "renouncePauser()", +"6ef958df": "changeSource(string,string,uint256)", +"6ef98b21": "withdrawOwner(uint256)", +"6ef9bc29": "phase3EndingAt()", +"6ef9e145": "weiBalances(address)", +"6efa0621": "SPPSeriesB(uint256,string,uint8,string)", +"6efa629d": "releaseFees()", +"6efa6a67": "PAYOUT_PCT()", +"6efab8f2": "overloadedMethod(address)", +"6efaf16c": "disableAutoSeller()", +"6efbb60a": "addONG(bytes32,string,string)", +"6efbd610": "coownerPrice()", +"6efd1adf": "RATE_EXPONENT()", +"6efd5974": "signedApproveHash(address,address,address,uint256,uint256,uint256)", +"6efe39a3": "getEncryptedKeyFromRequest(uint256,uint256)", +"6efef04d": "setLevelEndDate(uint256,uint256)", +"6eff2044": "onlyOwnerOrManager()", +"6eff8071": "addFuelFree(uint256,uint256,uint256,uint256)", +"6eff96f2": "rafflepot()", +"6effb219": "changeCreditFundNIMFAAddress(address)", +"6effb579": "stop_sell(uint256)", +"6effdda7": "Trade(address,uint256,address,uint256,address,address)", +"6effe1c7": "startSale2Phase()", +"6effec50": "forwardCall(address,uint256,bytes)", +"6f00a3cf": "DumpDivs()", +"6f00ad8a": "lastmoney()", +"6f00fd97": "createTokenTransaction(address,uint256,uint256,uint256,uint256,address,uint256)", +"6f015889": "Activate(address,uint256,string)", +"6f0166c4": "GeoGems(address)", +"6f01d915": "addHedge(address,uint256,uint256,bytes3,bytes3,uint64,bytes32,bytes32)", +"6f020775": "totalCoinLock()", +"6f022ac4": "cancelMigration(address)", +"6f02483f": "EtherGang()", +"6f024899": "Destructible()", +"6f025aec": "MolikToken()", +"6f025c84": "MithrilDemo()", +"6f03e307": "setTiersInfo(uint8,uint256[],uint256[],uint256[],uint256[],uint8[])", +"6f03e4f9": "getClientBalances(address)", +"6f0470aa": "candidates()", +"6f04ff33": "increaseSalesBalance(address,uint256)", +"6f0503ad": "setDerivePayoutDistributionHash(bytes32)", +"6f05994e": "addBalanceFor(address,uint256)", +"6f0663f0": "RadioCoin()", +"6f069cfe": "technik()", +"6f06fdb3": "hasAgreement(uint256)", +"6f079f90": "getPricingEndsAt()", +"6f086122": "preSignedHashing(bytes8,address,address,uint256,uint256,uint256,uint8)", +"6f08effa": "manualBonus()", +"6f09240f": "runScript(bytes,bytes,address[])", +"6f0963b0": "isMemberBlocked(address)", +"6f096f75": "investorPayment(address,uint256)", +"6f0a150f": "restartRound(bool,bool)", +"6f0a74d5": "_8_poluchaetLesha()", +"6f0ac394": "getCP(address)", +"6f0b5180": "buyFor(address)", +"6f0cd3a6": "m_active()", +"6f0cfab6": "DNSResolver()", +"6f0d0a38": "CrocsFarmer()", +"6f0f45d2": "OPERATIONS_ADDRESS()", +"6f0fccab": "getTokenName(address)", +"6f0fdce8": "Task(address)", +"6f1003c4": "minEsteemAmount()", +"6f109879": "impl_transferMSM(address,address,uint256)", +"6f10d1a0": "addNewToken(bytes32,address,address)", +"6f10fdbd": "totalPlay()", +"6f117190": "getInitialTerrain(uint256,uint256)", +"6f11a859": "availableAirdrop(address)", +"6f1236e1": "ETHPriceProvider(string)", +"6f1296d2": "wrapEther()", +"6f13b95d": "editTokensForHour(uint256)", +"6f13e01b": "EthVenturePlugin()", +"6f13eb09": "BlockChainZB(uint256,string,string)", +"6f1427b2": "icoInProgress()", +"6f147f5c": "addWhiteListed(address[],uint256[],uint256[])", +"6f14dc62": "storehouse(bytes32)", +"6f152670": "max_fundingGoal()", +"6f15847f": "recordInfo(bytes32,uint256,string)", +"6f159c4f": "founder_token()", +"6f16a595": "PRICE_MIN()", +"6f17a516": "ln_fixed3_lnr(uint256,uint256)", +"6f181303": "ScriptCallable()", +"6f18337d": "IHF(address,uint256)", +"6f18d3f5": "traded_token_is_seeded()", +"6f1a5b72": "updateTokenHolder(address)", +"6f1a78cc": "deleteWebsite(address)", +"6f1aa1f5": "requestTokenIssue(address,uint256,string)", +"6f1ae5de": "_itemRemoveMarkets(uint256)", +"6f1c8a51": "_getHash(address,bytes32)", +"6f1ca0c2": "preicoSupply()", +"6f1cecd8": "unreadMessages(address,uint256)", +"6f1db0b7": "createNewBid(string,uint256)", +"6f1e54c3": "sellMyTokensAmount(uint8,uint256)", +"6f1e6419": "MANHATTANPROXYYORKAVE()", +"6f1e738c": "updateISIN(string)", +"6f1fb766": "sealedBids()", +"6f200ce3": "transferBlock(address,address,uint256)", +"6f204f20": "getChannelInfo(address,address,uint8)", +"6f2130d3": "amountOfCRs(address)", +"6f2223c5": "getRefereeAddress(address)", +"6f227851": "USDValue()", +"6f2293ab": "transferFrom(address,address,uint256,bool)", +"6f22993c": "moveTokens(address,address,uint256)", +"6f22d6a5": "losses()", +"6f24fe30": "notifyPledgeNotPayed(uint256)", +"6f253319": "CurrentGoldPrice()", +"6f259077": "STAGE_ONE_TIME_END()", +"6f2594a0": "moduleMultiOwner(address)", +"6f264776": "buy10tickets()", +"6f264b2e": "requiredTokenAddress()", +"6f26d566": "dailyLottery()", +"6f28a853": "assertNotSpent(uint256,int256,bytes32,bytes32)", +"6f28ee09": "storeHash(string,string)", +"6f290893": "Refund(address,uint256,uint256,int256)", +"6f29c88a": "exchangedNum()", +"6f2b1226": "upgradeBank(address)", +"6f2f098b": "Cite(bytes32)", +"6f2f7a57": "getWinNumber()", +"6f2fc06b": "proxyPayments(address)", +"6f2feb0a": "approveAndSell(uint256,uint256)", +"6f307dc3": "underlying()", +"6f30e1ee": "PunkBidWithdrawn(uint256,uint256,address)", +"6f3165d3": "UpgradeRig(uint8,uint256)", +"6f320970": "vernamCrowdSale()", +"6f322fef": "Atra()", +"6f326ac6": "checkStorageProof(bytes32[],address)", +"6f32a937": "min256(uint256,uint256,uint256)", +"6f32b2ac": "setRSPScienceAddress(address)", +"6f32b4cb": "mainICOSecondWeekEndTime()", +"6f3355af": "isBreakingCap(uint256,uint256)", +"6f335870": "sections()", +"6f3395b2": "_tradeEtherDelta(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256)", +"6f33ae68": "HouseFeeUpdate(uint256)", +"6f341804": "activeteICO(uint256)", +"6f34a7ff": "sanctuary()", +"6f35c749": "SECONDS_OF_DAY()", +"6f362c2b": "latestSpender()", +"6f3640f7": "getRealUsdAmount()", +"6f36ce79": "insert_deal(address,address,uint64,uint128,uint32)", +"6f370b20": "Austriachain()", +"6f373cb7": "PullRequestClaimed(uint256,uint256)", +"6f374a12": "setBool()", +"6f37f48b": "firstToken(address)", +"6f38e410": "maxLevels()", +"6f3921ee": "extended()", +"6f3a7561": "SimpleAuction(address)", +"6f3ad341": "ICO_ONE()", +"6f3b2819": "secondChainHNw2()", +"6f3b4759": "lockMultiple(address[])", +"6f3b60d6": "latestOrderId()", +"6f3b6d00": "RESERVED_TEAM_SIDE()", +"6f3b8ce2": "getArrayAddress(bytes32)", +"6f3b97a4": "DeactivatedContract(uint256)", +"6f3bb97f": "unsetVipAddress(address,address)", +"6f3be1da": "lift_ban()", +"6f3be6b7": "ELEXTROCOIN()", +"6f3bf6ea": "GMC()", +"6f3c8566": "redeemWarriors()", +"6f3d8043": "valueAfterReducingFee(uint256)", +"6f3f6870": "CertAdmins(address)", +"6f3fe404": "updateBalances()", +"6f414fbb": "sale1Started()", +"6f4215b1": "setEthRate(uint256)", +"6f42879f": "wantsToFight(uint256,uint256)", +"6f42934d": "getTimePurchase()", +"6f42c901": "teamAddresses(address)", +"6f43233a": "getAnyAddressTokenBalance(address,address)", +"6f44c4d7": "recipientVIP()", +"6f4618d8": "firstReserveAllocation()", +"6f468289": "CONTRIB_PERIOD2_STAKE()", +"6f475e7f": "validateTransfer(address,address)", +"6f476cbc": "opMinted()", +"6f479f57": "changeSellingPrice(uint256,uint128)", +"6f47b075": "test_set_get_Policy()", +"6f47e218": "sharesRaised()", +"6f4812e2": "testFailControllerInsufficientFundsTransfer()", +"6f48455e": "checkMinMaxInvestment(uint256)", +"6f488063": "getPOOL_edit_7()", +"6f494049": "registerPublicKey(uint256,uint256)", +"6f49a3c0": "openChest()", +"6f4a2cd0": "distributeRewards()", +"6f4b31cc": "Bastonet()", +"6f4bda17": "numberOfPlayers()", +"6f4be234": "EMJAC()", +"6f4c6443": "invite(address,address)", +"6f4ca36e": "Tracto()", +"6f4ce56a": "indexOf(bytes32)", +"6f4d469b": "addMembers(address[])", +"6f4d6f5d": "ShitToken(address)", +"6f4d80e5": "m_state()", +"6f4db6a7": "hasRepeat(uint8[4])", +"6f4dd69c": "testSetBalanceUpdatesSupply()", +"6f4dfede": "GetExpireTime()", +"6f4eb87e": "test_removeFromRegistry()", +"6f4ebb70": "calculate_reward(uint256,address,uint256)", +"6f4efd53": "POTJ()", +"6f4f2ec3": "ERC20Template(string,string,uint8,uint256,address)", +"6f500df5": "claimCofounditTokens(address)", +"6f503750": "LogPermit(bytes32,bytes32,bytes32)", +"6f503e67": "vestingOf(address,uint256)", +"6f512e61": "setSgdToEthRate(uint256)", +"6f51d01f": "getUserBlockNumber(bytes32)", +"6f52167d": "payDuel(address,string,address,string)", +"6f53a48a": "Bitprize()", +"6f53da8f": "benefitFunds()", +"6f53df6c": "EtheraffleLOTPromo()", +"6f540fe0": "setCampaign(address)", +"6f54e4df": "candyper()", +"6f54e89e": "getMaximumFunds()", +"6f5736c6": "getFreeFalcon()", +"6f5831cb": "startTokensSale(address,uint256,uint256,uint256,uint256)", +"6f584bd8": "View_TrustlessTransaction_Info(uint256)", +"6f58659b": "totalRewardIssuedOut(address)", +"6f59a5cc": "curBubbleNumber()", +"6f5b286d": "tokenUnsold()", +"6f5cca83": "withdrawForCompany()", +"6f5d616b": "execPermissions(address)", +"6f5d64fa": "FSNASAddress()", +"6f5d712e": "TOTAL_TOKEN_CAP()", +"6f5da839": "Token(uint256,string,string,uint8)", +"6f5da961": "transferEntityOwnerPull(address)", +"6f5e7398": "dasToken()", +"6f5eb4b5": "publicSell(uint16)", +"6f5f20ce": "INITIAL()", +"6f5f7ba2": "CreatedYUPIE(address,uint256)", +"6f5f8f74": "Cryptoloans()", +"6f5f9498": "InitializedManager(address)", +"6f6007bb": "StartdatePresale()", +"6f609714": "FrameworkToken()", +"6f625567": "roleAdd(address,string)", +"6f62cba3": "resetUserRefBalance(address)", +"6f62e755": "changeGatewayAddr(uint32,address,string)", +"6f63d2ec": "left66(uint256)", +"6f64234e": "sendFunds(address,uint256)", +"6f64824b": "setErc677token(address)", +"6f64ccf5": "checkVestingTimestamp(address)", +"6f652e1a": "createOrder(address,uint256,uint256,uint256)", +"6f6541e0": "SetLot(uint256)", +"6f656c2d": "getPhaseEmissionType(uint256)", +"6f6640c1": "AnthillFarmer()", +"6f66d23b": "adminGetWorldData()", +"6f6781d3": "getPosition(uint8)", +"6f68d634": "acceptTrusteeOwnership()", +"6f68fffd": "setEndSaleTime(uint256)", +"6f691500": "getMySecondAmount()", +"6f698fb5": "setMinimumQuorum(uint256)", +"6f6aadfb": "SnovPresale()", +"6f6b32ad": "PVXToken()", +"6f6b6963": "VestingCreated(address,address,address,uint256,uint256,uint256,uint256,uint256)", +"6f6bdbe3": "specialUsers()", +"6f6c0244": "generateShortLink()", +"6f6c0759": "onlyPayForFuel()", +"6f6c7234": "setApoderadoVerify(bytes32,bytes32,bytes32)", +"6f6cd9f5": "isElectionPeriodProposal(uint256)", +"6f6d3694": "removeRound(uint256,uint256)", +"6f6eacee": "availbleToken()", +"6f6f828e": "removeAllTournamentContenders()", +"6f6f9bef": "getLandInfo(uint256)", +"6f6ff3bc": "setVesting(address)", +"6f7030f6": "calculateCuts(uint256)", +"6f704aa6": "TreasureToken(address,address)", +"6f70a22f": "deadlineThree()", +"6f70b9cb": "getWinningChildUniverse()", +"6f7154c8": "getIsStopFunding()", +"6f71f407": "freeze(address,uint8)", +"6f72fd20": "calculateBonus(uint256,uint256)", +"6f74174d": "finalizeIt(address)", +"6f741cff": "getPauserList()", +"6f7429ab": "modifyDescriptionManual(uint256,address,string)", +"6f7495cb": "unproducedCaps()", +"6f74dafe": "getGodAddress()", +"6f752f09": "backendContract()", +"6f75b00c": "removeBuyer(address)", +"6f75cd14": "DappToken()", +"6f766f20": "refundTRA()", +"6f7705c2": "becomeRichest(string)", +"6f77926b": "getUser(address)", +"6f784c5b": "totalAmountOnICO()", +"6f78ee0d": "rap(bytes32)", +"6f7920fd": "tokenCreationCap()", +"6f79301d": "getCreationTime(bytes32)", +"6f796d86": "JACK(string,string,uint8,uint256)", +"6f799cf9": "_amountRaised()", +"6f7b5a56": "getDEditorArbitraryData(bytes32,bytes)", +"6f7d9acf": "setupInitialSupply()", +"6f7f461d": "manager1()", +"6f7fc989": "teamIssue(address,uint256)", +"6f80602b": "NewOrleansCoin()", +"6f80dc23": "obfuscatedHashDataBlock(string,string)", +"6f8177f4": "MentalhealthToken()", +"6f81adf6": "Resilium()", +"6f81bdd8": "setRate(uint256,bool)", +"6f826a7d": "testIsEmpty(bytes)", +"6f82e068": "initialSupplyPerChildAddress()", +"6f838a8e": "TESTCOIN1()", +"6f8489af": "CreateGMT(address,uint256)", +"6f84eb6c": "setPatronReward(uint256)", +"6f853964": "setPriceCoeff(uint256)", +"6f8543a6": "CoWithdraw()", +"6f85c7e4": "WAITING_PERIOD()", +"6f85e62c": "buyTokens(string)", +"6f863c21": "inviteIter_()", +"6f872022": "setSectionForSaleToAddress(uint256,uint256,address)", +"6f874abb": "setgasUsed(uint256)", +"6f87dddd": "getPlayerStageKeys()", +"6f882086": "KNCBalance()", +"6f893e0d": "LeeroyPremiumToken()", +"6f8b44b0": "setMaxSupply(uint256)", +"6f8b7574": "createTransaction(address,address,uint256,string,uint256,uint256)", +"6f8c33a6": "getGoldDepositOfAddress(address)", +"6f8c3c0e": "MIToken(uint256,string,uint8,string)", +"6f8c3e4c": "SaraAndMauroToken()", +"6f8c9575": "yearFor(uint256)", +"6f8d3eb0": "withdrawPAXTR(uint256)", +"6f8d998c": "dist(uint256,uint256)", +"6f8dca87": "GetCost(uint256,uint256,uint256)", +"6f8e0a08": "getreward()", +"6f8e1fb6": "testOverflowResistantFraction()", +"6f8ee91c": "level_6_amount()", +"6f8f1de5": "mock_resetLatestPayday(address,address)", +"6f8fb2c3": "CROWDSALE_WEI_GOAL()", +"6f8fccd7": "BioChainCoin()", +"6f9090db": "setwinPercent(uint32)", +"6f90be06": "playFromBalance()", +"6f910c4b": "checkProviderOwnerSupply(uint256,bool)", +"6f9125a5": "pylonSelled()", +"6f9170f6": "isWhiteListed(address)", +"6f919068": "LogUnPause(bytes32)", +"6f91cec0": "ProvideWorkOrder(address,address,address,uint128)", +"6f92096b": "setGasForward(address)", +"6f923a7c": "LockSAToE()", +"6f925535": "revokeAccess(address,uint8)", +"6f92f186": "multiply(address)", +"6f93638e": "isSolvent(uint256,uint256)", +"6f941290": "SelfDropTokens(address,uint256)", +"6f9477c0": "BanAccount(address,bool)", +"6f947d6d": "_emitPublicCapabilityAdded(address,bytes4)", +"6f94e260": "buybackPriceOf(uint256)", +"6f94e502": "getVoter(uint256,uint256)", +"6f954161": "changePreJackpotBidLimit(uint256)", +"6f95dd0b": "RATE_DAY_21()", +"6f9607e5": "countYears()", +"6f964659": "depositMint(address,uint256,uint256)", +"6f969c2d": "getNonFungibleBaseType(uint256)", +"6f96f269": "Mehrancoin()", +"6f977413": "Property(string,string)", +"6f993a74": "rollFour(address,uint8,uint8,uint8,uint8)", +"6f9a023c": "theultimatepyramid()", +"6f9a5eab": "createTx(uint256,address,uint256)", +"6f9b0b7d": "getCurrentGameState(bytes32)", +"6f9b4c1d": "createCastleSale(uint256,uint256,uint256,uint256,uint256)", +"6f9ba978": "_reward(address)", +"6f9c3c8f": "fundReserve()", +"6f9c6194": "P2E()", +"6f9cd7b2": "mirtestToken()", +"6f9cdccd": "setMarketMaker(address,address)", +"6f9d257d": "CONFLICT_END_FINE()", +"6f9d73db": "BuyRocketForSaleEvent(address,address,uint32)", +"6f9f51c7": "RefundsDisabled()", +"6f9fb98a": "getContractBalance()", +"6f9fbd7c": "generateCrabHeart()", +"6f9fdd66": "trust()", +"6f9ff0fa": "GetDynamicCardNum(uint32,uint256)", +"6fa00f07": "agreementSignedAtBlock(address)", +"6fa01c8e": "init(bool,address,uint128,uint128,address,uint64,address,uint256)", +"6fa07d0d": "oraclize_query(uint256,string,bytes[5])", +"6fa0bf39": "getRankDynamic(uint256)", +"6fa1532e": "UpdateBalance(address,uint256,bool,address)", +"6fa15c21": "setPreIcoEndDate(uint256)", +"6fa1d6da": "totalAwardCalculation()", +"6fa23eac": "ShouWangXingAIGO(uint256,string,uint8,string)", +"6fa23f73": "setSupplyLimit(uint16,uint16)", +"6fa25d9a": "Log2_fnc(address,bytes32,uint256,string,string,string,uint256,bytes1,uint256)", +"6fa28249": "getClaimsIdByType(uint256)", +"6fa4095e": "emitHavvenUpdated(address)", +"6fa42742": "arbitrator_question_fees(address)", +"6fa4c766": "revertFunds(address,address,uint256)", +"6fa4f5f7": "setRefPercent(uint256)", +"6fa58335": "tgeDuration()", +"6fa64cd6": "miningIncentiveTokens()", +"6fa65c4f": "MICRODOLLARS_PER_DOLLAR()", +"6fa668f3": "weiForPayment()", +"6fa6ad21": "getDeprecated(bytes32)", +"6fa6c360": "validateTranscriptHash(address,uint256,bytes32)", +"6fa81a3a": "IcoTimeRangeChanged(address,uint256,uint256)", +"6fa87f66": "Moongang(uint256,uint256,uint256)", +"6fa88aa3": "BrazilvsCostaRica()", +"6fa8de90": "changeMeatParameters(uint256,uint256)", +"6fa9ba07": "ShowMsg(bytes)", +"6fa9e255": "LiftUpVets(string,string,uint8,uint256)", +"6faa22a5": "polyToken()", +"6faa52b3": "getOwnerHistoryAt(bytes32,uint256)", +"6faaeca2": "finishBallot(bytes32)", +"6fab5ddf": "Fal1out()", +"6fab94c1": "BitplusToken()", +"6fac46e5": "numberOfRazzes()", +"6fad0a4d": "KPOP_CELEB_CONTRACT_ADDRESS()", +"6fae3d76": "access(address)", +"6faed0e5": "set_master_exchange_rate(uint256)", +"6faf4803": "BitcoinDiamondTest()", +"6faf9323": "TokensPurchased(address,address,uint256,uint256)", +"6fb1eb0c": "commissionFee()", +"6fb1edcd": "sellAllOutcomes(uint256)", +"6fb2d01e": "calculateBonusForHours(uint256)", +"6fb37c18": "TChainToken()", +"6fb3ba9e": "setWorking(bool)", +"6fb438dc": "getTotal(uint256[])", +"6fb487fc": "getListener(address)", +"6fb4adff": "changeFundWallet(address)", +"6fb642de": "setActionContract(address,bool)", +"6fb65c7f": "grantReserveToken()", +"6fb66278": "ratePreICO()", +"6fb6fde6": "AuthAdmin(address,bool,uint256)", +"6fb7110f": "BuckySalary()", +"6fb7b52e": "addCheck(address,address,uint256,bool)", +"6fb7e588": "encodeTokenId(int256,int256)", +"6fb7f147": "getPendingExplore(address)", +"6fb7fc8b": "deltaBalances(address,address,address[])", +"6fb84e84": "fetchVoteInfoForVoterByIndex(uint256,address)", +"6fb8a70d": "responseCounts(uint256)", +"6fb8b885": "RESERVED_TOKENS_FOR_ROI_ON_CAPITAL()", +"6fb93e15": "BuyARXtokens()", +"6fb99dfb": "EventRemoveManager(address,address)", +"6fb9a2b4": "newCrowdsale()", +"6fba4aa9": "GUOcoin()", +"6fba7544": "setMinStartingPrice(uint256)", +"6fbaaa1e": "currentMultiplier()", +"6fbb222a": "setExtendedPlayerAttributesForPlayer(uint256,uint8[])", +"6fbb439e": "assign(string)", +"6fbc15e9": "upgradeTo(address,bytes)", +"6fbc8456": "setUID(uint256,uint32)", +"6fbcbd4f": "WarriorGenerator(address,uint32[])", +"6fbcd0f6": "AnitiToken(address,uint256,uint256)", +"6fbcd1fb": "_getAltarRecord(uint256)", +"6fbd6f6b": "acceptContactRequest(address)", +"6fbdae47": "getArrayInfoForDepositCount()", +"6fbde40d": "setSaleAuctionAddress(address)", +"6fbe769d": "cards_black_total()", +"6fbf466c": "unscannedCaps()", +"6fc141da": "lastPaydayTS()", +"6fc14837": "setMaxStake(uint256)", +"6fc1cbbd": "RexToken()", +"6fc21429": "setgamecardintro(uint256,string)", +"6fc351c2": "Elsevier(uint256,uint256)", +"6fc3911c": "checkVerificationStatus(address)", +"6fc39a38": "changeAgencyReceiver(address)", +"6fc3b0b6": "getTime4(address)", +"6fc3c817": "confirmer()", +"6fc4f2c2": "isOnPreAuction(uint256)", +"6fc559bb": "tokenGrants(uint256)", +"6fc651f3": "TokenAGC(uint256,string,string)", +"6fc65924": "getDisputeEndTime()", +"6fc6df36": "fYou(address,string,string)", +"6fc8e920": "icoBonus4EndDate()", +"6fc90a2f": "submitSolution(uint256,string,bytes)", +"6fc98ee1": "mintTokens(address,address,uint256)", +"6fc9958a": "initBundle(uint8,uint256)", +"6fc9d5e4": "changeCompareTo(uint256)", +"6fca2023": "getSharedAccountsLength()", +"6fcac869": "BONUS_4_DAYS()", +"6fcaea0c": "set_iconiq_presale_open(bool)", +"6fcb0153": "issuanceLastAverageBalance(address)", +"6fcb1500": "defaultSweeper()", +"6fcb4463": "signUpOn()", +"6fcbb546": "extractOre(string)", +"6fcc52e7": "gujarat()", +"6fcdcb3e": "setOwnerLink(address,uint256[2])", +"6fce2d65": "updateAccount(uint256,uint16,bytes32,uint16,bytes32)", +"6fceaea2": "convertToMiniGGC(uint256)", +"6fcebff8": "ConversionSentToShapeShift(uint256,address,address,uint256)", +"6fceecf8": "withdrawRestriction(address)", +"6fcfbe85": "FAFA(address)", +"6fd075fc": "addPlayer(address,uint256)", +"6fd09735": "createDistrito(uint256,address)", +"6fd1bdea": "setProduct(uint256)", +"6fd2e6d0": "TFFC()", +"6fd37039": "WebPaisa()", +"6fd396d6": "lastRewardTo()", +"6fd3a2bc": "createTokensManually(address,uint256)", +"6fd3db86": "withdraw(uint256,bytes32,uint256)", +"6fd42b32": "safeWithdrawal(address)", +"6fd44086": "adviserSupply()", +"6fd463ed": "addressOfTokenUsedAsReward1()", +"6fd5036d": "userChannelsCount(address)", +"6fd507f2": "Tube()", +"6fd5790d": "getCuota(uint256)", +"6fd59b01": "foundationFundMultisig()", +"6fd5ab58": "getTextBytes96()", +"6fd5ae15": "level()", +"6fd63728": "feeFunds()", +"6fd7c035": "EventRedeemStatic(address,uint128,uint256,uint256)", +"6fd7c34c": "setMemberRegistry(address)", +"6fd8282f": "priceLastUpdateRequest()", +"6fd86d44": "emitAccountUnfrozen(address)", +"6fd902e1": "getCurrentBlockNumber()", +"6fd9101f": "ACAToken(uint256,address)", +"6fd9227e": "TokenSold(address,uint256,uint256,bool)", +"6fd98bee": "updateTimes(uint256,uint256)", +"6fda5534": "rockOwningHistory(address)", +"6fdada81": "proofOfRich(string,string)", +"6fdb4f42": "revokeUsers(address[])", +"6fdbc590": "CreateDil(string)", +"6fdc202f": "ownerTransfership(address)", +"6fdc45a3": "BangdiToken(address)", +"6fdca5e0": "setOpen(bool)", +"6fdcc8a9": "listRecords()", +"6fdd2ab4": "createStage(uint8,uint256,uint256,uint256,uint256)", +"6fdd5f58": "ShopKeeper(address)", +"6fde3dc0": "getRunesValue(uint256)", +"6fde8202": "upgradeabilityOwner()", +"6fde90bc": "setCCH_edit_2(string)", +"6fdf9a3f": "sendToRstForAddress(address)", +"6fdf9f28": "setBDError(uint256,bytes)", +"6fe00356": "investorIDs()", +"6fe02e98": "tier3Rate()", +"6fe0e395": "initialize(string,string,uint256,uint256)", +"6fe11695": "isMajority(uint256)", +"6fe12f07": "proverka6()", +"6fe1dbec": "sendSupportETH(address,uint256)", +"6fe1f6b4": "BAD_ERC20()", +"6fe33720": "YOTOKEN()", +"6fe356ea": "moduleIsExist(string)", +"6fe3a567": "tokenMigrated()", +"6fe3ef7c": "resolveEntityAddress(address)", +"6fe497f0": "lockStatus(address,bool)", +"6fe4c195": "lockAddress(address,address,uint256)", +"6fe5091e": "collectPayout(uint256)", +"6fe5b536": "testFailSetEnforceRevisionsNotOwner()", +"6fe64289": "RepuToken()", +"6fe665e9": "SlotMachine()", +"6fe691dc": "getUserTransactions()", +"6fe69dee": "RealtyCashToken()", +"6fe7567b": "_subPurchasedFrom(address,uint256)", +"6fe7f51c": "saleWasSet()", +"6fe83236": "getAllCardAddressesCountOfOwner(address)", +"6fe8c29e": "JEY()", +"6fe8f9c5": "freeTokens()", +"6fe9e7d7": "freezeUserFunds(address,address,uint256,uint256)", +"6fe9f632": "preICOrates(uint256)", +"6febfd02": "getSiteRewards(uint256)", +"6fee558c": "getHookOperatorContractAddress()", +"6fee8458": "burnExcess()", +"6feef2bf": "cancelTknOffer()", +"6fef4fa9": "setAllowedToSell(bool)", +"6ff026e7": "purchased_snt()", +"6ff03fc2": "_removeMaster(address)", +"6ff08dd6": "calcWhiteBase(uint256)", +"6ff10dd7": "TrioPeriodicTransfer(address)", +"6ff1c9bc": "emergencyWithdraw(address)", +"6ff1ed71": "pickUp(uint256)", +"6ff1f2b8": "refererPercent()", +"6ff26ebb": "longBuy()", +"6ff2817c": "batchDetachAssets(uint256[])", +"6ff28657": "Josephtoken()", +"6ff2c12a": "setMiniPoolEdit_6(string)", +"6ff36340": "eTimesChain()", +"6ff46ba7": "deathData_a10()", +"6ff5a670": "PortalToken()", +"6ff6c4b8": "setCreatorFeePercent(uint256)", +"6ff73201": "setCooldownTime(uint256)", +"6ff79410": "numberOfComponents(address)", +"6ff89159": "revokePermission(address,string)", +"6ff8a27e": "buyTokens(address,uint16,address)", +"6ff8e332": "allowedAirDropTokens()", +"6ff93476": "tokensAllocatedForFs(address,address)", +"6ff968c3": "successor()", +"6ff97f1d": "allTokens()", +"6ff9db5b": "msgHash(bytes)", +"6ffa1257": "etherSoftCap()", +"6ffa1caa": "double(int256)", +"6ffa1d48": "LogCreateICO(address,address,uint256)", +"6ffa1ea7": "getRegulatorProxy(uint256)", +"6ffa714d": "extractDepositCommitmentRecord(address[],uint256[])", +"6ffb341e": "calculateKebabBuy(uint256,uint256)", +"6ffbff9c": "importMET(bytes8,bytes8,address[],bytes,bytes32[],uint256[],uint256[],bytes)", +"6ffc0896": "checkIfSuccess(bytes32)", +"6ffc13ab": "POMPAMCOIN()", +"6ffc22b8": "finalizeReservedAddress(address)", +"6ffcc719": "bet(uint256,uint256)", +"6ffd673d": "getcomp()", +"6ffe67f2": "autoDestruct()", +"6ffea7bd": "preToken()", +"6fff0652": "changePlayerTeam(uint256,uint256)", +"6fff15ee": "percPoints(uint256,uint256)", +"6fffffff": "HDK_Crowdsale()", +"70011870": "credexx(address,address,address,uint256,uint256,uint256)", +"7001a2a2": "elcoin()", +"7001fcc2": "closeImports()", +"700215d0": "SellFinishedAutos()", +"70021705": "watchVideoC(address)", +"7002a4e0": "setPartIndex(uint256,uint256[])", +"7003433a": "setRealityCheck(address)", +"70037a71": "setPresaleWhitelist(address,bool)", +"7003a1a3": "EosBlock()", +"7003ce6f": "UController()", +"70049c1c": "forwardEherToOwner()", +"7004a914": "ArbitraryLocker(address,uint256,uint256,uint256,uint256)", +"7006d538": "verificaCertificato(string,bytes32)", +"7007adc9": "finalBlockNumber()", +"7008a4a3": "firstWavePrice()", +"70090164": "PRIVATE_ADDRESS()", +"70097106": "addContent(string,string,uint256)", +"700a7db1": "setCriterionTime(address,uint256)", +"700b7025": "EthereumHotCoin()", +"700c9474": "addUsers(address[])", +"700d3230": "isPiSale()", +"700dd5eb": "AuthorityNotified(string,string)", +"700df1f6": "setMigrationStabitcoinAddress(string)", +"700e17b5": "setData(uint256,uint256,uint256,uint8[])", +"700e8660": "Marriage(string,address)", +"700ef803": "SafeBox()", +"700f1a77": "clampMax(uint256,uint256)", +"700f3a1d": "addToken(string,int256,bytes)", +"700f4e40": "test_invalidProxyOwnershipTransfer()", +"700f55b2": "addTx(address,address,uint256,uint256)", +"700f9d03": "logEndBal()", +"7010129a": "tokenTransferVIP(address,uint256)", +"70101735": "releaseReservedTokens()", +"70103ea7": "setPaperFee(uint128)", +"70107c43": "_zthToken(address)", +"70119d06": "incBy(uint256)", +"70133e4f": "Xerium()", +"70144f8f": "activate_kill_switch()", +"70150282": "FMWorld(address,address,address)", +"701513c0": "addBooking(uint8,uint256)", +"70152dcf": "getPrivacyCoins()", +"7015913c": "end(bytes32)", +"70165470": "ICOFailed(uint256,uint256)", +"70183a4d": "stakingExpiration(bytes32)", +"70185b7e": "updateSafeBalance(uint256)", +"7018665b": "transferMS(address,uint256)", +"7018dcb9": "getCastleNum()", +"7018e950": "affiliatesAllocation()", +"701969e5": "Penny()", +"701ab8e2": "exitOnHaltFromCustodian(address,address[],uint256[],bytes,bytes,bytes32)", +"701adee0": "setRequireWhitelistedAddress(bool,address)", +"701b4063": "balanceOfAtBlock(address,uint256)", +"701b4631": "hasPayroll(address)", +"701b8826": "forwardTo(address,address,address,uint256,bytes)", +"701c3c28": "setApprovalRequirement(bytes4,uint8)", +"701d9ced": "setTransferOCE(bool,bool)", +"701dfb92": "HTL()", +"701e1dfc": "lastInvestorsProfit()", +"701e5729": "canInvest(address,uint256,uint256)", +"701e5e71": "_purchaseCar(uint256)", +"701fd0f1": "reveal(bytes32)", +"702056de": "REKTtoken()", +"70206b05": "RepoHandler(address)", +"7020940a": "NewHope()", +"7020b511": "chainlinkTokenAddress()", +"702123ae": "unitCoinProduction(uint256)", +"70212761": "saleFinalize()", +"7021fad7": "CheckoutLimDay(address,uint256)", +"70220023": "participantsFor3rdSale(address)", +"70228400": "isDonatedEthTransferred()", +"7022b58e": "confirm()", +"70232f00": "ClaimESC(address,uint256)", +"70239222": "testSHA256()", +"70239f0b": "serverEndGameConflictImpl(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,bytes32,bytes32,uint256,address)", +"70243248": "PeggleCoin()", +"70245bdc": "adoptCat()", +"7024ce7b": "BONUS_ICO_ROUND1()", +"702510be": "payoutSelf()", +"7025b3ac": "ROLE_KYC_VERIFIED_INVESTOR()", +"70260363": "setSignatures(bytes32,bytes)", +"702617e7": "ERC20(string,string,uint8)", +"70267867": "_addBridgeTokenFee(uint256,uint256)", +"70269774": "changeOwnerOfMonethaUsersClaimStorage(address)", +"7026aa04": "getProveHash(address,bytes32,string,bool,uint256,bytes32,uint256)", +"70279554": "budgetAllocation()", +"7028439e": "bonusPreIco()", +"70284d19": "grant(address)", +"7028875e": "changeStrikePrice(uint256)", +"7028b3b9": "GetConsentDataCount()", +"7029144c": "init(string,string)", +"702921f5": "month()", +"70296790": "clever()", +"702a3eff": "advisorsCliff()", +"702a5f4f": "setLLV_edit_31(string)", +"702b5f0b": "calcHash(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address)", +"702b7bc3": "insertValueBonus(uint8,uint256,uint256)", +"702c25ee": "nextMinimumPodSize()", +"702c728e": "changeCloudsPerEth(uint256)", +"702c789e": "select_bua_position(uint256)", +"702c9535": "distributeBalances(address[],uint256[])", +"702cbbae": "isTokenAvailable(uint256)", +"702d58d8": "JiJieHao(uint256,uint8,string,string)", +"702efdf3": "suspended()", +"702f23a6": "transferAndFreezeMulti(address[],bytes32[],address,address,uint256[],uint256[],uint256[])", +"702f9019": "Start_qui_qz(string,string)", +"702fc7da": "ReviewModel()", +"70316f00": "getUserPayedInCurrentRound(address)", +"70320126": "newWitness(address)", +"70320234": "calcBonusTokens(uint256)", +"70324b77": "darknodeBalances(address,address)", +"70327ea1": "disableSelfDestruction()", +"70328770": "logBalance(uint256)", +"7032d758": "SevillavsBayern()", +"7033e4a6": "supportsHistory()", +"7033f1ac": "TNTCoin()", +"7034c939": "test_2_destroyTokens()", +"7034d190": "MainSaleBuy()", +"70354053": "UCCoinSaleIsOff(uint256)", +"70357e79": "func_08D3()", +"70359b36": "makeSuperVisor(address)", +"7036f9d9": "force_partial_refund(address)", +"7037602a": "setAccountData(address,uint256,uint256)", +"7037ec6f": "payEntryFee()", +"70385f0d": "LogPolicyAccepted(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"70387c59": "hashVerification(bytes32)", +"70393686": "getCOOHashing(address,uint256)", +"703950ff": "viewKarmaVotes(uint256)", +"7039dcdc": "setBEY(address)", +"703a6beb": "getUnitsPerPeriod()", +"703aca29": "competitorExists()", +"703add31": "animatorAddress()", +"703b1411": "requestSellforFX(uint256)", +"703bf4a5": "disableGame(address)", +"703bf91f": "betSingle(uint256)", +"703c8a99": "_openProvider(bool,string,string,uint256,string,uint8,bool,address)", +"703dbd81": "setPI_edit_8(string)", +"703df793": "updateHardCap(uint256)", +"703e905b": "getIndexByHash(string)", +"703eb724": "addShare(address)", +"703ee574": "CoinvillaSupply()", +"703f5e8a": "CaDataAddress()", +"703fa81c": "DOSTToken()", +"7040bcc9": "createPlayer(uint256,uint256,string,string,string,string,string,string,address,uint256)", +"7040f3e5": "Allowance()", +"70416f7e": "getCurrentEthFee()", +"7041d925": "outsize(bytes4,bytes)", +"704248ec": "tokensale()", +"7043ca8e": "getOwnerNickName(address)", +"7044ce75": "setTKC(address)", +"70459be2": "transferLeftover()", +"7045b469": "TotlePrimary(address)", +"704691e1": "LuckToken()", +"70477e2b": "Rozium()", +"70480275": "addAdmin(address)", +"7049a425": "MarketboardListingDestroyed()", +"7049cd98": "LinglongCatCore()", +"704a60f1": "failUserRefund(uint256)", +"704b164d": "setTradeIsOpen(bool)", +"704b6c02": "setAdmin(address)", +"704d4051": "periodSalesLimit()", +"704d4ab1": "getLostAndFoundMaster()", +"704d4db0": "poolTotal()", +"704dcedd": "LSC(uint256,string,string,uint8)", +"704dd019": "changeFeeCut(uint8,uint8)", +"704e3dda": "TokenSalePaused(bool)", +"704e7437": "bountyPart()", +"704f1b94": "registerUser(string)", +"704f236c": "freezeAccount(address,address,bool)", +"70502c5a": "testDeleteItem()", +"70505653": "arbitrationAddress()", +"705099b9": "refundTicket(address,uint256)", +"7050a1ea": "TimetechToken()", +"705145c4": "quickCloseChannel(bytes32,address,uint256,address,uint256)", +"7051a831": "setIsContainerForReportingParticipant(bool)", +"7051b075": "TransferToBuyer(address,address,uint256,address)", +"705211f4": "approveAccess(address)", +"7052dad9": "withdrawRemainingTokens(uint256)", +"7053fe8d": "finalize_contract()", +"70544b74": "emergencyDrain(uint256)", +"70544eb9": "hijackPrice()", +"7055011b": "escrowHistory(address,address,uint256,uint256)", +"7055060f": "bulkStoreHeader(bytes)", +"7055410b": "retrait_5()", +"70557298": "testTransferFrom()", +"7055d368": "vote(uint256,uint256[])", +"7056b50f": "blockstillcontracthackable()", +"7056d1f4": "burnLotIdsByAddress(address)", +"70578bda": "SPMTToken(address,uint256)", +"705791f2": "TOKEN_STARTED()", +"7057c20d": "CFD(address)", +"705882f2": "setPOOL_edit_22(string)", +"7058901e": "mtcDailyLimit()", +"70590ca2": "batch(uint256[],address[])", +"7059194e": "deletePlayer(uint256)", +"70597cb1": "startCompanySell()", +"70598a8e": "subTokenBalance(address,uint256)", +"705a3644": "block3()", +"705a940a": "disableBondingCurve()", +"705b164f": "acquireFreeEgg()", +"705b37f4": "getTotalF1()", +"705b5c27": "transferVestingMonthlyAmount(address)", +"705b7efd": "preSaleContributions()", +"705b8845": "askQuestion(string,string)", +"705bbf6b": "updatePrenup(string)", +"705bbfe6": "eastadscredits()", +"705bd32a": "fundDevelopment(string)", +"705ca5cd": "getMultiRequestIdGivenRequestId(uint256)", +"705d528d": "_addMoney(address,uint256)", +"705dae11": "cancelCraftAuction(uint256,address)", +"705e798e": "getLastRoundInfo()", +"705eeb90": "MultipleConstructorTest(bool)", +"705f4630": "chfCentsPerEth()", +"705f911d": "FareBase(uint16,uint16)", +"705fbf3d": "burnTokensAndRefund(address,address)", +"705fe7c6": "testEqualityBytes()", +"7060054d": "dynasty()", +"70606cda": "supportFreezeQuorum()", +"7060bfe4": "busyWork(address,uint256)", +"706194b9": "elenctraToken()", +"7061e777": "Etats_financiers_10111011()", +"70620168": "createBroker()", +"706247a1": "SetVotingDescripion(string)", +"7062640a": "newDeal(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"706332d1": "right46(uint256)", +"70634626": "getBTCAddr(bytes32,int256,bytes32,int256)", +"70646896": "DOWN_etherWin()", +"70646de9": "canSend(uint32,uint32)", +"7064aa96": "APPROVE_CONTRACT()", +"7064b5aa": "getPendingExploreItem(address)", +"7064d509": "tokenBonus()", +"7064e50c": "tokenIssuedMainSaleIco()", +"7064f0af": "COMPANY_ALLOCATION()", +"7065bedc": "getSettingValuesByTAOName(address,string)", +"7065cb48": "addOwner(address)", +"706605b9": "withdraw_arbitrary_token(address)", +"70660f7c": "stakeExistingContent(bytes32,uint256,uint256,bytes8,uint256)", +"70670a20": "Ethash(address[3])", +"7067e881": "RATE_FACTOR()", +"7067f915": "Constructed(address,uint256)", +"706910ff": "buy(uint256,address,uint256,uint256)", +"7069e746": "stakingEpochStartBlock()", +"706a3604": "sethardcap(uint256)", +"706a99fb": "codeExportEnabled()", +"706aba4a": "RNDInvestor()", +"706b5759": "RegisterDomain(string,string)", +"706bfed4": "accessCheck()", +"706df8d6": "getDonationInfo(uint256)", +"706dfe54": "getIssueState(uint256,bytes32)", +"706e11bc": "StartRebuy()", +"706e5b6e": "getOTCTotalSupply()", +"706eb3ab": "ethUSDOracle()", +"706ed71b": "Bomx()", +"706f6496": "goldRate()", +"706f6937": "airdropTokens(address[],uint256[])", +"706f8856": "jiGouTotalBalance()", +"706ff617": "mint(uint256,uint256,address,uint256)", +"70708a3c": "LocalToken()", +"70712939": "removeAuthorizedAddress(address)", +"70713209": "TJCoin()", +"7071688a": "getValidatorCount()", +"707188c1": "changeTime(uint256,uint256)", +"70720fe4": "_maxTokenSoldICO()", +"7072a977": "gasForOraclize()", +"7072aaa3": "newSubdomain(bytes32,bytes32,bytes32,address,address)", +"7072c6b1": "restricted()", +"70732188": "getUserTaskAtIndex(address,uint256)", +"7073c072": "getRegisteredUsers()", +"70740aab": "purpose()", +"70740ac9": "claimPrize()", +"707424fe": "contributorsIndex()", +"70743768": "voteStake(bytes32,uint256)", +"70747544": "currentCapLevel()", +"7074c091": "preSaleBonus1Percent()", +"7075b1d8": "latestMonarchInternal()", +"7076738b": "_emitWorkPaused(uint256,uint256)", +"70767f6c": "fillBidByAddress(address)", +"7076e27f": "riskcoins(uint256)", +"70775a59": "_generic(bytes,uint256,address)", +"707789c5": "setOpsAddress(address)", +"7077c11f": "SubOnHold(uint256,bool,address)", +"70780a7a": "shareholder2()", +"70788340": "Marcelo()", +"7078f424": "getHint(int256,uint256)", +"707913f0": "Add_totalLotteryValue()", +"707a4e96": "start(uint256,uint256,uint256,uint256)", +"707a7ab3": "acceptOwnerTransfer()", +"707a92b8": "FoodCoinToken(uint256,string,uint8,string)", +"707afb1d": "closest(uint256,uint256,address)", +"707b543d": "createNumber(uint256)", +"707ba39e": "VilzToken()", +"707bd28b": "endAirDrop()", +"707bda7a": "GetLastRoomAndRound(address)", +"707bdf58": "MaxTokens()", +"707c4f05": "sendAllFunds()", +"707c6b4d": "blocksInSecondCapPeriod()", +"707c750e": "sixthTime()", +"707d4349": "createPromoCity(address,string,uint256)", +"707d5fe1": "payoutBonuses()", +"707dd840": "TAGCASH()", +"707e8128": "all_referrals_count_by_address(address)", +"707f4ecd": "crowdTokensTLP2()", +"707fe454": "MODXCOIN()", +"70809757": "dispute(uint256,uint256,bytes32)", +"7081150a": "iconToken()", +"7081d5da": "getPoolAvgHatchPrice()", +"708238a0": "mainSaleFirstBonus()", +"708260b4": "teamToken2018()", +"7082b421": "parseBlockHeader()", +"7082d203": "lend(address,uint256,uint256)", +"70835d98": "CoinAllocation(address,int64,int64)", +"70835f6b": "approveAddTokenData(uint256)", +"70844f7a": "sendBadge(address,uint256)", +"708484db": "blikedUntil(address)", +"708547f3": "testUpdateLawyer()", +"70858679": "YDHTOKEN_M(string,string,uint256)", +"70859da8": "TokenReturn(address,address,uint256)", +"7085b579": "b2s(bytes32)", +"70862562": "distributeTokens(address,address,uint256)", +"7086528e": "DemocracyVote()", +"70876c98": "purchase(uint256,uint256)", +"7087b272": "Coneus()", +"7087ed2c": "getClaimSeed(address)", +"70887eb9": "totalSoldTokensWithBonus()", +"7088abf0": "WhiteListCrowdsale(uint256)", +"7089e4f0": "LogBuyEnabled(bool)", +"708a4947": "getOptionState(address[3],uint256[3])", +"708b2097": "TKCC(uint256,string,string)", +"708b34fe": "submitMessage(string)", +"708b9d01": "lockThreshold()", +"708bf79a": "updateMember(address,address,uint256,uint256,string,uint256)", +"708c2956": "YouGive(uint256,uint256,string,string,address,address)", +"708cfb25": "setTeamTokensHolder(address)", +"708d0c57": "updateResolver()", +"708d9fd3": "group_key_confirmed()", +"708da969": "verifyAddress(address,string)", +"708ddf7b": "submitted()", +"708e03d9": "distributionOfTokens()", +"708eef42": "transferOwnershipWithHowMany(address[],address,uint256)", +"708f29a6": "getTotalPayments()", +"708f8940": "getEXECUTION_GAS_OVERHEAD()", +"70905dce": "emergencyAdmin()", +"7091e0c5": "setNewOwner(address,uint256)", +"70926370": "EGGS_TO_HATCH_1BANKER()", +"70936880": "defaultWaitTime()", +"70936a6e": "freezeOf()", +"7093ab11": "privateSell2LockEndTime()", +"70948956": "PolicyPalNetworkToken(uint256,address)", +"7094d21e": "isSuccessOver()", +"70961774": "getBlockCreatedOn()", +"70964be7": "startSellingPhase()", +"7096b6cb": "receiverContractAddress()", +"7097048a": "claimDerivativeTokens()", +"70983e91": "startBoardProposal(uint256,address)", +"70984e97": "bigBlind()", +"70985eb6": "setCrowdsaleContract(address,address)", +"7098ad13": "PropertyCoin()", +"7098e670": "getFincontractInfo(bytes32)", +"70994b31": "getCollectibleDetails(uint256)", +"709a36e6": "getMiningMeta(uint256)", +"709a5359": "updatepresaleRate(uint256)", +"709bc0ff": "AntitiredToken(uint256,string,uint8,string)", +"709be206": "registerCreatorsPools(address[],uint256,int256)", +"709cc16e": "NewCup(address,uint256)", +"709cf8c0": "saleTokensVault()", +"709d8c4e": "DSPLT_A()", +"709e6ed4": "upgradeIdRange()", +"709eaa93": "minerCreatedCount()", +"709ecb39": "findPublisher(address)", +"709ef231": "sellTokens(uint256,uint256,uint256)", +"709f5ccc": "setDivisor(uint256)", +"709f6f25": "setData_19(string)", +"709f84a4": "PriceStrategy()", +"70a0014e": "projectFundingFail()", +"70a01b3d": "addInvestor(address,bool)", +"70a0246a": "toPony(uint256)", +"70a06777": "getTankAuctionEntity(uint32)", +"70a08231": "balanceOf(address)", +"70a0c458": "getBindAccountAddress(string)", +"70a0f1fe": "numChametzForSale()", +"70a14c21": "LogBump(bytes32,bytes32,address,address,address,uint128,uint128,uint64)", +"70a2b84a": "toggleAvailability()", +"70a4fc11": "toggleDataViewWindow(uint256)", +"70a6c4bb": "receiverWithdraw()", +"70a7b3e8": "_validEstimate(uint256,uint256,uint256)", +"70a7e2dd": "getBunny(uint32)", +"70a8609e": "test_someOtherTest()", +"70a89986": "addContribution(address,uint256,uint256)", +"70a951ce": "TripCash()", +"70aac052": "getRequestedProductsBy(address)", +"70ab2359": "MAX_CROWDSALE_CAP()", +"70ab2822": "assertEq21(bytes21,bytes21,bytes32)", +"70ab8ba8": "creditUpdate()", +"70ac4bb9": "right32(uint256)", +"70ac62ec": "getTranslationLanguageList()", +"70ac970b": "test_24_assertGasUsage700Boards()", +"70aca69a": "lockUpEnd()", +"70acbe0e": "rate_change(uint256)", +"70aceae8": "upX(uint256)", +"70ad0cc6": "delAddr(uint256)", +"70ad858b": "infoWithdraw13()", +"70ae882f": "finishNextGame()", +"70ae92d2": "nonce(address)", +"70ae992a": "pubKeyToAddress(bytes)", +"70aecf61": "getContractReceiver(address)", +"70b0d4ac": "GetAccountIsNotFrozenForReturnCount()", +"70b1d9d4": "requestCanonicalFormat(bytes)", +"70b257a4": "pushClient(address,bytes32)", +"70b2a30f": "tokenToEth(uint256)", +"70b2ef56": "EntropyTestToken()", +"70b2fb05": "bettingEnd()", +"70b3b0e5": "countriesWallet()", +"70b3c7de": "CrypteloPublicSale(address,address,address,address)", +"70b3d68c": "signHash(uint256)", +"70b3db6f": "getCoinAge(address,uint256)", +"70b45ca0": "_rateFromDay(uint256)", +"70b57415": "product2_pot()", +"70b581ad": "finalize(string)", +"70b60760": "getNodeIdsLength()", +"70b7596b": "getWinnings()", +"70b7f9f3": "setTradingAllowed(address,bool)", +"70b80d77": "WCME()", +"70b8206c": "getRoundRefIncome(address,address,uint256)", +"70b84e50": "joinToGame(uint256,uint8)", +"70b8d29a": "saveMsgByAdmin(string,string)", +"70ba1113": "percent()", +"70ba3339": "cancelTransaction(bytes32)", +"70bab35d": "systemStartingPriceMin()", +"70bad87e": "revokeFarmerCertificate(address)", +"70bb478f": "makeTrade(address,address,uint256,uint256,uint256,uint256)", +"70bc52fb": "protectAddress(address,bool)", +"70bdd155": "oracle_price_decimals_factor()", +"70be4ffa": "testErrorUnauthorizedSetPackage()", +"70be564b": "Trump()", +"70be61d1": "ApplicationInFundingOrDevelopment()", +"70be89c1": "addAddressesToWhitelist(address[],uint256)", +"70be8a86": "ownedCoin(address,uint256)", +"70bf7b96": "_collect_fee(address,address,uint256)", +"70c0b647": "getOwed(address)", +"70c0c516": "directMintLimit()", +"70c0f689": "getApplicationState()", +"70c10578": "takeProfit()", +"70c18199": "getResponse(uint256)", +"70c1854e": "FLOCK()", +"70c31afc": "tokenImprint(uint256)", +"70c33b31": "changeGasRequired(uint256)", +"70c35951": "referralPercentOfTotal()", +"70c40842": "_setTokenOwner(address,uint256)", +"70c4488d": "validNick(string)", +"70c494fc": "ATC()", +"70c4ce24": "newListing(string,uint256,string)", +"70c4f2e1": "MIN_SHARE_OF_POWER()", +"70c55e1f": "getTradingPairCutoffs(address,address,address)", +"70c5f786": "TEAM_CAN_CLAIM_AFTER()", +"70c5fc9d": "clearTickets()", +"70c690f4": "MultiOwnable(address[],uint256)", +"70c6abf5": "resetAllData()", +"70c6b20c": "newEntity(uint256,uint256)", +"70c7e230": "change_status(string)", +"70c80630": "isOwner(uint32,int256,address,address)", +"70c8251d": "AttributesSet(address,uint256)", +"70c83314": "airDropToken(address,uint256)", +"70c8405b": "GiftGenerated(address,address,address,uint256,uint256,string)", +"70c8658a": "getNewRegistry()", +"70c8f8ad": "createFirstRound()", +"70c9edb7": "BTCRelayTools(address)", +"70ca4c26": "getLinkedAddress(address,address)", +"70ca6446": "AnotherMethod(uint256,uint256,uint256)", +"70cbed78": "oracleCallbackGasPrice()", +"70cc5e45": "kgtHolderCategory()", +"70ccd928": "hashesLength()", +"70cd89eb": "CRLperMicroEther()", +"70cd9bfd": "GPRDSQToken()", +"70cda533": "updateCoeff(address,uint8,uint128,uint256)", +"70cddf74": "addApproval(address,address,uint256,uint256)", +"70ce0765": "createPromoListing(uint256,uint256,uint256)", +"70ce90d5": "ConfirmManager()", +"70cef2b8": "getVisaPrice(address,uint256,uint256)", +"70cf7508": "isValidAirDropForIndividual()", +"70cfaa8d": "calledUpdate(address,address)", +"70cfab63": "chargeFeeAndLockEthBalance(address,uint256)", +"70d01861": "adminSetCity(address)", +"70d02691": "getAssetBalances(address)", +"70d07575": "awardTokens()", +"70d084c0": "SingularDTVCrowdfunding()", +"70d0c5d8": "EOUNCE()", +"70d0cc86": "getElementView(uint256)", +"70d12c31": "resetPeerWallet()", +"70d1383d": "createEditionMeta(uint256)", +"70d17adb": "isDrawn(uint256,address,uint256)", +"70d19a43": "itemCancelMarketsWhenPaused(uint256)", +"70d1cde4": "randomCount()", +"70d1e6b4": "minimalWeiTLP2()", +"70d22f14": "addHash(address)", +"70d25a9f": "lockUpAmountStrOf(address)", +"70d271ab": "StartCampaign()", +"70d290b5": "getDoneAddresses()", +"70d37810": "makersCount()", +"70d383dc": "createManyProxies(uint256,address,address)", +"70d4d119": "giftEth(address,uint256,string)", +"70d4d7b4": "promoGen0()", +"70d53be5": "find()", +"70d54287": "VantageToken()", +"70d5ae05": "burnAddress()", +"70d60adf": "acceptBid(string,uint64)", +"70d66693": "drainToken()", +"70d695f7": "VerifyEd25519Packed(bytes)", +"70d70e9b": "getCofounders()", +"70d72d63": "getAllPixels()", +"70d762c2": "basicDayPercent()", +"70d7a0e7": "authorizeKyc(address[])", +"70d81666": "LogS(string)", +"70d8915a": "getApplicationAddress()", +"70d94ed0": "getHoldAmount(address,uint256)", +"70d9f7dc": "awardItemRafflePrize(address,uint256)", +"70db69d6": "maxBuy()", +"70dbb783": "AMBASSADOR_TWO()", +"70dc4de5": "withdrawKRI(uint256)", +"70dc8259": "totalDistributedi()", +"70dc86cd": "EARLY_FOUNDERS_CAP()", +"70dd2e06": "setMinActivatedToken(uint256)", +"70ddeb03": "CRMTToken()", +"70de1e30": "getItemItemId(uint256)", +"70de8c6e": "start(string,uint64,uint8,uint32)", +"70dea79a": "timeout()", +"70df42e1": "changeBurnBounds(uint256,uint256)", +"70e0abb1": "returnInvestmentRecursive(uint256)", +"70e0bd61": "setTrustedMinterAddr(address)", +"70e18692": "cancelIncompleteOrders()", +"70e32ae7": "firstBonusLimitPercent()", +"70e3ccf7": "initMiaoMiaoAddress(address)", +"70e44c6a": "Withdrawal()", +"70e4b809": "_setBuyTime(uint256,uint32)", +"70e5bf4d": "queryVote(uint256)", +"70e6b2b9": "makePayableRegistration(bytes32)", +"70e6d387": "evolveCryptoAvatar(uint256,uint256,uint256,uint256,uint256)", +"70e71ea3": "etherandomSeedWithGasLimit(uint256)", +"70e7732d": "getSpecificSellerTransaction(address,address,uint256)", +"70e87aaf": "move(uint8)", +"70e8c1b3": "test_complexNewProposalAndVoting()", +"70e8dffa": "TokenHold(address,uint256)", +"70e9a612": "BariCoin()", +"70e9ff60": "cancelBuyOrder(address,uint256)", +"70eaa1b4": "Error(uint32)", +"70eae6c0": "travelTotalEarning()", +"70eb6424": "setSmsCertificationRequired(bool)", +"70ebf814": "addUntrustedSelfDelegation(bytes32,bytes32,bytes32[2])", +"70ed00e2": "repayBorrowBehalfInternal(address,uint256)", +"70ed0ada": "getEthBalance()", +"70ed1664": "organizer3()", +"70ed2726": "updateUtilizedFundsByUser(address,address,uint256)", +"70ee555c": "returnTickets(uint256)", +"70ee9edd": "PublicMiningReward()", +"70ef14de": "Drops(uint256)", +"70f0c351": "purge()", +"70f0dfee": "MultisigWalletZeppelin(address[],uint256,uint256)", +"70f18295": "TokenPETER()", +"70f18bcd": "UnlockToken()", +"70f199d2": "indAddress()", +"70f37d27": "fundPool()", +"70f4a7b2": "Th_stage3(uint256)", +"70f4c18c": "oracleQueryType()", +"70f5b71c": "createController(address,address)", +"70f5d3de": "WthdrawToCreator(uint256)", +"70f6489e": "WHOIS(address)", +"70f65977": "_migrateToken(address,address)", +"70f6ac15": "RegistrationDeposits(address,address)", +"70f6c906": "_refundWEICustomer(uint256,uint256)", +"70f705ba": "ChargersCount()", +"70f74228": "TokenATC(uint256,string,uint8,string)", +"70f79b84": "SEO()", +"70f80828": "reactions(uint256)", +"70f85731": "setPhaseEndingCriteria(uint256,uint256,uint256,uint256)", +"70f8de1f": "changeGasFee(uint256)", +"70f9c021": "forcePay(uint256,uint256)", +"70fa66db": "deauthorizeCasino(address,address,uint8,bytes32,bytes32)", +"70fbf6e5": "openGamePlayNos(uint256[])", +"70fd37cf": "totalInvestments()", +"70fde32c": "mul(uint96,uint96)", +"70fe19a3": "blocktubeFarming()", +"70ff6325": "withdrawTuneBalances()", +"70ffe53d": "mood()", +"71007509": "refundTokens()", +"7100a4e6": "addAccessory(uint256,string,uint256,uint256)", +"710164e7": "getVATCompensations(uint256,uint8,uint256,uint8)", +"71026acc": "EXPECTED_START()", +"7102b728": "vested(address)", +"7102c138": "Standard_Token(uint256)", +"7102f74d": "recalcTokenPrice()", +"71037b1e": "flagUSInvestor(address)", +"71039256": "BUCToken()", +"7104a142": "getNumberOfVerifiers()", +"71056a78": "ChangeEtherGasProvider(address)", +"71061398": "getRoles()", +"7106312c": "emergencyAddr()", +"7106bd46": "mintContractByIndex(uint256)", +"7106cdb6": "CloudexchangeCrowdsale(uint256,uint256,uint256,address)", +"7107283f": "create_tablet(bytes32)", +"7107d7a6": "minBuy()", +"710908c9": "levelThreeBonus()", +"71098a35": "startStop()", +"71098e15": "totalSTC(uint256,uint256)", +"710ad128": "getHatchingEggData(address)", +"710b2d8c": "getAddressRatio(address)", +"710bf322": "proposeOwnership(address)", +"710c6705": "updateCapFlex(uint32)", +"710cba8b": "isAllowedOverrideAddress(address)", +"710d6a61": "unPauseTransfers()", +"710dff42": "isdrawadm(address)", +"710e5d2f": "setMaxFee(uint256)", +"710ed77a": "revokeAccessbyDelegate(bytes32,address,address)", +"710edb10": "multisignWallet()", +"710ee68e": "DOGEToken()", +"710f3953": "add_entity(string)", +"710fe6f8": "getWithdrawBalance()", +"710ffc72": "changeTribeOwner()", +"71101891": "DharmCoin()", +"711085b2": "arr(address,address,uint256,uint256,uint256)", +"7110ce25": "MyRefReward()", +"7110eed7": "createRegistryInstance(address,address)", +"7111abf2": "SessionOpen(uint256,uint256)", +"7111ed97": "TopPayCoin()", +"71135f8b": "setStopped()", +"7113d35d": "pickFood(uint256,string,string,uint256,uint256)", +"7113e5e2": "findKey(address,uint256,uint256,uint256)", +"71140942": "MIN_ETH_FUND()", +"71145486": "rebuildManagerList()", +"71147d32": "STRC_ADDR()", +"7114a96e": "transferReferral(address)", +"7114c13a": "sendTaster(address)", +"71156c73": "TheFund()", +"7115c8bd": "xdao(uint256,string,string)", +"7115c988": "Batch(address)", +"711619de": "setPubEnd(uint256)", +"711748a3": "removeModuleAtIndex(uint256)", +"71175249": "INEXToken()", +"7118f854": "icoSuccess()", +"711953ef": "setGameAddress(address)", +"7119a490": "setBtcPriceProvider(address)", +"7119c873": "transferSSPRecord(address,address)", +"711b4871": "getOptionBuyOrders(uint256,uint256)", +"711bf9b2": "setAuthorized(address,bool)", +"711bfa89": "month12companyUnlock()", +"711c2b94": "setTestMarket(bytes32,bool)", +"711caf40": "transferStep3(address)", +"711cbc26": "PartyRegistry()", +"711d11bf": "ev(string,address,uint256)", +"711d4407": "updateBonuses(address,address,bool)", +"711d649b": "getCatNames()", +"711f63bf": "toBytes32(bytes,bytes,uint256)", +"7120d381": "getUpdateTokenAge(address,address,uint256)", +"7120fab4": "discountCollect()", +"71215af6": "DAYS_28()", +"712173de": "CrowdsaleStarted(uint256)", +"71221e38": "RareCoinAuction(uint256)", +"7122e857": "setParticipantWhitelist(address,bool,uint256)", +"7123691e": "removeSERAPHIM(address)", +"71236b92": "Owner(address,uint256)", +"712394b6": "nexumToken()", +"71245f6e": "BTCValue()", +"7124abf3": "getLastPayouts()", +"7124c683": "setUpdateInterval(uint256)", +"7124d613": "changePaymentAddress(address)", +"71254d9b": "setFeesDistributionPercentages(uint256,uint256,uint256)", +"7126a855": "configure(uint256,uint256,uint256,uint256,uint256)", +"7126b6ff": "_grantAdmin(address)", +"71270b46": "initCards(uint256)", +"7128ad73": "PaymentReceived()", +"7128defb": "removeSupervisor(address)", +"712980a2": "banUser()", +"712a10bf": "COIN_SUPPLY_ICO_PHASE_2()", +"712a5094": "balanceOfTheContract()", +"712aa191": "isValidCustomerTxPaymentForKWh(address,bytes32)", +"712ac60e": "onRemoval(string)", +"712b1ed0": "triggerInput()", +"712bb1b8": "getDataColla_AA_01(string)", +"712c0c5a": "withdrawDirectDebit(address[],bool)", +"712c3f7a": "addressPartnershipsAndExchanges()", +"712ca0f8": "getOrder(string)", +"712dd575": "raiseSellOrderCancelled(address,uint256,uint256,uint256,uint256,uint256,int160)", +"712f22a0": "getVolumeBonus(uint256)", +"712f4d70": "_generateShortLink()", +"712f5e72": "SetRoundTime(uint256)", +"712f7790": "publicGetStatus()", +"713081d0": "setPromoter(address)", +"7130d7ce": "get_asset_event_details(bytes32,uint256)", +"71313365": "ICO076()", +"7132d337": "citadelTransfer(address,uint256)", +"7132ebcd": "switchPaused(bool)", +"7133c0c0": "calcAmount(uint256,uint256)", +"713494d7": "setReferralFee(uint256)", +"7136982b": "getHolderCount()", +"7136d509": "playCEELO(bytes32,uint256[6])", +"7137047a": "setDealCancelRate(uint256)", +"7137b024": "Banliang()", +"7137e072": "getAllTemplateProposals(address)", +"7137ed47": "setProxyContract(address)", +"7138364b": "adventureItem()", +"7138bc92": "transfer(address,address,address)", +"7138e0c9": "divForSellBack()", +"7138ef52": "right9(uint256)", +"71393c60": "storeLedgersInIpfs()", +"713942f7": "getUserVerified(address)", +"713955e8": "ico2endTime()", +"71395818": "ItemsMarket()", +"71398637": "batchToApplyMilestone(uint8,address[])", +"7139b1ca": "balanceOfRoutingCode(bytes32)", +"7139b595": "withdrawDthShopAdmin(address,address)", +"713a7eef": "Xingqiub()", +"713b563f": "database()", +"713be000": "checkoutCart()", +"713be126": "changeRateSetter(address)", +"713d30c6": "updateState(int128,uint128,uint8,bytes32,bytes32)", +"713eba52": "OwnershipRequested(address,address,bytes32)", +"713ec905": "recordAddress()", +"713f5e4d": "sendEthToContract()", +"713fd253": "Limit_Amount()", +"713ffc3b": "setNextGameSettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"714064f3": "BreakableBond(address,address,uint256)", +"7140bdf3": "get_all_best_offers()", +"7141856d": "getNumProps()", +"7141aa8b": "getTitulaire_Compte_3()", +"7142087c": "allowTransferGlobal()", +"71427ac1": "SuperLitecoin()", +"7142b17d": "dataForOwner(address)", +"7142b191": "MultiplesaleAirdrop(address[],uint256[])", +"7143059f": "getParticipant(address)", +"714383ad": "HYPEToken()", +"71443c4d": "soldDragons()", +"714490ab": "WithdrawToBankroll()", +"7144e81e": "Cremit()", +"71450e30": "tierIndexByWeiAmount(uint256)", +"7145644c": "calculateBTS()", +"71461be9": "getCurrentMilestoneProcessed()", +"7146bd08": "MAX_PURCHASE()", +"71476f35": "clear(address,address,int256)", +"71478fae": "_getTokenIdFromBytes(bytes)", +"714897df": "MAX_VALIDATORS()", +"71489835": "isRed()", +"7148ba36": "_createCard(string,uint256)", +"71492685": "getTo()", +"714a2f13": "assertEq(int256,int256,string)", +"714b1443": "CancelBuyOrder(bytes32,address,uint256,address)", +"714b4465": "MakerTransferredEther(address,uint256)", +"714c5d9d": "BMT(uint256,string,uint8,uint256,string)", +"714ca446": "adopt(uint32,int256)", +"714ccf7b": "setVault(address,address)", +"714d497a": "maxPerExchangeBP()", +"714d582e": "sdc(address)", +"714d5fae": "cancelRemoveOwnerRequest2()", +"714d9537": "cancelEvent(bytes16)", +"714dc20d": "ownerChanged(address,address,address)", +"714e2ec9": "vanilCoin()", +"714e42a1": "getSaleRate(uint256)", +"715018a6": "renounceOwnership()", +"71506977": "EXCHANGE_RATE_DECIMALS()", +"7150773d": "donateFunds()", +"7150d8ae": "buyer()", +"71513e9d": "reSet()", +"71515a36": "SXSYCoin()", +"7152f800": "gameResult()", +"71535f0d": "tenthTime()", +"71543cfc": "unWhitelistUsers(address[])", +"71543f39": "Eetgccoin(uint256,string,string)", +"715469d0": "logoX()", +"7154ae61": "CheckNumbers(uint8[5])", +"7154b798": "addExploreData(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"7154b8b5": "setPercent(uint256)", +"71551178": "testDisputedInvalidSequenceWrongReadAddress()", +"71560f80": "emulatePurchase(address,address,uint256,uint256)", +"71582f54": "IsSetReferrer(address)", +"715851a0": "getCheckingBalance(address)", +"71586383": "totalTokensReceived()", +"71587988": "setNewAddress(address)", +"71589d6b": "newponzi()", +"7158e346": "NatCoinCrowdsale(uint256,uint256,uint256,address)", +"7159271d": "publicsalestartTime()", +"71599987": "increasePendingTokenBalance(address,uint256)", +"7159a618": "operate()", +"7159db81": "lastTier()", +"715b208b": "getAllAddress()", +"715b99f8": "_isSignedPrefixed(address,address,bytes32,uint8,bytes32,bytes32)", +"715d4a64": "sellsubscribers()", +"715d574e": "CarboneumToken()", +"715db6ea": "TheMark()", +"715e0e4e": "repurchase(address,uint256)", +"715ed24b": "setVIPThreshold(uint256)", +"715eddda": "starbaseEpAmendment()", +"715ede94": "auction(bytes32)", +"715ef43d": "newPurchase(address,uint8,uint8)", +"715ef4ff": "resendFailedPayment(uint256)", +"715f8975": "JOINT_PER_ETH()", +"7160138c": "unlockedTeamStorageVault()", +"71608d05": "getBalanceModificationRounds(address,address)", +"71612620": "transferFST(address,uint256)", +"71616b84": "calculateTokenCrowsale(uint256,uint256)", +"7161c5df": "setBracketPrice(uint256,uint256)", +"7161c66d": "RunManager(bool)", +"716210d8": "addHodler(address,uint64)", +"7162f182": "resetRip()", +"716344f0": "preIcoEndTime()", +"716437b5": "testApproveTransfer()", +"71645971": "toList()", +"71658552": "getUint(address,bytes32)", +"71658896": "getTopic(uint256)", +"71674ee5": "maximumIcoRate()", +"7168e5d3": "ownerSetAdmin(address)", +"71697efa": "getSumWithdrawals()", +"7169a63e": "IcoCancelled()", +"7169afa6": "getOldFrozenAccount(address)", +"7169dd5d": "intial_supply()", +"716adc36": "setMyOracle2(address)", +"716af639": "minePoP(address,uint256)", +"716c0a31": "computingCharge(uint256)", +"716d3c6c": "adjustReward(uint256)", +"716e5604": "startItemRaffle(uint256,uint256)", +"716f10bf": "isWhitelistOn()", +"71716992": "ThankYouToken(uint256)", +"71726f69": "HOWEOToken()", +"7172a1f2": "testLedgerCreation()", +"7172d9f0": "OtomatizToken()", +"71740d16": "numDarknodesPreviousEpoch()", +"7174164b": "XPTToken()", +"71748a8b": "WSR(address)", +"7174ac9e": "setEscrowedTaskBalances(uint256,uint256)", +"71752d06": "getOwnerByItemTypeAndId(string,uint256)", +"7175d709": "SPARCAddress()", +"71765e74": "VendMultiSigWallet(address[],uint256)", +"71766ae3": "disableManuallyBurnTokens(bool)", +"71773fc2": "lasttimereduce()", +"7177a7dd": "canTransferTokens()", +"71781a79": "subToken(address,uint256)", +"71784312": "distributeVariable(uint256,address[],uint256[])", +"71793195": "__isFeatureEnabled(uint256)", +"7179d079": "mainFundBalance()", +"7179ed22": "autoPrice()", +"717a195a": "setOutcome(int256)", +"717a945a": "USD_Omnidollar()", +"717b3726": "transferFromBank(address,uint256)", +"717cb858": "ZUE()", +"717cee7d": "updatePeriodDuration(uint256)", +"717d5527": "getMoney(address)", +"717de52e": "creditCommons()", +"717e1418": "VebionX()", +"717e9745": "setNewControllerAddress(address)", +"717f24c6": "emergencyWithdraw(address,uint64)", +"717f6f7f": "MYCCToken(uint256)", +"717fecea": "vesting2Withdrawn()", +"717fedf0": "getFirstActiveDuel1()", +"717ffe91": "buyTokensAsset(address,address,uint256)", +"7180dd8a": "_giveToken(uint256,uint256)", +"718167c4": "AddValues(uint256,uint256)", +"718228fa": "totalTeamContributorIdsAllocated()", +"7182774d": "exchanged()", +"71827791": "nextContributorIndexToBeGivenTokens()", +"718350a9": "_removeMaliciousValidatorAuRa(address)", +"7183616c": "notarize(string)", +"7185354b": "changePerEthToBlocNumber(uint256)", +"7185393c": "updateAppExec(address)", +"7185637b": "DailyDivsSavings()", +"71857000": "setLogic(address)", +"7185acb8": "viewMyComponent(uint256)", +"7185f163": "stopTrading()", +"71863031": "isPublicIcoActive()", +"71868032": "addOffChainAddresses(address[])", +"71873971": "PROOF_TOKEN_WALLET()", +"71882ab0": "distributeContest()", +"7188c8a4": "reFunding()", +"71892e3f": "getMyKnowledge()", +"718aa629": "NEX()", +"718b0a32": "withdrawBuyDemand(uint256)", +"718bd6dd": "setRequestUntil(uint8)", +"718c025a": "ethPreAmount()", +"718c6569": "TimeSecondToken(uint256,string,string)", +"718cc769": "makeBet(uint256)", +"718d763a": "playerCost()", +"718da639": "addNewSecretHash(bytes32)", +"718da7ee": "setReceiver(address)", +"718df9d7": "getPlayerSpaceshipUpgradesById(uint256)", +"718dfb7e": "hasPreICOClosed()", +"718e6302": "play(string)", +"718e6c44": "isManageable(address)", +"718eaa50": "setLayerParent(address)", +"718ec079": "setMarketCreationCost(uint256)", +"718f81c2": "getCCH_edit_11()", +"71906087": "airdropToAdresses(address[],uint256)", +"719102d7": "createItem(uint256,uint256,uint256,uint32)", +"7191474b": "pendingUFT()", +"71929547": "OceanScapeCoinAdv(uint256,string,string)", +"7193ab70": "balanceUnlocked(address,address)", +"7193b1e4": "refundCfd(uint128)", +"7193f2f0": "supported(bytes32)", +"719591c7": "requestComputation(string,string,uint256,uint256)", +"7195d944": "dataOfPart(uint256,uint256,uint256)", +"7195eed2": "EtalonGlobalToken()", +"71974cbe": "lastBidBlock()", +"7197c6d2": "firstTTax()", +"719874da": "profitFromCrash()", +"7198801d": "getWorkTime(uint256,uint256)", +"7198e08c": "createLoveBlock(string,bool)", +"7199139f": "TheAbyssDAICO(address,address,address,address,address,address,address,address,address,address,address,address)", +"7199f6d4": "safedrawal(uint256)", +"719a0f8c": "removeOfficer(address)", +"719b2e07": "setDisputeRoundDurationInSeconds(uint256)", +"719c78ac": "setCodedate(uint256)", +"719c86e3": "team_lock_count()", +"719ce353": "Brokenwood()", +"719ce73e": "prizePool()", +"719f2fb7": "_calTeamAttribute(uint8,uint8,uint8,uint32[11])", +"719f3089": "getLocks(address)", +"719f8d3a": "checkIfWhiteListed(address)", +"71a009ad": "BRLTOKEN()", +"71a03078": "TMCToken(uint256,string,string)", +"71a04009": "newIssuer()", +"71a18bfb": "emergencyDrain(address)", +"71a2e46d": "OWN_transferOwnership(address)", +"71a2f964": "newPaymentAddress(address)", +"71a4dc5e": "getLuckyblockEarn(bytes32)", +"71a5367f": "setAllowPaymentsWhenPaused(bool)", +"71a66e7c": "addOrUpdateHolder(address)", +"71a67aa9": "getFunctionAuthorizationHash(address,address,string,bytes32)", +"71a7462e": "balance_(address,address)", +"71a7c439": "distribute21ST(address[],uint256)", +"71a80ba3": "setBurnFeeReceiver(address,address)", +"71a8270a": "buyObizcoinTokens(address)", +"71a8ba25": "getEtherBoxes(address)", +"71aa60fd": "calculateTokens(uint256)", +"71aad2dd": "preICOamountBonusLimits(uint256)", +"71ab0e3c": "sellDai(uint256,uint256,uint256,uint256)", +"71ac5c60": "WeToken(address,string,string,uint256,uint256)", +"71ad3e73": "isMakePermitted(uint256,uint256,address,address,uint256,uint256)", +"71ada3fb": "getCash(uint256,address)", +"71ae8f02": "fundingMinimumTargetInWei()", +"71ae973e": "createGen0Auction(string,string)", +"71aeae44": "hasBallotEnded(uint32)", +"71aed703": "addCandidateCache(address[],bytes32[])", +"71af5d0e": "setFailedVerificationSlashAmount(uint256)", +"71af8630": "_suicide()", +"71afc713": "marketingTokenAmount()", +"71b1d2d3": "RANGEEND_PRESALE()", +"71b22e61": "EnableRefund()", +"71b2354d": "MINC()", +"71b3659e": "currentTokenPrice()", +"71b397cf": "getCurrentRoundIsFinished()", +"71b3e7f4": "payOffLoan(address)", +"71b45696": "StcToken()", +"71b475d0": "STQPreICO3(address,address)", +"71b4f4ef": "setDEXContractAddress(address)", +"71b505ad": "setLargeCapWhitelistParticipant(address,uint256)", +"71b5ee71": "allowTokenTransfer()", +"71b6663e": "play1(address,uint256)", +"71b6a376": "setNumberOfPlayers(uint256)", +"71b6d36d": "isNotaio(address)", +"71b6d6ea": "getAttributeTimestamp(address,bytes32)", +"71b7d5c4": "priceUpdateWaitingTime()", +"71b804ee": "getBettingPrice()", +"71b80b8f": "upgradeCardConfig(address)", +"71b9b646": "saleEnabled()", +"71ba3612": "Plasma()", +"71bad4d8": "jackpotMinimumAmount()", +"71bb263d": "contractPartThree(uint256)", +"71bb3cc8": "GivethCampaign(uint256,uint256,uint256,address,address)", +"71bbefc7": "payPlatformOutgoingTransactionCommission()", +"71bc9d62": "_generateDetail(uint256)", +"71bd1f47": "MinCapReached(uint256)", +"71bdb914": "softCapLimit()", +"71bdbc9a": "SetCityData(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"71bde852": "_startNextCompetition(string,uint32,uint88,uint8,uint8,uint16,uint64,uint32,bytes32,uint32[])", +"71be0c27": "preSale5()", +"71be1851": "ShopDeployed(address,uint256,uint256,uint32)", +"71be8766": "Contribution(address,address,uint256)", +"71beae97": "currentCoinsCreatedPercentage()", +"71bf35b6": "minMinutesPeriods()", +"71bf439e": "CANVAS_WIDTH()", +"71bf5a95": "setENS(address)", +"71bfa03f": "getRedemptionBlockNumber()", +"71bfabca": "resultOf(uint256)", +"71bfd48b": "content(string,uint256,string,string,uint256)", +"71c02b7b": "BSAFE()", +"71c03d76": "get_rest(uint256)", +"71c10778": "weiToPresalersFromICO()", +"71c147fb": "addAccount(string,uint256,string,string,uint256)", +"71c157d1": "addInsuranceProduct(uint256,string)", +"71c1d196": "numContributors(uint256)", +"71c1dde5": "get_presale_arbits_per_ether()", +"71c24e37": "narrowRoundPrize(uint256)", +"71c2835e": "operater()", +"71c396cc": "migrationAddress()", +"71c4275a": "setWeight(bytes32,uint256)", +"71c4980b": "getBlanace()", +"71c57772": "eucDist2D(uint256,uint256,uint256,uint256)", +"71c58b25": "internalTransfer(uint256,uint256,uint256)", +"71c59097": "MainnetSurvey(uint256,string,bytes32[])", +"71c66459": "LogPaymentReceived(address,uint256)", +"71c6d4dc": "pearlContract()", +"71c6dc50": "ProofOfCraigGrant()", +"71c6e049": "addUsers(address,uint256)", +"71c78ce7": "totalAirDropped()", +"71c79588": "releaseName(bytes32)", +"71c7e923": "dDisableErc20OwnerClaim(bytes32)", +"71c80c67": "COOPET(uint256,string,uint8,string)", +"71c82c14": "setOraclizeGasPrice(uint256)", +"71c847b2": "detailsOfEdition(uint256)", +"71c85da2": "LogN(address,bytes32,uint256,string,bytes,uint256,bytes1,uint256,uint256)", +"71c8e333": "getSundownGraceTargetBlock()", +"71c93fc7": "processDiceRoll(address,uint8)", +"71c95040": "EFF(address)", +"71c9572b": "maxBidInCentsPerAddress()", +"71c9a754": "topiToken()", +"71c9e177": "SpudToDivs(uint256)", +"71ca2117": "isAuditorRegistered(address)", +"71ca337d": "ratio()", +"71cabfb8": "getYumerium(uint256,address)", +"71cacc9e": "addLotteryPrize(uint256,string,uint256,uint256)", +"71cb9769": "addIdentity(bytes32,bytes32)", +"71cbb22a": "fixed_value()", +"71cbef8a": "sendTokensAfterCrowdsale(uint256,uint256)", +"71cc4f35": "Alecrypto()", +"71cc805a": "refund(string,address)", +"71cce314": "Kolak()", +"71ce52ed": "senderIsAdvocate(address,address)", +"71ce9a4a": "forwardCallGas()", +"71cea5ae": "transferAccessOff(address)", +"71ced69d": "mintNewDNC(address,uint256)", +"71cf586f": "CanISuscribeTrial(uint256)", +"71cf5979": "market_AcceptBid(uint256,uint256)", +"71cf866e": "_redeemIsAllowed(uint256)", +"71d06675": "getInteres(address)", +"71d0cf01": "setCustomerSignature(address,uint256,bytes)", +"71d0ed05": "betsKeys(uint256)", +"71d141f9": "doOraclize(bool)", +"71d1995e": "changeEmployee1(address)", +"71d30a17": "Match(address,address,bytes32,bytes32,uint256,uint256)", +"71d31a13": "withdrawTokens5(uint256)", +"71d3de1b": "setStates(uint256,uint256,uint256,uint256)", +"71d3de2b": "JincorToken()", +"71d49910": "_emitAreaSet(uint256,bytes32)", +"71d4aa3a": "fomo3D4eva()", +"71d4edaf": "setSaleLot4StartTime(uint256)", +"71d50cc8": "payBets(bytes32)", +"71d5af66": "Upfinex()", +"71d5afb5": "extendCrowdsale(uint256)", +"71d5b5dd": "getBonusPoolTotal()", +"71d5d1c2": "updatePrincipal(uint256,uint256,bool)", +"71d5ffbe": "totalETHWagered()", +"71d6dbe1": "isClaimSegmentVerified(uint256,uint256,uint256)", +"71d6e229": "queryRole()", +"71d76096": "ICOcollected()", +"71d7c621": "createDownRequest(address,uint256)", +"71d7e4a9": "transferTokens(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"71d87948": "FixedSupplyToken(string,string,uint256,uint8)", +"71d8d421": "_isValidLicense(uint256)", +"71d8d7af": "setMaxRate(uint256,uint256)", +"71d93cb0": "interuser(address)", +"71d9ffce": "priceChange()", +"71da0e63": "_getValidRandomGenes()", +"71daca00": "grantBackerToken()", +"71dc761e": "enableERC721()", +"71dd46a9": "left19(uint256)", +"71dd8862": "IndexOf()", +"71dd99fe": "BigRisk()", +"71ddd3ad": "multifunctioncoin()", +"71de2ffc": "claimRefund(bytes32)", +"71de6362": "certificateSigners(address)", +"71df8d09": "bigInt(uint256)", +"71dfc116": "Cryptolotto10Minutes(address,address,address,address)", +"71e030d3": "TokensTransferedToHold(address,uint256)", +"71e07813": "issueDevsTokens()", +"71e11354": "updateRegistration(string,string)", +"71e12726": "getBlockStats()", +"71e1fa95": "getHtlcTimeoutBlock(bytes32,bytes32)", +"71e28126": "canFinalize()", +"71e2a657": "addMinters(address[])", +"71e2d919": "lol()", +"71e30719": "ZEC()", +"71e365a0": "AICQ()", +"71e3c76e": "claimGrant(bytes32)", +"71e3c819": "DSToken(string)", +"71e3fdc4": "moveMintTokens(address,address,uint256)", +"71e4cfd7": "ROF()", +"71e5b9ec": "scanAddresses(address)", +"71e5ee5f": "arr(uint256)", +"71e60fe6": "testFailTransferEnableNotTransferable()", +"71e68cad": "claimUsername(bytes32)", +"71e70133": "TotalTokens()", +"71e777ae": "getMemBestInvestor()", +"71e928af": "issue(address)", +"71e9f016": "CompetitionChainContract(uint256,string,string)", +"71ea29df": "blockedContract()", +"71ea3aad": "CollectERC20(address,uint256)", +"71ea6c73": "VIBEXToken()", +"71ea87ee": "getPeriodRange(uint256)", +"71ea980c": "rewardPoolWallet()", +"71eb125e": "oracleAddresses(address)", +"71eb9710": "getDebitDigest(bytes32,uint256,uint64)", +"71ec4cc1": "depositPayout(uint256,uint256)", +"71ec98dd": "issueTokensFromOtherCurrency(address,uint256)", +"71ed4664": "refundTo(address)", +"71edfe35": "hashOfTheDocument()", +"71ee2ce1": "getResponses(uint256)", +"71ee329f": "useCaptainAbility(uint256)", +"71ee872f": "TransactionSettledByMediator(uint256,uint256,uint256,uint256,uint256)", +"71eedb88": "refund(uint256,bytes32)", +"71eee1f4": "IssueStateLoaded(bytes32,string)", +"71ef0d0f": "phxCoin()", +"71ef7862": "seventhTime()", +"71efb7f7": "SimpleSafeToken(uint256,uint8,string,string)", +"71efdc21": "usedTickets(uint256)", +"71efeff1": "transferCommunityBank(uint256,address)", +"71f027fa": "updateOwnerOfWeapon(uint256,address)", +"71f098c8": "LecBatchTransfer()", +"71f0ad64": "TestCrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"71f11552": "changeDNNHoldingMultisig(address)", +"71f124c5": "getDropsOf(address)", +"71f16739": "_createContract(address,uint64)", +"71f297cc": "XaurumToken(address)", +"71f4c9ae": "GameClosed(uint256)", +"71f4f65e": "yearlyOwnerTokenWithdrawal()", +"71f52bf3": "connectorTokenCount()", +"71f5584f": "sponsoredLeaderboardDataContract()", +"71f64a68": "executeTopic()", +"71f6ec3c": "get_car_propse(uint256)", +"71f6fb88": "transferWithReservingNet(address,uint256)", +"71f7aaca": "dragonIndexToApproved(uint256)", +"71f7ebf4": "_doTrade(address,address,uint256,uint256)", +"71f805bf": "numFpBits()", +"71f84164": "_sendTo(address,uint256)", +"71f8746f": "registerBuy()", +"71f90109": "hideDonations(address)", +"71f90fe6": "initializeABIHashForMod(uint256,bytes)", +"71f96211": "assetOf(address)", +"71f9b7f3": "addMultipleAddressesToPublicBuyerList(address[])", +"71f9ff89": "preICOcap()", +"71fa632f": "newVoterAllocation()", +"71fa7f37": "createNewProject(uint256,uint256,address)", +"71fcc672": "setCryptaurRewards(address)", +"71fdd6d3": "_canBreedWithViaAuction(uint256,uint256)", +"71feaac5": "greatgreatcoinERC20Token()", +"71ff01b0": "maxSupplyReached()", +"71ffcb16": "changeFeeAccount(address)", +"72004a65": "getPremiumStatus(bytes32)", +"72012ef6": "test_oneInvalidEqString2()", +"72016f75": "getNodeLength()", +"7202997e": "LogAccepted(uint256)", +"72030d03": "addresses2(uint256)", +"72052773": "deleteChallenge(bytes32)", +"72054df4": "compatible223ex()", +"72067d49": "getBountyBalance()", +"72076c57": "ColorBayToken()", +"72078e3b": "CORNERSTONEAMOUNT()", +"7207c19f": "MyToken(uint256)", +"7207d711": "RewardHalved()", +"7207f9ce": "transactionFeeMax()", +"7208b8f7": "setSkills(uint256,uint32,uint32,uint32,uint32,uint32)", +"7209036a": "fundReservCompany()", +"720b43e8": "intercrypto_cancelConversion(uint256)", +"720b7ee4": "getCardId(string)", +"720be6c7": "CrapToken1A()", +"720c142d": "setRNGCallbackGasPrice(uint256)", +"720c4798": "workshop()", +"720c5732": "TextMessage()", +"720de551": "deleteVoterForCandidate(uint256)", +"720e2a06": "GadielToken()", +"720ed642": "getModuleById(uint256)", +"720edd13": "theanswer()", +"720ee37c": "decrementBalance(address,uint256)", +"72104205": "rewardMint(address,uint256)", +"72108714": "updateHash(bytes32,bytes32,uint256)", +"7211138c": "FreedomCoin()", +"72112286": "closeChannel(address,uint256,uint256,bytes32,bytes32,bytes1)", +"72112ebc": "set_Total(uint256)", +"72117821": "GetTokenAddress(address)", +"72121dac": "FooToken()", +"7212b67e": "add_potion(uint16)", +"7212eadd": "trigger_game_end(uint256)", +"7213cff1": "hasLockedUp(address)", +"7213e335": "guthabenAnzeigen(address)", +"72142c67": "MSECStandardToken(uint256,string,uint8,string)", +"7214d6c3": "isUIntPublic()", +"721547eb": "maintainExternalContractTokenBalance(address,uint256)", +"7215513f": "addTokenClaim(uint256,uint256,uint256)", +"72159335": "voteInitiate(uint256,uint256,uint256,uint256,uint256,uint256)", +"7215b96d": "CheckAllowance(address)", +"7216ab38": "getByteFromBytes14(bytes14,uint256,bytes1)", +"7216b95c": "checkLicense(bytes32,uint8,bytes32,bytes32)", +"7216e02d": "getOracleByName(string)", +"7216ee00": "totalTrainer()", +"7217523c": "addDays(uint256,uint256)", +"721868f8": "queryTinyOracle(bytes)", +"72198ead": "setDSTMultiSig(address)", +"7219d7f7": "OrigamiTokenPurchase(address,uint256,uint256,uint256,uint256)", +"7219dd7f": "allocateTokenETHConvert(address,uint256)", +"7219fa11": "EIP20(uint256,string,string)", +"721a1f57": "endorseCredit(address,uint256,uint256)", +"721a37d2": "revokeTokens(address,uint256)", +"721b67ab": "CNYTokenPlus()", +"721bba59": "getTokenBasicData(address)", +"721c555e": "queryEscrow(address,address)", +"721d7d8e": "currentContract()", +"721dd850": "getOwnedAvatars()", +"721e117b": "getPurchaseRequirements(uint8)", +"721e9969": "getPressCount()", +"721ed9ec": "tokensICO()", +"721fa630": "pubs(uint256)", +"721fefac": "startNewDraw(uint256)", +"721ff138": "tokenMintCap()", +"7220426f": "verifyTokens(uint64,uint64)", +"7221a26a": "storeValue(uint256)", +"7221c3c0": "withdrawJackpotBalance(uint256)", +"72229abf": "setBetFee(uint256)", +"7222e9e3": "sampleToken()", +"7222fe1e": "MNY()", +"72237d97": "setTargetDiscountValue10(uint256)", +"72239313": "addAccountMinter(address)", +"7223cd19": "set(address,int256,uint256)", +"7224267c": "addDeposit(address,uint256,uint256,uint256)", +"72258f96": "allergy(string)", +"72259875": "addCourse(string,uint256,uint256,uint256,string,string)", +"72262699": "forwardOnBehalf(address,uint256,bytes,uint256,uint8,bytes32,bytes32)", +"7226d055": "create(address,address,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"722713f7": "balanceOf()", +"7227bff2": "setTransferOwnership(address,address)", +"7227c5dd": "fundMark(uint256)", +"7227c7ce": "hashNext()", +"7228057f": "ibcFunded()", +"7228b9db": "etherCap()", +"7228becb": "crowdsaleDuration()", +"72298b82": "setEndTime(uint32)", +"722bb4a8": "getSuperManagerContractAddress()", +"722bd85a": "bonusForDate(uint256)", +"722c885a": "endSeedStage()", +"722d1267": "forceWithdrawTokensToAnAddress(address)", +"722d1d13": "setProductCompletionDate()", +"722ded24": "exeSequence(uint256,uint256[])", +"722e1677": "getTotalPublicKeysCount(address)", +"722e9c6d": "Luck()", +"722f0835": "startPrivatePreICO()", +"722fe823": "getActionHistoryItem(uint256)", +"72309714": "setPresellOpen(bool)", +"7230bce8": "add(uint256,string)", +"7230eb42": "AllocatedCrowdsaleMixin(address)", +"7230ef7f": "totalGen0()", +"72317e7b": "totalWeiRaisedDuringICO1()", +"7231a876": "itemsOf(address)", +"7231af39": "getTotalGamesStarted()", +"72325c5b": "initSiriusFund()", +"72337396": "unholdFunds()", +"7233d860": "BitcoinRich()", +"7234ba0c": "MIN_CROWDSALE_TIME()", +"7235c8dd": "PeerReview(address,bytes)", +"7235d2b1": "maintenanceMode(bool)", +"7236f851": "exchangeByAdmin(uint256,address)", +"72378554": "sendToken(uint256,address)", +"7237e031": "tokenToEthTransferInput(uint256,uint256,uint256,address)", +"72388610": "paybackAll()", +"72388f7c": "mintSpecificCards(address,uint8,uint256[])", +"7238ccdb": "getLockInfo(address)", +"72397287": "createOfAthleteCard(string,string)", +"723b2b58": "getMemberListCount()", +"723c308f": "ahs()", +"723c37f7": "TokensTransferrable()", +"723e357a": "pushRound(uint256,uint256,uint256,uint256,bool)", +"723e435f": "setTokenRateInGwei(uint256)", +"723eb2cc": "hurmint(address,uint256)", +"723f291d": "cancelOpenBids(bytes32)", +"723fdfe5": "PaoTestToken()", +"724020be": "GSCT()", +"72405ab0": "approve(uint256,string)", +"7240976c": "trades(address,address)", +"7240eccf": "approveLess(address,uint256)", +"7240f67b": "countActiveType(uint256)", +"72411849": "ChangeTankSellMaster(address)", +"724121ae": "contentExists(uint256)", +"72413a3b": "VOLUME_BONUS()", +"72414501": "SMILO_FOUNDERS_AMOUNT()", +"7241450c": "deliver(address,uint256,string)", +"7241eb8c": "_bpto(uint256,uint256,uint256,uint256,address)", +"72422024": "lockMoneyOnCompoundCreation(address,uint256)", +"72432965": "AdvisorsAddress()", +"7243cfbb": "releasableAmount(address,address)", +"72440c31": "finalizeEndTime()", +"72453422": "directSellSupply()", +"7245f6e7": "stageEnd(uint256)", +"72460869": "test_threeFalseAssert()", +"72468368": "setBlockTargetDelay(uint256)", +"724693ce": "TokenSale(uint256,uint256,address,uint256)", +"7246de3d": "sanityCheck()", +"72470a14": "ShopManager(address)", +"7247390b": "vote_beneficiary(string)", +"72479140": "CreateTicket(address,uint8,uint8,uint8)", +"7247959a": "referral(address)", +"7247a50d": "virtualInvest(address,uint256)", +"7247aafd": "Callous()", +"72490c69": "GREENECO()", +"7249733c": "businessPercentage()", +"7249fbb6": "refund(bytes32)", +"724a5144": "MuneebCoin()", +"724a6246": "claimSeasonPrize(address,int8)", +"724a8487": "getTargetBlocks()", +"724ae9d0": "getMinInvestment()", +"724bc3de": "getAirdropAmount(address)", +"724bdbaf": "externalTxs(uint8,bytes32)", +"724c8393": "changeCrown(address)", +"724dbf36": "isNewBattle(string)", +"724df10a": "alreadyWithdrawn()", +"724edf00": "startTokenDistribution()", +"724fcd4c": "buyAndSetDivPercentage(address,uint8,string)", +"7250dc36": "getMemberName(uint256,address)", +"7250e224": "addDistributor(address)", +"72511fb4": "EventAddressChange(address,address,uint256)", +"72519531": "BagholderAddr()", +"7252518c": "setLockend2(uint256)", +"7252bbf2": "ethBalanceOf(address)", +"7253160b": "convertByteToStr(bytes1)", +"725326dc": "setAllowedForTransfer(address,address)", +"7254895a": "readCards()", +"7254e1ba": "afterGeneratorHook()", +"72558b73": "destroyValue(address,uint256)", +"7255d729": "createGame()", +"7255f7ad": "getLastImageId()", +"72561235": "getCreditbitAddress()", +"72565e3f": "offChainMint(address,uint256)", +"7257dac1": "removeSomeUETsFrom(address,uint256)", +"7258b901": "masterCut()", +"72593831": "withdrow(address)", +"72593b4c": "ordersCanMatch_(address[14],uint256[18],uint8[8],bytes,bytes,bytes,bytes,bytes,bytes)", +"7259ac60": "Rethen()", +"7259bce3": "preSaleTokenPrice()", +"725a731d": "setPendingKNCRateRange(uint256,uint256)", +"725a7eea": "MEGA_HERO_MULTIPLIER()", +"725ad47f": "TransferERCXTokenInitiationEvent(uint256,address,string,address,address,uint256)", +"725c8bdd": "LMITOKEN()", +"725cedd3": "calculateReward()", +"725d8524": "getOption(bool,address,uint128,uint128,address,uint64)", +"725da7b4": "withdrawMicroDivs()", +"725e70a3": "getnumDeposits()", +"725ef390": "mod(uint16,uint16)", +"72601e77": "setOracleFee(uint256,uint256)", +"72601faa": "ROUND_DATA_COUNT()", +"726199b5": "notarizeHash(uint256,string,string,string,bytes32)", +"7261e469": "burn(address,uint128)", +"7261ffad": "spendGameLockedToken(address,uint256)", +"7262561c": "unsubscribe(address)", +"7262eb66": "PRE_ICO_POOL()", +"726300c7": "releaseEscrow(uint256,uint256)", +"72630a6d": "UpdateIndividualContributorCap(address,uint256)", +"7264727d": "STCToken()", +"7265d040": "startAtBlock()", +"72664744": "setDelegadoDeDistritoVerify(bytes32,uint256)", +"726678e7": "level2Bonus(uint256)", +"7266f4a4": "X3()", +"72670119": "payBonus1Address(address)", +"72675562": "extraTokensWallet()", +"7267a25b": "mainSaleMinimumWei()", +"7267f24a": "lrcReceived()", +"726802a4": "addAddressToAccount(address,bytes,bytes,bytes32)", +"7268475b": "ITSMToken()", +"7269a327": "isNonFungibleBaseType(uint256)", +"7269daa5": "requestChangeStaker(address)", +"726a3ad1": "removeReservedTokens(address)", +"726a431a": "TARGET_USER()", +"726ab4ef": "getParentHash(bytes)", +"726aeb20": "costToCreateGame()", +"726b23bf": "changeMinNac(uint256)", +"726b5bad": "endAirdrop()", +"726bd6bf": "oraclizePrice()", +"726c12c8": "FileDataInt()", +"726c6382": "Error()", +"726d0a28": "getRequest(address,uint256)", +"726d50ee": "totalCampaignsBy(address)", +"726d82a0": "SEN()", +"726df9cc": "grantService(address,address)", +"726ea051": "calculateCoinBuySimple(uint256)", +"726ee493": "withdrawStakeTokens(uint256)", +"726ef3da": "getCurrentWinnerMoveCount()", +"726f63f6": "setTokenOffering(address,uint256)", +"727089f1": "extractAllowanceLength()", +"72712bb8": "trophyAddress()", +"72729ff2": "amountRaisedInWei()", +"7272ad49": "decreaseApproval(address,uint256,bytes)", +"7274f35b": "getCoinIndex(bytes32,address)", +"72750dc1": "PANICPERIOD()", +"7275c8cb": "getRecord(bytes32,string)", +"72761e96": "execute_transfer(uint256,uint256)", +"727648a3": "submitWork(address,address,uint256,string)", +"7276509c": "purchaseBuilding()", +"72771d40": "sendList(address)", +"7277236b": "icoInvestment(address,uint256)", +"7278d080": "BTCEarth()", +"7278d623": "CurrentEntityState()", +"7278ef8e": "createExchange(uint256,string,string,uint256,uint256,uint256)", +"727a00a5": "LetsFunds()", +"727a666a": "totalLevelValue()", +"727a899a": "setHashes(uint8,string,string,string,string)", +"727b1cd6": "next_draw(bytes32,uint256,uint256,uint256,uint256,uint256)", +"727b4094": "transferStep()", +"727b4276": "setBitGuildToken(address)", +"727c2ff0": "purchaseWithGze(uint256)", +"727cdf87": "setCut(uint256)", +"727d508a": "isOpenForPublic()", +"727da487": "TTGOracle()", +"727e2422": "StudioToken()", +"727f0067": "nextHash()", +"727fc9fc": "SCAM()", +"72801b53": "isInTimeRange(uint256,uint256)", +"728064cd": "GetTotal()", +"7280850e": "getHandRank(uint32)", +"728171ba": "addressRegister(address,address)", +"7281854d": "GetCategoryValue(uint8)", +"7282c5b1": "WithdrawFeeBalance(uint256,address,uint256)", +"72840e32": "rentPeriod()", +"72841e0c": "isMaxCapReached()", +"728435a0": "ReverseProposed(string,address)", +"7284e416": "description()", +"72850e7a": "priceNeedsUpdate()", +"728516c2": "getProjectedPayout(bool,uint256,uint256)", +"72852fe5": "attackTile(address,uint16,uint256,bool)", +"72855080": "demurringFeeDenum()", +"72879610": "sencHardCap()", +"728880c2": "payOutVoterByAddress(address)", +"7288b0a9": "numberOfPingsAttempted()", +"7288b50c": "engraveNamespace(string,string,bytes32)", +"72892f4f": "newPlay(uint256,uint256,address,uint256,uint256,uint256,uint256,uint256)", +"7289f28e": "setLastRound(uint256)", +"7289f9aa": "setDiscountedInvestor(address,bool)", +"728a6755": "buyBookLotto()", +"728addbc": "token_balanceOf(address)", +"728af7ec": "getInterest(uint256,uint256)", +"728b763c": "extendTde(uint256)", +"728c3ea2": "getBorrower(bytes32)", +"728c97ca": "returnEther(address)", +"728cbc44": "userHeldTill(address)", +"728cd741": "SnapshotAndDistributePot()", +"728cf508": "bookingMetadataForKey()", +"728d0e2b": "accrueDividendandCoupons(uint256,uint256)", +"728d3dd2": "newRaceDistCon(address)", +"728d5e94": "baseTokensPerEther()", +"728de91c": "preSale(address,address,uint256)", +"728ec9f1": "YourCustomToken()", +"728f31e7": "setTransferEnablingDate(uint256)", +"728f3a21": "isApprovedWallet(address)", +"72909e28": "calculateIdeaSell(uint256)", +"7290c21d": "auctionCancelled(uint256,address)", +"7290f691": "horseShoePr(uint256)", +"72910be0": "setTitle(string)", +"7291acdf": "SaleWindowUpdated(uint256,uint256)", +"72923378": "RockPaperScissors(address,address,uint256)", +"72927b1e": "deleteEntryByName(bytes32)", +"72929b56": "getKudosPerProject(address)", +"7294789b": "getWhaleCard()", +"7296359a": "fog()", +"729680c3": "epsAddress()", +"7296dae6": "jsonCat(string,string,address)", +"7297be7f": "changeFixedCommissionFee(uint256)", +"72987457": "blocktrade()", +"7298b261": "_calcEditorKey(bytes)", +"7299054c": "random(uint256,uint256,uint256)", +"72998d8e": "LotteryGameLogic(address,address)", +"72998ee1": "addPreSalePurchaseTokens(address,uint256)", +"729ad39e": "airdrop(address[])", +"729aeea6": "isSetupRunning()", +"729b3881": "setNewRound(uint256)", +"729c04fd": "_yearTwoClaimed()", +"729cc83e": "getPlayerKeyCount()", +"729e3ef8": "YOPT(uint256,string,uint8,string)", +"729e6f2b": "getGameChance()", +"729ee75b": "updateUSDXGE(uint256)", +"729ef530": "additionalBonus()", +"729f0e8e": "cmct()", +"729f2439": "addK(uint256)", +"72a02f1d": "finalizeInit()", +"72a06b4d": "returnInt8(int8)", +"72a0c16e": "tulipToApproved(uint256)", +"72a1a8ae": "CanSignIn()", +"72a1b73f": "createSale(uint256,uint256,uint256,uint256,address)", +"72a1e258": "updateUser(address,string,uint256,uint256,uint256)", +"72a20c78": "powers()", +"72a22014": "firstAuctionsHighestBid()", +"72a22d51": "unlockValueOf(address)", +"72a2d90c": "quickWithdraw()", +"72a4a02f": "runPreMint()", +"72a4d94b": "release(bool)", +"72a503be": "transfer(address,address[],uint256[])", +"72a52851": "checkProof(bytes32[],bytes32,bytes32)", +"72a56d2c": "ICO_RATE1()", +"72a66507": "_isNewUser()", +"72a6a480": "_validRating(uint8)", +"72a7019c": "saleHardCapEther()", +"72a74d5b": "confirmOffer(uint256)", +"72a7655e": "timestampMint()", +"72a7b8ba": "multiDecreaseApproval(address[],uint256[])", +"72a7c229": "right41(uint256)", +"72a7d8c9": "lengthEqual(bytes32[],uint256,string)", +"72a7ff87": "isKYCRequiredToSendTokens()", +"72a85604": "min_amount()", +"72a86693": "ambassadorsNumber()", +"72a88673": "nthRoot(int256,int8)", +"72a984b2": "blockMinedAt()", +"72a9e232": "reserveFunds()", +"72aa18d7": "WALLET_ECOSYSTEM()", +"72aa343a": "removeProof(address,bytes32)", +"72aa9349": "maxTickets(uint256)", +"72aab7d7": "setGPSEndTime(uint16,uint8,uint8,uint8,uint8,uint8)", +"72abee88": "PreIco(uint256,uint256,address,uint256)", +"72acad56": "check_reward()", +"72ad21c7": "protection(uint32)", +"72ad3c9f": "OTCChain()", +"72ad5bbe": "_isErcToNativeBridge(address)", +"72adc407": "getGuardianVend(uint256)", +"72adcadd": "TOTAL_CONTRIBUTOR_COUNT()", +"72ae74dd": "getCoinRemains()", +"72ae9e54": "blocksCoordinates(uint256,uint256)", +"72af7b43": "SkyeCryptoPrivate(uint256,string,string)", +"72af805e": "sendPreIcoTokens(address,uint256)", +"72b0d90c": "withdrawTo(address)", +"72b28d27": "getNext(address,uint256,uint256,uint256)", +"72b2ee75": "investorsNum()", +"72b30d39": "setLLV_edit_30(string)", +"72b38ab9": "refundUser(address)", +"72b3936d": "EWBToken()", +"72b3f570": "endBuy()", +"72b44b2c": "getSaleReturn(address,uint256)", +"72b4e98f": "Aecium()", +"72b4f111": "COOPToken()", +"72b50845": "eliminateSDCC(address,address,uint256)", +"72b556c7": "emissionReleaseTime()", +"72b59c68": "createNote(uint16,bytes2,bytes12,bytes)", +"72b5e050": "LOCKED_ALLOCATION_PPM()", +"72b60682": "lockEndDate()", +"72b614af": "itemsPerPage()", +"72b7094a": "tokensPerEthPresale()", +"72b75585": "getOriginalClient()", +"72b7f893": "metaIncreaseApproval(address,uint256,bytes,uint256,uint256)", +"72b81b1c": "resolveLotteryByHand(uint32,uint32)", +"72b8a5cf": "bonusPersent()", +"72b8de14": "isChallengePeriodOver()", +"72b902a7": "setvolumebounus(uint256,uint256,uint256)", +"72b91e61": "seen(address)", +"72ba8259": "testMinting()", +"72baa12e": "withdrawQR(address)", +"72baa779": "setItoEndTime(uint256)", +"72bc56fe": "IsMultiFreeze(address,address[],bool)", +"72bc8fc6": "ether2tokens(uint256)", +"72bc8ff2": "isOMITokenLockContract()", +"72bc9240": "etherPerSale()", +"72be346c": "ZTR_ETH_initial_price()", +"72becdee": "_generic(bytes,address)", +"72bedcee": "operationState()", +"72bf079e": "adjustPrice(uint256)", +"72bff5ad": "freezeMintingFor(uint256)", +"72c03508": "contributorClaim()", +"72c0e7a4": "setThreshold(bytes32,uint256,uint256,address)", +"72c1591c": "testFail_basic_sanity()", +"72c174db": "mintTokensForAdvisors()", +"72c1df4c": "transferDirectorB(address)", +"72c27b62": "setFeeBps(uint256)", +"72c3015c": "mint(int256,address,string)", +"72c4639e": "SummRew()", +"72c4ae6b": "walletForCommunity()", +"72c537e6": "FirstCryptoBank(uint256,string,string)", +"72c5c349": "NinjaCore()", +"72c5cb63": "getAmountTransferred()", +"72c60b1d": "tokenAddressToAssetData(address)", +"72c691b2": "setWarTokenAddr(address)", +"72c70758": "setBountyFundWallet(address,address,uint256)", +"72c7c85a": "minority()", +"72c7e48d": "addAddressesToWhitelist(address[],string)", +"72c87075": "testBlockHeaderFetch()", +"72c87e37": "MahamHasanTestCoin()", +"72c91cdd": "maxTokenForPreSale()", +"72c9a5e3": "approveFST(address,uint256)", +"72c9e9e0": "placeBid(uint64)", +"72ca7fce": "TrueVeganCoin()", +"72cb8942": "everyCoin(address,uint256)", +"72cb8a89": "TokenWithdraw(address,uint256,address)", +"72cc1f5a": "knightAddress()", +"72ccd03a": "delWord(string)", +"72cd5576": "getImpactLinked(string)", +"72cd700b": "totalSupplyExpansionTokens()", +"72cd7b89": "foundationTarget()", +"72cde347": "setMiniPoolEdit_5(string)", +"72cee8ea": "getReferralProfit(address,address)", +"72cef34b": "getRevisionIpfsHash(bytes32,uint256)", +"72cf3b40": "recharge(bytes32,uint256,address)", +"72cfea69": "presaleClosingTime()", +"72d00e9f": "activeContracts(uint256)", +"72d0774a": "presaleFinishTime()", +"72d0979a": "AddBonusToListFromArray(bytes32[],uint256[],uint256[])", +"72d16358": "Oratium()", +"72d209f5": "processRequest(bytes32[],bytes5,address)", +"72d29f64": "setValidatorName(address,string)", +"72d2f8b8": "createHodler(address,bytes16,uint64)", +"72d32586": "STOREDIG()", +"72d32968": "withdrawBonus(uint256)", +"72d376b6": "proofTokensAllocated()", +"72d3880e": "mainICO()", +"72d39ee4": "Credo(address,address,uint256,uint256)", +"72d475db": "getTotalHeartsByDappId(uint256)", +"72d4b93c": "VitManToken()", +"72d5637f": "AxieCore()", +"72d5fe21": "changeProposer(address)", +"72d744e0": "feeFromTotalCost(uint256,uint256)", +"72d8c1c7": "ForestCoin()", +"72d8e442": "hasBeenRevealed(address,uint256)", +"72d9733e": "add_AUTO_MANU()", +"72d99675": "getCollectible(uint256)", +"72d9b86f": "unpauseCrowdsale()", +"72d9f13d": "setMaxEarningsClaimsRounds(uint256)", +"72dad9f9": "SuperCoinViewToken()", +"72db2339": "ERC677Transfer(address,address,uint256,bytes)", +"72dd236a": "setTokenOffering()", +"72dd529b": "totalsupply()", +"72dd52e3": "coinContract()", +"72dee32b": "getEndGameStatus()", +"72df02a7": "setMintThresholds(uint256,uint256,uint256)", +"72dff527": "drawTertiaryBWinners(uint256)", +"72e05569": "_sendRefund()", +"72e09d48": "mokenId(string)", +"72e0e984": "prime(uint256)", +"72e18c12": "placeSellOrder(uint256,uint256,uint256,uint256)", +"72e208eb": "targetAddr()", +"72e2cac8": "BONUS_WINDOW_4_END_TIME()", +"72e2f8f5": "checkFreeze(address)", +"72e38003": "treefs()", +"72e3c5c2": "toggleEmployeeSuspension(address,uint32)", +"72e3f040": "richestRoundId()", +"72e4030d": "_freezeTransfer(address,uint256)", +"72e496f3": "setRestrictedState(bool)", +"72e4dc06": "changeProductAvailability(uint256,uint256)", +"72e4f262": "annotationLength()", +"72e4f5cc": "CreateOffer_internal(uint8,bool)", +"72e5186c": "depositTo(uint256,address,uint256)", +"72e5c84f": "_getTokenBonus(uint256)", +"72e67d06": "setPendingManager(address)", +"72e6aca3": "isWithinICOTimeLimit()", +"72e6e21a": "exchangeableTokens()", +"72e7a69c": "isHardCapAchieved(uint256)", +"72e861ee": "private_setRandomAPIKey(string)", +"72e87c35": "giveProduce(uint256,string)", +"72e8e6a4": "PublicMined(address,uint256)", +"72e91fee": "initialPartnerAccount(uint8)", +"72e98a79": "transferBZxOwnership(address)", +"72ea1eb0": "addressBytesFrom(address,uint256)", +"72ea2e6d": "finishInitialExchangingPeriod(uint256)", +"72ea4b3d": "TestToken(uint256,string,uint8,string)", +"72ea4b8c": "getNumInvestors()", +"72ea61e8": "dist_developer(address,uint256)", +"72ea7243": "generateLand()", +"72ea8bfe": "executeBet(address,address,bool,uint256)", +"72eab193": "COMPLIANCE()", +"72ead941": "getDelegate(address,uint8)", +"72eae629": "multiMintBounty(address[],uint256[])", +"72ebe2aa": "verifyYourBalance(address)", +"72ec1993": "enablerefund(address,address)", +"72ece81c": "_create_island(bytes32,address,uint256,uint256,uint256,uint256)", +"72ed2c7f": "setQualifiedInvestor(address,bool)", +"72eda05f": "tokensAllocatedToCrowdFund()", +"72ee91c2": "configSignOrganizers()", +"72eec3a7": "refundToken(bytes32,string,address,address)", +"72eefb8a": "getRareItemsOwner(uint256)", +"72ef149e": "whiteListRegistrationEndTime()", +"72ef5458": "transferTokenOPSPlatformTokens()", +"72ef6a08": "rgbLimit(uint256)", +"72ef90e4": "Shop(address,string,string,uint256,uint32)", +"72efa4ef": "Showcoin()", +"72f0424f": "getPriceToken()", +"72f12814": "_setIDLE(uint256)", +"72f1301a": "USCCToken()", +"72f159b7": "migratePlayerData2(uint256,address,uint256,uint256,uint256,uint256)", +"72f3b3c4": "ownerAbandonOverride(uint256)", +"72f41f11": "approvedRatio(uint256)", +"72f443be": "ChangeLicense(address,bool)", +"72f4ecab": "Balances()", +"72f4f5f9": "TOKEN_REFERRAL()", +"72f52a3e": "getAttoTokensAmountPerWeiInternal(uint256)", +"72f57f1f": "withdrawUnsoldTokens(address)", +"72f5ae5f": "setCertificationManager()", +"72f5bb30": "UKToken()", +"72f5fccd": "releaseToMgmtTeam(address,uint256)", +"72f65dea": "BitstartiToken(uint256,string,string)", +"72f69a72": "getBurnRequestsLength()", +"72f6c3b5": "coinPercentage()", +"72f702f3": "stakingToken()", +"72f71894": "backTTCOwner()", +"72f74af8": "crowdfundAddress()", +"72f79b56": "btcEthRate()", +"72f83d3a": "poolSub(uint256)", +"72faebdb": "addCustomerFromACC(address)", +"72faf84a": "tokenSTCDRforBurnInControlWallett()", +"72fb54e5": "PHASE_2_PRICE()", +"72fb6f75": "MIN_INVEST_SUPPORT()", +"72fb9703": "challenge(address)", +"72fc493d": "decFeeDeposit(uint256)", +"72fc75d7": "_changeTrancheIfNeeded()", +"72fd1a7c": "changeRateSale(uint256)", +"72fd8772": "toekensForOthers()", +"72fdbf25": "increaseDividendPayments(address,uint256)", +"72fecf84": "upgradeUnitId(uint256)", +"72ff1773": "bonus_percentage()", +"72ff285e": "_calculatePayout(bytes32,uint256)", +"72ff3d87": "signedBySystem(bytes32,bytes)", +"73032446": "censorAndCover(address,uint256,string)", +"730369a7": "tokensBounty()", +"7303a559": "getCreatorMetadata(string)", +"7303ed18": "trustedUniverseBuy(address,uint256)", +"73047e93": "timeslucky()", +"73053410": "newVersion(uint16[3],address,bytes)", +"73053f70": "tokenDeposit(address)", +"7305c695": "_orderTokens(address,uint256,uint256,address)", +"7305dce1": "createPromoCollectiblesWithMining(uint256[],address[],uint256[],uint256[],uint256[],uint256[])", +"73069f94": "_claimTokens(address)", +"730720b8": "testControllerValidTransfers()", +"730736c9": "DelSocialAccount(bytes32,bytes32,bytes32)", +"730740f8": "_resumeWork(uint256)", +"7307b805": "dismissTokenOperator(address)", +"73086e58": "isFreezeTimeout()", +"730a04fd": "ArnoldCoin()", +"730a0d80": "unhold(address)", +"730a1a16": "_medalUnFreeze(uint256)", +"730a3127": "RECORDICO(address,address,uint256,uint256,uint256,uint256)", +"730a9f1c": "UncleToken()", +"730ad454": "vote(bytes32,address,bool)", +"730afd06": "_proposeAmendment(address,uint256[],uint256[],bytes32)", +"730b1952": "test_insert_updateHead()", +"730bdc96": "getHeroDetails(uint256)", +"730c1faa": "LogUnpause()", +"730c635a": "_checkToiletFlush(bool,uint256)", +"730d2221": "CWS(uint256,string,string)", +"730db1f8": "setNum(uint256,int256)", +"730e90b7": "addTipBalance(uint256,address,uint256)", +"730ef269": "getNumberOfItems()", +"730f2a96": "_transfer(address,address)", +"73107c99": "ICDStartTime()", +"7310c2e0": "Daisee()", +"73124ced": "transferLock()", +"73124ee9": "ContractDetector()", +"7312aaae": "singleWithdrawMax()", +"7312c065": "Receiver()", +"7312d625": "paySuperprize()", +"73137bd0": "buildInternalSalt(uint128,address,address,uint256,uint64)", +"73138e4f": "PRESALE_SUPPLY()", +"73139c0d": "getTokensForStage(uint256,uint256)", +"7313b3b1": "Drawing()", +"7313ee5a": "vestingPeriod()", +"7314221e": "_createDeveloper(string,uint256,uint256)", +"7315acc8": "getAllShareholdersOfArtwork(uint256)", +"7315af6f": "LandmarkCoin()", +"7315f446": "votedKickoff()", +"7316453e": "setPrice1(uint256)", +"7317a88d": "transferSingle(address,address,uint256)", +"7317c4f3": "replaceAnimal(uint8,uint16,bool)", +"731859bc": "batchLockArray(address[],uint256[])", +"7318b453": "setVotetUntil(uint8)", +"7319b43e": "playersList(uint256)", +"7319e5aa": "calculateBonus(address)", +"731a00f5": "calculateVestedTokens(uint256)", +"731a3b06": "unstakeFrom(address,uint256)", +"731ac7ed": "choosePerk(uint8)", +"731b185e": "LogSetPreICO(address,string)", +"731b3284": "Lockable()", +"731bed8b": "WithdrawalStarted(address,uint256)", +"731c2f81": "feeRebate()", +"731c7c62": "setServiceRegistryEntry(uint256,address)", +"731e1c94": "setLastPrice(uint256,uint256)", +"731e1ecd": "preMarketingSharesDistributed()", +"731f03fc": "setMinimumBuy(uint256)", +"731f49b7": "lastIdGen0()", +"731f93c5": "updateCertification(uint256,string,string,string,uint16)", +"731fb32e": "PRE_SALE_GMR_TOKEN_CAP()", +"73201667": "tokenUnlock(address,uint256,address,uint256)", +"73206348": "raiseDollarsWithdrew(address,uint160,int160)", +"7320753b": "approveConnection(address,address,uint256)", +"7321a17b": "getTotalBonusTokensByAddress(address)", +"7321ffa6": "distributeFunds(address,uint256,address,address,address)", +"73221a55": "unblock(address,bytes32)", +"732264b4": "getCommitmentsOf(address)", +"73228786": "setTokenAddresses(address[6])", +"7322dccd": "lastBlock_a16()", +"7323febe": "aa(uint256)", +"73247269": "getPoolContractPolicy(uint256)", +"73251628": "doAirdrop(address)", +"732519d5": "getSellable(uint32)", +"73252322": "RandomProofFailed(bytes32,uint256,uint256)", +"73256a8d": "SharesChainTokenCrowdFunding(address,address,uint256,address,address,address)", +"7325b084": "GdprCash()", +"732606fc": "getCooldownIndexCount()", +"732617bb": "switchAdmin(address)", +"7326b901": "getPropertyCount()", +"7326cac8": "ethIn_()", +"732726d1": "increaseLockedAmount(address,uint256)", +"732783ac": "tokensBought()", +"7328c6ec": "submitNewContract(string,address[],string,bytes32)", +"7328f531": "evaluateSkill(address,uint8,uint256,uint256,uint256)", +"7329036a": "getBlocksLeftInCurrentKick()", +"732a37c9": "SnowdenAffact()", +"732b6963": "emitEnd()", +"732bdbbf": "clearApprovalAndTransfer(address[16],address,address,uint256)", +"732c227f": "contributionCaps(uint256)", +"732d2da4": "testHasCinderToken()", +"732d565b": "ONE_YEAR_KEEPING()", +"732e632e": "assemblyTest()", +"732e77d0": "EGGS_TO_HATCH_1SHRIMP()", +"732e78d1": "_sign(address)", +"732ef12c": "fee_registration()", +"732f5d0c": "AdvancePayplus()", +"732fe2ff": "buyerCapLowEther()", +"73305f14": "Quicketh()", +"7330aba2": "getOracleAddresses()", +"7330aca4": "_isTransferAllowed(address,address)", +"7330daac": "isOnList(address)", +"73311631": "addBrand(address,string)", +"733122aa": "fromMemory(uint8[])", +"73321f03": "GateToken()", +"733261bf": "bountyAdress()", +"7332b520": "getRewardsCount(uint256)", +"73333128": "out3Done()", +"73335b46": "GlobfoneToken()", +"73339a13": "setNetworkState(uint256)", +"7333fd00": "lock4Dividend(uint256)", +"73342168": "BFToken(string,string,uint8,uint256)", +"733452bc": "Descript()", +"733480b7": "transferToICAP(bytes32,uint256)", +"7334a63f": "whatWouldPurchaseDo(uint256,uint256)", +"7334b2d7": "isBurnWallet(address)", +"7334d5e2": "editSpecial(uint256,uint256,uint16)", +"73357018": "RATE2()", +"73373879": "RecoveryQuorum(address,address[])", +"733746ba": "Snickers()", +"73379c54": "SecretNoteUpdated(address,bytes32,bool)", +"7337c993": "initiate(uint256,bytes20,address,address,bool,uint256)", +"73383832": "barrierPrice()", +"73384fd5": "addMultipleAddressesToUncappedAddresses(address[])", +"7338c25c": "hasAttribute(address,bytes32)", +"7338ddcc": "acm()", +"7338faba": "setHardCapEther(uint256)", +"73396ff4": "getLoanToDepositRatio()", +"7339affc": "UbiqTalk()", +"733ad6e3": "BHMBLU()", +"733b679e": "PRESALE_LEVEL_2()", +"733bdef0": "getStakerInfo(address)", +"733bf2f2": "setPercentageCut(uint256)", +"733ccaba": "setResolver(string,address)", +"733d8053": "containsToken(address)", +"733dca75": "registerCoin(bytes4,string,string,address)", +"733e193c": "saleHasEnded()", +"733ef936": "drainFunds()", +"733efe16": "numSkinOfAccounts(address)", +"7342048a": "transferOwnershipOfContract(address)", +"7342c484": "airdropDistributedTokensAmount()", +"73440745": "listItem(uint256,uint256,address,bytes32,address)", +"73454fe4": "StuckOnStupidToken()", +"7345a3a2": "payExcess()", +"7345da39": "logPayerStatement(string)", +"73463965": "notifyPlaceSellOrder(uint256,uint256)", +"73463c9c": "ReceivedETH(address,uint8,uint256)", +"7346ec57": "tokensToWei(uint256)", +"73475373": "trySell(uint256,uint256)", +"73479f39": "totalT8EXSold_CORNERSTONE()", +"7347a25d": "BitcoinTrade()", +"7348ac1f": "ecoSupplyAddress()", +"73493f09": "getTokensCost(uint256)", +"734a2c72": "ProjectTestToken()", +"734a56f0": "preSaleEtherPaid()", +"734b4861": "addOpenAction(string,address,string)", +"734b9a87": "mod(uint64,uint64)", +"734bb97e": "checkcoursestudent(address)", +"734ce665": "newProposal(address,uint256,bytes32,bytes32)", +"734d8287": "unclaimedFees()", +"734e21bd": "getToken(address,address,uint256,address)", +"734e3015": "newMegabox(address,uint256,uint256)", +"734f2838": "FinishCompetition(uint32)", +"734f8a4d": "kycValid()", +"735056a3": "SpoolAmount()", +"73520a2b": "getReservedTokenDestinationList()", +"7352e4b8": "setAffiliate(address,address)", +"735307fb": "createTimeLockContract()", +"73535aa7": "PixelUpdate(uint32,uint8)", +"7353a21d": "queuedAmount()", +"7353f62b": "testGetApprovalDb()", +"73545d44": "landmarkOwnershipCount(address)", +"73549604": "getFinalTime(bytes32)", +"7354eb04": "rocCoreAddress()", +"7355303e": "_priceOf(uint256,uint256)", +"7355a424": "getDataCount()", +"735631ad": "revokeTransaction(uint256)", +"7356a8a9": "getTile(bytes)", +"73580358": "ColorBayTestToken(uint256,string,string)", +"73582884": "releaseGrant(address,address,bool)", +"735958f2": "XPAAssetToken(string,string,uint256)", +"73596cfc": "Bitcoincredit()", +"73599205": "ProdDToken()", +"7359f5cf": "FundAddress()", +"735a3326": "getLeftTickets()", +"735a80b1": "test_voteSpammingAgainst()", +"735af2eb": "Rate10()", +"735b232c": "addWhitelistedTransfer(address)", +"735b266d": "icoStage1Deadline()", +"735b38a3": "getCardCanPresaleCount()", +"735b81ab": "circulationAt(uint256)", +"735bae84": "migrateRoundData(uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"735bb742": "sha256Docs(bytes32)", +"735cfff2": "valueTotalSupply()", +"735d3e81": "updatedBalance(address)", +"735d45e1": "RADIUM()", +"735d8876": "getCurrentExpirationTime()", +"735dcc8b": "devfeetodev()", +"735e9cbb": "disableModule(bool)", +"735f11b4": "updateAndWithdraw(uint256,int256[2],uint256[2],int256,bytes32,address,uint256,uint256,uint256[3])", +"735fb8e0": "fundOwner()", +"7360ab6e": "mint(address,uint256,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"73611c48": "send3MilWeiToPong()", +"73618371": "Molecule(uint256,string,string)", +"7362377b": "withdrawEther()", +"73627826": "getTime(uint256)", +"7362d9c8": "addWhitelistAdmin(address)", +"7363d85b": "TMEXAddress()", +"73646c91": "updateMirroir(address,address)", +"7364a8dc": "MyBalance(uint256)", +"73654b6d": "userTransferFrom(address,address,uint256)", +"7365870b": "bet(uint256)", +"7365babe": "MIN_TOKEN_INVEST()", +"7365e1fd": "setPriceCutoff(uint256)", +"7365e2d7": "totalPresaleTokensSold()", +"736660ac": "determiningWinner()", +"7366794e": "distributeTokens(uint256)", +"73668b06": "XCCCrowdsale(address)", +"7366c68d": "calculateCommission(uint32)", +"7366e3ff": "raisedInPresale()", +"73671268": "vestToAddress(address,uint128)", +"73674ecc": "admin_deposit(uint256)", +"7367df4b": "Syndicate(uint256)", +"7367e302": "ContractCreationTransaction(bytes,uint256,uint256,address,uint256,uint8,uint256,uint256)", +"7367f156": "gameSettings(uint256,uint256)", +"73681818": "EICQ()", +"73688914": "owner1()", +"7368a8ce": "create(bytes32)", +"7368b3cb": "DinsteinCoin(uint256,uint256,uint256,string,string)", +"736a0102": "bonusETH()", +"736a1b9a": "AdjustClientAccountBalance(bytes32,bytes32,bytes32,string,uint256,string,uint256)", +"736b13ae": "setRefillFor(string,uint256,uint256)", +"736c24b5": "AdsharesToken(address,address,address,uint256)", +"736c3e82": "onPayment(address,uint256,bytes)", +"736c983a": "setCurrentRevision(address)", +"736d323a": "setPausable(bool)", +"736d7c52": "isAlreadyDelegate()", +"736d7ee9": "revokeAccess(address,int256,address)", +"736ead2c": "optionsCalculator()", +"736ec05c": "setMigrateTo(address)", +"736eec58": "TransferAnimalToAnotherUser(uint256,address)", +"736fafd3": "setPreIco()", +"736fe565": "withdrawAmount(address,uint256)", +"73705090": "teamOnePrefix()", +"7370a38d": "getNumPackages()", +"7372014e": "midnight()", +"73720de9": "receiveMonthlyNRT()", +"7372196c": "PHASE_4_PRICE()", +"7372c2b5": "pull(address,address,uint256)", +"73732024": "isDeposited(address)", +"737377fe": "getTokenVolumebasedBonusRateForPhase2(uint256)", +"7373af84": "numberOfNarcosByDistrict(uint8)", +"7373f41d": "getEthereumBalance()", +"73741171": "createVCXVault(uint256,address)", +"73743fbe": "prospectors_team()", +"7374b013": "buyTDETokensWithoutETH(address,uint256,uint256)", +"737517f5": "powerUp(address,uint256)", +"73752db4": "getKYCPayload(bytes)", +"7375c0c3": "PonderGoldToken()", +"7375e0fe": "testSimpleObject()", +"7375ed82": "LogLoss(address,uint256,uint256)", +"7376678b": "finalizePreSale()", +"7376fc8d": "right67(uint256)", +"73770c01": "Updater()", +"737732b2": "DEVELOPERS_BONUS()", +"7377a036": "CloudexchangeToken(address)", +"737a7698": "transferAssigner(address)", +"737aa5a0": "remainingTokensWallet()", +"737c2d8c": "checkAvailableTokens(address,address)", +"737c8ea1": "_getRevisionBlockNumber(bytes32,uint256)", +"737ce916": "MT(uint256,string,string)", +"737d5f39": "AccessAdmin()", +"737d8c8e": "ChangeTokenWalletAddress(address,address)", +"737e2835": "_minHouseEdgeClassic()", +"737e7d4f": "getByVersionId(uint256)", +"737f18ff": "_weiToVouchers(uint256)", +"7380fbf3": "removeMemberArrayToken(address,address,uint256)", +"73815ab7": "nfc_simplehq()", +"738198b4": "cast(uint256)", +"738228cd": "testUmlaut()", +"73826a93": "updateTokenDetails(string)", +"7382901e": "serverSeedHash()", +"73835f35": "checkIfEligable(address)", +"7383d709": "buyItem(uint256,address)", +"7383d8ee": "getEachBindAddressAccount()", +"73845cfa": "setLocked(address,uint256)", +"738486bd": "BeerCoin(uint256)", +"7385c4be": "deleteHiddenPosition(uint32,int64[],bytes16)", +"7385e1f3": "level_5_amount()", +"7386c2be": "Exilium()", +"7386f0a7": "reservedTokensDestinations(uint256)", +"7387479e": "reclaim_art_token()", +"73889677": "ownerLives()", +"73889f4a": "getHoldersCount()", +"7388fb2b": "AltTokenDistribution(address)", +"73898796": "Tier_Classic_Registration()", +"738a2679": "left85(uint256)", +"738a2cf8": "nextPaymentTime()", +"738acb3b": "sha(string)", +"738b2fac": "setSignedPublicEncKey(string)", +"738b31b5": "minimumWithdrawal()", +"738c2931": "rewardTwo()", +"738d8d82": "numberWikiPages()", +"738ddabe": "getContentIndexedAccountCred(uint256,address,address)", +"738e6d78": "checkRefund(address)", +"738fa7a4": "userRank()", +"738fdd1a": "reg()", +"7390a673": "MyEtherTellerEntityDB()", +"7390c786": "getRandomResult()", +"739112da": "safeSubtrCPCE(uint256,uint256)", +"73913545": "fundVesting(uint256)", +"73916918": "getinfowinning(address,uint256)", +"73918980": "multiTransferEth(address[],uint256[])", +"73925694": "take(uint256,address[])", +"739294d2": "setAssignedID(address,address,uint256,string)", +"7392ce80": "TokenDeployed()", +"73930ce2": "validAmount()", +"73931bbf": "getGame(bytes32)", +"73932bfd": "withDrawal()", +"7393d262": "goldenTicketUsed(address,string)", +"7393e0b2": "DayTrader()", +"7394cb3f": "addLocationRecord(uint256,uint256,string,string)", +"73962b26": "isReleased(uint256)", +"73963bf0": "setIdArray(address,address,string,string,uint256[])", +"73964787": "batchAddCancelledOrFilled(bytes32[])", +"7397d5f1": "getMintForReportingParticipantAmountValue(int256)", +"73980d69": "dollarRaised()", +"739826c5": "changeAllowTransfer()", +"739838be": "DigitalEnthusiasts()", +"73984188": "delOwner(address)", +"739890f0": "disqualifyTeam(address)", +"7398ab18": "getPosition()", +"7399646a": "theRun()", +"73998758": "smpToken()", +"739ab361": "needApprovesToConfirm()", +"739b47ca": "recordWin(address)", +"739b5014": "Snatch(uint256,address,address)", +"739b6214": "doProveMemoryWrite(uint256,bytes32,bytes32[])", +"739b78ed": "LogSell(address,uint256,uint256)", +"739b8c48": "setForwardedOutcome()", +"739bdcff": "pricePause()", +"739beded": "mintSendTokens(int256)", +"739cb57d": "setEndtDate(uint256)", +"739d3307": "SetWho(address)", +"739d980e": "address(address,uint256)", +"739e40b7": "getMyPunchCards()", +"739e7f48": "TeamChoice(address,uint256)", +"739f2224": "SetActive(bool)", +"739f763e": "getListing(bytes5)", +"739f888c": "setNewEstimate(int256,int256)", +"739f9202": "dev_share()", +"739fab1b": "getAvailableWithdrawInvestmentsForOwner()", +"73a070bc": "addressReserveFund()", +"73a077a4": "sub16(int16,int16)", +"73a17e6d": "setCompte_31(string)", +"73a19dd2": "Deposited(address,uint256,uint256)", +"73a1e7f5": "allReceivedEth()", +"73a1f366": "founderTokenCount()", +"73a22e62": "fetchPaidOrdersForMerchantByAdmin(address)", +"73a26a12": "CryptoDiamondCoin()", +"73a29b5e": "get_presale_arbits_sold()", +"73a2d1ff": "MexicovsSweden()", +"73a3d9e4": "canUpdatePercentToTakeAsSeed()", +"73a40efb": "_computeRarity(uint256,uint256,uint256,uint256,uint256,uint256)", +"73a4c307": "COMMUNITY_SUPPLY()", +"73a55389": "setRarePrice(uint256,uint256)", +"73a5717e": "BaironSupply()", +"73a5f508": "getAuditorRegistry()", +"73a699ad": "isGenesMarket()", +"73a6b2be": "isAccountValid(address)", +"73a72b18": "setFountainFoundationOwner(address)", +"73a75c1f": "addVineyard(string,uint16,uint24,uint32,uint16)", +"73a7b8b2": "storeStages(uint256[])", +"73a7dfda": "we()", +"73a80336": "prizeWon()", +"73a80b74": "_mintSqr(uint256,address,uint256,uint256)", +"73a91544": "showMigrationStabitcoinAddress(address)", +"73a95ddd": "redemptionPaused()", +"73a97787": "sgcToken()", +"73a97f42": "MetaRules(address,address[])", +"73aad472": "guaranteedBuyersBought(address)", +"73ab7503": "FlightPlan(address)", +"73abecbb": "kill1()", +"73ac4739": "getOnSellCardIds()", +"73acbcb2": "switchBleachAllowed(bool)", +"73acee98": "totalBorrowsCurrent()", +"73ad2a15": "AllowedRecipientChanged(address,bool)", +"73ad468a": "maxBalance()", +"73ad6c2d": "setMarketplace(address)", +"73ae277b": "getDepositAddressVerify()", +"73aef263": "FDSToken()", +"73aef2b6": "unFrozenControl(address,uint256)", +"73af6308": "setTierLimit(uint256)", +"73af652c": "setCollectibleExposure(address)", +"73b1184e": "setupVote(uint256)", +"73b14098": "getTotalDevelopmentFundEarned()", +"73b1edce": "_lock(address)", +"73b24ca0": "indInflation()", +"73b2c384": "_computeBorder(uint256)", +"73b2e80e": "hasClaimed(address)", +"73b34271": "ETH420on49()", +"73b38101": "wipe(bytes32,uint256)", +"73b3dcde": "maxDestroyThreshold()", +"73b4086b": "loans(address)", +"73b40a5c": "forwardTo(address,address,uint256,bytes)", +"73b4484f": "registerA(string,string,string,address)", +"73b47908": "_updateCounters(uint256,bytes32)", +"73b4df05": "createToken(string,address,uint256)", +"73b51d38": "startWork(string)", +"73b51f0b": "_tokenDelivery(address,address,uint256,uint256)", +"73b55eaf": "registerData(address,int256,bytes32,address)", +"73b5abaa": "PresaleDiscountPercentageChanged(address,uint8)", +"73b6656f": "relay(address)", +"73b68be8": "preicoAddresses()", +"73b6a48a": "GetDataRequest(uint256,bool,string,uint256)", +"73b793a8": "PrizeFund()", +"73b8a8c1": "MeetOneCommunityBonus()", +"73b913fa": "safeTransferManyFrom(address,address,uint256[])", +"73b972bc": "bonusTokensIssued()", +"73b9aa91": "account(address)", +"73baae7a": "KingKongCoin()", +"73bbda81": "standardTokenDefrosting(address[])", +"73bc1b2f": "customerPool()", +"73bc8b2f": "kvcSub(uint256,uint256)", +"73bc8b77": "SPIDER_BOOST()", +"73bda17e": "restrictedTokens()", +"73be0a99": "getData_7()", +"73be6ddd": "allowEscrow()", +"73bf2ce0": "getMilestoneHashById(uint256)", +"73bfb566": "withdrawFromProject(address,uint256)", +"73c107b3": "checkWins(uint256,uint256,uint256)", +"73c1af76": "deleteFreezeList(address)", +"73c24cb1": "Buy(uint256,address,uint256,uint256,uint256,bytes16,bytes32)", +"73c261f4": "getRegionUpdatedAtPurchasedAt(uint256)", +"73c28692": "disallowFunding()", +"73c2ec65": "sendbal(address,uint256)", +"73c32a71": "get_property_basic_info(uint256)", +"73c4726b": "minHouseStake(uint256)", +"73c4942a": "depositStopTime()", +"73c6a4ec": "acknowledgeCopieExecutoire(bytes32)", +"73c6aa7d": "ExchangeEfx()", +"73c74103": "recoverTokensTo(address,uint256)", +"73c8c4bf": "Leverages()", +"73c8d8a2": "setMaxPaymentInEther(uint256)", +"73c8de54": "issueByTranche(bytes32,address,uint256,bytes)", +"73c90b43": "calcBidAllocationFee(bytes32)", +"73ca1b28": "WHYPHY()", +"73cb0620": "fluffyCatAddress()", +"73cb8ab7": "enableTokensTransfer()", +"73cbd8ce": "getPublicSupply()", +"73cc3ec7": "iceFundDeposit()", +"73cc9153": "MeshPointManager()", +"73cce6f1": "presaleAllocateTokens()", +"73cd0a19": "allowanceBurn(address,address)", +"73cd148e": "VariableConstructor(string)", +"73cdcac4": "getPostsFromPublisher(address,string,uint256,bool,uint256)", +"73ce3c72": "UpStats(uint256,uint256,uint256,uint256)", +"73ce9920": "parseOrder(bytes)", +"73cf013c": "isBlacklist(address,address)", +"73cf8f97": "registryRequestSku()", +"73d00224": "swapTokens()", +"73d01ead": "prepareForMigration()", +"73d08bc5": "prefill(address[],uint256[])", +"73d0d693": "Set(address,uint32[],uint24[])", +"73d0fe48": "totalLockedHavvens()", +"73d28995": "isMidGrade(uint256)", +"73d31240": "removeGame(uint256)", +"73d3172e": "MXY_chain()", +"73d384c8": "hasDeposits(address)", +"73d45ba4": "owner_ActivatePOS(bool)", +"73d4a13a": "data()", +"73d4c0ff": "m_aOwner()", +"73d4d500": "transferPayable(address,address,uint256)", +"73d4d9f9": "checkMAC(bytes32,bytes32[],bytes32)", +"73d55379": "Beneficiary()", +"73d65c00": "GEN0_NO()", +"73d69720": "checkWhitelistAddressValue(address,uint256)", +"73d6c2ec": "init_ico(address)", +"73d901d6": "activityClosed()", +"73d9170d": "GKBToken(uint256,string,string)", +"73d9fd0c": "placeTokenBet(uint256[],bytes32,uint256,uint256,bytes32,bytes32,uint8,uint256,address)", +"73da968d": "buySection(uint256,uint256,string)", +"73dae7d6": "issueTokensForPrivateInvestor(uint256)", +"73db0844": "ETHUSD()", +"73db2350": "commentsLength()", +"73dc7635": "openAttacksCount(address)", +"73dd9073": "secondStage()", +"73de3570": "calcaultePrizes(uint256,uint256)", +"73de3e72": "_refundTokens()", +"73de975c": "alreadyMintedOnce()", +"73def2b7": "subFreezingPrice()", +"73df6b19": "visitLength(uint8)", +"73e1743a": "buildDSBasicAuthority()", +"73e1851b": "migrateMyTokens()", +"73e1c5c9": "getMyFreeCoin(address)", +"73e2212e": "changepresalebonus(uint256)", +"73e2ab69": "_removeWhitelistAdmin(address)", +"73e2d75f": "changeClons(address,uint8,bool)", +"73e2faa8": "destructionContractAddress()", +"73e30e49": "majorEventFunc(uint256,bytes,bytes)", +"73e3ce80": "fact()", +"73e3de70": "CardSwap(address,uint256,uint256)", +"73e3e7a7": "getAdultByAddress(address)", +"73e40ed4": "REWARD_SUPPLY()", +"73e4d829": "createLandmark(uint256,uint256,address,uint256)", +"73e52855": "crownUnFreeze()", +"73e538fc": "availableTokensOnCurrentStage()", +"73e55a57": "DAOstackPreSale(address,uint256,uint256)", +"73e58a75": "balanceTeam()", +"73e61cf2": "changingEnabled()", +"73e67a38": "GameGoldToken()", +"73e6fc1b": "parseUint(string,uint256)", +"73e7c8ce": "setErrorRest(bytes,uint256)", +"73e81d88": "TrustMarketHubToken()", +"73e87d74": "OTM()", +"73e888fd": "contribute(address)", +"73e8b3d4": "exist(bytes32)", +"73e9f3e6": "Crowdsale(address,uint256,uint256,uint256,address,address)", +"73eab74b": "SoulTransfer(address,address)", +"73eaddf0": "OMGBalance()", +"73ec6bb5": "AMOUNT_PER_PHASE()", +"73ec7df0": "joinCommunity(address)", +"73ecac3b": "setGiftTokenAmount(uint256)", +"73ece9c4": "setEmployee(address,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint8)", +"73eda3cc": "finalizePublicSale()", +"73eec3c5": "payoutDividends(address,uint256)", +"73eef753": "coinSendSameValue(address[],uint256)", +"73ef6357": "selectplayer()", +"73efc627": "addAction(bytes32,bytes32,string,uint256,bool,uint256,uint256,uint256,uint256,bytes32)", +"73f00fb3": "emissionlocked()", +"73f01104": "reveiveToken(address,uint256)", +"73f029cd": "setOrUpdateRecord(string,string,string,string,address,uint8,bytes32,bytes32)", +"73f03d53": "crowdSaleFinalized()", +"73f1e6d7": "resolveLotteryByOraclize(uint32,uint32)", +"73f28451": "tokensRate()", +"73f310df": "multiAccessRemoveOwner(address)", +"73f3312d": "setMentorsTokensWallet(address)", +"73f3bd1f": "earlyInvestors()", +"73f42561": "burned()", +"73f440fe": "prevRoundTweetId()", +"73f58acd": "createTeamTokenTimeLock(address,uint256,uint256,address)", +"73f5cfb1": "isPhaseValid(uint256)", +"73f5edce": "UpPlayerResult(string,address,uint256,uint256,uint256)", +"73f5f8ee": "tokensAvailableAtCurrentTier()", +"73f64212": "supplyMultiplier()", +"73f69bc5": "TrustedDocument()", +"73f8edc3": "configureMarketItem(uint256,uint8,uint8,uint8,string)", +"73f8fd4b": "getUserTokenBalance(address,address)", +"73f93a48": "getAccountContentTip(address,uint256)", +"73f9421d": "getUpgradeCardsInfo(uint256,uint256)", +"73f9d5a0": "eostContract()", +"73f9ff23": "RaffleMakersBook(string,uint256)", +"73fa9ce8": "getAmTokenBalance(address)", +"73fac6f0": "confirmReceived()", +"73fb7878": "dividendFor10kDaily()", +"73fba0e8": "airdropReserve()", +"73fc115f": "RubiToken(address)", +"73fc83fa": "updateDireccion(address,bool)", +"73fc8420": "deployedOn()", +"73fc9643": "calculateFLC(address,uint256)", +"73fcfea1": "withdrawPLAT()", +"73fddd16": "refundEndTime()", +"73fe1673": "cpow2(uint256)", +"73fe747c": "TransferCreators(address,uint256)", +"73fee090": "setfee(uint256)", +"73fef35a": "setStartTimeIcoStage2(uint256)", +"73ff4d48": "getPlayerForCard(uint256)", +"73ff81cc": "getOwnersCount()", +"73ffd5b7": "transferEther(uint256)", +"73ffd969": "setMap(uint256,uint256,uint256)", +"73ffecd0": "getPlayerHistories(address,uint256)", +"74002b6c": "getTokenPriceInWeiAndPhaseIdxsForDate(uint256)", +"7400ed3b": "acceptDeposit(address,address,uint256)", +"74019f87": "BATSafe(address)", +"7401aaa3": "getPlayerRoundBought(uint256,uint256)", +"7401f9c0": "flag(uint256,address)", +"740227d1": "receiveFunds(address,uint256)", +"7402a9aa": "isFirstStageFinalized()", +"74030531": "bet(string)", +"7403db08": "getVerifiedHash(address,uint8,address,uint256,uint256,uint256,uint256,uint256,bytes32,bytes32)", +"7403e980": "initPGOMonthlyPresaleVault(address[],uint256[])", +"74040424": "startPartnerSale(uint256)", +"74040cd2": "setBidFeePercents(uint256)", +"74041d1f": "liquidPledging()", +"74043a70": "FRPUSD()", +"740528a7": "GrantRevoked(address,uint256)", +"7405322e": "checkBalance(address,string)", +"74056b73": "crowdsaleMinUSD()", +"7405cee9": "CGCToken(uint256,string,string)", +"74063cc1": "tokenOfMakerByIndex(address,uint256)", +"74068480": "setPresaleFail()", +"7406d1a7": "updateRegistratorStatus(bool)", +"7406d943": "BIGTPrivate()", +"740707cf": "cancelSaleOfMintingAddress()", +"74087040": "testBitsNotEqualSuccess()", +"740907ea": "buySale(address)", +"74091685": "setReservesForExchangeTokensPercent(uint256)", +"7409e2eb": "swapTokenToToken(address,uint256,address,uint256)", +"740a2a90": "registerEmployer(string,string,bytes32,uint256,uint256,uint256[],string,string,string)", +"740ab8f4": "partitionsOf(address)", +"740b63f9": "set_hedgeAddress(address)", +"740b91b6": "horseOwnerIndex(uint256)", +"740d0a6f": "getAmbientHumidityException(bytes32)", +"740d73f3": "addToWhiteList(address[])", +"740e2a29": "setFundRepository(address)", +"740ed4e0": "addNewStakeDiceGame(uint256)", +"7411b2b2": "TrendNetworkToken()", +"741273d6": "testThrowRegisterContractAgain()", +"7412c223": "getCurrentTier()", +"74135154": "func1()", +"7413801a": "initializeAdvisorVault(address)", +"7413dcc3": "DelistTitle(uint256)", +"74141266": "arbiterList(uint256)", +"741430ad": "VINCToken()", +"7414edc4": "ERC20Token(string,string,uint8,uint256,address,uint256)", +"74151a2a": "retrieveUnsoldTokens()", +"74158cd8": "updateAdministratorKey(address,address)", +"7415fbdb": "_getGameInfoPart2(uint256)", +"74163ab1": "minsignupeth()", +"741677a5": "makeTrade(address,address,uint256,string)", +"741685e5": "EtherFuture()", +"7417040e": "numberOfParticipants()", +"7417575c": "_releaseEarning(bytes32,bytes32,bytes32,bool,address,uint8)", +"74182009": "CreateWolk(address,uint256)", +"74192209": "getTokenEnhanced(uint256,bool)", +"7419e77a": "setMarketplace(address,bool)", +"7419f190": "stakeStartTime()", +"741a35c4": "getTx(address,uint256)", +"741ad7a3": "transferDividends()", +"741b0508": "isSplitable()", +"741b2239": "unfreeze_period_time()", +"741b3c39": "depositBond()", +"741bcc93": "fillOrKillOrder(address[5],uint256[6],uint256,uint8,bytes32,bytes32)", +"741bd9c8": "ETHDeposir()", +"741be410": "getOpenPackageIdOfOneAgency(address)", +"741bef1a": "priceFeed()", +"741c251d": "changeGamemaster(address)", +"741cb9ce": "setCurve(address,bytes32,int256,int256[])", +"741cdf27": "Library()", +"741e2345": "registerMany(address,uint256,int256,uint256,bytes20,address,bytes)", +"741e3576": "getBonustokens(uint256)", +"741ed475": "AnkitVictoToken()", +"741f0434": "check(bytes20,uint32,int24[4],int24[4],uint32[4],bytes32[])", +"741f7034": "CrowdsaleToken(string,string,uint256,uint8,bool)", +"74214c92": "StandardERC223Token(uint256)", +"74220f3d": "burnApproval(address,address,uint256)", +"74229301": "isTokenized()", +"7422a127": "is_valid_event()", +"7423ab57": "Project_RemoveToken(uint256,uint256)", +"7423d96e": "txnTax()", +"7423e225": "getDataPointForSubject(int256,uint256,uint256,int256)", +"7424bab1": "currentAirdropAmount()", +"7424bebc": "bonusBasePoints()", +"7426172d": "addPurchaseFromOtherSource(address,string,uint256,uint256)", +"74268ff2": "deleteOffer(uint256)", +"74281f95": "FNAToken()", +"74287872": "investedAmountOf()", +"742887ff": "deleteAddress(address)", +"7428c5f4": "Gamble()", +"7428eed3": "IndieGameToken(string,string,uint8,uint256,address)", +"74294070": "_createItem(string,address,uint256,bytes32,address,address)", +"742978da": "getAssets(address)", +"7429c086": "repeat()", +"7429d78b": "SUCC(uint256,string,uint8,string)", +"7429f1eb": "multiAccessSetRecipientD(address,address)", +"7429fd67": "initHolderConfig()", +"742a1a56": "CCTE()", +"742a9fa0": "recursiveFloor(uint256,uint256,uint256)", +"742aa578": "AddressRecovered(address,address)", +"742b8b9d": "_CallRejected(bytes32,bytes15)", +"742ba8de": "declareProjectNotFunded()", +"742bff62": "SoftDude()", +"742c81e4": "approveOwnership()", +"742cd75d": "mintPCD(address,uint256)", +"742d5355": "calcTokenOwnerReward(uint256)", +"742d9f0b": "lastBlock_v7()", +"742d9fa3": "userOfferSubmitElement(uint256,uint256,uint256,uint256,uint256,uint256)", +"742e2ebd": "AllowedSet(address)", +"742e54b2": "_airdropSupply()", +"742f79d5": "preRate()", +"7430faf4": "fechSnapshotBlockByIndex(uint256)", +"74313b4a": "releaseTokens(address,address)", +"7432542d": "_remainReward()", +"74331be7": "sete(address)", +"7434206e": "validateReceipt(string,uint256,bytes32,bytes32,bytes,bytes,bytes32)", +"743438ad": "id_for_address(address)", +"7434d180": "removeSmartContractByAddress(address)", +"7434e60d": "HamsterToken()", +"7435039d": "calculateBountyRewards(uint128)", +"743521c6": "rewardBountyMany(address[],uint256[])", +"7437681e": "maxTx()", +"74388347": "checkBetDozen(uint8,address,bytes32,bytes32)", +"74389991": "breakit()", +"7438b0df": "WIN_CUTOFF()", +"74396ed1": "makeWithdrawal(address,address,uint256,uint256)", +"74398d45": "setGlobalTokenTransferLock(bool)", +"7439a3bd": "verifyClaim(uint64)", +"7439e787": "getUserValues(address)", +"743a3252": "addAddressAsMultiOwner(address,string)", +"743ab538": "validateNameSignature(string,uint256,address,string,uint8,bytes32,bytes32)", +"743b179e": "giveRefund(address)", +"743b8e1a": "ROHH(uint256,string,string)", +"743bd681": "OWNERS_AUCTION_CUT()", +"743bdcef": "MAX_WITHDRAW_PCT_TX()", +"743c006b": "iWantXKeys(uint256,uint256)", +"743c6775": "investorBaseInfo(address)", +"743c7f6b": "setPreSaleDate(uint256)", +"743e0c9b": "receiveTokens(uint256)", +"743e92ee": "getNode()", +"743f78ab": "WalletSet(address)", +"743f978f": "addValueToCovfefe(uint256)", +"74400873": "execute(uint256,address,uint256,uint256)", +"744013c4": "Gnome()", +"74418368": "getAdvertisementStorageAddress()", +"7441b8bb": "lockBalance(address)", +"7442f427": "subUserTokenLocalBalance(address,uint256)", +"74439ca7": "classic()", +"74449ca4": "getContentCount()", +"7444b006": "transferCopyFrom(address)", +"7444b227": "getMidgradeCarsForVariant(uint256)", +"7445690b": "getLotteryClass(uint8[7],uint256)", +"744598cd": "Phase1AccountTokensMaxUpdated(uint256)", +"7445af4b": "pay_by_bond_contract(address,uint256)", +"7445d659": "foreignBridge()", +"74467a1e": "FOR_SALE()", +"7446ce1c": "addJob(bytes32,uint256)", +"74478bb3": "isClaimable()", +"74479db0": "fcontr()", +"7448d386": "getStageData(uint8,uint256)", +"744927fd": "getWinnerWithRank(uint8)", +"744a8f77": "chefPrice()", +"744b4b3f": "createNormalBank()", +"744bb8d2": "crowdsaleHardCap()", +"744bfe61": "withdrawFunds(uint256,address)", +"744c7c7f": "proposeMinting(uint256)", +"744c8c09": "chargeFee()", +"744d0a92": "MINI_GAME_BONUS()", +"744d3411": "getBidCount(uint256)", +"744d8b4f": "recordWin(uint256,uint256)", +"744f4994": "getBrickIdsByOwner(address)", +"744f5f1a": "modifyTaxRate(uint256)", +"744f7c7d": "toUint256Safe(int256)", +"744fa2c8": "submitTokenToEthOrder(uint128,uint128)", +"7451bf71": "admin_transfer(address,address,uint256)", +"745332fe": "getRestarTime()", +"74536403": "getAvar()", +"74539f98": "getEventResolvers()", +"7453a417": "__address4__()", +"7453cfa1": "EtherPaint()", +"7453de96": "approveTransaction(uint256,uint256,string,uint256)", +"745400c9": "requestWithdraw(uint256)", +"74544e2d": "setGrandFactory(address)", +"7454e74c": "setAudit(address,address)", +"74552650": "left95(uint256)", +"74556ee9": "getQST()", +"7456be7d": "rent(uint256)", +"7456f2b9": "getDistributionTime()", +"74573f80": "lastPlayTimestamp()", +"7457412e": "THIRD_PARTY_LOCKUP_ADDR()", +"7457a9e1": "Coupon(uint256)", +"74580e2f": "changeCreator(address)", +"745828ef": "ProofOfLongHodlV2()", +"74583772": "adminSendTokens(address,uint256)", +"74590f64": "setApoderado(bytes32)", +"745911d5": "getHolidayByIndex_(uint256)", +"745944d5": "setCampaignValidById(bytes32,bool)", +"7459a5e1": "KriptoPark()", +"7459f2a3": "registerArbiter(uint256,uint256,uint256,uint256,uint256)", +"745a8be2": "flip32(bytes)", +"745ab73d": "BrainIsToken()", +"745ce3bb": "iaInvestedBy(address)", +"745ced49": "CORE_TEAM_PORTION()", +"745cf221": "ArjunaCoin()", +"745d1d64": "ethCollector()", +"745dcd4d": "stop(string)", +"745e77f9": "_createAnimecard(string,string,string,string,uint256,address)", +"745e9da2": "GameProgress(uint256,uint256,uint256)", +"745ea0c1": "registerNameXnameFromDapp(address,bytes32,bytes32,bool)", +"745f2860": "_buyTokens(address,uint256,uint8)", +"74601c3c": "availableToMint()", +"746022c2": "oneGetMoneyBack()", +"74607d91": "patient(uint256)", +"74609d0c": "createDApp(bytes32,uint32,bytes,bytes32)", +"746178ed": "escrowTokensWallet()", +"7461dbff": "setOwnerAirDropRate(uint32)", +"7462260b": "KEM()", +"7462beec": "renewSubscriptionByDays(uint256,uint256,uint256)", +"7462e4f9": "Etheropoly()", +"74635cfc": "setMembers(address[])", +"74646086": "StreamityTariff(address)", +"7464d5d8": "rewardDistributionStart()", +"74651594": "tgeSettingsChangeRequest(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"746584b4": "setMintingContractAddress(address)", +"7465df26": "totalAccessories(uint256)", +"74664b34": "interestNextInPercent()", +"7466b2d0": "transferIsPossible()", +"7466e67d": "mintToOtherCoinBuyer(address,uint256,string)", +"7466ee48": "getAppAddress(uint32)", +"74674256": "temroyToken()", +"746796f0": "_setProfitSharingParameters(uint128,uint128)", +"7467af07": "EladToken()", +"7467bc92": "disbursementHandler()", +"7467bcd9": "minPaymentWei()", +"74689990": "schedulePayoutOraclizeCall(uint256,bytes32,uint256)", +"746a9af2": "printCertificate(string,string,string,uint16,string)", +"746abc79": "distributeRegistrationBonus(address)", +"746ac67e": "PCNCrowdsale()", +"746c9171": "m_required()", +"746d3024": "perPrice()", +"746df633": "getTeamBallers(address)", +"746eff8c": "_cancelRolePermissions(address,address)", +"746f79d9": "TIER2_PERCENT()", +"746fc8d0": "right47(uint256)", +"74703123": "proceedKYC(address)", +"74707e0d": "deleteWallet(address,address)", +"747082b9": "FsTKAuthorityChanged(address)", +"7470a835": "OliToken(uint256,string,uint8,string)", +"7470f760": "createTeamTokenByPercentage()", +"74711285": "restartSale()", +"74715432": "renounceAuctionManager()", +"7471ea81": "IPayX()", +"7471f6f6": "buy_beer(uint256,uint256)", +"747293fb": "addCaller(address)", +"7473f4e0": "grantAccessbyDelegate(bytes32,address,address,string)", +"74748460": "balanceOfAtInternal(address,uint256)", +"7474dfd0": "_getBetAmount(bytes32)", +"74754282": "manufacturer()", +"747586b8": "setInt(int256)", +"74759f43": "numberOfInvestments()", +"7475baa6": "AirDropPayBitsBounty(address[])", +"7476865f": "ToggleMaintenance()", +"74772667": "changeMinContrib(uint256)", +"74775cdd": "buyAtPrice(uint256)", +"74780111": "assertEq16(bytes16,bytes16)", +"747853bc": "test_validBoardFundTransfer()", +"74796cc2": "getPlayersInGame(uint256)", +"7479aa04": "getCurrentRoundStartTime()", +"7479b9ac": "founderToken()", +"747ad1c1": "getPeriodIdx(uint256)", +"747bcd72": "SCORE_UNITARY_SLASH()", +"747c1d87": "getInvestorsAmount()", +"747cb030": "SALE_3WEEK_BONUS()", +"747d6dd0": "_getCrabPartBonuses(uint256)", +"747dff42": "getCurrentRoundInfo()", +"747e0670": "UseWish(string)", +"747f3380": "phoneNumber()", +"747fc0d2": "maxReferrals()", +"7480a676": "Cryptosquirrel()", +"74816d1e": "webGiftUnTransfer(address,address)", +"74817d9b": "startPublicSale(uint256)", +"74818530": "Creedex()", +"7481a8aa": "TokenizedSplitter(string,string,uint248)", +"7482e533": "EventLuckyNumberRevealed(address,uint256,uint256)", +"7483883d": "getOrAddMasterWallet(address)", +"74845024": "scribes_hisory_length()", +"748467b9": "callBtcWithSto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"7486a8e3": "get_publisher(bytes32)", +"748837b2": "getIsBonusUnlockExempt(uint256,address)", +"74888914": "setHatchDurationMultiByGeneration(uint32[])", +"7488aa3c": "getNextBonusIndex()", +"7488ad7c": "minDepositInCents()", +"74891e1b": "getCoinAgeInternal(address,address,uint256)", +"7489308f": "lpTargetPosition()", +"7489472a": "step_pay()", +"748949e8": "setGalleryFourPrice(uint256)", +"7489ec23": "cancelOrder(bytes32)", +"748b659d": "pauseCollectToken()", +"748b95b6": "decimls()", +"748ce291": "addRewardforNewContributor(address,uint256,string)", +"748d071d": "seriesCreated(bytes32)", +"748d1078": "updateDukeHistory(string,bool,string,address,uint256,uint256)", +"748dd2fc": "GAME_TYPE_DICE()", +"748de225": "getFreezeAccount(address)", +"748de5d3": "UpdateAddressPayForService(address)", +"748e4f40": "sendTokensToTeam(address)", +"748ed9a8": "getTargetIncorrectDesignatedReportMarketsDivisor()", +"748efab5": "_copyToBytes(uint256,bytes,uint256)", +"748f0810": "ProposalTallied(uint256,uint256,uint256,uint256,bool)", +"748f7215": "getUnlocktime()", +"748fa599": "someUnsafeAction(address)", +"748ffa5b": "cei(uint256,uint256)", +"74900c92": "MINIMUM_ETHER_SPEND()", +"74912463": "tokenEmission()", +"74914710": "getCrySolObjectsByOwner(address)", +"7491ef60": "PrecommitmentAdded(address,uint256)", +"7492384a": "backTixOwner()", +"7493357b": "reservedOwner()", +"7493539b": "KOALAPROJECT()", +"74935f11": "PLS()", +"74942868": "rate8_end_at()", +"74942c0f": "tokens_received()", +"7494ad81": "judge(uint256,address)", +"749510d4": "BOUNTY_FUND()", +"749555cd": "toggleIsLive()", +"7495a1e4": "buyFor(string,address)", +"7497a061": "getAuthorDrawings(uint256)", +"749843ea": "setPlatinumAddress(address,address)", +"74991569": "setVestingContract(address)", +"74998f33": "Infinix()", +"749a47b7": "minPreviewInterval()", +"749aa2d9": "endRound()", +"749b7820": "canBuy(address,uint256,uint256,uint256,bytes8)", +"749be0c0": "GetTotalPot()", +"749c190b": "getHashsLength()", +"749ca1f3": "setGameOnoff(uint256)", +"749cab54": "setBlocks(uint256,uint256)", +"749db2f6": "Contract(string,string,address)", +"749dd65d": "_currentMonth2ndDayTimestamp(uint256,uint256)", +"749e8b88": "BUYPRICE()", +"749e93fc": "actualPriceDivisor()", +"749ea598": "leaders(address)", +"749f1bc3": "agendaOf(address)", +"749f9889": "changeAllowedRecipients(address,bool)", +"749fe7c4": "getPlayerEnergy(uint32)", +"74a042b5": "ClaimEthersEvent(address,uint256,uint256,uint256,uint256)", +"74a0cd8c": "getCombinedWarriors()", +"74a205d9": "ZIMBOCOIN()", +"74a25d43": "startAuction(uint256,uint256,uint256,uint64)", +"74a32dd7": "TotalAirdropRequests()", +"74a37efc": "setSalary(uint256,uint256)", +"74a3c5d5": "getVestingAmountByNow(address)", +"74a46050": "offer(address,uint256,uint256)", +"74a76649": "payTheWinner(uint256)", +"74a76816": "dividendsOf(address,bool)", +"74a7d6b9": "initNewPlayer(address,bytes)", +"74a7d77c": "sellTokensNow(uint256)", +"74a814fe": "getGeneral(uint32)", +"74a85571": "addAccount(address,uint256,bool)", +"74a8f103": "revoke(address)", +"74a93e6c": "setTokenHolder(address,address)", +"74a9446e": "_removeAllActiveTasksWithHoles(uint256,uint256)", +"74a9ced9": "createPoll(string)", +"74a9e440": "createProposal(uint256,address)", +"74aa9e2c": "PRESALE_RESERVERED_AMOUNT()", +"74aac084": "joinDelta()", +"74aaefcc": "SundaToken()", +"74ab3e4b": "updateCardStatistics(address)", +"74ac5bb4": "erc20KGS(uint8)", +"74ac6112": "HOPE()", +"74acb5d6": "isAirdrop(address)", +"74acf0b1": "communityDevelopmentWallet()", +"74ad74e9": "getMinLockedAmount(address)", +"74ae26f7": "checkReleaseAmount(address)", +"74af10cf": "setNeedToGetFree(uint256)", +"74af3ee1": "getTournamentState()", +"74b00a6c": "convertNums(uint256[])", +"74b04fa7": "setArtistAccount(bytes16,address)", +"74b10ae5": "checkWhale(uint256)", +"74b26fa1": "delegateReferralTokensBulk(address[],uint88[])", +"74b27b9b": "indexextend(address)", +"74b38531": "stopBet()", +"74b39158": "validateAttack(address,address)", +"74b3ee18": "getFlag(string)", +"74b433bd": "TOKEN_SUPPLY_MKT()", +"74b491ff": "airdropCurrentTotal()", +"74b527b0": "getMintedCounts()", +"74b5545a": "delCertAdmin(address,bytes32)", +"74b57486": "DebugContract()", +"74b58489": "setWeiMinContribution(uint256)", +"74b58ae7": "setCCH_edit_10(string)", +"74b5fb06": "_payout()", +"74b67b27": "GameCoin()", +"74b78b26": "payeth1(address,uint256)", +"74b799af": "disableEdition(uint256)", +"74b874a6": "liquidationTimestamp()", +"74b9dc6b": "assertEq9(bytes9,bytes9,bytes32)", +"74b9f229": "buyTokensPreSale()", +"74bb3cb4": "getOrderActualTotalRefundHelper(uint256,uint256)", +"74bd6261": "AdsVenture()", +"74bdb7ee": "createApprovalEvent(bool,address,address,uint256)", +"74bde311": "scheduleNewDerivativeToken(address,uint256)", +"74be3c7f": "TRONV()", +"74bfb965": "addNewProxy(address)", +"74bff257": "getCartItemInfo(address,uint256)", +"74c06f5d": "saleHasFinished()", +"74c1328a": "bytesToUInt(bytes)", +"74c13fda": "defaultToken()", +"74c1438c": "DeepGold()", +"74c166e9": "phase1MaxTokenForSale()", +"74c16b23": "registryAdmin()", +"74c1b1c9": "refundOpen()", +"74c1d7d3": "_best(address,address)", +"74c21059": "totalInvested(uint256)", +"74c272b7": "Begin(string,string)", +"74c40f2e": "dexTestTransferFrom(address,address,address,uint256)", +"74c42e5d": "setuserlevel(address)", +"74c43f26": "setFundariaBonusFundAddress(address)", +"74c57fa1": "LogTeamTokensDelivered(address,uint256)", +"74c65206": "Buy_Offer(uint256,uint256,uint256)", +"74c6bd74": "privateSaleLockEndTime()", +"74c77b52": "SetupToken(string,string,uint256,uint256,uint256,address,address,uint256)", +"74c80467": "createNewElections()", +"74c85591": "fundDepositAddress()", +"74c90d0d": "sellAllCookies()", +"74c950fb": "TOKEN_TOTALSUPPLY()", +"74c97c99": "manaToken()", +"74cad0b7": "ForTester()", +"74cb55fb": "fundsDistributor()", +"74cc991c": "getBetValue(bytes32,uint8,uint8)", +"74ccd7cc": "walletLock(address,uint256,bool,bool)", +"74ccf06f": "addParsel(uint256,uint256,address[])", +"74cd5a31": "HXTtoken()", +"74cd5c0b": "getOneWithdrawRec(uint256)", +"74ce52ce": "Kildoneum()", +"74ce9067": "isCommitPhase()", +"74ce97fe": "year3LockAddress()", +"74cf6f49": "withdrawNoLimit(address,uint256)", +"74cfa35f": "ambassadorAddressOf(address)", +"74d04f83": "addtoPrivateSale(address,address,uint256,uint256)", +"74d050fb": "cardNumbersOf(uint256)", +"74d15357": "virtualc()", +"74d16c37": "getAssetsValue()", +"74d1eb3f": "MANToken(string,string,uint256,uint256)", +"74d21ae0": "unlike(uint256)", +"74d301d6": "sizeBonus()", +"74d33745": "REAPER_INTREPID_FTL_SPEED()", +"74d3475c": "PowerofBubble()", +"74d393f0": "setValue2(uint256)", +"74d3b7cd": "LTR3Token()", +"74d42916": "IINEToken()", +"74d4ab27": "fipsRegister()", +"74d50c1c": "TOPB()", +"74d53cc2": "sendReferral(address,uint256)", +"74d55ceb": "Rhemaxcoin()", +"74d5e1ea": "setteam(address,uint256)", +"74d5f2aa": "BoxTrade()", +"74d618cb": "setTransferActive(bool)", +"74d699b6": "Sale(string,uint256,address)", +"74d6aa1f": "getOrCreateFeeWindowForForkEndTime()", +"74d76bc4": "_getGameInfoPart3(address,uint256)", +"74d88c50": "submitEthToTokenOrder(uint128,uint128)", +"74d89c47": "testUpdateNameDb()", +"74d8b268": "getGunByIdPart1(uint256)", +"74d9c2ef": "tokenTosale()", +"74da564f": "registerMeOnTokenCore(address,address,uint256,string)", +"74dacc7a": "m_attaching_enabled()", +"74daf5cc": "setValidPriceDurationInBlocks(uint256)", +"74db5b27": "totalOf(uint256[])", +"74dbe5e6": "GetSpud(address)", +"74dc1e04": "TokensDestroyed(address,uint256)", +"74dcfd37": "NotakeyVerifierForICOP(address,address)", +"74dd7be9": "setCompte_42(string)", +"74de4ec4": "addReward(uint256)", +"74de8caf": "ERC20transfer(address,uint256,bytes)", +"74de9ebb": "MintEvent(uint256,address)", +"74dfcabc": "changeFreezeTransaction(string)", +"74dff9d8": "stopCycle()", +"74e00730": "DISTRIBUTION_COMMUNITY()", +"74e048d5": "settleBetUncleMerkleProof(uint256,uint40)", +"74e09606": "setSignatureTimeout(uint256)", +"74e104d3": "BITWORKCOIN()", +"74e24367": "ownedTokensIndex(uint256)", +"74e29ee6": "deleteService(uint256)", +"74e4435f": "getUserAddress(uint256,bytes32)", +"74e4f31d": "ZJLToken()", +"74e5530d": "testHasRole()", +"74e57397": "BrandUpdated(address,address,string,bool)", +"74e59296": "MYE()", +"74e5b122": "changeGenerator(address)", +"74e5b186": "_mint(string,address)", +"74e60a48": "cancelOrder(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", +"74e7493b": "changeRate(uint256)", +"74e74f24": "rulesProposal(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"74e8288c": "SaiContest_Gaia()", +"74e861d6": "getHubAddr()", +"74e95828": "_distributeWinnerAndLandholderJackpot(uint256,uint256)", +"74e99f87": "AIWEBToken()", +"74e9e102": "GetTempStuffList(address)", +"74ea9437": "transferICOToken(address,uint256)", +"74eac2e6": "Beruqtoken()", +"74ead7b7": "unstakePrimordialTokenFrom(address,uint256,uint256)", +"74eb7c90": "withdrawSaleManagerBalances()", +"74eb936b": "ethQuantity()", +"74eb9b68": "isAccountLocked(address)", +"74ebe3ec": "isSet(address)", +"74ec8682": "walletForETH()", +"74ec89cb": "H2CToken()", +"74ecf4b5": "getWinningNumber(uint256)", +"74eead66": "SFT_PER_ETH_SECOND_EARLY_BIRD_RATE()", +"74eedd46": "fundingEndTime()", +"74ef109b": "ChinaLifeCoin(uint256,string,uint8,string)", +"74f0314f": "SECONDS_PER_DAY()", +"74f059ad": "dateDefrost()", +"74f0765a": "mintSeq(address[])", +"74f079b8": "txCounter()", +"74f12933": "devPaid()", +"74f1d6ce": "keccak(address,address,uint256)", +"74f28eaf": "_set11()", +"74f47a7a": "nextDrawTime()", +"74f519db": "setLastTimestamp(uint256,uint256)", +"74f569e7": "EriCoin()", +"74f61642": "rewardsRedeemed()", +"74f760e4": "WithdrawWinnings(uint256)", +"74f78412": "market_DeclareBid(uint256)", +"74f78437": "FD(uint256,string,uint8,string)", +"74f79c8e": "DEFROST_INITIAL_PERCENT()", +"74f8d96e": "getRevisionBlockNumber(bytes20,uint256)", +"74f8f7ac": "increaseUpdateMetadataCounter(uint256)", +"74f91b56": "setXTVNetworkContractAddress(address)", +"74fa01c9": "MilcToken()", +"74fa4874": "getResultStatus(uint256)", +"74fa98f5": "setInviteCodeFree(string)", +"74fb381a": "inject(address,address)", +"74fbbc86": "rate(uint256,uint256,string)", +"74fc27c1": "xfitcoin()", +"74fcd919": "tokenMsg()", +"74fd08cd": "whatSatoshiSays()", +"74fd6176": "removeBulk(address[])", +"74fe6dea": "nameCat(bytes5,bytes32)", +"74fe9247": "AddRevocationBounty(bytes32)", +"74fefa2c": "findEndpointByAddress(int256,address)", +"74ff2324": "requestMinimum()", +"74ff32e9": "_percUp(uint256)", +"74ff90ba": "Disbursement(address,uint256,uint256)", +"74ffdcd0": "WEI_PER_ETH()", +"75012c35": "setBonusTokenInDays(address,uint256,uint256)", +"750142e6": "totalReward()", +"7501f741": "maxMint()", +"750225d0": "completeSale(uint256)", +"750240a2": "setMaxResolvedAgonId()", +"75030996": "getServiceName(address)", +"7503af06": "Test9J()", +"7503cda7": "getLogOwnerAddr()", +"7503cda9": "thinkLength()", +"7503e1b7": "tournaments(uint256)", +"750446a3": "howManyTokensAreReservedFor(address,address)", +"750482ba": "ownersBalance()", +"75048ebd": "claimUnsold(address)", +"7504aaaf": "updateTargetedMoney(uint256)", +"750509ba": "getStateRoot(bytes,bytes32)", +"75052882": "modifyProductPrice(bytes32,uint256)", +"75056811": "accountClaimedReward(address)", +"75067219": "MAX_UCCOIN_SUPPLY()", +"75071c4c": "founderFund()", +"750732ec": "addVineyardByRegulator(string,string,uint16,uint24,uint32,uint16)", +"7507b2e5": "OVOToken()", +"7507ba39": "remit()", +"750852b3": "test_invalidThrowWithAsserts()", +"7508f147": "setOperationalReserveAddress(address)", +"75090ebf": "changeDomain(uint256,uint256,uint256,address)", +"750a687c": "GetRevealBlock(bytes32)", +"750a96ac": "_createPermission(address,address,bytes32,address)", +"750c47a1": "TOKEN_PER_ETHER()", +"750c77cb": "AccountMinterRemoved(address,address)", +"750cae6a": "enableBetting_only_Dev()", +"750cc645": "_sendToken(address,address,uint256)", +"750dd523": "getContractCreationTxOrigin()", +"750e1f59": "transfer(address,uint256,bytes1[])", +"750e443a": "voteAgainst(uint256)", +"750e75d5": "distributeJackpot(uint256)", +"750ee24a": "changeIcoEndBlock(uint256)", +"750f0acc": "withdraw(uint64)", +"750f2d81": "ChangeFreezeTime(uint256,uint256)", +"750f7daf": "hashBiometricTemplates(string,int256,string,string)", +"750fd1d1": "startTimeRefund()", +"7510a98c": "updateConfig(uint32,int256)", +"7510c5a0": "encoding_description()", +"75114bcc": "addPhrase(string)", +"7511828e": "Laxz()", +"7511ef65": "setWithdrawAddr(address)", +"7512071b": "doApprove(address)", +"75121c2c": "FCOIN1448Token(uint256,string,string,uint256)", +"751318f4": "bountyAdded()", +"7513eaa7": "HolyCoin()", +"75143ef2": "mintFinished()", +"75151f6b": "addCountryCode(uint256)", +"751559e8": "transactionfee()", +"7515b583": "exchangeCoin(uint256)", +"7515b84a": "releaseRoto(address,bytes32,uint256)", +"75160a20": "pay_royalties()", +"751634d9": "ChangeRules(uint256,uint256,uint256,uint256)", +"751686f7": "_maint_setBlockLimit(uint256)", +"75172a8b": "reserves()", +"7517b57e": "withdrawTaxEarning()", +"7517ea47": "configureSale(uint256,uint256,address,uint256,address,address,address,address)", +"751823f2": "changePartnerCoinPercentage(uint256)", +"751827ac": "setRareAddress(address,address)", +"7518af71": "VGWToken(address)", +"7518fa98": "tokensContract()", +"7519dd8e": "starsOf(uint256)", +"751a0225": "addElement(address,bytes32)", +"751a2d06": "Token_4()", +"751a9108": "balancesof(address)", +"751accd0": "executeGovernorProposal(address,uint256,bytes)", +"751c4d70": "contributeDelegated(address,uint256)", +"751ce8fb": "sendRewardBlockCDN(address,uint256)", +"751d9e65": "WALLET_FOUNDER()", +"751e1079": "compareAndApprove(address,uint256,uint256)", +"751ecea0": "FUTURE_DEVELOPMENT_POOL()", +"751ef753": "toggle(uint256)", +"751fef65": "sellUnit(uint256,uint256)", +"7520320f": "registerCustomer(address)", +"7520767f": "createNew(string)", +"7520bf60": "gas_price_max()", +"75217477": "Debit(address)", +"75218a54": "getUserReactionCount()", +"75219e4e": "transfer(address,address,uint256,bool)", +"75229e28": "lockcheck(uint256)", +"7522aff5": "rejectContract(bytes32)", +"752329ec": "retainedEarning()", +"7523a46e": "HARITECOIN()", +"75247ccb": "_calculateReward(uint256)", +"75250e85": "limitDateCrowdWeek1()", +"752551c9": "_END_DATE()", +"75257013": "appendToDistributionList(string,address,uint256,uint8)", +"7526f98c": "getMin(uint16[])", +"7527313d": "minedBlock(uint256)", +"75286211": "finalizeChange()", +"75287bab": "fetchAllResultByIndex(uint256)", +"75288d95": "platformSupply()", +"7528a6ab": "icoPhase4Start()", +"75298734": "getShare()", +"7529b1d9": "upgradeHasBegun()", +"752a3df6": "transferIfHardForked(address)", +"752b016d": "DeletePatient()", +"752bacce": "getExecPrice()", +"752bece8": "Minus(uint256,uint256)", +"752bf6f8": "sale_pause()", +"752c5628": "callSend(address,uint256)", +"752c8777": "setArenaPool(address)", +"752d2bfb": "addDividend(uint256)", +"752d349c": "depthCheck(int256,int256)", +"752da85a": "endContribution()", +"752dd0dc": "unfreezeBonuses()", +"752dd635": "ETHButton()", +"752efafc": "TIER5_RATE()", +"752f3c8c": "relinquishOwnershipAddress()", +"752faa51": "setLockedGroup(uint8,bool)", +"752fc70e": "howManyEthersToChangeSymbolName()", +"7530b54d": "PRESALE_LEVEL_3()", +"7530d99d": "addForgivedChar(string)", +"7530fe1d": "getContractMessages(uint256)", +"753117ff": "stealTheLeek()", +"7531e032": "resolveExchangeAddress()", +"75321c35": "TransferAgentSet(address,bool)", +"75321c4a": "getOpen(uint256)", +"75322e47": "change(uint256)", +"7532b4ac": "percent(uint256)", +"7532eaac": "signedTransfer(address,address,uint256,uint256,uint256,bytes,address)", +"7532ef1c": "accRecive()", +"75335702": "GSDToken()", +"753384fa": "TOKEN_BONUS_RATE()", +"7534a714": "checkExpectedTokens(address[],uint256[],uint256)", +"75355e34": "giveExchangeRateAdvice(uint256)", +"7535679a": "faucet(address,address)", +"7535927a": "importAmountForAddress(uint256,address)", +"7535c930": "priorityCap()", +"75367ab5": "addToWinners(address,uint256)", +"75383265": "TON()", +"753868e3": "lockContract()", +"753899e9": "alive()", +"7539189c": "getData_3()", +"75395a58": "finalizeBlock()", +"753af202": "SpermToken()", +"753b0dc1": "createFashion(address,uint16[9])", +"753b8c02": "EthernautsMarket(uint256)", +"753c619c": "emitTransferEvents(address,address[],uint256[])", +"753ca259": "PiXS()", +"753cb4eb": "fetchVoteNumForCandidate(address)", +"753cba93": "isPlatinumLevel(address,string)", +"753d764c": "unlistSubName(bytes32,bytes32)", +"753d93e4": "changePlatform(address)", +"753ded15": "failsOf(address)", +"753e88e5": "upgradeFrom(address,uint256)", +"753ea1be": "_transferCoins(address,address,address,uint256)", +"753ed1bd": "ceiling()", +"753f313f": "setPOOL_edit_26(string)", +"753f416a": "send1(address)", +"75401eac": "_isSaleContract()", +"7540b097": "inflateCount()", +"75421e93": "buyIcoTokens()", +"75424253": "BoughtToken(address,uint256)", +"75426ec8": "tokenFulfillmentDeposit(address[2],uint256,uint256[8],uint8,bytes32[2])", +"75428615": "getCallData(bytes32)", +"7542890d": "editIt(uint128,uint64,bytes32[],string,string,string)", +"75432ec4": "setStorageFee(uint256,address,uint256)", +"75438e49": "fillGas()", +"7543af9c": "amount3()", +"7543e3f0": "setReferral(address,address)", +"7544ac1f": "CSAToken(uint256,string,string)", +"75456b49": "fillIndexedBidByAddress(address,uint256)", +"75457583": "Return(address,address,uint256)", +"7545c449": "confirmOrderCompletionByPatient(bytes16,bool)", +"7545f9a1": "processTicketBuying(string,uint256,address)", +"7546006b": "ContractCall(address,uint256)", +"754628d0": "cancelTopUpLimit(uint256)", +"75479c34": "newPlayer()", +"7547c7a3": "stakeTokens(uint256)", +"7548014d": "recoverOnlyOnChainFunds()", +"7548f65b": "END_AMOUNT()", +"754a347a": "transferViolated(string)", +"754a77f5": "fcc()", +"754ad981": "MoveFish(uint256,uint256)", +"754b9e3d": "hashFromHash(string)", +"754c16e8": "getAmountOfProposals()", +"754c175e": "getTip()", +"754c301d": "sumOfFreezing(address)", +"754c3957": "benecifiary()", +"754c67ad": "setTokedoToken(address)", +"754d71e7": "getCurrentBuyOffer(uint32)", +"754db89b": "gameExists(bytes32)", +"754dea40": "setBackendOwner(address)", +"754e0b74": "solveDispute(bytes32,address,bool)", +"754e1764": "DiceRoll()", +"754e1e8e": "invalidateEarlyPurchase(uint256)", +"754efc98": "throwOnGasRefundFail()", +"754f579d": "ownerSetGameName(string)", +"754f9b37": "BasicAccessControl()", +"754fd352": "addOwnerFromRecovery(address,address,address)", +"75504b6e": "getAwardCost(uint256)", +"75524ffd": "mintBase()", +"75526ed5": "setServiceAccount(address,address,bool)", +"7553044b": "setUserServerPermission(address,string)", +"75543074": "getOrganisation(uint256)", +"75545949": "countMails()", +"75545cb2": "processMyVestingRules()", +"75549490": "isEarlyBird(address)", +"7554fffd": "successFee()", +"75556e32": "totalMaxBuyin()", +"7555bfd7": "exchangeAndWithdrawToken(uint256)", +"7556c9e9": "SilentNotaryToken()", +"7556e07f": "hasRate()", +"75570ea7": "closeBets(uint256)", +"7557b2ae": "Advertisement()", +"7558d81e": "contractProgress()", +"7558d9a6": "wallet_Mini_Address()", +"75593a39": "fixPrice()", +"755a11dc": "winnersPot()", +"755a29f4": "set_minCWCsPerSaleMoreThan(uint256)", +"755a8d31": "getBattleTeamSize()", +"755b5b75": "setNumUnits(uint256,uint256)", +"755b9d63": "_addOrder(address,uint64)", +"755bdcc1": "completeTrade(address)", +"755c020e": "withdrawALTokenss(address)", +"755c30a4": "earlyInvestorsBonus()", +"755cc41e": "mintTimes()", +"755d43d3": "calculateAmountReceived(uint256)", +"755d766c": "s27(bytes1)", +"755d80ab": "MintDarioToken(int256,address,int256,uint256)", +"755d98a3": "getTotalDividendPool()", +"755db762": "addVestingAddress(address,uint256)", +"755dc018": "FANBASEToken()", +"755e3e28": "tokensAllocated()", +"755f047b": "projectDescription()", +"755f12db": "totalTokensSoldInThisSale()", +"755f99c2": "AddNewSmallContract(address)", +"755fa815": "getAllIndexesByAddress(address)", +"755fd25c": "mintEditionCards(address,uint8,uint8)", +"75608264": "get_hash(uint8,bytes32)", +"7560a8d9": "_devTokens()", +"7560cab5": "createListing(bytes5,uint256,uint256)", +"75619ab5": "setDistributor(address)", +"7562b0cf": "process(address,uint256)", +"7563113b": "mintPromoEtherBro(uint16)", +"7563c81f": "WorldBetToken()", +"75640ef3": "calculateTotalMinePay(uint256,uint256)", +"75643e1f": "setReward(uint128)", +"75659508": "hasPayroll(address,address)", +"7565a2b6": "transferTokens(address,address,uint256,uint256,uint256)", +"7565d2eb": "coinfabrikAddress()", +"7565ef66": "getTodayLotteryNumber()", +"75661f4c": "calcPlayerICOPhaseKeys(uint256,uint256)", +"75662b0e": "ChainSign()", +"75669274": "XXXToken()", +"7567281d": "_addrunmoney(address,uint256,uint256)", +"75678491": "AMSBToken()", +"7568353c": "isKilled(uint256,uint8)", +"7568a9af": "claimNametagToken(address,bytes32)", +"7568d562": "AssetToken(uint256,string,string,uint8,address)", +"75698524": "UpdateUSDETHPriceAfter(uint256)", +"7569b369": "updateUnclaimedDividend()", +"7569b3d7": "contributorsCount()", +"756a288e": "getStageTokensSold(uint8)", +"756a515f": "test_insert_findNoHintUpdateTail()", +"756abb98": "timeSlicesCount()", +"756af45f": "withdrawBalance(address)", +"756afcab": "Mari()", +"756b1140": "Readings()", +"756b397a": "GainmersSALE(uint256,uint256)", +"756bae5c": "finish(bytes32,bytes32)", +"756bf6e9": "Popcore(uint256,string,uint8,string)", +"756d5e0d": "EvGroupChanged(address,uint8,uint8)", +"756dc34a": "PHASE_NUMBER()", +"756dd3a4": "getSubmission(bytes32)", +"756e15e5": "test_spamApproveAndFreeze()", +"756e8ed3": "innerGuess(uint32,uint16,uint32,address)", +"756f6049": "CORE_NAMESPACE()", +"756f7ce8": "fundariaStakesFrozen()", +"756fb8c9": "getOptionChain()", +"756feedc": "KingXChainToken()", +"75700437": "query1_withGasLimit(uint256,string,string,uint256)", +"757007f6": "CONFIG_MIN_VALUE()", +"757085e3": "fetchAllVoteResultForCurrent()", +"7570acd4": "indVesting()", +"75718e2c": "_increaseTotalDivis(uint256,uint256)", +"7571ca36": "getTerminated()", +"75724990": "addShareholder(address,uint256)", +"7572ead0": "halfyearteam()", +"7572f341": "subtractWee(uint256,uint256)", +"757387d0": "nextInListToReturn()", +"75749f52": "LOCKED_BOARD_BONUS_TOKENS()", +"757501c5": "districtsCore()", +"7575594b": "buyShip(uint16)", +"7575884d": "InTokenTest11(uint256,string,uint8,string)", +"75759319": "wthdraw(address,uint256)", +"7575db0a": "invalidateCache(bytes32)", +"7575ecf6": "validateAndLower(string)", +"75765249": "saveLottery(uint32,uint256,uint256)", +"75766294": "teamPeriodAmount()", +"757765f8": "setMaxBuyLimit(uint256)", +"75776fa4": "createPromoPony(uint256,address)", +"7577732e": "createController(address,address[],uint256)", +"75780127": "testExecuteSellOrderShouldIncreaseBuyerTokens()", +"75785afc": "createDefaultGen0CobeFriend(uint256,address,uint256,uint256)", +"757861eb": "start_play_and_gain(string,string)", +"75790787": "getFeeCollectedByAsset(address)", +"75792f0d": "_transferToICAPWithReference(bytes32,uint256,string,address)", +"75794a3c": "nextTokenId()", +"75796f76": "setWithdrawalWallet(address)", +"7579f2c9": "ArollaToken()", +"7579fcb3": "mintPackSaleCard(uint8,address)", +"757a449e": "approveWithIndex(address,uint256,uint256)", +"757a5522": "channelPartTimeout(uint64)", +"757a61b9": "buyAssetPack(address,uint256)", +"757bd312": "getCrystalWrapper(address,uint256)", +"757be78e": "PlayersStorage()", +"757ccd3b": "canCreate()", +"757d9b97": "getTradeRate(address,address)", +"757de573": "setOwnerCut(uint256)", +"757dfdcc": "SafeWalletCoin()", +"757e5e73": "_giveShares(address,uint256)", +"757f70fb": "SAMPLEToken()", +"757f7302": "updateStateChangeAgent(address,bool)", +"75806e6e": "setIssuerDelegate(address)", +"75811c15": "ownerChange(uint256,address)", +"75812019": "getBurningReward(uint256)", +"7581a8e6": "enableBurning()", +"7581aa5f": "setActivityState(bool)", +"7581d62f": "genesisProtocol()", +"75821d21": "changeTokenWallet(address)", +"75829def": "transferAdmin(address)", +"75830463": "checkBetLowhigh(uint8,address,bytes32,bytes32)", +"758357b8": "fstPrice()", +"7583902f": "getProviderInfo(address)", +"7583a523": "maxEarlyPresaleEDUSupply()", +"75846a5e": "ZoueToken()", +"75849902": "forwardPurchaseFeesTo()", +"75854fbd": "b(bool,bool)", +"75862df4": "TokenWithEStop(address)", +"75864416": "MeritToken(uint256)", +"7586cd45": "getPokemonCurrentPrice(uint256)", +"7586fcc5": "AutoCoin(string,string,uint8,uint256,uint256)", +"75872a5a": "evolveMonster(uint256,uint16)", +"75874f3e": "Divineum(uint256,string,uint8,string)", +"758822e6": "checkForValidity(string)", +"75885f6a": "approveAndCall(address,uint256,bytes1)", +"758866f0": "TOSToken()", +"7588f82b": "currentVestedAmount()", +"75892cf1": "convert(address,address,uint256,uint256)", +"75894e8c": "getEntity(address)", +"758971e8": "ownerTakeProfit(bool)", +"7589ca40": "BCV()", +"758b31df": "premiumMod()", +"758b5172": "setPlayersPerRound(uint256)", +"758befae": "tokenPresaleCap()", +"758e08d0": "Authorization(address)", +"758ed826": "addDAppContract(address)", +"758f39b8": "verifyProofOfStake(address,bytes32,uint64,uint256,bytes32[],uint256[],uint256,uint256)", +"758fabcd": "MAX_CONTRIBUTION_SLOTS()", +"759014f0": "getChallenge()", +"7591dfa0": "dmlToken()", +"759234ec": "POLE()", +"759242fd": "WorldReserveCurrency()", +"75924b95": "changeWinConfig(uint8[],uint8[])", +"7592550b": "transferHomeViaRelay(address,uint256,uint256)", +"759343d4": "sendTo(address,bytes,uint256)", +"7593473c": "set_brain(address)", +"7593ca71": "setExchangeInterval(uint256)", +"75949c13": "sendHalf(address)", +"7596732f": "MorzeF()", +"759793c1": "buyInternal(uint256,address)", +"7597eede": "isHoliday(uint256)", +"7597fd6b": "escape(uint32,int256,uint32)", +"7599609d": "getEventForHousePlaceBet(uint256)", +"7599f8d9": "private_setRandomAPIURL(string)", +"759a2753": "StakeIncreased(string,address,uint256,uint256)", +"759b2ac4": "removeRole(uint256,address,uint256)", +"759bca86": "TEMWallet()", +"759c01dc": "SonDepTrai()", +"759c676d": "removeAddressToWhitelist(address)", +"759c7a58": "setAdOwner(uint256,address)", +"759e6558": "changelp9(address)", +"759f0914": "createObject(string)", +"759f8712": "nonActivationShortWithdrawal(address[2],uint256[8],uint8,bytes32[2])", +"75a0a7a4": "generateNumberWinnerQuery()", +"75a0ff93": "BTKToken()", +"75a2b407": "createPromoFighter(uint256,uint8,uint8,uint8,uint8,address)", +"75a35191": "Travelercoin()", +"75a374ee": "transferMined(address,uint256)", +"75a3eac0": "checkExistsOwnedAngel(uint64)", +"75a4894b": "setReaderId(bytes32,bytes32)", +"75a4e3a0": "unlock(bytes4)", +"75a4ea52": "updateCandidateAddr(address,address)", +"75a52506": "display(bytes32)", +"75a53a8f": "changeTrusteeOwner()", +"75a5425a": "DTesh()", +"75a55a44": "CR7()", +"75a5b1ab": "registerDuration()", +"75a5ba80": "delegateDklSiringAuction(uint256,uint256,bytes,uint256)", +"75a66774": "stampDocument(bytes32,uint256)", +"75a6a332": "testThrowRetractNotRetractable()", +"75a6dbda": "delAdminUsrs(address)", +"75a73ed3": "createMessage(bytes32)", +"75a747dc": "_mint(address,uint256,bytes32)", +"75a75ba9": "TRANSFERS_ALLOWED()", +"75a7db40": "existenceSymbol(address)", +"75a806cd": "transferLoss(uint256,address)", +"75a88bcf": "getPreClaimTimeStamp(address)", +"75a90144": "voterExists(address)", +"75a90e02": "readisnameregistered(string)", +"75a949a3": "transferBlocToUsers()", +"75a94af5": "JadetToken()", +"75aa39bd": "getTeamScore(uint256)", +"75aa8705": "begin(bytes32)", +"75ab9782": "tokensToSend(address,address,address,uint256,bytes,bytes)", +"75ac3b08": "presaleEndBlock()", +"75ace438": "setRdCollectorAddress(address)", +"75ad319a": "makeLiquid(address)", +"75ad31a0": "vesting1Withdrawn()", +"75ad4787": "_processRefund(address,uint256)", +"75ad97bb": "_initSpaceship()", +"75ada3d3": "getLicenseReimbursement()", +"75ae267d": "setCanTransfer(bool)", +"75ae51ce": "minForceOffsetAmount()", +"75aecd8d": "ContributionAdded(uint256,address,uint256)", +"75af370f": "ChainToken()", +"75af65d1": "discounts()", +"75b03941": "retrieveGains()", +"75b0d9cd": "totalSupplyOf(uint256)", +"75b1e894": "ProposalLog(uint256)", +"75b238fc": "ADMIN_ROLE()", +"75b3a83e": "START_ICO_TIMESTAMP()", +"75b3ea8e": "calculateExcessTokens(uint256,uint256,uint256,uint256)", +"75b3f9f5": "currentRateLevel()", +"75b44aea": "getEthRate()", +"75b466d1": "sendOrderedTokens()", +"75b4d78c": "bonus()", +"75b5243d": "editBasePrice(uint256)", +"75b599c0": "changeFashionAttr(uint256,uint16[4],uint16[4],uint16)", +"75b5ec08": "DcatNetwork()", +"75b65abf": "claim(uint16,uint16,uint16,uint16)", +"75b77c4b": "PRICE_MAX()", +"75b82a66": "distributeGameDividend()", +"75b88b82": "Beebit(bytes32)", +"75b8de15": "encodeInt(int256)", +"75b8fa6f": "contractMoneyBalance()", +"75b91305": "_removeDeposits(address,uint256)", +"75b94133": "validatorReward()", +"75b975b7": "askArbitrator(address,bytes32)", +"75b99fb1": "HonestisnetworkICObalances()", +"75b9b357": "updateData(uint256,string,string)", +"75b9c384": "UpdatePay()", +"75b9fd47": "BuyAcorns()", +"75bac6fd": "getLastDeedTimestampByAddress(string)", +"75bae755": "AariTestToken()", +"75bba189": "setModerator(address)", +"75bbc15d": "isNeedDrawGame(uint256)", +"75bbc204": "addJackpotGuaranteed(uint256)", +"75bc369a": "_triggerCoolCountDown(uint256)", +"75bcf09f": "getFibo(uint256)", +"75bd3237": "listingExists(bytes32)", +"75be5846": "unlockForever()", +"75bedf12": "valueOf(uint256,uint256)", +"75bf4777": "Presale(address,uint256,uint256)", +"75bfb140": "teamInstantSent()", +"75c0ae13": "getSalaryTokenAddress(address,address,uint256)", +"75c14f7d": "buyoutAndSetReferrer(uint256,bool,uint256,uint256,address)", +"75c1b643": "setconfig(uint256,uint256,uint256)", +"75c268f3": "rateFeesDenominator()", +"75c26c3f": "closeCrowdfund()", +"75c3039c": "finalizeCapReached()", +"75c304f7": "matchable(address)", +"75c34d94": "BitcoinElena()", +"75c48942": "restrictedVault()", +"75c4a4d6": "isClaimable(int8)", +"75c4aaa6": "addUnderDog(uint256)", +"75c4e9ec": "token_reward()", +"75c589a0": "getMinimumCallCost()", +"75c5efd8": "teamFundsAddress()", +"75c66e2f": "mintTokens(uint256,uint256,address)", +"75c69e39": "SOLUSCRSToken()", +"75c7d4e1": "sellMyTokensDaddy()", +"75c81ad0": "minProfit()", +"75c8a66e": "MANHATTANPROXY7THST()", +"75c8f04b": "addTenant(address)", +"75c9c4a4": "SQUIRREL_BASE_REQ()", +"75c9ee06": "teamFrozenTokens()", +"75c9f351": "maxTokenNum()", +"75ca1fad": "setcommissionPer(uint8)", +"75ca3b2e": "getKittyInfo(uint256)", +"75cb14bc": "panicOff()", +"75cb1bd1": "setWallets(address,address,address)", +"75cb2672": "configure(address)", +"75cbe239": "rulesProposals(uint256)", +"75cc21bd": "LogInvestshare(address,uint256)", +"75cc499f": "LogTokenPurchase(address,uint256,uint256)", +"75cc90b3": "ADMINS_COUNT()", +"75cd109a": "BurnSplit(uint256)", +"75cd51ed": "accountExists(address)", +"75ce2913": "pushOwnedToken(address,uint256)", +"75ce738e": "base_token()", +"75cf567a": "TOKEN_RATE_15_PERCENT_BONUS()", +"75cf77fb": "buyPoohs()", +"75d04628": "updateMatchStartTime(uint8,uint256)", +"75d049bb": "ApplyDividentsMultiplicator()", +"75d0c0dc": "contractName()", +"75d14478": "Chi_available()", +"75d16a1e": "JaxBox()", +"75d1722d": "_cancelOrderWithPayer(string,address)", +"75d2fd7f": "setERC20compatibility(bool)", +"75d32381": "Gave(uint256,address,address,uint256,uint256)", +"75d3bda6": "Product()", +"75d4066d": "getKeccak256(string,string)", +"75d4115e": "orderSubmitter(bytes32)", +"75d427e2": "greaterHash(bytes32,bytes32)", +"75d53a73": "approveMe(address)", +"75d57f44": "Benable()", +"75d5a7c6": "torchContractBalance()", +"75d60ba1": "PayToContract()", +"75d7036b": "getOuvidoriaEnteTipo(address)", +"75d7348a": "makeReferalBonus(uint256)", +"75d74f39": "get_s()", +"75d79399": "LogNotifyOfArbitrationRequest(bytes32,address)", +"75d7e4bd": "hydroTokenAddress()", +"75d7e8ea": "canTransferIfLocked(address,uint256)", +"75d9085a": "buyCardXname(uint256,string)", +"75d91db8": "cancelAuctionByMaster(uint256)", +"75d955f7": "realWorldPlayerMetadataForPlayerTokenId(uint32)", +"75d96718": "RELEASE()", +"75d9aa1a": "migrateFromLegacyReputationToken()", +"75da33bd": "tokpereth()", +"75dbc1aa": "LiquidHome()", +"75dc6471": "getSalesCity(uint256)", +"75dc7d8c": "calcFee(uint256)", +"75dcb701": "getBonusTierCount()", +"75dcb70a": "updateEditionTokenURI(uint256,string)", +"75dd3799": "NetWexCoin()", +"75dd82b8": "setPreMineAddress(address)", +"75ddbc4e": "setBalanceOfPendingToken(address,uint256)", +"75ddfa11": "ChannelBought(string,address,address)", +"75deadfa": "endTimes()", +"75df1fe8": "lockReleaseDate1year()", +"75df9fdb": "backVISTAcoinOwner()", +"75e01780": "startExchange()", +"75e0747e": "referrerBonus1()", +"75e2f405": "product1_luckybuyTracker()", +"75e2ff65": "setMigrationAgent(address)", +"75e3661e": "unblacklist(address)", +"75e372f2": "BlocklancerDataHolder()", +"75e3921c": "ETH_VTA()", +"75e39f26": "getHeroInfo(uint256)", +"75e3e4d4": "_sendTokens(address,address,uint256)", +"75e42744": "balanceOf(address,bytes32,address)", +"75e456c3": "validInvestment()", +"75e5598c": "ACTION_KEY()", +"75e6f675": "redemptionPercentageOfDistribution()", +"75e71d6d": "beneficiaryExists(address)", +"75e87642": "getRoundBetAmount(uint256,uint256)", +"75e88e3a": "getForceOffsetBooks(address)", +"75e8b1a3": "changeWithdrawnTime(uint256)", +"75e8f289": "depositWalletAddress()", +"75e8f757": "ERC20PreICO(address)", +"75e96908": "saveLifeEvent(string,string,string)", +"75e9c91f": "dropNectar(address[],uint256[])", +"75e9e3e2": "Ldt()", +"75ea1b68": "completeDeliverable(bytes32,address,address)", +"75ec899a": "addBodyParts(uint8[])", +"75ed5604": "referralLinkRequirement()", +"75ed8f89": "tOS(address)", +"75ee1908": "whitelistManyUsers(address[])", +"75ee549c": "seteUSD(address)", +"75ee7315": "IcoPaused()", +"75ee85bd": "salsa20_8(uint256,uint256)", +"75eeadc3": "hasWon(uint256)", +"75f0a874": "marketingWallet()", +"75f12b21": "stopped()", +"75f208bf": "testFailCreateWithParentNotInUse()", +"75f289bc": "setDiscountBonus(uint256)", +"75f2e45d": "charityPayed()", +"75f33ed6": "EtherReceival(address,uint256)", +"75f40f40": "underdogPayoutFund()", +"75f41f4a": "initExchangeUser(uint256)", +"75f45878": "scheduleCall(bytes,bytes,uint256)", +"75f46563": "setVLTMultiSig(address)", +"75f6641f": "GoldBackedToken(address)", +"75f7cc4a": "PeriodStarted(uint256,uint256,uint256,uint256,uint256,uint256)", +"75f7d866": "tokenReserved2Deposit()", +"75f7e6f0": "saneIt()", +"75f829a9": "BetAccepted(uint256,uint8,address,uint256,uint256)", +"75f890ab": "setContract(address)", +"75f91ec8": "getTokenAmount()", +"75f96ead": "Guess(uint256)", +"75f9ae86": "setCertificateSigner(address,bool)", +"75f9e6da": "initialIssueMintingDate()", +"75fa1bd3": "_reserveTokens(address,uint256)", +"75fc8e3c": "goodbye()", +"75fcc6f1": "OWN_burnToken(address,uint256)", +"75fd4c23": "test_basicUnitTest()", +"75fd776a": "STRATEGIC_PARTNERS_POOL_ALLOCATION()", +"75fda973": "tokenDistributeInDividend()", +"75fe06dd": "claimXmasGift(address)", +"75fe2cb8": "setDnaExist(uint64,bool)", +"75fe2e33": "getMonsterObjId(address,uint256)", +"75ff0664": "ERC223TokenMock(address,uint256)", +"76005c26": "fulfillData(uint256,bytes32)", +"76014a2d": "senderETH(address)", +"760163af": "getLastGames()", +"76017bbd": "getRewardWei(address)", +"7603ac4b": "registerFileClosing(string,uint256,string,string)", +"7603b02d": "houseCommission()", +"76041376": "devTeamAddress()", +"76045702": "AcceptsDividendFacial(address)", +"7604b6d7": "testGetBlobStoreFromFullBlobId()", +"76052df8": "setPurchasable(bool)", +"760672df": "weiToTokensAtTime(uint256,uint256)", +"7606f781": "getMetrics()", +"7607422a": "CSCS(address)", +"76098303": "futxMiner()", +"7609c5a9": "transferFromToICAP(address,string,uint256)", +"760a221c": "LOCK_RELASE_TIME()", +"760a45cf": "lockStrategy(address)", +"760a812c": "ChangedNeighbourReward(uint256)", +"760a8c2a": "setActive()", +"760ac21b": "testFailBadTransfer()", +"760b8f62": "bonusAll()", +"760bb006": "isUser(bytes32)", +"760c1fa3": "loadX(uint8[],uint256,uint256,int256)", +"760cd8e1": "transferAgent()", +"760cfa57": "GeneratedERC20Contract()", +"760df4fe": "_isCarousal(uint256)", +"760e2cf3": "buyUpgradeCard(address,uint256,uint256)", +"760eab1a": "ZodiacCore()", +"760ee49c": "setCurrentState(bool)", +"760f7382": "shipTokens(address,uint256)", +"76102b3c": "PRICE_PRESALE_WEEK3()", +"76105fe7": "tarifOf(address)", +"7611f50d": "periodStage()", +"7612115d": "setTokenPartner(address)", +"76124dac": "vote(bytes32,uint256,address)", +"76124db7": "Update_TrustlessTransaction(uint256)", +"761390b9": "BCX()", +"76147a0e": "notification(address,uint256)", +"7614e727": "baseMineTokenAmount()", +"761522af": "TradeBits()", +"76164085": "seek(int256,int256,bool)", +"76165adf": "buy(address,address,uint256,uint256,uint256)", +"76167a89": "getMessageSender()", +"7617f814": "sumPreICO3()", +"7617fbbd": "PreOrder(address,address,address,address,address,bytes32,uint256,uint256,uint256,uint256,uint256)", +"76190f8f": "isSiringClockAuction()", +"76192200": "finishMinting(address)", +"7619317b": "redemptionWallet()", +"76196c88": "setDnsrr(bytes32,bytes)", +"76197591": "finalizedICO()", +"7619d22e": "LEGAL_EXPENSES_2_TOKENS()", +"761a5b0e": "updateERC20rewardMultiple(uint8)", +"761a832f": "setBaseRewards(uint256,uint256)", +"761aef78": "BuyTicket()", +"761b59ac": "crabPartDataFromGene(uint256)", +"761ba894": "getPremiumMultiplier()", +"761bb70a": "train3(uint256,uint256)", +"761c1cf9": "SetupGWT(string,string,uint256,uint256,uint256,address,address,uint256)", +"761c3688": "remark2()", +"761c4524": "SHARE_TEAM()", +"761c7cfe": "resolveChallenge(uint256)", +"761d9e68": "getUserPolicy(address)", +"761dc416": "Megaton()", +"761e0d2d": "DEFAULT_MINING_BIT()", +"761e64c4": "setPI_edit_31(string)", +"761fe6fe": "totalAmountsBetStage1(uint256)", +"76207a5b": "getOrderInfo(bool,uint256,uint256)", +"7620a65b": "Publisher()", +"7620f4bb": "fipsNotaryLegacy68b4()", +"76227f3b": "burnAdminAmount(uint256)", +"76235b49": "getUUIDS(bytes32)", +"76247776": "getDirectory()", +"762506b6": "lrs(uint256)", +"7625391a": "distribute(uint256,uint256)", +"762549e0": "minThresholdUnits()", +"76266ce9": "logResources()", +"76271346": "_parent(uint8)", +"76278e7b": "limitDatePresale()", +"7627c9ad": "grantTransferRight(address)", +"7627e941": "validateOrder_(address[7],uint256[7],uint8,uint8,uint8,bytes,bytes,bytes,uint8,bytes32,bytes32)", +"76285b5b": "_is360thDay()", +"76289f71": "setMasterAddress2(address)", +"7628e728": "PRE_ICO_TILL()", +"7629cca0": "ContractDisabled()", +"762a4f35": "updateClosingTime(uint256)", +"762a66a2": "getAuction(address,uint256)", +"762ac19d": "startICOPhaseOne()", +"762c38fd": "askQuestion(uint256,string,address,uint32,uint32,uint256)", +"762c7ab2": "setPercentForHelpCoin(uint256)", +"762ced87": "prcntRate()", +"762d739a": "vigencia()", +"762e3816": "TOURNAMENT_WALLET()", +"762ede1e": "ETHCONEarlyBirdToken()", +"762fdc0c": "getRatePlan(uint256,uint256)", +"762ffc42": "VanityReserved(address,string)", +"76305a89": "CoinCrowdICO(address,uint256,uint256)", +"763091ff": "initCreator(uint256)", +"76309e70": "CTT()", +"7630ad34": "getInfoD(uint256)", +"76319190": "removeSupportedToken(address)", +"76323253": "createRounds(uint256)", +"76324597": "dropStart()", +"763250e1": "GizerToken()", +"763265de": "setMaxCap(uint256)", +"7632b18b": "WICCrowdsale(address,uint256,uint256,uint256,address,address)", +"76338028": "functionCalls(bytes32)", +"763430b8": "mFUNDING_SALE_TIMESTAMP()", +"7634d45d": "titlesSold(address)", +"7634ecc0": "debitEqually(address[],uint256)", +"7634ed39": "saveNewAnchor(bytes32)", +"763542ce": "BucketBuy(bytes32,uint256,address,uint256)", +"7635761b": "getusersCount()", +"7635e1de": "changeTokenManager(address)", +"7635e409": "createZombie(uint8,bytes32,uint16,bool,address)", +"763730bd": "whitelistAddresses(address[],uint256,bool)", +"76375c5c": "splitterContract(address,uint256)", +"763770d2": "getTokensManual(address,address)", +"7637a12e": "GoldmintMigration(address,address)", +"7637da03": "MINER_STARTING_PRICE()", +"76385f2a": "PeriodOfAccount(address,uint256)", +"76389260": "EthlanceSearchFreelancers(address)", +"76390144": "getCorrectedStats(uint256)", +"76399bc6": "getFoundtionAddres()", +"763a6390": "setWeightLostPartLimit(uint8)", +"763a666a": "withdrawLiquidityPoolTokens(address,uint256)", +"763a738c": "allNames()", +"763ac589": "createStake(address,address,uint256,uint256,bytes)", +"763add8f": "KPCS(address)", +"763b144e": "EmpireCrowdsale(uint256,uint256,address,uint256,uint256,uint256)", +"763cbde0": "_addPassportLogic(string,address)", +"763cf9aa": "feed100(uint256)", +"763d2500": "getTotalNbOwners(uint256)", +"763e29ad": "CherishToken()", +"763f337e": "setAllowReferral(bool)", +"763f4011": "mintMarketing(address,uint256)", +"763fd2ab": "TOTAL_PRESALE_TOKENS()", +"763ffcec": "setupDisbursement(address,uint256,uint256)", +"7640304d": "_lastSnapshotId(address)", +"76405122": "buyImplementation(address,bytes32,uint256,uint8,bytes32,bytes32)", +"76418809": "private_withdrawBankFunds(address)", +"7641a8c6": "SetFinalBlock(uint256)", +"7641e6f3": "burn(uint256,string)", +"76421887": "OWNER_LOCK_BLOCKS()", +"7642249c": "mintadd()", +"76429844": "MultiSendToken()", +"7642dc0f": "calcVesting(address)", +"764300bf": "ALLOC_MARKETING()", +"764358e6": "logSweep(address,address,uint256)", +"764423a4": "buyerAddressTransfer(uint256,address,address,address)", +"764499e5": "GamePlayed(bytes32,bytes32)", +"7644d361": "hashMessage(string,string,string,uint16,string)", +"7644ecbf": "BallotO(address[],uint256[])", +"76456887": "startSecondPhase()", +"76466d42": "setAllowedContract(address,address)", +"7648c929": "returnRemainingEther()", +"7648f99b": "ProposalSubmitted(uint256,uint256,address,uint256,uint256,string,address,uint256,uint256)", +"764912ef": "totalTokenCount()", +"76495ce7": "tokensFor1EthP4()", +"76496e34": "earlyCommunitySupply()", +"764ab11b": "WalletV2(address,address)", +"764b08c3": "STATS_SIZE()", +"764c499b": "contract_terminated()", +"764c6dd3": "voteToFreeze(address)", +"764c86bd": "totalDistanceRun()", +"764c8e54": "depositBoth(uint256)", +"764c92f2": "trustedOrderTransfer(address,address,uint256)", +"764c98c1": "getIntArrayDynamic()", +"764c9d32": "sleepContract()", +"764d1e04": "getFreelancerParams()", +"764d9969": "XubiToken()", +"764e50eb": "priceUpdated(uint256,uint256,string)", +"764e5cd9": "getSkills(address,uint256)", +"764e971f": "add(uint256,bytes32)", +"764ea3fe": "walletEhterCrowdsale()", +"764f3aa8": "getTokenBalances(address)", +"764fe7d1": "totalMiners()", +"76520713": "setLock(string,bool)", +"7652ce3b": "getRoot(uint64,bytes)", +"7653740f": "addCbAddress(address,bytes1,bytes)", +"765388ae": "createCrab(uint256,uint256,uint256,uint256,bool)", +"7653d31c": "_clearQueue()", +"7653f795": "CarTaxiIco(address,address)", +"7655e825": "unsafeWriteUint8(uint256,uint8)", +"765718d7": "register(uint256,bytes)", +"76577eae": "distributeEarnings()", +"76586bcb": "doWithdrawal(address,uint256)", +"76587847": "buyDepots(uint256)", +"76587921": "transferFromWithNarrative(address,address,uint256,string)", +"7658c574": "setQuantityFactor(uint256)", +"7658d5ef": "totalICO()", +"76596a1a": "hasTeamMember(address)", +"7659de23": "snapshotBlockHeight()", +"7659fd71": "BitcoinProtocol()", +"765aa39e": "startMulti()", +"765af8bf": "getNumArtworksXType()", +"765b1766": "tryFinishInterface(address)", +"765b59d2": "getStatus(uint256,address,address)", +"765b8dee": "transferStep2(address)", +"765bfac6": "setEscuela(uint256)", +"765c9c7f": "bionic()", +"765dd7a0": "addTeamAddress(address)", +"765e0159": "getNext(address)", +"765f09f2": "GetCurrencyInformation(uint256)", +"7660473a": "EconomyTaxed(string,string,string,string,string)", +"7661129e": "updatePromoEthCommission(uint256)", +"76617156": "burnAmountAllowed(address)", +"7662850d": "init(uint256,uint256,uint256,uint256)", +"7662c9a7": "GetAskSeries(address)", +"7663265c": "_setGameSettings()", +"7663680e": "setTotalBurntCoins(uint256)", +"76636e73": "PREICO_BONUS()", +"76637dcd": "WhoIsTheContractMaster()", +"7663f171": "getCardIndexOfOwner(address,address)", +"7663f228": "testBurnThis()", +"7663f822": "exists(address,address)", +"76640648": "payforRefund()", +"7665f6a7": "setTransferOwnership(bool)", +"7666ee8f": "addCustomerToRegistry(address)", +"76671808": "currentEpoch()", +"766719f0": "optInXferGas()", +"766954b4": "hashString(string)", +"7669c0c4": "showPhaseCount()", +"766a3f2e": "Security_ConnectBankAccountToNewOwnerAddress(uint32,string)", +"766a5f09": "setSalesPool(address)", +"766b0823": "addWhiteBackersByList(address[])", +"766b1818": "PYCToken()", +"766bd930": "Duanwu()", +"766d30aa": "setDefaultRecommAddr(address)", +"766d5235": "isOpening()", +"766d8365": "resetRoundStartTime(uint256)", +"766e33f4": "releaseStart()", +"766e4f2c": "issueTokensToUser(address,uint256)", +"766e866c": "setMaxGasRefund(uint256)", +"766e8b27": "tokensaleTokensPerEtherNow()", +"76703ef1": "AVIU()", +"767180d0": "impl_purchase(address,bool,bool)", +"767392b3": "equal(bool,bool,string)", +"7673faf0": "wallet4()", +"76740de0": "isPlayer()", +"767418b0": "alterBalance(uint256)", +"76745dbb": "increaseTotalStake(uint256)", +"76748f2a": "default_price()", +"7674cee3": "paymentMin()", +"76753b04": "ledgerUserBetContribution(address)", +"76775c10": "addReferrer(address,uint256)", +"76779829": "randomC()", +"767800de": "addr()", +"7678369a": "dayfund(address)", +"7678473d": "BTCDOGE(uint256)", +"7678f8bb": "getBid(int256)", +"76792ad9": "setDaily()", +"76793f47": "kwhFund()", +"7679a816": "handleFund()", +"767a11ca": "verifiedAttributes(address)", +"767a99ee": "legalContract()", +"767b6190": "constructor(uint256)", +"767b79ed": "register(string,uint8)", +"767bc136": "cards_titanium_total()", +"767bcab5": "setRandomizer(address)", +"767c732e": "enterBidForCollectible(uint256,uint256,int256)", +"767c9d18": "getMigrateInAttoTokensValue()", +"767d65ba": "ASEChain()", +"767eb651": "getRemainingAmount(address,address)", +"767eb8ad": "isValidName(bytes16)", +"767f0215": "MAIN_SALE_BONUS_PERCENTAGE_PHASE3()", +"767f61ac": "putTitle(bytes32,string,bytes32,bytes32,bool,string)", +"767f7b01": "User(string,address)", +"767fa723": "getPresaleInfo()", +"767fb1c4": "RecoverableController(address,address,uint256,uint256)", +"76809973": "BeneficiaryChanged(address,address)", +"76809ce3": "decimal()", +"76814692": "BusToken()", +"76823637": "startNewTurn()", +"768255ca": "TokitRegistry(address)", +"7682e6ff": "getTrustSetting(address)", +"768356c1": "TUI_ADDRESS()", +"768433c2": "topFab()", +"76849376": "addNode(bytes32,address)", +"768549aa": "KpopItem()", +"76855764": "enableSudo(bool)", +"76858faf": "ViralToken()", +"7685e1df": "NPTToken(address)", +"7686136a": "updateCourseRate(address,uint256)", +"76865eea": "unHalt()", +"7686cea9": "etap()", +"76884153": "AirTransfer(address[],uint256,address)", +"76888a3e": "TheTokenF()", +"76890c58": "transferOut(address,uint256)", +"76894bd9": "tokensToEthereum(uint256,uint256)", +"76897b90": "setReserved(uint8,uint8)", +"768a3326": "myxTest()", +"768a3a7d": "GetSender()", +"768aa331": "addHpbNodeBatch(address[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[])", +"768afcec": "buyKeys(uint256,string,string)", +"768b4ce0": "updateWorldScore(uint256,uint256)", +"768bd5cd": "THULYA()", +"768c326d": "validatePhaseDates(uint256,uint256)", +"768c9af4": "Approval(address,address,bytes32,bool)", +"768e7220": "ownerLockedBalance()", +"768f930d": "checkSignersByAddress(bytes32,uint256,uint256,uint256)", +"76907bc7": "setCoinBalance(address,uint256)", +"7690bee4": "NextGenHyip()", +"7690ed70": "_changeLockDate(uint256)", +"7691471c": "PRE_SALE_TOKEN_CAP()", +"76917b68": "updateMC(uint256)", +"76918f5d": "setAdPriceMultiple(uint256)", +"76922f78": "auctusPreSaleAddress()", +"7692ac94": "createEtherMonster(uint256,uint256,uint256)", +"7692ba9a": "claimOwnership(string,string,uint256,uint256)", +"7692c4d8": "testCantFinalizeNotEndedSale()", +"7693488b": "finalizeTokenSale()", +"76937a3f": "airDropCustom(address[],uint256[])", +"7694df16": "scaledRemainder()", +"76959b6a": "hasSDC(address,address,uint256)", +"7695be1d": "DaleOR()", +"7695d79b": "nftTokenCount()", +"769643bc": "reclaimTokenOwnership()", +"76965867": "getStakedBalance()", +"7696c042": "secondsPerMonth()", +"7696cf52": "bonusFirstWeekPeriod()", +"7696f0db": "frozenCellCount(address)", +"769794dd": "TildeCoin()", +"769796fe": "resetAction(uint256)", +"7698da24": "affirmationsSigned(bytes32)", +"76992d7c": "SettingsChanged(uint256,uint256,uint8,uint8,uint8,uint8,bool)", +"769988b3": "p_update_mEmpireScoreMultiplier(uint256)", +"76999896": "KingOfTheEtherThrone()", +"769af180": "EGGS_TO_HATCH_1BAT()", +"769bf742": "unregisterRecord(bytes32)", +"769c9226": "setLockAll(bool)", +"769db61d": "addNewCard(uint256)", +"769dc523": "GetCategoryNumber(bytes4)", +"769e86cd": "getMyAccountBalance()", +"769edf6a": "createHash(uint256,address)", +"769f194f": "FOUNDERS_TOKENS_VESTED_2()", +"769ffb7d": "setDirectMintAgent(address)", +"76a04af5": "CompensateChips(address,uint32[])", +"76a133ca": "KabirTestToken2()", +"76a24f25": "originalPrice()", +"76a25c5c": "calculateReward(uint256,uint256,uint8)", +"76a310a5": "addAuction(uint32,uint256,uint256,uint8,uint32)", +"76a327fc": "hitMobster(uint256,uint256)", +"76a3f9c9": "addToWinningsArray(uint256,address)", +"76a43abc": "_createPony(uint256,uint256,uint256,uint256,address,uint16)", +"76a4a44d": "AssignGGEPoolOwner(address)", +"76a54c60": "sendEth(address)", +"76a5b431": "removeTip(address,bytes32)", +"76a5b5b9": "LogTransfer(address,address,uint256,bytes)", +"76a64cbf": "BasicToken(string,string,uint256,uint256)", +"76a6676a": "IssuerTransferred(uint256,address)", +"76a67a51": "pause(address)", +"76a684de": "denyAllowanceProxyAccess(address)", +"76a6bf52": "isExecuted(uint256)", +"76a766f7": "Dashgold()", +"76a85d54": "setExchangePrice(int256)", +"76a8bc10": "setExpiry(address,uint256)", +"76aa2f74": "increaseJackpot()", +"76aad651": "paymentSupply()", +"76ab5ea6": "changeDifficultyAndPrice(uint256,uint256)", +"76aba714": "refundMany(uint256,uint256)", +"76abc03b": "getShareDistribution(uint256)", +"76ac2323": "WinkSale(uint256,uint256,uint256,address)", +"76acb5e8": "BuyTicket(uint256)", +"76acb968": "TESTTOKEN1()", +"76ad3abf": "unregisterTraderAccount(address)", +"76ae684d": "setSaleOngoing(bool)", +"76aed2e1": "getTokenType(uint256)", +"76aef5e0": "doubleSend(uint256,address)", +"76af7837": "Loss(address,uint8,uint256)", +"76af9a1a": "balancePreSale4()", +"76b07186": "isPass(address)", +"76b088a9": "check_lock(address,address)", +"76b1514f": "getMaxFreeTeams()", +"76b15836": "changeStatusModerator(address,bool)", +"76b18618": "changeUnitsOneEthCanBuy(uint256)", +"76b1f3d3": "grantAccessToAddress(address)", +"76b3131e": "createvillage()", +"76b33367": "refundsIssued()", +"76b34d2f": "changeCrowdsale(bool)", +"76b39cf9": "activateInTestMode()", +"76b3c8a8": "getLotteryInfo(uint256)", +"76b547b8": "AthaYOGAToken(address,address)", +"76b5d926": "unreserve(uint256)", +"76b63576": "mintFounderTokens()", +"76b69d77": "apiRegistryContractAddress()", +"76b707b7": "getRelease()", +"76b95761": "setVestingStartDateTime(uint256)", +"76ba242c": "bonusTokens()", +"76ba6009": "approveRequest(bytes32)", +"76babef7": "Puzzled(address,bytes32,bytes32)", +"76bc21d9": "fireEventLog2Anonym()", +"76bc522c": "getZIndex(uint16)", +"76bd28bf": "ORNETCOIN()", +"76bd4220": "depositBank()", +"76bd4d2d": "submitProblem(uint256)", +"76bd5f3c": "changeMintedCappedIdx(address)", +"76be0b89": "HIROTOKEN()", +"76be166c": "toAsciiString()", +"76be6c24": "mintLVE(address,uint256,uint256)", +"76bef6b4": "getOneByOneRootHash(uint256)", +"76bf2392": "getCurrentDisplacement()", +"76bf8044": "pledge(bytes32)", +"76bf9f57": "wildcardCount()", +"76bfa5f6": "ProvideSale(address,address)", +"76bfba0e": "splitPay(address[],uint256)", +"76bfba56": "depositForDividend(uint256)", +"76c158cf": "minBankerEther()", +"76c2c0aa": "oresLeft()", +"76c2c296": "SYSTEM_CREATION_LIMIT()", +"76c2f9e7": "HitToken(string,string,uint8,uint256,address,address,address,address)", +"76c30794": "mint0(address,uint256)", +"76c390fe": "Display()", +"76c3b445": "calculateTotalTokenPerContribution(uint256)", +"76c44a80": "openIEOStarted()", +"76c46a70": "changeUnitUserBalanceLimit(uint256)", +"76c535ae": "isExpert(address)", +"76c6c685": "assertItDoesntThrow(string)", +"76c6dc8b": "isPosBitOne(uint256,uint256)", +"76c6fc9a": "checkOwnerShare(address)", +"76c70431": "CRCToken()", +"76c75958": "startCrowdsale(uint256,uint256,uint256,address)", +"76c7a3c7": "MIN_FEE()", +"76c7b434": "developersCut()", +"76c7fc55": "removeBorrower(address)", +"76c82e92": "minAcceptedAmountPresale()", +"76c87548": "scoreBracket(address)", +"76ca0225": "initTwo(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"76ca0c77": "scheduleCall(address,bytes,uint256,bytes,uint256)", +"76ca9e48": "indexPaidBonus()", +"76cb69e9": "KOIN(uint256,string,uint8,string)", +"76cb6f9b": "removeOffChainAddress(address,address)", +"76cba420": "stcOrginalBuy(uint256)", +"76cc1c5c": "landManagement()", +"76ccb1fe": "getSpinOutput(uint256,address,uint256)", +"76cce072": "setBlance(address,address,uint256)", +"76ccf063": "calSimpleRoom(uint256,uint256,uint256,bytes32)", +"76cd005d": "distillGodOwner()", +"76cd470c": "getCurrentAccountingPeriodId()", +"76cd7cbc": "sign(bytes)", +"76cd940e": "currentBatch()", +"76cdb03b": "bank()", +"76cfc366": "depositOffchain(address,uint256,uint256,bytes)", +"76d06add": "issueTokensWithCustomBonus(address,uint256,uint256,uint256)", +"76d0998f": "Odin2(address)", +"76d173a9": "addressAndBalance(address)", +"76d1d35e": "numberOwners()", +"76d260bb": "setInitialVaribles(address,address)", +"76d2d717": "GetFreeTokens()", +"76d33951": "bid(string,address)", +"76d380cb": "IrisTokenPrivatSale()", +"76d438b0": "sendReward(uint256,uint256)", +"76d47bf5": "unlockAddress(address,address)", +"76d57aad": "amountInLock(address,uint256)", +"76d57ad3": "getMixerInfo(bytes32,uint256)", +"76d60a91": "TokensMinted(address,uint256,uint8)", +"76d66f5d": "_Transfer(address,address,bytes32)", +"76d690bb": "BountyList()", +"76d6c296": "getPresale1()", +"76d6da67": "TokenMintingEnabled(address,bool)", +"76d738d9": "DAZToken()", +"76d75952": "getLabelType()", +"76d76b9d": "marketRegisterCost()", +"76d83cb3": "getTerminalCount()", +"76d865dd": "addAdminOwners(address,string,string)", +"76d8f03e": "getBonusCount()", +"76d92428": "setGatekeeperAddress(address)", +"76da5667": "admin_kill()", +"76dad223": "showNumber()", +"76db2e84": "setMinimumEtherAmount(uint256)", +"76db6c8d": "isRedeemable(address)", +"76db76f1": "clearNextPrizeTime()", +"76db7fd4": "setExchangeFlag(bool)", +"76db9b14": "CXTCContract()", +"76dbd108": "calculateProof(string)", +"76dc4c0a": "isFundRequestToken()", +"76dc6643": "threeHotHoursCapInWei()", +"76dc74cb": "sendHoldComisions()", +"76dc76e7": "getUserNumbersOnToken(address,uint256)", +"76dc97d9": "_saveMessage(uint256,uint256,address,string)", +"76dd1f86": "totalMintLimit()", +"76ddfc39": "MIN_HARD_CAP()", +"76de03d0": "weiTotalRefunded()", +"76de1684": "generateOrderByMerchantWithPayee(address,address,uint256,string,string,string)", +"76dffa4e": "MedCann()", +"76e00ed7": "_fromNanoNIL(uint256)", +"76e0f978": "navAdmin()", +"76e20e53": "getMyBets(uint256)", +"76e277c1": "ChickenFarm()", +"76e29114": "nfsPoolCount()", +"76e2bbc7": "paymentInternal(bytes32,uint256[])", +"76e403ec": "balancesLocked1Y(address)", +"76e40c9c": "lendEther()", +"76e44ed8": "lockAll()", +"76e4660c": "getSumAmountOfDisputedStepsProPatient()", +"76e4ca0d": "voteQuorum(uint256,bool)", +"76e4f921": "parachute()", +"76e51e96": "TokenModuleManager()", +"76e53221": "participationCaps(address)", +"76e55338": "mytest()", +"76e57d4b": "withdrawalAddressFixed()", +"76e5c0ca": "WineryOperations()", +"76e608c7": "buyExistFactory(uint256)", +"76e6d2b4": "unLock(address)", +"76e6dbc7": "tokenBaseRate()", +"76e702ee": "tokenDeliveryDue()", +"76e71dd8": "delegateTotalSupply()", +"76e7430e": "finally(address)", +"76e75e05": "getPurchaseRecord(address)", +"76e7b151": "GOFCoin(uint256)", +"76e83bcb": "listModule(uint256,bytes32,bytes32,string,bytes4)", +"76e92559": "totalMembers()", +"76e93db5": "totalMaxBuy()", +"76e9d4fb": "Hybrid(uint256,string,uint8,string)", +"76ea1c6a": "BuyOnSecondaryMarket(uint32)", +"76ea430a": "STAGE1_TIME_END()", +"76ea909d": "indSale()", +"76eaef99": "CatOffered(uint256,uint256,address)", +"76eb5ce0": "END_PREICO_TIMESTAMP()", +"76ec477d": "cancelGame(uint256,string,uint256)", +"76edb1b5": "ReleaseUpdate(uint256,uint256,uint256,string)", +"76edc29d": "TelegramOpenNetwork()", +"76ee2d68": "lokedMint(address,uint256,uint256)", +"76ee3a87": "mainICOStartTime()", +"76ef5d14": "divX(uint256)", +"76f10ad0": "getSnapshot(uint256)", +"76f14c98": "personalizeSquare(uint256,bytes,string,string)", +"76f187ab": "tokensTransferredToHold()", +"76f1dbd4": "Authenticate(address)", +"76f28a4f": "setMarket1(address)", +"76f2a59a": "instantMint(address,uint256)", +"76f2a94b": "acceptWithdrawals(uint256[],uint256[],uint256[])", +"76f30ca1": "toContentID(address,uint256,string,bytes)", +"76f31513": "decreseApproval(address,uint256)", +"76f3264b": "getProviderSupply(uint256,uint256)", +"76f36dec": "ETHC(uint256,string,uint8,string)", +"76f39b28": "SetMaxAllowedBetInTokens(uint256)", +"76f4d8ad": "exchangePlayerTokenCount()", +"76f6218a": "promoBonus()", +"76f660f6": "batchTransferFrom(address,address[],uint256)", +"76f6de69": "RTCCOINERC20(uint256,string,string)", +"76f70900": "oraclesCount()", +"76f75e7f": "orderList(uint256)", +"76f7c522": "hasOneStepWithdraw()", +"76f86e18": "order_buy(address,uint256)", +"76f88781": "pow2Constant()", +"76f9378d": "getWords(uint256)", +"76f95818": "stopFlagOn()", +"76f9b8d9": "getTokenInfoSignatures()", +"76f9e018": "greedIsGood(address,uint256)", +"76f9fd38": "castVote(string,uint16)", +"76fb7c72": "setAllowedAgentsForOtherSource(address,bool)", +"76fc53c0": "extDistributeBondFund()", +"76fd7951": "MacoTestCoin()", +"76fd7b11": "requestWeiPrice(string)", +"76fe192a": "forceResetPeriod()", +"76fe3efa": "itemNameAddress(uint256)", +"76fe47eb": "returnBooleanInverted(bool)", +"76fe8228": "getHorseSex(uint256)", +"76fede7a": "get_term_deposit_end_date(address)", +"76fee774": "getNewPetCard(uint8)", +"76fee8e0": "MineBlocksAddr()", +"76ff1d24": "MailhustleCrowdsale()", +"76ff87cc": "VYRAL_REWARDS()", +"76ffb887": "failure()", +"77002fcf": "getBadge(bytes32)", +"77009c5c": "EYCryptoTradingGOLD()", +"7701c52d": "withdrawMarginPreSignedHashing(address,address,uint256,uint256,uint256,uint256)", +"7701f361": "test_newProposalAndNotEnoughVotes()", +"7702b8e4": "confirmOneSell()", +"770342ee": "ChannelClosed(address,uint256)", +"7704533d": "arbitrationWallet()", +"77049457": "median()", +"770506c1": "withdrawMobileAppCoin(address)", +"7705b6f4": "claimBoard(uint256[81])", +"7706390b": "handover(uint256,address)", +"77073437": "alicoinToken()", +"77076855": "isInOpenMakeOrder(address)", +"77079f55": "YohoToken()", +"7707c69a": "set_sale_owner(address,address,bool)", +"7707e2b2": "withdrawHoldVault(uint256)", +"770850c8": "accountIndexOf(address)", +"770864ad": "addOpenMakeOrder(address,address,uint256)", +"77086d94": "addSpaces(uint256[],uint256[],bytes)", +"7708b441": "founderWithdrawablePhase2()", +"7708e321": "setaddress(address,address)", +"7708e43b": "getNumBets(uint256)", +"7708ea1d": "ROLE_CEO()", +"77097bfa": "testerReentrant()", +"77097fc8": "mint(uint256,string)", +"7709bc78": "contractExists(address)", +"7709c0d3": "setMaxWhitelists(uint256)", +"770a4265": "updatePrizeDist(uint8,uint8,uint8,uint8,uint8)", +"770ae2af": "setMinAllowedBetInEth(uint256)", +"770b210e": "canBuyLimit()", +"770b5414": "getCurrentData()", +"770b80b6": "returnBalanseToTarget()", +"770b8aab": "RecoveryModeActivated()", +"770bb9ae": "_createDrawings(bytes32,bytes32,address,string)", +"770c59b8": "purchaseParrot(uint256)", +"770c6bde": "removeItemLendingList(address,uint256)", +"770c6cbb": "WithDrawPreForkChildDAO()", +"770cde1b": "ContractExample(string)", +"770d64c6": "LogLate(address,uint256,uint256)", +"770d6591": "_setArmorValue8(uint256)", +"770d8e79": "ADDR_TKG_TEAM()", +"770e3106": "getAccountsCount()", +"770e9e85": "takeTheTorch(address)", +"770eaebe": "Send_Data(address,uint16)", +"770eb5bb": "set_label(bytes12,bytes32)", +"770f75b7": "fireCancelProposalEvent(address,uint256)", +"770f9feb": "clyckterium()", +"770fe154": "ApplyVote()", +"77109b05": "depositEther(address[2],uint256[7],uint8,bytes32[2])", +"7710f29f": "setupPeriodForICO(uint256,uint256)", +"77115c9d": "seedRoundEndTime()", +"771282f6": "currentSupply()", +"77129790": "Crowdsale(address,address,uint256,uint256,uint256)", +"7712acd2": "getABname(uint256)", +"7712c870": "slammerTime()", +"7713b431": "getContactsLength()", +"7713ba04": "setPI_edit_11(string)", +"77146255": "_nextTokenId(uint256)", +"771548e2": "moveAccount(bytes32,bytes32)", +"771602f7": "add(uint256,uint256)", +"77169fbd": "gainsOfVault(uint256,address)", +"7717403b": "ALLOC_CROWDSALE()", +"7718238f": "addFee(address,uint256)", +"7718ce93": "player5()", +"7719f57e": "Seedex420(uint256,string,uint8,string)", +"771a2af4": "getCitationRecordsLength(string)", +"771a3a1d": "taxRate()", +"771acf31": "fluffyCatCut()", +"771ad078": "BuyGenesis(address,address)", +"771ad635": "getContentCred(address,uint256)", +"771c04ae": "ARCToken(address,uint256,uint256)", +"771c288b": "next_stone_id()", +"771c3ec7": "setVendingAttachedState(uint256,uint256)", +"771c7ad1": "hotwalletAddress()", +"771cbe3d": "_mintCard(uint8,address)", +"771ce552": "readownerXname(string)", +"771d7b47": "finishedMigration()", +"771d9d05": "ecosystemAllocated()", +"771e4326": "wingsETHRewards()", +"771eee16": "freezeToken(bool)", +"771feb74": "getPrecious(uint256)", +"771ff086": "allocatenonCSTokens(address,uint256)", +"7720295a": "STARTING_CLAIM_PRICE_WEI()", +"7720e74c": "changeSaleEnd(uint256,uint256)", +"77215c8d": "getObserverCount()", +"772199a1": "getJob(address,uint256)", +"77226237": "isCompetitionAllowed(address)", +"77228659": "query2(uint256,string,string,string)", +"7722d01f": "TokenChanger(address,address)", +"77231e6c": "tokens_sold()", +"77233e90": "setTo(address)", +"7723e2f3": "ArtToken()", +"77241a5f": "makerDaoContract()", +"77248e3d": "claimReservedTokens()", +"7724bdbf": "setStatusInternal(address,uint8)", +"772506bb": "jackpotFraction()", +"77253984": "DPToken(uint256,string,string)", +"7725686f": "thawGlobalTransfers()", +"7726a59a": "WINNER_COUNTRY_CODE()", +"7726bed3": "setEnable(bool)", +"7727c9ad": "changeMinStake(bytes32,uint256)", +"77282b70": "polymathRegistry()", +"7728579a": "isIcoFinalized()", +"77287520": "donate(string,address,string,int256)", +"77289b50": "setMedium(uint8)", +"7728c75a": "LoanRepaid(address,address,uint256,string)", +"7728f48b": "destroyRobot(uint256)", +"772a3835": "customerExchangeFiat(uint256,address,string)", +"772b7a73": "getTxOrigMcwTransfer(bytes32)", +"772bcc79": "DexAgeTest()", +"772c1863": "increaseStellarBalance(uint256)", +"772c658b": "getVIPBounusRate(address)", +"772cb26b": "isStringEq(string,string)", +"772ce10b": "setFuelDestination(address)", +"772e1c6f": "getTrustValue(uint256)", +"772e6f03": "votingProposal(string,bytes32,uint256)", +"772fdcb1": "isContributorInLists(address)", +"77300338": "setActiveTimes(uint256[],uint256[])", +"773041ce": "setInvestor(address)", +"77312cdc": "setMultiETH(address[],uint256[])", +"773183e3": "buyEmptyLocation(uint256)", +"7731cd2a": "Acc(address)", +"7732b2a4": "getNextCrystalReward(address)", +"7732b322": "PinMoCrown()", +"773355bf": "script(bytes)", +"77337d37": "tstart()", +"7733f24f": "ratePreSaleStage()", +"77343408": "setURL(string)", +"7734da3c": "NewPassContractor(address,address,address,address)", +"7734e398": "setFirstBonus(uint256)", +"773531f3": "tokenOwnerBurner()", +"77364291": "taskInfo(uint256)", +"773721b3": "receivedCWCreturn(address,uint256)", +"77372213": "setName(bytes32,string)", +"77381082": "Virtonomi()", +"77390f8b": "_envelopes(string,address)", +"773984dd": "closeIt()", +"7739ad70": "markAsScam(address)", +"773a1154": "generateRandomNumber()", +"773a8597": "HashTokenAward(uint256,string,string)", +"773adc70": "getAllowedStepAmount()", +"773b5b5e": "maxUpdates()", +"773b82a3": "addPerson(bytes32,bytes32,uint256)", +"773b90db": "_lotteryCardNoSend(uint256)", +"773c3f50": "DPPToken()", +"773c5049": "solvency()", +"773c84ee": "exec(address,bytes,uint256,uint256)", +"773d33f5": "transferAndCallback(address,uint256,bytes)", +"773da57d": "DGZTokensWithdraw(address,uint256)", +"773dcb98": "startTransfers()", +"773dfb86": "_extendRound()", +"773e04a9": "log2Ceiling(int256)", +"773e1e84": "fight(uint32,uint16)", +"773e236b": "createLockbox(string,address,uint256,uint256,string,string,string,address[],string)", +"773e8b0f": "testDAO()", +"773ee5a3": "execute_transfer()", +"773eef36": "stopRefund()", +"773ef1cf": "saleOn()", +"773ef38e": "PRICE_RATE_SECOND()", +"773f4873": "Ecopay()", +"773f5edc": "guess(uint256,string)", +"773f7665": "processVIPBenefit(address,uint256)", +"773ff502": "LogMake(bytes32,bytes32,address,address,address,uint128,uint128,uint64)", +"7740f667": "mtStartTime()", +"77410c03": "adminLockdown()", +"774120fa": "merge(address)", +"77413267": "getAuctionByTokenId(uint256)", +"774190dd": "showUserPoolAddresses(address)", +"7741ad4e": "play_game(uint8)", +"7741b4ec": "RandomNumberFromSeed(uint256)", +"7741fc52": "LottoCount()", +"7742ede4": "IMARK()", +"77439e8b": "doYourThing(address,address)", +"77446767": "destinationOf(uint256,uint256)", +"77453df7": "Ex()", +"7745d3b1": "getUsername(address,address)", +"7746167f": "transferBlockValueToBattleValue(uint16,uint256)", +"77463b50": "getEggsToHatchDragon()", +"77467197": "tokensVested()", +"774685c7": "CPO_SHARE()", +"77469275": "getLegacyRepToken()", +"77472b6f": "minEtherCap()", +"7747c993": "competition(uint256)", +"77482b18": "getDeveloperFee()", +"7748b07e": "usersNTD(address)", +"7749d667": "getIncreaseTime(uint256)", +"7749e693": "setCategory(uint256,uint256,bytes32)", +"774a63a5": "CDSToken()", +"774a97cf": "getCurrentTapAmount()", +"774b71d6": "TokenPriceProposalSet(uint256,uint256,uint256)", +"774bafdf": "unlockMe()", +"774dba58": "playHome()", +"774e88dc": "hasUnlockDatePassed()", +"774eb322": "close(string,bytes32,uint8,bytes32,bytes32)", +"774ec644": "setUserPrice(uint256)", +"774f787a": "ShitsToken()", +"77507425": "buyerFunded(bool,address)", +"7750b2b1": "__setDeadline(uint256)", +"775146c3": "request(bytes32,uint256)", +"77517765": "getTotalActiveStake(uint256)", +"7752182b": "AddReserveToNetwork(address,bool)", +"77524af9": "wethTransfer(address,uint256)", +"775274a1": "requestRefund(bytes32)", +"77532fa8": "TotalClosedDeposits()", +"77538407": "Ap()", +"7753ec49": "in_registration_phase()", +"77542194": "setTokenTransferStatus(bool)", +"7754305c": "getURI()", +"7754ec29": "WinCoin()", +"7755a0f5": "ResolutionProposalSubmitted(uint256,uint256,address,string,string)", +"7756c908": "transferLocked(address,uint256)", +"7757fc5d": "withdrawalOpen()", +"7758bf86": "maxBridgeWidth()", +"7758c4f8": "quickBuy(uint256)", +"7758d407": "nextCommonTTWTokenId2()", +"775915ce": "stepTwoEndTime()", +"77598626": "TZCoin()", +"77599026": "calculateYourValue2(uint256)", +"775a25e3": "getTotal()", +"775a8f5e": "toBytes(uint256)", +"775a91ac": "timeLockTokens(uint256)", +"775ad527": "allow(address,address)", +"775af9df": "MiningRigFarmer()", +"775b9c13": "setWhiteList(address[])", +"775c300c": "deploy()", +"775c46cd": "startFunding(uint256,uint256)", +"775dec49": "keccak()", +"775e38f7": "NO_MONSTER()", +"775eb900": "signed(bytes32)", +"775ee3ef": "view56()", +"775f5ec0": "finishRitual(address)", +"775f731c": "addSomeUETsTo(address,uint256)", +"775fc127": "operation()", +"77609a41": "challengeCanBeResolved(bytes32)", +"7760da7f": "reclaimTokens(uint256)", +"77610ba2": "setDollar(uint256)", +"77617a7d": "BuyToyMoney()", +"776184b1": "test_oneValidEqString()", +"77620729": "forward(address,address,uint256,bytes,bytes32,bytes)", +"776247c4": "withdrawEthFromBalance()", +"77627a1d": "Goutex(uint256,string,uint8,string)", +"7762df18": "VVDB(address)", +"7762df25": "potentialOwner()", +"7762f046": "setContractBridgeAddress(address)", +"77640f9c": "setClaim(address,bytes32,bytes)", +"7764d878": "checkstatus()", +"7764f771": "getBackBNB()", +"776532de": "Numa()", +"7765c52c": "getAuctionStatus(uint256)", +"776676d6": "newRC(uint256,uint256)", +"77669b2d": "setCompte_33(string)", +"7767ecc3": "inSdcForAdmin(address,address,uint256,uint256)", +"7768dec0": "isTokenSale()", +"77695d39": "getDb(uint256)", +"77699a06": "reclaimExpiredSwap(bytes32,bytes32)", +"7769d384": "revokeAndPublish(address,bytes32,bytes32,address)", +"7769ea0a": "addPool(uint256)", +"776a038e": "PurchaseToken()", +"776ab634": "unpauseToken(uint256)", +"776b37e2": "editCertificate(string,address)", +"776b6b27": "setRoscaAddress(address)", +"776bf795": "pieceTransfered(uint256,address,address)", +"776c3b70": "setNewSalesManager(address)", +"776d1a01": "setTarget(address)", +"776d62f6": "costs()", +"776d89ba": "delPhase(uint256)", +"776dba67": "VioRewardERC20Token()", +"776df027": "testFailDisownNotOwner()", +"776e7fc1": "checkRedbullQuest(address)", +"776f3b99": "burnByPercentage(uint8,uint8)", +"776f9663": "PeerBet()", +"776fd7ce": "setEscrowTransfer(address,uint256,uint256,bool)", +"77703d29": "getBuyOrder(uint80)", +"7770bd15": "crowdSale()", +"777256c4": "Greeter()", +"77725b88": "SetFFSettings(address,address,uint256,uint256)", +"7772a380": "isInGeneration(address,uint256)", +"7772ba07": "setDelays(uint256,uint256)", +"77738ce7": "fundAccount(address,uint256,uint256)", +"7774c394": "isNecromancer(uint256)", +"7774d64c": "testCreateOrder()", +"7774e950": "createUnit(uint256)", +"7775eec9": "getCompte_29()", +"7776466c": "preSaleToken()", +"777665b8": "transferTOKENtoProviders(address,address,uint256,address,uint256)", +"77773d90": "amountOfTokensPerEther()", +"7777789f": "_mint(address,uint256,uint256[])", +"7777d088": "lotteryTokensPercent()", +"777850f9": "payAfter(address,uint256)", +"77790081": "updateMaritalStatus(string)", +"777955b1": "updateReferralGu(uint256)", +"7779b0e4": "_buyTokens(uint256,uint8,address,address)", +"777a5dc5": "explodePhoenix(uint256)", +"777ab367": "mk_contract_address(address,uint256)", +"777ac349": "totalWins()", +"777ac522": "_createTree(string,string,uint256)", +"777aff7d": "updateHistory(address,uint256)", +"777b4547": "ICO(address,address,address)", +"777c1bb2": "eosLITE(uint256,uint256)", +"777c658f": "getTotalDonations()", +"777cfd5f": "createSubmission(address,string,bytes32,bool,bytes32,string,uint256)", +"777d1a8d": "HealthCoin(uint256,string,string)", +"777dff4a": "transferCTO(address)", +"777e479d": "getRoundBlockNumber(uint256)", +"777e6b1c": "getEntitledFunds()", +"777e82ca": "BookERC20EthV1p1()", +"777e940c": "excessRefund(address,uint256)", +"777ecb74": "LogPaused()", +"777eceb8": "tokensForOneEther()", +"777f942d": "changeMinStake(address,bytes32,uint256)", +"777feff5": "getCertificationDbAtIndex(uint256)", +"7780ae85": "desimls()", +"77810380": "getRegistrationToken()", +"77818808": "Electrium()", +"7781eafa": "considerPerseus(uint256)", +"77826b0c": "setMaxReceiveEther(uint256)", +"778317c4": "setWinLossAmount(uint256,uint256)", +"77838c63": "distributedToOwner(uint256)", +"7783c06b": "newArt(string,string)", +"7785859f": "altCapitalization()", +"7785954b": "produceRandom(uint256)", +"778639cb": "checkValidFighter(address,address)", +"77863b61": "CrossWhitehatWithdraw(uint256,address)", +"7786b22d": "ELRUN()", +"77870bce": "BeatOrgTokenPostSale(address)", +"7787dfaf": "test_9a_transferShouldBeFalse()", +"77886028": "setTokensContractAddress(address,address)", +"7788d126": "REFERRAL_BONUS_LEVEL3()", +"77895ef4": "listedMonForClass(uint64)", +"7789f844": "backTokenOwner()", +"7789fc90": "createBet(bytes32,bytes32,uint256,uint8,uint16,uint16,uint16,uint8,uint256,uint8)", +"778a56ce": "toggleBurn()", +"778a5978": "guessNumber(uint16)", +"778b5aee": "getWalletsCount()", +"778c2cea": "onlyLocklistedCanDo()", +"778d00f0": "pushPrivateInvestment(uint256,uint256,address)", +"778d491e": "wd(uint256)", +"778e388e": "parseInt_(uint256)", +"7790a5d2": "Token_5()", +"77913fbc": "getModuleId(string)", +"7791dc1f": "AuthEnd()", +"77921952": "contributorCounter()", +"77922220": "getRegionProducts(address,uint256,uint256,uint256,uint256,uint256,bool)", +"77922e57": "batchCancel(address[],uint256[],uint256)", +"7793868c": "RostToken()", +"779454ff": "boardAddress()", +"77952161": "didDepositCollateral(bytes32,address,uint256)", +"7795820c": "getCommitment(bytes32)", +"7796fb95": "setSink(address)", +"7798e525": "countUBetChecks()", +"779972da": "setLockPeriod(uint256)", +"779997c3": "bump(bytes32)", +"779a3611": "makeBet(uint256,uint256,uint256)", +"779a5a7f": "getContributorByAddress(address)", +"779ad324": "getIEOId()", +"779b2e11": "getCurLevelKeyNum()", +"779b8dc0": "load(bool,address,address,address,address,address)", +"779beca0": "getNumOfSalesWithSameId(bytes)", +"779beedf": "registerWallet(address)", +"779c4a26": "getUserSponsorships(address)", +"779c9b19": "_emitCategorySet(uint256,uint256,bytes32)", +"779ce152": "WIN_PERCENT_PER_DISTANCE()", +"779d2e20": "setLawSupportProfitAddress(address)", +"779d6fc7": "logInitialReportSubmitted(address,address,address,uint256,bool,uint256[],bool)", +"779de55d": "paymentsByBenefactor()", +"779dec5b": "bZRxTokenContract()", +"779e170d": "isSaleOn()", +"779e5ad8": "gvOptionToken20()", +"77a0e875": "destTokensSit()", +"77a1ec4b": "hodlCountdown()", +"77a28225": "delegateFromReferral(uint88)", +"77a28461": "ownerSetupBankrollInterface(address)", +"77a28fec": "DealCancelRate(uint256)", +"77a3a0a2": "removeMarketFrom()", +"77a43129": "publicSellLockEndTime()", +"77a54b38": "checkForNewStellar(address,uint256)", +"77a54eb8": "blacklistAddresses(address[])", +"77a6acfb": "tokenDemo(uint256,string,string,address)", +"77a6cb64": "TokenEscrow()", +"77a714ae": "ERC721Token()", +"77a7354d": "addExperience(string)", +"77a74a20": "expressingTraits(uint256)", +"77a7d968": "walletBalances(address,address[])", +"77a7e6be": "getRefTotal(uint256)", +"77a8bc86": "untrustedExecuteRuling(uint256)", +"77a9037b": "updateLastVotedOnParameter(bytes32,address)", +"77a9e152": "redeemToken(uint256,uint32)", +"77aaafd2": "interfaceFrozenTransfer(address,address,uint256)", +"77aad873": "proposeLaborHourToken(address)", +"77ac3da5": "oraclize_query(uint256,string,string[1],uint256)", +"77acbb22": "manager2()", +"77ad619d": "get_commit_no()", +"77ae6c47": "requestBatchInsatalmentsLoans(uint256,uint128,uint256,uint24,uint40)", +"77afd7e6": "shitRate()", +"77b02a33": "getGameLock(address)", +"77b08df0": "Migrations4()", +"77b0c751": "getNextPayDay()", +"77b0dd70": "depositAndInitiate(uint256,uint256,address,bytes32,address,uint256)", +"77b11de3": "setPlayerHasGetFree(address,address,bool)", +"77b1788e": "postTrade(bytes32,uint256)", +"77b19cd5": "getCallBaseGasPrice(bytes32)", +"77b1b2eb": "MAX_CANVAS_COUNT()", +"77b1bba6": "ChangeCollector(address)", +"77b1da93": "crowdSaleClosed()", +"77b2d590": "_set3()", +"77b38e2a": "MasternodeDeregistered(address,uint256)", +"77b440e9": "WALLET_FOUNDATION()", +"77b4a9c1": "getMakerBalance(address)", +"77b57073": "sponsorList(address)", +"77b68dae": "devDivRate()", +"77b71df0": "stake(int256)", +"77b74692": "setKYCAddress()", +"77b76ec3": "checkBalance(address,address)", +"77b77a4f": "PlatoPresale()", +"77b7b5f3": "returnCreator(uint256)", +"77b92c07": "Approve(uint256)", +"77bad015": "GetMyEgg()", +"77bb09eb": "addSweeper(address,address)", +"77bb5e34": "ChillCoin()", +"77bbc957": "returnReclaimed(uint256,address)", +"77bbf28a": "createDividend(uint256,uint256,address,uint256)", +"77bc222c": "_eraseSingleNode(bytes32)", +"77bc48f8": "view_owner()", +"77bc57e7": "Agencies()", +"77bd1bfe": "ITT(uint256,uint8,string,string)", +"77bd35fc": "claimPremium(address,uint256)", +"77bd775c": "setMinPurchaseAmt(uint256)", +"77bdab19": "OtoniToken()", +"77bdbccc": "registerCertificate(address)", +"77bde142": "setTargetBondingRate(uint256)", +"77bdfcfa": "cards_metal_check(address)", +"77bf8b91": "CelebSold(uint256,uint256,uint256,string,address,address)", +"77bf8e6f": "myShare()", +"77bf96d4": "claimProfitEquivalent()", +"77bf9776": "stopUpdate()", +"77bffc9a": "getRemainingStars(address)", +"77c07c19": "storageControllerAddress()", +"77c0891f": "setVotingParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"77c13323": "closing_requests(bytes32)", +"77c2f72e": "LightenToken()", +"77c2fb9b": "updateMokenName(uint256,string)", +"77c34ee7": "tokensRemainingIco()", +"77c427b7": "TemperatureMeasurementB(address,int8,int8)", +"77c4fd07": "availableEarlyPlayerShares()", +"77c626e3": "getStageAvailableTokens(uint256)", +"77c68aa7": "IGTMYR()", +"77c71396": "charityBeneficiary()", +"77c76449": "AVAILABLE_IN_MAIN()", +"77c78df9": "getCurrentLevel()", +"77c82476": "viewPetition(uint256)", +"77c846af": "changeUsername(string)", +"77c8d5a0": "computeTimeBonus()", +"77c90dd4": "VaporCoin()", +"77c93662": "sponsor()", +"77c9dd4b": "iOwner()", +"77ca4d11": "loadVotesForParticipant(bytes32,bytes32,uint8)", +"77caa61a": "updateExchangeRates()", +"77caa7e6": "endICOp2()", +"77caf711": "transferValue(uint256)", +"77cb6b7f": "AbccCoinToken()", +"77cb8edd": "_robot()", +"77cc437c": "institutionWallet()", +"77cdd2e5": "icoBtc()", +"77ce4fd1": "changeBlocksToExpire(uint256)", +"77ce52f8": "totalInfo()", +"77ce9bdd": "createPersonalDepositAddress(bytes32)", +"77cebd89": "isAllowedToBuy(bytes32)", +"77ceded8": "mintGrey(int256,address,uint256)", +"77cf0369": "totalPreICOavailibleWithBonus()", +"77cfe1c1": "isValid(string,address,uint256)", +"77cff22d": "init(address,address,uint256,uint256)", +"77d1f95d": "AntCoin()", +"77d223b2": "setLowestClaim(uint256,uint256)", +"77d2f203": "neg(uint256)", +"77d317d0": "destroy(uint256,string)", +"77d32e94": "ecrecovery(bytes32,bytes)", +"77d3550b": "commissionPercent()", +"77d447d6": "ContractorManagerSet(address)", +"77d4c48b": "arr(address)", +"77d4e5bc": "secondTimeLine()", +"77d555b7": "RateSetterChanged(address,address)", +"77d55755": "getMiningReward(bytes32)", +"77d56a04": "getReserveBalances()", +"77d58f21": "_safeContract(address,address,address,uint256,bytes)", +"77d630ae": "activationFee()", +"77d6a880": "saleOrNot()", +"77d6cfeb": "setGoalReached()", +"77d70b1f": "jackpots()", +"77d79d10": "getGame(uint8)", +"77d821a2": "testOnlyMultisigCanDeployANT()", +"77d83b81": "confirmGetFreeQuest(address)", +"77d89406": "bankerFeeDataRecord(address,uint256,uint256)", +"77d8ffc0": "getTokensFromBuy(address)", +"77d99ef5": "createBattleboard(uint256,uint8)", +"77d9d1fb": "maxHEXCap()", +"77d9e5fd": "isElectionValid(uint256,uint256)", +"77da0add": "seeAsset(uint256)", +"77dac983": "abandonEscrowService(uint256)", +"77daeb80": "addDeal(address,address,address,uint256,uint256,uint256,uint256,string,uint256,uint256,bool)", +"77db5206": "checkStatus(address,uint256)", +"77dbbd76": "transferFrom(address,uint256,uint256)", +"77dc0413": "small_payout(uint256)", +"77dc657c": "checkPassword(bytes)", +"77dc6ac7": "tokensSelling()", +"77dcb4f9": "doPresaleMinting(address,uint256)", +"77dcba6d": "writeConversion(string,address,uint256,uint256)", +"77dd3323": "setts50(uint256,address)", +"77dd8ea7": "ethFnkRate1()", +"77df3013": "calculatePurchaseAndBonuses(address,uint256)", +"77dfec3c": "exchangeRateTimestamp()", +"77e13c10": "playerMakeBet(uint256,uint256,bytes32,uint8,bytes32,bytes32)", +"77e17039": "startSettlement()", +"77e17191": "COIN_SUPPLY_MARKETING_TOTAL()", +"77e19824": "numSubmissions()", +"77e26762": "getErbutongHao(uint256)", +"77e2965b": "updateTokenAge(address,address)", +"77e2a6ed": "openGiveAway()", +"77e2e5ce": "ICO_setParameters(address,uint256,uint256,uint256,uint256,address,uint256)", +"77e303d2": "_Deposit(bytes32,uint256,uint256)", +"77e49660": "addAddressAliasUnsafe(address,address)", +"77e4fb04": "testFailNotEnoughValue()", +"77e5bf84": "getTxGasprice()", +"77e5d8f8": "advisersUnvested()", +"77e5f6d0": "setGizerItemsContract(address)", +"77e60f42": "marginForMajority()", +"77e6bb15": "getCurrentBonusPercent()", +"77e71ee5": "getForkEndTime()", +"77e75b07": "mintAndAllocateZCO(address,uint256)", +"77e7645b": "CoinSaleActive()", +"77e7ff41": "kickTheCoin()", +"77e8a52e": "SEARCH()", +"77e91f26": "getAyantDroitEconomique_Compte_10()", +"77ea8c72": "RGLSToken()", +"77eaa420": "_clearAuthorization(address,address)", +"77eab3e3": "changeMinimumAmount(uint256)", +"77eb4c50": "hasSponsor(uint32)", +"77eb74a1": "PassportInterfaceID()", +"77ec0feb": "dividendPerToken()", +"77ee311c": "totalMember()", +"77eefa5a": "pullBack(address,address,uint256)", +"77ef2c91": "whitePaperHash()", +"77ef9581": "Registry(address)", +"77f051c3": "AcceptsToken3D(address)", +"77f122bd": "setBlockValueBalance(uint256)", +"77f172b6": "_wager(uint256)", +"77f18090": "Citizen()", +"77f18ed3": "isImmortal()", +"77f25566": "setOne(uint256)", +"77f27251": "paybackDelta()", +"77f2d0b0": "partnerInfo_for_Owner(address)", +"77f325df": "submitAnswer(bytes32,bytes32,uint256)", +"77f3293a": "endPreICO()", +"77f37cd1": "luckyBonus(uint256)", +"77f38024": "BountyPart()", +"77f3c0cd": "InvokeTransfer(address,uint256[],uint256)", +"77f3e3d1": "Bounty_Supply()", +"77f3f782": "UserBalances(address)", +"77f41164": "stageTwoClosed()", +"77f46346": "CheckIfIsAllowed(address)", +"77f48f94": "spin(bytes32)", +"77f50f97": "claimAdmin()", +"77f51246": "tokenIsLocked()", +"77f53095": "createBasicToken(string,string,uint256,string)", +"77f54a82": "setICOParams(uint256,uint32,uint32,uint256,uint256,bool)", +"77f6f7e8": "YoloToken()", +"77f74b6b": "getTimestamp(uint16,uint8,uint8,uint8,uint8,uint8)", +"77f83bce": "PruebaCoin()", +"77f8afc3": "FixSale(uint256)", +"77f929fb": "DeveloperCoin()", +"77f98616": "getTotalProduct()", +"77f9bc13": "getVendorApplicationStatusTrack(string,uint256)", +"77f9c101": "testDeployNewTokenWithTheTestContractAsOwner()", +"77f9c862": "GetSellOrderDetails(address)", +"77f9db33": "disableTokenTransfers()", +"77fa3d32": "addAuction(uint32,uint256,uint256,uint8,uint8)", +"77fa4c21": "getRewardPot()", +"77faba66": "setRewardPercentageK(uint256)", +"77faffa0": "nextround()", +"77fb6269": "migrateData(address,uint256,uint8)", +"77fbe611": "forTeamETH()", +"77fc35e5": "_burn(string)", +"77fcb91d": "forward(address,bool)", +"77fcbebe": "TokenLimitReached(uint256,uint256)", +"77fcc493": "TOKEN_MIN_PRICE_THRESHOLD()", +"77fcce68": "setSignatureValidatorApproval(address,bool)", +"77fd347a": "makePredictions(int16,string)", +"77fe2a0d": "unfrozePerDay()", +"77fe38a4": "transferToICAPWithReference(bytes32,uint256,string)", +"77fed1c7": "addOverview(uint256,string,string)", +"77ff24f4": "test0()", +"77ffd2e8": "setCurrencyExchangeRate(uint256,uint256,uint8)", +"780004ac": "systemFreeze(uint256,uint256)", +"7800313f": "getCurrentTokensByType(uint32)", +"7800a9f6": "getP3DInfo()", +"78013292": "optionAddress()", +"78018581": "Allysian()", +"7801fc3e": "totalReceivedEth()", +"780211a2": "refundOrder(address,address,address,bytes32,address,address)", +"78021e7c": "ownersOfToken(uint256)", +"780249cd": "DC()", +"7802857a": "BONUS_TIER_8_LIMIT()", +"7802cbaf": "addTokenOwnerReward(uint256)", +"7802f4e4": "nada(uint256)", +"78030b83": "makeWildCardToken(uint256)", +"78044965": "setACLRole8972381298910001230(address)", +"78044ba5": "transferToBuyer(address,uint256,address)", +"7804a5dc": "canCreate(address)", +"7805862f": "Unpause()", +"7805a548": "_createItem(uint256,uint256,uint256,uint256,address)", +"7805dd1c": "_totalUsersBets()", +"7807e826": "calculateWeiNeeded(address,uint256)", +"78080c9d": "rateStage1()", +"7808dc69": "createSale(uint256,uint256,address,address,address)", +"780900dc": "create(uint256)", +"7809231c": "DistributeAirdrop(address,uint256)", +"7809dd64": "_receiveRefund()", +"780a4d74": "RecipientUpdated(address,address,address)", +"780aa037": "receiveTokenFromContract(uint256)", +"780ae915": "completeMigration(address,uint256)", +"780aee73": "newGame(string,bytes32)", +"780bbe60": "createChamp(address)", +"780bd739": "giveOut(address[])", +"780be5be": "AggiungiNegoziante(address)", +"780bfed0": "addPermission(bytes4,string,string,string)", +"780c4a73": "addCounter(address,uint32)", +"780c5316": "payMinAuctionEther()", +"780c5689": "writes(bytes32,address)", +"780cbf65": "_queryCallback(uint256,bytes)", +"780d2328": "recordVisit(address,string)", +"780e4b96": "setConsolationRewardsClaimPercent(uint256)", +"780f4987": "systemMessage(string)", +"780ff8d1": "viewLatestErc20TransactionRequest()", +"78108368": "atxRate()", +"78121b60": "KeyedCollection()", +"781224f4": "setVendorWallet(address)", +"78122f3a": "fail(string)", +"78127ee7": "GOLDBARToken()", +"781327de": "createStrategy(string,string,string,address[],uint256[],bytes32)", +"78152bbe": "setPresaleStart(uint256)", +"78155bf4": "PaymentCompleted(address,uint256,uint256)", +"78160d6b": "numChipsClaimed()", +"78166097": "isValidCustomer(address)", +"7817364d": "ChillTalk()", +"7817a60f": "acceptMember(address,string)", +"7817abee": "getOwnerRatingTuple()", +"7817eedd": "rawOwnerOf(bytes32)", +"78186f51": "etherPriceInDollarOut()", +"7818e9ef": "opencode(bytes32)", +"7819d30d": "updateNameResolver(string,address)", +"781a2cca": "Pay(uint256)", +"781a4a74": "getTokensIcoSold()", +"781c0db4": "finishFreeGet()", +"781c4dad": "tierNo()", +"781cc3d3": "cancelAction(bytes32)", +"781cd99d": "START_TIMESTAMP()", +"781db835": "_buyTokens(address,uint256)", +"781e48e4": "MYCareCoin()", +"781e9892": "cumulativeRatios()", +"781f5a83": "registerIdentity(address,address)", +"782037dc": "reserveTeamRecipient()", +"78205f67": "testThrowTransferEnableNotTransferable()", +"7820cd94": "flexibleRewardLevel(uint256)", +"7821a514": "addReserves(uint256)", +"7822b902": "setSaleAmountCap(uint256)", +"7822ed49": "bankAddress()", +"78231978": "totalSaleSupply()", +"782378d1": "MIC(uint256,string,uint8,string)", +"78238cf0": "setCmd_control(uint256)", +"7824407f": "tokenSupply()", +"78248880": "decreasePaymentsBalance(address,address,uint256)", +"7825396b": "setPrices(uint16[])", +"78258c41": "ZXToken()", +"78261878": "saleCompleted()", +"78263edf": "changeMaturity(uint256)", +"7826bbc3": "fstPrivateSalePortionDenominator()", +"7826bfa8": "ethereumLottery()", +"7826f28f": "S1()", +"7827b226": "froze_contract()", +"782841cd": "changeMintingState()", +"78296854": "origMktValue()", +"782a0170": "etherPriceInUSD()", +"782a2737": "vestingMap(address)", +"782addbd": "isInvulnerableByArea(uint256)", +"782b2340": "getStartIcoTimestamp()", +"782b3602": "taker()", +"782b9d50": "setCitizenAddress(address,address)", +"782c6ef8": "refundSender(address,uint256,uint256)", +"782c9689": "DeliverToClaimers(address[],uint256[])", +"782ce79c": "burnClosedToken(bytes32)", +"782da1ea": "transferFromInternal(address,address,uint256,bytes)", +"782e1e6c": "tokenTarget()", +"782e34c9": "ownerSafeWithdrawal()", +"782ec023": "transferMultiAddressFrom(address,address[],uint256[])", +"782f08ae": "setUri(uint256,string)", +"782fb5d4": "getVoteCounts(bytes32)", +"7830b7f8": "PowerNetCoin()", +"783110dc": "increaseStep()", +"78312435": "updateIssuer(address)", +"78321efb": "pushElement(uint256)", +"78329d61": "processPurchase(address,address,uint256,uint256)", +"7832bbf7": "temporaryEscapeHatch(address,uint256,bytes)", +"78330101": "ESlotsICOTokenDeployed(address)", +"783370b5": "setEditionLimits(uint256,uint8,uint8,uint8)", +"7834a504": "buyCoin(address)", +"78351502": "hasPastFreezTime()", +"78357e53": "Manager()", +"78367e46": "enterSmall()", +"783680a7": "ico2Min()", +"78375f14": "requireisfine(uint256)", +"78375f61": "BetTest111()", +"7837848c": "expire(bool)", +"7837e170": "lockBalance(address,uint256)", +"7838415b": "MeetOneToken()", +"783870eb": "rubusBlackAddress()", +"78388eb6": "allocationsOverTime(uint256)", +"78393237": "MAT_PARTNERS_SUPPLY_LIMIT()", +"783a2cca": "approveWithdrawal(address,uint256,bytes32,bytes32,uint256)", +"783ac3ee": "offThreshold()", +"783b4569": "rawRegister(bytes32)", +"783b7b1e": "sendJackpot(address)", +"783c2088": "lookupRegName(address)", +"783c8db0": "minimumFundingAmount()", +"783cc9dc": "CNNToken()", +"783ce458": "expmod(uint256,uint256,uint256)", +"783d5dec": "_limitTeamWithdraw(uint256,uint256,uint256,uint256,uint256)", +"783ddace": "mintAdvisersTokens(address,uint256)", +"783e7a06": "removeVerificatorAddress(address)", +"783f28e6": "adminUpdMinSign(uint256,uint256)", +"783f6af5": "people()", +"783f7b98": "setEtherQuota(uint256)", +"78405234": "indexOf(uint8[],uint8,bool)", +"7840c781": "_setTokenOwner(uint256,address)", +"78415956": "after_test_2_method()", +"7841a530": "set_tokens_sold(uint256)", +"7841b780": "isPaymentSettled(uint256)", +"78420d4a": "validateLock()", +"784279d8": "setSupportedTokens(address,bool)", +"7842a3a4": "payReward()", +"7842aded": "getLotteryMoney()", +"7842dca8": "allTime()", +"7843184b": "setMultiBonusTokens(address[],uint256[],uint256)", +"78446bc1": "timeLockPeriod()", +"7844ce81": "hodling()", +"78451d64": "SplitPayment(address[],uint256[])", +"78452d65": "CATContract(address,string)", +"784547a7": "isConfirmed(uint256)", +"7845b86e": "fundingRatePredictionBonusClaimWindow()", +"7845cbef": "GOLDT()", +"7845d5aa": "UpgradeAgentSet(address)", +"7845d76b": "tune(uint256,uint256,uint256,uint256)", +"7846188d": "_getCrabTotalStats(uint256)", +"7846c3c8": "minimumContributionPresalePhase2()", +"784712f2": "pendingPayouts(address)", +"78473485": "getSellDemand(uint256)", +"7847352a": "setBettingCondition(uint256,uint256)", +"7848033e": "distributeCHENDE(address[])", +"784813e0": "lookupBet(uint256,uint256)", +"78483632": "secondsaleOpen()", +"78489ed6": "compareIntValue(bytes32,int256,bytes1)", +"78498818": "getTokensBought()", +"784a3e40": "bountiesIssued()", +"784aa7d2": "setTitulaire_Compte_5(uint256)", +"784ba0f5": "yearteam_trade_date()", +"784d17f9": "DarkrenlandToken()", +"784f47ff": "reduceCredits(string,uint256,uint8,address)", +"784f6654": "activateMe(string)", +"784fcb94": "MARXToken()", +"784fdf26": "totalExternalSales()", +"7850a6b2": "transferDoftManagment(address)", +"7850b72f": "LSDCrowdsale()", +"7850c2ac": "holdersAllocatedAmount()", +"7850f0a4": "setPromotedGame(uint256,bool,string)", +"785105f6": "savedBalance()", +"78517536": "updateBlockNumberOfGladiatorBattle(uint256)", +"7851bcbd": "safePerc(uint256,uint256)", +"78524b2e": "halveMinQuorum()", +"785250da": "kyberNetworkProxyContract()", +"78533046": "getMetaInfo(uint256)", +"78533e90": "setTokenMinter(address)", +"78537808": "union(address[],address[])", +"7853c945": "bitcoinKey()", +"7854216b": "autoAirdropAmount()", +"78547d5f": "processPurchase(address,uint256)", +"7854b798": "addauction(uint256,uint256,uint256,uint256,uint256,string,string)", +"78566845": "allocateTicket(uint256,address,string)", +"78572816": "addAffiliate(address,bytes32)", +"78579d7c": "addEntry(address,uint256,bool,uint256,uint256)", +"7857f6e7": "setReverseRate(address[],int16)", +"7857fcda": "assertEq3(bytes3,bytes3)", +"78581a46": "getBatchCreateDrawingsAddress()", +"785826a7": "sendReferrer(uint256)", +"78583275": "updateMinSale(uint256)", +"7858651e": "getConnection(address,address,bytes32)", +"7858eb7b": "setScore(string)", +"7858f93a": "addressFundTeam()", +"78591e1d": "findAllCliWithPendingTask()", +"7859f9e6": "purchaseCarAdv(uint256,string,string)", +"785b1eb4": "PayEIF()", +"785b804a": "transferEtherInitiation(address,uint256)", +"785bc758": "setBaseStorage(bytes4,uint256,string)", +"785cc997": "mint(uint256,string,bytes)", +"785ce7ca": "walletBlockOf(address)", +"785da817": "unterminateFunding()", +"785e64a1": "whatIsMocount()", +"785e9e86": "erc20()", +"785fa627": "prizeAmount()", +"785fb499": "burnFoundersTokens(uint256,uint256)", +"78607c33": "FundWithdrawed(uint256)", +"7860ed56": "secondItemWrong()", +"78629c0f": "lockAddressToken(address)", +"7862affa": "calculateTimeBonus(uint256)", +"78635049": "MarzCoin()", +"786420d1": "getEstate(uint256)", +"786431c1": "MAX_OPS()", +"78644a4a": "userOfferAcceptElement(uint256,uint256,uint256)", +"7865f463": "mmul(uint128,uint128)", +"7865f611": "LogBet(address,bool,uint256,uint256,bool)", +"7866ed6e": "getBloodline(uint256)", +"78670289": "MAX_END_BLOCK_NUMBER()", +"7867060d": "approveComponent(string)", +"78683654": "convertMainchainGPX(string,string)", +"7868c89d": "getRateByStage(uint256)", +"786926fa": "existenceBalanceOf(address)", +"78698e45": "_updatePrices(uint256,uint256,uint16,uint256[],uint256[])", +"786ab4b6": "addAccountWithBalance(uint16)", +"786b844b": "closeGame()", +"786bfd76": "SimpleConstructorString(string,string)", +"786c5065": "closeDistribution()", +"786caff8": "claimerOfSocialIdentity(uint256,uint256)", +"786cf3ee": "DurioTEST()", +"786d02d0": "getHoldingsCount()", +"786d8a25": "test_falseEqNoLog()", +"786e06f3": "sendETHtoBoard(uint256)", +"786e4799": "removeRatePlan(uint256,uint256)", +"786ecf16": "doRestart()", +"786edae0": "registerEndpoint(string,int256)", +"786ef70a": "earnedEthWei()", +"786fb317": "requestOutput(bytes4)", +"787089bd": "PandoraToken(uint256,string,string)", +"787091e9": "EABToken(string,string)", +"7870f889": "MyWhiteList()", +"78710d37": "seven()", +"78710f72": "canBuyTokens()", +"787112be": "set_saleAgent(address)", +"78719b15": "likeCelebrity(uint256[],uint256[],uint256)", +"78719ee8": "DAppNodePackageDirectory(address,address)", +"7871a9ff": "Crypterium()", +"78720063": "EligmaSupplyContract(address,address)", +"7872e3da": "disbursementDuration()", +"78730d65": "nextLotteryTTMTokenId9()", +"7873447b": "getFrozenAccountList()", +"7873832e": "SingularDTVLaunch(address,address,address,uint256,uint256,uint256,uint256,uint256)", +"787394fc": "setJackpotIncrement(uint256)", +"7873bc61": "contestant(uint256)", +"787414ac": "ABC123ABC()", +"78744754": "getClassName(uint32)", +"7874b66f": "ReferralActivated(address)", +"7874d32c": "unblockTokenTime()", +"78753818": "MAIN_SALE_VALUE_CAP()", +"7875bbe2": "DividendPaid(address,uint256,uint256,uint256)", +"7875d41b": "takeBet(uint256,uint8)", +"78761590": "findTargetCell(uint256,uint256)", +"7877f72d": "getHours(uint256)", +"78782027": "enter(string,address)", +"7878903c": "hasPreSaleEnded()", +"7878b66a": "isPauseSave()", +"7879e19e": "CollectAllFees()", +"787a08a6": "cooldown()", +"787addc3": "FideliumToken(uint256,string,string)", +"787b586f": "setMediumProbability(uint8)", +"787b6725": "removeProduct(address)", +"787bd6f9": "setDistribution(uint256[5])", +"787c17d9": "privateSell1Token()", +"787c23e0": "whitelistWallet(address)", +"787ccb61": "replenishPool(uint256)", +"787d024d": "mintLzToken(address,address)", +"787d64e4": "m_multiOwnedRequired()", +"787dbaf1": "feedTweet(uint256,uint256,string)", +"787dc68f": "createPromoAthlete(address,string,address,uint256,uint256,uint256)", +"787dc9f1": "getFee(bytes8,uint256)", +"787e9137": "collectedTokens()", +"787ed1f8": "sayOwnerHello(string)", +"787ed54f": "payDividendsManually()", +"787eda49": "assertEq20(bytes20,bytes20,bytes32)", +"787f9710": "namespaceTaken(bytes32)", +"787f9cc3": "ManualPriceChange(uint256,uint256)", +"787fd167": "GameJoined(address,address,uint256,uint256,uint8,uint256)", +"788023ff": "changeShareable(address[],uint256)", +"78809c52": "ratePerEthPhase1()", +"788102ff": "reservedFundsParking(address)", +"788222ae": "tokenEmail()", +"78831239": "deleteTopic(bytes15)", +"78831b36": "setDividendsWallet(address)", +"7883985b": "addrExecutor()", +"78843a95": "isTier1(address)", +"7884e787": "getDni()", +"78862e69": "deathData_f9()", +"788649ea": "unfreezeAccount(address)", +"7886b526": "checkRecords(uint256[])", +"78879d74": "betAmountAfterRakeHasBeenWithdrawnAndProcessed(uint256)", +"78880f4a": "population()", +"788873ea": "logFeeWindowTransferred(address,address,address,uint256)", +"7888e957": "storageToUint(int256,string)", +"788a8c8b": "ARBI()", +"788ac4a8": "Petrocoin()", +"788acd7e": "issueBounty(address,uint256,string,uint256,address,bool,address)", +"788b2ba2": "Stock(string,string,uint256,string,uint256)", +"788bb8df": "EUR_Omnidollar()", +"788bc78c": "setVersion(string)", +"788bc8c0": "tokensToUsd(uint256,uint8)", +"788c26b4": "createNewVesting(address,uint256,uint256,uint256,string,uint256,bool)", +"788c4023": "isWalletLocked_Receive(address)", +"788c5999": "mintMode()", +"788ce6f2": "icoAddress()", +"788d135b": "GoForLaunch()", +"788d1fa6": "setInt8(int8,int8)", +"788d3851": "voteOpen()", +"788d5881": "licenseTermsHasMinCost(bytes32,bytes32)", +"788e0760": "shpExchangeRate()", +"788e26e7": "sponsorDeposit()", +"788e2c3c": "getRoundRemaining()", +"788e31bf": "addBoolSetting(string,bool,address,address,string)", +"788e72a5": "purchaseProduct(bytes32,uint256)", +"788e7909": "testTransferFromDoesNotAllowTransferOfMoreThanExistingTokensByDelegate()", +"788efb9e": "get_taker_fee()", +"788fa540": "CANONICAL_PRICEFEED()", +"78912dee": "FINTRUX_RESERVE_FTX()", +"78912eae": "sendTransaction(address,uint256,uint256,string,uint256,bytes)", +"7891663d": "HDXToken()", +"78918e89": "deleteCell(address)", +"7892cabf": "mixGenes(uint256[2],uint256[2],uint256,uint256,uint256)", +"7892d29e": "calcTradeFee(uint256,uint256)", +"7892fd29": "ROUND_TIME()", +"7893d936": "associate(bytes32,bytes32)", +"7893f4c2": "DBToken()", +"7894aafa": "createDivCard(string,uint256,uint256)", +"7894d1d0": "makeConcept(address[],uint256[],uint256,bytes,address)", +"789533e9": "getTeamPrice(uint256)", +"78954b3b": "previousContract()", +"7895dd21": "claimTokensFromSeveralAuctionsAsSeller(address[],address[],uint256[],address)", +"7895f853": "isFundLocked()", +"78960df6": "policyCandyBalance()", +"7896904e": "DaaToken(string,uint8,string,uint256)", +"7896cd95": "exchangeEnableCost()", +"789770f4": "ethToToken()", +"7898278f": "emergencyFreezeAllAccounts(bool)", +"78984793": "setLimit(address[],uint256)", +"7898acef": "usernameOf(address)", +"7898b917": "getKey(address,string)", +"78990684": "closeAllSales()", +"789a12fd": "getRafflePlayers(uint256)", +"789b2e6c": "payDay()", +"789b4690": "diviRate()", +"789c617c": "intStorage(bytes32)", +"789c6740": "testEmptyCart()", +"789cf5e2": "auctionSumPlat()", +"789dfc91": "SafeNetToken(uint256)", +"789e4e53": "createContractCollection(string)", +"789ea7dc": "becomeBatlord()", +"789fdcb6": "DoMusicPayout(uint256)", +"78a17883": "_batch4_icosaleEndTimestamp()", +"78a1b7c2": "pct(uint256,uint256)", +"78a2157a": "erc20ECT(uint8)", +"78a21a20": "_setStake(address,uint96,uint128)", +"78a29c66": "votesAvailable(address)", +"78a2e101": "TOKENS_FOR_PRESALE()", +"78a32742": "Pinged(address,uint256)", +"78a5b1b0": "blockHeaders(bytes32)", +"78a5f0ca": "withdraw_dao_fund(address)", +"78a62e9d": "isAppCode(uint32)", +"78a6c6d2": "createBreedingAuction(uint40,uint128,uint128,uint40)", +"78a70de5": "safeMathDiv(uint256,uint256)", +"78a71d78": "sendMail(address[],uint256,bytes32,uint256,bytes32,uint256)", +"78a72e0d": "encodeTransfer(uint96,address)", +"78a77b84": "closeRaffle()", +"78a7b804": "setKittyCoreAddress(address)", +"78a7e17d": "convert10MTI()", +"78a83232": "violaToken()", +"78a89567": "getTokenCount()", +"78a8b1fb": "ZTKGamers()", +"78a90a59": "presaleStop_13_December()", +"78a9e88a": "parseBitcoinComFeed(string)", +"78a9eeed": "listAll()", +"78aa08ed": "lotteryFee()", +"78aa34bf": "test_6_assertGasUsage2000Boards()", +"78abafaf": "limitAmount()", +"78abf854": "_budgetEndAndOfficalVotingTime(uint256)", +"78abfbeb": "finalization()", +"78ac19f9": "GexPayTest2Token()", +"78ad76e6": "DeBiToken()", +"78adf55e": "PreICOPart()", +"78ae12d8": "PRE_SALE_1000_ETH()", +"78ae88d1": "newDeal(uint256,uint256,uint256,uint256,uint256)", +"78af5058": "picosSold()", +"78af63ac": "btcRaised()", +"78afda07": "firstContractAddress()", +"78b04df0": "Play(address,uint256,uint256,uint256,uint256)", +"78b0cb23": "addGpgKey(string)", +"78b14f0a": "addCharity(address)", +"78b150bd": "contractUpgradable()", +"78b17bd1": "supercustomhash(bytes)", +"78b17ccf": "CANCELLATION_FEE()", +"78b226c4": "updateMemberAddress(address,address)", +"78b27221": "mintFungible(uint256,address[],uint256[])", +"78b290b5": "OPERATION_HOLDER()", +"78b29105": "forceBuy(address,address)", +"78b5a576": "updateDexterity(uint256,uint8)", +"78b6e20c": "untrackTreasuryToken(uint256)", +"78b71079": "hasEnoughGrantAmount(address,uint256)", +"78b83360": "freezingBalanceInfoOf(address,uint256)", +"78b8a6c2": "issueTokensInternal(address,uint256)", +"78b8c58c": "getTokenInfoNumToknes()", +"78b99c24": "pricingStrategy()", +"78ba24f2": "addContractBalance(uint256,uint256)", +"78bb5164": "whitelistLength()", +"78bb9e54": "niceguy4()", +"78bba530": "communityHolder()", +"78bc254b": "setPreIcoParameters(uint256,uint256,uint256,uint256)", +"78bc6460": "getCallGasPrice(bytes32)", +"78bca3e7": "NeuralNetwork()", +"78bcd39a": "accountLockCheck(bytes32)", +"78bd7935": "getAuction(uint256)", +"78be0496": "MTF(uint256,uint256)", +"78beda71": "createPromoMineral(bytes32,address,uint256,uint256)", +"78bee6b4": "transferToAnotherAddr(address,uint256,bytes32)", +"78bf2b53": "setToken(address,uint256)", +"78c01961": "EmitEntityIds(address[])", +"78c24e9b": "adminSetFeeDialNumber(uint256)", +"78c2c849": "burnUnicorns()", +"78c37a45": "amendCount()", +"78c38a79": "setOwnedArea(address,uint256)", +"78c3b3a5": "futureRoundWallet()", +"78c3df77": "addProfitPerShare(uint256,address)", +"78c3e2ec": "createTask(address,string,string,uint256)", +"78c3e7a4": "generateCardsFromClaimForOpponent(address,address)", +"78c3f298": "pvtTokens()", +"78c53533": "getPoolOwner()", +"78c5e86f": "crowdsaleClosedTime()", +"78c62ca4": "changeDestinationAddress(address)", +"78c68573": "getLineUpEnable_miner(address)", +"78c6d437": "founders_addr()", +"78c70a4e": "allowAddressToSendMoney(address,address)", +"78c7524d": "versionIndex(bytes32,bytes32,address)", +"78c83f71": "rebalance_insert(uint256)", +"78c8cda7": "removeWhitelist(address)", +"78c91d29": "getCountCanAdd()", +"78c9f9cf": "computeEarningsAmount(uint256,uint256,uint256,uint256,uint256)", +"78ca923d": "nearestKnownBlock()", +"78caa728": "getLLV_edit_12()", +"78cac18d": "updateInfo(address,address,uint256)", +"78cb2f56": "DENtoken()", +"78cc180b": "bpSaleIssue(address,uint256)", +"78ce14dd": "CryptotalksToken()", +"78ce341a": "enablePayable()", +"78cf19e9": "reserveTokens(address,uint256)", +"78cfccb5": "REDDCCOIN()", +"78cffc09": "set_location(uint256)", +"78d012a6": "roundIn()", +"78d0a415": "getDthTeller(address)", +"78d18198": "getNextSnapshotBalance(address)", +"78d18bef": "withdrawalsInitiated()", +"78d19e42": "MintableToken(uint256,string,uint8,string)", +"78d22ab0": "getStageMinWeiAmount(uint256)", +"78d34986": "updateKittensRemainingForSale()", +"78d3633b": "illiquidBalance(address)", +"78d38d1a": "SenegalvsColombia()", +"78d45eb6": "checkAccess(address,bytes1)", +"78d46c3f": "listSpriteForSale(uint256,uint256)", +"78d4e808": "fetchCancelledOrdersForPayerByAdmin(address)", +"78d55ac1": "MRCCToken(uint256,string,string)", +"78d5e123": "unstakeTokensManually(address)", +"78d63908": "doBuy(address,uint256,bool)", +"78d63c59": "AMFBToken()", +"78d6525f": "test_validEmptyEqEmpty()", +"78d6fd25": "getRecTransactions()", +"78d74f60": "LyCI(address,string,uint8,string,string)", +"78d7ccea": "ComputeEggsSinceLastHatch(address)", +"78d8615f": "addEvent(uint256,string,bytes32,bytes32,string,bytes32)", +"78d8e17b": "totalGenesisTokens()", +"78d8fed8": "setUnlock(bool)", +"78d9472f": "setDefendBoostMultiplier(uint256)", +"78d9b048": "teamPoolInstant()", +"78d9c387": "newContest(uint32,uint256,uint256,uint32,uint256,uint32)", +"78da32f2": "setUintF1F2F3(uint256,uint256,uint256)", +"78da7ba1": "presaleEndTimestamp()", +"78dbce5f": "GetStakingNow()", +"78dbfd91": "createBuyOrder(address,uint256,uint256,uint256)", +"78dc6b7e": "transferring(address,address,uint256)", +"78dc7017": "getYellowCards()", +"78dc70c0": "feePeriodStartTime()", +"78dda193": "getCarState()", +"78df0fe1": "getProfits(address)", +"78dfd3a9": "getNumParticipants(uint256)", +"78e03373": "operationalAddress()", +"78e0a0bd": "flashSale(uint256,uint256,uint256)", +"78e24ab5": "SALE1_RATE()", +"78e2df0e": "soft_cap()", +"78e4ca77": "Connect4eth(address,address,uint256)", +"78e4d750": "PenPalToken()", +"78e5d841": "HaltableToken(address)", +"78e619df": "DOOMCOIN()", +"78e65d2e": "bridgeValidatorsImplementation()", +"78e7058e": "advisorsTokensHolder()", +"78e77477": "releasedAdvisorsTokens()", +"78e7e5ea": "LAND_ADDRESS()", +"78e80b39": "UserGetPrize()", +"78e8356c": "removeBet(string,uint256)", +"78e8488d": "gameGiftSentAmount()", +"78e870cd": "balances_available_for_crowdsale()", +"78e88c3c": "getMyFee(address)", +"78e89085": "Dispute(uint256)", +"78e8b8fc": "dataSourceCallbackGroup(uint256,uint8,uint8)", +"78e8cab5": "gcpm(uint256)", +"78e90190": "mokenBytes32(uint256)", +"78e95645": "noteChainFee()", +"78e97925": "startTime()", +"78e9f1ba": "minimumBetAmount()", +"78e9f81f": "assignRoleWithExpiration(address,bytes32,address,uint256)", +"78ea787b": "getDefaultAllowance(string)", +"78eb890b": "checkErrors()", +"78eba8fc": "icoCheckup()", +"78ec0adf": "scannedSilverCaps()", +"78ec1eb4": "checkIfEligable(address,address)", +"78ec383a": "MRC()", +"78ec6dbd": "Beth()", +"78ec81a0": "sendEarnings(address)", +"78ec96a0": "GREEN()", +"78eca227": "getBuyOrderInfo(address,address)", +"78ecabe6": "changeAvailableSpend(uint256)", +"78ed2178": "linkFileToTask(address,bytes32)", +"78ed43c1": "administrationContractFrozen()", +"78ed8dfd": "allocateUnsoldTokens()", +"78ed9156": "diary(uint64)", +"78ee6035": "cancelPledgePayment(uint256)", +"78eef9d4": "move_excess_for_bucket(uint256,uint256)", +"78efa1db": "COIN_SUPPLY_ICO_TIER_3()", +"78f0161a": "setGreyGreenPrice(uint8)", +"78f08268": "getUsersCount(address)", +"78f08f2e": "getLineStat(uint256)", +"78f13614": "ATTR_LEASABLE()", +"78f1a5ce": "addTeamAndAdvisoryMembers(address[])", +"78f2144b": "_originalBuyPrice()", +"78f22cc0": "getAuditRegistrar(uint256)", +"78f305c6": "getStartDate()", +"78f55622": "calCurrentVirus(address)", +"78f55de4": "sxpNumber()", +"78f5958f": "setblocksPerMonth(uint256)", +"78f5e0ec": "CampingCoin()", +"78f5e59f": "TOTAL_SUPPLY_VALUE()", +"78f74fbe": "tokenIssuedPrivateIco()", +"78f76779": "batchOrderTrade(uint8[2][],bytes32[4][],uint256[8][],address[6][])", +"78f79187": "DailyAndSnapshotable(uint256)", +"78f7aeee": "tokenAllocated()", +"78f7d9c6": "payBill(uint8,uint256)", +"78fad7bc": "champToken()", +"78faff96": "isSet(address,address)", +"78fbc9ea": "weiToCollect()", +"78fc3cb3": "canTransfer(address)", +"78fc52b3": "processDiceRoll(address,uint256)", +"78fca301": "Menu03(uint256)", +"78fd98d1": "freezeAmount(address,uint256)", +"78fddd69": "MedAIChain(uint256,string,uint8,string)", +"78fe2951": "enableService(uint256)", +"78ff54eb": "updateRestrictedVault(address)", +"7900438b": "registerDevice(bytes32,bytes32,bytes32)", +"79008da5": "addRandomTile(uint16,uint8)", +"790105ff": "withdrawEIP20Token(address)", +"79018524": "Token(uint256,address)", +"79028df3": "GetFirstName(uint256)", +"79032fa7": "storeHorsey(address,uint256,address,bytes32,uint8,uint8)", +"790377dc": "getLastAuditId(address)", +"7903d8c8": "canSend()", +"79049227": "lockupSeconds()", +"7904d388": "ethRec(uint256)", +"7904f688": "distributePrizes(uint16)", +"79053739": "damage(uint8[176],uint8,uint8)", +"790587d1": "updateIpfsGateway(string)", +"79061e96": "withdraw_ether()", +"7906305b": "upgradeTier(string)", +"790683d3": "getTopicByOffset(uint256)", +"79081feb": "getCardLeaseLength(uint8)", +"7908f25c": "thirdTeamWithdrawal()", +"79099e15": "MAX_USD_FUND()", +"7909da6f": "createExchange(uint256,uint256,uint256)", +"7909f569": "gasForFLKD()", +"790a091e": "test_rewardPoolShare_notTranscoder()", +"790b1656": "ThreeEtherFree()", +"790be9b5": "SETC(uint256,string,string)", +"790c33b8": "getReportingTokenOrZeroByPayoutDistributionHash(bytes32)", +"790ca413": "launchTime()", +"790cbfa0": "createMeshPoint(int256,string)", +"790d4e11": "getLosersOnePercent(uint256)", +"790dd0f5": "fuint256(uint256)", +"7910085d": "fipsIsRegistered(bytes20)", +"79103c2e": "RejectedApplication(address,uint256,string)", +"7910830a": "setCrowdSaleStatus(bool)", +"7910867b": "isApproved(uint256)", +"7911d80a": "Presale1Sold()", +"7912b0f1": "HOPEToken()", +"79132085": "APSP()", +"79141f80": "getBetInfo(uint256)", +"791455dd": "addPieceAndHash(string,string,string,address)", +"79147cf0": "_result()", +"79147d07": "UnsoldAllocation(uint256,address,uint256)", +"7914d10f": "setminContribution(uint256)", +"7915785e": "accountsToAllocate()", +"791581c6": "addTime(uint256,uint256)", +"7915c069": "register(string,address,address)", +"7915c9e0": "verifyTransfer(address,address,uint256,bool)", +"79162aeb": "pauseEmergence()", +"79164773": "nextForkBlockNumber()", +"7919233f": "emitWorkOrder(address,uint256)", +"7919792b": "doThrowOnDivByZero()", +"791ac4e5": "_getUtilizationRate(uint256)", +"791af2b6": "dkBB(bytes32)", +"791af8e4": "totalExtraTokens()", +"791b1150": "notify_payment_reject(uint256)", +"791b51f1": "Consulting(address,address)", +"791bbe35": "TheDeadShitCoin()", +"791cbc4f": "stopConvertTokens()", +"791dd41c": "ownerOverride(uint256)", +"791f0333": "equalStrings(string,string)", +"792037e3": "shut(address,bytes32,address)", +"79203dc4": "totalAllocation()", +"7920d804": "getKing()", +"7920f72c": "_tag(int256,string)", +"79214878": "regionExists(uint256)", +"792166b8": "createEscrow(uint256,uint256,address,address)", +"79216aec": "ManagedToken(address,address[])", +"79216f5f": "add_monster(uint16,uint16,uint16)", +"79217982": "preIcoMinInvest()", +"79219a24": "getLockRecordCount()", +"7922841c": "registerAssetHeader(int256,string,string,string,string,string)", +"7923715b": "RPEICO_TOKEN_SUPPLY_LIMIT()", +"79250dcf": "getApprovePreSignedHash(address,address,uint256,uint256,uint256)", +"792544af": "get_DB_info(uint256)", +"79254bb8": "right29(uint256)", +"792651b0": "app_storage()", +"7927448a": "getTicketTime(bytes32)", +"7927bc0c": "list_token_bid(address)", +"79287790": "get_milestones_information(uint256)", +"792a152d": "addRegion(uint16,uint256,string)", +"792ad365": "lastBlock_f15Hash_uint256()", +"792b22c6": "returnCoupon(address[3],bytes32)", +"792b476b": "getPositionCount1(address,address)", +"792c02ea": "stagesLength()", +"792c91c2": "setRecordId(uint256,bytes32)", +"792cb544": "_setCertificateSigner(address,bool)", +"792e1ffc": "authorize(uint8,bytes32,bytes32,address)", +"792e79c5": "stealCardWithTwitterId(uint256)", +"79304063": "depositsSigned(bytes32)", +"7930a433": "withdrawDelta(uint256)", +"7930acd6": "getCCH_edit_27()", +"79318d81": "closeRefunds()", +"7931a765": "Issued(uint32,address)", +"793267f0": "vaildBalanceForTokenCreation(address)", +"79326c01": "isSaleOwner()", +"7932f07f": "getRegionBlockUpdatedAt(uint256)", +"793318eb": "MMMPCoin()", +"79332159": "Bet(address,address,uint256,uint256,uint256)", +"79341ca1": "getRoundAmtPot(uint256)", +"7934b50f": "_lockToken(uint256)", +"7934f4ed": "processPayment(uint256,bytes)", +"7935326b": "preICOTokensAllocated()", +"79362167": "getBillboard(address)", +"79372f9a": "ClaimReward()", +"7937f46d": "setBBO(address)", +"79381c80": "performRefund(bytes32,uint8,uint256,uint256)", +"7938cc42": "allocateProofTokens(uint256)", +"7939a10b": "getSellValue(uint256)", +"793a2cd1": "isPausedICO()", +"793a8c95": "owner_updatePayout(uint256)", +"793c0fd4": "authorizeSpender(address,bool)", +"793ca3fe": "getFirstCycleBlock()", +"793cd71e": "cashOut()", +"793cf430": "option30name()", +"793d424e": "getBLAddress()", +"793d7165": "fSqrt(uint256)", +"793dae12": "acceptSettlement()", +"793e9b0b": "OPTION_POOL_ALLOC()", +"793ec6c2": "turnOffCanUpdateBackWindowAdjustmentRatio()", +"79409b19": "EthToUsd()", +"79412da6": "withdrawalTokens(address,address,uint256)", +"7941a062": "getBlocksRemaining()", +"7941d7bd": "changeTokenOwnerByAdmin(uint256,address)", +"79420fb1": "tierTotal()", +"79428570": "getTeamId(uint256)", +"7943f2ec": "withdrawCoinToOwner(uint256)", +"79444ad3": "handleForTokenId(uint256)", +"7944875b": "StopSale()", +"7944b4b9": "mileStone(address,uint64,uint8)", +"79456cb6": "test_1_method()", +"79459ac3": "buy10(address[],address[],uint256[],bytes,bytes,bytes,bytes,bytes,bytes,bytes,bytes,bytes,bytes)", +"794752c7": "askForgiveness(string)", +"79480a4c": "getOrderValuesFromData(bytes)", +"79480fe3": "nextMintFeeAbs(uint256)", +"79485d41": "DeauthorizeServiceProvider(address,address)", +"7948a9c5": "TokensWithdraw(address,uint256)", +"7948f523": "setAmbiAddress(address,bytes32)", +"79491370": "closeSale(address)", +"79492f30": "allocationFor(uint256)", +"7949859e": "UpdateToeknLimitICO(address,uint256,uint256)", +"794ab0a8": "etherPriceInDollarIn()", +"794b0c62": "DAICO()", +"794b0e6b": "addExperience(address,uint256[],int32[])", +"794c0c68": "stakingEpoch()", +"794cea42": "search(address,address[])", +"794d0d8d": "WithdrawVault(address)", +"794df640": "updateUsdEthRate(uint256)", +"794e9434": "awardWeeklyLottery(address,uint256)", +"794ee205": "createMarriage(bytes32,bytes32,uint256,bytes32,bytes)", +"79501a83": "isBiometricLocked(address)", +"79502c55": "config()", +"7950c5f8": "verifyingKey()", +"7951357e": "Suspended()", +"79515566": "calcAllowedWeisToInvest(uint256)", +"7952a0ed": "MetaProject()", +"79530087": "BirCoin()", +"79538e47": "addVpf(bytes32,uint256,uint256,uint256,uint256,int256[])", +"7953ae77": "MainSaleDeadline()", +"7953e0ab": "dateEcoRelease3()", +"79544754": "getBonus(address,uint256,uint256)", +"79557e4f": "traded_token_balance()", +"7955a65f": "adminWithdraw(address[3],uint256[3],uint8,bytes32,bytes32)", +"7955dd45": "player_withdrawPendingTransactions()", +"795612d6": "buyItem()", +"79564072": "directorLockUntil()", +"7956f46a": "AggiungiProfessore(address)", +"7957170b": "getApproveRecord(uint256)", +"795741c8": "withdrawEscrowFees()", +"79583e22": "buyOrder(address,uint256,uint256)", +"7958533a": "meta(uint256,bytes32)", +"795a16e3": "setRecipient(string)", +"795b0e16": "TransferAllowed()", +"795b5b83": "createSaleCardToPlayer(uint256[],address,address)", +"795b9a6f": "scheduleCall(address,bytes4,uint256,bytes)", +"795bfd7b": "togglePreventDoublePurchases()", +"795c1713": "FCoinToken()", +"795c6437": "isWorkflowState()", +"795da78f": "coinsIssuedCmp()", +"795dbede": "idx()", +"795e09ef": "privilegedAccountsCount()", +"795e4547": "changeContractUpgradability(bool)", +"795ebb68": "setTokensDecimals(uint256)", +"795fcd6e": "RelentlessConscience1Token()", +"795ff8aa": "safeTokenWithdrawal(uint256)", +"7960d19b": "MediatedTransactions_Log(uint256)", +"79618233": "createDividendWithCheckpoint(uint256,uint256,address,uint256,uint256,int256,bytes32)", +"79624add": "MAX_DAILY_SOLO_SPEND()", +"7962525c": "getRoundNumberOfBets(uint256)", +"79630bd8": "rate10()", +"7963b478": "assertEq28(bytes28,bytes28,bytes32)", +"79644576": "newProposal(uint256,address,uint256,string)", +"796485f9": "back_giving(uint256)", +"7964dd2b": "excludeAddressFromStaking(address,bool)", +"7964ea87": "claim(bytes32,uint256,bytes)", +"79655bd0": "getStages()", +"7965bb86": "STQPreICO2(address,address[])", +"79662bd5": "withdraw(string,address,uint256,string)", +"796676be": "urls(uint256)", +"796686a9": "book(uint256[],uint256)", +"7966c431": "subString(string,uint256,uint256)", +"796736f0": "tradeBalances(address,address,uint256,uint256,address,uint256,bytes32)", +"7967a50a": "preSaleEndDate()", +"7968196c": "amountRaisedInUsdCents()", +"79681c94": "buyRoundDataRecord(uint256,uint256)", +"79683e63": "inviteInit(address,address)", +"79687166": "uintToBytesForAddress(uint256)", +"79694f08": "topUpDelegate(address,address,uint32,uint192)", +"796a6ec9": "Credited(address,uint256,uint256)", +"796a8076": "updateAuctioneer(address)", +"796b89b9": "getBlockTimestamp()", +"796c0c78": "allocatedTokens(address,uint256)", +"796c5b08": "getPenaltyFactor(uint256)", +"796c5e5b": "saveHash(bytes8,string)", +"796c8902": "getInvestor()", +"796d67da": "numberOfProposals(bytes32)", +"796d8950": "StromkontoProxy()", +"796dc916": "pauseResumeContract(bool,bytes32)", +"796f6281": "tokenFront()", +"7970785d": "withdraw(address[],uint256[],address[])", +"79710f07": "drainERC20(address)", +"79716e43": "confirmTransaction(bytes32)", +"7972d079": "setMfgValues(string,string,string,string,string,string)", +"79735d54": "hasEnoughStake(address)", +"7973830a": "getMapValue(uint256)", +"7973b370": "ProudOfYourCoin()", +"7973c57f": "fechVoteNumForCandidateBySnapshotBlock(address,uint256)", +"7974a9e6": "publishOption(uint256,uint256,uint256)", +"7974f8fe": "changeTime(uint256)", +"7974fdbd": "secondStageRefund()", +"79753e82": "initAirdrop()", +"7975752c": "ScabbageToken()", +"79758d46": "reading_card_at(uint8)", +"7975c56e": "oraclize_query(uint256,string,string)", +"7975c609": "accountLevels()", +"7975ce28": "buyTokens(uint256,uint256)", +"7976eaa2": "getBonusTokens(uint256)", +"79770d5f": "minBidDifferenceInSzabo()", +"7977f708": "addRoleCapability(uint8,address,bytes4)", +"79787196": "killTotalSupply()", +"7978c7ed": "exotownToken()", +"7978f1b2": "licenseCostNumerator()", +"79798ccb": "startTokenSale()", +"79799193": "FreezedCash()", +"797a49b6": "createPoll(string,uint8)", +"797af627": "confirm(bytes32)", +"797b5877": "NCU(uint256,string,string)", +"797bfaf3": "ico1endTime()", +"797c6f3a": "advertisingUse(uint256,uint256)", +"797d660f": "getCandidateNumberList()", +"797d8b85": "calculateDividend()", +"797d9437": "loadedRefund()", +"797df209": "configureVesting(uint256,uint256)", +"797e2aec": "addCharacters(uint8)", +"797f6bb1": "raiseTraderUnregistered(address)", +"797f73ff": "alreadyClaimed()", +"797f87ba": "chests()", +"79808552": "cancel_lottery()", +"7980a1ab": "increasePaymentsBalance(address,address,uint256)", +"7981e7f1": "generateTokensByList(address[],uint256[])", +"7981fd67": "loikikd()", +"7982abf0": "testTransferGas()", +"7983eb31": "distributeEvenly(uint256)", +"798405fc": "Hold(address,address,uint256,uint256)", +"79843715": "crowdSaleMax()", +"79848daa": "setReleaseManager(address)", +"7984932e": "releaseNow(uint256,uint256,uint8[],uint256,uint256,uint256,string,string)", +"79853c7e": "payFromCampaign(bytes32,address,address)", +"79859a78": "setMaxAgonCount(uint256)", +"7985b860": "AboutBill(uint256)", +"7985ee8f": "deleteRewards()", +"7986c724": "BOUNTY_TOKENS_LIMIT()", +"7986cbfc": "getGroupbyIndex(uint256)", +"798764ec": "ShowCoinToken()", +"79878757": "passTokensToTheTeam()", +"79881b5a": "setPresaleStartsAt(uint256)", +"79885b91": "LIB()", +"79891359": "getOnePlayCoin()", +"798929da": "distributeCoins(address,uint256,uint256,uint256)", +"798974dd": "getNumProposals()", +"798a970b": "setUnitCoinProductionIncreases(address,address,uint256,uint256,bool)", +"798b18fd": "currentRateM()", +"798b3ecf": "processCooldown(uint16,uint256)", +"798b7a71": "callOnce()", +"798bede1": "advisorSupply()", +"798c1f2a": "do_bet(uint256)", +"798c6e0f": "clearStages()", +"798ce54f": "payoutPartial(uint256)", +"798d05fa": "getCountTeams()", +"798ec637": "transferEtherToSender(uint256)", +"798f3e85": "PublicTokenReleased(uint256)", +"798f9790": "getResoDetails()", +"798fd178": "getFrom()", +"79902299": "recalculateTotalFees()", +"79905753": "reclaimFundMultiple(address[])", +"7991c63a": "MetaChanged(uint256,bytes32,bytes32)", +"7992e39f": "TierAmount()", +"7993e5c2": "Devcon2TokenForTesting()", +"7994f55b": "setEndpointParams(bytes32,int256,bytes32[],int256)", +"79953633": "ownersProductAdded(address,uint256,address)", +"79955b4c": "richardAddr()", +"7995b15b": "nowInSeconds()", +"7995ba90": "withdrawExcessToken(address,address)", +"7995ed8c": "ClaimedWei(uint256)", +"79968b77": "sellLicense()", +"79974ce8": "MiningAttemptEvent(address,uint256,uint256,uint256,uint256)", +"79978630": "settleChannel(address,uint256,uint256,bytes32,address,uint256,uint256,bytes32)", +"7997b997": "doMelt(uint256,uint256)", +"79981387": "setWhiteList(address[],address,bool[])", +"79984882": "getProxyExecID(address)", +"79987504": "ECN(uint256,string,string)", +"7998a1c4": "identifier()", +"79991997": "enter(bytes32,bytes8,uint16)", +"799957d2": "TTC()", +"7999c7ca": "myUsername()", +"799a5359": "transferToken()", +"799ae223": "flipCoin()", +"799b3864": "getVersionLength()", +"799b7bb8": "PRE_ICO_ADDR()", +"799c0468": "withdrawMarketingAndCommunityOutreach()", +"799c7b69": "_resetGame()", +"799c8ef2": "callScheduler()", +"799cd333": "sign(bytes32)", +"799d916b": "getObjectValueByKey(string,string)", +"799dcf7e": "staticArrayTests()", +"799efef0": "setLockedWalletAmount(address,uint256,bool)", +"799f0c5d": "locked_funds_for_revealed_spins()", +"799f4079": "unholdSubscriptionOffer(uint256)", +"799f7043": "recordBet(bool,uint256)", +"79a0e5be": "changeMessage(uint16,string)", +"79a18b3a": "isRoundThreeSalePeriod(uint256)", +"79a1c1f6": "proposalStatus(bytes32)", +"79a1ed16": "WithdrawalQuick(address,uint256,uint256)", +"79a2bbec": "_addResources(address[],bytes4[])", +"79a2bfa5": "PRE_SALE_MIN_BUY()", +"79a34619": "startTimeMain()", +"79a3510d": "thisVoterExists()", +"79a37bd0": "tellTime()", +"79a410a7": "bonusesOf(address)", +"79a411ff": "ScareERC20Token()", +"79a4b4bd": "sellPrice(uint8)", +"79a4ee93": "testDeregisterCustomer()", +"79a6877f": "initializeToken(string,uint256,uint256)", +"79a7cfee": "setAddress(bytes32,bytes32,address)", +"79a7de4f": "buildId(address,uint256,bool)", +"79a8416e": "checkPayment()", +"79a84750": "createTokensTo(address,uint256)", +"79a85e6c": "getProductInfo(uint256)", +"79a87b19": "migrationDestination()", +"79a88683": "startCrowdsalePhase3Date()", +"79a8945c": "isDeveloper()", +"79a89b06": "releaseExpiredEscrow(address,address)", +"79a8ba40": "createRequest(uint256,address,uint256,string)", +"79a8f2fa": "processRoulette(address,uint256,bytes32,uint256)", +"79a958c2": "codeUpdateState()", +"79a9986c": "addBadge(string,uint256)", +"79a9e9ea": "IkuraToken()", +"79a9f14d": "getBcouponBalances(address)", +"79a9f23f": "transferAllowedAdd(address)", +"79a9fa1c": "buyback(uint256)", +"79a9fd36": "SUAPPToken()", +"79aa024e": "setAirdropAdmin(address,bool)", +"79aa668d": "setEventsContract(address)", +"79ab295f": "SALE1_CAP()", +"79abb2f5": "play_paper()", +"79aca4e0": "acceptSmartTokenOwnership()", +"79ae0c0a": "updatePrice(bytes32,uint32,uint64,uint32)", +"79ae1c36": "setStopDefrost()", +"79ae77cf": "OEM_Wallet()", +"79ae9c5e": "clearLC()", +"79af55e4": "increaseLockTime(uint256)", +"79af6547": "addLockStep(uint8,uint256)", +"79af8380": "addCrowdsaleContract(address)", +"79b0797c": "AmIPlayer1()", +"79b2614d": "currentMintNonce()", +"79b37a86": "usdRate()", +"79b45b18": "removeEmployeesWithExpiredSignaturesAndReturnFadeout()", +"79b466b0": "TOTAL_TEAMS()", +"79b4a2c7": "transferMultiAddress(address[],uint256[])", +"79b5b1d1": "EvaCurrency(string,string)", +"79b7b30b": "endTrading(bool,bool)", +"79b80455": "onTimeLock()", +"79b9a060": "changePayout(uint256)", +"79ba5097": "acceptOwnership()", +"79ba50b1": "LAME()", +"79ba7b61": "ServiceCoin()", +"79baa8a9": "BasicIncome_CoFund()", +"79bae8a1": "test_failed_payment_throwing_token()", +"79bc2040": "canbuynum()", +"79bc46b3": "SELL_HARD_LIMIT()", +"79bcabf4": "Authority()", +"79bcae2a": "createFuel(uint256,string,uint256,uint256,uint256)", +"79bd04f2": "_bidLaterShip(uint256,uint256,address,address)", +"79bd42cf": "END_DURATION_BETTING_BLOCK()", +"79be02af": "Read(address)", +"79bed048": "turnOffCanUpdateAmountToTakeAsRake()", +"79bf8df3": "mModeratorKeys(uint256)", +"79bfaaeb": "visaLength(address,uint256)", +"79c0909e": "getRandomFromBlockHash(uint256,uint256)", +"79c0b9fb": "sanityCheck(uint256,uint256,int8,int8,int8)", +"79c0d5ae": "tokensInvested()", +"79c0f30e": "advancedThreshold()", +"79c12db5": "EventTicket(uint256,uint256)", +"79c20b41": "changeArtName(string,string)", +"79c30e49": "openCdp(uint256,uint256,uint256,uint256,address)", +"79c310a6": "increasePlayersJadeProduction(address,uint256)", +"79c3199d": "preIcoStartDate()", +"79c36409": "DifToken(uint256,string,uint8,string)", +"79c3dd32": "thirdLevelPrice()", +"79c3ddc1": "isPackageOwner(string,address,address)", +"79c3f694": "_getPVPFeeByLevel(uint256)", +"79c4264a": "earlyBirdMinPerPerson()", +"79c4264b": "matchCount()", +"79c597ff": "ends()", +"79c5ba97": "enterBidForGanToken(uint256)", +"79c5c6b6": "MyWill()", +"79c5cb1c": "createItem(string,uint256,uint256,uint256)", +"79c62711": "createJob(string,uint256,uint256)", +"79c63c40": "dxfOpen()", +"79c65068": "mintToken(address,uint256)", +"79c66892": "EmrCrowdfund(uint256,uint256,string,string)", +"79c69195": "setParamsTotalSupply(uint256)", +"79c6a1b8": "registerAdmin(address,string)", +"79c6b667": "registerPoA(string,bytes32,uint64[],uint64[],address,address,string)", +"79c6c11a": "takeEther(uint256)", +"79c7180d": "Erc20SummaryLogic(address)", +"79c73464": "numAdrs()", +"79c749cd": "generateContentID(string)", +"79c74a38": "Fomo5d()", +"79c7c806": "proofExists(string)", +"79c7f38c": "_freezeAccount(address,bool)", +"79c84100": "getFreezeHourglass(bytes32,bytes32)", +"79c88f20": "datacoin()", +"79c8fe30": "setMaximumGasPrice(uint256)", +"79c9e396": "test_oneInvalidEqBytes2()", +"79ca0792": "beneficiaryMultiSigWithdraw(uint256)", +"79ca9ad4": "tokensToEth(uint256)", +"79caf670": "ethealController()", +"79cb5a2f": "setEtheraffle(address)", +"79cb650f": "testAliceFooKill()", +"79cb657a": "setRateStalePeriod(uint256)", +"79cbfd18": "computeCurrentPriceImpl(uint32,uint64)", +"79cc6790": "burnFrom(address,uint256)", +"79cc90c4": "repossess()", +"79ccd1a1": "BetherBank()", +"79cce1c5": "getReleaseHashes(uint256,uint256)", +"79cd421d": "ERCTestToken()", +"79ce0515": "removeCP(address,address)", +"79ce37e1": "deadline_modify(uint256,uint256)", +"79ce9fac": "transfer(bytes32,address)", +"79cef607": "_purchaseTokens(string,address,uint256)", +"79cf3a7a": "zeroOut()", +"79d007f7": "forceOffsetExtraFeeRate()", +"79d00c5d": "EasyCrowdsale()", +"79d10a76": "SedPosToken()", +"79d116ed": "setWhiteListingAdmin(address)", +"79d1d4fa": "verify(bytes,bytes,bytes,bytes32)", +"79d220ae": "setCrowdsaleOpenTimerFor(uint256)", +"79d28ac9": "balanceOfCreator(address)", +"79d2e48d": "upgradeFinalize()", +"79d303ae": "doStart()", +"79d3d547": "grantToken(address)", +"79d42bfe": "CLNRaised(address,address,uint256)", +"79d4fe00": "totalTokensICO3()", +"79d60cdf": "LongChain()", +"79d6348d": "sign(string)", +"79d68f79": "COIN_PER_ETHER_BOARD()", +"79d88d87": "forbid(bytes32,bytes32,bytes32)", +"79d8cc7b": "setFlights(uint16[],uint16[],uint256[],uint256[])", +"79d95c5a": "setMaxCap10X(uint256,string)", +"79d9e979": "minimumDealAmount()", +"79da06a2": "BlockSwapWrapperGolemNetworkToken()", +"79da9747": "switchCrowdsale()", +"79db228a": "RegisterList(address[],bool)", +"79db5f67": "removeRole(address,uint256)", +"79db671d": "upadateContributorsCount(uint256)", +"79db77a3": "removeStaffWhitelist(address[])", +"79dbdbb9": "CKYAdv(uint256,string,string)", +"79dc04c0": "BCTVToken(uint256,string,string)", +"79dc10a6": "takeOwnershipFeePercents()", +"79dd02cb": "PerfectCoinControl()", +"79dd822a": "setSignatureRest(bytes,uint256)", +"79ded380": "setRabbitMother(uint32,uint32)", +"79df2a4c": "ReferredInvestorAddition(address,address)", +"79df4fa2": "startDeposit()", +"79df896d": "ScandinavianEKrona()", +"79e05a36": "getUintField2()", +"79e097f0": "addVotePair(address,address)", +"79e0ef1b": "withdrawBalanceAmount(uint256)", +"79e0f59a": "setEarlyParicipantsWhitelist(address[],bool[],uint256[],uint256[])", +"79e1250d": "setTotalToken(uint256)", +"79e12f7e": "getBoardByHash(bytes32)", +"79e1c9dc": "changeAmountPerEther(uint256)", +"79e1fa2e": "convertToEur(uint256)", +"79e23483": "addLockValue(address,uint256)", +"79e2bbea": "getLifeVal()", +"79e35d0b": "poolcoin(uint256,string,string)", +"79e468ef": "createLand(address)", +"79e54e6e": "AleKoin()", +"79e58973": "coinBalanceOf()", +"79e58cfd": "transferIcoship(address)", +"79e79023": "KuaiMintableToken(address,uint256)", +"79e8b8eb": "lastSubTokenCreatorOf(uint256)", +"79eaaf61": "totalTiers()", +"79eac7c3": "confirmOccupancy()", +"79eb16d4": "calculateShareETH(address,uint256)", +"79eb26cc": "RANGE_SCALE()", +"79eba0b6": "showPrivateVars()", +"79ec3864": "getMemberAtAddress(address)", +"79ec4f19": "setStartAndEndTime(uint256,uint256)", +"79ed13a7": "availableOptions()", +"79ed3d69": "setNextCommonTTMTokenId2(uint64)", +"79edfa7d": "setMetadataUrl(string,string)", +"79ee54f7": "getRewards(address)", +"79eee392": "DEVELOPERS()", +"79ef6858": "addItemToMenu(bytes32,uint256)", +"79ef704e": "addLogic(address)", +"79efb507": "oldData()", +"79f00703": "setEthartArtReward(uint256)", +"79f015b2": "getCarProductName(uint32)", +"79f0b427": "log_demurrage_fees(address,address,uint256)", +"79f0c524": "ParseHeaderData(bytes)", +"79f0cd62": "revertTokensByKYC(address,address)", +"79f0f7b3": "safeMulWithPresent(uint256,uint256)", +"79f119cd": "PXP()", +"79f1433c": "post_energy_balance(int256)", +"79f16ba1": "ShanDianLian()", +"79f1987d": "thirdExtendedBonusSalesEnds()", +"79f1a6ef": "_noMatchingPairs()", +"79f3b481": "putTreeOnSale(uint256,uint256)", +"79f57e68": "getAsAddress(bytes32)", +"79f59f09": "ParsecTokenERC20()", +"79f645ea": "RANDOMIZER_RETRY_COUNT()", +"79f64720": "cancelAndReissue(address,address)", +"79f68f85": "forwardFunds(bool)", +"79f74fd5": "ControllerSet(address)", +"79f7a873": "isAtLeast(uint256,uint256,string)", +"79f7e600": "setApproveOwner(uint8,bool)", +"79f90d6c": "ownerPauseContract()", +"79f9578c": "queryBalanceMinter()", +"79f96600": "getCurrentFeeWindow()", +"79f9b10b": "registerAsExportingAuthority(address)", +"79f9cc72": "setGasLimits(uint256,uint256)", +"79fb18ac": "transferSmartTokenOwnership(address)", +"79fc3682": "addressBalances(address)", +"79fc4687": "receiveDividends()", +"79fd86cc": "airDrop_(address,address,address[],uint256)", +"79fd8c24": "PriceUpdate()", +"79fdc915": "_decideMarket(uint256)", +"79fdf548": "updateTokenInvestorBalance(address,uint256)", +"79fe3b06": "setPercentTokensToSale(uint256)", +"79fed7cb": "checkMinContribution()", +"79ff69d9": "paymentSettle(uint256)", +"79fff7a9": "logReputationTokenMinted(address,address,uint256)", +"7a00698f": "_doProposal()", +"7a0092b5": "Aunder()", +"7a009c22": "increaseBank()", +"7a00cf46": "isCloseable()", +"7a00e2e3": "removeReferrer(address)", +"7a013105": "ico_start()", +"7a02a973": "resetStaking()", +"7a02dc06": "getInfo(bytes32)", +"7a02eb1d": "Maesawa()", +"7a039beb": "GXX()", +"7a041e7e": "fundsFromPreSale()", +"7a044323": "accumulated()", +"7a04581c": "getBetclose()", +"7a04855a": "EplusCoinToken()", +"7a04f9ea": "getPhaseExpiry()", +"7a060b53": "GOLD_AMOUNT_TPT()", +"7a07424e": "promotionRatio()", +"7a08339d": "setFakeTime(uint256)", +"7a091f95": "batchPunchIn(address[],uint64[])", +"7a09588b": "cashoutEOSBetStakeTokens_ALL()", +"7a096f53": "getTransfer(address,address)", +"7a09defe": "totalMonster()", +"7a0a2e00": "auctionEndHashing(uint256,uint256)", +"7a0b0a3f": "MAX_STAGE_1_LIMIT()", +"7a0b294c": "buyPresaleTokens()", +"7a0c396d": "giveMeNILs()", +"7a0ca1e2": "attach(address)", +"7a0d819e": "casinoDeposit()", +"7a0e03ec": "getUInt8Value(bytes32)", +"7a0e09aa": "getConsent(uint256)", +"7a0e2d1a": "updateUser(bytes32,bytes,bytes32,bytes32)", +"7a0ecfc2": "LogUpdatedInitialTimestamp(uint256)", +"7a0fee37": "MinerRandomNumber(uint256)", +"7a10f17b": "PIN_PRICE()", +"7a1126f0": "houseWithdraw(uint256)", +"7a118fdc": "SHNZ()", +"7a11dfb4": "redeemBounty(uint256,uint256,uint8,bytes32,bytes32)", +"7a12cabf": "owner_updateRelay(address,bool)", +"7a12cdb8": "cybToken()", +"7a1395aa": "setDecimals(uint8)", +"7a13d14c": "disputeAutomatedReport()", +"7a1439d7": "payOffClaim(bytes32,uint256)", +"7a14f465": "crosairSoldCount()", +"7a152c11": "unpause(uint256,uint256)", +"7a153043": "disbursements(address,uint256)", +"7a1593d6": "freeze(address,string,uint256,uint256,uint256)", +"7a15eb8d": "lottoIndex()", +"7a16c6dd": "setsetperiod(uint256)", +"7a16cbe3": "setData_4(uint256)", +"7a178741": "getMemberAddr(uint256)", +"7a17feff": "setTransferLimit(uint256)", +"7a186ebf": "WHITELISTED_PREMIUM_TIME()", +"7a1903f2": "checkBonus(uint256)", +"7a1a0604": "AuctusTokenSale(uint256,uint256)", +"7a1a7e7f": "itemCancelMarkets(uint256)", +"7a1ab407": "bountyOwnersTokens()", +"7a1ac566": "registerSale(address,address)", +"7a1aeb3c": "getTokenCount(bool)", +"7a1b26a8": "TransactionAccepted(uint256)", +"7a1b63bc": "buyCMTAgainstEther()", +"7a1bba3a": "TestFoo()", +"7a1bbb40": "getNegativeArray()", +"7a1bcae9": "playerDecision()", +"7a1bf7f6": "PreIcoClosedManually()", +"7a1c0063": "emitExecuted()", +"7a1c39cb": "setIII_R2(uint256)", +"7a1c44f8": "DappleAirdrops()", +"7a1cf806": "configureTokenDividend(address,bool,address,bytes)", +"7a1d66dd": "determinePosition(address,address)", +"7a1d8570": "getSendVal()", +"7a1e16bc": "signEscrow(uint256)", +"7a208990": "Arcus()", +"7a20ff15": "getWeiAllowedFromAddress(address)", +"7a223758": "detOwner()", +"7a22393b": "setTokenSeller(address)", +"7a233fb3": "redeemPrice()", +"7a26924f": "timeToFinishTokensSale()", +"7a2756f2": "getWager(uint256)", +"7a276bb6": "getDeveloper(uint256)", +"7a28399b": "approveProvider(address)", +"7a28e60f": "EXTRADECOIN(string,string,address)", +"7a28f8bc": "accountData()", +"7a290fe5": "burnRemainToken()", +"7a29332d": "buyAllOutcomes(uint256,uint256)", +"7a294055": "VoteReceived(string,address,uint256)", +"7a2a0456": "swapEtherToToken(address,uint256)", +"7a2a3931": "galleassetTransferFrom(address,address,uint256)", +"7a2a530d": "getAllDevices()", +"7a2b0587": "isReserve(address)", +"7a2b2dd7": "Metaexchange(address,address,address,uint256,uint256,uint256)", +"7a2b78e5": "findIndex(uint256,uint256)", +"7a2b9116": "checkValidTk(address)", +"7a2c1b71": "CheckProfit(address)", +"7a2c8506": "getUserReward(address,bool)", +"7a2cc6d8": "_createPermission(bytes32,address[],bytes4[])", +"7a2e1c61": "getSoldCountOfPackage(uint256)", +"7a2e41d1": "InitiateCryptoGamers()", +"7a2ecfdb": "setMostSent(uint256)", +"7a309005": "devSENSDestination()", +"7a30ebed": "holyFoundersFundDeposit()", +"7a3130e3": "migrateFrom(address,uint256)", +"7a314ce2": "FUND_GATHERING_TIME()", +"7a319590": "changeFees(uint256,uint256,uint256)", +"7a31ee21": "MinimumFundingGoalChanged(uint256)", +"7a32c84c": "getDonatee()", +"7a341bc7": "setFounder(address)", +"7a34cedb": "purchaseWithBTC(address,uint256,uint256)", +"7a350141": "BalanceChanged(address,address,uint256)", +"7a360ec3": "forwardWei()", +"7a3629dc": "setMinimumStakingRequirement(uint256)", +"7a362fe1": "ICO_START1()", +"7a366d14": "softCap(uint256)", +"7a37f56e": "PandorasWallet()", +"7a38012e": "handleEarlySaleBuyers(address[],uint256[])", +"7a38417b": "delayOpeningTime(uint256)", +"7a386e88": "setupAmbi2(address)", +"7a387bc2": "returnNote(uint256)", +"7a38f9eb": "isZero(uint256)", +"7a396264": "winAmount2()", +"7a3979da": "pay_money()", +"7a39bb28": "FirstPeriodCapUpdated(uint256,uint256)", +"7a3a0e84": "fundingGoal()", +"7a3aa8ea": "CoXxMoXx()", +"7a3abce9": "withdrawComB()", +"7a3b0b5d": "positive_terms_of_Service()", +"7a3c4c17": "currentPrice(uint256)", +"7a3cbbe4": "TIMER_STEP()", +"7a3d2e5c": "changeArtUrl(string)", +"7a3d4b1a": "createSwap(uint256,address)", +"7a3dae68": "_createKT(string)", +"7a3dbc16": "getInitialPrize(uint256)", +"7a3e0013": "setArbitrator0(address)", +"7a3e286b": "currentCollectRound()", +"7a3eeb57": "setdteamVaultAddr2(address)", +"7a3f5781": "setAllowRefunds(bool,uint256)", +"7a3fa650": "IONIA()", +"7a4058dd": "confirmDealCompletionByPatient(bytes16,bool)", +"7a40618d": "emitContractRemoved(address,address)", +"7a408454": "burn(bytes32,uint256)", +"7a4093b8": "SETUP_DONE()", +"7a427d98": "forceReturn()", +"7a42a9cd": "checkOwner(bytes32)", +"7a43cb62": "positionWeightOf(uint256,uint256)", +"7a442a9b": "isClaimable(string)", +"7a444072": "getDeveloper()", +"7a44d730": "PGM_Coin()", +"7a457855": "getNumeroMensajes()", +"7a468170": "ethCap()", +"7a4690fb": "TOKEN_SALE1_NORMAL()", +"7a476a42": "queryPublishedContractTemplate(uint256)", +"7a479160": "getRequestArgs(uint256)", +"7a4822d7": "addTransaction(address,uint256,string,bytes)", +"7a4843ca": "product3_luckybuyTracker()", +"7a48b408": "MCIM()", +"7a48f5c7": "start_pg_quiz(string,string)", +"7a4aa92f": "provideTeamHolderToken()", +"7a4b7075": "getMake(uint256)", +"7a4b762b": "synechronToken()", +"7a4bfebb": "FixedGameToken(bytes32,uint256,address)", +"7a4c2e9a": "access_hidden_layer(int256[],uint256[],uint256)", +"7a4c96ad": "vote(string,string,uint256)", +"7a4cac15": "removeUserAsset(address,uint256)", +"7a4e320c": "MINIMAL_PRE_ICO_INVESTMENT()", +"7a4e365d": "destroyFreezeFunds(address)", +"7a4f2fde": "decreaseSalesBalance(address,address,uint256)", +"7a4f7b92": "getInitializedFeeWindow()", +"7a4fb678": "Operation(uint8,bytes32[8])", +"7a504ceb": "endCrowdsale(uint256)", +"7a50aeb5": "ProofToken(address,address,uint256,string,string)", +"7a518d9f": "epoch_release_count()", +"7a51a611": "getOptionIdForPoll(uint256,uint256)", +"7a52ad76": "ChangeMainSaleDates(uint256,uint256)", +"7a530f03": "createPromoFlower(uint256,address)", +"7a5310b9": "confirm2stage()", +"7a53bcfc": "batchSend(address[],uint256[])", +"7a5402e9": "getPolicyData(uint256)", +"7a543a94": "isIcoFinished()", +"7a545b0c": "preIcoSold()", +"7a554786": "saveUserWallet(address,address)", +"7a55cece": "PlusPay()", +"7a55d4bd": "getCurrentBragKing()", +"7a5615c0": "changeTokensPerUSD(uint256)", +"7a58b058": "read_max_dgx_available_daily()", +"7a58ce90": "CryptoLinkNet()", +"7a5977be": "MAX_TOKENS_ADVISORS()", +"7a5984c4": "burn(uint32)", +"7a5a35ad": "setUSDEth(uint256)", +"7a5a59ec": "angelAllocation()", +"7a5b4f59": "getMetadata()", +"7a5bed43": "deleteSharedAccount(bytes32,bytes32,bytes32)", +"7a5c8432": "paymentqueue()", +"7a5c9028": "getLengthClassPlayers(uint256,uint256)", +"7a5ced61": "batchcollecttaxes(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"7a5d5345": "signControllerChange(address)", +"7a5db3f3": "renounceInvestor()", +"7a5dbc21": "ipow(int256,int216)", +"7a5df22b": "getStakedAddress(address)", +"7a5e842a": "nizk_verifyproof(string,string,string,string,string,string,string)", +"7a5f5021": "closeBets(bytes32,bytes32,uint256,uint256)", +"7a5f715c": "SetCityName(bytes32)", +"7a5f973b": "INITIAL_SUBSIDY()", +"7a62b77c": "ShowChargeTime(address,uint256)", +"7a631201": "resetEvents()", +"7a63626c": "ownerIndexToERC20Balance(address,address)", +"7a63c290": "mintCapInTokens()", +"7a645975": "InexProject()", +"7a6506f6": "dividendsPayedIndex()", +"7a6543e2": "getRegistered()", +"7a654915": "BitcoinTRONIX()", +"7a657c53": "checkVotingForSendWeiFromPayment()", +"7a6615d4": "NewPAIReceipt(address)", +"7a66e5cf": "paySolutionReward(uint256,uint256)", +"7a67011f": "setMoneyline(int256,int256)", +"7a6838ec": "ownerBank()", +"7a690951": "_endBetListing(uint256)", +"7a6994dc": "getSpaceByIndex(uint256)", +"7a69e225": "settleMissedJackpot(bytes32)", +"7a6a00bb": "balanceEthOf(address)", +"7a6a18cf": "CrowdsaleMintFinished()", +"7a6ad926": "getUint(bytes32,bytes32)", +"7a6adab6": "getAdsLength()", +"7a6b1c7c": "authAccess()", +"7a6b2a2c": "lookupAmountUserDonatedToCampaign(address,uint256)", +"7a6b456f": "countShips(uint16,uint16,uint8,bytes32)", +"7a6b8361": "zeroBytes()", +"7a6ba98c": "getHashKey(address,uint256)", +"7a6c7783": "_consume(address,uint256)", +"7a6cb1aa": "getReceiverVesting(address,address)", +"7a6ce2e1": "getMsgSender()", +"7a6d6f3d": "gettormow()", +"7a6d8030": "BLOCKMALL()", +"7a6e1384": "priceForBuyingCostume()", +"7a6e2b49": "payService(bytes32,address,address,uint256)", +"7a6e5949": "getwithdrawEthertoAmountValue()", +"7a6e9df7": "getTimestamp(bytes)", +"7a6e9e41": "withdrawSellDemand(uint256)", +"7a6ee304": "IAMRefundedForWei(address,uint256)", +"7a706ac7": "setBuyRatio(uint256)", +"7a70abda": "updateAvatar(uint256,uint256)", +"7a71055d": "setAvgMinedPerDay(uint256)", +"7a713023": "finalizeSettingDeprecation(uint256)", +"7a71dee0": "onePotWei()", +"7a72416f": "security_address()", +"7a72c30d": "checkMilestoneStateInvestorVotedNoVotingEndedNo()", +"7a72c32f": "Paraboloid()", +"7a740a68": "communityReservation()", +"7a74b672": "clearEndpoint(bytes32,int256)", +"7a766210": "XYZA()", +"7a766460": "getStake(address)", +"7a773293": "setMarketingRates(uint8,uint8,uint8)", +"7a783d91": "Leeroy(address)", +"7a78cccc": "DAMIToken(address)", +"7a78ee2c": "lastBlock_a12Hash_uint256()", +"7a791524": "setNextFeePercentage(uint8)", +"7a792fa0": "get_reward(uint256)", +"7a79940d": "getSharedAccountPw(bytes32,bytes32)", +"7a7cdfa9": "createT(string,string,string,string,string,string,uint256,uint256)", +"7a7d4937": "secondsPerBlock()", +"7a7ebd7b": "channels(bytes32)", +"7a805504": "getAuditReportBlockNumber(uint256)", +"7a80760e": "ERC20Token()", +"7a81f972": "releaseCelebrity(uint256)", +"7a824b1d": "cooperativeSettle(uint256,address,address,uint256,address,address,uint256,bytes,bytes)", +"7a827634": "_emitContractAdded(address,address)", +"7a828b28": "terminate(uint256)", +"7a837213": "setAllowedAccount(address)", +"7a83e89e": "_endBetBlock()", +"7a840a52": "PKBCoin()", +"7a84d13e": "getNumberOfCandidates()", +"7a852c7e": "transferTokensWei(address,uint256)", +"7a8566ae": "richToken()", +"7a85c02a": "tokensOfEdition(uint256)", +"7a85e031": "finalizeInternal()", +"7a86d3d6": "addWithdrawTransaction(address,uint256,bytes)", +"7a872547": "defaultInput()", +"7a875ade": "fishPromoHelpers(address)", +"7a87f51a": "emergency_eth_withdraw()", +"7a888ca9": "startOptionsSelling()", +"7a88aabb": "getAddressOfTokenUsedAsReward()", +"7a899cdc": "_setPermission(address,address,bytes32,bytes32)", +"7a89d33e": "testdynamic_income(uint256,uint256)", +"7a8a5cf3": "totalMigratedIn()", +"7a8a8720": "firstUnitStartTime()", +"7a8b0114": "setA_ASM(uint256)", +"7a8b089b": "developerFundDeposit()", +"7a8bd25a": "get_bet_nfo(uint256)", +"7a8bd93e": "flipRewardAmount()", +"7a8df1b9": "getAffiliateInfo(address)", +"7a8e3d8d": "withdrawEth2Wallet(uint256)", +"7a8e832f": "MyBalance()", +"7a8f7be6": "HAYATO_EXTRACTION_BASE()", +"7a8fa666": "addPoweruser(address)", +"7a8fe3b1": "getProductBuyersWithUnconfirmedRequests(uint256)", +"7a9036cd": "registerFixedToken(bytes32,uint256,address)", +"7a906be0": "createAuction(uint256,uint128)", +"7a90a7a3": "feeBurnerWrapperContract()", +"7a9110d5": "klik()", +"7a91d5f9": "dilutePower(uint256,uint256)", +"7a91e53d": "isNotSelf(address,address)", +"7a926165": "manageAdmins(address,bool)", +"7a927429": "TokenValue(uint256,string,uint256)", +"7a935644": "I30Token()", +"7a93b917": "Lirux(string,string,uint256,string)", +"7a943538": "Victory()", +"7a954d5d": "investedInPreICO()", +"7a95e305": "escrowedForAsset(bytes32)", +"7a95f174": "CGT()", +"7a960154": "numOfPurchasedTokensOnCsBy(address)", +"7a9839c2": "fun(uint256)", +"7a99b018": "withdrawClient()", +"7a99ba4f": "investETH(address)", +"7a99bb0a": "_getTokenAmount(uint256)", +"7a9a032d": "addProposal(string,uint256,uint256,string,string)", +"7a9b0412": "setChainlinkOracle(address)", +"7a9b486d": "deposit(string,string)", +"7a9c960b": "DayDayToken(address)", +"7a9d366a": "debug_bool(bool)", +"7a9db28a": "_setPriceFactor(uint256)", +"7a9df8c0": "sellChickenParkCoin(uint256)", +"7a9e19de": "nextOffsetIndex()", +"7a9e5e4b": "setAuthority(address)", +"7a9ee2dc": "SogetiCoin()", +"7aa064ef": "intersubuser(address,uint256)", +"7aa0eb97": "LogSendTokens(address,uint256,string)", +"7aa11238": "Flow(uint256,string,string)", +"7aa1688e": "setUser(address,string,string,bool,bool,bool)", +"7aa1a77d": "rawWipeAttributes(bytes32,bytes32[])", +"7aa2096a": "setPI_edit_15(string)", +"7aa2bcd6": "bonusCompaignOpen()", +"7aa306a2": "numOwnerAddress()", +"7aa3295b": "trusted(address,address)", +"7aa356af": "phaseTwoRate()", +"7aa359f8": "changemem(uint256,bytes32)", +"7aa3803c": "takeRent(address)", +"7aa3976f": "DragonStone()", +"7aa3b39b": "_vest(address,uint256)", +"7aa3f6cb": "setKyberProxyAddress(address)", +"7aa3ff67": "AlterMediatorSettings(address,uint128)", +"7aa41ed5": "getNumPieces()", +"7aa50c56": "performDifferent(address,address[],uint256[])", +"7aa5a1a8": "set_eth_as_seeded()", +"7aa63a86": "getTotalElements()", +"7aa86e2f": "fetchProfit()", +"7aa98fb3": "timeLock(address,uint256,uint256)", +"7aa9a7f9": "getNumberThree()", +"7aaa3470": "getInterest(address)", +"7aaae78c": "preSaleBonus1Amount()", +"7aacd17d": "MyToken(string,string)", +"7aacf03c": "auctionIndex()", +"7aada63b": "maxEarlyStage()", +"7aae42c9": "endIcoPreICO()", +"7aaeb37c": "SimpleTGEContract()", +"7aaf334d": "offFreeze_Bounty(address)", +"7aaf58d7": "creatUserPurchase(address,address)", +"7aaf87d2": "getallresutl()", +"7ab0089e": "YiLiaoLian(uint256,string,string)", +"7ab03c25": "reserveTokensProjectAndFounders()", +"7ab0b998": "signRecoveryChange(address)", +"7ab13461": "decreasePrice(uint256)", +"7ab13ba9": "isProgress()", +"7ab14aae": "createBattle(address,uint256[],bytes32,uint256)", +"7ab21613": "getStopReceive()", +"7ab2af2b": "isRegistrationOpen()", +"7ab38e88": "issueTokensPresale(address,uint256)", +"7ab42bbd": "grantXPTokens(address,uint256)", +"7ab4e968": "oneEDG()", +"7ab528c9": "revokeDelegate(address,string,address)", +"7ab5e1e1": "reservedTokensFunctionality()", +"7ab61372": "totalRunePurchased()", +"7ab672c4": "GrabRedHarvest()", +"7ab7a9fa": "aurasCompatible(uint64,uint8)", +"7ab7ab2e": "AcceptsHalo3D(address)", +"7ab7d55b": "calculateHash(uint256,uint256,uint256,bool,bytes32)", +"7ab7e492": "RANGESTART_2()", +"7ab7fa9f": "UBEX()", +"7ab91b3a": "hash(uint64[8])", +"7ab96fda": "testBalanceCanbeWithdrawn()", +"7aba2249": "StoppableMock()", +"7aba4d23": "delToken()", +"7aba6f37": "setLock()", +"7aba86d2": "bonusMax()", +"7abaf552": "nexium()", +"7abb03bc": "noticeWinner(uint8)", +"7abbe9c0": "DEFAULT_GAME_COST()", +"7abc06aa": "tokensPerCents_gte50kUsd()", +"7abcc5bc": "bidInfo(string)", +"7abccac9": "getTokenMetaData(address)", +"7abdf949": "getUpgradePrice(uint256)", +"7abe24d4": "Firechain(uint256,string,string)", +"7abeb6a0": "createMarket(address,address,uint24)", +"7abec356": "Deposit(address,uint256,int256)", +"7abf75fd": "CFNDCrowdsale()", +"7ac02331": "ethMultisigWallet()", +"7ac07dcc": "isCaller(address)", +"7ac1cb30": "setbili(uint256,uint256)", +"7ac26aeb": "getTag(string,uint256)", +"7ac37d58": "ownerTransferEther(address,uint256)", +"7ac3c02f": "getSigner()", +"7ac40b10": "thedate()", +"7ac4b05e": "returnMyMoney(uint256)", +"7ac4ed64": "getAddress(address,bytes32)", +"7ac59d43": "getSellerSignature(string)", +"7ac5bb54": "getFlight(uint16,uint16)", +"7ac5d8a9": "RoundNumber()", +"7ac6e6a8": "objectHelmet()", +"7ac7ef85": "Msg()", +"7ac81da5": "useProps(uint256[],uint16[],uint16[])", +"7ac8dc26": "subFundPrecent()", +"7ac91cc2": "testFailOwnedAuth()", +"7ac94409": "sixthExtendedBonusSalesEnds()", +"7ac9f013": "removeVal(address,bytes32,address)", +"7aca84a1": "createVaultAccess(uint256)", +"7aca97b5": "changeDeadline(uint256)", +"7acb3e67": "EthTraderDAO(address,bytes32,address,address,address)", +"7acb4b0f": "isGroupInPolicy(bytes32,bytes32)", +"7acb7757": "stake(uint256,address)", +"7acbfb65": "setOwner(uint256,uint256)", +"7acc0b20": "products(uint256)", +"7acc6f74": "addSingleAddressToWhitelist(address)", +"7acc8678": "transferAdminQuickly(address)", +"7acd0412": "newInvest(address,uint256,uint256)", +"7ace341b": "getCurrentOwner(uint256)", +"7ace41f2": "CoinvestToken(uint256)", +"7ace58d8": "changeBranch(uint256,uint8)", +"7acee816": "claimIFactor2(bytes32,bytes32)", +"7acf16c3": "findLowestBenefactor()", +"7acf4892": "isNotPaused()", +"7ad00589": "getAffiliateSenderPosCode(uint256)", +"7ad06be3": "recycleAppearance(uint128[5],uint256)", +"7ad0bf86": "exchangeRegulatorWallet()", +"7ad1428d": "m_record(string)", +"7ad157b9": "buy(uint256,address,bool)", +"7ad226dc": "refund(uint256,address)", +"7ad2856f": "info(string,uint8)", +"7ad28c51": "changeTimeLock(uint256)", +"7ad2a0ce": "doAirDrop(address[],address,uint256,uint256)", +"7ad3c119": "ContractInfo()", +"7ad3def2": "updateToken(address)", +"7ad4b0a4": "setAttribute(address,bytes32,bytes,uint256)", +"7ad53eae": "sani()", +"7ad59e20": "end_Dec_21_2017()", +"7ad5a045": "_ReparameterizationProposal(address,string,uint256,bytes32)", +"7ad77fd9": "firstWeek()", +"7ad7e846": "robocoinToken()", +"7ad8800f": "ShowPrice(string)", +"7ad9642f": "changeMiniumBet(uint256)", +"7ad979a3": "setupFund(string,address,uint256,uint256,address,address,address,address[],address[],uint8,bytes32,bytes32)", +"7adaa3f8": "right39(uint256)", +"7adac0e6": "stopTransfers()", +"7adb7ced": "ekkoBlock(uint256,string,uint8,string)", +"7adbf973": "setOracle(address)", +"7adc22d8": "bujankkoin()", +"7add0106": "initBronze()", +"7addc766": "ADDR_MAYA_MARKETING()", +"7ade8d6a": "Totti(string,string,uint256,uint256)", +"7adec1c9": "DepositAcceptedEvent(address,uint256)", +"7adee0e3": "setJoinDelta(uint256)", +"7adfec71": "allTasksCount()", +"7adff2cb": "auth(uint8,bytes32,bytes32)", +"7ae046d5": "joinGame(uint256,address,string)", +"7ae0c915": "SmartBondsSale()", +"7ae11443": "getCurrentStakingPeriod()", +"7ae145cb": "Badge(uint256,string,uint8,string)", +"7ae15a19": "createKingdom(string,uint256,uint256,uint256,uint256)", +"7ae1cfca": "getBool(bytes32)", +"7ae26546": "setApprovedContractAddress(address,bool)", +"7ae26773": "revokeAllowance(address,address)", +"7ae2a331": "goldenTicketFound(address)", +"7ae2aa34": "teamVestingStage()", +"7ae2b5c7": "min(uint256,uint256)", +"7ae316d0": "getTotalFee()", +"7ae38a95": "isDestructionStarted()", +"7ae488c3": "priceOfPlayer(uint256)", +"7ae4bff8": "changeStage(uint256)", +"7ae506ac": "minimumPurchaseValue()", +"7ae5dfe5": "TTC(uint256,string,uint8,string)", +"7ae68ada": "getReferralCode()", +"7ae6b763": "updatePartner1_will(string)", +"7ae7024c": "_realBalanceOnToken(address)", +"7ae74432": "PhilToken()", +"7ae77ecf": "onlyBouncerCreateContract(bytes)", +"7ae79345": "ZeroChain()", +"7ae79e86": "crowdfundEndsAt()", +"7ae81801": "userUpgradeElement(uint256,uint256,uint256)", +"7ae8b321": "withdrawGNT(uint256)", +"7ae8c854": "getMaturity(bytes32)", +"7ae9c430": "getMinFunds()", +"7ae9c856": "getassignTokensperType(uint8)", +"7aeaa864": "storePhoto(string)", +"7aeabb39": "lastPaymentDate()", +"7aeb0763": "habichnet()", +"7aeb9500": "getAutoInvestStatus(address)", +"7aec05b6": "TemroyToken()", +"7aec2277": "ValueCyberToken()", +"7aece878": "receiveObject(uint256,address)", +"7aef1cdc": "airDropDestinations(address)", +"7aef1d4d": "setMinEther(uint256)", +"7aef2226": "MIKETANGOBRAVO18Crowdsale(uint256,uint256,uint256,address,uint256,uint256,uint256)", +"7aef951c": "bid(string)", +"7aefec13": "followTraderPreSignedHashing(address,address,bytes32,uint256,address,uint256)", +"7af05516": "claimRewardTillRound(uint64)", +"7af0ed7e": "NewStatic()", +"7af1337b": "updateCrystal(address)", +"7af20a0a": "LITECORE()", +"7af2a28e": "createContractElement(string,uint256)", +"7af30442": "testToggleBitFailIndexOOB()", +"7af327a0": "deposito()", +"7af3670c": "NewToken()", +"7af52ade": "collectEntryFee()", +"7af5878e": "safeSend(address,address)", +"7af5dc37": "safeSub(int256,int256)", +"7af85411": "DisableReturnFunds()", +"7af8b87d": "verificationRate()", +"7af8c4f2": "changeTokenSaleAddress(address)", +"7af91032": "getPoolDoneCount()", +"7af915af": "setResourcesBanker(address)", +"7afa0c66": "lockedMonsterStatsCount()", +"7afa1eed": "generator()", +"7afa8388": "transferFromWithReferenceCallGas()", +"7afbe4f1": "Add(uint256,uint256)", +"7afc84df": "NKHOIToken()", +"7afcb524": "foundersBalance()", +"7afd4762": "auctionPriceLimit()", +"7afde96b": "isInPreSale()", +"7afea44f": "kycManager()", +"7aff5061": "penalizeNode()", +"7afff425": "reclaimAllocated()", +"7b01127c": "getValue(bytes32,bytes32)", +"7b012ff6": "IcoCap()", +"7b015ff7": "crowd_start_date()", +"7b019f89": "squareRoot(uint256)", +"7b02347d": "distributeRef(uint256,uint256)", +"7b02b2c9": "sendMsg(address,string)", +"7b02b6de": "initialChargeFee(uint256)", +"7b02f6e1": "_vote(address,address,uint256)", +"7b0383b2": "initializeDispute(uint256)", +"7b039576": "setCreditStatus(bool)", +"7b039bb6": "createVariation(uint256,uint256)", +"7b03e5f0": "_getUint(address,bytes32)", +"7b0472f0": "stake(uint256,uint256)", +"7b04a2d0": "onApprovalReceived(address,uint256,bytes)", +"7b04b1f8": "prePaidFee()", +"7b053195": "testItems(bytes)", +"7b05d785": "redeemTokens(string)", +"7b069edb": "createNewGame(string,uint8,uint256[],uint256[])", +"7b06e907": "teamAddressOne()", +"7b07788e": "removePrecondition(uint256)", +"7b0862e1": "getLatestSettingId(uint256)", +"7b0863de": "beginClosingPeriod()", +"7b087636": "testToUint96()", +"7b088543": "setDollarForOneEtherRate(uint256)", +"7b0934ab": "KRTR()", +"7b0a2340": "issueBook(uint8)", +"7b0a3a8d": "maxRecords()", +"7b0a47ee": "rewardRate()", +"7b0a7bf8": "disableContactMint(address)", +"7b0b5b93": "MannaCoin(address,address)", +"7b0c15ff": "ApolloSeptemStarted()", +"7b0de015": "teamTokensAddress()", +"7b0f6f18": "executeArbitrage(address,uint256,address,bytes)", +"7b0f94ed": "advisoryEthWallet()", +"7b103999": "registry()", +"7b10a1d9": "changeInviteReward(uint256)", +"7b10b293": "requestMembership()", +"7b10e717": "received_wei()", +"7b1278e9": "setStageLength(uint256)", +"7b129c48": "TrueTHB()", +"7b12df39": "userProfits()", +"7b12e074": "getSiringWithId(uint256)", +"7b144a84": "testFunded(uint256)", +"7b146f6f": "contributorPoolAddr()", +"7b15013c": "JPPreICO()", +"7b151be0": "market_WithdrawWei()", +"7b169f8c": "refBonusOf(address)", +"7b16c028": "HumaniqICO(address,address,address)", +"7b16f7a0": "transferAll(uint256,address,address)", +"7b1707ee": "sendAliceBlue(address,uint16,uint256,bytes)", +"7b1760da": "computeCertHash(address,bytes32)", +"7b17e543": "user(uint32,uint32)", +"7b1837de": "fund(address,uint256)", +"7b19bbde": "fundValues(uint256)", +"7b1a4909": "transferETH(address,uint256)", +"7b1a547c": "registerAs(address,string,uint256,string,address)", +"7b1aa45f": "ownerDeposit()", +"7b1ae67a": "OrganicumOrders()", +"7b1b0c8a": "isWeekdayInsideTimestamps(uint256,uint256,uint256)", +"7b1b1de6": "pricePerToken()", +"7b1bc329": "bountySend(address,uint256)", +"7b1bd162": "NatureSeedToken()", +"7b1c5368": "fetchVoteMainInfoForVoter(address)", +"7b1c6c83": "MangGuoToken(string,string,uint8,uint256)", +"7b1c88be": "transferIncome(address,uint256)", +"7b1cbb13": "getChannelValue(bytes)", +"7b1cdd4f": "withdrawWallet3()", +"7b1e855a": "setBountyCoin(address)", +"7b1e8871": "_transferBilrew(address,address,uint256)", +"7b1f1f83": "SgdToWeiRateSet(uint256)", +"7b1f337d": "endingBlock()", +"7b23f37d": "ownerRandomNumber()", +"7b24343e": "salvageOtherTokensFromContract(address,address,uint256)", +"7b2454c2": "InvestmentAnalytics()", +"7b24d867": "TokensImport(address,uint256,uint256)", +"7b253fe6": "getWithdrawableAmountAS(address)", +"7b2581c2": "totalPurchase()", +"7b25aeca": "totalLimitUSD()", +"7b25de45": "isNewToken()", +"7b25ec58": "getTierTokens(uint8)", +"7b2643f2": "receiveNVT(uint256,uint256)", +"7b266b21": "durationh()", +"7b26de4b": "newPlayer(address,uint256,address)", +"7b26ff88": "JuryMemberAdded(string,address)", +"7b274afc": "stopIco()", +"7b27739c": "LSCKcoin()", +"7b283b71": "RATE_TIER1()", +"7b28aa4c": "orderCancel(address,uint256,address,uint256,uint256)", +"7b292909": "square(uint256)", +"7b294495": "lastActiveTs()", +"7b2abb34": "doProveMemoryRead(uint256,bytes32,bytes32[])", +"7b2b24e9": "isCurrentOrPastUser(address)", +"7b2bff9d": "getRobotsForUser(address)", +"7b2c5148": "catReleaseToPrice(uint32)", +"7b2c8905": "FailedToClaim(address,uint256)", +"7b2ca96c": "ProdPresale()", +"7b2d1b30": "getDragonPriceNo()", +"7b2d3b27": "getStageDiscount(uint8)", +"7b2e0046": "createAddress(bytes32,address)", +"7b2e5086": "withdrawFounderFunds()", +"7b2feaaa": "blockStart()", +"7b30074d": "trustedCancelOrderTransfer(address,address,uint256)", +"7b303965": "getStats(uint256)", +"7b304179": "createMainNetContract(uint256,uint256)", +"7b3051db": "get_minimum_trade()", +"7b30de25": "setConfig(string,string)", +"7b316db2": "enterBidForCollectible(uint256,uint256)", +"7b3179bc": "setEconomyParameters(uint128,uint128,uint128,uint128,uint128,uint128,uint128)", +"7b317ef6": "payoutPendingWithdrawl(uint256)", +"7b31db17": "intMax()", +"7b327104": "addBidToStack(bool)", +"7b32daf8": "contractTimeout()", +"7b3303b1": "startcrowdsale()", +"7b33e01a": "increaseApproval(address,uint256,bytes,string)", +"7b33fa25": "confirmReturn()", +"7b34203d": "getNumberOfDisputedStepsProPatient()", +"7b352962": "isFinished()", +"7b35819f": "setPresaleEndDate(uint32)", +"7b362143": "inactive_withdrawable()", +"7b36277e": "tier2Total()", +"7b367343": "IPv7Token()", +"7b370a01": "crowdsaleDistributedUnits()", +"7b37b6a3": "RAXToken()", +"7b38f391": "p1_white_duration()", +"7b3941d7": "Redeem(uint32)", +"7b395487": "voteForUltimateOutcome(bytes32,uint16)", +"7b3aa441": "contributeWithAddress(address)", +"7b3ae1f1": "addClaim(string)", +"7b3bfc35": "setRound(uint256,uint256,uint256,uint256,uint256,bool)", +"7b3c24ac": "compensate(uint256,address)", +"7b3ca1c6": "registerNameXname(string,bool)", +"7b3cf41a": "setExplosivePower(uint256,uint256)", +"7b3d398f": "getTicketHolderCount()", +"7b3d9338": "market_is_open()", +"7b3e2ce0": "BuyTicketUseVaultSeed(uint256)", +"7b3e5e7b": "amountRaised()", +"7b3ed808": "withdrawlOwner()", +"7b3f0fb7": "updateRevertSuspendedPayment(bool)", +"7b3fdcd8": "removeVerifier(address,address)", +"7b40b291": "RetractRoutingNS(bytes32,bytes32,uint256,bytes)", +"7b4126f4": "buyContent(bytes32,uint256,uint256,bytes8,string,address)", +"7b413985": "tokenValueInEther(uint256)", +"7b422184": "giveBirth(uint256,uint256)", +"7b424c0d": "changeRelease12m(address)", +"7b42f6f7": "intervalAt(uint256,uint256,int256,uint256)", +"7b436460": "Kubic()", +"7b436fa4": "garanteSystemDepositInOneFund()", +"7b43a8e6": "commits(address)", +"7b43adfb": "checkBalanceContract()", +"7b449206": "changeClearance(uint256,uint256,uint256,uint256,bool)", +"7b44eb51": "UPO(uint256,string,uint8,string)", +"7b464e93": "prescriptions(bytes32)", +"7b46b80b": "unfreeze(address,uint256)", +"7b473783": "EcoValueCoin()", +"7b47457f": "MintTokens(address,uint256)", +"7b47cb68": "lifeFactor_ii()", +"7b47ec1a": "burnToken(uint256)", +"7b48ba20": "testThrowDisownNotOwner()", +"7b48de6b": "returnTransactionPrices(uint256)", +"7b4938c3": "LinkNaturePower()", +"7b49e4c0": "DelphyToken(address[],uint256[])", +"7b4b5e4e": "changeYUMAddress(address,address)", +"7b4fcdcf": "GetAccess(address)", +"7b4fd96e": "token_price()", +"7b5005e8": "ZRXToken()", +"7b50a573": "functionOne(uint256,uint256,uint256,uint256)", +"7b510fe8": "getAccountInfo(address)", +"7b51c463": "hasDebris(bytes32,uint8)", +"7b523c35": "request(address,address,bytes,bytes,uint256,uint256)", +"7b5330a7": "getEntitlement()", +"7b540dd2": "ChangeHold(address,address,uint256,uint8)", +"7b54a994": "safeAdd(uint256,uint256,uint256,uint256)", +"7b550233": "deathData_v18()", +"7b55c8b5": "scheduleCall(address,bytes4,bytes,uint8,uint256[4])", +"7b55f66e": "manualCloseBet(uint16,uint16)", +"7b563e3a": "hourPotLeader()", +"7b564b7f": "test_insert_updateTail()", +"7b568081": "trade(address[],uint256,uint256)", +"7b575b33": "operate(bytes)", +"7b58120f": "preSaleSecondStartDate()", +"7b5825d5": "get_amount_buy(uint256)", +"7b58d46e": "changeWikiID_Name(uint256,string)", +"7b58d7ee": "Jawn()", +"7b599b5b": "COOLBTCEXCHANGE()", +"7b59af16": "registerName(string,address)", +"7b5a08c5": "TradeList(uint256)", +"7b5bc2e4": "isVoted()", +"7b5bd741": "getIdentityWallet(address)", +"7b5bee1d": "_getItem(uint256)", +"7b5c7b7b": "privilegedTransfer(address,uint256)", +"7b5cc75d": "lastDividendTime()", +"7b5d2534": "semaphore()", +"7b5d5d1a": "halvingStartBlock(uint256)", +"7b5e400d": "recipientsMap(bytes32)", +"7b5eb564": "approveWithData(address,uint256,bytes)", +"7b5ecb32": "test_twoValidEqUint2()", +"7b5f4fc9": "get_all_attender()", +"7b5f7267": "getTokenPriceUSDWEI()", +"7b61b201": "getHouseCard(uint8)", +"7b61c320": "tokenSymbol()", +"7b627879": "Conference()", +"7b632c41": "TimestampScheduler(address,address)", +"7b641fbc": "getMembers(bytes32)", +"7b647652": "LittleEthereumDoubler()", +"7b647d72": "BITIC()", +"7b65d0ec": "initialBuyCard(uint8,string,string,string)", +"7b663d30": "ChangeClaimAmount(uint256)", +"7b66c032": "HashBuxICO()", +"7b66da95": "calLast5RoundProfit(uint256)", +"7b66e17f": "getDonator(uint256)", +"7b6750bf": "getTokenDelegate(uint256)", +"7b680deb": "SpiceUpPrizePool(address,uint256,string,uint256)", +"7b68533f": "earlybird_percentage()", +"7b68a8f0": "getPixelColor(uint256)", +"7b698602": "NEXMESH()", +"7b69db5c": "increment(int256,int256)", +"7b6a3e27": "out2Done()", +"7b6a6f4a": "roundUp(uint256)", +"7b6a912c": "etherCost()", +"7b6ae58f": "AMICoin()", +"7b6b3f46": "preMining()", +"7b6c0492": "allowanceSubId(address,uint256,uint256)", +"7b6c4b27": "BidRevealed(bytes32,address,uint256,uint8)", +"7b6c4dc7": "AgriChainProductionContract()", +"7b6c7a14": "transferAuthorship(address,bytes32)", +"7b6ccf85": "LogRefund(bytes32,address,uint256)", +"7b6d79f1": "cancelBet()", +"7b6d7a4a": "VoteIntentionSet(uint256,bool,bool)", +"7b6e49a8": "fetchVoteNumForVoterByIndex(uint256,address)", +"7b6e7603": "levelClearTime()", +"7b6e8740": "changeCATDestinationAddress(address)", +"7b6f5a4c": "getCurrentRoundMinimumTime()", +"7b6ff689": "setImmediateAllowancePercentage(uint8)", +"7b70209f": "isBeneficiary()", +"7b7054c8": "__approve(address,uint256,address)", +"7b707e9c": "getNumberOfCreatedTokens()", +"7b70cdcd": "dayFor(uint256,uint256)", +"7b70ed51": "setAngelDate(uint256)", +"7b71aec8": "ethPropagate()", +"7b7330cc": "return_eth()", +"7b73aef8": "setNote(bytes32,bytes32)", +"7b73c2ef": "defaultDeadline()", +"7b74644d": "WKToken()", +"7b74e5c3": "buyByAddress(uint256,uint256)", +"7b755373": "amountPercentage(uint256,uint256)", +"7b75a302": "MatContract()", +"7b75ea7b": "rewardPayableDays()", +"7b760537": "updateLatestRevision(bytes20,bytes32)", +"7b7670f6": "gasForXaurDataUpdateAtBlock()", +"7b76ac91": "day()", +"7b775ec3": "wallet89()", +"7b777517": "teamVestingStages()", +"7b777ecc": "getMaxReportsPerLimitedReporterMarket()", +"7b77bbc8": "dyn_call(address,bytes)", +"7b789b3d": "agreement(bytes,bytes,bytes)", +"7b7a43eb": "setMINfinney(uint256)", +"7b7a720a": "chrissycoinToken()", +"7b7b81c5": "loikikdi()", +"7b7c343d": "setRequiredConfirmations(uint256)", +"7b7ccc66": "burnSaleTokens()", +"7b7d4655": "releaseTokenCornerstone()", +"7b7d6c68": "setController(address,address)", +"7b7d7225": "_approve(address,uint256)", +"7b7d8888": "permanentlyOwnMyCompany(bytes32)", +"7b7e97f1": "isIncluded(uint256,uint256)", +"7b807a51": "devTimeLock()", +"7b80889b": "lockedBalance()", +"7b80a0ca": "endEarlyStage2()", +"7b8108c6": "isIn(address,address[])", +"7b813089": "team4Token()", +"7b816719": "testToInt(bytes)", +"7b81c3cd": "claimIcoContribution(address)", +"7b8208b7": "destroyUselessContract()", +"7b821410": "createPlotVineyard(address)", +"7b8239fa": "fun3()", +"7b82d9ee": "canDouble(address)", +"7b830854": "unlockTokenTransfers()", +"7b831c30": "isRoundEnded(uint256)", +"7b834bcc": "marketTime()", +"7b841eff": "turnOffCanUpdatePercentToTakeAsSeed()", +"7b84de4e": "StarFishCoin()", +"7b851f65": "hasIcoEnded()", +"7b86120a": "foundersReserve()", +"7b865061": "CAPToken(address)", +"7b87312a": "timeToOpenPresents()", +"7b875aab": "addrSale()", +"7b891cf7": "YBCLiveToken()", +"7b898c71": "_checkLoanBalance()", +"7b89a582": "Management()", +"7b89eef2": "getMyAverageDividendRate()", +"7b8a1898": "setStore(string)", +"7b8ac66b": "deliver(uint256,uint256)", +"7b8b7364": "isAddressVerified(address,address)", +"7b8b82a8": "createManyProxies(uint256,address,bytes)", +"7b8bf4fd": "set_fee(uint256,uint256,uint256)", +"7b8c0e0f": "offlineExchange(address,uint256)", +"7b8cfbe1": "howManyEtherInWeiToKillContract()", +"7b8d56e3": "setValue(uint256,uint256)", +"7b8d771e": "_buyTicket(uint256,address)", +"7b8d9930": "AxieDependency()", +"7b8de6d0": "executeTokenFallback(address,uint256,bytes)", +"7b8e3514": "allowedValidators(address,address)", +"7b8e7964": "JPGToken()", +"7b8e8bdd": "modifyCloseTime(uint256)", +"7b8eeb96": "StarMarket()", +"7b8f186e": "updateIdx()", +"7b8f2e07": "addCreature(uint16,uint8,uint8)", +"7b8fa867": "setAllowedAdd(address)", +"7b8fac4f": "AC(uint256,string,string)", +"7b907094": "solidityCompileVersion()", +"7b926c2a": "IFSBalances(address)", +"7b929c27": "development()", +"7b92a2de": "Reservation(address)", +"7b93253c": "validateClaim(address,bytes32)", +"7b9358a0": "changeRegistrationStatuses(address[],bool)", +"7b936934": "artistFees()", +"7b936ac2": "getCFO()", +"7b9417c8": "addAddressToWhitelist(address)", +"7b94ffb5": "grantBounty(address,uint16,string)", +"7b9504d5": "_isOwner(address,uint40)", +"7b965785": "EVER()", +"7b969dcd": "_checkPixelAboveLeft(uint256)", +"7b97008d": "purchaseTokens(uint256)", +"7b979b41": "leakEther()", +"7b97c621": "Transferred(bytes32,address,address)", +"7b9884b9": "addallrunmoney(address[],uint256[])", +"7b991c1a": "findEmptySlot(uint32)", +"7b9940b6": "initambassadors_()", +"7b9a3f4c": "TotalFunds()", +"7b9a9926": "RESToken()", +"7b9b9c89": "augmintToken()", +"7b9c34e0": "requestRN(uint256)", +"7b9c4756": "SanchitToken()", +"7b9c5794": "test_YayIsOverSixtyPercent()", +"7b9c7437": "LUCToken(uint256)", +"7b9daba8": "wa()", +"7b9dbf95": "FulfillmentAccepted(uint256,address,uint256)", +"7b9dc066": "tokenTransfersFrozen()", +"7b9e5bec": "getAsBytes(uint256,uint256)", +"7b9e9073": "buyLimitSupplyMin()", +"7b9f87d3": "Setup(address,address)", +"7b9fa595": "_getCrowdsaleTokenAmount(uint256)", +"7ba016d0": "icoDiscountLevel2()", +"7ba04809": "assertFalse(bool,string)", +"7ba0e2e7": "mint(bytes)", +"7ba121ff": "EventBonusPercentChanged(uint256,uint256)", +"7ba1e407": "tokenBack(address[],uint256[])", +"7ba201c5": "refundSingleUser(address)", +"7ba22e1e": "changeWorkerBalance(address,uint256)", +"7ba36880": "_secondLevelEth()", +"7ba38916": "changeAdminFromBoard(address)", +"7ba3c804": "AiEXToken()", +"7ba3f08d": "grantPermissionTo(address)", +"7ba46004": "totalRuneWithdrawn()", +"7ba49b81": "lastMintedTimestamp(address)", +"7ba4a58a": "addressToken()", +"7ba5f145": "mod256(uint256,uint256)", +"7ba64e40": "removeBeneficiary(address,uint256)", +"7ba70bf2": "gettoken(address)", +"7ba79848": "processReferral(address,uint256,uint256)", +"7ba7acc9": "initTokenSale(address,address,uint256,uint256,uint256,uint256,uint256)", +"7ba7dcea": "setRefundable()", +"7ba8c064": "VotedEvent(uint256,address,bool,uint256,string)", +"7ba8c12d": "addWhitelistUser(address,uint256)", +"7ba992fc": "PeriodicTokenVesting(address,uint256,uint256,uint256,uint256,bool,address)", +"7baa4524": "emptyRemainingsToOwners()", +"7baa73c6": "_updateCreditedPoints(address)", +"7bab59f4": "feedTransfer(address,address,uint256)", +"7babf021": "RLCOIN(uint256,string,string,bool)", +"7babfffc": "transferDelegation(address)", +"7bacd526": "withdraw_admin(uint256)", +"7bacfb0c": "PresaleEndTimeChanged(uint256)", +"7badc7af": "gaveVote(address)", +"7bae0585": "approveMany(address[],uint256[])", +"7bae3f27": "changeTransferFeeOwner(address)", +"7bae50e0": "mintGen0Spinners()", +"7baf5b84": "startUnlock()", +"7baf71f9": "claimPrizePool(address,uint256)", +"7bb050cf": "migratePlayerPhrasesData(uint256,uint256,uint256)", +"7bb0688d": "claimedUsers()", +"7bb0aefe": "hasAuthoritySignedMainToSide(address,address,uint256,bytes32)", +"7bb0b3c6": "checkifCapHasReached()", +"7bb1a312": "transferToTeam(address,uint256)", +"7bb1efa1": "manualInitializeTreasure(uint256)", +"7bb20df6": "isExistingBattle(string)", +"7bb25d60": "withdrawInProgress()", +"7bb26a1b": "ethFoundDeposit()", +"7bb305ef": "set_foundtion_addr(address)", +"7bb31dbb": "calcBetResult(uint256,bytes32)", +"7bb333d6": "EBankerICO(address)", +"7bb34a23": "bva(address,uint256,uint256,address)", +"7bb3546b": "hgs()", +"7bb3ca86": "addReferralHashrate(address,uint256)", +"7bb43e6e": "returnUnsoldSafeXLarge()", +"7bb4493c": "FBI()", +"7bb476f5": "getAvailableAmount()", +"7bb4c4da": "nAuditorsAlarm()", +"7bb55287": "assignRaffleWinner(address)", +"7bb5e1d1": "Cowboy()", +"7bb6a4c6": "uno(uint256)", +"7bb6fc6b": "LoveToken(uint256,string,uint8,string)", +"7bb7adb6": "hugeContributionBound()", +"7bb866c1": "GetBoosterCount()", +"7bb8c4e5": "setCut(uint16)", +"7bb96acb": "getBlockHeight()", +"7bb98a68": "balances()", +"7bb9c776": "ticket(bool)", +"7bb9dc13": "setPublicSaleWallet(address)", +"7bba0613": "attackCountry(uint8)", +"7bbb3a60": "inactivityTimeout()", +"7bbba97e": "CreateEstate(address)", +"7bbbd75b": "_getNow0()", +"7bbbe9fd": "claimGameReward(address,uint256,uint256)", +"7bbc101b": "distributionStart()", +"7bbc33f0": "vet(address,bool)", +"7bbc5c01": "calcRefund(address)", +"7bbc816e": "UTCToken(uint256,string,string,uint256)", +"7bbd3f19": "removeLastRace()", +"7bbf2300": "claimAccountOwnership(string,string,uint256,uint256)", +"7bbf4a3f": "callers(address)", +"7bbfb0bd": "startTokenPriceWei()", +"7bbfbaee": "MAX_SUPPLY_USPN()", +"7bc046ef": "ClaimRemoved(address,address,bytes32,uint256)", +"7bc0e005": "setDirectDebit(bool)", +"7bc0ff20": "setupExportFee(address,uint256)", +"7bc120c2": "isView()", +"7bc14a67": "Initial_Supply()", +"7bc21b6b": "bbAdvisorWallet()", +"7bc25372": "UserCheckBalance(address)", +"7bc25da8": "Alaves()", +"7bc363f9": "serviceTransferOwnership(address)", +"7bc36e04": "setPrivateSalePrice(uint256)", +"7bc49a95": "play(uint256,uint256)", +"7bc4be40": "isGlobalLock()", +"7bc4d6a6": "testInitial1of3()", +"7bc58805": "balanceFinney()", +"7bc5af10": "getAwarding(address,bytes32)", +"7bc62dc3": "ALD()", +"7bc69bbc": "getBonusByRaised()", +"7bc6a02e": "isAutoridadElectoral()", +"7bc6aa07": "omniTeamAddress()", +"7bc74225": "getTotalStake()", +"7bc76388": "test_set_owner()", +"7bc775db": "GxOwned(address)", +"7bc835da": "UpdateConfirmed(address,address,uint256)", +"7bc8649f": "NewTKLNToken(address)", +"7bc89ae7": "registerNameXNAME(string,address)", +"7bc9165b": "offchainPayment(address)", +"7bc94872": "FinishReceivingContributions()", +"7bc9d4ba": "TielseEendrachtCombinatie()", +"7bc9eb8c": "p_setSoft_deadline_duration(uint256)", +"7bca38be": "heartbeatTimeout()", +"7bcaf585": "checkSignature(string,uint32,string,string,bytes32,bytes32,uint8)", +"7bcc1ff6": "allowanceInternal(address,address)", +"7bcc9c6f": "sendBackTokens()", +"7bcd7fad": "getRecordAtIndex(uint256)", +"7bcdc2f0": "_forwardApprove(address,uint256,address)", +"7bcdfd4f": "setEpochData(uint64,uint64,uint256)", +"7bce366f": "minBlockPurchase()", +"7bce89cc": "currentMarketRate()", +"7bd13f08": "recoverAddressFromBalanceProof(uint256,bytes32,uint256,bytes32,bytes)", +"7bd1a731": "deleteIdentity(string,string)", +"7bd216c6": "teamAddressThree()", +"7bd2593d": "XfiniteUtility()", +"7bd26969": "ChannelNew(address,address,address,uint256)", +"7bd2bea7": "gem()", +"7bd352b7": "relay(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32,uint8,uint128)", +"7bd379b3": "PaymentProcessed(address,uint256,uint256)", +"7bd3acbb": "pointArrayOf(uint256)", +"7bd53618": "TaiyuanCoin()", +"7bd63411": "defaultPercent()", +"7bd6c0e4": "setMigrationHost(address)", +"7bd703e8": "getBalanceInEth(address)", +"7bd7c0ac": "armyDronesCount(uint256)", +"7bd7c891": "becomeFalconmaster()", +"7bd85cb3": "LZLTokenDeposit()", +"7bd95a85": "rewardPoints(address)", +"7bd97ca7": "editMemeTemplate(uint256,string)", +"7bd9e8fd": "CTO_SHARE()", +"7bd9f47a": "Best_Bank_with_Interest()", +"7bdb7a90": "setCdRate(uint256)", +"7bdbab0c": "tokenMintInit()", +"7bdc011e": "Pray4Prey()", +"7bdc297c": "TimeLockedWallet(address,address,uint256)", +"7bdc60d9": "getTokenById(uint256)", +"7bde5628": "addNuja(address)", +"7bde7fcf": "maxApenSell()", +"7bde82f2": "redeem(uint256,address)", +"7bdef3f8": "gameMiningTokenCap()", +"7bdf9d56": "MANHATTANPROXY5THST()", +"7be00510": "lastInvest(address)", +"7be122a3": "isSchoolAllowed(uint256)", +"7be1e747": "initAddress()", +"7be266da": "isRegisteredInPreviousEpoch(address)", +"7be296d8": "filmamount()", +"7be2d5a2": "setDropNumber(uint8)", +"7be33b36": "getSoundcoinsAddress()", +"7be34109": "diffMonths(uint256,uint256)", +"7be4ce4b": "updateRngAddress(address)", +"7be4ed55": "fixPayAmt()", +"7be5b5ae": "setBuyDirectMode(bool,address)", +"7be68454": "optionsRegistryAddress()", +"7be6d2de": "transferToContract(address,uint256,bytes,bool)", +"7be80b39": "forceWithdraw()", +"7be8352e": "getPixelCount()", +"7be8630f": "lastHotPotatoHolder()", +"7be8f86b": "done(address)", +"7be96b1a": "AAA(address,uint256)", +"7bea7112": "TheOneToken()", +"7beb2e1e": "minNumbPerSubscr()", +"7beccd70": "revokeTransferManager(address)", +"7becd54a": "destErc20()", +"7bedcb7f": "DemirPara()", +"7bee30ce": "createSspAndChannels(address,uint256,string,address[],address[],uint256[],address,string,bytes,uint32[])", +"7bee86d6": "lastImageId()", +"7beeb945": "isRole(address)", +"7bef29f7": "BittechToken()", +"7bf08621": "payTo(address,uint256)", +"7bf0a8f3": "operationsTokens()", +"7bf0cd0d": "getTargetBlock(uint256)", +"7bf0e054": "getLotteryDetailsB(int256)", +"7bf1648a": "setContract(uint256,address,address)", +"7bf1a627": "ethToken()", +"7bf1ca1f": "TransferToken(address[],uint256,uint256)", +"7bf212f8": "getCondition(uint256)", +"7bf21aa4": "generatePresaleHouses()", +"7bf21ab8": "sellPBTTAgainstEther(uint256)", +"7bf26182": "calculateVestedTokens(bool,uint256,uint256,uint256,uint256,uint256,uint256)", +"7bf2bb10": "arbiters(address)", +"7bf3f900": "gameManagerPrimary()", +"7bf437e6": "transferCoinUserToUser(address,address,uint256)", +"7bf47cda": "cancelSellOrder(address,uint256,uint256,uint256,uint256)", +"7bf4b18f": "tokenSetMintFeeAbs(address,address,uint256)", +"7bf57ca8": "_taxesDue(address)", +"7bf5b04b": "processDividends()", +"7bf5b5d6": "distributeWalletTokens()", +"7bf6f26e": "setMaintenanceMode(bool)", +"7bf796dc": "SmartAgreement(bytes,address[])", +"7bf92690": "changeArrangerFee(uint256)", +"7bf992ac": "GoodKarma(uint256,string,uint8,string)", +"7bf9d052": "firstRankForFree()", +"7bfa6e1a": "gameShouldRestart()", +"7bfaad96": "addNode(bytes,address)", +"7bfb0934": "value(bytes32)", +"7bfbe091": "creatorRejectRequestFundTransfer(uint256)", +"7bfbfecb": "BurnCoin()", +"7bfe950c": "withdraw(address,address,uint256,uint256)", +"7bfe97ce": "IBMISOFT()", +"7bff0a01": "createRandomZombie(string)", +"7bff9797": "canTeamKeepingWithdraw(uint256)", +"7c0012d4": "ZiipToken()", +"7c0081f5": "petCardSeriesCollection(uint8)", +"7c0176df": "starUp(uint256,uint256,uint256,uint256)", +"7c0207cb": "isActiveTranscoder(address,uint256)", +"7c024fe2": "getNowTimestamp()", +"7c027ed9": "bonus01Start()", +"7c02e1ea": "addressChangeBlock()", +"7c03d6f9": "ApprovalFlower(address,address,uint256)", +"7c051d47": "seedSaleFinished()", +"7c052478": "setSports3DContract(address)", +"7c05ba7a": "accreditInvestor(address,address)", +"7c05caf3": "testCreateCostAuth()", +"7c0656ac": "LogEtherBounty(address,uint256,string)", +"7c06db04": "doManualTrade(address,address,uint256)", +"7c06eb7c": "IGTRMB()", +"7c0712ae": "setAdd(bytes32,address)", +"7c07329f": "returnUserBalance(address,address[2],uint256[8],uint8,bytes32[2])", +"7c078723": "saleExchangeRate4()", +"7c08ab5b": "BITToken()", +"7c098bc3": "getBonusPercent(uint256)", +"7c0a893d": "blockAccount(address)", +"7c0ab7be": "setBidding(uint40,uint256)", +"7c0b2484": "enableInviteOfSU(string)", +"7c0b582f": "WORLD1Coin()", +"7c0b8de2": "NFT()", +"7c0c19b3": "zrcoin(uint256,string,uint8,string)", +"7c0cc0be": "setActivator(address)", +"7c0d021e": "CreateIssue(uint256,uint256,uint256,address)", +"7c0e2a5a": "SetLockDate(uint256)", +"7c0efb8b": "revokeManagerPermission(address,string)", +"7c0f6b35": "getAllMembers()", +"7c0f884b": "SlidebitsTestToken(string,string)", +"7c0fbc31": "signedTransferCheck(address,address,uint256,uint256,uint256,bytes,address)", +"7c0ff00c": "WithdrawTokensToBankroll(uint256)", +"7c1008d5": "getLastTipTime(address,bytes32)", +"7c108f84": "UBToken()", +"7c10e00e": "setMinBetForOraclize(uint256)", +"7c116ec9": "respectRequiredToRecruit()", +"7c11ef87": "calcUSE(uint256,uint256,uint256)", +"7c1288b5": "distAgent()", +"7c129c1c": "voteXId(uint256,bool)", +"7c12b6f2": "_handleWin(uint256,uint256)", +"7c12f1a4": "addgamecard(string,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"7c132f2c": "crossForkBlockNumber()", +"7c134a38": "DetailedERC20()", +"7c13b331": "OysterShell()", +"7c13ed68": "setIPGInfo(address,address)", +"7c153534": "tokenFrom()", +"7c157d12": "_synthesizeWith(uint256,uint256)", +"7c1595f2": "setLockupContract(address)", +"7c161409": "BetexToken(uint256,uint256)", +"7c163fb8": "myLoveBlocks()", +"7c170237": "ElectroneumGold()", +"7c1716af": "payToken(bytes32,uint256,address,bytes)", +"7c17357d": "totalVesting()", +"7c17dc02": "AddFish()", +"7c183b4b": "LogRef(address,address)", +"7c18a32f": "deductionToken(address,uint256)", +"7c194295": "BurnableTokenMock(address,uint256)", +"7c197c09": "fullSupplyUnlocked()", +"7c19e1f0": "replaceInFrontRequest(address,uint256)", +"7c1a35d7": "RECYCLE_TIME()", +"7c1a4ee8": "SITExchanger(address,address,address)", +"7c1b6afe": "getGrantCount()", +"7c1b814f": "openCrowdFunding(bool,uint256,uint256)", +"7c1c05dd": "gapInPrimaryCrowdsaleAndSecondaryCrowdsale()", +"7c1c7860": "TMEDsalesToken()", +"7c1e5ced": "transferTemp(address,uint256)", +"7c1f9d5e": "tokenFeeMin()", +"7c204c27": "MinerX()", +"7c21ae12": "activeShareholdersArrayLength()", +"7c21c7e2": "getToggleOwner(uint256)", +"7c22232a": "playersPoints(address)", +"7c236c3b": "confirmStackholderTransaction(uint256)", +"7c23d1cb": "removeLevel(uint256)", +"7c2464f3": "startICOTime()", +"7c24b295": "votedYes()", +"7c24dfb0": "FundTransfer(address,string,uint256)", +"7c25d997": "getRarityValue(uint256)", +"7c25f260": "Government()", +"7c261929": "query(string)", +"7c262269": "isWorkFailState()", +"7c265200": "NameGame(uint256,uint256,uint256)", +"7c267b07": "Cryptrust()", +"7c280f44": "generate_random(uint256,string)", +"7c28ddc1": "fiatPerAssetUnit()", +"7c2926a8": "getHTLCHash(uint256,uint256,uint256,bytes32,int256)", +"7c29c514": "AgroeconomyToken()", +"7c29e89a": "mintUnlockTimeBatch(address[],uint256[],uint256)", +"7c2b00fc": "SGCL()", +"7c2b07e3": "EtherX()", +"7c2b11cd": "arraySum(uint256[])", +"7c2b606a": "isAddressManager(address)", +"7c2b8d0a": "votedFreeze(address)", +"7c2cf543": "ROLCToken()", +"7c2d2326": "PostIL()", +"7c2d86f7": "usePluginWhitelist()", +"7c2da7aa": "setValue(string,uint256)", +"7c2db5ff": "payoutX(address,uint256)", +"7c2e08a3": "isMinimumGoalReached()", +"7c2eb1c8": "distributeEther(uint256,uint256)", +"7c2efcba": "v()", +"7c2ffbb3": "returnRate()", +"7c3064f1": "refundStake()", +"7c313baa": "buyPriceAtIndex(uint256)", +"7c31975f": "SolClub()", +"7c320853": "initialSale()", +"7c331b52": "FlightDelayAddressResolver()", +"7c337086": "CryptoDegree()", +"7c33774d": "CluckCoin()", +"7c3382ae": "setIcoTokenExchangeRate(uint256)", +"7c33ebfd": "transferToMany(address[],uint256[])", +"7c34689b": "ACchainToken()", +"7c34752f": "stringToSig(string)", +"7c34e853": "getCombinedTotalHP(uint256,int256)", +"7c35384f": "addTradeRecord(uint256,uint256,uint256,uint256,address,address)", +"7c359dc3": "manualTokenTransfer(address,uint256)", +"7c35b6ed": "setPriceBeforeGoalReached(uint256)", +"7c35be7a": "isOpen(bytes32)", +"7c360d1e": "calculate(uint16,uint8)", +"7c3625e3": "SatoExchange()", +"7c366cb5": "LADToken()", +"7c372277": "ReserveTokensHolder(address,address,address)", +"7c37559e": "CreateGLX(address,uint256)", +"7c37605c": "startSellingGenes(uint256,uint256,address)", +"7c377d74": "getForkReputationGoal()", +"7c38ce18": "tokensIssuedLocked()", +"7c38ee53": "addContactRecord(string,string,string,address,string,string,int256,string,int256,address,string,int256)", +"7c396b83": "f6()", +"7c39759b": "kscBurnWhenMoveToMainnet(address,uint256,string)", +"7c399142": "ITSToken()", +"7c3a00fd": "interestRate()", +"7c3a1d32": "setWithdrawCreator(address)", +"7c3aef0e": "cardDescription(uint8)", +"7c3b1e06": "setcompany(string,uint256,string)", +"7c3ba89e": "early_bird_minimal()", +"7c3be5fb": "setVernamOriginalToken(address)", +"7c3bf42d": "applications(address)", +"7c3c0f89": "eastadsCredits()", +"7c3c2611": "Retained(address)", +"7c3c4c83": "ARBITRAGECrowdsale(address,address)", +"7c3d30fd": "_bid(uint256,uint256)", +"7c3e50ff": "balanceLocked(address,address)", +"7c3eef61": "AbyssToken(address,address[],address)", +"7c3fe278": "endSto()", +"7c3ffdee": "awardCup(uint8)", +"7c405325": "unlockTokens(uint256)", +"7c4057ae": "removeMasterNodes(address,uint256)", +"7c41de34": "_AwardedMissedBlockBonus(address,address,uint256,bytes32,uint256,uint256)", +"7c423f54": "getAlerters()", +"7c4338af": "getEarlyIncomeBalance(address)", +"7c434fbb": "AT(uint256,string,uint8,string)", +"7c435e6f": "updateEursPerEth(uint256)", +"7c436a6d": "ownerEnableRefunds()", +"7c437918": "addPreSaleBuyer(address,uint256)", +"7c44066c": "summCashwolf()", +"7c44546e": "SiliconValleyToken()", +"7c44f160": "Tier_Starter_Registration()", +"7c45c98a": "removeSpectatorBetFromGladiatorBattle(uint256)", +"7c45ef6c": "stringToSig(string,string)", +"7c46a5e7": "Unhalted()", +"7c4734f4": "getParticipantsHash(address,address)", +"7c475ade": "IOV()", +"7c479343": "investSum()", +"7c47965e": "isInCurrentGeneration()", +"7c47ac44": "getProjectVerification(uint256)", +"7c47df2f": "removeEligibleBurner(address)", +"7c48bbda": "tokensIssued()", +"7c48f8e7": "penaltyFraction()", +"7c4a0552": "freezeBlocks()", +"7c4a7831": "concludeSeason(int8,uint256,uint256)", +"7c4aa44c": "saleStartEpoch()", +"7c4b414d": "depositTokens()", +"7c4c27c8": "isThisPuritanicalVersion()", +"7c4cafd9": "startSecondaryCrowdsale(uint256)", +"7c4d18bd": "setMockBool(bytes4,bool)", +"7c4d972b": "setRoundEnd(uint256,uint256)", +"7c4db77d": "saleWallet()", +"7c4deecb": "checkGameContinues()", +"7c4e7fbb": "QKL()", +"7c4ecead": "startPresale(uint256,uint256)", +"7c4edde7": "withdrawFrom(address,address,address[])", +"7c4f8958": "SPECIALIST_STAKE_ONE()", +"7c513a21": "arrIdx2lost(uint256)", +"7c519ffb": "setTrading()", +"7c524b2e": "set_sell(bool)", +"7c52b934": "getTokenOrder(uint256)", +"7c535f1f": "bonusAmount(uint256,address)", +"7c54aa1a": "deployCommunityBallot(bytes32,bytes32,uint128)", +"7c559d5f": "bonusPattern(uint256)", +"7c567bfe": "isSale(address)", +"7c56b798": "addProject(address)", +"7c56d40b": "LogFunderInitialized(address,address,string,uint256)", +"7c57ad45": "newAsset(string,uint256,string,string)", +"7c57d947": "tokenMinter(uint256)", +"7c5817e1": "indexOfProvider(address)", +"7c582304": "updateInvestmentTotal(address,uint256)", +"7c58a4ed": "canPlatformFundingWithdraw(uint256)", +"7c59cb3d": "setCSInterface(address)", +"7c59f828": "getWizzType(uint256[2])", +"7c5b4a37": "adminWithdraw(uint256)", +"7c5b5b06": "lastProcessedVaultId()", +"7c5bfe81": "INITIAL_EXCHANGEABLE_TOKENS_VOLUME()", +"7c5c2cef": "nPolls()", +"7c5ca5a6": "ICOFY()", +"7c5d4949": "calcInvesting(address)", +"7c5d7980": "addRC(address)", +"7c5df29b": "auctionDeklaEnd(address,uint256,uint256,bytes)", +"7c5e16fd": "MAX_ALLOWED_BY_STAGE_2()", +"7c5e2795": "INITIAL_PRICE()", +"7c5e6949": "setlvlUpdate(string)", +"7c5e83cc": "Bullex()", +"7c609885": "allowWorkersToContribute(address,address[],address)", +"7c60fa60": "minReq()", +"7c612409": "setClient(address,address,string,string,string)", +"7c61b482": "coinAgeRecordForAddress(address,address,uint256)", +"7c61d567": "transferRegion(uint256,uint256,address)", +"7c622a65": "TEBT()", +"7c623ce2": "boughtWithWhitelist()", +"7c62965e": "excess_withdraw()", +"7c62e2a4": "getDog(uint256)", +"7c63144e": "TokenUsed(uint8,uint8)", +"7c645c21": "getPlayerLength()", +"7c64a45c": "TOTAL_VOTE_PERIOD()", +"7c64ac43": "vestingEnds()", +"7c652e26": "CENT_DECIMALS()", +"7c654303": "isFunded()", +"7c65452c": "newValue()", +"7c65f503": "initVault()", +"7c66ae22": "play(uint256,uint256,address)", +"7c674695": "MarkedAsScam(address,address,uint256)", +"7c67fb9f": "MIN_STARTING_PRICE()", +"7c67fdf5": "bltOwnedAcc()", +"7c67ffe7": "ownerSetBankroll(address)", +"7c686c15": "setBonusPrice()", +"7c68bebe": "getUserDepositsAmount(address)", +"7c68e078": "_createMonster(uint256,uint256,uint256,uint256,uint256,bytes,address)", +"7c68ec4c": "_compareStrings(string,string)", +"7c695384": "bet(uint8,uint256)", +"7c699401": "getAllRevisionIpfsHashes(bytes32)", +"7c69b5d1": "NewDeposit(uint256)", +"7c69ef8d": "market2020TokenCreated()", +"7c6aafd1": "getRegularCarsForVariant(uint256)", +"7c6ac2af": "withdrawal_Lem(uint256)", +"7c6b2d6a": "setV_R1(uint256)", +"7c6b5b10": "amountFirst()", +"7c6bd3e8": "preGrant(address,uint256)", +"7c6bd96d": "extendStart(uint256)", +"7c6db9b5": "changeMinimumWei(uint256)", +"7c6e19a8": "UpdateTokenDailyExchangeAmount(address,address,uint256)", +"7c6e481c": "bancorChanger()", +"7c6e5809": "AEZtoken()", +"7c6e607d": "SuicideContract()", +"7c6e94e3": "migrationStarted()", +"7c6eb7bb": "generateNewRandom()", +"7c6fa5c2": "attackPrizeRatio(address)", +"7c6fb02a": "getCrydrViewStandardName()", +"7c6fb59d": "updateCreditBalance(address,uint256,uint256)", +"7c6fdec5": "getStrategyTokenPrice(uint256,uint256)", +"7c6fe7a9": "getAddressIdArray(address,uint256,string,string)", +"7c709fbe": "mxrjjToken()", +"7c70b205": "windowLength()", +"7c70c444": "DOXToken()", +"7c70e791": "removeInspector(address)", +"7c70e7fe": "currentRewardReleasePercentageRatePerYear()", +"7c71c0eb": "getIsProjectBonus()", +"7c7202e5": "setReceiver2()", +"7c72d868": "sendDividendsEthers()", +"7c72e273": "auctionFinalize(bytes32)", +"7c73f846": "getMinimumEndowment(uint256,uint256,uint256)", +"7c74d4d4": "JCCoin()", +"7c759d0d": "lock(address,uint256,uint256,uint256,uint256)", +"7c75c1b4": "distributeWithPolicy(address,uint256,uint8)", +"7c774111": "OF()", +"7c77b7c4": "getNumberOfDisputedDealsProDoctor()", +"7c77fad6": "AddMatch(string,string,uint256)", +"7c78cb13": "decrementQuantity(uint256)", +"7c7959e0": "CryptoNumismat()", +"7c796a83": "setGasUsage(uint256)", +"7c799e90": "str2bytes(string)", +"7c79c167": "stageHardcap(uint8)", +"7c79ebce": "expired(uint64)", +"7c7a52bf": "newChallenge(uint256,address)", +"7c7b0ff4": "getRide(uint256)", +"7c7b13b0": "PlayX50()", +"7c7c7695": "getAccountID(address)", +"7c7c7c3c": "SUPER_ADMIN()", +"7c7ce7df": "mintToPool(uint128,uint256,uint128)", +"7c7d14cf": "getPawnId(uint256)", +"7c7d809b": "saleEndUnixTime()", +"7c7dc098": "early_supporters_distribution(address[],address,address,uint256)", +"7c7dd391": "TokensWithdraw(address,address,uint256)", +"7c7ead51": "Wscchain(uint256,string,string)", +"7c7edd68": "PRHXToken()", +"7c7eeaa1": "hirerLastResortRefund(bytes16,address,address,uint256,uint256)", +"7c80bb4f": "getNameByAddress(address)", +"7c80feff": "getTokenIndicies(address,address[])", +"7c812015": "HedgeCoinCapitalToken()", +"7c81ff56": "TGE_SUPPLY()", +"7c8255db": "sendGifts(address[])", +"7c82a1d4": "reserveKY()", +"7c82eff7": "getZero(uint256)", +"7c831bd9": "rateCoefficient()", +"7c83b25c": "gettimelineandgoal()", +"7c83fdf7": "createFiatInvestorRequest(uint256)", +"7c842e5e": "updatePriceFromRealUnicornPrice()", +"7c84b40c": "makePrivate()", +"7c84c69b": "assertEq(bytes32,bytes32)", +"7c853cc1": "WithdrawFromKickTheCoin()", +"7c857566": "destructGame(address)", +"7c858e02": "smallestUnit()", +"7c85a757": "updateGooConfig(address)", +"7c85ab3a": "boardMemberCancel()", +"7c85df24": "setWHaddress(address)", +"7c871d31": "setIcoDates(uint256,uint256)", +"7c88e3d9": "mintBatch(address[],uint256[])", +"7c89e504": "removeSomeEthers(uint256,address)", +"7c8af704": "resolveRound()", +"7c8b1fa2": "ShNShToken()", +"7c8c2234": "pushMilestone(uint16,string,string,uint64,bool)", +"7c8c6643": "unhint(bytes32)", +"7c8d56b8": "numeraiTransfer(address,uint256)", +"7c8db773": "CSE()", +"7c8dc575": "rejectConsent()", +"7c8de59a": "DCM(uint256,string,uint8,string)", +"7c8e040f": "confirmAtkBossQuest(address)", +"7c8e17e5": "teamOneTotalPlayers()", +"7c8e4e25": "credosReserveAccount()", +"7c8e8e69": "MarkLesterMiranda()", +"7c8f76a1": "issueTokens(address[],uint256[])", +"7c8f8278": "setTotalTokenSupply(uint256)", +"7c8ff8ac": "tokenProof(uint256)", +"7c905c9f": "preICOprice()", +"7c9143c9": "_hash(uint256,bytes32)", +"7c91e4eb": "DISTRIBUTION()", +"7c92a217": "c_MinFunds()", +"7c930a10": "ETHERECASHTOKEN(uint256,string,string)", +"7c935183": "test_deposit()", +"7c937700": "revokeAllVulnerable()", +"7c9473f6": "sellNoDecimals(address,uint256)", +"7c94830b": "kairosOwner()", +"7c9542bd": "LogWalletUpdated(address)", +"7c955583": "pendingWhitelistHash(address[])", +"7c95ef3f": "privatePlacementSupply()", +"7c9677be": "allocateTeamToken()", +"7c968f5d": "get_token_data_buyable(uint256)", +"7c96f680": "MyAdvancedToken(uint256)", +"7c97479b": "cardSupply()", +"7c976dbd": "tokenCreationCapOverall()", +"7c97ffe2": "DeusToken()", +"7c987ba4": "getMemberPayed(address)", +"7c989b45": "setBonus(uint256,uint256,uint256,uint256,uint256,uint256)", +"7c996d9e": "IndiaStocksCoin()", +"7c99922d": "founderTokensVested()", +"7c9b0892": "lnUpperBound(uint256,uint256)", +"7c9b387b": "maximumClaimPriceWei()", +"7c9c3d89": "mintCoinsForOldCollectibles(address,uint256,address)", +"7c9cbd38": "changeTeamTokens(address)", +"7c9cd7df": "changeDeveloper_only_Dev(address)", +"7c9d564f": "_pRand(uint256)", +"7c9d8bdb": "getBetsByCategory(bytes32)", +"7c9f4941": "SplitSend(address,address)", +"7c9fe2a7": "train2(uint256)", +"7ca005b3": "generateProof(string,address,address,uint8)", +"7ca013e6": "getRateToPxlAmount(uint256,uint256)", +"7ca01b2a": "getTestFour()", +"7ca1a66c": "resumeLotto()", +"7ca1cb48": "approveCurrencyTokenAddress(address,bool)", +"7ca21b37": "setMinPersonalCap(uint256)", +"7ca24d95": "changeEndTime(uint64)", +"7ca2795f": "AdvanceQueue()", +"7ca31724": "tokenId(address)", +"7ca54248": "lastSaleInHGT()", +"7ca55e00": "etherandomVerify(bytes32,bytes32,bytes32,uint256,uint256)", +"7ca5d8fa": "read_u8()", +"7ca60997": "rewardComment(address)", +"7ca63061": "LibraCreditNetwork(uint256,string,uint8,string)", +"7ca64683": "hasFiveStepWithdraw()", +"7ca823d5": "getAverageChainWork()", +"7ca828d0": "_canBreedWith(uint256,uint256)", +"7ca9429a": "getOfferCount(address,address)", +"7caae38c": "calluseraddress(address,address)", +"7cab5e8c": "removeApproval(address)", +"7cab9ba2": "setReceiver()", +"7cac4c7d": "JOY()", +"7cac9736": "computeResult()", +"7cad997f": "purchaseByEMONTImpl(uint16,uint256,uint64,address)", +"7cae6cb5": "determineEdition(uint256)", +"7cae8509": "delete_blockedAddress(address,address)", +"7caf3115": "MovieWorld()", +"7caf59d9": "addPullRequest(bytes32,bytes32,uint128)", +"7cb04b87": "running_id()", +"7cb070c7": "OPL()", +"7cb1442c": "f1(uint256,uint256)", +"7cb1bb0b": "setOraclizeGasExtraArtwork(uint32)", +"7cb25bc7": "dividendCount()", +"7cb2b79c": "setTokenManager(address)", +"7cb2c15b": "getTXdatabyCode(bytes32)", +"7cb34d2d": "register(bytes32,bytes32,bytes32,string)", +"7cb46307": "NewContent(bytes32)", +"7cb4e22a": "IEIP165()", +"7cb4ef0e": "getHashRateOf(address,uint256)", +"7cb51761": "setMaxPayments(uint256)", +"7cb56698": "rescueLostFighter(uint256,address)", +"7cb5d0ef": "Airchain(uint256,string,uint8,string)", +"7cb6a6b2": "generateContract(uint256,uint256)", +"7cb6b35d": "adjustLimitBetweenIssueAndNormal(uint256,bool)", +"7cb6cf3e": "ETH_SIGN_PREFIX()", +"7cb8adc7": "s9(bytes1)", +"7cb916b9": "withdrawAlltokenFunds(address)", +"7cb91d84": "slots_left()", +"7cb97b2b": "set_owner(address)", +"7cb9cf54": "removeSeller(address)", +"7cb9da88": "setIncludes(uint256,uint256)", +"7cba3f04": "PriceWeekThree()", +"7cbab0cb": "updatewallet(address)", +"7cbae071": "setPresalePerEth(uint256)", +"7cbb6934": "generateRandomNum()", +"7cbba335": "get_order_book_length(string)", +"7cbbf1da": "proofType_Native()", +"7cbc2373": "redeem(uint256,uint256)", +"7cbc4eb6": "lost(uint256)", +"7cbc6903": "totalBidCount()", +"7cbcc254": "__reset__()", +"7cbd3508": "_unpackExpValue(uint256)", +"7cbd5444": "isPriv()", +"7cbd9e8d": "existCaller(address)", +"7cbe0f32": "addOpenAction(string,string,string,string,string)", +"7cbe9e41": "DANKSIGNALS()", +"7cbf2bdc": "CapFlexed(uint32)", +"7cbfb8a5": "TransferTokens(address,uint256)", +"7cc07974": "HFTCrowdsale(address)", +"7cc08d53": "partProvider()", +"7cc0c3a7": "controllers()", +"7cc0e670": "freezeAccountForContract(address,bool)", +"7cc1303a": "trade(uint8[2],bytes32[4],uint256[7],address[6])", +"7cc1c640": "getActualPriceOfCardOnBuyAuction(uint256)", +"7cc1e28d": "setValidatorRewardPool(bytes32,uint256)", +"7cc1f867": "getContractInfo()", +"7cc2fe49": "setResourcesPrimaryManager(address)", +"7cc35d99": "historyIt()", +"7cc3ae8c": "endAt()", +"7cc3b48e": "withdrawKrowns(address,uint256)", +"7cc3beb2": "acceptArbiter()", +"7cc48875": "Slots()", +"7cc49427": "RemoveLock(address,uint256)", +"7cc4e55f": "lowestAskPrice()", +"7cc4ef14": "purchaseLand(uint256,uint256,uint256)", +"7cc589f9": "BlocklancerEmploymentContract(string,address)", +"7cc666da": "MoratoriumTransfers(uint256,address[],address[])", +"7cc9e4f0": "registerParticipant(address)", +"7ccaa9fa": "calcMerkle(bytes32[],uint256,uint256)", +"7ccc5aea": "DSPParametersChanged(address)", +"7ccc7e94": "inv_contract()", +"7ccce851": "isBlacklistedUser(address)", +"7ccd099d": "test_32_assertGasUsage100Boards()", +"7ccd3f79": "setAA(uint256)", +"7ccec110": "TestWorldSnapshot(uint256)", +"7ccefc52": "minimumMakerProtocolFee()", +"7ccf0d44": "_setAuctionObj(address,uint256,uint256)", +"7ccfd45a": "removeSubUser(address)", +"7cd022d4": "gen0PresaleLimit()", +"7cd07e47": "migrator()", +"7cd208b6": "requestRefunding()", +"7cd30fe3": "MarketingDevelopmentAddress()", +"7cd3229a": "board()", +"7cd3969d": "getUnsoldReceived(uint256,address,address)", +"7cd44272": "getConversionRate(address,address,uint256,uint256)", +"7cd4559c": "_rewardApprovers(address)", +"7cd49414": "participate(address,string,bytes32[],bytes32[])", +"7cd49fde": "_counter()", +"7cd50577": "setTradable(bool)", +"7cd64c79": "AdvancedERC20(uint256,string,string)", +"7cd6a7fd": "setSettings(uint256)", +"7cd73941": "withdrawBAT(uint256)", +"7cd7c2bd": "setAnimalMeta(uint256,string)", +"7cd87ee9": "Libertax()", +"7cd9b0f8": "userHasHunterLicence(address)", +"7cda71a6": "preSaleTotalSupply()", +"7cdacb98": "setContractPartner(address)", +"7cdbae63": "addRegistryIntoTagsIndex(address)", +"7cdcc514": "replyThread(uint256,string,string)", +"7cdcdf23": "RenderTokenCrowdsale(uint256,uint256,uint256,uint256,address,address,address)", +"7cdd053a": "addRace(uint8,uint8,uint8)", +"7cdd8419": "getEtherPriceforDapp()", +"7cddc1de": "checkBonusTokenHoldingPeriodRemained(address)", +"7cde2a7e": "setCount(uint256,uint256)", +"7cdee6fb": "buySpaceship(uint16)", +"7cdef83c": "debtEngine()", +"7cdf6d0b": "TranslateME()", +"7cdf8ace": "adminCommand(uint8,address,uint256)", +"7ce01daf": "rollSystem(uint256,address)", +"7ce1b194": "ModernTokenPlus()", +"7ce1db53": "ShowNextCliff(address,uint256)", +"7ce1e2eb": "releasedBountyTokens()", +"7ce2432b": "lbrsToken()", +"7ce26195": "approveGame(address)", +"7ce2d863": "_calcCheckoutTime(uint256)", +"7ce335ac": "amountwon()", +"7ce3489b": "setFeePercent(uint256)", +"7ce50441": "updateTimer(uint256,uint256,uint256)", +"7ce52eb6": "distributePrizes()", +"7ce56303": "deployVestingContract(address,address,uint256,uint256,uint256,bool)", +"7ce5b85e": "transferBuy(address,uint256)", +"7ce5f9da": "DIYToken()", +"7ce645a6": "fundsAreAvailable()", +"7ce65725": "TEC()", +"7ce67d60": "initLoan()", +"7ce6e4ca": "getData_1()", +"7ce7c990": "transfer2(address,uint256)", +"7ce7d660": "CAF1(address)", +"7ce84784": "createtoken(string,string,uint256,address,address)", +"7ce85957": "setEthCollector(address)", +"7ce8e196": "test_claim()", +"7ce901e7": "TestContract(address)", +"7ceac0b8": "TokenSale(address,uint256,uint256)", +"7cead212": "dissolvedIndexToApproved(uint256)", +"7cec3a3a": "getBUS(bytes32,uint256)", +"7ced3d4c": "validArb2(address)", +"7ced55c2": "pvpPaused()", +"7cee8e70": "subTotalSponsored(address,address,uint256)", +"7cee919c": "getCurrentHash()", +"7cee9ee8": "placeBet(uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"7cef6047": "getNavHistory(uint256)", +"7cef6966": "addLaureato(string,string,string,bytes32)", +"7cefcc52": "burnedCount()", +"7cefd9f8": "initCrowdsale(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"7cf0ffcb": "forceDivestAll()", +"7cf12b90": "unFreeze()", +"7cf12ff8": "registryRequestSerialNumber()", +"7cf141fd": "removeGlobalAdmin(address,address)", +"7cf2b9e4": "updateVotingContractAddress(address)", +"7cf2f670": "Pinakion(address,address,uint256,string,uint8,string,bool)", +"7cf37493": "finalizeNOK()", +"7cf4c543": "createTransaction(uint256,address)", +"7cf52f3c": "getPrevRoundWinner(uint256)", +"7cf5d66f": "notifyTokensReceived(address,uint256)", +"7cf5dab0": "increment(uint256)", +"7cf62838": "EIP20ByteCode()", +"7cf6babf": "BasicSprout()", +"7cf6be2c": "createBid(bytes32,address,address,address,uint256,uint256,uint256)", +"7cf7b9f4": "determineDate()", +"7cf7e0e2": "VLCCoin()", +"7cf7f740": "getBuildingInfo(uint256)", +"7cf846c9": "registerManoContract(address,bool)", +"7cf90fcc": "addItem(address)", +"7cf99c33": "getIsMigratingFromLegacy()", +"7cfa1133": "Baxgold()", +"7cfb1e66": "TeamSum()", +"7cfb6052": "setPremium(int256)", +"7cfbc7a5": "setMaxBetAmount(uint256)", +"7cfe18c0": "internalCalculateEthersWithBonus(uint256)", +"7cfe19af": "A_Free_Ether_A_Day()", +"7cfe7a25": "BankhadCoin()", +"7cff33c7": "setMainSaleParameters(uint256,uint256,uint256)", +"7d007ac1": "setProposalDuration(uint256)", +"7d00818c": "allowedAddressesOf(address)", +"7d00848a": "getSinistre()", +"7d019f87": "isPreSaleClosed()", +"7d02bc1c": "getOldest()", +"7d02db72": "CryptoRUB()", +"7d036b0d": "finishProofPhase(uint256)", +"7d0381a7": "notify(address,uint256,uint8,uint8,uint8,uint256,uint256,bool)", +"7d0385c2": "createPromotionalRenewal(uint256,uint256)", +"7d03c394": "Logs2(uint256,uint256,uint256,uint256,uint256,uint256)", +"7d03e603": "GetUserExtraData2(address)", +"7d03f5f3": "newGame()", +"7d049675": "fechAllCandidatesByStage(uint256)", +"7d04d239": "setTokenMintApproveReset(address,address,address,address)", +"7d051cf3": "getTokensAcquired(address)", +"7d052a2e": "processReservationContribution(address,uint256)", +"7d06053b": "perturb(bytes32)", +"7d065c93": "getPayout()", +"7d075efb": "withdraw(address,address,address,bytes)", +"7d087715": "getwithdrawableAmount(address)", +"7d087f47": "gamblerevent(address,uint256)", +"7d091a7e": "pct(uint256,uint256,uint256)", +"7d094533": "announceVictory(string)", +"7d0981dd": "ModifyMine(address,bool,string,uint256)", +"7d09f560": "Equio(string,address,address,bytes32,uint256,uint256)", +"7d0a5e3b": "fightWIthMob(uint256,uint256)", +"7d0b4c8b": "withdrawEquity(uint256,bool)", +"7d0b4d60": "migrationEnded()", +"7d0bc9c6": "tier_action(uint8,uint256,uint256,uint8,uint256,uint256)", +"7d0bd79a": "publicSaleTokensPurchased()", +"7d0c269f": "isWhitelister(address)", +"7d0cf8b5": "Seele()", +"7d0e6aa9": "BitrootCoin()", +"7d0e6b6f": "setNextDiscountTTMTokenId1(uint64)", +"7d0e750d": "getMyTime()", +"7d0eb9b9": "RemoveVerifiedInfo(bytes32)", +"7d0f023d": "_deleteBytes(bytes32)", +"7d0f7528": "getFromList_(uint8,uint256)", +"7d103f14": "getBallotBook(uint256,uint256,uint256)", +"7d1108f5": "getAssetData(uint256)", +"7d112d64": "authenticateVoter(string)", +"7d1157c8": "rawSendEther(bytes32)", +"7d1173b0": "DGAMEToken()", +"7d11f020": "oracleName()", +"7d124a02": "setRewardAddresses(address,address,address)", +"7d1286f6": "InterfaceId_ERC721Exists()", +"7d128d2e": "checkAgentSign(address,address,bytes32)", +"7d12b689": "checkPoolsDone()", +"7d136133": "SimpleATM()", +"7d13a256": "highFundingGoalReached()", +"7d14500a": "Sukiyaki()", +"7d14c8df": "setStaleTime(uint256)", +"7d150529": "countdownTimeLeft()", +"7d1541ad": "listDapp(string,string,string)", +"7d1710e4": "saleBalanceOf(address)", +"7d1842ec": "getPayeeBalance(bytes32,uint8)", +"7d18a197": "IndoAset()", +"7d19514d": "addFunds(uint256,uint256,bytes32,uint256)", +"7d19c777": "Emission(address,uint256,uint256,uint256,uint256,uint256)", +"7d19e292": "transferTokensToContractOwner(uint256)", +"7d19e596": "getEscrow(uint256)", +"7d19ec9d": "getUserAccount(bytes32)", +"7d1a6e3f": "compareTo(string,string)", +"7d1b2666": "fibokenCreatedCount()", +"7d1bd3ea": "setClientSupply(address,uint256,uint256)", +"7d1ca9fd": "setBeneficiary2(address)", +"7d1d0553": "convertToMiniUI(uint256)", +"7d1d7fb8": "settlementFee()", +"7d1e97a1": "cardTokenAddress()", +"7d1ea6d4": "m_token()", +"7d1f067c": "EthBankRoll(uint16)", +"7d1f561b": "set_pre_kyc_iconiq_bonus_denominator(uint256)", +"7d2026cd": "distributeWinnings()", +"7d2044cc": "AuctusStepVesting(address,uint256,uint256,uint256)", +"7d211c75": "peth()", +"7d21ce4d": "_Mint(address,uint256)", +"7d2211d6": "setStatus(string)", +"7d22e9df": "clearAllocatedAndSalaryTokens(address,address)", +"7d22f431": "delegatePercent(uint256,uint256,uint256)", +"7d230dfd": "wedding()", +"7d236928": "getGenesMarketAddress()", +"7d2402d6": "inPresale()", +"7d240b9c": "setLockToken(bool)", +"7d2429a8": "long_party()", +"7d242ae5": "setBasePrice(uint256,bytes)", +"7d24a8a1": "returnToken(address,uint256)", +"7d24cd18": "onExecuteMessage(address,uint256)", +"7d25d7cd": "tokensToTransfer(bytes32,address,address,address,uint256,bytes,bytes)", +"7d263245": "COOLDOWN_TIME()", +"7d264bad": "adexTeamAddress()", +"7d268ac1": "ArtworkCore()", +"7d27ecf9": "phase1TokenSold()", +"7d287697": "testTryGetUnset()", +"7d298ee3": "beforeExecute(address,uint256)", +"7d29beff": "placeVoxel(uint8,uint8,uint8,uint8)", +"7d29f868": "ChangeUSDto1ETH(uint256)", +"7d2a0f7a": "isWhiteListedValueValid(address,uint256)", +"7d2a47b9": "findShareholder(address)", +"7d2aeb8a": "releaseVestedTokens(uint256)", +"7d2b48bb": "getMaxAssignedRequests()", +"7d2b9cc0": "setRequiredSignatures(uint256)", +"7d2c93d7": "validateTypeReference(uint256,bool)", +"7d2d661f": "genLimit(uint256)", +"7d2d92ac": "withdrawTheUnsoldTokens()", +"7d2dfc30": "FourCrowdsale(uint256,uint256,uint256,uint256,address,address)", +"7d2f42c3": "updateRating(address,bool)", +"7d309331": "Bitceun()", +"7d3157bf": "confirmBeneficiary(uint256)", +"7d320ef8": "proofStorage_IPFS()", +"7d326635": "getLendingObjId(address,uint256)", +"7d32e7bd": "transfer(address,bytes32)", +"7d34c2e3": "setMarketingAndRNR(address)", +"7d34f5ac": "dailyTotals(uint256)", +"7d3533da": "ownerSetAllowPublicWithdraw(bool)", +"7d35f656": "count_customer_deposits()", +"7d363718": "BitcoinXChainToken()", +"7d363720": "getCurrentBonusFactor()", +"7d368f88": "afterEnded()", +"7d36e478": "ClaimBalance(address,uint256)", +"7d37fcba": "setManagementContractAddress(bool,address)", +"7d380265": "addOptionChain(uint256,string,uint256,uint256,bytes32,address,int256[])", +"7d38a772": "updateDeveloperMiningPower(uint256)", +"7d394f90": "addMasternode(address)", +"7d398a86": "SourceChanged(string,string,uint256)", +"7d3b2d81": "PayXToList(address[],uint256)", +"7d3bfaee": "withdrawSurprisePotUser(uint256,uint256,uint8,bytes32,bytes32)", +"7d3c42d2": "EtherBrosMaker()", +"7d3c5961": "middleTimestamp()", +"7d3c6da5": "CreateLudumTokens(address,uint256)", +"7d3d220d": "CitizenOne(uint256,address,uint256)", +"7d3d6522": "goalReached()", +"7d3dcbc3": "setTRM1BonusActive(bool)", +"7d3ee409": "setPatient(string,uint256,address,string,string,uint256,uint256)", +"7d3fa29e": "addressToGoldDeposit(address)", +"7d3fcaff": "getMatchReport(uint256)", +"7d40189a": "timeAdjustPlus()", +"7d40583d": "setRoleCapability(uint8,address,bytes4,bool)", +"7d408b44": "getMemberTokenRemain(address)", +"7d40e9e0": "purchasedAmountOf(address)", +"7d40eb25": "TITANCORE()", +"7d4120a9": "insChainToken()", +"7d41cc60": "modifyAuthorizedCaller(address,address)", +"7d426826": "INTREPID_VOUCHER_PRICE()", +"7d42af97": "PrivateSaleEndTime()", +"7d436d76": "consume(bytes32,bytes32[])", +"7d443e57": "getInitInfo()", +"7d445654": "lastLargestHODLERBalance()", +"7d4504e0": "totalETHraised()", +"7d451aa7": "zgetOwner()", +"7d457ac3": "CompensationSentEvent(address,uint256)", +"7d459c71": "Multiexshares()", +"7d46702b": "icoCollected()", +"7d472f1c": "xnotifications(uint256)", +"7d475c32": "LogAccessPolicyChanged(address,address,address)", +"7d478407": "gameEncryptedText()", +"7d47b4e7": "setAIRDROPPrice(uint256)", +"7d48441f": "_isContract(address)", +"7d487532": "setMember(bytes32,address,bool)", +"7d48dcd7": "onPurchase(address,address,uint256,uint256,uint256)", +"7d49300d": "initGame(address,uint256,uint256,uint256)", +"7d49e51d": "getSpaceshipUpgradePriceByModel(uint16,uint8)", +"7d4a899e": "SafeSender()", +"7d4af159": "marketMakerFee()", +"7d4c1403": "get(address,address,string)", +"7d4c258a": "Set(bytes32)", +"7d4c4a04": "saleStartSecondDayEnd()", +"7d4c7806": "disputeCrowdsourcerCreated(address,address,address,uint256[],uint256,bool)", +"7d4cb964": "MAX_ENTRIES()", +"7d4ce874": "maxInvEth()", +"7d4cf602": "buildDSBalanceDB()", +"7d4d3128": "startTransferToken()", +"7d4d42c5": "_addGraffiti(uint256,string,string)", +"7d4da754": "CoiinToken(address)", +"7d4deda1": "setAirLimitCount(uint32)", +"7d4e1353": "erc20TRFT(uint8)", +"7d4e1eb0": "stop_game()", +"7d4f0406": "PPY(uint256,string,string)", +"7d4f128b": "createLockTokenHistory(address,uint256,uint256)", +"7d4f1883": "closeMonthlyInvest()", +"7d50bef3": "account(address,address,uint256)", +"7d5224d3": "registerNewUser(address)", +"7d53223a": "setVestingReleasedAmount(address,address,uint256)", +"7d53409a": "setMaxbonds(uint256)", +"7d534aa0": "disableCharity()", +"7d549e99": "totalTokensMinted()", +"7d54a3ba": "CROWD_WAVE1_PERIOD()", +"7d55094d": "toggleMinting()", +"7d55758f": "underMint(address,uint256)", +"7d55923d": "click()", +"7d55f64d": "fixedFeeInWei()", +"7d564056": "getUserProperty()", +"7d564f11": "setsystemprice(uint256)", +"7d574678": "setICOIsFinished()", +"7d57a85c": "preIcoFinish()", +"7d57edf3": "HOPE(uint256,string,string)", +"7d580939": "_HOLDersPayRoll()", +"7d58eb76": "hasResolver(string,address)", +"7d59a938": "month6companyUnlock()", +"7d5a9b41": "init(uint256,uint256,address,uint256,uint256,uint256,address,uint256)", +"7d5bc9fe": "Account_balances(address)", +"7d5c1914": "getWalletInfo(address)", +"7d5db5e0": "Dagelas()", +"7d5dc538": "getToJackpot(uint256,uint256)", +"7d5dec2a": "multiplex_remove(address)", +"7d5f66f2": "mintBounties()", +"7d5fbcab": "setMystr(string)", +"7d5fec5a": "setOwner(uint8,uint8,address)", +"7d606100": "BetOverlap()", +"7d60b6ce": "setCommissionWallet(address)", +"7d60e291": "FIFTY_THOUSANDS_LIMIT()", +"7d60e343": "getFileListSize()", +"7d619d9b": "holdCoin(address,address)", +"7d61b9fe": "intervalsCount(bytes32)", +"7d61de37": "foundersRewardTime()", +"7d620130": "getCardCount()", +"7d635502": "buyEgg()", +"7d636d9b": "refferal(address)", +"7d63a93a": "REKT(uint256,address)", +"7d64bcb4": "finishMinting()", +"7d652335": "changeAssetsState(bool)", +"7d656a72": "NewPost(bytes32,uint256)", +"7d65b2f7": "hasCompleted()", +"7d65e3fe": "totalInterestCycles()", +"7d661e3c": "giveToken(address,uint256,string)", +"7d6651b9": "claimEthIfFailed()", +"7d683b95": "unsoldUnlockedAt()", +"7d684a9d": "RENEEKROM(address,address,address,uint256,uint256,uint256)", +"7d68582a": "manuallyExchangeContractPreDGZtoDGZ(address,uint256)", +"7d68bee7": "LogPollDeleted(bytes32)", +"7d692faf": "readMailByAdmin(uint256,bytes16)", +"7d6979e7": "canBeChanged(uint256)", +"7d69880b": "addBalance(uint256,uint256,uint256)", +"7d69f335": "changeColorRed()", +"7d6a59ed": "getInvoiceCount()", +"7d6a5f7b": "requireNotPaused()", +"7d6ad4cd": "triggerAutorelease()", +"7d6b4278": "outcomeState(address,uint256,uint256)", +"7d6bc260": "maxTiers()", +"7d6c1ff1": "addMake(address,uint256,uint256)", +"7d6c8388": "INVECH(uint256,string,string)", +"7d6c864e": "withDrawable()", +"7d6cf2df": "get_deploy_fee()", +"7d6d28ef": "setComisionInTokens()", +"7d6dc737": "getBylawsMinTimeInTheFutureForMeetingCreation()", +"7d6e061c": "getFinishDates()", +"7d6e3751": "_addVouchers(address,uint256)", +"7d6ebe94": "setDoubleClaimSegmentSlashAmount(uint256)", +"7d6f0d5f": "changeFundsWallet(address)", +"7d6f174e": "invalidateSignature(uint8,bytes32,bytes32)", +"7d6f3781": "userChallenge()", +"7d6fb089": "setBGXTokenInterface(address)", +"7d7106ad": "_updateStats(uint256,uint256)", +"7d71a19b": "setAccountInfo(address,address)", +"7d720296": "airSender()", +"7d722a30": "Funding_Setting_cashback_before_start_wait_duration()", +"7d72aa65": "addRole(address,string)", +"7d736d0d": "weekPotExpiration()", +"7d74039d": "getAmountOfShareholders()", +"7d7452aa": "DSVCoin()", +"7d7714fb": "coinAllowance(address,address)", +"7d7786a3": "GetGuestName()", +"7d77c8f9": "allowTransferBetweenUsers()", +"7d780e2a": "blocked_amounts(address)", +"7d78b94d": "claimNihilum()", +"7d78ef4a": "BKKToken()", +"7d790630": "setContractFrozen(bool)", +"7d79265b": "REDEEM_METHOD()", +"7d79c192": "awayTeam()", +"7d7a1a80": "UCToken(uint256,string,string)", +"7d7a31b6": "max(uint64,uint64)", +"7d7a3a1a": "bittravelxToken()", +"7d7a9ca4": "MachineToken()", +"7d7b0099": "API()", +"7d7b2051": "finalizeExits(address)", +"7d7be90f": "Splitter(address[])", +"7d7c2a1c": "rebalance()", +"7d7c7258": "adminSendMoneyToUser(address,uint256)", +"7d7ca00c": "JSONpath_int(int256,string,string,uint256)", +"7d7d4a68": "start_service(address)", +"7d7e5e3d": "setFlagPair(uint256,bool,bool)", +"7d7eee42": "setPreSalePrice(uint256)", +"7d7f0050": "TradeEnabled(bool)", +"7d7f1699": "freeBet(address)", +"7d7fa215": "getSaleData()", +"7d7fef7e": "receivedEtherFrom(address)", +"7d802655": "delLimitedWalletAddress(address)", +"7d80def3": "setENDPhase()", +"7d81d62f": "doGroupRefundPayoutsSuccess(address[])", +"7d820414": "GeXCHANGE()", +"7d82bf73": "getBonusTokens(uint8)", +"7d836281": "getBetState(address)", +"7d83e527": "PensionCoin()", +"7d851a13": "signerIsWhitelisted(bytes32,bytes)", +"7d851c70": "getTokensBack()", +"7d85445d": "EducationToken()", +"7d85facd": "transferred()", +"7d862a7e": "changeDutchIdxAddr(address)", +"7d87bb7b": "HATCHING_COST()", +"7d87e97d": "makeMemberOfGroup(address,uint256)", +"7d882097": "totalDeposits()", +"7d882e9b": "resetWinner()", +"7d886976": "testMintGuyAuth(int256)", +"7d8966e4": "toggleSale()", +"7d8978db": "addCasino(uint16,uint256,string,string)", +"7d897ccd": "KPCSAdministrator()", +"7d89ae63": "__findRef(string)", +"7d89f040": "AddAmount(uint256)", +"7d8be627": "activateLineItem()", +"7d8c0c7c": "adminSetRegisterCost(uint256)", +"7d8ccd59": "debug_uint(uint256)", +"7d8cfd1a": "flag_hash()", +"7d8d4878": "updateETHEUR(uint256)", +"7d8f442e": "getPrice(uint40)", +"7d8f94a0": "slackUsersCap()", +"7d8fcfb4": "transferSuperAdminOwnership(address)", +"7d8fe090": "REFERRAL_BONUS_LEVEL5()", +"7d902311": "gameGiftLineTime()", +"7d917fcb": "Registered(bytes32,address)", +"7d919a43": "tohash(bytes32,address,address,uint256,uint8,bytes32,bytes32)", +"7d91da87": "buyPixelTokenFor(uint24,uint256,uint24,address)", +"7d9201cc": "rspToken()", +"7d921af0": "disableTimelock()", +"7d92561d": "NewBuyer(address,uint256,uint256)", +"7d92654c": "endRoundAndStartNextRound()", +"7d92bb6e": "getClaimKeys()", +"7d92f6be": "goldRegistry()", +"7d9375b8": "authorizeContract(address,string)", +"7d9383c3": "valid_creature(address)", +"7d93ccdf": "Halo3DDoublr(uint256,address)", +"7d940912": "addArea(uint256,uint8,uint8[],uint256,string,uint256,bool,uint32)", +"7d94792a": "seed()", +"7d94d4aa": "SergeToken()", +"7d95dcd7": "createPromoArtwork(string,string,uint32,address)", +"7d961218": "REGTMProc()", +"7d962e44": "addHash(bytes16)", +"7d96f693": "getDepositAmount()", +"7d97597d": "DEFAULT_AUCTION_LENGTH()", +"7d97b1f6": "VestingScheme()", +"7d98ebac": "exchange(address,address,address,address,uint256,bytes)", +"7d99ae17": "issue(address,bytes32,bytes32)", +"7d9a4e2c": "safeToMultiply(uint256,uint256)", +"7d9a9046": "resolveDisputeBuyer(string)", +"7d9a9096": "icoFinishedAt()", +"7d9c68f7": "getUserBattleValue(address)", +"7d9d4bed": "secondStageEnd()", +"7d9d972d": "guardian3Vote()", +"7d9e5243": "BonusAmountUpdated(uint256)", +"7d9f298e": "setLockedState(bool)", +"7d9f6db5": "auction()", +"7d9f8cf2": "startFirstStage()", +"7d9fb742": "fourthRoundPercent()", +"7d9fc342": "PreICODays()", +"7da028d6": "SaleCompleted(address,uint256,uint256)", +"7da0389d": "referralProgram(address[],uint256[],uint256)", +"7da0399a": "CloseAuction(bytes32)", +"7da0e079": "_closeMotion(uint256)", +"7da16762": "executeParentDaoSplit()", +"7da208aa": "deleteArrayAddress(bytes32,uint256)", +"7da21a1a": "WaltonToken()", +"7da25928": "announcedTimeStamp()", +"7da3400b": "_contractExists(bytes32)", +"7da39157": "poWtfContract()", +"7da3c3ab": "revert()", +"7da3e219": "testInitialTokenBalance()", +"7da3f613": "lockAddress()", +"7da40b65": "isPlatformOrSupportManager(address)", +"7da4d24b": "activationOpen()", +"7da5efc8": "drop(address,address[],uint256[])", +"7da63c59": "changeValuePerToken(uint256)", +"7da7a437": "Clinicoin()", +"7da7d5ab": "nextGameRakePercent()", +"7da81364": "getProposalAction(uint256)", +"7daa10ce": "getMyInfo()", +"7daa9fcd": "buyGems()", +"7dab61b6": "setBlack(bool)", +"7dab84d8": "ShowTestU(string,uint256)", +"7dabb4d6": "addKycVerifiedInvestor(address)", +"7dac0547": "VIRGOToken()", +"7dac9048": "addArgumentToRequestUint(uint256,bytes32,uint256)", +"7dae6e95": "noOfTokenAlocatedPerICOPhase()", +"7daeef25": "objectTome()", +"7daf06fd": "withdrawPart(uint256)", +"7db0799f": "EnduranceToken()", +"7db12abc": "contractorWithdraw()", +"7db1c36f": "setFeedBackFee(string,uint256)", +"7db2cff8": "old_address()", +"7db33f99": "setLeaseCard(uint8,uint256,uint256)", +"7db4149d": "RegisterTokenTransaction(address,uint256,address)", +"7db42b6c": "AutoBusinessFinance()", +"7db45975": "register(uint256,uint256,bytes32,string,bytes32)", +"7db48416": "_getMinions(uint256)", +"7db6a91d": "checkDeck(uint8[],bytes32,bytes32)", +"7db6cbfc": "_addDefaultOperator(address)", +"7db724b6": "MAIN_QUESTION()", +"7db7c239": "tranchesPayedOut()", +"7db8782a": "uint256At(uint256,bytes,uint256)", +"7db91595": "setOwnedBonus()", +"7db9743b": "Registry()", +"7dbb82a8": "setLicenseTermsRegistry(address)", +"7dbbc0cd": "EliteShipperToken()", +"7dbbf2e6": "RecallTokensFromContract()", +"7dbc1d6f": "modifyPrivateList(address[],bool)", +"7dbc827b": "vestingWithdraw(address,uint256,uint256)", +"7dbc9fba": "amendClaim(uint8,uint8,uint8,uint8)", +"7dbd0139": "softCapOk()", +"7dbd33c1": "_percDown(uint256)", +"7dbdab18": "CreatedAngel(uint64)", +"7dbdc2eb": "getQueryPrice()", +"7dbdf168": "EtherBetIO(address,address)", +"7dbecc54": "EDColiseum()", +"7dbece3c": "usdCurrencyFunding()", +"7dbedad5": "createReward(uint256,uint256)", +"7dbf1fe6": "Towers(uint256)", +"7dbf67a7": "setDebt(uint256)", +"7dbff420": "donationUnlockTs()", +"7dc0015d": "centToken()", +"7dc09e4a": "getRequestedProducts()", +"7dc0d1d0": "oracle()", +"7dc0d451": "CHINESE_EXCHANGE_2()", +"7dc10df5": "Jackpot(address,uint256,uint256,uint256)", +"7dc2268c": "minting()", +"7dc28eb2": "LOCKAMOUNT4()", +"7dc379fa": "getTicket(uint256)", +"7dc45e27": "setCryptoMatchValue(uint256,string)", +"7dc4da2e": "initiate(uint256,bytes32,address,uint256)", +"7dc4feb7": "setConstraint(bytes32,address,address,uint256)", +"7dc5cc64": "getTotalDivis(uint256)", +"7dc5cd32": "_patternToNumber(bytes)", +"7dc673bc": "closeRegistration()", +"7dc6c3d9": "deactivateAdSlot()", +"7dc7363b": "LogNewTemplateProposal(address,address,address,uint256)", +"7dc74473": "tokenPrivateMax()", +"7dc79375": "delOracle(address)", +"7dc7c5a5": "debug1()", +"7dc7f7c4": "Pitcheum()", +"7dc8c73e": "canTokenUnlocked(uint256)", +"7dc8e069": "shorten_end_block(uint256)", +"7dc8f086": "getOutcomeCount()", +"7dcab440": "SubinGuhan()", +"7dcaf720": "getReadme()", +"7dcb422e": "setPresaleStartDate(uint32)", +"7dcb6b92": "testegy()", +"7dcbd078": "thirdPay()", +"7dcc3f0c": "LukapToken()", +"7dccd4d6": "setIndividualCertificate(string,bytes32,bytes32,bytes32)", +"7dcd17d9": "sumHardCapICO1()", +"7dcd277b": "SimpleTingToken()", +"7dcda7df": "initiateProviderCurve(bytes32,int256,int256[],address)", +"7dcdace2": "Deposit(address,uint256,uint256,bool,string)", +"7dcdec34": "sendTokenFundsToManager(uint256)", +"7dce4595": "sendToken(address,uint256,string)", +"7dce6bdb": "freeCrawDeadline()", +"7dce8461": "GSENetwork()", +"7dce8dd4": "GenesisSalesCount()", +"7dcfb801": "veryAngry()", +"7dcfd3d5": "blockTransfers()", +"7dd003f1": "test_chain2_4()", +"7dd02c8e": "transferETHFromContract(address,uint256)", +"7dd07097": "tgeSettingsPartProject()", +"7dd0d61c": "check_hash(address,bytes32,bytes32)", +"7dd10e4f": "newUsers()", +"7dd15d40": "getData_13()", +"7dd1f126": "optionTaker(bytes32)", +"7dd256ff": "PATToken(address)", +"7dd26660": "getMegaboxIndex()", +"7dd2899f": "changeDividentContract(address)", +"7dd2e993": "removeTenant(uint256)", +"7dd3cf54": "ChangeCostByManager(uint256)", +"7dd45999": "lockDomainOwnershipTransfers()", +"7dd563c3": "setMainSaleParams(uint256,uint256,uint256,uint256)", +"7dd56411": "ownerOf(bytes32)", +"7dd91734": "compositeReputation(string)", +"7dd9d27f": "exiteEntidad(address)", +"7dd9f846": "buyCard(address,uint256)", +"7dd9fcf7": "latestprice()", +"7dda48a5": "WhatTimeIsNow()", +"7ddaa56a": "tokenContributionMin()", +"7ddb3c00": "total_pay_claimed()", +"7ddb5e65": "votingReward()", +"7ddbf0ed": "setLockedTokenAddress(address)", +"7ddbf1a7": "passFundsToTheTeam()", +"7ddc02d4": "isOwner(address,address)", +"7ddcbfd9": "TegTokensSale(uint256,string,string)", +"7ddd0ce1": "getBetDivisor(uint256)", +"7ddd130f": "PRBCoin()", +"7ddd20ba": "getRequiredStateNumbers(uint256)", +"7dddb66f": "collectOwnRew()", +"7dde0138": "modifySupplyLimit(uint256)", +"7ddfffbf": "mint(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"7de06cfc": "startTge()", +"7de09476": "getSpecificBuyerTransaction(address,address,uint256)", +"7de0cc65": "preMcFlyWallet()", +"7de11a8f": "getBlockVerifierAddressesCount(uint256)", +"7de14129": "approveInvestor(address)", +"7de1a631": "confirmETH(bytes32)", +"7de295d2": "withdrawalsCTR()", +"7de2d523": "setbonus(uint256,uint256)", +"7de2e95c": "TransferCow(address,uint256)", +"7de2fe4d": "linkToMasterWalletInternal(address,address)", +"7de32b17": "CuratedTransfers(address,address[],address[])", +"7de36138": "setPreICO(address)", +"7de47b3f": "fundingGoalUSD()", +"7de4800f": "withdrawEscrow(bytes32)", +"7de480c6": "aiurExchangeOracle()", +"7de4ceb2": "DebugValue(string,uint256)", +"7de50c44": "TIME_LOCK_END()", +"7de548d8": "releaseStake(uint256,address,address)", +"7de576cd": "vote(uint16,uint256)", +"7de5ad89": "setJntController(address)", +"7de6c905": "LetItPlayToken(address,address,address,address,address,address,address,address)", +"7de77700": "bytes32ToBytes(bytes32,bytes32[],bytes32)", +"7de7a18d": "setShare(address)", +"7de7ea78": "TokenHNC(uint256,string,string)", +"7de7edef": "changeMasterCopy(address)", +"7de8bb63": "Commons()", +"7de976dc": "amountFundHolder()", +"7de9f212": "colorfilter(uint256)", +"7dea9118": "setIdentityName(bytes32)", +"7deb6025": "buy(uint256,address)", +"7debb959": "calculateAllocation(address)", +"7dec2299": "getStagesInfo()", +"7dec3d35": "FOUNDERS_WALLET()", +"7dec4ce8": "SettleBond(uint256)", +"7ded0c15": "getStakeTokenBalanceFor(uint256,uint256)", +"7ded2210": "setPreIcoCap(uint256)", +"7dee2cad": "CancelMyInvestment()", +"7def2fdf": "changeStakeRate(address,bytes32,uint256)", +"7def7351": "teamTokensFirstShare()", +"7df02c0e": "getLinglongCat(uint256)", +"7df042a2": "totalRegularTokensSold()", +"7df19a78": "BetPlaced(address,uint256,uint8)", +"7df1f1b9": "borrower()", +"7df23b6a": "ReleaseOracle(address[])", +"7df2e3e3": "getRcdExchange(uint256)", +"7df38c5b": "wad()", +"7df3a229": "PissToken()", +"7df432c9": "minSelfBuyPrice()", +"7df4732e": "seeZombieStar(uint256)", +"7df47407": "SigProof()", +"7df4c235": "kolidat()", +"7df52ba8": "Arbitrate(uint32,uint32,bool)", +"7df545c7": "MaximumSellableTokensChanged(uint256)", +"7df54c73": "setMiniPoolEdit_4(string)", +"7df5f4ae": "_upper(bytes1)", +"7df65a1d": "getMinersByAddress(address,address)", +"7df68a8b": "addPeriod(uint256)", +"7df73e27": "isSigner(address)", +"7df7ec18": "test_invalidEmptyEqVal()", +"7df82cc9": "veztUsers(uint256)", +"7df83cd0": "getDepositWithdrawList(address,uint256[])", +"7df841cd": "setPlayerVirusDef(address,uint256)", +"7df855f2": "getAuditAddress(address,address)", +"7df8833a": "createEvent(string,uint256,uint32)", +"7df9bb31": "heredar()", +"7dfa0b3f": "canSell(address,uint8,uint8)", +"7dfa7d79": "claimUnsoldTokens()", +"7dfac5a2": "accMinterOne()", +"7dfb0ba5": "getRecordOffers(address)", +"7dfb6626": "withdrawRewards(bytes32)", +"7dfbc19c": "HaltTime()", +"7dfbdf6d": "returnFundsFor(address)", +"7dfc64ca": "getTotalBudget()", +"7dfce5e9": "withdrawExcessReserves()", +"7dfce6d7": "MAX_INTEREST_AMOUNT()", +"7dfda44c": "AssignAddress(uint256)", +"7dfe1674": "CTB(uint256,string,string)", +"7dfe4302": "privateSaleTokens(uint256,uint256)", +"7dfe58d0": "clearEscapeRequests(uint256[],uint256[])", +"7dfe7741": "InviteAccepted(address,address)", +"7dfebff3": "addEth(uint256,uint256)", +"7e007c1e": "minimumWEI()", +"7e00d6d6": "enablePurchase()", +"7e00d77a": "mintExtendedTokens()", +"7e01c088": "removeWhitelistedAddr(address)", +"7e029bde": "setEthUsd(uint256)", +"7e02bb0f": "finish(address,address,address)", +"7e03ad1a": "numImports()", +"7e057b8e": "IYMAYA()", +"7e06ec93": "MDOSToken(address,address)", +"7e070df6": "rootOwnerOf_(uint256)", +"7e07877a": "hasFailed(address,uint256)", +"7e080911": "TRUEToken(address)", +"7e08a846": "tokenCollectedOf(uint256,address)", +"7e09d09b": "theFloatMultiplier(uint256)", +"7e09f0aa": "predictMarket()", +"7e0a16b1": "forwardAllRaisedFunds()", +"7e0be7e3": "upgradeGooCost(uint256)", +"7e0c1792": "oracle_address()", +"7e0c240d": "LianJieToken()", +"7e0cfc3d": "truncate(uint8[],uint8)", +"7e0d149e": "getGameAddresses(uint256)", +"7e0d8b27": "leekStealToday_()", +"7e0e20ba": "HighGasAmount()", +"7e0e471d": "Licensium(uint256,string,uint8,string)", +"7e0f7a87": "getUnixTimeStamp()", +"7e1028b2": "_doTradeWithEth(address,uint256,address,uint256)", +"7e1055b6": "icoEndTime()", +"7e111f59": "sell_toContract(uint256)", +"7e11f453": "ETH_Rate()", +"7e12180e": "setSaleDuration(uint256)", +"7e133564": "donateDna(address,uint256,uint8)", +"7e13b0be": "changeTokenDecimals(uint256)", +"7e150d66": "maxTxSize()", +"7e1629ab": "token_transfer(address,address,uint256,bytes,string)", +"7e167198": "_preValidatePurchase(address,uint8,uint256)", +"7e168086": "preallocate(address,address,address,address)", +"7e169860": "createNewEvent(bytes32,string,string,uint256,uint256,string,string)", +"7e16cfde": "getGameBlockNumber(uint256)", +"7e16eca0": "getContractTimestamps(bytes32)", +"7e1721ee": "LMAOtoken()", +"7e179816": "setRefShare(uint256)", +"7e18dd21": "motodoughToken()", +"7e1934f9": "swpFund()", +"7e199b70": "startCrowd(uint256,uint256,uint256)", +"7e1a6753": "Destruct()", +"7e1ab812": "utrToken()", +"7e1b52f6": "doftManager()", +"7e1c06b6": "newOwner(uint256)", +"7e1c0c09": "totalTokens()", +"7e1c4205": "query2(uint256,string,string,string,uint256)", +"7e1cae40": "changeRefundToken()", +"7e1cb559": "members(bytes32,address)", +"7e1cd42f": "convertIcoBalance100to70()", +"7e1cd79c": "Voting(bytes32[])", +"7e1db495": "addPendingWithdrawl(uint256,address,bool,bool)", +"7e1db516": "init3_block_height()", +"7e1e06ea": "EventTransferWasReset()", +"7e1e1ff6": "Giorgi()", +"7e1e447e": "total_wins_count()", +"7e1f2bb8": "createTokens(uint256)", +"7e1f89c8": "PRE_SALE_START()", +"7e20e7c0": "getRegistryDataMinter()", +"7e2224bd": "compress(bytes)", +"7e23f7cd": "teamKeepingLockEndBlock()", +"7e241c64": "getServiceNameByAddress(bytes32,address,address)", +"7e241dbf": "unlockMiner()", +"7e245fac": "PHXTKN()", +"7e24cb8f": "reservedFundLeft()", +"7e25ac5b": "destroyRewards()", +"7e25b7d6": "implements(address,bytes4)", +"7e266385": "setPrefix(uint8)", +"7e26639f": "saleLimit()", +"7e27133f": "tradingMonDataContract()", +"7e274f7e": "Reederem(string)", +"7e288822": "pendingWithdrawal()", +"7e298249": "setPriceInWei(uint256,uint256)", +"7e29d2a3": "TokenCoin4()", +"7e29dad0": "testBuyExceedHardLimit()", +"7e29f242": "changeDiscount(uint256,uint256,uint256,uint256)", +"7e2a0141": "removeToken(address[16],address,uint256)", +"7e2a6db8": "trusted()", +"7e2ac454": "disagree(bytes32,bytes32,bytes32[])", +"7e2bc821": "SaturnPresale(address,address,uint256,uint256,uint256)", +"7e2bef39": "calldata(uint256)", +"7e2bf3c6": "freezeCreditScore(address,uint256,string)", +"7e2c0459": "_transfer(bytes32,bytes32,uint256)", +"7e2c83fc": "seriesByAddress()", +"7e2ce380": "_calculateOwnerCut(uint256)", +"7e2e3958": "setBUS(bytes32,uint256,string)", +"7e2e756e": "testToUint32()", +"7e2f014f": "addResolversDelegated(string,address[],uint256[],uint8,bytes32,bytes32,uint256)", +"7e2f0843": "updateMaxTokensCollected(uint256,uint256)", +"7e2f6e3b": "getReserveSupply()", +"7e2fc2b6": "_Crowdsale(address,uint256,uint256,address)", +"7e2fdb0c": "dataForBuy(address)", +"7e2ff5f9": "setPreSale()", +"7e300fc6": "crowsaleShare()", +"7e319e4a": "getNextAssignedPolice(uint256,address)", +"7e31c53a": "HodlWithdrawn(uint256,address,uint256)", +"7e32456d": "STRC_SUPPLY()", +"7e327168": "allocatePresaleTokens(address,string,uint256,string)", +"7e32a592": "repairTheCastle()", +"7e32baea": "TRIPToken()", +"7e32fc47": "registerAsset(string,bytes32)", +"7e331a99": "setUserMessage(string)", +"7e33e361": "setRowQuiter(bool)", +"7e340b01": "getLatestPayday(address,address)", +"7e342507": "gameIndexToBuy()", +"7e3475a8": "lockQtyToAllowTrading()", +"7e347b82": "REALCrowdsaleMock()", +"7e34dbe0": "deposit(uint256,uint256,uint8,bytes32,bytes32)", +"7e363ffa": "setupCost()", +"7e36edce": "RATE_DAY_28()", +"7e373bc0": "bulletAmount()", +"7e380099": "addOrgCertificate(string)", +"7e38b424": "reverseFiatPurchase(uint256)", +"7e38d065": "ADVISORS_AND_CONTRIBUTORS_TOKENS()", +"7e39082f": "escrowedMYB(address)", +"7e3bfa1d": "removeRecoveryAddress(address)", +"7e3d15ae": "nextHolder(address)", +"7e3d45ef": "gameMiningToken(uint16)", +"7e3d8813": "setup(address,uint256,uint256,uint8)", +"7e3da027": "approveAndCustomCall(address,uint256,bytes,bytes4)", +"7e3dbf96": "addr(bytes,bytes)", +"7e3df726": "EZEtherMarketplace()", +"7e3e40ec": "getRequiresKing(bytes)", +"7e3e7bdf": "checkReward(address,uint256,uint256)", +"7e3ef7cd": "getMyBalance(address)", +"7e3ef935": "setReleaseMake(uint256,bool)", +"7e3f2b2d": "getDocumentSignsCount(uint256)", +"7e3f5b70": "JFBToken()", +"7e3faec1": "GoldTxFeePool(address,address,bytes)", +"7e402eb0": "setSecondAdmin(address)", +"7e410427": "aDay()", +"7e4115ba": "toAddress(string)", +"7e4241b4": "ownerTake(uint256,address)", +"7e429f02": "burnMultDen()", +"7e42be1a": "quarantineAddress(address)", +"7e42f8b4": "setRefund(bool)", +"7e42f94d": "horsePr(uint256)", +"7e43185a": "showCollectorsAddresses()", +"7e4358c3": "used_in_contract_fees()", +"7e43828e": "bountyTokenWithdrawal()", +"7e441048": "hasCategory(address,uint256,uint256)", +"7e445d44": "setEndICO(uint256)", +"7e456808": "reclaimUnusedEtherBalance()", +"7e457b85": "startEarlyStage3()", +"7e458492": "addInspector(address)", +"7e45d15c": "___coinAddress()", +"7e466bb4": "forTeamCOT()", +"7e470882": "setStrF1(string)", +"7e482379": "totalEthInWeiForSecondIco()", +"7e4929c4": "priceBox2()", +"7e4930ae": "modifyCap(uint256)", +"7e495dae": "changeMinters(address,address,address)", +"7e4985c5": "LookUpAvailableDivLarge(address)", +"7e49aa05": "testSelfdestructIsRevertedWithMinReturn()", +"7e49d530": "fechVoteMainInfoBySnapshotBlock(uint256)", +"7e4a1731": "returnWallet()", +"7e4a82b1": "foreignBuyTest(uint256,uint256)", +"7e4b5eb5": "getPhControlLimits(bytes32)", +"7e4c3b2e": "requestRate(string,string,bool,uint256,uint256)", +"7e4d25c5": "Refundably_if_gasprice_more50gwei_Send_Votes_From_Your_Balance(address,uint256)", +"7e4d4495": "getEthCapPerAddress()", +"7e4d4653": "echoTest(uint256)", +"7e4d5ea1": "STARTDATE()", +"7e4e46e7": "withdraw_profit(address,address)", +"7e4e95d7": "airDropPercent_()", +"7e4eb35b": "left43(uint256)", +"7e4f1a9f": "AKMJCHAIN()", +"7e4f6b95": "MyAdvancedToken(uint256,string,string)", +"7e4f9397": "gSetAlive(bool)", +"7e4fdd0b": "SetherStarted()", +"7e545305": "firstBalance(address)", +"7e5465ba": "approve(address,address)", +"7e549814": "setEscrowedProjectPayees(uint256,address)", +"7e54b8e2": "AddCandidate(string)", +"7e551b75": "hashOf(uint256)", +"7e55a212": "JustTheTipCrowdsale(uint256,uint256,uint256,address)", +"7e55a311": "getPurchaseSeconds()", +"7e55b83c": "readValidDate(uint8)", +"7e55ec25": "CryptoPokemon()", +"7e569e66": "TDEContributorCount()", +"7e56d25f": "ReplyShare(uint256,string,bool,string)", +"7e56fde5": "calculateEggBuySimple(uint256)", +"7e5713d9": "setGenesisAddressArray(address[])", +"7e574098": "confirmEthTransactionRequest()", +"7e575524": "poolMintAmount()", +"7e577274": "onAuctionEnd(bytes32)", +"7e580d30": "ZCrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"7e58f815": "pauseRoundA()", +"7e59092e": "getVersionById(uint256)", +"7e5912d7": "reputationHashSubmissions(address)", +"7e59d513": "deathData_f1()", +"7e5a4dde": "getMarriage(uint256)", +"7e5a66df": "uniqueSpinnerOwners(uint256)", +"7e5a9ed9": "updateHpbNodeBatch(address[],bytes32[],bytes32[],bytes32[])", +"7e5af26c": "BugisContract()", +"7e5b1cdd": "GOToken()", +"7e5c344a": "Upgrade(address,address,uint256)", +"7e5c86a2": "moveFundToOwner(uint256)", +"7e5cd5c1": "disableMinting()", +"7e5e190c": "getBaseTypeStats(uint256)", +"7e5fc6f4": "calculateIcoBonus(uint256,uint256,uint256)", +"7e600c87": "doSend(address,address,address,uint256,bytes,bytes,bool)", +"7e602078": "assertInvalidState(address)", +"7e60a4bf": "removeLockFunds(address[])", +"7e61c768": "isClient(address,address)", +"7e61e6ef": "GasWar()", +"7e621667": "sendFromOwn(address,uint256)", +"7e626e58": "getUnPurchasedProducts()", +"7e62eab8": "withdraw(int256)", +"7e638974": "CalculateFinalDistance(bytes32,bytes32,bytes32,bytes32)", +"7e63dd86": "seed_additional_token(uint256)", +"7e64721f": "viewNumberOfMessages()", +"7e6503bb": "getActiveOrderCounts()", +"7e655ddd": "tokensSoldInThisRound()", +"7e6667c9": "Invoked(address,bool,uint256)", +"7e6688a2": "lastJackpotPayout()", +"7e668cd2": "fSqr(uint256)", +"7e66f15f": "nowSupply()", +"7e67429f": "switchToCrowdsale(string)", +"7e687a8b": "getTotalInvoicesCount(address,uint256[])", +"7e69671a": "distributeFees(uint256,uint256)", +"7e69ba22": "ethForTokens(uint256)", +"7e69e0fc": "ETH420on420()", +"7e6a0720": "removeClaim(uint32,int256,string,string)", +"7e6b867f": "insertProductIntoCart(uint256)", +"7e6bdb95": "getTransactionHashes(uint256,uint256,bool,bool)", +"7e6beae1": "team2018TokenCreated()", +"7e6c945c": "FileHashInt()", +"7e6d0fa0": "isWithdrawAllowed()", +"7e6d6928": "SmartBusinessToken()", +"7e6d86ff": "BOUNTIES_SHARE()", +"7e6dce9c": "throwIn()", +"7e6e65f3": "acceptSellOffer(uint32)", +"7e6eee20": "olympusTest()", +"7e6f6947": "setTokenBurnFeeAbs(address,address,uint256)", +"7e71496b": "TRCToken(uint256,string,string)", +"7e71572b": "_checkCap(uint256,uint256)", +"7e71ccd8": "HShoe_Limit()", +"7e71fb09": "transferOwnershipImmediately(address)", +"7e72fb52": "buyToken(address)", +"7e7307c5": "Contribute(bool,uint8)", +"7e737551": "setMaxWhitelistLength(uint256)", +"7e7388b1": "NewRiskAdr(address)", +"7e742432": "addNewDegree(string,bytes32)", +"7e74325f": "turn(address)", +"7e74a1ed": "depositRate()", +"7e754146": "getCurrentImpeachmentUrlDetails()", +"7e761240": "setMyName(bytes32,bytes32)", +"7e766e1f": "IonixxToken(uint256,string,string)", +"7e76b836": "minter1()", +"7e7712f2": "standardReleaseAmount()", +"7e773d9d": "testTimestamp()", +"7e77509e": "isRoundingErrorFloor(uint256,uint256,uint256)", +"7e779985": "isTransactionSuccessful(uint32)", +"7e77c503": "initialize(string,string,uint256,address,address)", +"7e780157": "PERCENT_100()", +"7e7894e4": "PendingETHs()", +"7e79a562": "TripPay(uint256,string,string)", +"7e79e8ba": "getEmail()", +"7e7a2fbf": "contribute_toTheGame()", +"7e7af34f": "setPostICOSale(bool)", +"7e7be158": "validatePurchaseAndDistributeFunds(uint24[],uint24[],uint256[])", +"7e7c16de": "secsPerBlock()", +"7e7c4243": "getTheBet(address)", +"7e7c8c6e": "catToken()", +"7e7d5689": "requireTrade(address)", +"7e7d76ad": "SPORT(uint256,string,uint8,string)", +"7e7db227": "lastAccountNum()", +"7e7dd581": "oldDBAddress()", +"7e7e4b47": "getOutcome()", +"7e7e5a75": "changeIdentityNarcoRespect()", +"7e7f1bfd": "total_refunded()", +"7e7f8e1e": "AddItem(uint256)", +"7e809973": "hash(address)", +"7e815fb4": "ScooterCoin()", +"7e81701a": "sitExchanger()", +"7e81b6aa": "KingdomFactory()", +"7e823bd1": "OMGToken()", +"7e82d0e6": "dbkWithdraw()", +"7e83027f": "setRegionForSaleToAddress(uint256,uint256,uint256,address)", +"7e8306ae": "profitrate()", +"7e83185b": "updateImageAddress(string)", +"7e835e86": "minechaincointest(uint256,string,uint8,string)", +"7e837ccc": "dispute_confirmed()", +"7e84adda": "setGameState(bytes32,int8[128],address)", +"7e85477f": "myInner1()", +"7e86e0f2": "BKFToken()", +"7e86f8e5": "blockedDeadLine(address)", +"7e873c2c": "uniq(uint256[])", +"7e87cf30": "tokenOpen()", +"7e888767": "getNumUsersToPayout(bytes32)", +"7e88f603": "returnDeposit()", +"7e893159": "changeIssuer(address)", +"7e8a9db9": "BasketEscrow(address,address,uint256)", +"7e8ab941": "_play(uint256,uint256)", +"7e8bca6f": "Tenteniy()", +"7e8bf1cd": "calculateCurrentMarketPixelPrice()", +"7e8c3ab6": "distributePartnerTokens()", +"7e8ca5f6": "unlockAdvisorTokens()", +"7e8d1a39": "finishIssuing()", +"7e8d2c19": "reserveForJackpot()", +"7e8e13e4": "Lesson_7(address,uint256)", +"7e8e353c": "setValidatorForND(uint256,uint256,uint256,uint256)", +"7e8e6d45": "setScaleContractAddress(address)", +"7e8ecf4f": "balanceOfInvestor(address)", +"7e8ff036": "submit(bytes32[])", +"7e904a48": "getNumContents(uint256)", +"7e904f7b": "stakePrimordialTokenFrom(address,uint256,uint256)", +"7e90819a": "unofficialApplicationSignUp(string)", +"7e9266bb": "ChallengeToken()", +"7e926b4b": "renounceOwnership(bool)", +"7e92a7e8": "getPublicBattlePokemon1()", +"7e93150b": "_transferHelper(uint256)", +"7e93163b": "tip(bytes32,bytes32)", +"7e932d32": "setFrozen(bool)", +"7e93810b": "playe1Bid()", +"7e93e4db": "KhabibvsMcGregor()", +"7e944756": "getPlayersCollection(address)", +"7e945935": "oneTokenInCents()", +"7e947347": "changeWeiCostOfToken(uint256)", +"7e94cf0c": "getValidityBondAttoeth()", +"7e951bc6": "update_coeff()", +"7e95385c": "setJackpot(address)", +"7e95cd27": "forbid(address)", +"7e95d2f6": "doSend(address,address,uint256,bytes,address,bytes,bool)", +"7e968195": "batchTransferETH(address[])", +"7e969692": "EthRateChange(uint256)", +"7e97ca29": "registeredInDay(address)", +"7e98bc8f": "Accumulate(address,uint256)", +"7e990ad8": "isRentals()", +"7e999cd9": "revokeMintDelegate(address,int256)", +"7e9a8685": "getWager(address)", +"7e9abb50": "getUnavailableTakerTokenAmount(bytes32)", +"7e9ad046": "upper(string)", +"7e9aef53": "elementsAreSet()", +"7e9b98ae": "transferFromWhiteList(address)", +"7e9ba301": "getResponseAddress()", +"7e9cd30c": "rescueLostHero(uint256,address)", +"7e9d2ac1": "burnAll(address)", +"7e9d7f68": "namiCrowdSaleAddr()", +"7e9de0bc": "buyTile(uint8,uint256,address)", +"7e9e1561": "getStakerFromDelegateKey(address)", +"7e9e1637": "getStockTotal(address)", +"7e9e1cb6": "Execution(bytes32)", +"7e9e3b3b": "RESERVED_TOKENS_BOUNTY()", +"7e9e3d51": "TokenERC20(string,string,uint8,address,uint256)", +"7e9e4b5d": "firstStageTokensSold()", +"7e9e511d": "issueAndActivateBounty(address,uint256,string,uint256,address,bool,address,uint256)", +"7e9e940a": "ClaimDisbursement(address,uint256)", +"7e9eaf41": "getMinBorrowedValue()", +"7ea01c0d": "currentLowest()", +"7ea074b3": "GetJackpots()", +"7ea11880": "VestedPayment(uint256,uint256,uint256,uint256,uint256,address)", +"7ea15da1": "priceUpdateAt()", +"7ea17a1d": "ORACLIZEQUERYMAXTIME()", +"7ea1a871": "announce(uint256,uint256,uint256)", +"7ea1b7ba": "_closeSale()", +"7ea1e2d9": "ethpause()", +"7ea23fa6": "unlockEthBalance(address,uint256)", +"7ea2bbac": "getOwnerGennezise(address)", +"7ea2be2b": "log32(uint32)", +"7ea2ddeb": "randomNumber(address,uint256,uint256)", +"7ea2e31c": "EligmaMintingContract()", +"7ea2fc89": "cancelBetByPlayer(uint256)", +"7ea30d5d": "BuyCreditsByEth(uint256)", +"7ea310d4": "getCurrentPrice(uint40)", +"7ea31352": "getReadableStats()", +"7ea31ded": "isBuyBackOne()", +"7ea46993": "revokeMultiplePermissions(address,bytes32[])", +"7ea531e7": "_generateNewHorseShoe(uint256,uint256,address)", +"7ea5d50e": "tokenWinRatio()", +"7ea5e7d3": "reserveDeployment(address,bytes32,address,uint256,uint8,bytes32,bytes32)", +"7ea60eb8": "roleEditorAddress()", +"7ea61ed7": "withdrawInternal(address)", +"7ea6c6ba": "MemoLandCoin()", +"7ea80eb2": "_receiveBuyLandForCandy(address,uint256)", +"7ea83869": "increasePreSaleSupply(uint256)", +"7ea84748": "addPlayerOrder(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"7ea868e1": "makeInvest(uint256,bytes5)", +"7ea8f250": "isRunningPreIco(uint256)", +"7ea94985": "calcHashes(uint32,uint32)", +"7ea95733": "emissionReleaseThreshold()", +"7ea9b2bc": "REQUEST_URL()", +"7eaa0c29": "LogTransactionFailed(bytes32,address)", +"7eaa4389": "finish(uint8,uint8,uint8)", +"7eab4e48": "openGiftFromSanta(address)", +"7eac7382": "getCAOAddres()", +"7eae1626": "getBack()", +"7eae6759": "_setBalance(address,uint256,uint256)", +"7eae75a8": "EtherMango()", +"7eaef50c": "over()", +"7eaf45f8": "SaveAccountBuyingGodz(address,uint256)", +"7eafcdb1": "updateGroupName(address,address,bytes32)", +"7eb13d8a": "_SetEducationQualificationOf(uint256)", +"7eb14990": "isBuyer(address,uint256)", +"7eb1bfb9": "feeWithdrawEthAll()", +"7eb2b856": "createEscrow(bytes16,address,address,uint256,uint16,uint32,uint32)", +"7eb30cd0": "checkTreeStructure(address,address)", +"7eb312b1": "SUCCESS_BONUS()", +"7eb41ce5": "modifyCfo(address)", +"7eb4b376": "UpgradeSpaceETH(uint8,uint256)", +"7eb52145": "_preValidateFinalization()", +"7eb5df39": "equal(uint256[],uint256[],string)", +"7eb60591": "NVISIONCASHTOKEN()", +"7eb6634c": "phasePresale_From()", +"7eb69ba1": "hint(int256,bytes32,string,bytes20)", +"7eb82601": "getHighestBlockNumber(uint256)", +"7eb96aa3": "setCurrentWeekPool(uint256)", +"7eb9f04a": "updatePriceInWei(uint256,uint256)", +"7eba7ba6": "getSlot(uint256)", +"7ebaaa60": "MemberBoughtToken(address,uint256,uint256,uint256,uint256,uint256)", +"7ebadcd8": "acceptPayments(bool)", +"7ebd02f8": "typeA()", +"7ebd89ee": "TokenSale(address)", +"7ebdab54": "setup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256[],uint256[],uint256[],uint256[],uint256[])", +"7ebdc478": "settleTimeout()", +"7ebdf4ac": "setMaxAllowedBetInEth(uint256)", +"7ebdf57d": "icoTimeBonusPhase1End()", +"7ebe7626": "FreezeTokensReleaseTime()", +"7ebedc34": "hasEndedIco()", +"7ebf65fd": "changeGasLimitOfSafeSend(uint32)", +"7ec0c39c": "whitelistPrincipleLockPercentage()", +"7ec0f30d": "ack(string)", +"7ec13996": "getBytes32Value(string)", +"7ec1c1aa": "acceptPAIReceiptOwnership()", +"7ec20127": "createPoolIfNeeded()", +"7ec2402f": "freezeSupply()", +"7ec27000": "AiTokenToken()", +"7ec2ae46": "setSparkDividends(address)", +"7ec2e264": "_generateCode(address,uint256)", +"7ec2fd36": "capReleaseTimestamp()", +"7ec2fd95": "DrawCom()", +"7ec36494": "osmCoin()", +"7ec3e63e": "getsubscribersSinceLastHatch(address)", +"7ec4a5a6": "requestReturn(address)", +"7ec4edbe": "offset(address,address)", +"7ec509c4": "external_call(address,uint256,uint256,bytes)", +"7ec54bdc": "eosShareDrop()", +"7ec62cf7": "MthereumToken()", +"7ec650db": "__mul(bytes,bytes)", +"7ec69c50": "changeWhitelistingStatus()", +"7ec72d3c": "setSwap(address,uint256)", +"7ec80c27": "priceStep6()", +"7ec82929": "setFunctionIdVoteRules(bytes4,bool,uint256[5])", +"7ec8ff4f": "crosairVoucherSoldCount()", +"7ec9084d": "RRCoin()", +"7ec9290b": "setCouldTrade(uint256)", +"7ec9c3b8": "per()", +"7ecab507": "registerPresale(address,uint256,uint256,bool)", +"7ecacb95": "Example7()", +"7ecaf696": "createMultiple(uint256[],uint256[],uint256[],address[])", +"7ecb6475": "aggiungiFrase(string)", +"7ecc2b56": "availableSupply()", +"7ecc866f": "changeAllowAllWhitelistIssuances(bool)", +"7eccc40a": "contains(uint256,address)", +"7ecdb299": "SetEthBalance(address,uint256)", +"7ecdbf61": "SPPSeriesA(uint256,string,uint8,string)", +"7ece75dd": "lockPeriodStart()", +"7ecedac9": "allInitialOwnersAssigned()", +"7ecef543": "_getAppliedPolicyIndex(address,uint8)", +"7ecf9142": "depositToken(address[2],uint256[7],uint8,bytes32[2])", +"7ecfa8a8": "ico(address,address,uint256,uint256,address[],uint256[])", +"7ecfae65": "invokeFor(address)", +"7ecfb675": "stdBalance()", +"7ed02af9": "acceptNegotiationTenant()", +"7ed02cbe": "fireLottery(uint8)", +"7ed040f2": "prod(bytes32,uint128)", +"7ed04cf2": "getTokenNames(address,uint256[])", +"7ed05315": "newGubberment()", +"7ed06cf3": "nativeProof_verify(string,bytes,bytes)", +"7ed0c3b2": "write(bytes)", +"7ed0f1c1": "redeemed(uint256)", +"7ed18aa5": "WhitelistUpdated(address,uint8)", +"7ed19af9": "multiAccessRevoke(bytes32)", +"7ed1ca6a": "BetExecuted(uint256,address,uint256)", +"7ed273e9": "_mintToken(uint256,string,address)", +"7ed2d5ae": "getBlockBalance(uint256,uint256)", +"7ed32df6": "buyRtc()", +"7ed37b8d": "setPotato(string)", +"7ed40602": "IsICOstarted()", +"7ed4e321": "CakeToken()", +"7ed51b47": "getResult(uint256,uint256,uint256,uint256,uint256)", +"7ed57fa0": "pregnantHorses()", +"7ed5a6d4": "TYPE_EXPLORER_FREIGHTER()", +"7ed5d621": "Crowdsale(address,address,address,uint256,uint256,uint256)", +"7ed65c87": "closeProvider()", +"7ed67185": "getPoolTimeoutInBlocks(uint256)", +"7ed7101d": "mainIcoStartBlock()", +"7ed77c9c": "setContract(bytes32,address)", +"7ed788c8": "push(address,uint256,uint256)", +"7ed83d50": "INCO()", +"7ed8a719": "addItem(string,string)", +"7ed8b225": "createMesaVerify(bytes32[])", +"7ed9c734": "burnRemainingToken(uint256)", +"7ed9d3a3": "_error(uint256,bytes32)", +"7eda09e8": "test_me(int256,int256,int256)", +"7edaabd8": "sendApprovedTokensToInvestor(address,uint256,string,string)", +"7edaca89": "DAToken(uint256,string,uint8,string)", +"7edba6c8": "sam()", +"7edd9060": "_nominCap()", +"7eddea21": "STAKEHOLDERS_POOL()", +"7ede036d": "minimumSupply()", +"7edea039": "private_addPermittedRoll(uint256)", +"7edebaf1": "buyXname(string)", +"7edee605": "receivePayment(uint256,uint256,bytes)", +"7ee0cda4": "validate(string,uint256)", +"7ee0d91c": "isKycRequired(address)", +"7ee212bb": "planetIndexToApproved(uint256)", +"7ee23d59": "removeNodeFromStakedList(address)", +"7ee26b2e": "callKoikeToken(address,address,uint256)", +"7ee26e63": "_alreadyInList(address)", +"7ee2ea76": "isSafeHavenToken()", +"7ee42e6d": "_createToken(string,bytes5,address,uint256)", +"7ee54b82": "TYU(uint256,string,uint8,string)", +"7ee54eec": "onTicketPurchase(uint32,address,uint16[])", +"7ee55c97": "isICO()", +"7ee5c97a": "returnReferral(address)", +"7ee5eef2": "changeToPublicSale()", +"7ee62440": "highEtherBonusLimit()", +"7ee65635": "LookAtDepositsToPlay()", +"7ee6b2d0": "fundingMinCapInWei()", +"7ee7f42a": "MIN_RELEASE_DATE()", +"7ee80d17": "isScheduled()", +"7ee81902": "DatoDEX(address,address,address,uint256,uint256,uint256)", +"7ee8703a": "getProgressOfAddressAndId(address,address,uint32)", +"7ee96f6d": "getEnd(uint256)", +"7eeb5906": "createCountry(string,string,uint256)", +"7eec20a8": "cancelTask(uint256)", +"7eed2814": "transferAD()", +"7eee1ab6": "HahaCoin()", +"7eee288d": "unlock(address,uint256)", +"7eee56f9": "issueIcoCoins(address,uint256)", +"7eee6d1f": "getUserQuickPromoBonus(address,address)", +"7eeec2cf": "GigaWattToken()", +"7eefe47e": "editCode(uint256,string)", +"7ef01fb9": "totalLockedBonus()", +"7ef0356a": "littafiTimeCapsule(bytes32,string,string,string,string,uint256)", +"7ef039f8": "candySentAmount()", +"7ef09476": "transfer(uint64,address)", +"7ef1925b": "getShareRange(uint256,uint8)", +"7ef1a396": "YOU9COINToken(string,string,uint8,uint256)", +"7ef1ab2c": "payoutRange()", +"7ef224ee": "getContractOrNormal(address)", +"7ef26d42": "HardCapEthereum()", +"7ef2bd52": "currNumOfUpgrades()", +"7ef3bb63": "createKitties()", +"7ef3e741": "totalEtherReceived()", +"7ef4cabb": "nextSupplyAfterBlock()", +"7ef50298": "registry(bytes32)", +"7ef581cc": "whitelistAdmins()", +"7ef58e73": "totalGooProduction()", +"7ef59d01": "setTrader(address,bool)", +"7ef5b6ea": "refillTokens(uint256)", +"7ef5e6a2": "rescale(int128)", +"7ef61e28": "dayEthInLimit_()", +"7ef72eb5": "AlphaMarketCoin(address)", +"7ef7ce92": "revokeMint(uint256)", +"7ef81a34": "TestableTwoStageSale(bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address,uint256,uint256,uint256)", +"7ef9016e": "MultiTransferValue(address[],uint256)", +"7ef92867": "Faucet(address)", +"7ef95c6f": "extractAccountAllowanceRecordLength(address)", +"7efa1433": "EVNTToken(address)", +"7efc05ae": "TUBECOIN()", +"7efc2315": "minPaymentForAnswer()", +"7efcbb33": "getTradeRecord(uint256)", +"7efce4ff": "TransactionRefunded(uint256,uint256)", +"7efce591": "TokenRDN(uint256)", +"7efd3441": "DynamicSKx2(uint256)", +"7efd9112": "decodeTokenId(uint256)", +"7efe0e76": "PhoenixFundDeposit()", +"7efe294c": "removeFromFreezedList(address)", +"7efe3d86": "dataControlChangeMinApproval(uint8)", +"7efe64ba": "InfinityHourglass()", +"7eff1465": "setAccountAllowance(address,address,uint256)", +"7eff275e": "changeProxyAdmin(address,address)", +"7effb427": "TTTToken()", +"7efff887": "topUpBalance()", +"7f002ffe": "setTradeable(bool)", +"7f004afa": "participantRoundChange(address,address,uint256)", +"7f005c7c": "showHiddenValue()", +"7f006ce1": "reading_card_upright_at(uint8)", +"7f008a0a": "cancelSell()", +"7f01bb38": "getVestingRevocable(address,address)", +"7f052e03": "commitPlasmaBlockRoot(bytes32)", +"7f053808": "approveAndAuction(uint256,uint256,uint256,uint256)", +"7f0554ca": "mntToken()", +"7f056637": "testExecuteSellOrder()", +"7f05c3a6": "supportAccounts(address)", +"7f067ff7": "Bitcoinsummit()", +"7f069942": "transferToBeneficiary()", +"7f070a9b": "withinRefundPeriod()", +"7f0899f2": "AddTicket(bytes5[])", +"7f08a250": "testPoint(uint256[3])", +"7f08ea8b": "getBetPool(uint256,uint256)", +"7f08ea8f": "getTotalTokensPerArray(uint256[])", +"7f09171b": "addAd(address,uint256,uint256,uint256,string,string)", +"7f095bfb": "multiSendB(uint256,uint256)", +"7f09ad64": "drainMe(uint256)", +"7f09bd1d": "setEthPreAmount(uint256)", +"7f09beca": "moveToWaves(string,uint256)", +"7f0a1bed": "bidderPlaceBid()", +"7f0b61f7": "ManagerEnabledEvent(address)", +"7f0bd881": "wanport()", +"7f0c949c": "setJurisdication(string)", +"7f0cd33c": "ApproveAndtransfer(address,uint256)", +"7f0d35e2": "totalPublicSaleWei()", +"7f0da94e": "cooloffIncrement()", +"7f0ed037": "setKickOff(uint8,uint256)", +"7f0f04a8": "unregister(bytes32,address,uint256,uint256,uint256)", +"7f0f09af": "EtherdeCoin()", +"7f102c16": "currentGameStatus()", +"7f10a3c0": "presaleBonusAddress()", +"7f1165c1": "getSencBalance()", +"7f1482b1": "round3Bonus()", +"7f15a21c": "modify(address,address,uint256)", +"7f15a6a3": "setCCH_edit_31(string)", +"7f16ab50": "replaceAuthorised(address,address)", +"7f16d7b3": "TRL2()", +"7f1731b6": "unsetRegistrar(uint256,address)", +"7f17b05d": "OwnerAddress()", +"7f17b79d": "setGameCost(uint256)", +"7f17ce9b": "DIGIPLACED()", +"7f180db7": "kudos(uint256)", +"7f187d2d": "score(bytes32,string)", +"7f18b569": "setKncPerEthBaseRate()", +"7f18f10c": "setGeneContractAddress(address,address)", +"7f191255": "punchOut(address,uint64)", +"7f1926c7": "GagarinToken()", +"7f1a2a73": "getEmployerAvgRating(address,address)", +"7f1a4c1f": "withdrawContributorsTokens(address,uint256)", +"7f1a8749": "purchaseMakeAdv(uint256,string,string)", +"7f1b1e51": "testTooFewTokens()", +"7f1b8cc3": "getUsersByBalance()", +"7f1bb473": "daysFrom(uint256)", +"7f1bffc1": "_removeToken(uint256)", +"7f1c25d0": "HolaMundo()", +"7f1ce417": "isITOFinished()", +"7f1ebc4d": "reentrantGuard()", +"7f1ecfe0": "getCurrentBid()", +"7f1f0507": "publicRate()", +"7f205a74": "SALE_PRICE()", +"7f205c8c": "getOraclizeCallback(bytes32)", +"7f205f02": "changeBoolean()", +"7f21d498": "getMinBid(uint256)", +"7f23fb92": "setGenres(string)", +"7f2438cb": "sellFor(address,uint256)", +"7f25c1e4": "etherRaisedByState(uint256)", +"7f2609eb": "LogFinalizeMatch(uint256,uint8)", +"7f26fc7d": "removeCreator()", +"7f279a73": "Cashing(address,uint256)", +"7f2857b6": "viewFunc()", +"7f28c44f": "isIcoSuccessful()", +"7f290d2d": "ExpiringMarket(uint64)", +"7f293e02": "ChangeCoinCrowdsale()", +"7f294b10": "setPI_edit_26(string)", +"7f298f93": "crowdsaleEndBlock()", +"7f2a4784": "KYC_VERIFICATION_END_TIME()", +"7f2aeea4": "getType(bytes32)", +"7f2b06ed": "bonusLimit3()", +"7f2b88ea": "getThirdPhaseCap()", +"7f2c1633": "prenesiKovance(address,uint256)", +"7f2c4ca8": "getLastBlock()", +"7f2e01fb": "ListValidated()", +"7f2e0ec2": "remainRewards()", +"7f2e98ad": "PoissonData()", +"7f2f506b": "CLAIM_INTERVAL_DAYS()", +"7f300576": "startThrowing()", +"7f301b83": "setMetadataHash(string)", +"7f31b480": "changeMasterAddress(address,address)", +"7f31cbfa": "batchShareAmount(address[],uint256[],uint256,uint256,uint256)", +"7f32f6de": "isSoftCapCompleted()", +"7f33375b": "getReturnedData()", +"7f334bd1": "_generateRandomId(string)", +"7f33c1e1": "Ethurem()", +"7f3436ef": "addOrganisation(address,string,string,string)", +"7f349329": "currentRoundSupply()", +"7f35571f": "Sell(uint256,address)", +"7f3681f6": "setKNCRate()", +"7f3745ad": "execute_transfer_all(uint256)", +"7f3745db": "getTracksByArtist(address,uint256,uint256)", +"7f37b905": "salesCounter()", +"7f37fab6": "addActionToRole(string,string,string)", +"7f3800ba": "setMultihash(bytes32,string,bytes)", +"7f386b6c": "minimumPrice()", +"7f38a4a7": "updateUSDETH(uint256)", +"7f38b980": "setTokenDistributionPool(address)", +"7f38e526": "pendingPayments(address)", +"7f390088": "QYCC()", +"7f3a2472": "reserveIssue(address,uint256)", +"7f3a98b7": "burnMyBalance()", +"7f3ad651": "KayoToken(address,address,uint256,string,uint8,string,bool)", +"7f3bd56e": "disburse(address,uint256)", +"7f3c26b1": "rejectHours()", +"7f3c2c28": "registerContract(string,address)", +"7f3cb47b": "minimumAmountWei()", +"7f3cd28e": "tokenSalesByOwner(address,uint256)", +"7f3d5c4c": "ICOPaused()", +"7f3ded93": "voxFab()", +"7f3df4bb": "addBonus(uint32[],uint64[])", +"7f3e1841": "endSecondPeriodTimestamp()", +"7f3e4d1b": "setAtkNowForPlayer(address)", +"7f3f3398": "transferAndCallExpanded(address,uint256,bytes,address,address)", +"7f3f81c0": "confirmProposal(bytes32,address,uint256)", +"7f404b7f": "updateInt256(bytes32,int256)", +"7f40d9d8": "delayDonPhase(uint256,uint256)", +"7f4316ec": "getDefendPlayerList()", +"7f4384a8": "RichNiggas()", +"7f440d57": "getProjectReport(uint256)", +"7f445c24": "subRegistrar(string)", +"7f44fcfa": "_getPoints(uint256)", +"7f453951": "CBMDToken()", +"7f45b835": "getPrimaryRecord(string)", +"7f45ec91": "emitIssuance(uint256)", +"7f460693": "ownerPutCapital()", +"7f46550f": "CrowleyToken()", +"7f476471": "setRCContractAddress(address)", +"7f480f9d": "processDividends(address)", +"7f486ca6": "cancelChibiForFusion(uint256)", +"7f493ce6": "disableTokenTransferability()", +"7f497550": "scheduleTransfer(address,uint256,uint256)", +"7f498ffc": "setEnd(uint256)", +"7f4a1c52": "setExceed(uint256)", +"7f4a9691": "depositTokenToVault(address,uint256,uint256)", +"7f4ab1dd": "messageForTransferRestriction(uint8)", +"7f4ae68d": "restrictedAddress()", +"7f4af951": "pixelPrice(uint256,uint256)", +"7f4bf7d1": "Inerex(bytes32)", +"7f4c7064": "ESCROW_TOKENS_PERCENT()", +"7f4d5150": "CheckItemExists(uint256)", +"7f4d6aa4": "LogResumed()", +"7f4da132": "goldFee()", +"7f4db7fb": "testPrivate(uint256)", +"7f4e4669": "raiseInitialSupply(uint256)", +"7f4e4849": "getContractState()", +"7f4ec5a7": "toAddressThrow()", +"7f4ed2c7": "addToWhitelistMulti(address[])", +"7f4ed5ac": "sumHardCapICOStage2()", +"7f4edd72": "getAllAdIdsByUser(address)", +"7f4ef9d4": "getText(uint256)", +"7f4fd78e": "BTCCollected()", +"7f50c74b": "FIXED()", +"7f51bb1f": "updateTreasury(address)", +"7f52fcae": "tokenAmountPerUser()", +"7f5341da": "startTimeSale3()", +"7f5369f1": "DEFAULT_REVOCABLE()", +"7f5375c1": "getLastWin()", +"7f53b15d": "_ICOSale(address,uint256)", +"7f555b03": "erc20Proxy()", +"7f55b2d9": "cleanBalance()", +"7f55b87f": "createCountry(string)", +"7f564472": "resetAmountBonuses()", +"7f5651d7": "setNamehash(string,bytes32)", +"7f56c072": "SIEChain()", +"7f56c0b4": "setTeamFundWallet(address,address,uint256)", +"7f56ca73": "Volkstest2()", +"7f573a4f": "UNSOLD_SOLD_RATIO()", +"7f582b47": "howMuchWithdrawed()", +"7f58b9ee": "allQueryIds()", +"7f592be4": "TRANCHE2_ACCOUNT()", +"7f592cfe": "setLLV_edit_12(string)", +"7f59cbcc": "withdrawFromRelay()", +"7f5a259f": "FIXED_RATE()", +"7f5a285a": "notInWhitelistAllow()", +"7f5a448c": "switchToWhaleMode(bool)", +"7f5ae339": "isAdminister(address)", +"7f5b47cd": "eventApproval(address,address,uint256)", +"7f5b503c": "toB32(bytes,uint256,address)", +"7f5ba3cc": "REGULAR_TYPE2()", +"7f5ba79f": "registerNewProduct(uint256,string,string,string)", +"7f5bfe30": "PaymentExecuted(uint256,address,uint256)", +"7f5d3dc8": "getStats(uint256,uint256[7])", +"7f5d85f8": "testBurnGuyWithTrust()", +"7f5dfd16": "approveProxy(address,address,uint256,uint8,bytes32,bytes32)", +"7f5e495d": "defaultLimits()", +"7f5f0d6a": "resumeIco()", +"7f5f17b1": "getCompte_8()", +"7f5f9128": "alreadyReservedForTeam()", +"7f601a50": "getHouseCardsNumber()", +"7f602231": "tip(bytes32,address,uint256)", +"7f60b20a": "getSlice(uint256,uint256,string)", +"7f60bb7c": "applyBonusAmount(address,uint256,bytes32)", +"7f6150cb": "getRoundCurKeyNo(uint256)", +"7f626f1a": "setStore(uint256)", +"7f630259": "getSuperReferrerRate(address)", +"7f63040b": "CompcoinCash()", +"7f630b4c": "share(string)", +"7f63af42": "deployConsortium(address)", +"7f64727b": "getTreesOnSale()", +"7f649783": "addToWhitelist(address[])", +"7f64c34e": "deadline365()", +"7f64d2d3": "NCAAChampionship()", +"7f654b1c": "setLatestPayday(address,address,uint256)", +"7f6578d3": "REFUND_PERIOD()", +"7f6597e0": "AcuteEthereumCloudMiningunion()", +"7f660b01": "FEE_COLLECTOR()", +"7f66af09": "card_titanium_first()", +"7f66ccbe": "EthereumVerge()", +"7f66d1f8": "mOnApprove(address,address,uint256)", +"7f671c1b": "insert(int128)", +"7f686259": "migrateBalancesFromLegacyRep(address[])", +"7f695f28": "isFlying()", +"7f6a731c": "donationAmountInWei()", +"7f6ae0c0": "canUpdateDeveloperMiningPower()", +"7f6d8955": "RegisterOne(uint32,address,address)", +"7f6ec891": "withdrawNonTopForTeam(address,uint256)", +"7f704657": "RESERVED_FOR_TEAM()", +"7f71f1f9": "controllerApproval(address,address,uint256)", +"7f725862": "_setNewEstimate(uint256,uint16)", +"7f7376e8": "launchSale()", +"7f74ac15": "ownerContract()", +"7f7575c9": "FixedSupplyCrowdsale(uint256,address,address,uint256)", +"7f760335": "PurchaseTokens(uint256,address)", +"7f761472": "canRedeemUTXOHash(bytes32,bytes32[])", +"7f7624d0": "MjolnirAddress()", +"7f7634ba": "winnerConfirmed()", +"7f76bd3a": "lastBlock_v18()", +"7f76d76d": "minCapIco()", +"7f784da7": "addNews(string)", +"7f78636a": "BASE_URL()", +"7f790b7b": "getCreateUniverseParentPayoutDistributionHashValue()", +"7f791790": "roll(uint16[],uint16)", +"7f791833": "toTimestamp(uint16,uint8,uint8,uint8)", +"7f792910": "setExchangeable(bool)", +"7f7977d1": "isFundraiser(address)", +"7f7985cf": "setEthUSD(address)", +"7f79cbfe": "MANHATTANPROXYLEXINGTONAVE()", +"7f7b1393": "getLocation(uint256)", +"7f7b17a0": "SetupPreSale(bool)", +"7f7c1491": "remove(address,address)", +"7f7d31dd": "sub32(uint32,uint32)", +"7f7d711e": "setRequireCustomerId(bool)", +"7f7dcdbf": "isContractOwner()", +"7f7de185": "handleProductionDecrease(address,uint256)", +"7f7fde8e": "sellAssets(address[],uint256[])", +"7f81f0b9": "setTransferLock(uint256)", +"7f83a4a6": "canRefund()", +"7f83bf7d": "setMinimumPayment(uint256)", +"7f84017f": "SELL_SOFT_LIMIT()", +"7f848ccb": "_packMakeData(address,uint256,uint256)", +"7f85066e": "Reflex()", +"7f853e7e": "MLCToken()", +"7f85c599": "addOrder(bytes32,address,uint256,uint256)", +"7f860330": "batchReturnEthIfFailed(uint256)", +"7f863cab": "Bid(address,uint256,address,uint256)", +"7f8661a1": "exit(uint256)", +"7f869d98": "stepFour(int256)", +"7f86cd3f": "parseLoanOfferRates(uint256[10],uint32[4])", +"7f86d985": "drunkness()", +"7f86f7f4": "walletPlatform()", +"7f877710": "recoverUnawardedMILs()", +"7f879229": "setSalesUser(address)", +"7f88616f": "onlyAdminAndNotInit()", +"7f89ce48": "initTiers(uint256[],uint256[])", +"7f8b8f48": "Ledger(address)", +"7f8b9478": "getImpliedRoot(bytes,bytes,uint256,bytes32[])", +"7f8c263f": "dragonBalance(address)", +"7f8d429e": "isFinalized(bytes32)", +"7f8d53c6": "put(address,uint256)", +"7f8dafef": "unsoldAllocationCount()", +"7f8fdcfb": "suspendDeposit()", +"7f9144ce": "token_member_order_pop(address,address,uint32)", +"7f91fb7d": "isSignedBy(address)", +"7f9245d0": "_clearTokenApproval(uint256)", +"7f924c4e": "testDeposit()", +"7f925c93": "withdrawSeller(address[2],uint256[7],uint8,bytes32[2])", +"7f93354b": "multiVoteNoLock(address[],uint256[])", +"7f9343ad": "playNumberSuit(uint256[])", +"7f93de95": "deposit100Percent()", +"7f947168": "TimeTransferAllowed()", +"7f949386": "updateMessage(uint256,string)", +"7f949ac0": "ethashContract()", +"7f94a8fa": "getWriteTimestamps(bytes32[])", +"7f95d6f6": "accountBalances(uint256)", +"7f95d919": "DistrFinished()", +"7f967a8c": "IsExchanged(address,string)", +"7f9785b0": "_resetList()", +"7f97e836": "didCommit(address,uint256)", +"7f98444f": "randomEnd()", +"7f99e11a": "isMiningOpen()", +"7f99f3c4": "MaybePerformOpen()", +"7f9ac04f": "balancesStaticoin()", +"7f9b48bc": "setCompte_9(string)", +"7f9bf9e4": "startMinting(string)", +"7f9c23e0": "_determineHitPoints(uint256)", +"7f9c8974": "getAssetCollectedOreBallancesArray(uint256)", +"7f9c9d91": "_getBorrowAmount(uint256,uint256,uint256,uint256,bool)", +"7f9cbfc1": "checkPayments()", +"7f9d139a": "positionScount(address)", +"7f9d2044": "UniBowToken()", +"7f9d314e": "autoBirth(uint256)", +"7f9df012": "VoteRevealed(address,uint256,uint256,uint256)", +"7f9f5495": "levelTokens()", +"7fa0c10f": "DeleteUserByAddr(address)", +"7fa0c908": "newChow(address)", +"7fa22001": "assertEq0(bytes,bytes,bytes)", +"7fa24846": "SetSAToEContract(address)", +"7fa28d75": "transferRightIfApproved(address,bytes32)", +"7fa34e92": "preIcoAddr()", +"7fa39958": "RateAdd(address)", +"7fa3f3d0": "addLock(uint256)", +"7fa400e4": "totalTokensAvailableForSale()", +"7fa40a42": "sumICOStage8()", +"7fa44926": "setMinMaxInvestValue(uint256,uint256)", +"7fa4cacb": "setDestinationAddress(address)", +"7fa5aa9d": "registerPreSignedHashing(address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256)", +"7fa6c365": "phase3MaxTokenForSale()", +"7fa6c745": "_setNewStartTime()", +"7fa767bc": "createBox()", +"7fa7a7c8": "buyInWithAllBalance()", +"7fa7acf8": "createCertification(uint256,uint256)", +"7fa87949": "unblockAccountFunds(address,uint256)", +"7fa8c158": "startICO()", +"7fa9aa76": "owner_updateBaseFee(uint256)", +"7faa0044": "renderString(string)", +"7fab541c": "exec(bytes32,bytes)", +"7fab624b": "purchaseGenes(uint256,uint256,bool)", +"7fabbd7b": "unilateralRefund(bytes32)", +"7fabe1a5": "allPendingRefs()", +"7fad54e4": "distributeGame(uint8,uint256)", +"7fad9b53": "BASE_TEAM()", +"7faddcfb": "currentDistributionAmount()", +"7faff876": "updateUser(bytes32)", +"7fb00168": "CryptekZ()", +"7fb0a445": "systemSaleAddress()", +"7fb0fe14": "voteCandidateTwo()", +"7fb158c5": "ChannelSettled(address,address,uint32,uint192)", +"7fb181c1": "swapTime()", +"7fb191a5": "TokenVestingContract(address,address,bool,bool,bool,address)", +"7fb1a5ed": "AirdropController()", +"7fb33170": "transferAdmin(address,uint256)", +"7fb33dc6": "burnTokensWhenFinished(address)", +"7fb3d459": "GetChipsInfo(address)", +"7fb419b6": "WalletBoss()", +"7fb5d847": "delTransferWhiteList(address)", +"7fb5ff3e": "MNTP()", +"7fb7b5ed": "enableTeamWithdraw()", +"7fb9e405": "getTitulaire_Compte_10()", +"7fbb1b56": "claimEgg(uint8)", +"7fbb345e": "getInvestorsTokens(address,address)", +"7fbc0c48": "_mint(uint256,address,string,string)", +"7fbc9c55": "calculateMultiplierAfterConversion(uint256,uint256,uint256)", +"7fbcef65": "BTH(address[],uint256,address,uint256,uint256,uint256)", +"7fbd778a": "getTotalScientists()", +"7fbe0680": "MIN_PURCHASE_OTHERSALES()", +"7fbea955": "getCanvasByState(uint8)", +"7fbf28f7": "_withdrawDivis(address)", +"7fc29fc9": "authorisedMinter()", +"7fc32915": "ThrowbackThursdayToken()", +"7fc38e04": "SponsorshipReceived(string,string,string,uint256)", +"7fc3bb26": "endPostICO()", +"7fc3f49e": "getReinvestableTokenAmount(address)", +"7fc446f2": "changeCustomDefrostingRate(address,uint8)", +"7fc4d6c3": "isPhaseExist(address)", +"7fc53fb5": "returnInvestmentsToInternal(address)", +"7fc543ec": "_donations(uint256)", +"7fc55eb4": "ContributionWallet(address,address)", +"7fc56856": "IOXDistribution(address)", +"7fc5af95": "getWinnerList()", +"7fc5f05c": "changeVoters(bytes32,address,string)", +"7fc611f0": "multiCall()", +"7fc729c2": "_buy(address,uint256,bytes)", +"7fc7e643": "SetUp(uint256,uint256,uint256,address)", +"7fc88fe2": "timelockContractAddress()", +"7fc8b612": "interadduser(address,uint256)", +"7fc8fd9e": "Update_MediatedTransaction(uint256)", +"7fc90182": "Pool(uint256)", +"7fc90a5c": "batchAssignTokens(address[],uint256[],uint256[])", +"7fc96619": "getPartner(uint256)", +"7fca432e": "FHFTokenCrowdsale(address)", +"7fcac0fb": "USDBCoin()", +"7fcae430": "PendingApplication(address,uint256,string)", +"7fcaf666": "setString(string)", +"7fcb024a": "secondLockTime()", +"7fcb2386": "MorrowToken()", +"7fccb4ba": "transferAppOwner(bytes8,address)", +"7fcd3ce2": "maxBetPrice()", +"7fcdd1f0": "setConfirm(uint256)", +"7fcf3a2f": "throwFooBar()", +"7fcf440a": "getOwnerBalance(address)", +"7fcf532c": "Withdrawal(address,uint256)", +"7fcf64b2": "updateEarnedBy(uint256,uint256)", +"7fcfb422": "increaseApprovalWithData(address,uint256,bytes)", +"7fcfc4a0": "ApisToken()", +"7fd004fa": "submitWhitelistAddition(address[])", +"7fd13532": "whitelistMany(address[],uint256,uint256,uint32)", +"7fd169d6": "createGroup(string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"7fd19692": "setLockAddress(address,bool)", +"7fd2304f": "_maximumBuy()", +"7fd238ba": "doCoinage(address[],uint256[],uint256,uint256,uint256)", +"7fd26dd1": "tokenUsers(uint256)", +"7fd2ffa7": "InvestorWhiteListAddition(address)", +"7fd30df0": "mintBulk(address[],uint256[])", +"7fd39247": "setOwner(uint256,address)", +"7fd42617": "safeWithdraw()", +"7fd5bb31": "propose(address,bytes32,address[],bytes32[])", +"7fd5dd04": "APPROVE_OWNER()", +"7fd6f15c": "feePercent()", +"7fd751a8": "PRICE_ICO2()", +"7fd84609": "setOwnerThree(address)", +"7fd8601e": "deathData_v5()", +"7fd8d339": "changeicoBackend(address)", +"7fd8d51d": "stakeGLXForContributors()", +"7fd8ee68": "computeNameHashExt(bytes)", +"7fda8d52": "internalEnableRefunds()", +"7fdac6f1": "getCurrentCreditsExchanged()", +"7fdafafa": "totalTreePower()", +"7fdb0d6b": "Latcoin()", +"7fdb5031": "transferableTokens(address,uint256)", +"7fdb5efb": "GDCAcc01()", +"7fdb6720": "teamFundAddress()", +"7fdbd0f2": "ERC721DutchAuction(address,uint256)", +"7fdc5bd6": "LANA()", +"7fdc8290": "isUnderscore(bytes1)", +"7fdd458d": "createWithParents(bytes32,bytes32,bytes32[])", +"7fdd5403": "clearApproval(uint256)", +"7fdd69f6": "setMaxAllowedReservingPercentage(uint256)", +"7fddc0de": "getBiddingInfo(uint16,address)", +"7fde1c8a": "addRole(address,uint256)", +"7fde24c7": "addToPrivateWhitelist(address)", +"7fdea25b": "newVoting(uint8)", +"7fdf6911": "checkRoundAndDraw(address)", +"7fdfbe1b": "getBytes(string,uint256,uint256)", +"7fe02f94": "fireFightResultsEvents(uint8[4])", +"7fe0518a": "asyncSend(address,uint256)", +"7fe09003": "NewBlock(uint256)", +"7fe0c38b": "JOCKEY_LIMIT()", +"7fe0ff52": "StorageFee(address,uint256)", +"7fe11990": "authoriseManyAccounts(address[])", +"7fe11adc": "resetStage(uint8)", +"7fe18cf7": "_getInStageIndex()", +"7fe1a801": "setBountyCampaign(address)", +"7fe1dc7e": "getToken(bytes)", +"7fe1feb0": "initEmployee1()", +"7fe23f62": "winPool()", +"7fe275d4": "culmulative_demurrage_collected()", +"7fe320ab": "mvpExists()", +"7fe38fc3": "etherwow()", +"7fe3dc2e": "getGasCost()", +"7fe551fd": "clearingPrice(bytes32)", +"7fe5850b": "_redeemByDefaultPartitions(address,address,uint256,bytes,bytes)", +"7fe60640": "updateBtsPoint(int256,uint16,int256,uint16)", +"7fe650b1": "finalizeICOOwner()", +"7fe6eee0": "fundingLimit()", +"7fe846ba": "isSubjectDestruction(uint256)", +"7fe864b8": "MAX_TOKEN_CAP()", +"7fe88885": "storeHash(bytes32)", +"7fe8ca66": "sendInput(int256,int256)", +"7fe97bc5": "getSqrY(uint256)", +"7fe98ae0": "updateEthICOThresholds(uint256,uint256,uint256,uint256)", +"7fe9d39c": "changebeginnerprotection(uint256)", +"7fea061a": "TimeTransferAllowanceChanged(string,uint256)", +"7fea0d4b": "beforeAll()", +"7feb4685": "Chende()", +"7febd721": "presaleAmountRemaining()", +"7fec1b7a": "WBT()", +"7fec5d33": "Eightk()", +"7fec8d38": "trigger()", +"7fecd538": "isWaiting()", +"7feda59a": "revokeAttribute(address,string,bytes)", +"7fee4ecb": "GAS_PER_DEPTH()", +"7feec9be": "sams(uint256,string,string)", +"7feed5b6": "price_exponent1()", +"7fef036e": "totalEntries()", +"7fef21d4": "getBoundingBox(uint256)", +"7fef2d38": "updateMatchInfo(uint256,string,uint64,uint64)", +"7fefde53": "WillRegistry()", +"7ff02139": "updateCrytal(address)", +"7ff0346b": "getContents(bytes32[])", +"7ff276bd": "totalEthFundCollected()", +"7ff2acb7": "getData_2()", +"7ff2c70a": "ipo_price()", +"7ff2cf93": "getcertifieddatacount()", +"7ff31d2b": "setData_28(string)", +"7ff3366f": "TeamAddress()", +"7ff44544": "GetCurrentSalePrice(uint256)", +"7ff44a91": "getAllKeyNum()", +"7ff4b630": "action(bytes32[])", +"7ff6ea1c": "WolkCreated(address,uint256)", +"7ff6f83a": "_distributeTax(uint256,address)", +"7ff701dd": "TrackerToken()", +"7ff70a89": "getOwnedTokenList(address)", +"7ff729fc": "fillUpProject(uint256,uint256)", +"7ff860f6": "batchCreateAssetSale(uint256[],uint256[],uint256[],uint256[])", +"7ff86a35": "HappyBirthday(address,uint256)", +"7ff91228": "Stake(address[],address,address,uint256,address)", +"7ff92d6e": "set_address__Arina(address,address)", +"7ff931bd": "lastWinningNumber()", +"7ff988c5": "setKtcAddress(address)", +"7ff9b596": "tokenPrice()", +"7ffaae3e": "balanceEth(address,address)", +"7ffb8577": "totalGains()", +"7ffc0712": "getLifeRate(uint256)", +"7ffc80cf": "queryRandomTryTime_()", +"7ffcb093": "addVoter(address,bytes32[])", +"7ffce58e": "getTokenForInvester(address,uint256)", +"7ffdf53e": "conversionRate()", +"7ffe8be1": "setKycAddress(address)", +"7fff9f1a": "getProposalVoteCount(uint256,uint256)", +"7fffb7bd": "HelloWorld()", +"80007e83": "isVerified()", +"80008794": "round1Target()", +"80009630": "setCore(address)", +"8001553a": "OwnerRemoval(address)", +"80017cbc": "cancelLine(uint256,string)", +"80033408": "CANSale()", +"8003524e": "calcDoHash(string,bytes32)", +"800362ae": "loveStoriesCount()", +"80054c5d": "FreedomToken()", +"80056b5b": "changeAdminPrivilege(address,bool)", +"80057b9a": "getColor(uint256)", +"80059593": "numberAccounts()", +"8005993e": "getProfileHash(address,address)", +"800626a6": "AIR_1_SUPPLY()", +"8006692f": "stage3Deadline()", +"8006745b": "getPayout(address)", +"8006a5d3": "delegateAddresses()", +"8006f807": "COBAIN()", +"8007604b": "Stage1Deadline()", +"80078a0f": "ForFood()", +"8007acbf": "getActiveShareholdersArray()", +"80087745": "closeInvest(bytes5)", +"8008d5bc": "inSale()", +"8009484b": "getMaxBetAmount(uint8)", +"80097484": "transfer(address,uint32)", +"80097a8e": "adjustedPotBalance()", +"800a320a": "TokenGameTransfer(address,uint256)", +"800ab784": "verifyMerkleProof(uint256,uint256)", +"800bbd1f": "getCountTokens(address,uint256)", +"800c5086": "giveERC20AllowanceToKyber(address[])", +"800c7e38": "getCurrentPageCount()", +"800d0f6a": "LCToken(uint256,string,uint8,string)", +"800d41a3": "newExitWallet(address)", +"800deda5": "yoyoTransfer(uint256,string,string)", +"800ed545": "MWSToken()", +"800edb9d": "changeCap(uint256)", +"800f8e52": "placeBetWithInviter(uint256,address)", +"80105295": "maxUserPower()", +"801137e7": "setDepositPercents(uint256)", +"80113832": "ORDER_MODIFY(address,address,uint256,uint256,uint256)", +"801145bd": "sig_to_add(bytes16)", +"801161b0": "setMain(address)", +"80117026": "FRAC_BOT()", +"801298fa": "changePaymentFlagger(address)", +"80130383": "LGCY()", +"801336cb": "STARTING_RickAndMorty()", +"8013f267": "calcUnMaskedGuEarnings(uint256)", +"8013f3a7": "dev2()", +"8014f238": "editCard(uint8,string,string,string)", +"801512af": "SvinChainToken()", +"8015a96d": "For_admin()", +"8015e6f3": "getDungeonPower(uint256)", +"8016b6ed": "getKeyValue(address,string)", +"80173a19": "geneManager()", +"8017732d": "LDT()", +"801a115d": "transfertCopieExecutoire(bytes32)", +"801a1467": "swapFor(address)", +"801aaffb": "potWithdrawTo(uint256,address)", +"801aba56": "etherProceeds()", +"801b4189": "claimRental()", +"801c334e": "auctionIncreaseBid(bytes32)", +"801db9cc": "MIN_CAP()", +"801e2593": "maxAllowedAmount(address)", +"801f568e": "SpenderAuthorization(address,bool)", +"80200e12": "subFreelancerTotalInvoiced(address,address,uint256)", +"802028c9": "createDerivative(bool,uint8,uint256,uint256,bytes16,uint256,uint256)", +"802049ac": "setUpgradeableTarget(address)", +"8020f54e": "addAssetToNetwork(address)", +"8020fb77": "getCurPayTable()", +"8020fc1f": "isDeregistered(address)", +"802114a8": "_removeRole(address,string)", +"80218eeb": "tokensIssuedTillNow()", +"802293c2": "getResultblockHash(bytes32)", +"8022fb7a": "setFrozenCoin(bool)", +"8023769f": "getPCAddress()", +"8023ffbd": "getOverallSize()", +"80249468": "getUserHSCeducationDetails(string)", +"8024c400": "limitPerDay(uint256)", +"8025e303": "VERSION_NUMBER()", +"802608a2": "setExpirationDate(address)", +"802644a4": "fundingEndUnixTimestamp()", +"8026efaa": "token18KstepCAP()", +"8026fe24": "FundTransfer(address,uint256,uint256,bool)", +"8026ffd9": "_move(address,address,uint256)", +"80270b33": "CSCResource(string,string,uint256)", +"80274db7": "preRelayedCall(bytes)", +"8027dece": "updateShare(address[],uint256[])", +"8028bdc4": "returnedCWC(address,uint256)", +"8028ce6b": "claimRefundsFor(address[])", +"80296dec": "admin_check(address)", +"802a350f": "addCustomerService(address)", +"802b1d93": "officiant()", +"802b45e2": "ISBCoin()", +"802b8453": "setPerventValue(uint256)", +"802bbab2": "ChainStarBase(uint256,string,string,uint8)", +"802c8cda": "_cancelEscrow(address,uint256)", +"802cd15f": "changeDistributor(address)", +"802d1848": "setLimitations(uint256,uint256,uint256)", +"802daa62": "latinotoken(uint256,string,uint8,string)", +"802de8fc": "setPremiumFactors(bytes32,uint256,uint256)", +"802deb22": "TokenTrader(address,uint256,uint256,bool)", +"802ea720": "getTotal(bytes)", +"802eb89c": "_getWeight(uint256)", +"802f2ffa": "_addPayment(address,uint256,uint256,uint8)", +"802f5bae": "ADDITIONAL_PORTION()", +"802fcc0d": "internalSafeTransferFrom(address,address,uint256,uint256,bytes)", +"80311bf9": "buyCore(uint256,uint256,uint256,uint256)", +"8031233c": "inflationCompBPS()", +"80318be8": "transferOverride(address,address,uint256)", +"8031e85c": "calculatePremium(uint256,uint256,uint256,uint256,string,string,string)", +"80322cbd": "isNowApproved()", +"80325b2d": "queryN(uint256,string,bytes,uint256)", +"8032751b": "returnInvestments(uint256)", +"803287de": "_frozenTokens()", +"80330982": "sendEther(address,address)", +"80334b8f": "TomBit(uint256,string,uint8,string)", +"8033c643": "ROSCAv1(uint16,uint128,uint256,address[],uint16)", +"8033cc70": "StealthToken()", +"8033fe49": "releaseEnd()", +"80341744": "contactsAddresses(uint256)", +"803435d7": "startDefinedGameManually(uint256)", +"80355798": "isAlreadyUsed(uint256)", +"803587ae": "invalidateCertificate(bytes32)", +"8036b5db": "setPresidenteDeMesa(bytes32,uint256,uint256,bytes32)", +"8036d757": "getRateUpdateBlock(address)", +"80373436": "setSecondaryGameManager(address)", +"80378b78": "setShopRunning(address,bool)", +"8037bfe0": "unRedeemedMTU()", +"803965c4": "amountFixed()", +"803a62ea": "Register(uint256,address,address)", +"803b4c11": "OwnerUpdate(address)", +"803c64c3": "GetCardList(address)", +"803c6fa9": "getWeiTokensOwed(address)", +"803c8383": "getKey(address,address,uint32)", +"803cc0d0": "kscTransfer(address,uint256,string)", +"803d65ff": "_sendtoken(address,address,uint256)", +"803e8fbb": "lengthOf_dataPattern_to_voteRulesHash()", +"803ea2ee": "MoneyTransfered(address,uint256)", +"803fbe5b": "paymentRegularTokens(uint256,uint256)", +"803fcd43": "check(address,address,address,address,uint256)", +"80402564": "addrList(uint256)", +"8040cac4": "testOverflow()", +"80412042": "decrementOwnedTokensLength(address)", +"8041fcc4": "AVMToken()", +"8042b215": "developerPctX10K()", +"8042fba5": "newEscrow(address,address,address,uint256,bytes32,bool)", +"8043154d": "post(address,bytes32,bytes32)", +"804327bb": "buyPreIcoTokens(uint256)", +"8043c9c0": "eventName()", +"8043cf2d": "mintB()", +"8044c67e": "updatePrizes(uint256[])", +"804518a8": "nic()", +"8047ba70": "getTokensAmountUnderCap(uint256)", +"8047cb93": "createGame(bytes32,uint256,address)", +"8047cf41": "init(uint256,string,uint8,string,address)", +"80496fd6": "CaData()", +"804afd9e": "vigAddress()", +"804afffb": "tokenIndexToPrice(uint256)", +"804b55d5": "finaliseAs(address)", +"804ba97a": "tryGet(bytes)", +"804c68aa": "allocateTCLRinTeamTokens()", +"804c7fa0": "_migrateExoplanet(uint256,string,uint256,uint32,string,uint32,uint8,string,address)", +"804d564c": "whitelist10Addresses(address[10])", +"804d77c8": "approveLoanIdentifier(bytes32)", +"804e11dc": "testThrowsDisownNotTransferable()", +"804e1c53": "_updateProfit(uint256,bool)", +"804e8063": "setAffiliateEdge(uint256)", +"804ee2b5": "addProduct(uint256,uint256,string)", +"804f82d3": "showLastBidValue()", +"804fe7ac": "acceptBid(address,bytes32,uint256,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32,uint8)", +"805013c2": "setPresalePhaseUInt(uint256)", +"80504271": "fundingExchangeRate()", +"80519ac7": "getItem(bytes,uint256)", +"8051d02d": "getBlockNumber(bytes20,uint8)", +"805210b7": "AmIPlayer2()", +"8052191e": "dip(address)", +"8052474d": "Name()", +"80528865": "changeWithdrawState(uint8)", +"80529172": "setUsdPerEthRate(uint256)", +"805484b7": "getUpperMaximum(uint256)", +"8054b2f2": "NKN()", +"805553e8": "randMod(uint256)", +"80559357": "setTokenAvailable(bool)", +"805593db": "storeProductReference(address)", +"8055d33a": "exchangeSgnForSga(address,uint256)", +"8055dbb5": "GetExchangePoint(uint8)", +"8055f9d7": "Moderated()", +"80560a0a": "setIsProjectBonus(bool)", +"8056696e": "loadController(address,address)", +"80570d69": "JoshuaCoin()", +"80571e93": "UranBank()", +"80576150": "BoughtViaJohan(address,uint256)", +"8057b96d": "buyTokensForSelf()", +"8057e0b0": "DutchAuction(address,uint256,uint256,uint256)", +"8059382a": "setGasInTokens(uint256)", +"805996f2": "AccountCreated(address)", +"80599e4b": "remove(string)", +"8059e804": "ethealMultisigWallet()", +"805abe6a": "destoy()", +"805b8455": "bumpRound(uint256)", +"805b90d6": "unlockTokensAmount(address)", +"805bc096": "Roll100()", +"805c2b6c": "broadcastOpinion(string)", +"805c3abd": "getPreviousHashUint()", +"805c3d89": "SimpleLSTDistribution(address,address,uint256,uint256,uint256,address)", +"805c733b": "lottoBalance()", +"805d2679": "rndIssue(address,uint256)", +"805e99e0": "isFirstRound()", +"805f4cfc": "TosTeamLockContract()", +"80603faa": "isTakePermitted(uint256,uint256,address,address,uint256,uint256)", +"80615ffa": "receiveApproval(address,bytes)", +"806186f3": "LogRewardAllocated(address,uint256,uint256)", +"8061a159": "TokenSoftCapReached(uint256)", +"8061d365": "FINANCE_CAP_PER_ROUND()", +"8062d3e6": "insertAndCheckDo(bytes32)", +"8063ab78": "setWalletsDelegate(address)", +"8064696b": "getOraclizePrice(string)", +"80650f76": "sigCheck(bytes32,bytes32,bytes32)", +"80657151": "patronRewardMultiplier()", +"8065eaa6": "CreatorWithdrawAll()", +"80661555": "commandMintBonus(address)", +"80664ba0": "ProofTeamVote()", +"80667509": "MYGREATTOKEN()", +"80667aa8": "CBN(address)", +"8066f3c8": "totalSTACoin()", +"8067f7ba": "read_i16()", +"80690e01": "IsAirdrop()", +"80691858": "GoalReached(address,uint256,bool)", +"8069dc2d": "ThundervsJazz()", +"806a2a3c": "investors_needed_until_jackpot()", +"806ad169": "getWithdrawal()", +"806ad57e": "addWorker(address)", +"806b0365": "changeBountyWallet(address)", +"806b39ab": "crownTotalSupply()", +"806b6c28": "GetCurrentTypeSalePrice(uint256)", +"806b984f": "lastBlock()", +"806ba6d6": "founder2()", +"806bd2b6": "challengeCooldownTime()", +"806c6188": "adjustMinimumPledgeAmount(uint256)", +"806cdc0b": "getBonusBalance(uint256,uint256)", +"806e085e": "transferBatch(address[],uint256)", +"806ee278": "collectionFunds()", +"806f208a": "invalidPayments(address[],uint256[])", +"806f3319": "multipleTokenDistribute(address,address[],uint256[])", +"80710f39": "withdrawAllToOwner()", +"8071a7ba": "PCTToken(address)", +"8071aa05": "multisend3(address[],uint256[],uint256[],address[],uint256[])", +"807283df": "Patronage(string,address,address)", +"80738c4d": "USTM01()", +"80744a9c": "LoyelaTestCoin()", +"8074dc59": "gift(address,uint256,uint256,string,string)", +"8074e31d": "Victory(uint256,string,uint8,string)", +"8074f332": "droneIndexToOwner(uint256)", +"8074fe33": "minerCurrentChallenge()", +"80759f1f": "getRootHash()", +"8075acd0": "couponBonusEnabled()", +"80766b68": "Bitcoin1()", +"807693b6": "grantPermissionToChange(address,uint256,bool)", +"8076bd41": "set_sale_closed()", +"8076f005": "cancelledOrFinalized(bytes32)", +"8077ccf7": "etherTokens(address)", +"80780801": "LimitedSetup(uint256)", +"80787f2c": "terminateSale()", +"80788cba": "CancelSubscription(address,address)", +"807896d5": "voteProposal(uint256)", +"8078cc57": "_changeLicenseTerms(bytes32,bytes32,bool,uint256,bool,uint256)", +"807a599c": "mintFinish()", +"807a87ed": "YouAreHere(uint256)", +"807b08c7": "runScript(bytes)", +"807d2da3": "start_ICO()", +"807d782e": "crcWithdrawAccount()", +"807d94a7": "maxIssuableSynths(address,bytes4)", +"807e5cee": "WhitelistUnset(address)", +"807eb7cd": "sumICOStage1()", +"807f08ea": "totalDepositedEthers()", +"807f0ac5": "slice(bytes,uint256)", +"807f3bce": "adminGetLastSignedTime(address)", +"807fb834": "resetRaz(uint256)", +"80806362": "IssueTokenFactory()", +"808134c8": "setBoardMember(uint256,uint256)", +"8081a1e7": "ecmul(uint256,uint256,uint256)", +"8082a929": "holderAt(int256)", +"8082ee0d": "Exchange(address,string)", +"80833d78": "unauthorise(address)", +"80836cab": "enableUpdates()", +"8084ee58": "setMaxLimit(string,uint256,uint256,uint256)", +"8085de8b": "MOBToken()", +"808615ac": "stake(address,address)", +"8086b8ba": "accountOf(address)", +"80870bc1": "trackBuy(address,uint256,uint256)", +"808757ac": "getFreeBat()", +"8087da3a": "order_number()", +"8088e0b6": "turnOffCanUpdateNextGamePotSplit()", +"80892b8a": "calculateTokensReceived(uint256,uint256)", +"8089d001": "getHashOfBlock(uint256)", +"808a69e2": "tokenAddressesSet()", +"808ab1d6": "getCertificationDbCount()", +"808ac94d": "getWeaponIds()", +"808ae9f8": "MoveLearned(uint256,uint256)", +"808c1499": "setIcoPhase2(uint256,uint256)", +"808cf58e": "initial_reward()", +"808e0ae2": "platformLogin()", +"808f30f3": "BitEyeToken()", +"808f3652": "calcHash(string)", +"808f4d21": "incentivisingEffortsAddress()", +"808f8292": "Menu03()", +"808fc72c": "wasSaleStarted()", +"8090114f": "percentRate()", +"809051db": "ipfs_hash()", +"80906b13": "controllerClaim(address,uint256)", +"80908b11": "Advertisement(address,address,address)", +"8090b131": "fetchNumber()", +"8090d83c": "jackpotProportion()", +"8090e4d5": "core(uint256,uint256,uint256,uint256,uint256)", +"8090f92e": "revealVotes(uint256[],uint256[],uint256[])", +"8091bfc9": "STEM()", +"8091d7a5": "addCustomField(uint256,bytes32,bytes32)", +"8091f3bf": "launched()", +"8091fbe1": "gen0PresaleCount()", +"8091fc76": "isValidICOInvestment(address,uint256)", +"80921070": "AvocadoToken()", +"8092285e": "setODEMClaim(address,bytes32,bytes,bytes32)", +"809282b2": "EtherTower()", +"80929e5b": "setBurnable(bool)", +"80943252": "numGamesTimedOut()", +"80947d17": "Verification()", +"80948ddd": "calculateTokenToEth(uint256,uint256)", +"8094ebe3": "joinGame(address,uint256,address,address)", +"80956021": "Concept(address[],uint256[],uint256,bytes,address)", +"80956e8b": "setMintFeeProp(uint256)", +"80959721": "poster()", +"80959cb6": "getCloseAmounts(uint256,uint256,uint256)", +"8095ab76": "songWriterSign()", +"8095cc36": "createForecast(uint256,uint256,uint8,uint8,bool,uint8,uint8)", +"8096bac6": "setNewMaxDeposite(uint256)", +"80972a7d": "ok(uint256)", +"809837c1": "ITECToken(uint256,string,string)", +"809841aa": "getCompte_25()", +"8098e45e": "getRamdon()", +"8098f67c": "ApexIssued()", +"80994e15": "STUDToEth()", +"80999b71": "removeBaseWhitelist(address[])", +"80999cc0": "MarketplaceInformation(address)", +"8099f357": "milliTokensPaid()", +"809a12de": "addRelatedAddress(uint256,address)", +"809a6173": "testCompare()", +"809a812c": "immlaToken()", +"809a9e55": "getExpectedRate(address,address,uint256)", +"809ae91e": "setBattleStart(bool)", +"809b296d": "consumeOperation(bytes32,uint256)", +"809c5b9e": "votingDescription()", +"809d7902": "rejectBid(address,uint256)", +"809d8988": "getTribe(string)", +"809d9a94": "transferMonster(address,address,uint64)", +"809dab6a": "getAvailableBalance()", +"809e243d": "LanxangCash()", +"809e4a2d": "claimUnrented()", +"809e52b2": "updateExperience(uint256,uint32)", +"809ef92f": "crowdsaleStarted()", +"809f8cc9": "VersumToken(uint256,string,string)", +"809fc4f8": "MKRUSD()", +"809ffb20": "setShopModerator(address)", +"80a0155c": "RBACMock(address[])", +"80a0c461": "updateMinimumPodSize(uint256)", +"80a15ad9": "setRocketValues(uint256[],uint256,uint256[],uint256[],uint256[])", +"80a1a86b": "countPayment(address)", +"80a1ba6a": "getTimeLeftToNextCollect(address,uint256)", +"80a1ec2e": "initUser(uint256)", +"80a23ddf": "mintBadge(int256,address,uint256)", +"80a2ddad": "founder4()", +"80a37e23": "recordHighScore(uint256,address)", +"80a3a783": "presaleStartDate()", +"80a3f8b4": "getWorkflowName(uint256)", +"80a3f9b3": "bonusCapUSD()", +"80a429ee": "VitaminToken()", +"80a507c6": "is_started_bonuses()", +"80a51c5e": "ownerDeclareRefundStart()", +"80a54001": "parentToken()", +"80a5cca3": "approveViaProxy(address,address,uint256)", +"80a6ee7d": "totalTokenBetValue()", +"80a738bf": "withdrawHighscorePot(address)", +"80a92b67": "payReward(uint256,address,uint256)", +"80a973e6": "sendTeamBalance(address,uint256)", +"80a979e1": "crowdsaleTransfer(address,address,uint256)", +"80aa5757": "getEtherForTokensOld(uint256)", +"80aab099": "nextAllowancePeriod(bool)", +"80ab611e": "cancelRecurringPayment(bytes32)", +"80abb85b": "refereds(address)", +"80ac5448": "operatingAddress()", +"80ac613f": "BatchCreateSales(uint256[],uint256,uint256,uint64,address)", +"80ac80b0": "iterStart()", +"80acaafb": "profitDistribution()", +"80ad17b2": "removeSiteSet(uint256,uint256)", +"80ad2cf3": "setCap(address,uint256)", +"80ad639d": "deleteAddressDataPatternVoteRules(address,address,uint256)", +"80adede0": "currentLoanAmount()", +"80ae4ebc": "_initialize()", +"80aed05f": "LooneyDice()", +"80af6002": "minimumICOCap()", +"80af6d79": "addEmissionProvider(address,uint256)", +"80afd844": "getPrivateFundAddres()", +"80afdea8": "appId()", +"80b022e8": "changeBurner(address)", +"80b20208": "thePot()", +"80b29f7c": "revokeDelegate(address,bytes32,address)", +"80b30c13": "tokensToSold()", +"80b38c2d": "ProcessTxFee()", +"80b3c3d8": "buyTokensWithIcon(address,uint256)", +"80b44c1b": "extraStatsForGen(uint256)", +"80b51fe3": "getPoolTimeOfStateInBlocks(uint256)", +"80b52136": "MoneyCoinCoin()", +"80b525ce": "BurnableTokenWrapper(address)", +"80b57824": "discount(uint32,uint256)", +"80b63e7e": "wakeUp(uint256)", +"80b6518a": "createEmptyTrack()", +"80b69199": "releaseBonusTokens(address,uint256,address,bytes1)", +"80b7ca90": "OrderList(address)", +"80b855d6": "ZiggyToken()", +"80b8e6d1": "changeWhitelistStatus(address,address,bool)", +"80ba4b75": "getActionsCount()", +"80bb3360": "exchangeToIco(address)", +"80bc150d": "Bounty(uint256)", +"80bc99cb": "teamLocker()", +"80bd0936": "Multivest()", +"80bd2723": "SecurityChainToken()", +"80be3cc4": "BurnTokensNew(uint256)", +"80bf099e": "orphantoken(address)", +"80bf549a": "maxICOSecondSupply()", +"80bf98f8": "makeSwapInternal()", +"80bfbe68": "setWhitelist(address,address,uint256)", +"80bfc599": "sellVouchers()", +"80bfe883": "wins(uint256)", +"80c05bc6": "random_callback(bytes32)", +"80c0a250": "fetchVoteResultForCandidate(address)", +"80c18d45": "addAddressToFounders(address)", +"80c190cf": "getReservedTokensListValInPercentage(address)", +"80c2fb7d": "currentTreasure()", +"80c30f3d": "buyContract(address,uint256)", +"80c324cf": "isBallotInProgress(uint32)", +"80c3780f": "schedules(address)", +"80c399f4": "refundInvestors()", +"80c3f96d": "addFarmer(address)", +"80c4237f": "tryToWin()", +"80c4e5c5": "changeSynthesizeAllowed(bool)", +"80c5bef8": "UGToken()", +"80c6ff73": "keepaliveBlock()", +"80c7507a": "getMigration(uint256)", +"80c80611": "Withdraw_3()", +"80c810d5": "MucToken()", +"80c81c16": "getStateInfo()", +"80c86c30": "CommonError(bytes)", +"80c8a270": "tokenReserved4Deposit()", +"80c8fde7": "perTokenAmount()", +"80c951bf": "currentClaimPriceInFinney()", +"80c96527": "getAssociatedTAOSetting(bytes32)", +"80c99dd2": "getPeriodicalBudget()", +"80ca7aec": "forceReseed()", +"80caac1d": "setTitleImage(string)", +"80cae007": "cleanOcean(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"80cd0015": "migrateUsername(bytes32,uint256,uint256,address)", +"80cd2464": "offer(uint256,uint256,uint256)", +"80cd5ac3": "newAppInstance(bytes32,address)", +"80cda248": "EGGS_TO_HATCH_1TOAD()", +"80cdc9c9": "RESTRICTED_PERIOD_DURATION()", +"80ce60d1": "setResult(uint8)", +"80ce98e7": "distributeDividends(uint256,address)", +"80cecea9": "transferToContract(address,uint256)", +"80cf264d": "getFirstPhaseCap()", +"80d07ce8": "Gifto()", +"80d10934": "freeXLMG()", +"80d1bd47": "jackpotHit()", +"80d1cb35": "getDeploymentBlock()", +"80d24e9d": "SISKTechnologyGroupToken()", +"80d2c1a6": "CatRescued(address,bytes5)", +"80d32dbb": "ChaoExToken()", +"80d32f85": "isSoftCapReached()", +"80d52ed9": "switchToNextRound()", +"80d5398e": "logOrderFilled(address,address,address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes32)", +"80d563d7": "LogCancelContractProposal(address,address,uint256)", +"80d61012": "canReceive(bytes32,address,address,uint256,bytes,bytes)", +"80d7bcba": "incomingTokensTransactions()", +"80d7d81a": "giveMeBackMyMoney()", +"80d7f7ac": "TaxicToken()", +"80d7f92a": "_address(address,uint256)", +"80d85911": "initialize(uint256,uint256,uint256)", +"80d8b380": "setQtyStepFunction(address,int256[],int256[],int256[],int256[])", +"80d8ce23": "publishBytes(string,bytes)", +"80d95b42": "supplySeed()", +"80d9eaa6": "refCount()", +"80daa1c6": "setDiscountForPlayer(address,uint256,uint256)", +"80db79d9": "StructAndFor()", +"80dbb7d2": "RacingClubPresale()", +"80dbde63": "PI_EDIT_4()", +"80dcaf27": "getRefNumber()", +"80dcbff1": "getAdminArray()", +"80dce0b4": "getAwardTime()", +"80dceec4": "setHuntingPrice(uint256)", +"80ddcc62": "SUPPLY_HARD_CAP()", +"80ded586": "removeFromTokenHolders(address)", +"80dee9d1": "miningStorage()", +"80df2cee": "TeddyChain()", +"80df4123": "NucleusVisionTimeVestingTokensMinted(address,uint256,uint256,uint256,uint256)", +"80dfa34a": "saveBatch(string)", +"80dfb104": "setCoOwner1(address)", +"80dfee5c": "NewSale()", +"80e039f9": "rocketGetResourceValues(uint256)", +"80e0c053": "MassERC20Sender()", +"80e13b10": "CompanyTokenIssued(address,address,uint256,uint256)", +"80e15b56": "cancelCredit(address)", +"80e15f76": "setBuildPrice(uint256)", +"80e183a3": "CLASS_PLANT()", +"80e1b9c4": "finishBattle(uint256,address,address)", +"80e2517c": "TokensPerEther()", +"80e2653e": "setDougAddress(address)", +"80e2d53b": "rateWaitingEnd()", +"80e339fc": "balancewof()", +"80e37b5f": "maxIssuableNomins(address)", +"80e3f1ad": "toggleWhitelist(bool)", +"80e47e71": "maximumValueWithoutProofOfAddress()", +"80e52f31": "EtherCash1()", +"80e5d7b0": "Voted(uint256,uint256,uint256,bool,address)", +"80e5e069": "ITO_TOKENS()", +"80e64e8b": "buyBottle()", +"80e6bffb": "CalculateBankCredit()", +"80e74b04": "testControlUpdateLatestRevisionEnforceRevisions()", +"80e8b12a": "_createDungeon(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"80e9071b": "reclaim()", +"80e9a1da": "STATUS_LENT()", +"80e9e9e1": "getClaimIdsByTopic(uint256)", +"80e9f98c": "getRacer(uint32,uint256)", +"80ea8273": "SetBonus(uint256)", +"80eb1cbc": "monsterIdToIVs(uint256,uint256)", +"80eb6b7f": "LogRemTokenPairWhitelist(address,address)", +"80ebb08e": "updateResult()", +"80ebed20": "createBook(address,address,address,uint256,int8)", +"80ec35ff": "awardByRndNo(uint256)", +"80ec4a96": "CrowdsaleFinished(uint256)", +"80ede329": "getDocumentDetails(uint256)", +"80edef8e": "owner_address()", +"80ee9792": "_ethDeposit()", +"80ef353d": "tryClose(bytes32)", +"80efa4af": "extBuyTokens(address,uint256,uint256)", +"80f034b1": "getContractBytecode(string)", +"80f03fa6": "getTotalPets()", +"80f183ce": "visitCost()", +"80f20363": "lockToken(uint256)", +"80f29894": "getWeiForCent(uint256)", +"80f2fa03": "getSellPrice(address)", +"80f34c14": "ContortedCoin()", +"80f393c8": "ProofOfIdiot()", +"80f3f094": "setGGCAddress(address)", +"80f41e76": "calcMintFee(uint256)", +"80f4432a": "inception()", +"80f4531f": "closeTimerElapsed()", +"80f4ab5f": "seeMyNumbers()", +"80f4bcb8": "tokenTeamAllocated()", +"80f55605": "market()", +"80f5a37c": "Crowdsale(address,address,address,uint256,uint256)", +"80f5e0a1": "shouldBoost(bytes32)", +"80f6c383": "setshares(uint256,address)", +"80f6d782": "swapAddress()", +"80f7d0ab": "storeReading(uint256)", +"80f7e238": "ANIMETOKEN()", +"80f86009": "Initialize()", +"80f89a31": "ballotNames(uint32)", +"80f89bce": "distributeDRMK(address[],uint256,uint256)", +"80f8d688": "redTeamAddress()", +"80f8ea60": "Put_BRTH_GFT(address)", +"80fa272f": "TokenWithMint(string,string,uint8,uint256)", +"80fa4517": "completedTasksCount()", +"80fa7902": "getPlayersBattleStats(address)", +"80fa7942": "tokensForReserve()", +"80fa860f": "executeElectionMandate(uint256)", +"80fc16c8": "setAffiliateFee(uint256)", +"80fe4958": "createBetWithPayable(bytes32,bytes32,bytes16,bytes32,uint256)", +"80febdbd": "updateMe(string)", +"81001f3c": "collectFee(address[])", +"810164f7": "getTotalBPOfAddress(address,address)", +"81016509": "getBtcRequestHash(bytes,bytes,uint256)", +"8102387d": "burnRedRibbonCoin(uint256)", +"81030e35": "ALAP()", +"810405d6": "numOfPurchases()", +"81042183": "ExpeditingToken()", +"81045ead": "getIndex()", +"8105a6d7": "calculate_bond_token_to_bix_rate(uint256)", +"8105aa55": "grantAdvisorTokens(address)", +"81064e2d": "getCreditorAmounts()", +"8106d57a": "getCityPendingBuildings(uint256,uint256)", +"8107b269": "Novatore()", +"81081184": "bursarPayOutNetContractBalance(address)", +"8108592c": "calcKncStake(uint256)", +"81086763": "placeNewBid(uint256)", +"81086918": "delAcceptedToken(address)", +"8108e54c": "marketAllocation()", +"810a192b": "transferCollateral(uint256)", +"810a217f": "pValidationState()", +"810a3919": "hard_limit()", +"810a882f": "setConfigBytes(bytes32,bytes32)", +"810ac3ce": "IssueOffer(address)", +"810ba058": "Public_Sale_SUPPLY()", +"810bbec3": "claimHelper()", +"810be182": "_updateCountries(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"810c0af8": "depositTokenByAdmin(address,address,uint256)", +"810c547a": "_rebase(uint256)", +"810cbbd0": "bat_match(uint256[39])", +"810cf6cb": "MRazaAnisTestCoin()", +"810d54a0": "lockBalanceChanges()", +"810e4ff0": "cashOut(address,address,uint256)", +"810e78ab": "declareIcoFinished()", +"810e9720": "GlobalCoin()", +"81104666": "advisoryWithdraw()", +"8111e0ad": "updateMaxTxGasPrice(uint256)", +"8111ecef": "FinalizeStage()", +"8111f24e": "isFreezed(address)", +"81120dd7": "myLastRef()", +"8112821f": "EthVentures()", +"8113e285": "withdrawTokenPayment()", +"8115a2ac": "getOnMintTargetValue()", +"8115f52d": "Evacuated(address)", +"8116c063": "claimOwnersEarnings()", +"811743e7": "fighterIndexToOwner(uint256)", +"81183633": "setStandard(bytes32)", +"8118e0ae": "dtValidateWorldSnapshot(uint256)", +"81193a30": "returnRequestCancel(uint256)", +"81195993": "allocateEcoFundToken(address[],uint256[])", +"8119c065": "swap()", +"8119f4ae": "getRoc(uint256)", +"811a0a85": "saleComplete()", +"811aecf4": "finishPhase()", +"811b1268": "noteSale(address,uint256,uint256)", +"811bab32": "GenesisCallerAddress()", +"811c626d": "changeIcoRoundEnding(uint256)", +"811c66ac": "nameSuccessor(address)", +"811de206": "isConfirmedByOwners(uint256)", +"811e1468": "computeAccount(uint256)", +"811e4f71": "DisburseEarnings()", +"811e539c": "campaign()", +"811ea6de": "transferToken(address,address,uint256,bool)", +"811f273d": "hasThreeYearWithdraw()", +"811fe466": "beginTime_()", +"81207183": "deployGLX()", +"8121b0d4": "verifyStoredData(bytes32)", +"8121dbc1": "MyPizzaPieTokenPreSale(uint256,uint256,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"8121ddd7": "RATE_DAY_7()", +"81236e47": "setUserYan(address,uint32)", +"812403f6": "bonusPhaseThreeDeadline()", +"81240b9c": "subWithdrawFor(address,address)", +"8124bb0f": "continueExecution()", +"81252548": "getContractServerBlackWhiteListType(string)", +"81252680": "getBaseQuick(bytes32)", +"8125c102": "BountySent(bytes32)", +"8125c6fd": "_getDividendsBalance(address)", +"8125ceb2": "showMessage()", +"8125fc44": "thirdPreSaleEndDate()", +"81263fed": "getStrandCount()", +"81267bd0": "_transferMeme(address,address,uint256)", +"812699a9": "Quiricos()", +"81269a18": "voteBalance(address)", +"81269a56": "checkMintSolution(uint256,bytes32,bytes32,uint256)", +"8126c38a": "allPunksAssigned()", +"8126cb1e": "rejectRewards(uint256,string)", +"8126e4e3": "philanthropise(string)", +"81281be8": "placeBid(address,uint256,uint256,uint256)", +"81290a80": "AviciiCoin()", +"8129212e": "getCommonInitBlockNum()", +"8129519d": "setLoading(uint256)", +"8129aa75": "TransferFeeRateProposalAdded(uint256,address,uint256)", +"8129fc1c": "initialize()", +"812a4f47": "BeatTokenIcoPhase2Started()", +"812af8ec": "getAccountData()", +"812ba50c": "preEndBlock()", +"812c3251": "Escrow(address,address,uint256)", +"812c86e0": "updateTokenContract(address,string)", +"812cbf38": "sellFci(uint256)", +"812cddf2": "getSavedString()", +"812cf740": "ArrayPractice()", +"812d504d": "transferToOwner(address)", +"812d6c40": "changePercent(uint256)", +"812e1d1d": "APT(address)", +"812e6741": "Mountain(bytes32,uint256,uint256,uint256,address)", +"812ed5cc": "report(address,address,bytes)", +"812f55c3": "get10Ads(uint256)", +"812fd5d7": "payToProvider(uint256,address)", +"813051bc": "createGOP(address,string,uint256)", +"8130c9b2": "untrustedTokenNumerator(uint256)", +"8132581c": "amountRaisedInEth()", +"8132e223": "internalSafeTransferFrom(address,address,uint256,bytes)", +"81333d57": "LKB(uint256,string,string)", +"8134064b": "setMotherCount(uint32)", +"81350bd4": "releaseTimeTeamAdvisorsPartners()", +"8135e137": "getPresciption(int256)", +"8136c1b9": "registerUserOnToken(string)", +"8136f02d": "setAddressOfERC20OldToken(address,address)", +"8136fd26": "createJob(string,uint256,uint256,address)", +"81395866": "numberOfAdmins()", +"8139bc2f": "ecothereum()", +"813a573a": "CheckPurchaseCount(address,uint32)", +"813b024f": "addProductInUsd(uint256,uint256,bytes32)", +"813b65aa": "setNewCajutel(address)", +"813d13cb": "getBB(bytes32)", +"813d599f": "getValidatorAddress(int256)", +"813d6c9a": "bonusPercentage()", +"813d89e1": "artExplain()", +"813df488": "preMinedFund()", +"813e7847": "withdrawalNormal()", +"813e9aca": "init(address,uint256[],uint256,uint256,uint256,uint8)", +"813f4db4": "isStakingPeriod()", +"813f563a": "devsHolder()", +"813f5717": "LinkRevenue()", +"813faa53": "getVoteRulesOfProposalTransaction(uint256,uint256)", +"813fdec8": "getContestStatusForDate(uint32)", +"8140ce63": "kvtOwner()", +"8140d0dc": "setContact(string)", +"8141fd37": "tickRequiredLog()", +"8142453f": "_saveRequest(address,address,uint32)", +"8142a25a": "testAliceFooSend()", +"8142b8d7": "editGardener(uint256,uint256,uint256)", +"8143e3da": "allBonus(address,uint256)", +"8143eb2d": "gameOpened()", +"8143f8a8": "totalGas(bytes)", +"8144650a": "transferTokenTo(address,uint256)", +"814487c4": "addSuperReferrer(address,uint8)", +"8144ee2f": "adventureSettingContract()", +"8146f323": "isFinalised()", +"8147bcf7": "deletePlatform(bytes32)", +"8148d2fe": "getNodeId(bytes32,bytes32)", +"8149657b": "closeEthPool(uint256)", +"814971de": "issueReward(uint256,uint256,uint256[],uint256)", +"8149ea9b": "randomSkill()", +"814a78f4": "KM(uint256,string,string)", +"814ab9f1": "salesSupply()", +"814ae0ba": "gcf()", +"814b3fe0": "dividends(uint256)", +"814b53b0": "killCoin()", +"814c25fc": "setTokenInformation(bytes32,bytes32)", +"814c2aa1": "changeTotalExchange(uint256)", +"814e23c8": "calculatePayout(uint256,uint16)", +"814e3bd3": "ContribToken(uint256,string,string)", +"814e5c9b": "totalSaleAmount()", +"814e6d44": "_unpackIdValue(uint256)", +"814eba9e": "simPunitiveInterestRate(bytes)", +"814f737d": "phaseThreeEnd()", +"814f9201": "payUserIncomingTransactionCommission(address)", +"814fbd8f": "RefundBTC(string,uint256)", +"81508615": "getBeneficiaryDevelop()", +"81516c7b": "initialTIPsupply()", +"8152c7ed": "adminSetRandomInput(string)", +"81531c64": "Strike()", +"81547f25": "CONI()", +"8154b57c": "secondsAfter()", +"8154d4de": "setMarket(bytes32,bytes32)", +"81550287": "PRESALE_CLOSING_TIME()", +"81553709": "releaseEndTimeOfStage(address,uint256)", +"815639ea": "read_u64()", +"8156afdf": "Aletheia(address,address,address)", +"8157d4b5": "bindContract(address)", +"81580761": "getUniqueLineCount()", +"815847df": "_addBonusOfReferrer(address,uint256)", +"81584ff3": "CutieBitToken()", +"81587463": "sendTradeEvent(uint256[],address[])", +"81592aab": "instantUpdate()", +"81597d0c": "mintIcedToken(address,uint256)", +"815a4876": "setEthereumWallet(address)", +"815bc7a0": "vote_reward_pool_amount()", +"815c326d": "ProducerOperations()", +"815d1fe5": "RewardChannel(address,address,address)", +"815dcd36": "dailyAccounting()", +"815def1a": "changeAllocation(address,int256)", +"815eb7c1": "satoeContract()", +"815ec64a": "zReceiveFunds()", +"815f73f0": "m_walletAddress()", +"816036ae": "removeSmartContract(address)", +"8160b246": "BONUS_TIER3()", +"8160f0b5": "minimumQuorum()", +"81613a62": "LogPause(bytes32)", +"816163b1": "checkGameResult(bool)", +"81617f8f": "reLoadXaddr(uint256,address)", +"816194f8": "refreshVoteForAll()", +"81619954": "DAOFactory(address,address,address)", +"8161c5e5": "main_balance()", +"8161dfa6": "EmailSent(address,uint256,string,string)", +"8161f0e1": "execID()", +"816273f6": "computeAmountBonus(uint256)", +"8162de9c": "getCryptoAvatar(uint256)", +"8162f631": "LogFunderInitialized(address,address,string,uint256,uint256)", +"8163681e": "isValidSignature(address,bytes32,uint8,bytes32,bytes32)", +"816413f8": "transferPreSignedHashing(address,address,address,uint256,uint256,uint256,bytes)", +"81641ff7": "casinoBank(address)", +"81646be8": "setCloseTime(uint256,uint256)", +"8165354e": "setOracleRegistry(address)", +"8165913d": "withdrawEthBalance(address,bytes)", +"81671042": "setOptionLibrary(address)", +"81676ecd": "FGorToken()", +"8167d996": "deAuthorize(address)", +"8168b41e": "TokenTWL(uint256,string,string)", +"816a873f": "createMorePaymentChannelsInternal(uint256)", +"816b6574": "LogCrowdsaleFinalized(bool)", +"816bf490": "transferTokens(uint256,address[],address,address)", +"816bff5f": "CIFCoin()", +"816c4ad1": "baseIntCalc()", +"816c66c9": "updateRank(bytes32,bytes32,uint256,bytes32,uint256)", +"816c76e3": "GoozeToken(uint256,string,uint8,string)", +"816c7da4": "approveAllAndCall(address,bytes)", +"816ca77c": "CollateralSeized(address,uint256)", +"816d199c": "SIGMA_FTL_SPEED()", +"816d3da9": "purchaseAdmin()", +"816d3dc1": "get_info(address)", +"816dbae4": "monethaVault()", +"816dcd91": "updateBitComparisonMask(bytes32)", +"816e117c": "setMaxSize(uint256)", +"816e24b0": "setupDeposits()", +"816ed336": "emitFeeSet(uint256,address)", +"816f3438": "maxFoundationCapUSD()", +"816f3f4d": "madKing()", +"816fceb7": "MultiTransaction(address,address[],uint256[])", +"816ffbab": "Uint256Oracle(int256,uint256)", +"81702c34": "refund_me()", +"8170733d": "MyBitFoundation()", +"81710c78": "getMyPolicies()", +"8171362a": "votingByXid(uint256,bool)", +"81715d8c": "pIdIter_()", +"817189df": "setEarlyLimits(uint256,uint256,uint256)", +"817246cf": "setsalesdeadline(uint256)", +"817287d0": "isOwnner(address)", +"8173832a": "LogUnsortedOffer(uint256)", +"8173b813": "setNumCities(uint256,uint256)", +"8173e363": "hard_cap_wei()", +"817472c0": "TOKEN_INIT(bytes32,bytes32,bytes32)", +"8174b6d7": "ownerCutPercentage()", +"81751312": "getAllCardsModifierPrimaryVal()", +"81758fb4": "bohwa()", +"8176419f": "SCCC(uint256,string,string)", +"81767aed": "getIdentifiers(address)", +"817725aa": "disableChangesMultitoken(uint256)", +"81776ba4": "backup_refund(uint256,uint256)", +"81777b78": "Take(bytes)", +"8177ffae": "PresaleContract(address)", +"81788e2b": "addAllowedAddress(address)", +"8178a943": "add_scribe(address)", +"8178ab99": "_transferFromSenderPaysFee_byProxy(address,address,address,uint256)", +"8179c2b3": "Result(uint256,address,uint256)", +"817ad683": "XHO()", +"817afff8": "_updateWithdrawCountry(uint256,uint256,uint256,uint256)", +"817b106e": "setChangeIdentityNarcoRespect(uint256)", +"817b1cd2": "totalStaked()", +"817b90fe": "getCategoryId()", +"817c1e52": "startICO(uint256,uint256,uint256,uint8)", +"817c7483": "settleLeague()", +"817c8966": "getLevel(address)", +"817d62a4": "shouldGetHighFive()", +"817e8332": "STAKE_BONUS_RATIO()", +"817e9d31": "setFactor(uint256)", +"817eca0c": "ConstructByEth(uint256,uint256)", +"817edbd2": "set(uint32,uint8)", +"817f0023": "recievePayment(address)", +"817f688f": "BLAAICOIN()", +"81807a07": "calculateBonusAmount(uint256)", +"818097c5": "getVotesForCandidate(address)", +"8180f2fc": "approve(address,uint256,bytes32)", +"81813963": "claimEDEX(address)", +"8181b029": "confirmImplChange(bytes32)", +"818211f8": "getProposalsNum(address,uint256)", +"8182173c": "PricesUpdated(address,uint256,uint256)", +"81824d53": "setData_1(uint256)", +"8182c6a7": "IssueToken(string,string)", +"81830593": "adminAddr()", +"818438ca": "getWizzPandaQuotaOf(uint256)", +"8185402b": "buyAllAmount(address,uint256,address,uint256)", +"8185b8e9": "getWeiPerCent()", +"81862f25": "newThreadComment(bytes32,bytes32,string)", +"81884756": "citationCount()", +"8188f71c": "holders()", +"81895b73": "registry(bytes32,address,address)", +"818a19b5": "FeeAddr1()", +"818a4b48": "preSaleMinAmount()", +"818ad300": "TeamVesting(address,uint256,uint256)", +"818b4564": "DefineType(address,uint32,string)", +"818c2858": "HPCToken(uint256,string,string)", +"818c606f": "NewAuction(address,uint256,uint256,uint256,uint64,uint256)", +"818d4b5d": "owns(address,uint256)", +"818e8cfa": "setLogoURL(string)", +"818f7d01": "checkTransferFunctionPrivateSale(address,address,uint256)", +"818f92c7": "createPurchaseOrder(address,uint256,uint256,bytes32)", +"818fd7a1": "beforeBuy()", +"81904676": "lastDistributedAmount()", +"8190cf07": "setRate_ETHUSD(uint256)", +"81915a67": "EventSetContract(address,string,address)", +"8191745f": "Description()", +"8191ab45": "setUsdConversionRate(uint256)", +"8191b9a2": "__tokenAndWalletBalancesMatch__(address,address,address)", +"8191d30f": "crossForking()", +"81923240": "mine(address)", +"8192433f": "receiveTokenDeposit(address,address,uint256)", +"8193327b": "test1Bob()", +"8193844b": "linkIssuerName(bytes32)", +"819384a2": "payoutToReferrer()", +"8194aff3": "Matchpool()", +"8195031f": "Bitsta()", +"819512cd": "buyTokens(address,uint256,address)", +"81961946": "NETR()", +"8196410b": "GustavoCoinCrowdsale(uint256,uint256,uint256,address)", +"8196b8c7": "getValueOrZero(bytes32)", +"81980c27": "SOLOBOT()", +"81981f7c": "getMyFranklin()", +"819891ac": "_newGroup(address,uint256)", +"8198c2bd": "ICCCOIN()", +"8198edbf": "getFeeRate(address)", +"819912a2": "setGame(address)", +"819927e7": "transferUserTokensTo(address,address,uint256)", +"819abe80": "giveFreeUnit(address,uint16)", +"819ad6d6": "EstimatedICOBonusAmount()", +"819b0293": "validPosition(uint256,uint256,address,uint256)", +"819b25ba": "reserve(uint256)", +"819b9773": "PaymentAvailable(address,uint256)", +"819c5773": "withdrawForMany(address[])", +"819cfdf1": "YFTToken(uint256,string,string)", +"819e3903": "LogTrade(uint256,address,uint256,address)", +"819ee03a": "InterfaceId_ERC721()", +"819f2494": "createOffer(uint64,uint256)", +"819f255a": "is_passcode_correct(uint256,bytes32)", +"819f5e24": "burnAndFinish()", +"819f8927": "setMilestonesList(uint256[],uint256[],uint256[])", +"81a00361": "YONDcoin()", +"81a03133": "authorizePayment(uint256)", +"81a084fd": "remainingGasRefundPool()", +"81a09bf0": "mergeMedal(uint256,uint256)", +"81a1384b": "LockedVotingTokens()", +"81a1fa02": "itemsCounts()", +"81a22b41": "PaymentsProcessed(address,uint256,uint256)", +"81a22bee": "reservePart()", +"81a238b5": "thirdWavePrice()", +"81a2568d": "setXToken(address)", +"81a2824f": "getUserBet()", +"81a28c28": "isSecured()", +"81a33a6f": "bytesToUInt(bytes32)", +"81a3b17f": "removeFace()", +"81a46662": "rolloverPercent()", +"81a4af15": "rewardTokens(address,uint256)", +"81a5ad6d": "YamatoCoinCrowdSale()", +"81a5e88b": "ICOCompleted(uint256)", +"81a60c0d": "getResults(uint256)", +"81a73ad5": "getTokenSymbol(address)", +"81a752ef": "removeSdaContract()", +"81a7a503": "ActiveProposalNum()", +"81a7ac54": "MAX_PERCENT_OF_SALE()", +"81a8e78a": "getGalaxies()", +"81a955b0": "editInfo(uint256,bytes)", +"81aa5067": "addLockedAccount(address,uint256,uint256)", +"81aa8a4b": "pre_PRICE()", +"81abb800": "lengthOfKeys(uint256,uint256)", +"81ac9b93": "AuctionCancelled(address,uint256,address)", +"81accd0b": "create(bytes1,bytes32,bytes32)", +"81add559": "partners()", +"81ade307": "query(string,string)", +"81ae20b2": "setInvestorsBatchSize(uint256)", +"81aea668": "atNow()", +"81aee4f4": "getNoteDesignatedReport()", +"81af0750": "Simt()", +"81af8949": "getPackBuy(address,address,uint256)", +"81af95fc": "startAuction(uint256,uint256,uint256,uint256,address)", +"81afc50d": "delegateCustodian(address,address)", +"81aff6ec": "get_presale_arbits_sold(address)", +"81b074ab": "user_on_freeze()", +"81b1c6bb": "getWinLoseAmountByBettingIdInGamblingParty(uint256,uint256)", +"81b23042": "burnMonster(uint64)", +"81b2d07b": "showBalance()", +"81b2dad9": "setByeSayer(address,bool)", +"81b3171c": "extGoalReached()", +"81b31cec": "setNextCommonTTWTokenId2(uint64)", +"81b3ea13": "getResponseError(uint256)", +"81b54498": "seedStartTime()", +"81b69494": "fee_ratio()", +"81b72d88": "startRequest_callback()", +"81b736e9": "createChild(uint256,address)", +"81b7c6e7": "stop_it()", +"81b7f157": "_updateSpendAvailable()", +"81b890fc": "setName(uint256,bytes16)", +"81b93757": "ADEVA()", +"81baf3ab": "sendTokens(address[],uint256[],address)", +"81baf55e": "processBuyRequest(string,address,uint256,uint256)", +"81baf820": "BlockScheduler(address)", +"81bb1277": "_calculatePointsAndRewards()", +"81bb2b20": "payFee(bytes32,uint256)", +"81bb59bf": "goodsNotOK(uint256)", +"81bb73af": "signArchive(bytes32,string)", +"81bb9470": "DNCEQUITY()", +"81bc3657": "migrateSinglePlanet(uint256,string,uint256,uint32,string,uint32,uint8,string,address)", +"81bc50ef": "getBUA(bytes32,uint256)", +"81bc8742": "BCToken(uint256,string,string)", +"81bd24d1": "revertTest()", +"81bd66fe": "upgradeMeAdmin(address)", +"81bdc78d": "getProposalAmount(uint16,uint16)", +"81bf1cff": "ThailandVsMyanmar()", +"81c0ddc3": "villageinfo(uint256)", +"81c1346d": "setFundsCreditDaoAddress(address)", +"81c2d4b6": "freeToken()", +"81c2d875": "getConsensusRules()", +"81c385b5": "safeWithdrawEther()", +"81c405c6": "registerCustomer(address,address,bytes32,uint256)", +"81c485e7": "getDiscipleSale(uint256)", +"81c4e1c8": "User(address,address,address)", +"81c56dfb": "d27d7bad()", +"81c59c8d": "getStrategyTokenCount(uint256)", +"81c5b206": "addMeToGame(uint256)", +"81c648e2": "betYours()", +"81c64ea2": "SixPlayerRoulette()", +"81c70870": "ClientUpdated(address,address)", +"81c79fd5": "transferMerchantProxy(address,address,uint256,uint256,uint8,bytes32,bytes32)", +"81c7ae3b": "miningEveryDay()", +"81c8149d": "timeOfLastProof()", +"81c81cdc": "setContractStatus(address,bool)", +"81c8b563": "coinLockRemove(address)", +"81c92486": "ProcessRooms()", +"81c9786c": "administratorsLength()", +"81ca3ea1": "hasEitherAttribute(address,bytes32,bytes32)", +"81cb79ca": "createEmptyTrack(uint256)", +"81cbeaf0": "getValidated(address,address,uint256)", +"81cc49dd": "secondLoos()", +"81ccb678": "Confiscate(address,uint256)", +"81cd2ffb": "ConversionFeeUpdate(uint32,uint32)", +"81cd30a8": "round_c_begin_date()", +"81cd4570": "Moneytoken()", +"81cd5eec": "bonusPot()", +"81cd8194": "transferPrice()", +"81cd872a": "deals(bytes32)", +"81cda317": "MINTING_HARDCAP()", +"81cde1a9": "GOOD_ERC20()", +"81ce7184": "TestText()", +"81cebf7e": "vestingPaid()", +"81cedafc": "Nodalblock()", +"81cf7fef": "registerSmartID(string,string,string,bool,bool)", +"81d01ed3": "p2()", +"81d12c58": "requests(uint256)", +"81d136cb": "presaleAllocation()", +"81d16e0d": "_isDiamondVerified(string)", +"81d2c871": "SetMinFee(uint256)", +"81d2fd9c": "setFaucetAmount(uint256)", +"81d36f4e": "KEVINTOKEN()", +"81d38ada": "Remove_member(address,address)", +"81d38f2d": "SheetMusic(address)", +"81d3c435": "setAddresses(address)", +"81d434e9": "transferToICAP(string,uint256)", +"81d44053": "reading_length()", +"81d45a5c": "isPreICOPublicClosed()", +"81d5e753": "CuratedWithWarnings(address[],address,address[],address[])", +"81d693be": "claimDay(uint16)", +"81d6c866": "harvestabledivs()", +"81d77862": "newMostInviter_()", +"81d92ed4": "shp()", +"81d96005": "sigDestinationTransfer()", +"81d961e4": "eligible(uint256,uint256)", +"81d97051": "setOwnerOne(address)", +"81d9c5e4": "handleIncomingPayment(address)", +"81dafe0e": "calculateDuration(uint256)", +"81db6c28": "redeemVoucher(uint256,address,address[],uint256)", +"81dc66f4": "checkTankAuction(uint256)", +"81dca05c": "setAuthorization(address,address,bool)", +"81dd70db": "kickoffQuorumPercent()", +"81de10e2": "getContentAt(uint256)", +"81ded5b8": "numOfConfirmationNeeded()", +"81df464f": "totalRaisedIco()", +"81df893c": "withdrawMon(uint64)", +"81e1ccba": "stakingPercentage()", +"81e2ef3a": "ReceivedETH(address,uint256,uint256)", +"81e529cd": "setOwnerFreeDay(uint256)", +"81e559ae": "clientKeys(uint256,uint256)", +"81e69eff": "publishMetaData(bytes32)", +"81e6c686": "returnMaxGoal(uint256)", +"81e6e083": "getLifetime()", +"81e75dd0": "testPublicBuy()", +"81e7645f": "findFigures(uint256,uint256)", +"81e77878": "getChooses()", +"81e7a97e": "killMonster(uint16,uint8)", +"81e7e20e": "user(address)", +"81e7e329": "test_6_accessRestriction_removeMember_shouldThrow()", +"81e83991": "howMuchInEscrow()", +"81e8927b": "getValidationsCount()", +"81e8a1f7": "newRandomByte(bytes)", +"81e9abef": "_updateEarnedBy(uint256,uint256)", +"81ea4408": "getCodeHash(address)", +"81ea6834": "getEvilMortyAddress()", +"81eac2ee": "checkClientFunds(address)", +"81eaf99b": "lockSupply()", +"81eb3e01": "setValueStep1(uint256)", +"81ebd8de": "setDeveloperStatus(address,address,bool)", +"81ebdeea": "testThrowCreateWithNonceRetracted()", +"81ec792d": "getPackSummary(uint256)", +"81ed8680": "pingTimestamp()", +"81edaae4": "serviceFee(address,uint256)", +"81edc308": "insertAndApprove(uint256,address[],uint256[])", +"81ef1b18": "startFundraising()", +"81ef93ae": "lastFueledFundingID()", +"81efc01d": "withdrawHouseStake(uint256)", +"81f0c440": "MikeChanCoin()", +"81f1a41b": "CROWD_SUPPLY()", +"81f1aad7": "setCancelApproveFee(uint256)", +"81f1d75c": "updateUserEmail(address,bytes32)", +"81f1f92a": "withdrawSoftwareProductDevelopment()", +"81f1fa93": "RKCAcquired(address,uint256,uint256)", +"81f2a3f1": "GetDownTickPrice(uint256)", +"81f2d44c": "getStarIdAtPosition(uint8,uint8,uint16)", +"81f2d4ee": "updatePartner2_will(string)", +"81f3e897": "getSettingData(uint256)", +"81f4f9bf": "ticketHolder()", +"81f59f51": "shareService(bytes32,address)", +"81f5f75c": "getApprovedProxies()", +"81f65883": "CompetitionStore()", +"81f6bf7d": "deleteCertificate(string)", +"81f6c7e5": "_release(uint256)", +"81f799e2": "reveal_end_time()", +"81f86241": "ExGirlfriendCoin()", +"81f8658a": "DATE_OPEN_ON_FLOOR()", +"81f87d6d": "deleteCandidateCache(address)", +"81f8a6f7": "checkTokenSupported(address)", +"81f8b722": "LogIncomeAllocation(address,uint256)", +"81f91c4a": "transfer(address,bytes32[8])", +"81fab567": "maxPayments()", +"81fb1fb4": "participants(uint256,uint256)", +"81fb2585": "isOfficial(uint16)", +"81fb3803": "einzahlen()", +"81fbc084": "mul27(uint256,uint256)", +"81fbf0a5": "totSupply()", +"81fbffe1": "getGiftoAddress()", +"81fc4d90": "increaseLockAmount(bytes32,uint256)", +"81fc7f2b": "accountFrozenStatus(address)", +"81fcef3c": "bitcoinContract()", +"81fcfbcc": "allocateBountyTokens()", +"81fd552f": "storageOwner()", +"81fd63c2": "kanaabbcwalletcoin()", +"81fdbeff": "TransferCoinsFrom(address,address,uint256)", +"81fe5786": "max(int256,int256)", +"81fedc73": "Casinowo(uint256,string,uint8,string)", +"81feed27": "awardName(uint8)", +"81ff01f7": "REPOPCore()", +"81ff4d0b": "TEAM_TOKENS()", +"81ffdfab": "getTokenAmountForCampaign(bytes32)", +"82004053": "ownerSetZlotsAddress(address)", +"8200a57f": "changeOwner(address,address,bool,bytes)", +"8201ff14": "setNewTerrain(uint256,uint256,bytes32)", +"820203a3": "ztx()", +"82023707": "updateSecondUnionIds(bytes32,bytes32)", +"82024a14": "PromissoryToken(address,uint256)", +"820267ff": "diminishPool(uint256)", +"82027b6d": "isAllowed(bytes32,address)", +"820333a2": "seeAddress()", +"8203e7f3": "justSendDonations()", +"8203f5fe": "initContract()", +"82043443": "transfer_(uint256,address,address,uint256)", +"820447fc": "TrimpoToken(uint256,string,string,address,address,address)", +"8204ecdd": "getFee(bytes)", +"820537b7": "getDaoists()", +"8205e8e7": "setPayment(uint256,uint256,bool,address)", +"82067cc0": "pauseRoundB()", +"8206ba89": "MAX_STAGE_2_LIMIT()", +"82076979": "TeamTokenHolder(address,address,address)", +"820776de": "DivsToRefundpot()", +"8207b07d": "lastPurchasePrice()", +"8208921d": "getWalletFor(address)", +"8208df23": "stack(address,uint256,uint256)", +"820935dd": "HDILToken()", +"82094fa4": "setAddressAdmin(address)", +"8209b38a": "Freecoins24()", +"8209d121": "a_viewSellOffersAtExchangeMacroansy(address,bool)", +"820a5f50": "fundedAmount()", +"820b9f1e": "kncPerETHRate()", +"820bec9d": "receivedETH()", +"820c05db": "FPINCOIN(uint256,string,string)", +"820c1dd0": "pollBurnQtyMax()", +"820c59bb": "GetIsPauded()", +"820c7468": "isVendorOf(address,address)", +"820c815e": "EGGS_TO_HATCH_1DINO()", +"820cfa06": "LogUserRemoved(address)", +"820dc540": "lockBalanceIndividual(address,uint256)", +"820e0d1f": "getChallenger(bytes32)", +"820e5e0b": "DividendRecycled(address,uint256,uint256,uint256,uint256)", +"820e79ed": "cstBalanceLimit()", +"820e93f5": "email()", +"820ecdaf": "iou_purchased(address)", +"820f52bc": "validPeriods()", +"820f9b85": "changeBetRange(uint256)", +"82100be6": "getWinningPayoutDistributionHash()", +"82100e3f": "deploymentBlock()", +"82104786": "Profit1000()", +"8210f13b": "BatchCancelSales(uint256[])", +"82123075": "safeExit()", +"82123cd2": "prizeReferee()", +"8213dafc": "setupAirDrop(bool,uint256,uint256)", +"82142370": "preICO(address)", +"82147bb4": "getGuardianNum()", +"8214fe03": "setMetadataChannels(string,string)", +"82154075": "Rentable()", +"8215c35d": "bincentiveErrand()", +"821648f4": "accessHolder(address)", +"8216ed6c": "getCompte_22()", +"82173d11": "KentKoinToken()", +"82189551": "buy(uint256,bytes)", +"8218e540": "insertHash(uint16,uint8,uint8,string)", +"821919fd": "getPetCanPresellCount()", +"821b771f": "targetBondingRate()", +"821b98f3": "closeTheoreticalClosedAuction(address,address,uint256)", +"821bee73": "vestings(uint256)", +"821c9a57": "test_testableStandardCampaignRefund()", +"821d7356": "setMainnetLocked(bool)", +"821e2491": "MyBetting()", +"821e3759": "payDivsValue(uint256)", +"821e4496": "isVerifiedCode(address,bytes32)", +"821e9169": "testFailControllerChargeMoreThanApproved()", +"821f830f": "addPack(address)", +"82202a15": "fetchCurrentSnapshotBlockIndex()", +"8220e945": "FactoryChangedEvent(address)", +"8221ac6f": "_createHolderId(address)", +"822221a6": "setContractToken(address,address)", +"82222674": "changeEndBlock(uint256)", +"822296d4": "isList()", +"8222a5ce": "insurance_Token()", +"8222aa1e": "settle(address,uint64,uint64,bytes)", +"8222b7e9": "getBonusPercentage()", +"8223188c": "Rose43()", +"82233b7a": "returnHostCut(uint256)", +"8224b76b": "StartOK()", +"8224ca2b": "SaleEDUSupply()", +"82251512": "divCeil(uint256,uint256)", +"8225172f": "getVowInfo(bytes32)", +"82251b99": "DRONECOIN()", +"8225757b": "getAddressByUserId(uint256)", +"822785e4": "_setTokenDescription(address,uint256,string)", +"82281104": "incise(uint256)", +"82286755": "MyRefundableCrowdsale(uint256)", +"82288e89": "setAccountIsNotFrozen(address,bool)", +"8229268b": "StageThreeDisable()", +"822942aa": "placeDeal(bytes16,address,address,uint256)", +"822a46ae": "setTiimPrivateSaleAddress(address)", +"822b08d0": "grantManagerPermission(address,string)", +"822b0be3": "teamTimeLock1()", +"822b1747": "_getEpicPlusRarity(uint32)", +"822bd0dd": "BOT_ELEMENT_3()", +"822c7671": "testControllerShouldBeSet()", +"822cba69": "setUint64(uint64)", +"822d487d": "getBrands()", +"822d9b4e": "onlyOwnerGetBountyWallet()", +"822daf60": "timeFactor()", +"822e1506": "_bonusRatio2()", +"822e57f1": "depositHelper(uint256)", +"822ee26c": "canMovetoken()", +"822f31e2": "AlexCoin()", +"822f7eb4": "setFeeReceAccount(address)", +"823113c7": "thresholdsByState(uint256)", +"82311e25": "checkStage1Over()", +"823126d5": "_createToken(address,uint256)", +"8231ee98": "lastTimeGen0()", +"823213ef": "removeExclusiveRate(address)", +"823287b7": "chargeQuarterlyRate(bytes32,address)", +"8232e09e": "DeleteUser(address,address)", +"82330505": "setCommissionPoints(uint256,int256)", +"823374e3": "changeDedicatedProxy(address)", +"8233fbcb": "getTotalProfit(address)", +"82348bab": "setMinSlippageFactor(uint256)", +"823506af": "getData_29()", +"82351b43": "getLinearRelease()", +"82357105": "bl()", +"8236342c": "hashToPoint(bytes32)", +"82367b2d": "updatePrice(uint256,uint256)", +"8237ab8d": "IsSeedMember(address)", +"8237bbf0": "min_shares_to_sell()", +"82381c96": "WatchCurrentMultiplier()", +"8238520f": "getParentBranch()", +"8238b968": "BeatOrgTokenMainSale(address)", +"8238cc8f": "getFIRST_STEP_MULTIPLIER()", +"823914d9": "multisigETH()", +"82396bc6": "lnLimited(int128,int256)", +"82396f60": "getTokensInAction()", +"8239773a": "NePay()", +"8239b1e7": "getSequenceId(uint256)", +"8239b29d": "periodITO_hardCapInUSD()", +"823ab43b": "returnedTo(address)", +"823ac373": "verify(bytes32,bytes,address)", +"823b5e9f": "getAuditTimeoutInBlocks()", +"823b7475": "UpgradeAgentSet(address,address)", +"823ba0b8": "burnFormula()", +"823ba381": "InvestClose(uint256,uint256,uint256)", +"823bce43": "zasxzasx()", +"823c73ec": "MarginToken()", +"823c82ca": "FREEZE_PERIOD()", +"823cfd70": "changeMinStakingTime(uint256)", +"823e1832": "ChangeClientCategory(address,uint256)", +"823e569e": "controlWallet()", +"823e6e79": "validateBalance(address)", +"823edd48": "getComponentId(uint256,uint256)", +"823f57ca": "withdrawFromAmt()", +"82401f06": "transactionSwitch(bool)", +"82402743": "createPromoNarco(string,string,address)", +"8240ae4b": "challengeReparameterization(bytes32)", +"82419e92": "numberToString(uint256,uint256)", +"8242216d": "jackpotOfHouseEdge()", +"82425d7c": "hasNoBids()", +"82428323": "updatePeriodically(uint256)", +"82430c07": "_sendOwnership(address,address,uint256)", +"824338bd": "founderAllocation()", +"8243a036": "presaleFemaleTokensLimit()", +"8243fd61": "addMilestone(uint256,uint256,uint256,uint256,string)", +"8244208c": "FrescoToken()", +"8244b8c8": "findEndpointByAddress(int256,address,address)", +"8244ee58": "Amberella()", +"824563f6": "mintingContractAddress()", +"82457d53": "periodTable(uint256)", +"82474b1b": "teamName()", +"8248159e": "registerApprove(bytes32,uint8,bytes32,bytes32)", +"82484a36": "vestingToken(address)", +"82484c0b": "BetstreakICO()", +"824891f8": "changeMinimumCap(uint256)", +"82489311": "_buyNationInternal(uint8,uint256)", +"8248e722": "updateConfig(uint256,uint256)", +"824916b6": "playersAmounts()", +"82495626": "getVoteAccount(uint256,uint256,uint256)", +"824989c3": "changeLifetime(uint256)", +"824a5166": "ChannelCloseRequested(address,uint256)", +"824be3c7": "TheRichestWins()", +"824d1b4b": "preICOStartDate()", +"824d5603": "getIndex(uint16,uint16)", +"824d84d5": "createVestingContractWithFloatingPercent(address,uint256,uint256,address,uint256[])", +"824dbc9a": "changeMembership(address,uint256,bool,string)", +"824e5ebf": "distributeETHOS(address[],uint256)", +"824eddd9": "removeSupportedToken(address,address)", +"824eec3b": "editionOfTokenId(uint256)", +"824f0f7e": "tittyContractAddress()", +"824f2f1f": "globalConstraintsCount(address)", +"82507c5a": "Radix()", +"8250ea7d": "getReferralPool()", +"8250f7e5": "isInvestmentPermitted(address,uint256,uint256)", +"82518c2a": "exercisePut(uint256,uint256,uint256)", +"82520e07": "receiveFrom(address)", +"82528791": "setWallets(address,address,address,address,address)", +"8252ad9c": "totalAuction()", +"8252b2cf": "acceptCreatureOwnership()", +"8252e391": "transferInternal(address,address,uint256,bytes,bool,string)", +"825374ba": "buyATCToken()", +"8253adf1": "createBet(bytes16,bytes16,bytes16,bytes16,uint256,uint256)", +"82544c1f": "GoWalletToken()", +"8256687c": "addClaim(bytes12,bytes12)", +"82568a24": "p_update_planetCryptoCoinAddress(address)", +"82576dd6": "Laundromat(uint256,uint256)", +"8257f610": "canPurchase(uint256)", +"8258cbbd": "getContractETH()", +"825918ee": "delgodaddress(address,address)", +"82594f09": "iMaliToken(address)", +"825993ab": "totalCouponsUSD()", +"8259c78c": "depositPpm()", +"825a229e": "setEditor(address)", +"825af86b": "processJackpots(bytes32)", +"825b8b42": "buy(uint16[])", +"825bdb74": "setSecondaryManager(address)", +"825c3e36": "closeGame(bytes32,uint8)", +"825d7034": "RiptoBuxToken()", +"825e04d3": "dfs()", +"825edfd3": "getClassMechValue(uint256)", +"825f5a93": "RoundDSold()", +"825f6552": "SVET()", +"82609d51": "failedDonations()", +"82611dfe": "setOption(string,uint256)", +"8261b6bf": "receiveTokenLoot(uint256[9],uint256,uint8,bytes32,bytes32)", +"8261c4c7": "MINERS_HOLDER()", +"8261cfe4": "travelTo(uint256,uint256)", +"8261eb1b": "frtToken()", +"82629384": "shareStoredTokens(address,uint256)", +"8262963b": "setInfo(string,uint256)", +"8262fc7d": "addrBalance(address)", +"8263a938": "getProposalLength()", +"8263e953": "_claimSocialNetworkIdentity(uint256,uint256,address,uint8,bytes32,bytes32)", +"826446fa": "parse2wei(uint256)", +"82645725": "Planetagro(address)", +"82648222": "retrieveWCT2()", +"8264fe98": "buyPunk(uint256)", +"8265d137": "checkRegistrationStatus(bytes32,address)", +"8265d577": "TestreplayAnser(uint256)", +"8265dbc1": "bonusAndBountyTokens()", +"8265fb13": "optionPoolMembersAmount()", +"82661dc4": "splitDAO(uint256,address)", +"826679a1": "getFundSPBalance()", +"82672304": "GeneratePublicKey(string,string)", +"82672482": "vestingRegistered()", +"826776fa": "claimTeamTokens(address,uint256)", +"8267a9ee": "deleteIntValue(bytes32)", +"82688f14": "bn128_multiply(uint256[3])", +"8268efcd": "RunningAuctionsEvent(address,uint256,uint256,uint256)", +"82692679": "doSomething()", +"82699367": "CicadaToken()", +"8269cf4d": "seo(uint256)", +"8269d3c0": "buyTokensT4T(address)", +"8269df9b": "getLastCategory()", +"8269ee3d": "Issued(address,uint256,uint256)", +"826a483f": "_emitHashSet(address,bytes32,bytes32)", +"826a49c9": "removeGameInfoFromArray(uint256)", +"826c10d9": "exhaustBattle(uint256)", +"826c2447": "PGDToken()", +"826c69b8": "participantBalance(address)", +"826c6f73": "addServer(string,uint256)", +"826cc57a": "referral_address()", +"826d3379": "tierPrice(uint256)", +"826db6c8": "SLFYCoin()", +"826e9def": "initPresaleTokenVault(address[],uint256[])", +"826efb6d": "payBonus(address[])", +"826f57a1": "endBetting()", +"826f8a00": "createOrder(string,string,string,string,string,string)", +"827037d6": "modCEOAddress(address)", +"827037db": "icoStart()", +"8270c41e": "setPriceToken(uint256)", +"82712aeb": "purchaseWolkEstimate(uint256,address)", +"827147ce": "returnString(string)", +"8271bd99": "payoutAmount(address)", +"8271bedc": "getUserBetsLength(uint256)", +"8272d083": "isSupported(address,bool)", +"82731247": "isB(address)", +"8273a411": "allBalancesOf(address)", +"82744368": "minimumEtherAmount()", +"82757f99": "withdrawTeamPot()", +"82760c88": "GoGlobals()", +"82766b1b": "setAmount(address[],uint256[])", +"82768708": "weiMinimumGoal()", +"8276bd19": "PROPOSED_STATUS()", +"8276ccf2": "setHeroName(uint256,string)", +"82771c8e": "isSane()", +"82771ff4": "endPlaceOrder(uint256)", +"82776521": "strConcats(string,string)", +"8278337a": "writeAttributeFor(bytes32)", +"8278fcea": "AirdropReward()", +"82790c19": "SideBridge(uint256,address[],uint256)", +"82792ce8": "getInsideCallSender()", +"82797bea": "Preesh()", +"8279c7db": "setReceiverAddress(address)", +"8279ea54": "change_bounty_manager(address)", +"827aeb16": "_changeTittyPrice(uint256,uint256)", +"827bc64b": "setLeftoverTokensBuffer(uint256)", +"827bfbdf": "setLocation(string)", +"827c049e": "emission()", +"827c1e41": "getTittyByWpId(address,uint256)", +"827cc452": "withDrawMoney(uint256)", +"827d084a": "getActiveBusinessesPerCity(uint256)", +"827d7ba9": "Fosha(address)", +"827e4cf1": "manuallySetNumRewardsAvailableForChildAddress(address,address,uint256)", +"827ef325": "_parseMsgData(bytes)", +"827ef4c7": "m_fundsAddress()", +"827f143e": "setPresentMoney(uint256)", +"827f32c0": "generateTokens(address,uint256)", +"827fc57c": "ChickenFarmer()", +"827ffcea": "horas()", +"8280114b": "addressOfERC20Token()", +"828033da": "getFlag(uint256,string,string)", +"82803c22": "sell_tokens(uint256)", +"8280b498": "setFrozen(address,bool,uint256)", +"82812aed": "BuyPriceSet(uint256)", +"828183bc": "getSwapInfo(uint256,address,address,address)", +"8281da38": "refundBet(address,bytes32)", +"8281feaa": "QuestionIs(string,string)", +"828282e9": "bonusRates(uint256)", +"8282e1e4": "SEPA()", +"828363b4": "transferAdviser(address[],uint256[])", +"828375e8": "computeTokensWithBonus(uint256)", +"82838c76": "subTotalSupply(uint256)", +"8284f2a7": "proposeGame(address)", +"82857a03": "approveAndCallWithSender(address,uint256,bytes4,bytes)", +"8285d272": "GOAL_REACHED_CRITERION()", +"82862275": "getDeadline(uint256)", +"82872491": "setCaps(uint256,uint256,uint256,uint256)", +"8287ccb4": "onDeposit(uint256)", +"8287d6ce": "_createDeposit(address,uint256,bool)", +"828806cd": "submitTransactionWithSignatures(address,uint256,uint8[],bytes32[],bytes32[])", +"8288196d": "THANKSTEST1()", +"8288edd0": "nonTransferrableBalances(address,address)", +"828909bd": "getIntValue()", +"82892dd9": "blockMember(address)", +"828a33b9": "FreeDiceCoin()", +"828ae96d": "cdc()", +"828c06cd": "expLimited(int256,int256)", +"828ca03c": "getTaskListSize()", +"828d671c": "dyn_sig()", +"828dfbca": "user_acq_address()", +"828eab0e": "defaultResolver()", +"828f1b42": "buyObject(address)", +"828f4057": "numberofGamePlay()", +"828f5fba": "air2(uint256,uint256,uint256)", +"828f717c": "fixPlayerID(uint256,uint256)", +"828f8581": "tokenTransferFunctionIdentifierMap(bytes32)", +"8290d1e0": "StandardTokenDeployable(string,string,uint256,uint256,address)", +"8290fe25": "finalizeExits(uint16)", +"8291286c": "contractId()", +"82914e5d": "getObjectData(bytes32[],uint8[])", +"82916381": "execute(address,uint256,uint256,bytes)", +"82917320": "increaseLockedBalance(address,address,uint256)", +"8293779c": "isOps(address,address)", +"82939b27": "getPreSaleData()", +"8293a114": "unbanAddress(address)", +"8294a796": "WelfareHandout(address,uint256,uint256,uint256,uint256)", +"829534d7": "m_pendingIndex()", +"8295a9ba": "checkDupe(string)", +"829644a6": "freelanceReinvest(address)", +"82964696": "ZSYCoin(uint256,string,string)", +"8297b90c": "PRESALE_LENGTH()", +"8297d46d": "BTL_ATHENIAN()", +"8298c3b5": "itemVoteDn(address,uint256)", +"8298c5dc": "last_winner()", +"829923bf": "admin_setAdmin(address,bool)", +"829965cc": "epochCount()", +"82996d9f": "rent()", +"829981fb": "FinalToken(uint256,string,string)", +"829a34c6": "getUserInfo(bytes20)", +"829a92f4": "hardcapChanged(uint256[])", +"829b38f4": "getMaxEscrowAmount(uint256)", +"829bd99c": "balanceOfByLegacy(address)", +"829c3428": "startTransfer()", +"829c38e1": "claimSolve(uint256[],uint256,uint256,bool)", +"829c3dee": "createDebt(bytes32[8],bytes,uint256)", +"829e9ece": "deathData_v16()", +"829ebdcd": "upgradeFor(address,uint256)", +"829ed3a5": "ownerTokenTransfer(address,address,uint256)", +"829efd71": "TonhaoCoin()", +"829f0667": "verify_sk_knowledge(uint256[2],uint256[2])", +"82a0888b": "totalSaleWei()", +"82a09cc5": "TokenCreated(uint256,address,string)", +"82a123ea": "WhitelistUpdated(uint256,string,uint256)", +"82a147cd": "addYouCollectContract(address,bool)", +"82a18331": "MOONCOINCONTRACT()", +"82a1ce1b": "setSourceToken(address)", +"82a352e4": "firstStagePriceOfTokenInWei()", +"82a35706": "tokenSoldPreICO()", +"82a3e5df": "STATE_CLAIM_ENABLED()", +"82a3f98d": "VOTING_PERIOD_DURATION()", +"82a5285d": "getMinBetAmount()", +"82a60a59": "CollectibleIndex2()", +"82a62137": "activateAccount(address)", +"82a66d93": "earlySponsor()", +"82a7cf1e": "ownerOf(uint16)", +"82a86cda": "getRarePLATInfo(uint256)", +"82a90545": "funComputeRoundTime(uint256)", +"82ab890a": "update(uint256)", +"82ab8a82": "startDeal(bytes32,uint256)", +"82ac1d99": "getNodeValue(bytes32)", +"82acaa39": "getChildrenAgainstAnimalId(uint256)", +"82ad5ecf": "yeedToken()", +"82ad6f35": "refund(address,address,uint256)", +"82ade405": "forceChooseRandomWinner()", +"82ade466": "getWithdraw(address,address,uint32,bytes32[],uint256)", +"82ae2227": "createUser(uint32,uint64)", +"82af3526": "addGift(address,uint16)", +"82afd23b": "isActive(uint256)", +"82b00403": "finalFundGoalReached()", +"82b022e0": "set_species(uint256)", +"82b0444e": "CityMayor()", +"82b0627c": "changeFundingTime(uint256)", +"82b0862f": "addBps(uint256,int256)", +"82b1ad50": "totalPrize()", +"82b1b4f3": "WithdrawToAdmin(uint256)", +"82b1b617": "ViewSellOrder(address)", +"82b1fb0d": "setGlobalMultisigWallet(address)", +"82b2a559": "buy(uint256,uint256,address,address)", +"82b2e257": "getTokenBalance()", +"82b2f95f": "DEVELOPER1()", +"82b49248": "BlockOne()", +"82b57b96": "MONUMENT_UN_FEE()", +"82b58599": "WeiHash(address)", +"82b61a3e": "Rectangle(address)", +"82b68f4f": "actionVotedRate()", +"82b74b89": "lockTransfers()", +"82b7b500": "find(string)", +"82b7fa4e": "cancelGladiatorBattle(uint256,bytes32)", +"82ba614f": "setRound(uint256,uint256)", +"82bb326b": "isGoldMigrated(address)", +"82bbcc2c": "removeIdArrayItem(address,uint256[],string,uint256)", +"82bbd1fe": "setlastprize()", +"82bbdbec": "nameAvailable(string)", +"82bbe9cc": "getGameFee(uint256)", +"82bc07e6": "lastRound()", +"82bcd463": "DAKUToken()", +"82bcef79": "increaseAllowanceProxy(address,address,uint256)", +"82bd5a71": "warriorToApproved(uint256)", +"82be0ccd": "distributeTokensToApprovedUsers()", +"82be415d": "BonusDealer()", +"82bf6464": "DAOrewardAccount()", +"82bf9a75": "setPip(address)", +"82bfa9f2": "upgradeStorage(address)", +"82bfc739": "reLoadXaddr(address,uint256,uint256)", +"82bfefc8": "TOKEN()", +"82c00a50": "getCourseLength()", +"82c0287e": "deleteEtherBox(address)", +"82c058d9": "showTrnsactionLog(uint256)", +"82c0652a": "calcMultiplier()", +"82c174d0": "preSigned(bytes32,address)", +"82c198ef": "fxpDiv(int256,int256,int256)", +"82c20f84": "preSaleBonus3Percent()", +"82c26c6a": "GOCToken()", +"82c30220": "Earthcrypt()", +"82c4175d": "privateRate()", +"82c48f9e": "_batchTransfer(address,address[],uint256[])", +"82c51376": "LENRCoin(uint256,string,uint8,string)", +"82c59c81": "getGameBlocks(uint256)", +"82c6b2b6": "OfficalHold()", +"82c7340e": "GetPlayerRound(address)", +"82c7bac7": "callOnExchange(uint256,bytes4,address[5],uint256[8],bytes32,uint8,bytes32,bytes32)", +"82c7bf2f": "Zigger()", +"82c7f4d6": "setMessagefromdovie(string)", +"82c8ac27": "DatCrowdPreSale(address)", +"82c8c76f": "blocktube(uint256,string,uint8,string)", +"82c9004a": "computeArtistGenesisSaleFee(bytes32,uint256)", +"82c97b8d": "collectReward(address)", +"82ca116d": "changeBankAddress(address)", +"82ca49a8": "sendOwnerFee(uint256)", +"82cac6df": "lastRate()", +"82cb08aa": "MoveToBase(uint256)", +"82cb9df9": "addrFinance()", +"82cbb2e4": "Dagelane()", +"82cbdc0f": "create(string,string,string,address)", +"82ccef76": "GameEnded(address,address,uint256,uint256,uint8,uint8)", +"82cdc0fb": "setRunTimeAfterSoftCapReached(uint256)", +"82cdc93e": "getPlayerInstWinning(uint256,uint256,uint256)", +"82ce6523": "IWasFirstShareToken()", +"82cee91c": "BonusPeriodFor(uint256)", +"82cf114c": "setProfitAddress(address)", +"82cf2116": "transferAndAuction(uint256,address,uint256,uint256,uint64)", +"82cfd1e0": "turn_flag_OFF()", +"82cfee4d": "BitcoinSapphire()", +"82d04bd4": "_complianttransfer(address,uint256)", +"82d1407c": "calcTicketEarnings(uint256,uint256)", +"82d18650": "minPay()", +"82d1bc89": "Darks(address,address)", +"82d22377": "infraIndexToApproved(uint256)", +"82d288c2": "setMintingCurator(address)", +"82d29195": "FundingStageNum()", +"82d2dcfb": "UETH()", +"82d33374": "updateLastTransactionTime(uint256)", +"82d40041": "getAbilitiesForCollectibleId(uint256)", +"82d419f5": "fullUnlockAngelsAccounts(address[])", +"82d4685c": "setAllocations(uint256,uint256,uint256,uint256,uint256,uint256)", +"82d559de": "catchMonster(address,uint256,uint32,string)", +"82d5eb98": "playerIdToExtendedAttributes(uint256,uint256)", +"82d708c4": "dividendRecentBuyersPercentage()", +"82d74005": "YUPTimelock(uint256,uint256,address,uint256)", +"82d82983": "RuralBank(uint256,address[])", +"82d8dff6": "getMaxPrice()", +"82d95df5": "setStartDate(uint256)", +"82d9ac39": "percentForBounty()", +"82d9b9bb": "turnOffCanUpdateNextGameMinAndMaxBlockUntilGameEnd()", +"82db9bd4": "setCaissa()", +"82dc107d": "SECOND_TIER_SALE_START_TIME()", +"82dc1ec4": "addPauser(address)", +"82dc5c9d": "UnionChain()", +"82dc7836": "openGate()", +"82dc87b6": "RefundPeriodStart()", +"82dced63": "testHitPresaleCapPresale()", +"82dd6012": "_aremoveByIndex(uint256)", +"82dd87dc": "deleteUser(uint256,uint256)", +"82ddad13": "Auction(address,uint256,uint256,uint256,string)", +"82de6df7": "getGameBegin()", +"82deb6cd": "m_publiclyDistributedTokens()", +"82decb49": "_maint_setCustomSeed(uint256)", +"82dfc5f7": "WETH_ADDR()", +"82dfe1fb": "changeTreeAttributes(uint256,string,string)", +"82e1250f": "DaysToMyDestroy()", +"82e2f767": "finalizedNextUpgrade()", +"82e3036c": "StandardToken(string,string,uint8,uint256,address)", +"82e37b2c": "getPlayerName(uint256)", +"82e380ef": "auctionInformation(uint256)", +"82e41258": "unregisterPrefix(string)", +"82e43a3b": "TheFrozenSolidShitCoin()", +"82e46b75": "setCoin(address)", +"82e5d073": "getRewardTokenCount()", +"82e615fc": "bidRegistry()", +"82e61d79": "PayoutDividends(uint256,uint256)", +"82e6bbd2": "onlyBouncerExecuteDelegatecall(address,uint256,bytes)", +"82e6d3d6": "foundationSupply()", +"82e77165": "_setAllKeys(uint256,uint256)", +"82e93309": "importGenesisPairs(address[],address[])", +"82e94ac5": "eject()", +"82e96916": "setCoinPercent(uint256)", +"82e97740": "initAffiliate()", +"82ea3985": "clearNextArenaTime()", +"82ea84a3": "getIssuedScoreAmount()", +"82ea872c": "refHandlerAddress()", +"82ea97b3": "tokensForIco()", +"82ebaec4": "distributeTEST(address[])", +"82ebe9ba": "photoData()", +"82ec5ddc": "BioToken(address,address,address,address,address)", +"82ec623c": "_noThrowImplements(address,bytes4)", +"82edaf94": "tokenContractAddress()", +"82ee27cc": "setCoinBalance(address,uint32)", +"82ee282b": "thirdBonusSalesEnds()", +"82eed60c": "pauseCrowdsale(address)", +"82ef351a": "getTotalMonster()", +"82ef6483": "RabbitCore(string,string)", +"82ef8fa8": "adminClaim()", +"82f0151c": "MetaHash()", +"82f0622a": "teamReward()", +"82f0b31c": "getLife(bytes32)", +"82f0d875": "makeHash()", +"82f128f7": "MJOYToken()", +"82f16872": "raffle_balance()", +"82f19e3a": "deltaTFunc(uint256,uint256,uint256,uint256,uint256)", +"82f1ec1f": "getActivityAccountInfo(address)", +"82f2045c": "getEntitiesCount()", +"82f2a164": "addCET6(uint32,uint32,uint32)", +"82f2d8d7": "moveMarketData(uint256[],uint64[],uint64[],uint128[],address[])", +"82f39e2f": "mktTokenCap()", +"82f43303": "roundMax()", +"82f4b3a8": "badgeIfFreeze(address)", +"82f4ef73": "getStageName()", +"82f56556": "udgradeAttack(uint256,uint256)", +"82f5a3e1": "withdrawTotalBalanceDonateWei(address)", +"82f5e31b": "convertFromWei(bytes32,uint256)", +"82f66ff0": "RabbitCoin(uint256,string,string)", +"82f68dc4": "rankOf(uint256)", +"82f7325e": "CRYPTOVENO()", +"82f768d4": "tokenbeneficiary()", +"82f78260": "acupuncturecoin(uint256,string,string)", +"82f7d5c3": "divideNumberBy()", +"82f8152c": "account2()", +"82f858e8": "addresses4(uint256)", +"82f867a4": "BpsToken()", +"82f8767d": "SuperPAC()", +"82f87fdb": "checkFundingStateFailed()", +"82f8b6e9": "roundInterval()", +"82fa3421": "push(uint256,bytes32)", +"82fa7f8b": "weiPerWholeToken()", +"82fa9c0d": "isPersonalBonuses()", +"82fac352": "getPricesOfLatestTradeRecords(uint256)", +"82fb3b7c": "voteNoLockByAdmin()", +"82fb63c7": "getImageCurrentRegionId(uint256)", +"82fbbe47": "Ticked(uint256,uint256,uint256)", +"82fbdc9c": "register(bytes)", +"82fc49b8": "setCosignerAddress(address)", +"82fd5bac": "getDeal(uint256)", +"82fe1e46": "JaneToken()", +"82fef47d": "addToLists(address,bool,bool)", +"82ffee45": "approveRemoveOwnerRequest2()", +"82fffde0": "get_articolo(bytes,bytes10)", +"830010f3": "setReferrerRewards(uint256[])", +"8300399d": "aqwsaqws()", +"8301cfec": "backVenusCoinOwner()", +"8301fb2e": "cashOutTank(uint32)", +"8301fb61": "userHasSmartSpeed(address)", +"830245e3": "sumICOStage7()", +"830321be": "PGUC()", +"83037b81": "checkInterest(address)", +"830402c1": "startGameGas()", +"83054b6a": "GetConsentDirectiveCount()", +"8305d1c3": "GGGToken()", +"830639ac": "isWhitelisted(address,uint256)", +"83076a73": "updateCfo(address)", +"83084b3f": "setNotInWhitelistAllow(uint256)", +"8308c786": "minBlockGap()", +"8308d7e9": "set(address,uint256,uint256)", +"830953ab": "claimAmount()", +"830adf56": "get_previous_user_recast_from_item(bytes32,bytes32)", +"830b3a1e": "setIsFixed()", +"830b6868": "getPriceCredentialItemId(bytes32)", +"830b6b87": "MyOffer(uint256,string,uint8,string)", +"830cbbbd": "redeemToken(address,uint256)", +"830ced52": "TIER_1_CAP()", +"830d0627": "giveCdpToProxy(address,bytes32)", +"830d77d4": "ETHERONEUM()", +"830e8e64": "callAmendment(uint256)", +"830ebd7f": "transferFromNotFullAllowanceTest(address)", +"830ef41b": "transferERC20(uint256,address,address,uint256)", +"830f2935": "icoAgent()", +"830f3d8a": "Diploma()", +"83100580": "PriceWeekTwo()", +"8310d61c": "getLastGame()", +"83111397": "blacklistAddr(address[])", +"831121dc": "getLockedStateAddress()", +"83123f30": "setRole(address,bytes32,bytes32,uint256)", +"83123fa6": "coinsIssuedIco()", +"8312a886": "tokenValueCount()", +"8314b490": "earlyContribList(uint256)", +"8314dcb4": "unAuthorizeContract(address)", +"83150a93": "opetTokenBalance()", +"83160d71": "setPrices(uint256,bool)", +"8316394e": "allow(bytes32,string,address,bool)", +"83186be0": "startICO_w1()", +"83187cf4": "cryptaurRecovery()", +"8318e40b": "transferBcoupons(address,uint256)", +"83197ef0": "destroy()", +"8319da07": "setOwnerCut(uint16)", +"831a1754": "TOKENS_HARD_CAP()", +"831a1a3c": "ECPoints()", +"831a987a": "getSoulByEth(uint256)", +"831aab01": "setData_15(string)", +"831aba43": "referralsOf(address)", +"831b19c2": "KOToken()", +"831b3f67": "convertDustToEther(uint256)", +"831b55d6": "get_balance(address,uint32)", +"831bb4f2": "setAcceptedLegacyAugmintToken(address,int256,bool)", +"831c2b82": "getChannel(bytes32)", +"831d3e09": "offFreezing()", +"831dc22c": "CATCrowdsale(uint256,uint256,uint256,address,address,address)", +"831e0485": "twitterIdOfClaimerAddress(address)", +"831e1deb": "changeExchange(uint256)", +"831e6270": "isSaleFinalized()", +"831e80f2": "create(string,string,uint8,uint256)", +"831ed348": "clearJoinedCrowdsales()", +"831f5ad2": "remainBalanced()", +"831f750e": "claim(address,string,string)", +"832018aa": "BitSelectProtegido()", +"832048d4": "TokenLoot(address,address,address,address,address,address)", +"83206e78": "marriedAt()", +"83212e74": "updatePreSaleCloseTime(uint256)", +"83219a8a": "editMetadata(uint256,string)", +"8322cb91": "addTicket2(address,uint256)", +"8322fff2": "ETH()", +"83234aa6": "FileInfoManager()", +"8323550b": "TUSD()", +"8323bebb": "TokenSold(address,uint256,uint256,uint256)", +"8324a852": "partner(address,address,uint256)", +"8325229a": "playerWithdraw(address)", +"83253cfa": "cancelMarginCallOnBehalfOf(address,bytes32)", +"83255d6e": "getOwnProducts()", +"8325a1c0": "borrowInterestRate()", +"8327a313": "test_initialize()", +"832880e7": "getUser()", +"83289567": "meetingDate()", +"8328b610": "setStakingRequirement(uint256)", +"8328dbcd": "migrationAgent()", +"8328e032": "setStandardPackPrice(uint256)", +"8329ac52": "voteForCandidate(string,string)", +"8329df0a": "allowReferrals()", +"832a66a2": "purchaseCardinal()", +"832b0dc3": "testThrowOnTransferToNullAddress()", +"832b2c60": "specialManagerAddressNumberMap(address)", +"832b9eb2": "MANHATTANPROXY6THAVE()", +"832bc28d": "getPoolHistoryCount()", +"832bff3a": "setForkEndTime(uint256)", +"832df980": "lockEmission()", +"832e02ef": "getUpgradeValue(address,uint256,uint256,uint256)", +"832f6412": "getCenturion(uint256)", +"832f6924": "shuliang()", +"83315b6e": "CONTRACT_FEATURES()", +"83318574": "maxPreSaleStage()", +"83324e8c": "numGroups()", +"833270d8": "preIcoEnd()", +"833331e8": "totalJadeProduction()", +"8334278d": "reserves(uint256)", +"83343d80": "deleteItem(bytes32)", +"833472ba": "TCOCOIN()", +"83347622": "newTeam(string,string)", +"83349122": "crowdsaleIsOpen()", +"8334d195": "viewToken(uint256)", +"8334e170": "SellableToken(address,address,address,uint256,uint256)", +"83366ab0": "addBytes(bytes32,bytes)", +"8337077b": "returnToken(string,address,uint256)", +"83370c25": "FFFToken()", +"833747f8": "getLovers(bytes32)", +"8337680a": "getMyCommitmentCount()", +"833888f0": "LAF()", +"83393882": "contracteeWithdraw(uint256)", +"8339e153": "SETPointerToken()", +"833abf3a": "registerAssetProxy(bytes4,address,address)", +"833b1fce": "getOracle()", +"833b4596": "testApproveSetsAllowance()", +"833be5d5": "getTotalLoans()", +"833c202e": "UNITTransferWhiteList()", +"833cde52": "SaleToken()", +"833cf6fc": "TransCompleteds(address[])", +"833d56c7": "doSwarm(address,uint256)", +"833ea306": "soldForThird()", +"833eaa8b": "incise(address,uint256)", +"833eccc5": "batch_transfer(address[],uint256[])", +"833f43c2": "refill(address)", +"833ffb63": "removeOverride()", +"83405ddb": "unstakeCommunityTokens()", +"83408d73": "burnRemainingTokens()", +"8340f549": "deposit(address,address,uint256)", +"8341f26c": "icoTokenLimit()", +"834292a3": "CanYaCoin(address)", +"8342a9d9": "crowdfund()", +"8343816d": "AcceptCastleOffer(uint256)", +"8343e416": "asideTokensHaveBeenMinted()", +"83442b1e": "opt(address)", +"834472a5": "buildICOStageOne()", +"8344d26d": "TryUnLockCreatorBalance()", +"834614dd": "freeSub(address,uint8,bytes32)", +"8346378b": "transferBenship(address)", +"8346aa47": "spentParsecCredits()", +"8346d3c6": "MultiVesting(address)", +"8347a0d1": "issueTokenAndTransfer(uint256,address)", +"8348bfb9": "setICOAddress(address)", +"8348cf1e": "authorizeAmount(address,uint32)", +"8348d71f": "strConcats(string,string,string)", +"8348fe61": "createCenturion()", +"83492ff1": "deletePrice(string,string,string)", +"83499fdf": "BitcoinRed()", +"834b1aa1": "m_owner20()", +"834be978": "getRewardedSumByRound(uint256)", +"834c3351": "getGoldDataWeight()", +"834c6c84": "setCCH_edit_19(string)", +"834cc6fc": "createEscrow(address,address)", +"834d42c6": "serverForceGameEnd(uint8,uint256,uint256,int256,uint256,uint256)", +"834e0565": "GiveRNG(uint256)", +"834e476f": "newAuctionID()", +"834e6261": "CreateICO(address,uint256)", +"834ee417": "start_time()", +"834eebe8": "calculatePremium(uint256,uint256,uint256,string,string,string)", +"834f199d": "_calculateRequiredManaAmount(uint256)", +"834f54d0": "CarPark()", +"8350dfaf": "fetchdivstopot()", +"8350eb5e": "getHashInDataObject(bytes32[])", +"835164a0": "INBCToken(uint256,string,string)", +"8351a0d4": "getCumulativeProfit()", +"83525394": "NONE()", +"83533d63": "setNumAffirmationsSigned(bytes32,uint256)", +"83537b5f": "test_threeValidEqInt()", +"8353bb51": "ROLE_STATE_PROVIDER()", +"8353c9c8": "SetFreezingEvent(address,uint256,uint256,uint8)", +"8353ffca": "Withdraw(uint256,address)", +"835409f0": "InfimonkCoin()", +"835436b4": "evictWorker(address)", +"835592f8": "passed(address)", +"8355c263": "frozenMinDeposit()", +"8355e15c": "withdrawTokens2(uint256)", +"8356027e": "unfrozenTokens()", +"83563dc6": "_getYear(uint256)", +"83565503": "setMember(address,bytes32,address,bool)", +"83565cc7": "additionalAction(bytes32,uint256[])", +"8356a5b5": "weekOneStart()", +"8357417d": "WithdrawDevFunds()", +"8357c2f0": "setAmountToReceive(uint256)", +"835850f9": "_bytesToAddress(bytes)", +"83586713": "computeResult(uint32,uint32)", +"835939d5": "vote(address,bool,string)", +"8359f045": "range(int256,int256,int256)", +"835a749d": "partialRedeem(uint256,address[])", +"835ac5ce": "softcapUSD()", +"835b3720": "setGeneKind(uint8)", +"835b42fc": "testThrowUpdateLatestRevisionNotUpdatable()", +"835b862f": "OneGameToken(address)", +"835bbd55": "reserveTokens(address)", +"835c1154": "checkInvestments(address)", +"835c19f3": "receivePayment()", +"835c6386": "isPurchasePossible()", +"835c853b": "notaryFee()", +"835cb53b": "MAXIMUM_NON_WHITELIST_AMOUNT()", +"835d2d2e": "executeTransfer()", +"835e119c": "availableSynths(uint256)", +"835e33e7": "DianJingToken()", +"835e98d7": "bonusShare()", +"835eb9f8": "ShieldNetwork()", +"835ec6ef": "CreateDDFT(address,uint256)", +"835f6775": "setBonusesForAmounts(uint32[],uint32[])", +"835fa3ac": "icoSuccessful()", +"835fc6ca": "withdrawal(uint256)", +"835fcab3": "NAME_HAWKING()", +"836028a2": "disputeOpen()", +"83607b02": "calculateDevCut_(uint256)", +"836115fe": "unlockedTokens(address)", +"83617782": "startLive()", +"83624c17": "getPartyA(bytes)", +"83627b8e": "getEmployeeId(address,address)", +"8362f6eb": "balanceSender(address)", +"83634ad7": "fnv(uint256)", +"83636209": "RecoveryKeccak256(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"83638710": "getOwnerOf(uint256)", +"83638c12": "GCOIN()", +"83640881": "getTokenOrdersLength()", +"8364c078": "ownerGetUser(address)", +"8365172c": "num_levels()", +"8366437d": "RegisterUser(bytes32,bytes32[8])", +"83664dd3": "substituteManagerContract(address)", +"8366ee2b": "getPayeeLenght()", +"83672f3e": "setWallets(address,address,address,address)", +"8367e120": "apiUrl()", +"836826a6": "highestBet()", +"83685488": "TECHToken()", +"836880d3": "softcapAchieved()", +"8369ff08": "log2ForSmallNumber(uint256,uint256)", +"836a1040": "mint(uint256,address,uint256)", +"836a107f": "removeFromKYCList(address)", +"836a1e23": "collectExcess()", +"836adfd9": "libbibatchbacktest(uint64,uint32[],uint64[],uint64[],int64[],int64[])", +"836b680f": "createProductionUnit1()", +"836c67d7": "BAC()", +"836cca1d": "privateIcoMax()", +"836d6d66": "WeeklyLotteryB(address,uint256)", +"836d8b2a": "SolusPlatform()", +"836d9665": "removeUsersWhitelistA(address[])", +"836dea0b": "myEther()", +"836e4158": "numOrdersOf(address)", +"836e643f": "endStake(address,address,uint256)", +"836e8180": "round1()", +"836e9431": "updateUsersList()", +"83711c70": "ContributionResolved(bytes32,bool,address,address,uint256,uint256)", +"83714834": "factorial(uint256)", +"83714b27": "_safeMul(uint256,uint256)", +"837150cf": "paused(bool)", +"837197b2": "sendTokens(address)", +"8371e1e9": "rescale(int256)", +"83725a91": "Payment(address,address,uint256,uint256,address,uint8,uint256)", +"837356b1": "doNotAlwaysRequireCosignature()", +"837381fa": "withdrawFromContract(address,uint256)", +"837386ca": "candidateXPAAssets()", +"83739eda": "allocationsInitialised()", +"8373ae71": "cancelTradeOffer()", +"837564dd": "CNotes(string,string,uint8,uint256,uint256)", +"83771e56": "BSCToken(uint256,string,uint8,string)", +"83773de8": "_transfer(uint32,address)", +"83781340": "registerTradeProfile(bytes,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,bytes,uint256)", +"83786f8c": "getBalanceOfToken(address)", +"83788fce": "nextBlock()", +"8378ce42": "readStamped(bytes32)", +"837929b6": "getEventful()", +"83794502": "payForTask(uint256,uint256)", +"8379d75b": "BDC()", +"837a7ba5": "testThrowTransferDisabled()", +"837a8eb3": "CATWithdrawn(uint256)", +"837ada41": "cens()", +"837b68c8": "requestTokenExchange(uint256)", +"837cfb34": "LADYCoin(uint256,string,string)", +"837d52d8": "RAIT()", +"837e4cd9": "getNameAndAge()", +"837e60e6": "removePA(uint32)", +"837e6a94": "setOverride(address)", +"837e7cc6": "rollDice()", +"837f1bf7": "_appendTagged(string,string)", +"838006c0": "OwnableOZ()", +"83804c69": "verifyTransaction(bytes32,uint256,address,address,uint256,address,address,uint256,bytes32,bytes32,bytes,bytes)", +"8380edb7": "isUnlocked()", +"8381ada3": "GOLDEQ()", +"8381f58a": "number()", +"83829bf1": "Involve()", +"8382a574": "Factory(address,bytes32,address)", +"8382b460": "getSlashRewardPart(bytes32)", +"83835c01": "accuracy()", +"8383671b": "mintTokens1(address,uint256,uint256,bytes32)", +"8383bfc8": "EscrowFoundry()", +"83841e0c": "change(string,string)", +"838445e8": "EtherAds(address,address,address)", +"83852cf6": "setEnablePurchase(bool)", +"8385fa0f": "ESCROW_WALLET()", +"838661eb": "unfreeze_periods()", +"8386927a": "ToSponsor()", +"83876bc9": "newProposalInWei(address,uint256,string,bytes)", +"83879c15": "cooRemoveManager(address)", +"8387aa39": "addChainlinkExternalRequest(address,bytes32)", +"83894548": "getTokenBalanceOf(address)", +"838985d7": "gymFee()", +"8389f353": "setNumCities(uint256)", +"838a05e4": "part20Transfer()", +"838a48d6": "disableBlackListForever()", +"838bdce2": "team3Token()", +"838c29b6": "checkInterval()", +"838c63b7": "avgRate()", +"838ca346": "currentFunds()", +"838d6e05": "getChannelInfo(uint256,address,address)", +"838eb17e": "takeSnapshot(uint256,uint256)", +"838f0602": "SOLEToken(address,uint256)", +"838f5165": "refundFor(address[])", +"838f7f94": "getTotalAmountOf(uint256)", +"839006f2": "rescue(address)", +"8390b02a": "rfindPtr(uint256,uint256,uint256,uint256)", +"83914275": "getUserBonusBalanceByType(address,bytes1)", +"83917229": "_createGameItem(string,address,uint256,uint256)", +"8391a1c4": "get_table_size(uint256)", +"8391e45c": "dividendsOwing(address)", +"8391e48d": "WCoin(uint256,string,uint8,string)", +"83924dea": "MyTestToken(uint256,uint256,string,string)", +"83944a4b": "CreateWTE(address,uint256)", +"83947ea0": "acceptRelayedCall(address,address,bytes,uint256,uint256,uint256,uint256,bytes,uint256)", +"839484a7": "Iou_Token()", +"8394f639": "SimpleExchange(address,uint256)", +"83955bb2": "SpecialPurchased(address,uint256,uint256)", +"8395aa94": "PLATINUM_AMOUNT_SKL()", +"83960e3c": "importTokens(address,uint256,address)", +"8396392d": "add(string,string,string,address)", +"839655c8": "BetOnHardFork()", +"83973dc3": "withdrawBAT()", +"83975e7d": "PapaBearToken()", +"83979803": "setNewRateLevel(uint256,uint256)", +"8397a260": "getAction(bytes,uint256)", +"8397cc94": "tokenFallback(address,uint256,bytes32)", +"8397f3bc": "isBonusPayable(address,string,uint256,uint256,uint256,uint256)", +"839849c0": "changeBaseMultiplier(uint256)", +"83985082": "disarm()", +"83988ef5": "accountNoneFrozenAvailable(address)", +"839930ba": "getMinimumBet()", +"839972f9": "lockToken(address,uint256,uint256)", +"83999223": "release_all()", +"8399f93f": "reservedFund()", +"839a01be": "privateLockedAmount()", +"839acf14": "buyMonument(uint256,uint256)", +"839affc3": "batchDepositTokenTo(address[],address[],uint256[],uint256)", +"839b2386": "ReverseRegistrar()", +"839b240e": "setHardCapCrowdSale(uint256)", +"839b913e": "getTargetReportsPerLimitedReporterMarket()", +"839daf1d": "migrate2(address,uint40,uint40,address,address)", +"839dbbb1": "iconicsCount()", +"839df945": "commitments(bytes32)", +"839ea3c4": "startVotingTeam(uint256)", +"839ff719": "FML()", +"83a076be": "gift(uint256,address)", +"83a07765": "drawTicketCount()", +"83a18678": "total_racers()", +"83a1a3aa": "setC4FContractRequesterLock(address,bool)", +"83a1a4f2": "YesNo(string,string,string,string,string,string,bytes32,address,string,address,uint256)", +"83a1f52a": "GetManifestoByCategory(string,uint256,uint256)", +"83a287dd": "closeGame(bytes,address,uint256,uint256[],bytes,bytes)", +"83a37262": "stopQueueing(uint256)", +"83a41f93": "descentX()", +"83a4f2f5": "whitelistOperators(address)", +"83a51213": "takedaily(address)", +"83a51ad0": "oraclize_setConfig(bytes32)", +"83a6595f": "setMinDonation(uint256)", +"83a68993": "gameOp()", +"83a6ad6b": "grantAccessDeploy(address,address)", +"83a6b565": "payCommission(uint256,uint256)", +"83a74acc": "gift(uint256,uint256)", +"83a7b701": "masternodeRegister()", +"83a9094f": "PRICE_RATE_THIRD()", +"83aa4958": "getContributeAmount()", +"83aa9985": "ownerTwo()", +"83ab12e7": "Auctions()", +"83abd7e2": "removeIdentifier(address,bytes32)", +"83ac44e6": "marketingAccount()", +"83ac4ae1": "_sendWinnings()", +"83ac98fe": "transfer_Different_amounts_of_assets_to_many(address[],uint256[])", +"83ae0839": "ETNToken()", +"83ae5266": "addCertificate(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,string,bytes32[],bytes32[])", +"83ae62c4": "_frozeAmount()", +"83aec57c": "getUsersForDate(uint32)", +"83af3c40": "getRemainingTokenAmount()", +"83b01a83": "updateTAOContentState(bytes32,address,bytes32,uint8,bytes32,bytes32)", +"83b14c0a": "toAddr(uint256)", +"83b23b40": "cEthereumlotteryNet()", +"83b2c476": "updateLibrary(address)", +"83b2d77f": "signFact(bytes16)", +"83b3999a": "addToAddresses(address,address)", +"83b3c85f": "pecul()", +"83b40eb7": "creditEqually(address[],uint256)", +"83b47a4d": "whitelist_addys(address[],bool)", +"83b4918b": "reinvest(uint256)", +"83b49485": "BurnablePayment(bool,address,uint256,uint256,string,string)", +"83b572d1": "getPlayerStake(uint256)", +"83b58323": "setTransferFeePercentage(uint256)", +"83b5ff8b": "ownerCut()", +"83b60a33": "transferToken(uint8,address,uint256)", +"83b665b9": "purchase(uint152,uint256)", +"83b7db63": "getExtensions()", +"83b83c1c": "setOpGas(uint256,uint256)", +"83b8b9f0": "ForceCloseContract()", +"83b8c8f6": "bonusLevel100()", +"83b9e9f7": "train3(uint256)", +"83ba3a97": "sendTeamSupplyToken(address)", +"83baa6f4": "presaleopeningTime()", +"83bd5f42": "distributeDevCut(uint256)", +"83bd72ba": "stopGame()", +"83be9d54": "placeBet(bytes32,address)", +"83bebcc2": "changeSellPriceForAthlete(uint256,uint256)", +"83bebced": "_rate()", +"83bf1cbc": "delayDefaultRelease()", +"83bf4609": "createTemplate(string)", +"83c08784": "Incrementer3()", +"83c0dd25": "LogNewAllocation(address,uint256)", +"83c10844": "percentLeftFromTotalRaised()", +"83c17c55": "setFactoryAddress(address)", +"83c1f2e6": "unlb()", +"83c218c2": "oraclizeId2proposalId(bytes32)", +"83c28ddc": "getRefundAmountForFunder(address)", +"83c28ecc": "getTokenWithdrawHold()", +"83c3bd6b": "isEqualLength(address[],uint256[])", +"83c4c2e9": "makeSuccessor(address)", +"83c4cc46": "StartCrowdsale(address,address,uint256)", +"83c51a38": "thesimplegame()", +"83c56fc8": "dailyTotals()", +"83c592cf": "stake(uint256,bytes32)", +"83c5e3c9": "removeBRA(address)", +"83c68f48": "AIChain()", +"83c6aa47": "arrangeUnsoldTokens(address,uint256)", +"83c75ed5": "setGatewayB(address)", +"83c7d7c1": "sumMultiplayer()", +"83c7f14c": "bytesToBytes4(bytes)", +"83c81bec": "Arbiter(address)", +"83c99722": "lockforTransfer()", +"83ca8632": "_getCrabPartData(uint256)", +"83cb2fee": "INITIAL_SEED_FARMING_AMOUNT()", +"83ccc2b5": "_0xBitcoinCash()", +"83ccc8b8": "getEtherContributed()", +"83ccdcc3": "detailsOfWindow()", +"83cd5e13": "debug_multiplehash(uint256,uint256)", +"83cd9cc3": "setDelegator(address)", +"83cdb517": "transfer_to_0(uint256)", +"83ce63b5": "doRouletteBet(bytes,uint256,bytes32,bytes32,bytes32)", +"83ce8a61": "changeMPO(address)", +"83cfab42": "unFreeze(address)", +"83cfbd7f": "revokeOwnership(address)", +"83cfc5f2": "changeNameRestricted(string)", +"83d158f0": "ShadowToken()", +"83d2421b": "setWorkerPort(uint256)", +"83d4f946": "round0EndTime()", +"83d51a38": "concatString(string)", +"83d52f36": "OpenAIChainToken()", +"83d53895": "interfaceSupported(address,bytes4)", +"83d6236c": "amIin()", +"83d66353": "LotteryGames()", +"83d67039": "Register(string,string,string,uint256,uint256)", +"83d67fc1": "_addAddressToGrantAccess(address,uint256)", +"83d7529f": "reservationFromBackend(uint256,bytes32,address,uint256,uint256)", +"83d852d9": "shutdownTransactions()", +"83d880d0": "setParticipationCap(address[],uint256)", +"83d8a90f": "theDonkeyKing()", +"83d8bae3": "listItem(uint256,uint256,uint256,address)", +"83d8e480": "registerCoin(address,string,string)", +"83da4d86": "ApolloCoinToken(uint256,uint256,address,address)", +"83db0680": "TOTALSHARES()", +"83db1548": "addPost(uint256,uint256)", +"83db8e31": "HMCToken()", +"83dbb27b": "invalidOrder(address)", +"83dbc55b": "verifyXOR(bytes32,bytes32,uint8)", +"83dbff4b": "get_first_item_in_state(bytes32)", +"83dc077d": "acceptContribution()", +"83dcecd3": "CompanyTokensIssued(address,uint256,uint256)", +"83dd7aa4": "setBankName(bytes32)", +"83de6ed6": "changeStageTwo()", +"83dea2a8": "renounceExcluded()", +"83df762f": "BDayToken()", +"83df7d21": "updFreezeEnabled(bool)", +"83dfd040": "isPresaleFull()", +"83dfe5fd": "C()", +"83e03c3d": "HumanERC223Token(uint256,string,uint8,string)", +"83e06ead": "setPercentages(uint256,uint256,uint256,uint256,uint256)", +"83e07382": "setMovePermissionStat(bool)", +"83e19248": "afterStart()", +"83e19a95": "MANAGEMENT_LOCKED_PERIOD()", +"83e1bb4f": "dequeueIngot()", +"83e219eb": "removeFromTotalSupply(uint256)", +"83e256dc": "gameIdGame(uint256)", +"83e2a0c4": "joinGame(address,uint256,address)", +"83e3607c": "fourthBonusSalesEnds()", +"83e48d43": "_sptc(uint256,uint256,uint256,uint256,address)", +"83e49c53": "burnWithData(address,uint256,bytes)", +"83e4eed0": "apply(string,string)", +"83e5cb26": "ownerAddCeo(address)", +"83e78b31": "bet(uint8,bool,uint8)", +"83e7f347": "ICOBank()", +"83e811a6": "founderLockup()", +"83e83b54": "payBounty()", +"83e8dbb8": "calculateSaleAmount(uint256,uint256)", +"83e99a93": "balanceOfUnclaimedTT(address)", +"83ea0620": "packageExists(string)", +"83ea5111": "MESH(uint256)", +"83eb7257": "companySupply()", +"83eb72ac": "getStrandDescription(uint256)", +"83ec0648": "BlockStackCoin()", +"83ec0bd2": "showPeopleInQueue()", +"83eca581": "setReferrerReward(uint256)", +"83edf023": "totalWeiRecieved()", +"83eed3d5": "queryN(uint256,string,bytes)", +"83eeecc0": "ethInWei()", +"83ef0c23": "buyEgg(uint256,uint256,bool)", +"83f0b184": "calculateMaxContribution()", +"83f0bb45": "_getPartSkillLevel(bytes,uint256,uint256)", +"83f11daf": "SetCandidatePrincipal(uint8,uint256)", +"83f1211b": "transfersLocked()", +"83f12f91": "grantFounderTokens(address)", +"83f12fec": "batchTransfer(address[],uint256)", +"83f13e7f": "setNewDividendContract(address)", +"83f2a8ca": "dividendsCalculated()", +"83f3c3df": "PaymentGot(bool)", +"83f4a27b": "TATCOIN(uint256,string,string,uint256)", +"83f537cc": "LendingBlockToken(address)", +"83f57fd7": "_addDemoc(bytes32,address)", +"83f5a47e": "tokenOfOwnerAndCreatorByIndex(address,address,uint256)", +"83f5b46f": "refSystem()", +"83f5e360": "_unpackClassValue(uint256)", +"83f66212": "getTop11_20Messages()", +"83f6cc69": "transferAllowedOf(address)", +"83f6d9a4": "validateNameInternal(string)", +"83f7a095": "setCoefficient(bytes2,string,uint256)", +"83f7b8e1": "getNumberOfPhotos()", +"83f7e2d7": "reduce(uint256)", +"83f94db7": "upgradeImplementation(address)", +"83f95f13": "openClaim(string)", +"83f9a788": "BlockTubePrepaid(address)", +"83fa07fd": "fechAllCandidates(uint256)", +"83fa2039": "Dealer(address,address)", +"83fa7e02": "isSiringClockAuctionStorage()", +"83fa87f2": "activateAdSlot()", +"83fae425": "setPresaleAllocation(address,uint256)", +"83fb42ba": "proposeBurning(uint256)", +"83fbbc7a": "OnlineSocialChainToken(uint256,string,uint8,string)", +"83fbc2b4": "weiRised()", +"83fc58b4": "tranferOwnership(address)", +"83fcafbb": "GetPrizeFund()", +"83fcb85e": "revertFunction()", +"83fcf308": "getPropertyRating()", +"83fcf973": "unlockVestedTokens()", +"83fcfafe": "LooqCrowdsale()", +"83fd65d8": "setETHExpectedFee(address,uint256,uint256)", +"83fd8a64": "CBCK(uint256,string,string)", +"83fe05f1": "PutFreeEther()", +"83fe10e4": "isMetered()", +"83fee16d": "finalizeUpdate(uint256,address)", +"83ff0189": "buy_tickey_free()", +"83ff1bb6": "approve(string,uint8)", +"83ff5bf2": "Bittobit()", +"83ff9bec": "petCardDataContract()", +"8400c307": "isRecipientAllowed(address)", +"8401824f": "compactFraction(uint256,uint256,uint256)", +"84019cae": "WOWToken()", +"8401e614": "lengthOfPermissions()", +"8401f8d1": "addMultipleToWhitelist(address[])", +"8402181f": "pull(address,uint128)", +"8402ac99": "firstYearEnd()", +"84035e07": "amendEarlyPurchase(uint256,address,uint256,uint256)", +"8403be91": "isAppRegistered(address)", +"84048497": "listMultipleItems(uint256[],uint256[],address,bytes32[])", +"84054d3d": "cashout()", +"8406ab82": "deleteGame(address)", +"8406c079": "relayer()", +"84073164": "transferFromPie(uint256)", +"84083c89": "addWhitelistUser(address)", +"84086357": "crowdfundFinalized()", +"8408643a": "getBlockTimestamp32()", +"840880f2": "TeamLockingPeriod18Months()", +"8408cb9d": "setPreICOPrice(uint256)", +"840aab14": "_hasName(address)", +"840b7403": "computePayout(uint256,uint256)", +"840bc19c": "NON_PAYABLE_AMOUNT()", +"840c0ca9": "setMaximumClaimPriceWei(uint256)", +"840c401f": "pruneRestrictStock(address,uint256)", +"840cfffd": "burnIndexedByAddress(address,uint256)", +"840d7fb6": "createLottery(address,string,string,uint32,uint32,uint8)", +"840dea74": "COMBINED_WEI_GOAL()", +"840e2673": "startTransferTime()", +"840e78fd": "projects(address)", +"840eb43e": "removeLicenseTerms(bytes32,bytes32)", +"84100d5c": "selectRandomTrait()", +"841016d0": "setAdditionalOwners(address[])", +"8410956a": "initialise(address,uint256,uint256,uint256,uint256,uint256)", +"84109e50": "setTiimKyberGoAddress(address)", +"84120645": "setMasterRewardsPercent(uint256)", +"841237b7": "Wallet9()", +"841244a8": "FeedCreated(uint256,string)", +"84125e0b": "withdrawBalancesToNFC()", +"84126e01": "cancelPayment(string)", +"841302ce": "getHash1(uint8[5],uint8,bytes32)", +"84132cf5": "deposit(address,uint8,bytes32,bytes32)", +"84140c40": "delFromVestMap(address)", +"841410cd": "maxETHContribution()", +"84160ec0": "getAddressesAccounts()", +"84168c01": "tradesUnlock(address)", +"8417fa2f": "goPublic()", +"8418cd99": "contribute(address,uint256)", +"8418dc36": "teFoodsAddress()", +"84191f62": "changeController()", +"8419604e": "SendingBounty(bytes32,uint256,address)", +"8419c986": "foundTime()", +"841a12bd": "setKittyTokenAddress(address,address)", +"841b4cd8": "registerForRaffle3()", +"841baf2c": "m_tokensClaimed(address)", +"841d0ac3": "init_daylimit(uint256)", +"841e6ce9": "betFee()", +"841eb7f8": "paymentRewardTokens(uint256)", +"841efac4": "updateFieldss(uint256,uint8,uint256)", +"841f3729": "howManyTokensAreReservedForMe()", +"84219204": "minVotedTokensPerc()", +"8421ec8a": "MyCash()", +"842249cb": "weiTotalReceived()", +"8422927d": "cancelPayment(uint256)", +"8422b3bf": "RailzToken()", +"8423157b": "getWinAmount(uint256,uint256)", +"84248a51": "changeDrawFee(uint256)", +"84249ed0": "manualBuyPrice(uint256)", +"8424b40d": "setLotteryCore(address)", +"8424f952": "IMEIM()", +"84268051": "payoutToOwnerIsLimited()", +"84269ed9": "transferFrom(address,address,uint32)", +"8426a452": "getSellingItem(uint256)", +"84270db0": "selfdestructTokens()", +"84281dcc": "isBalanceSufficientForContractCreation(address)", +"8428cf83": "recoverAddress(bytes32,uint8,bytes32,bytes32)", +"84297029": "getIdxBatchByUsername(bytes20[])", +"84298882": "setLogo(uint256,string)", +"842a6415": "DTRC()", +"842acf9d": "mintDSBIToken(address,uint256)", +"842b6357": "checked_in()", +"842b8efa": "FailedMarking(bytes32,bytes32,uint256,int256)", +"842bc37b": "GetSmallCotractIndex(address)", +"842bd2db": "getDeduction(uint256,uint8,address)", +"842bfad2": "updateParticipantCapTier2(uint256)", +"842c17be": "firstStageMinted()", +"842c45c5": "ROBIES()", +"842e062f": "p_setCurrentRoundJackpotPercent(uint256,uint256)", +"842f10d1": "dropMultiple(address[])", +"842ff2bd": "numPolls()", +"84300859": "setTokenUnlock()", +"84304ee5": "chronus()", +"84311353": "totalAmountOfPurchasesInCny()", +"84313086": "divCutMaster()", +"84317008": "setprice(uint256,uint256)", +"84317143": "INITIAL_EARLYBIRD_TOKENS()", +"84321b41": "ligerAdminAddress()", +"843296d6": "DealCancelationReason(uint256,address,uint32,uint32,uint256,string)", +"8433acd1": "collectTokens()", +"8433d6f2": "from_Initialisation_to_cycleDeVie()", +"84344415": "chargeMoney()", +"84345b35": "createRandomZombie_ZOB_goldpack()", +"8434c80d": "cleanArray(uint256[])", +"843545be": "getPrinciple(uint256)", +"843584f1": "log_recast_fees(address,address,uint256)", +"8435be4b": "getLastFarm(uint8,uint8)", +"8435da61": "getTile(uint16,uint16,uint8)", +"8435f147": "bytes32Func(bytes32,bytes32)", +"8436bd4e": "MintyMcCringleToken()", +"84370813": "subscribe(uint256,uint256)", +"8437b2a5": "tier(uint256,uint256)", +"84385c6f": "assignOperator(address)", +"84386004": "channelsSold()", +"84394e6f": "addValidation()", +"8439ec4a": "setBlacklistBulk(address[],bool,bool)", +"8439f80d": "accumulatedBalanceOf(uint256)", +"843a7f74": "getCKNPriceNow()", +"843aa0db": "insert(uint256,uint256,uint256,uint256)", +"843ad7b5": "dailyMintable()", +"843b1a09": "spendNonce()", +"843b4386": "addComment(string)", +"843bd641": "itemExists(uint256)", +"843cbae4": "EtherBattleCoin()", +"843cfb9e": "vestingTotalPeriods()", +"843e240e": "getAuditContractUri(uint256)", +"843e8d27": "downVote(bytes12,bytes12)", +"843fcf90": "EOSGold()", +"843ff6f6": "getTitulaire_Compte_7()", +"8440b3b0": "BUY_INCREASE()", +"8440d167": "getCategory(address)", +"84413b65": "airdropAddress()", +"8441f89e": "deleteWitness(address)", +"8442171d": "bonusLimit2()", +"84429480": "TokensBought(address,uint256,uint256)", +"84429579": "getRunningTokenPairs(address[])", +"844323fa": "xtime()", +"8443f07c": "UVIDIFYTOKEN()", +"8444b391": "getUpgradeState()", +"84465fa5": "changeFeeOwner(address)", +"844669b3": "accountC()", +"844706a6": "UsdCapUpdated(uint256,uint256)", +"84477036": "tempTokensBalanceOf()", +"8447c02f": "takeAGuess(uint256)", +"8447c4fa": "LibraToken()", +"84488126": "isForceExecute(address)", +"844891a0": "ABTCETHER()", +"8449129e": "EthereumNova()", +"8449133b": "initQuoteBalance()", +"84491566": "getPrevRoundWinnerCount()", +"8449b0af": "PRICE_MULTIPLIER_ICO5()", +"8449d772": "withdrawM5()", +"844bdea4": "LhsToken(uint256,string,uint8,string)", +"844c3edc": "setThresholdSendToSafeWallet(uint256)", +"844c4264": "cycleEndTime()", +"844c7d95": "updateBalances(address,bytes32,string,address,uint256)", +"844d38ee": "view_get_Gains()", +"844d65c5": "whitelistedMax(address)", +"844dbf67": "RecurringPayment(address,uint256,uint256,address)", +"844e774d": "joinraffle()", +"844e89a9": "Unregistered(bytes32,uint256)", +"844ea6f9": "E25()", +"844ef097": "bridgeValidatorsOwner()", +"845051d3": "testContractsNotNull()", +"8450b12e": "getSupplyLimit(uint16)", +"8451738d": "rentHo(uint256)", +"8451d312": "showAllFunds()", +"845238fe": "lookup(address[],address,address,bool,bool)", +"84533794": "setEthRate(uint16)", +"845381c0": "FailedVote(address,string)", +"84539789": "useNeonMarbles(address)", +"8453a8c8": "Factom()", +"84545ef8": "setRegionPurchasedPixelPrice(uint256,uint256)", +"8454665d": "startingInsuranceBalance()", +"84553e16": "AccessAddress(address)", +"84564676": "tokenSetAdmin(address,address,address,address)", +"8456cb59": "pause()", +"84570d0d": "assertEq5(bytes5,bytes5)", +"84571235": "minimum_bet()", +"84585099": "TransferTo(address,uint256)", +"8458644c": "play(bytes32,address,address)", +"845890c3": "buyATR()", +"8458bd70": "getHp(uint256)", +"8459857f": "mentors()", +"845a51ec": "rewardPoolAddress()", +"845a7468": "getStakersAndAmounts()", +"845ab425": "getProjectDescription(uint256)", +"845b6aca": "buyBasicCards_Migrate(address,uint256,uint256)", +"845c8801": "checkHasPermissionForPack(address,address,uint256)", +"845c9306": "participate(uint256)", +"845d586f": "publicTransfersEnabled()", +"845dcc2b": "_isSoldOut()", +"845e76b3": "getStudentArray(bytes32)", +"845eaedb": "SmartVows(string,address,address,string,address,address,string,string,string,string,string,bytes,bytes)", +"845ec8de": "FOUNDER_EXCHANGE_SHARE()", +"845f5593": "initStages(uint32[],uint32[],uint128[],uint128[],uint128[],bool[])", +"846030a0": "hasClaimableShares()", +"84605d0d": "total_iou_withdrawn()", +"8460a9d9": "suicideSend(address)", +"84610618": "registerRequest(int256,int256)", +"846153b5": "registerAddresses(address[])", +"8462151c": "tokensOfOwner(address)", +"84622425": "onlyPrimaryMock()", +"8462df7f": "diff(uint256[],uint256)", +"8463bcf5": "countClients()", +"84644ec9": "addPromise(uint256)", +"8464878d": "emergency_used()", +"84653605": "DateCoin(uint256)", +"84658e2a": "sendtoken(address,uint256,address,uint256,address,uint256,address,uint256,address,uint256,address,uint256)", +"846639dc": "currentAwards()", +"8466c3e6": "aa()", +"846786f1": "openIco()", +"8467d9cf": "refundPayment(uint256,uint32,uint32,uint256,string)", +"8467f7cb": "resetContract(uint256)", +"84680fc2": "autoSelectOpponentForGladiatorBattle(uint256,bytes32)", +"84682fbb": "auxWorstPoints()", +"84691cd8": "grapesToProduceBottle()", +"84696810": "winningCountry()", +"846a09e1": "AddAuthorityAddress(address)", +"846a284e": "_addTicket(address,uint32,uint8)", +"846a5dde": "delayPayment(uint256,uint256)", +"846b055a": "startCrowdfund(uint256,uint256)", +"846b0ef0": "proxiedContribution(address)", +"846b23d4": "getEmployerInvoicesByStatus(address,address,uint8)", +"846b68e3": "MERCULET()", +"846e5851": "LogStudentUncertified(address,uint256,address)", +"846e832d": "getStateAt(uint256)", +"846e980d": "setFreeLobster(uint16)", +"846f1185": "sendEthProportion(address,bytes,uint256,uint256)", +"846f652b": "getSpawned(uint32)", +"8470ffd6": "_transfert(address,address,uint256)", +"84716854": "investInCharger(uint256)", +"84734476": "copyBytes(bytes,uint256,uint256,bytes,uint256)", +"8473e55f": "amountForSale()", +"8475bfed": "div18(uint256,uint256)", +"8475f6f9": "getPublicKeyG()", +"8476f105": "Menu08(uint256)", +"847760ee": "getArtToken(uint256)", +"847778ad": "edit(address,address)", +"84780009": "getFinishStatus()", +"84788f01": "mvnperethBonus()", +"847927ed": "icoEtherMaxCap()", +"847a1ca6": "raiseSellOrderCreated(address,uint32,uint32,uint80,uint256,int160)", +"847a5e99": "getPlayerStats()", +"847af92c": "setMintMode(uint256)", +"847bd61c": "processPurchase(uint256[])", +"847c096d": "removePresaleContributor(address)", +"847d97ab": "add(string,address,string,uint256)", +"847dc0a7": "percentageETHReserve()", +"847dc59e": "MicoinToken(uint256,string,string)", +"847dd67c": "buyEth(uint256)", +"847e09f2": "TOKEN_HARDCAP()", +"847e12c4": "FixyNetwork()", +"847e27d9": "wanToken()", +"847e2ba1": "revokeAccessMint(address)", +"847ec2de": "totalBunny()", +"847eefb6": "ICOHardcap()", +"847f2177": "Electron()", +"847f4a88": "stopSaleType(uint8)", +"847f8a10": "Refund(uint32)", +"8480021c": "crowdfundDeadline()", +"8480544e": "getCAOAmount()", +"848125ea": "issueBlockReward()", +"8481573e": "contractBalanceOf(address)", +"8482167e": "makeCall(address,uint256,bytes)", +"84837981": "BTCT()", +"8483dfcc": "isOverflow(uint256,uint256)", +"84841523": "Buttcoin()", +"8484dc24": "removeEmissionProvider(address,uint256)", +"8484ff59": "setTokenCollectable(bool)", +"8485b90c": "proposalAuthor()", +"84861e93": "auctionState(uint256)", +"84869679": "isDistributionDue(address)", +"8486d444": "_getUsdAmount(uint256)", +"848784e5": "transferPreSigned(bytes,address,uint256,uint256,uint256,uint256)", +"8487b73a": "Milestone_BankLicenseFailed(string)", +"84883795": "ico_rejected()", +"84885ed6": "getData_19()", +"8488e58a": "setReturnableToken(address)", +"848a0327": "dividendForYearly()", +"848a2130": "releaseChecksum(uint8)", +"848b3821": "fundingCapReached()", +"848b86e3": "updateWallet(address)", +"848c0a39": "buildLeft(address,uint256)", +"848dd14e": "CostStuff(address,uint32,uint256)", +"848e3442": "automaticThreshold()", +"848efb3d": "rentOut(uint256)", +"848f002f": "setBoolF1F2(bool,bool)", +"848f1470": "disableRefundPeriod()", +"848f6d8d": "OneBroGlobal()", +"848faed7": "BAI20()", +"84900b04": "whitelistContract()", +"8490d598": "wholeTokensReserved()", +"8491b49c": "rain(address[],uint256[])", +"84922374": "isDistConfig()", +"84924b60": "findAndPayTheWinner()", +"849292bc": "emitStateContractChanged(address)", +"8492aa9c": "getAddressNickname(address)", +"8493407b": "CorporateNews(uint256,string,uint8,string)", +"84934e40": "DappUpgraded(address,address,address)", +"8493a06e": "returnLongTokenAmount(address[3],bytes32,uint256)", +"84941984": "_removeTokenFromPartition(address,bytes32,uint256)", +"8497a8d8": "ESCToken()", +"84987faa": "getNodeRightChild(bytes32)", +"8498f706": "EthPalace()", +"84995370": "TheFoolRareToken()", +"8499bc63": "GeneBlockChainUserIDs(address)", +"8499ee3a": "newToken(string,uint8,string)", +"849a7337": "approveBountyTransfer(address,address)", +"849a7cb7": "convertBytes4ToArray(bytes4)", +"849aaf8e": "minimumValue()", +"849ab974": "HasOwner(address)", +"849ae5ea": "isBlockpassInvestor(address)", +"849bb2db": "withdrawServiceFee()", +"849cf588": "addSynth(address)", +"849d0d24": "TVCrowdsaleContract()", +"849d16d2": "BffDoomToken()", +"849d926b": "parseBlockHeader(bytes)", +"849e3dcd": "SangusToken()", +"849e6b17": "MakeBuyOrder(bytes32,address,uint256,uint256,address)", +"849e961a": "ICO_PRE_SALE()", +"849f94bf": "getMatchIndex(uint8)", +"84a014d8": "oneTimeSold(address)", +"84a0f604": "transferMultipleDifferentValues(uint256[],address[])", +"84a11df9": "ismaster()", +"84a1f5a5": "claimTokensFor(address[])", +"84a2f00b": "order(bytes32,uint256,uint256)", +"84a2f5a4": "MoonDust()", +"84a34caa": "BaseMPHToken()", +"84a37273": "addTransaction(address,uint256)", +"84a429a0": "createDklSiringAuction(uint256,uint256)", +"84a438de": "Course(string,string,uint256)", +"84a4974c": "MintAndTransferEXH(address,uint256,bytes32)", +"84a6469a": "setNewMintRequest(address,uint256)", +"84a64c12": "cancel1(uint256)", +"84a68690": "withdrawRequest(uint256,uint256,uint256,uint256)", +"84a6a68a": "releaseTeams(uint32,uint32[])", +"84a7b223": "Canary(address)", +"84a80c6b": "getB0()", +"84a83662": "changePassword(string,string)", +"84a97ab7": "removeAddressFromAccount(address,address)", +"84a9b91c": "capWEI()", +"84a9d711": "assertThrows(string)", +"84ab2cdb": "byte_to_bits(bytes1,uint256)", +"84ac33ec": "deregister(address)", +"84acdae7": "getAuctionStartBid()", +"84ad6ff3": "ReversibleDemo()", +"84ad8e8f": "discountPrice()", +"84aeb4f0": "getTokenContribution(address)", +"84afaa7c": "getReceiptAmount(uint256)", +"84afb526": "marketor()", +"84afd121": "bytesToUint2(bytes)", +"84b00eb6": "fetchVoteNumForCandidateByIndex(uint256,address)", +"84b06191": "CampaignAccount(address,uint256)", +"84b08d41": "partner2_signed()", +"84b0e001": "setEventResult(string,uint32,uint8)", +"84b1fcb6": "TokenOwnedFund()", +"84b2e59d": "lower(string)", +"84b35fbb": "proposeFoundationTransfer(address)", +"84b366dc": "dest()", +"84b3b232": "depositofferToken()", +"84b4340b": "failWithReason(string)", +"84b46829": "San4Contract()", +"84b4d3f6": "determineGoalScoringCardIds(uint256[],uint256[],uint256)", +"84b60937": "getRollUnder(uint256,uint256)", +"84b735c2": "address1a()", +"84b76824": "cancelWithdraw()", +"84b7964f": "isClient(address)", +"84b79b3d": "eosBASE(uint256,uint256)", +"84b83a96": "finishChampionGame()", +"84b8d6a5": "Airdrop(address)", +"84b98987": "getPrice(address,string,string,string)", +"84b9a4a5": "SALE_STEP()", +"84ba2642": "mint(address,uint256,address,string)", +"84ba745e": "totalClass()", +"84bc8d2e": "read_purchase_at_index(uint256)", +"84bcd93e": "setSealableProperty(uint256,bytes32,bytes32)", +"84bcefd4": "collected()", +"84bd3a28": "TierRainmakerDividendAddress(address)", +"84bdaf85": "centsInPhaseOne()", +"84be4079": "Lendr(string,string,address)", +"84be414d": "KryptopyCrowdsaleMock(address)", +"84be59d1": "giftPool()", +"84beac36": "KRCToken(address)", +"84bf6fac": "mEtherValid()", +"84c019e3": "noBonusTokenRecipients()", +"84c14b25": "sellDentacoinsAgainstEther(uint256)", +"84c2473f": "mainIcoEndBlock()", +"84c344fe": "_register(bytes4,string)", +"84c3edf9": "getHoldAmountAccounts()", +"84c4ee9e": "getHivePot()", +"84c5c34d": "transferFromToICAPWithReference(address,string,uint256,string)", +"84c615e2": "giveKingdom(address,string,string,uint256)", +"84c64a19": "setApp(address,address)", +"84c6774c": "safeMathMul(uint256,uint256)", +"84c6a9fe": "setFABAcompanyTokensPercent(uint256)", +"84c6f650": "PAYOUT_TIME()", +"84c7bf4c": "setBlocking(address,address,bool)", +"84c830d3": "getDepositByIndex(address,uint256)", +"84c8d5fa": "xenograft(uint256,uint256,uint256)", +"84c8df88": "testMemoryIntegrityCheck31Bytes()", +"84c99b6d": "tokenIssuedAirDrop()", +"84ca65e0": "addOperationType(string,string)", +"84cb4fec": "_getBlocksPerYear(uint256)", +"84cba6da": "registerUsers(address[],uint256[])", +"84cbc92f": "buyPotato(uint256)", +"84cc315b": "getCurrentPrice(address)", +"84cdbb4b": "relaseLock()", +"84ce8f1e": "getTotalF3()", +"84cfa08c": "startKilling()", +"84cfc5aa": "WABnetwork(uint256,string,string)", +"84cfca00": "setMaxPlayers(uint8)", +"84d062b4": "updateEthToTokenOrder(uint32,uint128,uint128)", +"84d0aad8": "loadOldData()", +"84d24226": "claimableTokens(address)", +"84d2688c": "getDarknodePublicKey(address)", +"84d2731c": "namesOf(address)", +"84d43f66": "setAffiliateSetter(address)", +"84d452ff": "resetRound()", +"84d46860": "getMyStageBet(uint256,uint256,uint256)", +"84d47dee": "DayDayCrowdsale(uint256,address,address)", +"84d4c178": "_escrowInflationBonus(bytes32,uint256,uint256,address,address,bool)", +"84d5d944": "transferAndLock(address,uint256,uint256)", +"84d60043": "CioCoinERC20180629Token(uint256,string,string,uint256)", +"84d61a32": "showFPInterest()", +"84d62f47": "bindSmartIdentityByRegulator(string,string,string)", +"84d6bd43": "requiredEvidence()", +"84d7c99d": "deleteUInt8Value(bytes32)", +"84d7ea12": "setMilestonesContractAddress(address)", +"84d80057": "hasDeadlinePassed(bytes32)", +"84d83f07": "GetLoanIdFromPortfolio(uint256,uint256)", +"84d8529f": "refundInternal(bytes32,address,address,uint256)", +"84d9390a": "TEAM_PERCENTAGE()", +"84d9bee2": "bidCC(uint256,bytes32)", +"84da7e38": "setColorRed()", +"84da92a7": "updateName(string)", +"84dac46e": "Fucksign()", +"84db71a3": "getRefereeRewards()", +"84db8d1e": "_nextPotTax(uint256)", +"84dc1028": "getBonustwo(uint256)", +"84dc2b10": "_saveData(address,bytes32,address,bytes32,uint256)", +"84dcde97": "removeSynth(bytes4)", +"84dd4332": "lastCallPUST()", +"84dd9591": "getTotalHoldAmount(address)", +"84df87c3": "SPITEST()", +"84dfb2bd": "setETHAddress(address)", +"84dfbfe2": "setLpFee(uint256)", +"84e0b689": "_yearThreeSupply()", +"84e10a90": "getTotals()", +"84e11251": "setMinInvestmentLimit(uint256)", +"84e192a7": "getArbiterCandidates()", +"84e1bf74": "emissionOn()", +"84e2341d": "internalSetDestinationMultisigWallet(address)", +"84e2d578": "OperationAddress()", +"84e336fc": "ANUNYA()", +"84e37ad9": "prefixedHash(uint256)", +"84e3ac94": "oneTokenInWei()", +"84e45689": "authorize(address[])", +"84e4c52b": "getTimeLockSecondsRemaining(uint256)", +"84e4d3a8": "freezeAccount(address,bool,uint256,uint256)", +"84e4d57f": "ApplyForCertification(string,string,string,uint256)", +"84e527ad": "IMDESale(uint256,uint128,uint256,uint256,uint128,string)", +"84e60e8b": "ico_promo_reward(address,uint256)", +"84e64a1f": "stageStartDate(uint8)", +"84e67523": "getSumAmountOfOpenSteps()", +"84e6ee4b": "setMainnetAccount(string)", +"84e70093": "cloneOrder(address,uint256,uint256,uint256)", +"84e700ee": "totalAllocatedPurchase()", +"84e7686b": "setAdmin(address[],bool)", +"84e77095": "GetEvidence(bytes32)", +"84e77da2": "updateKryptoroToken(address)", +"84e79842": "addAgent(address)", +"84e7e3d3": "MINT_INTERVAL()", +"84e83ee2": "SparksterToken()", +"84e84506": "onContribution(address,uint256,uint256,uint256)", +"84e85974": "YGO()", +"84e8a7df": "_soldOutside()", +"84e8b36e": "GetAskingTokenDecimal()", +"84e8bff9": "burnaftersale(uint256)", +"84e9ec37": "bonusTokenRateLevelFour()", +"84ea2e31": "GetDOTNumRevokableHashes(bytes32)", +"84eb11ce": "DoggyToken()", +"84eba00c": "tokenholder()", +"84ebd065": "NunesTestCoin()", +"84ebde52": "Under_the_Hood()", +"84ec480c": "marketToken2020()", +"84ecdaf6": "advanceState()", +"84ececf2": "userCreateSaleIfApproved(uint256,uint256,uint256,uint256)", +"84ed49a7": "isPoweruser(address)", +"84ef0778": "tokensIssuedTotal()", +"84efe4d6": "backSkinCoinOwner()", +"84eff1d0": "walunlock()", +"84f06570": "createAllTokens()", +"84f08cd9": "TokenContract(address)", +"84f0bb96": "NMRToken()", +"84f10c35": "testTransferCreator()", +"84f19f37": "createVoting(bytes32)", +"84f1b0b8": "__flooredLog10__(uint256)", +"84f1bd4e": "fpart(int128)", +"84f1cdb7": "intFunc(int256,int256)", +"84f32395": "setAssetToExpire(uint256)", +"84f3597b": "availableRefunds()", +"84f54874": "startWeekThree()", +"84f85951": "founderWithdraw()", +"84f88cbf": "TonToken()", +"84f94221": "getRoot(bytes32)", +"84f9c928": "get_signature_block(address,address,bytes32)", +"84fa2c97": "totalCentsCollected()", +"84fae760": "hello(address)", +"84fb24a5": "_addCourse(uint256,string,uint16,uint16,string,string)", +"84fb427c": "_transferHolder(address,bool,uint256)", +"84fc8050": "nugget(uint256)", +"84fd176b": "bonusPhaseTwoDeadline()", +"84fd5477": "isAuthorizedAccount(address)", +"84fd7ef0": "TOKEN_FOUNDATION_CAP()", +"84fdab0d": "pickConsolationPrize(uint256[])", +"84fde1c6": "calculateScorersForTeamIds(uint256,uint256)", +"84fdec83": "ownerCanWithdraw()", +"84fe5029": "weiCap()", +"84feab93": "Emit_OffchainPaymentFlag(address,address,bool,bool)", +"84feed25": "VoxelX()", +"84ff2e45": "coreTeamTokenSupply()", +"84ff435f": "UpdateUserNickName(address,bytes32)", +"84ffc422": "BountiesTokensHolder(address,address,address)", +"84ffcb5d": "setContractsMiniGame(address)", +"85000a86": "TitleUpdated(uint256,uint256,string,string,string,uint256)", +"85002354": "ZillowBlockchain(uint256,uint256)", +"85003d30": "CollateralTransferCanceled(uint256)", +"85007e54": "Zakat()", +"8500d919": "getBorrower(uint256)", +"85011eec": "Movie(string,string,uint256)", +"8502293b": "newCs(address)", +"85025396": "setProviderClientsCount(uint256,uint256)", +"8502935a": "maxInflationRate()", +"850382c8": "prova3(uint256[])", +"8503a6bf": "ERC721TokenMock()", +"8503b6a5": "addProposal(address,uint256,address,string,uint256)", +"850595c1": "contributorID(uint256,address)", +"8505a074": "ClassyCoin()", +"85071d9c": "SCARABToken1()", +"8507bee8": "joinedCrowdsalesLenMax()", +"850895dc": "CheckValidDate(uint8,uint8,uint16)", +"8508a693": "doTeamMinting()", +"8508d88f": "sendICOSupplyToken(address,uint256)", +"85093668": "jackpotBank()", +"8509a001": "rewardDenominator()", +"850a1532": "voteSnapshotBalance(address,uint256)", +"850a2e78": "setResults(address,uint256,uint256[2])", +"850a4621": "emitActiveChanged(bool)", +"850a7eca": "endTimeLockedTokensAdvisor()", +"850c1a0c": "earlyResolveA()", +"850c362a": "initCard1()", +"850d8a14": "CryptolottoToken()", +"850d9afb": "ENDTIME()", +"850db35d": "didPayInterest(bytes32,address,address,address,uint256,bool,uint256)", +"850e141a": "updateYearsSinceRelease()", +"850e2bc4": "setLLV_edit_22(string)", +"850e3760": "getShine(uint16)", +"850e47db": "KudoCoin()", +"850f2e2c": "findTileByAddress(uint16,uint16,address,address)", +"850fb62d": "transferProcess(address,address,uint256)", +"85107367": "stakeAddress()", +"8510b43f": "isSaleRunning()", +"85113156": "etherERC20()", +"8511b843": "addSpaceshipMoney(uint256,uint256,uint256)", +"85138313": "PureAirToken(uint256,string,uint8,string)", +"8513c619": "addManager(address,address)", +"8513db86": "test_threeValidAndInvalidEqAddress()", +"851545de": "transformAgent()", +"8515e413": "payUserOutgoingTransactionCommission()", +"851645e6": "getRandomUint(uint256)", +"85174a31": "transferToSelf(uint256,bytes)", +"85177f28": "EthReceived(address,uint256)", +"8518b0ad": "scheme()", +"851a33e9": "getBylawsMilestoneMinPostponing()", +"851a61d7": "Dist(address,uint256,address)", +"851ad4d6": "getNumDragons()", +"851aea7a": "setUser(string,string,string,bytes32)", +"851b6ef2": "getAllVotes()", +"851bb3c3": "bonusEnds15()", +"851c0cf6": "bltMaster()", +"851c27de": "earlyStageSetting()", +"851c4414": "getEvabotContractAddress()", +"851c5bf6": "addVestTokenAllocation(address,uint256)", +"851c9d11": "DGB()", +"851cad90": "THOUSAND()", +"851cc7f9": "coinMultiplayer()", +"851d1c27": "_transferFrom(address,address,address,uint256)", +"851d46f3": "internalCheck()", +"851e6b3a": "buy100Price()", +"851ee3e2": "ApproveERC20()", +"851f9e20": "chargeOff(address)", +"85203aa2": "lengthNotEqual(uint256[],uint256,string)", +"85209ee0": "contractState()", +"85216449": "checkCustodian()", +"8521b59c": "addDataPoint(int256,uint256,bytes32)", +"852263aa": "LogThresholdChange(address,uint256)", +"8522ac8c": "testTransferOwnership()", +"85233869": "NumberOfMiners()", +"8523930a": "calculateNoOfTokensToSend()", +"85252e82": "setTransferFee(address,uint256)", +"85255ab0": "Nero()", +"8526492f": "getTokensAmount(uint256)", +"85265ee6": "press_address()", +"8526d092": "isValidContributorAddress(address)", +"85271fa1": "_validateUSDAmount(uint256)", +"85276721": "DevReward(address,uint256)", +"8527831b": "getIndex(bytes32)", +"8527c3b0": "changePriceRandomFight2Death(uint256)", +"8528b7b0": "WILDToken()", +"852980a0": "addCourses(string,string,string,string,string,string)", +"852987f3": "getRecoverSigner(uint40,uint256,uint8,bytes32,bytes32)", +"8529d576": "toUint(bytes)", +"852a12e3": "redeemUnderlying(uint256)", +"852a6bd4": "getBalanceOfPlayer(address)", +"852a7d6c": "setExtraDistribution(address,uint256)", +"852ada4b": "nonFungibleOfOwnerByIndex(uint256,address,uint128)", +"852b6121": "setInitialBlockTimestamp(uint256)", +"852c061a": "axiesPrice(uint256,uint256,uint256)", +"852c5662": "adjustFlame(uint256)", +"852ccf2b": "YIYSToken(address,uint256)", +"852da11d": "tokenCreationCapPreICO()", +"852dbfc6": "pickURL()", +"852dc589": "setQuitLock(address)", +"852dce8d": "changeOraclizeGasLimit(uint256)", +"852e9f46": "transferAndFreeze(address,uint256,uint256)", +"852ede8d": "removeToken(string,int256)", +"852f31c6": "teamStageSetting()", +"852f6662": "isProgramFactoryContract()", +"852f8b74": "getBookSigner(bytes16)", +"85307bef": "TronToken(address)", +"85318217": "RegisterMine(string,uint256,uint256)", +"8531bb56": "SaleHasEnded()", +"8532137c": "Lexzoom()", +"853255cc": "sum()", +"853262a2": "tgrSettingsPartContributorIncreasePerStage()", +"85349e01": "totalDeveloperCut_()", +"8534b3a8": "setParticipateFee(uint256)", +"853504f3": "OpenToken()", +"8535490f": "redeemEther(uint256)", +"853552d7": "_slotAddNew(address)", +"8535d2ec": "sendBatch(address[],uint256[])", +"8536a50e": "_setBurnFeeProp(uint256)", +"8536bf8f": "BuyIPG()", +"85370965": "distributeVault(uint256,uint256,uint256,uint256,uint256)", +"853717bb": "calcBurnAmount(uint256)", +"85378346": "getChancePowerWithBonus(address)", +"853828b6": "withdrawAll()", +"853a4ec2": "grantReserveToken(address)", +"853a9d32": "EGGS_TO_HATCH_1HIPSTER()", +"853b59d7": "phase_1_token_price()", +"853d814e": "MyFairToken()", +"853df275": "duel(address)", +"853e88fe": "hashVM()", +"853f636b": "sendAllTokensToFounder(uint256)", +"853f7e98": "BDLToken()", +"85423912": "setDiscipleItem(uint256,uint256)", +"854254e8": "buildLoanOrderStruct(bytes32,address[6],uint256[9])", +"85431ec8": "setRate333()", +"85439f82": "someFunction4()", +"8544023a": "nokuMasterToken()", +"85443a2b": "CampaignContract()", +"85444de3": "getChildChain(uint256)", +"85445829": "numMatches()", +"85448c59": "getBountyAddress()", +"85461f69": "calcReward(uint256,address)", +"854642e1": "mintNewDrawings(uint256)", +"8546d393": "Anatomia(uint256,uint256)", +"85473be1": "maximumCoinsPerAddress()", +"85476d6e": "GetCurrentTypeSaleItem(uint256)", +"854772ea": "getUserTotalReward(address,bool,bool,bool)", +"8547af30": "lastBidder()", +"8547bb3a": "publicSaleMode()", +"85482f89": "setOnePowerAge(uint256,uint256)", +"8548cc21": "allocateOwnerTokens()", +"8549b326": "isSettable(uint256,string)", +"8549d6f4": "MayanProtocolContract(uint256,uint256)", +"854a3d64": "LogStartSale(uint256,uint256)", +"854a9cc4": "ImpeachmentProposed(address,string,uint256,address)", +"854b1cdf": "curPayTableId()", +"854bb344": "NoblesseOblige()", +"854bec87": "payback()", +"854c2e1e": "HitToken(string,string,uint8,uint256,address,address,address)", +"854c4a0d": "DownSuccess(string,address)", +"854c584d": "AdsventureToken()", +"854cb674": "TheIlluminati()", +"854cd978": "ClaireToken()", +"854cff2f": "setWhitelist(address)", +"854e32cc": "revenueShareDistribution(address)", +"854e85c6": "lifeEvents(uint256)", +"854ecd23": "Vaynix()", +"854f1663": "setNonprofitDisbursementAddress(address)", +"854f1a1c": "VIVARefundVault(address)", +"854f3988": "eighth_withdrawal(uint256)", +"854f4817": "buyKissBTCWithCallback(address,uint256)", +"85502264": "deptcheckrespond(address)", +"85506473": "GnosisToken(address,address[],uint256[])", +"855085b8": "interCrypto()", +"8550aaf0": "BONUS_TIER_9_LIMIT()", +"8550cf46": "buyGameCoin(uint256)", +"855114c9": "buyNation(uint8)", +"85511d5f": "setEmergencyCode(uint256,uint256)", +"85512e5b": "EthlanceUser2(address)", +"8551884a": "authorizeListingService(address)", +"8551b896": "pre_tokensSold()", +"8551e3fe": "savePost(bytes32,uint256)", +"85522831": "numIntervals(uint256)", +"85528394": "currentClaimPriceWei()", +"85529636": "getSiteTokenId(uint256,uint256)", +"85530d7c": "setPetLastBreedingTime(uint64)", +"85535cc5": "setVaultAddress(address)", +"8553f6fb": "hardCapDividends()", +"855460d8": "externalBuy(address,uint256,uint256)", +"8554d60a": "addTenParticipants(address,address,address,address,address,address,address,address,address,address)", +"8554d92c": "verify(uint256,uint256,uint256,uint256,uint256)", +"85550c6b": "tradeKey(bytes32,bytes32)", +"8555cde9": "Permissioned(address,address,bool)", +"8555de47": "BlackPyramid()", +"85561120": "TPTToken(uint256)", +"85564b97": "MasterWithdraw()", +"85565585": "crowdsaleOwner()", +"85580c5b": "userinverst(uint256,address)", +"85586e8a": "allocateCommunity(address,uint256)", +"85587375": "restartAssign()", +"855876d5": "countCliDreams(address)", +"8558c0af": "createBag(uint256)", +"8559fd88": "requestRandom(uint8)", +"855b7f5b": "getAdvancedTransfer(bytes32,bytes32)", +"855b842d": "isUserInBlackList(address)", +"855c145b": "specialManagerCountInt()", +"855c45e7": "EIP20Factory()", +"855c8999": "GetSlug(address)", +"855c95f1": "createETHAuction(uint256,address,uint16,uint256)", +"855ce579": "setTwoPowerAges(uint256,uint256,uint256,uint256)", +"855ceb7d": "AirToken()", +"855d0700": "insertList2(uint256,uint256,uint256,uint256,string,uint256,string)", +"855d7c21": "updateTokenBaseRate(uint256)", +"855e0629": "setIconRate(uint256)", +"855eafa7": "get_maker_fee()", +"855f2b3a": "createGen0Auction(uint256[2])", +"855fe4c0": "ifSuccessfulSendFundsTo()", +"855fe6ed": "getConfigEntryInt(bytes32)", +"85602ad5": "getPreviousValidators()", +"85609b1c": "compose(string)", +"8561d136": "currentRunningAddress()", +"8561dc0b": "tokenPostIcoUsdCentPrice()", +"8562e452": "ADVISORS_SHARE()", +"8564b2cd": "listItem(uint256,uint256,address,uint256)", +"8564c284": "setCompte_34(string)", +"85652d1f": "getInvoiceAddress(uint256)", +"85654c9c": "setMembershipRoster(address)", +"85663119": "initialPrize()", +"85666a7c": "TEAM1()", +"85673296": "DepositBalance()", +"85673fb8": "follow(address,uint256,address)", +"8569cc4e": "release_4()", +"856a89fd": "drawRaffle(uint256)", +"856b3108": "UpdateInitiateContractAddress(address)", +"856b7d2c": "SignDividend(uint256)", +"856bb9cc": "addConsent(address)", +"856c0181": "countriesStatus()", +"856c486b": "WoodyToken()", +"856c6bd1": "checkRose(bytes32)", +"856c71dd": "isAvailable()", +"856c8922": "getGameRules(uint256)", +"856cddb0": "DummyOVOToken()", +"856dc78e": "getWarriors(uint256[])", +"856de136": "FAPFundDeposit3()", +"856deacf": "findTag(string)", +"856df931": "LYB(string,string,uint256)", +"856e8488": "erc20TokenContract()", +"856eb2d1": "submitTransactionWithSignaturesToken(address,address,uint256,uint8[],bytes32[],bytes32[])", +"856ed703": "currentCap()", +"856f3080": "WhatWasMyHash(bytes32)", +"8570153e": "publish(string,string,bytes,address[])", +"85716e2f": "changeAdminer(address)", +"8571baff": "SimpleCrowdsale(address,address,address,address)", +"8572e364": "scale(uint256,uint256,uint256,uint256,uint256)", +"8573d4aa": "OwnershipTransferPending(address,address)", +"8574ddf9": "snailmasterReq()", +"8575052a": "set_fees(uint256,uint256)", +"857512b4": "airdropCountLimit2()", +"85760377": "PixelTransfer(uint16,uint16,uint256,address,address)", +"857637c9": "ShopDexToken2()", +"85766cc3": "Calculation(string,string,string,string,address)", +"8577efc5": "DIGI()", +"8577ffc1": "unofficialUserSignUpFee()", +"857835f9": "getPostsFromIds(address[],string[],uint256[])", +"85787c8b": "encode(uint256[],uint256[])", +"85796a2d": "bonusClosingTime0()", +"8579c10e": "payDevelopersFund(address)", +"8579cbde": "getPrice(string,uint256,address)", +"857ac1c9": "TokensBurned(address,address,uint256)", +"857b3224": "setOAR(address)", +"857b575e": "qquizwinnerToken()", +"857b7dfc": "buyLittleDragonGirlLottery()", +"857ba7fb": "MAX_CONTRIB_CHECK_END_TIME()", +"857bcb2c": "adminAddTrustedCurrencyContract(address)", +"857cc1c4": "ExchangeGift(string)", +"857cd569": "FundDeposit(address,address)", +"857cdbb8": "getPublicKey(address)", +"857cfff9": "homeDailyLimit()", +"857d39d7": "CCH_LLV_FIFA_1()", +"857d4c07": "throwScraps(uint256)", +"857e6a99": "decreaseTokens(address,address,uint256)", +"857f4864": "getNextSnapshotTime()", +"857f54e4": "MonethaGateway(address,address)", +"8580563c": "finalize(bytes,bytes,bool)", +"8580b71b": "getLoanIDbyClient(uint256)", +"8580eb2f": "setFeeBalance(uint256)", +"858110a5": "proposeShutdown(uint256)", +"858155e4": "subcontractExecuteCall(address,uint256,bytes)", +"8581dc7c": "SociBit()", +"85820925": "getCompte_17()", +"8582ac21": "getIcoInfo()", +"8582b7dd": "OrxERC20()", +"8582e554": "transferBy(address,uint256)", +"858310d8": "getPreICOAddress(uint8)", +"85839731": "setKittyContractAddress(address,address)", +"8583b1b8": "_setUserInfo(address,uint256,uint256)", +"85861b15": "setUnboundedLimit(address,bool)", +"85867cd5": "BDSMtoken()", +"8586b2f0": "getPermission(address,string)", +"8586e75b": "ChangedResource(bytes32)", +"8587be6e": "ceil(uint256,uint256)", +"8587edbb": "lockEndBlock()", +"8588b2c5": "adopt(uint256)", +"85899cee": "CryptoThreeKingdoms()", +"8589c725": "deleteWork(uint256)", +"858ac4d8": "TransferOwner(address)", +"858c7559": "chainIDSeed()", +"858ced35": "setUser(address)", +"858e41b4": "lemonContract()", +"858e58d6": "RemapImportedNotUsed()", +"858f84e7": "WTFToken()", +"858fa2f5": "setArrayIndexValue(bytes32,uint256,address)", +"85903f67": "setUnofficialUserSignUpFee(uint256)", +"85908ffa": "buyTokensPostHook(address,uint256,uint256)", +"85909ac6": "operate(address)", +"8592b778": "_rand()", +"8594bed0": "cancelMintRequest()", +"85952454": "newOwner(address)", +"8595c9ff": "diff(uint256[])", +"8595f8b1": "getGasPricePctOfBetValue()", +"8596982d": "getNotesCount()", +"8596d9ed": "transferInternal(address,uint256,address)", +"8597705f": "DataEquip(address)", +"8597eb6e": "ericukis(uint256,string,uint8,string)", +"859832e6": "locationsLength()", +"85984e69": "WavesCommunityToken()", +"859971dc": "initialFunding()", +"8599d0d8": "buildIdentifier(address,address,address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,string)", +"859a711d": "icoBonus2EndDate()", +"859a954b": "peace(string)", +"859b97fe": "cancelAuction(address,uint256)", +"859bbfee": "floatAdd()", +"859bcc71": "allowDisbursePaymentWhenPaused()", +"859ccc72": "setPlayerVirusNumber(address,uint256)", +"859d1bc7": "updateLeftLottery()", +"859da4e3": "transferParityOwnership(address)", +"859e0547": "createBounty(address,string)", +"859e25df": "giveProjectMoreVotes(address,uint256)", +"859e7d32": "getEpochData(uint256)", +"859f5717": "AuctionSuccessful(address,uint256,uint256)", +"859f63dc": "checkRewards(uint256[])", +"85a013e0": "setAnswer(uint256)", +"85a08f41": "buyLimitSupplyMax()", +"85a09f6f": "withdraw123()", +"85a10b30": "burningAdress()", +"85a143f4": "DailyRoi()", +"85a156af": "activityFunds()", +"85a17a1a": "isValidBet(uint8[4])", +"85a1c242": "PSM_PRICE()", +"85a227fd": "APC()", +"85a242d7": "teamTokensAccount()", +"85a2675b": "isConfirmedWithdraw(uint256)", +"85a26d7d": "getAllPeople()", +"85a2dd15": "hasAccess()", +"85a2f6af": "donateToken(address)", +"85a30c33": "changeContractAddress(address)", +"85a33ce9": "exitinverst(address)", +"85a345e2": "disTrust(address)", +"85a34f4a": "getGameSums(uint256)", +"85a38635": "votingEnd()", +"85a4757e": "releasedAmountBlocksIn(uint256,uint256)", +"85a49f2e": "verifyPass(address)", +"85a52584": "SettingsChanged()", +"85a735dd": "partAllocationLength()", +"85a8f42e": "diff(int256[],int256)", +"85aa6103": "auctions()", +"85aa6e09": "granted(address)", +"85aa92a7": "storageAddress()", +"85aaff62": "transcoder(uint256,uint256,uint256)", +"85ab0c19": "tokenProvenance(uint256)", +"85aba275": "assign(address)", +"85ac2f7b": "getListedTime()", +"85add95b": "Spike()", +"85ae067b": "func_040B()", +"85ae2f1c": "sunFinished()", +"85ae6d2d": "OfferingOpens(uint256,uint256)", +"85af4142": "verifyTeam(uint256)", +"85b018e9": "isSubjectRaiseTap(uint256)", +"85b09a01": "DIVC()", +"85b12c7c": "launch(uint256)", +"85b1423e": "returnAll()", +"85b142ed": "getAccountState(bytes32)", +"85b2ff8f": "getWeightedRandomMember(uint256)", +"85b31d7b": "myInfo()", +"85b39fc1": "CONTRACTIUM()", +"85b3c420": "createWeight(uint256)", +"85b3ed4e": "GoalReached(uint256,uint256)", +"85b443b6": "econReserveWallet()", +"85b4bb53": "getSettings()", +"85b51737": "addSafe(uint256,uint256)", +"85b55c07": "withdrawFeesToPoolOwners()", +"85b6824f": "setMinterWallet(address)", +"85b688de": "PRIVATE_STAGE_START()", +"85b73d3c": "testCreateNewRevision()", +"85b75b1e": "toogleStatus()", +"85b86188": "isSaleClockAuction()", +"85b8c64a": "bonusFreeLOT()", +"85b8d86f": "CrowdSaleFinished(string)", +"85b923ca": "getCandidates(bytes32)", +"85b94536": "debug_judge(bytes32[13],uint256,bytes32[],bytes32[],bytes32,bytes32,uint256[4],bytes32[10],uint256[4])", +"85b9c729": "OnWithdrawTo(address,address,address,uint256,uint64)", +"85b9f607": "buyTokensWithGuarantee()", +"85ba0052": "stringToUintNormalize(string)", +"85ba9a99": "setMinimumHydroStakes(uint256,uint256)", +"85bac237": "addPayment(address,uint256)", +"85bb7d69": "answer()", +"85bb821b": "WTO()", +"85bb8e29": "continuousSale()", +"85bbb53a": "ancestorBuffPercentage()", +"85bdc4a2": "lastBlock_v16()", +"85bddb97": "addOnOneStage(address,uint256,uint256)", +"85bde3f2": "SaddlePr(uint256)", +"85be2f02": "SampleCrowdsaleToken(string,string,uint8,uint256)", +"85be8fe6": "confirmReceivedAt(uint256)", +"85bf96a0": "JOP(uint256)", +"85bfe55d": "getUserByEmail(bytes32)", +"85bfff9c": "sayNoNo(uint256)", +"85c07546": "TransformCoin()", +"85c09f26": "topTotalSupply()", +"85c1057b": "payAndHandle(uint256,address,uint256)", +"85c15d9a": "exchangeRates(address)", +"85c3649f": "registerSelf(bytes32)", +"85c373c3": "releaseAccount(address)", +"85c3bb6f": "getMsg2()", +"85c4e3d1": "sendSubscriptionBonus(address)", +"85c53cf1": "giveAccess(address,bytes32)", +"85c5e9f8": "mimin(uint64,uint64)", +"85c64029": "set_prices(uint8,uint8,uint8)", +"85c653ba": "Divsforall()", +"85c78fac": "retryOraclizeRequest(uint256)", +"85c7a953": "WithdrawFullBalanceFromBankAccount()", +"85c855f3": "setStake(uint96,uint128)", +"85c8d362": "CTM()", +"85c8f447": "totum()", +"85c95d30": "setResourcesOtherManager(address,uint8)", +"85c9dd72": "GCOXToken(string,string,uint8,uint256)", +"85ca165a": "count_donors()", +"85cb2e6e": "refreshEmissionReleaseTime()", +"85cb469a": "getIcoFund()", +"85cb4ea2": "getPunchCardsInternal(address)", +"85cba6b1": "getFallback()", +"85cba722": "EGLSold()", +"85cbc881": "totalUSDRaised()", +"85cc3114": "doDeposit(address)", +"85cc51c2": "destTokensTeam()", +"85cc63ec": "getCurrentMinigamePrizePot()", +"85cc6fba": "boomrToken()", +"85cc9a2b": "issueKey(bytes32,address)", +"85cd233c": "getResidualEtherAmount(uint256,uint256)", +"85cdafa6": "teamOneVolume()", +"85cf61ef": "payRake(uint256)", +"85cfdec7": "buyKWHAgainstEther()", +"85d02c8a": "changeMaximumInvestmentsAllowed(uint256)", +"85d178f4": "withdrawWallet()", +"85d19a25": "getPositionId(uint256)", +"85d1be13": "preSaleSecondPrice()", +"85d3b5bd": "policyID(uint256)", +"85d45d34": "comments2()", +"85d51d19": "contributorETHBalance(address)", +"85d544be": "transferAndLockUntil(address,uint256,uint256)", +"85d559ee": "TbookToken(uint256,string,string)", +"85d5c971": "logTransfer(address,address,bytes32)", +"85d5e631": "disableTokenTransfers(bool)", +"85d61e2a": "supplyNum()", +"85d63cce": "REMAINING_SUPPLY()", +"85d71df1": "investxPlatform()", +"85d77e5f": "priceExpiration()", +"85d80458": "m_deployer()", +"85da1192": "setMaxFaucet(uint256)", +"85daafe6": "capitalRaisedTarget()", +"85dacd5b": "voteSnapshotBalanceAuto(address,uint256)", +"85db2dda": "PayoutQueueSize()", +"85db2e3a": "PoD()", +"85db66e8": "addGroupMembers(bytes32,address[])", +"85dc3004": "setFundAddress(address)", +"85dc6721": "emptyShipCargo(uint32)", +"85dcbb5a": "returnMember(address)", +"85dcee93": "descriptionHash()", +"85dcfbd4": "VernamWhiteListDeposit()", +"85dd1fbd": "bet_on_team_1()", +"85dd2148": "getSaleDate(bytes16)", +"85ddb747": "transferFromPosttgefund(address,uint256)", +"85ddf726": "dismissOperator(address)", +"85de4841": "uint2str(uint64)", +"85de4f72": "luckybuyTracker_()", +"85dee34c": "query2_withGasLimit(uint256,string,string,string,uint256)", +"85defaf4": "voteEnds()", +"85df508f": "tip_rate()", +"85df51fd": "blockHash(uint256)", +"85e00e4b": "bezpolToken()", +"85e040b1": "Invested(uint256,address,uint256)", +"85e050e4": "get_property_contact(uint256)", +"85e05445": "MartiniumToken()", +"85e0832c": "totalMintSupply()", +"85e1684c": "computeS(uint256,uint256)", +"85e344f7": "SmartInvestmentFundToken(address)", +"85e36cc2": "foundationAmount()", +"85e3f058": "getIdentity(uint256)", +"85e41e7e": "TokenFree(uint256)", +"85e436bf": "setBuyRate(uint256)", +"85e567d4": "verifyProof(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[1])", +"85e57f3c": "updateLogoUrl(bytes32,bytes32)", +"85e5908e": "Group_3()", +"85e5bb3a": "Security_AddPasswordSha3HashToBankAccount(bytes32)", +"85e5d7ee": "mintAll(uint256[])", +"85e5f08a": "updateVerifiedSign(address,address,string,uint8,string)", +"85e612e4": "getBirthYear()", +"85e61b4a": "processFundingSuccessfulFinished()", +"85e61e67": "set_arbits_whitelist(address,address,bool)", +"85e68531": "revokeAccess(address)", +"85e7d4cb": "CCC()", +"85e870b3": "default_rate()", +"85e91347": "initializeSaleWalletAddress()", +"85e99be4": "updateHighestPrices_(uint256,address)", +"85e9bd2b": "setAdminAddress(address,address)", +"85eac05f": "changeOwnerAddress(address)", +"85eb6109": "getAddressClaims(address,address,uint8)", +"85ec419a": "setTokenTwdt(address)", +"85ed5cf9": "resetAlias()", +"85eddeea": "setReward(address[],uint256[])", +"85edf68d": "initVestingStages()", +"85ee292c": "airdropTesterFinal(address[],uint256)", +"85ef4ae7": "f_internal()", +"85ef5a8a": "GermanCoin(address,address)", +"85efa3aa": "setHold(address)", +"85efb721": "fillTheBank()", +"85eff0ef": "hardcoreBattleWith(uint256,uint256)", +"85f01859": "setWord()", +"85f07a2b": "CALLER_EXCHANGE_SHARE()", +"85f07b64": "confirmedAmount()", +"85f07bbe": "MIN_PLAYERS()", +"85f0e72c": "uintToStr(uint256,uint256)", +"85f0f098": "allowWithdrawals()", +"85f16544": "EdgarRichardWunsche()", +"85f19bc4": "giveDividend()", +"85f255ea": "getUserFactoryContractAddress()", +"85f2aef2": "team()", +"85f2d854": "createManyDrinks()", +"85f2e4b1": "_strConcat(string,string,string,string)", +"85f3c568": "LogContribution(address,uint256,uint256)", +"85f45250": "addFunds(uint256,uint256)", +"85f517d4": "account3Address()", +"85f52912": "TGRUPToken()", +"85f52984": "addPrecondition(address)", +"85f59db3": "CheckN2Exception(bytes32,uint32)", +"85f63a4a": "preICOBeneficiaryAddress()", +"85f671a6": "requestWithdrawal(bytes32,uint64,bytes32[],uint256[],uint256[2],uint256)", +"85f67ae4": "addEpisode(address)", +"85f8c16d": "claimHours(int256)", +"85fa33eb": "declareDividend(uint256)", +"85fab341": "transferTokensAfterEndTime(address,uint256,uint256,uint256)", +"85fae602": "getInsurance(uint256)", +"85fbd17f": "PonzICO()", +"85fbdd47": "_order(uint256,uint256,uint8)", +"85fbdefc": "masterBalanceOf(bytes32,address)", +"85fc835e": "getSoftcapUsd()", +"85fcb4a8": "findPrevOrderId(uint128,uint128)", +"85fcd363": "votesArr(address)", +"85fceea8": "getCountSubscribers()", +"85fdeba7": "vendorAllocation()", +"85fe0448": "testThrowRestartNotUpdatable()", +"85fe551a": "ownerGrace()", +"85fe6200": "recordEndedGame(uint256)", +"85fed812": "ERC20Lookup()", +"85ff5e13": "SkinCoin()", +"85ff70de": "_payFees()", +"85ff96a7": "getTotalSellingMonsters()", +"86001519": "totalProfit()", +"86005b14": "allocateVestable(address,uint256,uint256,uint256)", +"8600e40b": "notifyWithdraw(address,uint256)", +"8600f2ec": "totalChildTokens(address,uint256)", +"86013322": "withdrawSaleBalances()", +"860241c2": "TAXToken()", +"8602c8b6": "countryofN(address)", +"8602c8d3": "ethSendDifferentValue(address[],uint256[])", +"8603d31a": "auctionDetails(uint256)", +"860427fc": "setGPSRatio(uint256)", +"86047946": "_processHistoryItem(bytes32,bytes32,uint256,address,address,uint256,bytes32,bool)", +"86048c9a": "totalCashout()", +"8605c97e": "setMarginThresholds(uint256,uint256)", +"86060884": "SafeGuard(bytes20,uint256,uint16)", +"86066750": "HelloWorld(string)", +"86068367": "DYITToken(uint256,string,string,uint8)", +"8606f905": "balanceOf(address,bytes)", +"86070cfe": "recoveryVaultAppId()", +"86073441": "signToApproveAddTokenData()", +"860772a9": "establishBorrowerReturnFiatPerEthRate(uint256)", +"860779e7": "setMinBuy(uint256)", +"860838a5": "frozenAccounts(address)", +"8608e58b": "sendOwnerDeposit(address)", +"86096578": "getRetailer(uint256,address)", +"860aefcf": "limits()", +"860bb34a": "SIGMA()", +"860c5ed6": "testVote()", +"860c851a": "votePrice()", +"860caf69": "HashAdded(address,string,uint256)", +"860d7273": "masterKeyActive(address)", +"860e6185": "commitTo(bytes32)", +"860e9960": "BetPriceLimit()", +"860e9b0f": "updateRegistryPrice(uint256)", +"860f5048": "baseSupply()", +"861004ae": "Visus(address)", +"861080ae": "transferMembership(address)", +"8610f045": "withdrawOffer(uint256)", +"86115c1d": "MyPurchaseContract(address)", +"8611643a": "Withdraw(string,string)", +"86116c12": "PerkscoinToken(uint256)", +"86117319": "buy_the_tokens(bytes)", +"8611e330": "FishbankBoosters()", +"86127ecf": "oraclize(bytes32,bytes,bytes,bytes,string,bytes,bytes,uint256,bytes)", +"8612d049": "isLocked(address,address)", +"8612ee13": "addMatch(string,string,string,bool,uint8,uint8,uint256)", +"86145875": "contributeInternal(address,uint256,uint256)", +"861654f7": "updatefundingStartTime(uint256)", +"8616865d": "ReferredInvestorAdded(string,address)", +"8616bc8b": "contributedTotal()", +"8617457a": "start_()", +"86188c97": "fetchOrdersForMerchant()", +"86190d62": "buyable(address)", +"86192c36": "privateOfferingPercentage()", +"861c3385": "blocksquare()", +"861c3a09": "queryByUser(bytes)", +"861c9c79": "transferToComposition(address,uint256)", +"861cab52": "canSendGameGift()", +"861d4e51": "NOETToken()", +"861d7daf": "deleteImage(uint256)", +"861dd0a5": "releaseCats(uint32,uint256,uint256,string)", +"861e2e43": "orderCore(uint256,uint256,uint256)", +"861e5d6a": "CryptoKotik()", +"861ec457": "SILVER_AMOUNT_TPT()", +"861ed3ea": "controllersByPartition(bytes32)", +"861f8a52": "testThrow_2_invalidOwner_accessRestrictionThrow()", +"861fcefb": "Token1Token()", +"86200842": "getSellDailyLimit(uint256,bytes2)", +"8620410b": "buyPrice()", +"86212913": "queryAuction()", +"86216ace": "NotThrowingToken(uint256)", +"8622031f": "setModuleAddress(string,address,bool)", +"862235f5": "EthertoteAdminAddress()", +"8622a689": "expiresAt()", +"86231246": "returnsOneNamed(uint256,uint256)", +"86231b9e": "contentHostPaidByAO(bytes32)", +"86237e7b": "setAngel(uint8,address,uint256,uint16)", +"862440e2": "setURI(uint256,string)", +"86260cfe": "UpdateUserEmail(string)", +"86269a88": "checkBetNumber(uint8)", +"86271d8b": "minPurchaseInEth()", +"8627df46": "buyTickets(uint256,uint256)", +"862882e5": "startAuction(string,uint256)", +"8628892e": "Initialize(address,address,bytes32,address,uint256,bytes32,address,uint256,bytes32,uint256)", +"8628aca9": "setIds(uint256,uint256)", +"862a4bf2": "tokenHolder(uint256)", +"862b092b": "getTokenName()", +"862b525c": "gameMiningTokenStartTime()", +"862b6683": "setValues(uint256,uint256,uint256,uint256)", +"862c5e16": "validatePurchase(address,uint256,int256[],int256[])", +"862cb14e": "DMI()", +"862cdef3": "auctionTank(uint256,uint256,uint256,uint256)", +"862d0d4b": "_weiToFinney(uint256)", +"862eb9c0": "setGoldReward(uint256)", +"862ed594": "XmonetaToken()", +"862f4517": "hasVoting(uint256,uint256)", +"862fd38c": "concat(uint8,bytes32,bytes32)", +"86312b1b": "TripsCoin()", +"86314af9": "BetOnHashV84()", +"8631890e": "PLANET_PRICE()", +"86318bc4": "ethBioxRate2()", +"86321f95": "switchClaimerAndRemoveOldOne()", +"86323e85": "isSellingNow()", +"8633497f": "angelCurrentAmount()", +"863451dd": "donateEther()", +"86346c42": "awards(uint8)", +"86348afa": "ColorReserved(address,uint256)", +"863524b1": "partnersKey()", +"86356ab9": "finalizeRefunding()", +"8635b527": "resetPainting(uint256)", +"8635f45d": "getSpaceshipProductAttributesByModel(uint16)", +"863682f4": "getScore(uint32)", +"86377b63": "registerLoanReplaceDuplicated(address,uint256,uint256)", +"863843bc": "bonusSupply()", +"8638aa65": "DEBUG_MODE()", +"8639ae69": "getAllCrySolObjects()", +"8639b0d7": "getBalanceDiscrepancy()", +"863a0372": "hex2dec(uint256)", +"863a03e0": "salvage(address)", +"863ac22b": "EtherGame()", +"863b3b66": "purchaseThemedSpinner(string,uint256)", +"863c51a9": "setCustomerSignature(address,uint256,bytes32)", +"863c607c": "ReactioonToken()", +"863d62ac": "Goldmint(address,address,address,address,address,address)", +"863da000": "disburseAuthorizedPayments(uint256[])", +"863e24d6": "updateBonusTicketsPercentage(uint8)", +"863e76db": "ONE_DAY()", +"863e7e4b": "getCurrentPhraseInfo()", +"863e8320": "initGPS()", +"863f2a19": "adjustTime(uint256,uint256,uint256,uint256,uint256,uint256)", +"863f40ac": "syp1(address)", +"863f52b4": "makerBetsCount()", +"864059ac": "clearingPriceComponent()", +"86420710": "setReceivers(address[],uint256)", +"8642269e": "buyProduct(uint256)", +"86428900": "SetPeriodITO_startTime(uint256)", +"86432925": "profitDistributionContract()", +"8643d01d": "throwsSaleWalletIncorrectSaleAddress()", +"8644ddd9": "WOB(uint256,string,string)", +"86452295": "getPointOf(uint256)", +"86457702": "authorize(string,address)", +"8645a3da": "ATTR_PRODUCIBLE()", +"8646b5cb": "marketTotalEarning()", +"8646fb43": "Electrominer()", +"864757a8": "minFinneyToKeep()", +"8647a5dc": "getTimeLock(bytes32,bytes32)", +"86481d40": "getLevel(uint256)", +"864824a0": "phase9Price()", +"86485cdf": "setCurrentExchangeRate(uint256)", +"86489ba9": "initialize(address,address,uint256,uint256,uint256,uint256)", +"8648c0ce": "neumarkCap()", +"8648f24c": "changeVariables(uint256)", +"86496e2e": "TcToken(uint256,string,uint8,string)", +"8649c0a4": "SetEndTime(uint256,uint256)", +"864a1057": "Start4()", +"864a9a09": "__mod(bytes,bytes)", +"864aef45": "buyCard(address,uint256,uint256,uint256)", +"864af3f4": "Menu02(address[],uint256)", +"864b525c": "GoldDollar()", +"864c189b": "LBCToken()", +"864c2e94": "service_founder()", +"864ca300": "goldBalanceOf(address)", +"864ce5dc": "getWeekBonus(uint256)", +"864d1d72": "getUserCountByRole(string)", +"864d7e14": "approveAsset(uint256)", +"864da88c": "_clearBlocksProducers(uint256)", +"864dd17d": "Controller(address,address)", +"864e8cc1": "setMaxCharacters(uint256)", +"864f4e54": "PeerWalletsToken()", +"864fda69": "minNum()", +"864fff0a": "DealCompleted(uint256,address,uint32,uint32,bool,uint256)", +"86508380": "_getUncreditedPoints(address)", +"8650b6ef": "endTimePre()", +"86517df4": "concludePresale()", +"8651dc1e": "confirm(uint256,uint256)", +"865232fb": "setarg_3_input(uint256)", +"86544e11": "STARTING_SNAIL_COST()", +"8654b78d": "AttoresDigitalCertificates(address)", +"865508ef": "minSend()", +"86556071": "gracePeriodStart()", +"8655f0da": "copyAllHpbNodesByStageNum(uint256)", +"8656dcb6": "distributeTeam()", +"865733da": "MercuryCrowdsale()", +"86575e40": "changeName(string,string)", +"86578375": "withdrawFund(uint256,bool)", +"865891b0": "PlanToken()", +"8658b8b9": "checkPermission(address,address,bytes32)", +"86590955": "changeHeight(uint256)", +"86591bd6": "testFailMintWhenStopped(int256)", +"86598549": "_withdrawTokensFor(address)", +"8659d573": "getCountPosition(uint256,uint256)", +"865a4253": "prcSum()", +"865ad6c2": "levelUpCar(uint32,uint32,uint32)", +"865b0d30": "SingularityTest15()", +"865c79b2": "setImageDataLength(uint256,uint16,uint16)", +"865cc6a3": "getDErc20OwnerClaimEnabled(bytes32)", +"865dc0d9": "EndChanged(uint256,uint256,address)", +"865e288b": "getAvailableWithdrawProfitValue(address)", +"865eb3d3": "getWorkerProfit()", +"865fd239": "transfer_token_ownership(address)", +"865fe035": "addressIco()", +"86602b6b": "testControlRetractLatestRevisionNotOwner()", +"86602c84": "frozenAmount(address)", +"86609b37": "_createCard(address,uint16,uint16)", +"8660b220": "buyerRate(address)", +"8660b32b": "getSumInByGame(uint32)", +"8660bb8b": "updateAllPixelDetails(uint256,uint8,uint8,uint8,uint256,string)", +"8660cbf5": "battleDecider()", +"8661009b": "checkPayments(uint256)", +"866192a2": "getLastAuditDocumentation(address)", +"866278a8": "level_7_amount()", +"86628eed": "weisDeposited(address)", +"86630b7b": "getSaleData(uint256)", +"86633571": "DestructibleMiniMeToken(address,address,uint256,string,uint8,string,bool,address)", +"8663b4c7": "StudyCoin()", +"866408eb": "getPlayerKeysCount()", +"86647821": "NeuroDAO(address,uint256)", +"86647bac": "getBountyArbiter(uint256)", +"8666107c": "eth_received()", +"86667435": "getPercent5(address)", +"8666fca5": "holdingsOf_BEAR(address)", +"86673464": "assertEq15(bytes15,bytes15,bytes32)", +"8668a416": "assignMultipleParcels(int256[],int256[],address)", +"8669ccf4": "getFreelancers(address,uint256)", +"8669e08c": "migrationFinishedTime()", +"866b5674": "totalBountyinWei()", +"866b9323": "mintForReportingParticipant(int256,uint256)", +"866c03eb": "_unmintedTokens()", +"866d840a": "setCompte_44(string)", +"866df234": "setLink(bytes)", +"866e5162": "oslikToken()", +"866eb7b5": "initialParameter(address,address[],address,uint256,uint256,uint256,uint256,uint256,uint8,uint8,uint8,uint32[])", +"866f4555": "Basic23TokenMock(address,uint256)", +"866f6736": "trustedChildWithdraw()", +"867022d1": "Initialise(address)", +"86703c9c": "getProviderClientsCount(uint256)", +"86707026": "midEtherBonusLimit()", +"8670cc7c": "BlueDragon()", +"8670e183": "createLegendaryAuction(uint256,string)", +"8671090e": "setSavedBalanceToken(uint256)", +"86715acf": "BodyOneToken(address)", +"8671b894": "cancelOrder(uint256[3],bytes32,bytes32,uint8)", +"8671ef4d": "grg(address)", +"86723215": "createMarket(bytes,uint256,uint256,address)", +"8672e853": "LogOwnerAdded(address,address,address)", +"8672f1bc": "isProposalActive()", +"8673094f": "allGuGiven_()", +"867387d4": "BurnableToken(address[50])", +"86749d97": "ZOOToken()", +"8675cf9e": "MaxToken(uint256,string,string)", +"8676993f": "setTransformAgent(address)", +"86773cae": "setPromoEndTime(uint256)", +"8677ebe8": "isSigned(address,bytes32,uint8,bytes32,bytes32)", +"8678446e": "preSaleMinEth()", +"8678c2b9": "HodlEth(uint256)", +"867904b4": "issue(address,uint256)", +"86795e8d": "set_master(address)", +"867a66ac": "ownerCredit(address,uint256)", +"867b36fe": "setFiscalVerify(bytes32)", +"867b3d4b": "updateEtherPrice()", +"867b79a1": "withdrawalRange(uint256,uint256,address)", +"867befba": "SUV_TYPE()", +"867c0547": "newPonziFriend(uint256)", +"867c2857": "transferAgents(address)", +"867c6e23": "CryptoRides()", +"867c7eda": "getProposalByID(uint256)", +"867e248c": "feePercantage()", +"867e958f": "NAEC()", +"867ea029": "WESSToken()", +"867eed11": "privilegedTransferLock()", +"867f990a": "changePriceUSD(uint256)", +"867fbe6d": "AnotherOwnerAssigned(address)", +"86804aad": "queryData(address)", +"8680e52d": "emitJobOfferAccepted(uint256,address)", +"86813c53": "sellerIdOf(address)", +"86814819": "_prePurchaseAmount(uint256)", +"868149da": "TRONCLASSIC()", +"8681a07f": "ownerSetRandomApiKey(string)", +"868203ea": "ZeroChainToken()", +"86820a7d": "createInputData(uint256,uint256)", +"86834610": "registerEscapeRequest(uint32,int256,bool,uint32)", +"8683612b": "exists(bytes32,bytes32)", +"8683e4b4": "WHUToken()", +"86842bc2": "verifyNonces(bytes,uint64[],uint64[])", +"86845f9a": "theCyberGatekeeperTwo()", +"868467e6": "deliverTokens(uint256)", +"86849a6c": "TeamTailsChoice(address)", +"86852dca": "getElectionInfo()", +"86852fd7": "bountySupply()", +"86863ec6": "init(address,address,uint256)", +"86867740": "trueSupply()", +"86869eae": "totalClosedContracts()", +"86886a38": "transferAccessOn(address)", +"8688b5fe": "getMyContractsByType(uint256)", +"86897cb8": "Addresses()", +"8689a500": "putToken()", +"868a8813": "calculateGrapeBuySimple(uint256)", +"868d2b62": "ZeusCoin()", +"868d5383": "transferFromWithData(address,address,uint256,bytes,bytes)", +"868defd0": "getRemovableIdArrayAddressItems(address,uint256,string,string,string)", +"868df7f6": "alterFeaturedLength(uint256)", +"868e3c52": "EosPizzaSliceSafe(address)", +"868eb6bf": "removeOrders(uint256,uint256)", +"868f2564": "Iconss(address,address)", +"868f9c57": "Administrator(string,address)", +"86908b3f": "TransferInternalLedgerAT(address,address,uint256,bytes32)", +"86908f93": "FFG(uint256,string,string)", +"8690d6d5": "CentrallyIssuedToken()", +"8691162a": "TlcCoin()", +"86913884": "ShroomeryFarmer()", +"8692ac86": "transferOwnershipNow(address)", +"86936ed5": "isReceiptClaimable(bytes8,bytes8,address[],bytes,bytes32[],uint256[],uint256[],bytes)", +"86954ecc": "Finished(uint256)", +"86964032": "getHash(address,uint256,uint256,uint256,uint256)", +"8696807d": "addABaddress(address,address,string)", +"8696eec4": "setTokedoTokenFeeDiscount(uint256)", +"86973b0f": "RewardDemoChannel(address,address,address)", +"86985bee": "getTeamSalary()", +"86994b71": "RND()", +"869984c8": "addrOwner()", +"8699a65f": "rewardsCount()", +"869ac8dc": "getReferenceCurrency(address,uint256)", +"869af1ff": "finishTransferGet()", +"869b22fd": "toEthertoteDevelopmentWallet()", +"869b3f6a": "testThrowsRetractNotOwner()", +"869c63c1": "batchOrderTrade(uint8[2][],bytes32[4][],uint256[7][],address[6][])", +"869c8bd4": "buyChannel(string)", +"869d436d": "approvedAddressLUT(uint256)", +"869d785f": "removeModerator(address)", +"869d7d93": "countLeadingZeros(uint256,uint256)", +"869e0e60": "decreaseSupply(uint256,address)", +"869f1c00": "presaleParticipationMinimum()", +"869fe15d": "setFirstWinner(address[])", +"86a046d5": "lastRefrralsVault_()", +"86a17f29": "modifyLevelCap(uint256,uint256)", +"86a1ea7a": "HeliosToken()", +"86a2ef34": "Indemnisation_4()", +"86a2f98a": "getPersonalStakeForAddresses(address,address)", +"86a3171f": "removeAllAttachmentsFromCollectible(uint256)", +"86a33a0b": "RoundBSold()", +"86a3736e": "increaseTokenBalance(address,uint256)", +"86a3c902": "If(address,bytes32,bytes32)", +"86a3e0a7": "allocated1Year()", +"86a40e63": "_removeExcluded(address)", +"86a4f6ee": "MOM()", +"86a50535": "voteFor(uint256)", +"86a57f6f": "byteArrays(bytes1,bytes)", +"86a5ebe1": "getPlayerDetails(address,address)", +"86a5ff97": "changeStatus(string)", +"86a61c81": "medicos()", +"86a66dc3": "getVoteResults()", +"86a7b995": "maxContributionInWei()", +"86a8da37": "getNumWinners(uint256)", +"86a91ab4": "Scale(int256,bytes32)", +"86a9443e": "WellyPai()", +"86aa354a": "PUBLIC_SALES_2_PERIOD_END()", +"86aa552a": "lockAbsoluteDifference()", +"86aa6c09": "P3D_address()", +"86ab3f7b": "RESERVED_TOKENS_FOR_ICO_BONUSES()", +"86abfce9": "Voted(uint256,bool,address)", +"86acb16d": "register_creature(address)", +"86ace9b1": "setICOWeek1Bonus(uint256)", +"86ae5fec": "getParticipantCount(uint256)", +"86aecb9d": "_lotteryToken(uint256,address,address)", +"86af6ba5": "addDeed(address,uint256)", +"86afa110": "lockTrading()", +"86b08228": "getInvestorAddr(uint256)", +"86b0befc": "congress()", +"86b0fc9d": "startsWithDigit(string)", +"86b14583": "EzPoint()", +"86b27391": "startCrowdsale(uint256,uint256,uint256,uint8)", +"86b2be73": "ICO_RATE2()", +"86b35f79": "read_u16()", +"86b3610f": "wei2usd(uint256)", +"86b46073": "getCurrentBidOwner(uint256)", +"86b46694": "currentWave()", +"86b467f2": "tokenSaleContractAddress()", +"86b5e2b9": "dataSourceCallbackRoundOfSixteen(uint256,uint8)", +"86b6b721": "Anaco()", +"86b6ec6c": "showLastChange(address)", +"86b6f462": "updateMaxContribution(uint256)", +"86b714e2": "s()", +"86b715bd": "setAutoNewbond(bool)", +"86b76d6c": "MunishExchange(address)", +"86b7b8f6": "setBalanceHolder(address)", +"86b88af0": "setLLV_edit_10(string)", +"86b8f0a2": "teamAllocations()", +"86b945b0": "getRoundStatus()", +"86b9a1f4": "logShareTokensTransferred(address,address,address,uint256)", +"86ba793e": "setProviderCountry(uint256,uint256)", +"86bb1b24": "pegEtherValues(uint256,uint256,uint256,uint256,uint256,uint256)", +"86bb1e03": "toCollect(uint256)", +"86bb5a48": "buyAsset(address)", +"86bb7121": "getBlocksPerRound()", +"86bb8f37": "claimReward(uint256,uint256)", +"86bc2338": "isConsumable()", +"86bd4ef7": "lockPayment(bytes32,address,uint256,address)", +"86bdea3f": "postTrade(bytes32,uint256,address)", +"86be3981": "dividendsForUser(address)", +"86be53d3": "isPresaleOn()", +"86beaece": "doPurchase(uint256,uint256,uint256,address,address,uint256)", +"86bfbd44": "setDailyPrices(uint256,uint256)", +"86c02e88": "allocateFundToken()", +"86c23d54": "EliteShipperToken(uint256,string,string)", +"86c2b53d": "EximchainToken()", +"86c2e8e3": "accept(uint256,address[],uint256[],uint256)", +"86c3ceae": "setVAtomOwner(string,string)", +"86c455ee": "team2LockEndTime()", +"86c57fcc": "b32ToBytes(bytes)", +"86c59418": "USDToken()", +"86c5bc1c": "totalExchanged(uint8,uint8)", +"86c6f66b": "buySilver(uint256,uint256,uint8,bytes32,bytes32)", +"86c8c491": "setTransferAdmin(address,bool)", +"86c99779": "blocktubeUser()", +"86ca32b5": "claimExist(string)", +"86cb034f": "KIBIS_Token()", +"86cb531b": "mintPartnerWithLock(address,uint256,uint256)", +"86cb5cdb": "feeForFirstArtWorkChangeRequest()", +"86cba22b": "getAllBuyers()", +"86cc5a1d": "testIsOptionPairRegistered(address,uint256,address,uint256,uint256)", +"86cd71be": "getNumberOfMinters()", +"86cdbae9": "append(string)", +"86ce0285": "allocateTokens(address,uint256)", +"86ce8327": "updateStarScore(address,uint256)", +"86ce9835": "transferMoney(address)", +"86cef432": "CONTRIB_PERIOD3_STAKE()", +"86cf1e39": "GetherCoin()", +"86d01727": "setPendingTaxParameters(address,uint256)", +"86d08447": "getTestThree()", +"86d0b46d": "foundersTokensPercent()", +"86d0b48c": "round3Sold()", +"86d12325": "preSaleDistributionContract()", +"86d1a69f": "release()", +"86d23143": "getLastAcceptedProposal(bytes32)", +"86d263fe": "MarketCollateralPool(address)", +"86d2ee85": "HOLDING_START()", +"86d2fe57": "privateSaleStartDate()", +"86d35ed9": "getCrypton(uint256)", +"86d3a2b8": "setContributorCap(uint256)", +"86d3cf0d": "crazyearners(uint256)", +"86d3f4b7": "ethRateURL()", +"86d4c423": "UBTC()", +"86d4ebf7": "test_BasicThrow()", +"86d4fe9c": "viewTokensRemaining()", +"86d4ff1d": "canSell(address)", +"86d518bf": "grantAccessMint(address)", +"86d53469": "sendPreSaleETH()", +"86d54fe1": "EtherFundMeCrowdfunding(string,string,string,uint256,uint256,uint256,address,address)", +"86d59996": "deleteValidationData()", +"86d5c5f9": "getPassportLogicRegistry()", +"86d5e9a6": "setTokenNameSymbol(string,string)", +"86d6c8a0": "getTankProduct(uint32)", +"86d6c9d1": "canHolderTransfer()", +"86d74037": "distributeToken(address)", +"86d8aab4": "cancelMultipleOrders(address[3][],uint256[3][],uint8[],bytes32[],bytes32[])", +"86d922a9": "lastCallTime(address)", +"86d9b0c5": "make(address,uint256,bool)", +"86da69f0": "gamble()", +"86dbfa98": "DINTToken()", +"86dc88ff": "addMadeTX(address,uint256,uint256,uint256,uint256)", +"86dc8ace": "pendingVestingPool()", +"86dcbefc": "test_registerWithoutCertification()", +"86dd03bd": "setRedeemLevel(uint256)", +"86dd5e03": "setBossRoundNumber(uint256)", +"86de99dd": "SetStatus(uint256,uint256)", +"86def3b9": "getDukeDate(string)", +"86df3d5b": "getCreateOrderMinGasNeeded()", +"86e1e589": "NamiAddr()", +"86e261c9": "updateSecondAmount(bytes32,bytes32,uint256)", +"86e2c40c": "removeAffiliate(uint256)", +"86e3060d": "nextFlexibleReward()", +"86e32cb5": "setSpecialFeePercent(address,uint256)", +"86e32ed0": "setAllowedContract(address)", +"86e36ce2": "speechOfOwner(address)", +"86e37ae7": "tokensForFight()", +"86e399c1": "priceDivisor(uint256)", +"86e476dd": "communityAddress()", +"86e49407": "setFeeUnit(uint256)", +"86e4993c": "issue(uint256,uint256,address[],uint256[])", +"86e4a33e": "countBtcAddressLeadingOnes(bytes,uint256)", +"86e4e178": "CheckTickets(address,uint256,uint256)", +"86e58bef": "del_user(bytes32,bytes32)", +"86e58c0c": "getGalleassTokens(address,bytes32,uint256)", +"86e5ceb4": "previousRoundJackpot()", +"86e6361e": "setSellInfo(uint8,uint256,uint256)", +"86e6eee1": "INEX_Token()", +"86e8c57a": "secondroundprice()", +"86e92957": "lastDecimal(uint256)", +"86e97442": "mora(uint8)", +"86e99bdb": "XTOToken()", +"86eb23ca": "getOrganizerSymbol(uint256)", +"86eb3899": "lockPeriodForBuyers()", +"86ec6177": "endEvent()", +"86ec8f62": "validateTokenProperties(uint256)", +"86ecce90": "test_5_assertGasUsage1400Boards()", +"86ed60e9": "getSpawned(uint32,int256)", +"86ee8f01": "masterAddress1()", +"86ef1be2": "getRegistered(uint256,uint256)", +"86efb94e": "addressHistoryOf(uint256)", +"86f10e8b": "divForEthertoteLiquidatorWallet()", +"86f1865d": "_bcto(uint256,uint256,uint256,uint256,address)", +"86f19dde": "phase6Price()", +"86f1f2d4": "mintDigitalArt(string)", +"86f254bf": "minConversionRate()", +"86f28fe3": "token_member_order(address,address,uint256)", +"86f2907a": "doesEventExist(bytes32)", +"86f2e5cf": "_setHairColorValue7(uint256)", +"86f32586": "checkIfFundingCompleteOrExpired()", +"86f328a9": "episodes(uint256)", +"86f35b7c": "FeeCalculation()", +"86f3c026": "UpdateMoney(address)", +"86f3d0cd": "limitedDeposit()", +"86f5114e": "voteName()", +"86f5bf88": "interestPermil()", +"86f6e410": "adminIsAdmin()", +"86f7313d": "ico_enddate()", +"86f7993e": "acceptCooOwnership()", +"86f79edb": "getMessage(uint256)", +"86f822fa": "DunkPayToken()", +"86f876e2": "hyperEnable(address,bool)", +"86f8950a": "getUnclaimedBalance(address)", +"86f8bce9": "tixFundDeposit()", +"86f8e4ef": "mintFinalize(address,uint256)", +"86fa0671": "tokenShareShow(address)", +"86fa18df": "throwsWhenTransferingFundsDuringSale()", +"86fb8715": "ArbitratedBuyDeposit(address,string)", +"86fbb494": "DigixbotConfiguration()", +"86fbeb8c": "investors(uint16)", +"86ffe00f": "preSaleMaxTokens()", +"87000d42": "clearBetMap()", +"8700522a": "setLandProductionMultiplierCCUser(bytes32,address)", +"8700ceb2": "sellCertainOrder(uint256,uint256,uint256)", +"87011092": "refundContributor()", +"8701a2f0": "finishBet()", +"8702735c": "setCapitol(uint256,uint256)", +"8703b7d8": "setPOOL_edit_4(string)", +"8703e506": "stage4Bonus()", +"87040a86": "AddHOLDer(address)", +"87045369": "setCanCall(address,address,bytes4,bool)", +"870488f9": "sendTokensToInvestors(address,uint256)", +"8704c6ac": "MAXIMUM_CONTRIBUTION_LIMITED_PERIOD_USD()", +"87055008": "euroLock()", +"8705ae63": "migrationChain(uint256)", +"8705f218": "RemoveOwnerAddress(address,address)", +"8705fcd4": "setFeeAddress(address)", +"87067595": "MagicToken(uint256,string,string)", +"8706ab57": "setE4RowPartner(address)", +"8706b052": "PGD()", +"8707ee3e": "formatDate(uint256)", +"8708b5b2": "sourcePrice()", +"870911ff": "onExchangeTokenToEther(address,uint256,uint256)", +"87092940": "calculateInterest(address,address)", +"8709bece": "availablePrivateICO()", +"870b399a": "LOCKUP_6M_ICO_TIMESTAMP()", +"870b8b94": "hasFiveYearWithdraw()", +"870baf84": "sendToGiveth()", +"870bb8c2": "CROWD_WEEK1_PERIOD()", +"870bfc75": "lockMultis()", +"870c426d": "getUniverse()", +"870c8079": "getGovernmentAddress()", +"870dbae0": "TOTAL_MAX_CAP()", +"870e5405": "insert(bytes32,bytes32,int256)", +"870f0e27": "developmentLockEndTime()", +"870f892d": "getGTOAddress()", +"8710296f": "totalEarlyPurchaseRaised()", +"871105cc": "setVaultContractAddress(address)", +"871113c3": "oraclize_query(string,string[1],uint256)", +"87113b88": "managerListMap(uint256)", +"87114b8c": "versionInfo(uint256)", +"87115a9d": "setRemainingHealthAndMana(uint256,uint32,uint32)", +"8711e4a9": "lockTimeout()", +"8712523e": "lastTransferBlock(address)", +"87127f85": "ZeonToken()", +"8712c1c5": "freeTotal()", +"87136940": "tokenRateInUsdCents()", +"871388c9": "SetGene(uint256,bool,uint64)", +"8713d931": "BONUS_100_250()", +"8714b028": "offers(uint256,uint256,uint256)", +"8715d65d": "TierWildcatDividendAddress(address)", +"87161e59": "commandGetBonus()", +"871625e2": "retraitStandard_2()", +"871745aa": "presaleAddTree(address,address)", +"87174c3e": "refundManager()", +"87178668": "RATE_DAY_14()", +"8717ef27": "setVotingParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"87182d47": "totalSecondICOSupply()", +"87191e41": "isWhalePaying()", +"87195d23": "getInstallments(bytes32)", +"87196863": "_lower(bytes1)", +"8719715e": "walletAvatar()", +"8719e8ac": "setStatus(uint256,bool)", +"871b4e3c": "getCardBuyAuction(uint256)", +"871c7aab": "total_freeze_term()", +"871caa98": "dataOf(uint256)", +"871cc9d4": "decrementNumber()", +"871ced4a": "HeartBoutToken()", +"871cf692": "pullEtherFromContractAfterPreICOPrivate()", +"871d3eab": "addExtraDays(uint256)", +"871da475": "GetSellPrice()", +"871e0155": "pushNodeGroup(uint256,uint16)", +"871e5fac": "contributorsCurrentPeriod()", +"871fe6e1": "_validateHardCap(uint256)", +"872053e6": "releaseThisBonuses()", +"8720bb42": "liantoken()", +"87210f63": "tokenMainSale()", +"87214728": "contractIsCanceled(string)", +"8721db89": "requireKyc(address[])", +"8722860e": "isThereAnOnGoingProposal()", +"8722a57c": "forwarderOf(address)", +"8722d4d9": "enforceAddressMatch()", +"8723202e": "NewSmartSharingContract(string,uint256,uint256,string,string,string)", +"8723c377": "shiftOut(bytes,uint256)", +"8724025e": "AENIGMAZ()", +"8724e751": "Panax()", +"87250a35": "getSkull(uint256)", +"872519cd": "VerifyAccount(address,bool)", +"872539e7": "numberOfLeafs()", +"872588ba": "lock(bytes32,bytes32,bytes32)", +"8725d6be": "createToken(uint256,uint256,uint256,address,uint8)", +"872628e8": "setPriceStep2(uint256)", +"8726baf7": "unapproveArtist(address)", +"87275aba": "preMinting(uint256,uint256,uint256,uint256)", +"8727b7fc": "calculateAmountBonus(uint256)", +"87280324": "callMe(bytes32)", +"87281fab": "VestingReleased(uint256)", +"87283f0f": "ActivationRequest(address,bytes32)", +"87287fd7": "setMinFee(uint8)", +"872887c2": "getPeriodStartTimestamp(uint256)", +"87297093": "previousWithdrawal()", +"8729fff4": "buyCommission()", +"872a4e32": "change_min_price(uint256)", +"872a7810": "revocable()", +"872b31b6": "_removeStakeholder(address)", +"872bac57": "UpdateEmployee(address,uint32,uint32,uint16)", +"872bc83a": "GCCExchangeCore()", +"872d637f": "DivvyUp(bytes32,bytes32,uint8,uint8,uint256,uint256,uint256,address)", +"872dbdab": "advert_machine()", +"872dd49b": "getMigrateOutAttoTokens()", +"872dd84b": "priceBeforeGoalReached()", +"872f2526": "getGuestOrders(address,address)", +"872f5459": "toUINT120(uint256)", +"872fe620": "withdrawByResque()", +"87319e1e": "changeContractRegisterOwner(string,string,string,string,address)", +"8731a8d9": "deposit(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256,string)", +"8731cce5": "PledgePaymentCanceled(uint256)", +"87324ef0": "ecrecover2(bytes32,uint8,bytes32,bytes32)", +"8732d065": "ignoreKYCLockup()", +"87330b85": "getString1()", +"87336473": "unblockTransfer()", +"87338e98": "jackPotBestHash()", +"8733d130": "ownerManualMinter()", +"8733d4e8": "identityOwner(address)", +"8733f360": "initialize(address,address,uint256,uint256,address,address,address,address,address,address,uint256)", +"8734ffc9": "authorizedETH(address)", +"87355084": "transferCrowdsale(address,uint256)", +"8736381a": "contractCount()", +"87369c4b": "BOUNTY_EXCHANGE_SHARE()", +"87369e04": "refundTransactions(uint256)", +"8736fd16": "getRefStatus(uint256)", +"87393bc6": "verifyFirstHalf(uint256[4],uint256[4])", +"8739cacf": "getJobRating(address,uint256)", +"8739f930": "queryGameHistoryLength()", +"873a2878": "acceptWork(uint256)", +"873a5690": "VikkyToken()", +"873ab2ce": "computeFeeRate(address)", +"873b3009": "getKeyRevisionNumber(uint32,int256)", +"873bdee0": "systemWithdraw(address,uint64)", +"873c56d7": "officialLimit()", +"873cb0ab": "redeemedKarmaOf(string)", +"873cdb03": "Litas()", +"873db84c": "queryN_fnc()", +"873dc3b3": "bountyOnlineGW()", +"873dc71d": "getCycleInfo()", +"873ebe6a": "collect(address[],uint256[])", +"873f610c": "Contractors(uint256)", +"873f9a6a": "registerDIN(address)", +"873fd089": "isStaker(uint256,address)", +"87407993": "inQuitLock(address)", +"8740b73d": "EthereumGoldPro()", +"87412a4b": "TeamAndPartnerTokensAllocated(address,address)", +"8741ab49": "setupCompleteFlag()", +"8741f15e": "tileBalance()", +"874252ef": "giveProgectTokens(address,uint256)", +"8742792f": "changeNameByEveryone(string)", +"8742fc3b": "getVoteResult()", +"8744e974": "CallOption(address,uint256,uint256,uint256,uint256,uint256)", +"87451d52": "addQuickPromoBonus()", +"8745ddb3": "jailAmountOf(address)", +"8746656f": "extendDuration(uint256)", +"874752b4": "SpiceMembers()", +"8747a674": "getWrapperBalance()", +"8747f9b1": "resultReject()", +"8748ecda": "Dynamic1_5x(uint256)", +"87491c60": "closeMinting()", +"874a7036": "placeNotes(uint256[],uint256[],uint256)", +"874b4fcc": "setSigningPublicKey(string)", +"874b953a": "changePrimaryApprovedWallet(address)", +"874d6d81": "getWeek()", +"874d73a7": "addLottery(string,uint32,uint32,uint32,uint32,uint32,uint32)", +"874f33a1": "doStuff()", +"874f874c": "reminderCalc(uint256,uint256)", +"874f8ef6": "getAdv(uint256,uint256)", +"874fe370": "finalizeTS()", +"874ff7ed": "YOYOW(address)", +"8750367e": "FundRequestPublicSeed(uint256,uint256,address)", +"8750c2d7": "priceInTokens()", +"8751775b": "cancelRewardsWithdrawal()", +"87521056": "createMineForToken(uint256,uint256,uint256,uint256)", +"87524581": "accounts(address,uint256)", +"87526b0a": "totalPendingPayments()", +"87528d5e": "setInitAttr(address[],uint256,uint256)", +"87529f0f": "getTeam(address)", +"8752cff2": "isUserExisted(address)", +"8753b16e": "requestOwnership(address)", +"87541c9e": "setLLV_edit_3(string)", +"87543ef6": "upgradeController()", +"87548fcf": "getTracks()", +"8754b1d1": "createPainting(address,uint256,uint256,uint8,uint8,uint256,uint256)", +"8754b29c": "buyCore(address,address,uint256)", +"87551db0": "getChecksum(string,string,string)", +"8755b065": "initialTransfers(address[],uint256[])", +"875606a1": "freezeTransfer()", +"8756f3e7": "LogErrorMsg(uint256,string)", +"8757a2cd": "test_depth(uint256,uint256)", +"8757d620": "firstBuy(string)", +"87585707": "buyVouchers()", +"87586b32": "getPI_edit_2()", +"8758ba8f": "approveForGeneLab(uint256)", +"875991eb": "dealLog(uint256[2],bytes32,bytes32,uint8)", +"875999e0": "getLastKeyTime()", +"8759afc9": "_initStages()", +"8759c2f1": "getHappinessCitizens(uint256)", +"8759d1c3": "sendReceivedTokens(address,address,uint256)", +"875a8dfc": "post(address,string)", +"875ac8f1": "PAYOUT_DATE()", +"875ad967": "DopeRaiderCore()", +"875c330c": "LogPush(address,uint128,string)", +"875c7143": "setSecondYearAllowancePercentage(uint8)", +"875cb3e5": "closeSuccess()", +"875dc0ee": "changePaymentDestination(address)", +"875de431": "phaseOneBonusPercent()", +"875e7bb4": "FactoringChain(address)", +"875ea5e7": "dividend(uint256)", +"875ed7ae": "unitEquippedItems(address,uint256)", +"875f0671": "crowdsaleStatus()", +"875f71a3": "ETHDistributor()", +"875fde3d": "createErc20Token(string,string,uint256,uint256)", +"876012fc": "composeJingle(string,uint32[5],uint8[20])", +"87609d1a": "__price()", +"8760b171": "getBPhashFromBPTokenId(address,uint256)", +"87612102": "loadRefund()", +"87615cb2": "enableRegulator(address,string)", +"8761fb7c": "escrowAdmin()", +"87627869": "setCopaMarketAddress(address)", +"8762d50b": "_xx()", +"87630a2e": "activateContract(address,address)", +"876339b8": "_sellPutToOpen(uint256,uint256,uint256,uint256,address)", +"8764159e": "findContractByModName(string,string)", +"8764edd0": "VerificationAccountOnJullar()", +"876588b8": "Apply_Store_Id_Fee()", +"876590c3": "setTeamPrice(uint256[],uint256[],uint256)", +"876777d0": "TTCoin()", +"87679684": "checkProof(bytes,uint256,bytes,bytes)", +"876848d3": "valid(uint80)", +"876911ca": "ArrAccountIsFrozen(uint256)", +"8769817a": "CROWD_WEEK1_BONUS()", +"87699aa6": "TOKENMOM()", +"8769bc7e": "currentSpiderOwner()", +"8769beea": "openESOP(uint32,bytes)", +"8769c281": "allowRefunds(bool)", +"8769c28c": "bogotacoin()", +"876b0946": "NucleusVisionToken()", +"876b0a95": "getDiceWinAmount(uint256,uint256,bool,bool)", +"876b1566": "getTokenHolders()", +"876ba3cd": "transferModeratorship(address)", +"876cf0ef": "getCrystals(address)", +"876da006": "TOKECOIN()", +"876e79f6": "targetDiscountValue7()", +"876ee240": "EthWuxia()", +"876f1c27": "replaceAnimal(uint16)", +"876f20b1": "crownSymbol()", +"876f5746": "ShitcoinCash()", +"876f9795": "mineSalary(uint256)", +"877046a2": "CGCCoin()", +"87708311": "OBEFAC(address)", +"87717cb1": "_hackoinToken()", +"8772a23a": "configured()", +"8772ae3c": "setMinimumBet(uint256)", +"87730ed7": "allocateFundsBulk(address[],uint256[])", +"87734d53": "getBet(address,uint256,uint256)", +"8773c0d0": "buySoul(address)", +"8774e5d0": "setPriceInWei(uint256)", +"87757835": "Ducker()", +"8775a557": "DadaCollectible()", +"877653f0": "_storeBalanceRecord(address)", +"8778205d": "TransferDisable(uint256)", +"8778c090": "arrayOfNonTrivialAccounts()", +"87793dc7": "invokeOnceFor(address)", +"877aaf4f": "tosToken()", +"877af5b4": "subFundAccount()", +"877b9a67": "isIssuer(address)", +"877c2184": "getIntValue(string)", +"877c3650": "getproductprices()", +"877c4f6e": "submitPeriod(uint256,bytes32,bytes32)", +"877cedb8": "Lockup12m(address)", +"877d481c": "startStage3()", +"877ddd77": "commission_ratio()", +"877f5618": "isAllowClaimBeforeFinalization()", +"87800ce2": "MD5FromMarketingKeywords(string)", +"87801cc3": "setNextRoundDonation(uint256)", +"87804708": "_validate()", +"8781249f": "getCntByRarity(uint8)", +"8781382e": "WBU()", +"878170d1": "fetchValue()", +"878314c9": "crowdsale_eth_fund()", +"878377e7": "RAM_Token()", +"8783bf1a": "EGGS_TO_HATCH_1DRAGON()", +"8783d407": "feeReplyThread()", +"87848727": "writedb(string,string,string)", +"8784ea96": "getCommit(bytes32)", +"87864af8": "UNFREEZE_TEAM_BOUNTY()", +"87873b6d": "MoneyTreeToken()", +"87874e02": "getNextAvailableLevel()", +"87877e4d": "setSponsor(string)", +"8787c9ff": "approveCertificate(address,address)", +"8787f75d": "Kodobit()", +"878808af": "tokensSoldGoal()", +"87881ede": "getStackholderConfirmations(uint256)", +"8789dfbf": "instContAllocatedTokens()", +"878a18ef": "tokensSentDev()", +"878c1484": "cause()", +"878d4204": "testInitialCrowdsale()", +"878d5ff7": "partnerInfo(address,address)", +"878de0ae": "userEndGameConflict(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,uint256,address,bytes,bytes32)", +"878e10e4": "SEHR_WALLET_ADDRESS()", +"878e8827": "getActionParameterByIndexes(uint256,uint256)", +"878eb368": "cancelAuctionWhenPaused(uint256)", +"878eb4ca": "serviceDeposit()", +"878edb66": "getVotesByPollingStation(address)", +"878ef7fe": "RealMadrid()", +"878fb316": "btycsell(uint256)", +"87902997": "acceptAndAdditionals(bytes32,uint256[])", +"87903097": "timeoutPlayer(uint256,address,uint256,uint8)", +"879125a4": "setMaximumRate(uint256)", +"87914c6f": "prolongateContract()", +"879206a2": "lastPayerOverflow()", +"87924815": "ownerAddressSize()", +"87925132": "PandaCore()", +"879281c4": "login(bytes32)", +"87932e0f": "setAddress(bytes32,address,address)", +"87934ec8": "skinCreatedLimit()", +"8793ae52": "getCurrentDaoStakeSupply()", +"87943859": "getRefBonus()", +"879499f4": "newUriBase(string)", +"87950f49": "setDistributorAddress(address)", +"879611bb": "removeGlobalConstraintPost(int256,address,int256,address)", +"879647e2": "getindex()", +"8796a7ba": "totalPrivateSaleStage()", +"8796d43d": "activeToken()", +"8796ec86": "getDocumentHash(uint256)", +"879736b2": "swapValidatorKey(address,address)", +"87982928": "launchPeerWallet(address[],address[],uint256[])", +"879844b9": "crowdsaleAddressSet()", +"87986f52": "getOrderSupportCancel()", +"879a2d2a": "getApplication(address)", +"879a6f7a": "recoverWarriors(uint256[],address[])", +"879a83fc": "LogWithdraw(uint256)", +"879abc11": "applyRuntimeUpdate(address,address,uint256,uint256)", +"879b18b6": "getMemberCanVote(address)", +"879bfa27": "Investors()", +"879ce676": "withinExecutionLimit(uint256)", +"879cffdf": "TokenBuy(address,uint256,uint256,string)", +"879d46fd": "DAOTrust(address,address,bytes,uint256,uint256,uint128)", +"879e4b1a": "empty(bytes32)", +"879e84ab": "minChequeValue()", +"879f30ad": "burnSent(uint256)", +"879f4dfe": "_getCampaign(bytes32)", +"879f9c96": "purchased()", +"87a01164": "teamTransferFreeze()", +"87a04b67": "KUYOOToken()", +"87a07692": "setWinner(string,uint8)", +"87a07adb": "getSharedAccounByIndex(uint256)", +"87a09877": "AdvisorGPX(address[],uint256)", +"87a16f12": "addScriptExecutor(address)", +"87a2a9d6": "_MAXIMUM_TARGET()", +"87a2afb3": "releaseBets()", +"87a378fb": "holdSubscription(uint256)", +"87a3903e": "buy(uint16,uint16,uint16,uint16)", +"87a3be75": "init(address,uint256[],address[])", +"87a3e445": "icoBonus4()", +"87a407a1": "setBurner(address,address,bool)", +"87a675ca": "DataContacts(address,address,address)", +"87a767e3": "removeCA(address,address)", +"87a796a1": "_fetchCancelledOrdersForPayer(address)", +"87a846a5": "getBonus(uint256,uint256,uint256)", +"87a88c43": "iDistribution()", +"87a91506": "PlayChainPromo()", +"87a97752": "setInitialEnemyCombination(uint32[4])", +"87a9a8ef": "totalSupplyAtCheckpoint()", +"87a9be0d": "BitSelectArrojado()", +"87a9c6c5": "buyAndTopup(address)", +"87aa14d2": "freezeEventOutcome(uint256,uint256)", +"87aa2bf9": "rmul(uint128,uint128)", +"87ab42b3": "MysteriumTokenDistribution()", +"87ab8403": "transferScoreToAnother(uint256,address,address,uint256)", +"87adab57": "VISTAcoin()", +"87ae00a3": "ZebiMainCrowdsale(uint256,uint256,uint256,address,uint256,uint256,address,address,address,uint256,uint256,uint256,uint256,int256,uint256)", +"87ae0dbe": "yearSeconds()", +"87af74ab": "calculateNumberOfNeighbours(uint256,address,address)", +"87afe179": "getTotalTicketSetsForRound(address,uint256)", +"87b01dc9": "setSale(uint256,bool,uint256)", +"87b0be48": "releaseTokens(address)", +"87b0d60c": "sumICO1()", +"87b15c0b": "periodITO_wei()", +"87b234ec": "createReferralGiveAways(uint256,uint256,address)", +"87b261ad": "coeff()", +"87b2fe7f": "luckynum()", +"87b30845": "exchangeDIDForEther(uint256)", +"87b3be7d": "Ring()", +"87b47e4f": "transSupply()", +"87b4e60a": "newTokens()", +"87b547e5": "balanceOfDirectoryToken(uint256)", +"87b551b5": "tokenPayout()", +"87b55705": "mintingThreshold()", +"87b57fa7": "GetMinerRigsCount(address,uint256)", +"87b5914c": "exchangeRateETHToUSD()", +"87b5c21f": "OCTWasteToEnergyJV()", +"87b5f114": "xpTokenAddress()", +"87b73795": "verifyKYC(address,address)", +"87b751ae": "TokenTrader(address,uint256,uint256,uint256,bool,bool)", +"87b7a068": "updatesAreAllowed()", +"87b8963c": "badgeDecimals()", +"87b9a544": "DataController(address)", +"87b9e310": "nominPool()", +"87ba67be": "nextLevelPercent()", +"87ba67dd": "Arascacoin()", +"87bab806": "getNumOrganizers()", +"87bb25b5": "UndermineComponent(uint256,address,uint256)", +"87bb675c": "indexTracker()", +"87bb6aa6": "_revealBid(bytes32,address,uint256,address,address,bytes32,uint256,uint256)", +"87bb7ae0": "getTicketPrice()", +"87bc0fc6": "TokenAirdrop(address,uint256)", +"87bc6906": "BitGuildTrade()", +"87bd499b": "lastLevelChangeBlock()", +"87be727b": "getSum(uint16)", +"87bea35f": "getCreatePrice(uint16,uint256)", +"87bf26b9": "GetGrade(uint256)", +"87bf740b": "YYToken(uint256,string,uint8,string)", +"87bfce9e": "claimedYesterday()", +"87c00626": "calcTokensToEthers(uint256)", +"87c05510": "setNewlockAccount(address,uint256,uint256)", +"87c19bcb": "votelog(bool,address,uint256)", +"87c1be6e": "globalPause(bool)", +"87c1ed12": "transferToOwner(uint256)", +"87c23143": "totalEthBankrollCollected()", +"87c2ee62": "secondStageEndsAt()", +"87c38114": "Emojicoin()", +"87c4aaea": "totalTokenVested()", +"87c50df5": "erectBarrier(uint16,uint8,uint8)", +"87c55589": "blockTube(uint256,string,uint8,string)", +"87c5d1be": "LEDTEAM_TOKENS()", +"87c60d89": "getAllSubcontracts()", +"87c70d21": "expressReloadNums(uint256,uint256,uint256[])", +"87c79d1d": "getColors()", +"87c84933": "LogParticipation(address,uint256)", +"87c86277": "setPetName(string,uint64)", +"87c8ab7a": "changeAllowance(address,address,uint256)", +"87c95058": "setAdministrator(address,bool)", +"87cb15f7": "move(uint256)", +"87cc1e1c": "setExporterBank()", +"87ccb440": "getReg2()", +"87ccb57b": "testExecuteSellOrderShouldNotChangeBuyerBalance()", +"87ccccb3": "PublicMine()", +"87ccd8b3": "_isComplete(uint256)", +"87cef144": "updateVIPs(address)", +"87ceff09": "getBlockTime()", +"87cf34cf": "getUserContributionReclaimStatus(address)", +"87cf7768": "walletG()", +"87cfc1d8": "disableAgency(address)", +"87d14a36": "MaxPlayers()", +"87d25299": "tessrX()", +"87d2544d": "CMOSignature()", +"87d3525f": "CancelSimpleOffer_internal(uint256,bool)", +"87d36176": "False()", +"87d3764b": "ROLE_LEVEL_PROVIDER()", +"87d3a184": "makeZero(uint256)", +"87d4ca93": "escrowFrom(address,address,uint256)", +"87d517c9": "fetchInitialDetails(string)", +"87d5418f": "aSetEnd(uint256)", +"87d570c0": "OHGRiverResort()", +"87d5c6b8": "rentalElapsedTime()", +"87d67208": "changeIcoStartBlock(uint256)", +"87d741c9": "getPaidETHBack()", +"87d76f09": "calculateEstimateToken(uint256)", +"87d79f8a": "buyIceDrangon()", +"87d7d24d": "ownerconfirm()", +"87d803a3": "setResult(uint8,uint8,int8)", +"87d81789": "payments(uint256)", +"87d87090": "setMinRefEthPurchase(uint256)", +"87d9d224": "TokenDistribution(uint256,uint256,uint256,int256)", +"87da18ee": "getRankPriceEth(uint256)", +"87da3208": "CollateralToken(string,string,uint256,uint8)", +"87da9cad": "ApprovalToken(address,address,uint256)", +"87db03b7": "add(int256)", +"87dba600": "_set6()", +"87dc0c55": "getAuctionEnd()", +"87dcd2b6": "superOwner()", +"87dcfd2d": "numTokensLeft()", +"87dd1908": "_voteAndContinue()", +"87ddc521": "rewardController(address,bytes5)", +"87dde4ad": "get_candidate(uint8)", +"87ddf6cd": "setAddressArrayIndex(bytes32,uint256,address)", +"87def081": "getFeeRecipient(int256)", +"87df4838": "CancelSell(uint256)", +"87dfc909": "queryMap(uint8,int256[],int256[])", +"87e06546": "PLATINUM_AMOUNT_XPER()", +"87e0f794": "TwistoToken()", +"87e1029a": "newStar(uint8,uint8,uint256)", +"87e12235": "_filiate()", +"87e19cc5": "EBETCrowdsale()", +"87e25e0e": "deleteCertificator(address)", +"87e412f4": "SecurityDeposit(address)", +"87e42622": "KONSTANTOR()", +"87e44935": "IDOToken()", +"87e46baf": "transferVoxel(address,uint8,uint8,uint8)", +"87e4e64d": "getBalanceMy()", +"87e6835f": "tokensDrukker(address,uint256)", +"87e70933": "VoteMusic(uint256,address)", +"87e7dc5f": "ICOStarted(uint256,uint256,uint256,uint256,uint256)", +"87e854d3": "addRate(address,uint8)", +"87e89845": "getBabyMommas(uint256)", +"87e8a980": "godChangeGod(address)", +"87e97e82": "AuctionStarted(bytes32,uint256)", +"87ea8581": "setTemp(uint40)", +"87ea8893": "PGGameToken()", +"87ea9d52": "INK()", +"87eba3c7": "GetBuyingTokenAddress()", +"87ebd76c": "initContract(string,string,uint256,uint256)", +"87ecaf0d": "check2(uint256,uint256)", +"87ed1bd0": "grantAccess(address,uint8)", +"87ed5112": "setApoderadoVerify(bytes32)", +"87ed90ba": "securityWallet()", +"87edb2f5": "decode(bytes,uint256,uint256,uint256,uint256,uint256)", +"87ede474": "MicinRasaJamur()", +"87eeddf8": "confirmAndExecuteWithdrawal()", +"87efeeb6": "singularDTVToken()", +"87f06ec0": "getForkDurationSeconds()", +"87f0b8c5": "getStrong(address)", +"87f0bf31": "addResources(address[],bytes4[])", +"87f0fae9": "setKingdomFactory()", +"87f162c8": "initialEBETSupply()", +"87f1e7f3": "c_softCapUsd()", +"87f24484": "hashPass()", +"87f29fdd": "removeDiscountPhase(uint256)", +"87f3e5d6": "contributorsOfCauldron(uint8)", +"87f404cd": "getContractRhemBalance()", +"87f40ba4": "supplyReserveVal()", +"87f503fd": "DEV_TEAM()", +"87f51ac2": "athToken()", +"87f5c846": "ethBalanceOfNoFee(address)", +"87f6be15": "houseCredits(address)", +"87f74e7c": "updCouponBonusConsumed(string,bool)", +"87f7cab9": "removePerson(bytes32)", +"87f7e2a1": "getTeamCost(uint256)", +"87f9534b": "getLinkedIn()", +"87fc00f7": "setTPTContractAddress(address)", +"87fcd708": "StartICO(uint256)", +"87fcdbc1": "updateConversionRate(uint256)", +"87fd0421": "TheEthereumLottery()", +"87fdc401": "make(address,uint256,bytes)", +"87feba8f": "getInstallmentDuration(uint256)", +"87fef15b": "purchase(bytes32,bytes32,bytes32)", +"87ffe5a7": "dataSourceGetRedCards()", +"8800052e": "preSaleTokensLeftForSale()", +"88016da5": "allocateFrom(address,address,uint256)", +"88017e05": "setContribution(uint256)", +"8801b4fc": "paused_()", +"8801c928": "createJob(bytes32,uint256)", +"88026706": "Template()", +"88034bc5": "CreateTIX(address,uint256)", +"88037e1c": "view_get_gameData()", +"88046818": "getFeeSharingWallets()", +"8804863f": "payWithToken(uint256,address,address)", +"8804d119": "sendNextRewardTo(address)", +"88053eef": "RebuyInformEvent(address,uint256)", +"88054039": "NordstromOnlineRetailDigitalCoin()", +"880613ee": "getMadeTXCount()", +"88064637": "registerAssetDetail(int256,string,string,string,string,string,string,int256)", +"88064b07": "setNextLotteryTTMTokenId10(uint64)", +"88065236": "approvedAmount(uint256,address)", +"88072700": "itemIndexToApproved(uint256)", +"8807592c": "_calculateCommission(uint256)", +"88077b51": "setPrivateFundEnd(uint16,uint8,uint8,uint8,uint8,uint8)", +"8807a110": "isCrowdsaleClosed()", +"8807a468": "getOrgByIndex(string,uint256)", +"8807f36e": "lastInitializedRound()", +"88088a54": "getTransformState()", +"8808f3d0": "canPledge(uint256,uint256)", +"8809540d": "globalReinitialization()", +"8809716c": "setDungeonDifficulty(uint256)", +"880a0664": "getRoundFinish(uint32)", +"880ad0af": "transferOwnership()", +"880ade5b": "foundNewGamblingParty(uint256,uint256,uint256,uint256,uint256,uint256)", +"880b36e7": "getLastCaller()", +"880b844f": "getRoundWeight(uint256,uint256)", +"880c0b9d": "lpAskPrice()", +"880c5f3d": "EtherBTC()", +"880c7864": "ResearchGroupAddr()", +"880cab29": "Founder2()", +"880cdc31": "updateOwner(address)", +"880cfc2f": "deposite(address,uint256)", +"880dc4e6": "isWithdrawEnabled()", +"880e73a3": "OTA()", +"880e87ed": "setUnlimitedMode(bool,address)", +"880ead7e": "returnOtherCrypto(address)", +"880fc14c": "inRate()", +"88102583": "safeCastSigned(uint256)", +"881056ba": "GMR_TOKEN_SALE_CAP()", +"8810ac6c": "BuyCarFailed(address,uint256,uint256)", +"8810c990": "sha3(string)", +"88116d13": "checkReferalLink(uint256)", +"8811a0ae": "addressCount(address)", +"8811e191": "setDebugMode(bool)", +"8812e897": "getCurrentBonus(address)", +"8812ec52": "adviserWallet()", +"8813304b": "forwardOnBehalfWithRevert(address,uint256,bytes,uint256,uint8,bytes32,bytes32)", +"881362b4": "changeUserInfo(bytes32)", +"881461be": "burnAddress(address)", +"88149fb9": "beginTime()", +"8814fa3f": "Log0(string)", +"88157942": "icoStartP3()", +"8815ee86": "purchaserList(uint256)", +"8815f3d3": "judgement(bool)", +"8817a198": "priceToBuyInFinney()", +"8817ecde": "_getPeriodFor(uint256)", +"88180ff6": "underwrite(address,uint256)", +"88185aad": "airDropTokens(address[],uint256)", +"8819dd8e": "getCurrentPeriodKey()", +"881abe3e": "addProposalVote(uint256,address)", +"881adeaa": "abioToken()", +"881b2666": "xTokenPercent_()", +"881be8f7": "undo()", +"881c255e": "updateStageBySaled()", +"881cfeb6": "addInternal(address,address)", +"881d3bd0": "LongBought(address[2],uint256[3],uint8,bytes32[3],uint256)", +"881dac8e": "ECHO()", +"881ed6db": "lockStart()", +"881eeaa5": "createEstateWithMetadata(int256[],int256[],address,string)", +"881eff1e": "setMaxBet(uint256)", +"881fae6c": "endSTO()", +"881fcab3": "getShipProductCurrentPriceByModel(uint16)", +"881fcefc": "updateEnabled(string)", +"881fd690": "isSecondStageTokensMinted()", +"881fe0ce": "ZealconToken()", +"881fe258": "_emitRecord(bytes32,uint256,uint256,uint256)", +"88203417": "AthleteTestToken()", +"8820401a": "_tokenPurchase(uint256)", +"8820e2d6": "newVote(address,string,uint256,uint256,uint256,uint256)", +"8820f6bd": "economy()", +"8821bb43": "change_owned(address)", +"8822048e": "isTransferAllowed(address)", +"8823a9c0": "changeFeeTake(uint256)", +"8823da6c": "removeAccess(address)", +"88254efa": "hideSubcategory(uint256)", +"88257016": "getNthBallot(bytes32,uint256)", +"882645fe": "preICObonusMultipiersInPercent(uint256)", +"8826ce84": "uint8ToString(uint256)", +"8826db7a": "getNextPoliceAssignment(address)", +"8826fa2e": "setStakedBalances(uint256,address)", +"88275b68": "mintLockupTokens(address,uint256,uint256)", +"88279320": "prizeValue()", +"8827a985": "durationPhaseIndex()", +"8829a5a7": "transferAndWriteUrl(address,uint256,string)", +"882a1dee": "KrisTest()", +"882a1fa0": "getDivCard(uint256)", +"882b4e68": "User_2()", +"882bc3e1": "RemoveAllConsentDirectives()", +"882d851c": "tokenMinus(address,address,uint256)", +"882dd41e": "updateTokenBalance(uint256)", +"882e2606": "icoEndLine()", +"882e9709": "record(string,string,string,bool,string,string,string)", +"882ee532": "getBylawsMilestoneMaxPostponing()", +"882f327b": "addLock(address)", +"882f3e16": "forceWithdraw(address)", +"882f7e83": "changeRigoblockAddress(address)", +"88301f57": "subDevOne()", +"88308ca1": "hardCapInCents()", +"8830a718": "BTHRTokenSale(uint256,address)", +"8830e09a": "ATTContribution()", +"88318834": "abandon()", +"8831e9cf": "setPlatformWallet(address)", +"8832243a": "profitSharing()", +"8832bc29": "ETH_PRICE()", +"8832ebe8": "lolita()", +"88331b6f": "amountPower()", +"883356d9": "isBurnable()", +"8833ae6f": "aquaman()", +"8834277e": "emitErrorCode(uint256)", +"8834526a": "MARKET_CAP()", +"883462ca": "removeFromKyc(address)", +"8835097d": "assignedAmountToPrivateEquityFund()", +"88352a29": "signedApproveAndCallHash(address,address,address,uint256,bytes,uint256,uint256)", +"8835ba24": "Legolas()", +"88362d4b": "setDailyLimit(uint256,uint256)", +"88369d6b": "getTokenBalance(address,address,bytes32)", +"8836f3ef": "getNumberOfBounties()", +"8838af8a": "rarityMultiplier()", +"8838b68e": "etherLeft()", +"88394fdc": "startRoundA()", +"8839515c": "OWN_ChangeToken(string,string,uint8)", +"88398fbc": "PreSaleHardCap()", +"883a3ea8": "LottoNumberTest()", +"883a584c": "RichiumToken(uint256,string,string)", +"883a6476": "IsAirDropEnabled()", +"883a92e1": "setFreezeEndTime(uint256,uint256)", +"883a98e7": "addTileBonus(uint256,uint256,uint32[8])", +"883ba26b": "getIsSettled()", +"883ba466": "changeHiddenOwnership(address)", +"883cd1a5": "cloudsPerEth()", +"883cdeb9": "newTrack()", +"883cf630": "resetBucket()", +"883d0ac6": "totalnSupply()", +"883dfaba": "getWinBalancesOf(address)", +"883fd348": "hasAvailableRewards(address)", +"883fdd6f": "IWABOO()", +"88400fbe": "ICO_TEAM()", +"884095f6": "getWineryMappingID(string,string)", +"8841520b": "SpinnerCountsByAddress(address)", +"88416792": "usersPause()", +"88417820": "LBSN()", +"884179d8": "ipfsAttributeLookup(address)", +"8841937a": "setTileHp(uint16,uint8,uint32)", +"8841ac11": "buyItem(uint256,uint256,uint256,uint256)", +"8841dd3c": "thirdRewardPeriodPercent()", +"88426aec": "getStageDeadline(uint8)", +"8842bfa0": "Chain4()", +"8843641e": "removeAmountForAddress(uint256,address)", +"8843c1ba": "listAcceptedTokens()", +"8843c222": "MIN_ACCEPTED_AMOUNT_FINNEY()", +"8843ffba": "signup(uint256)", +"88445e29": "sha3(uint256)", +"884543c0": "TokenBought(address,uint256,uint256,uint256)", +"8846594b": "checkKYC(address)", +"8847092d": "upgradeMaterial(uint256)", +"884790de": "agentInvo(address)", +"8847df97": "ChangeEmissionRate(uint256)", +"88482233": "Lizambo()", +"884870c7": "setParameters(uint256,uint256)", +"884879d6": "startSecondStage()", +"88488c33": "finalizeTask(uint256)", +"8848fb0d": "addEmployerJob(address,address,uint256)", +"884a2308": "setCompte_5(string)", +"884a26da": "massBurn(uint8[],address[],uint256[])", +"884a47b4": "setNews(string)", +"884ade03": "ForceSeller(address)", +"884ae10b": "saleWalletAddress()", +"884b5dc2": "fill(uint256[])", +"884b850b": "BurnAssignedFees(address,address)", +"884bf67c": "getPrizePool()", +"884c1480": "LacesToken(uint256,string,string)", +"884c6440": "BuyItem(uint256)", +"884ca7b1": "getButtonPrice()", +"884edad9": "Withdraw(address,uint256)", +"884f3db0": "check_the_rule(address)", +"884fafcd": "totalJackpotEven()", +"88508a18": "getRecentPlayers()", +"885124c0": "Coin5941()", +"88516a89": "ownerFraction()", +"88519ea4": "availablePreICO()", +"8852024f": "max_TotalSupply_limit()", +"88524780": "saleAuctionERC20()", +"885349a2": "payToBank(uint256)", +"88535e90": "changeMinimumContributionForPublicPhase(uint256)", +"8853636b": "revealResult(uint256,bytes32)", +"885363eb": "landOf(address)", +"88537daf": "checkMiningAttempt(uint256,address)", +"88538c36": "candidateInformation(uint256)", +"885463fd": "strategicAllocation()", +"8854baa8": "AddReturnsMapping(uint256)", +"88550b6a": "getTokenBuyPrice()", +"88559aaf": "processAllocation(address,uint256)", +"8856cd84": "medicaxess()", +"8856d517": "GetReferralInfo()", +"8857322d": "DOLLAR_DECIMALS_MULTIPLIER()", +"885819c2": "getVatIdByAddress(string)", +"8858287b": "vendorCount()", +"8858ad6c": "Exploreon()", +"8858adc6": "setColor(uint16,uint24)", +"8858fa3b": "totalEthReceivedInWei()", +"8859c6d6": "operatorCampaignID(address,uint256)", +"885a3b75": "currentTotalSupply2()", +"885a5ec2": "lastBlock_f10()", +"885a5ef2": "getMinEtherInvest(uint256)", +"885b63da": "setAuctionStartBid(uint256)", +"885b6cfb": "addZethrAddress(address)", +"885c69b5": "clearMetadata(address)", +"885e2750": "groupsCount()", +"885e401e": "lifeFactor_i()", +"885ec18e": "left6(uint256)", +"885f5011": "calcRatioNext()", +"8860565f": "GetBeneficiaryInfo()", +"8860805a": "extractMax()", +"8860bf94": "showworker()", +"8860d49f": "_transferInternal(string,address,string,address,string,uint256,uint256)", +"8861026f": "complianceWallet()", +"8862198a": "MasterContract(address)", +"8862d26a": "offeringType()", +"88631e18": "distribute(address,uint256,uint256,address[],address,uint256[])", +"88635b06": "createContractPerson(string,uint256,address)", +"8863c8d5": "concludeCrowdsale()", +"8863dd1a": "transferOwnerShip(address)", +"8863f31d": "Controller(address,address,address)", +"8864a5fd": "processPendingTickets()", +"8864d074": "RADCOIN()", +"8865015d": "g(uint256[20])", +"886588ac": "confirmVerbose(bytes32,address,uint256,bytes)", +"8865cbd6": "cancelAllOrdersByTradingPair(address,address,uint256)", +"88668d21": "getReplyRaw(bytes32,uint256)", +"88671acc": "FundAllocation()", +"88672f82": "setEtherRate(uint256)", +"88684aa5": "nextUnLockTime()", +"88685cd9": "releasePayment(uint256)", +"886b148d": "setPropertyPrivateModeEarnUntilLastUpdateBecomePublic(uint16,bool,uint256,uint256,uint256)", +"886b4954": "secToNextInterestPayout()", +"886bb359": "chown(address)", +"886bbe0c": "submitProof(bytes32,bytes32,uint256[],bytes,uint256)", +"886c0ee6": "Develop()", +"886d3db9": "uintToBytes32(uint256)", +"886d969b": "calc_partnerPercent(uint256)", +"886db803": "_setBigWinner(address,uint256,uint256)", +"886e549b": "PineappleArcadeTrophy(uint256)", +"886ed2d1": "enableRealWorldPlayerMinting(uint128[],bool[])", +"886ef644": "getRate(address,uint256)", +"8870155c": "getNumTknOfferors()", +"88702cc4": "debug_hash256Double(bytes)", +"88705f7d": "NeoCrowdsale(uint256,uint256)", +"8870985b": "getFreeBalance(address)", +"887159a2": "treatRemaintoken()", +"887240d0": "generateFileID(string,string,string,string)", +"887263cf": "EnigmaToken()", +"88727ba9": "_depositEthers(address)", +"8872bb2a": "_createElement(bytes32,uint256)", +"8872c094": "getUnsoldToken()", +"8872c68a": "sampleStorage()", +"8873704c": "addRequest(string,address)", +"8873d247": "THANKSTEST()", +"8874fa28": "CurrentRevision()", +"88753343": "maxResolvedAgonId()", +"88758581": "unregisterEmployee(address,address)", +"8875a40b": "endTimeTLP2()", +"88760a18": "loadStarbaseEarlyPurchases(address)", +"887651cc": "isAlreadyIn()", +"887699f3": "periodContributionOf(uint256)", +"88770cb0": "extendEndTime(uint256)", +"88776a7e": "testThrowTranferFromEmptyBalance()", +"88780b8e": "safeBalance()", +"88782386": "UnicornMilk()", +"8878356d": "testBetAmount()", +"88786272": "startingTimestamp()", +"8878990e": "changeCollateralSeizer(address)", +"8878adac": "refund_claims(string)", +"8878d726": "buySpecialBuilding(uint256,uint256,uint256)", +"8878db7f": "setCRYPTON_CUT(uint16)", +"887a8e33": "AgencyLock1()", +"887b00db": "TESTTESTICO(address,address,address,address)", +"887b1b0b": "recalculateTokensToBuyAfterSale(uint256,uint256[])", +"887bae74": "addReferenceParentWineryOperation(string,uint256,string,address,int256)", +"887bbef5": "setMinInvestment(uint256,uint256)", +"887bdcfc": "accountBalance(address,address)", +"887c3e5d": "updateAddress(bytes32,address,address)", +"887c4646": "approveIndexedByAddress(address,address,uint256)", +"887c4f68": "ludumTokensPerEther()", +"887c7f92": "remainingReserveSupply()", +"887ccc82": "getStake(uint256,uint256,address,bytes32)", +"887cfc3e": "orderToTransfer(address,address,address,uint256,string)", +"887d23a6": "isBeforeEndTime()", +"887d813d": "serviceGroupGet(address)", +"887e0c07": "runPlugin(address,uint40,uint256)", +"887e22b1": "tier5Time()", +"887f6178": "genericTransfer(address,uint256,bytes)", +"887ffc9c": "referalPayByNum(address,uint32)", +"88806b37": "transferZone(uint256,address)", +"8880a933": "transferTokensToNonEthBuyerToMany(address[],uint256[])", +"8881d3a2": "CompensationFailEvent(address,uint256)", +"8882349b": "vppToken()", +"88824bd1": "PonziUnlimited()", +"88827c16": "addPost(bytes32)", +"8882ddc9": "maxCharacters()", +"8883478e": "preicoAndAdvisors()", +"8883c52a": "getNumberOfAssetPacks()", +"88840671": "Milkcoin()", +"888419ed": "setData_8(string)", +"88849e71": "BasketToken(address[],uint256[],uint256)", +"8884b807": "getVoters(uint256,uint256)", +"8884cd7c": "changeBuyFlag(bool)", +"8884fbec": "checkTotalsAndMintTokens(address,uint256,bool)", +"8885f2a3": "setzBool(bool)", +"88865347": "grapesToBuildWinery()", +"88865ee3": "cleanupEven()", +"8886a667": "registerNameXIDFromDapp(address,bytes32,bool)", +"8886ca33": "getHeroBP(uint256)", +"88873eea": "blocktubeClip(string,uint256,uint256,address)", +"888764c8": "addBouncer(address)", +"888808ba": "Bittelux()", +"88888f61": "purchase(uint256,bytes32)", +"8889025a": "increaseJackpotTimeAfterBet()", +"88896a0d": "deliverPrize(address,bytes)", +"88897c37": "request_close()", +"888a3f79": "_approvedFor(bytes32,uint256)", +"888aab22": "addWithdrawal(address,uint256,uint256,uint256)", +"888ade0a": "publicKey(address)", +"888b6557": "minFundingGoalWei()", +"888d5917": "limitDateCrowdWave2()", +"888ea120": "saleDeadline()", +"888f2b13": "SALE_RATE()", +"88908546": "refund_eth_value()", +"889087b1": "meltCrystals(uint256[])", +"8890e13d": "isArenaContract()", +"88922e7a": "raiseAppeal()", +"889231c1": "promoLimit()", +"889258ea": "startICOStage1()", +"88929931": "UnlockDateExtended(uint256)", +"8892bb73": "createChildUniverse(bytes32,uint256[],bool)", +"8892d571": "withdraw_Leim(uint256)", +"8893240d": "setPeonyAddress(address)", +"88933e07": "getSMPTokensLeftForICO()", +"8893eb13": "getActivated()", +"88945187": "updatePurchasingState(address,uint256)", +"8894dd2b": "addEther()", +"88951352": "distributeTokens(address[])", +"889569cd": "getKoikeContract()", +"88968b94": "rateOwner(uint256)", +"88968bc3": "clearKyc(address[])", +"8897b1a7": "PRESALE_HARDCAP()", +"8897c1f4": "randomNumber(uint256,uint256,uint256,uint256,uint256,bytes32)", +"8897df9d": "addEpisode()", +"8899568c": "createDefaultZodiac(uint256,uint256,uint256,address,uint256,uint256)", +"8899fa0d": "onUnVote(address,int256)", +"8899fffd": "myFinneyValue()", +"889b59d9": "getDBallotsN(bytes32)", +"889c10dc": "addDelegate(address,address,bytes32,address,uint256)", +"889cd532": "upsertOne(address,uint256,bool,bool,uint256)", +"889d227d": "newPaymentAddress(address,bytes4)", +"889d9550": "getCryptoCupTokenContractAddress()", +"889e175e": "__slash__(address)", +"889e5073": "getStatus(address,address)", +"889eaa0d": "nextRate(uint256)", +"889f0c99": "withdrawFor_(address)", +"889fa1dc": "getFighter(uint256)", +"889fb53e": "incrementCoin(address,uint256,bool)", +"88a0e990": "BridgeTheChain()", +"88a12f7a": "_getUint(bytes4)", +"88a15f11": "secondMaxAmount()", +"88a17bde": "allocation()", +"88a1e895": "test2Fails()", +"88a2653c": "unwhitelistAddresses(address[])", +"88a2995d": "MyToken(uint256,uint256,string,string,uint256)", +"88a49164": "testErrorUnauthorizedTransfer()", +"88a4e86c": "balanceOfRaw()", +"88a525c4": "withdrawTokenBalance(uint256)", +"88a55c8b": "setBustRange(uint256)", +"88a6c749": "getFirstTranscoderInPool()", +"88a6cc53": "lockPurchasedTokensClaim(uint256)", +"88a6f02b": "deleteRecord(uint64)", +"88a74525": "fraction(int256,int256,int256)", +"88a79003": "addWhitelistInternal(address,address,bool)", +"88a7ca5c": "onTransferReceived(address,address,uint256,bytes)", +"88a89dd0": "add_to_buy_bounty()", +"88a8b341": "setVoteInternal(uint256,uint160,bool,bool)", +"88a8c95c": "changeDev(address)", +"88a8d602": "management()", +"88a95495": "removeFromMap(uint256[])", +"88aa1001": "checkJoinAirdropQuest(address)", +"88aa8bee": "getTokenDetails(address)", +"88aaa229": "AcceptsIDK(address)", +"88abc4a2": "coinIssuedPrivate()", +"88ac76ca": "cthereum(uint256,string,uint8,string)", +"88ad52f0": "DouYinToken()", +"88adbf8f": "addressOfTokenUsedAsReward()", +"88aebe00": "calculateWineBuy(uint256,uint256)", +"88aece7f": "setBuyOrdersContract(address)", +"88aed238": "ixix()", +"88af30c3": "_mainAddress()", +"88af6534": "VRF_EGG_COST()", +"88af883b": "adm_trasfer(address,address,uint256)", +"88af8ed4": "removeInvestor(bytes32)", +"88afdeba": "totalCreatedGame()", +"88afe426": "_removeAgonIdByOwner(address,uint64)", +"88b02acd": "displayTable()", +"88b11ee2": "DZoneCoin(uint256,string,uint8,string)", +"88b2ed1a": "addPlotAndData(uint24[],string,string,uint256)", +"88b322c3": "setAdvisors(address)", +"88b3a538": "projectManagers(uint256)", +"88b44c85": "assertEq(uint256,uint256,string)", +"88b45046": "income()", +"88b4b861": "proposeTo(address)", +"88b51ac0": "gernerateVoting(uint256,uint256)", +"88b55641": "buyTokenIco(address,uint256)", +"88b59734": "vendueClosed()", +"88b5f6f3": "PimpToken()", +"88b75493": "getLastAuditAuditor(address)", +"88b7a17c": "functionName(bytes32)", +"88b7a89d": "test0_create()", +"88b7e6f5": "returnInt128(int128)", +"88b7f5e5": "advisersWallet()", +"88b8c487": "playerWithdraw()", +"88b9022f": "semanticVersion()", +"88b95242": "PricingEnergy(uint256)", +"88b9a469": "initVault(uint256)", +"88b9e10e": "seizeTokens(address,uint256)", +"88bac2b8": "Mediated_Transfer(uint256,address,address,uint256)", +"88bb0c73": "teamsReward()", +"88bb18fc": "mintDSBCToken(address,uint256)", +"88bb6e68": "AkershoekToken()", +"88bb9fb1": "MultivestSet(address)", +"88bc65e3": "getFreelancerAvgRating(address,address)", +"88bec9da": "deleteMember(uint256)", +"88bf60b7": "transferMinimumFee()", +"88bff117": "setDrop(bool,uint256,uint256)", +"88c058a5": "subDefence(uint256,uint256)", +"88c0b8a7": "setChangeFee(uint32)", +"88c0bc8e": "buyTokensWithReferrerAddress(address)", +"88c12be2": "deathData_f0()", +"88c190a4": "NiMingToken(uint256,string,uint8,string)", +"88c2a0bf": "giveBirth(uint256)", +"88c30278": "getMinerOffsetOf(address)", +"88c3ba85": "ParallelGambling()", +"88c3ffb0": "getRoundInfo(uint256)", +"88c463af": "contributorsOfCauldronRound(uint8,uint32)", +"88c4e888": "get_token_state()", +"88c55c47": "initializeVesting(address,uint256)", +"88c600d0": "CryptoCongress(address,uint256,uint256)", +"88c662aa": "getController(address)", +"88c6abf8": "currentIteration()", +"88c7b6e6": "CrowdSaleMacroansyA()", +"88c7e397": "buyable()", +"88c8475c": "batchFreezeAccount(address[],bool)", +"88c8da99": "deactivate_admin_comission()", +"88c912b8": "sendToAddressWithBonus(address,uint256,uint256)", +"88c91d24": "computeCooldownTime(uint128,uint256)", +"88c91fb1": "transferExtender(uint256)", +"88c9a7d5": "setPixels(uint32,uint32[],uint8[])", +"88c9cb3c": "timer()", +"88c9ebbd": "getKeyPrice(uint256)", +"88cac17d": "setNextLotteryTTWTokenId3(uint64)", +"88cb214e": "editWhitelist(address,bool)", +"88cb8a73": "setPixelBlockPrice(uint256,uint256,uint256)", +"88cbc84a": "buyInvestmentPackage(uint256)", +"88cbdf13": "toUint32Throw()", +"88cc58e4": "getFactory()", +"88cc81de": "PaymentExpectationCancelled(bytes8)", +"88cc852a": "notZero(address)", +"88cca295": "addressToPurchasedBlocks(address,uint256)", +"88ccf2b9": "SetTokenInfo(uint256,address,uint256,uint256)", +"88cd2d47": "UserCRUD()", +"88ce3048": "lastweek_winner3()", +"88cee87e": "adminRemoveRole(address,string)", +"88cf2bc6": "buyStarCoin()", +"88cf6648": "liquidationPriceWad()", +"88d0443d": "bounty_address()", +"88d0820e": "selfFreeze(bool,uint256)", +"88d0b42d": "getRecentActivity()", +"88d115af": "PonyCore()", +"88d116b8": "_createPlayer(string,uint256,address,uint256)", +"88d12a4d": "totalWeiReceived()", +"88d18ea4": "featureSprite(uint256)", +"88d21ff3": "pollExists(uint256)", +"88d2faf9": "publishMemberEvent(address,uint256)", +"88d450e4": "setArtistsAddressAndEnabledEdition(uint256,address,address)", +"88d52ef7": "poolContract()", +"88d60e27": "setPercentTokenAllocation(uint256,uint256,uint256)", +"88d695b2": "batchTransfer(address[],uint256[])", +"88d723ac": "TetherToken(uint256,string,string,uint256)", +"88d761f2": "finishMigration()", +"88d7cd97": "externalStorage()", +"88d7e087": "withdrawChi()", +"88d8c702": "Summary(address,uint128[])", +"88d8da5f": "equals(string,string)", +"88d937a3": "createnation(uint16[],string,uint256)", +"88d97c30": "getGroupPageCount(string)", +"88d9fc4d": "updateReserveVault(address)", +"88da9bfd": "getUserNumbersOnEther(uint256)", +"88db84bc": "getRequiredStateChanges()", +"88dbe7a7": "dividendBonus(address,uint256,uint256)", +"88dc0d49": "TRcoin()", +"88df13fa": "multiMint(uint256,uint256[])", +"88df31f0": "minDiscountEther()", +"88dfee60": "setOtherFounder(address,uint256)", +"88e01a98": "closeRound(uint256)", +"88e072b2": "checkTransfer(address,uint256)", +"88e114cc": "log_approve(address,address,uint256)", +"88e16190": "ItemCreatePrice()", +"88e2af0e": "initialBattle(uint256,uint256)", +"88e2ca21": "getClue4()", +"88e2da99": "randDelay()", +"88e2f29b": "updatedPrice()", +"88e3c5d6": "addVerifiedUser(address)", +"88e3cfda": "setResult(string)", +"88e3ffeb": "updateMinimumWeiRequired(uint256)", +"88e47f29": "_ChallengeSucceeded(uint256)", +"88e490eb": "getInfoCellBalance()", +"88e4b6ad": "calculatePotCut(uint256)", +"88e5581e": "twitterDropSingleAmount(address[],uint256)", +"88e62721": "revoke(address,bytes32)", +"88e67d96": "isAccess(address,string)", +"88e694aa": "MANNCOIN()", +"88e765ff": "maxBuyAmount()", +"88e814e6": "getTopPlayers()", +"88e85127": "ModeratorAdded(address,address,bool)", +"88e854e0": "SDR(uint256,string,string)", +"88e8e26a": "ServiceToken()", +"88e90253": "NewRateSet(uint256)", +"88e951dd": "totalContributors(uint256)", +"88e9d45d": "ButtonClickGameContract()", +"88e9fb4f": "keyEmployeesAllocatedFund()", +"88ea41b9": "setMinBet(uint256)", +"88ea70ee": "bountyTokensAddress()", +"88ea8ee5": "bonusCRS()", +"88ea8fd8": "manualUpdatePrice()", +"88eb615c": "LogWhiteListed(address,uint256)", +"88eb7af7": "_isHuman()", +"88eb944b": "addDedication(uint256,string)", +"88ebf975": "setDebt(uint256,address)", +"88ec6f42": "Cef()", +"88ec838f": "configParams()", +"88eccb09": "addLevel(uint256,uint256)", +"88ed8b36": "notRandomWithSeed(uint256,uint256)", +"88ede276": "hasBeenConstructed()", +"88ee4b2d": "_getIdIfValid(bytes32,uint256)", +"88eea4f3": "WhiteBitcoin()", +"88ef59fb": "releaseOldBalanceOf(address)", +"88efc97b": "activateEscapeHatch()", +"88efedf4": "AIRDROPS_PERIOD()", +"88f020bb": "drawWinner(uint8)", +"88f1ccf2": "cancelInvestment(address[])", +"88f2b12e": "SerpentHead()", +"88f34bc2": "depositAndVote(uint256,uint256,uint256)", +"88f53db1": "getDataRequest(uint256)", +"88f5eb36": "exchangeRateForBTC()", +"88f6d5a4": "constructCoinbaseTx(uint256,uint256)", +"88f7c6d6": "setExchangeStatus(bool,bool)", +"88f9ff98": "_random256()", +"88fabb3a": "SetMessage(string)", +"88fad42a": "EthereumRisen()", +"88fb4af0": "ShootRobinHood(uint256,string)", +"88fc0825": "unregisterNode(uint256)", +"88fc176c": "DucToken(uint256,string,uint8,string)", +"88fc65fb": "isTransferable(address,uint256)", +"88fcba88": "fundingDeadline(bytes32)", +"88fd0b6e": "getMembershipPrice(uint8)", +"88fd35e8": "setConfiguration(uint256,uint256,int256)", +"88fdf3d4": "setWinnerPrizes(uint32)", +"88fedd04": "houseProfit()", +"88ff2dcc": "createProject(string,address,address)", +"88ff9416": "initialize(address,address,address,address,address,address,address,address,uint256,uint256,uint256,uint256[])", +"88ffc33e": "bltMasterAcc()", +"88ffe867": "pledge()", +"89009ab0": "purchaseAd(uint256,uint256,string,string)", +"8901b9ae": "withdrawBalanceFromAdmin(uint256)", +"89020fe3": "PacifistFarmer()", +"89029d8c": "get_all(uint256,uint256)", +"89034082": "issueToken(address)", +"8905fd4f": "reclaimERC20(address)", +"89064fd2": "approveWithSender(address,address,uint256)", +"89065e9a": "getPlayerSpaceshipOwnerById(uint256)", +"89077ad2": "SharderToken()", +"8907e787": "isAccountWhitelisted(address)", +"89080102": "verifyDSHash(uint8,bytes,bytes)", +"8908017f": "calculatePhoenixPoolCut(uint256)", +"890814f8": "bountyValue(uint256,uint256)", +"890853d9": "HuatUSD()", +"8908e693": "setTokenCurator(address)", +"890a018d": "externalSales(uint8[],bytes32[],address[],uint256[],uint256[])", +"890a7ef7": "publish(bytes,string)", +"890a9917": "privateSaleMinContrAmount()", +"890ac366": "mintReserve()", +"890b2adc": "Reply(bytes32,bytes32,uint256)", +"890c6848": "WallCoin()", +"890d6908": "solve()", +"890e2a6b": "updInvestorPreSaleEnabled(address,bool)", +"890e839f": "isOnSale()", +"890e9d2f": "getAllowanceSpenderValue()", +"890ea91a": "creditsOf(uint256,address)", +"890eba68": "flag()", +"890ed1cb": "dealHouseCards()", +"890ede44": "TokenCoin5()", +"890f2168": "crowd_end_date()", +"8910b070": "NUC()", +"8910cd58": "substractLockedAmount(uint256)", +"89110058": "Investments(address)", +"89113858": "IHCToken(uint256,string,string)", +"8911cd9a": "silverPercentage()", +"8911cf0d": "unsafeResignOwnership()", +"8911e26b": "isUnrestricted()", +"89128b70": "get_submission_queue_length()", +"8912ab5c": "dropVotes(address[])", +"89135ae9": "setAdministrator(bytes32,bool)", +"891363a6": "lastCWCETH()", +"8913b809": "initPlayers(uint32,uint32)", +"891407c0": "purchaseTo(address,uint256)", +"8914f1e1": "getDepositAmountFor(address)", +"89158ff9": "assignDispute(string,address,string,address)", +"89165dcb": "changeEtherDeltaDeposit(address)", +"8916cbc6": "minRedeem(address,uint256,uint256)", +"8918485b": "setEthlanceSponsorContract(address)", +"8918ab1b": "Sumte()", +"89198fed": "fulfilled(bytes32,address)", +"8919e3b6": "VinzCoin(uint256,string,uint8,string)", +"891a2f31": "buyItem(string,uint256)", +"891a3e23": "gettotalEth()", +"891a8b85": "ethPriceInUSD()", +"891aab6a": "addStaffWhitelist(address[])", +"891acff7": "updatedPrice(string)", +"891c738a": "isTransPaused()", +"891d4fe8": "printContent()", +"891de9ed": "fromTLA(string)", +"891df671": "registeredAt(uint256)", +"891e6f43": "thisContract()", +"891e75bf": "preSaleCreated(uint256,uint256,uint256)", +"891f5ce5": "successfulFunding()", +"891fa67d": "PsyMultiSig(address[],uint256)", +"891fe103": "typeBuffPercentage()", +"89206411": "batchAttachAssets(uint256[])", +"8920bcf9": "mediaToken()", +"8921329f": "registerBlog(string)", +"89222698": "SetWriter(address,bool)", +"89224227": "haltDirectTrade()", +"892250a7": "commonBudgetAdress()", +"89225c5a": "bountyManagerAddress()", +"89231bcc": "getDataNum()", +"89233fbd": "getPlayerGuessNumbers()", +"892412f0": "availableInventoryOf(uint256)", +"89244e2a": "dateEnd()", +"8925d7bb": "getTotalBrags()", +"8925f9e9": "getWorseOrderId(bytes32)", +"89266fca": "tokensSoldOnPublicRound()", +"8926f723": "GMBCToken()", +"89273f15": "addStorage(string)", +"89281963": "setServicestationAddress(address,address)", +"8928378e": "getMarketPrice(uint256)", +"89286abd": "freezeAccountTransfers(address)", +"892886e1": "PresaleTokenPurchase(address,address,uint256,uint256)", +"89291b05": "updateSubscription(address,bool,uint256)", +"892a0e42": "releaseToSeller()", +"892ad596": "changeTimes(uint256,uint256,uint256,uint256)", +"892c0214": "NumberOfCurrentBlockMiners()", +"892cd384": "CreditHydraToken()", +"892d31e8": "setEndCloseSale(uint256)", +"892db057": "isTokenEscapable(address)", +"892dfdf6": "transferDisabled()", +"892e0614": "distributeDivs(uint256)", +"892e243a": "directorName()", +"892e3f98": "setContributionInWei(uint256)", +"892e8dd9": "getViewDataByIndex(uint256)", +"892ee1a2": "removeUserFromBlacklist(address)", +"892ef672": "getACLRole8972381298910001230()", +"892f81df": "initializeTreasure(uint256)", +"89301afc": "Registrator()", +"8930c702": "updateWhitelist(address,address,uint8)", +"89311e6f": "startIco()", +"8931c998": "calculateTokenPresale(uint256,uint256)", +"89320239": "WHP()", +"89320771": "FDC(address,string)", +"89325127": "test_require()", +"89327ad5": "transfer_single_token_balances(address)", +"8932da79": "additional_price_money()", +"8932dc3d": "publishResult(string,string)", +"893372ca": "cancelPending(bytes32)", +"89337e84": "createTokens(bytes32[])", +"89341f6e": "TCASH()", +"89349217": "GamersCoin()", +"8934d115": "verifyUrl(string,string)", +"8935556d": "setDividends(uint256)", +"8935860d": "transferAgent(address)", +"8935b613": "setContentsManager(address)", +"8935ced5": "weightOf(uint256,address)", +"8936b8d4": "getCurrentRateInCents()", +"8937a0e8": "Guestbook()", +"8937d3dd": "Champion()", +"8937e223": "distoryAndSend(address)", +"8938656b": "getGeneratorsIds()", +"893880b6": "purchaseShareContract(address)", +"8939f5f6": "recoverCat(uint256)", +"893ae703": "bonusInPhase4()", +"893b3dd5": "setFreeze(string,bool)", +"893b746a": "cooperateRewardSupply()", +"893b8b0a": "getCategoricalMarketNumTicks(uint256)", +"893c1d31": "bountyReserveTokensDistributed()", +"893cebb3": "createSalesOffer(bytes32,address,uint256,bool)", +"893cf478": "chargeVerificationFee(address,address)", +"893d20e8": "getOwner()", +"893d4948": "JTEToken()", +"893fb18e": "buyout(uint256,bool,uint256,uint256)", +"89400fcc": "SkillCoin()", +"89402a72": "__default__()", +"8940aebe": "publicKey(uint256)", +"8940afe7": "testFailBurnGuyNoAuth()", +"8941db65": "addTime()", +"894306d5": "CanChange()", +"89443aac": "bttsVersion()", +"89452488": "NEBC(uint256,string,string)", +"8945a8af": "TOKEN_RESERVE1_CAP()", +"8945b1fc": "takeOwnership(string)", +"8945d643": "m_softCap()", +"8945e00d": "getForkCalled()", +"89462c38": "setContract2(address)", +"89465d2e": "dataForWithdraw(address)", +"8946d33f": "SplitterEthToEtc()", +"89473a0e": "PRCT100_D_TEAM()", +"89476069": "withdrawToken(address)", +"894766dd": "setTotalCoins(uint32)", +"89483926": "checkGainsToReceive()", +"894875cf": "_decimals18()", +"8948fe67": "wlDuration()", +"89495172": "convictFinal(uint256,uint256)", +"8949e109": "curReward()", +"894a62b3": "addContributionList(bytes10,string)", +"894a93e2": "tgeSettingsPartInvestorIncreasePerStage()", +"894b8d2e": "victorieumStatic1Token()", +"894ba833": "disableContract()", +"894ca160": "CanToken()", +"894cd9b6": "placeBuy(address,uint256,uint256)", +"894cdcc1": "ADXToken(address,address,uint256,uint256,uint256,address,uint256,address,uint256,address,uint256)", +"894d05b5": "buy_drink(uint256,uint256)", +"894d6ef9": "TripCoinTeamAddress()", +"894d7b08": "claimTokenBonus(address)", +"894e036d": "callAndReward_2(string,string,uint256)", +"894e5e1f": "GEE()", +"894e5f2d": "isUserAuthorized(address)", +"894ee6d9": "_getTimeValue(address,address)", +"894f6531": "SingleTokenLocker(address)", +"894fefeb": "TokenHeld()", +"89506a44": "MAX_TRANCHES()", +"89514f6e": "setSummary(string)", +"89519c50": "refundTokens(address,address,uint256)", +"895224db": "testControlBlobStoreNotRegistered()", +"89523d77": "removeProperty(bytes32)", +"895274bb": "getPlayerSpaceshipBattleLevelById(uint256)", +"8952877b": "storeProof(bytes32)", +"8952f965": "isTransferConfirmed(uint256)", +"8954f5b1": "winChoice()", +"895594f6": "setEarlyParticipantWhitelist(address,bool,uint256,uint256)", +"895595d5": "firstRoundICODiscount()", +"8955ed7e": "claimBalanceOwnership()", +"895678a2": "expireDelay()", +"89568a13": "TSTEST1()", +"895693a9": "getToBalance()", +"8956fceb": "addAlt(address,uint256,uint256)", +"89574144": "GXESwapper()", +"89578145": "checkIfYearHasPassed()", +"8957d6f2": "numOfLegendary()", +"8957f8bf": "getLastMoveTime(uint16)", +"89596409": "getMigrateState()", +"89597595": "HCLCToken(uint256,string,string)", +"8959cbfe": "punksOfferedForSale()", +"895a8cfb": "secondWeekMainICOBonusEstimate()", +"895ab68c": "canCallDefault(address)", +"895abac9": "landPriceCandy()", +"895b327e": "isTokenActive(address)", +"895b4da7": "RunSale()", +"895bf2e1": "tickets10price()", +"895c1596": "getExpectedTotalTokens()", +"895c1bdb": "setStatus(address,address,uint8)", +"895c4c39": "unlockDevSupply()", +"895c666a": "createCommonPlayer()", +"895cf354": "validCertificators(address)", +"895d4e1b": "getMiningDetail(uint256)", +"895e8b23": "_tokenExists(uint256)", +"895ec54c": "getPack(uint256)", +"895ee30d": "Purchase(address,address)", +"895f468b": "markAllRead()", +"895fb022": "purchase_car(uint256)", +"89604ed0": "rebalance_delete(uint256,bool)", +"89611d0a": "checkIfSignedBy(bytes32,address)", +"89612f95": "setPrivateSaleTokensSold(uint256)", +"896131ca": "NewEntry(address)", +"896147e1": "ratePre()", +"8962aead": "setPOOL_edit_23(string)", +"896317b8": "getAssetType()", +"89637214": "presalePiTokensLimit()", +"896372b4": "addLogBlock(uint256,uint256,uint256,string)", +"89638de3": "setItemNotForSale(uint256)", +"8963c04b": "tokenSaleTokenBalance()", +"8963dab4": "getNodeId(bytes,bytes)", +"89658163": "setPath(uint256,uint256,bytes,bytes)", +"8966321e": "canTransfer(address,address,uint256,bool)", +"89666fd6": "adminSetPercentInvite(uint256,uint256)", +"8966768f": "confirmOracle(address,uint256)", +"89668a39": "addOpenRoomCount(address)", +"89675cac": "set(address,address)", +"89676b27": "storePrizeMoney()", +"89685242": "isValidPeriod(uint256)", +"8968c17c": "BlockchainCutiesCore()", +"8968db88": "GazeCoin()", +"896941e1": "ethTransfertoKYC(address,uint256)", +"89698f02": "recordContract()", +"8969fb5f": "USDETHRATE()", +"896a17a4": "releaseRestBalanceAndSend(address)", +"896ca3f4": "put_purchase_for(uint256,address,address,uint256,uint256,uint256,address,bytes)", +"896ce019": "getDailyTransactionVolumeSending()", +"896d505a": "setReport(uint256,bytes)", +"896d807a": "setAttribute(bytes32,string,uint256)", +"896e0349": "TokensClaimed(address,uint256)", +"896ed75a": "refuseAddress(address)", +"896f40dd": "ownerOnly()", +"896f8b4c": "changeEthBackRate(address,uint8)", +"897032e3": "ClipToken()", +"8970430e": "IcoContributed(address,uint256,uint256)", +"8970a0f4": "getFinalPayoutDistributionHash()", +"8970d84c": "_tokens()", +"89712af3": "longTermHolding()", +"8971739b": "getVIPCount()", +"8972feba": "reserveTokensGroup(address[],uint256[])", +"8973123c": "saleStartDate()", +"8973d0cf": "CoinwareToken()", +"8973e316": "resolveSellCityForEther(uint16)", +"8974372d": "payFund()", +"897463aa": "startContribution()", +"89749adb": "BuyTokens(uint256)", +"8975e45f": "currentNumberOfUnits()", +"89760e0a": "stateIndexToOwner(uint256)", +"89765328": "totalInvestmentOf(address)", +"8976762d": "setA_Signature(uint256)", +"8977f909": "UTCStart()", +"89781912": "setAllowedAddresses(address,bool)", +"8978fc79": "batchDistributeFees(uint256,uint256[])", +"89790192": "WithFee(address,uint256)", +"897a7dab": "createTokens(uint256[],address[],bytes32[],uint256[],uint256[],bytes32[])", +"897b0637": "setMinAmount(uint256)", +"897c41dd": "showInvestorVaultFull(address)", +"897c8613": "payContributorByAdress(address)", +"897cb036": "softCapTokens()", +"897cceee": "lockContract(bool)", +"897d2b10": "getPixelArray()", +"897d55cd": "migrationGetBoard(bytes32)", +"897e47f5": "setDateMainEnd(uint256)", +"89800cc2": "mtrContractAddress()", +"89804ddc": "getSagaExchanger()", +"89805f30": "s32(bytes1)", +"89805fc6": "PPCContract()", +"8980f11f": "recoverERC20(address,uint256)", +"89813984": "isWhitelistAddressListed(address)", +"8981a7ca": "actionA(uint256)", +"8981d077": "lockForWork(address,address,uint256)", +"8981d513": "owner(bytes12)", +"89826963": "changeICOStartTime(uint256)", +"8982b185": "buySEKU(uint256,uint256)", +"8982d772": "submitInitialEmptyState(bytes32,uint64,uint256[2],bytes32,bytes32,uint8)", +"898366d7": "ETH888CrowdsaleS2(address,address)", +"8983d2e9": "goldSymbol()", +"8984034f": "emitPriceUpdated(uint256,uint256)", +"898403c3": "getCurrentBlockTime()", +"8984e5dd": "_subBalance(address,uint256,address)", +"89850fae": "nextStep(uint256)", +"89852db2": "PARSEC_CREDITS_MINIMAL_AMOUNT()", +"89853691": "readUint256(bytes32)", +"89859b50": "updateLatestTree(bytes32)", +"8985a309": "setAllowedAddress(address,address)", +"8985abc8": "publicSaleAmount()", +"898644cc": "getFreeMiner(address)", +"89864915": "TyzonSupply()", +"89869163": "claimFailedConsensus(address)", +"8986ff32": "setEndTimeIcoStage3(uint256)", +"898855ed": "changeName(bytes32)", +"89885a59": "tokenOwnerOf(uint256)", +"8988b284": "isMod(address)", +"8988c1ff": "LogWhitelistUpdated(address)", +"8988d59e": "Transfer(address,address,uint256,address,bytes,bytes)", +"89895d53": "orderBlockNumber(bytes32)", +"89897104": "_buyRank(address,uint256)", +"8989851c": "operationList(uint256)", +"898a1813": "expectationsLeft()", +"898aa23b": "setPriceInCents(uint256)", +"898ad5ec": "set_arbits_presale_open(bool)", +"898b7663": "add_profit(address,uint256)", +"898c94b7": "SetDidPayOut(bytes32,bool)", +"898ce10c": "ChangeItemOwnerID(uint256,uint256)", +"898dc9b6": "setData_31(string)", +"898e3950": "addWinner(address,uint256,uint256)", +"898f767b": "precioether()", +"898fb033": "updateDescription(bytes)", +"898fdf94": "claimRate()", +"8991dede": "Falcon()", +"89920edf": "mintLockCashout(int256,address,uint256)", +"899231ef": "PRE_ICO_MINIMUM_CONTRIBUTION()", +"8992ae0e": "UBETCOIN_LEDGER_TO_LEDGER_ENTRY_DOCUMENT_PATH()", +"8993021b": "risks(bytes32)", +"899346c7": "nextPositionId()", +"89935c39": "getAmbientTempControlLimits(bytes32)", +"8994fa53": "TopUpMember()", +"89952097": "releaseRestBalance()", +"8995305e": "AsterionWorldToken()", +"89975389": "newVoting(string)", +"89976229": "setAmout(uint256)", +"8997f8cf": "getTokenUpdatedCounter(uint256)", +"8998470d": "tradeIntentOf(address)", +"8998ef19": "withdrawTokenMaker(address,uint256,address)", +"899942b8": "Devcon2Token()", +"899967b7": "redeemExcluded(address[],uint256[])", +"8999dd63": "ESoulToken()", +"899a0e7e": "OpenAIBlockChainToken()", +"899a1e36": "addBounty(address,uint256)", +"899aa65c": "Judged(uint256,bool,address,bytes32)", +"899ae006": "createBabies(uint256[],uint256[],uint256[],uint256[])", +"899b3414": "updateCoupleImageIPFShash(string)", +"899b53c9": "RICHToken()", +"899b64d9": "tokensPerEther_denominator()", +"899b6713": "VIRTToken()", +"899bf897": "isAllowedToRedeemNow()", +"899c0360": "getVIPRank(address)", +"899c4434": "testValidateTrade(address,address,address)", +"899d1556": "firstRoundICOTokensLimit()", +"899d840f": "PayPoker(string,string)", +"899e0fc9": "balanceOfPot()", +"899e37b9": "mintAndLock(address,uint256,uint256)", +"899e87f3": "AmountSet(address,uint256)", +"899ecf2b": "phase3EndBlock()", +"899f107d": "roomNightsOfOwner(uint256,uint256,bool)", +"899f9d29": "YCBToken()", +"89a0b679": "setContributor(address,address,bool,uint16,uint16,address)", +"89a2662f": "NeonCoin(uint256,string,string)", +"89a27984": "phepToken()", +"89a30271": "USDC()", +"89a3a00d": "addMinutes(uint256,uint256)", +"89a3e807": "Corban(address)", +"89a419e1": "set_stage_Days(uint256)", +"89a451fb": "getPriceChannel(string)", +"89a45223": "testFailCreateWithParentsParentNotInUse1()", +"89a4931d": "maxContributionAmountContract()", +"89a4bd1b": "foundationHashed()", +"89a4c1a0": "DevAddress()", +"89a5f2df": "privateSaleBonus()", +"89a69c0e": "setSubRegistrar(bytes32,address)", +"89a7adcc": "DelSocialAccount(bytes32,bytes32)", +"89a81e83": "validPurchase(uint256,uint256,uint256)", +"89a83701": "level(address,address,uint256)", +"89a8814d": "GetLastName(uint256)", +"89a9453a": "removeAllowedContracts(address[])", +"89a9d38e": "_approve(address,address,bytes32)", +"89a9d6b4": "tokensRemainingStage3()", +"89aaad29": "currencyUpdateAgent()", +"89abeb19": "ProcessGameExt(uint256)", +"89ad0a34": "setLocked(address,bool)", +"89ad0efd": "calculateAmountOfUnits(uint256,uint256)", +"89ad50e3": "CindicatorTalk()", +"89ada759": "availableBountyCount()", +"89ae1c90": "nativeReputation()", +"89aeca76": "registrars(address)", +"89af049d": "removeNacFromNLF(uint256)", +"89af175c": "RiservaETH(uint256)", +"89af2dce": "getBalanceFrom(address)", +"89afaf9d": "AddMod(address,address,bool)", +"89afc0f1": "operatorFee()", +"89afcb44": "burn(address)", +"89b13814": "Killable()", +"89b1714b": "simpletransfer(address,uint256,uint256)", +"89b1802c": "feesRateCongres()", +"89b1fa0a": "ROLE_TRANSFER()", +"89b2050b": "addExtraBalance(address,uint256)", +"89b2b09e": "ABDEL_ADDRESS()", +"89b2df31": "getTurn(uint16)", +"89b337a7": "GetCityData()", +"89b38d2f": "getInvoicingAddressByIndex(string,uint256)", +"89b3f8c7": "Flames()", +"89b49d61": "checkCapNotReached(uint256)", +"89b4a36f": "Depot()", +"89b4c550": "checkAndSendPromoBonus(uint256)", +"89b51f94": "setCommunityAddress(address,address)", +"89b52360": "referralCount()", +"89b52b9b": "sendCoin(address[],uint256[],bytes32)", +"89b540aa": "FuckYou()", +"89b5b514": "maxFinalStage()", +"89b5ea24": "outputMoney(address,uint256)", +"89b61a85": "updateVeifyFee(uint256)", +"89b68f40": "releaseFounderTokens()", +"89b7e746": "getMyOpenedCount(address)", +"89b898b8": "batchConvertIntoHtlc(bytes32[],address[],uint256[],uint256[],uint256[],bytes32[])", +"89b8b492": "read(uint64)", +"89b8db55": "minBounty()", +"89b933cd": "serviceFallback(address,uint256,bytes,uint256)", +"89b9572f": "RBTToken()", +"89b97d07": "totalSite()", +"89b9defb": "buyTokenForAddressWithEuroCent(address,uint64)", +"89ba3b23": "confirmDepositQuest(address)", +"89ba8e61": "getExplicitStrategyState()", +"89bb55c7": "apply(bytes32,uint256,string)", +"89bc0e6e": "UnitedToken()", +"89bc2006": "BagPackToken()", +"89bc455d": "THO()", +"89bca2d5": "addAuctionItem(uint256,uint256,address,uint256)", +"89bcbee2": "DemoToken()", +"89bcf968": "timeExpires()", +"89bdb217": "totalTeamFundMinted()", +"89be87a1": "openChannel()", +"89bfc6be": "PIVOTCHAIN()", +"89c0b25c": "openDispute(address,string)", +"89c1108d": "isTimeVault()", +"89c186d5": "addNewBusinessWallet(address)", +"89c18b48": "EtherusToken(address)", +"89c19ddb": "concat(string,string)", +"89c2443e": "executeSelfdestruct()", +"89c29b61": "calculatePaycheck(uint256)", +"89c44def": "sendMileStone(address,uint256,uint256)", +"89c5077f": "withdrawDevFee(address,uint256)", +"89c55845": "setBonus(uint8[5])", +"89c5ee3b": "executeAfterFinalize(bytes)", +"89c67976": "getAcceptance(bytes32,address)", +"89c698d4": "CrypteriumToken()", +"89c73565": "birthBlockThreshold()", +"89c766fd": "pause_for_maintenance()", +"89c77dfe": "mintValue()", +"89c7abfd": "removeAdministator(address)", +"89c7e70c": "BitliquorStandardToken(uint256,string,uint8,string)", +"89c98c06": "getMaxGasPrice()", +"89c9c44a": "EmontFrenzy(address)", +"89c9c586": "slopeDuration()", +"89c9e80f": "PotOwner()", +"89cb29dd": "nextEscrowId()", +"89cbc416": "tokensRedeemed()", +"89cc5c2b": "createdBlockOnRevealsPhase(uint256,address)", +"89cc5ea8": "bid(string,address,uint256)", +"89cc81c1": "contribute(bytes32)", +"89ccd39a": "set_address_A(address,address)", +"89ccf28c": "checkCapAndRecord(address,uint256)", +"89cd4b5e": "decidingBlock()", +"89cda6a8": "pausePVP()", +"89ce16cc": "maxRange()", +"89ce33bd": "delegateERC820Management(address)", +"89ce555c": "devFeesAddr()", +"89ced196": "setNotUpdatable(bytes32)", +"89cf3204": "insurance()", +"89cf5604": "releaseReserveTokens()", +"89cf9f94": "_reserveRefTokens(address,uint256)", +"89cfa823": "addPendingWithdrawal(address,address,uint256)", +"89cfd71b": "setPrivate(uint256)", +"89d2fca3": "DoctorChainToken()", +"89d3a15b": "addNewBlock(bytes32[],bytes32,bytes32)", +"89d3ed8d": "defineDiscountBorderLines()", +"89d410e9": "setIcoOwner(address,address)", +"89d4a66c": "internalDeposit(address,uint256)", +"89d59ee5": "createPersonalDepositAddress()", +"89d5da3b": "AlphaMarketICO(address[])", +"89d61942": "nextAuctionSupply(uint256)", +"89d61d77": "setOrganizer(address)", +"89d67775": "window1TokenCreationCap()", +"89d6d69d": "stampIndexToApproved(uint256)", +"89d700a5": "TheGTokenTest(uint256,string,uint8,string)", +"89d75221": "revokeSignToCancelAgreement(uint256)", +"89d77f82": "blocksToWaitLong()", +"89d86c5d": "getRetailer(uint256)", +"89d8b472": "_error(string)", +"89d8ca67": "drawPot(bytes32,bytes32)", +"89d8f96f": "getDirectOffersComissionRatio()", +"89d9b059": "refillRatifiedMintPool()", +"89d9ed38": "reserveFunds(address,address)", +"89da85d3": "getNumberOfArticles()", +"89dbeb64": "fundForAirdrop()", +"89dc8719": "getUserMaxPurchase(address)", +"89dcbbf9": "getFreeLobster()", +"89dcd64f": "saiTub()", +"89dd9e22": "changeBrick(uint256,string,string,string,bytes32[])", +"89ddeff3": "neurodao()", +"89de2581": "SetStorageContract(address,address)", +"89df1b01": "setMultiRequestLastRequestId(uint256,uint256)", +"89e198b4": "validContract(uint32,uint32,address)", +"89e2605d": "setReleaseAmountToCreator(uint256)", +"89e28a47": "getGameResults()", +"89e2c014": "allocateVestedTokens(address,uint256,uint256,uint256,uint256)", +"89e2d8bb": "handlePayableSharesDelta(uint256,uint256)", +"89e40af2": "stageSum(uint256)", +"89e42346": "enableRefund()", +"89e478f6": "minGasForDrawing()", +"89e4e22b": "pingDelta(uint256)", +"89e52771": "getTeamAddresses()", +"89e582c4": "FuturXe(uint256,string,string,uint8)", +"89e6359f": "preIcoEthers(address)", +"89e63a60": "conversionHashes(bytes32)", +"89e6579b": "registerExchange(address,address,bool,bytes4[])", +"89e6b5fb": "transferOwnership(address,bytes32)", +"89e7b8f6": "frozenFundsOf(address)", +"89e7f5cb": "OCZAPI()", +"89e85217": "teamBalance()", +"89e877a3": "activateWhitelist()", +"89e8beb3": "_strConcat(string,string)", +"89e94513": "advance(bytes15,uint32,uint64,uint64,int64,uint64)", +"89e96773": "BEY()", +"89ea2cb7": "onRefundPollFinish(bool)", +"89ea642f": "getString()", +"89ea770a": "grantTokensAdvisors(address,uint256)", +"89eaa610": "userAccess(address)", +"89eb313a": "isReadyToMate(uint256)", +"89eb4fee": "MYJ256()", +"89ebe846": "loyaltyWallet()", +"89ecd0e8": "disableAllowBuy()", +"89ed0b30": "setOraclizeGas(uint32)", +"89ed2ebf": "_transferDrone(address,address,uint256)", +"89ede784": "starbaseCrowdsale()", +"89edf114": "referralOwnerPercent()", +"89ee8758": "Daz()", +"89eea0eb": "tetherCount(address)", +"89eedf00": "setPdfHash(bytes,bytes)", +"89ef40e7": "numberOfHealthyGenerations()", +"89ef75b1": "purchaseWithPromoter(address,address)", +"89ef8292": "bulkTransfer(address[],uint256[],address)", +"89efa1b5": "registerEtherBalance(address)", +"89f0151c": "addAttribute(bytes32)", +"89f03ebc": "Incrementer2()", +"89f0ccba": "pre_start()", +"89f12d00": "minBlockNumber()", +"89f12ed9": "novaAddress()", +"89f182aa": "createMilestoneAcceptanceProposal()", +"89f1c26e": "minterTransferFrom(address,address,address,uint256)", +"89f1d38d": "Swap(uint256)", +"89f21090": "singleValueAirDrop(address[],uint256)", +"89f224a8": "EthlanceJob(address)", +"89f27d55": "transferItem(uint256,address,uint256)", +"89f37c45": "test_invalidThrow()", +"89f395de": "tos()", +"89f47b64": "doCrowdsaleMinting(address,uint256)", +"89f4ed7a": "getLastTag(uint256)", +"89f4fd57": "getUserProxy()", +"89f63f50": "teamb()", +"89f650fd": "next(bool)", +"89f6709c": "longRecord(address,uint256)", +"89f6e826": "drainRemainingToken()", +"89f71d53": "lastAction()", +"89f85a4b": "BalanceLocked(address,uint256,uint256,uint256)", +"89f8601e": "Engraved(address,bytes32)", +"89f88d7a": "Chess(bool)", +"89f8ab94": "lastRateUpdateTimesForCurrencies(bytes4[])", +"89f91592": "agreeWithdraw(uint256)", +"89f915f6": "getNumbers()", +"89f9b01e": "countingMeme()", +"89fa413d": "tradeRobot()", +"89facb20": "INTERVAL()", +"89fb75f9": "amountOfStage(address,uint256)", +"89fc01f6": "GetBidSeries(address)", +"89fcd099": "getApproval(address,address)", +"89fd14a1": "raiseTrivialThreshold(uint256)", +"89fdd81d": "PRE_ICO_LIMIT()", +"89fe141a": "maxSupplyPossible()", +"89fe253a": "BountyCampaingWallet()", +"89fe5273": "getTokensToSend(uint256)", +"89fe8507": "setNumbers(uint256)", +"89fee530": "CBSToken(string,string,uint8,uint256,uint256,uint256,bool,bool)", +"89ff7fe0": "getCurrentBlockNum()", +"8a007d86": "preSaleMinPaymentWei()", +"8a007f30": "endGame(uint256,string)", +"8a00a82f": "withdrawRewardFor(address)", +"8a010c22": "changeBankAccount(address)", +"8a0193ac": "getGameExpired(uint256)", +"8a024a3f": "releaseINAToken()", +"8a03ad86": "getUserAddressById(uint256)", +"8a0490db": "PrakashToken()", +"8a0520fb": "isApprovable(address,uint256)", +"8a054ac2": "d()", +"8a059493": "fetchRoundIndexBySnapshotBlock(uint256)", +"8a05ad20": "TokensIssued(address,address,uint256)", +"8a05e478": "instantiate(address,address,bytes32)", +"8a063d91": "rewardThree()", +"8a066045": "unescrowFrom(address,uint256)", +"8a06cb71": "get_config()", +"8a06ce1b": "setTotalSupply(address)", +"8a0807b7": "indexOf(string,string)", +"8a0904da": "mainSale_EndDate()", +"8a098cd7": "bucketManager()", +"8a0a53d5": "BicycleSupply()", +"8a0c47cd": "changeWallet(uint8,address)", +"8a0cbf50": "VCCoin(address)", +"8a0cc3c6": "SMILO_COMMUNITY_AMOUNT()", +"8a0e5a75": "addToPublicSaleWhitelist(address[])", +"8a0e859f": "isDiamondAuction()", +"8a0f1e52": "PlayerBet(uint256,uint256)", +"8a107a31": "generate(string,address,address,bytes32,uint256,uint256)", +"8a1129f1": "unfreeze_start_date()", +"8a120dc9": "testBitEqualFailIndexOOB()", +"8a124744": "SiuToken()", +"8a127931": "profit5eggs()", +"8a13796e": "CERB_Coin()", +"8a13aa4b": "takeEth()", +"8a13aa4f": "WorldToken()", +"8a13eea7": "erc20Token()", +"8a1427d1": "addReferrerDefaultRate(address)", +"8a1489e3": "viewInvestorDividendHistory(uint256)", +"8a14f12c": "totalWagered()", +"8a155171": "availableForWithdrawal(address,address)", +"8a157df3": "createAuction(uint256,uint256,uint256,uint256,uint256)", +"8a157fae": "getEthBase()", +"8a1678a4": "LUMA()", +"8a17041a": "_founder_one()", +"8a17164c": "distributeTokenSaleJackpot(uint256,uint256)", +"8a172f2e": "getPawnEngine(uint256)", +"8a175ac2": "enableContribution(bool)", +"8a186788": "lookupIndex(uint256)", +"8a18a804": "UnsoldTokensBurnt(uint256)", +"8a18c55f": "SMT()", +"8a192c70": "setWLMTfinney(uint256)", +"8a194223": "Cryptolotto6Hours(address,address,address,address)", +"8a196437": "VRJToken()", +"8a19ac6d": "fechAllVoteResultPreRoundByBlock(uint256)", +"8a19b4d2": "addAdmin(address,address)", +"8a19c8bc": "currentRound()", +"8a19e355": "addToBalance(uint256)", +"8a1abbcf": "_getClientSupply(address,uint256,uint256)", +"8a1af4c4": "addOperator(address,address)", +"8a1b991d": "SBCE(uint256,uint256)", +"8a1bb169": "getJsonToTokens(string,uint256)", +"8a1bba96": "InvestorSum()", +"8a1bda63": "LogRedistributeTokens(address,uint8,uint256)", +"8a1be474": "CCNCrowdsale(address)", +"8a1d42f4": "setData_4(string)", +"8a1d8ae6": "x32323(uint32,string,uint8,string,address)", +"8a1dd162": "getPixel(uint256,uint256)", +"8a1e1404": "showFPLowerlim()", +"8a1f7a1b": "getMesa(uint256,uint256)", +"8a1fde4b": "setMaxwin(uint16)", +"8a20d00c": "buyTokensFromContract(uint256)", +"8a20f724": "currentRoundIndexByDate()", +"8a20f73c": "isInstrument(address)", +"8a213adb": "testFailMintGuyNoAuth()", +"8a237f27": "F2D()", +"8a2418ab": "nextSeedHashA()", +"8a24fd78": "convertGeneArray(uint256)", +"8a252194": "betGanjilGenap(bool)", +"8a252831": "asyncSend(address)", +"8a25aefa": "TEST_HOUSE()", +"8a2693e5": "kycVerification(address,address,uint256)", +"8a26d4c4": "GBTToken()", +"8a27a31c": "currentBanker()", +"8a27a51c": "transferGiveaway(address)", +"8a27a88b": "recoverAddressFromBalanceProofUpdateMessage(uint256,bytes32,uint256,bytes32,bytes,bytes)", +"8a294c60": "blacklisting(address)", +"8a29b77d": "receiveApproval(bytes)", +"8a2a0879": "TAUKEAYAM()", +"8a2a60ef": "foreignDailyLimit()", +"8a2ade34": "DonationClaimed(address[2],uint256[7],uint8,bytes32[2],uint256,uint256)", +"8a2ae2ab": "killTile(uint16,uint8)", +"8a2bfdf2": "add2Auction(uint256,uint256,uint256,uint256,uint256)", +"8a2cb24d": "castleExpAdjustment()", +"8a2e196c": "NTRYAvailableForSale()", +"8a2e2bf8": "updateLuckpool(uint256)", +"8a2e467c": "firstRoundTime()", +"8a2f6f94": "getRoleStatus(address)", +"8a30442e": "validTransfer(address,address,uint256,bool)", +"8a306c21": "mainSaleSupply()", +"8a31ffda": "replaceBoardMembers(address[])", +"8a323b38": "Contract(uint256,string,uint8,string)", +"8a329809": "setFeeContractAddress(address)", +"8a331846": "dividendParentsPercentage()", +"8a333b50": "max_supply()", +"8a33f585": "getOrder(address,uint32)", +"8a340eab": "BKToken()", +"8a341c83": "testErrorRootAuthorityChangeUnownedPackage()", +"8a34396a": "personalCapActive()", +"8a344477": "putDeed(bytes32,uint256,bytes32,bytes32,uint256,string)", +"8a349cc4": "subscribtionLittafi(uint256,string,string)", +"8a34bb24": "changeContractFee(uint256)", +"8a355a57": "removeProvider(address)", +"8a359d6e": "getEducationCitizens(uint256)", +"8a35b8c7": "invested(address,uint256)", +"8a35f788": "_getWinner()", +"8a36c3dc": "TeamToken(string,string,address)", +"8a36ebc2": "showSmallProfit()", +"8a36f5a2": "Debug(uint256)", +"8a38ab2c": "createCourse(string)", +"8a3907b9": "buyPerSell(uint16,bytes32)", +"8a394c4c": "eraseUnsoldPreSaleTokens()", +"8a39ebdc": "globalPresaleLimit()", +"8a3a84a8": "Total_Payouts()", +"8a3aa194": "endCrowdSaleTime()", +"8a3b0199": "transferOnBehalf(address,address,uint256)", +"8a3bacd1": "backup_drawdown()", +"8a3bc2bc": "iPropose(bytes,uint256,bool)", +"8a3c36cb": "DollHair()", +"8a3c44a5": "Constructor()", +"8a3d6290": "addBountyTransferredTokens(uint256)", +"8a3d7cdc": "tiles(uint256,uint256)", +"8a3db05f": "_myTokeName()", +"8a3e37c3": "StarbaseMarketingCampaign(address)", +"8a3e44d4": "assetMoveInformation(address,address)", +"8a3e99ff": "HighCastleToken()", +"8a3f6e2a": "transferFromAndDepositTokenFunction(address,uint256,address)", +"8a3f8a23": "queryChibi(uint256)", +"8a4068dd": "transfer()", +"8a40bd00": "allowedToUpgrade()", +"8a40c4c4": "Youdeum()", +"8a426b1b": "handleExternalBuyers(address[],uint256[],uint256[],uint256[])", +"8a42b68c": "approveOrderHash(bytes32)", +"8a42ebe9": "set(string,uint256)", +"8a433274": "executeVoting(uint256,bytes)", +"8a43fc7e": "return_rejected_payment(uint256)", +"8a449c2c": "VividoRaidenToken()", +"8a44ae91": "setAUM(uint256)", +"8a45242d": "newGame(bytes32,uint256,uint256,uint256)", +"8a45557e": "flowerTotalSupply()", +"8a4577ea": "returnTokensFromTeamAddress(uint256)", +"8a462fbc": "calculateNewPrice(uint256)", +"8a46467d": "reloadCore(address,uint256,uint256)", +"8a4660fe": "MINIMUM_INVESTMENT()", +"8a468e15": "TBowner()", +"8a469c16": "addGeneralMilestone(string,string,uint64)", +"8a46bf6d": "testFallback()", +"8a47cadb": "SunPowerToken(address,uint256)", +"8a48941f": "getDistributionFacts()", +"8a48ac03": "getAccounts()", +"8a49a3cc": "updateTrustScore(address,uint256,uint256)", +"8a4a8718": "GoinbitToken()", +"8a4a9aab": "xhstoken()", +"8a4af069": "TotalTokenSupply()", +"8a4b08d9": "getPriceRate()", +"8a4be59e": "incentiveDistributed()", +"8a4c81c2": "SEADToken(uint256,uint256,uint256)", +"8a4cae0e": "addVpf(bytes32,uint256,uint256,uint256,uint256,uint256,int256[])", +"8a4d5a67": "content()", +"8a4db4fa": "allowedToBuyBack()", +"8a4e3025": "addStaff(string,uint256)", +"8a4e4639": "pregnantPoniesies()", +"8a4e7a7c": "endCrowdsalePublic()", +"8a4ea479": "addUndergraduate(uint32,string,uint16,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)", +"8a4fb16a": "getWithdrawal(uint256)", +"8a4fbead": "setTokenAllowance(address,uint256)", +"8a4fe8ac": "membersNumber()", +"8a505b4c": "setAutoBuyFee(uint256,uint256)", +"8a5144c0": "estProviderFee(address,uint256)", +"8a519fb9": "BlockChainEnterprise()", +"8a51d0fc": "totalEarlyInvSupply()", +"8a51e8ed": "_timeLimit()", +"8a529159": "KinguinKrowns()", +"8a53360f": "GrantUpdated(address,uint256,uint256)", +"8a53862d": "refundPartCollateral()", +"8a53c3b1": "TeamTokensHolderMock(address,address,address)", +"8a53f230": "noError()", +"8a545aec": "getEngineerPrizePool()", +"8a547932": "sendFounderAndTeamTokens()", +"8a54d6a4": "recordVotes(uint256[])", +"8a55b001": "Sleipnirwallet()", +"8a55d36e": "isStart()", +"8a5651e3": "EMISSION_FOR_PRESALE()", +"8a56b230": "setMiningWarInterface(address)", +"8a56ca45": "lastOwner()", +"8a56d115": "lagDefrost()", +"8a56e85e": "_createRandomDna(string)", +"8a56f3ee": "burnFrom(uint256,address)", +"8a56fe46": "orderExpired(address,address)", +"8a570230": "IDK()", +"8a57af6b": "lockAfter(address,uint256,uint256)", +"8a585214": "BogpillToken()", +"8a5910a5": "RewardTimePeriod()", +"8a593cbe": "pre_ico(address,uint256)", +"8a59eb56": "updateStatus(bytes32)", +"8a5a68f4": "richtokenIndexToOwner(uint256)", +"8a5be698": "balanceOfDerivative()", +"8a5c19c0": "getWeekNo()", +"8a5c9098": "_mint(address,uint32,uint32,uint32)", +"8a5cca14": "AccountTransfersFrozen(address,bool)", +"8a5cd1ca": "updateBlockVoter(uint256,address,bytes32,uint256,uint256)", +"8a5cf5ee": "quarter3()", +"8a5d815e": "finishContract()", +"8a5ddd9b": "emergencyAndHiddenCapToggle()", +"8a5ddf9d": "emergencyRedeem(uint256,address[])", +"8a5fb3ca": "currentFeePercentage()", +"8a604017": "pendingParticipants(uint256)", +"8a6083d2": "changeCrowdfundState()", +"8a609155": "totalUniquePlayers()", +"8a6158f7": "startSettlementProcess()", +"8a61a2a6": "NewKoth(uint256,uint256,address,uint256,uint256,uint256,uint256,uint256)", +"8a61b26d": "startICOPhaseTwo()", +"8a61bb91": "initiateBoardMemberVote(string,bytes32,address[])", +"8a61dcb7": "MiningReward()", +"8a626ba1": "offerPriceCandy(uint256)", +"8a6281f6": "getOwnerInfos()", +"8a62e9e9": "setIgnoreRequestIds(bytes32[],bool[])", +"8a62fd12": "NVTFallback(address,uint256,uint256)", +"8a6508ce": "removeCooldown(uint256)", +"8a653c93": "extGetLock(uint256)", +"8a654a64": "lockedAccountThresholdEth()", +"8a65d874": "userStats(address)", +"8a662b59": "SOLID()", +"8a6655d6": "vote(uint256,uint256,uint256)", +"8a6700e8": "Dex(address,address,address,uint256,uint256,uint256)", +"8a67456a": "contractPaused()", +"8a67c544": "setSchemaValidity(bytes32,bool)", +"8a67f04b": "_payoutMining(uint256,address,address)", +"8a67f4bf": "getRewardsBalance(address)", +"8a684f97": "EthMsig()", +"8a689784": "blocksDelay()", +"8a68ae3c": "transferPaladinOwnership(address)", +"8a69218c": "getLastRewardTime(uint256)", +"8a699023": "phase8Price()", +"8a69fead": "getTitulaire_Compte_1()", +"8a6a3584": "clearAccount(address)", +"8a6a8b6c": "getMonthlyTransactionVolumeSending()", +"8a6b114b": "getBet(address,uint256)", +"8a6b6877": "withdrawMineral(uint256)", +"8a6b9be4": "allowToWithdrawFromReserve()", +"8a6bc85a": "getInterestor(address)", +"8a6c02ae": "safeWithdrawal3(address)", +"8a6c0b26": "registerCreatorsPools(address[],uint256)", +"8a6d2d7b": "MATOU()", +"8a6d39b9": "Leak()", +"8a6db9c3": "minterAllowance(address)", +"8a6e0a8e": "_increaseApproval(address,address,uint256)", +"8a6ee066": "_releaseWithReward()", +"8a7097ce": "checkWithdrawalsgross(address)", +"8a7180ae": "team_token_percentage_max()", +"8a72ea6a": "offers(uint256)", +"8a738683": "sweep(address,bytes32)", +"8a7398e7": "getAllRoundRefIncome(address,address)", +"8a74b45c": "editApi(uint256,uint256,address,string)", +"8a74ee43": "allowTransferFrom(address)", +"8a74f69d": "transferMod(address)", +"8a758625": "setStrF1IntF2StrF2UintF2(string,int256,string,uint256)", +"8a75f56a": "setArbiterLocked(address,bool)", +"8a769d35": "miningTarget()", +"8a76a63e": "whitelistedInvestorCounter()", +"8a76d99b": "buyTicket(uint32,uint32,uint32,uint32,uint32,uint32)", +"8a775ab6": "RiskPrices(uint128[])", +"8a77ba1a": "companyVault()", +"8a78b7fb": "test_invalidProposalExecution()", +"8a78f5e2": "changeMember(address,bool,bool,uint256)", +"8a7a7e03": "ETH_PER_LARE()", +"8a7a8f46": "HJF()", +"8a7c20d7": "setReferralFund(uint256)", +"8a7c2ad7": "buyService(address,uint256,bytes)", +"8a7c2be2": "payEth(address,uint256,uint256)", +"8a7c2d6d": "hasOpenApplicationFromSource(address,address)", +"8a7c63c5": "privateStartTime()", +"8a7cc2ca": "RemapImported()", +"8a7d124b": "destroyToken(uint256)", +"8a7e30a1": "token_set()", +"8a7e5144": "addWhiteList(uint8,address,uint256)", +"8a7ed05c": "MAX_BID_FRAC_TOP()", +"8a7ef3df": "testFailCreateWithParentsParentSameItemId1()", +"8a7f1146": "RetrieveFunds()", +"8a7f800c": "preCensor(bool)", +"8a808acf": "Yaraq()", +"8a8090b8": "_setUint(bytes32,uint256)", +"8a80d9a3": "isRefundPaused()", +"8a80dfb1": "isFirstBadgeEle(uint256)", +"8a8146d0": "end_ICO_PreICO()", +"8a814cfe": "MyCrowdsale()", +"8a827eb9": "setSecondary(address)", +"8a82a09d": "MISTT1()", +"8a83d4a0": "burnMythexTokens(address,uint256)", +"8a863fbd": "juryOnlineWallet()", +"8a8672dc": "DINRegistry(uint256)", +"8a871c5f": "crosairVouchersMinted()", +"8a874084": "updateInteface(address,address)", +"8a87873a": "create(bytes32,address,bytes32[3],bytes32,bytes32)", +"8a87aeb9": "EthToOwner(address,address,uint256)", +"8a87b5c5": "dailyAdminAllowance()", +"8a87d8ea": "hasLicenseTerms(bytes32)", +"8a881e0e": "isExists(bytes32)", +"8a88c349": "addVestingMember(address,uint256,uint256,uint256)", +"8a88c4fe": "replaceOwnerIndexed(address,address,uint256)", +"8a890695": "logPurchaseViaFiat(address,uint256,bytes32)", +"8a892271": "initiateLocking(uint256)", +"8a89b338": "set_commandPercent(uint256)", +"8a8a0aab": "_b2(string,address)", +"8a8b4d61": "MediaBroadcast()", +"8a8b51b8": "setAddGas(address,uint256)", +"8a8b7deb": "CAT()", +"8a8b7e02": "whitelist_enabled()", +"8a8b98dd": "ETHT()", +"8a8bbd5c": "ThanhnvToken()", +"8a8bf82a": "batchTransferToken(address,address,bytes32[])", +"8a8c523c": "enableTrading()", +"8a8c8c42": "TokenCoin()", +"8a8cd78d": "setTurnoverTo(address,uint256)", +"8a8e2028": "getCurrentTranche(uint256)", +"8a8e3999": "_unsafeEncodeTokenId(int256,int256)", +"8a8e5239": "get_power(address)", +"8a8e5afb": "shaCommit(uint256)", +"8a8ede8a": "hasStatus(address,address,uint8)", +"8a8f1f25": "setAccountSpendingLimit(address,uint256,string)", +"8a8f5b79": "newXPAAssets()", +"8a905482": "createIpo(address,uint256,uint256,string,string)", +"8a926d0f": "maxTokenAmount()", +"8a933eac": "setSmartContractPrice(uint256)", +"8a93d70d": "MakerWithdrewEther(uint256)", +"8a93dbdf": "getInvestorDividend(address)", +"8a946339": "ERC20Token(string,string,uint256)", +"8a955876": "incrementCountSales(uint256,uint256)", +"8a957929": "setFeeAuthority(address)", +"8a957f15": "ccReleaseBlock()", +"8a95a746": "pie()", +"8a95addc": "NewPotentialOwner(address,address)", +"8a95f59f": "setHHRAddress(address)", +"8a96e27e": "CTTCToken()", +"8a973e17": "borrowEther(uint256)", +"8a97d915": "TokenMetadataUpdated(uint256,address,string)", +"8a983fbc": "KulouCoin()", +"8a98a9cc": "gen0SaleCount()", +"8a98cbd0": "SalePaused()", +"8a98deca": "setEtherCostOfEachToken(uint256)", +"8a9920b7": "emergentWithdraw()", +"8a99aa69": "_setStore(address)", +"8a99e917": "activatedPhases(uint256)", +"8a99fc87": "checkWhenContributorCanTransferOrWithdraw(address)", +"8a9b2b36": "_fillCardStruct(uint8,address,string,string,string)", +"8a9b35a7": "totalPresaleWei()", +"8a9b4067": "ren()", +"8a9b809b": "ChargCoinContract()", +"8a9ba931": "setContract(address,address,address,address,address,address,address)", +"8a9bb02a": "getRoundInfo(uint256,uint256)", +"8a9c497b": "totalBunniesCreated()", +"8a9c636c": "setAquiferInstituteCoinAdd(address)", +"8a9cb361": "hundredPercent()", +"8a9cba3c": "set_result_of_game(uint8)", +"8a9cf23a": "isEarlybird()", +"8a9d1fbf": "uniquePet(uint64)", +"8a9d3839": "setBountyWallet(address)", +"8a9d43e2": "getPlayerFee(uint256)", +"8a9d6bb1": "GEZI()", +"8a9d7982": "getActiveBetsRefund(address)", +"8a9e0876": "tokensReleased()", +"8a9e8671": "totalBid()", +"8a9f8a43": "set_block(uint256)", +"8a9fb135": "humaniqToken()", +"8a9fc475": "wipe(address,bytes32,uint256,address)", +"8a9ffb90": "transfer(string,string,bool)", +"8aa001fc": "getSecond(uint256)", +"8aa08617": "mintInitialTokens(address,uint256)", +"8aa0fdad": "mint(string,string)", +"8aa10435": "getContractVersion()", +"8aa14a07": "transferToAddress(address,uint256,bool)", +"8aa1949a": "executionMaxPerTx()", +"8aa19ef7": "setOraclizeQueryGasPrice(uint256)", +"8aa2c280": "newAuction(uint128,uint256,uint256,uint256)", +"8aa31cbf": "ICO_PRICE8()", +"8aa33776": "setMsgPrice(uint256)", +"8aa35083": "PRE_CROWDSALE_DURATION()", +"8aa3cc5a": "setMonsterAssetAddress(address)", +"8aa43284": "getNbProjects(string)", +"8aa4e240": "payoutOCDividend(address,address)", +"8aa4e315": "setExchangePrice(uint256)", +"8aa5440e": "setXCPlugin(address)", +"8aa5b2c3": "changeStartTime(uint256)", +"8aa6e6de": "approveMint(uint256)", +"8aa6f1b1": "setUltimateOutcome(bytes32)", +"8aa7d975": "DOCC()", +"8aa81eac": "ixentest()", +"8aa91406": "createIdea(address,address[],string)", +"8aa94f56": "updateUserCreatedPerformance(uint256)", +"8aa96f38": "collectAllocations()", +"8aa978be": "Pricing(address)", +"8aa986f6": "minimumContributionPhase2()", +"8aa99826": "IsTradeable()", +"8aaa559a": "ProtectedApi(address)", +"8aaaa197": "getCurrentRoundEndTime()", +"8aab811e": "setLOCdata(string,address,int256,address,uint256,string,uint256)", +"8aabb56f": "setMigrateIn(bool)", +"8aabe700": "refundTokensForAddress(address)", +"8aabff06": "getPVECooldown(uint256)", +"8aac0fa4": "transferGasFee(uint256)", +"8aac1708": "_deleteOperation(bytes32)", +"8aac61e9": "assetArray()", +"8aadf70a": "generateUniquePets(uint8)", +"8aae13cb": "getTokensByUSD(uint256)", +"8aae1f50": "withdrawOperationFees(uint32[])", +"8aae45be": "lastBonusMultiplier()", +"8aaf09a1": "getInitialInvestAddres()", +"8aaf699d": "sendCommunitySupplyToken(address,uint256)", +"8aafef65": "ITC(uint256,string,string)", +"8ab058b1": "AllocateToken(address[])", +"8ab11869": "sign(string,string,string,string)", +"8ab1a5d4": "sell(uint256,uint256,bool)", +"8ab1d681": "removeFromWhitelist(address)", +"8ab21fb6": "delegateVote()", +"8ab30e9f": "test_validShouldBe3_increaseBlocksBy100()", +"8ab3580c": "bigbomToken()", +"8ab3e33f": "removeKey(address,address)", +"8ab422a1": "addEmployee(uint256,string,string,string,string)", +"8ab476bf": "setDevelopers(address)", +"8ab49873": "isSubmitterAccepted(uint256,address)", +"8ab4ca8a": "lockRound(uint256)", +"8ab4d1ca": "PapyrusAirdrop(address)", +"8ab5212b": "teamVault()", +"8ab5fcc5": "setTypePrice(uint256,uint256)", +"8ab63380": "setContractAddresses(address,address,address)", +"8ab7f807": "applySettings(uint8,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"8ab8064f": "continueITO()", +"8ab8342e": "changeInsurerOperation()", +"8ab905d4": "existedOnWhitelist(address)", +"8aba9215": "initialBlockHeights(uint256)", +"8abab8fb": "saleAccepting()", +"8abadb6b": "setAccountLevel(address,uint256)", +"8abb0e1f": "MRDSPrivateSale()", +"8abcb485": "InvestorBonusGet(address[])", +"8abdb005": "addCard(string,uint256,int256,string,uint256,uint256,address)", +"8abdf5aa": "serviceFee()", +"8abe09f2": "now()", +"8abe5593": "hashLength()", +"8abe59ea": "outcomeTokens(uint256)", +"8abe789b": "mulToResult(int256)", +"8abf344d": "callStages()", +"8ac01eaa": "SHARE_CRYSTAL()", +"8ac0ca36": "buyViaJohan()", +"8ac0e150": "fatigueBlock()", +"8ac0eef9": "changeUserKey()", +"8ac1a8d6": "weiRaiseLimit()", +"8ac1f290": "changelp20(address)", +"8ac2571f": "publish(address,bytes32,bytes32)", +"8ac27f5f": "investors()", +"8ac2b5f2": "_claimLoanToken(address)", +"8ac2c680": "minInvestment()", +"8ac341c6": "numModules()", +"8ac3ea2c": "recordEvaluation(uint32,uint32,uint8,uint8,uint8,uint8,uint8)", +"8ac44de2": "TBT_MINER()", +"8ac4e1d8": "TemperatureOracle()", +"8ac6a869": "isObsolete()", +"8ac78c80": "Docsign()", +"8ac81296": "ethTokenRatio()", +"8ac91be7": "unPause(bytes32)", +"8ac97efb": "whitelistDayCount()", +"8ac9fa73": "getTrustState()", +"8acb99ac": "owned(uint256)", +"8ace1732": "burnerOwner()", +"8ace4131": "CryptoTestCoin()", +"8aceaa4a": "GetTotalGamblerNum()", +"8acf94df": "setTierData(uint256,uint256,uint256)", +"8ad141ec": "updatePlayerContinusFund(address,uint256,uint256)", +"8ad14ee6": "setSuccessful()", +"8ad17f00": "setJackpotFeeRate(uint256)", +"8ad1896c": "bonusOptionsPromille()", +"8ad1d846": "getDebtorsDebts(address)", +"8ad20640": "allowedSinceReadable()", +"8ad2739b": "UMCCToken()", +"8ad2eaea": "has_token_sale_started()", +"8ad2f289": "checkPermission(address,address,bytes4)", +"8ad30473": "set_crowdsaleClosed(bool)", +"8ad46ba0": "b32toHexString(bytes32)", +"8ad476d7": "foundationReservation()", +"8ad47c47": "Dragon()", +"8ad5d779": "increaseOffsaleCountByOne()", +"8ad68253": "HostingDNS(uint256)", +"8ad682af": "ROLE_OWNER()", +"8ad8998c": "tokenTotalClaim(address)", +"8ad9a976": "getServiceStat(uint64)", +"8ad9c8c3": "GetUserConAddr(string)", +"8ada066e": "getCounter()", +"8ada1957": "TOKEN_WALLET()", +"8ada80a2": "getWinnersLen()", +"8adb208d": "withdrawDukeOwnersMoney()", +"8adba5a9": "cap4(address)", +"8add359d": "WorkerPoolHub()", +"8adde811": "test2_addingSecond()", +"8addf3ca": "performUpdateMemsize()", +"8ade246a": "makeBet(uint256,address)", +"8ae0368b": "challengeNumber()", +"8ae06cf7": "SAFeth()", +"8ae0a7ec": "uniq(uint32[])", +"8ae18dfd": "setRemainingLockDate(uint256)", +"8ae1d8d4": "StatsTotalSupply()", +"8ae3beb2": "setPending(bool)", +"8ae4200a": "revokePrivilege(string)", +"8ae470a9": "set_time(uint256)", +"8ae475a9": "notorize(string)", +"8ae5e0ec": "allowManyTokens(address[],address,uint256[],bool[])", +"8ae5e372": "getMouthValue(uint256)", +"8ae63d6d": "blockNum()", +"8ae69807": "sendAirdrop(address[],bool)", +"8ae69caa": "getCountryOwnershipList()", +"8ae76b77": "createToken(uint256,address,bool,uint256)", +"8ae79c8c": "LovelockPayment(address,bytes32,uint256)", +"8ae83bf3": "DISPLAY_CLASSIQUE()", +"8ae85b80": "storeN(uint8[],uint256,uint256,uint256)", +"8ae881a6": "initMetadata(bytes32,bytes32,bytes32,string,bytes32,bytes32,uint256,uint256,uint256,uint256,address)", +"8ae8c1f3": "transferFromCrowdfund(address,uint256)", +"8ae986cf": "registrantApprove(address)", +"8aea12b6": "c_paymentChannelBonusPercent()", +"8aea2f6e": "totalFundingAmount()", +"8aeb8f98": "isNotEmpty(string,string)", +"8aebebd9": "restartCycle()", +"8aece8b0": "MRNToEth()", +"8aed434a": "oracle_values(uint256)", +"8aee0443": "getNumberOfPurchases()", +"8aee3a54": "enableATMExchange()", +"8aef16d0": "appendSupplyChanges(address,bool,uint256)", +"8aef91f5": "TimeLeftBeforeCrowdsale()", +"8af1bac9": "isMoron(address)", +"8af1c825": "SALE_MIN_BUY()", +"8af2c328": "buyTokensFor(address,uint256,uint256)", +"8af2ce26": "districtLimit()", +"8af2d152": "limit6()", +"8af49ab7": "maintain(uint256,uint256)", +"8af51833": "_transfer(address,string,address,string,uint256)", +"8af57597": "getSingleDeveloper(address)", +"8af6c259": "totalDuration()", +"8af784dc": "expectEventsExact(address)", +"8af82a2e": "getFirstUnsortedOffer()", +"8af9f493": "reap(address)", +"8afa08bd": "setDrawDate(uint256)", +"8afa46b1": "refunds()", +"8afa7c6a": "createBasket(string,string,address[],uint256[],address,uint256)", +"8afbcdd0": "setEmissions(uint256[])", +"8afbf669": "withdrawRemainingTokens()", +"8afc3605": "Ownable()", +"8afcf1c9": "_transferSignership(address)", +"8afdc26e": "currentIcoPhaseBonus()", +"8aff794d": "milestoneSystem()", +"8b00299b": "setSellComissionUnits(uint256)", +"8b008f0f": "setBuyBackPrice(uint256)", +"8b00c467": "growthTokensWallet()", +"8b0133d5": "calcBonus(uint256,uint256)", +"8b018bca": "maxDividendDepth()", +"8b01bcc3": "isJobCancel(uint256)", +"8b021df4": "safePayback(address,uint256)", +"8b0254b6": "bilateralCancelOrder(bytes32)", +"8b02c8b2": "addFundTX(uint256,uint256)", +"8b031e1c": "_checkFundingGoalReached()", +"8b034136": "totalBids()", +"8b036ee2": "PRE_SALE_BONUS_PERCENTAGE()", +"8b038f7f": "edrBalance()", +"8b03fcfd": "backersRedeemed(address)", +"8b043e08": "getPublisher(address)", +"8b044a50": "getCofounditTokenAddress()", +"8b0451d9": "CAT_PER_ETH_SECOND_EARLY_BIRD_RATE()", +"8b048091": "getTicketsSoldToday()", +"8b048645": "setCCH_edit_26(string)", +"8b05afd2": "saveBytes(bytes32)", +"8b06a662": "submitTotalSellOrder(bytes32,uint256,uint256)", +"8b072f0e": "migratePlayer(address,address,uint256,uint256,uint256)", +"8b073bb3": "changeStageBlock(uint256)", +"8b077355": "saleDistributorAddress()", +"8b07b006": "_tokensToSell()", +"8b07edba": "getI1()", +"8b08292d": "isValidAirDropForAll()", +"8b087f3f": "signToCancelAgreement(uint256)", +"8b092580": "preIcoHasEnded()", +"8b095904": "getBalancePercentageLimit()", +"8b0980d9": "Phoenixcurrency()", +"8b0b8820": "transactionStructFromBytesSeriality(bytes)", +"8b0b9cac": "setLatestTokenAllocation(address,address,uint256)", +"8b0b9ed4": "getWinningNumber()", +"8b0c7f67": "CROWD_WAVE2_PERIOD()", +"8b0d0258": "amount(uint256)", +"8b0e093c": "INEXTokenNew()", +"8b0e9f3f": "totalStake()", +"8b0ee5a3": "GAS_PRICE()", +"8b0fc015": "submitChoose(address,uint256)", +"8b0fc19a": "TokenSaleAfterSplit(uint256,uint256,uint256,address,address,bool,uint256)", +"8b10297c": "test_0_ensureControllerWorks()", +"8b104534": "tokensPerBatch()", +"8b1097c1": "setGeneMixerAddress(address,address)", +"8b110e0a": "MeshPoint(int256,string,address)", +"8b11fb3e": "secureTokenPay(uint256)", +"8b121c9d": "airdropMinting(address[],uint256[],int256)", +"8b121cf0": "TransactionEscalated(uint256)", +"8b122274": "setPriceIncrease(uint256)", +"8b128249": "MASSTokenPreSale(address,uint256,uint256)", +"8b12befe": "accrueBonusTokens(address,address,uint256)", +"8b12c25f": "updateReferralMasks(uint256,uint256)", +"8b12dc23": "DewToken()", +"8b133c56": "WatahaToken()", +"8b13b64b": "timeFrame()", +"8b13d4e0": "addTeamMember(address,bytes32,address)", +"8b13dd7b": "getAcceptance(address,uint256)", +"8b14251f": "setNarcosCoreAddress(address,address)", +"8b144851": "getCompanyWallet()", +"8b14592a": "EtherNex(uint256,string,string,uint8)", +"8b147245": "update(bytes32)", +"8b148ef6": "usedHashGuard(bytes32)", +"8b156d4c": "EthernautsUpgrade()", +"8b157515": "tokensInfoOfOwner(address)", +"8b15a605": "proposalDeposit()", +"8b169c7a": "coinageContract()", +"8b17ab2f": "calculateOptions(uint256[9],uint32,uint32,bool)", +"8b1928a5": "getAllergies()", +"8b19a476": "oraclize_query(string,string,uint256,uint256)", +"8b1acf9e": "ZcnoxToken()", +"8b1ad6c6": "AuctionFinished(address,uint256)", +"8b1b4036": "newTrade(string,string,uint256,uint256)", +"8b1b925f": "isValid(address)", +"8b1c80e2": "MAIN_SALE_BONUS_PERCENTAGE_PHASE2()", +"8b1c8792": "Blocktix(string,uint256,uint256)", +"8b1cc4f4": "tokenBurner(uint256)", +"8b1cf21c": "unlocked(uint256)", +"8b1cffe0": "newBrehonContract(address,address,uint256,bytes32,address,uint256,uint256,address,uint256,uint256,address,uint256,uint256)", +"8b1d37d4": "testUserCanSignUpAndLogin()", +"8b1d67f9": "initial_disbursement()", +"8b1db910": "hasSuicided()", +"8b1f3206": "addlockAccount(address,uint256,uint256)", +"8b20468b": "updatePalette(uint8,uint8,uint8,uint256)", +"8b20d082": "_getPlayerThemeEffect(bytes,uint256)", +"8b20d9fa": "get_probability(bytes32,uint32,uint32)", +"8b214d5d": "imOwner()", +"8b21d307": "createProxyAddress()", +"8b220a31": "addProcessableAllocation(address,uint256)", +"8b223943": "stage3BeginTime()", +"8b22c7b3": "keeppetToken()", +"8b22e1df": "raiseDay1()", +"8b23397a": "_getFashionParam(uint256,uint16,uint16,uint16)", +"8b235f04": "lastSignedBlockHash()", +"8b24793d": "revealCeiling(uint256,uint256,uint256,bool,bytes32)", +"8b24c3e0": "getRequiredMajor()", +"8b257d3d": "isValidSignature(bytes32,uint8,bytes32,bytes32)", +"8b259bdb": "setupIco(uint256,uint256)", +"8b278707": "addFeeFeedBack(address,string)", +"8b278a30": "updateBanThreshold(uint256)", +"8b27c179": "maxPlay()", +"8b281018": "sendFunds(uint256)", +"8b2886ca": "setNorthPoleAddress(address)", +"8b28ab1e": "calculateFee(address,uint256)", +"8b28df17": "NCCUyen()", +"8b2909cf": "tokensFromPreviousTokensale()", +"8b290a72": "employeeShare()", +"8b294960": "balanceInTranche()", +"8b299903": "turn()", +"8b29b4fc": "setArray(string,string)", +"8b29e88b": "icoTokenCap()", +"8b2a6f58": "cancelEpochUpTo(uint256)", +"8b2a81ed": "HashGardToken()", +"8b2a9606": "addDigitalArtSellingItem(uint256,uint128)", +"8b2ad32e": "getSketchesOnOfferWithHolder(address)", +"8b2ae073": "setCouponMulFactor(uint256)", +"8b2b423a": "privateSaleAmount()", +"8b2be40e": "firstCurrentAmount()", +"8b2c434c": "CryptoGiants()", +"8b2d2dca": "setAllowMarketplace(bool)", +"8b2d4ed1": "creatorsPoolAddrs(uint256)", +"8b2de796": "housePercentOfTotal()", +"8b2e2b07": "CAKSale()", +"8b2e31dc": "STARTING_LOBSTER()", +"8b2e41b2": "getPlayerShipBattleWinsById(uint64)", +"8b2e6dcf": "publish(bytes32)", +"8b2e92ce": "rewardAngel()", +"8b2ef965": "securityDepositRegistry()", +"8b2f1652": "transcoderStatus(address)", +"8b2f7af3": "CalculateAllocatedUcash()", +"8b3049e1": "lotteryByETH5(address)", +"8b31aaca": "ZOB()", +"8b31bd50": "appreciationRate()", +"8b322791": "confirmCrowdsaleEnd()", +"8b325902": "totalTokenMintedOpen()", +"8b3272dc": "setUseService(bool)", +"8b3294e5": "addRecipientUpdate(bytes32,bytes32)", +"8b32f62a": "TEAM_AMOUNT()", +"8b33b4b2": "operations()", +"8b3437c5": "setDebugNow(uint256)", +"8b343e8f": "getMemberCredit(address)", +"8b34839f": "claimTokensEnabled()", +"8b34a4b3": "nestedSecondAllToAll(uint256)", +"8b35a244": "partner2()", +"8b360f4d": "teamSupply24Months()", +"8b36ed08": "CmmToken()", +"8b37112b": "doReclaim(address,uint256)", +"8b37691b": "TxOriginContract()", +"8b37e656": "getCallScheduledBy(bytes32)", +"8b384f9f": "getMenu()", +"8b392dff": "mModerators(address)", +"8b39bdba": "tokensDaily()", +"8b3aa967": "getDepositDelta()", +"8b3ac630": "buyShip(uint256,address)", +"8b3c4f6f": "Register(bytes4)", +"8b3ca352": "CFL()", +"8b3caf37": "Operatable()", +"8b3cda96": "IotPC(bytes32,bytes20,uint256,address,uint256,uint256)", +"8b3d10bf": "BMCTToken()", +"8b3dd749": "getInitializationBlock()", +"8b3e23d9": "preIcoSupply()", +"8b3edbdf": "changeManufacturerWallet(address)", +"8b3f0337": "extractNibble(bytes32,uint256)", +"8b3f863f": "getUserType(address)", +"8b40594d": "tokenExchangeRatePreSale()", +"8b409cec": "addRelease(bytes32,string)", +"8b42ad37": "test_twoFalseAssertNoMessage()", +"8b43234b": "endPeriodB()", +"8b449ffd": "woyaoqianqian(uint256)", +"8b44af0e": "transferETHS(address[])", +"8b44c99a": "capture(bytes32)", +"8b44f194": "TBOT()", +"8b45ab24": "SoccerBet(string,uint256,address)", +"8b45ce03": "_cancelVote(address,address,uint256)", +"8b46e1f1": "getVercodesOfCampaign(bytes32)", +"8b473c3d": "getKeysByDeviceId(uint8,uint8)", +"8b477adb": "transferFromByLegacy(address,address,address,uint256)", +"8b47c10b": "ERC721token()", +"8b490893": "CBO()", +"8b49644d": "test_invalidProposalBytecode()", +"8b4a781c": "getVoters(bytes32)", +"8b4b891b": "Duarte()", +"8b4b8a26": "updatePriceTier(uint8,uint256)", +"8b4bf731": "setEtherPriceUSD(uint256)", +"8b4c40b0": "donateETH()", +"8b4c4307": "EstLiquidationCap()", +"8b4ce7ce": "updateRegionPixelPrice(uint256,uint256)", +"8b4d199e": "recordTransaction(address,uint256,uint64,uint64,uint64)", +"8b4d3f20": "Xin(uint256,string,string)", +"8b4d56de": "createAndJoinCDPDai(uint256)", +"8b4e79c2": "delegateFromPool(uint96)", +"8b4e8a6a": "MedED()", +"8b4ef7d4": "ContractAdded(string,address)", +"8b4fac8e": "testsignature()", +"8b4fff3e": "register(address,string,string,string,uint256,string)", +"8b50cd34": "attackTile(address,uint16,uint256,bool,bool)", +"8b51365b": "set82Mode(bool,bool)", +"8b519e09": "mainSaleEnd()", +"8b51ca42": "roleList(bytes32,bytes32,address)", +"8b51d13f": "getConfirmationCount(uint256)", +"8b52463a": "commissionerAuctionCancelled(uint32)", +"8b533562": "giftsOfOwner(address)", +"8b534dd3": "goldenTicketMoved(address)", +"8b53808b": "ForwardToEIF()", +"8b53cbaa": "addNode(string,uint8)", +"8b5406af": "angelLockingPeriod()", +"8b542d74": "test_twoValidEqInt()", +"8b543b80": "maximumCredit(address)", +"8b5462da": "getMy()", +"8b55c1b3": "pushPlayer(address)", +"8b56aff8": "createPromoMonster(uint256,address)", +"8b57192b": "Woleum()", +"8b57ebc6": "claimSegments()", +"8b57f150": "newUserReward()", +"8b587b82": "createPuppySiringAuctiona(uint256,uint256,uint256,uint256)", +"8b58c64c": "getUserCap(address)", +"8b595440": "setBurnAdminApproval(address,address,address)", +"8b5a17df": "frozedCount()", +"8b5a64fb": "registerNameXname(string,bytes32,bool,uint8)", +"8b5b1c9a": "setPools(uint16,uint16,uint16)", +"8b5b4228": "listTiers()", +"8b5b9ccc": "getPlayers()", +"8b5bc550": "WPAYReward()", +"8b5c37c3": "L19_Token()", +"8b5caa66": "backendWithdraw(address,uint256)", +"8b5dc8a5": "IsAllowed(address)", +"8b5de2d9": "FunFairSale()", +"8b5e331c": "HatchEgg()", +"8b5e6679": "setNewIco(uint256,uint256,uint256,uint256,uint256)", +"8b5f42ca": "addDataStream(address,string,bytes32)", +"8b5ff1d9": "batchDeleteHpbNodeCache(address[])", +"8b603300": "updateLocation(int256,int256)", +"8b6084e4": "switchState()", +"8b615813": "fundLockTransfer(address,uint256)", +"8b629cbc": "m_ETHPriceUpdateInterval()", +"8b63c0e8": "returnTokenDepositState(address[2],uint256[7],uint8,bytes32[2])", +"8b63c86f": "setupRace(uint32,uint32)", +"8b64574b": "nextFreeze()", +"8b6497b9": "s41(bytes1)", +"8b649b94": "roundLength()", +"8b64b3af": "advisors_address()", +"8b64d70e": "owner_set_time_limit(uint256)", +"8b66bf68": "takeMyMoney(bytes32)", +"8b66d153": "STSTEST()", +"8b66e3b4": "hasPlayersInRound(uint256)", +"8b6715cd": "getTotalRankTokens()", +"8b673e7a": "setConfig()", +"8b67430e": "voteToCandidateIndex(uint256)", +"8b676ae8": "scheduleCall(address,bytes4,uint256,uint256,uint8,uint256,uint256)", +"8b67d56e": "getContributorsWallet()", +"8b67ef19": "distance(uint8,uint8,uint8,uint8)", +"8b68cd9d": "rndMax_()", +"8b692479": "addProduct(uint256,uint256)", +"8b6932f1": "saleTimeOver()", +"8b69759d": "removeAuthorizer(address)", +"8b699fbb": "KiemTra(uint256)", +"8b6aacc8": "stopSendWebGift()", +"8b6bd650": "ChangeCoinPresale()", +"8b6bf3dd": "intervalueToken(uint256,string,string)", +"8b6c1cfb": "totalHeldSupply()", +"8b6c69e5": "presaleLimitUnits()", +"8b6d6e48": "GoldPurityToken()", +"8b6d6f1d": "checksOn()", +"8b6dde89": "OwnerFreeze(uint256,address)", +"8b6df6bf": "DEMOHASHTOKEN(uint256,string,uint8,string)", +"8b6e10ac": "allBalances(address[],address)", +"8b6f8646": "CHCTokenERC20()", +"8b6f894f": "releaseEscrow(address)", +"8b6fb3ac": "GetOrganNumber()", +"8b6fc452": "tip(address,uint256)", +"8b7001d0": "ReceivedBCH(address,uint256,string)", +"8b7116e4": "reviewActiveMembers(uint256,uint256)", +"8b7261bd": "fetchAllVoteResultForNodes(uint256)", +"8b72a2ec": "transferPunk(address,uint256)", +"8b72ddf7": "setMinimalTokens(uint256)", +"8b7314e3": "BEToken()", +"8b7358a0": "getPoliceReportResult(uint256,address)", +"8b73a46b": "getNumberOfMembers()", +"8b73c10e": "buyChibiWithFcf(string,string,uint8,uint256)", +"8b745ff2": "valueBlocked(address)", +"8b76e976": "setRef(uint256,address)", +"8b77071c": "profitEth()", +"8b78a388": "reduceallrunmoney(address[],uint256[])", +"8b79bb43": "MTelCoin()", +"8b7a01e3": "depositOwnership(address)", +"8b7afe2e": "contractBalance()", +"8b7b45d9": "hashSchema(string,string)", +"8b7bcc86": "numWinners()", +"8b7bf3eb": "getAdminCount()", +"8b7c34d4": "setCompte_12(string)", +"8b7d38a1": "sPerDate()", +"8b7d6b05": "makerUnlockedKnc(address)", +"8b7e7a2e": "TBEToken()", +"8b7f0ddd": "register(address,address,string,string,bytes32[],uint256,string)", +"8b7f4cb7": "_calcDate0(uint256)", +"8b7fe5be": "DonationEvent(address,uint256)", +"8b800e6f": "migrationCounter()", +"8b805e65": "setUsers(address)", +"8b80bd19": "Migrated(address,uint256)", +"8b80fd5a": "extraDataToSubcourtIDAndMinJurors(bytes)", +"8b810c36": "epoch(address)", +"8b81b1af": "getLastOwner()", +"8b8211a1": "closeSale1()", +"8b82f4bc": "PAYCOINLY()", +"8b83209b": "payee(uint256)", +"8b832705": "getAmountOfGrantAccessInvestor(address)", +"8b833318": "getArtworkGroup()", +"8b8373ca": "AMBASSADOR_SIX()", +"8b8414c4": "getPoaConsensus()", +"8b845c1d": "withdrawCommisionToAddressAltCoin(address,uint256)", +"8b8519a2": "frozenTimeOf(address)", +"8b859409": "setRelease(bytes32,bytes32,string)", +"8b863095": "setContractorProposal(uint256,bytes)", +"8b87c544": "getInventory(address)", +"8b87e3b6": "bountyMinted()", +"8b886d04": "setCatchable(uint32,bool)", +"8b88a687": "getCost(address)", +"8b88c9cf": "setSpaceCraftAddress(address,address)", +"8b8c1177": "changeTokenOffer(uint256)", +"8b8c5ed9": "scheduleUnderwriteOraclizeCall(uint256,bytes32)", +"8b8d7c04": "writeConditions(uint8,string)", +"8b8e5fe2": "secondRewardPeriodEndBlock()", +"8b8ecffa": "teamAndFoundersWallet()", +"8b8f8504": "NodeManager(address[],address[])", +"8b906ca5": "enterBidForSketch(uint256)", +"8b90a378": "STATE_DONATION_ROUND_2()", +"8b91124d": "getSubscriptionClosedAt(bytes32)", +"8b91d5f6": "PRICE_CROWDSALE()", +"8b91e9a2": "getSubscriptionNonce(bytes32)", +"8b91f4a3": "ProofOfBitConnect()", +"8b9299dc": "authorizeMany(address[50])", +"8b93509f": "addTeamtoBoard(uint16,address,uint8)", +"8b935fb1": "keys(uint256,uint256)", +"8b93d3fc": "stake(uint256,bytes32,uint256,uint256,uint256)", +"8b959014": "DPC(uint256,string,string)", +"8b9596ed": "Eladporat()", +"8b95ec0c": "testAddBalance()", +"8b96801e": "soldTokensCount()", +"8b969c33": "editTokenProperties(string,string,int256)", +"8b96e41c": "_preMcFly()", +"8b9724d1": "setExclusiveRate(address,uint256,uint16,uint32)", +"8b9726c1": "multiAccessCallD(address,uint256,bytes,address)", +"8b975028": "setCooldown(uint256,uint256,uint256)", +"8b9801b0": "TheHashSpeed()", +"8b9847a5": "AmazonBestsellerLabs(uint256,string,uint8,string)", +"8b986566": "TokenTESTToken()", +"8b9997fd": "getOwnerHoverText(address)", +"8b99b742": "arbitrateCancelCampaign()", +"8b9a167a": "aliceClaimsPayment(bytes32,uint256,address,address,bytes20,bytes)", +"8b9add74": "minCapReached()", +"8b9af5c1": "wmul(uint256,uint256)", +"8b9b1cbd": "withdrawRemainder()", +"8b9b62b1": "toB32(uint256,bytes,address)", +"8b9bde27": "setNameHashByWriter(address,bytes32,address,bytes32)", +"8b9c7a36": "initialStartPrice()", +"8b9ce419": "getBorrowAmount(uint256,uint256,bool)", +"8b9ce6a6": "create(uint256,uint256,address,address,address,uint256,uint256,address,uint256,uint256,bool,bool)", +"8b9d6899": "lockedAmountOf(address)", +"8b9e2832": "mintRep(address,uint256)", +"8b9e4768": "_level()", +"8b9e5385": "MeterSlock(uint256,uint256,address)", +"8b9efe2d": "lastCountAddress()", +"8b9fae3f": "getETHback()", +"8b9ff6b6": "left91(uint256)", +"8ba19d4f": "EGGS_TO_HATCH_1CRAB()", +"8ba1c353": "_scaleExp(uint32,int32)", +"8ba1ebce": "updateGenVault(address)", +"8ba209b6": "isAccountVerified(address)", +"8ba28961": "spawn(uint32,int256,address)", +"8ba39ea8": "getChecksum()", +"8ba3ee95": "setConverterRamp(address)", +"8ba45307": "basePunish()", +"8ba47bdd": "ticker()", +"8ba4cc3c": "airdrop(address,uint256)", +"8ba5306b": "getDefaultRecommAddr()", +"8ba5758b": "HumanStandardToken(uint256,string,uint8,string,uint256)", +"8ba5807c": "raceCount()", +"8ba5882a": "manualOverrideEditionHighestBidAndBidder(uint256,address,uint256)", +"8ba64328": "getParentOperation(bytes32,uint8,uint8)", +"8ba677fa": "sendPremiumPack(uint256)", +"8ba7bdc4": "adminClaimTokenForUser(address)", +"8ba7e570": "executeCall(address,uint256,uint256,bytes)", +"8ba7e7f2": "createHash(address,bytes32,bytes32)", +"8ba7fe81": "updateActiveStatus(bool)", +"8ba88c9c": "internalRemoveManager(address)", +"8ba8da61": "payback(uint64)", +"8ba8ffc6": "buyGrapes()", +"8ba92763": "ABsCoin(address,uint256)", +"8ba93fcb": "magicStore()", +"8ba9a7bb": "FACTOR_4()", +"8ba9d9b0": "EmailSent(address,string,string)", +"8ba9f354": "testClearBitSuccess()", +"8baa28f7": "allocate(address,uint256,uint256,string,uint256)", +"8baa8b1f": "staker(bytes32,address)", +"8bab6718": "investorsInfo(address)", +"8bab8791": "testPkgUpdate()", +"8baba52a": "allStates()", +"8bace235": "kycAddresses(address)", +"8bace717": "getPresaleAllocation(address,address)", +"8baced64": "isInPool(address)", +"8bad5de9": "checkMinBalance(address)", +"8bad8d8e": "reserveManyTokens(uint256[],uint256)", +"8badbb8b": "ETPToken()", +"8bae2a03": "getStoredFib()", +"8baecc21": "revive(uint256)", +"8baeefce": "stopTrade()", +"8baf612f": "Ownable2()", +"8baf7a0c": "CryptoPrueba()", +"8bb04875": "executeRuling(uint256)", +"8bb0faee": "setRef(string,string)", +"8bb19439": "isPending(uint256,uint256)", +"8bb1a5ef": "executeDeal(uint256,string)", +"8bb204d4": "setCaptainIndexToCount(uint32,uint256)", +"8bb28de2": "minShare()", +"8bb307a2": "getMyTokenBalances()", +"8bb36848": "pollDataMultihash()", +"8bb55cae": "beforeExecuteForFutureBlockCall(address,uint256)", +"8bb5d9c3": "setCounter(uint256)", +"8bb64abe": "releasableBonus(address)", +"8bb75533": "split(string,string)", +"8bb7819f": "curMaxBet()", +"8bb87f5b": "isTank(address)", +"8bb88db6": "EtherSmart()", +"8bb8b2db": "getTokenPerEth()", +"8bb93173": "getNextTimeAtkPlayer(address)", +"8bb9fe58": "addStruct(uint256,string)", +"8bba143c": "getNumberOfContributors()", +"8bbade4e": "usdEth()", +"8bbb594a": "createActiveEdition(uint256,bytes32,uint256,uint256,uint256,address,uint256,uint256,string,uint256)", +"8bbb5af7": "test1Fails()", +"8bbb668b": "ItemSelling()", +"8bbb9fca": "buyPresale(address)", +"8bbbc7a2": "BitnanRewardToken(address)", +"8bbd309c": "BLTCoin(address)", +"8bbd7f87": "removeMemberById(uint256,address,address)", +"8bbda7e3": "setContent(string,bytes)", +"8bbdcf67": "_createProduct(uint256,uint256,uint256,uint256,uint256)", +"8bbdfaa6": "approveChange(address,uint256,bool)", +"8bbe005d": "setGateGas(uint256)", +"8bbe4719": "donateToPool()", +"8bbec9e4": "WALLET_T8EX_ADMIN()", +"8bbf037c": "addService(string,string,int256,uint256,uint256,uint256)", +"8bbf51b7": "DOW_WED()", +"8bbf7330": "FlyCareToken()", +"8bc008e6": "xra()", +"8bc04eb7": "DECIMALSFACTOR()", +"8bc05609": "setNotaryAddress(address)", +"8bc05808": "addLockTokenAllocation(address,uint256)", +"8bc05833": "setTotalSupply()", +"8bc0b887": "initializeAfterTransfer()", +"8bc12fd1": "cancelOrder(address[4],uint256[7],bool,uint8,uint8,bytes32,bytes32)", +"8bc19bda": "setupRaffle(string)", +"8bc19c04": "getPlacedNotes()", +"8bc30096": "numDrops()", +"8bc4a65f": "unPackDecision(uint256)", +"8bc5816a": "startStage1()", +"8bc5aab0": "FundsRecovered()", +"8bc5b3c5": "getExchangeInfo()", +"8bc5f845": "sendToken(address[],uint256)", +"8bc6a72b": "adjustCut(uint256,uint256)", +"8bc70769": "BTToken(uint256,string,uint8,string)", +"8bc7fa9c": "getCrop(uint256)", +"8bc82c9b": "registeredInMeeting(address,uint256,uint256,uint256)", +"8bc85b03": "bonusEnd()", +"8bc88d7c": "nameMiner(uint256,string)", +"8bc97754": "popcnt64(uint64)", +"8bc9b67f": "endOfGame(address)", +"8bca15d6": "balancesCanSell(address)", +"8bcad96a": "AdminstratorAdded(address)", +"8bcb4250": "_bytesToUint(bytes)", +"8bcb6f01": "getLoserAddressList()", +"8bcba0b2": "_transferToContract(address,uint256,bytes)", +"8bcba45a": "secondPartOfTeamTokensClaimed()", +"8bcbb60b": "betsArePayed(address,uint256)", +"8bccae3f": "tokensForCrowdsale()", +"8bccb1b4": "EosPizzaSlice(uint256)", +"8bccbf62": "setShares(address,uint256)", +"8bcd0680": "CrowdsaleiPRONTOLiveICO()", +"8bcddd5d": "getLogsNum(address,uint256)", +"8bcdecd7": "getIssuerStatus(address,address)", +"8bce09fa": "resolutionProposal(string,string,address,uint256)", +"8bcea54f": "viewComponent(address,uint256)", +"8bcf0eea": "GCAP()", +"8bcf649d": "GetRank(uint16)", +"8bcff416": "asyncSend(address,address,uint256)", +"8bd031fe": "submitIssue(uint256)", +"8bd0ba67": "addChild(address,address)", +"8bd0f12b": "_deleteBool(bytes32)", +"8bd1b610": "deleteTeller()", +"8bd25857": "joinManual(address,uint48)", +"8bd30ba1": "KekToken()", +"8bd317eb": "reclaim(address,uint256)", +"8bd379b5": "itDevAddr()", +"8bd50488": "Policy(string,address,address,string)", +"8bd50c1f": "privateSaleCloseTime()", +"8bd53bea": "oraclizeFees()", +"8bd56066": "WXC()", +"8bd5d30f": "scoreGroups(bytes32,bytes32,bytes32,bytes32)", +"8bd61f26": "tokensRemainder()", +"8bd66bb3": "ModifyMine(uint256,bool,string,uint256,string)", +"8bd6da16": "distributeXAIN(address[],uint256,uint256)", +"8bd76535": "currentExchangePrice()", +"8bd7920d": "BitcoinCashPrivate()", +"8bd7df6e": "sharePot()", +"8bd82b20": "getInCar()", +"8bd8669e": "transferAllTokensToOwner()", +"8bd87a69": "TimeMachineToken()", +"8bda1540": "getOldBalance(uint256,address)", +"8bdac196": "KLSToken(uint256,string,uint8,string)", +"8bdbbca9": "GameChannel(address,uint256,uint256,address,address,uint256)", +"8bdbee39": "str_length(string)", +"8bdc16fe": "changeHouseOracle(address,uint256)", +"8bdc558d": "hash_ack()", +"8bdc5a5f": "withdraw(address,address,uint8,bytes32,bytes32)", +"8bde7fc3": "ClickButton()", +"8bdff161": "getBonus()", +"8be1049d": "getTypeFromIndex(uint256,uint256)", +"8be13d71": "countOpenPackage()", +"8be18df9": "getOutcomeOfFirstPeriodByEntity(uint256)", +"8be3a897": "_v3()", +"8be3df0a": "vipPlacementNotDistributed()", +"8be4339b": "packsPerClaim()", +"8be4886c": "PUBLIC_RESERVED()", +"8be52783": "decreaseApprovalPreSigned(bytes,address,uint256,uint256,uint256)", +"8be7a96a": "registerLockedTokens(address,uint256,uint256)", +"8be7f4f5": "FOUNDER_FUND_1()", +"8be7fe95": "CreateDigitalAssetToken(uint256,uint256,string,string,string,string)", +"8be8f944": "lastBlock_f6()", +"8be909a3": "mainSaleWeiCap()", +"8be90b52": "averageGasPrice()", +"8be94a45": "Gallery_MuYi_No1()", +"8be97285": "MIN_TOKENS_TO_EXCHANGE()", +"8be9ca21": "GerritCoin()", +"8bea6a39": "safeSubtr3DL(uint256,uint256)", +"8beac22d": "STAEtoken()", +"8beb1af1": "PresalePool(address,address,address,uint256,uint256)", +"8beb60b6": "setAdminFee(uint256)", +"8beb9f12": "moveBlockValue(uint8,uint8,uint8,uint8,uint256)", +"8bec5b31": "reserveOwnership(address)", +"8bec683f": "getID_control()", +"8bee241b": "delegateOperation()", +"8bee78e6": "buySharesFromListing(uint256)", +"8bef5222": "CONFIG_MAX_TICKETS()", +"8bef7ba5": "updateBalances(address)", +"8bf0af3e": "purchaseTokens(uint256,uint256)", +"8bf13a30": "UTCStop()", +"8bf34237": "addPartner(address)", +"8bf35316": "givePermission(address,address,uint256)", +"8bf4515c": "read(bytes)", +"8bf57f4e": "getTimestamp(address)", +"8bf60537": "setDividendManager(address)", +"8bf62f14": "EtheropolyShrimpFarmer(address)", +"8bf68690": "mintToken(uint256,address,uint256,bytes32,uint8)", +"8bf74527": "EMISSION_FOR_SALESTAGE7()", +"8bf85ef0": "SigmaIOToken()", +"8bf87123": "_transfer(address,address,uint40)", +"8bf8a338": "getAttribute(bytes32,string)", +"8bfa4b4e": "tokenAdvisor()", +"8bfac3bb": "updateBalances(address,bytes32,string,uint256)", +"8bfb07c9": "release(address,address,uint256)", +"8bfb85c3": "agreeAmendment()", +"8bfbc753": "setEthBonus(uint256)", +"8bfc2f33": "delegateDAOTokens(uint256)", +"8bfe0aec": "getNextExit(address)", +"8bfe4e0b": "GaillardToken()", +"8bfe88c5": "ArteufToken(address,address)", +"8bffc74d": "mainstreetToken()", +"8bfff5a0": "setPurchaseableMode(uint256,bool,uint256)", +"8c003134": "Raffle_ID()", +"8c00ce76": "unhalt_30day()", +"8c0124fb": "transferAndFreezeMulti(address[],uint256[],uint256[],uint256[])", +"8c02d13f": "MAX_NUMBER_OF_PREMIUM_SALES()", +"8c02e029": "save2(address,bytes,string)", +"8c0320de": "payforflag(string,string)", +"8c041d7c": "editProfile(string,bool,string,bool,uint256,bool,bool,bool,string,bool)", +"8c042317": "startQuater()", +"8c04b985": "readSellTokenAmount()", +"8c063686": "getRelayAuthority()", +"8c06fa18": "PRICE_PREICO()", +"8c088d98": "winMultiplePer()", +"8c08ae0d": "withdrawEtherRemaining()", +"8c09138f": "fourth()", +"8c0989ab": "MultiServiceFactory(address)", +"8c09bfdc": "shake(uint256)", +"8c0a41f2": "gibtesnet()", +"8c0b1588": "createNFT(uint256,address,bytes32,bytes32,bytes4)", +"8c0b372d": "e6c65e93()", +"8c0b4ae5": "setGenesMarketAddress(address,address)", +"8c0bae5b": "releaseRedTeamTokens()", +"8c0c0368": "_confirmOneSell()", +"8c0c9c07": "updateCampaignAbi(string)", +"8c0cf897": "develop()", +"8c0d0c29": "mark()", +"8c0d4199": "lock(address,address,uint256,uint256,bool)", +"8c0d6593": "CustomDealICO(uint256,uint256,uint256,address,uint256,uint256)", +"8c0dacf2": "deleteRecord(bytes32)", +"8c0dee9c": "operatorTransferByPartition(bytes32,address,address,uint256,bytes,bytes)", +"8c0e156d": "scheduleCall(bytes4,uint256,uint256)", +"8c0e299a": "proposeCompanyAllocation(address,uint256)", +"8c0e2a31": "regProxy(address)", +"8c0e45f6": "test_openRegistryRules()", +"8c0ead61": "_updateMLBPlayerId(uint256,uint256)", +"8c0ec0d1": "changeClient(address)", +"8c0f082c": "setFLKDForGas(uint256)", +"8c0f8e11": "getWorkerScore(address)", +"8c0ff5b7": "maxWithdrawal()", +"8c10671c": "addManyToWhitelist(address[])", +"8c115322": "isP2PKH(bytes,uint256,uint256)", +"8c118cf1": "verify(uint256,uint256,uint256,string,string,bytes32[2])", +"8c12324a": "Mire()", +"8c1256b8": "Recovered(address,uint256)", +"8c12c35c": "BTWO_CLAIM_PERCENT()", +"8c12d8f0": "arithmetics(uint256,uint256)", +"8c133a77": "previligedBalances(address)", +"8c133c25": "changeBetPrice(uint256)", +"8c13aabe": "lockStages(uint256)", +"8c14db73": "testThrowsSaleWalletIncorrectBlock()", +"8c155b5b": "tradeForTokens(address[2],address,bytes,bytes)", +"8c156213": "generateHash(address,string)", +"8c160095": "deleteInt(bytes32)", +"8c165146": "initSale1()", +"8c165932": "sendShip(uint32,uint32,address)", +"8c167076": "setHoldersList(address)", +"8c172fa2": "getEvent(bytes32)", +"8c17c5ab": "setNowTime(uint256)", +"8c17fc91": "getWeaponsArmy2(uint256)", +"8c19773f": "addBlock(address)", +"8c19c175": "getStageState(uint256)", +"8c19d2ca": "setCombatWonTeam(uint256,uint128)", +"8c1ab426": "WithdrawalofFunds(uint256)", +"8c1c7acc": "icoThreshold2()", +"8c1d01c8": "defaultPayment()", +"8c1d4a0a": "GreenEcoMinerToken()", +"8c1d8941": "transferLockedBalances(address,address,uint256)", +"8c1d92af": "distributePresaleTokens(address[],uint256[])", +"8c1d9f30": "isValidCandidate(bytes32)", +"8c1e04a6": "updateGenerationDict(uint256,uint64)", +"8c1e21da": "tokenPreSale()", +"8c1f85e5": "FeeSetup(address,address,uint256)", +"8c206979": "_freeze(uint256)", +"8c2081b5": "RewardsCoin()", +"8c217d06": "zsjz(uint256,string,string)", +"8c21f6bb": "getLockedGroup(uint8)", +"8c21ffba": "supplyLockedB()", +"8c22ac8b": "Account_frozen(address)", +"8c2305fd": "stakeBela(uint256)", +"8c25466a": "mintPreSale(address,uint256)", +"8c254c0b": "walletDev()", +"8c259654": "getRegistryDataRegistry()", +"8c25f54e": "linkContracts(address)", +"8c261e2c": "getHashRightPad()", +"8c26691e": "RanToken(address,address)", +"8c267b97": "cmoAddress()", +"8c26a340": "generateOrderByAdminWithPayee(address,address,address,uint256,string,string,string)", +"8c26c937": "STQPreICO3TestHelper(address,address)", +"8c26ebf7": "EgretiaToken()", +"8c272dba": "_buyin(address,uint256)", +"8c273a98": "getRefBonus(address)", +"8c2779f5": "gold_token_storage()", +"8c28c16e": "STAGE_TWO_ETHRaised()", +"8c28fd6e": "mintHelper()", +"8c2962b9": "setBuyAgent(address)", +"8c299d0c": "AdoptionOfferCancelled(bytes5)", +"8c29bce5": "setJoule(address)", +"8c2a5938": "setAllowedToBuyBack(bool)", +"8c2b8283": "WeiLaiExToken()", +"8c2d1549": "getTotalMined()", +"8c2d396f": "TelegramOpenNetworkContract()", +"8c2e6b3f": "ChangeSellRate(uint256)", +"8c2ec28d": "TestCTR()", +"8c2f04d9": "distributeUsingVaults(uint256,uint256,uint256,address)", +"8c2f6458": "calculatePreviousPrice(uint256)", +"8c30079a": "generateTeamTokens()", +"8c30779b": "getAvailableVestingAmount(address)", +"8c3088c6": "HeritableWallet(address,address,uint256)", +"8c308a71": "Anemoi(uint256,string,string)", +"8c3135f2": "poolTokenBalance()", +"8c31d67e": "getNoOfSoldToken()", +"8c324604": "MAX_TOKENS_EARLY_INVESTORS()", +"8c32c568": "Airdrop(address,uint256)", +"8c32e774": "isMaxTokensReached()", +"8c33417c": "WankCoin()", +"8c335b4b": "oceanBonus()", +"8c339a58": "QSHUCOIN()", +"8c33a5c4": "RESEARCH_AND_DEVELOPMENT_TOKENS_PERCENT()", +"8c343aee": "TestIssued()", +"8c346690": "toggleHalt(bool)", +"8c34dbec": "bitcoing()", +"8c363fda": "AbstractToken()", +"8c366dd3": "newinitialSupply(uint256)", +"8c3692c3": "popToken(address)", +"8c36ae89": "clearReward(address)", +"8c374d8d": "releaseApproval(address)", +"8c3753d7": "WEI_PER_FINNEY()", +"8c377ca6": "UnsetUsername(string,address)", +"8c379133": "Water(string,string)", +"8c37ce04": "MeetTokenBase()", +"8c37e152": "bountyTokensReserve()", +"8c37e31e": "setSpawningManager(address)", +"8c37edc4": "USN(address,address,bytes32,uint256,uint256,uint128)", +"8c382e22": "checkIsAssetPartOwner(bytes32,address)", +"8c3846e8": "ConsumerAddition(address)", +"8c38eddd": "_clearAddressFromCrowdsale(address)", +"8c397363": "setFinancialAddress(address,address)", +"8c39bf96": "DredgrSwapSolo(bytes5,bytes5,bytes32,bytes32,uint256,bytes32,bytes32,uint256)", +"8c39cb93": "makeClaim(bytes32,string,uint256,bytes32,uint256,uint256,uint8,uint256)", +"8c3b4fea": "_addVesterManager(address)", +"8c3b6f0e": "getCrystalGeneKindWeight(uint256)", +"8c3c00aa": "overdraftPeriodAmount()", +"8c3c4b34": "getSaleStatus()", +"8c3d5897": "MANHATTANPROXY2NDAVE()", +"8c3e1ff1": "modexp(bytes,uint256,bytes)", +"8c3e9e1a": "verifyYourself(string,uint256)", +"8c3f71b2": "_getCurrentTradableToken()", +"8c3f914a": "spread(bool)", +"8c3fae8c": "BeeUnity(uint256,string,string)", +"8c404cf1": "stablesCities(uint256)", +"8c41399c": "view30()", +"8c41d101": "LogAgreementAccepted(address)", +"8c421815": "RefundedTokens(address,uint256)", +"8c43a6f0": "updateBlockVoterProposal(uint256,address,bytes32)", +"8c4406c1": "setInputName(uint256,uint256,uint256)", +"8c4430b4": "setFinalLotteryAddress(address)", +"8c44cb27": "creationQuantity()", +"8c44dfb5": "bids_computed_cursor()", +"8c45cf24": "addJobContractMessage(uint256,string)", +"8c461e97": "setValueAirDrop(uint256)", +"8c46c7cd": "betAmount_()", +"8c47ddcc": "refundOwner()", +"8c4899ab": "ownerOfPlanet(uint256,uint256,uint256)", +"8c497285": "ChangeAddressTrust(address,address,bool)", +"8c4a6f62": "delMinter(address,address)", +"8c4af723": "changeNewRoundDelay(uint256)", +"8c4b0c58": "FrozenProfit(address,bool)", +"8c4b0e7e": "setOrganiser(address)", +"8c4b7300": "ViewBet()", +"8c4b87d2": "chris()", +"8c4c26a3": "BunToken(address)", +"8c4c564d": "deletePoll(bytes32)", +"8c4d3193": "getOrderDealTimeInterval()", +"8c4d59d0": "ticketCounter()", +"8c4dd5cd": "Democracy()", +"8c4e3f32": "_setApprovalForAll(address,address,bool)", +"8c4e8c21": "nextMintTime()", +"8c4e9c50": "prepareSell(address,uint256)", +"8c4ef31a": "getremainTokensperType(uint8)", +"8c4f7dae": "getMatchCount()", +"8c500418": "getICODate()", +"8c50d756": "bidSuccess(uint256,address,uint256)", +"8c518026": "_preSale(address,uint256)", +"8c523e27": "setFechHpbBallotAddrAddresss(address)", +"8c529628": "getVoteFromProposal(uint256,uint256)", +"8c52dc41": "enableRefunds()", +"8c5344fa": "countThisRecursive(uint256)", +"8c534d54": "getTokenTxnNum()", +"8c53f61d": "receiveETH(address)", +"8c546f81": "GNT()", +"8c549ef7": "COLOR_BROWN()", +"8c55041c": "Announcement(address[],uint256,uint256)", +"8c551742": "createItem(string,uint256)", +"8c55284a": "confirm(uint256,bool)", +"8c5597fd": "finalizeContributionEvent()", +"8c561592": "canUpdateInvoicingAddress(string,address)", +"8c564ebf": "freezeBypassing(address)", +"8c5871bf": "getLocksUnlockDate(address,uint256)", +"8c590917": "contribute(uint256,uint256)", +"8c590b5d": "getAllMatingAnimals()", +"8c59f7ca": "cancelOrder(address[5],uint256[6],bool,uint8,uint8,bytes32,bytes32)", +"8c59fba0": "DATP()", +"8c5a03bb": "SimpleDistributor()", +"8c5aae96": "LocalsMembership()", +"8c5ae183": "RemoveMod(address,address,bool)", +"8c5b830e": "getInviteeInfo(uint256)", +"8c5cc61c": "approvedreg(string,string,string,string)", +"8c5ce82a": "powerTest(uint256,uint256,uint32,uint32)", +"8c5d5e87": "ownerSetMod(bool)", +"8c5e06b1": "Channel(address,address)", +"8c5e2b0e": "MainSaleStart()", +"8c5f2d5d": "get_all_payment(uint256,address)", +"8c5f6d5a": "SetDebugExtra(uint32,uint8)", +"8c5f997e": "NewEntry(address,uint256,uint256,uint256)", +"8c5fb7fb": "modifyMember(string,string,string,string)", +"8c60e806": "closeContributions()", +"8c614502": "addCountry(address,uint256)", +"8c618066": "addressOfName(string)", +"8c6310ac": "NextOpen()", +"8c638152": "setApoderado(bytes32,bytes32,bytes32)", +"8c64400d": "updateTierDuration(uint256,uint256)", +"8c648117": "actualPrice()", +"8c6486c4": "sendRegistration()", +"8c64eb4f": "switchCrowdState()", +"8c655550": "advisorsAllocatedAmount()", +"8c6589b2": "getLastSTCPrice()", +"8c65f15d": "clearBonuses()", +"8c662ffa": "LogCollect(address,uint256,uint256)", +"8c663229": "lastSellPrice()", +"8c663ffc": "getBounsWithRoundID(uint256)", +"8c66c9fc": "findBest()", +"8c66d04f": "setFeeCalculator(address)", +"8c66f294": "distributeFeeRewards(address[],uint256)", +"8c676aaa": "CUZ()", +"8c67f63a": "calculatePayment(uint256)", +"8c682bde": "setWinnerAndWithdrawAllFunds(address)", +"8c6838ba": "getPost()", +"8c68bc3e": "SetContractorManager(address)", +"8c69554d": "OwnerRefunded(address,address,address,uint256)", +"8c69930d": "getNewFallbackDepositEffectuation()", +"8c69c559": "Crypbest()", +"8c6aefcf": "chip(uint256)", +"8c6b6085": "supportNewVoter(address,address)", +"8c6ba233": "isLateBy(address)", +"8c6c8323": "buyTokens(address,address,uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"8c6f2ec1": "setCompte_17(string)", +"8c6fc437": "standardICO(string,string,uint8,address,uint256[],uint256[],address[2],address[])", +"8c6fd8ec": "removeByIndex(uint256)", +"8c701ba8": "releaseRoots()", +"8c717138": "lastBlock_a1Hash_uint256()", +"8c71bed2": "unlockTeamTime()", +"8c71eaf1": "TokenBEN(uint256,string,uint8,string)", +"8c71ec16": "create(address,uint256,uint256,uint256)", +"8c7229cb": "pantura()", +"8c727fa3": "oldCirculatingSupply()", +"8c72c54e": "publisher()", +"8c72d4a4": "getStageTokenAmount(uint256,uint8)", +"8c733fdf": "weiToUsd(uint256)", +"8c73596c": "init(address,uint8,uint256,uint256,uint256,uint32,uint256)", +"8c748334": "cancelBuyOrder(uint256,uint256)", +"8c74c5c0": "bonusOff()", +"8c74d62c": "LockedInToken()", +"8c7565dc": "ADChainGrants(bytes32,bytes8,bytes32,bytes)", +"8c756b1d": "balanceByAd(address)", +"8c7698df": "lowerCase(bytes32)", +"8c76b4b7": "addTrustedContracts(address[])", +"8c771a8e": "newEscrow(address,uint256)", +"8c787768": "abbcwalletcoin()", +"8c789fb2": "setTokenBudget(address,uint256)", +"8c794114": "prizeWithdrawal()", +"8c79a24d": "refName(uint256)", +"8c79ca5d": "AddMember(address,uint256)", +"8c7a63ae": "getTokenInfo(uint256)", +"8c7a8140": "extractVestedOptionsComponents(uint256,uint256,uint256)", +"8c7c35b9": "internal_tester()", +"8c7c4016": "GameLogicContract()", +"8c7c9e0c": "eth()", +"8c7d1e8a": "MyKillerContract()", +"8c7d3241": "total_iou_available()", +"8c7d58aa": "isTimeExpired()", +"8c7dd9ec": "_canReveal(address,address)", +"8c7e1227": "setupStakingPriceFeed()", +"8c7e5008": "maxDonationInWei()", +"8c7e763b": "HSCC()", +"8c7f7806": "AfeliCoinPresale(address)", +"8c7fcd46": "BLVToken(uint256,string,string)", +"8c80fd90": "setMinStake(uint256)", +"8c812c51": "PhoenixExchangeFund()", +"8c817b6e": "registered(uint256,address)", +"8c82790b": "getReg3()", +"8c82dccb": "updateStatuses(bytes32[])", +"8c832ef4": "GalaxyCoin(uint256,string,string)", +"8c849f3f": "getMemes()", +"8c85ec66": "getCurrentDayRestDepositLimit()", +"8c864dfe": "_updateChecksum()", +"8c86ec20": "NMC(uint256,string,string)", +"8c877527": "allowTransfert()", +"8c87b2fc": "Identity(bytes32,bytes32)", +"8c882958": "LEToken()", +"8c88512f": "initializeCrowdsale(address)", +"8c88752a": "ContributorList(uint256)", +"8c8885c8": "setDecimals(uint256)", +"8c88b85f": "_finalizeRound()", +"8c88d716": "transferIfRequirementsMet(address,address,uint256,bool)", +"8c89b1c7": "setINCENTIVE_POOL_ADDR(address)", +"8c8a03ac": "setBucketManager(address)", +"8c8a261a": "devMiningRewardChanges(uint256)", +"8c8a40bd": "hashNotFound(address)", +"8c8b31ab": "dhanaToken()", +"8c8b6fc5": "challengeSubmitted(bytes32,bytes32)", +"8c8b802e": "getLimitPeriod()", +"8c8b9d54": "setEmployeeStorage(address)", +"8c8bc5ce": "ChangeICOStart(uint256)", +"8c8d067f": "chosenProposal()", +"8c8d2ede": "team1()", +"8c8d36c2": "THANKSTEST3()", +"8c8d98a0": "toTimestamp(uint16,uint8,uint8)", +"8c8df7cd": "GOTokenCrowdsale()", +"8c8e2478": "convertTokens()", +"8c8e5f1f": "BlockTubePrepaid()", +"8c8e8fee": "token_address()", +"8c8ee490": "checkReleaseAt(address)", +"8c8f94f5": "DeletePrice(uint256)", +"8c8f95fb": "lockFunds(uint256)", +"8c8f9c0e": "issueTokenToAddress(address,uint256,uint256)", +"8c8fc30b": "addAd(uint32,uint32,string,string,string,uint256)", +"8c907c0d": "LanderToken(uint256,string,uint8,string)", +"8c90b2ea": "pay055(address)", +"8c9151ae": "voteProposal(uint256,bytes32)", +"8c91bd3e": "addMoves(uint256,uint256[2])", +"8c91daac": "startRoundSeed()", +"8c920a38": "testSanityCheck()", +"8c924e9c": "incrementRead()", +"8c93256e": "transferReward(address)", +"8c934d71": "forceRefundCfd(uint128)", +"8c937da3": "WALLET_LB_TEAM()", +"8c9425e4": "privateLockAddress()", +"8c943b6c": "setDistrictCode(bytes32)", +"8c944339": "setActiveSkin(uint256)", +"8c944bb2": "_createPrimordialLot(address,uint256,uint256,uint256)", +"8c945d38": "takeOffItem(uint256,uint8,address)", +"8c94db38": "MMCoin(uint256,string,string)", +"8c9512bc": "companyTokens()", +"8c9515ea": "doPayouts(uint256[49],address[49],uint256)", +"8c9540d3": "isCommittee(address)", +"8c95acee": "getTreshold(uint256)", +"8c96a2c9": "getAssetPackPrice(uint256)", +"8c96a538": "COO_SHARE()", +"8c96e34b": "betIsSettled()", +"8c98117c": "getBill(uint256,uint256)", +"8c988a46": "isLinkedWallet(address)", +"8c9924d5": "AddrMarketing()", +"8c99d363": "updateTokensToInvestor(address,uint256)", +"8c9a4f13": "FundsTransferred(address,uint256)", +"8c9ae56f": "QueryPlayerBonus(address,uint256)", +"8c9b2cd1": "ModultradeProposal(address,address,address)", +"8c9c2977": "newMember(uint8,bytes32,address)", +"8c9ce20c": "_addressNotNull(address,address)", +"8c9cf205": "SignVersion(string,string)", +"8c9d8300": "withdrawForAdmin(address,uint256)", +"8c9dd650": "Etherlott()", +"8c9e81e5": "triggerICOState(bool)", +"8c9ecd00": "toDec()", +"8c9f7074": "setInterestFeePercent(uint256)", +"8c9f7b39": "endSale(address)", +"8c9f8935": "ClaimSet(address,address,bytes32,bytes32,uint256)", +"8c9fcfe2": "payForUpgrade(address,uint256)", +"8ca0dd20": "tgeCap()", +"8ca10f9b": "sendRemainingTokens(address)", +"8ca17755": "etheraffle()", +"8ca17995": "divest(uint256)", +"8ca3b448": "addUser(address,address)", +"8ca3c553": "setData(string,string)", +"8ca47688": "WhiteListUpdated(address,bool,address)", +"8ca4eef6": "getBuild(bytes32)", +"8ca517dd": "getActiveBuyDetails(bytes32)", +"8ca51f82": "setMinimumClaimValue(uint256)", +"8ca5d525": "removeAllowedHICAddress(address)", +"8ca5da35": "mintManual(address,uint256)", +"8ca6c287": "InsurContract()", +"8ca6f747": "potatoBalanceOf(address)", +"8ca74163": "BZCToken(address,uint256)", +"8ca79351": "ethPriceIn()", +"8ca84d40": "preparationPeriodTrainingFeeMultiplier()", +"8ca9ac01": "LogBeerClaimed(address,uint256)", +"8ca9e721": "finalizeCrowdSale()", +"8caa0083": "teamCount()", +"8caa5c91": "DataBase()", +"8caaaae6": "totalWeiPrice()", +"8caaab4d": "verifyProofOfStakeInternal(uint256,bytes32,bytes32,uint256,bytes32[],uint256[],uint256,uint256)", +"8caad7b5": "changeMinDepositAmount(uint256)", +"8caba7b7": "startCharging()", +"8cac1939": "TOKEN_TEAM()", +"8cac3b42": "addDividend()", +"8cac5f55": "feeForTheStakingInterval()", +"8cad5826": "FundTransfer(uint256,bytes32,address,address)", +"8cadaa5d": "TokenFreeze()", +"8cadd6a2": "getVestedBalance(uint256,uint256,uint256,uint256)", +"8cae013e": "signatureFunc(bytes)", +"8cae1374": "editBlock(uint8,uint8,uint256,int8[5])", +"8cae59dd": "heapSort(uint32[])", +"8cae711f": "mintLiquidToken(address,uint256)", +"8cb09d4d": "GCTToken()", +"8cb0a511": "approve(uint256,address,uint256)", +"8cb18ef6": "needFightToAdult()", +"8cb1b614": "setWhitelisted(address,address,uint256)", +"8cb1e9c1": "unlockedAt()", +"8cb240b0": "saasPayment(address,uint256)", +"8cb36aef": "requestCoinToUSD(string,bool,uint256,uint256)", +"8cb3728c": "getAllRevisionTimestamps(bytes32)", +"8cb39385": "getMinBid()", +"8cb3c89f": "loadEthBalances()", +"8cb47a2f": "CrowdForceSampleToken()", +"8cb5497c": "setOperator(bytes32,bool)", +"8cb56999": "GetExpireTime(uint256,uint256)", +"8cb5a0c0": "removeCoordinator(address)", +"8cb858cb": "PRCVToken(uint256,string,uint8,string)", +"8cb996df": "LogMigrationEnabled(address)", +"8cbb02ad": "Marijuana()", +"8cbb13e7": "TokenRHT()", +"8cbb6593": "SHNZ2()", +"8cbba6cf": "isPreWhiteListed(bytes32)", +"8cbbe25f": "NIMFA_PER_ETH_PRE_SALE()", +"8cbc8c0b": "lockholderNumber()", +"8cbcbca2": "_payChicken(address,uint256)", +"8cbcca07": "fillBuyOrder(uint256)", +"8cbdf1d1": "mintARC(address,uint256)", +"8cbe775a": "Bitdepositary()", +"8cbe898d": "CommitteeLimits(uint256,uint256)", +"8cbeb340": "ControlContract(address)", +"8cbf4145": "confirmPrintProxy(bytes32)", +"8cbfa1ec": "quoteAsk()", +"8cc02403": "cobrarImpuesto(uint256)", +"8cc04ebb": "_appendUintToString(string,uint256)", +"8cc17117": "forceRecoverCollateralInternal(address)", +"8cc2f547": "DiceGameCrowdsale(address)", +"8cc30c6f": "buyStageDataRecord(uint256,uint256,uint256,uint256)", +"8cc34ed7": "zilla_remaining()", +"8cc40d71": "dividend_amount()", +"8cc4ab11": "getPurchaseTimestampEnds()", +"8cc50ecd": "addBlock(string,uint256,string)", +"8cc519bf": "companyTimelock()", +"8cc51eda": "kitties(uint256)", +"8cc5510f": "setTeamAddress(address,bool)", +"8cc55473": "bulkTokenMint(address[],uint256[])", +"8cc57368": "getUserTokens(address,uint32)", +"8cc5cde2": "isLunyrToken()", +"8cc5e56e": "revokeLockByIndex(address,uint256)", +"8cc60a61": "isStoreActive(uint256)", +"8cc60eca": "SS()", +"8cc63bfb": "marketingFunds()", +"8cc6acce": "updateConfig(bytes)", +"8cc78a40": "option20symbol()", +"8cc7ea0e": "Xian()", +"8cc89e1b": "TCCoin()", +"8cc8baaf": "getBuyPriceTimes()", +"8cc8c236": "_transfer(address,uint256,bytes)", +"8cc9638c": "fundBurn(address,uint256)", +"8cc98bc3": "approveEliminate(address,uint256)", +"8cc99aa3": "getAmountForCurrentStage(uint256)", +"8cca5a3f": "withdrawWallet(address)", +"8cca8f64": "canClaimRefund(address)", +"8ccb381b": "tenthTotal()", +"8ccb4daf": "getPositionMaxDuration(bytes32)", +"8ccb59e8": "revealWinner(uint256)", +"8ccb9f2d": "del_admin(address)", +"8ccbd6da": "freezeToken()", +"8ccc04ea": "proofOfConceptCap()", +"8ccc4781": "Math(int256)", +"8cccc341": "initiateChallenge(address)", +"8cccf2df": "viewServiceReward()", +"8ccd227c": "gameRequestTokens(address,uint256)", +"8ccdcf80": "tokenSalePausedTime()", +"8cce10c8": "rank(address,address,uint256)", +"8cce49c9": "mokenData(uint256)", +"8cce7e92": "removeMarketFromWasCalled()", +"8cceb1e8": "notifyBurn(address[])", +"8cd0a573": "transferWithCustomReserving(address,uint256,uint256)", +"8cd0fc3d": "TRONClassic(uint256,string,string)", +"8cd221c9": "roundId()", +"8cd25904": "calculateAndCreateTokens(uint256)", +"8cd3751b": "newProposal(address,uint256,uint256,bool,bool,address,uint256,uint256,uint256,uint256)", +"8cd3f064": "acceptToken(address)", +"8cd41fae": "StartCompetition(uint8,uint8,uint8,uint8,uint80,uint32)", +"8cd41fd8": "referrerBonus2()", +"8cd42991": "getTimeRemaining(uint256)", +"8cd47415": "zkWithdrawTrusted(bytes32,uint256,address,uint256[2],uint256[],uint256[],uint256[],uint256)", +"8cd4d21a": "x(uint256,address)", +"8cd4fdf1": "maxGamble()", +"8cd53767": "withdraw(bytes32,address,address,uint256,uint256,bytes32,bytes,bytes,bytes32)", +"8cd5dce3": "setNextRoundRequiredBetAmount(uint256)", +"8cd6c7fa": "seedSingleSaleCount()", +"8cd70e72": "isInitalized()", +"8cd85846": "totalTranches()", +"8cd85dc2": "getWinNumbers(uint256)", +"8cd8bd05": "IanCoin()", +"8cd8db8a": "init(uint256,uint256,uint256)", +"8cd90e31": "EAToken(uint256,string,uint8,string)", +"8cda2a15": "SafePromo(string,string)", +"8cda4430": "lookupRoyalty(address)", +"8cdb1719": "approveCertification(uint256)", +"8cdbd8fb": "remainToken()", +"8cdc86a6": "sort()", +"8cdcbdef": "closeBlock()", +"8cdcdae1": "testControlUpdateLatestRevisionNotOwner()", +"8cde43dc": "getCrowdsaleMaxRaise(address,bytes32)", +"8cde4667": "BANKNET()", +"8cdf31fa": "Cryptoya()", +"8cdfb1e6": "transferIfHF(address)", +"8ce0080f": "updateGuMasks(uint256,uint256)", +"8ce05b54": "bornFamedStar(address,uint256)", +"8ce060fb": "FounderSwitchRequestEvent(address)", +"8ce0bae8": "Canceled(address,uint256,address,address,uint256,address,uint256,uint256)", +"8ce0bd46": "Deposit(address)", +"8ce113dc": "right60(uint256)", +"8ce187fd": "raisedUSD(uint256)", +"8ce25a93": "numAccounts()", +"8ce2ae2d": "creator_new()", +"8ce2e0ea": "addLastTwoAmbassadors(address,address)", +"8ce2f386": "AcceptsOmniDex(address)", +"8ce3ee62": "transferEmpire(address)", +"8ce450de": "assetThaw()", +"8ce4f1b2": "setGasRewardPercent(uint256)", +"8ce53e5b": "getMaximumInvestmentPerDay()", +"8ce5877c": "removeSpender(address)", +"8ce69b72": "USD_IN_ETH()", +"8ce74426": "protocol()", +"8ce795f5": "SerbiavsBrazil()", +"8ce7be01": "getUniqueSpinnerPrice()", +"8ce7ff4a": "getVote(uint256,uint256,uint256)", +"8cea577a": "allowFunction(bytes32,bytes4)", +"8ceaa23f": "setAvailablePositions(uint256)", +"8cead4bf": "currentProfit()", +"8cec9176": "SimpleMultisigWallet(address[],uint256)", +"8cec9f4c": "playlotto(uint256)", +"8cecd03e": "INVESTOR_TOKENS()", +"8cece594": "countClaimBackers()", +"8cecf66e": "_inverse(uint256)", +"8ceda04d": "getCounting(bytes32)", +"8cee3b4d": "getPolicyByCostumerCode(string,uint256)", +"8cee8778": "crear(uint256)", +"8ceeaaa8": "getTodayOwnerAddress()", +"8ceedb47": "cage(uint256,uint256)", +"8cef1ed9": "xpectoTTF1Token()", +"8cef2b93": "CECNaypyidaw(address,uint256)", +"8cefad63": "setAirEndtime(uint256)", +"8cefaf1a": "setSalesEndTime(uint256)", +"8cf0c191": "rum()", +"8cf19975": "createLottery(string,uint256,uint256,uint256,uint256,uint256,uint256)", +"8cf1c5c4": "LogFeeEvacuation(uint256)", +"8cf20038": "engDevAddress()", +"8cf228cd": "DNNTDE()", +"8cf3313f": "calculateWeightedMultiplier(uint256,uint256,uint256,uint256)", +"8cf3562b": "DEC15Recursive()", +"8cf37ece": "InformRebuy(uint256)", +"8cf39a9c": "TicTacToe(address,address,uint256)", +"8cf3a181": "addRRA(address)", +"8cf3e683": "isAddressExcept(address,address)", +"8cf49cad": "ReleaseDate()", +"8cf4dbfb": "collectBalance()", +"8cf57cb9": "rewardAddress()", +"8cf5dbc6": "recruitHero()", +"8cf7b7a4": "slashAddressLikeUsername(string,uint256)", +"8cf7d906": "playAndFinishJackpot(uint256,uint256,uint256,uint256)", +"8cf80438": "winningBid()", +"8cf8151f": "appWasMade(bytes32)", +"8cf907fb": "EndRefund()", +"8cf92ade": "distributeBountyTokens(address[],uint256[])", +"8cf9f5e7": "getPreSelledInPool()", +"8cfa8eea": "getWeiToUsdExchangeRate()", +"8cfaabcc": "managementTransfer(address,uint256)", +"8cfae7e4": "TransferUnsoldTokensBackToTokenContract(address)", +"8cfb3088": "defaultExpiry()", +"8cfb7c02": "updatePopularity(bytes32,uint256)", +"8cfb8f21": "isKnownUniverse(address)", +"8cfd6d4c": "CCH_LLV_FIFA_2()", +"8cfd8901": "_incBlock()", +"8cfdacb0": "STARTING_PACIFIST()", +"8cfe6a09": "tokensToEthereum_2(uint256)", +"8cfe7c32": "bTransfer(address,address,address,address[],uint256[])", +"8cff1990": "isSignedByAndrey()", +"8cffa21c": "getOwnedItems()", +"8d000903": "createTokenToMarket2018()", +"8d003a0f": "addCurrentTime(uint8)", +"8d008989": "Multisig(address,address,address,address)", +"8d00abb6": "setAElfCommunityMultisig(address)", +"8d012295": "presaleVesting(address,uint256,uint256,uint256,uint256,uint256)", +"8d0128cb": "transferMintKey(address,int256)", +"8d01308c": "PRESALE_START_WEEK3()", +"8d03b102": "testing()", +"8d044c06": "unpauseRedemption()", +"8d049190": "mapWidth()", +"8d0515dc": "HenryMiniToken(uint256,string,uint8,string)", +"8d0522c5": "set_contrib_arbits_max(uint256)", +"8d0528ec": "Withdraw_referral()", +"8d05ad4e": "NLL()", +"8d062046": "testTokensAreTransferrableAfterSale()", +"8d068043": "requiredSignatures()", +"8d0716c4": "approveScoupons(address,uint256)", +"8d07ae9f": "getBidDetails(address)", +"8d086da4": "withdrawShares()", +"8d089930": "limitEndDate()", +"8d08eefa": "setCORAddress(address)", +"8d09b9cc": "TeCToken()", +"8d09c674": "Donated(address,uint256,uint256,uint256)", +"8d0a3b6d": "bonusByAmount()", +"8d0a5fbb": "getOrderCount()", +"8d0a73e3": "tokenDistributionStartTime()", +"8d0aadca": "playerDelayOnExit(address)", +"8d0ae472": "AsheToken()", +"8d0b3d9b": "_add(uint32,address)", +"8d0b4be5": "setXPContractAddress(address)", +"8d0bba03": "MINIMUM_CONTRIBUTION()", +"8d0caef5": "bonusStage1()", +"8d0cf786": "MatchAdded(uint256,uint8,uint16)", +"8d0d018c": "havedDistDevCoin()", +"8d0d27ba": "queryPlayerType(uint32[11])", +"8d0d3ccf": "getBonusTier()", +"8d0d877f": "LZZ()", +"8d0dd3c0": "setBUU(bytes32,uint256,uint256)", +"8d0e5136": "isPlayerInQueue(address)", +"8d0eda03": "isInvestorLocked()", +"8d0f403a": "adminAddAction(bytes32)", +"8d0f8cef": "drop(address,uint256)", +"8d0fc05a": "votesYes()", +"8d10215e": "grantAccess(uint256,uint256,string)", +"8d106690": "setPropertyFlag(uint16,uint8)", +"8d111ac6": "checkTokSold()", +"8d119d41": "AngelCoinV1()", +"8d121247": "changeProductionFeeRecipient(address)", +"8d12aba7": "IMCOToken()", +"8d134175": "CellTokens()", +"8d1343e0": "issueDate()", +"8d13d972": "getUsdFee(bytes32,uint256)", +"8d13ea34": "changeUserProjectExp(bytes32)", +"8d14670a": "multiUnlock(address[])", +"8d149b3c": "compareInts(int256,int256)", +"8d152d78": "pushBytesArray(bytes32,bytes32)", +"8d1540c1": "CoinBuy(uint256,address)", +"8d159787": "buyDragon(uint256)", +"8d15a218": "LogRedeem(address,uint256)", +"8d15b307": "privateEventActive()", +"8d16fd83": "sellDai(uint256,uint256,uint256)", +"8d17664d": "getSecret(uint256)", +"8d182f01": "removeSale(bytes32)", +"8d1a4b28": "getGame(address)", +"8d1a7765": "getPlayerGeneral(uint64)", +"8d1b2afd": "logFeeWindowCreated(address,uint256)", +"8d1bc93d": "buyWuxiaMaster()", +"8d1c3b8b": "sHasDownvoted(uint256,uint256,address)", +"8d1c8048": "transport(uint256)", +"8d1ca4ec": "addGuess(int256)", +"8d1d1572": "transferFeeAddress()", +"8d1d22d8": "renameMonster(uint64,string)", +"8d1d2c21": "categoricalEvents(bytes32)", +"8d1d8639": "getcanuserun(address)", +"8d1dff6b": "mintTokens(uint256,address,bool)", +"8d1e6b56": "issueCompanyTokens()", +"8d1eaf78": "registrarInfo()", +"8d1fdf2f": "freeze(address)", +"8d20194d": "getWhiteUsersFrom(uint256,uint256)", +"8d215adc": "Bettings(uint256,uint256)", +"8d216186": "roll(uint256,bytes32)", +"8d22651e": "MAX_NUM_OF_CHOICES()", +"8d227fc0": "getPeriodInfo()", +"8d22b345": "getAppTokenCode(uint32)", +"8d24abbc": "closeAndTransferTokenOwnership()", +"8d24d147": "rvDeposit()", +"8d24f5bc": "tokensByBtcTx(string)", +"8d256b0a": "ExchangeRate(uint256)", +"8d258104": "setManager()", +"8d25827a": "countOpenPackageOfOneAgency(address)", +"8d259d65": "_sellCallToOpen(uint256,uint256,uint256,uint256,address)", +"8d25af04": "restartGame()", +"8d26d88f": "feeWithdrawTokenAmount(uint256)", +"8d26eb2b": "edgePigmentG()", +"8d272b0a": "TaeCoin()", +"8d2810fe": "GenesisBuyPrice(address)", +"8d288e93": "toRefund()", +"8d28da21": "ECT(uint256,string,uint8,string)", +"8d298851": "initialIssue()", +"8d29a239": "finalizeHoldingAndTeamTokens(uint256)", +"8d2a0910": "getTotalDividendsPaid()", +"8d2af65d": "claimTokenReserveFinan()", +"8d2c8ce8": "RrcToken()", +"8d2c929a": "bridgeNodes(address)", +"8d2d2563": "saleFirstEarlyBirdEndBlock()", +"8d2d3f41": "getKeyRevisionNumber(uint32)", +"8d2dcb2d": "TokenPool(address,address)", +"8d2ea8dc": "withdrawAvailableToken(address,address,uint256)", +"8d2f349f": "TransCompleteds()", +"8d2f7272": "CariToken()", +"8d300458": "updateInvested(address,uint256)", +"8d30241b": "HasGoods(uint32)", +"8d30d418": "ContractRemoved(address)", +"8d30e65d": "claimReservedTokens(address,uint256)", +"8d3121b3": "releasedTokenTotal()", +"8d317de2": "OctusToken()", +"8d323fdc": "LogAddressTokenCapChange(uint256,string)", +"8d331996": "setTimeWindow(uint256)", +"8d334529": "restrictions(address)", +"8d348b7c": "mintToClient(address,uint256)", +"8d357fa3": "getKeys(uint256)", +"8d35b9ce": "ARXpresale()", +"8d361e43": "removeSigners(address[])", +"8d361f6e": "bonusTokensDistributed()", +"8d375da2": "testMakeItFail()", +"8d37f52c": "addAgingTime(uint256)", +"8d38b237": "calculateCountOfInvestmetnsInQueue(uint256,uint256)", +"8d38f5a0": "Burn(address,uint256,bytes)", +"8d3945e4": "setCounter()", +"8d3965be": "buyerApprove(uint256,bytes)", +"8d3972d5": "FABIToken()", +"8d399ce3": "submit(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[])", +"8d3a5ded": "initPlatinum()", +"8d3af7eb": "withdrawLemontokens()", +"8d3b6d08": "registerSsp(address,uint8,uint16)", +"8d3bd1f8": "teamTokensGenerated()", +"8d3c7415": "JuzixTokenManager()", +"8d3d523b": "bet2Of(uint256)", +"8d3d6576": "maxContribution()", +"8d3d70df": "takeBet(uint256,address,uint256,uint256)", +"8d3d8587": "GanaPreSale(address,address,address)", +"8d3def46": "oryza()", +"8d3ef87d": "getuserlistlength(address)", +"8d3f0ed5": "allocateTokens(address,uint256,uint256)", +"8d3fd859": "sellFucks()", +"8d442ae0": "toUint8(bytes,bytes,uint256)", +"8d447e39": "getLatestWhitepaper(address)", +"8d44c90b": "BurnMyTokensAndSetAmountForNewBlockchain()", +"8d44f13b": "claimFromPool()", +"8d4572be": "rens()", +"8d45e221": "Partial23Transfer()", +"8d467f22": "getKeysFromEth(uint256,uint256)", +"8d472709": "contribute(address,address,uint256)", +"8d475461": "m_teamId()", +"8d4777c8": "claimGooDepositDividends(address,uint256,uint256)", +"8d47c7d7": "getTokenListed()", +"8d498158": "DaleoneToken()", +"8d49cd7f": "getTeam(uint32)", +"8d49da75": "stopCollection()", +"8d4a2d39": "addSeconds(uint256,uint256)", +"8d4d801c": "addRecipient(bytes32,string,string,address)", +"8d4d8e19": "unregisterAsDelegate()", +"8d4e4083": "isFinalized()", +"8d4e57e6": "ROLE_TOKEN_CREATOR()", +"8d4ea1ba": "addEtherForOraclize()", +"8d505019": "addNote(bytes32,string)", +"8d50b6d0": "doSelectDisputedStateRoot(uint256,bytes32,uint256)", +"8d51faec": "setOwnerTestValue(uint256)", +"8d521149": "bonus_received()", +"8d52a1fc": "setStrikePrice(uint256,uint256)", +"8d539b35": "resetPendingContribution(address)", +"8d53b208": "revokeAccess(bytes32,address)", +"8d551860": "horseNotForSale(uint256)", +"8d553538": "addSecondaryRecord(string,bool,string,bool,string,string,string)", +"8d5555f2": "priceFor(uint256)", +"8d55719e": "_withdrawEther(address)", +"8d55b6ac": "thirdRate()", +"8d565abf": "createTx(address,address,uint256)", +"8d56ac74": "REALEX()", +"8d56bc62": "Bankroi()", +"8d574383": "setDemurrageFrequency(uint256)", +"8d578bee": "totalSaleCap()", +"8d5802e2": "getAssetOwner(uint256)", +"8d59cc02": "register(address,string,string)", +"8d59d1f1": "donate(uint256,string)", +"8d5a225e": "assignReserveSupply(address)", +"8d5c4456": "pIndex()", +"8d5c84cd": "isStart(bytes32)", +"8d5cc102": "traded_token()", +"8d5ceeca": "checkShares(address)", +"8d5d1e97": "priceStar3()", +"8d5d3429": "requestLoan(uint256)", +"8d5d88c9": "LTYG()", +"8d5dee05": "EGGS_TO_HATCH_1TURTLE()", +"8d5e4f9c": "BroFistCoin()", +"8d5f3f96": "nextInvestorsProfitSum()", +"8d5f8d1c": "forwardFundToCompanyWallet(uint256)", +"8d5fa05c": "setAreas(address,uint256)", +"8d6014a8": "FixedCeiling(uint256,uint256)", +"8d60be98": "ICO_TOKENS_PERCENT()", +"8d60e30b": "reward(address,uint256,bool,string)", +"8d60ed85": "setDevCutPercentage(uint256)", +"8d614474": "AdvancedEthVocToken(uint256,string,string)", +"8d622749": "award(address,address,string)", +"8d627e91": "isTryedFinishCrowdsale()", +"8d62b845": "isMakersSignatureValid(address,bytes,string,address)", +"8d63c77b": "WizardReplacedEvent(address,address)", +"8d63cfa7": "getPixelOwner(uint16,uint16)", +"8d647185": "setBaselineRate(uint256)", +"8d647d3a": "allowPrivateParticipant(address,uint256)", +"8d64bcf1": "maxWhitelistPurchaseWei()", +"8d65095e": "PI_EDIT_3()", +"8d656b83": "minWeiInvestment()", +"8d664d6a": "setFeeRates(uint8,uint8,uint8)", +"8d670a2e": "unlockPlayerFunds(address)", +"8d6731b0": "LudumToken()", +"8d67799e": "MAX_SIZE()", +"8d6819be": "mintTokens(uint256,address,uint256)", +"8d688b6e": "EthPyramid()", +"8d68cf59": "sendFunds()", +"8d69121d": "addDocument(bytes32,string,string)", +"8d69ca74": "wdEthereum(uint256,address[])", +"8d69e95e": "serviceProvider()", +"8d6a2ed5": "minimumBuyAmount()", +"8d6a6d4b": "_allocatePromoTokens(address,uint256)", +"8d6a6fbd": "proxyTransfer(address,address,uint256,bytes,string)", +"8d6b5d3e": "getScouponAllocationFactor()", +"8d6c58ab": "isTransferToICAPAllowed(address,bytes32,uint256)", +"8d6cc56d": "updatePrice(uint256)", +"8d6cd879": "FOUNDATION_STAKE()", +"8d6cd8de": "buffPtr()", +"8d6e56e1": "manyInputsNoReturn(uint256,uint256,uint256,uint256)", +"8d6f24d4": "hash_msg()", +"8d702122": "ownerKill()", +"8d70650f": "getSiteId(uint256,uint256)", +"8d70baaa": "BattleOfTitansToken()", +"8d70c0ce": "transferToExchange(address,uint256,uint256)", +"8d7108e5": "isValidLocation(uint8,uint8,int8[5],int8[24])", +"8d711776": "sendCrypto(address,uint256)", +"8d7117d4": "etherRatio()", +"8d715d9d": "Backdoor()", +"8d71f131": "TOKEN_RESERVE2_CAP()", +"8d72920b": "getAllowedAmountToContribute(address)", +"8d72a473": "deductFunds(address,uint256)", +"8d72f856": "deleteVip(uint256)", +"8d734b30": "setupMintableAddress(address)", +"8d73c027": "mintWithApproval(address,uint256,address)", +"8d747928": "isDrivezyPrivateTokenAcceptable()", +"8d748148": "monitor(address,bool)", +"8d74fd52": "GlobalTourToken()", +"8d75533f": "mint(address,string,bytes)", +"8d7570fc": "doBurn(uint256)", +"8d75fe05": "mintedTokens()", +"8d7601c0": "addResolvers(address[],uint256[])", +"8d77090f": "TriggmineToken()", +"8d776457": "sellBNT(uint256)", +"8d78c90b": "EventUpgrade(address,address)", +"8d79283d": "query1_fnc()", +"8d792964": "TD(uint256,string,string,uint8)", +"8d7a55bf": "PubKeyHashTypeAdded(uint8)", +"8d7af473": "numberOfProposals()", +"8d7b5243": "minerTotalReward()", +"8d7cdcf4": "setLLV_edit_8(string)", +"8d7cffb7": "transferWrappedContractAdmin(address)", +"8d7d2e5b": "minerPreSupply()", +"8d7daf95": "isTokenPairWhitelisted(address,address)", +"8d7e5be0": "getClue1()", +"8d7e7958": "userGrowsPoolSupply()", +"8d7e8a57": "approveSpenders()", +"8d7eca6f": "FUNDING_END_TIMESTAMP()", +"8d7f26e9": "setIPAddress(bytes32,bytes32,address)", +"8d7fe693": "Helios()", +"8d8001ad": "updateMintingStatus(uint256)", +"8d809b0e": "project_wallet()", +"8d80c34e": "unblockAccount(uint256)", +"8d80c922": "getAddressById(uint256)", +"8d81a1ce": "setClamTax(uint256)", +"8d81a88f": "BP_ATHENIAN()", +"8d81e2c0": "getTankTotalEarned(uint32)", +"8d81f51e": "safeTransferChild(uint256,address,address,uint256,bytes)", +"8d822615": "setFeeForArtWorkChangeRequest(uint256)", +"8d835674": "euroRaised(uint256)", +"8d837f38": "getEthBalTeller(address)", +"8d83cc95": "getNextSnapshotBalanceOfMul(address[])", +"8d842fad": "stopPreICO()", +"8d84a7fd": "credit(string,uint256)", +"8d854fde": "getDisputeId()", +"8d859f3e": "PRICE()", +"8d85a70f": "Vote(address,uint256,bool)", +"8d860880": "CheckOut()", +"8d86484c": "setPercentUnfrozenAfterAwardedPerPeriod(uint256)", +"8d8660bc": "setQuantity(string,int256)", +"8d86faa6": "getAmountToGive(address,address,address,uint256,uint256,uint256,uint256,uint8,bytes32,bytes32,uint256)", +"8d87b102": "amountOfStakeToBeReturned(address,uint256)", +"8d8833bf": "periodPreITO_wei()", +"8d89873c": "updateAndGetRemaining()", +"8d8a7f07": "VLBRefundVault(address)", +"8d8a88fc": "pay(bytes32,uint256,bytes)", +"8d8acee9": "setupMultisig(address,address)", +"8d8b1b88": "mixGenes(uint256,uint256)", +"8d8bd44f": "TokenSaleFinished(string,address,uint256,uint256,uint256)", +"8d8c36e9": "purchasedBy(address)", +"8d8d22ba": "changeServiceAddress2(address)", +"8d8d50d0": "createUnicorn()", +"8d8d92fa": "theBid()", +"8d8e2ea9": "Tablow()", +"8d8e4561": "theGrid(uint256)", +"8d8e5da7": "emergencyWithdrawal(address,address,uint256)", +"8d8f2adb": "withdrawTokens()", +"8d8f7780": "GEE100()", +"8d8f95d1": "collectDrugs(address)", +"8d909ad9": "getSeedAndState(string,address)", +"8d91801a": "RxEALTestSaleContract()", +"8d91931f": "longLock()", +"8d91e803": "buyWhiteCore(uint256,uint256,uint256,uint256)", +"8d920b02": "rejectPayment(uint256)", +"8d927069": "getTrace(uint256)", +"8d927b34": "maxPendingBalances()", +"8d928af8": "getVault()", +"8d92910c": "isLegalAttack(uint256,uint256)", +"8d92c187": "testFinalize()", +"8d92ce46": "submitBlockHeaders(bytes)", +"8d92fdf3": "withdrawAsset(uint256)", +"8d93758e": "PRESALE_STAKE()", +"8d93eac2": "mintFeeNumerator()", +"8d93ec88": "poolWallet()", +"8d94053f": "verifyAutoridadElectoral(bytes32)", +"8d949635": "endRefundableTime()", +"8d949c8b": "D(uint256)", +"8d956f1e": "tokenTransfer(address)", +"8d95f245": "sellkey(uint256)", +"8d976d76": "investCommission()", +"8d977672": "tasks(uint256)", +"8d977d9e": "checkGameClosed(address)", +"8d98ee43": "_verifyAddress(address)", +"8d98f4e3": "getAllCardsDefence()", +"8d9940b9": "createRetainer()", +"8d995f94": "transferAndFreeze(address,uint256)", +"8d99b2eb": "endPoll()", +"8d9a7b49": "pricePerMessageChanged(uint256,uint256)", +"8d9ad08e": "getAllInvestments()", +"8d9afc0f": "getStageId()", +"8d9b449b": "addRevenueShareCurrency(address,string)", +"8d9d851c": "toggleVaultStateToAcive()", +"8d9e6e47": "setFinalICOPeriod()", +"8d9e8a76": "CMGG12StandardToken(uint256,string,uint8,string)", +"8d9efa3f": "LogPhaseSwitch(uint8)", +"8d9f39d1": "_clear(uint256)", +"8d9f95c4": "PresaleEntry(address,uint256)", +"8da03997": "getNativeReputation(address)", +"8da15531": "SimpleCoinToken()", +"8da16e48": "geraHash(string,string)", +"8da198cd": "simpleAssert(bool)", +"8da1e722": "minGamePlayAmount()", +"8da2a2a1": "reserveDistribute()", +"8da2defb": "WE(uint256,string,uint8,string)", +"8da2fc26": "Burn(address,uint256,uint256,bytes)", +"8da3d736": "addToList(uint256,address[])", +"8da46db4": "DistributeXcel(address)", +"8da4d3c9": "claimCount()", +"8da4d776": "newCommune(address)", +"8da58897": "starttime()", +"8da5cb5b": "owner()", +"8da5fd77": "unlockSecondaryTokens()", +"8da66e67": "LogCollectAmount(uint256)", +"8da76874": "mintFromTrustedContract(address,uint256)", +"8da7d0b5": "totalChildContracts(uint256)", +"8da8023c": "endTimeOfStage(address,uint256)", +"8da8524f": "LogFrozenStatus(bool,uint256)", +"8da87ac6": "addressFundPlatform()", +"8da8a5ae": "nativeBlockhash(uint256)", +"8da8f235": "_addController(address)", +"8da91d04": "unset(uint32[])", +"8da9b772": "getHello()", +"8daaaa2f": "HOUSE_EDGE()", +"8daaf0a2": "addTokens(address,address,uint256)", +"8dab38da": "BONUS1_LIMIT()", +"8dac0e8c": "GetEtherPrice()", +"8dac7191": "initialTokenOwner()", +"8dad52f4": "dive4(address)", +"8dae3d68": "awardLuckyCoin(uint256,uint256)", +"8dae5adc": "FundTransfer(address,address,address,uint256)", +"8dae9364": "_stakeAmountValid(address,uint256,uint256,bytes8,uint256,uint256)", +"8daed4c4": "allocateShareholder(address,uint32)", +"8daf08d9": "requestStempas(bytes32,address)", +"8daf4dcf": "getTournamentRate()", +"8daf5033": "TokenPurchased(address,address,uint256,uint256)", +"8db02d79": "Tiguan5Coin()", +"8db0816a": "claimC2()", +"8db0e83b": "getBytesArray(bytes32)", +"8db1296d": "token_creation_cap()", +"8db1ccac": "PUBLIC_SALES_1_RATE()", +"8db23385": "balanceOfTotalUnclaimedCookie()", +"8db261e0": "hardWithdrawAll()", +"8db49b57": "GrantDeleted(address,uint256)", +"8db4dad2": "contractSignedTime(string)", +"8db517fb": "GMQToken(uint256,string,string)", +"8db518f3": "ContractiumToken()", +"8db54c90": "getTotalSendingAmount(uint256[])", +"8db57994": "fundLoan()", +"8db6c17e": "ISCoin()", +"8db7183a": "dateMarketing()", +"8db783ce": "addHourToProject(uint256,uint256)", +"8db78a37": "setBountyVault(address)", +"8db7cd54": "getTournamentEntranceFee()", +"8db8053b": "mintPresaleTokens(uint256)", +"8db8f8bc": "ELACoin(uint256,string,string)", +"8db9653f": "getTotalIssued()", +"8db974e4": "optionTotalSupply()", +"8db9c13c": "removePolicy(uint8)", +"8dbb908a": "clearAllrequest()", +"8dbbbe10": "getFeeTake(uint256)", +"8dbc2fd1": "setNewEndtime(address,uint256,uint256)", +"8dbd7d54": "addCashier(address,address)", +"8dbdbe6d": "deposit(uint256,uint256,address)", +"8dbdfae7": "referalBonusPercent()", +"8dbe3be5": "isCeilingStrategy()", +"8dbe6c33": "_setUserInfo(address,uint256,uint256,address)", +"8dc01209": "CJC()", +"8dc07e46": "picops_is_enabled()", +"8dc1c44d": "testFailCreateWithParentSameNonce()", +"8dc2a2cd": "GMCCERC20(uint256,string,string)", +"8dc401ae": "withdrawAllDevelopersCut()", +"8dc43256": "AFRTokenERC20(uint256,string,string)", +"8dc45377": "getDuel1(uint256)", +"8dc4c6ab": "recoverable(address)", +"8dc654a2": "withdrawLink()", +"8dc6af54": "UsdToTokenConvert(address,uint256)", +"8dc6e2f1": "onMarketFinalized()", +"8dc71928": "minimumTargetReached()", +"8dc73521": "clearLock(address)", +"8dc850dc": "currentCoinsCreatedInteger()", +"8dc889f6": "requestDisbursement(uint256)", +"8dc949e8": "SapienToken()", +"8dc95182": "AssignWhitelistManager(address)", +"8dc9650f": "claimdram()", +"8dc98851": "Billboard()", +"8dca05c9": "airFropPot_()", +"8dca5511": "usdPerEve()", +"8dca7a01": "unicornManagement()", +"8dcb25e0": "balanceOf2Internal(address,address)", +"8dcb8c21": "coinsFlipped()", +"8dcd555f": "_buyNextRank(address)", +"8dcd64cc": "createAndEndowD(uint256,uint256)", +"8dcd992e": "_setBabzBalanceOf(address,uint256)", +"8dcdfe12": "distributeCrowdsaleTokens(address,uint256,uint256)", +"8dcf7892": "setAllocateTokenDone()", +"8dcfdaad": "removeMany(address[])", +"8dcff4f9": "setupAssetOwningListener(address)", +"8dd05b56": "getImageDataLength(uint256,uint16)", +"8dd14802": "setBridge(address)", +"8dd1e732": "YYBToken()", +"8dd1e96c": "getAngelFundAddres()", +"8dd21b0f": "redTeamLockingPeriod()", +"8dd3c196": "addInvestment(bytes32)", +"8dd42808": "removeHolder(address)", +"8dd47d91": "Wthdraw()", +"8dd4f292": "getRemainingSellingToken()", +"8dd5ac24": "SaveToken()", +"8dd5e298": "canEnterPool(address)", +"8dd66012": "incChildren(uint256)", +"8dd6908e": "ambassadorMode()", +"8dd6ce79": "setRatePrices(uint256)", +"8dd745bb": "adminSendTokens(address,uint256,uint256)", +"8dd747ec": "balanceOfKyCToBeApproved(address)", +"8dd7d6d1": "newPuppet()", +"8dd7e44b": "withdrawalComplete()", +"8dd8596c": "sendDonation()", +"8dd9054b": "MATCoin()", +"8dda811c": "GameChannelBase(address,uint256,uint256,address,address,uint256)", +"8ddab3dc": "_preValidateRefill(address,uint256)", +"8ddab515": "MedicayunLink(uint256,string,string)", +"8ddb428a": "currentGeneration()", +"8ddc9aa7": "UpgradeProposed(address)", +"8ddcf81e": "get_deal_status(uint256)", +"8ddd8b69": "renounceFreezer(address)", +"8dde60fa": "transferCoin(address,uint256)", +"8dde907e": "FooBurnableToken()", +"8ddf52bd": "earlyContribShare()", +"8ddf792b": "setOraclizeGasLimit(uint256)", +"8de022b7": "dropAnchor(uint16,uint16)", +"8de04f87": "authorized_updateCardReserved1(uint256,uint8)", +"8de0ece7": "THEWOLF10XToken(uint256,uint256,uint256,uint256,address,address,address,address,string,uint256)", +"8de12845": "init(string,string,string,string)", +"8de1dcea": "rateAngelsDay()", +"8de21650": "getBooleanValue(string)", +"8de2947c": "chkLockedTokens(address,uint256)", +"8de2a051": "setUint(uint256,uint8,uint16,uint32,uint256)", +"8de3317d": "withdrawDRPU(uint256)", +"8de4f42f": "addNewAirdrop(uint256,string,uint256,address)", +"8de5104b": "startPreICOStage2()", +"8de575e4": "Veen()", +"8de69284": "subscribe(address,uint256)", +"8de69c3c": "AcceptsDailyDivs(address)", +"8de69f66": "allocateAdvisorTokens(address[],uint256[])", +"8de6b343": "deleteFromBlacklist(address)", +"8de74aa1": "setEstateRegistry(address)", +"8de85908": "ProjectCall(address,uint256)", +"8de8d47c": "sendObjectWithoutApproval(uint256,address)", +"8de8de61": "CC5Coin()", +"8de8e295": "setSupplyLimit(uint32,uint32)", +"8de93222": "purchase(address,uint256)", +"8de9ee05": "TakeBuyOrder(bytes32,address,uint256,uint256,uint256,address,address)", +"8dea60cc": "CryptopediaCoin()", +"8dec1720": "invites(address)", +"8dec3daa": "destroy(uint256,address)", +"8dec818a": "LogPaused(bool)", +"8dede3f5": "pendingInvestContractsIndices(address)", +"8dedeca8": "costAndBuyTokens(uint256)", +"8dee53b9": "setBoardMember(uint256,uint256,uint256,uint256)", +"8def14f3": "ether_per_token()", +"8def1d3b": "distinctInvestors()", +"8def32b6": "addOrderBatch(bool[],uint128[],uint128[],uint32[],int256,bool[])", +"8defbc5e": "right31(uint256)", +"8df068ab": "initialTransferToDevTeam()", +"8df0fda1": "isApplicationExits(string,string)", +"8df10469": "refundInvestor(uint256)", +"8df15e19": "tokenLock(address,uint256)", +"8df1a8db": "ENJAllocation(address)", +"8df208b7": "StopQ()", +"8df272d2": "CosmoCoin(address,address)", +"8df301aa": "tradeKyber(address,uint256,uint256,address)", +"8df35abe": "setManagerAndClaimer(address,address)", +"8df388c1": "totalUnvestedAndUnreleasedTokens()", +"8df3a24c": "canAcceptBuyNow(uint256,address)", +"8df41c32": "allocationAddressICO()", +"8df4235f": "setother(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"8df465ea": "Zendad()", +"8df48935": "uncooperativeClose(address,uint32,uint192,bytes)", +"8df4d225": "GLXChain()", +"8df554b3": "Dividend()", +"8df583bd": "exchangeBBDBalance()", +"8df5fc7a": "_RewardClaimed(address,uint256,uint256)", +"8df61294": "totalAmountOfOrders()", +"8df6ad66": "isArrAccountIsNotFrozenForReturn(address)", +"8df6af63": "setCHGUSDPrice(uint256)", +"8df793d6": "leaseCard(uint8,string,string,string)", +"8df8228c": "x888()", +"8df87c66": "_getTokenLockType(uint256)", +"8df8ac87": "recevedTokenFromEvabot(address,uint256)", +"8df8c008": "getFreeTurtles()", +"8df8cc4c": "_removeOperator(address)", +"8dfa6fcb": "endTimeAddBonus()", +"8dfa703f": "BitkerToken()", +"8dfaf7f0": "getTeamsInfo()", +"8dfb015f": "increaseInvestedWei(uint256)", +"8dfb04fe": "getExistCell(address)", +"8dfb9950": "transferTokensManually(address,uint256,uint256)", +"8dfbcf36": "addCapper(address)", +"8dfced82": "amountBonusEnabled()", +"8dfd1242": "updateStarScoreInBulk(address[],uint256[])", +"8dfda5ae": "getIndexByAddress(address,address)", +"8dfde39d": "abi(bytes32)", +"8dfef745": "bonussale_StartDate()", +"8dff1762": "RpsGame()", +"8dff4abd": "activateRevenueShareIdentifier(string)", +"8dffe343": "kvcDiv(uint256,uint256)", +"8dffe5c0": "buyPlace(uint256,string)", +"8dfff9f2": "changePrepaymentFee(uint256)", +"8e005553": "setFee(uint16)", +"8e006db0": "setProductStock(bytes32,uint256)", +"8e007cfa": "giveEthxAddress()", +"8e008b59": "_createTeam(address,uint32[])", +"8e01d34b": "AddGoods(uint32,uint32,uint256,uint32,uint32,uint32,uint8,uint8,uint8)", +"8e0273bb": "Existing(address)", +"8e0294a8": "_removeProposal(address)", +"8e035ac1": "BetOnHashV82()", +"8e045031": "isTokenCollected(uint256,address)", +"8e048315": "investorDeposit(address,uint256)", +"8e0488a8": "transferirSalaDePara(address,address,uint256)", +"8e04977d": "currentLotteryValue()", +"8e056fe6": "setBirthBlock(uint256)", +"8e05beb3": "token(bool,address,address,address,address,address[],uint256[])", +"8e05d59d": "signToApproveTokenControlInfo(uint256)", +"8e05d8a5": "_computeNextGen0Price()", +"8e068b11": "virtualReserveBalance()", +"8e07d7da": "confirmKittyActions(uint256,uint256[8])", +"8e082555": "changeOwnship(address)", +"8e08b2ec": "MinesOnTrade(uint256)", +"8e08cf38": "updateBonus(uint256,uint256,uint256,uint256,uint256)", +"8e09c8cd": "addCallSpenderWhitelist(address)", +"8e09ead7": "isTokenBankroll(address,address)", +"8e0a5faa": "invariant(address)", +"8e0adbf5": "getLLV_edit_11()", +"8e0af993": "setPrivateFund(address,uint256,uint256)", +"8e0b017d": "setSellRate(uint256)", +"8e0bba69": "iown()", +"8e0c2882": "drain_alltokens(address,uint256)", +"8e0c36c4": "verifySeed(bytes32,bytes32)", +"8e0c8999": "zkWithdraw(bytes32,uint256,address,uint256[2],uint256[],uint256[],uint256[])", +"8e0cac02": "redeemMarketingAndRNR()", +"8e0d5075": "claimDividendsForBlock(uint256)", +"8e0db0d9": "keyAtIndex(uint256)", +"8e0e8fb2": "approveProvider(address,uint256)", +"8e0ea5cf": "ReturnTokensFor(address,address,uint256)", +"8e0eef8e": "getTicketValue(uint256,uint256)", +"8e0ef033": "defrostTokens()", +"8e0f65eb": "isBelow(int256,int256,string)", +"8e0f9b85": "Smartcarblockchain(address,uint256)", +"8e0fee1f": "withdrawRefBalance()", +"8e101867": "maxTotalAmount()", +"8e1069f3": "getPlayRecord(address,address)", +"8e10be33": "primaryOwner()", +"8e111ef6": "addressOfERC20Tocken()", +"8e120f36": "prepareToPayWinners(uint32)", +"8e1227b2": "KTCWhiteList()", +"8e12823b": "getCompanyHash(address)", +"8e13435b": "MathPractice()", +"8e14cc91": "CreateTokens()", +"8e151947": "newBitsoAddress(address)", +"8e15e94b": "countOfCell()", +"8e15fc87": "clearDeposits()", +"8e165058": "sendTokensToBuyers()", +"8e17de8b": "Controlled(address)", +"8e180733": "_validCrowdsale()", +"8e1876ee": "permaStop()", +"8e19899e": "withdraw(bytes32)", +"8e19ee4c": "Recovery(uint256,address,address)", +"8e1a1c30": "WithdrawLeftToOwner(uint256)", +"8e1a55fc": "build()", +"8e1aa2c4": "bts_address1()", +"8e1b9f42": "CROWDSALE_WALLET_ADDR()", +"8e1bb633": "triggerRecovery(uint256,address,uint8,bytes32,bytes32,uint256)", +"8e1d9545": "setTokenSaleHalt(bool)", +"8e1dfd48": "isMerhantAlreadyRegister(address)", +"8e1e2add": "tradeABIHash()", +"8e1e3e6c": "POMACOIN()", +"8e1e3eb1": "setMinBuyEth(uint256)", +"8e1eeb09": "BarrelAgedFOMO()", +"8e1f0614": "EGYPT()", +"8e1fda84": "WorkcoinCrowdsale(address)", +"8e1ffb19": "testThrowsRetractLatestRevisionEnforceRevisions()", +"8e207fa0": "getApproveValueValue()", +"8e22e8de": "Cryptolotto7Days(address,address,address,address)", +"8e236cea": "setAnnualPrice(uint256)", +"8e242d54": "withdrawSharesTo(address,uint256)", +"8e25071a": "setProxyCurrator(address)", +"8e263e6f": "firstAttack(address,uint256,uint256[],uint256[])", +"8e268934": "LogSendPOSTokens(address,uint256,string)", +"8e26a223": "getPoSReward(address,address)", +"8e26c09d": "waitPeriod()", +"8e26c30c": "carTransferState()", +"8e26e582": "_mintDataStream(address,uint256,bytes32,bytes32,uint256)", +"8e273ef4": "buyLicenseForERC20(address)", +"8e27d719": "deposit(string,uint256)", +"8e280dce": "findNextYear(uint256,bytes)", +"8e2832b7": "ethereumToTokens(uint256)", +"8e298549": "migrateListing(bytes32)", +"8e29d149": "claim_block()", +"8e2a37b2": "privateAllocated()", +"8e2a6470": "allocateShares(address,uint256)", +"8e2a8312": "EmjacToken()", +"8e2ab359": "_transferToAddress(address,address,uint256,bytes)", +"8e2ae564": "mintingDone()", +"8e2c6f4d": "initiateVerification(address,bytes,bytes)", +"8e2d0699": "getCompte_32()", +"8e2e0776": "doInitialDistribution(address,address,address)", +"8e2e2077": "setTokensForSaleCount(uint256,bool)", +"8e2f0f46": "ownerSetMarginPremium(uint256)", +"8e303097": "BestWallet(address)", +"8e3047d9": "getBonuses(address)", +"8e3047e0": "getCrossConnectorReturn(address,address,uint256)", +"8e3058f3": "getPostFromId(address,string,uint256)", +"8e3073a6": "getEth(uint256)", +"8e314783": "addTotalPaid(address,uint256,uint256)", +"8e316327": "calculateEggSell(uint256)", +"8e3177e1": "purchaseIpfsAfterTitle(bytes32)", +"8e32217a": "calculateTokensQtyByEther(uint256)", +"8e327dd3": "setInvestor(address,uint256)", +"8e32e421": "expiredTime()", +"8e3390b4": "contributeMethodABI()", +"8e339b66": "controllerApprove(address,address,uint256)", +"8e343516": "balanceWinPoolToWinSystem()", +"8e351097": "MintedTokenCappedCrowdsale(address,address,address,uint256,uint256,uint256,uint256)", +"8e3571c0": "testNewCounterValueAfterAIncreaseAndADecrease()", +"8e357b6f": "AirTrafficControllerROS(address,int256,address)", +"8e36a9f1": "Neurus()", +"8e370b3d": "UnsoldTokensReturned(address,uint256)", +"8e372dcd": "refineCoke(uint256)", +"8e37adec": "setAddressArr(address[])", +"8e37c1e0": "collectorWeiCollected()", +"8e391cb2": "ProxyERC223()", +"8e3957d9": "RandomNumber()", +"8e3ab913": "transferToMany(address,address[],uint256[],uint256,uint256,address)", +"8e3af93f": "finalizeMint(uint256)", +"8e3b4525": "setExchangeLimit(uint256)", +"8e3bd6fa": "SetTradeable(bool)", +"8e3d4e5e": "Fibonacci(bytes)", +"8e3d5303": "addRegistrar(address,string)", +"8e3d63e3": "multiSendEth(uint256,address[])", +"8e3d7ae7": "drawFortune()", +"8e3dbf53": "getSalesPartnerAmount(address)", +"8e3dcc60": "sell_spice_melange(uint256)", +"8e3e1d86": "fisherYates(uint256)", +"8e3ed7d7": "sendEthers(address,uint256)", +"8e406072": "getKingdomCount()", +"8e414295": "Elixer()", +"8e416b9b": "randomFight2DeathContract()", +"8e417b30": "GTokenContract(uint256,string,string)", +"8e424f16": "onlyOwnerSetCompanyWallet(address)", +"8e434b82": "DADCoin()", +"8e438b70": "ConpayToken()", +"8e43e70e": "ParentKidsLinkToken(uint256,string,string)", +"8e44e74e": "DEFROST_MONTHLY_PERCENT()", +"8e452fc0": "findAvailableGame(address)", +"8e4553a4": "script(address,bytes)", +"8e455a1d": "_createVote(uint256,uint256,uint256)", +"8e468a88": "donationMap(address)", +"8e46afa9": "getDefaultGracePeriod()", +"8e46b68b": "keysRec(uint256,uint256)", +"8e46f716": "CoinX(uint256,string,string)", +"8e46fbb2": "testBitsXorFailIndexOOB()", +"8e4748cf": "MintingERC20(uint256,uint256,string,uint8,string,bool,bool)", +"8e47b87b": "FundsReceived(address,uint256)", +"8e47dd03": "currentProfitPct()", +"8e48474a": "chooseWinner(string,string)", +"8e496832": "DataContract()", +"8e497470": "displayNick(address)", +"8e499bcf": "numTokens()", +"8e49a2c2": "turnmigrate()", +"8e49a41f": "getVestingFromContract(address,address)", +"8e49cf5c": "soldSoulBecause(address)", +"8e49dd3f": "Failed(uint256,address,uint256,address,address,uint256,address,uint256,uint256)", +"8e49ff47": "AntzToken()", +"8e4a23d6": "Unauthorized(address)", +"8e4a943d": "IcoResumed()", +"8e4ab74b": "BANKROLL()", +"8e4adf4e": "tokenUpgrader()", +"8e4afa51": "checkTransferToICAP(bytes32,uint256)", +"8e4b0190": "deleteWorkerAdress(address)", +"8e4bf820": "settleBet()", +"8e4c64c0": "grantsController()", +"8e4cb2a9": "balances_after_buy(address)", +"8e4d0a83": "setLockupList(address,address,uint256)", +"8e4d5053": "getcontractBalance()", +"8e4e0f03": "teamAndExpertsTokens()", +"8e4f9606": "updateReputationScore(address,uint256)", +"8e4fa788": "accountHasCurrentVote(address)", +"8e5051f0": "weiToOwner(address,address,uint256)", +"8e50a65d": "prepareDividends()", +"8e514018": "getRandomPrice()", +"8e5152d6": "addToAngelExperienceLevel(uint64,uint256)", +"8e51b069": "ownerAddMarket(address,address,address)", +"8e51d624": "failsafe_addition(uint256,uint256)", +"8e52019d": "ECASH()", +"8e52cb51": "getRecordKey(bytes,bytes,bytes)", +"8e535ade": "lrcInitialBalance()", +"8e53d5e4": "cumulative(uint256)", +"8e53f4fb": "preicoSale()", +"8e543a12": "getLoanAmount(address,address)", +"8e550bd1": "lastNewInterest()", +"8e57d397": "modifyHorseyFeedingCounter(uint256,uint8)", +"8e588306": "getAutonomousSoftwareOrgInfo()", +"8e5919b6": "setEdoRate(uint256)", +"8e592caf": "KittyKendoCore()", +"8e599d50": "joinFunction()", +"8e59a15b": "checkMinGoal()", +"8e5b2899": "check(bytes20,uint24,uint32,bytes32[],uint16)", +"8e5c2e8a": "LogContractOwnershipChangeCompleted(address)", +"8e5d97a2": "releasePendingTransfer(uint256)", +"8e5e91ac": "executeStakeholderTransaction(uint256)", +"8e5ee9ec": "currencyToToken(bytes32[8],bytes)", +"8e5ef4ea": "DataShieldCoin(uint256,string,string)", +"8e5ef8fe": "ChivesToken()", +"8e5fd5fa": "validateReservation(address,uint8)", +"8e604b1d": "queryItems(bytes32,uint256,bool[6],bool)", +"8e611cee": "deductFromUnminted(uint256)", +"8e62bbd9": "DigitalCoin()", +"8e62c982": "initialARXSupply()", +"8e634029": "communityContract()", +"8e637a33": "authorizePayment(string,address,uint256,uint256)", +"8e63d7e1": "getTopLevel(uint256,uint256)", +"8e63ef75": "icoEtherReceivedPrivateSale()", +"8e641963": "_mintCards(uint32)", +"8e64a720": "PlendsToken()", +"8e65f7e4": "logAllTransactions(address)", +"8e6635a5": "toUint128Throw()", +"8e66ca5f": "setFirstBonusLimitPercent(uint256)", +"8e66da2f": "cancelBet(uint8,uint256)", +"8e66fea2": "TTCTokenERC20(uint256,string,string)", +"8e68f000": "oneTokenInWei(uint256,uint256)", +"8e690315": "AttributaOwners()", +"8e69367e": "RandomizedPriceFeedApi()", +"8e694807": "PHOENIX_CORSAIR_MAX_CARGO()", +"8e6954de": "totalFci()", +"8e69ceec": "dispatchTokens(address,uint256)", +"8e69e204": "getPeriodsWithdrawal(address,bytes32)", +"8e69eeb9": "setDefaultVoteRules(uint256[5])", +"8e6a1b24": "PIXToken(address)", +"8e6a2afa": "MAX_PERIOD_COUNT()", +"8e6b5462": "setOrCacheDesignatedReportNoShowBond(uint256)", +"8e6b551c": "sumHardCapPublicSale()", +"8e6b77a2": "interestArray()", +"8e6b851d": "valueGet(string)", +"8e6bee97": "pay(uint256,bytes32)", +"8e6ce1b1": "getActiveSellDetails(bytes32)", +"8e6d2599": "_activeness2level(uint256)", +"8e6d531d": "setSubPromoter(address)", +"8e6d7db8": "updateInstitutionAsset(string,string,address,address)", +"8e6ddab1": "createMonster(uint256,uint256,uint256,uint256,uint256,bytes)", +"8e6df32f": "exerciseOptions(address,uint256,uint256,uint256,bool)", +"8e6f2353": "ln(int256)", +"8e6f843f": "EarlyExchangeRateChanged(uint256)", +"8e6fdd31": "raisedEth()", +"8e6ff99a": "addVineyard(bytes32,uint16,uint24,uint32,uint16)", +"8e70fdbc": "setIsNotAdmin(address,bool)", +"8e71decb": "findWinner()", +"8e71f4fd": "_hasAllSigs(address,address)", +"8e728fec": "configTimeInit()", +"8e7296b1": "MOACSupply()", +"8e72a926": "bankRollBeneficiary()", +"8e72ca91": "proxyIncreaseWithdrawalChunk()", +"8e735547": "getUserByEmailVerify(bytes32)", +"8e739461": "getBalance(bytes32)", +"8e73d42c": "lunyrMultisig()", +"8e7418cb": "isSecondRound()", +"8e744f54": "tranferMinterOwnership(address,address)", +"8e74a528": "avarageBlockTime()", +"8e752b40": "startTeamTrade()", +"8e7547cb": "setWithdrawWallet(address,address)", +"8e755125": "testIntFixedArray(int256[3])", +"8e7558cd": "closeStage(uint256)", +"8e75dd47": "companyCount()", +"8e75f23c": "get_collateral_bix_amount()", +"8e760afe": "verify(bytes)", +"8e76581e": "getManifestId(address,bytes32,uint256)", +"8e767411": "setWhaleIncreaseLimit(uint256)", +"8e768288": "isSane(address)", +"8e76e3ba": "BillofLaden()", +"8e77304c": "YOUToken()", +"8e77afc5": "BSCore()", +"8e77d147": "transactionfeeAmount()", +"8e77fe2f": "blacklistAddresses(address)", +"8e77ff1f": "setMigrateTokenContract(address)", +"8e78eff6": "get_add(uint256)", +"8e78f0f2": "remOperator(address)", +"8e7952c6": "davToken()", +"8e79dc91": "set_participant_arbits(address,uint256)", +"8e7a1697": "setDepot(uint256,uint256)", +"8e7a9687": "check_vote(string)", +"8e7b36be": "payFor(address)", +"8e7b90e4": "setTgeAddress(address)", +"8e7c9e50": "logFloor(int256,uint8)", +"8e7cb6e1": "getIndex(uint256)", +"8e7cd5a7": "distributeExternal(uint256,uint256,uint256,uint256)", +"8e7d0f44": "publicKeyConsensus()", +"8e7e060f": "buyCards(uint8)", +"8e7e34d7": "fromHex(string)", +"8e7e879f": "migrateAll(uint256[])", +"8e7e99b8": "TotalSupply(uint256,uint256,address)", +"8e7e9a3c": "calculatePrizes()", +"8e7ea5b2": "getWinner()", +"8e7fd292": "trySetSubnodeOwner(bytes32,address)", +"8e7fdc6c": "LogBetProperties(uint256)", +"8e7fffe8": "individualRoundCap()", +"8e80ade9": "hodlTokens(address,uint256,uint256)", +"8e818aa1": "acceptAdminWithdraw()", +"8e81bc9c": "addWhitelistedBurn(address,address)", +"8e81c579": "poolEthSold()", +"8e81c64d": "burnTokens(uint256,uint256)", +"8e821b24": "persians()", +"8e84844e": "changeWeight(address,address,uint256,uint256)", +"8e84d413": "isFree(uint256[],uint256)", +"8e854ed8": "getResult(uint256,uint8)", +"8e8556b4": "privateSaleEtherRaised()", +"8e86077b": "foundingTeamSupply()", +"8e8622f9": "_getTAOIdByName(string)", +"8e869843": "sellfloaksAgainstEther(uint256)", +"8e86d030": "getMessageRequestHash(address,uint256)", +"8e8758d8": "tokenAllowance(address,address,address)", +"8e87f57c": "setCompare(bytes2)", +"8e87fcbf": "transformFrom(address,uint256,uint256)", +"8e885cbb": "LARGE_PURCHASE_BONUS()", +"8e894a6f": "getTileIDByOwner(uint16,address)", +"8e89ad00": "setMaxDailyPerUser(uint256)", +"8e89f6e2": "Crowdsale(uint256,uint256,uint32,uint32,address,address,address,uint256,uint256,uint256,uint256,uint256)", +"8e8a3983": "paySomeone(address,address)", +"8e8a4a20": "userTenantHashExists(bytes32)", +"8e8afc34": "setSlaveServer(uint32)", +"8e8b34bc": "createNewSecurityDeposit(string,string,uint256)", +"8e8bc816": "TokenBonus(address,address,uint256)", +"8e8cf4a8": "getThisBalance()", +"8e8df687": "processedTokens()", +"8e8e4675": "gur(address,address)", +"8e8e75fb": "addExternalController(address)", +"8e8f1e84": "setPublicSaleParams(uint256,uint256,uint256,uint256)", +"8e8f39d3": "getBlockNumberM1()", +"8e8fe845": "IsDistribRuSTMingFalg_()", +"8e9030f4": "maximumNonWhitelistAmount()", +"8e90b71a": "changeStatus(bytes1,bytes32)", +"8e90ccbe": "Governance(address[],uint256,uint256)", +"8e90e1e9": "_createCutie(uint40,uint40,uint16,uint256,address,uint40)", +"8e9185cb": "NON_TRANSFERABLE_TIME()", +"8e9206a0": "EOM()", +"8e928076": "setMaxGas(uint256)", +"8e92aea3": "_fetch(uint256)", +"8e92ee66": "redeemShardsIntoPending()", +"8e93907b": "FamilyResourceControl(uint256,uint256,uint256,uint256,uint256[])", +"8e93c883": "setMarketingTokensWallet(address)", +"8e940bb7": "test_testableContributionCaseExpectFailure()", +"8e943c8b": "checkParticipants()", +"8e94a5f3": "sellerRefund(uint256)", +"8e955978": "pushProposal(address)", +"8e95b0cd": "getSponsorshipsTotalRefunded(address,uint256)", +"8e95b28b": "delegateUrl()", +"8e964de9": "COPPER_AMOUNT_XPER()", +"8e9674c8": "WEMACOIN()", +"8e96eb3e": "coePerEthOffset()", +"8e979bad": "setwinPercent(uint256)", +"8e984ccd": "joinGameAndBattle(uint256,uint256)", +"8e98c6b9": "getLeaderboardPlayers()", +"8e98cee1": "update_session(uint32,uint64,uint64)", +"8e9a5890": "danGold()", +"8e9a7159": "LZLPrivate()", +"8e9aed2e": "HACHIROKU()", +"8e9b7ab8": "Partners(address)", +"8e9bf09c": "issueTokenToAddress(address,uint256)", +"8e9c3ce2": "assetOfBitmark(uint256)", +"8e9ccd04": "computeIndexId(address,bytes)", +"8e9e5c37": "requiringAuthorization()", +"8e9e697d": "reset(uint256,uint256,uint256,uint256,string)", +"8e9e8b14": "marketingPartnerSupply()", +"8e9f2738": "_transferAllArgs(address,address,uint256)", +"8e9f9072": "signedMessageECRECOVER(bytes32,bytes32,bytes32,uint8)", +"8ea04cb3": "getUpgradability(uint256,address,address,string)", +"8ea06c68": "BLMToken(uint256,uint256)", +"8ea0926a": "addBaseStats(uint256,uint8[8])", +"8ea0b540": "getProjectInformation(uint256)", +"8ea0d898": "DestroyedBy(address)", +"8ea1ee86": "DapCarToken()", +"8ea1ff21": "OwnedExample(address)", +"8ea25644": "XYY()", +"8ea390c1": "getOwedDividends(address)", +"8ea44bab": "setProviderAdmin(uint256,address)", +"8ea51696": "JRT()", +"8ea5220f": "devWallet()", +"8ea55bd7": "_pushContributor(address,bytes32)", +"8ea56e57": "ADV()", +"8ea64376": "opsAddress()", +"8ea67eb0": "ETCharPresale(address)", +"8ea69e37": "TestToken(uint256)", +"8ea6dd82": "BotAdded(address)", +"8ea7296b": "deleteChild(address)", +"8ea73a7c": "setDonationReward(uint256)", +"8ea74d95": "transferDaico(address)", +"8ea77300": "RELEASE_START()", +"8ea822d8": "createThings(bytes32[],uint16[],bytes32[],uint16[],uint88)", +"8ea83031": "swapContract()", +"8ea83681": "mintTreasuryTokens(address,uint256)", +"8ea8dc9d": "APP_MANAGER_ROLE()", +"8ea8e149": "removeService(address,address)", +"8ea8f83c": "activate(uint256,uint256)", +"8ea91bf3": "createVestedToken(address,uint256,uint256,uint256,uint256)", +"8ea95cbc": "lastDepositorAmount()", +"8ea98117": "setCoordinator(address)", +"8ea98db4": "Mmchain(uint256,string,string)", +"8eaa1e29": "getContentByData(address,uint256,string,string)", +"8eaa5d1c": "amount50kUsdInCents()", +"8eaa6ac0": "get(bytes32)", +"8eaa8d4f": "RefundedInvestor(address,uint256,uint256)", +"8eaa9c91": "Client()", +"8eaaeecf": "getUserCapInTokenWei(address,address)", +"8eac494c": "tierWhitelisted(uint256)", +"8eadb561": "IntelliToken()", +"8eaeb531": "setAccountA(address)", +"8eaf1dab": "PRCT100_R2()", +"8eafe0f0": "getCustomerRating(string)", +"8eb04f02": "setRefundManagerContract(address)", +"8eb066ce": "init(address[5],uint256[6],uint8,bytes32,bytes32)", +"8eb0e73e": "bonusPctSteps(uint256)", +"8eb179ad": "maxHardCaphardcap()", +"8eb206d1": "deletePage(bytes32,bytes32)", +"8eb36e3d": "initData()", +"8eb3e0e3": "socERC20(uint256,string,string)", +"8eb45cbf": "frozenProfitDate()", +"8eb4e0ad": "batchRelay(bytes16[],address[],address[],uint256[],uint16[],uint128[],uint8[],bytes32[],bytes32[],uint8[])", +"8eb547d4": "squareOfSums(uint256,uint256)", +"8eb5a7ac": "changePermission(address,bool)", +"8eb5f650": "ETIN(uint256,string,string)", +"8eb6418e": "LoritaBi()", +"8eb64b3d": "multi(address[],uint256)", +"8eb64b61": "MAX_NON_SALE_SUPPLY()", +"8eb689f7": "giveFor(address)", +"8eb6d683": "coinAllowanceOf(address,address)", +"8eb6ffaa": "withdrawBloc(uint256)", +"8eb717fc": "increaseCap()", +"8eb76eed": "emitUserRatingGiven(address,address,uint256)", +"8eb7ffe8": "assignInBatches(address[],uint256[])", +"8eb831fe": "ChangeOperator(address)", +"8eb857f8": "getData_25()", +"8eb88c1b": "EvergreenHealthToken()", +"8eb89a61": "getPointsBalance()", +"8eb976ca": "assertEq17(bytes17,bytes17)", +"8eb98150": "NOT_ENDED_FINE()", +"8eba2966": "RESERVE_PORTION_MULTIPLIER()", +"8ebaae08": "createListing(uint256,uint256,uint256,address)", +"8ebac11b": "getHash(address,uint256,uint256,uint256)", +"8ebb2ce7": "setProfitContainerAddress(address)", +"8ebb5aee": "calculateTokenBuy(uint256,uint256)", +"8ebc266d": "getCurrentUSDCentToWeiRate()", +"8ebe555b": "allocateShares(uint256,uint256)", +"8ebed616": "CRF()", +"8ec3167f": "calculateGoalsFromAttributeTotals(uint256,uint256,uint256[],uint256[],uint256)", +"8ec3272d": "addPicture(string,bytes32,string,address)", +"8ec48bcb": "BitCharity()", +"8ec49939": "switchOFFfreeForAll()", +"8ec4dc95": "getPerson()", +"8ec521a8": "setupStakeholders(address[],uint256[],uint256[],bool[],uint256[],uint256[],uint256[])", +"8ec5a309": "testHash(string)", +"8ec5ff41": "isUid(string)", +"8ec63da9": "checkIsOnlyProxy(bytes32)", +"8ec6677d": "registerUsername(string,address)", +"8ec84812": "updateProfit()", +"8ec86497": "clearname()", +"8ec89e4f": "_isActive()", +"8ec8fcad": "ADV(uint256,string,string)", +"8ec9925e": "jackpotToken()", +"8ec9a5de": "getLeaf(bytes32,uint256)", +"8ecaa140": "_refundHighestBidder(uint256)", +"8ecbc4e9": "setNewBRXPay(address)", +"8ecc0643": "BuyAd(address,uint256,string,string,string,uint256,uint8,address)", +"8ecc0950": "returnToOwner()", +"8ecc107f": "buyUninitializedPixelBlock(uint256,uint256,uint256,bytes32)", +"8ecc4353": "adddayruns(address,uint256)", +"8eccf58e": "getTokensCountPerEther()", +"8ecd2fe8": "testMul256By256()", +"8ece19f6": "setTokenLock()", +"8ece39cd": "startOraclize(uint256)", +"8ece85a4": "ETpay(uint256,string,string)", +"8ecebf34": "MorpheusToken()", +"8ecf0d0b": "getCreated()", +"8ecfc412": "workForce()", +"8ed06b62": "getShipPrice(uint256,uint256)", +"8ed08711": "saleMinimumWei()", +"8ed09bc9": "registerVoter(bytes32,address)", +"8ed0ac8b": "closeTrancheAddition()", +"8ed1858e": "distributeELTCSmall(address[])", +"8ed20fa0": "tokenWeiToSale()", +"8ed2395f": "ZCNYToken(address)", +"8ed33545": "sub_presale_arbits_sold(address,uint256)", +"8ed34751": "performHealthCheck(uint8)", +"8ed399ca": "teamWallet_2()", +"8ed3fa7c": "codexCoin()", +"8ed5047c": "updateCokeTotal(uint256,bool,uint16)", +"8ed5f2ca": "newTestableCampaign(string,uint256,uint256,address)", +"8ed67a44": "setPrice(uint16)", +"8ed6910f": "limitSell(uint256,uint256)", +"8ed7c3d3": "sendTokensManager(address,uint256)", +"8ed7ca93": "finishExam()", +"8ed8067e": "FundContract()", +"8ed882c5": "designatedReporterWasCorrect()", +"8ed91318": "nextAssetId()", +"8ed9be36": "temp(uint256,uint256,bytes32,bytes32)", +"8ed9fd75": "ICO_Supply()", +"8edb726d": "modifyEndFundingTime(uint256)", +"8edbf436": "getPriceInfo(address)", +"8edc4f8f": "isValidCap(uint256,uint256)", +"8edc707b": "adoptionOffers(bytes5)", +"8edcf21d": "getCurrentYearGameMiningRemainToken(uint16)", +"8edd6eb6": "getFund()", +"8eddc306": "__exchangerCallback(address,address,uint256)", +"8eddc804": "notifySale(uint256,uint256)", +"8eddf665": "onInvest()", +"8ede1817": "getReturnTime(uint256)", +"8ede3a34": "KeplerToken()", +"8ede74c1": "changeRage(uint256)", +"8ede94b4": "setLineUpEnable_miner(address,uint256)", +"8edeb15d": "donation()", +"8edec689": "wd()", +"8edfaef8": "getSetupParameters()", +"8edff3db": "getTerminal(uint256)", +"8ee030bd": "FaceterToken(address,address)", +"8ee070d9": "MYEMPEROR()", +"8ee0942b": "setSignatureROFR(bytes)", +"8ee0ffe8": "sendStakingContract()", +"8ee1409e": "TitanToken()", +"8ee17e0a": "MarvinCoin()", +"8ee21b8e": "get_default_keys()", +"8ee365fa": "removeAddressesFromAdmins(address[])", +"8ee36f05": "isVoted(address,uint256)", +"8ee3f472": "BoutsCrowdsale(uint256,uint256,uint256,address,address,address)", +"8ee3f72f": "PinCode()", +"8ee4d44b": "addAddressToOperators(address)", +"8ee4fd8a": "claimWithSignature(bytes)", +"8ee553cc": "getCroById(uint256)", +"8ee5a8b3": "UpgradeProposals(uint256)", +"8ee6540c": "seventeen()", +"8ee6f301": "readvalidrollsXteam(uint16)", +"8ee78046": "draw(address,uint8[])", +"8ee833cc": "isValidTenant(string,address,uint256)", +"8ee8a5c4": "Charity(string)", +"8ee93cf3": "post(string)", +"8ee97ff4": "VirtualRewardToken()", +"8eeb203e": "exchangeWeight()", +"8eeb33ff": "crowdSaleAddr()", +"8eeb3b0e": "KJCPerEthereum()", +"8eeb5073": "_bundle(address,uint256,uint256[])", +"8eeb5c97": "cancelDo(bytes32)", +"8eeb7d11": "unlockAllocationAddress(address)", +"8eeb8e5a": "MUC()", +"8eec5d70": "getPoolCount()", +"8eec6f7b": "lockETH(uint256)", +"8eec99c8": "setNewAdmin(address)", +"8eecddcf": "betBlockNumberOf(address)", +"8eecf64d": "createContractWithMeta(address,uint64,bytes,string)", +"8eee1cd6": "buyerExceededApprovedAmount(uint256,address)", +"8eef059e": "_lowerDown(uint256,address)", +"8ef0f09a": "createPromoPow(address,string,uint256,uint256,uint256)", +"8ef1a6b6": "makeProfit(uint256)", +"8ef1e886": "RESERVE_PERCENT_EVE()", +"8ef22afe": "getCostToCancel()", +"8ef25a7a": "KeplerTokenExtraSale(uint256,address,address)", +"8ef26a71": "coinSentToEther()", +"8ef28249": "totalGuesses()", +"8ef2826e": "HODLWallet(address[],uint256[])", +"8ef292fc": "BTM()", +"8ef326ea": "getCubeCount()", +"8ef44301": "tokenRecoveryFromTrade(address,address,address,uint256)", +"8ef47296": "StorageController(address,address,address,address)", +"8ef483eb": "getMyWager()", +"8ef490ea": "fullname()", +"8ef4c807": "lockedBalanceOf(address,uint256)", +"8ef53edf": "InitAssignOK()", +"8ef5ae21": "setupInfo(string,string,string)", +"8ef5ce28": "test1_addingFirst()", +"8ef5eaf0": "drop(address[])", +"8ef6e7fe": "build(string)", +"8ef6ed53": "_getRandom(uint256,uint256)", +"8ef72d15": "backEthRatio()", +"8ef79e91": "setTokenBaseURI(string)", +"8ef7c649": "getTicketPrice(uint8)", +"8ef8125e": "frontRunnerSetTimestamp()", +"8ef82010": "orderExecution(bytes32,uint256)", +"8ef85e04": "secondWeekTokenPrice()", +"8ef87843": "randomSkinAppearance(uint256,uint128)", +"8ef8f241": "getEmployerInfo()", +"8ef9c904": "NewAmbassador(address,address)", +"8efa00e2": "getPRETDETokenExchangeRate(uint256)", +"8efa23d1": "RELEASE_WALLET()", +"8efa3e21": "setIsMinter(address,address,bool)", +"8efbd512": "getAccountNumber(address)", +"8efc777f": "isBeta(bytes)", +"8efd4c75": "QUARTERLY_RELEASE()", +"8efd5f92": "divIntervalDays()", +"8efe6dc4": "changeMonthlyWithdrawLimit(uint256)", +"8efe7801": "showWinnersSort()", +"8efe8c1c": "EPTToken(address,address)", +"8eff3c29": "getRecords()", +"8effda0d": "IndorseSaleContract()", +"8f003a2d": "StarSportsToken()", +"8f00c0af": "has_contract_ended()", +"8f00cbfa": "winnerIndex()", +"8f00f49b": "totalAssetTokens()", +"8f0165e1": "min_pay_wei()", +"8f01932a": "mntpToMigrateTotal()", +"8f01e1e2": "getactiveleveltime(uint256)", +"8f02bb5b": "setTransferFee(uint256)", +"8f03850b": "numContributors()", +"8f038a5a": "initializeEthReceived()", +"8f039a10": "changelp8(address)", +"8f03f5c3": "firstUnlocked()", +"8f0427b1": "sellPosition(uint256)", +"8f049de5": "endBetRed()", +"8f054bf3": "referralList(address)", +"8f0563b9": "substring(string,int256)", +"8f061ef5": "Token(string,string,uint256,uint256)", +"8f06492d": "callOnRemoval()", +"8f0816bc": "PERKToken()", +"8f08288a": "clearBets()", +"8f08a60a": "transfer2(uint256,address[],uint256[],bytes,bytes,bytes,bytes)", +"8f08d44d": "burnAsset(uint256)", +"8f08e369": "withdrawApplication(address)", +"8f094efb": "getMineableSupply()", +"8f0a4c1b": "startPreSales()", +"8f0a6ecb": "returnBountyTokens(address,uint256)", +"8f0bc152": "claim(address,uint256,bytes)", +"8f0c724c": "setOperationsCallGas(uint256)", +"8f0d16da": "emitIssuersUpdated(address,bool)", +"8f0d3b8b": "_buy(uint256,uint256)", +"8f0d67ef": "activationTime(uint256)", +"8f0ec6b3": "ZanCoin()", +"8f10cad0": "StreampayToken()", +"8f10fd45": "getBuyCount()", +"8f112370": "addToAffiliate(address,uint256)", +"8f11e5f9": "checkWithdrawValue(uint256)", +"8f1224ce": "fixInvestment(address,uint256,uint256)", +"8f12355d": "assertEq7(bytes7,bytes7,bytes32)", +"8f1327c0": "getRound(uint256)", +"8f134025": "rewardSent(uint256)", +"8f13fd29": "setPriceValue(bytes32,uint256)", +"8f140568": "isServiceAddress()", +"8f142842": "getByAlias(string)", +"8f142907": "stables()", +"8f14b76b": "sendReferrer()", +"8f14d8a3": "reclaimContractTokens()", +"8f15024f": "ticketsSold()", +"8f152d0e": "vestingConfigured()", +"8f158e76": "remainingPublicSaleCap()", +"8f163497": "AgaCoin()", +"8f16eb1a": "setI_R1(uint256)", +"8f188b40": "migrateInvestor(address,uint256,uint256,uint256)", +"8f19ff45": "_handleTokensReceived(uint256)", +"8f1a422c": "minterWallet()", +"8f1a927a": "numTicksSinceAuctionStart(uint256)", +"8f1af992": "claimTwitterId(uint256,address,uint8,bytes32,bytes32)", +"8f1b0b02": "bulkTokenMint(address[],uint256)", +"8f1c204c": "test_fiveAssertFalse()", +"8f1cc85e": "SAGAcrowdSale(address)", +"8f1cc94e": "HashTypeAdded(uint8)", +"8f1d5f7e": "getLedgerNameHash()", +"8f1d8f41": "ethInvestment(address,uint256,uint256,uint256,uint256)", +"8f1d90b1": "tokenBearer()", +"8f1df4f7": "setPrices(uint256,uint256,uint256,uint8,uint256,uint256,uint256)", +"8f1eda37": "wmul(uint128,uint128)", +"8f1f761a": "Rewards_Supply()", +"8f1fc530": "startSplit()", +"8f1fc6bb": "testRemoveProductFromCart()", +"8f1fdbb9": "offerEth(uint256)", +"8f212eb7": "BITSDTokenInitialized(address)", +"8f217d6b": "lastChar(string)", +"8f22964d": "NegativeWhuffiesSent(address,address,uint256,string)", +"8f22d128": "testdigiToken()", +"8f24f2a3": "takeBuyOrder(address,uint256,uint256,uint256,address)", +"8f25159c": "getDayDepositLimit(uint256)", +"8f259117": "numcallsinternal()", +"8f25eec1": "BetWon(address,uint256,uint256)", +"8f26a5ab": "setSaleAgent2(address)", +"8f272c0b": "minor_partner_address()", +"8f2757d8": "Bitshopandearn()", +"8f282b87": "getSold()", +"8f283970": "changeAdmin(address)", +"8f287be5": "PitEur(address)", +"8f288526": "TokensPurchased(address,uint256)", +"8f288644": "getHighestBid(uint256)", +"8f2900d5": "timeLocks(uint256)", +"8f291158": "listBBO()", +"8f296759": "UTILITY_ROLE()", +"8f29f09a": "fetchPaidOrdersForMerchant(address)", +"8f2a3093": "freeBeerOnMe(string)", +"8f2a6d3e": "YOOBAToken(address,address,address,address,address)", +"8f2abe9a": "Voting(uint8,address,uint256)", +"8f2adbee": "tileBonuses(uint256,uint256,uint256)", +"8f2bab07": "getChainLength()", +"8f2be8e0": "MauiWowieToken()", +"8f2c2ab7": "checkAndCloseDeposit(uint256,bool)", +"8f2c3af8": "lastBlock_v10Hash_uint256()", +"8f2c44a2": "UnicornMilker()", +"8f2e695c": "ICO_state()", +"8f2e8d4a": "createTrack()", +"8f2e9ee7": "theDay(uint256)", +"8f2eabe1": "isValidatorFinalized(address)", +"8f2ec012": "dayToBlockNumber(uint256)", +"8f2ee2df": "mainPot()", +"8f2ef6b7": "CMGF()", +"8f303df9": "priceExpired()", +"8f30435d": "getCompetitionValues(string,uint8)", +"8f32106e": "CreateALLY(address,uint256)", +"8f32cf0c": "team_address()", +"8f32d59b": "isOwner()", +"8f33221e": "addContract(address,uint256,uint256)", +"8f33c285": "getAyantDroitEconomique_Compte_8()", +"8f33df77": "countAllVotes(uint256)", +"8f34296b": "Applied()", +"8f348cfe": "InsertProject(string,string,address,address,string,string,address)", +"8f34ac6e": "setCoOwner(address)", +"8f350624": "contributionOpen()", +"8f356f97": "lottoHighestNumber()", +"8f35a75e": "getInvestor(address)", +"8f36039c": "holdContract()", +"8f367001": "numTokensAbleToPurchase()", +"8f368359": "getTimeUntilInterestIncrease(bytes32)", +"8f3684bf": "returnTotalDividend()", +"8f36d03e": "_finishSpin(address)", +"8f36f8f1": "redeemStake(address,address,uint256,uint8,bytes32,bytes32)", +"8f37a0f9": "getTo(uint256)", +"8f382a00": "ETHEAL_UNIT()", +"8f38a896": "BRONZE_AMOUNT_XPER()", +"8f38bf34": "updatePrices(uint256,uint256[],uint16,uint256[],uint256[])", +"8f38d8cc": "S(string)", +"8f38f309": "buyXid(uint256,uint256)", +"8f3956a4": "ChangeUpgradeMaster(address)", +"8f395eb6": "addIntComparison(bytes32,int32,bytes1)", +"8f398180": "isUnknown(address)", +"8f3984b5": "setRole(address,string,bool)", +"8f3b6b84": "centsPerToken()", +"8f3b8c3a": "setTokennCrowdsale(address,uint256)", +"8f3bab85": "readFromCart(uint256)", +"8f3bed06": "pickUniquePacks(uint256[])", +"8f3de282": "onSealed(address,address,uint256)", +"8f3e568a": "findOutInterestByClientCategory(address,uint256,uint256)", +"8f3e8747": "getGasForMcrData()", +"8f3f50fc": "startICOTimestamp()", +"8f40104c": "init(address,uint256[],uint256,uint256,uint256,uint8,uint256,bool)", +"8f409b85": "Coin(uint256,string,uint8,string)", +"8f41e442": "breakTie(uint256)", +"8f420866": "DEFAULT_SEND_GAS()", +"8f426437": "getTankOwner(uint32)", +"8f42a864": "TitaToken()", +"8f43166b": "getGivenCount()", +"8f44097a": "TokenRDC(address,address,address)", +"8f449a05": "subscribe()", +"8f456125": "setCrowdSaleAddress(address)", +"8f4613d5": "left10(uint256)", +"8f4646b7": "transferPreSignedCheck(address,address,uint256,uint256,uint256,uint8,bytes)", +"8f46b586": "withdraw_team_fund(address,uint256)", +"8f4708bd": "mintingBountyFinish()", +"8f477c55": "updateLink(address,bytes)", +"8f4783f1": "_generateRealmSale(uint256,uint256)", +"8f47dd19": "bulkInit(address[],address[],uint256[])", +"8f484394": "manual_withdraw()", +"8f48c14a": "updateMinCompanyValue(uint256)", +"8f49a264": "provide_eth()", +"8f49ccf4": "reportUsage(uint256,uint256,address)", +"8f49da4b": "distributedToken()", +"8f4a2a51": "defaultWallet(address)", +"8f4b4b98": "messagesSigned(bytes32)", +"8f4ccce8": "startTokenVotes(address[15])", +"8f4ce746": "buyDeferredPresaleTokens(address)", +"8f4d8723": "_CallExecuted(address,bytes32)", +"8f4d874a": "referralTokensAddress()", +"8f4dc0d1": "updateAvailable(uint256,uint256,bool)", +"8f4e4321": "accountOf(uint256)", +"8f4e5158": "increaseFrozenBalances(address,uint256)", +"8f4ed333": "step2()", +"8f4f3c70": "DungeonChallenged(uint256,address,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)", +"8f4fb958": "calculateRandomNumberByBlockhash(uint256,address)", +"8f4fde42": "crossForkCount()", +"8f4ffcb1": "receiveApproval(address,uint256,address,bytes)", +"8f50fb06": "getTrapInfo(uint256)", +"8f50fdd6": "walletAddressesSet()", +"8f512c47": "getSponsorships(address,address)", +"8f518475": "NewKoth(uint256,uint256,address,uint256,uint256,uint256)", +"8f52d420": "CryptoStrippers()", +"8f52da60": "technicalWallet()", +"8f535904": "CROWDSALE_REWARD_WALLET()", +"8f541730": "advisor1Sum()", +"8f55a850": "getArtistList()", +"8f56015f": "setRequirement(uint256)", +"8f5665ce": "nthWagerPrizeN()", +"8f571461": "ICOPRICE()", +"8f580996": "enablePurchasing()", +"8f58190e": "setLLV_edit_19(string)", +"8f581a53": "giveRegistration(address)", +"8f5949f9": "isContractActive()", +"8f5a5a39": "verifyPayment(bytes8)", +"8f5ab3ab": "transferdata(address,uint256,bytes)", +"8f5ab947": "getNextDropTime()", +"8f5b0b1c": "timeCheck()", +"8f5bae2e": "anchor(bytes32,uint256)", +"8f5bc587": "TokensForSale()", +"8f5c2eff": "getPurchaseInfo(uint256,uint256,uint256,uint256,uint256,bool)", +"8f5c5d40": "validTranscodingOptions(string)", +"8f5cbe36": "testCreateSale()", +"8f5cf7b9": "vestingStageTime()", +"8f5d23f6": "TOKENS_FOUNDATION()", +"8f5e0b3f": "UserBondByOffset(uint32)", +"8f5e514a": "diff(uint256,uint256)", +"8f5e619b": "publishEtherBox(bytes32,string,uint256)", +"8f5e9ca7": "acceptTOS(address,bool)", +"8f5f20c2": "LMA()", +"8f5f657d": "rateboc()", +"8f5fa4a4": "changeReceiverAddress(address)", +"8f608f4f": "exchangeRateMNY()", +"8f60cf17": "increaseSalesBalance(address,address,uint256)", +"8f6107ef": "MatthewWon(string,address,uint256,uint256)", +"8f612102": "createCarrier()", +"8f617fcd": "icoFinishTimestamp()", +"8f61da35": "getDebtLength()", +"8f620487": "expirationDate()", +"8f62077d": "getPlayerShips(address)", +"8f6218a3": "rollDices()", +"8f6245e1": "parseBool(bytes32)", +"8f627aab": "BlockIntervalCrowdsale(uint256)", +"8f62905f": "mintTokens(int256,uint256,uint256,address)", +"8f62b028": "updateUSeqgret()", +"8f632311": "doMint(address,uint256,bytes)", +"8f632a34": "MeetupToken(uint256,string,uint8,string)", +"8f6348b8": "stopFeeding()", +"8f63534a": "totalAuctionsCount()", +"8f64337d": "getHashedData(uint256,uint256,bytes32,bytes32,uint256)", +"8f652ec7": "_getVerifierInfo(address)", +"8f654175": "auditorAddress()", +"8f6612c9": "distributedAutonomousExchange()", +"8f679b2d": "EtheraffleICO()", +"8f67bd4d": "SBITokenCrowdsale(address,address)", +"8f67f9d7": "ILLIQUID_TOKENS()", +"8f6811a3": "mintTokensFor(address,uint256)", +"8f68b36f": "getMysubscribers()", +"8f68ca70": "setWhiteListContract(address,bool)", +"8f6963df": "initShareRule6()", +"8f699f6c": "calcInvalidKeys(uint256,uint256)", +"8f69fa25": "startLockingPeriod()", +"8f6a3deb": "_activateZoneLand(int32,int32,uint8,uint8)", +"8f6a7286": "refundMultipleUsers(address[])", +"8f6ac8d7": "FinalizableCrowdsale(uint256,uint256,uint256,address)", +"8f6b875a": "OWNER_POOL_COMMISSION()", +"8f6bc659": "ownerWithdrawExcessTokens(uint256,address)", +"8f6caf63": "sendPoint(uint32,uint32,int256,address)", +"8f6ede1f": "mintWithEther(address)", +"8f6f3275": "getLease(uint8,uint256)", +"8f6f6115": "getOraclizePrice()", +"8f6f988c": "setUltimateOutcome(bytes)", +"8f6fa4c2": "ICO_details()", +"8f6fba8c": "FEATURE_TRANSFERS_ON_BEHALF()", +"8f70009d": "id_for_address(address,address)", +"8f701eaa": "addguess()", +"8f702afa": "sellerNumOpenDeals(address)", +"8f70585f": "bid(address,uint256,uint256,uint256)", +"8f70bfa0": "processDeposit()", +"8f70ccf7": "setTrading(bool)", +"8f7140ea": "receivePlayerNameList(uint256,bytes32)", +"8f717e80": "totalCreationCap()", +"8f71b3db": "etherToUSDrate()", +"8f71f3cb": "getBdpPriceStorage(address[16])", +"8f728516": "initNewGame()", +"8f729925": "receivePercent()", +"8f72e065": "StabitCoin(uint256)", +"8f72fc77": "getOrders(uint256,uint256)", +"8f731077": "extractAllowanceRecordLength(address)", +"8f73c5ae": "distributeReward()", +"8f7445e6": "setStageThirdBegin()", +"8f7451ae": "GetStoreInfo()", +"8f750271": "prose()", +"8f75362d": "emergencyWithdrawAdmin()", +"8f75374d": "incrementSupply()", +"8f754a1e": "affectedCount()", +"8f755c7c": "getOptionState(address[3],uint256[3],uint256[2],bool)", +"8f760988": "forceStopCyle()", +"8f76691a": "margin()", +"8f76a1f7": "lastClaimedRound(address)", +"8f76dfc3": "allTokenICO()", +"8f770ad0": "supplyCap()", +"8f77339f": "sendToken(uint256,uint256,uint256,string)", +"8f775839": "settled()", +"8f776ff1": "allowanceBalance()", +"8f778bb9": "setEmployer(string)", +"8f77c2bf": "contractTransferOwnership(address)", +"8f78b34a": "lockAccounts(address[],uint256[])", +"8f790507": "teamEthContract()", +"8f7a1fe0": "static_income(address,uint256)", +"8f7a4738": "censure(uint16,uint32)", +"8f7a844b": "getAdminData()", +"8f7b7bce": "isTeamLockInPeriodOverIfTeamAddress(address)", +"8f7ba0a1": "registerbot()", +"8f7d33cf": "addCashback(string,uint256,address,uint256[],uint256[])", +"8f7d4dad": "getFirstPoints()", +"8f7d79da": "nextRoundMaxDonors()", +"8f7db6ee": "_setProviderSupply(uint256,uint256)", +"8f7dcfa3": "head()", +"8f7fe231": "ValidetherOracle()", +"8f80269d": "getClientSupply(address,uint256)", +"8f807f6b": "enqueue(address)", +"8f80b7bc": "registerTokenInternal(address,string)", +"8f80d339": "roundClaimICOKeys(uint256)", +"8f81ecfc": "removeChild(bytes32,bytes32)", +"8f81fd4a": "changeIcoDiscountPercentages(uint8,uint8,uint8)", +"8f8203c0": "transuser(address,uint256)", +"8f828c9e": "totalSupplyAtInternal(uint256)", +"8f82b8c4": "getWhiteListCount()", +"8f8336b7": "setFeesMaxUptoCoin(uint256)", +"8f835871": "addRealWorldPlayers(uint128[],bool[])", +"8f83719c": "getTreasuryBalance(address,address)", +"8f83743f": "Fricacoin()", +"8f838478": "getInstantiationCount(address)", +"8f842851": "dateManager()", +"8f847076": "removeNFToken(address,uint256)", +"8f84aa09": "ownerAddress()", +"8f850163": "flipsWon()", +"8f855433": "newCreator()", +"8f85f92c": "isPoDEnded()", +"8f860c5f": "createWallet(address,address)", +"8f86f5ea": "finishSale()", +"8f872bb1": "advisorsAndAmbassadorsAddress()", +"8f87932c": "fix_amount(uint256)", +"8f87c84b": "transferOutEth()", +"8f87e387": "updateSspManagerContract(address,string)", +"8f88110d": "updateRecordWalletAddress(string,address)", +"8f88708b": "retrieve(uint256)", +"8f88a00e": "calculateRewardStructures()", +"8f88aed0": "populateFromItemRegistry(uint256[])", +"8f88b792": "createCampaign(string,uint256[3],uint256[],uint256,uint256,uint256,uint256)", +"8f8949e6": "setTotalCardCount(uint256)", +"8f8a5832": "reLoadXid(uint256,uint256)", +"8f8b2c9b": "totalEthJackpotRecieved()", +"8f8bbb8c": "ObjectedVote(bytes32,address,uint256)", +"8f8bcae6": "minting(address,address)", +"8f8bd64c": "calculateNetworkTokenBonusPercentage(uint256,uint256,uint256,uint256,uint256)", +"8f8bde82": "MicroDAO()", +"8f8c7c50": "_randomMeme()", +"8f8d322e": "melt(address,uint256)", +"8f8d49ac": "setStore(string,uint256)", +"8f8db737": "buyDirectInMarketplace(uint256)", +"8f8e7419": "sharedStorage()", +"8f8e8f9d": "refundETHToCustomer(address,address,uint256)", +"8f8eabea": "ZNA(uint256)", +"8f8eb474": "burnBid(uint256)", +"8f8f6b52": "freezTwo()", +"8f907195": "rpow(uint256,uint256)", +"8f9087f5": "hashBytes(bytes)", +"8f908cbd": "setCaptainTokenContract(address,address)", +"8f90f2bb": "getNewRabbit(address)", +"8f9139fb": "Pokecoin(uint256,address,address)", +"8f924560": "addEntity(string,uint256,uint256)", +"8f929c4a": "createAccount(bytes16,string)", +"8f92d308": "viewFeaturePetitionFee()", +"8f937574": "OwnerHelper()", +"8f93bffe": "getOrCacheReportingFeeDivisor()", +"8f940f63": "typeId()", +"8f94f6a0": "piTokensForSale()", +"8f9593f4": "winnerFirst(uint256,uint256)", +"8f96a1ea": "addThing(bytes32,bytes32,bytes32,bytes32)", +"8f975a64": "sendERC20(address,address,uint256)", +"8f97ad89": "claimTokensFor(address,address)", +"8f97cff0": "getPersonsCount()", +"8f97d03f": "IbizaERC20Token()", +"8f97e3a0": "requestPayout(uint256)", +"8f984115": "AUEBToken()", +"8f98767e": "fundingMaximumTargetInUsd()", +"8f98ce8f": "transferFeeNumerator()", +"8f98e0e1": "MBToken()", +"8f99d31b": "betLow()", +"8f99ea43": "setDividendDB(address)", +"8f99fdab": "SafeDeduct(uint256,uint256)", +"8f9a42b8": "philadelphiaBets()", +"8f9a57ef": "minSignId()", +"8f9a6da1": "queryOracle(string,string)", +"8f9abae1": "accessControlled()", +"8f9abe52": "isValidSellOrder(address,address)", +"8f9ade5e": "create(address,bytes32,uint256)", +"8f9b7eb7": "updateReleaseAmount()", +"8f9bbf16": "getSecurityTokenData(address)", +"8f9bf95d": "_payCommission(address)", +"8f9d1cba": "zss(address)", +"8f9d390a": "toteLiquidatorTransferComplete()", +"8f9de24b": "uniqueSpinnersActive()", +"8f9df278": "newEntry(int256,bool,uint256,int256,string,bytes32,address,uint256[])", +"8f9e1409": "removeSection(bytes32,bytes32)", +"8f9f5b2f": "getMemoryWrite(uint256,uint256)", +"8f9fa9ec": "chngDL(uint256)", +"8f9fb0e4": "getAssetString(uint256)", +"8fa148f2": "currentRoundStartBlock()", +"8fa17580": "claimEgg(uint256,bytes32,bytes32)", +"8fa1ae05": "batchTransferSingleValue(address[],uint256)", +"8fa32111": "addInvestor(address[])", +"8fa366df": "changePhaseToICOweek3()", +"8fa3a84c": "validateTransaction(address)", +"8fa4c0b1": "tokenPlus(address,address,uint256)", +"8fa54b81": "setUserBattleValue(address,uint256)", +"8fa5614f": "getBylawsProposalVotingDuration()", +"8fa56215": "_createToken(string,string,string,uint256,address,uint256,uint256)", +"8fa566e8": "tokenIdOfUUID(string)", +"8fa5a6e9": "pmtAccount()", +"8fa65488": "startRefundInvestorsBallot()", +"8fa6da99": "Modultrade(address,address,address,address)", +"8fa81bb0": "PrivateSale(address,uint256)", +"8fa8b790": "cancelAuction()", +"8fa906b2": "addFounder(address,uint256)", +"8fa9cc09": "HeritableWalletFactory()", +"8fa9e55c": "signIn(address)", +"8faa6cb7": "partnersLockEnd()", +"8faa77b2": "deployers(uint256)", +"8faab3a7": "BatchAttachAssets(uint256[10])", +"8faad4c4": "createPromoTeam(string,address,uint256)", +"8fab0549": "setInvestorsPercentage(uint256)", +"8fabd326": "mPausedTime()", +"8fac3d3e": "feesGathered()", +"8fad8334": "_timeRemaining()", +"8fad8eec": "EnterRentToken()", +"8fadd08b": "betHigh()", +"8fae065c": "setStartIcoPreICO(uint256)", +"8fae4857": "finaliseChannel()", +"8fae60a5": "agree()", +"8fae8850": "ICOmint(address,uint256)", +"8faef6a5": "getTierForLastMiniting()", +"8faf682d": "payeeWithdrawCapital()", +"8faf850d": "addUser(bytes32)", +"8fafb286": "claimResearchDividends(address,uint256,uint256)", +"8fafebca": "TokensPurchased(address,uint256,uint256)", +"8fb0de08": "getCurrentRoundInfo2()", +"8fb197d1": "getUserDataOnToken(address,uint256)", +"8fb21a4b": "setMinReferrerBonus(uint256)", +"8fb25f82": "sellCells()", +"8fb29d6c": "pastAgreement(uint256)", +"8fb2f8b4": "isCollectTokenStart()", +"8fb2fbe1": "getTokenToEthUpdateOrderHint(uint32,uint128,uint128)", +"8fb48844": "noOfreservations(address)", +"8fb4b573": "start(uint256,uint256)", +"8fb50078": "joinProvider(address)", +"8fb51ccd": "QosinusCoin()", +"8fb5202b": "setFinancialAddress(address)", +"8fb5a482": "getPrices(address[])", +"8fb67f60": "aPurgeMessages()", +"8fb6d997": "updateStorageContract(address)", +"8fb74077": "HoursFromNow(uint256)", +"8fb74ae9": "isBannedUser(address)", +"8fb807c5": "totalAssetSupply()", +"8fb84bb0": "marketBuy(uint256)", +"8fb8f109": "addressToPersonId(address,address)", +"8fb96635": "decreaseBalance(address,uint256,uint256)", +"8fba273c": "m_investmentsByPaymentChannel(address)", +"8fba8d5c": "toHexString(uint256)", +"8fbb3c17": "CROWDSALE_PHASE_2_START()", +"8fbb9b49": "_isProduct(address)", +"8fbc3ecd": "BUFFER()", +"8fbc7eb0": "balanceOfToken(address,address,address)", +"8fbd4fa5": "claimPrizes(uint256,uint256,uint256,uint256)", +"8fbe382c": "totalFoundCoin()", +"8fbea5c9": "totalCommissionOwed()", +"8fbeee23": "sendOutEtherWithGasAmount(uint256)", +"8fc01623": "activatePackage(uint256)", +"8fc1d08b": "transferFromPublicAllocation(address,uint256)", +"8fc202ae": "currentKeyRound()", +"8fc264e0": "allocateTokens(uint256,uint256)", +"8fc3047d": "checkPrice()", +"8fc3c33b": "GenerateFortuneCookie(uint8)", +"8fc469b1": "setPricesDecimals(uint256,uint256)", +"8fc4ea4c": "ownerPetCollection(address,uint256)", +"8fc5668b": "processRequest()", +"8fc5efd4": "c_centsPerTokenFirst()", +"8fc5fd83": "FRPoint()", +"8fc6ad2d": "getParameterValueByTitle(bytes32)", +"8fc6bf7f": "ico3endTime()", +"8fc7a25d": "getEthAmount(uint256)", +"8fc8a134": "DepositBeneficiary(address,uint256)", +"8fc95403": "saleSecondEarlyBirdEndBlock()", +"8fc9bff6": "_claimRewardBlank(address,string)", +"8fca3057": "pastPlayRoundsCount()", +"8fcb4e5b": "transferShares(address,uint256)", +"8fcbeeb7": "getFreeDragon()", +"8fcc9cfb": "setMinDeposit(uint256)", +"8fcd558e": "GetDataRequestLength(uint256)", +"8fce0ee7": "secondLineWrong()", +"8fce6b07": "_addKeeper(address)", +"8fced626": "resolveBet()", +"8fcee83f": "getRoomStatus(uint256)", +"8fcf31e3": "createCardFromName(string)", +"8fd0290f": "YZChain(uint256,string,uint8,string)", +"8fd0b051": "buyTokens(address,uint256,uint256,uint256)", +"8fd0de57": "identityCommitments(uint256)", +"8fd16541": "referrer2Percent()", +"8fd1b1f2": "maxCardUpgradeLevel()", +"8fd21139": "MixMall()", +"8fd23762": "IOSToken()", +"8fd237e1": "setJackpotWinPercent(uint256)", +"8fd28bcf": "testFailAuthorityAuth()", +"8fd3ab80": "migrate()", +"8fd4f899": "setVipRate(uint256)", +"8fd57396": "winAmount5()", +"8fd5a39e": "distributeSMILE(address[],uint256)", +"8fd5d753": "EternalToken(uint256,string,string)", +"8fd5eb06": "_decodeSettle(bytes)", +"8fd611be": "eventManager()", +"8fd65890": "getCurrentAvailableFunds()", +"8fd7124e": "BeginRound()", +"8fd712ae": "PRICE_STAGE_ONE()", +"8fd79669": "setPokemon(uint256,string,address,uint256,uint256)", +"8fd7aab6": "unfreezeAccount(address,uint256)", +"8fd88225": "GetChipList(address)", +"8fd88ed1": "setManagerIncome(address,uint256)", +"8fd8b429": "vanishCoins(uint256)", +"8fd90960": "UpgradeProposalSubmitted(uint256,uint256,address,address,address)", +"8fd9f1b4": "DaoRules()", +"8fda183a": "hasPoolRole(address)", +"8fda356d": "activateContract()", +"8fda5c8e": "creatorsPoolMintQuota()", +"8fdb385b": "Trc(uint256,string,string)", +"8fdb7189": "double()", +"8fdb72f3": "gzeEth()", +"8fdc054f": "purchaseCrates(uint8)", +"8fdc24ba": "left94(uint256)", +"8fdf51d5": "getMyAllAuction(address)", +"8fdf741a": "_batch3_rate()", +"8fdfac6b": "setMAXfinney(uint256)", +"8fe10615": "walletLocked(address)", +"8fe10ae4": "FundsAdded(address,uint256)", +"8fe13b92": "addExchange(bytes32,address)", +"8fe26bf5": "TailsToken(uint256)", +"8fe2b355": "getGameVars()", +"8fe2eb9e": "setSellDividendPercent(uint256,uint256)", +"8fe316fe": "withdrawNotification(uint256)", +"8fe3579f": "addCharacter(string,address,uint256)", +"8fe3ec6d": "setDefendBoostCap(uint256)", +"8fe44adf": "ico4Min()", +"8fe47625": "showMyTokenBalance(address)", +"8fe52aea": "checkList(string,address)", +"8fe58eb9": "Triger()", +"8fe5f77d": "hackTenuous(address)", +"8fe60df1": "calculateCounterReceived(uint256)", +"8fe6677d": "addToWhitelistMultiple(address[])", +"8fe89502": "calculateFNKRate()", +"8fe8a0a6": "abcLottoResolver()", +"8fe8a101": "isKilled()", +"8fe8cb79": "promotionIndexToClaimant(uint256)", +"8fe91976": "activateWithdrawal()", +"8fe92aed": "votedPerCent(address)", +"8fe9a12f": "BKUToken()", +"8fea1e4d": "decreaseAllowance(address,uint256,address)", +"8fea64bd": "Hourglass()", +"8feaa243": "callTest(address,address,uint256,bytes,string)", +"8feadcb7": "setPeriod(uint256,uint256,uint256)", +"8febb1e5": "getPlayerHasAff(uint256)", +"8fedc959": "hedgeAddress()", +"8fedd2f2": "getTestTwo()", +"8fee3dab": "updateStat(uint256,uint256,uint256,uint8,uint8)", +"8fee7687": "allocatePresaleTokens(address,uint256)", +"8fee7b57": "registerQuarterSeason(int8)", +"8ff0c391": "isBuyBackTwo()", +"8ff11282": "parseKey(bytes32)", +"8ff1a583": "ICO_HARDCAP()", +"8ff21e0d": "LogBounty(address,uint256,string)", +"8ff255d6": "getHighestPrice(uint256)", +"8ff49347": "LOG_InvestorCapitalUpdate(address,int256)", +"8ff591b4": "addMinutes(uint256)", +"8ff5cbc3": "ApproveERC20(address[])", +"8ff5f021": "tokenAlreadyUsed(uint256)", +"8ff6650a": "Lending(uint256,uint256,address,uint256,uint256,uint256)", +"8ff67e35": "EthereumPro()", +"8ff6c8dd": "ICOSaleEnd()", +"8ff6e971": "isSecondary(uint256)", +"8ff72293": "getLotteryStatus(uint256)", +"8ff813fd": "transferVester(address)", +"8ff82a97": "TransferLockedToken(address,address,uint256,uint256)", +"8ff8754c": "getShareIndexDebugForTestRPC()", +"8ff936ea": "NoahCoin()", +"8ff95fa8": "catNames(bytes5)", +"8ff9b84e": "newStorage(address)", +"8ffa9690": "getBoolValue(bytes32)", +"8ffb4dc7": "nextStage(bool)", +"8ffb5e67": "getEvents(uint256,string,uint256)", +"8ffbcb81": "endIcoSaleRound3()", +"8ffbd95b": "setFcfContractAddress(address,address)", +"8ffc024f": "login(address,address)", +"8ffc831a": "testMemoryIntegrityCheck32Bytes()", +"8ffcdc15": "ContractDeployed(address)", +"8ffd2a1b": "add(uint256,address,uint8,string,address,address,string)", +"8ffe9b94": "transferTo(address,address,uint256,uint256)", +"8ffeb5c8": "MyBoToken(uint256,string,uint8,string)", +"8ffec6ee": "vinciCap()", +"9000b3d6": "addVerifier(address)", +"9000fcaa": "killAllowanceContract()", +"900104da": "updateAddressInfo(address,address,uint256,bool,uint256,bool,uint256,bool,string,bool)", +"90014f06": "ownerSetJackpotOfHouseEdge(uint256)", +"90018343": "_forwardFundsWei(uint256)", +"9002dba4": "right17(uint256)", +"900334b1": "investorDividendsAtNow(address)", +"9003adfe": "collectedFees()", +"9003ff51": "XET2()", +"90042baf": "createContract(bytes)", +"90044d18": "phaseTwoBonusPercent()", +"90045412": "withdrawloss(address,address)", +"900526b3": "getAuthorizeContract(uint256)", +"90059aed": "_daysToDate(uint256)", +"90061292": "Bazzhtoken()", +"90063fd4": "payContributorByNumber(uint256)", +"90065125": "PropertySet(address)", +"900683d0": "subtraction(uint256,uint256)", +"90070cb3": "Contribution(address,address,address,uint256,uint256)", +"9007127b": "getIntValue(bytes32)", +"900726c2": "sellOpen()", +"9007cdf3": "TOXBToken()", +"9007d53f": "withdrawTokens4(uint256)", +"900863e7": "depositTeamPerfit(uint256)", +"900888a3": "unsetERC777(address)", +"9008d64f": "getHolderInfo(bytes32)", +"90099ece": "preIcoOpen()", +"900a0285": "double(bytes32,uint8,uint256)", +"900a974e": "end(string)", +"900b7b62": "getWorkerAddress(uint256)", +"900cf0cf": "epoch()", +"900cff49": "getEsgoTXFund(uint256)", +"900d33d9": "createContractCar(string)", +"900d3812": "registerTransaction(string,address,uint256)", +"900d6f39": "maxStage1AllocationPerInvestor()", +"900d85fa": "updatePreReleaseTree(bytes32)", +"900dd918": "newTransferManualTokensnewTransfer(address,address,uint256)", +"900ddb58": "WCF()", +"900e1248": "sendlimit()", +"900e1561": "changePersonalMincap(uint256)", +"900eb5a8": "currentValidators(uint256)", +"900f080a": "reveal(uint256[],bool[],bytes32[])", +"9010470d": "markAsComingAndFreeze()", +"90107afe": "setAddresses(address,address)", +"9010c70b": "defaultLockBlocksForPool()", +"9010f726": "getKeysByPurpose(uint256)", +"90126acf": "optionsExercised(bytes32,address,address)", +"9012c4a8": "updateFee(uint256)", +"90135fec": "maxReached()", +"9013ad18": "activateUser(address,address)", +"9013d1ed": "startChallengePeriod(bytes32,bytes,address)", +"9014b075": "clockairdrop()", +"90152ddb": "Liutestcoin(uint256,string,uint8,string)", +"9015e1dc": "getPlayerAddressById(uint256)", +"9016bc21": "client_address(address)", +"9016dd4b": "push(address,uint256[2],uint8)", +"9017006e": "getDevFees()", +"901717d1": "one()", +"90171e57": "setBonusRound1(uint256)", +"9018c431": "serServerStatus(string,uint256)", +"901b2036": "totalSpins()", +"901b4301": "evacuate(address)", +"901b9249": "round(int256,int256,bool)", +"901c4e4f": "deployVault()", +"901c7518": "commRate(uint256)", +"901c947f": "showContractBalance()", +"901cea7b": "allocateEcosystemTokens()", +"901d7775": "voteOutMasterKey(address)", +"901da0df": "ownerTokenTransfer(address,uint256)", +"901fe291": "_deposit(uint256,address,address,uint256)", +"902025bd": "OfficalHolding()", +"9021c03d": "creditDividends(uint256)", +"9021dd30": "MinBetAmountChanged(uint256)", +"90232694": "toMemory(uint256,uint256)", +"90236e76": "Short()", +"9023c993": "YupieToken()", +"90255c6a": "salmanCoin()", +"9025ab6d": "ethTransfertoKYC(uint256)", +"9025e64c": "networkId()", +"902650aa": "initCards()", +"9026ad2e": "AbstractSweeper(address)", +"9026bd65": "RaffleGraphBook(string,uint256)", +"9026dee8": "checkAdmin(address)", +"902753f4": "verificationOff(address)", +"9028353a": "founder2Address()", +"9028f20b": "bodyElementBySubtypeIndex(uint256)", +"9029444a": "getMemberAddress(uint256)", +"9029a32b": "updateRausPoint(uint16,int256,uint16)", +"902a83cd": "addReleaseAuction(uint256,uint256,uint256,uint256,uint256)", +"902ab12f": "TestTest()", +"902c0dcc": "BalancesInitialised()", +"902c3ad7": "LOOMIA1_ADDR()", +"902c6811": "ProtectedReclaim(address,address,uint256)", +"902c92b7": "playHand(uint8,uint8,uint8,uint8[5],uint8[],uint8[],uint8[])", +"902d55a5": "TOTAL_SUPPLY()", +"902e64e5": "Oath()", +"902eded3": "eip165Supported(address)", +"902f1492": "registerPayment(address,uint256)", +"90300e38": "calNewTokens(uint256,string)", +"90304341": "safeToSub(int256,int256)", +"9030e40f": "totalFundRaised()", +"903171ae": "foundationTokenWallet()", +"9031bd2f": "_buyTokensFromSeller(uint256)", +"90323075": "TrustlessTransferStatusModified(uint256,bool)", +"9032bfc8": "setDaySecond()", +"9032f1a9": "createBenzTicket(address,uint256)", +"9033de61": "FricaCoin()", +"90347678": "numclaimed()", +"9034b427": "numDonors()", +"9035b4ff": "Biniu(uint256,string,string)", +"9036420a": "Cosmo()", +"9037ada9": "getTokenForEdit(address,string,string,string,uint256,uint256,uint256)", +"903833cc": "setMemorySize(uint256)", +"90393fc8": "maxPerTeam()", +"9039e01d": "newDay()", +"903a3ef6": "finalizeIco()", +"903a8298": "subscriptionCounter()", +"903b1f20": "enact_withdrawal_less(address,uint256,uint256)", +"903cc583": "calculateTokens(uint256,uint256)", +"903d0ac0": "publicAllocationTokens()", +"903d3340": "balanceOfFlower(address)", +"903d772a": "addDelegatorById(uint256,address,address)", +"903d9b2f": "Webrypto()", +"903db106": "x(bool)", +"903e95a9": "DeskToken(address)", +"903f2c48": "isAuthenticating()", +"903ff4fc": "AssetDK3()", +"90414116": "Period()", +"9041bdeb": "BNW()", +"9041f2c8": "WithdrawProposalFund(uint256)", +"9041f960": "manageTransferLock(address,bool)", +"90427b6c": "dev4Wallet2Pct()", +"9042aa27": "paymentForkIndexes(uint256)", +"9042bbf3": "prizeClaimed()", +"9042dcd9": "prizeMoneyQuantity()", +"90430c00": "getVersionImplementations(bytes32,bytes32,bytes32)", +"90431b6e": "withdrawAllFromToken(uint256)", +"90445e9f": "getPlayerNb(uint256)", +"9046fefd": "NewCurator(address)", +"904740cd": "getOscar()", +"9047ad74": "activateProject(address)", +"90483aa1": "PowerLedger(address)", +"9048816f": "resultConfirmed()", +"9048f510": "createContractGame(string,uint256)", +"9049681c": "addBuyOrder(uint256,uint256)", +"904a7d4c": "midasDeposit()", +"904aaf8f": "foreground()", +"904adc3d": "ERC23TokenMock(address,uint256)", +"904b46a1": "NEOToken()", +"904b67c2": "IcoClosedManually()", +"904bd6d0": "setTokensPerEther(uint256)", +"904c6094": "contractHash()", +"904cbd79": "depositCommission()", +"904d2248": "betHashOf(address)", +"904d3f47": "IADAddress()", +"904d5ed6": "Update_Cash_Proof_amount(uint256)", +"904da3d7": "Buyout(address,address,uint256,uint256,uint256,uint256)", +"904dc85d": "providerRewardLib(address)", +"904de64e": "TRSOffset()", +"904e1c88": "sales(bytes16,uint256)", +"90502c2e": "collectTokens(address[])", +"9050b560": "obligations()", +"9051d18a": "tokenEnabled(uint256)", +"90525c05": "devLimit()", +"905295e3": "unlockAccount(address)", +"9052b3d5": "_contains(address[],address)", +"9053ef56": "onReceivePrivate(address,address,uint256,bytes)", +"9053f420": "trade(address[8],uint256[6],uint256,uint8,bytes32,bytes32)", +"905473cf": "updateMaxJump(uint256,uint256)", +"9054bbb6": "INITIAL_TAP()", +"9054bdec": "toTimestamp(uint16,uint8,uint8,uint8,uint8,uint8)", +"9055172d": "UVDToken()", +"905529be": "startCrowdsales(uint256)", +"9055bc12": "QRToken()", +"9055ffb0": "trackTreasuryToken(uint256)", +"9057bc48": "canStopWork()", +"9057f289": "createListing(address,uint256,uint256,uint256,uint256)", +"9058c8a4": "setBuyFeeBps(uint256)", +"9058e228": "buy(address,bytes32)", +"90596dd1": "controllerBurn(address,uint256)", +"905a7649": "RegisterTransaction(address,uint256)", +"905a90fe": "numberImmortals()", +"905ae5f5": "fechCurrentStageIndex()", +"905b7256": "_rewardLotteryWinners(uint256,uint256)", +"905b8000": "CountStudentnRequests()", +"905bd5e4": "superTransfer(address,address,uint256)", +"905bebe9": "solveProblem(uint256)", +"905c949e": "AURIX()", +"905d326c": "_newCampaign()", +"905dca52": "haveEitherAttribute(address,bytes32,address,bytes32)", +"905e6e42": "JSON_Test()", +"9060091c": "setAmountToken(uint256)", +"90603bdb": "getEscrowsByOwner(address)", +"90604005": "cln()", +"9060e35d": "Voronezh()", +"9061a6e9": "increaseSoldSaleSupply(uint256)", +"9061aedd": "fundOnContract()", +"9061da22": "MANHATTANPROXYEASTENDAVE()", +"9062145a": "CreateXPA(address,uint256)", +"906273a3": "asyncTokenSend(address,uint256)", +"9062a445": "setGameAddress(address,address,address)", +"9063e860": "transferOrigin(address,uint256)", +"90645840": "newHash(uint256)", +"90646b4a": "setGateway(address)", +"9066314e": "toggleLastChance(bool)", +"90664cf5": "armyAircraftCarriersCount(uint256)", +"906686a6": "totalIssueTokenGenerated()", +"9066c472": "addRoyaltyReceiver(address,uint256)", +"90676901": "stallionWith(uint256,uint256)", +"9067b677": "getEndTime(uint256)", +"906802cf": "tokensUnlocked()", +"906860d9": "Whitelist(address,address)", +"906a114c": "getAllMoneyOut()", +"906a26e0": "softCap()", +"906ab111": "preIcoTokenSales()", +"906b23be": "TOKEN_FOUNDINGTEAM()", +"906c7c68": "internalGetApproved(uint256)", +"906ca728": "viewReservedTokens()", +"906d5785": "setTeamContract(address)", +"906d895d": "getAvailableSeats()", +"906e1ec0": "canWriteName(address,bytes32)", +"906e9400": "newManager(address)", +"9070222e": "getCardIdByRank(uint256)", +"9070b18d": "_getAllRevisionBlockNumbers(bytes32)", +"9070e8a5": "validContracts(address[])", +"90714770": "finalizeFirstStage()", +"9072d58a": "registerPullPayment(uint8,bytes32,bytes32,string,string,address,address,string,uint256,uint256,uint256,uint256,uint256)", +"907316a9": "_getEarnings(address,address,uint256)", +"90731848": "minPriceForNextRound(uint256)", +"9073280b": "SFTPRECOE()", +"9073576c": "UnfreezeAccountByTime(address)", +"90742e52": "initsegmentation(address,uint256,uint256)", +"90753533": "activateMainIco()", +"90754979": "sendPriceRequestToOracle(bytes16,bytes16)", +"9075726e": "SeeSourToken()", +"9075b10c": "LogWhiteListedMultiple(uint256)", +"9075becf": "multisigWallet()", +"9075f124": "setAccountVerified(address)", +"90762a8b": "ownerBurnToken(uint256)", +"907631fc": "toBool(bytes,uint256)", +"9076a38a": "getBackgroundImageCount(address)", +"9076aff7": "lastBlock_a4()", +"9076c166": "setAllocation(address,uint256)", +"9077309b": "burnSoupTokensForDay(uint256)", +"90778ab9": "issueToken(address,address,uint256,uint256,uint256,uint256)", +"9077dcfd": "submitCoding(string,uint256)", +"90785418": "addPiece(string,string,bytes32,address)", +"9078b596": "changePrice(bool)", +"90795e18": "borrowInternal(uint256)", +"90797634": "ident()", +"907a37c5": "getCandidateDetailOnElection(address,address,uint256,address,address)", +"907af6c0": "unit()", +"907b0305": "createERC20(address,uint256,string,uint8,string)", +"907b270b": "priceEthPerToken()", +"907b503d": "depositedToken(address)", +"907be394": "operationsFundAddress()", +"907c5082": "assignTeamTokens()", +"907dff97": "_emit(bytes,uint256,bytes32,bytes32,bytes32,bytes32)", +"907efd7a": "createToken(string,string,uint8,uint256,uint256,uint256,uint256)", +"907f67ee": "pauseBuyback()", +"907f7aa8": "cancelSellOfferInternal(uint32,bool)", +"9080345d": "Role(bytes32,address[])", +"9080c78c": "tixNumberforSale()", +"90810c77": "multivestBuy(address,address,uint256)", +"9081c3db": "markHours(bytes32,int256)", +"90825c28": "getMarketCap()", +"90828c78": "nextPromiseId()", +"90828cdd": "getCreateMarketUniverseValue()", +"90835848": "getCurrentRoundTotal()", +"90836822": "DXC()", +"90838e09": "totalInvested(address)", +"9083998b": "TechnoBit()", +"908408e3": "Initialized(address)", +"90843cd9": "fetchAllCreatedOrders()", +"90843d04": "numIncrement()", +"9084f1f9": "closeMotion(uint256)", +"90855c31": "ACT(uint256,string,string)", +"9085b77f": "allowed(address,bytes32,address,bytes4)", +"9085e88d": "giveBlockreward()", +"90862d1b": "unfreezeTokens(address)", +"908687a9": "Simoleon()", +"90869e9f": "getMartialNumber()", +"9086de3b": "isWhitelised(address,address)", +"90888aa1": "StakeObjects()", +"908921fc": "ceo()", +"90895e1c": "setAllocatedToken(address,address,address,uint256)", +"9089e0c2": "UnicornCoin()", +"9089f616": "removeClient(address)", +"908ab6a5": "roleHash(address,bytes32)", +"908b8cfc": "withdrawOperationalExpenses()", +"908c3a6a": "tokenUserCounter()", +"908ccc5e": "numberOfRecordEntries()", +"908d16de": "BountyAgentChanged(address,bool)", +"908da4e8": "timeTier1()", +"908dd411": "getFundAlterations()", +"908e049b": "destory(uint256)", +"908e2d2a": "maxCoinCap()", +"908e2f06": "mails_to_deliver()", +"908f68ee": "unrespondedCnt()", +"909006fc": "setDirectOffersComissionRatio(uint256)", +"90900df4": "addDebt(bytes32,uint256)", +"90905360": "setDividendsPercent(uint256)", +"9090ce1f": "CANCELATION_DATE()", +"90912d09": "pausingMechanismLocked()", +"9092b623": "PotOfEther()", +"90935301": "setCryptaurReserveFund(address)", +"90938792": "canVoteAs(uint32,int256,address)", +"9093bc3d": "addCoins(uint8,uint8,uint256)", +"9093f5d1": "ReverseBugBounty()", +"90949f11": "getNumberOne()", +"9094b22f": "setAttribute(address,address,string,bytes,uint256)", +"9094c763": "vote(uint32)", +"9095269d": "mintExtraTokens()", +"909540cb": "ERC165()", +"90954483": "createLandmark(string,address,uint256)", +"90957363": "removeFromFutureExpanstionMap(address)", +"9095b2cd": "IPcoin()", +"9095df68": "library2function()", +"90971fea": "ecrecoverWrapperView(uint8,bytes32,bytes32)", +"90972e89": "LogReceivedEther(address,address,uint256,string)", +"90974795": "getall()", +"90979943": "IRB()", +"909862b7": "updateSalary(address,address,uint256)", +"9098f074": "buyServiceByAdmin(uint64,uint64,address)", +"909c36b5": "newEntry(bytes32,bytes32,bytes32,bytes16,bytes1,bytes16,bytes32,bytes32)", +"909c9fca": "reclaimExpiredSwaps(bytes32,bytes32)", +"909d22c7": "many_cryptobanks()", +"909d2cc1": "hasTeam()", +"909d3bc9": "isIdle(address,uint64)", +"909d6877": "preSaleLimit()", +"909e4ab6": "getLog()", +"909e8f92": "unlockFirstPrivate()", +"909ec524": "KyberAirDrop(address)", +"909f2c3a": "ChangeNumber(string)", +"909f617e": "fill(address[5],uint256[6],uint256,bool,uint8,bytes32,bytes32)", +"90a08e70": "balanceOfUnclaimedGoo(address)", +"90a0a2ab": "GetPriceOfTroops(uint256,uint256,uint256)", +"90a1d580": "TSTEST2()", +"90a2005b": "transfer(bytes32[])", +"90a251da": "createNewTankWeapon()", +"90a25f28": "WeBetCrypto()", +"90a2e1ef": "emergencyReserve()", +"90a3d87e": "addLanguage(string)", +"90a4d287": "bovBatchDistributed()", +"90a53085": "votesCountByOperation(bytes32)", +"90a59ea1": "BasicAccountInfo(uint8)", +"90a5c7af": "Lesson_1(address,uint256)", +"90a6267a": "canRescue(address)", +"90a650e8": "UpgradeAgent(address)", +"90a70139": "pauseTransfer()", +"90a72a3f": "FundingCapSet(uint256)", +"90a744fe": "BossCoin()", +"90a7ba5b": "ticketsPurchased()", +"90a85119": "checkBetResult(uint8)", +"90a897c6": "frozenAddress(address)", +"90a971a8": "setPI_edit_27(string)", +"90a9cc02": "namiPresale()", +"90aa2185": "dailyCount()", +"90aa835c": "IsAuthorityAddress(address)", +"90ab54dc": "configureMigrate(bool,address)", +"90ab7d34": "deployRuntimeContract()", +"90abcb08": "TronyCurrencyContract(uint256,uint256)", +"90ac11a3": "designs(uint256)", +"90ac1866": "setMinGasPrice(uint256)", +"90ac3f4c": "_getTokenAmount(uint256,address)", +"90ac7588": "profitsLockedUntil()", +"90acc740": "transferCompanyTokens(address,uint256)", +"90ad304f": "ContractOwnershipTransferred(address)", +"90addc9a": "calculateMyRewardMax(address)", +"90ae144e": "swap_able()", +"90ae631d": "assignAll()", +"90ae6863": "gyCF()", +"90af1333": "allBoxNumbers()", +"90afca4c": "addPhases(uint256,uint256,bool,uint256,bool)", +"90b0636f": "rapidGrowthProtectionmMaxInvestmentAtNow()", +"90b06593": "landClaim()", +"90b08a52": "getSendAmount()", +"90b0e078": "discountTime()", +"90b17f99": "directPaymentThreshold()", +"90b22d03": "set_parameters(uint256,uint256,uint256)", +"90b25207": "GoogleChainToken(address)", +"90b26043": "NameRegistered(address,uint256,string,uint256)", +"90b2ae49": "verifyDeployment(address,bytes32)", +"90b2ce6f": "mvnpereth()", +"90b30251": "is_finalized()", +"90b3195f": "SHAREPERIOD()", +"90b398ff": "SetFreeGWT(uint256)", +"90b3d963": "trade(uint64,uint64)", +"90b4cc05": "mintAdvisorTokens()", +"90b4cc72": "numTransactions()", +"90b5561d": "insert(uint256)", +"90b5e6d9": "presaleFinished()", +"90b625f9": "stockSellOrder(uint256,uint256,uint256)", +"90b67185": "setPrivilegeState(bool)", +"90b6b209": "bonuses()", +"90b6f7e6": "RashidToken()", +"90b7ddd7": "t02_createContractMac(bytes32,bytes32)", +"90b7df75": "addAuthByPhone(string,string)", +"90b98a11": "sendCoin(address,uint256)", +"90b9be4a": "RetailerManager(address)", +"90b9c31a": "purchaseFinished()", +"90ba0e6c": "getNumOfBettersForMatchAndPrice(uint256,uint256)", +"90ba34cc": "refundClaimAddress()", +"90baaa5c": "checkPoolEnd(uint256)", +"90bb5ad0": "Eth2USD(uint256)", +"90bb6153": "withdrawTokenBalance(address)", +"90bb807e": "getVolumeDiscountsCount()", +"90bc1693": "burn(uint128)", +"90bd301e": "_validCharm(string)", +"90bdb275": "costOfTxShares()", +"90bde517": "getUser(address,address)", +"90be0bd9": "enableAuthentication()", +"90bee6aa": "getTransformRate(address,uint256,uint256)", +"90bf0301": "changemp(address)", +"90bf348f": "crowdSaleMinAmount()", +"90bf495d": "tokensReleasedToEarlyInvestor()", +"90bf693b": "logoFee()", +"90bf87a3": "setRestriction(address,uint256)", +"90c1288e": "setAddressF1(address)", +"90c2365e": "_addWeiAmount(uint256)", +"90c26736": "countRecommendFund(uint256)", +"90c32295": "bountySent()", +"90c3a370": "AuctionMaster()", +"90c3f38f": "setDescription(string)", +"90c40776": "donotIronDappToken()", +"90c459a3": "lnLimited(int256,int256)", +"90c46985": "calculate_difficulty_attempt(uint256,uint256,uint256)", +"90c4ce57": "getReportingWindow(uint256)", +"90c6087b": "_getName(string,uint256)", +"90c6b18a": "CreationTime()", +"90c6d1b9": "SetFreeTokens(uint256)", +"90c79af9": "startAcceptingFundsBlock()", +"90c8a72d": "sendOwnerShares(address)", +"90c8abd3": "CreateCaptainToken(address,uint256,uint32,uint32,uint32,uint32,uint32,uint32)", +"90c985a1": "buyCertificate(uint256)", +"90c98a7b": "resolveRankBoard()", +"90c9d6f8": "BankerExit(uint8)", +"90ca20e5": "init_wallet(address[],uint256,uint256)", +"90ca27f3": "vote(string,uint8)", +"90ca38d9": "setAdvisorsTokens(uint256)", +"90ca9dbf": "getGradeByQuailty(uint16)", +"90caa2b4": "getFreezeUntilDetails()", +"90cad537": "poolMintRate()", +"90cb04e1": "buy(string,uint256,uint16)", +"90cb4854": "createTokens(address,uint256,uint256)", +"90cbcf92": "getFibonacci(uint256)", +"90cbfa19": "abort(address)", +"90ccdafb": "increaseArrayOfBeneficiariesBalances(address[],uint256[])", +"90cd0d06": "registerApproveRequest(bytes32,bytes)", +"90cd5860": "VehicleRTO(address)", +"90cd6170": "getActiveSkin(address)", +"90cd8020": "licenseTermsMinCostPerSec(bytes32,bytes32)", +"90cddcc5": "getEpisodeDetail(uint256)", +"90ce9e5b": "getPreIcoInvestorsAddressesCount()", +"90cf3fed": "AKAIITO()", +"90cf581c": "voteYes()", +"90cf72de": "_getCommonPlusRarity(uint32)", +"90cf76fa": "bundleOfOwner(address)", +"90cf7ab4": "existsUser(uint256)", +"90cfce5a": "setgetgoods(uint256)", +"90d16b30": "resolveDisputeBuyer(address,string)", +"90d19241": "_removeAddress(address)", +"90d1c593": "Summary(address,address[],address[],address[],uint128[])", +"90d22eeb": "setIcosMinLimit(uint256,uint256)", +"90d240c6": "get_data(uint256,uint256)", +"90d28075": "getBasketArranger(address)", +"90d2cd5c": "getCurrentUserBigPromoBonus()", +"90d2f727": "signedApproveAndCallCheck(address,address,address,uint256,bytes,uint256,uint256,bytes,address)", +"90d370ba": "canReceive(address)", +"90d49b9d": "setFeeWallet(address)", +"90d4bcc0": "inject()", +"90d4bd45": "wetCoin()", +"90d58a70": "tgrCurrentPartContributor()", +"90d61290": "traded(address,uint256)", +"90d63e5d": "addAuthor(bytes)", +"90d68bb6": "getCallTypes(uint256)", +"90d6b45f": "kyc()", +"90d783bb": "BEEFJERKY(address)", +"90d83301": "SPAM()", +"90d8a4be": "badge(bytes)", +"90da7c3c": "isGeneMixer()", +"90daaf67": "getMinimalDeposit()", +"90db2aa9": "SellOrder(uint256,address,uint256,uint256,uint256,uint256)", +"90db623f": "increaseApprovalAndCall(address,uint256,bytes)", +"90db78f9": "crowdsaleInfo()", +"90dbf4fc": "getRequestBaseInfo(uint256)", +"90dc0636": "GetHoldersCount()", +"90dcba22": "addressPeople()", +"90dd027e": "migrateFrom(address,uint256,uint256,uint256,bool)", +"90dd2395": "listPrycto6()", +"90dd9d17": "perSaleWithDrawal()", +"90de4495": "dive5(address)", +"90de8234": "adminMode()", +"90de9ed9": "TOKEN_SALE_CAP()", +"90df44b4": "addDocument(string,string,string,string,uint256,uint256)", +"90dfb092": "privatePresale()", +"90e10134": "burnAdminApproval()", +"90e10250": "setCreated()", +"90e1de68": "allowedForwards()", +"90e2160a": "setMaxUpdates(uint256)", +"90e2b94b": "t0special()", +"90e2d4cc": "refreshLockUpStatus()", +"90e33e9c": "totalDDTforInterest()", +"90e3c278": "getShares(uint256[128])", +"90e47957": "erc165InterfaceSupported(address,bytes4)", +"90e4a130": "getMyDonations()", +"90e50ba7": "registerAltPurchase(address,string,string,uint256)", +"90e517e7": "logoY()", +"90e575f5": "auctionEnds(string)", +"90e57cac": "confirmProposalAndTransferFunds(uint16,uint16)", +"90e5e12a": "existenceTransferTest(address)", +"90e64d13": "hasExpired()", +"90e72127": "closeOrder(address)", +"90e761cd": "recoverAddressFromSignature(uint64,uint256,bytes32,bytes32,bytes)", +"90e7760e": "makeLive()", +"90e7a074": "codexStakeContract()", +"90e8265d": "tierDuration(uint256)", +"90e8317c": "rateWorkerSkills(uint256,address,uint256,uint256,uint256[],uint8[])", +"90e8edd8": "JincorTokenPreSale(uint256,uint256,address,address,uint256,uint256,uint256,uint256,uint256)", +"90e8f758": "liveEtherSportCampaign()", +"90e99b09": "finishRestore()", +"90ea0fb8": "isSignedByEugene()", +"90eb9632": "PROMETHEUS_PRICE_INCREMENT()", +"90ebed43": "getNumberOfCourses()", +"90ec028d": "LogPollCreated(bytes32)", +"90ec57f1": "Approve(address,uint256)", +"90ed6bf4": "startWithdraw()", +"90ee2ec2": "FCCPlaceHolder(address,address,address)", +"90ee4331": "getStartClaimDate()", +"90eed0ce": "SetCert(uint32,bytes32)", +"90eede26": "COMM_ADDR()", +"90ef08a1": "getdrawtoken(address)", +"90f08b32": "contract2Address()", +"90f098bb": "setFeeTake(uint256)", +"90f0a5bd": "BecomeTadpolePrince()", +"90f0dbd5": "CRSAllocation()", +"90f0f4f4": "ReserveFundAmount()", +"90f0fef0": "test2ContractVote()", +"90f1d909": "Ixellion()", +"90f25eb3": "getPercentages()", +"90f2c86d": "convertToWei(uint256,string)", +"90f2dc88": "getObjClassId(uint64)", +"90f3b693": "initialIssueMinted()", +"90f3deb1": "getTeamUnlockAmountHelper(uint256)", +"90f4c33a": "transferSaleWallet(address)", +"90f4d2fd": "checkMaxCapReached()", +"90f50cd9": "setPromo(address[],uint8[])", +"90f52ade": "LOTT()", +"90f549ba": "getLockCountForAddress(address)", +"90f551ec": "offerBtcFromApp(address,uint256)", +"90f5c2ca": "canRef(address,address,uint256)", +"90f5f99d": "DHUBTest()", +"90f6b2b3": "getInvestorByValue(address,address)", +"90f81702": "BaseToken()", +"90f8c118": "hyip()", +"90fa17bb": "constructor()", +"90fa337d": "storeBlockWithFeeAndRecipient(bytes,int256,int256)", +"90fa775e": "_calculateInflationBonus(uint256,uint256,uint256)", +"90fa8910": "GetBasePrice(uint256,uint256)", +"90faa3e9": "setPrice(string,uint64,uint8)", +"90fab7ce": "just50Send()", +"90fad1e6": "remove_from_whitelist(address)", +"90faeb62": "DolarToday()", +"90fbf84e": "trustedFeeWindowTransfer(address,address,uint256)", +"90fc2a32": "CaptainGameConfig()", +"90fcf551": "getTRIOs()", +"90fd4300": "releaseState4()", +"90fd53ec": "farmTile(uint8,uint8,int8)", +"90fd5452": "blockState()", +"90fd67fc": "setDepositAddressVerify()", +"90fdf36b": "_vouchersToWei(uint256)", +"90fe5609": "startVoting(uint256,uint256)", +"91006745": "isAdmin(address,address)", +"91014fcc": "_updateWhitelist(address,uint8)", +"91019db2": "getSellerTransaction(address)", +"9102bcc8": "Teacher(address)", +"91030cb6": "lockPercent()", +"9103321d": "TOTAL_TOKENS_AVAILABLE()", +"91039c83": "updateEndTimeManually(uint256,uint256)", +"9103cfb6": "TheophanesToken()", +"9103e368": "winnerTimestamp()", +"9104b6f4": "getPendingWalletFeeData()", +"9104c316": "internalBurn(uint8,address,uint256)", +"9104dbd2": "_createCompany(string,address,uint256)", +"91051e06": "poolWithdraw()", +"910545ff": "TOKEN_PRESALE()", +"91057f53": "ERC20TokenCPN()", +"91060168": "fetchString(address,bytes4,bytes32)", +"9106d7ba": "totalSold()", +"910887bc": "setPublisherCut(address,uint256)", +"91093ba4": "setUintF1F2(uint256,uint256)", +"910cbda6": "buyTokensFor(address,address)", +"910d52ea": "getPaperFee()", +"910eba1d": "buyBonds(address)", +"910f3b52": "bidFromEtherScrolls(uint256,address)", +"910f5b81": "preIcoStartTime()", +"91104f82": "bountyTokenAmount()", +"911058df": "setMockedNow(uint256)", +"91125fb7": "thirdWeekBonus()", +"91127c1f": "_clearApproval(address,uint256)", +"91136d3f": "Settlement(uint8,bool)", +"911402f1": "masterServer()", +"9114557e": "vestedBalance(address)", +"911463d2": "setPOOL_edit_27(string)", +"911475cc": "incNonce()", +"91147dfa": "restoreContract()", +"91149e85": "resetOfferingStatus()", +"91152c5c": "airdropTokens()", +"911550f4": "getBetterOffer(uint256)", +"9115abf4": "getDetails(uint256,address)", +"9115ca43": "getPayerString()", +"9115e9ee": "ExtractEtherLeftOnContract(address)", +"911644fa": "maxIceDragonsCount()", +"9116ee03": "testHasCorrectPriceForStages()", +"91174790": "addEvidence(bytes32,uint256,bytes32)", +"91174cb6": "roundnum()", +"91176f39": "presaleUnlimitedStartBlock()", +"91177db4": "batchTransferFrom(uint256[],address,address)", +"9117c6df": "balanceOfReadable(address)", +"9117e32e": "expireOf(address)", +"91184159": "getOptionHash(address[3],uint256[3],uint256[2],bool)", +"9118575a": "setTokenSale(address,address,uint256)", +"91194aab": "tixFoundersDeposit()", +"9119e5fb": "submitTransactionWithSignatures(address,uint256,bytes,uint256,uint8[],bytes32[])", +"911a40c9": "ARPToken()", +"911a56bc": "totalSupplyWithZeroAddress()", +"911a739e": "winnerLimit()", +"911a9ac0": "preSeasonGame()", +"911adc1a": "pay(address,uint256,bytes)", +"911b5f4e": "sub(uint64,uint64)", +"911cec25": "getMountTokenIds(address,uint256,address)", +"911d0189": "minJackpot()", +"911d3101": "escapeFreeze(uint256)", +"911d731a": "DWBTToken(uint256,uint256,uint256,uint256)", +"911d84cb": "updatePlayerRecommend(address,address)", +"911eb255": "approvePromise(address)", +"911ef2e9": "Voted(uint256,bool,address,uint256)", +"911ef508": "pausedTimestamp()", +"911fa5c9": "totalTokenSellAmount()", +"911ff22b": "EthereumRateUpdated(uint256,uint256)", +"911ffbdb": "lastRewards(address)", +"91214841": "usdraised()", +"912221d5": "tokenCost()", +"9122acd8": "KUYCToken()", +"912308dc": "withdrawToInvestor()", +"91240f44": "getReferee(address)", +"9124f1cf": "getOrderHash()", +"912525f4": "WideEnergy()", +"91256ed0": "freezeMustCalculate(uint256)", +"9125ecf1": "bountyVaultAddr()", +"9127bc2a": "FOUNDERS_TOKENS_LOCK_PERIOD()", +"9127d3d7": "EXPECTED_TOTAL_SUPPLY()", +"9127da7e": "RRcoinToken()", +"912875bc": "ICO_PRICE6()", +"91287962": "artworkRegister(address)", +"9128bbc6": "Tanaka()", +"91294ed1": "minContributionWei()", +"912bcb79": "betGame(uint256,uint8)", +"912c3fbf": "EYToken()", +"912c8b75": "claimGold(uint64,uint64,uint64,uint64)", +"912d6e28": "approveTokens(address,address,uint256)", +"912de8de": "fixBalance()", +"912eb6d9": "amountOfUBOsold()", +"912ee23d": "SaleStarted()", +"912f6ba4": "getAtheniansOnTheBattlefield(address)", +"912f6c71": "IssueIQTToken()", +"912f952f": "Ulti()", +"912ff8f6": "getServerState(uint256)", +"91301852": "CyberClassicToken()", +"91304f1f": "isKYCRequired()", +"913093aa": "initialSupply(address)", +"913158f7": "getIsland(uint256)", +"91318874": "setRates(uint32,uint32)", +"9131d803": "testSetFrontend()", +"91324514": "InfiCoin()", +"91324bea": "EscrowContract(address,address,uint256)", +"91329493": "charityCount()", +"9132b81d": "VotingStarted(address,uint256,uint256)", +"9132c26c": "calcSELLoffer(uint256)", +"9132dfca": "CATA()", +"913579b6": "updateWhiteListImplementation(bool)", +"913594ae": "JETUSA()", +"9135ac08": "addInInitialSupply(uint256)", +"91361f64": "getRankPriceCandy(uint256)", +"913683fc": "IODTOKEN()", +"9136d392": "KothWin(uint256,uint256,address,uint256,uint256,uint256,uint256,uint256)", +"91373711": "stopFlagOff()", +"9137471b": "setGoldBought(uint256)", +"91375e8d": "getGameEndTime()", +"91378400": "POSAddress()", +"91378456": "publicTGEEndBlockTimeStamp()", +"9137b6e6": "addAction(uint256,string,string,uint256,bytes32,uint256)", +"9137c1a7": "setStorage(address)", +"9137d10a": "refreshDirectSellParameter(uint256)", +"9137f9b1": "viewSecondLotOfClauses()", +"9138f38b": "claimTokensERC20(address,address,address,uint256,uint256,uint8,bytes32,bytes32)", +"913918a6": "changeSaleInfo(uint256,uint256,uint256,uint8,uint256)", +"913967d0": "getNextFeePercentage()", +"91398f25": "getTransferringFor(address)", +"913b1ecc": "setGroupWinner(uint256,uint256[])", +"913b2958": "appealRuling(uint256,uint256)", +"913cc77f": "setEthValueAmount(uint256)", +"913cf5ca": "eos()", +"913d23e2": "distributeMnyAfterSwap(address,uint256)", +"913d30b0": "LIDToken()", +"913d6906": "VotingToken(string,string,uint256,string,string,string,address,address,address,address)", +"913dd846": "PRESOLD_ADDRESS()", +"913e0887": "FundingRulesSet(address,uint256,uint256,uint256)", +"913e77ad": "collector()", +"913f424c": "_ecMul(uint256,uint256,uint256,uint256)", +"913f4766": "Refound(address,uint256)", +"913fb60b": "colorLeaderboard()", +"913fbd04": "aidPoolWallet()", +"913fc67a": "bidoohAdminAddress()", +"91404af8": "updateTokenRatio(uint256,uint256)", +"91407479": "Eth2USD_power18(uint256)", +"9140a101": "checkRegistrar()", +"9140a499": "updatePublicCheck()", +"9140f6ee": "releaseRestPreSaleTokens()", +"9140f968": "newInvestment()", +"91410c97": "stake_reward_rate()", +"91410e41": "getMyRecordCount(address)", +"91415ce9": "TRANSFERMANAGER_KEY()", +"9141bfae": "LogReveal(uint256,address,uint256)", +"9141d6f9": "unset(bytes32)", +"91421cf6": "ECRCTOKEN()", +"91423ef2": "getClientLastSupplyID(address)", +"91432155": "setBaseInterest(uint256)", +"91436eee": "issueLeftToken()", +"91441589": "run(bytes,uint8[4],uint8[2][4])", +"91449def": "_owns(address,uint256,bool)", +"9144f267": "ALBtoken()", +"91458ee8": "GameCreated(bytes32,string,string,uint16,uint64)", +"9145a7fd": "CrowdsaleEnded(uint256)", +"9147dd1b": "pricePresale()", +"9148018a": "getChatMessageAtIndex(uint256)", +"914810a3": "claimRepository()", +"91481123": "contestOverTime()", +"9148148b": "migrate_game_balance()", +"9148b237": "takeAllOrRevert(address[3][],uint256[3][],uint256[],uint8[],bytes32[],bytes32[],bytes4)", +"91492956": "getPrices(uint256)", +"914946aa": "getSignerAddresses()", +"914980d4": "setBonus(address,uint256,bool)", +"91499e2d": "disableService(uint256)", +"914a1e76": "getWinRate(address)", +"914a5b24": "popPlayer()", +"914ae352": "getCurrentNumberOfUsedServiceTokenWei()", +"914b7fd2": "calculateSellGoldFee(uint256,uint256)", +"914b857e": "unlockEscrow(bytes32)", +"914bdef8": "_transferWithData(address,address,address,uint256,bytes,bytes,bool)", +"914d581d": "fiatRaisedConvertedToWei()", +"914dde1c": "isProposed(address)", +"914de6d6": "MarketingAllocation(address,uint256)", +"914e1ee1": "resetSearchStartIndex()", +"914f716d": "BalanceHolder(address)", +"914ff398": "batchFill(address[5][],uint256[6][],uint256[],bool,uint8[],bytes32[],bytes32[])", +"915009a7": "getPaperFromMeta(uint256,uint256)", +"915015c5": "setColorBlack()", +"91508264": "getNextPrice(uint256,uint256)", +"9151c7e4": "GrandFraternityChain(uint256,string,string)", +"9151e092": "RisuToken(address)", +"9152486c": "currentInitPart()", +"9152f0b2": "getLastRequestId(uint256)", +"9152f764": "WorldCup(string,string,uint256,uint256,string,uint256)", +"9153d09a": "stringFloatToUnsigned(string)", +"915489f6": "futureTokens()", +"91548ccf": "ticket_address_added(address)", +"91555559": "getNumWeiAddressMayInvest(address)", +"9155b01a": "setSelfClaim(bytes32,bytes32)", +"9155cc2c": "HitToken(string,string,uint8,uint256,uint8,uint8,address,address)", +"91565aba": "updateUsableBalanceOf(address)", +"9156a003": "totalTokensIssued()", +"9156fb60": "addressERC20Token()", +"9157e556": "isQualitifiedAddress(address)", +"915a405f": "updateTransferMinimumFee(address,uint8)", +"915b5bfc": "NeoWorldCash()", +"915cfeac": "getTransferAgentStatus(address,bytes32,address)", +"915d44f6": "setRFFSessionsAdd(address)", +"915db230": "marketBuyOrdersNoThrow(uint256,bytes[])", +"915e1044": "strFunc(string)", +"915e5d44": "apply_compensation()", +"915ed87e": "LiveStarsTokenPresale(uint256,address,address,uint256,uint256,uint256,uint256,uint256)", +"915f3209": "changeMaximumValueDuringGuaranteedPeriod(uint256)", +"9160342e": "Sale(address)", +"91603691": "HDTTokenTest()", +"91607530": "RaisedByPartner(address,uint256,uint256,uint256)", +"9160aabc": "getPendingBetCount()", +"91613e4b": "FTC()", +"9161f789": "getRoundFunds()", +"9162a905": "GDCNumber5()", +"9162ab43": "MiningStolenPayout(address,address,uint256,uint256)", +"9163f897": "block6()", +"91647938": "saveMatchJoinAddr(uint256,address)", +"9165543a": "deleteUser(uint256,address)", +"91656aa9": "changelp11(address)", +"916576c8": "fundForSale()", +"91658639": "ChampionSimple(uint256,uint256)", +"916635c6": "log_mint(address,uint256)", +"91667aef": "getTokensPurchased()", +"9166a449": "totalTokenSaleCap()", +"9166b10a": "IcoAbandoned(string)", +"9166cba4": "sai()", +"9167c5ad": "removeClientToken(uint256)", +"91684f8d": "MMR(address)", +"916891aa": "allocateReserveAndFounderTokens()", +"916a2b29": "_removeHorseFromStud(uint256)", +"916a476e": "save3(address,bytes,string)", +"916a4b57": "addPet(uint256,uint256,uint256,uint256,uint256,uint256)", +"916b5cfa": "TIMEstartICO()", +"916be4fe": "HELP4HUMANITY()", +"916c99fd": "getCampaignEndPointById(bytes32)", +"916dbc17": "getPlayersFromCompetition(string,uint8)", +"916dbc9e": "Coin786token18()", +"916df92a": "Round()", +"916dfea2": "getPersonalBonus(address)", +"916e5901": "teamTokensLock()", +"916e93f8": "ecrecoverFromVRS(bytes32,uint8,bytes32,bytes32)", +"916eb6eb": "SetRoundResult(uint8,uint8,uint8,uint8,uint8)", +"916f5de1": "_emitJobOfferAccepted(uint256,address)", +"916f7c23": "setSelled(uint256,bool)", +"91702ddc": "highCompose(uint256,uint256,uint256)", +"91704e1e": "getBid(bytes32)", +"917105d4": "_takeOwnershipOfToken(uint256)", +"917116f2": "NewSellPrice(uint256)", +"917180c7": "setColdWallet1SplitPercentage(uint256)", +"91735092": "assignToEarlyBirds(address[],uint256)", +"9173a610": "createGame(string,uint256,bytes32[])", +"917418c1": "setMinRoundSize(uint256)", +"917569a8": "weiPresaleMax()", +"917603e5": "getNumberOfMyGamesCompleted(address)", +"917640b5": "getSELabels()", +"91778b9c": "changePrice(uint8,uint256)", +"9178732f": "warriorsOnTheBattlefield(address)", +"917ada14": "testControlCreateShortIdAlreadyExists()", +"917b4f8b": "TQXToken()", +"917d009e": "getAuctionPrice(uint256)", +"917d2be2": "wolkGenesis(uint256,uint256,address)", +"917ec8e2": "removeApp(uint32,string)", +"917f635c": "wct()", +"917fcc5d": "addJobProposal(uint256,string,uint256)", +"917fd839": "buyGEN0Chibi(string,string,uint8,uint256)", +"91814577": "renameStoreTo(bytes32)", +"91816981": "getProfitPercentForData(uint256)", +"91818130": "totalCharityPrize()", +"91828a2e": "extra_bonus_duration()", +"918307fd": "getRemainOfStage(address,uint256)", +"918359c6": "needsBirth()", +"91837535": "getgateway()", +"9183d360": "CreateINDI(address,uint256)", +"9183d8ab": "returnAndRevert(bool)", +"9183fd01": "getSeedPrice()", +"91854684": "pollBallot(uint256,uint256)", +"91858734": "takeControl()", +"9185c694": "_deleteAccount(address)", +"9186485a": "readKYC(address)", +"918657cb": "token_information()", +"91872a91": "isEmpty(string,string)", +"9187300e": "getTokensForSale(bool)", +"91876e57": "withdrawAuctionBalances()", +"91878995": "MYCOIN()", +"9188451b": "transferUserGrowthPoolTokens(address,uint256)", +"91885e1d": "nextWeaponID()", +"918898a5": "frozenRules(address,uint256)", +"9188d312": "getCard(uint256)", +"9189a59e": "sweeper()", +"9189edd2": "Zinoder()", +"9189fec1": "guess(uint256)", +"918a15cf": "toEthSignedMessageHash(bytes32)", +"918a2e0c": "AccessoryCollection(uint256)", +"918b8326": "startSto()", +"918c00c6": "LogCommit(uint256,address,bytes32)", +"918c783a": "hasPurchased()", +"918ca01d": "BurnConfirmed(uint256,address,uint256)", +"918d407d": "acceptOffer(uint256,address)", +"918e2c3d": "GetUserExtraData3(address)", +"918f1bb5": "ProjectKudos()", +"918f49ec": "NDCOIN()", +"918f5f74": "setMinBonusTrigger(uint256)", +"918f644e": "getScriptsCount()", +"918f8674": "DENOMINATOR()", +"91914b30": "setTokenUrl(address,string)", +"91915ef8": "setCapacity(uint256)", +"91916a5e": "Test(uint256,uint256)", +"9191b520": "PlatinumToken(uint256,string,uint8,string)", +"919203a0": "moveTokensFromStockToSale(uint256)", +"91923d7f": "delSuperInvestor(address)", +"9192f48e": "setLocked(address)", +"9193b2e3": "request(address,uint256,uint256,address)", +"9193ba0b": "createForwarder(address)", +"91959fe3": "getCalFactor(uint32)", +"91962739": "setWhiteListOwner(address)", +"9196bdd5": "ggc(address)", +"9196e481": "getAllSteps()", +"91970cba": "saftInvestorAllocation()", +"919747fb": "depositFunds(address)", +"91975e22": "ManagerDisabledEvent(address)", +"91977c56": "setDTR(address)", +"9197b7cd": "earlyWithdrawal()", +"919823df": "getHashExists(string)", +"919840ad": "check()", +"91988783": "IMDEXdepositToken(address,uint256)", +"9198e08c": "Linfinity()", +"919987bc": "rewardPool_()", +"9199a8bb": "dnnHoldingMultisig()", +"919a41dd": "endFight(uint256,uint256)", +"919aa4fa": "ZIGICOIN()", +"919acf1e": "getperiodlasttime(address,address)", +"919b30cf": "FTXToken()", +"919baade": "ProposalsEntity()", +"919be880": "createEscrow(bytes16,address,address,uint256)", +"919beeb1": "calculateRate()", +"919bf699": "EggsPurchased(address,uint256,uint32)", +"919c9d4a": "getAfterIcoPeriod(uint256)", +"919ca82d": "EtherprisesLLC()", +"919d3401": "MAXIMUM_ICO_TOKENS()", +"919d8bb2": "TokenTrader(address,address,address,uint256,uint256,uint256,uint256,bool,bool)", +"919e144c": "predict(uint16,uint8)", +"919e1967": "Ubiq()", +"919e7f42": "supportNewMoon(address)", +"919edc7c": "getChainySender(string)", +"919f31c2": "Ankr()", +"919f8cfc": "makerDepositEther()", +"919f90ca": "sendCommissionToOwner(uint256)", +"91a01414": "getPreviousBlock(uint256,uint256)", +"91a0ac6a": "equity()", +"91a0ba00": "icoRound1()", +"91a1896e": "setReserveForFoundersSecond(address)", +"91a1f16a": "getMaxWin()", +"91a266ac": "totalEthCharityRecieved()", +"91a34006": "getInitializeOutcomeValue()", +"91a3cec0": "receiveEtherFormOwner()", +"91a49300": "purchaseEnable()", +"91a553df": "developer_add_cost_of_transfers(string)", +"91a57544": "affiliatePercentage()", +"91a5b0c7": "bestSum(uint8[])", +"91a67e1e": "tokenFrozenUntilBlock()", +"91a73892": "getOrderStateHelper(uint256,uint256)", +"91a73a27": "cleanSellShareOutput()", +"91a7aa37": "Chain2()", +"91a852f6": "changeTicketFee(uint256)", +"91a89712": "link(address)", +"91a90014": "_updateTokenRates(uint256)", +"91aa94f1": "setPresidenteDeMesaVerify(bytes32,uint256,uint256,bytes32)", +"91aabeb5": "checkArea(uint32[],address)", +"91aac477": "addNacToNetf(uint256)", +"91aadff6": "OPEN_SALE_STAKE()", +"91aaf2e9": "presaleTokenAmount(address)", +"91ab0ca0": "authorisedContract()", +"91ac2c3f": "testCreateElection()", +"91ac46f5": "centRaised()", +"91ac7e65": "indexOf(uint256)", +"91ac96a9": "pendingWinners(uint256)", +"91acd8fb": "DEJToken()", +"91ad1ada": "VernamPrivatePreSale()", +"91ad27b4": "getInterval()", +"91ad48a1": "DataToSetting(uint8,bool,uint8)", +"91af8d14": "recalculateTopScores(uint256,uint256,uint256)", +"91afc432": "setUpdaterAddress(address)", +"91b1a02a": "SwissCryptoExchange(address,address,address,uint256,uint256,uint256)", +"91b22ebf": "getTokenAmountPerHeritor(address,address)", +"91b23419": "developerFund()", +"91b2413f": "HplusToken()", +"91b25b35": "revokeAndSetNewMember(uint8,bytes32,address)", +"91b2b30e": "LogI(uint256)", +"91b43d13": "fundingEndBlock()", +"91b4a0e7": "Difficulty()", +"91b4ded9": "lastPauseTime()", +"91b56822": "gameTick(uint256)", +"91b584f3": "_insertValidator(address,uint256)", +"91b6a086": "WithdrawToInvestor(address,uint256)", +"91b7ad06": "calculateTokens(address)", +"91b7d3e0": "redeemSurplusERC20(address)", +"91b7f5ed": "setPrice(uint256)", +"91b8a49a": "lastDonor()", +"91b97997": "endFirstWeekICO()", +"91b9b640": "getDApp(string)", +"91ba5d6a": "preICOMany(address[],uint256[])", +"91baabba": "CCLToken()", +"91bb2534": "impl_price()", +"91bb4816": "m_Database()", +"91bbb21a": "trialDeadline()", +"91bbb87b": "GetPurchaseInfo()", +"91bbbe4d": "_payoutTaxes(uint256)", +"91bbd6f6": "VeiagToken(address)", +"91bbdcc7": "convert()", +"91bc85a9": "SetTrustee(address)", +"91bc8a45": "bonusAdd()", +"91bdc458": "blockNewSpinnerPurchase(uint256)", +"91bdf9da": "isTen(uint8)", +"91be0b31": "setPriceChanger(uint256)", +"91be2f8d": "changeCCCoinAddress(address)", +"91be90c8": "_dust(address)", +"91bf9c50": "test_CampaignRulesFail()", +"91bfeb98": "CrystiumToken()", +"91c03391": "TraToken()", +"91c05b0b": "distribute(uint256)", +"91c11cae": "disputeTransaction(uint256,uint256)", +"91c1e2c1": "burnedBalanceOf(address)", +"91c20375": "setArtEsc(string,string)", +"91c23928": "divSafe(uint256,uint256)", +"91c259ea": "transferby(address,uint256)", +"91c27b2a": "setTransTimes(uint32)", +"91c3352e": "test_invalidEmptyEqVal1()", +"91c3e5ee": "rb(address)", +"91c3e7f8": "showlvzhou(address)", +"91c4529f": "isBlacklistSpender(address)", +"91c49026": "rebalanceEnclaves(address,uint256)", +"91c4c78f": "fund(address,uint160)", +"91c62a5a": "LogBounty(address,uint128,string)", +"91c71e2b": "disableLock(bool)", +"91c72d88": "holdSubscriptionOffer(uint256)", +"91c79a9a": "CON0217()", +"91c827a0": "AddOwnerAddress(address,address)", +"91c873cb": "getAdminContract(address,uint256)", +"91c8e336": "exchangeSupply()", +"91cadaf6": "evolvePrice()", +"91cb4316": "endOf24H()", +"91cb98af": "getPendingAmount(uint256)", +"91cca3db": "dev()", +"91cd242d": "setMeta(bytes32,bytes32,bytes32)", +"91cd450c": "AlienFarm()", +"91cd7e9a": "ChannelDeleted(address,address,address)", +"91cdecab": "TOTAL_DINOTOKEN_SUPPLY()", +"91ce8ca9": "IQTCrowdsale()", +"91ce8e04": "setTwo(uint256)", +"91cee1fd": "baseStats(uint256,uint256)", +"91cef6a8": "payAffiliate()", +"91cf2164": "transferFunction(address,address,uint256)", +"91cf7aca": "upgradeFrom(address,address)", +"91cfb7b6": "ceilings(uint256)", +"91d0b3fd": "_mine(address,uint256)", +"91d0dd17": "accrueCouponsPerXTokenETH()", +"91d15735": "left11(uint256)", +"91d15a91": "weiRaisedIco()", +"91d1addb": "plutocracylvlAchieved(string,string)", +"91d23a1a": "lastRewards()", +"91d2939d": "per(uint256,uint256)", +"91d4357b": "myBonus()", +"91d43b23": "right76(uint256)", +"91d462d9": "hashUnderlyingPrices(uint32,int256[])", +"91d558b7": "startCrowdsaleY0(address)", +"91d55c41": "RuiXueToken()", +"91d5d7d6": "out1Done()", +"91d6212a": "address5a()", +"91d625e5": "setupCore(string,string,address,uint256)", +"91d6367b": "reserveForTeam(address,uint256,uint256)", +"91d739ea": "updateRegistratorStatus(address,bool)", +"91d76bbb": "getTotalMigrated()", +"91d781ba": "kkTestICO1()", +"91d80948": "_checkAndCallTransfer(address,address,uint256,bytes)", +"91d8b14e": "BuyTickets()", +"91d91df3": "FesBerto()", +"91d96541": "refundedSat(address)", +"91da7aa8": "transferAndCall(address,uint256,uint256[])", +"91da9178": "WALLET_LB_ADMIN()", +"91db7b0d": "updateLockPeriod(uint256)", +"91dbd4c3": "payTournamentWinner(uint256)", +"91dc077b": "submitApplication(string,string,string,string,string,string,string,string)", +"91dc11fe": "setClaimParameters(uint256,uint256)", +"91dc1b1d": "mintCUSD(address,uint256)", +"91dc6d36": "pauseForDividend()", +"91dc956d": "addLog(string)", +"91ddadf4": "clock()", +"91de4f88": "claimCoreTeamsTokens(address)", +"91de5474": "getPurchaserCount()", +"91ded8fa": "getTokenByAddress(address)", +"91df0c08": "addReserve()", +"91df9562": "BSPToken()", +"91dfa960": "report(uint16,uint16)", +"91dfe428": "addFees(uint256,uint256)", +"91e05922": "contractICO()", +"91e078bb": "startAuction(uint256,uint256,uint256)", +"91e0a5a0": "checkHolderStep(address)", +"91e0b6c0": "ProofPublicVote()", +"91e0e39c": "resetDragonBalance(address,uint256)", +"91e1397d": "rcnFund()", +"91e145ef": "f(string)", +"91e192b7": "MintedToken(address,address,uint256)", +"91e1cc5a": "freezeAccount(address,uint256,uint256,uint256,uint256,uint256)", +"91e22c90": "interfacesSupported(address,bytes4[])", +"91e23a4d": "updateInterCryptonode(bytes32)", +"91e2f2c5": "HoQuToken(uint256)", +"91e30ec3": "buyDataRecord(uint256,uint256,uint256,uint256,uint256,uint256)", +"91e3387b": "numBrews()", +"91e50314": "isActivityCore()", +"91e52b91": "buySecond()", +"91e569c3": "recordBook(address)", +"91e59bcf": "testSetName()", +"91e6d028": "getFIRST_STEP_LIMIT()", +"91e6f274": "FirstUserDestroy()", +"91e7137d": "price2ndWeek(uint256)", +"91e732b6": "setInvestRestriction(uint256,uint8,bool)", +"91e79c72": "hodlerTotalValue()", +"91e7f7bc": "claimVotingRight()", +"91e8609f": "getParentId(bytes32,uint256)", +"91e863ca": "setBigPromoInterval(uint128)", +"91e88106": "abiLength(address[])", +"91e8d3dc": "testBitOrFailIndexOOB()", +"91e8fc34": "createPipe(uint256,uint256,bytes32)", +"91e9f106": "historyWinner(uint256)", +"91ea294e": "LogSetWithdrawer(address)", +"91ea4d07": "snatchedOn()", +"91ea59eb": "buyGuaranteed(address)", +"91ea8a05": "add(bytes32,bytes32,uint256)", +"91eb97ea": "pharmatrix(uint256)", +"91ebc861": "noFeeTransfer(address,uint256)", +"91ec1623": "_shutDown()", +"91ec845e": "isAtMost(int256,int256,string)", +"91ec910e": "OwnableImpl()", +"91ecda3c": "Menu10(address)", +"91ed6851": "createPromoCompany(address,string,uint256)", +"91ede45f": "Deposited(address,uint256,uint256,uint256)", +"91ee7bbf": "dispute(bool)", +"91ef14b4": "setApprove(address,address,uint256)", +"91f02379": "hundredKInvestor()", +"91f02f9c": "DelayChanged(uint256)", +"91f09f7c": "redeemPowerTokenBal()", +"91f11a9c": "lastWinNumber()", +"91f1cf05": "crafting()", +"91f1f310": "totalOffers(uint256)", +"91f2700a": "drop(address)", +"91f2ebb8": "heir()", +"91f34dbd": "transfer(uint256,address[],uint256[],uint256[3],bytes,bytes,bytes)", +"91f39f10": "getContactAddressByIndex(uint256)", +"91f3c4a2": "GSY(uint256,string,string)", +"91f4b7ff": "soulBookPage(uint256)", +"91f5637a": "frozenBalanceCount()", +"91f5c3a8": "donateAndCreateGiver(address,uint64)", +"91f5f3c9": "MAX_TOKEN_GRANTEES()", +"91f6c7e6": "getCurrentICOPhase()", +"91f72ebb": "is128Bit(uint256)", +"91f7cfb9": "availableAmount()", +"91f85480": "updateValidOrg(address,address,bool)", +"91f8668e": "setTokenUri(uint256,string,string,string,uint256)", +"91f90157": "highestBidder()", +"91f9bb85": "setAdvisorVault(address)", +"91f9f4a2": "getRateIncludingBonus()", +"91fa0555": "getParentAddress()", +"91fa196d": "getDesignatedReportReceivedTime()", +"91fa2df4": "addPaid(bytes32,uint256)", +"91fb4583": "reachedMajorityForTeam(uint256)", +"91fb9437": "isStoring()", +"91fc437e": "nameTaken(string)", +"91fc5696": "confirmBusinessOwner(address)", +"91fc7c70": "TreeCoin()", +"91fd1c7d": "getSenderByHash(string)", +"91fdbb55": "releaseUrl(uint8)", +"91fdf6b1": "electActiveTranscoder(uint256,bytes32,uint256)", +"91fe5a64": "_totalBurnedTokens()", +"91fe7bab": "mintTokensWithApproval(address,uint256,address)", +"91fea350": "checkFreezeValue(uint256)", +"91fed1c0": "RaffleResult(uint256,uint256,address,address,address,uint256,bytes32)", +"91feea93": "withdrawBoth(address,uint256,uint256)", +"91ff6baf": "requestsFunded()", +"92008bfa": "setResourcesSecondaryManager(address)", +"9200b04c": "myDeposit(address)", +"9201ac94": "getCON()", +"9201de55": "bytes32ToString(bytes32)", +"92031600": "setBonuses(uint256[],uint256[],uint256[])", +"92039b87": "balanceVested(address)", +"9203cb9e": "forwardWin(address,address,bytes,bytes32,bytes)", +"9204764f": "setHookOperator(address)", +"9204b2bd": "maxVeriAmount()", +"9204c013": "QKCCoin()", +"9205ab3c": "sendRefund()", +"9205dce7": "Usdcoins()", +"9205ec4d": "refundSponsorship(address,uint256,uint256)", +"9205fbc2": "testAuthorityAuth()", +"92066346": "setCastleLootDistributionThreshold(uint256)", +"92069ebd": "_getMarketPrices()", +"920775d4": "subVirus(address,uint256)", +"92093dd6": "getLastResult()", +"92093e7d": "addUserRefBalance(address)", +"92099fdb": "refundableEthBalanceOf(address)", +"9209b3c0": "getCrtDetails(bytes)", +"9209eebe": "SentToContractor(uint256,uint256,address,uint256)", +"920b0280": "noIcoPeriod()", +"920b3a7e": "getFundersCount()", +"920bb680": "ledgerWallet()", +"920c94df": "BuyTicketForOther(address,uint8,uint8,uint8)", +"920dce19": "getAngelCardSeries(uint8)", +"920dd47b": "first_partner_address()", +"920dfe52": "EFARMCoin()", +"920e3c96": "setUserStatus(address,uint8)", +"920e4da9": "created(string,string,address,uint256)", +"920ffa26": "ownerOf(string)", +"9211448f": "finalizeClaim(bytes32,string)", +"921193cf": "changelp3(address)", +"921200ed": "setBonusTokenRateLevelFour(uint256)", +"9212051c": "numJobs()", +"921233b9": "addBuyRequest(bytes32,address)", +"92123470": "mintTo()", +"921237a4": "createPlayer(address,address)", +"92127126": "canTransferByPartition(bytes32,address,uint256,bytes)", +"9212d0c1": "closeBetsIfEventNotSuccess(bytes16,bytes16,uint256,uint256)", +"92140775": "prefixedTest(uint8,bytes32,bytes32,address,address)", +"92140bb9": "getTransactionByTransactionAndEntityId(address,uint256)", +"921456e7": "modifierEx()", +"921496a9": "adminWithdrawTokens(uint256)", +"9214b644": "married()", +"9214e527": "Crowdsale(uint32,uint32,uint256,address)", +"9215b58e": "GoldMineChain(uint256,string,uint8,string)", +"9216728a": "cooWallet()", +"9216b7ad": "winTokenReward()", +"9216cf13": "licenseSalesContractAddress()", +"921710e9": "getShareRewardPercent()", +"9217500c": "setFightAuctionAddress(address,address)", +"9217c438": "getOracleAddress(uint256)", +"921828ac": "commitProposal(string)", +"921b004b": "depositFunds(address,uint256)", +"921b15ae": "LaborHourToken(address,int256,string,uint256)", +"921b2d64": "mintTokens(int256,address,uint256)", +"921b45f7": "checkAndCloseDeposit(uint256)", +"921bd6f0": "upgradeTimestamp()", +"921d72ed": "CreatedAccessory(uint64)", +"921dec21": "registerNameXID(string,uint256,bool)", +"921e1537": "dailyHash()", +"921e7ba6": "withdrawCoins(string,address)", +"921f5dec": "getBlockVoter(uint256,address)", +"921f98bb": "resolveFailVote()", +"921fb890": "buyGood(address,string)", +"92202126": "ETU()", +"92207bd8": "getMyCarsIdxCount(uint256)", +"9220d426": "_nowDateTime()", +"9220d5fa": "DiminishToken(address,address)", +"92223e7a": "BlueRedTokenERC20(uint256,string,string)", +"9223de05": "contributionAmounts(address)", +"922427de": "canSort()", +"922497fc": "regularTokenMaxSales()", +"92250c6a": "localBuy(uint256,address,address)", +"922587ff": "addMintable(address)", +"9226084e": "tier_cap_1()", +"92262375": "transferByDate(address,uint256[],uint256[])", +"922775e3": "createNewTrade(address,uint256,uint256)", +"92277933": "abc()", +"9227bed6": "bucketAmount()", +"922856da": "getPicksForUser(address)", +"9228e90d": "developer_BSR()", +"9229c504": "new_mainPlayer(address)", +"9229e3cd": "submitProof(bytes32,bytes32[],uint256)", +"9229f3c1": "KVLToken()", +"922a8425": "paymode()", +"922b01ca": "walkTokenLots(address,address,uint256,uint256,bool,bool,bool)", +"922b041d": "_getStatsSumHours(uint256)", +"922ba128": "calculateCurrDynamicPrice()", +"922bedf7": "mintNFTsNotForSale(uint256[],bytes32[])", +"922c64ef": "batchDistributeTokens(address[],uint256[])", +"922da521": "RocketPoolPresale(address)", +"922dd59a": "icapTransfer(bytes,address,bytes,uint256)", +"922dd7d9": "generateKey()", +"922f17ce": "emptyEther()", +"922f7124": "changeStrategyAddress(address)", +"922fc84b": "taskProcessedNoCosting(uint256)", +"923020d9": "whitelistMainSaleAddress(address,bool)", +"9231e0f9": "setPresidenteDeMesaVerify(bytes32,uint256,bytes32)", +"923211f5": "showLiveDividends()", +"9232494e": "BANCOR_NETWORK()", +"9232fdb5": "addUserExp(address,uint256)", +"9233c030": "_reward(uint256)", +"9233c1d6": "battle(uint256[],uint256)", +"9233d561": "setUnpaidPercentage(bytes32,uint8)", +"92346ed7": "test1(bytes)", +"92348055": "sellSoul(string,uint256)", +"9234c1fd": "MAX_REVEAL_DURATION_IN_SECONDS()", +"92363a42": "createProduct(uint256,uint256,uint256,uint256,uint256)", +"923689e4": "startRecovery()", +"92369bd5": "calculateAndDecreasePhaseSupply(uint256)", +"9237a125": "seedDeposit()", +"9237e074": "manager(uint256,address,string,uint256,bool)", +"9237e61b": "InvestmentSucceeded(uint256)", +"9239520b": "setQuorumPercent(uint8)", +"923a1abb": "SBCE(uint256)", +"923a2e61": "JinGangCoin()", +"923a367f": "PBToken(address,address)", +"923a4227": "CiceroToken()", +"923a69ae": "getCardRevenue(uint8)", +"923b3e75": "publishContractTemplate(uint256,string,address,string,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"923b9480": "getDatasCount()", +"923b9bae": "EventCreatePet(address,uint256)", +"923ce65f": "draftNewCard()", +"923d566d": "buyKey(uint256,uint256)", +"923db49b": "informOffChainBuy(address[],bytes32[])", +"923de8e2": "checkTransferAndCallDelegated(address,address,uint256,bytes,uint256,uint256,bytes)", +"923e1b84": "sendToEtheroll(uint256,uint256)", +"923e2645": "DonationGuestbook()", +"923f098e": "CLNRefunded(address,address,uint256)", +"923f1788": "convertChest(uint256)", +"923f8455": "BACE_ETH()", +"923f9bae": "testLedgerPayback()", +"923fa0fe": "ChildContract(uint8,address,bytes32)", +"92403b35": "tier2Count()", +"9240551b": "changeCurrentEtherRateInCents(uint256)", +"9240f699": "landmarkSize()", +"92414146": "preIcoWasSuccessful()", +"92414f92": "OpenDate(uint256)", +"92418cf6": "withdrawKncFee(uint256)", +"924320b5": "isMajorityShareholder(address)", +"9243e088": "setEnforceRevisions(bytes20)", +"9244c21e": "preicoUSD()", +"9244f496": "addAddressToWhiteList(address)", +"92450ac9": "setDataColla_AA_01(string,string)", +"9245290d": "changeFeeCollector(address)", +"9246177b": "changeTicketOwner(address)", +"9246ab77": "addWhitelist(address[],address)", +"9246e531": "getSignature(string,int256)", +"924720bd": "pizzaPrice()", +"9247ff59": "getAccountData(uint256)", +"9248019e": "addMonsterIdMapping(address,uint64)", +"924806a0": "returnToken(address)", +"9248d4ec": "getEthNeeded(uint256)", +"92491f21": "subTourFreezingTime()", +"9249993a": "BANCOR_GAS_PRICE_LIMIT()", +"9249bc75": "set_sale_open()", +"9249d865": "getAllLawyers()", +"924b1235": "price1stWeek(uint256)", +"924b39ae": "refundToWallet(address)", +"924b573a": "lastWagerTimeoutTimestamp()", +"924bb1d0": "updateETHPrice(uint256)", +"924c28c1": "ContractInterface(address,address,address)", +"924ca55e": "LindaPresale(uint256,uint256,uint256,uint256,uint256,address,address)", +"924ca61a": "coupon(address,address,uint256)", +"924dd50a": "startSelling(uint8,uint256,uint256,uint128)", +"924dedca": "getEpisodeDataCommand(uint256,uint256,uint256)", +"924e63f6": "setDisputeResolver(address)", +"924f6be0": "CONTEST_INTERVAL()", +"924fdaf6": "drawPorsche()", +"925012f6": "agingTimes(uint256)", +"9250640d": "INIT_TOKENS()", +"925074ca": "getAllPlots()", +"92509c16": "lock_by_manager()", +"9250b080": "picops_user()", +"9250d59f": "setIsSoftCapAchieved()", +"925176d6": "sellRate(uint256,uint256,uint256)", +"92524725": "mintToMany(address[],uint256[])", +"9252e819": "IGCoin()", +"92535862": "custodyCounter()", +"92536070": "RoomManager()", +"925382c0": "setMigrated()", +"92541925": "skynacoin()", +"92549366": "remainingCapInEth()", +"9254c2a8": "changeTotalRemaining(uint256)", +"92550bdd": "applyMigrate(uint256)", +"9256759c": "addressFundAirdrop()", +"9256c71d": "getPriceFeedsByOwner(address)", +"92573a0c": "token_callg()", +"925753d3": "TokenGenerationDisabled()", +"92579f34": "Aracle()", +"92584d80": "finalize(bytes32)", +"92588071": "saveAddress()", +"9258c8f8": "Applicationcoin()", +"9258d5a3": "isIcoRunning()", +"925aa2ad": "purchaseWithEth()", +"925ac216": "isICOOpen()", +"925ad1e7": "collectAllForce(address[],address)", +"925b83a7": "getCobeFriend(uint256)", +"925cbdd1": "createCost(uint256)", +"925cd80d": "contract_start()", +"925d3ec8": "dDowngradeToBasic(bytes32)", +"925f2573": "batchTransferDirectoryToken(uint256,address[],uint256[])", +"925f7239": "veztUserRegistered(address)", +"9260587e": "_removeTokenFrom(address,uint256)", +"92609315": "addAuctionManager(address)", +"9260e726": "giveReward(uint256)", +"9260faf8": "issueForEuro(uint256)", +"9262bba9": "titsTokenAuthor()", +"9262d759": "getAddress(uint256,uint256)", +"9263b559": "ethReceivedMain()", +"9263e371": "mint(bytes32,string,string,string,string,string)", +"9264a169": "tranferFrom(address,address,uint256)", +"9264ee57": "valuePerMicroKey()", +"92656b6d": "calculateHash(address[],uint256[])", +"9265996c": "getEventResult(uint32)", +"92664190": "PriceUpdate(uint256,uint256)", +"92670dc8": "currentBonus(uint256)", +"9267a36d": "founderVestingContract()", +"9267b291": "getGameStarted()", +"9267daba": "depositToGateway(uint256)", +"9268037a": "FortressToken()", +"92682b5f": "PauseOn(uint256)", +"9268e2d6": "setCLOUDForGas(uint256)", +"92698814": "reserved(bytes32)", +"926994e6": "testFailSoftLimit()", +"9269c0a7": "setABalances(address[],uint256[])", +"9269e464": "bountyTokenAllocation()", +"926a2456": "cancelIndexedSale()", +"926a4765": "getRoundStart()", +"926a9af0": "distributeForFoundersAndTeam()", +"926aa0a8": "sendEthTo(address)", +"926b33c6": "playSpecificDoubles(uint256,uint256)", +"926baab2": "proofImpl()", +"926bd180": "isGameVerified(uint256)", +"926c196a": "depositAndTransfer(address,uint256,bytes)", +"926d212e": "createGenerator(uint256)", +"926dfd5e": "becomeYouTubemaster()", +"926f0c7b": "partnersFund()", +"926f949e": "calculateWolkToBurn(uint256)", +"9270040f": "drawHeroLottery(address,bool)", +"92708ce1": "aletoken(string)", +"92710c60": "finalizePublicICO()", +"92716054": "freezer()", +"9271b8df": "totalPaidToFunder(bytes32,address)", +"9271b997": "setHighScore(uint256)", +"92721b86": "dividendRate(address,uint256)", +"9272e3f5": "many_currencies()", +"927319ba": "DCCToken()", +"92731aaa": "changesLocked()", +"927332da": "MaxChildLevel(address)", +"92736527": "freezeGame(uint32,bool)", +"92749978": "minBets()", +"9274c16b": "tokensDistributedToContributors()", +"9275ddd7": "SetFreeQPY(uint256)", +"92760a3e": "loveName()", +"92763585": "uniquePetsCount()", +"927675b8": "run(bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],uint256,uint256,uint256,uint256)", +"92771e0f": "getCertificateMetaData(bytes32,bytes32,bytes32,uint256)", +"927726ea": "_openPrize(uint32,uint32,uint256,uint256)", +"927731c8": "payDepositByCandidate()", +"9278c418": "targetWalletVerified()", +"9279011c": "nextroundlength()", +"927a11b6": "getBranch(uint256)", +"927a4a7b": "transferWithLockAfter(address,uint256,uint256)", +"927a90da": "icoOpen()", +"927aaa7c": "setGeneManager(address)", +"927ac4f5": "approveContractReceiveGameLockedToken(address)", +"927bcac3": "emergencySplitToggle()", +"927c4151": "finalizePresale(address)", +"927c60de": "BIKQuery(address)", +"927d9ab4": "set_building_amount(uint256)", +"927da105": "allowance(address,address,address)", +"927db818": "initPresale(address,uint256,uint256,uint256,uint256)", +"927db81f": "new_entity(address,string)", +"927e434b": "rocketAddFunds(uint256,uint256,uint256)", +"927e69e2": "_getBattleBonus(uint256,uint256,uint256,uint256,uint256)", +"927ed13a": "newClient(uint256,address)", +"927f1086": "MAX_RANDOM_DELAY()", +"927f4be0": "exhaustAfterBattle(uint256,uint256)", +"9280b836": "spreadGold(address,uint256)", +"9280df59": "Swapcoinz()", +"928161ca": "recoverFundsAndDestroy()", +"92817184": "redeemPurchasesForVendor(address)", +"928187a8": "BonumPreICO(address,uint256)", +"9281aa0b": "setWhitelisted(address,bool)", +"9281cd65": "changeApproval(address,uint256,uint256)", +"9281e270": "matchOrders(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)", +"92824c24": "changeClaimAddress(address)", +"92829174": "preCrowdsaleTokensWallet()", +"9283032c": "storeWeekUnclaimed()", +"9283da60": "TeamtokenRelease1()", +"9283e6cb": "acquisitionsStatus()", +"92842802": "changeTierAdmin(address)", +"928432c0": "releasedSteps()", +"92844ddd": "_setUserRole(address,uint8,bool)", +"92846ab6": "put_transfer(address,address,address,uint256,bool)", +"92848c9e": "create(uint256,uint256,uint256,uint256)", +"9284cb0c": "getTotalPreSelled()", +"9286904c": "set_doctor(uint256,uint256,string)", +"928693c6": "RusaToken()", +"928771bb": "janPot_()", +"92878bd0": "forwardFunds(address,uint256)", +"9287c877": "getNavLength()", +"92885e86": "CountryPurchased(uint256,address,uint256)", +"9288cebc": "totalRollsByUser(address)", +"92890b09": "SmithToken()", +"92893fb9": "hasAddressVoted()", +"92898900": "allowTokenTransfer(address)", +"928993dd": "setBuyComissionUnits(uint256)", +"928a00d2": "deleteCoin(uint256)", +"928b06b5": "EAsset()", +"928b4cd2": "preICOTokenHardCap()", +"928b685c": "_buyPutToClose(uint256,uint256,uint256,uint256,address)", +"928b792e": "withdrawBonuses(bytes32,uint256,address,uint256,address)", +"928c5fb3": "getArrIntField3()", +"928c82a2": "createAsset(string,string,string,uint256,address)", +"928d09dd": "coreTeamAddr()", +"928d20fc": "_unpackPetValue(uint256)", +"928d4144": "verify(uint256,uint256,string,uint8,bytes32,bytes32)", +"928d81c1": "withdrawERC20Token(address,uint256)", +"928e6592": "sellingPriceInDayOf(address)", +"928e6b16": "getUint(bytes4)", +"928f0cc7": "ChangeStartByManager(uint256)", +"928f16e3": "geCompoundTimestampsFor12Months(uint256)", +"928fca1d": "withDrawlocked()", +"928fd553": "Migrated(address,address,uint256)", +"929066f5": "isParticipant(address)", +"9291b1f3": "tradeDealConfirmed()", +"92925c3b": "supplyTokens()", +"9293cc10": "TOU(uint256,string,uint8,string)", +"9293eb2f": "totalScammedRepaid(address)", +"9293f41e": "sendInviteDividends(uint256,uint256,uint256,uint256[])", +"92940bf9": "transferERC20Token(address,address,uint256)", +"92946284": "_placeSellTokenOrder(address,uint32,uint256)", +"9294e012": "sendOracleData()", +"92956506": "StarxCoin()", +"92958b7d": "markTokensToSell(uint256,uint256)", +"9295d038": "loyaltyPart()", +"92968125": "getUserDetails(address,uint256)", +"92979037": "teamTwoDivsUnclaimed()", +"9297afa2": "Eliminate(address,uint256)", +"9297c24c": "command()", +"9297d758": "DiceManager()", +"929911be": "takeSnapshot(address)", +"9299e552": "cancelListing(bytes32)", +"9299f294": "_buy()", +"929a3c18": "EMGwithdraw(uint256)", +"929a79b1": "getTitle(uint256)", +"929aa851": "maximumTokensForFifth()", +"929ac519": "changeOwnersWallet(address)", +"929ba8bf": "transferFromRwrd()", +"929c4649": "startUpgrading()", +"929c52a7": "changeClosingTime(uint256)", +"929d2033": "takeUpWork()", +"929de7c9": "setData_21(string)", +"929e626e": "getShareDistribution(bytes32)", +"929e902d": "curVotes()", +"929ec537": "getLockedAmount(address)", +"929f11ea": "withdrawOwnerAmount()", +"929f8dd4": "createBet(address,address,uint256,bytes32[])", +"92a04621": "maxPurchaseNum()", +"92a08dd1": "getCustomField(uint256,bytes32)", +"92a0fd64": "reserveTokenWallet()", +"92a11827": "canRevokeVesting(address,address)", +"92a20d0c": "ANONIMX()", +"92a2b44b": "offerTkn(uint256,uint256)", +"92a38e71": "createOpenValentineRequest(string,string,string)", +"92a39634": "VoltOwned(address)", +"92a42704": "verifyOwnership()", +"92a48bea": "setOfferContract(address)", +"92a4cc25": "readFrom(uint256,int256)", +"92a5f340": "BasePrice()", +"92a69395": "setTotalAirDrop(uint256)", +"92a70756": "m_thawTS()", +"92a70c42": "deployerHash()", +"92a73fb8": "testbool(bool)", +"92a781d8": "changeBaseValue(uint256)", +"92a7843c": "lastRefundedIndex()", +"92a79148": "getCryptoVersusReward()", +"92a793d0": "release_3()", +"92a81127": "BasicMilestones(address,address,bool)", +"92a8424d": "setPercentageCW(uint256)", +"92a93d33": "payAltCoin(bytes32,address,address,uint256,uint256,bytes)", +"92aaa019": "Inventor()", +"92abb859": "overrideBlock()", +"92acb4d6": "contributorList(address)", +"92ad728b": "staff_2()", +"92ae0530": "canUpdateFrontWindowAdjustmentRatio()", +"92aea05a": "expLimited(int128,int256)", +"92af0605": "playSystem(uint8,uint8,uint8,address)", +"92af7ce0": "throwsWhenGettingTokensWithEndedSale()", +"92afac6d": "reserveY1()", +"92afc33a": "ROLE_MINTER()", +"92b03120": "CONTRIBUTION_START()", +"92b0c5b2": "pow(int256,int256)", +"92b0d721": "mold(bytes32,uint256)", +"92b0fed8": "ChannelFactory()", +"92b1696d": "CNYToken(uint256,string,uint8,string)", +"92b18819": "getPoolFirstExpertStaker(uint256)", +"92b19872": "changemincap(uint256)", +"92b1b0ce": "RachelToken()", +"92b1b418": "tokenFallbackTest(address,uint256,bytes)", +"92b25a71": "Wallet(bytes32)", +"92b3228c": "getIreg()", +"92b39bf4": "assignPatient(uint256,uint256,uint256,uint256)", +"92b46390": "changeDevAddress(address)", +"92b4b68a": "get_bettor_nfo()", +"92b4bb50": "rps()", +"92b4ddeb": "phase_3_Time()", +"92b6641a": "hardCapHigh()", +"92b6ebfa": "getPreIcoBonus(uint256)", +"92b7bd27": "removeOwner_(address)", +"92b7bfbb": "TransferRate()", +"92b7d5b9": "getCurrentGaslimit()", +"92b863f3": "AbabPreICOToken()", +"92b87751": "_balanceOfUnclaimedMilk(address)", +"92b9308c": "getRespectiveValue(address)", +"92b96432": "setBpTime(uint256)", +"92b9fe8b": "Xenon()", +"92ba4ba6": "GridMember(string,uint256,bool,address,address)", +"92ba77ca": "setVeto(uint256,bool)", +"92bad6f4": "getNumber(uint256,uint256,uint48)", +"92bb3e6a": "setCoverImage(uint256,bytes)", +"92bbf6e8": "E()", +"92bc3251": "getCuts()", +"92bccb80": "pauseRedemption()", +"92bcf0d5": "ICO_PHASE2_LIMIT()", +"92bd38bc": "fundCampaign(uint256)", +"92bd3f16": "mainsaleTotalNumberTokenSold()", +"92bdf9ba": "lockedCollateral(address)", +"92be2ab8": "setRegisterFee(uint256)", +"92be5d13": "setDelegadoDeEscuelaVerify(bytes32,bytes32,uint256)", +"92be675f": "Y1_lockedTokenAmount()", +"92bec526": "GameChannelConflict(address,uint256,uint256,address,address,uint256)", +"92bec5c3": "distribute(uint256,uint256,address)", +"92bf2bf1": "changeMinimumContribution(uint256)", +"92c00590": "getAddReserveSignatures()", +"92c00a3f": "transferState()", +"92c00f3c": "investorsTokens()", +"92c19394": "packStore(address)", +"92c2bcb4": "changeRecipient(address)", +"92c31e61": "ZOINToken()", +"92c40344": "getReferralCode(address)", +"92c4a5ed": "MinBetUpdate(uint256)", +"92c537e9": "hatchStartTime()", +"92c54f92": "sit(uint8)", +"92c5769d": "unlockAddressAfterITO(address,address)", +"92c6b697": "claimGanaTokens()", +"92c6bf28": "getWalletsData()", +"92c70af1": "MAX_UN_LOCK_TIMES()", +"92c787ae": "register_recurcively(uint256)", +"92c8412f": "buykey(uint256)", +"92c87280": "joinProvider(uint256)", +"92c88a40": "CollectibleToken()", +"92c8eb96": "DSFalseFallbackTest()", +"92c9a11a": "getPrices2(uint256,uint256,uint256)", +"92c9a926": "stateStartDate()", +"92c9a9e2": "activateDestruction()", +"92ca3a80": "SingleTransact(address,uint256,address,bytes)", +"92cb5f19": "TokenTemplate(uint256,string,uint8,string,address)", +"92cb9030": "getFeeWindowForForkEndTime()", +"92cbda09": "subbtycmoney(address,uint256)", +"92cbeb59": "OracleBitstamp()", +"92cc2c94": "drainRemainingTokens()", +"92cd1ff2": "ETH_DECIMALS()", +"92cd2b99": "asciiToUint(bytes1)", +"92cdaaf3": "fulfillEthereumPrice(bytes32,uint256)", +"92cdb7d5": "deathData_a15()", +"92cf1d49": "setStop()", +"92cf9d45": "scriptAddresses(uint256)", +"92cfd461": "_createMedal(address,uint8)", +"92cfebd6": "LanaCharleenToken(uint256,string,string)", +"92d09ceb": "collateralAmount()", +"92d09f22": "pendingInvestContracts(uint256)", +"92d0d153": "t()", +"92d16464": "gameIsOver(uint256)", +"92d1abb7": "CONVERTER_CONVERSION_WHITELIST()", +"92d25259": "iBlock()", +"92d267c1": "setEthUsdRateInCent(uint256)", +"92d282c1": "Send()", +"92d2f118": "burn(uint8)", +"92d33200": "MAX_CRATES_TO_SELL()", +"92d3be79": "escrowWallet()", +"92d42475": "bbReserveWallet()", +"92d44650": "tokenApproves()", +"92d4d9ac": "verify(bytes32,address,uint8,bytes32,bytes32)", +"92d519de": "ATSXToken(address,address)", +"92d588a0": "INITIAL_COINS_FOR_VIPPLACEMENT()", +"92d59aff": "Take_payout()", +"92d60433": "CirculatingSupply()", +"92d66313": "getYear(uint256)", +"92d68619": "Multiplication(int256)", +"92d69a39": "addNodesToList(string,address)", +"92d7b620": "judge(bytes32[13],uint256,bytes32[],bytes32[],bytes32,bytes32,uint256[4],bytes32[10],uint256[4])", +"92d7f787": "getAccountWhitelist(uint256,uint256)", +"92d8c8cf": "setupImportFee(address,uint256)", +"92d98e95": "content(string,uint256,address,uint256,uint256,uint256)", +"92d996d7": "getPopularityByOffset(uint256)", +"92d997bd": "QuantityInitial()", +"92d9e3b8": "isAcceptingPayments()", +"92da29d2": "validPurchase(uint256,uint256,bytes)", +"92da856d": "currentStepIndexAll()", +"92dac258": "getAuctionItems(uint256[])", +"92daec51": "setLastBuyer(address)", +"92dbf585": "appendEarlyPurchase(address,uint256,uint256)", +"92dcf35d": "fourthExchangeRatePeriod()", +"92dd1246": "updateListReq(uint256,uint256)", +"92dd38ea": "arrayaccess(uint256)", +"92df61e8": "withdrawTokensFor(address)", +"92df6e91": "fortune_limitbreak()", +"92df94ec": "updateDream(address,string,string)", +"92dff48a": "backers()", +"92e0ba2a": "goldBought()", +"92e11e24": "teamAmountLeft()", +"92e16740": "scheduleOraclize()", +"92e18d9f": "setYcmContractAddress(address)", +"92e1ab17": "includesAddressesSet(address)", +"92e33d14": "enableWithdraw(bool)", +"92e405ac": "transferPartner(address)", +"92e41c69": "identityEthAddress()", +"92e4226a": "nextTransferFeeAbs(uint256)", +"92e423b5": "agent(address)", +"92e4b733": "_transferTokens(address)", +"92e4b8a4": "collectAuthorizedPayment(uint256)", +"92e4cd75": "icoTokensUnsold()", +"92e598f3": "test_fourInvalidEqInt()", +"92e5c9c9": "isBusinessOwnerConfirmed(address)", +"92e8202b": "withdrawInvestmentsOwner(address,address)", +"92e8438c": "issueTokensMulti(address[],uint256[])", +"92e8d866": "DailyGrowthUpdate(uint256)", +"92e9fd5e": "ColdWallet(address,address)", +"92eaa642": "transferLoveStory(bytes16,bytes32,bytes32,uint256)", +"92eada50": "lastBlock_a16Hash_uint256()", +"92eb35bc": "preSaleBonuses(uint256)", +"92ebf860": "invalidateTaskListingAtIndex(uint256)", +"92ec6ea8": "updateAsset(uint256,string,uint256)", +"92ecf577": "getCurrentTerm()", +"92ecf690": "grantToSetUnburnableWallet(address,bool)", +"92ed888b": "CcifToken()", +"92ee0334": "currentUser()", +"92eeee63": "createAndBuyAllAmount(address,address,address,uint256,address,uint256)", +"92eefe9b": "setController(address)", +"92efd277": "countOfDeedsByOwner(address)", +"92f00233": "minterContract()", +"92f00d37": "TalkToExpertToken()", +"92f1fc7d": "bytes32_to_bytes(bytes,bytes)", +"92f351f9": "openTimer()", +"92f461ed": "getTeamsOfOwner(address)", +"92f48846": "updateTokenSellAmount(uint256)", +"92f4d225": "spankToken()", +"92f52ddf": "DICE()", +"92f53757": "GLAM()", +"92f5cea7": "bytes32ToString(bytes32,bytes32)", +"92f692ea": "setInvitationValidPeriod(uint256)", +"92f6a74f": "totalTokenCapToCreate()", +"92f7ba17": "MELONPORT_COMPANY_STAKE()", +"92f8de45": "MXToken()", +"92f926e5": "makeMoveBro()", +"92f96115": "setPartialTransfers(address,bool)", +"92fa1453": "BankAccount()", +"92faad99": "setLoanParameters(address,bytes32,uint256,uint256,uint256,uint256,uint256)", +"92fb4acd": "terminatePackage(address)", +"92fb7ef8": "burnPoll(uint256)", +"92fd1c2d": "bat_match(uint256[])", +"92fd1f01": "getPayeeAddress(bytes32,uint8)", +"92fe028b": "PokerWinner()", +"92fe4098": "b32ToBytes(bytes32)", +"92fee51a": "setICORatio(uint256)", +"92ff0d31": "transferable()", +"92ff3751": "getMatchHomePlayers(uint256)", +"92ff4be4": "finalLottery()", +"92ff7859": "newFutureLottery(uint256,uint256)", +"93003033": "tokenSalesAll(uint256)", +"93004e62": "initPayoutTable(uint256,uint256)", +"93012d5f": "Loan(uint8)", +"9301bc88": "mapping(address,uint256)", +"9301eb36": "setItemOption(uint256,string)", +"9303633e": "tier_rate_2()", +"930429ea": "setFOUNDERS_POOL_ADDR(address)", +"93046a13": "withdrawEtherPayment()", +"9304ddc8": "setUnitCreationFee(uint256)", +"93051424": "KIUSToken()", +"9305b0f8": "WorldSafetySecurityToken()", +"9306099f": "GxOrders(address)", +"930622ed": "assignedAmountToMarketExpand()", +"9306635a": "PETRO(uint256,string,uint8,string)", +"93072684": "revokeDelegateSigned(address,uint8,bytes32,bytes32,bytes32,address)", +"9307ca0f": "houseKeep(int256,uint256)", +"93080cd4": "replaceChannelContractAddress(address)", +"9308151b": "crowdSaleTokens()", +"9308353f": "payin()", +"9308a865": "total_raised()", +"930916b2": "setInviteCode(string)", +"930a0daa": "checkMinimumQuota(address,uint256)", +"930a80b4": "testAuthorizedSetPackage()", +"930a9d92": "tradeOrder(address[3],uint256[5],int256,int256,uint8,bytes32,bytes32)", +"930ae8b0": "setSaleFlag(bool)", +"930b7a23": "approveOnce(address,uint256)", +"930bbbed": "changeBeedingCost(uint256)", +"930c0bba": "getWithdrawalEntryForFunder(address)", +"930c1198": "crowdsale(address,uint256)", +"930c2003": "victim()", +"930c57f3": "PublicSale(address,address,uint256,uint256,uint256)", +"930cb83e": "registerUsers(address[],uint256[],uint256[],uint256[],uint256[])", +"930cbf89": "ProposalAdded(uint256,address)", +"930cd62e": "getIcoInvestorsAddressesCount()", +"930d54b4": "revealSeckey(uint256,bytes32)", +"930db1ab": "setHijackPrice(uint256)", +"930ddb8e": "getIdea(address)", +"930e1173": "tokensReadyForRelease(uint256)", +"930e23b9": "_STCnContract()", +"930ed251": "getSavedVar()", +"930f5fbe": "setApplicationChecksum(bytes32)", +"930fed29": "EnkronosToken()", +"931010eb": "tokPrizes(uint256)", +"93107071": "PDAToken()", +"9310ba96": "TIX(uint256,address,uint256[],uint256[])", +"93119312": "returnMoney()", +"9312434e": "cryptocompareUsdOracleUrl(bytes32)", +"931274c8": "createContractScene(string,uint256[])", +"9312766d": "BSTokenData(address)", +"9313053e": "createItems(address)", +"93138faa": "isProviderParamInitialized(address,bytes32)", +"9313919a": "multipleShotTokenRepartition(uint256,uint256)", +"9313dc43": "claimTokensFromErc677(address,address)", +"9314be9d": "lock(bytes32,bytes32)", +"931634fd": "PGTBToken()", +"93167204": "teamTokensPercent()", +"931688cb": "updateBaseURI(string)", +"9316c3e7": "transferBulk(address[],uint256[])", +"931742d3": "commissionAddress()", +"9317cb37": "CUTOFF_PRESALE_ONE()", +"9317d6d3": "totalReceived(bytes32)", +"93183dc9": "paymentManager(address,uint256)", +"93192c65": "ProposalAdded(address,uint256,uint256,string,bytes32)", +"931983ad": "Connection(address,address)", +"9319f44d": "rateTierNormal()", +"931a4c5b": "maxContributionPhase2()", +"931a5256": "addOrder(uint256,uint256,address,address,uint256,address)", +"931b3385": "claimToken(address,string)", +"931c0040": "carrotsMultiplier()", +"931c6246": "VestingWallet(address)", +"931c8ba7": "count_products()", +"931cd0cc": "setBQL(uint256)", +"931dab50": "allocationAmount(uint256)", +"931df75f": "validateProposedThroneName(bytes)", +"931e44e2": "BuyLandsByEth(uint256)", +"931e7daa": "BettingKing()", +"931fbdd8": "Trenggalek()", +"9321cb7d": "SGT()", +"9321dc5f": "initRequest(uint256[])", +"9321e603": "changeMtcDailyLimit(uint256)", +"932354c1": "updateLocation(string)", +"93237833": "CONTRACT_HOLDER_BONUS()", +"9323eaad": "awardUnitRafflePrize(address,uint256)", +"9324dfff": "addWhitelistedTokenAddr(address)", +"93253a9d": "PublickOffering()", +"93257d33": "CheckForFloating(address,uint256)", +"93272baf": "getTokenType(address)", +"93275889": "ChangeTax(uint16)", +"9327891e": "testSetRole()", +"932838a1": "setCell(address,uint256)", +"9328bfc1": "getNumMessages(address,address)", +"9328fa02": "capitalAllocatedTo(address)", +"9329066c": "getJackpot()", +"93299395": "revokeEditAgentAuthorization(address)", +"9329f2fe": "postico_startdate()", +"932a0ee7": "getShowTextBytes96()", +"932a7b2e": "addApp(address,address)", +"932adda2": "newNode(bytes32,bytes32,bytes32,bytes32,bytes32)", +"932ae363": "buyerNumDeals(address)", +"932bead7": "updatePlanetURL(uint256,uint256,uint256,string)", +"932c1081": "closedHour(uint8)", +"932c360d": "SpaceRegistry()", +"932c90f3": "SUPPLY_FOR_TEAM()", +"932cd73e": "tokensReleasedToTeam()", +"932db761": "profitsFromBitnationDebitCard()", +"932def2e": "tgrCurrentStage()", +"932e1c76": "distributeEbyteForETH(address[])", +"932e2e95": "_withdrawEthereum(uint256)", +"932f4588": "RaffleResult(uint256,uint256,uint256,address,address,address,uint256,bytes32)", +"932f9f89": "testThrowInvalidProvider()", +"932fad1f": "totalWageredForOutcome(uint8)", +"932fd99f": "toHighestDenomination(uint256)", +"932fec40": "refundToken(address,address,uint256)", +"9330f97f": "removeDestinationByIndex(uint256)", +"93311632": "getTokenClaim(uint256)", +"93316cdf": "selltoken(uint256)", +"9331a922": "get_layer(uint256)", +"93320f2e": "expRequiredToReachLevel(uint256)", +"93325812": "addFreelancerTotalInvoiced(address,address,uint256)", +"9332b62c": "changeAllowAllWhitelistTransfers(bool)", +"93331892": "batch(address[],uint256)", +"9333a122": "ITECH()", +"9333cf5e": "communityPeriodAmount()", +"9333d6c0": "MILL()", +"933426f5": "GoolaToken(address,address,address)", +"93348f45": "ovedclaimBountyairdropMultiple(address[],uint256)", +"9334ab61": "Infos()", +"9334ad0d": "getVersions(address,bytes32,address,bytes32)", +"9335427c": "fullWithdrawnProfit()", +"93358320": "withdrawOwnerToken(uint256)", +"9335dcb7": "ownerWallet()", +"93361078": "confirmStartWork(uint256)", +"9338cbdd": "monToTrainer(uint64)", +"93395d99": "TalksChain()", +"93399949": "GTDCStandardToken(uint256,string,uint8,string)", +"9339c01a": "validICOPurchase()", +"9339e942": "check_flag(bytes32)", +"933aa667": "isPermission(bytes4)", +"933ba413": "totalEthInWei()", +"933bf760": "extend_life_of_contract(uint256)", +"933c798c": "next_payout()", +"933dc51b": "setUint256(int256,uint256,uint256)", +"93402e17": "setRewardManger(address,address)", +"934076f1": "BetOnMatch(address)", +"9341231c": "sendOrThrow(address,uint256)", +"9341287d": "setMetadataUrlPrefix(string)", +"9341aa4e": "initializeDistribution(address)", +"9341bc00": "drones(uint256)", +"934209ce": "rank()", +"9342160b": "eligibleCheckAndIncrement(uint256,uint256)", +"93423e9c": "getAccountBalance(address)", +"934354e7": "finishSpin()", +"93437b52": "Fibremoney()", +"93439950": "test_chain2_2_increaseBlocksBy5()", +"9344a0b6": "addAddressToRegistry(address)", +"9344b0d6": "playerCompleteGames(address,uint256)", +"9344c50f": "getNameOf(address,address)", +"93465da6": "Error(uint128)", +"934689a9": "getTokenCreator(uint256)", +"93469800": "minPower_()", +"93470fa8": "listMultipleItems(uint256[],uint256,address,uint256)", +"93474a4b": "getParticNum()", +"93478221": "LogSender2(address,address)", +"934865d0": "TransactionBlocked(address,uint256)", +"9348b810": "contractorTransferFrom_Bcoupon(address,address,uint256)", +"9348caf7": "testBuyTenTokens()", +"9348cef7": "reveal(uint256,uint256)", +"9348ff61": "setUSDRaised(uint256)", +"9349ba44": "AirRopToken()", +"934a029d": "getVoteAtTxForUser(bytes32,address)", +"934a0b57": "AXXToken()", +"934aa023": "charity()", +"934bb037": "MainBank()", +"934bc29d": "exampleFunction(uint256)", +"934c563f": "dataOf(uint256,uint256)", +"934d8a2e": "TokToken()", +"934db458": "Big()", +"934e03a4": "toBool(bytes32)", +"934e860d": "addOnHold(uint256)", +"934ea572": "w_Reserv()", +"934f92af": "ZebiCoinTempMgr(address,address,address)", +"93503337": "isAllowed(bytes32,uint256)", +"9351327f": "USD_PER_ETHER()", +"935146d0": "createMatch(string,string,uint256,uint256)", +"93519d66": "requestClearing(bytes32)", +"9351a8d7": "managementWithdraw(uint256)", +"9352fad2": "run(string)", +"93545a79": "isAmountBonus()", +"93559bc6": "lifeCoin()", +"9355d6db": "MadTok()", +"9355eb25": "privilege()", +"935600ce": "subRegistrationPeriod(bytes32)", +"9356b1fe": "BWCHToken(uint256,string,string)", +"9356e87f": "getLastMulti()", +"935814a6": "confirmRewardsWithdrawal()", +"93588a14": "setTop(uint256,address,uint256,bool)", +"9358928b": "circulatingSupply()", +"93595b66": "tokenSetMintFeeReceiver(address,address,address,address)", +"935aae40": "MINIMUM_BET()", +"935b1624": "get_first_global_audit_document()", +"935b2b1f": "buyBox2()", +"935b7dbd": "buyFor(address,uint256,uint256)", +"935bb767": "setPrices(uint256,uint256,bool)", +"935c1fb1": "addressIndex(address)", +"935cac39": "internalTransferFrom(address,address,uint256)", +"935d29d6": "BPToken()", +"935d647f": "getPublicForSecretFor(bytes32)", +"935dfb71": "adjusted()", +"935e1533": "processFinishLottery(address)", +"935e97c2": "settleTransactionByMediator(uint256,uint256,uint256)", +"935eb35f": "addToBlacklist(address[])", +"935ebb78": "MAX_USD_FUNDING()", +"935eeddc": "CarUpdated(uint256)", +"935f43b2": "ipart(int128)", +"935f4c18": "sendPayment(address,uint256)", +"935fb955": "Mytoken(uint256)", +"93602379": "_transferCar(address,uint256)", +"936061cd": "claimWinner(address)", +"93608dfb": "earlySuccessTimestamp()", +"9360b138": "sendTokensTo(address[],uint256)", +"936224b8": "midEtherBonusValue()", +"93623fb8": "changeAcceptDice(bool)", +"936241b7": "hunterLicenceEarning()", +"93627f42": "globalMax()", +"9362917c": "FuckKuanLi()", +"9362e50e": "changeDeveloperSENSDestinationAddress(address)", +"936315d6": "canReveal(address)", +"93632ddd": "totalBNBContributed()", +"93634702": "isValidSignature(bytes32,address,bytes)", +"9363933c": "GizerItems()", +"9363a141": "getDepositCount()", +"9363c812": "floorPrice()", +"9363fb71": "totalFreeTokensDistributed()", +"9364003c": "HDC()", +"93643a5b": "fazzycoin()", +"936597da": "mLoadAndReturn(bool)", +"9366804f": "checkForJoin(uint256,address,uint256)", +"9366fd5c": "getEvaluationByRecorderID(uint32,uint64)", +"936710bf": "getBalanceOfAccount(address)", +"9367a863": "t_Andrey()", +"9367f8de": "SPCToken()", +"93683f3d": "changeReserveBountyRecipient(address)", +"9368f482": "_betterThan(address,address)", +"9368f72c": "burnFromToken(address,uint256)", +"93694f67": "opponent()", +"936b360d": "Tachyon(uint256,string,uint8,string)", +"936b603d": "contributorTokens()", +"936bbf9a": "totalPostIcoContributorIds()", +"936bfa40": "the120address()", +"936bfc63": "OrcERC20()", +"936c9bc9": "ICOdeadline()", +"936cfb0e": "transferInternal(address,address,uint256,bytes)", +"936d2b0f": "addProductAtId(uint256,string,uint8)", +"936e9904": "AUCoin()", +"936ec951": "afterEach()", +"936f67ea": "CryptoStorage()", +"936f8a40": "setMinBuy(uint256,uint256,uint256)", +"936fddcb": "VULCAN_PROMETHEUS_EXTRACTION_BASE()", +"93709788": "forwardManyTransaction(uint256[])", +"9370a07c": "TSVC()", +"9371c369": "applicationRejected(address,address)", +"9371de6e": "unsoldVUPDestination()", +"93720b2f": "giveAways(address,uint256,uint256)", +"93736419": "UpdateUserExpire(address,uint32)", +"9373ad6c": "inviteFinished()", +"9373b8bd": "claimAddresses(address[],uint256)", +"9373e2a1": "CircleCrowdsale(uint256,address)", +"9373f432": "setWithdrawWallet(address)", +"93741a3e": "iterate(string)", +"93742d83": "makeBet(uint8,uint8,uint8,uint8,uint8,uint8,address)", +"9374c487": "overshoot()", +"9374ec98": "whiteListMge()", +"9375206a": "setAllowed(address[],uint8,bool)", +"93762cff": "_resetMine()", +"93766a57": "trade(address,uint256,address,address,uint256,uint256,bool)", +"93768820": "isCommunityToken(address)", +"9377530f": "grandTotalClaimed()", +"93778e2d": "setCompte_6(string)", +"9378a9e2": "setUInt(uint256)", +"9378f08f": "ScamStampToken()", +"9379077f": "bookDayVisit(uint256)", +"93790f44": "getKey(address)", +"93791262": "performInit()", +"93796317": "InternationalTourismPublicChain(uint256,string,uint8,string)", +"93798ff5": "BuurmansToken()", +"9379d936": "calculateBonus(uint8,uint256,uint256)", +"937a7ac5": "moveStageWithdrawn()", +"937a9151": "WBIToken(uint256,string,string)", +"937adbe6": "isInTerm(address)", +"937b19ef": "EtherRoyalToken()", +"937b7cf1": "contractFallback(address,address,uint256,bytes)", +"937c0cdf": "priviledgedAddress()", +"937c0d0a": "aaa()", +"937c9e3c": "CandyLandSale(address)", +"937cde20": "hasPass(address)", +"937dc72f": "AppCoins()", +"937e09b1": "minimumContribution()", +"937e909b": "reservesPerTokenDest(address,uint256)", +"937ebbd2": "sendTokensToBountyOwner()", +"937ef8e3": "getUserReferralsProfit(address)", +"937f2e33": "claimMyTokens()", +"937f6e77": "setInfo(string)", +"937fd355": "initializeBasicFundraiser(uint256,uint256,uint256,address)", +"93801acb": "deleteList()", +"93806144": "getPunitoryInterest(uint256)", +"93808351": "setPriceInternal(address,uint256)", +"9380b8e7": "testFailAddingMembers()", +"93813782": "Tasoha()", +"938199a5": "getDateOfLastPayment()", +"9381da6e": "getEstateData(uint256)", +"9381e53f": "TokensCollected(address,uint256)", +"9381ebfa": "EUAHTOKEN()", +"9382ef65": "prvdWallet()", +"93830c74": "solUpDownVote(bool,uint32,address)", +"9383d4e6": "SingularityTest14()", +"93847d54": "TRLCoinSale(address)", +"9384f31e": "SingularityTest19()", +"93854494": "factHash()", +"93859188": "amount_bonus()", +"93867fb5": "roleAdmin()", +"9388b560": "TOKENS_ALLOCATED_TO_SERVUS()", +"9389c5b5": "setPackPrice(uint256,uint256,uint256)", +"938a465e": "TOKETH_PRESALE_ONE()", +"938ae4cc": "testThrowDisownNotTransferable()", +"938b5f32": "origin()", +"938b643b": "TimeToMeet()", +"938bcd67": "getChannelIdentifier(address,address)", +"938c4307": "scheduleCall(bytes4,bytes,uint16,uint8,uint256,uint256,uint256,uint256,uint256)", +"938d0444": "SmileToken()", +"938d2f46": "escrowDeletion(address,address,uint256)", +"938d9632": "activekey()", +"938da22d": "secondReleaseTime()", +"938db92e": "ICO_Tier()", +"938e6fcc": "MiningStart(uint256,uint256,uint256)", +"938f3cc4": "create(address,address,address,address,address,address,address,string,string)", +"938f407a": "removeFromWhitelistInternal(address,uint256)", +"938f6c5f": "getBountyTokens()", +"938f7064": "createTopic(string,string,uint256)", +"93904aae": "coinToBurn()", +"939090f8": "deposit4(address,address)", +"93911ff8": "addTrades(address[],uint256[])", +"93920e8f": "invest(address[],uint256)", +"93924147": "MoveFromBase(uint256)", +"93928c91": "thirdBonus()", +"9392e5b5": "erase(uint256,uint256)", +"93930020": "getLastConsolationPrize()", +"9393c09c": "addFabric(address,address)", +"93940e0a": "INTLToken()", +"939528b1": "transferProposalCooldown()", +"939624ab": "removeStake(uint256)", +"9396a7f0": "getQuickBuyPathLength()", +"9396df32": "advertisingPercent()", +"939729c1": "installerPercentage()", +"9397afcb": "PlayingCrypto()", +"9397f2a2": "weekOneRate()", +"939802af": "getDataForTokenId(uint256)", +"93986193": "realizedTokenBalance(address)", +"9398e0cd": "data(int256)", +"9398ecb6": "setMaxParcels(uint256)", +"939935cb": "startTimeInMinutes()", +"93997075": "AddCommitteeVoteEvent(address,address)", +"9399869d": "getContractCount()", +"9399dcfb": "PointGameProcess(address,uint256)", +"9399dd7e": "serverEndGameConflict(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,uint256,address,bytes,address,bytes32,bytes32)", +"939a470e": "updateDescriptionHash(string)", +"939a79ac": "demo(string)", +"939a8dc1": "CryptoPepeMarketToken()", +"939b73aa": "getAthlete(uint256)", +"939b7842": "approveMigration(uint256)", +"939bfc79": "TTAC()", +"939c0a66": "AirDrop()", +"939c23b6": "setProtectionForMyUnprotectedCrypton(uint256,uint256)", +"939cda3f": "DgxDemurrageReporter(address,address,address,address)", +"939d3ac4": "sendCommunity()", +"939d8729": "_postValidatePurchase(address,uint256,uint256)", +"939de809": "checkSale()", +"939e014e": "optionTransfer(address,uint256,uint256)", +"939e436c": "weiPerContributor(address)", +"939ea4f8": "bombs(uint8)", +"939fb3bf": "Owanble()", +"93a00d27": "rektCoinCashSafe()", +"93a09352": "setValue(string)", +"93a0c742": "getIdeaParties(uint256)", +"93a0dc08": "disableAffiliate()", +"93a2f88d": "gettopid(address)", +"93a2fa6c": "Emission(uint8,uint256)", +"93a31509": "LEXToken()", +"93a32f62": "assignToken(address)", +"93a378da": "addHodlerStake(address,uint256)", +"93a408d7": "priceUSD()", +"93a422bb": "updUserBlackList(address[],address[])", +"93a45612": "SetPresaleHandler(address)", +"93a52980": "getTotalEtherPool(uint8)", +"93a595f5": "repayLoan(address,uint256)", +"93a5a9da": "resignTrustee()", +"93a69ae0": "eForecastGambleToken()", +"93a8333e": "Count()", +"93a91682": "curPrice()", +"93a91f25": "setInitialAllocation(address[],bytes32[],uint256[])", +"93a95fa8": "superPowerFulDragonOwner()", +"93a962fc": "addUndergraduate(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)", +"93a991af": "withdrawDai(uint256)", +"93aa3014": "BarryUtilityCoin()", +"93aa5ca8": "BITNOT(bytes32)", +"93aababc": "setlockBalance(address,uint256)", +"93aacd7d": "ownerLabel()", +"93abc530": "getSubscriptionOwner(bytes32)", +"93ac3638": "setAuctionAddress(address)", +"93ac3905": "lastGateway()", +"93ac5048": "BitallexToken()", +"93ac7c83": "EVTCToken(address,uint256)", +"93adf28b": "PumpAndDump()", +"93aef871": "checkSolved()", +"93af0292": "complete(address)", +"93af339f": "cardDrawPrice()", +"93af8ed4": "maybeChangePrice()", +"93afbdae": "repriceAuctions(uint256[],uint256[],uint256[],uint256)", +"93affe51": "getBoth()", +"93b14daa": "right14(uint256)", +"93b155af": "win(bytes32)", +"93b16ff5": "IkuraBurn(address,uint256)", +"93b1d4c7": "OfferingRegistry(address)", +"93b212bc": "subWithdraw(address)", +"93b21c8c": "destroyThreshold()", +"93b2467e": "totalSold(uint256)", +"93b30efc": "doSellerRequestCancel(bytes16,address,address,uint256,uint16,uint128)", +"93b3a368": "getCorrespondingIntegerValue(bytes32,uint8,uint256)", +"93b3bb35": "VisualFodderCoin()", +"93b3cc6b": "getRandomSeed()", +"93b4a73c": "KITTOKEN()", +"93b4c69b": "_assignRole(address,bytes32,address,uint256)", +"93b557db": "dSetArbitraryData(bytes32,bytes,bytes)", +"93b69f86": "getPlayerCoin(address,address,uint256)", +"93b71fe5": "Dao1901Votes(address)", +"93b7e7cb": "addCancellation(address)", +"93b8386d": "agencyOf(address)", +"93b8e90d": "isMasterAccount(address)", +"93ba3f15": "propose(address,uint256,bytes)", +"93baa6ef": "InterfaceImplementerSet(address,bytes32,address)", +"93bb3aee": "betAddressArray(uint256)", +"93bbafd1": "earlyBirdInvestments(address)", +"93bc771a": "ceoDevfund()", +"93bc96fa": "withdrawTo(uint256)", +"93bcabb7": "pullRow(uint256)", +"93bd0142": "ETHERDELTA_ADDR()", +"93bd1484": "mintApproveClear(address,address)", +"93bd27de": "IOweYou()", +"93bd4fc4": "depositAgent(uint256,uint256,uint256,string,uint256,string)", +"93bd90c4": "richtokenIndexToApproved(uint256)", +"93be0f83": "MSPT()", +"93bebdec": "corporationContract()", +"93c0771c": "getGamesPlayers(uint256)", +"93c166ec": "computeEndowment(uint256,uint256,uint256,uint256)", +"93c19e18": "rate0()", +"93c2c7f0": "getClosingSettle(bytes32)", +"93c2f482": "maxRound()", +"93c32e06": "changeFounder(address)", +"93c38965": "getData_15()", +"93c434e5": "getOptionInfo(uint256,uint256)", +"93c4ade0": "viewMaxShares()", +"93c5186c": "isNewPrice()", +"93c573c0": "maxChequeValue()", +"93c5ace0": "walletTokenTeam()", +"93c6475c": "processBet(uint8,uint256,uint256,int256,bytes32,bytes32)", +"93c69927": "sizeOfBool()", +"93c7ca84": "countBet()", +"93c7e009": "AddTrustedContractAddress(address,address)", +"93c8b0d4": "addForeignChild(bytes32,bytes32)", +"93c92b73": "exchangeRateArray()", +"93c94acb": "calculateRewards(uint256[3][3])", +"93c958f3": "ManufactorWallet(string)", +"93c98cbc": "ApplicationQualityCoin()", +"93c9b63e": "SGTCoin(uint256)", +"93ca5de7": "CIzTezt(string)", +"93cb1a4e": "originalHash()", +"93cc6d85": "transformDataContract()", +"93cc9162": "taskRejected(uint256,uint256)", +"93cca918": "place()", +"93cd22b8": "addAdministrators(address)", +"93cddbcf": "goldToEur()", +"93ce9791": "emergencyFinalize()", +"93cfd79f": "getVisitorCount()", +"93d07d07": "hoursCount()", +"93d087a2": "setData_33(string)", +"93d0de98": "AirDropContract()", +"93d1217e": "lastBlock_v3Hash_uint256()", +"93d18e92": "processOrder(bytes32)", +"93d22e52": "setEFContract(address,address,uint256)", +"93d25fbc": "getroommoney()", +"93d3173a": "delegateDecreaseApproval(address,uint256,address)", +"93d4673f": "BTCTKN()", +"93d48b11": "zombieToken()", +"93d51daf": "amountofp3d()", +"93d5276b": "investInternal(address)", +"93d5825e": "calculateTokenSell(uint256)", +"93d5908a": "harapan(address,uint256)", +"93d5c520": "DelegateCallToken(uint256)", +"93d60990": "teamWithdraw(uint256)", +"93d68cfa": "preferredSaleStartTime()", +"93d759b8": "allowedAccount()", +"93d76f0e": "DEVELOP_CAP_PER_ROUND()", +"93d79105": "hashRelease(bytes32,bytes32)", +"93d7c6bf": "researchDivPercent()", +"93d81d58": "cancelSubscription(address)", +"93d84bf0": "oraclize_newRandomDSQuery(uint256,uint256,bytes,uint256)", +"93d865e3": "tokensFromPresale()", +"93d88409": "suspendSale()", +"93d90a4e": "HostingIcos()", +"93d91eae": "getFractionalAmount(uint256,uint256)", +"93d96049": "burn_lost()", +"93d9df16": "setCounter(int256)", +"93d9fd74": "getTitulaire_Compte_4()", +"93da1db1": "Profiterole(address,address,address)", +"93da4cfd": "getInvertedPriceInfo(address)", +"93dafba2": "getSubpot(uint256)", +"93db7716": "get_sale_arbits_sold()", +"93dc12e6": "closeProject(uint256)", +"93dd4133": "signedByCLevel(bytes32,bytes)", +"93dd738e": "notifyLegacyClaimed(address)", +"93dd9443": "Community()", +"93dd9866": "summEccles()", +"93de2527": "RegisterStaff(address,string,string,string)", +"93de6c51": "CHGUSDPRICE()", +"93dfbbcb": "setTokenExchangeRate(uint256,uint256,uint256)", +"93dfea8f": "ong()", +"93e02d13": "FallenLeaders()", +"93e1021a": "Participant()", +"93e1595d": "ATTR_CONSUMABLE()", +"93e24b7a": "teamVaultAddr()", +"93e3fca1": "stopGameOnNextRound()", +"93e40f7e": "claimedLength()", +"93e426de": "MIN_WITHDRAW_WEI()", +"93e42dfa": "_withdrawInvestor(address,uint256)", +"93e432d4": "refillGift()", +"93e43bbe": "getPost(bytes32)", +"93e4bf4f": "addPrecommitment(address,uint256,uint256)", +"93e5365f": "maxAddresses()", +"93e580ea": "storageRoot(address,uint256)", +"93e59dc1": "whitelist()", +"93e67bff": "IPFSHash()", +"93e7155b": "swapActivityHandler()", +"93e7d6c6": "createInviteName(bytes32)", +"93e84cd9": "play()", +"93e96174": "getNextDiniRequestId()", +"93e9a084": "lastTime()", +"93ea0e02": "batchTokenTransfer(address[],uint256[])", +"93eade00": "tokenAssignExchange(address,uint256,uint256)", +"93eb049d": "dp()", +"93eb33b3": "notifyDeathConfirmation()", +"93eb3c62": "Send(address,address,uint256)", +"93ed013d": "ecosystemAddr()", +"93ed4426": "extraBonus()", +"93eda78d": "getClaimData3(uint256)", +"93edaf59": "freezers(uint256)", +"93edbe36": "CHELCOIN()", +"93eeb3fb": "checkRate(address,address)", +"93eec1fb": "setName(uint8,uint8,string)", +"93efbdbb": "DPIcoWhitelist()", +"93f0bb51": "order(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"93f1b685": "LuckyPackage()", +"93f27be2": "_assignOverlfowData(uint256)", +"93f2ad91": "ExtremeToken()", +"93f2ba24": "testdiv256_128By256()", +"93f2fa04": "ThingToken()", +"93f32659": "getInitialWithdraw()", +"93f33b88": "notifySale(uint256,uint256,uint256)", +"93f43863": "getEmployerJobs(address,address)", +"93f5ddf2": "ICOStarted(uint256,uint256)", +"93f63e70": "setBenefit(address)", +"93f6fd85": "createCampaign(uint256,bytes32,bytes32,bytes32)", +"93f7cc99": "getPlayerAccount(address)", +"93f826c9": "portfolioSummary(address,address)", +"93f84cfe": "mintTeam(address,uint256)", +"93f85021": "numLeaders()", +"93f8e9f7": "mediumMod()", +"93fa47f1": "lockGoldTransfers(bool)", +"93faf781": "loggedAsStatement(uint256)", +"93fb28bd": "getUnitAttackMultiplier(address,address,uint256)", +"93fc2c8b": "winnerIsDraw()", +"93fc5ebb": "_secondRoundWinnersFight()", +"93fe0237": "updateWhitelist(uint256[],bool)", +"93fe4248": "deleteUIntValue(bytes32)", +"93fea184": "CONTRIBUTIONS_MAX()", +"93fea3fc": "supportValidator(address)", +"93fea8f3": "MahamTestCoin()", +"93feb13b": "ForceSendHelper(address)", +"93ff3e4a": "insertNewUser(uint32,bytes32,address,uint256,uint256,uint256,uint32,bool)", +"93fffddc": "previousContractAddress()", +"94002b57": "goldToken()", +"940064e3": "periodPreITO_hardCapInUSD()", +"94009bbc": "powerUp(address,address,uint256)", +"940147ac": "tribeProducts(address)", +"94014dc0": "weiRaisedPreICO()", +"94018e20": "removeRoles(bytes32[],address,address)", +"9401c82b": "CAECToken()", +"9401d547": "lockExternalTransfer()", +"9401e4e7": "TokensFlushed(address,uint256)", +"94025211": "refundToOtherProcess(address,uint256)", +"9403e8dd": "casino()", +"94044c75": "_invokeTokenRecipient(address,address,uint256,uint256,uint256,uint256)", +"94056c42": "mintTRCToken(address,uint256)", +"9405b406": "ProposalManager()", +"9405c78f": "setQuantity(uint256,uint256)", +"9405de64": "checkAllowance()", +"9405dfdd": "listingId()", +"94062a9d": "minBuyingAmount()", +"94066fb1": "cancelOfferAlice(uint256)", +"9406aea9": "startCall(uint256,uint8,bytes32,bytes32)", +"9406cf59": "setChallengeFeeMultiplier(uint256)", +"9406e273": "NBELToken()", +"94074b03": "getNetworkName()", +"94077c50": "updatePriceAgent(address)", +"9407a688": "allowedForwards(bytes32)", +"9407ea98": "setMarketplaceFee(uint256)", +"94081387": "administrate(uint256)", +"940834be": "MidnightCoin()", +"940900b8": "bookOvernightVisit(uint256)", +"94097168": "burnTokenBurn(uint256)", +"9409962f": "withdrawExtraTokens(address)", +"940a4e45": "distributeReward(uint256)", +"940a6cf5": "getAdministratorCount()", +"940a82a3": "distributeCTS(address[],uint256,uint256)", +"940aa73f": "setMinimumVotingWindow(uint256)", +"940b29b2": "etherReceivers(uint256)", +"940bb344": "burnUnsoldTokens()", +"940beaf5": "getTransactionIds(bool)", +"940c154b": "lockBet(uint256)", +"940c17c0": "CROWD_WEEK4_PERIOD()", +"940d0780": "AdmChange_README(string)", +"940d553f": "FoodTransferEvent(address,address,uint256,address,uint256,uint256)", +"940d5e08": "Alpon()", +"940d72ec": "buyPack(uint8)", +"940dab4c": "prefixedHash()", +"940dbf3e": "invokeOnce()", +"940de97e": "privateSaleStartTime()", +"940df414": "claimAddress(address,uint256)", +"940ebef7": "secondsRemaining()", +"940f02e0": "setDevelopersTokensWallet(address)", +"940f0661": "PrivateLedger()", +"940f851c": "Ballot(uint8)", +"940fae9e": "confirmBoosterQuest(address)", +"9410579d": "_calculatePriceComplement(uint8)", +"94106200": "testFailCreateSameNonce()", +"94107690": "checkPurchaseRecord(address)", +"9411c88b": "TokenContract(uint256)", +"9414d0bf": "initializeUsdReceived()", +"9415931d": "getLastDividendsAmount()", +"941660e5": "getRoundMaxPerUser(uint256)", +"9416893b": "addDemoData()", +"94169f25": "preIcoTotalCollected()", +"9416b423": "toLower(string)", +"94181d27": "lastReparation()", +"94182798": "dna4(uint256)", +"9418b8a6": "closeUsingTrustedRecipient(address,address,uint256)", +"9418d25a": "proveBuy(bytes,int256)", +"94194be4": "openingTimeB()", +"9419768d": "checkBetting(uint256,address)", +"941993f8": "changeCofounderB(address)", +"9419a2da": "setPaymentDetails(uint256,string)", +"9419f17c": "decraseTimeToAction(uint256)", +"9419fd29": "getWidth(uint256)", +"941a4bc7": "getPartnerCash(uint8,address)", +"941a5074": "controllar_account()", +"941a8486": "ownerChangeSellerfee(uint256)", +"941b0161": "addMarket(uint256,uint256,uint256,uint256)", +"941da7b8": "testExpiredBalance()", +"941e98a8": "EMISSION_FOR_SALESTAGE1()", +"941f9580": "rewardKey(address,uint256)", +"94201882": "artistEmail()", +"94224066": "setCityValues(uint256[],uint256,uint256[],uint256[])", +"942273bd": "SAMURAI()", +"942324c3": "getSponsoringCount(uint32)", +"94235f77": "apLockUp(address)", +"9423719b": "tokenBonusForFirst()", +"942385eb": "getPayroll()", +"9423f443": "submitGameResults(uint256)", +"9423fc54": "transferClearingFunction(address)", +"94248eaa": "isStateProjectInProgress()", +"9425753c": "licenseProductId(uint256)", +"9426e226": "validatorSet()", +"94272356": "_setReferrer(address,address)", +"9427aa96": "getBonus(uint256,uint256)", +"9427dfea": "ownerRecoverTokens(address)", +"942802e7": "VULCAN_POD_FTL_SPEED()", +"94282357": "EFASCOIN()", +"9428522a": "getNode(string)", +"9429d441": "reclaimBySender(uint256,address,address,bytes32)", +"942a8ad3": "getAQL(address)", +"942ab177": "MintToggle(bool)", +"942ab286": "buyTicket(uint256[],address,uint256,uint256)", +"942ac303": "goalInEthers()", +"942ae0a7": "renderHelloWorld()", +"942b765a": "getList()", +"942b90d3": "getRewardTable()", +"942bc8d4": "unpauseAngelToken()", +"942d468b": "transferArray(address[],uint256[])", +"942d73b1": "readAddr()", +"942dac28": "amounRefferalWon()", +"942ea466": "getNumber(address)", +"942ff8fc": "inituser(address,uint256)", +"94306ecb": "AutoreleaseDelayed()", +"94313c5b": "getPositionOwedAmount(bytes32)", +"94313f9f": "cleanConsents(bytes32[],address[])", +"943153cf": "StonePaper()", +"9431e412": "getCommunityRates(uint256)", +"9431f5f0": "withdrawFees(bytes)", +"943215ae": "investmentFundWallet()", +"943250c4": "SquirtCoin()", +"9432c92c": "setStartTimeIcoStage1(uint256)", +"9432f0c7": "receiveClosePositionPayout(bytes32,uint256,address,address,address,uint256,uint256,bool)", +"9433a498": "totalFountainSupply()", +"9433a81e": "personIndexToApproved(uint256)", +"9434c981": "createNewMartial(uint256,uint256,uint256)", +"9434d765": "allocated12Months()", +"94353c70": "postMonForClass(uint64,uint32)", +"9435c887": "cancelBid()", +"9437563c": "logPriceBefore()", +"943814f0": "getWhitepaperAt(address,uint256)", +"9438cca8": "cancelEscrow(uint256,uint256)", +"9439060f": "getGameNumber(uint256)", +"943911bc": "getWorseOffer(uint256)", +"943a32bc": "Relay(address)", +"943a5e28": "RENEX_ATOMIC_SETTLEMENT_ID()", +"943b0747": "RewardOffer(address,address,bytes,uint256,uint256,uint128,uint256)", +"943b82f1": "getLimit(uint16)", +"943bd25d": "addNewBetAmount(uint256)", +"943dfef1": "bounty()", +"943e170d": "neededSignatures()", +"943e8216": "vote(uint256,uint8)", +"943eb504": "supplyLocked()", +"943fa364": "MPhoneSeller()", +"943fcc9d": "buyRoseETH(string)", +"943fd51c": "claim2Ply(uint64,uint64,uint64,uint64)", +"9440f01f": "buyCoins(address,uint256)", +"9441268b": "updateGlobalTokenAge()", +"944126f4": "acceptSupport()", +"94412943": "bountyOf(address)", +"9441e646": "addWhiteList(address,address)", +"9442936f": "d(address,address,uint256)", +"94429fa6": "withDrawAnyERC20Token(address,uint256)", +"9442fad9": "deployTokens(uint256[],address[])", +"94431f80": "getAvailableEtherCommissions()", +"94432deb": "fairsale_protection()", +"944358e0": "getContributedAmountInWei(address)", +"9443b9be": "TokenTimeLock(address)", +"9444991d": "getVotingListCount()", +"9445eb3a": "Terminate()", +"94465bf6": "adjustDuration(uint256)", +"94477104": "vestedOf(address)", +"9447fd0a": "until()", +"9448807a": "secondPay()", +"9448bcea": "getPlayerRoundNums(uint256,address)", +"94493c43": "getLockCount()", +"94495468": "totalTokenRice()", +"9449a361": "setStakeRequirements(uint256,uint256)", +"944a1a75": "CELION()", +"944abc22": "_updateCurrentPeriod()", +"944ac0c6": "MAIN_SALE_START_TIME()", +"944af2ae": "TegTokens(uint256,string,string)", +"944b7c3f": "getMaxNumberOfTokens()", +"944c1d97": "resetPeriod()", +"944c8929": "checkBeatingPrice(uint256,bool)", +"944d4505": "IqraChishti()", +"944da654": "editModule(uint256,uint256,address,bytes4)", +"944dc22c": "addRemovableIdArrayItem(address,uint256[],string,string,string,uint256)", +"944ea02d": "checkTokenBalanceState(address)", +"944ea477": "OPERATION_AMOUNT()", +"944f0499": "transferTokensFromTeamAddress2(address,uint256)", +"944f0e64": "tokenInfoParametersReady()", +"9450b1c8": "addCharityFundation(string,string,string)", +"9451bca7": "result_votes()", +"9451f865": "TestConf()", +"94525e12": "lowRate()", +"94532ced": "blockSettle(uint64,uint64,bytes)", +"9453b95d": "addOrUpdateAccounts(address[],uint256[],uint256[])", +"9453f381": "getBeneficiaryCash(address)", +"9453f767": "createOrder(string,address)", +"94543c15": "isDeprecated(address)", +"94544e64": "transferFeePercent()", +"94555d1a": "addSubscriber(address)", +"94558862": "setRewardClaimed(address,uint256)", +"9455924f": "getTotalVolumeToken(address)", +"94566d25": "jobPost()", +"9456e5b5": "stockSet()", +"9456f7e9": "getHashByTokenId(uint256)", +"9456fbcc": "withdrawERC20(address,address)", +"94579680": "changeUserGrowthAddress(address)", +"9457c1dc": "enableMigration(address)", +"9457c68a": "forceEndCall()", +"9458434f": "mainWeiRaised()", +"94594625": "distributeAirdrop(address[],uint256)", +"9459c254": "refund(address,string,uint256,uint256,uint256)", +"945a2555": "queryPermissions(address)", +"945aab47": "tokenSaleCap()", +"945ade92": "initialDate()", +"945c6cf8": "burn_all_unsold()", +"945c7438": "sign(address,int256)", +"945c7c59": "distributeTokenSale(uint256,uint256,uint256,uint256)", +"945d7b7e": "tranchesSent()", +"945ddb52": "mainSaleTotalSupply()", +"945e5f24": "roughSupply()", +"94602869": "receiverWithdrawal(uint256)", +"9461446d": "setProcessingFee(uint256)", +"94615fc1": "setFreezingStatus(uint8)", +"946267ec": "mintComplete(uint256,int256)", +"9462eae5": "ChangeContractor(address)", +"9462f02f": "tactics(uint256)", +"9462f4bc": "bytarr(bytes32[])", +"94636cee": "createPromoMonster(uint32,bytes,address)", +"9463d582": "teamOneWin()", +"94642f96": "investorWhiteList(address)", +"94644764": "lookUpClaimerAddress(uint256,address)", +"94650fb8": "Goal()", +"94655f2b": "printMoney()", +"94658690": "parseUserInivte(uint256,uint256)", +"9465c114": "vanishToken(uint256)", +"946644cd": "fun()", +"94679ce7": "changeEtherPrice(uint256)", +"946941ec": "Contribute(bytes24)", +"946a893d": "shopDoublet()", +"946ad94d": "tokenContractEnableTransfers(bool)", +"946ae8df": "FMGHEALTHCARE()", +"946ba496": "ShishuToken(uint256,string,string)", +"946bcc30": "getFounder()", +"946bf4d7": "winningProject()", +"946c0344": "getChallenges(uint256)", +"946ca295": "userTransfer(address,uint256)", +"946d1480": "ethToUsd(uint256)", +"946d8806": "getMyPacifist()", +"946d9204": "initialize(address,address[])", +"946f8876": "updateTierStatus(uint256,uint256)", +"94704818": "fillOrder(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,uint256,bytes)", +"94705167": "enableArbiter(address)", +"94707a95": "_setRate(uint256)", +"9470b0bd": "withdrawFrom(address,uint256)", +"94727b41": "deleteProduct(bytes32)", +"9472b32c": "sale_period()", +"9472eb76": "setPayerString(string)", +"947355df": "addToList(string,address[])", +"94737987": "referralProgram(bool,uint256)", +"94741017": "failCrowdsale()", +"94756e22": "VikoChain(string,string,address)", +"94759c36": "createQuote(uint256,uint256,bytes32)", +"9476760d": "AthletiCoin(address,address)", +"947721dd": "refundEndDate()", +"947846a4": "RefundableCrowdsale(uint256)", +"9478a7c9": "getReferralOf(address)", +"9478ab8c": "ethUsdPrice()", +"9478ba47": "calcUnclaimedFees(uint256)", +"9478f7cf": "_receiveEth()", +"9479a732": "sell_car(uint256)", +"9479f2c7": "STAKE_DEADLINE()", +"947a3168": "token_name()", +"947a36fb": "interval()", +"947aca55": "addMasterAccount(address)", +"947af462": "setBurnRequestAddressMap(uint256,string,address)", +"947bc72d": "MAX_TRANSFER_TIMSPAN()", +"947bd798": "rawManuallyMintTokens(address,uint256)", +"947cbc1e": "dariatest()", +"947e8a26": "TOKEN_MINTING()", +"947f7d1d": "newRandom()", +"947f8ede": "IcoCapChanged(address,uint256)", +"947f97cc": "getUnsoldTokens(uint256)", +"947f996d": "testGreatherThan()", +"947fd341": "getCoefficientMultiplier(string,string,string)", +"9480cd1a": "getPillarRoundsKitties(uint8,uint256)", +"94828ee8": "DelightToken()", +"94836dab": "sendFounders()", +"9483e91a": "withdraw(address,uint256,bytes,uint256)", +"9483f25c": "updateProfile(string,string,string,string)", +"948623dd": "buy(address,bytes,bytes32)", +"94868f7d": "airDropPayableTag()", +"948759d5": "transfermulti(address[],uint256[])", +"94876995": "isHandleAvailable(bytes32)", +"9489fa84": "calcSharePrice()", +"948a70d7": "SingularityTest16()", +"948b557a": "getDispute()", +"948b6790": "getTokensPrice(uint256,bool)", +"948bc5d6": "XfinityUtility()", +"948cd942": "getDronePot()", +"948cfd0c": "updateBootyBase(address)", +"948d902d": "getTokensByETH(uint256)", +"948e1a1c": "AVAILABLE_TOKENS()", +"948f1daa": "mintLockPeriod(address,uint256,uint256)", +"948f5076": "setCache(address)", +"949076b6": "ensureInterval()", +"94910d60": "createContract(address,address,uint256,string)", +"9491a8eb": "updatemktValue(uint256)", +"949201d7": "LOG_FailedSend(address,uint256)", +"94923fd7": "LogRevokeNotice(bytes32,address,uint256)", +"9492fbf7": "BGS()", +"94930138": "getLoanUnavailableAmount(bytes32)", +"949319b1": "verifyService(address)", +"9493242c": "returnLender(uint256)", +"9493ac07": "setBattleFee(uint256)", +"9493b9b0": "createMiner()", +"9493f012": "batchSafeTransferFrom(uint256[],address,address)", +"949430f0": "BTC_SUISSE_TIER_1()", +"94953294": "downTheDrain()", +"94954967": "setMaxWhitelistLengthInternal(uint256)", +"9495ad6c": "listExists(bytes32)", +"9495f8c6": "upgradableState()", +"9496df3f": "freezeQuorumPercent()", +"94974aea": "unlockedAtBlockNumber()", +"9497b7a1": "yearlyTeamAmount()", +"9498a265": "updateCertifier(address,address)", +"9498bef5": "overloadedMethod(address,uint256)", +"9498fb26": "ELIX()", +"94992b76": "ICOSTART()", +"94993e52": "_breedWith(uint256,uint256,address)", +"94996680": "setStartTimeStamp(uint256)", +"9499e018": "destructContract()", +"949a6868": "RefundTicket(address,uint256)", +"949a9d59": "receiveWithData(bytes)", +"949b56ef": "whitelistPrincipleLockPeriod()", +"949b9e10": "createHumanStandardToken(address[],uint256[],string,uint8,string)", +"949ba7c3": "GNCCrowdsale(address,address,address)", +"949c5099": "isAwaitingPRETDETokens(address)", +"949c89a0": "BitBaBeToken()", +"949cc9ea": "tokenSupplyBackedByGold()", +"949cfc64": "restTime(address)", +"949d225d": "size()", +"949db658": "rateProvider()", +"949dcdab": "forceWithDrawToInviter(address,uint256)", +"949dfa63": "calculatePurchaseReturn(uint256,uint256,uint8,uint256)", +"949e8acd": "myTokens()", +"949eabff": "fundsRaisedInWei()", +"949eb1c6": "bankersLimit()", +"949f80b0": "RandomExample()", +"949f80c5": "getResult(uint256,uint256)", +"94a08c69": "TOTALSUPPLY()", +"94a0b878": "fromTileId(uint16)", +"94a0c1cc": "cancelVoteForCandidateBySnapshotBlock(address,uint256,uint256)", +"94a1710d": "testNonOwnerCantBreach()", +"94a1be9c": "addVotes(uint256)", +"94a1d75c": "withdrawBidForSketch(uint256)", +"94a224c0": "withdrawExpenses()", +"94a2301e": "tokensInEth()", +"94a535fc": "TokenAdd(uint256,address)", +"94a53d41": "minimal()", +"94a5601a": "getMaxCap(address)", +"94a5c2e4": "maxValue()", +"94a5cccb": "deposit_period(uint256)", +"94a66da2": "GamePlayerCoin()", +"94a66df3": "objectGloves()", +"94a74249": "panicked()", +"94a754e0": "resolveChallenge(uint256,bool)", +"94a771d7": "getReportTimestamp()", +"94a7ef15": "addWhitelistAddress(address)", +"94a80dd9": "getPoolValue(uint256)", +"94a82671": "unRegister(address,string,address)", +"94a89233": "isPluginInterface()", +"94aa6775": "newDeposit(address,address,uint256)", +"94aa8174": "AddParticipant(address,address,string,uint8,string,string,bytes32)", +"94ab9608": "XRRtoken()", +"94abbeaf": "PieToken()", +"94ad4f89": "icoDays()", +"94ae2341": "exchangeHelenium(uint256)", +"94ae4899": "onMintCalled(int256)", +"94ae7ac3": "allowanceAdd(address,uint256)", +"94aef022": "getVariables()", +"94af9da8": "createNewCombination(address)", +"94b0780f": "burntokens(uint256)", +"94b2ffc0": "StarterCoin(uint256,address)", +"94b31fbd": "getTokenAllowance(address,address,address)", +"94b367a3": "_takeOwnership(uint256,address)", +"94b44f3e": "addressToBlock(address[],bool)", +"94b4c93d": "MomentalyOwned()", +"94b5255b": "distributePreBuyersRewards(address[],uint256[])", +"94b5c9f3": "getChampReward(uint256)", +"94b5ed6d": "minorOwnerShares()", +"94b66386": "attackIsland(uint256,uint256)", +"94b67b1c": "getWeakenedDefensePower(uint256)", +"94b8896c": "holdAddress2()", +"94b8e58e": "resetWith(address,address)", +"94b8e72a": "Allocate(address,address,uint256,uint256,bool)", +"94b918de": "swap(uint256)", +"94b91deb": "construct()", +"94b91f06": "PARTNERS()", +"94b941db": "investorInfo(uint256)", +"94b9b62f": "getPacifistmasterReq()", +"94b9bdc4": "BlueDiamond()", +"94b9f152": "cancelConversion(uint256)", +"94bab061": "getVersionNo(bytes)", +"94bacfef": "distributeVLD(address[],uint256,uint256)", +"94bb136f": "minFinnRequired()", +"94bb7d64": "itemHistoryOfPlayer(uint256,address)", +"94bbfb56": "changeAffiliatePercentage(uint256)", +"94bc7df4": "BlocksToGo()", +"94bcdb4c": "Example2()", +"94bd5cb6": "newParityOwner()", +"94bdb93b": "MessageAdded(address,string,uint256)", +"94be2423": "setAtomGen(uint256,uint8)", +"94beb9b2": "ConstructBitcoinClue(bytes32,bytes32,bytes32,bytes32)", +"94bf804d": "mint(uint256,address)", +"94bf8862": "numBoards()", +"94c06a58": "descending()", +"94c0ac22": "ExchangeZWCToToken(address,address,uint256)", +"94c0f3e2": "PRESALE_PERCENTAGE_5()", +"94c176e4": "distributeAll(uint256)", +"94c19fb8": "LogSaleClosed(uint256,uint256)", +"94c1d810": "partFromProvider(uint256,address)", +"94c21ff3": "STATEMENT_HASH()", +"94c275ad": "maxConversionFee()", +"94c33163": "getTotalTokensSold()", +"94c33d90": "districtToBuildings(uint256,uint256)", +"94c3fa2e": "getLastBlockHashUsed()", +"94c41bdb": "getPreferedQtySold()", +"94c467d0": "banAuditor(address)", +"94c475ec": "setAltDeposits(uint256)", +"94c4e3c6": "_getVolumeBonus(uint256,uint256)", +"94c6116f": "getNextPeriodTimestamp()", +"94c62fb5": "SPARCPresale()", +"94c64a2e": "updateBtcRate(string,string)", +"94c69715": "bonusInPhase3()", +"94c70cb1": "bonusEnd20()", +"94c77969": "setTokenContract(address,uint8[],bytes32[],bytes32[])", +"94c87a84": "withrawAllEthOnContract()", +"94c89af5": "FeeProvider()", +"94c8cd62": "AreebaCoin()", +"94c90cac": "EliteCoin()", +"94c9b647": "sendTransaction(address,uint256,int256)", +"94ca9f90": "highestBalance()", +"94cace04": "enableMix()", +"94cb0947": "availableTokens(address)", +"94cc0898": "___test()", +"94ccbc1f": "transferPattern(bytes32,address,string,uint8,bytes32,bytes32)", +"94cdbea1": "SetDappinfo(string,address,address,string,string)", +"94cddaf1": "unlockTeamAndReserveTokens()", +"94cec87b": "preSale3Finished()", +"94cf9b1b": "FGCToken()", +"94cfb3d8": "getItemTempHolders(uint256)", +"94d0025e": "getNumberOfOpenSteps()", +"94d008ef": "mint(address,uint256,bytes)", +"94d02fff": "Authored(string,string,uint8,uint256)", +"94d036bf": "validInitialBuyoutPrice(uint256,uint256)", +"94d10c41": "spendUserBalance(uint32,uint64)", +"94d127a8": "calculateSeedBuy(uint256,uint256)", +"94d1330d": "spinnerCounts(uint256)", +"94d1b7e8": "triggerFailFlags()", +"94d26cb5": "getBetterOrderId(bytes32)", +"94d2b21b": "unauthorizedAddress()", +"94d2bdfe": "addSkill(bytes32)", +"94d2ca12": "getByAlias(bytes32)", +"94d2d7a7": "getCreatorAddress()", +"94d3d38d": "registerHello(bool,uint8,int64,int64,string,string)", +"94d3de83": "TeamVesting(address)", +"94d44f12": "createBattle(uint256)", +"94d453db": "MIN_INVESTMENT_PHASE1()", +"94d45856": "placeBet(bytes32,bytes32,bytes32)", +"94d54581": "EICQERC20()", +"94d5539d": "transferLocked(address,uint256,uint256,uint256[])", +"94d63afd": "left3(uint256)", +"94d645a8": "resolveClaim(address)", +"94d702a4": "tgeNextPartInvestor()", +"94d762c3": "Vault(address)", +"94d77363": "getTokenSold()", +"94d95f8f": "MAX_CONTRIBUTION()", +"94d96fa1": "BTC7200on420()", +"94d9c9c7": "setObserver(address)", +"94d9cf8f": "CreateProxyWithControllerAndRecovery(address,address[],uint256,uint256)", +"94da0746": "PRESALE_TOKEN_ALLOCATION()", +"94dafb16": "geteam(address)", +"94db4d05": "changeStakingContract(address)", +"94dba872": "o_automata(uint256)", +"94dbc70e": "lockState(address)", +"94dbe74e": "removeEscrow(address,address,uint256)", +"94dc6f6b": "splitShares(uint256)", +"94dc7cec": "minBuyForPrize_()", +"94dc84ca": "AUTH_INITCONGRESS()", +"94ddc8c0": "submitBallot(bool)", +"94de3825": "_transferToAnotherAddr(address,uint256,bytes32)", +"94df682d": "loginVerify(bytes32)", +"94dfd38a": "test_invalidValue1EqValue2()", +"94e08fc2": "addProduct(bytes32,uint8,uint8)", +"94e09511": "sendTokenToPlatform(uint256)", +"94e0d371": "stage3()", +"94e0e328": "torchRunner()", +"94e0f844": "totalSellOrdersOf(address)", +"94e10784": "_getRate()", +"94e16386": "teammatesworld(address)", +"94e21fa0": "multiPay(address[],uint256[],address)", +"94e25c37": "unlockCustomer(address)", +"94e2662f": "setRequireWhitelistingBeforeDeposit(bool)", +"94e47e61": "create_block()", +"94e4a822": "split(address[])", +"94e4c808": "IPFSStore()", +"94e50e7a": "getSigner(address,uint40,uint40,uint128,uint256,uint8,bytes32,bytes32)", +"94e5b7e6": "getPlace(uint32)", +"94e5e890": "peculOldAdress()", +"94e8075d": "Development()", +"94e8767d": "uintToBytes(uint256)", +"94e93017": "_deployBallot(bytes32,bytes32,bytes32,uint256,bool,bool)", +"94ea9987": "sendEthersToWinnerAddress(address,uint256)", +"94eb463b": "Unset(address,uint32[])", +"94eba0b5": "StarCoin()", +"94ebd374": "purchaseAccessory(uint256,uint256,string,uint256)", +"94ec233f": "boolCallWithArray(bool,bool[4])", +"94ec3756": "resister(uint8,uint256,uint256)", +"94ec3a0d": "playersRequired()", +"94ec7cf2": "setA_Signature(int256)", +"94ed9b77": "append(address,address)", +"94eedaa4": "hirerReleaseFunds(bytes16,address,address,uint256,uint256)", +"94ef987e": "minimumPayment()", +"94efadea": "zoPrice()", +"94efafe9": "publishTemplate()", +"94effa14": "WithdrawETH(uint256)", +"94f0080c": "getBalancePremiumsPaid(address)", +"94f0b43c": "TripusCandyToken()", +"94f13f4a": "getGameItem(uint256)", +"94f183cb": "get_votes()", +"94f188be": "createIssuedToken(address[],uint256[],uint256,uint256,string,uint8,string)", +"94f29cb3": "medalIfFreeze(address)", +"94f2e623": "setLLV_edit_11(string)", +"94f2ed53": "_unlockNinja(uint256,uint16)", +"94f3217c": "MINIMUMINVESTMENTSALE()", +"94f38799": "GoChain()", +"94f3f81d": "removeAuthorization(address)", +"94f47146": "put(bytes)", +"94f5a1af": "LATOPreICO()", +"94f5ffd5": "betMake(uint256,uint8)", +"94f60a63": "getKudosLeft(address)", +"94f61134": "executeOrder(uint256)", +"94f649dd": "getDeposits(address)", +"94f6ba1c": "getMonsterClassBasic(uint32)", +"94f6e8ed": "initBallotProxy(uint8,bytes32,bytes32,bytes32[4])", +"94f75b96": "PerkToken()", +"94f7624f": "NAP()", +"94f8e954": "cancelInvestment()", +"94f92322": "getTotalPrediction(uint256,uint256)", +"94f976c3": "confirmProduct(uint256)", +"94fa3131": "claimBonus(uint16)", +"94fa5bcd": "setNewApproves()", +"94fabfb3": "getDocData(uint256)", +"94fb54d5": "euroThreshold(uint256)", +"94fb86c0": "referral_ledger()", +"94fd1c1c": "SAIToken(address,address,address)", +"94fdb8df": "HolyBible(uint16,uint16,uint16,uint16)", +"94fdbbb2": "createRedeemMessageHash(uint256,bytes4,bytes32,bytes32)", +"94fe344d": "SimpleToken(uint256,string,uint8,string,bool,bool)", +"94fe6ed1": "kTikTakCoin()", +"94ff1426": "_setTransmuterAddress(address)", +"94ff4b2b": "getServerFee(uint256)", +"94ffb819": "addApprover(address,string)", +"94ffe2c7": "PolicyRegistry(address)", +"95005a00": "LIANGToken()", +"95005b8b": "GetPlayerID(bytes32)", +"9500aa12": "MockController(address,address,address,address)", +"950108d7": "WithdrawForeign(address)", +"95029f34": "PendingOwner()", +"9502bb8a": "renounceMaster()", +"9502d761": "ProposalSubmitted(address,uint256)", +"950311ab": "setCurrentAction(uint256,uint8)", +"95032b62": "rand(uint256,uint256)", +"9503c4b4": "SmartRouletteToken()", +"95040933": "mrk_contract()", +"950463fc": "calculateRefundedEthWithDiscount(uint256)", +"9504f28a": "THBCToken()", +"95050862": "optimalExp(uint256)", +"95059465": "textFor(bytes32)", +"9505b2a7": "createPanda(uint256[2],uint256,uint256)", +"9506681f": "updateminContribution(uint256)", +"95066e33": "getTopic()", +"95068886": "change(address,uint256,address,uint256)", +"95069136": "requestLiquidation(uint256)", +"9506a57a": "Marriage(address)", +"9506a75c": "setChild(address,bytes32,bytes32,bool)", +"9507b53a": "SchedulableToken(address,uint256,uint256)", +"9507d39a": "get(uint256)", +"9508614b": "addStage()", +"9509a265": "allocateDividends()", +"9509ba0c": "getJackpotBalance()", +"950b5273": "currentARXtokenSupply()", +"950b550a": "fourth_withdrawal(uint256)", +"950c004d": "PiXD2019()", +"950c3d79": "LizunToken()", +"950c84e4": "presalePart()", +"950cb89e": "_editPriceOf(uint256,uint256,uint256)", +"950d22f2": "setCheckKYC(bool)", +"950da0c8": "calculation()", +"950da0e6": "hasMinRating(address,address,uint8)", +"950dad19": "burnToken(address)", +"950dff20": "cancelCodeUpdate()", +"950ef8c7": "setAuthorityContractAddress(address)", +"950f4170": "gubbermentOverthrown()", +"950f9813": "rejectPartnerAllocation(address)", +"950fabf3": "Lottery(uint256)", +"95101181": "removeAdminAddress(address)", +"9511309a": "setMinimumCollateralInEthAmount(uint256)", +"951166c0": "totalMessages()", +"9512243e": "TokenPurchase(address,address,uint256,uint256,uint256,uint256,uint256)", +"95127634": "upgradeOracle(address)", +"951303f5": "withdrawableAmount()", +"951367ad": "internalExchange(uint256)", +"951382bf": "mainSaleHasEnded()", +"95139780": "checkTokTotal()", +"951481b4": "addEmployee(uint256,uint256,string)", +"951506d3": "withdrawFeeRateE4()", +"9515a524": "BUSINESS_DEVELOPMENT_SUPPLY_LIMIT()", +"9515af55": "AetherClockAuction(address,uint256)", +"95163f39": "_finalizeStage()", +"9516a104": "getAllAddresses()", +"951717e2": "withdrawPrivateCoinByMan(address,uint256)", +"9518589a": "cost1token()", +"95199b24": "claimWin(bytes32,uint8,bytes32,bytes32)", +"9519e398": "aDeposit(uint256)", +"951b01c5": "setCertifierDb(address)", +"951b22fb": "swap(uint256,address,address,uint256,uint256,uint8,bytes32,bytes32)", +"951b26a3": "changeable()", +"951b73b1": "updateEndTimeManually(uint256)", +"951cfa47": "getScope()", +"951d0332": "_price_tokn_ICO1()", +"951d6c9c": "getDevRewardPercent()", +"951d86a4": "setBlockPerHour(uint256)", +"951e17a1": "totalSupplyForDivision()", +"951ea5f1": "setMarketingTokensPercent(uint256)", +"951f4a6e": "_triggerNFTEvent(address,address,uint256)", +"95206396": "numberLoop()", +"9520a06f": "DEFAULT_CREATION_LIMIT()", +"9520bd46": "multiPay(address[],uint256[])", +"9520cc72": "EtherTradex()", +"9520f878": "NaxomartToken()", +"9521000c": "setOnlyShowPurchased(bool)", +"95210e59": "setBattleRemoveContractAddress(address,address)", +"95217ec9": "newAttack(uint32[])", +"9522ca89": "Message_To_Investors()", +"9524bdf8": "_refundTokenCustomer(uint256,uint256)", +"9525c0cc": "cancelVote(bytes32)", +"9525f382": "finalizeSettingCreation(uint256)", +"95260a29": "PEP()", +"95263183": "setACmarge(uint8)", +"95270cd1": "setOraclizeFee(uint256)", +"95275e5e": "minerLockTime()", +"95286077": "UBETCOIN_LEDGER_TO_LEDGER_ENTRY_DOCUMENT_SHA512()", +"952868b5": "onMaintenance()", +"9528724f": "votedFreeze()", +"952882fd": "addtoEarlyInvestors(address,address,uint256,uint256)", +"9528a278": "getAllInvestorPositions()", +"9528d109": "authorSigned(address)", +"9528fcb5": "numSubscribed()", +"952a84ed": "Rocketship()", +"952a9320": "HexanCoin(uint256,string,uint8,string)", +"952ad7cb": "forwardSomeFunds(uint256)", +"952b264c": "FundsReleased(uint256)", +"952c0f9f": "initGold()", +"952d6c22": "tokenSaleEnd()", +"952f2f6f": "setAccountIsFrozenByDate(address,uint256)", +"95306706": "logTraderTradingTx(string[])", +"953078cd": "withdrawDivsWithContract(address)", +"95311142": "dOwnerErc20Claim(bytes32)", +"9531c536": "ReceivedGBP(address,uint256)", +"9531d072": "refundETH(uint256)", +"953203b5": "doMigration(address)", +"9532c476": "setParcelUsd(uint256)", +"953307d8": "revealScissors(string)", +"95331bf7": "commitPhases()", +"95334db2": "toIndex(address)", +"953440f9": "nCeilings()", +"9534e637": "closePoll(uint256)", +"9535ce12": "getBool(string)", +"95360a02": "calCurrentCrystals(address)", +"95364a84": "isPresale()", +"953669be": "tokenHolders()", +"9536c05f": "doCheckSendBounds()", +"9536e0bb": "returnDirectPayments(address,bool,bool)", +"9537796f": "addSubscriptionBonus(address)", +"95377ad9": "testInequalityUint(int256)", +"9537e8d1": "signContract(uint256)", +"9538833c": "changeOwnerAccept()", +"9539c4de": "withheldAmount(address,address)", +"9539ed7e": "changeFlipper(address)", +"953a03ca": "minMillPurchase()", +"953a7fab": "testMoveBalance()", +"953aa435": "GetPrice(uint8)", +"953b42b3": "buyClusterToken()", +"953b7ef8": "withdrawTeamTokens()", +"953b8fb8": "targetAmount()", +"953bad32": "verificationAddressMap(address)", +"953e3450": "DaoRulesProposalAdded(uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"953e474a": "setKoCommissionAccount(address)", +"954056f7": "setRedemptionWallet(address)", +"9540cb80": "End1()", +"9541945a": "registerNode(bytes16,uint16)", +"9541bc41": "getUSDAmount(uint256)", +"954290f4": "guessPassword(address,uint256,bool)", +"95437056": "AUTH_ADDOWNER()", +"95438548": "DONATION_RATE()", +"95441f9f": "ZEEWANTtoken()", +"95449ad5": "changeTimeInvest(uint256)", +"9545c42c": "minForExistingTopic()", +"95470497": "OTHERCRUISER_EXTRACTION_BASE()", +"95475c1f": "makeChild()", +"9547b44d": "Prepurchased(address,uint256,uint256)", +"95480879": "setDefaultMetadataURI(string)", +"9549355e": "oracalizeReading(uint256)", +"954969f6": "godSetInterfaceContract(address)", +"9549c330": "freezeFrom(address,uint256)", +"9549fea9": "MENSA(address)", +"954a5c19": "addPot()", +"954a8f8b": "TransferWithRef(address,address,uint256,uint256)", +"954ab4b2": "say()", +"954b2be9": "SelflleryYouToken()", +"954cbe3f": "mintSpecial(string,string,uint8,uint256,uint256)", +"954d2cfd": "updateUrl(address,bytes32[5])", +"954db474": "newProject(string,string,uint256)", +"954e8c2d": "buyShares(uint256,address,uint256,uint256)", +"954f3b20": "getTransferHash(address,address,uint256,uint256,uint256)", +"954ff2ad": "founderTokenWallet()", +"9550c023": "AllocationRevoked(address,address,uint256)", +"9551dd58": "listener()", +"955214d1": "LogRecordWin(address,uint256)", +"95522e54": "WeaponTokenize()", +"95523f7d": "newMember(string,uint256)", +"95533f17": "isTokenInList(address)", +"95534e00": "getAccountBlocks(address)", +"95535569": "LianBaoCoin()", +"9553652b": "Goldencloudtoken()", +"9553a19b": "BrengsTeamToken()", +"95543693": "ONE_DECIMAL_QUANTUM_ANZ_TOKEN_PRICE()", +"9554a202": "changeSwapperAdd(address)", +"9554c8e5": "getCrydrStorageAddress()", +"9554f920": "fillChannel(uint256)", +"9554fa12": "multiplies(uint256,uint256)", +"9555a942": "withdrawFrom(address,address,uint256)", +"9555c9d9": "capAdjusted()", +"95564837": "seed(uint256)", +"9556a31d": "GVOptionToken(address,string,string,uint256)", +"9556b05d": "OraclePoloniex()", +"95578ebd": "useDELEGATECALL()", +"95579063": "_bidderHasAnActiveBid(address,uint256,address)", +"9558abde": "sycCrowdsale()", +"9558e916": "teamWithdrawalRecipient()", +"9559225c": "debug_hash3Byte(bytes)", +"955b1535": "checkForNewLeader(uint256)", +"955b5e72": "CTCToken()", +"955d14cd": "getLastTime()", +"955d1721": "availableBalanceInLockingPeriodForInvestor(address)", +"955d4412": "addLocation(uint256)", +"955d4d16": "Wixlar()", +"955d50b7": "TestMasterToken(uint256,string,string)", +"955ef429": "closedown()", +"955f0460": "sgpc(uint256)", +"955ff603": "Viviox()", +"95607ced": "retrieveAll()", +"95608083": "_abortCurrentRound()", +"95612ec0": "allowInvestment()", +"95617dc3": "reportGame(string,uint8,bytes32,bytes32)", +"9561a038": "nextContributorIndex()", +"9561f0d8": "setTradingLive()", +"95621ccd": "theBet(uint256,uint256,uint256)", +"95623641": "marketAddress()", +"956248aa": "determinePayout(uint8,uint8,uint8)", +"95635b37": "addMiner(address,uint256,uint256)", +"9563dbcf": "setPeriods(uint256)", +"95645e34": "initialDistribution()", +"956483c1": "lastBlock_f14Hash_uint256()", +"95648f1b": "getFunctions()", +"95652e4f": "revokeAuthority(address,uint256)", +"95655f04": "getWilds(address)", +"9565f2fe": "AllCash()", +"9565feeb": "isBonusPeriod()", +"9566880b": "s16(bytes1)", +"95669952": "debtor(address,uint256)", +"95671958": "getFileListTail()", +"95671ed7": "logEvent(string,bool)", +"9567a161": "newBet()", +"95693aad": "CompositCoinCrowdsale(uint256)", +"956a2d03": "balance(bytes32,string,address)", +"956a2ea7": "setBidRegistry(address)", +"956a538a": "CoinsRemainAfterICO()", +"956a860d": "getMartialInfo(uint256)", +"956ab5d9": "getParetoBalance(address,address)", +"956b76f7": "setVicepresidenteDeMesa(bytes32,uint256,uint256,bytes32)", +"956cc859": "INIT_SUPPLY()", +"956d2172": "setAttackFee(uint256)", +"956e5f00": "LogEtheraffleChange(address,address,uint256)", +"956e958a": "dungeons(uint256)", +"956f4361": "getCampaignsByCountry(string)", +"956fd9df": "balanceOfPlayers(address)", +"956fffd3": "setFinishICO(uint256)", +"95701be3": "rolloverFeePeriodIfElapsed()", +"9570370f": "bondsOf(address)", +"95709441": "mintReputation(int256,uint256,address,address)", +"95722371": "storeX(uint8[],uint256,uint256,uint256,int256)", +"95722e66": "payPool()", +"95725d8a": "emitRoleAdded(address,uint8)", +"957287ce": "market2()", +"9574f4e1": "createMatch(string,string,uint256,string)", +"957563ec": "setProviderLock(bool)", +"95761c77": "SBCS()", +"9576b180": "initGoldData(uint256,bytes32,bytes32,bytes32)", +"9576bfbd": "setWhiteLister(address)", +"9576e5b3": "registerContract(address,bytes32,bool)", +"9577941d": "LogKill(bytes32,bytes32,address,address,address,uint128,uint128,uint64)", +"9578bce2": "setCreditsTokenPrice(uint256)", +"957908d1": "dequeue()", +"95792430": "grant(address,uint256,uint256,uint256,uint256,uint256,bool)", +"957a2772": "lastBlock_f9()", +"957a6254": "bonusScheme()", +"957aa3d1": "goldmintTeamAddress()", +"957aa58c": "live()", +"957ac9ad": "HappyBeeToken()", +"957b2807": "getPlayerPlayInfo(uint256,uint256,uint256)", +"957b2e56": "reinvestDividends()", +"957b52fb": "fidaPerEther()", +"957b781c": "mintBonus(address)", +"957b8d98": "publicsaleTokens()", +"957bb1e0": "bid(bytes32)", +"957c0ff2": "testNoTokensOneCall()", +"957d8250": "allocateBid(address,bytes32)", +"957dcb1e": "mintReservationTokens(address,uint256)", +"957e05d6": "setAllowTransferLocal(bool)", +"957f050b": "merchantAccount()", +"957f120e": "inPublicPreSalePeriod()", +"957f371f": "totalAmountOfEarlyPurchasesWithoutBonus()", +"957f9a0b": "tryFlush()", +"95803d6c": "STARTING_BULLS()", +"95805dad": "start(uint256)", +"9580811c": "setBalanceAdmin(address,uint256)", +"9580c4bc": "migrateFunds()", +"95816a16": "contributionCap()", +"958174a3": "ParentToken(uint256,string,uint8,string)", +"95818603": "fromTweiToFp(uint256)", +"958222aa": "isTokenTransferable()", +"95829738": "institutions(bytes32)", +"9583102a": "verify_send(address,uint256)", +"958343f9": "setOrderDealSpeed(uint256)", +"9583cf17": "claim_period()", +"9584894c": "getElementInfo(uint256)", +"9584fbfc": "TOKEN_SHARE_OF_TEAM()", +"9585a877": "isGameActivated()", +"958689d7": "emitMintEvent(address,uint256)", +"95878da6": "CurrentICOpublicSupply()", +"958799cb": "recordPurchase(address,uint256)", +"95880360": "setExchangeRatePreIco(uint256)", +"9588378e": "reputationOf(address,bytes32)", +"95883871": "TradeListing(address,address,address,uint256,uint256,bool)", +"958993a5": "allocatePrivatePresaleTokens()", +"958a3698": "setITTMultiSig(address)", +"958a41dd": "upgradeToAndCall(string,address,bytes)", +"958a9937": "createProduct(bytes32,uint128)", +"958b12b9": "ICOCap()", +"958b3f20": "final_fundraise()", +"958b6f55": "checkTokenVesting(address,uint256)", +"958c4be7": "makeCollectibleUnavailableToSale(address,uint256,uint256,int256,uint256)", +"958ce2d5": "Spoke(bytes16,string)", +"958d1725": "getChild(bytes32,uint256)", +"958e0028": "SoarCoin()", +"958f3624": "totalTokenWinValue()", +"958fde82": "newPinnedAppInstance(bytes32,address)", +"95907291": "CaptureTheFlag(string)", +"9590d4b9": "testCount()", +"9590ef13": "Option(string,string,uint8,uint256,address)", +"95910d46": "ownerPrimary()", +"95925814": "undo_deadline()", +"95929d22": "_updateNextAmount()", +"9592d424": "totalNodes()", +"95930b1c": "getAssetPacksUserCreated(address,address)", +"95932df3": "addCustody(address)", +"9593aa9a": "JTOKEN()", +"95949823": "setRemark2(string)", +"959499b6": "withdrawProfit()", +"95955d22": "escrowTransfer(address,address,uint256,uint256)", +"9595898a": "updateCard(uint256)", +"95966c3b": "get_eth_balance(address)", +"95969ba4": "enabledAddresses(address)", +"95977749": "IvoryTest()", +"95978868": "strConcat(string,string,string,string,string)", +"95980858": "currentText()", +"95982228": "Multiowned(address[],uint256)", +"95982f44": "GetLottery(uint8)", +"9598790d": "priceTokenSellWei()", +"95988a26": "proposalsRank()", +"95997c51": "withdraw(uint128,address,uint256)", +"9599ab63": "crowdsaleBonus(uint256)", +"959a1f08": "Hive()", +"959ac484": "push(uint256)", +"959b3fa0": "createSkin(uint128,uint256)", +"959b6916": "setCollectTokenTime(uint256)", +"959b8c3f": "authorizeOperator(address)", +"959c265b": "makePlayerID(address)", +"959ca192": "createCoupons(uint256)", +"959cb555": "address_register(address)", +"959d51f6": "W3SchoolToken(uint256,string,string,uint256)", +"959e4748": "totalIssuanceLastModified()", +"959e90ff": "totalTransactionCount(address)", +"959f601e": "getLimitMaxCrowdsale()", +"95a01505": "presaleStorageVault()", +"95a039ba": "getContractAddress(string,string,string,string)", +"95a078e8": "hasAccess(address)", +"95a08221": "tokensTotalSupply()", +"95a0f5eb": "totalMigrated()", +"95a0f9c7": "removeOffer(uint256)", +"95a1297a": "totalRewardsRedeemed()", +"95a13ff3": "polyComplianceAddress()", +"95a1c14d": "addThreeWayLine(uint256,string,uint256)", +"95a2251f": "redeem(address)", +"95a235ae": "set_deposit_address(address)", +"95a23c3a": "adminsPercent()", +"95a2d14b": "IcoCloseTime()", +"95a3bf6e": "getPayoutRequestedState()", +"95a3e2af": "isAddressFrozen(address)", +"95a47652": "getMintingStatus()", +"95a4f76d": "maxSaleNum()", +"95a50a9d": "monarch()", +"95a51233": "totalSupplyCeiling()", +"95a51669": "buyWithETH(address,uint256)", +"95a5418d": "_patternToNumber(bytes4)", +"95a59ac4": "PacificaToken()", +"95a5dfc0": "yes(uint256,string,uint256)", +"95a6f9ab": "makeProposal(string,uint256,uint256,uint256,uint256,address)", +"95a70863": "setOwner(uint16,address)", +"95a8c58d": "hasRole(address,uint8)", +"95aaa5d9": "BatakToken()", +"95ab32a3": "securityPercent()", +"95ad3d98": "ConnectCoin()", +"95addb90": "questions(bytes32)", +"95adfe72": "getPlayerPrice(uint256)", +"95ae0bf9": "extCreateNinja(uint256,uint256,uint256,uint256,address)", +"95ae66a5": "MilestonePricing(address,uint256,uint256[])", +"95af7006": "setFirstBonusPercent(uint256)", +"95afc05c": "withdrawRefunds()", +"95b1157d": "setLockAccount(address,uint256)", +"95b18bbe": "Created(address,uint256,uint256)", +"95b1e4f2": "addClaim(uint256,address,uint256,bytes32,bytes32,string)", +"95b1f93b": "changeStakerOperation()", +"95b2110a": "queryAirCrash(string)", +"95b25a1c": "Biograffi()", +"95b2d128": "TokenFund(address)", +"95b34f71": "_getTokens(uint256)", +"95b3559f": "CertifyDelegate(address)", +"95b3c92f": "TioToken()", +"95b3dc77": "setTransferableTime(uint256)", +"95b4b88d": "allowanceSub(address,uint256)", +"95b505f0": "getMigrateOutReporterValue()", +"95b537d5": "selfOn()", +"95b5d5ac": "token_ask(address,uint256)", +"95b68fe7": "getTokenToEthInputPrice(uint256)", +"95b6a08d": "canDisburseMultipleTimes()", +"95b71187": "getByFromCount(uint256)", +"95b7c348": "ICOCappedRefundableCrowdsale(uint256,uint256,uint256,address,address)", +"95b7ea26": "GetMaximumBet_ether()", +"95b7f0aa": "_removeAuction(address,uint256)", +"95b890d6": "purchaseTokensWithoutDevelopmentFund(uint256,address)", +"95b8cf55": "signalBackupWithdraw(address)", +"95b8fdef": "setCompte_22(string)", +"95b96e11": "PeriodEnd(uint16,uint256,uint64)", +"95b9bb68": "setCompositionAddress(address)", +"95ba64c9": "LogForbid(bytes32,bytes32,bytes32)", +"95bad022": "countTeam()", +"95bb733b": "CurrentCrowdsale(uint256,uint256,uint256,uint256,address,address,address)", +"95bb8d46": "publicSaleTransfer(address[],uint256[])", +"95bb9fcf": "getHolding(uint256)", +"95bbbe45": "transferFundWalletWallet(address)", +"95bc2673": "remove(bytes32)", +"95bc3bd0": "lockAmount(address)", +"95bc7eec": "payFunction()", +"95bc8515": "setHolder(address,uint256)", +"95bc9538": "changeStatus(uint8)", +"95bda19d": "register(address,uint256,address)", +"95bda742": "_create_user(address,address)", +"95bdca94": "isTyped(address,uint256)", +"95be55a6": "increasePrice_20_February()", +"95be7542": "CoinLLeague()", +"95be9ace": "NewDeal(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,string)", +"95c02700": "ACN()", +"95c08f92": "investmentOf(address)", +"95c0954c": "ownerOfUUID(string)", +"95c0c3f6": "confirmGameEnded(bytes32)", +"95c0c447": "getLimitTypeOf(address)", +"95c0d65c": "editRank(uint256,uint256,uint256)", +"95c0e6c3": "transferOwnershipAtomic(address)", +"95c21ebf": "blueOs()", +"95c26d93": "thirdTierDiscountUpperLimitEther()", +"95c2d845": "driveCar(string)", +"95c303bc": "pyramid(address,uint256,bytes32)", +"95c30910": "unFreeze(address,address)", +"95c3be0b": "participantIndex(uint256)", +"95c3fc9b": "_setPowerBalanceOf(address,uint256)", +"95c43d84": "PHASE2_SUPPLY()", +"95c47416": "VoteOnMyTeslaColor()", +"95c4e59b": "AXIACOIN(address,address)", +"95c55798": "WZCoinToken()", +"95c5a2cc": "halfPercent(uint256)", +"95c5ed9d": "getVoterStatus(bytes32,address)", +"95c6fa61": "keyOf(bytes32,bytes32)", +"95c7a23f": "AutoBuy()", +"95c7b007": "setFreezeTx()", +"95c8d4ee": "grantAllocation(address,uint256,bool)", +"95c92d98": "viewTotalAffiliateCommissions()", +"95c93f8b": "setTierRates(uint256,uint256,uint256,uint256)", +"95c96554": "cancelVote()", +"95c97432": "nSubmittedHashes()", +"95c9f53f": "scaledDividendPerToken()", +"95cc2e8b": "DATE_ICO_START()", +"95cc74fe": "buyFromPartner(address)", +"95ccea67": "emergencyWithdraw(address,uint256)", +"95ccf8bf": "forward(address,address)", +"95cd73a2": "OpCoin()", +"95cd76fa": "getMaxOwners()", +"95ceb4b3": "winningProtocal()", +"95d12000": "ownerPercent()", +"95d22683": "MyUserName(string)", +"95d2b4b4": "_createMonster(uint256,address,uint256,bool,bool,bool)", +"95d38ea8": "mintableToken()", +"95d395dd": "XDToken()", +"95d47f2f": "lastBlock_f8Hash_uint256()", +"95d4f7dd": "primaryGasLimit()", +"95d5766c": "foundersContract()", +"95d5a1be": "SignatureReg()", +"95d5f6fd": "officialSite()", +"95d643a8": "earnings()", +"95d6718a": "grantOf(address)", +"95d697c4": "ProofOfReadToken(uint256,uint256,string,uint8,string)", +"95d793d9": "deposit(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)", +"95d84b30": "_replaceContract(address)", +"95d84d99": "setColorPurple()", +"95d89b41": "symbol()", +"95d8f60d": "sumHardCapICOStage6()", +"95d9a030": "externalControllerCandidate()", +"95d9cc18": "setStdOwner(address,address)", +"95db03fe": "krypteum()", +"95dba6c9": "getHealthForCost(uint32)", +"95dbee2d": "gift(address,address,uint256)", +"95dcac25": "IGTSGD()", +"95dd489b": "winningsPerRound()", +"95dd9193": "borrowBalanceStored(address)", +"95ddb3a6": "setJewelContract(address)", +"95de00a2": "getReservedDestinationInfo(address,bytes32,address)", +"95dea05b": "cleanActions(bytes32[])", +"95e05110": "sumHardCapICOStage3()", +"95e16e97": "validateraffle()", +"95e19fab": "setup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256[],uint256[],uint256[])", +"95e1d9f7": "getGamesForAdmin(address)", +"95e2a953": "etherRatioForInvestor()", +"95e2c773": "privatePreICOdepositors(address)", +"95e2db3d": "getDistributionContracts(address)", +"95e396f9": "crowdsaleTokensWallet()", +"95e3c50b": "tokenToEthSwapInput(uint256,uint256,uint256)", +"95e3cd5c": "preAllocation(uint256,uint256)", +"95e4c1bf": "hasConfirmedRecord(bytes32)", +"95e4d456": "DUNGEON_CREATION_LIMIT()", +"95e517be": "Offer(address,string,address)", +"95e52d98": "documentsCount()", +"95e66ea1": "isLeftTokenIssued()", +"95e77a05": "testItemStrict(bytes)", +"95e7b3c5": "angelRate()", +"95e87385": "availableRef()", +"95e8a67e": "toB32(bytes,bytes)", +"95e8d644": "requestRemoveOwner(address,string)", +"95e8f3e7": "get_hash()", +"95e911a8": "feeBase()", +"95eb84c0": "takeLoanOrderOnChainAsTraderByDelegate(address,bytes32,address,uint256,address,bool)", +"95eb8f15": "Attempt(address,uint256)", +"95eced5f": "ZToken(uint256,string,string)", +"95ecef72": "gSetRunning(bool)", +"95ed857c": "mintPredefinedTokens()", +"95ee1221": "isCancelled()", +"95ee4cfd": "set_percentFeeTimes5(uint256)", +"95ee8bae": "getInt(address,bytes32)", +"95eeb240": "disableApproval()", +"95ef9178": "setTokenSaleContractAddress(address)", +"95f0684b": "getPackageNameHash(uint256)", +"95f0f107": "_setBridgeAmount(uint256,address)", +"95f11ce6": "deleteCandidate(address)", +"95f1260b": "balanceToWithdraw()", +"95f16de8": "companyWithdraw()", +"95f17bce": "cancelCost()", +"95f20e88": "RANDCRYPT(uint256,string,string)", +"95f22405": "getImageInfo(uint256)", +"95f28272": "salesTokenHolder()", +"95f382bc": "depositVault(uint256,uint256)", +"95f47e4e": "setRegulatorAccessLevel(address,uint8)", +"95f5784f": "FIBASK()", +"95f59fe1": "vote(string,string,string)", +"95f62fb9": "registerDevices(bytes32[],bytes32[],bytes32[])", +"95f847fd": "transferToContract(address,uint256,uint256)", +"95f9432d": "ThankYouToken()", +"95fa7430": "get_iconiq_tokens(address,address)", +"95fbdcd9": "MeshToken()", +"95fbfa0d": "testBurningUndistributed()", +"95fc6354": "PLAYER_START_PERIODS()", +"95fc799f": "allocateRestrictedTokenToPartner(bytes32,bytes32,uint256)", +"95fcb00d": "addVesting(address,uint256)", +"95fdc999": "getFlag(uint256)", +"95fdd612": "hasRequested(bytes32,address[])", +"95fe0e65": "createD(uint256)", +"95fe27d3": "SmartCripto()", +"95fe4608": "revokeCert(bytes32,bytes,bytes32,bool,uint256)", +"95fe5234": "setSubnodeOwner(bytes22,address)", +"95fe6865": "checkIfCanUseTokens(address,uint256)", +"95fe6f1d": "isAddressReserved(address)", +"95ff24e3": "SellTokens(address,uint256,uint256,uint256)", +"95ff3cc1": "getMyApples()", +"95ffff09": "getMyBananas()", +"960024ff": "rebuyStarted()", +"96002aef": "offerProductOwnership(bytes32,address)", +"9600ead9": "RESELLING_UNLOCK_COUNT()", +"9600ec92": "transfer(address[],address,uint256[])", +"9600f294": "refundTokenPayment(uint256,address,string,uint256,address)", +"9601065d": "reachedMajority(uint256)", +"96013c9c": "testLatestPkgGetter()", +"960173b5": "aliceClaimsDeposit(bytes32,uint256,uint256,address,address,bytes20)", +"9601deb8": "LogTransferOwnership(address,string)", +"96023032": "updateContractAddr(string,string,string,string,address)", +"9602339d": "AlfaTowerShares()", +"96023cbf": "registraToken(bytes32)", +"96026d61": "BucketAndValuationAndCommitted(uint256,uint256,uint256)", +"9602bb20": "AMBTICO()", +"9602e9d5": "withdrawDev()", +"960384a0": "getValue(string)", +"96038f8f": "ICO_Graphene()", +"9604702a": "matchExistingBids(bytes32)", +"960491d7": "setNextRndTime(uint32,uint32,uint32)", +"9604a24b": "getPoolCapSize(uint256)", +"960524e3": "getInvestorCount()", +"96063049": "rollDice(uint8)", +"96066cf9": "MintConfirmed(uint256,address,uint256)", +"96069ee1": "CIPToken(address,uint256)", +"96074e70": "addBeneficiary(address,uint256)", +"9607610a": "withdrawFor(address,uint256,uint8,bytes32,bytes32)", +"960787a2": "sendFoods(address[500],uint256[500])", +"9607a1db": "claimShare(uint256,bool)", +"9608088c": "setAddress(address,address,address,address)", +"960834f4": "dAddBallot(bytes32,uint256,uint256,bool)", +"9608740e": "verifyBid(uint256,bytes32)", +"9608e9df": "DataWasRecorded(address,uint256,bytes32,uint256,string)", +"960954af": "chargeAdvertisers(address[],uint256[],address[],uint256[])", +"960983f4": "addArtifact(string,string,bytes32)", +"9609e488": "TootyrCrowdSale()", +"960a48ae": "createPreIco(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"960a57fc": "SHA256HashRegister(bytes32)", +"960ba088": "createFinancialStrategy()", +"960bfc9b": "_owns(address,uint64)", +"960bfe04": "setThreshold(uint256)", +"960d3f56": "impl_mining(address,uint256,bytes)", +"960d8cd3": "testFailUpdateLatestRevisionNotOwner()", +"960d94bb": "get_presale_goal()", +"960e55a8": "ChannelCloseRequested(address,address,uint32,uint192)", +"960e80b7": "trans()", +"960ecf0c": "addNewStage(uint256,uint256,uint256,uint256,uint256)", +"960fa70f": "synthGenes(uint256,uint256)", +"96102d7d": "ownerSetWallet(address)", +"9610b1bc": "resumeTokenTransferFromAddress(address)", +"9610e068": "GetAskingUnitPrice()", +"9610f0e6": "pveBattleFee()", +"96119f12": "SkribbleToken()", +"9611bfc5": "_getExistingTileAt(int32,int32)", +"96131049": "withdrawal(address)", +"96132521": "released()", +"9613bc90": "isEvolvementAllowed(uint256,uint256)", +"9613e19b": "createAuction(uint256,uint256,uint256,uint32,uint32)", +"96147933": "ContractEnabled()", +"9614c769": "setDesc(string)", +"9615ecb2": "wasSuccess()", +"9616b410": "incFreezeIndex(uint256)", +"96176797": "LogTransition(bytes32,uint256)", +"96178c20": "totalSupply2()", +"9617d90d": "cartaxiToken()", +"96186b6e": "MAX_PERCENT_OF_PRESALE()", +"961891d5": "changeEscapeController(address)", +"9619367d": "minBet()", +"961a16f2": "secondExchangeRate()", +"961a9218": "setLLV_edit_17(string)", +"961a929c": "gasPriceLimit()", +"961b16a1": "addInTeamBalanceMap(address)", +"961b2b96": "assignBountyAddresses(address[])", +"961be391": "cash()", +"961c2470": "refundRoots()", +"961c9ae4": "createAuction(address,uint256,uint256,uint256,uint256)", +"961cc569": "airdropReceiversLimit()", +"961cd8ce": "ticketsForWithExcess(uint256)", +"961d1284": "isRefundingEnabled()", +"961d30cc": "getMasterNodesDates(address)", +"961d3cd3": "setExclude(address,bool)", +"961e99d9": "startBuyBackTwo()", +"961f1d96": "RANGESTART_3()", +"961ffc68": "GatewayInterfaceAddress()", +"9620b995": "transfterForProjectManagement(address,uint256)", +"96214735": "setDeployer(address)", +"962174b6": "LotteryClaveChain(address)", +"9621bcf7": "publishTaskListing(string,address,uint256,uint256,uint256,uint256)", +"9621f497": "SetMaxAirDropXblock(uint256)", +"96221dc9": "mulX(uint256)", +"962318b8": "teamKeepingPercentage()", +"96242f41": "getFrontEndTokenSupply()", +"96246eb8": "Zmbc()", +"9624e534": "setBlockDotNumber(uint256)", +"9625a6c6": "hardLimitICO()", +"9627bf02": "preIcoEndsAtChanged(uint256)", +"96283310": "setHouseAddressShare(uint256)", +"96284fb6": "getNizkStruct()", +"96286cc9": "isTokenOwner(address)", +"96289427": "transferRestTokensToOwner()", +"9629da17": "withdraw(uint64,address,address[],bytes32[],address[],uint256[])", +"962a64cd": "convert(string)", +"962aab81": "blockEnded()", +"962ba36f": "quarantine(address,address[],uint256[])", +"962ba969": "ExceedIOToken(uint256,string,string)", +"962c9898": "SOLUSToken()", +"962c9c8d": "MAX_VOTED_TOKEN_PERC()", +"962ca53e": "Cosby()", +"962d0c72": "overRaisedUnsend()", +"962dae57": "getPriceContract()", +"962ffeae": "totalCurrentFunders()", +"9630961d": "createRole(bytes32,address[])", +"9631c1bd": "FounderFeeInPercent()", +"9633303f": "setSrc(address)", +"96344d05": "creatorRequestFundTransfer()", +"963476e5": "listBackers()", +"9634ef56": "start_of_report_period()", +"9635024c": "TANDER()", +"96354f6d": "BONUS_ICO_STAGE1_PRE_SALE3()", +"9635eaf7": "fundsToAddress(address,uint256)", +"9635fc2c": "yahooOracleUrl(bytes32)", +"963630a3": "ETGOLDToken()", +"963632d3": "Prosperity()", +"96365d44": "poolBalance()", +"96370fa2": "savePic(string)", +"963749b6": "calculateWinnerPrize(uint256,uint256)", +"963812c3": "createItemId()", +"96382f0b": "gameStatus(bool)", +"96383c04": "setPrice(uint256,uint8)", +"96386ab3": "myMethod2(string)", +"96389bd7": "OwnedController(address,address)", +"9638a89c": "DataRecordIndexStructs(uint256)", +"963a9a13": "startInvite()", +"963c0724": "Lucky()", +"963c1121": "set_pre_kyc_iconiq_bonus_numerator(uint256)", +"963c11df": "totalScammed(address)", +"963c3397": "winning_year()", +"963c6017": "postGoldPeriod()", +"963d62fb": "tokenLossRatio()", +"963dd1dd": "Diatom()", +"963de4d2": "GetBet(uint256,uint256,bool)", +"963e2680": "setMinSiteTipPercentage(uint256)", +"963e49c7": "FindCarrot()", +"963e63c7": "minValue()", +"963f2334": "settleCaller(address,address,uint256)", +"96401470": "TutorialToken(uint256,string,uint8,string)", +"96406391": "setTokenDistribution()", +"9640da30": "ethRedeemed()", +"96419497": "PAXToken(bool)", +"9642a19c": "optInGas()", +"9642ccdf": "functionName(bytes20,address)", +"9642ddaf": "testMint()", +"9643aef4": "testControlCreateWithParentSameNonce()", +"9644fcbd": "changeMembership(address,bool,string)", +"96450a6d": "walletWithdraw()", +"9645337a": "removeOrder(uint256)", +"9645bae5": "newAuction(uint256,uint256)", +"964620d2": "TheMostPrivateCoinEver()", +"96463fc6": "createTrade(uint256,uint256)", +"96468249": "getFoundation(address)", +"96469132": "setPonziPriceInWei(uint256)", +"9646b85d": "getMintableAddress()", +"9646df4d": "presaleEnds()", +"9647259c": "dividendDistribution()", +"9647df97": "TES()", +"9648c9f4": "sessionId()", +"9649650c": "removeBank(address)", +"96497258": "withdrawOverdraftTokens(address,uint256)", +"964997a4": "MoacSupply()", +"9649ccaa": "updateSubscriptionOffer(uint256,uint256)", +"9649d98b": "restrict()", +"964a4ac7": "ULTRA_HERO_MULTIPLIER()", +"964ad434": "TIER1_CAP()", +"964afe08": "addSomething(uint256)", +"964b97de": "box2Star5()", +"964c0b40": "ExtensionCalled(bytes32[8])", +"964c7d84": "addressToBlock(address,bool)", +"964c836c": "receiveExecutionNotification()", +"964ecc09": "forceRefunding()", +"964f61f9": "getCosigner(uint256)", +"964f6dcd": "Elephant()", +"964f8fba": "totalDinoSold()", +"964fad94": "fundingGoalOf(uint256)", +"964fb96d": "test_init()", +"965232c0": "getTotalAllowed(address)", +"9652389c": "setPreSaleOn()", +"9652713e": "runSigned(uint40,uint256,address)", +"96532d1c": "mintingAllowed()", +"9653dee5": "tokenSwap()", +"9653f8a1": "etherBalances(address)", +"965447d9": "toPowerOfTwoThirds(uint256)", +"965582d6": "requestNewID(string,string,string)", +"9655943e": "validMCAmount()", +"9655e4b0": "sellIdeas()", +"965693ee": "TicketsPurchased(address,uint256[],uint256[],uint8[])", +"96574919": "removeStakerFromArray(address)", +"96577caa": "getLowWinPercent(uint256)", +"9657f8ad": "TopiToken()", +"96581de1": "registerPayments(address[],uint256[],uint256[])", +"9658522c": "createPlayerOnAuction(uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8,bytes,string,uint256)", +"96594efb": "WorldBit(address,bytes2,bytes2,uint256,uint256,string,string,string,string)", +"9659867e": "mintCount()", +"965a324e": "OxShelterEye()", +"965a3b7e": "targetDemographics()", +"965a79fb": "getAllJobs()", +"965acc73": "setCampaignBudgetById(bytes32,uint256)", +"965b0cc4": "signedApproveAndCallCheck(address,address,uint256,bytes,uint256,uint256,bytes,address)", +"965b2bae": "setFinancierParticipationAdd(address)", +"965b5aa8": "paySolutionRewardGoodRep(address,uint256)", +"965b71bc": "cfoWithdraw()", +"965bdf33": "SetAuditedAssetSize(uint256)", +"965be457": "registerApp(bytes32,address,bytes4[],address[])", +"965beae8": "bulkTokenSend(address[],uint256)", +"965c643f": "setReference(bytes32,string)", +"965c90e3": "getNodeByIndex(uint256)", +"965edec5": "_publishSecret()", +"96603e88": "hotPotatoHolder()", +"9660ab3a": "setContractUser(address,bool)", +"9660aeeb": "isMatching(int256,int256,int256)", +"96617ba4": "ClientsNotified(string,string)", +"966203e7": "Product(bytes32,bytes32,address[],int256,int256,address,address)", +"9662355e": "generateAttestForDelegationSchemaHash(address,address,uint256,bytes32,bytes32,uint256[],bytes32)", +"96637b10": "getEscuela(uint256)", +"9663871f": "recursiveRound(uint256,uint256,uint256)", +"9663a496": "awardBronze(address,address,address)", +"9663f88f": "getBlockHash()", +"96642cfc": "_isAuctionExist(uint256)", +"9664ca94": "date_string(string,int8,int8,int16)", +"9664d2d9": "resourceIndex(address,bytes4)", +"9665688e": "setGame(uint256,uint256,uint256,uint256,uint256,uint256)", +"966588d4": "cloneWithTwoPops(uint256,uint256)", +"9665b658": "changeExecutor(address)", +"9665ef09": "bitmask_show(address)", +"9665f170": "pregnantEtherDogs()", +"96661b04": "closeDataResponse(address,bool)", +"9666856d": "stopList(uint256)", +"9666cbfa": "getDeployedMatches()", +"9666e1f9": "isCosignerSet(uint256)", +"966704c2": "autoTransferLocked(uint256,uint256)", +"96682704": "TransferToReferral(address,uint256)", +"96686560": "Setup(string,string)", +"96687919": "_preSaleSupply()", +"9668b281": "AKContract()", +"966933ce": "DURATION_PER_VESTING()", +"96696da8": "getHives()", +"966a1961": "get_time()", +"966a360c": "newExchange(address,uint256,address,address,uint256)", +"966a3b29": "setJMETHExchangeRate(uint256)", +"966a7dca": "payOrder(string)", +"966aa252": "addProperty(bytes32,bytes32,bytes32,bytes32,bytes32,uint256,bytes32,bytes32,uint256)", +"966acb38": "testThrowTransferNotTransferable()", +"966aeece": "changeWhitelister(address)", +"966b3514": "contract_address()", +"966b7d91": "AdminChangedFundingWallet(address,address)", +"966dae0e": "factoryAddress()", +"966dcd26": "intertransfer(address,address,uint256)", +"966e6ead": "DefaultReleaseCalled()", +"966edae7": "lastBlock_a3()", +"966f697c": "_getSubscription(bytes32,address)", +"966ff650": "totalBurnt()", +"9670078c": "burnDNC(address,uint256)", +"9670591b": "giveAwayHoldership(address)", +"9670c0bc": "getPrecision()", +"9671ef91": "WEI_TO_INSIGHTS()", +"9673d6a3": "events(string)", +"96744afb": "ADDR_TEAM_TOKENS_ACCOUNT()", +"967506be": "deleteTokenAddress(address)", +"9675bb9c": "totlePrimary()", +"967743a8": "unlock20Done()", +"96778446": "addVestingUser(address,uint256)", +"967826df": "maxAllowedManualDistribution()", +"96784f45": "balanceOf2(address,address)", +"9678a1e8": "ProxyCreated(address,address)", +"9678df74": "MerlinCash(uint256,string,string)", +"9678eb05": "SafeDiv(uint256,uint256)", +"9678fb88": "TACTICALCRUISER_MAX_CARGO()", +"96793725": "registerWallet(address,address)", +"9679dd7d": "tokenLeft()", +"967a08f7": "raiseTransferEvent(address,address,uint256)", +"967b2692": "SaleCount()", +"967b3c21": "unitEpicGrowth()", +"967c33b3": "Deployer()", +"967dd0ae": "orderFor(address)", +"967e6e65": "getAge()", +"967e8611": "placeCube(uint64,uint64,uint64,uint256,uint256)", +"967f1cc6": "ownerPause()", +"967ff23e": "blocks()", +"96800dfd": "updateCap(string,uint256)", +"96817396": "bonus20end()", +"96821fc1": "MAX_MILESTONE()", +"96834e36": "ownerSetStandardFee(uint256)", +"9683d11d": "OHWOWW()", +"9683fe3e": "create(address,bytes32,uint256,address)", +"9684da1a": "createGenesisUniverse()", +"9684fe92": "interestCycleLength()", +"9685e736": "stopAvatarCreation()", +"96862e2d": "PattyCoin(uint256,string,string)", +"968790d0": "reclamaPagamento()", +"96879353": "CreateIco(address,uint256)", +"968803e3": "CYC()", +"96881d20": "CoinParkToken()", +"968858c8": "tokenreward()", +"9688738b": "TokenContract()", +"968908a3": "createMarketMaker(uint256,uint16,uint256)", +"968997fb": "FootballToken(uint256,string,uint8,string)", +"9689ac95": "TYPE_NOT_AVAILABLE()", +"9689e535": "CBCC()", +"968b12aa": "Crowdsale(uint256,uint256,uint256,address,uint256)", +"968bb12c": "setLegalFileLink(string)", +"968bd60d": "LogSendReward(address,address,string)", +"968be45d": "MYPPToken()", +"968c15de": "inscription(uint256)", +"968d1cff": "percentForCommunity()", +"968d73d8": "start_service2(uint256,address,uint32)", +"968d901b": "getCurrentGame()", +"968ed600": "totalFunds()", +"968f0a6a": "getBidBySiteIndex(uint8,uint256)", +"968f9dc3": "EtherReserved(uint256)", +"968fc02a": "DogRace()", +"9690be37": "deleteGame(bytes32)", +"9690caa6": "Umint21()", +"9691a8bf": "changeIndividualCapInWei(uint256)", +"969235a4": "getSaleStart()", +"969283e2": "availableVolumeEnclaves(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", +"969295ae": "changeReferral(address)", +"96934e88": "isReward()", +"96937617": "Rpct()", +"96938d5b": "watchedAddress()", +"969464f6": "isCauldronExpired(uint8)", +"9694f039": "founderSupply()", +"96957869": "verifySignature(bytes32,uint8,bytes32,bytes32)", +"9695e3c0": "EOMarketToken()", +"9696e59a": "totumPhases()", +"9696ef66": "SLOTS()", +"9696fbf5": "Daschain(uint256,string,string)", +"96974e47": "setMinAllowedBetInTokens(uint256)", +"96984631": "RANGESTART_10()", +"9698d611": "setSaleManageContract(address)", +"9699ca16": "getPublicKey(bytes32,uint8,bytes32,bytes32)", +"969ac477": "PRIZE_POT_PERCENTAGE_MAX()", +"969be87e": "testGetNewItemId()", +"969bece3": "setRegionOnSale(uint16)", +"969bf358": "getCurrentTokenSaleId()", +"969ca0eb": "scavengeEscrow(uint64)", +"969cb4da": "changeSubmissionPrice(uint256)", +"969cb7c3": "getPublisher(uint256)", +"969d5b94": "changeMultiSigWallet(address)", +"969da324": "updatedEtherPrice(string)", +"969ddd71": "getMaxCap(address,uint256)", +"969e3756": "exchange(address,address,uint256)", +"969ea336": "maximumInWei()", +"969eb430": "updateVerifiersPerShard(uint256)", +"969ef40d": "updateFinishFlag()", +"969f1af4": "addMinerQuest(address)", +"969f8a83": "getConfirmations(bytes32)", +"969fa9d2": "EmergencyWithdrawalSucceeded(address,uint256)", +"969fbf12": "contructor()", +"96a04925": "retreiveTokens(address)", +"96a16793": "changeOraclizeAccountingSettings(uint256)", +"96a1e85c": "get_total_quantity()", +"96a34fc7": "exchangeToken(uint256,address,address)", +"96a44d35": "devuelveApproles(bytes32)", +"96a49d60": "getCircle()", +"96a51fde": "OilVisionShare()", +"96a566be": "PartnersNotSet(uint256)", +"96a625a5": "plantcToken()", +"96a68b91": "makeUndestroyable()", +"96a69d04": "totalSquareStakes(uint256,uint256)", +"96a6a748": "POHStopTime()", +"96a70169": "tradeETH(uint256)", +"96a77176": "setPresaleTwo()", +"96a7cf6a": "callDestruct()", +"96a80699": "postAllocateAuctionTimeMints(address,uint256,uint256)", +"96a942c7": "minTokenPurchaseAmount()", +"96a952a5": "setInstallmentsLoanData(uint128,uint256,uint24,uint40,uint32)", +"96a9df88": "_withdrawAirdrop(uint256,bytes)", +"96aa6305": "totalNotCompleted()", +"96aab4f6": "setBountyAddresses()", +"96ab97a5": "hasVested(address)", +"96ac591e": "postICO(address,address,address,address,address,address,uint256)", +"96ad4131": "getRequiredAdmin()", +"96ad6c8a": "deposit_address()", +"96ad704a": "addToken(address[16],address,uint256)", +"96adad2e": "sellStores()", +"96adfe42": "mintWithData(address,uint256,bytes)", +"96ae44f6": "addAcceptedArbiter(address)", +"96afb365": "reclaim(bytes32)", +"96afc450": "emissionRate()", +"96afccb3": "withdrawDonation(uint256)", +"96b01c37": "warriorToOwner(uint256)", +"96b116c6": "statusDoacao()", +"96b1348a": "claimTokenFunds(address)", +"96b1e4d4": "isFreeze(bytes32,bytes32)", +"96b2c923": "changePlatformWithdrawAccount(address)", +"96b47f0d": "soldOnStage()", +"96b55f7d": "tierCount()", +"96b58ac8": "tokensLeftForSale()", +"96b5a755": "cancelAuction(uint256)", +"96b5c5f4": "FeeWallet(address,uint256,uint256)", +"96b5f7b6": "ParallelWorld()", +"96b6af5a": "submitCustodianDoubleSign(address,uint256,bytes32[],uint256[],bytes32[])", +"96b76c23": "stand(uint256)", +"96b828b4": "Lock(uint256,uint16)", +"96b86436": "foundersAllocatedAmount()", +"96b86e1d": "PLCRVoting(address)", +"96b90b05": "Apex()", +"96b9a9d0": "medalBoostAndBurn(uint16,uint64)", +"96bb1fef": "claimStakingRewards(address)", +"96bba9a8": "slashSmallUsername(string,uint256)", +"96bc0f94": "onlyAdminsFriends()", +"96bc1a89": "getLockedAmount_investors(address)", +"96bc2287": "PRE_FUNDING_GOAL()", +"96bc3f3a": "getForecastScore(uint256)", +"96bc4a40": "bsWallet()", +"96bc5ab7": "setOracleURL(string)", +"96bcf236": "am_i_on_the_whitelist()", +"96bd09a1": "edit_safe(address,string,string)", +"96bd8dae": "transferAllowance(address,uint256)", +"96be8878": "team2Balance()", +"96bf15bf": "gamePrice()", +"96bf4ed5": "TOTAL_TOKENS_FOR_CROWDSALE()", +"96bf5022": "MRIDUL()", +"96bfc229": "isInWhiteList(address)", +"96c0fb8b": "setWhiteListInBatch(address[])", +"96c108c9": "assignToBeneficiary(address,uint256)", +"96c12acb": "Fuck()", +"96c14d92": "closeContract(bytes32,bytes32,uint256,uint256,uint64,uint64,bytes32,bytes32,bytes32,uint64)", +"96c16735": "UselessAirdroppedToken()", +"96c237b4": "getDeedInfo(address)", +"96c266ca": "developersKey()", +"96c28881": "fundraise_max()", +"96c2d498": "XTL()", +"96c2d4c9": "totalTipForDeveloper()", +"96c36170": "icoEtherBalances(address)", +"96c38294": "getETHUSD()", +"96c52fc3": "____forward(address,uint256,uint256,bytes)", +"96c5406d": "tokenFree()", +"96c5743a": "test03AliceBuyToken()", +"96c5ea93": "icoBeginDate()", +"96c62b27": "BalanceBook()", +"96c72144": "GrimReaperAddress()", +"96c74715": "NBW()", +"96c7a2a3": "BlockRxToken(uint256)", +"96c81be5": "unicornsOf(address)", +"96c824a8": "createAccountFundContract()", +"96c82e57": "totalWeight()", +"96c85b59": "TestBancorFormula()", +"96c8da45": "oneTokenInEur()", +"96ca7653": "LottixTest()", +"96cb4bc5": "RESERVED_ECOSYSTEM_GROUP()", +"96cc7be7": "updateCeleb(uint256,uint256[6],uint256[6])", +"96ccacb0": "hour_blocks()", +"96cdb027": "InstallerEscrow()", +"96ce0795": "denominator()", +"96cea3f7": "confirmWithdrawTransaction(uint256)", +"96ced078": "getPlayerNumbersInGame(uint256,address)", +"96cf5227": "changeLockTime(uint256)", +"96cfd124": "signedTransferHash(address,address,uint256,uint256,uint256)", +"96cfda06": "getCourseCount()", +"96cff3df": "getMinimumCallCost(uint256,uint256)", +"96d002a0": "subFundBalance()", +"96d02099": "rsplit()", +"96d122ea": "getStoreAddress(string)", +"96d195bd": "getWitnesses()", +"96d1c952": "filterBuyers(bool)", +"96d28e00": "spinDeposit()", +"96d2ede5": "preBalanceOf(address)", +"96d3196b": "getSumActiveToken()", +"96d373e5": "cast()", +"96d37936": "finishTokenMinting()", +"96d43cc6": "getMinimumFundingGoal()", +"96d46500": "ICO_CAP2()", +"96d4cb9b": "FipsRegistration(bytes20,address)", +"96d4d091": "advisorAddress()", +"96d4ebf1": "finneyPerToken()", +"96d4f640": "createOrder(address,uint256,address,uint256,uint256)", +"96d6401d": "TRANSFER_PROXY()", +"96d66cf8": "expertsAccount()", +"96d6c134": "coreVUPDestination()", +"96d7a9ed": "_menu(bytes32)", +"96d7f3f5": "lastTimeMinQuorumMet()", +"96d811b7": "TokenVesting(address)", +"96d8b050": "claimTokensToOwner(address)", +"96d8f4f3": "minimumDonation()", +"96d8fe3b": "_updateHistory(address,address)", +"96d92a72": "changeRNGenerator(address)", +"96d99568": "MMMTokenCoin()", +"96d9a881": "manualDeleteEditionBids(uint256,address)", +"96da1fba": "sendETHToContributionWallet(uint256)", +"96da2848": "gasForCLI()", +"96dbab81": "stub()", +"96dbad1e": "sellCityForEther(uint16,uint256)", +"96dbb486": "updateFinishTime(uint256)", +"96dbbc5f": "Token_Description()", +"96dbe56e": "ImpCore(address)", +"96dc461f": "setBountyTokensCount(uint256)", +"96de0c20": "_makeWithdrawForPeriod(bytes32,uint256)", +"96de56d2": "getPlayerFlips(address,uint256)", +"96de6caa": "qtyValidators()", +"96de9c8c": "cnyBtcRate()", +"96dea936": "proposalData(uint256)", +"96df3540": "TLD_NODE()", +"96dfa78b": "price_per_eth()", +"96dfcbea": "checkState()", +"96dfcc21": "weAreClosed()", +"96e05fdb": "PaymentAccepted(address,bytes8,uint256)", +"96e0ef33": "send(address,address,address[],uint256[])", +"96e1a657": "timeBetweenEditions()", +"96e264ff": "ownerSetPayOutDivisor(uint256)", +"96e332f3": "mainSaleMaxTokens()", +"96e438a1": "reclaimDeposit(uint256)", +"96e4ee3d": "convert(uint256,uint256)", +"96e4f67d": "icoEtherReceivedMainSaleDay()", +"96e50a8c": "saveNonce(uint256)", +"96e583a9": "getLetter(uint256)", +"96e6e65f": "ETCN(uint256,string,string)", +"96e76fa7": "Unregistered(string,uint256)", +"96e83a40": "refund(uint256,address,address)", +"96e8cace": "dripMe()", +"96e8d14c": "newRecord(string,string,string)", +"96e9df8d": "deployNewContract()", +"96e9f6f2": "lastBlock_v12()", +"96ea7487": "Opacity()", +"96ea76b7": "OnWithdrawTo(address,address,uint256,uint64)", +"96ea8b9c": "referralPercentage()", +"96ea9f49": "FundTransfer(address,uint256,uint256,uint256,uint256)", +"96ebabba": "distributeSuccessfulCampaignFunds(uint256)", +"96ebfb89": "generalManager()", +"96ec1ca2": "tipUser(bytes32,bytes32,bool)", +"96ec6fec": "APP()", +"96ec7114": "COMMUNITY_SALE_START()", +"96ecf3c4": "subtractFrozenBalances(address,uint256)", +"96ed10a4": "issuePOIs()", +"96edb898": "callTokenFallback(address,address,uint256)", +"96ee03d6": "__concat(string[6])", +"96eecf95": "saleSuccessfullyFinished()", +"96ef7aa0": "cash_transfered(string)", +"96efbb9b": "getActiveItemAt(uint256)", +"96f099bc": "preSaleTokenRaised()", +"96f0aa8f": "findNextSecond(uint256,bytes)", +"96f1370d": "TotiMed()", +"96f17aa5": "potTarget()", +"96f2710d": "managerOn(address)", +"96f27b29": "getContract(bytes32,uint256)", +"96f36997": "CLIBUXCoin()", +"96f392f4": "elixir()", +"96f42876": "buyerAddressTransfer(address,address,address)", +"96f429ba": "stateIsFinishedReplay(uint256)", +"96f47800": "investInternal(address,uint128)", +"96f494d1": "printCourse0(uint256)", +"96f6706f": "cancelOfferBob(uint256)", +"96f68782": "right62(uint256)", +"96f74e88": "setOrganizationName(string)", +"96f76f11": "contractFinished()", +"96f7807a": "getDuel2(uint256)", +"96f93e65": "Expire(address,address)", +"96f9cffa": "shareBonus()", +"96fb2e62": "Party(string,address,string)", +"96fbab31": "getZombiesFullInfoByOwner(address)", +"96fc00c2": "setPresale(uint256,address,uint256[])", +"96fc2256": "verify(address,uint8,bytes32,bytes32)", +"96fcbf65": "numOfSampleTypes()", +"96fcd214": "slaveServer()", +"96fd1c42": "flush(address,uint256)", +"96fd1df7": "isEndedTrack(uint256)", +"96fd550a": "betWithCredits(uint64)", +"96fe1338": "storageTime()", +"96fe5418": "contestEndTime()", +"96fe6e74": "external_oraclize_randomDS_setCommitment(bytes32,bytes32)", +"96fedaf7": "extraMinted()", +"96fef3f1": "submitTransactionToken(address,address,string,string,uint8[],bytes32[],bytes32[])", +"96ff0306": "retireWildHard(uint64,uint64,uint64,uint64,uint64,uint64)", +"96ff4483": "setTokenAsideAddresses(address,address,address)", +"96ff7631": "SetupYOU(string,string,uint256,uint256,uint256,address,address,uint256)", +"96ff7e97": "requestIdentity()", +"96ffa690": "countLocalRecursive(uint256)", +"96ffac0b": "setupRace(uint256,uint256,address)", +"97004255": "aliceClaimsPayment(bytes32,uint256,uint256,address,address,bytes)", +"9700d0f0": "stage_2_TokensSold()", +"970129be": "getCardInfo(uint256)", +"9702795d": "REFERRAL_SHARE_RATE()", +"97028899": "play(bytes1,bytes1)", +"97034ed0": "get_HoldersProfit(address,uint256)", +"970388b5": "setContractActive(bool)", +"9703ef35": "cancelBid(uint256)", +"9703fa2e": "airdropQty()", +"9704122c": "getFeeAmount(uint256)", +"97046afc": "burnProvider(address)", +"970574ac": "lnUpperBound32(uint256,uint256)", +"9705a592": "getUnprocessedQueryCount()", +"97062e8a": "ico3Bonus()", +"9707f708": "Totalsupply()", +"970875ce": "currentSnapshotId()", +"9708e250": "maxSellCap()", +"9709709a": "MomentumToken()", +"9709cdbc": "getExchangeGroupsKeyAt(uint256)", +"9709d040": "NewPayroll(address)", +"970a5fa8": "exchangeRateIdx(uint256)", +"970afd9b": "MAXIMUM_64_BIT_SIGNED_INTEGER_VALUE()", +"970db3df": "SPECIALIST_STAKE_TWO()", +"970e5904": "safeGetPartialAmountCeil(uint256,uint256,uint256)", +"97100be9": "setLiveTx()", +"97107d6d": "setProxy(address)", +"9710f014": "completeStatus(string)", +"971130b5": "MulaCoin()", +"9711715a": "snapshot()", +"9711e944": "Queue(uint256)", +"9711f20d": "isSanctuary()", +"971217b7": "values()", +"9712a57e": "purchasePotato(uint256)", +"9712a764": "takeBounty()", +"9712da8b": "getCompte_20()", +"97135d19": "santai()", +"971362c9": "partnerWithdraw()", +"9714378c": "extend(uint256)", +"97145273": "setHidden(address)", +"9714a27c": "miningOneFree()", +"9714f05c": "_minimumContribution()", +"9715a81f": "SurvivalRanchTestCoin()", +"9715d80e": "getCanShareProfitAccounts()", +"9715f05d": "OBSERVER(uint256,string,string)", +"97169426": "Owned1()", +"9717137a": "TLN_TOKEN_NAME()", +"97172664": "getIcoAddrCount(uint256)", +"97173a7a": "referalPayCount(address)", +"971751af": "lockAndDeliverTokens(address,uint256,bytes1)", +"9717ae9d": "DTCC_ILOW_5()", +"9717b2ae": "DividendsTransfered(address,uint256)", +"9717d76f": "getCandidatePosition(address,uint256)", +"9717df19": "fillFromQueue()", +"97187ac8": "coinSaleStarted()", +"9718b524": "newTreasury(address)", +"9719f290": "lockTeamTokens(address)", +"971a3593": "updateClosetime(uint256)", +"971a9091": "crystal()", +"971a9a29": "CbxeToken()", +"971b2b2e": "getFreelancerFeedbackOn(address,uint256)", +"971bd1b4": "estimateDistribution()", +"971c803f": "getMinimumStackCheck()", +"971ccc16": "addERC20Token(address)", +"971d2bd8": "getProposalByHash(bytes32)", +"971dbe0e": "getNbrOfPartyFor(address)", +"971e668f": "updateTokenToEthOrder(uint32,uint128,uint128)", +"971e80cb": "setWallet()", +"971ec3ce": "globecoin()", +"971f34a1": "SellPriceChanged(uint256)", +"971fe56b": "poolWeight()", +"971fff63": "setAdsStorageAddress(address)", +"972030bb": "mixGenesRabbits(uint256,uint256,uint256)", +"97203543": "getGuestCount()", +"972041e4": "getTokenTime(uint256)", +"97204d8e": "delegateProxyImplementation()", +"972072a2": "resolveChallenge(string)", +"9720dd5a": "kBit()", +"972161f7": "getFullState()", +"97217085": "maxBetDoubleDice()", +"9721dd4c": "GoldenChain()", +"972205d4": "Untethered(address,string,string,uint256,uint32,uint32,uint256,uint256,uint256)", +"97227325": "simulate_ico()", +"9722cdc6": "EarningsWithdrawal(uint256,address,uint256)", +"97235a1e": "receiveToken(address,uint256)", +"97246156": "HoQuBurner(address)", +"9724fc95": "getTotalProposalsCount()", +"9725b4a5": "BOXIcoin()", +"9725bd80": "preIcoEnded(uint256,string)", +"97267ae9": "startDividendDistribution()", +"972711cc": "KoreaShow(uint256,uint256,address,address)", +"97271615": "contract_newOwner()", +"9727e379": "addMeter(uint32,string,string)", +"97294e58": "register(address,string,address)", +"97296421": "joinTheHunt(string,string)", +"972973e7": "setOfferPrice(uint256)", +"97297467": "checkAndVerify(bytes)", +"972993e6": "b2bcToken()", +"97299d8a": "lendingDays()", +"9729d040": "_slashPower(address,uint256,bytes32)", +"9729ec26": "generateWarrior(uint256,uint256,uint256,uint256)", +"9729f9b9": "getBlockComission(uint256)", +"972ab95a": "bennylamToken()", +"972afc80": "ownerSetEmergencyStatus(bool)", +"972c169e": "datboiSupply()", +"972ca383": "MONTANATOKEN()", +"972d1ae2": "_getNextTokenId()", +"972e6151": "operationalReserveAddress()", +"972fa53f": "createTeam(string)", +"97304ced": "mintTokens(uint256)", +"973069f8": "transferRemaining(address,address,uint256)", +"97306c27": "getData3(uint256,uint256,uint256,uint256)", +"9730b305": "burnTokens(uint256,address)", +"9731a897": "famedStarMassToIds(uint256)", +"9733348a": "ProdToken()", +"9733dc79": "ManagerContract()", +"97346423": "HCOIN()", +"9734855d": "WhitelistAddressenable(address)", +"973516f2": "getH1Amount()", +"973549ea": "_setAddress(bytes32,address)", +"973628f6": "currentEra()", +"97365a0b": "safe(uint256,string,string)", +"97365df2": "sameOdd()", +"9736a590": "DistributedTokens(address,uint256)", +"9736aeb4": "OwnershipTransfered(address)", +"97374d89": "preIcoAllocation(uint256)", +"97379c32": "CBIX(string,string,uint256,uint8)", +"9737bc41": "ShineCoinToken(address,address,uint256,string,uint8,string,bool)", +"9738418c": "getVersions(bytes32)", +"973880e8": "getMinesInfo(uint256[])", +"973882e9": "returnPollStake(address,bytes32)", +"97388497": "getNumberOfRequests()", +"973885c0": "test_setMaxSize_decreaseSize()", +"9738968c": "canUpgrade()", +"9738b602": "getElementInfoView(uint256)", +"9738f92c": "transferLogicAuthority(address)", +"97391e2d": "PurchaseMade(address,bytes8,uint256)", +"9739203b": "view52()", +"9739951c": "tokenEmission(address,uint256)", +"9739db9d": "createOwnershipOffer(address)", +"973ad270": "removeArbitrator(address)", +"973b56e8": "MIN_FREEZE_DURATION()", +"973bc8cf": "getParticipantsChannel(address,address)", +"973cbc75": "testFailAppendTranch()", +"973d641e": "SplitPayment(address,address)", +"973dbfb7": "withdrawalValue()", +"973e315b": "setMigrateFromLegacyReputationToken(bool)", +"973e9b8b": "getAllowance()", +"973e9c5c": "Radiance()", +"973ea9d5": "team2Address()", +"973f6129": "adminArray(uint256)", +"973fcaef": "SIMCOIN()", +"973fe7ef": "secondWeekBonus()", +"97409192": "addRequest(uint256,string,string)", +"9740e4a2": "left87(uint256)", +"9741efe4": "currentBankroll()", +"974207fb": "logfolio(bytes32)", +"974238fd": "CreditMC()", +"97425a54": "ANMFutureVesting()", +"9742ca46": "setMiner(address)", +"9742d64a": "destroyBeneficiary(address)", +"974317dc": "ThreeDL()", +"9743ad98": "totalReservedAndBonusTokenAllocation()", +"9743c6c3": "joinMain()", +"9743dfc1": "jesterAutomaticCollectFee()", +"9743efe5": "kin()", +"974463d6": "ronerToken()", +"9744a1b1": "depositWithToken(bytes,uint256,uint256,uint256,uint256)", +"9745ac4d": "getResponseUint(int256,uint256,bytes32)", +"9745ad9c": "stageIT()", +"974626b4": "LotsaFucksToken()", +"97463b75": "getPOOL_edit_27()", +"974654c6": "finishPresale()", +"974654f4": "requiredGas()", +"9746f42b": "getBalanceTeam(address)", +"9747145b": "claimStorageForProxy(address,address,address)", +"974811fb": "tokensToEthereum_1(uint256,uint256)", +"9748334b": "PskERC20()", +"97487af8": "TOTAL_SUPPLY_ACES()", +"9748a3f2": "getOpenProposals()", +"9748bf5b": "bucketValue(bytes32)", +"9748db00": "DragonKing(address,address,address,address)", +"9748dcdc": "punish(address,address,uint256)", +"97495cce": "rate_toTarget()", +"974a832d": "rejectCertificate(uint256,uint256)", +"974b2525": "removeBurningMan(address,uint256)", +"974bd64b": "PromissoryToken(bytes32,address,uint256)", +"974c86b5": "Buy()", +"974cf025": "lockDonationReceiver()", +"974e7dc9": "_getWeekTotalStake(uint256)", +"974ee3bb": "_updateLockUpAmountOf(address,address)", +"974ef924": "parseBool(string)", +"974fa121": "GiveAnAngelCS(uint256,address)", +"974fd2f3": "setLastBattleResult(uint64,uint16)", +"975057e7": "store()", +"97508f36": "pollNonce()", +"97514d90": "sellOrder(uint256)", +"97518f74": "_OmnesCoinToken()", +"975289fd": "getPriceVolume(uint256)", +"9752bcd3": "guaranteedBuyersLimit(address)", +"9752f163": "deployAgent()", +"975347b8": "removeAddressFromAccessControl(address,uint8)", +"97537bdf": "BotCoin()", +"9753a84e": "PCHAlN()", +"9754a4d9": "grantVestedTokens(address,uint256,uint64,uint64,uint64,bool,bool)", +"9754a7d8": "pauseSell()", +"97557f6a": "QTB(string,string,address)", +"9755a710": "hasWinner()", +"97566aa0": "getMintDigest(uint256,bytes32,bytes32)", +"97567579": "getTokenWithdrawalAllowance(address,address)", +"975739a5": "maxKudosToMember()", +"9757e8a3": "customerCount()", +"97584b3e": "_hasAvailability()", +"9758af1e": "doesEntryExist(bytes32)", +"9758fd0d": "closeChannel(bytes32,uint256,address,uint256,address,uint256)", +"9759512b": "LogRefund(uint256)", +"9759c160": "BuyCore(address,uint256,uint256)", +"975b123e": "get_firstbytes(bytes,address)", +"975bad75": "_createCountryId(uint256)", +"975be231": "emitPricesUpdated(uint256,uint256)", +"975c2308": "getHeir(uint256)", +"975c5cab": "getSanageLink(uint256)", +"975c95da": "ICO_PERCENTAGE_5()", +"975dfff9": "monsterIdToTradeable(uint256)", +"975e001a": "tokenBonusForForth()", +"975e463a": "addInvoice(address,uint256,uint256,uint256)", +"975e76b3": "transferAdvisorsToken(address,uint256)", +"97603560": "rescueTokens(uint256)", +"9760b450": "_Stand()", +"97614302": "playCount()", +"976160fa": "SetDesignatedRouterSRV(bytes32,uint256,bytes,bytes)", +"9761cd63": "reduceHatchCooldown(address,uint256)", +"97623b58": "removeContract(string)", +"97624631": "assertEq(bytes,bytes)", +"9762737a": "remove_branch(uint256,uint256,uint256)", +"9762e9ea": "icoStartedTime()", +"9762f802": "hardCapReached()", +"976371c9": "_isTokenOwner(address,uint256)", +"9764053b": "_price_tokn_ICO2()", +"9765b4d7": "autoSend()", +"9766178c": "tradeDealRequested()", +"97668720": "set_centralAccount(address)", +"97672729": "releaseLockedTokens(uint8)", +"97679646": "whitelistMinTok(address)", +"9767dae8": "userWithdrewWei(address,address)", +"9767fff7": "setImageOwner(address[16],uint256,address)", +"976898c7": "bid(string,string,string,string)", +"976934ac": "dCHF()", +"9769eacf": "setBuyOpen(bool)", +"9769f0b0": "sellToken()", +"976a0b82": "vettingTime()", +"976a77b6": "freeForCarrots(uint256)", +"976a8435": "units()", +"976b01c0": "setNotRetractable(bytes20)", +"976b59b5": "ElyxrShrimpFarmer(address)", +"976bd47d": "LOOMIA2()", +"976bdba4": "makeOrder(address,address,bytes32,uint256,uint256)", +"976c3d04": "calculateTokenPrice(uint256,uint256)", +"976d00f4": "auditSecret(bytes32)", +"976d16d5": "getTotalAccessories()", +"976d36d0": "totalSupply1()", +"976e0da9": "getNextPrice(uint256)", +"976e14d6": "salePriceWei()", +"976f37fd": "lowCompose(uint256,uint256)", +"976f6c92": "lastBlock_a19Hash_uint256()", +"976fcda7": "WithdrawlRemainingPAT()", +"97709cde": "ARK_VOTER_1_00(uint256,uint256,uint256,uint256,uint256,uint256)", +"97709ce7": "setRaffleAddress(address)", +"977174ff": "normalRoomMax()", +"9771ccc8": "removeERC20(uint256,address,uint256)", +"97722acf": "getCapOfToken()", +"9772c982": "scheduleCall(address,bytes4,bytes,uint256,uint256)", +"9773252a": "isInBonusList(address)", +"9773489a": "forceOffsetExecuteMaxFee()", +"97734b85": "BNB(uint256,string,uint8,string)", +"9773b22e": "_HachirokuToken()", +"9774c190": "ShieldCureToken()", +"977564ed": "Zylli()", +"977567a4": "ico(uint256,address,uint256)", +"977615a3": "startDatetime()", +"9776415f": "setConntractEnable(string,uint256)", +"9776aacf": "addToken(bytes32,address)", +"9777487d": "sponsorValue()", +"977785c5": "testInitalBalanceUsingDeployedContract()", +"97779e1b": "isStop()", +"9777a30e": "EYHToken()", +"9777aa49": "owner_endGetting()", +"97788180": "GetCitySnapshot()", +"9778a177": "ManualPurchase(address,address,uint256)", +"977919bf": "adjustFeeAmount(uint256)", +"97792f2f": "PembiCoinICO()", +"97799d47": "Tmc4(uint256,string,uint8,string)", +"9779dcd9": "sendInvestmentsToOwner()", +"9779e135": "CreateUpgradeCards(uint256,uint256,uint256,uint256,uint256,uint256)", +"977a5ec5": "hold(address,uint256)", +"977a8f1b": "logTokenTransfer(address,address,uint256)", +"977ab3c2": "mintarget()", +"977af81c": "changeMessage(bytes32,string,uint8,bytes32,bytes32)", +"977b055b": "maxPurchase()", +"977cdc7e": "completeDefaultOperators()", +"977d0f9b": "escape(uint256[],uint256[],uint256[],uint256[])", +"977d2c45": "totalWallets()", +"977d6276": "getOrderPriceInfo(address,address,uint256,uint256)", +"977d996d": "createEvent(uint256)", +"977e09e6": "addGameRecord(address,uint256,int256,uint256,uint256,address,uint256,uint256)", +"977ed151": "fetchCancelledOrdersForPayer()", +"977eda79": "txLog(uint256)", +"977f1213": "FucksToken()", +"977f3b05": "calculateRegionSalePixelPrice(uint256)", +"977f7c7e": "bet_on_team_2()", +"977f9e24": "offlineDonate(uint256,uint256)", +"977ff98f": "currentSaleAddress()", +"97810850": "setPlaySeed(address)", +"9781a37e": "setCooldown(address,uint256)", +"9781c3ca": "buyTokensSigned(address,bytes)", +"9782c9ef": "unfreezeTrading()", +"9782e1ec": "ProxyMock()", +"9783585d": "setState2WithStop(uint256,uint256)", +"9783bef4": "EighthContinentSocialMarketplaceToken(uint256,string,uint8,string)", +"978414bd": "transferZTXOwnership(address,address)", +"9784696c": "PauseOff(uint256)", +"97848574": "NevadaBlackBook(address)", +"9784af62": "createTokenContract(string,string,uint8,uint256)", +"9784f585": "crowdsaleHardEndTime()", +"97871e56": "EtherPush()", +"9787a6b3": "setUint8(int8,uint8,uint8)", +"97883d1f": "tokenPriceMultiplies(uint256)", +"9788a8e7": "HOU(uint256,string,uint8,string)", +"9788c342": "HardCapReached()", +"9788d5ff": "_updatePrices(address[],uint256[])", +"9789103f": "fallbackProposal(address)", +"9789f9da": "crowdsaleFinishTime()", +"978ab53b": "withdrawFundInsurance()", +"978afdc8": "getBountyAmount(address,address)", +"978bbdb9": "feeRate()", +"978bc247": "_checkSetSkill(uint256,address,uint8,uint256,uint256,uint256)", +"978c5b15": "LOCKED_2Y_DATE()", +"978ca331": "mintSub(address,uint256)", +"978cb570": "firstTimer()", +"978d5c0e": "ASCCoin()", +"978d602a": "withdrawETH(address,address)", +"978d6cff": "ICO_TOKENCAP()", +"978dabbe": "test_fourValidEqBytes32()", +"978f68b5": "cancelListing(bytes5)", +"978f8934": "createPromoKydy(uint256,address)", +"9790268b": "setRewardBlockThreshold(uint256)", +"97905a88": "recoveryKey()", +"97907827": "sharesHeld()", +"97911fd7": "MyGameToken()", +"97912c2f": "startPreICOTime()", +"979141ea": "logFeeTokenBurned(address,address,uint256)", +"979260bd": "reserve2Address()", +"97936258": "GetBaseN(uint256,uint256,uint256,uint256)", +"9793714f": "approveSettingDeprecation(uint256,bool)", +"9793ebf4": "getBooleanMapValue(string,address,address)", +"97950740": "roomForBirth()", +"9795a644": "BITWhaleBalance()", +"9795aabf": "setNewTokenOwner(address)", +"97971c69": "TwentyOneMillionToken(address,uint256)", +"97976d15": "raisedUsing(uint256)", +"9797f51f": "ELTToken(address,string,string,uint256,uint256,uint256,address)", +"9798532f": "_priceToTax(uint256)", +"9798a106": "isNullAddress(address)", +"9798dfc2": "ReinvestAmount()", +"9798e639": "distributeLCWP(address[],uint256)", +"97990635": "SmartInvestmentFundToken(address,address)", +"97992a04": "villainIndexToOwner(uint256)", +"97994b96": "changeOpenNumber(uint256)", +"97997ebb": "stakeWithdrawDisallowPeriod()", +"979a5e1a": "set_presale_arbits_sold(address,uint256)", +"979af14d": "checkAccount(string)", +"979b49de": "checkBonusTokenAmount(address)", +"979b6f6f": "RoundInfo()", +"979bc638": "withdrawBidForPunk(uint256)", +"979bfba7": "PUMPHODL()", +"979c2441": "times7()", +"979c7a38": "MultiWhitelist(address)", +"979ca729": "IcoContract(address,address,uint256,uint256,uint256)", +"979cf824": "tokenSaleEnabled()", +"979d6dc7": "HUT34_WALLET()", +"979e0f22": "AuctionResumed()", +"979e199d": "setProceedsAccount(address)", +"979e8852": "existsEscuela(uint256)", +"979f1976": "tryInsertSequenceId(uint256)", +"97a09338": "freeMoney()", +"97a0a3ec": "SpeedCashTokenContract()", +"97a1c2cd": "preSaleFirstDay()", +"97a1d3f7": "_emitHolderOperationalChanged(bytes32,bool)", +"97a28819": "resetDividends()", +"97a315ff": "CHF_Omnidollar()", +"97a33431": "toContractDie(bytes32,bytes32,uint256)", +"97a42022": "scanOutputs(bytes,uint256,uint256)", +"97a432ff": "addressesToUsernames(address)", +"97a53219": "setSwapToken(address,uint256,uint256,uint256,uint256,bool)", +"97a55722": "get_win_coefs()", +"97a6278e": "removeAgent(address)", +"97a629aa": "shareholdersBalance()", +"97a6ef4a": "AutoCoinToken()", +"97a7293d": "getCCH_edit_5()", +"97a75fe8": "seriesASupply()", +"97a7804e": "FrozenToken()", +"97a7cfb4": "takeTheTorch_(uint256,address,address)", +"97a8c6ec": "emitEvent(string,address,address,uint256,uint256,string,string)", +"97a95086": "getBAU(bytes32,address)", +"97a97005": "transferAllArgsYesAllowance(address,address,uint256,address)", +"97a989c2": "__getbalance()", +"97a993aa": "buyers(address)", +"97aa28b4": "publicUnlock(address,uint256)", +"97aaa73c": "timeBasedBonus(uint256)", +"97aab362": "setReg(address)", +"97aae114": "setDeprecatedManual(uint256,address,bool)", +"97ab4786": "reserved(uint8)", +"97ab5baa": "withdraw_if_failed()", +"97ab9e7a": "contestStartTime()", +"97aba7f9": "recoverSigner(bytes32,bytes)", +"97ac37de": "_purchase(address,uint16,address)", +"97ac3b51": "CHXToken()", +"97ac3cd9": "noMoreNextRoundSetting(bool)", +"97ac4a25": "isRoundActive(uint256)", +"97acb3bb": "addAction(address,bytes4,bytes32[])", +"97acb94d": "withdrawalFrom(address,address,uint256)", +"97ad1cbf": "alterDividendCooldown(uint256)", +"97ae4491": "serviceFeeWithdraw()", +"97aeb405": "IFIN()", +"97aeb7ad": "setTeamByAddress(uint8,address)", +"97aeecd0": "AtraToken()", +"97af34db": "listActiveBets()", +"97af77b8": "getVisaAmountPaid(address,uint256,uint256)", +"97af90ae": "_userRefund(address,address)", +"97afb40c": "request_withdrawal(address,uint256)", +"97b0484e": "TOKEN_ICO2_LIMIT()", +"97b081ef": "setOrderDealTimeInterval(uint256)", +"97b09aa6": "tokenSaleAgreement()", +"97b0ad7d": "Fizzy()", +"97b10976": "removeAmountForAddress(uint256,address,address)", +"97b150ca": "tokenAmountOf(address)", +"97b1b2b7": "getFundStatsMap()", +"97b1ff1d": "getNumberOfBeats()", +"97b27c46": "decision(bytes32,string,address[],uint256[])", +"97b2f556": "numPlayers()", +"97b3116e": "setPrePaidFee(uint256)", +"97b34e1f": "readBools(bytes32[])", +"97b3ab70": "BetComplete(bool,uint256,uint256,uint256,address,uint256,bool)", +"97b3b441": "isAvailable(uint40)", +"97b4ddac": "currentGenesisAddresses()", +"97b51442": "setMinimumWait(uint256)", +"97b61c68": "giveOwnership(uint256,address)", +"97b68b60": "finishFreeGetToken()", +"97b6cf42": "icoParametersSet()", +"97b73c5c": "setMockUint256(int256,bytes4,uint256)", +"97b740e2": "addAuction(uint40,uint40,uint128)", +"97b817c9": "beginGame(address,uint64)", +"97b9d025": "past_present_future()", +"97ba42b3": "getsometoken(address,uint256)", +"97ba89c9": "setBetUnit(uint256)", +"97bb0de0": "mintLockedTokens(uint256)", +"97bb2a63": "newvow(uint256,address)", +"97bd820a": "divRound(uint256,uint256)", +"97bdc7c8": "changeWhitelist(bool)", +"97bdc9cc": "setBytes(address,string)", +"97bec0ec": "unlockCZR(address,uint256)", +"97bfd8cb": "_setClassMechValue19(uint256)", +"97bff97f": "broadcastTransfer(address,address,uint256)", +"97c0262a": "commissionWallet()", +"97c06deb": "debit(address[],uint256[])", +"97c08da6": "assignBurner(address)", +"97c112d5": "ItemInfo(uint256)", +"97c25f95": "coupon(address,uint256)", +"97c2a9b7": "withdrawFoxt(address,uint256)", +"97c3ccd8": "ban(address)", +"97c414df": "registerAccount(address)", +"97c5ed1e": "showMeTheMoney(address,uint256)", +"97c6006e": "SetFreeQDA(uint256)", +"97c6e24d": "ARMOR()", +"97c8f311": "distributeTokens(address[],uint16[])", +"97c9085f": "fromBytes96(bytes32,bytes32,bytes32,uint8)", +"97c911d5": "InitMaster(address)", +"97c93398": "test_insert_atPosition()", +"97cb2c17": "getSpaceshipProductPriceByModel(uint16)", +"97cbdfc9": "transferAbnormalERC20Tokens(address,address,uint256)", +"97cc3070": "setOrderFill(bytes32,uint256)", +"97ccd07b": "medium()", +"97cd1829": "copyEntireGlofile(address)", +"97cda349": "getLargeBonus()", +"97cdcbfd": "trainEquipment(uint256,uint256,uint256)", +"97ce3a4b": "getUnitsInProduction(address,uint256,uint256)", +"97ce8c43": "setFashionSuitCount(uint16,uint256)", +"97ceb310": "setHardCapInEther(uint256)", +"97d02e00": "DaoChallenge(address)", +"97d0b02c": "setUserManager(address)", +"97d11588": "createStandardDerivative()", +"97d159e7": "setMinTransfer(uint256)", +"97d32a12": "afterCrowdsaleAddress()", +"97d33c33": "burnNotDistrTokens(uint256)", +"97d351b3": "_doTradeForEth(address,uint256,address)", +"97d3624c": "TransferableMeetupToken(string,string)", +"97d3c683": "priceStep8()", +"97d425cb": "canBeTransfered(address,uint256)", +"97d47a60": "registerAccountant(bytes,address)", +"97d4cfb9": "initialTokenSupply(address,uint256)", +"97d4f342": "playerOneCommit(bytes32)", +"97d551a1": "TEC_TOKENS_NUMS()", +"97d5c6a1": "setEndTime(uint256,uint64)", +"97d5f823": "sendPOSTokens()", +"97d61c46": "getRedeemValue(uint256)", +"97d63f93": "initSupply()", +"97d68c77": "resolveSupply(address)", +"97d6ce76": "companyTokensInitial()", +"97d6daba": "expropriate(uint256)", +"97d74abd": "dataSourceCallbackTeamId(uint256,uint8)", +"97d7f2ee": "FundToken()", +"97d814c3": "withdrawCeo(address)", +"97d870c8": "tokenWithdraw(address,address,uint256)", +"97d88cd2": "subAllowance(address,address,uint256)", +"97d8a7e9": "getFreelancerHourlyRate(address,address)", +"97daa043": "register(bytes,address,address,uint256,bytes)", +"97db0a7b": "soccerGo()", +"97db7edb": "stopEmergency()", +"97db9a95": "changeAuthority(address,address)", +"97dbfc5a": "ICOEnabled()", +"97dc4a13": "airdrop(uint256)", +"97dc4c6f": "earlyBirdMaxPerPerson()", +"97dc97cb": "authorizedCaller()", +"97dd9892": "getCurrentRoundTeamCos()", +"97ddeb77": "LimitReached(address,uint256)", +"97dedb06": "strToBytes32(string)", +"97df212b": "getPersonaAttributes(address)", +"97df5028": "winProbability(address)", +"97df573e": "storageAddr()", +"97df8a50": "changeSuperContract(address)", +"97e10a79": "transferERC20(address,uint256,address)", +"97e12b0d": "lastRoundEndTimestamp()", +"97e1754c": "previousEntries(uint256)", +"97e18af3": "crowdsaleLock()", +"97e1d68d": "PRESALE_BASE_PRICE_IN_WEI()", +"97e1e9b5": "ILFManagerCandidateKeyHash()", +"97e1f48b": "userReinvest()", +"97e30fc4": "setPendingValue(uint256,address)", +"97e42023": "setRebuyThreshold(uint256)", +"97e484d2": "ElementeumTokenProxy(uint256,address[],address[])", +"97e4c28b": "transferPrefix(string,address)", +"97e4fdea": "pause_2()", +"97e4fea7": "exists(bytes8)", +"97e5d18a": "thirdLoos()", +"97e645f3": "isCallbackDone(address)", +"97e6c7f7": "getWeeklyDividends()", +"97e6dada": "_own(uint8)", +"97e851f6": "updateOptionalCommission(uint256,uint256,address)", +"97e8b490": "edit(uint256,address,uint256,string,string,string,string,uint256,address,uint256,string,string,string,string)", +"97e8e520": "stakeToMany(uint256[],uint256[])", +"97e92794": "digitalSignature()", +"97e950f7": "setMaxInvocations(uint256)", +"97e9a0bf": "contractPrice()", +"97e9beef": "withdrawUser(uint256,address)", +"97ea403d": "getCityResources(uint256)", +"97ea6e15": "bytesToBytes7(bytes1[7])", +"97eb0eab": "addAirdrop(address,uint256,bool)", +"97eb147d": "rlc_bounty()", +"97eb1800": "investorsStockInfo(address)", +"97ebe0d6": "approveTokenCollection(address,address,uint256)", +"97ec23cb": "getCreationTime(uint256)", +"97ec642c": "MAX_WITHDRAWAL()", +"97ec72b8": "STLHToken(string,string,uint8,uint256)", +"97ecd379": "nPlatCurTotalEth()", +"97ecfaab": "delWhitelist(address)", +"97ee041b": "incrementBasketsBurned(uint256,address)", +"97ee0a05": "SendPreReserved3()", +"97eea08b": "Mineral()", +"97eede11": "FACTOR_10()", +"97ef9779": "TransferBase(uint256,string,string)", +"97efff39": "amountToWithdrawOnDate(uint256)", +"97f1943c": "ROG()", +"97f22ea9": "addToPresaleWhitelist(address)", +"97f28419": "getAdminAddressIndex(address)", +"97f2b4b0": "isBetActive(bytes32)", +"97f2f5c3": "maxTokensForSale()", +"97f3016b": "finishLock()", +"97f3bb0c": "removeLocking(bool)", +"97f3c21e": "isUpgradeFinished()", +"97f3de37": "SetDataServerAddress(address)", +"97f46527": "getNextVestingQuantity(address)", +"97f58e91": "isLiquidating()", +"97f59897": "_nextOwner()", +"97f606eb": "ShowUnrelease(address,uint256)", +"97f735d5": "isBanned(address)", +"97f7b4f7": "getBid(address,uint256,uint256)", +"97f8fee1": "CORPAddress()", +"97f9653a": "statisticaldata(uint256,address,address,uint256[5],uint256[5])", +"97f990f2": "KNOWLEDGE_TO_GET_1FRANKLIN()", +"97fa346d": "sellTank(uint32,uint256,uint256,uint256)", +"97fb070b": "registryRequestDocumentation()", +"97fb2a14": "JTU()", +"97fb2cea": "getCustomerAtIndex(uint256)", +"97fbbfd1": "CoinstocksToken(uint256,string,string)", +"97fc93ab": "cashBack(address)", +"97fcb54e": "transfer_eth(address,uint256)", +"97fce1bb": "setGameLogicContract(address)", +"97fcedba": "setTotalInvestedToken(address,uint256)", +"97fdf5f2": "FOUNDERS_TOKENS_VESTED_1()", +"97fe5ea3": "addAdvocatedTAOLogos(address,uint256)", +"97fe728a": "useName(string)", +"97fe9129": "setCCH_edit_27(string)", +"97fea4e3": "showPlayerBetInfo(uint256,address,address)", +"97feb926": "depositERC20(address,uint256)", +"97fed5f2": "TokenXGroup()", +"97ff335b": "AddNewCourse(string,string,string,string)", +"97ff5be4": "getData_12()", +"97ff6d10": "cancelPlatformWithdrawal()", +"98004a2a": "processContributions(address,uint256)", +"980054be": "icoIsFinished()", +"9800fc16": "removeAllowedContract(address)", +"98019a41": "adjustAddressWealthOnSale(uint256,address,address,uint256)", +"9801ca60": "getWeeklyTokensForHoldersAmount()", +"9801cb8e": "ProofOfExistence()", +"98024a8b": "getPartialAmount(uint256,uint256,uint256)", +"98024f18": "testThrowsTransferDisableNotEnabled()", +"9802dd1a": "Dpc()", +"98036e7a": "ADVISORS_PERCENTAGE()", +"98041ea3": "addMember(address,uint256)", +"980481e0": "isABatchOpen()", +"98057510": "addLockedTokeB(address,uint8,uint256)", +"980591f4": "pause(bool,string,address,uint256)", +"9805d7d2": "landsOf(address)", +"98063de4": "LogPollVoted(bytes32,address,uint256)", +"98066221": "FlowchainToken()", +"980934ec": "create(address,string,bytes32,uint256)", +"9809a38b": "supplyPerColor()", +"980b05e0": "_createCollectible(bytes32,uint256,uint256)", +"980b5335": "getAvailableAmountWithdrawal(address,bytes32)", +"980c2f21": "releaseForeignToken(address,uint256)", +"980cf053": "stage4Bounty()", +"980d75ab": "Readcoin()", +"980dc482": "addOrder(address,uint256,uint256,uint256)", +"980e6e08": "timeLeftToCook()", +"980e8c81": "FutureBlockCall(address,uint256,uint8,address,bytes,uint256,uint256,uint256)", +"980ee29f": "MakeDai(address,address,uint256,uint256)", +"980f62b1": "kickoff()", +"980f8e5e": "createPaper(string,bytes32,uint256,uint256[],address,address[])", +"980fb0aa": "abortByBroker()", +"980ff6c6": "executeProposal(bytes32)", +"981012f2": "AddressChecker()", +"9810e089": "return_owner()", +"98110106": "_ownerTransfer(address,address,address,uint256)", +"981101f5": "VERToken()", +"981111ef": "factorial()", +"9811c7c1": "target(uint256)", +"98123528": "numThings()", +"98129013": "left47(uint256)", +"981489b8": "setWidthrawFor(string,uint256,uint256)", +"9814d0ee": "isProposalEnded(bytes32)", +"981566ce": "LotteryCore(address)", +"9816006c": "DeWeiSecurityServiceToken()", +"98163597": "getTotalVolumeEth(address)", +"9816af58": "getUserPools(address)", +"98179c41": "burnBalance(address)", +"98182950": "TARGET_TOKENS_ADDRESS()", +"98191a20": "inPreSale3Period()", +"981a1327": "tokenToExchangeTransferOutput(uint256,uint256,uint256,uint256,address,address)", +"981a60f5": "extractNameFromData(bytes)", +"981ae401": "ACTION_TAX()", +"981b24d0": "totalSupplyAt(uint256)", +"981b405b": "willChangeCost()", +"981b69b7": "soldForFifth()", +"981c6946": "holderAdded(uint256,address)", +"981c80b3": "Maia(address)", +"981c9e07": "PBSU()", +"981cc7ae": "GetRichQuick()", +"981dd797": "process_contribution(address)", +"98203e6b": "setDeprecated()", +"982078b8": "requestTokensFromCrowdsale()", +"98221166": "changeTypeHash(bytes32)", +"982270e7": "setPOOL_edit_6(string)", +"98229465": "_isAuthorizedOrOwner(address)", +"982296a8": "emitEvent(string)", +"9822e501": "exchangeOwner(uint256,uint256)", +"98234a6c": "max_crowd_vitas()", +"982371b4": "cancelOrder(address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)", +"9824425a": "takeOrder(uint256,uint256,uint256,uint256)", +"982475a9": "approveKyc(address[])", +"982495c7": "attend(address[])", +"9824cec8": "CryptoTicketsICO(address,address,address,address,address,address,address,address,address,address)", +"9824e7f7": "userWalletTransferEther(address,address,uint256)", +"98251353": "grantedWallets(address,address)", +"98257d84": "changeDefaultTimeLock(uint256)", +"982657f3": "startGame(uint256,uint256,uint256,uint256)", +"98270d24": "atxToken()", +"982713e1": "ComplexExchanger(address,uint256,uint256,address[],uint256,address)", +"98278bc8": "DefaultSweeper(address)", +"9827a996": "terminateProject(bytes32)", +"98290c53": "stakeBelaSplit(uint256,address)", +"98296c54": "assertEq(uint256,uint256)", +"982a2376": "settingExist(uint256)", +"982a83eb": "createCrowdsale(uint256,address,string,string,uint256,uint256,uint256)", +"982a96e3": "bonusRemaining()", +"982b5dd2": "processVestingRules(address,address)", +"982b6689": "transferMultiple(uint256,address[])", +"982bb5d8": "setDepositsSigned(bytes32,bool)", +"982c0455": "getSpecifiedComment(address,uint256)", +"982d1270": "shiftIn(uint256,bytes32,bytes,address)", +"982e5721": "getRateNow()", +"982f4a21": "INFOCORP_DONATION()", +"983032c2": "newShare()", +"983086df": "HMTCrowdsale(address,uint256,uint256,uint256,address,address)", +"9830a8fd": "getCustomerTxRegistry(address)", +"9830aa07": "UBlockChain(address)", +"98313b10": "splitTokensAfterDistribution(uint256)", +"98315249": "getUsersMicroModulesIds()", +"9831ca4d": "joinMiniGame()", +"983234b6": "setAmounts(uint256,uint256)", +"9832ee65": "resultsWeightedByTokens()", +"98337afb": "largeCount()", +"983485e1": "buyEthereumToken()", +"98358f82": "cap_in_wei()", +"9835efaf": "setAmountToDistribute(uint256)", +"98366d1c": "isMint(int256,address)", +"98390730": "takeAllEther(address)", +"98391c94": "muteMe(bool)", +"9839eafd": "getTicketNumbers(uint256)", +"983a7f47": "setDNA(uint256,uint256)", +"983a8c8a": "_setRoles(address,uint8[])", +"983a95b2": "trackClick(address,address,address,address)", +"983b2d56": "addMinter(address)", +"983b94fb": "finalizeAuction(bytes32)", +"983bc49d": "currentBalance(address,address)", +"983c09ee": "steal(address,address,uint256)", +"983c0a01": "closeCrowdsale()", +"983c4647": "TunTokenERC20()", +"983c7630": "setPermissionByAddress(uint8,address,bool)", +"983c8449": "VzanToken(uint256,string,string)", +"983ce499": "_set2()", +"983df7cd": "isOperatorAuthorizedBy(address,address)", +"983e1318": "Hack()", +"983ef725": "getDifficulty(uint256)", +"983f724b": "getCassetteType_()", +"9840a504": "NFCToken()", +"9840a6cd": "getSubscriptionValue(bytes32)", +"9840a8f8": "minAllowedBetInTokens()", +"98413ff1": "extensionByIndex(uint256)", +"98416339": "KRYPTONIUM()", +"98419ec5": "shouldThrowOnAttemptToTransferWhenNotOwner()", +"9841a2d8": "startSale1Phase()", +"9842692b": "_contractFallbackERC223(address,address,uint256)", +"984274af": "preTgeCap()", +"9842a37c": "__callback(uint256,bytes32)", +"9842ec30": "drawItemLottery(address,uint256)", +"9843e648": "setItemsEC(address,address)", +"9843eae3": "airdropActive()", +"984413b8": "_eraseNode(bytes32)", +"9844347b": "createCertificate(bytes,bytes,uint256,bytes)", +"98445e6f": "getCurrencyPayment(address,uint256)", +"9844613e": "ViewCoin()", +"984474fb": "price_token()", +"9844c294": "existenceAllowance(address)", +"9844d5a7": "Martcoin(uint256,string,string)", +"984572d0": "privatePreICOBonusPercent()", +"9845b448": "PHASE5_START_TIME()", +"98475e30": "BTCETH(uint256)", +"9847d267": "GoodLuckCoin()", +"984809bf": "setPublicOfferingLimit(uint256,uint256)", +"984877b0": "GoalHitWithdrawl()", +"9848fef8": "tokensReleasedToEcosystem()", +"984a27be": "m_SMRMinter()", +"984a470a": "forwardedOutcome()", +"984a74f7": "TazitToken()", +"984ac378": "lotteryTitle()", +"984bc8c5": "placeTicket()", +"984c0450": "withdraw(bool,uint256)", +"984c14ac": "setupVolumeMultipliers(uint256[],uint256[],uint256[])", +"984ce0fd": "transfertoacc(string,uint256)", +"984d11fc": "validSupply()", +"984d4a93": "setAdminsAddress(address)", +"984ddfe8": "DevTokensHolderMock(address,address,address)", +"984e1ff4": "mock_setShouldSucceedTransfers(bool)", +"984e2829": "_updateState(address,int128,uint128,uint256)", +"984e5a0b": "FunKoin()", +"984ec03e": "_storeStakes(uint256,address,uint256,uint256,uint256,uint256,uint256)", +"984fba49": "removeInvestorFromWhiteList(address)", +"9850d32b": "maintainer()", +"98512d72": "round1TokensRemaning()", +"9851553b": "EthereumTravelToken(address,uint256,string,string)", +"9851663f": "_computeCurrentPrice(uint256,uint256,uint256,uint32)", +"98519340": "setParameters(uint32,uint32,uint32,uint32,uint32,uint32)", +"9851b2bd": "AIN()", +"9851fd9a": "eventStatus()", +"9852099c": "depositId()", +"9852595c": "released(address)", +"9853b234": "createPhoenix(uint256,uint256,uint256)", +"98544710": "setKeyHash(bytes32)", +"98547a45": "donacionCruzRoja()", +"985540b9": "remove(int8,int8)", +"98575188": "removeUser(address)", +"9857650c": "claimIFactor(bytes32,uint256)", +"9858cf19": "FREE_SUPPLY()", +"9859387b": "createAccount(address)", +"98593b7a": "SenseProtocol()", +"98596560": "get_activity_by_id(uint256,uint256)", +"98596726": "note(uint224)", +"98597629": "max_value()", +"98598905": "subVirusDef(address,uint256)", +"985989d2": "ROLE_UNDER_MINTER()", +"9859adf0": "_payByEth(uint256)", +"985a882c": "MINEX()", +"985b71f1": "calcBindedBlindHash256(string,address)", +"985bcf34": "canExit(bytes32)", +"985bdd43": "isExchangeAlive()", +"985c7564": "getNextTournamentData()", +"985d43f1": "TOTAL_APC_SUPPLY()", +"985d5702": "ExShellStock()", +"985dea23": "getETH(uint256,address)", +"985df3a7": "setHeroAssetAddress(address)", +"985e2cdf": "updateExchange(address,address,bool,bytes4[])", +"985e4634": "CreateLPT(address,uint256)", +"985e4cd0": "sumBalanceOf(address)", +"985f26f6": "AddOwners(address[])", +"985fc7ea": "destructionAddress()", +"98603cca": "disableBurning()", +"98608111": "getStorageNameHash()", +"9860d0a5": "setTransferFee(uint32,uint32)", +"98636f32": "isException(address)", +"98646d68": "setNumDesignatedReportNoShows(uint256)", +"98650275": "renounceMinter()", +"98668b24": "tokensVotedForDisable()", +"98672215": "getTearAward(address,uint256,uint256)", +"98683105": "CCH_EDIT_1()", +"98686304": "Elance()", +"986876e6": "ChannelCreated(address,address,uint192)", +"98688a95": "Ai()", +"9869aca0": "setSchedule(uint256,uint256)", +"9869b736": "ONE_MILLION()", +"9869f1b7": "migrateTokens(address,address)", +"986b3a9a": "getCanvSize()", +"986b5676": "loveID()", +"986bb99a": "setPOOL_edit_30(string)", +"986bf5e8": "addAudit(bytes32,uint256,bytes32,uint8,bytes32,bytes32)", +"986c1938": "setRegistrarAuth(address)", +"986c7cc7": "BitArbToken()", +"986cc311": "executeProposal(uint256,uint256,uint256)", +"986ccc7f": "setHelper(address)", +"986d08a8": "OSECOIN()", +"986dcd4d": "setCycleLimit(uint256)", +"986e791a": "getString(bytes32)", +"986e7ed3": "AssignGGCOwner(address)", +"986ec464": "tokensLeftDrain(uint256)", +"986ee316": "VoteMemberCandidate(uint256)", +"986f3c9b": "addComment(address,address,bytes32,bytes32,bytes32)", +"986f737b": "onrs(uint256)", +"98702402": "refPercentage(address)", +"9870d7fe": "addOperator(address)", +"987196ae": "HabibaTokenCoin()", +"9871cb8f": "Moneto(address)", +"9871e4f2": "makeSubscriptionId(address,uint256)", +"9871e510": "hashExists(string)", +"9871ee02": "PCT()", +"98729c37": "_changeUpPrice(uint256)", +"9872a20a": "registerUInt(address,uint256)", +"98738f97": "preIcoBonuses(uint256)", +"9874a3d0": "WAIT_BLOCKS()", +"9874cdf4": "performRefund(bytes32,bytes32)", +"9874f5d7": "addString(string)", +"9875958c": "PlaceRocketForSale(uint32,uint80)", +"98764f22": "setPrice(uint32,uint64)", +"9876962a": "setstart()", +"9876ee61": "coinsAddresses(uint256)", +"98772e80": "disrupt()", +"987757dd": "settle(bytes32)", +"98779240": "transfersAllowDate()", +"9877bdff": "Alice()", +"9878cc51": "MELON_ASSET()", +"98791010": "deleteHpbNode(address)", +"987b7967": "BLOCKMALLToken()", +"987b904b": "BOUNTY_LIMIT()", +"987bc844": "HolikopterTokenToken()", +"987c4311": "setPublicChainlinkToken()", +"987c6b9d": "swap(address,string,string,uint256,uint256,uint8,bytes32,bytes32,uint256)", +"987c9efd": "PayIreward()", +"987cb9b0": "updatePublicSale(uint256)", +"987cec61": "converted(uint256)", +"987d9768": "ILF(address)", +"987e565d": "buyKim(uint256)", +"987ea899": "addAssetManager(address)", +"987eae8f": "totalPets()", +"987eeee5": "createMain()", +"987f3bdb": "_playGame(uint256,uint256,uint256,bytes32)", +"987f710a": "TIME_TO_COOK()", +"987faf18": "prevJackpotsLength()", +"9880472f": "multiSigOutputAddress()", +"98804938": "deposit_eth(uint8,uint256)", +"98806bf0": "convertTokens(address)", +"98827d5e": "createCoins()", +"9882e15e": "withdrawOverdue(address,address)", +"9883521e": "presaleProcessed()", +"9883548a": "fint32(int32)", +"9883b9f4": "addAmendment(string)", +"98842c3b": "ipfsGet(uint256)", +"988483d4": "convertMsgValueToBytes20()", +"98864aaf": "getPropertyFlag(uint16)", +"98866c1a": "personUpdateDOD(uint256,int256)", +"98866ead": "_gensGenerate()", +"9886de1f": "multiTransfer(uint256,address[])", +"98876609": "create(bytes32,address,bytes32[])", +"98880043": "addGame(string,string,uint256,uint256)", +"9888103f": "buyTokensInternal(address)", +"988a18f6": "claimTokens(address[],address)", +"988a9fb5": "getTokenIdOfAddressAndIndex(address,uint256)", +"988b1d86": "remoteApprove(address,uint256)", +"988b590f": "withdrawBSAFE(address,uint256)", +"988ba8e8": "finishPreSaleRound()", +"988bfcfa": "_buyToken(address,uint256)", +"988bfd47": "ProxyCreationAndExecute(address)", +"988da80f": "getUserName(uint256)", +"988fc9a8": "fetchOrderByIdWithWithPayerByAdmin(string,address)", +"9890220b": "drain()", +"9890d6bc": "GetDisputesAtTheMoment()", +"9890eabe": "distributeDividendsOnTransferFrom(address,address,uint256)", +"9890f48a": "LocalStarRoster()", +"9891d61c": "getEnabledTokensLength()", +"9892003a": "TexasHoldem(string,uint8,uint8)", +"98924050": "addtoLottery()", +"98924dd6": "_doesUserExist(address)", +"9892977b": "_attributeSale(address,uint256)", +"98934c0a": "payEther(address[],address,uint256[])", +"9893f27e": "allowancePresetTransfer(address)", +"9894221a": "SendCashForHardwareReturn()", +"98943c88": "getAllWeaponData(uint256)", +"9894ba7c": "transferOut(address)", +"9894eb8e": "hashSecretKey(bytes32)", +"98951b56": "approveProposal(uint256)", +"98951bfc": "foundersAmountLeft()", +"9895dd78": "setRegularTransTime(uint32[])", +"98968f15": "purchase(address,uint256,uint256)", +"98969906": "PassportToken()", +"9896b6cb": "testToUint16()", +"98973f2b": "setRestrictedAddress(address)", +"9897e8a5": "scalarEvents(bytes32)", +"9897f916": "manualRelease(address,uint256)", +"98981756": "teamExists(uint256)", +"98983cc5": "isCrowdsalePaused()", +"9898e18c": "tokenSender()", +"9899276b": "getOwnedTokensLength(address)", +"9899722d": "newRateTime()", +"9899a2c5": "aliceClaimsDeposit(bytes32,uint256,bytes32,address,address,bytes20)", +"989a55fa": "_increaseApprovalAllArgs(address,uint256,address)", +"989b595f": "shuffleSeed(uint256)", +"989ceab1": "WhitelistAddressAdded(address,address)", +"989ced26": "updateTokenContract(address)", +"989db511": "Input()", +"989ddfce": "AdminDeleted(address)", +"989e4a8c": "_processPurchase(address,uint256,address)", +"98a05bb1": "deletePermission(address)", +"98a05cfb": "arbitroAprovaPagamento(bool)", +"98a0871d": "buyXaddr(address,uint256)", +"98a0bf6e": "ForeverChain()", +"98a0e1c8": "computeKnockoutPoints(uint8,uint8,uint8,uint8,uint8,uint8,bool)", +"98a10993": "finalizeWhenForked()", +"98a1803c": "ICONotCompleted()", +"98a1b397": "ROLE_OPERATOR()", +"98a1e1ba": "ownerSetLimits(uint256,uint256)", +"98a26497": "payCeo()", +"98a29a58": "testControlDisownNotTransferable()", +"98a2f59f": "ToLend()", +"98a30f76": "totalTokensPreICO()", +"98a322ae": "ownerComission()", +"98a33bfe": "addGlobalConstraint(int256,address,int256,bytes32,address)", +"98a34fef": "withdrawBeneficiary()", +"98a36ebf": "setTradeEventEnabled(bool)", +"98a42ec4": "verificationAddressNumberMap(address)", +"98a595a5": "requiresInitialization()", +"98a6a6c0": "isTokenSaleActive()", +"98a73afa": "getAwards(uint256)", +"98a7cafd": "setData_27(string)", +"98a87f7d": "CPCToken()", +"98a892c9": "getBylawsCashBackVoteRejectedDuration()", +"98a9ae44": "remaindersSet()", +"98a9bfd4": "is_max_goal_reached()", +"98ab1c72": "setBackgroundImage(uint256,bytes)", +"98aca922": "getReceiver()", +"98acd7a6": "getBaseToken()", +"98ad004c": "GetCollectionInfo()", +"98ad2f12": "getid(address)", +"98af629b": "winnerDecidedGas()", +"98b00ee0": "getFinalBytes()", +"98b01fe3": "totalBonusTokensIssued()", +"98b04c16": "SportistToken()", +"98b0787e": "playerTwoCommit(bytes32)", +"98b1e06a": "deposit(bytes)", +"98b23a29": "TimeShareEstate()", +"98b35e73": "saveReading(string,string)", +"98b3dfd6": "NamCoin(address)", +"98b41763": "publicGetAdvertisement(uint256)", +"98b547e0": "transfer_ownership(bytes32,address)", +"98b78849": "preStakingDistribution()", +"98b7db75": "PayForFlag(uint256)", +"98b90fe1": "closeOption(address[3],uint256[3],uint256[2],bool)", +"98b9a2dc": "changeWallet(address)", +"98b9d151": "InsuranceHolder(address,address)", +"98ba2453": "canSynthesizeWith(uint256,uint256)", +"98ba676d": "getEntry(uint256,uint256)", +"98bbc47e": "addPerson(uint256,string,string,string)", +"98bca41a": "removeSeenAddress(address)", +"98bcfbb8": "minimumTokensBeforeSale()", +"98bd359c": "deposit(address,uint128,string,uint32)", +"98bd5663": "confirmTime()", +"98bdf6f5": "tokenIdCounter()", +"98be22f7": "forfeitGame(uint256)", +"98be7c62": "minterFeePercent()", +"98be7df7": "releaseEthers()", +"98bf043d": "clearUnusedDeposit(uint256,uint256)", +"98bffb2a": "manualRecovery(address)", +"98c07938": "votersCount()", +"98c086d8": "_amountReq()", +"98c0bb94": "returnante(address)", +"98c16888": "SToekn()", +"98c20c00": "addToAllocation(uint256)", +"98c23836": "schellingDB()", +"98c31b1d": "addEvent(uint256,uint256,uint8,string,string)", +"98c39cc2": "AnubisToken()", +"98c5166c": "inResources(address,bytes4)", +"98c547b8": "setContentExtraData(bytes32,string)", +"98c562b3": "contributionsBySender()", +"98c66b7f": "_startTokenTransfer(uint256)", +"98c69648": "DEFAULT_NAME()", +"98c6a46f": "setPayoutDistributionId()", +"98c6e760": "migrateTo()", +"98c7458e": "getEventsByIds(uint256[])", +"98c83a16": "PRIVATE_SALE()", +"98c8bde6": "GICTBalance()", +"98c9cdf4": "getMinimumCallGas()", +"98c9faac": "cancelActiveAuction(uint40)", +"98ca667f": "FOUNDERS_SUPPLY()", +"98cb12dc": "isRandomPlayer()", +"98cb2342": "getNumEvenSplits()", +"98cba526": "TeamAndAdvisorsAllocation(address)", +"98cbb277": "Admined()", +"98cbefbe": "init(string,string,uint8,address)", +"98cc223f": "BiboToken()", +"98cc2c53": "VerifiedKYC(address)", +"98cc6754": "dumpBalance(address)", +"98cdf0ca": "updateConfig(uint16)", +"98ce476a": "EPTCrowdfund(address,address,uint256)", +"98cef4bd": "earlyBirds()", +"98cf6dd3": "deleteInvestorTokens(address,uint256)", +"98cf6f22": "queryN(string,bytes)", +"98cfa44e": "setFSTPrice(uint256,uint256)", +"98d0573e": "_getActiveMessageId()", +"98d07356": "getDepositValue()", +"98d0a6c7": "setBcouponAllocationFactor(uint256)", +"98d0b85f": "isNonZeroAccount(address)", +"98d0de03": "addPlayerToServer(uint256,uint256)", +"98d15134": "companiesManager()", +"98d24806": "GetPlayerById(uint256)", +"98d2e3b1": "calcTokenToWei(uint256)", +"98d30c50": "winnerCheck()", +"98d31a13": "AIR_2()", +"98d35f20": "anchors()", +"98d41484": "applySettings(uint8,uint256,uint256,uint256,uint256,uint256,uint256)", +"98d48567": "disapproveUserKYC(address)", +"98d4cacb": "_assemblyCall(address,uint256,bytes)", +"98d4e59c": "decreaseOffsaleCountByOne()", +"98d501ca": "OysterPearl()", +"98d5a1b1": "burnFromIco()", +"98d5fdca": "getPrice()", +"98d6ceb3": "BetSetAnswer(address,address,uint256)", +"98d6d8ed": "isPresaleStarted()", +"98d70779": "contRefer50x50()", +"98d714ac": "ethereumFromAltar()", +"98d7352f": "setTokenURI(address,string)", +"98d7456f": "ShowInfo(uint256)", +"98d764be": "Myastheniagravis()", +"98d78fe2": "soldDuringTokensale()", +"98d8adc0": "DividendDistribution(uint256,uint256)", +"98d8d7b4": "Vlicoin()", +"98da2133": "SEC_contract()", +"98da8121": "lock_vote_amount(bool)", +"98daa8c2": "changeJoysoWallet(address)", +"98dacb46": "setLockPostion(address,uint256,uint256,uint256,uint256)", +"98db173f": "calcaultePrizes()", +"98dc6ae2": "divX(uint256,uint256)", +"98dc8b44": "getStageIndex()", +"98dd0293": "changeBonusFrequency(uint32)", +"98dd0baa": "getNumOfLotto()", +"98dd4b7c": "getCountStakesToken()", +"98de4f35": "purchaseTokensfor82(uint256,address,uint256)", +"98de921f": "removeLoanFromPortfolio(uint256,uint256)", +"98dec601": "REGULAR_RATE()", +"98dedf30": "getBySchool(uint256,uint256)", +"98df3d00": "getNote(bytes32)", +"98df67c6": "revealSecret(uint256)", +"98e00e54": "getCallWindowSize()", +"98e02be7": "abandonShip()", +"98e09333": "valueGet(address,string)", +"98e0fb08": "ICO_TOKEN_SUPPLY_LIMIT()", +"98e12d12": "updateAnimal(uint256,string,string)", +"98e15065": "info256(string,uint256)", +"98e1a322": "LivepeerTokenFaucet(address,uint256,uint256)", +"98e1b410": "getMoney()", +"98e1b6cd": "stopPromotion()", +"98e23dcf": "finishPreSale5()", +"98e25733": "currentRoundNum()", +"98e314a2": "distributeDonationTokens()", +"98e364d6": "saasApiProfitAddress()", +"98e3d1d3": "getWineProductionRate()", +"98e4053f": "changeVerify(address)", +"98e47e49": "LoomToken()", +"98e4f581": "getSkin(uint256)", +"98e527d3": "getProposalsCount()", +"98e52f9a": "decreaseSupply(uint256)", +"98e54c55": "setAsTest()", +"98e6176a": "_isProxy(bytes32)", +"98e73df9": "hasOutstandingChallenges()", +"98e76e06": "buyValue()", +"98e7ea43": "reward(uint32[],address[])", +"98e8c54f": "testerCanReentrant()", +"98e8f365": "getYourRewardStock(address)", +"98ea1c51": "ecrecovery(bytes32,uint8,bytes32,bytes32)", +"98ea5fca": "depositEther()", +"98ea6536": "_beginOfICO()", +"98eaca94": "inKissBTC(uint256)", +"98eaf11c": "getBool(bytes32,bytes32)", +"98eb1096": "CalculateCreateFee(uint256)", +"98ec341d": "addThing(bytes32,string,string,bytes32)", +"98ec9095": "total_distribution()", +"98ecd12c": "test_mixValidEqBytes32Message()", +"98edc9ce": "distributeLottery()", +"98ef4b0b": "total_iou_purchased()", +"98ef5bf9": "BuyItem(uint256,string)", +"98f038ff": "migrateRegistry(uint256)", +"98f04128": "getRoundJackpot(uint256)", +"98f1312e": "MINT_CAP()", +"98f1e0e7": "sendTokensWindow(uint8)", +"98f20367": "Curatable()", +"98f22786": "FireToken()", +"98f23a6d": "createToken(string,string,uint32,uint256,uint256)", +"98f25c44": "removeCurator(address)", +"98f28571": "ClientOrderEvent(address,uint8,uint128,uint256)", +"98f2af3a": "createGame(uint32,uint64,uint32,uint32)", +"98f31c82": "price2Of(uint256)", +"98f32d1d": "getCatRequestPrices()", +"98f3b81a": "getShares(address,bytes32[],int256[])", +"98f3c443": "CROWDSALE_WEI_CAP()", +"98f423b2": "bitsmileToken()", +"98f42e3b": "payoutInvestors()", +"98f44c62": "resetTokenOwnerReward()", +"98f4b1b2": "rateOracle()", +"98f4f54f": "KhairulRamadhan()", +"98f52c52": "firstChainHNw1()", +"98f5ee5d": "spawningManager()", +"98f69aeb": "_addChildToParent(bytes32,bytes32)", +"98f6c7e5": "refereeInvitations(address)", +"98f6ff63": "unlock(string,address,address,uint256)", +"98f72f42": "COSS()", +"98f7ba63": "UBCToken()", +"98f8193b": "replaceTokenFix(address[],uint256[])", +"98f87496": "setRateFinalStage2(uint256)", +"98f8fe90": "accessCostMYB(uint256)", +"98f96c3a": "AboutKelvin()", +"98f9724f": "holderAmount()", +"98fa6c8a": "batchTransferETHs(address[],uint256[])", +"98faa9a1": "getStageBonus(uint256)", +"98fabd3a": "DAO()", +"98faf5d1": "TBsell()", +"98fb0ac5": "tokenGenerationEvent()", +"98fb2eca": "voteStopped()", +"98fc2e0a": "GetTickSize(uint256)", +"98fc55d8": "whitelist(address,uint256)", +"98fcc93e": "getNumberOfBets(uint256)", +"98fdb377": "REOC()", +"98fdfd8e": "changeMallcoinTokenAddress(address)", +"98fe2b49": "NotifierChanged(address,address)", +"98ff116d": "deposit3(address,address)", +"98ff1ba1": "tokensGenerated()", +"98ff8075": "claimBounty(address)", +"990030cc": "trusted_contracts(address)", +"9900c978": "ScudoCash()", +"99013562": "Reject(address,string)", +"99016142": "claim(uint256,address,uint256,bytes)", +"9901bc77": "YRX()", +"9902ef5b": "blockLeft()", +"990333be": "salesDeadline()", +"99035895": "approveERC20()", +"9903745f": "SetsecondTTaxAmount(uint256)", +"990386e8": "dailyRelease()", +"9903a2bd": "calcReleaseToken(address)", +"9903c29c": "SALE_MAX_CAP()", +"990460c1": "ownerKill(address)", +"990484a7": "valueToToken(address,uint256)", +"9904a68d": "requiredDays()", +"9904e174": "sellTokens()", +"9904ed8d": "Reputation()", +"990502d0": "GasBuy()", +"9905b744": "logUint(uint256)", +"99061a08": "AltCrowdfunding(address)", +"9906352f": "MANAGE_CAP_PER_ROUND()", +"9906f41c": "setDevelopeo(address)", +"9906f81b": "Entrant(address)", +"99076eca": "IHubToken()", +"990816bb": "BitcoinSilver()", +"9908b25b": "publicTransferToken(address[],uint256[])", +"9908d3cf": "AMEBToken()", +"99091c93": "insertLawyer(address,uint256)", +"990986dd": "getRawPendingAmount(uint256)", +"9909afed": "has(address,string)", +"9909d1a2": "createTestData()", +"990a6a64": "SC_locked()", +"990ae727": "clearZoDailyLimit()", +"990c5485": "proxyMergeMint2(uint256,bytes32,address[])", +"990c75ed": "getWhitelistedAmount(address,address)", +"990c8f79": "returnValue()", +"990ca3ff": "tokensToBeAllocated()", +"990cc5c9": "buyFromCurrentOwner(uint256)", +"990d6fd2": "getNextTranche(uint256)", +"990dc9db": "transferFunds(address,uint256)", +"990dec94": "signToResetAddTokenData()", +"990e178a": "_revealBlock(address)", +"990e1c9b": "withdrawStep()", +"990e2979": "submittedAmount()", +"990e713b": "buyTokens(address,uint256,bytes4,bytes32)", +"990e80a3": "setAddressOf(string,address)", +"990ed905": "setNewBonusScheme(uint256)", +"990eda99": "FreezeAddress()", +"990f3f53": "computeResponseSecondHalf(uint256,uint16)", +"990f412f": "setAssetHolder(address)", +"990fa439": "setLLV_edit_1(string)", +"99110d3c": "PRESALE_END_TIMESTAMP()", +"991162db": "getDank(uint256)", +"99116354": "errorAndRefund(string)", +"99119290": "getCryptodiamondAddress()", +"9911ec1e": "freezeTokensToInvestor(address,uint256,uint256)", +"991257a2": "getSenderLands(address)", +"9913380e": "_getInt(address,bytes32)", +"99133c9f": "matched(address)", +"9913dcbb": "AEFToken()", +"9914038a": "getBankRollGrowthForGameId(uint256)", +"99141a47": "iffun()", +"99142b5f": "send(address,string)", +"99154b49": "ARK()", +"9916233e": "LimitOrder(address,bool,uint256,uint256)", +"99166f7d": "getTotalAddresses()", +"991678bf": "LogRefundETH(address,uint256)", +"9916c350": "numberEthUpdates()", +"9917ccb8": "HongmenToken(uint256,string,uint8,string)", +"9918925d": "setClaim(address,bytes32,bytes32)", +"9919b1cc": "getContentsByRanks(address,uint256,uint256,uint256)", +"9919c9cf": "getGoldBackedByEachToken()", +"991a3b5e": "ARCD_FUND_DEPOSIT()", +"991a9fa9": "etherHasBeenReturnedToInvestors()", +"991b650d": "dataIdentifierCount()", +"991bcae8": "setup(address,address,address,address,address,uint256,uint256,uint256[])", +"991c9ae5": "set(uint32[],uint24[])", +"991cc283": "distributeICOTokens(address)", +"991d79b5": "EtheremonAsset(address,address,address)", +"991dd5b6": "read_user_purchase_at_index(address,uint256)", +"991e0139": "completeJob(bytes32)", +"991e47ff": "CoinWindow(uint256,string,string)", +"991e86bb": "c_maximumTokensSold()", +"991ef443": "publishers(uint64)", +"991f6798": "updateEQUIPrice(uint256)", +"991fa5af": "BinaryOption(address,address,address)", +"991feab5": "MMToken(uint256,string,uint8,string)", +"991ffd4e": "scheduleCall(address,bytes,bytes,uint256,uint256,uint8,uint256)", +"99209e33": "setEndOfCrowdsale(uint256)", +"9920ecb8": "buyPhaseTokens(address)", +"9921cac5": "AlbertCoin()", +"992204e6": "GoldFee()", +"9922ea86": "allocateTokens(uint256,address)", +"99244d1a": "testvalue()", +"99248d3e": "AxieAccessControl()", +"992495e2": "minerRandomNumber()", +"9924ab31": "CIVCoin()", +"9924ad7c": "ovatel()", +"9924ba1a": "updateInfo(address,address,uint256,uint256)", +"9925b9c1": "setMintFeeAbs(uint256)", +"9925d68e": "createPreSaleShip(string,uint256,uint256)", +"99260144": "rewardMintOwner(address,uint256)", +"9927482d": "proxy(address,string,address,uint256)", +"992817b9": "recordGet(address)", +"9928811b": "testBroken()", +"99288dbb": "saleOpen()", +"9929057b": "executeDelayedSetStakes(uint256)", +"992a3e75": "changeBountyPaysTokens(uint256,bool,address)", +"992ae976": "isSafePunctuation(bytes1)", +"992b2f0f": "addSlogan(uint8,string)", +"992bb01e": "eval(bytes32[])", +"992bc0ce": "pay_to_OEM()", +"992c15fc": "MIN_VALUE()", +"992c3ff1": "TrekChain()", +"992c4435": "UETO()", +"992c870d": "transferName(bytes,address)", +"992cb59f": "getOrCreateDisputeCrowdsourcer(bytes32,uint256[],bool)", +"992d4196": "GNR(address)", +"992e0aa0": "purchaseBonus(uint256)", +"992e2a16": "getReportingEndTime()", +"992e74a9": "maxRefererTokens()", +"992e820e": "burnValue(address,uint256)", +"992ebc52": "setCounterLimit(uint256)", +"992ee4b6": "raiseTap(uint256)", +"992ee874": "WithdrawToken(address,uint256)", +"992fa380": "OmnisBit()", +"99304cd4": "AssetWithdraw(address,uint256)", +"993090d0": "adjustPrices(uint256,uint256)", +"9931a916": "TokenRK70Z()", +"99325442": "getCollectedOreBalances(address)", +"9932dc05": "codeToAddress(string)", +"9932fa28": "API2()", +"993301b2": "libbatchbacktest(bytes32,uint64,uint32[],uint64[],int64[])", +"9933a24a": "allowDirectDebit()", +"9933c6b5": "getPokemonLock(uint256)", +"9933d225": "addSpecial(address,uint16)", +"993480cf": "calculateRequiredVerifiers()", +"99348e90": "rewardsFunds(address,uint256)", +"99348f8e": "eggAvailable(uint16)", +"99351742": "distributePrize(uint256)", +"99352c42": "updateBtsPoint(uint16,int256,uint16)", +"99358876": "maxMintCookie()", +"9935935f": "setResolveHandler(bytes,address)", +"9935b968": "jesterBank()", +"9936746a": "DepositReceived(address,uint256)", +"99369801": "presaleTokenBalance()", +"99372321": "test(bytes32)", +"993783fc": "eraFromMokenData(bytes32)", +"99379718": "GimmerToken()", +"99384976": "setFounder(uint256,address)", +"9938579b": "getStatusTransferFrom()", +"9938b0de": "setPublisherCut(uint128)", +"9938be42": "getPOOL_edit_19()", +"9938fdd1": "downTick(address,uint256)", +"99393132": "onBurnCalled()", +"99395b1e": "OffMenuMorsel()", +"993ab58e": "setTournament(address)", +"993ae7e9": "updateUserBalance(address)", +"993af624": "BrehonContract(address,address,uint256,address,uint256,uint256,address,uint256,uint256,address,uint256,uint256)", +"993b4f71": "transferBag(address,uint256)", +"993b8cde": "countPurchasedPixels(address[16])", +"993bcc63": "enableTokenBurn()", +"993c78fa": "getMintApproval(address)", +"993ca7e3": "RTB1()", +"993d1123": "BoltToken()", +"993d13bd": "PRE_ICO_MAX_CAP()", +"993d29fc": "Mindmap_Token(uint256,address)", +"993d3489": "investorShortInfo(address)", +"993eaefa": "TravelWithMeToken()", +"993eda02": "giveArtworks(uint8[],address,uint256)", +"993f3197": "TOSInstitutionsHoldingContract()", +"993fd4de": "setTokensSource(address)", +"99404433": "levelup(address,uint256)", +"99405ad7": "NewTokenSale(address,address)", +"9940fb5d": "convertToMeth()", +"99413b4e": "connectToken(address)", +"994162cd": "BasicTokenStorage()", +"99418a21": "signEthereum(bytes32)", +"9941e3d0": "setCallAddress(address)", +"9942aa4d": "create(address,address,address,address,address,address,address,string,string,string,string)", +"9942ce36": "_initializeLockupStages()", +"9942ec6f": "f2()", +"99433fc3": "GreenWorldFarmToken()", +"99434669": "fabricoin()", +"99439089": "validatorContract()", +"99444e30": "ICOprice()", +"9944b729": "withdrowTokens(address,uint256)", +"9944d5e7": "burntBounty()", +"99456542": "getLargeBonusStopTime()", +"9945e3d3": "redeem(bytes)", +"99464c89": "freezeAll()", +"9946b9a5": "disable(uint256)", +"994828a1": "BabyBearToken()", +"9948e493": "calcMarketFee(bytes,uint256)", +"99497349": "setData_29(string)", +"994977e5": "finalizeRent(uint256,uint256)", +"9949f0c8": "convertEthToWeth()", +"994a69d1": "centsToTokens(uint256)", +"994aca84": "TrenoToken()", +"994b1a0f": "changeDivCardAddress(address)", +"994cc574": "setAyantDroitEconomique_Compte_9(uint256)", +"994d3969": "whitelistStart()", +"994d3be3": "publishFunctionMessage(uint256,string,string,string)", +"994e5267": "SetMaxAttempt(uint8)", +"994ebbe3": "signUpForPVP(uint32)", +"994f2e10": "getUpdateDerivePayoutDistributionHashValue()", +"994fb25f": "FileNameInt()", +"994fe290": "verificationListMap(uint256)", +"994ff619": "setKitty(address)", +"9950ace1": "rollRoom(uint256,address)", +"9951a2c8": "createTeamSaleAuction(uint8,uint256[9],uint256,uint256,uint256)", +"9951fc72": "TokenVesting()", +"99522297": "preCrowd_tokens_scaled()", +"9952b63d": "_receiveDonation(address,uint256)", +"995344da": "_updateVoucherMthEthRate()", +"99538898": "addTeamAddressInternal(address,uint256,uint256)", +"99540fe0": "normikaivo()", +"9954cf22": "JUST()", +"99552af1": "multiInvokeWith2Args(address,string,address[],uint256[])", +"99554e7b": "getNextFetchTime()", +"99554fb7": "distructVault()", +"99556615": "calculateProfitGameType2(uint256,uint256)", +"9956587e": "REGISTERFEE()", +"9956a28c": "mediumBuy()", +"995771b9": "CarnageToken()", +"995783d9": "ERC20(uint8)", +"9957ad05": "withdrawCreator()", +"9957f3e6": "KvantorToken()", +"99583417": "transferMultiple(address,uint256[],uint256[])", +"995893e6": "_createRole(bytes32,address[])", +"9958c661": "getstate(address)", +"9958d553": "max_creation_rate_per_second()", +"9958f045": "drasticMeasure()", +"995a15a8": "TouristToken()", +"995a299e": "setCurrentSeller(address)", +"995a2b52": "DeusETH(address)", +"995a7174": "_toLeconte(uint256)", +"995ab62e": "GAS_LIMIT_IN_WEI()", +"995b129f": "setAirDropManager(address,address)", +"995b2cff": "executeAffirmation(address,uint256,bytes32)", +"995b2e2c": "getUnreadMessage(uint256)", +"995b40f3": "_getNextAuctionPrice()", +"995b4a80": "LogTokenSent(address,bool,string)", +"995b5aae": "feeInfo()", +"995cb4ec": "doWorkAndPayEAT()", +"995cc82b": "powerTotalSupply()", +"995cd653": "createSale(uint256,uint256,address)", +"995d9ab7": "getTags()", +"995e4339": "getResult(uint256)", +"995e599d": "ARCONA()", +"995f80e9": "NewSoftCap(uint256)", +"995fac11": "migration(address,address)", +"99600baa": "SVIP()", +"99603bfe": "CryptoDuelCoin()", +"9960d947": "grantKudos(address,uint256)", +"99613a3f": "metaSet(address,uint256)", +"9961476c": "MatchBetting(string,string,uint256,address,address,uint256)", +"996301e4": "claimTimeoutEnded(bytes32)", +"9963181e": "setAyantDroitEconomique_Compte_10(uint256)", +"9963a8e0": "fund(bytes32,string,address,uint256)", +"99645ba2": "changeStepLockFlag(bool)", +"9964622c": "_setPendingAnchorAdmin(address)", +"9964935e": "makePayout()", +"99649d06": "setInitialDeposit(uint256)", +"996517cf": "mintLimit()", +"99651db8": "addShares(uint256)", +"99653fbe": "submitVote(uint256,uint8)", +"9965b3d6": "claimProxyOwnership()", +"9965ea53": "setPFManager(address)", +"99671dfb": "Sacacoin()", +"99678b43": "setFunctionThreePrice(uint256)", +"9968b87b": "SogetiTestCoin()", +"99693026": "setInitialState(address[],uint256[],address[],uint256[100][],uint256[],uint256,uint256,uint256,uint256)", +"99694cf2": "WIKICOIN(uint256,string,uint8,string)", +"9969b256": "sendOwnersBalance(address,uint256)", +"996a4be3": "uintToBytes(uint256,uint256)", +"996a8046": "__callback(bytes32,string,bool)", +"996b434a": "littID()", +"996b8b76": "updateIndividualCertificate(string,bytes32,bytes32,bytes32)", +"996cba68": "claim(address,address,uint256)", +"996ccf0b": "CockToken()", +"996d21aa": "privateTotalSupply()", +"996d2d65": "addAtkBossQuest(address)", +"996d310d": "resumeTransfer(uint256)", +"996ea781": "getOrganName()", +"996ec1f3": "BigBlockCoin()", +"996ed6e1": "TransactionSucceeded(address,uint256,string,address)", +"996f3247": "closeWall()", +"996f677b": "icoInvestmentsCount()", +"996f7602": "GetTotalMinerCount()", +"99704b65": "isAcceptedImportingAuthority(address)", +"997072f7": "getMemberCount()", +"9970e26b": "ParyToken(string,uint8,string)", +"9971b98d": "getDesign(uint256)", +"9971c6ce": "gupToken()", +"99721229": "amountForBonus()", +"9972b76c": "haltedFX()", +"9973b827": "totalLotteryValue()", +"997402f2": "liquidityAdd()", +"9975038c": "burnAll()", +"9975091a": "pausePreSaleRound()", +"997519f2": "SingularityNetTokenMock(address,uint256)", +"99753de7": "clear_level()", +"99755bab": "ICOCents()", +"9975c06b": "logDebug(string)", +"99761662": "YouWin(address,uint256,uint256)", +"997636ec": "play(string,uint256)", +"997664d7": "totalDividends()", +"997676c3": "checkWhitelistExist(address)", +"99767aa9": "FLC(uint256,string,string)", +"9976d32a": "coinOwner()", +"9976f5c5": "ProofOfDoge()", +"9976f9e1": "setAgriChainCultivation(address)", +"99771006": "GLORY()", +"99777d9d": "isPublicTokenReleased()", +"9977a108": "isCollected(address,bytes32)", +"9977b698": "startTokensSale(uint256,uint256,uint256,uint256)", +"99789670": "Initialized(uint256,uint256)", +"9978be95": "TOKENS_ADVISORS()", +"9978f01b": "setExchangeRate(address)", +"997995ec": "revealResultUncleMerkleProof(uint256,uint40)", +"9979b7aa": "CETACEA(address)", +"9979c009": "buyItem(uint256,uint256)", +"9979ef45": "placeBid(uint256)", +"997a0229": "_newPrice(uint256)", +"997a12fa": "attowethBalance()", +"997a2c1c": "numberOfMyComponents()", +"997aa31f": "sellChannel(string,uint256)", +"997bc6c9": "int2str(int256)", +"997c44e4": "setLockRate(uint256)", +"997c88ba": "calculateCurrentDistanceInRange(address)", +"997ce600": "endauction(uint256)", +"997cf69c": "dataset_sha256checksum()", +"997d2df8": "asserti(bool)", +"997d8473": "reserveBalanceMap(address)", +"997dd1c6": "dealHitCard()", +"997e02d9": "wormholeIsOpen()", +"997f0198": "setImageHeight(uint256,uint16)", +"997f35ac": "RewardOffer(address,address,bytes32,uint256,uint256,uint128)", +"997f50d8": "getCurrentTierHardcap()", +"997f51e6": "GAMToken()", +"997fdb1f": "setLockTime(address,uint256,uint256)", +"997ffd13": "quarterFourth()", +"99801bce": "dagheAcqua(uint256)", +"99808aff": "winningTicket(address)", +"9980dee2": "calculateHash(address,address,uint256,uint256,uint256)", +"9980ec86": "getAmount(uint256)", +"99817b47": "releaseVestedTokensForBeneficiary(address)", +"9981bd61": "requestTokenExchangeMax()", +"99820e96": "finishSunning()", +"9982257b": "hotQuestion(uint256,uint256,uint256)", +"998282e9": "winners(uint32,uint32[],uint64[])", +"9982e7ed": "updateBillionsCoinsRemainingToDrop()", +"998446a8": "acceptRequest(uint256,bytes)", +"99847f77": "addUnsoldTokens()", +"9984f30d": "setMaxValue(uint256)", +"99851eac": "updateCards(uint8,uint256[])", +"99863b5c": "canChangeOwnerParams()", +"9986d936": "setRestrictedPercent(uint256)", +"9987680b": "play(address,bytes32)", +"99878d5b": "play_scissors()", +"99879bb9": "startTimeInSec()", +"9987b2d2": "getProposalIndex(address,uint256,bytes32)", +"99882cdb": "propose(bytes32)", +"9988807d": "centsReceived(address)", +"9989a5ae": "setLimitOfParticipants(uint256)", +"998a1f96": "preICORaised()", +"998ac104": "AIRDROP_TRANSIT_ADDRESS()", +"998b022e": "_mintPrimordialToken(address,uint256)", +"998b723b": "waterTree(uint256)", +"998b894a": "isLegalTime()", +"998bac16": "bulkTransfer(address[],address,uint256[])", +"998be0d7": "sendTokenToSingleAccount(address,uint256)", +"998c4f5a": "setEthExchangeWallet(address)", +"998cab7e": "getTransformTarget_pool(address)", +"998eb4cf": "getRank03()", +"998f9203": "INCash()", +"9990b3a3": "getPreSaleWallet()", +"9990db92": "CryptoSureToken()", +"999122f4": "BHK()", +"999377ec": "acceptBlokTokenOwnership()", +"9993fa94": "balanceOfSender()", +"9994e112": "AddContact(address,bytes32,bytes32,bytes32,bytes32,bytes32)", +"9995bbf7": "ethforp3dbuy()", +"99967819": "lastaction()", +"9996eb64": "batchNewAccount(address[])", +"99999342": "GetBonusInv()", +"9999aae5": "EYTToken()", +"9999bd2e": "RATE_PRESALE()", +"9999d2ae": "getSubmissionCount()", +"999a9965": "setMany(uint256,int256,uint256,bytes,address,bytes)", +"999b078e": "isSoftCapHit()", +"999b5c72": "FASET(uint256,string,uint8,string)", +"999cbaf5": "Deposit(address,uint256,uint8,uint256)", +"999cef04": "PublishWorldCupResults(bytes32,bytes32,bytes32,bytes12)", +"999d350d": "totalBonusGiven()", +"999d3947": "getGenes(uint40)", +"999d46b9": "transferInterviewer(address)", +"999dd03e": "poolAddressCapTier2()", +"999eb6b1": "balanceOfThis()", +"999f18a6": "unsigned()", +"999f4b38": "sellDividendPercent()", +"999f5644": "Stoppable()", +"99a032ce": "isCurrentAccountReader(address,address)", +"99a03c70": "realBalanceOf(address)", +"99a17344": "setHiddenLogic(address)", +"99a1a412": "getModeratorCount()", +"99a2e1ec": "roundLatLngFull(uint8,int256)", +"99a3e03f": "testNegativeIntegerKeyValue()", +"99a3f0e8": "right70(uint256)", +"99a44e68": "BEXP()", +"99a48638": "packSettings(uint256)", +"99a48e17": "FinalizableToken(string,string,uint8,uint256,address,uint256,address[],uint256[])", +"99a5d747": "calculateFee(uint256)", +"99a6993b": "KCCTOKEN()", +"99a6f7d2": "createReserveTokens()", +"99a752d7": "setPriceETH(uint256)", +"99a79790": "startTimeSale2()", +"99a7b857": "FundsWithdrawal(address,uint256)", +"99a7b884": "getBuyerFullInfo(address)", +"99a7e9db": "get_presale_iconiq_arbits_per_ether()", +"99a856e3": "firstBonusRate()", +"99a88ec4": "upgrade(address,address)", +"99a8f2fe": "EncryptedToken()", +"99a9a04c": "BITStationERC20()", +"99a9ccb2": "preMinedSupply()", +"99a9f1b5": "totalStakingUnits()", +"99aa5d97": "Pixel()", +"99aa93c8": "numSales()", +"99aba8e3": "distribute(address,uint256,uint256,uint256)", +"99abaabb": "addMarketToWasCalled()", +"99abd788": "FIRSTSALE_TOKENCAP()", +"99ac4569": "withdraw(uint64,address[],uint256)", +"99acc3fd": "prizeshow()", +"99ad91c7": "AddAdmin(address,address)", +"99ae6a16": "Winner(address,uint32,uint32,uint256)", +"99aeade3": "iterateTable(uint256,uint256)", +"99aef94a": "getMyEntitySimple(uint256)", +"99af4114": "createPet(uint256,uint16,address)", +"99afb9b9": "createValidatedRequest(address[4],address,uint256[12],uint256,bytes)", +"99b0dc4d": "areAllUppercase(bytes16)", +"99b1adbf": "isUserMember(address)", +"99b22701": "delBackend(address)", +"99b29044": "getPropertyEarnUntil(uint16)", +"99b2a233": "offlineGuardianSold(uint256,address,uint256)", +"99b465cb": "currentSegment()", +"99b47af8": "reveal_test_data_groups_block_size()", +"99b4a0c6": "BTRL()", +"99b55343": "termsNumber()", +"99b58f06": "icoPushAddr(uint256,address)", +"99b5b2fa": "horseIndexPrice(uint256)", +"99b632e4": "winnovate()", +"99b6f5a1": "sendAdvisorsTokens()", +"99b721a5": "rewardEthAnd(address[])", +"99b77032": "setMinBuyLimit(uint256)", +"99b83f3d": "setMaxRedemption(uint256)", +"99b8a3f0": "charityBalance()", +"99b8e366": "reloadPlayerInfo(address)", +"99bac5c9": "setMinCustomerBalanceETH(uint256)", +"99bad2cd": "testAddExistingVoter()", +"99bb8134": "approveMany(address,uint256[])", +"99bb875c": "funeralAndBirth(bytes,int256,bytes)", +"99bc0aea": "expiryTime()", +"99bc826e": "intMemoryArray()", +"99bcb1a1": "thirdWeekMainICOBonusEstimate()", +"99bdc9c2": "AdminAddition(address)", +"99bea0bd": "AllForOne()", +"99c0058c": "getAttackPlayerList()", +"99c20c34": "percentToFoundersAfterICO()", +"99c24d85": "SetCurrentRoomAndRound(address,uint8,uint256,bool)", +"99c27d40": "updateGlobalMin(uint256)", +"99c2af56": "setRateEarlyStage2(uint256)", +"99c2b93b": "startCrowdsalePhase1Date()", +"99c2bb40": "listAssetDocumentsFrom(bytes32,bytes32,uint256,bool)", +"99c32025": "TwoPhaseTransfers(address[],address[])", +"99c4644a": "putIdentityProvider(address,string)", +"99c49852": "cancelOrder(address)", +"99c59bdc": "MadeBet(uint256,uint8,address)", +"99c69d40": "getPremiumsAvailable()", +"99c6d2de": "depositToken(address,uint256,uint256)", +"99c6da4a": "UTWD()", +"99c724ef": "skipInLine(uint256,uint256)", +"99c75517": "GetCompetitionInfo(uint32)", +"99c8055d": "Enable()", +"99c8268b": "totalBattle()", +"99c87629": "getFibonziPlayers()", +"99c8d556": "tax()", +"99c8fcba": "agreeBetWinner(uint256,uint8)", +"99cac223": "getBallotIndex(address,bytes32)", +"99caf208": "updatePendingManager(address,uint256)", +"99cb0823": "presaleBonus()", +"99cbc1b9": "Bet(address,bytes32,bytes32,uint256,uint8,uint16,uint16,uint16,uint8,uint256,uint8,address)", +"99cc00d1": "getImageHeight(uint256)", +"99ccbec6": "claimByTeam()", +"99ccf3da": "_increaseToken(address,uint256)", +"99ccfd34": "forkUpgrade(address,address)", +"99cd211d": "bountyTokensWallet()", +"99cd40aa": "_setBytes(bytes32,bytes)", +"99cdee0e": "own()", +"99ce00a9": "VREO_SALE_OPENING_TIME()", +"99ce12c1": "getAssetClaimString(uint256)", +"99ce919c": "goods(bytes32)", +"99ceb6e6": "BTCReceived()", +"99ceed71": "OwnerTokensBurned(uint256,uint256)", +"99cf5582": "burnVotes()", +"99cfe1e1": "issueCofoundersTokensIfPossible()", +"99cfe743": "TotalGenesisAddresses()", +"99cffe4d": "LinearBeam()", +"99d0f06c": "removeNotes(uint256[],uint256[],uint256)", +"99d136f5": "multiSend(address[])", +"99d18937": "getAllDSP()", +"99d1c413": "isEggFactory()", +"99d1d002": "debug_blockHeaderMerkle(bytes)", +"99d1e755": "getTeamWallets()", +"99d22e48": "founderAllocated()", +"99d3acd3": "EtherDeltaDepositToken(address,uint256)", +"99d413f4": "createDividendPercent()", +"99d43acc": "organizerRegistration(string,string)", +"99d4aec9": "getPurchaseRequests()", +"99d50d5d": "getComponents()", +"99d52baf": "test_startBool()", +"99d5af62": "unLockBatchAddr()", +"99d64ab0": "maximumFunding()", +"99d67084": "numberOfInvestorsToWithdraw()", +"99d76e49": "setDragonName(uint256,string)", +"99d786ca": "lastMonth()", +"99d792a2": "releasePrivateSupplyVested()", +"99d7dd25": "isEcoAllocated9()", +"99d80ed9": "addService(bytes32,uint256)", +"99d83b77": "BuyRC(address,bytes,uint256,uint256,uint256)", +"99d897f8": "sellForOtherCoins(address,address,uint256)", +"99d9b306": "trancheMinTx()", +"99d9d1e0": "KNB()", +"99db626c": "LOG_SpinExecuted(bytes32,address,uint256,uint256)", +"99db7eb7": "TapPoll(uint256,address,address,uint256,uint256,uint256)", +"99dbff01": "buyCourse(uint256,uint256)", +"99dc79d1": "getBracketScore(bytes8)", +"99dd1ed9": "estLiquidationCap()", +"99ddb29b": "addressType(address)", +"99de4fc5": "UNK()", +"99def960": "getcredibilityScore(bytes12,bytes12)", +"99df3d7a": "setFunctionAuthorized(address,string,bytes32)", +"99dfa711": "GetCurrentTypeStartTime(uint256)", +"99dfedb4": "getTeamSumSkills(uint256)", +"99e0021f": "mergencyCall()", +"99e07caf": "updateItem(uint256,string,string,string,uint256)", +"99e0dd7c": "setTokenURIPrefix(string)", +"99e133f9": "init(address,address,address,address,address,address)", +"99e1cc47": "calculateAndSendRefund(address,uint256,uint256,uint256)", +"99e1d127": "filterWarriorAuras(uint256,uint256)", +"99e2ab0e": "UpdateMinFee(uint256)", +"99e3a723": "verifyOwner(bytes32,address,uint8,bytes32,bytes32)", +"99e47b2d": "DinoFarm()", +"99e487a9": "F2UPhone()", +"99e71b64": "secondBalance(address)", +"99e74ce8": "tokenIdToHeroInstance(uint256)", +"99e7c00a": "yaaay()", +"99e7cedf": "cobeneficiary()", +"99e8f303": "getM5Reward(address)", +"99e91527": "dequeueAuditRequest(uint256)", +"99e9376c": "buyWithCustomerId(uint128)", +"99ea0fd5": "disputeAllReporters()", +"99eb6603": "initalize(uint256)", +"99eb975c": "TransID()", +"99ec140d": "Tokensale()", +"99eca69f": "withdraw(uint256,address[])", +"99ecba80": "maxMinutesProposalPeriod()", +"99ed7b87": "getStrengthValue(uint256)", +"99ee9076": "defendFee()", +"99ef111c": "stopAddresses(address)", +"99eff1f7": "nextElectionIndex()", +"99f02ab5": "getWinnerContractAddress(uint256)", +"99f02b60": "IHFVesting(address,uint256)", +"99f07bed": "_clearCommittedValidators(uint256)", +"99f16c6e": "validateContribution(uint256)", +"99f1718a": "getSiteItem(uint256,uint256)", +"99f3379f": "getSolverAddress(bytes32,string)", +"99f3487b": "testBoolKeyValue()", +"99f49f0d": "vitPerWei()", +"99f4b251": "mine()", +"99f5c357": "modultradeStorage()", +"99f5c904": "momentValueOf(uint256,uint256)", +"99f6021d": "durationSec(bytes32)", +"99f65122": "getParam(uint256)", +"99f6a693": "setMasterName(uint256,string)", +"99f6d9af": "getTotalNumberOfRegisteredCompanies()", +"99f91c5d": "updateAllRewPaid()", +"99f9be87": "TEX()", +"99fa6ed7": "EthPledge()", +"99fb15d2": "distributionActive()", +"99fbe995": "Wallet(address[],uint256)", +"99fbf3a2": "setRentPrice(uint256,uint256)", +"99fca937": "amountOfEthersOwnerCanWithdraw()", +"99fd12f6": "etc()", +"99fd9489": "endCrowdsale(bool)", +"99fdc17e": "redenominatedValue(uint256)", +"99fe18b9": "fightBoss()", +"99fe6c88": "CashTCoin()", +"99ff0246": "onRefund(address,uint256)", +"9a003b61": "checkRequiredChange(uint256,uint256)", +"9a008d7b": "startPaymentProcess(address)", +"9a01b4d5": "getChannel(address)", +"9a02d3ac": "unapproveWithdrawal(bytes32,bytes32,uint256)", +"9a02edfe": "maxTokensPerAccount()", +"9a033782": "addContractToTokenFallbackWhiteList(address,address)", +"9a037aa0": "setReferralBonus(uint256)", +"9a03d9a3": "setERC721Address(address)", +"9a03fe1d": "Div(uint256,uint256)", +"9a0475e9": "ASHLEY_ADDRESS()", +"9a04a4ed": "setOpenInterestInAttoEth(uint256)", +"9a04ab73": "safeAddI(int256,int256)", +"9a04b89e": "setGiftoAddress(address)", +"9a04e602": "mintBounty(address,string)", +"9a04f704": "guest()", +"9a04fc8b": "getNodeParent(bytes32)", +"9a05cd66": "_setNarcosCoreAddress(address,address)", +"9a065a60": "discountTokenAmount()", +"9a065aae": "LMYY_Token()", +"9a06671e": "CoinsRetrieved(address,uint256)", +"9a06b113": "createPool()", +"9a06c2d3": "getRnMmasterReq()", +"9a073742": "setFeesWithdrawalAddress(address)", +"9a0750d5": "tokenFundDeposit()", +"9a0846f1": "MyKidsEducationFund()", +"9a08623a": "withdrawFromToken()", +"9a0907c2": "contributeAndVest()", +"9a09a8ef": "getCoinByCount(uint64)", +"9a0af2ec": "getStLength()", +"9a0b2db3": "withdrawFeeEntitlement()", +"9a0ca07d": "changeLocked(bool)", +"9a0d4f40": "PRESALE_PERIOD()", +"9a0d6247": "withdraw(uint8,bytes32,bytes32,uint256,uint256)", +"9a0e4ebb": "multiMint(uint256[])", +"9a0e7d66": "getTotalVotes()", +"9a0e7e8e": "secondSaleDelivery(address,uint256)", +"9a0e9e50": "newPoll(uint256,uint256,uint256)", +"9a0f1561": "prizeDeposit()", +"9a10f719": "setFreezeAddress(address,bool)", +"9a10f819": "buyOracle(bytes,address)", +"9a114fb0": "_Challenge(bytes32,uint256,uint256,string)", +"9a116ca1": "implementationCall()", +"9a1295d9": "getPassportLogic(string)", +"9a14228e": "getEntryPrice()", +"9a158883": "BOBOToken()", +"9a15f4f3": "getBlockHeader(int256,int256)", +"9a160ad9": "MeissaToken()", +"9a163c44": "currentVotingAmount()", +"9a165f6c": "currentCapTokens()", +"9a166299": "getMyAddress()", +"9a167613": "forceConsume(uint256)", +"9a16a7e3": "getAccountInputSdcslength()", +"9a18a5ba": "NEXPARA(uint256,string,string)", +"9a19a953": "setInt8(int8)", +"9a1a661e": "entranceFeePool()", +"9a1ac4b2": "OpenAddressLottery()", +"9a1b420b": "OraclizeAddrResolver()", +"9a1ca8d2": "SALE_ETHER_MIN_CONTRIB()", +"9a1e7ea0": "randomSatoShiTime()", +"9a1e9dc3": "Buy(bytes32,address,uint256,uint256,address,address)", +"9a1f6a0f": "setPacksPerClaim(uint16)", +"9a1fd3d5": "armyPlanesCount(uint256)", +"9a1fdc10": "createHorseShoe10(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"9a1ff4f4": "Ruthenium()", +"9a202d47": "removeAdmin()", +"9a206ece": "isSpender(address)", +"9a20821b": "claim_winnings(address)", +"9a21213e": "_getProviderOwner(uint256)", +"9a2160a7": "currentBetNumber()", +"9a221876": "project_contract()", +"9a22dec5": "buyAllAmountPayEth(address,address,uint256,address)", +"9a234885": "storeUserDataHash(uint256,bytes32)", +"9a2392b2": "getFirstBuyNum(bytes32,bytes32)", +"9a23ab61": "XXXXXXXX06(address,address,uint256)", +"9a2457c1": "getMiningAttempt(uint256,address)", +"9a251185": "isValidCertificate(bytes32,bytes32,bytes32)", +"9a267230": "END_TS()", +"9a276186": "getLentTime(uint256)", +"9a27b7ed": "setBounty(address,uint256)", +"9a2828f3": "setTechnicalWallet(address)", +"9a285ffb": "myDividendsYes()", +"9a28910a": "PrivateSaleBuy()", +"9a29ccf7": "_determinePid(address)", +"9a2a1f75": "CrowdsaleLeviusDAO(address,address)", +"9a2a224a": "setWallet(address,address,address,address,address)", +"9a2b4bdf": "ChangeTotalSupply(uint256,uint256)", +"9a2d2692": "withdrawToPoolOwnerFee(uint256)", +"9a2dcadf": "fundoShares(uint256)", +"9a2e27f8": "presaleEndDate()", +"9a2e6b40": "vote(uint80,bool)", +"9a2f9e92": "keeCrytoken()", +"9a2fb8c1": "startTimePrivatePreICO()", +"9a307391": "operator(address)", +"9a314b8e": "Group(string)", +"9a317cca": "getHWCAddressByIndex(uint256)", +"9a31a5f0": "transferManual(address,uint256)", +"9a31ac53": "setLastRegistration(string,int256,uint256)", +"9a31b14e": "set_totalSupply(uint256)", +"9a323ac4": "MAXfinney()", +"9a3241a6": "AddParticipant(address,uint256)", +"9a325e52": "exchangeRateRoundTwo()", +"9a336fed": "removeTotalCoinLock()", +"9a33aff9": "startDocumentPoll(bytes32)", +"9a33c610": "addPA(string,string,string,address,address,uint32,uint32,address,address,uint32,string)", +"9a33e300": "projectName()", +"9a344170": "test_insert_full()", +"9a347dd9": "tokensToFunder()", +"9a35f886": "__dig_then_proxy(uint256)", +"9a36f932": "feeDivisor()", +"9a37d1b7": "distributeEbyteForETH(address[],uint256,uint256,uint256)", +"9a38330d": "setIssuer(address,address)", +"9a388bd2": "CORAddress()", +"9a38ac79": "requireAuthorisation(bool)", +"9a38aeb1": "verifySignature(address,uint256,bytes32)", +"9a38bfae": "voteHash(address)", +"9a3a8c85": "ExiliumToken()", +"9a3aed36": "setMainAdmin(address)", +"9a3c4158": "setEthWallet(address)", +"9a3ce541": "price(bytes12)", +"9a3d1f3f": "twentyThirtyVault()", +"9a3dc23f": "_removeWhitelisted(address)", +"9a3ea7cc": "provas(bytes32)", +"9a3fc225": "getMinAuditStake()", +"9a3fc66d": "iouTokens()", +"9a3fd1fb": "tokenFallBack(address,uint256,bytes)", +"9a3fdfd0": "bountyTokensPercent()", +"9a406338": "VESTING_DATE()", +"9a40a316": "betting(uint256,uint8,uint256)", +"9a40d8f5": "equal(address[],address[],string)", +"9a41c1e6": "walletToVault(address,uint256)", +"9a429d2f": "setDisclaimer(string)", +"9a42adb3": "change_ico_start(uint256)", +"9a42af48": "getLastPrice(bytes32,uint8)", +"9a42c935": "forLottesy()", +"9a42f3aa": "reveal(uint256,uint8,bytes32)", +"9a4363cb": "setlockall(bool)", +"9a436c9b": "burnBasisPoints()", +"9a4373a6": "_internalTransfer(address,address,uint256)", +"9a437da2": "lookupPriorLottery(uint256)", +"9a438c5f": "ChangeInsuranceFeesOperationEvent(uint80,uint80,uint80,uint80,uint256,uint80,uint80,uint256,uint256)", +"9a43e59a": "VAA()", +"9a4435c6": "BitcoinGame()", +"9a443955": "setNumVotesRequired(uint256)", +"9a44690e": "finalizeSettingUpdate(uint256)", +"9a454b99": "deployedAtBlock()", +"9a459f75": "setShortDescription(string)", +"9a45a263": "decentBetMultisig()", +"9a45e3fe": "getChannelExist(bytes32)", +"9a465b85": "lastBlock_a10()", +"9a46793e": "roundsManager()", +"9a471416": "bountyFunds(address[],uint256[])", +"9a47700f": "checkExpires(bytes32)", +"9a4772cd": "LogClaim(address,uint256,uint256)", +"9a478b49": "join(uint256,bytes32)", +"9a47cee3": "convertGene(uint8[48])", +"9a48007d": "hasHourlyRateWithinRange(address,address,uint256[],uint256[])", +"9a483a8e": "exerciseExpiredEmployeeOptions(address,bool)", +"9a48eb3e": "tokenTransferProxyContract()", +"9a49eab5": "MINER_CREATION_LIMIT()", +"9a4a0fb2": "centralBank()", +"9a4ac102": "tinyIPFShash(string)", +"9a4b19e4": "SiaCashCoin()", +"9a4b1d5c": "verifyTransfer(address,address,uint256)", +"9a4b87f1": "setDrop(bool)", +"9a4b8fc9": "lockInSemiFinalPrize()", +"9a4bca21": "setMintTap(uint256,int256)", +"9a4ca3cb": "itemsOfOwner(address)", +"9a4cbb92": "getDamage(uint256,uint256,uint256)", +"9a4cd266": "test_fourValidEqBool()", +"9a4d19f8": "getAmountAccredited(address)", +"9a4dfa87": "OfferCanceled(uint256,address)", +"9a4e36d9": "antiques(bytes32)", +"9a4e9bff": "FXPay()", +"9a4ed149": "getBlocksquareFee()", +"9a4f1e2c": "ETCrossPotatoPresale(uint256,uint256)", +"9a4f78cc": "decreaseShares(uint256,address)", +"9a4fd88d": "crowdsaleSucceeded()", +"9a4fdf66": "nextBro()", +"9a507d9b": "feeHoldingAddress()", +"9a508c8e": "finalizeUpgrade()", +"9a5199fc": "goodbye(uint256)", +"9a51a31a": "ToToken()", +"9a526b97": "setPreIco(address)", +"9a52b339": "checkInterest()", +"9a54596b": "Token(uint256,string,uint256,string,string,address)", +"9a5483e6": "addRole(uint256,address,uint256)", +"9a556a59": "getCooldown(uint256,uint16,uint8)", +"9a56193b": "getNumberOfDerivatives()", +"9a565169": "ETHERGOLD()", +"9a5666b8": "SVLightBallotBox(bytes32,uint64[2],bool[2])", +"9a571d9f": "isAlphaLower(bytes1)", +"9a573786": "getKeysManager()", +"9a581271": "cursedContract()", +"9a586d26": "MAX_SALE_VOLUME()", +"9a58c33d": "batchAssetTransfer(address,uint256[])", +"9a592415": "LostPayment(address,uint256)", +"9a593b9a": "startCrowdfund()", +"9a599e37": "burnfromAdmin(address,uint256)", +"9a5a2d4e": "lastTimePriceSet()", +"9a5a6483": "milliTokensSent()", +"9a5c0abc": "sellCards(uint256,uint256)", +"9a5dd735": "getRichest()", +"9a5e095c": "_buyTokensInCurrentStage(address,uint256,uint256)", +"9a5eb28f": "BUYER_CAP_LOW_USD()", +"9a5f17ee": "ccEndTime()", +"9a5f54b3": "getTetherInts(address,uint256)", +"9a6203e9": "getClosingObligation(bytes32)", +"9a628121": "random256()", +"9a62b752": "becomeTurtlemaster()", +"9a63157a": "addressBankPartners()", +"9a64a276": "findById(uint256)", +"9a650fd8": "isTerminated(address)", +"9a651f0b": "firstStageRefund()", +"9a6524f1": "TOKEN_CAP()", +"9a65ddec": "getAddressByName(string)", +"9a65ea26": "startMinting()", +"9a661e66": "getGratitudesSizeOf(address)", +"9a670bbc": "secondPreSaleEndDate()", +"9a68323c": "getRoundDetails()", +"9a684658": "_getBlockIndex(uint256,uint256)", +"9a6921e4": "getOpGas()", +"9a6a30a4": "reclaimEther(address)", +"9a6a68e9": "numberWinner()", +"9a6b32e1": "claim_reward(uint256,bytes32)", +"9a6b607f": "distributeTokensToMembers()", +"9a6bd379": "powerUp(uint256)", +"9a6ced6d": "bountyAgents(address)", +"9a6d3aaa": "bet(uint256,bool)", +"9a6d7cb8": "_canMateViaMarketplace(uint40,uint40)", +"9a6d9671": "combineMyGirls(uint256,uint256)", +"9a6dac14": "getLOTBalance(address,address)", +"9a6dfeff": "totalVotesForParty(uint256)", +"9a6e9914": "deleteArrayString(bytes32,uint256)", +"9a6ec511": "_buildId(address,uint256,bool)", +"9a6edad1": "Jupiter()", +"9a6f978d": "DIP()", +"9a6fb6df": "productionUnitTokenContractCount()", +"9a6fcbdd": "popElement()", +"9a6fe50c": "getLatestForContractAddress(address)", +"9a701075": "WITHDRAWAL_END()", +"9a702ad5": "AVAILABLE_JOINTTOKENS()", +"9a70855e": "exchangeFlag()", +"9a70eb1a": "onSaleAmount()", +"9a713233": "pre_end()", +"9a71825e": "sellKnowledge()", +"9a721302": "SUPPLY_FOR_BOOUNTY()", +"9a722769": "autoFinishTime()", +"9a727526": "getManagementInfo()", +"9a729d03": "token_bid(address,uint256)", +"9a72afb6": "setIsDisputeActive(bool)", +"9a730617": "init(address,uint256,uint256,uint256,uint256)", +"9a7394f5": "setData_34(string)", +"9a7443da": "stageUsdCap(uint16)", +"9a74adda": "moveAccountIn(address)", +"9a74c10c": "getDefaultReportingGasPrice()", +"9a751072": "applyChangeWalletAddress(address,address)", +"9a75aa06": "emitPublicCapabilityAdded(address,bytes4)", +"9a7614ee": "acceptEther(uint8)", +"9a7615a2": "burnOwner(uint256)", +"9a772bce": "TokenCappedCrowdsale(uint256,uint256,uint256)", +"9a7754d6": "StagedCrowdsale(uint256)", +"9a777d5d": "buyCoins()", +"9a7853cd": "postTX(address,string,uint256,uint256,uint256)", +"9a78afc6": "reduceDiv_()", +"9a78c066": "checkExistsInArray(address)", +"9a78c562": "setSellingTime(uint256,uint256)", +"9a797128": "withdrawed()", +"9a79f4a8": "testFailHeaderInsufficientFee()", +"9a7a3293": "NoFakeCoin()", +"9a7a7c11": "makeRoll(uint256)", +"9a7b5b7b": "tryClose()", +"9a7baa81": "EcomethToken()", +"9a7be471": "updateMinDeposit(uint256)", +"9a7d5211": "TheDigitalStandard()", +"9a7db5d9": "adminSendWorldBalance()", +"9a7e00ef": "acceptBet(uint64)", +"9a7e9e1f": "executeByAction()", +"9a7ee18c": "AccountIsNotFrozen(address)", +"9a7efb7f": "giftFor(address,address,uint256)", +"9a8061e8": "setLicenceShopPrice(bytes2,uint256)", +"9a80e52f": "updateTknPrice(uint256)", +"9a819e5e": "forceLiquidation()", +"9a82031e": "getRoundWinnigNumbers(uint32)", +"9a824f00": "transferTobucketTwoContract(address)", +"9a828a71": "oracalizeReading(uint256,string)", +"9a82a09a": "cancelled()", +"9a82c93c": "PRESALE_ENDTIMESTAMP()", +"9a82f890": "isOracle()", +"9a8318f4": "total_withdraw()", +"9a8335e0": "sendTo(string)", +"9a841413": "deleteDeployer(uint256)", +"9a84792b": "onReturned(address,uint256,uint256)", +"9a84d0c4": "addToken(address,string,string,string,uint8,bytes32,bytes32)", +"9a862c2d": "stage2StartTime()", +"9a863892": "NewProposal(uint256)", +"9a86acda": "getHeld(uint256)", +"9a86cd04": "shittyRand(uint256)", +"9a87ebb5": "changeAllowances(uint256,uint256)", +"9a880629": "dStartsNow()", +"9a880848": "attackhill(uint256)", +"9a881ab4": "payToFines(uint256)", +"9a882b7a": "createtoken(string,string,string,string,string)", +"9a891058": "keyIndex(bytes32)", +"9a89ad65": "within6Confirms(int256,int256)", +"9a8ae2fa": "changeLastFreeBlock(uint256)", +"9a8b3d8f": "getClientProjects(address)", +"9a8ca12c": "icoEnds()", +"9a8cea55": "testPush()", +"9a8cea82": "calculateDevFee(uint256)", +"9a8d10a3": "addData(uint256,bytes32)", +"9a8d36fa": "_openGameRange(uint256,uint256)", +"9a8d86c5": "CrowdSale_Finalize()", +"9a8e7b02": "ProposalClosed(uint256,uint8,uint256,uint256,bool,uint256,uint256)", +"9a8f09bd": "newKing(address)", +"9a8f139d": "getPercent1(address)", +"9a8f4dbf": "CancelSellOrder(uint32)", +"9a8f71f7": "saveData(bytes32,uint256)", +"9a8f72d1": "pruebacn123()", +"9a900e8c": "changeDepositWalletAddress(address)", +"9a903ca7": "allocateTokens(address,uint256,uint256,uint256)", +"9a9249a8": "_calculateCurrentPrice(uint256,uint256,uint256,uint256)", +"9a92b7e7": "EthVenturesFinal()", +"9a93e940": "testFailCreateNewRevisionNotUpdatable()", +"9a94ab9c": "addDelegate(address,string,address,uint256)", +"9a953408": "CHLORINETOKEN()", +"9a954af9": "getFreeToken()", +"9a956915": "icoInvestors(address)", +"9a95ca48": "presaleCapReached()", +"9a95d0e4": "DEEO()", +"9a960778": "SBK()", +"9a961416": "gameNext()", +"9a967e3b": "nextMember()", +"9a969768": "distributeProfits(uint256)", +"9a96f829": "devs()", +"9a97043b": "depositIdx(address)", +"9a98aa1e": "Scorpio(uint256,string,string)", +"9a98ac88": "GCSToken()", +"9a999359": "priceUpdatedTime()", +"9a99ebf4": "drainGame(bytes32,bytes32,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"9a99f7e0": "isModOrCreator()", +"9a9a5cdb": "checkEthBalance(address)", +"9a9b1709": "PGGamePlatform()", +"9a9b5323": "AlforroCoin()", +"9a9bc131": "aidrop(address[])", +"9a9c29f6": "settle(uint256,uint256)", +"9a9c437d": "CryptFillToken()", +"9a9c9c53": "DepositToBankAccount()", +"9a9d0935": "totalBountySupply()", +"9a9d6515": "APPC()", +"9a9e3fd8": "successful()", +"9a9ed624": "ProfitLoaded(address,uint256)", +"9a9f1304": "drawMini()", +"9aa035dd": "dev_multisig()", +"9aa03cc6": "calculateExchangeFee(uint256)", +"9aa07ed7": "DietEthereum()", +"9aa0a50e": "btcDeposits(bytes32)", +"9aa0ff7b": "SALE_END()", +"9aa1001b": "withdrawRewardPool(address,uint256)", +"9aa10ebf": "Story()", +"9aa13f04": "contractStart()", +"9aa1dab7": "removeOversight(address)", +"9aa26f06": "registerBytes32(address,bytes)", +"9aa287d9": "setIco1Tokens(uint256)", +"9aa3a443": "acceptContribution(address)", +"9aa4a64e": "set_patient(uint256,uint256,string,string)", +"9aa57922": "Bhtd()", +"9aa5ee73": "finalizeConfirmationPeriod()", +"9aa5f467": "phase_3_token_price()", +"9aa615ee": "initCrowdsale(uint256,uint256,uint256)", +"9aa72320": "EthereumCare(uint256,string,uint8,string)", +"9aa727f6": "mult(uint256,uint256)", +"9aa72b71": "shareAmount(address,uint256,uint256,uint256)", +"9aa74525": "increaseWithoutCounterparty(bytes32,uint256)", +"9aa84b0b": "blockNode(address)", +"9aa92f0c": "previousRounds(uint256)", +"9aa93224": "sendOre(address,uint256)", +"9aa99dc8": "ownerPauseJackpot(bool)", +"9aa9f27b": "privateSell2Address()", +"9aaa38a6": "ChangeComission(uint256)", +"9aaa3eec": "updateNickname(address,string)", +"9aaa4696": "transferRaw(address,uint256)", +"9aaa5750": "addGoldTransaction(string,int256)", +"9aaa6b4d": "getAttackAddress()", +"9aaac864": "isInitialBlockTimestampSet()", +"9aab0c7a": "BitUPToken()", +"9aac9e91": "EndPreSale()", +"9aacb10a": "setNewCreator(address,uint256)", +"9aacb18c": "getSolution(uint256,uint256)", +"9aae3d0e": "maxWeiTier1()", +"9aaf442c": "applyCensorship(uint256)", +"9aaf5e05": "allocateTokensBeforeOffering(address,uint256)", +"9aaf9f08": "getVersion(bytes32)", +"9aafbff0": "addEntryIn24WeekPeriods(address,uint256,bool,uint256)", +"9ab060de": "milestoneBonus()", +"9ab06fcb": "setPayment(address)", +"9ab102ac": "isAffiliated(address)", +"9ab1416c": "accept_B_coupons(address,uint256)", +"9ab1b484": "distributeTokens()", +"9ab1d468": "privateSaleTransfer(address[],uint256[])", +"9ab253cc": "transferToICAPWithReference(string,uint256,string)", +"9ab2cf0d": "checkLockedBalance(address,uint256)", +"9ab3161d": "AnimalFactory(address,address)", +"9ab361a2": "unlockTimeLine()", +"9ab3a1fd": "setMvpExists(bool)", +"9ab3bfd7": "Tier_Basic_Registration()", +"9ab42287": "getAllAnimalsByAddress(address)", +"9ab422f3": "register(string,uint256,uint256,uint256,uint256,address[])", +"9ab448d9": "updateForkValues()", +"9ab4833e": "viewToken()", +"9ab4b22f": "releasedBalance()", +"9ab4d3a8": "checkInvestorReturns(address)", +"9ab567ba": "batchTransferForSingleValue(address[],uint256)", +"9ab61631": "_removeVesterManager(address)", +"9ab79905": "withDiscount(uint256,uint256)", +"9ab7d0b7": "setTheName(string)", +"9ab7f298": "add_user(bytes32,bytes32,int256)", +"9ab80f14": "BuyPrice()", +"9ab86b78": "getVoteHubDetails()", +"9ab90ba0": "realityID()", +"9ab95202": "babzBalanceOf(address)", +"9ab9ee73": "prPool()", +"9abb08ed": "migrateStateFromHost()", +"9abb2c16": "getAuctionsCountForUser(address)", +"9abb9e78": "powerDayEthPerPerson()", +"9abc03d2": "auctionsStartTime()", +"9abd3572": "claimDividend(uint256)", +"9abd7d50": "SelfDestructTime()", +"9abe275f": "closeChannel(address,bytes32,uint256,bytes32,bytes)", +"9abe3906": "closePreICO()", +"9abec159": "DISCOUNT_STAGE_THREE()", +"9abeddf8": "getLastUnionId(bytes32,uint8)", +"9abfba20": "DeleteBillModerator(address)", +"9ac08dfd": "receiveApproval(address,uint256,address,bytes1)", +"9ac17057": "execute(uint128,uint128)", +"9ac18b19": "REQUIRED_SIGNATURES()", +"9ac1f9a1": "add_commitment(uint256)", +"9ac22e5b": "test_oneTrueAndFalseAssert()", +"9ac233f3": "Monarchy()", +"9ac2ba20": "start_all()", +"9ac3317b": "grantMultiplePermissions(address,bytes32[])", +"9ac3fce6": "getBankReg(address)", +"9ac467f9": "getAllSigners(uint256)", +"9ac4fa49": "isAirdropStopped()", +"9ac50a62": "tenmatest()", +"9ac58d58": "get_len()", +"9ac785ba": "LockDate(uint256,uint256)", +"9ac8cd1b": "calcJackpotFee(uint256)", +"9ac97e84": "getNumDIDHolders()", +"9ac9940f": "assetOwner()", +"9aca6e2e": "calculate_total_shares(uint256,uint256)", +"9acab88c": "forwardFunds(uint256,address,address)", +"9acade7e": "testFailTransferDisableNotEnabled()", +"9acae9fc": "createChannel(bytes32,uint256,uint256)", +"9acb1506": "_createMeme(string,uint256,address)", +"9acb1ad4": "right37(uint256)", +"9acb3824": "getHorsesInStud()", +"9acba2af": "durationSeconds()", +"9acbdcab": "updateNoteButContent(uint64,uint16,bytes12)", +"9acd07b5": "closeChannel(uint8,uint256,bytes32[4])", +"9acd5e0e": "getGuestNotes(address,address)", +"9acdc0e3": "setCommunityTokensHolder(address)", +"9acf603b": "token_wallet_address()", +"9acf6ff4": "distributeRemaining()", +"9acfb1a8": "getCCH_edit_25()", +"9ad0a5ac": "addWhitelisted(address[],uint8[],uint256[])", +"9ad0c86c": "IouRootsToken(uint256,address,string,string,uint8)", +"9ad10d79": "PELOMemberIDMap(uint32)", +"9ad1b348": "getKNCRateRange()", +"9ad1c999": "setdevFeeAddress(address)", +"9ad25a68": "COSMOTokenERC20(uint256,string,string)", +"9ad26744": "removeAuthorizedAddressAtIndex(address,uint256)", +"9ad3a7ba": "renounceWhitelister()", +"9ad4eccf": "sentTokensToFounder()", +"9ad4f658": "CATToken(address,address,address,uint256,uint256)", +"9ad4f98e": "BlocksureInfo()", +"9ad55220": "getPrivate()", +"9ad5be7b": "setPlayValue(uint256)", +"9ad73f20": "runPluginSigned(address,uint40,uint40,uint128,uint256,uint8,bytes32,bytes32)", +"9ad74f81": "setAllowTransferGlobal(bool)", +"9ad7ebc3": "specialPoolsRate()", +"9ad89ac4": "settleCancel(bytes32[8],bytes)", +"9ad8b5b7": "addAttachmentToCollectible(uint256,uint256)", +"9ad900d6": "get_first_asset_document(bytes32)", +"9ada7a4c": "NumberTaken(uint256)", +"9adba14b": "logStr(string)", +"9adc15ef": "ShaBi()", +"9adcb5eb": "acceptBet(uint256,uint8)", +"9add2ad9": "MIN_ETH_TRANS()", +"9ade76f4": "VestingCreated(address,uint256,uint256)", +"9aded5dc": "deathData_a6()", +"9ae000c6": "WeedToken()", +"9ae0140c": "removeRoleCapability(uint8,address,bytes4)", +"9ae06672": "getDailyTimeLeft()", +"9ae066b0": "foundationDeposit()", +"9ae082a4": "PooShitToken()", +"9ae120dd": "closeZoneTeller(bytes2)", +"9ae13375": "groupDates(uint256)", +"9ae1a635": "Q500()", +"9ae1c4f8": "mintToken(uint256,int256)", +"9ae21121": "lastowner()", +"9ae2835c": "balanceOfIssuer(address)", +"9ae38844": "newMembers()", +"9ae466bf": "recipientETH()", +"9ae4e388": "ChangeClientTokenAccount(address,bool)", +"9ae51a1f": "getTeamlistSupportInTournament(uint256)", +"9ae568b1": "CreateSEEDS(address,uint256)", +"9ae5dc91": "setNTToken(address)", +"9ae6303d": "getHatchDurationByTimes()", +"9ae6309a": "currentMintableTokens()", +"9ae65eea": "addProposal(string,string,string,address)", +"9ae6892b": "transferOwnershipToken(address)", +"9ae6b186": "bZxTo0xV2Contract()", +"9ae6cac7": "SemainToken()", +"9ae6ef15": "getCumulativeIncome()", +"9ae7a909": "multiPartyTransfer(address[],uint256)", +"9ae8886a": "p()", +"9ae8ac3c": "TRADING_STARTED()", +"9ae8b6a1": "WMCToken()", +"9ae980a8": "setMinWager(uint256)", +"9ae9d383": "getnotice()", +"9ae9ff6a": "withdrawBeforeVoting(uint256)", +"9aea020b": "sellDeadline2()", +"9aea5485": "revealMove(uint256,uint8,uint8,string)", +"9aeb14a5": "sumHardCapPreICO()", +"9aeb5947": "payToCharm(string,uint256)", +"9aeb69a2": "withrawWin(address,uint256)", +"9aebdf7e": "updateJackpotLeft(uint256)", +"9aece83e": "set_manager(address)", +"9aecea62": "finalizeIPO()", +"9aeceb1d": "transferBallance()", +"9aecfb8a": "Etharea()", +"9aed58c6": "_destroyRobot(uint256)", +"9aed6ac9": "registerPresaleContributor(address,uint256)", +"9aed7c15": "sendBalanceERC20(address,uint256)", +"9aedabca": "valueOfShares()", +"9aedb1f1": "setVotingQuestions(string,string)", +"9aee046b": "callOracle(uint256,uint256)", +"9aeea806": "MARKET_CHANGE(address)", +"9aef0c6c": "privateSaleClosingTime()", +"9aef319f": "closeBlacklistSwitch()", +"9aef8999": "removeWhiteList(bytes32)", +"9aefff29": "totalSupplyPreSale()", +"9af003bd": "ChangeConversionRate(uint256,uint256)", +"9af041aa": "currentSaleStage()", +"9af1d35a": "fees()", +"9af1ef32": "offerHelp(address,address)", +"9af22f9c": "Shiner()", +"9af25d07": "releasedRoundCount()", +"9af26b78": "finishMinting(bool)", +"9af28b65": "NEXT_POT_FRAC_TOP()", +"9af2b100": "Permissions()", +"9af2cad2": "CryptoCoin()", +"9af32035": "addIcoPurchaseInfo(uint256,uint256)", +"9af3352d": "updateGuReferral(uint256,uint256,uint256)", +"9af3b527": "getOwnerOfCardsCheapestWager(address,address)", +"9af4afb3": "BlueOs()", +"9af4b5c8": "isOwedFreeReferralPack(address)", +"9af55773": "minSumICOStage6USD()", +"9af605cb": "__proxy(address,bytes,uint256)", +"9af6489d": "CheckTree(address)", +"9af64d80": "previousstageplayer1()", +"9af6549a": "beneficiaryWithdraw()", +"9af75b29": "tokensMintedForOperations()", +"9af88ebd": "_createOpinionSet()", +"9af8c4ba": "respond(uint256,address,bytes)", +"9af8f5de": "totalEDUSLeft()", +"9af917f4": "addRentable(bytes32,uint256,uint256,uint256,uint256)", +"9af95a4b": "dateBonus(uint256)", +"9af9f012": "wavesAgent()", +"9afa3dc7": "ADVISOR_STAKE_THREE()", +"9afb24ab": "setCLIForGas(uint256)", +"9afb93cb": "buyTicket(uint256,string)", +"9afbe49a": "tokenAmountOfPeriod(uint256,address)", +"9afcfba3": "getBurnRequestStatus(uint256)", +"9afd46a3": "closeTurnByHand(uint32)", +"9afd8b1d": "LiteBoxToken(address,string,string,uint256,uint256)", +"9afd9d78": "rollback()", +"9afe340f": "OasisToken()", +"9afebd18": "contract_finish()", +"9afec0ae": "ESOPLegalWrapperIPFSHash()", +"9aff301f": "FightClockAuction(address,uint256)", +"9affa42d": "increaseApprovalBatch(address[],uint256[])", +"9b012dec": "denyTransfer()", +"9b013aee": "getBidPrice(uint256)", +"9b01c7ac": "getFishIdByAddress(address)", +"9b02e258": "changelp12(address)", +"9b03a211": "transferPresaleTokens(address,uint256)", +"9b04564a": "proposeTeamWithdrawal(address)", +"9b046ed3": "getCharacterTraits(uint256)", +"9b05535f": "checkpointBlock()", +"9b059309": "GoshenCoinCash()", +"9b05934c": "calculateSecretHash(uint256,bool,bytes32)", +"9b0646f6": "wadmin_setContrAddr(address,address)", +"9b06e9f5": "seTJackpotPersent(uint256)", +"9b087b2d": "totalTransferred()", +"9b08a22f": "allowTransfer()", +"9b08ace1": "bonusSecondWeekPeriod()", +"9b08e8fc": "changeParent(address)", +"9b092f73": "safemul(uint256,uint256)", +"9b09768a": "maximumPoolPurchase()", +"9b09dfbd": "addArrayItem(address,string,string,address)", +"9b0a4764": "AkirasToken()", +"9b0a541e": "LogAllowedToAddress(address,bool)", +"9b0a5e67": "buy(string,uint256,uint256)", +"9b0aac15": "maxTokenSupplyPublicSale()", +"9b0ac9b0": "refundTime()", +"9b0b5bb2": "MIN_BANKROLL()", +"9b0b9c07": "acceptBankDraft()", +"9b0c1e51": "BONUS_MAX_DURATION()", +"9b0d1b2c": "getSpawningFor(address)", +"9b0ec5ae": "newSeed()", +"9b0ee7b7": "updateAirdropEndTime(uint256)", +"9b0f2510": "placeLong(address[2],uint256[8],uint8,bytes32[2])", +"9b0facaa": "existIdBeforeVersion(bytes32)", +"9b10394c": "IsOnSale(uint32)", +"9b10e9f7": "rawDetailsOf(bytes32,bytes32)", +"9b110f4b": "GayPersonalAdsToken(uint256,string,uint8,string)", +"9b11503e": "PUBLIC_SALE_START()", +"9b121e7c": "wethWithdraw(uint256)", +"9b12664f": "referralMinimum()", +"9b129181": "LTE()", +"9b12a4a1": "setCanDisburseMultipleTimes(bool)", +"9b132392": "createTrainer(string,uint16)", +"9b139504": "addPlayer(string,address,uint256,uint256)", +"9b13d209": "buyGuardianRune(uint256,uint256,uint256,uint256)", +"9b15ef2e": "END_PRESALE_TIMESTAMP()", +"9b16250a": "finishSign(uint256)", +"9b164ce3": "TestApprove()", +"9b173d57": "withdrawPolicy(uint256,uint256,uint256,address)", +"9b17b2dc": "checkWeather()", +"9b181e39": "_isAccepted(address,address)", +"9b18d79a": "one_ether_usd_price()", +"9b19251a": "whitelist(address)", +"9b19a92b": "year1LockAddress()", +"9b1a78c0": "ClaimGMT(address,uint256)", +"9b1a9b23": "destinationAddress80()", +"9b1ad792": "destroyToken(address,uint256)", +"9b1b0ab3": "buyingEscrowAddress()", +"9b1b615e": "pool(uint256,uint256)", +"9b1b8f62": "_gapOfSquareSum(uint256,uint256)", +"9b1bb323": "initContract(address,address,address)", +"9b1cbccc": "finishDistribution()", +"9b1cdad4": "postBounty(uint128,uint256,string,uint256,uint256,uint256[8])", +"9b1d767f": "fstTotalSupply()", +"9b1d8032": "clz32(uint32)", +"9b1d834c": "genPot_()", +"9b1dd3e5": "pullRipCord()", +"9b1e3825": "approveFundTransferToSupplier(address)", +"9b1f46cd": "allMilk()", +"9b1f70d1": "BET_RELEASE_DATE()", +"9b1f9e74": "_burn(uint256)", +"9b1fe0d4": "isApprovedInvestor(address)", +"9b21003b": "notPauseable()", +"9b2112c7": "ShopDexToken()", +"9b217f90": "getVestingTime(address,uint256)", +"9b21929a": "TOTAL_SUPPLY_BOTTOM_BOUND()", +"9b227a97": "ETH_TLD_LABEL()", +"9b22c05d": "test(int256)", +"9b234a9e": "tokensByWavesTx(string)", +"9b248798": "_InsufficientFunds(address,uint256,uint256)", +"9b24b3b0": "getRoot(uint256)", +"9b250f76": "clientInit()", +"9b252b7e": "t3Token()", +"9b256f46": "changeRoundBlock()", +"9b25e6f1": "ReservedTokensDistributed(address,uint8,uint256)", +"9b263eca": "providerContract()", +"9b267540": "unblockTokens(address,uint256)", +"9b26bae3": "AliciaToken(string,string,uint8,uint256)", +"9b276964": "STARTING_BAT()", +"9b27bf3a": "setWhiteListStatus(bool)", +"9b2843e2": "randomDNA(uint256)", +"9b285582": "ChangeIp(bytes32,bytes32)", +"9b28db50": "getWalletId(address,bytes32)", +"9b28f644": "setupFunctionalAddresses(address,address)", +"9b28f75a": "reclaimBalanceTokens()", +"9b29a295": "Payable(address,uint256)", +"9b29cb23": "getDailyPayment()", +"9b29f133": "userCancelActiveGame(uint256)", +"9b2a9d19": "origDev()", +"9b2aab1d": "frozenAccountOf(address)", +"9b2b0031": "updateDescriptiveInformation(address,string,string,string,string)", +"9b2b89d4": "UCAL(uint256,string,uint8,string)", +"9b2bdc20": "claimAllowanceOwnership()", +"9b2cb5d8": "minAmount()", +"9b2d2cbd": "orePrice()", +"9b2e5d32": "claimItems(uint256,uint256)", +"9b2ea4bd": "setAddress(string,address)", +"9b30a187": "nextWave()", +"9b30c7db": "changePortalAddress(address)", +"9b311b17": "averageMinerSalePrice()", +"9b322b7e": "HuandeToken(uint256,string,uint8,string)", +"9b3235bf": "getAbel()", +"9b33093f": "createNew(address,address,uint256)", +"9b332a91": "payDate()", +"9b33d7b3": "createAuction(uint256,uint256,uint256,uint256,bool)", +"9b33f055": "cancelSubscriptionOffer(uint256)", +"9b343342": "getRandomPrice(uint256)", +"9b343525": "highestContribution()", +"9b343e35": "createChildContract(string,uint256,uint256)", +"9b347f42": "teamVesting2Years()", +"9b34ae03": "winningOutcome()", +"9b350e12": "isEscaping(uint32)", +"9b351087": "cancelTreeSell(uint256)", +"9b3544f6": "postAssertion(uint128,uint256,uint256,uint256)", +"9b35928f": "RXBbitToken()", +"9b35b35a": "lockTs()", +"9b36057c": "registerGame(address)", +"9b3662bf": "currentParticipants()", +"9b367370": "confirmBlackFlag(uint256,bool)", +"9b36c3bc": "setMaxTotalAmount(uint256)", +"9b3725e8": "stageGenomes(uint8)", +"9b39caef": "COIN_PER_ETHER()", +"9b39f377": "getAnimalByIdVisibility(uint256)", +"9b39f9bf": "remainingTokensForSale()", +"9b3a300b": "SNK(uint256,string,string)", +"9b3a36c0": "calculateTokensWithBonus(uint256)", +"9b3b24ba": "VESTING_AMOUNT()", +"9b3ba79f": "maxAllocation()", +"9b3bc6fb": "checkERC20Balance(address)", +"9b3cbdf6": "CrowdSale(address)", +"9b3d17b1": "tokenSPUsdCentPrice()", +"9b3dfce0": "isPoDStarted()", +"9b3e28cc": "TokenReceivingEchoDemo(address)", +"9b3e9a48": "changeFreezeTime(uint256,bool)", +"9b3ee16e": "initialize(address,address,uint256,uint256,address,address,address,address)", +"9b3fd75d": "beginGame(uint256,address,address)", +"9b3fdf4c": "EVMSCRIPT_REGISTRY_APP()", +"9b409510": "creditAdvertiser(address)", +"9b415b2a": "erc20Payment(bytes32,uint256,address,address,bytes20,uint64)", +"9b41a9c5": "SedoPoWToken()", +"9b41b00b": "Sorus()", +"9b426e62": "assignTester(address)", +"9b44cb3c": "lastTrade()", +"9b46301e": "playersPerRound()", +"9b46461e": "getAnimalIdAgainstAddress(address)", +"9b46a71c": "setContractCap(uint256)", +"9b4778e4": "get_arbits_sale_open()", +"9b480435": "setPublicPlacementNum(uint256)", +"9b487f3f": "_forwardTransferFromToICAPWithReference(address,bytes32,uint256,string,address)", +"9b49413c": "GetItemInfo(uint256)", +"9b4a6bdb": "test_spamVoting()", +"9b4a7fe9": "setCCH_edit_17(string)", +"9b4b2d77": "processOffchainTokenPurchase(address,uint256)", +"9b4b973d": "acceptSettlement(uint256,uint256)", +"9b4bb9f0": "schedulePriceUpdatesFixed(uint256[])", +"9b4c1290": "_getFishPrice(uint16,uint16,uint8,address)", +"9b4c1902": "getGovtApplicationByIndex(string,uint256)", +"9b4c7b70": "redemptionFundTotal()", +"9b4d54fc": "startCrowdsale2(address)", +"9b4d9ecc": "setGrowCost(uint256)", +"9b4e533e": "isLastWithdraw(address)", +"9b4f19c6": "getMonths()", +"9b4f1ecb": "initialCost()", +"9b504387": "controllerTransfer(address,address,uint256)", +"9b51e35a": "getSchemePermissions(address,address)", +"9b52cacc": "ListingCreated(bytes5,uint256,uint256,uint256,address)", +"9b539a17": "setEncryptKey(string)", +"9b53a396": "calcKicks(uint256)", +"9b53d87c": "isManagerEnabled(address)", +"9b550e55": "nextMineId()", +"9b563fa3": "save(uint256,string,string)", +"9b566564": "withdrawAirdrop(uint256,bytes)", +"9b56730d": "compoundInterest(uint256,uint256,uint256,uint256)", +"9b5696b0": "notCollectedAmountAfter24Hours()", +"9b56d6c9": "getCollateral(address)", +"9b5719a6": "setSalesContract(address)", +"9b58316a": "EBANKTOKEN()", +"9b58b463": "retire(address,address)", +"9b58e46b": "createProduct(string,bool,uint256)", +"9b5906e5": "getLifeCoin()", +"9b598caf": "pastProposalTimeRules()", +"9b59ffd7": "verifyGame(bool)", +"9b5a2e13": "setBadgeGiver(address)", +"9b5a66e6": "insertInPlace(uint8[],uint8)", +"9b5adea2": "setMinter()", +"9b5b094f": "ANMOToken()", +"9b5b4019": "EtherWild()", +"9b5b969f": "transferSub(address,uint256)", +"9b5c0b5e": "burnPerweiYearly()", +"9b5cc9f4": "transferOwner1(address)", +"9b5cfcdd": "account1Address()", +"9b5d2e78": "TPI()", +"9b5d7d0b": "addBalanceReplenishment(uint256,uint256,uint16,bytes32,uint256)", +"9b5d8e63": "Multiplexor()", +"9b5e5d8c": "newCustomFutureLottery(uint256,uint256,uint256,address,uint256)", +"9b5f8abb": "getAllSponsors()", +"9b5fde7d": "payOut(uint256,string)", +"9b601c4d": "getQueryPrice(string)", +"9b60a443": "payto1()", +"9b612a1b": "freezeStaking(address)", +"9b619d3b": "_deleteAllPackedRevisionBlockNumbers(bytes32)", +"9b61cf09": "MOBILITYCREDIT()", +"9b624e7b": "setRound(uint256)", +"9b632829": "refundAll(address)", +"9b6349a8": "TokenDCCB(uint256,string,string)", +"9b63d0f4": "core(bool)", +"9b63eb4b": "getTicketsByGameIndex(uint256)", +"9b666d7a": "cos(int256)", +"9b6687ac": "getNumPositionProduct(bytes32,uint8,string)", +"9b671604": "proposeVoter(bytes32)", +"9b678bfc": "calcRates()", +"9b67bfa3": "fiatValue(uint256)", +"9b6806c9": "getCompanyShareholders(uint256)", +"9b68c992": "SubmitSecretBet(bytes32)", +"9b69608f": "read_dgx_inventory_balance_ng()", +"9b69de79": "transferLockAmount(address,uint256)", +"9b6a2b2f": "spriteOwningHistory(address,uint256)", +"9b6a6709": "presaleMint(address,uint256)", +"9b6aa1fa": "TransferData(address,address,uint256,bytes)", +"9b6b838c": "reinvestment_share()", +"9b6c5283": "createPool(string,uint256,uint256)", +"9b6c56ec": "debt(address)", +"9b6d86d6": "adminSetRegistrationDisabled(bool)", +"9b6d96c5": "create(int256,int256,int256)", +"9b6dbc8a": "closeShop()", +"9b6e407d": "setPercentUnfrozenAfterBuyPerPeriod(uint256)", +"9b6ec1cb": "HerbsChainToken()", +"9b7143eb": "creditsClawbacked()", +"9b71a7c9": "addAddressToRole(address,string)", +"9b71dec3": "getVineyardCount(string,address)", +"9b727e80": "CNiteToken()", +"9b73a5d9": "hasTwoYearWithdraw()", +"9b743cbd": "allocated18Months()", +"9b7502c3": "getLastAuditExtradata(address)", +"9b769ce3": "JsCoin()", +"9b76a25c": "transferFee(address,address,address,uint256)", +"9b76c1de": "team3LockEndTime()", +"9b76fbd6": "_recordPlatformFee(uint256)", +"9b771346": "ImportTestB()", +"9b772524": "partner1_signed()", +"9b7750f1": "addBranchInEpisode(uint256,uint256)", +"9b77c21a": "getClaimStatus()", +"9b77d69f": "addTagByModuleType(uint8,bytes32[])", +"9b7812ff": "add_quote(bytes32,bytes32,uint256,uint256)", +"9b781ce4": "updateExcludedAddress(address,address,bool)", +"9b782070": "TSSECOND()", +"9b786d68": "profitSharing(address,string)", +"9b788752": "trade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,bool)", +"9b78cf9c": "medalFreeze(address,uint256,uint256)", +"9b7a67bd": "getAccountPar(uint256)", +"9b7b59db": "setdrawtoken(address)", +"9b7c08b8": "ERCToken(uint256)", +"9b7c288f": "lastDeploy(address)", +"9b7c5517": "committ_payment(uint256,uint256)", +"9b7d83e7": "porcoToken()", +"9b7defe3": "returnTokensFromHoldAdvisorsAddress(uint256)", +"9b7e5531": "ownershipDeadline()", +"9b7edbdb": "buyLimit(uint256)", +"9b7eeb12": "setScrapMinEndPrice(uint256)", +"9b7ef38c": "BatchUtils()", +"9b7efac7": "subUInt(uint256,uint256)", +"9b7f1687": "iUventaCoin()", +"9b7faaf0": "lockOver()", +"9b80c9e8": "payMoneytoOwner()", +"9b815057": "changeMakerDAO(address)", +"9b818ace": "SLChainToken(uint256,string,uint8,string)", +"9b819d38": "getNowTime()", +"9b81c8d3": "updateMeterValue(uint256)", +"9b82171f": "houseTotal()", +"9b828609": "reclaimContributionWithInterest(address)", +"9b82abdb": "LogBought(address,uint256,uint256,uint128)", +"9b831dcb": "RateUpdate(uint256)", +"9b8342d4": "getPlayerDividendByRound(address,uint256,uint256)", +"9b836d1a": "_payout(address,uint256)", +"9b83d121": "transferFokenBonus(uint256)", +"9b8430eb": "distributeRevenue(uint256,uint8,uint8)", +"9b850322": "escrowDecision(uint256,uint256)", +"9b855a85": "releaseEQUITokens(bytes32,uint8,bytes32,bytes32)", +"9b85b9c9": "createDrug(bytes32,uint256)", +"9b85bc85": "CocacolaToken()", +"9b865999": "InitialOwnerAddress()", +"9b86975d": "ANemoiSaleContract()", +"9b880fee": "registerVestingSchedule(address,uint256,uint256,uint256,uint256)", +"9b8831df": "hasArtist(bytes32)", +"9b8906ae": "saleEnded()", +"9b894703": "maxTickets()", +"9b8a74f0": "cancelOffer(address)", +"9b8abe0b": "thousandtimes()", +"9b8b03a2": "strongHands(address)", +"9b8b365d": "deathData_a5()", +"9b8b6037": "findModuleVersionByAddress(address)", +"9b8b7160": "setPreFundingtokens(uint256)", +"9b8d1dd4": "CARDANOCLASSIC()", +"9b8d3064": "setFinance(address)", +"9b8d34d9": "addAgreement(bytes32,uint256,address[])", +"9b8da66c": "getEthFundDeposit()", +"9b8eb288": "setPercentWeiDividend(uint256)", +"9b8eb7b4": "getSocialAccountByIndex(uint256)", +"9b8ebc54": "checkVoter(address)", +"9b8f2493": "updateBurnBal(uint256)", +"9b8f5acf": "CyberChainToken()", +"9b8f5d4a": "setTilePosition(uint16,uint8,uint8)", +"9b8f7113": "dateSoftCapWasReached()", +"9b8fdf1b": "cancelExpectedPayment(bytes8)", +"9b901d00": "_createTeamSale(uint256[9],uint256,uint256,uint256,address)", +"9b9073e4": "allocationPool()", +"9b9111ee": "commonConfigure(address,address)", +"9b914973": "prebuyPortionTotal()", +"9b91f9be": "Gol()", +"9b922d97": "setCoinsaleactive(bool)", +"9b9279ec": "StartRefound(bool)", +"9b92adf3": "EnableTokenMinting(bool)", +"9b93aaf4": "addNewLoggerPermission(address,address)", +"9b945097": "getRandom(address,uint256,uint64)", +"9b9545eb": "Rython()", +"9b9692f6": "TokensDistribution(address,uint256)", +"9b96c4ba": "AdvisorPart()", +"9b96eece": "getBalanceOf(address)", +"9b973803": "transfer10(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"9b97cee5": "getWorkCount()", +"9b985b30": "bountyMaxTokens()", +"9b986550": "getAllForPubKey(bytes32)", +"9b98a94b": "getLockTokens(address)", +"9b991d9b": "votingInfoTeam()", +"9b9958af": "getAllCardsClaimed()", +"9b99a8e2": "reserveTokenCount()", +"9b9a09a6": "HackContract()", +"9b9a236b": "SuperToken()", +"9b9a47e3": "getlastDividendPoints(address)", +"9b9b0b87": "mainICOFourthWeekEndTime()", +"9b9ba572": "oraclize_query(string,string[3])", +"9b9be9cb": "mainSale_TokesSold()", +"9b9bedf8": "getContractCreated()", +"9b9cc2ca": "getPrivateSaleAgentAddresses()", +"9b9ce1bc": "sendTokensBulk(address[],uint256[],uint256[])", +"9b9d0364": "_setFeeStructure(uint256,uint256,uint256)", +"9b9d2cc8": "RESERVED_TOKENS_ADVISORS()", +"9b9e07e1": "TeamtokenRelease3()", +"9ba11c0a": "coinunits()", +"9ba1a7d8": "preValidation()", +"9ba30c3b": "Healthcoin()", +"9ba319bf": "detangleQuanticCloudIOTData()", +"9ba33ab3": "refundLeftOverWei(uint256,uint256)", +"9ba3c2e0": "advisersAddr()", +"9ba3d8cf": "updatePromoFishCommission(uint256)", +"9ba4d4ee": "investedETH()", +"9ba4dbc2": "USDBTC(uint256)", +"9ba4eb5f": "SPINFundDeposit()", +"9ba58333": "AspirationCoin()", +"9ba5b4e9": "getEventHashes(bytes32[])", +"9ba65fff": "addNewcard(uint256)", +"9ba73d43": "deregisterCustomer(address,address)", +"9ba89492": "getNumAccounts()", +"9ba896cc": "refundTokensSale(address[])", +"9ba8975f": "changeFundsKeeper(address)", +"9ba8e37d": "withdrawFromToken(address,uint256)", +"9baa504e": "unrestrictedMint(address,uint256,uint128)", +"9bab0da3": "EVACASH()", +"9bab3988": "DongriToken(uint256)", +"9babdad6": "removeShareholder(address)", +"9bac6e8d": "currentMinter()", +"9bac8602": "testFailAddBalanceAboveOverflow()", +"9baca66b": "getElementOfWinnerTicketList(uint256)", +"9bacc97c": "specialAddress(address)", +"9bacf1ed": "createSynthesizingAuction(uint256,uint256)", +"9baddd98": "sendBountySupplyToken(address,uint256)", +"9bae56da": "getEstimatedRound(uint256)", +"9baeac78": "TOKEN_SUPPLY_PRESALE_LIMIT()", +"9baf7ffb": "etherToSendBankroll()", +"9bafd01a": "freeStorage(address)", +"9bafd22b": "DocumentCertoChainContract()", +"9bb00ae3": "ledgerCount()", +"9bb01b5f": "ElcoinDb(address)", +"9bb04895": "nominalValue()", +"9bb0e4df": "getUint(int256,bytes32,string)", +"9bb0f599": "hasToken(address)", +"9bb186d2": "MatchingMarket(uint64)", +"9bb192fd": "getVotes(uint32)", +"9bb1cfd6": "hasAvailableRewards()", +"9bb1dbea": "commonWithdraw(uint256)", +"9bb1fd66": "force_stop()", +"9bb2ea5a": "setMaxValidators(uint256)", +"9bb32be3": "challengeFinality(uint256)", +"9bb3bcaa": "setArrIntField1(int256[])", +"9bb5239a": "CheckPrize(address,uint256)", +"9bb5c96c": "isContributorsRewarded()", +"9bb5ce30": "participationFee()", +"9bb5d450": "getMonsterCount()", +"9bb5f901": "UCToken()", +"9bb603bb": "create(string,string,uint8,string,bool)", +"9bb639a8": "changeTokenCostInEth(uint256)", +"9bb6831f": "millCap()", +"9bb74bbd": "tokensSoldToInvestors()", +"9bb848e7": "isRunningIco(uint256)", +"9bb84cd0": "addSellTokensRequest(address,string,uint256,uint256)", +"9bb8b563": "POKCC()", +"9bb8ec22": "SmartAdvancedCoin(uint256,string,string)", +"9bb8fde4": "startTimeStage1()", +"9bb90467": "initTokenAndBrackets()", +"9bbba3a8": "getTokensOnSale(address)", +"9bbc156b": "AllLock()", +"9bbc574a": "closeUser(address)", +"9bbdb25a": "getPartners(address,uint256)", +"9bbeafc1": "setMarketFees(bytes32,uint16,uint16,uint16,uint16,bool)", +"9bbedbbc": "deliver(address,address,uint256)", +"9bbfa582": "Lambotoken()", +"9bc0fd25": "setBlocklancerContractHolder(address)", +"9bc13360": "standardrate()", +"9bc2bc71": "createEvent(string)", +"9bc30adb": "upgradeBalance(address,uint256)", +"9bc3135b": "buyoutDividendPercentage()", +"9bc33b8a": "MediatedTransactions_TransactionHeight()", +"9bc52a39": "logClassic(string,uint8)", +"9bc53cec": "Moontrail()", +"9bc5689d": "NUM_OF_CHOICES()", +"9bc61d06": "MeetupContract(string,string,uint256,uint256,uint256)", +"9bc64cc8": "saiTap()", +"9bc6b571": "ChangeExtension(uint256,bool)", +"9bc6d815": "BestCountTokens(uint256)", +"9bc6f0ec": "createChildDeposits(uint256)", +"9bc706e8": "publishedCountOf(address)", +"9bc72d5f": "worstCaseRateFactorInBps()", +"9bc742fe": "setStepOneLockEndTime(uint256)", +"9bc85302": "burnUserTokens(address)", +"9bc896f9": "orderCancel(uint256)", +"9bc8e9ee": "setMintingDec(uint256)", +"9bca3596": "Ubecoin()", +"9bca8a1e": "setTableTypesSize(uint256)", +"9bcb8dff": "BallzToken()", +"9bcc2b27": "ctrlZee()", +"9bcc9123": "rejectNegotiation(address)", +"9bccfe49": "actionsCount()", +"9bcdd9e8": "forgetCube(address)", +"9bce51e3": "sendCrowdsaleTokens(address,address,uint256)", +"9bcef169": "getLeaderboard(string)", +"9bcf497b": "setUserPaybackPool(address)", +"9bcf7352": "setEnableInternalLock(bool)", +"9bcf8ca2": "addresses(uint256,uint256,uint256)", +"9bcf9ea2": "PIVOT()", +"9bcfcee8": "minting(address,address,address,address)", +"9bd03774": "TokenContractImpl(uint256,uint8,address,address)", +"9bd0a967": "isEndsWithHpb(string)", +"9bd1ff8b": "tokenFallback(address,address,uint256,bytes,string,uint256)", +"9bd26234": "contrubutedAmount(address)", +"9bd2af03": "trent()", +"9bd2d912": "ZipflaxToken()", +"9bd33457": "totalOnDeposit()", +"9bd3651b": "Authenticate(uint256,address,uint256)", +"9bd41f7c": "createToken(bytes32,string,string,string,string,string)", +"9bd4d455": "addMember(string,address,string,uint256,uint256)", +"9bd4e13e": "bettor_reward(address)", +"9bd4e925": "CROWDSALE_ETH_IN_WEI_FUND_MIN()", +"9bd5679e": "getCurrentICOExpirationTime()", +"9bd6030c": "nbagame()", +"9bd658d9": "whoOwnsYou()", +"9bd69528": "addToKyc(address)", +"9bd695b0": "hasRequiredSignaturesToValidate()", +"9bd6a4de": "initPublicityAddr()", +"9bd702e4": "sellCrab(uint256,uint256)", +"9bd7d688": "checkAncestors(uint32,address,uint64,uint64,uint64)", +"9bd80dcf": "calculateMasked(uint256,uint256)", +"9bd8e081": "gunsFundDeposit()", +"9bd90aae": "maxTokensToCreate()", +"9bd99195": "multiAccessChangeOwner(address,address)", +"9bd9bbc6": "send(address,uint256,bytes)", +"9bda8678": "externalDeposit(address,uint256)", +"9bdbb4c7": "market_WithdrawBid(uint256)", +"9bdc6523": "setUserWhiteListContract(address,bool)", +"9bdce046": "DICE_HIGHER()", +"9bdd070d": "withdrawTokenToDefault(address,address,uint256,uint256,uint256,address)", +"9bdd7cdb": "forceRelease(bytes32)", +"9bde88f0": "getcan(address)", +"9bdf5a7c": "Zenix()", +"9bdf6f62": "soldTokenCount()", +"9bdff8eb": "oracleB()", +"9be07908": "left79(uint256)", +"9be08a4e": "NCPPrivate()", +"9be0f105": "OxChainNetwork()", +"9be0fc75": "toggleDrop()", +"9be1eab7": "setContractStakeToken(address,address)", +"9be1fcee": "BankOwner_DisableConnectBankAccountToNewOwnerAddress()", +"9be2385a": "depositOldTokens(address,uint256,address)", +"9be2faed": "isSchemeRegistered(address,address)", +"9be2ff64": "setAllowPlayer(bool)", +"9be3b286": "endOffering()", +"9be4d15e": "split(bytes32,uint8,uint256)", +"9be50784": "drawBenz()", +"9be56c67": "support(uint256,uint256)", +"9be572f6": "getTotalUsers()", +"9be5ad78": "_saleState()", +"9be5b3b1": "MetadollarOption()", +"9be6178e": "acceptBet(bytes16,bytes16,bytes16,bool)", +"9be6d404": "destructSelf(address)", +"9be7f1dd": "buyerfee()", +"9be88a01": "_rotateLeft(bytes32)", +"9be8a212": "FoundersFund()", +"9be95517": "_createRandomMonster(uint32)", +"9bea62ad": "restore(uint256)", +"9beaa524": "getActivityName(uint256,uint256)", +"9bead36f": "resolveEntityAddressAndOwner(address)", +"9beb6c6b": "_saleFinalized()", +"9bed31e4": "setParameters(uint32,uint256,address)", +"9bedb2c7": "MyReferrals()", +"9bee3365": "sayYes()", +"9bee757b": "requestExecution(bytes,uint256)", +"9beebe20": "setTrustedTransfer(bool)", +"9beef73f": "stageDistributed()", +"9bef0c47": "getUserPictureByWallet(address)", +"9befa8b4": "DisqusBot()", +"9befd45a": "payFee(bytes32)", +"9bf0093c": "LIV()", +"9bf037e5": "BaseCrowdsale(address,address,address,uint256,uint256,uint256,uint256)", +"9bf070b5": "ethRaisedWithoutCompany()", +"9bf08a06": "joinArena()", +"9bf1c389": "stage_1_add()", +"9bf1f148": "requestAudit(address,bytes32,uint256)", +"9bf22189": "Validated(string)", +"9bf2926d": "Proposal(address,uint256,string)", +"9bf2ab46": "preSalesEndDate()", +"9bf30bac": "handleIncomingPayment(address,uint256)", +"9bf34e30": "ecrecover3(bytes32,uint8,bytes32,bytes32)", +"9bf39dce": "contributionTime()", +"9bf4c5c5": "destroyedNinjas()", +"9bf677e4": "phase_1_rate()", +"9bf68006": "testControlSetNotTransferableNotOwner()", +"9bf6b0a8": "withdrawForFiveStep()", +"9bf6deaf": "ChangeEmissionRateCoefficient(uint8)", +"9bf6eb60": "mintTokensExternal(address,uint256)", +"9bf74ae0": "periodICOStage1()", +"9bf7ef63": "verifyMultiSig(address,bytes32,bytes,uint256,uint256)", +"9bf865d0": "numberToAddress(uint256,address)", +"9bf8df7d": "recoverLost(address,address)", +"9bf97bd9": "get_deployed_forwarders()", +"9bf97e74": "BNN()", +"9bf9cd26": "PreSaleSold()", +"9bfa1f33": "ORDER_FILL(address,address,address,bool,uint256,uint256,uint256)", +"9bfa835b": "privateMin()", +"9bfa882e": "updateAddress(address,address)", +"9bfaa24b": "startTradable(bool)", +"9bfafdc2": "ERC223Transfer(address,address,uint256,bytes)", +"9bfb9717": "additional_incentive()", +"9bfb9752": "setTime1(address,uint256)", +"9bfba3c6": "ico2cap()", +"9bfc80fc": "TopSciFiVoter()", +"9bfd8d61": "totalStaked(address)", +"9bfdbf8a": "getOrganizerRegistrationStatus(uint256)", +"9bfdce3e": "deal(address,uint8)", +"9bfdd1bb": "setSchema(string,bytes32,string,uint256,uint256,uint256,uint256)", +"9bfdf68d": "requestLoans(uint256[],bytes32[])", +"9bfe171a": "STASToken()", +"9bfe7bd5": "getNumOrdersByOwner()", +"9bfeda53": "_getRewardTokenAmount()", +"9bff209d": "softSub(uint256,uint256)", +"9bff662c": "notify_payment_acceptance_request(uint256)", +"9c001bcc": "TOKEN_SHARE_OF_BOUNTY()", +"9c0051db": "setProfitTransferTimeSpan(uint256)", +"9c007973": "resolveDispute(bytes16,address,address,uint256,uint256,uint8)", +"9c01e1f5": "addNFToken(address,uint256)", +"9c01fdaa": "PimmelToken()", +"9c03b04f": "testItStoresAValue()", +"9c03f17f": "sencToken()", +"9c03facb": "sold(uint256)", +"9c041ebd": "create(address,address,address)", +"9c043783": "eachUnfreezeValue()", +"9c049dd0": "hydroStakingMinimum()", +"9c04e4e7": "pre_sale_end()", +"9c04ece9": "lastBlock_f7()", +"9c05093b": "setTeamTokensWallet(address)", +"9c05ba60": "getIndexName(bytes32)", +"9c066eab": "seeRaised()", +"9c0770fe": "ZIL()", +"9c07b2cd": "resetTotalSales()", +"9c080f5d": "showBalance(address)", +"9c08606c": "lockedDays()", +"9c08d549": "startICO(uint256,uint256)", +"9c0953cf": "setProducer(address,address,bool)", +"9c09a64c": "claimSMR()", +"9c09b32c": "ProcessTransaction(uint256)", +"9c09bb4e": "getBestMatch()", +"9c09c3bb": "attestForIdentity(address)", +"9c09c7c6": "addGuessWithRefund(int256)", +"9c09c835": "enableWhitelist(address[])", +"9c09f869": "PixelSelling()", +"9c0a4bbc": "AlwaysFail()", +"9c0b7c08": "terminateFunding()", +"9c0baa2d": "_getRate(uint256)", +"9c0bd57c": "withdrawDragons()", +"9c0c2238": "withDrawEther()", +"9c0cc30c": "getAllArtworks()", +"9c0d010e": "_checkOpenGame()", +"9c0df4f2": "blessings()", +"9c0e3f7a": "write(uint256,uint256)", +"9c0e7d66": "leftoverTokensBuffer()", +"9c0ee65b": "Hold(address,uint256,address,address,address)", +"9c0f16ed": "tokensOfTeamAndAdvisors()", +"9c0fc1e4": "AIC()", +"9c117f0f": "get1(uint256)", +"9c118238": "withdrawBalanceFromServer(address,uint256,bytes)", +"9c1193ea": "GreeterA(bytes)", +"9c121aff": "LogClaim(bytes32,address,uint256)", +"9c121b6d": "meltHorseShoe(uint256,address)", +"9c1230c1": "amount_stages()", +"9c128493": "Lol1CoinCoin()", +"9c12ca21": "setGroupBounty(address[],uint256)", +"9c12deab": "isVendor(address,address)", +"9c135572": "documentsIds()", +"9c147688": "bulkMint(uint32[],address[],uint256[])", +"9c14c77b": "getBuyTime(uint256)", +"9c14e25b": "DonQuixoteToken(address)", +"9c1500f0": "registerMany(address,uint256,int256,uint256,bytes,address,bytes)", +"9c15b047": "getInitialOwners()", +"9c15b04b": "showDividendsAvailable()", +"9c15be0b": "left65(uint256)", +"9c161d1a": "setNextImagePart(address[16],uint256,uint16,uint16,uint16,uint256[])", +"9c16667c": "getAnswer()", +"9c166d31": "LukaToken()", +"9c172f87": "EthVentures4()", +"9c1747e5": "addRewardPercentage(uint256)", +"9c1817e4": "Saddle_Limit()", +"9c19aa9f": "setOrderSupportCancel(uint256)", +"9c19f170": "TotalRaised(uint256)", +"9c1a056f": "visitLength()", +"9c1a32fe": "setTake(uint256)", +"9c1b9408": "preMultisigEther()", +"9c1b987c": "setComment(uint256,bytes3,string)", +"9c1b9c1b": "assignTokens(address,uint256,uint256,uint256,uint256)", +"9c1cb7cf": "PaymentStatusBlockNum(address)", +"9c1d8fa2": "GPN(uint256,string,string,address)", +"9c1d9790": "sendBatchCS(address[],uint256[])", +"9c1e03a0": "crowdsale()", +"9c1f020a": "sendCrowdsaleTokens(address,uint256)", +"9c1f332f": "returnLastBuyerIndex()", +"9c1f6133": "registerVIP()", +"9c1fcc4c": "logicAddress()", +"9c2062ad": "RISK()", +"9c2108eb": "transferGoldFromHotWallet(address,uint256,string)", +"9c211755": "RequstOwnership()", +"9c225b33": "teamAndAdvisorsAllocations(address)", +"9c2412a2": "monarchyStartReward()", +"9c24654c": "presalestartTime()", +"9c24ea40": "setLinkToken(address)", +"9c24eedb": "upvote(uint256,int256)", +"9c24fc55": "presaleBalances(address)", +"9c250dd8": "etherTransfer(address,uint256)", +"9c253011": "print(int256,address)", +"9c255312": "addressETHDeposit()", +"9c25d975": "packLocation(uint64,uint64,uint64)", +"9c2622e2": "addOne(address)", +"9c2625fd": "TEAM_TOKENS0()", +"9c269c34": "TBL4Token()", +"9c27a6f4": "buyTicket(uint8,uint16[],address)", +"9c27ea08": "setNextLotteryTTMTokenId5(uint64)", +"9c27ff9b": "calculateFEE2Distribute()", +"9c286837": "devCut()", +"9c293792": "release_all(address)", +"9c2a7b89": "setTokenInfoHeritor(address,address,uint256)", +"9c2b1a95": "getManagementFee()", +"9c2c1b2b": "addDelegateSigned(address,uint8,bytes32,bytes32,bytes32,address,uint256)", +"9c2cdd5a": "MULTISIG_TKN()", +"9c2e29c6": "LocalLambosEscrows()", +"9c2ea2ec": "setEthExRate(uint256)", +"9c2f0067": "EPIToken(address,uint256)", +"9c2f4092": "DEVP()", +"9c2f5f8f": "closeCurrentGame(uint256)", +"9c2f7a43": "getCrystal(uint256)", +"9c2f88fa": "CoinBundleToken()", +"9c2fa55d": "buyFirst()", +"9c30936f": "removeCertificationDocumentFromSelf(bytes32)", +"9c30ad7e": "isPending()", +"9c31200b": "oraclize_query(uint256,string,bytes[1],uint256)", +"9c315684": "periodPreICOStage()", +"9c31c5ec": "setItemsContract(address)", +"9c323436": "getFixedEndTime(uint256)", +"9c33b66e": "checkAvailableTokens(address,uint256)", +"9c34a15f": "c(uint256,uint256)", +"9c34ae54": "setICODates(uint256,uint256,uint256,uint256,uint256,uint256)", +"9c351fec": "SNDToken(address,string,string,uint256,uint256)", +"9c36e141": "defaultTimeLock()", +"9c3723df": "windowBonusStep2()", +"9c38019b": "verifyProofOfMembershipInternal(uint256,bytes32[],bytes32,bytes32)", +"9c3807e6": "STARTING_STRIPPERS()", +"9c388d30": "LogAccountAmount(address,uint256)", +"9c392e5c": "VirginMToken()", +"9c39857b": "setTeamAdd(address)", +"9c3a39a2": "getPaymentData(uint256)", +"9c3b936f": "killBalance(uint256)", +"9c3b9aa3": "MundoGamerToken(uint256,string,uint8,string)", +"9c3bcd65": "deliverPresaleFuelBalance(address,uint256)", +"9c3c7b2c": "transferredPresale()", +"9c3c97a1": "prohibitFreeze()", +"9c3db309": "getCurrentMiningDifficulty()", +"9c3e0f3f": "icoStarts()", +"9c3ed1ae": "unitsUserCanBuyLimit()", +"9c3f1e90": "orders(bytes32)", +"9c3f7ca2": "acceptOffer(uint256,uint256,bytes32)", +"9c3fe721": "finishedIssuerMinting()", +"9c402944": "sendAVR(address,uint256)", +"9c40478c": "canClaimAuditReward(address,uint256)", +"9c4063ce": "WALLET_T8EX_TEAM()", +"9c409e4d": "VoteOnTransfer(address)", +"9c40ea5c": "setGRForGas(uint256)", +"9c41adfd": "withdrawDepositById(uint256)", +"9c41e591": "XGoldToken()", +"9c421665": "transferToMe(address,uint256)", +"9c4261b9": "VOLUME_EXTRA_BONUS_CONDITION()", +"9c43d950": "registration(uint256,uint256,uint256)", +"9c43eb54": "snapshotTimestamp()", +"9c44f090": "AlquilarBici()", +"9c45510d": "FootBallCoin()", +"9c472c70": "rateSecondWeek()", +"9c473bb2": "setTokenName(address,bytes32)", +"9c4780d8": "currentRoundNumber()", +"9c481c9e": "crowdsaleContractAddress()", +"9c489edb": "setNewExchangeAddress(address)", +"9c492b9e": "raisedFromFiat()", +"9c499b53": "getFeesAvailableForWithdraw()", +"9c4abe06": "getEthOfferPrice(uint256)", +"9c4ae2d0": "deploy(bytes,uint256)", +"9c4b653d": "sendFundsToMsgSender(uint256)", +"9c4b9c8a": "getFreezeTimestamp(address)", +"9c4baf27": "Skywalker(address,address)", +"9c4bcaa5": "setMinBuyPrivate()", +"9c4c557c": "startSale(bool)", +"9c4ca8cb": "IChain(address,uint256,uint256)", +"9c4de81f": "havven()", +"9c4e0f52": "setMaxTokenSellAmount(uint256)", +"9c4e3788": "earlyInitProjectSupply()", +"9c4eda5c": "balanceA()", +"9c4fc41a": "getWineCount()", +"9c4fc563": "_findParticipant(uint256)", +"9c50450f": "amountToCreate()", +"9c50e7ca": "tgeDateStart()", +"9c513bdd": "BwinCoin()", +"9c526380": "getUserTotalCredit(address,address)", +"9c52a7f1": "deny(address)", +"9c536640": "confSetupMixer(bytes32,uint256,uint256,uint256,uint256)", +"9c544e72": "removePending(address,uint256)", +"9c54b91f": "setApprovalCount(uint256)", +"9c54df64": "addAdmins(address[])", +"9c55519b": "optionsConversionDeadline()", +"9c561a42": "Wallet4()", +"9c566cad": "cards_start(uint256)", +"9c5686db": "isERC821()", +"9c579839": "QUOTE()", +"9c57d584": "verifyFingerprint(uint256,bytes,int256)", +"9c58b753": "getWriterId(bytes32)", +"9c58be11": "claimMyToken()", +"9c58c509": "buyIcoToken2(uint256)", +"9c591412": "lifeReserveWallet()", +"9c5945d9": "revealHiddenPosition(uint32,int64[],bytes32,uint64,bytes16)", +"9c5b33ae": "wb()", +"9c5bbc89": "setApprovedAddress(address)", +"9c5c53b3": "lockBonusTokensClaim(uint256)", +"9c5d5e98": "JACKPOT_WINNER()", +"9c5d7030": "reimburseGas(uint256,address,uint256,uint256)", +"9c5d7291": "PhoneCoin()", +"9c5de58b": "startRC()", +"9c5e078f": "createBBODocument(bytes32)", +"9c5e108c": "_getFreezeTime(uint8)", +"9c5e9023": "confirmBeneficiary()", +"9c5fafa4": "balanceOfComisionHold(address)", +"9c6034a7": "sendIfNotForked()", +"9c60839e": "mintBonusTokensForGames(int256,uint256)", +"9c623683": "setWinner(uint256,address)", +"9c62622d": "IHate0xBTC(string)", +"9c632c77": "getServiceTokenAddress()", +"9c6393f2": "TokensWithdrawn(uint256)", +"9c639db4": "UltiCoin()", +"9c63dae5": "depositorCurrency(address)", +"9c644221": "PRICE_STAGE_ONE_BONUS()", +"9c66452e": "checkTime(bytes32,bytes32,uint256)", +"9c665819": "Talent()", +"9c66fe00": "priceOfLandmark(uint256)", +"9c6735c7": "ProfitRate()", +"9c675eaa": "ownerAddr()", +"9c67f06f": "registryStarted()", +"9c67f2fb": "returnEth4Sender(uint256)", +"9c681f86": "totalTokenTransfers()", +"9c6891c5": "set_bountyPercent(uint256)", +"9c68bd60": "payPledge(uint256)", +"9c695a7b": "_isInStage(uint256)", +"9c69763b": "setICOManager(address)", +"9c697750": "getRemainingLimit(address)", +"9c6a5bca": "RiptideCoin()", +"9c6a97ee": "deleteMyCat()", +"9c6c3439": "burnReputation(uint256)", +"9c6e199a": "sendTokensManually(address,address,uint256)", +"9c6e1d46": "emitJobCanceled(uint256)", +"9c6f87e9": "getPseudoRandomNumber()", +"9c700b70": "withdrawOwnerEth(uint256)", +"9c707dcf": "_mthToVouchers(uint256)", +"9c7081df": "prestige()", +"9c709343": "split(bool,address)", +"9c70b899": "KYC_ETH_LMT()", +"9c715535": "confirmPendingChange(address)", +"9c71d169": "OfferCancel(uint8)", +"9c71efef": "STARTING_CraigGrant()", +"9c71fda4": "WALLET_LB_RESERVED()", +"9c7264d7": "fillOrder(address,uint256)", +"9c73048b": "distributeCastleLoot()", +"9c732203": "DoDev(uint256)", +"9c7336fe": "getValueOfRemainingTokens()", +"9c737e8f": "fundPot()", +"9c7387c7": "finishContribution()", +"9c73ff7d": "DANK()", +"9c7409b0": "_getProtectionParams(uint256,uint256,uint256)", +"9c75089f": "Tresdk()", +"9c755f2f": "stuff()", +"9c756200": "ContractOwnerWithdraw(uint256)", +"9c756ec9": "PREICO_PERIOD()", +"9c76a6ac": "buybackPrice()", +"9c775e1f": "delegateApprove(address,uint256)", +"9c787ab2": "YUNXINToken(uint256,string,uint8,string)", +"9c7912ff": "setXzlkcjqowhoqhwoihsiaoquweizxoiuo(uint256)", +"9c792938": "estimate(uint256)", +"9c79af26": "issueExchangeRate(address,address,address,uint256,uint256,uint256)", +"9c7a39e6": "doCustomAirdrop2(address,address[],uint256[])", +"9c7ab767": "numSubscribers()", +"9c7b3c45": "TextToken()", +"9c7b3d79": "ARTISTCOIN()", +"9c7b7a2d": "SingleSourceIdentity()", +"9c7beb8a": "mintingAgents(address)", +"9c7c2498": "OnChainOrderBookV013b()", +"9c7c722b": "rename(string,string)", +"9c7dcdeb": "hostAccount()", +"9c7e6e6e": "checkRokBalance(address)", +"9c7e8a03": "addParticipant(address,address,uint256)", +"9c7eaac5": "makeTrade(address,address,uint256)", +"9c7ebb30": "SellTokens(uint256)", +"9c7ed6cb": "AgiCrowdsale(address,address,uint256,uint256,uint256,uint256,uint256)", +"9c81806d": "WithdrawSpecialEth(uint256)", +"9c81a5f6": "getVestingsCount(address)", +"9c821ac4": "testFailsIfReturnLessThanMin()", +"9c82f2a4": "setSwapper(address)", +"9c830beb": "setStateHolding()", +"9c839bdd": "nextWithdrawDayCommunity()", +"9c83a1e3": "deleteDeposit(address)", +"9c83b0a1": "ValeoTestToken()", +"9c841c16": "checkCorrectRate(bool,uint8)", +"9c84d1f7": "News()", +"9c84eebe": "ERC20Token(uint256,address)", +"9c851ebc": "new_entry()", +"9c85a28a": "infoMessage()", +"9c8615ac": "is_entity(address)", +"9c865645": "calculateFactorFlushDifficulty(uint256)", +"9c86b241": "createPromoArt()", +"9c88b7bf": "enableNewPurchasing(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"9c88cbb6": "getCurrentBracket()", +"9c893d73": "LinkCoinToken()", +"9c89a0e2": "getReputation(address)", +"9c89a10a": "presaleOwner()", +"9c89ddb5": "addCourse(string,address)", +"9c89e828": "BidSubmission(address,uint256)", +"9c8a5a56": "bribedCitizen()", +"9c8aeedd": "breakIdMaintenance2(uint256,address)", +"9c8b8585": "txAboveLimits(bytes32)", +"9c8bb5d0": "confirmBoardScore(bytes32,bytes32)", +"9c8bcd6d": "WbtToken()", +"9c8e1d50": "getChipValue()", +"9c8f8569": "Scc()", +"9c8f94bd": "widthrawBondFunds(address)", +"9c8f9f23": "removeLiquidity(uint256)", +"9c90224b": "assertEq1(bytes1,bytes1,bytes32)", +"9c908f61": "acceptTokens(address,uint256,uint256,uint256,uint256)", +"9c91ae20": "getGeneration(uint40)", +"9c91dd56": "paymentContract()", +"9c9205b6": "Token(address,address,uint256)", +"9c926061": "HashProject(address)", +"9c92bfda": "testReceiveSubmittal()", +"9c93a52f": "SALE_TOKENS_SUPPLY()", +"9c9421c3": "Testtoken()", +"9c94e6c6": "notice()", +"9c960cbb": "setAyantDroitEconomique_Compte_6(uint256)", +"9c97114b": "s(bytes)", +"9c977e43": "requestOraclizeBalance()", +"9c978442": "TransferToAllAccounts()", +"9c981fcb": "getString(string)", +"9c9a1061": "buy(bytes32)", +"9c9a2365": "getFungibleTokenAddress()", +"9c9a4b72": "TokenVesting(address,address)", +"9c9b1170": "setoraclelimitgas(uint256)", +"9c9b2e21": "addReward(address)", +"9c9b8fcc": "ALC_FOUNDATION_ADDRESS()", +"9c9c344c": "getTotalUpdates()", +"9c9cc12a": "getCatRelease(uint256)", +"9c9d07c1": "STARTING_DINO()", +"9c9de4dc": "INT(address)", +"9c9e2752": "SBGCrowdsale()", +"9c9ecedb": "InitialArray()", +"9c9ef44a": "setDiscountValueOn()", +"9c9ef978": "addDataToList(bytes32,bytes32,bytes32,bytes32)", +"9c9fb68b": "GetGamblerChoices(address)", +"9c9fe2a4": "FundsClaimed(address,uint256,string)", +"9c9fe83a": "setBA(bytes32,address)", +"9c9ff934": "ETH_HEROCOIN()", +"9ca0e5e1": "setGoldBonus(uint256)", +"9ca0f19d": "GemsPlay()", +"9ca15d59": "oldInviteAddr()", +"9ca2b9e4": "AdvancedDeposit(bytes32,bytes32)", +"9ca3669d": "cancelCommissionerAuction(uint32)", +"9ca3c29c": "getCost(string)", +"9ca423b3": "referrals(address)", +"9ca44515": "ketqua()", +"9ca5454e": "distributes(uint256)", +"9ca5f4a7": "SafeERC20Helper()", +"9ca67a6e": "notapproved()", +"9ca6e670": "apply(uint256,uint256,string)", +"9ca74595": "BobMarleyCoin()", +"9ca75320": "searchNode(address)", +"9ca77f3c": "kingdomsByNumber(uint256)", +"9ca7c912": "ownerTime()", +"9ca9dcab": "getMemeCount()", +"9caaa154": "setLuckPrice(uint256)", +"9caaa7f4": "get_this_balance()", +"9caab55a": "ParticipantAgent()", +"9caabfac": "dateEcoRelease9()", +"9cad74b0": "randomNumber(uint8,uint8)", +"9cadb159": "settleChannel(uint256,address,uint256,uint256,bytes32,address,uint256,uint256,bytes32)", +"9cae6100": "addAward(string)", +"9cae9e03": "getPropertyInfo(uint8)", +"9caeab45": "periodICOStage5()", +"9caf34c4": "getBalanceEth()", +"9caf9695": "paleyer2show(uint8,uint8,uint8,uint8,uint8)", +"9cb02e8c": "delayPhaseEndBy(uint256,uint256)", +"9cb04d18": "newPresale()", +"9cb08312": "DMTToken()", +"9cb157d9": "VNT()", +"9cb15a94": "FreeCoin(uint256,string,string)", +"9cb1e9fe": "cubicContract()", +"9cb21f6d": "ImperialCredits()", +"9cb230ec": "Lockup(address)", +"9cb29034": "CCECOIN()", +"9cb2b69b": "getCreated(uint256)", +"9cb31079": "setLowLimit(uint256)", +"9cb33309": "BasicTokenMock(address,uint256)", +"9cb35327": "ceilDiv(uint256,uint256)", +"9cb42db4": "PDS()", +"9cb481ea": "getBountyAmount(uint256)", +"9cb4b31c": "tokenTimelockAddress()", +"9cb61295": "getVoterFromProposal(uint256,uint256)", +"9cb64a2d": "debtor()", +"9cb6a504": "addColor(string,string)", +"9cb6ed7e": "escape(address)", +"9cb6fc77": "confirmUpgrade()", +"9cb74ab6": "mgmtInvestProject(address,uint256)", +"9cb7595a": "getBridgeInterfacesVersion()", +"9cb75b2f": "sendBonusEgg(address,uint256)", +"9cb78df8": "minSuccess()", +"9cb7de4b": "setHandler(address,bool)", +"9cb8a26a": "selfDestruct()", +"9cb931f9": "setReferralPromille(uint8)", +"9cb998dc": "increase(bytes32)", +"9cb9b8f5": "withdrawBomb(uint256)", +"9cb9c14f": "Issuance(address,uint256)", +"9cba3559": "globalAmounts(uint256)", +"9cba60a7": "bitmask_check(address,uint256)", +"9cba713e": "reserveTreasury(uint256)", +"9cbad951": "withdrawAllTokensFromBalance()", +"9cbafcb6": "Pharamore()", +"9cbb165e": "isOnBorrow(uint256)", +"9cbb9460": "fetchOrdersForMerchantByAdmin(address)", +"9cbc2d62": "get_member_info(address)", +"9cbc87a3": "bytes32ArrayToString(bytes32[])", +"9cbcfcc7": "calculateGotTokens(uint256)", +"9cbd695f": "show(uint256,uint256)", +"9cbd7da5": "resumeICO()", +"9cbdffc6": "unblock()", +"9cbe5efd": "currentRoundId()", +"9cbf1b85": "exchangeRateAt()", +"9cbf73a9": "purchaserAddresses(uint256)", +"9cbf9e36": "createToken()", +"9cc04ea0": "newRecord(uint256)", +"9cc0c5e3": "experty_io()", +"9cc1c97b": "test_threeValidEqAddress()", +"9cc24569": "ExKnox(address,address)", +"9cc28aa0": "BdpOwnershipStorage(bytes8)", +"9cc2bcc6": "AhieldCureToken()", +"9cc33024": "setPresidenteDeMesa(bytes32,uint256,uint256,uint256,bytes32)", +"9cc3b949": "Bookmark()", +"9cc429dc": "getBattlesCount()", +"9cc477b2": "createFashion(address,uint16[9],uint16)", +"9cc4a319": "CarToken()", +"9cc4d3dd": "convertNumSec(uint256[],uint256[])", +"9cc4da3b": "WHAuthorizeAddress()", +"9cc579af": "MarketJob(address[],uint256[],uint256[],address,address,bytes)", +"9cc5dd95": "_removeOwnersAproves(address)", +"9cc73a6f": "raiseDay3()", +"9cc74299": "withdrawFromManager(uint256,address)", +"9cc7d917": "earlyBirdsAddress()", +"9cc7f708": "balanceOf(uint256)", +"9cc8295a": "EnoughClaims(uint256)", +"9cc84564": "envelopeCounts(address)", +"9cc9299e": "killSwap()", +"9cc946ee": "OlivToken()", +"9cc9b86d": "disableService(address)", +"9cca1c64": "getNonFungibleIndex(uint256)", +"9cca7ac3": "QueueDemandesEnCours()", +"9ccaec98": "getAuctionInfo(uint40)", +"9ccb6e8d": "SentToContractor(uint256,address,uint256)", +"9ccbbc6a": "minimumPowerUpSizeBabz()", +"9cccaea9": "StreamityContract()", +"9cccb272": "BatchPaint(uint8,uint256[],bytes3[],uint256[])", +"9cccd2a4": "getSumAmountOfSuccessfulSteps()", +"9ccd0b51": "getCountCourse()", +"9ccd7d86": "setWinery(address,address,bool)", +"9ccdd994": "Pume(uint256,string,string)", +"9ccf1a68": "prepareURL()", +"9ccfceed": "MANHATTANPROXY10THAMSTAVE()", +"9cd0126a": "gemHpConversion()", +"9cd01605": "exchangeAddress()", +"9cd04996": "DiscountedPreICO(uint256,uint256)", +"9cd08464": "transfer_eth_from_contract(address,uint256)", +"9cd08bae": "CevacToken(uint256,uint256)", +"9cd0c511": "depositMintAndPay(address,uint256,uint256)", +"9cd0f778": "setLuckPool(address)", +"9cd106a8": "cancelRecurringBilling(uint256)", +"9cd19074": "createKey(bytes32)", +"9cd1a121": "delegateTransfer(address,uint256,address)", +"9cd2021c": "mintRefs()", +"9cd22211": "getPlayerGameInfo(uint256,address)", +"9cd23707": "setTransferable(bool)", +"9cd3cb5d": "withdraw_token(address)", +"9cd417d7": "rejectCurrentValidation()", +"9cd43690": "GENTATOKEN()", +"9cd4fb47": "Tier_Classic()", +"9cd5c9a8": "setAssetWallet()", +"9cd70235": "setAmountToClaim(address,uint256)", +"9cd758d0": "setPOOL_edit_2(string)", +"9cd77457": "createInactivePreMintedEdition(uint256,bytes32,uint256,uint256,uint256,address,uint256,uint256,string,uint256,uint256)", +"9cd84ead": "APPToken612()", +"9cd994b4": "updateAuctionTime(uint256,uint256,uint256)", +"9cda1ec5": "setDistributor(address,bool,uint256)", +"9cda5a12": "calcPoseBits(uint256,uint256,uint256)", +"9cdacdb3": "Setup(address)", +"9cdaef4d": "_set4()", +"9cdaf438": "ARCCToken(address,uint256)", +"9cdb4fe8": "addEvidence(bytes32,uint256,bytes32,uint8,bytes32,bytes32)", +"9cdbaa21": "tokenTransferLocker()", +"9cdbc070": "addVoting(uint256)", +"9cdd2e76": "getHeroLocation(uint256)", +"9cdec2bb": "getCompte_18()", +"9cdee922": "RushCoin()", +"9cdf1872": "getOut()", +"9cdf4dd3": "Token(address,string,string)", +"9cdf8a1f": "WTBNToken()", +"9cdfa3df": "getAddrForPrivilege(address)", +"9ce04e35": "enableInvestorTransfer(address)", +"9ce21f3c": "fundingWalletAddress()", +"9ce2c7f2": "AumentaQuantitaVoti(uint256,address)", +"9ce318f6": "withdraw(uint8[],bytes32[],bytes32[],bytes)", +"9ce31fe1": "StudToken(uint256)", +"9ce3961f": "nextVersionAddress()", +"9ce3f461": "UP_winBets()", +"9ce51c7c": "sendNewTalentsAndPartnerships()", +"9ce682bd": "BetFromTransaction(address,uint256)", +"9ce80efc": "test_twoInvalidAssertFalse()", +"9ce840d4": "withdrawNotATokens(address)", +"9ce8fc4e": "LogForkSigned(uint256,bytes32)", +"9ce962ca": "payWallet()", +"9ce9e380": "_burnAllArgs(address,uint256)", +"9cea127f": "CMTTT()", +"9ceb5c6d": "icoBonus1EndDate()", +"9ceba90b": "startWeekFive()", +"9cec2789": "gettags(address)", +"9cecba34": "addPoliceNode(address)", +"9cecc80a": "setReserve(address)", +"9ced0e9b": "initialTime()", +"9ced5c29": "enableNode()", +"9cede14c": "checkAndGetSendersID()", +"9cee1773": "Mednus()", +"9cee9492": "setMaxRewardPercent(uint256)", +"9cef2a6a": "addLand(address,uint256)", +"9cef8873": "reclaimLand(int256,int256)", +"9cef9cfe": "isNumBlack(uint8)", +"9cefa50b": "winner(uint256,bytes32)", +"9cf17d5f": "ScamCoin()", +"9cf21342": "AnimeCoin()", +"9cf21d90": "ETCH3dV()", +"9cf2c727": "sumHardCapICOStage7()", +"9cf3123b": "sellWolkEstimate(uint256,address)", +"9cf3566d": "promotionAllocate(address,uint256)", +"9cf4124f": "enableContinuousDelivery()", +"9cf48365": "getInvestedToken(address)", +"9cf488ad": "sendPlayerBack(uint256[])", +"9cf4910c": "preDistriToAcquiantancesEndTime()", +"9cf4cb1e": "_getVotes(uint256,uint256,uint256,address)", +"9cf5453d": "bid(address)", +"9cf55cfb": "sampleBoolRetTrue()", +"9cf5c613": "setVerified(address,bool)", +"9cf60b86": "addRefBalance(address,uint256)", +"9cf66013": "whitelistRegistrantsFlag(address)", +"9cf66997": "clearLand(int256[],int256[])", +"9cf6f1eb": "CBVO()", +"9cf78527": "UAPToken(address)", +"9cf8ccfd": "currentPlayers()", +"9cf9342e": "createContract(bool,string,bool)", +"9cf94943": "whitelistAdd(address[])", +"9cf9d4c0": "setPOOL_edit_9(string)", +"9cf9e3ab": "TokenReleased(address,uint256)", +"9cfa0f7c": "maxTokensToBuy()", +"9cfa750f": "isParticipant(uint64,address)", +"9cfad128": "calculateFee(address,bool,bool,uint256,uint256)", +"9cfcab47": "NovoToken()", +"9cfd5dc4": "validPurchase(uint256,address)", +"9cfda697": "setColorsX4(uint16[4],uint256[20],uint256)", +"9cfdd04d": "BCN()", +"9cfdfe42": "AXIS()", +"9cfe42da": "addBlacklist(address)", +"9cfe6c86": "count_tokens()", +"9cff53e0": "nDeposits()", +"9cff621a": "withdrawDispersal()", +"9cff799c": "GetCuentaSocio(uint16)", +"9d000e78": "VUP_PER_ETH_PRE_SALE_RATE()", +"9d00ffa5": "isMessageValid(bytes)", +"9d01e730": "EarlyEndTimeChanged(uint256)", +"9d038cd3": "TEST1()", +"9d042f87": "dTimeoutCurrentStage()", +"9d0506ae": "checkData(bytes)", +"9d05414f": "Referral(address,address)", +"9d0617f9": "_send(address,uint256)", +"9d063ed8": "FIFSRegistrar(address,bytes32)", +"9d069353": "getAngel(uint64)", +"9d06a1d5": "removeFromWhiteList(string,address)", +"9d0714b2": "tgeSetLive()", +"9d079b18": "acceptProposal(bytes32)", +"9d07b653": "_createUnit(uint256,uint256,uint256,uint256,address)", +"9d07ff80": "ln_fixed3_lnr_18(uint256,uint256)", +"9d083222": "becomeMember()", +"9d0880a3": "transferUnsoldTokens(address)", +"9d09390b": "isValidAuthority(address,uint256)", +"9d097471": "getUserBounty(address)", +"9d09798f": "DemurringFee(address,uint256)", +"9d09f8e5": "changeRebackRate(uint256)", +"9d0b2c7a": "pendingStake(address,uint256)", +"9d0c0c35": "generateCrabGene(bool,bool)", +"9d0c1e6f": "walletETH()", +"9d0cfc2c": "closeDepositSubRound()", +"9d0d0a5a": "getTotalToggleGameDivsProduced()", +"9d0d9f1c": "azatipsToken()", +"9d0df9b5": "getPOOL_edit_11()", +"9d0e0cd3": "getTotalTAOsCount()", +"9d0e5871": "shipping(address)", +"9d0effdb": "revokePermission(address,address,bytes32)", +"9d0f17c8": "unsoldTokenIssued()", +"9d0f8763": "cancelOrderByAdmin(uint80,bool)", +"9d0fb699": "tokensToBeClaimed()", +"9d106954": "_getUserMinersAt(address,uint32,uint32)", +"9d1080c5": "UnilotToken()", +"9d10fda8": "escrow_fee_denominator()", +"9d118770": "destroy(uint256)", +"9d119a4e": "EmergencyUnPause()", +"9d119a7b": "getDepositTxMap(string)", +"9d11aaaa": "transferFeePercentage()", +"9d11f09f": "getTxAmountKWh(bytes32)", +"9d129afd": "prevBlock()", +"9d12e775": "zec()", +"9d13156c": "claimRefundOwed(uint256)", +"9d134185": "setauctionsystem(uint256,uint256)", +"9d1362a9": "getAllInvestmentsWithdrawnByBeneficiary()", +"9d139ff2": "LajokiCoin()", +"9d140fa2": "inPreSale2Period()", +"9d144f8a": "_preventedByNationalityBlacklist(address,uint256)", +"9d145866": "loadRate(uint256)", +"9d14f134": "getRepo(bytes32,string)", +"9d153495": "withdrawRefund(uint256)", +"9d1672c4": "getAffiliateRate()", +"9d16aca6": "changeExchangeContract(address)", +"9d170c5d": "getRef(string)", +"9d176556": "setDistConfig(address[],uint256[])", +"9d189473": "calculateAndMintTokens(address,uint256)", +"9d18e405": "approveAndBuyAffiliated(uint256,address,uint256,bool,address)", +"9d1a9ff9": "rebatePeriod_()", +"9d1acead": "periodPresale()", +"9d1b0fd1": "createProduct(bytes32,string,bytes32,bytes32)", +"9d1b464a": "currentPrice()", +"9d1b8945": "requestedRedeem(address,uint256)", +"9d1bbd7e": "CancelRoundAndRefundAll(uint256)", +"9d1be930": "autopayfee()", +"9d1c3f03": "isMaximumPreFundingGoalReached()", +"9d1c4d42": "buyAnalysis(uint256,uint256,address)", +"9d1d14e0": "setEtherExchangeLikeCoin(uint32)", +"9d1ddca5": "fiveYearGrace()", +"9d1e0d48": "buy(address,string,uint256,uint256,uint256,uint256)", +"9d1e351c": "totalBonusToken()", +"9d1e641b": "CROWD_WEEK3_BONUS()", +"9d1eb451": "MAT_CROWDSALE_SUPPLY_LIMIT()", +"9d1ebfd6": "nextReleaseAmount()", +"9d1eeb97": "redemptionBurn(address,uint256)", +"9d1f2800": "doPush(address,uint256)", +"9d1fd89c": "getFirstBorrowAgreementTool(address,address)", +"9d1ffed9": "_certify(bytes32)", +"9d2044e1": "setContrAddrAndCrwSale(bool,address,address,address,bool,bool)", +"9d20467a": "changeTiming(uint256,uint256)", +"9d209048": "getNode(address)", +"9d20b314": "TotalpresaleSupply()", +"9d210369": "resetMaxBonusThreshold()", +"9d210bdd": "getStoriesLength()", +"9d21328f": "sharedExpense()", +"9d21dd78": "getGameTime()", +"9d2235e7": "_leapYearsBefore(uint256)", +"9d22c693": "before_test_method_increaseTimeBy30000()", +"9d23c4c7": "tokenRegistry()", +"9d240cf2": "Workshop()", +"9d245238": "getWinNumbers(string)", +"9d248477": "BeaverCoin()", +"9d248e08": "burn3(uint256,uint256,uint256)", +"9d24c49f": "_payloadOffset(uint256)", +"9d24e482": "theWinner()", +"9d255663": "EthMonoPoly(address)", +"9d2620bf": "RealEstateCouponToken()", +"9d2668d4": "setPurchased(address,address,uint256)", +"9d273b20": "refundStatus()", +"9d2754a9": "createTokenToTax()", +"9d2777f4": "IntermediateWallet()", +"9d277a49": "unregisterPublisher(address)", +"9d2870c3": "LPAIToken()", +"9d29255b": "setCSCERC721(address)", +"9d29cac4": "getMonsterClass(uint32)", +"9d2a1eab": "GrantAdded(address,uint256)", +"9d2a8cf0": "unwhitelistAddress(address)", +"9d2ab46d": "BUZZToken()", +"9d2ae623": "depositJackPot()", +"9d2affd5": "transferFrom(address,address,address,address[],uint256)", +"9d2be721": "insertTopic(bytes15,address,bytes32,bytes15)", +"9d2cc436": "RESERVE()", +"9d2cd67c": "collect_main_fee()", +"9d2d912e": "futureDevLock()", +"9d2e4777": "vestingTransfer(address,uint256,uint32)", +"9d2ec188": "setFeeParams(uint256,uint256)", +"9d2f1cbb": "changeStakingFees(uint80,uint80,uint80,int256,uint80,int256,uint256,int256,uint80,uint80,uint256)", +"9d2fc3c8": "adjudicate(uint256,uint256)", +"9d2fcb8c": "setInvestmentAddress(address)", +"9d2ff29c": "ICDSupply()", +"9d30584c": "setHard_Cap(uint256)", +"9d323193": "RTCToken()", +"9d327229": "fechVoteResultForCandidateByStage(address,uint256)", +"9d340b71": "buyTokensfor82()", +"9d3565ce": "transferOr(address)", +"9d35dcac": "NewUser(uint256,address,address,uint32)", +"9d36c500": "freeAnimalsLimit()", +"9d38cdbf": "OwnedUpgradeabilityProxy(address)", +"9d38cea3": "stopPreIco()", +"9d390d83": "setIsWeiAccepted(bool)", +"9d3995c2": "setHeroPost(address,uint256)", +"9d3ac6d5": "getBuyerContribution(address)", +"9d3acf23": "isResolvedForDefendant(uint256)", +"9d3aee8d": "st4ckHeight(uint256)", +"9d3c015e": "PChannel(address)", +"9d3c3b5d": "getArrayHashMarketItem(bytes16)", +"9d3c663f": "isBreakingCap(uint256,uint256,uint256,uint256)", +"9d3cc187": "changeSetRateAddress(address)", +"9d3d1d82": "userSponsorshipsPred(address,uint256[],uint256)", +"9d3d741c": "testAboveLength()", +"9d3d9b4d": "FETCOIN()", +"9d3de343": "addVictim(string,string)", +"9d3de95a": "getPortfolioInfo(address,uint256)", +"9d3e069c": "StartDraw()", +"9d3e1ab8": "walletRemaining()", +"9d3ec1a7": "getMarriageDetails()", +"9d3f2e5f": "stakeEthForGas(uint256,address)", +"9d3fae04": "applyAuditorsCheckUpdate(address,address,uint256)", +"9d3fe4c2": "AGAVETHER(string,string)", +"9d4022c8": "OrderStatisticTree()", +"9d406a13": "getLocksLockedFor(address,uint256)", +"9d408b93": "gasBefore_()", +"9d4095cc": "getAmbientTempException(bytes32)", +"9d41198e": "startnewround()", +"9d41a9af": "getOccupation(address)", +"9d41d6fc": "testInitialBalanceWithNewRGXToken()", +"9d421ea7": "claimTeamToken()", +"9d42829a": "getGoldInfoDocumentation(address)", +"9d42d1a9": "sendEvent(uint256,bytes32)", +"9d4323be": "drainToken(address,uint256)", +"9d4327a0": "stockBuyCertainOrder(uint256,uint256,uint256,uint256)", +"9d433c71": "sharesOfSPS()", +"9d442102": "BuyRocketForSale(uint32)", +"9d44ac4f": "permissionExists(uint8,address)", +"9d44d93b": "delegateTransferAndCall(uint256,uint256,address,uint256,bytes,address,uint8,bytes32,bytes32)", +"9d44fca2": "computeEthConstant(uint256)", +"9d451c4d": "right77(uint256)", +"9d45b9d2": "soldTokensPreIco()", +"9d45d077": "raiseSellOrderMatched(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int160)", +"9d463520": "lastMintTime()", +"9d463b99": "addPool(uint256,uint256,uint256)", +"9d471837": "updateTextForHolder(bytes32,bytes)", +"9d478656": "sendp(address,uint256)", +"9d481848": "propose(address,bytes)", +"9d484693": "payouts(address,uint256)", +"9d4936f9": "MINING_OUTPUT()", +"9d4971b7": "getOrderLength()", +"9d499363": "faucetTokenAddress()", +"9d4ab2a3": "setInvestAgent(address)", +"9d4aba7c": "getTimestamp_()", +"9d4ace0b": "reg_bountyHunter(address,address)", +"9d4b1239": "tokensDistributedCrowdsale()", +"9d4c162d": "executeProposal(bytes32,int256)", +"9d4c5451": "minTokens()", +"9d4c662c": "sell_id()", +"9d4c7737": "creditStatus()", +"9d4c8eed": "getChildCount(address)", +"9d4cc8ad": "Poppins()", +"9d4cf268": "isERC165Interface(bytes32)", +"9d4d8db3": "Happy()", +"9d4e85ce": "getUserDeposits(address,address)", +"9d4e9a60": "addContractERC20(address)", +"9d4ea0f3": "canMove(uint16,uint8,uint8)", +"9d4ff8ad": "enter(string)", +"9d5176fd": "getPremiumFactors(bytes32)", +"9d51d9b7": "setMaxBalance(uint256)", +"9d523f4c": "_getNextOwed()", +"9d52f74b": "getFreezeGap(bytes32)", +"9d532041": "createCrowdsale(address,address,uint256,uint256,uint256,uint256,uint256,bool,uint8)", +"9d535056": "punterWaiting()", +"9d5367c5": "KIDToken()", +"9d53827f": "MAX_TRANSFER()", +"9d53f19e": "getInvestorInforMin(uint16)", +"9d54c79d": "notary()", +"9d54f419": "setUpdater(address)", +"9d55fba7": "updateCommission(uint256)", +"9d564d9a": "unlockTokens(address,uint256)", +"9d56998d": "my_message()", +"9d5708ff": "myTulipsBatched(uint256,uint16)", +"9d575582": "depositToken(address,uint256,address)", +"9d5779ce": "Site(string)", +"9d5839e3": "getFirstMilestone()", +"9d585f7f": "loanAmount()", +"9d58a5b6": "unitExists(uint256,uint256)", +"9d58aa41": "changeRestrictedtStatus(address,address,bool)", +"9d58b15d": "addMember(address,address)", +"9d59011e": "setAmount(uint128)", +"9d599cbf": "hashClaimable(bytes32)", +"9d59beb1": "listTokenFee()", +"9d5c6061": "getMsgGas()", +"9d5c6e20": "setPrivateSaleEndDate(uint256)", +"9d5c7be8": "collectionCountsOf(address)", +"9d5de12e": "STQPreSale(address,address)", +"9d5eab46": "setItemOption(address,uint256,uint256)", +"9d5eb078": "buyTemplate(uint256)", +"9d5efb6b": "tokenContractSupply()", +"9d5f2422": "createDifficultyOracle(uint256)", +"9d5f5cd3": "mktValue()", +"9d5f658e": "viewFirstBatchOfContractState()", +"9d61193a": "passoverStartTime()", +"9d617fae": "pendingFills(address)", +"9d619dad": "currentTournamentBank()", +"9d61e624": "hardcapInEth()", +"9d625241": "powermayorCutPercentage()", +"9d62f07b": "BlockGrainCoin()", +"9d636359": "initialMarketSales()", +"9d63848a": "tokens()", +"9d64a5e5": "newFoundationCandidate()", +"9d64d474": "cancelExplorationByIndex(uint256)", +"9d652118": "presaleclosingTime()", +"9d66a9cd": "getDetail(uint256)", +"9d66e913": "callStcWithBto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"9d67b404": "addChunk6ToWhiteList()", +"9d68521a": "revokeOperatorTranche(bytes32,address)", +"9d69d5c6": "CERTIToken()", +"9d69fdff": "Ecometh()", +"9d6a4d77": "allotToken(uint256)", +"9d6abbcd": "unlockedEscrow(bytes32)", +"9d6abe4f": "getLink(address)", +"9d6ad799": "computeTokenWithBonus(uint256,address)", +"9d6adeaf": "HitToken(string,string,uint8,uint256)", +"9d6b74f8": "DISPLAY_CLASSIQUE_ET_VIDEO()", +"9d6bf036": "setIsLimited(bool,string)", +"9d6d22b5": "ProgrammerdaddysToken()", +"9d6d2321": "dividendsFull(address)", +"9d6d78e4": "chunk3IsAdded()", +"9d6d8598": "depositTokens(bool,uint256,address)", +"9d6dcf53": "Smilebitbuy(uint256,string,uint8,string)", +"9d6e0c22": "setBroker(address,address,uint256)", +"9d6e4eaa": "ReleasableToken(string,uint256,string,uint256)", +"9d6eaad5": "returnTokensToOwner(string)", +"9d6f78c1": "LineToken2()", +"9d6fa618": "requestTransferOwnership(address)", +"9d6fac6f": "cooldowns(uint256)", +"9d6fb020": "isRefunding()", +"9d70085e": "cap3(address)", +"9d707d03": "resetAuctionStart(address,address)", +"9d7150fe": "isAffiliateValid(address)", +"9d7233d4": "MIN_CONTRIBUTION_WEIS()", +"9d72d8d3": "luckyBuy(uint8)", +"9d733f0c": "submissionPrice()", +"9d735286": "forwardFunds()", +"9d7354c0": "BuyHandler(uint256)", +"9d735fc5": "RewardPoint()", +"9d73cecc": "validatePeer(address)", +"9d7437b8": "WALLET_ADVISOR()", +"9d74b37d": "getBool(address,bytes32)", +"9d74b959": "test_basicWithAssertBeforeThrow()", +"9d74fb7c": "ContributionMock()", +"9d755367": "getOwnerOfTicket(uint256)", +"9d75c113": "_joinCDP(bytes32,uint256)", +"9d7616a5": "preEtherCap()", +"9d76ea58": "tokenAddress()", +"9d770e49": "abstractResolver()", +"9d773a1b": "catsForSale(uint256)", +"9d77bd68": "luCat()", +"9d77e4f8": "getChainFees(uint256)", +"9d77f85a": "buyCollectible(uint256,uint256,int256)", +"9d79468a": "claimRewardTo(address,uint256,string)", +"9d7a63e9": "changeDripAmounts(uint256,uint256)", +"9d7acf74": "BluechipToken()", +"9d7b5621": "numberOfTokenId()", +"9d7b7636": "Neymar()", +"9d7b8887": "addAddressMappingProposal(address)", +"9d7bf73c": "PLUS()", +"9d7d6667": "multipliers()", +"9d7da479": "mintTokens1(int256,address,uint256,uint256,bytes32)", +"9d7e2730": "issueCoins(uint256,address)", +"9d7e6ca8": "setResponseAddress(address)", +"9d7eb375": "updateUserDetails(string)", +"9d80ac4d": "WithdrawedEthToWallet(uint256)", +"9d80c818": "addressCount()", +"9d815818": "validReleasedToken(uint256)", +"9d8168f0": "removeManyWhitelist(address[])", +"9d821c1a": "setManualSaleFlag(bool)", +"9d827eb9": "CreationFeeChangedEvent(uint256)", +"9d8374b4": "removeFromBlacklist(address,address)", +"9d837ccd": "ETH_CAP()", +"9d83ee1b": "getAllCardDatas()", +"9d84934d": "mintStartYear()", +"9d84ae69": "readAddress(bytes32)", +"9d856bdc": "queen()", +"9d858a80": "Pheonix(uint256,uint256)", +"9d85fca3": "findIndexFromRandomNumber(uint32)", +"9d866527": "Strange()", +"9d86ad52": "CloseIfBug()", +"9d86fd0c": "test_threeTrueAssert()", +"9d87a373": "transferFromMany(address[],address,uint256[],address)", +"9d87e7f0": "getWeiAvailableToReturn(address)", +"9d882b5d": "Sotoin()", +"9d88584e": "removeFamily(address)", +"9d888e86": "currentVersion()", +"9d88f3a1": "setLotteryAddress(address,address)", +"9d89add1": "createMechETH(uint256,address)", +"9d89e7d4": "challengeAmount()", +"9d8a0212": "costOfOneToken()", +"9d8a18ea": "VT(uint256,string,string)", +"9d8a8c43": "totalTokenMintedPreSale()", +"9d8abff3": "miningAttempts(uint256,address)", +"9d8b0834": "verifyLoanOfferingRecurse(address,address[9],uint256[7],uint32[4],bytes32,bytes)", +"9d8b157b": "teamCup()", +"9d8c3994": "giveAllToCharity()", +"9d8c428e": "addRoundMode(uint256,uint256,uint256)", +"9d8c7243": "CreateKRM(address,uint256)", +"9d8c997b": "getInfoByUnionId(bytes32)", +"9d8ca531": "closeLottery(uint256)", +"9d8cb45c": "foundationSupplyRemaining()", +"9d8d22f4": "grantReserveTokens(address)", +"9d8d911e": "_createCryptsy(uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,address)", +"9d8dbd20": "remove_kycer(address)", +"9d8df6dd": "cancelAdoptionRequest(bytes5)", +"9d8e2177": "UNIT()", +"9d8ee943": "right71(uint256)", +"9d8f2b17": "LCAP()", +"9d8f4c27": "priceUpdateAddress()", +"9d902fc0": "precisionFactor()", +"9d913c64": "addTokenLock(uint256,uint256)", +"9d9231b1": "_unpackLevelValue(uint256)", +"9d925fc8": "REFUND_RATE()", +"9d930f02": "newTeamOnEnd(uint64,uint64,uint64)", +"9d932a93": "validateSignature(bytes,bytes32)", +"9d94743a": "CND(address)", +"9d94a8fa": "_thresholdTwo()", +"9d94c343": "POSV()", +"9d94dac8": "fightEtherMonster()", +"9d95f1cc": "addNode(address)", +"9d963289": "NewLeader(address,uint8[])", +"9d96be58": "maxMintBlock()", +"9d96f200": "Factory(string)", +"9d97bcd7": "allocatePreICOTokens()", +"9d988d03": "X(address)", +"9d989b20": "chargeDailyRate(bytes32,address)", +"9d98cd78": "drawETH(uint256)", +"9d9a5e1c": "startPrivateICO()", +"9d9a7fe9": "completed()", +"9d9ab2d8": "setEtherUsdRate(uint16)", +"9d9ae444": "StatsReserved()", +"9d9aeb7f": "setInterestAllocationPercentage(uint256,uint256)", +"9d9afce9": "claimTokenReserve()", +"9d9b2e82": "RevenueSharingContract()", +"9d9b4d20": "DST_R_N_B_PROGRAM()", +"9d9b5342": "editInfo(string)", +"9d9bfb02": "throwsWhenNonMultisigDeploysANT()", +"9d9c9439": "tokenInitialised()", +"9d9c9a0d": "testControlCreateWithParentParentSameItemId()", +"9d9ca28d": "isWinner(address)", +"9d9cc8e9": "TestCrowdsale_Noname()", +"9d9d432f": "updateGenVault(address,uint256)", +"9d9db392": "makePayment(address,uint256,string)", +"9d9dcf81": "getXPL()", +"9d9fcc72": "checkWithdrawals(address)", +"9da065cb": "ReddyToken()", +"9da0c7b1": "nowCanProvideHash()", +"9da0d7d4": "dutchAuction()", +"9da0dc0a": "preICOWeiRaised()", +"9da1814c": "FremenTradeToken()", +"9da19acc": "isRedemptionReady()", +"9da1b02a": "createSale(uint256)", +"9da1bc7b": "updateBearCount(address)", +"9da26320": "registrations_confirmed()", +"9da2b791": "assignDNI(uint256)", +"9da30467": "payForOrderInTokens(uint256,address,uint256,address,uint256)", +"9da32c14": "Defapacoin()", +"9da43ef4": "getExtraPoints(uint32)", +"9da46ee3": "getPool(uint32)", +"9da59934": "getInbox(address,uint256)", +"9da5e0eb": "initDaylimit(uint256)", +"9da67e71": "OpenMoneyPresale()", +"9da680f3": "adjustRegistrationFee(uint256)", +"9da69180": "commitVote(uint256,bytes32)", +"9da78649": "getNewRecordInHistoryRecord(uint256)", +"9da8be21": "initWallet(address)", +"9da8e7e2": "createProxy(string)", +"9da9650e": "Cothereum(uint256,string,string)", +"9da9df3e": "withdrawContract()", +"9daa7b46": "STTCToken()", +"9daa9ecd": "percentAllocationFeeDenominator()", +"9daaae94": "setClient(bytes32,address)", +"9dab2054": "priceAt(uint256)", +"9dab3cd4": "userRight(address,bytes1,uint256)", +"9dab4607": "ACCEPT_DICE()", +"9dabff25": "sendReward(address)", +"9dac83e4": "allowWorker(address)", +"9dace789": "EOSGold(uint256,uint256)", +"9dad9382": "closeStream()", +"9dae2e80": "payoutDonations()", +"9dae6081": "createTournament()", +"9daf57cf": "getBdpDataStorage(address[16])", +"9daf77a5": "GetContractStateTerminatedMisrep()", +"9daf9b6b": "insertNodeAfter(uint256,uint256,address)", +"9daf9ce3": "computeTotalEthAmount()", +"9dafb4df": "prizeOwner()", +"9dafbc13": "initBlock(uint256)", +"9db02721": "refuseWork()", +"9db028ab": "getMetadataHistoryLength(string)", +"9db069d8": "bountyOwner()", +"9db09a08": "createContractMovie(string)", +"9db11039": "existenceTransferFromTest(address)", +"9db1b8af": "msc()", +"9db1cafa": "SuccessLife()", +"9db28672": "isOfferingStarted()", +"9db340de": "eraseNodeHierarchy(uint256,bytes32[],bytes32)", +"9db3956e": "setDatabase(string,uint256)", +"9db40718": "SearchIPR(string,string)", +"9db4372c": "num_tickets_current_round()", +"9db4577f": "addListToWhiteList(address[])", +"9db5d993": "putString(bytes32,string)", +"9db5dbe4": "transferERC20(address,address,uint256)", +"9db67cd0": "funcFromC3()", +"9db70e19": "tokenIdToRank(uint256)", +"9db7ff9e": "changeGameRuningblock(uint256)", +"9db834fe": "setColorPink()", +"9db8d393": "setCostToCancel(uint256)", +"9db91e78": "insecureMode()", +"9dbbcca3": "ChangePreICOStart(uint256)", +"9dbc041c": "requiredBid(uint256)", +"9dbc4f9b": "participantDetails(uint256)", +"9dbd1b96": "getRecipient(bytes)", +"9dbda902": "getHighestMortgageRate()", +"9dbdfe0d": "LocusOne()", +"9dbe3501": "LongPlace(address[2],uint256[8],uint256)", +"9dbf0087": "TokenERC20(uint256,string,string)", +"9dbf0543": "price_constant()", +"9dbf5eca": "updateRelayer(address,bool)", +"9dbf7014": "depositMineral()", +"9dbfe1b8": "setSaleRate(uint256,uint256)", +"9dc04184": "allowDraw()", +"9dc080d3": "angelToken()", +"9dc10d15": "preAllocatedTokensVestingTime()", +"9dc11280": "numDataOf(uint256)", +"9dc1d961": "message(bytes32,bytes32,string,string)", +"9dc27fe3": "setICOStatus(bool)", +"9dc29fac": "burn(address,uint256)", +"9dc2c8f5": "fireEventLog4Anonym()", +"9dc35799": "updateReading(uint256)", +"9dc371bd": "ULTRIXCOIN()", +"9dc42f16": "_removeOwner(address)", +"9dc43f2d": "newEmployeePoolPromille()", +"9dc4b9c9": "currentLevel()", +"9dc4ca42": "getWalletDigest(bytes32,address)", +"9dc4ef99": "_registerArtist(address)", +"9dc5b35e": "saveData(uint256,bytes32,uint8,bytes32,bytes32,bytes32,address)", +"9dc64f8e": "getWidthrawPercFor(string)", +"9dc6c12b": "TaiwanRepublic(uint256,string,string)", +"9dc6f173": "LogBidAccepted(address,uint256,uint256)", +"9dc7a49a": "RegisterUsername(string)", +"9dc7f01c": "pay_dividended()", +"9dc8832c": "JiucaiToken(uint256,uint8,string,string)", +"9dc905bb": "insertMilestone(uint8,uint256,uint256)", +"9dc90bd8": "GreeningDesertChainToken()", +"9dc9281b": "LjwToken3()", +"9dca362f": "createAccount()", +"9dca4e0a": "matchWinnerOk(uint8,uint8,uint8,uint8)", +"9dcb0f55": "fundingStartAt()", +"9dcb5c65": "resultsWeightedByEther()", +"9dcbed8b": "totalUnrestrictedTokens()", +"9dcbf7ea": "Rename(string,string)", +"9dccc5bf": "getRegistration(bytes32)", +"9dcd4beb": "optionExerciseSpan()", +"9dcee160": "voteC()", +"9dcf56b4": "proofType_TLSNotary()", +"9dd05af9": "setEarlyExchangeRate(uint256)", +"9dd0a30f": "iwithdrawal(uint256,uint256)", +"9dd0ff01": "max_bet_this_spin()", +"9dd1687e": "withdrawBasicTokens(address)", +"9dd21928": "whiteListAddress(address,bool)", +"9dd28e34": "registerVendor(uint256,bool,bytes,bytes)", +"9dd3045b": "TransferToken(address,uint256)", +"9dd373b9": "setStakingContract(address)", +"9dd409d3": "setPlayPrice(uint256,string)", +"9dd4fdd3": "MarketPrice()", +"9dd52927": "AuthorityController(address,address[],uint256,uint256,address)", +"9dd5b9a3": "_lockAllAmount()", +"9dd63c3a": "setOwnerPrice(uint256)", +"9dd74964": "dividendsSum()", +"9dd7b3c3": "getSellBallers()", +"9dd7e749": "getOffsaleCount()", +"9dd819cc": "test_fourValidEqInt()", +"9dd9c24b": "canPerform(address,bytes4)", +"9dda456a": "_firstLevelEth()", +"9ddae7f5": "determineOutcome(uint256,uint8[],uint8)", +"9ddaf5aa": "proofs(uint256)", +"9ddc4a47": "setTransformTarget_default(uint256)", +"9ddccc99": "TelonToken()", +"9ddd503e": "PlayChainToken()", +"9dde6eb6": "placeBidFromEtherScrolls(uint256)", +"9ddee5f9": "SlopeIncreased(uint256)", +"9ddf65e1": "AUTSCoin()", +"9ddf840d": "withdrawDivs()", +"9de0111f": "tokenWithdraw(uint256,address,uint256)", +"9de0eb04": "dappId()", +"9de12300": "updateICOmask(uint256,uint256)", +"9de18f9c": "controla(address,bytes32,bytes32)", +"9de2bd2f": "RYZToken()", +"9de2f796": "getMintAmount(uint256)", +"9de315f1": "getTargetContactPubKey(address)", +"9de39cb3": "testStartsWith()", +"9de4f41c": "seMurio()", +"9de518ba": "divertDividendsToBankroll()", +"9de66604": "erc20old()", +"9de6ba52": "ArtCore()", +"9de6c162": "acquireGauntlet(uint256,uint8,uint256)", +"9de6c45b": "addBox(uint256,string,string,string,uint256,uint8)", +"9de6d9aa": "changeGasLimitAndPrice(uint256,uint256)", +"9de7d032": "createPerson(uint32,string,uint256)", +"9de8302f": "createGen0Auction(uint256,uint128,uint128,uint40)", +"9de8535e": "readiscolorregistered(uint256)", +"9de91ccd": "getCCH_edit_12()", +"9de9205a": "getNujaNumber()", +"9de92f7e": "submitInput()", +"9de9d57e": "multiDistributeAdviserBounty(uint256[],bool)", +"9de9f1b8": "payJackpot3()", +"9dea34ad": "currBetID()", +"9deab49e": "_processERC20TokenPackPurchase(uint8,address,address)", +"9deb0b41": "createConsentFile(address)", +"9dec2189": "metaApproveHash(address,uint256,uint256,uint256)", +"9dec365e": "setCrowdsaleTotal(uint256)", +"9deca9ee": "disputeRounds(uint256,uint256)", +"9decaecc": "addEntryInMonths(address,uint256,uint256)", +"9decde19": "repriceAuctions(uint256[],uint256[],uint256[],uint256,address)", +"9ded1817": "sendCryptoVersusReward()", +"9ded35c8": "unpauseChannels()", +"9df06411": "addDepotEth(address,uint256)", +"9df08a9f": "getStatusEventCloseSuccess(bytes16)", +"9df0a5df": "ADDR_MAYA_TEAM()", +"9df0c176": "createCategoricalEvent(address,address,uint8)", +"9df184ae": "stageTwoEnd()", +"9df196ec": "getWhitelistDetailsFor(address)", +"9df1e2b0": "transferOtherToken(address,address,uint256)", +"9df1f9a1": "getYesCount(uint256)", +"9df21154": "AddToDB(address)", +"9df21bfd": "updateShareAddress(address,address)", +"9df39b4a": "removeCitation(address)", +"9df4867c": "transferSectors(uint16[],address)", +"9df4d0fe": "isChallenged()", +"9df51b89": "claimProfits()", +"9df537c6": "increaseBeneficiaryBalance(address,uint256)", +"9df5a643": "setAllowClaimUser(address,address)", +"9df5cbda": "isSucceed(uint8)", +"9df806d6": "setBurnerAddress(address)", +"9df8f631": "Ur()", +"9df93754": "Log2(bool,string)", +"9df94560": "leekStealTracker_()", +"9df971c1": "subFees(uint256)", +"9df9a1db": "disableKYC()", +"9dfaa207": "OWNERS_AND_PARTNERS_ADDRESS()", +"9dfad52d": "Expand()", +"9dfb071c": "WHITELISTING_MAX_CONTRIBUTION()", +"9dfb64fd": "toggleRefunds()", +"9dfb9de8": "getPawnLoanId(uint256)", +"9dfbb584": "refundNonWhitelistedPerson(address)", +"9dfcc05c": "isExpiredDeadline()", +"9dfcf372": "Lescovex_CYC(uint256,string,string,address)", +"9dfd1de3": "Token20(uint256,string,string)", +"9dfd4e2f": "MAX_ETH()", +"9dfd8b02": "getBuilding(uint256)", +"9dfde201": "Price()", +"9dfe29b5": "nextTokenType()", +"9dfecdcc": "openLottery()", +"9dff78de": "buyAnts()", +"9dfffa36": "countUp(address)", +"9e0112b8": "RESERVED_RESERVE_GROUP()", +"9e014cf1": "PrepareRollEvent(address,uint256,uint256)", +"9e01f9b9": "getUser2()", +"9e0234a1": "PHILCOIN()", +"9e036add": "NBCL(uint256,string,uint8,string)", +"9e03a5d0": "AndxorLogger()", +"9e03c589": "Delinetod()", +"9e03c971": "BuyKeys(uint256)", +"9e05c118": "availableCount()", +"9e05de62": "setFeeSharingValue(uint256)", +"9e060fb6": "updAcceptAdminWithdraw(bool)", +"9e07d205": "attorneySign()", +"9e098d9f": "LjwToken5(address,address)", +"9e0a2280": "TOKEN_SALE_ALLOWANCE()", +"9e0b7a1c": "approveCertificate(uint256,uint256)", +"9e0bb35e": "gamingDividendsReception()", +"9e0c0152": "lola()", +"9e0cb27b": "fetchOrderByOrderIndex(uint256)", +"9e0cbb64": "usersSpriteOwningHistory(address)", +"9e0cea05": "buyerCount()", +"9e0d8126": "PreICOEndTime()", +"9e0f35a2": "transfersSuspended()", +"9e0fd998": "updateEditionPrice(uint256,uint256)", +"9e0fdb26": "cancelSwap()", +"9e11b66c": "getLowerMaximum(uint256)", +"9e1224ce": "lotteryCloseInsurance(uint16)", +"9e126449": "registerForRaffle()", +"9e12c9b9": "sellCoin(address,uint256)", +"9e12d725": "NewTokenGrant(address,address,uint256,uint64,uint64,uint64)", +"9e12f15b": "units50percentExtra()", +"9e136878": "Transferred(uint256)", +"9e13baa4": "BNCConverterFactory()", +"9e13d3e1": "VietnamGemstoneChain()", +"9e140cc8": "ENCRYPTION_KEY()", +"9e1533a9": "getFounderMembersInvest(address)", +"9e159db0": "Lambo()", +"9e15bc25": "totalInput()", +"9e163aca": "getDocumentsCount(bytes16)", +"9e179b91": "addFreeMineral(address,uint32)", +"9e1832b5": "ListingCreated(bytes32,address,uint256,uint256,uint256,uint256,address)", +"9e196881": "sellBlock(uint256,uint256,uint256)", +"9e1a00aa": "sendTo(address,uint256)", +"9e1a4d19": "tokenBalance()", +"9e1ad320": "XERA()", +"9e1b9078": "addLandRevenue(uint256,uint256,uint256)", +"9e1be663": "SeedMarket(uint256,uint256)", +"9e1bf732": "addNewTokenTo(address,uint256)", +"9e1c6d6b": "transferFromFund(address,uint256)", +"9e1d14f1": "getThresholdsLength()", +"9e1e1ca9": "monstersForSale(uint8)", +"9e1e60c7": "depositOffchain(address,uint256,uint256)", +"9e1e6528": "uncertify(address)", +"9e1e9338": "getBuyerTransaction(address,uint256,uint256)", +"9e1eae34": "addReferrer(address,uint8)", +"9e1f5599": "executeTokenTxn(uint256)", +"9e20437c": "digits()", +"9e206ed5": "blockSkills(uint256[])", +"9e208922": "scheduledTopUp()", +"9e20a9a0": "registerToken(uint32,address,uint8)", +"9e20afdf": "weekly_disbursement()", +"9e20b768": "distributedBonusStakes()", +"9e20f6c9": "walletEmail()", +"9e211ee8": "dayFinished(uint16)", +"9e213fb7": "callReplaceCallback(string,address)", +"9e2262f5": "testCreateCostData()", +"9e229c55": "StatEventI(string,uint256)", +"9e22bd72": "lengthArrayApproval()", +"9e231e2d": "abortGame(uint256)", +"9e23602e": "hasAllAttrs(uint256,bytes2)", +"9e238366": "getCraftingAuction(uint256)", +"9e239ace": "itemOwner(bytes32,uint256)", +"9e23c209": "removeDeveloper(address)", +"9e243259": "frozenRate()", +"9e24edca": "TOKEN_FOR_INVESTER()", +"9e251c6f": "DonationReceipt(address,string,uint256,uint256,uint256,bytes32)", +"9e254262": "contractDurationInDays()", +"9e254d13": "Child()", +"9e25ec01": "KAL5Token()", +"9e25fd58": "SotkoCoin()", +"9e27a305": "sachin()", +"9e281a98": "withdrawToken(address,uint256)", +"9e282328": "getEditionReleaseTime(uint256)", +"9e28739d": "LogAddressTokenCapCalculated(uint256,uint256,uint256,string)", +"9e288374": "getContributor(address,address)", +"9e28abaf": "ShareActive()", +"9e29559c": "teamKeepingQuota()", +"9e29739e": "setContributionLevel(address,uint8)", +"9e29eb0f": "getUsersAwaitingForTokens()", +"9e2abcb5": "getddd(uint256)", +"9e2b8488": "getAuthor(uint256)", +"9e2d0478": "addNotaryToOrder(address,address,uint256,uint256,string,bytes)", +"9e2ed686": "cancel(address,bytes32)", +"9e2f04bf": "chooseWinner(uint256)", +"9e306d32": "MintableToken(uint256)", +"9e307955": "etherPrice()", +"9e30dd5f": "buyRareItem(uint256)", +"9e315d46": "payoutAmount(uint256)", +"9e31f9b6": "numGamesCheated()", +"9e321f42": "changeWhitelistOnly(bool)", +"9e3249ab": "setMinShards(uint8)", +"9e325b80": "SocialRemitToken(uint256,string,uint8,string)", +"9e326858": "private_AddGameBar(uint256,string,string,string)", +"9e331188": "startIco3(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"9e33f72c": "reclaimStarted()", +"9e34070f": "isClaimed(uint256)", +"9e340ffb": "endFreeGet()", +"9e34ba2f": "VUP_PER_ETH_ICO_TIER3_RATE()", +"9e34d78e": "getDrawCount(uint256)", +"9e352721": "PreBuy(uint256)", +"9e3572b5": "getCurrencyContract(bytes32)", +"9e35ff3e": "storeCarrotsCredit(address,uint32)", +"9e36fde7": "regName(string,address)", +"9e37273b": "getMintDigest(uint256,bytes32)", +"9e37c923": "subscriptionOf(address,address)", +"9e3809a9": "setFiscalVerify(bytes32,bytes32,bytes32,uint256,uint256,uint256)", +"9e385fa4": "raiseEmergency(bool)", +"9e38ac15": "ownerShip(address)", +"9e38c76e": "lockRedemption(bool)", +"9e39db38": "initChestsStore()", +"9e3a33b2": "_fetchPaidOrdersForMerchant(address)", +"9e3b34bf": "times()", +"9e3b77af": "lendingManager()", +"9e3b94f1": "CONFIRM_LIMIT()", +"9e3b9dc1": "secondTarget()", +"9e3c671c": "citizensAddresses()", +"9e3cd3f5": "_calculateRepayment(address,address)", +"9e3d0636": "numOfDeliveredCrowdsalePurchases()", +"9e3d154e": "vote(bool,bool,bool)", +"9e3d1b99": "Bakt(address,bytes32,address)", +"9e3d2d06": "totalEtherBetValue()", +"9e3d49db": "walletBounties()", +"9e3d7809": "setParamsTransfer(bool)", +"9e3df458": "twentyThirtyAllocation()", +"9e3e230b": "setSubmissionClosed(uint256)", +"9e3e6878": "allCatsAssigned()", +"9e3edce9": "setImageHash(uint256,string)", +"9e3f1f71": "isPartOfOrg(string)", +"9e416812": "creditGameAddress()", +"9e4195f1": "releaseOrderStakes(address,uint256,uint256)", +"9e41a9cd": "viewCertificateByCourse(address,string)", +"9e41b73f": "getWeapon(uint256)", +"9e422447": "clamp(uint256,uint256,uint256)", +"9e4307cf": "_95_ebetSmartContracti()", +"9e43692c": "FOUNDATION_POOL_TOKENS()", +"9e439ff8": "thirdPeriod()", +"9e455939": "getContractAddr()", +"9e459174": "_addDroneInternal(address)", +"9e45de73": "PieceTransferred(uint256,address,address)", +"9e45e0d0": "darknodeRegistry()", +"9e47214a": "isHarvestEnabled()", +"9e4734ba": "nextTimeout()", +"9e484dd4": "getMembersOfTierCount(uint256)", +"9e48d2fd": "setPayouts(uint256,string)", +"9e4902c9": "ZZCoin(address)", +"9e492aa6": "updateBLAddress(address)", +"9e497967": "CosmicPowerToken()", +"9e49e976": "importIssuerData(address[],uint256[])", +"9e4a5ade": "tokenICO()", +"9e4a613f": "setCertificate(string,string,string,uint256,uint256,string,string)", +"9e4a993b": "getGameStake(uint256,address)", +"9e4a9f2f": "SCComplianceService()", +"9e4ba1be": "testBuyTwoTokens()", +"9e4ba75b": "donateDividends()", +"9e4be339": "getPartners(address)", +"9e4bec3f": "senderIsProvider()", +"9e4c1357": "purposeWeiRate()", +"9e4d4d0c": "updateIcoEnding(uint256)", +"9e4ea320": "getterForTest(uint256)", +"9e4ece80": "getInvestorUnPaidAmount(address)", +"9e509af3": "NggaToken()", +"9e51051f": "initialRate()", +"9e524caa": "subMinutes(uint256,uint256)", +"9e5288a0": "getStep()", +"9e536132": "GetUserPools(address)", +"9e5406bf": "paymentWithCurrency(address,string,uint64,string)", +"9e544fff": "unclaimedReward(address)", +"9e551567": "PonziToken()", +"9e570d6f": "updateFighterStats(uint256,uint8,uint8,uint8,uint8,uint32)", +"9e58280c": "profit2()", +"9e584658": "newStandardCampaign(string,uint256,uint256,address)", +"9e58963f": "_clear(address)", +"9e58ad97": "getNormalCardList(address)", +"9e58cfd1": "decreaseBeneficiaryBalance(address,uint256)", +"9e58e1a7": "_addPartExperience(uint256,int32)", +"9e58f77f": "AddCandidateResult(uint256,address,uint256,uint256,uint256,uint256)", +"9e5914da": "setReferral(address)", +"9e59eb14": "getAllocated(address)", +"9e5ad3ea": "test_insert_findNoHintUpdateHead(int256)", +"9e5b241a": "getBorrowInfoByIndex(uint256)", +"9e5b53bb": "Crowdsale(uint256,uint256,string,string)", +"9e5cdaf0": "initialBankrollGrowthAmount()", +"9e5d0258": "regularDonations(uint256)", +"9e5d4c49": "executeCall(address,uint256,bytes)", +"9e5e86fa": "setEnforceKyc(bool)", +"9e5ece98": "updateLockDate(uint256)", +"9e5ee522": "tokensSoftcap()", +"9e5f1889": "partner2_address()", +"9e5faafc": "attack()", +"9e6031c6": "ZigZagToken()", +"9e60f8d6": "getPlayerSpaceshipBattleWinsById(uint256)", +"9e6371ba": "retire(address)", +"9e639858": "winPercent()", +"9e647aac": "getParameter(string)", +"9e6480fa": "A(uint256,string,string)", +"9e654dfa": "redeemForkedTokens()", +"9e65741e": "exchangePrice()", +"9e65a03a": "cancelSellCityForEther(uint16)", +"9e65c7e5": "updateLatestRevision(bytes20,bytes)", +"9e65fab0": "priceIsFrozen()", +"9e66cd38": "free(uint64)", +"9e67fa6a": "createArtwork(string,address,uint256)", +"9e686c0d": "getStaffLength()", +"9e687b6c": "retrieve(bytes32,address)", +"9e68ca82": "preValidatePurchase(address,uint256)", +"9e69383d": "TokenBatchTransfer()", +"9e697cd3": "startDateOfRestoreUnsoldTokens()", +"9e6985e2": "setbuyPrice(uint256)", +"9e6992b5": "BcengCoffeeToken()", +"9e69940d": "eachAirDropAmount()", +"9e69a6d2": "bountyTokensNotDistributed()", +"9e69c732": "take(string,string)", +"9e69f2bb": "premine()", +"9e6a5767": "previousTokenVesting()", +"9e6af2e3": "exchangeEthStb(uint256,uint256)", +"9e6afbda": "decreaseSpeed(uint256)", +"9e6b0faf": "addTimeForOpponentSelectForGladiatorBattle(uint256)", +"9e6bcba5": "getBoostFromTile(address,address,address,uint256)", +"9e6bdea0": "RegisterChallengeCreators(address,string)", +"9e6c0877": "__hasRole(uint256,uint256)", +"9e6cb42b": "voteEndTime()", +"9e6d4cd0": "joinRaceAndFinish(uint256,uint256)", +"9e6d6925": "setper(uint256,uint8,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"9e6d95c7": "checkHGame(uint256)", +"9e6eda18": "fee(address,uint256)", +"9e6f2ea2": "Kin()", +"9e6f505b": "BiigoToken(address,uint256)", +"9e6fb394": "companionsListCount()", +"9e7010a8": "Dashidai()", +"9e72942c": "getBoosters()", +"9e72a9d8": "sendToMarket(uint16)", +"9e750316": "pushBlock(uint256,uint256,bytes32,bytes32,string)", +"9e757e7f": "bookOVISSale(uint256,uint256,int256)", +"9e75a7c8": "bitplusAddress()", +"9e75c483": "busted(uint256,uint256,uint256,uint256)", +"9e761bbb": "beneficiaryList(uint256)", +"9e76a007": "removeConverter(address)", +"9e76e30d": "tokenRateUsd()", +"9e776ff5": "getTotalBattleboards()", +"9e79800d": "getOwner(uint16,uint8,uint8)", +"9e7a13ad": "people(uint256)", +"9e7b8d61": "giveRightToVote(address)", +"9e7cf86b": "changeSettings(uint256,uint256,uint256,uint256)", +"9e7d101e": "setMaxLeaders(uint256)", +"9e7d24df": "move(bytes32,uint256,uint256)", +"9e7e514b": "DiceGame()", +"9e7fec98": "owner_time_limit()", +"9e80138c": "LendConnect(address)", +"9e80b731": "test_threeValidAssertFalse()", +"9e80cab0": "ownerSetRecommendProportion(uint16)", +"9e8110e6": "setQuery(string)", +"9e813938": "expiresAfter(address,uint256)", +"9e817c03": "ROUND_LENGTH()", +"9e81c4b3": "sendFunds(address,uint256,uint256,uint256)", +"9e81e254": "_getMaximum(bytes32)", +"9e8385d6": "regadr(address)", +"9e83abe3": "newExit(address,uint256,uint32[])", +"9e84158e": "setPLATAddress(address,address)", +"9e845173": "getCCH_edit_34()", +"9e84d44d": "challengerConvicted(uint256)", +"9e8558a0": "setSellExchangeRate(uint256)", +"9e85742e": "approveEscrow(uint256,uint256)", +"9e86d7a8": "setVnt(address)", +"9e86f8c5": "RequestFactory(address,address,address)", +"9e86fb86": "investOffer(uint256,uint8[])", +"9e87a5cd": "getPriceFeed()", +"9e87c1c6": "getLastSingle()", +"9e87fac8": "Paused()", +"9e8836e2": "THORToken()", +"9e890cb3": "netAmountBought()", +"9e893d64": "TheUltimateWorldDigitalCurrency()", +"9e8a0f57": "getWinRate(uint256)", +"9e8a41f4": "getOutCar(uint256)", +"9e8ab40c": "ICOReserveWithdrawn()", +"9e8af7e9": "migrateInvestorFromHost(address)", +"9e8bf603": "curReleaseAmount()", +"9e8c3543": "setAuditAuditor(uint256,address)", +"9e8c39ed": "updateHolidayState(uint8,string)", +"9e8cfe20": "insert(int8,int8)", +"9e8e23b7": "lastBlock_v5()", +"9e8e3ef4": "nftExits(uint16,uint256)", +"9e8e4add": "changeTurnLast(uint256)", +"9e8ee59a": "addNewTicket(address,uint256,uint256,bool)", +"9e8f152c": "showLock(address)", +"9e8f2750": "withdrawInviteReward()", +"9e8fcbe9": "previousRoundId()", +"9e906157": "FundingRules()", +"9e90ce6c": "tokensIssuedForBonusRangeOne()", +"9e90f9aa": "blackHole()", +"9e916157": "STAGE_2_START()", +"9e9188ea": "setDividends(address)", +"9e918c0a": "setMaxArtworks(uint16)", +"9e9198c2": "layers(uint256)", +"9e920587": "testOwnedAuth()", +"9e92448e": "setRepAvailableForExtraBondPayouts(uint256)", +"9e925746": "_checkAndCallSafeTransfer(address,address,uint256,bytes)", +"9e92c991": "getTotalRollMade()", +"9e92dfd8": "getFiatTransactionsCount(string)", +"9e931e6b": "getRequesters(bytes32,uint256)", +"9e93d0e4": "reinvestReturns(uint256)", +"9e945ff2": "amendPurchase(uint256,address,uint256,uint256,uint256,string,uint256)", +"9e9548cb": "LabelSold(address)", +"9e95670d": "erc20Received(address,uint256,address,uint256)", +"9e9593ce": "RewardPoolAddress()", +"9e95f280": "setRatePreIco(uint256)", +"9e962b39": "minimumContributionPhase1()", +"9e964025": "bonusTokenThreshold()", +"9e965f7e": "revertSuspendedPayment()", +"9e96a23a": "give()", +"9e975ca6": "NSPToken()", +"9e976d38": "toMonth(string)", +"9e9785ad": "payoutCursor_Id()", +"9e985ea6": "changeControllerContract(address,address)", +"9e987b20": "treePot()", +"9e997121": "getConfigAddress(bytes)", +"9e9a783a": "canCallWithAssociation(address,address)", +"9e9a87e5": "agree(address)", +"9e9aed62": "contractTokenBalance()", +"9e9b6d06": "createOption(bool,address,uint128,uint128,address,uint64)", +"9e9bdb9b": "setMaxTransactions(uint16)", +"9e9ce791": "BrainLegitCoin()", +"9e9d0718": "Invested(address,uint256,uint256)", +"9e9d3aa4": "FirstBloodToken(address,address,uint256,uint256)", +"9e9e5b85": "ARIToken(address,address)", +"9e9ea24b": "PRE_ICO_TOKENS()", +"9e9eb444": "winFreeGo(uint256,uint256)", +"9e9ec9e3": "getHashAddresses()", +"9ea03ccb": "fundingUnlockPeriod()", +"9ea064b2": "getLevelConfig(uint32,uint32)", +"9ea0b8f0": "addTeamGrant(address,uint256,uint256,uint256)", +"9ea0c08c": "announcementName()", +"9ea134bf": "getRedeemableReputationStaker(bytes32,address)", +"9ea1b79d": "getContentChannel(uint256)", +"9ea2104d": "firstReleaseAmount()", +"9ea23080": "STQPreICO3TestHelper(address,address[])", +"9ea27016": "setTokenIdsIndex(uint256,uint256)", +"9ea28b5c": "VestingMemberAdded(address,uint256,uint256,uint256)", +"9ea30fae": "getPokemonOwner(uint256)", +"9ea407be": "updateTokensPerEth(uint256)", +"9ea480ec": "allowanceFlower(address,address)", +"9ea55bb0": "updateFeeAmount(uint256)", +"9ea57930": "stampIn(address,uint256,uint256)", +"9ea58112": "setLethalBonusAtHits(uint256)", +"9ea67876": "returnNumber(uint256)", +"9ea69541": "updateTileBlockValue(uint16,uint256)", +"9ea71c37": "getDesignatedReportingDurationSeconds()", +"9ea73895": "hitCharacter(uint16,uint16)", +"9ea76475": "subFreezingTime()", +"9ea776cd": "currentFundingRound()", +"9ea82706": "removeRealWorldPlayer(uint128)", +"9ea8a418": "updateFunds(uint256,uint256,uint256,bytes,bytes,bool,bytes32,bytes32)", +"9ea94877": "getLandIdByKey(bytes8)", +"9ea98d55": "intersect(address[],address[])", +"9eaa4812": "isLastMilestoneAccepted(bytes32)", +"9eab0e29": "FinalisedCrowdsale(uint256,uint256)", +"9eab503a": "dividendAddr()", +"9eab5253": "getMembers()", +"9eabebe7": "setTransferTime(uint256)", +"9eacc166": "transferAnyERC20Token(address,address,address,uint256)", +"9ead1478": "setMaxAnimals(uint16)", +"9ead1b00": "loanBalanceOf(address)", +"9ead7222": "tokenList(uint256)", +"9eadd77c": "roundMoneyDownNicelyET(uint256)", +"9eae2453": "setSchedule(bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,uint256)", +"9eae6555": "earlyContribList()", +"9eaeca9f": "getTokenReturnRate()", +"9eaeccf1": "TestToken(string,string,uint8,uint256)", +"9eaf17a1": "getCarveUpTokens()", +"9eb05f3a": "EarlySuccess()", +"9eb0ad03": "Exchange(address,address,address,uint256,uint256,uint256,uint256)", +"9eb180a7": "identifierToPrice(uint256)", +"9eb20aa7": "setPetLastTrainingTime(uint64)", +"9eb32fdb": "initializeContract()", +"9eb360cc": "updateRausPoint(int256,uint16,int256,uint16)", +"9eb44784": "getTokensForPresale()", +"9eb45706": "get_previous_asset_document_from_document(bytes32,bytes32)", +"9eb4da1c": "okamiTotalPurchase_()", +"9eb51bf1": "Goodluckcoin()", +"9eb59e00": "updateCursETHtoUSD(uint256)", +"9eb6c932": "ResetAllAmount()", +"9eb7294d": "transferRemainingTokens(address,uint256)", +"9eb7d170": "withdrawPendingBalance(address)", +"9eb81bd0": "unFreezeTransfers()", +"9eb866cc": "isBonusTime()", +"9eb8cbf3": "set_activity_details(uint256,string)", +"9eb9c68f": "stepBonusList(uint256)", +"9eb9dd3b": "getBetsProcessed()", +"9eba0196": "DYCOIN()", +"9ebafad6": "getLastAttackCount(uint256)", +"9ebb1250": "withdrawFinal()", +"9ebb5d3c": "getFreeCraigGrant()", +"9ebbf231": "setMinOrderSizeEth()", +"9ebc8c95": "isNeedLoan()", +"9ebca4ad": "setMasterRecruitmentAddress(address,address)", +"9ebe13a2": "END_ADDRESS()", +"9ebe4d98": "percentageQuarter2()", +"9ebee96c": "buyVirtTokens(address,uint256)", +"9ebf6d92": "Whitelist()", +"9ec0505a": "BING(uint256,string,string)", +"9ec12cfa": "sellsIngrWithoutDepletion(address,uint256,string)", +"9ec272b4": "getPremiumPack(uint256)", +"9ec32d45": "challengeWinningOutcome(bytes,uint16)", +"9ec35352": "returnRandom()", +"9ec3a90c": "verifyTimelock(bytes32,address,address,uint256,uint256,bytes32,bytes,bytes)", +"9ec40d1c": "checkCode(string)", +"9ec5a894": "rewards()", +"9ec68f0f": "multiSend(address,address[],uint256[])", +"9ec7486a": "GiveERC20()", +"9ec760df": "_sendMoney(address,uint256)", +"9ec7888f": "Available()", +"9ec79e99": "requestConsent()", +"9ec7e1c6": "nOS()", +"9ec8b026": "sort(uint256[])", +"9ec8eec9": "TokenImpl()", +"9ec92d42": "getSecondPhaseCap()", +"9eca085c": "isSupervisor()", +"9eca672c": "withdrawFor(address)", +"9ecbf341": "adminRescueFunds()", +"9eccf691": "setICOEnd(uint256)", +"9ece1d9c": "WeiToEther(uint256)", +"9ecf12cb": "HEART(uint256,string,string)", +"9ecf9037": "getNumberDonators()", +"9ed153c0": "master(address)", +"9ed1e4c6": "singleDigitBlock()", +"9ed26fe8": "setEtherInUSD(string)", +"9ed3b61b": "getTrustContract()", +"9ed3edf0": "transactionFee()", +"9ed44c91": "CharitySplit(uint256)", +"9ed474b3": "author2()", +"9ed49005": "completeIcoPart1()", +"9ed4ad43": "getMax(uint8[])", +"9ed53f88": "starExists(uint256)", +"9ed57360": "getPaintingSpeed(uint256)", +"9ed58c7a": "provideData(address,address,uint256,bytes)", +"9ed5c84c": "salePeriod()", +"9ed74a23": "createCloneToken(uint256,string,string)", +"9ed7772c": "OwnerSetPrizePool(address)", +"9ed78285": "GENEOS()", +"9ed78489": "Worldtvcoin()", +"9ed78df0": "PRESALE_TOKEN_SOFT_CAP()", +"9ed798be": "CrestToken()", +"9ed81bc9": "deregisterProducer(address)", +"9ed93318": "create(address)", +"9ed99951": "changeBntyController(address)", +"9eda7d23": "isContributor(uint256,address)", +"9edc7b44": "revokeStack(bytes32,uint256,uint256,uint256,uint256,uint256)", +"9edcebbb": "updateTabRap(bytes32)", +"9edd1bd2": "TestEvmStack()", +"9eddc441": "lockedAccountThresholdUsd()", +"9eddfb1b": "delay_pool_change_block(uint256)", +"9ede7a37": "voteCount(uint8,uint8,uint8)", +"9eded57a": "paybackLast()", +"9ededf77": "width()", +"9edf256d": "getShipPrice(uint256)", +"9edf42ff": "pendingNumbers(address)", +"9edfb647": "senderAllowedFor(address)", +"9edfb9ee": "acceptOwnershipOfVesting(address)", +"9ee035c9": "lookupCanonicalFormat(bytes)", +"9ee04661": "withdrawTeamFunds()", +"9ee06759": "setSquarePrice(uint8,uint256,address)", +"9ee0933f": "joinBounty(address)", +"9ee1bd0f": "whoIsOwner()", +"9ee22f9a": "setCompte_32(string)", +"9ee29ef2": "updateTargetToken(address,uint16,uint16)", +"9ee3518e": "setTeamMember(address,uint256)", +"9ee398ce": "getTierStartAndEndDates(uint256)", +"9ee484ce": "withdrawCerneuTokens(address)", +"9ee5451d": "PriceOneDisable()", +"9ee5555f": "setGovTax(uint8)", +"9ee60142": "_processBonus(address,uint256)", +"9ee61c9d": "testExistingVoteWeight()", +"9ee679e8": "requestWithdrawal(uint256)", +"9ee6a7c3": "onlineTime()", +"9ee6c0e1": "test_2_someTest()", +"9ee6ff70": "testSafeMul(uint256,uint256)", +"9ee71fae": "LogPolicyDeclined(uint256,bytes32)", +"9ee7fbd9": "extraRate(uint256,uint256)", +"9ee837f5": "total_empire_score()", +"9ee85a23": "Bitstoken()", +"9ee85a9f": "isPreSaleTokenRaised(uint256)", +"9ee8e2ff": "_addAmountBlocks(uint256)", +"9ee8fa93": "yearLength()", +"9ee94556": "TestTokensMigration(address)", +"9ee9c8b5": "chetan(uint256,string,uint8,string)", +"9ee9dd5c": "vault_state()", +"9eea480f": "TotalRequestsAmount()", +"9eea4a3a": "address2()", +"9eea67e8": "_addPerk(uint8)", +"9eeaa7f4": "exitDuration()", +"9eeb30e6": "turnoff()", +"9eeb4920": "setLockup_simus(address,uint256,uint256)", +"9eeb5a6a": "Manageable()", +"9eeb6c11": "setBatchCeateDrawingsAddress(address,address)", +"9eeb79b2": "buildUrl(address,uint256,uint256)", +"9eec22e7": "reclaimEtherDeadline()", +"9eec4bac": "payoutFromContract()", +"9eec6e89": "TokenLogic(address,address,address)", +"9eed8369": "neWon()", +"9eee5787": "Standard_1()", +"9eee8041": "getPointSize(uint32,int256)", +"9eee85fe": "bookEarnings(address,uint256)", +"9eeea0d0": "PAOCoin()", +"9eeef510": "bidCustomAuction(uint256,uint256,address)", +"9eef6f65": "addRequest(address,address,bytes32)", +"9eefdd87": "enableAddress(address)", +"9eefde81": "BasicKNOW()", +"9ef0653c": "setICO4Phase()", +"9ef065bb": "fDiv(uint256,uint256)", +"9ef1204c": "vote(bytes32,uint256)", +"9ef13593": "decayedBalanceOf(address)", +"9ef1fbc4": "MudshotsToken()", +"9ef279d1": "burn(address[16],uint256)", +"9ef27b00": "closedAt()", +"9ef35c01": "setJackpotFeePercent(uint256)", +"9ef36bd1": "queueCount()", +"9ef40238": "getcoinsvotes(string)", +"9ef45a31": "someFunction2()", +"9ef46973": "guessFlip()", +"9ef48a31": "setBonusTokenRateLevelThree(uint256)", +"9ef5233f": "setByteSize(bytes32,uint256)", +"9ef53400": "getStaticArraySize()", +"9ef63e97": "paybackToOwner(address)", +"9ef6bf79": "store_ETH_to_contract()", +"9ef6ca0f": "left33(uint256)", +"9ef7a463": "exchangeRateForETH()", +"9ef7e723": "withdrawContractToken(uint256)", +"9ef887ec": "makeItRain(address[],uint256[])", +"9ef916ab": "setOriginalSupply()", +"9ef95545": "CheersWangToken()", +"9ef965d1": "RealEstateToken()", +"9ef974bb": "checkGlobalBalance()", +"9ef9df94": "transcoderTotalStake(address)", +"9efa776d": "tokenFallback(address,uint256,uint256[])", +"9efbae81": "FundTransfer(address,address,uint256)", +"9efbc411": "PICOPSCertifierUpdated(address,address)", +"9efc0190": "YORITEX()", +"9efc81fe": "minimal_token_sell()", +"9efc94a6": "kycLevel()", +"9efd1f0c": "startNextEra_(bytes32)", +"9efe6454": "Rena()", +"9efedc91": "getMyAccuAmount()", +"9efeefa5": "betAgainstUser(uint256,uint256)", +"9effb6a6": "CrowdFunding(string,string,string,uint256,address)", +"9f00237b": "minContribution(uint256)", +"9f005920": "accept(address)", +"9f00c0de": "btycsubmoney(address,uint256)", +"9f020d3a": "equalsNoCase(string,string)", +"9f022f05": "IMDEXsetAdmin(address,bool)", +"9f03711a": "withdrwleftovereth(uint256,address)", +"9f03c3b8": "hicsTokenPrice()", +"9f03d82f": "CGTToken()", +"9f047f3c": "fundProject(string)", +"9f04873d": "VILLAGE_INCREASE_RATE()", +"9f04996d": "bid(uint256,address)", +"9f052fea": "setMintRequestAddressMap(uint256,int256,string,address)", +"9f054b15": "SushiCoin()", +"9f05a36d": "getEnd()", +"9f0650d9": "etherPriceUSD()", +"9f06a579": "ViewBet(address,uint256)", +"9f06aa08": "collateralize(uint256)", +"9f0812cb": "_registerIfNeeded(uint256)", +"9f084b3a": "CAMS()", +"9f08a68c": "working()", +"9f08fc38": "subGlobalBlockValueBalance(uint256)", +"9f095e88": "asdf()", +"9f0a11ee": "buyPrice_wie()", +"9f0b17e3": "forward_transaction(address,uint256,bytes)", +"9f0b7f16": "Foo(string)", +"9f0be144": "getGreeksBattlePointsBy(address)", +"9f0d5f27": "depositAll(address)", +"9f0d6d0f": "ship(uint256,address)", +"9f0de490": "challengeOutcome(int256)", +"9f0e1986": "createGen0Auction(uint256,uint64)", +"9f0e3107": "get_timestamp(bytes32)", +"9f0e591b": "ABCDToken()", +"9f0e7d44": "companyReserves()", +"9f0eed0f": "GetCurrentICOCycle()", +"9f0f78ca": "profitsTotal()", +"9f10a990": "userEntries(address)", +"9f117317": "releaseManyStakes(uint256[],address[],address[])", +"9f118536": "initiated()", +"9f11e9cd": "setRegistrant(uint256,address)", +"9f126281": "updateFirstBuyer(bytes32,uint8,bytes32,address)", +"9f12fde0": "modifyBet(uint256,uint256)", +"9f1306cb": "P3DReceive()", +"9f132677": "MAX_CONTRIBUTION_WEIS()", +"9f13c4c7": "sealableProperties(uint256,bytes32)", +"9f147c41": "tokenPriceInCent()", +"9f15e729": "setgamecardname(uint256,string)", +"9f161d39": "BaseCrowdsale(uint256)", +"9f165304": "STAGE_PRESALE_ETHRaised()", +"9f166cf1": "multiBalanceOf(address,address[])", +"9f16b7d0": "setStarAuction(uint8,address,address)", +"9f16d65f": "fifthMonthEnd()", +"9f16f0e2": "_deposit(uint256,uint256,address,uint256)", +"9f174c6f": "AIRDROP_SHARE()", +"9f180cf1": "calculateAccountValues(address)", +"9f181b5e": "tokenCount()", +"9f184dd5": "aggregateValues(address,address)", +"9f186edb": "setSpawner(address,bool)", +"9f19296b": "getGroupStatistic(uint256)", +"9f1aa404": "refundAllInvestorTokensPurchases(address)", +"9f1ae1c1": "FSATToken()", +"9f1ae6ac": "MAX_CARS_TO_GIFT()", +"9f1b3bad": "Receive()", +"9f1cda42": "ValidateEventStorage(bytes,bytes)", +"9f1eaa4c": "getUnsoldTokensWithDecimals(uint256,uint256)", +"9f1f07fe": "iWAMToken()", +"9f1f238e": "isChecksumValid(bytes32)", +"9f1f2d77": "_updateReferrerFor(address,address)", +"9f203255": "setAuditor(address)", +"9f204a47": "sendIncentivisation(address,uint256)", +"9f21edf6": "setLevelPAO(uint256,uint256,uint256,uint256)", +"9f223167": "ownerEth()", +"9f22af8e": "add2Y(address,uint256)", +"9f233c76": "Seiyuu()", +"9f237b43": "deathData_v9()", +"9f242bf5": "NUTScoin()", +"9f245957": "totalDiscountedItemsForSale()", +"9f275dec": "investBalanceOf(address)", +"9f2763d2": "newPurchase(string)", +"9f28f7c4": "toSCL(uint256)", +"9f28f8c2": "changeWhitelistedAddressCapAmount(address,uint256)", +"9f296b62": "getPaymentTotal(address)", +"9f29e1a1": "thisContractTokenBalance()", +"9f2a1471": "erc820Registry()", +"9f2a6374": "platformWalletAddress()", +"9f2b03b6": "LAB()", +"9f2b22c7": "CanYaCoin()", +"9f2bbcfd": "LoggerAuthorized(address)", +"9f2bc32b": "preITO()", +"9f2c1fd8": "ERC20(uint256,string,uint8,string)", +"9f2c9503": "mintAndLock(address,uint256)", +"9f2ccbcc": "buyAnimalsFromAnimalFactory(string,string)", +"9f2ce678": "vote(bytes32,bool)", +"9f2e0f9c": "managePlayer(address,uint256)", +"9f2e7ce3": "prevXRPCToken()", +"9f2eaf4e": "verifyCanWithdraw(address,address,uint256)", +"9f2ee8b8": "getBlocksByOwner(uint256,uint256,address)", +"9f2f077c": "totalTransformedTokens()", +"9f2f58ec": "void_race()", +"9f2ff221": "teama()", +"9f2ffaff": "_0xGoldToken()", +"9f30ca9a": "getOpenBidsByBidder(bytes32,address)", +"9f318ae8": "HKHCToken(address,uint256)", +"9f31de2e": "updateTokensForCloudexchangeTeam(uint256)", +"9f327124": "ReflexCoin()", +"9f329b15": "SpareCurrencyToken()", +"9f334696": "isNumRed(uint8)", +"9f337cce": "_createTeam(string,address,uint256)", +"9f33d9cb": "joinAsBuyer()", +"9f34ab0c": "PXGToken()", +"9f34ce14": "activateConflictResolution()", +"9f351fc0": "totalRedeemedCheque()", +"9f35910c": "getTeamOwner(uint32)", +"9f35caee": "getAllChainIDsOfUser(address)", +"9f35d3b2": "start(string,string,uint256,uint256,uint256,uint256)", +"9f37092a": "buyItem(address,uint256)", +"9f373a7a": "updateCandidate(address,string,string,uint256)", +"9f37b53f": "verificationSlashingPeriod()", +"9f396cff": "voteAgainst()", +"9f3c4416": "claimInheritance()", +"9f3ce55a": "sendMessage(address,uint256,bytes)", +"9f3d7b0b": "addProposal(address,uint256)", +"9f3e1846": "EscobarcoinToken()", +"9f3edbe1": "emissionStatusUpdate(bool)", +"9f3ef430": "payTokenHolderBasedOnTokenCount(address,uint256)", +"9f3f736a": "LIMITED_ADMIN()", +"9f3fab58": "a(bytes32)", +"9f3ff73a": "setExternalCurrencyProcessor(address)", +"9f403a3d": "addProfit(address,address,uint256)", +"9f406c8b": "isPreICOFinished()", +"9f408251": "TaTaTu()", +"9f4085fd": "setAddressKYC(address,address)", +"9f4216e8": "userList(uint256)", +"9f4283fa": "jdaleveridgesyscoin()", +"9f43daf7": "sendEthTweet(string)", +"9f43ddd2": "expirationTimestamp()", +"9f4478a2": "modifyRate(uint256)", +"9f44b34c": "EXT_COMPANY_TWO()", +"9f44fa19": "FeedbackUpdated(uint256,uint8,bytes32)", +"9f454f2b": "LEU(address,uint256)", +"9f45b45c": "getModuleByName(uint8,bytes32)", +"9f45c8ec": "nodeCheck(bytes32)", +"9f45f982": "PATH(uint256)", +"9f489e4e": "getDeposit(uint256,address)", +"9f494565": "LogMint(address,uint256)", +"9f49cefb": "addStage(uint256,uint256)", +"9f4aaaef": "asmName(address)", +"9f4ba0ee": "setInitialPrice(uint256)", +"9f4cd0ef": "current_item_index()", +"9f4e8405": "updatePaymentManager(address)", +"9f4f4808": "setCrowdfundAddress(address)", +"9f4f903e": "TicketToken()", +"9f4f9886": "getRateAt(uint256,uint256)", +"9f4fae14": "getAmountWeeklybyNum(uint32,uint8[4])", +"9f509ab1": "FUNDING_PRESALE_MAX()", +"9f5185b6": "EventCashOut(address,uint256)", +"9f51cf67": "balance_available_for_custom_voting()", +"9f5215dd": "availSupply()", +"9f5227c2": "confirmWithdrawal(address,string,uint256,string,address)", +"9f52b74e": "apt()", +"9f52f381": "startAllocation()", +"9f530cc9": "JACKPOT_CHANCE()", +"9f535821": "mint(uint256,uint256,string,uint8,bytes32,bytes32)", +"9f536edd": "setScore(address)", +"9f53e07b": "channelMaxSize()", +"9f544434": "sendFood(address,uint256)", +"9f548613": "MyUserToken(uint256,string,string)", +"9f549015": "Max_Mintable()", +"9f54c01c": "addProducer(bytes32,uint256,bytes1)", +"9f54c24f": "LogGive(address,uint256,string)", +"9f550293": "getTotalRaised()", +"9f55857d": "testBazMethod(uint32,bool)", +"9f55ecab": "currentVotingDate()", +"9f569ab4": "requestOfTime(address,uint256)", +"9f569e66": "sendTokensTo(address[],uint256[])", +"9f572048": "getCanvasByOwner(address)", +"9f5755ae": "announcement()", +"9f577c15": "setContractProvider(address)", +"9f57d16e": "getCurrentJackpot()", +"9f5892a7": "hash(string,uint256,uint256,address)", +"9f58d881": "executeOr(bytes32,bool)", +"9f591fa5": "deathData_v15()", +"9f59fc5a": "GetConsentDirectives()", +"9f5a5ff8": "Police_4()", +"9f5a851f": "configure(uint256,uint256,uint256,uint256,uint8,address)", +"9f5a9b7c": "getTotalBurnt()", +"9f5ac8f7": "creator(bytes32)", +"9f5b1d2c": "GITHUB_LINK()", +"9f5bd866": "setNodalblockURL(string)", +"9f5c11c4": "two_card()", +"9f5c671e": "MultipleErrorsContract()", +"9f5ce849": "CNT_Token()", +"9f5cfe03": "roundsCount()", +"9f5f0520": "myVault()", +"9f5f0826": "_bonusToPartners(uint256)", +"9f5f7c7f": "tokenSplit(address,address,address,uint256)", +"9f5ff50a": "calcTokens(uint256,uint256,uint256)", +"9f614b61": "addTitleTransfer(string,string,string)", +"9f6163ee": "lastBlock_v4()", +"9f621075": "ICO_AllowPayment()", +"9f624701": "DZONetwork()", +"9f6264d3": "setArray(bytes32,bytes32[])", +"9f62e202": "CrowdSale_AssignOwnership(address)", +"9f637851": "endICODate()", +"9f63f5c3": "approveLoan(address,uint256)", +"9f64b6fb": "sendAffiliateValue(uint256,address)", +"9f654dd2": "sellTokensIco()", +"9f659296": "createCardForAcquiredPlayers(uint256[],address)", +"9f65f242": "Itube()", +"9f665e1a": "offerAccepted(address,uint256)", +"9f668bba": "getGameIds()", +"9f674147": "accruedBonus(uint256,uint256)", +"9f674eb3": "myAccessLevel()", +"9f678cca": "drip()", +"9f6822b4": "startEscrow(bytes20,address,uint256)", +"9f684a0d": "disableATMExchange()", +"9f69b5a0": "updateEscrow(uint64,uint256,uint256)", +"9f6a4fbe": "CyteCoinERC20Token()", +"9f6b4cce": "BetPlaced(address,uint8,uint256)", +"9f6bd2a9": "isArbitrator(address)", +"9f6c20f6": "MRC(uint256,string,string)", +"9f6c3dbd": "join(address,address,uint256)", +"9f6dcd9d": "ETHtoZCOrate()", +"9f6e3456": "SOPHIYA()", +"9f6e4bb5": "weiAllowedToReceive(uint256,address)", +"9f6f99ee": "updateAPIPublicKey(bytes)", +"9f6fb2ba": "createRichContract(string)", +"9f6ff2e1": "EInvoicingRegistry()", +"9f70c3dc": "doWithdraw(address,address,uint256)", +"9f70db12": "removeEmployee(address,address)", +"9f727c27": "reclaimEther()", +"9f73bef1": "getSubjectsCount()", +"9f73dbc0": "getCurrTeamSizes()", +"9f7496ec": "_firstUnlockAmmount()", +"9f753df6": "MELON_BASE_UNIT()", +"9f75ccc8": "onSuccess()", +"9f75e990": "ReceivedCall()", +"9f7623b8": "sign(address,address)", +"9f769807": "setTokenState(address)", +"9f77920c": "Revoke(address)", +"9f789a0c": "setSchellingRoundDetails(uint256,uint256,uint256)", +"9f7904af": "available_with_bonus()", +"9f7a2ef5": "TEAMmint()", +"9f7a53a1": "sendBountyBalance(address,uint256)", +"9f7b0fc8": "getParent(address,uint256)", +"9f7b4579": "create(uint256,uint256)", +"9f7b967e": "SampleERC677Token(address,uint256)", +"9f7ba828": "getTokenToEthMakerOrderIds(address)", +"9f7c8851": "otherSupply()", +"9f7c94aa": "payoutWinners()", +"9f7d9f62": "deprecateDefenceSubtype(uint8)", +"9f7d9f92": "AggiungiMiner(address,bool)", +"9f7e03cc": "deposit70Percent()", +"9f7e1fed": "Lock(bytes)", +"9f7ed5b8": "startTimeTLP1()", +"9f7f0784": "appVersionListAt(bytes32,uint256)", +"9f7f2bd1": "createDog(uint256,address)", +"9f7f760c": "SimpleDice()", +"9f7ff381": "COMPLETION_STATUS()", +"9f8049ea": "distributeELTCLarge(address[])", +"9f807962": "buyMorties()", +"9f80d1b2": "presaleGoing()", +"9f810510": "ZONTEX()", +"9f8106cf": "transferAllUnsoldTokens(address)", +"9f819b13": "updateFunders(address,bytes32,string)", +"9f81c4d6": "bitcoingo()", +"9f83008a": "teamReserveWallet()", +"9f839d22": "getOptionPair(address,uint256,address,uint256,uint256)", +"9f853717": "duplicates(uint256)", +"9f855bd5": "shipLocation(uint16,uint16,address)", +"9f856de5": "doPurchase()", +"9f871242": "computeTokenAmount(uint256)", +"9f8743f7": "getRound()", +"9f87acd0": "exec(bytes32,bytes32,uint256)", +"9f87f419": "closeTierAddition()", +"9f881e0b": "MobSquads()", +"9f881f46": "checkPassed(address)", +"9f8970dd": "bountyTokensAccount()", +"9f8a13d7": "isActive(address)", +"9f8abede": "fixPermission(address,address,uint8,bool)", +"9f8adeb8": "givecandyto()", +"9f8ae5d3": "roundFourTime()", +"9f8aef2b": "ERC721Token(string,string)", +"9f8c45cf": "getQuestionDetails(uint256)", +"9f8c7c4c": "insertSums(uint256)", +"9f8e8209": "Cillionaire()", +"9f8f0dc3": "test_twoValidEqBool()", +"9f8f4c45": "developerPctX10()", +"9f8f4fb5": "withdrawAcquisitionsToken()", +"9f8f9b8e": "SetEvaluate(uint256[],uint8,uint64[])", +"9f8ff91d": "getSponsorFee()", +"9f90279e": "f_priv()", +"9f903ff6": "setEmitter(address)", +"9f90688a": "SmartCityToken(address,uint256)", +"9f912d25": "abort(uint16)", +"9f915aca": "Tier_Starter()", +"9f91d145": "draftNewCardWithReferrer(address)", +"9f923388": "secondStageTokensSold()", +"9f9248c7": "DepositInterest(uint256,address,uint256,uint256)", +"9f927be7": "getNextCall(uint256)", +"9f941f69": "getDesignatedReportingEndTime()", +"9f943039": "Ethershares()", +"9f94d684": "irreducibleOf(address)", +"9f94fb7a": "endAtkBoss()", +"9f95de64": "transferToGrant(uint256,uint256)", +"9f961c5a": "salesPipe()", +"9f963c4e": "periodPercent()", +"9f96de0f": "getResourceCount()", +"9f9727ce": "QuotaManager(address)", +"9f977b21": "getBob(uint256)", +"9f97a024": "testEscapedQuoteInString()", +"9f97d937": "start_declaration()", +"9f97fdbb": "setDonationReceiver(address)", +"9f9827fa": "adviserPart()", +"9f98985d": "endGame(uint256,uint256)", +"9f98a45a": "fillOptionOrder(address[3],uint256[3],uint256[2],address,bool,uint96,uint8,bytes32[2])", +"9f98df30": "give(address[],uint256)", +"9f98e0f3": "addMerchant(address,string,string)", +"9f9936e7": "BullToken()", +"9f9938fa": "SILALAHI()", +"9f9a9b63": "getCategoryLength(bytes4)", +"9f9a9b7d": "NDUXBase()", +"9f9ae633": "LademiA()", +"9f9b1048": "holderExists(address)", +"9f9b3d98": "softcap2Reached()", +"9f9b4c9d": "Unhalted(uint256)", +"9f9ea29d": "decodeLock(bytes)", +"9f9eac67": "ChangeName(string)", +"9f9f1fbe": "getRegionTax(uint16)", +"9f9f83dd": "remainingIssuableSynths(address,bytes4)", +"9f9fb968": "getDeposit(uint256)", +"9f9fe6bb": "acceptProvider(address)", +"9fa0f763": "buyDrugs()", +"9fa0fc4c": "pgoVault()", +"9fa2526f": "offline()", +"9fa45fa6": "sellMyStake()", +"9fa46754": "releaseBonus(address,uint256)", +"9fa4b6cb": "BetDex()", +"9fa50ab2": "voteDescription()", +"9fa5adca": "buyP3D(uint256)", +"9fa5df9c": "decreaseAllowed(address,uint256)", +"9fa5e5d5": "setARKowner(address)", +"9fa6a6e3": "current()", +"9fa6f886": "NewParticipant(address,uint256,uint256,uint256)", +"9fa778d8": "UECToken()", +"9fa77b20": "reserveOf(address)", +"9fa80c6e": "rewardDistributionEnd()", +"9fa8e5a0": "SetEvaluate(uint32,uint8,uint64)", +"9fa92f9d": "home()", +"9fa9440c": "BDAYSALE()", +"9fa9559c": "getLastYearOfInflation()", +"9fa95bfe": "_emitJobPosted(uint256,address,uint256,uint256,uint256,bytes32,bool)", +"9fa987d5": "curPosition()", +"9fa9b04c": "ADVISOR_ONE()", +"9faa3c91": "beta()", +"9fab63c7": "ICOBIDToken()", +"9fabf4da": "remainigTokens()", +"9fac68cb": "burn(uint256,bool)", +"9fac6ddc": "withdrawLeftoverWei()", +"9fac9abf": "icoHasEnded()", +"9faceee4": "MemeToken()", +"9fad2dcb": "setTaxInBps(uint256)", +"9fae8fd8": "GayBananaToken()", +"9faea9c6": "setUnavailableFlat()", +"9faec3c9": "adminWithdraw(address,uint256,address,address,bool,uint256,uint8,bytes32,bytes32,uint256)", +"9faec927": "withdrawChunk()", +"9faefe0c": "sendNow(uint256)", +"9faf52ee": "teamTwoVolume()", +"9faf6fb6": "removeAddress(bytes32)", +"9faf7000": "manualSend(address,uint256)", +"9fafcf72": "PersonaRegistry(address)", +"9fb03244": "softcapMainSale()", +"9fb03c7f": "countLayersGasLimit(uint256)", +"9fb14d9b": "getRemainingBytesTrailingZs(uint256,bytes)", +"9fb1b5fb": "setJackpotGuaranteed(uint256)", +"9fb25d9e": "LeaderMessage()", +"9fb31475": "refundable(bytes32)", +"9fb3b7dc": "_setWeights(uint256[])", +"9fb3d489": "cancelProposalByCreator(uint256)", +"9fb42b1f": "numRequests()", +"9fb4c63d": "assertEq21(bytes21,bytes21)", +"9fb4d1b0": "_getDepth(uint256)", +"9fb52b6e": "dividendsGetPaid(uint256)", +"9fb5bdb9": "registerAsSeller(address,string,string,string,string)", +"9fb632c1": "private_withdrawBankFunds(address,uint256)", +"9fb65754": "FishProxy(address,address)", +"9fb65968": "presaleTokensDistributed()", +"9fb69839": "getTransactionInformation(uint256)", +"9fb6c796": "mint(bytes32,uint256,string)", +"9fb755d7": "setHotWallet(address)", +"9fb8657b": "getNodes(string)", +"9fb876c0": "getAllOwnersClaimPriceOfCard(address)", +"9fb8dd1a": "getBaseLockPercent()", +"9fb95205": "getWithdrawSum()", +"9fba2578": "summaryData(address)", +"9fbc6a1a": "EtherHellHydrant()", +"9fbdcef0": "setauctionotherfree(uint256)", +"9fbf538f": "addApprovedBattle(address)", +"9fc04ce2": "setMaxReferrerTokens(uint256)", +"9fc18031": "getNodesBatch(bytes32,bytes32)", +"9fc18d4b": "migrateDisabled()", +"9fc1d0e7": "forcedTransfer(address,address,uint256)", +"9fc1ff30": "InooviToken()", +"9fc20f60": "priceForSaleAdvertisement()", +"9fc21eeb": "wdrawBfr()", +"9fc23a74": "totalContractsAvailable()", +"9fc3587a": "releaseSupply(uint256)", +"9fc39549": "removeInvestorList(address[])", +"9fc3b4e7": "checkQuorum(uint256)", +"9fc3e53a": "controlstampdissolution(bool,uint256)", +"9fc53f30": "getIdByHash(bytes32)", +"9fc5852e": "BytePeachCoin()", +"9fc5ce2a": "initialMint()", +"9fc6ceac": "SponsorsQty()", +"9fc6d585": "percentageRecipient2()", +"9fc71314": "KontolToken()", +"9fc71b31": "transferToken(uint256)", +"9fc75354": "isMasternodeOwner(address)", +"9fc7a200": "startNumber()", +"9fc880f4": "weiRaisedAfterDiscounts()", +"9fc89294": "productTypes(uint8)", +"9fc8ed76": "serviceAtIndex(uint256)", +"9fc9141d": "calculateHash(bytes8,uint256,uint32)", +"9fc91980": "JoailyToken(uint256,string,string)", +"9fc9278e": "returnAnyERC20Token(address,address,uint256)", +"9fc9ceb8": "HRWtoken(uint256,string,uint8,string,address)", +"9fc9d6c0": "FrannickToken()", +"9fcaa5ef": "extendMembership(uint256)", +"9fcb114c": "addSomeTokens(uint256)", +"9fcb29fc": "_assign(address,address,uint256)", +"9fcb7100": "approveAndCall(address,int256,bytes)", +"9fcbc6f1": "bitvimToken()", +"9fcbc738": "setIntermediate(address)", +"9fcc4767": "set_referral_fee(uint8)", +"9fcdec61": "buyPresale()", +"9fce2d80": "didCommit(bytes32,address)", +"9fce5c8e": "indexOf(address[],address)", +"9fce89a4": "intercrypto_recoverable()", +"9fcf11bb": "determineCurrentStage()", +"9fcf4115": "updateRoundEndTime(uint256)", +"9fcf89ee": "lastBlock_a13Hash_uint256()", +"9fd033ed": "isHolder(address,address)", +"9fd03ed8": "XENIA()", +"9fd0506d": "pauser()", +"9fd1bd1f": "changeSelfAddress(address)", +"9fd1e7f6": "purchaseTokensERC20(uint256)", +"9fd3ad34": "setFunds(address,uint256)", +"9fd4da40": "totalInitialSupply()", +"9fd4f7d1": "replaceWizard(address)", +"9fd52984": "burnAfterSoldAmount()", +"9fd547fb": "PayeeWithdrawCapital(address,uint256)", +"9fd55832": "BrancheProportionalCrowdsale(uint256,uint256)", +"9fd58182": "withdrawManagerIncome(bytes32)", +"9fd64fea": "findAuditor(address)", +"9fd6adb3": "unVote(uint256)", +"9fd6d285": "AirdropMined(address,uint256)", +"9fd6db12": "mintingEnabled()", +"9fd7ca8a": "getCurrentTrancheIdx(uint256)", +"9fd859ee": "disablePreminer(address,address,address)", +"9fd8914d": "GameAAAToken()", +"9fd8b4f1": "redirectToPurchase()", +"9fd8bfb3": "voteCandidateOne()", +"9fd8c361": "CHECKgamberOne()", +"9fda3675": "MYYG()", +"9fda5ad2": "confirmedTimesByOwners()", +"9fda6271": "setElectionInfo(uint256,uint256,uint256)", +"9fdb35e7": "retriggerDrawOnOraclizeError()", +"9fdc0ea6": "getDirectoryLength()", +"9fdc3255": "_permittedPartnerTranferValue(address,uint256)", +"9fdc4d13": "isBuyable(string)", +"9fdc53b1": "registerLoanReplace(address,uint256)", +"9fdd32cd": "_drawFailure(uint32,uint8,string)", +"9fdd983f": "setAmount(uint256,uint256,uint256,uint256)", +"9fddd5a7": "SeedTestToken()", +"9fde4ef8": "winningOption()", +"9fdeeb5e": "teamVestingContractAddress()", +"9fdf057f": "setMiningToken(address)", +"9fdf9625": "seizeForWork(address,address,uint256,bool)", +"9fe005e8": "horseShoeNotForSale(uint256)", +"9fe03c59": "PayForPrivKey(address)", +"9fe14580": "BONUS_TIER_1_LIMIT()", +"9fe17cc2": "icoContractAddress()", +"9fe21fc4": "depositAndInitiate(uint256,bytes32,address,uint256)", +"9fe304a0": "catch_the_thief(address)", +"9fe34d9f": "isAllowedUser(address)", +"9fe39d85": "CHINESE_EXCHANGE_1()", +"9fe4712d": "schedule(address,bytes,uint256[8],uint256)", +"9fe4b663": "buyTokensInternal(address,uint256,string)", +"9fe5e868": "NewWallets(address,address)", +"9fe634b9": "getReleaseAuctionEndTime(uint256)", +"9fe6999a": "tokensFor1EthP5()", +"9fe72acd": "airDropsClaimed()", +"9fe7ac12": "removeBool(bytes32)", +"9fe7ba47": "updateFirstUnionIds(bytes32,bytes32)", +"9fe802f1": "transferEx(address,uint256)", +"9fe81f52": "changeTimeLimitMinutes(uint256)", +"9fe93231": "ICOEndedSuccessfuly(uint256,uint256)", +"9fe9bde0": "tripleRoomMin()", +"9fe9f623": "setTransferEnabled(bool)", +"9fe9fc1a": "SoldBlock(uint256,uint256,uint256,uint256,uint256,address)", +"9feb8d23": "amendClaim(uint8,uint8,uint8)", +"9fec4ac4": "SputnikPresale(address)", +"9fec8e3b": "addToWhiteListMultiple(address[])", +"9fec8e96": "claimedAmounts(address,address,uint256,address)", +"9fecb69f": "finishGame()", +"9fecf214": "XChain(uint256,string,string)", +"9fed35a6": "createBulkContributions(address[],uint256[])", +"9fed39c5": "numWhitelistedInvestors()", +"9feda172": "totalRice()", +"9fedb749": "setTeam(uint256,string)", +"9fee14ae": "getAllot(bytes32,uint8,uint8)", +"9fee597b": "extractEther()", +"9fef0ae1": "BetherFund()", +"9fef26ce": "buyTokens(address,uint256,string)", +"9fef93f8": "buyKey(uint256)", +"9ff00adc": "betOnOddEven(bool)", +"9ff031ce": "createEscrow(uint256,uint256,uint256,address,address)", +"9ff12bba": "removeContractMiniGame(address)", +"9ff1b56f": "lockInTime2()", +"9ff25fa4": "InitialDateChange(uint256,uint256)", +"9ff32b18": "grantAllowanceProxyAccess(address)", +"9ff33fd1": "getByInternalId(uint256)", +"9ff34878": "IPTVcontract()", +"9ff3487f": "ConsumerRemoval(address)", +"9ff36b54": "isClientPayed(uint256,address)", +"9ff390c1": "currentTotalBuyin()", +"9ff394a8": "goShort()", +"9ff4125a": "ICOendTime()", +"9ff47485": "isBetPossible()", +"9ff512fa": "getTransactionDetail(uint256)", +"9ff61487": "myBackerToken()", +"9ff652cb": "setToContractAddr(address)", +"9ff71ccb": "modifyCategory(uint256,string,string)", +"9ff7422d": "SurgeTestToken()", +"9ff7971b": "setWeiPerToken(uint256)", +"9ff8c63f": "issueMaxSynths(bytes4)", +"9ff9007d": "lastweek_winner1()", +"9ff93088": "settleGame(uint256,uint256)", +"9ffa0711": "CashOut(uint256)", +"9ffa43ce": "buyFST(address)", +"9ffaf32e": "resourceDelete(address,bytes4)", +"9ffb2ed5": "showRewards(address)", +"9ffbb57f": "SongTokenAdded(address,bool)", +"9ffc981f": "getDepositOwner(address)", +"9ffcc4c3": "getPayoutCumulativeInterval()", +"9ffd1c10": "TrueFlipICO(address,address,address,address,address,uint256)", +"9ffdb65a": "validateName(string)", +"9ffea547": "_purchaseOneUnitInStock(uint256)", +"9fff19ef": "_setValidatorWrotePart(uint256,address)", +"9fff37e0": "JACKPOT_SIZE()", +"a000812c": "Y1_lockedTokenReleaseTime()", +"a000aeb7": "weiReceived()", +"a0013419": "ShanxiCoin()", +"a001ecdd": "feePercentage()", +"a001ef87": "TestOneToken(string,uint8,string)", +"a00223ec": "_recordFirstClaimTimestamp(uint256)", +"a002b179": "getCandidateForApoderado(bytes32)", +"a003371e": "PreICOEarlyDays()", +"a003651d": "getNumberOfChoices(bytes32)", +"a0041286": "changeURL(string)", +"a00413bd": "resetReportTimestamp()", +"a004737a": "startPrePreIco(uint256)", +"a004ee5a": "isCustodianOf(address,address)", +"a00545b2": "claimPrize(address,uint16)", +"a00553a5": "WinnerIndex(uint256)", +"a005b87b": "NullMapTest()", +"a006b0e2": "_regName(bytes32)", +"a006e0e5": "phaseTwoLimit()", +"a0071552": "sellItem(uint256,uint256,uint256,uint256)", +"a007bc45": "getRateStages(uint256)", +"a008d288": "Pethreon(uint256)", +"a008d893": "isReferee(address)", +"a008f5eb": "_isNativeToErcBridge(address)", +"a0099b60": "deltaEFunc(uint256,uint256,uint256,uint256,uint256,uint256)", +"a00a3440": "mainSale1Limit()", +"a00a7a6d": "determineNewRoundMostInviter(uint256,uint256)", +"a00aede9": "scheduleCall(uint256,address)", +"a00afaa0": "ADMIN_GET_FEE()", +"a00b043e": "bonusTokenVault()", +"a00b603c": "getDNI()", +"a00c0a28": "Log2(string,uint256,uint256)", +"a00c3e72": "ExtendLife()", +"a00c9374": "afterSaleMinting(uint256)", +"a00ce377": "getIsContractValid()", +"a00ce6a5": "mintForReportingParticipant(address,uint256)", +"a00d7740": "setCUSDAddress(address)", +"a00d7b27": "myFirstHelloWorld()", +"a00dc9dd": "changesp1(address)", +"a00ddad1": "verifyBalance(address)", +"a00ec993": "setStarRate(uint256)", +"a00ee946": "existAccount(uint256)", +"a00f198a": "confirmOrder()", +"a00f64d6": "_soldOutsidePMZ()", +"a00f77e1": "getMemInvestor(address)", +"a00fd3c8": "register(uint256,string)", +"a00fd7c8": "getPayOut()", +"a00fe86b": "SaleAborted(uint256)", +"a00fff6f": "pendingManager()", +"a0109c9f": "incrementFee()", +"a0111086": "ParentFee()", +"a0113f18": "isCrowdsaleFull(address,bytes32)", +"a0129b00": "redeemSurplusETH()", +"a01317cb": "BlockHipo()", +"a0132df2": "validationTime(address)", +"a0135b2b": "updatefee(uint256)", +"a0135d04": "seSigner(address)", +"a013ab77": "isBuilt(uint256)", +"a013ad54": "BONUS_DURATION()", +"a013e4d0": "GouShiTokenFunc()", +"a014b9bd": "addReferralOf(address,address)", +"a015cb10": "claimOwnerEth(uint256)", +"a01701dc": "capPerAddress()", +"a01729a4": "communityCliff()", +"a0175360": "Approval(address,address,address,uint256)", +"a0175b96": "changeAllCosigners(uint256,address[],uint256[3],bytes,bytes,bytes)", +"a0179949": "feeAccount1()", +"a017ed35": "G12Coin(uint256,string,uint8,string)", +"a0187f91": "DataExternalValidation(address)", +"a0189345": "outOfLimitAmount()", +"a018f2b2": "delegateProxyAssert(address,bytes)", +"a0193ff9": "allowed_contract()", +"a01a3a07": "LogTicket(uint256,address,uint256)", +"a01a478c": "getEnemyCombinationOfAddress(address,address)", +"a01a4cfa": "getMyInstancesOfAPackage(uint256)", +"a01b0c27": "getRegisteredContract(uint256,uint256)", +"a01bc729": "monster_attack(uint256)", +"a01bc8f6": "setdaily(uint256,uint256)", +"a01bfa79": "adminWithdrawBCEOPreSale()", +"a01c144e": "addPriceChange(uint256,uint256)", +"a01c489d": "setMaxFeeTrade(uint256)", +"a01c62f7": "isTransferLocked()", +"a01cb43d": "WithdrawFee(uint256)", +"a01de7ae": "BFToken()", +"a01e1a21": "setPendingReserveData(address,uint256,address)", +"a01e5490": "isUnconfirmedGblock(bytes32)", +"a01eacc2": "Aerosyn()", +"a01fdbef": "approvePullRequest(bytes32)", +"a0214c1c": "mintClose()", +"a02172d3": "getAssData(uint256)", +"a0218b66": "getAccountAmount(uint256)", +"a021d76d": "deleteIssuer(uint256)", +"a022ac81": "test3Args()", +"a022c15e": "getTaskReward(bytes32)", +"a022da29": "increaseLoanOnBehalfOfRecurse(address,address,bytes32,uint256,uint256)", +"a022e283": "APOLLOCOIN_COMPANY_AMOUNT()", +"a0234a91": "supplyLockedA()", +"a023d4a7": "Redicon()", +"a023e7d3": "updateTrustRankAfterStoryExpiry(bytes12)", +"a023ea47": "burnAdminTokens()", +"a024284d": "participantsForCustomSale(uint256,address)", +"a024ea16": "MAX_BOUNTY_ALLOCATED_TOKENS()", +"a025bcc3": "calculateFee(bool,bool,uint256,uint256)", +"a026348c": "pitboss()", +"a0263a5a": "addgodaddress(address,address)", +"a0268aea": "fcomToken()", +"a026946d": "ieth()", +"a026d7c4": "SunflowerToken()", +"a026da8c": "teamClaim(uint256)", +"a0270dbc": "resolve(uint8)", +"a02745af": "setarg_2_input(uint256)", +"a0275c05": "appendStock(uint256)", +"a02853ef": "BitcoinExchange()", +"a028554e": "setInitialMintingPowerOf(uint256)", +"a0285c01": "initiateChange(bytes32,address[])", +"a028aa1b": "distributeVariable(address[],uint256[])", +"a028d749": "caculateFee(address,uint256,uint8)", +"a028e63c": "setName(uint256,bytes32,bytes32)", +"a02a338a": "tokensPerOneETH()", +"a02a34cd": "skinOfAccountById(address,uint256)", +"a02b114c": "setArray(bytes32,address[])", +"a02b161e": "unregister(uint256)", +"a02b1a51": "getPaid(bytes32)", +"a02b7fbe": "MANAGEMENT_TEAM_SUPPLY_LIMIT()", +"a02b9aac": "getPaymentDataByAddress(address)", +"a02c40e1": "qbxSourceToken()", +"a02c4b97": "holdAddress5()", +"a02c5279": "testIntegerKeyValue()", +"a02cf937": "feePct()", +"a02d2376": "SubContract()", +"a02e98df": "getAdd(bytes32)", +"a0305398": "getOtherMapValue(uint256)", +"a030b8e6": "restartsys()", +"a03189b3": "devPayed()", +"a03243cf": "getMinimumTribute()", +"a0326040": "weekPot()", +"a0326fae": "_removeFromList(address,uint256)", +"a033fcd4": "collectFees(address,uint256)", +"a0340625": "unfrozen()", +"a03435d1": "authorizerAddress()", +"a0345fca": "finalize(bytes)", +"a034b6cb": "vote(uint256,uint256,uint256,string)", +"a0354921": "setSTMPPrice(uint256)", +"a0355eca": "setTime(uint256,uint256)", +"a0355f4e": "decline(uint256)", +"a035b1fe": "price()", +"a036f0f8": "getUsableXPA(address)", +"a0376dfe": "getAskByUserID(uint32)", +"a0378730": "addReceivers(address[],uint256[])", +"a0385e1c": "superTransferFrom(address,address,uint256)", +"a038af35": "GetChallengeBetsInformation(uint256)", +"a0392897": "_decreaseApproval(address,address,uint256)", +"a039e3c7": "testSetNotTransferable()", +"a03b1ea9": "_getFee(uint256,uint256)", +"a03b66e5": "ZilleriumPresale()", +"a03c5832": "getPermissionParam(address,address,bytes32,uint256)", +"a03cc0b2": "setExchangeToken(address)", +"a03d0f06": "lockAccount(address,bool)", +"a03df051": "rentedLand()", +"a03eb806": "recoverAddressFromSignature(bytes32,uint256,address,address,uint256,address,address,uint256,bytes)", +"a03f254f": "getWebsocketUri()", +"a03f633a": "resetListing(bytes32)", +"a03fa7e3": "transferTo(address)", +"a03fb4c0": "makeTradeable()", +"a0417c9a": "updateAsset(uint256,string,uint256,uint256)", +"a0422d02": "COLOR_NOT_AVAILABLE()", +"a0422d31": "getApiById(uint256)", +"a0426fb2": "preSaleEnded()", +"a0428bbc": "balancesStaticoin(address)", +"a042b9c1": "newComment(bytes32,bytes32,string)", +"a04369f8": "addBoosterQuest(address)", +"a0437f63": "rewardBounty(address,uint256)", +"a043bb16": "tokensBoughtInBonusProgram()", +"a0440426": "purchaseProduct(uint256,uint256)", +"a044b070": "a(address,uint256)", +"a0452bfb": "dividendFee_()", +"a045fdff": "scheduleCall(address,bytes)", +"a0469b02": "inputToDigit(uint256)", +"a046c5f6": "NewStaticAdr(address)", +"a0472d6c": "blocksInADay()", +"a0489ac2": "draining()", +"a0493834": "unconfirmedSum()", +"a04a0908": "execute(address,bytes,uint256)", +"a04a59cc": "randMod()", +"a04a6ac8": "auctionEndPrice()", +"a04a7b1f": "getPoolMinStakeQspWei(uint256)", +"a04a85c0": "checkFrozen(address)", +"a04b3c2d": "mine_jade_ex(uint256)", +"a04bd02f": "getIsStartable(uint256)", +"a04cc350": "_addDefaultOperatorByTranche(bytes32,address)", +"a04ce2c5": "setArrayIndexValue(bytes32,uint256,uint256)", +"a04d4c60": "getDataColla_001_001(string)", +"a04da725": "SEXNToken()", +"a04e34bc": "weiAllowedToReceive(uint256,uint256,uint256,uint256)", +"a04f7bd1": "MMONToken()", +"a04fce5b": "MINDBODYToken()", +"a050975b": "requestReclaimContract(address)", +"a050d07d": "getNumWizards()", +"a05190f4": "BOT_ELEMENT_2()", +"a051b6b1": "phase_5_rate()", +"a052c595": "addTrustedPartner(address,string,string)", +"a052eae4": "writeStuff(uint256,int256,uint256)", +"a052f024": "addDonator(address)", +"a053ce1f": "referralRate()", +"a053eb9d": "OPERATION_STAKE()", +"a0548d2f": "redistributeLosingReputation()", +"a054cbea": "isPlatform()", +"a054d3ef": "checkWithdrawal(address,uint256,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"a0557818": "getSireId(uint256)", +"a055d455": "run(uint40,uint256,address)", +"a055fe64": "_projectCommitNew(address)", +"a056469a": "extractFeeLength()", +"a0566330": "LJCJ()", +"a05693c6": "clearSmet()", +"a0572fda": "titleIds(uint256)", +"a0577762": "changeTechAccountAddress(address,address)", +"a0579801": "icoStoppedManually()", +"a057dade": "blackListUser(address,address)", +"a05801b7": "metadataOfTokenByIndex(uint256)", +"a05809ff": "calculateTotalPayoutAmount()", +"a058ce51": "DigiCash1()", +"a059ffa6": "createNewTourament(uint256[])", +"a05a1218": "triggerStealManually2(string)", +"a05a70a7": "QTLToken(address)", +"a05b8ed8": "_execute(bytes32)", +"a05bba46": "getAllDepositorsCount()", +"a05c47ca": "ico2Max()", +"a05c7bda": "AuthorizeToTransfer(address)", +"a05d03fd": "currentSale()", +"a05d068d": "foundationTokensVested()", +"a05e1db7": "getBuyerfee()", +"a05e3bb0": "setBasicBallotsPer30Days(uint256)", +"a05e822a": "howManyOwners()", +"a05fc749": "CoinLotto(address)", +"a05fccef": "transferMultiple(address[],uint256[])", +"a0605a79": "ZTTBToken(uint256,string,string,uint8)", +"a060d498": "KillSwitchEngaged(address)", +"a060ecce": "checkPosition1(address,address,uint256)", +"a0617ad0": "totalMaxSupply()", +"a061eba0": "proposeVersion(address)", +"a0626939": "setFoundersTokensReserve(uint256)", +"a06285ed": "CharityInProgressSupply()", +"a062d5fe": "TOTAL_SATOSHI()", +"a063dae8": "equal(int256[],int256[],string)", +"a0641288": "redeemableBalance(address)", +"a064481e": "BokkyPooBahWuzHere()", +"a065a2bf": "distributeFAITH(address[],uint256,uint256)", +"a0660943": "computeSlaves(address,address)", +"a067412b": "assignInitialAddresses(address[])", +"a0684251": "remainder()", +"a068e8d3": "convict(uint256,uint256,uint256,uint256)", +"a068edb5": "determineOutcome()", +"a0695f24": "assertBalances()", +"a0695fc2": "startIcoOne()", +"a06ac637": "listUserRecasts(address,uint256,bool)", +"a06aceb2": "ATCController()", +"a06b7eb0": "decreaseLockedAmount(address,uint256)", +"a06c5a24": "monthlyPrice()", +"a06caae8": "TransactionSettled(uint256,uint256,uint256)", +"a06cab79": "Registrar(address,bytes32)", +"a06ced75": "RESERVE_LOCK_TIME()", +"a06d083c": "credit()", +"a06db7dc": "gracePeriod()", +"a06dd6dc": "emergencyFlush()", +"a06de4d9": "rand8(uint256,uint8,uint8)", +"a06e09f1": "PrivateSale(address)", +"a06e58ac": "isResolvedForComplainant(uint256)", +"a06ef4f2": "icoAmountBonus3()", +"a0712c3d": "feesRateTeam()", +"a0712d68": "mint(uint256)", +"a07245fd": "getHtlcPaymentBlock(bytes32,bytes32)", +"a0726b72": "getPresaleRaisedAmount()", +"a072f02b": "idvRegistry()", +"a0742666": "isParticipant(address,address)", +"a074d5ee": "unClaimedEther()", +"a0759e14": "setEmontRewards(uint256,uint256)", +"a075e164": "setup(uint256,uint256,uint256,bool)", +"a076da7a": "notifyExecuteSellOrder(uint256,uint256)", +"a076e223": "Declaration()", +"a077321c": "restrictUntil()", +"a0775baf": "AUTBToken()", +"a0776a59": "getTokenSupply(string)", +"a07778ec": "icoBonus3EndDate()", +"a077b298": "restrictions()", +"a077c657": "giveRightVote(address)", +"a078f737": "hasUserRole(address,uint8)", +"a0790cb7": "setFreezed(address,bool)", +"a0796236": "rejectWithdrawal(address)", +"a07b206f": "totalWhiteListed()", +"a07b2461": "proveIt(address,string)", +"a07c132b": "setPrevOwner(address)", +"a07c4fcf": "getTapRemaining()", +"a07c765f": "END_TIMESTAMP()", +"a07c7ce4": "burnable()", +"a07c8ed9": "changeName(bytes,bytes)", +"a07c9156": "UpdateWhiteListImplementation(bool)", +"a07da887": "deploy(address,uint256,uint8,address,uint256[])", +"a07daa65": "newRequest(uint256)", +"a07ead73": "setColdWallet1(address)", +"a07f0a98": "DEFROST_AFTER_MONTHS()", +"a07f3a56": "isAttended(address)", +"a07f3bb0": "UpgradeableStandard23TokenMock(address,uint256,bytes32,bytes32,uint256)", +"a07f5f84": "beneficiary3()", +"a07f8f19": "isCrowdSaleFinished()", +"a07fc020": "moveToRST()", +"a080249b": "BonusPoolSupply()", +"a08038be": "setPreferredCurrency(bytes4)", +"a0807404": "setBZxOracle(address)", +"a080c8ba": "getLamboModel(uint256)", +"a081fc19": "deathData_f6()", +"a082022e": "Sell(address,address,uint256,uint256)", +"a0821be3": "availableBalance(address)", +"a0823111": "removeAffiliate(address,bytes32)", +"a08299f1": "divisionby0(uint256)", +"a082c86e": "DEADLINE()", +"a0831fdb": "BNBB(uint256,string,uint8,string)", +"a0836e28": "getaddressret(address,address)", +"a083cb48": "TokenBase(uint256,string,string)", +"a0844bb5": "_computeRarityBonus(uint256,uint256)", +"a0847a95": "updateRoundBalance(uint256)", +"a084af95": "Trust(address[],uint256,address,bytes)", +"a084ee76": "removeReturnAgent(address)", +"a0851928": "convert_valuation_to_art(uint256,uint256)", +"a0852bbd": "SynTokenAddress()", +"a0859845": "emitPreferredCurrencyChanged(address,bytes4)", +"a0876445": "artworkCount()", +"a0877304": "minSale()", +"a08783bf": "Moviecoin()", +"a087ac0c": "perDeadLine()", +"a087ae89": "calculatePeriodsCountAndNewTime(uint256,uint256)", +"a0893ef2": "releaseSupply()", +"a0895ec1": "LogUnfrozenTokens(string,address,uint256)", +"a089feea": "kill_switch()", +"a08aa298": "NewSupplyAdjuster(address)", +"a08b1447": "presaleAmountETH()", +"a08b3367": "EC()", +"a08c0908": "getFiatTransaction(string,uint256)", +"a08d3f83": "Etheropt(uint256,string,uint256,uint256,bytes32,address,int256[])", +"a08df770": "changeRecoveryFromRecovery(address)", +"a08e3f0e": "restTokensMoved()", +"a08e8b36": "totalFunctions()", +"a08ed1cb": "initUnstake()", +"a08f1b09": "getArrUintField2()", +"a08f8428": "BasicTokenWrapper(address)", +"a08fcabb": "setUint(bytes4,uint256)", +"a09037a9": "totalContracts()", +"a09107e1": "only6()", +"a0922e15": "calcTransferFee(uint256)", +"a0927a6a": "authorizedPayments(uint256)", +"a0929cda": "salvageTokensFromContract(address,address,uint256)", +"a092ae25": "getMyAllowance()", +"a094a031": "isReady()", +"a0954a49": "changeEarnings(uint256)", +"a09635b0": "_transferToICAP(uint256,bytes32,uint256,string,uint256)", +"a09686c4": "getRoundsCount()", +"a096ea1b": "bltRetainedAcc()", +"a0979332": "Bitcoineum()", +"a098a04b": "getRandomAnimalId()", +"a0996799": "getMyBulls()", +"a0997b66": "ROLE_RBAC_ADMIN()", +"a0999436": "ESOPAddress()", +"a099ad85": "workingState()", +"a099d079": "getEarlyIncomeByAddress(address)", +"a099e6be": "updateTokenExchangeRatio(uint256)", +"a09a05e0": "AllocateUnsoldTokens(address,address,uint256)", +"a09a1e22": "dealSellContract(uint256,string,uint256,uint256,string)", +"a09ae0aa": "absDiff(uint256,uint256)", +"a09b39ae": "WorldCup(string,string,uint256,uint256,string)", +"a09b7e2b": "totalPresaleBase()", +"a09cca93": "ownerTransferOwnership(address)", +"a09cec67": "_setData(uint256,uint256,uint256)", +"a09d4240": "UacCrowdsale(address,address,address,address,address,address,address,address[])", +"a09d4ae4": "returnTempTokens(address)", +"a09d9c09": "setTransferRate(address,int16)", +"a09ddd4f": "setSaleAgent(address,bool)", +"a09ddf4e": "getCurrentRgb(address)", +"a09de28d": "approveAndCall(address,uint256,bytes,address[],uint256[])", +"a09e3d0a": "getChildCount(bytes32)", +"a09e9c1d": "startBidding(uint256)", +"a09f6691": "LogGetMoneyBack(address,uint256,string)", +"a09f8659": "newConflictRes()", +"a09fb22e": "updateReputation(string,uint256,uint256,string,string,address)", +"a0a0d331": "COMPANY_WALLET()", +"a0a1082a": "createCustomVUP(address,uint256)", +"a0a2b573": "setTimestamp(uint256)", +"a0a2c11d": "ListValSince(uint256)", +"a0a2f629": "setReferralId(uint256,address)", +"a0a337e2": "getSetupFunctions()", +"a0a3ec6d": "getDividentsFromShare(uint256)", +"a0a4cb6c": "reveralSupply()", +"a0a4d9df": "batchTransferORSB(address[],uint256)", +"a0a4f93b": "setGasused(uint256)", +"a0a5cd92": "OkapiToken()", +"a0a695fe": "registerTier1Users(address[])", +"a0a6e940": "finalizePresale()", +"a0a7131c": "test_twoValidAssertFalse()", +"a0a7299b": "feeInBps()", +"a0a76eb0": "charactersOf(address)", +"a0a7dc2e": "withdraw_1Completed()", +"a0a7e0f8": "GameCellCoin(uint256,string,uint8,string)", +"a0a8045e": "getEthUsdPrice()", +"a0a86de3": "PreSaleTokenSoldout()", +"a0a8e460": "contractVersion()", +"a0a95502": "reading_card_count()", +"a0a986f1": "price0()", +"a0aaa87f": "secondStageMinted()", +"a0ab2847": "tfg()", +"a0ab308c": "BidAskX()", +"a0ab7091": "_isCooldownReady(uint256,uint256)", +"a0ab9653": "execute(uint8[],bytes32[],bytes32[],address,uint256,bytes,address,uint256)", +"a0abdba0": "allocatorAddress()", +"a0ac47fe": "_ethereumToTokens(uint256)", +"a0ac5776": "claimBooty(uint256)", +"a0acb9dd": "getA(string)", +"a0ad04c0": "changePhaseToICO()", +"a0ad51a6": "KNOW()", +"a0aead4d": "getAssetCount()", +"a0af0127": "world(uint256,uint256,uint256)", +"a0af3252": "thirdCurrentAmount()", +"a0afd731": "dividendBalance(address)", +"a0afebbc": "emitContractAdded(address,address)", +"a0affbfd": "upgradeHGT(address)", +"a0b06190": "addOneUserIntoWhiteList(address)", +"a0b091e4": "sellMFCoins(uint256)", +"a0b1b385": "playerSetInput(address,uint256)", +"a0b1f668": "GetRandom_In52(uint256)", +"a0b28861": "createAndBuyAllAmountBuyEth(address,address,address,uint256,address,uint256)", +"a0b2995a": "GetParticipantRole(address,address)", +"a0b2becb": "getLastAcceptedProposals()", +"a0b31d58": "addPacksToNextPremiumSale(uint32[])", +"a0b3bef0": "NVBToken(uint256)", +"a0b4388a": "activateShip(uint32)", +"a0b43a4e": "getWinnerPot()", +"a0b45df2": "transferOwnershipAndToken(address)", +"a0b498a4": "issuedTokens(address)", +"a0b55095": "allGames(uint256)", +"a0b5cf5f": "changeResolverAllowancesDelegated(string,address[],uint256[],uint8,bytes32,bytes32,uint256)", +"a0b65332": "getProposalIdByIndex(uint256)", +"a0b70e87": "capTokens()", +"a0b76d49": "JToken()", +"a0b7967b": "getNextSequenceId()", +"a0b7dcb4": "_transferInternal(address,address,uint256,bytes,string)", +"a0b7ebbd": "isExistingPlayerInBattle(string,address)", +"a0b7f0f8": "updateContributorAddress(address,address)", +"a0b873f2": "updatePlatformFeePercentage(uint8)", +"a0b87d1e": "MuseumsChain()", +"a0b946f0": "calculateMatchWitnessHash(address[],uint256[])", +"a0b9e8d5": "getRaisedAmountOnEther()", +"a0b9f0e1": "checkPause()", +"a0bb233c": "changeFeeAndCheatWarrant(uint256,uint256)", +"a0bb7508": "_addSig(bytes32,address)", +"a0bc572b": "benefactor(uint256)", +"a0bcfc7f": "setBaseUri(string)", +"a0bd1ec1": "hodlerTransfer(address,uint256)", +"a0bd3c0f": "scheduleCall(address,bytes,bytes,uint256)", +"a0bdb04e": "tier1Start()", +"a0bdcd3a": "BCNewToken()", +"a0bde7e8": "getShareDistributionWithTimestamp(bytes32)", +"a0bde945": "buyCity(uint16)", +"a0be06f9": "adminFee()", +"a0be2d9d": "Inco(address)", +"a0bee465": "BrylliteToken(address,uint256)", +"a0befa94": "getStake(uint256,uint256)", +"a0bf0539": "_checkThreshold()", +"a0bf775f": "canTransferBefore(address)", +"a0c01e58": "divForPrice()", +"a0c07002": "ArcBlockToken()", +"a0c16fb6": "HuobiPoolToken()", +"a0c1ca34": "migrateIn(address,uint256)", +"a0c1e119": "unhaltFundraising()", +"a0c32df7": "TRMToken(address,string,string,uint256,uint256)", +"a0c354ea": "getSumAmountOfOpenDeals()", +"a0c3bc68": "setOverflowBounds(uint256,uint256)", +"a0c42ed1": "getPOOL_edit_12()", +"a0c567a2": "blackListActive()", +"a0c57eb4": "checkCrowdsaleState()", +"a0c642bd": "multisendFrom(address,address,address[],uint256[])", +"a0c66283": "ZEROCoin()", +"a0c66b43": "maxActiveCastle()", +"a0c6e65e": "getResourceBalance(uint16,address)", +"a0c73e7c": "HDAToken(uint256,string,string)", +"a0c86718": "assetOwnersIndexes()", +"a0c8ad10": "removeAuthorizedExternal(address,address)", +"a0c8c156": "emptyCart()", +"a0c8e0ff": "testCanSendEthToContractWhenCrowdsaleInProgress()", +"a0c95e24": "disableBuyingTime()", +"a0c96e43": "getCommissionTarget()", +"a0c97bce": "paySeller()", +"a0c99c51": "paymentInfo(address,string)", +"a0ca0a57": "backlogLength()", +"a0cce3d2": "getAssetIdCreator(uint256)", +"a0cde1f0": "finishCrowdCoin()", +"a0ce4ff8": "priya()", +"a0ce8a0e": "SingleSourceAuthority()", +"a0cecb3b": "findOutInterestByBank(uint256,uint256,uint256)", +"a0cf01d4": "MoneroGold()", +"a0cf17da": "amountFunded(bytes32,string,address)", +"a0cf8857": "setTransferFeeAbs(uint256)", +"a0cfbc1b": "getDeploytimeBlocktimeBlocknumber()", +"a0cfc196": "getNumWineryOperation(bytes32)", +"a0d045bc": "AppleToken()", +"a0d0b13d": "addBook(string,string,string,string)", +"a0d0be4f": "calculateValue(uint256,uint8)", +"a0d0ee3b": "buildTokenContract()", +"a0d121a9": "addPolicy(uint256,uint256)", +"a0d1de29": "sendSeedAndHash(bytes32,bytes32)", +"a0d1f9e9": "serviceIncreaseBalance(address,uint256)", +"a0d3253f": "spawn(uint32,address)", +"a0d39949": "_rewardUnnapprovers(address)", +"a0d46c87": "validateRequestParams(address[3],address,uint256[12],uint256,uint256)", +"a0d578f4": "isServerEnable(string)", +"a0d605c6": "addCertificationDocumentInternal(address,bytes32)", +"a0d63f7e": "setDistributionMinimum(uint16)", +"a0d7bb1b": "addReserve(address,bool)", +"a0d80e65": "internalNoter(uint256,uint256)", +"a0d81b21": "ConsentFile(address)", +"a0d87fc2": "burnFromOwner(address,uint256)", +"a0d8848c": "getTicketStartPrice()", +"a0d8ad85": "_updatePayment(uint256,address,uint256)", +"a0d8b4bd": "changePresaleDiscountPercentage(uint8)", +"a0d8b4e9": "ownerMintRate()", +"a0d8e231": "SmartpoolVersion()", +"a0d9669c": "test_invalidAddressNotZero()", +"a0da3236": "ActionMining(address,uint16)", +"a0da7d2e": "addressLocked(address)", +"a0db0a22": "right4(uint256)", +"a0db844f": "F2UPAY()", +"a0dbd8d6": "startBlockNumber_()", +"a0dbde9d": "logBase2(uint256,uint256,uint256)", +"a0dc6b74": "emergencyPay()", +"a0dce445": "nothingLib()", +"a0dd678b": "VCFToken()", +"a0ddb418": "currentKey()", +"a0dde02a": "AftabCoin()", +"a0df9538": "walletOwnerAddress()", +"a0dfc61f": "DICE_LOWER()", +"a0e06c8a": "weekPotHighscore()", +"a0e0c317": "getTradeOfferRecipient(uint256)", +"a0e1001e": "IiinoCoin(string,string,uint8,uint256,int256,uint256)", +"a0e16fed": "getFinalizationTime()", +"a0e1f42c": "addPurchaser(address)", +"a0e23ebd": "openAt()", +"a0e2abf7": "getFirstActiveGamble()", +"a0e4d7d4": "getManifestIdsByName(address,bytes32)", +"a0e5588a": "paymentAction(uint256,address,uint256)", +"a0e5bb69": "setPI_edit_17(string)", +"a0e5e821": "recordDealCancelReason(uint256,address,uint32,uint32,uint256,string)", +"a0e67e2b": "getOwners()", +"a0e6a44b": "getCustomerTxPaymentMCW(address,bytes32)", +"a0e7192e": "requestEthereumLastMarket(string,string)", +"a0e724d3": "ReserveKnown(bool,address,uint256,uint256)", +"a0e7b4dc": "lastAmountSent()", +"a0e8b6b0": "the_address_for_option_A()", +"a0e8d21f": "join(address,string,string,uint256)", +"a0e8ef3d": "SetUSDPerETH_byContract(uint256)", +"a0ea0ef9": "constructionStart()", +"a0ea83dd": "SetSummRew(uint256)", +"a0eaa5dd": "lastTokenIsTransferableNumber(address)", +"a0eb5dd1": "AIRDROP_TOKENS()", +"a0ec4e09": "getUltimateOutcomes(bytes32[])", +"a0ec7f89": "transferPresaleTokens()", +"a0ed4cff": "MiniMeToken(address,address,uint256,string,uint8,string,bool)", +"a0ed6707": "EtopayNetwork()", +"a0eda9f2": "_transferFee(address,uint256,string)", +"a0edc204": "noOfPhases()", +"a0edc671": "USDtoHAV(uint256)", +"a0edcd7a": "burnPercentage100m()", +"a0ee153e": "isOwnerOrApproved(uint256,address)", +"a0ef8647": "BlueToken()", +"a0ef91df": "withdrawEth()", +"a0efe255": "m_categoriesCount()", +"a0f029fc": "ContractorInterface(address,address,address)", +"a0f04c38": "getKittyPower(uint256)", +"a0f0e95f": "DDJBTC()", +"a0f15b87": "registryICAP()", +"a0f1665b": "PriceSet(uint256,uint256)", +"a0f1ba62": "isOpenDistributionSetup()", +"a0f24ea7": "getTotalTokens(uint256,uint256)", +"a0f4a9a9": "Challenge()", +"a0f4d3df": "getRandomForContract(uint256,uint256)", +"a0f52da0": "startMigration(address)", +"a0f561ca": "ExtractDepositTime(address)", +"a0f61310": "FakeRelay(bytes)", +"a0f72985": "PassToken()", +"a0f78572": "Leaderboard()", +"a0f7bbcd": "sendTokensToAdvisors(address)", +"a0f82817": "Max()", +"a0f8be8c": "startOf(uint8)", +"a0fa0fb4": "ConstructorTest(uint256,uint256)", +"a0fa930a": "Ethercoin()", +"a0faf6a1": "getPortion(uint256,uint256,address)", +"a0fb1497": "deleteDocument(uint256)", +"a0fb7f57": "GMET()", +"a0fc4994": "setX(int256)", +"a0fcd161": "depositToken(uint256,bytes32,uint256)", +"a0fe6202": "SHA256(string)", +"a0ff1705": "depositTokenFunction(address,uint256,address)", +"a0ffe7bb": "registerInNewMarketplace()", +"a0fffd5f": "rand(uint32,uint256)", +"a1007e68": "TokenAmountToPay()", +"a10132ad": "callbackGas()", +"a1013abb": "TOKENS_DISTRIBUTED()", +"a1017649": "updateWalletLock()", +"a101c2d3": "time_out()", +"a101f7cd": "bountyFee()", +"a1022294": "Guess(string)", +"a1029aff": "findTile(uint16,uint16,uint16)", +"a102e8a5": "addMeterpoint(int256,address,int256)", +"a103983c": "BitShopperToken()", +"a1049c06": "Zolox()", +"a104dcd4": "changeUpgradeAgent(address)", +"a104e5e1": "recordNewOwner(uint256,address)", +"a1057852": "addToken(address,uint256,string,string,string,string)", +"a106320a": "icoFinalized()", +"a1063d20": "addIntermediateAddress(address)", +"a106832b": "disableInitialAmbassadorStage()", +"a106dbc8": "participantsFor1stSale(address)", +"a106f0bf": "bonusAmtThreshold()", +"a107994e": "test_validProxyOwnershipTransfer()", +"a107ceb6": "affiliateUtility()", +"a10874d9": "SquirrelGims()", +"a1088571": "CEO()", +"a10889fa": "setVersion(uint32,uint32,uint32,string,string)", +"a10954fe": "reserveBalance()", +"a109a089": "addWalletAddress(address)", +"a109b8bd": "feesCal(address,uint256)", +"a10a7782": "defaultReputationReward()", +"a10b10f5": "setFriendsFingersWalletForCrowdsale(address,address)", +"a10b3ffd": "ALLOC_PARTNER()", +"a10bee85": "_transferFromWithReference(address,address,uint256,string)", +"a10c0fd5": "ROLE_MULTIOWNER()", +"a10c44fb": "s18(bytes1)", +"a10cda99": "isWhiteListed(address,address)", +"a10d4f56": "updateCaps(uint256[])", +"a10d6a51": "officialTelegram()", +"a10d80de": "quitBattle(uint256)", +"a10daf4b": "GroupMultiplier(uint256,uint256)", +"a10e057c": "preIcoMinimumWei()", +"a10e6d28": "arbitrationFeePerJuror()", +"a10ec6e5": "initialize(address[4],address,uint256[12],uint256,bytes)", +"a10edc55": "GeneralPurposeProfitSplitter()", +"a10ef122": "WWWToken()", +"a10f0f5a": "addField(string,uint256)", +"a10f42c4": "isICOEnded()", +"a10f43a3": "bountyReward()", +"a10f5610": "authoriseAddress(address)", +"a10fc32f": "setInstantTransfer(bool)", +"a110063a": "createGOP(address,string)", +"a1103f37": "attrUUID(address,uint256)", +"a110d350": "finalPot()", +"a1119bf2": "bountyFeeCount()", +"a111b0da": "InternationalTourismCoin(uint256,string,uint8,string)", +"a111bab9": "totalLockAmount()", +"a11223da": "airdropTokens(address[],uint256)", +"a1130d04": "createTemplateAndAskQuestion(string,string,address,uint32,uint32,uint256)", +"a1131e14": "withdrawSale3()", +"a113bf2c": "ZITOKEN()", +"a114b5ae": "_createZodiac(uint256,uint256,uint256,uint256,address,uint256)", +"a1155286": "deleteOrg(string)", +"a1155f5c": "buyBlockCDN()", +"a1158c43": "commissionCheck(uint256[],uint256[],uint256[],uint256)", +"a1159838": "removeFreeze(address)", +"a115e38f": "VirtueToken()", +"a11674b0": "divsOf(address)", +"a1169d72": "_payChain(uint256,address,uint256)", +"a11748fd": "ReceiveGBP(address,uint256)", +"a1183d50": "FixedSupplyToken()", +"a1188e56": "getCurrentDifficulty()", +"a118babd": "withdrawPayment()", +"a118ca27": "validateStep(uint256[],uint256[])", +"a118f249": "addAccess(address)", +"a1190a36": "withdrawOtherTokens(address)", +"a11976f6": "confirmTransactionAfterDisputeFee(uint256)", +"a119a65a": "gettodayget()", +"a11aab78": "createGame(uint256[],uint256[],uint256,uint256)", +"a11ab71a": "fundsToCommunity(uint256)", +"a11bab06": "GChain(uint256,string,uint8,string)", +"a11df9c7": "PlanetZeroToken()", +"a11e1645": "registrationRights(address)", +"a11e22d9": "toDate(uint256)", +"a11e7f5e": "get_iconiq_presale_open()", +"a11ed157": "setBirthFee(uint256)", +"a11f8de4": "FomoToken()", +"a1206d4e": "setUserContract(address)", +"a1207708": "confirmDividends()", +"a120fdbd": "dayTokenAddress()", +"a1210a69": "endIcoDate()", +"a1211bc0": "finalizeCampaign()", +"a121d8df": "testFailCreateWithParentSameItemId()", +"a122e060": "rateForPhase3()", +"a12301f5": "promethCount()", +"a1232723": "playerPrizes()", +"a123422e": "_setContributor(address,uint256)", +"a12396aa": "setName(uint256,bytes32)", +"a123c33e": "owner(uint256)", +"a12412f0": "CAT_PER_ETH_BASE_RATE()", +"a12433fa": "getLastAttack(uint256)", +"a1243ad3": "mintPartners(uint256)", +"a12498dd": "ownerEnablePayee(address)", +"a125c824": "setDefaultTokenURI(string)", +"a1264994": "setfounderAddress(address)", +"a126c5df": "GAS_TO_AUTHORIZE_EXECUTION()", +"a126d601": "closePosition(uint256)", +"a127cfb6": "LogRequestAccepted(address)", +"a12842cc": "sellMyTokens(uint8)", +"a1291f7f": "ownerTransfer(address,address,uint256)", +"a1298368": "stringEqual(string,string)", +"a129cb94": "summPremineBounty()", +"a129ecda": "SetdivForSellBack(uint256)", +"a12a52dc": "allOwners()", +"a12a6bb0": "KYC()", +"a12c2564": "preEndTime()", +"a12c7dd8": "presaleContribute(address,uint256)", +"a12cad70": "getPayer(bytes32)", +"a12d2de3": "withDrawToPoolOwnerFee(uint256)", +"a12d7e2c": "WubCoin()", +"a12da89f": "Deviser()", +"a12e429c": "getDiscipleNum()", +"a12e55d9": "rollIt()", +"a12e9670": "setMaxETHContribution(uint256)", +"a12ee7ba": "changeMaintainer(address)", +"a12f69e0": "divides(uint256,uint256)", +"a1315b7e": "createPricing()", +"a132a785": "removeOwner(address,bool,bytes)", +"a132aad1": "startPresale(uint256)", +"a132ab82": "startAirdropTime()", +"a132e336": "changeDeedPrice(uint256,uint256)", +"a1338118": "increaseAllowance(address,uint64)", +"a1344589": "vestedTo(address,address)", +"a1347622": "t_Michail2()", +"a1350c00": "migratePropertyOwnership(uint16[10])", +"a13615a5": "desposeBear(address)", +"a1365fda": "dev_streamsLength()", +"a136aadc": "getMinerHashRate(uint256)", +"a136c448": "updateTokenSellingPrice(uint256,uint256)", +"a1391297": "ETH_CLEAR()", +"a139dee2": "_deleteHybridization(uint256)", +"a13a7cee": "createChildren(uint32,uint32)", +"a13ae1ee": "updateTokens(address,int256)", +"a13c24c7": "BithubCommunityToken()", +"a13c58f7": "logCoinAgeRecord(address,address,uint256)", +"a13d2733": "updatePatientHealthData(string,string,uint256)", +"a13d3832": "deactivateTokenSwitch()", +"a13d8ec4": "generateFinished()", +"a13e3351": "transferRefPercents(uint256,address)", +"a13f9e58": "RESERVATION_CAP()", +"a1405522": "MilkCow(address)", +"a140a687": "localsService()", +"a140e4ee": "getDropNotices()", +"a140e79c": "setMinimumDebatePeriod(uint256)", +"a1410994": "intelligentmasschainToken()", +"a141ce6a": "packageOfferInfo(address,uint256)", +"a142040b": "Dil()", +"a142d608": "escapeHatch(address)", +"a1446287": "LKYToken(uint256,string,string)", +"a1448fa7": "secondRewardPeriodPercent()", +"a144a3e0": "whitelistTransferFrom(address,address,uint256)", +"a1450c8a": "XDRAC()", +"a1454830": "getExpirationTime(bytes32)", +"a145492a": "transferToPartnerAccount(address,uint256)", +"a145636b": "artworkIndex(uint256)", +"a14598e6": "changeBonusPercentage(uint256)", +"a14779c9": "airdropWallet()", +"a1490581": "Deal(address,uint256)", +"a1490d50": "getTradeHash(address,uint256,address,uint256,uint256)", +"a14977d5": "getCustomerTxCount(address)", +"a1498f50": "check_result()", +"a14a5648": "bonus02Start()", +"a14b877b": "refundEverybody()", +"a14c1c4f": "setSTO(address,uint256,uint256,uint8)", +"a14c36ce": "dGetPool(uint8,uint8)", +"a14c9bed": "resetCurrentIdTo(uint256)", +"a14cf394": "generateInitialCard(uint16)", +"a14d191c": "PausePublic(bool)", +"a14d427a": "transferBonusToken(address,uint256)", +"a14d6517": "tweetIt(string)", +"a14e0e4e": "runInit()", +"a14e88fe": "firstTokenCap()", +"a14ea9c0": "selfRegisterDIN()", +"a14eaada": "tipCreator()", +"a14fc1e7": "aDropedThisWeek()", +"a14ff857": "setBytes32(bytes32,bytes32,bytes32)", +"a150be7a": "distributionPreIcoCount()", +"a152479c": "_computeNextCommissionerPrice(uint128)", +"a152b23e": "UKW()", +"a15348fa": "TitleRegistry()", +"a1536211": "AtacToken()", +"a153b399": "ZeePinToken(address,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"a15404b7": "createUnicornPrice()", +"a15454ba": "payTransactionFee(uint256)", +"a154aa36": "getTotalGoals()", +"a154ce82": "disableContract(address)", +"a155beb8": "buyerDatabase(address,uint256)", +"a156ce7b": "totalReimbursedWei()", +"a157696b": "setWhitelistedOnly(bool)", +"a1578d53": "EventBuyTank(address,uint32,uint32)", +"a157979c": "netOutcomeTokensSold(uint256)", +"a1580f1a": "damage()", +"a1581821": "transferWholeTokens(address,uint256)", +"a158e377": "statusICO()", +"a158e632": "lastLapId()", +"a1594d21": "DividendClaimed(uint256,address,uint256)", +"a159c548": "amountOfTokensPoolC()", +"a159c937": "getReferencePriceInfo(address,address)", +"a15a2289": "GameNumber()", +"a15a8613": "VoteCountPerProcess()", +"a15a9a15": "Presenca()", +"a15afb48": "Replicator()", +"a15b4d2d": "getAllCardByAddress(address,address)", +"a15b53ad": "pre_minContribution()", +"a15b9769": "addRandomClass(uint32)", +"a15bb363": "createBoardHash(bytes32,address)", +"a15c1788": "checkForLog(string)", +"a15cdbf7": "moveERC20Tokens(address,address,uint256)", +"a15d59ce": "totalVestedBalance()", +"a15db1c5": "_validateTokensAmount(uint256)", +"a15e3919": "getCrowdsaleUniqueBuyers(address,bytes32)", +"a16085ce": "the_address_for_option_D()", +"a16094d1": "burnMarketMakerApproval()", +"a160bdf5": "expiration(bytes12)", +"a1616429": "testBitOrSuccess()", +"a1616c92": "hasFreelancerMinRatingsCount(address,address,uint256)", +"a16249e2": "__min__(uint256,uint256)", +"a162a71f": "addToOwnerlist(address)", +"a162c04c": "buyTicketsFor(address)", +"a1636db0": "stepThree(int256)", +"a16383e2": "getTrustedTransferAttotokensValue()", +"a1639c6b": "customerConsents(address)", +"a163a624": "Test()", +"a163c090": "maxArtworks()", +"a164845a": "TheImmortalsPhoto(string,string,address,address)", +"a1654379": "isAllowed(address,address)", +"a1658fad": "canPerform(address,bytes32,uint256[])", +"a1659822": "UncursedToken()", +"a16618ae": "updateClientVersion()", +"a1663c48": "MIN_PRE_FUNDING_GOAL()", +"a1664ae2": "icoStartTimestampStage1()", +"a166b4b1": "addParticipant(address[])", +"a1672717": "getMinContributionInWei()", +"a1687d31": "isPlayer1sTurn()", +"a168d873": "gameAddress()", +"a1696076": "CCH_EDIT_3()", +"a1698315": "setExtraTokensWallet(address)", +"a169ce09": "boom()", +"a16a3179": "multiTransfer(address[],uint256)", +"a16bed3a": "changeTradeFee(uint256)", +"a16c6a73": "setClaim(uint256,uint256)", +"a16c86f7": "withdrawRefund(address)", +"a16cdbb1": "maxLockDuration()", +"a16d5960": "setPartner(address)", +"a16e5326": "CryptoSagaCorrectedHeroStats(address)", +"a16f3774": "getReservedTokens()", +"a16fa142": "generate_token_for(address,uint256)", +"a1702265": "keyEmployeesAllocation()", +"a17042cc": "getMsgValue()", +"a17177a1": "marketingTokensDistributed()", +"a171b694": "RefundIssued(address,uint256)", +"a172045d": "PUSH1()", +"a172db06": "portalAddress()", +"a1731366": "withdraw_to_reward_contract()", +"a173ba2f": "deathData_v2()", +"a1741d0f": "checkLiquidationValue(uint256)", +"a1743410": "_refundExceededValue(uint256,uint256)", +"a1744812": "setMaxCoordinate(uint16)", +"a174a8e9": "addNewColor(string)", +"a174c4c6": "mintAmount5()", +"a176d7c9": "createAndTransfer(address,uint256)", +"a176f6bc": "freezeTimeOf(address)", +"a1775db5": "isContract(address,address)", +"a1779a3d": "getFieldData(uint256)", +"a1784139": "updateChildMinLogos(address,uint256)", +"a1786803": "getCreationCost()", +"a1786d1b": "changeMessage(uint256,string)", +"a1787880": "createCustomToken(string,string,uint8)", +"a17a2685": "canUpdate()", +"a17a9e66": "A(uint256)", +"a17b229d": "total_fund()", +"a17ca853": "round(uint256,uint256)", +"a17cc7eb": "storedData(address)", +"a17d4228": "SingleApproval()", +"a17d5f44": "initializeWhitelist(address)", +"a17d713a": "stringToUint32(string)", +"a17dd26c": "buyWithReferral(address)", +"a17de881": "DigitalIntelligentToken()", +"a17e463c": "NbtToken()", +"a17ea25b": "getAppChainCode(uint32)", +"a17eb09f": "ExtraHolderContract(address,address[],uint256[])", +"a17ecf9e": "kill(uint256,address[],uint256[],uint8[],bytes32[],bytes32[])", +"a17eee56": "setGasRefundForClaimLoot(uint256)", +"a17f0bbd": "ICO_BONUS_TIME_3()", +"a17fa5f2": "fillRandomCars(uint256[],uint256)", +"a17feadb": "airdropAmounts(address[],uint256[])", +"a1804e67": "buyWithBalance(uint256,uint256,uint256)", +"a181b040": "SlammerTime(address)", +"a18232e8": "estimateTokenNumber(uint256)", +"a1826a9a": "CMK()", +"a182da60": "crowdSupply()", +"a1837d21": "ChangeBonus(uint256)", +"a183e9a5": "ErrorMessage(string)", +"a18473c2": "RequestCurrencyContractInterface(address,address,address)", +"a1848b61": "someMethod(uint256)", +"a1857f4a": "OTHERCRUISER_MAX_CARGO()", +"a1865376": "changePrice(uint256[],uint256)", +"a186e120": "setTokenTransferState(bool)", +"a18717a9": "addressToPass(address,bool)", +"a1883d26": "setTaxAddress(address)", +"a1885d9b": "whitelistWeiRaised()", +"a18861a3": "getHistoryCount()", +"a1888c34": "setGamblingFee(uint256,uint256)", +"a188b8fd": "accountAddressForSponseeAddress()", +"a188fcb8": "orderDepth(bytes32)", +"a189a487": "status(uint8)", +"a18a186b": "getCurrentOwner()", +"a18a2092": "changeTokenHolder(address)", +"a18a7bfc": "setReferrer(address)", +"a18bf6e9": "addFundAccount(address)", +"a18c1ab0": "burnToAddr()", +"a18c751e": "set(bytes,bytes)", +"a18ccc8a": "transferToWallet(uint256)", +"a18cd06c": "distribute(address,address)", +"a18dda19": "releasePayment(bytes32,address,uint256,address,uint256,uint256,address)", +"a18e0ce4": "addBorrowingItem(address,uint256,uint256,address,bool,uint256,uint256)", +"a18e133e": "registered_racers()", +"a18e2eb9": "left69(uint256)", +"a18ef171": "ALLN()", +"a18f43ef": "hasForfeitedBatch(address,uint8)", +"a18f7567": "Thecap()", +"a18f9b11": "drawWinners(uint256,uint256,uint256)", +"a1900c22": "takeTokenProfits(address)", +"a1903737": "addressOfTokenUsedAsReward5()", +"a1903eab": "submit(address)", +"a190500a": "tokenSecondPeriodPrice()", +"a1907386": "debugLatestPurchaseCentsValue()", +"a1920586": "offer(uint256,uint256)", +"a1920f36": "reservingStep()", +"a192274d": "initializeBread(uint256,string)", +"a192a425": "Founder1()", +"a192fdba": "bonusEnds10()", +"a1931ff9": "tryAnotherOne()", +"a1943113": "devWithdrawn()", +"a1945458": "getIdentityInfo()", +"a1960d80": "deferredKyc()", +"a19638e6": "betsCountToUseFreeBet()", +"a196593c": "findTenAmUtc(uint256)", +"a1965dca": "move(uint8,bytes,uint8,bytes32,bytes32)", +"a196981b": "withdrawCrowdsaleDragons()", +"a196bea0": "isDirectDebitEnable()", +"a1972fc4": "updateDividends(address)", +"a1975c38": "Token77G(address,address,address,uint256)", +"a197c042": "checkCustomer(address)", +"a197ec5d": "excessTokensBurnt()", +"a1988458": "readGlobalPurchasedToday()", +"a198a418": "LKLZ()", +"a1992419": "createCandidateOnElection(uint256,address,address,string)", +"a19b5493": "successed()", +"a19b8766": "transferTEST(address,uint256)", +"a19beba9": "addCompanion(address)", +"a19c1f01": "burnRemainder(uint256)", +"a19c406a": "newIdTankWeapon()", +"a19c9cd1": "getEthfromUSD()", +"a19cb5ee": "addHash()", +"a19db682": "defaultFoundersRewardTime()", +"a19e1d00": "bonusInPreSalePhase1()", +"a19e29a9": "claimUnsold(uint256)", +"a19ed39d": "finalizeFunding()", +"a19ee7a3": "changeMinMakerBetFund(uint256)", +"a19fab4c": "setWhitelisted(address,uint256)", +"a1a04486": "monthLength()", +"a1a0ee90": "LogPolicyApplied(uint256,address,bytes32,uint256)", +"a1a17ec3": "rentSign(uint256)", +"a1a1efe7": "addBallot(bytes32,bytes32,address)", +"a1a200c5": "getRankList()", +"a1a3e4c7": "UserIDChanged(address,bytes32)", +"a1a49a09": "unlockTimes(address,uint256)", +"a1a59f52": "_renew()", +"a1a5d118": "deployNetwork(address)", +"a1a66e56": "deductFunds(uint256)", +"a1a6d5fc": "transfer_(address,address,uint256)", +"a1a71a20": "buyCommon(address,uint256,uint256)", +"a1a71a83": "checkUsernameVerified(bytes32)", +"a1a7405a": "destTokensSgt()", +"a1a74aae": "removeMember(uint256)", +"a1a79f64": "_winAmount(uint128,uint16,uint16,bool)", +"a1a7e68b": "mintTreasuryTokens()", +"a1a85253": "ReturnBack()", +"a1a887b8": "isUserExists(address,address)", +"a1aab33f": "weight()", +"a1aad09d": "setBondPrice(uint256,uint256)", +"a1ab46d0": "DepositReceived(uint256)", +"a1ac727f": "airdrop(address,address[],uint256)", +"a1ac8c56": "balanceOfOwnerAndCreator(address,address)", +"a1acd4b2": "AWD_SHARE()", +"a1acf069": "ArtChainToken()", +"a1ad2b99": "removeExchangeAccounts(address,address)", +"a1ad54e6": "holdingToken()", +"a1ad7cef": "tokenBurned()", +"a1adbb25": "addCandidate(bytes32,bytes32)", +"a1add510": "hasRelation(bytes32,bytes32,address)", +"a1aeb1c2": "paybackToOwner(address,uint256)", +"a1aec173": "COLOR_SILVER()", +"a1af90ad": "funcalls()", +"a1afaa19": "previligedUnLock(address,uint256)", +"a1b0f3a0": "userChallenge(uint256)", +"a1b140b6": "getDistributionStatus()", +"a1b162a8": "set_timeframes(uint256,uint256)", +"a1b16e5c": "returnAgents(address)", +"a1b1cb43": "hasAccess(address,uint8)", +"a1b1e507": "addMintingFactory(address)", +"a1b22154": "preemption()", +"a1b22c19": "delExcluded(address)", +"a1b235af": "popLanguage()", +"a1b258c1": "firstWeekBonus()", +"a1b289dd": "TulipToken()", +"a1b2acc1": "cancelApproval()", +"a1b35c79": "getSection(bytes32)", +"a1b39c38": "_removeMarkets(uint256)", +"a1b3ef4b": "flightDone()", +"a1b40946": "getWordIndex(string)", +"a1b4dd2d": "DXBCToken(address)", +"a1b4f57c": "joinBattle(string)", +"a1b5b581": "ymtest(uint256)", +"a1b608c9": "setMainPoolCutPercentage(uint256)", +"a1b64c86": "TokenMock(string,address)", +"a1b6b1b5": "updateUnlockData(address,address,uint256,bytes32)", +"a1b6d4ae": "REPLACES()", +"a1b77835": "getRefPercentsByIndex(uint256)", +"a1b7887f": "logShareTokenBurned(address,address,uint256)", +"a1b7ae62": "setdirectorName(string)", +"a1b7ffb2": "_checkRequireERC20(address,uint256,bool,uint256)", +"a1b86605": "getHourglassBalance()", +"a1b8c40f": "lastDepositIndex()", +"a1b94c0b": "timeOfWin()", +"a1b9af31": "unlockBets()", +"a1b9cb8f": "getTitulaire_Compte_6()", +"a1b9e03f": "Unagold(address)", +"a1ba0331": "CoinTroops()", +"a1ba444d": "createOrder(uint256,uint256,uint256)", +"a1ba7554": "fibokenUsedCount()", +"a1bb6220": "halting()", +"a1bb7828": "make_transfer(address,uint256,uint256,bytes32)", +"a1bba310": "DonationDoubled(address,uint256)", +"a1bc13ad": "forgeItems(uint256,uint256,address)", +"a1bc76d1": "extendPRETDE(uint256)", +"a1bc7a8f": "sha3_512()", +"a1bd55c2": "TimeDecayingToken(address,uint256,string,uint8,string)", +"a1bda122": "returnInt16(int16)", +"a1bdd146": "setEndorsement(address,uint256,uint256)", +"a1be79a0": "equipUp(uint256[6])", +"a1bed0be": "GOAL()", +"a1bf8a9d": "endICO_w1()", +"a1bffefa": "emitCancelled()", +"a1c0539d": "scheduleCall(address,bytes4,bytes)", +"a1c14350": "getUpdateMarketPhaseCalled()", +"a1c1519a": "calcNewSkinAppearance(uint128,uint128)", +"a1c15f56": "CipherPlay(address,address)", +"a1c29db6": "MAX_FUNDING_AMOUNT()", +"a1c2f644": "address4()", +"a1c308d0": "ProspectorsGoldToken()", +"a1c448f1": "kingdomCreationFeeWei()", +"a1c4774b": "getCostToKick()", +"a1c4db02": "eth_meth()", +"a1c51915": "getB()", +"a1c68880": "final_share_price()", +"a1c6d088": "airDropTokenDestroy()", +"a1c80cea": "getUriCount(address)", +"a1c8ca7e": "removeClaim(address,bytes32)", +"a1c90a11": "updatePlayersCoinByPurchase(address,uint256)", +"a1c91040": "requestEvidence()", +"a1c93169": "DividendClaimed(address,uint256,uint256)", +"a1c934b6": "TestNetworkToken()", +"a1c95ac2": "GSIToken(uint256,string,uint8,string,address)", +"a1c9d235": "minimumElectionQuorum()", +"a1ca00c0": "ELIXAddressSetter()", +"a1ca70f4": "totalDiv()", +"a1ca8f8d": "LTRToken()", +"a1cb31b7": "_state()", +"a1cbae6c": "communityTokens2()", +"a1ccc49c": "addDataPatternVoteRules(uint256,uint256,bytes,bytes,uint256[5])", +"a1cd150d": "_calculateFee(uint256)", +"a1ce5ba7": "getIncentiveNum()", +"a1ce7e03": "openOrder(uint64,bytes,bytes32)", +"a1cea675": "cryptaurRewards()", +"a1ceb253": "mintAdvisorsTokens(uint256)", +"a1ceb359": "CryptoStrategiesIntelligence()", +"a1d0846c": "setPrices(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"a1d0a48f": "addCurrency(string)", +"a1d0ab04": "allocateContributorsToken()", +"a1d10d11": "StoneLog(uint256,uint256)", +"a1d20653": "setVersion(bytes32,string)", +"a1d25205": "lowEth()", +"a1d27925": "personalContract()", +"a1d280d3": "releaseValue1()", +"a1d3612c": "DKS()", +"a1d36cb0": "checkClaimEntitlementofWallet(address,address)", +"a1d48aa8": "PaymentChannel(address,address,uint256)", +"a1d4c7ce": "_emitSkillRatingGiven(address,address,uint8,uint256,uint256,uint256,uint256)", +"a1d4c820": "Signum()", +"a1d53160": "Capital()", +"a1d5b36e": "calculateTxHash()", +"a1d61b07": "dateTier4()", +"a1d707a3": "setReleaseCar(uint256,bool)", +"a1d7d1dd": "setup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256[],uint256[],uint256[],uint256[])", +"a1d7ecbb": "updateShareETH(address)", +"a1d82cfd": "EBANK()", +"a1d86608": "_claimedSurroundingTiles(uint256)", +"a1d915b8": "ClaimTokens()", +"a1d91ee0": "technologyContract()", +"a1da2fb9": "retrieveDAOReward(bool)", +"a1da32be": "Shopiblock()", +"a1dab23e": "sellFloor()", +"a1dabfb2": "OAIToken(address,address)", +"a1db9782": "withdrawERC20(address,uint256)", +"a1dc139d": "setSigner(address,address,bool)", +"a1ddcd2d": "USDCX()", +"a1dddf70": "registerEthHandle(bytes32,address)", +"a1dea137": "checkBlacklist(address,address)", +"a1df7eb3": "YBKToken(string,string,uint256,uint256,string)", +"a1dfe545": "logShareTokenMinted(address,address,uint256)", +"a1e03f57": "ratePerWeiInSelfDrop()", +"a1e04406": "preSale4Finished()", +"a1e0c2c9": "winnerCounter()", +"a1e15c33": "canuseOf(address)", +"a1e3b16d": "Crypseum()", +"a1e3c008": "mainSendTTC()", +"a1e4cb30": "investorsTotalSupply()", +"a1e4d3c2": "MembershipRoster()", +"a1e4eaf1": "updateUserBalance(uint256,bool,uint256,uint256,uint256,address,address)", +"a1e4f73d": "construct(bytes32,string,bytes32,address,uint128,uint256)", +"a1e51a79": "emitDestruction(uint256)", +"a1e564b1": "CashOut()", +"a1e59471": "HashBux()", +"a1e66038": "getTrusteeTable()", +"a1e6a255": "nextUserId()", +"a1e7e21c": "crowdsaleBurnAmount()", +"a1e89aec": "saleCount()", +"a1e8a780": "getAdPriceMultiple()", +"a1e93b63": "withdrawTipBalance(uint256,address,uint256)", +"a1e95792": "eatUnicornsAlive(uint256)", +"a1ea00bc": "isUserTakerFeeEnabled(address,uint256)", +"a1eb0bae": "eliminarjugador(uint256)", +"a1eb84b0": "transferOwnedOwnership(address,address)", +"a1ecb43c": "incrementLimitTeam()", +"a1ee7855": "ATT()", +"a1ee8c78": "issueToken()", +"a1ef9b8f": "reallocate(address,address,address,uint256)", +"a1f1aa66": "cancelVoteInternal(bytes32,address)", +"a1f1de65": "getPrizeAmount(uint256)", +"a1f24b3d": "getAssetDetails(uint256)", +"a1f36a78": "EROSCOIN()", +"a1f43f40": "UNICToken()", +"a1f4b9c8": "updatePlayerGen(address,uint256)", +"a1f54adf": "nextPremiumSale()", +"a1f56b0a": "getRollOutput(uint256,uint8,uint8,uint256,address)", +"a1f7f269": "_breedWith(uint256,uint256)", +"a1f841d7": "unlockFund()", +"a1f8adac": "investorList()", +"a1f8ea3b": "numOfDeliveredEarlyPurchases()", +"a1f902a7": "ComputeVestSpend(address)", +"a1f91057": "updateLock(bool)", +"a1fa39c4": "getRaisedPercents(address)", +"a1fa540d": "changeVotingBlocks(uint256,uint256,uint256,uint256,uint256)", +"a1fa566e": "getChannelPartners(bytes32)", +"a1fac24c": "Follow(bytes32,bytes32,bool)", +"a1fafe0c": "sendResidualAmount(uint256)", +"a1fb03f2": "GooCrowdsale(uint256,uint256,uint256,uint256,address)", +"a1fb1de9": "Message()", +"a1fb34c1": "setCustomExtraData(bytes32,uint256,bytes32,bytes32)", +"a1fc21f4": "setStaffDisbursementAddress(address)", +"a1fcc3bc": "stage2()", +"a1fd49b7": "getMFBalance(address)", +"a1fd92f5": "destinationMultisigWallet()", +"a1feba42": "tokensLocked()", +"a1ffba04": "PPGT()", +"a2008eb9": "acceptBidForStar(uint256,uint256)", +"a200dc73": "getNextShareholder(address)", +"a201222d": "recalculate(address)", +"a201bf26": "settleETH(bytes32)", +"a201d102": "VOTING_END_TIME()", +"a201ed8b": "transferMultiple(address[],uint256[],uint256)", +"a2023ff8": "setStartEndTimeTLP(uint256)", +"a202e476": "last_hash()", +"a20348c4": "ToPeriod()", +"a2035fef": "changeCustomTimeLock(string,uint256)", +"a20495d3": "Managed()", +"a20741dd": "getOperation(uint32)", +"a207b7fa": "SALE_FUND()", +"a208b3b7": "findFigures(uint256)", +"a2093e1b": "migrateCatOwnersFromPreviousContract(uint256,uint256)", +"a209a29c": "getStringValue(bytes32)", +"a20aede0": "phaseThreeRate()", +"a20b77ad": "getDocHash(uint256)", +"a20b8ab3": "ttlInvestAmount()", +"a20bbb8b": "addBadge(uint24,int16,int16,uint24,uint256,string,string,string,uint256)", +"a20bc7fe": "allownce(address,address)", +"a20c15cf": "_generateCampaign(string,uint256[3],uint256[],uint256,uint256,uint256,uint256)", +"a20c404f": "ModifySettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"a20cc495": "bytesFunc(bytes,bytes)", +"a20cd047": "moveTokenToAccount(address,uint256)", +"a20cf0e7": "setTokenNAVMicroUSD(uint256)", +"a20ddfb6": "getPartnerAddresses()", +"a20def62": "checkExistsOwnedAccessory(uint64)", +"a20e2525": "UnlockWei(uint256)", +"a20efba3": "mintGrey(address,uint256)", +"a20f46c6": "searchAddress(address)", +"a20f4ee6": "pixelCost()", +"a210a676": "buyBunny(uint32)", +"a210bf55": "updateJackpotFeePercentage(uint8)", +"a210c6a9": "creatorPaid()", +"a210f934": "rateEarlyStage2()", +"a21174bb": "DefaultReverseResolver(address)", +"a2119377": "createToken(string,address)", +"a2119a3a": "allocateForRefund()", +"a2125232": "addItem(uint256,uint256)", +"a213051c": "individualMinPurchaseWei()", +"a21383cb": "permissibleTokenWithdrawal(uint256)", +"a213972c": "ViewBet2(address,uint256)", +"a213c280": "DayByDayToken()", +"a21515e3": "computed_shares_sold()", +"a2152e32": "testOracle()", +"a215457a": "transferBurnRole(address)", +"a215cd92": "setMinConversionRate(uint256)", +"a2167ac4": "_donations()", +"a216e0aa": "transferRobot(address,uint256)", +"a2177ff0": "getKeyLength()", +"a2187de0": "available_tokens()", +"a218d8ca": "clearAndDestoryAfterTwoWeeks()", +"a2190b46": "calculateTakerFee(address,uint256)", +"a21931ea": "CreateProposal(string,string,string,uint32,string,string,string,uint32,uint32)", +"a21a32cb": "Securities_1()", +"a21a65ae": "getIntArrayLength(bytes32)", +"a21d5b9f": "utilityLockedDate()", +"a21d942f": "checkResult()", +"a21df9f0": "THIRTY_DAYS()", +"a21e14fe": "reportInvalidDeposit(bytes32[])", +"a21ea6b7": "CrabCoin()", +"a21eea2a": "assertValidChallenger(address)", +"a21eef95": "getBarrierNum(uint16)", +"a21f0368": "History(uint256)", +"a21f74b8": "fundGooResearch(uint256)", +"a21f836e": "pubCount()", +"a21fbc92": "isAllowed()", +"a2200278": "checkStatus(bytes32)", +"a2200fbe": "AgreementUrlEn()", +"a220a90e": "transferLoveStoryWithData(bytes16,bytes32,bytes32,uint256,string)", +"a220d6c4": "tCampaignStart()", +"a2210352": "doRebuyTo(address)", +"a22107b4": "createRandomZombie(int256)", +"a222a52f": "firstPostIcoContributorId()", +"a222c98d": "declareWinnerForRaz(uint256,uint256)", +"a22304cd": "_specialDistribution(address,uint256)", +"a2233631": "withDrawal(address,address,uint256,bytes)", +"a2233c4d": "BancorConverterFactory()", +"a22352e2": "getDisputeFee(bytes32)", +"a2240eb0": "Scope()", +"a2248be0": "set_pre_kyc_bonus_numerator(uint256)", +"a224a5b3": "push_key(uint256,uint256,uint256)", +"a224c745": "setWhitelistAddress(address)", +"a224dcb7": "withdrawClaim(uint256)", +"a224f4ce": "earningsFromScore(address,address)", +"a2252aaa": "referralProgramOwner()", +"a225d0be": "setTokensByWaveIndex(uint256,uint256,uint256)", +"a2261508": "tokenSpender()", +"a2267a3a": "newProposal(uint256,uint256,string)", +"a2271b15": "m_presaleFinished()", +"a22838b9": "ExecuteTrade(uint256,address,address,uint256,uint256)", +"a229090a": "dropTo(string)", +"a22913b5": "addTeamAddress(address,uint256,uint256)", +"a229b901": "transferApprover(address)", +"a22a12de": "submitWithMetaHash(bytes32,bytes32)", +"a22a31dd": "Forged(uint256)", +"a22b35ce": "_burnFrom(address,uint256)", +"a22b5a1c": "getFiles(bytes32)", +"a22b97f5": "withdrawOnBehalf(address)", +"a22ba787": "allocateETH(bool)", +"a22bb384": "GBAChain(uint256,address)", +"a22c81ec": "MIDGRADE_TYPE2()", +"a22cb465": "setApprovalForAll(address,bool)", +"a22cd657": "getImpactValue(string,address)", +"a22ce93d": "getActiveConsentTemplates()", +"a22d5a51": "deleteActivity(uint16)", +"a22dff2c": "getMainBalance()", +"a22e9009": "epm()", +"a22ec476": "setSireStop(uint32)", +"a22ed371": "mentalBalanceOf(address)", +"a22f2b2e": "set_lock_list(address,address,uint256)", +"a22fb98b": "updateBounty(string,uint256[])", +"a2302af9": "queryWinningTeam(uint256)", +"a2309ff8": "totalMinted()", +"a230c524": "isMember(address)", +"a231a84f": "ssp()", +"a232155d": "getbetresultfirst(address)", +"a2325259": "buyTokensWithUpdateRate(address,uint256)", +"a23281e6": "numPositionsExpired()", +"a2328e2e": "_FIVEHUNDRED()", +"a23291b6": "QUIOToken()", +"a232e64b": "createForum(string)", +"a235ae52": "setWithoutFee(address,bool)", +"a2362aca": "HyunJaeToken()", +"a2368e11": "setAirDrop(bool)", +"a236a3d7": "configRoundKeyAdd()", +"a236e665": "buyNac(address,uint256)", +"a236eb85": "subdivide(uint256,bool,bool,uint256,uint256,string,string)", +"a236f388": "getGameWin(address,uint256)", +"a23744f0": "tryCreateCheckRecord(bytes)", +"a2375d1e": "getC()", +"a237f4d8": "developerFundAddress()", +"a2393922": "getTokenDealRange()", +"a23951c8": "WidthdrawEarnings(uint256)", +"a239756d": "setRandom(uint256,uint256)", +"a239d260": "KinTokenSaleMock(address,uint256)", +"a23a373f": "DrawWinning(uint256,uint256)", +"a23a49c1": "setEscrowTokensWallet(address)", +"a23a5315": "SkyToken()", +"a23b5bd1": "getRandomUint256(uint256)", +"a23b791a": "Bitcoin()", +"a23bbb11": "GroupClosed(uint32,uint256)", +"a23bc6fe": "setTokenHolderAddress(address)", +"a23bec7b": "constrcutor()", +"a23bfd84": "weiPerCHF()", +"a23c3397": "getTokensPaidToGame(address)", +"a23c86c0": "allocateBulkTokens(address[],uint256[])", +"a23d20f4": "blockedDivisionJurisdictions(bytes32)", +"a23d3c35": "founderWallet()", +"a23d64c4": "isReturnRequested(address)", +"a23da130": "FundsRegistry(address[],uint256,address,address)", +"a23e21f7": "change(uint8,bytes32,bytes32,bytes20)", +"a23e3e89": "removeToken(address,uint256,uint256)", +"a23f41e2": "curs()", +"a2407c7b": "verifyUpdate(uint256,int256[2],uint256[2],int256,bytes32,address,uint256,uint256,uint256[3])", +"a240d8ad": "changeWeeklyRate(bytes32,uint256)", +"a241c089": "updateContract()", +"a2420f73": "EthermiumTokenList(address,address,uint256,uint256)", +"a24247f1": "getStartLockTime()", +"a242519b": "Technology3G(address)", +"a242f049": "ICOEndTime()", +"a243b6c1": "setPrice(uint256,uint256[],uint256[])", +"a243f512": "removeTrack(bytes32)", +"a243f874": "takePayment()", +"a244e03d": "definirMessage(string)", +"a244f365": "SbuyToken()", +"a245b774": "lockedFundsForthefuture()", +"a24636c1": "InvalidState(bytes)", +"a246d83b": "relaySellerCannotCancel(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32)", +"a2471fa5": "RecoverableWallet(address)", +"a2473cc1": "stakeOf(address,uint96)", +"a2478c8d": "CT(uint256,string,string)", +"a247bc32": "payouts()", +"a24835d1": "destroy(address,uint256)", +"a248da12": "Exam()", +"a248de8f": "own(bytes32)", +"a248df4f": "XFC()", +"a249225e": "setAuthorizedUser(address,bool)", +"a2495ace": "transferCongress(address)", +"a2497b5c": "ETQuality()", +"a24a21fa": "TheBillionCoin()", +"a24bcf46": "calculateTokenAmount(uint256)", +"a24beff7": "closeBet(uint256)", +"a24c9737": "BUYER_CAP_HIGH_USD()", +"a24d23eb": "ProcessGame(uint256,uint256)", +"a24d9658": "revokeConsent(string)", +"a24dbe76": "StatusContribution()", +"a24e20de": "withdraw_dao_fund(address,uint256)", +"a24ea666": "withdrawedFundrasingPart()", +"a24ea868": "PROOF_MULTISIG()", +"a24ed4e5": "isLimitedWalletAddress(address)", +"a24ed8aa": "newLeader()", +"a24f1e82": "publiclyDistributedParts()", +"a25047a2": "hasEntry(address)", +"a25057de": "_transferToICAP(bytes32,uint256)", +"a250f43b": "verifiedWinnersLastCount()", +"a25236fe": "requestVotingRights(uint256)", +"a25277f3": "totalTokensCrowdSale()", +"a25287c5": "allowChangePrice()", +"a25367ff": "method2(bool)", +"a253c06e": "_circulatingSupply()", +"a25401ea": "PapyrusToken(address[],uint256[])", +"a254e662": "managementTokensDelivered()", +"a2550108": "alt_buyCollectible(uint256,uint256)", +"a2554c36": "walletForPresale()", +"a2558ee2": "holderReward()", +"a255d68d": "ticketTransferees(address,uint256)", +"a2564afc": "activatePermissionsBot(bytes32,bytes32)", +"a2564f7c": "randomNumberGen(uint256,uint256)", +"a2578f1c": "armyCountBattlesWon(uint256)", +"a258dafc": "getTopInfo(uint256)", +"a2594b83": "greylistMany(address[])", +"a2596576": "submitMint(int256,address,uint256)", +"a2596ebe": "returnTokensFromHoldProgectAddress(uint256)", +"a2597659": "changeMinAccEthers(uint256)", +"a25983e5": "lockTokens(address,uint256,uint256)", +"a25a34b1": "findPositionInMaxExpArrayTest(uint256)", +"a25b859d": "soldIdeaWeiIco()", +"a25b9384": "isUserAllowedToTransfer(address)", +"a25bc80c": "setPresaleState(uint8)", +"a25be434": "notifyTranferToken(uint256,address,address)", +"a25c1f3a": "presalePurchasesLoaded()", +"a25d8973": "createSale2()", +"a25e6898": "withdrawForeignTokens(address,address,uint256)", +"a25eb5d9": "exchangeToken()", +"a25f2d7e": "ReinvestmentWithdrawal(address,uint256)", +"a25f55d4": "getBatchSize()", +"a25f5e98": "doAdditionalMinting(address,uint256,int256)", +"a25fc8dc": "adminAddCity(string,uint256,uint16)", +"a25fdcec": "editPlanet(uint256,uint256,string,string)", +"a25ff42d": "HumanStandardToken2(uint256,string,uint8,string)", +"a2605dc1": "EventLuckyNumberRequested(address,uint256,uint256,uint8)", +"a2609759": "transferPreSignedMany(address,address[],uint256[],uint256,uint256,uint8,bytes32,bytes32)", +"a260c045": "PROMETHEUS_SHIP_LIMIT()", +"a260d8da": "makePresaleReady()", +"a26176b1": "testInequalityUint()", +"a2624afe": "raiseJackpot()", +"a262c092": "CollectChipBag()", +"a26329f0": "finalizeRefunds()", +"a2635401": "getCurrentGameId()", +"a263601c": "find_contribution(address)", +"a26388bb": "testRevert()", +"a263c7ba": "changeBuyPrice(uint256)", +"a263e793": "EdittedEntry(address,uint256)", +"a2644eb0": "withdrawFullTokenBalance(address)", +"a264f18e": "CROWDSALE_ETH_IN_WEI_ACCEPTED_MIN()", +"a2651d30": "purchaseAreaWithData(uint24[],uint24[],uint256[],string,string,uint256)", +"a2657960": "DolyToken3()", +"a26636f3": "StpacToken()", +"a266b0f2": "CoinStacks()", +"a266c820": "changeARIWallet(address)", +"a266f4da": "liquidateFund()", +"a26730e1": "minRelease()", +"a26759cb": "addFunds()", +"a267b5cf": "TokensTransfered(address,uint256)", +"a268b332": "testBitXorFailIndexOOB()", +"a269202f": "setHash(address,bytes32,address,bytes32,uint256)", +"a269e31f": "setPrices(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"a26a1bc9": "clearLockUser(address,uint256)", +"a26ac680": "BoBoToKen()", +"a26b0e34": "dbVal(address,uint256)", +"a26b2d76": "StepCoin()", +"a26b8822": "tokensSoldExternal()", +"a26bddb4": "LockedTokens(address)", +"a26c7810": "mintToTeamAccounts()", +"a26d494d": "getEscrow(address)", +"a26d6de6": "LogWithdrawal(uint256)", +"a26d7b94": "isCrowdSaleClosed()", +"a26dbf26": "totalParticipants()", +"a26e1186": "deposit(string)", +"a26e7a6c": "_initOpinion(uint256,string)", +"a26efcf8": "startGame(bytes,address,uint256,uint256[],bytes)", +"a26f644c": "Transfer_of_authority_data(address)", +"a270907c": "Btcandres()", +"a270a737": "venue()", +"a270cdf3": "getMarketInfo(bytes32)", +"a2720018": "freelanceFillBonds(address)", +"a2729a01": "updateDelegatorWithEarnings(address,uint256)", +"a273079a": "addLog(string,string)", +"a2730c23": "EthToAFW(uint256)", +"a273738c": "preICOEndTime()", +"a27411d8": "Earthpayment()", +"a2741bdb": "MAX_CITIES()", +"a2744a22": "addProduct(uint256,uint256,string,uint256)", +"a2752df9": "tokenSetTransferFeeProp(address,address,uint256)", +"a275ee1b": "getDeployTime()", +"a27678c9": "preDGZToken()", +"a277051f": "userAddr()", +"a277b787": "CARXTOKEN()", +"a277d5b1": "totalTokensPurchased()", +"a277fa88": "setWhitelistOn()", +"a2788b58": "ConflictResolutionManager(address)", +"a278ce66": "backWindowAdjustmentRatio()", +"a278fdfb": "bidOnAuctionToBuy(uint256)", +"a27966dd": "finishselfdrop()", +"a2798f0a": "GetQueueNumber()", +"a279c488": "addPending(address,uint256)", +"a27a9e7f": "publicAmount()", +"a27aebbc": "extendTime(uint256)", +"a27b9bf4": "matchcoin(uint256,string,string)", +"a27c1756": "ECONOMY_BOOST()", +"a27c3a2d": "HngCoin(uint256,string,string)", +"a27c672a": "owner_reveal_and_commit(uint8,bytes32,bytes32)", +"a27c794b": "insertDetails(string,uint256,uint256)", +"a27c9af0": "gameDestroy()", +"a27d8298": "leader_3()", +"a27e0e67": "QLFY()", +"a27ee939": "payto3()", +"a280b3db": "preSaleBonus3Time()", +"a280ce8f": "distributeWinnerPot()", +"a280e67a": "leftnum()", +"a28103f2": "batchTransfer2(address[],uint256[])", +"a283063c": "ChargeFee()", +"a2832c97": "CappedDividendToken(uint256)", +"a283c9c5": "getLastBidAmount()", +"a283f907": "addOrderContract(address)", +"a283fd00": "getPendingPaymentAmount(address)", +"a284b6d3": "maxTicketAmount()", +"a28504b4": "isSwapDone()", +"a28555d5": "setTAOFamilyAddress(address)", +"a28576aa": "LogUserRegistered(address)", +"a285f19f": "signedTransfer(address,address,address,uint256,uint256,uint256,bytes,address)", +"a2860050": "estimateReturns(address,uint256)", +"a28641cc": "_buyTile(address,uint256,bytes)", +"a2866a78": "HouseICO()", +"a28812c2": "existingIds()", +"a288237c": "MeSum()", +"a288b609": "releaseOf(address)", +"a288fb1f": "setConfigUint(int256,bytes,uint256)", +"a2890972": "synthesize(uint16[5])", +"a289409b": "addAddressesToAdmins(address[])", +"a289673b": "fipsChangeOwner(bytes20,address,address)", +"a289d187": "depositDividend()", +"a28a1564": "GBToken()", +"a28b1ffd": "isLive(uint32,int256)", +"a28bc99a": "TipSmartToken()", +"a28c644d": "setACLRole5999294130779334338(address)", +"a28c76cc": "initialize(address,address,address,bytes32,uint256,uint256,uint256)", +"a28d0185": "removeComponent(uint256,uint256)", +"a28d57d8": "btc()", +"a28e68d3": "setOnceMintAmount(uint256)", +"a28ecf0b": "sendCryptedHand(bytes)", +"a28f19f8": "AddDroneItem(address,uint256,uint256)", +"a29063c1": "LuckyNumberImp()", +"a290f4f2": "logoPrice()", +"a2919502": "getWalletLibrary()", +"a29256bd": "Ethereum()", +"a292f7d3": "paymentEscrow()", +"a29337bd": "tokensToCompany()", +"a293688b": "triggerFindWinner()", +"a293cba1": "LETSCOIN_Token()", +"a293d1e8": "safeSub(uint256,uint256)", +"a29445a9": "EnclavesDEXProxy(address,address,address,address,uint256,uint256,address,bytes32,bytes32)", +"a294542f": "setPreSaleTLYperETH(uint256)", +"a2948cdf": "futureDevelopment()", +"a294ed7a": "voterAddressOf(uint256,uint256)", +"a2950fd8": "Birth(address,uint256,uint256,uint256,uint256,uint256)", +"a2958b76": "_transferOwnershipOfStorage(address)", +"a29626c2": "createSingleSeedAuction(uint8,uint8,uint256,uint256,uint256,uint256,uint256,uint256)", +"a296b323": "setTransfer(bool)", +"a296fed8": "HitToken(uint256,string,string)", +"a297d43c": "openDistributionContract()", +"a2987245": "getIntArrayIndex(bytes32,uint256)", +"a298ba7c": "AntiqueCoin(address,uint256)", +"a299b155": "setInitialTokensBalance()", +"a29aaad6": "MatreXaCrowdsale(uint256,uint256[],uint256[],uint256,uint256,uint256,uint256)", +"a29b7fa0": "TklnAirdropToken()", +"a29c3574": "OrgonToken()", +"a29cc6c8": "allocateVestedTokens(address,uint256,uint256)", +"a29cd847": "changeEndPreSale(uint256)", +"a29d4859": "drpuToken()", +"a29d578a": "changeABaddress(string,address)", +"a29dbf46": "isAllowedToSend(address,address)", +"a29f9fb9": "onChainAddresses(bytes32)", +"a29fe9b1": "UBOToken()", +"a29ff28d": "receivedStaAmount()", +"a2a02202": "smg(uint256)", +"a2a0d0fc": "pre_endTime()", +"a2a140f9": "MinInvestment()", +"a2a1521a": "SignalPylon(address)", +"a2a17629": "addrBroker()", +"a2a206c0": "ImperoITCoin()", +"a2a23fb2": "getVersionsLength()", +"a2a256b9": "AirDroppedTokens(uint256)", +"a2a3d051": "B3(uint256,string,uint8,string)", +"a2a483ee": "setCS(address)", +"a2a51ccd": "transferToCrowdsale(address,uint256)", +"a2a5243c": "_calculateExcessBonus(uint256,uint256)", +"a2a53c7c": "Exercise(uint256)", +"a2a6aa11": "TileClaimed(uint256,uint256,uint256,address)", +"a2a6ca27": "setMinPerTx(uint256)", +"a2a746e1": "moveToInitiator(address,address,uint256)", +"a2a8336f": "claimEtherSigner(uint256)", +"a2a84a5d": "zonesSwarmAddress()", +"a2a8e279": "getTokensForEther2(uint256,uint256)", +"a2a957bb": "setFee(uint256,uint256,uint256,uint256)", +"a2a96799": "totalSuply()", +"a2a9a6c1": "satellite()", +"a2a9d1ef": "initReverseENS(address)", +"a2aa0724": "enterLottey()", +"a2aaa10e": "DigiCrowdSale()", +"a2ab2686": "participatePresale()", +"a2ac0a1a": "getUserAssetBalance(address)", +"a2ac5360": "calculateFounderCut(uint256)", +"a2aca613": "buyLicense(address,address,string)", +"a2ad16ed": "WinEToken()", +"a2ad360f": "SUV()", +"a2adaf15": "isOpened(uint256,uint256)", +"a2ae72ec": "open_commitment(uint256)", +"a2ae86ac": "setUntsqm(uint256)", +"a2af0e37": "assignPlayer(string,address)", +"a2af5fe9": "content(string,string,string,uint256)", +"a2b038b3": "addOffChainRaisedContribution(address,uint256,uint256)", +"a2b0867d": "Admined(address)", +"a2b0f9f6": "setMaxWeiForVerificationLevels(uint256,uint256,uint256)", +"a2b144f0": "getGasForMcr()", +"a2b1da51": "inflat(uint256)", +"a2b21d7d": "trainSpecial(uint256,uint256,uint256[2],uint256[2])", +"a2b40d19": "changePrice(uint256)", +"a2b424b1": "firstPresaleEnd()", +"a2b475f3": "levelOneBonus(uint256)", +"a2b5591c": "oraclize_query(uint256,string,string[],uint256)", +"a2b60f43": "EmployeeMigrated(address,address,uint256,uint256)", +"a2b6cbe1": "deleteTxDataBlockNumber(bytes32)", +"a2b6f0ec": "addRewardToPendingWithdrawals(uint32)", +"a2b7976d": "bbye()", +"a2b7a18b": "BCE()", +"a2b7e23d": "queueMode()", +"a2b8891e": "getFreeKebaber()", +"a2b8bc77": "domain_reward(address,uint16)", +"a2b946aa": "getNewGame()", +"a2bad039": "getCompte_27()", +"a2bb5d48": "get_username(address)", +"a2bb635a": "WhitelistedAddress(uint256)", +"a2bbeac2": "Shares(string,string,uint256,uint256)", +"a2bc0e31": "testCheckRokTeam()", +"a2bc183f": "secondPlacePot()", +"a2bc1cd4": "getNumEthOfferors()", +"a2bc2eef": "CipherPlayToken(address,address)", +"a2bcb304": "setfanbei(uint256)", +"a2bccae9": "plyrRnds_(uint256,uint256)", +"a2bcee8b": "build_creature()", +"a2bd018c": "targetDiscountValue3()", +"a2be1761": "addDiscounts(address[],uint256)", +"a2be19fb": "assignPoliceToReport(uint256)", +"a2be23cd": "BASIC_RATE()", +"a2be427d": "updatePlayer(uint256)", +"a2bf1d06": "DURATION_NONUSETEAM()", +"a2bf68b9": "membership()", +"a2bf6939": "setTokenValue(uint256)", +"a2bf6f7e": "ClaimedStatus(address)", +"a2bfae64": "mmin(uint128,uint128)", +"a2c030a5": "changeRootAuthority(address)", +"a2c17459": "getCreateUnicornFullPriceInCandy()", +"a2c25131": "LogItemUpdate(uint256)", +"a2c2ed9b": "killContract(uint256)", +"a2c3a542": "getFallbackDepositPeriod()", +"a2c3b256": "receiveCheck(address)", +"a2c3bd83": "TokenInvestment(address,address,uint256)", +"a2c41366": "getIcoBonus()", +"a2c44503": "doesUserHaveBalance(address)", +"a2c4895a": "encodeOperator(uint256,uint256)", +"a2c4a06f": "startTimeOne()", +"a2c4c336": "getPurchaseReturn(address,uint256)", +"a2c4d268": "addToRef(uint256)", +"a2c52c4d": "CoreMediator()", +"a2c6fa83": "transferFromStudio(address,address,uint256)", +"a2c77e68": "isLeftTokens(uint256)", +"a2c8b76b": "getPriceFor(uint256,uint256,uint256,uint256)", +"a2c93406": "blinc()", +"a2c99d47": "rateAfterValidation(uint256,bool)", +"a2c9d630": "manualPrice()", +"a2cc1f62": "disagree(address)", +"a2cdd471": "cc()", +"a2cdd82f": "setAuctionObj(address,uint256,uint256)", +"a2ce0f87": "min_contribution()", +"a2ce4215": "TOKEN_PREICO_CAP()", +"a2ce588d": "roundExpired()", +"a2cff990": "getHeroCurrentLevel(uint256)", +"a2d0b147": "RedTicket(uint256,address)", +"a2d0f942": "canRedeemUTXOHash(bytes32,bytes)", +"a2d10ba5": "kyber()", +"a2d1c624": "checkKingFounder(address)", +"a2d1cf11": "propheciseExecute(address)", +"a2d24c5e": "getFirstTranche()", +"a2d39bdb": "addKey(address,uint256)", +"a2d3e2be": "ReleaseTimeChanged(address,uint256,uint256)", +"a2d435d4": "icoTotalCollected()", +"a2d46832": "speech(uint16)", +"a2d4db9c": "newUpload(bytes32,string,uint16,bytes32)", +"a2d57853": "receiveApproval(address,uint256,bytes)", +"a2d5b8bf": "withdrawBoardMeetingFees()", +"a2d6a926": "CapCoinInternational()", +"a2d6d382": "videos(bytes32)", +"a2d6f8de": "startEarlyStage4()", +"a2d74227": "spendToken(uint256)", +"a2d74b29": "setJobHiringDone(uint256)", +"a2d819b4": "getSenderSig()", +"a2d83b5e": "update(address,uint256)", +"a2d89edf": "bountyInit()", +"a2d97fa7": "TimeLockr()", +"a2da2b47": "ausGroupReleaseDate()", +"a2da84f8": "setCAOAmount(uint256[])", +"a2db644e": "vestingTransfer(address,address,uint256)", +"a2dc7dcf": "initialize(address,address,address,address,address,address,address,address,address,uint256,uint256,uint256,uint256[])", +"a2dc9d9c": "ChangeMessage(string,string)", +"a2dcb5d4": "bindUserWithBoard(uint256,address)", +"a2dd2e96": "InitCancel(address)", +"a2dd3283": "setICOContract(address,address)", +"a2dd9dd3": "canMateWith(uint256,uint256)", +"a2de29d4": "setReleaseAmount(address,uint256)", +"a2de45b7": "Listed_Validated(uint256,string)", +"a2de5b50": "buyWithPromo(address)", +"a2dea26f": "sendAllocation(address)", +"a2deadbd": "getTransactionHash(bytes)", +"a2dee527": "setSaleBonus(address,address,uint256)", +"a2df26f5": "printMarket(int256)", +"a2df6c42": "splitFirst(string,string)", +"a2df7465": "DeepToken(address,address,address,address,address)", +"a2dfa2f0": "buySampleTokens(address)", +"a2e0ee3e": "theWinningReferral()", +"a2e1a8d8": "isOwnerAddress(address)", +"a2e23a51": "TAIL_EMISSION()", +"a2e2842e": "ChannelSecretRevealed(bytes32,address)", +"a2e2998c": "setPricePerMessage(uint256)", +"a2e3750c": "preSaleCSSC()", +"a2e38b54": "getTransactionIds()", +"a2e40e50": "endorse(bytes32)", +"a2e55e88": "IQB()", +"a2e5f168": "DaoAccount(address,address)", +"a2e62045": "update()", +"a2e65477": "changePeriod(uint256,uint256,uint256)", +"a2e7223e": "isNewPlayer(address)", +"a2e7241c": "citizensAddresses(uint256)", +"a2e800ad": "rounds()", +"a2e841ba": "getUnprocessedQueryBytes32(uint256)", +"a2e855a5": "batchFillOrKill(address[5][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[])", +"a2e91477": "publicSaleStarted()", +"a2ea2aaf": "CreateToken()", +"a2ea771f": "receivedTokenOf(address)", +"a2ea7c6e": "getSchema(bytes32)", +"a2ea80f9": "setPayableEnabled(bool)", +"a2ea9883": "OwnerChanged(address)", +"a2eaa896": "winningBidder(string)", +"a2eb0d01": "gift_CreateTINAmotleyLine(string)", +"a2eb164d": "lockUpdateTokenAccount(address,bool)", +"a2ebaa1d": "TEAM_PERCENT_EVE()", +"a2ebb20b": "icoHolder()", +"a2ec191a": "addDSource(string,uint256)", +"a2ec258f": "future()", +"a2ec2957": "updateInvestorDates(uint256,uint256)", +"a2ec5414": "getAllowanceExpiration()", +"a2ee1a27": "sellPrice_wie()", +"a2ee4000": "cancelSalesOffer(bytes32)", +"a2ee8669": "PussyToken(uint256,string,string)", +"a2eeb5d4": "pyramid(uint256)", +"a2f09dfa": "addFund()", +"a2f1607c": "_calcLockRewardPercentage()", +"a2f16d80": "dexWithdrawCollectedFees()", +"a2f182d4": "setLimits(uint256,uint256,uint256,uint256,uint256)", +"a2f23659": "VPCx()", +"a2f26fb2": "FTTIssued(address,address,uint256,uint256)", +"a2f3139c": "stagedVestedLockUpAmounts()", +"a2f35f44": "addNewAddress(address)", +"a2f37360": "addSponsorshipAmount(address,uint256,uint256)", +"a2f39dc6": "OLDSPTI()", +"a2f3ba5b": "setSynthetixState(address)", +"a2f3ede2": "computeNameHash(bytes)", +"a2f44e72": "p_update_action(uint256,address,address)", +"a2f45660": "Purchase(address,address,address)", +"a2f4f550": "getDataPointForSubject(uint256,uint256,int256)", +"a2f56b2c": "refundEth(bytes32,address,uint256)", +"a2f5ee48": "CarbonExchangeCoinToken()", +"a2f6e5fb": "ViewMyDivs(address)", +"a2f77bcc": "getGame(uint256)", +"a2f78d7a": "startICO(address,address)", +"a2f792d5": "AdministratorAdded(address,address)", +"a2f7a2e0": "changeIcoPhaseAmounts(uint256[])", +"a2f7b3a5": "instances(uint256)", +"a2f7b7fd": "callTokenFallbackIfNeeded(address,address,uint256,bytes)", +"a2f7f58f": "getBetAmountOf(uint256,uint256)", +"a2f91af2": "cage(uint256)", +"a2f95b44": "committeesArray(uint256)", +"a2f9eac6": "persons(uint256)", +"a2fa0157": "isAssetActive(address)", +"a2fb1175": "winners(uint256)", +"a2fb342d": "lend(address,uint256)", +"a2fb98fa": "starting_clones()", +"a2fba23c": "holderGroup(address)", +"a2fbe98c": "haveIWon()", +"a2fc0bd5": "BuyEvent(address,uint256,uint256,uint256)", +"a2fc2254": "LAFINAL3()", +"a2fcd1af": "amountRaisedInUsd()", +"a2fd0179": "unlockBatchOfAddressesAfterITO(address[])", +"a2fdea11": "getBonusCoefficient()", +"a2fe802b": "isExit()", +"a3000128": "getContributionHash(address,uint256)", +"a3006abf": "buyBoosterPack()", +"a3006f5f": "CETFToken()", +"a300aa66": "RIKCoin(address,address)", +"a300c6ae": "confirmCollRecv(uint256)", +"a300eadf": "_getAllParents(bytes32)", +"a3011a02": "WatcharaHashCoin1()", +"a301b493": "Milestone_IcoFailed(string)", +"a3022667": "modifyAllLevelCaps(uint256[])", +"a302fdf1": "WHITELIST_BONUS_RATE()", +"a3030b10": "getTournamentBattleResult(int256,int256,uint256,uint256,uint256)", +"a3031b77": "getTradeCount()", +"a3032f25": "claimTreshold()", +"a3035454": "WeiControllerFactory(address)", +"a30376b7": "getReferralCount(uint256)", +"a3045113": "payUp()", +"a304f625": "updateInheritedEarlyParticipantWhitelist(address,uint256)", +"a3053236": "SafeInvestments()", +"a305ac76": "futureHolder()", +"a306e754": "batchIssueTokens(uint256)", +"a3078815": "darknodeOwner(address)", +"a307b727": "refund(bytes32,string,address)", +"a3082be9": "GoodLuck(uint256,uint256)", +"a30872db": "tierContract()", +"a308c2a7": "validReferralCode(string)", +"a30955af": "balanceToken()", +"a309800c": "_withdrawWei(uint256)", +"a309f2ee": "setBalanace(bytes32,address,uint256)", +"a309f589": "crowdsaleRatio()", +"a30a86fe": "setMainSaleParameters(uint256,uint256,uint256,uint256)", +"a30b5c69": "AttributeModel()", +"a30bdea4": "isOffchainWhitelisted(address,bytes)", +"a30c5f17": "get_root()", +"a30cc5f6": "multiFixed(uint256[2][6])", +"a30d5627": "ItemToken()", +"a30d59c9": "getEggsCount()", +"a30eb0ef": "freeTokenTime()", +"a30eddcc": "bitSlice(uint256,uint256,uint256)", +"a30ef9e7": "toBase32(bytes)", +"a30f786f": "allowedRewardTokens()", +"a30fb52d": "sendGameGift(address)", +"a30fbae1": "endBuyBackDate()", +"a310293e": "weiDonated()", +"a31052e8": "clearReleaseTime(address)", +"a3106b95": "setMinterAddress(address)", +"a310f36a": "test2(bytes,uint256)", +"a3111d7c": "withdrawListing(uint256,address,bytes32)", +"a311a08e": "setPartners(bool,uint256,uint256)", +"a311c7c2": "collateralisationRatio(address)", +"a311d157": "addContributor(address,uint256,uint256)", +"a311d970": "TokenTycoonIGO()", +"a311dd70": "setArray(uint8[10])", +"a31271f5": "updCrowdSaleEnabled(bool)", +"a313c371": "memberInfo(address)", +"a31477b4": "getSncTokenIssuance(uint256,uint256)", +"a314acfe": "attemptToClaimCard(address,address[3])", +"a314dc2d": "feePayed()", +"a3155013": "month60Allocated()", +"a315acf5": "minter_address()", +"a315cda0": "priceOfSmartContract()", +"a316aa93": "setActivityDetails(uint256,string)", +"a3179fe0": "getAccountsNumber()", +"a317abc7": "defaultMax()", +"a318d521": "disableBeforeActivation()", +"a3194d50": "setFinished(uint8,bool)", +"a319b232": "VTCoin(uint256,string,uint8,string)", +"a31a9752": "Payout(uint256,bool)", +"a31b858d": "_buyDiscountTTM(uint256,uint256,address,address)", +"a31c5436": "TOKEN_AMOUNT_PRE_ICO()", +"a31caec8": "AkilosToken()", +"a31cc317": "evaluateContract()", +"a31cd710": "_getExpMultiple(int256)", +"a31d291a": "HOHO(uint256,string,string)", +"a31d30a5": "WhitelistUpdated(uint256,string,address,uint256)", +"a31d5580": "Registrar(address,bytes32,address)", +"a31e3678": "addExceptAddress(address,address)", +"a31e5e97": "setHouseAddressOne(address)", +"a31e88c2": "numIntervals()", +"a31f2c52": "partner2_voted_update_prenup()", +"a31f61fc": "setGroupCap(address[],uint256)", +"a31f79fb": "slopeReleasePercentage()", +"a31ffa30": "setCtuContract(address)", +"a3201daa": "setPrices(uint256)", +"a3208c1e": "addUserIntoBlacklist(address)", +"a3210e87": "sendeth(address,uint256)", +"a3221c8e": "step8()", +"a3223d50": "ETHER_MIN_CONTRIB_USA()", +"a322accf": "tokenFallbackExpanded(address,uint256,bytes,address,address)", +"a322c40e": "toString(int256)", +"a322d49e": "FirstTradingEcosystemCoin()", +"a323a748": "SBT()", +"a323af85": "hasTwoStepWithdraw()", +"a323bdb4": "currentPublicSale()", +"a3240455": "offerStarForSale(uint256,uint256)", +"a3246549": "stageOneClosed()", +"a324ad24": "getMonth(uint256)", +"a324cca0": "optimalLog(uint256)", +"a324ed9f": "BurnUnsoldToken(uint256)", +"a324f8bf": "tanksBeforeTheNewTankType()", +"a32508a1": "Carpati()", +"a3262e57": "burnCoin(uint256)", +"a32710eb": "setRole(address,address)", +"a3273535": "tdeDuration()", +"a327a958": "numCourse()", +"a327c45d": "dev1()", +"a328f90b": "_nextBudgetStartAndEndAndOfficalVotingTime()", +"a3293c0e": "handToCards(uint32)", +"a32a6737": "setTotalDeposit(address,uint256,address)", +"a32ac9e1": "Bitcoin_IDToken(uint256,string,uint8,string)", +"a32af535": "depositAndFreeze(address,address)", +"a32affeb": "loadEarlyParticipantsWhitelist(address[],uint256[])", +"a32bf597": "getCurrentRound()", +"a32c3bd6": "GetBounty(address,uint256)", +"a32cb608": "getReverseRate(address)", +"a32ce11e": "approvals(address,address)", +"a32e935a": "allocateTokenForTeam()", +"a32f0f41": "testFailControllerUnapprovedTransferFrom()", +"a330814c": "unregisterAuditor(address,address)", +"a3316ccc": "RATE_SALESTAGE7()", +"a3318359": "sendPrizes()", +"a331939d": "freezeAdmin()", +"a331cd38": "toKeyValue(uint256,string)", +"a3322a12": "getFilesCount()", +"a332853a": "futureDevelopmentFundAddress()", +"a3330574": "checkAndMint(uint256)", +"a333658f": "addTreasuryManager(address)", +"a333f96d": "LogRefundProcessed(address,uint256)", +"a33467cf": "getClue2()", +"a334edf6": "consumeWine(uint256)", +"a3358ae4": "REAPER_INTREPID_EXTRACTION_BASE()", +"a335b828": "FUS()", +"a337840c": "setGuardianRune(uint256,uint256)", +"a338bd2c": "showTopBonusBalance()", +"a338eba5": "sendTokens(address[],uint256)", +"a3393a35": "getDrawEthAmount(uint256,address,uint256)", +"a3395a52": "searchTicketsXaddr(address)", +"a339aaf7": "addOracles(bytes4[],address[])", +"a339abd5": "crowdsaleOpeningTime()", +"a339c18f": "ACNNIco(uint256,uint256,uint256,address,address)", +"a339c21a": "addContractTestToBounty(address,address)", +"a33a5225": "allRefererTokens()", +"a33b7510": "shareAddEtherValue()", +"a33bea16": "GENEOSSale(uint256)", +"a33c0972": "tokenAllocToCompany()", +"a33cbc55": "TCI_admin()", +"a33d4968": "Tripler()", +"a33d5d9d": "EthDev()", +"a33d652e": "setFunding(uint256)", +"a33dd801": "setTreasuryBalance(uint256)", +"a33e1d16": "drapcoin()", +"a33e6b07": "AccountFrozen(address,bool)", +"a33e8d62": "RxEALTokenContract()", +"a33eaa0b": "_setTokenUri(uint256,string,string,string,uint256)", +"a33ed39d": "numRef()", +"a33eff5a": "createResource(bytes32,bytes32,bytes32)", +"a33f3939": "setNetwork()", +"a340295a": "setPhoenixOwners(address[19])", +"a340ceac": "transfekbolOwnership(address)", +"a340cf79": "paid(address)", +"a340d587": "offlinePurchase(address,uint256)", +"a3414653": "COIN_COST_ICO_TIER_1()", +"a3429689": "TaiCoin()", +"a3435da5": "BONUS_LEVEL_3()", +"a3451568": "airdropBatchTransfer(address[],uint256)", +"a3454712": "AssetCreated(address)", +"a34560be": "updateEtherCap(uint256)", +"a34574f0": "gamers()", +"a346b62d": "CaptainKitties()", +"a346e536": "week_winner()", +"a3472270": "mock_getAddress(uint256)", +"a347ef84": "calcpustprice(uint256,uint256)", +"a348ea79": "contests(address)", +"a34945db": "maxAllowedBetInEth()", +"a3494fdc": "expectRefund(uint256)", +"a349bfa2": "addOwner(address,uint256,uint256)", +"a349d683": "FRP()", +"a34ad6b6": "clockmint()", +"a34bbf51": "getGeneralInfo()", +"a34c6716": "testHashing(address,uint256,address,uint256,uint256,uint8,bytes32,bytes32,bytes32)", +"a34cc845": "win(address)", +"a34d2ff7": "votingBymy(bool)", +"a34d42b8": "setContractOwner(address)", +"a34d5312": "registryRequestVendor()", +"a34d5f82": "GiveBlockReward()", +"a34d7c11": "flipCoinWithEther(uint8,uint8)", +"a34d9270": "setMinInvestedLimit(uint256)", +"a34d942b": "FUXEToken()", +"a34dffba": "SILVER_AMOUNT_NDC()", +"a34e5990": "setTier(uint256,uint256)", +"a34e9e66": "approveBcoupons(address,uint256)", +"a34edc03": "assertTrue(bool,string)", +"a34f42a9": "LogRandom(uint256,uint256)", +"a34f82f4": "summFounders()", +"a34fc5ac": "_lockTokens(address,uint256)", +"a350539e": "makeBid(uint32)", +"a3508b17": "getOpenedStageIndex()", +"a35132ac": "SMSReward(address)", +"a3515b98": "initializeWeekData(uint256)", +"a352f1a8": "calcSHA3(bytes)", +"a3536b0c": "calculateHolderPiece(address)", +"a353c600": "Ponged(uint256,string)", +"a35523da": "currentLoanDayTime()", +"a356fdf3": "getPreICOPercentage(uint8)", +"a3577e93": "depositFunds(bytes,uint8[2],bytes32[2],bytes32[2])", +"a357880d": "whitelistedAddrs(address)", +"a3580695": "inSpecialSalePeriod()", +"a358aa18": "_transferFromInvestor(address,address,uint256)", +"a35a319b": "delFromBlackList(address)", +"a35aae9c": "roundID_()", +"a35ae3ab": "Bam()", +"a35bc497": "remainTime(uint256)", +"a35bd437": "toUSD()", +"a35bd591": "newRound(uint256)", +"a35bfcac": "ownerRemoveRole(address,string)", +"a35cad77": "maxLeaders()", +"a35cfa22": "make_move(uint256,uint8,uint8,uint8,uint8)", +"a35d631a": "PausableMock()", +"a35d6dd6": "rDEX()", +"a35d78a6": "_approvedGen1(address,uint256)", +"a35da419": "setlock(bool)", +"a35e617f": "setMaxCount(uint256)", +"a35e83ea": "getReplay(uint256,uint256)", +"a35f9514": "calcDstQty(uint256,uint256,uint256,uint256)", +"a360098f": "Immigration(address,address)", +"a360b26f": "Migrations()", +"a361b184": "move(bytes32,bytes32)", +"a3624b72": "finalizeTransferAddressType()", +"a362858a": "EthereumCashPro()", +"a36298c7": "totalLimit()", +"a362cf0c": "TrueWorld(uint256,string,string)", +"a363f269": "watchMovie()", +"a3641c84": "card_metal_first()", +"a364b5c1": "setProposalNames(bytes32[])", +"a365bd9f": "BaseToken(string,string,uint256)", +"a365f3cc": "Util()", +"a3666d23": "weekTwoPriceRiseBegin()", +"a367b891": "SplitPhaseDistribution(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"a367d99a": "investStart()", +"a367e565": "setIBalances(uint256[],uint256[])", +"a368107b": "SetRecordType(uint32)", +"a369658c": "TARGET_EVE()", +"a369b0ac": "depositsClosed()", +"a369bb28": "SaleWallet(address,uint256,address)", +"a36a0551": "createCarrierFromVault()", +"a36a48a5": "ETH500on719()", +"a36a7526": "setOp(address)", +"a36b15d0": "enableBundlingMultitoken(uint256)", +"a36b8af1": "LogItemModified(address,uint256,uint256,bytes32,bytes32,bytes32)", +"a36badd7": "hasJobRecommendations(address,address,uint256)", +"a36be43a": "SetFreeYOU(uint256)", +"a36be9a1": "paybackDeadline()", +"a36c2cbe": "informarOng(address)", +"a36c8ec2": "UpdateContractorAddress(address)", +"a36db282": "SendLCRTokens(address,address,uint256)", +"a36ddfae": "_0xForkTokenToken()", +"a36f127e": "removePresetTransfer(address)", +"a36f259d": "campaignOf(address)", +"a36ff98b": "team1Points()", +"a36ffd4d": "ADEToken()", +"a37173e9": "transfer_left_funds_to_project()", +"a37218ed": "MAMECOIN()", +"a3721adc": "contractCreationBlockNumber()", +"a37330ea": "getDestroyedWhenRoundOver()", +"a3743afc": "getProjectHour(uint256)", +"a374480a": "placeValue(address)", +"a3744828": "GetPriceByN(uint256)", +"a3747fef": "register(bytes,bytes)", +"a375de4f": "addTokensToBank(address,uint256)", +"a37641ff": "MAX_RING_SIZE()", +"a3766f88": "tokenVendor()", +"a376c19d": "setEventResult(string)", +"a377104c": "init(string,uint256,uint256,uint256)", +"a377b34e": "YoloToken(uint256)", +"a377ff17": "setHorseDataAddr(address,address)", +"a3787858": "resumeBlockNumber()", +"a37889a9": "createPromoGirl(uint256)", +"a378bba5": "gameEnds()", +"a3792985": "getBonusDropsOf(address)", +"a37936f9": "SuspendEmployee(address,uint32)", +"a379e626": "ownerPerThousandShareForBuying()", +"a37a3859": "configPerFund()", +"a37a778f": "SetIPR(string,string,address,string,string,uint256,string)", +"a37ba32a": "duration(bytes32)", +"a37be00f": "transferBackTo(uint256,address)", +"a37be75f": "ethBase()", +"a37c314d": "set_iconiq_tokens(address,address,uint256)", +"a37ccabc": "PositionBought(uint256,uint256,uint256,address,uint256,uint256)", +"a37d1556": "refAmount(address)", +"a37da615": "showInvestedNum(address)", +"a37dec33": "calculateWineSell(uint256,uint256)", +"a37e66f5": "ethPendingManagement()", +"a37e6f69": "failedByDeveloper()", +"a37f00f7": "getItemByTokenID(uint256)", +"a37fd390": "setHomeAdv(uint256,string)", +"a380dcb9": "wpp()", +"a381de54": "bonusAddress()", +"a382aee2": "fourthExchangeRate()", +"a382edfd": "SeeleGold()", +"a38320e6": "TITANToken()", +"a3833a13": "balanceOfColdWallet()", +"a3848b1a": "getMonsterIVs()", +"a384af00": "market_BuyForSale(uint256)", +"a384d6ff": "lowerBound()", +"a38591fc": "test_percOf1()", +"a3863d81": "buyTokensLowLevel(address,uint256)", +"a38717f4": "exFeeTotal()", +"a3875883": "etherPriceUSDWEI()", +"a387cf34": "closeTokenSale()", +"a3885413": "withdrawOwner(address,uint256)", +"a388a836": "DDAContract(address)", +"a3893a33": "changeExchanger(address)", +"a3895fff": "changeSymbol(string)", +"a389783e": "isApproved(address,address)", +"a389ef53": "receiveDeposit(uint256,uint256)", +"a38b68cb": "nonzeroAddressesLengthForApi(uint256)", +"a38b8469": "TokenADSVENTURE()", +"a38b9a19": "printQuotation()", +"a38c48b6": "createProductionUnit2Beta()", +"a38ce2b4": "revokeAddress()", +"a38deeab": "Grid(uint16,uint256,uint256,uint256)", +"a38eb622": "pauseBuy()", +"a38f18a0": "RedBlueToken3()", +"a3907d71": "enable()", +"a3908e1b": "convert(uint256)", +"a3912ec8": "receiveEther()", +"a3916164": "withdrawInvestments()", +"a391c15b": "div(uint256,uint256)", +"a3922eac": "setCategories(address,uint256,uint256)", +"a3926f14": "PixelsMain()", +"a392f54a": "giveMeCoins(uint256)", +"a3934de4": "Upgrade(uint256,address,address,address)", +"a39385de": "transferWithReferenceCallGas()", +"a393dc44": "_totalsupply()", +"a393fb0f": "reducemoney(address,uint256)", +"a39417f9": "LOG_NewBet(address,uint256)", +"a39495f0": "isPreallocated()", +"a394bbc8": "isRegisteredParticipant(bytes32)", +"a395e2cc": "TPLAYToken(uint256,string,string,uint8)", +"a3961207": "amountOfRedemptionPayouts()", +"a3964cb9": "toB32(bytes,address,bytes)", +"a396541e": "getPongvalTxRetrievalAttempted()", +"a397d8e0": "getUnusedBalance(address)", +"a398063a": "setEmergentHalt(bool)", +"a3980dd7": "Readycoin()", +"a3988500": "CloudexchangeCrowdsale(uint256,uint256,address)", +"a398b89b": "receivedEther(address,uint256)", +"a39953b2": "startCrowdsale()", +"a399eb76": "ZoharTC()", +"a39a2b76": "dropUnitPrice()", +"a39a45b7": "replaceOwner(address)", +"a39a70a9": "developReserveTimeLock()", +"a39aaec6": "getCompte_37()", +"a39ab3a3": "bla(address)", +"a39ad747": "minVote()", +"a39b10d2": "lastBlock_a17()", +"a39d716d": "WithdrawBalance()", +"a39db022": "changeBonus(uint256,uint256,uint256)", +"a39dc9be": "HOUR()", +"a39e1149": "getSECOND_STEP_MULTIPLIER()", +"a39eede8": "settleAssets()", +"a39f7449": "startTimer()", +"a39f9712": "sendTokensAfterBuy(address,uint256)", +"a39fa2f6": "VPE_address()", +"a39fac12": "getAddresses()", +"a3a06c54": "endICOPhase()", +"a3a0b937": "transferFokenWhitelisted(uint256)", +"a3a0ee24": "evFreeze(address,uint256)", +"a3a183c1": "overflow(address)", +"a3a187cf": "TokenBought(address,uint256)", +"a3a1cd6d": "getNumberOfKnownPropertyAddresses()", +"a3a1d015": "failUserRefund(uint256[])", +"a3a27105": "stakeholderPayment(address)", +"a3a402a7": "deletefromblacklist(address)", +"a3a40323": "ArtificialNeuralNetwork()", +"a3a40ea5": "getCurrentPhase()", +"a3a4851a": "deliveryReject(address)", +"a3a48785": "unsetClaim(uint256)", +"a3a4a18b": "test_claimShares_emptyFeePool_isTranscoder()", +"a3a4ba31": "createChild()", +"a3a4c74d": "closeAutoFree(address)", +"a3a51983": "updateCurrentStage()", +"a3a5650a": "currentStageMaxSupply()", +"a3a6a43e": "approveUserKYC(address)", +"a3a6c73e": "_isIdExisted(string)", +"a3a7647c": "tier1Count()", +"a3a7b804": "changeMaxGasprice(uint256)", +"a3a7e7f3": "transferAll(address)", +"a3a81d40": "totalBGX()", +"a3a82678": "collectRef(address)", +"a3a9196a": "dexTestNormalTransfer(address,address,uint256)", +"a3a93721": "SYLVIe()", +"a3a9d67b": "AdviserCasperToken()", +"a3aa1913": "balanceDetails(address)", +"a3ab5045": "isNewTile(uint16)", +"a3aba50e": "referrerEnable()", +"a3ad1676": "isPurchasedEpisode(uint256,address)", +"a3adb958": "transferToggleRequester()", +"a3ae2f5c": "award(uint256,address)", +"a3ae88a0": "totalUSD()", +"a3b01f23": "intoverflow_add(uint256)", +"a3b0bff4": "getPersonalStakeActualAmounts(address,address)", +"a3b0c661": "setLineUpEnable_default(uint256)", +"a3b1dc52": "logEscapeHatchChanged(bool)", +"a3b2363d": "parentAddress(address)", +"a3b24dcd": "getSumsHash(address)", +"a3b2938d": "updateStatusInternal()", +"a3b2c41e": "readArticle(bytes32)", +"a3b34190": "unlockSecond()", +"a3b3fff1": "getVotingToChangeMinThreshold()", +"a3b42cba": "register(bytes8,bytes8,uint256)", +"a3b4ab48": "BBPToken(address,uint256)", +"a3b4b07f": "ACL_APP()", +"a3b6120c": "dateStart()", +"a3b61cf0": "getuserprize(address)", +"a3b62bc3": "AdminRemoved(address)", +"a3b65d29": "getarg_3()", +"a3b80993": "WorkValley()", +"a3b8cd3b": "_equipDownOne(address,uint16)", +"a3b908ff": "unusedOf(address)", +"a3b922ca": "buyPandaERC20(address,address,uint256,uint256)", +"a3b959da": "change_dev(address)", +"a3b9b8d1": "receivePaymentForOraclize()", +"a3bbc294": "galleassTransferFrom(address,address,uint256)", +"a3bbf81b": "USACOIN()", +"a3bc3fce": "getFillOrderMinGasNeeded()", +"a3bc6163": "getMessageGas()", +"a3bdc655": "getRemainingTimeTillExpiration()", +"a3be094d": "countTokens(uint256)", +"a3bef4d7": "numVotes()", +"a3bf5b9a": "revokePermission(address)", +"a3bfdf47": "closeSession(uint256)", +"a3bfe069": "_sumActivePerks(uint8[32])", +"a3c07c6a": "removeHatchingTime()", +"a3c0a477": "crowdsaleIsActive()", +"a3c1954e": "supporter()", +"a3c1d83d": "forgiveMeOnBehalfOf(address)", +"a3c28dfc": "eventExists(uint256)", +"a3c2c462": "totalReceived()", +"a3c441e7": "setAdvisoryWallet(address)", +"a3c49da0": "DollarCoin()", +"a3c50b32": "orderDetails(bytes32)", +"a3c66c1d": "notEqual(bytes32[],bytes32[],string)", +"a3c68e3d": "CancelGameAfterResultsPublished()", +"a3c86bef": "AcademyToken(address)", +"a3c88b31": "addInternalBalance(uint256)", +"a3c8ef7a": "signedByWhiteHat()", +"a3c9df3f": "plutocrat()", +"a3c9fc7d": "_withdrawTo(uint256,uint256,uint256,uint256)", +"a3ca17b2": "getUSDETHPrice()", +"a3cb3e97": "removeHatchingTimeWithToken(address)", +"a3cb679d": "getTotalBets()", +"a3cbf67d": "NewBOP(address,address,address,uint256,bool,uint256,string)", +"a3cc8b9c": "changeRateUSD(uint256)", +"a3cd2d78": "nextReward(uint256)", +"a3cd4065": "ReceiveBTC(address,uint256)", +"a3cf3ec0": "lowestAddressReserving()", +"a3d07452": "fightAuction()", +"a3d2078b": "TokenSaleOpened()", +"a3d23e52": "round2Cap()", +"a3d3a265": "setCreditBond(address)", +"a3d4e4b5": "buyItem(uint8,uint8,uint256,uint256)", +"a3d53934": "MegaToken()", +"a3d5e8e0": "_update(uint256,string)", +"a3d5ec39": "PlynToken()", +"a3d646fe": "ETHEUR()", +"a3d658dc": "extendLiquidationPeriod(uint256)", +"a3d6f9a9": "publicKeys(address)", +"a3d7bd43": "doSend(address,uint256)", +"a3d823ad": "changeORACLIZE_GAS_LIMIT(uint256)", +"a3d87805": "TerraToken(uint256)", +"a3d88453": "isAvailableAccount(address)", +"a3d8fdd5": "totalAccessorySeries()", +"a3d94402": "safeMathAdd(uint256,uint256)", +"a3d9c3d1": "ApprovalHash(bytes32,bytes32,uint256)", +"a3dab216": "setOpeningClosingTime(uint256,uint256)", +"a3dc65a7": "wipe(address,bytes32,uint256)", +"a3dc8a7a": "exrate()", +"a3dcb4d2": "receiverAddr()", +"a3dceacb": "MessageSent(uint256,uint256,string,string)", +"a3dd2619": "getCurrentStatus()", +"a3dd2b3e": "projectInfo(address)", +"a3dd3aa7": "setGBT(address)", +"a3ddc24a": "purchaseDeposit(address,uint256)", +"a3de9354": "createDividendWithCheckpoint(uint256,uint256,uint256,int256)", +"a3def923": "create(address,bytes32)", +"a3df30b4": "GIDe()", +"a3df870a": "hentaisolo()", +"a3dfc364": "StartGame()", +"a3dfcb0d": "_setUniqueValue0(uint256)", +"a3dfdf30": "read_i64_array()", +"a3e135fa": "reclaimTokien(address,address,uint256)", +"a3e14d74": "getLowerBoundBlocksTillGameEnd()", +"a3e1f666": "getCreatorMetadataOfHistoricalMetadata(string,uint256)", +"a3e20625": "giveReputation(address,bool,string)", +"a3e20d71": "transferUnPaidFundAccount(address,uint256)", +"a3e29360": "ownedTicketIdList(address)", +"a3e298d1": "VIBETPerEther()", +"a3e2b1de": "getProjectArbiter(bytes32)", +"a3e2ce24": "getTokensAndAmounts()", +"a3e31246": "setLucky()", +"a3e3a8e0": "withdrawEthPool(uint256,uint256)", +"a3e486d1": "ptc_balance(address)", +"a3e4c0c4": "setRandomizer(uint256)", +"a3e667b3": "releaseMany(uint256,uint256)", +"a3e67610": "tokenOwner()", +"a3e7061d": "getPaintingIdAtIndex(uint256)", +"a3e76c0f": "receive()", +"a3e787b5": "FITToken()", +"a3e831b4": "NewTokenFromFactory(address,address,uint256)", +"a3e860fe": "DEFAULT_RATE()", +"a3e8b6db": "MetrumcoinShares()", +"a3ea1376": "removeListingInternal(uint64)", +"a3ea478f": "setTier1Participants(address[])", +"a3eb6436": "TOKETH_PRESALE_TWO()", +"a3ebb0b3": "getConsideration(uint256)", +"a3ebeab7": "testConcatMemory4Bytes()", +"a3ec138d": "voters(address)", +"a3ec5616": "next(bytes,bytes,bytes,bytes,bytes,bytes,bytes,uint256)", +"a3ecbc33": "DSPUnregistered(address)", +"a3efc756": "transferPreICOFunds()", +"a3f144ae": "OFFSET19700101()", +"a3f1bd35": "getDouble()", +"a3f1ee91": "RequirementChange(uint256)", +"a3f22739": "payout(uint256,uint256,bytes32,bytes32)", +"a3f2a813": "StartsAtChanged(uint256)", +"a3f2d2b5": "SZA(uint256,string,string,uint8)", +"a3f31b80": "teamPayment(address)", +"a3f36da3": "ProRataDistribution()", +"a3f3dd32": "Verifier(uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[])", +"a3f424c2": "verifyProof(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[10])", +"a3f4df7e": "NAME()", +"a3f5a178": "approveTakeover(uint256,address)", +"a3f5c03d": "launchInvestment()", +"a3f5c1d2": "nexus()", +"a3f66b46": "newQuestion(string)", +"a3f67d6d": "playersCount()", +"a3f70ed3": "party_a()", +"a3f7c989": "enableStorage(bool)", +"a3f7e26d": "finishMintingIssuer()", +"a3f8eace": "releasable(address)", +"a3f991a5": "totalPot_()", +"a3face0b": "setInteractionPrice(uint256)", +"a3faef60": "MicroBitCoin()", +"a3fb5917": "getFirstOrder()", +"a3fb8f15": "getRaisedPOLY()", +"a3fbbaae": "changeManager(address)", +"a3fc136a": "signedApproveSig()", +"a3fc32c8": "getWLInfo()", +"a3fc81cb": "buyTokensViaBackend(address,uint256)", +"a3fca677": "LogBuy(address,address,uint256,uint256)", +"a3fcafb9": "soldCoins()", +"a3fcf9bc": "operationsPercentOfTotal()", +"a3fd6d0e": "feePaid(bytes4,uint256)", +"a3fdfee3": "deny()", +"a3fe0dc7": "userCrateCount(address)", +"a3fe70cb": "exchangeEnd()", +"a3ff0ea2": "issueAsset(bytes32,uint256,string,string,uint8,bool,address)", +"a3ff31b5": "getTokenStatus(address)", +"a3ff428e": "angelCardSeriesCollection(uint8)", +"a3ffac0d": "td()", +"a400594d": "lockAddress(address,address)", +"a4009e23": "TEST_MODE()", +"a400be54": "coinSendSameValue(address,address[],uint256)", +"a401d24d": "assignToken(address,uint256)", +"a401e585": "withdraw_privatefund(bool)", +"a4036b1c": "getAdPriceHour()", +"a4039098": "StartCompetitionEvent(uint32)", +"a4039a2a": "createNonRepeatableVpfFactory(string,bytes32,uint256,uint256,int256[])", +"a404f291": "microRate()", +"a40544c3": "notifyCancelSellOrder()", +"a4055f62": "freezeAccounts(address[],bool,bool)", +"a40668f5": "testDeregisterProduct()", +"a407db23": "GHK()", +"a407ee79": "bytes32ToAlphabetString(bytes32)", +"a4083849": "right44(uint256)", +"a4086854": "approveTransfer(uint256,address)", +"a4093718": "issueToken(uint256,uint256)", +"a4094a0d": "calculateFeeForAccount(uint256,uint256,address)", +"a409eb7b": "hasRequested(address)", +"a40a485f": "deathData_v3()", +"a40a99ac": "getInsertPointForNumTokens(int256,address,uint256)", +"a40ae4b7": "_uintToBytes(uint256)", +"a40bc352": "crowdSalePause()", +"a40c0a54": "USDGamblingToken()", +"a40c5221": "updateTokenAmount(address,uint256,uint256)", +"a40c8ad0": "addGenesisCatGroup()", +"a40cd3f3": "minContributionInWei()", +"a40cee9c": "updateIdentityImageURL(address,bytes32)", +"a40d32fe": "minPaymentAmount()", +"a40e0b91": "testGoalReached()", +"a40edb07": "processVerification(bytes32,string)", +"a40f1796": "prefixedHash(address)", +"a40fbd2b": "makeKebabs(address)", +"a410424e": "isMoneySent()", +"a4109017": "VanityTransfered(address,address,string)", +"a410a7f2": "getParticipantTickets(address)", +"a410f4b1": "changeFeePercentage(uint8)", +"a4112088": "Add_Company(uint256,string,string)", +"a412c6fc": "getRules(string)", +"a412f87c": "verifyInvestment(address,uint256)", +"a412fcc7": "defineType(string,uint8,uint8,uint32,uint8,uint32,uint8,uint32[5],uint32[5],uint32[5])", +"a413245a": "deductFromBond(address,uint256)", +"a41347e3": "usersCanTransfer()", +"a4136272": "MAX_TOKEN_SALES()", +"a4136862": "setGreeting(string)", +"a4144681": "RK40Z()", +"a414b00d": "SUNToken()", +"a414b379": "addContact(address)", +"a414e089": "Dimacoin()", +"a415833b": "numPurchasesOf(address)", +"a415965c": "refillMultiSigMintPool()", +"a415a93e": "initWithShips()", +"a415b8eb": "getCCH_edit_31()", +"a416b263": "charAt(bytes32,uint256)", +"a416b48c": "getActionCount(uint256)", +"a417357c": "unpauseTokens()", +"a419165e": "TokenCappedCrowdsale()", +"a41942a4": "transferCuratorship(address)", +"a419b0e7": "set_milestone_details(uint256,string,string,string,string,string)", +"a419f1e7": "NewPlayerAdded(uint256,uint256)", +"a41a9445": "getStopTransfer(address)", +"a41b3887": "setPrefixPrice(uint256,uint256)", +"a41b9c31": "unconfirmAddress(address)", +"a41d0584": "fixAddress(address,uint256)", +"a41da348": "fomo3d()", +"a41dedcc": "testAbs()", +"a41e61a4": "minSaleBalance()", +"a41e7d51": "updateERC165Cache(address,bytes4)", +"a41f0069": "GershToken()", +"a41fd917": "getUnprocessedQueryList()", +"a41ff1e5": "maxMintingDays()", +"a4201125": "sanToLower(string)", +"a4202504": "getPhaseSold(uint256)", +"a4202615": "makeAdoptionOfferToAddress(bytes5,uint256,address)", +"a4204e39": "getQuotes()", +"a42214b2": "cancelAuctionEmergency(uint256)", +"a422b761": "tokensIssued(address)", +"a422c0ca": "updateBonusParameters(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"a4230bd5": "addAdmin(address,bool)", +"a4238d31": "receiveBalanceUpdate(address)", +"a4245527": "getPaintingOriginal(uint256)", +"a424fa49": "NPXSToken()", +"a42533c8": "tubParamUpdate()", +"a4254fb4": "couponTokenBountyAddr()", +"a425b752": "destroyStake(address,bytes32,uint256,uint256)", +"a4262254": "calcFib(uint256)", +"a4268de6": "oracleItQuery(uint256,string,string,uint256,uint256)", +"a426cd19": "validPLAContract(uint32,uint32)", +"a4275535": "XTYF()", +"a4276533": "getProposalNum()", +"a427c5d9": "bonus(uint256,address[],address,uint256[])", +"a427ee36": "FruoCoinBETA()", +"a428033f": "minechaincoin(uint256,string,uint8,string)", +"a428517b": "Converted(address,uint256)", +"a4288d17": "tokensForReservedFund()", +"a429845e": "newCrowdsale(bytes32,uint256,uint256,uint256,uint256)", +"a42aa488": "checkRevert(uint256)", +"a42ac803": "getBonusAffiliate(uint256)", +"a42ad8b3": "NomuraDynamicsCoin()", +"a42b0d88": "advisorsPool()", +"a42b6bf1": "setStorageContract(address,bool)", +"a42cb160": "updatePlayerFund(uint256,address,uint256,uint256,uint256,uint256)", +"a42d630c": "SetupMultipliers(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"a42dc008": "newKudosToken(string,string,string,uint8,address)", +"a42dce80": "setFeeCollector(address)", +"a42e16fd": "MultiSig(address[],uint256)", +"a42e36c6": "scheduleTransaction(address,bytes,uint8,uint256[5],uint256)", +"a42ea491": "MrFibreToken()", +"a42ec1bc": "reserveWallet(uint256)", +"a42ecd5c": "setRealRef(address,uint256)", +"a42ef788": "potSwap(uint256)", +"a42f126c": "charityClaim()", +"a42f1edb": "market1()", +"a42f3f9d": "getTAOCurrencyBalances(address,address,address,address)", +"a4316c46": "MarketingToken()", +"a4325485": "getCreatorBalance()", +"a43293b4": "getTransaction(address,uint256)", +"a432cdb0": "Tier_Rainmaker()", +"a432e6d6": "switchToNextPeriod()", +"a4331929": "createNew()", +"a433a0b9": "addRecordByProvider(bytes32,address,string,string)", +"a433d5c6": "IsActiveUser(address,address)", +"a433f390": "approveAndTransferFundToCreator()", +"a4341ab0": "setCount(address,uint256)", +"a4343ae9": "onContribution(uint256,address,uint256,uint256)", +"a43569b3": "getValidatorDescription(address)", +"a43655c4": "rejectRequestPause()", +"a4366a8a": "processPayment(address,uint256,uint256,uint256,bool)", +"a4368de7": "addBonus(string,uint256,uint256,uint256,uint256,string,uint256,string,uint256)", +"a437164b": "assignUserWallet(string,address)", +"a43772bd": "thirdXRChangeBlock()", +"a43796ce": "getSecretSigner()", +"a437ab52": "setDevelopersFee(uint8)", +"a437e07a": "signAuthorship()", +"a437f91f": "doDistroAmount(address[],uint256[])", +"a4381dd4": "StanleyToken()", +"a438d208": "VOTING_DURATION()", +"a43914da": "getRootEdge()", +"a4399263": "finalise()", +"a439d3fa": "ChangeOfRules(uint256,uint256,int256)", +"a43b2ed0": "Test6()", +"a43b5e46": "buyWeapon(uint256)", +"a43b7cd5": "carTaxiToken()", +"a43b92a2": "tournamentIncentiveCut()", +"a43b9423": "triggerPreJackpotLimit()", +"a43be57b": "endPresale()", +"a43c49fc": "mul16(int16,int16)", +"a43c5415": "lastBlock_a3Hash_uint256()", +"a43c6002": "getTokensByGame(uint32)", +"a43cbe1c": "setThirdPartyDepositorDisabled(bool)", +"a43d12a7": "getParticipantesB()", +"a43d76e9": "isValidPrice(uint256,uint256)", +"a43d8654": "getSeason(uint256)", +"a43dc510": "yesBuyer(uint256,uint256)", +"a43e04d8": "removeContract(bytes32)", +"a43e0c2b": "calclulateBonus(uint256)", +"a43ea59b": "PublicSale(address,address,address)", +"a43fecbc": "setUsername(bytes16)", +"a4406bcd": "placeSellOrder(uint256,uint256)", +"a44081d1": "startPhase1()", +"a440a190": "getKeyPrice()", +"a440b21a": "setPortfolioManager(address)", +"a440dd87": "sigExists(bytes32,address)", +"a441698b": "getStockOrderInfo(bool,uint256,uint256,uint256)", +"a441c302": "operationAddress()", +"a442414f": "sumInvested()", +"a4425c55": "lastInvestorsProfitSum()", +"a442b824": "respawnGame()", +"a442d820": "verifyExtraData(bytes32,bytes32,uint256)", +"a4430321": "eachPUSTprice()", +"a4438334": "updateSettings(uint256,uint256,bytes32)", +"a4439890": "sweepUnallocatedDividends()", +"a4439dc5": "commitPeriodActive(uint256)", +"a444502b": "whitelistAccount(address,uint256)", +"a4447515": "getMakerBetBasicInfo(uint256,address)", +"a444ae41": "sourceContract()", +"a444f5e9": "run(uint256)", +"a4453336": "depositGTA(uint256)", +"a4453a96": "totalBuyersMapping()", +"a4453ecf": "splitEth()", +"a445dc5a": "tokensBoughtWithBTC(address,uint256)", +"a445f30d": "setFeeDistributionAndStatusThreshold(uint8,uint16[5],uint256)", +"a4464252": "priceUnitFix(uint256)", +"a447089e": "eniggerToken()", +"a447405e": "_getTravelPrice(address,uint256)", +"a447ff4f": "DXContracts()", +"a4482f41": "setUniquenessIndex(uint32)", +"a448afda": "BalanceChanged(address,uint256)", +"a448f8e0": "OuterContract()", +"a449a62e": "setDSTWalletLMNO(address)", +"a44a00c3": "areTokensSold()", +"a44b1756": "getMyDrugs()", +"a44b47f7": "TotalSupply()", +"a44b6b74": "setColor(uint256,string)", +"a44cff28": "CypressOrganization(bytes,uint256)", +"a44d0eb3": "MAKJLEB()", +"a44da065": "NigerTokenICO()", +"a44dd0f1": "ico2Cap()", +"a44de4e7": "decreaseStepPct()", +"a44e09db": "wadmin_burn(uint256,bool)", +"a44ead73": "ApplyforCertification(string,string,string,string,string,string)", +"a44eda3c": "checkWithdraw(address,uint256,address)", +"a44f40e3": "optionPoolMembersUnlockTime()", +"a4502cb8": "setExportFee(address,uint256)", +"a45066e5": "SingularityTes25()", +"a4516bb1": "SnapshotTaken()", +"a4516fad": "currentGameNumber()", +"a4520aee": "collect(address[])", +"a45230ec": "get_amount_sell(uint256)", +"a4530b4b": "testUpdateProgress()", +"a4534ef7": "remainingSupply_()", +"a453b639": "wuguAddr()", +"a4546876": "roots(address)", +"a454b07b": "checkString(string)", +"a454c5dc": "unlockStep()", +"a45563ed": "UpdateSellAgentBounty(address,address)", +"a4563e03": "totalPendingWithdrawals()", +"a4575296": "pepFarm()", +"a457c2ae": "clientSeed()", +"a457c2d7": "decreaseAllowance(address,uint256)", +"a457e1c0": "purchaseAsset(uint256)", +"a457f27f": "card_titanium_minamount()", +"a45858b6": "setzUint256Array(uint256[2],int256)", +"a458e34f": "setNewContractManager(address)", +"a459ae28": "collectSellFee(address)", +"a45a7371": "executeUpdateTransferFeeRateProposal(uint256)", +"a45b1795": "getAllCardsModifierSecondaryVal()", +"a45c793f": "restore(uint8[176],uint8,uint8)", +"a45cbbf4": "sendAdvisorsTokens(address,uint256)", +"a45cd953": "canPurchase(address,address,uint256)", +"a45d82bd": "signArchive(bytes32,string,string)", +"a45e11ab": "orderMatchBuy(uint256,uint256,uint256,uint256,uint256)", +"a45e1a6e": "getTokenCounters(uint256)", +"a45e7cb5": "addEntry(string,string,string,string,string,address)", +"a45ee32c": "nameOfIdentity()", +"a45f2057": "caltoken()", +"a45f4bfc": "kittyIndexToOwner(uint256)", +"a45f5685": "setOwnerEarnings()", +"a45f71ff": "increaseApprovalPreSignedHashing(address,address,uint256,uint256,uint256)", +"a4604a33": "changeBuyFeePercent(uint256)", +"a460b817": "updateTicketStatus(uint256,uint8)", +"a460bd6c": "presaleRemaining()", +"a4618691": "squak()", +"a4619682": "registerWithDAI(uint256,address)", +"a461cadf": "WHOLE_ETHER()", +"a461fc82": "SELFDESTRUCT_DELAY()", +"a4620d67": "shareholder3()", +"a4623cc4": "addHero(string,address,uint256)", +"a462f87f": "AICoinToken()", +"a462fb7b": "getFinalAnswer(bytes32)", +"a4633704": "NotifyMe(address,address,uint256)", +"a463685f": "AllocatedCrowdsale(address,address,uint256,uint256,uint256,address)", +"a463a500": "setUpgradeHasBegun()", +"a464d265": "editor()", +"a4659ba2": "stakeConfirmed_Eth()", +"a465e6ba": "committeeKickVoters(address,address)", +"a46841e1": "cnyEthRate()", +"a4689d48": "getroundendtime()", +"a4699cad": "resetWithdrawls()", +"a469b809": "getBetAmount(bytes32)", +"a469e5aa": "getOwnerItemIds(address)", +"a46a1219": "AcceptRouting(bytes32,bytes32,uint256,bytes)", +"a46a891e": "fromBase(uint256,bytes8)", +"a46a96d9": "calculateRegionSalePixelPrice(address[16],uint256)", +"a46afef1": "getSponsoring(uint32)", +"a46b3e9b": "treasuryDemurrageAmount(uint256)", +"a46b6593": "sendCandy(address)", +"a46b8171": "excToken()", +"a46c3637": "getWinnerCount()", +"a46c792c": "assignAgent(address)", +"a46c8fee": "ItdFund()", +"a46d11dc": "gType()", +"a46dfb45": "ResolveChips(uint32[])", +"a46efdb5": "getTokensForPreSale(uint256,uint256)", +"a46f3c7a": "getLiveMaxBet()", +"a46fbe1a": "fulfillEthereumChange(bytes32,int256)", +"a46fe83b": "numAssets()", +"a47001a8": "receiveEthPrice(uint256)", +"a470afa7": "Evernal(address)", +"a47255d7": "TimeWeekThree()", +"a472969c": "WithdrawFee()", +"a472c868": "_storeReward(address,int32)", +"a4754fac": "getValidated(uint256)", +"a475b5dd": "reveal()", +"a476f3d3": "demurringFeeNum()", +"a4776955": "setselfdroptoken(address)", +"a4785dfd": "ecverify(bytes32,uint8,bytes32,bytes32,address)", +"a47905cd": "getBondMultiplier(uint256,uint256)", +"a47abd0f": "testIsSuccessful()", +"a47ae542": "getCurrTotalInvest()", +"a47ae71f": "getCurrTypePrice(uint256)", +"a47b1a6c": "getContractsAddrs(address,address)", +"a47c4d64": "isAllocated3()", +"a47c6b84": "cofounderSwitchAddress(address)", +"a47c84bd": "getShiftedTokens(address,uint256)", +"a47ce954": "bonussale_TokenCap()", +"a47e7110": "AnnoMedal()", +"a47e713c": "ACCToken()", +"a47f519b": "CPCE()", +"a47fcc7c": "proposePartnerAllocation(address,uint256)", +"a4800172": "buyDiscountTTMByETH(uint256,address)", +"a48028aa": "valueOf(address)", +"a480ca79": "collectFees(address)", +"a481247c": "isKeyExist(address,address)", +"a48205cb": "emaValue()", +"a4821719": "buyToken()", +"a48255b7": "nextPVPBatleBlock()", +"a4828bca": "TrineChain()", +"a48296d9": "purchasePhoenix(uint256)", +"a484f413": "payJosh()", +"a48515fc": "castConstitutionVote(uint8,address,bool)", +"a48566ba": "serverSeed(address,bytes)", +"a487bcd8": "winners()", +"a487fd07": "ethFundsWallet()", +"a4893536": "_bonusToBettor(uint32,uint8,uint256)", +"a4898fd5": "deployContract(address)", +"a489a2c7": "sanityBounds()", +"a48a663c": "transferFromToICAPWithReference(address,bytes32,uint256,string)", +"a48bdb7c": "results()", +"a48be00b": "activateTokensForJury(uint256)", +"a48c98dd": "deployerAmount()", +"a48cef4a": "oracleInterfaceCountdown()", +"a48d9e70": "getIcoSupply()", +"a48de68b": "createPromoHero(uint256,address)", +"a48e1ff7": "BonusWithdrawn(address,uint256)", +"a48fb972": "_sendReward(address,address,uint256)", +"a49062d4": "MAX_LEVEL()", +"a490a697": "totalBadges()", +"a4923b8f": "placeIndexToOwner(uint256)", +"a492ef60": "Participant(string,address)", +"a4935f1f": "_tokenMetadata(uint256,string)", +"a4938313": "getAdvancedTransfer(bytes32,uint256)", +"a493b39f": "getAdPriceWeek()", +"a494411c": "allocateTokenForAdvisor(address)", +"a4945a07": "ftestnetico()", +"a494817b": "setIdle()", +"a4951771": "MeshPoint(string,address)", +"a4952f19": "LogPolicyPaidOut(uint256,uint256)", +"a4952f80": "getBytesName(string)", +"a49545ec": "useTokens(address,address,uint256,uint256)", +"a495c942": "set_topl_address(address,address,uint256)", +"a4963c0b": "SAPOVAM(address,string,string,uint256,uint256)", +"a49687d1": "stage4Deadline()", +"a4975aff": "raiseNumberOfCheckmarks(uint256)", +"a4978a15": "applyLOT(uint256)", +"a497d8c6": "privateTokenCap()", +"a497e674": "setAuctionDuration(uint256)", +"a4983079": "transferBalanceForPreSale(address,uint256)", +"a49886ce": "testToBytes32(bytes)", +"a4997fac": "propertyAddressOf(uint256)", +"a499bc4a": "DECEX()", +"a49a1e7d": "setMetadata(string)", +"a49a42e1": "CrytoWorldCup()", +"a49bb55c": "currentRoundMultiplier()", +"a49c2bbb": "getBeneficiaryCash(bool)", +"a49cc76c": "createCurrency(string,string,uint8,uint256,string)", +"a49d03bc": "privateSell1Address()", +"a49d53a1": "SmartRevshare()", +"a49d6be2": "shekel()", +"a49e0ab1": "complex()", +"a49e4540": "mintCapInETH()", +"a49ea0ab": "rankOf(bytes)", +"a4a01e33": "payoutRewardsFor(address)", +"a4a0d801": "valueOfContract()", +"a4a1485b": "createEthInvestorRequest(uint256)", +"a4a1a78d": "CertAdminAdded(address)", +"a4a1a9bc": "fightTeams(uint16,uint8,uint8)", +"a4a1e263": "getUsersCount()", +"a4a249d6": "quicksort(uint256[])", +"a4a2a9f6": "init(address,uint256,uint256)", +"a4a33638": "NAST()", +"a4a339ee": "doMint(uint256)", +"a4a3513c": "Accelerate(uint256)", +"a4a46f45": "LOG_InvestorEntrance(address,uint256)", +"a4a47582": "Pyrgressive()", +"a4a4c224": "setAngelLastBattleTime(uint64)", +"a4a5a46e": "EUNO()", +"a4a5e241": "setPrizeEndTime()", +"a4a5f550": "price_exponent2()", +"a4a6795a": "ReserveSupply()", +"a4a68e44": "userlogin(address)", +"a4a691ce": "parseResultCompatible(bytes)", +"a4a75c6e": "tokensSoldAmount()", +"a4a75edc": "registerDeal(address,address)", +"a4a7cf5c": "redeemWinnings(bytes32)", +"a4a83317": "emitChange(bytes32)", +"a4a85b22": "fund(address,address)", +"a4a8f8ea": "migrationHost()", +"a4a92dd0": "_createToken(string,address)", +"a4a94567": "setTokenContract(address,address)", +"a4aac6ec": "diff(int256[])", +"a4ab3e45": "buyerAddressTransfer(bytes32,address,address)", +"a4ab69cd": "cancelBuyOffer(uint32)", +"a4ac3e7d": "FrozenFu(address,bool)", +"a4acbcd6": "pregnantpuppies()", +"a4ad1a5f": "verEntidades()", +"a4adb24b": "createCourse(string,string,uint256)", +"a4adc2f7": "freezeTokens(uint256)", +"a4adc431": "fechVoteResultForCandidate()", +"a4adcde3": "getSingleGuessInfo(uint32)", +"a4ae32fd": "sampleBool(bool)", +"a4af1d1a": "totalPublicSaleStage()", +"a4afaeb0": "AutoKen()", +"a4b03f52": "internalLockAccount(address)", +"a4b06df2": "heapSort(uint8[])", +"a4b0a36f": "exchangeRateUSDToToken()", +"a4b159c0": "benefitMicros()", +"a4b16449": "transferTokensFromRetailersAddress(address,uint256)", +"a4b195ff": "numVoters(uint256)", +"a4b1b020": "transferLockedTokensBackToUser(uint256)", +"a4b1ce55": "scheduleCall(address,address,bytes4,bytes,uint8,uint16,uint256,uint256,uint256,uint256,uint256,uint256)", +"a4b31eb1": "bitWatt(uint256)", +"a4b32bd7": "modifyRent(uint256)", +"a4b3b042": "RDXToken()", +"a4b48828": "getOffer(address,address)", +"a4b52ef2": "hgt()", +"a4b5fa56": "blacklist()", +"a4b7459a": "transferFromToICAPWithReferenceCallGas()", +"a4b7f5ce": "resolutions(uint256)", +"a4b8a543": "sacarETH()", +"a4b8c2e7": "restart(bytes20,bytes32)", +"a4b910fb": "WithdrawToken(uint256)", +"a4b916e2": "mintB2BC(address,uint256)", +"a4ba2971": "addMemoryImageSlice(uint256,bytes)", +"a4ba5bdb": "Leonidas()", +"a4bad0ae": "vestingsBalance(address)", +"a4bb1324": "initGame(address,uint256,bytes32,bytes32,bytes32)", +"a4bb252e": "LogGameCreated(uint256)", +"a4bb43d2": "Beonbox()", +"a4bbded4": "MAX_ICO_SUPPLY()", +"a4bbf1a7": "LAUCHCONTRACT()", +"a4bc51d4": "PrivateSocialPlatform()", +"a4bce83c": "CSCToken()", +"a4bd7a20": "currentBoundary()", +"a4bd7b8d": "countApproval()", +"a4be2ea2": "HardClear()", +"a4be64a4": "warriorBlock()", +"a4beda63": "lockTime(address)", +"a4bef732": "userCancelOrder(address,address,uint256,uint256,address)", +"a4beffa7": "increaseInvestment()", +"a4bf594b": "CORENETCOIN(uint256,string,uint8,string)", +"a4c089be": "debug_finalizeBundleIPFS(bytes32,string,bytes32)", +"a4c0ed36": "onTokenTransfer(address,uint256,bytes)", +"a4c0fd51": "onlinenewsbalita()", +"a4c1e9c0": "depositToUser(address)", +"a4c3dfa4": "buff()", +"a4c3e789": "RUB_Omnidollar()", +"a4c44074": "setCashbackManager(address)", +"a4c4dfea": "WGNToken()", +"a4c4f172": "_arrayContains(uint8[],uint8)", +"a4c5bf66": "removeSkipPrice(uint256)", +"a4c64d78": "getContractDividends()", +"a4c6569b": "isWhiteListed(bytes32)", +"a4c673c5": "pauseInvest()", +"a4c6fcde": "allowEscrow(bool)", +"a4c756c7": "tokenAllocToTeam()", +"a4c7c7b3": "partner1()", +"a4c89322": "ethToTokens(uint256)", +"a4c8b35d": "moneyManager()", +"a4c93cab": "setDistributionSize(uint256)", +"a4c97967": "proof_of_public_key()", +"a4c9b0ca": "deleteTx(bytes32)", +"a4c9bb28": "VLOGCoin(uint256,string,string)", +"a4ca80be": "lockFile()", +"a4cae72b": "_createEtherDog(uint256,uint256,uint256,uint256,address)", +"a4caeb42": "periods()", +"a4ccd1ba": "breakevenLevel()", +"a4cdbd14": "changeSwapLifetimeLimits(uint256,uint256)", +"a4ce48c0": "addProposal(bytes32,uint256,bytes32)", +"a4ce8683": "create(string,string,uint8,address,string,address)", +"a4d1f29f": "BifrostToken()", +"a4d22c13": "enableDonation()", +"a4d28b62": "getMedalsBurned(uint16)", +"a4d33646": "setELIXAddress(address)", +"a4d4f070": "get_token()", +"a4d55686": "totalEthFundRecieved()", +"a4d575ce": "_forward(address,bytes)", +"a4d5a3a5": "airdropAmount(uint256)", +"a4d5a519": "TXwithCode(bytes32,uint256)", +"a4d5e30e": "removeHatchingTimeFee()", +"a4d66daf": "limit()", +"a4d66f1e": "calcReleaseToken(uint256)", +"a4d67d63": "finishGenerating()", +"a4d69fd3": "payoutMethodABI()", +"a4d6bb2b": "latestPayout()", +"a4d714c7": "addressToBytes2(address)", +"a4d72886": "PRE_ICO_RISK_PERCENTAGE()", +"a4d755ff": "setFactoryName(uint256,string)", +"a4d82f95": "Wallet6()", +"a4d840a8": "getInvestorInforMax(uint16)", +"a4d8b40a": "order2Shares(uint256)", +"a4d904ba": "foundersStake()", +"a4d91b02": "createtoken(string,string,string,string,string,string)", +"a4d924b6": "extractableFraction()", +"a4d95c76": "setRobotCoinContract(address)", +"a4d97569": "ACLYDCoinContract()", +"a4d99522": "setCryptaurRecovery(address)", +"a4da79a7": "_tokensOfOwner(address)", +"a4db2e9a": "initDao(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"a4db8c73": "BieberToken()", +"a4dbafbb": "batchReturnTokens(uint256)", +"a4dbbbf1": "joinWithCandy(address,uint256,uint256)", +"a4dd73cd": "isMinimumValue()", +"a4ddf312": "numberOfPunksToReserve()", +"a4de3c19": "setFeeAccount(address,bool)", +"a4de64c4": "isFundedMini()", +"a4df0758": "isClaimed(address,address)", +"a4df320d": "end_LOCKUP()", +"a4df6c6a": "freezeTokens(address,uint256)", +"a4df8ca1": "See_TokenPurchaser_Number()", +"a4dff0a2": "zzz()", +"a4e01230": "RamenContract()", +"a4e02fcc": "transferProfit(address,uint256)", +"a4e24173": "getUsersArtefactsIds()", +"a4e2d634": "isLocked()", +"a4e3374b": "transferDelegated(address,address,uint256)", +"a4e339c1": "validate(address,uint256,bytes32,bytes,bytes32)", +"a4e360c8": "getApprovals(uint256)", +"a4e4a7bb": "avatar(address,bytes)", +"a4e6dd3a": "coinDrain()", +"a4e85358": "getTEth(uint256,uint256,uint256)", +"a4e8e360": "enterFreeRaffle(uint256[],uint256)", +"a4e9bcb8": "vxtestPrivateSale(address,address)", +"a4ea471f": "getBoardRowDetails(uint256,uint8)", +"a4eacb34": "removeFromBountyProgramMap(address)", +"a4eaec5f": "targer()", +"a4eb5710": "needReleaseFor(address)", +"a4eba44d": "setPriceCoolingPeriod()", +"a4ebf74d": "CorsariumAccessControl()", +"a4ec0620": "getAllCoins()", +"a4ec11b1": "getStepFunction(uint256)", +"a4ece52c": "pop()", +"a4ed22b6": "testInsertLawyer()", +"a4edff47": "addNote(string)", +"a4ee7c18": "_computeCommission(uint256)", +"a4eed4dd": "setupWhitelist(address,bool)", +"a4ef2cbb": "setWhiteListAgent(address)", +"a4efc580": "lastPriceCheck()", +"a4f0d9b1": "setCut(uint256,uint256)", +"a4f15498": "projectedPrizeForPlayer(address,uint256)", +"a4f2613d": "bid(string,string)", +"a4f28bdd": "fundingMinInEth()", +"a4f29aad": "setTokenName(string)", +"a4f35b65": "minTransfer()", +"a4f3fa10": "getToday()", +"a4f4662f": "getOwnersTokenIndex(address,uint256)", +"a4f5b8c1": "bonusCreationRate()", +"a4f63ec8": "setBytesArrayIndex(bytes32,uint256,bytes32)", +"a4f6d5ce": "BeeGims()", +"a4f7c2b7": "getLeftChildI(uint256)", +"a4f82f27": "allocationOf(address)", +"a4f89235": "SALE0_CAP()", +"a4f91a2e": "remainingOwner()", +"a4f927d5": "certifyAccount(address,bool)", +"a4f939a1": "_touched(address,address)", +"a4fa75cf": "StartIcoStage()", +"a4fa8d57": "reward(uint256,uint256)", +"a4fac56e": "rateForOnePTM(uint256)", +"a4faf89e": "incentivesOut(address[],uint256[])", +"a4fd3cea": "getToken(uint256,uint256)", +"a4fd6f56": "isEnded()", +"a4fda741": "usedResidualAmount()", +"a4fde8bc": "player_declare_taking_too_long()", +"a4fefad6": "_currentSupply()", +"a4ff83f5": "warriorsByPlayer(address,address)", +"a4ffd7fa": "noOfICOPhases()", +"a5007da7": "openEgg(uint256,uint256)", +"a50097f2": "getUserEthVolumeSaldo(address)", +"a501123d": "doRollBet(uint256,uint256,bytes32,bytes32,bytes32)", +"a501553e": "getAssetLength()", +"a501ab39": "sendToMe()", +"a501e88d": "Content()", +"a5021a17": "getNodePrice()", +"a5025222": "addressExists(address)", +"a502aae8": "getNextGenerationId()", +"a502bfbd": "invest(address,uint256,bytes)", +"a503473a": "mul2Assert(uint256)", +"a50395cf": "totalPetCardSeries()", +"a504bd0d": "nextTradeEvent()", +"a50569b7": "addUNISSUEDBALLOTPAPERS(uint256,uint256,uint256,uint256,uint256)", +"a50643b7": "getPrizePoolSize()", +"a506e5dc": "transferLand(uint256,uint256,address)", +"a5075567": "RegistrationAntique(bytes32)", +"a50776dd": "managementLocked()", +"a507afd5": "burniEther(uint256)", +"a508ae0f": "P2TCToken()", +"a508dd1d": "OldCanYaCoin()", +"a509b030": "recentActivityIdx()", +"a50a1fe6": "remainingAmount()", +"a50b21c8": "getInputData(uint256,uint256)", +"a50c386a": "exFeeRate()", +"a50cd8e7": "votesFor(address)", +"a50cf84e": "ICO_PHASE2_PERIOD()", +"a50d81c7": "mintForOwner(address)", +"a50e20c1": "checkProfit(address)", +"a50ec326": "deposite()", +"a50ed19b": "setCooldown(uint256,uint256)", +"a50edca0": "fiat()", +"a50f2a25": "AirdropSingle(address,uint256)", +"a510921e": "SaleStop()", +"a510f776": "setCompany()", +"a510fd2b": "returnBetFromGladiatorBattle(uint256)", +"a512fb25": "Purchased(address,uint256)", +"a5135634": "avalibleSTCTokens()", +"a51548a1": "CryptoPainting()", +"a515aaeb": "cdFee()", +"a5171828": "MillionDollarToken()", +"a5177400": "minimumContributionPhase3()", +"a5181756": "AdameToken()", +"a519419e": "depositoryDelegate()", +"a51a38cf": "MasharibCoin()", +"a51a6054": "roundLeader()", +"a51a8682": "saleTransfer(address,uint256)", +"a51ad03f": "isFirstYear()", +"a51aea2d": "changeMaxMultiplier(uint256)", +"a51af4c5": "distributorAddress()", +"a51b79e3": "changeYumAddressTo(address,address)", +"a51ba542": "deleteMonsterIndexToApproved(uint256)", +"a51bb77a": "getInvoiceHashAddresses()", +"a51d5924": "transferMain(address,address,uint256)", +"a51d5f02": "RemoveOwners(address[])", +"a51db46b": "changeDX(address)", +"a51e62a1": "developmentAuditPromotionWallet()", +"a51e81bb": "TRexCoin()", +"a51f3782": "investor_getMediumInfo(address)", +"a51f41a0": "setConfig(uint256,uint256,string,string,uint256)", +"a51fbb3f": "approveTokensWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"a51fe113": "start(uint256,uint256,address)", +"a52079ea": "balanceBlocksIn(address,uint256,uint256)", +"a521036c": "feePaymentEnabled()", +"a5214f77": "setContext(bytes32,address)", +"a521ebfa": "refundPresale(address,uint256)", +"a521f09f": "Greenbow()", +"a522ad25": "withdrawTokens(address,address)", +"a523b88a": "like()", +"a524ce4f": "deliverPresaleTokenToClient(address,uint256)", +"a525663a": "updateOwnerProprietaryData(uint256,string)", +"a525f42c": "transferFromToICAP(address,bytes32,uint256)", +"a526c826": "ICOBuyer(address,address,uint256,uint256)", +"a526f74f": "PRICE_AFTER_SOFTCAP()", +"a527096e": "preallocate(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"a5289158": "end(address,address)", +"a528cb4f": "currentNumberOfRares()", +"a528fec4": "setSecureFees(bool)", +"a5290f74": "phase_2_rate()", +"a5294f93": "CryptoTradeToken()", +"a5295ae4": "AaaToken(uint256,string,uint8,string)", +"a5298955": "setAllHatchConfigs(uint32[],uint256,uint32[])", +"a52a0f8e": "getIntervalCoefficientMultiplier(uint256,uint256,uint256)", +"a52b121e": "faucetThresholdSecs()", +"a52b2b88": "hasWon(address)", +"a52b904b": "ScoreToken(string,uint8,string,string)", +"a52bc175": "Essential()", +"a52c0512": "getNumIncorrectDesignatedReportMarkets()", +"a52c101e": "send(uint256)", +"a52c11a6": "setBalance(uint8,address,uint256)", +"a52c34c3": "shopSettings()", +"a52c9efd": "updateIncrease(uint256)", +"a52cf5a4": "HanlinTestToken(string,string)", +"a52dc2e7": "blockN()", +"a52e6180": "setDiamondAuctionAddress(address)", +"a52ef9b0": "look_for_node(address)", +"a52f365a": "dissmisPurse(uint256)", +"a52f89fa": "nujaBattleTransfer(address,uint256)", +"a5304fc3": "ownerSetJpMinBet(uint256)", +"a5313069": "StairStepDecayingTokenFunction()", +"a53260c1": "migrateEthers()", +"a53290ab": "getClassTransformInfo(uint32)", +"a53324b5": "mint(uint256,string,uint8,string)", +"a53367dc": "ICOBuy()", +"a533daf7": "investmentPositions()", +"a533fb8d": "_mintToPool(uint128,uint256,uint128)", +"a534150c": "feePpm()", +"a536ae38": "payBidAllocationFee(bytes32,uint256)", +"a536cffd": "assertEq6(bytes6,bytes6,bytes32)", +"a536dbe8": "getCurrentPrice(uint256,uint256,uint8)", +"a5374005": "paymentsProcessor()", +"a537b716": "applyWithdraw(address,uint256)", +"a53818ca": "setNodeAllocation(address)", +"a53830e3": "numVotes(address)", +"a538d287": "getMinMax()", +"a53a1adf": "approve(bytes32)", +"a53a4747": "setOperatingCost(uint32[5])", +"a53aeb4e": "accumulate()", +"a53b1c1e": "setInt256(int256)", +"a53bfcf5": "varTokenAllocation(uint256)", +"a53c6dd4": "splitComissions(uint256)", +"a53c7b45": "setGameStatus(bool,string)", +"a53cb8ca": "setWhitelistTokens(address,bool,uint256)", +"a53d5205": "stepTwoLockEndTime()", +"a53d66e4": "changeAuxPartner(address)", +"a53ec007": "changeAirLimitCount(uint256)", +"a53f0e14": "addGrant(address,uint256,bool)", +"a53f138a": "updateTeamsTableAttributes(uint256,uint256,uint256,uint256)", +"a54016a0": "set_price_in_micro_ether(uint256)", +"a5403b3b": "secondaryLedgerCount(string,address)", +"a540db73": "triggerCooldown(uint256)", +"a5410a66": "kycVerified(address)", +"a5417f64": "decreaseICOEndTime(uint256)", +"a541a2a2": "projectCreator()", +"a5422d8a": "mineSoul()", +"a542a02f": "lookupAllSprites(uint256)", +"a542c3d7": "stageDevelop()", +"a54315fd": "SetBuyoutPrice(uint256,uint256)", +"a543a7e5": "addLockUpData(address,uint256[],uint256[])", +"a543bae7": "createSwap(bytes20,address)", +"a5440fa0": "GetAll()", +"a54447aa": "purchaseCard(uint256)", +"a544594e": "donateDAI(uint256)", +"a544805c": "CentralityGiftShop()", +"a544f062": "finanReserveWallet()", +"a54527d5": "AllSpringChainToken()", +"a54580f2": "drive()", +"a545ff0c": "withdrawRemainingEthAfterAll()", +"a5460352": "_validatePurchase(address,uint256,uint256)", +"a54677e3": "getOptionTitleForPoll(uint256,uint256)", +"a5468081": "Pyramid(address)", +"a546cbf7": "core(uint256)", +"a546f2e7": "changeNewHDX20Contract(address)", +"a5473276": "slice(uint32[],uint8,uint8)", +"a5473f78": "withdrawOrderRefundToOrder(uint256)", +"a54799bd": "Person(string,address)", +"a547adce": "lastBlock_f16()", +"a547ec4c": "setTime(uint256,uint256,uint8)", +"a548617c": "SampleCrowdsale(uint256,uint256,uint256,address,uint256,string,string,uint8,uint256)", +"a5488a37": "allowTransactions()", +"a54940b1": "Devable()", +"a5496781": "NamiMultiSigWallet(address[],uint256)", +"a5496e60": "newProposal(uint256,string,string,uint256,uint256)", +"a549ac10": "mintNFTForSale(uint256,string,uint256)", +"a54a2b8b": "testBlockHashFetch()", +"a54b2a73": "burnPool()", +"a54baeda": "removeAllowedLock(uint256)", +"a54c03e2": "distributeStakingShare(bytes32,uint256)", +"a54c2a9a": "removeListing(uint64)", +"a54cd4f7": "minParticipants()", +"a54d396e": "internalAction()", +"a54e1ec4": "SubpreferToken()", +"a54efb1e": "BKB()", +"a54ff9ac": "downvotePost(bytes32)", +"a5500c30": "setAirdropAmount(uint256)", +"a5502b01": "Total_Players()", +"a550f86d": "named(bytes32)", +"a5512db0": "setTSTC(address)", +"a5513af5": "checkPrevOwner(bytes32)", +"a55168ea": "SendEtherToAsset(uint256)", +"a551878e": "fix()", +"a551de87": "MonethaAddressSet(address,bool)", +"a55231f4": "declareEmergency(string)", +"a552c8a0": "LogSendFail(uint256,bytes32)", +"a553506e": "checkData(bytes32)", +"a5536fe7": "mutable()", +"a553748e": "listingActive(uint256)", +"a5537586": "conversionOfferedAt()", +"a553a597": "configure(uint256,uint256,uint8,address)", +"a553c4d2": "tier2LOT()", +"a553e1da": "getUserTokensCount(address)", +"a5541ca2": "AICT()", +"a554a72e": "POINTS_TO_SPEND()", +"a55526db": "touch()", +"a55545a9": "EthVocToken(uint256,string,string)", +"a556a057": "ZAPAX()", +"a557f834": "month24companyUnlock()", +"a558410a": "test_twoValidEqUint(int256)", +"a5584456": "addDiscount(address,uint256,uint256)", +"a559217c": "raisedEther()", +"a5595683": "lockBalance(address,uint256,uint256)", +"a559ec20": "upgradePendingExchange(address,uint256)", +"a55a2577": "addHpbNode(address,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"a55b13c8": "validOtherSource(string)", +"a55bbff9": "setDatePayout(address,uint256)", +"a55bfdc4": "getPhasesCount()", +"a55c51d8": "havven_escrow()", +"a55c974f": "tokenXstepCAP()", +"a55cab95": "getName(uint8,uint8)", +"a55cc1cc": "newTokenWeiPrice()", +"a55cd51c": "updateMaxBet(uint256)", +"a55d260d": "depositNoRef()", +"a55deccb": "locked(address[],uint256[])", +"a55e9370": "getDateCount()", +"a55ec39d": "BulkTransfer(address[],uint256[])", +"a55ee823": "BYN()", +"a56024d8": "deleteUserForUser(string,uint8,bytes32,bytes32)", +"a5603f02": "getCurEarlyIncomeByAddress(address)", +"a5609ab5": "enableDepositTo(bool)", +"a560a956": "duelAnotherCovfefe(uint256,uint256)", +"a5613724": "Start1()", +"a561b1c2": "executeBatchTransfer(address[],uint256[])", +"a56226ef": "officialApplicationSignUp(string)", +"a5622c94": "xEURCoin()", +"a5627d32": "callDeposit(uint256)", +"a564871f": "ctWallet()", +"a56539a4": "_addLock(uint256,uint96,address,uint256)", +"a565efff": "countWinners()", +"a566d383": "softCapCHF()", +"a5670c80": "get_sale_arbits_per_ether()", +"a56793ae": "addCoin(uint256)", +"a567d371": "prepareForRefund(address,address)", +"a568907a": "SUCToken(address)", +"a568a09d": "BuyShareWithDividends(uint32,uint256,uint32,address,address)", +"a56a1de0": "Mortal_HelloWorld()", +"a56b3d11": "setNewCdFee(uint128)", +"a56b60ee": "_removeFromBlacklist(address)", +"a56be205": "developer_new_price(string)", +"a56befd1": "required_number_players()", +"a56c2ac0": "totalWeiRefunded()", +"a56c5be1": "WithdrawConfirm(uint256,uint256)", +"a56d1de3": "valueOfVault(uint256,address)", +"a56d7601": "getPlayerTickets(address,uint256,uint256)", +"a56d96bb": "unmint(uint256,string)", +"a56d9dda": "getCosigner(bytes32)", +"a56dfe4a": "y()", +"a56e7213": "unpausePending()", +"a56e7bae": "getTitleAddress(uint256)", +"a56f2d5f": "AutoMOBILEtoken()", +"a56f5b53": "withdrawDonations(address)", +"a56f9bea": "KarTokenERC20Advanced(uint256,string,string)", +"a5705d17": "performUpdateStackPtr()", +"a57229bd": "linkToNewHouse(address)", +"a572ba41": "CEL(uint256,string,uint8,string)", +"a5731c1c": "getTXSAddress(uint256)", +"a57366e7": "changeSubcourtJurorsForJump(uint96,uint256)", +"a573a9f4": "Bilateral()", +"a57429e2": "getWinConditionInLibra(bytes32)", +"a5749710": "getCurrentBalance()", +"a574cea4": "getMetadata(uint256)", +"a5752034": "changeRound(uint256,uint256,uint256,uint256)", +"a57544da": "right36(uint256)", +"a5758552": "redeemTokens(address)", +"a5766aa6": "setFeePercentage(uint8)", +"a577efd4": "closePot(string)", +"a578ae32": "getApprobation(uint256,address)", +"a578e38a": "RadiumSupply()", +"a5790bde": "toBytes1(bytes)", +"a57918dc": "ptc_addr()", +"a579349a": "currentStageRemainingJM()", +"a579e461": "SetAdminContract(address,address)", +"a57a84a6": "sendPending()", +"a57b54b7": "excTx(uint256)", +"a57c0919": "update(uint256,uint8,address,address,string,string)", +"a57c6e86": "sellTokens(address,uint256,uint256,address,bytes)", +"a57ce52f": "_removeKeeper(address)", +"a57d1560": "lottery(uint256)", +"a57d814b": "MONACOESTAT()", +"a57e768c": "SetLockAddress(address,bool)", +"a57f57f8": "TBToken()", +"a57f59c0": "getMatchInfoList02()", +"a57f6500": "readCTDdata(uint256)", +"a5804521": "StateChanged(bool,string)", +"a58079fc": "FIXED_PRESALE_USD_ETHER_PRICE()", +"a58091cd": "privateSaleSencPerMEth()", +"a58092b7": "getSanityRate(address,address)", +"a580a5b0": "setRepayment()", +"a58180b4": "_batchBuild(uint256[],int256[],int256[],uint8[])", +"a581a27a": "owner_balance()", +"a581c333": "getSHA256(bytes)", +"a581ff0e": "CopyrightExchangeToken(uint256,string,string)", +"a5820daa": "issueTokens(uint256)", +"a5828b7d": "payBonus(address)", +"a583535d": "addCutie(uint32,uint256,uint256)", +"a5841194": "sync(address)", +"a5842415": "Cubes(uint256)", +"a5843f08": "init(uint256,uint256)", +"a5847862": "sizeOfString(string)", +"a584d8cc": "startProduct(string,string,string,int256)", +"a58561ec": "DISCOUNT_STAGE_TWO()", +"a5857318": "getIdArrayItemsCount(address,uint256,string)", +"a586fd0f": "_substring(string,int256,int256)", +"a587686d": "addCardToEdition(uint8,string,uint8,uint8,uint256,uint256,uint256)", +"a5878c65": "addPrivatePresaleTokens(address,uint256,uint256)", +"a587c9f7": "bountyTokenAddress()", +"a587cd36": "DisableSetTransferable(address,bool)", +"a587da29": "setPackage(bytes,uint8,uint8,uint8,bytes)", +"a588a968": "rushitesticoToken()", +"a5891bb0": "modifyWhitelistMulti(address[],bool[])", +"a5898832": "getReferrerRewards()", +"a58ac1a1": "buyTokensInternal(uint256)", +"a58b2e43": "LendingLiquid()", +"a58b55a9": "StreamityEscrow(address)", +"a58b7eed": "setFlags(address,address,uint256)", +"a58ba458": "multiTransferTightlyPacked(bytes32[],address)", +"a58c07ee": "fetchOrderByIdWithPayerByAdmin(string,address)", +"a58c30c5": "block2()", +"a58d3ad1": "dumpCube(bytes,bytes32)", +"a58daf76": "setAuthorizedToDraw(address)", +"a58fd85b": "setReflectSwitch(bool)", +"a58ff4fc": "deletThisContract()", +"a590529e": "updateWithPositionHint(uint32,uint128,uint128,uint32)", +"a590799a": "refundInvestment(address,uint256)", +"a59162eb": "OWEToken()", +"a5917019": "SecurityDepositCreated(uint256,address,string,string,uint256)", +"a5917baf": "vestingVault()", +"a5917dea": "processInternalRequest(string,bool,uint256,uint256)", +"a591a59b": "tuple(uint256)", +"a591d4a6": "getMsgValueAfter()", +"a5925b5b": "clearAuthorization(address)", +"a59307e8": "Play(address,bytes1,uint256)", +"a593845f": "_rollCriticalDice()", +"a594056f": "getPriceInExoTokens(uint256)", +"a59455dc": "getPacket(uint256)", +"a594a117": "giveGen(uint256)", +"a594a236": "_updateClaims(string,string,string)", +"a594b29b": "PRE_SALE_START_4()", +"a595a94d": "_sendGameGift(address,uint256)", +"a595b655": "Gimli()", +"a595f2eb": "quantidadeDeAutorizacoesNecessariasParaUmaNovaOuvidoriaPoderSeCadastrar()", +"a5967039": "cancelMigration(address,address)", +"a5968cc6": "PresaleTokenVesting(address,uint256)", +"a5976f97": "allocateReservedFunds()", +"a59799e6": "updateAvatarInfo(uint256,string,uint256)", +"a5982885": "assertFalse(bool)", +"a5982aee": "closeregistrationphaseandchoosefirstselector(address,address)", +"a5985e8c": "getLevel()", +"a5987c9e": "getMyKilo()", +"a5989dbe": "nines(uint256)", +"a599ef65": "enroll(uint256,uint256)", +"a59a3750": "getWeapon(uint8[176],uint8,uint8)", +"a59ac6dd": "buy(address,uint256,uint256)", +"a59aef4e": "nickOf(address)", +"a59af340": "isInvestorApproved(address)", +"a59b193a": "setRecord(bytes32,string,string)", +"a59b7de5": "consumeCoinForNova(address,uint256)", +"a59cacb2": "setMinWeiAllowed(uint256)", +"a59d6986": "recoverLostFunds()", +"a59d8898": "transferByDateSingle(address,address,uint256,uint256)", +"a59d930b": "ownerSetEtherwowAddress(address)", +"a59dbfb7": "gift_Transfer(address,uint256)", +"a59def62": "ABYSS()", +"a59eca54": "getPlayerIdByAddress(address)", +"a59f3e0c": "enter(uint256)", +"a59f8a2b": "GFCB()", +"a59f9d56": "ChangetokenManagerAddress(address)", +"a5a01bc7": "addCarInit(address,uint32,uint32,uint32,uint64)", +"a5a0545f": "FCChainTokenTest(uint256,string,string)", +"a5a2286b": "ReserveAddress()", +"a5a2aa33": "purseExchange()", +"a5a2cb19": "buyUpgrade(uint256)", +"a5a2fc4a": "claimableFeesOf(address,uint256)", +"a5a32c3a": "GEMCHAIN()", +"a5a3ad0b": "ValidatorBond(address,address)", +"a5a45785": "setRescue(address,bool)", +"a5a54ea5": "SM()", +"a5a584a2": "QuestionToken()", +"a5a5f468": "WorldCupAuction(uint256,uint256,bool,address,address)", +"a5a65bba": "checkvehrespond(uint256,address)", +"a5a6a7b2": "after20Seconds()", +"a5a6d7b3": "sellMyBanana(uint256)", +"a5a7d086": "ethereumFoundationTickets()", +"a5a7dadf": "preCrowdsaleEndTime()", +"a5a83e4d": "right91(uint256)", +"a5a89837": "createPrimera()", +"a5a899ec": "halts()", +"a5a8c53d": "setmessiCommunityAddress(address)", +"a5a98d78": "inflate()", +"a5a9ba8d": "getSellReturn(uint256)", +"a5a9cf0d": "sixthTeamWithdrawal()", +"a5aa0545": "createHumanStandardToken(address,uint256,string,uint8,string)", +"a5aa4348": "setTitulaire_Compte_9(uint256)", +"a5aa542e": "remainingFunds()", +"a5ab3436": "Payouts(uint256,bool,address,uint256,uint256)", +"a5ab5479": "generateNum2Win()", +"a5ab89ff": "setHost(string)", +"a5abe7f6": "isConstant()", +"a5acb022": "LOG_BetWon(address,uint256,uint256)", +"a5acc46e": "PauseInfrastructure(bool)", +"a5acd206": "updateStateFromOracleFoo(address)", +"a5ad0588": "transferFrozenTokens(address,uint256)", +"a5ad1348": "checkPosition(address,address,uint256)", +"a5adb226": "setABackend(bytes32,address)", +"a5ade117": "candyPrice()", +"a5ae65ba": "getGen()", +"a5aeb9b7": "totalWeiContributed()", +"a5af66c5": "HowLongIsDisputeRevealStillRunning(uint256)", +"a5b067b3": "INKCToken()", +"a5b0930d": "getAddressArray()", +"a5b19937": "endVesting(address,address)", +"a5b1e13d": "settle(address,address,uint256,uint256)", +"a5b209df": "doEthDistro(address[],uint256)", +"a5b222c9": "setData_20(string)", +"a5b2235d": "register(address,address[])", +"a5b36a36": "stalePeriod()", +"a5b3720b": "BulkTransfer()", +"a5b3d1a9": "tenmarionCoin()", +"a5b4069e": "DataCoin(address)", +"a5b41c0e": "AK48Coin(uint256,string,string)", +"a5b482c2": "getAmountOfSubcontracts()", +"a5b4aaab": "editMilestone(uint256,uint256,uint256,uint256,uint256,string,string)", +"a5b4f7d3": "setAgentVerificationByAgent(bytes32,address)", +"a5b538f9": "nextBonusPayout()", +"a5b589ce": "mHostFee()", +"a5b6420e": "_setBool(bytes32,bool)", +"a5b6ea8f": "spin(uint256)", +"a5b70519": "multiValueAirdrop(address,address,address[],uint256[])", +"a5b75814": "bonusPhase3()", +"a5b781e1": "lockPostion1Add(uint8,address,uint256,uint256,uint8,uint256,uint8,uint256,uint8,uint256,uint8)", +"a5b78bfa": "NebulaToken()", +"a5b87ef7": "StgFourbonusEnds()", +"a5b9b45d": "tokenConsumed()", +"a5b9e922": "getContentTimetamp(uint256)", +"a5ba3b1e": "tokenClaims(uint256,address)", +"a5bb9162": "tokenadd(address,uint256)", +"a5bbc311": "getNCSTotalSupply()", +"a5bbc423": "withdrawByEmergency(string)", +"a5bbd67a": "lockedAddresses(address)", +"a5bbe7bf": "takeOrder(address,uint256,uint256)", +"a5bc770c": "tokensPerKEther()", +"a5bd1566": "getDiscipleVend(uint256)", +"a5bdbb28": "buyBlock(string,uint256,uint256,uint256,uint256)", +"a5be0c5e": "ERC20Proxy(string,string,uint8,address)", +"a5be1a4d": "multipleTransfer(address[],uint256)", +"a5beb4e5": "claimRefundFor(address)", +"a5bebf48": "founderTokenUnlockPhase1()", +"a5bf7aae": "CPSTestToken1()", +"a5bfa9a9": "claimToken(bytes32)", +"a5bfd16a": "getAllLoans()", +"a5c02493": "setChain(string,address,address,address)", +"a5c04bfe": "allocateTeamBonus(address,uint64,uint64,uint64)", +"a5c102a2": "setMinterFeePercent(uint256)", +"a5c12df9": "OpenANXToken(address)", +"a5c154b3": "setMiniPoolEdit_2(string)", +"a5c1db32": "CrosspaysToken()", +"a5c28b1e": "getGovtApplication(string,string)", +"a5c3eb03": "UbbCoin(uint256,string,string)", +"a5c464b3": "isOnSaleAny2(uint256,uint256)", +"a5c5436f": "preCaution()", +"a5c5463f": "getCurrentlyRunningTier()", +"a5c5762b": "PVT_INV_TOKENS()", +"a5c57b18": "BITDINERO()", +"a5c58944": "dSetEditorArbitraryData(bytes32,bytes,bytes)", +"a5c5edee": "updateGameMetadata(uint256,string,uint256,bytes32[])", +"a5c6ac0d": "percentagePerMonth()", +"a5c7ac13": "test_updateKey_decreaseNoHint()", +"a5c81622": "signedApprove(address,address,uint256,uint256,uint256,bytes32,address)", +"a5c860ba": "eth_minimum()", +"a5c8a201": "geth(uint256)", +"a5c8b7a1": "transferPublisher(address)", +"a5c978c0": "TIA()", +"a5c9cd82": "TOKEN_UNIT()", +"a5ca2afa": "VESTING_INTERVAL()", +"a5ca35f5": "Trade(uint256,address,uint256,address)", +"a5cae60c": "getAppInfo(uint32)", +"a5cb66c0": "ChronosCore(uint256,uint256,uint256,uint256)", +"a5cbe71c": "getCooldownEndBlock(uint256)", +"a5ccd855": "setConstractDeployTime(uint32)", +"a5ccfb06": "sellCard(uint256,uint256)", +"a5cd184e": "free(bytes32,uint256)", +"a5cd3fd0": "steemh()", +"a5cd761f": "getTokenOwner(uint256)", +"a5cd806b": "BONUS_PCT_IN_VREO_SALE_PHASE_1()", +"a5cda792": "distribution(address[],address,uint256[],uint256[])", +"a5ce0693": "endBlockBonus1()", +"a5ce3eb0": "totalPaidAmount()", +"a5ce413b": "unstakeTokens()", +"a5ceefa2": "computeTokenAndETHRewards(uint256,uint256)", +"a5cf3898": "verifyExtraData(bytes32,uint256)", +"a5cf38da": "createCrowdsaleTiers(bytes32[],uint256[],uint256[],uint256[],bool[],bool[])", +"a5cf56f2": "ethReceivedPresale()", +"a5cf599c": "ENDING_TIME()", +"a5cfefde": "updateChainlinkAddresses()", +"a5d048d3": "create(address,uint256,uint256,address)", +"a5d0bab1": "buyPartial(uint256,uint256)", +"a5d18cb6": "checkGameAmount(uint256)", +"a5d1c0c0": "gameTime()", +"a5d33c2b": "MessageSentToChannel(address,string,string,uint256)", +"a5d3845b": "tokenEventAddress()", +"a5d572c4": "fixedTotalSupply()", +"a5d57bb7": "ApproveAndDo(address,uint256,bytes32,string)", +"a5d5ca54": "PolyCustomers()", +"a5d5db0c": "depositCollateral(address,uint256)", +"a5d638f1": "transferOwnershipRequest(address)", +"a5d677ab": "getFileByIndex(bytes32)", +"a5d68bfd": "RATE_WHOLESALE()", +"a5d6d4c3": "mintAuthorizedBatch(address[],uint256[])", +"a5d7a14f": "ContractorProposalAdded(uint256,uint256,address,uint256,uint256)", +"a5d8628a": "AgriChainDescription()", +"a5d871c0": "AddressChanged(uint256,address)", +"a5d8746e": "canMakeBet()", +"a5d8b72b": "midasAdvisorOperateMarketingAddress()", +"a5d8cdf2": "deploy_time()", +"a5da0bf5": "addAfterId(address,uint32,uint128,uint128,uint32)", +"a5db83e4": "marketRegisterToken(address)", +"a5dcf458": "uintToBetsArray(uint256)", +"a5ddfef1": "getTotalAmountOfTokens(uint256)", +"a5de12ab": "ITBITSToken()", +"a5de3619": "admins()", +"a5de811f": "checkMyWithdraw(address,address)", +"a5def8cb": "numbOfFrozenAmCount(address)", +"a5dfd89a": "getPrize(address,uint256,bytes3,uint16)", +"a5dfee67": "testThrowsCreateNewRevisionNotUpdatable()", +"a5e00e53": "QNTU(address[],uint256[])", +"a5e09282": "_burn(address,address,uint256,bytes)", +"a5e108af": "addEmployerContract(address,address,uint256)", +"a5e11729": "maxPower()", +"a5e1c5b5": "setVal(bytes32,uint256)", +"a5e20eaa": "getProjectStartDate(bytes32)", +"a5e220c2": "Owner(address)", +"a5e2dbfb": "_scto(uint256,uint256,uint256,uint256,address)", +"a5e33048": "generateTokens()", +"a5e45bec": "range(uint256)", +"a5e4e9a0": "maxCWCsPerReturnLessThan()", +"a5e4fedc": "LogTransferFromOwner(address,address,uint256,uint256,uint256)", +"a5e52c08": "ImmediateProfit(address,uint256)", +"a5e53bfe": "checkRandomFromRandao(uint256)", +"a5e558a3": "MIN_FUND_AMOUNT()", +"a5e57fcf": "GetUserBitFlag(address)", +"a5e5e034": "swapTop(uint256)", +"a5e62f02": "fallbackRP()", +"a5e7131e": "transferFundsAdminOnly(address,uint256)", +"a5e767cd": "frozenAccount(address,address)", +"a5e7a31c": "summReserveFund()", +"a5e82807": "deletedTeamIds(uint256)", +"a5e8c5d6": "setVoteRight(address,uint256)", +"a5e90eee": "setManager(address,bool)", +"a5e9585f": "xxx(uint256)", +"a5e99c4e": "createSubmission(uint256,string)", +"a5e9fffa": "calculateAmount(address,uint256,uint256)", +"a5ea11da": "getParameters()", +"a5eb1c6d": "Ovation(uint256,string,string)", +"a5eb7a4e": "operated()", +"a5ebb9ef": "backERRLCoinOwner()", +"a5ebc10b": "blocktubeClip(string,uint256,uint256)", +"a5ebf389": "getMoneyTotals()", +"a5ec4fae": "changeBaseVerifierFee(uint256)", +"a5ecacae": "getContributionTime(uint256)", +"a5ece941": "marketingAddress()", +"a5eceaf1": "bet1000_1eth()", +"a5edcd9e": "ethtotalSupply()", +"a5ee79d3": "extendRequestTimeLock(bytes32)", +"a5ef0dd6": "setGen0Profit(uint256)", +"a5ef69ea": "icoEndAt()", +"a5ef9915": "jotAllowance()", +"a5f02b00": "markCombatEnded(uint256)", +"a5f0dea2": "saleFinalized()", +"a5f11474": "Tronix()", +"a5f128fb": "stopSelling(uint256)", +"a5f18c01": "getStartBlock()", +"a5f1e282": "lockedOf(address)", +"a5f257e7": "transferDividendToShares()", +"a5f26760": "updateTimeMintBalance(uint256)", +"a5f2a152": "transferTo(address,address,uint256)", +"a5f2e079": "borrowerReturnAmount()", +"a5f357de": "MAXROUNDS()", +"a5f3c23b": "add(int256,int256)", +"a5f4648c": "getNextTurnColor(uint256)", +"a5f4864d": "ELBT()", +"a5f4af33": "playerWithdrawPendingTransactions()", +"a5f4c6ff": "publicStart()", +"a5f732e5": "distributeLTCW(address[],uint256)", +"a5f75a5e": "dollars_per_kilo_ether()", +"a5f7823e": "onlyAdmin()", +"a5f7c148": "transfer(address,int256)", +"a5f8b874": "wasProxyStorageSet()", +"a5f8cdbb": "buyTicket(address)", +"a5f9b5c2": "gameRound()", +"a5f9fd99": "splitShare()", +"a5fa2490": "smxSold()", +"a5fa5e52": "showTime(address,address)", +"a5faa125": "getAuthor()", +"a5fadf93": "modify_Presale3StartDate(uint256)", +"a5fb929a": "userRewarderCount(address)", +"a5fba4e1": "isDistributionDue()", +"a5fbd808": "globalBurnAmount()", +"a5fbdd41": "updatePremiums(address)", +"a5fbf287": "isSupported(address,uint256)", +"a5fc2994": "sendStore(address,uint256)", +"a5fd0a18": "chargeChannel(uint256)", +"a5fd1838": "getBonus2(uint256)", +"a5fdc5de": "collateral(address)", +"a5fefcfd": "thirdMonthEnd()", +"a5ff2551": "LOCIcoin(uint256,string)", +"a60014e3": "buyCore(uint256)", +"a60110ee": "ProposalTalliedEvent(uint256,bool,bool)", +"a6021ace": "ERC20Address()", +"a6024524": "PRE_ICO_FINISH()", +"a6027d53": "IconomiTokenTest(uint256,string,uint8,string,uint256)", +"a6044f28": "virtualEntitiesCreated()", +"a604c1ad": "Blocker_send(address)", +"a6060fcb": "Bitdore(uint256,string,string)", +"a6065c96": "brokerVerifierContract(uint64)", +"a6066523": "payment_amount()", +"a6069146": "setItemRangeURI(uint256,string)", +"a606b94a": "transferBalance(address,address,uint256)", +"a6070967": "minSumICOStage8USD()", +"a60745aa": "getBountyData(uint256)", +"a608067b": "getDrugPrice(uint256)", +"a608a65b": "CryptoAdsToken(uint256)", +"a6091b32": "removeControllerByPartition(bytes32,address)", +"a60956a6": "newItem(uint8,uint8,uint256,uint256,uint256,uint256,uint256,bool,bool,address)", +"a6099372": "payDiff(address,uint256)", +"a609e209": "BIRTHDAY()", +"a609f034": "getByteFromBytes14(bytes14,uint256)", +"a60b693d": "getTotalCap()", +"a60b8aa9": "minusTourFreezingTime(uint256,uint64)", +"a60bbcd3": "ModelCoordinator()", +"a60c8043": "totalDistributionAmountInWei()", +"a60c9cdb": "TheBolthDAICO(address,address,address,address,address,address,address,address)", +"a60dc38a": "convertToWei(uint256)", +"a60e043e": "CappedRefundableCrowdsale(uint256,uint256)", +"a60e8bd6": "setVotingProxy(uint8,address)", +"a60eb299": "setRewardGenerationComplete(bool)", +"a60f3588": "payoutIdx()", +"a610fe9b": "chargeHoldingTax()", +"a6113c0d": "getSynthesizationResult(address)", +"a6117f39": "validPrePurchase()", +"a611e0e6": "forceRentalEnd()", +"a612c638": "emergencyRestart()", +"a6138ed9": "pricer()", +"a613c42d": "NWT()", +"a6145ba2": "isAllowContribution()", +"a614d54e": "GlobalAdmin()", +"a6151a84": "isDestroyed()", +"a615237e": "rebrand(string,string)", +"a615d7ee": "withdrawTokenToInvestorOwner(address)", +"a6178731": "usingInterCrypto()", +"a617aff1": "brideAddr()", +"a61855a4": "changeCommonRebate(uint256)", +"a618993c": "setGBA(uint32)", +"a618f50c": "distributeSSENTE(address[])", +"a619486e": "masterCopy()", +"a61bd76d": "purgeInformation(uint256)", +"a61c48f0": "getPollResultsSize()", +"a61c5b82": "numStudentRequest()", +"a61d0aed": "maxBets()", +"a61d6829": "getPosterInfo(uint256,uint256)", +"a61e1fc1": "_shuffle(uint8[])", +"a61e67aa": "testFailMintGuyWhenStopped()", +"a61e9f4d": "momentBlockOf(uint256,uint256)", +"a61ef635": "translateToStartingTile(uint16)", +"a61fe970": "candyBalance()", +"a6208622": "refusePayment(uint256,uint8)", +"a621344a": "setTokenWallet(address)", +"a621d679": "XPZ()", +"a6223a58": "testAccess(address)", +"a622510b": "TranslationService()", +"a623e9bf": "PresaleDistribution(address,address,uint256)", +"a62438e2": "getPeriodKey(uint256)", +"a6245974": "getUpgradeProposalCount()", +"a6248874": "totalFirstICOSupply()", +"a62533e6": "diffString(string,string)", +"a62552b3": "modificaPuntos(uint256,int256)", +"a6256644": "setDonationsReceiver(address)", +"a625d78d": "MasterDeposit(address,address,uint256)", +"a626c089": "changeSettings(uint256,uint256,uint256)", +"a626c3fe": "assignBountyTokens(address,uint256)", +"a626f445": "GlobalPersonalInsuranceChain()", +"a62784e2": "setCCH_edit_3(string)", +"a6279dbd": "getPartialAmountCeil(uint256,uint256,uint256)", +"a62819ed": "AddExec(string)", +"a62875d9": "getMyPastWins(address)", +"a62a07dd": "release_dates(address)", +"a62a86a0": "associateWithTaskAddress(address)", +"a62adfec": "buyTokens(uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", +"a62ce8ce": "capitalization()", +"a62d4df3": "_absSubtraction(uint256,uint256)", +"a62d7801": "resumePhase()", +"a62d9ba3": "withdrawToPlatformFunding(uint256)", +"a62e4246": "CampaignBeneficiary()", +"a62e5a7d": "sellComission()", +"a62ea098": "buyLCRTokens()", +"a62f3503": "updateBankAmount()", +"a630a92e": "ownerTransferWeiFirstWallet(uint256)", +"a6314342": "deleteManager()", +"a63234e0": "issuerAddress()", +"a6327ffc": "convert2PlatinumToken(uint256)", +"a632a2e5": "setnumber(uint256)", +"a632d5e1": "MANHATTANPROXLENAV()", +"a633d8d4": "getDougAge(uint256)", +"a633f61f": "getPositionOwedAmountAtTime(bytes32,uint256,uint32)", +"a6345859": "setEscapeRequest(uint32,uint32)", +"a635d31e": "Vote(address,bool)", +"a635e7c5": "BuyEBETtokens()", +"a636f4a1": "VoterAdded(address)", +"a6372087": "starNoLongerForSale(uint256)", +"a63744e0": "addPoll(uint256,bytes,uint8)", +"a63832a0": "dateFunc(int256)", +"a6391823": "awardsOf(address,uint8)", +"a6393784": "BiddableEscrow(address)", +"a63a9fa6": "setNextSnapshotBlock(uint256)", +"a63aeed9": "tokenSaleResumedTime()", +"a63b91f4": "autoBurn()", +"a63c500f": "is_locked()", +"a63c7ba2": "payoutToBeneficiary()", +"a63d0be6": "findAndTrade(address,address,uint256,uint256)", +"a63d6f05": "setRewardLevel(uint256,uint256,uint256,uint256[],uint256[])", +"a63d914f": "confirmAction(uint256)", +"a63dcbd7": "updateRtbSettlementAbi(string)", +"a63e10fa": "getUnreadMessageCount(address)", +"a63f1350": "getParentUniverse()", +"a63f5e2a": "candyToken()", +"a63f8020": "scWithdrawCall(address)", +"a6403636": "resolve(uint8,bytes32,bytes32,bytes32)", +"a64085cc": "getAllClients(address)", +"a641d28e": "revokeDelegateSigned(address,uint8,bytes32,bytes32,string,address)", +"a641edc7": "BOC(uint256,string,string)", +"a6424d22": "setVigAddress(address)", +"a64278ce": "lost_and_found_master()", +"a642c032": "getEdition(uint256)", +"a643c1a0": "updateAddresses(address)", +"a6441979": "StexIssued()", +"a6459042": "agencyReceiver()", +"a645a33a": "VotingFinished(bool)", +"a645e840": "getCurrentGameInfo()", +"a645ff5f": "send(address[],uint256[])", +"a646f9ad": "userWithdraw()", +"a6472906": "getAxie(uint256)", +"a6474a58": "setnotice(string,string,string)", +"a647e8ec": "mint(address,uint256,uint256,uint256)", +"a6482858": "boxPrice()", +"a648567b": "placeBet(uint8,uint8)", +"a648fec2": "updateAllTurnover(uint256)", +"a6491545": "_giveToken(address,uint256)", +"a64968ac": "joyToken()", +"a64a1c0b": "totalSoldTokensWithoutBonus()", +"a64ad595": "getDelegator(address)", +"a64b0b62": "addDevReward()", +"a64b63a8": "ParcelXGPX(address[],uint256)", +"a64b6e5f": "transferTokens(address,address,uint256)", +"a64bb045": "Test7J()", +"a64c7e2a": "Crowdsale(address,address,address)", +"a64d1c09": "hashOrder(uint8,address,uint256,uint256,uint256,uint256)", +"a64ded31": "tttTokenAddress()", +"a64e7969": "balancesCannotSell(address)", +"a64e920d": "vrcCount()", +"a64ed8ba": "tokensCount()", +"a64f0ca4": "getEtherInEuroCents()", +"a64f197e": "allocateBid4b(bytes32)", +"a64f829a": "addDungeonRewards(uint256,uint256)", +"a64fa869": "PrezzoCMT(uint256,uint256)", +"a650ebbc": "transferFromInternalStakingfund(address,uint256)", +"a6515a98": "admined()", +"a652477b": "STSTEST3()", +"a6534b63": "EtherBet(address,uint256,uint256)", +"a65465ff": "pank15()", +"a65491d5": "yeezy()", +"a654cfab": "pots()", +"a655fb4e": "level_9_amount()", +"a6567a9a": "calculateNewTime(uint256,uint256)", +"a656e51f": "lastInvestorsProfitDay()", +"a657242b": "Hardcap()", +"a6572c87": "getemployee(address)", +"a657cb9c": "submitRedeem(uint256)", +"a6593562": "getamountvotes()", +"a65a0068": "getAccountBalances()", +"a65a26e8": "returnAddressList()", +"a65a7753": "Zentum()", +"a65ac961": "batchTransferValues(address[],uint256[])", +"a65ae513": "ownerDeclareFailure()", +"a65b37a1": "buyXname(bytes32,uint256)", +"a65b62c9": "priceRound(uint8)", +"a65c3097": "_distributeRest()", +"a65e53e2": "prizeWithdrawTo(uint256,address,uint256)", +"a65e91b8": "baseTokensSold()", +"a65eacdc": "delManager(address)", +"a65ecbeb": "getMaxTokenAvaliable()", +"a65f0f79": "Ethereal_Smart_ID(address,address,string,string,bool)", +"a65f1193": "weiToUsdCents(uint256)", +"a65f51c8": "gapTime_()", +"a6605a77": "_updateTradingVolume(uint256,address,address,uint256)", +"a660698e": "TheInternetDigitalCurrency()", +"a660a326": "balancesHold(address)", +"a660f827": "bonusEnds5()", +"a6624bf4": "ISBToken()", +"a6632904": "tier_cap_4()", +"a663b5de": "viewCoinsKarma(uint256)", +"a664225c": "exchangeFinished()", +"a6656096": "invalidateGame(uint256)", +"a6658dea": "BitSelectConservador()", +"a6661901": "totalNormalContributorIds()", +"a6662a3c": "initMetadataDisabled()", +"a6666f0f": "TTGCoin()", +"a6667e18": "RemoveWhitelist(address)", +"a666ff3c": "lockedTokenAddress()", +"a66712ae": "usersOfAccount(uint256,uint256)", +"a6674aa3": "Resigned(address)", +"a6678b60": "setJadeCoin(address,uint256,bool)", +"a668d7c9": "NiceGuyPonzi()", +"a66939ad": "hostileTakeover(address,uint256)", +"a669b56b": "pay_day()", +"a669c9f9": "registeredServices(address)", +"a669d972": "c_centsPerToken()", +"a66ac7bc": "payout(bytes32,bytes32)", +"a66b62e6": "gameOverByUser()", +"a66b7748": "follow(bytes32)", +"a66c0b1c": "setGoldmintTeamAddress(address)", +"a66c53b2": "buyCore(uint256,uint256,uint256,string)", +"a66cb0ee": "GetBonus()", +"a66d5ef7": "createNamespace(string)", +"a66db704": "getPOOL_edit_23()", +"a66ddf43": "mainSaleRateP3()", +"a66df701": "chargeFee(address)", +"a66e6e5c": "etoken2Symbol()", +"a66ee056": "internalTransfer(int256,address,address)", +"a66f32e5": "stage3Bounty()", +"a66f42c0": "boost()", +"a66f7ad6": "signRelease(uint256)", +"a66fd42b": "mintToggle(bool)", +"a670b9e7": "nestedSecondSome(uint256,uint256)", +"a670c133": "numTeamDeposits()", +"a6712778": "investBct(address)", +"a672990c": "whitelistContract(address,bool)", +"a6735023": "getProfilePicture(address,address)", +"a673b130": "Reserved(address,uint256[])", +"a6741cfd": "injectEtherToDividend()", +"a6747670": "senderToProxy()", +"a675807e": "totalLevs()", +"a675887e": "EtherReceivedFromRelay(address,uint256,address)", +"a676b174": "frozenAccountProfit()", +"a677fbd9": "example2Func()", +"a6780857": "fireEventLog0Anonym()", +"a6784488": "cleanOut()", +"a67909bd": "LOCKTC()", +"a6791568": "burnAllTokens(address)", +"a67a6eab": "bearToken()", +"a67ad1b2": "sellICloudSecsAgainstEther(uint256)", +"a67aee1f": "tokenConverter()", +"a67afd30": "vest2all(address,address)", +"a67ba5d2": "changeAdminCharges(uint256,uint256,uint256)", +"a67bb583": "tokenCapForSecondMainStage()", +"a67c2730": "getBonusPerShare()", +"a67c2dcb": "accept_ownership()", +"a67c8bc4": "mintFundsTokens()", +"a67cace9": "AIT_TokenERC20(uint256,string,string)", +"a67d2602": "getSafeAddr()", +"a67de805": "DWalletToken()", +"a67e91a8": "TOKENS_MAX()", +"a67eb8d7": "STRIMToken(address,address,uint256,uint256)", +"a67ebf73": "Voting(uint8,address,uint256,uint256)", +"a67f122f": "_1_vozrast()", +"a67f9997": "LIQUIDATION_RESERVE_RATIO()", +"a67fc3fa": "getRewardAmount(bytes32,bytes32)", +"a6801cbd": "reset(uint256,uint256,uint256)", +"a6808c3c": "_setAgilityValue17(uint256)", +"a6809af0": "setOdds(uint256)", +"a680baaf": "backendWallet()", +"a681bf23": "LegalBot()", +"a681f950": "setMinMax(uint256,uint256)", +"a6823189": "parseAddr(string)", +"a682d5ad": "clampMin(uint256,uint256)", +"a682dd4f": "SWAP(address,address,address)", +"a6832d53": "allowedTransfer(uint256)", +"a68393a2": "debug_getCoinbaseTxOutputLen(uint256)", +"a6843f34": "right48(uint256)", +"a6846026": "TokenMintingDisabled(address,bool)", +"a684bc9f": "tokenReserved3()", +"a684ff03": "bet(uint16,bytes32)", +"a68567ac": "IDToken()", +"a6856e9d": "JTEBIT(address,uint256)", +"a685a41e": "parseLoanOffering(address[9],uint256[7],uint32[4])", +"a685ae66": "minerTimeOfLastProof()", +"a685ea57": "getROFRStatus()", +"a68602fb": "SignalingDisabled(address,uint256)", +"a687be48": "RocketsAndResources()", +"a6885e88": "getStageData()", +"a6895b5a": "getDailyLimit()", +"a6896bdf": "isRightPosition(uint128,uint128,uint32,uint32)", +"a68a2884": "TournamentCore(address,address,address,address)", +"a68a76cc": "createForwarder()", +"a68b51ed": "addProposal(address,uint256,uint256,string,uint256,bytes)", +"a68b91ab": "getContractData()", +"a68c5ca1": "SDTToken(uint256,string,string)", +"a68c68b4": "get_asset(uint32)", +"a68c9bbb": "getBid(address,address)", +"a68cfb25": "getSecondAmount(bytes32,bytes32)", +"a68d9a62": "_setDownRequest(address,uint256,uint256,uint256)", +"a68dfb2d": "TTToken()", +"a68e27b7": "getLuckProps(address)", +"a68e4578": "totalLBSold_CORNERSTONE()", +"a68e5ad0": "depositTokensForTrading(uint256)", +"a68eb555": "payVATToBusinessOwner(uint256,uint8,address)", +"a68f0bc1": "TOTAL_LARE_FOR_SALE()", +"a68fff3f": "GenRandom(uint256,uint256)", +"a6903278": "beginBlock()", +"a69032ee": "proxyTransferFromToICAPWithReference(address,bytes32,uint256,string,address)", +"a69177b1": "addTotalSupplyAmount(uint256)", +"a6921956": "tokenStatus()", +"a692c2f9": "_toTileId(int32,int32)", +"a692d5ae": "migratePriceLeader(uint8,address,uint256)", +"a6934950": "_confirmOneBuy()", +"a69358aa": "voteForTap(bool)", +"a693600b": "poolAmount()", +"a69364fc": "ProofOfTheRich()", +"a6940238": "growth()", +"a69416f6": "getNodeType(address)", +"a6948cd9": "calculateArea(address[16],uint256)", +"a694dabd": "STARTING_SNAIL()", +"a694fc3a": "stake(uint256)", +"a69520aa": "alchemy(uint256)", +"a695cacf": "getGameIdsByCategory(bytes32)", +"a69709ae": "toHexString64(uint256)", +"a69722de": "validateDescription(string)", +"a6973fa1": "computeS(uint256)", +"a697ca14": "finishSingleLock(address,address)", +"a6980a17": "addPromo(bytes32,uint256,address,uint256,uint256)", +"a6983932": "SeckeyRevealed(bytes32)", +"a6988576": "walletTokenBounty()", +"a699cd20": "getGrowingControlStartAt()", +"a699d9b0": "saosao6()", +"a699fb18": "payoutWorth(address)", +"a69a2ad1": "totalBalances()", +"a69a5588": "set(bytes12,bytes32)", +"a69ade72": "LED_MULTISIG()", +"a69bd4a8": "regStartTime()", +"a69beaba": "vote(bytes32)", +"a69c22be": "getYays(uint256)", +"a69c5bbf": "bucketClosureTime(bytes32)", +"a69c6597": "getPlayerName()", +"a69cbb50": "_getEarlyBonus()", +"a69dde14": "checkPassiveAndNull(address)", +"a69df4b5": "unlock()", +"a69e894e": "createTokens(address,uint256)", +"a69eae7c": "changeAllowanceToMint(address)", +"a69f7d1f": "FOUNDATION_PERCENT()", +"a69f886a": "withdrawRaised(uint256)", +"a6a1858f": "whale()", +"a6a20ff6": "DSEasyMultisig(uint256,uint256,uint256,uint256)", +"a6a34dd3": "_setMinCardPrice(uint128)", +"a6a3a439": "getNumTransactions(address,uint256)", +"a6a3ba2b": "pausestatus()", +"a6a5bfe3": "getStage2Start()", +"a6a62d58": "lastBlock_f2()", +"a6a633af": "ROA()", +"a6a68606": "findOnePercent(uint256)", +"a6a6a0d8": "becomeFrom()", +"a6a6f1c7": "registerLicense(string,string)", +"a6a86130": "usdToWei(uint256)", +"a6a9a099": "privateIcoMin()", +"a6aa7f7a": "onlyFounders()", +"a6ab1216": "getWeaponsArmy1(uint256)", +"a6ab36f2": "initialize(uint256,uint256,address)", +"a6aba1b5": "BitCoix()", +"a6abbad6": "assertEq16(bytes16,bytes16,bytes32)", +"a6ac9225": "getJackpotResults(uint256)", +"a6ad57e6": "difficultyScaleMultiplierLimit()", +"a6ae0aac": "coinbase()", +"a6afd5fd": "getBets()", +"a6afed95": "accrueInterest()", +"a6b01e50": "isMultiOwner(address)", +"a6b05af6": "INITIAL_BONUSLIST_TOKENS()", +"a6b08498": "isOps()", +"a6b10dd1": "showToken_For_Circulation()", +"a6b11fb3": "factorial_ICO()", +"a6b165ee": "total_investors()", +"a6b197aa": "Order(address,uint256)", +"a6b1caa3": "gasScalar(uint256)", +"a6b206bf": "doSomething(uint256)", +"a6b26697": "EthRefundReceived(address,uint256)", +"a6b2c437": "confirmRequest(uint256)", +"a6b2df9b": "requestDocument(uint256,string)", +"a6b3abba": "getMyTokenBalance()", +"a6b402ec": "MGU()", +"a6b4492f": "servusToken()", +"a6b4b0f4": "testCreateGames(uint256)", +"a6b513ee": "finalPrice()", +"a6b55eec": "unlock(bytes16,uint32)", +"a6b57b5d": "sharesOwned(address,uint256)", +"a6b7fa36": "withdraw(uint32,uint192,bytes)", +"a6b87b52": "erc()", +"a6b909e1": "trades()", +"a6ba250c": "fechVoteInfoForVoterBySnapshotBlock(address,uint256)", +"a6bb012b": "penalizeInactiveArbitrators(address[],uint256[])", +"a6bb1667": "updateMatch(uint8,uint8,uint8)", +"a6bc18f9": "setTrader(address)", +"a6bd5427": "getOptionCount()", +"a6bd853b": "mtdPreAmount()", +"a6bdcc17": "isAtLeast(uint256,uint256)", +"a6bf3df0": "oraclize_query(string,string[2],uint256)", +"a6bf45a9": "getNumberOfDeedsByAddress(string)", +"a6c01cfd": "isInGeneration(uint256)", +"a6c09381": "_setPackedTimestamp(bytes32,uint256)", +"a6c0d5a8": "YukiChainToken()", +"a6c1d611": "getAngelLockStatus(uint64)", +"a6c1f87f": "partial_refund(address)", +"a6c216c2": "UpgradeEvent(address,address)", +"a6c226f0": "lock(address,address,uint256[],uint256[])", +"a6c23bc4": "setTokensPerUsdRate(uint256)", +"a6c24b38": "getRequiredPrice()", +"a6c2591e": "get_header(uint256,uint256)", +"a6c2f3b2": "getAllAgreements(uint256)", +"a6c30b29": "startGasCalculation()", +"a6c3e6b9": "author()", +"a6c4cce9": "registeredApps(address)", +"a6c4d58c": "MetronomeToken()", +"a6c4ec0e": "hasUser(address)", +"a6c5612e": "areTokensFree()", +"a6c58b63": "getJobStatus(uint256)", +"a6c62c90": "snake(uint256)", +"a6c662ea": "Cmc()", +"a6c66575": "processInviterBenefit(address,uint256)", +"a6c6aee1": "ODEEPToken()", +"a6c7bf8a": "setMasterWallet(address)", +"a6c7f715": "MoimToken(uint256,string,string)", +"a6c8210e": "getVotingParams()", +"a6c93349": "createContract(uint256,uint256,int256,int256,int256,int256)", +"a6c94d2e": "durationVoting()", +"a6c95de1": "transferBountyTokens(address,uint256)", +"a6c98142": "SquirrelFarmer()", +"a6ca0a98": "PARAMOUNT()", +"a6ca322b": "refundCompleted()", +"a6ca54bd": "lawEnforcementRole()", +"a6cb4654": "catchYou(address,uint256,uint256)", +"a6cb9e64": "scheduleCall(address,bytes,bytes)", +"a6cbcdd5": "numSignatures(bytes4)", +"a6cc0428": "withdrawCryptoCurrencyNetworkTokens(address)", +"a6cd5ba3": "MaxMasternodesAllowedChanged(uint8)", +"a6cd8c68": "Match_Maker()", +"a6ce25b2": "In(uint256)", +"a6ce69a2": "changeSupply()", +"a6ce8c29": "HandsOnToken(uint256,string,uint8,string)", +"a6cea881": "KayiToken()", +"a6ceaeb8": "getSoldTokens()", +"a6ceb1f3": "sendAirdrop(address[],uint256[])", +"a6cfaf2e": "MMC(uint256,string,string)", +"a6cfb7a3": "getBack(uint256)", +"a6cfbb7f": "revenueBalance()", +"a6d00693": "getMeshPointByCreator(int256)", +"a6d150e0": "updateWhitelists(address[],bool[])", +"a6d15124": "coinsLeftInTier()", +"a6d15963": "createChannel(address,uint192)", +"a6d23e10": "payments()", +"a6d2bff6": "getTeamTokens()", +"a6d34fa8": "JackpotPayoff(uint256,uint256,address)", +"a6d40d39": "unlockFounder(uint256)", +"a6d49dca": "emitTransferEvent(address,address,uint256)", +"a6d4b5c2": "getGroupResult(uint256)", +"a6d4e9da": "tokensByTx(uint8,string)", +"a6d544e9": "sumHardCapPreICO1()", +"a6d6d046": "LetsfairToken()", +"a6d6ec85": "Add_Product(uint256,uint256,string,string)", +"a6d72407": "interface()", +"a6d7d72e": "addTwinAddress(address)", +"a6d87f7d": "myReferralDividends()", +"a6d8adf9": "compensateAll(address)", +"a6d930bb": "FundCrowdsale()", +"a6d93a9a": "_sell(uint8,bytes6,uint32,uint32)", +"a6d958c6": "getLastInput()", +"a6d96af6": "_createCompany(bytes32,bytes32)", +"a6da1e7d": "depositAndLock(address,uint256,uint256)", +"a6da3761": "StoneumToken()", +"a6da467c": "buyCozyAffiliated(uint256,uint256,bool,address,address)", +"a6da54a3": "validCoordinate(uint256,uint256)", +"a6dacdd7": "right59(uint256)", +"a6dc0173": "BRFCrowdsale(uint256[3],uint256[3],uint256[3],uint256[3],address,uint256,uint256,address,uint256,address)", +"a6dc15bd": "PriceChanged(uint256)", +"a6dc1ada": "setMaxStage3AllocationPerInvestor(uint256)", +"a6dc6771": "third()", +"a6dc84f0": "balanceOfFrozen(address)", +"a6dcb12d": "candyTotalSupply()", +"a6dcc834": "getUserInventory(address,address)", +"a6dd06e1": "getPOOL_edit_34()", +"a6ddcc96": "FillBuyOrder(address,address,uint256,uint256,uint256,uint256,uint256)", +"a6ddce13": "setDisable(address,bool)", +"a6de42c8": "AuthorizedAddresses()", +"a6dea55e": "sendEthToAddress(address,address,uint256)", +"a6ded200": "redeem_funds(address,uint256,uint256,bytes32)", +"a6defd45": "ZeroHooStandardToken(uint256,string,uint8,string)", +"a6df0344": "REF_CREDITS_PER_AXIE()", +"a6df33a2": "creationInvestmentSupply()", +"a6df6c30": "minCWCsPerReturnMoreThan()", +"a6e0264a": "_checkMyVesting(address)", +"a6e158f8": "redeemTokens(uint256)", +"a6e16ba2": "testThrowsRetractLatestRevisionNotOwner()", +"a6e1bc7c": "IndoCrypt()", +"a6e26e96": "batlordAddress()", +"a6e2eab1": "recycleAfterEnd()", +"a6e315ff": "addExemptionAddress(address)", +"a6e3289d": "addNextMemberPayment(address,uint256,uint256)", +"a6e3a8a7": "findMinAuditPricesStats()", +"a6e3f533": "redeemKmPardsBal()", +"a6e3fcf6": "setBaseTokensSold(uint256)", +"a6e4002e": "DividendManager(address)", +"a6e497b6": "getUserContractAddress(address)", +"a6e4ae01": "gcp(uint256)", +"a6e5291f": "UniversalGiftToken()", +"a6e5303a": "SLKToken()", +"a6e53b99": "PHASE1_ACCOUNT_TOKENS_MAX()", +"a6e5f2f5": "Show_Address_for_option_C()", +"a6e7469c": "getSendersHash(address)", +"a6e77af1": "setEntryPrice(uint256)", +"a6e7f409": "STATE_OWNED()", +"a6e81e7c": "refundWei(address,uint256)", +"a6e826e8": "startsecurities()", +"a6e8a859": "target2()", +"a6e915b6": "confirmOpening(uint256,uint256)", +"a6e9e95f": "setCoinAllowance(address,address,uint256)", +"a6ea7ad2": "dexTestTransfer(address,address,uint256)", +"a6eaab99": "DGCASH()", +"a6ebbe5a": "NewDeposit(uint256,uint256,address)", +"a6ec01f7": "clearPendingWithdrawal(address)", +"a6ec0708": "setCompte_28(string)", +"a6ec3022": "getCurrentYearRemainToken(uint16)", +"a6ecfff8": "is_btc()", +"a6ed563e": "getBytes32(bytes32)", +"a6ee5eed": "changeFinishPreSale(uint256)", +"a6ee6fd9": "max_schrems_addr()", +"a6eea7f3": "liquidationPeriod()", +"a6effaed": "DetailedERC20(string,string,uint8)", +"a6f07a5c": "bigbomMultiSigWallet()", +"a6f0cba6": "DarioAdministrator()", +"a6f0e577": "isLeapYear(uint16)", +"a6f1c939": "getPick(uint256)", +"a6f1fd51": "addDeposit(uint256)", +"a6f20445": "LogCancelReservation(address,uint256)", +"a6f257cc": "AgroTechFarmToken()", +"a6f2ae3a": "buy()", +"a6f2e80d": "lockFunds(address)", +"a6f2fd5c": "disable(bool)", +"a6f48c90": "freeCount()", +"a6f4ab2e": "setStalePeriod(uint256)", +"a6f55282": "addNacToNLF(uint256)", +"a6f57199": "CrowdsaleExtended(uint256)", +"a6f5a22b": "openShop()", +"a6f6a8a6": "_setPrices(uint256)", +"a6f6d8bb": "getObligation(bytes32,uint64)", +"a6f70594": "SpoutCrowdsale(address,uint256,uint256,address)", +"a6f7257a": "getSigns(uint256)", +"a6f7541c": "maroonToken()", +"a6f81668": "gameInfo(uint256)", +"a6f87bc6": "WumingToken(address,address)", +"a6f935f6": "exporterAcceptedIBankDraft()", +"a6f9885c": "MAX_LENGTH()", +"a6f99922": "EcologicalShield()", +"a6f9dae1": "changeOwner(address)", +"a6fb08ae": "contractWithdraw(uint256)", +"a6fb475f": "transferFrom(address,address,uint16[])", +"a6fbf3d2": "getInt(bytes32,bytes32)", +"a6fc2823": "continueIco()", +"a6fc5c03": "getCode(uint256)", +"a6fd0085": "sub(uint128,uint128)", +"a6fd2487": "recordName()", +"a6fd96b0": "MultiService(address,address[])", +"a6fda231": "ICO_RATE3()", +"a6fdedef": "aimeIncreasePerTrip()", +"a6fe178c": "getRegisteredExchanges()", +"a6fe7a28": "removeService(address,uint32)", +"a6fea6f4": "registerVendor(address)", +"a6ff20a3": "addVehicle(uint256,uint256,bytes32,bytes32,uint256,uint256)", +"a6ff85e2": "ReceiveDonate(address,uint256)", +"a6ffefae": "balancesListNumberMap(address)", +"a701229f": "ChangedOwner(address)", +"a7016023": "setOwnership(address)", +"a7021bc5": "executorAlive()", +"a70284be": "soldBeercoins()", +"a702be14": "feedSecondaryPot(uint256)", +"a703078c": "sortAuction(uint256[])", +"a7030a53": "extractAndStoreBitcoinAddresses(bytes32,uint256,bytes,bytes)", +"a703c751": "batchWhiteListInvestors(address[])", +"a705245e": "setReserveVault(address)", +"a70616de": "platformWithdrawalRecipient()", +"a7068d66": "addDelegate(address,bytes32,address,uint256)", +"a706a2e2": "requestUnlock(bytes32,address,bytes4,address)", +"a706d26e": "DragonTreasureToken(address,address,address)", +"a7070373": "setAllowance(address,address,address,uint256)", +"a707300f": "addAcceptedContribution(address,uint256,uint256)", +"a7074a82": "getCrowdsaleStatus(address,bytes32)", +"a707ce55": "changePass(bytes32)", +"a707fc81": "payback(uint64,address[])", +"a708142b": "addressSCComplianceService()", +"a7084516": "VictoryX(uint256,string,uint8,string)", +"a7086536": "withdrawOfferForCollectible(uint256,uint256)", +"a7096ac8": "addLogicVersion(uint256,address)", +"a70a92f7": "setLiquid0(bool)", +"a70a9ad7": "switchDeity(address)", +"a70b015d": "stageICO()", +"a70b21a3": "ReceiverPays()", +"a70beb13": "processSellOrder(uint256,uint256)", +"a70c41b4": "getTransferFromPreSignedHash(address,address,address,uint256,uint256,uint256)", +"a70ce015": "safeGetPercent(uint256,uint256)", +"a70d7006": "StinkyLinky()", +"a70e82d4": "changeFreeUntilDate(uint256)", +"a70f101c": "useEmergencyCode(uint256)", +"a70f84c3": "registerName(address,bytes32,uint256)", +"a70fc3ba": "setCap(uint256,string)", +"a70fc680": "fundraising()", +"a71168e3": "setTrainingScienceContract(address)", +"a7120433": "setItemContract(address)", +"a7134993": "lifeD(uint256)", +"a7134f73": "acquire()", +"a713a3f7": "loggedTotalSupply(uint256)", +"a7154d22": "cancel(address,uint32)", +"a7157c72": "withdrawToTeamStep2(uint256)", +"a715bf33": "ICO_PRICE()", +"a715df58": "setUnownedName(uint256,string)", +"a715ff59": "EtherandomProxy()", +"a716144a": "getStack(bytes32)", +"a7177ebf": "getSpellAbilityCost(uint8)", +"a718309f": "CryptoCurrencyExchange()", +"a7188b4e": "setEditModeBool(bool)", +"a718d11b": "addWhiteList(address,bool)", +"a718e288": "Robet(uint256,string,string)", +"a718e774": "closeWeeklyInvest()", +"a718f4b3": "searchJobs(address,uint256,uint256[],uint256[],uint8[][4],uint8,uint256[],uint256[],uint256)", +"a7194e2a": "returnTokensListOfAddresses()", +"a71962c2": "GAME_STARTED()", +"a719804d": "Spank(string,string,uint8,uint256,uint256)", +"a71a3dde": "DEFAULT_LOCK_COST_PER_HOUR()", +"a71acabc": "newSection(bytes32,bytes32,bytes32,uint256)", +"a71aec73": "isTradable(uint16)", +"a71b4c26": "auctionSumGwei()", +"a71bd1cd": "getCurrentDay(uint256,uint256)", +"a71be2c0": "Clip()", +"a71d6f9f": "setTRCExchangeRate(uint256)", +"a71d8181": "createCeleb(string,uint256)", +"a71e12e5": "JoinGameAsPlayer(uint8,uint256,uint8)", +"a71e46d3": "maxRecordID()", +"a71ee0c6": "changetradestatus(bool)", +"a71ef84d": "getVotingWinner(address)", +"a71f94c8": "scheduleSetUInt(address,uint256,uint256)", +"a71fa796": "addResearch(address,uint256)", +"a7205062": "constructor(address,uint256,uint256)", +"a720cbb8": "create(address,address,address,string,string,address,uint256,uint256)", +"a720e0a8": "ebyteToken()", +"a720faa9": "maxPreICOSupply()", +"a721c06c": "LENTToken()", +"a721d9d9": "EmiratesCoin()", +"a721ebe8": "numberSyndicateMembers()", +"a72299dd": "MetadollarShare()", +"a7232aae": "setGPSMinEth(uint256)", +"a723761a": "investEtherForDID()", +"a723cda8": "AQUAOIN()", +"a7240d45": "updateTransaction(bytes32,uint256,address,uint256,address,uint256,bytes32,bytes32,bytes,bytes)", +"a72460d1": "getProviderEndpoints(address)", +"a724e54c": "newCollectible(uint256,string,uint256,uint256,uint256,string,uint256,string)", +"a724f68a": "CratesOpened(address,uint8)", +"a7256621": "addInt(uint256,int256)", +"a725c4a4": "StrategicPartners(address,uint256)", +"a725fa1f": "CpublicgoldToken(address)", +"a7261f79": "isPayableEnabledForAll()", +"a72670b8": "getReportingWindowByTimestamp(uint256)", +"a726be9a": "get_token_data(uint256)", +"a727390d": "GetDomainInfo(string)", +"a727632f": "Date_Finished()", +"a7281bbf": "CollectTaxes(uint256)", +"a728fa93": "getMyCraigGrant()", +"a7292c74": "amountEthRaised()", +"a72a05f7": "getReceiversCount()", +"a72aa163": "setPropertyMode(uint16,bool,uint32)", +"a72b1444": "minimumSupport()", +"a72cb9aa": "editAddress(int256,address,string,address)", +"a72cc1e8": "updateTask(address,string)", +"a72dc52e": "fixedExpUnsafe(uint256)", +"a72dc950": "StageOneEnable()", +"a72ec7a0": "TokenLiquidityPlatform()", +"a72f3dea": "removePVPContender(uint256)", +"a72f5aaa": "preDistribute(address,uint256)", +"a72ff7de": "buySmartContract()", +"a7304287": "godUnpause()", +"a731c4ec": "addUserTokenLocalBalance(address,uint256)", +"a731f31a": "getBoxes(address)", +"a7321096": "mainSaleBonus()", +"a7322d9d": "DURATION_SALESTAGELAST()", +"a7324134": "parseLoanOffering(address[11],uint256[10],uint32[4],bytes)", +"a732d6c4": "calculateAffiliate(uint256,uint256,uint256)", +"a732f9ac": "increasePlayersGooProduction(address,uint256)", +"a7334c93": "addSales(uint32,uint256,uint16,uint16,uint64,uint64,uint32,uint8)", +"a733800d": "Shipia()", +"a73381d5": "EYInnovationCoin()", +"a733e21d": "twice(address,uint256)", +"a733f702": "isValidSize(uint256)", +"a73467bd": "TestCitySnapshotInternal(address,uint256)", +"a73598fd": "tryFinalizeStage()", +"a73638a7": "selectGod(uint16)", +"a7365ea9": "Gealena()", +"a7368afb": "allocateTokens(address[],uint256[])", +"a7374b21": "sendFundsInternal(uint256,address,bytes)", +"a737ec3d": "GxAdmins(address)", +"a737ecc9": "getProfitToAddress(uint256,address)", +"a7384c1e": "eth2erc20()", +"a739013f": "buy(address,address,uint256,bool)", +"a7397d27": "xaurForGasLimit()", +"a73b60f4": "buttonClicks()", +"a73b9bcb": "FTFExchangeToken()", +"a73c0ba2": "play(uint256,uint16,uint8)", +"a73c52e7": "getLastPerUser(address)", +"a73c7140": "amountTotal()", +"a73d633c": "addWhitelist(address,address)", +"a73d907e": "inboxIsEmpty(address)", +"a73e01cb": "WPTokensBaskets(address,address,address,address,address)", +"a73e38ce": "generateICOcrowdsale(uint256)", +"a73e9837": "newEnterWallet(address)", +"a73ee331": "MAIN_HOLDER_ADDR()", +"a73f7f8a": "addRole(address,bytes32)", +"a73fc4cd": "get_pre_kyc_iconiq_bonus_denominator(address)", +"a7403160": "vestingsReleasedRemain(address)", +"a74035b5": "setEvabotContractAddress(address)", +"a740a194": "getGasToReport()", +"a740a6fa": "clearRAM()", +"a740cf90": "TGIF(address)", +"a740de43": "nameLocked()", +"a7419b51": "setAirLiftPrice(uint256)", +"a742a942": "create(address,bytes32,address,address[],address,bytes32)", +"a7432434": "refferalPreICOBonus(address)", +"a743a61f": "checkStudentsApply()", +"a743fa50": "beneficiaryFunded(address)", +"a744a633": "getWeeklyTransactionVolumeReceiving()", +"a745863b": "startRebuyTime()", +"a745953e": "buyStarInitial(uint256,string)", +"a745ec70": "bountyDistributorAddress()", +"a7467039": "sharesToManager(uint256)", +"a747007f": "AffiliateProgram(address)", +"a7483f74": "CATFreezer(address,address)", +"a74905db": "reportProfit(int256,address)", +"a74915cf": "getadd()", +"a7491b48": "votesByAddress(address)", +"a7497fa5": "tge()", +"a749870d": "etherValueAllowStale(uint256)", +"a749e97b": "_setPaymentSchedual(uint256,uint256,bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,bytes2)", +"a74a1831": "post(bytes32)", +"a74baaa4": "amountOfHolders()", +"a74e01cf": "unFreezeAllTransactions()", +"a74e493f": "pregenTokens(address,uint256,uint256)", +"a74ecb12": "setMasterAddress1(address)", +"a74f277a": "MaintenanceUpdate(bool)", +"a7502a3f": "totalTeamWithdrawSupply()", +"a7507df2": "loveUrl()", +"a75252ea": "sellToAddress(uint256,address)", +"a75261f2": "certbot()", +"a75274e9": "setMarkup(uint256,uint256)", +"a752c2c5": "UniversalSchemeMock()", +"a75343bf": "claimOwnership2()", +"a753d6f2": "CreateProposal(string,string,string,string,string,string,uint32,uint32)", +"a753fd08": "setWinNetworkFee(uint256)", +"a7542448": "addRef(bytes32,bytes32)", +"a75439d1": "minValuePre()", +"a755a47e": "triggerAllRefunds()", +"a7560bec": "EBITOKEN()", +"a7565888": "m_Paused()", +"a75688b2": "oldMillionEther()", +"a756f362": "Th_stage1(uint256)", +"a75761f1": "returnUint16(uint16)", +"a7577542": "addCrowdSaleTokens(address,uint256)", +"a757ac4b": "privatesaleAddress()", +"a757fc42": "buyTwo(uint256,uint256,uint256,uint256)", +"a758ac6a": "MaecenasCrowdsale()", +"a759822b": "performCalculations()", +"a75a1d6c": "claimRefundTokens(address,address)", +"a75a4e4a": "updateScoreAndBalance(uint256,uint256,address,address)", +"a75a9049": "setInitialOwner(address,uint256)", +"a75aef40": "SYCEarlyPurchase()", +"a75c6f65": "updatedCirculation(string)", +"a75c8546": "determineDiscountRate()", +"a75c981d": "totaltokensold()", +"a75d0042": "signedTransferCheck(address,address,address,uint256,uint256,uint256,bytes,address)", +"a75dd0d4": "AddPrivateKey(string,string)", +"a75df814": "knownAddress(address)", +"a75e2853": "transferForICO(address,uint256)", +"a75eb727": "updateExistingRaz(uint256,uint256,uint256,uint256,uint256)", +"a75fe8e1": "removeWallet(address)", +"a7603a86": "getDefaultValidityBond()", +"a76044a4": "binary()", +"a760d1d0": "setRateAgain()", +"a760e442": "setLosers(uint256)", +"a76188b9": "setRewardPercentages(uint256,uint256,uint256,uint256,uint256)", +"a7633064": "getRandomType(uint16)", +"a7638346": "setFinaliseTime()", +"a7638c4d": "disableStakingPeriod()", +"a764eb45": "setCurrentIssuanceData(address,uint256)", +"a7651147": "loyaltySupply()", +"a76594bf": "getPlayersCount()", +"a7668eba": "calcTokenCost()", +"a766f3d1": "storeStub(address,bytes32,bytes32)", +"a76769a5": "fillOrderWithEth()", +"a76774f5": "jackpotCompleted()", +"a7677ee3": "AslanToken()", +"a767d8be": "preIcoMaxCap()", +"a76a155e": "getBetsFromAddress(address)", +"a76bb04e": "setRewardPoolWallet(address)", +"a76d368a": "candyPowerToken()", +"a76d50ad": "multipleTransfer(address[],uint256,uint256)", +"a76dd676": "TIER3_PERCENT()", +"a76decce": "_createNFT(uint256[5],address,uint256)", +"a76ee2d8": "fillBuyOrder(address,address,uint256,uint256,uint256,uint256)", +"a76eeab2": "updateVitality(uint256,uint8)", +"a76f3543": "getUpgradePointer()", +"a76f43a0": "bancorDaiSmartTokenRelay()", +"a77078e7": "withdrawForOp(address)", +"a7721e0f": "multiplyTokensSend(address[],uint256[])", +"a7724b16": "bingo()", +"a7728589": "setMintAgent(address,address)", +"a7731150": "StoreFile(bytes32,string,string,string,string,string,uint256,bytes)", +"a7737b93": "NumberOfPart()", +"a77384c1": "setTotalShares(uint256)", +"a773d98a": "getAssetIDHash()", +"a7741827": "deleteAllUris()", +"a7743462": "setFounderTokenWallet(address)", +"a774f163": "adjustDefaultSpritePrice(uint256,uint256)", +"a775511a": "isMainsalePeriod()", +"a775b1c4": "NAORIS_TEAM_TOKENS()", +"a7760d79": "preICOendTime()", +"a77674a7": "buy_energy(address,uint32,uint32,uint64)", +"a7771ee3": "isVoter(address)", +"a7775bd7": "YDToken()", +"a777aa5d": "changeMaxTokenSell(uint256)", +"a777d0dc": "hello(string)", +"a777deca": "thirdRelease()", +"a777eca9": "MinerRewardChanged(uint256)", +"a77a8230": "allowence(address,address)", +"a77aa49e": "setIntValue(bytes32,int256)", +"a77adc23": "WaxToken()", +"a77ae839": "approveRewards(uint256)", +"a77b2e37": "Coin()", +"a77b4d8b": "setBaseCurrency(address,bool)", +"a77b6efb": "mintCoins(uint256)", +"a77beea1": "transfer(address,address,address,address[],uint256)", +"a77c1b08": "checkTransfer(address)", +"a77c61f2": "cobinhoodUserIDs(address)", +"a77ee38c": "promoTypeNum()", +"a77f7c8c": "whitelistMany(address[])", +"a78036b7": "clearDeposits(address,uint256)", +"a7807b84": "transferByRelatedToken(address,address,uint256)", +"a78082aa": "TokenSafe(address)", +"a78085ef": "lockMainSaleToken()", +"a780b2f3": "parseRate(string)", +"a7811732": "totalERC20Contracts(uint256)", +"a78118a4": "onlyDevs()", +"a781384e": "TrivialToken(string,string,uint256,uint256,address,address,uint256,uint256,uint256,bytes32)", +"a7819ad7": "_challengePart2(uint256,uint256,uint256)", +"a783a4f1": "get_hash(uint16)", +"a78488af": "startTokenRaffle(uint256,address,uint256,bool)", +"a78488e1": "WSTO()", +"a784d969": "setAssetsCertified(uint256)", +"a784ef22": "_calculateScore(uint256,uint256,uint256,uint256)", +"a7859131": "m_initialSettingsSet()", +"a785b96a": "TDEStartDate()", +"a786c1d2": "BONUS_DAY1_DURATION()", +"a7878831": "splitTokens()", +"a78810f8": "subscribeMe(uint8,bytes32)", +"a788aa07": "test_threeValidEqUint(int256)", +"a789e29c": "getContributorData(address)", +"a78a43c1": "getAllTeamScores()", +"a78a651a": "processContribution(address)", +"a78adf57": "UserAddressRegistry()", +"a78adfec": "setButtonParams(uint256,uint256,uint32,uint32)", +"a78b3d96": "addSubOwner(address,address)", +"a78bcf6e": "changeBankroll(address)", +"a78c5476": "SaleStarted(uint256)", +"a78c81ea": "changInviteAmountLimit(uint256)", +"a78cb567": "getCosignerFee(uint256)", +"a78cdfed": "gana()", +"a78d4316": "_near(uint256)", +"a78db39c": "blockedUntil()", +"a78deefa": "isGameEnd()", +"a78e635c": "XToken()", +"a78e887c": "calculatePurchaseReturn(uint256,uint256,uint16,uint256)", +"a78f0489": "secondTierDiscountUpperLimitEther()", +"a78f16ba": "setWhitelistedStatusInternal(address,address,uint256)", +"a79094b7": "changePolyRegisterationFee(uint256)", +"a7909e47": "DAppReady()", +"a791c665": "WojakCoin()", +"a791da46": "buyXwithdrawForContract(address,uint256,uint256)", +"a7932d20": "marketToken2019()", +"a7944579": "sit()", +"a79726b7": "tokenSpin(uint256)", +"a7972a80": "MoviePass(string,string,uint8,uint256)", +"a7977ffc": "isWhiteListedAndAffiliate(address)", +"a7985ae4": "SNAILMASTER_INCREASE()", +"a7987b58": "LendroidSupportToken()", +"a799464c": "isMyInfra(uint256)", +"a7996adc": "_safePaymentActionAtIco(uint256,address,uint256)", +"a799de7e": "anotherTransferTo(address,uint256)", +"a79a3c30": "teamAlloacting()", +"a79a3cee": "isConfirmed()", +"a79a416d": "SetCommissionRate(uint256)", +"a79ac3be": "ReleaseTokenForReserveFund()", +"a79b2752": "validate(address[4],address,uint256[12],uint256,bytes,uint256)", +"a79c7faf": "test_threeInvalidEqBytes()", +"a79ca634": "_setSubnodeOwner(bytes32,address)", +"a79dad23": "GetBetNums(uint256)", +"a79deb4f": "acceptTradeDeal()", +"a79ec95a": "oneEtherIsHowMuchFST()", +"a79f26dc": "force()", +"a79f4773": "buy_ETH(uint256,bytes8)", +"a79f7412": "withdrawCoinExt(uint256)", +"a79fdbb4": "presalePaused()", +"a7a066b7": "AxtrustICO(uint256)", +"a7a0d537": "something()", +"a7a1019d": "tixPresale()", +"a7a1e0a7": "auditNTVUText(uint8,uint8,string)", +"a7a1ed72": "pass()", +"a7a260cf": "TokenDeployed(uint256)", +"a7a2720e": "processFunding(address,uint256)", +"a7a38f0b": "history(uint256)", +"a7a39daa": "getBrickIdsByBuilder(address)", +"a7a3ba54": "SponsorMusic(uint256,uint256,address)", +"a7a44eba": "getFirstUnionIds(bytes32)", +"a7a5e00b": "updateCustomer(address)", +"a7a604b2": "mintUptoCap()", +"a7a60580": "MeteorToken()", +"a7a62aee": "init(address,uint256,address,string,string)", +"a7a7be1a": "newWriteAddr()", +"a7a8add2": "setSaleAgentContract(address,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"a7a957ff": "getSaleDayNow()", +"a7aac32d": "withdrawAdvisorTokens()", +"a7aad3db": "voterReward(address,uint256,uint256)", +"a7aaf58c": "getPollID(uint256,uint256)", +"a7ab6961": "withdrawalDelay()", +"a7abb8cc": "BM_MasterClass_Reserved()", +"a7abc124": "activate(bool,bool)", +"a7ace55d": "incrementDivisor()", +"a7ae9756": "startNewStakingInterval(uint256,uint256)", +"a7af0b99": "Nerdearla()", +"a7afc1ca": "deactivateCurrentRound()", +"a7b0793b": "setAdvisorFundWallet(address,address,uint256)", +"a7b07acc": "AssetSplit(address,address,address,address)", +"a7b2042f": "phasePublicSale3_From()", +"a7b2bfc7": "multyTransfer(address[],uint256[])", +"a7b2d313": "LogAnswerReveal(bytes32,address,bytes32,bytes32,uint256,uint256)", +"a7b2d4cb": "remove(int256,address)", +"a7b2fc00": "updateTokenNameSymbolAddress(string,string,address)", +"a7b314ac": "stepProfit()", +"a7b3a6fc": "Mine(address,uint256,uint40)", +"a7b4b60f": "erc223Fallback(address,uint256,bytes)", +"a7b69ed9": "PostLicense()", +"a7b71dca": "getJobValue(bytes16,address,address,uint256,uint256)", +"a7b7eefb": "JustmakeToken()", +"a7b7f1d4": "getLatestUnitRaffleInfo()", +"a7b83225": "AgriChainSeal()", +"a7b86824": "lockup(address,uint256)", +"a7b88506": "canRead(address,bytes32)", +"a7b8c868": "startCrowdsaleTime()", +"a7b91780": "getTokensSale()", +"a7b94972": "newBen(address)", +"a7ba0cb5": "createChatRoom(bytes32)", +"a7ba44c3": "isFinalizerSane()", +"a7ba9fb1": "epsilon()", +"a7bb1cf4": "_setRarityBonusValue20(uint256)", +"a7bb5803": "splitSignature(bytes)", +"a7bb959a": "Apen()", +"a7bc2efd": "transferGroupIntertrade(uint256,address)", +"a7bc3cb9": "SafeLocked(uint256)", +"a7bc8c46": "howManyVoters(bytes32)", +"a7bd4791": "MakeItWeinSec()", +"a7bda7e3": "extractNameFromDataET(bytes)", +"a7bdf16e": "isValidBump(uint16[3],uint16[3])", +"a7be2648": "unTrackToken(address,uint16)", +"a7be85c6": "AUTHOR()", +"a7bf1b6c": "purchase(uint256,uint256,address,address)", +"a7bf1cbf": "unfreezeTransfersSince(string)", +"a7bf8921": "freezeContract(bool,uint8[],bytes32[],bytes32[])", +"a7c19841": "preSaleInit()", +"a7c1a708": "LogGameStarted(uint256)", +"a7c1a75b": "maxAuditDuration()", +"a7c1abf1": "decodeMessage(string)", +"a7c1e629": "cancelTransfer(address)", +"a7c25c5a": "setMileagePointPrice(uint256)", +"a7c368c0": "pushBuyerList(address)", +"a7c3ce60": "distributeRegisterFee(uint256,uint256,bytes32,uint8)", +"a7c3d71b": "icoStartTime()", +"a7c41e28": "zennitToken()", +"a7c4abdb": "calculateTokenAmount(uint256,uint256,uint256)", +"a7c5052e": "buildDSTokenRegistry()", +"a7c591c4": "setBest(uint8)", +"a7c5c2a2": "BirthFee()", +"a7c6c83a": "getMystr()", +"a7c6f483": "exchangeRateAuth()", +"a7c742c9": "CommissionEarnedEvent(address,uint256)", +"a7c7d2a0": "airdropValue()", +"a7c7e2a0": "assignOwner(address,address)", +"a7c7fdeb": "transferTokensToOwner()", +"a7c83514": "inflationChange()", +"a7c8e68a": "sealManualMigration(bool)", +"a7c961d5": "bonussale_Cap()", +"a7c9771b": "getVATDeductions(uint256,uint8,uint256,uint8)", +"a7c98748": "test3_searchNext()", +"a7c99f2c": "changeCompetitionAddress(address)", +"a7c9d92f": "HammBones()", +"a7ca3010": "getWithdrawTransactionCount(bool,bool)", +"a7cac846": "weights(address)", +"a7cadc50": "Dagelan()", +"a7cb6edc": "tokenRestriction(address,bool)", +"a7cbe06f": "MaxFunds(address,uint256,uint256)", +"a7cc440e": "getCityResourceRichness(uint256)", +"a7cc90e9": "calculateCounters(uint256,uint256,uint256,uint256)", +"a7cd21ea": "transferPrivilege(string,address)", +"a7cd674e": "whitelist_enable()", +"a7cdc2ad": "getAddressExist(address)", +"a7cebd4d": "createActivity(uint16,uint16,uint128,uint64,uint64)", +"a7cec1d2": "DataStorage()", +"a7cf7edd": "mimul(uint64,uint64)", +"a7cfe365": "addAuction(uint40,uint256)", +"a7d0b6ce": "payoutForResult(uint256)", +"a7d0c490": "keybuy(uint256)", +"a7d0f8af": "callStoWithBto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"a7d27056": "readMessage(uint256)", +"a7d2b73f": "SharkProxy()", +"a7d2d2ab": "AngelCoin()", +"a7d30400": "window1TokenExchangeRate()", +"a7d4549c": "test(uint8,bytes32,bytes32,address,address)", +"a7d4bbe6": "modexp(uint256,uint256,uint256)", +"a7d4e89d": "migrationOperator()", +"a7d512d6": "getCertificateInfoByNo(address,uint8)", +"a7d55b76": "tryDismissRoom(uint256)", +"a7d5d4fa": "approveAddToken()", +"a7d68896": "updateCap(uint256)", +"a7d77305": "chargeMonthlyRate(bytes32,address)", +"a7d8287d": "MyFreezeContract(address)", +"a7d82b00": "setGoldCertVerifier(string)", +"a7d89168": "getLockedAmount(address,address)", +"a7da611f": "commission_mom()", +"a7da74f8": "addQuoter(address)", +"a7daf6dd": "eligibleForDividence(address)", +"a7dbb402": "changeAddress(string,address)", +"a7dbfcaa": "setCostOfToken(uint256)", +"a7dc0aee": "test_threeValidEqString()", +"a7dd7a59": "unchainedMultisigVersionMinor()", +"a7dd7e37": "distrust()", +"a7de83e6": "generate(address,address)", +"a7de9c63": "quantityFactor()", +"a7dea7e4": "getMyPastLosses(address)", +"a7dee615": "_NewListingWhitelisted(bytes32)", +"a7dfc420": "investorAmountTokensToBuy(address)", +"a7dfc874": "unregister(bytes,address,uint256,bytes)", +"a7e03dcb": "mintPerBlock()", +"a7e1a8ee": "setAttributeType(uint256,string)", +"a7e1b516": "unban_user(address)", +"a7e1c4ac": "YunbeiToken(uint256,string,string)", +"a7e1f6a2": "doubleDown()", +"a7e21e80": "hold(address)", +"a7e25683": "testShortOutput()", +"a7e2cca9": "setFinished(bool)", +"a7e328d4": "setSomeValues()", +"a7e33a0c": "sendChatMessage(string)", +"a7e350f7": "payOutGovernors()", +"a7e45699": "buyWildcardToken()", +"a7e47920": "createItems(uint256[],address[])", +"a7e48375": "MikadoToken()", +"a7e53987": "EthCapInWei()", +"a7e5a338": "HIDERA(uint256,string,string,uint256)", +"a7e5cb3e": "getWhoBet(address,uint256,uint256)", +"a7e5f1bc": "LogN_fnc(address,bytes32,uint256,string,bytes,uint256,bytes1,uint256,uint256)", +"a7e5f3c5": "likeBlock(uint256)", +"a7e74377": "_preValidateTransaction(address,uint256)", +"a7e74ab7": "setMx(bytes32,address)", +"a7e7d2f4": "BBXCoin()", +"a7e81d22": "lastBlock_f5Hash_uint256()", +"a7e86daa": "executeBidFor(address,uint256,uint256,uint256)", +"a7e92fb5": "unagree()", +"a7e93e87": "retractLatestRevision(bytes20)", +"a7e94542": "approve(address,uint32)", +"a7ea48cf": "CoinBroToken()", +"a7ead565": "FiO()", +"a7eb3848": "transferRewardWithoutFee(address,uint256)", +"a7eb685b": "mintFeeTokens(uint256)", +"a7eb891f": "isClientPaidUp(address)", +"a7ebc5bd": "privilegedAccountStatus(address)", +"a7ec619f": "getCurrentStageDiscount()", +"a7ecce5f": "removeQuitAccount(address)", +"a7ecd0ad": "getSpecialAddresses()", +"a7ee323e": "VULCAN_PROMETHEUS_FTL_SPEED()", +"a7eea700": "sale2Started()", +"a7eeea37": "NewContributor(uint256)", +"a7ef4329": "getHelloWorld()", +"a7f01e4d": "getLockedFunds(address)", +"a7f07011": "tradeExecutor()", +"a7f0b3de": "genesis()", +"a7f17bd5": "Bodcoin()", +"a7f18b5a": "setPOOL_edit_14(string)", +"a7f1b77a": "addReferralDeposit(address,uint256)", +"a7f2cc54": "feeCalculated()", +"a7f2f4e2": "getMembershipStatus(address)", +"a7f31e0a": "getCelda(uint256)", +"a7f32edd": "OfflineCastleSold(uint256,address,uint256)", +"a7f365ae": "setLockoutPeriod(uint256)", +"a7f36c2e": "setProviderPriv(uint256,bool)", +"a7f39d8a": "tokenSaleWeiGoal()", +"a7f3e70f": "setSaleTimes(uint256,uint256)", +"a7f43779": "remove()", +"a7f43acd": "reserveContract()", +"a7f49e1d": "maximumBuyBackAmountInCents()", +"a7f58c24": "computeInitialPrice(uint8)", +"a7f5eccc": "previousReturnValue()", +"a7f738df": "getRoundAheadAmount(uint256)", +"a7f7417d": "preICOFreeBonusPercent()", +"a7f81863": "thirty_wallet()", +"a7f86c63": "_removeRoomNight(address,uint256)", +"a7f879ea": "teleportToken()", +"a7f8a53c": "ownerSetControllerAddress(address)", +"a7f8fbd4": "cancel_contract()", +"a7f95a92": "HardcodedCrowdsale(address)", +"a7f9801b": "TakedFunds()", +"a7f987ee": "getDebugNow()", +"a7f9df38": "investWithBitcoin(address,uint256)", +"a7f9fe72": "getAllRecords()", +"a7fab81a": "impl_redeem(address,uint256)", +"a7fb95f6": "changeTeamName(uint256,string)", +"a7fbe7ad": "safeLastDate()", +"a7fbed9e": "getCurrentPhaseIndex()", +"a7fc7a07": "addController(address)", +"a7fca953": "getSrcQty(address,address,uint256,uint256)", +"a7fdb4f5": "finishedSale()", +"a7ff0a4e": "TransferTokens()", +"a7ff2373": "multiSendFrom(address,address[],uint256[])", +"a7ff7a40": "MANACrowdsale()", +"a7ffb2db": "getMaximumRound(uint256)", +"a7ffe560": "batchSpawnAsset(address,uint256[],uint256[],uint256)", +"a8006dfe": "exec_admin()", +"a801ea25": "launchLotto()", +"a801fd63": "setNewValue()", +"a802257d": "addr_Saddlery()", +"a8026912": "setSource(address)", +"a802afa1": "minOfArray(uint256[])", +"a80325bd": "toB32(bytes)", +"a804903a": "FOUNDER2()", +"a80498f1": "AdvancedDeposit(bytes32,uint256)", +"a804cc7d": "setUser(address,address,string,string,bool,bool,bool)", +"a804da18": "cliffReleasePercentage()", +"a804fcb4": "COMMUNITY_PERCENT()", +"a805bfef": "addInvestors(address[],uint256[],uint256[],address[])", +"a8074b55": "bundlingDenied()", +"a807598e": "incluirUsuario(address)", +"a8077951": "updateLastBuyKeysPIDs(uint256,uint256)", +"a807ea0f": "newMostInviteTimes_()", +"a8083b74": "setContributionSettings(uint256,uint256,uint256)", +"a8084938": "CryptoCupToken()", +"a80955b1": "setFoundersTokenAllocation(uint256)", +"a80a60fb": "saleFirstPresaleEndBlock()", +"a80a9e40": "setActive(address,address,uint256)", +"a80acfd3": "DisableSelling()", +"a80aee59": "isActiveDelegate()", +"a80bf3e6": "tokenLocker()", +"a80bffb6": "tokensOfSell()", +"a80c609e": "tokenImbalanceData(address,uint256)", +"a80c89d2": "RollbackedContract(uint256,address,address)", +"a80d2fb4": "getPeerMessageCount(address,address)", +"a80d4e9a": "EtherAuction(uint256)", +"a80da0f1": "SpursvsWarriors419()", +"a80da34a": "propertyAreaSqFtOf(uint256)", +"a80db9fb": "nextStealTimestamp()", +"a80dca57": "recharge(string)", +"a80de5ea": "lottery(uint8)", +"a80e3659": "testDisputedReadValid()", +"a80e6c01": "getClassPlayers(uint256,uint256,uint256)", +"a80f54ca": "transferToExchange(address,uint256)", +"a80f9e2d": "RankingBallGoldCustomToken(address)", +"a80fe377": "Goahead()", +"a8103621": "dividendsPayed()", +"a810385e": "setBla(string)", +"a8103c80": "SSHToken(uint256,string,uint8,string)", +"a81077a7": "usersRegistered()", +"a810a54c": "withdraw(bool)", +"a810bc13": "ETCharPresale_v2(address)", +"a8132a46": "hardCapInToken()", +"a8140c95": "OceanScapeCoin(uint256,string,string)", +"a8150e72": "removeOrderOfVendor(address,uint256)", +"a8154e17": "teamUnfreezeDate()", +"a815a85d": "getItemCounts()", +"a815ff15": "set(string,address)", +"a8164a84": "ThxMsg(address,string)", +"a816899e": "icoBalances(address)", +"a817163b": "BusTokenLock(address,address)", +"a817ccac": "threeParams()", +"a817d2de": "extract20(bytes32)", +"a817f668": "findPlayer(address)", +"a8181851": "dapCarToken()", +"a8182cd3": "serverCancelActiveGame(address,uint256)", +"a818a222": "TokenAdded(address,uint256,uint256)", +"a819515d": "updateParentTotalTheoreticalSupply()", +"a819819b": "sweepDeityCommission(uint256)", +"a819c36c": "ClapToken()", +"a81a3e4d": "hasOpenApplication(address)", +"a81afa57": "sellSpecialTokens(address,uint256)", +"a81c3bdf": "ethFundDeposit()", +"a81c804e": "addToWhitelistBulk(address[])", +"a81d18d7": "setTokenMeta(uint256[],uint256[],uint256[])", +"a81d3424": "getFrozenToken(address)", +"a81daf29": "ETHernitymining(address)", +"a81dfde0": "CBT()", +"a8201894": "getCurrAuctionPriceAuctionID(uint256)", +"a820b44d": "iterateStart()", +"a820d02e": "MarketingDevelopmentAmount()", +"a8222adf": "sellerNumOpenDeals()", +"a82375d1": "ToGoConcert(uint256,string,string)", +"a8239d0b": "getPrice(string,address)", +"a8243ff4": "getactlen()", +"a824bd9a": "autoSell(address,uint256)", +"a824e636": "walletSend(address,uint256,address)", +"a82524b2": "presaleStartTime()", +"a8267482": "msp()", +"a826b422": "addCbAddress(address,bytes1,address,bytes)", +"a826ee78": "submitResult(uint256,uint256[])", +"a8276d97": "SetcashOutTime(uint256)", +"a827ef0a": "EvLoveItemAdded(bytes32,address,uint256,uint256,string,string)", +"a828251e": "voteProposal(bytes32,address,address,uint256,bytes32,string,bytes)", +"a8287f79": "addProduct(address,uint256,string,string,string)", +"a828eec5": "pureFn(uint256)", +"a828f441": "redeemFromEscrow(uint64)", +"a82970d7": "SetWorldData(uint256,uint256,uint256,uint256,uint256)", +"a829c3d1": "requestArbitration(bytes32,uint256)", +"a829d8ec": "VUP_TOKEN_SUPPLY_TIER4()", +"a82aa270": "updatePick(uint256,uint256)", +"a82b3640": "getDrawP()", +"a82ba2d5": "renounceKeeper()", +"a82cb091": "BuyDoubler()", +"a82d1d1a": "TwinkleToken()", +"a82d4ac1": "Crowdfunding(address,address,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"a82e0dcc": "theCyberMessage(string)", +"a82e1374": "changePublicallocation(uint256)", +"a82e3179": "jingleContract()", +"a82fc94f": "issueTokensPresale(address[])", +"a8308665": "add5NewTraits(string,string,string,string,string,bool)", +"a8311aa8": "getParties()", +"a831751d": "addPartOwner(address)", +"a8319481": "cancelRole(address,address)", +"a831f0bb": "compareStringValue(bytes32,bytes32,bytes1)", +"a8321459": "topUpAvailable()", +"a8324a3f": "batchRestoreWebGift(address[])", +"a832d7df": "newSell(uint32,address,uint256)", +"a83332d5": "TokeniVOX(uint256,string,string)", +"a833386b": "toBytes32()", +"a833c7ab": "incentivisationAllocation()", +"a83467a1": "dividendcommission()", +"a8347f6a": "maxCrowdsaleCap()", +"a834c43d": "buyAccess(string)", +"a83500e0": "check_redeemed(string)", +"a8351c03": "pauseCrowdsale()", +"a83627de": "updatePeriod()", +"a8366fef": "TOKEN_STANDARD_ERC20()", +"a8370492": "setTrFee(uint256)", +"a83723f3": "runRotateTime(uint256[],bytes32,bytes32)", +"a8372511": "STCoin(uint256,string,string)", +"a837aeb2": "AdminStartDraw(string,bytes32)", +"a837c35e": "createAmountFromEXORForAddress(uint256,address,address)", +"a8385231": "sendTokensToAddress(uint256,address)", +"a839fc56": "setGoalAchieved(bool)", +"a83b1e21": "reply(string,bytes32)", +"a83cf7fe": "RefundVault(address)", +"a83e1d10": "getUserQuoteIds(address)", +"a83f9429": "extend1Week()", +"a840617f": "LogKycRefused(address,uint256)", +"a840d2a8": "GTO()", +"a8418d01": "BECToken(uint256,string,string)", +"a841da4b": "lockJackpots()", +"a841f1eb": "handleFunds(address,address,uint256)", +"a842375e": "refundToken(address)", +"a842f0f2": "upgradableContractAddress()", +"a843c51f": "transferContractOwnership(address)", +"a843c97f": "attack(uint256,uint256,uint256[])", +"a844545d": "completeMinting()", +"a84524a4": "getDetailedPollResults(uint256,uint256)", +"a84694c8": "permissionIndexOf(uint8,address)", +"a8469ce9": "MINING_REWARD()", +"a846c2fd": "payback(uint256)", +"a846fa37": "waitQuery()", +"a8474a30": "_computeRunes(uint256)", +"a847a1b3": "StarbasePresaleWallet(address[],uint256,uint256)", +"a847a71c": "isOnTrading(uint64)", +"a8484938": "doApprove(address,uint256)", +"a848e2ec": "tokenSupportSoftLimit()", +"a8492f46": "pickTicket(bytes4)", +"a84950df": "calculateTimeBonuses(uint256)", +"a8496426": "getOrderId()", +"a849cef8": "minDeposits(uint256)", +"a84a70aa": "lockedTime(uint256)", +"a84b9de0": "dequeueDouble()", +"a84c5330": "createNewRevision(bytes20,bytes)", +"a84c6362": "ICO_CAP4()", +"a84d073a": "interfaceMintTokens(address,uint256)", +"a84dd3a6": "teamWallet_3()", +"a84e5f40": "CRYPTONEREUM()", +"a84eb999": "removeAddresses(address[])", +"a84ebb58": "setVM(bytes32[10],uint256[4])", +"a84f3e5a": "overdraftUnvested()", +"a84f763b": "TokenTransferred(uint256,address,address)", +"a84fa137": "transferToRound(uint256)", +"a8514113": "_emitCategoryEvaluated(address,address,uint8,uint256,uint256)", +"a85165e0": "checkSubPrice(bytes32)", +"a8516d21": "_withdrawTokens(address,uint256)", +"a851e2f6": "LogCreateNET(address,uint256)", +"a852995d": "bonus1StartETH()", +"a852d5ba": "emergency_withdraw(address)", +"a853d2cd": "getUserByUsername(bytes20)", +"a8540daa": "getSellPriceDecimals()", +"a8542f66": "ANY()", +"a8545830": "transact_token1(address,address,uint256)", +"a855d4ce": "uintStorage(bytes32)", +"a8565523": "AquaPay(string,uint256,uint8,string)", +"a8567a1c": "bidderUpdateBid()", +"a85688d2": "_rewardPoS()", +"a856b9c2": "lastRandom()", +"a85717d3": "open(bool)", +"a8575102": "getDnasCount()", +"a8590135": "issuanceEnabled()", +"a85923aa": "ZibPay()", +"a859a092": "minToken()", +"a859eb81": "BONUS_TIER_4_LIMIT()", +"a859fffe": "SweDexDividends()", +"a85a726d": "NewUser()", +"a85aba19": "setPreURI(string)", +"a85ade82": "FOUNDERS_VESTING_DURATION()", +"a85adeab": "endTimestamp()", +"a85b13b9": "claimBitNauticTokens()", +"a85c06b7": "_packRaceData(uint256,uint256,uint256,uint256)", +"a85d11b3": "verifyCode(bytes32,uint256)", +"a85d3179": "getMiningRate(address)", +"a85e07e2": "getMesa(uint256,uint256,uint256)", +"a85e59e4": "transferFrom(bytes,address,address,uint256)", +"a85ef579": "appendDarknode(address,address,uint256,bytes,uint256,uint256)", +"a85f3761": "repayments(uint256)", +"a85f5c2e": "tradingData()", +"a85ffd1a": "setAutoDistributionViaETHContributions(bool,bool)", +"a85ffe4f": "manualSell(address,uint256)", +"a860bfa2": "BRCToken()", +"a860d119": "communityTokenHolder()", +"a861baea": "presale_address()", +"a861e16f": "setEmployeeSalary(address,uint256,uint256)", +"a861f99a": "getClientPaidUpTo(address)", +"a8627c15": "LINICOIN()", +"a863f595": "Btczocker(uint256,string,uint8,string)", +"a86416e2": "CROWDSALE_PRICE()", +"a8644cd5": "contract_eth_value_bonus()", +"a86477ad": "offeringEnabled()", +"a8648aad": "TokenFunctions()", +"a8659216": "setInitialLockinDays(uint256)", +"a8660a78": "vestingStartTime()", +"a866665a": "ConsoToken()", +"a8670711": "isCloseSale()", +"a8681169": "withdrawWhiteList(uint256)", +"a868378b": "returnOfIncome(address,uint256)", +"a8683df7": "TokenMyUnicoin(uint256,string,string)", +"a868cd6f": "LogPolicyManualPayout(uint256,bytes32)", +"a868ec85": "setName(uint256,uint256)", +"a86abb3d": "allFilmsInfo(uint256)", +"a86b73f0": "toByte(uint8)", +"a86bc181": "EXPECTED_END()", +"a86c938b": "balanceOf(bytes8,address)", +"a86e3576": "symbol(address)", +"a86ed5e4": "thirdMaxAmount()", +"a86ee746": "restoreCutieToAddress(uint40,address)", +"a86f7212": "_allocatePlayerTokensTo(address,uint256)", +"a870a0a5": "getChannelClosingSettler(bytes32)", +"a870be8a": "setVendingStepValues(uint256,uint256,uint256)", +"a870ddc2": "moveTokensFromSaleToCirculating(address,uint256)", +"a871da91": "SHORT()", +"a871ffdc": "Getsafe(uint256)", +"a87253c7": "getlastuser()", +"a873b155": "GetMinimumBet()", +"a8740a71": "getCreditLedger(uint256)", +"a8754caa": "purchaserMapping(address)", +"a8756337": "getCurrentValidatorsLengthWithoutMoC()", +"a87595ce": "buynowPrice()", +"a875b2ed": "setIsBatch(bool)", +"a87607af": "Show_address_for_option_B()", +"a8762854": "numberInRaffle()", +"a8766017": "ARXToken()", +"a876a8a0": "_round()", +"a877b557": "TransferMinimumFeeExecuted(uint256,address,uint8)", +"a877db9f": "none()", +"a878ad27": "createTokenToOperation()", +"a878aee6": "withdrawAllTokens(address)", +"a8790533": "distribution(address[],address,uint256,uint256,uint256,uint256,uint256)", +"a879af45": "oldTokenBalance(address)", +"a879fcbb": "assetInfo(uint256)", +"a87af57b": "setTokenForSale(uint256,uint256,address,bool)", +"a87b1cd2": "whitelistedBeforeActivation(address)", +"a87b73c7": "StageOpened(uint256)", +"a87ced35": "startDispute(bytes32,address,int256)", +"a87d2321": "Gummy()", +"a87d8b6b": "walkClientOrders(address,uint128,uint128)", +"a87d942c": "getCount()", +"a87de9cc": "ADD(uint256,uint256)", +"a87e0c33": "newAgon(uint64,uint64)", +"a87e5d3f": "setPriceUpdateFrequency(uint256)", +"a87e7552": "isValid(bytes,bytes)", +"a87e8aad": "getMyCat()", +"a87ebcb5": "setJackpotMinimumAmount(uint256)", +"a87f32a2": "ownFiles(string,string,string)", +"a87f84fc": "updatePersonLocation(uint256,string)", +"a87ffd1d": "GenesisInitialSupply(address,address)", +"a880319d": "addToken(address,string,string,uint8,bytes,bytes)", +"a880531f": "getOraclizeCbAddress()", +"a8817403": "addFamedStar(string,uint256,uint256)", +"a881f85e": "clearTokenSale(uint256)", +"a8825650": "slice(bytes32[],uint256,uint256)", +"a8826602": "getAllCellIds()", +"a882d49f": "replaceMultisig(address)", +"a8834aac": "getPointer(uint8)", +"a8836844": "returnPayees()", +"a883aab3": "GlobalAmountCapHard()", +"a883b0c4": "changeRate(uint256,uint256)", +"a883fb90": "getPendingVersion()", +"a884a248": "getFill(bytes32)", +"a885508a": "removePermissionManager(address,bytes32)", +"a885dab6": "getTokensPerDay(uint256)", +"a8862fcc": "isEscaping(uint32,int256)", +"a8865bda": "masternodeIsValid(address)", +"a886d66f": "crowdsaleList(uint256)", +"a8870d6f": "mintingDataUpdatedAtBlock()", +"a88775e0": "rememberOldestBlock()", +"a887d816": "checkTransferRequirements(address,uint256)", +"a888e4c9": "releaseSingleAm()", +"a8893a6e": "getNumOfSalesWithSameId(bytes16)", +"a88b2562": "AZLTEST()", +"a88b61aa": "isIncreasedEnough(address)", +"a88be96b": "RESERVE_EXCHANGE_RATE()", +"a88c0a9f": "LAMP()", +"a88c5ef7": "NextPayout()", +"a88c906c": "_buyUninitializedPixelBlock(uint256,uint256,uint256,bytes32)", +"a88d1902": "get_asset_count()", +"a88e34cb": "setERC20address(address)", +"a88ec6fa": "showUnpaidDepositPercent(address)", +"a88ef2d3": "CarlosToken()", +"a88fa4b4": "updateStartTimeManually(uint256)", +"a88fe42d": "setPrices(uint256,uint256,uint256)", +"a88fe73a": "discountValue10()", +"a89004c5": "modifyQuanticCloudIOTData(uint256,uint256)", +"a89026a3": "teamProfitAddress()", +"a890b7d9": "finalize(address,bool)", +"a890d257": "IsThisPrivate()", +"a8915c7e": "periodPreITO_weiPerToken()", +"a89171e3": "checkHasilBet(address)", +"a89196a6": "eraExists(bytes32)", +"a891af67": "megaCandy()", +"a891fdc3": "earlybirdEnded()", +"a8928b45": "withdraw_internal(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[4])", +"a8929183": "LinkyexToken(address,address)", +"a894878d": "createPromoMeme(address,uint256,string,uint256)", +"a8967557": "isPresaleClosed()", +"a896d92d": "isRegularAddress(address)", +"a8977041": "Plenum(uint8,uint256)", +"a8978434": "softResolveAnswer(uint256)", +"a8986327": "minTokenForSP()", +"a899e615": "raiseRatio()", +"a899ef57": "parentSnapshotId()", +"a89a4f09": "creatorBalanceChecker()", +"a89acca4": "setCrowdsaleDates(uint256,uint256)", +"a89ae4ba": "oracleAddress()", +"a89c5be0": "MAX_TOTAL_TOKEN_AMOUNT()", +"a89c8c5e": "setTokenAddresses(address,address)", +"a89cdad9": "nextSnapshotTime()", +"a89d1eb9": "foobarToken()", +"a89f173c": "setUint(int256,uint256,uint8,uint16,uint32,uint256)", +"a89f5f85": "cmp(uint256,uint256,bool)", +"a89fb977": "investorDeposited(address,address)", +"a8a01c3e": "cvcOwner()", +"a8a1d27b": "firstRoundWMTokensLimit()", +"a8a403df": "MaptPresaleToken(address,address)", +"a8a4bf11": "startNewAuction(uint64,uint64,uint64,uint64)", +"a8a52747": "getRelayedSender(bytes16,uint8,uint128,uint8,bytes32,bytes32)", +"a8a54008": "registerAddress(address)", +"a8a5c22c": "refineCost()", +"a8a618e9": "draw_random_card(uint8)", +"a8a6e9df": "deliveryToken(uint256,uint256)", +"a8a77984": "StoreBytes(bytes)", +"a8a9aaa9": "TokenLayer(address,address)", +"a8aa1b31": "pair()", +"a8aa7e19": "buyTeamHandle(string)", +"a8aaa2a6": "StringMapper()", +"a8aae025": "delFromList(string,address[])", +"a8abe1fb": "getCET4ScoreById(uint32)", +"a8abe69a": "getTransactionIds(uint256,uint256,bool,bool)", +"a8ac262b": "phaseCrowdsale()", +"a8ae3745": "evaluateTokens(uint256,address)", +"a8ae3e4b": "getAllocatedTokenValue(address,address,address)", +"a8ae5eb8": "howManyTanks()", +"a8ae9046": "RFToken()", +"a8aeecd9": "getCostForBattleCards(uint256,uint256,uint256)", +"a8af232b": "withdrawTopUp()", +"a8af4ff5": "getRegistrationStatus(address)", +"a8af6e05": "emitHashSet(address,bytes32,bytes32)", +"a8af74f1": "calcTrackerCount(uint256)", +"a8afc538": "priceAtInitialAuction(uint256,uint256)", +"a8b0312c": "GameStatus(uint8,uint8,uint8,uint8)", +"a8b05162": "_changeTilePrice(uint8,uint256)", +"a8b151fd": "santaFundWallet()", +"a8b1895d": "leftLottery()", +"a8b25075": "allowTransfers(bool)", +"a8b26420": "isUInt64ValidIn64(uint64)", +"a8b31f04": "HHH3(string,string)", +"a8b322b6": "verifiedWinnersCount()", +"a8b3f80f": "getListTokens(address,uint256,uint256)", +"a8b415d2": "BanliangCoin()", +"a8b42f1f": "registerAsAnOpponent()", +"a8b50ee0": "getWinnningsLength()", +"a8b57f15": "VIPPurchase(address,address,uint256,uint256)", +"a8b60b93": "ackMsg(uint256,string)", +"a8b65043": "useChainlinkWithENS(address,bytes32)", +"a8b82c5b": "BaseAgriChainContract()", +"a8b86c4c": "ZchargeToken(uint256,string,string)", +"a8b8799f": "getRecordId(uint256)", +"a8b88268": "checkEarlybird(uint256)", +"a8b973a1": "bonusMultiplier()", +"a8b981d3": "FOURTH_RATE()", +"a8baa97d": "getPlayerDetectGroup(address)", +"a8bb76d4": "checkSettlement()", +"a8bbe5a4": "ERC20Voting(address)", +"a8bc362e": "KleynCoin()", +"a8bc3a6c": "whitelistedPlannedContributions()", +"a8bcbf3c": "payManagementBodyAmount(uint256)", +"a8bd9c32": "tokenIndexToApproved(uint256)", +"a8bda3e9": "getTRed(uint256,uint256,uint256)", +"a8beb2cf": "Lockup6m_20180801(address)", +"a8bfd57f": "getMinerOffset()", +"a8c0f15e": "addProperty(bytes32)", +"a8c10d78": "BetSubmission(uint256)", +"a8c12d7c": "PayMain(address)", +"a8c17ec2": "incremental(uint256)", +"a8c1a0b7": "BuyTokensExternal(address,string,uint72,uint88,uint88)", +"a8c23cb9": "isValid(bytes32,string,address,uint256,address)", +"a8c278a2": "verificationFee()", +"a8c2c4a7": "mainICOEndTime()", +"a8c310d5": "distributeAmounts(address[],uint256[])", +"a8c3d246": "LamaToken()", +"a8c3ec48": "oraclize_query(uint256,string,string[2])", +"a8c499a0": "lrcDeposited()", +"a8c4c8bc": "right64(uint256)", +"a8c65126": "determineNextRoundLength()", +"a8c69264": "setreleaseFinalizationDate(uint256)", +"a8c6e684": "addint16(int16,int16)", +"a8c89c5b": "payableEnabled()", +"a8c923e2": "BlockchainDevCoin()", +"a8c9f8ae": "unSoldTokens()", +"a8ca698b": "absSub(uint256,uint256)", +"a8cab3d1": "Frozen()", +"a8cb7b4f": "ownerRequired()", +"a8cbabb7": "blockCrowdsale()", +"a8cbb5de": "addMake(uint256)", +"a8ccef6c": "setClue2(string)", +"a8cd0a80": "getTest()", +"a8cdcebd": "exchangeIdsToOpenMakeOrderIds(uint256,address)", +"a8ce0e60": "QuestTestToken()", +"a8ce6b73": "calculateWithdraw(uint256,uint256,uint256,uint256)", +"a8d00e73": "dayLength()", +"a8d088bb": "getManagers()", +"a8d10fb8": "getOrgCount(string)", +"a8d18472": "estWolkToBurn(address,uint256)", +"a8d18bc0": "HireGoCrowdsale(uint256,address)", +"a8d1fcff": "cancelNewBallot()", +"a8d201ab": "removeNodeFromWhitelist(address)", +"a8d34ea5": "getCompte_10()", +"a8d3a63d": "pullEtherFromContractAfterICO()", +"a8d48709": "EARLYBIRD_PRICE_MULTIPLIER()", +"a8d49e64": "setWhitelistAdmin(address)", +"a8d4a03b": "heroes(uint256)", +"a8d4ee0f": "setOwnerExt()", +"a8d51f7e": "GiftToken(address)", +"a8d5308c": "bountymanager()", +"a8d5652e": "tokensPerTier()", +"a8d5efa3": "CATPayment(address,address,uint256)", +"a8d5fd65": "share()", +"a8d84b7c": "purchaseWithIndex(uint256,uint256)", +"a8d84fc3": "activeEnd()", +"a8d88127": "exists(int256,int256)", +"a8d8c7c8": "adddayeths(address,uint256)", +"a8d8e055": "checkAddressBatch(address[])", +"a8d95496": "getHighestPriceOwnerAt(uint256)", +"a8d95fb2": "claim(address,string)", +"a8d99045": "totalSellCardNumber()", +"a8d9a89a": "initialICOCap()", +"a8d9e8a3": "sendFeeIfAvailable()", +"a8da6873": "_fetchCreatedOrdersForPayer(address)", +"a8dab783": "isPASigned(uint32)", +"a8db1837": "test_updateAndGetPrice()", +"a8db2445": "setCompany(address)", +"a8dc824c": "unlockSupply()", +"a8dd07dc": "totalBonus()", +"a8ddefab": "withdrawNacNetfRe(uint256)", +"a8df3e69": "post(address,address,uint256,string)", +"a8df7894": "investDirect(address,uint256)", +"a8df80ad": "Hellob()", +"a8df99a9": "_emitSkillsSet(address,uint256,uint256,uint256)", +"a8e02ccb": "activeCall(address)", +"a8e04f34": "disableInitialStage()", +"a8e1903c": "RevokeTokens(address)", +"a8e1b53f": "AICoin(address,uint256)", +"a8e3371a": "eduCash(uint256,string,string)", +"a8e3a6b6": "communityTokensCap()", +"a8e48a7e": "PausableCrowdsaleImplUnpaused(uint256,uint256,uint256,address)", +"a8e496b9": "toDay(uint256)", +"a8e4fb90": "proposer()", +"a8e553f5": "decrypt(uint32[26],uint32[4])", +"a8e5740c": "setOgToken(address)", +"a8e5e219": "jobStatus(uint256)", +"a8e5e4aa": "approveERC20(address,address,uint256)", +"a8e6e77b": "addManyAdmins(address[])", +"a8e6ee52": "goldCertVerifier()", +"a8e6f9dc": "set_property_address(uint256,string,address,string,string,string)", +"a8e70dd3": "unblockMessagesFrom(address)", +"a8e81844": "GeneBTC()", +"a8e8f677": "maxDice()", +"a8e91396": "setICOPriceatDollar(uint256)", +"a8e9b249": "versionSelectors(bytes32,bytes32)", +"a8ea8554": "changeAmount()", +"a8eaefd7": "TotalFee(address[])", +"a8ec9ffb": "CrowdsaleStageStarted(uint256,uint256,uint256,uint256,uint256)", +"a8ecc7f1": "rbac()", +"a8ed1be5": "bts_address2()", +"a8eee036": "Locality(string)", +"a8ef4b66": "PERMISSIONMANAGER_KEY()", +"a8ef6edd": "testTrusting()", +"a8f02555": "DXF_Tokens()", +"a8f03616": "ownerTokenSharePct()", +"a8f06876": "CETToken(uint256,string,string)", +"a8f07dcc": "minimum_investment()", +"a8f0d3a7": "getArrayBytes32(bytes32)", +"a8f0e6e2": "sellPriceOf(uint256)", +"a8f0ebeb": "decreaseClaimsBalance(address,uint256)", +"a8f0fbbd": "helloToken()", +"a8f11eb9": "autoDistribute()", +"a8f2ba4c": "bet_win()", +"a8f2d63b": "isPublicTokenSaleRunning()", +"a8f436df": "startEvaluating()", +"a8f56600": "model_accuracy_criteria()", +"a8f5bbd9": "initiateUser()", +"a8f5c673": "savePepe(uint256)", +"a8f653fa": "finalizeStage()", +"a8f6c913": "erc20Contract()", +"a8f6d313": "minimumFundingUSD()", +"a8f6d84d": "returnPercentage()", +"a8f6f1f0": "randomGenerateMethod()", +"a8f7e238": "getAdminsForGame(uint256)", +"a8f7f82d": "ICO_start_future(uint256)", +"a8f8884d": "botIndexToApproved(uint256)", +"a8f899a0": "LogBuyForInvestor(address,uint256,string)", +"a8f8c6de": "getCollaborated(uint256)", +"a8f8e2ae": "testFailIfReverts()", +"a8f927e9": "getLanguage()", +"a8f92b52": "MindCoin(uint256,string,string)", +"a8f9868e": "getTotalBalanceFor(address)", +"a8fa14b0": "disableContractUpgradability()", +"a8fa2fc6": "getCurrentDevReward()", +"a8fa5682": "dnsRecord(bytes32,bytes32,uint16)", +"a8fa6e14": "setLastRewardTime(uint256,uint256)", +"a8fa8e52": "valuePerToken()", +"a8fac082": "claimMonthlyDemurrage(uint256)", +"a8faf6f0": "SmartAirdrop()", +"a8fc1a2a": "realDevReward()", +"a8fc32de": "sendDividends()", +"a8fca0fc": "toRtc(uint256)", +"a8fd1026": "gemPerEther()", +"a8fdb290": "EtherToken(uint256,string,string)", +"a8fdf903": "_underMintNextTokenId(uint256)", +"a8fe43ce": "getVotingProxy(uint32,int256)", +"a8fe5465": "PRE_SALE_15_BONUS_MIN()", +"a8feda51": "processRefunds()", +"a8ffa37f": "gameTokenResolution(uint256,address,uint256,address,uint256)", +"a8ffa9d9": "addCandidato(string)", +"a9011990": "getOneDepositRec(uint256)", +"a90135df": "pgoInternalReserveWallet()", +"a9014b0f": "isListed(uint64)", +"a9018896": "refreshScore(uint8,bytes32)", +"a901aaa0": "AirRewardmaxTotalSupply()", +"a901ce92": "founderTokenWithdrawnPhase4()", +"a9030162": "refundFish(address,uint256)", +"a903073e": "getOwnerTeam(address)", +"a9036b43": "Minter(address,uint256,uint256,uint256)", +"a903741a": "TEAM_BONUS()", +"a904cc53": "withdrawEtherBalance(uint256)", +"a904d13d": "setShifter(address,address)", +"a904e5c8": "TRM1BonusActive()", +"a9055b81": "makerRequiredKncStake(address)", +"a9059cbb": "transfer(address,uint256)", +"a905f4c0": "DUOLINGO(uint256,string,string,uint256)", +"a9061415": "getsellmoney(uint256)", +"a9064e29": "indexshow()", +"a906f837": "relocationSwitch(bool,address)", +"a9076f9e": "setBidding(bool)", +"a908f2e3": "Faucet(string,address)", +"a9092c11": "numChoices()", +"a909d7d3": "removeTokenEmission(uint256)", +"a909fc56": "mint(int256,address)", +"a90a4ac2": "addStruct1(string)", +"a90a6427": "setPaydayFrequencyInDays(uint8)", +"a90a6952": "EmissiveErc223Token(address,string,uint8,string,string)", +"a90a8eea": "getDaysInYear(uint16)", +"a90ae887": "claimPayment(uint256,uint256,bytes)", +"a90b5e62": "setTokensContractAddress(address)", +"a90d3cda": "totalContributionsBy(uint256,address)", +"a90e0608": "icoFinalized(uint256)", +"a90e09e2": "addWhitelisted()", +"a90e65a3": "MinorPrizePayout(address,uint256,uint8)", +"a90eb2b9": "sendFundsToNextCycle(uint256,uint256)", +"a90f8e9a": "referredBy(address)", +"a90fcfa0": "_generateName(string,string)", +"a90fd971": "minerRelaseTime()", +"a90fdf20": "test_bytes(bytes)", +"a910a531": "_approveTokenTransfer(address,address,uint256)", +"a9112140": "change(address,uint256,uint256)", +"a91202d3": "createUser(bytes32,bytes32)", +"a9120f6d": "release_by_manager()", +"a913c43f": "getLockedAmount_jiedians(address)", +"a913eb24": "_price_token_ICO2()", +"a9142808": "logFollowerTradingTx(bytes32)", +"a9147e22": "setIsCheckStage(bool)", +"a9157518": "add5NewStreetNames(string,string,string,string,string)", +"a9171d56": "purchaseCallbackOnAcceptAndDistribute(uint256,address[],uint256[])", +"a9188878": "setPrimordialPrices(uint256,uint256)", +"a918c09c": "supplyFuel(uint256)", +"a91a1080": "getCase(uint256)", +"a91a39ad": "havedCrowdCoin()", +"a91aae63": "NihilCoin(uint256,string,uint8,string)", +"a91abdcb": "referralCut()", +"a91b2e9f": "getProfit(uint256)", +"a91bc3cd": "nextMinimumTimeout()", +"a91be87f": "addEarlylist(address[],address)", +"a91c39a9": "setEnergyCost(uint256)", +"a91ce985": "createOrder(address[3],uint256[4])", +"a91cec21": "ineRexToken()", +"a91cfecf": "Foosball()", +"a91d6c65": "initLockedBalanceOf(address)", +"a91d99db": "whitelistAddressesPresale(address[])", +"a91ed8c6": "mintReserve(address)", +"a91ee0dc": "setRegistry(address)", +"a91f559d": "NeLunaCoin()", +"a91faadf": "JoshContract()", +"a91fbb99": "MonetoSale(address,address)", +"a91fc821": "Registry(address,address,address)", +"a9203f3c": "getFlower(uint256)", +"a92100cb": "loop()", +"a921ba7d": "totalBattleboards()", +"a9221706": "_transferAndCall(address,address,uint256,bytes)", +"a9225743": "_commitBallot(bytes32,uint256,uint256,bool)", +"a92259fc": "AVAILABLE_TOTAL_SUPPLY()", +"a923ebac": "unbindEthereumAddress(address,bytes32)", +"a923fc40": "setInfo(string,string)", +"a9240e32": "setEtherRatioForOwner(uint256)", +"a924d3ca": "getMangers()", +"a924ee60": "disableTokenMinting()", +"a9250212": "publicationCount(address)", +"a925252a": "acceptAuctionResult(address,uint256,string)", +"a925d85e": "Exchange(address,address)", +"a926819f": "disableWallet(address)", +"a927f46b": "Etherwow()", +"a9287619": "buyXaddr(uint256,address)", +"a9293efe": "calculateSeasonScore(address,int8)", +"a92950f6": "chainWith(uint256,uint256)", +"a9298848": "askForALoan(address,uint256,uint256)", +"a92aafb0": "paused_1()", +"a92ab316": "EIN()", +"a92c300a": "getBidData(uint256)", +"a92c3231": "stageNumber()", +"a92ca27d": "editionInfo(uint256)", +"a92d5367": "changeTournamentTaxAmt(uint8)", +"a92d6a48": "disableAuthentication()", +"a92ec661": "isAfterStartTime()", +"a92f0c80": "TokenVesting(uint256,uint256,uint256)", +"a92f0cb9": "withdrawFailedOldOwnerTransferAmount()", +"a92fcf9c": "addRecord(string,string,string,bytes32,int64)", +"a9321573": "addExcluded(address)", +"a9324192": "walletOut1()", +"a9328435": "getMinimeCheckpointsLengthSlot(address,uint256)", +"a932ed0d": "whitelistRemove(address)", +"a934dd0c": "getFeeAmount(uint256,uint256)", +"a936444a": "POWH33()", +"a936c203": "reLoadXid()", +"a937c28b": "authorisedInvestors()", +"a937f12b": "TidealToken(address)", +"a9390454": "DevvotePrefund(address,address)", +"a9393452": "getAuctions(uint32,uint32)", +"a9396a1b": "getStageInfo()", +"a93a77c1": "available_percentage()", +"a93b1a65": "_referrerTax(uint256,bool)", +"a93b5331": "totalFundingSupply()", +"a93c1286": "Y2CASH()", +"a93d7c72": "quickChange(address[],uint256,uint256)", +"a93deda4": "Philanthropy(address,string,uint256,uint256,uint256,uint256,uint256)", +"a93e0386": "preSaleBonus4Amount()", +"a93e2b49": "YBQ()", +"a93e4044": "getCountTokensByLottery(uint32)", +"a93e8701": "BetCanceled(address,uint256)", +"a93fd5f1": "organizer5()", +"a940565e": "haveIBeenNaughty(address)", +"a9405923": "getParent(address)", +"a9405f4f": "HashToFileName(string)", +"a940d013": "ether_profit()", +"a9414cc3": "getPositionsAndTokensCnt(uint256)", +"a941be3c": "internalBuy(address,uint256,bool)", +"a941c8d6": "calculateWinningEntries()", +"a941ff21": "getCampaignEndDateById(bytes32)", +"a942bf05": "dDeployCommunityBallot(bytes32,bytes32,bytes32,uint128)", +"a942de01": "createSetup(uint256,uint256,address[])", +"a9430dcb": "Shabu()", +"a94385a0": "donateFromWallet(uint256)", +"a94387a6": "raiseBuyOrderCreated(address,uint32,uint32,uint80,uint256,int160)", +"a943c21f": "getVotingResult(address)", +"a9445499": "ZperMainSale(address,uint256,uint256,uint256)", +"a944f15b": "createAuction(address,uint16,uint16,uint256,uint64,uint16,uint16,uint64,uint256)", +"a94510ca": "withdraw_badge()", +"a9457d9c": "whatIsCurrentCap()", +"a945c5c3": "totalInvestments(uint256)", +"a945f90f": "partnersWallet()", +"a9466a88": "getAllScripts(uint256)", +"a946d7bb": "setMedalsClaimed(uint16)", +"a9472396": "getClientReward(uint256)", +"a94834a1": "openGameRange(uint256,uint256)", +"a948d72d": "ZethrBankroll()", +"a9496e73": "timeBeforeJackpotReset()", +"a949c637": "addOwner(address,address,address)", +"a949f3af": "getMyLastCollectHour(uint32)", +"a94a06e8": "findRegularTime()", +"a94ab274": "corePay(uint256,uint256,uint256,string,uint256)", +"a94c33a6": "Auxilium()", +"a94c468d": "RemoveRank(uint256,uint256)", +"a94c7c65": "limitedPrint(address,uint256)", +"a94e7ed4": "isSpecificallyApprovedFor(address,uint256)", +"a94feacc": "claimTokenWindowOpen()", +"a95022a6": "GoodTimeCoin(uint256,string,string)", +"a95055a8": "getPlayerBoardsIDs(bool)", +"a9505eb4": "maxOfArray(uint256[])", +"a950fb0e": "b64decode(bytes)", +"a9510f89": "totalAmountOfTokens()", +"a951c534": "_CallScheduled(bytes32)", +"a951c994": "setSetupComplete()", +"a951f28e": "dayaToken()", +"a951fad2": "CryptoX(uint256,uint256)", +"a9522f4e": "IsDividendAvailabe()", +"a95236ed": "DeDeTokenContract(address)", +"a95240c4": "memberShareCount()", +"a9524310": "getTokenAsset(address,uint256)", +"a95281f0": "registerPoA(string,bytes32,uint256[],uint256[],address,address)", +"a952f268": "MAYExchangeRate()", +"a9535320": "TwoXJackpot()", +"a9538157": "increaseApprovalByLegacy(address,address,uint256)", +"a953d08d": "mintBounty(address,uint256)", +"a954736d": "cancelSellPop(uint256)", +"a9549f81": "getDAOId(uint256)", +"a954c209": "great(uint256)", +"a9550ecb": "getMonsterDefenseFromDna(uint256,uint256)", +"a9553d74": "phaseThreeBonusPercent()", +"a9559dd7": "updateBalance()", +"a95609ca": "editContribution(address,uint256,uint256,uint256,uint256)", +"a9572ac7": "setMulFactor(uint256)", +"a9580edd": "distribute(uint256,uint256,address,uint256)", +"a95824b4": "votingOpen()", +"a95836d1": "finalizeICO(address)", +"a958ffc4": "fundingDurationInHours()", +"a9593b98": "changeVote(uint256,uint256)", +"a9595472": "SOC()", +"a95a3887": "rolloutDividends(address)", +"a95bc9a7": "changeChannel(address,uint256,uint256,uint256)", +"a95bfd36": "adminAddBallotOption(uint32,string)", +"a95c372d": "fetch()", +"a95c4d62": "purchaseToken()", +"a95c5339": "checkGameRegiester(address)", +"a95d017d": "getRevisionBlockNumber(bytes32,uint256)", +"a95d580c": "withdrawEarnings(uint256,bool)", +"a95d85d8": "withdrawTo(uint256,address,bytes)", +"a95d9c14": "Uncloak()", +"a95ff7d5": "isDecentBetCrowdsale()", +"a9604239": "maxAmountRoundSeed()", +"a9607011": "HappyEthericHome()", +"a96088a5": "vernamToken()", +"a9612f72": "emitOwnershipChange(address,address,bytes32)", +"a9615f59": "platAuction()", +"a961e9e8": "startSaleTime()", +"a9625fa8": "MANHATTANPROXY3RDST()", +"a962a7d6": "set_burned(uint256)", +"a9636b9f": "Bytes32Oracle(bytes32)", +"a964bb9a": "configureLimit(uint16,uint16)", +"a964bea7": "CheckRevoke(address)", +"a96594d3": "nextLotteryTTMTokenId10()", +"a965a941": "getNote(uint256)", +"a965e5c1": "setBonusAddress(address,bool)", +"a96654ee": "transferredOwner(address)", +"a9671d8f": "getProductionOf(address)", +"a9671dd9": "enableProxy(address)", +"a967f3e7": "emitProjectCreated(uint256,uint256,address)", +"a968309d": "plutochain()", +"a968991b": "confirmed()", +"a9689d0f": "transactionFeeRate()", +"a968ad0e": "resetBonuses(address)", +"a968b97c": "verifyCodeLength(string)", +"a96948c6": "chefBalanceOf(address)", +"a969574d": "ratePreICOEnd()", +"a969f080": "QUIKKO()", +"a969ff0a": "collectFee(uint256)", +"a96a4998": "DEFROST_FACTOR()", +"a96a5a5b": "pwin()", +"a96af0f4": "saleSupply()", +"a96b1828": "GLOBALETHER()", +"a96b2dc0": "getCallCount()", +"a96b3ab8": "getDthShop(address)", +"a96c3e6e": "getPlayerAddr(string)", +"a96c4eb7": "Sold(uint32,address,address,uint256)", +"a96c6bfe": "setDeveloper(address,bool)", +"a96ce7aa": "unlock(string)", +"a96f45c7": "ETHTransfer(address,address,uint256)", +"a96f8668": "releaseTokens()", +"a96fb9b4": "testTokenA()", +"a970a23a": "internalUpdateRates(bytes4[],uint256[],uint256)", +"a970ef6e": "tokenContractDefined()", +"a9718d51": "getTransferValuebyArrd(address)", +"a971c23d": "minimumFeePercentage()", +"a9725a68": "LIMIT_STAR5()", +"a9726c1e": "withdraw_bounty()", +"a972a451": "sqrt(uint32)", +"a973e27c": "testFind()", +"a9740fdf": "SwapCreation(address,address,uint256,uint256,address)", +"a9743c68": "getCallPayout(bytes32)", +"a9746acf": "UserBought(address,uint256,uint256,uint256,uint256)", +"a974e21f": "HKIN(uint256,string,string)", +"a97501a3": "ManUvsTottenham()", +"a97583de": "_transferByPartition(bytes32,address,address,address,uint256,bytes,bytes)", +"a9758fcc": "CurationRightsTransferred(address,address)", +"a9764152": "createFunction(string,string)", +"a9767e14": "masternodeMineTokens()", +"a977449e": "unbanReferrer(address)", +"a977c71e": "changeQuota(uint256)", +"a977f628": "viewNumberOfApprovedUsers()", +"a9782954": "hunterOf(address)", +"a979169f": "updatePackage(uint256,string)", +"a9791aec": "tgeSetFinished()", +"a9797521": "bn128_is_on_curve(uint256[2],int256)", +"a97a6d63": "setWhitelisted(address,address,bool)", +"a97b8b48": "LOG_CurrentPercent(uint256)", +"a97b8b4d": "closeBallot()", +"a97c8eb4": "RTEToken()", +"a97cb561": "isTransferAgent(address,address)", +"a97cc114": "getTile(uint256)", +"a97d48fd": "sendContractFundsToAddress(uint256,address)", +"a97e5c93": "isOracle(address)", +"a97fc381": "toSlice(bytes)", +"a97fe7b6": "airDropTotalSupply()", +"a97ffd5e": "safeToSell(uint256)", +"a9804acb": "HealthyCoins(string,string,uint256)", +"a980bb9e": "isDisclosureSigned(uint256)", +"a9814d14": "Outcome()", +"a981daca": "testIntParserNegative()", +"a9820ead": "Ballot(bytes32[],bytes32[])", +"a9824288": "CTMC()", +"a9825b7c": "bonusUnsold()", +"a9831437": "setCreationPrice(uint256)", +"a9831edf": "unlockFundsAndPassEther()", +"a98325b6": "collectDividend()", +"a983637e": "BACHELORCHAIN()", +"a9839dd7": "exchg(address)", +"a983c932": "isValidContract(bytes32)", +"a983d414": "safeassert(bool)", +"a983dcc0": "setDefault(bytes32)", +"a983e1bb": "random(uint256,uint16)", +"a984cec2": "additionalPresaleInvestors()", +"a9850e26": "SellToyMoney(uint256)", +"a9854087": "closeAt()", +"a9856d6d": "initSale(address,address,uint256,string)", +"a985e6c6": "withdrawAirDrop(address[],uint256)", +"a986c969": "stand(address,uint8[],bytes32,uint8[],uint8[],bool[],uint256,bytes32,bytes32)", +"a986ef4a": "nextRoundCoolingTime()", +"a9872393": "racesInfo(uint256,uint8,address)", +"a9875d70": "stage4Start()", +"a987d4c6": "_mint(address,uint256,string)", +"a987d654": "restoreItem(uint256)", +"a987f9da": "Creation(uint256,string,address)", +"a9888148": "testFailRetractNotRetractable()", +"a988845a": "setNewMessageNumber2(string,uint256)", +"a988df4b": "bgb_per_eos()", +"a988e371": "taxPaid(address)", +"a988ea3a": "NETHtoken(uint256,string,string)", +"a98902e9": "LUNVault(address)", +"a98a6d19": "ICOWeiRaised()", +"a98a89c2": "buy1(address[],address[],uint256[],bytes)", +"a98ad199": "removePermittedContract(address)", +"a98af238": "setCCH_edit_16(string)", +"a98c439f": "buyTokensAltercoins(address,uint256)", +"a98ca17d": "exercise(uint256,uint256[3],address)", +"a98cb619": "transferGenesis(address)", +"a98d5961": "pickRandomAssetPosition(uint256,uint256,uint256)", +"a98e4e77": "getAccountCount()", +"a98ee0b7": "_getInitAuctionSeconds()", +"a98f81fd": "BEXAM()", +"a98f99d8": "removeDefaultOperatorByTranche(bytes32,address)", +"a9901c6b": "getIsCoinReg(bytes4)", +"a990dd52": "unitsOneEthCanBuybefore()", +"a9918dfc": "getCompte_36()", +"a991a24d": "getTenancy(uint256,uint256)", +"a991cb0e": "respond(uint256)", +"a991faf9": "getTotalDividendsAmount()", +"a99306e7": "addPVPContender(address,uint256)", +"a993772f": "isPreIcoFinish()", +"a993e180": "getFechaTax()", +"a9948f7e": "GetNbyPrice(uint256)", +"a996d6ce": "setBurner(address)", +"a996d72e": "OracleChainToken(uint256,string,uint8,string)", +"a9974338": "setB0xToken(address)", +"a997f82f": "setCrowdsaleStage(uint256)", +"a998146b": "allToken()", +"a9985260": "test_setMaxSize()", +"a9989b93": "tokenAddresses()", +"a998fdbe": "getWithdrawAmount(address,address)", +"a9995010": "CappedCrowdsale()", +"a99a353b": "SWAP(address,address)", +"a99a3f03": "PLAYER_TIMEOUT()", +"a99a3f98": "initSale(uint256,uint256,uint256,uint256,uint256,uint256)", +"a99a985b": "betOn(uint32,uint32,uint256,address)", +"a99aa366": "presaleDiscount()", +"a99b9e39": "ICO_START_DATE()", +"a99be610": "PreIcoMessage()", +"a99bf4fa": "Potential_Investors(address)", +"a99ce372": "VINE_CAPACITY_PER_LAND()", +"a99d8d48": "changeTransferable()", +"a99da6af": "finishDeal(uint256)", +"a99dca3f": "hi()", +"a99df9c3": "oneCentInWei()", +"a99e0a81": "maxICOFirstSupply()", +"a99e6465": "addTier2Member(address)", +"a99e7e29": "register(bytes,address)", +"a99f0d9f": "_addBallot(bytes32,uint256,uint256,bool)", +"a99fa3e2": "addGroupMember(bytes32,address)", +"a99fba7d": "calculatePlatformCommission(uint256)", +"a99fc5aa": "tempCharity()", +"a99ffb7b": "timestamp(bytes12)", +"a9a07af9": "incFightToDeathWin(uint256)", +"a9a0844b": "getSaleVolume()", +"a9a0b495": "getPreSignedHash(bytes4,address,uint256,bytes,uint256,uint256)", +"a9a11111": "QuadraticVoting()", +"a9a18dda": "totalEthReceived()", +"a9a1fb96": "releaseTokensForce(bytes32)", +"a9a26902": "changeBubbleWallet(address)", +"a9a29afa": "getRefundTxFee()", +"a9a343b3": "Puzzled(address,bytes32)", +"a9a3a9c5": "vxtest()", +"a9a3cef4": "LISKClassic()", +"a9a3da4a": "getRemainUtcoin()", +"a9a40c71": "getNumberOfOpenDeals()", +"a9a51f89": "changeTokens()", +"a9a5e3af": "removeOwners(address[])", +"a9a615e9": "setWhitelistedStatus(address,uint256)", +"a9a6e9b4": "distributeLCD(address[],uint256)", +"a9a8679b": "authorizeAccount(address)", +"a9a8fc84": "ItemCreated(address,uint256)", +"a9a9d7af": "sellerList(address)", +"a9a9e4f7": "_payloadOffset()", +"a9aac3e4": "registerWineOwner(address,string,string)", +"a9aad58c": "PAUSED()", +"a9aae07a": "setMinGas4Accts(uint256)", +"a9aaf116": "BillahChain()", +"a9ab9b46": "getAccountItems(address,uint256)", +"a9abe7be": "setIcoSecondWeekRate(uint256)", +"a9ac225c": "ProposalTallied(uint256,uint256,bool)", +"a9ac4c5f": "checkMonthlyLimit()", +"a9acc475": "getBlockValue()", +"a9adaecd": "calcStopPriceFactor()", +"a9add7dc": "setEvolvePrice(uint128)", +"a9ae8323": "presaleDateFinish()", +"a9aeb059": "updateCeiling()", +"a9b07600": "setIdArray(address,uint256,string,string,uint256[])", +"a9b0c5a4": "preIcoFinished()", +"a9b0e8d5": "Cscchain(uint256,string,string)", +"a9b11426": "getImageOwner(uint256)", +"a9b12c4c": "blocktime()", +"a9b1d507": "makeWallet()", +"a9b1ffd9": "totalChequeValue()", +"a9b2c135": "lockedYears()", +"a9b2ca9c": "changeDragonGen(uint256,uint256,uint8)", +"a9b2cc09": "getMaxContributionAmount()", +"a9b35240": "packageExists(bytes32)", +"a9b46030": "BurnableOpenPayment(address,uint256)", +"a9b48ba7": "WIN()", +"a9b4b780": "getWeight()", +"a9b542bd": "getDna1(uint256)", +"a9b551d2": "getAdministratorMoney(address)", +"a9b5ae83": "messageForPeace(string)", +"a9b69e7c": "deployersCount()", +"a9b6c8bc": "getAddress(bytes16)", +"a9b76504": "getContestTeam(uint32,uint32)", +"a9b7c3bf": "cooAddress1()", +"a9b86292": "totalSharePool()", +"a9b86924": "buyStoreByName(bytes32)", +"a9b8dad6": "level_3_percent()", +"a9b8f7b8": "ProtectTheCastle()", +"a9ba2b09": "releaseFine()", +"a9bb03a4": "deptrespond(address,address,string,bool)", +"a9bb3274": "UCCOIN_PER_ETHER()", +"a9bc5db1": "createHeld(address,uint256)", +"a9bf1c9f": "ENS_ROOT()", +"a9bfe5c7": "TokenBalance()", +"a9c0838d": "getPI_edit_3()", +"a9c1873c": "setTokenPerEth(uint256)", +"a9c1f2f1": "decayRate()", +"a9c2ac3a": "getBetIds(uint256)", +"a9c2e36c": "getFactoryAddress()", +"a9c32c35": "NewExchangeRate(uint256)", +"a9c38476": "latestEditionReleased()", +"a9c4429a": "getInvestmentPackageInformation(uint256)", +"a9c45fcb": "upgradeToAndCall(uint256,address,bytes)", +"a9c4d62e": "S25ICO()", +"a9c5c9df": "aval(uint256,address)", +"a9c6a624": "updateNumber(int256)", +"a9c6c714": "unsoldAllocationOraclizeGasLimit()", +"a9c70eaa": "getUint(uint256)", +"a9c73e80": "setText(string,string)", +"a9c7648f": "distributeToken(address[],uint256)", +"a9c76999": "totalProfit(address)", +"a9c8733c": "correct()", +"a9c8dfcd": "AuctionCreated(uint256,uint256,uint256,uint256)", +"a9c95328": "renameList(address,string)", +"a9ca2072": "getAccountValue(uint16,uint8,uint8)", +"a9ca6057": "baseball()", +"a9cb2227": "getPlayerRoundTeamBought(uint256,uint256,uint256)", +"a9cbd0a5": "percentageToEthertoteDevelopmentWallet()", +"a9cc077a": "TOKEN_PRICE_DENOM()", +"a9cc4718": "fail()", +"a9ccc3af": "isEtherSpaceUpgrade()", +"a9cd2be6": "createSlot(uint256,uint256)", +"a9cd9e06": "secureWithdraw(uint256,address)", +"a9cdf643": "TEAM_MEMBER_VAL()", +"a9cf037a": "EEYcoin(address)", +"a9d04bd8": "getStakingRequirementTime(address,uint256)", +"a9d05989": "ETFW()", +"a9d07519": "TokensCappedCrowdsale(uint256)", +"a9d0b164": "priceOfEthOnUSD()", +"a9d0ddc7": "addContractWithInfo(string,string)", +"a9d0fd87": "_updatePurchasingState(uint256,uint256,uint256,bool,address)", +"a9d2293d": "lastClaimBlock()", +"a9d23ace": "getBundleExpiredTimeOfEmail(string,uint8)", +"a9d2d87c": "Manual_Mint(address,uint256)", +"a9d3da74": "SimpleAuction()", +"a9d40b77": "buyOffspring(address,string,uint256,uint256,uint256)", +"a9d424e2": "buy(address,address,uint256,uint256)", +"a9d48032": "maxSpendToken()", +"a9d49f62": "searchInsertionPoint(uint256,uint256)", +"a9d4d6bc": "lastBlock_f1()", +"a9d5e255": "GACToken(uint256,uint256)", +"a9d66127": "cancelPawn(uint256,address,bool)", +"a9d66352": "minimum_deposit_amount()", +"a9d72f82": "alterFeaturePetitionFee(uint256)", +"a9d74013": "claimedToday()", +"a9d82f18": "realDEXToken()", +"a9d85266": "setValue(bytes32,bytes32,uint256)", +"a9d9f572": "Println(address,uint32,uint256,uint256,uint256,bool,uint32)", +"a9d9f644": "viewLockUpStatus(address)", +"a9da0fad": "setOutcome(uint8,uint8)", +"a9da1417": "DEXHIGH(address,address,address,uint256,uint256,uint256)", +"a9dab167": "extendLock(bytes32,uint256)", +"a9db06e5": "perAmountRaised()", +"a9db9ce6": "getOraclizeGasPrice()", +"a9dbaf25": "length(bytes32)", +"a9dbe76f": "confirmSeller(uint256,uint256)", +"a9dc1d54": "singularDTVCrowdfunding()", +"a9dc491d": "getResolver()", +"a9dd1225": "random(uint256,uint256)", +"a9dd6895": "acceptTransaction(uint256)", +"a9dda4df": "setAuctionAddress(address,address)", +"a9de5045": "acceptAction(bytes32)", +"a9de581b": "auctionWinnerMessageHash()", +"a9df1aa2": "WithdrawalNormal(address,uint256)", +"a9e044ae": "SetProjectTag(string)", +"a9e0f3ed": "checkCounterLimit()", +"a9e10bf2": "recieve()", +"a9e2bcfe": "oneRoll()", +"a9e2e084": "_createPoo(string,address,uint256)", +"a9e30f96": "TokenPK(uint256,string,uint8,string)", +"a9e3fd27": "contentHostPrice(bytes32)", +"a9e406d5": "_setProviderSupply(uint256,uint256,uint256)", +"a9e4d6ce": "UpdateTokenRate(address,address,uint256)", +"a9e5714b": "AgriChain()", +"a9e732bb": "cashout(uint256)", +"a9e79359": "payoutForTimeline(uint256,uint256)", +"a9e7c2e5": "claimToken(uint256)", +"a9e7cb10": "Mediation(address)", +"a9e7f730": "FreyrCoin()", +"a9e899ef": "challengeFeeMultiplier()", +"a9e8a6bb": "prolongBonusPreIco(uint256)", +"a9e8f2f0": "get_refund_vocean_addr_amount(uint256)", +"a9e931ab": "addRec4L8R(address,uint256)", +"a9e94aa2": "Sponsor()", +"a9e966b7": "setState(uint256)", +"a9ea1896": "priceT1()", +"a9ea4aaa": "EntryToken()", +"a9ea6454": "basicThreshold()", +"a9ea96f0": "setDevelopersTokensPercent(uint256)", +"a9ea9d17": "PURCHASES_BONUS()", +"a9ead91c": "addressToAsciiString(address)", +"a9ebeb25": "nextReferrerId_()", +"a9ec77d3": "PublicSale(address,address,address,address,uint256,uint256,uint256)", +"a9ed003d": "sister()", +"a9ed9cb8": "disallow(address)", +"a9eeaeee": "getSanSlots(address)", +"a9eed530": "reduceOrderQty(uint256,uint256)", +"a9f00221": "resetTokenOfAddress(address)", +"a9f036dc": "accCompany()", +"a9f09079": "exchangeRateStoredInternal()", +"a9f0a590": "transferAdministratorship(address)", +"a9f12d8a": "RaliusToken()", +"a9f16529": "thisVotersChoice()", +"a9f2db37": "unlockTokens(address,address)", +"a9f5de42": "crowdsalePhase()", +"a9f69edb": "checkRole(uint256,address,uint256)", +"a9f6def0": "HonestDice()", +"a9f73dd2": "_getRarity(string,uint8,uint8)", +"a9f79f7d": "FXT(address)", +"a9f7c131": "updateDateOfPurchase(address,uint256)", +"a9f7d03b": "admin_typeOf(address)", +"a9f7e664": "transferTokens(address,uint256,uint256)", +"a9f7f7e5": "o_algoritmo(uint256)", +"a9f844a8": "PlayerBalance(address,uint256,uint256)", +"a9f8792e": "votingProxyContract()", +"a9f8ec6c": "AlarmClockTipFaucet()", +"a9f940c3": "addChain(string,string)", +"a9f951dc": "getNation(uint8)", +"a9f987b5": "UFOcoin()", +"a9f992b1": "BTC8000on420()", +"a9fab274": "burnAuditApproval()", +"a9fae422": "getParents(address)", +"a9fb11b3": "potAddup()", +"a9fb4385": "ContributeWithSender(bool,uint8,address)", +"a9fb8fe6": "getFeesByAsset(address)", +"a9fbc614": "lookupTicketHolder(uint256)", +"a9fc771c": "PinkToken()", +"a9fc9501": "indexTheWorkcrew()", +"a9fcf76b": "setIntArray(bytes32,int256[])", +"a9fd1bd3": "TradeAffected(uint256,uint256)", +"a9fd3f42": "transferApprovedFunds()", +"a9fde745": "transferTrade(address,address,uint256)", +"a9feca22": "_emitOracleAdded(address)", +"a9ff2a5e": "transferTokensFromWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"aa01ac22": "gmAddress()", +"aa01ef7d": "finishVotingPublic(address,uint256)", +"aa02a90f": "majorityMargin()", +"aa03214c": "calcBonusPercent()", +"aa0372e7": "getItem(bytes32)", +"aa03dfaa": "createChannel(bytes32,address,uint256)", +"aa0465b8": "setPriceData(uint256,uint16,uint256,uint8)", +"aa049691": "changeAccount(address)", +"aa04e566": "getWhoPiad(address,address,address,address,address,address,address,uint256)", +"aa052bd1": "startPreSaleStage()", +"aa056d2a": "cloneWithPopAndBottle(uint256,uint256)", +"aa058a73": "right6(uint256)", +"aa05b852": "s34(bytes1)", +"aa065074": "StageVestingToken()", +"aa071061": "LogAccountModified(address,address,bytes32,bytes32,bytes32,bytes32)", +"aa077992": "getProductEarning(uint32)", +"aa08523d": "lockedCustomer(address)", +"aa08c9e6": "getCoverImageCount(address)", +"aa08dfd3": "setFeeParams(uint256,uint256,uint256,uint256,bytes)", +"aa09bab8": "usedTotalSupply()", +"aa0bf9ba": "calculateRawPoolAmount(uint256)", +"aa0cd6eb": "_distributePoolReward(uint256,address,uint256)", +"aa0cfcbf": "buynums(uint256)", +"aa0d30f3": "deduct_fees()", +"aa0d9fb5": "_aremoveByValue(address)", +"aa0e38b4": "Mobilink()", +"aa0f0d4a": "Team(bytes32,bytes32,address,bytes32)", +"aa10ce22": "addExchange(address)", +"aa10e8c2": "CreateAPool(string,string)", +"aa11772b": "setOperators()", +"aa1199ea": "setApprove(bool)", +"aa121bbe": "ABIChanged(bytes32,uint256)", +"aa125d08": "timeWaitUnlock(address)", +"aa127ae3": "test_9_checkDestructionOverflow_shouldThrow()", +"aa13ca76": "getTokenPrices()", +"aa13e8c2": "waitingTime()", +"aa141ee2": "spartans()", +"aa14c39a": "submissionDeposit()", +"aa14fa5a": "ICObonus()", +"aa156645": "isWorker(address)", +"aa1589a9": "approveLeave(address,uint256,string,uint256,bytes32)", +"aa1614eb": "ethRetrieve()", +"aa17973c": "createRandomAtom()", +"aa17e768": "getParentI(uint256)", +"aa183877": "getMonkey()", +"aa188b29": "SandBoxERC20()", +"aa18c05c": "TRANSFER(address,address)", +"aa18f76a": "getAllowedAmount(address)", +"aa1953cc": "canAccess()", +"aa19ed77": "freezeTransfersUntil(uint256,string)", +"aa1b510e": "cheat()", +"aa1ba6a9": "totalWin()", +"aa1c31a3": "BatCave()", +"aa1cdce8": "allot(uint256)", +"aa1cf1cd": "dumpFreeTokens(address)", +"aa1cf23e": "_isIdle(address,uint256)", +"aa1d807f": "ESCBDevMultisig()", +"aa1d98af": "personIndexToOwner(uint256)", +"aa1e47ae": "MyCoin()", +"aa1e84de": "hash(bytes)", +"aa1f609f": "ETHER_MIN_CONTRIB_PRIVATE()", +"aa202aca": "testBytes32Len()", +"aa20e1e4": "updateMasterMinter(address)", +"aa216998": "INITIAL_SAPLLY()", +"aa2262a8": "prevCourse()", +"aa226780": "trade(address[11],uint256[11],uint8[2],bytes32[2],bytes32[2])", +"aa228cda": "reduceMul_()", +"aa22b56b": "getDAOById(bytes32)", +"aa235449": "SpencerToken()", +"aa237e21": "set(bool,uint256)", +"aa238110": "getCurrentPrice(uint16)", +"aa23cb19": "transferFromIndexed(address,address,uint256)", +"aa23e03d": "getIdentifier()", +"aa24da73": "MultiToken()", +"aa24e8aa": "numberOfAlternatives()", +"aa2529a2": "RefundChequeById(string)", +"aa2580c1": "startPreSaleRound()", +"aa258b2e": "TitlePurchased(address,uint256)", +"aa25c744": "getDenominationByName(bytes8)", +"aa25f57e": "setPartnerETHRewardsPercent(uint256)", +"aa271e1a": "isMinter(address)", +"aa272d4b": "getNodeIndexId(bytes)", +"aa2796fd": "payoutForMining(address,uint256)", +"aa27cdf2": "deleteSharedAccount(bytes32,bytes32,uint256)", +"aa283e76": "setMintPrice(uint256,int256)", +"aa284a4a": "ProofPublicVote(address)", +"aa289b15": "deleteOutStreamOf(address)", +"aa28b89f": "preICOStage()", +"aa29787e": "bonus15end()", +"aa2a006d": "OrderCancelled(uint256,uint256)", +"aa2a1c47": "getTotalCollectedFrom(uint64,address,address)", +"aa2b5d7d": "getMiningWarPlayerData(address)", +"aa2bebb7": "getFeeWindowByTimestamp(uint256)", +"aa2d5c05": "FillOrder(uint256,address,uint256)", +"aa2de6c3": "minimumPurchase()", +"aa2df88b": "_isTransferAllowed(address,address,uint256)", +"aa2e7ea0": "createSwap(bytes20,address,uint256,address)", +"aa2efbad": "nominsReceivedForEther(uint256)", +"aa2f04da": "alterPause(bool)", +"aa2f7494": "createMobster(string,uint256,uint256)", +"aa2f892d": "requestRedeem(uint256)", +"aa2fc145": "numStageRecalc(uint256)", +"aa2fddc7": "transfer(string,address,uint256)", +"aa3022d0": "settotal(uint256)", +"aa306d79": "voteForCandidate_(uint256,address)", +"aa30abf1": "crowdsaleBurnAddress()", +"aa30b7e3": "hasEnoughValidSignatures(bytes,uint8[],bytes32[],bytes32[],address[],uint256)", +"aa31aee8": "getLockTime(address)", +"aa31e4a0": "setSelfHybridizationPrice(uint256)", +"aa33171f": "newPromotion(string,string,string,uint256,uint256,uint256,uint256)", +"aa332032": "NewRound(string,bytes32)", +"aa33ab1b": "getVoted(uint256)", +"aa3435c0": "setTokenInformation(string,string,uint8)", +"aa351cf5": "triggerShutdown(uint256)", +"aa352ca4": "withdrawOffer()", +"aa3633f3": "CreationFailedEvent(address,uint256,string)", +"aa366290": "forfeit(uint8)", +"aa367664": "fundingMaximumTargetInWei()", +"aa368c19": "createScore(string,string,uint256,uint256,uint256,uint256,string,string,string,string,string)", +"aa36aae8": "prolongCrowdsale()", +"aa36b52e": "_updateNeeded(uint256,uint256,uint256)", +"aa36cdfc": "getPlayerHistory(uint256)", +"aa3744bd": "recipient1()", +"aa3801d8": "getTokenAddress(bytes)", +"aa391317": "returnUnsoldSafeMedium()", +"aa3ad4e4": "validate(address,address,uint256)", +"aa3aef50": "purchaseTicket(uint16,uint16[])", +"aa3ba179": "widthraw()", +"aa3dacac": "sideBetPercent_MAX()", +"aa3eb769": "sendPTokenFrom(address,uint256,address)", +"aa3ec0a9": "cid()", +"aa3ef248": "postFact(bytes16,address,string)", +"aa3f5087": "AuctusPreSaleDistribution()", +"aa404876": "RedBlueToken2()", +"aa41d605": "_estimateWeight(uint256,uint256,uint256,uint256,uint256)", +"aa421944": "setMaxVeriAmount(uint32)", +"aa430e64": "setTotalPhases(uint256)", +"aa4537b2": "referredBonusRate()", +"aa454e9c": "setBuyer(uint256)", +"aa45b11e": "setReferralAddressShare(uint256)", +"aa462a5a": "whenGameDies()", +"aa4859fd": "newBookingfc(uint256,address,uint256,uint256,uint256)", +"aa487f49": "PRESALE_PERCENTAGE_1()", +"aa4925d7": "subscribe(uint256,uint256,address)", +"aa497b9d": "scheduleCall(address,uint256,bytes,uint256,uint256,uint8)", +"aa4abe7f": "setMaxRate(uint256)", +"aa4ac835": "exportTankResetEarning(uint32)", +"aa4b4d0b": "test_v0()", +"aa4b62f3": "initData(address,uint256)", +"aa4b980e": "phase_1_bonus()", +"aa4bdd3b": "realEtherCapHash()", +"aa4cb547": "setMultihash(bytes32,bytes)", +"aa4cc01f": "checkIfCancelled(bytes32)", +"aa4cd810": "addMeterPoint(address,int256)", +"aa4ce2c6": "blockDotBlockHash(uint256)", +"aa4d4213": "getOldAllowance(address,address)", +"aa4d490b": "registerNameXaddrFromDapp(address,bytes32,address,bool)", +"aa4eaa72": "addToPreSaleWhitelist(address,address)", +"aa4ee730": "LastRiskPrice()", +"aa4f6012": "addSupply(address,uint256)", +"aa4f861f": "getInvestorInforMax(address)", +"aa4fc0a1": "Talius()", +"aa510c8c": "getLinkToPostId(string)", +"aa513c71": "updateInfluencer(string,address,uint256,address)", +"aa51793c": "isLosingBet(uint256)", +"aa525c55": "removeMilestone(uint8)", +"aa52a251": "transferSnowflakeBalanceFrom(string,string,uint256)", +"aa52fbd4": "period2Denominator()", +"aa534161": "releasedTeamTokens()", +"aa53d504": "Bounty()", +"aa53d7d4": "gettotalReceivedTicket()", +"aa541c9f": "unfroze_contract()", +"aa54abb1": "setLSEscrowContractAddress(address)", +"aa54ad35": "tokenSaleAddr()", +"aa54e040": "change_rate(uint256)", +"aa5581ef": "weiMaximumLimit()", +"aa5583d7": "Connections()", +"aa55a1a2": "giveAdditionalTokens(address,uint256)", +"aa55b55f": "getCardTypeInfo(uint256)", +"aa56c8e7": "isCrowdsaleFinished()", +"aa585d56": "setPrice(uint256,uint256,uint256)", +"aa58d4df": "calculateWinnerGameType2(uint256,uint256)", +"aa590140": "length(int8)", +"aa59770f": "sendCreatorByOwner(address,uint256)", +"aa59b024": "CROSAIR_SHIP_LIMIT()", +"aa59fb7d": "ChemistryCore()", +"aa5a11c5": "removeTellerModerator(address)", +"aa5a20e5": "setUpgradeAgent(address,uint32)", +"aa5b7df8": "marketingTokensWallet()", +"aa5b95d1": "deathFactor_i()", +"aa5c02a3": "LETX()", +"aa5c3ab4": "rewardBalance()", +"aa5c88ca": "setFreezePercent(uint8)", +"aa5d4719": "getTransferable(bytes20)", +"aa5d6d5f": "dropWallet()", +"aa5dcecc": "allocator()", +"aa5dd215": "doAirDrop(address[],address,uint256[])", +"aa5df9e2": "ownersArr(uint256)", +"aa5e2500": "clearProposalNames()", +"aa5ebd7f": "removeAddressFromWhitelist(address,address)", +"aa60145b": "cancelPledge(address)", +"aa601a71": "setAllowChangePrice(bool)", +"aa601e86": "SimpleMultiSigWallet(address[],uint256)", +"aa613b29": "authenticate(string)", +"aa613faf": "U42Token()", +"aa616da1": "addSkillNames(address,bytes32[],address)", +"aa617f25": "getAdUrl(uint256)", +"aa61924a": "CREATE_VERSION_ROLE()", +"aa61fc58": "getAirdropList(address)", +"aa620192": "today(uint256)", +"aa6217eb": "getMaximumContributionPossible()", +"aa628c31": "timelock(address,uint256)", +"aa63dea4": "dateMainStart()", +"aa646ebb": "_mint(address,uint256,uint128)", +"aa647673": "getKingPoints()", +"aa64c43b": "transferPool(address,address,uint256)", +"aa64f3c6": "addWhiteListed(address[])", +"aa656a3a": "updateGameMoney(uint256,uint256,uint256,uint256)", +"aa657658": "setMigrationGate(address)", +"aa657815": "takeoffer(uint256,uint256)", +"aa65a6c0": "getTokenWithId(uint256)", +"aa65c1f1": "WinningOutcomeDeclared(uint8)", +"aa66797b": "RESERVE_SUPPLY()", +"aa677354": "register(address,address)", +"aa67bc04": "eraByName(bytes32)", +"aa67c919": "depositFor(address)", +"aa682682": "startBuyTime()", +"aa68894b": "ownerWithdrawAccount(address)", +"aa692151": "fbytes32(bytes32)", +"aa6aca58": "setDelegadoDeEscuelaVerify(bytes32,bytes32,uint8,uint8)", +"aa6b5d9f": "ElyToken(address,bool)", +"aa6b631a": "getSetting(string)", +"aa6be303": "debtors(address)", +"aa6bf687": "calculateBonus(bytes32,uint256)", +"aa6ca808": "getTokens()", +"aa6d5dce": "_withdrawAllFunds()", +"aa6d7de4": "Hash()", +"aa6e4858": "VoteAdvertisement(uint256,address)", +"aa6e6539": "chkUserDetails(address,address)", +"aa6ebdcb": "numberOfDAppNodePackages()", +"aa6f5bb6": "setCreateDigitalArtFee(uint128)", +"aa727e46": "MAX_PUBLIC_FUNDING_SUPPLY()", +"aa72f217": "bountyMktWallet()", +"aa72f725": "listAssetDocuments(bytes32,uint256,bool)", +"aa735dd6": "ZBAStandardToken(uint256,string,uint8,string)", +"aa736f57": "transferLocker(address)", +"aa738940": "Show_Company(uint256)", +"aa743c85": "sixMatchPayoutInPercent()", +"aa74c9fc": "addressToURI(address)", +"aa74fad8": "buyNewInfra(uint256)", +"aa7517e1": "minimumBond()", +"aa7618d5": "increaseApprovalPreSigned(address,uint256,uint256,uint256,uint8,bytes)", +"aa7622c7": "finalizeSecondStage()", +"aa7629ab": "withdrawDRPS(uint256)", +"aa76994d": "numOverthrows()", +"aa772fa0": "WinningEvent(address[],address,uint256)", +"aa775278": "deallocateBalance(address)", +"aa77f26c": "vestedAmount(address,address)", +"aa78a883": "BDP()", +"aa79376e": "updatePlayersCookie(address)", +"aa799fdc": "ZeroxDinar()", +"aa79bc02": "maxTrophies()", +"aa7a7744": "isRegisteredPair(address,address)", +"aa7abc8d": "sellWonder(uint256,uint256)", +"aa7b6c59": "wirteData(string)", +"aa7bc1c0": "createTokenFunctions()", +"aa7be9a7": "watchVideoA(address)", +"aa7ca464": "didReveal(address,uint256)", +"aa7dcd84": "testUpdateAuthorityEvent()", +"aa7ebf43": "level_1_percent()", +"aa7f6a3f": "AirdropList(address[],uint256[])", +"aa7f6a61": "newPurchase(address,uint8,uint8,uint32)", +"aa804a80": "jdouble(uint256,uint256,uint256)", +"aa80eec8": "testCheckRokBounty()", +"aa8116be": "fundedPrincipal()", +"aa81f862": "numDepositsSigned(bytes32)", +"aa82635d": "allocateManualMintingTokens(address[],uint256[])", +"aa833a25": "TheTokenC()", +"aa848ee2": "setPrivateList(address)", +"aa84d4b1": "whitelistOff()", +"aa84edb8": "MYDLToken()", +"aa85048a": "TotalCrowdsaleSupply()", +"aa8596ea": "setGalleryFivePrice(uint256)", +"aa863759": "addtoTechOperation(address,address,uint256,uint256)", +"aa864e49": "remainingPoolOptions()", +"aa8675d1": "singleIDXMQty()", +"aa8676b2": "gameDividendOf(address)", +"aa86fbc5": "HETCCStandardToken(uint256,string,uint8,string)", +"aa8713dd": "secondWeek()", +"aa877470": "isInsurance(address)", +"aa879119": "allowApprovee(address,bool)", +"aa87af1e": "voirMessage()", +"aa88bb5b": "resolveDispute(uint16,address,address,uint8)", +"aa89376a": "Example2(string)", +"aa8a0002": "raiseLimit()", +"aa8b20f6": "getAvatar()", +"aa8b76ea": "reclaimDividend(uint256)", +"aa8b99d2": "length(uint256)", +"aa8c217c": "amount()", +"aa8c5324": "prolongate()", +"aa8d11e3": "ThirdPartyVoter()", +"aa8d715d": "itemBalance(address)", +"aa8dc41e": "vriesorexContract()", +"aa8dd5a1": "GRForGas()", +"aa8dde58": "Repost(bytes32,bytes32,uint256)", +"aa8dea8c": "fipsAddToLedger(bytes20,address,bytes)", +"aa8e8fb0": "LTKN()", +"aa8f0269": "ScicoinsICO()", +"aa8f027b": "isEmoji()", +"aa8f365c": "test_invalidProposalValue()", +"aa8f44ec": "isSaleAddr(address)", +"aa908e3f": "closeContract(bytes32,bytes8,uint256,uint32,uint32,uint64,uint64,bytes32)", +"aa91cc61": "rodToken()", +"aa91d5c5": "HappyEnding()", +"aa9224cd": "withdraw(uint32)", +"aa9246ef": "_parseIntScientific(string,uint256)", +"aa93038b": "reward_total()", +"aa931697": "minNac()", +"aa93334d": "currentPeriodStartBlock()", +"aa9449f2": "Test(address)", +"aa9454b5": "transferAndBuy(address,uint256,uint256,uint256)", +"aa954845": "isConfirmed(bytes)", +"aa9669c1": "roll(uint256,bytes)", +"aa974eff": "multitokens(uint256)", +"aa985a63": "distributeWei(uint256,uint256)", +"aa98a41a": "setGenesisAddressArray(address[],address)", +"aa98d57b": "calcCollectedFee(uint256)", +"aa99474f": "authorized_changeOwnership(address,address,uint256)", +"aa994ab8": "transferGIM(address,address,uint256)", +"aa999b4c": "mixDna(uint256,uint256,uint256)", +"aa99ebb6": "CheckTimestampsDuringOneDay(address)", +"aa99f4d0": "teamTwoId()", +"aa9a0912": "mulDiv(uint256,uint256,uint256)", +"aa9a2cf0": "host_percentage()", +"aa9a79f2": "SubBankerPrincipal(uint8,uint256)", +"aa9ad331": "NEON()", +"aa9b5ba8": "getPaidDIVDSchedule()", +"aa9cdaf4": "coinAge(address)", +"aa9e40e0": "confirmDebt(uint256)", +"aa9f3666": "ClassicToken(string,string,uint8,uint256)", +"aa9f37f0": "purchaseContract()", +"aa9f5477": "Nursicoin()", +"aa9fa274": "addExtraReceiver(uint256,address)", +"aaa006b2": "countPlayer()", +"aaa04812": "presaleEthAmountsProcessed()", +"aaa05e20": "cityTransferResources(uint256,uint256,uint256,uint256)", +"aaa08e9b": "testBonus()", +"aaa0f5cc": "userAlreadyBoughtEth(address)", +"aaa24d31": "deathData_f7()", +"aaa2b78f": "allowedWithdraw()", +"aaa2b8c8": "rootAddress()", +"aaa2fe13": "getMin(uint8[])", +"aaa3de26": "getUsersInfo()", +"aaa40bc7": "TUXToken()", +"aaa44e5c": "getAllIds()", +"aaa51ec6": "setStoreAddress(address,address)", +"aaa5a02a": "claimTimeout(bytes32)", +"aaa5ad61": "getTokensAvailable()", +"aaa5c431": "editMemes(uint256,string,string,string,string,uint256)", +"aaa668aa": "getUserTenantId(address)", +"aaa6bc40": "removeWhitelistedUserAddr(address)", +"aaa7062b": "posShare()", +"aaa71e45": "mininglock()", +"aaa7744b": "_subjectToFees(address,uint256)", +"aaa77f55": "wuxiaMaster()", +"aaa99809": "FlatPricingExt(uint256,bool)", +"aaaa3218": "EmpireCrowdsale(uint256,uint256,address,address,uint256,uint256,uint256)", +"aaab3025": "replaceAbility(uint256,string,bool,uint8,uint8,uint8,uint256,uint256)", +"aaab51c9": "close(uint256,bytes,uint256,uint8[],bytes32[],bytes32[])", +"aaabdf16": "reputationIRNNodeShare()", +"aaac205b": "ZeenCoin()", +"aaac50bd": "transferDisable(bytes32)", +"aaac6539": "withdrawRepaidLoan(address,address)", +"aaac8040": "referralAmount(uint256,bool)", +"aaac9718": "package()", +"aaad0c84": "isExisted(address)", +"aaadc832": "isRedeeming()", +"aaae05b2": "approvePreSignedCheck(address,address,uint256,uint256,uint256,uint8,bytes)", +"aaae7799": "insertUser(uint256,bytes32)", +"aaaea138": "testFailBurnWhenStopped()", +"aaaf8a52": "approvePrimordialToken(address,uint256)", +"aaaf9595": "_generateTokens(address,uint256)", +"aab0395b": "LandToken()", +"aab065e8": "LifChannels(address,uint256)", +"aab14d04": "orderState(bytes32)", +"aab27ad1": "depositaCaucao()", +"aab324ae": "transferAnyERC20Token(address,uint256,address)", +"aab32cfa": "VerifierRegistry(address,uint256)", +"aab402e5": "toggleSale(bool)", +"aab40661": "_fishAquarium(uint256)", +"aab52c33": "initGameTeam(uint8)", +"aab60ebc": "totalLockedRewardsOf(address)", +"aab633dc": "private_setmaxRoll(uint256)", +"aab6606e": "BalanceEth()", +"aab725b3": "icoTokensSold()", +"aab75253": "StaffPicks()", +"aab78bf5": "compensateLatestMonarch(uint256,uint256)", +"aab8c476": "ABCXYZBBTT()", +"aab8f6e0": "airdropBy0Eth()", +"aab99609": "ApaAjaToken()", +"aab9f165": "processPayment(uint256,uint32,uint32,uint256)", +"aaba2fb8": "UnicornRanch()", +"aaba3e3b": "getSymbol(string)", +"aabb3d61": "MainBridge(uint256,address[],uint256,uint256,uint256)", +"aabbb8ca": "getInterfaceImplementer(address,bytes32)", +"aabbd0ce": "approveNewShorter(address)", +"aabd3904": "isCreating(uint256)", +"aabd46e3": "getMintRequestStringMap(uint256,int256,string)", +"aabd5b88": "_sold()", +"aabd971e": "presaleTransfersPaused()", +"aabda436": "fund_()", +"aabdf682": "FINTRUX_RESERVE()", +"aabe00c4": "verifyPreSupport(uint256)", +"aabe2fe3": "currentWinner()", +"aabe7dc4": "unlockRewardToken(address)", +"aabecb89": "setRate10(uint256)", +"aabf05cf": "set_presale_iconiq_arbits_per_ether(address,uint256)", +"aabf382b": "upgradeLevel(uint8)", +"aabf901a": "Distributor(uint256,address)", +"aac0d9c2": "CompanyReserve(address,uint256)", +"aac0e4c5": "getPendingSignatureStatus(address)", +"aac1335c": "tgeSettingsMaxStages()", +"aac1b0b7": "safeExchange(address,address,uint256)", +"aac1c80b": "getCompte_12()", +"aac24374": "setBoxPrice(uint256,uint256,uint256)", +"aac2c717": "buyXaddrWithInviteCode(address,uint256)", +"aac3e314": "setPrevOracle(address)", +"aac4e3a8": "whiteListingAdmin()", +"aac57b3a": "newAPM(bytes32,bytes32,address)", +"aac5ab61": "Crowdsale(address)", +"aac5ce9a": "Stakeholder()", +"aac67b05": "changeFactoryUsageFee(uint256)", +"aac6ba41": "setModel(address[],uint256[])", +"aac746ee": "getNameFromAddress(address)", +"aac74c92": "getPI_edit_30()", +"aac756b8": "setxiudao(address,uint256,bool)", +"aac80472": "getManagerAddress(uint256)", +"aac81654": "isNoEmptyTranches()", +"aac8788a": "setIncrementOpenInterest(bool)", +"aac878eb": "approveTransaction(uint256,bytes)", +"aacaa602": "getCurrentAmountBonusRate(uint256)", +"aacb15e6": "_validate(uint256,uint256,uint256,uint256)", +"aacb4442": "repaintVoxel(uint8,uint8,uint8,uint8)", +"aacbe4b3": "set_maxUETsPerReturnLessThan(uint256)", +"aacc3a16": "printAddress(address[3],address)", +"aacc5a17": "getRandom()", +"aacd572f": "private_setMinRollUnder(uint256)", +"aacd5a85": "orderTrade(uint256,uint256,uint256)", +"aacd9794": "setUniqueSpinnerPrice(uint256)", +"aacdb27b": "setPixel(uint32,uint32,uint8)", +"aacec70b": "createCrySolObject(string,uint256,uint16,uint16,uint8,uint8)", +"aacf3f2e": "contributionInCauldronRound(uint8,address,uint32)", +"aacf5328": "setVideoID(string,uint256)", +"aacfd352": "blockBeforeEncounter(uint256)", +"aacffccf": "getAccountOwner(bytes32)", +"aad00089": "tokenIssue(uint256)", +"aad0bb90": "TEMath(uint256,uint256,bool)", +"aad12029": "freezeAccounts(address[])", +"aad13b15": "fight(address,string)", +"aad2b723": "changeSigner(address)", +"aad3ec96": "claim(address,uint256)", +"aad41a41": "multisend(address[],uint256[])", +"aad429f1": "_buyCommonTTW(uint256,uint256,address,address)", +"aad52373": "ValidateAndStore(bytes,bytes)", +"aad55726": "getContract(address,uint256)", +"aad5632a": "generateNext()", +"aad62da2": "left89(uint256)", +"aad71040": "changeUnlockTime(uint256,uint256)", +"aad7152b": "updateTokenTransferAddress(address)", +"aad83ab3": "SpinTestToken()", +"aad85f7c": "setAchievedDate(uint256,uint64,uint64)", +"aad935af": "updateSellPossible(bool)", +"aad99ef1": "setPriceIncreaseScale(uint256)", +"aad9afee": "kingsMessage()", +"aada1cb3": "activateUniqueSpinners()", +"aada4b06": "saleIssue(address,uint256)", +"aadad773": "removeServer(uint256)", +"aadba3dc": "finishWhen()", +"aadbc52d": "addContractMember(address,bytes32,address)", +"aadbc5a0": "getMatches(uint256,address,uint256)", +"aadc0a9d": "sneakUpOn()", +"aadc1ac1": "approveLoan(uint256)", +"aadc3b72": "hasVoted(bytes32,address)", +"aadc8f23": "RogueProtocol(address)", +"aadd1b03": "donateEth()", +"aade1323": "_processUpdateFee(address[16],uint256)", +"aade53fe": "_removeCardSetAtIndex(uint256,uint256)", +"aade84ae": "TopIvy()", +"aade8dcc": "discountTokenPercent()", +"aade9bb4": "icoReturnBonus(uint256)", +"aadf017e": "_processReserve(address,uint256,address)", +"aadf1e73": "selectWinner30()", +"aadf6838": "getOldSchoolCoins()", +"aae07890": "setUnit(uint256)", +"aae07cd0": "getTokenLayers(uint256)", +"aae0ff1e": "incLuckyCoin(address,uint256)", +"aae1f5c3": "processDonate(address)", +"aae233b4": "cleanUpPreviousRound()", +"aae3d025": "transferClose()", +"aae3d031": "enableKYC()", +"aae40ddc": "getCurrentClaimerForTile(uint16)", +"aae4cbe4": "EcoToken()", +"aae62507": "getUnavailableValueT(bytes32)", +"aae755af": "m_currentUsdAccepted()", +"aae764c1": "assertFalse(bool,bytes32)", +"aae8312e": "getStakeholderTransactionCount(bool,bool)", +"aae8e1b3": "withdrawFlag(address,uint256,uint256)", +"aae99c66": "whitelistAddress(address[],bool)", +"aae9a4c7": "singleInvestorCap()", +"aae9d7ed": "__callback(bytes32,uint256)", +"aaea144d": "setPackage(bytes1[42])", +"aaea396c": "verifiedlist(address)", +"aaea4472": "LifeFactor_ii()", +"aaea44c4": "strConcat(bytes,string,bytes)", +"aaea53f3": "Channel(address,uint256)", +"aaeaa36c": "isBatchSupported()", +"aaead0f0": "initializeIndividualCapsFundraiser(uint256,uint256)", +"aaeb3255": "getInsuranceIDsByClient(address)", +"aaec0c03": "FireflyRegistrar(address,bytes32,address)", +"aaec2fa5": "getGirlsAuctionPrice(uint256)", +"aaecc9cf": "checkGameOver()", +"aaed2c3d": "getRewardRate(address,address)", +"aaed31c7": "createCoins(address)", +"aaed3c7d": "tokenBuyersAmount()", +"aaee686e": "confirmTransactionFee(uint256)", +"aaeea585": "DMToken()", +"aaef36b5": "CorvinusCoin()", +"aaf04471": "transferAndCallDelegated(address,address,uint256,bytes,uint256,uint256,uint256,bytes)", +"aaf05f3d": "f3()", +"aaf10f42": "getImplementation()", +"aaf13d10": "Wallet3()", +"aaf20486": "ProofOfLongHodl()", +"aaf3e4f4": "left88(uint256)", +"aaf47835": "acceptBuyOffer(uint32,uint256)", +"aaf49910": "sanMinLength()", +"aaf4f1ed": "setMinDailyPerUser(uint256)", +"aaf517f5": "GetRoundIndex(uint8)", +"aaf592bf": "receiveApproval(uint256[])", +"aaf5eb68": "PRECISION()", +"aaf60eec": "setRoundOneRaito(uint256)", +"aaf73ef7": "registeredDeals()", +"aaf7e700": "setResetvalue(uint256)", +"aaf809f8": "_isUnique(uint256[],uint256)", +"aaf885f8": "getRazInstanceInformation(uint256,uint256)", +"aaf9419d": "latestNewRockForSale()", +"aaf9d13e": "buyTopDog(uint256,uint256)", +"aafa4827": "KOIOSTokenSale(address,uint256,uint256,uint256,uint256,address)", +"aafa944e": "createJob(string)", +"aafab1e8": "paymentsCount()", +"aafafbf3": "multiSendEth(address[])", +"aafb088e": "stageDuration()", +"aafba184": "removeShareholderListing(uint256)", +"aafbb120": "getSaleInfo(address)", +"aafbd3da": "create(bytes32,address,bytes32,bytes32,address,bytes32)", +"aafbe1c0": "NectarController(address,address)", +"aafd775e": "getLockedBalanceForUser(address,address)", +"aaff096d": "updateDarknodeRegistry(address)", +"aaff2a83": "totalRemainingTokensForSales()", +"aaffadf3": "minContribution()", +"aaffc4b6": "currentRoundCount()", +"ab004a97": "traded_token_seed_amount()", +"ab021884": "setMinimumPriceFusion(uint256)", +"ab022b28": "resetAirdropAmount()", +"ab02f27c": "Europium()", +"ab03cf46": "sendFunds(uint256,address,bytes)", +"ab03d0e8": "changeUnitsUserCanBuyLimitEth(uint256)", +"ab040107": "decline()", +"ab044622": "syndicateTokensWithdrawn()", +"ab045871": "Indemnisation_2()", +"ab051767": "userlogout(address)", +"ab05a69a": "InbotProxy(address,address,address,address)", +"ab05bfff": "setReleaseTime(uint256)", +"ab062643": "getNumTokensPurchased()", +"ab065d6c": "getProjectClient(bytes32)", +"ab067a5b": "periodSales()", +"ab06bea3": "reportContribution(address,uint256)", +"ab06da29": "setUTExchangeRate(uint256)", +"ab074225": "BLOOToken()", +"ab0783da": "mat()", +"ab07f054": "getLandPrice(int32,int32)", +"ab080aab": "SecondBiathlonToken(address,address,string,string,uint256,address)", +"ab08d048": "SPAYToken()", +"ab08f75b": "getMoneyline()", +"ab09ee80": "respond(uint256,uint256,uint256,uint256)", +"ab0a9865": "createGen0Dog(uint256)", +"ab0b29a5": "applySetMaxFeeTrade()", +"ab0ba5d4": "challenge(uint256,bytes32,bytes)", +"ab0bcc41": "saleStart()", +"ab0cba56": "ICO(uint256,uint256,uint256,uint256,address)", +"ab0cd5bc": "createMineForToken(uint256)", +"ab0ced0e": "checkContribution(address)", +"ab0cf8b7": "Wolf()", +"ab0d92dd": "totalPrice()", +"ab0da5a9": "reject(address)", +"ab0db220": "createBattle(uint256,uint256[],bytes32,uint256)", +"ab0e6765": "setEmployer(address,address,string)", +"ab0eda9e": "setAirdropAddress(address)", +"ab0facc0": "raiseLimit(uint256)", +"ab0fd373": "matchTimestamp(bytes32,bytes32)", +"ab0fe874": "purchaseCap()", +"ab108915": "createUser(address,bytes20,uint64)", +"ab1193fa": "PREMINE_ALLOCATION_ADDED(address,uint256)", +"ab11ebdd": "returnIcoTokens(address,uint256)", +"ab127a0c": "searchBestRate(address,address,uint256)", +"ab1377c0": "startSeedStage()", +"ab14a41f": "reentrancyHelper(address,bytes,uint256)", +"ab150226": "checkAdmin()", +"ab1547d2": "nextOpenRewardTime_()", +"ab15d70c": "updateFifthExhangeRate(uint256)", +"ab15f723": "pauseMints()", +"ab165623": "TalentEducationToken()", +"ab165831": "checkContractAddress(address)", +"ab166a48": "addHistory(address,uint256[4])", +"ab16cef1": "addBigPromoBonus(uint256)", +"ab17176c": "VCCToken(uint256,string,string)", +"ab172cf5": "getCandidateByIndex(uint256)", +"ab179e9f": "currentReleaseCeiling()", +"ab17bad0": "setGasConsume(uint256)", +"ab18af27": "setDepositAddress(address)", +"ab18f6ac": "parseTimestampToYM(uint256)", +"ab19d396": "couponTokenCampaignAddr()", +"ab19fff9": "TokenFrank()", +"ab1a84da": "isCrowdfundCompleted()", +"ab1ac9f6": "BITSDToken()", +"ab1b1cb5": "getSubscriptionLastPaid()", +"ab1b3830": "EIForceCoin()", +"ab1b75f2": "burnUnpaidTokens()", +"ab1bef4e": "getDailyTickets(address)", +"ab1d3add": "assignDispute(string,address,string)", +"ab1d581b": "checkPet(uint64)", +"ab1e96e9": "migrationPeriod()", +"ab1ebb4d": "OneMillionToken()", +"ab1f7929": "setMigrationInfo(string)", +"ab207628": "getAffiliateAmount(uint256)", +"ab209e23": "Manifesto(uint256,uint256)", +"ab2191a2": "Satanshi()", +"ab21b055": "getTickets(string)", +"ab21d58a": "enableCharity()", +"ab225edc": "DepositFund()", +"ab22a640": "getVideoGameOwner(uint256)", +"ab22c561": "getVestingCliff(address,address)", +"ab231511": "lastWithdrawTime()", +"ab23c50d": "AirDropAFTK3SeptSandBox()", +"ab250cb5": "addSubcontract(address)", +"ab253ca6": "buyMinions(uint8)", +"ab2643a1": "commitCollateralToPool(address,uint256)", +"ab273016": "signProposal(uint256)", +"ab27be20": "mine(address,uint256)", +"ab27d755": "confirmOrder(bytes16)", +"ab282655": "removeHouse(address)", +"ab2874cb": "buySlot(uint256)", +"ab28c704": "initialSupportAmount()", +"ab28e8af": "serviceTokensBurn(address,address)", +"ab2a4f8a": "transferRevenue(address,address,uint256)", +"ab2a5772": "setIcoHardCap(uint256)", +"ab2a6dc1": "dealsGetter(address,uint256)", +"ab2af349": "CallCancelled(bytes32)", +"ab2c8b16": "fundingLowcapReached()", +"ab2e5a1f": "play(uint256,uint256,uint256)", +"ab2ebcf1": "priceExpirationInterval()", +"ab2f0e51": "availableBalance()", +"ab30c26d": "getInvestorInforMin(address)", +"ab32775c": "alreadyContains(uint256[],uint256,uint256)", +"ab331a34": "getProperty(string)", +"ab33cbcf": "inxCrowdsale()", +"ab34dc48": "monechainToken()", +"ab351270": "lottery(address,uint256)", +"ab3545e5": "getMember(uint256)", +"ab35678c": "trackCount()", +"ab3640c8": "processPayment(address,uint256,bytes32)", +"ab36e4a6": "milestonesCount()", +"ab37594b": "cancelOrderByMerchant(string)", +"ab383a6b": "getPropertyPrivateModeBecomePublic(uint16)", +"ab3860d0": "test_twoValidEqUint()", +"ab3a32c4": "refundAllExternalPurchase(address)", +"ab3a39c2": "scamSealTokenAddress()", +"ab3b87fe": "setOwner(address,uint256)", +"ab3bd81f": "changeTuneOption(uint32,uint32,uint256,bool,bool,uint128,bool,uint64,uint256)", +"ab3bfac4": "freezeBalance(address,uint256)", +"ab3c04d3": "BAKEToken()", +"ab3cdaf0": "PRE_ICO_BONUS_TIME_2()", +"ab3d2e74": "_clearApproval(uint256)", +"ab3d4e8b": "MembershipPurchase(address,uint256,uint256)", +"ab3dd698": "airdropDiff(uint256[],address[])", +"ab3e9c56": "ChangedInitialPrice(uint256)", +"ab3ed9f0": "DecisionToken()", +"ab3efa83": "tokenSafeLock(uint256,uint256,uint256,uint256)", +"ab3f22d5": "allocate(address,uint256,uint256)", +"ab3f699c": "getOrCreateNextFeeWindowWasCalled()", +"ab400d86": "updatePlayerEth(address,uint256,address)", +"ab40340a": "recordWithdraw(uint256,address,uint256)", +"ab40b01f": "getAddressAnswerKeccak256(uint256,address,address)", +"ab40b65a": "receiveapproval(address,uint256,address)", +"ab413a7e": "getScoreAndCount(address)", +"ab4215cc": "getDataOfGame()", +"ab430d49": "transferToken_toInvestBalance(address,uint256)", +"ab442c59": "getICOToken()", +"ab4459bc": "releaseBountyTokens()", +"ab447007": "setClaimDate(uint256)", +"ab45e2a0": "processPurchase(address)", +"ab464a4c": "launch_date()", +"ab464fa6": "transferMultiDiff(address[],uint256[])", +"ab46cc46": "add_attender(string[])", +"ab470f05": "getCaller()", +"ab473f48": "closeFunding(uint256)", +"ab47f1bf": "getFilledAmount(uint256)", +"ab4865ec": "boardTokensAddress()", +"ab486607": "getLeaderboardLength()", +"ab489f08": "toBytes(address[])", +"ab48f2f8": "PlayNow()", +"ab4955c2": "ReserveWalletUpdated(address,address)", +"ab4a2eb3": "getUnlockableTokens(address)", +"ab4b3929": "updateMinMaxInvestment(uint256,uint256)", +"ab4b4def": "WITHDRAWAL_SCALE()", +"ab4bc414": "bitbgcToken()", +"ab4bf05e": "addSignature(string,int256,string)", +"ab4c4487": "getSystemSalePrices()", +"ab4d0ca9": "multiAdd(address[])", +"ab4e21c4": "OneBlocToken()", +"ab4e8ef1": "getAirdropTokens()", +"ab4ef895": "MB()", +"ab4f643c": "PublisherParametersChanged(address)", +"ab4fa078": "ListAllSince(uint256)", +"ab503e30": "SetminTokens(uint256)", +"ab50bc86": "PubRegistered(address)", +"ab50e7f2": "third_release(uint256)", +"ab5170b2": "getstr()", +"ab519020": "calcShare(uint256,uint256)", +"ab51937b": "startproduction()", +"ab519b0c": "prepare(uint256,address,address,uint256,bytes)", +"ab51b06f": "preSaleBonus()", +"ab51cff2": "getQuarterVATBalance(uint256,uint8,address)", +"ab531efd": "_encodeTokenId(uint256,uint256)", +"ab5366dd": "pendingOwner2()", +"ab53d3b3": "jpotInfo()", +"ab54775d": "lookupSigName(address,address)", +"ab55979d": "changeStaker(address)", +"ab55d1cc": "getDAIBalance()", +"ab5690c4": "enableWithdrawals(address,address)", +"ab56c09e": "Placed(uint256,uint8,address)", +"ab5706ee": "setBaseSummonPrice(uint256)", +"ab5783c4": "StopGame(uint8)", +"ab582eb3": "kickOwner(address)", +"ab5841f2": "updateReserve(address,uint32,bool,uint256)", +"ab590032": "cleanAssetHolders()", +"ab5a7076": "RadiumToken(address)", +"ab5aa302": "_START_DATE()", +"ab5aea81": "Menu07(address)", +"ab5b4456": "use(uint256)", +"ab5db036": "refundICO(address)", +"ab5e28c5": "transfers()", +"ab5e5158": "setNewManager(address,address)", +"ab5ed150": "getOne()", +"ab5efded": "OmegaToken(address,address)", +"ab5f3380": "getVineyard(string,address,uint256)", +"ab5f6b91": "multiCreate(uint256,uint256,uint256)", +"ab5fa2c6": "setITO(address)", +"ab60443b": "changeInviteRate(uint256)", +"ab605eea": "fighterIndexToApproved(uint256)", +"ab60e4e5": "setWebGiftOnceMaxAmount(uint256)", +"ab60ffda": "exp()", +"ab61787a": "proofFailed(address,uint256,uint256)", +"ab619e5a": "StandardToken(string,string)", +"ab6231f1": "RefundedETH(address,uint256)", +"ab62438f": "submitImpeachmentProposal(string,address)", +"ab624cf1": "setPartyA(address)", +"ab630fc4": "kimsOnAuction()", +"ab635b48": "createTokenVestingContract(address)", +"ab63d7f2": "getUniqueId()", +"ab643c07": "getAllBounties()", +"ab643c10": "requestEthereumPrice(address,string)", +"ab64611b": "BitmarkPaymentGateway(address)", +"ab651065": "setESCBCoin(address,address,address,uint256,uint256)", +"ab65c534": "SqueezeTheJuice()", +"ab65cda6": "getDial2Type(uint8)", +"ab65f20a": "mintCards(uint256[],address)", +"ab6680f3": "initAuction(uint256,uint256,uint256,uint256,uint256,address,bool)", +"ab67aa58": "transferFrom(address,address,uint256,bytes)", +"ab686d0a": "setFrontWindow(address)", +"ab6a5d95": "changeBoardAddress(address)", +"ab6a9f0e": "knockoutTeam(uint256,uint256)", +"ab6ad452": "unlockedBalance()", +"ab6ae424": "affWallet()", +"ab6b551e": "isSideBridgeContract()", +"ab6b7e22": "grantBounty(address,uint256)", +"ab6bfe78": "Hongshanchain(uint256,string,string)", +"ab6c291b": "getWiningType(uint256)", +"ab6c5f58": "removePlayer(uint256,uint8)", +"ab6cab71": "PoWH4DSupply()", +"ab6cb831": "UNIToken(uint256)", +"ab6cf42f": "isReservationFull()", +"ab6d8a9a": "gemFab()", +"ab6da028": "TOKEN_FOR_COMUNITY()", +"ab6db199": "dias()", +"ab6ddfa8": "holderBalance(address)", +"ab6def1c": "isShareToken()", +"ab6e1be4": "getTs()", +"ab6e4959": "depositsOfMember(address)", +"ab6e79ed": "getBaseToQuoteReturn(uint256)", +"ab6e9072": "admin_wallet()", +"ab6e988c": "playerVault(address)", +"ab6ef0b1": "purchaseLandWithCC(uint8,bytes32,uint256)", +"ab6f78f0": "SetRecord(address)", +"ab6f9e4a": "votesPerChoice(uint8)", +"ab700624": "toWidthString(string,uint256)", +"ab701ca3": "_upgradeabilityOwner()", +"ab702d48": "train2(uint256,uint256)", +"ab70bba7": "OtxToken()", +"ab70d0c5": "_getEndWeek(uint256,uint256)", +"ab70ee5c": "PoloneumToken()", +"ab71b8ac": "maxBountyTokens()", +"ab727094": "reinvestDivies()", +"ab731fd6": "ownerSetOverride(address,address,bool)", +"ab736b5d": "checkUniqueLockedTokenReceivers()", +"ab73e316": "next(address)", +"ab73f08e": "findOptionId(address)", +"ab74731d": "dividendPayment()", +"ab75a4a2": "angelWheelFinancing()", +"ab75e6c8": "DTXTestToken()", +"ab7748da": "Blocker_resume(bool)", +"ab779505": "NettingChannelContract(address,address,address,address,uint256)", +"ab77b178": "issueCoin(address,uint256)", +"ab7891f5": "deleteSiringWithId(uint256)", +"ab79fd26": "setBeginTimeTS(uint256)", +"ab7a162f": "getInterCryptoPrice()", +"ab7a9691": "isReleaseAgent(address)", +"ab7aa65d": "icoThresholdBonus2()", +"ab7af62f": "setAttackBoostMultipler(uint256)", +"ab7b347c": "BitcoinDominatorERC20Token()", +"ab7b47aa": "_generateInitialPattern()", +"ab7cb211": "allowBuy()", +"ab7ccc1c": "credit(uint256,uint256)", +"ab7df819": "Simscoin()", +"ab7e50ba": "GAX()", +"ab7e9dca": "getPrivilegedBalance(address)", +"ab7ebbce": "startPresale(address)", +"ab7ec692": "primoContratto()", +"ab7f8f12": "masicotestToken()", +"ab802509": "setMintAgent(address)", +"ab80c807": "RareCoin(address)", +"ab81e773": "left61(uint256)", +"ab82d9a0": "challenge(uint256)", +"ab831144": "parseUint(bytes32)", +"ab834bab": "atomicMatch_(address[14],uint256[18],uint8[8],bytes,bytes,bytes,bytes,bytes,bytes,uint8[2],bytes32[5])", +"ab840808": "migrateBasicData(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"ab8425d8": "set_amount(uint256)", +"ab84db68": "releaseArr()", +"ab850a85": "mintGold(uint256)", +"ab8530f8": "Mint(address,address,uint256)", +"ab8620dd": "getStageSoldTokens()", +"ab86ba3a": "bonus3()", +"ab86e0a6": "_setBalance(address,uint256)", +"ab87d816": "getPerson(uint32)", +"ab883d28": "multisendEther(address[],uint256[])", +"ab888539": "setIdentifier(address,bytes32)", +"ab889df9": "DoradoToken()", +"ab89641b": "getTlength50()", +"ab89d8c6": "WGWToken()", +"ab89f2c7": "getCurrentStageId()", +"ab89f870": "setMultiple(uint256)", +"ab8a0360": "Auth()", +"ab8a1595": "test_25_assertGasUsage1400Boards()", +"ab8a288b": "checkStoredFile(string)", +"ab8be231": "setMockedTime(uint256)", +"ab8ca6e9": "getBonusTier(uint8)", +"ab8d01b8": "transferFromToUpdateToken(address,address,uint256)", +"ab8d1daf": "payTokenOwner(address,uint256)", +"ab8d3dc1": "TokenPing(uint256)", +"ab8e0f6e": "Mmcchain(uint256,string,string)", +"ab8e5b01": "testGetLastTime()", +"ab8efb87": "UInt256(int256)", +"ab8f1957": "investedPeriods(uint256)", +"ab8f3c98": "validateBroadcasterSig(string,uint256,bytes32,bytes,address)", +"ab8feb02": "TKN()", +"ab90602c": "registerTicketsToUser(string,address,uint256)", +"ab90a8ac": "createSaleTokens()", +"ab90f855": "maxPromoToons()", +"ab911060": "assertOnlyFrom(uint256)", +"ab91154e": "ownerAddSanSlot(address,uint256)", +"ab91c7b0": "queueLength()", +"ab9213f3": "addAddressReferrals(address[],address[])", +"ab92670e": "Franc()", +"ab929fcd": "submitArticle(string,string,bool)", +"ab92f290": "addNewDividends(uint256)", +"ab948370": "KingToken()", +"ab948374": "gen0EndingPrice()", +"ab95b586": "getEventTimes()", +"ab9611f4": "setCancelableAt(uint256)", +"ab96cc4c": "receivedFunds()", +"ab96d498": "addPublicFundingWhiteList(address[])", +"ab96dd18": "earlyStageLasts()", +"ab97af6c": "initialCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"ab97d59d": "getTokenManager()", +"ab97e196": "revokeAmountVote(uint8)", +"ab98458e": "getUint80val()", +"ab989586": "WMCToken(uint256,string,string)", +"ab998660": "LockMechanismByOwner(address,uint256)", +"ab998939": "RequireDispose(address)", +"ab99deb8": "Expread()", +"ab99e48f": "requestMerge(uint256[])", +"ab9a5caa": "AEStoken()", +"ab9a78df": "priceOf(string)", +"ab9a81c3": "numOfBlocksInMinute()", +"ab9a913a": "generatedEve()", +"ab9ae1be": "isCrowdSaleStatePreSale()", +"ab9af166": "reduceCDFee(uint256)", +"ab9b8637": "medibitICO(address)", +"ab9c1758": "cancelMarginCallOnBehalfOfRecurse(address,address,bytes32)", +"ab9c20d0": "finalizationSuccessHook()", +"ab9cd37e": "withdraw(uint80)", +"ab9d8b8b": "circulatingTokens()", +"ab9d8e4b": "Thankfulness()", +"ab9dbd07": "getID()", +"ab9def41": "hardCapTokensAmount()", +"ab9fe3a1": "importBalances(address,address[])", +"aba00859": "decBalance(address,uint256)", +"aba01e5c": "impl_amountOfWorkpointQueue()", +"aba0e189": "checkGameStatus()", +"aba1017b": "despawnGladiatorAndAwardCoins(address)", +"aba133ea": "GVPE_Token()", +"aba13a2f": "_resetTiles()", +"aba16a02": "offerToChannels(uint256)", +"aba222ed": "nodeRegistrationEnabled()", +"aba23628": "mintPlayers(uint128[],uint256,uint256,uint256)", +"aba3d017": "windowAt(uint256)", +"aba46a93": "etapAddressesLimit()", +"aba47d1a": "getGrapesToBuildWinery()", +"aba61514": "priceT4()", +"aba683fa": "Etbccoin()", +"aba70319": "FreyrTokenLocker()", +"aba7ad0d": "lotteryFeeVal()", +"aba88037": "DARKNODE_FEES_NUMERATOR()", +"aba88766": "claimableHalvingsOf(address)", +"aba89198": "getCurrentCapacity()", +"aba8dfbd": "SecondBonus()", +"aba9650e": "createDepositContract(address)", +"abaa5f3e": "randomDS_getSessionPubKeyHash()", +"abaa9916": "allocate()", +"ababa4a7": "authorize()", +"ababb2dd": "_tryUnlockBalance(address)", +"ababe93d": "distributeBondFund()", +"ababf71b": "GetSummReward(uint256)", +"abacf5d7": "getBoardUpdateTime(uint256)", +"abad3466": "createtoken(string,string,uint256)", +"abadaf9a": "bonusAmount()", +"abadeb06": "teamPeriodsNumber()", +"abaed924": "executeOrders(address[],bool[],uint256[],uint256[],address[],address[],address[8][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[])", +"abaf1de9": "setPublicPrice(uint256,uint256)", +"abaf5880": "Crowdsale(uint256,uint256,uint256,address)", +"abaf9457": "localRevenuePercent()", +"abafaa16": "emitIssue(bytes32,uint256,address)", +"abb00601": "addUnpausedWallet(address)", +"abb151c8": "CCICoin()", +"abb1a33a": "SetHotLists(string)", +"abb21618": "changeAirdropValue(uint256)", +"abb254de": "developer_withdraw_ETH()", +"abb2874f": "DezToken()", +"abb29f70": "TinyOracleDispatch()", +"abb2d04b": "editName(string)", +"abb4108e": "addRoles(uint8[])", +"abb41fab": "_reward_masternode()", +"abb43397": "getCanvasBitmap(uint32)", +"abb46619": "DSCToken(uint256,address)", +"abb4fe2d": "MiningRigRentalsToken()", +"abb524a4": "PapyrusSalePhase1(address,address)", +"abb58d20": "Registry(address,address,address,string)", +"abb58fd3": "createLink(bytes32)", +"abb5bf16": "reinverst(address)", +"abb689e1": "payRedemption(uint256)", +"abb69a1a": "getInvoicesByStatus(address,uint256,uint8)", +"abb70034": "getChosenNumbers(address,uint256,uint256)", +"abb721ce": "_deposit()", +"abb743c8": "setUint(int256,uint256)", +"abb8c965": "_setOwner(address,bool)", +"abb9e0bf": "coinIssuedAdvisor()", +"abb9eef4": "YUNXIN2Token(uint256,string,uint8,string)", +"abba87c1": "_prestige()", +"abbadf55": "oobiqoo(address)", +"abbb4695": "setNotifier(address)", +"abbbf451": "getRound0MinDuration()", +"abbc54b0": "changePriceUpdateWaitingTime(uint256)", +"abbc5d2a": "levToll()", +"abbc8afa": "teamPoolForFrozenTokens()", +"abbcb24b": "LEGAL_EXPENSES_ADDR_2()", +"abbdc272": "checkGameStart()", +"abbe3056": "stage2Deadline()", +"abbef24e": "buyDaiWithEth(uint256)", +"abbf7228": "changeBlocks(uint256,uint256)", +"abbf94f8": "PlatoniusToken()", +"abbff658": "Ownable3()", +"abc1c9fe": "requestForRefund(uint256)", +"abc21702": "getPI_edit_25()", +"abc2a40a": "minInvestBTC()", +"abc2ab75": "FinalizeDispute(address)", +"abc32931": "safeTransferFromDataContract(address,uint256)", +"abc33778": "Result(bytes32,address,uint256,bool)", +"abc38cf2": "submitNewClip()", +"abc3bc92": "getReferrerBalance(address)", +"abc40f41": "batchWrite(uint256,uint256,string)", +"abc4558e": "_requireRenewableProduct(uint256)", +"abc45ddc": "BANKOIN()", +"abc48a0d": "minerTotalSupply()", +"abc4cbd3": "transferForTeam(address,uint256)", +"abc6124f": "Bought(uint256,string,address,uint256,string,string)", +"abc63d00": "STARTING_TIME()", +"abc66e82": "dev_fee(uint256)", +"abc6affb": "publicGetUserHistory(address,uint256)", +"abc6fd0b": "disburse()", +"abc897f4": "removeMinterByValue(address)", +"abc8bc4c": "addBomb(uint8,uint256,uint8,uint8)", +"abc8c7af": "marketplace()", +"abc93aee": "left64(uint256)", +"abc9e8c0": "fetchOrdersForPayer(address)", +"abca7290": "feeDeposit()", +"abcafdf8": "prizeProjection(uint256,uint256)", +"abcb7fce": "getTokenAddressHashing(address,uint256)", +"abcb9934": "unlistToken(address)", +"abcc11d8": "lastResult()", +"abcc8a46": "LogEuroTokenOwnerMigrated(address,uint256)", +"abccb043": "modifyMaxContractBalance(uint256)", +"abcccdb1": "agentAddr_()", +"abcd0d9d": "getNewEndTime(uint256,uint256,uint256)", +"abcd7960": "equal(uint256,uint256,string)", +"abcdabcd": "aiGFJ()", +"abcdff1d": "ComputeMyShare()", +"abce03d0": "KoreaRepublicvsGermany()", +"abcf033c": "safeWithdrawalFromCrowdsale(address)", +"abcf1328": "InterestBank()", +"abd05acd": "createDklSaleAuction(uint256,uint256)", +"abd06c3b": "remove(bytes1,bytes1)", +"abd10e07": "failSafeAddWhenGreaterThanIntMax()", +"abd117fe": "GXCSentToETH()", +"abd15c4f": "transferProd(address)", +"abd188a8": "setKyberNetworkContract(address)", +"abd1a89c": "allocTokenHolder()", +"abd225e1": "isStarted(uint256)", +"abd23d95": "getNameByAddress(address,address)", +"abd2adbb": "columns()", +"abd2cc5f": "presaleClosed()", +"abd2ecb7": "isOnExchangeById(uint256)", +"abd437da": "balanceOfCall(address)", +"abd44556": "setBatchDetachCollectibles(uint256[])", +"abd49646": "makerDAO()", +"abd5100d": "referralAmountInvest(address)", +"abd5f3c7": "poolPrice()", +"abd6b000": "CryptoSagaCardSwapMerculet(address,address,address,address)", +"abd6cb3c": "firstStageRaised()", +"abd6ff8e": "setIntValue(string,int256)", +"abd70aa2": "getPoolBalance()", +"abd74e52": "getLastPriceFeedValues()", +"abd796bf": "addAllowedAddress(address,address)", +"abd7f8de": "doEmit(uint256,uint256)", +"abd8537f": "makeSmokeymon(string,uint8)", +"abd89e1e": "preICOmint(uint128)", +"abd8d939": "buyThroughProxy(address)", +"abd936ab": "delegateDklSaleAuction(uint256,uint256,bytes,uint256)", +"abd958eb": "getCurrentBlockValueAndSellPriceForTile(uint16)", +"abda35de": "inMaintainance()", +"abda78ed": "getAltOracles()", +"abdb5ea8": "repayBorrow(address,uint256)", +"abdbe6ca": "CrowdDreaming()", +"abdbf4a3": "UpdateAsk(address,uint256,uint256)", +"abdc5dee": "HumaniqToken(address)", +"abdd0c44": "marginCallOnBehalfOf(address,bytes32,uint256)", +"abdd11a8": "setOpeningTime(uint256)", +"abdd19d9": "setCityContract(address)", +"abdd2430": "AuctionCreated(address,uint256,uint256,uint256,uint256,uint256)", +"abdde3d1": "getEthToTokenOrder(uint32)", +"abde33f7": "right26(uint256)", +"abded6fd": "setANT(address,address,address)", +"abdf9566": "setData_16(string)", +"abdf9bda": "bountyProgam()", +"abe088a7": "financialOfficerAddress()", +"abe1d5a2": "ViewRawDeposit(uint256)", +"abe24a3d": "mulByFraction(uint256,uint256,uint256)", +"abe2a16e": "FeeRate()", +"abe2a18d": "stateChangeAgents(address)", +"abe3219c": "safeMode()", +"abe35312": "getAvailableTokensToSellCurrentPhaseIdx(uint256)", +"abe3d0e3": "logPurchase(address,uint256,uint256)", +"abe3dfd1": "setInitialRate(uint256)", +"abe4136f": "getNickname()", +"abe4932c": "createPostboyAccountForSomeone(uint256,uint256,bytes16)", +"abe5b120": "Registered(address,uint256,uint256,uint256)", +"abe65ec9": "_createDiamond(string,address,string,string,string,string,string)", +"abe6c54d": "deleteCandidates(address)", +"abe6e82f": "setAmountBonuses(uint256,uint256,uint256)", +"abe7008e": "getPlayerValue(uint8[],uint8)", +"abe756da": "dateRelease9()", +"abe75844": "preSaleFirstEndDate()", +"abe7b54e": "readWelfareDetails(address)", +"abe7c08e": "finishVoting(uint256)", +"abe7cc7b": "LOCK_END()", +"abe7f1ab": "remove(address,uint256)", +"abe7f6fe": "ensureAllowance(address,address,uint256)", +"abe8014a": "totalWeiRaisedDuringPreICO()", +"abe9717a": "A2ACrowdsale()", +"abe9f569": "oraclize_getPrice(string,uint256)", +"abea0804": "nAddresses()", +"abea8d79": "setMiningLeader(address)", +"abeb5f9f": "hasQuickBuyEtherToken()", +"abebb746": "_fillOrder(address,address,uint256,address,uint256,uint256,uint256)", +"abebb7f3": "MarketsContract()", +"abec0a00": "BLVK()", +"abed982b": "LockedUpTokensWithdrawn()", +"abedeab4": "init_claim(uint256)", +"abee967c": "initialReward()", +"abefe7ac": "canCreateUnit(uint256)", +"abf03e19": "end_ICO(uint256)", +"abf0661f": "_burnForDeposit(address,uint256)", +"abf0c538": "vestTokens()", +"abf17198": "getShipProductEarningByModel(uint16)", +"abf19801": "createVesting(address,uint256,uint256,uint256,uint256,bool,address)", +"abf26786": "item(uint256,bool,bytes)", +"abf2b5b9": "cancelMtr(uint256)", +"abf2e01c": "isElectionPeriod()", +"abf3260f": "highestEditionNumber()", +"abf45359": "preSaleTokenCap()", +"abf52f53": "independentSellerJoined(address,uint256,address)", +"abf567e1": "setStartTime(uint256,uint64)", +"abf64392": "withdrawInvalidated(uint256)", +"abf74a93": "pitFee()", +"abf74cda": "_issueTokens(address,uint256)", +"abf74d5f": "bury(uint256)", +"abf7b063": "totalSuperAdminsMapping()", +"abf7bfd8": "createUser(bytes32)", +"abf7f83e": "setBonuses(bool)", +"abf8de6b": "TrocarAdmin(address)", +"abf8fbb8": "BCB(uint256,string,string)", +"abf98fe1": "getDepositBalance(uint256,uint256,uint256)", +"abfb589b": "revealBet(uint256,uint256)", +"abfb84a9": "TransferredPrefix(string,address,address)", +"abfc3db2": "MIN_UPDATE(bytes32)", +"abfc99a8": "setPeriodStart(uint256)", +"abfcb627": "subscribe(address,bytes32)", +"abfcb6f8": "checkInfo(uint256,address)", +"abfcc7d8": "endRound(uint256,uint256,address[],address[],bool)", +"abfccf3c": "REKTTokenSale(address,address,uint256)", +"abfceffc": "getAssetsIn(address)", +"abfd5c94": "addEntryInDays(address,uint256,uint256)", +"abfdcced": "setBool(bytes32,bool)", +"abfdd068": "getUserAuctionIds(address)", +"abfdfbe6": "setRentalPricePerDay(uint256)", +"abfe0472": "setMainLocation(uint16,uint16)", +"abfe35ad": "getStakingReward(uint256)", +"abfe40a8": "privateMint(uint256)", +"abfea3c5": "IraPid()", +"abfebfd9": "fifthWeekTokenPrice()", +"abff0110": "broker()", +"abff3fc1": "eventSaleEnd()", +"abffc9ac": "delistToken(address)", +"abffeffc": "create(address,address,address,address)", +"abfffa28": "foundersTokensDisbursed()", +"ac001725": "Goldic()", +"ac00c3e6": "teamEndTimestamp()", +"ac01367f": "CryptovoxelsProperty(string,string)", +"ac016a31": "label(bytes12)", +"ac01b83d": "getAllPlayers(uint256)", +"ac0250f7": "memberAt(uint256)", +"ac0287e2": "arrr(uint256[])", +"ac02c601": "TranferETH(address,uint256)", +"ac03f324": "transfer_status()", +"ac045aca": "soldSoulFor(address)", +"ac0496e1": "setItemToken(address)", +"ac04f5a7": "append(address)", +"ac05e0f7": "getBurnRequestUintMap(uint256,string)", +"ac05e15f": "manuallyMintTokens(address,uint256,uint256)", +"ac066073": "startTimePresale()", +"ac06e302": "SetupCrowdsale(uint256,uint256)", +"ac06eb81": "MDIVToken()", +"ac080f48": "getDebrisStatus(bytes32,uint8)", +"ac0840db": "resultsPublishedTime()", +"ac098ce9": "addAnn(string)", +"ac0a04b2": "signToApproveAddTokenData(uint256)", +"ac0a7223": "buyCost()", +"ac0ab476": "transferToContract(address,uint256,bool,bytes)", +"ac0b1786": "MeibangAccumulationAppreciationAllocation(uint256,string,uint8,string)", +"ac0ba9b1": "payUSDCToProvider(address,address,uint256)", +"ac0c103a": "a_palavra(bytes5)", +"ac0c518d": "preSaleTokenSold()", +"ac0ca722": "AutoreleaseTriggered()", +"ac0db69d": "Log(uint8)", +"ac0eeeb3": "showGuessIds(uint256)", +"ac0f3865": "LogTokensWithdrawn(address,uint256)", +"ac0f90e3": "checkCrowdsaleState(uint256)", +"ac0fdae5": "Record(address,string)", +"ac110d8e": "Take()", +"ac12319d": "adminPayout(uint256)", +"ac128f4f": "roundResults(uint256)", +"ac12bf92": "setAdminStatus(address,uint256)", +"ac12f3e9": "partner1_voted_update_prenup()", +"ac132dc3": "ProtectedUnlock(address,address,uint256)", +"ac133709": "getChannelParticipantInfo(address,address)", +"ac133d3b": "deploymentCost()", +"ac134c08": "rewards_amount(uint256)", +"ac13d9a6": "setPartnerContracts(address)", +"ac1424fd": "generateNewTicket(address)", +"ac145d80": "setOperationsCallGas(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"ac14c61e": "PresalePool(address,uint256,uint256,uint256)", +"ac151959": "setmaxprice(uint256)", +"ac1559d2": "totalTokensSent()", +"ac155a6c": "MatryxToken()", +"ac171101": "GAGARIN()", +"ac17cba4": "lemonsRemainingToDrop()", +"ac17d506": "getMemberData(address,address)", +"ac185644": "ownerTimeLastMinted()", +"ac1864b8": "treasuryManagers(uint256)", +"ac187542": "forceEndGame()", +"ac18de43": "removeManager(address)", +"ac194b07": "preIcoStartBlock()", +"ac19c726": "setKeepEth(bool)", +"ac1a13fb": "cancelOrder(uint256,uint32,uint32,uint256,string)", +"ac1a182c": "_calcProportion()", +"ac1a386a": "setWalletAddress(address)", +"ac1a7175": "lockUserInfo(address)", +"ac1aaa1a": "calticket(uint256)", +"ac1ad7d1": "tickerQuery()", +"ac1b14ff": "proxyCall(uint256)", +"ac1bc7e8": "updateDetails(string,string)", +"ac1c1443": "listProducts(address)", +"ac1c3d04": "generateToken()", +"ac1cb329": "withdrawBuyAgent()", +"ac1cd994": "seed_coins_vault2()", +"ac1d0609": "updateWhiteList(address,bool)", +"ac1d6fe2": "changeAllocation(int256)", +"ac1deea0": "RateUpdated(uint256,bytes32,uint256)", +"ac1e17df": "addHolder(address)", +"ac1e4734": "ORCA()", +"ac1e765b": "checkValidity(string,address,string)", +"ac1f7ca1": "totalFundsAvailable()", +"ac20902e": "NormalizeMoney()", +"ac20e2a0": "TOTAL_TOKENCAP()", +"ac210cc7": "wrapper()", +"ac216ae9": "setCheckBonus(bool)", +"ac218c6d": "addressICOManager()", +"ac21bacd": "TokenPriceChanged(uint256)", +"ac22b970": "_medalFreeze(uint256)", +"ac22cec8": "withdrawGasCost()", +"ac230e52": "getHeroName(uint256)", +"ac232383": "getAyantDroitEconomique_Compte_6()", +"ac246c3e": "TIME_TO_STALEMATE()", +"ac256e1d": "RiekCoin()", +"ac25f266": "add_to_whitelist(address)", +"ac26109e": "lockForOrder(address,uint256)", +"ac267435": "volumeType7()", +"ac270c37": "contractUp()", +"ac280cb9": "MAX_STANDARD_SALE_PACKS()", +"ac281ca6": "recordPayment(uint256,uint256,uint256)", +"ac28240d": "transferBackMANA(address,uint256)", +"ac283f5b": "Error(string,string)", +"ac28838b": "getPerson(bytes32)", +"ac28ff48": "collectableTokenBalance()", +"ac297d21": "vendDisciple(uint256)", +"ac2ac86c": "setSmallCapWhitelistParticipants(address[],uint256[])", +"ac2aefd2": "addPigment(uint256,uint256,uint256,uint256)", +"ac2c8bb5": "getTile(uint16)", +"ac2d456d": "setOracleCallbackGasPrice(uint256)", +"ac2d7ce5": "setNextLotteryTTWTokenId4(uint64)", +"ac2e043d": "whitelistMulti(address[],uint256[],uint256[])", +"ac2e064b": "set_maxCWCsPerSaleLessThan(uint256)", +"ac2e2c65": "JULIAN_ADDRESS()", +"ac2f0074": "polls(uint256)", +"ac307773": "claimFunds()", +"ac30da84": "BountyHunter()", +"ac3120a0": "LogContribution(address,uint256,uint256,uint256,uint256)", +"ac31818d": "Better_Bank_With_Interest()", +"ac328187": "initializeTeamVault(address)", +"ac3314a6": "issueLockedTokens(uint256)", +"ac336f7b": "getCurrentConsensus(string)", +"ac355ed3": "_salesprice()", +"ac35bdb4": "sub_session(string,uint256)", +"ac35caee": "transferWithReference(address,uint256,string)", +"ac360d3c": "TokenWrapper()", +"ac375770": "didWithdraw(address,uint256)", +"ac377553": "fillFromCollateral(uint256)", +"ac38eb07": "tokenIdForHandle(bytes32)", +"ac3910a2": "ballot()", +"ac3c27cf": "resolveDisputeSeller(address,string)", +"ac3c49e0": "getMarketMakerAddressFromToken(address)", +"ac3c9952": "batchTransfer(address,uint256[])", +"ac3cb72c": "addApproval(address,uint256)", +"ac3cdf78": "RANGEEND_10()", +"ac3d057d": "releaseBudget(address,uint256)", +"ac3d5084": "initialFrozenTime()", +"ac3d8558": "setExitStake(uint256)", +"ac3dc451": "TorontoRules(address,address[])", +"ac3dc9aa": "startBlockTimestamp()", +"ac3e6b2f": "testSetNotRetractable()", +"ac3e7d24": "addChainyData(string)", +"ac3fc432": "stampCreatedCount()", +"ac403817": "addresIndex()", +"ac41865a": "getPrice(address,address)", +"ac41b4a5": "SignalingEnabled(address,uint256)", +"ac42c3ec": "maxTokenBetValue()", +"ac42ea7d": "rejectBurnRequest(uint256,string)", +"ac42f301": "getNextForwardUserId()", +"ac42f446": "botPhase()", +"ac440d13": "CardsAccess()", +"ac4501d9": "splitTrade(uint256)", +"ac451185": "getGames(uint256,uint256)", +"ac45185d": "adminStewardship(address[2],uint256[7],uint8,bytes32[2])", +"ac457a9d": "ExposureOpened(bytes32,address,uint256,uint256,uint64,uint64)", +"ac460d66": "setTokensContract(address,address)", +"ac46a451": "OpsAddressChanged(address)", +"ac46fa22": "burnEscrow(uint256,uint256)", +"ac4746ab": "EPOCH_LENGTH()", +"ac4758cc": "Takafuly()", +"ac475e5c": "CheckTimeout()", +"ac476a05": "MarketMaker(address,address,uint256,uint256)", +"ac47981c": "issueCertificate(string,string,string,address,address,string)", +"ac480af9": "updateFirstDeposits(uint256)", +"ac482bff": "resume_PRIVATESALE()", +"ac48bd5a": "ethUSD()", +"ac48fcbc": "testTheMultipliers()", +"ac490b08": "parsha()", +"ac49dd5c": "removeTimelock(address)", +"ac4a743d": "ecoFundSupply()", +"ac4ab3fb": "hasRole(address,bytes32)", +"ac4abae1": "lockReleaseDate()", +"ac4b2bae": "newParameters(int256,uint256,int256,uint256)", +"ac4ba3ea": "initManager(uint256,uint256)", +"ac4bd53a": "currentLeader()", +"ac4bed68": "modifyHorsey(uint256,address,bytes32,uint8,uint8)", +"ac4c25b2": "void()", +"ac4c8bf3": "argCurMax()", +"ac4ce2c6": "setAddress(uint256,address)", +"ac4cfa4c": "calcAmount(address)", +"ac4d2e95": "ownerTokensFreeDay()", +"ac4d8a26": "setRepPriceInAttoEth(uint256)", +"ac4d965c": "notZeroAndNotSender(address)", +"ac4ddd9f": "retrieveTokens(address)", +"ac4df041": "donationClosed()", +"ac4e677c": "registerTrack(bytes32,uint256,bytes32,bytes32,bytes32,bool)", +"ac4e73f9": "proposeReverse(string,address)", +"ac4eefc5": "getGoldDataMinted()", +"ac4fb219": "enableLockFlag(bool)", +"ac50713a": "foundingTeamWallets(uint256)", +"ac509050": "getPlayerRoundsKitties(uint256,uint256)", +"ac50a466": "betfortoken()", +"ac50af76": "transferExcessTokensToReserve()", +"ac50b2e5": "getPlayerRoundNumbers(uint256,address)", +"ac51009e": "createBountyTokens()", +"ac51215b": "TokenRegistry(address,int256)", +"ac516951": "setAddressVoteRules(address,address,bool,uint256[5])", +"ac51a36a": "_unpackPetData(uint256)", +"ac51af8e": "transferWithBonus(address,uint256)", +"ac51d3a5": "smileyToken()", +"ac5277a4": "teamSupply6Months()", +"ac552cf2": "getCurrentDukePaid(string)", +"ac5553ce": "phaseDuration()", +"ac5555aa": "initialized(bytes32)", +"ac562666": "freezeCoin()", +"ac566953": "getInfra(uint256)", +"ac56c52b": "makeDealForTwo(string,uint256)", +"ac56f980": "setRealseTime(uint256)", +"ac570411": "getRecipientBalance()", +"ac588536": "delayPayout()", +"ac5895f6": "getSoilHumidityControlLimits(bytes32)", +"ac591e40": "SelectOne(uint256,uint256,uint256,uint256,uint256,string,address)", +"ac592944": "SendPreReserved2()", +"ac59eeeb": "recoverAddressFromWithdrawMessage(uint256,address,uint256,bytes)", +"ac59f0d9": "addToken(address,address,string)", +"ac5aaa5b": "toToteLiquidatorWallet()", +"ac5b3998": "assignLockedBalance(address,uint256)", +"ac5b3dbb": "Michael1011Token()", +"ac5c8535": "storeData(bytes)", +"ac5c867c": "sendCrowdsaleBalance(address,address,uint256)", +"ac5c915f": "burnBonuses()", +"ac5ce03b": "marriageProofDoc()", +"ac5cf934": "usdSeasonAccountRef(uint16,address)", +"ac5cfc3d": "getMsgWaiting(uint256)", +"ac5d2dbf": "typeToken()", +"ac5d51cb": "setAdministrator(address,address,bool)", +"ac5d67e9": "lockAdvisorsTokens()", +"ac5d8745": "voteWithSpecifiedAmounts(bytes32,uint256,uint256,uint256)", +"ac5ddf80": "modify_bool(bool)", +"ac5e7977": "receiverThree()", +"ac5e81a9": "historyPayout(address)", +"ac5ec9ef": "setAcceptPayment(bool)", +"ac5f91a0": "previousMinters()", +"ac6068b5": "isNotExpired()", +"ac60a6cd": "payInvoice(uint256)", +"ac60bbca": "userTokenStats(address,address)", +"ac60c969": "canFirstMint()", +"ac60da79": "TOKEN_SALE3()", +"ac61e92b": "createBet(uint256,uint256,uint256,uint256,bool)", +"ac624f52": "crowdSaleToken()", +"ac62ddb2": "validateMigrationIsPending(string,string)", +"ac62e250": "CertificationSet(string,address,uint256)", +"ac63208d": "SPRToken()", +"ac637c7a": "delegateTo(address)", +"ac64198b": "RSPLT_G()", +"ac6456df": "_betFailure(string,uint256,bool)", +"ac646629": "viewTokenBalance(address,address)", +"ac646756": "pause2()", +"ac656636": "getDepositReceipts(address,int256,uint8)", +"ac65b258": "PresalePool(uint256,address,uint256,uint256)", +"ac66777f": "multiCallTightlyPacked(bytes32[])", +"ac67857e": "ArtsCoin()", +"ac697fb5": "SkySwapToken()", +"ac69c09c": "changeVotingRules(address,uint256)", +"ac6a2b5d": "_withdraw(uint256)", +"ac6a4d6a": "fooInt()", +"ac6a602f": "getCompte_34()", +"ac6af280": "setRates(uint256,uint256)", +"ac6b02c4": "IFCC()", +"ac6b8e00": "transferLock(address,uint256,bool)", +"ac6bc853": "startSpin()", +"ac6c5251": "getWeight(address)", +"ac6d0316": "performUpdateCallPtr()", +"ac6d0fed": "nestedFirst(uint256)", +"ac6d8150": "getPayment(uint256,string)", +"ac6da90d": "qwercoin()", +"ac6e1237": "CrowdsaleEndedSuccessfuly(uint256,uint256)", +"ac6e2db6": "tokenCreationCapOne()", +"ac6ebb28": "CioCoinERC26Token(uint256,string,string,uint256)", +"ac6ee852": "newGanToken(uint256)", +"ac6eead3": "team_token_percentage_total()", +"ac6fe0ed": "Batchdrop(address)", +"ac700665": "getOrdersForBuyer(address)", +"ac700e63": "pauseMigration()", +"ac708f0c": "getProjectedBlockHash(uint256)", +"ac70a1ef": "getTreasures()", +"ac70e6c4": "level_9_percent()", +"ac71045e": "getOffer(address,uint256)", +"ac711cbb": "withdrawEtherAll()", +"ac71abde": "addAccounts(address[])", +"ac72200d": "getMinted()", +"ac72c120": "hasReverse(bytes32)", +"ac72cd7e": "BrokerInt(address)", +"ac73e97e": "lastMiningTime()", +"ac74bcde": "defaultNumberJuror()", +"ac74f2a8": "Bothereum(uint256,string,string)", +"ac767539": "testFailItemStoreNotRegistered()", +"ac76a499": "clientsAverageRating(address)", +"ac76fbf1": "GeoGame()", +"ac7709bc": "setTimedTransfer(uint256,uint256)", +"ac778b8f": "createCertificate(string,string,string)", +"ac77eb8e": "ZingToken()", +"ac781fbe": "TrustTokenERC20(uint256,string,string)", +"ac789e5f": "BlindAuction(uint256,uint256,address)", +"ac78dc16": "payTeam()", +"ac793a60": "createBet(uint256)", +"ac798bd3": "calculateArtCoinSupply()", +"ac798def": "set_sale_arbits_sold(uint256)", +"ac79a4b1": "getCreateMarketCreatorValue()", +"ac7a1b5b": "maxWithdraw()", +"ac7a722e": "updateETHPriceInCents()", +"ac7a95d5": "getNewShroom(uint256)", +"ac7b663a": "_settleInterest()", +"ac7b986f": "lotusWallet75Pct()", +"ac7bb2b4": "removeFromWhiteList(uint8,address)", +"ac7cda53": "changeRegisterBot(address)", +"ac7dce1d": "BsPresale_SNOV(address,address,uint256)", +"ac7e1e0a": "setEtherProceedsAccount(address)", +"ac7f0c48": "calculateWin()", +"ac7f9329": "AUTH_SETMINTAMOUNT()", +"ac7fc263": "multipliers(uint256)", +"ac7ffae3": "updt(uint256,string,uint256,uint256,string,string,address)", +"ac800b32": "transferCanaryOwnership(address)", +"ac82239f": "enableInvite(string,bytes32)", +"ac824fd9": "SHEX(uint256,string,uint8,string)", +"ac8261c9": "optionProgram()", +"ac828200": "_dlgtRet(uint64)", +"ac833fd9": "test_insert_findWithHintNextUpdateHead()", +"ac838774": "addauction(address,uint256,uint256,uint256,uint256,uint256,string,string)", +"ac8388a5": "callthis()", +"ac83ae55": "GAMEToken()", +"ac83e891": "BokkyPooBahsAutonomousRefundathonFund()", +"ac84ed4f": "TronClone()", +"ac856216": "setNumRewardsForTMEUser()", +"ac860a59": "_signPropertyByAgent(address,address,bytes32)", +"ac8641ee": "updateRefundWalletAddress(address)", +"ac8648a2": "mintFeeTokens(int256,uint256)", +"ac869cd8": "setFrozen(address,bool)", +"ac884902": "setResults(bytes32[])", +"ac8860b9": "ProposalExecutedEvent(uint256)", +"ac88c8d8": "verifyAndLiquidate(address,address,address,uint256,uint256,uint256,uint256)", +"ac88ffb2": "feeWithdrawEthAmount(uint256)", +"ac890c4c": "unsetAllowedMultivest(address,address)", +"ac8a2af0": "updateShareholders(address)", +"ac8a584a": "removeOperator(address)", +"ac8aa236": "batchTransferVIP(address[],uint256[])", +"ac8aea24": "transferUnsoldToken()", +"ac8c5e8e": "buyLong(address[2],uint256[3],uint8,bytes32[3])", +"ac8d6030": "removeRequest(address)", +"ac8d6632": "addMasterNodes(address,uint256,uint256)", +"ac8dc6ea": "_decodeData(bytes)", +"ac8e88c2": "_updateSolvency(uint256)", +"ac8f539b": "emergencyDrain(address,uint256)", +"ac8fa644": "transfer_Same_Amounts_of_assets_to_many_addresses(address[],uint256)", +"ac8fbd09": "UpdatePoolTarget(uint256)", +"ac900c2d": "unregisterSeller(address)", +"ac92f4ae": "calldatacpy(uint256,uint256,uint256)", +"ac92fdb5": "getSaleDate(bytes16,uint256)", +"ac940823": "betOnLowHigh(bool)", +"ac957954": "transferDonations(bytes32,address)", +"ac95a2aa": "_createOriginalPainting(uint256,uint256,uint256)", +"ac95be9b": "testico()", +"ac9630fa": "publishGraduatingClass(string)", +"ac964f21": "numProducts()", +"ac9650d8": "multicall(bytes[])", +"ac9663a6": "approveByC(uint256,string)", +"ac96a0b3": "GYG()", +"ac96c65e": "doCancel(bytes32)", +"ac96f981": "authorizeAccess(address,int256,address)", +"ac978cea": "TeamHOMO()", +"ac979688": "transferAnyERC20TokenToBeneficiary(address,address,uint256)", +"ac97ad89": "getTokensFromAddressReturns(address,address)", +"ac985f0a": "townsSold()", +"ac9873c7": "CanaryV7()", +"ac988bdc": "_getStageIndex()", +"ac991b65": "double_blind_sha256(string,address,address)", +"ac996e7e": "resolvePledging()", +"ac99aa69": "recoverEthers()", +"ac99e0aa": "BitImageToken()", +"ac99f7b7": "_setStages(uint256,int256)", +"ac9a252a": "ownershipTransferred(address)", +"ac9a6515": "testTokenOwnershipAfterFinalize()", +"ac9b5671": "setVerifier(address,bool)", +"ac9b5c30": "getCreateMarketfeePerEthInWeiValue()", +"ac9c3b7a": "TokenTotal()", +"ac9c80af": "seed_additional_eth()", +"ac9cd354": "getTransferInfoCount(address)", +"ac9d7e0a": "raisevote()", +"ac9ef8a1": "changeMultisigs(address,address)", +"ac9f0222": "setState(bool)", +"ac9f2b7b": "callDeposit(address,address,uint256)", +"ac9f9d12": "FACHAINStandardToken(uint256,string,uint8,string)", +"ac9fd2b8": "nextLoanInterestRate(uint256)", +"aca00932": "calculateBaseTimeout()", +"aca15663": "transferToExchangeAddress(address,uint256)", +"aca19256": "_logRoundExtensionVolume(uint256)", +"aca233fd": "one_two(uint8)", +"aca31e61": "setEthPerToken(uint256)", +"aca34c11": "getPoolDetails()", +"aca62a5f": "convertAllOldTokens(uint256,uint256)", +"aca66aec": "DVIP()", +"aca67a8f": "getIsNFTAttached(uint256)", +"aca6bef7": "checkPolicy(uint256)", +"aca6fdf2": "getJobWorkerName(uint256)", +"aca7207a": "changeCoolDownTime(uint256)", +"aca7dcfe": "token_swap_supply()", +"aca7fdd4": "initialFunding(address,address,uint256)", +"aca867b3": "secure(address,uint256)", +"aca8dd6b": "test_threeInvalidEqString()", +"aca8e9dd": "setBillboard(string)", +"acaa78cd": "addTransferrer(address)", +"acaab181": "addSomeGas()", +"acab021c": "getTOS(address)", +"acab3e5d": "PricingStrategy()", +"acabbbc0": "getSlogan(uint64)", +"acabd1b9": "setFee3(uint256)", +"acac0b9f": "setMaxPerExchange(uint256)", +"acac9a9f": "undropped()", +"acad94ae": "humanStandardByteCode()", +"acada0d8": "SUNQToken()", +"acaf0278": "contractuallyOf(address,address)", +"acb02504": "getJobDescription(uint256)", +"acb02f7c": "VotePumpCoin0x()", +"acb09dde": "fechVoteNumForCandidate()", +"acb0bdc3": "isPolicyExist(bytes32)", +"acb10351": "setupDutchExchange(address,address,address,address,address,uint256,uint256)", +"acb1516f": "accreditationMember(address,address)", +"acb1e61f": "transferable(address)", +"acb2ad6f": "transferFee()", +"acb2d607": "TokenBet(address)", +"acb2fe3e": "checkBlackListAddress(address)", +"acb39d30": "tokenCreated()", +"acb3c073": "setSwap(address)", +"acb461df": "tavern(uint256)", +"acb5e570": "DepositClaimed(uint256,address,uint256)", +"acb62d7c": "clearConfig()", +"acb6a6aa": "_generateRandomNumber(bytes32,uint256)", +"acb6c69b": "setTrustedClient(address)", +"acb6ca94": "Nomid()", +"acb6e626": "ImageCoin(uint256,string,string)", +"acb6e9b1": "testControlItemStoreNotRegistered()", +"acb6f75c": "PreIco(uint256,address,uint256)", +"acb748e9": "RuletkaTestIo()", +"acb74e73": "canSaleInfo()", +"acb8726a": "distributeTax(uint256,uint256,uint256,uint256)", +"acb88986": "freeze(address,uint64)", +"acb894d2": "fint256(int256)", +"acb902f6": "secondHighestBid()", +"acb93f36": "ratePerHourInWei()", +"acb9656c": "setLockedTokens(address)", +"acb9d6f6": "getStageandPrice()", +"acbaed04": "TootyrTokenSale()", +"acbb471f": "EthermiumAffiliates(address)", +"acbb5759": "SetAction(address,uint256)", +"acbc272b": "newToken(string,string,uint256)", +"acbc3ff4": "keyFoundation()", +"acbc62ae": "TokitDeployer(address,address)", +"acbcabc0": "pantryT()", +"acbd9563": "buyPatent(uint16)", +"acbdb084": "RequirementChanged(uint256)", +"acbdb72c": "getSecondAdmin()", +"acbdea6c": "canUpdateBackWindowAdjustmentRatio()", +"acbe274d": "this_tablet_name()", +"acbf98a7": "endsWith()", +"acbfbaac": "getPOOL_edit_30()", +"acbfbd9e": "Unlock_Tokens(address)", +"acc02119": "DirectDemocracy()", +"acc05ccc": "AddressProxy()", +"acc0a246": "uint256At(bytes,uint256)", +"acc10f11": "collect(address,uint256,uint256)", +"acc12168": "on_block()", +"acc2508b": "payoutNow()", +"acc32da3": "validateIpfsDoc(address,uint256,bytes)", +"acc3b363": "ContractBHVC()", +"acc3c020": "investorsToWithdrawIter(uint256)", +"acc3e283": "test_insert_empty()", +"acc3e5d9": "deathFactor_ii()", +"acc58d24": "_removeStackholder(address)", +"acc5a0dc": "GetPrize()", +"acc68b2c": "usersRef(address)", +"acc69261": "addCompany(address,uint256)", +"acc79f74": "openMail(uint256)", +"acc7f8a8": "getCurrentDatetime()", +"acc823f8": "getSurname()", +"acc88c0d": "decayedBalanceOf(address,address)", +"acc8cb18": "pushTerm(string)", +"acc907a9": "getWinner(address,uint256)", +"acc9138e": "revealBid(bytes32)", +"acc9383a": "dist_privateSale(address,uint256)", +"acc93c9e": "setBonusThresholds(uint256[],uint256[])", +"acc99bb7": "allUnKycedEth()", +"acca2c24": "getFirmFromAuthority(address)", +"acca92e0": "finalize(uint32,bytes32)", +"accb2677": "createCarsTokens()", +"accb4219": "RISHABHToken(address,address)", +"accbdfd0": "IsDistribRunningFalg_()", +"accc4a61": "setPresaleOpeningClosingTime(uint256,uint256)", +"accd932b": "icoClosedManually()", +"accd962b": "tokensaleContributors(uint256)", +"acce4b10": "crowdsaleTargetReached()", +"accf80a4": "RelaunchedCrowdsale(address,address,uint256,uint256,uint256,uint256)", +"accf878a": "ActionPresell(address)", +"accfa48b": "changeRelease18m(address)", +"accfaeba": "LEGAL_EXPENSES_1_TOKENS()", +"acd00a5c": "fillAmount()", +"acd00dc1": "_emitCountryCodeChanged(uint256,uint256,uint256)", +"acd02c30": "disburseToken(address,address[],uint256[])", +"acd04c4c": "_setVersion(uint256)", +"acd105d1": "doomsday()", +"acd19170": "getarg_2()", +"acd1bdb4": "updateMinimumContribution(uint256)", +"acd256db": "setOraclizeBytes(uint256)", +"acd2988c": "setValidBwMarketCaller(address)", +"acd2e875": "refferedBy(address)", +"acd3057a": "jishituihuan(address,uint256)", +"acd3c39f": "frozenAccount(address,bool)", +"acd47b3a": "addAuditOrEvidence(bool,bytes32,uint256,bytes32,uint8,bytes32,bytes32)", +"acd47bc3": "COMMUNITY_BOUNTY_STAKE()", +"acd47e97": "TokenPurchase(address,address,uint256,uint256,bool)", +"acd485fe": "Balicoin()", +"acd4bca6": "vanbexTeamSupply()", +"acd4e110": "Amorcoin()", +"acd4e4aa": "SilverFiftyToken()", +"acd590d3": "preSale2Finished()", +"acd5b7b9": "stopAt()", +"acd5fb23": "isZero(int256,string)", +"acd6a40a": "testUntil()", +"acd6f096": "testThrowsIfSaleIsNotTokenController()", +"acd782b1": "setProtectionPrice(uint256)", +"acd78e3a": "getPayIdAndHeld(uint256)", +"acd84e24": "PLN()", +"acd9277f": "market_DeclareForSale(uint256,uint256)", +"acd94ccb": "frozenDaysForICO()", +"acd9930b": "setHoverText(uint256[2])", +"acd9fd65": "fun1(uint256)", +"acda01f6": "setPendingWalletFee(address,uint256)", +"acda28a1": "bacFund()", +"acda3e10": "UpdateEtherPriceNow()", +"acda6737": "TADPOLE_BOOST()", +"acdaa0d2": "payout(uint256[],address[],uint256[])", +"acdba7c2": "contract_num()", +"acdba91f": "setTokenExpectedFee(address,uint256,address)", +"acdc42f3": "failICO()", +"acdd1454": "mint(uint256,string,string,string)", +"acdd9c5c": "SetRegistrationContract(address)", +"acddb63c": "requestMortgage(uint256[6],string,uint256,uint8,bytes32,bytes32)", +"acddbe1c": "someFunction3()", +"acde39d9": "c4cfee()", +"acdeb5b9": "tokenApprovals(uint256)", +"acdec908": "getBetIdAtRound(uint256,uint256)", +"acdf4f18": "buyBack()", +"acdf67b3": "blockWithdrawBegin()", +"acdf7362": "setLock(address,address,uint256,uint256)", +"acdfa0ac": "acceptNameTranfer()", +"acdfb350": "hariKari()", +"ace1ed07": "get_creator()", +"ace1fab1": "withdrawReserve()", +"ace237f5": "pep()", +"ace30883": "absMinFee()", +"ace36da2": "setChain(address,address,address)", +"ace4283b": "getSecondsToExpiration()", +"ace45552": "endICOStage6()", +"ace51abc": "helperVerifyHash__(uint256,int256,int256[],int256,uint256,int256,int256[],int256)", +"ace523c4": "createReferendum(string,string,uint256,uint256)", +"ace80e0d": "bytesMemoryArray()", +"aceaa365": "_creditTo(address,uint256)", +"aceb87e1": "getUserBio(string)", +"acec0e1d": "setconf(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"acec338a": "setActive(bool)", +"acec460f": "tokenDataValue(uint256,uint256)", +"acec488d": "setAnnouncement(string)", +"aced1661": "keeper()", +"aced5935": "getConfig(address,string)", +"acedc33e": "setDecrementOpenInterest(bool)", +"acee57e1": "airDropPayableMoney()", +"aceecbc8": "disableSelling()", +"acef193e": "FundingCompleted(uint256,uint256)", +"acef6037": "transferToAddress(address,uint256)", +"acefb7bd": "JudgmentCoin()", +"acefd330": "createRandomNumber(uint256)", +"acf0dd57": "getRegionUrl(uint256)", +"acf197b1": "IcoRunnedManually()", +"acf1b06a": "systemCreatedCount()", +"acf1e9fa": "buyNinja(address)", +"acf2f478": "changeTradableFciInSession(bool)", +"acf3508e": "_isLatitude(int256)", +"acf36037": "getCountryData(uint256)", +"acf36e53": "addParent(address)", +"acf372ef": "SetMasterWallet(address)", +"acf400b2": "getSellOrdersBlackMarketComplete()", +"acf4280c": "buildDSApprovalDB()", +"acf50f55": "setItemForSale(uint256,uint256)", +"acf555b8": "regReferrers(address[])", +"acf5c689": "setRequiredBlockConfirmations(uint256)", +"acf5cfbf": "Spend(uint64,address,string)", +"acf67746": "getPlayerTeam(address)", +"acf6d918": "ChangeReturn(address,uint256)", +"acf7aea7": "getCountryLimit(uint256)", +"acf7c1d2": "updateJackpotBalance()", +"acf8bf2a": "channelCount()", +"acf94ed5": "fallbackTriggered()", +"acf975d6": "addCycleAddress(address)", +"acf97a65": "redistribute(address[])", +"acfabbe4": "updateCurrentPeriod()", +"acfb153d": "RoundTime()", +"acfb208b": "transferFee(uint16,uint64,address)", +"acfb2d95": "iHaveABiggerDick(string,string)", +"acfb4b26": "DIVIUMx2()", +"acfd18c6": "FOUNDATION_ADDRESS()", +"acfd35a0": "distributeSuccessfulCampaignEth(uint256)", +"acfd82f2": "grantOwnership(address)", +"acfdfd1c": "deploy(uint256,string,string,address)", +"acfe27d7": "Slashing(address,uint256,bytes32)", +"acfe711a": "Scientific()", +"acff2fce": "forceNSFW(uint256,bool)", +"acfff377": "rollDice(uint256)", +"ad00129e": "bonusOver100ETH()", +"ad00297a": "payDeposit(address,uint256,bytes)", +"ad003aeb": "setUserNotifications(address,address,bool[],bool,uint8[],uint8)", +"ad009062": "newVitaReward(address)", +"ad0096af": "transferFromWithCustomReserving(address,address,uint256,uint256)", +"ad01ed4c": "s3(bytes1)", +"ad0212df": "capitalNeeded()", +"ad0254a6": "BitGuildWhitelist()", +"ad03261e": "supportRebalance()", +"ad03abc5": "enableRealCap(uint256,uint256)", +"ad044f49": "totalFunded()", +"ad04592e": "owner_deposit()", +"ad04d74d": "buyCoreWithBalance(address,address,uint256)", +"ad0570c7": "setUsernameForAddress(bytes32,address)", +"ad07008f": "icoDiscountPercentageLevel2()", +"ad07220f": "forceTransferBalance(address,address,uint256)", +"ad075684": "TotalPayment()", +"ad0767bd": "RECORDPart()", +"ad076994": "verify(address,address,uint256)", +"ad076bfc": "debug_hash256Double_concat(bytes,bytes,bytes)", +"ad09019d": "oraclize_getNetworkName()", +"ad09202a": "confirmDealCompletionByDoctor(bytes16,bool)", +"ad093409": "getTicketOwner(uint256)", +"ad0a58c8": "checkAndDeclareWinner(uint32)", +"ad0a6cc3": "attackTileForExistingUser(uint16,uint256,bool)", +"ad0af8c8": "MariamTestCoin()", +"ad0b2bec": "redeemWinnings()", +"ad0b38a2": "getAppId(string)", +"ad0b6013": "DEFAULTED_STATUS()", +"ad0bc739": "testConcatMemoryZeroLength()", +"ad0be174": "zHQNumber()", +"ad0c3dff": "icoStartedAt()", +"ad0d3713": "getTittyOwner(uint256)", +"ad0d4c3d": "HaiWang(uint256,string,string)", +"ad0dd79f": "usersWithdrew()", +"ad0e053b": "getPointerOwner(uint8)", +"ad0e13bb": "toB32(bytes,bytes,address)", +"ad0e8bc7": "givepoints(address,uint256)", +"ad0e9053": "set_pauseReturn(bool)", +"ad0f2916": "coinPrice()", +"ad108280": "BECTStandardToken(uint256,string,uint8,string)", +"ad1088e4": "didProve()", +"ad111feb": "DFSToken()", +"ad11cc1d": "claimC1()", +"ad11fe44": "revokeAllowance(address)", +"ad121e33": "fundFounder()", +"ad1288c8": "forkTransferFrom(address,address,address,address,uint256)", +"ad12cc0b": "removeLibrarian(address,address)", +"ad13eb02": "createScanner(uint256)", +"ad150aec": "calculateHeldTokenDistribution()", +"ad156d34": "AllocateBountyAndEcosystemTokens(address)", +"ad166aae": "MyTest(uint256,string,uint8,string)", +"ad180328": "_check(address,address,uint256)", +"ad188be0": "userBetContribution(address)", +"ad1892b2": "sendEthersToRefundAddress(address)", +"ad1896db": "resetElectionPeriod()", +"ad18ad0c": "quote(address,uint256,address)", +"ad1922b0": "setIcoCloseTime(uint256)", +"ad19bd26": "getVoteCommit(uint256,address)", +"ad19e993": "_callSender(bytes32,address,address,address,uint256,bytes,bytes)", +"ad1a17b4": "getPaymentCount(uint256)", +"ad1a38be": "_createNarco(string,string,address)", +"ad1a7d0c": "getBook(bytes32)", +"ad1aa252": "withdrawUnsentTokensForOwner()", +"ad1b1f8b": "settleJackpot()", +"ad1b3909": "coinage()", +"ad1be7c1": "softCapClose()", +"ad1c582a": "divUIntValue(bytes32,uint256)", +"ad1c5d6c": "updateShareCrystal()", +"ad1c61fd": "test(uint256,string)", +"ad1d0dcf": "exodus()", +"ad1def42": "registeredAddress(address)", +"ad1ef61e": "donkeyInvested(address)", +"ad203bd4": "subMonths(uint256,uint256)", +"ad207feb": "ethTeamWallet()", +"ad217ae5": "stats(uint256)", +"ad220cf1": "currentPrivateSale()", +"ad221195": "transferTokenFrom(address,address,uint256)", +"ad221321": "withdrawTimes(address)", +"ad22453c": "BRANDS()", +"ad226122": "presaleFallBack(uint256)", +"ad22980a": "TopChainCoinMintFinished()", +"ad22ccc0": "committeeJoinVoters(address,address)", +"ad22d4a2": "get_last_item_in_state(bytes32)", +"ad2334a0": "spinnerModulus()", +"ad2377c1": "pausePriceRaise()", +"ad23ad92": "AfriHealthCoin()", +"ad23de63": "isAddressWhiteListed(address)", +"ad23e038": "HelloToken(uint256,string,uint8,string)", +"ad23fdc3": "deCompose(string)", +"ad23fde0": "breed(uint256[2],uint256[2],uint256)", +"ad247dd9": "permissonedAccounts(address)", +"ad24d512": "TECHNOBITToken()", +"ad25ce57": "bidOnSaleAuction(uint256)", +"ad266df8": "ARA(uint256,string,uint8,string)", +"ad26f6e1": "SetParticipantName(address,address,string)", +"ad27b14d": "cancelBet(bytes16)", +"ad28ff88": "blacklist(address,address)", +"ad295b26": "getDepositInstanceCount()", +"ad29ca6d": "eosCrowdsaleAddress()", +"ad29ddaa": "removeRound(uint256)", +"ad2a0a7b": "_changeEternalStorageContractAddress(address)", +"ad2a39d6": "secondStartTime()", +"ad2a9c5f": "MIN_CARD_PRICE()", +"ad2af501": "Games(uint256,string,uint8,string)", +"ad2b14d1": "changeCrowdsale(address)", +"ad2b1e03": "privilegedBurn(uint256)", +"ad2b260a": "decimalNum()", +"ad2b3037": "getLeaves()", +"ad2ba325": "splitStr2Int(string,string)", +"ad2bb1b3": "blockAddress(address)", +"ad2bbf9c": "_redeemByTranche(bytes32,address,address,uint256,bytes,bytes)", +"ad2c1632": "ArenaplayToken()", +"ad2d10b2": "initializeReservedVault(address)", +"ad2da239": "calculateVote(uint256,uint256,uint256)", +"ad2daa48": "roundTimeRemaining()", +"ad2de16d": "acceptTxTask(uint256)", +"ad2e1d49": "getHeirachy(bytes32)", +"ad2e6aff": "WithdrawEarnings()", +"ad2e8c9b": "getDuration()", +"ad2ec740": "PRICE_9()", +"ad2fad33": "setSpawnProxy(uint32,int256,address)", +"ad2fea7c": "removeMinter(int256,address)", +"ad317c23": "mileagePointPrice()", +"ad319bab": "TokenERC20AC(uint256,string,string)", +"ad31e845": "_tag(uint256,string)", +"ad3286fc": "AddToken(address,uint8)", +"ad32a40f": "Fund(address,address,address,address,address)", +"ad32f925": "makeAvailable()", +"ad3335b5": "setINNBCTokenAddress(address)", +"ad33513f": "refundAmount()", +"ad33e21d": "getReferralBonus(uint256)", +"ad3429be": "developmentTokens()", +"ad344465": "AccessorySeriesCollection(uint8)", +"ad344bbe": "sgtExchanger()", +"ad35bdb0": "extraSupply()", +"ad35dcd3": "AGAVE(string,string)", +"ad36c593": "getOwnerOfCampaign(bytes32)", +"ad3704c5": "getApplicantsLength()", +"ad374f5b": "enableClaimTokens(bool)", +"ad376113": "addDevReward(uint256)", +"ad379089": "canSettle(bytes32)", +"ad37c41b": "blackListEnabled()", +"ad381cb7": "getCurrentRoundIsActive()", +"ad38867e": "checkWinner()", +"ad388896": "setWinnerAndEndEvent(bytes32,bool,string)", +"ad389d5d": "isValidAdversary(uint8,uint8)", +"ad38bf22": "updateBlacklister(address)", +"ad38d6f1": "whitelistWallet()", +"ad38fba5": "transferEthTo(address,uint256)", +"ad395939": "withdrawContributorPot()", +"ad395ad3": "removeFromContractIDArray(address)", +"ad3a05ca": "BlackToken()", +"ad3b1b47": "withdrawFees(address,uint256)", +"ad3bf1f1": "refundPeriodOver()", +"ad3c0b9d": "CROWDSALE_DURATION()", +"ad3c8b22": "addSkipPrice(uint256)", +"ad3c901c": "getPendingById(uint256)", +"ad3cd883": "changeContractName(string)", +"ad3cf852": "redeemLuckPool()", +"ad3de14c": "getMap()", +"ad3e0ed2": "getAffiliateSenderPosAmount(uint256)", +"ad3eb71f": "plcrFactory()", +"ad3ef46d": "RealstateOceanProject1(address)", +"ad3f972e": "deleteChild(address,address)", +"ad3ff3c1": "houseAlwaysWins()", +"ad401842": "setDateMainStart(uint256)", +"ad40256f": "reclaimableOwner()", +"ad418e66": "strategicReserveSupply()", +"ad41b628": "MHCToken()", +"ad447a19": "getBalanceDB()", +"ad449198": "returnBorrower(uint256)", +"ad4493fe": "checkPoint(uint8,int256,uint16)", +"ad44c205": "Nudge()", +"ad44e73b": "unwhitelist(address[])", +"ad450b72": "SupplyLimitChanged(uint256,uint256)", +"ad452254": "BsToken_SNOV()", +"ad459a1c": "CurrentAirdropped()", +"ad468489": "register(bytes32,address,bytes32,bytes32,bytes32)", +"ad470886": "token_approve(address,address,uint256)", +"ad4749f4": "setupPeriodForFirstStep(uint256,uint256)", +"ad474b9a": "Engraved(address,string,string,bytes32)", +"ad475113": "PRESALE_BONUS_VOTING()", +"ad478dda": "investmentUpperBounds()", +"ad483188": "setCCH_edit_12(string)", +"ad48636a": "secondBonusSalesEnds()", +"ad487790": "reveal(bytes32,address)", +"ad487f3c": "LogFreeze()", +"ad48d611": "marketToken()", +"ad4946ee": "removeAddressFromNonzeroBalancesArray(uint256,address)", +"ad498ce1": "RATE_NO_DISCOUNT()", +"ad49f595": "checkAddress(address,address)", +"ad4a7bd9": "lockTokensForAs(address,address,address,address,address,address,address,address,address)", +"ad4ac3de": "LoveCoin()", +"ad4b243b": "buyOneMinuteLottery(uint256,uint8[],address,bool)", +"ad4b2ca4": "batchdrop(address[],uint256[])", +"ad4b558c": "monsterIndexToOwner(uint256)", +"ad4c05f1": "setResourceForStar(uint8[5],uint16[5],uint32[5])", +"ad4cd0d6": "stdlib()", +"ad4dde0f": "transferOwnershipOfItemsStorage(address)", +"ad4e2f77": "addDragon(address,uint256,uint256)", +"ad4e39f3": "getLendingItemInfo(address,uint256)", +"ad4f0e3a": "DevsmartCoinFive()", +"ad50039f": "setTechBonus2(uint256,string)", +"ad5022a5": "Votes()", +"ad506098": "WowMusicDiamondToken(address)", +"ad509c1d": "sendToken(address[],address[],uint256[])", +"ad50dd1f": "endPrivateSaleStage()", +"ad53322b": "donationAmountInWei(address)", +"ad534d9c": "logCoinAgeRecord(address,address,uint256,bool)", +"ad53be1d": "priceLeRT()", +"ad544dcb": "testSetNotUpdatable()", +"ad549e53": "set_participant_arbits_kyc_whitelist(address,bool)", +"ad5511a5": "_setTokenSeed(uint256,string)", +"ad559fd6": "setHigherPricePercentage(uint256)", +"ad562965": "getReceiptRoot(bytes32)", +"ad5632e6": "storeAuthenticity(string)", +"ad5688d8": "setCountryPicture(uint256,string)", +"ad5780af": "clearDNSZone(bytes32)", +"ad57a2df": "unrestrict()", +"ad57ceb4": "ethForMilestone()", +"ad58a7d2": "getSettingState(uint256)", +"ad59ffd1": "maxAmountBonus()", +"ad5a157d": "promoMoney()", +"ad5a8f29": "canEnterPool(address,uint256)", +"ad5b7189": "hasBooster(address)", +"ad5b896e": "refundMany(address[],uint256[])", +"ad5bfcb5": "getServiceStatByAddr(uint64,address)", +"ad5c1687": "offchainUpload(address[],uint256[])", +"ad5c4648": "WETH()", +"ad5c613d": "purchase(bytes)", +"ad5cd9e7": "startSTO()", +"ad5d2862": "getWinnings(uint256)", +"ad5d638d": "minFundedValue()", +"ad5dabb0": "assertYoungerBalance(uint256,uint256)", +"ad5dabca": "QatarCoin()", +"ad5e2cd0": "addPresale(address,uint256)", +"ad5e46cb": "hasError()", +"ad5f3433": "sumHardCapICOStage4()", +"ad5fb2b1": "seedVerification(string)", +"ad60540b": "MoccaCoin()", +"ad605729": "getParticipantCount()", +"ad606c72": "devWithdraw()", +"ad60fb73": "mint(string,uint8,string)", +"ad615f40": "getCrosCounter()", +"ad621b14": "BaoMaToken()", +"ad622d0e": "addDoctors(uint256,uint256,string)", +"ad62bda5": "setRoundLength(uint32)", +"ad62f1ca": "mintFor(uint256,address)", +"ad631abe": "BLO_PER_WEI()", +"ad63a469": "totalUsedTokens()", +"ad64ae4b": "registerModule(address)", +"ad64fa5c": "MINBET_forORACLIZE()", +"ad652cdd": "InternetMarket()", +"ad655998": "addAuthorizedInsertAgent(address)", +"ad65d76d": "ethToTokenTransferInput(uint256,uint256,address)", +"ad66de24": "impl_lock4Dividend(address,uint256)", +"ad66e52a": "etherBalance()", +"ad677d0b": "join(bytes32)", +"ad686011": "returnPurchase(address)", +"ad68ebf7": "migrate(address,uint256)", +"ad69644b": "setBestAngel(uint32)", +"ad69caa5": "expMod(uint256,uint256,uint256)", +"ad6a0546": "creatorsLocked()", +"ad6ad449": "HodlerMining()", +"ad6aefbb": "BeatTokenPreIcoStarted()", +"ad6b2c90": "getListTokens(address,uint256,uint256,uint256)", +"ad6b5d04": "amountClaimed()", +"ad6b9499": "getContactRecord(string)", +"ad6c8762": "paymentChannelsCount()", +"ad6cd14e": "EthLongExercised(address[2],uint256[8],uint256,uint256)", +"ad6d9b89": "bytetherOVAddress()", +"ad6dfe5c": "getPRewardId(address,uint256)", +"ad6e155e": "setContractPreICO(address)", +"ad6eba9f": "getSingleSubjectByAddress(address,uint256)", +"ad6eff22": "getUserType(address,address)", +"ad6f80ff": "getSignatures()", +"ad70810a": "getChainDrawings(uint256)", +"ad70924a": "stablize()", +"ad70fbc8": "QuickChain()", +"ad714012": "calculateMatchOutcomesForRoundId(int256)", +"ad71766e": "getWeiSoldToday(address)", +"ad717e8c": "_oraclizeQueueRound()", +"ad71a1fd": "MAX_SUPPLY_OF_TOKEN()", +"ad71c687": "registerSystem(string,string,string,string)", +"ad71ec8a": "YiWenTest(uint256,string,string)", +"ad7222c1": "tokensAmountFrom(uint256)", +"ad723faa": "MChip()", +"ad72dce9": "buildFactory(uint8,uint256)", +"ad731de7": "createPromoCollectible(uint256,address,uint256)", +"ad732eea": "send(bytes20[])", +"ad738845": "payVATToGovernment(uint256,uint8)", +"ad7411e1": "CreateNertia(address,uint256)", +"ad7430cc": "RECEIVER()", +"ad74f9bc": "calculateCurrentPrice(uint256)", +"ad7554d9": "setDoubleRewardEndTime(uint64)", +"ad76325f": "finishProposalVoting(uint256)", +"ad7639fe": "TokenPurchase(address,address,uint256,uint256,string)", +"ad76423e": "DelphiToken()", +"ad764780": "OpenController(address)", +"ad7738b6": "MAX_TOTAL_ADOPTED_AXIES()", +"ad78dc8e": "totalWannaBuyAmount()", +"ad78f31a": "ticketStringFromAddressBytes(bytes32,address)", +"ad796b5d": "TOKEN_SUPPLY_AIR()", +"ad79c927": "TokenSwap(address,address,address)", +"ad7a14e1": "tokenRemainPublicSale()", +"ad7a5ff9": "autoDistributionViaETHContributions()", +"ad7a672f": "totalBalance()", +"ad7b09c5": "InitIcoController(address)", +"ad7b6884": "editContributors(address[],uint256[],uint256[])", +"ad7b6cb5": "bountySEEDSinWei(address[],uint256)", +"ad7bafc7": "mint(int256,address,uint256,uint256)", +"ad7bfd2d": "Cashchain()", +"ad7c66d0": "sellAllMilk()", +"ad7d59fc": "checkPlace()", +"ad7df080": "consul()", +"ad7e01c8": "wolkGenesis(uint256,uint256,uint256,address,address)", +"ad7e262c": "hasEmployerMinRatingsCount(address,address,uint256)", +"ad7e74f9": "addJobSkill(uint32,bytes32)", +"ad7e7cfc": "UpdateMaintenance(bool)", +"ad7ead58": "walletLock()", +"ad7eb560": "block5()", +"ad7ed3c2": "executeLottery(address)", +"ad7ed923": "ElepigToken()", +"ad7eee9f": "updateInt256s(bytes32[],int256[])", +"ad7f02b5": "balanceOf(address[16],address)", +"ad7f401b": "creatorInited()", +"ad7f9d76": "getInvestorBuyers()", +"ad7fa43c": "settleFeeSecondPart(address,uint256)", +"ad7fadc5": "buy(address,address)", +"ad7fff7c": "hasWorks(bytes32)", +"ad8088a5": "XdacToken()", +"ad80a7b4": "totalUndistributedDividends()", +"ad80ef94": "tokenExchanges(uint256)", +"ad810fe5": "holderIndex(uint256)", +"ad818071": "showStats()", +"ad81cd90": "villagesSold()", +"ad81d6f3": "createDefaultLinglongCat(uint256,uint256,uint256,address,uint256,uint256)", +"ad81f3be": "Barneys4HackerSpaceToken()", +"ad82ae61": "internalDoubleTransfer(address,address,uint256,address,uint256)", +"ad82dcac": "testBlockhashCorrectFee()", +"ad838107": "_checkDestination(address,address,uint256,bytes)", +"ad83bfce": "GetOwner(string)", +"ad845d2d": "toBytes()", +"ad84e1be": "createTokenContract(address)", +"ad84e2a6": "getCrab(uint256)", +"ad84eaab": "minimumPurchaseAmount()", +"ad869e1a": "_batch3_icosaleEndTimestamp()", +"ad86c10d": "GamingCoin(string,string,uint8)", +"ad86ee0b": "passOnContract()", +"ad8718c2": "Create(uint256,uint256,uint32)", +"ad8733ca": "multisend(address,address[],uint256[])", +"ad879a46": "cancelBetByA(uint256)", +"ad886326": "_isSignedOwner(bytes32)", +"ad889f03": "USER_TIMEOUT()", +"ad88d8a5": "try_pay(address,bytes12)", +"ad88f53e": "setFirstStageEndsAt(uint256)", +"ad89e64b": "_updateLandData(int256,int256,string)", +"ad8a9c8e": "ownerSetOwner(address)", +"ad8ae3ae": "poke(address,bytes32)", +"ad8b4698": "COMETUBU()", +"ad8b6657": "_createDrone(address,uint256,bool,bool)", +"ad8c3cd2": "setTank(address)", +"ad8ce06b": "gasPerTx(bytes4)", +"ad8d36cb": "CCH_EDIT_2()", +"ad8d5f48": "exec(address,bytes,uint256)", +"ad8ead69": "createTeam(string,uint256)", +"ad8ed335": "__proxy(address)", +"ad8f5008": "strike()", +"ad8f905d": "PoolPrize(uint8,uint8,uint256,uint256)", +"ad8fccf3": "freezeMulti(address[],bytes32[],uint256[],uint256[],uint256[])", +"ad906661": "add_to_ico()", +"ad913633": "getOriginalOwner()", +"ad9171df": "getRemainingLimit(address,address)", +"ad92e46c": "getNumBettings()", +"ad93640f": "TRANSFER_PROXY_V2()", +"ad94d901": "ownsAll(address,uint256[])", +"ad9657f4": "createCoin(uint16,string)", +"ad966a03": "_bytes32ToString(bytes32)", +"ad973d74": "addCustomer(address)", +"ad976c3e": "setData_24(string)", +"ad979417": "setPoolName(string,uint256)", +"ad98ebaf": "ProjectManager()", +"ad994621": "answerDeliveryChallenge(address[2],uint64,bytes32[],uint256[],uint256[2],uint256[2],uint256,bytes32[3],uint8,bytes32[])", +"ad9a9f17": "SINGLE_BLOCK_LEN()", +"ad9abf32": "payDividends(uint256,uint256,uint256)", +"ad9ac1bc": "addToAllocationList(address,uint256)", +"ad9b4fc5": "Win(address,uint8,uint256,bytes32,bytes32,uint256,uint256)", +"ad9b8024": "price(address,uint256)", +"ad9bdebb": "isReleasable()", +"ad9c280f": "setLoveUrl(string)", +"ad9d4ba3": "depositEth(address)", +"ad9df055": "adminClaimAirdrop(address)", +"ad9e3e85": "My2Token()", +"ad9ec17e": "setGreyToken()", +"ad9f20a6": "MIN_PRICE()", +"ad9f9a68": "withdraw_unclaimed_balance(uint256)", +"ad9fb75e": "teamDate()", +"ada0114c": "Firstsale()", +"ada018e1": "setBurnFeeAbs(uint256)", +"ada0618a": "CATSPACE()", +"ada06dac": "tokenSaleCosts()", +"ada14698": "killSwitch()", +"ada199dd": "setFoundersTokensPercent(uint256)", +"ada1a34b": "resetVoteKindnessEvery()", +"ada1a8f7": "VUP_PER_ETH_ICO_TIER2_RATE()", +"ada1b74e": "finalTokensIssueTime()", +"ada1f3ad": "ReferralContract(address,address,address)", +"ada24dfc": "KeberuntunganAcak()", +"ada2cced": "getNumberSuppliers()", +"ada44092": "addClient(bytes32)", +"ada4c022": "getAvailableWinnings(address,address)", +"ada5ba01": "getNodeIndexId(bytes32)", +"ada5cf63": "initializedBlock()", +"ada636ce": "compareStages(string,string)", +"ada65728": "Funding_Setting_funding_time_end()", +"ada69935": "PonicsToken(string,string,uint8,uint256)", +"ada6b1d9": "collectedCent()", +"ada6e537": "AuctusBountyDistribution()", +"ada7061b": "add_hard_limit(uint256)", +"ada791f9": "Airdrop(address,uint256,uint256,address)", +"ada8938f": "moedaToken()", +"ada8a7d5": "presaleTotalNumberTokenSold()", +"ada8cfcd": "removeUint256s(bytes32[])", +"ada8e5ef": "IsCanAllotAward()", +"ada993ad": "Airdrop(address,uint256,uint256)", +"adaa19cc": "TGMtoken()", +"adaa3c73": "enableBets()", +"adaa730e": "RollDice(address,uint256,uint256,uint256)", +"adaaa1e1": "addThing(bytes32,string,bytes32,string)", +"adaabaaa": "bonusEndDate()", +"adabc7f8": "changeTransferStep(uint8)", +"adacb0fa": "CloseChannel(bytes32,uint8,bytes32,bytes32,uint256)", +"adaccd74": "getNickname(address)", +"adad1cb1": "VisperNetwork()", +"adad4873": "distributePresale(address[],uint256[])", +"adad6d50": "KujiraFund()", +"adad9c4e": "increaseMaxCap(uint256)", +"adadb11f": "setJotter(address)", +"adadc77f": "unown()", +"adae08dd": "createItem(uint256,uint256)", +"adaea0b9": "fund(address,address,bool)", +"adaf28d1": "whichPeriod(address,uint256)", +"adaf7c84": "PreICOStartTime()", +"adaf8c79": "chargeOn(address,uint256)", +"adb187bb": "validRequest(bytes32[],bytes5,address)", +"adb1ad42": "HelloGoldToken(address)", +"adb1cd73": "getUnpaid()", +"adb1f640": "getScore(uint256,bytes32)", +"adb27ded": "tokenBonusTimes(uint256)", +"adb2e02f": "internalRegisterCert(bytes32,bytes,uint256)", +"adb37277": "setWebsiteUrl(string)", +"adb3a3a6": "deadlineToFreedTeamPool()", +"adb42139": "totalCrowdsale()", +"adb44a32": "updateUint256(bytes32,uint256)", +"adb4af3e": "getLatestUpdate()", +"adb4d990": "assigned()", +"adb506a6": "FACTOR_5()", +"adb5735c": "withdrawFor(address,address)", +"adb5777c": "getDrawBlockNumberByWinner(address)", +"adb5a4f1": "ListReservePairs(address,address,address,bool)", +"adb5a54d": "eccVerify(bytes32,uint8,bytes32,bytes32)", +"adb5da34": "_getClientPaidUpTo(address)", +"adb610a3": "currentNonce()", +"adb67c41": "XiongDiLianToken(address,address)", +"adb6859d": "directorTransferShareRequired()", +"adb69560": "createController()", +"adb6e8f5": "GetDislikeCount()", +"adb6f63f": "commitments(address,address)", +"adb746dc": "bltOwned()", +"adb77576": "etherLeaked(uint256)", +"adb8249e": "increaseApprovalPreSigned(bytes,address,uint256,uint256,uint256)", +"adb848df": "NZD_Omnidollar()", +"adb88cb9": "totalSupplyIco()", +"adb9066e": "COLDITION()", +"adba54e0": "commandPercent()", +"adbc9bed": "getRestWhite(uint256,uint256)", +"adbd9753": "issuingTokenOwner()", +"adbda5a8": "voteToKickoffNewFiscalYear()", +"adbde797": "updateTrustRankAfterStoryExpiry(bytes12,bytes12[])", +"adbe2f6f": "abortive(uint256)", +"adbefffe": "getAddressBetsForEvent(bytes32,address)", +"adbf29fd": "getPlayerDataForGame(uint256,address)", +"adbf54b7": "initialBalanceForMarketingCampaign()", +"adc02a64": "addAsset(string,address)", +"adc042bf": "mint(int256,uint128)", +"adc06ccd": "batchDoubleBalances(address[])", +"adc128eb": "Today()", +"adc1463a": "ZLCC()", +"adc1b956": "lastClaimed()", +"adc1db89": "SpaceKIMToken()", +"adc1f702": "LanaCharleen8()", +"adc20b1c": "lastMint(address)", +"adc23f03": "canClientTerminate(bytes32)", +"adc29028": "calcAndSetPlayerTotalCanAccept(address,uint256)", +"adc2c98a": "edge()", +"adc38b2f": "iterateTurn(uint16)", +"adc4739a": "setWLAddress(address)", +"adc4f654": "ChargeEnergy(uint256)", +"adc54d30": "transferFromPresale(address,uint256)", +"adc6d49d": "_executeTransaction(uint256,address)", +"adc73d46": "getPlayersOfOwner(address)", +"adc7d448": "_clearAttackLog(uint256)", +"adc84a42": "SVEToken()", +"adc87956": "teamVestTokenAllocation()", +"adc8b4cf": "empowerAdmin(address)", +"adc8f941": "addExclusionFromTokenUnlocks(address[])", +"adc9772e": "stake(address,uint256)", +"adca32e7": "setFiscal(uint256,uint256,uint256,bytes32)", +"adca8ac6": "addToTransferWhiteList(address,address)", +"adcaea0a": "simulated_snt(address)", +"adcb0993": "LILE()", +"adcccb6f": "Obirum()", +"adcd2632": "saleTeamAddress()", +"adcd4aaf": "sendNegativeWhuffies(address,string)", +"adcd905b": "setListener(address)", +"adcde05f": "averageKimSalePrice()", +"adce1c5f": "ensResolver()", +"adce80d5": "mStopped()", +"adcf4831": "registerAuditOutcome(address,bytes32,bool)", +"adcf59ee": "isOwnerOrOps(address)", +"adcf780a": "disallowTransferBetweenUsers()", +"add052b4": "getStateFunding()", +"add08f87": "coinbaseAmount()", +"add1cbc5": "TOKEN_TRANSFER_PROXY_CONTRACT()", +"add2af69": "releaseLockedTokensByIndex(address,uint256)", +"add37100": "getOrderHash(address,uint256,address,uint256,address,uint256,uint256,address)", +"add3bf39": "manualTransferTokensToInternal(address,uint256,uint256,uint256)", +"add3fa39": "sharing_confirmed()", +"add40ced": "getKeyID(bytes20,uint8)", +"add43c59": "EtherTopDog()", +"add466a4": "chfCentsPerTokenWhileBonus()", +"add4bfb0": "createDragon(uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint16,uint16)", +"add4c784": "getResult(bytes32)", +"add54303": "setBlock(uint256,uint256,string)", +"add5eb02": "setAdminVariables(uint256,uint256,uint256,uint256)", +"add68daf": "amountOfBidders(uint256)", +"add7690b": "period0End()", +"add769a3": "POOToken()", +"add82871": "strEqual(string,string)", +"add84df3": "changeGoal(uint256)", +"add94f25": "IDAP(address,address,address)", +"add98c70": "dispute(bytes32)", +"adda1d4d": "receiveListing(bytes32,uint256,bool,address,uint256,uint256)", +"adda8cf4": "Propvesta()", +"addace62": "getYesVotes()", +"addad094": "VLOGS()", +"addb246b": "MIN_SITE_ID()", +"addb51ff": "monsterCreator()", +"addd5099": "oracles(address)", +"addd7020": "minWei()", +"adddbacb": "tokenSellCap()", +"adde36bb": "betEven()", +"adde61ef": "_isUpdateAuthorized(address,uint256)", +"added436": "sendFromFund(uint256,address)", +"addf0813": "withdrawERC20Balance(uint256)", +"ade05b35": "commissionType()", +"ade077e3": "Ecoin()", +"ade0e93e": "withdrawals()", +"ade2f939": "lookupAllSince(uint256)", +"ade342ab": "takeShitcoin(address)", +"ade4637a": "transferFrozen()", +"ade53c4e": "GenChipsLevel(uint256,bool)", +"ade5a328": "YYXToken()", +"ade5e07d": "test_1_validOwner_accessRestriction()", +"ade60e9a": "modifyOwner()", +"ade62d6f": "withdrawCommunityFunds()", +"ade645fa": "bonusPhase2()", +"ade6e2aa": "expiryTimestamp()", +"ade716e5": "activatedArbitrationTokens(address)", +"ade7a3ad": "totalParticipationAmount()", +"ade7dd7b": "storeInvestment(address,uint256)", +"adeaa851": "getTotalPrize()", +"adeb8dec": "setLocks(address[],uint256[])", +"adeba3a5": "payWithdraw(address)", +"adebf6f2": "isFungible(uint256)", +"adec07c7": "setPriceUpdateInterval(uint256)", +"adec3a92": "totalPonziInGame()", +"adeca283": "payeeArray()", +"adedc071": "internalApprove(address,uint256,uint256)", +"adee3f4b": "getCodeType(uint256)", +"adef40db": "disputeJUR(address,uint256,uint256[])", +"adefc37b": "sub(int256,int256)", +"adefd501": "ledMultiSig()", +"adf069ea": "startsWith(string,string)", +"adf07791": "tenant()", +"adf0c351": "add_participant()", +"adf13281": "mineFor(address,bytes32)", +"adf24dec": "setDemurringFee(uint32,uint32)", +"adf272ab": "vest(address,uint256,uint256,bool)", +"adf2cead": "mint(bytes32)", +"adf2d029": "calculateAdminTxHash()", +"adf2ef99": "ReichaCOIN()", +"adf2f978": "getCurrentDragonGirlLotteryNumber()", +"adf403ad": "capitalReserveWallet()", +"adf4285d": "GovernanceAddOwner(address,address)", +"adf46a39": "createContractDank(string)", +"adf4a144": "startRefund()", +"adf4fa09": "addPurchased(address,address,uint256,uint256)", +"adf54e0c": "betOnLowHigh(bool,bool)", +"adf59f99": "query(uint256,string,string)", +"adf5d1cb": "YumeriumToken()", +"adf5e565": "verify(bytes,address,uint256,uint8,bytes,bytes)", +"adf60404": "THreeDBToken()", +"adf684ac": "ULChain(address,uint256)", +"adf6e486": "unPauseToken()", +"adf70883": "completeUnlockTime()", +"adf74fc9": "distributeELTCMedium(address[])", +"adf8a01b": "emitSkillEvaluated(address,address,uint8,uint256,uint256,uint256)", +"adf8f79d": "LOG_ContractResumed()", +"adf96752": "trade(address[13],uint256[15],uint8[2],bytes32[2],bytes32[2])", +"adf9a754": "forwardFundsToOwner()", +"adf9cd49": "totalWeiCap()", +"adf9ffea": "lockupOf(address)", +"adfa1f0c": "Pinged(string)", +"adfa820a": "deleteBlockState(bytes32)", +"adfa845a": "test_remove_notInList()", +"adfaae32": "lastMinedOn()", +"adfc36a3": "getAssembly(uint256)", +"adfceb9a": "proxyBuy(bytes32,address)", +"adfd5380": "preTgeBonus()", +"adfd7935": "setBridgeNode(address,bool)", +"adfdb75e": "setRedeemRequestLimitInterval(uint256)", +"adfdc12f": "createNewGame(string,string,string,uint256)", +"adfe1190": "components(uint16)", +"adfe6b80": "InvestAdd()", +"adfec5f5": "buy(bytes8)", +"adff2450": "getOuverture_effective()", +"adff5f36": "PanamavsTunisia()", +"adffe4db": "setFundingRules(address,bool,uint256,uint256,uint256,uint256,uint256)", +"adfff41d": "m_Data(address,uint256,uint256)", +"ae0041aa": "signalCount()", +"ae005a87": "ERC777DemoToken(string,string,uint256,uint256,uint8)", +"ae012367": "withdrawTopForTeam(address,uint256)", +"ae014f1d": "getUserNameByWallet(address)", +"ae01a8fb": "toCloseVote()", +"ae01ab47": "setFracoinAuction()", +"ae01c14f": "SendBid()", +"ae01dd06": "noteDesignatedReport()", +"ae01ed8a": "manualWithdrawalFallback(address,uint256)", +"ae024c40": "isTopic(bytes15)", +"ae0250c1": "showPoolNumber(address,address)", +"ae025faa": "newGroup()", +"ae0269aa": "VirtuePokerSale()", +"ae02ee5b": "pack(bytes,address,address,uint8,uint256)", +"ae035846": "END_TIME_SALE()", +"ae0395ad": "setFriendsFingersWallet(address)", +"ae03d6c2": "getIrisProvidersReport(bytes32,address)", +"ae03f754": "GongPanToken()", +"ae040b1d": "get_orderAddress(address,uint256,uint256,uint256)", +"ae041b90": "WRLCrowdsale()", +"ae043336": "dolRate()", +"ae04d45d": "setLockTime(uint256)", +"ae056477": "addInvestorBalance(address,uint256)", +"ae06494e": "createHNtokens(address)", +"ae065737": "tradePreToken(uint256,address,address,uint256,address)", +"ae06c1b7": "setFeePercentage(uint256)", +"ae06dbc0": "dataControlSetFeeAbsMaxGlobal(uint256)", +"ae0755d3": "popTransaction()", +"ae078036": "preICO_tokens()", +"ae08b8b3": "BUXCOINMONEYCONTRACT()", +"ae093eb7": "sendICOTokensBack(uint128)", +"ae0996fc": "getMyEOSKey()", +"ae0a6b28": "signature(string,bytes32)", +"ae0a90b2": "domain_buy_useArina()", +"ae0aba8c": "acceptPayment()", +"ae0b4edd": "cancelSellOrder(address[])", +"ae0b7bdb": "twoWeeks()", +"ae0bbe4d": "approveRecipient(address,bool)", +"ae0be41c": "periodPreITO_hardCapInWei()", +"ae0db13c": "totalBidEth()", +"ae0e5387": "networkReserveFund()", +"ae0e8725": "Checkable()", +"ae0e8f3f": "strategicLockup()", +"ae0eadbf": "isFirstStageTokensMinted()", +"ae0f6166": "subtract(int256)", +"ae101f31": "addStage(uint256,uint256,uint256,uint256)", +"ae104265": "calculatePrice(uint256)", +"ae117f3e": "getFSTBalance()", +"ae11cf73": "isVerfied()", +"ae11ea9b": "transferChild(address,address)", +"ae125f00": "mint(uint256,address,bytes32,bytes32,bytes4)", +"ae1345c4": "CharterCapital()", +"ae136d62": "firstBonusEnds()", +"ae13efe0": "batchFreeze(address[],bool)", +"ae152cf4": "oraclize_query(string,string,uint256)", +"ae154aab": "passOff()", +"ae15eb8e": "getCertificate()", +"ae1616b0": "airdropReserveWallet()", +"ae169a50": "claimReward(uint256)", +"ae180337": "withdrawBaseERC20(address)", +"ae181958": "_setNonlistedUser(address)", +"ae181f84": "passThroughTap(uint256)", +"ae188884": "sendOneEtherToMiner()", +"ae18f5ad": "issueContractAddress()", +"ae190819": "getBS(bytes32)", +"ae1a0b0c": "launchLength()", +"ae1a15e3": "PresaleFundCollector(address,uint256,uint256)", +"ae1a5611": "ratePerEthPhase2()", +"ae1a9a3e": "castToUint(int256)", +"ae1aafb9": "buyPredictForContract(address,uint8)", +"ae1adba2": "calculateStakeGains(uint256)", +"ae1b4beb": "buyFactorPromotion()", +"ae1b6405": "endICOTime()", +"ae1be1e4": "releaseLockedToken()", +"ae1c4062": "stopStage()", +"ae1c9437": "_stringsEqual(string,string)", +"ae1cad3a": "tip(address,string,uint256,string)", +"ae1d12a6": "WhyWhyToken(address)", +"ae1d3043": "teamTimeLock2()", +"ae1d4b4b": "GambleEther()", +"ae1dd78c": "sendEtherManually()", +"ae1e2096": "MAGICCOINERC20(uint256,string,string)", +"ae1e964e": "newOwnershipFeeProposal(uint256,string)", +"ae1f14ca": "mainSale_WeiRaised()", +"ae1f91b7": "updateMinMaxBetCount(uint256,uint256)", +"ae1fb61a": "TokenTransferProxy()", +"ae200c73": "joinGameTeam(bytes32,uint8)", +"ae2022c0": "getUint256Max(int256)", +"ae203146": "getAccountType(address)", +"ae2074c8": "addWhiteListAddress(address,address,uint256)", +"ae20bf15": "claimFreeEggs()", +"ae224633": "videos()", +"ae22c1be": "ShowRelease(address,uint256)", +"ae22e331": "_getCurrentSchellingRound()", +"ae248ced": "deliverETH()", +"ae249f2b": "destroyWhenRoundOver()", +"ae24e328": "tickerQueryData()", +"ae25532e": "getProxyId()", +"ae25753b": "wildcardsHeld(address,uint16)", +"ae25f630": "DownPlayerResult(string,address,uint256,uint256,uint256)", +"ae262114": "crowdSaleDragonPrice()", +"ae263730": "isOperationAllowed()", +"ae26588c": "removeTrustedContractAddress(address)", +"ae277584": "amountToSend()", +"ae27e3c6": "relu_activation(int256)", +"ae28b68c": "safeTransfer(address,uint256,uint256,bytes)", +"ae28e912": "teamTokenAmount()", +"ae2a0ce3": "JustinsToken()", +"ae2b4e16": "getBalanceInRemix(address)", +"ae2b5d3b": "_emitCountryCodeAdded(uint256,uint256,uint256)", +"ae2bd2bd": "clearAuction(address,address,uint256,uint256)", +"ae2c1506": "getRoundNumberOfBets(uint256,uint256)", +"ae2c923c": "OlympusLabsCore(address)", +"ae2cbc91": "Tradable()", +"ae2da5c5": "getLLV_edit_20()", +"ae2df7b3": "setImporterBank()", +"ae2e054c": "closeOrder(uint256,address)", +"ae2e933b": "feePool()", +"ae2f1f6f": "calculatePayerDeposit(uint256)", +"ae307098": "c_MinInvestmentInCents()", +"ae30d35d": "ARK_TROGLOg_1_00()", +"ae3125d9": "showTokenSaleClosingTime()", +"ae319f60": "_updatePurchasingState(uint256)", +"ae31deb9": "burnCrowdsale()", +"ae326221": "setSpawnProxy(uint16,address)", +"ae327322": "cantSetReferrer()", +"ae32ac7e": "TEAM_LOCK_DURATION_PART2()", +"ae32c399": "lastBlock_f1Hash_uint256()", +"ae353131": "BiquToken(uint256,string,string)", +"ae35707d": "sectionForSale(uint256)", +"ae35d21a": "CollectibleBidWithdrawn(uint256,uint256,uint256,address)", +"ae366735": "EQUIPMENT_REWARD_WALLET()", +"ae36c602": "createPromoItem(address,string,uint256)", +"ae36f6f9": "_batch4_rate()", +"ae3783d6": "relayedSet()", +"ae382baa": "GainCard(address,uint32)", +"ae39279f": "sendFee()", +"ae3b2137": "getRoomSetCount(uint256)", +"ae3b748d": "setMinCap(uint256)", +"ae3b94b2": "_minimumTokens()", +"ae3baf4d": "mintableAmount()", +"ae3c697c": "getMyAvailableWine()", +"ae3d27ed": "Token_For_Circulation()", +"ae3d5047": "_changeSymbol(string)", +"ae3d7160": "compareByte(string,string)", +"ae3d81b8": "allowedJurisdictions(bytes32)", +"ae3f4a6c": "test_3_method()", +"ae3f84f3": "proofMultiSig()", +"ae3fc899": "CheckExchange(string)", +"ae404996": "oraclize_query(string,string[3],uint256)", +"ae40f72f": "testAdd()", +"ae41480b": "importEthers(address)", +"ae422c09": "sys()", +"ae42ce85": "update_oracalize()", +"ae436b5e": "getLimitedReporterMarketsCount()", +"ae44dea2": "bytesToUInt(bytes,bytes32)", +"ae44e840": "priceConfirmedOver500()", +"ae4538ce": "walletCompanyReserve()", +"ae457835": "buyTokensFor(address,uint64,uint256,uint8,bytes32,bytes32)", +"ae457dab": "bonusEnds20()", +"ae45850b": "schedulerAddress()", +"ae458ab6": "approve(uint64,address)", +"ae466db7": "withdrawPenaltyTokens()", +"ae46e284": "setPortfolio(uint256,bytes32[],uint8[])", +"ae479a63": "badgeSymbol()", +"ae47a290": "changeMaxBet(uint256)", +"ae487dad": "reset(uint256,uint256,uint256,uint256,uint256,uint256)", +"ae49165a": "getAncestor()", +"ae49a717": "EVNT()", +"ae4a7512": "mintICOTokensFromExternal(address,uint256)", +"ae4a8c88": "claimLoot(uint256,address)", +"ae4aadbb": "showTransferConfigs()", +"ae4ab7ce": "Put_DEDI_gift(address)", +"ae4ac63e": "STANDARD_BUYIN()", +"ae4b1b5b": "proxyStorage()", +"ae4b5cb8": "collectDonations(uint256,address)", +"ae4b76fe": "_createPiranha(string,address,uint256,uint8,uint256,uint8,uint8)", +"ae4c20af": "increaseICOcap(uint256)", +"ae4c5e45": "setStarNewOwner(uint256,address)", +"ae4cc757": "closeEarlyPurchase()", +"ae4d0ff7": "gen0StartingPrice()", +"ae4d1af6": "setup(bytes32,address,address)", +"ae4d42b8": "ptxTail()", +"ae4d503b": "withdrawOtherERC20Balance(uint256,address,address)", +"ae4e7fdf": "isMature()", +"ae4eba1f": "setOldE4(address,address)", +"ae4f1198": "publicationFeeInWei()", +"ae4f1476": "searchSeed()", +"ae4fbdeb": "LastValidated()", +"ae501c75": "LogLotteryResult(uint32,uint8,bytes32,bytes)", +"ae50d660": "setFilletPrice(uint16,uint16,uint8,uint256)", +"ae5103e8": "preSaleFourthPrice()", +"ae516449": "uintCeil(uint256,uint256,uint256)", +"ae51c484": "a(bool)", +"ae51db0d": "VesaStage2PreICO()", +"ae52026f": "icoSoftCap()", +"ae529499": "CurrentARXSupplyInWei()", +"ae530504": "setSetting(string,uint256)", +"ae53d79e": "ICO_PRICE7()", +"ae5409fb": "seedInvestorsReserve()", +"ae55c888": "getData(string)", +"ae55f1af": "artWorkChangeApprove(uint256,uint256,bool)", +"ae56463e": "getPoliceReport(uint256,address)", +"ae56e668": "setUnlockAddress(address,bool)", +"ae5942cd": "deletePermissions(address[])", +"ae59bd5a": "mintManually(address,uint256)", +"ae5a1460": "NewDigitalAsset(address,address)", +"ae5a17a7": "updateCharityAddress(address)", +"ae5a4a7f": "maxBatchAssignment()", +"ae5a9bb4": "operatorTransfer(address,uint256,bytes,bytes)", +"ae5a9d17": "getCompletedTransactions()", +"ae5adac7": "mintInCurrPeriodCount()", +"ae5b2540": "setApp(bytes32,bytes32,address)", +"ae5b6d89": "submitSteak(address,bytes32)", +"ae5c1816": "CreateKittyToken(address,uint256,uint32)", +"ae5c24bd": "getFirstElement()", +"ae5c37fd": "contributionsByIntel(uint256)", +"ae5c3f14": "getVipBrokerNum()", +"ae5c75aa": "getBadgeByKtUserId(uint256)", +"ae5c888d": "month60Unlock()", +"ae5d2cbe": "_getOwnerTokenByIndex(address,uint256)", +"ae5da7a0": "_generateGame(bytes32,bytes32,address,uint256[10])", +"ae5dbd43": "view_get_ResultData()", +"ae5e6cf4": "cancelReservation(uint256)", +"ae5ec2e9": "matching()", +"ae5f502e": "RoundSubmission(uint256)", +"ae601e4d": "IADForGas()", +"ae602223": "standFeeAfter500()", +"ae610b48": "sign(int256)", +"ae61fcda": "isEthernautsStorage()", +"ae6215d8": "getBlockHeight(bytes)", +"ae622c4b": "addToInxWhitelist(address)", +"ae62fd7c": "setCrowdSale(bool)", +"ae639329": "sendTo(address,address,uint256)", +"ae63b517": "ADVISORY_BOARD_TOKENS()", +"ae640923": "playerEndGame(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address,bytes)", +"ae6439c4": "icoSaleSoftCap()", +"ae6506f9": "getCurrentTierIndex()", +"ae665d5d": "MooguToken()", +"ae66d948": "getWithdrawn(address)", +"ae6751e2": "EmilTestCoin()", +"ae67701f": "ZperPreSale(address,uint256,uint256,uint256)", +"ae67b4c3": "evolveAxie(uint256,uint256)", +"ae68c80a": "AddRocket(uint32,uint64,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint64,uint32)", +"ae68fb83": "creditShareProvision(uint256,uint256)", +"ae69a893": "getHeirCount()", +"ae69ccdc": "GMSToken(uint256,string,uint8,string)", +"ae6a19af": "tokensSoldLimit()", +"ae6a1c30": "setApprovedWallet(address)", +"ae6a2435": "HOST_CUT()", +"ae6a70ee": "_tokenMetadata(uint256)", +"ae6b0792": "paymentManager(string,address,string,uint256,uint256)", +"ae6c0b03": "canWithdrawBond(uint256)", +"ae6caafd": "buyByBot(uint256,uint256,address)", +"ae6d8a52": "viewFourthLotOfClauses()", +"ae6dca72": "_allocate(address,uint256,uint256)", +"ae6e11dc": "terminateTokenLock()", +"ae6e22f1": "totalEther()", +"ae6f1db6": "payableFinneyReceived()", +"ae6f5bd2": "_calResultReturnIsWin(uint256,uint256)", +"ae702ba4": "isSubscriptionActive(bytes32,uint256)", +"ae70609e": "LogResult(uint256,address,uint256,uint256,uint256,int256,uint256,uint256)", +"ae708e7c": "totalConsideredFundedEther()", +"ae71d5da": "initProceeds(address,address)", +"ae721e45": "fetchOrdersForPayerByAdmin(address)", +"ae748575": "CGCM()", +"ae748837": "addTestimony(address)", +"ae75c4f7": "rewardsTokensVault()", +"ae75f9e6": "mock_resetLatestTokenAllocation(address,address)", +"ae76145d": "SEXcoin()", +"ae7635f2": "icoEndUnfrozeTokens()", +"ae764df3": "ICOWallet()", +"ae775b27": "betOnDozen(uint8)", +"ae77a6f4": "goldBalance()", +"ae77c237": "purchase(uint256,address)", +"ae77d51f": "m_chiefOwnerIndexBit()", +"ae788913": "AIHToken()", +"ae788b34": "ILFManagerCandidate()", +"ae799f4a": "TokenERC20(string,string,uint8,uint256)", +"ae7a45ba": "addZethrAddresses(address,address)", +"ae7a833d": "hydroContract()", +"ae7ad3fd": "setUpgradeabilityOwner(address)", +"ae7b0333": "executeOrder(address,uint256,uint256)", +"ae7b1620": "rushTimeChallengeRewardsPercent()", +"ae7b3825": "exchangeForETH(uint256)", +"ae7b6bd9": "getLatitude()", +"ae7b6daa": "numberOfCellsOwnedBy(address,address)", +"ae7c046b": "applyAllPermission(address,address)", +"ae7d00f3": "validationPrice()", +"ae7d0cac": "addShare(address,uint256,uint256)", +"ae7e23cc": "otherCoinsPurchase(bytes32,uint256)", +"ae7ed04c": "getLastBidForCanvas(uint32)", +"ae7f5da4": "lockPeriod2()", +"ae7fa597": "removePrize(uint16,address,uint256)", +"ae7fc1da": "_randMod(uint256,uint256)", +"ae7ffadc": "Bitway()", +"ae813029": "makeBid(uint16,uint256)", +"ae813ebb": "TokenFactoryAirdropCoin()", +"ae815843": "query(uint256,string,string,uint256)", +"ae817dd1": "doSendBounds(bytes32)", +"ae818340": "getProfiles(address[],string[])", +"ae81a54b": "factTeamOf(uint256)", +"ae81f51b": "mintTokens2(address,uint256,uint256)", +"ae8205e3": "insert(bytes32,int256)", +"ae82fcf4": "teamLocked()", +"ae83ed91": "HashBlock()", +"ae8421e1": "done()", +"ae850da9": "getNumberSources(uint256,uint256)", +"ae873405": "AVG_BLOCKS_24H()", +"ae873fa5": "PRESALE_MAX_RAISE()", +"ae87fc4b": "claimStatus()", +"ae87fd06": "gasPriceLimit_()", +"ae882412": "getTotalDivsProduced()", +"ae882cf1": "allowSpecies(uint16,uint16,address)", +"ae896b2e": "TPN()", +"ae89a29e": "maxHolderCount()", +"ae89aeb9": "getEscrowData(uint256)", +"ae8a473d": "_setReserveFactorFresh(uint256)", +"ae8a6833": "InitialSettings()", +"ae8a7180": "setStartOfCrowdsale(uint256)", +"ae8a8690": "createActivePreMintedEdition(uint256,bytes32,uint256,uint256,uint256,address,uint256,uint256,string,uint256,uint256)", +"ae8b9d7b": "autoSolveGame(uint256,uint256,uint256)", +"ae8bce2c": "product1_pot()", +"ae8cdd59": "IBTC(uint256,string,string)", +"ae8dab48": "setUp(address,address,address,address,address,address,address)", +"ae8e2217": "SmartexController()", +"ae8e3b70": "Fin()", +"ae8efe46": "CheckEntity(bytes32)", +"ae8f1d29": "createPermission(bytes32,address[],bytes4[])", +"ae8f2328": "finishcrowdsale()", +"ae8f6489": "createAndBuyAllAmountPayEth(address,address,address,uint256,address)", +"ae9074ff": "internalSuccessOver()", +"ae90b213": "payee()", +"ae90e9f8": "returnToBuyersContinue()", +"ae91b691": "changeRefPercentage(uint256)", +"ae92b204": "getCurrFeeRate()", +"ae93e513": "cancelOfferForCity(uint256)", +"ae94bbf1": "getCarDetails(uint32)", +"ae94e448": "imax(int256,int256)", +"ae94ec05": "placeBuyTokenOrder(uint32)", +"ae954790": "Authorizable()", +"ae9569d0": "PLATPriceOracle()", +"ae95a7a4": "TacoToken(address,string,string,uint256,uint256)", +"ae95c24e": "issueMap(address)", +"ae96b094": "VergeDark()", +"ae96bf2c": "TakePot()", +"ae9759ff": "PRICE_MULTIPLIER_ICO2()", +"ae978f08": "getLatestTweet()", +"ae97dde8": "MAX_COMMISSION()", +"ae989d36": "homeTeam()", +"ae99847b": "daylimit(uint256)", +"ae999ece": "reserve(string)", +"ae99aa3c": "getMemberInfo(uint256)", +"ae99f03c": "SetAddresses(address[],address[],address[],address[])", +"ae9a0785": "getChannelPostCount(address)", +"ae9a9295": "YKC(uint256,string,uint8,string)", +"ae9aea6d": "maxMintQuantity()", +"ae9b051c": "withdrawSome(uint256)", +"ae9b233f": "PasesLibresSocio(uint16,uint16)", +"ae9c1962": "withdrawCommunityPot()", +"ae9d70b0": "supplyRatePerBlock()", +"ae9dc04c": "offerSketchForSaleToAddress(uint256,uint256,address)", +"ae9f96c7": "weightsApportion(uint256,uint256)", +"aea01c49": "stringToBytes(string,string)", +"aea09e6e": "crowdfundStartTime()", +"aea0e35f": "createMarket()", +"aea13844": "safeGiveByContract(uint256,address)", +"aea1935b": "confirmEndWork(uint256)", +"aea197fe": "CreateRecipt(string,uint256,string,string,string,string,string,uint256)", +"aea31fc7": "setProof(string,string)", +"aea398da": "paymentWalletAddress()", +"aea3ad8c": "supportKickoffQuorum(uint256)", +"aea40787": "SetOwned()", +"aea43a29": "addMassAddressToWhitelist(address[])", +"aea452ba": "isBinding(uint16)", +"aea48690": "incentivisingEffortsSupply()", +"aea57be4": "resumeIEO()", +"aea5b69f": "solutionInfo(uint256)", +"aea6022c": "change_metadata(uint256,string)", +"aea64763": "stopsale()", +"aea65bf6": "VerifyProof(uint256[],uint256[],uint256[])", +"aea68d6b": "Shakedown0x()", +"aea6e1a4": "buyAnotherDrangon()", +"aea787a2": "showleveldetail(address)", +"aea8126f": "transferMSM(address,uint256)", +"aea8d47c": "getLatestContract(bytes32)", +"aea8dcca": "setTokenInfoMaxTotalImbalanceList(uint256[])", +"aea92852": "getDevIndex(address)", +"aea96513": "returnSecretVoteHash(uint256)", +"aea9b438": "getBuyerInstanceAddress(address)", +"aeaa3091": "getDealerValue(uint8[],uint8)", +"aeaaaa08": "proxyClaimTokens(address)", +"aeaabffe": "UnlockAll()", +"aeab24df": "reinvestDivsWithContract(address)", +"aeac3354": "Deal(address,address,address)", +"aeac529a": "TradingLife()", +"aeac538a": "ClimateCron()", +"aeaca25e": "getTotalJadeProduction()", +"aeacd658": "signProduct(string)", +"aead9e47": "claimAndWithdraw()", +"aeadbe24": "getTotalTokens(address)", +"aeae264b": "BeteventCrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"aeaf5a37": "total_land_sold()", +"aeaf7fc1": "updateCandidate(address,bytes32,bytes32)", +"aeb00fda": "_getRacerCar(uint256)", +"aeb1355f": "getH2Amount()", +"aeb26733": "previligedApprove(address,address,uint256)", +"aeb27602": "addHash(string)", +"aeb2ffc1": "getQuery(uint256)", +"aeb37075": "DividendPaid(uint256)", +"aeb3ebd0": "LogContributorsPayout(address,uint256)", +"aeb447ff": "getLevelUpCost(address,address)", +"aeb47e2a": "COMMUNITY_POOL()", +"aeb4f0d3": "RegisterTwo(address,address)", +"aeb58dc5": "setPOOL_edit_15(string)", +"aeb669eb": "getHatchingEggId(address)", +"aeb754e5": "Auction(address,uint256)", +"aeb7614c": "bid(bytes32,bool,int32)", +"aeb7dd80": "_computeCurrentPrice(uint128,uint128,uint40,uint40)", +"aeb817ab": "etcSupply()", +"aeb89f14": "totle()", +"aeb8f966": "mintToken(address,uint256,int256)", +"aeb94f48": "getFreePacifist()", +"aeb9c40e": "isReadyToStart(uint256)", +"aebacd53": "PRE_BONUS()", +"aebad3a4": "getCaptainCount(uint32)", +"aebb2540": "setNewMultisig(address)", +"aebc0310": "updateOdds(uint256,uint256)", +"aebcd2d9": "AddSocialAccount(bytes32,bytes32,bytes32,bytes32)", +"aebd3f96": "receiveToken(address,uint256,address)", +"aebd4fcd": "shopStoreRegister()", +"aebe0224": "CollectibleTransfer(address,address,uint256,uint256)", +"aebe5523": "addTokenWalletInWhitelist(address)", +"aebf1e3d": "computeTokens(uint256)", +"aec02eb5": "ServiceContractResolver(address)", +"aec1914d": "surrender(bytes32)", +"aec1dd81": "updateNonClosingBalanceProof(address,address,bytes32,uint256,bytes32,bytes,bytes)", +"aec1ee7b": "STAT_MAX_VALUE()", +"aec205a5": "contractLaunched()", +"aec26c0e": "setLoanParameters(address,bytes32,uint256,uint256,uint256,uint256,uint256,string)", +"aec2f2d9": "first_bonus_duration()", +"aec30dc1": "minWeightPunish()", +"aec318f1": "enableMasterTransfers(bool)", +"aec3ab53": "_futureSupply()", +"aec4e0bb": "numberOfPunksReserved()", +"aec5ab08": "getAllDapps()", +"aec651fb": "getUserTokensByMatch(address,uint32)", +"aec72d8d": "STAGE_3()", +"aec77b63": "returnTokensInPool(address[],uint256[])", +"aec7f5b2": "JoustNum()", +"aec7f6f3": "compoundInterest(address)", +"aec8fae8": "getMemberAtKey(uint256)", +"aec9a987": "claimShare(address,address)", +"aec9c480": "includesSet(bytes32)", +"aecadd53": "grantTeamToken()", +"aecaf4ba": "addMoneyInternal(address,uint256)", +"aecbaaa1": "LogPayout(address,uint256,uint256)", +"aecbb5f1": "winAmount1()", +"aecbf70c": "Kisaan()", +"aeccee75": "_register(address,uint256,address)", +"aecd15e3": "getWithdrawalWallet()", +"aecd1fed": "setupToken(address,address)", +"aecd27fa": "linkCoin(address)", +"aecd46db": "testDepositCanbeWithdrawn()", +"aecdceef": "intToBytes(uint256,uint256)", +"aecef00e": "record(uint256,string)", +"aecf2149": "sendScoreToCustomer(address,uint256)", +"aecfd412": "Group_2()", +"aed214fb": "setBooleanMapValue(string,address,address,bool)", +"aed29d07": "totalRewarded()", +"aed2e7d4": "addGen(uint256)", +"aed339ef": "storeHarvestOperation(bytes32,address,string,string,uint32,uint24,uint16,string)", +"aed362c1": "hasModerator()", +"aed396c6": "setStageBonus(uint256,uint256)", +"aed3ebe4": "TokenBCCO(uint256,string,string)", +"aed4839a": "transferFrom(uint256,address)", +"aed4aab6": "receiveERC20(address,uint256)", +"aed5c011": "payWithMerculet(uint256)", +"aed6512e": "callerAdd(address)", +"aed6d8d4": "GetStuffNum(address,uint32)", +"aed76aa4": "getInvestorDepositAmount(address)", +"aed82a99": "sin_table_lookup(uint256)", +"aed83846": "removeFromPrivateSaleWhitelist(address[])", +"aed89fed": "projectContract()", +"aed8e967": "getEndpoint()", +"aed8f3da": "partsPerBillion(uint256,uint256)", +"aeda10be": "ethselfToken()", +"aeda352b": "hasName(address)", +"aeda852f": "houses(uint256)", +"aedb1c8f": "executeContract()", +"aedb8621": "TMONEY()", +"aedb9eef": "LDXCToken(uint256)", +"aedbbf36": "deleteNote(uint64)", +"aedd18dc": "timeout(address)", +"aedd3acc": "currentSTCPrice()", +"aeddaa02": "DelVer(address,address)", +"aeddab95": "batchUnmount(address,uint256[],uint256)", +"aeddf677": "lockLimit()", +"aede4680": "firstReserveWallet()", +"aede879d": "whatIsMissing()", +"aedf5360": "icoCrowdsaleContract()", +"aee06324": "trickleUp()", +"aee0abaa": "authorizeMany(address[],uint256)", +"aee14460": "getSummary(uint256)", +"aee145f7": "addressReserve()", +"aee1b8a1": "XBStandardToken(uint256,string,uint8,string)", +"aee1d4d3": "blockCreationRate()", +"aee25613": "sendErc20(address,address[],uint256[])", +"aee273f8": "createTokens(address,uint256,address,bool)", +"aee2988d": "addressOps()", +"aee2dbbf": "getSaleOrdersBySeller(address)", +"aee338ef": "referalAddrByNum(address,uint32)", +"aee36731": "OrderApprovedPartOne(bytes32,address,address,address,uint256,uint256,address,uint8,uint8,address,uint8,bytes)", +"aee40270": "AddAddressToWhitelist(address)", +"aee4c502": "test_remove()", +"aee7052e": "startPhaseLength()", +"aee776ae": "stnExchange(address,uint256)", +"aee7e176": "finalBonus()", +"aee83b61": "TASOHATOKEN(uint256,string,string)", +"aee84f6b": "setTime(address,uint256)", +"aee8a3bd": "add2Auction(address,uint256,uint256,uint256,uint256,uint256)", +"aee9293f": "chargeAndChange(uint8)", +"aee92d33": "approveByLegacy(address,address,uint256)", +"aee98408": "versionIndex(bytes32,bytes32)", +"aee99e52": "getPresale()", +"aeeaf3da": "addPackCategory(uint256,bytes4)", +"aeeb96af": "Highlander()", +"aeec9ba0": "UpdateManifesto(uint256,bool,bool)", +"aeedc9e9": "GroupBuy()", +"aeeed0db": "buyXaddr(address)", +"aeefb9d1": "distributeEDNR(address[])", +"aeefb9eb": "PixelToken()", +"aef0004a": "outputAddress()", +"aef08617": "limitTier3()", +"aef093ce": "Doge2Token()", +"aef0ef2e": "test_validShouldBe3_2()", +"aef1b9b5": "test_threeInvalidFalseEqLog()", +"aef251a7": "tokenCtr()", +"aef3575e": "HandWinsView(address)", +"aef35e6a": "stage2Sale()", +"aef37284": "getReservedTokensListValInPercentageUnit(address)", +"aef3bc17": "getMemberInformation(uint8)", +"aef3fa6c": "AFROIN()", +"aef41e3a": "getItemIdsPagable(uint256,uint256)", +"aef5cbee": "VICToken()", +"aef5ddec": "Paper(string,address,uint256,uint256,address[],address)", +"aef721b8": "createSwap(uint256,uint256,address,address,address)", +"aef76dda": "createPresale(address,uint256,uint256)", +"aef7ad9c": "getSchellingRoundDetails(uint256)", +"aef88aba": "DDJATCoin()", +"aef8a536": "SCNToken(uint256,string,string)", +"aef95098": "setUrl(uint256,string)", +"aef983d0": "getDigitFromByte32(bytes32,uint8)", +"aef99eef": "Game()", +"aefa573d": "genCode()", +"aefa68f0": "ifInAllowedLocks(uint256)", +"aefa7550": "read_u32()", +"aefa7d98": "getContractAddress(uint256)", +"aefaacda": "finalTimeout()", +"aefb1643": "ownerSetPaused(bool)", +"aefb2dad": "ticketsFor(uint256,address)", +"aefb658e": "playerDayEthInLimit_()", +"aefbbf2a": "BANKROLLER()", +"aefc4ccb": "associatedContract()", +"aefc8c72": "unsealBid(bytes32,address,uint256,bytes32)", +"aefd0299": "makeWager()", +"aefe5ee0": "cashOutTank(uint256)", +"aefe696b": "changeColorPink()", +"aefe9ca0": "s40(bytes1)", +"aefea053": "timelockVault()", +"af0062e4": "sellable_tokens()", +"af00be12": "_sendToken(address,uint256,bytes)", +"af017526": "whitelistAddress(address,bool,uint256)", +"af01841e": "getownership(uint16)", +"af01866d": "insertSchedules(uint256,uint32[],uint256[])", +"af023335": "burnSynths(bytes4,uint256)", +"af02d47b": "currentBonusPercent()", +"af030d2c": "setResult(uint256,uint256,bytes32)", +"af03105b": "depositMintSince(address,uint256,uint256,uint256)", +"af0396ae": "PLDT()", +"af03e856": "MockUpgradeableToken()", +"af047106": "sumPreICO2()", +"af049ea9": "testFail_interface_call()", +"af04d0c0": "Deal(address,uint256,uint256)", +"af053b71": "CostToken()", +"af05fa10": "upgradedVersion()", +"af05fc63": "mulpow2(uint256)", +"af0638f6": "currentMaxPurchase()", +"af079dec": "setHardwareWallet(address)", +"af07c768": "Arte()", +"af080014": "nameChange(string,string)", +"af086d6f": "setTestVar(uint256)", +"af08e1ad": "get_arbits_presale_open(address)", +"af093f9c": "specificBatchCheck(uint256)", +"af09420b": "_addStackholder(address)", +"af0a078e": "tHasUpvoted(uint256,address)", +"af0aba4e": "setExpirationRequest(uint256)", +"af0ac4b7": "submitNextStage()", +"af0b4cc0": "minerTotalTime()", +"af0b7029": "KYCApprove(address[])", +"af0bbfb8": "registerEndpoint(int256,string)", +"af0bdb38": "to(address,bytes)", +"af0c09db": "getChosenNumber()", +"af0c9259": "Total_SoldToken()", +"af0cfe1f": "addArticolo(bytes,bytes10,bytes10,bytes)", +"af0def14": "startWonderAuction(string,address)", +"af0dfd3e": "blockPeriod()", +"af0e7ba3": "LeanFund()", +"af0eec40": "assignWarriorsToBattle(address,address,uint256,uint256)", +"af1034ab": "addUpdateGrantee(address,uint256)", +"af106b10": "oracCost()", +"af107749": "m_emissions(uint256)", +"af10b8cf": "totalBooty()", +"af10c810": "turnOff()", +"af123fe7": "makeDeposit(address,address,uint256)", +"af129dc2": "numTokensTotal()", +"af135ff5": "getMemberInfoLength()", +"af136dea": "setCheckInPeriod(uint256)", +"af1380ad": "_getTournamentBattles(uint256)", +"af13aacc": "blocksPerPhase()", +"af13f1ad": "forSaleSupply()", +"af1484d0": "setForkReputationGoal(uint256)", +"af157c19": "getContributors()", +"af164016": "PersonalTime(address,uint256)", +"af16972c": "mining(uint256,bytes)", +"af1747aa": "checkDeck(bytes32,uint8[],bytes32)", +"af17dea6": "symbol_()", +"af18a548": "lockBuying()", +"af191aa5": "isCertificateRegisteredAndValid(address)", +"af19f0d1": "CoinPreSale(uint256,uint256,address,address,uint256,uint256,uint256,uint256)", +"af1af4df": "feeBurnerWrapperProxyContract()", +"af1b5feb": "addWeiRaised(uint256)", +"af1b7d90": "take(uint256,uint256[4])", +"af1c084d": "adminName(address)", +"af1c7940": "fiatInvestorShare(address)", +"af1cd6d3": "test2(uint256,uint32)", +"af1cd9f6": "getGGCTokenBalance(address)", +"af1d06e8": "validateSignature(bytes32,uint8,bytes32,bytes32,address)", +"af1e19d9": "getPlayers(bytes32)", +"af1ee630": "getBdpOwnershipStorage(address[16])", +"af1ff972": "rateForCurrency(bytes4)", +"af2096ef": "MAX_PUBLIC_SOLD()", +"af209cf8": "addFactory(address,uint8,uint256)", +"af20b964": "maximumFundingGoalInETH()", +"af21037f": "clearStartTime()", +"af224bdc": "parseAndStore(bytes)", +"af225fd6": "get_last_user_recast(bytes32)", +"af22fd8e": "NtsToken()", +"af23e1f1": "returnForMint(uint256,uint256,uint256)", +"af24cba2": "setLastAction(uint256,uint256,uint8)", +"af24d25c": "openTransfer()", +"af250a5e": "calculateAndTransferTokens(address,uint256)", +"af259886": "userToNumVillages(bytes32)", +"af261875": "t_ImmlaBountyTokenDepository()", +"af263ec9": "HomeToken(string,string,uint8,uint256)", +"af269745": "upgrader()", +"af26ed68": "setReportProcessingFeePercentage(uint256)", +"af2759f7": "timeUntilClaimAvaliable(address)", +"af2768ec": "commitMove(bytes32,bytes32)", +"af2780ee": "PERIOD_BLOCKS()", +"af27c7b3": "Security_HasPasswordSha3HashBeenAddedToBankAccount()", +"af28059d": "ChangeItemPrice(uint256)", +"af2885b2": "minimumEtherCommission()", +"af28a537": "totalRoundSeedAmount()", +"af299510": "HasBooster(address)", +"af29e720": "remainingGasFund(uint256)", +"af2a7fb2": "Brewers()", +"af2b114a": "Erc20SupplyToken(uint256,string,uint8,string)", +"af2b1925": "MarmotToken(uint256,string,uint8,string)", +"af2b2e5c": "ReVo()", +"af2b76ab": "airDropHero(uint16)", +"af2bf027": "minMaintenanceMarginAmount()", +"af2cff59": "removePVPContender(uint32)", +"af2e285c": "setBidState(bytes32,uint8)", +"af2e2da9": "getValidatorName(address)", +"af2f0c46": "SupportComponent(uint256,address,uint256)", +"af2f9105": "_performWithdraw(address,address)", +"af2fa91c": "otherCurrenciesChecker()", +"af2fcc17": "globalMinPurchaseAmt()", +"af303a11": "salvageTokens(address,uint256)", +"af304bab": "getPriceByCredentialItemId(address,bytes32)", +"af30e4d6": "Log2(address,bytes32,uint256,string,string,string,uint256,bytes1,uint256)", +"af30e9f7": "transferICOTokens(address,uint256)", +"af30ee3f": "GOD()", +"af310f02": "NotCoin(string,string,uint8)", +"af314579": "isDayFirst()", +"af31f49b": "startNextAccountingPeriod()", +"af3309d8": "heartbeatCount()", +"af333595": "proxyMergeMint_old(uint256,bytes32,address[])", +"af339ee4": "convertLotById(bytes32)", +"af33f8a5": "Order_execute(address,address,uint256,uint256)", +"af35314a": "INITIAL_TOKEN_FROM_COMPAIN()", +"af356eee": "preicoContractAddress()", +"af35ae27": "getRemainingTokens()", +"af35ae3e": "setSaddleShopSaleFee(uint256)", +"af35b3f1": "why()", +"af35c6c7": "enableTransfers()", +"af35dac2": "convertToCents(uint256,uint256,uint256)", +"af36778b": "aggregate()", +"af36e7a7": "removeUserWhitelist(address[])", +"af371115": "findCertificate(bytes)", +"af375838": "addBurnupGame(address)", +"af378ce5": "bust(uint256)", +"af38d757": "claimable()", +"af3996c3": "fourthStageMinted()", +"af3a4feb": "LOOMIA_LOOMIA_REMAINDER_ADDR()", +"af3cc6be": "MoxianCoin()", +"af3d8e43": "preICOTokenDelivery(address,uint256)", +"af3dc180": "ecosystemBuildingWallet()", +"af3e8a40": "orderMatch(bytes32)", +"af3f0ebe": "c_startTime()", +"af3f12bc": "profitSharingContract()", +"af3f1db4": "BMEtestToken1()", +"af408d89": "setStatus(bytes)", +"af40ce20": "revokeUnicorn(uint256)", +"af40dd2f": "AccessToken()", +"af418e4c": "setReclaimPeriod(uint256)", +"af422cce": "marketSellOrders(uint256,bytes[])", +"af42d106": "setKey(string)", +"af431f03": "setUser(address,string,uint256)", +"af43f597": "get_amount_minus_commission(uint256)", +"af448721": "refundMe(address,uint256)", +"af44e487": "overdraftPeriodsNumber()", +"af45118e": "createProposal(address,bool)", +"af45de05": "disableDonation()", +"af463d2a": "CentaToken()", +"af468682": "startsAt()", +"af46aa08": "stakeBalanceOf(address)", +"af475a9b": "setUSDPerETH(uint256)", +"af477528": "addMetadataObject(string)", +"af47c1af": "getActionByIndex(uint256)", +"af481be8": "mint(string,uint256,uint256,uint8,string)", +"af488ca3": "setLiquid(bool,uint256,bytes)", +"af489d5a": "_moveBalance(address)", +"af49a228": "DeshiCoin()", +"af49e321": "getHolderLimit(address)", +"af4a2984": "createPrizePool(uint256[])", +"af4a822d": "getCurrentTrancheIndex(uint256)", +"af4b382d": "PaquariumToken(uint256,string,uint8,string)", +"af4b3cab": "delBounty(address,address,uint256)", +"af4bed26": "setExchangeRateByOraclize(address,bytes32,string)", +"af4c14ee": "setAddressWhitelist(address,bool)", +"af4c2288": "getNumAcceptance(address)", +"af4c3d1d": "BPofMakerByIndex(address,uint256)", +"af4c6838": "tokenDeposited(address)", +"af4c9b3b": "withDrawalether(uint256)", +"af4cd457": "getOrCacheValidityBond()", +"af4d723c": "Libidocoin()", +"af4e3d37": "withdrawReservedTokens()", +"af4e4494": "TANKER_TYPE()", +"af4e99de": "getGameData()", +"af4fd9e7": "setValidLockingAmountToPeriod(uint256[3],uint256[3])", +"af500fb7": "readBytes32(bytes,uint256)", +"af50e0d3": "DeDeMasterContract(address)", +"af5177b1": "calcDrawCode()", +"af519bf5": "doesProofExist(uint256,bytes32)", +"af5260bf": "finalTime()", +"af52fbed": "retrieveWineData(bytes32)", +"af53dc6e": "contractbacklist()", +"af54e324": "upgrade_self(address)", +"af55bba0": "removeRegistryFromTagsIndex(address)", +"af5610dd": "isThisPreforkVersion()", +"af567633": "minPresaleWei()", +"af574319": "UpgradeProposal(address)", +"af577c4c": "unlockReserve()", +"af57d236": "STAGE_2_TIME()", +"af580d2c": "getPurchaseById(string)", +"af58574a": "getTierPosition(address)", +"af589421": "callerAdded(address)", +"af589572": "getAssetIdTripStartTime(uint256)", +"af58eda8": "findSeedAuthorized(address)", +"af598bc7": "winnerOf(uint256,uint256)", +"af599a8d": "_depositTokens(address,uint256,address)", +"af59c789": "setVendingAmount(uint256,uint256)", +"af5a3db8": "finaliseVoting(uint256)", +"af5a7625": "getFundInfo(bytes32,string,address)", +"af5b065a": "getMinimumPurchase()", +"af5b0ece": "getAmountContributed(address)", +"af5ba32a": "_fund(uint256,address)", +"af5c1020": "InfinityDataChain()", +"af5c295a": "checkMaxAllowed(address)", +"af5c4540": "getVoteTokens()", +"af5c6f38": "synthesize(uint16[5],uint256)", +"af5cfae8": "remainingInvestment()", +"af5d4013": "toteLiquidatorTranserComplete()", +"af5ee700": "buyTokenPerEther()", +"af604173": "ico_startTime()", +"af608fad": "isTimelockAllowed(address,address)", +"af60b50f": "CGCoinsToken()", +"af60dc4f": "SCMOXToken()", +"af6128c2": "calcTotal(uint256)", +"af62a708": "getCrystalKindWeight(uint256)", +"af62cfd2": "endBetBlue()", +"af63066e": "userRound(address)", +"af6337fd": "pausecontract()", +"af6375cd": "setNewStartTime(uint256)", +"af63da13": "getMemberRegistry()", +"af640d0f": "id()", +"af6499c5": "ActiveDigger()", +"af653861": "applyAndLockSettings()", +"af664f3a": "Bitkat()", +"af6682ab": "query(uint256,uint256)", +"af66c560": "convertData(bytes)", +"af66eb1f": "LogWithdraw(address)", +"af6704ee": "NehalCoins()", +"af67cdc4": "HBToken()", +"af685482": "BonusChanged(uint8,uint8)", +"af68a2c4": "getMyGameDividends()", +"af68dd3f": "getBaseInfo(uint256)", +"af692e00": "getPullRequestById(bytes32)", +"af6972c0": "submitDeliveryCommitment(address[2],uint32,uint64[3],bytes32[],bytes32,uint256[2],uint256,bytes32,bytes32,uint8)", +"af6a2c5c": "JTCCtoken(uint256,string,string)", +"af6afce5": "min(int256[])", +"af6b08a1": "Sale(address,address,uint256,string,uint8,string,uint256,uint256,uint256)", +"af6b3615": "getInitialReportStakeSize()", +"af6b3d43": "roundSwitch()", +"af6bb824": "_cancelSale(uint256,address)", +"af6bd8ce": "durations(address)", +"af6c0f60": "bntToken()", +"af6c3021": "MaxReleasedBac()", +"af6c7f77": "crowdSaleStartTime()", +"af6cd244": "acceptAnswerAndFinalize(uint256,uint256)", +"af6d0437": "AtomicSwapRegistryConstructed()", +"af6ddad8": "shift_left(uint256,uint256)", +"af6df563": "withBonus(uint256,uint256)", +"af6e66e6": "Lockup36m(address)", +"af6f37a2": "getBasicTokenAmount(uint256)", +"af6f964d": "minReached()", +"af6fae22": "roomAvailable(string,uint256[],uint256)", +"af6fce9a": "RoyaltyInformationContractSet(address,address,bool)", +"af6fe8e2": "testGetToken()", +"af713566": "batch()", +"af713dda": "SUPPLY_FOR_PARTNERSHIPS()", +"af722ea7": "connectors(address,address)", +"af7296ec": "remainingBankroll()", +"af737da7": "_setClientLastPaidRate(address,uint8)", +"af738bbf": "setDepositoryDelegate(address)", +"af7520b9": "startingPriceOf(uint256)", +"af75ad2d": "createDispute(address)", +"af7665ce": "ethPriceFeed()", +"af769b54": "transferAcceptable(address)", +"af769eff": "Paper()", +"af76c4d2": "mined_blocks()", +"af76ccd7": "finishedPromotionIDs(uint256)", +"af77040e": "bonusIncreasePercentage()", +"af77649d": "paySmartContract(bytes32,uint256)", +"af77c473": "p_setGamePaused(bool)", +"af77ebee": "transfersOnOff(uint8)", +"af77f8bd": "setVIPBonus(uint256)", +"af7885b5": "listSubName(bytes32,uint256,uint256)", +"af78facf": "valueBonuses(uint256)", +"af7912a1": "bonusTake()", +"af791df2": "recoveryDone()", +"af794a4f": "tulips(uint256)", +"af79b437": "MintingDisabled()", +"af79ffde": "userInitialized()", +"af7a0899": "firstStageWallet()", +"af7a1762": "getBetfundingAddress()", +"af7a6164": "setMaxMessagesGlobal(int32)", +"af7b2eb7": "listAddresses(address[],uint256[])", +"af7bcf5e": "LigoToken(uint256,string,string)", +"af7bfd6c": "setValueAny(uint256)", +"af7c8f96": "changetokenBurnAddres(address)", +"af7d0eff": "setSellPrices(uint256)", +"af7d1890": "adminAddICO(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"af7d469c": "setGeneratorAddress(address,address)", +"af7d4b21": "RXPSale()", +"af7d5ebe": "change_p4(uint256)", +"af7d697e": "EnableTransfer()", +"af7d6ca3": "spend(address,uint256)", +"af7e8577": "TCCCoin()", +"af7ed9d7": "maxGasPriceInWei()", +"af7fdd76": "setModified()", +"af80562c": "testReceiveHash()", +"af819c67": "TTCSale(address,uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"af81bd03": "_voteAndCheck(uint256)", +"af81c5b9": "addToken(address,uint256)", +"af8214ef": "LIMIT()", +"af82403c": "getNextNode(bytes32)", +"af8255ab": "updateProgress(uint256,uint256)", +"af825c78": "Hjjm()", +"af83782e": "setMinimumWishTribute(uint256)", +"af837832": "isPromo(address,address)", +"af83f252": "historyRed(uint256)", +"af8472b1": "consecutiveDeaths()", +"af84fb00": "withdrawAmount(uint256,uint16)", +"af8532e3": "roundDeadline()", +"af854db1": "allowedTransferDuringICO(uint256)", +"af857a84": "batchTrade(address[13][],uint256[15][],uint8[2][],bytes32[2][],bytes32[2][])", +"af862b6a": "ETH_withdraw(uint256)", +"af874a76": "isValid(address,address)", +"af87c366": "walletUnlock(address)", +"af87c833": "initiateProvider(uint256,bytes32)", +"af8927c1": "GetRealCost(address,uint32)", +"af8979fd": "confirmDeath()", +"af8996f1": "setPublicationFee(uint256)", +"af899735": "playGame()", +"af8a849c": "AllocationGranted(address,address,uint256,bool)", +"af8af39f": "setRate555()", +"af8b0ec7": "rewardRoto(address,uint256)", +"af8b7525": "CollectAndReduceFees(uint256)", +"af8b912d": "setVotingMachine(address)", +"af8c1946": "refundAllEther()", +"af8d5a48": "icoEndTimestampStage()", +"af8d7611": "setPointIdentifier(string,int256)", +"af8d98c9": "gameEndPlayNo()", +"af8d9f37": "addressContainsContract(address)", +"af8ec44c": "offerGanTokenForSaleToAddress(uint256,address,uint256)", +"af8f35c4": "_fallback()", +"af8f7fdf": "ProductUpdated(address,address,address,string,bool)", +"af8ff2f8": "runPreMint(address,uint256)", +"af906cf3": "setToken(uint256,address)", +"af91b947": "UnsuccessfulAttempt(address)", +"af91c5fd": "getVotersChoice()", +"af91e0bf": "freezeOracle()", +"af92080b": "downTick(address)", +"af92a693": "addRegistrar(address)", +"af933b57": "withdrawEther(address)", +"af93a6d1": "CatNamed(bytes5,bytes32)", +"af93aebb": "adjustPhaseBasedOnTime()", +"af93afdd": "Shipment(bytes,bytes,bytes,bytes,string,bytes,uint256,uint256,bytes,bytes,uint256,uint256,string,bytes,bytes,bytes)", +"af93e308": "HookToken(address,address,uint256)", +"af941129": "testMintGuyAuth()", +"af944fc7": "getQueueLenght()", +"af949df9": "isValidUser()", +"af9658cd": "custodianVerify(address)", +"af988341": "sendLink(string,string,string)", +"af9890aa": "GUS()", +"af98cfd6": "exchangeByBuyer(uint256,uint256)", +"af98f757": "cancelRequest(address)", +"af99a327": "finalizePartnerSale()", +"af9a3f9b": "hashName(string)", +"af9a51c6": "getComponents(uint16,uint8,uint256)", +"af9a91d9": "setDrawerFee(uint256)", +"af9a99fa": "updateDates(uint8,uint256,uint256)", +"af9afe73": "unmintTokens(address,uint256)", +"af9b192e": "RESERVE_AMOUNT()", +"af9b1cef": "transfer_funds_to_project()", +"af9b6bd2": "bidEMONTMin()", +"af9bbcc4": "unbanAccounts(address[])", +"af9c5e7a": "getWhitePlayer(bytes32)", +"af9cb8c0": "StartOfPayments(address,uint256)", +"af9cb9f6": "setRequiredStake(uint256)", +"af9dfd1a": "FoodTokenEmissionEvent(address,address,uint256,bool,uint256)", +"af9ee81d": "_unstake(address)", +"af9efd4c": "_api_PlaceBet()", +"af9f3e20": "BTCVERVIER()", +"af9f788c": "TankWithdrawSome(uint256)", +"af9fc8a8": "UHC()", +"afa01c90": "CollectibleIndex4()", +"afa03ac9": "doFailingTransfer()", +"afa0f8c9": "getUintCoinProduction(address,address,uint256)", +"afa12a8a": "roundEnds()", +"afa17725": "WillyCoin()", +"afa1d6c9": "mainSaleTokenRaised()", +"afa202ac": "setRolesContract(address)", +"afa25098": "returnCoins(uint256)", +"afa293d4": "getSource()", +"afa31744": "saleTokensAddress()", +"afa33fb8": "chkLockedB(address,uint256)", +"afa3a5d1": "SetdivForTransfer(uint256)", +"afa3de9b": "revokeUserLicense(address,string)", +"afa40bbd": "UNIT_PRICE()", +"afa4179d": "_getInvestorLockedAmount(address,address)", +"afa437c0": "callBackForRequestRandom(bytes32)", +"afa560b0": "transferToICAPCallGas()", +"afa5e0a9": "getCountry(uint256)", +"afa5e56a": "decExchangeBalanceOf(address,uint256)", +"afa5f45c": "changeDecimals(uint256)", +"afa60035": "doesAssetTokenExist(address)", +"afa60487": "getDocAsBytes64(uint256)", +"afa6c735": "PRICE_PRESALE()", +"afa72b9f": "CinderToken()", +"afa7a25f": "updateArtistsAccount(uint256,address)", +"afa902a0": "isAutoFowarding()", +"afa936b8": "deleteCertificate()", +"afa99860": "getTokenPrice(address,address)", +"afa9a86e": "tokensInPlay()", +"afa9f179": "toReal(int64)", +"afaaa654": "setEndIcoPreICO(uint256)", +"afaaf9f9": "DepositBroker()", +"afab2b0f": "inventoriesOfDate(uint256,uint256,uint256[])", +"afab729d": "EntrepreneurShop()", +"afabe8b4": "CALLToken(uint256,string,string)", +"afac8ed3": "rand(uint16,uint16)", +"aface2f1": "mintTokensFor(address,uint256,uint256)", +"afaebf3e": "setDispatcherAddress(address)", +"afaf6b2e": "AuditSafeGuard(bytes20)", +"afaf97e7": "privateSaleToken()", +"afb058ce": "teamTwoPrefix()", +"afb0db5f": "random3()", +"afb18fe7": "paymentTokenAddress()", +"afb2032b": "LuckChain()", +"afb390aa": "getIsSecondPhaseEndedByTime()", +"afb3a8e9": "accept2(uint256)", +"afb3ae7a": "SPECIALIST_ONE()", +"afb47bb3": "approveModeratorship()", +"afb4d2ee": "getM()", +"afb58d18": "setPriceOneToken(uint256,uint256)", +"afb688a2": "mineth()", +"afb6b9a5": "m_hardCap()", +"afb7e495": "eruptionThreshold()", +"afb95eed": "logApproval(address,address,bytes32)", +"afb97c20": "tokenTransferDelegate()", +"afbae469": "mediumSize()", +"afbb9d44": "ico1Bonus()", +"afbc4ebc": "OWNER_CUT()", +"afbcd19b": "CROWD_WAVE3_BONUS()", +"afbcd904": "setDataColla_001_001(string,string)", +"afbd3b7f": "minLot()", +"afbd8092": "CATRefundedForWei(address,uint256)", +"afbdaa05": "isInBlockFilter(address)", +"afbddfa9": "toggleFreezeTokensFlag()", +"afbde5c9": "getNumTopics()", +"afbea641": "SECToken()", +"afbec8df": "TheGrid()", +"afbfdd93": "Notonegoro()", +"afc01cb9": "getFinishTime()", +"afc0b5d3": "Crypto010()", +"afc0bf27": "registerName(string,address,bool)", +"afc0bf43": "setRecoveryInfo(bytes32,uint256)", +"afc0e324": "stringToBytes12(string)", +"afc17f80": "addLockedTokens(address,uint8,uint256,uint256)", +"afc24bfb": "getRules(uint8)", +"afc24e3d": "getChallengeAnswer(uint256)", +"afc2cc46": "SGEICO()", +"afc2f503": "allowEmployeeMigration(address,address)", +"afc361bc": "tokenFrozen()", +"afc3a2ad": "current_tier_sold_tokens()", +"afc3b688": "perc(uint256,uint256)", +"afc3c31f": "initDepositAccount()", +"afc48052": "mintBounty()", +"afc4a982": "PathCost(uint16,uint32)", +"afc6740e": "PricePerCafe()", +"afc6fe2e": "MaybePerformWithdraw()", +"afc75b1d": "SwissTrustToken()", +"afc797a6": "lastStealValue()", +"afc7c400": "ProICOPrice()", +"afc81953": "createGame(bytes32,uint256,uint256,bytes32,bytes)", +"afc83802": "setTotalWeiToBeDistributed(uint256)", +"afc88141": "WhitelistAddressdisable(address)", +"afc8fbc6": "MerkleAirDropToken(string,string,uint8,bytes32,uint256)", +"afca35e5": "QuadToken()", +"afcac546": "getByteSize(bytes32)", +"afcb0d3a": "place(int8)", +"afcc05c0": "buyRedirectFor(address)", +"afcc1286": "dtEnd()", +"afcc8676": "SMPLTSTToken()", +"afcced41": "CROWDSALE_GASPRICE_IN_WEI_MAX()", +"afcd565c": "createTile(uint16,uint8,uint8,uint8,uint32,uint16,uint64,uint64,address,uint8)", +"afcd6561": "getIdentifierFromSectionIndex(uint256)", +"afce2d62": "PoC()", +"afcee461": "DungeonRunAlpha()", +"afcf2fc4": "charityAddress()", +"afcfad6e": "getJobPayments(bytes32)", +"afd07e80": "getMiningWarRoundOfPlayer(address)", +"afd09bab": "quadrupler()", +"afd0a85a": "ListingCancelled(uint256,uint256)", +"afd0fd1d": "getDecimals(string)", +"afd20e33": "LOCKAMOUNT()", +"afd237bd": "getTxn(uint256)", +"afd23d4a": "STAGE_1_FINISH()", +"afd2d5f6": "OpinionToken()", +"afd3f79a": "_isCorrectQuarterBuyin(uint256)", +"afd42fd3": "addCloud(uint16,uint16,uint16,uint8,uint8)", +"afd51a6e": "updateLimit()", +"afd61d2c": "getBonusEgg(uint64)", +"afd6b607": "createRequestAsPayee(address[],address[],int256[],address,address,string)", +"afd7b21e": "companyCapital()", +"afd7b9ed": "angelStartTime()", +"afd7bf92": "noContract()", +"afd7d464": "FaradTokenSwap()", +"afd82067": "getScore()", +"afd8515e": "setTotumPhases(address)", +"afd8c8c4": "GasProxy(address,address)", +"afd8fd5f": "createToken(string,string,address)", +"afd925df": "setPermissionManager(address,address,bytes32)", +"afd9897e": "restTokens()", +"afda2dac": "jackPotC()", +"afda5460": "YDTToken()", +"afdac68d": "query(uint256)", +"afdb0970": "sendToBuyer()", +"afdbd499": "reclaimERC20(address,uint256)", +"afdc3823": "updateTlcTlr(uint256,uint8,uint8)", +"afdcd8ec": "RAZEN()", +"afdd4d23": "airDropValues(address,address,address[],uint256[])", +"afde86c1": "getHash2(address,bytes32)", +"afdebfe7": "setWeiRaised(uint256)", +"afdfaee7": "_preValidatePurchase(address,uint256,address)", +"afdfb804": "getVendors(uint256,uint256,bool)", +"afe007b6": "_transferAction(uint32,address,uint8)", +"afe0e33c": "reputationRewardLeft()", +"afe12e77": "withdrawWrongNode(bytes32,address)", +"afe14c19": "clean(address,address)", +"afe15cfb": "appealPeriod(uint256)", +"afe17129": "tokensStillInLockup()", +"afe18413": "placeOrder(address,uint256,address,uint256)", +"afe1d4cf": "setTechBonus3(uint256,string)", +"afe2ce0e": "setSaleAddr(address,bool)", +"afe38ade": "payoutWinners(uint256,address[],uint256[])", +"afe4720c": "toggleFeatured(uint256,string)", +"afe69bb0": "Create(bytes32,bytes32,address,address,address,uint64)", +"afe70413": "getCommissionForType(string)", +"afe76ab1": "calcProgress(uint256,uint256,uint256)", +"afe80b8d": "newCmas(uint256,string)", +"afe8abbf": "transferPresaleCoins(address,uint256)", +"afe8b652": "countriesCount()", +"afe948ce": "OKEToken()", +"afe98be1": "calculateId(uint256,uint256,uint32,uint256)", +"afe9c776": "XITC()", +"afec91c4": "icoInstalled()", +"afed762b": "toSlice(string)", +"afef07da": "ico2receivedTotal()", +"afef0e28": "MARKETING_supply()", +"afef25d7": "Puremail()", +"aff038e6": "sellForOtherCoins(address,uint256)", +"aff06fbd": "playerCancelActiveGame(uint256)", +"aff16621": "toSig(bytes)", +"aff177ca": "updateWhitelist(address[],bool)", +"aff1e0de": "crowdsaleTotal()", +"aff1f15f": "rate3()", +"aff21b00": "imOut()", +"aff21c65": "getMinimumEndowment(uint256)", +"aff23300": "UserWallet(address)", +"aff36885": "setBlockMaxVotes(uint256,uint256,uint256)", +"aff3a08e": "CreateFAP(address,uint256)", +"aff46572": "getMarketplaceContract()", +"aff4b849": "getMemberName(address)", +"aff4cbea": "SHIP_SLOTS()", +"aff57736": "getNumbersFromString(string,string,uint32)", +"aff5dff2": "getCreditsFor(string)", +"aff5edb1": "deregister()", +"aff6b3e8": "setupRace(uint256,uint256)", +"aff74c6d": "getTotalPeriods()", +"aff7bd49": "trackSell(address,uint256,uint256)", +"aff7fae4": "GodzSwapGodzEther(address,address,address)", +"aff8c7ab": "IkuraAuthority()", +"aff9b3cc": "getCarName(uint256)", +"aff9e954": "topOptions(uint256,uint256)", +"aff9f40d": "SaddleForSale(uint256,uint256)", +"affb62dd": "dAdd(bytes32,address)", +"affb672b": "realimmocoin(address)", +"affbe8ab": "ACNCToken()", +"affbf593": "withdrawExcess(address)", +"affc0670": "openVoting()", +"affca932": "changeFeeRate(uint256)", +"affcba25": "createNewMintableUser(address)", +"affcce10": "_unpackRaceData(uint256)", +"affd0dd4": "Funding_Setting_funding_time_start()", +"affe39c1": "owners()", +"affed0e0": "nonce()", +"affee29b": "submitEthToTokenOrderWHint(uint128,uint128,uint32,int256)", +"afff33f4": "GameEvent(uint256,address,uint8)", +"afff5064": "setBonusesForAmounts(uint256[],uint32[])", +"afff9720": "addrBounty()", +"b0005ff1": "validPresaleTrading()", +"b000c81b": "InitBetContract(address,address,uint256)", +"b000dec2": "total_token_sold()", +"b001134a": "balanceInTier()", +"b0011509": "calcMarketFee(uint256)", +"b00124c4": "epocum()", +"b00140aa": "getHash(bytes)", +"b0018bfc": "changeTokenName(string)", +"b0036d32": "mintByGateway(uint32,uint64,address,string)", +"b003dd86": "encode(uint256[])", +"b004079e": "lol(bytes32)", +"b0043308": "setaddAddressListItemSet(bool)", +"b00606a5": "confirm(bytes32,uint8,bytes32,bytes32)", +"b0062595": "KcashToken()", +"b006b86e": "_addEthereumAddress(uint256,address)", +"b006de0d": "initialBalanceForCrowdsale()", +"b006e2b0": "txhash(string)", +"b0070a30": "changeBeneficiary(uint256,address)", +"b00791fa": "proxy_contribution(address)", +"b0091773": "orderExecutionBlockTime(bytes32)", +"b009c50d": "DevxToken()", +"b00a0dbf": "allowanceTransfer(address,address)", +"b00a81fb": "buy(uint256,uint256,string,string,string,string,string)", +"b00b1239": "approveAndDeposit(address,uint256)", +"b00baa11": "DaicovoStandardToken(string,string,uint8)", +"b00bad50": "identifierToBuyoutPrice(uint256)", +"b00cdd9b": "preICOgoal()", +"b00d4c75": "singleLineWrong()", +"b00d70ca": "sollReserve()", +"b00dba63": "setTokenData(uint256,bytes32)", +"b00e8668": "can_refund()", +"b00eb9fe": "feeCalculator()", +"b00f9702": "setTeamPerfitAddr(address)", +"b0102e20": "equipMultipleTokens(uint256[])", +"b010d80e": "ensureTokensAvailable(uint256)", +"b010d94a": "canExitPool(address)", +"b0112ef2": "changeReserveCATDestinationAddress(address)", +"b0119a22": "genOrder()", +"b011fcf1": "doWithdraw()", +"b0128c08": "getCeiling()", +"b013b369": "_errorBuyingTokens(string)", +"b013f637": "getNicknameByAddress(address)", +"b013fa91": "JadeCoinMining(address,uint256)", +"b01454dd": "vrc()", +"b015b81a": "amountToTakeAsRake(uint256)", +"b015c2ce": "FLOWToken()", +"b0166b04": "testTransferringMkr()", +"b016f9f2": "ThirdAddressBalance()", +"b0171fa4": "getCurrentGenerationId()", +"b0175308": "PriceDecimals()", +"b017c036": "rlc()", +"b017d808": "assertEq32(bytes32,bytes32,bytes32)", +"b01800f8": "createNewUser(bytes32,bytes,bytes32,bytes32,address)", +"b0181b3c": "setMyIdentity(bytes32,string,string)", +"b018d65a": "maxAffiliate()", +"b0192f9a": "auctionManager()", +"b019ffd2": "thirdDiscountCap()", +"b01a71d8": "setProvider1(address)", +"b01ab46d": "validPurchase(address)", +"b01afdab": "changeBaseValue(uint256,uint256,uint256,uint256,uint256,uint256)", +"b01b0304": "ExchangeRateChanged(uint256,uint256)", +"b01b299f": "setTokenPriceProposal(uint256,uint256,uint256)", +"b01b3b6c": "_createSale(uint256,uint256,uint256,uint64,address)", +"b01b8877": "setFundingFueled()", +"b01c60b7": "getPrices(uint256,uint256)", +"b01d3d9e": "ENTToken()", +"b01d54ed": "PolyAi(uint256,string,uint8,string)", +"b01d5b63": "purchaseFor(address,uint16,address)", +"b01d7a11": "sendTokensToFive(address,address,address,address,address,uint256)", +"b01e8308": "JointToken()", +"b01ead43": "returnToOwners()", +"b01eba14": "MIN_TOTAL_AMOUNT_GET_ETH()", +"b01f1571": "unitsPerEth()", +"b01f31c9": "hardcapInTokens()", +"b0203f3f": "totalAmountsBetStage2(uint256)", +"b020b188": "developmentToken()", +"b020d7a3": "_reinvest(bytes32,uint256)", +"b021cace": "RubyCoin()", +"b0228f8c": "icoEtherReceivedMainSale()", +"b02447e0": "bonusChangeTime()", +"b024abad": "GoTokenDutchAuction(address,address,address,address,address,address,uint256,uint256,uint256,uint256,uint256)", +"b024b2e3": "GridyToken()", +"b0251e6d": "setUserLocked(address,bool)", +"b0259633": "SHIPToken()", +"b025abf1": "step0Rate()", +"b025cc45": "deadlines(uint256)", +"b0267126": "advisorySupplyRemaining()", +"b0271023": "verifyFile(string)", +"b0273de1": "addVpf(bytes32,uint256,uint256,uint256,uint256,uint256[])", +"b028c059": "createMatch(uint256,string,string,int32,int256,uint64,uint64)", +"b028d73a": "isCrowdsaleAllowed()", +"b028ee13": "s2b(string)", +"b0293850": "claimBuyerFunds(address,address,address,uint256)", +"b029c2c8": "approve_unwanted_tokens(address,address,uint256)", +"b029d940": "setPlatinumAddress(address)", +"b02a2fd1": "withdrawLemonCoins()", +"b02a73a1": "sendTo(address,uint256,bytes)", +"b02af038": "bonusesSold()", +"b02b69d6": "addBonus(uint256,uint256)", +"b02bf4b9": "earn(address,uint256)", +"b02c43d0": "deposits(uint256)", +"b02c8054": "withdrawICO(uint256)", +"b02da8d8": "diamondBonus(uint256)", +"b02dbd07": "teamAllowance()", +"b02e8496": "processSellRequest(string,address,uint256,uint256,bool)", +"b02ef382": "SALE1_END()", +"b02f1edc": "TokenERC20(string,string)", +"b02f53ae": "testConcatStorage31Bytes()", +"b03031b7": "_askQuestion(bytes32,bytes32,address,uint32,uint32)", +"b0304813": "currentMilestone()", +"b03053b6": "createListing(uint256,uint256,uint256)", +"b0321d45": "ZJMToken(address,address)", +"b03260be": "scheduleTransaction(uint256,address,bytes)", +"b032fff4": "weiMaximumAmount()", +"b0335ffc": "setStage(uint256,uint256,uint256,uint256,uint256)", +"b033777f": "endCurrentGame()", +"b033a02b": "payDivsValue(uint256,string)", +"b033a6c3": "lookup(address,uint256)", +"b033cab9": "voterStakes()", +"b0340123": "votingToken()", +"b0347c56": "estimatePots()", +"b0349184": "clearRecords(bytes32[])", +"b0349650": "_removeControllerByPartition(bytes32,address)", +"b034998b": "ChooseBwea()", +"b034d5aa": "Total_Deposits()", +"b034f3cf": "myLatestBid()", +"b0355b45": "LuHuToken(string,address)", +"b03645b5": "max_users()", +"b036ab65": "LemoSale(uint256,uint256,uint256)", +"b037e4f5": "MCoin()", +"b0388344": "readTaskCreatedOn(string)", +"b03903fd": "usernames()", +"b03941bc": "dropable()", +"b0397857": "secondaryListing()", +"b03b3a0a": "setPOOL_edit_13(string)", +"b03c4b33": "setLock(address,bool)", +"b03c6729": "inmax()", +"b03cf9bd": "MerkleAirdrop(address,bytes32)", +"b03d169c": "mineCount()", +"b03d5ce8": "PVCToken(address)", +"b03e02ad": "bluemoontestToken()", +"b03f75a5": "giveupBid(bytes32)", +"b04010c6": "fuse()", +"b0402d36": "LiveAuctionEvent(address,uint256,uint256,uint256,uint256)", +"b0407315": "purchaseWarehouseSpace(address,uint256,uint256)", +"b0408721": "buyVouchers(uint256)", +"b040d545": "tokenToTokenSwapOutput(uint256,uint256,uint256,uint256,address)", +"b0414a2d": "setMinimumGasLimit(uint256)", +"b0417e98": "checkVote()", +"b0419107": "_getNthNibbleOfBytes(uint256,bytes)", +"b042307d": "_isInterceptableMsg()", +"b0423141": "StringStorage(string)", +"b04247e9": "DentacoinAddress()", +"b04287b3": "sharesOfVault(uint256,address)", +"b0433fe9": "_supportsERC165(address)", +"b0445a77": "PRIME_VESTING_DATE()", +"b04464cd": "ChangeImage(string,uint256)", +"b0448884": "updatePrice(bytes10,uint32,uint64,uint32)", +"b04510d5": "xultoken()", +"b0459d49": "LoanStandard(address,address,uint256,uint256,uint256,uint256,uint256)", +"b0467deb": "getUser(uint256)", +"b0471d43": "primary_wallet()", +"b047dd06": "tokensale(address,uint256,uint256)", +"b047ee56": "getBalance_Token1(address,address)", +"b047f245": "listForSale(uint16,uint256)", +"b047fb50": "cooAddress()", +"b048357d": "lastBlock_a15()", +"b0483c3f": "reload(uint256,uint256)", +"b048546f": "Divide(uint256,uint256)", +"b0485706": "read_u32_array()", +"b048e60d": "FebToken()", +"b049474d": "disableSuicide()", +"b049d176": "cancelSellToBlackMarket(uint256,uint256,bool)", +"b04a1680": "GetConsentDirective(uint256)", +"b04a3f1c": "EndLottery()", +"b04b3f57": "isCustodian(address,address)", +"b04ca7f0": "dateAdmin()", +"b04d6638": "mangeFundAmount()", +"b04e74f2": "Gerritcoin()", +"b04e7668": "createCastleWithToken(address,uint32,string,uint64,uint64,uint64,uint64,uint64,uint64)", +"b04eb639": "subCrystal(address,uint256)", +"b04fc4e1": "superContract()", +"b05005a2": "lock(uint128,string,address,bytes16,uint32)", +"b050b49c": "rewardFoundersAndPartners()", +"b050f83a": "proportion(uint256,uint256,uint256)", +"b051d722": "loadRandom(uint256)", +"b052852f": "approveAllocation(address)", +"b0532349": "_destroyContract()", +"b054058a": "nSign(uint256)", +"b0544308": "newLockTimestamp(uint256)", +"b0545532": "numGamesCompleted()", +"b0547d8c": "deleteShopMods(address)", +"b0557bf1": "updateParams(uint256,uint256,uint256,uint256)", +"b055a62a": "INCRYPTHEDGE(uint256,string,string)", +"b055d1bc": "amountProportion()", +"b055fdf2": "isTarget()", +"b05609ce": "pricegreengrey()", +"b0560eba": "GuardaProva(address)", +"b056561a": "DATE_31_DEC_2022()", +"b056bb81": "RedSoxYankees410()", +"b0573de6": "getDefaultPartitions(address)", +"b0575069": "ap(address)", +"b05784b8": "retreive()", +"b0578878": "translate(address)", +"b05940f2": "getOpenAuctions()", +"b059c177": "_0_name(uint256)", +"b05a0071": "DET()", +"b05a47d9": "VocToken()", +"b05d8096": "setStr(string,uint256)", +"b05e390a": "TokenEther(string,string)", +"b05eb08d": "_isLeapYear(uint256)", +"b05f1b88": "getAmountOfTransactionsInProposal(uint256)", +"b05f99f5": "changeInvestment(address)", +"b05fa837": "patronageContractForUsername(string)", +"b05fceba": "mDepositWallet()", +"b05fef55": "Issuer(address,address)", +"b0603326": "auctionStatus(bytes32)", +"b0604a26": "schedule()", +"b0604a9c": "testCantBuyTokensInStoppedSale()", +"b060b785": "getWithdrawableOperationFeeDatesAndAmount()", +"b060de3a": "withdrawAllOptions(address[])", +"b0619e85": "hasPermission(address,bytes32)", +"b0623074": "frozenTime(address)", +"b063152a": "generateHash(string)", +"b064bb56": "_ltoa(bool)", +"b064ca18": "userForceGameEnd(uint256)", +"b06576f3": "contrBonus(uint256[])", +"b0660c3d": "transfersAllowed()", +"b0667cf8": "queryPrice()", +"b066d3b7": "removeReputation(address,uint256)", +"b066dca9": "MERZhToken()", +"b066ef3c": "cooldown(uint32)", +"b0670cc9": "get_size()", +"b0671381": "isValidWalletSignature(bytes32,address,bytes)", +"b0673d57": "getItemStore(bytes32)", +"b0686584": "incNT()", +"b068776b": "SaleFinished(uint256)", +"b068b5b8": "getRank01()", +"b06939a2": "notEqual(address[],address[],string)", +"b0698763": "subdomainOwner(string,string)", +"b069dbf1": "sendFromContract(address,address[],uint256)", +"b06bcb40": "getAddressInfo(address,address)", +"b06c76d0": "totalMinedSupply()", +"b06df18e": "transfer(bytes20,address)", +"b06df2ae": "GetMyOrders()", +"b06e1e02": "changeTeamWallet(address)", +"b06e64ca": "maxTokensWithBonus()", +"b06eb03f": "DSEasyMultisig(uint256,uint256,uint256)", +"b06ee044": "totalBasicIncome(address)", +"b06eedf5": "getReferralBonusAmount(uint256)", +"b06f4d00": "AICoin(uint256)", +"b06f8d34": "redeemWallet()", +"b06fd1e3": "CRAWDSALE_START_DAY()", +"b06fe82e": "changeEtherRatioForOwner(uint256)", +"b07048d9": "remove_user(address)", +"b0705e44": "getMySword()", +"b070bbd4": "doCalculateRoom(uint256,uint256,uint256,bytes32,uint256)", +"b070bdc6": "all_obstacles()", +"b071cbe6": "hardcap()", +"b071fa2a": "SENC_HARD_CAP()", +"b0720613": "fundingMinInWei()", +"b072bd10": "usedSummReserve()", +"b0732278": "finishICO(address,address,address)", +"b073e2b7": "testMath()", +"b073f52b": "updateBalance(bytes32,uint8,int256)", +"b0756562": "addLottery(string,uint32,uint32,uint32)", +"b07576ac": "delMin()", +"b0759c3e": "lockInBatches(address[])", +"b0773d12": "payAndRemoveInvestor(uint16,uint256)", +"b07741fd": "refresherFee()", +"b077c09b": "readSample(bytes)", +"b0780bd8": "getDonationStats()", +"b0786de9": "NeptunSupply()", +"b078ffe8": "BitcoinUnicorn()", +"b0792570": "beneficiaryStake()", +"b0799375": "nameValue()", +"b079cf62": "getRandomDragon(uint256)", +"b07a3107": "isOraclizeQueued()", +"b07a6735": "processPrivateFunding(address)", +"b07bbefd": "updateValueAndMint(uint256,uint256,int256)", +"b07be1fe": "createThemedSpinner(string,uint256,address,uint256)", +"b07be207": "calculateTicketPrice()", +"b07c76e8": "LoggedDividend(uint256,string,uint8,string,bool,bool)", +"b07e4e34": "_unpackCycleValue(uint256)", +"b07ed982": "setMaxTokenSupply(uint256)", +"b07ee0d2": "erc20TokenTransfer(address,address)", +"b07f0a41": "exercise(uint256)", +"b07f1fa2": "init(address,uint256,uint256,uint256,uint256,uint256,uint256,bool,address)", +"b07f3025": "CROWDSALE_ETH_IN_WEI_FUND_MAX()", +"b081b9aa": "propose_beneficiary(address)", +"b081cfc5": "_thresholdOne()", +"b0827f42": "restrictedTokensDate()", +"b082b9c7": "getOrganisationCount()", +"b0837524": "minIcoTokenLimit()", +"b08428c1": "internalCalc(uint256)", +"b08480d4": "finishSettlement()", +"b08496dd": "_newSpaceshipProduct(uint16,bytes2,bytes2,bytes2,bytes2,uint256)", +"b08510a3": "setdissolvedcontract(address)", +"b0859b6f": "oraclize_setGasPrice(uint256)", +"b085a5af": "getMyWine()", +"b085b9a5": "Example()", +"b08639e3": "getRepAvailableForExtraBondPayouts()", +"b0867a5c": "joinGameRandom(uint8)", +"b086d5aa": "getUriSetCount()", +"b087b8bc": "getWorkflowCount()", +"b0882c4b": "newETHUSDPrice(string)", +"b0883120": "balanceOfBuyer()", +"b0885dd6": "distributeWithTransferFrom(address,address,address[],uint256[])", +"b0891f4f": "setTokenAgent()", +"b0894aa6": "getDateOfAcceptance()", +"b0898886": "claim_devidend_for(uint256)", +"b08a3619": "registerDepositAddress()", +"b08af3dd": "get_participant_num_of_uses(address)", +"b08b3410": "getStraightReleasableAmount(address)", +"b08ba6a1": "view22()", +"b08bbff0": "isUserAllowed(address,string)", +"b08c2915": "JP_winningHash()", +"b08c7730": "feeGame()", +"b08c9bd1": "refuseSale()", +"b08cfb84": "addWhitelistedAddress(address,address)", +"b08d2718": "ReleaseableToken(uint256,address)", +"b08db494": "toAddress(bytes,address)", +"b08e0d3e": "applyRefund(uint256,bool)", +"b08e0f4a": "manualWithdrawal(uint256)", +"b08f8e1d": "setContractHoldBalance(uint256)", +"b08f965e": "SSA()", +"b090c768": "LogSelectWinner(uint256,uint256,address,uint256,uint256,uint256)", +"b09173f6": "viewAffBonus(address)", +"b091a044": "transferRecord(address,address,uint256)", +"b092145e": "whitelist(address,address)", +"b0927de7": "newRepo(string,address)", +"b0933f25": "fixAdvance(uint256,uint64)", +"b0934d7d": "removeFromBlackList(address,address)", +"b0949833": "NineStandardToken(uint256,string,uint8,string)", +"b0950b8c": "canCloseVoteCommitPhase(address,bytes32,bytes32)", +"b09609d5": "LogMinting(address,uint256,uint256)", +"b097bdbd": "PRESALE_STARTTIMESTAMP()", +"b097c984": "setIEOAddress(uint256,address)", +"b098b86b": "ownsOrSelling(uint256)", +"b098bdba": "getAppeals(uint256)", +"b09938b8": "VormaToken()", +"b0994d4a": "authorizeOperator(address,bool)", +"b099cceb": "makeBet(bool)", +"b09ac6f2": "isUserProduct(bytes32,bytes32)", +"b09ad8a0": "upperBound()", +"b09afec1": "getTokenData(uint256)", +"b09b1a51": "buyUnicorn(uint256)", +"b09bc3bf": "try_to_get()", +"b09c0f30": "rewardWeekly(uint32,uint32)", +"b09c235e": "MargamCoin()", +"b09db392": "addressDevelopers()", +"b09df36a": "getFunctionSignatures()", +"b09f1266": "_symbol()", +"b09f168e": "tokenOfOwnerByRange(address,uint256,uint256)", +"b09f4af5": "executeLock(bytes16,address)", +"b0a0662a": "FIRSTSALE_BASE_PRICE_IN_WEI()", +"b0a08873": "adjustLoanParams(uint256,uint256,uint256)", +"b0a1bfa9": "updateFeeBalance(uint256)", +"b0a1c666": "newComment(bytes32,string)", +"b0a1e2b4": "disputeID()", +"b0a2365c": "percentTokensToSale()", +"b0a254a7": "addStackholder(address)", +"b0a267da": "userTipped(address,bytes32,uint256)", +"b0a54a76": "TN()", +"b0a5a57a": "createEmergencyFundReleaseProposal()", +"b0a5c979": "CheckAmbientHumdtyException(bytes32,uint32)", +"b0a66a84": "creator(bytes)", +"b0a6a5ab": "IoTonToken(uint256,string,string)", +"b0a6d947": "unfreeze(address[])", +"b0a77ef7": "WithdrawToSponsor(address,uint256)", +"b0a8489e": "btycBalanceOf(address)", +"b0a84974": "payedBalancesOf(address,uint256)", +"b0a8be37": "RegCost()", +"b0a91659": "FixProfit()", +"b0a94ef7": "Divest(uint256)", +"b0a9b0ff": "createTeam(string,string,uint256,uint256,address,uint256)", +"b0a9c7f4": "checkGameResult(address)", +"b0aa09f2": "mainSaleStartTime()", +"b0aab296": "getNextNode(bytes)", +"b0aae3fa": "passGateway()", +"b0abbc7b": "setData_23(string)", +"b0ac0ef2": "currentActiveGameID()", +"b0ac4c8c": "getLastData()", +"b0acc531": "reserveWave()", +"b0acd745": "EventCreateStatic(address,uint128,uint256,uint256)", +"b0acde14": "withdrawInternal(address,uint256,address[],uint256[])", +"b0ad38c4": "buildCity(string,uint256[2],uint256[2])", +"b0ad3a5f": "not(bool)", +"b0ae1d64": "getpurchaserAtIndex(uint256)", +"b0aed621": "addJugada(uint256,string,uint256,uint256)", +"b0af768b": "setTokenBurner(address)", +"b0b02c60": "setUpdateOperator(uint256,address)", +"b0b185c7": "allowedForwards(uint32)", +"b0b189ca": "sendToInvestor(address,uint256)", +"b0b24e2c": "ERC()", +"b0b2b499": "test_token_fall_back()", +"b0b315e7": "calculateMaxContributionUsd()", +"b0b3c9a6": "ETHERAFFLE()", +"b0b503f9": "MonyaToken()", +"b0b53a1f": "WSKYToken()", +"b0b60b06": "ZXGToken()", +"b0b773c4": "ESSgenesis()", +"b0b8579b": "hop()", +"b0b92263": "setTotalTokens(uint256)", +"b0b9603b": "saleTokens()", +"b0b99c7d": "createPotato(uint256,uint256,uint256,uint256,address)", +"b0ba621a": "SoapBox()", +"b0bb3759": "XPAAssets(uint256)", +"b0bc4d67": "preserveHolders(address,address,uint256)", +"b0bcc610": "scheduleTransaction(address)", +"b0bcd8f3": "preCrowdsaleOwner()", +"b0bd5888": "transferredTokens()", +"b0bdacc6": "setCoinAddress(address)", +"b0bebdf5": "endICOp1()", +"b0bed0ba": "selfBalance()", +"b0bed1e9": "SMSCoin()", +"b0bf092a": "getSoftCapInWeis()", +"b0bfe169": "changeAirdropLimit(uint256)", +"b0c0552f": "AuctionCreated(address,uint256,uint256,uint256,uint256)", +"b0c13bfb": "addDestroyer(address)", +"b0c1adac": "setPrice(uint256,bool,uint256)", +"b0c20e4a": "setRateProvider(address)", +"b0c2a163": "currentDifficultyWei()", +"b0c2ebfd": "NathalieToken(uint256,string,uint8,string)", +"b0c2ff43": "tokenAccountAddress()", +"b0c35c05": "autoBirthFee()", +"b0c39bbd": "setFreezeIn(address[],bool)", +"b0c42691": "frozenWallet2y()", +"b0c4b3bb": "dateEco()", +"b0c5134e": "forwardEther()", +"b0c577c1": "phase3TokenPriceInEth()", +"b0c6d7df": "clearMonsterReturnBalance(uint64)", +"b0c73bc6": "getInvitor(address)", +"b0c74430": "saysomething()", +"b0c7f709": "kingAutomaticCollectFee()", +"b0c80972": "setBalance(uint256,bool)", +"b0c8d2dc": "updateMeta(uint256,uint256,string)", +"b0c8f9dc": "add(string)", +"b0c95b1d": "SetAccess(address,uint256)", +"b0c9fec7": "ButtonClicked(address)", +"b0ca2e62": "VEC()", +"b0cae18a": "WDNA()", +"b0cb3299": "checkIfOnUncle(uint256,uint256)", +"b0cbaab2": "exp(int128)", +"b0cbc8b9": "callContractFunctionByAddress(address,string,address,address,uint256,uint256,bool,bool,string,string,bytes32,bytes32)", +"b0cbe292": "_extendBadges(uint256,address,uint256)", +"b0cbea9f": "updatePoll(uint256,bool,uint256,uint256)", +"b0cc0596": "getUserOptOut(address,address)", +"b0cc3951": "manualEntry(bytes32,bytes32,uint256,uint256,address)", +"b0ccbf8c": "rageQuit()", +"b0cccbc3": "setFreezeOracle(bool)", +"b0cccc84": "validResult()", +"b0ce8668": "IJC()", +"b0cee590": "TwiceAWeekCoin(uint256,string,uint8,string)", +"b0cf0dcb": "revokeTokenGrant(address,address,uint256)", +"b0cf35f5": "getNewFallbackDeposit()", +"b0d08d3d": "setTxCount(address,uint256)", +"b0d12477": "listMAS()", +"b0d138e8": "bounty_percent()", +"b0d13a25": "retrieveEther(uint256)", +"b0d1a26c": "advisorTimeLock()", +"b0d26478": "setIdentity(uint256,address,address,string)", +"b0d2b936": "_isTxExistWithArgs(bytes32,uint256)", +"b0d3a396": "ADDITIONAL_BONUS_NUM()", +"b0d3ef3d": "isOpenFor(address)", +"b0d4ff96": "getMadeTX(uint256)", +"b0d54bcf": "setTradingFee(uint256)", +"b0d56da6": "ElephantToken(uint256,string,string)", +"b0d60c2e": "rawTransferFrom(address,address,bytes32)", +"b0d65d29": "partialWithdrawal(uint256)", +"b0d66291": "migratebyowner(address)", +"b0d79497": "allowOrRestrictMigrations()", +"b0d7fd9a": "NewListing(uint256,uint256)", +"b0d81f94": "lockTokensForFs(address,address)", +"b0d8a83c": "Osmium()", +"b0d8b51f": "getOwnedTokenIds()", +"b0d997d9": "bitGuildContract()", +"b0d9fef9": "udfVUPDestination()", +"b0dbce71": "setStreamityContractAddress(address)", +"b0dc1666": "DacToken()", +"b0dc63eb": "startWineryProductByRegulator(string,string,string,string,int256)", +"b0dcbce5": "payWithPLAT(uint256)", +"b0dd15a6": "paint_pixel(uint256,bytes3,uint256)", +"b0dd2858": "TokenBuyPresale(address,uint256,uint256,string)", +"b0dd478a": "setCountdown(uint256[5])", +"b0ddaddd": "shareBalance(address,uint256)", +"b0de0c40": "getBalancesList(uint8)", +"b0de1cb7": "publish(uint64,bytes,uint64)", +"b0ded9ce": "fechAllCandidates()", +"b0df5f81": "_computeWings(uint256,uint256,uint256)", +"b0df9e53": "getCards()", +"b0e0346e": "UNLB()", +"b0e09ac0": "test_validShouldThrow()", +"b0e0ef09": "withdrawTokensFrom(address,address,address,uint256)", +"b0e12715": "makeTrade(address,address,uint256,uint256,uint256)", +"b0e16cce": "removedotchtooffer(uint256,uint256)", +"b0e1aaa5": "getNumPresaleTokensBought(address,address)", +"b0e1f553": "whiteListingContract()", +"b0e24364": "CaerusToken(address,uint256)", +"b0e37f79": "isChecker(address)", +"b0e4925c": "BCIA()", +"b0e547e8": "referrerLevel2Percent()", +"b0e572c8": "getStrategy(bytes15)", +"b0e5aa82": "_rememberBlockHash(uint256)", +"b0e5aa89": "bonusStage2SecondDay()", +"b0e657a7": "firstMintRound0(uint256)", +"b0e667a9": "bidSpaceship(uint256)", +"b0e757c5": "GameXChange()", +"b0e849fe": "auctusWhiteListAddress()", +"b0e8cba8": "toggleContractAccessForEverybody()", +"b0e9a1ef": "setHodlerTime(uint256)", +"b0ea1e2e": "START_TS()", +"b0ea8d8f": "getRedeemableTokensStaker(bytes32,address)", +"b0eb5162": "closeGeneralSale()", +"b0ebb261": "withdrawGift()", +"b0ebefbc": "distributeFoundersRewards(address[],uint256[],uint256[])", +"b0ec2bed": "test_8_accessRestriction_UnderscoreAddMember_shouldThrow()", +"b0ecc878": "calculateEthToAfterschool(uint256)", +"b0ecca8f": "LookAtLastTimePerZone(uint256)", +"b0ed439e": "getMaxHolder()", +"b0ed656c": "claim(bytes32,bytes32,bytes32)", +"b0ed9774": "changeTakeoutWallet(address)", +"b0ee60a3": "_addLicenseTerms(bytes32,bytes32,bool,uint256,bool,uint256)", +"b0eeefea": "YANKEES(address)", +"b0eefabe": "setArbitrator(address)", +"b0f07e44": "registerData()", +"b0f0c96a": "hello(uint256)", +"b0f11234": "getMessageCommunicationHash(address,uint256)", +"b0f239e9": "totalCheque()", +"b0f23d80": "SetCountryCode(uint16,string)", +"b0f2b72a": "set_value(uint256)", +"b0f32e55": "ContractFactory(uint8,uint8)", +"b0f42dc4": "isPure(uint256,uint256)", +"b0f471dd": "_partFromProvider(uint256,address)", +"b0f5ae72": "exchangeEtherOnTokens(address)", +"b0f69523": "rentOut(address,uint256,uint256)", +"b0f72665": "multiSigDev(bytes32)", +"b0f7d744": "getBoughtTime(address)", +"b0f85a10": "airEndtime()", +"b0f94b16": "batchFishAquarium(uint256[],address)", +"b0f9ba74": "destroyEternalStorage()", +"b0f9f315": "accountClaimedReward()", +"b0fa4926": "buyLicenseForETH()", +"b0fa5032": "DDToken()", +"b0fb3095": "transferDividendBalance(address,uint256)", +"b0fc2c77": "peaceOf(uint256)", +"b0fc2d72": "grantPurchasedTokens(address)", +"b0fc9bdf": "lilitoken()", +"b0fd035b": "safeWithdraw(uint256)", +"b0fd935b": "registerCertificationDb(address)", +"b0ff4210": "BAFC()", +"b1000f23": "_airdrop()", +"b100ad20": "incremCounter()", +"b102bfbe": "getOwner(bytes)", +"b102f52b": "enterLottery(uint32)", +"b103bb58": "setMaximalInvestment(uint256)", +"b103c1dd": "claimCofounditTokens()", +"b103ef5b": "buyfp(uint256,uint256)", +"b10477c9": "getAntsSinceLastCollect(address)", +"b104c509": "earlyInvestorSupply()", +"b1050da5": "newProposal(address,uint256,string,bytes)", +"b105126f": "initLottery(uint256,uint256,uint256,int256)", +"b1057e9c": "sell2(address)", +"b105be51": "BoonyToken()", +"b105c904": "intrepidVouchersMinted()", +"b1063c19": "setMiBoodleVault(address)", +"b106ef69": "Tutoreum()", +"b1077666": "hitWin(uint256)", +"b107baa1": "minimunBTCToInvest()", +"b107e815": "bet(uint32,uint8[4])", +"b107ea12": "setDefaultAQL(uint256)", +"b1084ce2": "currentNorsefire()", +"b108501f": "WINNER()", +"b10908ff": "ACO_Token()", +"b1091e1b": "Ez()", +"b1099347": "buysTokens()", +"b109bc6d": "getUpVoteCount(bytes12,bytes12)", +"b109e894": "PRICE_VARIABLE()", +"b10c7544": "getCmd()", +"b10c7dc4": "revokeMembership(uint8)", +"b10cf224": "userUnlockToken(uint256)", +"b10d539b": "MergeStatus()", +"b10d5a52": "setTechnicalPercent(uint256)", +"b10d6060": "StorageToken(address,address,address[],uint256,string,string,uint8)", +"b10d6b41": "getDocument(bytes32)", +"b10e4172": "remove(bytes32,bytes32)", +"b10eabe8": "ADDOCoin()", +"b10ec8da": "LogPrepareContribution(address,uint256,uint256,uint256)", +"b10ed487": "minimumInvest()", +"b10f8583": "update(uint256,uint256,bytes32,bytes32)", +"b1103200": "poolEthCap()", +"b1110c29": "createTokenUri(uint8,uint8,uint8,uint8)", +"b1112507": "bonusDeadlineDefault()", +"b112349e": "get_my_dni()", +"b1135686": "votesIter()", +"b113d9dc": "tokensale(address)", +"b11408b7": "free1Of(uint256)", +"b1144c9a": "presaleAllocations(address)", +"b114b96c": "left99(uint256)", +"b11560c5": "removeFromWhiteList(address[])", +"b115d28c": "transferDaxsToken(address,uint256)", +"b1174177": "LogWhitelistRemove(address,uint256)", +"b117a3e8": "kingBank()", +"b118060e": "stringLength(string)", +"b1186efb": "decode(bytes,uint256,uint256,uint256,uint256)", +"b11873d1": "BOSX()", +"b11888d6": "testThrowOnTransferWhenNotCreator()", +"b11894c9": "addBadToken(address)", +"b1194648": "setSaleWeiLimitWithoutKYC(uint256)", +"b1194bc4": "setGlobalDelegation(address)", +"b1199a87": "resetMeter(address)", +"b11a19e8": "toString(bytes32)", +"b11a1b89": "setCoinContract(address,address)", +"b11a2a97": "setEDUPrice(uint256,uint256,uint256)", +"b11a41fb": "AfrFballCoinToken()", +"b11b40a1": "getDna2(uint256)", +"b11c4fd8": "approveAndCallcode(address,uint256,bytes)", +"b11cc099": "winPrize()", +"b11ce2db": "addContractAddress(address)", +"b11d8bb8": "revealVote(uint256,uint256,uint256)", +"b11dd097": "initEmployee()", +"b11e0acb": "supplyAvailable()", +"b11e3889": "bulkDepositTo(uint256[])", +"b11e3b82": "createEvent(bytes32,bool,int256,int256,uint8,address,address,bytes32[])", +"b11ec3b3": "MENSA1(address)", +"b1202774": "ico4Max()", +"b120c16a": "setReputation(address,uint256)", +"b120e1ef": "setTokenSaleDistribution(uint256)", +"b12155a9": "burnTokens2(uint256)", +"b121a199": "_transfer(address,address,bytes32)", +"b122a0ef": "joinCommunity(uint256)", +"b1233451": "setTerm(uint256,string)", +"b1237eae": "withdrawAmountTo(uint256,address)", +"b123f68b": "LogAddress(address)", +"b12673b2": "token10MstepCAP()", +"b1267579": "totalTokenRaiseWei()", +"b126d0e5": "createAndSellAllAmount(address,address,address,uint256,address,uint256)", +"b126dc4d": "blockIndex(uint64,uint64)", +"b127221d": "ICO_BONUS()", +"b127326e": "masterTransfersEnabled()", +"b1273db1": "batchSetInvite(address[],uint256[],uint256[])", +"b1275f9a": "addPlayer(address)", +"b1276a42": "addCurrencyExchangeRate(uint256,uint8)", +"b1283e77": "markets(uint256)", +"b1288c11": "bytes32ToString(uint16)", +"b128ca5c": "adjustCap(uint256,uint256,uint256,uint256)", +"b12931a6": "removeByValue(address)", +"b129497c": "john()", +"b12a8229": "tokenSaleEndTime()", +"b12b714f": "_add(uint256,address)", +"b12dca5a": "ergebnis(uint256)", +"b12de559": "invalidateOrdersBefore(address,uint256)", +"b12dff65": "relaxFundingCap(uint256,uint256)", +"b12e1449": "reserveEscrow()", +"b12e3e60": "voltTransfer(address,address,uint256)", +"b12e4410": "getTokenAddress(bytes32)", +"b12e5f09": "OpsManaged()", +"b12e9c41": "SYS_Token()", +"b12ed9ef": "FCOIN1122Token(uint256,string,string,uint256)", +"b12f9eab": "finalizeSet()", +"b12fe826": "addMod(uint256,uint256,uint256)", +"b13170d6": "Change_approvePay(address,bool)", +"b1321ed7": "payOutPercentage()", +"b1330ca9": "startVoting(uint256,string)", +"b133f39b": "_shuffleParams(uint256,uint256,uint256,uint256)", +"b13413b0": "allocateTokensToTeamAndProjects(address,uint256)", +"b1343ee9": "paymentsByUserId(uint256)", +"b1344271": "slasher()", +"b1347e9d": "mintsub()", +"b1356488": "getEndDate()", +"b135bbb0": "nextGameId()", +"b1366d5b": "bet(uint256,uint256,address,bytes32)", +"b1369e6a": "toFullUnits(uint256)", +"b13770af": "determinTID(uint256,uint256)", +"b13795af": "GDCNumber3()", +"b138251c": "fetchAllResult()", +"b138d500": "presaleAmount()", +"b138d838": "getContractEarnings()", +"b139275f": "transferto(uint256)", +"b139560b": "getCreateMarketEndTimeValue()", +"b139af17": "startSpaceship()", +"b139f780": "NRB_Common()", +"b13a2e1f": "chargeOwe(bytes32)", +"b13b4f2d": "wipe()", +"b13b6a2a": "_decreaseApproval(address,uint256,address)", +"b13bdfb6": "isAtMost(uint256,uint256,string)", +"b13c7047": "DragonKingTest(address,address,address,address)", +"b13c8fe0": "BILLION_TOKENS()", +"b13d5180": "checkAndCallApprove(address,uint256,bytes)", +"b13ef343": "Vesting()", +"b13fd2b8": "DividendAvailable(uint256)", +"b1401858": "levelOneBonus()", +"b1404198": "LogForwarded(address,uint256,bytes)", +"b1406a33": "buyNac(address)", +"b140bee5": "testFailBuyAfterClose()", +"b1418cf4": "payHouse()", +"b14201d0": "requestForArtistRegistration(bytes32,bytes32,bytes32)", +"b1429863": "test_oneFalseAssertNoMessage()", +"b1432cc3": "CrowdSale_Change_ReceiveWallet(address)", +"b1437e27": "tokenTotal()", +"b143c703": "createBarCodeData(bytes32,bytes32,int256,string)", +"b143c916": "getTeamPayouts(uint256,uint256)", +"b143d6fb": "setRunning()", +"b144a4d8": "DistributionSale()", +"b144adfb": "balance_of(address)", +"b14537b0": "maxContributor()", +"b145a5b8": "isInit()", +"b145c013": "checkPayout()", +"b146ba8e": "changeQuecoinAddress(address)", +"b146bdee": "cancelDigitalContract(string)", +"b14762bc": "setAirDropDestination(address)", +"b14781fb": "BITBalanceOf(address)", +"b14823e1": "logDisputeCrowdsourcerTokensMinted(address,address,uint256)", +"b148313e": "partnerSaleTokensPurchased()", +"b1483eee": "_TARGET_EPOCH_PER_PEDIOD()", +"b14904b4": "BTCET()", +"b14959dc": "setbonusDate(uint256)", +"b1498e29": "insert(string)", +"b149ece0": "joinPool(uint8)", +"b14a44ac": "_unregisterArtist(address)", +"b14cf5e0": "changeManager(address,address)", +"b14d703f": "Bitsonalite()", +"b14debe4": "getEthPhiRate()", +"b14e7bc1": "_isOperatorForPartition(bytes32,address,address)", +"b14ec275": "_createHero(uint256,uint256,uint256,uint256,address)", +"b14ecf18": "BlackSwan()", +"b14edac5": "destructo()", +"b14f2a39": "changeTreasury(address)", +"b14f6439": "finshCrowdsale()", +"b14f8432": "hasValidSubscription(bytes32,address)", +"b15089b1": "unlockBonusTokens(uint256,uint256,uint256)", +"b151c0c8": "ModuleRegistrar(address)", +"b15201b2": "MIN_TIME_EXPLORE()", +"b1523087": "_transfer(address,uint256,address)", +"b1527bd9": "CYFM()", +"b152f19e": "getFirstSchedulableBlock()", +"b152f6cf": "TOKEN_SUPPLY()", +"b152fbd1": "lockingRatio()", +"b1536051": "_contractFallback(address,address,uint256,bytes)", +"b154224e": "TimeLockMultisig(address,address[],uint256)", +"b1542d39": "_createCrab(uint256,uint256,uint256,uint256,bool)", +"b1546194": "TimeBoxToken()", +"b154dea6": "NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_ID()", +"b154f47c": "dev3Wallet2Pct()", +"b1557c2c": "lastContract()", +"b155c7d6": "devTokensIco2()", +"b155d434": "FINTIFLUSHKA()", +"b15651ff": "emissionPrice()", +"b156f79b": "FeeAddr2()", +"b1574b38": "toggleActive(string)", +"b157528b": "getERC20(address,address,address,uint256)", +"b157add3": "bonus_()", +"b157bfab": "VerEstadoSocio(uint16,uint32)", +"b157c5cd": "setJudge(address)", +"b15868eb": "GetVersions()", +"b15897cc": "setfreeze(bool)", +"b158a23f": "betOpen(uint256,string,string,string,string,bool)", +"b158b63f": "getBillOwner()", +"b1597517": "getPoolState(uint256)", +"b1598725": "CultureTravelFoundationAddr()", +"b159bcff": "COMPANY_ACCOUNT()", +"b159beac": "MINIMUM_QUORUM()", +"b159d61b": "addSellerSig(string,string)", +"b15a3647": "trade(uint256,uint256[3],bytes32,bytes32,uint8)", +"b15a72d8": "wagerPool13()", +"b15aa5b7": "getSignHash(bytes32)", +"b15addec": "Test1()", +"b15b2c29": "GetContractStateEarlyTerminatedByTenantSecDep()", +"b15d6f35": "requestChangeInsurer(address)", +"b15dc523": "minFundInEther()", +"b15dcc25": "query(address,bytes2,uint256)", +"b15fbfe6": "getFromAmountBooks(address)", +"b16020a0": "STBIToken()", +"b160a86b": "setKycHash(bytes32)", +"b1610080": "TravelNote()", +"b1610d7e": "VOTING_PERIOD()", +"b16219c6": "feeWithdrawTokenAll()", +"b1622818": "softWithdrawRewardFor(address)", +"b162a382": "updateName(address,bytes32)", +"b163cc38": "addBalance()", +"b1643e96": "changeFeeEVOT(uint256)", +"b1648152": "setBetMinMax(uint256,uint256)", +"b1649a2d": "cancelOrder(address,address,address,address,bytes32)", +"b1652b2f": "playerRollDice(uint256,address)", +"b16562fe": "fipsRegister(address,bytes)", +"b165a332": "getPercentageBonusForIco(uint256)", +"b1662d58": "setModule(address,bool)", +"b16661bf": "joinAgreement(bytes,uint8,bytes32,bytes32)", +"b166b55a": "LogRemainingHalvingSubsidy(uint256,uint256)", +"b166c1ba": "sendProfit(address,uint256)", +"b167c34e": "getTxAtIndex(uint256)", +"b167d512": "allowedSince()", +"b167fe1b": "getExploreItem(uint256)", +"b168da8a": "getCustodianName(address)", +"b1699e2e": "C(bool)", +"b16a4a52": "TokensUnfrozen()", +"b16a867c": "summary()", +"b16ab3a3": "emergency_token_withdraw(address,address)", +"b16afaf6": "OChain()", +"b16b1e28": "getAddressField2()", +"b16b8485": "setExchangeStart(bool)", +"b16bd58f": "maxTokenlossValue()", +"b16c09f0": "clearIssuanceData(address)", +"b16c9e59": "flexibleReward()", +"b16d0839": "RootsToken()", +"b16d0e38": "IBG(string,string,uint8,uint256)", +"b16d1538": "nonEthWeiRaised()", +"b16d22a0": "StopPaymens()", +"b16d2fd1": "winnerTicket()", +"b16d8622": "maxICOSupply()", +"b16dd130": "baseKernel()", +"b16deab2": "CentrallyIssuedToken(address,string,string,uint256,uint256)", +"b16eaafa": "PetsToken(address)", +"b16f4a3a": "GPaid()", +"b1700e61": "trackAddresses(address)", +"b17076b2": "RemoveProofOfOwnership(bytes32)", +"b1718455": "NUM_COIN_PER_AXIE()", +"b171ae40": "ethSold()", +"b171b18f": "triggerInvestment()", +"b171dee6": "_setCategories(address,uint256,uint256)", +"b17216f5": "mintForwarder(uint256,bytes32,address)", +"b17231ac": "sendTokens(uint64,uint256)", +"b1723215": "TestPersandToken()", +"b17346fd": "finalizeSeedSale()", +"b174734c": "pendingOwner1()", +"b175a0d2": "BONUS_TIER_3_LIMIT()", +"b17607e9": "costoken()", +"b1766617": "ganTokenNoLongerForSale(uint256)", +"b176a0b4": "RabbitArena(address)", +"b1782d18": "tgrNumber()", +"b17922f6": "onlyRoles(address,uint16)", +"b179882d": "RESERVED_PRESALE_CAP()", +"b179f4d8": "G5()", +"b17a56f7": "isTrustedLink(address,address)", +"b17a98b6": "withdrawAllToWithdrawalAddress()", +"b17a9e11": "confirmCustomer(uint256)", +"b17aa196": "_generateNewRandom()", +"b17acdcd": "collectFees(uint256)", +"b17b94c1": "testSystem()", +"b17c3f99": "confirmation(uint256)", +"b17c6ab8": "cancelSaleOrder(uint256)", +"b17d5938": "submitPool(address,uint256)", +"b17d8646": "EpisodeManager(address,address)", +"b17df316": "setMigratedBalance(address,uint256)", +"b17e8c4f": "tokensForplutonics()", +"b17eb9dc": "supporthill(uint256)", +"b17f0c1c": "tokenSaleWeiCap()", +"b17f5332": "EnterCode(uint256)", +"b17fc36d": "setSoftCapDeadline(uint256)", +"b18019bd": "_executeVote(uint256)", +"b1816f60": "TEMTicket(address,uint256,uint256)", +"b181954d": "addAttribute(string,bool,bytes32,string,string)", +"b18196f4": "GenexiToken()", +"b181a8fc": "resetContract()", +"b181d3d5": "GMF()", +"b1826ee7": "getLevelUpFeeByLevel(uint256)", +"b1829738": "setContractorsProfitAddress(address)", +"b184be81": "drain(address,uint256)", +"b18588fb": "updateGravatarName(string)", +"b185a8a4": "ChangedTokens(address,uint256)", +"b186eed8": "dealerDay()", +"b1871886": "growthReserve()", +"b1874b99": "INVESTMENT_USER1()", +"b187984f": "disableTransfer()", +"b187b6b1": "getBlockValueBalance()", +"b187bd26": "isPaused()", +"b1881225": "KEYS(uint256,string,uint8,string)", +"b188c70d": "feeMode()", +"b1895823": "mintMultiToken(address[],uint256[],uint256)", +"b189ad2a": "testErrorUnauthorizedAfterTransfer()", +"b189fd4c": "hash(uint256)", +"b18a02a4": "getPlayers(uint8)", +"b18a714e": "getReservedBalance(address)", +"b18a78e3": "currentBetAmount()", +"b18af4e3": "addProduct(bytes32,uint256,string,string,string)", +"b18bca4d": "countAbstentions()", +"b18c6847": "manualUpdateBalances()", +"b18d0c80": "getImageWidth(uint256)", +"b18de618": "EndQuestion()", +"b18e0ab8": "FooWallet(address[],uint256)", +"b18e4f5f": "appendKeyValue(string,string)", +"b18ef18c": "GlobalChain()", +"b18efff3": "GenesisCatsAdded(bytes5[16])", +"b18f1943": "ownersLength()", +"b1905727": "getPermissionManager(address,bytes32)", +"b19068c7": "minimumWager()", +"b19129b1": "addCustomertoBL(address,address)", +"b19183f2": "HodlReleased(bool)", +"b191f79d": "isJobStart(uint256)", +"b19208f3": "getPreIcoFunds()", +"b192da2d": "burnt()", +"b1933a0b": "getAllSharedAccounts(bytes32)", +"b1934151": "tokenScaleFactor()", +"b1936c24": "presaleOngoing()", +"b194073a": "getUmkaAddress(address)", +"b194c73a": "EpinToken(address,address)", +"b196aabb": "maximumBaseContribution()", +"b196f378": "weiLiquid()", +"b1972567": "lockAddresses(address)", +"b1976a02": "Get()", +"b197997a": "getCurrentYearMinedTokenCap(uint256)", +"b1987c7d": "NotaryPlatformToken()", +"b1989a2b": "calculateFadeoutToPool(uint32,uint256[9])", +"b198ef45": "checkVotingForAllowTransfer()", +"b1999937": "leapYearsBefore(uint256)", +"b19a4540": "allocatedEth()", +"b19a5f62": "placeOpenPurchaseOrder(address)", +"b19ab052": "withdrawEtherManually()", +"b19ab945": "maxBurnThreshold()", +"b19b1550": "FintechnicsPublic()", +"b19b2162": "refundFailedAuctionAmount()", +"b19bc02e": "Griddeth()", +"b19c0f5e": "registerForCompetition(address,address,address,address,address,uint256,uint8,bytes32,bytes32)", +"b19d134d": "reviseNumAvailable(uint256,uint256)", +"b19d4916": "setCompte_2(string)", +"b19d632b": "publish(bytes32,uint256)", +"b19e288c": "set_pauseCWC(bool)", +"b19f30e2": "changeKYCAddress(address)", +"b19faed8": "doSucceedingApprove()", +"b19fde5a": "getPresaleAllocation(address)", +"b1a00406": "getactendlen()", +"b1a0570d": "mintBIX(address,uint256,uint256,uint256)", +"b1a06ee7": "setPreSaleTokenExchangeRate(uint256)", +"b1a08010": "orderTrader(bytes32)", +"b1a11c92": "trashedTokens()", +"b1a1318a": "HolderAddress(uint256)", +"b1a1b3bc": "get_chronus()", +"b1a2bbd1": "TOTAL_TOKEN_CAP_OF_SALE()", +"b1a329d7": "optionPoolTotal()", +"b1a34e0d": "addClaim(uint256,uint256,address,bytes,bytes,string)", +"b1a3c6b4": "Balances_of(address)", +"b1a56055": "add_OEM()", +"b1a6676e": "isBurnActive()", +"b1a681c8": "receiveEtherAndData(bytes)", +"b1a6afd3": "declaration()", +"b1a7c005": "hashDelegatedTransfer(address,uint256,uint256,uint256)", +"b1a82e8f": "Jaak()", +"b1a8b25a": "returnBalanceToMainAccount()", +"b1a96135": "DMT_TotalSuply()", +"b1a997ac": "poke(address)", +"b1a9bd77": "settlementIsRunning()", +"b1a9f8a4": "_toString(bytes32[4],uint256,string)", +"b1aa6dfa": "finishInitOwners()", +"b1aac629": "addSoundEffect(uint256,uint8[])", +"b1ab0999": "supportKickoffQuorum()", +"b1ac478f": "_generateBattleReward(uint256,int32)", +"b1ad4c48": "getInvestorDividendsAmount(address)", +"b1adc241": "BalanceDB()", +"b1ae9017": "refundsall()", +"b1ae9887": "lastTreeId()", +"b1afe96b": "setMaxInvestorContributionInWei(uint256)", +"b1b2aef3": "testInsertProductIntoCart()", +"b1b30533": "contractTokenWithdrawToFreeTokens(address,uint256)", +"b1b3d3f6": "allow()", +"b1b5537c": "activateCycle(uint256)", +"b1b68cce": "getListIndices(address)", +"b1b68fad": "makeTradable()", +"b1b6a6ed": "addPremineAllocation(address,uint256)", +"b1b6aecb": "SLMToken()", +"b1b79120": "setFightFactor(uint8)", +"b1b7c88f": "getPreSaleBonusRate(uint256)", +"b1b82922": "_getProviderRateHistory(uint256,uint256,uint8)", +"b1b96fdf": "giveTokens(address[],uint256)", +"b1b9e78d": "acceptOffer(address,uint256)", +"b1ba6ad7": "privateSaleAddress()", +"b1bb1a60": "serviceGroupChange(address,address,uint8)", +"b1bb4d35": "proxyMint(uint256,bytes32)", +"b1bb5855": "maxTicket()", +"b1bb5fde": "runningDebt()", +"b1bb7e0f": "verificationPeriod()", +"b1bbc6f5": "onlyBouncerSetGasRefund(bool)", +"b1bbd453": "winnerWithdraw(uint256)", +"b1bcc1b7": "depositOrder()", +"b1bd7683": "maxAvailableForSale()", +"b1bd7b80": "transEther()", +"b1be53e9": "getCancel(bytes32)", +"b1beb3c0": "NonActivationWithdrawal(address[2],uint256[7],uint8,bytes32[2],uint256)", +"b1bf0510": "getJobsBoard(uint256)", +"b1c0e063": "cancel(address[3],uint256[4])", +"b1c0f2df": "maxWithWhitelist()", +"b1c16a2b": "HARD_CAP_TOKENS()", +"b1c19c4d": "LetItPlayTokenPromo()", +"b1c23704": "myMethod3(string)", +"b1c23ce6": "saleContributions()", +"b1c25586": "lockTokens(address,uint256)", +"b1c30210": "setValidationData(uint16,uint16,uint8,uint8,uint8,uint8,uint16)", +"b1c32b2b": "updateAngelLock(uint64,bool)", +"b1c3c97e": "increaseTotalWinningStake(uint256)", +"b1c4b70d": "confirmLawfulness(bool,bytes32)", +"b1c5f992": "setAffiliateRate(uint256)", +"b1c62e8a": "createProductionUnit4()", +"b1c6517a": "LookAtNumberOfPlayers()", +"b1c6f883": "recordCreate(address,uint256,int256,bool)", +"b1c73525": "getKeccak256(uint256)", +"b1c8ac52": "minEthToContribute()", +"b1c90f6f": "ClaimingTimeLimit()", +"b1c9cc6c": "getSBounty()", +"b1c9fe6e": "phase()", +"b1ca3b3a": "_icoTokens()", +"b1cb0db3": "expires()", +"b1cb267b": "getE()", +"b1cb4217": "betContractUP()", +"b1cb43bf": "tokenToExchangeSwapInput(uint256,uint256,uint256,uint256,address)", +"b1cb574b": "setEarlyParticipantWhitelistMultiple(address[],bool[],uint256[],uint256[])", +"b1cb9425": "private_kill()", +"b1cc1d4d": "depositAndBundle(uint256)", +"b1cc38d0": "setShortPositionExpired()", +"b1cc4348": "placeWager()", +"b1cc7c60": "mintInterest(uint256)", +"b1cd221a": "redeem(address,uint256,string)", +"b1cd79de": "setlockaddress(address,uint256)", +"b1cdbe2a": "ELTC()", +"b1ce0a9b": "nextPayoutBlock()", +"b1ceb746": "acceptContribution(address,uint256)", +"b1cedd89": "PayPerkToken()", +"b1cee330": "arrayOfTokensByAddress(address)", +"b1cf404b": "sendTokensToOneAddress(address,uint256)", +"b1d006d6": "extendICO(uint256)", +"b1d0073b": "updateMaxNumMC(uint256)", +"b1d05422": "SendEmail(string,string)", +"b1d06c46": "moduleHandler(address[])", +"b1d0b725": "sellStatus()", +"b1d0fbc5": "uraniumplusToken()", +"b1d11f23": "setVesting(address,uint256,uint256,uint256,uint256,uint256,bool)", +"b1d17c98": "distributeTokens(address)", +"b1d1a159": "curRefNumber()", +"b1d1fed9": "multisigDXF()", +"b1d2372b": "JumboToken(string,string,uint256,uint256)", +"b1d27e3f": "setSmallPrice(uint256)", +"b1d3ea61": "salesContract()", +"b1d45fad": "HoneyBadger(address)", +"b1d4e357": "addTokenToFund(address,uint256)", +"b1d5114c": "Hawk2(uint256,string,string)", +"b1d51d31": "pay(uint64,address)", +"b1d66003": "getRareItemInfo()", +"b1d6a2f0": "saleAgent()", +"b1d7ee21": "discountMultiplier()", +"b1d919ed": "LogCertifierDbChanged(address,address)", +"b1d9647e": "ecoBuilder()", +"b1db1cac": "gameGetTokenBankrollList()", +"b1db9c2e": "WordCoin()", +"b1dbb87a": "DEVELOPER_FEE_PERCENTAGE()", +"b1dbeb37": "PRTC()", +"b1dce014": "buildTeamMapping(uint256)", +"b1ddf52f": "getAuctionByIndex(uint256)", +"b1de4f0f": "setOwnerMaster(address,address)", +"b1de74d6": "LOG_SpinsContainerInfo(bytes32,address,uint256)", +"b1e045f7": "sponsoredJackpotMax()", +"b1e05e8a": "extractBytes32(bytes,uint256)", +"b1e19d45": "whitelistBurnFrom(address,uint256)", +"b1e1c18f": "addToManagementWhitelist(address)", +"b1e1ff3a": "tokenMetadata(string)", +"b1e254c7": "mock_clear()", +"b1e2a116": "playersToTotalBets(address)", +"b1e2cb03": "newLottery()", +"b1e2e1dc": "rollRoom(uint256)", +"b1e2e28c": "YUPIE_PER_ETH_SALE()", +"b1e3301f": "checkFlags(uint16,uint16)", +"b1e35242": "getMeOutOfHere()", +"b1e37921": "setDefaultMintingAddress(address)", +"b1e3dd57": "availableTokensAmount()", +"b1e50702": "setConfigSetupContract(address)", +"b1e5e2b7": "openBox(uint256)", +"b1e776e3": "updateMarketCap(uint256)", +"b1e834b0": "totalPreSaleTokenIssued()", +"b1e8aea8": "turnBackTime(uint256)", +"b1e8cca8": "openWormhole()", +"b1e9292f": "min256(uint256,uint256)", +"b1e9932b": "claimAndConvertFor(address[],uint256,uint256,address)", +"b1e9b21d": "deletePokemon(uint256)", +"b1e9ee64": "addressChangeRequests(address)", +"b1eac37e": "jackpotAmount()", +"b1eb2c10": "getForecast(bytes32,bytes32)", +"b1ebcce1": "setTxcode(uint256,uint256,uint256)", +"b1ecb343": "recentPlayersBack()", +"b1ed795e": "withdraw_all_eth()", +"b1ed8c99": "stageFourEnd()", +"b1eefcc1": "_changeOwnership(address,address,uint256)", +"b1ef2e97": "setXPROMO_MULTIPLIER(uint16)", +"b1efbd6f": "setMinimumEthereumToInvest(uint256)", +"b1efc755": "operationAmount()", +"b1efeece": "assignedSupply()", +"b1f0a72f": "getSubmittedStateRoot(uint256,uint256)", +"b1f0e40b": "finanVestingStage()", +"b1f253f6": "theDividendsOf(bool,address)", +"b1f25ffe": "calcFutureDebt(address,uint256)", +"b1f29590": "totalTulipCount()", +"b1f2e537": "setIsTokenTransferOpen(bool)", +"b1f32231": "awe()", +"b1f35246": "setActualMinerAddress(address)", +"b1f395ea": "addPauser_(address)", +"b1f3b35c": "listeners(uint256)", +"b1f3ec87": "SafeasyToken()", +"b1f42430": "ZitKOINCrowdsale(uint256,uint256,uint256,address,address)", +"b1f4ff90": "filters()", +"b1f525c6": "counter(uint256)", +"b1f56187": "debugBuy()", +"b1f5b6da": "setTokensLimit(uint256)", +"b1f6bd0d": "deleteInvoice(bytes32)", +"b1f7cec8": "sendRemainingETH()", +"b1f8100d": "proposeNewOwner(address)", +"b1f864fb": "diamondIndexToOwner(uint256)", +"b1f9275f": "ENJ_UNIT()", +"b1f99cd5": "blockDotCoinbase()", +"b1fa884d": "FixedChain()", +"b1fc0792": "ICO_LEVEL_5()", +"b1fc756f": "getRefBonusPercent()", +"b1fc8466": "MAX_AVAILABLE_JOINTTOKENS()", +"b1fca956": "endTimeRound1()", +"b1fe1b4a": "weiRaisedICO()", +"b1fe3eef": "buyTokensFor(address,bytes32,uint256,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"b1fe5f58": "BIDDED()", +"b1fe933d": "incrementRedemptionAddressCount()", +"b2016bd4": "collateralToken()", +"b2019b8a": "EmtCrowdfund(uint256,uint256,string,string)", +"b202a9f4": "ERC223MintableToken(string,string,uint8,address)", +"b203bb99": "balance(address,address)", +"b204bb5d": "AddTicket()", +"b2057a6f": "inquireDividentAmount()", +"b205feb7": "stringToUint(string,int256,string)", +"b2067bd6": "ETHs(uint256,string,uint8,string)", +"b206eb42": "getImageDescriptor(uint256)", +"b207e32b": "testChangeRole()", +"b2085903": "Winner(address,uint32,uint32,uint32,uint256)", +"b208a600": "Nordic()", +"b20953f2": "isFiscal(bytes32)", +"b20a459d": "ZZZToken()", +"b20a4abb": "LogCustomSale(uint256,uint256,uint256,uint256)", +"b20a8779": "transferPreICOCollected()", +"b20b0ef5": "getAvailableCardCount()", +"b20b8403": "updateClaimFee(uint256)", +"b20baa00": "RegisteredToken(address,uint256,address,address)", +"b20bf95b": "setYearlyUSDSalary(address,address,uint256)", +"b20c0e43": "PHASE1_RATE()", +"b20c9f8b": "sellMaximumPossibleAmountOfTokens()", +"b20cc590": "allowedRoles(uint8)", +"b20cedc3": "getAdmin(address,bytes32)", +"b20d30a9": "setDailyLimit(uint256)", +"b20d3b1c": "vestingReleased(uint256,uint256,uint256,uint256,uint256)", +"b20de8f3": "TECHNOToken()", +"b20debeb": "Duckcoin()", +"b20e5a79": "getdecimals()", +"b20f41ab": "updateBaseComparable(int256)", +"b21089dc": "removeInvestmentPackage(uint256)", +"b210dac9": "confirmTransactionSig(bytes32)", +"b210e434": "functionThree()", +"b210f639": "PlatformAutonomyAddr()", +"b2112ce6": "beerContract()", +"b21287ae": "ToOwner()", +"b212a23e": "ethConvertRate()", +"b2138754": "verifyDocument(bytes32,bytes32[])", +"b213d77d": "editBalanceOf(address,address,uint256)", +"b2141ba4": "assertCompareBalance(uint256,uint256)", +"b21457e3": "getInvestorByIndex(uint256)", +"b214691c": "setAgent(address,address,bool)", +"b2148d38": "getBasicExtraBallotFeeWei()", +"b214ecda": "createGift(uint256,string,string)", +"b214faa5": "deposit(bytes32)", +"b215814b": "emtpyTo(address,address)", +"b215a879": "cg()", +"b215d2c9": "getCertainProducts(address,uint256,uint256,uint256,uint256,uint256,bool)", +"b215f30c": "changeWhitelist(address,address)", +"b2163482": "lockedAt()", +"b216c15d": "copyPopRequest()", +"b2170394": "getLastPaperFromContract(address,address)", +"b2173afd": "setzAddressesArray(address[2])", +"b21800d0": "TokenTransaction()", +"b2185bb1": "drawWinner()", +"b2186b05": "CrowdsaleSoftCapReached(uint256)", +"b2189168": "updateGame(uint256,string,uint256)", +"b2189d5a": "GetUserPELOBonus(address)", +"b218cf15": "registerToPool(address)", +"b2194fd8": "UinfoToken()", +"b219610a": "getRegionPurchasedAt(uint256)", +"b219c852": "firstStageTotalSupply()", +"b219e87b": "deleteCandidateByIndex(uint256,address)", +"b21a8be0": "isSuccessfulIco()", +"b21bce4c": "vote(bytes,bool)", +"b21c2475": "getWeiForRefund()", +"b21c2a68": "changeBZRxTokenContract(address)", +"b21ce425": "amountToTransfer()", +"b21cee7d": "get1TokenBuyPrice()", +"b21e4ebd": "itemOfOwnerByIndex(address,uint256)", +"b21ed44e": "percentForSale()", +"b2205a38": "xcertKyc()", +"b2210c91": "cashBalanceOf(address)", +"b22175db": "GetLikeCount()", +"b2225351": "verify(uint8)", +"b222cb0b": "selfRegister(bytes32)", +"b2237ba3": "setRatio(uint256)", +"b223d285": "releaseVanityUrl(string)", +"b2240566": "EOJ()", +"b2246f43": "Result(bytes32,address,uint256)", +"b224c40a": "vote(uint8,string)", +"b22528e4": "getUserEventsByIds(address,uint256[])", +"b225c23f": "updateCredit(address,uint256,uint256,uint256)", +"b225e08a": "whiteListTime()", +"b226ec29": "Gov(uint256,string,uint8,string)", +"b2280b48": "chairmanOf(uint256)", +"b2281442": "setMaxAbsKindness(int256)", +"b2288649": "lotteryBalance()", +"b22a7bfa": "migrateBalances(address,address[])", +"b22b2b66": "setKYCFull(address[])", +"b22c14c7": "multiPartyTransfer(address[],uint256[])", +"b22d9f50": "GallerionCoin()", +"b22dd140": "assetStaker(bytes32)", +"b22dd2ca": "R1()", +"b22e6fee": "get_pre_kyc_iconiq_bonus_denominator()", +"b230642d": "createSubscription(uint256,uint256,uint256)", +"b23096e9": "tokensTeamBlockedTimestamp()", +"b230eda1": "stageTwoSupply()", +"b2310cc5": "payRequstedSum(uint256,uint256)", +"b231e5cd": "STAGE_FOUNDATION()", +"b2322c40": "RabtestToken()", +"b2353d69": "updateRightLottery(address)", +"b2355b42": "setHomeDailyLimit(uint256)", +"b2356ad4": "tradingFeePercentage()", +"b2357392": "NewToken(uint256,string,uint8,string)", +"b23605eb": "PALToken99(uint256,address)", +"b2369f12": "getLockAccounts()", +"b236a3c9": "updateminAmount(uint256)", +"b236b068": "totalAlloctedToken()", +"b2378428": "LetsbetToken(address,address,address)", +"b237f7d4": "burnTokens(address)", +"b238724b": "setPendingValue(uint256,uint256)", +"b2389da8": "balanceOfFlurbo(address)", +"b238ad0e": "getDaysInMonth(uint8,uint16)", +"b2394040": "rateThirdWeek()", +"b239e2f1": "adventureHandler()", +"b23a0b90": "Henfruit()", +"b23a31e4": "getBrickIds()", +"b23b369b": "getPokemonLevel(uint256)", +"b23b4dd4": "incrementOwnedArea(address,uint256)", +"b23bc656": "setOverdraft(uint256,uint256)", +"b23c1f19": "mintTokenRewards(address,uint256)", +"b23c298c": "getNumberOfPayoutsForStaker(uint256,uint256,address,uint256)", +"b23d36b0": "isCheckStage()", +"b23d4854": "setTokenContractAddress(address)", +"b23db1be": "subtoken(address,uint256)", +"b23e35bf": "readLoveStory(bytes16)", +"b23f3594": "updateTeam(address)", +"b2401e1e": "nextDisbursement()", +"b2406905": "whoHasTheBiggestDick()", +"b240798e": "withdrawBet()", +"b241a020": "freeGameLockedToken(address,uint256)", +"b241b3b5": "getHarvestOperation(string,address)", +"b241ff03": "passPeriod()", +"b2427755": "minTrade()", +"b242c9c3": "getAmountRegistered()", +"b242e534": "transferOwnership(address,bool)", +"b24374a2": "omg()", +"b2444a70": "getParentA(uint256)", +"b2449d65": "YES()", +"b244b268": "SeeleCrowdSale(address,address,address)", +"b244c3f3": "ddftFundDeposit()", +"b2450b15": "openSoldTokens()", +"b24539a9": "getIcoTime()", +"b245923e": "proveIt(bytes32)", +"b245d6da": "coinIssuedIco()", +"b245fc92": "findNextMonth(uint256,bytes)", +"b2461b15": "upgradePermissionedSC(address,address)", +"b24626e9": "setAODevTeamAddresses(address,address)", +"b2467742": "CryptoPhoenixesCivilWar(address,address)", +"b2471e8e": "Fart(string)", +"b2478cfe": "recoveredIndex(address)", +"b247c525": "amountNeedToBeLock()", +"b247ed92": "getAllShipStats(uint32[])", +"b2481048": "newGlobalChanceNo()", +"b248e436": "IsBoilerExpire(address,uint256)", +"b248e4e1": "orderPriority(bytes32)", +"b2494df3": "getModules()", +"b2498a1f": "setPercent1(address,uint256)", +"b249bf01": "sendtoC(uint256)", +"b24a5425": "_setRoleCapability(uint8,address,bytes4,bool)", +"b24b09fd": "RefundEvent(address,uint256,uint256)", +"b24bf695": "getInvestorsAddresses()", +"b24c0a38": "setPreSaleParameters(uint256,uint256,uint256,uint256)", +"b24c35e4": "getRoundBetOrigin(uint256,uint256,uint256)", +"b24cb812": "removeAllowCnsContract(bytes32,address,bytes32)", +"b24ce5fa": "thirdCheckpoint()", +"b24d0c84": "addDat(string,string)", +"b24d8de2": "failedTemperaturesAt(uint16)", +"b24dced3": "setTransferFeeMin(uint256)", +"b24ec0b0": "LogStudentCertified(address,uint256,address,bytes32)", +"b250ce21": "CMC()", +"b251eb05": "MemberAdded(address)", +"b2523b67": "getReferenceAddressesOfCode(bytes32)", +"b252720b": "healthCheck()", +"b252ff2b": "threeHotHoursTokensCap()", +"b25302f6": "WineSupplyChain(address)", +"b25310b0": "DdosToken()", +"b25461ec": "cancelRequestPause()", +"b2549717": "setCalFactor(uint32,uint32)", +"b2550a53": "maxCyclePlayersConsidered()", +"b2552fc4": "annualInterest()", +"b2561417": "setMinimumGoal(uint256)", +"b2563a1b": "getMinimumLimit()", +"b256b093": "reservedForFounders()", +"b256dd6e": "WhosTheBossNow()", +"b2570b1c": "getBattleCardInfo(uint256,uint256,uint256)", +"b258eacf": "totalSupplyInt()", +"b2594125": "SurgeToken()", +"b2596a67": "levels(uint256)", +"b2596acd": "setForRent(uint256,uint256,uint256)", +"b25a00fd": "nativeToErcBridgesAllowed()", +"b25a7a9d": "calculateOwnership()", +"b25a80f4": "StoppableShareable(address[],uint256)", +"b25af26f": "applyForVisa(uint256,uint256)", +"b25ba6a7": "refundContribution(address,uint256)", +"b25bb3a7": "ownersGeneration()", +"b25c22b2": "approveMotion(uint256)", +"b25c372e": "prolongate(uint256)", +"b25cdccf": "fundingState()", +"b25e6181": "UnanimousConsent(address[])", +"b25e8973": "LBN()", +"b25ebbad": "_issueBitmark(address,bytes32,int256,uint256)", +"b25f539d": "registerUser(address,address,string,uint256)", +"b25f692a": "validateAndGetPurchaseTokens(address,address,uint256)", +"b25f8596": "PUBLIC_SALES_1_PERIOD_END()", +"b25fa92c": "adminAddRole(address,string)", +"b26041a1": "DELL()", +"b260c42a": "activate(uint256)", +"b26140f3": "BoBToken()", +"b261ce9c": "IsThisPublic()", +"b261f82f": "releaseAll(uint256,uint256)", +"b26209f6": "remainingFundsToEndAuction()", +"b2627ec0": "buyPriceAt()", +"b263c00c": "setV_R2(uint256)", +"b263f638": "minimalRewardedBalance()", +"b263f865": "usdPerHundredEth()", +"b263fb3f": "updateBasePriceAndMarketCap(uint256,uint256)", +"b2667cd0": "currentInvestment()", +"b266b828": "_sendTo(address,address,address,uint256,bytes,bytes,bool)", +"b266c661": "startDates(uint256)", +"b267f998": "addressFundBonus()", +"b2683aa6": "numberOfWagersToFinalTimeout()", +"b2684945": "usdSale(address,uint256)", +"b2686774": "sendFunds(uint256,address)", +"b269681d": "destination()", +"b269d584": "insertValue(uint256)", +"b269eaff": "imageGenerationCodeMD5()", +"b26b4b6a": "feesOwedToOperator()", +"b26b4f25": "changePrice(string)", +"b26c9779": "changeApproval(address,bool)", +"b26d9d6e": "IntermediateVault(address,uint256)", +"b26e4aed": "test_set_get_PremiumFactors()", +"b26eafe4": "lockUntil(uint256,string)", +"b26ee15c": "interfaceFreezeTokens(address,uint256)", +"b26ee5fe": "getTotalF4()", +"b26f72a4": "withdrawJOYTokens()", +"b26f78d3": "acceptNextManager()", +"b26f7efc": "startGame(uint256,int256,address[])", +"b270b209": "BlocklanceContractHolder()", +"b27201ca": "investedFrom(address)", +"b272fa2d": "getMyHipster()", +"b273952a": "_isUserInternalLock()", +"b2741997": "BAIRON()", +"b274e48e": "setSaleStatus(bool,bool)", +"b2758411": "setUserDisplayName(string)", +"b275a9d8": "PackageContract()", +"b275ba3a": "registerUser(address,address,string)", +"b2774b17": "createOrSet(string,uint256,string)", +"b2775b02": "genBaseStats(uint256)", +"b2787e0c": "changeTransferAgentCA(address)", +"b2788540": "manuallyConfirmDonation(address,uint256,uint256,string,string)", +"b278b8df": "updateVoteInfo(address)", +"b27913a6": "LedgerUpdated(address,address)", +"b2792811": "getFreelancersJobContracts(address[],uint256)", +"b27a1f63": "horseFS(uint256)", +"b27b0755": "earlyBirdsSupply()", +"b27b7dd1": "removeStage(uint8)", +"b27b8415": "dailyHashExpires()", +"b27bcaea": "startBetBlue()", +"b27c0ccb": "ETASToken()", +"b27c4b92": "buyCore(address,uint256)", +"b27c4cde": "ethereumhorse()", +"b27d31de": "bulkTransferEther(address[],uint256[])", +"b27daded": "processorAddress()", +"b27e7244": "addDestinationChain(bytes8,address)", +"b27ea08d": "tokensRemainingPreIco()", +"b27eb3e5": "airDrop(uint16)", +"b27f829e": "removeNetworkMember(address)", +"b27f88fb": "endFifthWeek()", +"b280055b": "roleSetup(address)", +"b280a7e7": "changeSender(address)", +"b280a96e": "setUseAddr(address)", +"b280f180": "setRates(uint8,uint8,uint8)", +"b2813f19": "withdrawOrderTo(address,uint256)", +"b28175c4": "stor()", +"b281c478": "currentCluster()", +"b28241f9": "getCityPopulation(uint256)", +"b283f2f1": "accessoryDataContract()", +"b28448f4": "NewDeposit(uint256,uint256,uint256,address)", +"b2849055": "resetBalanceOfValues()", +"b284fc29": "investorsTokensPercent()", +"b285041d": "Satoshi()", +"b2852bec": "saveCash(address,uint256)", +"b2855b4f": "setFeeAddr(address)", +"b285643e": "leaderboardDataContract()", +"b2860396": "setstart(uint256)", +"b286a346": "SimpleAIToken(uint256,string,uint8,string)", +"b286ba8c": "heapSort(uint64[])", +"b2879d45": "setDRSCoinAddress(address)", +"b288d748": "reduceLockingTime(uint256)", +"b2893ba5": "next_balance()", +"b28945a5": "setApprovalForAllByContract(address,address,bool)", +"b28b3a6e": "famedStarNameToIds(bytes32)", +"b28bb2a0": "setStorageTime(uint256)", +"b28bf6af": "decreaseClaimsBalance(address,address,uint256)", +"b28c461c": "TOKEN_RATE_BASE_RATE()", +"b28c48bb": "NecashToken()", +"b28c747d": "getSentTransfersCount()", +"b28e5904": "Xflip()", +"b28eed93": "Listed_NotValidated(uint256,string)", +"b28f1433": "BHNNetwork()", +"b28f1ee3": "reserveSeats(uint256[],uint256)", +"b28f4c60": "isEmptyString(string,string)", +"b28f53fe": "setMinimumTokensForPurchase(uint256)", +"b28f6fa3": "isOnAuction(uint64)", +"b28fc973": "getEthBalanceOf(address)", +"b28fd472": "miaomiao()", +"b290ae06": "shrToken()", +"b290b9ce": "resetAllDelegations(bytes32)", +"b290e45b": "BonusIssued(address,uint256)", +"b2910826": "set_payments_processor(address)", +"b29120fe": "getHeartPrice()", +"b291820b": "Etherich()", +"b29212b5": "delAudit(address,address)", +"b2923cff": "TAXRATE()", +"b2931096": "hasClaimed(address,uint256)", +"b29387e5": "payWinnerManually2()", +"b295a00e": "getLimit()", +"b2963db6": "closeDailyInvest()", +"b29775c1": "isDiscountValue()", +"b297a35d": "_redeem(bytes32,address,address,uint256,bytes,bytes)", +"b298247e": "gift(uint256)", +"b2983281": "largeCapLimitOf(address)", +"b2984858": "ico1cap()", +"b2990de1": "getByToCount(uint256)", +"b299708d": "dspRegistry()", +"b29a0308": "logAnonymous(bytes,bytes,bytes,uint256)", +"b29a08f7": "ContractMadePermanent(string)", +"b29a3cfd": "getPI_edit_13()", +"b29a61c1": "investorBalances(address)", +"b29ae23f": "getDateOfSignature()", +"b29b3511": "getSpaceshipUpgradeTotalSoldByModel(uint16,uint8)", +"b29b5366": "setRentable(bool)", +"b29b5be7": "getMintAdminApproval(address,address)", +"b29b686a": "isWarrantyValid(address,string,string)", +"b29c2493": "token(uint256,string,uint8,string)", +"b29c62f4": "myAccount()", +"b29cbcec": "LogChangeMultiSigAddress(address)", +"b29d7914": "getRefResults(uint256)", +"b29e201c": "spread(address,address[],uint256[])", +"b29e9909": "sCVars()", +"b29f0835": "doIt()", +"b29f2e77": "sendWarriors(address,address,uint256)", +"b29f731d": "__tinyOracleCallback(uint256,bytes)", +"b29f7f9e": "removeODEMClaim(address,bytes32)", +"b29f9d3b": "unfreezeAccountWithToken(address,uint256)", +"b2a02ff1": "seize(address,address,uint256)", +"b2a072c6": "passUndistributedEther()", +"b2a082b9": "suicaId()", +"b2a1449b": "out()", +"b2a1a022": "getGasPrice(string)", +"b2a1c540": "setMemberId(address,uint256)", +"b2a1de22": "whitelistedCount()", +"b2a29615": "Criptomedicina1()", +"b2a2a4e2": "complianceContract()", +"b2a3fd05": "WithdrawEth(uint256)", +"b2a4c897": "createTable()", +"b2a4efd4": "MASTERY_THRESHOLD()", +"b2a5a012": "setTokenReturnRate(uint256)", +"b2a5bc70": "_tokenLeft()", +"b2a68466": "OZENToken(uint256)", +"b2a6d21b": "COMPANY_RESERVE()", +"b2a7239d": "sklToken()", +"b2a780e4": "BITCLAVE_AMOUNT()", +"b2a7d1b7": "AssetsExplorer(address)", +"b2a840c0": "enable(string,uint256)", +"b2a87fc3": "targetToAchieve()", +"b2a8a6f3": "sendFLC(address,address,uint256)", +"b2a8ff45": "Tokens_Per_Dollar()", +"b2a91457": "OIA()", +"b2a9ab9c": "getTotalBraggedVolume()", +"b2aa8291": "MAINSALE_CAP()", +"b2aa9f0f": "increaseTotalSupply(address,uint256)", +"b2aac51f": "lookupUser(string)", +"b2aae005": "getBalanceOf(uint256)", +"b2ab526d": "approveUsers(address[])", +"b2ab530e": "testFailRetractLatestRevisionNotUpdatable()", +"b2ab70ba": "getMaxIterationsForRequestDividends()", +"b2ac1bbe": "buyInternal(address)", +"b2ac5407": "GMRTokenManager(address)", +"b2acbc13": "isOwner(bytes8,address)", +"b2ad1993": "BalanceNum()", +"b2ad35c0": "distributor_address()", +"b2ad3d44": "updateComplianceProof(bytes32,bytes32)", +"b2aeb260": "setHiringDone(address,uint256,address)", +"b2af9362": "isValidSignature(uint256,bytes)", +"b2b02109": "partnerSaleTokensAvailable()", +"b2b0aefb": "verifyPendingShares(uint256[],uint256[],uint256,uint256[],uint256[],bytes,bytes,uint256)", +"b2b106d6": "participate_in_arbits_presale_crypto()", +"b2b158e8": "setHolderAmount(uint256)", +"b2b28679": "getDelegationID(address,address)", +"b2b3abb1": "removeOrderFromList(bytes32)", +"b2b45df5": "init(address,string,string)", +"b2b4ae25": "isEntitled(address,address)", +"b2b5d93c": "Stop(bytes32)", +"b2b5f0cf": "IOBT()", +"b2b5f86f": "getLocality()", +"b2b5fbf5": "subDroneItem(address,uint256,uint256)", +"b2b6e37e": "_min256(uint256,uint256)", +"b2b74405": "PizzaParlor(address)", +"b2b7d0ce": "HakataCoin()", +"b2b877c1": "MithrilValkyrie()", +"b2b95adc": "finalizeChangeInsurer()", +"b2b96792": "proposeSettlement(uint256,uint256)", +"b2b98ed2": "Winner()", +"b2b99ec9": "removeNode(address)", +"b2ba0aa5": "feesPer10000()", +"b2ba97de": "team_and_angel_beneficiary()", +"b2bab02a": "startIssue()", +"b2bae511": "initSiteRewards(uint256)", +"b2baede4": "getListingContractAddress()", +"b2bb419f": "ActivateEscrow(uint256)", +"b2bb72bf": "getIndexInfo()", +"b2bbac16": "firstWeekPreICOBonusEstimate()", +"b2bbae69": "payForVote(address,bytes32,uint256)", +"b2bbe75e": "Sunshine()", +"b2bc2f68": "Kitcoins()", +"b2bc6c19": "PRICE_11()", +"b2bcf495": "_releasableAmount(address)", +"b2bd96b2": "AcceptsFUNDS(address)", +"b2bdc6b3": "adminAddMonument(string,uint256,uint16)", +"b2bdfa7b": "_owner()", +"b2be8180": "TombCore()", +"b2be8a0d": "getUserWalletTokenBalance(address,address)", +"b2bea9c1": "releasePurchasedTo(address,uint256)", +"b2bec979": "cashOutCar(uint32)", +"b2bf731d": "SPECTRE_BOUNTY_ADVISORY_DEV_TEAM_ALLOC()", +"b2bfd948": "checkNumbers(uint8[3])", +"b2c09c92": "gameWithdrawFrom(address)", +"b2c15f29": "updateLastTime(bytes32,bytes32)", +"b2c1d7dc": "BGToken()", +"b2c2196f": "MxRecordChanged(bytes32,address)", +"b2c26f94": "updateParameterValue(bytes32,uint256)", +"b2c2921a": "TeamBox()", +"b2c3429d": "VouchCoin()", +"b2c3609b": "Play(uint8)", +"b2c50b92": "retryWinners()", +"b2c5b208": "_returnReturnData(bool)", +"b2c60132": "wingsWallet()", +"b2c60690": "finalizeVoting(address)", +"b2c62d46": "endClaim()", +"b2c652f3": "getMarkets(uint256[128])", +"b2c6b6dd": "preSaleContract()", +"b2c7c90d": "bitcoin_ratio()", +"b2ca38fe": "GAP()", +"b2ca3ec4": "securityGuard()", +"b2cad9b7": "getLevel(uint32)", +"b2cb0a3d": "VESTING_TEAM_DURATION()", +"b2cb1ebd": "Typhoon()", +"b2cb26c1": "addMaster(uint32,string,uint16,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)", +"b2cb3a9b": "getCurrentShare(address)", +"b2cb3e93": "COSSDemo()", +"b2cb9f05": "Total_Deposited()", +"b2cc0eb3": "SpaceCoinToken(address,string,string,uint256,uint256)", +"b2cc36fc": "restoreFromColdWallet()", +"b2cc4165": "getOrderAmount(address,address,uint256,address)", +"b2cca39d": "pausedTime()", +"b2ccc4ab": "getFameBalance(address)", +"b2ccda0e": "setPrimaryOperator(address)", +"b2cd67ef": "Klein()", +"b2cda083": "PassCommitteeRoom(address)", +"b2cefd2f": "LiteToken()", +"b2cf9814": "assetManagerIncome(address)", +"b2cfdfda": "stringToArray(string,string)", +"b2d111f6": "maxGasPriceValue()", +"b2d1289b": "DepositManager(address)", +"b2d138d2": "rspScience()", +"b2d14545": "fbytes2(bytes2)", +"b2d1573f": "getUserRank(address)", +"b2d1f9be": "buyStar(uint256,string,string)", +"b2d23b7d": "fetchVoteResult()", +"b2d27832": "vestingPeriodTime()", +"b2d2c1de": "withdrawProfit(address,address)", +"b2d318f7": "VeteranCoin(uint256,address)", +"b2d37165": "startMinting(bool)", +"b2d37e95": "remove_order(uint32)", +"b2d3e85e": "isPeriodAllTokensSold(uint256)", +"b2d444df": "TIM6(uint256,string,uint8,string)", +"b2d48237": "refferalsRateBonus()", +"b2d4ae5e": "__callback(bytes32,string,string)", +"b2d5362d": "contractTokenBalance(string)", +"b2d5ae44": "getRefund()", +"b2d5e8b1": "VALUE_OF_UTS()", +"b2d6bc83": "fundCapital()", +"b2d6fd0b": "id_for_address(address,address,address)", +"b2d8efe0": "crowdsaleOpen()", +"b2d96b81": "safeAssetData(uint256)", +"b2da302b": "Thrill()", +"b2dad155": "trim(string)", +"b2dad25d": "getNameOfAddress(address)", +"b2dae885": "SpecialArrays()", +"b2db1d23": "regularMaxPerPerson()", +"b2dd5c07": "registered(address)", +"b2dda6b5": "totalEthReleased()", +"b2de1a3f": "CONTRACT_PROVIDER_ADDRESS()", +"b2df8456": "sponge(uint256[9])", +"b2df8bad": "getAvailableCoinsForCurrentStage()", +"b2dfa399": "ZRX_TOKEN_ADDR()", +"b2e02430": "divRate()", +"b2e02fc1": "addRefund(uint256,uint8)", +"b2e0baee": "SunContractIco(uint256,address)", +"b2e235c2": "BitBall()", +"b2e2c1c9": "updateCondition(uint256,uint256,uint256,uint256)", +"b2e2c75f": "totalUsed()", +"b2e30440": "Ducaat()", +"b2e33c8f": "getCountPlayerByTrackId(uint256)", +"b2e357b4": "isLinkClaimed(address)", +"b2e37e18": "extDestroyNinja(uint256)", +"b2e3d212": "IndexCoin()", +"b2e4c183": "preICOBonusPercent()", +"b2e4d35d": "validate(uint256,uint256,uint256,uint256,string,string,string)", +"b2e545ac": "TokenGreeneum(uint256,string,uint8,string)", +"b2e5d3ba": "getBtcRate()", +"b2e6ceeb": "takeOwnership(uint256)", +"b2e752cb": "MINCAP_TOKENS()", +"b2e774ce": "deliver(address,uint256,bytes32)", +"b2e7c288": "recipientString()", +"b2e85b67": "getPlayerStatus(address,uint256)", +"b2e94e78": "stage1_start()", +"b2ea073f": "setGeneScienceAddress(address,address)", +"b2ea088d": "returnUnsold()", +"b2ea0a39": "changeMinDonationLimit(uint256)", +"b2ead7bb": "fundsOut()", +"b2eafd57": "getRewarder(uint256)", +"b2ebe1c5": "_determineCharacterType(uint256)", +"b2ed26f6": "addresses3(uint256)", +"b2ee95f9": "dateRelease6()", +"b2eed299": "getPOOL_edit_28()", +"b2ef089a": "isStateTokensale()", +"b2ef48b9": "buyTokensWithWei(address)", +"b2f05133": "set_trader(address)", +"b2f0575c": "FooMintToken(int256)", +"b2f094de": "BittechPresale(address)", +"b2f106c0": "determineReward(bytes32)", +"b2f1bb5b": "tellMeASecret(string)", +"b2f1fe99": "refundManyTransaction(uint256[])", +"b2f2303a": "BreakbitsERC20Token()", +"b2f24225": "set_minDETsPerReturnMoreThan(uint256)", +"b2f2588b": "sortNumbers(uint8[3])", +"b2f2b06d": "_createCar(string,address,uint256)", +"b2f3319e": "ToggleTestMode(bool)", +"b2f3d299": "loadFunds()", +"b2f3ded4": "allMarketsFinalized()", +"b2f40531": "shutdownTransactions(address)", +"b2f4bdb0": "createdTime()", +"b2f5a54c": "getInvestors()", +"b2f7e989": "sourceTokens()", +"b2f9c5b9": "canTransfer(bytes32,address,uint256,bytes)", +"b2fa1c9e": "isComplete()", +"b2fa9206": "cancelIco()", +"b2fadc78": "_getStorage()", +"b2fb3b90": "cancelActiveAuctionWhenPaused(uint40)", +"b2fcb395": "GoldenBullChainToken()", +"b2fce4ea": "delegateVote(int256,address)", +"b2fd3a7d": "getHardcapUsd()", +"b2fed358": "getsafemode()", +"b2ff7945": "setARR(address)", +"b3002be7": "burnNSPs(address,uint256)", +"b30054b4": "set_address_GIC(address,address)", +"b3007dc6": "rateFirstWeek()", +"b302ea1e": "setRaindropAddress(address)", +"b302ec4b": "LocklistedAddress()", +"b30300d7": "_increaseAllowance(address,uint256)", +"b3034371": "unilateralRuling(uint8,uint256,uint256)", +"b30387a4": "gen0Count()", +"b30390ce": "registerItem(uint256,uint256,bytes32,bytes32,bytes32)", +"b303cec0": "addAccountReader(address)", +"b303dcbd": "Owned()", +"b303f9f7": "releaseHTOSupply(address)", +"b304376c": "begins()", +"b30475b6": "totalWeiClaimed()", +"b304b2e1": "allocated()", +"b305836f": "feeWithdrawTokenAll(address)", +"b3066d49": "setContracts(address,address,address)", +"b3070c12": "ADVISOR_REWARD()", +"b3074b8a": "SUTokenContract()", +"b30779b1": "payCommission()", +"b3082d25": "CreateCards(uint256,uint256,uint256,uint256,uint256,bool)", +"b30841d9": "totalEras()", +"b3097a08": "heldTotal()", +"b30ab349": "getContent(address)", +"b30bca06": "sum(uint8[])", +"b30cf414": "unpauseSALE()", +"b30d1bb8": "isDisableEther()", +"b30d95a0": "changeBonus(uint256,uint256,uint256,uint256,uint256,uint256)", +"b30dbc67": "DeNetToken()", +"b30e4533": "ABBCToken()", +"b3113d3f": "hardCapPrivate()", +"b311db2f": "setAccountType(address,uint256)", +"b311ee0c": "refundClaimDeposit()", +"b312dc91": "currentPayout(address,address,bool)", +"b31394cb": "_checkThenTransfer(address,address,uint256)", +"b3139d38": "updateSlasher(address)", +"b3141c69": "localsReptoken(uint256,string,uint8,uint256,string,string)", +"b314a984": "burnRemain()", +"b3154db0": "check(address,address)", +"b31567d3": "LogRemoveWhiteListed(address)", +"b31597ad": "redeem(bytes32,bytes32)", +"b315e453": "multiWithdrawReward(uint256[])", +"b31610db": "getIndex(address)", +"b317d031": "STATUS_PAID()", +"b319c6b7": "cooldownTime()", +"b319e9fa": "distributeMultiple(address[],uint256[])", +"b31a17f0": "FtC()", +"b31a4047": "_convertBlueprint(string)", +"b31a404a": "withdrawOnNoAvailablePlan()", +"b31a4e0d": "allocatePresaleTokens(address,uint256,uint64,uint64)", +"b31ab1c3": "disconnectOrderUser(address,address,uint256,uint256,address,address)", +"b31ba590": "PlayerCreated(address,uint256)", +"b31c5c64": "kscDecreaseApproval(address,uint256,string)", +"b31c710a": "oldToken()", +"b31cbe9a": "getAlice(uint256)", +"b31cd1be": "secretTaken(bytes32)", +"b31cf984": "getProgram()", +"b31d61b0": "whitelistAddress(address[])", +"b31d7730": "presaleFinalizeAgent()", +"b31d8a6f": "FreeTokenAdded(address,uint256)", +"b31dcaad": "timeToUnlockDDHHMM()", +"b31e1d4d": "delegateVote(address)", +"b31e822b": "isAllowTransfer(address)", +"b31e8889": "setParticipantWhitelist(address[],bool)", +"b31f8f93": "tokensLeft()", +"b32022e8": "calculateKebabBuySimple(uint256)", +"b3204b8b": "setParent(address,address)", +"b3204cc3": "setLineUpEnable_pool(address,uint256)", +"b3205410": "getCustomerInfo(address)", +"b3206453": "destination(bytes4,bytes)", +"b3209136": "WakaWakaCoin()", +"b320f459": "removeBid(uint256)", +"b32142a0": "getProgramPercent(uint256)", +"b3215499": "ICOBonusPercent3week()", +"b3219d17": "calculatePurchaseBonus(uint256,uint256)", +"b322269e": "GameStart(uint256,uint256)", +"b32381ee": "addmoney(address,uint256,uint256,uint256)", +"b324816a": "createPaymentsSplitting(address[],uint256[],uint256)", +"b324c62a": "fastTokenSale(uint256)", +"b324e80d": "depositEscrow(address,uint256)", +"b324fb6b": "startTimePreICO()", +"b3253e0f": "lastScheduledTopUp()", +"b326124b": "tRegSaleStart()", +"b326c189": "hasOpenCommissionerAuction(uint128)", +"b32776e1": "getSigner(address,string,address,uint256,bytes32,bytes32,uint8)", +"b3280830": "addLibrarian(address,address)", +"b3292ff0": "addSuperAdmin(address)", +"b329bf5c": "cancelTransfer(bytes32)", +"b32b2805": "getArmyFullData(uint256)", +"b32b664f": "wantItForFree(uint256)", +"b32b8e2c": "contains(uint256[],uint256)", +"b32c41d7": "crowdsaleTargetUBO()", +"b32c65c8": "contract_version()", +"b32c6a25": "GenesisToken()", +"b32cb292": "setStartICO(uint256)", +"b32cec45": "CROWDSALE_ACCOUNT()", +"b32d01c2": "modify_bytes(bytes)", +"b32dbcd8": "getNumKnights()", +"b32dc51c": "totalPhase1Donations()", +"b32e02e8": "_getRarePlusRarity(uint32)", +"b32e4207": "setzString(string)", +"b32f19f9": "showFreezedTokensAmount(address)", +"b32f4b9a": "Barbie()", +"b32fab4e": "moneyback()", +"b3311309": "SingularityTest5()", +"b3335e6b": "setICOStartDate(uint256)", +"b33381fe": "calcAmountEther(address,uint256,uint256)", +"b333adfc": "coursesLength()", +"b333b0ee": "_stake(bytes32,uint256,uint256,address)", +"b333ce0d": "icoFinish()", +"b3344593": "trackingNo()", +"b334e90b": "tadpoleReq()", +"b334fd07": "createFincontract(bytes32)", +"b3350f03": "forbiddenAction()", +"b33527d2": "CreateBAT(address,uint256)", +"b3369866": "indexOf(uint128[],uint128,bool)", +"b336ad83": "getByName(string)", +"b336f8a3": "GetNumberOfRigs()", +"b33712c5": "unpauseContract()", +"b337a20d": "verifyLockSignature(bytes32,address,address,uint256,uint256,bytes32,bytes)", +"b33926cb": "owner_withdraw(uint256)", +"b33a10de": "cards_titanium(uint256)", +"b33a2ea0": "lastBlock_v18Hash_uint256()", +"b33a8a11": "setTokenReference(address)", +"b33aca37": "Mcoin(uint256,string,uint8,string)", +"b33adbf1": "darPremio()", +"b33c24b2": "createERC20TokenNetwork(address,address,uint256,uint256)", +"b33c4b1f": "end_now()", +"b33cb8f6": "CrowdsalePaused()", +"b33ceb2c": "AddGossip(address,string)", +"b33e8ee5": "exchangeTokensById(uint256,uint8,uint8)", +"b33fcc7a": "multiTransfer(uint256[])", +"b340a972": "getaddr(address,uint8)", +"b340d8cf": "encodePriceFeed(uint256,uint256,uint256,uint256)", +"b340f2b4": "showAssetDetails(bytes32)", +"b3413d9f": "_forwardFunds()", +"b34195a3": "ICOTokensInvested(address,uint256)", +"b3423eec": "requestWithdraw()", +"b34244e8": "setCBaddress(address,address)", +"b34253be": "FundsVault(address)", +"b342d7c0": "genEOS()", +"b34362be": "setParter(address,uint256,uint256)", +"b3446f85": "registerPlayer(string)", +"b3447ac9": "getBytes32Values(bytes32)", +"b344e002": "saleDeposit()", +"b3470e97": "addHashes128()", +"b3472edb": "getMaxProfit(uint256)", +"b3477201": "createPadlock(string)", +"b3480369": "_getWaitingBlocks(uint256)", +"b3481e61": "updateTeam(address,uint32,uint8[],uint32[])", +"b3485dca": "UpdatePrice(uint8,uint32)", +"b3487a71": "getBetWaitEndEther()", +"b348ddde": "ETH750on54()", +"b3490bfc": "allowTransfer(address)", +"b34937c9": "feedMessage(uint256,string,string)", +"b349b973": "_init()", +"b349dbdc": "nfsPoolTransfer(address,uint256)", +"b349f6c7": "attemptSpend(uint256)", +"b34b2c26": "Simpletokenq()", +"b34b4f69": "XingchenToken()", +"b34b5825": "getAvailablePacks(bytes4)", +"b34c28de": "calculateBurnGoldFee(uint256,uint256,bool)", +"b34c3610": "assert1()", +"b34c8afb": "getBaseAmount(address)", +"b34d471d": "bulkCreateLamboSale(uint256,uint256,uint256)", +"b34debac": "canUseResource(address)", +"b34e0c47": "getUserScore(address)", +"b34e7b9d": "getgamecardlength()", +"b34e97e8": "login()", +"b34f094f": "INTToken(uint256,string,uint8,string)", +"b34f0e5e": "CLAIM_STAGE()", +"b34f407d": "setPerformer(address)", +"b34f43c7": "SVDelegationV0101_1(address)", +"b34f594b": "setNodePrice(uint256)", +"b34f7b50": "_generateDiscipleSale(uint256,uint256,uint256,uint256)", +"b350723f": "_guarantedBid(uint256)", +"b3508654": "addController(address,bool)", +"b3508783": "TOKEN_MAX()", +"b35176e2": "show_number_of_days_since_bank_opening()", +"b3521607": "XYCCTEST()", +"b3527cfe": "Follow(uint256,address,uint256)", +"b3528158": "DASHABI(uint256)", +"b352867c": "setFreeExtension(bytes32,bool)", +"b3535fe2": "_setProviderInfoFields(uint256,string,string,uint256,string,address,uint8)", +"b35376b5": "getDiamond(string)", +"b3539c44": "getMintForReportingParticipantTargetValue(int256)", +"b3549265": "coloredTokenCount()", +"b3559460": "getGenerationSize(uint256)", +"b3562e6e": "getCrowdsaleTier(uint256)", +"b356a3a5": "PLATFORM_GROWTH_VESTING_AMOUNT()", +"b3570116": "mintIfNecessary(uint256)", +"b357a028": "SCISSORS()", +"b357a552": "claimAuctionableTokens(uint256)", +"b357b72f": "setMaxMarketOffers(int32)", +"b35861b4": "setERC20Address(address,address,uint256,uint256)", +"b358755e": "testerCanNotReentrant()", +"b35893f3": "setExporter()", +"b358e375": "JobsManager(address)", +"b359cedd": "getTime(string)", +"b35ae7e8": "ViotToken()", +"b35e7d45": "setCriticalBucket(uint256)", +"b35eeb46": "GenHeliosCoin()", +"b3610f37": "destroyCar()", +"b36117b2": "create18FilmsTokens()", +"b36216d3": "allTokensDecimalsBalancesWeights()", +"b3621e1a": "addAddress(address[])", +"b36234c2": "AltruismMode(address,uint256,uint256)", +"b36292eb": "TestingCoin()", +"b3629f79": "get_proposal_by_row(uint256)", +"b3643e3a": "createSale(address,uint256)", +"b36752ee": "addressFoundersShare()", +"b36763c9": "_owoAmount()", +"b367fb11": "platformTokens()", +"b36877c9": "DragonKing(address,address,uint8,uint8,uint8,uint16[])", +"b368cb10": "getProviderInvitedUser(uint256,address)", +"b369940c": "wingsETHRewardsPercent()", +"b3699d0b": "withdrawedTeamCounter()", +"b369af71": "intervalOf(uint256)", +"b36a06b5": "preSaleFirstBonus()", +"b36a0b15": "getSignDetails(uint256,uint8)", +"b36ada82": "mintingOracle()", +"b36af005": "Menu04()", +"b36b9ffd": "bountyManager()", +"b36ba252": "getSellOrderPrices()", +"b36c1284": "MaxSupply()", +"b36c14fe": "getWhitelistUser(address)", +"b36c8022": "UnfreezeAccount(address)", +"b36c973e": "payOutWinner(address)", +"b36d829b": "getwinningaddress01()", +"b36df681": "ExecutableBase()", +"b36eaad8": "createUserMeme(address,uint256,string,uint256)", +"b36f2c30": "maxWeiUnverified()", +"b36f8e8f": "allowManager()", +"b36fef76": "promoFishCommission()", +"b3710a80": "infraEthWallet()", +"b37139e6": "reduceCD(uint256,uint256)", +"b37217a4": "getRandomNumber(uint256)", +"b372bd31": "getCommissionBalanceWEIInfo()", +"b373a48b": "getOneself()", +"b373a61c": "priceRandomFight2Death()", +"b373a6cd": "sendTokens(address[])", +"b373f167": "transfer(address,uint256,bytes,string,bool)", +"b3745afa": "changeAllocator(address)", +"b3746849": "buyTokens(address,bytes)", +"b374db9a": "secondsTimeLockedDefault()", +"b3753107": "gweiBBDPriceInWei()", +"b375603c": "raffleId()", +"b375a72c": "getHashPicture(bytes32)", +"b375b95a": "getMaxRankingSpots()", +"b3760c80": "orderMatch(uint256,uint256,uint256,int256,uint256,uint256,address,uint8,bytes,bytes,int256)", +"b37610ad": "getKey(uint16,uint16)", +"b37681fd": "SetPlayerID(bytes32,uint16)", +"b376feba": "_unsafeTransfer(address,uint256)", +"b378e89b": "CreateToken(address,uint256)", +"b37983e2": "gasRequired()", +"b379d235": "setFlowerAuctionAddress(address)", +"b37a336d": "VESTING_DIV_RATE()", +"b37a5de7": "throughputToday()", +"b37a6a2c": "restartPrivatePlacement()", +"b37bcd94": "discountPeriod()", +"b37c191b": "rank(uint256)", +"b37c7dc0": "sub256(uint256,uint256)", +"b37cc2f0": "getUserEventsLength(address)", +"b37d61f8": "checkMyBalance()", +"b37d97b5": "addMany(address[])", +"b37dcce2": "trainingFeeMultiplier()", +"b37edb66": "FundingEntity()", +"b37edfb6": "checkChangeOwnerArgs(uint256,uint256)", +"b37f17ee": "migratingAmountBooks(address,address)", +"b3803956": "showPlayerFullScores(address)", +"b380b0d4": "setProfitPercentage(bytes32,uint256)", +"b380beac": "setTotalWizzPandaOf(uint256,uint256)", +"b380d365": "resolveDisputeSeller(string)", +"b381cfe5": "iotpowerToken()", +"b3822da8": "getContents(uint256[])", +"b38260fe": "totalAngelCardSeries()", +"b382b0d6": "createContract(uint256,uint8,uint256,uint256,address,address,address,address,address)", +"b38336de": "getCoinAmount(uint256)", +"b3834ed4": "getRefunded()", +"b383616d": "setSupplyAgent(address,uint256)", +"b38400ff": "getEndedGames()", +"b38415f3": "getConfigBytes(bytes)", +"b384abef": "vote(uint256,uint256)", +"b384e9b4": "incentivisationFundAddress()", +"b3850b2a": "total_reward_amount()", +"b385e7b6": "playerPrizes(address,uint256)", +"b387ed6d": "getCompetitionStatusOfHopefuls()", +"b387ef92": "currentOwner()", +"b38854be": "ownable()", +"b38928c5": "Vineyard(address)", +"b38b2261": "addValidation(bytes32)", +"b38bf811": "setMessagesSigned(bytes32,bool)", +"b38c1504": "TOTAL_LBTOKEN_SUPPLY()", +"b38c7e3a": "getStrong()", +"b38ce3e7": "deedIds(uint256)", +"b38d3ab4": "attackeePrizeByToken(bytes32,address,address)", +"b38de8ce": "DelGoods(uint32)", +"b38f974a": "buyFood(uint32)", +"b38fb813": "crowdsaleInit()", +"b38fced1": "availableThemedSpinners()", +"b3908dc1": "IPXToken()", +"b390c0ab": "burn(uint256,uint256)", +"b391983c": "getLimitAndPrice(uint256)", +"b3922c42": "TOKEN_INVESTORS()", +"b3924a58": "GreenMining()", +"b3927eeb": "Expended()", +"b3935caa": "trivenewstestToken()", +"b3936f95": "basis(uint256,uint256)", +"b3938edc": "changeETHUSD(uint256)", +"b393a5b5": "setKingdomCreationFeeWeiRP(uint256)", +"b393a759": "ipfsSet(string)", +"b393fa46": "fundersClaimed()", +"b3942cbd": "setTransferAllowed(bool)", +"b3947c17": "muldiv(uint256,uint256,uint256)", +"b395cb3c": "vest(address,uint256,uint256,uint256,uint256)", +"b395f278": "view_get_blockNumbers()", +"b3965083": "Pothereum(uint256,string,string)", +"b3965cec": "RefundPeriodStarted()", +"b3966dc9": "init(address,uint256,uint256,uint256,address,address,uint256)", +"b396d7ad": "heapSort(uint256[])", +"b3970f27": "updateHpbNodeBatch(address[],bytes32[],bytes32[])", +"b397657d": "endInitialization()", +"b397ffd8": "m_foundersTokensStorage()", +"b39852f9": "createGame(uint256,uint256,uint256,uint256,uint256,uint8)", +"b398924d": "RangeGameProcess(address,uint256)", +"b398e098": "setMaxETHAutoContributions(uint256)", +"b3997703": "Loser(string,string)", +"b399a9f8": "setFungibleTokenAddress(address,address)", +"b399b0bc": "remaining(address)", +"b39a64cd": "getNumCalled()", +"b39a69a3": "withdrawPROV(uint256)", +"b39a7fbe": "setBattleDeciderAddress(address)", +"b39ad6e0": "DonatorInteract(string)", +"b39c2944": "requiredAuthorities()", +"b39c8739": "Strikes()", +"b39ca258": "createOrder(address,bytes32,bytes32,address,uint256,uint256,uint256)", +"b39d49fe": "sellNapkins(uint256)", +"b39d66d0": "LiipCoin()", +"b39d6b7b": "DukatToken()", +"b39dcb1d": "showDepositEther()", +"b39e12cf": "contractManager()", +"b39e1c6c": "withdrawDirectDebit(address)", +"b39e7bc1": "RealEstate(uint256)", +"b39f4171": "payForOther(address)", +"b39f4483": "setPOOL_edit_28(string)", +"b3a06e75": "airdropSingleAmount(address,uint256)", +"b3a0b1ef": "basicInfoGetter()", +"b3a0e188": "firstReserveTimeLock()", +"b3a1362a": "setMessage(int256,string)", +"b3a1584a": "toAddr(bytes)", +"b3a18632": "stakeAOContent(uint256,uint256,bytes8,uint256,string,string,string,string,uint256,uint256)", +"b3a196e9": "presaleSupply()", +"b3a1ca52": "addressFundDigitalMarket()", +"b3a26071": "LiquetLottery()", +"b3a27842": "getEntity(uint256)", +"b3a2a6c0": "setOfficialWebsite(string)", +"b3a2a999": "nextWithdrawal(bytes16)", +"b3a3c4f6": "identifierToRentPeriod(uint256)", +"b3a3d671": "addAllowanceToRecieveToken(address[])", +"b3a3dda3": "clearExpiredAssignments(address,uint256)", +"b3a41c65": "power(uint256,uint256,uint256,uint256,uint8)", +"b3a56077": "vestingPeriodLength()", +"b3a61c80": "tryNextTimeRange()", +"b3a6d09d": "tgrSettingsPartContributor()", +"b3a7cbf6": "XRRsale()", +"b3a810f7": "tournamentOwnersCut()", +"b3a844ae": "tokenClose()", +"b3a9afb7": "getQuickBuyEtherToken()", +"b3a9b5f6": "multiply(uint256,uint256,uint256)", +"b3aaa277": "validate(address[4],address,uint256[11],uint256,bytes,uint256)", +"b3aae830": "deployProject(uint256,string)", +"b3ab15fb": "setOperator(address)", +"b3ab715e": "getTileIDbyPosition(uint16,uint8)", +"b3ac149c": "getCurrBalance()", +"b3ac7acd": "ownerSetMaxProfitAsPercentOfHouse(uint8)", +"b3ad4600": "RedCarpetToken()", +"b3adc716": "is_banned(address)", +"b3ade772": "shipProducts(string,string)", +"b3adfa0c": "summLeskiw()", +"b3ae1d2c": "completeTransaction()", +"b3ae65d7": "initialBlockNumber()", +"b3aefb75": "getCap(address)", +"b3af4426": "jackpotTokenLoseRewardRate()", +"b3af88f0": "proposalPresent(string)", +"b3afe437": "SPECIALIST_TWO()", +"b3b0c83f": "withdrawEndTime()", +"b3b0cf86": "Birth(uint256,string,address)", +"b3b0eae5": "getPaidAmount(string)", +"b3b163c4": "getLatestVersion(address,bytes32,address,bytes32)", +"b3b294a6": "bonusOn()", +"b3b2b1b6": "setPaidStatusCustomer(address)", +"b3b32dc0": "hasSeat(uint256)", +"b3b39809": "Filiate_Changed(address)", +"b3b4b21e": "ZZZCoinDistribution()", +"b3b4ec54": "acceptColuLocalNetworkOwnership()", +"b3b4fd0f": "affiliateProgram()", +"b3b51aa3": "recycleSkin(uint256[5],uint256)", +"b3b548eb": "submitPrice(uint256,uint256)", +"b3b55c0f": "ELTWagerLedger(address)", +"b3b5c0ee": "fillSellOrder(uint256,uint256,uint256)", +"b3b5eaa3": "dive2(address)", +"b3b5ec33": "onPollFinish(bool)", +"b3b5fc76": "getImagePartsCount(uint256)", +"b3b71063": "BitPeso()", +"b3b77a51": "lock(bytes32,uint256)", +"b3b789fb": "GetLogMessageInfo()", +"b3b78cc2": "crowdSaleZxcSupply()", +"b3b81d38": "changeMinContribution(uint256)", +"b3b85e7f": "buyAtoken()", +"b3b89158": "reserveUnlockTime()", +"b3b8c620": "icoRatio()", +"b3bb594c": "delivery(address,uint256)", +"b3bb8cd4": "_now()", +"b3bb8d44": "OwnerDefined()", +"b3bb9b58": "LiquidDemocracy(address,string,uint256)", +"b3bc5b10": "editDefinedGame(uint256,string,uint256,uint256,int256,uint256,uint256)", +"b3bd870a": "participated(address)", +"b3bf07a1": "balanceofSTCDR(address)", +"b3c06f50": "transferFrom(address,address,bytes32)", +"b3c0b7be": "createOracle(address,uint256,bytes32)", +"b3c10469": "hijackClones()", +"b3c185a7": "addNVTtoGame(uint256,uint256)", +"b3c199c1": "dividendFor(uint32)", +"b3c1a588": "parseMsgData(bytes)", +"b3c1ee88": "updateDescription(string,bytes32)", +"b3c1fe4f": "donationMultiplier()", +"b3c2083f": "sellVolumesNext(address,address)", +"b3c25835": "addUser(address,string,string,uint256)", +"b3c298ea": "angelInvestors()", +"b3c2e8fa": "ethPause()", +"b3c2eac1": "setStatus(bool,bool)", +"b3c3699f": "createLockedState()", +"b3c3bbbd": "betters()", +"b3c4a36b": "setupToken(address)", +"b3c4b54a": "updateDestination(bytes32,address)", +"b3c4ee17": "userOfferCancelElement(uint256,uint256,uint256)", +"b3c4f83b": "DoftToken()", +"b3c5209f": "limitation()", +"b3c5998d": "onTransfer(address)", +"b3c63629": "PTSDToken(uint256,string,uint8,string)", +"b3c6487b": "setCatPrice(uint256,uint256)", +"b3c7476c": "TOSLittleHodingContract()", +"b3c7618e": "getVoteRuling(uint256,uint256,uint256)", +"b3c7d097": "theDeal(uint256)", +"b3c9983a": "getPara(uint256,uint256)", +"b3ca07d1": "closeRound(bytes32,uint8)", +"b3caba5a": "setReferralAddress(address)", +"b3cb8885": "nextUnderdogPayout()", +"b3cba833": "getData_16()", +"b3cc167a": "bidIncrement()", +"b3cc35f0": "taxPerc()", +"b3cd95d3": "incRandNonce()", +"b3cdabfd": "funForOwner()", +"b3cea217": "ID()", +"b3cea9e2": "createRadar(uint256,string,uint256,uint256,uint256)", +"b3cffc6e": "contributeBTCs()", +"b3d14775": "getPOOL_edit_13()", +"b3d159bf": "SearchMyFiles(string)", +"b3d176c9": "setPOOL_edit_33(string)", +"b3d1958d": "flush(uint256)", +"b3d1b801": "getOwnerCars()", +"b3d1bd95": "_recordFeePayment(uint256)", +"b3d2b441": "grantTokens(address)", +"b3d34e1b": "WithdrawDevFunds(uint256)", +"b3d39e63": "deleteProposal(bytes32)", +"b3d3d37e": "takeSnapshot()", +"b3d4e279": "earlyBackerList()", +"b3d4e3f2": "makeVendorValid(uint256,bool)", +"b3d4e41f": "PURA()", +"b3d62a25": "matchDay()", +"b3d6e119": "lockedPeriod()", +"b3d73743": "box1Star4()", +"b3d76188": "pay(address,address,uint256)", +"b3d7ac6a": "transferCompensationEthers()", +"b3d8056d": "findString(bytes32)", +"b3d84a28": "FreezeProduct(uint256)", +"b3d91e41": "DECIMALFACTOR()", +"b3da4b09": "mintEnergyAttributionToken(address,uint256,string)", +"b3da6eed": "Alluma()", +"b3daa652": "CLIFF_DURATION()", +"b3daab8a": "updateInvestBalance(uint256)", +"b3dac57f": "cancelUpcomingEvent(uint256)", +"b3db410c": "allowTransferTimestamp()", +"b3db428b": "depositFor(address,address,uint256)", +"b3dc0e94": "transferSoldCoins(address,uint256)", +"b3dcc5eb": "mint_and_transfer(int256,address,uint256)", +"b3dd23e8": "BTC_SUISSE_TIER_2()", +"b3dd5b1a": "WavesBitcoinToken()", +"b3de019c": "changePrice(uint256,uint256)", +"b3de5cc0": "_getTimeLeft()", +"b3de648b": "f(uint256)", +"b3dedf5c": "BACToken()", +"b3dee386": "collect(uint16,uint16,uint8)", +"b3df27f4": "checkFundingGoal()", +"b3df5b45": "oxleytoken()", +"b3df8737": "left50(uint256)", +"b3dfcdc3": "Contribution(uint256)", +"b3e18ed9": "finisGame()", +"b3e1f523": "setUnpausedWallet(address,bool)", +"b3e2564a": "amendAmount(uint8,uint8,uint8)", +"b3e25665": "collaborateInMerge(address,int256,int256)", +"b3e33a74": "mintingGoal()", +"b3e366ab": "getLastMilestone()", +"b3e3cc34": "sellToBlackMarket(uint256,uint256)", +"b3e3d8b4": "startOrHoldCrowdSale(bool,bool,bool,uint256,bool)", +"b3e53d8a": "maxPresaleContributionEther()", +"b3e5519b": "getOpenBids(bytes32,uint8)", +"b3e6713e": "LogClaimTokens(address,uint256)", +"b3e6c19f": "OJCToken()", +"b3e7c201": "ethPromoHelpers(address)", +"b3e7c2bd": "getVote(bytes32,address)", +"b3e83761": "KanCoin(address)", +"b3e8fe00": "totalpro()", +"b3e98f82": "viewClaimableInvestorDividendPool()", +"b3e99b77": "systemClaimAirdropMultiple(address[])", +"b3e9da0c": "businessersTotalBalance()", +"b3ea3924": "PointlessCoin(int256,uint256,string,uint8,string,address)", +"b3ea553b": "JoyCoin()", +"b3ea5984": "getIndexOfTarget(address[],address)", +"b3eaaa7e": "calculateCHGAmountToEther(uint256)", +"b3eae9ac": "WashingtonExchange()", +"b3eb3a86": "getClosedContract(bytes32)", +"b3ebc3da": "weiRaisedTotal()", +"b3ed1957": "USDMToken()", +"b3ed2081": "fixedExpTest(uint256,uint8)", +"b3ede13f": "addToPrizePool()", +"b3ee4564": "assertStillValid(uint256)", +"b3ee5307": "CountersUpdated(uint256,uint256)", +"b3ee7248": "getDate(uint32)", +"b3eee638": "icoEnablersTokensMinted()", +"b3ef0045": "decodedRecipient()", +"b3ef774b": "getNumOfTokensBonusOnPurchase(uint256)", +"b3f00674": "feeReceiver()", +"b3f05b97": "finalized()", +"b3f08078": "bookCanvasFor(uint32,address)", +"b3f15866": "CropOracle(address)", +"b3f17c20": "miningOne()", +"b3f19abd": "GetRecordAddress(uint256)", +"b3f1c0c9": "setIssuer(address,uint32)", +"b3f1f31b": "testRecurringClones()", +"b3f22cb4": "setLUCKContractAddress(address)", +"b3f2c866": "startDateOfSaleStageLast()", +"b3f2ecfd": "endDiscountTime()", +"b3f2fa99": "playersShareAllocation()", +"b3f3668c": "getprizeamount()", +"b3f3ab5c": "removeContributor(address)", +"b3f3dcf6": "reinvestSubdivsAmount(uint256)", +"b3f3e673": "switchPeriod()", +"b3f3e737": "SendWalletFees(address,address,address)", +"b3f4d235": "updateCnyEthRate(uint256)", +"b3f50029": "finishedGameWithdraw()", +"b3f523a8": "devuelveTodasApps()", +"b3f57bae": "tokenIncluded(address)", +"b3f5849f": "Battle7oken()", +"b3f5ab78": "noncex()", +"b3f691c2": "approvePendingCostume(uint256)", +"b3f841ba": "minimumNumberOfTokens()", +"b3f865f7": "rebalance(address,address,uint256)", +"b3f8bef1": "tgeSettingsAmountCollect()", +"b3f936f2": "getTypeName(uint32)", +"b3f98adc": "vote(uint8)", +"b3f9b6e1": "showPlayerScores(address)", +"b3fa24ef": "getUnlockSdc()", +"b3faa12d": "blockTokens(address)", +"b3fad72f": "deposited(address,uint256,string)", +"b3fb052a": "NTVUToken(uint8,uint256,uint256,uint256,uint256,uint256,bool,string,address)", +"b3fb14ad": "getGameResult()", +"b3fb59c1": "_setCardId(uint256,uint256,uint256)", +"b3fc0c83": "safeLock(uint256,uint256)", +"b3fc34d4": "specialSanMint(string,string,address,address)", +"b3fcb85b": "Sold_Token()", +"b3fdc99d": "signalTradeIntent(address)", +"b3feda02": "ASSET_MANAGER_WALLET()", +"b3ff0065": "CGC()", +"b3ff1112": "redeemFunds(uint256,uint256,uint256,bytes32)", +"b3ff277d": "totalWon()", +"b3ff8bfb": "BONUS_5_DAYS()", +"b3ffb760": "buy(address,uint256,address,uint256)", +"b4003de4": "removeFromTeamBalanceMap(address)", +"b4007cda": "emergencyFlag()", +"b400d149": "betOnNumber(uint8)", +"b40127f0": "bestmoney()", +"b4015034": "cancelExplorationByShip(uint256)", +"b401faf1": "claimWinnings()", +"b4022950": "collectFeesInEther(uint256)", +"b4024d9f": "testTransferNoMoreThanTokenBalance()", +"b4025b92": "deployProject(uint256,bytes32)", +"b4026ed5": "clearAuth(address)", +"b402973c": "SeeToken(uint256,string,string)", +"b4037767": "CryptoUniversityTuition()", +"b4037bca": "setWins(uint256,uint16)", +"b4038efe": "setVestTokenAllocationAddresses(address,address)", +"b403c290": "getwinningaddress50()", +"b404e001": "COMMISSION_PERCENT()", +"b4051397": "TokenEtcb(uint256,string,uint8,string)", +"b405c549": "waiting()", +"b40615c6": "soldTokensTotal()", +"b4068734": "drawWinner(uint32,int8)", +"b406cf39": "isPeriodTimePassed(uint256)", +"b406d386": "convertForPrioritized3(address[],uint256,uint256,address,uint256,uint256,uint8,bytes32,bytes32)", +"b4071f8f": "setBlacklist(address,address,bool,bool)", +"b4073060": "getLockListLen(address,address)", +"b407d1d2": "allocate7ProjectToken()", +"b408ac01": "totalCandyNo()", +"b4099ff7": "queryImage(address,bytes)", +"b409da05": "logDoubleIndex(bytes,bytes,bytes,uint256)", +"b40a5627": "bidCount()", +"b40a9304": "allocateDelayedTokens(address,uint256)", +"b40b234e": "DigitizeCoin()", +"b40bfd35": "AlexTestCoin()", +"b40d8d58": "hodlerTime9M()", +"b40e415e": "mutagen2FaceContract()", +"b40e4bec": "computeCap(uint256,uint256)", +"b40e76fa": "minePoP(address,uint256,uint256)", +"b40ee3b3": "NewSmartSharingContract(string,uint256,uint256,string,string,string,uint256,string)", +"b40ee8b4": "setCredit(address,uint256)", +"b40f0352": "refund(address,address[])", +"b40f6f4c": "buyOptions(address,uint256)", +"b41044c4": "btc_token(address,uint256)", +"b410a034": "issuanceRatio()", +"b4114165": "foundationFundTokenCountInWei()", +"b411e54f": "removePolicyFrom(address,uint8)", +"b411ee94": "hash(string)", +"b4123abb": "getBatch(address,address,uint256)", +"b412506b": "turnFaucetOff()", +"b41283bc": "parseTradeCompatible(bytes)", +"b412a2d7": "StartDateUpdated(uint256,uint256)", +"b412a4b7": "asideTokensMintDate()", +"b412b1e9": "getForestCount()", +"b412b445": "icoBonus3()", +"b412d4d6": "CafeDelivered()", +"b412d627": "TokenWin(address,uint256,uint256)", +"b4134e6e": "totalRedeemedValue()", +"b413c923": "setReservedTokens(uint256,address[],uint256[])", +"b4144b79": "getTradesByAddress(address)", +"b414d4b6": "frozenAccount(address)", +"b4150f17": "masterAuth()", +"b415c4ca": "total_burned_by_raffle()", +"b416bc93": "TokenAllowance()", +"b4174cb0": "right51(uint256)", +"b41762f9": "capIncreased()", +"b41960d4": "redeemGift(string,address)", +"b419bd17": "getNumCoins()", +"b419dd2d": "hashesUsed()", +"b419f447": "ZipcoinToken()", +"b419f73b": "proveIt(address,bytes32)", +"b41a6ce2": "changeSettings(uint64,uint64,uint8)", +"b41a9f22": "totalRedemptionIdValue(address,uint64)", +"b41b208e": "DLP()", +"b41b3967": "m_holders(uint256)", +"b41bfa6a": "ABLGenesisToken()", +"b41d989d": "angelsDayCooldownEnd()", +"b41e6640": "taxMan()", +"b41e79d4": "firstChangeBlock()", +"b41f511c": "trade(uint256[],uint256,uint8,bytes32,bytes32,bytes)", +"b41fc258": "balanceOfPaillier(address)", +"b4200294": "totalApprovedAmount()", +"b42072e4": "tokenExchanged()", +"b420feb2": "ethDepositAddress()", +"b4210257": "addInitiator(address)", +"b4214c8c": "LogWithdrawal(address,uint256)", +"b42220ad": "enableChangeChannel(bool)", +"b4223757": "modifyMilestoneFrom(address,uint8,uint8)", +"b423c31e": "catchYou(address,uint256)", +"b423d93f": "icoUsd()", +"b424bd83": "getLastOrderId(address)", +"b425282d": "getBonusPool(bool)", +"b4256888": "openTime()", +"b425bd43": "distributeTokenToAddressesAndAmountsWithoutHost(address,address[],uint256[])", +"b42748d3": "PSYT()", +"b4279df3": "initialization(address,address,address)", +"b427c148": "calculatePointsBlock(uint32)", +"b4288aa5": "EventBattle(address,uint64,uint64,uint64)", +"b42963f8": "executeUpdateTransferMinimumFeeProposal(uint256)", +"b429844c": "userBanned(address)", +"b429af5e": "changeBotAddress(address)", +"b429afeb": "isController(address)", +"b429f65a": "totalEtherCookieResearchPool()", +"b42a02b5": "updateDID(string,string)", +"b42a11f9": "refundAllCollateral()", +"b42a275e": "bankAmount()", +"b42a8bf9": "_distributeRevenue(uint256,uint256,uint8,uint8)", +"b42b14c4": "DCNForGas()", +"b42b8559": "createPreSale(uint256,uint256)", +"b42c6b4f": "getPumpRate()", +"b42d6bd2": "SunToken(uint256,string,uint8,string)", +"b42dfa0d": "gen()", +"b42e49ef": "rollFive(address,uint8,uint8,uint8,uint8,uint8)", +"b42e8923": "pushBAU2(bytes32,address,uint256)", +"b4307192": "Bible()", +"b430da3c": "migrateHero(uint256,address)", +"b431da0c": "JavaOwnerExample()", +"b43216bf": "cvsquare(uint256[],uint256)", +"b4328e5b": "TokenSale(uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"b4330e24": "transferred_total()", +"b43386cd": "testBalanceAfterDeposit()", +"b434486a": "getPriceRiseAndFeePercent(uint256)", +"b4349daf": "TOTAL_HAWKING()", +"b4350e69": "ARBITRAGING(address)", +"b43545bb": "ownerValidate(address)", +"b436db29": "deployNetwork(address,address)", +"b43716a0": "getMajorityThreshold()", +"b43740c0": "casamenteiroToken()", +"b4375dc9": "adminSetEnabled(bool)", +"b4380764": "totalTokenHolders()", +"b438a2d0": "RigIdle()", +"b438d018": "guessNumber(uint256)", +"b439548d": "getStudent()", +"b43959c0": "setMembershipStatus()", +"b4396d42": "SAKECOIN()", +"b439be79": "AHCToken()", +"b43bd069": "getNumPassingTokens(address,uint256,uint256)", +"b43c19a6": "monsterAuction()", +"b43c35a5": "p_update_action(uint256,address,address,uint256,string)", +"b43c39a7": "_setRenewable(uint256,bool)", +"b43d42ec": "revokeRatioVote(uint8)", +"b43d4851": "transferSupply(address)", +"b43d9ede": "setMapMaster(address)", +"b43dbffc": "BulletinBoard(address)", +"b43f8a5c": "registNameXname(string,string)", +"b4402991": "userVoteFor(address,uint256,uint256,uint256)", +"b440b5c7": "EthPyramid00XX()", +"b440bf39": "setMonethaGateway(address)", +"b440f7ff": "setInterestor(address,uint256,uint256)", +"b4421cbd": "isPreTokenSaleActive()", +"b4421e7c": "releaseFoundationJM(address)", +"b442649d": "IlluminaCoin()", +"b4427263": "createTokens()", +"b443a085": "boom(uint256)", +"b443c607": "verifyCestificate(address,uint256)", +"b444b606": "getNowTokenPrice()", +"b444ff41": "setFirstRoundPricing(uint256)", +"b44531d3": "test_payment()", +"b4454253": "timePassed()", +"b446b5aa": "addAuthorized(address,address)", +"b446e7b9": "outterlockStartTime()", +"b4472022": "AECTToken(uint256,string,string)", +"b4478d7d": "updateTurnover(bytes32,uint256)", +"b447968c": "enterWithReferral(uint256,address)", +"b447acfa": "doubleSomeVar()", +"b447cfd4": "InitQuantity(int32,string)", +"b448017b": "periodPREICO()", +"b449188a": "updateCirculation()", +"b4495b7d": "MIN_USD_FUND()", +"b44996c4": "checkProof(bytes32,bytes,uint256[],bytes,bytes)", +"b449c689": "testdata()", +"b44a5e64": "GreenMed()", +"b44b0836": "getEAAttributes(uint32)", +"b44ba774": "_existPublicKey(bytes32,address)", +"b44bd51d": "getConfig(string)", +"b44bd688": "recoverLost(address,uint256)", +"b44cac23": "addJobSponsorship(address,address,uint256,string,string,uint256)", +"b44d7325": "signedTransferFromHash(address,address,address,address,uint256,uint256,uint256)", +"b44df72d": "tokensClaimed()", +"b44e2ab9": "onlySignerMock()", +"b44ec921": "whiteListContract(address)", +"b44eccc9": "periodICO()", +"b44ed831": "isDailyUplimitReach(address,address,uint256)", +"b44ef712": "secondRefundRoundFinishTimestamp()", +"b44f776a": "Test22Coin()", +"b44f794f": "removeUserRole(address,uint8)", +"b44f8cda": "icoSaleDeposit()", +"b45105b2": "post(string,address,string)", +"b4512913": "voteStatus(bytes32,uint256)", +"b45156fc": "startDate2()", +"b451794e": "numberOfOrders()", +"b4538897": "ICO_PHASE3_AMOUNT()", +"b4539817": "Donator2()", +"b453afb8": "getMinDisplayPrice()", +"b453fb01": "feeReceiverContract()", +"b4542a70": "getLLV_edit_19()", +"b454c415": "rNo()", +"b454e62e": "addPool(bytes32,address,uint256,uint256,uint256,address)", +"b456d9e2": "activateCrowdSale()", +"b456ecc5": "GetHash(bytes)", +"b458189f": "setAccountB(address)", +"b4590cbe": "ICOStatus()", +"b4594c36": "numberOfQuestions()", +"b4596ea6": "setPlayerGeneralAttrAdd(uint64,uint8,uint32)", +"b459c3fe": "WithdrawUnclaimed()", +"b45a2712": "mintCapInUSD()", +"b45aff16": "pullBalance()", +"b45b290d": "finalizePretge()", +"b45b7a51": "TokenSold(uint256,uint256,address,address)", +"b45be89b": "toGiveBase()", +"b45c48dc": "Security_AddPasswordSha3HashToBankAccount(bytes)", +"b45cff5f": "houseBankRoll()", +"b45db978": "Centspooladdress()", +"b45dd873": "enableBurning(bool)", +"b45f6df2": "updateDayTokenFees(uint256)", +"b45fb209": "setNewMessageNumber(string,uint256)", +"b460481d": "redeemShares()", +"b46062ad": "setInterestRate()", +"b460af94": "withdraw(uint256,address,address)", +"b4612d78": "CD(uint256,string,uint8,string)", +"b4621d07": "LimitBottom()", +"b4628c8a": "ENSRegistrar()", +"b46300ec": "send()", +"b46310f6": "setBalanceOf(address,uint256)", +"b463a75c": "addTeam(address)", +"b463bcde": "testThrowsSetNotTransferableNotOwner()", +"b46452a1": "convertTokensAmountInWeiAtRate(uint256,uint256)", +"b464631b": "get(address,uint256)", +"b464d582": "checkHowManyOwners(uint256)", +"b464d99e": "startTimeEarlyBird()", +"b465307c": "validPayAmt()", +"b4654d98": "transferMinusFees(address,uint256,uint128,uint16)", +"b465e52f": "secondRefundPollDate()", +"b46631cd": "SetTestModeHands(uint256,uint256)", +"b466b76f": "fresh()", +"b4670002": "updateEntries(address[],bool)", +"b4679b06": "multiplyWithNumber(uint256)", +"b46801c2": "balanceUpdatesCount(address)", +"b4693d23": "changeOpeningClosingTime(uint256,uint256)", +"b469ba24": "updatePokemon(uint256,uint256,uint256)", +"b469d6c8": "setFundingLowcapReached(uint256)", +"b46a8a21": "support_proposal()", +"b46bcdaa": "entries(bytes4)", +"b46e42ec": "setClue4(string)", +"b46eeebb": "TOKEN_FUTURE_CAP()", +"b4706fa1": "tokenSalesCapReached()", +"b470aade": "periodDuration()", +"b471fade": "_withdrawal()", +"b473d3b6": "EjariRulesC()", +"b4745939": "convertEtherToDust()", +"b47481a9": "BajwaToken()", +"b4750ca0": "getMiniumInputEther()", +"b4755160": "mkhash(uint256,uint256,bytes32,string)", +"b4758e82": "tokenAssignExchange(address,uint256)", +"b475a1c8": "ALLOC_TEAM()", +"b4765db7": "transferFromToken(address,address,uint256)", +"b476de2e": "callURL(string,string,string,string)", +"b47779ce": "FivePercent4Ever()", +"b47784d9": "testControlDisownNotOwner()", +"b477e7d5": "getFullTicketDetails(int256,uint256,uint256)", +"b4781f63": "change_coef(uint256)", +"b4787dc5": "linkEID(bytes,bytes)", +"b478886d": "promethCost()", +"b478f416": "setBaseCurrency(address)", +"b47a7a67": "proveIt(string)", +"b47b2cfe": "retraitStandard_4()", +"b47b6116": "removeCapFreeAddress(address)", +"b47be3e4": "addToWhitelist(address,uint256,uint256)", +"b47c11e8": "fidget(address)", +"b47d7409": "disablePurchase()", +"b47d89ad": "Details()", +"b47dbf22": "minPurchaseAmount()", +"b47deb3c": "winner(uint256,uint256)", +"b47df046": "setGrantEnable(bool)", +"b47e4c6c": "getTestOne()", +"b47f817e": "confirmAllBuys()", +"b47f833c": "contains(int8,int8)", +"b47fa7e0": "DepositLimit(uint256)", +"b4800033": "set(bytes32,string)", +"b4801272": "Dust()", +"b480eac0": "setTarget(uint256)", +"b4816be9": "endOfRewardsConfirmed(bool)", +"b4819e76": "getTokenDescription(address,uint256)", +"b481cbc0": "withdrawJajalanTokens(address)", +"b4821203": "investInQueue(address,uint256)", +"b483c054": "setOtherFomo(address)", +"b484d371": "fundReferrel(address,uint256)", +"b484de0d": "GetHashedMove(string,string)", +"b484e532": "getMyMsg()", +"b48585e5": "ATM(uint256,string,uint8,string)", +"b4861ca5": "assertSaneBalance(uint256,uint256,uint256)", +"b48666ee": "silverSaleLimit()", +"b4873ac7": "setCEOAddress(address,address)", +"b487b699": "addData(address[],uint256[])", +"b488abd8": "ANACoin()", +"b488f00e": "runSuperPrivilegeLuckyDraw()", +"b4894b1d": "gaps(uint256)", +"b489b365": "authorizeStore(address)", +"b489c597": "limitPresale()", +"b48ae96f": "finalizeRoom(uint8)", +"b48b4204": "register(bytes32,uint256,address,string,uint256)", +"b48b73aa": "setDivBonus(uint256)", +"b48bc2ee": "transferDepositsToNewDao(address)", +"b48c6807": "EtherLinkToken()", +"b48d323f": "getLiveChallenges(uint256)", +"b48eea44": "isWhitelisted(string)", +"b48f4f5c": "PreICOCents()", +"b48fcdc0": "setConfiguration(uint256,uint256,uint256,uint256,uint256,uint256)", +"b4909307": "getData(address,address)", +"b490e79f": "getChosenFreelancer()", +"b4921774": "getReportsByReporter(address)", +"b4929d4c": "publicSell()", +"b492bd32": "setMulBonus(uint256)", +"b493b0d0": "GESToken()", +"b4942ad1": "transferByCoinOwner(address,address,uint256)", +"b4944333": "getPlayerEarning(address)", +"b494b49d": "variationProbably()", +"b494f1fb": "totalReservedTokenAllocated()", +"b49575a7": "CORENET()", +"b49593fe": "PREMIUM_SALE_PACK_COUNT()", +"b4961379": "private_setOracleFee(uint256)", +"b49651ef": "FAPFund()", +"b4972398": "CTCToken(address)", +"b497d17d": "TileUpdated(uint256)", +"b4980148": "numberOfStarsToReserve()", +"b49845f9": "EventClear()", +"b498e3e4": "NeverConfused()", +"b4999e85": "endBlockNumber()", +"b499a26f": "getHowManyLeftToDistribute(uint256)", +"b499b2ce": "doNotThrowOnValidDiv()", +"b49ce17f": "totalCapsules()", +"b49d3a53": "stopTokenTransfer()", +"b49e3b62": "getPenetration(uint256,uint256,uint256)", +"b49f4afd": "getBasePrice()", +"b49f57ad": "getLastLevel()", +"b4a09ba9": "canAccessExclusive(address)", +"b4a0a6b8": "Sgethereum(uint256,string,string)", +"b4a0e24c": "getQuotaCheck()", +"b4a176d3": "restoreRegistry()", +"b4a2251e": "getOp()", +"b4a3208a": "SUAppToken(uint256,string,string)", +"b4a357a2": "get_participant(address)", +"b4a39dfd": "getChildId(bytes32,uint256)", +"b4a4136d": "BIMI_DAO_31()", +"b4a516a6": "addRTO(uint256,address)", +"b4a523e8": "mintedTotallyByBridge(address)", +"b4a5ef58": "updateDefaultTimeoutPeriod(uint256)", +"b4a61608": "MAX_STAKE_PATHS()", +"b4a66678": "Numtokens()", +"b4a77b0e": "isUserBlocked(address)", +"b4a7a022": "_buyInBatch(uint256,address,uint256,uint256[],uint256)", +"b4a8dd5b": "updateTimestampLimit()", +"b4a8f3e6": "timeOfDeath()", +"b4a93d9b": "transferBasic(address,address,uint256)", +"b4a97fc1": "removeBottomUpChild(address,uint256,uint256)", +"b4a99a4e": "Owner()", +"b4a9d156": "changeWaitTimeUntilWithdrawOrTransfer(uint256)", +"b4aa24db": "uncheckedUpgrade(address)", +"b4ab271c": "giftIdToGift(uint256)", +"b4abda8b": "sendOwnershipAndCall(address,uint256,bytes)", +"b4abea24": "BONDS()", +"b4ac5452": "exerciseCUSE(address,uint256)", +"b4ac8ad9": "getRetailerBalances(address,address)", +"b4ad016d": "Socialife()", +"b4ad6b5b": "transferFromTo(address,address,uint256,bytes)", +"b4ae641c": "arrayLimit()", +"b4b063df": "addNewClaim(string,uint256,uint256,string,string)", +"b4b06a74": "GiftClaimed(address,uint256,uint256)", +"b4b097eb": "addNewState(string,uint256[])", +"b4b0a6e2": "ADULTEUM()", +"b4b14467": "submitTokenTransaction(address,address,uint256)", +"b4b179dc": "getAmountToGive(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes)", +"b4b1b6d9": "getRecordStateRequiredChanges()", +"b4b1d9c7": "getDescription(address)", +"b4b22b5e": "ico_allocation()", +"b4b2938a": "Finapse()", +"b4b2d3d8": "phase3Price()", +"b4b3b028": "AddChain(bytes)", +"b4b4ff0a": "setDateStartTransfer(uint256)", +"b4b54328": "getActualPeriod()", +"b4b598ce": "TEAM_FUND()", +"b4b5b48f": "tokenData(uint256)", +"b4b68490": "totalTokenCap()", +"b4b68dab": "createPermissionsBot(address)", +"b4b71450": "PlaceRocketForSaleEvent(address,uint32,uint80)", +"b4b7771d": "setInvadeAddr(address)", +"b4b857d8": "DepositEther(address)", +"b4b9cd62": "UpgradeRig(uint8,uint16)", +"b4b9d1f1": "lookup(uint256,uint256)", +"b4ba2a1b": "percentFrom(uint256,uint8)", +"b4ba2eaa": "moveEther()", +"b4ba349f": "sing()", +"b4ba9e11": "claimFor(address,address)", +"b4baf9ff": "HybridX()", +"b4bb1b0a": "isEscrowActive()", +"b4bb58fb": "mix(uint256,uint256)", +"b4bbfb9e": "StateTransition(uint256,uint256,uint256)", +"b4bc3564": "do_guess(uint256)", +"b4bcc23b": "setInvest(address,address)", +"b4bd5c75": "setupPREICOPeriod(uint256,uint256)", +"b4bd9e27": "isOver()", +"b4be6190": "getFreelancerHourlyRateCurrency(address,address)", +"b4bede85": "transferSenderPaysFee(address,uint256,bytes)", +"b4bee870": "ChangePoolName(string,string)", +"b4beff8a": "GetMinerICOData(address,uint256)", +"b4c045e4": "NHMToken()", +"b4c16970": "BigRedCoin()", +"b4c16ea5": "CREATED_PROMO()", +"b4c28ead": "expertScoreOf(address)", +"b4c2aaee": "tokenPriceMin()", +"b4c2e22c": "_ownerOfLand(int256,int256)", +"b4c48026": "safeBlock()", +"b4c4e005": "testTransferToAcceptAuthority()", +"b4c555a7": "addCollaborateToCampaign(uint256,uint256)", +"b4c5c983": "setMainYouCollectContractAddresses(address,address,address,address[])", +"b4c64ab0": "Goo()", +"b4c65de3": "identify(string)", +"b4c65f7b": "bonusesByDates(uint256)", +"b4c7abaf": "waitTime(address,address)", +"b4c8c5c4": "isApprovedAddress(address)", +"b4c91611": "weiDistributed()", +"b4c93fc0": "setOneGroupJoinersCount(uint256)", +"b4c98496": "CreditAsiaCoin()", +"b4caf8be": "rewardPoolTokens()", +"b4cbdd8b": "setClaimSignerAddress(address)", +"b4cbff23": "disputeStartedFreeze(bytes32)", +"b4cc2181": "setPropertyBecomePublic(uint16,uint256)", +"b4cd3701": "PointGameWithITG(address,uint256)", +"b4cd8865": "getArrBoolField1()", +"b4cdd3b7": "buyCertainOrder(uint256,uint256)", +"b4cdeb78": "LarsGeburtstagsgruss()", +"b4ce8ae0": "updateCrowdsaleEndBlock(uint256)", +"b4cec530": "totalFailedOldOwnerTransferAmounts()", +"b4cf5648": "PRESALE()", +"b4cfd972": "ROUND_4_PRESALE_BONUS()", +"b4cff9f5": "depositBool(address)", +"b4d00d94": "setIcoCap(uint256)", +"b4d01e87": "urandom(bytes32,uint256)", +"b4d07c7d": "GetWorldSnapshot()", +"b4d07e81": "setString(bytes)", +"b4d0ccb6": "getVaultInterestPerDay()", +"b4d0e552": "rareStartPrice()", +"b4d11f35": "getReleased(address)", +"b4d12bfa": "withdrawStudios()", +"b4d14728": "setRateAddress()", +"b4d168f7": "getFundedTokenCount(bytes32,string)", +"b4d1c485": "unlockFunds()", +"b4d1d795": "PERIOD()", +"b4d314f2": "isWithinPeriod(address)", +"b4d3c122": "CXLTotalSupply()", +"b4d3ef5f": "contributedEth()", +"b4d40694": "getPreminer(address)", +"b4d462b3": "unlockDate3()", +"b4d49b62": "RemovedTokenHolder(address)", +"b4d510dd": "countOfSaleTokens()", +"b4d60cfd": "payoutMining(uint256,address,address)", +"b4d657cc": "modifyCurrentHeroPrice(uint256,uint256)", +"b4d6befe": "BuyForHKGTransaction(address,uint256,uint256,uint256,uint256)", +"b4d6d4c7": "getPackageData(bytes32)", +"b4d8166e": "northadvisor()", +"b4d85686": "deductFee()", +"b4d927d0": "moneyFreeze()", +"b4d9cc3a": "profitDisperser()", +"b4da40f3": "getBadBets(uint256)", +"b4da4baf": "OWPayoutArb()", +"b4da662c": "_acceptDividends(uint256)", +"b4dad588": "numPendingRequests()", +"b4daff13": "test(uint256,uint32)", +"b4db1fc1": "deleteCandidatesBatch(address[])", +"b4dbf642": "buyATicketFromContract(uint256)", +"b4dc3dc7": "unbundle(address,uint256)", +"b4de64bd": "Sarf()", +"b4de8673": "balance0f(address)", +"b4def1e7": "completedTransfers()", +"b4e05b89": "getOwnedShips()", +"b4e0aa3e": "testCallBack(uint256)", +"b4e0b764": "minSumICOStage5USD()", +"b4e19f3e": "getBestGuessSecondPlaceTentativeWinningPayoutDistributionHash()", +"b4e1a78e": "correctExchangeRateBTCxETH(uint256)", +"b4e28f79": "test_TorontoRules()", +"b4e327ec": "MajListNotVal()", +"b4e3add2": "_createCollection(string)", +"b4e3c486": "addProposal(uint16,uint256,string)", +"b4e50c9b": "contributed4(address)", +"b4e51b7b": "sane()", +"b4e56e01": "setMerchantRate(address[],int16)", +"b4e6850b": "add(uint80,uint80,address,uint32,uint32,uint32,uint256)", +"b4e68dc1": "ERC721BasicToken()", +"b4e6f92b": "BuyTroop(uint256,uint256)", +"b4e7fe0c": "pendingOraclize()", +"b4e81236": "_verifyOptionPoolIncome(address,uint256)", +"b4e8c036": "ProofOfWeakFOMO()", +"b4e92f20": "getInitializeUniverseValue()", +"b4e9ac13": "getAddressRefundValue(address)", +"b4ecb847": "areTokensDistributedForAddress(address)", +"b4ed3622": "calculateDecayedBalance(uint256,address)", +"b4ed7ec3": "getVoteOption(uint256,uint256)", +"b4ed8bf8": "removePolicyAttribute(uint8,uint256)", +"b4ee4f81": "Sotko()", +"b4eecb54": "s_pwd()", +"b4eff690": "checkFlag(bytes)", +"b4f14b2b": "DragonsBurned()", +"b4f15310": "invalidateHash(uint256,uint256)", +"b4f181c6": "ethToUsdExchangeRate()", +"b4f20aa9": "executionOpen()", +"b4f272e3": "TOPToken(uint256,string,uint8,string)", +"b4f2bb6d": "getPoolIds()", +"b4f2dc7d": "approveDividends(uint256)", +"b4f2e8b8": "setFee(uint256,address)", +"b4f3625e": "fuelContract()", +"b4f3b453": "reserveTimelock()", +"b4f40c61": "k()", +"b4f48e08": "projectFoundersReserved()", +"b4f4e284": "addAdminWhitelist(address[])", +"b4f5a21a": "getCurrentPeriodIndex()", +"b4f5a6a6": "minPurchaseOnce()", +"b4f5b9b9": "affiliatThreshold3()", +"b4f5d282": "getImmed(bytes32)", +"b4f666da": "capToken()", +"b4f6aa56": "getForSalePrices(uint16)", +"b4f7451b": "getTransactionVATTotal(uint256)", +"b4f80eb9": "getPixel(uint256)", +"b4f82c6a": "readCompany(uint8)", +"b4f94b4f": "_transferByDefaultPartitions(address,address,address,uint256,bytes,bytes)", +"b4f9529c": "RemoveMember(address,address)", +"b4f96d60": "_calculateBonus(uint256,uint256)", +"b4f9b6c8": "kill(bytes32)", +"b4fadcad": "relayMetaTx(uint8,bytes32,bytes32,address,bytes)", +"b4fc0344": "getAdsCountByCat(uint256)", +"b4fc3e3b": "createSchedule(address,uint256,uint256,uint256,uint256)", +"b4fcf935": "revealBet(uint256,uint256,bool,bytes32)", +"b4fe3017": "Whitelist(address[],uint256)", +"b4ff4f3d": "setCanMint(address,bool,int256)", +"b4ff87f2": "_approveTransaction(uint256,address)", +"b4ffaece": "setReservedTokensListMultiple(address[],uint256[],uint256[])", +"b4fffa52": "min_value()", +"b5000405": "gifted()", +"b5004d1c": "currentPotSplit()", +"b500cc08": "toBase58(bytes)", +"b501671c": "KillingChainToken(address,address,address)", +"b501df23": "Mintloot()", +"b503a2b9": "categoryId()", +"b503fcf3": "totalToSale()", +"b5040f0a": "getLastSessionVote(uint256,address)", +"b5044e85": "BATO()", +"b5046219": "getDailyPrice()", +"b504adda": "LOG_BetLost(address,uint256,uint256,bytes32)", +"b505a3f2": "LOG_Payout(address,uint256)", +"b505c6ef": "releaseTokens(address,address,uint256)", +"b507f7c4": "_setBlockHash(uint256)", +"b508069b": "implChangeReqs(bytes32)", +"b508adb9": "isStateInit()", +"b5093f7c": "HasNoEther()", +"b50954b6": "cancelWaitingForOpponent()", +"b509bae5": "OpenFundFactory()", +"b509c090": "getCurrEthValue()", +"b50a0899": "seeZombieDna(uint256)", +"b50a89f3": "MyToken(uint256,string,string,uint8)", +"b50bf8cb": "getStakeholderConfirmations(uint256)", +"b50c77f2": "initWallet2of3()", +"b50d2b35": "currentTokensRemaining()", +"b50e44b8": "EXCHANGE()", +"b50e4610": "refoundTokens(uint256)", +"b50eb5d7": "KeyTokenSale(uint256,address)", +"b50f2832": "set_participant_num_of_uses(address,uint8)", +"b50fa90b": "verPlayer()", +"b50ff2b8": "hiddenCapTriggered()", +"b51051d4": "addDataPoint(uint256,bool,string)", +"b510dc2a": "setIcoAddress(address,uint256)", +"b510e42c": "ethOfKey()", +"b510fe45": "newIdShip()", +"b5116a93": "getMyOwed(address,address)", +"b5120c30": "canBeClosed()", +"b5125493": "organizer4()", +"b5128f66": "view38()", +"b512e8a6": "agtAtnReceived()", +"b512f98c": "TSFINAL()", +"b5133189": "anotherOwner2()", +"b51459fe": "canWithdraw()", +"b5147d64": "getAccountCoords(address)", +"b515622f": "_getBonus()", +"b5160d6f": "setFreeMem()", +"b516444a": "mine_success(bytes32)", +"b516ce40": "manageKey(uint256,uint256,uint256)", +"b516cf2e": "MainContract()", +"b5175571": "changeCheckDate(bool,uint256,uint256)", +"b517570a": "ICO_TIER_FIRST()", +"b518a776": "tmp()", +"b519719e": "assertCheck(bool)", +"b51996de": "setWalletWithdraw(address)", +"b519c05b": "updateAdditionalEmission(uint256,uint256)", +"b519cf31": "rateLimiter_()", +"b51a81b4": "setOrganizationLogo(string)", +"b51aae5a": "ResetAirdrop(uint256)", +"b51abfcd": "BCBCOIN(uint256,string,string)", +"b51ac349": "_updateArtistLookupData(address,uint256)", +"b51ad456": "IsPreSaleEnabled()", +"b51b63f7": "sendMessage(address,address,uint256,uint256,bytes)", +"b51bda59": "_depositForRenter(address,uint256)", +"b51be1db": "infytoken()", +"b51c3d2a": "maxImmortals()", +"b51c4f96": "getCodeSize(address)", +"b51d42a2": "customPedro(uint256,uint256,bool)", +"b51d93eb": "confirmNewOwner(address)", +"b51dfa9d": "buySupply()", +"b51f86c0": "getCrcWithdrawAccount()", +"b520b68c": "withdrawForeignTokens(address,bool)", +"b520c7e7": "getWeeklyVolume()", +"b5217c39": "TotalCrowdsaleContributions()", +"b521c106": "bonusDate()", +"b521d3bb": "gcpn(uint256)", +"b522739a": "register_node(string)", +"b52303b2": "TransferToExchange(address,address,uint256,uint256)", +"b5232ba3": "registerUserWallet(address,uint32)", +"b523d13c": "VernamCrowdSaleToken()", +"b5247199": "readPhaseData(uint256)", +"b524abcf": "totalSupply(bytes32)", +"b525256f": "BloxrouteToken()", +"b525ab8d": "min_balance_for_bonus()", +"b5268fa4": "DisableTransfer()", +"b527b0a6": "setSaleAuction(address)", +"b5281b31": "purchaseMysteriousEmblem()", +"b52923a0": "setCompte_11(string)", +"b5299ca6": "giveMeat()", +"b52a3d8d": "initCaps()", +"b52a467c": "buyGold(bytes32,string,string,bytes32,string,string,bool)", +"b52a5851": "burnUnsold()", +"b52a6a38": "atLastUnclaimedFeeAllocation()", +"b52ae3fc": "transferBlackFunds(address)", +"b52b925d": "investorProfit()", +"b52bb6b9": "TokenSale(address,address,address,uint256)", +"b52c0c35": "setPayOutPercentage(uint8)", +"b52c1d5b": "calculateSeed(uint256[],uint256)", +"b52c64c7": "addNewInsurance(bytes32,uint256,uint32,uint32,bytes32)", +"b52db3b9": "updateRecord(address,address,bool)", +"b52e0dc8": "getRateAt(uint256)", +"b52fddbd": "setCrowdsale(uint256,uint256)", +"b53148ad": "currentAmountOfTokensWithNoBonus()", +"b5319335": "promoCreationLimit()", +"b531a872": "icoStop()", +"b532073b": "OwnerChanged(address,address)", +"b5320cd6": "test_22_assertGasUsage100Boards()", +"b532e4cb": "addModerator(address)", +"b5338408": "_numDigits(uint256)", +"b533ff5f": "getLockedStructTimeToLock(address,address,uint256)", +"b534b5b7": "issuedTokens()", +"b5352fa7": "MuMuToken(uint256,string,string)", +"b53564ea": "setInvestors(uint256[],address[],uint256[],uint256)", +"b535b5c3": "hashExists(bytes32)", +"b535c741": "makeOldFucks(uint32)", +"b5364560": "clearApprovalForGeneLab(uint256)", +"b536c686": "burnedTokens(address)", +"b536fa63": "stopGracePeriod()", +"b537488c": "GanaToken()", +"b537752f": "transfer(address,address,uint256,uint256,bool,bool)", +"b537f5b5": "settleBet(bytes32,bytes32)", +"b5389c20": "timeToBeBurned()", +"b538c5ea": "addWorkerPool(address,address)", +"b538cefc": "subtractDarknodeFee(uint256)", +"b538d3bc": "addArbiter(address)", +"b539cd55": "maxProfit()", +"b53aab4c": "changeServicePercentage(uint256)", +"b53b0a75": "Startex()", +"b53b1f12": "findRankByCount(uint256,uint256,uint256,uint256)", +"b53b3f41": "LuckyTree(uint256,uint256,uint256,uint256)", +"b53c71b6": "addLifeEvent(string,string,string)", +"b53c7245": "set_min_contribution(uint256)", +"b53dfdb9": "getTeamFund()", +"b53e07c4": "transferReward(uint256)", +"b53e9dfe": "requiredContribution()", +"b53ea172": "calcBindedBlindHash3(string,address)", +"b53ea1b6": "replaceKey(address,address)", +"b53eb39f": "getSecondsToComplete(bytes16,address,address,uint256,uint256)", +"b53f4d94": "setPOOL_edit_32(string)", +"b53ffba0": "owner_testEnd()", +"b5402ec3": "manager_withdraw()", +"b54030d5": "recordNr()", +"b54050c2": "_updateStateIfExpired()", +"b54144b2": "Receipt(address,uint256,uint256)", +"b5417a52": "TEAM_VESTING_WALLET()", +"b541a778": "SampleOffer(address,bytes32,uint256,uint256,uint256)", +"b5420d68": "getCategoryPack(bytes4,uint256)", +"b5432fcc": "setManagerAgent(address)", +"b5439012": "closeSale(address,uint256)", +"b543d4b4": "getMasterWallet(address)", +"b54430ce": "canSign()", +"b5444ef2": "becomeCoowner()", +"b5446457": "deleteRoomByIndex(uint256)", +"b544bf83": "lockTimestamp()", +"b545252c": "isNewDay()", +"b545ddf5": "calculateReleased()", +"b545f2a6": "cards_blue(uint256)", +"b547a726": "turnOff(address)", +"b547aeda": "spawn()", +"b547b7a1": "committeesMap(address)", +"b54811f1": "EtheremonTransform(address,address,address,address,address,address,address)", +"b5481743": "exchangeRateAgent()", +"b5483f28": "changeAddressJoker(address)", +"b548b892": "getMarketWithInfo(uint256)", +"b548c6f6": "Transaction1()", +"b549793d": "scheduleCall(bytes4,bytes,uint256,uint256,uint8,uint256)", +"b549bdda": "XavierToken()", +"b549c6b3": "_transferInvestor(address,uint256)", +"b54a7987": "LogGetDeposit(address,uint256,string)", +"b54b1187": "setdteamVaultAddr4(address)", +"b54b4fb9": "getPriceOf(uint256)", +"b54beedc": "getCCH_edit_10()", +"b54c71eb": "weightedVoteCountsOf(uint256)", +"b54ca7b4": "setIncreaseK(uint256)", +"b54cd451": "updateFlightStatus(bytes32,uint256)", +"b54d6238": "releaseToken(uint256)", +"b54e7a4a": "sanitize(string)", +"b54eb822": "redistributionTimeout()", +"b54ef544": "buyStakeWithStarCoin(uint256,address)", +"b54f24a9": "getMappingID(string,address,address)", +"b55027a9": "maxMinutesFundingPeriod()", +"b550e634": "getTotalInvestmentsStored()", +"b551c373": "getTotalReputationSupply(bytes32)", +"b5522e89": "addContract(address,uint256)", +"b5531651": "Startable()", +"b553b715": "rewardDistributedUnits()", +"b55459d1": "User_5()", +"b5545a3c": "claimRefund()", +"b554d538": "recoverBounty()", +"b554f8eb": "withdrawAllWei(address)", +"b5554e73": "getPlayerJackpot(address,uint256)", +"b5558562": "tokenWithdraw(address)", +"b556188e": "finaliseTime()", +"b5563dcf": "BillOfSale()", +"b5565aac": "endPromotion(uint256)", +"b556861a": "add_tokens(address,uint256)", +"b556a895": "incFreezeHybridizationsCount(uint256)", +"b556ff26": "NewBid(bytes32,address,uint256)", +"b557478a": "refundClaimed(address)", +"b557a11d": "getReplyCount(bytes32)", +"b557c9a4": "slaveWalletInitialized()", +"b5581663": "airDropMultipleAmount(address[],uint256[])", +"b55845e7": "totalExchange()", +"b55867ea": "_goldUnFreeze(uint256)", +"b558a50c": "LongevityCrowdsale(address,uint256)", +"b558d1ea": "updateRate(address,uint256)", +"b558f334": "isRedemptionPermitted(address,uint256,uint256)", +"b559490d": "payVisa(uint256,uint256)", +"b559b0fe": "withdrawFromRemainingTokens(uint256)", +"b55a7d45": "multiplierPercent()", +"b55ad27e": "getBlipTokenAddress()", +"b55b089b": "bigTokensPerEther()", +"b55cdbf9": "setExtraBalance(address,uint256)", +"b55cff2d": "test_twoValidEqBytes()", +"b55da874": "create_private_room()", +"b55e31f4": "assertOrders(address,bytes32)", +"b55fc3d6": "UnregisterList(address[],bool)", +"b560b6da": "enableDistrict0xNetworkTokenTransfers()", +"b560c4de": "adminPayout()", +"b560d589": "getUserInvestBalance(address)", +"b561d5b3": "OrguraExchange()", +"b5622abc": "EuroGoldTest(uint256)", +"b563b75d": "getAdminRevenue()", +"b564561e": "register(bytes32[])", +"b56494c0": "validateBoard(uint256[81])", +"b56537ef": "isEASigned(uint32)", +"b566d0b4": "getContributorRemainingPresaleAmount(address)", +"b5674c68": "TokenGNO(uint256)", +"b5675ee4": "bookkeeping(uint8,uint8,uint256)", +"b56797fd": "getSaleHourNow()", +"b567a1e7": "ShopClosed(uint32)", +"b568e689": "getCrowdsaleWhitelist(address,bytes32)", +"b5692a67": "removeExemptionAddress(address)", +"b569a35f": "YSSYBToken(uint256,string,string)", +"b56a9f2c": "heartBeat()", +"b56aef62": "sampleTypes(uint32)", +"b56b2627": "add_owner(uint256,address)", +"b56b366b": "maliceReportedForBlock(address,uint256)", +"b56b5918": "TicketRefund(uint256,address,uint256)", +"b56b64d9": "disputing()", +"b56ccd93": "arr(address,address,address)", +"b56d3ccc": "select(bytes32,bytes32,bool)", +"b56d4717": "lockOwner(address)", +"b56e1bca": "setExchangeToken()", +"b56e2d76": "testRewardSS(string)", +"b56ea5cc": "specialApprove(uint256,bytes32,bytes)", +"b56ebf42": "GetNow()", +"b571324d": "ShareErc20(string,string,uint256)", +"b57228fd": "ChangeEmissionGrowthCoefficient(uint256)", +"b5725445": "setOptionalFeeSplit(address,uint256)", +"b5738a78": "SatoMotive()", +"b573a104": "secondStageTokenRate()", +"b5740cc2": "preSaleVault()", +"b5744134": "setLaunchDate(uint256)", +"b5754045": "disown(string,address)", +"b57566d8": "setvalue(string,string)", +"b5776339": "transferGDPOracle(address)", +"b5784f6f": "testMultiplePackages()", +"b57874ce": "addressToPass(address[],bool)", +"b578e764": "ACNN()", +"b579184f": "addContributor(address)", +"b57934e4": "haltCrowdSale()", +"b5794222": "destroyAndSendToStorageOwner()", +"b57980ce": "prepareContribution(uint256,uint256,uint256)", +"b579b6c5": "distributeToken(uint256,uint256,bool)", +"b579d7de": "RewardEnd()", +"b57adee3": "setBanker(address,uint256,uint256)", +"b57c5814": "getDonatorsNumber()", +"b57d5d27": "assertBalance()", +"b57dbdc6": "safeguard()", +"b57e55ec": "seeAllPlayers()", +"b57e6ea1": "tokenGenerationMax()", +"b57ff495": "triggerPauseEvent()", +"b5802ae6": "getCirculationCap(address)", +"b5809c9b": "COPPER_AMOUNT_TPT()", +"b580a7a1": "totalBalanceClaimed()", +"b580d205": "ChangeRate(uint256,uint256,uint256,uint256)", +"b58166f2": "lastRoot()", +"b581b725": "transferToken(bytes8,address,uint256)", +"b582ec5f": "j()", +"b58489ac": "isAuction(string)", +"b5848db4": "validateStartMegabox(address,uint256)", +"b585245b": "_callSender(address,address,address,uint256,bytes,bytes)", +"b58617d9": "CCRCrowdsale()", +"b58637e8": "approveToSell(uint256)", +"b5863ed7": "addContribution(address,uint256,uint256,uint256,uint256)", +"b58696ba": "test_ShouldPassButNoBondSoFail()", +"b587194e": "TokenMigration(address,uint256)", +"b587dc57": "openICO()", +"b587e3c7": "getRank04()", +"b5881422": "unsafeIsEth(uint16)", +"b588bfad": "writeMessage(string)", +"b588fdc1": "takeTokenContractOwnership()", +"b58aa6be": "checkWithdrawalAmount()", +"b58b9d5c": "getSaveData(address,address)", +"b58baa0d": "displayString()", +"b58c2d31": "addAddressManual(address)", +"b58d0651": "checkAllowedAddressFoTransfer(address,address)", +"b58d4885": "addNewTrait(string,bool)", +"b58de1d5": "JSONpath_int(string,string,uint256)", +"b58dff99": "gntContractAddress()", +"b58e5216": "allowBlocking(address,address)", +"b58e60db": "theWord()", +"b58ee9a3": "companyRemainingAllocation()", +"b58f4a24": "LOTTERY_FUND_ADDRESS()", +"b58fa125": "commit_end_time()", +"b58fc3e7": "distributeIncomeEther()", +"b5917478": "TYPE_FREIGHTER()", +"b5919b48": "toBuyBack()", +"b591fc69": "totalEtherContributed()", +"b5922a2b": "INITIAL_AIRDROP()", +"b592500e": "RICEBALLZ()", +"b59284ac": "unlinkAddress(address)", +"b592bb99": "SSDToken()", +"b592de3a": "sell(bytes32,uint256)", +"b5930872": "test_testablestandardcampaignDeploymentAndUse()", +"b5931f7c": "safeDiv(uint256,uint256)", +"b5932ee2": "DistrictsCore()", +"b5936da2": "seedEnded()", +"b594f086": "changeDuration(uint256)", +"b5950529": "CTSCToken()", +"b595181f": "ShapeshiftBot()", +"b595357b": "getLLV_edit_29()", +"b5957288": "getMatchBettingDetails(uint8)", +"b59589d1": "relay()", +"b595b8b5": "betOnColor(uint256)", +"b5962159": "moveMinions(uint8,uint8,uint32)", +"b5967e16": "updatePlayersGoo(address)", +"b59712af": "totalSupplyOfType(uint256)", +"b59724e8": "NewFunding(address,address,uint256,uint256,uint256,address)", +"b597842a": "TimeNow()", +"b597e784": "setTokenPriceInWei(uint256)", +"b5980f7d": "unverifyAddress(address)", +"b598afcb": "oraclize_query(string,bytes[5])", +"b598d3e8": "getMessages(address,uint256)", +"b598f882": "updateTokenRates(uint256)", +"b5999c12": "getPoohsSinceLastHatch(address)", +"b599aaec": "TheBitcoinCenterToken()", +"b599afc8": "totalBetCount()", +"b59a1598": "distributeGLAU(address[],uint256,uint256)", +"b59a1d37": "buy1(uint256)", +"b59a60db": "minContribute()", +"b59b0fc4": "modifyTokenPrice(uint256,uint256)", +"b59b44f5": "usePlayerFiboken()", +"b59b6acb": "GetDynamicCardAmountList(address)", +"b59bb5e3": "testcall(address)", +"b59bc382": "setReportingFeeDivisor(uint256)", +"b59ca0f6": "registerDINsWithResolver(address,address,uint256)", +"b59d689f": "grantStock(address,uint256,uint256)", +"b59d7fe6": "EtherbotsBase()", +"b59dd856": "GetCardInfo(uint8)", +"b59f16d1": "Set(bytes32,address,address)", +"b59ffdd3": "getFreeAnthill()", +"b5a01992": "setDDF(address)", +"b5a02db1": "totalHouseWinnings()", +"b5a030d8": "link(bytes32[],bytes32[],address[],uint8[],bytes32[],bytes32[])", +"b5a04829": "setLargeCapWhitelistParticipants(address[],uint256)", +"b5a0596e": "declareCheaters(address[])", +"b5a127e5": "minQuorum()", +"b5a1a64b": "lockedRewardsOf(address,address)", +"b5a27a21": "leave_square(uint256)", +"b5a29d11": "purchaseCRS(uint256)", +"b5a312c6": "mintlvlToken(address,uint256)", +"b5a46d5e": "whoOwner()", +"b5a4a146": "generateRnd(bytes,uint256,uint256)", +"b5a4e04a": "canFinalizeEarly()", +"b5a54627": "setPrimaryGameManager(address)", +"b5a5b8f5": "setPreSaleContract(address)", +"b5a60045": "setJob(uint256,string,string,uint256[],uint256,uint256,uint8[],uint8,bool,address[])", +"b5a678d7": "YouRyuCoin(uint256,string,string,uint8)", +"b5a6c525": "extractFrozenAccountLength()", +"b5a7900e": "nextroundsoldierreplenishrate()", +"b5a89065": "getUserData(address,string)", +"b5a8fa80": "VRChainToken(string,string,uint8,uint256)", +"b5a90793": "Sender(uint256,address[])", +"b5a9823f": "tier3Time()", +"b5a9de6e": "minEtherParticipate()", +"b5aab008": "WobToken()", +"b5aae6fc": "_setCurrentSecret(uint256)", +"b5aae91a": "handle_dividend(address,address)", +"b5ab05a5": "tokensHardCap()", +"b5ab58dc": "getAnswer(uint256)", +"b5ac7894": "partnerInfo_for_Partner(bytes32,uint8,bytes32,bytes32)", +"b5ac7c27": "payForOrder(uint256,address,uint256)", +"b5add717": "claim(uint256,uint256,uint256,uint256)", +"b5ade81b": "_BLOCKS_PER_READJUSTMENT()", +"b5ae4519": "endorsements()", +"b5ae64b2": "piStartTime()", +"b5ae8225": "auditSwap(bytes32)", +"b5aebc80": "donate(string)", +"b5aece02": "silverBoxAmountForSale()", +"b5af411f": "NXETToken()", +"b5afb120": "updateSkill(uint256,uint256,uint256,uint256)", +"b5afd61b": "maxForceOffsetAmount()", +"b5b12e75": "isApprovedFor(uint256,address)", +"b5b13462": "getUserTotalSales(address)", +"b5b1fc05": "getAdminFromMintedCappedProxy(address)", +"b5b26505": "DURATION_SALESTAGES()", +"b5b33eda": "scheduleCall(address,uint256)", +"b5b3fc07": "GlowToken()", +"b5b4d0d6": "COLLATERAL_HELD()", +"b5b52096": "fixedFeeInCWC()", +"b5b5a057": "changeMinimumDonation(uint256)", +"b5b64d24": "GetExistsChipList()", +"b5b73c63": "getUserSignedDocuments()", +"b5b77d7f": "executeSettingsChange(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"b5b7916b": "getMembershipType(address)", +"b5b7d767": "vpe_per_eos()", +"b5b86a51": "getReferralBalance(address)", +"b5b879c2": "mAlek()", +"b5b90a26": "addHash(bytes32[])", +"b5ba7074": "isBelow(uint256,uint256,string)", +"b5ba95a0": "ElectronicMusic()", +"b5ba9a7e": "getReferralPackageKind(bytes)", +"b5bab68e": "minLimitPublicSecondSale()", +"b5bb0ade": "agreementExists(bytes32)", +"b5bb5ee4": "withdrawMintTokens(address,uint256)", +"b5bd3eb9": "totalCredits()", +"b5be0ebb": "MStoken()", +"b5bf15e5": "freeze(bool)", +"b5bf4c74": "RandomWinner()", +"b5bf6eb6": "incrementPrice()", +"b5bfdd73": "addDSource(string,bytes1,uint256)", +"b5c05570": "toggleLockIn()", +"b5c07eab": "metaBaseUrl()", +"b5c0c884": "refundLosersBids(uint256)", +"b5c12c09": "cancelRequest(uint32,string)", +"b5c12f4d": "setWhitelistRequired(bool)", +"b5c14adb": "setGamePaused(bool)", +"b5c150d4": "availableAmount(uint256)", +"b5c1662f": "addWei(address,address,uint256)", +"b5c18ea8": "rejectClearingPriceSubmission(address,address,bytes32,uint256)", +"b5c19d59": "betLastTime()", +"b5c1ac14": "toBE()", +"b5c2b889": "XTVBurned()", +"b5c2c600": "Gave(address)", +"b5c3a111": "depositCell(address,uint256)", +"b5c4147f": "getZoneShop(bytes2,bytes16)", +"b5c47f69": "megaRate()", +"b5c56797": "AIMToken()", +"b5c5a635": "incrementProgressOfAddressAndId(address,address,uint32)", +"b5c5f672": "withdraw(address,uint256,uint256)", +"b5c61e90": "TokenMigration(address)", +"b5c645bd": "record(bytes32)", +"b5c6b5a2": "FishFarmer()", +"b5c6e7d6": "getCountsByName(bytes32)", +"b5c73816": "ASSC()", +"b5c7a4e4": "validateReleasedToken(uint256)", +"b5c7b1fe": "claimTokenTokens(address)", +"b5c83592": "offerExists(uint256)", +"b5c8b021": "testMintableToken()", +"b5c8f317": "SimpleERC20Token()", +"b5c90917": "GetAllReferralAddresses()", +"b5c9cbbe": "setBalance(address,address,uint256)", +"b5c9fa0a": "setBountyRewardPercent(uint256)", +"b5ca87c4": "setAccountFactoryV1(address)", +"b5caadf2": "setParams(address,address,address,uint256,uint256)", +"b5cab1ce": "tokenMetadataBaseURI()", +"b5cadc91": "convertForMultiple(address[],uint256[],uint256[],uint256[],address)", +"b5caf461": "removeAllApprove()", +"b5cb0611": "setCrowdsaleState()", +"b5cb15f7": "getUserCount()", +"b5cb6a17": "capDay3()", +"b5cc7e29": "unfreezeTokenTransfer(bool)", +"b5cc84f5": "getVatomOwner(string)", +"b5cc916c": "CITY_PRICE()", +"b5cd1821": "lastBlock_a0Hash_uint256()", +"b5ce3600": "thirdStageDuration()", +"b5cf852d": "triggerHiddenCap()", +"b5d011fd": "updateCalculator(address)", +"b5d02a56": "nextRand(uint256)", +"b5d03751": "YoutubeViews()", +"b5d0c747": "setApiCallsContractAddress(address)", +"b5d0f16e": "getGasScalar(uint256,uint256)", +"b5d11d39": "validatePurchase(uint256)", +"b5d11e99": "testInit()", +"b5d1220a": "hasPreviouslyEnteredCardIds(uint256[])", +"b5d125f1": "isApprenticeChest(uint256)", +"b5d1548c": "CCH_RE_1()", +"b5d1990d": "numRecords()", +"b5d1aedc": "COLOR_YELLOW()", +"b5d29f21": "authorizationPayment()", +"b5d347ed": "CryptoCityToken()", +"b5d34966": "unlockCapital(address,uint256)", +"b5d3a379": "CanaryTestnet()", +"b5d3a9c6": "groomSignedAt()", +"b5d446ab": "mokenEra(uint256)", +"b5d561bb": "migrateManual(address,bool)", +"b5d65f61": "partialRedeem(uint256,bytes32)", +"b5d6cbfe": "FSHN()", +"b5d76067": "Alter_TrustlessTransaction(uint256,bool)", +"b5d7df97": "Sign()", +"b5d7eca5": "token_was_created()", +"b5d8514b": "Arthimetic()", +"b5d86c86": "ownerOfCountryCount(address)", +"b5d89627": "getValidator(uint256)", +"b5d9ac79": "toB32(bytes,uint256)", +"b5d9f80b": "serverEndGameConflict(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address,bytes,address,bytes32,bytes32)", +"b5da0114": "isNull()", +"b5da2df4": "markAsImported(address,address)", +"b5dadb17": "whitelistThreshold()", +"b5db26cd": "manualOverrideEditionBid(uint256,address,uint256)", +"b5dba35b": "onlyMinterMock()", +"b5dc40c3": "getConfirmations(uint256)", +"b5dc9399": "fetchPaidOrdersForPayerByAdmin(address)", +"b5dcbb69": "takeRegion(uint16)", +"b5dd20e9": "createIsland(bytes32,uint256,address,uint256,uint256)", +"b5de8d4c": "getModule(address)", +"b5dea68c": "_addNewEscrow(address,address,address,uint8)", +"b5debaf5": "exp(uint256,uint256,uint256)", +"b5debd95": "totalAmountOfEarlyPurchasesInCny()", +"b5deeca7": "BaseRegistry()", +"b5df3ef8": "WillWithdraw(uint256)", +"b5dfad16": "specialSkinOfTokenId(uint256)", +"b5dfd153": "withdraw(uint256,uint256,address,uint256)", +"b5e02e84": "Exorbuxcom()", +"b5e11819": "disableContract(bool)", +"b5e12715": "updateRankList(address)", +"b5e1fe13": "thirdTokenExchangeRate()", +"b5e221c1": "winnerBidder()", +"b5e292d3": "processHandEnd(bool)", +"b5e2bb10": "reserveBalanceOf(address)", +"b5e3504a": "HumanX1()", +"b5e35248": "stage2NotReached()", +"b5e36417": "transfer(uint256[])", +"b5e4d6ce": "addOrder(bool,uint32,uint128,uint128,uint32,int256)", +"b5e4ece1": "LOG_GasLimitChanged(uint256,uint256)", +"b5e54406": "amountOfItem()", +"b5e574e9": "SetGasSell(uint256)", +"b5e59318": "SLPC_ERC20Token()", +"b5e71687": "getTeam4name(string)", +"b5e73249": "mint(address,uint256,bool,uint32)", +"b5e8077c": "_unpackWarriorId(uint256,uint256)", +"b5e82975": "setMintDone()", +"b5e872e0": "TransferFeeRateExecuted(uint256,address,uint256)", +"b5e8cf02": "burnReward(uint256)", +"b5e91891": "changeStock(address)", +"b5e989c7": "ballotOptions(uint32,uint32)", +"b5ea510a": "YOBTC()", +"b5eaac7f": "pushBlockVerifierAddress(uint256,address)", +"b5eacc01": "investor(address,uint256,uint256)", +"b5ec85f0": "getOldBalanceOf(address)", +"b5ed298a": "proposeOwner(address)", +"b5ed886f": "getExchangeRateInCents()", +"b5ee6f3d": "isVotingPhaseOver()", +"b5eeee6e": "cleanSeedUp(address)", +"b5ef06d0": "changeDeveloperETHDestinationAddress(address)", +"b5ef0ab1": "openDispute(bytes32,address)", +"b5ef649d": "GetChipUsedNum(uint32)", +"b5f09a39": "lockupDate()", +"b5f0f41b": "allowedTransferTo(address)", +"b5f12736": "CustomToken(uint256,string,string,uint256)", +"b5f16939": "saleRevenue()", +"b5f16e48": "setShareholder(address,bool)", +"b5f187b9": "changeFundWallet1(address)", +"b5f2054b": "getWinningsBalance(address)", +"b5f228d7": "LiquidityNetworkToken()", +"b5f26055": "restrictedStockSendTimeOf(address)", +"b5f3484d": "PaymentStatusTimeStamp(address)", +"b5f3e71a": "addAddressToAdminlist(address)", +"b5f45edf": "marketPoohs()", +"b5f50ef3": "claim_prize()", +"b5f529cf": "orderNotAccepted()", +"b5f5962a": "CALL_GAS_CEILING(uint256)", +"b5f59a92": "LUV_Crowdsale()", +"b5f5d582": "TPortToken()", +"b5f6b1f6": "setBonusThreshold(uint256)", +"b5f72d88": "beginProjectRound(string,uint256,uint256)", +"b5f78d11": "purchase(bytes8)", +"b5f7f636": "totalTokenSold()", +"b5f918ff": "roundOneAmount()", +"b5f9371a": "writerAccountSupply()", +"b5f9b1c2": "Bonds(uint32)", +"b5f9ca19": "doesPaymentExist(address,address)", +"b5fa2044": "SetPatentProperties(uint256,uint256)", +"b5fa77bd": "SetAddress(string,address)", +"b5fb19ed": "addressEccles()", +"b5fbc49f": "isAreaEnabled(string)", +"b5fcfbcc": "_getProviderAdmin(uint256)", +"b5fd76bb": "AddLocation(string)", +"b5fdeb23": "getMsg()", +"b5fe79db": "getInfoLevels()", +"b5fea522": "putBtcWithStc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"b5fecc30": "stockSupply(uint256)", +"b5ffa082": "StorageUpdated(address)", +"b6010fcd": "getItem(string)", +"b6013cef": "finalize(uint256,uint256)", +"b6015204": "receiver2()", +"b601818b": "newOwner(string)", +"b601e850": "loanMatured(address)", +"b6027026": "AOK()", +"b602a917": "changeTransferStats(bool)", +"b6030d35": "nProposals(uint256)", +"b6033daf": "getMintingPowerByAddress(address)", +"b6034964": "_endContestIfNeeded(address,uint256)", +"b6037759": "setStudentNumber(uint256)", +"b603cd80": "killMe()", +"b604a86e": "ratePublicSaleStage()", +"b604ad72": "create(string,string,uint8,uint256,address)", +"b604ed1b": "withdrawByGid(uint256)", +"b6055167": "receiveExternalProfits()", +"b6057719": "setMinAuditStake(uint256)", +"b6062b5b": "ICO_TOKENS()", +"b6069742": "propertyLatLongOf(uint256)", +"b607068c": "getMyDividendRate()", +"b60710c0": "LogWithdrew(address,uint256)", +"b60761c4": "Internet(string,string)", +"b607ea45": "claimTilesForNewUser(bytes32,bytes,bytes32,bytes32,uint16[],address)", +"b60868be": "getFishAtBase(uint256)", +"b608c938": "releaseNextShares(uint256)", +"b6096ce9": "EloTest()", +"b609d0e6": "lastOracleUpdate()", +"b60a7405": "_addOwner_(address)", +"b60a82e0": "addSponsorship(address,uint256,uint256)", +"b60ad98d": "Board(address,bytes32)", +"b60afaa4": "distributeLCWP(address[],uint256,uint256)", +"b60b3c59": "otcPurchaseAndEscrow(uint256,address)", +"b60b7084": "builtOn()", +"b60b9fcb": "joinGame(uint256,uint256)", +"b60b9ff7": "Shopdex()", +"b60cc68b": "MIN_ICO_SLOGN_COLLECTED()", +"b60cee3c": "countAllSmartSharingContract()", +"b60d4288": "fund()", +"b60e00b9": "disableBets()", +"b60e2333": "joinTeam(uint256,address,uint256,uint256)", +"b60e6bc0": "tokenIdToApprovedRecipient(uint256)", +"b60e72cc": "log(string,uint256)", +"b60eb800": "addressSCEscrow()", +"b60f54f4": "SortingCoins()", +"b60f5b91": "isPreICO()", +"b60ffa9c": "setDistributeAgent(address)", +"b61012a9": "preICOparticipated(address)", +"b610c75e": "incrementTimestamp(uint256)", +"b611d649": "GteChainERC20()", +"b61241ed": "allocateTokens(address,uint256,address)", +"b612ac29": "BONUS_15_DAYS()", +"b61334b1": "setPayoutsWallet(address)", +"b6136dca": "alt()", +"b61386fb": "registerHandle(string)", +"b6139992": "issue(address,address,uint256)", +"b613df16": "_finishBet(bool,address)", +"b614213d": "maxPriceInWeiFromUser()", +"b615243a": "getExtraTokens(address)", +"b6172704": "isConfirmedStakeholder(uint256)", +"b61727ed": "_transferTo(address,address,uint256)", +"b6176a33": "addStakeholderTransaction(address,bool)", +"b617a4fd": "getClientCategory()", +"b617cf42": "removeExchange(address,uint256)", +"b618214a": "enableService(address)", +"b618387a": "registerBuyer(string,string)", +"b618cbba": "EvLoginfo(string,string)", +"b618d9a4": "checkStatus(address,address,uint256)", +"b6195134": "changeAdminToo(address)", +"b61992e7": "setPricePerBlockInWei(uint256)", +"b61a98cb": "updateMarriageLicenceImageIPFShash(string)", +"b61c0503": "fireEventLog1()", +"b61cb058": "setAvatarFee(uint256)", +"b61cbcd3": "nextGenome()", +"b61d27f6": "execute(address,uint256,bytes)", +"b61d4511": "maxPreIcoTokens()", +"b61daaee": "tokenBase()", +"b61e96a5": "requester()", +"b61f16e3": "getEarningsPool()", +"b61f36f7": "calculateWdxFee(uint256,uint256,uint256)", +"b61fa7c0": "doAirdrop2(address,address[],uint256)", +"b6206e67": "unitBattlePLATCost(uint256)", +"b6213490": "initialDrop()", +"b6215091": "Test2Token()", +"b621bd15": "SALES_END()", +"b622ab4a": "buyWithFunction(bytes4)", +"b6230a74": "icoStatusUpdated(address,string)", +"b623f5e5": "checkSetCosignerAddress(address)", +"b62418a1": "decrementOpenInterest(uint256)", +"b624fc54": "rafEnd()", +"b6253539": "needsInitialization()", +"b62596a2": "fundStorageVaultAddr()", +"b625dd87": "getUpdateTAOContentStateSignatureAddress(address,bytes32,address,bytes32,uint8,bytes32,bytes32)", +"b6261d0a": "acceptOffer(address)", +"b6266248": "refunded(uint32)", +"b626913f": "buy_block()", +"b627cf3b": "welcome()", +"b627ff04": "Sheep(string,string)", +"b6282d0d": "angelOnBattleboards(uint64)", +"b628672b": "setPreSaleHalt(bool)", +"b6288553": "decim()", +"b6294bde": "AdminGetFee()", +"b629d741": "transferUnownedPlanet(address,uint256)", +"b62c0b41": "MintByBTC(uint8,address,uint256)", +"b62c208f": "CryptoQuantumTradingFund()", +"b62c3a4f": "FinastraToken()", +"b62d4301": "testingSelfDestruct()", +"b62d4ce1": "canLayEgg(uint64,uint32,uint32)", +"b62eac16": "CrowdsaleProxy(address)", +"b62f0a6b": "YouTubemasterReq()", +"b62fc7c0": "buy2(address[],address[],uint256[],bytes,bytes)", +"b63005ec": "withdrawJuror()", +"b630230a": "MIN_CROWSALE_TIME()", +"b6304c2a": "KOINCONEKT()", +"b6307f0e": "nLuckyVoters()", +"b630aa48": "tokensSentPresale()", +"b630d706": "thisisfine(uint256)", +"b631c8e8": "_generateCastleSale(uint256,uint256,uint256,uint256)", +"b632d2e0": "SingularityTest20()", +"b633620c": "getTimestamp(uint256)", +"b6339418": "storeNumber(uint256)", +"b633b2ab": "getNextRoundTimestamp()", +"b633d272": "emitWorkResumed(uint256,uint256)", +"b633e4cd": "claimBalance(address)", +"b63423a3": "testCheckoutCart()", +"b63426b3": "Oxygen()", +"b634fc77": "FathomToken(address,address,uint256,address)", +"b6356251": "callThisContractBalance()", +"b63569c3": "developer_address_for_C(address)", +"b635a52d": "disconnectOrderPrice(address,address,uint256)", +"b635ba5f": "getEthValueAmount()", +"b6363cf2": "isOperator(address,address)", +"b63688d3": "setValidationOpen(uint256)", +"b637b269": "maximumValueDuringGuaranteedPeriod()", +"b637b7c4": "BZToken(uint256,string,string)", +"b638f72a": "_preICOSale(address,uint256)", +"b6397a42": "lotteryGiveHunt()", +"b639c9ec": "burnWarrior(uint256,address)", +"b63a35bf": "CTX_Cap()", +"b63a61d3": "auther_user()", +"b63adb3a": "preico(uint256,address,uint256,uint256)", +"b63bb5c6": "SNToken(uint256,string,string)", +"b63c2ac4": "setPowerContract(address)", +"b63c57f1": "buyForBitcoin(address,uint256)", +"b63ca981": "setHKGPrice(uint256)", +"b63cf3ca": "BitcoinDiamond()", +"b63deb24": "setSendProfitsReward(uint256)", +"b63df2a0": "approveControllerContractMigration()", +"b63e0cd8": "start(uint32)", +"b63e93dc": "ownerClawback()", +"b63ed405": "getWeiBalance()", +"b63f0d20": "newcheckToken()", +"b642c768": "_distributeTeamToken(uint256)", +"b642d58f": "INIT_DATE()", +"b6435f00": "getUsersAwaitingForTokensTop150(bool)", +"b6438092": "ManifestoCount()", +"b643f2c9": "stopDefrost()", +"b644ee41": "PRESALE_END_DATE()", +"b6469620": "getPersiansBattlePoints()", +"b64698cb": "_resolveAquarium(uint256)", +"b646c194": "addApprover(address)", +"b647990a": "countVotes()", +"b6481a92": "GotingToken()", +"b6496c6a": "addressLUTSize()", +"b64a097e": "info(bytes32)", +"b64afbe5": "participate(address,uint256)", +"b64b09d5": "invokeFallback(address)", +"b64bbd9e": "Finalizable()", +"b64c154a": "Klassicoin()", +"b64c1e7e": "claimForDeposit(address,address)", +"b64c4905": "sellVolumesCurrent(address,address)", +"b64c9326": "projectoperation_beneficiary()", +"b64d44f1": "TeamLockingPeriod12Months()", +"b64dc853": "onCompensated(address,uint256)", +"b64e2fc4": "getIncludes(uint256)", +"b64e8ad8": "addAllocationPartTwo(uint256)", +"b64eecb1": "transactionRequestCore()", +"b64f3cac": "getDSPRegistry()", +"b64ff429": "consent(bytes32[])", +"b64ff868": "getAdvertisers(bytes32,uint256)", +"b650048b": "unpausePlayerContracts(uint256,uint256)", +"b6506f25": "setLLV_edit_20(string)", +"b6508067": "lastTotalSupply()", +"b6509c12": "Ethereum_twelve_bagger()", +"b650bbef": "safetyInvariantCheck(uint256)", +"b65177ee": "ERC827Receiver()", +"b651cbaf": "add_level(address,bytes)", +"b652c822": "transferPosition(bytes32,address)", +"b652dc2f": "SOFT_CAP()", +"b65412b5": "refundPayment()", +"b65418f5": "raisedIcoValue()", +"b6549f75": "revoke()", +"b654bdb0": "HIBA()", +"b655078a": "getPlayerWager(uint256)", +"b655d0c4": "getBaseRate()", +"b655e138": "sliceAddress(bytes,uint256)", +"b655f822": "Ballot()", +"b655fda2": "updateUserFullName(address,bytes32)", +"b656850a": "_getStakingEpoch()", +"b656e9f4": "isInTestMode()", +"b6576bdf": "getValue(bytes)", +"b657ae63": "eSendTokens(address,uint256)", +"b657c996": "control(address)", +"b6581516": "crossForkDistribution()", +"b6588ffd": "del()", +"b65a1350": "rateLastWeek()", +"b65a34f5": "CeffylToken()", +"b65ae769": "WithdrawSpecialToken(address,uint256)", +"b65b3f80": "exchangeAndSpend(address,uint256,address)", +"b65b4c9a": "sponsoredBonusMax()", +"b65b99a3": "_verifyDate(string,uint256)", +"b65bce8b": "ContractDisabledEvent(uint256)", +"b65be60d": "_updateLots(uint256)", +"b65c2611": "setUnfreezeTimestamp(uint256)", +"b65c2b40": "incrementLastTokenId()", +"b65c3a7f": "calcAmountAt(uint256,uint256,uint256)", +"b65cb801": "SnailToken(uint256,string,uint8,string)", +"b65d0807": "Carpio()", +"b65dc843": "crowdsaleMintingCap()", +"b65ddf2b": "addTipForDeveloper(uint256)", +"b65e1ab8": "setGoldmintFeeAccount(string)", +"b65f3bb5": "executeOffset(address,uint256,address,uint256)", +"b65f90e3": "split(uint8,bytes6,uint8)", +"b65ff419": "deleteNick()", +"b6607cc5": "AML_THRESHOLD()", +"b6608467": "updateShares(uint256)", +"b660d77c": "switchMPO(address,address)", +"b6615acc": "_isAllowed(address,uint256)", +"b661f55d": "saleTokensHaveBeenMinted()", +"b6622c0f": "updateDonor(address)", +"b6629d98": "placeBetEth(bytes)", +"b6629e20": "purchaseWithEth(uint256)", +"b662a73c": "freezeUpgrade()", +"b662dc9b": "OWNER_SUPPLY()", +"b662ef9c": "InsuranceMasterContract()", +"b6635be6": "setupComplete()", +"b663dc0a": "ONE_QUINTILLION()", +"b6644080": "ADMIN_GET_USD(uint256)", +"b66578dc": "nextSeedHashB()", +"b6660af4": "schelling(address,address,bool)", +"b667486d": "BetClosedNoWinningTeam(address,uint256)", +"b6674935": "minPot()", +"b66846fc": "offerToSell(uint256,uint256)", +"b668efe7": "PI_EDIT_2()", +"b6693f80": "phase_2_remaining_tokens()", +"b66a0e5d": "startSale()", +"b66a261c": "setSpread(uint256)", +"b66a323c": "claimThrone(string)", +"b66a94ef": "erc20ECHT(uint8)", +"b66aae65": "removeHoldByAddress(address)", +"b66afea3": "getOrCreateFeeWindowByTimestamp(uint256)", +"b66ce7cc": "Ignite()", +"b66d887a": "setSTGContractAddress(address)", +"b66dbdc5": "totalSupplyHistoryLength()", +"b66dd4b2": "lockFromSelf(uint256,string)", +"b66deb80": "removeEntry(address)", +"b66e68f2": "testFirst(bytes)", +"b66e7524": "getReportingStartTime()", +"b66f39ad": "withdrawAvailableReward(bytes32)", +"b66f7a8b": "isEnded(uint256)", +"b6700930": "removeSet(bytes32)", +"b670a4b1": "unsoldTokens()", +"b670a910": "frontWindow()", +"b6712a4f": "gatFoundDeposit()", +"b6721bc4": "setMinPaymentForAnswer(uint256)", +"b6725bcf": "bitswift()", +"b672b4d4": "testTransferToken()", +"b672cf50": "balanceOf(uint128)", +"b6738bfb": "presalePiStart()", +"b673a75c": "crowdsaleAddr()", +"b673ddb7": "hasAirDropHero(uint16,address)", +"b674e749": "mock_contains(address,address)", +"b675271e": "contributeForDcorpMember(address)", +"b6755038": "_setPotValue(uint256,uint256)", +"b6757b50": "RocketPoolToken()", +"b67590aa": "batchTrade(address[11][],uint256[11][],uint8[2][],bytes32[2][],bytes32[2][])", +"b6761717": "pullEtherFromContract()", +"b67719fc": "WithdrawFunds(address,uint256,address)", +"b6791322": "createERC20(uint256,string,uint8,string)", +"b6791ad4": "getChain(uint256)", +"b67a77dd": "ART1(address)", +"b67aa257": "purchasePop(uint256)", +"b67b1a4d": "withdrawEtherOnlyOwner()", +"b67b60c7": "nextPrime(uint256)", +"b67b7163": "approve(string)", +"b67ba1b5": "killWallet()", +"b67c2893": "VitalLogging()", +"b67c838f": "Total_Paid_Out()", +"b67cb359": "feed1(uint256)", +"b67d4111": "getItemUri(uint256)", +"b67d50b5": "referrerBalanceOf(bytes32)", +"b67d77c5": "sub(uint256,uint256)", +"b67d8c69": "order_counter()", +"b67ddf20": "BlockICOdatetime()", +"b67e2064": "injectEtherFromIco()", +"b67e5b3b": "validPurchaseBonus(uint256)", +"b67f4eff": "sendTo(address,uint256,uint256)", +"b67f8b6d": "Master()", +"b67fabdf": "scheduleTransaction(address,uint256,uint256,bytes)", +"b68035a7": "COMMISSION_DIVIDER()", +"b6813b1c": "setcoe(uint256,uint256)", +"b6816590": "previousFounders(uint256)", +"b681f9f6": "resumeContribution()", +"b6823a66": "tournamentRewards()", +"b682c019": "pieceWanted()", +"b682da3e": "feesData()", +"b682ea1b": "_figthEnemy(address)", +"b6834572": "EOS()", +"b684101d": "emitExecuted(address,uint256,uint256,uint256)", +"b684ccad": "getDisputesToSolve()", +"b6854f96": "freezeToken(uint256)", +"b685afd0": "getBlockVerifierAddress(uint256,uint256)", +"b6868a69": "theFunction()", +"b686a635": "PossContract()", +"b686c983": "cancelLoanRequestAtIndexByBorrower(uint256)", +"b686d8b4": "holdingTaxInterval()", +"b686e44c": "SHA256ofArtwork()", +"b688524f": "_isCeo(address)", +"b688578c": "STAGE_3_START()", +"b6889e48": "globalChanceNo()", +"b688a363": "join()", +"b6893f7d": "DataContacts(address,address,address,address,address)", +"b6898845": "RPESALE_TOKEN_SUPPLY_LIMIT()", +"b6898d6c": "addVowInfo(bytes32,string,string,string)", +"b689ca61": "sellsIntermediateGoodWithDepletion(address,uint256,string,uint256)", +"b689d5ac": "has()", +"b689d850": "FederatedOracleBytes8(uint8,uint8)", +"b68a06ba": "transfer_with_extra_gas(address,uint256)", +"b68c6ae3": "mtcLastDay()", +"b68cc035": "bonusLimit(uint256)", +"b68cf49f": "roundResolved()", +"b68d1809": "getDomain()", +"b68d1d4d": "addressInArray(address)", +"b68e15d6": "freezedAccounts(address)", +"b68e21ac": "FinishLottery()", +"b68e7f6e": "testCastVote()", +"b68e8552": "setRegionOwner(uint16,address,uint256)", +"b68e8760": "setBn(bytes32,bytes32,string)", +"b68ed11f": "preSaleSoldTokens()", +"b69065d6": "DevelopeoERC20(uint256,string,uint8,string,bool,bool)", +"b69147f2": "monthlyMinting()", +"b6926b52": "RaffleDraw()", +"b692c89d": "getRaised()", +"b6932ce7": "solicitaPagamento()", +"b694dbb5": "fromBytesToBytes32(bytes)", +"b695ecfd": "HonestHeart()", +"b696a6ad": "issue(uint256,address)", +"b6972146": "mul(int128,int128)", +"b6974d87": "cancelVoteForCashBack()", +"b6975ddb": "becomeSnakemaster()", +"b697fc93": "POT_DRAIN_TIME()", +"b6982c7f": "setup_race(uint256,uint256)", +"b6984002": "EQU(uint256,string,string)", +"b6990ee1": "getPollWinner(uint256)", +"b6992247": "getStakeholders()", +"b69924c3": "GetNextWithFunds(uint256,uint256)", +"b6994dc0": "RomanLanskoj()", +"b69a375d": "callback(uint256,string)", +"b69a8107": "setSkcAdderss(address)", +"b69b5611": "setOwnership(uint256,address,address)", +"b69ba46d": "publishMetaData(bytes32,bytes32,bytes1)", +"b69c0896": "BaseScheduler(address,address,uint256)", +"b69c2115": "approveRequest(bytes32,uint256)", +"b69e7d70": "random(uint256,uint256,address,uint256)", +"b69e9b1d": "getStaticElementAt(uint256)", +"b69ea1e9": "WineSpiritCoin()", +"b69ec629": "setBpToken(address)", +"b69ee531": "GBNC(string,string,uint256,uint8)", +"b69ef8a8": "balance()", +"b69f5ada": "totalUserProfit()", +"b69f917d": "addCosToGame(uint256,uint256,string)", +"b69fae22": "hashTransfer(address,address,bytes,uint256)", +"b6a0a119": "countDestinations()", +"b6a12f63": "setTokenMarketMaker(address,address,address,address)", +"b6a1cb2b": "setMinReward(uint256)", +"b6a2b110": "SOCXSentToETH()", +"b6a324e0": "fundMe()", +"b6a46b3b": "create(string)", +"b6a48c2a": "abcLottoController()", +"b6a499ab": "_computePVPWarriorAura(uint256,uint256)", +"b6a4a0e9": "GogaTokens()", +"b6a5091a": "HuanHuiToken()", +"b6a59176": "getUsedCoreSupply()", +"b6a5d7de": "authorize(address)", +"b6a65665": "getGameData(uint256)", +"b6a79409": "necropolisContract()", +"b6a7b42c": "getMyTomatoes()", +"b6a8933b": "EXCHANGE_COMMISSION()", +"b6a96e45": "BuyCarCompleted(address,uint256)", +"b6a9ed31": "sellAnts()", +"b6abd4e7": "transfer_close()", +"b6ac24df": "updatePatchTree(bytes32)", +"b6ac4984": "tokenTransfersEnabled()", +"b6ac642a": "setWithdrawFee(uint256)", +"b6acabc1": "crowdFunding()", +"b6acc48c": "ICO_TOKEN_CAP()", +"b6acd931": "payDAPP(address,uint256,address)", +"b6ad4784": "resignTranscoder(address)", +"b6ad57d6": "paySmartContract(bytes32,address[],uint256[],bytes32)", +"b6ad8934": "renounceFundkeeper()", +"b6add0f4": "initPrice()", +"b6ade100": "notifylvlClients(string,string)", +"b6ae90fb": "FuturOwner()", +"b6aeb4a2": "erc20VARA(uint8)", +"b6aeec7b": "CHATTER()", +"b6af3643": "setWithdrawalTime(uint256)", +"b6afd2ca": "listMembers()", +"b6b0eaca": "SMILEHEART()", +"b6b0f77b": "idToString(bytes32)", +"b6b12e61": "getRoundDetails(uint256)", +"b6b18eff": "founderWithdrawablePhase1()", +"b6b1e359": "verifyIt(bool)", +"b6b2210c": "lockSell(bool)", +"b6b32c07": "presalePurchase(address[],address)", +"b6b35272": "isWhitelisted(address,address)", +"b6b3d325": "view40()", +"b6b425c7": "doSingleMigration(uint256)", +"b6b55f25": "deposit(uint256)", +"b6b57c9e": "setWhiteListContractAddress(address)", +"b6b57ebd": "finalizeWorkOrder(address,string,string,string)", +"b6b7032e": "rentalAccumulatedPrice()", +"b6b7e7eb": "toRLPItem(bytes)", +"b6b7e84d": "SGTExchangerMock(address,address,address)", +"b6b8c3cd": "m_categoriesCreator()", +"b6b9d57e": "propertyIndexToData(uint256)", +"b6ba1a98": "NIMFA_PER_ETH_SALE()", +"b6ba600a": "lockGNO(uint256)", +"b6baffe3": "getDifficulty()", +"b6bb38dc": "approveCetification(address)", +"b6bb3ade": "multiCall(address[],address,uint256[])", +"b6bba846": "sellTokensForDash(string,address,uint256,uint256)", +"b6bbafa2": "CrowdsaleStoneToken()", +"b6bbcf5b": "benchmarkRandom()", +"b6bcf354": "getCensuring(uint16)", +"b6bd387a": "lastRegionId()", +"b6bdedca": "MagnaChain()", +"b6be128a": "getPhoto(uint256)", +"b6beb400": "NuggetsToken()", +"b6bf1b3a": "mintForDisputeCrowdsourcer(uint256)", +"b6bf3bb3": "setBlackListERC20(address)", +"b6bf7318": "clz64(uint64)", +"b6c05255": "burnOwner(address,uint256)", +"b6c054ce": "restake(int256)", +"b6c0eca8": "LogRefund(address,uint256)", +"b6c1cb03": "transferFromWithComment(address,address,uint256,string)", +"b6c1eaad": "refundStarted()", +"b6c238b5": "starts(address)", +"b6c279ee": "setInputSize(uint256,uint256)", +"b6c32d71": "startStandardSale()", +"b6c37e58": "balancesRiskcoins(address)", +"b6c3987d": "validateHarCap(uint256)", +"b6c3e8cc": "increaseApprovalInternal(address,uint256)", +"b6c44bd1": "ZCash()", +"b6c47da1": "setSuperman(address)", +"b6c4da52": "addVestingRule(address,address,uint256,uint256)", +"b6c58236": "getOwner(uint32,int256)", +"b6c6ecd3": "getDial3Type(uint8)", +"b6c78f26": "HellaBank()", +"b6c88977": "finalizeCrowdfund()", +"b6c9f707": "ContractCreation(address,address)", +"b6ca878c": "addCard(bytes32,address,uint256,uint256,uint256,uint256)", +"b6ca8996": "CentrallyIssuedToken(address,string,string,uint256,uint256,uint256)", +"b6cb3777": "collectAnts(address)", +"b6cb405b": "getContractor()", +"b6cb5d72": "NFToken()", +"b6cb7f41": "fundsVault()", +"b6cba7eb": "recoverERC20Tokens(address,uint256)", +"b6ccc6ba": "signVer(address,bytes32,uint256,uint8,bytes32,bytes32)", +"b6cce5e2": "sponsor(uint256)", +"b6cd05e5": "withdrawAllTokensOnContract(uint256)", +"b6cd0b88": "setPersonalHash(bytes)", +"b6cdc815": "maixiaohetoken(uint256,string,uint8,string)", +"b6ce5581": "oraclize_query(string,string[5],uint256)", +"b6ceb489": "OWN_burn(uint256)", +"b6cf146c": "proposeMint(uint256)", +"b6cf3579": "PROVISIONING_supply()", +"b6d1d3d1": "setAirSender(address)", +"b6d1fbf9": "setXPERContractAddress(address)", +"b6d2a9b9": "SetupToken(string,string,uint256)", +"b6d31d97": "addToPrivateSaleWhitelist(address[])", +"b6d33511": "AKTestEther(address,address,address,uint256,uint256,uint256)", +"b6d34f12": "Emission(uint256,uint256,uint256)", +"b6d3faa3": "billingAmount()", +"b6d42ec3": "setApTime(uint256)", +"b6d5e8cd": "mintUniqueTokenTo(address,uint256)", +"b6d6164a": "reject(address,uint256,bytes,uint256)", +"b6d67a0b": "hasPlayerWon(uint8,uint256,bytes32,bytes32)", +"b6d6806c": "createEscrow(address,uint256,address)", +"b6d703ae": "confirmTotalTokenThreshold()", +"b6d7855a": "TokenName()", +"b6d7dbb2": "SAtomX()", +"b6d827bb": "WhitelisterChange(address,bool)", +"b6d8f59d": "WAN_TOTAL_SUPPLY()", +"b6d9721c": "getMerkleRootAndUnlockedAmount(bytes)", +"b6d9ef60": "setOracleFee(uint256)", +"b6dadbdf": "_createPart(uint8[4],address)", +"b6dadeb4": "getCardInsurance(uint256)", +"b6daea6c": "addAgency(address)", +"b6db75a0": "isAdmin()", +"b6dc1124": "private_setPauseState(bool)", +"b6dc572f": "addSubscription(address,bytes32,uint256)", +"b6dc8e25": "exchangedAmountToReceive(uint256)", +"b6ddcd14": "icoAccount()", +"b6ded5c1": "windowPeriodEnd()", +"b6df4906": "safeOwnerOf(uint256)", +"b6e087d6": "GunChain()", +"b6e119ab": "balanceOfEnvelopes()", +"b6e390ae": "First_pay_bountymanager()", +"b6e3943a": "AK4EtherDelta(address,address,address,uint256,uint256,uint256)", +"b6e3ca3c": "UpdatedExchangeRate(uint256)", +"b6e3cc1a": "authorCount()", +"b6e456bb": "getUInt()", +"b6e49fd9": "LocalEthereumEscrows()", +"b6e54bdf": "majority()", +"b6e76873": "getAction(uint256)", +"b6e7d90b": "delegatePass(bytes32,address)", +"b6e86e13": "createProxyImpl(address,bytes)", +"b6e8bac7": "anailNathrachOrthaBhaisIsBeathaDoChealDeanaimh(address[],uint256[])", +"b6e99235": "drawNumbers(uint256)", +"b6e9c2ac": "getUserBalance(bytes32)", +"b6ea62de": "kycApprove(address)", +"b6eb15c7": "gvOptionToken10()", +"b6eb7dae": "freedWosPoolToWosSystem()", +"b6ecd81c": "Vets()", +"b6ed0632": "cancelOrder(uint256,uint256)", +"b6ed3308": "setPriceOfEther(uint256,string)", +"b6ed9f15": "PFOffer(address,address,bytes,uint256,uint256,uint128)", +"b6eda884": "ads()", +"b6edc68f": "changeMicroPay(address)", +"b6edd743": "transferTokensTo(address)", +"b6ee48aa": "setContractSK(string,string)", +"b6ee8120": "realizedETH(address)", +"b6eeb6bb": "PREPURCHASER()", +"b6ef4454": "funderWithdraw()", +"b6ef78c2": "cancelCounterStack(bytes32,bytes32)", +"b6f020b2": "checkExistsItems(string)", +"b6f0391b": "setMap(string,string)", +"b6f085c7": "usernames(bytes20)", +"b6f0ecb1": "setAMLWhitelisted(address,bool)", +"b6f1a927": "CPAWallet()", +"b6f250ea": "determineWeights()", +"b6f29d50": "awardSellers()", +"b6f35624": "boughtAmountOf(address)", +"b6f36dcf": "owner3()", +"b6f3c071": "CyCo()", +"b6f3d256": "lowestBid()", +"b6f46b61": "claimBeercoins()", +"b6f46d4c": "RFQ(string,uint256,string)", +"b6f478de": "lifeVestingStage()", +"b6f4df34": "totalSupplyEdition(uint256)", +"b6f4f96c": "fundingThreshold()", +"b6f50c29": "setICO(address)", +"b6f529d6": "paused_2()", +"b6f5dda5": "getAllInvestmentsCollected()", +"b6f5e0e6": "showProfileDetails()", +"b6f681ce": "ChangeOwner(address,address,uint256)", +"b6f687a2": "rewardKoth()", +"b6f6e8ae": "getMatches(uint256,bytes3)", +"b6f73bb9": "devuelveRoles(bytes32)", +"b6f7600d": "GetAllConsentData()", +"b6f7bfcd": "ADVISORS_ADDR()", +"b6f84764": "getRemainingUint(uint8,bytes)", +"b6f921ad": "check(string)", +"b6f98e53": "needsAllowancePayment()", +"b6f9fda5": "timeoutResolve(bytes32,uint256)", +"b6fac235": "callStcWithBtc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"b6fae6c7": "approveContract(bytes32)", +"b6fb4a14": "createNewSystem(string,uint8,uint8)", +"b6fb7e46": "endingBalance()", +"b6fb9f25": "redeemWithdrawalCertificate(string,uint256,address,bytes)", +"b6fc1043": "make(bool,uint8,uint256,uint256,bytes16,uint256,uint256)", +"b6fc14a6": "createNewZMultiSigWallet(address[],uint8)", +"b6fc276a": "preparationPeriodEquipmentTrainingFeeMultiplier()", +"b6fca0df": "sendAirDrops(address)", +"b6fda7ba": "allocateTokenForAdvisor()", +"b6fe87fb": "remoteBettingClose()", +"b6fef44c": "increaseArrivalTime(uint256,uint256)", +"b6ff5087": "notifyDeathCancellation()", +"b7009613": "canCall(address,address,bytes4)", +"b700967b": "modexp(uint256[],uint256,uint256[])", +"b7009c97": "StatPreICO()", +"b700f67a": "settleApproveRequest(bytes,bytes,bool,uint256)", +"b7019063": "EthereumDIDRegistry()", +"b7019744": "payBack(address,uint256)", +"b701dc14": "setBackEndAddress(address)", +"b7020c63": "getSpermlordReq()", +"b7028b1c": "CryptoRideCoin(uint256,string,uint8,string)", +"b702a879": "draw(uint256,address)", +"b703aa3a": "stopForge()", +"b703c75a": "getPresaleNumber()", +"b704b608": "weiToTokens(uint256,uint256)", +"b7056765": "implementsERC165InterfaceNoCache(address,bytes4)", +"b706b764": "HelpCoin()", +"b706f78e": "_mintTokens(int256,address,uint256)", +"b7073d2e": "insertCLNtoMarketMaker(address)", +"b7086f7b": "stopSale(address,uint256)", +"b708aabe": "getrunprize()", +"b70902bc": "debug4()", +"b7090bb5": "www_experty_io()", +"b70949c9": "editContributors(address[],uint256[],bool[],uint256[],uint256[])", +"b7098a32": "Bee()", +"b709df11": "getValue(address,address,address)", +"b70a7545": "GIFT(uint256,string,uint8,string)", +"b70ae49a": "execute_payment(uint256,bytes32)", +"b70b9717": "voitingStartTime()", +"b70c9acf": "stream(bytes32)", +"b70d0b3b": "ownerEdge()", +"b70d30bf": "returnTokens2(address,uint256)", +"b70da7dc": "isKnownCrowdsourcer(address)", +"b70dfb25": "SeleniumRichChain(uint256,string,uint8,string)", +"b70f0058": "_isApprovedBattle()", +"b70f4b13": "crowdfundContract()", +"b70f6ea8": "getDataPoint(uint256,uint256)", +"b70fadb7": "getAddressFromSan(string)", +"b70fbda1": "GoldRegistry()", +"b71051e2": "percentageOf(uint256,uint256)", +"b7107d00": "setSeller(address,address)", +"b710e8fe": "_restartsystem()", +"b711e18a": "_applyRefCredits(address,uint256)", +"b7133fa9": "test(uint256[5])", +"b7134feb": "icoMaxCap()", +"b713ef49": "developer_increase_price(uint256)", +"b714075e": "transferDevBalance(address,uint256)", +"b714e3cc": "GetDynamicRatio(uint256)", +"b71503fc": "FundsDrained(uint256)", +"b7159185": "shortShare()", +"b7160dee": "CVR()", +"b7161cc1": "VitaminTokenNew(uint256,string,string)", +"b71653a8": "setGalleryThreePrice(uint256)", +"b7167359": "contributed1(address)", +"b71698c7": "solutions(uint256)", +"b716e3f2": "addBoard(address,address)", +"b716f404": "raceOut(uint256)", +"b71738f1": "withdrawDthTeller(address)", +"b717cfe6": "CallTest()", +"b717dadf": "getEtherCountFor(address)", +"b7182b95": "getTokenOwner()", +"b719397f": "IsPreICO()", +"b719d032": "predecessor()", +"b719d1d0": "getRegInfo(address)", +"b71a6dd6": "deposit_asset(uint32,uint256)", +"b71ab971": "getPlayerEarning(uint256)", +"b71c47a2": "surrender()", +"b71ce659": "GCA()", +"b71d1a0c": "_setPendingAdmin(address)", +"b71e0120": "limitBranchType()", +"b71e513b": "createGame(string,string,uint16,uint64)", +"b71e9c23": "throws()", +"b71f3cde": "onRefund(uint256,address,uint256)", +"b71f7f1c": "SuperFruit(uint256,string,string)", +"b71f8010": "setContract3(address)", +"b720a274": "_endOfICO()", +"b7213bd4": "readLog(uint256)", +"b72179ff": "viewFirstLotOfContractState()", +"b72218e3": "initialHolder()", +"b722875f": "giveBonus(address,uint256)", +"b722a9ef": "getPreviousShareholder(address)", +"b72314a1": "getGroupDescription(uint256)", +"b7232cd9": "enterBidForStar(uint256)", +"b723b34e": "mintTo(uint256,address)", +"b72413e4": "tokenDiscountPercentage(address)", +"b72481f8": "totalWinnings()", +"b725d84f": "PRICE_10()", +"b725e556": "UserOffers(address)", +"b7266456": "StandardToken()", +"b7268ef4": "rdiv(uint128,uint128)", +"b72703ac": "getPrev(address)", +"b72753d5": "updateItem(uint256,string,uint256,bool)", +"b7279ca6": "enableSweep(uint8[],bytes32[],bytes32[],address)", +"b727b194": "initialIssueMinting()", +"b7288f02": "freezeAccount(bool)", +"b72916ef": "getMsgValueBefore()", +"b7297cf3": "gameSettings()", +"b729d499": "dustPepe(uint256,address)", +"b72a0026": "APPToken()", +"b72a97e6": "updateTeamV(address)", +"b72b5a33": "NewBoardMember(address)", +"b72bedd0": "validation(uint256)", +"b72cacde": "approveByA(uint256,string)", +"b72ceab8": "alwaysRequireCosignature()", +"b72d0be5": "revocables(address)", +"b72e717d": "fromAddress(address)", +"b72f0e06": "LicenseCoin()", +"b72f547d": "startTransferGet()", +"b72f8ebb": "changeFreeBetValue(uint256)", +"b730aaaa": "Counting_CardPoint(uint256)", +"b730ee7f": "Anemoi()", +"b73112e5": "setCountryRank(uint256,string,uint256)", +"b73114b9": "purchaseCenturion(uint256)", +"b7312707": "fromHexChar(uint256)", +"b7317598": "claimI()", +"b7317806": "setEndOfICO(uint256)", +"b731e848": "left93(uint256)", +"b7324f8e": "PresaleClaimed(uint256)", +"b733e6a6": "LaunchContract(address,bool)", +"b73405a9": "roundMoneyDownNicely(uint256)", +"b734cbba": "setIcoDates(uint256,uint256,uint256,uint256,uint256)", +"b7352bee": "usdSeasonAccountPurchased(uint16,address)", +"b736ca82": "initialize(address,address,address,address,address,address,address,uint256,uint256,uint256,uint256)", +"b7375af7": "PresaleUnlimitedStarted(uint256)", +"b737ed1b": "getRandom(bytes32)", +"b737f5bd": "addOldInvestment(address,uint256,uint256)", +"b738169c": "betOnOddEven(bool,bool)", +"b7381a2c": "noteTokens(address,uint256)", +"b7384f6b": "initialOraclizeSettings()", +"b7387e66": "OpenBox(uint256)", +"b7388178": "getIsStoreSet(string)", +"b73974a1": "HIGH()", +"b73a9dbc": "variationCycle()", +"b73afe4f": "relocate()", +"b73b68e5": "lockTokens(address,uint256,bool)", +"b73c6ce9": "withdrawEarnings()", +"b73c71b2": "Test1Coin()", +"b73cb519": "changeIcoCap(uint256)", +"b73ded75": "setParams()", +"b73eb3e9": "decorationAt(address,uint256)", +"b73f02e4": "setActiveHashType(bytes32,bool)", +"b73f1e52": "fourthRelease()", +"b73fe29c": "getPeriodicalAR()", +"b73fe963": "noOfWaves()", +"b73fefe8": "rejectProposalAsHost(uint256)", +"b7403878": "updateLeaders_(address,uint256)", +"b741cb36": "setStageStartTime(bytes32,uint256)", +"b742398b": "trade(address,uint256,bytes,address,uint256,bytes)", +"b743f7b6": "giveEthCharityAddress()", +"b744a850": "getAssetTokenByIndex(uint256)", +"b744d2e6": "WithdrawEther(address)", +"b744d893": "DigiBlackCoin()", +"b7462833": "Blarity(address,uint256,uint256,uint256,address[],uint256[])", +"b7465a19": "setSlackUsersCap(uint256)", +"b746ec9f": "checkTotalPayouts()", +"b74746e7": "CharlieToken()", +"b747e025": "testFailMintNoAuth()", +"b7482509": "deposit(address,string)", +"b7491780": "_calculateNewHeroPower(uint256,uint256,uint256,uint256,uint256,bool,uint256)", +"b7491d65": "BiathlonNode(address,string,string,string)", +"b749b225": "bountyDrop(address[],uint256[])", +"b74a3266": "finalizeTemplate()", +"b74bc710": "LuckyDoubler()", +"b74bd09e": "rndGap_()", +"b74bd72b": "canTransfer(uint32,int256,address)", +"b74bee6a": "Mido()", +"b74c13f1": "storeAttachment(string)", +"b74cf3b6": "setVoterCount(uint256)", +"b74d13a5": "disableCheckArea()", +"b74d4103": "getForwardUpdateFeesTo()", +"b74d8e58": "getKittySkillScore(uint256)", +"b74db274": "VeryToken()", +"b74e20bb": "xCrypt(address,address,address,address)", +"b74e452b": "today()", +"b74e47ac": "getPartsOfOwner(address)", +"b74e825e": "DIVIDEND_FUND_FRAC_BOT()", +"b74f010f": "DreamCoin(uint256,string,string)", +"b74f312e": "changeTotalDistributed(uint256)", +"b74f32f2": "airdrop(address[],uint256,uint256,uint256)", +"b74feb18": "getRoundWinnerPot(uint256)", +"b74ffca7": "bookCab(uint256)", +"b75014c0": "startIcoMainSale()", +"b750948d": "canUserReleaseArtwork(address,address)", +"b750ac85": "LOG_HouseAddressChanged(address,address)", +"b751ecfc": "DomainIO(uint256,uint256)", +"b7526b79": "migrateDungeon(uint256,uint256)", +"b753485f": "currentGen()", +"b7538f3e": "ChangeClient(address)", +"b753a98c": "push(address,uint256)", +"b7540d9f": "freezed()", +"b756919d": "_handleEnergyTopup(address,uint256,uint256)", +"b756feff": "triggerDisposition()", +"b7581c67": "vestingFounderAllocation()", +"b7595d3f": "getBoolField1()", +"b7598cca": "AreaPrice(uint256,uint256,uint256)", +"b759f954": "approve(uint256)", +"b75a0ac6": "setICOToken(address)", +"b75baa18": "w_futureDevelopment()", +"b75c2068": "lockShares()", +"b75c4f80": "getInternalDependencies()", +"b75c7d9e": "updateDealer(string,address,uint256)", +"b75c7dc6": "revoke(bytes32)", +"b75c7e62": "MedsupplyToken()", +"b75d7e50": "getExtrasData()", +"b75ece9c": "startFundingTime()", +"b75f4084": "finishInvesting()", +"b75f9b20": "commissionPCT()", +"b75fdf3a": "liquidityPoolTokens()", +"b760744f": "MytilcoinStorage()", +"b760c979": "TokenGranted(address,uint256)", +"b760e822": "minimumPurchaseInWei()", +"b760faf9": "depositTo(address)", +"b7614de7": "stakedByUser(address)", +"b7618a31": "rvt()", +"b761962c": "sampleMulti(bool,bytes32,int8,bytes4)", +"b761a16b": "JustmakeNewAccountsIssuer()", +"b7629dcb": "investorsAddress()", +"b762e6e8": "mintTimeLocked(address,uint256,uint256)", +"b762fbac": "changeFountainContractAddress(address)", +"b763150d": "registerCustomer(address,address)", +"b763aeed": "sheetcoinToken()", +"b764132e": "CubaLibre()", +"b764311d": "RITToken()", +"b7643c5c": "_computePVPPetAura(uint256)", +"b7645ed4": "changeMaxCapUSD(uint256)", +"b76467c1": "Haltable()", +"b764e273": "failSend()", +"b764e8f5": "read_config()", +"b76564bd": "app()", +"b7656808": "minted(address,uint256)", +"b7656dc5": "transferFromPreSignedHashing(address,address,address,uint256,uint256,uint256)", +"b7663b08": "startICO_w2()", +"b7665613": "isPlaying(address)", +"b7667603": "Goldplatina()", +"b76689a4": "createInviteID(address)", +"b766b562": "setBonusReceived(address,bool)", +"b76803b2": "cgoAddress()", +"b7682a81": "buyGanToken(uint256)", +"b768628f": "publishedWinningScoreThreshold()", +"b7688c8b": "ico_period()", +"b768cd5d": "modifyStartTime(uint256)", +"b768ce60": "getTotalVolumeToken()", +"b7692032": "Facebook()", +"b769e4c5": "LogCancelTemplateProposal(address,address,uint256)", +"b76b37dd": "toLotteryPool(uint256)", +"b76b3e39": "setICObyAddress(address,uint256)", +"b76b4ee2": "ManagerPermissionGrantedEvent(address,string)", +"b76b78fb": "getAllElement()", +"b76bf76b": "distributeTime()", +"b76c2e39": "LQX()", +"b76c3764": "NumberGame()", +"b76c5c9f": "sendAdvisorsBalance(address[],uint256[])", +"b76c8a2c": "SpartaTeamCoin()", +"b76c94e1": "fundsOf(uint256)", +"b76ce26c": "updatesolbuyrate()", +"b76d0edd": "Log1(address,bytes32,uint256,string,string,uint256,bytes1,uint256)", +"b76dfb28": "totalRemainInInventory()", +"b76e1324": "startCreatingAss(string,string,uint256,uint256,uint256)", +"b76e4890": "Tester()", +"b76e5e06": "getBA(bytes32)", +"b7700f33": "getManagerPubkey()", +"b77030a0": "setTau(address)", +"b770391b": "MineAffected(uint256,uint256)", +"b770485f": "specialContract()", +"b770486f": "investmentGuidesRewardsWithdrawn()", +"b770c7ef": "giftPlanet(uint256,uint256,address)", +"b7719ef5": "devWithdrawal(uint256,uint256)", +"b7742856": "mainSaleprice()", +"b774d3d7": "BankOwner_GetDonationsBalance()", +"b775553d": "setDividendCutPercentage(uint256)", +"b775c9ef": "etxAddress()", +"b7760c8f": "transfer(uint256,address)", +"b7764475": "ETHXBT()", +"b776fc15": "addItem(uint256,string,uint256)", +"b777b11e": "setBurnStart(bool)", +"b777cad7": "managerPrimary()", +"b7782455": "unicornAddress()", +"b77825d2": "getIndexOrder2(uint256)", +"b778809b": "initiateContract()", +"b778d4b4": "releaseToday()", +"b778e69e": "getPastWinnerEntries()", +"b7796a43": "getAllInvestmentsWithdrawnBack()", +"b77a284c": "transferAndCallWhitelist(address)", +"b77bf600": "transactionCount()", +"b77cd1c7": "refreshBalance(address)", +"b77d09c9": "gameGifIsOver()", +"b77d1597": "QAcoin()", +"b77d4876": "startTokensSale(address,uint256)", +"b77da4a0": "totalDevCoin()", +"b77e4185": "promotionsAvailable()", +"b77e60dd": "tokensaleSecondsToStart()", +"b77ebcbb": "Country_code(uint16)", +"b77f00b3": "preIcoPhaseCountdown()", +"b77f39fe": "recoverTokens()", +"b77fc549": "withdrawAffiliateCommission()", +"b77ffaf5": "changeInvestNum(uint256)", +"b7808600": "ClaimCrowdsale(uint256)", +"b780a659": "cryptoString()", +"b780ef58": "_transferRobot(address,address,uint256)", +"b7813355": "getTotalCollectedWei()", +"b781ad99": "ALLOC_SALE_CORNERSTONE()", +"b781afa7": "EverhuskCrowdsale(uint256,uint256,uint256,address)", +"b7825cfc": "addTask(bytes32,string)", +"b782fc9b": "getFirstActiveDuel2()", +"b7833cc3": "getWitness(uint256)", +"b783508c": "receiveAuction(address,uint256,uint256,uint256)", +"b78376e9": "addPayer(address)", +"b783969f": "GenkiProjectToken()", +"b783d6c7": "challengeRegistration(bytes32)", +"b7840731": "RedeemOraclize(uint256)", +"b7844170": "getSellUnitsInformations()", +"b7844aff": "NeuroToken()", +"b7845c97": "isPhase(uint256,uint256)", +"b785473c": "satRaised()", +"b786ed91": "isCommit(bytes32)", +"b7870845": "getCalculatedFees()", +"b787b91d": "registerVestingSchedule(address,address,address,uint256,uint256,uint256,uint256)", +"b7886b37": "checkReceivedUser(address)", +"b789321a": "priceRound4()", +"b7897485": "getCurrentBet()", +"b78a80ff": "delayedSetStakes(uint256)", +"b78aa7f4": "challengeChannel(bytes,bytes,bytes)", +"b78ae50a": "getCrystalsByKind(address,uint256)", +"b78b52df": "allocate(address,uint256)", +"b78b6087": "finalizeMigration()", +"b78b7232": "addFeedIn(address,address,int256,uint256,uint256)", +"b78b842d": "kyberNetwork()", +"b78bd4a5": "breakCookie(string)", +"b78be802": "emergency_withdraw(uint256,address)", +"b78be927": "ZYCoin(uint256,string,string)", +"b78c1517": "reservationFund()", +"b78c1853": "deleteOwnPeerReview()", +"b78d27dc": "bond(uint256,address)", +"b78d32cd": "BET()", +"b78da386": "withDrawFunds()", +"b78e4bfd": "jinglesInfo(uint256)", +"b78e5e26": "transferTokensFromBountyAddress(address,uint256)", +"b78f8389": "divideUpReward(uint256)", +"b78f9de7": "Sale()", +"b78fd7bc": "transferRemainingTokensToUserAdoptionPool(uint256)", +"b790301a": "PLN_Omnidollar()", +"b79047cc": "PricePredictionBettingGame(address)", +"b790505d": "set_compenstation(uint256)", +"b790634e": "getDepositRate()", +"b7909898": "allocateInitialBalances(address[],bytes32[],uint256[])", +"b790a77b": "_withdraw(address,uint256)", +"b790c32c": "transferAuditorRecord(address,address)", +"b7915e39": "getAllowedNotaries()", +"b791e8ed": "calcEffectiveOptionsForEmployee(address,uint32)", +"b791f3bc": "migrateAmountBooks(address)", +"b7928b4f": "getReason(uint256)", +"b792d022": "batchCreateSingleSeedAuction(uint8[],uint8[],uint256[],uint256[],uint256[],uint256)", +"b792e6ec": "init(uint256,address)", +"b792f5f6": "ret_luklen()", +"b7930507": "UNLOCKED_TIME()", +"b793233b": "icoEndTimestamp()", +"b7935f0a": "emergencySetDAdmin(bytes32,address)", +"b794004d": "YOU_BET_MINE_DOCUMENT_PATH()", +"b7942d78": "RegReader(address)", +"b79550be": "recoverFunds()", +"b795aab3": "getRemainingCountImpl(uint32)", +"b795dffe": "purchaseKey(bytes32)", +"b796a339": "addRegistryIntoOwnerIndex(address,address)", +"b796c9b8": "Withdrawall(uint256,address[])", +"b7970d80": "rngCallbackGas()", +"b7975d1f": "getMyToad()", +"b797b5ba": "tgeCurrentPartInvestor()", +"b798b129": "finalizeEarlyBirds()", +"b7992c0b": "finalize3()", +"b799ba7e": "CalorieCoin(address,address,uint256)", +"b79a5539": "preTokenSalesCapReached()", +"b79a6231": "Tier_Basic()", +"b79af928": "totalSpentEth(address)", +"b79c5f7f": "IntentionToFund(address,uint256)", +"b79eb3a4": "AlterContactPubkey(address,bytes32,bytes32,bytes32,bytes32)", +"b79ec028": "setLevelup(uint8[4])", +"b7a025f9": "bZxTo0xContract()", +"b7a139bf": "firstRoundPercent()", +"b7a1affa": "DACContract()", +"b7a1c236": "LogChangeIsPayableEnabled(bool)", +"b7a1d003": "SessionClose(uint256,uint256,uint256,uint256,uint256)", +"b7a2cbcc": "lockedTransfers()", +"b7a2d99d": "withdrawAbleEther()", +"b7a2e1f2": "buy(string,string,uint256,address,address,address,address,bytes2)", +"b7a311fd": "TimoNetwork(uint256,string,string)", +"b7a3446c": "oldBalanceOf(address)", +"b7a40f21": "purchasePlanet(uint256)", +"b7a55438": "replaceOperator(address,address)", +"b7a693d7": "MaxSantaRewardPerToken()", +"b7a6b6a7": "AIREP()", +"b7a7612c": "setBtcEthRate(uint256)", +"b7a78911": "testMultitransfer2()", +"b7a8807c": "openingTime()", +"b7a90cf9": "BitAseanToken(uint256,string,uint8,string)", +"b7a9434b": "registerSpawned(uint32,int256)", +"b7a973bd": "setCompte_13(string)", +"b7a97a2b": "isValidChannel(uint256)", +"b7ab4db5": "getValidators()", +"b7ab63e9": "getPollingStation(uint256,uint256)", +"b7ab7ade": "setAllowedContract(address[])", +"b7abf606": "modifyLocality(string)", +"b7ac5d3b": "marketingFundAddress()", +"b7acbd41": "checkSellerGuarantee(address)", +"b7acdca6": "addBet(uint256,address)", +"b7ad2432": "totalWindows()", +"b7adb169": "getPendingUserlists()", +"b7adb974": "lightingTransfer(address,address,address,uint256,uint32,bytes32)", +"b7ae74fd": "FreeCoin(address,uint256,uint256,uint256,uint256,uint256)", +"b7aec6a5": "scheduleCall(address,bytes,uint256,uint256,uint8,uint256)", +"b7aec6b1": "getSpecificEscrowTransaction(address,address,uint256)", +"b7b0422d": "init(uint256)", +"b7b172b3": "cashout(address,uint256)", +"b7b1b93f": "_createPixel(uint32,uint8,uint8,uint8,string)", +"b7b1d7f7": "isCrowdSaleActive()", +"b7b1e3cc": "getPropertyData(uint16,uint256,uint256)", +"b7b2a009": "getCardDetails(uint8)", +"b7b2bbc0": "WinnerSet(uint256,uint256,address)", +"b7b2c7d6": "batchFillOrders(address[5][],uint256[6][],uint256[],bool,uint8[],bytes32[],bytes32[])", +"b7b2e501": "makeInvisible(uint128)", +"b7b33765": "calculationOfPayment()", +"b7b3a56e": "overflow_lower()", +"b7b3b89a": "lockedVault()", +"b7b3ea98": "endContrib()", +"b7b4557c": "LogMigrationInitiated(address,address,address)", +"b7b47e31": "batchActivenessUpgrade(uint256[],uint256[])", +"b7b48388": "addThing(bytes32,bytes32,string,string)", +"b7b4ceb3": "CPCEIco()", +"b7b4fe13": "setWhitelistDemoc(address,bool)", +"b7b5709a": "freezeFrom(address,bool)", +"b7b57c3f": "getPartnerMessage(address,address,uint256)", +"b7b5e811": "getProjectBonus()", +"b7b6700b": "viewPlayerPayout(address)", +"b7b6e978": "unlockForOrder(address,uint256)", +"b7b747c5": "testDepositUsingDeployedContract()", +"b7b8533a": "expireAfter()", +"b7b96723": "right7(uint256)", +"b7b9dead": "MyAdvancedToken()", +"b7ba0ba0": "showAssetEvent(bytes32,uint256)", +"b7ba6050": "currentTokenOfferingRaised()", +"b7bae9b7": "exists(bytes,bytes)", +"b7bb018d": "unlockingBlock()", +"b7bb208b": "JobitToken()", +"b7bc2c84": "isFueled()", +"b7bc7653": "set_pauseDET(bool)", +"b7bc7cb8": "fixedExp(uint256)", +"b7bda68f": "taxAddress()", +"b7bdc7ef": "setDomainPrice(bytes32,uint256)", +"b7bedaf1": "setPreAddr(address)", +"b7bf356a": "taskExists(bytes32)", +"b7c03170": "CurrentState()", +"b7c14d7a": "payOutJackpot()", +"b7c1a119": "percent3_33()", +"b7c251c3": "getRedeemedPeriods(bytes32,address,uint256)", +"b7c2ccb6": "getNodalblockTimestamp(string)", +"b7c3236f": "getEtherKey(uint256)", +"b7c38d02": "testControlCreateSameIpfsHashAndNonce()", +"b7c42cf0": "claimTokensICO(address)", +"b7c4b775": "setMaxGas(uint256,uint256)", +"b7c4bf17": "readyUp()", +"b7c52820": "addSentTrade(address,bytes32)", +"b7c54c6f": "getHKGOwned()", +"b7c55259": "endGame(uint256,address,address,address)", +"b7c5b181": "delegatedTransfer(address,address,uint256,string,uint256,bytes32,bytes,uint256)", +"b7c65d1a": "retrieve_domain(address,uint256)", +"b7c70c34": "seratioCoin()", +"b7c74cf6": "_calculatePayment(uint8)", +"b7c763b5": "getString(uint256)", +"b7c7986f": "getMarket_CommunitUnusedTokens()", +"b7c7ecbe": "setTitulaire_Compte_6(uint256)", +"b7c8561f": "removeDestroyer(address)", +"b7c8699d": "modifyGovtAccount(address)", +"b7c8a90a": "removeExclusionFromTokenUnlocks(address[])", +"b7c93330": "ResourcePoolTester()", +"b7c940f6": "SolarDaoTokenCrowdsale(address,address,uint256,uint256,uint256)", +"b7c97930": "registerPool(string,uint256,uint256)", +"b7c97fa0": "BEN()", +"b7c9da33": "buyTulips(uint32,uint16)", +"b7ca3086": "getSelfCount()", +"b7ca51e8": "starToken()", +"b7caf50a": "ticketsNum()", +"b7cb4830": "NERU()", +"b7cc2312": "bobClaimsPayment(bytes32,uint256,uint256,address,address,bytes20)", +"b7ccc466": "categoriesCount()", +"b7ccccaf": "bridgeValidatorsProxyOwner()", +"b7cce253": "maximumMainSaleRaise()", +"b7cdddcb": "claimEth()", +"b7cefd9f": "FlatEarth()", +"b7d02044": "deployToken(string,string,uint8,uint256)", +"b7d0628b": "getGameState()", +"b7d130ff": "isAuthorizedToSell(address)", +"b7d29e91": "NameChanged(bytes32,string)", +"b7d3a9c9": "setWhitelistAgent(address)", +"b7d3cb87": "countAllProposals()", +"b7d454a4": "setNotTransferable(bytes32)", +"b7d478bf": "getAvgAmount(uint256,uint256)", +"b7d4c4a5": "getInvestorsList()", +"b7d4dc0d": "unsetBase(address,uint64)", +"b7d4e5fd": "getX2(uint256)", +"b7d534a1": "addrToString(address)", +"b7d5d4c0": "piggyBank()", +"b7d5d74c": "balanceAtBlock(address,uint256)", +"b7d5ddc8": "setAssetClaimString(uint256,string,string)", +"b7d5e804": "remove(uint8,uint8)", +"b7d5ef4d": "BATokenFactory()", +"b7d65d17": "setUnitCoinProductionMultiplier(address,address,uint256,uint256,bool)", +"b7d6f432": "buyCar(address,uint256,bool,address,uint256)", +"b7d6f6c6": "WHALE(address)", +"b7d74fda": "DevelCoin(uint256,string,uint8,string)", +"b7d7a4e0": "say(uint256,uint256)", +"b7d7acea": "externalGiftEth(address)", +"b7d89483": "AddressList(string,bool)", +"b7d8b1d9": "emitWorkStarted(uint256,uint256)", +"b7d9549c": "incrementPrice(uint256,address)", +"b7d9d7b9": "roundTwoAmount()", +"b7da166b": "_mint(address,address,uint256)", +"b7da5b0d": "TreatzCoin()", +"b7dacbf1": "setBackup(address)", +"b7db7f0f": "allowTransfer(address,address,address,uint256,bytes)", +"b7db87e8": "testFooArray()", +"b7dc2a9f": "weiMinimum()", +"b7dc3b18": "buy(uint256,string)", +"b7dc5c11": "priceGuaranteed()", +"b7dc8a32": "firstValidBlockNumber()", +"b7dc9d85": "ORDER_DONE(address,address,address,bool,uint256,uint256,uint256)", +"b7dcf6a9": "createPromoCollectible(uint8,uint8,uint256,address,uint256,uint256,uint256)", +"b7dd1d17": "getAllRevisionBlockNumbers(bytes32)", +"b7ddcb27": "InteractiveCrowdsaleToken(address,string,string,uint8,uint256)", +"b7de47d3": "getIndex(uint256,uint256)", +"b7dea35f": "hatchSeeds(address)", +"b7dec1b7": "GENESIS()", +"b7ded7cc": "purchaseHero(uint256)", +"b7df07a6": "receivePlayerInfo(address,string)", +"b7df7ef8": "AccountUnlocked(address)", +"b7df9289": "recvShrICO(address,uint256,uint256)", +"b7dfc8a5": "updateTokenPerEther(uint256)", +"b7e0308d": "priceStep2()", +"b7e03264": "showWinner()", +"b7e05277": "private_DelGameBar(uint256)", +"b7e05d4f": "newProposallog(string)", +"b7e09773": "devTeamReinvest()", +"b7e1917c": "tokenAdmin()", +"b7e1b974": "getStr(uint256)", +"b7e1bce7": "ReceiverAddressChanged(address)", +"b7e1ecef": "addAttendantAndTransfer(string,string,bool)", +"b7e1fd9b": "createDividend(uint256,uint256,address,uint256,bytes32)", +"b7e2263b": "getTotalMatches()", +"b7e24979": "addThing(bytes)", +"b7e28a3b": "certificationManager()", +"b7e2f504": "isPreSaleFinalised()", +"b7e39b4f": "setBalances(address[],uint256[])", +"b7e43a84": "maximumIssuerReservedUnits()", +"b7e45353": "forbidChecking(uint256)", +"b7e4a503": "Determine_Result(uint256,uint256)", +"b7e5cabb": "contractorsProfitAddress()", +"b7e621c3": "claimCompanyTokens()", +"b7e6bd34": "getTopic(bytes15)", +"b7e6dfe3": "GetApplicantAddress()", +"b7e82526": "GraybuxToken()", +"b7e83329": "ExportMaster()", +"b7e90262": "roleAdminAddress()", +"b7e92ede": "EtheRoox(address,address,address,uint256,uint256,uint256)", +"b7e9f193": "nextWithdrawal()", +"b7eb22b3": "getAccountsSize()", +"b7eb5e0a": "unlockAddress(address)", +"b7ec2086": "priceWei()", +"b7ec44b4": "asyncTransfer(address,uint256)", +"b7ecbaae": "removeWhitelistAddress(address)", +"b7ee2552": "ICOpaused()", +"b7eea206": "openLedgerAddress()", +"b7ef5fed": "claimRewards(uint16[],address)", +"b7efc1cd": "authorizeMintToken()", +"b7eff231": "oraclize_query(string,bytes[3])", +"b7efff16": "GANAPATI()", +"b7f01bfc": "tank()", +"b7f1489e": "setLosePercent(uint256)", +"b7f1e6af": "preferredSaleEndTime()", +"b7f2f33c": "transferRightIfApproved(address,bytes)", +"b7f37983": "getInvestmentRecordListLength()", +"b7f3ffed": "updateProfiterole(address,uint256)", +"b7f43a63": "brideVow()", +"b7f48211": "setPackState(uint256,bool)", +"b7f53c91": "CryptoSilver()", +"b7f545cc": "deployTokenContract(uint256,bool)", +"b7f603ff": "LimbToken()", +"b7f63665": "ttToken()", +"b7f6a75a": "XPAToken(address,address,uint256,uint256,uint256)", +"b7f6e74d": "unpositionFrom(address,address,uint256)", +"b7f79374": "DildoToken()", +"b7f84ae2": "icoPhaseTimeInterval()", +"b7f90f12": "decrementCount()", +"b7f927e6": "PROMETHEUS_VOUCHER_LIMIT()", +"b7f92b71": "reserveFund()", +"b7f9c4f6": "initCapsule(uint256)", +"b7fa265a": "_withdraw(bool)", +"b7fb1dc8": "payToMarketingReferral()", +"b7fba4d3": "getProxy(address)", +"b7fc5a48": "getPoolStars(uint32)", +"b7fc6612": "transferMany(address[],uint256[])", +"b7fcc321": "CryptoHoleToken()", +"b7fcfa69": "amountReceivedFromTransfer(uint256)", +"b7fd45a0": "EscrowICO()", +"b7fda832": "updateGenVaultAndMask(address,uint256)", +"b7fde9da": "mintCoins(address,uint256)", +"b7ff11be": "isAcceptedDcorpMember(address)", +"b7ff2aed": "withdrawMaker(address,uint256,address)", +"b8005f38": "execBoard()", +"b800b2fe": "BEZOS()", +"b800db55": "__isSenderInRole(uint256)", +"b8017221": "get_party2_balance()", +"b8029269": "get_money()", +"b804dc56": "setRecallPercent(uint256)", +"b80509c5": "getCountsById(uint256)", +"b80540c0": "Adjudicator(address[],uint256,uint256)", +"b80546c2": "endPeriodA()", +"b805a5ca": "GetChip(uint32)", +"b8066bcb": "etherToken()", +"b8068a5f": "CATServicePaymentCollector(address)", +"b80756f0": "_calculateLockedBalance(address)", +"b80777ea": "timestamp()", +"b8077e28": "getTxOrigin()", +"b8079d49": "debitWalletLMNO(address,uint256)", +"b807ed76": "SANKEYSOLUTION()", +"b80825ff": "TheBittrip()", +"b808745c": "transferPass(bytes32,address)", +"b8087ac0": "goalMet()", +"b80907f2": "getReputationToken()", +"b809127e": "getQuickPromoBlockInterval()", +"b8093100": "giveBounty(uint256,address,address)", +"b809ceb2": "updateIcoDates(uint256,uint256,uint256,uint256)", +"b80a30b7": "_getInvestorTokenAmount(address)", +"b80ac7df": "verifyProof(bytes32[],bytes32)", +"b80aedf2": "setReservedTokensList(address,uint256,uint256,uint256,bool)", +"b80cdcf6": "finishCrowdsale()", +"b80ced14": "LPCoinToken()", +"b80d3181": "annualPrice()", +"b80e63df": "baseTokenBalance(address)", +"b80ee369": "createCardForAcquiredPlayer(uint256,address)", +"b80f3532": "exchnageRate()", +"b8109e1a": "MeetingsEntity()", +"b810b81c": "Pixereum()", +"b810bfa4": "GDC(address,address,address,address,address)", +"b810d24b": "updMinPurchaseLimit(uint256)", +"b810fb43": "addressList(uint256)", +"b811215e": "initialCap()", +"b81168b4": "CNNTokenBase(uint256,string,string,uint8)", +"b8121385": "stopOperation()", +"b8121fe4": "viewPetitionSigner(uint256)", +"b8126a3e": "addSideService(address,uint256)", +"b812a6ce": "lastBlock_v11()", +"b813c627": "releasedSupply()", +"b813d939": "test_fourValidEqUint(int256)", +"b8144a72": "getBankRating(address)", +"b814660e": "AllowTransferLocal()", +"b8163641": "checkReceive(address)", +"b8174685": "_claimReward721(address,string)", +"b817e043": "JobMarket()", +"b818f9e4": "batchTransferFrom(address[],address[],uint256[])", +"b8198875": "StreamToken(uint256)", +"b81af39b": "declineMP(address,int256)", +"b81b0b6a": "claim(bytes32,string,string,address,bytes32,bytes32,uint8)", +"b81bb854": "createRequest(address,address[],address[],int256[],address,string)", +"b81c259e": "PexCash()", +"b81c6453": "vote(uint8,address)", +"b81ca723": "InitialCoinOfferingToken()", +"b81ccdd5": "cashilaTokenSupply()", +"b81ce8a7": "MicropaymentsNetwork()", +"b81db9da": "addUserValueName(bytes20)", +"b81df742": "minBuyLimit()", +"b81e3b19": "bankMoney()", +"b81e43fc": "getEventName()", +"b81ec822": "PRE_SALE_2WEEK_BONUS()", +"b81f39a8": "addToReserve()", +"b81f3be0": "deleteVotersWithoutShares(uint256[],uint256[],bool)", +"b81ff45b": "getBalanceByAccount(string)", +"b8205d35": "IncentToken()", +"b8206a18": "unVestAddress(address)", +"b820c41c": "iceToken()", +"b8216ea8": "redeemMany(address[])", +"b821da1b": "submitBid(uint256,uint256)", +"b821f815": "pay_winner(uint256)", +"b8225dec": "selfDestructInitiated()", +"b822b28a": "lastBlock_a8Hash_uint256()", +"b823aac7": "endICOTimestamp()", +"b823e991": "CourseCertification()", +"b8240a65": "UpdatedPrice(uint256)", +"b82465e9": "managerIncome(address)", +"b8248dff": "isValidOwner(address)", +"b82545e5": "judgeWin(uint256,uint256)", +"b8254880": "SurrusContract()", +"b8261f8f": "myEntityList(uint256)", +"b826d6d7": "DigiPulseToken()", +"b82852ec": "changeReserveIAMDestinationAddress(address)", +"b82864e0": "getHouseEdgeFee(uint8,uint256)", +"b828cfd2": "PRVTToken(uint256,string,uint8,string)", +"b8291bda": "Pomzon()", +"b829528e": "LotteryLog(address,string)", +"b82a0ce8": "bonusTime()", +"b82a65b2": "getReportingToken(uint256[])", +"b82a737c": "communityAmount()", +"b82b2a07": "makeProposal(uint8,uint8)", +"b82e6416": "doTimeoutForDefendant(uint256)", +"b82eb946": "_setStageLimit(uint256)", +"b82fb745": "saleEndAtBlock()", +"b82fcdeb": "tokensAllocatedForTeamAndReserve(address)", +"b82fd275": "removeFrozenTokenConfigurations(address[])", +"b82fedbb": "register(bytes32,address,bytes32,bytes32)", +"b8305b43": "HodlCreated(uint256,address,uint256,uint256)", +"b83069c5": "getStemPrice()", +"b830b305": "getpersonCount()", +"b830c538": "unassignRole(address,bytes32,address)", +"b8314c22": "whaleMax()", +"b831d137": "saleSharesSold()", +"b832004d": "setTokenInfoParametersReady()", +"b832679c": "setKmPards(address)", +"b832fdde": "NON_VESTED_TEAM_ADVISORS_SHARE()", +"b833ac27": "PolyToken(address)", +"b8341628": "mintingPreIcoFinish()", +"b834f6fb": "isMainChain()", +"b83506cf": "defaultBuyNowPrice()", +"b83520b3": "allowIcoExit(bool)", +"b835a7fe": "RubiksToken()", +"b8366bd1": "CorruptionCoin()", +"b837433c": "TEAM_ADVISORS_SHARE()", +"b837a3b8": "sendProfitsRewardBips()", +"b837c58e": "payTo()", +"b837c94f": "ASEBToken()", +"b8385339": "finalizeStage(uint256)", +"b8386f3b": "_gambling(uint256,bytes32,uint256)", +"b8388aca": "findBestRate(address,address,uint256)", +"b839e0d1": "lockedAllocatable()", +"b83a1bdc": "lastMineralUpdateTime()", +"b83a4da9": "totalWeiSale()", +"b83ace61": "setHouseEdge(uint256,uint256,uint256)", +"b83b4529": "FundsTransferredToMultisig(address,uint256)", +"b83c298e": "updateBoolSetting(uint256,bool,address,string,string)", +"b83d3f2c": "oraclizeSource()", +"b83dfdc9": "setInvestorData(address,uint256,uint256)", +"b83e1d14": "CountTokenUser(address,uint256,bool)", +"b83e4779": "OntologyToken(uint256,string,string)", +"b83e9662": "ParaTransfer()", +"b83fc6b6": "CrowdsaleClosed(uint256)", +"b8406a7e": "balanceOfLotteryNum(address)", +"b840a1db": "WhitelistChanged(address,bool)", +"b840b421": "OriginalVirtualOperation()", +"b8415b0c": "startDistribute()", +"b8416d2e": "exec(address,bytes32,bytes)", +"b84172e7": "getH1Bidder()", +"b842826c": "Built()", +"b842eef2": "test02BuyToken()", +"b8435050": "crowdsaleclosed()", +"b84391de": "setBetEndTime(uint256)", +"b8441be0": "setTransferAuthPermission(address,bool)", +"b8444c13": "forceVoidRace()", +"b845b51e": "IIPToken(uint256)", +"b845c9a2": "WEI()", +"b8471085": "PRIVATESALE_START_DATE()", +"b84738aa": "changeMinPay(uint256)", +"b848b944": "doSellerCancel(bytes16,address,address,uint256,uint16,uint128)", +"b8499750": "advisorLock()", +"b84a6849": "createShareToken(uint256)", +"b84aac5c": "decreaseApprovalPreSigned(address,uint256,uint256,uint256,uint8,bytes)", +"b84b05b2": "NetyulCrowdsale(address,uint256,uint256,uint256,address,address)", +"b84b276d": "second_whitelistSupplier()", +"b84b8b8c": "buyGoods()", +"b84c11da": "create(address,string,bytes32,uint256,address)", +"b84c35b3": "addCode(string,uint256)", +"b84c743b": "getReferencePrice(address,address)", +"b84c8246": "setSymbol(string)", +"b84cc017": "myBonus(uint256)", +"b84d2106": "shut(bytes32)", +"b84dda70": "tweakState()", +"b84dfbd2": "securityToken()", +"b84e1327": "checkIfContractCreatedHere(address)", +"b84e44ab": "setProviderLastSupplyID(uint256,uint256)", +"b84ebd7f": "createMechBTC(uint256,address)", +"b84ee1a4": "setTransferProxy(uint32,int256,address)", +"b84f1318": "AddNewCurrency(string,string,string)", +"b84fe73b": "voteAll(address)", +"b84fed88": "isMintContract(address)", +"b8500e5e": "purchaseRecordsNum()", +"b8506a3f": "tokensPerWei7()", +"b850ae36": "isRegular(uint256)", +"b851ed97": "bonusAllowed()", +"b8522043": "getUserList()", +"b8534ed1": "contractEndTime()", +"b8547736": "testBadWithGoodInterface(address,uint256,address,uint256)", +"b85477c5": "dealStatus()", +"b857a688": "Eth_Amount()", +"b858b39f": "PhotoAdded(address,address)", +"b85926e0": "VESTED_AMOUNT()", +"b85973c1": "overbidNation(uint8)", +"b8598f9e": "computeOppositePrice(uint16)", +"b85a6a20": "numComments()", +"b85bf538": "ownerSetBankersLimit(uint256)", +"b85c2f72": "submitEntry(uint256,uint256,uint256,uint256)", +"b85cf54e": "rewardPoolPercentage()", +"b85d6275": "RemoveModerator(address)", +"b85dfb80": "backers(address)", +"b85e0402": "AppCoinsIAB()", +"b85e0aca": "legacyRepContract()", +"b85e5915": "ExitPlincWithLoss(uint256)", +"b85e7df1": "setPresaleMode()", +"b85e84c0": "judgeFinality(bytes32[13],bytes32[],bytes32[],bytes32[10],uint256[4])", +"b85ea983": "countPortfolios(address)", +"b85eb295": "checkOwnershipAndAvailability(address,uint256[4])", +"b85ed17d": "getHolderByIndex(uint256,address)", +"b85f726a": "Cashier()", +"b85fb20f": "getPollStage(uint256)", +"b861be22": "checkPermissions(address,address)", +"b8621759": "issueNewCoins(address,uint256)", +"b862d80d": "minBetVal()", +"b86397e7": "mFUNDING_CURRENT_DURATION()", +"b863bd37": "random(uint256)", +"b8642896": "ETSToken(address)", +"b864f5a9": "verify(uint256[],uint256[])", +"b8657988": "MYSUPERTOKEN()", +"b8661e2d": "getAllTeamsIds()", +"b86780b3": "restTokensBurned()", +"b867e8e6": "accrueDividendsPerXTokenETH()", +"b868723e": "endPrice()", +"b868a2ff": "update(uint256,uint256,bytes32[])", +"b8697dbd": "getLockByIndex(uint256)", +"b869f1e2": "SALE_CAP_IN_USD()", +"b86a1fb2": "adminPool()", +"b86a3582": "ETCH3dVs()", +"b86b14cd": "setRate1(uint256)", +"b86b9aa4": "getJackpotWinBonus(uint8,bytes32,bytes32)", +"b86bc74f": "CERTIFIER()", +"b86c49e1": "getMarketsItemId(uint256)", +"b86c6b7b": "calculateCellBuy(uint256,uint256)", +"b86c9845": "MithrilSword()", +"b86dab46": "addToApprovedAddress(address)", +"b86df9db": "RewardRecycled(uint256,address,uint256,uint256,uint256)", +"b86e0657": "removeServer()", +"b86e321c": "withdrawReward(address)", +"b86ec38f": "REIMBURSABLE()", +"b86eeb69": "bountyTotalSupply()", +"b86f602c": "submitOrder(bytes,uint64,uint64,uint256,uint256,uint256)", +"b86f6aa7": "resetCollectedFees()", +"b8701689": "removeGlobalConstraintPre(int256,address,int256,address)", +"b870ecbb": "testNormalWhitelistAdd()", +"b870f613": "back(address,uint256)", +"b8716f3a": "_teamTransfer(address,uint256)", +"b8726395": "Mint(int256,uint256)", +"b873846f": "ArrayPasser(uint8[9])", +"b873e9a7": "trustedReportingParticipantTransfer(address,address,uint256)", +"b875a5e0": "rateThirdRound()", +"b8760ad3": "payStakingFee(address,uint256,uint80,uint80,uint256,address)", +"b87760ad": "uint256Tostr(uint256)", +"b8782d49": "PHASE2_RATE()", +"b8788453": "mainSale_StartDate()", +"b87aedcc": "recentPlayersFront()", +"b87b9ac3": "testExchangeRate(uint256)", +"b87ba329": "getMemoryTraceMeta(uint256)", +"b87c01e3": "GVPE_address()", +"b87c03c2": "multiAccessOwners(uint256)", +"b87c7d43": "setEthAmount(uint256)", +"b87cbafc": "bn128_check_pairing(uint256[12])", +"b87d8712": "RulesProposalSubmitted(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"b87dbf81": "handleAffiliate(uint256,uint256,uint256)", +"b87dddf6": "tokenFallback(address,uint256,bytes,string,uint256)", +"b87e461c": "scrapPercent()", +"b87e64ce": "DecentBetVault(address)", +"b87ee9d6": "setLLV_edit_4(string)", +"b87f9b98": "_stringToByte(string)", +"b87fb3db": "start_block()", +"b87fb721": "LogNewTemplate(uint256,address,string)", +"b87ff295": "MintTokens(int256,address,uint256)", +"b8803738": "total_user_eth_cap()", +"b88064ad": "peMinPerPerson()", +"b881604d": "removeStrip(uint256)", +"b8840d3d": "getDrug(uint256)", +"b88467c2": "getProjectEscrowAddress(bytes32)", +"b8847e9d": "haltRevealPeriod(bytes32)", +"b8850556": "ApplyAction(uint32,uint32,uint256,address,address)", +"b8851fea": "endDateStart()", +"b8852718": "transferLockedPart(address,uint256)", +"b8857936": "dtSetEthBalance(address,uint256)", +"b885acd8": "fourthWeekTokenPrice()", +"b885d560": "airDeliverStandalone(address[],uint256[])", +"b88635e2": "PtestToken()", +"b8867485": "proxyOf(uint256)", +"b8871f98": "_createEdition(uint256,bytes32,uint256,uint256,uint256,address,uint256,uint256,string,uint256,bool)", +"b8872fb7": "reinvest(address)", +"b8873077": "HUNT(uint256,uint256,uint256,uint256,address)", +"b88746b0": "previousDrawingClosed()", +"b8878171": "getPersiansBattlePointsBy(address)", +"b888690a": "deleteMessage(uint256)", +"b888a492": "isNewPayoutPeriod()", +"b888a66b": "tktPrice()", +"b888adfa": "lastPhaseChange()", +"b88903f7": "TokenDrop(address,uint256)", +"b8894fe3": "mintTokenToBuyer(address,uint256,uint256)", +"b889d440": "markTokenSold(uint256)", +"b88a374c": "EarnEnoughMoney()", +"b88a529b": "getCurrentRate(uint256)", +"b88a802f": "claimReward()", +"b88ab668": "TBXToken()", +"b88c9148": "getFee(address)", +"b88d0169": "INITIAL_EMISSION_FACTOR()", +"b88d4fde": "safeTransferFrom(address,address,uint256,bytes)", +"b88d6aa7": "refund(bytes32,uint8,uint256,uint256)", +"b88e8518": "FluencePreSale(uint256,uint256,uint256)", +"b88e962f": "showEmployee(uint256,uint256,uint256)", +"b88eef53": "registryCreated()", +"b88f9936": "setMinTms(uint256)", +"b88fd16e": "developmentFundAddress()", +"b8901a41": "am_I_locked(address)", +"b8905649": "Crowdsale(address,uint256,uint256,address,address)", +"b8906755": "payProviderFee(address)", +"b890de6b": "thirdLineWrong()", +"b890ed85": "CryptoSagaCardSwapVer2(address,address,address,address)", +"b891656e": "thismanyblockstillthspudholderwins()", +"b8918710": "FangTangCoin(uint256,string,string,uint8,bool,uint256,uint256,uint256,uint256)", +"b893deb1": "getContestEndTime()", +"b89503f3": "getDiceWinAmount(uint256,uint256)", +"b895947a": "Janders()", +"b895c813": "registIcoAddress(address)", +"b896149c": "BLUEOS()", +"b89648cf": "getBoughtTicketList()", +"b8972db5": "sendToken()", +"b8973927": "setContractStart(bool)", +"b89761b8": "encoded_data()", +"b897b4f5": "multAirdrop(address[],uint256)", +"b8991ffb": "reject_payment(uint256,bytes32)", +"b899e1b7": "_setApp(bytes32,bytes32,address)", +"b89a73cb": "isShareholder(address)", +"b89bf71d": "safeWithdrawal4(address)", +"b89c5932": "setRequestLimitInterval(uint256)", +"b89c70c0": "calculateCoinBuy(uint256,uint256)", +"b89cd5bd": "icoPartner(address,uint256)", +"b89e066a": "MINCAP_TOKENS_PRE_ICO()", +"b89e8cbb": "getRemainingSellingTime()", +"b89f3025": "investExt(address,uint256)", +"b89fc89e": "setDistributionAddress(address)", +"b89fde71": "CheckAmbientTempException(bytes32,uint32)", +"b8a15b1d": "bobMakesErc20Payment(bytes32,uint256,address,bytes20,address,uint64)", +"b8a1e355": "doBet(uint256)", +"b8a1fdb6": "transferAndFreezing(address,uint256,uint256,uint256,uint8)", +"b8a24252": "checkpoints(uint256)", +"b8a25119": "setPresaleMode(bool)", +"b8a268c1": "getCloseFlag(bytes)", +"b8a32c7e": "claimTile(uint256,uint256,uint256)", +"b8a358e9": "canMintUtility(address,uint256)", +"b8a393b8": "openCompetition()", +"b8a3c6ea": "KPCSAdministrator(string)", +"b8a4a064": "applauseCashCrowdsale()", +"b8a4b858": "INVESTOR2()", +"b8a4db81": "addValueBonus(uint256,uint256)", +"b8a4f9ae": "addInFutureExpanstionMap(address)", +"b8a5368a": "gameStart(uint256)", +"b8a548c5": "SCTokens()", +"b8a582a9": "EtherMoney()", +"b8a582af": "logicVersion(address)", +"b8a67b6e": "GiroToken()", +"b8a67c3c": "expireDate()", +"b8a684f8": "CryptoSagaSwapPLAT(address,address,address,address)", +"b8a76f54": "setIPFSHash(string)", +"b8a7c78a": "CommunityAddress()", +"b8a80aac": "getItem(address,uint256)", +"b8a876ed": "Quitcoin()", +"b8aa0a34": "getSealDate()", +"b8aa4da8": "addMemberToBS(address)", +"b8aaae7a": "PXXToken()", +"b8aac3a5": "createAndSignBBODocument(bytes,bytes,address[],uint256)", +"b8ab9203": "secondRoundMayTokensLimit()", +"b8ab9883": "claimTimeoutEndedWithMove(bytes32,uint256,uint256)", +"b8aba8cf": "NewPayment(address,uint256)", +"b8abd184": "getInvestorKey(bytes32,uint8)", +"b8aca90b": "CurrentGame()", +"b8ad2abe": "addTokenGrant(address,uint256)", +"b8ad2fca": "claimMeme()", +"b8adaa11": "reject(uint256)", +"b8af146f": "subsm(uint256,uint256)", +"b8af21b9": "isLotteryClosed()", +"b8af6bc7": "getAgentsAmount()", +"b8af7642": "seeAddress(uint256)", +"b8afae78": "IPM2COIN()", +"b8afd597": "FinishRoundGamble()", +"b8b040a1": "xapo()", +"b8b0f533": "get_bitcoineum_contract_address()", +"b8b13e6b": "MaximumcoinStart()", +"b8b18915": "withdrawBonus(address)", +"b8b199e5": "_userSignUp(string,address,bool)", +"b8b19c27": "MultiOwnable(address[16],uint256[16])", +"b8b2052c": "setCrowdsale(address,address)", +"b8b23120": "getFlagPrice()", +"b8b27765": "payManagementBodyPercent(uint256)", +"b8b2bdad": "setBool(string,bool)", +"b8b2d490": "feePerSec()", +"b8b359b8": "voteByIndex(uint256,address,uint256)", +"b8b3d85b": "getFunderBalance(address)", +"b8b459bc": "OrderUpdated(uint256)", +"b8b4f1a0": "signContract()", +"b8b52652": "startFightA(uint256,uint256,bytes4)", +"b8b570f1": "Distributed()", +"b8b690e7": "__targetExchangeCallback(uint256)", +"b8b798be": "getYearlyUSDSalariesTotal()", +"b8b7b899": "receiveTransfer(address,uint256,address,bytes)", +"b8b7edb2": "hashToken()", +"b8b808cc": "getAddressFromNumber(uint256)", +"b8b85873": "purchaseArray(uint256)", +"b8b8d387": "myWeiValue()", +"b8b8fc3a": "getPI_edit_20()", +"b8ba427d": "RetDime()", +"b8ba532f": "developer_edit_name(string)", +"b8ba7c7f": "createGen0Auction(uint256,uint8,uint8,uint8,uint8)", +"b8baed2c": "calcTradeFeeMulti(uint256[],uint256[])", +"b8bb372c": "APIHeaven()", +"b8bb41dc": "setReceiver6()", +"b8bcaad5": "_randomPack(uint256)", +"b8bce6d0": "dateEcoRelease12()", +"b8bcf6c9": "ico2ndPrice()", +"b8bd3dbb": "setMakerFee(uint256)", +"b8bdd8dd": "close(bytes)", +"b8bdf701": "initiateCreateSale(uint256,uint256,uint256,uint256)", +"b8be73ed": "offchainUploaderAddress()", +"b8beafd6": "buyVolumes(address,address)", +"b8bf029b": "list(address,uint256,uint256,uint256,uint256)", +"b8bf0f1f": "getRemainingBlocksUntilPayoutk()", +"b8c0517a": "splitStake(address,address,address,uint256)", +"b8c26d0b": "ContractWithParams(address)", +"b8c2a9e1": "getBidReports(uint256)", +"b8c375b6": "WavesToken()", +"b8c48f8c": "setInitialParent(int256,int256,int256)", +"b8c508e5": "MOBOL()", +"b8c52477": "_exchange(uint256,uint256)", +"b8c577ff": "setGrowth(uint32)", +"b8c58128": "setList(uint256,uint256[])", +"b8c65462": "preICOSaleStart()", +"b8c6a67e": "maxPendingParticipants()", +"b8c6d2e9": "BretCoin()", +"b8c6f579": "setAuction(address)", +"b8c766b8": "saleClosed()", +"b8c78391": "releaseableBalanceOf(address)", +"b8c7dea3": "stageCurrentSum(uint256)", +"b8c7e354": "tryToCompleteProject()", +"b8c86aa6": "getArraySettingResult()", +"b8c87a06": "setStage3()", +"b8c8fb73": "solve(uint256,uint256,uint256,uint256)", +"b8c92537": "acceptBidForCollectible(uint256,uint256,uint256,int256)", +"b8c9371d": "getPassOwner(bytes32)", +"b8c963a6": "atxContract()", +"b8c9c4d2": "burnResource(uint16,uint256)", +"b8c9d365": "h()", +"b8c9e4ed": "getStr()", +"b8c9e694": "getRaceMutation(uint32)", +"b8cb243d": "escrowTransfer(uint256,address)", +"b8cb40e0": "getDistributedTotal()", +"b8cb65ee": "removeTokens(uint256)", +"b8cc3c12": "depositToSubRound(uint256)", +"b8ccbd17": "removePermission(bytes4)", +"b8ccc682": "constructUrl(bytes32,uint256)", +"b8ccf4c7": "sendPositiveWhuffies(address,string)", +"b8cd0b94": "DoorLock()", +"b8cd4a8e": "joinCarveUpTen(uint256)", +"b8cd81ed": "raffleTokenReward()", +"b8ce670d": "burn(address,uint256,address)", +"b8cf14e7": "updateStatusPlayer()", +"b8cf2515": "currentFundrise()", +"b8d00d4a": "requestErc20Transfer(address,address,uint256)", +"b8d04f4e": "getReferrerAddress(address)", +"b8d08db2": "releaseCount()", +"b8d0cf4a": "setTokenPriceUSD(uint256)", +"b8d117fc": "bonusEnds4()", +"b8d1194c": "tokenGoal()", +"b8d16dbc": "isLeapYear(uint256)", +"b8d2f523": "no_aff()", +"b8d364bb": "allDistinct(address[5])", +"b8d3bfe3": "MeatGrindersAssociation(address,address,uint256,uint256,uint256,address)", +"b8d3d08a": "assertEq29(bytes29,bytes29)", +"b8d400d2": "fromEthers(uint256)", +"b8d415c9": "bntyMicrodollarPrice()", +"b8d46c9c": "setOrUpdateRecord2(string,string,string,string,address,uint8,bytes32,bytes32)", +"b8d4b642": "startICODate()", +"b8d4efb5": "validate_percent(uint8)", +"b8d55a91": "CPLToken()", +"b8d5b7f0": "maximumToken()", +"b8d73101": "expirationString()", +"b8d73849": "LogTokenDeposit(address,uint256,bytes)", +"b8d74f4b": "getAcceptedTokenAmount(address)", +"b8d85d23": "adminSetAddress(address)", +"b8d87069": "_removeContributor(uint256)", +"b8d94039": "writePosition(uint256,int256)", +"b8d94b95": "buildDSNullMap()", +"b8d9cbbe": "addMember(address,uint256,uint256,uint256)", +"b8daf1b1": "cancelChainlinkRequest(bytes32)", +"b8dbf876": "transferFromOwner(address,address,uint256)", +"b8dd3c55": "confirmSettingsChange(uint256)", +"b8dd7a5b": "numberOfWagersToMinimumTimeout()", +"b8ddc4df": "HPA_TokenERC20(uint256,string,string)", +"b8ddef1a": "IdeaCoin()", +"b8de3843": "allAmountRaised()", +"b8de85d8": "p_setBankOfEthAddress(address)", +"b8df17f0": "verifySigner(bytes32,uint8,bytes32,bytes32,uint256,uint8,uint256,bool)", +"b8df5ce3": "ownerInitialBalance()", +"b8e010de": "set()", +"b8e046d1": "MinexoDigital()", +"b8e0d08d": "increaseHardCap(uint256)", +"b8e0ffbe": "getPaymentsLength()", +"b8e2cfb1": "getMinMaxInvest()", +"b8e31ee7": "MithrilGauntlet()", +"b8e381e5": "subscriptions()", +"b8e3d8e8": "LOL()", +"b8e3e6da": "participateCrowdsaleAll()", +"b8e4189c": "updateHighestMiles_(uint256,address)", +"b8e42041": "invalidateOrdersBefore(address)", +"b8e44852": "chargeTokensForManagement()", +"b8e60467": "LRCMidTermHoldingContract(address,address)", +"b8e6a433": "calcFactorReward(uint256)", +"b8e920de": "buyTicketTest2(bytes)", +"b8e945fc": "setOwnerNick(uint256,string)", +"b8e9a6f0": "addLockedAccount(uint8,address,uint256)", +"b8e9ac71": "BICToken(uint256,string,string)", +"b8e9c22e": "getRate(address,uint256,bool,uint256)", +"b8eaffcc": "getnodeparam(address)", +"b8eb115e": "increaseDuration(uint256)", +"b8eb3546": "maxSell()", +"b8eb993d": "PUBLIC_SALE_TOKEN_CAP()", +"b8ebed78": "rightForInterest(uint256,bool)", +"b8ec59e4": "changeColorOrange()", +"b8edcd1f": "isOwnerOfJob(address,uint256)", +"b8eddde1": "paymentsOwed(address)", +"b8ef04e7": "_getRandomNumber(uint256,uint256)", +"b8ef5f4d": "nextGameSeedPercent()", +"b8ef9fcc": "cardAddressExists(address)", +"b8f20cfd": "myBalances()", +"b8f249e2": "testThrowsSaleWalletIncorrectSaleAddress()", +"b8f2690d": "TestDividendFund()", +"b8f28531": "notEqual(address,address,string)", +"b8f2954d": "addData(bytes32[],bytes32,bytes32,bytes32,uint256,uint256,uint256,uint256)", +"b8f2bbac": "modify_perms(bytes32,bytes32,int256)", +"b8f3b75d": "buyWithAddress(address)", +"b8f47481": "withdrawErc20ForAddress(address,address,uint256)", +"b8f48d3d": "setMaxRoundSize(uint256)", +"b8f53f36": "maxPrivateSaleStage()", +"b8f5e56c": "DeClub(uint256,string,string)", +"b8f6c219": "purchaseDatesToken(uint256)", +"b8f6d3ef": "getNodalblockData(string)", +"b8f6e7ff": "changeMarketStatus(uint8)", +"b8f71f26": "scheduleTransaction(uint256,address)", +"b8f75c0b": "bountyFactory()", +"b8f76562": "setWithdrawable(address)", +"b8f77005": "getQueueLength()", +"b8f78178": "createNameAndPoint(int256,bytes32,address)", +"b8f7a665": "isLive()", +"b8f7f41e": "drpCrowdsaleRecordedBalance()", +"b8f929ad": "saleWhitelist()", +"b8fa7778": "for_votes()", +"b8fbb72d": "COMMON_WITHDRAW_SUPPLY()", +"b8fbb87d": "isAssociatedAddressFor(uint256,address,address)", +"b8fbe499": "Cygnus()", +"b8fc7bd0": "setPresidenteDeMesaVerify(bytes32,uint256,uint256,uint256,bytes32)", +"b8fcf937": "myToken()", +"b8fd1e10": "updateBalancesContract(address)", +"b8fd1ffa": "addressToEtherOwed(address)", +"b8fde2a4": "dailyPercentAtNow()", +"b8fe6f93": "triggerTransaction(uint256,uint256)", +"b8ffc962": "isMaxSupplyLocked()", +"b8ffd53f": "getStageStartTime(bytes32)", +"b8ffd64b": "PowTokenBase()", +"b9002e62": "delegatedFwd(address,bytes,uint256)", +"b900a870": "getApprenticeChestPrice()", +"b900da19": "calculateBonusPercentage(uint256)", +"b9019437": "eitherHaveAttribute(address,address,bytes32)", +"b9022e44": "updatePresaleWhitelist(address[],bool)", +"b90291c3": "changeWebsite(string)", +"b902c833": "switchfor()", +"b90306ad": "Burn(uint256)", +"b9037bc2": "unlockTokensForAddress(address)", +"b903a2a5": "MultiTransfer(address[],uint256)", +"b904088e": "maximumInvestment()", +"b9043235": "_create(uint256,address)", +"b90436ba": "MBT()", +"b9045c00": "InvestCoin()", +"b904ef4a": "delUIntValue(bytes32)", +"b9068d9e": "distributeFunds(uint256,address,address,address)", +"b906b7b7": "burnPercentage10m()", +"b9078616": "executeTrade(address,address,uint256,uint256)", +"b907996a": "Forwarder()", +"b9089280": "admin_del(address)", +"b908b008": "verifyTx(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[1])", +"b9093fc6": "addIdentity(address)", +"b9098b33": "krs()", +"b90a4df1": "ApushJoustUser(address,address)", +"b90ae5a1": "registrarAuth()", +"b90b0108": "iconcontract()", +"b90b09c0": "random_bool(uint8)", +"b90b1248": "extractTokenEth(uint256)", +"b90b9aea": "EOCToken(uint256,string,string)", +"b90c1dbb": "getCreationDate()", +"b90c8566": "Somplak()", +"b90c86a9": "LogOraclizeCall(uint256,bytes32,string)", +"b90c92e2": "FysicalToken()", +"b90cec6d": "AddOfficialApps(address)", +"b90d3d0c": "data(address)", +"b90d86b9": "autoMatch()", +"b90d89a0": "start_seller(address,address,uint32)", +"b90da496": "getRankTitle(uint256)", +"b90dcc58": "SAFEToken(uint256,string,string,uint8)", +"b90e6bd8": "userRound(address,uint256)", +"b90f1af1": "icoEndUnix()", +"b90f65a2": "canCancelBet()", +"b910378d": "getBI(bytes32)", +"b91038c7": "participate(address)", +"b9103e1f": "refundAction(bytes32)", +"b9106dd9": "setAllowAccess(address,bool)", +"b91070e8": "processEmergencyFundReleaseFinished()", +"b9119b87": "ChangeSwapperAddress(address)", +"b911f2fb": "settleCandyGetx(uint256)", +"b912950e": "buyItemRaffleTicket(uint256)", +"b91366b0": "upgradeReactor()", +"b9138584": "Deedcoin()", +"b9140422": "readMailByAdmin(uint256,bytes16,address)", +"b9144c96": "TokenMinted(address,uint256)", +"b9145944": "verifySig(address,bytes32,bytes)", +"b914cf7c": "leve1(address)", +"b914d908": "getBeneficiaryIndex(address)", +"b9156830": "hasPriorDuplicate(string,uint256)", +"b9166178": "investorWallet(address)", +"b916c5ff": "redeemCoupons(uint256,string)", +"b916de59": "reset(address[])", +"b916e5d0": "goldenTokenId()", +"b916f8fd": "delistMon(uint64)", +"b9172dec": "changeStage(uint8)", +"b9174330": "gco(uint256,address)", +"b9186d7d": "priceOf(uint256)", +"b919be66": "useMultipleItem(uint256,uint256,uint256,uint256,uint256)", +"b91aedab": "transferLocked(address,uint256[],uint256[])", +"b91bb31c": "initLottery(uint256,uint256,uint256)", +"b91bf310": "initialChargeFeePool(address)", +"b91c771f": "replaceProduct(address,address,address,address)", +"b91d1aed": "createPassport(uint256,bytes32)", +"b91d3ace": "addDev(address)", +"b91d4001": "releaseTime()", +"b91d4a0f": "frontWindowAdjustmentRatio()", +"b91db40c": "FINE()", +"b91dee6c": "ResetUpdateState()", +"b91e3422": "premiumHold()", +"b91e4087": "validAddresses(address)", +"b91fe64b": "getLastDepositDate()", +"b9204d1c": "TeamVestTimeLimit()", +"b9209e33": "isVerified(address)", +"b920c799": "Insureum(uint256,uint256)", +"b920ded9": "_detectInvestorGroup(uint256)", +"b920ef71": "removeExtension(uint256)", +"b9212662": "s13(bytes1)", +"b921e163": "increaseSupply(uint256)", +"b9223946": "endVote()", +"b9224385": "LogResultWinner(uint256,address,uint256,uint256,bytes)", +"b92289ef": "sendleftmoney(uint256,address)", +"b9235d08": "FlippedCoin(address,uint256,int256)", +"b923909d": "check_hash_exist_in_chain(string)", +"b923b205": "setWhitelist()", +"b9247673": "buyListing(bytes32,uint256)", +"b9256f7e": "newTickerQueryResult(string,bytes32)", +"b925af47": "creatorsTotalBalance()", +"b92620bd": "targetWallet()", +"b926bd06": "Prepurchased(address,uint256,uint256,uint128,uint256)", +"b9272a11": "_redeemAdoptedAxies(address,uint8,uint256)", +"b927ef43": "validatorSetApplyBlock()", +"b928024d": "tokensPerWeiBonus250()", +"b9291296": "useMyOldName(string)", +"b9292158": "getTimestamps(address)", +"b929709a": "getPOOL_edit_1()", +"b92984f8": "TokenGame()", +"b92a3961": "currentRoundBudget()", +"b92a56bf": "deathData_v10()", +"b92ae87c": "isSubscribed(address)", +"b92b9d6c": "replacePublisherRegistry(address)", +"b92cb5b8": "addBrick(uint256,string,string,uint256,string,bytes32[],uint256)", +"b92cc8cf": "isExisting(uint256)", +"b92cd8f1": "officalHolding()", +"b92ce1a7": "createRandomCharacter()", +"b92d6c2f": "TWCToken()", +"b92dd395": "setManagerPowerful(bool)", +"b92ddee6": "setStartTimeIco(uint256,uint256)", +"b92e9f9e": "reportWasCalled()", +"b92edfc6": "NumberOfAuctions()", +"b92f1986": "IMDEXinvalidateOrdersBefore(address,uint256)", +"b9308d9e": "updateName(address,string)", +"b9318b0c": "_born(uint256,uint256)", +"b931b484": "bountyTokensLeft()", +"b931bec5": "setContractErc20Token(address,address)", +"b9324db6": "upgradeCardShield(uint256)", +"b9330829": "maxUint256()", +"b935170b": "addShopOwner(string,string)", +"b93529bc": "tokenTicketPrice()", +"b9358ba4": "isApper(address)", +"b9359169": "GayPersonalAds()", +"b9364835": "getCatOwner(uint256)", +"b93651bb": "__initFuse()", +"b9368721": "balancesRiskcoins()", +"b93806ab": "setWinningNumbers(uint256,string)", +"b9381f3c": "checkCapsAndUpdate(uint256,uint256)", +"b93833c3": "changeRewardAmount(uint256)", +"b9384f12": "changeMinCapUSD(uint256)", +"b938b469": "SetRewardMultiAD(uint256)", +"b938bf42": "sendBounty(bytes32)", +"b93983dd": "StoxSmartTokenSale(address,address,uint256)", +"b939d43a": "ARISCOIN()", +"b93a4408": "setMintFrequency(uint256)", +"b93a50b0": "_setApprovalForAll(address,bool)", +"b93ab165": "getCurrentInfo()", +"b93c109f": "totalInterests()", +"b93c3de2": "getHistoryRoundList()", +"b93c7d42": "sellDividendPercentCandy()", +"b93dab0b": "getBetCount()", +"b93dc802": "setEth(uint128[2])", +"b93e0e39": "ROCK()", +"b93ea812": "subtract(int256,int256)", +"b93eb763": "x(int256,int256)", +"b93f9b0a": "getAddress(uint256)", +"b93fd2bf": "createCustomAtom(uint64,uint8,uint8,uint8,uint128,uint128,uint32)", +"b9408373": "USD_PER_ETH()", +"b940db1a": "sellAllDolAtOnce()", +"b9413c47": "totalReturnedCredit()", +"b9420310": "tokenSale()", +"b942394d": "getPercent2(address)", +"b94265b8": "addReferrer(address,address)", +"b9429069": "isFarmer(address)", +"b94371ec": "getWhitelistOwner()", +"b9447f7e": "customBuyerForIndex(uint256)", +"b944ef3c": "initialTraining()", +"b94512c7": "BioCoin()", +"b9459b70": "getCurrentLuckyStonePrice()", +"b9460d04": "updateTicketVault(uint256,uint256)", +"b94669e5": "interfaceThawTokens(address,uint256)", +"b9468f7e": "bid(uint256,bool)", +"b946c19c": "rankDataContract()", +"b946fab1": "maxAmountPresale()", +"b9474959": "_isTokenOperator(address,uint256)", +"b94761b4": "SetupAllowance(address,uint256)", +"b94776de": "mintUnlockTime(address,uint256,uint256)", +"b9478ade": "DylanCoin(uint256,string,string)", +"b948348c": "purchaseTicket(uint256)", +"b94844dd": "AAAToken()", +"b9484955": "getInvestorArray()", +"b9488546": "ownersCount()", +"b9499cd6": "Midwife()", +"b949f2f3": "finishPVEBatch(uint32[])", +"b94b0a3a": "getFulfillment(uint256,uint256)", +"b94bae91": "setUser(address[])", +"b94bc7fe": "proofOfSalt(bytes32,uint8)", +"b94c3451": "techBuff()", +"b94cc52f": "mark(address,bytes32)", +"b94e3516": "TAKCoin()", +"b94e962a": "allocateTickets(uint256)", +"b94ee0fc": "Triunvirate(address[])", +"b94f5a6e": "eventPirze(address,uint8)", +"b94f969c": "investmentBTC()", +"b94fa03f": "requiredSharesToBeBoardMember()", +"b94fb4a3": "WaykiCoin()", +"b94fdaab": "upload_group_key(uint256[4])", +"b950556a": "setThingValid(bytes32[],bool)", +"b950ae2b": "changeTopWithdrawable(uint256)", +"b950f0a0": "rateTier3()", +"b95254f6": "setAsLotteryRunner(address,bool)", +"b952ab7b": "unclaimedTokensForInvestor(address)", +"b9531df3": "lowTimeBonusLimit()", +"b953a9ac": "getDocumentProposalCount()", +"b9541ad5": "resetReferee(address)", +"b95459e4": "moduleRegistry()", +"b95460f8": "open(address)", +"b954ca70": "setcapbounus(uint256,uint256,uint256)", +"b95594e5": "lineOfPlayers(uint256)", +"b9559685": "StateHolder()", +"b955b95c": "getKindOfPackage(address)", +"b955e60d": "roundData(uint256)", +"b956a8a6": "easyMineToken()", +"b9570c01": "transferAndCall(address,uint256,bytes32)", +"b957aeb6": "getUserReaction(uint256)", +"b957b886": "stackOffset(uint256)", +"b9582195": "SFXToken()", +"b958893e": "XTVAirDropped()", +"b9588adc": "getStageAttributes(uint8)", +"b958a5e1": "getPhoneByAddress(address)", +"b958abd5": "setA(string)", +"b9592e92": "setGM(address)", +"b9599f3a": "fetchUndistributedProfit()", +"b95a4baf": "daysSinceLaunch()", +"b95a8327": "marketGrapes()", +"b95af889": "processTransferToICAPResult(address,bytes32,uint256,bool)", +"b95bb4f8": "price(uint16)", +"b95c2740": "buy(address,bytes)", +"b95cbed6": "currentExpiryInterval()", +"b95d2a53": "deedUri(uint256)", +"b95f2be8": "_releaseVouchers(address,uint256)", +"b96095fd": "GEND1()", +"b960a45f": "unpauseTrueUSD()", +"b960a6d4": "ITTMultisig()", +"b96144fd": "removeUsername()", +"b9615878": "getHeader(bytes32)", +"b961716b": "getActiveTier()", +"b961b1e0": "teamNamingIncome()", +"b96297b5": "killya()", +"b962de9a": "ProsperaToken(uint256,string,uint8,string)", +"b9632689": "numFunders()", +"b9635685": "JAJToken()", +"b963e1d0": "getPurpouse()", +"b964608d": "get_return_by_level(uint256)", +"b9649e52": "getPlayerPotWinning(uint256,uint256,uint256)", +"b96528fd": "pubAddress()", +"b9653382": "firstPeriodEndDate()", +"b965817d": "UBSCoin()", +"b9659d4a": "sibling()", +"b9668eb2": "settleUnclaimedPerTokenPayouts(address,address)", +"b966f350": "tokenMintingEnabled()", +"b96732d9": "TransferToSAToE(uint256)", +"b9676e72": "SPTToken()", +"b967a52e": "setContactInformation(string)", +"b968440a": "Finalized(uint256,uint256)", +"b968486e": "isLottoStarted()", +"b96890a1": "airdroptoken()", +"b96891e5": "getAddressesSize()", +"b9689cf3": "crowdsaleAirdropAddress()", +"b968a53c": "getBurnAddresses()", +"b969d399": "getBattleCooldown(uint64)", +"b96a39bd": "createPlayer(string,uint256,uint256)", +"b96b8edf": "changeAirdropQty(uint256)", +"b96bf2b5": "expressReloadNumSec(uint256,uint256,uint256[],uint256[])", +"b96c0866": "completeOrder(string)", +"b96c10ba": "_assign(address,address,address)", +"b96d64fb": "start_quiz_game(string,string)", +"b96dc22a": "enableLambo(uint256)", +"b96dc96d": "delCertificate(string)", +"b96e988b": "addressBilborough()", +"b96f54d1": "fixedReverse(uint256[10])", +"b96f8a39": "Voting()", +"b970e3d0": "JATICO()", +"b971667c": "calculateEmissionTokens(uint256,uint256,uint256,uint256)", +"b9717b23": "setOdd(uint256,uint256,uint256)", +"b971a1f8": "VivekTestToken()", +"b971b4e5": "setNotTransferable(bytes20)", +"b9727dc2": "getProjectClient(uint256)", +"b9727f50": "saveRevenueShareDistribution(address,uint256)", +"b972b967": "transferTokensToTeam(address,uint256,uint256)", +"b97386d1": "reputationProblems(address,bytes32)", +"b973b286": "Imteaz()", +"b974b0a3": "allData()", +"b974ddcb": "getAnimalById(uint256)", +"b9750acf": "selfDestroy()", +"b97585d3": "addOldNickname(address,string)", +"b975ce23": "crownName()", +"b975d9c7": "setCCH_edit_32(string)", +"b976b35b": "uponTransfer(address,address,uint256)", +"b976f464": "authoriseAccount(address)", +"b9774f7b": "confirmations(uint256)", +"b9776301": "testTrustedTransferFrom()", +"b9789d7d": "ChangeDeadLine(uint256,uint256,string)", +"b97a6c12": "redeemForReportingParticipant()", +"b97a7d24": "getGoal()", +"b97af2c8": "setTokenDecimals(uint256)", +"b97b451e": "increaseApprovalPreSignedCheck(address,address,uint256,uint256,uint256,uint8,bytes)", +"b97b9df8": "AUACoin()", +"b97cab2c": "convert2Peony(uint256)", +"b97ce4d3": "distributionteamFinished()", +"b97d3627": "TosToken()", +"b97df70a": "setTokenReward(address,address)", +"b97e3b43": "setMintAgent(address,address,bool)", +"b97fd9e1": "releaseWallet(address)", +"b980a312": "PtestTokenICO(uint256,uint256,address,address,address,uint256,uint256,uint256,uint256)", +"b980b10d": "masterCardEscrow()", +"b9812d9a": "getNextReportingWindow()", +"b981655f": "DebtManager()", +"b9818be1": "feeOwner()", +"b982e5c1": "testAddPending()", +"b9843c7c": "setUnavailable()", +"b9844d6f": "updateSelfDropStageState(uint256,uint256,uint256,uint256,uint256,uint256)", +"b9855c76": "restartPeriod()", +"b9858a28": "addContract(address,address)", +"b9861011": "setUniqueBlindedProposal(uint256,bytes32)", +"b986b611": "withdrawAddressUpdate(address)", +"b986bb67": "STATUS_DESTROYED()", +"b9871548": "set_token_address(address,string)", +"b9879450": "CREATOR_TOKEN()", +"b987ae02": "fundWithdrawal(uint256)", +"b987bdac": "InterCrypto()", +"b987f688": "gettotalCards()", +"b9883b3f": "main(uint16,uint8,int256)", +"b988899f": "setBenificiary(address)", +"b988c505": "newProposal(address,uint256,string,bytes,uint64)", +"b9890a74": "initBonuses(string)", +"b989915c": "lastUsdPerEthChangeDate()", +"b989c7ee": "returnInt32(int32)", +"b989ffa7": "getArtist(bytes32)", +"b98a5418": "assignedAmountToAngelInvestment()", +"b98aacf0": "retreiveHrt(string)", +"b98ac0c5": "setUserAlloc(address,uint256,uint256)", +"b98b5f9c": "listPrycto1()", +"b98bafde": "Redeemed(uint32,address)", +"b98bcf16": "getPubKeyByHash(bytes28)", +"b98c90c2": "ECOS(address)", +"b98cb57e": "rinkeby()", +"b98d49a5": "getSponsorshipCount(address)", +"b98dbb50": "updateprojectDuration(address,uint256)", +"b98de7c7": "setLive()", +"b98e2769": "sketchNoLongerForSale(uint256)", +"b98ef00d": "disclosureList(uint256)", +"b98f0992": "TokenRK50Z()", +"b98f5932": "getUserExp(address)", +"b98fa504": "AddTower(uint32,uint16,uint16,uint256,uint256,uint16,uint16)", +"b98fb437": "getethused(address)", +"b98fdc36": "IconomiToken(uint256,string,uint8,string,uint256)", +"b990033e": "setNewRegister(string,bytes32,uint256)", +"b9902eef": "Rate8()", +"b9908cbb": "maximalIndividualContribution()", +"b9910c5f": "JixoCoin(uint256,string,string)", +"b991357c": "isAdvisorsTokensThirdReleased()", +"b99152d0": "balanceOfToken(address)", +"b991bc14": "direct_refunds(address[],uint256[])", +"b991f607": "Bank(uint256,uint256)", +"b9926d1d": "limitBuy(uint256)", +"b992812e": "hasIssued(address)", +"b9931d30": "getPlayerToken(uint32)", +"b9934b9e": "ownerResumeContract()", +"b99371a0": "GetPrestigeInfo(uint256)", +"b993a53e": "preSaleBalancesOf(address)", +"b993a91f": "migrationAccountCounter()", +"b993c871": "NGToken()", +"b995b014": "_exploreUsingEmont(address,uint256,uint256,uint256)", +"b995ce4d": "returnTokenAddress(uint256)", +"b99613cb": "getPlayRecordNoTurnData(address,address)", +"b99798e8": "accFounder()", +"b9980306": "processARvRevForecast()", +"b9981a67": "firstBalanceOf(address)", +"b999279e": "VerifyProofAndUpdateState(uint256[],uint256[],uint256[],uint256[],bytes)", +"b9997819": "ownerSetHouseEdge(uint16)", +"b999abbc": "Spole()", +"b99a8a00": "exchange_coefficient()", +"b99ac856": "roundin(address)", +"b99b2f81": "myReferrals()", +"b99b951d": "claimTokensE(uint8)", +"b99bc116": "verifyTrustedSender(address[],uint256,uint256,address,uint8,bytes32,bytes32)", +"b99c2b51": "_getWinAmount(uint8,uint8,uint8,uint24,uint256,uint256,uint256,uint256,uint256)", +"b99de11e": "endThirdWeek()", +"b99dfe18": "getPackage(uint256)", +"b99ec99a": "AuditorRegistryReplaced(address,address)", +"b99eccc1": "SplitWeighted(uint256)", +"b99f1d02": "claimClusters()", +"b99f247d": "ERGCOIN()", +"b99f48d5": "promisedPop()", +"b99f6073": "tokenPurchased()", +"b9a0157e": "setArrayIndexValue(bytes32,uint256,bytes32)", +"b9a0a708": "testChargesAmountApproved()", +"b9a0c1bb": "_approveRobot(uint256,address)", +"b9a1bd86": "registerPrivateContribution(address,uint256)", +"b9a2131b": "ContractTST()", +"b9a29d42": "getKevin()", +"b9a2de3a": "endAuction(uint256)", +"b9a30afb": "HelloGoldSale(address,address,address,address)", +"b9a41409": "gcpa(uint256)", +"b9a45aac": "whitelistAddress(address,bool)", +"b9a4a755": "afterApproveAction(uint256)", +"b9a4defe": "changeTargetAddress(address)", +"b9a52203": "saveRN(uint256)", +"b9a527b4": "book(address,address,uint256,uint256)", +"b9a54062": "getMaximumWritesPerStep()", +"b9a59b83": "isEngineerContract()", +"b9a5a2d9": "numberOfApprovedSteaks()", +"b9a5e073": "contracteesSize()", +"b9a60038": "totalTransactions()", +"b9a68300": "bountyOnlineWallet()", +"b9a6e94c": "buyTile(int32,int32)", +"b9a6f7b0": "BTHB()", +"b9a804fb": "ArrowTestCoin()", +"b9a82f80": "buyPepe(uint256)", +"b9a904f9": "testUnauthorizedSetBetaPackage()", +"b9aa8236": "getMaxAgonId()", +"b9aaaeee": "populateTierTokens()", +"b9ac0524": "icoEtherReceivedTotal()", +"b9ac38aa": "test_newProposalAndVoting()", +"b9aceb63": "BuyTicketUseVault(address,uint256)", +"b9ad36b9": "prophecise(bytes32)", +"b9ad771c": "registerHWCWit(string)", +"b9ae4bda": "associatedPubkeys(uint256)", +"b9ae7364": "pauseAuction()", +"b9af809e": "getMinEthersInvestment()", +"b9afd6e1": "returnChildAddressForParent(address)", +"b9b162c3": "calculateTop5HeroesPower(address,address,uint256)", +"b9b1c90c": "moveToSafetyWallet()", +"b9b237c2": "tokenFunded()", +"b9b26bd2": "registerBroker()", +"b9b2a331": "setAccPrice(uint256)", +"b9b2a890": "rewardDaily(uint32,uint32)", +"b9b2b5cd": "totalFeeCollected()", +"b9b3ded2": "createDividend(uint256,uint256)", +"b9b42602": "ethRefunds(address)", +"b9b43faa": "createInt256s(bytes32[],int256[])", +"b9b466ab": "myLoveBlockCount()", +"b9b6990b": "getUserBetsInARazInstance(uint256,uint256)", +"b9b6c2d4": "getAmountOwed(bytes32,address)", +"b9b7238b": "addInvestorBonusInPercent(address,uint8)", +"b9b7569b": "isGameLogicContract()", +"b9b7b68c": "limitbreak_contrib()", +"b9b842e5": "setCandyLand(address)", +"b9b8af0b": "halted()", +"b9b8c246": "invest(address,uint256)", +"b9b8e25d": "getRemainingTokensToSell()", +"b9b94997": "repossessBooking(address,uint256)", +"b9ba2926": "receivedCollateral()", +"b9bac5f8": "lockedUntilTime()", +"b9bcf81f": "getTlength10()", +"b9bd4f76": "newSale(uint256,uint256,uint8,uint256)", +"b9bda244": "sumICO()", +"b9bdbbbb": "FILMToken(uint256,string,uint8,string)", +"b9beadae": "testCantBuyTokensInEndedSale()", +"b9beeb8d": "DatingCoinToken()", +"b9bf068e": "getUncompensatedContributors(uint256,uint256)", +"b9c009f0": "checkContributorBalance(address)", +"b9c0d227": "defaultTokensPerWei()", +"b9c105cf": "getTaskRewardAndStatus(bytes32)", +"b9c1a60a": "econReserveAllocation()", +"b9c2c6fb": "removeMember(bytes32)", +"b9c2ee82": "upgradeController(address)", +"b9c3395f": "getTokenAmountBonus(uint256)", +"b9c3515c": "votingActive(bytes32)", +"b9c390aa": "SaferEcRecover()", +"b9c3a818": "TEAM_SUPPLY()", +"b9c4d0a7": "fundOrder(uint256)", +"b9c53d04": "SECCoin()", +"b9c5be85": "allocatePurchase(address,uint256,uint256)", +"b9c5eb90": "updateVoucherMthRate(uint256)", +"b9c7ce49": "totalIssuingCollateral()", +"b9c81f1d": "Membership()", +"b9c8464d": "extractFees(uint256)", +"b9c8559d": "RocketPoolReserveFund(address)", +"b9c89ff7": "getTargetRepMarketCapDivisor()", +"b9c97a44": "UnlockAccount(address)", +"b9c99e5e": "DepositUnfrozen(address,uint256)", +"b9caebf4": "del(address)", +"b9cb385d": "invitedInit(address,address)", +"b9cb5b5f": "HatchEggs()", +"b9cbbb62": "testInequalityAddr()", +"b9cc8b48": "oraclizeOn()", +"b9ccaed2": "getMesas()", +"b9cce72c": "addFlag(bool[2])", +"b9ce10d5": "Fyle(string,string,uint8,uint256)", +"b9ce795f": "createVoter(string)", +"b9ceda19": "updateTokenNameAndSymbol(string,string)", +"b9cf01a1": "Cardiology()", +"b9cf9d49": "getNextOrderUser(address,address,uint256,address)", +"b9d0a638": "Bro()", +"b9d1d49b": "minimumBalance()", +"b9d1ed4a": "ethDeposits(address)", +"b9d1fd60": "fundingMaxAmount(address)", +"b9d2fa35": "disableFundingWallets(address)", +"b9d32a1f": "tokenTransferOwnership(address,address,address,address)", +"b9d3514d": "addEventToUser(address)", +"b9d36743": "priceToMint(uint256)", +"b9d414bd": "setSecurityTokensWallet(address)", +"b9d47fff": "mySubdividends()", +"b9d5205c": "SASH()", +"b9d54f6f": "setMinPurchaseLimit(uint256)", +"b9d5d7fe": "resetUserPicture(string)", +"b9d6257d": "DeletePool(string)", +"b9d677f9": "_buyProp(uint256,uint256,uint256)", +"b9d69a30": "sendTo(address,address,uint256,bytes)", +"b9d723eb": "startNewPeriod()", +"b9d7fdf4": "bonusTierSize()", +"b9d8350e": "getWeiFromUsdCents(uint256)", +"b9d92de8": "calculate(uint256)", +"b9da4033": "_randBySeed(uint256)", +"b9da706e": "LandSale(address,uint256,uint256,uint256)", +"b9da8360": "_setBattleContract(address,address)", +"b9db15b4": "getProduct(uint256)", +"b9db9a6d": "resetAllApproval()", +"b9dc25c5": "approvedUser()", +"b9dda7b8": "_ERC20Contract()", +"b9de1c41": "buyRaffleTicket(uint256)", +"b9deb729": "isTransferEnable()", +"b9dedc6a": "shareTransfer(address,address,uint256)", +"b9df2d22": "isGameRunning()", +"b9df819f": "receiveFunds(address,address,uint256)", +"b9dfaf3a": "setPriceChannelMaxSize(uint256)", +"b9e01aeb": "buySpaceshipUpgrade(uint256,uint16,uint8)", +"b9e04eea": "withdrawStuckEtherOfAmount(address,uint256)", +"b9e15a67": "coinAgeForAddress(address,address)", +"b9e16b65": "issueDescription()", +"b9e1aa03": "deposit(address,bytes32)", +"b9e205ae": "updateExchangeRate(uint256)", +"b9e290f9": "setValue(bytes32,address)", +"b9e328de": "GIDIDAX()", +"b9e3a8dd": "isCompositionOnlyWithBaseLayers()", +"b9e3e2db": "releaseDate()", +"b9e3ee01": "addNodeToWhitelist(address)", +"b9e448df": "OpenFund(bytes32,string)", +"b9e4d098": "setNewEndDate(uint256)", +"b9e58ab0": "setPropertyOwnerSalePricePrivateModeFlag(uint16,address,uint256,bool,uint8)", +"b9e5e2c4": "ratePerWeiInPreICO()", +"b9e6152b": "process(address)", +"b9e6ac68": "TabTradersToken(address,address)", +"b9e6edcf": "s15(bytes1)", +"b9e6f1d9": "get_amount()", +"b9e70ed6": "setLoanParameters(address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256)", +"b9e722cd": "caddress()", +"b9e77649": "OVISBOOKED_TOKENS()", +"b9e7afd1": "__setSecretaryGeneral(address)", +"b9e7c061": "tempGetDataToCheck(uint256,uint256)", +"b9e7e2f9": "Beercoin()", +"b9e8574f": "getReservedDestinationInfo(address)", +"b9e95382": "store(uint32)", +"b9e99231": "EEM()", +"b9e9d1aa": "futureOwner()", +"b9e9e441": "exchangeTokensByAddress(uint256,address,address)", +"b9eb04f3": "hashPosition(uint32,int64,bytes16)", +"b9eb5511": "setPI_edit_5(string)", +"b9eca0c8": "gID_()", +"b9ed6df8": "withdrawEtherFromcontract(uint256)", +"b9ed93e9": "setWaitTimeBlocks(uint256)", +"b9edf911": "approveBulk(address[],uint256[])", +"b9ef7835": "infect(bytes32)", +"b9f10278": "EtherPredictx()", +"b9f14557": "unban(address)", +"b9f1fb62": "transferPrivateReservedUFT(address,uint256)", +"b9f2086b": "BlockWar()", +"b9f24e44": "freezeGame(uint256)", +"b9f256cd": "newProposalInEther(address,uint256,string,bytes)", +"b9f28076": "historyIdx(address)", +"b9f2d592": "maxAllowedReservingPercentage()", +"b9f308f2": "getEtherForTokens(uint256)", +"b9f37c86": "Registrar()", +"b9f4657d": "approve_tx(address,bytes)", +"b9f48cad": "performAction(address,bytes,uint256)", +"b9f4b5c2": "refundStart()", +"b9f615d7": "bankRollInvest()", +"b9f696d5": "setNote(uint256,bytes32,string)", +"b9f71934": "promotionsOfClaimant(address)", +"b9f7d242": "restoreAllPersistentTokens(uint256)", +"b9f89751": "withdrawAsCreator()", +"b9f96247": "SellMulti(uint256[],address)", +"b9f9d9a5": "test_insert_findNoHintAtPosition()", +"b9fa2055": "capETH()", +"b9fac520": "BIU()", +"b9fb0579": "Transfer_of_authority(address)", +"b9fb3ff8": "BOOYAHTEST()", +"b9fb7b8c": "Deposit_referral()", +"b9fbe331": "bonusTokenRateLevelOne()", +"b9fea3bb": "setBaseInfo(address)", +"b9feeb05": "GetCategoryCount(string)", +"b9ff5fcf": "getMakerBetDetails(uint256,address)", +"b9ffc576": "RevalootSwap()", +"ba001de3": "revokeBountyTokens(address,uint256)", +"ba00660f": "publicWithdraw()", +"ba00ab60": "cancelAuthorizations(address,address[])", +"ba0179b5": "confirm(uint256)", +"ba02021d": "redeemTicket(uint256,address)", +"ba029c97": "wei20()", +"ba02cf47": "MORTU()", +"ba02e9f2": "Coincirculationchain()", +"ba02f006": "_concat(string,string)", +"ba030c8c": "endRefundingingTime()", +"ba033fe1": "buyAndTransfer(uint256,address,address,bytes)", +"ba0410fb": "changeExhangeRate(uint8)", +"ba044799": "setDropable(bool)", +"ba057826": "MDXToken()", +"ba065e1f": "expired(uint256)", +"ba067f59": "setToSendLeft()", +"ba075da2": "undermineComponent(uint16,uint256)", +"ba081b8d": "PHOENIX_POOL()", +"ba086518": "delist(uint16)", +"ba087b9d": "balanceOfAtType(address,uint256,uint256)", +"ba08809d": "showTimeLock(address)", +"ba08f299": "decrementTotalIssuerCount()", +"ba09591e": "setSellFloor(uint256)", +"ba0a272b": "icoEtherReceivedPreFirstSale()", +"ba0a4ca9": "_safeGasStaticCall(address,bytes)", +"ba0a93a8": "getRankOnePlayer()", +"ba0b9788": "setTitulaire_Compte_7(uint256)", +"ba0bafb4": "currentWindow()", +"ba0bba40": "setup()", +"ba0bc2f4": "initialCardPrice()", +"ba0bf0c4": "weiMaxInvestment()", +"ba0bface": "managementBodyAddress()", +"ba0c1777": "ecoLock13()", +"ba0c9b54": "mcs()", +"ba0cf581": "findDispute(address)", +"ba0d291b": "CashMateToken()", +"ba0d46f3": "BoraToken(uint256)", +"ba0d94a8": "Bcigarcoin()", +"ba0df427": "sumOf(uint256[])", +"ba0e0f5e": "removeTrustedAccount(address)", +"ba0e6cc9": "removeVerified(address,address)", +"ba0e930a": "transferManager(address)", +"ba0f5b20": "getDarknodeBond(address)", +"ba0fbf0d": "_saleTokens()", +"ba102763": "etherToSendSecurityPool()", +"ba1066ed": "pendingAmount()", +"ba10db46": "transferEthHandleOwnership(bytes32,address)", +"ba112d50": "setDataEquip(address)", +"ba1162d7": "getFmLength()", +"ba119e5a": "SEBCToken()", +"ba11ecde": "preSaleOpen()", +"ba124401": "FrozenGuard()", +"ba13a572": "lottery()", +"ba14d606": "test(address,uint256)", +"ba151ad9": "USD_PER_TOKEN()", +"ba157d46": "setWebGiftEtherAmount(uint256)", +"ba15e52e": "getInfo(bytes20)", +"ba15fcaa": "Tremendoustoken()", +"ba16ae2d": "WBET()", +"ba16d600": "minReward()", +"ba16e00e": "bonusEnd05()", +"ba17e592": "performWrite1()", +"ba1803c1": "setCryptoJinglesContract(address)", +"ba181ac6": "setWhitelist(address,address)", +"ba1a2243": "setTokenPaymentCustomer()", +"ba1ad438": "newFee(uint256)", +"ba1af80f": "phase4Price()", +"ba1b44da": "getBoardRating(address,uint256)", +"ba1b6221": "calcUnMaskedGuEarnings(uint256,uint256)", +"ba1c0201": "evRefund(address,uint256,address,uint256,bool)", +"ba1c3b92": "setSalePeriod(uint256,uint256)", +"ba1ccbee": "getSupportedRolesCount()", +"ba1cd983": "unitCreationFee()", +"ba1d8d4f": "createAutoridadElectoral(bytes32,bytes32)", +"ba1f879f": "privateSale()", +"ba1fd9f4": "widraw(uint256,address,bytes32)", +"ba209dab": "rejectCertification(uint256)", +"ba20dda4": "getBeneficiary(bytes32)", +"ba21d62a": "Command(address,bytes)", +"ba2318ca": "totalSaleSupplyCap()", +"ba236abe": "getMyWinAmount(address)", +"ba255cd1": "liquidAllocatable()", +"ba25a585": "EventUpgradeTank(address,uint256,uint8)", +"ba25d944": "longDescription()", +"ba278e08": "setStartTime(uint256,uint256)", +"ba285f5d": "minimalPaymentInWei()", +"ba286ee3": "testRegisterCustomer()", +"ba2902fb": "rehancoin()", +"ba2a730b": "getAddressLastUpdate(address,address)", +"ba2a98f2": "closeZoneShop(bytes2)", +"ba2ab079": "changeEndPrivateSale(uint256)", +"ba2aee26": "addGains(address,uint256)", +"ba2d5c88": "MINBET_perTX()", +"ba2e84f9": "publicsalesCap()", +"ba2eb541": "isExpired(address)", +"ba2ee51f": "ICO_TOKENS_AMOUNT()", +"ba2ee65c": "manage()", +"ba2eebb4": "transferControl(bool)", +"ba2fa957": "markettingPercentage()", +"ba3019de": "fwdPaymentAndData(address,bytes)", +"ba3025d4": "epicenter_works_addr()", +"ba32348f": "reffUp(address)", +"ba32694c": "howCoin()", +"ba331eab": "tokenSetTransferFeeAbs(address,address,uint256)", +"ba33a876": "VBToken()", +"ba34251b": "usdToEthPrice()", +"ba344304": "Lydian()", +"ba344743": "_rawTransfer(address,address,uint256)", +"ba346d11": "ArenaPool()", +"ba34c8f1": "setrate(uint256)", +"ba353925": "paymentDisable()", +"ba35749c": "deleteOffer(bytes32,address)", +"ba35b1d3": "TxMessage(uint256,uint8,uint256)", +"ba35c0be": "changeSelectFight2DeathContract(address)", +"ba35f38d": "eip20TransferFrom(address,address,address,uint256)", +"ba3603fd": "usdPerMEth()", +"ba36f423": "att()", +"ba3717c0": "setStrF1F2(string,string)", +"ba376923": "Cez()", +"ba377731": "getSupplyBalance(address,address)", +"ba37caa4": "exchangeStaStb(uint256,uint256)", +"ba386f0b": "propertyIdToAuction(uint256)", +"ba38743b": "GrabUnallocatedValue()", +"ba38c599": "announced()", +"ba391bb2": "perTokenPrice()", +"ba399ad2": "isInLockStage()", +"ba3b60ed": "rawVotes()", +"ba3c0067": "getTopPlayers(uint256)", +"ba3d0cb5": "retentionMin()", +"ba3dc67c": "startingPoint()", +"ba3eb50f": "TokenEther()", +"ba3eb61d": "InterfaceData(address)", +"ba3eefc5": "makeInvestment(uint256)", +"ba3f41da": "beginCodeUpdate()", +"ba3f56f8": "startFinalStage2()", +"ba3f5a12": "tokenMultiplier()", +"ba3f8f2c": "getTokenPriceUSDWEI(uint256)", +"ba3f8f31": "ReleasingScheduleLinearContract(uint256,uint256,uint256)", +"ba3fc155": "ownerWithdrawal(uint256,address)", +"ba3fd8f7": "currChampion()", +"ba3fdb8f": "_createArt(uint256,address)", +"ba40aaa1": "setGiveAway(uint256)", +"ba414fa6": "failed()", +"ba41dc5b": "setwalletOne(address)", +"ba425379": "Ico_rejected(string)", +"ba429f33": "getRewardsContractHash(address)", +"ba42c8e5": "resolveSupervisorVote(uint256)", +"ba42fdb9": "handleLastProposal()", +"ba437b5d": "KOKC()", +"ba441560": "SetRedeemRate(uint256)", +"ba4442ab": "ReassingTokens(uint256,uint256)", +"ba44593c": "set(bytes32,address)", +"ba44bc0b": "UserMinMaxCrowdsale(uint256,uint256)", +"ba44f6a4": "RETHEN1()", +"ba452930": "stopPrivatePlacement()", +"ba454d60": "changeMaxEntries(uint256)", +"ba457dd1": "BreezeCoin()", +"ba45b0b8": "transfer(address,address)", +"ba4611d9": "getClaimCount()", +"ba463acd": "createPackage(uint256,uint256,uint256,string,uint256)", +"ba4670da": "onlyOwnerSetAdvWallet(address)", +"ba46adeb": "exerciseLong(address[2],uint256[7],uint8,bytes32[2])", +"ba470738": "changeRejectSetting(uint256,bool)", +"ba47c5f8": "inpreSalePeriod()", +"ba4823e1": "SoundcoinsToken(address)", +"ba485844": "func_0C0E()", +"ba487e62": "newCampaign(uint32,uint96,uint16,uint16)", +"ba48e057": "setBatchTransferLimit(uint256)", +"ba490a03": "SpudToRotator(uint256,address)", +"ba49e21f": "getAttoTokensAmountPerWei(uint256)", +"ba4a579d": "canBetOnRound(uint256)", +"ba4bcd72": "currentAdmin()", +"ba4c206e": "removeCertificationDocumentInternal(address,bytes32)", +"ba4c825e": "_transfer(address,address,uint256,bool)", +"ba4d0c99": "conversion(uint256)", +"ba4d573f": "addSelctFight2Death(uint256,uint256,uint256)", +"ba4e1c38": "airdropTotalQty()", +"ba4feabd": "createEscuela(uint256,address)", +"ba50f965": "add_creature(uint256,address)", +"ba5129b9": "ethRateChanger()", +"ba515481": "maturity_refund(address[],address,uint256[])", +"ba51a6df": "changeRequirement(uint256)", +"ba51b1b4": "setTokenSymbol(string)", +"ba5233b2": "setPartnerQuota(address,uint256)", +"ba52688d": "approveCycle(bool)", +"ba53d9f3": "getSpartansOnTheBattlefield(address)", +"ba554374": "updateTranchRate(uint256,uint256)", +"ba5595d3": "numTokensAuctioned()", +"ba5673c3": "getChildrenLength(bytes32)", +"ba56763e": "getBidInfo(uint64)", +"ba56f6ee": "god()", +"ba57225d": "LogCrowdsaleEnd(bool)", +"ba575a39": "KOREKCHAIN()", +"ba59a75e": "bn128_map_to_G1(bytes32)", +"ba59f784": "ChessLotto()", +"ba5a2d33": "exitPool(address)", +"ba5abaf8": "startFightB(uint256,uint256,bytes4)", +"ba5b0e95": "CPCEIcoDeposit()", +"ba5bea09": "addPendingPayment(address,uint256)", +"ba5c3a9d": "distributionList(uint256)", +"ba5c5d93": "address_book()", +"ba5c9bd6": "processReinvest(address,uint256,uint256,uint256)", +"ba5cb281": "uint32At(bytes,uint256)", +"ba5cb999": "RealTotalSupply()", +"ba5e286b": "getShipProductCount()", +"ba5eceb6": "borrowerBalance(address)", +"ba5f3e46": "getPlayerBetData(address)", +"ba61021f": "calcBonus()", +"ba612493": "getCurrentPassportLogicVersion()", +"ba61810c": "startNextPhase()", +"ba61a960": "Launched()", +"ba61ee09": "myRefBonus()", +"ba622884": "isManufacturerAddress()", +"ba622ddc": "getPlayerAnimals(address)", +"ba625fe6": "WineCoin()", +"ba629113": "contract12function2()", +"ba6361fb": "payme()", +"ba639d5a": "supplyRound1()", +"ba63abd6": "getPInvestedSumByRound(uint256,address)", +"ba63defb": "etherToSendJackpot()", +"ba63e25a": "canBeWhitelisted(uint256,bytes32)", +"ba6489e5": "getAccountReferrer(address)", +"ba65fa25": "getMerchantPublicKeyByAdmin(address)", +"ba66d7a6": "MDKICO(uint256,uint256,uint256,address,address)", +"ba6763ce": "withdrawBalanceFromStorageContract()", +"ba68693f": "PinZhiCoin()", +"ba693c86": "addsmartContractAdress(address)", +"ba69fcaa": "deleteStringValue(bytes32)", +"ba6a7e27": "AOABANK()", +"ba6afc50": "getIncentivesPool()", +"ba6b285a": "neuroChainAddresses(address)", +"ba6b5f96": "getChild(address,uint256,address,uint256)", +"ba6bbe55": "getPublicSaleTokensAvailable()", +"ba6c6490": "unlockTeamTokensTime()", +"ba6ca603": "ALDToken(uint256,string,uint8,string)", +"ba6cc6c3": "open(bytes32,address,uint32)", +"ba6dc506": "throwSlammerEvent(bytes32,address,address,uint256[10])", +"ba6f30e4": "sellCenturion(uint256,uint256)", +"ba6f4ab0": "burnCarbonDollar(address,uint256)", +"ba6ff8ad": "RTokenBase(uint256,string,string,uint8)", +"ba70d049": "DonateAdded(address,address,uint256)", +"ba70d54a": "ACTIVE_STATUS()", +"ba71c7f5": "setPricesManually(string)", +"ba723f99": "stopBid()", +"ba723fe2": "getRequestHash(bytes,bytes,uint256)", +"ba72cc36": "teamLock()", +"ba730e53": "getSellPrice(uint256)", +"ba7314ae": "AncestorHellNotes()", +"ba7325be": "indexOf(string,string,uint256)", +"ba736a99": "fetchOrderByIdWithWithPayer(string,address)", +"ba73737d": "AndiosCoin(uint256,string,uint8,string)", +"ba7435d9": "knightEquity()", +"ba75bbd8": "front()", +"ba75d0de": "minimumHydroStakeDelegatedUser()", +"ba76000e": "Add_Patient(uint256,uint256,string,string,string)", +"ba7607bf": "LogBidAccepted(bytes32,address,bytes32,address,bytes32,uint256)", +"ba76938b": "freezeDeposit(uint256)", +"ba76bfb7": "checkWithdrawalAvailable(address)", +"ba76e19b": "EthereumPrivateToken()", +"ba770154": "getUserPictureByUsername(string)", +"ba7705aa": "setIPFS(address,string,string)", +"ba773a70": "icoPrice_()", +"ba77ddc9": "PresaleFinalized(uint256)", +"ba780759": "EtherSportCrowdsale(uint256,uint256,address,address,address)", +"ba78a98a": "timelockEndTime()", +"ba78c773": "declineBid(string,uint64)", +"ba7a8149": "lockEtherPay()", +"ba7b37d4": "updateBalance(uint256)", +"ba7b86b9": "KhuuKoin()", +"ba7badeb": "nextVersion(address,bytes32)", +"ba7bd2aa": "withdrawTokens(uint256,uint256)", +"ba7bde55": "totalSupplyShares()", +"ba7bf7ff": "addcoinfee()", +"ba7c4af8": "revokeMyId(bytes32)", +"ba7cc631": "createKingdom(string,string,uint256,address,bool)", +"ba7ce849": "drawPool(uint256)", +"ba7d0b3c": "ETE()", +"ba7d619c": "returnTokensFromHoldAdditionalAddress(uint256)", +"ba7da724": "devVUPDestination()", +"ba7dc45f": "_removeOperation(bytes32)", +"ba7e424d": "isIcoEnded()", +"ba7e7cab": "getApprovalCount(uint256)", +"ba7ed2ff": "setMinInvestment(uint256)", +"ba7efcdd": "investmentLimit()", +"ba7fb1df": "getAddressToken()", +"ba8029bb": "setStartSale(uint256)", +"ba809390": "AccountReaderAdded(address,address)", +"ba80d787": "contributor()", +"ba80e058": "landingDiscount_ppc()", +"ba8118b1": "goNextRound()", +"ba81522f": "maxBlockDrift()", +"ba816496": "last50plusblocknr()", +"ba818f8d": "affiliateFee()", +"ba827243": "YangMaoZhuangYuan(uint256,string,uint8,string)", +"ba82bde2": "bindusertop(address,address)", +"ba82c897": "updateRewardToken(address,uint256)", +"ba82f55d": "ethsoccer48()", +"ba838b01": "EdCoinToken()", +"ba83c970": "closeSell()", +"ba83d63d": "getBidFreelancer(uint256)", +"ba847552": "isAddrCanCallServer(string,address)", +"ba84cb3f": "MobileApp()", +"ba85571c": "getPlayerInfoByAddress(address,uint256)", +"ba8661a2": "TimestampScheduler(address)", +"ba873f60": "setAssociation(address,bytes32,bytes32)", +"ba8747b3": "addReport(uint256,string,string)", +"ba874999": "getGameEngineAddress()", +"ba87ebfa": "IMDEXsetOwner(address)", +"ba87fdd4": "getSenderCities(address)", +"ba885446": "tokensPerAllocation()", +"ba88d537": "_getSenderStatus(uint256)", +"ba8a141f": "EnterCoin()", +"ba8a86c2": "whiteListedAddressPresale(address)", +"ba8ad39e": "grantToAllowBlocking(address,bool)", +"ba8af655": "returnAmountPledged(uint256,address)", +"ba8b7152": "BlockOfLifeToken()", +"ba8b9712": "adminRefundTokens(address,uint256)", +"ba8bb22a": "LIRAX(uint256)", +"ba8c0c9d": "getPropertyLastUpdater(uint16)", +"ba8c6980": "hasGrantAccess(address)", +"ba8cded7": "Bet(uint256)", +"ba8d045a": "tobuy(uint256,address,uint256)", +"ba8ef244": "getEvaluation(uint64)", +"ba8fb567": "startPhase2(uint256)", +"ba904eed": "removeRegistrar(address)", +"ba9072ea": "crownedTime()", +"ba907b7e": "testFailCreateWithParentsSameItemId()", +"ba90d553": "getContractsByType(uint256)", +"ba90f022": "modifyRecord(uint256,string,string,string,bytes32,int64)", +"ba9130a6": "execCustom(address,bytes,uint256,uint256)", +"ba91d87b": "mintForWorker(address,uint256)", +"ba922e04": "Karma(uint256)", +"ba92d382": "factory_address()", +"ba9316b7": "getExp(uint256,uint256)", +"ba9334a0": "testCombinators()", +"ba9398e9": "publicSaleEtherRaised()", +"ba93d5e5": "setBankrollAddress(address)", +"ba93d980": "swapOpen()", +"ba941154": "newTapProposalFromCompany(uint256)", +"ba944118": "TMXGlobalToken(uint256,uint256,string,string,uint8)", +"ba953bc8": "KanadeCoin()", +"ba95b235": "sayNo()", +"ba95d63a": "leftSharePriceRateOfIncrease()", +"ba95df98": "releaseUserPrivateBonusTokens(address,uint256,address)", +"ba967a84": "addInit(address,address,address,address,uint256,string)", +"ba976ae5": "marketToken2018()", +"ba982c41": "tokensUnsold()", +"ba996aca": "getPlayerLevel(uint256)", +"ba99d1a6": "RATE_DAY_0()", +"ba9a061a": "START()", +"ba9a4d6e": "hasAddressVotedInBallot(uint32,address)", +"ba9a8b37": "convertibleTokenCount()", +"ba9a91a5": "SALT()", +"ba9a9e03": "StorageEnabled()", +"ba9ac37f": "mul(uint16,uint16)", +"ba9bb827": "CONTRIBUTION_MIN()", +"ba9bf757": "getPlatformBalance()", +"ba9c4637": "getMyPoints()", +"ba9d0638": "receivedCount()", +"ba9d407a": "GetAddressByName(bytes32)", +"ba9d4c09": "devuelveAppaddr(bytes32)", +"ba9e0907": "XJF()", +"ba9e9a86": "binarySearchForChallenge(uint256,uint256,bytes,uint256,bytes32[])", +"ba9ea413": "purchaseCostFiat(uint256)", +"baa0181d": "batchCancelOrders(address[5][],uint256[6][],uint256[])", +"baa0b806": "content(uint256)", +"baa23ac1": "SpecialDrawingRight()", +"baa24fce": "rightVotes()", +"baa28752": "listCenturion(uint256)", +"baa290d9": "DANSToken(address,address,uint256,uint256,uint256,address,uint256,address,uint256,address,uint256)", +"baa2e587": "confirmReception()", +"baa2edaf": "tokensDataProviders()", +"baa2ff01": "get_blockhash(uint256)", +"baa30f7b": "jackpotCount()", +"baa32a94": "NiuYanToken(uint256,string,uint8,string)", +"baa371d0": "DigiPulse()", +"baa3f7ee": "claimedOf(address)", +"baa3fc48": "calculate_proportional_reward(uint256,uint256,uint256)", +"baa40cd4": "mintForPrivateFiat(address,uint256)", +"baa40e5c": "getVote(string)", +"baa416b6": "CorsariumCore(address[],uint256[])", +"baa46bdd": "_createDistrict(uint256,uint256,uint256,uint256)", +"baa47694": "submitBlock(bytes32)", +"baa5eb5c": "isDspRegistered(address)", +"baa61df0": "tokenContractClaimTokens(address)", +"baa6ab81": "priceByPeriod()", +"baa70a8b": "LBCoinJ(string,string,uint256)", +"baa79dd3": "ethOdinRate2()", +"baa7d1f3": "MULTISIG_ETH()", +"baa83568": "requestColuLocalNetworkOwnershipTransfer(address)", +"baa8529c": "give(bytes32,address)", +"baa90366": "isThereACoinAtCoordinates(uint16,uint16)", +"baa92a05": "returnsenderbalance()", +"baa93b56": "crownIfFreeze(address)", +"baa9a8a9": "EtherbotsCore()", +"baa9da15": "soldTotal()", +"baa9e531": "totalTokensBought()", +"baaa3eef": "setDistValues(string,string,string,string,string)", +"baaa8b9a": "actualGotTokens(address)", +"baaac593": "LogWaterTree(uint256,address,uint256)", +"baab7a3a": "isSuccessDoneState()", +"baab89d5": "getLockedStructAmount(address,address,uint256)", +"baac2178": "MNLTToken()", +"baac274d": "getCustomerBalance(address)", +"baac4316": "sendTokensToMe(address,uint256)", +"baac5300": "createTokenProxy(address)", +"baad0828": "changeControllerInBntyTokenContract(address)", +"baad1532": "getMatchServer(uint256)", +"baad6c2e": "setInfoTier(string)", +"baadbca0": "newTickerQuery(string,bytes32)", +"baae172c": "setRefreshLockBalance(address)", +"baaee21f": "getLastN(bytes1,uint8)", +"baaeecb0": "getAllApproval()", +"baaefe5b": "priceInc()", +"baaf2d4f": "transferOtherERC20Token(address,uint256)", +"baaf4eef": "RESERVES_HOLDER()", +"bab1d921": "closeCurrentStage()", +"bab25514": "GRUToken()", +"bab2b5e9": "percent3()", +"bab2f2b5": "containsOnlyAlphaNumerics(string)", +"bab2f552": "currentCycle()", +"bab41142": "takerApproves(uint256)", +"bab41293": "getDataColla_001_002(string)", +"bab42b54": "test_campaignRules()", +"bab4e3b1": "getOwnedToken(address,uint256)", +"bab54f69": "_isExcluded(uint256)", +"bab5714c": "sendTeamSupplyToken(address,uint256)", +"bab58ec9": "periodITO_tokenPriceUSD()", +"bab5b64e": "spenderAddress()", +"bab5e2af": "LogBTHFoundationWalletChanged(address)", +"bab6d101": "checkClaimTokenByIndex(uint256)", +"bab6f9bf": "generateRevokeStakeForDelegationSchemaHash(uint256,uint256)", +"bab7b237": "totalRelease()", +"bab86ea8": "test(string,string)", +"bab8bd04": "clearAllRequests()", +"bab8fe40": "claimableTokens()", +"bab92a29": "get_owner_planets(uint256)", +"bab94366": "AppUpdated(address,string,address,uint256,bool)", +"bab95dba": "_getFeeAndNetAmount(uint256)", +"bab99890": "CPollo()", +"bab9c00c": "SmartSignature()", +"bab9fc63": "testFailCreateWithParentParentNotInUse()", +"baba4811": "recieveFunds()", +"babb019d": "enact_liquidation_less(address,uint256,uint256)", +"babb3e0b": "updateEthRate(string,string)", +"babbb78d": "teamTokenWallet()", +"babcc04c": "getLogsNum()", +"babcc539": "isAllowed(address)", +"babd222f": "addressToLarePurchased(address)", +"babd7012": "activeSupply()", +"babddb4c": "FundReturn(address,uint256,bool)", +"babe9394": "EasyMineToken(address,address,address,address)", +"babf2b2d": "EscrowMyEtherEntityDB()", +"babf5e37": "changeFree(uint256)", +"bac02609": "buyEarlyWhitelist(address)", +"bac03cd7": "totalContractBalance()", +"bac0b029": "BifreeToken()", +"bac0b276": "allocate(address,uint256,uint8)", +"bac127b9": "SecondAddressBalance()", +"bac15203": "unPauseContract()", +"bac18f9a": "handToBitmap(uint32)", +"bac1e2e0": "testBitsAndSuccess()", +"bac1e9f6": "getChannelSize(address,uint256)", +"bac21a22": "totalSupplyLimit()", +"bac37239": "addMarketMakerAddress(address,address)", +"bac506e0": "rf()", +"bac55edd": "setDnsDomains(string,string,string)", +"bac6068c": "inject(address,uint128)", +"bac6241f": "LookRevToken(address,uint256)", +"bac74b4f": "ISLABCoin()", +"bac756e1": "PresaleToken(uint256,uint256)", +"bac79651": "setTokens(address,uint256)", +"bac7bb9f": "checkaddress()", +"bac7c252": "BTC10kon54()", +"bac97647": "uncleSafeNr()", +"bac9dbab": "ROLE_COO()", +"bacbe2da": "cancelVote(uint256)", +"bacc2753": "vestTo(address,uint256)", +"bacc2c42": "participate(uint256,uint256,uint256,uint256,uint256,uint256)", +"bacc58d7": "backManusOwner()", +"baccc92b": "RegulatorIfc(address)", +"bacd2a90": "mallocBudget(address,uint256)", +"bacd2e97": "executedCount()", +"bacd70b7": "callSomeFunctionViaInner3()", +"bacd8d88": "soldPercent()", +"bace4cf6": "Distribution(uint16,uint256,address)", +"bacef685": "createTokens(uint32,address)", +"bacf3f65": "secondPeriodOfICO()", +"bacf5f84": "_addBaseStats(uint256,uint8[8])", +"bacfddbc": "isDepositAddress(address)", +"bad09457": "test3(address[5],uint256[5],uint8,bytes32,bytes32)", +"bad16031": "isBlackjack()", +"bad19ead": "copyToAllUnits(uint256,uint256,uint256,uint256,uint256)", +"bad1f08f": "open(uint256,uint32,uint256)", +"bad21d65": "startInstantInterface(address,address,uint256,uint256,uint256,address,uint256,address,uint256)", +"bad2d6d2": "removeBlacklist(address,address)", +"bad4d623": "setAltDeposit(uint256)", +"bad568b1": "allowanceBcoupons(address,address)", +"bad69502": "getProviderRateHistory(uint256,uint256)", +"bad6b379": "changeCUSEaddress(address)", +"bad751bc": "createPeerReviewContract(address,bytes)", +"bad7726c": "checkDividendPaymentAvailable()", +"bad7d46a": "CreateOffer(uint8)", +"bad84416": "eligibleVotes(address)", +"bad845e6": "deleteProductInternal(bytes32)", +"bad84c9e": "getNumTicks()", +"bad9643b": "balance_wirthdraw()", +"badaba27": "packTable(uint256)", +"badae9b4": "addArgumentToRequestUint(int256,uint256,bytes32,uint256)", +"badb2e5a": "UpgradeRigETH(uint8,uint256)", +"badb97ff": "adminBurn(uint256)", +"badbaa3c": "setCallData()", +"badbbf34": "RBACWithAdmin()", +"badc9a52": "adminChanged(address,address)", +"badca131": "kill_and_withdraw(address)", +"badcf391": "sendMail(bytes16,bool)", +"badcfbcf": "withdrawSnowflakeBalance(address,uint256)", +"baddee6f": "listMultipleItems(uint256[],uint256,address)", +"bade1c54": "proposeReparameterization(string,uint256)", +"bade1ef9": "Birth(address,uint256,uint256,uint256)", +"bade6033": "propose(bytes,uint256)", +"bade777c": "Marked(address,address,address,address,uint256,uint256,bytes32)", +"badec5b4": "HK168coin()", +"badf3de9": "durationForBetAmount(uint256)", +"badf8b37": "TwoFactorAuth(string,string)", +"badfa573": "setAllowTransferTimestamp(uint256)", +"badfedf2": "genEthsRec(uint256,uint256)", +"bae07416": "canBeValidated(uint256)", +"bae0c536": "addSaleAgent(address)", +"bae118f4": "setHouseInfo(bytes32,uint256,string,bytes32)", +"bae18880": "getReceipt(address,uint256)", +"bae18ac3": "setUpgradeFee(uint256)", +"bae1c1ac": "doSendWithSignature(address,uint256,uint256,bytes,uint256,bytes,bool)", +"bae1cc74": "multiSubWithdraw(address[])", +"bae2718f": "WithNoArgumentConstructor()", +"bae2b6ab": "setLedgers(uint256)", +"bae2ddb5": "XBHX()", +"bae37857": "getEndTimeOfSession(uint256,uint256[],uint256)", +"bae3791e": "weisHardCap()", +"bae3c066": "sendInternally(uint256,uint256)", +"bae3c27f": "weiLimit()", +"bae4f466": "roundKeys()", +"bae5e693": "partnersAllocation()", +"bae5f9dd": "takerAffiliateFee()", +"bae61714": "setICOWeek3Bonus(uint256)", +"bae667bc": "tokenOf(bytes32)", +"bae6c2ad": "queueSize()", +"bae6d62b": "manualOverride()", +"bae70892": "setMyPubKey(bytes32,bytes32,bytes32,bytes32,bytes32)", +"bae72565": "readAddress(address,uint256)", +"bae728b1": "setUnholdDate(uint256)", +"bae78d7b": "getEntry(uint256)", +"bae804a7": "transferFromSender(address,uint256)", +"bae8d888": "createArtefact(uint256)", +"bae944ba": "globalUnlockTime()", +"bae971e4": "getWithdrawEtherAmountValue()", +"bae99efc": "ICO_MAX_CAP()", +"baea0431": "getMsgDataAfter()", +"baea3a21": "addToWhitelistInternal(address)", +"baeb0718": "checkin()", +"baeb8cad": "deleteGroup(address,address)", +"baeb91ae": "invest(uint128)", +"baebcaf0": "getApp(address,uint256)", +"baec1ced": "depositPresaleWithBonus(address,uint256,uint256)", +"baec25ee": "ZYHToken()", +"baecd693": "sendTokensAfterBuy(address,uint256,uint256)", +"baed8bb1": "getAddressValues(bytes32)", +"baee193d": "changeCountryLimit(uint256,uint256)", +"baeeddfc": "Ublasti(uint256,string,string)", +"baef73e9": "expiryOf(uint256)", +"baf00f76": "removeAllSubUsers()", +"baf03586": "calculateBaseGet(uint256,uint256,bool,uint256)", +"baf05a87": "hodl_interval()", +"baf11cab": "isCommitted(uint256,address)", +"baf1256f": "withdrawToPlayer(address)", +"baf30051": "token_issued()", +"baf38352": "buy_for(address)", +"baf3a4d4": "distDivRate()", +"baf3d262": "Tickets_Sold(string,uint256)", +"baf3ef13": "disableNode()", +"baf44453": "FundAccount(address,address,address)", +"baf4960d": "createPlanet(uint256,address,uint256,uint256,uint256,uint256,uint256)", +"baf4ec53": "sumICOStage3()", +"baf4f6d1": "_endContestIfNeededStalemate()", +"baf539ee": "changeGasLimit(uint256)", +"baf5fbff": "PreIcobonusEnds()", +"baf652fe": "bonusThresholdWei()", +"baf6f9ca": "saleis(bool)", +"baf6fd32": "setintertoken(address)", +"baf73c0f": "holdingsOf_BULL(address)", +"baf79eb4": "removeDealInternal(bytes16)", +"baf8809b": "releaseTimeLock(address)", +"baf8c622": "_SUTokenContract()", +"baf9b369": "post(bytes)", +"baf9c5a2": "initialSupplyPrivateSale()", +"baf9d07b": "addAuthorization(address,address)", +"baf9d0cf": "getRoundAwardTicketNum(uint256)", +"bafa090d": "breakup(address,uint256)", +"bafa9c9d": "FighterUpdated(uint256)", +"bafb8e83": "marketSupply()", +"bafc1437": "getPurchased(uint256)", +"bafc7fe9": "zero_fee_transaction(address,address,uint256,uint256)", +"bafcea6f": "dataSourceGetYellowCards()", +"bafd244f": "setAmbassadorAddress(address)", +"bafdaf5e": "_getTargetBlock(uint256)", +"bafdebf3": "getServerAddress(string)", +"bafe648d": "BerithCoin(uint256)", +"bafedcaa": "lastRewardAmount()", +"baff4609": "lockTokenForNode(uint256,uint256,uint256)", +"baffa903": "getStartPrice()", +"baffed2a": "disallowWrite(uint256,address)", +"bb004abc": "reserveManager()", +"bb005d4f": "setPlayerResearch(address,uint256)", +"bb007db9": "getSalaryTokenCount(address,address)", +"bb00c8f9": "ownerMintAmount()", +"bb00faca": "bonus02()", +"bb00fc55": "bookEarnings()", +"bb013206": "addNewCertificate(uint256,bytes32,bytes32)", +"bb0165b1": "setContractAddress(uint256,address)", +"bb01aa39": "unreserve(uint32)", +"bb01fb1f": "Issue(uint64,address,uint256)", +"bb043d53": "MinimalPayValue()", +"bb053484": "getInitializeFeePerEthInAttoethValue()", +"bb056781": "purchaseGas(address,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"bb057c5e": "proposedImplementation()", +"bb05ca52": "JadeCoin()", +"bb061fb5": "addWhite(uint256,uint256,uint256,bool)", +"bb07576d": "voteToUpdatePrenup()", +"bb083c2b": "substractFee(uint256,uint256)", +"bb08b247": "showAuction(string)", +"bb08c6c3": "o_desafiante(bytes14)", +"bb0936f7": "first_bonus_amount()", +"bb09adbb": "privGoal()", +"bb0a420a": "user(address,address)", +"bb0a64b6": "batchTransfer(address[],uint256[],address)", +"bb0bcbff": "AddPoolMember(address,string)", +"bb0bef19": "validateFile(address,uint256,bytes,bool,bool)", +"bb0c08b6": "getDebitNonce(bytes32)", +"bb0c8298": "minimumAmount()", +"bb0c8893": "claimUnrelatedTokens(address,address)", +"bb0ce7d3": "TotalHoldersAmount()", +"bb0d6fb6": "noCount(uint256)", +"bb0d7f9a": "listTCC()", +"bb0db551": "add_32(uint32,uint32)", +"bb0e01fd": "isError(uint8)", +"bb102aea": "totalSupplyCap()", +"bb10b2f1": "PRE_SALE_BONUS_PER_CENT()", +"bb119f6e": "productInfo(uint256)", +"bb11ed7e": "rescueTokensInMultiplePolls(uint256[])", +"bb128575": "StopSell()", +"bb13245f": "decimalsMultiplier()", +"bb133331": "trusteeContract()", +"bb1488d8": "_newAuction(uint256,uint256,uint256,uint256)", +"bb1583fc": "isBatched()", +"bb158dd5": "addToTokenLocked(address[])", +"bb15ac8e": "readBool(bytes32)", +"bb1630f2": "getAllSigs()", +"bb169da5": "Diploma_landing_page()", +"bb1757cf": "claim(address,bytes)", +"bb17a938": "toRlp(uint256)", +"bb17c8cc": "round2StartTime()", +"bb17e050": "Nullify(address,address,address,address)", +"bb18705c": "_buildSettleId(bytes,bytes)", +"bb1953fe": "updateSeed()", +"bb1a473b": "VOLUME_25()", +"bb1a5aad": "flipFinalizedSwitchTo(bool)", +"bb1ad687": "gateKey()", +"bb1adf9b": "DURATION_BEFORE_RESTORE_UNSOLD()", +"bb1af82b": "Test3()", +"bb1b21ed": "RefCommission(uint256,uint256)", +"bb1b99ce": "isCurrentUserAdministrator()", +"bb1c9351": "redeemNativeToken(bytes32,address)", +"bb1cc065": "buy_lovelock_withLOV(bytes32,string,string,string,uint256)", +"bb1d1cf9": "tier_rate_3()", +"bb1d45fc": "setOtherManager(address,uint8)", +"bb1d7ffa": "weddingdate()", +"bb1dfeca": "buildId3(address,uint256)", +"bb1e54bc": "TokenCrowdsale(address)", +"bb1eeb59": "totalWeiAmountSale2()", +"bb1f602e": "FailingDeployment()", +"bb205c84": "getDownVoteCount(bytes12,bytes12)", +"bb210372": "getPresale(uint256)", +"bb221cc8": "Hadescoin(address)", +"bb221e4b": "FuelToken()", +"bb22d75c": "PROMOTION_PROGRAM()", +"bb23e3a9": "arr(uint256,uint256,uint256)", +"bb23ef74": "setOwnerTestValue(uint8)", +"bb2408e6": "PERCENT_DELIMITER()", +"bb245283": "getHatchDurationMultiByGeneration()", +"bb24f0dc": "operationsLength()", +"bb2559ca": "initialTokenBalanceFetched()", +"bb256f68": "VaultCountPerProcess()", +"bb25b143": "DrawReadyToPayout(uint32,uint8,uint8,uint8,uint8,bytes32)", +"bb25bd15": "addWin(address,uint256)", +"bb25fd7f": "SODIUMTOKEN()", +"bb262080": "JaroSleep(address,uint256)", +"bb26d9d1": "requestCosign(address,uint256,bytes,bytes)", +"bb27e19e": "getlen(bytes32,bytes32)", +"bb280cba": "addBackers(address,uint256,uint256)", +"bb287679": "mainFabricAddress()", +"bb28c3f2": "setNonce(string,uint256)", +"bb29998e": "test(address)", +"bb2a51d1": "setSecurityGuard(address)", +"bb2a7d0c": "addVestingSchedule(address,uint256[],uint256[])", +"bb2aebe3": "createAssetPack(bytes32,string,uint256[],bytes32[],uint256)", +"bb2bded0": "trinityDataContract()", +"bb2c5ad7": "hasRandom()", +"bb2ce2f5": "DeedClosed()", +"bb2ced1b": "previousFounders()", +"bb2ced25": "startPoll(address,address,bytes32,bytes32,uint256,uint256)", +"bb2d713e": "sells(uint256)", +"bb2dc863": "getChildBlock(uint256)", +"bb2de15a": "TicketsBought(uint8,address,uint16[])", +"bb2e6904": "hopeCoin(uint256,string,string)", +"bb2eb4d2": "ONE_PERCENT()", +"bb2eb982": "impl_rewardsFactor()", +"bb2ebf83": "CostChip(address,uint32)", +"bb2f159b": "read_i32()", +"bb2f3228": "EOCSToken(uint256,string,string)", +"bb305ef2": "getBondOwner(uint256)", +"bb3084db": "ICOStarted(uint256)", +"bb30d796": "releaseAllocation(address)", +"bb316f06": "contributeForAddress(address)", +"bb32b6f8": "receivedCWC(address,uint256)", +"bb33072f": "refundToInvestor()", +"bb33d729": "unpauseSale()", +"bb33e730": "MoveTokens(address,address,uint256,string)", +"bb340909": "initPecul()", +"bb34534c": "addressOf(bytes32)", +"bb34e57c": "ROLE_BURN()", +"bb35783b": "move(address,address,uint256)", +"bb35b29c": "MintIND(address,address,uint256)", +"bb35f7ee": "rocketTravelTimeByResource(uint256,uint256)", +"bb3611e7": "BonusWhiteListCrowdsale(uint256)", +"bb36a233": "customtransfer(address,uint256)", +"bb36e5d0": "returnExternalPayments(address,bool,bool)", +"bb36ef7b": "addManyToKyc(address[])", +"bb370bad": "orderWasValid(uint256,uint256,uint256,uint256)", +"bb371fdd": "setMaxDeposit(uint256)", +"bb37a162": "payAdvertisers(bytes32)", +"bb389952": "unlockFounder()", +"bb38be10": "notifyCharge()", +"bb397161": "createNonRepeatableVpfFactory(string,bytes32,uint256,int256[])", +"bb39a960": "trade(address,uint256,address,uint256)", +"bb39c85f": "getTotalOwedTokenRepaidToLender(bytes32)", +"bb39ea60": "MIN_ACCEPT_ETHER()", +"bb3a304f": "setFundingLock(bool,address)", +"bb3a77ae": "ROLE_ARBITER()", +"bb3b2a35": "withdraw_4()", +"bb3b8dca": "getCertificateHash(bytes)", +"bb3ce7fe": "DepositHolder()", +"bb3cf577": "AddressListed(address,uint256)", +"bb3d13c5": "addValidation(address,bytes32)", +"bb3d5af2": "GetClaimCount()", +"bb3d9326": "YTC()", +"bb3e409a": "buyEggs(uint256,address)", +"bb3e443b": "FDataToken()", +"bb3e5b0a": "setPI_edit_34(string)", +"bb3f0390": "min_inv()", +"bb3f5330": "revertFunds()", +"bb3f5b7d": "totalTransfer()", +"bb3ff0bd": "TITSCOIN()", +"bb41f421": "payerPercent()", +"bb424892": "minimumCost()", +"bb427d8a": "enterBet()", +"bb42de92": "getSubscriberContentCount()", +"bb43a11e": "getHashOf(address)", +"bb440715": "getPoolBonusExpertFactor(uint256)", +"bb440b82": "funComputeRoundPrice()", +"bb445084": "getRDividends(address)", +"bb449782": "setCommunityAccount(address)", +"bb44e08d": "updateOrderNumber(uint256)", +"bb452ea7": "objectDoublet()", +"bb4534f1": "addrecruit(address,address,address,address)", +"bb453d5a": "CBCToken()", +"bb45d09d": "getCurrGameInfo()", +"bb471d73": "getRealAmountBonus(uint256,uint256,uint256)", +"bb472219": "resetGame()", +"bb472c93": "bet2deltaOf(uint256)", +"bb476637": "deliverTokensAdmin(address,uint256)", +"bb48156a": "preSaleRound()", +"bb4872de": "stoppable()", +"bb48d190": "upgradeToPremium(bytes32)", +"bb4a7f18": "getAllBusinessOwners()", +"bb4b236a": "CSToken(uint256,string,uint8,string)", +"bb4b7bd0": "listForSale(uint256,bytes32)", +"bb4c006c": "checkDeletable(address)", +"bb4c9f0b": "multiSend(address[],uint256[])", +"bb4cbd0b": "gracePeriodStopBlock()", +"bb4d0cb5": "FSC3()", +"bb4d4b2f": "addVestingAccount(address,uint256,uint256)", +"bb4d7cd1": "tag(uint256,string)", +"bb4d9e22": "WithBonusPeriods()", +"bb4e3f4d": "add(uint8,uint8)", +"bb502bac": "EthbetOraclize(address,address,uint256)", +"bb502dd9": "checkExchangeSupported(bytes32)", +"bb504317": "divest(address,uint256)", +"bb50c67a": "crowdsaleRunning()", +"bb510a77": "createChannel(address,uint256)", +"bb5166e7": "getPaymentType(address,uint256)", +"bb5196d6": "setParams(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"bb51de39": "IDEAL()", +"bb51f32d": "withdrawTeam()", +"bb52ca2c": "getOrgClaimsCount(address)", +"bb537ced": "matchesDelay()", +"bb540231": "totalFartsReceived()", +"bb542ef0": "setOwnerWallet(address)", +"bb5530c4": "updateCampaign(uint256,string,string,string,address,address,address,string)", +"bb56a683": "guaranteedBuyersBought()", +"bb572896": "consolationRewardsRequiredFaith()", +"bb57349c": "handleSaleClaimCallback(address,uint256)", +"bb575333": "sessionEndTime()", +"bb582db6": "mgmtBodyAddress()", +"bb584a3a": "EventCancelAuction(uint256,address)", +"bb59b48c": "payableWeiReceived()", +"bb59d68c": "DariaRotkoToken()", +"bb5a1149": "myReferee()", +"bb5a4f4c": "placeBet(uint256,uint256,uint256,uint8,bytes32,bytes32)", +"bb5a7ca0": "extendEventStartsTime(bytes32,uint256)", +"bb5adf14": "setProxyManagementContract(address)", +"bb5b3edc": "emergencyWithdraw(uint256,bool)", +"bb5b5203": "toggleActions()", +"bb5b586b": "usdPerKEther()", +"bb5b6aa4": "myInner2()", +"bb5bf0c3": "WisdomWorldStandardToken(uint256,string,uint8,string)", +"bb5c3821": "total_ICO_supply()", +"bb5d3bcb": "tokensPromotion()", +"bb5d40eb": "isValid()", +"bb5d69a0": "setEns(string,address)", +"bb5ddb0f": "sendMessage(address,bytes)", +"bb5e0696": "LongTermReserveMinted(address,address,uint256,uint256)", +"bb5e3d3b": "doThing(string)", +"bb5e5875": "InseeCoin()", +"bb5e78a4": "HasSigningPermission(address)", +"bb5e9dec": "get30Artworks(uint16)", +"bb5e9eab": "thirdWeek()", +"bb5f4629": "orders(address,bytes32)", +"bb5f747b": "isWhitelistAdmin(address)", +"bb5f95fe": "LSECoin()", +"bb602e80": "Volkscoin()", +"bb6198dd": "getOrCacheTargetReporterGasCostsWasCalled()", +"bb632244": "btcs()", +"bb642f65": "seedCreatedCount()", +"bb64c09b": "KIMEX(address,address)", +"bb64c79e": "SearchTimeBlocknumber(string)", +"bb64e420": "getTransactionByTransactionId(uint256)", +"bb6534a9": "AMOUNT_TeamSupport()", +"bb67be65": "AFUN(address,uint256)", +"bb68b86f": "maxTokensToDistribute()", +"bb6954ce": "BourseToken()", +"bb6996a5": "swapWinner(uint256,bool,uint256)", +"bb6a0853": "GreedPit()", +"bb6a0f07": "tasksCount()", +"bb6a1427": "testThrowRestartEnforceRevisions()", +"bb6a55bd": "_mintToken(address,uint256)", +"bb6ad6ef": "withdrawTokenId(uint256)", +"bb6af3da": "limit9()", +"bb6af543": "setJackpotPayRate(uint256)", +"bb6b13a1": "tier1()", +"bb6b38bb": "setAdminAddressForComissions(address)", +"bb6b4619": "SendETC(address)", +"bb6c1178": "RentToken()", +"bb6c4827": "burnThis(uint256)", +"bb6d0132": "End_Promotion()", +"bb6d203c": "spend(address,uint256,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"bb6d8c77": "contractPoweredUp()", +"bb6e7de9": "endContract()", +"bb6f0f0f": "fetchAllCandidatesBySnapshotBlock(uint256)", +"bb6f175f": "SimpleAquaPriceOracle(uint256,uint256)", +"bb6f6c15": "protectedDenominationOfOrigin()", +"bb7029a9": "gameCollapse()", +"bb702c8e": "discard()", +"bb707059": "approveMany(address[])", +"bb70abfa": "_computePVPBeneficiaryFee(uint256)", +"bb718861": "scheduleCall(address[2],bytes4,bytes,uint8,uint16,uint256[6])", +"bb71a7c3": "makeInvestment(address,address,uint256,uint256,address)", +"bb72680c": "getHasPermission(address,string,string)", +"bb72b12d": "oldOwnerProfit()", +"bb731f98": "Excalibur()", +"bb73703f": "delRoleForUser(address,string)", +"bb7436a7": "getUsersDroidsIds()", +"bb74a5a0": "testValidationOfDoubles()", +"bb74b4e6": "TOKEN_SUPPLY_OWNER()", +"bb74dcda": "isRefunded(address,address)", +"bb750232": "allowReceiver(address)", +"bb75a2a9": "throwMe()", +"bb76d8a5": "TimeLock()", +"bb777028": "PRE_ICO_BONUS_TIME_3()", +"bb777498": "calculateId(string,string,string)", +"bb77b136": "planetAuction()", +"bb77d7d8": "ConunToken(uint256,string,uint8,string)", +"bb784140": "AragonTokenSaleMock(uint256,uint256,address,address,uint256,uint256,uint8)", +"bb7859b5": "periodThree()", +"bb785f0e": "AirDropPayBitsR1(address[])", +"bb78d159": "approveTokenControlInfo(uint256)", +"bb79428c": "RateUpdate(string,uint256,string,string)", +"bb7963e3": "hasArbiterVoted(uint256,address)", +"bb7a6dba": "vestingHasStarted()", +"bb7c15ab": "createDog(uint256,uint256)", +"bb7c62cb": "getReferrerBonusTokens()", +"bb7cb80b": "dropOffset()", +"bb7d064f": "automatedReport(uint256[])", +"bb7d4f65": "ICOFFSHORE()", +"bb7d715b": "startEthToCentsRateUpdateCycle()", +"bb7dd72d": "finishMintingStruct()", +"bb7fa4ac": "sellCeiling()", +"bb7fb08b": "getContributor(address,uint256)", +"bb7fde71": "mint(address,uint256,uint256,string)", +"bb7fe5c9": "LotteryAdmin(address)", +"bb7ff992": "requestSellforETH(uint256)", +"bb806dc9": "initial()", +"bb813a9b": "KkkTokenSale(uint256,address)", +"bb814746": "ICO_TWO()", +"bb814e9e": "versionExists(bytes32)", +"bb818ea6": "advancedNETH(uint256,string,string)", +"bb81926d": "_applyCommission(uint256)", +"bb822605": "calculateTokensTier(uint256,uint256)", +"bb826e50": "maxBlockActions()", +"bb828f11": "setChallengeRewardsPercent(uint256)", +"bb83a01f": "MyTALToken()", +"bb843219": "closingDateFunding()", +"bb84d362": "splitProfitVIP_only_Dev()", +"bb850e01": "_transferOwnershipOnBuy(address,uint256,address)", +"bb85931b": "eSTATERToken(address,address)", +"bb862588": "getCET6ScoreById(uint32)", +"bb86d8fe": "CPGPEREGRINE_FTL_SPEED()", +"bb878f2a": "ProposalAdded(uint256,uint256,string)", +"bb87b5f8": "getPersonalStatus(address)", +"bb87c1f2": "getAllowedUsers(address,uint256)", +"bb889341": "ZiberToken()", +"bb88c016": "decreaseApproval(uint256,address,uint256)", +"bb898233": "getAct()", +"bb8ab48c": "Bluechip()", +"bb8b2b47": "getUserContribution(address)", +"bb8bbc90": "ContractEFT()", +"bb8bcc46": "crowdSaleCap()", +"bb8be064": "HardwareToken()", +"bb8bedc9": "setMasternodeCandidate()", +"bb8c256a": "ecadd(uint256,uint256,uint256,uint256)", +"bb8c7ce4": "ContributionReceived(address,bool,uint256,uint256,uint256)", +"bb8c869d": "contestOver()", +"bb8c9797": "claimReward(string)", +"bb8d35ce": "medibitToken()", +"bb8dc735": "getNonceCompareOp()", +"bb8e8f46": "isExecutionAllowed()", +"bb8f0dd2": "PonziSeller()", +"bb8f712f": "generateGame(bytes32,bytes32,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"bb90617b": "toUINT112(uint256)", +"bb90cec2": "setNewRound()", +"bb911607": "percents(uint256,uint256)", +"bb912454": "setKNCPerEthRate(uint256)", +"bb913f41": "_setImplementation(address)", +"bb91f8ae": "ownerTransferAllEther()", +"bb925c19": "_selectWinner(uint256)", +"bb94392e": "getRemainingTokenForArticle(string)", +"bb945177": "produceTokens(address,uint256,uint256)", +"bb9453a5": "assetProperties(address)", +"bb95024c": "DevilsCoin()", +"bb95d992": "blockhashes(uint256)", +"bb963c8a": "transferLibOwnership(bytes,address)", +"bb969132": "getLandEstateId(uint256)", +"bb9694f3": "Eth()", +"bb971094": "finishAirdrops()", +"bb979c3d": "getHotelsByManager(address)", +"bb9932a7": "addressReserveSupply()", +"bb996043": "returnPtSafeXLarge()", +"bb99999c": "TokenLinked()", +"bb99dec1": "MoldCoin(uint256,address)", +"bb9b02a8": "evLockFund(address,uint256)", +"bb9b13d8": "getTotalInterestAmount(address)", +"bb9ba82d": "Florijn(uint256,string,string)", +"bb9c3f2b": "minWager()", +"bb9c6c3e": "verify(string)", +"bb9e1edc": "ethBaseBalance(address)", +"bb9e3547": "setTokenCost(uint256)", +"bb9e37ec": "TitleApproved(uint256)", +"bb9efd5e": "bulk(address[],uint256[])", +"bb9efdc6": "QUAK()", +"bb9fc9ed": "transferStmpsToOwnerAccount(address,uint256)", +"bba02bf8": "LyuTestToken()", +"bba04dc9": "resetExplicitState(uint32,int64,int256,uint64,int8)", +"bba231ce": "_isPast(uint256)", +"bba2e907": "prepaymentFee()", +"bba33ace": "sellerCut()", +"bba45738": "setOmegaContract(address)", +"bba46031": "LOFO()", +"bba4a876": "setStateDistributing()", +"bba4b31e": "birthBlock()", +"bba4c282": "RaiblocksClassic()", +"bba4e4c0": "AddressForReturn()", +"bba4e9bd": "getTraitCount()", +"bba52516": "tokenTimelock()", +"bba570cb": "getDatURL(string)", +"bba5ad87": "registNameXid(string,uint256)", +"bba5b24e": "buyTokens(uint8)", +"bba65ed1": "isbit(uint256,uint256)", +"bba7a1ab": "getTokenVolumebasedBonusRateForPhase1(uint256)", +"bba80923": "msub(uint128,uint128)", +"bba8a065": "insert(uint8,uint8)", +"bba8b342": "PresaleMidexToken()", +"bba90086": "updateAndTransferFrom(address,uint256,string,uint256,uint256)", +"bba91ea7": "getHomeadvIndex(uint256)", +"bba9a9f6": "zeroFeesTransfer(address,address,uint256)", +"bba9cfe1": "soldBeforeUnsoldAllocation()", +"bba9dc60": "deactivateProvider(address)", +"bba9ffce": "TransactionFailed(address,address,uint256)", +"bbaa7345": "changeDivestmentFee(uint16)", +"bbaa7a57": "getHeroAttributes(uint256)", +"bbaaa787": "claimable(address,bool)", +"bbaac1e8": "privateSaleTokensAvailable()", +"bbab867c": "setSubContractAddresses(address,address)", +"bbac78a9": "setImmutableOwnership(address)", +"bbad490f": "phase_3_bonus()", +"bbad6172": "ICOZ()", +"bbadb845": "updateProduct(uint256,string,uint256,uint256,uint256)", +"bbaefe9f": "bytePrice()", +"bbafb379": "updateBatchStartTime(uint256,uint256)", +"bbb01c9c": "privateIcoMinimumContribution()", +"bbb0c054": "foundersVestedPayment()", +"bbb0d58e": "_createNeighbors(int32,int32)", +"bbb104cf": "FucksToken9()", +"bbb1c4c0": "withdrawForFiveYear()", +"bbb21c4d": "explore(uint256,uint256)", +"bbb28a65": "contributors_count()", +"bbb37f60": "purchaseLeader(uint256)", +"bbb37f76": "registerTier2Users(address[])", +"bbb44989": "Token2GB(address)", +"bbb50b78": "vraWallet()", +"bbb655b6": "_setGasPrice(uint256)", +"bbb7259c": "CrowdsaleLimit(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"bbb73e3e": "GetBuyPrice()", +"bbb7d310": "getCompte_19()", +"bbb7eb64": "addInventories(uint256,uint256,uint256,uint16)", +"bbb896ad": "isCurrentAdmin(address)", +"bbb906f7": "TomSkin()", +"bbb92642": "BotTradesToken()", +"bbba3333": "safer_ecrecover(bytes32,uint8,bytes32,bytes32)", +"bbbc0f55": "_price_tokn_ICO_first()", +"bbbc67d0": "getParticipantDestination()", +"bbbc77dd": "intersubtoken(address,uint256)", +"bbbd2953": "startNewBattle(uint256,uint256,uint256,uint256)", +"bbbdef70": "FreezoneToken()", +"bbbe1390": "getEmployerJobsForFreelancerInvite(address,address,address)", +"bbbeac89": "MastermindAlliancePublishingGroupToken()", +"bbbf8fbd": "increaseWeiRaised(uint256)", +"bbbf9384": "BATTLE_CASUALTIES()", +"bbbfc4db": "mulsm(uint256,uint256)", +"bbbff4fb": "updateMinAmountWei(uint256)", +"bbbff571": "changeKey(string)", +"bbc001c3": "alloc()", +"bbc0c1a2": "addOrg(string,string,string)", +"bbc0ebbf": "soldForFirst()", +"bbc10d1a": "distributeeBitcoinCashSmall(address[])", +"bbc2402d": "startCrowdsale(uint256)", +"bbc2986c": "setPrice(uint16,uint256)", +"bbc2fcf5": "TOKEN_PER_ETH()", +"bbc30ad8": "getGalleryData(uint256)", +"bbc32820": "autoPay()", +"bbc39ab6": "readCharityAddress()", +"bbc42b3f": "orderToContractor(uint256)", +"bbc43d41": "pay(uint128,address,bytes1)", +"bbc49130": "Milestone_OpenTheIco(string)", +"bbc53086": "csvConcat(string,string,string,string)", +"bbc5aa5b": "maxTransferAmount(uint256)", +"bbc5d3d9": "setQuickConverter(address)", +"bbc6049d": "etherSpin()", +"bbc620a8": "setNewWithdrawCommission(uint256)", +"bbc6351e": "MMMC()", +"bbc64582": "getVotesCount(address,uint256,bytes32)", +"bbc6df30": "getRoundInfoByID(uint256)", +"bbc6eb1f": "getDefaultDonation()", +"bbc7d0b9": "marketingPool()", +"bbc7f045": "ZenCoin()", +"bbc84d1a": "voteWorth()", +"bbc878c4": "totalSeraphims()", +"bbc894a1": "GuoCoin()", +"bbc8e3cb": "disallowTransfers(address[])", +"bbc94fda": "priceProgression()", +"bbc9626b": "move_o(uint8,uint8)", +"bbc9f09a": "payPartners()", +"bbca0a89": "c_endTime()", +"bbcac1c3": "vipBrokerFee()", +"bbcb4e3a": "TokenERC20(uint32,string,string)", +"bbcbce8e": "MIN_GOLD_TO_UPGRADE()", +"bbcbe572": "d(address,address)", +"bbcbefd0": "unset()", +"bbcc69ef": "withdrawTokensByInvestors()", +"bbcc8cea": "SaiSaiToken(uint256,string,string)", +"bbcd0f02": "endorseClaim(string,string,string,address,address,string)", +"bbcd5bbe": "setTokenContract(address)", +"bbcdd139": "initExploit()", +"bbcded7a": "left73(uint256)", +"bbce2c17": "lastBurn()", +"bbce3fc2": "getLastBet()", +"bbce67ca": "lastPlayTime()", +"bbce877b": "getbuymoney(address,uint256)", +"bbced0d0": "newTopic(string)", +"bbcef175": "end_redeem_period()", +"bbd0c939": "computePrice(uint256,uint256)", +"bbd1e186": "addModule(string)", +"bbd1e1fc": "editionActive(uint256)", +"bbd2e01e": "betsLength()", +"bbd2e059": "impl_transferMSI(address,address,uint256)", +"bbd31db3": "openAll()", +"bbd32de0": "massTransfer(address[],uint256)", +"bbd3684c": "reservedteamtoken()", +"bbd37e37": "RICO()", +"bbd37ef3": "getReportingParticipant(uint256)", +"bbd39ac0": "coinBalanceOf(address)", +"bbd3b27c": "loveEvent()", +"bbd3b2ab": "inrSessions()", +"bbd418e6": "testConcatStorage4Bytes()", +"bbd425df": "bestUser()", +"bbd4271f": "setRateAndStart(uint256,uint256,uint256)", +"bbd46303": "changeStage(uint8,uint256,uint256,uint256)", +"bbd4e8c9": "numDeposits()", +"bbd4edb1": "updateRatingCustomer(string,bool)", +"bbd4f854": "buyShares(bytes32,uint8,uint256,uint256)", +"bbd5301a": "_devteam()", +"bbd53bf7": "fairsale_protectionOFF()", +"bbd5d174": "LogGame(string,string,string,string)", +"bbd6dd48": "getUserTokenInfos(uint256)", +"bbd74748": "Ethraffle_v4b()", +"bbd7a3c7": "scripts(address)", +"bbd8b602": "getOracleOutcomes(bytes,address[])", +"bbd95c32": "inArray(uint256[],uint256)", +"bbd974cc": "maxAllowedTakerBetsPerMakerBet()", +"bbd9a5fa": "grantPermission(address,string)", +"bbda1e9a": "BicycleToken()", +"bbda33d9": "getGameName()", +"bbdaebe2": "transferFromInternal(address,address,uint256)", +"bbdb31cb": "challenge(uint256,address,bool)", +"bbdb57c3": "batchTransferORSS(address[],uint256[])", +"bbdbd31e": "beneficiaryAndBirth(bytes32,int256,bytes32)", +"bbdc02db": "gameType()", +"bbdc04d8": "getDealData(bytes32)", +"bbdc7709": "startDispute()", +"bbdd366a": "DECIMALS_MULTIPLIER()", +"bbddaca3": "setReferrer(address,address)", +"bbdefbbb": "AWMVoucher()", +"bbdfbfba": "delivered()", +"bbe00af5": "beneficiars()", +"bbe18d43": "betClosed()", +"bbe2b727": "burnWholeBalance()", +"bbe42771": "closeDeed(uint256)", +"bbe430de": "available(address,address)", +"bbe437eb": "endICO_w2()", +"bbe4fd50": "getNow()", +"bbe562b0": "multiplication(uint256,uint256)", +"bbe5d9d4": "addSpace(uint256,uint256,bytes)", +"bbe61730": "get_sale_arbits_total()", +"bbe7180b": "envio_dinero()", +"bbe7221e": "orderbookContract()", +"bbe86e6a": "sendTokensToOne(address,uint256)", +"bbe8a9b6": "registerSecretBatch(bytes32[])", +"bbe93d91": "mul(int256,int256)", +"bbe9c7d6": "takePromille(uint256,uint256)", +"bbe9f99d": "isTeamMember(address)", +"bbeadcad": "invalidateVotingAtIndex(uint256)", +"bbeb5923": "joinFee_()", +"bbeb76bc": "setMultipleParticipantWhitelist(address[],bool[],uint256[])", +"bbec170f": "lockAllAccount()", +"bbec3768": "createOrder(uint128,uint16,uint256,uint8,uint256)", +"bbec9e1b": "deletePriceCredentialItemId(bytes32)", +"bbececa9": "left78(uint256)", +"bbed7177": "getContentTimestamp(uint256)", +"bbee1ab7": "forgiveIt(address)", +"bbef83cf": "getContractNameById(bytes32)", +"bbef8624": "calculateWithdrawalRequestWitnessHash(address[],uint256[])", +"bbef86b8": "PayForServiceCHL(uint256)", +"bbf02b00": "level_8_percent()", +"bbf0f065": "keepEth()", +"bbf14d67": "tier3Timestamp()", +"bbf1e6d0": "SetMiningEnable()", +"bbf2a9a3": "changeAcct3(address)", +"bbf2ee4e": "lockAddress(uint256)", +"bbf3ae00": "ccExchangeRate()", +"bbf48d6f": "convertReward()", +"bbf58f4d": "foundersVault()", +"bbf59a41": "personal_withdraw()", +"bbf646c2": "ethAddr()", +"bbf7585c": "getDistributionAt(uint256)", +"bbf76802": "purchaseApprove(address)", +"bbf78026": "SetMemberInfo(address,address,bytes32)", +"bbf89803": "addBuyer(address)", +"bbf9cd8b": "EACCoin()", +"bbfa6153": "getRegulatorLevel(address)", +"bbfad256": "updated(uint256)", +"bbfb2f7a": "getEndtime()", +"bbfbaaf8": "getWorkSecondsInProgress()", +"bbfbe6b6": "discountedMiningDifficulty(address)", +"bbfcc86b": "getHistEthRate(uint256)", +"bbfdc3c4": "logicStatic(address)", +"bbfe6b75": "externalCall(address,uint256,bytes,uint256,uint256)", +"bc0111a8": "initEnsRigistrar()", +"bc014bb9": "earlyBackers()", +"bc019eed": "getAffiliate(address)", +"bc01b767": "freezeTransfersUntil(uint256)", +"bc02844c": "totalRemaining(uint256)", +"bc032967": "getRetailerByAddress(address,address)", +"bc03a31e": "superManager(address)", +"bc04056a": "LockedDayAdded(address,uint256,uint256)", +"bc0409bf": "addTokens(bytes32,uint256)", +"bc04562d": "Reclaimer(bytes32)", +"bc04cb0f": "FEED1()", +"bc04d77b": "datasetHub()", +"bc055227": "ownerOfPiranha(uint256)", +"bc05529b": "SaleDeadline()", +"bc058968": "updateThingData(bytes32[],bytes32[],uint88)", +"bc05d087": "registerProduct(uint256,string)", +"bc063e1a": "MAX_FEE()", +"bc064863": "getRequestorAddresses()", +"bc070e83": "minimumBuyIn()", +"bc084de9": "CrowdsaleAuthorizer(address,uint256,uint256,uint256,uint256,uint256)", +"bc08afd9": "WebOfTrustToken(address,uint256)", +"bc09b5ec": "fundPreIco()", +"bc0aaff2": "setzBytes32(bytes32)", +"bc0aca61": "setFeeAccount1(address)", +"bc0ae61e": "GazeBountyCoin()", +"bc0b45fa": "OSPN()", +"bc0c868c": "stocksOf(uint256)", +"bc0cd8d3": "BOOCOIN()", +"bc0e7adb": "testThrowsDisownNotOwner()", +"bc0eaf0a": "calcAmountAt(uint256,uint256)", +"bc0f920a": "AuthSuspend(bool)", +"bc0fb9a0": "predictWinner(uint256,uint256,uint256)", +"bc1013db": "m_totalWorkerPoolCount()", +"bc101ffe": "twentyPercentWithBonus()", +"bc104f24": "compareItemSlots(uint256,uint256)", +"bc10a667": "euroRaisedICO()", +"bc10ce84": "Test(int256)", +"bc1123fe": "isUInt256ValidIn64(uint256)", +"bc112fa3": "ALC_FUNDATION_ADDRESS()", +"bc11f72c": "DABcoin()", +"bc120fe7": "whitelisted(address,address)", +"bc126ba1": "totalCents()", +"bc1292a0": "BonusChange(uint256)", +"bc129a98": "accountedTokenSales()", +"bc12d19d": "maxCapTokenPresale()", +"bc12e3d7": "getAuction(uint64)", +"bc1351ba": "has_contract_started()", +"bc13e3a6": "controller2()", +"bc14016b": "removeAllOps()", +"bc148094": "PostAdded(address)", +"bc1558be": "MANHATTANPROXY3RDAVE()", +"bc15a2dd": "BEAXY()", +"bc15be93": "firstRoundCosmosDiscount()", +"bc15e5fe": "get_next_global_audit_document(bytes32)", +"bc16272d": "requestRegistration(bytes32)", +"bc168c90": "_setIPFSHash(bytes32,string)", +"bc174df3": "ProofOfCryptoNick()", +"bc17991d": "restoreBalances(address[60],uint256[60],uint256[60])", +"bc17a0b4": "PAST()", +"bc17bd7e": "SelfDestructible(address,address)", +"bc17e669": "exiteJugador(address)", +"bc186dc9": "unlockBalanceByIndex(uint256)", +"bc18f727": "galleryFive()", +"bc197c81": "onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)", +"bc19bcbf": "submitBallotWithPk(bytes32,bytes32)", +"bc19bce5": "resolveName(string)", +"bc1a3810": "thelnwaonCoins()", +"bc1af71d": "_maxTokenSoldPreICO()", +"bc1c002c": "call_contract(address,address)", +"bc1c58d1": "contenthash(bytes32)", +"bc1c9888": "CoOwnerSet(address)", +"bc1e9ca3": "USD_CENT_PER_TOKEN()", +"bc1ea063": "LogContractOwnershipChangeInitiated(address)", +"bc1f71e1": "depositKncForFee(address,uint256)", +"bc2010cc": "feesC()", +"bc2017f3": "adjustPriceOfCountryPlayersAfterWin(uint256)", +"bc201a9d": "addSupport(address)", +"bc208057": "enter(uint256,uint256,uint256)", +"bc215cb6": "BBTokenBox()", +"bc21ce9d": "Aggregation()", +"bc22df1a": "buySpaceshipUpgrade(bytes5,uint16,uint8)", +"bc22f570": "poolsToCreate()", +"bc231983": "Temp()", +"bc24300e": "_borrowToken(address,uint256,uint256,address,address,bool,bool)", +"bc244c11": "shut(address,bytes32)", +"bc244fc9": "systemAddress(address)", +"bc24612c": "claimableAmount(address,bytes4)", +"bc246a36": "hashState(address,uint256,uint256,uint256)", +"bc24d886": "setSail(uint256,uint256,uint256,uint256,uint256,uint256)", +"bc25415c": "produce(uint64)", +"bc25a810": "lock(address,bytes32)", +"bc25e2fd": "postProof(string)", +"bc2622b4": "addKeyValue(string,string,string,uint256)", +"bc2674b1": "LogExchange(address,address,uint256)", +"bc27c7bb": "buyZoAssets(bytes32)", +"bc28cfe4": "getTicketSet(address,uint256,uint256)", +"bc28d878": "rejectProposal(uint256)", +"bc294a7c": "setCEOAddress(address)", +"bc2a4dd6": "doBalanceOf(address)", +"bc2b6913": "donateSkin(uint128[],address[],bool[],uint256[])", +"bc2bbad7": "getMyNotes(uint64,uint64)", +"bc2be1be": "getStartTime(uint256)", +"bc2c3a12": "ValidContractAdded(address,address,uint256)", +"bc2c5873": "reinvestPartial(uint256,bool)", +"bc2d10f1": "finishEthGet()", +"bc2d87f5": "Set(string,string,address)", +"bc2eb3f8": "removeNode(bytes32,bytes32)", +"bc2fe07b": "transferCardOwnership(address,uint8)", +"bc300ed3": "setBounty(address)", +"bc304e55": "serverTransfer(address,address,uint256)", +"bc308233": "autoreleaseTime()", +"bc30e4ac": "abcLotto()", +"bc30f3f8": "modifyPlatformAddr(address)", +"bc339f41": "logMarketCreated(bytes32,string,string,address,address,address,int256,int256,uint8)", +"bc33f8ef": "commonRebate()", +"bc345e11": "Updated(address,address,bytes,bool)", +"bc346090": "DigipayToken()", +"bc346c9c": "Attack(address)", +"bc34f204": "getP3DBalance()", +"bc356eea": "VEN()", +"bc3574d4": "adjustSupply(uint256)", +"bc3589bf": "TOKEN_FIRST_PRICE_RATE()", +"bc358af9": "listItem(uint256,uint256,uint8,address)", +"bc35c57f": "setMinAmount2Round(uint256)", +"bc3619dd": "onBlockClose(address)", +"bc364d7b": "tokenVestingAddress()", +"bc367377": "setTokenBurnApproveReset(address,address,address,address)", +"bc376bbe": "unlockFor(address,uint256)", +"bc378a73": "getProposalsLength()", +"bc37d7b8": "setVendingFee(uint256,uint256,uint256)", +"bc389b6d": "callWithdraw(uint256)", +"bc38a991": "testInsert()", +"bc39d42f": "sigDestinationTransferFrom()", +"bc3a72a5": "ETHHToken(uint256,string,string)", +"bc3abbdb": "etherPerMiner()", +"bc3b0d31": "STCB()", +"bc3bc814": "changeTolerance(bytes32,uint256)", +"bc3c2846": "requestMediator(uint256,uint256,address)", +"bc3d9390": "printBlockHash()", +"bc3dde2f": "xxx(address)", +"bc3f7bcb": "moleculartechnologySupply()", +"bc3f931f": "getVote(uint256,address)", +"bc4006f5": "erc721Metadata()", +"bc40487c": "Hashnodetestcoin()", +"bc4076e9": "accountsReceiveableHeld()", +"bc408ec4": "ElixirUSD()", +"bc40b52a": "startPreICO()", +"bc40bac6": "getCrydrViewAddress(string)", +"bc41f298": "changeControllerAccess(address,bool)", +"bc427bc8": "setFreezeForFounding(uint256,address,uint256)", +"bc428ee2": "getTimeOutAuthentication()", +"bc431846": "getBetPriceID(uint256)", +"bc4447ef": "getBlackListStatus(address,address)", +"bc447a6d": "numDragonTypes()", +"bc448782": "setCrowdsaleAddress(address,address)", +"bc44e79d": "getStageWinners(uint8,uint16,uint8)", +"bc44ea9a": "setBank(address,uint256)", +"bc451844": "BONUS_DURATION_1()", +"bc456c42": "changePaymentAddress(address,address)", +"bc45d789": "setConfigUint(int256,bytes32,uint256)", +"bc466ab2": "setNewEnd(uint256)", +"bc467a3e": "ownedContract()", +"bc48bc22": "erc20TokenCount()", +"bc48f4be": "getLand(int256,int256,address)", +"bc499814": "generatePrefixedPreimage(bytes32)", +"bc4998b9": "eth2MNT(string)", +"bc4a2030": "getCurrentRate(uint256,uint256,uint256,uint256)", +"bc4af295": "spawnAssetWithCreator(address,uint256,uint256,uint256,address)", +"bc4afa67": "MBTCToken(address,uint256)", +"bc4b3365": "addFunds(address,uint256)", +"bc4b346d": "confirmQuest()", +"bc4bbad1": "updateCostETH(uint256)", +"bc4c594b": "tokenManagerAddress()", +"bc4d76e5": "EPay()", +"bc4d9b50": "minerLockedAmount()", +"bc4e3105": "unlockAddressDuringITO(address,address)", +"bc4f65a3": "addCity(bytes32,uint256,uint256)", +"bc4fcc4a": "redeemedAt(bytes32)", +"bc4fe17e": "addressToUser(address,address)", +"bc50c09e": "playAnyTriples(uint256)", +"bc517131": "walletVersion()", +"bc5213b7": "_setCurrentRate(uint256)", +"bc523229": "ShopDex()", +"bc525652": "templates(uint256)", +"bc52b43b": "buyinAs(address)", +"bc537bae": "getMeOutOfHereStocks()", +"bc53a93d": "E4Token()", +"bc54a168": "buyTokensOnInvestorBehalfBatch(address[],uint256[])", +"bc54f56f": "getTemplateDetails()", +"bc562b9e": "loseSponsor(uint32)", +"bc56a240": "walletEtherPresale()", +"bc56e749": "acceptProposal(uint256,address)", +"bc57275b": "EthCnyPrice()", +"bc579103": "totalPayed()", +"bc57d5f5": "transferFrom(address,address,uint256,uint256,uint256,uint256)", +"bc597d9f": "getProposalVotesCount(uint256)", +"bc59afe6": "scanMany(address[],bytes1[])", +"bc59d45a": "raisedWei()", +"bc5b75f4": "EtherWorldCup()", +"bc5bf5bf": "releaseVestingTokens(address)", +"bc5c0c67": "setDowntime(uint256)", +"bc5cfd4f": "lastBonusNumber()", +"bc5d066e": "changeCompanyWallet(address,address)", +"bc5d0f65": "beginExecution()", +"bc5dc168": "balanceOfLocked2Y(address)", +"bc5dfd7d": "getCompte_23()", +"bc5e4bb4": "_hasSkillsCheck(uint256)", +"bc5ff5e1": "oraclize_query(string,string[4],uint256)", +"bc602ab7": "removeRandomClass(uint32)", +"bc607f7b": "funcFromC2()", +"bc60878e": "total_received_amount()", +"bc60a365": "removeAdminAccount(uint256,address)", +"bc60ac60": "StefyToken()", +"bc61394a": "fillOrder(address[5],uint256[6],uint256,bool,uint8,bytes32,bytes32)", +"bc6171df": "sendETHToMultiSig(uint256)", +"bc62c89a": "getTrainerEarn(address)", +"bc62d8d8": "parse(string)", +"bc632a21": "creationTime(address)", +"bc634abb": "getDocumentProposals()", +"bc636707": "_explorationTime(uint8,uint8,uint8)", +"bc63cc90": "starCountsForOwner(address)", +"bc64059b": "exchangeEtherForHavvensAtRate(uint256,uint256)", +"bc643df1": "getIncludes(uint256,uint256)", +"bc649f4c": "grantProvider(address)", +"bc6548fb": "etherVault()", +"bc655f54": "getEndDate1()", +"bc65c559": "preIcoInvestment(address,uint256,uint256)", +"bc65d6f6": "getSubscriberContentHashes()", +"bc65e9e1": "PenCoin()", +"bc6633f7": "setSaleState(uint16,bool)", +"bc677b46": "viewOwner()", +"bc67f832": "setMessageSender(address)", +"bc68118b": "setDeveryRegistryAddress(address)", +"bc68fad9": "burnBalance()", +"bc697319": "minimumGoal()", +"bc698641": "relayBalance()", +"bc69dc89": "BenefyCashToken(string,string,uint8,uint256)", +"bc6a49a3": "LaunchRocketEvent(address,uint32,int64,int64)", +"bc6ac112": "calculateRegionInitialSalePixelPrice(address[16],uint256)", +"bc6b12b3": "odem()", +"bc6c06e7": "GoodfieldRetail(uint256,string,string)", +"bc6c4d0f": "totalVotesForCandidate(uint256)", +"bc6d68ee": "updateSubscription(address,address,bool,uint256)", +"bc6d80fa": "getLenderAmountForIncreasePositionAtTime(bytes32,uint256,uint32)", +"bc6e6604": "TOKENS_PER_ETH()", +"bc6f1699": "clockpos()", +"bc6f712a": "Attestation(string,bool,address)", +"bc6f9021": "maxCapTokens()", +"bc6fd6d9": "MINIMAL_WEI()", +"bc70ad19": "IMEXX()", +"bc713f1d": "AddPoolCoOwner(string,address)", +"bc71b0a6": "DeCenterToken(address,address,address,uint256,uint256)", +"bc71cdcb": "BAInvestor()", +"bc7202d7": "_updateSalePrice(uint256,uint256,address)", +"bc734f0f": "nextSeason()", +"bc735d90": "setOperator(address,address,bool)", +"bc73a7e4": "_preValidatePurchase(address,uint256,uint256)", +"bc73c971": "TierBasicDividendAddress(address)", +"bc7411b2": "chargeBonuses()", +"bc745a0d": "nextBonusStepLimit()", +"bc752b61": "buyTicket(uint256[],uint256)", +"bc76dca0": "GoWalletProject()", +"bc77b919": "_mySymbol()", +"bc77f476": "EVCChain()", +"bc78ac81": "setPet(string)", +"bc7a6e35": "_startAuction(bytes32)", +"bc7b3f86": "NewHighestBid(address,uint256,string)", +"bc7b6d62": "setResolver(uint256,address)", +"bc7b801e": "adminUpdateWorldSnapshot()", +"bc7c322c": "ratePerWei()", +"bc7c55ed": "listing()", +"bc7c72d7": "getmessagefromdovie()", +"bc7d8cb4": "EURSToken(address)", +"bc7dbc0d": "yearlyFee()", +"bc7dce06": "setETHPrice(uint256)", +"bc7e8d3c": "isDeholdable()", +"bc7f25e4": "getReferrerOf(address)", +"bc7f3b50": "getDelegate()", +"bc7f58b1": "addAgreement(address,bytes32,uint32,uint32)", +"bc802c83": "userManagerContract()", +"bc80bee8": "setFeerate(uint256[3])", +"bc81572c": "createPromoScene(address,string,uint256[],uint256)", +"bc81786f": "addBonusToClient(address,address,uint256,string)", +"bc81c97b": "failingRefund(address,uint256)", +"bc81f147": "set_iconiq_arbits_per_ether(uint256)", +"bc81f2f5": "eraseMatch(uint256)", +"bc82f4d3": "verifyEmailAddress(address,string)", +"bc83a6fb": "ekkoBlock1(uint256,string,uint8,string)", +"bc83d001": "DividendFacial()", +"bc8409a4": "investWallet()", +"bc843509": "toByte()", +"bc84a7ba": "getsometokenn(address,uint256)", +"bc851718": "hashLast()", +"bc855006": "SantaiToken()", +"bc85c055": "queryEOSTokenBalance(address,address)", +"bc85e064": "merchantWallet()", +"bc86a23a": "addPrimaryRecord(string,string,string,string,string,string,string)", +"bc87103a": "removeFunder(address,address)", +"bc8711fd": "getWinnersLength()", +"bc87b70f": "oldestGen()", +"bc88adc4": "getBuyerBalancesOfCurrentAuctions(address[],address[],address)", +"bc899015": "CappedCrowdsaleImpl(uint256,uint256,uint256,address,uint256)", +"bc8aa899": "we_token()", +"bc8b336d": "Ninecoin()", +"bc8bde64": "_creator()", +"bc8caa47": "resetDividendsCalculation()", +"bc8cb3f9": "destTokensReferals()", +"bc8d7a51": "gemsOfOwner(address)", +"bc8e1143": "processTransaction(bytes,uint256,address,bytes20)", +"bc8e9cde": "createGen0Horse(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"bc8f3bcb": "ZeroDollarHomePage()", +"bc8fbbf8": "nuke()", +"bc903cb8": "getProposalInfo(uint256)", +"bc912e1a": "WHITELIST_SALE_PRICE()", +"bc9147a4": "Foundation()", +"bc916a50": "hasOwner(uint16)", +"bc921d54": "setImageData(uint256,uint16,uint256[])", +"bc92bea5": "getRandomItems(address,string)", +"bc944d9e": "newLowestAsk(uint256,address)", +"bc950708": "totalRaisedInCents()", +"bc95f178": "make(bytes32,bytes32)", +"bc9748a1": "pong()", +"bc978361": "setrteamVaultAddr(address)", +"bc97a8ac": "JackpotPayout()", +"bc97fd06": "updateMultipleUsersReward(address[],uint256[])", +"bc98b8b0": "getTTTInfo(uint256)", +"bc9904ec": "updateProfile(address,bytes)", +"bc99249e": "buy(address,bool)", +"bc9968a2": "dataController()", +"bc99c8be": "takerAddressAt(uint256)", +"bc99cc37": "maxInvestors()", +"bc99d04c": "YRQ(uint256,string,string)", +"bc9abe67": "completedFlag(uint16)", +"bc9aed8b": "TokensIssued(address,uint256,uint256,uint256,bool,uint256)", +"bc9b717e": "TokenPurchase(address,address,uint256)", +"bc9c278d": "IcoContract(address,address,uint256,uint256,uint256,uint256)", +"bc9c58f6": "countOrigins()", +"bc9cbcc8": "setImbalanceStepFunction(address,int256[],int256[],int256[],int256[])", +"bc9cc1fb": "getAllbetByGtype(uint8)", +"bc9d8d6a": "getLastWallet()", +"bc9da641": "testToUint8()", +"bc9e080e": "setVerifierManager(address)", +"bc9e6b0f": "_getClientLastPaidRate(address)", +"bc9f31e3": "mock_throwIfNotRemoved(address,address)", +"bc9ff567": "InternetWealth(uint256)", +"bca19900": "tokenHardcapIssued()", +"bca19ca0": "TAAS_CONTRACT()", +"bca1f81c": "lockOpen()", +"bca2b941": "setTokenPrice(uint256,uint256,uint256)", +"bca2bbc0": "EtherModifierMoops()", +"bca36985": "ExposureSettled(bytes32,address,uint256)", +"bca38dab": "createGuess(uint256,string,string,string,uint8,bytes,uint256,uint256,uint256[],bytes32[])", +"bca3eb24": "setCAO(address)", +"bca50515": "transferFromPreSigned(bytes,address,address,uint256,uint256,uint256)", +"bca51abf": "_detectStage(uint256)", +"bca53fa0": "AIHTeamLockContract()", +"bca58da8": "change_block()", +"bca60cf5": "getAgreement()", +"bca63e50": "mintTotal()", +"bca65475": "jugar()", +"bca6e8ec": "sendToReceiver(address,address,uint256)", +"bca7093d": "withdrawalPeriod()", +"bca72b59": "revealVote(string,uint256,uint256)", +"bca76131": "GoCryptobotCore()", +"bca77cd6": "YUBToken()", +"bca7a9e2": "lockToken()", +"bca7bd85": "getAllLockerInfo()", +"bca7e96b": "needsFinalization()", +"bca86986": "testSetup()", +"bca915c7": "createPromoPlayer(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"bca9745c": "display_time(bytes32)", +"bca9a5c5": "getEmployee(uint256)", +"bca9adef": "vestedAvailableAmount(address,address)", +"bca9e546": "testControlCreateWithParentParentNotInUse()", +"bcaa218e": "myFrontEndTokens()", +"bcaa85df": "lockAccounts(address,bool)", +"bcab7ad2": "TimeDecayingTokenBoundary(uint256,uint256,uint256,uint256,address)", +"bcabb0c8": "getAllProposalVoters(uint256)", +"bcabb54c": "modifyCommunityInfo(uint256,string,string,string,string)", +"bcabbfb1": "startDonation()", +"bcae19f4": "base58Address(bytes)", +"bcae9d43": "theProxy()", +"bcaedade": "STANDARD()", +"bcafe9a9": "setIncreaseRepAvailableForExtraBondPayouts(bool)", +"bcb02b74": "testFailPushWhenStopped()", +"bcb0a787": "_setSchellingRoundSupply(uint256)", +"bcb0c2d7": "removeStakeholder(address)", +"bcb0c7c0": "nomParticipant(uint256)", +"bcb0f541": "setEarlyBirdDuration(uint256)", +"bcb1e4f7": "GetSellingTokenUnitPrice()", +"bcb2f8c6": "externalFundProposal(uint256)", +"bcb32828": "emissionAddress()", +"bcb39621": "currentSeason()", +"bcb3b5d2": "getGamblesList(uint256)", +"bcb593f1": "subOnStage(address,uint256)", +"bcb60fa9": "blockTx(bool)", +"bcb638cb": "parseImpressions(uint64,bytes)", +"bcb7b0d4": "pauseICOs()", +"bcb7f880": "DTCC_ILOW_2()", +"bcb83450": "createMarriage()", +"bcb98ba2": "changeChampsName(uint256,string)", +"bcba53f4": "_createBlock(uint256,uint256,uint256,string,address)", +"bcba6939": "transferERC20Token(address,uint256)", +"bcbb64c4": "softCapInToken()", +"bcbc1585": "_payRoyalty()", +"bcbc758a": "SixStandardToken(uint256,string,uint8,string)", +"bcbc9175": "prefixedHash(bytes32)", +"bcbd3bcd": "_editPersonalNote(string,uint256)", +"bcbd82e5": "rateForPreICO()", +"bcbd9881": "setFriendsFingersRate(uint256)", +"bcbdbf40": "SaleResumed()", +"bcbea1ad": "transferCardTo(address,address)", +"bcbf5b90": "totalSupplyForPresale()", +"bcbf7229": "resetVoteCount(uint256)", +"bcbfe43c": "openSaleCompleted()", +"bcc13d1d": "contributionMin()", +"bcc1480a": "canTransferBalance(address)", +"bcc17ca0": "getvalues(uint256)", +"bcc221d0": "getBonusValue()", +"bcc30409": "processPurchase(address,uint8,uint256)", +"bcc37dd4": "approvedAccount(address)", +"bcc38018": "recycleReward(uint256)", +"bcc38d59": "proxies()", +"bcc3af24": "hasVotedOnConstitutionPoll(uint8,address)", +"bcc44a72": "restoreTokenOwnership()", +"bcc46e83": "addCollateral(uint256)", +"bcc4e4ab": "getVesting()", +"bcc4f0ed": "isValidBuy(uint256,uint256)", +"bcc5601b": "BaktFactory(address,bytes32,address)", +"bcc5dce5": "stash(uint256)", +"bcc6092a": "MyEtherBank()", +"bcc673bd": "GeneralToken(string,string,uint8)", +"bcc70902": "create(address,uint256,uint256[],uint256)", +"bcc74a3b": "isAdminAddressExist(address)", +"bcc7900c": "SystemTest()", +"bcc7db5a": "cleanupErrorGame(address,uint256,uint256)", +"bcc91d61": "sendEther(address[],uint256[])", +"bcc941b6": "totalWinners()", +"bcc94309": "calculator(uint8,uint256,uint256)", +"bcc9ed6f": "MAX_PAYOUT_FRAC_TOP()", +"bcca1fd3": "changeVotingRules(uint256,uint256,int256)", +"bccb6157": "RedemptionWalletUpdated(address)", +"bccb8fc0": "vestTokens(address,uint256,address,uint256,uint256,uint256,bool)", +"bccc85e6": "receiveTokenLoot(uint256,uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"bccda810": "logicContractAddress()", +"bccdd9a6": "getValueFromCents(uint256)", +"bcce515d": "bulkMint(uint256[])", +"bccee504": "m_ETHPriceLifetime()", +"bccf0972": "egrToken()", +"bccf5aa4": "issueTokenAndTransfer(address)", +"bcd0b22a": "getSnapsLength()", +"bcd0ce28": "BitcoinUniversal()", +"bcd101a6": "getStartDates()", +"bcd2780b": "addValidContract(address)", +"bcd2feff": "biotorBiomassToken()", +"bcd396d1": "adminTrade(uint256[],address[],uint8[],bytes32[])", +"bcd3d8ca": "Collector(address,address,uint256)", +"bcd3ff89": "setGameSponsorInfo(address,uint256)", +"bcd4144b": "giveGreed()", +"bcd45a76": "HolderVacated(address)", +"bcd47934": "hasBiometric()", +"bcd5078c": "get_king_address()", +"bcd533ae": "newRefundProposal()", +"bcd5349f": "getCapacity(uint256)", +"bcd59261": "getDepositBlock()", +"bcd59b36": "secondsAfterStart()", +"bcd60f6c": "winningProposal(uint256)", +"bcd61c6a": "getGoodPrice(bytes32)", +"bcd789cc": "submitProposal(bytes32,string,address,address,uint256)", +"bcd85b6d": "getBackerStatus(address)", +"bcd88a61": "viewInvestorDividendPool()", +"bcd9cc60": "rejectCetification(address)", +"bcda2c0c": "_delete()", +"bcda601f": "Panicked(address)", +"bcdac66f": "Power()", +"bcdaea36": "setOpGas(uint256,uint256,uint256,uint256,uint256)", +"bcdb446b": "recoverEth()", +"bcdd6121": "increaseApproval(address,address,uint256)", +"bcdda53f": "TokenERC20(address,uint256,address)", +"bcddd64e": "CHECKPOINT_KEY()", +"bcde18f1": "fundingStart()", +"bcde87eb": "totalAmountOfTeatokensCreated()", +"bcdea6f9": "getStageMinimum(uint8)", +"bcdf266c": "EphronTestCoin()", +"bcdf43dc": "add_presale_arbits_sold(address,uint256)", +"bcdf569b": "finalize(address,address)", +"bcdfe0d5": "Hello()", +"bce0e87a": "payoutOnPurchase(address,uint256)", +"bce0fb22": "takeOwnershipWithIndex(uint256,uint256)", +"bce1cdc3": "getTotalEtherOfAllRounds()", +"bce24669": "removeGame(address)", +"bce2b9a3": "purchaseEgg()", +"bce2bb42": "setCoinTotalsContract(address)", +"bce2d16d": "koef()", +"bce32da4": "AndhraToken()", +"bce3cc67": "TokensReclaimed(uint256)", +"bce440d5": "TokensContractAddressSet(address,address)", +"bce49a90": "KKCToken(address)", +"bce4d041": "updateCancels(address,uint256)", +"bce5a209": "owners2tokens(address,uint256)", +"bce5fc53": "UIOCOIN(uint256,string,uint8,string)", +"bce6158d": "PTransfer(address,uint256)", +"bce643aa": "developer_new_symbol(string)", +"bce70868": "buildingIsPublic(uint256)", +"bce83d2a": "setWhitelist(address,address,string)", +"bce94649": "getRangeURI(uint256)", +"bce9ae3d": "NewDeal(uint256,address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"bce9ccb9": "GetCitySnapshot(address,uint256)", +"bcea363d": "killContract(address)", +"bcea7ea0": "chargingGas(uint256)", +"bcead63e": "lender()", +"bceaf1fd": "CLOUDForGas()", +"bcec1df3": "ROLE_DISTRIBUTOR()", +"bcecbc65": "getSendersEth(address)", +"bceceefe": "startCrowdsale0(address)", +"bcecf667": "usdToEth(uint256)", +"bced2c8c": "InteractingTokenA(uint256,uint256)", +"bced9cfd": "guessSeed(uint256)", +"bcedb86c": "payQuarterFinalWinner(uint256)", +"bcee2dd4": "getFeeCollected()", +"bcee6eb9": "validateProposedThroneRules(uint256,uint256,uint256,uint256)", +"bceeb243": "getUserSSCeducationDetails(string)", +"bceee05e": "isSuperuser(address)", +"bceeeb9a": "SearchIPR(string,address)", +"bcef393a": "balanceOfVault(uint256,address)", +"bcef84b1": "getMaxBuy(uint256,uint256)", +"bcefafab": "changeAccountAddressForSponsee(address)", +"bcf0dd8e": "marketTransfer(address,address,uint256)", +"bcf0e1ea": "TerrariumCoin()", +"bcf175c8": "oraclize_cbAddress()", +"bcf2e323": "sort(bool)", +"bcf49c72": "dewhitelistAddress(address,address)", +"bcf599f1": "toUnixtime(bytes32)", +"bcf610bc": "UnsetAgenda(string,address)", +"bcf6558c": "releaseMid()", +"bcf685ed": "setAgent(address)", +"bcf68f87": "lockCrowdSale()", +"bcf6b3cd": "changeBaseValue(uint256,uint256,uint256,uint256)", +"bcf711b2": "CBXToken()", +"bcf7b67e": "emitFeesClaimed(address,uint256)", +"bcf7bd0b": "requireEnoughExpForBreeding(uint256)", +"bcf83634": "basecost()", +"bcfa87d2": "getBounsEarnings(address)", +"bcfaa79d": "mintTokens(address)", +"bcfb0140": "getTokenOrderDataHash(uint256[],uint256,uint256,address,address)", +"bcfb4ea1": "Million()", +"bcfb9b61": "voteProposal(uint256,bool)", +"bcfbd445": "getTrader(uint256)", +"bcfc5078": "bountiesKey()", +"bcfcb03e": "allocateFounderTokens()", +"bcfde742": "setHardCapCHF(uint256)", +"bcfe070f": "batchCancel(address[],uint256[])", +"bcfe8fb4": "ArtTokenBurn()", +"bcfea3e4": "BLMCH()", +"bcff702b": "salePause()", +"bcfffab8": "shopStoreNextId()", +"bd002e1e": "startPoll(bytes,uint256,uint256,uint256)", +"bd00b0c2": "changeDedeAddress(address)", +"bd0100c9": "registerAddress(string,address,address)", +"bd01c7d5": "buyTicketToDraw(uint256,uint256,address)", +"bd025a79": "setDoge(address)", +"bd02942f": "allocateAdvisors(address,uint256)", +"bd02d0f5": "getUint(bytes32)", +"bd02e4f6": "calcRandomNumberAndGetPreliminaryGameResult(uint256,uint64)", +"bd041c4d": "vote(address,bool)", +"bd042ca6": "GigsToken()", +"bd04923f": "values(uint256,uint256,uint256)", +"bd05c055": "timeBetweenGames()", +"bd05cb4d": "createContractItem(string)", +"bd06aa84": "WithdrawalContract()", +"bd06e777": "SCORE_REPORT_START_TIME()", +"bd075b84": "mint(address[])", +"bd079484": "getmortiesSinceLastHatch(address)", +"bd079a18": "YTPAY(uint256,string,string)", +"bd088724": "mintDone()", +"bd097e21": "fundContract()", +"bd09f117": "eidooWallet_()", +"bd0a0e85": "setLeaderboard(uint256,uint256)", +"bd0ae405": "voterReward(address,uint256)", +"bd0af85d": "pay(address,address)", +"bd0b65e4": "sub_id(string,uint256)", +"bd0c6307": "contrExit(uint256[])", +"bd0cac13": "updPool(uint8,uint256)", +"bd0cc4ee": "reverseSplitTokensAfterDistribution(uint256)", +"bd0e5d07": "deposit4()", +"bd0e6a0f": "startICO(bool)", +"bd0fda3d": "EntityCount()", +"bd102430": "blacklister()", +"bd102993": "CurrentStageUpdated(uint256)", +"bd119967": "add_rating(uint256,uint256)", +"bd11e933": "wingsTokenRewardsPercent()", +"bd129b92": "batchFillOrders(uint256[],bytes[])", +"bd12a007": "InterfaceId_ERC721Metadata()", +"bd131a78": "firstAuctionsExtendableDuration()", +"bd149031": "LongToken(uint256,string,string,uint256)", +"bd14fe3e": "hasOwnerAccess(address)", +"bd153c64": "emitted()", +"bd15e9ab": "hasMinBudget(address,uint256,uint256[])", +"bd1607ed": "HashRush(string,string,uint8,uint256)", +"bd16deaa": "ownerSetMaxBet(uint256)", +"bd16f1f3": "unfreezeByIndex(uint256)", +"bd1723e5": "blackBox()", +"bd17647f": "changeMilestone(uint8,uint256,uint256)", +"bd17a9d8": "blockAccess(address,bytes32)", +"bd17d63a": "TokenStorageContract(address,address,address[],uint256,uint256,string,string,uint8)", +"bd183430": "ArtIs()", +"bd185612": "changeCertificateHash(address,bytes32,uint256)", +"bd187e3b": "changeParticipationFeeForRaz(uint256,uint256)", +"bd189666": "DetailedERC20Mock(string,string,uint8)", +"bd19036a": "investmentCapIcoPhaseTwoPounds()", +"bd1954c6": "ownerToBooty(address)", +"bd1a77a8": "sellNac(uint256,address,uint256)", +"bd1ad05c": "LogRecoveryChanged(address,address,address)", +"bd1b324c": "NewMyToken()", +"bd1b768b": "getApprovedAddressesOfList(address[],address)", +"bd1baedb": "SignumToken()", +"bd1bca06": "_getCrabData(uint256)", +"bd1d3432": "FOUNDER_ADDRESS1()", +"bd1de900": "totalOffer()", +"bd1edd81": "acceptDeposits(uint256[],uint256[],uint256[],uint256[])", +"bd1f4b52": "withdrawErc20(address,uint256)", +"bd1f7d52": "GetBoosterData()", +"bd1fac00": "TOKEN_COMMUNITY()", +"bd218493": "tokenLimitPerWallet()", +"bd21a864": "DigitalTradingCoin(address)", +"bd21fa47": "accountBalances()", +"bd22b1cb": "millionDollarTokenReward()", +"bd22d07f": "getTankByTokenId(uint256)", +"bd22f1cd": "testSubmitHash()", +"bd2302fc": "transferProposal()", +"bd23076f": "LamboToken()", +"bd23eb39": "tokenFallback()", +"bd242709": "initBob(uint256,uint256)", +"bd249ff0": "lockedBoardBonusAddress()", +"bd24b0d0": "ZHORA()", +"bd24de29": "blockDuelBegin()", +"bd24f08a": "isInBalanceLimit(address,uint256)", +"bd2560a0": "_inverseGetTokenAmount(address,uint256)", +"bd262a20": "setAuthority()", +"bd272880": "OnUpdateFee()", +"bd2850ab": "Freeze(address,address,uint256,uint256,string)", +"bd285ea8": "ReferedCrowdsale()", +"bd28d688": "TFOA(uint256,string,string)", +"bd28f504": "_computePet(uint256,uint256,uint256)", +"bd290d8b": "isValidLenth(string)", +"bd295f30": "GoodTronToken(address,address)", +"bd2b4ab7": "DigitalContentsToken()", +"bd2b6444": "adminUpdateWhiteList(address,address,bool)", +"bd2c0ead": "removeHolder(address,uint256)", +"bd2c245e": "privateIcoFinalized()", +"bd2cef65": "callback_ForPayout(bytes32,string,bytes)", +"bd2deecb": "create(bytes32,address,address[],address,bytes32)", +"bd2fffb3": "FlipNA()", +"bd3124e0": "addToBank()", +"bd320dde": "firstSaleDelivery(address,uint256)", +"bd322b77": "enableApi(address)", +"bd32aa44": "initiateSelfDestruct()", +"bd336584": "first_release(uint256)", +"bd338d85": "yearOneMultiplier()", +"bd33cc91": "requestRefundContributor()", +"bd345ed9": "setETH(string,uint256)", +"bd353ce2": "withrawDev()", +"bd355f43": "amountOfBags()", +"bd3566b7": "generateToken(address,uint256,string,string)", +"bd35d570": "GAS_TO_COMPLETE_EXECUTION()", +"bd366ddc": "reclaimEthicHubTeamFee()", +"bd36a5cd": "updateSaleStatus()", +"bd36c881": "bytesToAddress(bytes,bytes)", +"bd36cc93": "burnCancel(address,address)", +"bd37fec9": "Protean()", +"bd382b45": "getWindowAdjRatioForGameId(uint256,bool)", +"bd3a2ef4": "updateOdds(string,uint256)", +"bd3a5208": "getOraclizeRoundGasFee()", +"bd3a9d3c": "_createAuction(uint256,string,uint256)", +"bd3b5d07": "m_pending()", +"bd3bef41": "NewLeader(uint256,address,uint256,uint256)", +"bd3ccfc9": "getWeeklyTransactionVolumeSending()", +"bd3ce132": "transferManually(uint256,address)", +"bd3d0ecb": "newName(string,string)", +"bd3e19d4": "getCost()", +"bd3e7401": "setupSale(uint256,address)", +"bd3f0965": "AiraEtherFunds(string,string)", +"bd3f7817": "DaysToDestroy(address)", +"bd3fe562": "getRadarsIds()", +"bd4074f9": "tokensForCrowdSale()", +"bd431462": "BuyBSTtokens()", +"bd45115c": "PGPToken()", +"bd457de2": "KAPcoin(uint256,string,string)", +"bd478fcb": "readFromCart(address,uint256)", +"bd47c1a2": "getAccountListLenght()", +"bd47dd7a": "lockSeedInvestors()", +"bd484606": "techWallet()", +"bd48fa0e": "unpause_3()", +"bd499af3": "updateOptionsRegistryAddress(address)", +"bd49f00f": "ownersTokenList(address,uint256)", +"bd4a359d": "getLatestVersion(bytes32,bytes32)", +"bd4b6bbd": "transferScoupons(address,uint256)", +"bd4bb67e": "transferTokensFromKingWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"bd4c0755": "Test68()", +"bd4cfadf": "getownerInfo(address)", +"bd4dc024": "landRegistry()", +"bd4e0b4d": "REFERRAL_TOKENS()", +"bd4ed6cc": "sumHardCapPreICO2()", +"bd5021af": "startRecovery(address)", +"bd5034ff": "Redeem(address,uint256,uint256,uint256)", +"bd50b3b4": "transferAndLock(address,uint256)", +"bd513bea": "getTreasure(bytes32)", +"bd51525e": "typeOf(address,uint256)", +"bd51654b": "showMyEtherBalance(address)", +"bd516e04": "addCombat(uint128,uint128,bytes32)", +"bd5196cf": "createGame(string,string,uint256,uint256,string,address,uint256,string,bytes32[2],bool,string)", +"bd51d5d0": "hasBalance(address,uint256)", +"bd51fa4c": "propose(string,string,string)", +"bd527527": "setLLV_edit_13(string)", +"bd52d81a": "_emitRoleRemoved(address,uint8)", +"bd5304e3": "ContributorBalanceChanged(address,uint256)", +"bd53cb96": "changeUnitsUserCanBuyLimit(uint256)", +"bd541ad0": "depositEscapedFunds()", +"bd545f53": "cancelAllOrders(uint256)", +"bd54bced": "LogN_fnc(address,bytes32,uint256,string,bytes,uint256,bytes1,uint256)", +"bd550824": "_setPayTo(address)", +"bd556252": "PRE_ICO_PERIOD()", +"bd58118f": "allocateAngelTokens(address,uint256)", +"bd5821ca": "_refund(address)", +"bd5821f1": "changeActualTokenValue(uint256)", +"bd583bff": "registerManager(address,address)", +"bd59434d": "setGame(uint8,address)", +"bd59fdde": "ITube()", +"bd5acbd6": "continueOrder(uint128,uint256)", +"bd5ae945": "NodeSwapCrowdSale(uint256,uint256,uint256,uint256,uint256,address,address,address,address,address,uint256)", +"bd5b758d": "ObtainChip(uint32)", +"bd5b948d": "CCH_ILOW_1()", +"bd5c4e24": "TIMEOUT_DESTROY()", +"bd5c5420": "setExchangeRate(address,uint256)", +"bd5ca3a3": "createProxyImpl(address)", +"bd5d7b1d": "FEELCOIN()", +"bd5dec98": "withdraw(address[])", +"bd5e3a80": "GPPHARMTOKEN(uint256,uint256)", +"bd60527b": "getEmployerContracts(address,uint256[],uint256[])", +"bd611c73": "TOTAL_ICO_TOKENS()", +"bd61ff75": "cmpn(uint256,uint256)", +"bd6206ec": "initialDayWithdraw(uint256)", +"bd621042": "setUnownedPriceInExoTokens(uint256,uint32)", +"bd623d68": "encodeData(uint128,uint256,uint24,uint40,uint32)", +"bd625f1b": "setend(uint256)", +"bd62fff3": "Nines()", +"bd632e10": "batchInvest(address[],uint256)", +"bd633642": "MeissaChallengeToken()", +"bd639259": "getOwnerAngelCount(address)", +"bd63c338": "canRecover(uint256)", +"bd646356": "calculateCommissionToWithdraw(uint32)", +"bd6501b1": "isValidator(uint64,address)", +"bd656daf": "Fomo2D()", +"bd659784": "addToList(address)", +"bd65fc4c": "stb()", +"bd66528a": "claim(bytes32)", +"bd675c0e": "revealMove(uint256,uint8,string)", +"bd679ab2": "WithdrawGains()", +"bd679ad6": "burnDragons(uint256)", +"bd6812a4": "lastBlock_a0()", +"bd684865": "getAuthByPhone(string)", +"bd68817f": "clearRAMAll()", +"bd68eb34": "_spawnAxie(uint256,address)", +"bd6a9abb": "hasClearingPrice(address,bytes32)", +"bd6bbc31": "lastCollection()", +"bd6bf475": "canUpdateCompany(string,address)", +"bd6c4661": "fetchCancelledOrdersForPayer(address)", +"bd6c6756": "cardsCount()", +"bd6cac4f": "isPriorPack(address)", +"bd6d894d": "exchangeRateCurrent()", +"bd6de5a3": "dNextOffer()", +"bd6e578a": "getPreSaleFund()", +"bd6e5e03": "calcICO(uint256,uint256,uint256)", +"bd6edba5": "getUserBalances()", +"bd6fd20d": "getDeedTimestamp(string)", +"bd7084b2": "getNextNonce()", +"bd7095db": "GetCompetitionFunds(uint32)", +"bd70c53a": "LYFToken()", +"bd70fce9": "getApprenticeDistributedRandom(uint256)", +"bd7162b6": "setPixelPrice(uint16,uint16,uint256)", +"bd7173dd": "addLuckyblock(uint256)", +"bd719336": "canDistributeReservedTokens()", +"bd71e476": "ownerSetMinBetMining(uint256)", +"bd7243f6": "wipeBlacklistedAccount(address)", +"bd725f6e": "UBSToken()", +"bd728083": "ShowPurchased(uint256,address,address,uint256,uint256)", +"bd733dfb": "getUintsOwnerCount(address,address)", +"bd739a2f": "existsManagedContract(uint256,address)", +"bd73a9b4": "setTime4(address,uint256)", +"bd7427f8": "forceRefund()", +"bd7474ca": "upgradeDeploymentAdmins(address)", +"bd74c4e7": "setAttribute(address,address,bytes32,bytes,uint256)", +"bd74dc9d": "servicePaymentWithCharityPercentage(address,uint256)", +"bd763f59": "addPlayerData(uint256,uint256,string,uint256,uint64,uint64,uint64)", +"bd76540a": "buyIn(uint8,uint256)", +"bd76bf19": "addToBuyList(uint256,uint256)", +"bd778fde": "CoinNext()", +"bd77ac2c": "disburse(uint256)", +"bd780d0d": "getLastAttack(uint256,uint256)", +"bd788c88": "allocate(address,address,uint256,uint8)", +"bd792db3": "setIcoAddress(address)", +"bd797e32": "ChangeEmployeeState(address,uint8,uint8)", +"bd79a42a": "decimalToPreciseDecimal(uint256)", +"bd79d692": "depositEtherToVault(uint256)", +"bd7a9fda": "nameRegistry(address)", +"bd7afb29": "lastBlock_f17()", +"bd7b09e4": "totalCitizens()", +"bd7b7849": "addFace(string,string)", +"bd7be110": "SaveCoin()", +"bd7c13c6": "phase1MaxEtherCap()", +"bd7d2789": "checkWinner(uint256,uint8,bytes32)", +"bd7d3836": "pauseCrowdSale()", +"bd801ed4": "yishiliToken()", +"bd80d449": "newOK()", +"bd812166": "getSeasonInfo(uint32[99])", +"bd815a10": "RecyclerToken(uint256,string,string)", +"bd820688": "numOperators()", +"bd826f2b": "currentnumber()", +"bd837b2b": "approveToPullOutTokens(address,address,uint256)", +"bd83ea8d": "createMarriage(string,string,string,string,uint256)", +"bd84d8f6": "ProgressiveIndividualCappedCrowdsale(uint256,uint256)", +"bd853960": "assertEq14(bytes14,bytes14,bytes32)", +"bd85530c": "getAllSuccessInvestmentsCollected()", +"bd858288": "orderMatch(uint256,uint256,int256,uint256,uint256,address,uint8,bytes32,bytes32,int256)", +"bd85948c": "startNewRound()", +"bd85aac5": "getAllShareholdersAndShares()", +"bd85b039": "totalSupply(uint256)", +"bd85e163": "FOURTH_USER_CUT()", +"bd865d29": "end_auction()", +"bd8697ab": "makeFailed(bool)", +"bd88a04f": "p3dWithdrawForAdmin(address,uint256)", +"bd88f603": "setImageData(address[16],uint256,uint16,uint256[])", +"bd897671": "KYRIOSToken()", +"bd89d806": "y_Title()", +"bd8a79d5": "getFollowingCandidate()", +"bd8aa780": "whitelist(address[])", +"bd8b452e": "eatUnicorns()", +"bd8c1d33": "checkTransferFromToICAPWithReference(address,bytes32,uint256,string)", +"bd8c5643": "disableMoving()", +"bd8caabf": "setVirtualReserveBalance(uint256)", +"bd8cb6ca": "removePlugin(address,address)", +"bd8d34f5": "fundForTeam()", +"bd8d585e": "NCO()", +"bd8d5c7f": "EtherCartel()", +"bd8d5ce3": "amountReservedTokens()", +"bd8d86c4": "getlevel(uint256,uint256)", +"bd8d92c3": "requestDiplomaEntry(uint256,uint256)", +"bd8e0905": "weiToToken(uint256)", +"bd8e4725": "IxiniumFT()", +"bd8e4a51": "getCAORatio()", +"bd8e68c9": "PRICE_STAGE_FOUR()", +"bd8f61d8": "PerfectCoin()", +"bd8f997c": "getTotalQtyIpfsAddresses()", +"bd902dad": "approveSingleUser(address)", +"bd90df70": "targetContract()", +"bd916452": "claimReferrerBonus()", +"bd9215f4": "highest_bidder()", +"bd9335c0": "scheduleHangouts()", +"bd93f493": "LAUNCH_DATE()", +"bd945430": "OUTINGRESERVE()", +"bd94b005": "cancelSale(uint256)", +"bd94fafc": "PRESALE_CAP()", +"bd952178": "rejectAllocation(address)", +"bd95264c": "store(address,address,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"bd957585": "declareCrowdsaleEnd()", +"bd95b1f2": "getdays()", +"bd95d909": "sellTokenPerEther()", +"bd95f042": "sendRemainsToOwner()", +"bd963442": "handleRefundRequest(address)", +"bd965677": "setRelayed(address)", +"bd968eed": "runeToWeiRatio()", +"bd96b348": "GeBitToken()", +"bd97ce3a": "changeReferrer(address)", +"bd987008": "setAccountIsNotFrozenForReturn(address,bool)", +"bd991fc5": "setGroupRight(string,string,bool)", +"bd9934f1": "freezeAddress(address,uint256)", +"bd993f9e": "COREthExchangeRate()", +"bd998dc8": "CloseSale()", +"bd9a0158": "setTimeConstants(uint256,uint256)", +"bd9a11fd": "finalstate()", +"bd9a548b": "getPrices()", +"bd9a5673": "oraclize_query(string,string[5])", +"bd9b49b7": "goalCompletedBlock()", +"bd9b6d86": "confirmOwner()", +"bd9b6e85": "tokenTranslate()", +"bd9c33bc": "_discount(uint8)", +"bd9c5688": "distributeFee(uint256,address)", +"bd9ca422": "AIChain(uint256,string,string)", +"bd9d6b37": "AddNewPresalePackage(uint16,uint256)", +"bd9d6d7f": "memeData(uint256)", +"bd9e6bfc": "makeBuyOffer(uint32)", +"bd9ead1f": "calculateClaimableReward(address,address)", +"bd9ebfbb": "marketSellOrdersNoThrow(uint256,bytes[])", +"bd9ec492": "maximumEther()", +"bd9ef436": "witnessOf(uint256)", +"bd9f8917": "finalizeEnableRefunds()", +"bd9fbe7b": "getDefaultAQL()", +"bda00866": "getAmountOfUnlockedTokens(address)", +"bda02782": "b(address)", +"bda1504b": "currentSize()", +"bda1f35e": "Fleuth()", +"bda2aa53": "testUnsyncedRate()", +"bda2e692": "DinosaurFarmerNew()", +"bda330f7": "refundingStarttime()", +"bda393d3": "totaldividends()", +"bda4cf80": "_pfind(address)", +"bda4fd89": "totalItem()", +"bda5c450": "calculateDividendTokens(uint256,uint256)", +"bda5ea03": "tkwins()", +"bda6642c": "changeStartingPricesLimits(uint256,uint256,uint256)", +"bda6c497": "borrowerReturnDate()", +"bda70d92": "destroyOldCoins(address,uint256,string)", +"bda77531": "changeAdultDragonStage(uint8)", +"bda7c3ee": "delegateTransfer(address,address,uint256,uint256)", +"bda81086": "jsonRead(string,string)", +"bda8bf45": "getWitnessWeiCost()", +"bda9a055": "getStepsCount(uint256)", +"bda9b45c": "whitelistMe(uint128,uint8,bytes32,bytes32)", +"bdaa80c1": "TronX()", +"bdaacabd": "buyXname()", +"bdaacbbe": "calculateAdminFee(uint256)", +"bdaae1e7": "createGame(uint256,uint256,uint256,uint256)", +"bdab5fb0": "fishLocation(bytes32)", +"bdace3de": "ChessClubLiveChessCoin()", +"bdad3db2": "_mintTo(address,uint8,uint256)", +"bdad4dc3": "allocate(address[],uint256[])", +"bdad8112": "hashArguments(address,uint40,uint40,uint128,uint256)", +"bdaeb0a0": "m_GameHidden()", +"bdaf2fae": "timeBought(uint256)", +"bdaf78fb": "refundUser(bytes32,bytes32)", +"bdafcda9": "logClassic(string,address)", +"bdb001a7": "mana()", +"bdb00fb9": "blackjack(uint256,uint256,address)", +"bdb084b2": "startCrowdsaleY1(address)", +"bdb10825": "MOOVIN(uint256,string,string)", +"bdb15209": "getNewPrice(uint256,uint256)", +"bdb27170": "setLockinManagerAddress(address)", +"bdb2e597": "TheBestToken(uint256,string,uint8,string)", +"bdb337d1": "gameOver()", +"bdb4dc6e": "getBrickSize()", +"bdb4f321": "balanceOfStocksAt()", +"bdb57edc": "TokenRedeem(address,uint256)", +"bdb5daf5": "OvisAddress()", +"bdb66236": "pushDividends()", +"bdb6bce8": "livingSupply()", +"bdb81203": "newGrant(address,address,uint256,uint256,uint256,uint256,bool)", +"bdb9c11f": "transferTokensFrom(address,address,uint256,uint256)", +"bdb9f28d": "setPresaleAddress(address)", +"bdba9255": "getCounterLimit()", +"bdbaae63": "mint(int256)", +"bdbb829d": "haltICO(address)", +"bdbbf429": "escrowHistory(address,uint256,uint256)", +"bdbbfcad": "stageAmount()", +"bdbcd001": "testSetValidProvider()", +"bdbcd192": "PowerEnabled(address,address,address,address)", +"bdbed722": "getAllTokenIds()", +"bdbf3a2c": "addBenefactor(uint256,address,string,string)", +"bdbf40a9": "Certify(address,uint256)", +"bdbf7d4c": "DELETE_NAME_ROLE()", +"bdc056c0": "BanknadToken()", +"bdc06de4": "SGTExchanger(address,address,address)", +"bdc0ba8e": "disableMaintenance()", +"bdc0f93c": "node_count(uint256)", +"bdc2866e": "MasterMindAlliance()", +"bdc2f1e8": "multivestBuy(address,address,uint8,bytes32,bytes32)", +"bdc31ce8": "Roto2coin()", +"bdc33928": "placeIndexToApproved(uint256)", +"bdc441b2": "getItemCount(uint256)", +"bdc4843a": "lockAddressAfterITO(address,address)", +"bdc6d9ab": "schedules(uint256)", +"bdc742fc": "updAcceptDonate(bool)", +"bdc74e23": "_processTokensAssgin(address,uint256)", +"bdc850d6": "ALasser()", +"bdc8e551": "isICOOver()", +"bdc95b32": "registerIdentity(string,string,string)", +"bdc963d8": "getUIntValue(bytes32)", +"bdc99152": "Token_1_Balance(address,address)", +"bdcab795": "addBeneficiary(address,uint256,uint256,uint256,uint256,bool)", +"bdcafc55": "setSaleFee(uint256)", +"bdcbd9d1": "howMuchCanXContributeNow(address)", +"bdcbda5c": "AccountTransfersThawed(address,bool)", +"bdcc3439": "add_master(address)", +"bdcc809a": "setReleaseCompany(uint256,bool)", +"bdccd1af": "TokenHolder(uint256,address)", +"bdcd0262": "addRecord(bytes32,bytes32,bool)", +"bdcd21a1": "spawnRaceManual(uint256,uint256,bool)", +"bdcd3071": "LogBonusLOTRedemption(address,uint256,uint256)", +"bdcdc0bc": "updateTotalAvailable(uint256,uint256)", +"bdcdc258": "transferAllowed(address,address,address,uint256)", +"bdce46be": "PriceIncrease(string,uint256,address)", +"bdced258": "VendCrowdsale(uint256,uint256,uint256,address,uint256)", +"bdceed0b": "gvToken()", +"bdcefb62": "FRST_CRWDSALE_RATIO()", +"bdcf49b5": "changeContractStatus(address,bool)", +"bdcfbc37": "ANMInflationVesting()", +"bdd079fc": "addManyToWhitelist(address[],uint256[],uint256[])", +"bdd088e9": "littleMonster()", +"bdd1de62": "delWhitelists(address[])", +"bdd2ae24": "add(bytes,int256,uint256)", +"bdd2d286": "drawPlayer(address,address)", +"bdd30406": "successfulWithdraw()", +"bdd36562": "getBonusByAddressAndIndex(address,uint256)", +"bdd3abd9": "MjolnirWebsite()", +"bdd3fea0": "set_for_sale(uint256)", +"bdd41d4c": "ParagonCoinToken(address)", +"bdd50908": "approveWithdrawAddress()", +"bdd5be2f": "performBuy(address[8],uint256[6],uint256,uint256,uint8,bytes32,bytes32)", +"bdd5f8da": "weiPerSgd()", +"bdd62b7b": "defective(bytes32,uint256)", +"bdd75267": "OPULENCE()", +"bdd7908b": "getFishParams(uint256,uint256,uint256,address)", +"bdd7c220": "CryptessaLiquidCoin()", +"bdd83add": "isAllocated12()", +"bdd8a366": "g1()", +"bdd8f051": "SmartOToken()", +"bdd9f4e7": "batchInnerTransfer(address[],address[],uint256[],uint256)", +"bddac117": "SetAmount(string,uint256)", +"bddae40e": "setCommittee(address)", +"bddb7c83": "setUserBlacklisted(address,bool)", +"bddba4eb": "grantRole(address,string)", +"bddbe244": "get_vice_pic(uint8)", +"bddcfead": "MakeWinner(address,uint256,uint256)", +"bddd0abd": "ExampleToken(uint256)", +"bddd1e7e": "WITHDRAWAL_END_TIME()", +"bddd3202": "_tryTriggerPayout(uint16,uint256)", +"bddd3a6b": "step7()", +"bddefc06": "withdrawed(address,uint256,string)", +"bddf66ff": "claimMigrate()", +"bde18839": "OHGVientiane()", +"bde1f585": "endCrowdsalel()", +"bde236a5": "checkClaimEntitlement()", +"bde27f4a": "forwardToHotWallet(uint256)", +"bde2ddf2": "_forwardFunds(address)", +"bde4e7c2": "tokenAddFee()", +"bde5c4a2": "_stealCardWithId(uint256)", +"bde60ac9": "donate(uint64,uint64)", +"bde66362": "_createNinja(uint256,uint256,uint256,uint256,address)", +"bde6a5a9": "burnPrice()", +"bde7ef86": "SynTokenCrowdsale()", +"bde7fa7d": "removeWhiteListed(uint256)", +"bde842ac": "getJobStatus(uint256,uint256)", +"bde86dd1": "tokenExpirationTime(uint256)", +"bde8a93e": "setBankroll(address)", +"bde8c509": "mintIdentityTokenDelegated(address,address,uint8,bytes32,bytes32)", +"bde8cd4d": "icoPool()", +"bde97455": "SCRefundVault()", +"bdeb130c": "doPayment(uint256,uint256,address)", +"bdeb45b8": "expireIfNecessary()", +"bdeb9fb4": "tokensAvailableForSale()", +"bdec5cce": "LotteryRoundCompleted(bytes32,uint8,bytes4,uint256)", +"bdeddb45": "setMyICOContract(address)", +"bdee21ff": "test_oneValidAssertFalse()", +"bdef744b": "PriceTwoDisable()", +"bdf1211e": "getPercentBurn()", +"bdf1e7cf": "getProviderReward(address,uint256)", +"bdf27b50": "setPOOL_edit_21(string)", +"bdf2a0f5": "fundDaoFor(uint256,uint256)", +"bdf3390e": "checkPwnData()", +"bdf384a8": "peekUpdated()", +"bdf391cc": "getPair(uint256)", +"bdf3c4ae": "stock()", +"bdf44067": "TCASHx()", +"bdf499e1": "DappHunt()", +"bdf4bb73": "DatToDtrcNumerator()", +"bdf4e7c6": "TaskRegister(address,address,address)", +"bdf5fba1": "COMMUNITY_POOL_ADDR()", +"bdf63c15": "RSPLT_F()", +"bdf692f4": "Propersix()", +"bdf6fb56": "requestMilestonePayment(uint256)", +"bdf70087": "getInvestor(bytes32,uint8)", +"bdf70de1": "SportXToken()", +"bdf7220f": "getFinalTeams()", +"bdf75a6a": "PRICE_RATE_FIRST()", +"bdf7716d": "getNodeHeight(bytes32)", +"bdf79c9d": "Adapter(address,address,address)", +"bdf7a8e6": "airdrop(uint256,address[])", +"bdf7f22f": "puremail()", +"bdf82b2a": "killFrost()", +"bdf86a66": "give(address)", +"bdf88d34": "stopTest()", +"bdf944b3": "depositAffiliate(uint256)", +"bdf99bd4": "AntPetTempleToken()", +"bdf9f646": "disApprove(address)", +"bdfaa337": "totalAlloc()", +"bdfb481d": "ABDEL_ALLOCATION()", +"bdfbab66": "getReferals(address)", +"bdfc0522": "investBounty(address,uint256)", +"bdfd582b": "FailClosedVault(address,address,uint256,uint256,address,uint256)", +"bdfd6257": "settingNameExist(string,address)", +"bdfdb519": "accept(string,uint256,uint16)", +"bdfdbf56": "read_u16_array()", +"bdfe7d47": "addresses(string)", +"bdff85cf": "ArrAccountIsNotFrozenForReturn(uint256)", +"bdff9fca": "checkTotalPaid()", +"bdffd282": "SIZE()", +"be0043bc": "removeMinterByIndex(uint256)", +"be007380": "DapdapNiubi()", +"be01bc87": "carTaxiCrowdsaleAddress()", +"be02bc3c": "internalTransfer(address,address,uint256,uint256)", +"be030bd8": "_setToken(address)", +"be038478": "createPermission(address,address,bytes32,address)", +"be03c602": "test_get()", +"be040fb0": "redeem()", +"be041614": "storedDataInBytes()", +"be048d04": "getOrganizationalCertAddressByID(string)", +"be0522e0": "inflation()", +"be063693": "intermediadorAprovaPagamento(bool)", +"be0638e4": "WealthShare()", +"be06ae25": "VirsymCoin()", +"be06e4e8": "inheritedConstant()", +"be08728f": "_setRemovalPrice(uint256)", +"be08d744": "TFcoin(uint256,string,string)", +"be099e7d": "endICOs()", +"be0ad4d1": "calculatePayoutVariables()", +"be0ca01b": "resetChallenge(uint256)", +"be0d4da4": "produceLottoNumber(uint256,uint256)", +"be0da251": "CANCELLED_FEE_FLAG()", +"be0e9d75": "removeWorker(address,address)", +"be0ecd32": "synthInitiatedExchange(address,bytes4,uint256,bytes4,address)", +"be0f0a50": "setPriceStep5(uint256)", +"be0f27cf": "rejectBountyTransfer(address)", +"be0f6bcb": "End10()", +"be104849": "AutorizeRefund()", +"be10862b": "partner()", +"be10c33d": "LogOperatorRem(address)", +"be116c3b": "removeProxy(address)", +"be11ce2f": "minEthContribution()", +"be1271c4": "setPrice(uint8)", +"be140381": "firstEntranceToSaleStateUNIX()", +"be14e5fc": "ETH530on420()", +"be154a18": "Partial8Transfer()", +"be160a92": "ERC20token(uint256,string,uint8,string)", +"be162060": "validCrowdsale()", +"be163d75": "validPurchase(uint256)", +"be165566": "setTokenBankrollAddress(uint8,address)", +"be169856": "getOriginByIndex(uint256)", +"be16dccd": "tomoDeposit()", +"be177c6a": "addJoinAirdropQuest(address)", +"be17a8b1": "doCustomAirdrop(address,address[],uint256[])", +"be17be5d": "total_minted()", +"be189035": "modifyIndividualCap(address,uint256)", +"be18a08b": "finishUpRound(int256,string)", +"be190032": "timespan()", +"be19d926": "Britishcoin()", +"be1abba5": "payoffAmount()", +"be1b7b4c": "FIRST_UNLOCK()", +"be1c766b": "getLength()", +"be1eefbf": "hotStore()", +"be1ef5c1": "approveWithdraw(address,address)", +"be1faaaf": "depositCoupon(address[2],uint256[7],uint8,bytes32[2])", +"be1ff08b": "sbtToken(address)", +"be20d298": "AxiePresale()", +"be20f9ac": "getSlotInfo(uint256)", +"be213c2d": "startBoughtExit(bytes32[],uint256,bytes32[])", +"be220272": "houseWithdraw()", +"be22f546": "daiToken()", +"be22f6aa": "LUYOCrowdsale()", +"be23d291": "requestPrint(address,uint256)", +"be241871": "isTxExist(bytes32)", +"be2430fe": "sendValues()", +"be25270f": "hash(string,uint256)", +"be25d0ce": "buyerCapHighEther()", +"be2671c9": "getUserBonusBalance(address)", +"be26733c": "Kill()", +"be268c3f": "batchSubmit(address[])", +"be275680": "submissionOpen(uint256)", +"be27b22c": "claim(bytes,bytes)", +"be2863ab": "addWalletsToWhitelist(address[])", +"be28f5db": "makeTokens()", +"be29184f": "mint(address,uint128)", +"be292552": "setMintAddress(address,address)", +"be297530": "Coinname()", +"be29783f": "commitVoteOnSpecialProposal(bytes32,bytes32)", +"be29d81f": "BRL_Omnidollar()", +"be2a2ff2": "getAccountBlockedFunds(address)", +"be2b1047": "hodlerTimeStart()", +"be2b5996": "designateAdmin(address,address)", +"be2d8b2d": "PowerToken()", +"be2dbe21": "Raffle()", +"be2dcd6c": "buyMFCoins(address,uint256)", +"be2eaad4": "expectedFunds(uint256,bool)", +"be2ef9f0": "secondWalletPercent()", +"be2f3059": "RcdGet()", +"be2fd146": "addMultiRequest(address,uint256,uint256,address)", +"be2ff4a9": "withdrawBank(uint256)", +"be30eda8": "transferAndLock(address,address,uint256)", +"be30f0a6": "setPurchaseLimits(uint256,uint256)", +"be317e7e": "ICOReserveLockUp()", +"be31b600": "CART()", +"be31ffed": "AOSToken()", +"be32cf8d": "mix()", +"be32eeba": "getFishIdByPos(uint256)", +"be3400b8": "CharityCashCoin()", +"be34dab3": "addBrick(string,string,uint256,string,bytes32[])", +"be354949": "setReservesForExchangeTokensWallet(address)", +"be35525d": "setPlayerAffID(uint256,uint256)", +"be357616": "withdrawFee(uint256)", +"be361f60": "retrieveChange()", +"be363e36": "sendMoneyBack()", +"be36e676": "Set(bytes32,bytes32)", +"be38e241": "activations()", +"be3912fa": "registerProduct(uint256,uint256,uint256,bytes,bytes)", +"be3945e4": "getFee(address,address,uint256)", +"be395cd5": "setPoliticsForJackpotParticipantsList(bool)", +"be3c33f4": "ZeroXCoin()", +"be3c8488": "previousStageIsFinalized()", +"be3c92a6": "setLimitTokenPurchase(uint256,uint256)", +"be3ca849": "getFunding(address,uint256)", +"be3cbb04": "iWantXJade(uint256)", +"be3daf55": "shouldLiquidate(bytes32,address,address,address,address,uint256,uint256,uint256,uint256)", +"be3dd131": "migrateFunds(address[])", +"be3dedae": "changeOwnership(string,uint256,uint256,address,address)", +"be3e33d5": "play(bytes1)", +"be3e41b1": "bonusFirstTwoDays()", +"be3eac25": "WithdrawEnabled()", +"be3ee935": "addClient(string,string,string,string,uint256,uint256,uint8,uint8)", +"be3f3471": "total_trades()", +"be3f34a1": "collectIncome(address)", +"be400cad": "KudosToken(string,string,string,uint8,address)", +"be4054b9": "commitReading(address,uint256,uint256,string)", +"be40887d": "sumDepth(uint128)", +"be408a5f": "winner_percentage()", +"be410448": "getERC20Id(uint256,address)", +"be427b1c": "setFinderFee(uint256)", +"be4299a6": "Maxsupply()", +"be4413fc": "Donator3()", +"be4474b4": "processFee(uint256)", +"be44e2d6": "getdeptreqscount()", +"be457017": "validateRefundSignature(uint8,bytes,address)", +"be45a26f": "variables()", +"be45af43": "InnovateToken()", +"be45cdb8": "crowdsaleTokenBalance()", +"be45d47e": "whitehatRecover()", +"be45fd62": "transfer(address,uint256,bytes)", +"be46203e": "Claim_TRAC_900()", +"be4663a1": "vestContract()", +"be46b94c": "ROLE_KNOWN_ORIGIN()", +"be46bffb": "verifyLottery(uint8,bytes32,bytes)", +"be46e9ca": "starting()", +"be46ee5f": "postNewAnswer(bytes32,bytes32)", +"be471027": "limitedSale()", +"be47dca1": "getNumberOfClients()", +"be482cc2": "getCurrentLotteryJoiners()", +"be48acc4": "MAX_PERSIANS()", +"be48d81e": "team_accounts(uint256)", +"be490a04": "Banned(address,bool)", +"be494573": "pureBalanceOf(address)", +"be4951e4": "setBroker(address,address)", +"be4a0910": "sendTokensSale(address,uint256)", +"be4a0b11": "preAssign(address)", +"be4a471c": "memoryFactor()", +"be4a6bad": "newOrder(address,uint256,uint256)", +"be4a7160": "closeDistribution(bool)", +"be4a90eb": "GoramCoin(uint256,string,uint8,string)", +"be4aba09": "tokenR6()", +"be4b1772": "withdrawToken(uint256,address)", +"be4bb31a": "WAmlingCoin()", +"be4c3a0c": "getContractOwner(string)", +"be4c45d5": "changeBuyingPrice(uint256)", +"be4c9e96": "TRONIC()", +"be4cbafd": "RichGoldToken()", +"be4cc281": "ManagerUpdate(address,address)", +"be4ce05c": "JULY()", +"be4d06cc": "setLLV_edit_16(string)", +"be4dbb5e": "getInvestorByValue(address)", +"be4dbe26": "getBlocklancerContractHolder()", +"be4ea54d": "setDeveloper(string,uint256)", +"be4eb0e9": "getUserFromId(uint256)", +"be4ebda3": "BOUNTY_SHARE()", +"be4f4fdf": "restrictedShare()", +"be50af2e": "tokenWithdraw(address,uint256)", +"be519862": "percDown(uint256)", +"be51bc0a": "FuncToken()", +"be523c23": "dungeonPreparationTime()", +"be5308ea": "BitplusToken(uint256,uint256)", +"be53874f": "emergencyFundReleased()", +"be53f968": "getPreSaleStart()", +"be54c568": "starting(uint256)", +"be54f214": "monthWithdraw()", +"be5638ff": "investor_contains(address)", +"be5648c3": "getResoType()", +"be56e037": "equipSingle(uint256)", +"be571e2e": "BigbomToken(uint256,uint256,address,address,address,address,address,address,address)", +"be571e8f": "getTokens(address,bytes32,uint256)", +"be572d52": "addItem(uint256,string)", +"be576364": "synthInitiatedFeePayment(address,bytes4,uint256)", +"be592488": "validateName(bytes)", +"be597faa": "_finishTge()", +"be59b4b1": "mostRecentCaller()", +"be5affd1": "address3a()", +"be5b9c74": "MultiSigWalletMock(address[],uint256)", +"be5babc2": "CryptoGems()", +"be5c2423": "failedVerificationSlashAmount()", +"be5df6cb": "findLover(address)", +"be5e72e0": "updateBasePrice(uint256,uint256,uint256,uint256)", +"be5ea335": "betERC20(address,bool,uint256)", +"be5eb443": "getScriptAction(bytes,uint256)", +"be5eeb2d": "getSociety(uint256)", +"be5f3d12": "allocateTokensForAdvisor()", +"be5f5a5b": "setSecretSignerByIndex(address,uint256)", +"be600276": "move(uint16)", +"be6002c2": "exec(address,bytes)", +"be6010f9": "calcHash(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,uint256)", +"be60988e": "getLotteryByID(uint32)", +"be60989d": "addCard(string,uint8,string,string,string)", +"be60be76": "TokenMigration()", +"be60e771": "ZAMZA()", +"be616e83": "processAP()", +"be621764": "TradeRegister()", +"be62e98e": "MIN_PRICE_SALE()", +"be6307c8": "getDraw(uint256)", +"be6340b8": "mintedDirectly()", +"be63c8ca": "Retire()", +"be63f7b1": "TobkaCoin()", +"be640921": "regInitAccount(string,string,string)", +"be65d234": "Owner_Changed(address)", +"be65d27a": "vaultDeposit()", +"be66399f": "setOuverture_effective(uint256)", +"be676ac6": "transfer_balances(address[])", +"be67f4fd": "ActualShareManager()", +"be6872af": "totalTokensForSold()", +"be6896c3": "PropellerheadSupport()", +"be692cd3": "erase_data()", +"be6ad6d2": "ForceEther()", +"be6ae331": "get_session_state(address,uint32,uint32)", +"be6b6ba6": "getVestingStageAttributes(uint8)", +"be6c03ff": "stakedForProposal(address,address,bytes32,bytes32)", +"be6c554f": "firstCheckpointPrice()", +"be6c61f5": "unsetIdentity(address,address)", +"be6c87ad": "item(address,address,uint256,bool,bytes)", +"be6cef0a": "msgExaminer()", +"be6d055a": "proxy(address,bytes)", +"be6d91e6": "getBalanceOfSender()", +"be6fc181": "getFeeParams()", +"be71021f": "_crownFreeze(uint256)", +"be7118a7": "Dilution(address,uint256)", +"be71248a": "payWinner()", +"be737f72": "toSmallestShareUnit(uint256)", +"be7385e3": "getPlayerSpaceships(address)", +"be73983a": "reservePR()", +"be73d879": "joinBytes(bytes,bytes)", +"be74264d": "getFeePercent()", +"be74381f": "calculatePercents(address)", +"be743ccb": "MCCPP()", +"be754ba4": "buy20Price()", +"be760488": "assign(address,uint256)", +"be782f58": "setBreedTimeout(uint32)", +"be78632e": "nstDeposit()", +"be788e70": "getWithdrawableBalance()", +"be78bb7a": "transferCallGas()", +"be78e656": "buyXaddr()", +"be79ca77": "preSaleBonus3Amount()", +"be7a1540": "setlvlNfee(uint256)", +"be7a3164": "getNextAuditRequest()", +"be7aa7be": "SportStarToken()", +"be7b4858": "isOpenDistributionClosed()", +"be7c06ba": "iniOwner()", +"be7c29c1": "getNewDAOAddress(uint256)", +"be7ccd7e": "setupMiniGame(uint256,uint256)", +"be7cddf8": "TwoD()", +"be7e2848": "SkillChainContributions()", +"be7edebe": "setURIBase(string)", +"be7f5d23": "addressesReserving(uint256)", +"be7fdab1": "returnMoney(address)", +"be80073a": "SentTo(address,address)", +"be802f05": "getIcoTokensSold()", +"be80dcfd": "floatEconony()", +"be81d5bf": "CROWD_WEEK3_PERIOD()", +"be82f56b": "drainToken(address,address)", +"be82fffe": "allPolls()", +"be8360c5": "_maint_EndPromo()", +"be83a6b4": "ShitCloneslordReq()", +"be83b3c6": "LogFinishICO(address,address,address,address)", +"be83ff83": "vipRate()", +"be854def": "robPantryT(address,uint256)", +"be85bf3b": "PaymentWithdrawn(uint256,address,uint256)", +"be85cbcd": "makeLoan(address,uint256)", +"be85e4ef": "initEngineer()", +"be86d5a7": "makerTransferEther(address,uint256)", +"be86d996": "SINGLE_SALE_MULTIPLIER()", +"be87662b": "inviteProfit(address)", +"be87bcfc": "getReport(uint256,uint256)", +"be87c1ab": "returnBalance(address[2],uint256[7],uint8,bytes32[2])", +"be882d91": "setQuestionFee(address,uint256)", +"be888bd7": "devteamReserve()", +"be89900b": "PIOE()", +"be8a4737": "withdrawalT4T()", +"be8a550d": "ICO(address,address)", +"be8acd3f": "ordersLength()", +"be8b4f45": "HussyToken()", +"be8bd3df": "IlumXToken()", +"be8c1bcc": "batchDrop(address[],uint256[])", +"be8cd7b8": "participatePresaleNow()", +"be8db3cf": "deadlineBlockNumber()", +"be8dd49a": "getTokenUserCounter()", +"be8ecef3": "requestAddOwner(address,string)", +"be8eef8e": "hasOpened()", +"be8f316a": "testmsg()", +"be90be7f": "clearPoolsDone()", +"be9117cc": "curryChickenToken()", +"be912a0a": "getAyantDroitEconomique_Compte_7()", +"be913b6f": "ETH_FUND(address)", +"be916531": "test_OverSixtyPercent()", +"be91de53": "frozenBalanceOf(address)", +"be91ebe5": "tgrSettingsChangeRequest(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"be92ccfd": "setDisableBet(uint256)", +"be92f334": "astrSold()", +"be9413a7": "_cancelRole(address,address)", +"be95e01a": "payout(uint256,address)", +"be96031e": "playerinfo(address)", +"be96bb92": "_isFullOrNull(uint256,uint256)", +"be96faf7": "AWYManKeepChain()", +"be975f57": "CreateSTR(address,uint256)", +"be981ff4": "transferOwnershipForVanityURL(address)", +"be986420": "quarters()", +"be987c11": "PriceDecrease(string,uint256,address)", +"be988dbc": "BroCoin()", +"be999705": "addFunds(uint256)", +"be99a797": "setNewRegister(int256,string,string,uint256)", +"be99a980": "setAddress(bytes32,address,bool)", +"be99c50f": "purchaseInternal(uint256,address)", +"be99ed6f": "getCompte_41()", +"be9a6555": "start()", +"be9a9a28": "getRequestStatus(uint256,uint256)", +"be9aa8ac": "setSaleContracts(address,address,address)", +"be9afac7": "getDaysInMonth(uint256,uint256)", +"be9b076d": "Initialized(uint256)", +"be9b3282": "cookUpFee()", +"be9b3e8a": "reclaimEth(uint256)", +"be9ba97f": "maxContributionPerAddress()", +"be9c1add": "heldBalanceOf(address)", +"be9d89c5": "createTokenToMarket()", +"be9ddfed": "getSanTimeLastMove(uint256)", +"be9e1080": "_escrowPaymentEarning(address,bytes32,uint256,uint256,address,address,bool)", +"be9e3774": "deathData_f18()", +"be9e4697": "getDiscountTrancheDiscount(uint8)", +"be9f2dc0": "hourPotHighscore()", +"be9f7a20": "setInsertCar(bytes32,uint256,uint256,uint256,uint16,uint8,uint8,uint8,uint8,uint8)", +"be9fa8dc": "Ethex(address,address,uint256,uint256,address,uint256)", +"bea046a1": "cashOutShip(uint32)", +"bea05440": "CurrentStatus(uint8)", +"bea10370": "hasRecentPrice(address)", +"bea124a6": "query(bytes,bytes,int256)", +"bea1dcf8": "taxCollector()", +"bea24735": "create_a_new_market(address,uint256,uint256,uint256)", +"bea28a30": "undoTransferOwner()", +"bea31228": "ObirumIssued()", +"bea3c8b3": "PardusNetwork()", +"bea40bad": "composeJingle(address,uint32[5],uint32[5],string,string,uint8[20])", +"bea412fa": "RedBUX()", +"bea433a9": "TriumHolding()", +"bea4ae88": "saleDue()", +"bea4c4ee": "setIBalance4(uint256,uint256,uint256)", +"bea50ae3": "setConfirmationPeriod(uint256)", +"bea51ec2": "SunnyX()", +"bea51f81": "addToKYCList(address)", +"bea5f9cd": "newPokemon(uint256,uint256,uint256)", +"bea677dd": "MCS()", +"bea69bb9": "Bal()", +"bea70578": "getPOOL_edit_16()", +"bea72c0a": "dsAdd(uint256,uint256)", +"bea76c3c": "disputeBlockNos(uint256)", +"bea7c13a": "gasPriceForCompensationAtHomeSide()", +"bea8bd27": "updateVettingTime(uint256)", +"bea948c8": "GetGift()", +"beaa4765": "setComplete(bool)", +"beab0638": "TokenAllocate(address,uint256)", +"beab3537": "isClaimed(bytes32,string)", +"beab9848": "SelfllerySaleFoundation(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint8)", +"beabacc8": "transfer(address,address,uint256)", +"beabb2c2": "proxyEnableRefunds()", +"beabdb7b": "isPermitted(bytes32)", +"beabeb3c": "getTheRandNum()", +"beac4bc3": "pauseUET()", +"beacf74f": "test_insert_findWithHintPrevDecreased()", +"bead0513": "leaveCommunity(address)", +"bead21a6": "lockAtTime()", +"bead45cf": "deposit_amount()", +"beadd203": "confirmWarranty(string,string,string)", +"beadf957": "cancelOperation(bytes32)", +"beae207f": "startAirdrop(uint256)", +"beaf56a6": "changeInsurer(address)", +"beafa2dc": "sacToken(uint256,string,string)", +"beb08ab9": "projectWallet()", +"beb0a416": "website()", +"beb1274d": "medianize(uint256[])", +"beb2b55d": "balanceHaben(address)", +"beb2bad6": "SHITP()", +"beb318a0": "updateSelfDropStageState(string,bool)", +"beb38b43": "set(bytes12,address)", +"beb3a38f": "capDay1()", +"beb40d58": "queryShare(address)", +"beb5f658": "compare(address,address)", +"beb6422f": "setClue1(string)", +"beb7de13": "updateCaps(uint256,uint256,uint256,uint256)", +"beb7fd4e": "_setMany(address,uint256,uint256[],uint256[],bool)", +"beb92f55": "setCaller(address)", +"beb9571c": "User_3()", +"beb96be5": "releaseFor(address,uint256)", +"beb9716d": "canMint()", +"beb9c90d": "wavesGW()", +"beb9d27e": "prepopulate(address)", +"beb9df86": "fwdToENS(bytes)", +"beba0b11": "ScallopCrowdsale(uint256,uint256,address,address)", +"beba285d": "privatePlacementAllocatingToken()", +"bebaa421": "setTrustAddress(address)", +"bebb7756": "RecievedDonation(address,uint256,string)", +"bebb7e60": "kscBurnFrom(address,uint256,string)", +"bebc3bfb": "requestWithdrawal(address,uint256,string)", +"bebc9d93": "buyCopyright(uint256,string,string)", +"bebcc045": "description(bytes32)", +"bebd284e": "registerCoinData2(address,uint256,address)", +"bebda5b9": "WhitelistUpdated(uint256,string,address)", +"bebdd5ca": "GenericCrowdsale(address,uint256,uint256,uint256)", +"bebe3c88": "advisorsPeriodLength()", +"bebe4f6d": "Standard_5()", +"bebeb73f": "createRoom(uint256,uint256,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"bebf10d5": "WorkflowState()", +"bebf8498": "addCardToRegistry(address,bytes32,uint256)", +"bebfe207": "publishMessage(string)", +"bec0d799": "removeBook(uint256)", +"bec10cde": "increaseStake(uint256,uint256)", +"bec13af1": "doBuyerCancel(bytes16,address,address,uint256,uint16,uint128)", +"bec17f69": "isPreIco()", +"bec24a0d": "payJackpot1()", +"bec272da": "IotaGoldToken(address)", +"bec3150e": "EthereumBrilliant()", +"bec3e6f3": "overStage(uint8)", +"bec3fa17": "transferTokens(address,uint256)", +"bec507ce": "switchfun()", +"bec5e7b2": "playerDataRecord(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"bec60bd2": "change_token_price(uint256)", +"bec6bc67": "adoptionRequests(bytes5)", +"bec6eb15": "buyGladiatorChest(uint256)", +"bec77cb1": "getOwnerCards(address)", +"bec7abfd": "getBounsEarningsInRound(address,uint256)", +"bec809ec": "tomoConvertRate()", +"bec81091": "executeEtherDeltaBuy(uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,bytes32,uint256)", +"bec823c6": "BitcoinGreen()", +"beca159b": "registerUser(address,string,uint256,uint256,uint256)", +"beca40df": "PERC_TOKENS_TO_DEV()", +"beca4a8e": "TeleGrams()", +"beca7440": "right52(uint256)", +"becb1f35": "isForking()", +"becb44da": "token_sale_start_block()", +"beccdb77": "lastFeesCollected()", +"beccdd91": "updateSecPerBlock(uint256)", +"becd0580": "payEtherToWinner(uint256,address)", +"becd283f": "getPurchaseCount()", +"becd7027": "withdrawPurchasedTokens()", +"becda0ea": "tune(uint256)", +"bece1b22": "GameData(address,bytes32[],bytes32[],int256[])", +"bece2ea1": "tokenPriceIncremental()", +"bececd4e": "updateVerificationStatus(address,bool)", +"becee565": "GodeCoin(address,address)", +"becf0426": "registerAffiliate()", +"becf3add": "bonusPercent()", +"becf917f": "DistribFundsReceiverAddress()", +"becf9ce1": "removeFromAccountList(address)", +"becfbf69": "peekLastNonce()", +"bed03fdb": "winnerSelect(uint256)", +"bed09038": "updateMember(address,address,uint256)", +"bed0a8e5": "testRegisterSwarmEth()", +"bed0d1b9": "validTransfer(address,uint256)", +"bed18966": "getCompletedFlag(uint16,uint16)", +"bed1a924": "totalICOSupply()", +"bed1b8b9": "convertToInt(string)", +"bed1cfcd": "addToOwnership(address)", +"bed230d0": "burningMansCount()", +"bed25542": "onTokenReceived(address,uint256,bytes)", +"bed289c9": "CPolloToken()", +"bed315f8": "setRate(uint16)", +"bed33cae": "getCancelableAt(uint256)", +"bed34bba": "compareStrings(string,string)", +"bed36fee": "test_insert_null()", +"bed411a0": "CheckPrize(address)", +"bed43ffa": "CoinCrowdToken()", +"bed47ed8": "sId()", +"bed50ef8": "emitFeesWithdrawn(address,uint256)", +"bed531fd": "playersAmounts(uint256)", +"bed54a24": "ert()", +"bed6701f": "lastweek_winner2()", +"bed7437f": "setHydroTokenAddress(address)", +"bed866f6": "donations(bytes32)", +"bed9404f": "calculateAccountLiquidity(address)", +"bed9588b": "getUint256Max()", +"bed99850": "burnRate()", +"bed99dec": "replaceSecurityDepositRegistry(address)", +"bed9d712": "chargeJNT(address,address,uint256)", +"bed9d861": "withdrawStake()", +"beda363b": "dynamicReverse(uint256[])", +"beda86b9": "removeContributors(uint256[])", +"bedaa624": "setBZRxToken(address)", +"bedb86fb": "setPause(bool)", +"bedbb1a5": "saucePoolTotal()", +"bedc17ea": "testFailSetName()", +"bedc7796": "ownerCountOfCard(address,address)", +"bedca054": "Crowdsale(address,address,uint256)", +"bedcb4fc": "EthlanceContract(address)", +"bedcf003": "ownerBalance()", +"bedd12a5": "depository()", +"bedda13f": "setData_1(string)", +"bedddbc4": "darkcoin()", +"beddf557": "NOLLYCOIN(address)", +"bede2cac": "joinedCrowdsales(uint256)", +"bede4bd8": "lockupOf(uint256)", +"bedecc06": "seatsCount()", +"bedefffe": "getOwnerName(address)", +"bedf0f4a": "Stop()", +"bedf8e75": "Netyul(uint256,string,string)", +"bee03488": "getAllSSP()", +"bee066a8": "blocksUntilWin()", +"bee11672": "allowBundlingMultitoken(uint256)", +"bee1351e": "_getJYPCBonus()", +"bee14b3d": "getDevBalance()", +"bee16cae": "getCodeToken(uint256)", +"bee200cb": "underLimit(address,uint256)", +"bee2135e": "prefixedHash(string)", +"bee23c42": "contain(address[],address)", +"bee28042": "LVX()", +"bee2e134": "ethCollected()", +"bee36f37": "disableMiniSwapLock()", +"bee40aa4": "setCallType(uint256,uint256)", +"bee47606": "originalPricesBySpinner(uint256)", +"bee4bbeb": "unsetIsBuyByAtom(uint256)", +"bee4cc6b": "getBAB(bytes32,address)", +"bee588e9": "registerCert(bytes32,bytes,uint256)", +"bee5cdca": "getProjectById(uint256)", +"bee5ea6d": "PurgeCoin()", +"bee604ea": "addGame(address,string,uint256)", +"bee6348a": "presaleOpen()", +"bee712da": "buyZone(uint256)", +"bee96d9f": "updateGoldReferrer(address)", +"bee98dff": "get(string,int256)", +"bee9f6f3": "_getVATToCollect(uint256,uint256,address)", +"beea7bfb": "newSubdomain(string,string,string,address,address)", +"beea887c": "totalVCCoin()", +"beeae9a6": "Ather(uint256,string,string)", +"beeb0578": "processFundingFailedFinished()", +"beeb0a82": "SeaCoin()", +"beeb1b5d": "amountRaisedIsc()", +"beeb6d87": "withdrawCoin(bytes4,bytes32,uint256)", +"beebeff7": "tokenForAdvisor()", +"beec1caa": "issueCertificate(string,string,string)", +"beee5852": "opponentAmount()", +"beee9a34": "TIER4()", +"bef17ed0": "totalTeamContributorIds()", +"bef19a8b": "narcosByDistrict(uint8)", +"bef23131": "_createBurnLot(address,uint256)", +"bef28736": "UpgradedController(address)", +"bef2e0d8": "Variant()", +"bef35ccb": "requestClose(uint64)", +"bef39963": "releasedTokens()", +"bef3a083": "deadLine()", +"bef44f18": "transferChild(uint256,address,address,uint256)", +"bef4876b": "finished()", +"bef4f95d": "alarms(uint256)", +"bef5223f": "withdrawTokenToFounder()", +"bef55ef3": "readData()", +"bef566ef": "requestForMigration(address)", +"bef5bb45": "checkHash(address,string)", +"bef72fa2": "controllerLookupName()", +"bef7a2f0": "Fee()", +"bef7c258": "tierStartTime(uint256)", +"bef80387": "KYCCrowdsale(address)", +"bef8f7a5": "userAddressAdded(address)", +"bef90b94": "GetShipsByOwner(address)", +"bef973e4": "getUnclaimedFunds()", +"bef97c87": "transfersEnabled()", +"bef9e4ce": "getPreviousProfit(uint256)", +"befa1e2f": "totalBets()", +"befa7d5a": "addressFundDevelopers()", +"befaed75": "Sell_Offer(uint256,uint256,uint256)", +"befb6e56": "calCandidate(address)", +"befbae04": "completeIcoPart2()", +"befc3e2b": "getInvested()", +"befc5c32": "getOwnersItemList(address)", +"befcc34d": "updateSignedDealsCount(address,uint256)", +"befda2ff": "postIcoPhaseCountdown()", +"befe0e79": "infinity()", +"befe6299": "buySPIKE()", +"befed472": "SKToken(uint256,string,string)", +"beff6dbf": "getInsurancesCount(bytes32)", +"beff778e": "CoinBazarCap()", +"beff90dc": "isVersionContractOrLogic()", +"beffc416": "set_address2(address,address)", +"befff6af": "setUseDELEGATECALL(bool)", +"bf02dbcf": "randNums()", +"bf03e092": "join_address_pay(uint256,address)", +"bf03ef7d": "setDailyTokenLimit(uint256)", +"bf04820b": "totalLosses()", +"bf050334": "resolveDisputeBuyer(string,address)", +"bf052a8a": "countConfirmations(uint256)", +"bf059dc2": "_nonce1()", +"bf05cbe6": "hasFourStepWithdraw()", +"bf05d653": "endVesting(address)", +"bf06444b": "BrokenContract()", +"bf07aae7": "CQT(uint256,string,uint8,string)", +"bf082e38": "GICT()", +"bf084408": "submitProof(bytes32)", +"bf0872ef": "totalDiscount(uint256,uint256,string)", +"bf08778c": "seeAllNumbers()", +"bf09466f": "addEntryIn4WeekPeriods(address,uint256,bool,uint256)", +"bf0a07bd": "getHardCap()", +"bf0a53f5": "Notarize(bytes32)", +"bf0aaaf5": "OWN_ChangeState_locked(bool)", +"bf0af1ba": "checkProof(bytes,bytes32,bytes32)", +"bf0b0c52": "PaisaToken()", +"bf0b47ce": "getWinLoseAmountByBettingOwnerInGamblingParty(uint256,address)", +"bf0b88aa": "CanYaDao()", +"bf0bb225": "recoverAddressFromSignature(bytes32,uint256,address,address,uint256,address,address,uint256,bytes32,bytes32,bytes)", +"bf0c4343": "dividends_by_type(address,bool)", +"bf0ce059": "isRootAuthority(address)", +"bf0d44d5": "testControlCreateWithParentsForeignNotInUse()", +"bf0d4f03": "EventLevelUp(uint32,uint32,uint32)", +"bf0d51be": "COINLAW()", +"bf0dc1c0": "IICToken(uint256,string,string)", +"bf0df0c1": "Start3()", +"bf0e4900": "randomWithNonce(uint256)", +"bf0e63d7": "FastGrowthToken()", +"bf0e9d61": "getProof(string,string)", +"bf0f5495": "volunteerWrite()", +"bf0f88ae": "Google()", +"bf101b32": "isTransferAuthorized(address,address)", +"bf1031d9": "proposeTemplate(address,address)", +"bf10bde1": "calculatePrize(address,uint256,uint256)", +"bf1152db": "preTransfer(address,address,uint256)", +"bf11f412": "buyCreditsAndSpendAndRecover(string,uint256,uint8,address,uint256,address)", +"bf120ae5": "freeze(address,bool)", +"bf12165e": "fillUpSlot(uint256,uint256)", +"bf125c49": "balanceIsZero(address,string)", +"bf12bf4f": "transformContract()", +"bf13633c": "setvalues(string,string,string,string,string,string)", +"bf137795": "canSpawnAs(uint32,int256,address)", +"bf1482fa": "getDonators()", +"bf14c119": "fund(bytes32)", +"bf14dcbf": "collectStakingBonusTokens()", +"bf152765": "userBalance()", +"bf15a645": "add_numbers(uint256)", +"bf15d827": "issueTDETokens(address,uint256)", +"bf15e42a": "CoinClaim(string,string,uint8)", +"bf15e64c": "setPlayerLimit(uint256)", +"bf15ea76": "transferrableTime()", +"bf16e9e8": "PccToken()", +"bf16ec99": "_computeCut(uint128)", +"bf176c34": "profitAddr()", +"bf1792b3": "toHex(uint256)", +"bf187478": "shift_left(uint64,uint256)", +"bf18dfbe": "PhantomToken()", +"bf190c8e": "GACToken()", +"bf1a2e52": "NucleusVisionTokensMinted(address,uint256)", +"bf1b31c2": "ThirdPartyPlatformAddr()", +"bf1b5f19": "withdrawRequest(int256,int256)", +"bf1bb055": "getCCH_edit_14()", +"bf1c30f5": "applicationNameTaken(string)", +"bf1c8016": "closedSaleWallet()", +"bf1cd416": "GrowthPool_Released()", +"bf1d4c66": "lastPurchaseTimestamp()", +"bf1dfb8a": "totalBattles()", +"bf1e799b": "getTimelock(address)", +"bf1e8497": "preCrowdMinContribution()", +"bf1fe420": "setGasPrice(uint256)", +"bf205ebc": "luckyNumber()", +"bf208e00": "setMinAcceptedAmountInPresale(uint256)", +"bf2095a4": "sellManually(address,uint256)", +"bf212637": "getMatronId(uint256)", +"bf21e45d": "changeCrowdSaleDates(uint8,uint256)", +"bf22c457": "getJob(uint256)", +"bf22d670": "boolCallWithArray(bool[4])", +"bf22f63d": "PasswordChallenge(bytes20,bytes32)", +"bf23aec2": "getplaypool()", +"bf23b411": "eosPRIVATE(uint256,uint256)", +"bf24a794": "getMostVotedOptions()", +"bf24aad0": "set_maxDETsPerReturnLessThan(uint256)", +"bf24de3d": "transferTo(address[])", +"bf251bc6": "foundersPercentOfTotal()", +"bf251e7f": "TOTAL_CROWDSALE_FUND()", +"bf254915": "set_Gas(uint256)", +"bf255974": "GoldRegistry(address)", +"bf25bf2e": "ethToTokenRest(uint256,uint256)", +"bf25c597": "VernamToken(uint256)", +"bf25c61d": "isOwnerItem(uint256,bytes32)", +"bf260037": "addressFutureInvest()", +"bf2699e7": "initValidator(address,address,address)", +"bf26bf58": "MartinKoTokenHolder()", +"bf277962": "beneficiary(bytes32,int256)", +"bf27f585": "totalFundsReceived()", +"bf27fa7c": "OCoin()", +"bf2805e3": "getVestingAllocation(address,uint256)", +"bf2860a4": "allocateProofTokens()", +"bf28d7ee": "_setOutcome(int256)", +"bf29a854": "aboutFactoryWorkers(uint256)", +"bf29b90a": "changeAssociation(address)", +"bf2b7524": "updatePoolAddressCapTier2(uint256)", +"bf2c1cc8": "setDailyDepositLimit(uint256)", +"bf2c3dad": "TransferSellAgentSiteReg(address,uint256)", +"bf2c7cbe": "rateT4T()", +"bf2d9e0b": "totalRevenue()", +"bf2e694f": "getPreviousRequest(address,address)", +"bf2e727b": "BONUS_LEVEL_1()", +"bf303d14": "convertCountryIndexToBytes(uint256[])", +"bf30d943": "changefirst24Percent(uint256)", +"bf31196f": "offerPunkForSaleToAddress(uint256,uint256,address)", +"bf314640": "newResolution(string,string)", +"bf31d573": "send_to_darshil()", +"bf31fc58": "VestingMasterContract(address,bool)", +"bf326254": "unlockedCustomer(address)", +"bf32a4b6": "withdrawOwner2(uint256)", +"bf32bf97": "FailGuyTax()", +"bf33589b": "createImageTest()", +"bf33be97": "balanceOfOrder()", +"bf34040d": "_depositEthereum(uint256)", +"bf347404": "engravedToken()", +"bf34ea7d": "makeBatchPayment(address[],uint256[])", +"bf354389": "Eplay()", +"bf35588b": "setDepositRate(uint256)", +"bf35af36": "vestingOwing()", +"bf35d5de": "FighterCreated(address,uint256,uint256)", +"bf35d96b": "Lock(uint256,address,address,uint256,uint256)", +"bf363b18": "transferFee(address,uint256)", +"bf368399": "leaderboard(uint256)", +"bf36c5b0": "offerPieceForSale(uint256)", +"bf36dd16": "icoStartTimestamp()", +"bf3724af": "f2(uint256)", +"bf375fb5": "signFork(uint256,bytes32)", +"bf37689c": "showArrayLength()", +"bf37b8f1": "devOwed()", +"bf381f93": "changeVestingAddress(address,address)", +"bf385c00": "hasSufficientPaymentInternal(address,uint256)", +"bf390355": "initCasino()", +"bf391545": "getBAUU(bytes32,address,uint256)", +"bf395d3d": "getShipProduct(uint32)", +"bf3986ba": "TrustlessTransactions_TransactionHeight()", +"bf39ba48": "PRIVATESALE_SUPPLY()", +"bf3b1101": "transferWalletOwnership(address)", +"bf3b397b": "tokensToEthereum_(uint256)", +"bf3b9e38": "a(uint256,uint256,uint256)", +"bf3bcc41": "isMod()", +"bf3c1120": "setBytesValue(string,bytes)", +"bf3c685f": "TOTAL_VALUE()", +"bf3d6141": "setParams(uint256[],uint8[],uint256[],uint256[])", +"bf3d9995": "officialWebsite()", +"bf3da865": "scannedGoldCaps()", +"bf3e394e": "withdrawInvestment()", +"bf3e4a79": "CoreTeamAndFoundersWallet()", +"bf3e67eb": "Sk8coin()", +"bf3eea48": "privateFundEnabled()", +"bf3f493c": "AdminAdded(address,address)", +"bf40b904": "getIssuedBlock(bytes32)", +"bf40fac1": "getAddress(string)", +"bf417b9f": "MINING_SUPPLY()", +"bf419975": "MBLToken()", +"bf41e16f": "TOTAL_SHARE()", +"bf428c17": "addTrustedContractAddress(address)", +"bf4386a0": "maxMembers()", +"bf439e80": "mintForEarlyInvestors(address[],uint256[])", +"bf43e91c": "withdrawAffVault(uint256)", +"bf43ed4d": "dateInit()", +"bf43fffb": "getFirstEncounterIdFromDay(uint256)", +"bf44aa70": "setSellCommission(uint256)", +"bf44eb03": "liquidityReserveWallet()", +"bf45db19": "ArtGallery()", +"bf463341": "GetInitData()", +"bf4637e5": "jackpotPercent()", +"bf464090": "getManagerCut(uint256,uint256)", +"bf466c06": "getIntValueByKey(string,string)", +"bf46ad1d": "approveSponsorableJob(address,uint256,address,address[])", +"bf46d3df": "canSwap(uint256,address)", +"bf474766": "joinGame(bytes32)", +"bf485e95": "getElementLocation(address)", +"bf487801": "getContractBalanceOf()", +"bf48d8b5": "setCurrenseeFoundationAddress(address)", +"bf49649b": "Galatasaray()", +"bf49d120": "addReview(string,uint256,address)", +"bf4a185b": "ClientOrderEvent(address,uint8,uint128)", +"bf4a5485": "extLockBot(uint256,uint16)", +"bf4a63f8": "withdrawSOC(uint256)", +"bf4a79e6": "TimeChain()", +"bf4aaf86": "DefaultActionDelayed()", +"bf4aeff2": "payoutPeriodEnd()", +"bf4b72e3": "metaTransferHash(address,uint256,uint256,uint256)", +"bf4b7ddd": "updateEnabledStatus(address,bool)", +"bf4c06a1": "changeLogOwner(address)", +"bf4d0abe": "NatoExchangeToken()", +"bf4d5af4": "failures(uint256)", +"bf4d89b5": "parseInt(string,uint256)", +"bf4e9615": "calcPriceFromFactor(uint256)", +"bf4f7cc0": "onlyStores()", +"bf503a6e": "crowdSalePercentage()", +"bf506b47": "registerTXS(uint256,address)", +"bf5103a1": "AUTH_CANMINT()", +"bf5124d0": "displayCard(uint256)", +"bf52439b": "BezantERC20Base(string)", +"bf530969": "setLabel(string)", +"bf53253b": "NATIVE_ASSET()", +"bf5371e3": "sendOnRequest()", +"bf538b68": "BOXToken()", +"bf538f6f": "mintingCompleted()", +"bf539711": "buyTokensPresale(address)", +"bf53dd15": "HBToken(uint256,string,string,uint256)", +"bf53e3ba": "harvestQuorumPercent()", +"bf53fa61": "PRIVATESALE_END_DATE()", +"bf547894": "transferBatch(address)", +"bf54bb60": "Bitscor()", +"bf552230": "_changeAttributes(uint256,uint256)", +"bf5522da": "bounties(bytes32)", +"bf55486b": "Tanya()", +"bf559d11": "startTournament()", +"bf566599": "changeMyName(string)", +"bf5671fd": "changeSecOwner(address)", +"bf568a4c": "endIcoByCap()", +"bf56ac81": "withdrawAffiliateBalance(address)", +"bf56cc08": "emergencyClawbackEther(uint256)", +"bf5772b9": "escape(uint32,uint32)", +"bf583903": "remainingTokens()", +"bf58aad8": "privatePreSale()", +"bf59cdff": "getH3Amount()", +"bf5a451b": "foreverBlockBattleAddressUpdate()", +"bf5a4dd3": "unlist(uint256)", +"bf5a79ee": "_getSchellingRoundDetails(uint256)", +"bf5abfe3": "SimpleConsent(string,address,address)", +"bf5b2e5d": "MIND_FOUNDATION_AMOUNT()", +"bf5b4c0c": "getPendingExploreData(address)", +"bf5b6016": "addContract(string,address)", +"bf5b6234": "fillSellOrder(address,address,uint256,uint256,uint256)", +"bf5bb323": "donationMap()", +"bf5c7f9b": "emissionProvidersCount()", +"bf5c844b": "oneweek()", +"bf5cf791": "AIRDROP_TOKENS_NUMS()", +"bf5e54d2": "updateTokenImprint(uint256,bytes32,int256)", +"bf5f0169": "deliverTeamTokens(address)", +"bf5f2b67": "tradingBalanceOf(address,address)", +"bf5f4edf": "addMonsterClassExtend(uint32,uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8)", +"bf5f93e7": "twoHightestBidsDifference(string)", +"bf5fc2ee": "setStartsAt(uint256)", +"bf604019": "coinTradeStart()", +"bf606d14": "sendOneEtherToHome()", +"bf611c78": "OmniDex()", +"bf61b517": "FEE_SILO()", +"bf61e4b2": "AsuRaimu()", +"bf620a45": "lockAccount(address,uint256)", +"bf6211d9": "StripToken(address)", +"bf624273": "expiryBlock()", +"bf630bc8": "AliCoin()", +"bf6311c2": "_progressAdPrice(uint256)", +"bf632e67": "stateController()", +"bf6537a0": "crowdsaleBeneficiary()", +"bf654aac": "maxFeePercentage()", +"bf656791": "getMinContrib()", +"bf65d492": "FileName()", +"bf65dd32": "_checkAndCallApprove(address,uint256,bytes)", +"bf664892": "PARSECS_PER_ETHER_BASE()", +"bf66a5f9": "indSaleDeposit()", +"bf6713f6": "getGift(uint256)", +"bf671782": "handleReferrals(address,uint256,uint256)", +"bf686453": "PAN()", +"bf6888c8": "VESTED_PERCENT()", +"bf6896eb": "signAgreement(bytes32)", +"bf69d707": "punkBids()", +"bf6a10d7": "validateContributor(address,uint256,uint8,bytes32,bytes32)", +"bf6a1413": "hasSigned(address)", +"bf6ad320": "winnerPrice()", +"bf6ad32b": "getgbyte()", +"bf6afbaf": "FeePaid(address,address,uint256)", +"bf6b43a1": "upgradeCrystalMine()", +"bf6b6536": "SampleContractOther()", +"bf6c277a": "getTotalAccessorySeries()", +"bf6c4de9": "newPLCRWithToken(uint256,string,uint8,string)", +"bf6ca138": "issuedExternallyTokens()", +"bf6d91be": "addClient(address,uint256,uint256,uint256)", +"bf6d9abd": "unlockTransfer()", +"bf6deda4": "createLotto(bytes,bytes,bytes10,bytes10,bytes)", +"bf6eac2f": "stake(address,address,uint256)", +"bf6eb070": "MAX_ALLOWED_STAGE_2()", +"bf6ec777": "takeFee(uint256,address)", +"bf6edbd9": "mintFrozen(address,uint256)", +"bf6f7755": "transferBaseOwnership()", +"bf7035c3": "getSaleContractDepositEtherMin(address)", +"bf70a985": "PRESALE_ETH_IN_WEI_FUND_MAX()", +"bf70bd75": "stopPreIco_step2()", +"bf716708": "TOKEN_SUPPLY_SEED_PRESALE_LIMIT()", +"bf730997": "modifyGuess(uint256,uint256,uint256)", +"bf733e29": "oraclize_newRandomDSQuery(uint256,bytes,uint256)", +"bf735b13": "createSale(bytes32,uint256)", +"bf737c87": "JackpotWon(address,uint256)", +"bf7408de": "TAJ()", +"bf742d56": "canExecuteArbitraryCode()", +"bf748655": "isPaymentRegistered(bytes32)", +"bf748e47": "get_pre_kyc_iconiq_bonus_numerator(address)", +"bf7540d2": "getMoneyCount()", +"bf754558": "conversionsEnabled()", +"bf75553a": "sacarWEA()", +"bf75fdb5": "CreateShortAlias(bytes32)", +"bf77aa1f": "updateListing(uint256,bytes32,uint256)", +"bf77afdb": "TokensReserved(uint256)", +"bf7929a6": "refundeadline()", +"bf7abee6": "SetAuth(address)", +"bf7b69ee": "payDebt(address)", +"bf7ba12a": "LupeShares(address,address)", +"bf7c734e": "setMinSell(address,uint256)", +"bf7c775e": "RESERVED_RESERVE_UNLOCK_AT()", +"bf7e214f": "authority()", +"bf7e4026": "pizza_machine(uint256,uint256,uint256)", +"bf7e7f62": "MaxCouponsPaymentUSD()", +"bf7ea21c": "addWhitelistMember(address[],uint256[])", +"bf7f10fe": "isTransferShipment()", +"bf7f3cfe": "getVotesPerProposal()", +"bf7f8b89": "EthernetCash()", +"bf7ff81e": "bitwordsWithdrawlAddress()", +"bf815059": "updateUnidentifiedSaleLimit(uint256)", +"bf81765c": "adminAddressForComissions()", +"bf83735c": "changelp19(address)", +"bf83f2a2": "setAllocator(address)", +"bf843aed": "BuckyCoin()", +"bf8554ff": "fireOnOfferingChanged(uint256,bytes32,uint256[])", +"bf85cc27": "settleCfd(uint128)", +"bf85e628": "startVesting(uint256,uint256)", +"bf86d690": "isShutdown()", +"bf86e013": "createPromoBot(uint256,address)", +"bf872aee": "revokeConfirmation(uint256,bytes)", +"bf8783e0": "callAndGetReturn(address,bytes,uint256)", +"bf884cf5": "exitThisIcoForHalfOfTokenPrice()", +"bf8853c6": "getUserInterest(address)", +"bf8869b5": "GetBal()", +"bf88a6ff": "reward_contract()", +"bf88fc09": "revokeOwners(address)", +"bf892eaa": "removeTrustedContract(address)", +"bf89662d": "refundable()", +"bf8981c0": "left36(uint256)", +"bf8af541": "setLockRatio(uint256,uint256)", +"bf8b6466": "anOfferWeCantRefuse()", +"bf8b7ec2": "OpenGift()", +"bf8ba305": "getCodeStorage(uint256)", +"bf8bcee4": "setMaxLimit(uint256)", +"bf8bdac1": "setService(address)", +"bf8bf85e": "latestReleaseChecksum()", +"bf8c50ff": "scheduleTransaction()", +"bf8c6b63": "is_diagonal(int8)", +"bf8ce97f": "_take0xTrade(address,uint256,address[5][],uint256[6][],bytes)", +"bf8d5df8": "setTickerSymbol(string)", +"bf8dde4d": "calculatedReward()", +"bf8e0ea4": "logGive(address,string)", +"bf8eae55": "ChangeGasReuired(uint256)", +"bf8ecf9c": "authProposals()", +"bf8edd85": "setPriceInEth(uint256,uint256)", +"bf8f09cb": "cancelOrder(address,uint32)", +"bf8faa9c": "AMLToken(string,string,uint256,uint256,bool)", +"bf8fc670": "sendToAggregation(uint256)", +"bf9005ec": "Test6J()", +"bf907def": "buyGold(bytes32,string,string,string,string,string)", +"bf90c4e7": "PYRToEth()", +"bf913c5e": "getFamedStarByMass(uint256)", +"bf91cbb5": "mineIsBigger()", +"bf91ef18": "mergeBoostData(uint256)", +"bf9222d0": "DNT()", +"bf93a8be": "changeOwnership(address,address)", +"bf947852": "blockInvestor(address)", +"bf94de12": "createPoll(address,bytes32,uint256)", +"bf955038": "Judgement(uint256,uint256,uint256)", +"bf962302": "addIntTag(bytes32,int32)", +"bf96ae63": "signUp()", +"bf981995": "getCountryInfo(uint256)", +"bf983772": "BaseExchangeRateChanged(uint256)", +"bf98976e": "test_curatorDoesVeto()", +"bf989b6e": "setContracts(address,address,address,address)", +"bf98a50d": "GasReceipt(address)", +"bf99669d": "DevPromotionsMarketingSupply()", +"bf99cce1": "buyTokens(address,uint256,bytes32[])", +"bf9a5fde": "setConfiguration(uint256[],uint256[])", +"bf9a6958": "createVoterOnElection(uint256,address,address,string,string,string)", +"bf9ab00c": "getTeamPerfit(uint256)", +"bf9b8b38": "CrypviserToken(address)", +"bf9bbe71": "TRE()", +"bf9befb1": "totalStakes()", +"bf9c0d44": "RandomLedgerService()", +"bf9c3949": "createFaucet()", +"bf9c5001": "authors(address)", +"bf9d3d39": "setLineUpEnable(uint256)", +"bf9e6b0e": "TokenSwap(address,uint256)", +"bf9e7b75": "DeliveredBTC(address,uint256)", +"bf9f01f8": "buyMasterNodes(uint256,uint256)", +"bf9fc4e2": "balanceOfRobots(address)", +"bfa0b133": "salt()", +"bfa0fc93": "getVoteResult(uint256)", +"bfa190f3": "mTransfer(address,address,uint256)", +"bfa1bd62": "stakeAirdropWhileLocked(address,address,uint256,bytes)", +"bfa3c1e6": "MySale(uint256,uint256,uint256,uint256,uint256,uint256,address,bytes32,address,uint256)", +"bfa51df9": "isAirdropped(address)", +"bfa535c7": "apply(string,uint256)", +"bfa54b3f": "BLB()", +"bfa5f1f7": "getLandmark(uint256)", +"bfa814b5": "func()", +"bfa87e80": "tellPreviousContract(address)", +"bfa8ad36": "createProof(bytes32,bytes32)", +"bfaa1763": "FATA()", +"bfaad84b": "getLastStarOfAssetId(uint32)", +"bfab3db9": "withdrawContractBalance()", +"bfab41c9": "getTargetBlock()", +"bfab4f8b": "isMonsterAuction()", +"bfabd754": "increaseFrozen(address,uint256)", +"bfabe6c4": "ShakaliosToken()", +"bfac0046": "getPlayerWallet(uint256)", +"bfad16f4": "new_offer(uint256,uint256)", +"bfae2f0e": "addrAdmin()", +"bfae8867": "getLockTimestamp(string)", +"bfaec04e": "publish(string,bytes32)", +"bfafa8e6": "auditText(uint8,string)", +"bfafb91c": "changeMaxCoefPlayerForEmission(uint256)", +"bfafe92f": "_buyCallToOpen(uint256,uint256,uint256,uint256,address)", +"bfb01f72": "buyWithCustomerId(string)", +"bfb04c60": "proposeAcceptanceAsMember(uint256)", +"bfb05e0b": "declineFightApproval(uint256)", +"bfb08b4f": "MayanToken()", +"bfb0d82e": "__callback(bytes32,address[])", +"bfb1fcf5": "dmlwallet()", +"bfb2fad7": "totalDepositTokenAll()", +"bfb42682": "addPresaleOrder(address,uint256)", +"bfb460e9": "receiverSetAmountRequired(uint256)", +"bfb47e72": "CryptoSurprise()", +"bfb4d66f": "SudjuKoin()", +"bfb4ebcf": "Foo()", +"bfb51ac9": "startGame(uint256,bytes32)", +"bfb65777": "allContacts(address)", +"bfb68141": "disableTokensTransfer()", +"bfb77030": "BRM()", +"bfb7896d": "OQToken()", +"bfb790b4": "weeklyRate(uint256)", +"bfb7c227": "Developeo(uint256,string,string,address,address,address,address,address,bool)", +"bfb7d9f6": "stringandbytes()", +"bfb80547": "unfreezeAddress(address)", +"bfb8a319": "withdrawal(bytes32,address)", +"bfb8c63e": "confirmDeal(bytes16)", +"bfb909ce": "applyFeeToAddress(address,address)", +"bfb9f088": "addInvestorList(address[])", +"bfba1e8d": "gamePlayed()", +"bfba5dd6": "equal(address,address,string)", +"bfba9029": "hashBetMax()", +"bfbaa54d": "MithrilMace()", +"bfbad8b9": "preSaleEtherRaised()", +"bfbb6a23": "winEth(address,uint256)", +"bfbbd489": "setMonsterAuctionAddress(address)", +"bfbbfb1d": "getWinNumberBySlot(uint256,uint256)", +"bfbc37f7": "KOSHER()", +"bfbc793c": "computeNameFuzzyHash(string)", +"bfbc944c": "oldTokenReward()", +"bfbccfae": "currentCoinsCreated18Decimals()", +"bfbcf293": "setChampEC(address,address)", +"bfbd5074": "getVillain(uint256)", +"bfbf95cf": "participateICO(address,uint256)", +"bfbfa8e4": "kBalance()", +"bfc0a342": "owner_loadFunds()", +"bfc0cc5c": "sendEcosysSupplyToken(address,uint256)", +"bfc0e849": "startNextEra(bytes32,uint256,int256)", +"bfc1f48c": "isCapFree(address)", +"bfc2a675": "CreateCredo(address,uint256)", +"bfc2aa2a": "claimedSupply()", +"bfc303fa": "updatePublicData(uint256,string)", +"bfc38592": "cancelItemSale(uint256)", +"bfc3aef0": "setActiveStar(uint256)", +"bfc3cd2f": "testFailChargeMoreThanApproved()", +"bfc3d84b": "CT()", +"bfc47aa0": "tokensCrowdsale()", +"bfc4d11c": "subJobSponsorshipsBalance(address,uint256,uint256)", +"bfc54822": "bet(uint256,uint256,uint256)", +"bfc5624a": "newBadAPM(bytes32,bytes32,address,bool)", +"bfc6cdd1": "DukevsKansas()", +"bfc708a0": "reportMalicious(address)", +"bfc7952f": "outstandingPayouts()", +"bfc83af4": "setBountyTokenWallet(address)", +"bfc84528": "juicyBonus()", +"bfc8bfce": "executeTransaction(uint256,address,bytes,bytes)", +"bfc99f5b": "unsafeWriteAddress(uint256,address)", +"bfca33f7": "Court(address[],uint256[])", +"bfcabcbf": "changeFeeAmountThreshold(uint256)", +"bfcae563": "dateSaleEnded()", +"bfcc4ab2": "change_time_stamp(uint256,uint256)", +"bfcc8b6d": "ownerOfPlayer(uint256)", +"bfcdbae9": "preICOStartTime()", +"bfcdca48": "CastVote(bool)", +"bfce0b7f": "mainSaleEtherCap()", +"bfce477f": "forwardTransaction(uint256,bytes)", +"bfce8cbf": "redeemAdoptedAxies(address,uint256,uint256,uint256)", +"bfcf04cf": "updateId()", +"bfcf0baf": "testSliceToString()", +"bfcf63b0": "claimEther(address,uint256)", +"bfcf73e7": "blocksToLive()", +"bfd07c38": "LowJackpotHolder()", +"bfd0a553": "specWallet()", +"bfd1084f": "BitNauticWhitelist(uint256)", +"bfd13217": "ethReceivedPresaleOne()", +"bfd17831": "RECEIVER_ADDRESS()", +"bfd201f5": "setTransferFees(uint256,uint256,uint256)", +"bfd2385e": "allowanceOf(address)", +"bfd24821": "BonusCrowdsale(uint256,uint256)", +"bfd2ed01": "bountyPercent()", +"bfd3c5fa": "refundTransactionAfterExpiry(uint256)", +"bfd3fa6a": "becomeFairymaster()", +"bfd431d1": "RefundToBuyers()", +"bfd45540": "BlocHipo()", +"bfd4d720": "investors_number(uint256)", +"bfd4dce9": "WhatIsTheBestFoodInTheWorld()", +"bfd525b3": "stopTimeLength()", +"bfd61504": "_addControllerByPartition(bytes32,address)", +"bfd6ef3e": "explore(uint256,uint256,uint256)", +"bfd74534": "getRequest(address,address)", +"bfd7534f": "developer_address_for_D(address)", +"bfd75da4": "TrueUSD()", +"bfd812ec": "suspend(bool)", +"bfd8222a": "checkReward(uint256,uint256)", +"bfd8300d": "setBonusInterval(uint256)", +"bfd85808": "frozenTokens(address)", +"bfd8a06e": "getFinalWinningReportingToken()", +"bfd8fc93": "getOwnersLength(bytes32)", +"bfd90435": "addDataset(address,address)", +"bfd94c8c": "transferIsAllowed(address)", +"bfd9726d": "getMntTokenBalance(address)", +"bfda3b1a": "setSharedStorage(address)", +"bfdad9a4": "SignedContractVault(string)", +"bfdadc19": "change_price(uint256)", +"bfdb8796": "getPoolNameByID(uint256)", +"bfdc35f2": "onBalance()", +"bfdcc9a2": "numBuckets()", +"bfdcd480": "test_invalidProposalDuration()", +"bfdcdbf5": "subkey(address,uint256)", +"bfdd1a20": "getPOOL_edit_17()", +"bfde4f62": "withdrawAllEthToOwner()", +"bfdecf8c": "purchaseTokenInPresale()", +"bfdeddaa": "AllowedContributionCheck(uint256,uint8)", +"bfdf5e80": "communityPot_()", +"bfe0c27e": "getCurrencyAddress()", +"bfe10928": "distributor()", +"bfe1292a": "distributeLenderBot(address[],uint256,uint256)", +"bfe36f58": "HashCoinToken()", +"bfe370d9": "bytesToBytes32(bytes)", +"bfe38df5": "getTotalBet()", +"bfe3a664": "createCrowdsale(address,uint256[8])", +"bfe3c39d": "JYKToken()", +"bfe3e03a": "midGradeHold()", +"bfe44c4b": "getUserValue(bytes20,uint256)", +"bfe484de": "judge(uint256,bool,bytes32)", +"bfe4ed8e": "Razoom(address)", +"bfe53e5c": "holdersWithdrowsOf(address)", +"bfe597fe": "genesisBlockCount()", +"bfe689cf": "lockedValuesAndTime(address,uint256,uint256,uint256)", +"bfe6b1ac": "acceptOffer(uint16,uint256)", +"bfe6c0c7": "viewa1(address)", +"bfe70251": "_checkCertificate(bytes,uint256,bytes4)", +"bfe713e3": "truecoin()", +"bfe777c3": "addPrMemberById(uint256,address,address)", +"bfe7e2eb": "BCBCYCoin()", +"bfe86bbe": "publicGetElement(uint256,uint256,uint256)", +"bfe8936c": "getAssetDetailsURI(uint256)", +"bfe8c107": "betOnDozen(bool,bool,bool)", +"bfe9b7df": "pubkeys1()", +"bfe9e7f4": "pack(address,bytes)", +"bfe9f204": "dividendCycleTime()", +"bfea267a": "getBalanceToMint(address)", +"bfea8790": "enableScheduler()", +"bfead4b9": "maxWithoutWhitelistPerUser()", +"bfeb049c": "IndexOfCurrentDraw()", +"bfebb947": "unblacklist(bytes32)", +"bfec83d6": "RoleAdded(address,string)", +"bfec8b01": "insertSection(bytes32)", +"bfee3569": "setTokenControlInfo(address,uint256,uint256,uint256)", +"bfef9627": "set(bytes4,uint8,uint8)", +"bff04d6f": "testPostpone()", +"bff05aef": "adminRefundTokens(address,uint256,uint256)", +"bff0fbb8": "calculateMeat(uint256)", +"bff10815": "deleteOffer(uint16)", +"bff179c4": "setJadeCoinZero(address)", +"bff18c78": "deployFactory()", +"bff1f9e1": "totalUsers()", +"bff2c413": "ChangeFoundersWalletAddress(uint256,address)", +"bff35618": "setTransferLock(bool)", +"bff41e36": "WEI_RAISED_CAP()", +"bff44f0d": "confirmAddressChange(address,address)", +"bff49180": "updateVendorValid(uint256,bool)", +"bff547c0": "setOrganizationShareSymbol(string)", +"bff5e021": "PumpToken()", +"bff5fb64": "appNickname()", +"bff5fccd": "myWishes()", +"bff65668": "isPresaleHolder(address)", +"bff7df7c": "refundDeadLine()", +"bff7e179": "multiPurchase(uint32[],uint8[],uint8[],uint8[],string)", +"bff8314f": "SetMaxPosXblock(uint256)", +"bff8a36d": "decreaseReserve(uint256)", +"bff974e8": "getContentReplies(uint256)", +"bff99c6c": "tokenWallet()", +"bff9e842": "getSamplesForOwner(address)", +"bffa02d5": "sendP3D(address,uint256)", +"bffa4e41": "getMintAmountApproval(address,address)", +"bffa55d5": "claimRefund(address)", +"bffa9258": "assetCount(address)", +"bffb10de": "add_creature(address,string)", +"bffbe61c": "node(address)", +"bffc235a": "mintedList(uint256)", +"bffcd758": "nasdaqo(uint256,string,string)", +"bffd952a": "transferMaintainer(address)", +"bffdf3f1": "Test4()", +"bffeadd6": "move(uint8,uint256,bytes,uint8,bytes32,bytes32)", +"bffee609": "setSkills(address,uint256,uint256,uint256)", +"bfff23f2": "CaptainKitty()", +"bfff374d": "DepositReturned(uint256,address)", +"bfffe670": "window1StartTime()", +"c00007b0": "getReward(address)", +"c0001786": "ownerBurn(address,uint256)", +"c0012077": "TeamContract()", +"c002c4d6": "getTicket()", +"c003598a": "XEN()", +"c0036137": "ownerProfitPercent()", +"c003b082": "getMyPlayerID()", +"c003f540": "sco(uint256,address,uint256)", +"c00465ab": "CrowdsaleToken(uint256,uint8,address,bool,address)", +"c004a877": "shiftSalePurchase()", +"c0056b7b": "updateAccount(uint8,bytes32,bool,bytes32)", +"c005c686": "validateCompoundContract(uint256)", +"c005dc7b": "hon2backup()", +"c00710fa": "userContractsPred(address,uint256[],uint256[],uint256)", +"c0075772": "setPromoTokenController(address)", +"c0086b19": "BCP(uint256,string,uint8,string)", +"c00941d9": "Dominator()", +"c009b451": "setEventActive(bool,string)", +"c00ab18c": "_toSgaAmount(uint256)", +"c00ade41": "receiveTransferOwnership()", +"c00b060c": "getArrBoolField3()", +"c00c176c": "GoGO()", +"c00c2ceb": "isRedeemAllowed()", +"c00c4e9e": "batch(address[],uint256[])", +"c00ca383": "getByOwner(address,uint256)", +"c00d5305": "oraclize_setNetwork()", +"c00d8f3d": "processLotteryReward()", +"c00daefe": "etherFund(bytes32,string)", +"c00e4306": "getCurrentTokenAmountForOneEth()", +"c00ea6ef": "Polaris()", +"c0112678": "arcToken()", +"c0116c3c": "doAirdrop(address[],uint256[])", +"c011cd1c": "getClixToken()", +"c012e179": "mintDepositAccount()", +"c0130adb": "addadjacencies(uint16[],uint16[],uint16[])", +"c0140fd1": "bid(bytes32,address,uint256)", +"c014464e": "checkFeePeriodRollover()", +"c014875f": "mint(bytes32,address,uint256,bytes)", +"c01569f9": "buyPiece()", +"c01685d4": "FTKTToken()", +"c01706dd": "getContentByRank(address,uint256,uint256)", +"c0171112": "timestamp(uint64)", +"c018d0e6": "getFeeAmount(int256,int256)", +"c018fe0d": "sub_sessione(string,uint256)", +"c01a1c5f": "totalSellPrice(uint256,uint256)", +"c01a8c84": "confirmTransaction(uint256)", +"c01ae5d3": "drop(address[],uint256[])", +"c01b3aa4": "STARTING_SNAKE()", +"c01bc982": "isRestricted(address)", +"c01c1ca3": "claimRemaining()", +"c01ca43f": "getPlayerState(address)", +"c01d1c60": "getTokenExchangeRate()", +"c01d8280": "get_balance(address,string)", +"c01de45c": "storeBet(uint256,uint256,uint256)", +"c01e38e6": "addPlayer(address,uint256,uint256)", +"c01e3985": "StupidityToken()", +"c01e8b6a": "Zigit()", +"c01f475f": "_setClearingPrice(bytes32,uint256)", +"c01f56d0": "OfferToDisciple(uint256,uint256)", +"c01f9e37": "proposalDeadline(uint256)", +"c0204bab": "EasyOsmiumCrowdsale()", +"c020df48": "updateGas(uint256)", +"c022215c": "getTotalDeposit()", +"c0227bd3": "_toTaxes(uint256)", +"c022abbe": "GetAuction(uint32)", +"c022ef43": "getTimeLeftToNextLocalBountyCollect(uint16)", +"c023a231": "BitSTDView(address)", +"c02515a9": "maxTokenForHold()", +"c0263163": "ATT(address)", +"c026327a": "removeBankToken(uint256)", +"c02738da": "generateTargetTokens(address,uint256,uint256)", +"c02898a0": "potatoOwner()", +"c028c674": "right82(uint256)", +"c028df06": "offer()", +"c028e3c9": "cordX(uint256)", +"c0297bc8": "DreamX()", +"c02aaea1": "totalTokensForSaleDuringPreICO()", +"c02b04d8": "rescueLostProperty(uint256,address)", +"c02b5395": "NAMO()", +"c02bf40c": "FundsDeposited(address,uint256,uint256,uint256,uint256)", +"c02c89fe": "PreicoClose()", +"c02cc957": "firstDigit(string)", +"c02d0140": "buyCard(uint8,string,string,string)", +"c02d1e02": "a_document(uint256)", +"c02e580e": "roundEnd()", +"c02f081a": "shiftBits(bytes,int256)", +"c02fd500": "E4Lava()", +"c0309697": "challengeContract(address)", +"c030d8b8": "setCardContract(address)", +"c030f3e2": "increaseSaleLimit(uint256)", +"c031a180": "getBytes(bytes32)", +"c031a78b": "maxMedalsBurned()", +"c0324c77": "setParams(uint256,uint256)", +"c032846b": "getContractStatus()", +"c0329a3e": "startAirdropFrom(address,address[],uint256)", +"c032dc30": "execute(uint256,address)", +"c0338a0c": "transferTileFromOwner(uint16[],address)", +"c0343b09": "setDisputeInterface(address)", +"c035340c": "withdraw_1()", +"c035e492": "onholdBalances(address)", +"c0362523": "setUpgradedOwner(address,address,address)", +"c036c100": "NextGenHype()", +"c03785c3": "MyRefundVault(address)", +"c03795ba": "departmentrequest(address,string,bool)", +"c037ae58": "VESTED_AMOUNT_TOTAL()", +"c037d9ce": "getElementsFromIndex(uint32,uint32)", +"c038a38e": "totals()", +"c038f541": "setProperty(string,string,uint256,int256,string)", +"c03951f7": "FaceWalletToken()", +"c0395bb5": "isCurrentOrPastAdmin(address)", +"c039b88c": "_makeSpecialId(address,address,bytes32)", +"c039bd87": "withdrawTokenFromPkt(address,uint256)", +"c039d6db": "PutEther()", +"c039daf6": "tokenCreationMin()", +"c03a4018": "getGuessInfo(string)", +"c03aac7a": "setSellDividendPercentageFee(uint8)", +"c03b70d5": "getTurnover(address)", +"c03ba041": "BNC(address)", +"c03bdbae": "setRdFee(uint256,uint256)", +"c03c3003": "increment(int256)", +"c03c72aa": "isBattleDecider()", +"c03ce1d8": "BondingManager(address)", +"c03ce796": "crowdSaleStage()", +"c03cf137": "getMyLocker()", +"c03d00f3": "a_viewCoinSupplyAndFunding(bool)", +"c03d1b1d": "verifyCertWithID(bytes32,bytes32,bytes32,address)", +"c03d848c": "convertEthToCents(uint256)", +"c03e2cbf": "Whitelisted(address,bool,uint256,uint256)", +"c03e382f": "calculateShare()", +"c040188f": "preSaleLockEndTime()", +"c0406226": "run()", +"c040e6b8": "stage()", +"c040ebec": "getUserSize()", +"c04123fb": "checkProposalCode(uint256,address,uint256,uint256,bytes)", +"c041652d": "getVendorApplicationStatusTrackCount(string)", +"c04198f3": "getEndDate(string)", +"c042575f": "ETHmultiplier()", +"c0435e29": "setDefaultFriendsFingersRate(uint256)", +"c043c0d9": "changeMaximumPlayers(uint32)", +"c043df8c": "verifyWithdrawSignature(address,bytes)", +"c04484fd": "resetInternal(uint256)", +"c045732c": "addPreIcoMembers(address[])", +"c0459899": "approvePreSigned(address,uint256,uint256,uint256,uint8,bytes)", +"c04605b8": "softEndDate()", +"c0462ec3": "withdrawAllTokensToExchange(address,address,uint256)", +"c0463711": "lastUpdate()", +"c0463810": "PalmToken()", +"c0465f3a": "dateSisterWins()", +"c046c691": "setMoveProductToWhom(address,uint256,address)", +"c046d9b5": "borrow(address,uint256,address,bytes)", +"c0472889": "currentIDnumber()", +"c047c1d8": "transactionsStatusUpdate(bool)", +"c0489af5": "foundersTimelock1()", +"c048dfb8": "postpone(uint256)", +"c0496e57": "setNotarisationFee(uint256)", +"c049813a": "preIcoStagePeriod(uint256)", +"c04a5414": "developmentWallet()", +"c04aa9b8": "rpow(uint128,uint64)", +"c04bb954": "rejectionRatio()", +"c04c5947": "getGames()", +"c04c68eb": "changeAllowTransferState()", +"c04c8e43": "SNSCOIN()", +"c04ca3f5": "_removeAgent(address)", +"c04cc86b": "collecttaxes(uint256)", +"c04d90d0": "ownerByIndex(uint256)", +"c04de318": "slashAddressLikeUsername(string)", +"c04ecdb8": "promoTokenController()", +"c04f01fc": "power(uint256,uint256)", +"c04fcad8": "INITIAL_TOTAL_SUPPLY()", +"c0506782": "_createArtwork(string,string,uint32,address)", +"c050f6dc": "admitUser(address)", +"c0517c5a": "XferMoneyMarketing()", +"c051f75f": "setSchemaRegistry(address)", +"c05283ff": "logQuery(bytes32,address)", +"c0533b5d": "appVersionList(bytes32,address)", +"c05374f7": "AirChn()", +"c05390f6": "PRIZE()", +"c053dc6b": "EtherBags()", +"c053ebf5": "setProviderClosed(uint256,uint256)", +"c054e050": "extractProofOfExclusion(address[],uint256[],bytes32[],uint256[],bytes,bytes)", +"c0567656": "subtractFee(uint256)", +"c0576b73": "monsters(uint256)", +"c057b40d": "SpainvsRussia()", +"c057eca7": "minStakingTime()", +"c0584e68": "ContributorsSupply()", +"c0597a55": "freedWosPoolForThirdStage()", +"c05a30b9": "_processFunds(uint256,uint256)", +"c05a8e81": "getPosition(uint8[176],uint256)", +"c05b7cf6": "setCreationProfit(uint256)", +"c05b8066": "setCompte_18(string)", +"c05ce08f": "calculatePoints(uint256,uint256)", +"c05d1f0e": "PRESALE_JOINTTOKENS()", +"c05dd5d2": "MatchAborted(uint256)", +"c05e5776": "giveRightToVote(address,address)", +"c05f486e": "DEV_SUPPLY()", +"c060ac53": "bytes20ToString(bytes20)", +"c0615f09": "CPGPEREGRINE_EXTRACTION_BASE()", +"c0619c70": "setPrimaryManager(address)", +"c06265d3": "createContractState(string)", +"c062dc5f": "releaseAmount()", +"c062ef86": "_random_empty_location()", +"c062f578": "updateStage()", +"c0631b12": "moneyWallet()", +"c0645011": "getPastRound(uint256)", +"c06474e0": "removeShare(address,uint256)", +"c06508dc": "QBTCoin(address)", +"c0652cf9": "EdelRostenCoin()", +"c0659108": "beneficiariesLength()", +"c065ecc2": "queryChildLength()", +"c065fcf1": "RESERVED_PARTNERS_SIDE()", +"c066bd1a": "addItem(uint256,uint256,address)", +"c06702dd": "changeStage()", +"c0670d2c": "calculateDistributionPeriods()", +"c0675b78": "addBuyTokensRequest(string,uint256)", +"c0677fb6": "SetIdentifiedContract(address,address)", +"c0689e2d": "newCrowdFundingCampaign(address,uint256)", +"c068eae0": "player_collect_winnings(uint256)", +"c06a22f4": "dollarsForEther()", +"c06b0d21": "BondToken(address,address,address)", +"c06b5281": "buyXnameQR(address,bytes32,uint256)", +"c06c4474": "get_burned(bytes32)", +"c06c66ca": "bountyFund()", +"c06d1272": "startPreIco()", +"c06d1490": "oppositeAnnouncement(uint256)", +"c06d7744": "getAllSignersCount()", +"c06dabf8": "_escrowHostPaymentEarning(address,bytes32,uint256,uint256,address,bool,uint256)", +"c06f146b": "setNumInvalidMarkets(uint256)", +"c06f1bc4": "updateVoterTimes(address,uint256)", +"c06f4c1d": "newCampaign(bytes32,bytes32,bytes32,address,uint256,uint256,uint256,address)", +"c06f8340": "cancelAuctionByAdmin(uint256)", +"c06fad06": "items()", +"c06fff76": "proposePauseChange(bool)", +"c0702d9c": "_mint()", +"c07097a6": "coindropsLockEndingAt()", +"c0715d1d": "assertSafe(bool)", +"c071f3bf": "deliverPurchasedTokens()", +"c072422d": "buyTokens(bytes32,uint256,uint8,bytes32,bytes32)", +"c072497a": "claimPlotMultipleWithData(uint256[],uint256,string,string,string,string)", +"c072dcf3": "ExampleContract()", +"c073af55": "GetJackpotMin()", +"c07401f0": "addToPool()", +"c0740c16": "numElementsOdd()", +"c0741c53": "test_assetRegistration()", +"c0743044": "partAllocations(uint256)", +"c074313f": "pricePerStake()", +"c074a27e": "proposeTransaction(address,uint256,bytes,string)", +"c074fe80": "SetPrecioUnidadPase(uint256)", +"c07653af": "Gavinhereum(uint256,string,string)", +"c076c847": "NorthPoleAF()", +"c0774df3": "canForward(address,bytes)", +"c0777545": "balanceAD()", +"c077b0f9": "getARSchedule()", +"c079418b": "setTranchWei(uint256[])", +"c0797ae1": "stakerIncomeShare(bytes32)", +"c079c318": "adjustFee(uint256)", +"c07a1f0c": "changeHouseFeeAddress(address)", +"c07a32c4": "dateIsLegal(uint256)", +"c07a5537": "MintableTokenWithMinters()", +"c07b18ca": "PullPaymentMock()", +"c07b2586": "SAFCOIN(uint256,string,uint8,string)", +"c07bcfdc": "updateLimitPerDay(bytes32,uint256)", +"c07dc59c": "withdrawPot(string)", +"c07dc890": "selfRegisterDINs(uint256)", +"c07dd842": "buyFactor()", +"c07e3391": "setMonethaAddress(address,bool)", +"c07f47d4": "latestVersion()", +"c07f773a": "totalTokensAllocated()", +"c080f08f": "complexReturnType(int256,string,bool,string)", +"c0819961": "Invest()", +"c081efc1": "hasSellerBeenAccepted(address)", +"c083455f": "ownerPutInterest(uint256)", +"c0835106": "isVotable(bytes32)", +"c08415b1": "ORDER_PLACE(address,address,bool,uint256,uint256,uint256)", +"c0845e8a": "catchMonster(address,uint32,string)", +"c0846957": "EtherDeltaTokenBalance(address)", +"c0851e09": "getEarlyPurchase(uint256)", +"c0864877": "tokensForOwner()", +"c088003d": "getMinThresholdOfVoters(uint256)", +"c0887991": "getOperation(address)", +"c088df47": "SECRET_BONUS_FACTOR()", +"c08a86b1": "endGame(bool,uint256)", +"c08cc02d": "getProposalCount()", +"c08d1fe5": "timeLimit()", +"c08dd1dc": "IOU(string,string,uint8)", +"c08e05aa": "icoRuleCancel(uint256)", +"c08eea14": "cloneAccount(uint256)", +"c0905fef": "getStackholders()", +"c090b4df": "createRecord(string,string)", +"c090b86d": "createKingdom(string,address,address,address,uint256,uint256,uint256,uint256,uint256)", +"c090da1e": "Zhennong(address)", +"c0910475": "PaymentStatusTimeStamp(address,address)", +"c0916437": "modifyChoice(uint256)", +"c091c435": "refund(address[],uint256[])", +"c091e45a": "redenominate()", +"c0926d40": "HBOToken()", +"c0929385": "confirmInit(address,address,string,bytes32,uint256)", +"c092ecf4": "blocksToVest()", +"c0934c45": "getNextRules()", +"c0938c1a": "setMintAgent(int256,address,bool)", +"c0942dfd": "registerNameXIDFromDapp(address,bytes32,uint256,bool)", +"c0946d54": "AtomCoin()", +"c094c73e": "VeritaseumToken()", +"c094df20": "shift(address,uint256)", +"c0956fd9": "getRealTokenAmount(uint256)", +"c0963d97": "getTokensAmount(uint256,address)", +"c0966693": "RoomNonceAdd(uint8)", +"c09689a6": "tryFinalizeProposalsByVoterIndices(uint256[],uint256[],bool[])", +"c096aa81": "fuint8(uint8)", +"c097d629": "setPI_edit_30(string)", +"c0981285": "buyComissionUnits()", +"c098201f": "updateEtherAndtokenAmount(uint256,uint256)", +"c0997654": "destIndex(address)", +"c09a4ef4": "latestEthTxRequest()", +"c09a898d": "SPTS()", +"c09b2a2c": "weiMinSale(uint256)", +"c09bdd06": "_escrow(address,address,uint256)", +"c09d81be": "calculatePoundsTimesEther(uint256)", +"c09f32e8": "closeQuestion(uint256)", +"c09fed25": "transferFromBalance(uint256,address)", +"c0a06ecb": "infoWithdraw4()", +"c0a0b5fa": "getKilledArray(uint256)", +"c0a14da4": "isTeamLockInPeriodOverIfTeamAddress(address,address)", +"c0a150b3": "RovaZoneBToken()", +"c0a1a949": "x15()", +"c0a1b72a": "totalSupplyWithOutBonus()", +"c0a1e525": "createDaoPOLSKAtokens(address)", +"c0a2203e": "insert(address,address)", +"c0a239e3": "valuePerShare()", +"c0a28014": "setTreeStructure(address,address)", +"c0a2d9b3": "EssentiaToken()", +"c0a35d62": "burnReturn(address,uint256)", +"c0a35e8b": "getTokensMintedAt(uint256)", +"c0a36345": "getTokenOwnerRewardPercent()", +"c0a39fb0": "blockTransfer(uint256)", +"c0a41466": "etherSender(address,uint256)", +"c0a42d91": "SignatureInvalidity()", +"c0a5bcbd": "DefaultCents()", +"c0a7639e": "checkIfAddressIsWhiteListed(address)", +"c0a7f894": "MAVCash(uint256,string,uint8,string)", +"c0a843a1": "getCurrentUserRefBonus()", +"c0a8694d": "NamableAddressList(string,bool)", +"c0a899f2": "transferAsChild(address,uint256,address,uint256,uint256,bytes)", +"c0a8fb73": "FlightDelayController()", +"c0a9066b": "LogValentineRequestCreated(string,string,string,address,address)", +"c0a9581d": "sendFee(uint256)", +"c0a963c9": "notifyWinner(address,uint256)", +"c0a99a83": "oneTokenInUsdWei()", +"c0aa18e7": "History()", +"c0aa3b21": "ownerTokens()", +"c0aa7e2e": "cancelInvoice(bytes32)", +"c0aace0b": "totalKitties()", +"c0ab5704": "setVesting(address,uint256,uint256,uint256)", +"c0ab86bd": "SBSolutions()", +"c0abf829": "tokenCreationMinMile2()", +"c0ac3d1c": "PRE_ICO_BONUS_RATE()", +"c0ac9983": "tokenURIPrefix()", +"c0ad7427": "saleTokenSupply()", +"c0adb725": "AuthCancel(address,address)", +"c0adc465": "getCurrentBonusRate()", +"c0ae6a3a": "ultimateOutcomes(bytes)", +"c0aee5ba": "THAW_CYCLE_USER()", +"c0b14de7": "setLandLimit()", +"c0b204a6": "TeamWalletAmount()", +"c0b241d7": "icoRate()", +"c0b332c1": "moveCharge()", +"c0b3569d": "setAssetProxy(address)", +"c0b3870a": "withdrawJackpot()", +"c0b39e68": "unfinalize()", +"c0b3aff3": "INCREASE_RATE()", +"c0b3dab3": "Devilsbest()", +"c0b4d404": "setGrowingControlStartAt(uint256)", +"c0b4e657": "HongkongerCoin()", +"c0b4fa6d": "_reward(address[])", +"c0b6762c": "SILVER_AMOUNT_XPER()", +"c0b6f0c2": "NextRoundAndEvents()", +"c0b6f561": "initiateOwnershipTransfer(address)", +"c0b75b7d": "setMinContributionAmount(uint256)", +"c0b7eba4": "game_allocation()", +"c0b82515": "gzeUsd()", +"c0b84bfe": "setFee(uint256,uint8)", +"c0b8a80d": "CVAlejandro()", +"c0b92612": "changePig(address)", +"c0b9b36a": "bountyTokensBatch(address[],uint256[],string)", +"c0b9b8ce": "releaseToAdvisor(address,uint256)", +"c0b9ecc8": "getNames(address,uint256,uint256)", +"c0ba6adf": "gemDefenseConversion()", +"c0bac1a8": "isMigrated(string,string)", +"c0bb20a6": "setBonusSale(uint256,uint256,uint256)", +"c0bb6c27": "setTotalPersistLimit(uint256)", +"c0bb8466": "WithdrawFees()", +"c0bd3f40": "dumpData(uint256,uint256)", +"c0bd8351": "getGameId()", +"c0be3e9a": "removeOffChainAddresses(address[])", +"c0be4b51": "genWeeklySecondPrizeKey(uint8[4])", +"c0be7ad3": "freezeAccountDirect(address,bool)", +"c0c116d5": "getStringValue(uint256)", +"c0c133a8": "DATE_ICO_END()", +"c0c19d29": "mock_length()", +"c0c1b107": "changeOraclizeGasPrice(uint256)", +"c0c1b18e": "getDepositSize(address)", +"c0c1cf55": "executeAction(uint256)", +"c0c1dab1": "setReceiver1()", +"c0c1eebc": "addToken(address,bytes32)", +"c0c2c087": "getOrdersInfo()", +"c0c3da9c": "totalSupplyLocked1Y()", +"c0c4440a": "totalAmountOfCrowdsalePurchases()", +"c0c47e12": "getDeal(bytes16)", +"c0c4d8a8": "Fundraiser(address,address,uint256,uint256,address,uint256,bytes32,uint256,uint256,uint256,uint256,uint256)", +"c0c53b8b": "initialize(address,address,address)", +"c0c5fda5": "getTotalSupply(address,uint256,bytes,uint8,uint256)", +"c0c602d9": "tokenAssigned()", +"c0c620d2": "DroneToken(uint256,string,string)", +"c0c6a430": "BadTronToken(address,address)", +"c0c6a68a": "setMockedBlockNumber(uint256)", +"c0c76940": "StopperCoin()", +"c0c77236": "resetHolder(bool)", +"c0c77b71": "changeRegistrationStatusForGoldWhiteList(address,bool)", +"c0c81969": "tokenSupplies(uint256)", +"c0c83c0d": "getDebtById(uint256)", +"c0c8821a": "icoRuleUpdate(uint256,uint256,uint256,uint256,uint256)", +"c0c8b567": "registerCertificateHash(address,bytes32)", +"c0c8ccb3": "PreHELIX()", +"c0c91e6d": "getMinPriceSale()", +"c0c95917": "BrinkzSupply()", +"c0c98d6f": "setProof(uint256,bytes32)", +"c0cab256": "ZZWHToken()", +"c0cad302": "setNetworkName(string)", +"c0cc365d": "setExpirationTime(uint256)", +"c0cc6eb1": "rejectPayment(bytes8)", +"c0ccc863": "NacContract(uint256,uint256,uint256,address,uint256,uint256)", +"c0cd1ec1": "recordLog(uint256,address,uint256,uint256,uint8,uint8)", +"c0cd2e32": "chargeWeeklyRate(bytes32,address)", +"c0cd54c6": "GetGameType(address)", +"c0cf067b": "deathData_v7()", +"c0cf22e9": "setSendGiftPrice(uint256)", +"c0cfa7e5": "startDispute(uint256)", +"c0d061f4": "execute(address,uint256,bytes32)", +"c0d0aa69": "daoMultisig()", +"c0d129d4": "BallotPreferential()", +"c0d13a6d": "MIN_BUY_ETHER()", +"c0d26946": "randomNumber(address,uint256)", +"c0d2834b": "DataSource()", +"c0d3f378": "specialManagerListMap(uint256)", +"c0d470a6": "setCCH_edit_23(string)", +"c0d4fa0c": "emitFeePeriodDurationUpdated(uint256)", +"c0d6568d": "FEATURE_TRANSFERS()", +"c0d6ce63": "punksRemainingToAssign()", +"c0d75442": "TOKEN_SALE()", +"c0d84ce5": "TransferFrom(address,address,uint256)", +"c0d8b0b8": "setPetAuras(uint64,uint8,uint8,uint8)", +"c0d910cd": "getTankOwner(uint256)", +"c0d9f997": "transperrun()", +"c0dab516": "adminPercent()", +"c0db4dd7": "TRANSACTION_MIN_IN_ETH()", +"c0db8dd8": "allowToLock(address,address)", +"c0dcf63a": "isLastRaceFinsihed()", +"c0de3d71": "TransactionCancelledICAP(bytes32,uint256,string,address)", +"c0df77d0": "getRefName(uint256)", +"c0e06ca3": "whitelistAddressPresale(address,uint256)", +"c0e093f1": "AirdropMultiple(address[],uint256)", +"c0e09852": "isVesting(address)", +"c0e17c61": "TenStepTestCoin()", +"c0e18579": "ONETIMESOLD(uint256)", +"c0e19314": "divideFractional(uint256,uint256,uint256)", +"c0e1e272": "buyToken(uint32,uint32,uint32,address)", +"c0e22f31": "frozenStatusOf(address)", +"c0e31001": "avatar(address,uint256,bytes)", +"c0e3153c": "balanceSub(address,address,uint256)", +"c0e317fb": "addToBalance()", +"c0e33275": "perTokenAmountMax()", +"c0e37b15": "transferData(address,uint256,bytes)", +"c0e59e4d": "lastRateUpdateTimeForCurrency(bytes4)", +"c0e5fbb6": "unlockBalanceOf(address)", +"c0e71f54": "toKeyValue(string,string)", +"c0e738ef": "summAdvisors()", +"c0e789cc": "friendsFingersWallet()", +"c0e793c2": "transferOwnership(string,address)", +"c0e79a11": "setAllowed(address)", +"c0e8ad51": "LydianCoin()", +"c0e9118e": "killAllXAITActivity()", +"c0e91320": "finishPVEBatch(uint256[])", +"c0e91569": "GRCToken()", +"c0ea09d7": "rest()", +"c0ea537b": "amountOfTokensPoolD()", +"c0ea6ff5": "test3_search()", +"c0eaded2": "makeDeal(uint256,uint256,uint256,uint256,uint256,string,address,string,address,uint256,uint256)", +"c0eb2325": "scheduleTransaction(address,bytes,uint256)", +"c0eb2e70": "buy(address,uint256[],uint256[],bool)", +"c0ebc67a": "SimpleStateChannel()", +"c0ebdba1": "InvestedOtherCrypto(address,uint256,uint256)", +"c0ec55a5": "buyPokemon(address,uint256)", +"c0ed969a": "updateBackend(address)", +"c0edec55": "CroatiavsDenmark()", +"c0ee0b8a": "tokenFallback(address,uint256,bytes)", +"c0ee57a5": "giveReserveTo(address,uint256)", +"c0ee6db8": "_lockToken(address,uint256)", +"c0efa161": "getDeveloperReservedBalanceLimit()", +"c0f0c21c": "updateMaxTokenLimit(uint256)", +"c0f0e925": "getPercent3(address)", +"c0f11a1b": "addressArrayContains(address[],address)", +"c0f16fab": "checkAllowedContribution(address,address,uint256,uint8)", +"c0f17d13": "ChessCash()", +"c0f3622c": "updateRates(uint256,uint256,uint256)", +"c0f3ab76": "B2BCoinContract()", +"c0f40163": "issueFTT(address,uint256)", +"c0f496ac": "ecosystemAllocation()", +"c0f4bfa4": "nbSellers()", +"c0f4d29b": "setLocation(uint256,uint256)", +"c0f4f41e": "changeRefresherFee(uint256)", +"c0f57529": "eth_seed_amount()", +"c0f5a9cb": "deleteThing(bytes32[])", +"c0f5b5f7": "setSecondRoundPricing(uint256)", +"c0f5dc97": "totalSupplyUnlocked()", +"c0f64f43": "attachAsset(uint256)", +"c0f65734": "SignedDigitalAsset(string)", +"c0f68859": "getMinimumGracePeriod()", +"c0f6a3f9": "reserveVaultAddr()", +"c0f6c0da": "getTokensFromEth(uint256)", +"c0f6c7b8": "getIdArray(address,uint256,string,string)", +"c0f70d5a": "IOUSupply()", +"c0f7c498": "create_planet()", +"c0f8275e": "detailsOf(uint256)", +"c0f8940c": "decode()", +"c0f8de32": "shouldThrowOnAttemptToTransferToNullAddress()", +"c0f96105": "Enabled()", +"c0fd43b4": "lastNonce(address)", +"c0fdba2d": "YCBIToken()", +"c0fe6c92": "isClientAddedBefore(address,address)", +"c0feb62d": "fundRaisedDuringPublicSale()", +"c0feee42": "Error(bytes32)", +"c0ff3ebc": "ILFManager()", +"c1009f1b": "testInitialLedgerBalance()", +"c1013658": "createAsset(uint256,bytes32,uint256)", +"c1021099": "DBDVToken()", +"c1039215": "PresaleExtended(uint256)", +"c10435cc": "lastEruptionTimestamp()", +"c1061561": "shut_down()", +"c1072279": "unicornBreeding()", +"c1075329": "withdrawFunds(address,uint256)", +"c10796df": "_performTransferToICAPWithReference(bytes32,uint256,string,address)", +"c107aa6f": "addAssociatedAddress(address,address,address,uint8,bytes32,bytes32,uint256)", +"c107b9b8": "CTCB()", +"c107e109": "addFactory(string,address)", +"c1082c00": "YBananaCoin()", +"c108adab": "setChangeFee(uint256)", +"c108d542": "distributionFinished()", +"c108f3b4": "nextDelayedSetStake()", +"c1098e2e": "preSaleFirstCap()", +"c109e024": "blockdif()", +"c10a0840": "CryptoChallenge()", +"c10b30c0": "unlockPurchasedTokensClaim()", +"c10b9358": "saleEnd()", +"c10be521": "gapFactor()", +"c10bef22": "ConditionsAdded(address,uint256)", +"c10c0bd3": "logMatchdayResults(int16,string)", +"c10c3463": "addProduct(string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"c10c3546": "setEscrow(address)", +"c10ce2b0": "calculateDiffPercent(uint256,uint256)", +"c10d0f11": "didChangeCollateral(bytes32,address,uint256)", +"c10dd4c6": "getEvents(bytes32[],address)", +"c10e5fe7": "GemCoin()", +"c10e7dfe": "bonusInited()", +"c10e9ba0": "isClientIdentRejectedOf(address)", +"c10eb14d": "_withdraw()", +"c10efd2f": "compareResults()", +"c10f1a75": "proxyFactory()", +"c10f5075": "KudosPoll(string,string,uint8,uint256,uint256,uint256)", +"c10fa635": "channelParticipantCount(uint64)", +"c10fa789": "withdrawalsVotes(address,uint256)", +"c10fbf0e": "reDraw()", +"c110afe2": "Percent(uint256,uint256)", +"c110e6a0": "HealthCoin()", +"c111368b": "vestingsRemainBalance(address)", +"c112411e": "_clarifyPVPSchedule()", +"c112601c": "transferLibOwnership(bytes32,address)", +"c1127f90": "PresalePool(address,uint256,uint256)", +"c112a083": "finalizeChangeName()", +"c112dfa3": "changeDecimals(uint8)", +"c11301d4": "getSaleContractTargetEtherMax(address)", +"c1139ba0": "transferAuthorship(address,bytes32,bytes32)", +"c113d195": "XECToken(string,string,uint8,uint256)", +"c11403fc": "maxListingSeconds()", +"c114301c": "icoPlatformWithdraw(uint256)", +"c115b06c": "CYFToken()", +"c11645af": "test_threeInvalidAssertFalse()", +"c116574c": "__update_oraclize(address)", +"c1165781": "totalSupplyOnIco()", +"c11737c7": "getFirstBuyer(address)", +"c11741a9": "submitReview(uint256,bool)", +"c117c9eb": "isUserInAllowedList()", +"c117cfe2": "TwoDimensions()", +"c11808da": "getFloor()", +"c1184537": "changeContracts(address,address,address,address)", +"c118a9de": "getDiscountOf(uint256)", +"c119167b": "numberOfExchInEstateNasBob(address,uint256)", +"c119d019": "collectPayment(address,uint256)", +"c11a4b47": "Origin()", +"c11b2252": "equipContract()", +"c11bd455": "timeOfLastHalving()", +"c11bf4e3": "execute(uint256,address[],uint256[],uint8[],bytes32[],bytes32[])", +"c11bf8d6": "CLXToken(uint256,string,string)", +"c11c0cc1": "getSecondPoints()", +"c11d9d9f": "minEtherContrib()", +"c11dde0d": "setManufacturer(address)", +"c11e1ff3": "getMe()", +"c11efcdc": "getRaisedForCurrentStage()", +"c11f49e3": "ETHERNETSUPPLY()", +"c11f5284": "setReceivers()", +"c11fb13e": "trustedProposals(uint256)", +"c1204caa": "trade(uint256[11],address[4],uint8[2],bytes32[4])", +"c12076f1": "holderGroupNumber()", +"c120d1a4": "outingreserveBalance()", +"c121be4d": "removeAddressManual(address)", +"c122759f": "issuerDistributedUnits()", +"c1232366": "gameCloneFee()", +"c1238940": "bmy(uint256,string,uint8,string)", +"c123a658": "boostCloneMarket(uint256)", +"c1243528": "airdropRecord(address)", +"c1246d39": "simulatePathwayFromBeneficiary()", +"c124e2ea": "checkBetDozen(uint8)", +"c1257bad": "testPassingAProposal()", +"c1258f69": "txCount(address)", +"c1263215": "calculateObtainedJOY(uint256)", +"c1266227": "pow2Bounds(int256)", +"c12692dc": "tokenRaise(address,uint256)", +"c12719a7": "EthPriceDependent(address[],uint256,bool)", +"c1273676": "fundingUnlockTime()", +"c1273ba0": "likeCelebrity(uint256,uint256)", +"c127ae41": "getSignatureHash()", +"c127c247": "addMember(address,string)", +"c127ee20": "SearchUserPurchase(string,string)", +"c128c9e7": "GetBuildingData(address,uint256)", +"c1292cc3": "lastId()", +"c1294224": "payoff(address)", +"c12954fa": "restartMinting()", +"c129827b": "_setSpecialityValue21(uint256)", +"c12a0fd7": "removeReverseRate(address[])", +"c12ae5e9": "blocksInFirstCapPeriod()", +"c12af1ce": "fipsRegister(uint256,bytes)", +"c12b2513": "assignSubBroker(uint256,address)", +"c12c202c": "getGrapesSinceLastHarvest(address)", +"c12c2eb3": "abstractENS()", +"c12c31d6": "listAllAdmins()", +"c12d1d82": "updateToken(uint256,uint256)", +"c12d7b01": "Error(uint16)", +"c12d97de": "DevGiveBlockReward()", +"c12dec39": "_fetchOrdersForMerchant(address)", +"c12e760e": "agreeFromDrone()", +"c12eb191": "updateEarlyParticipantWhitelist(address,uint256)", +"c12edde6": "EURValue()", +"c12f48e3": "AssetRegistered(address,string,string,string,uint256)", +"c12fac40": "oneHundredThousand()", +"c13026b0": "changePresaleCap(uint256)", +"c13051d7": "getCellsInfo()", +"c1309aea": "getOfferor(uint256)", +"c1310951": "createNewDepositContract(uint256)", +"c131acdf": "GetBestTokenCount(uint8)", +"c1321111": "setSaleLength(uint256,uint256,uint256,uint256)", +"c132bc18": "balanceWosPoolForThirdStage()", +"c132dd4f": "authorizedCreateTokensToPrivate(address,uint256)", +"c1331bc3": "setBlacklistSpender(address)", +"c1333a9c": "setPurchaseRequirements(uint8,address[],uint256[])", +"c134bc92": "hell()", +"c13517e1": "createDispute(uint256,bytes)", +"c135a2d8": "getBackgroundValue(uint256)", +"c135c040": "gzePerEth()", +"c1374d5a": "EtherUSDPriceFactor()", +"c138195c": "icoEtherMinCap()", +"c1381ea3": "DutchExchangeProxy(address)", +"c13862ea": "setBoardRating(uint256,uint8)", +"c13982ee": "checkCap()", +"c13992b4": "Metadium()", +"c13a135a": "getWinnerOfEvent(bytes32)", +"c13ab0fe": "WOLF4()", +"c13afa91": "object_locations(uint256)", +"c13b22ef": "setTokenTransferFeeAbs(address,address,uint256)", +"c13b37c7": "updateIsRevertedEndTimeReached()", +"c13b3895": "getHype(uint256)", +"c13b72a8": "registerCDP(uint256)", +"c13c6813": "_addTimelock(address,uint256)", +"c13ca374": "SimpleSale()", +"c13e24d2": "Reinvest(uint256)", +"c13e285d": "maxTrialDrops()", +"c13f4af7": "claim(address,uint128)", +"c13fb08b": "breedOnAuction(uint256,bool,uint256,bool,string,string)", +"c140635b": "audit(bytes32)", +"c1408cda": "getDataFromAddress(address)", +"c141e6da": "ERC721ReceiverMock(bytes4,bool)", +"c141ed74": "calculateCrowdAmount(uint256)", +"c14248a2": "lrcSent()", +"c1429c11": "ChainStarToken()", +"c143a372": "TokenTransferFrom(address,address,uint256)", +"c143ab2c": "crowdSaleStop()", +"c143f701": "getRequestFundInfo(uint256)", +"c1440167": "Voterplayer()", +"c1441172": "setBlackFlagRequest(uint256,uint256)", +"c144734c": "getUploadTypes(uint256)", +"c1448284": "approved(address,uint256)", +"c144a510": "ADDR_WITHDRAWAL2()", +"c144a5db": "Bytelending(uint256,string,string)", +"c144d7dc": "buyMine(uint8)", +"c145d105": "withdrawSettle(bytes32,address,uint256,uint256,bytes32)", +"c1460942": "getLiquidationSpread()", +"c14634cf": "KudosTokenSale(address,uint256,address)", +"c1468587": "mainwallet()", +"c146eb02": "UNOPEN(string,string,uint256,uint256,bool)", +"c148002c": "latestUnlockStage()", +"c148e20e": "FCCToken(string,string,uint256,uint256,bool)", +"c14958cb": "giveUp(address,address)", +"c1499199": "_uncreditUser(address,uint256)", +"c14a2455": "balDailyLotto()", +"c14a3b8c": "mintTimelocked(address,uint256,uint256)", +"c14a6046": "payerContract()", +"c14a932f": "signedTransferFromSig()", +"c14a9f05": "challenge(address,uint256,uint256)", +"c14ab7a1": "PredictTheFutureCaller(address,uint8)", +"c14bafb1": "lastPurchaseTime()", +"c14bfd29": "hasAlreadyVoted(uint256,address)", +"c14c1ce3": "requestUpdate(uint256)", +"c14c5574": "Gold(address,address,int256,address)", +"c14c7bd7": "performRead1()", +"c14d2358": "init(address,uint256[],uint256,uint8,uint256,bool)", +"c14d3abe": "enableSuperUser(address,bool)", +"c14e50ce": "setValidater(address)", +"c14e61ba": "overdraftTotal()", +"c14e6cd0": "changeTransferLock(bool)", +"c14e7a3f": "setCooldown(uint16,uint32)", +"c14e9f58": "submitBlockHeader(bytes)", +"c14edad2": "teamDistribute()", +"c14f42fd": "mLoadAndReturn(bytes32)", +"c14f7ea8": "rejectSubmission(uint256)", +"c14fbd64": "satoshiMood()", +"c15185f5": "getAuditPrice(uint256)", +"c151ac55": "_createMovie(string,address,uint256)", +"c151c5ad": "getSignerTable()", +"c15294a1": "creatGameBet(uint256,bytes32)", +"c152d3eb": "setKYCTeam(address)", +"c1531ecc": "changeIssuer(address,bool)", +"c1551fc8": "QuadCoreChain()", +"c1554658": "changeDepositorLimit(uint256)", +"c155836d": "LuCyToken(address,string,uint8,string,string)", +"c155cfde": "_preAllocateTokens(address,uint256)", +"c1560a14": "hardCapInUSD()", +"c1562547": "checkUser()", +"c156ef6b": "_createPainting(address,uint256,uint256,uint8,uint8,uint256,uint256)", +"c157b869": "totalUsdValueOfAllTokens()", +"c157d72c": "itemInfo(address,uint256,bytes)", +"c1596534": "addReserve(address,uint8,bool)", +"c1598f6a": "newWage(uint16)", +"c1599011": "conversionRateOfState(uint256)", +"c1599bd9": "X()", +"c15a6791": "oneShotTokenRepartition(uint256)", +"c15ae376": "_shareToDistribution(uint256,address,uint256,uint256)", +"c15aec44": "totalGasUtilizing()", +"c15b42bf": "AsignarPasesLibres(uint16,uint32)", +"c15c09b5": "admin_set_exchange_rate(uint256)", +"c15d0b10": "getLoanValue(bool)", +"c15d15da": "_isValidSignatureAndData(address,address,bytes)", +"c15d7bca": "setEthToTokenConversion(uint256)", +"c15e47c4": "getFirstBatch(address,address)", +"c15e61c0": "Authorization()", +"c15f05fb": "changePrimaryArbitrator(address)", +"c15f618a": "purchasePokemon(uint256)", +"c15f68f0": "Retired()", +"c15f817d": "_import_island(bytes32,address[3],uint256[7],uint256[8])", +"c15f8779": "get_previous_item_in_state_from_item(bytes32,bytes32)", +"c1614981": "allocateLocked(address,uint256)", +"c1615945": "setAffiliateContract(address)", +"c1615c87": "DEFROST_PERIOD()", +"c161d506": "CollabCoinToken()", +"c162ba2f": "walletId()", +"c162bc03": "clearProposal(address)", +"c163bba7": "publish(string,string)", +"c163edf7": "OutcomeEvent(string,uint256)", +"c163fb0e": "ownedHouses(address)", +"c1640913": "RETAINED_TOKENS()", +"c166311f": "freeLotterySeconds()", +"c166c458": "getUserRequestCount(address)", +"c166ee38": "sweepAccount()", +"c1670257": "redeemContractSentTokens(address,uint256)", +"c1674b74": "assertReadyToClose(uint256)", +"c167d1cd": "getAvailableSupply()", +"c1684711": "migrateTokens(address)", +"c16849c0": "tokenSC()", +"c1687877": "buyTokens(uint256,uint256,address)", +"c168e037": "getCustomerPremium(uint256)", +"c1691fc3": "add_bonus(uint256)", +"c1694bd4": "TransferDetails(string,uint256,string,uint256,uint256,address[])", +"c16959b2": "_unpackRaceFinishData(uint256)", +"c1699a99": "stakePeriod()", +"c1699bf6": "setPrimaryAccount(address)", +"c169ec0d": "setBuzzCafe(address)", +"c16ac06f": "CM()", +"c16ae3ce": "_receiveFrom(address,uint256)", +"c16b451f": "_checkedTransfer(address,address,uint256)", +"c16b9374": "regularEndGame(address,uint32,uint8,uint16,uint256,int256,uint256,address)", +"c16bca13": "MIN_AUDIT_TIME()", +"c16bea20": "addControllerByPartition(bytes32,address)", +"c16c0851": "miningOneSelf()", +"c16d1377": "IS_CND_CONTRACT_MAGIC_NUMBER()", +"c16d3344": "setMinimumOfferPrice(uint256)", +"c16d515a": "_createCenturion(address)", +"c16e50ef": "validate(bytes)", +"c16f402c": "getEpisodes()", +"c16fe907": "getTransfer(uint256)", +"c1707f66": "stateSetOpen(uint32)", +"c170fd54": "bid(uint40)", +"c171747b": "convertEthToMet(uint256)", +"c1717f80": "BC2Token()", +"c171cfa6": "getBetValueByGamble(uint8,uint8)", +"c171fb91": "referrerLevel1Percent()", +"c172085e": "initialization()", +"c17281d0": "refundPartial(address,uint256,uint256,uint256)", +"c172aae5": "getIdentifier(uint256)", +"c172f9c9": "receiveApproval(address,uint256,address,bytes32)", +"c1733712": "authorizePayment(address,uint256,uint256)", +"c1733f68": "getToken(string)", +"c173508b": "removeConnection(address,address,bytes32)", +"c1736222": "tokenForSPSold()", +"c1739b69": "InfraOfOwner(address)", +"c1747585": "testEvent2()", +"c174cc59": "getrunused(address)", +"c1751903": "lockBreak()", +"c1756a2c": "sendEther(address,uint256)", +"c1758fee": "vest2mlDevelopers(address,address)", +"c1766657": "addBonusForMultipleHolders(address[],uint256[])", +"c176b1d8": "deletePriceIdv(bytes32)", +"c176d42a": "NavGlobalTourCoin()", +"c176e639": "payout(address[],uint256[])", +"c176e73b": "pkt()", +"c177c20f": "CliToken()", +"c177e804": "WEETtoken()", +"c177f22e": "findKingdomCalled(string)", +"c1784a4e": "safekey(uint256)", +"c1786ab2": "pre(address,bytes32,bytes32)", +"c178a2d4": "CreationContract()", +"c178fc87": "setTokenRate(uint256,string)", +"c1790561": "_getPetBonus2(uint256)", +"c179186e": "collectWinnings(uint256,uint256,uint256)", +"c179520c": "ManageAccount()", +"c17a099b": "presaleBonusTokensDistributed()", +"c17a893e": "transferAUTOtoken1(address[])", +"c17b5a93": "ProfitExchange()", +"c17b9770": "log2Floor(int256)", +"c17c0456": "ownerCEO()", +"c17c3521": "setHourlyRate(uint256)", +"c17ccc6c": "withdrawUnlockedTokens()", +"c17d8720": "checkBank(string,address)", +"c17de343": "isStarOwner(uint256,address)", +"c17e2aa1": "burnAllTokens()", +"c17e6817": "sendSafe(address,uint256)", +"c17e92b6": "unregisterFromBlacklist(address)", +"c17ed7bd": "purchaseSilver()", +"c17f23e8": "getRoundID()", +"c17f8891": "setEtherFeeMin(uint256)", +"c17ffac6": "unsetRegionForSale(uint256,uint256)", +"c180e1d0": "GCPToken()", +"c1811783": "FreezableToken()", +"c1812b15": "reorganizeOwners()", +"c1826d78": "Collect()", +"c1829a14": "testFailTooFewConfirms()", +"c182f531": "GetFreeEther()", +"c183660c": "cancelJobContract(uint256,string)", +"c18378a0": "sellTokensFrom(address,uint256)", +"c18384ec": "setRestricted(address)", +"c1838e92": "proposeTokenOwner(address)", +"c1839258": "LogTokenPurchase(uint256,uint256)", +"c1840b39": "_generateRandom(bytes32)", +"c1857bf7": "withdrawFoundation(address,uint256)", +"c185d772": "emissionStages(uint256)", +"c185e492": "preSaleThirdPrice()", +"c186dcbf": "getStaticArraySum()", +"c18715f8": "prolongationPermitted()", +"c1873e26": "releaseCoreTeamAccount()", +"c1889ff2": "payAccTax(uint256)", +"c188f44b": "addproduct(string,string,uint256,string)", +"c1891ac6": "multiplePing(address[])", +"c1899ca7": "request_dividend(address)", +"c18a40c7": "multiowned(uint256,address[])", +"c18b4136": "AAC()", +"c18b5279": "KFHToken()", +"c18b8db4": "listings(bytes32)", +"c18b9760": "test_insert_findWithHintPrevDecreased(int256)", +"c18bca5f": "setCollectionAddress(address,address)", +"c18ca54c": "testEvent(int256,int256,uint256,uint256,string,string)", +"c18d767a": "weiMinSalePreIco()", +"c18e8903": "totalWeiRaisedDuringICO4()", +"c18e94b4": "Keizer()", +"c18edde1": "saleopeningTime()", +"c18f4831": "burnFeeDenominator()", +"c1908360": "createEntry(string,string)", +"c190b129": "holderState()", +"c1912433": "acceptAndPay(bytes32,uint256[],uint256[],int256)", +"c1918e90": "accountAddressForSponsee()", +"c191cbd7": "TeamTokensAllocated(uint256)", +"c191d37d": "Escapable(address,address,address)", +"c1927292": "TIER1_BONUS()", +"c1929d8c": "ADVISOR_THREE()", +"c192ca98": "isCS(address)", +"c1932833": "maxAirdropParticipants()", +"c19358bb": "setPropertyLastUpdater(uint16,address)", +"c193fbf8": "pushArray(bytes32,address)", +"c19455c8": "signedTransferCheck(address,address,uint256,uint256,uint256,bytes32,address)", +"c1955e62": "spend(uint256,bytes32)", +"c195dc41": "getStageEndDate()", +"c19678d5": "canLotteryBeExecuted()", +"c196b54f": "bound(uint256,uint256)", +"c1971240": "dailyGrowthUpdated_date()", +"c197a7b1": "getLastStoragePayDate()", +"c197cdee": "preSaleTokenLeft()", +"c1989276": "MaxItems()", +"c1991040": "getCurrentVotingDescription()", +"c19a8095": "deleteUser(address,address)", +"c19bbf50": "getLockStatus(address,address)", +"c19c9a21": "CCTHCoin()", +"c19d7808": "MamaBearToken()", +"c19d93fb": "state()", +"c19da6b2": "canBuy(address,address)", +"c19dccd8": "KantrotechCoin1(string,string,uint256,uint256)", +"c19dd320": "cancel2(uint256)", +"c19e33ce": "COIN_SUPPLY_ICO_PHASE_0()", +"c19e7b00": "WeiCapChanged(uint256)", +"c1a06de3": "Valens()", +"c1a12d66": "crowdsaleOpen(bool)", +"c1a21bf3": "sellerBalances(address,address,uint256,address)", +"c1a2a8f4": "boards()", +"c1a2babc": "getMemberSince(address)", +"c1a38768": "STARTUP()", +"c1a3bb06": "total_bet_withdrawn()", +"c1a3bda5": "randomQueryID()", +"c1a6ec6a": "ADVISORY_TEAM_PORTION()", +"c1a7db7b": "MtcDailyLimitChange(uint256)", +"c1a82cdb": "reissueCertWithID(bytes32,bytes,bytes32,uint256,bytes32,bytes,bytes32,uint256,bytes32)", +"c1a85e16": "test_insert_findWithHintNextUpdateTail()", +"c1a9953f": "checkRokTeam()", +"c1aa049d": "getIsPurchased(address)", +"c1aa104e": "OpenRetailContract(uint16,bytes32,string,string)", +"c1aa5d98": "getGameIdByAddress(address)", +"c1aa721d": "lockAfterManuallyMint()", +"c1aaa717": "_bountySupply()", +"c1ab1b54": "RebateCoin()", +"c1abbf6a": "addjoinlist_even(address,uint256)", +"c1ac7902": "playJackpot()", +"c1ad5bea": "isdeposit()", +"c1ad7925": "finalizeFunding(address)", +"c1adb83e": "NecashTokenBase()", +"c1ae36d0": "carsOf(address)", +"c1ae4044": "checkBetColor(uint8)", +"c1af5785": "enterLottery()", +"c1afdd48": "belowSevenBets()", +"c1b0510a": "GlobalBusinessSystem()", +"c1b0561d": "PDTToken()", +"c1b056b0": "getNodeLeftChild(bytes)", +"c1b06513": "registerEvent(bytes32[])", +"c1b07b1a": "receiverOne()", +"c1b082b6": "issueOfTokens()", +"c1b0dc2f": "LogPolyClaimed(address,uint8,uint256,uint256,uint256)", +"c1b15e44": "_setAllowance(uint256)", +"c1b16cb0": "ownerAddAsset(string)", +"c1b2dfc1": "gameGiftMaxAmount()", +"c1b36489": "QuickUnionPayChain()", +"c1b3e6ab": "blockedSum()", +"c1b43a17": "secondHighestBidder()", +"c1b43af8": "IPchainStandardToken(uint256,string,uint8,string)", +"c1b466d6": "calculate0xbtcReceived(uint256)", +"c1b4aa51": "burnContractCoins(uint256)", +"c1b533b0": "getExchangeRateInUSD()", +"c1b58f6c": "unlockAllAllocationAddresses()", +"c1b664de": "setStageCount(uint256)", +"c1b668a9": "getBoardInfo(address,address)", +"c1b68a7c": "DebitClientOnce(address)", +"c1b73010": "removePauser_(address)", +"c1b74ad8": "propose(uint256,bytes32,address)", +"c1b7a892": "AsiaCoin()", +"c1b8847b": "setMaxFeeWithdrawal(uint256)", +"c1b8b704": "updateGlobalMax(uint256)", +"c1b90c7b": "_sendTokens(uint256,address)", +"c1b99811": "transferPrimordialToken(address,uint256)", +"c1b9f177": "bountyReserve()", +"c1ba93e1": "dbkDeposit()", +"c1bb95d0": "TransferConfirmed(address,uint256,uint256)", +"c1bbcbef": "MICKTOKEN(uint256,string,string)", +"c1bc2664": "ClearView()", +"c1bd1e85": "killFeed()", +"c1bd3685": "proposeSolve(uint256,uint256)", +"c1bd762b": "wantMyEther()", +"c1bd8186": "crowdsalepricing(address,uint256)", +"c1bd8ecb": "initializeCrowdsale(address,uint256)", +"c1bd9b12": "getShareAddressFromId(uint256)", +"c1bdff26": "onNewLoan(uint256,address)", +"c1be4031": "XaurumProxyERC20()", +"c1beb1e1": "MusereumToken()", +"c1bf1dcf": "setRegistrar(address,bool)", +"c1bf22a9": "XAUToken()", +"c1c02a46": "Atlas()", +"c1c03094": "EventBattleOver()", +"c1c0e046": "rescueAccount()", +"c1c0e9c4": "exec()", +"c1c1066b": "getCommentsCount()", +"c1c11aca": "GitToken(uint256,string,uint8,string)", +"c1c11c96": "getSender(address,uint256,address,uint256,uint256,uint256)", +"c1c1d218": "BOND()", +"c1c28d7d": "calNewTokens(uint256)", +"c1c379ac": "tokenTwitter()", +"c1c3eccf": "vestingPeriodInMonths()", +"c1c43648": "addAction(uint256,uint256,uint8[6],uint8[6],uint16[6],uint8[6],uint256,uint256)", +"c1c4676e": "updateGameCost(uint256)", +"c1c5897e": "AOMcoinERC20()", +"c1c5a3b6": "CaptainSell()", +"c1c5de4a": "tryDeposit()", +"c1c64ecf": "mintPriceBuffer()", +"c1c6c749": "changeWhitelistPrivateStatus(address,bool)", +"c1c6d4e8": "addLoanProduct(uint32,uint32,uint32,uint256,uint32,bool)", +"c1c723f4": "validateProposedMonarchName(bytes)", +"c1c74dde": "_setFunds(address,uint256)", +"c1c7bc68": "addFreeMineralMulti(address[],uint32[])", +"c1c8277f": "reclaimOwnership()", +"c1c8b89d": "Recash(uint256,string,string)", +"c1cbbca7": "contribute(uint256)", +"c1cbbe6c": "getRoundAvailableToken(uint256)", +"c1cbdff3": "moreThanSoftLimit()", +"c1cc0046": "returnOffer(uint64)", +"c1cc0775": "calculateFeeDynamic(uint256,uint256)", +"c1cc6958": "leekStealGo()", +"c1ccaed3": "pageBuyRecordByAccount(address,uint256,uint256)", +"c1cd1759": "SpicePayroll(address)", +"c1cda902": "setTradeable()", +"c1cdaae8": "generate(address,address,address,uint256,uint256)", +"c1ce53fc": "reflect(string)", +"c1ce56eb": "addAccount(address,uint256)", +"c1ce6647": "minAmountToGetBonus()", +"c1cfb99a": "get_balance()", +"c1d038b2": "getSkillIdByIndexAndLevel(uint8,uint8)", +"c1d11037": "updateAddresses(address,address)", +"c1d1f5c0": "BirdToken()", +"c1d1faf3": "createAuction(uint40,uint128,uint128,uint40,address)", +"c1d22403": "_subFromValueHeld(address,uint256,bool)", +"c1d25c3d": "insert(int256,int256)", +"c1d298ab": "emitFeesDonated(address,uint256)", +"c1d32ad5": "Distribute(address,uint256)", +"c1d34b89": "transferFromAndCall(address,address,uint256,bytes)", +"c1d357bc": "getMinAllowedBid(uint256)", +"c1d4691a": "withdrawalTo()", +"c1d47a21": "submitPayment(bytes8,uint32)", +"c1d4bc64": "originalsCount()", +"c1d4f708": "getMwLength()", +"c1d55af8": "buy(uint256,address,uint256,bool)", +"c1d5725f": "buyToken(address,address,uint256)", +"c1d5e84f": "addNewUser(address)", +"c1d6036b": "contractExchangeRate(address)", +"c1d63ce6": "deleteArrayBytes32(bytes32,uint256)", +"c1d66482": "Postman()", +"c1d6ab37": "setIsContainerForShareToken(bool)", +"c1d6cbd8": "getPlayerPoint(uint32)", +"c1d75bea": "IBM()", +"c1d9e273": "nextFreeCount()", +"c1da1881": "getPollType(uint256)", +"c1da3923": "ICOstartTime()", +"c1dbbfb3": "withdrawAllFromRoot()", +"c1dbd9b2": "authorize(address,uint256)", +"c1dbf5ef": "changePTSBAddress(address)", +"c1de0842": "quarterThird()", +"c1de93df": "Forwarded(address,uint256,bytes)", +"c1de9ef8": "getPositionHeldToken(bytes32)", +"c1dfacb2": "getQualifiersPoints(uint160)", +"c1e0e604": "updateUsdPerMEth(uint256)", +"c1e10f65": "distributeeBitcoinCashMedium(address[])", +"c1e1955e": "getaddressfocuscardid2(address,address)", +"c1e1b327": "adminCollectPastShopFund()", +"c1e31eab": "SERVER_TIMEOUT()", +"c1e3bd3e": "getParticipants(uint256)", +"c1e41f38": "COMPANY_TOKENS()", +"c1e457c8": "experienceDelay()", +"c1e472be": "returnNotes(uint256)", +"c1e4884d": "setSecondStageStartsAt(uint256)", +"c1e4dfda": "setPriceWei(uint256)", +"c1e50f3c": "internalAddManager(address)", +"c1e5202a": "isUserMakerFeeEnabled(address,uint256)", +"c1e52775": "addDenomination(bytes8,address)", +"c1e5304a": "CreateNewDraw(uint256,bytes)", +"c1e5976e": "getStarkKey(address)", +"c1e59a50": "Example4(string)", +"c1e6102b": "LunyrToken(address,address,uint256,uint256)", +"c1e65cb9": "BTRS()", +"c1e68672": "totalWhitelistedFunding()", +"c1e68e4b": "developer_string_D(string)", +"c1e6c506": "TokenPriceInWei(uint256,uint256)", +"c1e70e63": "startManualPeriod(uint256)", +"c1e71903": "getResults(uint256,string)", +"c1e7310a": "signEA(uint32)", +"c1e74d71": "minPresaleContributionEther()", +"c1e80334": "_acceptImplementation()", +"c1e99a0e": "isInitialInvestor(address)", +"c1e9c53e": "Lottery(uint8,uint256)", +"c1ea8b93": "preCrowdsaleTokens()", +"c1eac693": "ArisaCoin()", +"c1eb1840": "canBurn()", +"c1eb3534": "batchMintToPool(uint128[],uint256[],uint128[])", +"c1eb354a": "setlockall(uint256)", +"c1eb50a7": "LinaAllocation(address,uint256)", +"c1eb5ddd": "DEV()", +"c1eb8c89": "wihtdraw()", +"c1ec10f4": "RigoBlock()", +"c1ec4a2a": "RegisterContract()", +"c1eca4b0": "checkCanAddStockProfit()", +"c1ed41fa": "appliedPresale()", +"c1ed54a1": "isBetValid(uint256,uint256,bytes)", +"c1ee22dd": "EMISSION_FOR_SALESTAGE5()", +"c1ee3375": "autoTransferApproved(uint256,uint256)", +"c1ef098b": "storeHarvestOperationByRegulator(string,string,string,uint32,uint16,uint16,string)", +"c1f04f3c": "allWeights()", +"c1f06e89": "changeYUMOAddress(address)", +"c1f0dac1": "test_largeDeviationNotPermitted()", +"c1f0e2c3": "createGameRound(uint256)", +"c1f10663": "withdrawAccumulatedFees(address)", +"c1f16bdc": "getWeiBalance(address)", +"c1f18e38": "isExpired(bytes)", +"c1f19220": "summFounders1()", +"c1f1d116": "internalVote(bytes32,address,uint256,uint256)", +"c1f307c9": "_isTime()", +"c1f45e80": "sendForPreICO(address,uint256)", +"c1f52604": "winningPrice()", +"c1f573ca": "bidInAuction(uint256,uint256,uint256)", +"c1f602e0": "intoRoom(uint256)", +"c1f62946": "getSecretRevealBlockHeight(bytes32)", +"c1f64cb0": "supportedRoleList(uint256)", +"c1f77309": "assignedPayoutAddress()", +"c1f7c539": "initPricer()", +"c1f8056b": "createAvatar(address,string,uint256)", +"c1f979ab": "add_recent(uint256)", +"c1fa1ed0": "assertEq(bytes32,bytes32,string)", +"c1fae25b": "receiveAirDrop()", +"c1fb7c34": "hmin(uint128,uint128)", +"c1fb9b9e": "developer_How_To(string)", +"c1fcf863": "getSoftwareExecRecord(uint32)", +"c1fd2580": "spendable_supply()", +"c1fd4339": "createMarket(bytes32,uint256,uint256,address)", +"c1fe5281": "minPurchaseNum()", +"c1ff808d": "changeBonus(uint256)", +"c1ffc0a5": "MinimumEthereumInvestmentUpdated(uint256,uint256)", +"c2006a18": "set_fixedFeeInCWC(uint256)", +"c201293b": "setCollateralPoolContractAddress(address)", +"c20155df": "ethRate2()", +"c201df97": "UnLockAddress(address)", +"c2021d1b": "maxTeamBonusBps()", +"c203367a": "EnddatePresale()", +"c2038560": "setOutcome(bytes,bytes)", +"c203d77f": "setSaleFinishTime(uint256)", +"c204505a": "testFailRetractLatestRevisionDoesntHaveAdditionalRevisions()", +"c204642c": "airdrop(address[],uint256)", +"c204b288": "InvestorChanged(address,address)", +"c204f9f1": "_transferFromToICAP(address,bytes32,uint256)", +"c2052403": "payOut()", +"c20547b3": "getGameAmount(uint256)", +"c205afd4": "deferredTotalTokens()", +"c205e64c": "revokeInsertAgentAuthorization(address)", +"c20615ed": "ownerWithdrawn()", +"c20652fe": "setApiAddress(address)", +"c2083f55": "lacksFunds()", +"c2091d0e": "getPatron(uint256)", +"c209fbe9": "change_notice(string)", +"c20a20d6": "setBlipTokenAddress(address)", +"c20a6ae9": "EDMToken(address,uint256)", +"c20c0f3a": "betsForLevel(uint256)", +"c20c1d9b": "newWithdrawCommission(uint256)", +"c20dcbf7": "createPool(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,string)", +"c20e346f": "unFrozenToken(address,uint256)", +"c20ec5dc": "numberOfFriends()", +"c20f966b": "Utcoin()", +"c2108a92": "calculateBalance(uint256,uint256)", +"c210c623": "getKeys(uint32)", +"c21191ae": "GechainCoin()", +"c2127e03": "getMyShrimp()", +"c212bad5": "dropModule(string,bool)", +"c212cffa": "NUGOLD()", +"c2134b23": "addRecoverer(address)", +"c215290a": "frozenUntil(address)", +"c215e800": "currentSubRound()", +"c2161c31": "getStringHash(string)", +"c2168ecd": "removeMintContract(address)", +"c216c0d3": "addCredits(address)", +"c217a724": "spendWithGasAndData(address,uint256,uint256,bytes)", +"c217c0e1": "ClickGemTokenERC20()", +"c2190c94": "registerSettlement(uint64,address,address)", +"c219c28c": "votingTokenAddress()", +"c219d326": "getData_14()", +"c21aa2e4": "PoHarj()", +"c21ab7f9": "createToken(address)", +"c21abf05": "tatalEthFromBuyer()", +"c21afa55": "MintingManagerRevoked(address)", +"c21afe12": "schedulePriceUpdatesRolling(uint256,uint256,uint256)", +"c21bbe56": "SetupDone()", +"c21c45e3": "iconRate()", +"c21c5ee1": "fixSpecications(bool)", +"c21c9c21": "validEvent()", +"c21d0204": "SetEvaluate(bytes32[],uint8,uint64[])", +"c21d5ab7": "setNode(address)", +"c21db033": "removeSupplier(address,address)", +"c21de274": "transferReverseProxyThirdParty(address[],uint256[],uint8[],bytes32[],bytes32[])", +"c21e5712": "makeLiquidCor()", +"c21ea693": "retraitStandard_3()", +"c21ec92c": "getAssetIpfs(uint256)", +"c21ed112": "genesisVirus()", +"c21fb125": "SpecificApproval(address,address,uint256)", +"c21fcffb": "DIYTubeCoin()", +"c2205ee1": "_authority()", +"c22082ab": "EveryCoin(address,uint256)", +"c2222b80": "claimSubscriptionDeposit(uint256)", +"c222ef6d": "periods(bytes32)", +"c2234f67": "CONVERSION_DENOMINATOR()", +"c2235e74": "getTotalAmountOfChatMessages()", +"c2236b26": "setICO3Phase()", +"c2239daa": "setselfdropamount(uint256)", +"c223f557": "stopRedeeming()", +"c2248877": "getBarCodeDataCount(bytes32)", +"c2248c22": "changeOldTokenReward(address)", +"c2250a99": "transferStoreOwnership(address)", +"c225752c": "OneChanceCoin(string,string,uint8,address,address)", +"c22598d2": "BitClemm()", +"c225bf03": "resetContractDeploymentDate()", +"c226d279": "setMiniPoolEdit_7(string)", +"c226d9ee": "doTest()", +"c2276090": "settleBet(bool)", +"c227cee0": "shutThatShitDown()", +"c2289576": "AddTitle(uint256,string,string,string,uint256)", +"c228bcc6": "getFillVolumes(bool,bytes,uint256,uint256)", +"c2299e33": "shutdownMarket(bytes32)", +"c22a146c": "Unlock(address,string,bytes32)", +"c22a933c": "setBaseDeposit(uint256)", +"c22ab4e0": "reservedWallet()", +"c22af7ff": "ComputeBuy(uint256)", +"c22c4f43": "services(uint256)", +"c22d6c3c": "setArenaInterface(address)", +"c22f0ee2": "transferManagers(address)", +"c22f1c54": "_initializeAccount(address,address,uint256,uint256)", +"c22f8250": "updateStandard(bytes4,bytes4)", +"c22fc384": "exitScam()", +"c2304c4a": "addExplicitPosition(uint32,int64)", +"c2314be4": "CONFIG_FEES_DIV()", +"c231bace": "setMigrationTarget(address)", +"c232209e": "_verify(address,string)", +"c2328516": "disablePrivateFund()", +"c2329e5f": "_isNotOnSale(uint256)", +"c233e870": "isLatestPatchTree(bytes32,bytes32)", +"c2353918": "getCount(uint256)", +"c2356d23": "mintChest(address,uint16,uint24,uint24,uint8,uint8)", +"c235a5c7": "getGameStart(uint256)", +"c235e858": "VendorInterface(address)", +"c2362dd5": "lastEpochBlock()", +"c23693e0": "multiAccessRequired()", +"c23697a8": "check(address)", +"c236cc66": "GeneralUpdate(uint256,uint256)", +"c2370a62": "openGameResult(uint256,string)", +"c237898d": "getOwnerBalanceInMilliTokens()", +"c2381296": "beginPwn()", +"c2385fa6": "right78(uint256)", +"c238999b": "dislikeTrack(address,bytes32)", +"c239dfe0": "PermissionAdded(address)", +"c23a25ba": "getRoundBetOrigin(uint256,uint256)", +"c23a7427": "createMultipleWikiPages(string[])", +"c23a9e84": "getuserinverst()", +"c23b4b5b": "bountyShare()", +"c23c87d5": "play(bool)", +"c23da3a9": "initialSaleEndDate()", +"c23de962": "DefaultActionCalled()", +"c23e1cea": "SaleTokens()", +"c23ec301": "KSScidTOKEN()", +"c23f001f": "balances(address,address)", +"c23fed45": "setEscapeRequest(uint32,int256,uint32)", +"c2407089": "CursedToken()", +"c2410a69": "lockCostPerHour()", +"c2412676": "Token()", +"c2427f76": "getBidID(address,bytes32,uint256,uint256,uint256,uint256)", +"c242afaf": "bet(uint256,uint256,uint256[],uint256,address,bytes32)", +"c243431e": "AnalyticProxy()", +"c24366f0": "setKYCProvider(address)", +"c243bdee": "isHolderOwnAddress(bytes32,address,address)", +"c24504b7": "internalBuyTokens(address,address,uint256)", +"c245c1bc": "ownerBurnToken()", +"c2473378": "consortiumPlaceholder()", +"c247620d": "getArtistInfo(address)", +"c2490a67": "removeCardOwner(uint64)", +"c24924d6": "setQueryFee(uint256)", +"c2494dbf": "transferOnWallet()", +"c24962f4": "calculatePercentageToRelease(uint256)", +"c24977cf": "testPrivate()", +"c2498be6": "conjureAirdrop()", +"c24a0f8b": "endDate()", +"c24a8908": "token_airdrop_cnt_max()", +"c24a9674": "finalizeLastRound()", +"c24ad463": "Refundpot()", +"c24becf3": "getLastTier()", +"c24c153d": "addRound(uint256,uint256,uint256,uint256,uint256,bytes32)", +"c24d316e": "UNITDummyPaymentGateway(address)", +"c24de0e4": "halvingSubsidy(uint256)", +"c24dec82": "TOKEN_BUSINESS()", +"c24e1fc1": "issuedSupplyRatio()", +"c24fe21b": "transferLockup()", +"c2502d34": "claim_price_money()", +"c2506eee": "setO3(address)", +"c2507ac1": "getTokenAmount(uint256)", +"c2507ef7": "_createPanda(uint256,uint256,uint256,uint256[2],address)", +"c250a312": "active_withdrawable()", +"c250ef46": "refSystem(uint256,address)", +"c25193ad": "lcm(int256,int256)", +"c251a4e9": "G2Ufund()", +"c252ca75": "getBonusPercent(address)", +"c252d844": "rest_time()", +"c253400b": "RPS(address)", +"c2535bf0": "COOLCOIN()", +"c254e4db": "SFT()", +"c2552497": "impl_mining(address,bytes)", +"c255343e": "targetUser()", +"c255fa40": "updateTotal()", +"c255fb17": "getRefBalance(address)", +"c25615c0": "joinOneLottery()", +"c256d578": "getLastAuctionWinsDate()", +"c256ea58": "get_receiverCryptobank(uint256)", +"c2571a0a": "percUp(uint256)", +"c2572c51": "advisorsAndPreICO()", +"c2577661": "getBallotPapper(uint256,uint256,uint256)", +"c257c851": "calculateEtherReceived(uint256)", +"c257eabb": "etherPaid()", +"c257f3ab": "getNumberOfShipsByOwner()", +"c258ff74": "List()", +"c2596b1e": "getDragonPrice(uint256,uint256)", +"c25a796e": "setHardcupFalse()", +"c25ab8b0": "iOSCoin()", +"c25acada": "Bithereum()", +"c25ae09f": "EthealNormalSale(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"c25b345a": "VivekRohitVibhayToken()", +"c25c22ee": "stageTokenMul(uint256)", +"c25cf1d0": "changeLockPeriod(uint256)", +"c25d0ac1": "tgeSettingsPartInvestor()", +"c25e6908": "ultimateOutcomes(bytes32)", +"c25f1901": "addThing(bytes32,string,string,string)", +"c25f1afe": "SponsorAdded(address)", +"c25f75fc": "pantry()", +"c25fe1a4": "changeHoldingTax(uint256)", +"c2606d99": "BITTECHToken()", +"c2608314": "getJntBeneficiary()", +"c260f681": "IsBoilerValid(uint256)", +"c2610cda": "SecretNumber()", +"c26181e0": "censorUser(address,bool)", +"c2619a5a": "AdministratorAdded(address,address,bool)", +"c26298a7": "getBalanceOfResidualBcoupons()", +"c262a33b": "preSaleCloseTime()", +"c262b912": "createCampaign(string,uint256[3],uint256[],uint256,uint256,uint256,uint256,string,int256)", +"c262df45": "isKnownRequest(address,address)", +"c26317d1": "RoundRevealStarted(uint256,uint256)", +"c26381f2": "limitETH()", +"c264786f": "pauseBlockNumber()", +"c264a063": "withdrawExcess()", +"c264a77c": "setSettleTimeout(uint256)", +"c2656473": "CROWDSALE_LIMIT()", +"c265a6c0": "KRCPreSaleContract(uint256,address,address)", +"c26613d5": "LogRebalance(address,bytes32,string,uint256,uint256,uint256)", +"c2664609": "submitStackholderTransaction(address,bool)", +"c2674780": "freecommunitycoin()", +"c2676e39": "VAToken()", +"c267e4b8": "previousWeiBalance()", +"c26875a4": "calculateCellBuySimple(uint256)", +"c268e777": "setDailyHourLimit(uint8)", +"c268e93f": "recordShareholders(address,address,uint256)", +"c269014b": "getMemberId(address)", +"c2695a25": "Rivercoin()", +"c2699b1d": "getFirstBuyLimit(bytes32)", +"c269f263": "PRETDESupplyRemaining()", +"c26a331d": "bonusProvider()", +"c26aa3c9": "lockUnicorn(uint256)", +"c26b41e7": "totalUETsSold()", +"c26b7ce9": "CashTelexToken()", +"c26b93df": "vote(uint80,uint256)", +"c26bacd1": "removeDriver(address)", +"c26c12eb": "getQuorum()", +"c26c7472": "addTimeToExpiry(uint256)", +"c26c84ec": "setBI(bytes32,int256)", +"c26d0412": "ethRate1()", +"c26d0c2c": "emitWorkPaused(uint256,uint256)", +"c26d69e1": "OnePercentGift()", +"c26d7daa": "startGladiatorBattle(uint256)", +"c26dd189": "jade(uint256)", +"c26fe7ce": "releaseVestedTokensFor(address)", +"c270cbeb": "BtcThumb(uint256,string,uint8,string)", +"c270ce28": "rdCollectorAddress()", +"c270d7cb": "getPlayerRoundWinningInfo(uint256,address)", +"c2710949": "calcValuePerShare(uint256,uint256)", +"c2714a97": "addBRA(address)", +"c271ca90": "numMomentsOf(uint256)", +"c2722ecc": "getStore()", +"c2723d2e": "token_transfer(address,address,uint256,bytes)", +"c272f73e": "burnSignature(bytes,address,address,address,uint256,uint256,uint256,uint256,bytes)", +"c27382d9": "buyAndPlayGame(uint256,uint256,address)", +"c273b05f": "spentParsecs()", +"c27509cf": "investDirect()", +"c27549d9": "setRemainders(uint256,uint256)", +"c276086f": "createProducer(bytes32,uint256,bytes32)", +"c2761031": "k(uint256,uint256)", +"c2765b77": "setLegalToken(address)", +"c276963f": "tabsOneEthCanBuyICO()", +"c2769b11": "renounceVesterManager()", +"c276dce3": "internalForward()", +"c2775347": "haltsTrades()", +"c2777ce3": "currentEtherRateInCents()", +"c277f1ac": "fromId(uint256)", +"c277fe56": "pause(bool,string)", +"c2783ee5": "viewCrowdSaleLive(bool,bool)", +"c2784966": "TkoWhitelist(address)", +"c279d042": "product4_sell()", +"c27a65c1": "changeEthPriceQueryDelay(uint256)", +"c27a74d0": "catOwners(uint256)", +"c27b1ed9": "getConversionRateFactor()", +"c27b2c2d": "collectEarnings()", +"c27bc67c": "configureKeys(uint32,int256,bytes32,bytes32,uint32,bool)", +"c27bc7b2": "fortifyClaims(address,uint16[],uint256,bool)", +"c27c327e": "changeNewRubesUntilPayout(uint256)", +"c27cabb5": "proposalFee()", +"c27d1580": "getNorsefirePrice()", +"c27d607b": "lastEvidence()", +"c27d7721": "create(uint256[101][])", +"c27e7398": "getLockedTimeUserInfo(address,address)", +"c27fc305": "f1()", +"c280541c": "buy(uint256,address,bytes32)", +"c2808d1a": "MinSum()", +"c2812f74": "triggerMinCap()", +"c281309e": "feeTake()", +"c28196b1": "addImmigration(address)", +"c281a013": "FinalizableCrowdsale(uint32,uint32,uint256,address)", +"c281d19e": "cbAddress()", +"c283226d": "reclaimTokens(string,string)", +"c2832430": "withdrawForfeited(address,uint8,address)", +"c2843a14": "addInviterValue(uint256,uint256,address,address)", +"c2844c60": "emitJobRatingGiven(address,address,uint256,uint8)", +"c2844ebf": "isCustomerAlreadyRegister(address)", +"c2845184": "SUPPLY_FOR_REFERAL()", +"c284ab55": "eLYQD()", +"c284cdc5": "GetDescript(string)", +"c2852f38": "pauseContract(uint256)", +"c2856ca9": "presoldMax()", +"c285a245": "preferredSaleTLYperETH()", +"c285daf9": "Xoflife()", +"c286ba5b": "unfreezeAccountTimeAndValue(address)", +"c286f3d9": "SetLockAddress(address)", +"c287820a": "kittensSold()", +"c287fa72": "calcDiviDistribution(uint256,uint256)", +"c288ab9d": "getUserCurrentMartialId()", +"c288eeee": "nowPeriod()", +"c2897b10": "stand()", +"c289adfa": "getAssetPrice(uint128,uint128)", +"c289dbe8": "first_withdrawal(uint256)", +"c28a56f1": "checkReceiptProof(bytes32,bytes,uint256[],bytes,bytes)", +"c28a9157": "bullsmasterReq()", +"c28aafb1": "addWallet(address,string)", +"c28b4369": "giftCard(uint256,address)", +"c28b4577": "setPermissionById(uint8,bytes32)", +"c28bfe5a": "testFailCreateSameIpfsHashAndNonce()", +"c28c770a": "getLockedTokensPerUser(address)", +"c28cedf3": "DEMO()", +"c28d38a8": "STARTING_SEEDS()", +"c28d5644": "LogMinSell(address,uint256)", +"c28db642": "tocancel(uint256)", +"c28dbc38": "grantAccessForToken()", +"c28de2cd": "upgraded()", +"c28e5022": "collectAndUpdate(address[])", +"c28e6e39": "ReducingSupplyCoin()", +"c28eab85": "setMinimumTokenSell(uint16)", +"c28ec9d7": "respondToChallenge(uint256[9],bytes,bytes32[],bytes,bytes32[],bytes,bytes32[],bytes,bytes,bytes32[])", +"c28f57ca": "ICOSaleStart()", +"c28f812c": "getPaycarnita()", +"c28f8e09": "icoFunded()", +"c28f9df1": "requestVestingTrusteeOwnershipTransfer(address)", +"c290367f": "playDiceCombinations(uint256,uint256,uint256)", +"c290d691": "pay(uint256)", +"c291ad27": "Notify_Number(string,uint256)", +"c291bf6d": "AuthDapps(address,bool,int256,bool,bool)", +"c291df56": "affPercent_()", +"c29224ea": "roundFailedToStart()", +"c292aae3": "McrForGasFailed(address,uint256)", +"c2930f91": "baseUnit()", +"c29338cf": "cozyTime(uint256,uint256,address)", +"c293fc0a": "SetBankerPrincipal(uint8,uint256)", +"c29402f1": "relistGenesisSales(bytes32,uint256)", +"c2944f69": "_multiSendOwner()", +"c2944f7a": "registHolderStep(address,uint8,address)", +"c294c93b": "getSANOwner(uint256)", +"c2954ff4": "Sent(address,uint256,bytes)", +"c2955bdf": "setUserBlacklistedStatus(bool)", +"c296302a": "transferRoot(address)", +"c296f721": "_buyLandForCandy(address,uint256)", +"c29721e0": "sendArena(address[],uint256[],uint64)", +"c297fa0f": "DEFAULT_DURATION()", +"c2985578": "foo()", +"c2992300": "setCreatePrice(uint256)", +"c29988db": "distributeEbyte(address[],uint256)", +"c299a394": "getNextRank(address)", +"c29a6fda": "setERC20(address)", +"c29d350f": "startTimeOf(address)", +"c29d9d74": "startMultipass(string,string,string,string,string,uint256,address)", +"c29e8863": "setImplementation(bytes32,bytes32,address,bytes32)", +"c29fb94a": "transferFokenIssued(uint256,uint256)", +"c2a029f0": "setID_control(uint256)", +"c2a15dbb": "_currentIcoPhaseBonus()", +"c2a15e7e": "votingEndsInHHMM()", +"c2a24b33": "Post(address,string,string)", +"c2a2747b": "p1()", +"c2a2916d": "nameAddress(string)", +"c2a33485": "setReg3(uint256)", +"c2a394cb": "AuctionSuccessful(uint256,uint256,address,address,uint256)", +"c2a48c70": "revokeUserRole(bytes32,string,address)", +"c2a49237": "memberSellToken(uint256)", +"c2a5e5c2": "setTwitter(string)", +"c2a63e3b": "getEmployeeCount()", +"c2a88340": "Deactivate()", +"c2a8ec80": "betStats()", +"c2a95cc9": "updateTrustSettings(address,uint256)", +"c2a960a1": "signSendFlower(bytes32,string,string,address,string,bytes16,uint256)", +"c2a96ce5": "EscrowVault(address)", +"c2a98b41": "mymethod(uint256,string)", +"c2aaf9c4": "receiveEth(uint256)", +"c2ab66dd": "hasAttribute1ButNotAttribute2(address,bytes32,bytes32)", +"c2ac0b4a": "intMax(int256)", +"c2ac3aff": "addEth()", +"c2ac481c": "disaToken()", +"c2acc5cf": "mintTokens(address[],uint256[])", +"c2add678": "getLockerInfo(address)", +"c2adf34a": "bonusWeiAmount()", +"c2ae1a53": "sendTransaction(bytes32,uint256,int256)", +"c2ae7e14": "approvePaillier(address,string)", +"c2aeb355": "GRAMATON()", +"c2b06664": "setDS(address)", +"c2b0c743": "payETHToProvider(address,address,uint256)", +"c2b12a73": "setBytes32(bytes32)", +"c2b2fb5e": "editionExists(uint256)", +"c2b373a7": "seedHash()", +"c2b41ac4": "updateMinimumStakingTokenPercentage(uint8)", +"c2b4470c": "FINLAB_PRESALE()", +"c2b477a7": "mintLimitByTemplate(uint256)", +"c2b4ab4d": "getCountBonus(uint256)", +"c2b4ddde": "setFundingEnabled(bool)", +"c2b6b58c": "isClosed()", +"c2b70850": "QuantiModoToken()", +"c2b7be16": "addSupportedToken(address,address)", +"c2b8fd12": "MYRN()", +"c2b98295": "balanceOfNonKYC(address)", +"c2ba4744": "canMint(address)", +"c2ba5b40": "getPackageData(string)", +"c2ba857e": "setJobAccepted()", +"c2baa882": "tokensPerCHF()", +"c2bc2efc": "get(address)", +"c2bdb862": "verifyProofOfTransitionAgreement(address,uint64,uint256,bytes32,uint256[2],bool,bytes32,bytes32,uint8)", +"c2bf17b0": "recover(bytes32,uint8,bytes32,bytes32)", +"c2bf1af7": "freezingStatus()", +"c2c06f20": "OldRopeToken()", +"c2c13a70": "LOCKUP_WALLET()", +"c2c3bd6a": "_v()", +"c2c4a328": "getInitPrice(bytes32,uint8)", +"c2c4abe6": "ASSPToken()", +"c2c4c5c1": "checkpoint()", +"c2c5143f": "bobMakesEthDeposit(bytes32,address,bytes20)", +"c2c52055": "ChampionGameStarted(uint256,uint256)", +"c2c546b8": "sumICOStage6USD()", +"c2c5b9f1": "setInt(string,int256)", +"c2c5ec41": "isValidProof(bytes32,string)", +"c2c5f89f": "BonusAwareCalculator(address,address)", +"c2c61d01": "agreeToTrade(address)", +"c2c62562": "setCrowdsaleData(uint256,uint256,uint256)", +"c2c68ee1": "unlockTrading()", +"c2c7ca1d": "extraTokensMintedDuringPresale()", +"c2c7ff0a": "ToperCoin()", +"c2c8fd40": "increaseWorldLimit(uint256,uint256,uint256)", +"c2ca058d": "clearBlacklistMapping()", +"c2cb88bd": "giftMessage()", +"c2cb9927": "reward(address,uint256,uint256,string)", +"c2cba306": "TokenAddress()", +"c2cbb299": "airdrop_auto(address,address)", +"c2cca62c": "TransferMinersReward()", +"c2ccb8a8": "isCurrentAccountMinter(address)", +"c2cd0e01": "issueNewCoins(address,uint256,string)", +"c2cd7632": "isEmployee(address,address)", +"c2cdaf24": "start1BonusPeriod1()", +"c2cdbf01": "SyloToken()", +"c2cf7326": "hasConfirmed(bytes32,address)", +"c2cf9bbb": "PotPotato()", +"c2d0916f": "moveMetadata(address,address)", +"c2d15d21": "totalIssuanceLastAverageBalance()", +"c2d23e41": "continuousBacking()", +"c2d25167": "closeIcoOne()", +"c2d37428": "withdrawForWinner(uint256)", +"c2d415e2": "Chicken()", +"c2d4160a": "GetEvaluate(uint256,uint8)", +"c2d42ef2": "removeAccount(uint256)", +"c2d4423f": "excludeWhale(address)", +"c2d4489f": "provider2()", +"c2d4f851": "calculatePrice(uint256,address)", +"c2d526aa": "_rank(uint256)", +"c2d53eb4": "initOwner()", +"c2d560ab": "stopOraclize()", +"c2d5baf9": "JJL()", +"c2d83718": "randomTeam()", +"c2d83e61": "UserPool(address,address)", +"c2d86376": "NewDonor(address,uint256,uint256)", +"c2d8de54": "promisor()", +"c2d936d9": "MINATOKU()", +"c2d9c196": "preico_startdate()", +"c2da621b": "setMeterPoint(address,int256)", +"c2dab162": "mineit(address,uint256)", +"c2db0482": "getUnionIdByAddress(address,address)", +"c2db26fc": "unverifyAccount(address)", +"c2db2c42": "purchaseToken(uint256)", +"c2db5890": "breedAxies(uint256,uint256,uint256)", +"c2db8676": "BloodToken()", +"c2db9e25": "getMinerHalvingHashRate()", +"c2dc0470": "KilledTillNow()", +"c2dc9af4": "hardCapHash()", +"c2dcdfb4": "preferredSaleTokensLeftForSale()", +"c2dced85": "numberDecimal18()", +"c2de2909": "drawRandomWinner()", +"c2de89b7": "getCleide()", +"c2def3b9": "getOrganizer()", +"c2df8815": "Adnity()", +"c2e0af44": "doMove(address,address,uint256)", +"c2e12f21": "setDefaultTranches(bytes32[])", +"c2e171d7": "Save()", +"c2e26adb": "bulkPay(address[],uint256,address)", +"c2e28dd1": "setTitulaire_Compte_8(uint256)", +"c2e2a338": "withdrawRejected()", +"c2e2a33e": "setPermanentLimitForType(uint32,uint256)", +"c2e3460d": "Anxxia()", +"c2e4601a": "getAffiliateRate(uint256)", +"c2e46379": "transferBountyTokens(address[],uint256[])", +"c2e4b8fb": "TokensUpgradedFrom(address,uint256)", +"c2e52206": "getPlayerCount()", +"c2e55da3": "product3_pot()", +"c2e5d950": "finalizedRefund()", +"c2e5ec04": "setTradingEnabled(bool)", +"c2e5feb5": "KeyReplaced(address,address)", +"c2e62675": "COTToken()", +"c2e78f12": "deVerify(address)", +"c2e800ed": "isContractProxy(address)", +"c2e88185": "CyberMusicToken()", +"c2e9fab3": "SubUser()", +"c2ea2f9c": "halfCentury(address)", +"c2ea5c9e": "getInvArray()", +"c2eaaeb3": "computeTxFee(uint256)", +"c2eac875": "secure(uint256,string)", +"c2eb10a2": "makeBundle(uint256)", +"c2ecdf8e": "ownerCMIT()", +"c2ed2b05": "documents(uint256)", +"c2eddfd2": "kyberMultiSigWallet()", +"c2edec0b": "setCharityDonation(uint256)", +"c2ee0a57": "getBlockList()", +"c2ee3a08": "ONE()", +"c2eef08e": "stopLandEthSale()", +"c2f02b33": "Crowdsale7(address,uint256,uint256,uint256,address,address)", +"c2f0bb29": "getCardDetails(uint16,uint8,uint256)", +"c2f0c083": "angelOnLeaderboard(uint64)", +"c2f0d93f": "icoAbandoned()", +"c2f0dbe2": "claimPremium(address[2],uint256[7],uint8,bytes32[2])", +"c2f137f1": "swapAddr()", +"c2f3ce10": "ADDRESS_LIMIT()", +"c2f3d788": "read_total_number_of_purchases()", +"c2f415b5": "CTBoatGame(address,address,uint256)", +"c2f490e9": "caller_()", +"c2f4976f": "setRoundFinalScore(uint16,bytes32)", +"c2f4faf4": "TestOrder(address)", +"c2f61a9f": "setOraclizeQueryType(string)", +"c2f666a3": "PriceIncrease()", +"c2f7c50a": "FindID(address)", +"c2fa6697": "fundraiserCallData()", +"c2fa8b2d": "PoetToken()", +"c2faa691": "Constructor(uint256,string,string)", +"c2fb538e": "updateFactoryContract(address)", +"c2fb8f36": "TinyHuman(address,address,address)", +"c2fbe7bc": "transferFees()", +"c2fc048a": "transferOwnerToProxy()", +"c2fcbf37": "isValidateParameter(string,uint256)", +"c2fce718": "getPartsOfOwnerWithinRange(address,uint256,uint256)", +"c2fd0263": "isTripleNumber(uint256)", +"c2fe2022": "getFollowers(address)", +"c2fe3321": "PRE_ICO_ON()", +"c2febe49": "QuantorToken()", +"c2febef5": "removeCountry(uint256)", +"c2ff0f15": "NewShare(string,bool,string)", +"c2ff3334": "jump(uint256)", +"c2ff7a38": "adjustBalanceCheckpoints(address)", +"c2ffc7bb": "slates(bytes32,uint256)", +"c2fffd6b": "setCancelFee(uint256)", +"c30096ef": "calculationTeamsRewards(uint256[])", +"c3017200": "removeAssociatedAddress(uint256,address,address)", +"c3027525": "getOwned()", +"c302a45b": "crowdsaleStopped()", +"c302f747": "poolPresale()", +"c30354cb": "VUP_TOKEN_SUPPLY_TIER3()", +"c30381b9": "setSellCourse(uint256)", +"c303c3d5": "returnEtherToInvestors()", +"c303c53a": "withdrawForTwoStep()", +"c304b368": "updatedRandom(string)", +"c304ffc4": "CreateICE(address,uint256)", +"c3059c63": "buyUpgradeCard(uint256)", +"c306834e": "PRIVATE_SALE_LIMIT()", +"c306cb90": "sendDevTokens()", +"c30715d1": "setNumRewardsUsedForAddress(uint256,address,address)", +"c30718e8": "testIntParser()", +"c3077c10": "settxpct(uint256)", +"c307f6ba": "withdrawWbtToken(address,uint256)", +"c3082e95": "playerOutputAtNow(address)", +"c308f55b": "fallback(uint256,address,uint256)", +"c30a990a": "createPaymentChannel(address,uint256,uint256)", +"c30b06e8": "allMultitokens()", +"c30b182e": "sendVNET(address,uint256)", +"c30b8867": "maxPercentPerPlayer()", +"c30bc5ef": "breedWith(uint40,uint40)", +"c30bf4d8": "CodeEligible()", +"c30c0c0c": "checkUsers(address,address)", +"c30d0ee4": "phiRate()", +"c30dafd8": "_setTittyForSale(bool,uint256)", +"c30df14c": "logPurchase(address,uint256)", +"c30df586": "ZAI()", +"c30e9767": "canReceive(address,address,bytes32,uint256,bytes)", +"c30ed0a4": "Getwsic(uint256)", +"c30f4a5a": "updateURI(string)", +"c31028dc": "hasFirstUnionIds(bytes32,bytes32)", +"c31051fe": "teamPeriodLength()", +"c31053f7": "NNT()", +"c310b9df": "ProposalAdded(uint256,uint256,string,bytes32)", +"c311a3cd": "GetHoga(address,uint32)", +"c311d049": "withdrawEth(uint256)", +"c312d468": "sendPToken(address,uint256)", +"c312ffed": "Contributed(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"c31422ac": "calculateTokens(address,uint256)", +"c3143fe5": "setUserCap(address,uint256)", +"c31453a7": "_unpackAttackParams(uint256)", +"c3146814": "pegETHUSD(uint256)", +"c3153834": "prefixedRecover(uint8,bytes32,bytes32,address)", +"c315432a": "isGameStarted()", +"c3155201": "XulCrowdsale(uint256,uint256,uint256,address)", +"c31592af": "getY(bytes)", +"c315a082": "KRT()", +"c3169ef2": "respond(uint256,uint256[4])", +"c316c98b": "updateCollector(address)", +"c3173774": "balanceThreshold()", +"c317464d": "CryptoHearthStone()", +"c31752c0": "getEmployerJobs(address,uint8)", +"c3182360": "getTimeBonus(uint256)", +"c3191f31": "readWelfareAddress(uint256)", +"c3192c82": "getcurrNumOfUpgrades()", +"c319618f": "getAllMyPackageIds()", +"c31989ed": "TronGold()", +"c319a02c": "right98(uint256)", +"c319e412": "allowContribution()", +"c31a0972": "OrpheusRoyalSiamRailways()", +"c31ad7dc": "voteYes(string)", +"c31b29ce": "GAME_DURATION()", +"c31bb2fb": "XEPToken()", +"c31bb8d6": "percentToTakeAsRake()", +"c31c0b62": "isSaleComplete()", +"c31c5221": "approveSetTokenControlInfo()", +"c31c6855": "presaleBonusTokensClaimed()", +"c31ce93e": "getExchangeGroups()", +"c31ceb2a": "numberOfAttendees()", +"c31d0031": "CrowdFundDAO(string,uint8,string)", +"c31d309a": "addRequestorAddress(address)", +"c31d3a6d": "payInvestors()", +"c31d3e8e": "maxPublicSale()", +"c31e0547": "quickConverter()", +"c31e6ee0": "sendTokensToService(address)", +"c31f3537": "removeBotAddress(address)", +"c31f586d": "cancelSaleAuction(uint256)", +"c31fa083": "setIpfs(string)", +"c32011f0": "unfreezeTeamRecepientBlock()", +"c3204954": "confirmTransactionByMediatorFee(uint256)", +"c320c727": "setRegistrationFee(uint256)", +"c3210eb7": "proposeCount()", +"c3218f50": "startPreICO(address)", +"c321dc18": "showParticipantWei(address)", +"c32221cf": "_newRepo(string,address)", +"c32377df": "recevoirApprobation(address,uint256,address)", +"c3237ff4": "emitFeePeriodClosed(uint256)", +"c32426c9": "ProvideToken()", +"c324606a": "confirmStakeholderTransaction(uint256)", +"c324a669": "purchaseSoldiers(uint256,uint256)", +"c325ae4e": "belongsToUser(address)", +"c3262dfd": "setUserID(bytes32)", +"c3283d83": "getStrandContract(uint256)", +"c32863a7": "every15()", +"c32935d7": "getBuyPriceTimesByTime(uint256)", +"c329e4a5": "BoardAddressChanged(address,address,address)", +"c32a4369": "getAllSamplesForOwner(address)", +"c32a4c7e": "returnCoke(uint256)", +"c32a50f9": "setSeed(uint256)", +"c32a6f6d": "toUint(string)", +"c32a88ae": "recoveryPaymentDigest(bytes32,uint256)", +"c32a8edf": "someMethod1(uint256,uint256,uint256,uint256)", +"c32a9b00": "do_grant_tokens(address,uint256)", +"c32aaa86": "getNameWriterId(bytes32)", +"c32b8683": "creatorRequestFundTransfer(uint256,address,uint256)", +"c32c1e65": "setOperations(address)", +"c32cc6d5": "investFor12Months(address,uint256,uint256)", +"c32ceb14": "setQueryIdForAddress(bytes32,address)", +"c32d88bb": "changeDepositAmount(uint256)", +"c32d946d": "performTransfer(address,address,uint256,bytes)", +"c32dee3a": "second_bonus_amount()", +"c32e16e7": "REQUEST_CANCELED_BY_LENDER_STATUS()", +"c32e2b42": "SalesAgentRemoved(address)", +"c32ee591": "isTransferAllowed(address,address,address,address,uint256)", +"c32f6945": "MiningLevelup(address,uint256,uint256)", +"c32fb5ea": "getNewAllowancePeriod()", +"c32ff491": "ServerManager()", +"c3310517": "reservedTokensDestinationsLen()", +"c3315b4b": "EasyInvest25()", +"c3328816": "TeamAdvisorsWallet()", +"c3332621": "shippingDate()", +"c3332732": "setNextGame(uint256,uint256,uint256,uint256)", +"c3336c0f": "transferMultipleSame(address[],uint256)", +"c3340892": "LogStateChange(uint8)", +"c334447b": "bytes32ToTokenId(bytes32)", +"c334e875": "payByErc20(uint256)", +"c334ea8f": "setMateAdvertisementRate(uint256)", +"c3351b88": "getParticipantExternalId(bytes32)", +"c3354632": "_premoveByIndex(uint256)", +"c335f0a4": "RKGToken()", +"c336937d": "Revoked(address,address)", +"c3369b0d": "issueTokens(uint256,uint256,uint256)", +"c336e7fb": "NobelToken()", +"c3380b72": "getDefense(bytes32,bytes32,uint256)", +"c33818fd": "Controller_Address2()", +"c338287f": "getUSDPrice()", +"c33890ff": "StartNewIteration()", +"c3392f25": "PRCT100_R_TEAM()", +"c33a4cc8": "PresaleUpdated(uint256,uint256)", +"c33a5bb6": "RLCPerETH()", +"c33a66e0": "updatePriceEDEX(uint256)", +"c33a800b": "createHeldCoins()", +"c33aa7fe": "submitBid(string)", +"c33af352": "_getFunc(uint256,uint256,uint256,uint256)", +"c33b76c6": "rakeAddress()", +"c33bbe47": "LAM()", +"c33cfe36": "KolkhaToken(uint256)", +"c33db789": "_triggerFinishTournament()", +"c33df4ba": "getNumOfRickHolders()", +"c33e1844": "BTMC()", +"c33e40a3": "setBasePoints(uint256)", +"c33e4942": "definition(bytes32)", +"c33fb877": "process()", +"c3403ddf": "endVoting()", +"c34052e0": "contains(uint256)", +"c341031a": "Testereum()", +"c341b9f6": "freezeAccounts(address[],bool)", +"c3430bce": "validWhiteListedPurchase(address)", +"c3434883": "buy(uint256,uint256,bool)", +"c3437e06": "approvedBuyer(address)", +"c3440022": "WhitelistedAddress()", +"c34492a7": "buyTokensByOptions(address,uint256,string)", +"c344bc47": "HonestisNetworkTokenWire3()", +"c344bc4a": "REALCrowdsale()", +"c344cdd2": "offerOptionsConversion(address)", +"c34588ba": "countOfDeeds()", +"c3458d18": "callRecipient(address,address,address,uint256,bytes,bytes,bool)", +"c345b571": "_subDai(uint256,address)", +"c345c54b": "doSafeSend(address,uint256)", +"c3462818": "PFC(address)", +"c34764cf": "makerWithdrawERC20Token(address,uint256)", +"c347fe1f": "addCET4(uint32,uint32,uint32)", +"c3492908": "BASE_TIME_TO_COOK()", +"c3496529": "setVesting(address[],uint256[])", +"c34a253a": "cardFacevalue(uint8)", +"c34b6ae0": "setFreeTransferAllowed(bool)", +"c34ba3e9": "createPromise(address,uint256,uint256)", +"c34c08e5": "executor()", +"c34c27ad": "SendOwner()", +"c34c4417": "registerData(bytes)", +"c34c6b93": "getDateInfo(uint256)", +"c34d2732": "MAX_COMMIT_DURATION_IN_SECONDS()", +"c34da17c": "isBurned()", +"c34db131": "CSCPreSaleManager()", +"c34dd141": "percent_reduction()", +"c34de22d": "genKeysRec(uint256,uint256)", +"c34debc7": "updatePlayerWin(address,uint256)", +"c34e6e1b": "OnlyWhiteListedAddresses(address)", +"c34ef9af": "second_bonus_duration()", +"c34f1fea": "UnfreezeAmount(address,uint256,uint256)", +"c34f6b0d": "getPrize()", +"c34f783d": "allocateToken(address[],uint256[],uint256[])", +"c34f869b": "Voted(uint256,bool,address,string)", +"c34fb5ca": "canonizedParameterizer()", +"c3500745": "refundLockDate()", +"c3501ff6": "redeemToken(uint256,address)", +"c3502510": "UsdPerEthChanged(uint256,uint256)", +"c3508d58": "refundByOwner(address)", +"c350bbb6": "RoscaERC20(uint256,string,string)", +"c3513132": "accessTokenFee(uint256)", +"c351fd77": "setGasPricePctOfBetValue(uint256)", +"c351fdfd": "setBatchNumber(address[],uint256[])", +"c3521b1a": "wolkFund()", +"c352dae2": "getWalletInfo()", +"c352fbda": "grantMarketingCoins(address,uint256)", +"c353a89e": "changeMember(address,address)", +"c353c2de": "unPauseTokenSale()", +"c353dbb1": "EtherPluscoin()", +"c3542cad": "SaleStageUp(int256,uint256)", +"c3548647": "setActivationFee(uint256)", +"c35506c0": "upgradingEnabled()", +"c355b107": "cNiceGuy()", +"c355eaf0": "setEthlanceSponsorWalletContract(address)", +"c35740f9": "partner2_name()", +"c3576b41": "setOwnersCommission(uint256)", +"c35774a1": "setApproval(address,uint256[],bool)", +"c35789cc": "Close()", +"c3584d88": "getMaxEtherToInvest()", +"c358ced0": "isRevealPhase()", +"c359a2a4": "increaseContribution(address,uint256)", +"c35a4d46": "DubaiGreenBlockChain()", +"c35ac080": "modificaCurso(uint256)", +"c35c08bd": "getCrowdsourcer(bytes32)", +"c35c3265": "novumAddress()", +"c35cabf4": "littClientId()", +"c35d1e01": "RESERVE_TOKENS()", +"c35dcf90": "getWhitelists()", +"c35e1b33": "MSERToken(uint256,string,string)", +"c35ef892": "getWriteTimestamp(bytes32)", +"c35f4bbb": "calculatePrimordialMultiplier(uint256,uint256,uint256,uint256,uint256)", +"c3602ee5": "delayedRequest(string,uint256)", +"c36086f0": "initTransaction(address,uint256)", +"c360c616": "TittyPurchase(address,address)", +"c3615e39": "set_address(address,address)", +"c36360f2": "limit8()", +"c36433e2": "createPromoDrug(bytes32,address,uint256,uint256)", +"c3645759": "increaseDistrictWeed(uint256,uint256)", +"c364a25d": "setHash(uint16,bytes32)", +"c3650a21": "danserviceTeamAddress()", +"c36572d6": "hasEnded(uint256)", +"c3657f96": "setBoxCount(uint16,uint16)", +"c365a646": "_setRiskParameters(uint256,uint256)", +"c365d4f0": "initWidth()", +"c36604ed": "secretNumber()", +"c3662528": "isApproved(bytes32,uint256,bytes)", +"c3663271": "Icoends()", +"c366b1d3": "BulkToken()", +"c3676a02": "mangeWhileList(address,bool)", +"c367ec17": "rewardAuditor(uint256,address,uint256)", +"c36800eb": "IdentityCreated(address,address,address,address)", +"c368109c": "monster_hp(uint256)", +"c3681e3d": "change_p3(uint256)", +"c3682ace": "time_end_sale()", +"c36851bc": "bidOnWonder()", +"c3685e89": "addMessage(address,string,string)", +"c3689f01": "testControlSetNotRetractableNotOwner()", +"c368b160": "disbursement()", +"c36981f4": "withdrawNacNetfReController(uint256,address)", +"c369c0c6": "addValidationPreSigned(address,bytes32,uint8,bytes32,bytes32,bytes32)", +"c36a7b45": "getUserTotalEthVolumeSaldo(address)", +"c36ad8a6": "deleteStar(uint256)", +"c36af460": "getLatest()", +"c36c0155": "get_planet_info(uint256)", +"c36c09e2": "setTrustedSender(address)", +"c36ccedc": "approve(address[16],address,uint256)", +"c36de353": "Ethereumt()", +"c36de531": "smallestUnitName()", +"c36e6fe5": "XclusiveCoin()", +"c36e9546": "SVL()", +"c36ff164": "claimFoundationToken()", +"c36fff2d": "availableOptions(uint256)", +"c37067fa": "donate(bytes32)", +"c370b0b5": "BbeCoin()", +"c370c86d": "setTokenName(address,string)", +"c370d8fe": "ExpandandHarvest(uint256)", +"c3720290": "giveSignOff()", +"c37210f4": "getDocumentSign(uint256,uint256)", +"c3722b1f": "AutoSell()", +"c3736dfa": "_shiftRight(bytes32,uint256)", +"c3737054": "changeManagerQuorum()", +"c373c0ef": "setStartDate(uint32)", +"c37479b4": "mintForwarder(uint256,bytes32,address[],int256,address)", +"c3751729": "mGenerateTokens(address,uint256)", +"c375ba8a": "getLavaPacketTypehash()", +"c375c2ef": "removeContract(address)", +"c3762904": "ethraised()", +"c37792b5": "generateSecurityToken(string,string,string,bool)", +"c3780a3a": "myFunction()", +"c3787865": "balanceFromToken(uint256)", +"c378a83b": "EarthToken()", +"c378ea76": "getFrom(uint256)", +"c378f1af": "RemoveAll()", +"c37981b3": "maxFixedSupply()", +"c37991e3": "ProposalEnd(uint256,string)", +"c37a676c": "acceptMins(uint256)", +"c37a6e8d": "signer1_proposal()", +"c37a832d": "getRoundUserBalance(uint256,address)", +"c37b0aa7": "modifyPriceCountry(uint256,uint256)", +"c37b85a6": "assignIndices(address[])", +"c37bcb1e": "unlockDate1()", +"c37cb1ae": "airdropsTokens(address[],uint256[])", +"c37cdcfe": "doDisputeMemoryRead(uint256,bytes32,uint256)", +"c37d1c8b": "tokensToMint(uint256)", +"c37d8a7e": "indexReplies()", +"c37d9044": "create(uint8)", +"c37db253": "isNotZero(bytes32,string)", +"c37dfc5b": "fillOrder(uint256,uint256)", +"c37e7379": "distributePresale(address)", +"c37e74c7": "getRet()", +"c37e8cb2": "testExportAuthorized()", +"c37e8f11": "additionalCurrency(address,int256)", +"c37f68e2": "getAccountSnapshot(address)", +"c37f7f7f": "doTransferIn(address,address,uint256)", +"c37ff3d9": "sha(uint256,uint256)", +"c3800257": "Addmember(string,address,address,uint256,bool,uint256,bool)", +"c3800fdc": "CurrentToken(address)", +"c3801938": "getStateRoot(uint256)", +"c3830618": "reduceStake(uint256)", +"c3834d89": "setPromo(address,uint256,uint256)", +"c383b1bb": "summon10SkinAppearance(uint256,uint128)", +"c383e020": "endContract(address)", +"c384521f": "tokenCapPhaseTwo()", +"c384b170": "teamWallet2()", +"c3858e82": "unregisttIcoAddress(address)", +"c38672a0": "confirmTokenTransaction(uint256)", +"c38678c3": "addBuildingToServer(uint256,uint8[10],uint8[10],uint8[10],bytes32[10],uint8)", +"c386ff7d": "checkFunction(bytes32,uint256)", +"c38789ba": "example(uint256,address)", +"c387b2a7": "BatchTransferContract(address)", +"c3886f61": "checkWithdrawal(address,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"c3888bce": "transferTokenToMultiple(address[],uint256)", +"c388c167": "setNameAndTicker(string,string)", +"c388cca6": "testBitAndFailIndexOOB()", +"c38a0306": "devFeeHandle(uint256)", +"c38a0fcb": "MGLTOKEN()", +"c38a8afd": "minimumBet()", +"c38ad273": "priceETH()", +"c38ad65b": "getHeroPostAddres()", +"c38bb537": "setPauseStatus(bool)", +"c38c0fa7": "getParentPayoutDistributionHash()", +"c38c5813": "registerAdmin(address)", +"c38c9800": "innerContract(string)", +"c38caab5": "setPost(string)", +"c38e52c0": "deletePeerReview(address)", +"c38e650f": "changeRoundManager(address)", +"c38f0741": "snapshotDailyGooResearchFunding()", +"c38f1abf": "waitTokensPeriod()", +"c391c1b5": "updateOwner(address,address,uint256)", +"c391d581": "getXPROMO_MULTIPLIER()", +"c392079f": "removeCoin(string)", +"c392cf41": "reveal(address)", +"c392f118": "getSellingStatus(uint256)", +"c392f5a0": "getAllPackageReleaseHashes(string)", +"c39387ad": "checkAndUpdateStage()", +"c3946909": "setTheKingsQuote(string)", +"c394f6cb": "unclaimedTokens()", +"c39513af": "setDeprecated(string,address)", +"c395546c": "authorizedToSpend()", +"c395a16b": "leaderBid()", +"c395f336": "processPurchase(uint256,uint256)", +"c3964372": "startRound(uint256,uint256)", +"c3966409": "endProject()", +"c397ae1b": "holosForWei(uint256)", +"c39804ac": "generatePreimage(uint256,uint256,uint8)", +"c39899c1": "isDeadline(uint256)", +"c398a925": "supportsERC165(address)", +"c398f030": "expire(uint256,uint8,bytes,bytes,bytes)", +"c399330d": "getBonusByTime()", +"c399d7c5": "getAccountTokenStats(address)", +"c399ec88": "getDeposit()", +"c39a9d97": "crowdSaleType()", +"c39afb0b": "BitcoinEther()", +"c39b79d4": "_contains_(address)", +"c39cb03f": "ERC827Token(uint256,string,string)", +"c39cbef1": "changeName(uint256,string)", +"c39ce8b6": "FranklinFrank()", +"c39cf53d": "nextrafflenumber()", +"c39e7394": "addAuctionReward()", +"c39ffc65": "GVFX()", +"c3a07df6": "getPermissions()", +"c3a0ba73": "BlockFilesManagement()", +"c3a11c51": "etherPriceInUsd()", +"c3a151de": "getPlayedGamePlayers()", +"c3a18dec": "PRIVATE_SUPPLY_ADDRESS()", +"c3a1e7cc": "totalWEIInvested()", +"c3a25c4c": "computeCntrAmountUsingPacked(uint256,uint16)", +"c3a267b7": "createEthGlobalDelegation(address,address)", +"c3a2a665": "retrieve(address,uint256)", +"c3a2a93a": "getContracts()", +"c3a2c0c3": "scheduleCall()", +"c3a3017d": "issueMasterCardNumber(address,address,uint256)", +"c3a34e1c": "timeTillImpact()", +"c3a35825": "getUint(bytes32,string)", +"c3a39544": "initialCompanysTokenAllocation()", +"c3a3ee80": "setPartsToSell(uint256,uint256)", +"c3a48741": "distributeTKLN(address[],uint256)", +"c3a4ebf5": "_roundOver()", +"c3a4f8b5": "hibit(uint256)", +"c3a5fc4d": "IconFoundation()", +"c3a62a68": "getDate(bytes10)", +"c3a69a75": "dividendsDistributor()", +"c3a6e2a7": "disableToken(bool)", +"c3a74e6a": "placeSellFciOrder(uint256)", +"c3a83aab": "getTokensAvailableToMe(address)", +"c3a869e6": "goldenTicketPrice(uint256)", +"c3a8da5f": "EthereumMark()", +"c3a8f536": "rsub(uint128,uint128)", +"c3a9b1c5": "sayHello(string)", +"c3a9bd8b": "maximumTokens()", +"c3a9be6b": "setLimitGame(uint256,string)", +"c3a9c930": "Gift(uint256,address,address)", +"c3aa0fe6": "setItemLimitHolding(uint256,uint256)", +"c3abe888": "sendBatch(address[])", +"c3ac93df": "QCOToken(address,address,address,address,address,address)", +"c3ad5ecb": "getTweet(uint256)", +"c3ae43a0": "buy100tickets()", +"c3aea22e": "fillSellOrder(uint256)", +"c3aeacdf": "changeRules(address)", +"c3aebdd1": "s5(bytes1)", +"c3aedd92": "updateIsVerifiedInBulk(address[],bool[])", +"c3af38fa": "changeInfoUrl(uint256,string)", +"c3af702e": "totalfv()", +"c3b0f915": "KickToken()", +"c3b1037b": "ownerSetGasPrice(uint256)", +"c3b18fb6": "updateSplit(uint256,uint256)", +"c3b18ff2": "totalSupplyICO()", +"c3b1d52b": "recipientToGiftIds(address,uint256)", +"c3b1ff93": "acceptGame(address,uint256,bytes32)", +"c3b24be0": "Leg()", +"c3b2556d": "lookup(bytes)", +"c3b2d337": "_initialSupply()", +"c3b3271d": "updateStar(uint256,string,string)", +"c3b35a7e": "withdrawTo(address,address,uint256)", +"c3b3c656": "kickOutGroup(address,uint256)", +"c3b4db25": "setSeller(uint256)", +"c3b55635": "log(string,bool)", +"c3b57af8": "getStageAmount(uint256,address,address)", +"c3b66bed": "getProposalVotersCount(uint256)", +"c3b6f939": "mToken()", +"c3b7572c": "updateCommission(string,uint8,uint8)", +"c3b75b8f": "setLockProductActiveState(uint32,bool)", +"c3b7e378": "startTimeStage2()", +"c3b8bfe5": "transferIfNoHF(address)", +"c3b909d7": "progressiveId()", +"c3b91d15": "AiBank()", +"c3b9741b": "ModifiedCrowdsale(uint256,uint256,uint256,address)", +"c3b9e2ed": "powerWithModulus(uint256,uint256,uint256)", +"c3b9f21e": "p4()", +"c3ba2368": "transferERC721(address,string)", +"c3ba65e7": "totalChicken()", +"c3ba7574": "mintForFund(address)", +"c3ba938d": "JPY_Omnidollar()", +"c3bb68cf": "weisPerEther()", +"c3bb8feb": "releaseSell(uint256)", +"c3bcb586": "soldKeys()", +"c3bd0bae": "CapLevelPrice()", +"c3bdc16f": "setUserRole(address,bytes32,address,uint8)", +"c3be259f": "ConnectiusToken(uint256)", +"c3be3c24": "_updateTopUpAvailable()", +"c3be6e8d": "SetStartTimeTLP1(uint256)", +"c3be8df3": "addAff(uint256,bytes32)", +"c3bea9af": "createGen0Auction(uint256)", +"c3bf32e3": "numberOfHeroClasses()", +"c3bf504a": "extractEth(uint256)", +"c3c0198c": "getAssesByOwner(address)", +"c3c0befb": "dumpPrize()", +"c3c132b2": "_indexProofId(string)", +"c3c1d4c7": "withdrawTokensTo(address)", +"c3c2686c": "preSaleWallets(uint256)", +"c3c2f066": "block(bytes32)", +"c3c357f9": "tokenSaleCompleted()", +"c3c5026c": "depositWEI()", +"c3c503b7": "becomeBankermaster()", +"c3c51aca": "cancelSellTokenOrder(uint64)", +"c3c563f4": "validateAmount(uint256)", +"c3c59aa9": "walletTimeOf(address)", +"c3c5a547": "isRegistered(address)", +"c3c5b40e": "setSaleAddr(address)", +"c3c63edc": "mintBadge(uint256)", +"c3c6e202": "indexLastThreads()", +"c3c6f0c9": "getCustomerTxTimestampPaymentKWh(address,bytes32)", +"c3c735cb": "BITDRIVE()", +"c3c74c45": "applyForCertification(string,string,address,string,string,uint256)", +"c3c75e5c": "setEditionPackSize(uint8,uint8)", +"c3c88a1d": "disableTransfer(uint256)", +"c3c8c12b": "setVipInfo(address,uint256)", +"c3c90e64": "checkReward(address)", +"c3c95c7b": "getMarket(bytes32)", +"c3ca3c6a": "SingularityTest3()", +"c3cad5e7": "senderMIT(address)", +"c3cb4159": "getICOBonus()", +"c3cb50ed": "setTileType(uint16,bytes32)", +"c3cb8c14": "finalizeVault()", +"c3cbc2c9": "offerSacrifice()", +"c3cbd341": "create(address,uint256,address,address)", +"c3cd9996": "CLASS_AQUATIC()", +"c3cdb4af": "getMinimeCheckpointSlot(uint256,uint256)", +"c3ceb939": "view58()", +"c3cfe00f": "EEB(uint256,string,uint8,string)", +"c3d014d6": "setContent(bytes32,bytes32)", +"c3d08f06": "setPermissionByAddress(uint8,address)", +"c3d0a20a": "NewToken(address,string,string)", +"c3d0a564": "getAccountBalance(bytes)", +"c3d23e10": "checkBet()", +"c3d2c355": "setKey(bytes32)", +"c3d32e56": "PixelCore()", +"c3d345c4": "getHangoutAddress()", +"c3d38586": "newCookie()", +"c3d4d75a": "getCommitHash(bytes32,address)", +"c3d54c9a": "paiementConfirmation(bytes32,bytes32)", +"c3d55adc": "calculateBuyGoldFee(uint256,uint256)", +"c3d58d95": "runICO()", +"c3d59369": "setIcoDiscountPercentages(uint8,uint8,uint8,uint8)", +"c3d5fd39": "getAdminInfo()", +"c3d68a85": "temporaryKill(address)", +"c3d69d03": "NatureX()", +"c3d7ad74": "sendPurchasedTokens(address,uint256)", +"c3d7e350": "removeAccount(uint256,address)", +"c3d8c099": "endICOStage5()", +"c3d97a27": "carsCount()", +"c3d9820d": "RefillOraclize()", +"c3d9c4b4": "share(uint256)", +"c3da42b8": "c()", +"c3da5153": "getEthartArtReward()", +"c3daab96": "withdrawBond(uint256)", +"c3dac9a1": "time_bought()", +"c3db397f": "unstakePartialContent(bytes32,uint256,uint256,bytes8,uint256)", +"c3db5ead": "Uruntest()", +"c3dc0083": "finishDeal(uint256,uint256)", +"c3dc1040": "orderInternal(uint256,bytes32)", +"c3dd2395": "maxCapEur()", +"c3de1ab9": "gamePaused()", +"c3de7cbf": "checkRedemptionWindow(uint256,uint256)", +"c3ded82a": "toUint96Throw()", +"c3dee67f": "updateAllHoldersShareInfo()", +"c3defb70": "changePause()", +"c3df99b6": "upvoteComment(bytes32,bytes32,bytes32)", +"c3dfb938": "countFortunes()", +"c3dfbeea": "migratePresaleBalances(address,address,address[])", +"c3dfdae6": "gameToken()", +"c3e017c2": "dNextStage(uint32)", +"c3e053ac": "percentBuyBackTypeTwo()", +"c3e06be9": "changeReceiveWallet(address)", +"c3e0ae67": "future_round_percentage()", +"c3e0bbad": "getContentByName(string)", +"c3e1d25c": "percentsOfProjectComplete()", +"c3e2087c": "setManagementCompany(string)", +"c3e27948": "setTrueUsdFastPause(address)", +"c3e2f26e": "icoedAmount()", +"c3e38ae9": "setSEKU(uint256)", +"c3e3908c": "get_pre_kyc_bonus_numerator(address)", +"c3e3c7bc": "teamTokens()", +"c3e50027": "dealConfirm(uint256)", +"c3e58eec": "blackListSectorExists(uint8[])", +"c3e6ea31": "BONUS1()", +"c3e8fb40": "smartToken()", +"c3e92f9e": "DrawLottery(string,uint256)", +"c3e93fa3": "depositHelpe(uint256)", +"c3ea0fca": "promoEthCommission()", +"c3ea901d": "uint2ToStr(uint256[2])", +"c3eb0723": "LogNewSecurityToken(string,address,address,address,uint256,uint8)", +"c3edb4c2": "finalizeChangeInsuranceFees()", +"c3ee6311": "lockAndCall(string)", +"c3eed29a": "reinvest(uint256,address)", +"c3ef473c": "ShareHolderVoted(address,uint256,bool)", +"c3ef586a": "Gambit()", +"c3ef83fc": "executionTimeOf(uint256)", +"c3f010f7": "numGames()", +"c3f03fb8": "querySpecialRateForAddress(address,address)", +"c3f07ba7": "addTokenAddresses(address[])", +"c3f0dad9": "isGenerator()", +"c3f17ae8": "getAmountToIssue(uint256)", +"c3f1a710": "getInvestment()", +"c3f1b0ea": "changeRequest(bytes32,bytes32,bytes32,string,bytes32,bytes32,uint256)", +"c3f3310b": "tokensOfFounder(address)", +"c3f34a50": "Dao(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"c3f3b854": "maxNumBets()", +"c3f44c0a": "relayMetaTx(uint8,bytes32,bytes32,address,bytes,address)", +"c3f51fca": "initMintable(address,address,uint256,uint256)", +"c3f53e94": "ownerClaimTokensAndRefundForUser(address)", +"c3f59687": "transferMastership(address)", +"c3f6263f": "charityCutOf(uint256)", +"c3f67cde": "withdrawSecond()", +"c3f6e09c": "sendOnlyHash(string)", +"c3f7ec97": "addLog(bytes)", +"c3f7f169": "safeSend(uint256)", +"c3f843d7": "minVeriAmount()", +"c3f84c05": "retribution(uint256,address)", +"c3f90202": "f4()", +"c3f909d4": "getConfig()", +"c3f9409f": "signBitcoin(bytes32,uint8,bytes32,bytes32)", +"c3fa4f27": "sendPowerToken()", +"c3fa5f93": "BlockScheduler(address,address)", +"c3fb31a4": "coolDungeon()", +"c3fb5e5f": "createVestFundFor(address,uint256,uint256,uint256)", +"c3fb90d6": "_storage()", +"c3fbc632": "ICORunning()", +"c3fc4787": "finalizeFork()", +"c3fdbef8": "totalInSharedPool()", +"c3fe3e28": "game()", +"c3ff05d1": "getBoxCountZIndex(uint8)", +"c3ff3878": "checkForValidChallenge(address,uint256)", +"c401a2a3": "destroyforproduction(uint256)", +"c401d6b0": "totalTokensToSupply()", +"c4021c13": "topupEnergyByToken(address,uint256,uint256)", +"c4026d7b": "removeDev(address)", +"c402e446": "Express_Satisfaction_MediatedTransaction(uint256)", +"c403adc8": "changeInSale(bytes32,bytes32,uint256)", +"c403cf6d": "RESERVED_TOTAL_AMOUNT()", +"c403f90f": "airdropTime()", +"c4041bc5": "viewauction(uint256)", +"c4043465": "MYEXCTOKEN()", +"c404b3f6": "currentTranche()", +"c4052559": "haraKiri()", +"c4052a78": "airLiftPrice()", +"c4057e61": "getData_4()", +"c40580de": "removeOwners2()", +"c405b1f0": "addJob(address,uint256,uint256)", +"c405d30e": "send2marketing(address,address)", +"c405e11b": "_addAnswerToHistory(bytes32,bytes32,address,uint256,bool)", +"c4069caf": "getPlayersByTrackId(uint256)", +"c406d4af": "getPixelToken(uint24)", +"c407670f": "donorCount()", +"c4076876": "pay(address,uint256)", +"c407c6d8": "chop(string)", +"c4085bf6": "_sell(address,uint256,bytes)", +"c4086893": "getLockedBalance(address)", +"c408efba": "isMigrationPhaseOpen()", +"c40940f4": "pricePerUnicorn()", +"c409ad08": "exec(bytes,bytes,address[])", +"c40af29f": "tokenTeamSupporter()", +"c40b276b": "hasString(string[],string)", +"c40b4c4d": "minSumPreICOUSD()", +"c40b716c": "setLLV_edit_14(string)", +"c40b8868": "changePresale(address,uint256[])", +"c40b8dcf": "usdToHavPrice()", +"c40bdc05": "_requestLoans(address,uint256)", +"c40cf4eb": "memberContract()", +"c40d19a5": "getAddressSize()", +"c40d4163": "ArthToken(uint256)", +"c40d62fe": "OrpheusBlockChainCitySiam()", +"c40dc8ec": "deadline(uint256)", +"c40fdc94": "Delisted(uint256)", +"c40fec3a": "forceOffsetExecuteFeeRate()", +"c4109843": "OrdersMatched(bytes32,bytes32,address,address,uint256,bytes32)", +"c4109d48": "baseTokensAllocated()", +"c411e4d4": "canCancel(uint256)", +"c4128b6d": "upgradeCount()", +"c4130ae0": "registerEvent()", +"c413af2e": "setPreICOPhase()", +"c413fdf3": "testPayout()", +"c414dede": "tablets(address,uint256)", +"c41518f2": "luckyYouToken()", +"c41559bb": "ETHbalanceOf(address)", +"c415b95c": "feeCollector()", +"c4163518": "isMining(address)", +"c4164365": "investBalanceMax()", +"c4166ea8": "OBGAllocation(address)", +"c416a0d7": "emergencySetBBFarm(uint8,address)", +"c41728a7": "sectorOwnerCut()", +"c4173548": "preSaleRaised()", +"c417becd": "RCToken()", +"c4184def": "BCBToken()", +"c418c8c9": "TradeToken(address,string,string,uint256,uint256)", +"c418c93e": "addOnStage(address,uint256,uint256)", +"c4198161": "setParameters(address,uint256)", +"c41a360a": "getOwner(uint256)", +"c41a9892": "bet2()", +"c41a9dfe": "has_joined()", +"c41addb5": "newModerator()", +"c41b0ae7": "getNumberOneArg(address,bytes4,address)", +"c41c19dc": "trackContributions(address,uint256)", +"c41c33af": "submitChallengeOrder(bytes,uint64,uint64,uint256,uint256,uint256)", +"c41c3bde": "setBuyingTime(uint256,uint256)", +"c41c9a61": "transferERC20Tokens(address,address,uint256)", +"c41e1d4f": "MAX_NUM_NAVITOKENS()", +"c41efe08": "getBestSale(bytes32)", +"c41f48a3": "DinosaurFarmer2()", +"c41f4cc0": "takerStatus(address)", +"c41f9482": "getDateTime(uint256)", +"c41fbbb5": "addFounder(address,uint256,uint256)", +"c420928d": "EncryptoTelToken()", +"c420f7fe": "getPlayerShipModelById(uint64)", +"c421249a": "sui()", +"c4215398": "publicSaleAddress()", +"c4218d33": "oraclizeBalance()", +"c421fa8e": "updateCrowdfundState(uint256,address,uint256)", +"c421fc6b": "currentStageData(uint8)", +"c422293b": "finishIssuance()", +"c422d09b": "ConfirmOwner()", +"c422ed19": "addFreeBet(address,uint256)", +"c4236cdc": "catchStarters()", +"c4254c7b": "CoreWallet()", +"c4255d61": "addZeroTest()", +"c4259e2e": "changeOwnerInfo(uint256,uint256,string,string,string,string)", +"c4264738": "refundSafe()", +"c426b1e5": "showDepositEther(address)", +"c426c3e2": "getExtendedAttributesForPlayer(uint256)", +"c426fbb6": "setCrowdsaleStartBlock(uint256)", +"c4270574": "userRollDice(uint256,address)", +"c42791ae": "setBountyOwner(address)", +"c427a68b": "ExtremeSetupToken()", +"c427af9b": "outcomeAmounts(address,int256)", +"c427e699": "getContractsOf()", +"c42882e3": "getEarlyAccessKitsRemaining()", +"c42890b6": "setCastleContract(address)", +"c4290b76": "getAmountWithdrawal(address,bytes32)", +"c42956d3": "nextExchangeRateIndex()", +"c4298f89": "ACL(address)", +"c429e4a3": "TEAM_ALLOWANCE()", +"c42a0716": "erc20(string,string,uint256,uint256)", +"c42b372d": "openAutoFree(address)", +"c42b5fe1": "registerExternal()", +"c42bb1e4": "contract_eth_value()", +"c42bd05a": "newToken()", +"c42c237a": "CortexCoin()", +"c42c9905": "register(bytes20,uint32,int24[4],int24[4],uint32[4],bytes32[])", +"c42cb819": "goldBoxAmountForSale()", +"c42cce7e": "total_tickets()", +"c42cd8cf": "etherSplit(address,address)", +"c42cf535": "setGovernor(address)", +"c42e04c0": "etherOne()", +"c42e1ace": "TKP()", +"c42ed894": "getRoundTargetBlock(uint32)", +"c42edd61": "payFeesToggle()", +"c42edf88": "leveRage()", +"c42f61d3": "RhodoToken(address)", +"c42fd368": "RateChanged(address,uint256,uint256)", +"c4305a55": "windowBonusMin()", +"c430bcda": "whitelistInvestor(address)", +"c43147c1": "InitializeManifesto(string,string,uint256,bool,bool)", +"c43148ca": "makeProposal(string,uint256,uint256,uint256,uint256,address,address)", +"c4319bd8": "AgreementHashEn()", +"c431f885": "addToContribution()", +"c4321adb": "investInTheSystem(uint256)", +"c4329ae5": "totalChangedPixels()", +"c433793d": "removeWhiteListedAddress(address)", +"c433e8ca": "remainMintTokenAmount()", +"c4342252": "latestScheduledUpdate()", +"c434650c": "_checkOrder(address)", +"c4359c1b": "marketSeeds()", +"c435ae0c": "setMaxGoal(uint256)", +"c435d26f": "GREMToken()", +"c435d2ac": "publishedTokenOfOwnerByIndex(address,uint256)", +"c435d68e": "numberOfContracts()", +"c4366149": "optionBalance(bytes32,address)", +"c4373c05": "tickRequiredLog(uint256,address,uint256)", +"c43782e0": "ZipToken()", +"c437b951": "BytechTechnology()", +"c43821aa": "issuanceCurrentBalanceSum(address)", +"c43823e1": "jsonKeyExists(string,string)", +"c4387936": "edgePigmentB()", +"c439af4f": "WAVEliteToken()", +"c43a6a79": "returnsTwoNamed(uint256,uint256)", +"c43aa319": "startTime_()", +"c43ae983": "GROWTH_BUMP()", +"c43b7934": "stagePrice(uint256)", +"c43bb538": "requestOwnershipTransfer(address,bytes32)", +"c43c633b": "traderBalances(address,address)", +"c43c9e12": "addTokenAdmin(address,address)", +"c43d0575": "scheduleCall(bytes4,uint256)", +"c43d56bb": "changelp4(address)", +"c43d9ac9": "TCETest()", +"c43e0e72": "_withdraw(address,address)", +"c43e9462": "getRoundNumber(uint256,uint256)", +"c43eb0e0": "getAvatar(bytes32)", +"c43ed2c8": "update(bytes)", +"c43f22c4": "isInvestorAllowed(address)", +"c440008e": "foundersFund()", +"c4400ed4": "getProfit(uint8,uint256)", +"c4405fa7": "_getMaxRarityChance()", +"c44088fd": "rewardUnitsRatePerYear()", +"c440e875": "dedeNetworkAddress()", +"c44193c3": "offerPunkForSale(uint256,uint256)", +"c44237dc": "EventUpgradeShip(address,uint32,uint8)", +"c4426a88": "arbitrate(address,address,bytes32,bool)", +"c44299c7": "preAlphaPrice()", +"c4432f31": "P3DAddress()", +"c443a99a": "MicoinNetworkToken(uint256,string,string)", +"c44412e3": "revokeBonusCreditOf(address,uint256)", +"c4453bd0": "getPlayerMinions(uint32,uint8)", +"c4454980": "fundManually(address,uint256)", +"c4457e47": "load(uint8[],uint256,uint256,uint256,bool)", +"c445e2ef": "RedPillToken()", +"c4468f69": "setNewPotWinner()", +"c4477a11": "Banknote(address,uint256)", +"c4479812": "batchMultipleAmount(address[],uint256[])", +"c44828be": "totalAllowance(address,address)", +"c4489110": "BUYOUT_PRICE()", +"c448fa85": "isExtraDistribution()", +"c44a2a10": "ownerCredited()", +"c44b0290": "setLockPostion1(address,uint256,uint8,uint256,uint8,uint256,uint8,uint256,uint8,uint256,uint8)", +"c44b10d9": "payoutOdds()", +"c44c2efd": "burnPLUTUSTOKEN(uint256)", +"c44cb8fc": "viewTotalPayoutToPlayer(address)", +"c44cd4df": "sendReaction(address,int8,string)", +"c44ced7e": "ozr()", +"c44d36ee": "protectedTransfer(address,uint256,bytes32)", +"c44d6f87": "PAPER()", +"c44dcaca": "draw(uint256,address,uint256)", +"c44e6640": "getAuctionCount()", +"c44e787f": "sideBetPay(bytes32)", +"c44f7864": "getRemainingTimeInSecond()", +"c450a08a": "queryLockedTokens(address)", +"c450a25f": "unfreeze_contract()", +"c450d98b": "getCommunityReputation(address)", +"c4522c92": "removeStaff(address)", +"c45250c8": "icoRound3()", +"c45330b4": "remainingTotalBonuses()", +"c453cdd4": "getMyVines()", +"c4543386": "TUIToken()", +"c4545e6d": "_replaceModule(address)", +"c4552791": "proxies(address)", +"c4561d61": "finishICO()", +"c456354e": "setEndTimeStamp(uint256)", +"c4569504": "getKudosOf(address)", +"c456d394": "getPixelPrice(uint256)", +"c4576525": "WEC()", +"c457fb37": "getTokenPrice(uint256)", +"c45849c2": "doDistribution(uint256,address,uint256)", +"c458e5f3": "CrowdForceTestToken()", +"c4590d3f": "setLimits(uint256,uint256)", +"c4596419": "mintSoldTokens(address,uint256)", +"c45982b9": "madd(uint128,uint128)", +"c459b003": "ATTR_PERMANENT()", +"c459b9e3": "MaxStarIndexAvailable()", +"c45a0155": "factory()", +"c45a4047": "batchTrasfer(address[],uint256,uint256)", +"c45a6f98": "unlockMultiple(address[])", +"c45aa04c": "queryShareholders(bytes,uint256)", +"c45ad06a": "etherSince50()", +"c45b415e": "createRequest(address[4],address,uint256[11],uint256,bytes)", +"c45bb448": "MIX()", +"c45c4f58": "balance1()", +"c45cda5a": "init_fund()", +"c45d19db": "tokensToBeReturned(address)", +"c45d32cf": "getRemainingBytesLeadingZs(uint8,bytes)", +"c45d3d92": "conversionWhitelist()", +"c45d5fcb": "TwoStageCrowdsale(uint256,uint256,address)", +"c45d8af4": "getWinIndexFromHash(address,bytes32)", +"c45d8c8b": "Gryphon()", +"c45ddd87": "targetDiscountValue4()", +"c45df8e5": "COSIGN_MAX_TIME()", +"c45e4a7b": "SwiftDex()", +"c45ec88c": "Put(bytes32)", +"c45ef547": "offlineDiscipleSold(uint256,address,uint256)", +"c46073f7": "LUCYD()", +"c46093de": "_0xMonacoinToken()", +"c46180a7": "setBalanceOfActiveToken(address,uint256)", +"c461889e": "OkLive(uint256,string,string)", +"c4618978": "MIN_INVEST_ACTIVE()", +"c4620549": "quaker(address)", +"c4626ea7": "PumpHodl()", +"c4628520": "cashoutEOSBetStakeTokens(uint256)", +"c462a408": "maxParticipantCount()", +"c462bd11": "setupRules()", +"c46362fd": "set_merge_mint_threshold(uint256)", +"c463a1af": "CapitalMatchToken()", +"c463b008": "triggerTransferEvent(address,address,uint256)", +"c464fe65": "sellTokens(address,uint256)", +"c465e742": "UpdatedTokenInformation(bytes32,bytes32)", +"c466313c": "GetMainSale()", +"c4664649": "FIXEDREWARD_MM()", +"c4666fab": "transferNodeContractOwnership(address)", +"c467706d": "startEarlyAdopters()", +"c467a317": "freezeTeam()", +"c467b0ff": "_play(uint256,uint256,uint256,uint256,uint256)", +"c4694ec6": "ecoSupply()", +"c4697667": "BONUS_WL()", +"c469eb99": "deleteFromWhiteList(address,address)", +"c46a23a2": "signedAverage(int256,int256)", +"c46a2925": "setMinApprovalCount(uint256)", +"c46a3a0d": "icoPhase1EndTime()", +"c46a6262": "playEtherOf()", +"c46aaf38": "PharmaGenome()", +"c46b2d9d": "denyBundling()", +"c46b644b": "NewTicketEvent(address,uint8,uint8,uint8)", +"c46c3c68": "RuffToken()", +"c46cacae": "initial_time()", +"c46ce53e": "getOneTotalFeesCollected(uint256)", +"c46d2235": "serverEndGameConflictImpl(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,bytes32,bytes32,uint256,address)", +"c46d4cf1": "thawAccountTransfers(address)", +"c46df008": "walletData(address)", +"c46e3e85": "unitGooProduction(uint256)", +"c46e614a": "isCMCT()", +"c46ed45a": "fee_percentage()", +"c46f3e25": "lastChanceEnabled()", +"c4701037": "aaa(bytes)", +"c47028c1": "TOKEN_RATE_CROWDSALE()", +"c47031ab": "getKarma()", +"c470ff6d": "getInsideCallCount()", +"c4716d0f": "contributedCap(address)", +"c4725577": "getPrice(uint256,uint256,uint256,uint256)", +"c472c7e6": "setTotalWithdraw(address,uint256,address,bytes,bytes)", +"c4735121": "thirdRoundTime()", +"c4740a95": "removeAccount(address)", +"c4749079": "_roundDivision(uint256,uint256,uint256)", +"c4749bbd": "showInvestBalance()", +"c474e70a": "returnFundsForMultiple(address[])", +"c4752773": "priceStep3()", +"c475abff": "renew(uint256,uint256)", +"c475cdf5": "issueNew(uint256)", +"c476dd40": "reportMalicious(address,uint256,bytes)", +"c477d234": "checkIfAlreadyOrderedForDay(uint256,address)", +"c4784fd4": "setMsg(string)", +"c4788efe": "resetTotalVotes()", +"c478b52f": "PLATINUM_AMOUNT_TPT()", +"c478fc37": "EtherWheel(uint256,uint256,uint8)", +"c4791421": "changeCooldownEndTime(uint40,uint40)", +"c47958e2": "ERC20(string)", +"c479ace6": "updateOwners(uint256,address,address[],uint256,uint8[],bytes32[],bytes32[])", +"c47af5cf": "ChangeCost(uint256)", +"c47af732": "setReserved(address,bool)", +"c47bc007": "add_funds()", +"c47c4cc7": "getInitialBalanceByAddress(address,address)", +"c47cf5de": "getAddress(bytes)", +"c47d5bb8": "unitsUserCanBuyLimitEth()", +"c47e7bcb": "softcap3Reached()", +"c47e951f": "adjust_eth(uint256)", +"c47e9fea": "ContributionRefund(uint256,address)", +"c47ef875": "activeTokens()", +"c47f0027": "setName(string)", +"c47f0f90": "getPurchases()", +"c47fae76": "autoPlayBot()", +"c47fc244": "grantInvestorsTokens(address[])", +"c48029d4": "AddTokensToMember(address,int256)", +"c4806df4": "createTokenOwner()", +"c480e583": "revertTransfer(address,uint256)", +"c4811a0e": "maxICOThirdSupply()", +"c4813b2c": "StgOnebonusEnds()", +"c4815c96": "teamAdvTokens()", +"c4818ae1": "joinPillar(uint256,uint8,uint256)", +"c4818cdc": "_balanceOf(address,address)", +"c482299f": "transferAUTOtokens10(address[])", +"c482ceaf": "reinit()", +"c4834c30": "teamTotalSupply()", +"c483b71c": "Map(address)", +"c483befa": "setParameters(address,string,string,string,address,uint256,uint256)", +"c4841369": "paymentsByPurchaser(uint128)", +"c4843365": "getRarity(uint32,uint256)", +"c48513a4": "getStringConstant()", +"c485297b": "HelloSystem()", +"c48590e9": "PARTNER_SUPPLY()", +"c485ac95": "setWalletForTokens(bytes32,address)", +"c486301b": "AcceptsExchange(address)", +"c4864f45": "changeAcceptExchange(bool)", +"c4868452": "preIcoActive()", +"c486d133": "round1InitialBonus()", +"c4871039": "totalWeiRaisedDuringPhase2()", +"c4882e44": "disableRound0()", +"c488847b": "liquidateCalculateSeizeTokens(address,address,uint256)", +"c488d6f2": "stopOffering()", +"c489744b": "getTokenBalance(address,address)", +"c489a649": "updateAirdrop(address)", +"c48a0dc0": "OptionToken()", +"c48a3cbf": "setStackPtr(uint256)", +"c48a66e0": "transferTimelocked(address,uint256,uint256)", +"c48a7560": "sellScams(uint256)", +"c48b1cf0": "test_5_accessRestriction_addMember_shouldThrow()", +"c48c68ee": "addressFounders4()", +"c48d5a4a": "_buy(uint256,uint256,uint256,address,uint256)", +"c48d93d8": "JuraToken(uint256,string,string)", +"c48d99ca": "DataDumped(address,string,bytes32)", +"c48db366": "Africacoin()", +"c48dc5fb": "JackpotAwarded(uint256,address,uint256)", +"c48e1c4d": "importAddresses(address[],address[])", +"c48e5ec4": "getPurchaseDetail(uint256,uint256)", +"c48e819c": "test_openRegistry()", +"c48eabc0": "getContributionPool()", +"c48ef17c": "floorId()", +"c4909a70": "addConfig(bytes32,bytes32)", +"c490a266": "toUInt(bytes)", +"c490dfa6": "isVerifiedAddress(address,address)", +"c491fd18": "FlexibleTokenSale(address,address,uint256,address)", +"c493afcf": "closeRefund()", +"c494a080": "totalPlayer()", +"c494c3dc": "hashParent(uint256,bytes32,bytes32)", +"c494c3f7": "teleportKnight(uint32)", +"c494f71a": "LedgerFund(uint32,uint32,uint64,uint64)", +"c49589bb": "rateUSDcETH()", +"c4969b8f": "setSellerAndAmt(address,uint256)", +"c4977807": "getFrozenAccount(address)", +"c4983c65": "updatePoints(address)", +"c498fcfd": "getUnitDefenseIncreases(address,address,uint256)", +"c49a1ede": "updateShareValue(address,uint256)", +"c49a3b04": "OraclizeVerifier(address,string,uint256,uint256)", +"c49a8fc9": "secureUpdateOrderFunds(address,bool,uint128,uint128,uint128,uint128)", +"c49b94e9": "getTokenTxn(uint256)", +"c49c3635": "getEventOutcomeIsSet(uint256,uint256)", +"c49d3b9f": "memberData()", +"c49d9ff8": "chatMessages(uint256)", +"c49ee5b4": "finalUnpause()", +"c49f91d3": "EIP712DOMAIN_TYPEHASH()", +"c49fea77": "setVariables(uint8,uint8,uint8,uint8,uint256)", +"c49fef66": "maxAnimals()", +"c4a06710": "isKYCPassed(address,address)", +"c4a0dada": "getOtherName()", +"c4a13f23": "affiliateBonusPercent()", +"c4a1dfda": "viewFirstBatchOfClauses()", +"c4a1ee37": "gasLimitWithdrawConfirm()", +"c4a1fedf": "increaseWeeklyTransactionVolumeReceiving(uint256)", +"c4a2c6b4": "Partial23Send()", +"c4a2d664": "setTransferFeeMax(uint256)", +"c4a2e641": "confirmTransaction(uint256,bytes)", +"c4a2fe12": "setversion(uint256)", +"c4a31557": "packSaleAddress()", +"c4a381b8": "setTokenRate(uint32)", +"c4a4cb4e": "countMilk()", +"c4a4e267": "weaponToApproved(uint256)", +"c4a4f265": "minimalContribution()", +"c4a50433": "unprocessedProfits()", +"c4a5350d": "createNewContract(string,string)", +"c4a5b138": "approved(address,uint256,address,bytes)", +"c4a796c1": "setReferee(address)", +"c4a8158c": "getMyTurtle()", +"c4a8598e": "BANCOR_X()", +"c4a85bc1": "allowAccess(address)", +"c4a89e9e": "lengthOf(uint256,uint256)", +"c4a8a670": "getEvent(string,uint256)", +"c4a8b570": "setdteamVaultAddr3(address)", +"c4a942cb": "chunkSize()", +"c4a96758": "getByteFromByte32(bytes32,uint8)", +"c4a9e116": "stakeCount()", +"c4aa94a6": "withdraw(address,uint256,address[],uint256[])", +"c4ad32be": "generateTrees(uint256)", +"c4adb406": "validDestinations(uint256)", +"c4ae16a8": "getPlayerId(address)", +"c4ae3168": "togglePause()", +"c4b05f49": "addThing(string,string,string,string)", +"c4b06c19": "SeedSale(address)", +"c4b14e0b": "getSignature(bytes32)", +"c4b195ab": "r2(address)", +"c4b24a46": "checkReward()", +"c4b2841c": "_doTradeWithEth(address,uint256,address)", +"c4b293db": "getBuyRatio()", +"c4b296a7": "getInvestorIndex()", +"c4b2a668": "GlavCryptPoint()", +"c4b2eccb": "maxAmountAddresses(address)", +"c4b35f3d": "DIV()", +"c4b379f7": "earningsOfPlayer()", +"c4b3a516": "setPercentageAvailableToSell(uint256)", +"c4b40fb7": "tkcAddress()", +"c4b4dff1": "PayChain()", +"c4b54551": "MAX_SPARTANS()", +"c4b57df5": "createEscrow(uint16,address,address,uint256,uint16,uint32,uint32)", +"c4b5cde2": "EventBuyShip(address,uint16,uint64)", +"c4b5f891": "LTBToken()", +"c4b62bbb": "updateAddressSetting(uint256,address,address,string,string)", +"c4b67e8a": "generateReport2(int8[],uint32[])", +"c4b6b5fd": "initChallenge()", +"c4b6c2f3": "btcPriceProvider()", +"c4b6fec9": "sendVal()", +"c4b71cec": "ICO_LEVEL_1()", +"c4b781a8": "setPercentAllocationFee(uint256,uint256)", +"c4b7c4cf": "communityVote(bytes32,bool)", +"c4b80f6e": "incPlayerOwed(address,uint256)", +"c4b9223f": "setVestingSchedule(address,address,uint256,uint256,uint256,uint256,bool)", +"c4b9897b": "IagonToken()", +"c4baa573": "process2(bytes32,uint256[],bytes)", +"c4baf4a4": "IQT_FUNDATION_ADDRESS()", +"c4bb0173": "hash_sha3(string,uint256)", +"c4bc5da5": "resumeContract()", +"c4bc7b70": "setGlobal(uint64,bool)", +"c4bd10d9": "getPollOption(uint256,uint256)", +"c4bd8ebc": "num_monsters()", +"c4bde5e1": "totalLotteryNumber()", +"c4bebd69": "pauseLastStart()", +"c4bff124": "addBlacklistItem(address)", +"c4c0698d": "withdrawInEmergency()", +"c4c1b39a": "tokenPriceInitial_()", +"c4c1c94f": "add(address[])", +"c4c1d835": "DataAuction(address,address)", +"c4c22e98": "blockInterval()", +"c4c24249": "turnLast()", +"c4c2e702": "execute(uint32)", +"c4c308be": "getBeneficiaryCash()", +"c4c3718b": "satoshi_bth_decimals()", +"c4c39ba7": "SWAP_CAP()", +"c4c49380": "setCap()", +"c4c4a89b": "buyNewDrone(uint256)", +"c4c4d00b": "CRBTTokenLive()", +"c4c4e3c0": "GOLD_AMOUNT_SKL()", +"c4c4e438": "oraclize_query(uint256,string,bytes[3])", +"c4c50acf": "giftTokens(address,uint256)", +"c4c59c77": "ethIN()", +"c4c5f3de": "forecastingClosed()", +"c4c6710d": "buyTicket(uint256,uint256,uint256)", +"c4c676cf": "TRBToken()", +"c4c68b44": "getTotalSupplyForType(uint256)", +"c4c745b6": "getBonusFactor(address,uint256)", +"c4c842f7": "_emitJobBinded(uint256,uint256,bool)", +"c4c90d70": "withdrawHouseFee()", +"c4c90f4c": "tokenUsersSave(address)", +"c4cae886": "setManualTradingAllowed(bool)", +"c4cb291e": "unpaid()", +"c4cbb591": "compot()", +"c4cbd65b": "isTourUnfreezed(uint256)", +"c4cbfa44": "isConstructor()", +"c4cc161b": "SellSnail(uint256)", +"c4cc5616": "addStory(uint256,string)", +"c4cc6e53": "TgeOtherReleasingScheduleContract(uint256,uint256)", +"c4ccf6ea": "getAmountBonus(uint256)", +"c4cf8a40": "createTradeContract(address,address,uint256,uint256,uint256,bool,bool)", +"c4cf9385": "MetaMorph()", +"c4cfc5be": "PGE01NY()", +"c4d01481": "getPreRemainCoins()", +"c4d07951": "setVoting(address)", +"c4d18b18": "calculatePoohBuy(uint256,uint256)", +"c4d252f5": "cancel(bytes32)", +"c4d259ad": "setIsAdmin(address,bool)", +"c4d2783c": "GTTAirdrop(address,address)", +"c4d2b1b3": "getLoanData(bytes32)", +"c4d2bac9": "HelloToken()", +"c4d3926a": "currentTokenIdNumber()", +"c4d42292": "ResidualShare(uint256,string,string)", +"c4d4fdc0": "getBonusRateForTimeBased()", +"c4d66de8": "initialize(address)", +"c4d77090": "nodeAddresses(uint256)", +"c4d7b98f": "erc20ContractSwitch(address,address,uint256)", +"c4d8aa44": "VenaCoin()", +"c4d9102f": "setNextID(uint256,int256)", +"c4d97470": "PeriodReset(uint256,uint256,uint256,uint256)", +"c4daa2a6": "roundFees(uint256)", +"c4dbf622": "buyPrice(uint256)", +"c4dc1556": "finalizeProposal()", +"c4dcad1d": "mining(address,uint256)", +"c4dd3b33": "checkUserSignature(address,string,uint32,string,string,bytes32,bytes32,uint8)", +"c4dd5acc": "isLastBadgeEle(uint256,uint256)", +"c4dddedd": "addressVerified(string)", +"c4ded499": "getActiveBetsAmount(address)", +"c4df310a": "isWithinTokenAllocLimit(uint256)", +"c4e11c91": "updateStats(uint256,uint256)", +"c4e12e1d": "updateMinVotedTokens(uint256)", +"c4e16b7d": "whitelistToken(address,uint256)", +"c4e1793f": "_onOverTimeBall(uint8,uint8,uint8,uint8,uint8[3][3][31])", +"c4e29e66": "getOrderHash(address,uint256,address,uint256,uint256,uint256,address)", +"c4e34d46": "lockBonusTokens(uint256,address,uint256)", +"c4e37095": "setSaleState(bool)", +"c4e3a63b": "firstPeriod()", +"c4e41b22": "getTotalSupply()", +"c4e5b7f2": "createAcceptAndPayFromBytes(bytes,address[],uint256[],uint256[])", +"c4e5fd83": "_safeTransferFromInternal(address,address,uint256,bytes)", +"c4e627c2": "maxTokenCount()", +"c4e6aaa6": "setLocationId(uint32)", +"c4e6c604": "otherAddress()", +"c4e7099f": "mockTime(uint32)", +"c4e71adc": "firstReleaseTime()", +"c4e7d14c": "MultiSender(uint256)", +"c4e85b63": "flushTokens()", +"c4e9311b": "bindJobWithBoard(uint256,uint256)", +"c4e98398": "SimpleRegistrar(bytes32,uint256)", +"c4e9e80b": "setAutoSell(uint256)", +"c4eaa978": "_price_token_ICO4()", +"c4eb2b3c": "putSaveData(address,address,string)", +"c4eb8ec2": "transfer_ether(address,uint256)", +"c4ecfbbe": "MonsterChampionship(address)", +"c4eeeeb9": "isReissuable(bytes32)", +"c4ef18fc": "setRentAuctionContractAddress(address)", +"c4ef92d3": "OmiseGOGold()", +"c4efa665": "decimalPrecision()", +"c4f06ba9": "makerOf(uint256)", +"c4f07cff": "getWithdrawTransactionIds(uint256,uint256,bool,bool)", +"c4f0a043": "BTCPrice()", +"c4f1215c": "maxGoalReachedAt()", +"c4f141ff": "setWeiPerCHF(uint256)", +"c4f14c9c": "restrict(address,address)", +"c4f161ab": "isWinner(address,address)", +"c4f1ce79": "clearCurPrize(address,uint256)", +"c4f2a64f": "blockWait()", +"c4f2a7af": "GeneScience(address)", +"c4f35d6c": "WithdrawalToken(uint256)", +"c4f363bf": "getVersionByte(uint256)", +"c4f3c097": "setBasicRate(uint256)", +"c4f54568": "blocktubeTag(string)", +"c4f5cd82": "firstAllocation()", +"c4f62031": "setPlayerPrice(uint256,uint256)", +"c4f7f1e2": "scaledRewardPerToken()", +"c4f8210e": "_safeTransfer(address,uint256)", +"c4f8adc7": "consul_nme()", +"c4f8b9fb": "testAdd(uint256,uint256,uint256)", +"c4f8f339": "getPercent4(address)", +"c4f95105": "showUnpayedPercent(address)", +"c4f987a5": "removeWorker(address)", +"c4f99aa5": "publicReservedAddress()", +"c4fa9c6b": "getReservedTokenDestinationList(address,bytes32)", +"c4faa950": "BrinkToken(uint256,string,uint8,string)", +"c4fbdaff": "gibLambos(uint256)", +"c4fc3a3b": "presaleTokenSupply()", +"c4fc89e1": "bubbled()", +"c4fce59a": "fourthExtendedBonusSalesEnds()", +"c4fd262a": "CrowdsaleStarted(uint256,uint256,uint256,uint256)", +"c4fda23e": "sellTokensIcoWithReferal(address)", +"c4fdc6b8": "pauseIco()", +"c4fe2675": "getProtoIdByTokenId(uint256)", +"c4fed7fb": "addHouseCredits(address,uint256)", +"c4ff3614": "Wallet(address[],uint256,uint256)", +"c5007227": "DTToken()", +"c500ea36": "userPendingCrateNumber(address)", +"c501024b": "setMinCutValue(uint256)", +"c5015018": "TEAM_MONTHLY()", +"c501825a": "WALK()", +"c501b87f": "setCreditMcAddress(address)", +"c503101e": "setCanClaim(bool)", +"c503772d": "returnUint8(uint8)", +"c503a868": "getTeamFee(address)", +"c5043343": "tempSetWinner(uint256,address)", +"c5044b62": "isDescriptionFinalized()", +"c50497ae": "SUPPLY()", +"c50499db": "developer_string_contract_verified(string)", +"c504bfb8": "ColorsMain()", +"c50508de": "initialAuctionDuration()", +"c505c82c": "zxcSold()", +"c505ebce": "endRate()", +"c506adae": "migrateInvestorsFromHost(uint256)", +"c5072172": "justThrow()", +"c50853f5": "getNumPublications()", +"c50886ae": "test_ConsensysNotReached()", +"c508d8f2": "reederemPeriods(uint256)", +"c5096a69": "feeFor(address,address,uint256)", +"c509c262": "TokenManager()", +"c509d0b2": "logCompleteSetsPurchased(address,address,address,uint256)", +"c509db3b": "getverifytime(address)", +"c50aea06": "claimShares(uint256,uint256)", +"c50bb446": "getNeutralMutation(uint32)", +"c50bd2e4": "trancheDenominator()", +"c50be063": "myPlanetList(address,uint256)", +"c50be16c": "setPublicRelease(uint256)", +"c50c44cf": "getAuctionSeller(uint256)", +"c50c97d0": "changeStorage(address)", +"c50cb9ae": "transferComplex(address,uint256,uint256)", +"c50d725c": "DACToken()", +"c50d847e": "POSC()", +"c50ec10a": "repoAppId()", +"c50f197b": "charitySplitPercent()", +"c50f8274": "IWasFirstServiceToken()", +"c50ff563": "canSubAllocation(address,uint256)", +"c510187e": "vpfHash(bytes32,uint256,uint256)", +"c5104c3d": "minPurchaseAmt()", +"c5105bb5": "TotalEDUSupply()", +"c510c906": "getEventOutcomeNumeric(uint256,uint256)", +"c510da62": "getsell(uint256)", +"c510db20": "userCanStillBuyEth(address)", +"c510dfeb": "convertAddressFormat(address[8])", +"c510f746": "createElection(bytes32,bytes32[])", +"c51131fb": "canBeSet(bytes32)", +"c511a362": "TransferTargetToken(address,uint256)", +"c511b016": "SingularDTVToken(address,address,string,string,uint256)", +"c511ed5e": "closeMarket()", +"c51215df": "preSaleListTime()", +"c51226b3": "secondStageMintingDate()", +"c5129348": "See_price()", +"c512d1d1": "testCalculateItemId()", +"c5132a5c": "getCreateMarketDesignatedReporterAddressValue()", +"c5133802": "mintFraCoins(address,uint256)", +"c5135ba0": "fuckynum()", +"c513cde2": "KD1Token()", +"c513d596": "BountyAdded(bytes32,string)", +"c513f66e": "EMPTY_PARAM_HASH()", +"c51450ca": "getTokenIdAtIndex(uint256)", +"c514ff3f": "EasticoinToken(uint256,string,string)", +"c515205d": "getValue2()", +"c515627e": "depositEther(address,uint256,uint256,uint256)", +"c5160187": "mintStart4()", +"c5162e1a": "vendre(uint256)", +"c516358f": "bountyAddress()", +"c5179027": "team0Points()", +"c518123a": "financingPeriod()", +"c519099d": "teamAndFounders()", +"c519500e": "potSplit_(uint256)", +"c51a29e0": "getContractType()", +"c51be90f": "query_withGasLimit(uint256,string,string,uint256)", +"c51bf934": "CEILING()", +"c51cc592": "setTransferAllowance(bool)", +"c51cd5d6": "StarWarsRTscore()", +"c51cd6ad": "getLockAccount(address,uint256)", +"c51ce17b": "TelegaOut(address)", +"c51cf179": "calcBaseFeeForShares(uint256)", +"c51d16b6": "totalCollectedWei()", +"c51dc993": "expiryCheck(string)", +"c52046de": "isDeployed()", +"c5210e89": "ERC20Standard(uint256,string,uint256,string,bool)", +"c52141da": "checkSign(address)", +"c52164c6": "reputation()", +"c52173de": "xConvert(address[],uint256,uint256,bytes32,bytes32,uint256)", +"c5231563": "addAddress(uint256,address)", +"c523d5dd": "setBlockPart(uint64,uint64,uint64,bytes32,bytes)", +"c523ef11": "VNDCash(uint256,string,uint8,string)", +"c5241e29": "removeWhitelisted()", +"c5242acb": "setWithdrawOwner(address)", +"c524645b": "getTimeBonusAmount(uint256)", +"c527018b": "jdalevsystemscoin()", +"c527326e": "PFOffer(address,address,bytes32,uint256,uint256,uint128)", +"c5277ddd": "isPublisherRegistered(address)", +"c5282f7a": "generateTokensForPresaleAccounts(address[])", +"c528fee7": "DRCToken()", +"c5292c67": "getStart()", +"c5292ed9": "calculateEggSell(uint256,uint256)", +"c52987cf": "strikePrice()", +"c529b80b": "transferWithData(address,uint256,bytes32)", +"c52ab778": "execute(address,uint256,uint256)", +"c52adfda": "BobsNVag()", +"c52ba8b6": "addCrowdsales(address,address)", +"c52bd836": "setDappOwner(bytes32,address)", +"c52c936c": "removeByIdx(uint256[],uint256)", +"c52cb003": "OwnerDistribSupply_()", +"c52cde58": "getRedeemableTokensVoter(bytes32,address)", +"c52ce9be": "basicTransferFromTest(address)", +"c52e40d0": "totalWeiExpected()", +"c52f02ce": "BLS_PRE_ICO()", +"c52f9fa6": "PartialOwnershipCrowdsale(uint256)", +"c52fd6fa": "exTx(uint256)", +"c5312191": "WeiController(address,address,address,uint256,bool)", +"c531c245": "exists(int256)", +"c531d52b": "STRUTToken()", +"c5337992": "setBossHPDefault(uint256)", +"c5337ed4": "random2()", +"c5339132": "lastPlayed()", +"c533fc68": "getLockAccInfo(address)", +"c5340dcd": "received_wei_with_bonus()", +"c53467cf": "releasePublicPresaleBonusTokens(address[],uint256)", +"c5346fb1": "approve_coin(string,bool)", +"c534ba4b": "destroyBlacklistedTokens(address,uint256)", +"c5350345": "Magexbit()", +"c535165f": "revealAndPayout(bytes,bytes)", +"c5364bc3": "GetChallengeWeightedVolumes(uint256)", +"c536c952": "getDsitribute(address,uint256)", +"c536ed5f": "buyDmlCoin(address)", +"c537a210": "principalOutstanding()", +"c537f954": "adjustDeployRange(uint256,uint256,uint256)", +"c53833fe": "getLastContract()", +"c539607c": "get_internal_block_number()", +"c53a0292": "increaseNonce()", +"c53abe29": "tokenOnlyDeploymentCost()", +"c53ad76f": "Kardashian()", +"c53adaff": "SingularDTVWorkshop()", +"c53b12f9": "myEthBalanceOf()", +"c53b4252": "getpatient(uint256,uint256)", +"c53b9c04": "maxTimeRemain()", +"c53bafbb": "setPriceOf(string,string,address)", +"c53c2556": "getTokenIdFrombBPhash(string)", +"c53c614d": "canBeWhitelisted(string)", +"c53ce034": "totalDraw()", +"c53d6ce1": "getAllBalances(address)", +"c53d8483": "getActualTotalTokens()", +"c53dbf82": "disclosureAdded(uint256,bytes32,bytes32,bytes32,bytes16,bytes1,bytes16,bytes32,bytes32)", +"c53df200": "getArrUintField1()", +"c53df937": "unshareService(bytes32,address)", +"c53e4387": "IHODLToken()", +"c53ee3a5": "_setInitialCardPrice(uint128)", +"c53f926b": "setByuoutActive(bool)", +"c53fc65f": "tokensDevelopers()", +"c53ffe66": "KillerWhale()", +"c5401559": "setQuantityAdminOnly(uint256,uint256)", +"c5405f17": "registerUserBonus(address,address,address)", +"c540f903": "DeployRelay()", +"c540fb66": "updateBuyNum(bytes32,uint8)", +"c54110d6": "AcceptsNASDAQ(address)", +"c54117ac": "REDGILL()", +"c54124be": "sub()", +"c541783c": "getLockedBalanceOf(address,address)", +"c541a5bd": "revertAML(address)", +"c5426124": "getStar(uint256)", +"c542675e": "fus(uint256)", +"c54397a4": "changeAffiliate(address,uint256)", +"c543ae53": "evaluateArea(address,uint8,uint256)", +"c543b427": "IntegrationOfCredit()", +"c543c922": "devWithdraw(uint256)", +"c54421ae": "teamTokensNotDistributed()", +"c5442f7d": "getRandom(uint16,uint8,address)", +"c5444ff9": "buyTokens(address,uint128,uint256)", +"c544682b": "rewardForBurn(uint256)", +"c544f8d9": "EventRemoveFromBattle(address,uint64)", +"c5454d11": "Finalize()", +"c545c09d": "calculatePrice(uint256,uint256,uint256,address)", +"c5460e71": "getReleasableAmount(uint256,address)", +"c5465a23": "votingstage()", +"c546a92e": "testTransferTokensUsingRawCall()", +"c54704e6": "setLockStartTime(uint256)", +"c547092b": "setMilestone(uint256)", +"c547af82": "_totalVouchersSupply()", +"c547d8f1": "totalWeiAmountSale3()", +"c547e14d": "setHatchDurationByTimes(uint32[])", +"c54837a4": "extinguish()", +"c5487661": "proxyTransferToICAPWithReference(bytes32,uint256,string)", +"c5494b82": "SCH()", +"c5495b54": "replaceAssetManager(address,bytes32)", +"c5498e4e": "setTeamAndAdvisorAndAirdropAddresses(address,address,address)", +"c54996b7": "refundBond(uint256,address)", +"c549e4e9": "sellPriceAt(uint256)", +"c549e6b9": "DAYS()", +"c549e7a0": "ManualTokenMintRequiresRefund(address,uint256)", +"c54a068c": "getCurrentRateInternal()", +"c54a0980": "Total_Entries()", +"c54b25b0": "claimCancelled(uint16,address)", +"c54b5658": "toAddress(bytes,bytes,uint256)", +"c54c80eb": "RxPharma()", +"c54cd39c": "getSandwichInfoCaloriesPrice(uint256)", +"c54d51d4": "popDecoration()", +"c54d59a1": "snt_claimed(address)", +"c54d8609": "setCoOwner2(address)", +"c54e73e3": "setPresale(bool)", +"c54e91c6": "currentPart(address,address)", +"c54f050c": "_createOrder(address,address,uint256,address,uint256,uint256,uint256)", +"c54f3409": "getGameEnd(address,uint256)", +"c54f5344": "OfficialWalletAddr()", +"c5503e89": "allocateTokensInternally(uint256)", +"c5505235": "toEther(uint256,uint256,uint256)", +"c550eb56": "isOrderExist(uint64)", +"c5526d16": "setCrowdsaleWallet(address)", +"c5530077": "wildcards(uint16)", +"c55374d0": "oraclizeDelay()", +"c55425e6": "TotalOwnerSupply()", +"c5543b22": "powerDayPerPersonCapInWei()", +"c5546ecd": "transferTokensToParticipants(uint256,uint256,uint256,uint256,address)", +"c5549cc0": "minDeadline()", +"c554a600": "initTokenPorter(address,address)", +"c5566dac": "getNumberOfCourse()", +"c5575ef0": "checkTransferFrom(address,address,uint256)", +"c557b985": "icon()", +"c557d29c": "ByteLocker()", +"c557e552": "_getWager(address)", +"c558ae6b": "Airdrop(address[],uint256[])", +"c5590033": "setStatus(string,string)", +"c5592be2": "addContract(string,address,address)", +"c559743a": "included(address)", +"c559c395": "bitwordsCutOutof100()", +"c55a02a0": "SNT()", +"c55b6bb7": "setAdmin(address,address)", +"c55c1cb6": "queryN_withGasLimit(uint256,string,bytes,uint256)", +"c55c4115": "FEE_CHARGER_DENOMINATOR()", +"c55c4f47": "isCrowdsaleSuccessful()", +"c55d0f56": "getCurrentPrice(uint256)", +"c55d34d4": "airdropGW()", +"c55dae63": "baseToken()", +"c55dd86a": "isLegalPlayer(bytes32,address,address)", +"c55e0eaa": "bonusPeriodDurationInHours()", +"c55e4645": "LETOCoins()", +"c55ed894": "withdraw_to_owner()", +"c55ee28c": "nextSession()", +"c55f1f42": "timeLockSend(address,address,uint256,bytes)", +"c55f3b4c": "GetInventory(address,uint256)", +"c55f60dc": "checkAndUpdateLimit(uint256)", +"c55fb39f": "SAFE_PERIOD()", +"c5620ded": "LogBuy(address,uint256,uint256,uint256)", +"c56351cd": "createCrowdsale(address,uint32,uint256,address,uint8,address,address)", +"c5639ed2": "SUB(uint256,uint256)", +"c56551b6": "pos()", +"c56597ba": "_v2()", +"c565eba6": "isRoundTwoSalePeriod(uint256)", +"c566d43c": "registerPlayer(address,bytes32)", +"c5671148": "mul64()", +"c567cd26": "updateStudent(string,bytes32,string)", +"c567e43a": "show_me_the_money()", +"c567f304": "approveAddReserveData(uint256)", +"c5682244": "changeTickPrice(uint256)", +"c56893fb": "getLockerCount()", +"c5689e7d": "deWhiteListContract(address)", +"c56935e2": "showJackpotNextRd()", +"c5699ac2": "canRestoreUnsoldTokens()", +"c5699d68": "_compare(int256,bytes,int256)", +"c569bae0": "right93(uint256)", +"c569fb36": "setDepositPool(address)", +"c56a0ffe": "summDevelopers()", +"c56a3e88": "isManager()", +"c56af732": "CannabanC()", +"c56b2dc2": "upgradePony(uint256,uint256,bytes)", +"c56b4294": "_initialMint()", +"c56bbda4": "isTransferApprove(uint256)", +"c56bea64": "setBlacklistedUser(address)", +"c56c89a2": "ChendeWorld()", +"c56cf2b2": "getAllSaleAnimals()", +"c56d0d67": "tokensSoldWhitelist()", +"c56e3849": "Versioned(string)", +"c56e610e": "getEscrowBalance()", +"c56ecdfa": "_isOne(address)", +"c56ef049": "execBuyBack(uint256)", +"c56f1578": "UzairToken()", +"c56fc9c1": "PreSaleDistributed()", +"c570e952": "CustomPOAToken(string,string,address,address,uint256,uint256,uint256)", +"c5715483": "bonusMinContribution()", +"c571627b": "ChangeMainWallet(address)", +"c572652b": "distributeWithLockup(address,uint256,uint256,uint256,uint256)", +"c5729617": "get_value_by_hash(string)", +"c572ca10": "TokenProcurement(address,address,uint256,uint256)", +"c572dcc3": "getFreeMiner()", +"c572e9cb": "_decodeBuyData(bytes)", +"c57380a2": "getControllerAddress()", +"c573902d": "getInfoPanel()", +"c573e6bd": "distributeIfNeeded(address,uint256)", +"c57443fa": "ZRX_EXCHANGE_ADDR()", +"c574a53c": "addJurisdiction(bytes32[],bool[])", +"c574d156": "getGameBalance()", +"c575200d": "setPropertyBecomePublicEarnUntil(uint16,uint256,uint256)", +"c575c238": "sendToken(address)", +"c57679fc": "recipientMIT()", +"c5774a3f": "seedAmount()", +"c5787fa3": "picops_identity(address,uint256)", +"c578b2f4": "getTransformTarget_default()", +"c578f2c8": "SetCityName(address,bytes32)", +"c5793979": "sendCheck(address,uint256,bytes32)", +"c57949e2": "AllowanceLedger(address,address)", +"c57981b5": "FEE()", +"c57a050e": "fairandeasy()", +"c57a4a4d": "TOKEN_PUBLIC_SALE_CAP()", +"c57a8825": "updateRegistryAddress(address)", +"c57a99e5": "testFailRetractLatestRevisionEnforceRevisions()", +"c57c3bbd": "addLockProduct(uint32,uint32,uint32,bool)", +"c57c5f60": "initMultiowned(address[],uint256)", +"c57c7b62": "mktIssue(address,uint256)", +"c57d3fb7": "setReFundAddress(address)", +"c57d5fe9": "addToBalance(address,address,uint256)", +"c57dead7": "betsLost()", +"c57fbf90": "tokenRate(address)", +"c58068d8": "getIdFromStr(string)", +"c5809312": "setLLV_edit_28(string)", +"c58156e0": "removeAllocation(address)", +"c5820c45": "DFSDex()", +"c58343ef": "getRequest(uint256)", +"c5837713": "a_empresa(bytes5)", +"c583bb53": "RYNO()", +"c5854113": "MilestonesFactory(address)", +"c58580aa": "icoAddress1()", +"c585bb93": "registerAssetProxy(address)", +"c585de64": "Rate3()", +"c58684ab": "setPauseEmergence()", +"c5868754": "is_signed()", +"c587e3d6": "totalRised()", +"c587f93e": "softCapCountDownTimer()", +"c588415e": "phase4EndBlock()", +"c588953e": "enddate()", +"c588ba1b": "getLowestGameWithoutQuorum()", +"c588cabd": "firstBonusPercent()", +"c5893a8e": "OnPreSaleBuyerCompensated(address,uint256)", +"c589f1f3": "transferEthersToDao(uint256)", +"c58a3321": "setAccessControl(address,address,uint8,bool)", +"c58a34cc": "setTimeout(uint256)", +"c58a6ce8": "sendPayment(uint256,address)", +"c58aaae6": "selfDestructBeneficiary()", +"c58b54ef": "getAssetAttributes(uint256)", +"c58cc060": "firstBuyers()", +"c58ce220": "setDeveloper(string)", +"c58d0be0": "getCompetitionStatusOfRegistrants()", +"c58d96a5": "whiteListERC223(address)", +"c58f2f49": "hashTypes(uint8)", +"c58f520f": "sharingPool()", +"c5907a34": "Kanicoin()", +"c590c994": "unfreezeCount()", +"c5917695": "KevCoin()", +"c5919f24": "addNewMeme(string,string,string,string)", +"c591b3ca": "itemCanVote(address,uint256)", +"c591c8a3": "getAllJinglesOnSale()", +"c59255dc": "changeMilestone(uint8,uint256,uint256,uint256)", +"c592c3ba": "addAmountBoughtAsMember(address,uint256)", +"c5933658": "registerEmailAddress(address,string)", +"c59361b9": "getInsurance(address,uint256)", +"c593dfbf": "queryDataFromId(address,uint256)", +"c5944f30": "Token(address,uint256)", +"c5947cd6": "getReportingState()", +"c594a12d": "areadjacent(uint16,uint16)", +"c59513a4": "updateMyTimeMintBalance()", +"c5958bda": "removeFile(bytes)", +"c595fee6": "adminWithdrawEther()", +"c5960c29": "buyKeyByAddr(address)", +"c59671a7": "set_dni(uint256)", +"c5980b07": "getDRSCoinDividend(uint256)", +"c5981892": "buyTokensCrowdsale(address)", +"c59981cd": "edit(uint256,uint256,uint8,uint8,uint8,uint8,string)", +"c599b77f": "setUserGroup(address,address)", +"c599d58f": "MAX_NUM_PAYOUT_ATTEMPTS()", +"c59a9428": "transferTreasurership(address)", +"c59acae4": "lrcWithdrawn()", +"c59b2e20": "NEVA()", +"c59b5562": "buyICO()", +"c59c1144": "setDefaultKey(address,address,uint8,bytes32,bytes32)", +"c59d278e": "vehicleDatesByCity(bytes32)", +"c59d4847": "getStats()", +"c59d55ad": "releaseTransfer(bytes32,uint8,bytes32,bytes32)", +"c59d5633": "getPurchasePrice(uint256)", +"c59d6abe": "getAngelClaims(uint64)", +"c59e0b87": "setSecondWalletPercent(uint256)", +"c59e5729": "upAd(uint256)", +"c59ea269": "snowflakeBalance(string)", +"c59ee1dc": "raisedAmount()", +"c59f3a7c": "getConditionsState()", +"c59f6983": "editMaxItems(uint8)", +"c59f83cf": "_getNftContract(address)", +"c5a0a555": "setImageRegionId(uint256,uint256)", +"c5a0ca8f": "init(address[],uint256[],uint256,address)", +"c5a0d1c7": "percentageQuarter1()", +"c5a104d9": "ln_fixed3(uint256,uint256)", +"c5a1d7f0": "metadataHash()", +"c5a2d352": "publish(uint256,bytes32)", +"c5a369b4": "addAddressDescription(string)", +"c5a46ee6": "value(uint256)", +"c5a4eb35": "initialPricePaid(uint256)", +"c5a55152": "distributeRewards(address[])", +"c5a60ddb": "payout(bytes32,uint256,uint256)", +"c5a6732b": "_isChallengerAttackFirst(uint256,uint256)", +"c5a796ac": "set_address_Arina(address,address)", +"c5a83c2b": "countAssets()", +"c5a88559": "getWithdrawNum()", +"c5a8a2ab": "changeStatus(uint256,uint8)", +"c5a8d421": "RocketFuelToken()", +"c5a9833e": "trusteeVaultAddr()", +"c5a988c9": "extendPreSalesPeriodWith(uint256)", +"c5aa0f17": "setNewJackpot(uint256,uint256,address)", +"c5aad3be": "getStackPtr()", +"c5ab4602": "updateBalance(address,address,uint256,bool)", +"c5ac124d": "cashToEth()", +"c5ac8a4d": "leftSharePrice()", +"c5aca3b2": "NYXDecentralizedIdentificationRequest(string,string)", +"c5ace443": "priceFeedSource()", +"c5ad94a9": "addressSharesCount(address)", +"c5ae6e0e": "Kernal()", +"c5ae7570": "getSaleFinancialData()", +"c5af3808": "setJntBeneficiary(address)", +"c5af9000": "Convert()", +"c5afc0a5": "BonusAllocation(address,string,uint256)", +"c5afce8b": "ensureInAccountList(address)", +"c5b045eb": "secondRoundPercent()", +"c5b05616": "TokenAuction()", +"c5b15057": "updateSettlementStatus(bool)", +"c5b15caf": "CIBOS()", +"c5b1a53c": "deposit(bytes16[],uint64)", +"c5b1d9aa": "newRound()", +"c5b1e789": "Unset(string,address)", +"c5b2333c": "set_status_user(address,address,bool,bool)", +"c5b2429d": "periodPreITO_tokenPriceUSD()", +"c5b35556": "bixToken()", +"c5b3a429": "PresaleStartTimeChanged(uint256)", +"c5b417ec": "buyPlot(uint256,uint256)", +"c5b43c39": "CypherX()", +"c5b53a34": "_setAuthorizedPower(uint256)", +"c5b748c0": "redemptionPrice()", +"c5b7589c": "startMiniGame()", +"c5b7be81": "TruckingCoin()", +"c5b7c51b": "participateEvent(address)", +"c5b7f5bf": "presale_eth_fund()", +"c5b85eb8": "UBSI()", +"c5b8d7a1": "cyclesStartFrom()", +"c5b8f772": "isOwnerOf(address,uint256)", +"c5b930f9": "singletonHash(bytes32)", +"c5b9cdf8": "SMARTCCCoin()", +"c5bac421": "pruneInvestors(uint256,uint256)", +"c5bafbc4": "eosDACToken()", +"c5bb8af4": "IMDEXsetInactivityReleasePeriod(uint256)", +"c5bcc4f1": "parentSnapShotBlock()", +"c5bd8456": "TakeOffWorldWide()", +"c5bd9089": "redeemCoupons(uint256)", +"c5bdbd70": "multDenominator()", +"c5be7a77": "_shareDevCut(uint256)", +"c5bef690": "_escrowIndex()", +"c5bef74e": "getHash1(address,uint256,address,uint256,uint256,uint256)", +"c5bf2249": "wallet(bytes)", +"c5bf339c": "getLastNonPublished()", +"c5bfa9d9": "getUserBalanceOnEther(address)", +"c5bfd5dd": "TokenDrop()", +"c5bfef39": "initCountry(uint256,uint256)", +"c5c00ac6": "needVerified()", +"c5c01169": "checkFrozenAccounts(address)", +"c5c03af3": "_mode()", +"c5c09b20": "TestRecover(uint256,uint256,uint8,bytes32,bytes32)", +"c5c0b859": "pauseMaster()", +"c5c0db08": "whom()", +"c5c187f5": "LogApproval(address,address,uint256)", +"c5c2f6e0": "getTopPlayerScores(uint256)", +"c5c4412d": "CleanBankerRound(uint8)", +"c5c4744c": "totalRaised()", +"c5c5135c": "crystalPrice()", +"c5c56740": "ROBIET()", +"c5c593e1": "openGameResultAndNewGame(uint256,uint256,uint256,string,bytes32)", +"c5c680f3": "testUser()", +"c5c6b12a": "isInvestorInWhitelist(address)", +"c5c715e4": "approveBatch(address[],uint256[])", +"c5c72bf4": "sayAnything(string)", +"c5c7681f": "Main(address)", +"c5c78258": "YoloTokenPresaleRound2(uint256,uint256,uint256,uint256,address,address)", +"c5c80103": "listFaceToFaceAttendants()", +"c5c8015b": "isNotContract(address)", +"c5c872ae": "transferFromRobot(address,address,uint256)", +"c5c87db4": "reinvestReturns(uint256,address)", +"c5c8a08a": "getExpirationTimeFromAddress(address)", +"c5c925e2": "StoreRegistry()", +"c5c93bdc": "Birth(uint256,uint256,uint256)", +"c5c95c55": "QuantityUnit()", +"c5c9e3be": "setPreparationPeriodTrainingFeeMultiplier(uint256)", +"c5c9f617": "walletE()", +"c5cac386": "Questions()", +"c5cc52fc": "Indemnisation_5()", +"c5ccebd3": "smallerPriceComparator(uint256,uint256)", +"c5cd3bec": "getRevisionTimestamp(bytes20,uint256)", +"c5cd88db": "missingFundsToEndAuction()", +"c5ce3911": "productId()", +"c5cf8c7e": "getCurrentHighscore()", +"c5d03fc0": "OftenChainToken()", +"c5d0c68b": "addMaster(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)", +"c5d14955": "phase_2_token_price()", +"c5d22e94": "MAX_TOTAL_AMOUNT_TO_RECEIVE_ETH()", +"c5d2577c": "newTransfer(bool,address,address,uint256,uint256,uint256)", +"c5d290d0": "RUNtoken(uint256,string,string)", +"c5d39a33": "isEating(address)", +"c5d456d6": "moves(address,uint256,uint256)", +"c5d46dfc": "computeScore(address)", +"c5d51586": "loser(address)", +"c5d5997c": "changeSubUser(address,address)", +"c5d61ad0": "newGame(uint256,bool,uint256)", +"c5d65d1a": "approveSponsorableJob(uint256)", +"c5d6a7f1": "GreatcoinERC20Token()", +"c5d6c75d": "PunchClock()", +"c5d7802e": "z()", +"c5d7dd0a": "Blockcash(string,string,uint256,uint256)", +"c5d81804": "mintSBIToken(address,uint256)", +"c5d83794": "setDesign(uint256,string)", +"c5d8adcb": "EventProduct(uint32,string,uint32,uint32,uint32,uint32,uint32,uint256,uint256,uint256)", +"c5d953a3": "setCurrentMarketRate(uint256)", +"c5d9ada3": "IANToken()", +"c5d9c762": "set_pre_kyc_iconiq_bonus_denominator(address,uint256)", +"c5dacf68": "getOwnerEth()", +"c5db22da": "lastBlock(uint64)", +"c5dba811": "doRandom(address[],address,uint256)", +"c5dc6b55": "getAccountBonus(address,address)", +"c5dce83d": "changeAPTController(address)", +"c5ddb614": "BlockFundIncubatorToken()", +"c5ddba02": "startDate1()", +"c5decd37": "ico3Raise()", +"c5df27ef": "ETHcap()", +"c5e08ba9": "get_oo_of(address)", +"c5e12813": "burnAllInvestorTokens(address)", +"c5e290cd": "_editInfoImpl(string)", +"c5e2a7db": "updateMetadata(address)", +"c5e2f418": "disableChanges()", +"c5e34e77": "Total_Products(uint256)", +"c5e35f42": "Gentingchain(uint256,string,string)", +"c5e36b7e": "lockMana(uint256)", +"c5e3adf5": "nFund()", +"c5e3b1a6": "reclaimOwnership(string,string,bytes32)", +"c5e3e3f3": "s21(bytes1)", +"c5e412e5": "createSaleContract(address,uint256,uint256,bool)", +"c5e42338": "getIncreaseTotalStakeCalled()", +"c5e4594f": "multiline(uint256,uint256,uint256,bytes32)", +"c5e634e4": "transferAuditTokens(address,uint256)", +"c5e7b4fe": "setupPreIco(uint256,uint256)", +"c5e8b864": "hasEnoughBST(address,address,address)", +"c5e951a4": "agentOrdersOf(uint256,uint256)", +"c5e974ed": "transferToken(bytes32,address,address,uint256)", +"c5e98a4c": "updateIncentiveTokenLimit(uint256)", +"c5e991a8": "ThirdEtherLimit()", +"c5ea01c9": "testF2(uint256)", +"c5ea0b4a": "buySquare(uint8,uint256,address)", +"c5ea3c65": "maxId()", +"c5ea6256": "enableSecureMode()", +"c5ea8e1d": "RefUpdate(string,uint256,uint256,uint256)", +"c5eab684": "calculateDividends(uint256,uint256)", +"c5eaccfd": "whitelistAddrAndBuyTokens(address,uint256)", +"c5ebeaec": "borrow(uint256)", +"c5ec05fd": "scheduleSale(uint256,uint256)", +"c5ec365f": "guideInvestmentAttractedShareToPay()", +"c5ecfc61": "getEscrowDeposit(string)", +"c5ed7162": "firstPresaleStart()", +"c5ed8c99": "canCollect(uint256)", +"c5edd450": "payFor(uint256)", +"c5ee5688": "setCompte_25(string)", +"c5ef4c3e": "set(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"c5efaa11": "calculateValue(int256,uint64)", +"c5efaae8": "buyCredits(address,uint256)", +"c5efea68": "getAdminStatus(address)", +"c5f0d3d6": "geneKind()", +"c5f2892f": "get_deposit_root()", +"c5f310c0": "register(bytes12)", +"c5f39cd7": "rateSecondTier()", +"c5f40edd": "discountedDealAmount()", +"c5f4b3da": "RewardPoolAmount()", +"c5f4c98b": "changeDiscountStep(uint256)", +"c5f5ce21": "advisorTokenWallet()", +"c5f60620": "expectedTokens(uint256,bool)", +"c5f70682": "setByuoutCount(uint256)", +"c5f713cf": "push(uint256,bool)", +"c5f7ed63": "NeckCoin()", +"c5f913fe": "callExitFromUnknownContract(address)", +"c5f956af": "treasuryAddress()", +"c5f98578": "RequestFromContract()", +"c5f98a3f": "mega()", +"c5fa1924": "MMS()", +"c5fbe723": "result_payto()", +"c5fc43cb": "Newera()", +"c5fc98c9": "TOKEN_THIRD_DISCOUNT_MULTIPLIER()", +"c5feaf60": "PRE_SALE_START_1()", +"c5fee757": "executeOrder2(uint256)", +"c5ff2069": "MooTokenSale()", +"c5ff2222": "playNo()", +"c600e1dc": "getProfit(address)", +"c6011633": "setRateFees(uint256,uint256)", +"c6017a25": "playerRoll(uint256,address)", +"c601b7f8": "icoPhase1Start()", +"c60211ee": "MineFinished()", +"c6028cf3": "nextSaleStage()", +"c6029e7b": "sendBPESOTokenToMultiAddr(address[],uint256[])", +"c603a4e3": "getTotalHP(uint256,uint256,uint256,int256)", +"c603ae14": "jockeyFS(uint256)", +"c603bd7d": "_executeOrder(address,uint256,uint256,bytes,int256)", +"c603c97b": "NewPiedPiperCoin(string,string,uint8,uint256)", +"c6041333": "calculateKnowledgeBuySimple(uint256)", +"c6046f77": "mintAndTransfer(address,uint256,bytes)", +"c6049946": "saleExchangeRate1()", +"c604bec9": "hasExtension(address)", +"c604e967": "delFilter(uint256)", +"c605f76c": "helloWorld()", +"c6062bc3": "sellerRefund(uint256,address)", +"c60778cf": "RefundRequest(uint256,address,uint256)", +"c6080b3f": "KiDhon()", +"c60880e0": "Aster()", +"c609ab26": "setImageCurrentRegionId(uint256,uint256)", +"c60aa10d": "newForgeCon(address)", +"c60b099f": "removeRate(uint256,uint256)", +"c60b7784": "queryEOSCrowdsaleKey(address,address)", +"c60bdc7f": "setUsersContract(address)", +"c60c13a3": "blockAccountFunds(address,uint256)", +"c60c3aca": "callFor(address,uint256,uint256,bytes)", +"c60cae29": "changePeriodTime(uint256,uint256)", +"c60ccb0e": "takerBuyAsset()", +"c60ce271": "findNextMinute(uint256,bytes)", +"c60ced1b": "LetsGoChain(string,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"c60f56b2": "totalAcorns()", +"c60f6462": "resetRick()", +"c610bb07": "tranfer(address,uint256)", +"c6113205": "getTokenByIndex(bytes32,string,uint256)", +"c6114aaf": "updateIPOPrice(uint256)", +"c6117d37": "xactionFeeShare()", +"c611ded7": "reserveTokensAddress()", +"c6129a5a": "GetVersion()", +"c612cc4e": "compareDatesWithoutTime(uint256,uint256)", +"c613089f": "getBetsEvenAndODD(uint256)", +"c6132eb3": "timeBetweenRewards()", +"c6137977": "eliminateSmartContractByteCode()", +"c614b522": "getAllInvestmentPackageIds()", +"c614da67": "free(bytes12)", +"c6150296": "checkBalances(address,address)", +"c615365f": "EthBetter()", +"c6159a35": "icoTransfer(address,uint256)", +"c6169e1f": "maxTournamentContenders()", +"c616f412": "totalQuantity()", +"c6178a65": "soldTokensSale()", +"c617fe6e": "_setAllowance(address,address,uint256)", +"c6180d27": "silverBoxPrice()", +"c618210a": "crowdsalepricing(address,uint256,uint256)", +"c618a1e4": "volume()", +"c618d15f": "ConvertNumbers(bytes5)", +"c6195d03": "ONE_DECIMAL_QUANTUM_ABC_TOKEN_PRICE()", +"c6195d36": "setConfig(address,uint256)", +"c6199b6d": "getCustomerServiceAddress()", +"c619bbd3": "GetPower()", +"c61ab738": "getSupplyLimit(uint32)", +"c61b06ae": "collectibleIndexToOwner(uint256)", +"c61b8a44": "rewardGenerationComplete()", +"c61c3c4b": "buyPackWithETH(bool)", +"c61de162": "_withdrawPromoter(address,uint256)", +"c61e42ae": "mint(uint256,int256)", +"c61e5be6": "cardSetsInCirculation(uint256)", +"c61ea7a3": "CrowdfundableToken(uint256,string,string,uint8)", +"c61efde6": "MsgEngine(uint8)", +"c61f1103": "foundersTimelock2()", +"c61f13a1": "setWitdrawGas(uint256)", +"c61f3a2c": "drpToken()", +"c61fb3f1": "Moon()", +"c62072d2": "nfo_transaction(uint256,uint256,address,address,bytes32)", +"c620b5fe": "isDaySecond()", +"c620ecc7": "KYCTeam()", +"c62122eb": "AmberToken()", +"c621f96e": "deleteDIDHolder(address)", +"c6220fbd": "dividendDistributionStartTime()", +"c6221878": "projectCompleted()", +"c62239da": "printAllCompanies()", +"c6224757": "issueTreasury(address,address,address)", +"c622afb0": "getInsertPointForNumTokens(address,uint256)", +"c6235f8d": "delMarketMaker(address,address)", +"c623674f": "ipfsHash()", +"c6236a5c": "scheduleCall(bytes,uint256,uint256,uint8,uint256)", +"c6240303": "SetAuxOwner(address)", +"c6253f14": "XXXXXXXX08(uint256)", +"c625bd27": "transferFromBRXPay(address,address,uint256)", +"c625e9b1": "buyTokens(uint256,address)", +"c62631a5": "LicensingToken()", +"c62662f2": "setTotalCapitalization(uint256)", +"c6266693": "setCoreContract(address)", +"c626c52e": "isGame(address)", +"c6279ab1": "voteClose()", +"c627d0f8": "setCampaign(uint256,uint256)", +"c628ddc3": "TAIL()", +"c629061d": "external_oraclize_randomDS_proofVerify(bytes,bytes32,bytes,string)", +"c6291223": "fundTransferWithin(address,address,uint256)", +"c629cdf4": "collectPayout()", +"c629e770": "donorList()", +"c62aa67d": "getNodeId(bytes32)", +"c62c5fda": "setIcoFirstWeekRate(uint256)", +"c62cfa1d": "getMyNote(uint64)", +"c62d7407": "frozenOf()", +"c62dcd5b": "getSentTransactions()", +"c62dee76": "HumanBlockToken()", +"c62eac5c": "create(address,uint256,bytes32,int256)", +"c62fae5d": "getValueInfo(address)", +"c63012a1": "setHashPiture(uint256,bytes32)", +"c630f92b": "canEnterPool()", +"c630f96b": "ZToken(uint256,string,uint8,string)", +"c6314bf9": "companyAllocation()", +"c6317f37": "Token_Saled()", +"c631b292": "closeVoting()", +"c631e758": "clearRole(address)", +"c6321979": "buyTokenPack(uint256)", +"c632e654": "_takeRdFee(uint256)", +"c633084f": "sendGreeting(address,string)", +"c6335b26": "startInvasion(uint256,uint256[])", +"c633eb24": "generateReserve()", +"c63445f3": "setFeePool(uint256)", +"c634d032": "mintToken(uint256)", +"c634fd83": "adminSetDefaultFee(uint256,uint256)", +"c63545e9": "developer_edit_text_fees(string)", +"c6354bc0": "addCountries()", +"c6357b54": "impl_forging(address,uint256,uint256)", +"c635a9f2": "MinimumDeposit()", +"c635bf38": "keyGt(bytes32,bytes32)", +"c635d65e": "StandardToken(address,string,string,uint8,uint256,bool)", +"c6361267": "mintOneWeek()", +"c6366ce9": "TOTAL_ICO_CAP()", +"c636813e": "disapproveSingleUser(address)", +"c63755e1": "transferPresale(address,uint256)", +"c6381649": "getChats()", +"c6384071": "voteCount()", +"c638529f": "SetProvider()", +"c6388e6f": "_AtlantisToken()", +"c6393e62": "migrationSetBoard(bytes32,bytes32,string,uint8,address)", +"c63998ed": "updateUnitsOneEthCanBuy(uint256)", +"c6399fc7": "_setItemNotForSale(uint256)", +"c639e8c5": "registerVerifier(address)", +"c63a4e05": "getCartLength()", +"c63c1a27": "calcFight(uint64,uint64,uint256,uint256)", +"c63ccb3b": "Discount()", +"c63d04df": "BonusReferred(address,address,uint256,uint256)", +"c63d99db": "auctionName()", +"c63e2ebc": "setRoundStart(uint256,uint256)", +"c63e529b": "buy(string,string)", +"c63ebcbb": "claimedUnits()", +"c63f49ab": "LuckyDice()", +"c63fdcc7": "claimPayment(uint256)", +"c63ff8dd": "claim(bytes)", +"c64012a6": "CoinSent(uint256,address,string)", +"c640487d": "_changeLogicContractAddress(address)", +"c640752d": "update(address,address)", +"c641aaca": "addPrivateSaleEndDate(uint256)", +"c6427474": "submitTransaction(address,uint256,bytes)", +"c642b103": "treasuryTimelockAddress()", +"c642e7bf": "getRoundState(uint256)", +"c642f094": "MOT()", +"c6430e29": "get_firstbytes(address)", +"c6434660": "isTakePermitted(uint256,uint256,uint256,address,address,uint256,uint256,address)", +"c643872e": "paymentTo(uint256,bytes,address)", +"c6440b3e": "sub(uint32,uint32)", +"c64572b8": "minimalPriceUSD()", +"c645ecc4": "handleReturnBytes32()", +"c6461625": "setIV_R4(uint256)", +"c64743d5": "BlockMined()", +"c6476fe9": "isMinimumInEther()", +"c647b20e": "setTaxes(uint256,uint256)", +"c647c3d9": "t_1st_StageEnd()", +"c648843a": "current_week()", +"c6490835": "total_tokens()", +"c64a2358": "_targetBlock()", +"c64a3239": "updateExec(address)", +"c64aace0": "airdropConjured()", +"c64bf22d": "SummerGreen()", +"c64bf32f": "distribute_token()", +"c64d73c6": "JCoin()", +"c64e03a2": "FAPcoin()", +"c64e08a0": "CampaignPausd(uint256)", +"c64e8bc0": "executeN(uint256)", +"c64f28c8": "createImage(address,uint256,uint16,uint16,uint16,uint16)", +"c64f9490": "updateAccessoryLock(uint64,bool)", +"c64fa2e4": "totalDividendShares()", +"c64fbbce": "_calcRemainingRoundTime()", +"c65025f8": "isSmartSharingEnded(bytes32)", +"c6502da8": "basePayment()", +"c6512a33": "CNC(uint256,string,uint8,string)", +"c6544e5c": "icoSpecConfirmed()", +"c6548076": "isUserBlacklisted(address,address)", +"c65538ec": "afterSTEDistributed()", +"c655d7aa": "recoverAddress(bytes32,bytes)", +"c655fd2c": "setSlowDump(uint256)", +"c6560856": "currentJackpotInWei()", +"c6567835": "changeVaultWallet(address)", +"c6570e67": "contractorTransfer_Scoupon(address,uint256)", +"c65799a4": "ReturnRequested(address,address)", +"c6580352": "HeroTrained(uint256,address,uint256,uint256,uint256,uint256,uint256,bool,uint256)", +"c65808b9": "getSpell(uint32)", +"c6585a27": "updateNotaireAddress(address)", +"c659ce2b": "setBountyAddress(address)", +"c659d443": "url(bytes32)", +"c659dceb": "is_verified()", +"c65a0fdf": "updatePixelIndex(uint16,uint16)", +"c65a4068": "_multisig(bytes32,uint256)", +"c65ac542": "saleUnpause()", +"c65ad85c": "isReadyToStart(bytes32)", +"c65b125f": "setContestContractAddress(address,address)", +"c65b490e": "getBabyMakinPrice(uint256)", +"c65c6eae": "getReadableContribution()", +"c65c9567": "gameResult(uint256,uint256)", +"c65c9d63": "getNextStakedNode(address)", +"c65ccc07": "setLtdParams(uint256,uint256,uint256)", +"c65cec32": "refundTokenToCustomer(address,address,uint256,address)", +"c65d15b9": "reference()", +"c65daea0": "allocated6Months()", +"c65fb380": "isSet()", +"c6601270": "getMyIceDragon()", +"c660477b": "GetData(uint256)", +"c6610dec": "owner_share()", +"c661deb4": "issueHardcapToken(address,address,uint256)", +"c661ee4d": "proofAddr()", +"c661fed3": "isAdvisor(address)", +"c6620580": "presale_tokens()", +"c6634ef5": "certify(uint256)", +"c6638df9": "LogTemplateCreated(address,address,string)", +"c66485b2": "setDefaultResolver(address)", +"c665242b": "storeMsg(string)", +"c6653041": "ParticipantRegistry()", +"c666c798": "setExtendedTokenCap(uint256)", +"c6677519": "executeSettingsChange(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"c667ab20": "setFundsRegistry(address)", +"c6685617": "record(address,uint256)", +"c6688445": "stringToSignExample()", +"c668dfd7": "doAirdrop(address,address[],uint256)", +"c668ee3d": "operatingFundAddress()", +"c668f71b": "exchFee()", +"c6699ba8": "addPayTable(uint16,uint16,uint16,uint16,uint16,uint16,uint16,uint16,uint16)", +"c669c955": "incentivesIn(address[],uint256[])", +"c66a431d": "addContract(bytes32,bytes32,bytes32,bytes32,address,bytes32)", +"c66aaf0f": "sucessor()", +"c66bd6aa": "updateEthICOThresholds(uint256,uint256,uint256,uint256,uint256)", +"c66c2536": "doTransferOut(address,address,uint256)", +"c66c67e9": "setReservedTokensPercent(uint256)", +"c66e4095": "icoContract()", +"c66e9260": "ESCCrowdsale()", +"c66ed8f7": "lockGenesisImports()", +"c6702187": "CLAIM_SIGNER_KEY()", +"c6705a00": "signupUsersManually(address)", +"c6711049": "withdrawTokenManually(uint256)", +"c67117f5": "InvEnterpriseAddr()", +"c67146a5": "check_bet(uint256,address,uint8)", +"c6715f81": "left44(uint256)", +"c6716590": "DovieBarMitzvah()", +"c67410fb": "getOwnersLoan(address)", +"c67415f3": "mineCrystals(uint256)", +"c674e0c9": "setSmartContractStatus(uint8)", +"c67685a9": "turnOffCanUpdateDeveloperMiningPower()", +"c67747a5": "bitGuildAddress()", +"c6776239": "BitPropertyToken()", +"c6777e63": "changeUrls(string,string)", +"c677b207": "addElectedMember(address,string)", +"c6786e5a": "destroy(address[])", +"c6788bdd": "claims(address)", +"c678ca19": "comfirmIsses(uint256)", +"c678e618": "sendDividend()", +"c679580e": "isModuleHandler(address)", +"c6795b45": "bonusPatterns(uint256)", +"c67979a5": "PakistanRupee()", +"c6798033": "dedicatedProxyAddress()", +"c67acceb": "firstStageEndsAt()", +"c67af5cc": "logMarketParticipantsDisavowed(address)", +"c67b099f": "createWildcard(string,uint256,uint16)", +"c67b599a": "presaleMinPurchase()", +"c67bbc24": "getVolume()", +"c67c6eab": "stopCrowdSale()", +"c67ce6f5": "FlightDelayNewPolicy(address)", +"c67d376d": "getClosedCandidates()", +"c67e43c1": "setExpectedEnd(uint256)", +"c67f3ba3": "GanLiXia()", +"c67f3e1f": "totalDistributedinWei()", +"c67f7df5": "getDepositsCount(address)", +"c6803622": "wasCalled()", +"c68098d9": "personalCapEndAt()", +"c6814aa2": "copyPaper(address,uint256)", +"c681d68d": "badgeBalanceOf(address)", +"c68218d1": "setStrF1F2F3(string,string,string)", +"c6822356": "_createAss(string,uint32,string,uint256,uint256,uint256)", +"c682a10d": "createRoot(string,string)", +"c682d0bb": "authorized_updateSaleInfo(uint256,uint256)", +"c68309a7": "buyICloudSecsAgainstEther()", +"c683630d": "isWhitelist(address)", +"c6837a87": "getDepositeTime(address,uint256)", +"c683d8e4": "enableSale()", +"c6842868": "registerBroker(address)", +"c6851889": "Sale(address,uint256)", +"c68581ea": "addFile(uint256,string,uint256,string,string)", +"c686554e": "getInfo(address,address)", +"c687857c": "updateAsset(uint256,string,string,string,uint256)", +"c687ce9d": "setInitialOwner(address,uint256,uint256)", +"c6888fa1": "multiply(uint256)", +"c68890c7": "AcceptGuardianOffer(uint256)", +"c6891018": "take(uint256,bytes32[])", +"c68a3c1e": "setShares()", +"c68a536d": "GetLuckyRewards()", +"c68ad0a8": "Hold(address,address,uint256,uint8)", +"c68ae617": "authenticate(address,uint256,uint256,uint256)", +"c68b82c9": "ethLastUpdate()", +"c68bf3ea": "eDeposit()", +"c68cd47e": "COIN_SUPPLY_ICO_TIER_1()", +"c68cee04": "addArtistToRegistry(bytes32,address,uint256,uint256)", +"c68d81e0": "a(address)", +"c68deb7e": "saleEndTimestamp()", +"c68e35b0": "verifyHash(bytes32,uint8,bytes32,bytes32)", +"c68e52d9": "setTimeStamp(string,uint256)", +"c68ee9cd": "search(uint256,uint256)", +"c68eebe3": "getCurrentTokenPriceInCents()", +"c68f2ada": "getDoc(string,string)", +"c68f7dfc": "test_hasClaimableShares_zeroClaimableStake()", +"c68fd307": "minimumContributionPresalePhase1()", +"c68fe0c1": "WeClosedInto()", +"c69034ab": "test_21_assertGasUsage50Boards()", +"c690c9a5": "Apollo()", +"c6912a39": "confirmRedbullQuest(address)", +"c692c049": "pushData()", +"c692d9de": "LogNeumarksIssued(address,uint256,uint256)", +"c692f4cf": "renounceAgent()", +"c69493a0": "subSale()", +"c69500fd": "rewardPay(address,uint256)", +"c695ff11": "randomAPI_url()", +"c6960d4c": "winnerid()", +"c6967c17": "DeviseToken(uint256)", +"c6969604": "emitBoardCreated(uint256,bytes32,bytes32,address,uint256,uint256,uint256,bool)", +"c69768dd": "createInkeTrade(bool,uint256,uint256)", +"c6979c0a": "WhitelistContract()", +"c697cbec": "_startNextRound()", +"c6998dc2": "updatePartner1_vows(string)", +"c69a00be": "setPeggedToken(address,address,address,uint256)", +"c69a8e13": "erc20BalanceForAddress(address)", +"c69b3936": "getNumSigs(bytes32)", +"c69b5df2": "prev_hash()", +"c69b5dfb": "verifyInvestors(address[])", +"c69b761f": "admin_set_deposit(address)", +"c69c7069": "mintPaper(string,string)", +"c69cd09d": "breedingFee()", +"c69e06db": "transactionsActive()", +"c69ed5f2": "executeTransaction(bytes32)", +"c69f4481": "setBlacklist(uint32,bool)", +"c69f8623": "convertSignalToMinimal(uint256)", +"c69fa8a9": "setAuthorizerAddress(address)", +"c69fbf48": "bountyProgram()", +"c6a00369": "LRCFoundationIceboxContract(address,address)", +"c6a05c06": "payOut(uint8,uint256)", +"c6a09d95": "grantAccess(address,address)", +"c6a0b13f": "cancelOnSaleCrab(uint256)", +"c6a0eb24": "test_threeInvalidEqBytes32Message()", +"c6a118d4": "impl_transferMS(address,address,uint256)", +"c6a17d2b": "pow10(uint256,uint8)", +"c6a22681": "getParticipantIndex(uint64,address)", +"c6a2573d": "oneTokenInEurWei()", +"c6a2afa7": "TokenECCAC(uint256,string,uint8,string)", +"c6a41bd7": "updateDetails()", +"c6a470e2": "getDisputeState(uint256)", +"c6a496bf": "Artwork(bytes32,uint256,string,string,string,uint256,address)", +"c6a4d345": "setMaxEscrow(uint256)", +"c6a4f4af": "getCurrentPotInfo()", +"c6a52959": "gba()", +"c6a5d5da": "updateBlocksPerDay(uint256)", +"c6a69931": "verifyCommit(address,uint40,uint256,uint8,bytes32,bytes32)", +"c6a71577": "WEKUToken(address)", +"c6a725d8": "confirmTransaction(uint256,bool)", +"c6a7d3af": "setTokenExcange(address,uint256)", +"c6a81857": "existsCountsById(uint256)", +"c6a898c5": "u()", +"c6a97c60": "SolusToken()", +"c6a98543": "ICONIC_NIC(uint256,string,string)", +"c6ab4514": "sendRobust(address,uint256,uint256)", +"c6ab5429": "KotET2()", +"c6ab5cdc": "closeBuy()", +"c6ab5d90": "withdraw(uint8)", +"c6ab848a": "referralInstance()", +"c6abc298": "getBetAt(address,uint256)", +"c6ac53fd": "submitTransaction(address,uint256,bool,bytes)", +"c6ad1191": "MyOwnCoin()", +"c6ad5d7c": "expireBid(address)", +"c6ae3b57": "dEthereumlotteryNet(address,address)", +"c6ae67ad": "fundcruToken()", +"c6af3166": "checkDouble(address)", +"c6af43f9": "updateThresholdNewAuction(uint256)", +"c6af477c": "get(bytes32,string)", +"c6afd98a": "requestConversion(uint256)", +"c6b0263e": "setPublicCapability(address,bytes4,bool)", +"c6b0a1fa": "checkPricePair(uint256,uint256)", +"c6b0de7e": "removeFromWhiteList(address,address)", +"c6b0ffd0": "is_success()", +"c6b20dc2": "Invacio()", +"c6b2a5dd": "updateCurrentSupply()", +"c6b3a7cf": "wplus(uint256,uint256)", +"c6b3ad7b": "setTWhitelist(address[],uint256[])", +"c6b4ad80": "ctu_owner()", +"c6b511a1": "EshaCoin()", +"c6b547e6": "getDocumentName(uint256)", +"c6b59e9e": "changeParameters(uint256,uint8,uint256)", +"c6b6005b": "TMSYToken(address,address,address,address,address)", +"c6b6b1e8": "ICOReserveSupply()", +"c6b6bc3c": "burnPurchase(uint256)", +"c6b85d2b": "AtomicX()", +"c6bbb6ef": "sendTokensTo7(address,address,address,address,address,address,address,uint256)", +"c6bc8dee": "testInitial2of3()", +"c6bcd5f7": "INTEGROToken()", +"c6bcefe5": "otherPoolTotal()", +"c6bd541f": "supportTeam(uint256,uint256,uint256)", +"c6bd5a13": "dividendsPaidPerShare(address)", +"c6bd62f5": "get_CountAllHolderForProfit()", +"c6bd9187": "closeEvent(bytes32)", +"c6bec93a": "startLottery(uint256)", +"c6befedf": "createPoll(bytes32)", +"c6bf03dd": "changeReleaseAccount(address,address)", +"c6bf7489": "sendLudumToMany(address[],uint256[])", +"c6c09252": "_generateCode()", +"c6c18e31": "PCToken()", +"c6c1e248": "ProductFactory()", +"c6c20a75": "getTotalCardValue()", +"c6c25d04": "artUrlList()", +"c6c27c71": "_slrByrLmtChk(address,uint256,uint256,address)", +"c6c2966d": "setFundingEnv(uint256,uint256,uint256)", +"c6c2ea17": "fib(uint256)", +"c6c332f2": "getUserEthVolumeSaldo(address,address)", +"c6c39bda": "unitsOneEthCanBuyafter()", +"c6c3bbe6": "mint(address,address,uint256)", +"c6c3f3f9": "setKyberProxy(address)", +"c6c4676c": "currentResult()", +"c6c4bf44": "issueFor(bytes32,address)", +"c6c55773": "Topplay()", +"c6c599c1": "changeApprover(address)", +"c6c5de53": "testFailMixItemStoreNotRegistered()", +"c6c65136": "spiderReq()", +"c6c68eb7": "getAyantDroitEconomique_Compte_2()", +"c6c6b3ed": "Sale(uint256,uint256,address)", +"c6c7d143": "cancelRedemptionRequest(uint256)", +"c6c7f5aa": "impl_amountOfOrderQueue()", +"c6c839f0": "increaseFreezeValue(address,uint256)", +"c6c85ca5": "updateTokenRate(uint256)", +"c6c8823c": "getActionPrice(string)", +"c6c8cdc7": "LogFundTransfer(address,uint256,bool)", +"c6c99744": "t01_setKey(bytes32)", +"c6caa959": "sellRock(uint256,uint256)", +"c6cb7a96": "orderMatchTest(uint256,uint256,int256,uint256,uint256,address,address,uint256,int256)", +"c6cb7ab8": "getBytesValues(bytes32)", +"c6cbc52a": "revokeCertificate(bytes32)", +"c6cbd5f0": "abandonedIcoBalances(address)", +"c6cc68b9": "BuyStockRocket(uint16,address)", +"c6cce2e7": "len(address)", +"c6cd15aa": "frozenVaults()", +"c6cd712d": "delegatedTransferAndNotify(address,address,uint256,uint256,uint256,bytes32,bytes,uint256)", +"c6cdbe5e": "categories(uint256)", +"c6cdc6f6": "fastICO(uint256)", +"c6cdf77e": "upgradeWeth(address)", +"c6ce2664": "setBancorRegistry(address)", +"c6ce81f0": "manualSendTokens(address,address,uint256)", +"c6ceafef": "setFeedAddress(address)", +"c6ceb50b": "Decimals()", +"c6cebebd": "get_info(uint256)", +"c6ced32b": "getWorkersCount()", +"c6cf1c7f": "generateRandomPerformance()", +"c6cf452b": "testInitialA()", +"c6cf4dd9": "upgradeOnePointZeroBalances()", +"c6cf54de": "BIC(uint256,string,uint8,string)", +"c6d04634": "BasicCrowdsale(address,address)", +"c6d0be63": "emergencyCease()", +"c6d0ffda": "failedTemperaturesLength()", +"c6d1d23d": "totalPledgedFeesAt(uint256)", +"c6d2cb6a": "getLavaTypedDataHash(address,address,address,uint256,uint256,uint256,uint256)", +"c6d32838": "deathData_f3()", +"c6d3ab9d": "changeTokenSymbol(string)", +"c6d417de": "NewName(address,string)", +"c6d44ecc": "_getTokenCountToBuyFromSeller(uint256)", +"c6d456ec": "Winning_Entry()", +"c6d48e0d": "getVersionsCount()", +"c6d69a30": "setTaxRate(uint256)", +"c6d761d4": "cancelEscape(uint32)", +"c6d779e6": "getAmountOrdersForDay(uint256)", +"c6d784cc": "Statustelega(address)", +"c6d81547": "DecisionTokenSale(uint256,address)", +"c6d8a203": "setConversionRateAddress(address)", +"c6d8be5a": "setPricingStrategy()", +"c6d8f0c4": "getLocks(uint256)", +"c6d90e70": "AcceptsDailyRoi(address)", +"c6d9112a": "MAX_DAILY_TOKEN_COSIGN_SPEND()", +"c6d95512": "ExchangeTokenPushed(address,uint256)", +"c6dad082": "make()", +"c6daeeaa": "TIME_TO_HATCH_1SNAIL()", +"c6dbdf61": "primary()", +"c6dc3640": "AirDropPayBitsR2(address[])", +"c6dc437b": "bids_ignored_count()", +"c6dca1d2": "proposeAsset(string,uint256,uint256)", +"c6dd5098": "DateCoinCrowdsale(uint256,uint256,uint256,address,address,address,address)", +"c6dd5db5": "validateOrder(address,uint256,address,address,uint256,address,uint256,uint256)", +"c6dd8018": "Cygnal()", +"c6ddcfe8": "publicSellToken()", +"c6ddd889": "ForeignBridge(uint256,address[])", +"c6de150b": "soldIdeaWei()", +"c6de5709": "calc_partnerPercent(address)", +"c6deeb9d": "contributionAccepted()", +"c6df66a7": "firstPlay(bytes32,uint8,bytes32)", +"c6e000b5": "mntpToken()", +"c6e0329f": "LaoHuiHui(uint256,string,string)", +"c6e04590": "rateHard()", +"c6e08ba9": "EligmaCrowdsaleContract()", +"c6e0c908": "checkTransferFromWithReference(address,address,uint256,string)", +"c6e0dc6e": "ChangeTransferStatus()", +"c6e1c178": "TheLuckyOne(bytes)", +"c6e3a9b3": "_total_sold()", +"c6e3d1b4": "promotionsOfHost(address)", +"c6e3e8fd": "getManualByAddress(address,address)", +"c6e3ffc3": "determinePID()", +"c6e416b5": "addressGains(address)", +"c6e5546c": "distributeTokens(uint256,uint256)", +"c6e68059": "DeAuthorized(address)", +"c6e68ea6": "createTournament(bytes32,uint256,uint256)", +"c6e6ab03": "allocateCandyToken(address[],uint256[])", +"c6e6b803": "grantAt()", +"c6e715e1": "rechargeDeposit()", +"c6e81b07": "remainingAuctionable()", +"c6e8b4f3": "createProxyAndCall(address,address,bytes)", +"c6e946df": "ComputePharaohReq()", +"c6e994d7": "shareWithdraw()", +"c6e9ce11": "NZD_CLEAR()", +"c6e9ff54": "changeBonusDistributionAddress(address)", +"c6ea3037": "_createSale(uint256,uint256,uint256,uint256,address)", +"c6ead8af": "tokensBurnt()", +"c6eae0c5": "limitEth()", +"c6eb8a65": "stage2BeginTime()", +"c6ed3418": "TokenMintPoD()", +"c6ed8990": "addTokens(uint256)", +"c6ed8e1b": "getApprovedProxys()", +"c6eda379": "totalZTKCheckAmounts()", +"c6ee701e": "getInts()", +"c6ee7a2c": "Linkable(address,address)", +"c6eeeb04": "increaseTimeBy()", +"c6f017e1": "addOrgan(address)", +"c6f03aaa": "getRegister(string,string)", +"c6f0557f": "insertarMensaje(uint256,string,string)", +"c6f067d1": "MVPToken()", +"c6f1649f": "deposit(address,uint256,address,address)", +"c6f3a895": "endFirstPeriodTimestamp()", +"c6f47486": "getHistoricalPrice(uint256)", +"c6f482aa": "largeCapDelay()", +"c6f48866": "isGameOver(bytes32)", +"c6f4ebb3": "o_minerador(uint256)", +"c6f54e62": "order(address[2],uint256[4])", +"c6f5b0e0": "getContributor(uint256)", +"c6f5d91f": "getAddressWhiteList()", +"c6f6122d": "transferredManually()", +"c6f664af": "totalInsuranceFlows()", +"c6f6d9d9": "lotteryCount()", +"c6f6f216": "setMaxPerTx(uint256)", +"c6f70370": "generateRoomNightToken(uint256,uint256,uint256,uint256,uint256,bytes32)", +"c6f88b0a": "_hasCorrectTreasury(address)", +"c6f981d7": "setTrap(uint256)", +"c6f9defe": "futureExpanstion()", +"c6fadeb3": "fechAllSumNumForEncourage(uint256)", +"c6faf736": "updatePromoBonus(uint256)", +"c6fc2bae": "ACEEquityToken(uint256,string,string,uint8)", +"c6fd2103": "recordImbalance(address,int256,uint256,uint256)", +"c6fdee56": "isAddress(address,address)", +"c6fe317f": "changeVanityURL(string)", +"c6fe7296": "resetPhases(uint256,uint256,bool,uint256,bool)", +"c6ff3ae3": "EthMark()", +"c6ff4081": "tokenProcess(address)", +"c7005f04": "distributeInternal(uint256,uint256,uint256,uint256)", +"c701672f": "_recordPresalePurchase(address,uint256)", +"c7021c9e": "submitPresetTransfer(address)", +"c7024b98": "deleteHybridization(uint256)", +"c7027329": "isBossWannaCryContract()", +"c7028f96": "burnAllLeftTokens()", +"c702d3b4": "Unregistered(address,address,uint256,uint256,uint256,uint256)", +"c7033137": "settleBets()", +"c7033721": "genesisRoot()", +"c70383a5": "takeOwnerShip(uint256)", +"c7046117": "sendAsGift(address,uint256)", +"c7047fa7": "metadataUrlPrefix()", +"c704e04a": "recordingResultsOfBet(bytes16,bytes16[],uint8[])", +"c704f7ed": "lockName()", +"c705a1a8": "getMerchandise(uint256)", +"c705e1a3": "allowToken(address,address,uint256,bool,bool,address)", +"c7071c3e": "MiningRewardChanged(uint256)", +"c707936a": "Serpent()", +"c707bae5": "getTopNames()", +"c708ed9c": "getPI_edit_15()", +"c7091c5e": "INITIAL_STAGE()", +"c70978da": "UnicornBreeding(address)", +"c7097f62": "linkAddress(address)", +"c7098e91": "decodeOrderTokenAndIsBuy(uint256)", +"c709c7b8": "priceStep7()", +"c70a24af": "ROLE_NEED_LOCK_UP()", +"c70a3f1a": "whiteHat()", +"c70a9246": "GetConsentData(uint256)", +"c70ad05b": "identity_storage()", +"c70bbc13": "emitRevoke(bytes32,uint256,address)", +"c70cc560": "storePassword(string)", +"c70cdad8": "hashBacktestPositions(uint32,int64[])", +"c70cef3a": "WalamaCoin()", +"c70d169d": "answerRequest(uint256,bytes)", +"c70dd8b3": "procureTokens(address)", +"c70e8640": "amountFundTeam()", +"c70ef908": "setPI_edit_33(string)", +"c70f5eaa": "buyCard(uint256)", +"c70f8e71": "enableTypeById(uint256,uint256)", +"c70faf90": "EndMinting(uint256)", +"c70fe6bd": "migrateAuction(uint256,address)", +"c71029e1": "getBankRequests(string,uint256)", +"c7102df7": "__stopBlock()", +"c710a2aa": "marketplace_controller()", +"c7110035": "multiSigWithdrawal(address,uint256)", +"c7120bad": "linkAccount(uint8,string,string)", +"c7120d77": "sendFunds(address,uint256,uint256,uint256,uint256,uint256)", +"c712f3b3": "TradeId()", +"c7133f53": "setAccountS(address)", +"c713a67b": "momentNonceOf(uint256,uint256)", +"c713aa94": "setEndBlock(uint256)", +"c713b10f": "isSameSign(int256,int256)", +"c713bd70": "getMarketerRate()", +"c7143c41": "notSameSeed(string,string)", +"c7144269": "changeSettings_only_Dev(uint256,uint256,uint256,uint256,uint16,uint256,uint256,uint256,uint8,uint8)", +"c7153816": "lowerSupply(uint256)", +"c715533e": "allFrozenTime()", +"c715a2b1": "withdrawnOf(address)", +"c71692b6": "capPreICO()", +"c716b616": "adopt(uint32,uint32)", +"c7172710": "pouseCrowdsale()", +"c7178230": "isDeprecated()", +"c717e9eb": "voidOrRevert(uint256)", +"c718640a": "setDragonSpecialPeacefulSkill(uint256,uint8)", +"c718b272": "Floor(uint32,address)", +"c718b2bb": "YunToken(address)", +"c718d0e0": "_setFreezedBalance(address,uint256,uint256)", +"c7192cda": "EventUpdateWasReset()", +"c7192e44": "setPaid(address)", +"c719348b": "safeCheck(uint256)", +"c71a7aea": "distributedReservedTokensDestinationsLen()", +"c71ad84d": "vehrespond(uint256,uint256,address,bool)", +"c71b583b": "closeRequest()", +"c71ba100": "revokeBalance(address,address,address)", +"c71bee4c": "OMITokenLock(address,address)", +"c71bf8ba": "multiplierOfPrice()", +"c71c0b40": "fundRaised()", +"c71c3f05": "blackListCompanies()", +"c71c6c55": "receiveIncome(bytes32,bytes32)", +"c71c890a": "weekFourStart()", +"c71cb0b4": "buildTile(uint16,uint16,uint8,uint16)", +"c71cbcf3": "recoverAccount(address,address)", +"c71daccb": "checkBalance()", +"c71ddb9f": "releaseContract()", +"c71e48d6": "setOutcome(bytes32,bytes32[])", +"c71e876b": "VESTING_DURATION_2Y()", +"c71eef58": "applyForTokenOneDay()", +"c71f2bae": "AddOpenOrder(uint32)", +"c71f311c": "setFABAcompanyTokensWallet(address)", +"c71f4253": "getNumberOfVotes(uint256)", +"c7216a44": "_generate_special_horsey(address,address,address,bytes32)", +"c721b34b": "setBattleAddress(address)", +"c721b6bd": "grantVestedTokens(address,uint256,uint256,uint256,uint256,bool,bool,bool)", +"c721cfe2": "reClaimBalance()", +"c721f08d": "activateSale()", +"c722328d": "withdrawToMultisig()", +"c722e113": "_transferDivs(uint256,uint256,uint256)", +"c722e462": "CoinX()", +"c7238af7": "escapeDestination()", +"c724772c": "turnOnIco()", +"c72486d2": "Unexpended()", +"c724acb7": "calcDifficulty()", +"c7258d7f": "isUserWhitelisted(address,address)", +"c726c2b9": "getPI_edit_24()", +"c726dea8": "memberArray(uint256)", +"c7277115": "ManagedToken(string,string,uint8)", +"c727980a": "payDeposit(uint256,address,uint256)", +"c7280315": "UnauthorizeToTransfer(address)", +"c7286a21": "removeContribution(address)", +"c7291b7e": "descriptionHashHistory(uint256)", +"c729a567": "withdrawFundToAddress(address)", +"c72a2328": "tier_rate_1()", +"c72a480e": "DGameController(address[])", +"c72b5176": "getGroups()", +"c72b5e4f": "persentRate()", +"c72be838": "gasForDCN()", +"c72c1133": "Log(string,uint256,uint256)", +"c72c757e": "delete_allowedAddress(address,address)", +"c72cbd78": "removeused()", +"c72e1576": "addAddressInWhitelist(address)", +"c72e57c7": "lockedTill()", +"c72e6d03": "p_setRefPercent(uint256,uint256)", +"c72e8baf": "PRICE_3()", +"c72e9e45": "setEgeregAddress(address)", +"c72f0dd9": "Player_HitOrStand(uint256,bool)", +"c7303c61": "createPost(string)", +"c7304f37": "changePool(uint88)", +"c730bbd8": "rateWaiting()", +"c730dfbb": "WemarkToken()", +"c731c504": "restoreFunds(address,address,uint256)", +"c731e124": "rewardslength()", +"c73202ff": "jpPercentageDivisor()", +"c732d201": "currentCount()", +"c7330bf6": "getDepositesCount(address)", +"c7343754": "getLendingItemLength(address)", +"c7347832": "asyncTransfer(address,address,uint256)", +"c734f917": "onTokenTransfer(address,uint256)", +"c73659be": "RexToken(uint256,address)", +"c736a051": "getPlayer(address,uint256)", +"c736e118": "bgxWallet()", +"c7377d80": "Bourneereum(uint256,string,string)", +"c737b7c6": "getTotalTickets(address)", +"c7381593": "Multimember(address[],uint256)", +"c7385f2e": "proofIds(uint256)", +"c738a836": "changeEnabledAddressStatus(address,bool)", +"c7395151": "updateMaxAcceptedDeposits(uint256)", +"c7398dd4": "getCustomValue()", +"c73992e4": "hasApproved(address)", +"c73997b1": "changeBaseValue(uint256,uint256,uint256)", +"c739d31c": "setPrivateSaleAgent(address,bool)", +"c73a2d60": "disperseToken(address,address[],uint256[])", +"c73aae86": "get_Release()", +"c73b187d": "oraclizeMinCallbackGas()", +"c73b302e": "projectsCount()", +"c73c27bc": "getNodeId(uint256)", +"c73c2a45": "WriteBible(uint16,uint16,uint16,uint16,string)", +"c73c933d": "ChangeBurnBoundsOperationEvent(uint256,uint256,uint256)", +"c73d3b30": "getAbilities()", +"c73defce": "ETCHaddress()", +"c73ea367": "setNickName(string)", +"c73ec2eb": "minCompositionFee()", +"c73f0c11": "burnGlobFoneCoin(uint256)", +"c73f20e3": "issueamount()", +"c73fcee2": "CLNTotalSupply()", +"c74073a1": "close(address)", +"c740bc9f": "setLongtermMinter(address,uint256)", +"c7410070": "publicbattlestart()", +"c7411eb4": "calculateAntBuy(uint256,uint256)", +"c741764c": "oldE4()", +"c741d70d": "retrieveFounds()", +"c741e85a": "set_parameter(string,uint256)", +"c741f0f3": "buyBILL()", +"c7420a9f": "store(bytes,address,address,uint256,uint8,uint8)", +"c7423803": "finishRecovery()", +"c7423f26": "strFundDeposit()", +"c74266b3": "HanYinToken()", +"c742bab1": "VUP_TOKEN_SUPPLY_TIER1()", +"c743092e": "Buy(uint256,address,uint256,uint256,uint256,uint256)", +"c7430e28": "Trillionix(address,address)", +"c7431f5c": "changeETXAddress(address)", +"c74352af": "FileServerManager()", +"c74370db": "Transfer(address,address,uint48,bytes)", +"c74442e6": "withdrawNexiums(address)", +"c7445c22": "getPassportId(address,address)", +"c7446565": "startAt()", +"c74590e3": "LogInvestment(address,uint256)", +"c745ca9a": "transferBack(uint256,address,address)", +"c745dab9": "MakerDepositedEther(uint256)", +"c7464e8a": "showRandomWinners()", +"c746a52d": "showme(uint256,uint256,uint256)", +"c746b299": "PSCToken()", +"c746c8f4": "addAllowedSender(address)", +"c747ef76": "AbieFund(address[])", +"c747f120": "totalIssuerCollateralisation()", +"c74803de": "_isContained(bytes32,bytes,bytes32)", +"c7489441": "closeMarketMaker(uint256)", +"c748b54b": "PeerWalletsERC20Token()", +"c74a2449": "canUserAnswerQuestion(address,uint256)", +"c74a4000": "cnrtoken()", +"c74a690c": "price_in_wei()", +"c74a827c": "setMonsterCreatorAddress(address,address)", +"c74a96eb": "setHGT(address)", +"c74abe43": "getMyTokensValue()", +"c74b1e01": "startPresaleTime()", +"c74b5a3e": "open5Chest()", +"c74c251f": "addSafely(uint256,uint256)", +"c74c851a": "isValidInvestment(address,uint256)", +"c74ca049": "unshareKey(bytes32,address)", +"c74ce765": "TESTTESTToken(address)", +"c74e907b": "commit(address,uint256,uint256)", +"c74fc077": "guards(uint256)", +"c74fda29": "_distributeAdvisorsToken(uint256)", +"c7506049": "_processSalePurchase(address,uint256)", +"c7508ec7": "removeClaim(address,address,bytes32)", +"c750938e": "shiftcashToken()", +"c750c3b1": "allocateEndTime()", +"c750cb79": "getHighestBidder(uint256)", +"c750df73": "submitContract(bytes32)", +"c7516da7": "CITY_INCREASE_RATE()", +"c751e027": "PoolTeam()", +"c752746e": "tokenHoldersClaimed(address)", +"c752a999": "MoneyTokenPromo(uint256,string,uint8,string)", +"c752ff62": "totalUpgraded()", +"c75363b6": "BEGIN_TIME()", +"c7542f1d": "GCCToken()", +"c754fc08": "addGroup(uint256,uint256,uint256)", +"c75514e8": "executeOptions(address,uint256,string)", +"c7559da4": "uint256ToBytes(uint256)", +"c7573e82": "registerStudent(address)", +"c7574839": "communityWallet()", +"c7576e8f": "TOBToken()", +"c7576ed4": "finalizeMigration(address,address)", +"c75782be": "startup(uint256,address)", +"c7586219": "burnShares(uint64)", +"c7586cde": "THIRD_USER_CUT()", +"c758b813": "ausGroupAllocation()", +"c75902cf": "iwtfundtokens()", +"c7591d35": "checkGuess()", +"c7593f01": "SKLAuction()", +"c75abf24": "setup(uint256,uint256,uint256)", +"c75bc4fb": "setMaintenanceLock(bool)", +"c75bc6f8": "UniverseShieldToken(address,address)", +"c75c6a06": "batchCancelVoteForCandidateByIndex(uint256,address[],uint256[])", +"c75d9d29": "unlockPurchase()", +"c75e8d55": "setRecipientString(string)", +"c75fb740": "Error(bytes)", +"c75fc22f": "freeEther()", +"c7600cde": "getInitialReporterAddress()", +"c7602316": "deploy(string)", +"c7614487": "MAX_CROWD_FUNDING_ETH()", +"c761a2f5": "revertFeeCalculatedFlag(bool)", +"c762547d": "contractCreatedCount()", +"c762c463": "mUsers(address)", +"c762d3ea": "calculateReferralBonus(uint256,uint256)", +"c762d5f7": "setBorrower(address)", +"c763400e": "endpreIco(bool)", +"c763e5a1": "chain()", +"c764427c": "addAllowedContract(address,address)", +"c764d4c4": "withdrawCountriesToken()", +"c764ee57": "VIWOZ()", +"c7656f6e": "startProject()", +"c765defd": "setBeneficiary(address,bytes32)", +"c76668cf": "transferCheck(address,address,uint256)", +"c7669337": "fundMinting(address,uint256)", +"c766ce02": "addFactProviderToWhitelist(address,address)", +"c768051a": "gla()", +"c768a4cd": "upgradeSword(address)", +"c768ac01": "totalWithdrew()", +"c76a4bfb": "relayReceiveApproval(address,address,uint256,bytes)", +"c76a74df": "Bitscoin()", +"c76b838c": "bulkSell(uint8[],bytes6[],uint32[],uint32[])", +"c76c1ba5": "placeBet(uint256,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"c76c68d0": "CalcToc(uint256,uint256,uint256)", +"c76c9269": "ethVest()", +"c76d0754": "fiatSend(address,uint256,uint256)", +"c76de3e9": "Start(string,string)", +"c76df481": "getArmyOwner(uint256)", +"c76e7f32": "addressToPersonId(address)", +"c76f0d13": "COSTToken()", +"c76f80c8": "_createCaptainToken(address,uint256,uint32,uint32,uint32,uint32,uint32,uint32)", +"c772173a": "ProsperToken()", +"c7725426": "setAuthorizeMintToken(uint256)", +"c772af39": "boss()", +"c7736abf": "windowOpenTime()", +"c77547f7": "maxTimeIntervalHB()", +"c7760b11": "getlevel(address)", +"c77636fc": "PauseOwnerAdmin(bool)", +"c77684f9": "ClipperCoin(uint256,string,string)", +"c776cc42": "FREEDOMCoin()", +"c7775011": "setSlaveWallet(address)", +"c77810a4": "Pot()", +"c778427b": "migrationInitiated(address)", +"c7786275": "Bitansuo()", +"c778a46b": "doPresaleMinting(address,uint256,int256)", +"c7798891": "TokensReleased(address,uint256)", +"c77a0de6": "xfer(uint256)", +"c77a16ed": "resumeTransfers()", +"c77ae9bf": "resetRaz(uint256,address,uint256)", +"c77bd8cc": "acceptAdminToo()", +"c77bdfce": "bindToken(address,address)", +"c77c00f8": "openNewBet(address,uint256,uint256)", +"c77db34e": "PWNasdas()", +"c77dff62": "shrimpyramid()", +"c77e7614": "getTotalWithdrawAmount()", +"c77ef9b8": "setAccessProvider(address)", +"c77f58c8": "transferMinusComission(address,uint256,uint256)", +"c77fe4d6": "incentivisingSupply()", +"c781d7b0": "calculateAntSell(uint256)", +"c781f97b": "getCurrentCrabPrice()", +"c7825c3f": "Pruebalillo()", +"c782fc60": "getExtraBalance(address)", +"c783dc9e": "pullEther(uint256)", +"c783fb10": "validBalanceOf(address)", +"c784648d": "addIdArrayItem(address,uint256,string,string,uint256)", +"c7847d19": "createAnnoTrade(bool,uint256,uint256)", +"c7857d27": "setMyName(string)", +"c786a66f": "_createSchedule(address,uint256,uint256,uint256,uint256)", +"c786ebd1": "LogPrepareToStart(string,uint256,uint256,address,address)", +"c7876ea4": "basePrice()", +"c7878fa0": "setHumanityFund(address)", +"c7888a07": "claimSuperDragonEggs()", +"c7891514": "forthWeekMainICOBonusEstimate()", +"c78974de": "get_test_data_length()", +"c78982d5": "getIntervalCoefficient(bytes2,uint256)", +"c789ea87": "acceptFoundation(string)", +"c78a33e1": "DestroyEvent(address,uint256)", +"c78a4c98": "icoRaised()", +"c78a8dfe": "Kardanor()", +"c78ad77f": "percentage()", +"c78af2f7": "contributeByProxyContract(address,uint256)", +"c78b200c": "transferableFromBlock()", +"c78b616c": "totalListings()", +"c78bd060": "makeInvestment()", +"c78c0138": "timestamp_contract_start()", +"c78c3a83": "getPredictions()", +"c78cdf66": "mintTimelocked(address,uint256,uint32)", +"c78d7380": "COINECTToken()", +"c78d846d": "PTCToken()", +"c78dc603": "alt_buyCollectible(uint256,uint256,int256)", +"c78e139a": "setUpgradedContractAddress(address)", +"c78f3e18": "starteth()", +"c78fc487": "indexedByOwner(address,uint256)", +"c791316e": "minFundingAmount()", +"c791bd21": "AngelToken()", +"c791cc39": "BOECoin(uint256,string,uint8,string)", +"c791e16b": "platPriceOracleContract()", +"c792024a": "tierRates(uint256)", +"c79343e5": "isSYNVault()", +"c7939f34": "oddsTotal(uint256,uint256)", +"c79403f5": "moveFurnaceData(address[],uint16[],uint256[],bool[],uint256[])", +"c7941a09": "setDelegadoDeEscuela(bytes32,bytes32,uint8,uint8)", +"c794549e": "setDesignatedReport(bool)", +"c7946842": "URLOf(uint256)", +"c794ef10": "purchaseCostEther(uint256)", +"c794f575": "makeAnnualInvest(uint256)", +"c7956846": "get_solved(address)", +"c795dd24": "availableTokenBalance(uint256,uint8)", +"c7963ae8": "Tabo()", +"c7968135": "totalNumberOfFunders()", +"c798b5cf": "CommunityToken()", +"c7990f70": "SetDevFee(uint16)", +"c7995a4e": "_registerTrade(uint32,uint256)", +"c79a68cf": "setPrices(uint256,uint256,string,string)", +"c79ba27d": "kscTransferFrom(address,address,uint256,string)", +"c79bb895": "SGACrowdsale()", +"c79bdb46": "setRewardPercent(uint256,uint256)", +"c79c9105": "countOfPublicKey(bytes32)", +"c79eaa22": "sub(uint96,uint96)", +"c79f5321": "update_data()", +"c79f7cef": "_postValidatePurchase(address,uint256)", +"c79f8b62": "error()", +"c79fc609": "addressC()", +"c7a02061": "totalEtherCollected()", +"c7a08487": "_generateRandomDna()", +"c7a16847": "SetRewardMulti(uint256)", +"c7a16965": "testUint(uint256)", +"c7a1865b": "play(bytes32)", +"c7a1f221": "tokenPriceInCents()", +"c7a1fb36": "PRE_SALE_CAP()", +"c7a24403": "Illuminatus()", +"c7a28247": "stopBuyingTokens()", +"c7a2a663": "getCodeAtAddress(address)", +"c7a323fe": "ACTION_INITIAL_BIDDING()", +"c7a32726": "StartCrowdsale()", +"c7a37657": "getCfd(uint128)", +"c7a3778f": "testControlRetractLatestRevisionNotUpdatable()", +"c7a4af15": "setPrice(uint8,uint128)", +"c7a4cf8d": "checkOverMaxcap(uint256)", +"c7a4e4bc": "VIPCHAINToken()", +"c7a5d285": "extract(address)", +"c7a6c454": "confirmTransaction()", +"c7a6c6d4": "_creditTokens(address,uint256)", +"c7a86dd2": "updateEnergy(uint32,uint32,uint256)", +"c7a86e33": "signedApproveCheck(address,address,uint256,uint256,uint256,bytes,address)", +"c7a96920": "stopICO_20_March()", +"c7a9a64b": "depositNetfRevenue(uint256)", +"c7a9d6de": "startICO(address)", +"c7aa278e": "poolInvestors()", +"c7aaa83f": "Bounty0xToken()", +"c7abc42a": "getgamecard(uint256)", +"c7ac0909": "AddedName(address,string,uint256,address,uint256)", +"c7ac14b1": "dividendCutPercentage()", +"c7acae2e": "getServerAddress()", +"c7ad31b0": "LogHodlStartSet(address,uint256)", +"c7adb61f": "initializeTreeCoinProject(address,uint256,uint256,address,address)", +"c7adef28": "getCitationRecord(bytes32,uint256)", +"c7ae3ad5": "fillBuyOrder(uint256,uint256,uint256)", +"c7ae7451": "addEvent(address)", +"c7ae9632": "xfer(address,address,uint256)", +"c7af18f1": "SedPoSToken()", +"c7af3dd1": "updateCost()", +"c7afe9f2": "setTokenAddress(address,address)", +"c7aff0d7": "manuallyProcessTransaction(address,uint256)", +"c7b0235b": "DPPCrowdsale()", +"c7b0f0ca": "lockTokensPercent()", +"c7b0fc5e": "usedItem(uint256)", +"c7b11fca": "mainMaxContribution()", +"c7b160db": "getTotalNumberOfAddressesReceivedAirDrop()", +"c7b1fd00": "usdPerEthLogSize()", +"c7b23ec6": "initalizeOrgan()", +"c7b27a25": "IOReceipts()", +"c7b31ed0": "store(address,address,uint256,uint8,uint8,bytes)", +"c7b3b0d4": "getCompanyInfo(bytes32)", +"c7b41aa9": "getSmartCoins()", +"c7b43f02": "expressBuyNums(uint256,uint256[])", +"c7b5716d": "createSellOrder(address,uint256,uint256,uint256,uint256)", +"c7b6084c": "backendOperator()", +"c7b6ccae": "opetToken()", +"c7b6fd6a": "subDays(uint256,uint256)", +"c7b799ae": "addressFunc(address,address)", +"c7b7d6ca": "sendResearchAndDevelopment()", +"c7b81f4f": "isEpochDataSet(uint256)", +"c7b850dd": "whitelistedContributors(address)", +"c7b87d74": "setOldTokenAddress(address)", +"c7b97288": "addTokenEmission(uint256,uint256,uint256)", +"c7b98dec": "right1(uint256)", +"c7b9bc9e": "Token(uint256,string,uint8,string,string)", +"c7b9c355": "setSecondBonusPercent(uint256)", +"c7ba24bc": "claimAndConvert(address[],uint256,uint256)", +"c7ba9264": "KAL4Token()", +"c7bb38e7": "setAmount(bytes32,uint256)", +"c7bb42f7": "TEAM0()", +"c7bc747d": "retrieveTokenByContract(address,uint256)", +"c7bce243": "Menu05()", +"c7bdbb95": "allowTransferOwnership(bool)", +"c7bdcde9": "IYAKIN()", +"c7be44fa": "banReferrer(address)", +"c7be7ae3": "frozenSupply()", +"c7bec318": "removeAccountAddress(address)", +"c7c049fc": "saleGoal()", +"c7c0c5bf": "modifyMarking(bytes32,uint256)", +"c7c16353": "weiToRaise()", +"c7c2aa25": "WarriorsBackToHome(address,address,uint256)", +"c7c2aee3": "personalCap()", +"c7c3268b": "setBaseUrl(string)", +"c7c36959": "GubbermentOverthrown(address,address)", +"c7c3b1c1": "canTerminate()", +"c7c3b2dd": "setMockedTotalCollected(uint256)", +"c7c40fbb": "addPassportLogic(string,address)", +"c7c4ff46": "depositor()", +"c7c54e4d": "theEBCC(uint256,string,uint8,string)", +"c7c5f59d": "forBounty()", +"c7c625ee": "rand(address)", +"c7c6939c": "LongPlace(address[2],uint256[8],uint8,bytes32[2],uint256)", +"c7c7322b": "testCantInitiateIncorrectSale()", +"c7c7e9ea": "getAllowed(address,address)", +"c7c806cb": "ambassadorAddress()", +"c7c80f02": "teamLockUp()", +"c7c83804": "setFinancingsAdd(address)", +"c7c8b07b": "KillSwitch()", +"c7c8c424": "ownersEth()", +"c7c8ff35": "getNeutralMutationCost(uint8)", +"c7ca07bb": "QuantityAvailable()", +"c7cb94e3": "GenPlayerRatio(address,uint256)", +"c7cbb9c8": "_createArea()", +"c7cc3743": "addContractAddr()", +"c7cc4ee9": "later()", +"c7cc63aa": "getBetTitle()", +"c7ccc559": "upgrade_cap()", +"c7cd31d5": "setLLV_edit_23(string)", +"c7ce060b": "publicDeductDeposit(address,uint256)", +"c7ceac99": "calculateBattleBoost(uint16,address,address)", +"c7cec7f8": "versions(bytes32)", +"c7cefbf1": "IDH()", +"c7cf28fe": "canClaimTimeout()", +"c7cf6a2a": "LJSToken()", +"c7cf8075": "getAvailableDevFund()", +"c7d044be": "AutoChainToken()", +"c7d128d1": "readTotalNumberOfUserPurchases(address)", +"c7d20f82": "addMeterpoint(address,int256)", +"c7d22929": "betOpen(uint256,string,string,string,string)", +"c7d26e90": "getAccessoryClaims(uint64)", +"c7d4f68e": "getRobotForUserByIndex(address,uint256)", +"c7d586c9": "provideProofOfWork(uint256)", +"c7d5b6f1": "cancelSellOffer()", +"c7d5c0af": "XVOTOKEN()", +"c7d5d171": "costRecharge(uint256)", +"c7d5dd36": "Factory(address,address)", +"c7d6e988": "fundOwnerWallet()", +"c7d6faf1": "easyPropose(address,uint256)", +"c7d77970": "registerNameXaddrFromDapp(address,bytes32,address)", +"c7d7b5a6": "fillOrder(address[5],uint256[6],uint8,bytes32,bytes32)", +"c7d96304": "canMateWithViaAuction(uint256,uint256)", +"c7d9f4d1": "transferableBalanceOf(address)", +"c7da93b7": "specialTransfer(address,uint256,uint256,uint256)", +"c7daae0a": "firstFreeAddressIndex()", +"c7dab436": "vestingTime()", +"c7daceb1": "acceptBuyNowOffer(uint256)", +"c7db04d7": "SelfDestructManager()", +"c7db3342": "getCurrentRoundKey()", +"c7dbbc47": "nextTicket()", +"c7dbc2be": "minimumPodSize()", +"c7dd4b4f": "gameID()", +"c7dddf0f": "itemHistoryOf(uint256)", +"c7de2d13": "WithdrawToken(address,uint256,address)", +"c7dea777": "areOldMiningKeysVoted(uint256,address)", +"c7deda22": "Doug()", +"c7df0a90": "all_eth()", +"c7df9054": "getBuyUnitsInformations()", +"c7dfabcc": "Buy(uint8,string)", +"c7e04670": "publicSaleTokenPrice()", +"c7e0635d": "AGENT_STATUS(bytes32,address)", +"c7e09d9c": "getSides(uint256)", +"c7e12723": "Erc20Test(string,string,uint8)", +"c7e210c3": "optionPoolMembersLockTotalOf(address)", +"c7e22ac4": "setOracleGas(uint256)", +"c7e284b8": "getTimeLeft()", +"c7e293d9": "allocateFunds(address,address,uint256)", +"c7e35a5c": "LOCK_START()", +"c7e3b6e8": "airdropAndVault()", +"c7e3ff4b": "pregnantMonsters()", +"c7e40b3a": "StatXCoin()", +"c7e416c5": "LOG_SuccessfulSend(address,uint256)", +"c7e4f453": "TokenFactoryImpl(address)", +"c7e50dc9": "isLOC(address)", +"c7e52480": "convertYourTokens()", +"c7e56740": "_getIndex(address,address)", +"c7e58644": "getSharesCount()", +"c7e59334": "toggleAttachedEnforcement(bool)", +"c7e5fc3b": "GlobalTechToken()", +"c7e67360": "GAS_BUFFER()", +"c7e6926e": "_airdropTotal()", +"c7e6d04f": "ownerConfig(address,uint256,uint256)", +"c7e73adf": "getParticipantSource()", +"c7e83451": "matchMultipleOrders(uint64[],uint64[])", +"c7e92738": "MicroBTC()", +"c7e975b8": "partner2_voted_update_marriage_status()", +"c7e9aaaf": "_isSiringPermitted(uint256,uint256)", +"c7ea07bb": "SealTokenSale(address,address,address,uint256,uint256,uint256,uint256)", +"c7ea8a68": "EOSToken()", +"c7ebc8fe": "getWinnings(address,uint256,uint256)", +"c7ed1e86": "getNoOfMsgs(address)", +"c7ed4555": "DepositSlot(address)", +"c7ed4d8c": "distributeVM(address[],uint256,uint256)", +"c7edaf33": "TheGoDgital()", +"c7edf88c": "DOW_SAT()", +"c7ee005e": "prime()", +"c7ee1c4e": "getPreviousSeed()", +"c7ee98c2": "trustedBurnTokens(uint256)", +"c7ef47d7": "isKill()", +"c7efa689": "getSaleDay(uint256)", +"c7efb162": "setup(address,address,address,uint256,uint256)", +"c7efb8ab": "ledger(address,bytes32)", +"c7f04e65": "purchase(uint32)", +"c7f132d5": "QuarterCoin()", +"c7f18d5b": "updateData(uint256,uint256,uint256,uint256,uint256,bytes,bytes)", +"c7f1f06f": "GetEmail(uint256)", +"c7f24b11": "getCCH_edit_8()", +"c7f2c3d9": "EasyInvest10()", +"c7f2e6af": "Contribute(bytes20)", +"c7f300ed": "CrowdSale_ModifyEndDate(uint256)", +"c7f3166d": "getBetInfo(uint256,uint256)", +"c7f31f1c": "HandWins(address)", +"c7f36010": "setupClaim(uint256)", +"c7f423c7": "setLeaf(uint256,bytes32)", +"c7f42c64": "battleFee()", +"c7f43b57": "TIER2_CAP()", +"c7f46dea": "testRewardBS(bytes32)", +"c7f5f1e8": "DistributeNextNTokens(uint256)", +"c7f6f40c": "updateKYCStatus(uint256)", +"c7f6fa60": "EIDTokenERC20()", +"c7f71103": "futrMiner()", +"c7f7475c": "AdminGroup(string)", +"c7f758a8": "getProposal(uint256)", +"c7f7be5c": "setGxCoinContract(address)", +"c7f84605": "___upgradeTo(address)", +"c7f86c37": "withdrawFundsRP()", +"c7f8fe65": "getBalanceReleased()", +"c7fa1d47": "Hedge()", +"c7fa52de": "setRegistryAddr(address)", +"c7faa88d": "collectProfit()", +"c7fb117c": "depositCancel(uint256,uint256)", +"c7fb9aab": "displaymultisig()", +"c7fbad27": "revealStart()", +"c7fc9ace": "WorldNode()", +"c7fccd3f": "isAuthorizedForToken(address,address,address)", +"c7fde81f": "changePOI(address)", +"c7fe11d4": "_createCaptainToken(address,uint256,uint32,uint32,uint32,uint32,uint32,uint256)", +"c7fee63e": "updateRate()", +"c7ff1584": "isHalted()", +"c7ff1b60": "maxCapReached()", +"c7ff2086": "getPropertyColorsOfRow(uint16,uint8)", +"c8004293": "lastKnownPropertyAddress()", +"c80094b3": "testEquals()", +"c8016c85": "MAIN_SALE_BONUS_PERCENTAGE_PHASE1()", +"c8027210": "Malaysia370()", +"c8028bee": "auditorRegistry()", +"c803486b": "getAvailableFunds(address)", +"c803ae2a": "kycComplete()", +"c803f981": "care(uint256)", +"c8045941": "changeDescription(string,string)", +"c8046827": "registerBurn(uint256)", +"c804a58e": "toggleRefunding()", +"c8051885": "isWithinContributionRange()", +"c805801c": "VoipTken()", +"c805914a": "setRespectRequiredToRecruit(uint256)", +"c805b6bc": "PRESALE_TOKEN_HARD_CAP()", +"c805f68b": "setRelay(address)", +"c806286d": "setFreeze(uint256,bool)", +"c80667e3": "appendUintToString(string,uint256)", +"c80675de": "sendDiamond(address,bytes32,string,bytes16,uint256)", +"c806a91d": "TOKEN_TOTAL_CAP()", +"c80743c5": "maximumTokenAmount()", +"c807be58": "endTimeSale2()", +"c807cb02": "Uninjected(address)", +"c807e645": "JECKAirdrop()", +"c8081bd2": "requestMutualJobCancellation(bytes16,address,address,uint256,uint256)", +"c8088830": "_canPayOraclize(uint256)", +"c808cf86": "exchangeHelenium(uint256,address)", +"c80944e5": "buildRight(address,uint256)", +"c80a589b": "withdrawTokenBalance(uint256,address)", +"c80b05e1": "isViolated(address)", +"c80bbb17": "ReserveFund()", +"c80becb6": "enablePreSale()", +"c80c14a5": "getBankBalanceWEIInfo()", +"c80c28a2": "getNumberOfParticipants()", +"c80d3694": "saleWeiCap()", +"c80db88c": "getSchellingExpansion(uint256)", +"c80e0ddd": "saveCode(uint256,string)", +"c80e3e1e": "SingularityTest23()", +"c80ec522": "withdrawn()", +"c80f9a4f": "transferPokemon(address,address,uint256)", +"c81050e6": "checkBranchInEpisode(uint256,uint256)", +"c8117b5b": "extractBalanceOfLength()", +"c81196da": "numberOfMilestones()", +"c8135ba1": "bids_decrypted_count()", +"c813c30e": "testThrowSomething()", +"c813e02e": "_isLeapYear(uint16)", +"c814324c": "timeBought(address)", +"c81450a0": "RaffleResult(uint256,uint256,address,uint256,uint256,bytes32)", +"c814864c": "CreateChips(uint256,uint256,uint256,uint256,bool)", +"c8149cbc": "setMigrationLock(bool)", +"c8159d70": "Seriality()", +"c815c9ef": "TerraEcoToken()", +"c8162068": "setTeamAddr(address)", +"c8162497": "BETX()", +"c8166a8a": "Question()", +"c817d75d": "Transfer(address,address,uint256,uint256,uint256)", +"c817e84d": "addWhitelisted(address,bool)", +"c8187cf1": "determineReward(uint256)", +"c818acf7": "createCloneToken(address,uint256,string,uint8,string,bool,address)", +"c818faec": "updatedAt(uint256)", +"c8193841": "addSoftwareVersionRecord(bytes32,bytes32,uint256)", +"c8199231": "createContractTot(string,uint256)", +"c8199826": "buyTickets()", +"c819f6e9": "levToken()", +"c81a5455": "Milestone_CloseTheIco(string)", +"c81a7d10": "CurryCoin()", +"c81bd106": "approveNewOwner()", +"c81c590d": "getEtherAmount(uint256)", +"c81caae7": "acceptMember(address,string,string)", +"c81cbc5c": "MIST()", +"c81cf764": "getAmountFromBuyer(address,address)", +"c81d1d5b": "getPunk(uint256)", +"c81e05ad": "KODO()", +"c81eccda": "getTokenId(bytes)", +"c81ede67": "pollBurnQty()", +"c81f49cb": "getTotalPaid(address,uint256)", +"c8216f33": "getLineUpEnable_default()", +"c8226e61": "withdrawEgereg(uint256)", +"c822bd3d": "transferCost(bytes16,uint256)", +"c822d7f0": "isRegistered(string)", +"c8234ac8": "createTokenUri(uint256)", +"c82467c9": "ComputeTokenPrice()", +"c8248f8d": "PreICO(address,address,address,address,address)", +"c824a222": "auctionsOf(address)", +"c82531a3": "createAuction(uint256,address,uint256,uint256,uint256,address)", +"c825a939": "fundingRatePredictionBonusPoolInIBC()", +"c827a7bb": "testExternal(uint256[20])", +"c82829e0": "setSoftHardCaps(uint256,uint256)", +"c828371e": "getStartTime()", +"c828e6ee": "getCurrentlyClaimableAmount(address)", +"c8290efd": "zen()", +"c8291dbd": "increment(address,address)", +"c829958c": "isImported(address,address)", +"c8299b10": "gotransfer()", +"c8299ed8": "afterClaim(uint256,uint256,uint256,uint256,uint256)", +"c829b0e3": "MAX_LAYERS()", +"c82aac47": "searchByTag(bytes32)", +"c82b8ec5": "EtherDaruma(address,address,address,uint256,uint256,uint256)", +"c82bb37b": "PotSplit(uint256,address,bool)", +"c82bd265": "ContributionAccepted(address,uint256,uint256)", +"c82c73c1": "isAddressSet(address)", +"c82cd463": "transferFundkeeper(address)", +"c82cd8e6": "ControllerRetired(address)", +"c82d81dd": "GICAToken()", +"c82db402": "ownerSetOraclizeGas(uint256,uint256)", +"c82f2418": "decodeTokenOrderTokenAndIsBuy(uint256)", +"c82f8d9e": "distributeToken(address,address,uint256)", +"c83068eb": "setPre(uint256,uint256,uint256,uint256,uint256)", +"c8306c89": "set_arbits(address,address,uint256)", +"c830b89d": "ReleaseDateChanged(address,uint256)", +"c830c656": "increasePermillage()", +"c83126ed": "generateVoteForDelegationSchemaHash(uint16,address,bytes32,address)", +"c831306e": "icoTimeBonusPhase2End()", +"c831391d": "getPoolOverlapSize()", +"c83261bd": "claimTokenFor(address)", +"c83281e9": "UserAccount(bytes32,bytes32,bytes32,bytes32,bytes32)", +"c832b00d": "limitDateCrowdWeek3()", +"c8335143": "AlekseiZaitcevPrivateSale(uint256,uint256,uint256,address)", +"c8335ba0": "setInitSize(uint256)", +"c833d7b1": "BigbomContributorWhiteList()", +"c834d03d": "verifyTx(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[3])", +"c83507a8": "removeAdv(address)", +"c836292b": "teamMembers(address)", +"c836efcb": "_permitted()", +"c83780a2": "crowdsaleCounter()", +"c838ccb6": "getDelegates()", +"c839008e": "setPixelPropertyContract(address)", +"c8391142": "j1Timeout()", +"c83923c5": "getMetadataChannel(string)", +"c83927a0": "pdo()", +"c8393ba9": "initiateWithdrawal(address,uint256)", +"c8398947": "currentStateActive()", +"c839c0de": "CreateVersion(bytes,string)", +"c83a7e94": "AEToken()", +"c83a9472": "deathData_a11()", +"c83a981c": "openPool(uint8)", +"c83abb40": "registerNotary(address,string,string,string)", +"c83ac557": "ChangeCommunityHolder(address,address)", +"c83be888": "single_move(uint256,uint8,uint8)", +"c83cb16c": "_not(bool)", +"c83ea900": "soldDET(address,uint256,bytes32)", +"c83ec89d": "tradeWithOutputFixed(address,address,address,uint256,uint256)", +"c8401567": "betbucketTwo()", +"c840b187": "goodsNotReceived(uint256)", +"c841df4f": "getMonsterStats(uint256)", +"c8420d2f": "CollectibleIndex5()", +"c8422c2d": "boostrapParty(address,address)", +"c8435ba2": "levelOneTokenNum()", +"c843c0c8": "getMyAlien()", +"c8443fad": "revokeExchanger(address)", +"c8449b65": "Gold()", +"c84640f5": "addtotalCardValue(uint256,uint256)", +"c846690b": "initialiseToken()", +"c847259c": "changeClub(address)", +"c84748f9": "returnFrozenFreeFunds()", +"c848a0bc": "notifySellToken(uint256,address)", +"c848fab7": "SeeleToken(address,address,uint256)", +"c84920cb": "Ubisoft()", +"c84a6140": "BackdoorBurner(uint256,string,uint8,string)", +"c84a8766": "setRegionImageDataCloud(uint256,uint256,uint256,string)", +"c84aba9b": "demurrageBalance(address,address)", +"c84b0555": "token(address,string,string)", +"c84b1ce7": "PUBLIC_RESOLVER_LABEL()", +"c84b470f": "SALE_PERCENTAGE()", +"c84ba84a": "finishedPurchase()", +"c84c009b": "Operated(address)", +"c84c5963": "setPauseCutoffTime(uint256)", +"c84c692a": "isTradableFciInSession()", +"c84c9ef5": "LastName()", +"c84ca867": "getCurrentPriceAttoTokensPerWei()", +"c84cda0f": "setRate(string,uint256)", +"c84d56e0": "setRealmSale(uint256,uint256)", +"c84eb9e5": "invest(address,bytes)", +"c84f5d6f": "RowanCoin()", +"c850029e": "returnTokenOwnership()", +"c85147c5": "mediumCount()", +"c8517b48": "CNDTTokenDeposit()", +"c851b643": "legendsToken()", +"c851ed7c": "startNewVote(uint256,string)", +"c8520131": "Withdrawable()", +"c85234c7": "startPreICOStage3()", +"c8525c09": "unlock(bytes32,bytes32)", +"c853c03d": "newDraw(uint256,uint8[3],uint256,uint256,uint256,uint256)", +"c8544e81": "addGenesisPairs()", +"c854db91": "vault_refund(address)", +"c85501bb": "minThreshold()", +"c855d689": "returnLongAddress(bytes32,uint8,bytes32[2])", +"c855e7bb": "tokenForTeamGranted()", +"c8578967": "setNewChecker(address,address)", +"c857a88c": "createDataRequest(address,address,uint256,uint256)", +"c8582572": "affiliateCommission(address)", +"c8583ad6": "UnregisteredPrefix(string,address)", +"c8583e69": "getEthUsdRate()", +"c858c017": "testMsgSenderInVoters()", +"c859c482": "holdBalanceOf(address)", +"c85aff48": "tokenNAVMicroUSD()", +"c85b7941": "totalEthBankrollReceived()", +"c85bb02a": "isParticipating(uint256,address)", +"c85bb1f7": "_doMapAuto(address,string)", +"c85bc22d": "getDefrostFactor()", +"c85c11eb": "TOKEN_SECOND_PRICE_RATE()", +"c85c75b2": "completeCodeUpdate()", +"c85dba67": "getPrefix(uint32,int256)", +"c85e07b9": "stamp()", +"c85e0be2": "setHost(address)", +"c85e1f73": "totalRecalled()", +"c85ee477": "FileCoinCash()", +"c85f6a80": "emission(address)", +"c85fd4f8": "deployToken(string,string,uint8,string,address,bool,address)", +"c86039da": "redeemedSupply()", +"c8612b2f": "TOKENS_FOR_SALE()", +"c861f243": "_getBonus(uint256)", +"c861f3a0": "houseStake()", +"c8622c24": "claim(address,bytes32)", +"c86283c8": "withdrawTo(uint256,address)", +"c862a134": "feePercent_()", +"c8636bb9": "forbidToken(address[])", +"c8643bc2": "MintOperationEvent(address,uint256,uint256,uint256)", +"c864e760": "recordCommissionEarned(uint256)", +"c865164b": "StakingPriceFeed(address,address,address)", +"c865c29b": "HopiumCoin()", +"c865cadb": "setActiveValueBonus(bool)", +"c86662a3": "addOwner_(address)", +"c86779a4": "lastBlock_v14()", +"c867cccb": "Contribution(address,address,address,address)", +"c867ea63": "GoldConnect()", +"c867fa29": "BookERC20EthV1p1Factory()", +"c86813a8": "PassContractorCreator()", +"c8685f21": "validUsername(string)", +"c868a569": "canBreed(uint40,uint256,uint40,uint256)", +"c8690233": "pubkey(bytes32)", +"c8691b2a": "getHistory(uint256)", +"c8695e59": "RPS(bytes32,address)", +"c86a90fe": "sendCoin(uint256,address)", +"c86a9dea": "isKickoffEnabled(uint256)", +"c86b7001": "randomOrgAPIKey()", +"c86c50f7": "changeAllowInvestment(bool)", +"c86d0251": "_getTeamSupportAmount(uint256,uint256)", +"c86dca5a": "isExploring(uint256)", +"c86e25d7": "tokenCreateContract()", +"c87022d3": "startMonarchyGame(uint256)", +"c8705544": "payAmount()", +"c870ef78": "MINING_POOL_HOLDER()", +"c8713608": "HELIX()", +"c87158fa": "_addBlockProducer(uint256,address)", +"c87235fd": "burnRemaining(address)", +"c872da3c": "KIND()", +"c8738351": "uintFloor(uint256,uint256)", +"c8744434": "lastTransferQueueIndex()", +"c8750d8a": "testHitSoftCapPresale()", +"c8756f12": "getTotalSponsorship()", +"c875b1fb": "distributeBonuses()", +"c875d16f": "ArthurStandardToken(uint256,string,uint8,string)", +"c8765ff2": "rateICO()", +"c87744d9": "_approvedForTransfer(address,address,uint256)", +"c8781368": "freezedMoment()", +"c8788134": "discountedPrice()", +"c878851d": "setCreate(bool)", +"c878dad9": "multiFreeze(address[],bool[])", +"c8796572": "collectFees()", +"c87a31cd": "fillOrder(bytes32,address[5],uint256[6],uint8,bytes32,bytes32)", +"c87b36ed": "disableBetting()", +"c87b56dd": "tokenURI(uint256)", +"c87be1af": "recoverHashSigner(bytes32,bytes)", +"c87c07de": "deprecateMeleeSubtype(uint8)", +"c87cfe63": "setData(uint256[])", +"c87e5613": "setMaxTokenBuyin(uint256)", +"c87e8bd0": "icoRound6()", +"c87f9386": "setAllItemActive(address,address,bool)", +"c8804b7b": "DSC()", +"c88098f2": "setParticipationFee(uint256)", +"c880fab1": "dragonTreasureToken()", +"c8813ffd": "addToVIPList(address[])", +"c881b3c0": "AllowedGasPriceUpdated(uint256)", +"c88215e7": "calculateExcessBalance()", +"c882acc8": "deleteMemberOfGroup(address,uint256)", +"c882ee8c": "testUint(int256,uint256)", +"c882ef92": "GameOpened(uint256)", +"c8830ddf": "ECryptoToken()", +"c883346e": "_getProviderIsForRent(uint256)", +"c8833f56": "setTiersInfo(uint8,uint256[],uint256[],uint256[],uint256[],uint8[2])", +"c883d3fa": "addMappingForPlayerIDs(uint256,uint256,uint256)", +"c88449a1": "_getTransferFeeAmount(address,uint256)", +"c8852b5b": "getBirthCut(uint256)", +"c8857dcd": "setOperateMode()", +"c885bc58": "withdrawReward()", +"c885e92d": "contlength()", +"c8860f41": "getWinningChoice(uint256,uint256)", +"c886594d": "getNodeEnabledStatus(address)", +"c8865c0e": "allocated24Months()", +"c886ec0d": "getTreasureProbabilityType(bytes32)", +"c888fafd": "bankerDepositPer()", +"c888fcc3": "getPollResult(uint256)", +"c8894a0c": "WMToken(address,uint256)", +"c88961da": "createKingdom(string,address,address,address)", +"c88996d6": "MessageCallTransaction(bytes,uint256,uint256,address,uint256,uint8,uint256,uint256)", +"c889e0de": "finishAirdropBy0Eth()", +"c88b675b": "setMaxAvailableSpot(uint256)", +"c88b77e0": "grantTeamAdvisorToken(address)", +"c88b7c8e": "setConversionFee(uint256)", +"c88bf75a": "applyRaises(uint256[])", +"c88c5101": "investor_bonus()", +"c88cc6ac": "getCertification(address)", +"c88e662e": "externalSales(address,uint256)", +"c88fd3ec": "changeIcoRate(uint256)", +"c88fe1fa": "maxCapMintTransfer()", +"c890635a": "ownerSale(address,uint256)", +"c890f27e": "GenChipByWeight(uint256,uint8,uint256[])", +"c891a29d": "setEpochData(uint256,uint256,uint256,uint256[],uint256,uint256)", +"c8922057": "MAXUM_SUPPLY()", +"c89231b3": "mintForInvestor(address,uint256,uint256)", +"c892693b": "setMotAddress(address)", +"c892cfdf": "amountRised()", +"c8931355": "setONTExchangeRate(uint256)", +"c893ae0b": "ptToPtwo()", +"c894e1e5": "setTransferFeeRate(uint256)", +"c895304b": "newDaoRulesProposal(uint256,uint256,uint256,uint256,uint256,bool,address,uint256,uint256)", +"c89547f9": "adminSetTxFeeInviteGame(uint256)", +"c89550a8": "BMICoin(address,address)", +"c89605a2": "DEALERWIN()", +"c8961644": "unBan(address)", +"c89924da": "totalTokensForSaleDuringICO2()", +"c8997121": "forwardFunds(uint256)", +"c899fa77": "hodlerTotalValue3M()", +"c89a32ab": "releaseTargetToken(uint256)", +"c89acc86": "send(address,bytes)", +"c89b50c7": "credit(address[],uint256[])", +"c89b7d8c": "buyCommonTTWByETH(uint256,address)", +"c89b989e": "lckTokenAddress()", +"c89baff5": "GoldenGate()", +"c89cea99": "getMyAnts()", +"c89d6063": "claim(bytes32,uint256,address,uint8,bytes32,bytes32,bytes32[])", +"c89dcfce": "mint(address,bytes32,uint256)", +"c89e4361": "delegate()", +"c89e528e": "receiveCreateAuctionFromArray(address,address,uint256[],uint256,uint256)", +"c89ec68a": "startRecovery(address,address)", +"c89f2ce4": "funds()", +"c89f51ef": "createPromoRabbit(uint256,address)", +"c89f8f08": "testGetController()", +"c89faa72": "confirmTransferItem(address,address,string)", +"c89fb5f0": "ethunpause()", +"c89fcf58": "setNoviceDungeonId(uint256)", +"c8a1becb": "_monthToNumber(string)", +"c8a1e1c7": "sendInternally(address,uint256)", +"c8a2c880": "setCallStack(uint256,uint256)", +"c8a2cc03": "strikersMetadata()", +"c8a2e0bc": "addCustomerReqACC(address,address,address,address)", +"c8a3af72": "is111bit(uint256)", +"c8a45c44": "tokenMaturityPeriod()", +"c8a48d71": "removeStep(bytes16)", +"c8a4ac9c": "mul(uint256,uint256)", +"c8a4c767": "kickCommitteeVote(address)", +"c8a4ddc3": "resetBatches(address,address)", +"c8a4e001": "EarlyPurchaseAmended(uint256)", +"c8a59bb6": "GrTokenTest()", +"c8a5e6d7": "transferFundAndEndGame()", +"c8a635b7": "setWeiRate(uint256)", +"c8a6dab7": "test_tokenFreeze()", +"c8a71e14": "bonusCalculationFactor()", +"c8a73eca": "transferOpen()", +"c8a7432f": "getPreIcoPurchase(address)", +"c8a76494": "Bet()", +"c8a7836e": "getFINMigrationRecord(address)", +"c8a808d6": "avatar(address,address,uint256,uint256,bytes)", +"c8a814b8": "firstSend(bytes32)", +"c8a830ba": "max(uint256)", +"c8a83384": "allowBurns()", +"c8a8ac2e": "submit(uint256,bytes32,bytes32,bytes32)", +"c8a90f76": "handlePresaleToken(address,uint256)", +"c8a9e841": "addCustomerFromKYC(address)", +"c8aafbc3": "NodeHash()", +"c8ac7014": "updateMerchantByAdmin(address,string,string)", +"c8ad27e6": "finishPre()", +"c8ad9645": "InactivityHolderResetBalance(address)", +"c8aded5d": "setDiscounts(uint256[],uint256[])", +"c8ae8774": "_startMegabox(uint256)", +"c8aef513": "preSendTTC()", +"c8aeff39": "isMarket()", +"c8af1538": "fallbackPayout()", +"c8af46b4": "canAnyoneBurn()", +"c8b08125": "tokensRemaining()", +"c8b0e68d": "getCEO()", +"c8b18b5b": "oneMonth()", +"c8b19fa8": "ioxToken()", +"c8b1a635": "pricePerCoin()", +"c8b21f18": "distributionuserFinished()", +"c8b26773": "startEnrollment()", +"c8b2ccba": "addStrand(uint256,address,bytes32,string)", +"c8b32089": "TokenLiquidityMarket(address,uint256,uint256,uint256)", +"c8b342ab": "getBid(address)", +"c8b35c7a": "BANANA()", +"c8b39eb5": "setEdCoreContract(address)", +"c8b413ad": "initialize(address[5],address,uint256[12],uint256,bytes)", +"c8b43c10": "isPausedCrowdsale()", +"c8b4c5b8": "MarketToken(uint256,uint256)", +"c8b4eb6e": "withdrawPresale(address)", +"c8b52bfb": "ChangeCost(uint256,uint256)", +"c8b56bda": "unregister_contract(bytes32)", +"c8b5da66": "pressButton()", +"c8b6a463": "ASUT()", +"c8b70559": "_endContestIfNeeded()", +"c8b7c3ee": "MITCoin()", +"c8b7e8c3": "testMakeBet()", +"c8b82220": "registerNameIP(string,string)", +"c8b91531": "MINOR_VERSION()", +"c8bb32e0": "updatePosition()", +"c8bb73ef": "testGetBitsFailIndexOOB()", +"c8bb7d51": "unitRareGrowth()", +"c8bc2452": "LuJiaZuiToken()", +"c8bc429a": "removeDividendPathway(address,uint256)", +"c8bc6fa0": "maxCapEth()", +"c8bd14ef": "totalInvSupply()", +"c8bd1d13": "VERIME(address)", +"c8bd3782": "OsherCurrentICOPrice()", +"c8bdbfb6": "withdrawUnsoldTokens()", +"c8bdc0c7": "RevokeDOT(bytes32,bytes)", +"c8bf3388": "totalIRCAllocated()", +"c8bffa93": "tier1End()", +"c8c01a55": "request(address,uint256)", +"c8c08a89": "_isOfficialApps(address)", +"c8c0b288": "bountyFundManager()", +"c8c0cbbb": "setLockedAccountThresholdUsd(uint256)", +"c8c1a400": "infoAboveSpot()", +"c8c21594": "releaseByStage(address)", +"c8c2ed54": "tokenAssignmentControl()", +"c8c2fe6c": "acceptManagement()", +"c8c365fc": "nowday()", +"c8c388eb": "RegBase(address,bytes32,address)", +"c8c3b926": "changeDragoDao(address)", +"c8c5139d": "setUserDisplay(address,string)", +"c8c67ca1": "transferValuebyAddr(address)", +"c8c719d2": "MangachainToken(address,address,address,address,address)", +"c8c72bb4": "TEAM_RESERVE_FTX()", +"c8c749ec": "preTgeManager()", +"c8c75647": "setVerified(address)", +"c8c79643": "addBurningMan(address,uint256)", +"c8c89fa5": "secretBids(address)", +"c8c9b1f8": "shouldVerifySegment(uint256,uint256[2],uint256,bytes32,uint64)", +"c8c9d745": "userLookup(uint256)", +"c8ca645f": "getName(string,string,address)", +"c8cada78": "oraclize_query(uint256,string,bytes[2])", +"c8cb60bb": "cancelBid(bytes32,uint8,int32,bool)", +"c8cb7d04": "Kristina()", +"c8cb8677": "WithdrawMyTokens()", +"c8cb8a75": "setCreator(address,uint256)", +"c8cb985a": "callDividend()", +"c8cc5cd8": "distributeYield(uint256)", +"c8cc9cc2": "getElement(address)", +"c8ccaebc": "extendedTimeLock()", +"c8cd09ae": "TransferredPreBuyersReward(address,uint256)", +"c8cd65e5": "processDeposit(address,uint256)", +"c8cddd61": "test_validShouldBe3_increaseTimeBy30000()", +"c8ce122b": "checkJackpot(address)", +"c8ce2fec": "lifetimeDeposits()", +"c8ce30b0": "blocksForWei(uint256)", +"c8ceaa95": "mint(bytes32,int256,address,uint256)", +"c8ceae12": "tavernContract()", +"c8cf4722": "getRequestsLength()", +"c8cf67a1": "buySmartSpeed()", +"c8cfb032": "getPlayerByAddr(address)", +"c8cfd490": "UNLOCK_TEAM()", +"c8cfe153": "revealVote(uint8,string)", +"c8d0ec0a": "reduceAllowance(address,address,uint256)", +"c8d172d6": "getTokenInfoNonce()", +"c8d1c017": "addUIntValue(bytes32,uint256)", +"c8d1cf4a": "tokenPriceForMainICO()", +"c8d3db82": "getPresaleMaxValue()", +"c8d47f16": "replaceLogic(address)", +"c8d4b389": "approveAndCallPreSigned(bytes,address,uint256,bytes,uint256,uint256)", +"c8d508fa": "test_insert_findNoHintUpdateTail(int256)", +"c8d50d7c": "nextBackWindowAdjustmentRatio()", +"c8d52ee3": "refundTransfer(address,uint256)", +"c8d61985": "setCryptoAgent(address)", +"c8d689b1": "addAllowedLock(uint256)", +"c8d840fa": "EventEmergencyContinue()", +"c8d86e35": "bullToken()", +"c8d88829": "oslikiFoundation()", +"c8d8cf88": "appIndex()", +"c8d942b5": "Travelerscoin()", +"c8d9c042": "AuctionCreated(uint256,uint256,uint256,uint256,bool)", +"c8d9ebc4": "getTomato(uint8)", +"c8db6a42": "functionCalling(address)", +"c8db6af9": "getCompte_14()", +"c8dc60ca": "vehiclesByCity(bytes32)", +"c8dc7e19": "setReconciliationDate(uint256)", +"c8dd64ea": "daVinciAddress()", +"c8dd6ce7": "getPlayerDetails(address)", +"c8dda301": "VOTING_START_BLOCKNR()", +"c8dda71c": "HistoryUpdated(string,uint256[])", +"c8ddf66f": "MMChainToken()", +"c8df5da0": "BOSHICoin()", +"c8e0f101": "userPlay()", +"c8e11521": "TripBitToken()", +"c8e13bb4": "fit()", +"c8e1fe3f": "getCountriesOfCampaign(bytes32)", +"c8e2190d": "_cancelOperation(bytes32,address)", +"c8e2fca0": "use(address,address,uint256,uint256,uint256,uint256,uint256,string)", +"c8e32074": "returnFrom(address,uint256)", +"c8e49707": "activateExportFee(address)", +"c8e4acef": "playerByAddress(address)", +"c8e55708": "oraclize_query(string,string[1])", +"c8e566c6": "betInputToBytes(uint40,uint40,uint40,uint40,uint40)", +"c8e569a8": "stopICO()", +"c8e56acb": "FAPFundDeposit1()", +"c8e5f54f": "ArcanaToken()", +"c8e626f8": "checkDivsBalance()", +"c8e6b2a8": "logTimestampSet(uint256)", +"c8e6ba4d": "verifyTx(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[])", +"c8e6c7d9": "imin(int256,int256)", +"c8e706e2": "contractWallet()", +"c8e71424": "MotherDNAShare()", +"c8e788c1": "RELEASE_EPOCH()", +"c8e7ca2e": "getMsgData()", +"c8e7e5ef": "TOTAL_NUM_TOKENS()", +"c8e8ce63": "outsourceConfirmNode(uint256)", +"c8e8d6d6": "TheTokenE()", +"c8e8f487": "missedVerificationSlash(uint256,uint256,uint256)", +"c8e9fc8b": "testgas()", +"c8ea0cfa": "CoinmakeToken()", +"c8ea1f7f": "updateEntity(uint256,bytes32,uint256,bytes32,uint256)", +"c8ea429e": "closeCdp(uint256,uint256,uint256)", +"c8eab537": "randomJackpot(uint32,bytes32,uint32)", +"c8eaf28f": "addWhitelists(address[])", +"c8eb747a": "B42Token()", +"c8ec2eb8": "MUBEX()", +"c8ec57ed": "revokeConfirm(bytes32)", +"c8ed6253": "ManagedToken()", +"c8ede712": "makersAverageRating(address)", +"c8edf65e": "GetAndReduceFeesByFraction(uint256)", +"c8ee0c6b": "withdrawBySubscription(address,uint256,bytes32,string)", +"c8ee2da8": "setReputationIRNNodeShare(uint256)", +"c8ef8b00": "window2TotalSupply()", +"c8efd7af": "getResolverFee()", +"c8f07770": "funcThatReverts()", +"c8f09634": "visaOfferingsLength(uint256)", +"c8f099cb": "upgradeEvilMorty(address,address)", +"c8f0d741": "AlienFarmer()", +"c8f21d22": "TagadaTsoinTsoinCoin()", +"c8f2835f": "transferBack(address,uint256)", +"c8f288ad": "getPoo(uint256)", +"c8f3a9e1": "getLastRollOutput(address)", +"c8f3e5f0": "getParameterByTitle(bytes32)", +"c8f41706": "pausePhase()", +"c8f478e1": "SetChangePlatformFlag(bool)", +"c8f490c8": "numOfBalloonsTypes()", +"c8f5c3f9": "LNCHSale(uint256,uint128,uint256,uint256,uint128,string,uint128,string,uint128,string,uint128,string,uint128,string)", +"c8f5d8b0": "total_coins()", +"c8f803f8": "setUnitJadeStealingMultiplier(address,address,uint256,uint256,bool)", +"c8f87d36": "_register(uint256,address)", +"c8f88076": "emissionMasOneType(address[],uint256[],bytes32[],uint256)", +"c8f8d75d": "Config(uint8,address)", +"c8f98db8": "getWinningFaction()", +"c8fbbdda": "getGPSStartTime()", +"c8fca35e": "getBidHash(uint256,uint256,address,address,uint256,uint256)", +"c8fd39f7": "GetEthShop()", +"c8fd6ed0": "unstake(uint256,bytes)", +"c8fdc891": "numberOfMonarchs()", +"c8fddb80": "updateLemonCoinsRemainingToDrop()", +"c8fdf67d": "holdTransaction(uint256,uint256,uint256)", +"c8fe2065": "getSingleBetItemCount(uint256)", +"c8fea2fb": "collect(address,address,uint256)", +"c8fed3f6": "withdrawCashReserveFund()", +"c8ff80a1": "setMonsterClass(uint32,uint256,uint256,bool)", +"c9000726": "nextStep()", +"c90109fa": "removeSomeCWCsFrom(address,uint256)", +"c90189e4": "fechAllVoteResultPreStageByBlock(uint256)", +"c902c3ae": "bets(bytes32)", +"c902d1b6": "_checkClientSign(address,bytes32,bytes)", +"c902ee36": "tokensAvailable(address)", +"c9030ea0": "addMember(address,bool)", +"c904a2ee": "minAllowedReservingPercentage()", +"c906a5aa": "testDeleteVoter()", +"c906baa3": "GACFund()", +"c906c873": "limitCrowdsale()", +"c906cd68": "ForceCoinTransfer(address,address,uint256)", +"c90755e2": "secretaryGeneral()", +"c90763f0": "subAllocation(address)", +"c9079673": "last_payment_timestamp()", +"c90797ea": "suicideContract(address)", +"c907d53b": "getTakeOwnershipFee(uint256)", +"c9085820": "set_owner(bytes12,address)", +"c908f302": "searchPursesByAddress(address)", +"c9090c7f": "levelFourTokenNum()", +"c9099385": "addApplication(string,string,string,string)", +"c909b929": "closingTimePeriodTwo()", +"c90a6a8e": "MAIN_SALE_BONUS_PERCENTAGE_PHASE4()", +"c90aef26": "Fetch_Game_Board_Vitualization(uint32)", +"c90c205b": "CLAIM_AMOUNT_ETH()", +"c90c589a": "OAR()", +"c90c83a8": "scheduleCall(address,uint256,uint256,uint256,uint256)", +"c90c949b": "checkForBonuses(uint256,uint256)", +"c90cfb0b": "newFact(string,string)", +"c90d080a": "registerEvent(bytes)", +"c90d1431": "MYLASTTOKEN()", +"c90d2cd9": "createBallot(uint256,address,string,string)", +"c90de215": "ClockAuction(address,address,uint256,uint256)", +"c90f34f0": "Bitstarti(uint256,string,string)", +"c90f793e": "currentAgreement()", +"c90fc8ee": "allTotalSupply()", +"c90fda80": "countRC(address)", +"c9100bcb": "getClaim(bytes32)", +"c9101f6c": "increaseApproval(uint256,address,uint256)", +"c9102029": "_getTokens()", +"c9116b69": "myBalance()", +"c9116e4a": "yearThreeClaimed()", +"c911b56e": "isController(address,address)", +"c913b552": "getVersions(bytes)", +"c913f364": "addMoonPrizePool(uint256,uint256)", +"c914ef54": "SetAllow(address)", +"c91540f6": "getCurrentCompetitionValues(string)", +"c915fc93": "proposeUpgrade(address)", +"c91610cd": "transferDelegator(address)", +"c91752b2": "girlIdToAuction(uint256)", +"c91813ca": "testToBool(bytes)", +"c919992d": "changeBrokerImp(address)", +"c91b0149": "setWhitelister(address,bool)", +"c91b46c6": "claimHero()", +"c91bc856": "withdrawCAT()", +"c91c6fa5": "completeSupply()", +"c91ca6c7": "calculatePeerTokens()", +"c91cd9d0": "minimumNumber()", +"c91d7e9c": "getFee(bytes32[])", +"c91d956c": "setMinBalance(uint256)", +"c91e4cc8": "getItemsByTypeAndOwner(string,address)", +"c91e5ad6": "DatingTokenTest()", +"c91fc619": "getTotalOut(address)", +"c92015f6": "getAccountUnlockTime(address)", +"c9206ddf": "setSalvageable(address,bool)", +"c9219a7a": "verifyProof(uint256[2],uint256[2][2],uint256[2],uint256[8])", +"c921f647": "GiftSend(uint256,address,address,bytes32,string,bytes16,uint8,bytes24,uint16,uint16,uint256)", +"c92261b5": "set(bytes32,int256)", +"c922f446": "emergencyWd()", +"c9230c5d": "assetName()", +"c923c870": "getsysdayruns()", +"c9247058": "MasternodeRewardAddedToRewardPool(uint256)", +"c924c524": "secondSend(bytes32)", +"c924d441": "EnableTokenWithdrawals()", +"c92501b7": "setStopTime(uint256)", +"c926435c": "bonusInfo()", +"c926aae6": "kscSell(address,address,uint256,string)", +"c9270652": "returnLoanLength(uint256)", +"c92728a1": "_ballotIdToNamespace(uint256)", +"c9295bc6": "getOrgInfo(address)", +"c9296d14": "scheduleTransaction(address,uint256,uint256,uint256,bytes)", +"c929bdac": "notaioAccounts(address)", +"c929ccf3": "setTokenId(uint256)", +"c929d55e": "overrideTokenHolders(address[],uint256[])", +"c92a1ad8": "bonusPriceDeltaPerHour()", +"c92a1e26": "setting(bytes)", +"c92aecc4": "chi()", +"c92ba8b2": "add(address,uint32,uint128,uint128)", +"c92babd1": "SITMock(address)", +"c92cd4d3": "getNewTokenBalanceOf(address)", +"c92d2385": "transferPreSignedHashingWithPrefix(address,address,uint256,uint256,uint256,uint256)", +"c92d3ea9": "Amazon()", +"c92db04d": "VanMinhCoin(uint256,string,uint8,string)", +"c92e365f": "placeBid(address,uint256,uint256,uint256,bytes,int256)", +"c92f068c": "updateHpbNodeBatch(address[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[])", +"c92f3a0c": "GameICO()", +"c92f8954": "withdraw(address,uint256[3])", +"c932c71e": "USDsToken()", +"c932ca62": "setBuildersAddress(address)", +"c9330bfb": "ethToTokenConversion()", +"c9334051": "decodeAssets(bytes32[])", +"c9335f58": "worldwidegiftcode()", +"c9351571": "WorldCupToken()", +"c93685b8": "getQuorumPercent()", +"c937b0a9": "platinum()", +"c937da12": "addToPublicWhitelist(address)", +"c937e091": "SearchUserID(string)", +"c9380d3e": "DeciserToken()", +"c938acc8": "checkExistsOwnedPet(uint64)", +"c9393c62": "NewState(uint8)", +"c939625b": "LuckCashCrowdsale(uint256,uint256,uint256,address,address)", +"c939fd50": "remainingIssuableNomins(address)", +"c93a6c84": "setDefaultFee(uint256)", +"c93aac88": "setReleasingSchedule(address)", +"c93ab4c3": "checkTreesWatered(uint256[])", +"c93b9755": "mintAgents(int256,address)", +"c93c266e": "updateWalletAddress(address)", +"c93ce90f": "chefOwnerWithdrawal()", +"c93ceec8": "collectDividends(address)", +"c93cff84": "test_validContractBalance()", +"c93dd31a": "Blammascoin()", +"c93e253d": "balanceOfBasic(address)", +"c93e718b": "removeAddressesFromOperators(address[])", +"c93e8862": "_checkCap(address)", +"c93e8b15": "getActiveBuyOrders(uint256)", +"c9406e86": "crowdsaleEnds()", +"c940c1b7": "addCustomerHash(bytes32,bytes32)", +"c9410b76": "ClockAuction(address,uint256)", +"c942940c": "Sukaya()", +"c944a38e": "CharlyLifeLog(string,int256)", +"c9456530": "isRespectTimeFrame()", +"c945b53f": "lottoIdentifier()", +"c946f3af": "Standard_3()", +"c94727f0": "getWinChoice(uint256,uint256)", +"c947db81": "earlyWithdrawalFeePct()", +"c9498266": "hash_passcode(bytes32)", +"c949ba9b": "TokenBase()", +"c949c0c9": "_houseOf(address)", +"c94a18ba": "kpyGoalReached()", +"c94a5841": "BITVesting()", +"c94b0ac1": "CryptoTwitch()", +"c94b56e3": "isMinCapReached()", +"c94b5c3d": "cabbageToken()", +"c94bfdb1": "setTokenDescription(address,uint256,string)", +"c94c6787": "specialSend(uint256,address)", +"c94c79dd": "EtherTots()", +"c94d0eee": "oddEven(uint256,address)", +"c94d9caf": "createTxEth(address,uint256)", +"c94dc71e": "Satochi()", +"c94e643c": "grantTokens(address,uint256)", +"c94e6567": "fetchBlocks(address)", +"c94e7b5c": "icoTokenSupply()", +"c94f2d69": "ILOTContract()", +"c94f7983": "StillToGo(uint256)", +"c94fbd4b": "Reek()", +"c9507465": "useraddinverst(uint256)", +"c9511b59": "setAddressToken(address,address)", +"c95292c4": "EthlanceDB()", +"c95320db": "migrationPhase()", +"c9537838": "getExpectedBalance(address)", +"c954d4fa": "blendbacktest(uint32[],bytes32[],bytes32[],uint64[])", +"c9553010": "testDistributing()", +"c955457e": "getRandomArbiter()", +"c955b514": "addCancelled(bytes32,uint256)", +"c955bde2": "getExpirationRequest(bytes32)", +"c9567bf9": "openTrading()", +"c956d497": "helpWithdrawal(address)", +"c956db57": "WOLF3()", +"c957012e": "caps(bytes32)", +"c9580804": "setAccessManager(address)", +"c9584008": "registerTicker(address,string,string,bytes32)", +"c959467b": "setInterestDB(address,uint256)", +"c959ec57": "GetRocketStock(uint16)", +"c95acadd": "ethAuction()", +"c95ae083": "isMethodAllowed(bytes4)", +"c95bd3aa": "closePreSignedHashing(address,bytes32)", +"c95c0efd": "setBonusUnlockAt(uint256)", +"c95c0f7b": "getTransactionIds(uint256)", +"c95c1036": "calculateStakeAmountWithBonuses(uint256,address,uint256)", +"c95c16af": "imported(address)", +"c95c67dc": "ADVISORS_SUPPLY_LIMIT()", +"c95c9a83": "ThinkCoin(uint256)", +"c95d8e40": "clientSign()", +"c95e0909": "resetPlayer(address)", +"c95e81cb": "MyBet(uint8,address)", +"c95f79ba": "closeLeaderboard(uint16)", +"c95f8b91": "TransferFunds(address,uint256)", +"c95f95bb": "ComputedGainsRate(address,uint256)", +"c96027b3": "ethpaused()", +"c9613733": "startNextEra(bytes32,uint256,int256,uint256,int256,uint256,int256)", +"c961df66": "contract_period()", +"c9620770": "doVote(address,uint256,uint256)", +"c96266e8": "getDragonFight(uint256)", +"c96304e8": "balancesAddressDescriptionUpdate(string)", +"c9634f32": "randomContestant(uint256,uint256)", +"c9644b77": "retireAxie(uint256,bool)", +"c96492c4": "SspManagerContract(address,address)", +"c964e493": "getSpaceship(uint256)", +"c9651729": "firstLineWrong()", +"c9653bea": "MainExchange()", +"c96593a0": "The10ETHPyramid()", +"c965e1d3": "constructAPIParam()", +"c965ed7b": "OwnerReward()", +"c9660d07": "ownerSetEdgeRangeAndPayout(uint256,uint256,uint256)", +"c966865e": "notRandom(uint256)", +"c9679537": "HafizToken()", +"c968907f": "grantVestedTokens(address,uint256,uint256,uint256,uint256,uint256,bool)", +"c968aab3": "makeUntradable(uint8)", +"c968ac68": "getWin(uint64)", +"c9693411": "deliverPresaleFuelBalances(address[],uint256[])", +"c96adb01": "getUserBet(address)", +"c96c54a7": "airdrop(address[],uint256,uint8)", +"c96c8a1d": "ownerListMap(uint256)", +"c96cd46f": "suicide()", +"c96cea70": "updateUsername(string)", +"c96d2dfa": "getStateAndProof(bytes,uint256)", +"c96e5627": "numRegistered()", +"c96e785f": "setWhitelisted(address,address)", +"c96e83db": "firstContributorId()", +"c96e8fee": "Bury(address,uint256)", +"c96f3238": "getWithdrawAmount(uint256,uint256)", +"c96f5041": "addHash(string,uint256)", +"c971442c": "getDBs()", +"c971aade": "FINALSTSTEST()", +"c971b12b": "_onRandom(uint256,bytes32)", +"c9734ebd": "WatchLastPayout()", +"c97358df": "GGPCToken()", +"c973851d": "kMaxStake()", +"c97399d0": "_isOwner(address,uint256)", +"c973c2e3": "collectorAddress()", +"c9744029": "getPremium()", +"c974631b": "platformWithdrawalProposed()", +"c974947d": "unlockAddress(address[])", +"c975653d": "StartCity()", +"c9762f8f": "TooBigPriceDiff(uint256,uint256)", +"c976b4f9": "slowDump()", +"c976bbbb": "_compare(int256,bytes2,int256)", +"c976ce9c": "privateSaleLimit()", +"c977a7a7": "setUsdToEtherExchangeRate(uint256)", +"c9788631": "beneficiaryWallet()", +"c978a7bc": "inviteRate()", +"c978c45d": "setNewMessage2(string)", +"c978ee59": "fourthStageMintingDate()", +"c979113c": "nextStageEmission()", +"c9791e0d": "confirmBobIndirectPay(uint256)", +"c97a06ce": "isHardcapReached()", +"c97aae82": "NulsStandardToken(uint256,string,uint8,string)", +"c97ab7ca": "isICOClosed()", +"c97b5278": "XYZSecurities()", +"c97b6d1f": "updateBatch(int128[],uint128[],uint8[],bytes32[],bytes32[],bool)", +"c97be180": "lock(address,uint256,uint256,uint256)", +"c97c1505": "readRate(string)", +"c97c6353": "testHello()", +"c97ca645": "updateWeiPerWholeToken(uint256)", +"c97cc71e": "getTransferRawAddress(bytes)", +"c97cef81": "Shelter(string,string)", +"c97dc17b": "DatareumToken()", +"c97e8480": "delegatedTransfer(address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"c97ec033": "changeOverERC228(address,address,uint256,address)", +"c97f8363": "setBonusAddress(address)", +"c9801b50": "f_public()", +"c98031be": "hintURL(int256,bytes32,string)", +"c980c626": "setImage(uint256,string)", +"c98165b6": "createTarget()", +"c98166c0": "ethAmount()", +"c9818728": "candyCap()", +"c9819d1e": "GuardaRegistro(bytes32)", +"c982e353": "getCurrentPrice(uint256,uint8)", +"c9838930": "setReferralTokenContract(address)", +"c985c221": "get_all_levels()", +"c986cf7c": "defrostAdvisorsTokens()", +"c987a78a": "AISI()", +"c987c5a1": "userAdd(address)", +"c988d70f": "getDailyWithdrawLimit()", +"c9891384": "PendinglinesToLines()", +"c9894b5c": "taxValue()", +"c98a79fb": "getBallotLogN(address)", +"c98b7027": "bgb_per_Keos()", +"c98bd7da": "isWinner(uint256,uint256)", +"c98bdd2f": "year5LockAddress()", +"c98c3083": "OutcomeToken()", +"c98c6e08": "payAmountForLoanAtIndex(uint256,uint256)", +"c98cf6e3": "COBToken()", +"c98d3457": "alliance(address,address)", +"c98d9b83": "getTokensContractAddress()", +"c98e4149": "setKingdomFactory(address)", +"c98f0ad9": "getUnlockedBalanceLimit(address)", +"c98fc4d9": "adminSetConfig(address,address,address)", +"c98fefed": "convertFor(address[],uint256,uint256,address)", +"c99051dc": "getWildcardsRemaining(uint16)", +"c9912255": "gago()", +"c99252d3": "joinGame(uint256,uint8,uint8)", +"c99380c9": "getAttoTokensBoughtInICO()", +"c9940c31": "getPoolCandidateContract(uint256)", +"c994fe31": "setCompanyManager(address)", +"c995623e": "revealMove(bytes32,uint256)", +"c9956b05": "FMCToken()", +"c99749a8": "prepareWithdrawProposalGivenSplitProposalId()", +"c997c1e2": "mul18(uint256,uint256)", +"c99842f9": "startPreIco(uint256,uint256,uint256)", +"c998e9dd": "changeUserKeyFromRecovery(address)", +"c9991176": "addAdministrator(address)", +"c99a975d": "optInFcnMinGas()", +"c99ae8a7": "setFechaTax(uint256)", +"c99b1f28": "icoWeek4Bonus()", +"c99b27ad": "updateFirstWallet(address)", +"c99c3c62": "getCarProductCount()", +"c99d89fc": "PriceOneEnable()", +"c99d9ef7": "startIcoDate()", +"c99db1ba": "_calculateLockedPercentage(uint8)", +"c99dccf9": "getInvestor(uint256)", +"c99f3357": "DRAIN_DELAY()", +"c99ff644": "dilute(uint256)", +"c9a04e55": "getDailyEthProfit(address)", +"c9a0e252": "ICOParticipants(address)", +"c9a1d88b": "placeBet(uint16,uint16,bool)", +"c9a2ab19": "aragonDevMultisig()", +"c9a30482": "BurnableCrowdsaleToken(string,string,uint256)", +"c9a365a7": "foundationlock()", +"c9a3f228": "SCLCrowdsale(address,address,address,uint256)", +"c9a43b2b": "m_software(uint256)", +"c9a4faa6": "AdexContract(address,address,address,uint256,uint256,uint256)", +"c9a5003c": "lastHello()", +"c9a52d2c": "setBytesValue(bytes32,bytes)", +"c9a56efd": "getBetterBettingInfo2(address)", +"c9a6964a": "initializeOwnable(address)", +"c9a6b2a8": "addAuction(uint256,uint256,uint256,uint256,address)", +"c9a6e480": "tokenSupplyFromCheck()", +"c9a75d90": "setPI_edit_20(string)", +"c9a7623a": "buyingPrice(bool)", +"c9a77e3d": "totaleMsg()", +"c9a815bd": "setSpendingLimit(address,uint256)", +"c9a82aa8": "markCrowdsaleEnding()", +"c9a8baae": "myFirstLoop()", +"c9a99f19": "subscribeCaller(address,address,uint256,address,uint256)", +"c9aa013b": "Start5()", +"c9aa4cf8": "testHasTokens()", +"c9aa71b8": "getFlyingUnicorns(bytes32,uint64)", +"c9ab521f": "AddBook(uint256,string,address)", +"c9ac836d": "transferPet(address,address,uint64)", +"c9acab84": "left59(uint256)", +"c9ad51b5": "TOKEN_AMOUNT_ICO_STAGE1_PRE_SALE3()", +"c9ae5594": "countHand(uint8[])", +"c9af089f": "getOrCreateChildUniverse(bytes32)", +"c9af2418": "checkUp(address,bytes32)", +"c9b06a4b": "AECloudToken()", +"c9b0d97b": "canCollect()", +"c9b0eef4": "oracleItQuery(uint256,string,string,string,uint256,uint256)", +"c9b110cb": "getAmountOfWithdrawals(address,address)", +"c9b1a517": "Show_Doctor(uint256)", +"c9b1b2ae": "etherKing(uint256)", +"c9b25f0f": "transferEther()", +"c9b2a580": "UTTotalSupply()", +"c9b2e522": "getSymbol(address)", +"c9b31d4b": "getCurrentSecret()", +"c9b3e736": "getTokenSellPrice()", +"c9b44821": "FIRETRADES()", +"c9b46bbb": "test0_adding()", +"c9b4cb94": "BIBToken(uint256,string,uint8,string)", +"c9b4ddb2": "receiveLockedAmount(address,uint256)", +"c9b5757e": "refundBet(uint256,uint8)", +"c9b5e555": "founderAddr()", +"c9b67627": "NonActivationWithdrawal(address[2],uint256[8],uint8,bytes32[2],uint256)", +"c9b7ab8b": "getPostLink(uint256)", +"c9b8020d": "starbaseToken()", +"c9b86d43": "manualState()", +"c9b94eb9": "liabilityFinalized(uint256)", +"c9ba0d4d": "r9kAddress()", +"c9ba32f4": "COPPER_AMOUNT_NDC()", +"c9ba73a3": "getmypost(uint256)", +"c9ba93be": "getIndexFromAddress(uint256,address)", +"c9bba27b": "manualEmissionEnabled()", +"c9bbc8c0": "donkeyName(address)", +"c9bc0883": "transferFromForcibly(address,address,uint256)", +"c9bc2bf5": "updateSnipCoinToEtherExchangeRate(uint256)", +"c9bc5dbd": "requestCeilingRaise(uint256)", +"c9bd2893": "fines()", +"c9bebd90": "ownerAlias()", +"c9c08bb7": "tickerAddress()", +"c9c09ac8": "denyBundlingMultitoken(uint256)", +"c9c0c77a": "deposit(uint16)", +"c9c0f25e": "getAllWorkers()", +"c9c1db4a": "launchFund(uint256)", +"c9c1ed93": "testControlRegisterContractIdAgain()", +"c9c1eded": "EPYCOIN()", +"c9c22deb": "getStarDistanceInLyThousandths(uint8)", +"c9c286c6": "getUnitRafflePlayers(uint256)", +"c9c347b9": "EthereumOneToken(string,uint8,string)", +"c9c4405b": "CariNetPrivilege(uint256,string,string)", +"c9c447e0": "getGamePrize(address,uint256)", +"c9c4797d": "ParticipantAuthority()", +"c9c51578": "buyBronze(uint256,uint256,uint8,bytes32,bytes32)", +"c9c53232": "totalStakedAt(uint256)", +"c9c538aa": "to_binary(uint256)", +"c9c5b5b4": "migrate(string)", +"c9c6176c": "BidSubmission(address,uint256,uint256)", +"c9c666aa": "changeCardboardUnicornTokenAddress(address)", +"c9c798b3": "addToFreelancerAvgRating(address,address,uint8)", +"c9c7cb74": "_burnTokens(address,uint256)", +"c9c7ef25": "withdrawtime()", +"c9c80a56": "adminshipLevel(address,uint8)", +"c9c8580c": "makeOffer(uint256,bytes32,uint256,address,uint256,uint256,address,address,uint256)", +"c9c85ec6": "currentGameCost()", +"c9c8ffd2": "test_increaseBlockNumber30211()", +"c9c92c12": "transferWineFromVineyardCellar()", +"c9c92dc5": "getProposal(bytes32,string)", +"c9ca080d": "Indecoin()", +"c9cb0043": "supportTokenAmount()", +"c9cb0e9b": "emitNewSmartToken(address)", +"c9cb6f47": "distributeDifferentAmountOfTokens(address[],uint256[])", +"c9cb7204": "unsold()", +"c9cbc222": "PicAdded(address,uint256,address,bytes32)", +"c9cbf8c9": "saleExchangeRate3()", +"c9cc0498": "buyComission()", +"c9cc0ed5": "setGuardianSale(uint256,uint256)", +"c9cc1a05": "transferTokensToContributor(uint256)", +"c9cd40a2": "vestingEntries(address)", +"c9cda91f": "changeTokenAddress(address)", +"c9ce1c23": "KUEKeNParty(string)", +"c9ce624f": "buyBackFund()", +"c9cf03ce": "refundMoneyForUser(bytes32)", +"c9cf2d4e": "vault_deposited(address)", +"c9cfa6ba": "setAllocation(address,address,uint256,uint256[],uint256[])", +"c9cfac55": "refundCurrency(address,uint256,uint256)", +"c9cfe755": "sendUnsold(address,uint256)", +"c9d00764": "TokenPurchased(string,uint256,uint256,uint256)", +"c9d0320a": "_doExtendPoll(uint256,uint256,uint256)", +"c9d07650": "NetkingToken(uint256,string,uint8,string)", +"c9d12d11": "RC(address,uint256,uint256,uint256,uint256)", +"c9d2373b": "marketKnowledge()", +"c9d256ae": "tokenSaleLeft()", +"c9d27afe": "vote(uint256,bool)", +"c9d27bcf": "doDisputeMemoryAccessSequence(uint256,bytes32)", +"c9d2d217": "TokenState(address,address)", +"c9d34622": "diffDays(uint256,uint256)", +"c9d4623f": "engine()", +"c9d57328": "managePlayer(uint256)", +"c9d66690": "RedeemEvent(address,uint256)", +"c9d68389": "airdropper()", +"c9d7d862": "drawFundsAfterTransfer(uint64)", +"c9d82560": "RewardBonusTimePeriod()", +"c9d82c96": "ICO_DURATION()", +"c9d96393": "updateGenVault(uint256,uint256)", +"c9d9c2b4": "deathData_a0()", +"c9dab438": "Subrosa()", +"c9dac221": "Bussines_Card(string,uint256,string,address)", +"c9db1bbf": "setPreICOStartDate(uint256)", +"c9db2bbd": "addPendingContribution(address,uint256,uint256)", +"c9dbc259": "ExchangeSwitch(bool)", +"c9dca9ba": "changeTokenMinter(address)", +"c9dd3a56": "annualInterestUpdateToken()", +"c9dd915f": "checkPremium(address)", +"c9ddd118": "checkPersonalRemaining(address)", +"c9ddd12f": "getTimestampOfDayEnd(uint256)", +"c9de31c7": "EOToken()", +"c9deb567": "collectionsAvailable()", +"c9dfa731": "lost(uint256,uint256)", +"c9e01787": "registerAffiliate(address[],uint256[],string)", +"c9e075c6": "showLockState(address,uint256)", +"c9e077e6": "bride()", +"c9e20791": "_setName(bytes32,string)", +"c9e25251": "buy(bool)", +"c9e3af7e": "currentBetLimit()", +"c9e3e66c": "secondCheckpointPrice()", +"c9e40106": "getConsolationPrizeTokenId(uint256,address)", +"c9e43221": "MIN_WTH()", +"c9e4d8bb": "isService(address,address)", +"c9e525df": "N()", +"c9e55b4e": "adminFixMaxSupply(uint256)", +"c9e6bef4": "_endsAt()", +"c9e7fd4b": "SovTokenCrowdsale()", +"c9e84346": "bonusLevels(uint256)", +"c9e904be": "totalEthRaised()", +"c9e9f4dc": "donateToLottery()", +"c9e9ff2c": "CPBWallet()", +"c9ea7c7c": "setMinimumFundingGoal(uint256)", +"c9ebb5e8": "freeMem()", +"c9ebeba6": "setIPFSParameter(string,string)", +"c9ec6cf6": "setOpenCloseHour(uint8,bool)", +"c9ecc566": "PurchasingAllowed(bool)", +"c9eda121": "setArrayIndexValue(bytes32,uint256,string)", +"c9ee21fa": "GUNS()", +"c9eea77c": "_updatePrice()", +"c9eebd9d": "modifyVictim(uint16,string,string)", +"c9ef5569": "getVolumeBonusPercent(uint256)", +"c9efa392": "bonusMilestones()", +"c9efda2c": "canStartAuction()", +"c9f09090": "populateTrancheTokens()", +"c9f0a02d": "burnAuction()", +"c9f166f8": "ctz32(uint32)", +"c9f1b7f0": "TeamToken()", +"c9f21fec": "setAuditTimeout(uint256)", +"c9f316dc": "getReferenceCodesOfAddress(address)", +"c9f3d62e": "getCarProductEarning(uint32)", +"c9f68025": "AMToken()", +"c9f73464": "maxCandidateId(uint256)", +"c9f84e1a": "unlockSecondPrivate()", +"c9f88f27": "invokeContracts(bytes)", +"c9f8cf20": "getCanvasesWithSellOffer(bool)", +"c9fa11df": "EventChain()", +"c9fa595b": "paused_3()", +"c9fa8f2d": "houseFeeHoldover()", +"c9faa7c5": "isActivated(address)", +"c9fb975c": "UnicornsSold(address,uint256,uint256,uint256)", +"c9fbdc36": "referral_fee()", +"c9fbe626": "TweetRegistry()", +"c9fca8a5": "rivetzRegister(uint256,uint256,uint256,address,address)", +"c9fd1955": "getVestingWalletLength()", +"c9fd83e2": "lastFeePeriodStartTime()", +"c9ff34ec": "privateTime()", +"c9ffb6e3": "claimPocketMoney()", +"ca001903": "AntarctiCoin()", +"ca00aad3": "closeLottery(uint256,string)", +"ca0157cd": "getGameIds(address)", +"ca01b37c": "DASToken()", +"ca01ba39": "generateTokens(uint256)", +"ca01d731": "XinfinUpgradeableToken(address)", +"ca02dbe3": "Requestprofit()", +"ca0370f7": "calculateCompoundContract(uint256,uint256)", +"ca03dab5": "withdrawSubdivsAmount(uint256)", +"ca03fdcd": "ShowADV()", +"ca04d26f": "transferReadable(address,uint256)", +"ca04e076": "getOwnerPixelCount(address)", +"ca051844": "withdrawBalance(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)", +"ca056aed": "addTokens(address,uint256,uint256)", +"ca06226d": "Ecopackcoin()", +"ca07218c": "setIt(address)", +"ca077f72": "allocate4ProjectToken()", +"ca0781a1": "getRateAndCheckCap()", +"ca079c52": "Upd(uint256,string,address,uint256,uint256)", +"ca087b96": "FlexFitRewards()", +"ca093888": "gameIsSundown()", +"ca0941b4": "findIdByHostPort(string,uint256)", +"ca0a992e": "IvyKoinContract()", +"ca0a9c2d": "makeUser(address,string,string)", +"ca0b1878": "addValue(address,uint256)", +"ca0b49ae": "getMyCarsIdx()", +"ca0c0a49": "gameActiveStrRef(string)", +"ca0c1e62": "computeMerkle(int256,int256,int256[],int256,int256,int256[])", +"ca0c2024": "minCapPre()", +"ca0c601c": "maxGoalInICO()", +"ca0c74be": "buyForInvestor(address,uint256)", +"ca0c9b5c": "storeTransactionData(address,address,uint256,uint256)", +"ca0cd7c0": "setUnlockLater(uint256)", +"ca0d01a6": "_yearTwoSupply()", +"ca0d0d82": "getMilestoneInfo(uint8)", +"ca0d6e48": "Mariton()", +"ca0d9564": "removeAdminList(address[])", +"ca0dcf16": "mintRate()", +"ca0e5c27": "ViewProjects()", +"ca0f1215": "initialSaleDuration()", +"ca0fe62a": "CryptoMemes()", +"ca0fe751": "switchRankings(uint8,uint64,uint64,uint64,uint64,uint64,uint64)", +"ca1149d1": "getUserEntryStatuses()", +"ca1314af": "getMax(uint256[])", +"ca13b818": "setWinningTeam()", +"ca13fb0f": "minInvestCents()", +"ca154008": "AssetContract()", +"ca15fb65": "getCardPower(uint256,uint256)", +"ca1637f5": "getGDemocsN()", +"ca169e66": "Voodka()", +"ca17cad1": "getBoxPrice(uint256,uint256)", +"ca185022": "foundersFundAddress()", +"ca1861aa": "stockCancelBuyOrder(uint256,uint256,uint256)", +"ca18da3f": "setGender(uint8,string)", +"ca18ebbf": "preICOPrice()", +"ca1929aa": "LogBeerRedeemed(address,bytes32,uint256)", +"ca1938e5": "houseCutPercentage()", +"ca1a2eb4": "localPaiementConfirmation(bytes32,bytes32)", +"ca1a3086": "transferChickenFrom(address,address,uint256)", +"ca1a4942": "CountExecs()", +"ca1a9433": "addZiekenhuis(address)", +"ca1aa5bb": "distributeReservedTokens()", +"ca1ab2ef": "divideByZero(uint256)", +"ca1ac5cb": "_createWhale(string,address,uint256)", +"ca1ad32c": "setPartnerPercent(address,uint16)", +"ca1b06b2": "ActionAuctionPlat(address,address)", +"ca1b5aa7": "allowUpgrading(bool)", +"ca1bf69f": "froze(address,uint256)", +"ca1c3bb3": "testNonExistingVoteWeight()", +"ca1c8895": "setPriceOfToken(uint256)", +"ca1d209d": "fund(uint256)", +"ca1d6f73": "doTeamMinting(address)", +"ca1e5bb7": "mintTokensByETHExternal(address,uint256)", +"ca1e9738": "getPricePerToken()", +"ca1ea20e": "dataMigration(address,address,address[])", +"ca1eb8be": "marketaWallet()", +"ca209c8b": "Bullexi()", +"ca2145a7": "CoinHot()", +"ca215005": "getIndividualPrice(address,uint256)", +"ca2156bd": "redenominate(uint256)", +"ca2177ef": "NSPFallback(address,uint256,uint256)", +"ca219b16": "XsearchToken()", +"ca2317dd": "changeReserveTeamRecepient(address)", +"ca2322c2": "mashToken()", +"ca2392f8": "sell(uint8,bytes6,uint32,uint32)", +"ca24034b": "deathData_v17()", +"ca2527e5": "batchTransfer2(address[])", +"ca256771": "weiPerUSDinTGE()", +"ca2571af": "lockedEarningsOf(address)", +"ca25bf6f": "IncubatorGlobalGas()", +"ca25e9c5": "setPurchaseRatios(address[],uint256[])", +"ca263a49": "registerDomain(bytes8,string)", +"ca2659dc": "commitPhasesDerived()", +"ca265c0f": "getCurrentSpend(address)", +"ca267f28": "getRecordCount()", +"ca2748bd": "transferAndFreeze(address,uint256,uint256,uint256,uint256,uint256)", +"ca276c07": "updateTierMinimum(uint256,uint256)", +"ca2785bf": "flushHouseFees()", +"ca278feb": "VanityURL()", +"ca27b214": "LucksToken()", +"ca27eb1c": "createListing(bytes32,uint256,address)", +"ca281fd9": "renounceControl()", +"ca28d2ae": "SEKCapitalToken()", +"ca292622": "getCompany(bytes32)", +"ca29cae8": "bufferWallet()", +"ca2a2f99": "_inMoney(uint256)", +"ca2acfff": "_getTokenAmountWithoutBonus(uint256)", +"ca2bf047": "predictPacks(uint256)", +"ca2c139c": "getCurrentQuickPromoBonus()", +"ca2cba95": "playerwithdraw()", +"ca2cd9d3": "marketactive()", +"ca2cef51": "MiningWarContract()", +"ca2d553a": "setAccessControl(address,address,uint8)", +"ca2dfd0a": "removeVerifier(address)", +"ca2dfff1": "notforked()", +"ca2e2f49": "firstVestedLockUpAmount()", +"ca2e8cc5": "markRedeemed(address)", +"ca2f281b": "FMC(uint256,string,string)", +"ca2f5a07": "PubRejected(address,string)", +"ca2f5cb4": "_addPauser(address)", +"ca2f6487": "Zettabyte()", +"ca2fd584": "getCommanderPot()", +"ca30597d": "BoomstarterPreICO(address[],address,address,uint256,bool)", +"ca30a279": "setTgeAsSaleAgent()", +"ca313539": "EMISSION_FOR_SALESTAGE2()", +"ca315ca6": "slashStake(uint256,address)", +"ca3181e0": "mint(address,uint32,uint256)", +"ca31879d": "claimToken(address,address)", +"ca3228d7": "_updatePlayersMilk(address)", +"ca325469": "destinationAddress()", +"ca3261c6": "giveAuthorization(address)", +"ca330563": "isRedeemed(address)", +"ca33a817": "_guardianVendPrice(uint256,uint256)", +"ca343d2b": "getICOBonusAmount(uint256,uint256)", +"ca34a0e3": "iterate_next(uint256)", +"ca34e1d6": "WineMarket(address)", +"ca35271c": "numDebtors(address)", +"ca35bff2": "setCaps(uint256,uint256,uint256,uint256,uint256)", +"ca36226d": "removeCrowdsaleContract(address,address)", +"ca3654e7": "requestBonus()", +"ca36695c": "setUsdPerEth(uint256)", +"ca368538": "randN()", +"ca37a9eb": "setWeiPerCent(uint256)", +"ca37dfad": "crossBalance()", +"ca37f7d9": "reserverWallet()", +"ca386496": "setPassword(string,string)", +"ca392c49": "setPreITO(address)", +"ca39e5ef": "fight(uint256,uint256)", +"ca3a3f0d": "_payTicketByEarnings(uint256,address)", +"ca3aa607": "LendToken()", +"ca3b5c91": "hasRelation(bytes,bytes,address)", +"ca3c7519": "getReffName(address)", +"ca3c8e11": "BRONZE_AMOUNT_NDC()", +"ca3c9147": "ownerHistoryEntry(uint256,uint256)", +"ca3dd175": "approveAuthority(address)", +"ca3e1176": "DaoRulesProposals(uint256)", +"ca3e1733": "ico1Tokens()", +"ca3e5333": "isFundManager()", +"ca3fc092": "CheckPrivilegeAccomplishment(uint256)", +"ca4028da": "BabyBorn(string,uint256)", +"ca408e14": "publishSerie(string,string,string,string)", +"ca414006": "setData_11(string)", +"ca41d16f": "SMTfundAfterPreICO()", +"ca4223ad": "LATIME()", +"ca42afda": "getGErc20ToDemocs(address)", +"ca43801a": "SelfDesctructionContract()", +"ca4398e3": "StellarToken(uint256,string,uint8,string)", +"ca43b191": "armySatelitesCount(uint256)", +"ca4401f1": "investor_addRefBonus(address,uint256)", +"ca440ca3": "decimalDiv(uint256,uint256)", +"ca441b85": "randomBlockStart(uint256)", +"ca446dd9": "setAddress(bytes32,address)", +"ca448a88": "revokeAsset(bytes32,uint256)", +"ca44c8e4": "testMemoryIntegrityCheck4Bytes()", +"ca46e41f": "CROSAIR_VOUCHER_LIMIT()", +"ca4742f1": "getRN(uint256)", +"ca482264": "GetApplicant(uint32)", +"ca482849": "_finalSupply()", +"ca4858af": "evacuateTokens(address)", +"ca48b0be": "setupToken(address,address,address)", +"ca4938fb": "totalFreezed()", +"ca495022": "weiFromExchange()", +"ca4a0298": "maxAirDrop()", +"ca4a2bf7": "NewTokensSold(uint256,address,uint256)", +"ca4a3df3": "winlose()", +"ca4b208b": "developer()", +"ca4b4fd6": "remove(bytes32[],bytes32)", +"ca4bb2b5": "printAllProducts(uint256)", +"ca4bc6ae": "getBurritoData(uint256)", +"ca4bd513": "FundsRefunded(uint256)", +"ca4c8fc6": "OneTestCoin()", +"ca4cbf67": "getUint(address,string)", +"ca4d1435": "GWGF(uint256,string,string)", +"ca4e02d0": "Jump(address,uint256,uint256)", +"ca4e4863": "VECTORZILLA_RESERVE()", +"ca4f0911": "preICOPush(address,uint256)", +"ca4ff630": "priceForStage(uint8)", +"ca5271a1": "funcWithoutArguments()", +"ca52cc86": "CollectibleOffered(uint256,uint256,uint256,address,uint256)", +"ca53135a": "min_bet()", +"ca5397c7": "cancelSellOffer(uint32)", +"ca5450ce": "any_customer_payments_yet()", +"ca5454db": "createTransferAgreement(uint256,uint256,address)", +"ca54ea4e": "pointOf(uint256)", +"ca5541c1": "nextRoundReserve()", +"ca555f2c": "setInitLockedAccount()", +"ca558b25": "DataContacts(address)", +"ca55954c": "getTokenHolder(uint256)", +"ca56106c": "testCopy()", +"ca561d4d": "KiemTraNamNhuan(uint16)", +"ca579642": "GroupBuy(address)", +"ca585774": "RewardForum(uint256)", +"ca588f14": "delAdmin(address,address)", +"ca58a06c": "managerKey()", +"ca58d2b4": "FUNDS()", +"ca58da1a": "changeReserve(address)", +"ca59f45b": "transferRecord(bytes32,address,uint256)", +"ca59fa8d": "_distributedTo(address,uint16)", +"ca5a3b4a": "isAllowedWhitelist(uint256,uint256)", +"ca5a3f38": "getDaysPassedSinceLastRefundBallot()", +"ca5a899c": "totalStashedPayouts()", +"ca5adadc": "processEthPulicFunding(address)", +"ca5b4207": "log8(uint8)", +"ca5b428f": "Police_2()", +"ca5b8a52": "REGULAR_CATEGORY()", +"ca5c058d": "founderTokensLockedUntil()", +"ca5c1547": "preSaleFirstPrice()", +"ca5c7a34": "getLand(int256,int256)", +"ca5c7b91": "lockedSupply()", +"ca5d0880": "airDrop()", +"ca5eb5e1": "setDelegate(address)", +"ca5f4282": "amountWanted()", +"ca607c4e": "transfer_other(address,address,uint256)", +"ca60f409": "CurrentIcePrice()", +"ca61295b": "removeFRA(address)", +"ca615662": "testFailCreateWithForeignParentNotInUse()", +"ca6158cb": "itemId()", +"ca61cdac": "testSub()", +"ca61e9b3": "verifyHashWithPrefix(bytes32,uint8,bytes32,bytes32)", +"ca621ac3": "DEVELOPER_RESERVED()", +"ca626232": "exchangeAdapterManager()", +"ca628c78": "withdrawToken()", +"ca632cc5": "bountyPaid()", +"ca639025": "getNujaRegistry()", +"ca63a55b": "getHotelsLength()", +"ca63b5b8": "freezingCount(address)", +"ca63f057": "DISCOUNT_STAGE_ONE()", +"ca6490cf": "elementFunction()", +"ca64a02d": "withdrawBalances(address)", +"ca64a095": "viewNextRelease(address)", +"ca64ad89": "getNotPayableTime(uint256)", +"ca64cd34": "marketCapRed()", +"ca6528cc": "increaseBalanceOrWithdraw(address,address,uint256,uint256)", +"ca6649c5": "joinGame(uint256,uint8)", +"ca668eb2": "MyERC20Token(string,string,uint256,uint256)", +"ca66a9c7": "blocktubeCoin(uint256,string,uint8,uint256,string,string)", +"ca67065f": "tokensAreFrozen()", +"ca67628f": "presaleFemaleEnd()", +"ca68968e": "ConversionRates(address)", +"ca68a45d": "createLastWill(address,string,string,string,uint256,uint256)", +"ca698873": "countWhitelists()", +"ca699de1": "StagedRefundVault(address)", +"ca69e323": "maxToken()", +"ca6ad198": "oraclizeMinCallbackGasPrice()", +"ca6ad1e4": "setCustomGasPrice(uint256)", +"ca6b72fd": "XtracoinToken()", +"ca6c7400": "getBuyerSignature(string)", +"ca6cf796": "startWinery(string,string,string,uint256)", +"ca6cfd95": "_createToken(string)", +"ca6d56dc": "addMember(address)", +"ca6d5d0c": "getLockedTokensInGroup_(address,uint256)", +"ca6f8295": "RDOToken()", +"ca7044c3": "RelentlessConscience2Token()", +"ca708230": "funnel()", +"ca709a25": "getFeeToken()", +"ca710013": "hasAllowanceToRecieveTokens(address,address)", +"ca7140ad": "playerForceGameEnd(uint8,uint256,uint256,int256,uint256,uint256)", +"ca722cdc": "settleBet(uint256,bytes32)", +"ca7230e9": "transferFromRegister(address,uint256)", +"ca7275cc": "SpiceHours(address)", +"ca733c32": "commandAddress()", +"ca73419e": "addAddressesToBlacklist(address[])", +"ca7390ab": "mulDivCeil(uint256,uint256,uint256)", +"ca740c8b": "IncreaseFunding(uint256,uint256)", +"ca74124c": "addUser(uint256,uint256,uint256,string,string)", +"ca7423ad": "withdrawLocks(bytes32,bytes32,uint256,address,address)", +"ca7430ea": "transferunlock()", +"ca758f42": "stcMaxBonus(uint256)", +"ca75b954": "PRESALE_HOLDER()", +"ca75cbfe": "submitTransaction(address,uint256,address)", +"ca75d770": "m_Owner()", +"ca760021": "withdrawChamp(uint256,address)", +"ca761365": "getDebris(bytes32,uint8)", +"ca76e548": "updateRest()", +"ca76ecce": "gettotalBondDivs(uint256)", +"ca7729f7": "_parseIntScientificWei(string)", +"ca77a6e8": "handleALU(uint256,int256,uint256,uint256,uint256,uint256)", +"ca77ab65": "calculate()", +"ca77ab8a": "getNextFile(bytes)", +"ca77ba31": "totalIssuanceCurrentBalanceSum()", +"ca77ea25": "createTokenByAtes(address,uint256,string)", +"ca78e65b": "disableManuallyMintTokens()", +"ca790380": "AstatosToken(address)", +"ca792754": "_assign(address,uint256)", +"ca79e2f2": "mintLongTermTokens(address,uint256)", +"ca79f967": "abortInactiveFight(uint256)", +"ca7a08ef": "compensate(address)", +"ca7b15da": "tokenRate5()", +"ca7bfc5d": "FinanceChain(uint256,string,string)", +"ca7c4dba": "getEtherPrice()", +"ca7c4e35": "OmenoToken()", +"ca7c8d07": "Medcash(address,address)", +"ca7c9296": "calculateFundedValueTokenToken(address,address,uint256,uint256,address,uint256)", +"ca7c95f2": "PRE_SALE_20_BONUS_MIN()", +"ca7ca5b4": "removeMember(address,bytes32)", +"ca7d18fe": "CORPayCoin()", +"ca7dc5b1": "getNumberOfTweets()", +"ca7e321f": "startBuyBackDate()", +"ca7e88ba": "setOutcome(bytes32,uint8)", +"ca80b489": "setGenes(uint256,uint256)", +"ca8127d4": "tradingFeeModifiers(address,address)", +"ca819d35": "getUserIDByWallet(address)", +"ca82a7c8": "rentModified(uint256)", +"ca82b5aa": "playBps(uint8)", +"ca84c176": "bonusAfterPresale()", +"ca84d17d": "payLeaderAndDev()", +"ca855a57": "SecureEgg()", +"ca85dbfc": "quickSetStarterClasses()", +"ca862298": "BitcoinWorld()", +"ca8695a4": "resetNewTokens()", +"ca8786c9": "bacancyToken()", +"ca879753": "burnMe()", +"ca87cb2a": "MRASToken()", +"ca87e67e": "setSaleTime(uint256,uint256)", +"ca87eb50": "Seo(address,uint256)", +"ca8836d2": "isPending(uint256)", +"ca88552d": "stock(address)", +"ca887dc4": "getAllGameStatistic()", +"ca88a7b0": "_shareToReferer(address,uint256,uint256)", +"ca88b3b2": "destructAll()", +"ca88bd5b": "isAccountBlocked(address)", +"ca88c5bd": "_getChallengeSuccess(uint256,uint256,uint256)", +"ca899878": "depositForRelay()", +"ca8a2c08": "createEstate(int256[],int256[],address)", +"ca8ab933": "countInstructors()", +"ca8b39c8": "setRegionBlockUpdatedAt(uint256,uint256)", +"ca8b42e4": "max_index()", +"ca8ee75a": "read_u8_array()", +"ca8f8ff3": "isExist(uint256)", +"ca8f9651": "voterVotingTime(address)", +"ca922078": "fundingStage(bytes32)", +"ca929e12": "transform(uint8,uint8)", +"ca92a136": "result_hash()", +"ca940bba": "getPastBet(uint256)", +"ca94452d": "setCrowdsaleTransfer(address,uint256)", +"ca94692d": "abiSignature()", +"ca949a1d": "blackjackValue(uint8)", +"ca94a927": "UnicornManagement(address)", +"ca95402d": "ExpRegistrar()", +"ca965c3f": "transferCEO(address)", +"ca96d7fc": "claim(bytes32,bytes32,uint8)", +"ca970bac": "donateDivs()", +"ca972cd4": "registerNewAccount()", +"ca97a248": "MoveRerolled(uint256,uint256,uint256)", +"ca97d274": "updateTokens3PerEth(uint256)", +"ca990859": "getPlayedInfo(address)", +"ca997200": "getForecastData(bytes32,bytes32,bytes12,uint8)", +"ca9a06df": "calcReservedTokens(uint256,uint256)", +"ca9a9386": "getNickname(address,address)", +"ca9c2862": "getCrydrController()", +"ca9c4b33": "hatchEgg()", +"ca9ccd3d": "secondRoundTime()", +"ca9d07ba": "refill(uint256)", +"ca9d0f8d": "process2(uint256,address)", +"ca9defb7": "ownerTransferZTH(address,uint256)", +"ca9e1993": "_transfer()", +"ca9ec138": "toEthSignedMessageHashBytes(bytes)", +"ca9efc73": "left81(uint256)", +"ca9f0803": "reservedInvestors(address)", +"ca9fa49e": "halfyearteam_trade_date()", +"caa02e08": "winnerCount()", +"caa035d6": "getTokenSaleType()", +"caa03a3e": "getPlayerId(string)", +"caa0f0af": "devAllocateTokenInMinutes(address,uint256,uint256)", +"caa0f92a": "getNextTokenId()", +"caa14e36": "setGiveBirthType(bool)", +"caa25756": "registerProductContract(address,address)", +"caa3b6e4": "TicTacToe()", +"caa3d559": "TRCExchangeRate()", +"caa4041e": "getAccountLimit(address)", +"caa4c5d0": "assumeControl()", +"caa5aba2": "ConfigurableParameters(uint256,uint256)", +"caa648b4": "getTotalValue()", +"caa67873": "CreateKDT(address,uint256)", +"caa6fea4": "emergency()", +"caa7590d": "MIN_INVEST_BOARD()", +"caa774ed": "petOnLeaderboards(uint64)", +"caa7b4b8": "ABToken(uint256,string,uint8,string)", +"caa7be13": "ClientPaymentEvent(address,uint8,uint8,int256)", +"caa7fd06": "cancelBid(uint256,uint256,bool)", +"caa82ab2": "TokenSendFail(uint256)", +"caa872ae": "_takeAll(address,address,uint256)", +"caa877e7": "buyFor(address,address)", +"caa8e084": "div(uint32,uint32)", +"caaa2045": "addressToNumTowns(address)", +"caaacb12": "totalForMining()", +"caab0acc": "testThrowCreateRetracted()", +"caab21d2": "Ore()", +"caabe889": "inAllocationLockPeriod()", +"caac87d0": "airdropPlays()", +"caad5b18": "withDrawEther(uint256)", +"caade55b": "AddrPartnerPocket()", +"caaed302": "rejectMilestone(uint256)", +"caaee91c": "setProxyOwner(address)", +"caaf2dd7": "getInitialAnswerResult(uint256)", +"caaf6d21": "numLoveItems()", +"caafa055": "ROUND_7_PRESALE_BONUS()", +"caafc163": "process2(uint256,address,address)", +"cab0198f": "emitTokensToOtherWallet(address,uint256,uint256)", +"cab067c0": "initialiseCrowdsale(uint256,uint256,address,address)", +"cab09273": "getUsedPaymentSupply()", +"cab0f632": "changeSponseeAddress(address)", +"cab17220": "VotesNecessary()", +"cab36e92": "addHash(uint256,string)", +"cab37586": "partnerWithdrawed(address)", +"cab39db9": "_updatePhase(bool)", +"cab3ad2c": "BONUS_ICO_WEEK_ONE()", +"cab47da7": "RATE_FOR_WEEK2()", +"cab54df1": "testHitPresaleCapPreDistribute()", +"cab59238": "setTrust(address,bool)", +"cab5c0f1": "_incrementState()", +"cab60267": "getGameCalculatedStats(uint256)", +"cab63661": "setPublisher(address)", +"cab6eade": "_destroyDeed()", +"cab7e3d9": "purchaseCars(uint256,uint256,bool)", +"cab7f0cc": "test_insert_findWithHintNextRemoved(int256)", +"cab7f521": "invoke()", +"cab896dc": "gameCost()", +"cab925a3": "BurnReceipt(address,uint256)", +"cab9c32a": "sellLimit(uint256,uint256)", +"caba203d": "Loyalty()", +"cabb3a3a": "isAlphaNumeric(string)", +"cabc0f43": "isLotteryOpen()", +"cabc6589": "awardWinnings()", +"cabc737c": "_addMaster(address)", +"cabcaaa0": "associateWithFile(bytes32)", +"cabd27de": "Motion(address)", +"cabd734f": "reject(bytes32)", +"cabe0452": "getCampaign(bytes32)", +"cabe2c0a": "levelEndDate()", +"cabf72e5": "WSBCCoin()", +"cabf8493": "balancesImporter4()", +"cabfb934": "replace(address)", +"cabfd1bf": "allocateTokens(address)", +"cac07bbf": "distributeTeamCut(bool,uint256)", +"cac12d2d": "tokenGenerationCap()", +"cac35112": "tokenRelease()", +"cac37f93": "totalTokensWithdrawn()", +"cac3e64a": "checkToken()", +"cac3f6c9": "percOf(uint256,uint256,uint256)", +"cac625e6": "transferTokenOwnership(address,address,uint16)", +"cac6d78f": "ToexCoin()", +"cac6edd8": "rightLottery()", +"cac77df7": "__transferFromToICAPWithReference(address,bytes32,uint256,string)", +"cac7db8a": "addUserToList(address)", +"cac7fc71": "allBalances(address,address,address[])", +"cac8d538": "setERC20Contract(address)", +"cac92fe1": "Aeroneum(address,address)", +"cac952ae": "isValidCustomerTxPaymentForMCW(address,bytes32)", +"cac98d6d": "getCCH_edit_24()", +"cac9a94e": "changeWalletOwnerAddress(address)", +"cac9ffbd": "fillIndexedBid(uint256)", +"cac9ffee": "unWhitelistAddress(address)", +"caca66bd": "transferPlatformship(address)", +"cacb27f4": "_D_sendToTeamEthContract()", +"cacc24eb": "transferFromViaProxy(address,address,address,uint256)", +"cacca238": "getBaseAmount(uint256)", +"cacca4a0": "approveTransfer(uint256)", +"caccd7f7": "developerAddress()", +"caccd805": "daoPOLSKAtokens()", +"cacd7a66": "creatUserID(string)", +"cace12e6": "roundInfo()", +"cace467e": "cancelSell(uint256,uint256,uint256,uint256)", +"cace7bd3": "claimRewardK(uint256)", +"cace8f37": "dragonGirlLotteryNumber()", +"cacf1e0e": "getPaymentsCount()", +"cacf5a33": "calculateVestedAmount()", +"cacf66ab": "genesisTimestamp()", +"cacfa24a": "_isBuilt(uint256)", +"cacfb535": "unpackAll(uint256)", +"cacfd8e9": "playTypes(uint256)", +"cad079ed": "investedUSD()", +"cad0899b": "sum(uint256,uint256)", +"cad1c663": "getChildOperation(bytes32,uint8,uint8)", +"cad1d39b": "getPersonalAirdropUnlockTimestamp(address,address)", +"cad2042f": "O2OToken(uint256,string,string)", +"cad27ae1": "random(uint64,uint8)", +"cad283a0": "EtherBetIO(address)", +"cad3d24d": "calculateBoatFee(uint256)", +"cad41357": "darknodeBond(address)", +"cad461ea": "setWeiPerUSD(uint256)", +"cad4ae37": "_addToBlacklist(address)", +"cad60d17": "freezeTokens(uint256,uint256)", +"cad66781": "NumOfStudentsRequests()", +"cad6dd1f": "sumPreICOUSD()", +"cad7214d": "supplyRound4()", +"cad80024": "left58(uint256)", +"cad916ec": "DEVELOP_CAP()", +"cad93688": "Test2(uint256)", +"cad9639d": "DEXK()", +"cad9642b": "getReportCount()", +"cad987f5": "updateAppreciationStep()", +"cadaacbf": "g(address)", +"cadb1166": "modifyWhiteList(address[],bool)", +"cadb3031": "timeoutY()", +"cadb48d9": "contractCreationBlockTime()", +"cadb5236": "vestToAddressEx(address,uint128,uint8,uint32)", +"cadbead4": "Pentacoin()", +"cadc958f": "VoteOnTransferStarted(address)", +"cadca796": "setShareHolders(bool,uint256,uint256)", +"cadcbce4": "PartComplete()", +"cadd888b": "getRewardToken(uint256,uint256)", +"cade3a5d": "_createPixel(uint24,uint32,address)", +"cade4f31": "collected_crowd_vitas()", +"cade77fa": "readAddress(address)", +"cadec1b2": "Registrar(address)", +"caded61f": "saleRatio()", +"caded711": "subOpenRoomCount(address)", +"cadf338f": "valueOf(uint256)", +"cadf74e2": "_unclaimedChickenOf(address)", +"cae039eb": "getWishTime(uint256)", +"cae07d2a": "TOKEN_SCALE()", +"cae15051": "tokenReceived(address,uint256)", +"cae20b59": "getAnimalIdsWithPendingCostume()", +"cae21530": "fightZeroMonster()", +"cae270b6": "sell(address,address,uint256)", +"cae342f6": "dontShowMeInTrace()", +"cae39b6f": "compute_pi(uint256)", +"cae3c254": "publicFundingWhiteList(address)", +"cae3d482": "vehicles()", +"cae44e83": "EthereumCoin()", +"cae4d676": "sendRefund(address)", +"cae523c1": "testOwnedTryAuthUnauthorized()", +"cae57913": "addTwo(uint256)", +"cae5c8c3": "APP_STORE()", +"cae6047f": "INVERSE_BASIS_POINT()", +"cae61d2e": "offer(string,uint256,uint256,address)", +"cae6b9c5": "tapPoll()", +"cae6ff18": "SKPT()", +"cae774b3": "maxInterval()", +"cae8e284": "newProposal(address,uint256,string,bytes32)", +"cae8eb2f": "ctrtToken()", +"cae96610": "WorldWifi()", +"cae96926": "is_creator(address)", +"cae98d4f": "r1(address)", +"cae9a07d": "changeManager()", +"cae9ca51": "approveAndCall(address,uint256,bytes)", +"caeafe6a": "stageStartTime()", +"caeb2539": "PreSaleBuy(address)", +"caeb2e2c": "_emitSkillAreasSet(address,uint256)", +"caeb30e9": "Configurator()", +"caebb256": "channelManagerByAsset(address,address)", +"caec390e": "getinfolaff(address)", +"caec3c79": "getBatchTransfer(address,address)", +"caecc5aa": "turnrefund()", +"caed4f9f": "DataService()", +"caed80df": "registries(address)", +"caee04b5": "AddGameCategory(string)", +"caee1daf": "creationRateOnTime()", +"caee262c": "sharesRec(uint256,uint256)", +"caee3305": "firstVestStartsAt()", +"caee4e18": "CommunityVotes(uint256)", +"caee7c78": "grantsCreated()", +"caef2181": "GetTimeMultiplier(uint256)", +"caef5dec": "getSubPayeesCount(bytes32)", +"caef6a84": "ETHMONEY()", +"caefb79e": "setCaps(uint256,uint256,uint256)", +"caefc5d5": "SemfaxToken()", +"caefdbe9": "FWDaddrETH()", +"caf05ce3": "isStopPlay()", +"caf0887d": "split(uint256,uint256,uint256)", +"caf19e5a": "toText(bool)", +"caf1bb7c": "repoBase()", +"caf29765": "PERCENTAGE_DIVISOR()", +"caf306c2": "ratePerWeiInMainICO()", +"caf439cb": "angelBurn(address,uint256)", +"caf44683": "test2(uint256)", +"caf597f3": "INVEToken(address)", +"caf66171": "bigRoundMaxRoundNum()", +"caf6cb3f": "marketDefaultFeeHigh()", +"caf6e1c9": "setClosedManually(bool)", +"caf6fe1a": "randomGenes()", +"caf71743": "createSellOrder(address,uint256,uint256,uint8[],address[5][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[])", +"caf798d7": "transferRegion(uint16,address)", +"caf7caf1": "_multiplyDecimalRound(uint256,uint256,uint256)", +"caf807a1": "closeEth()", +"caf91b30": "airdrop(uint8,bytes32,bytes32,uint256)", +"caf9bf58": "getContributionsCount(address)", +"cafa1cde": "PajCoin223()", +"cafa22d7": "setLeftICOTokens(uint256)", +"cafab7e1": "viewPetitionShareholderWithAddress(address)", +"cafaed51": "deadlineParticipation()", +"cafb2202": "invested()", +"cafbc49d": "createProduct(bytes32,string,address,uint256,uint8,uint256)", +"cafbcc8a": "inInnerScope(uint256,uint256)", +"cafc0fbd": "isRegulated(address)", +"cafd3d52": "setUpCrowdsale()", +"cafe0e90": "setFee(string,uint256)", +"cafe2f19": "setReachCapped()", +"caff4b03": "Response(bytes32,uint256)", +"cb009d2c": "KellerWilliams(uint256,uint256)", +"cb00e7f8": "MCTContractToken(uint256,address)", +"cb0177a0": "disableAllocationModificationsForEver()", +"cb0195ee": "changeDeveloperTemplateAmountLimit(uint256)", +"cb01a9bf": "payRent(bytes32,string)", +"cb01c70c": "episodesNum()", +"cb01cd02": "masscreate(uint256,uint256)", +"cb01f15c": "GetLogMessageWarning()", +"cb01f431": "maxTokensToSaleInClosedPreSale()", +"cb0210a0": "updateReputation()", +"cb029785": "Aphrodite()", +"cb02ba28": "multiSend(uint256,address[])", +"cb030cee": "_reducerunmoney(address,uint256)", +"cb03e43b": "AnimalFoodToken()", +"cb040e0b": "createTemplate(string,bytes32,bool,address,bytes32,uint256,uint256,uint8,uint256)", +"cb04a34c": "getMarketTotalPar(uint256)", +"cb05b93e": "getEth()", +"cb076478": "getTicket(address,uint256)", +"cb07b94b": "getLastRegionId()", +"cb09abc2": "resolveProp(uint256)", +"cb09b0d0": "ownerAPI()", +"cb0a2d95": "HashtagToken(uint256)", +"cb0a3889": "setPreIcoStart(uint256)", +"cb0ab425": "getIPFSHash(address)", +"cb0b6161": "_calcRelease()", +"cb0b7b03": "setContributionMinimum(uint256)", +"cb0cedb8": "getFineLevelOfAddress(address)", +"cb0cfaa2": "finalizeProposalByVoterIndices(uint256,uint256[],bool,int256)", +"cb0d3133": "setEscrowedProjectBalances(uint256,uint256)", +"cb0d3981": "getMintForReportingParticipantTargetValue()", +"cb0ef7d0": "hgtRates(uint256)", +"cb0f86ab": "cards_black(uint256)", +"cb0fb059": "getNumberTwoArgs(address,bytes4,address,address)", +"cb10e0c5": "getLastDuel1()", +"cb10fa76": "safeToMul(uint256,uint256)", +"cb11526d": "moving()", +"cb117f0c": "approveAndCallAsContract(address,uint256,bytes)", +"cb122a09": "setFee(uint8)", +"cb12b48f": "me()", +"cb12be81": "prometheusShipMinted()", +"cb12fc1d": "LAMDEN_DECIMALS()", +"cb1374a2": "claimTokens(address[],uint256[])", +"cb146814": "baseETHBalance()", +"cb149b09": "unlockWorker(address,address)", +"cb14a5cf": "treeDetails(uint256)", +"cb14b170": "SubscriptionModuleImpl()", +"cb14d93b": "getHash(bytes,address,uint256)", +"cb1579ec": "checkOrderBatch(uint256[48])", +"cb15d07b": "getOfferAmount(uint256)", +"cb161f8a": "AddDiv()", +"cb16415f": "fundsToOwner(uint256)", +"cb1650b4": "createThread(string,string)", +"cb16d4a2": "sendEther(uint256,address)", +"cb16e6d0": "earlyParticipantWhitelist(address)", +"cb170735": "createBools(bytes32[],bool[])", +"cb192f2c": "setAdvertisingAddress(address)", +"cb19bf53": "Testtoken5()", +"cb1a32a4": "aotLength()", +"cb1a7b1d": "tokenDelta(address,address,address,uint256,uint256,uint256)", +"cb1aaa31": "distributed_bounty()", +"cb1ab340": "setFinancialAdmin(address)", +"cb1b82b7": "getuserbalance(address,address)", +"cb1ba60f": "voteOnElection(address,address,address,address,uint256)", +"cb1be21a": "configureWallet(address)", +"cb1c2b5c": "MIN_STAKE()", +"cb1c8b6a": "purchaseDefense()", +"cb1d8418": "getForkingMarket()", +"cb1d9d63": "setENGCommunityAddress(address)", +"cb1de087": "transferFromFST(address,address,uint256)", +"cb1e4389": "isMajorityConfirmed(bytes)", +"cb1fa715": "setSingleWithdraw(uint256)", +"cb1faac1": "leftVotes()", +"cb1fc276": "createPassportByOwner(address)", +"cb1fc7bc": "totalSzaboInBids()", +"cb207166": "LifeFactor_iv()", +"cb227cae": "getPOOL_edit_18()", +"cb22c0aa": "setBudget(address,string)", +"cb22d392": "windowFinalBlock(uint256)", +"cb22d41b": "numBeneficiaries()", +"cb22fd59": "setFeeCharge(uint64)", +"cb238ffa": "returnHashLong(address,uint256[3])", +"cb2410b9": "changeContentData(uint256,uint256,bytes32)", +"cb244f65": "koreanCitizen()", +"cb24e8f1": "Foorp()", +"cb254080": "TomToken()", +"cb25d9a2": "JFDToken()", +"cb27bdc1": "revealDeadline(bytes32)", +"cb27f28a": "endCrowdFund()", +"cb282253": "totalEthContributed()", +"cb28ba6a": "AIToken(uint256)", +"cb28c716": "createKycData(address,string,string,uint256,uint256,string,string,string,string,int256,uint256)", +"cb293e7a": "rentRentable(bytes32,address)", +"cb294dc5": "ULTRONEUM()", +"cb2971b1": "eosTokenAddress()", +"cb297ef0": "_performRenewal(uint256,uint256)", +"cb29881c": "createEggScheme(uint256,uint256,uint256,uint256,uint256,uint256,bool,bool)", +"cb29eee0": "medsupply()", +"cb2b34d6": "setSalary(uint256)", +"cb2b5668": "EVBChain()", +"cb2b9031": "addressToBytes(address,address)", +"cb2bea55": "setEmergencySecrets(uint256,uint256)", +"cb2c05dc": "viewInitialPricePerShare()", +"cb2c8723": "addUtilityHolder(address)", +"cb2e0814": "iii(address)", +"cb2e1d10": "icoRound4()", +"cb2e46f3": "endTimer()", +"cb2ec895": "deposit(bytes32,address,uint256,bool)", +"cb2f7b87": "update(uint32,uint128,uint128)", +"cb2f7c49": "hashDifficulty(bytes32)", +"cb2fe520": "remainingTokenBurnt()", +"cb31b6cd": "multiTransferFrom(address,address[],uint256[])", +"cb3204a8": "getKycHash(uint256)", +"cb338436": "doSendProfits(address)", +"cb33e7fa": "doTrade(address,address,uint256)", +"cb35ef2c": "demotest()", +"cb3687df": "core(uint256,uint256,uint256,uint256)", +"cb3694ba": "getManualInvestorsCount()", +"cb379765": "tsauction(uint256)", +"cb381b61": "teamETHUnlock1()", +"cb381c3c": "setGas4Token(uint256)", +"cb388b9b": "test_callIt()", +"cb38c7b4": "getWithdrawalList(address)", +"cb393ecb": "Dice5()", +"cb3993be": "decreaseApprovalAndCall(address,uint256,bytes)", +"cb39aafb": "validateRequest(bytes32[8],bytes,bytes,bytes)", +"cb3a11f9": "withdrawUserSpecifiedFunds(string,uint256,uint8)", +"cb3ab271": "WYQToken(uint256,string,string)", +"cb3ae150": "Playforbulktoken()", +"cb3b0c79": "LotToken()", +"cb3bc227": "LogBeerBought(uint256,address)", +"cb3c28c7": "trade(address,uint256,address,address,uint256,uint256,address)", +"cb3cb085": "validateTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address)", +"cb3ce26e": "m_owners()", +"cb3cf99a": "decode(bytes,uint256,uint256,uint256,uint256,uint256,uint256)", +"cb3d6b5f": "devTeamWithdraw()", +"cb3e394d": "transferFromWithFee(address,address,uint256,uint256)", +"cb3e64fd": "unhalt()", +"cb3ebec2": "ownerDividend()", +"cb3eecc9": "getNewInstance()", +"cb3eef2c": "allWorkers()", +"cb3fcb56": "setGrowthTokensPercent(uint256)", +"cb4153e9": "destroyNinja(uint256)", +"cb421a21": "denemekontrat()", +"cb424c24": "HZRToken(address)", +"cb42a77b": "stringTobytes32(string)", +"cb43269d": "getRegistryImplementation()", +"cb4360d9": "allocateToken(address,uint256,uint256)", +"cb43e079": "drain_block()", +"cb44211e": "addApproval(address)", +"cb44b53d": "ResolutionProposals()", +"cb457d47": "unlimited()", +"cb45a294": "getSecondTokens()", +"cb4717b2": "SetProperty(bytes32,uint256,uint256,uint256)", +"cb4735f2": "estimatedFundingAmount(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"cb4799f2": "getMetadata(uint256,string)", +"cb47a8ce": "MultiChampion()", +"cb47abc7": "getTotalNumberOfTransactions()", +"cb48e1a5": "assignShareTokens(uint256)", +"cb4a15c5": "checkStringLength(string,uint256,uint256)", +"cb4b0105": "Unhold(address,uint256)", +"cb4b3710": "setStopSelling()", +"cb4b9db1": "EchoChainToken()", +"cb4bc2e9": "tryauthenticate(bytes)", +"cb4bd883": "updateRef(bytes32,string)", +"cb4be0bb": "getTurtlemasterReq()", +"cb4c86b7": "funding()", +"cb4c88ae": "MediatedTransferStatusModified(uint256,bool)", +"cb4c8ee4": "isRSPScience()", +"cb4d3d67": "AddedTokenHolder(address,uint256)", +"cb4de968": "ICO_BASE_PRICE_IN_WEI()", +"cb4e75bb": "smbl()", +"cb4e7fdc": "icoIsRunning()", +"cb4f1d85": "getPolicyHolder(bytes)", +"cb50301a": "unsoldAddr()", +"cb510e97": "isStaff(address)", +"cb51c418": "_toString(address)", +"cb51f777": "TOKEN_PRICE_NUM()", +"cb526229": "RefundChequeByHash(uint256)", +"cb52926a": "getBoughtAssetPacks(address,address)", +"cb52c25e": "updateAmountRemainingForSale(uint256)", +"cb553ac9": "sweepWizardCommission(uint256)", +"cb55adfb": "getStrategyTokenAndWeightByIndex(uint256,uint256)", +"cb560ac4": "winningMultiplier()", +"cb562fb3": "Uniond()", +"cb56d626": "testFailBlobStoreNotRegistered()", +"cb56dd79": "getFinalState(uint256)", +"cb56e40b": "getTrader(uint8)", +"cb574b8c": "buyUpgrade()", +"cb577480": "prepare(uint256)", +"cb5829ab": "Revision()", +"cb5853a8": "claimTaxex(uint256,uint256)", +"cb58594e": "airDropShadowMoney()", +"cb586251": "MintableMultiownedToken(address[],uint256,address)", +"cb5b6bef": "setPriceStep8(uint256)", +"cb5bf9b8": "EthersRaised()", +"cb5cf43f": "supplyReady()", +"cb5d0646": "Presale2Sold()", +"cb5e4805": "NvcFundCoin()", +"cb5e7d2d": "newMember(address,bytes20,uint64)", +"cb5e891f": "_setActiveSupply(uint256)", +"cb5f18db": "get_ads()", +"cb5fa63f": "getRoundEth(uint256)", +"cb5fd01f": "TestToken(address,address,address,address)", +"cb5fe36e": "VESTING_2_DATE()", +"cb60f8b4": "sellStartTime()", +"cb6142c9": "freezeAllAccountInEmergency(bool)", +"cb61522d": "MILLIODS()", +"cb61b42d": "updateShares(uint256,uint256,uint256)", +"cb61b49e": "_setRate(address,address,uint256)", +"cb6291cb": "ownerSendTokens(address,uint8,uint256)", +"cb6308f1": "approveVersion(address)", +"cb6367d1": "verifySignatures(bytes32,uint8[],bytes32[],bytes32[])", +"cb637d85": "changeAccountService(address)", +"cb639322": "realReserve()", +"cb63da4e": "ALLOC_RES()", +"cb63ddb6": "makeProposal(uint8,uint256)", +"cb642180": "_updateNodeHeight(bytes32)", +"cb645ae2": "addOneRequest(address)", +"cb64a37b": "createSeratioStake()", +"cb64d74d": "etherFeePercent()", +"cb656a13": "adviserSold()", +"cb65ad66": "MobileAppSupply()", +"cb65c0f5": "withdraw_excess_tokens(uint256)", +"cb662fe1": "claimedList(uint256)", +"cb67f20f": "SaleClosed(uint256)", +"cb67f948": "unlockTokens(address)", +"cb68780f": "GetICOData(uint256)", +"cb6890d9": "setAccount(address,uint256)", +"cb692928": "dataControlSetFeePropMaxGlobal(uint256)", +"cb6ad855": "log10Ceiling(int256)", +"cb6af4cb": "createChannel(string)", +"cb6b1f05": "cf2Wallet2Pct()", +"cb6b25f3": "votePassed(uint256)", +"cb6b8699": "getPI_edit_5()", +"cb6bfa03": "BNIToken()", +"cb6bfd23": "CyTestCoin(uint256,string,uint8,string)", +"cb6c1655": "tokensFor1EthP1()", +"cb6cec4b": "getIpfsAfterTitle(bytes32)", +"cb6d0c5f": "minimumDurationInBlocks()", +"cb6da9da": "takerCount()", +"cb6e3fa9": "shouldUpdateFunder(address)", +"cb70d9a7": "changeUserCertificate(bytes32)", +"cb712535": "_transferFrom(address,address,uint256)", +"cb7129a3": "resolvePriorBets()", +"cb724422": "testPayTokens()", +"cb739476": "MAGExCoin()", +"cb739c0f": "changeRateLoss(uint256)", +"cb740c61": "grant(address,uint256,uint256,uint256)", +"cb742358": "virtualBalanceOf(address)", +"cb752679": "buyTokensWithPoly(uint256)", +"cb757e92": "REGO()", +"cb758a89": "addDataPoint(uint256,bytes32)", +"cb76937c": "getUserBetsTimeStampInARazInstance(uint256,uint256)", +"cb7729d3": "shiny()", +"cb774d47": "startingIndex()", +"cb775d5a": "consumePower(uint256)", +"cb77ed34": "_getProviderSupply(uint256)", +"cb78bebc": "USER_BUY_LIMIT()", +"cb78c9f0": "flips()", +"cb795a64": "allowedBuy()", +"cb79d573": "maxCompanyValue()", +"cb79e31b": "votingRightsOf(address)", +"cb7a0a6f": "getPlayerSpaceshipBattleModeById(uint256)", +"cb7aac1e": "transferTokensFromProjectFundAddress(address,uint256)", +"cb7acdd9": "hola()", +"cb7b3f0a": "readPaymentChannels()", +"cb7b3fb9": "KinguinIco()", +"cb7b4ad4": "canCPCreateInFactory(address,address)", +"cb7b8673": "setTokenExchangeRate(uint256)", +"cb7bba39": "lockaddress(address)", +"cb7bba61": "prove(string,string)", +"cb7c05e7": "verify_fund()", +"cb7c225e": "Send_TrustlessTransaction(address,uint256)", +"cb7c30f2": "m_D_n()", +"cb7d38ac": "changeStartPreSale(uint256)", +"cb7d8ef2": "spark()", +"cb7e70fa": "buyTokensOnInvestorBehalf(address,uint256)", +"cb7e9057": "dispatcher()", +"cb7e9bf1": "rewardHistoryMapOf(address,uint256)", +"cb7ef63d": "Coinage(uint256,uint256,uint256,uint256,uint256,uint256)", +"cb7fd9db": "checkVeracity(string)", +"cb802c8b": "getInvoice(bytes32)", +"cb80bd60": "LogRefundFailed(address,uint256)", +"cb810ea9": "sendTokensSingleValue(address,address,address[],uint256)", +"cb81fecf": "lockRequestCount()", +"cb821f03": "calculateClaimByIndex(address,uint256)", +"cb82d5df": "canMakeNoFeeTransfer(address,address)", +"cb84e69e": "setMessageMaxCharacters(uint256)", +"cb8523c6": "addAllowed(address)", +"cb856252": "getFreezeList()", +"cb859c09": "getGameRules()", +"cb85f175": "WhiteListedInvestorAdded(address,string)", +"cb86df95": "moveStartDate(uint256)", +"cb8820ef": "setWriterId(address,bytes32,bytes32)", +"cb884207": "deathData_f5()", +"cb885a36": "Crowdsale(address,uint256,uint256,uint256,address,address,uint256)", +"cb89558d": "AgreementHashRu()", +"cb899024": "defrostToken()", +"cb8a67ed": "ownersForChange()", +"cb8b4b83": "CollectERC20(address)", +"cb8b99b2": "_addCryptantFragments(address,uint256)", +"cb8c2982": "getMyKebabers()", +"cb8c478a": "activeTime()", +"cb8cb4a3": "getGoals(address)", +"cb8cd7cb": "transferFee_()", +"cb8d0f46": "tstop()", +"cb8ff46f": "koinconekt()", +"cb908d78": "_updateEthereumPrice()", +"cb912ffb": "tokenCountSet()", +"cb918634": "setDrawP(uint256)", +"cb91a6ba": "setGemPerMiner(uint256)", +"cb91aec7": "getFreelancerContracts(address,address)", +"cb91f1c2": "periodPreITO_endTime()", +"cb92042c": "removeShare(address)", +"cb923813": "saled()", +"cb92bfa1": "_computeCurrentPrice(uint256,uint256,uint256,uint256)", +"cb92c28d": "rewardEvery1000Draw7(uint256)", +"cb92cb52": "BuyBackStart(uint256,uint256,uint256)", +"cb930934": "KopihitamToken()", +"cb93abb2": "BUYER_STEP_1(bytes32)", +"cb93e347": "CryptoGamesMarket()", +"cb93f7ef": "withdrawDevFee()", +"cb944e24": "saleCapUsd()", +"cb945312": "testEqual()", +"cb949213": "addressToPurchasedTokens(address)", +"cb949e51": "getCustomer(address)", +"cb94aa26": "withdrawBatch(address[],uint256[])", +"cb950c37": "updateValidMCAmount(uint256)", +"cb9580e0": "TotalPaid()", +"cb95a6f6": "Bounty(address)", +"cb96012e": "hashTo256(bytes32)", +"cb965ae9": "allKeys()", +"cb96b0d6": "MAX_EXCHANGE_FEE_PERCENTAGE()", +"cb96f11d": "Oversight()", +"cb9756ad": "buyClimateCoinsAgainstEther()", +"cb9854a2": "confirmSwap()", +"cb985708": "investorWalletAddress()", +"cb985dd1": "MARKET_SHARE()", +"cb990457": "holdersByIndices(uint256,uint256,bool)", +"cb991efe": "depositEscrow(uint256)", +"cb99cbac": "startServer(uint256)", +"cb99d98e": "_addWhitelisted(address)", +"cb9a20d0": "MINI_GAME_ADD_TIME_DEFAULT()", +"cb9a3251": "finalizeMany(uint64[])", +"cb9a32a5": "promoMasterpiecesCreatedCount()", +"cb9a5edd": "availableLand()", +"cb9aac64": "usesLibrary()", +"cb9ae707": "latestDifficultyPeriodStarted()", +"cb9b3a3c": "getCCH_edit_4()", +"cb9bdf45": "tokenSoftcapIssued()", +"cb9c8505": "throwIfStartPastBlocktime()", +"cb9d5eb4": "safeMove(address,address,uint256)", +"cb9d6176": "LogDelete(address,uint256)", +"cb9d86e2": "BlockRefunded(address)", +"cb9dd1a0": "setMoving()", +"cb9e2755": "deleteEntity(uint256)", +"cba01a49": "LunarLink()", +"cba0e996": "isExcluded(address)", +"cba1fa10": "set_iconiq_presale_open(address,bool)", +"cba25e79": "presaleHardcap()", +"cba2c735": "createPurse(string)", +"cba456df": "casinoProxy(address,address,address)", +"cba4bc94": "_setHowManyOwnersDecide(uint256)", +"cba4f643": "changePreIcoRate(uint256)", +"cba50fd1": "generateUserRelation(address,uint256)", +"cba58ab6": "disableService()", +"cba59827": "Reject()", +"cba5b465": "endContract(address,uint256)", +"cba6582e": "Ellomiun()", +"cba66250": "FTV(address,address,address,address)", +"cba66e14": "sliceBytes20(bytes,uint256)", +"cba6a3a2": "setTransferAuthorized(address,address,uint256)", +"cba74da1": "getResource(bytes32,uint256,bytes32)", +"cba88872": "countdown()", +"cba8901b": "getPayoutKeys()", +"cba8be1c": "setServerAdmin(address)", +"cba91a35": "roundTwoTime()", +"cba9a794": "handleReturnBool()", +"cba9c0e0": "presale_start_block()", +"cbaa0b25": "playerAttack(uint256,uint256)", +"cbaa0bec": "amendSingleResult(int16,string)", +"cbaba70f": "EADC()", +"cbac21b8": "periodPreITO_mainCapInUSD()", +"cbac8816": "tokenRate20()", +"cbaca250": "RewardSplit(uint256)", +"cbacb269": "stopBonusCompaign()", +"cbacffe4": "addToPayeeBalance(address,uint256)", +"cbad3779": "getPublisherRegistry()", +"cbad60b6": "spread(uint8)", +"cbad7bf6": "cg(address,uint256,uint256,uint256)", +"cbaddbaa": "BurnMe()", +"cbae0163": "readPosition(uint256,int256)", +"cbae0978": "NewResolver(uint256,address)", +"cbae1467": "deleteAllAvatars()", +"cbaeadb4": "getRewardHistory(address)", +"cbaedd3c": "slashUsername(bytes)", +"cbaf4742": "OPERATE_SUPPLY()", +"cbaf5104": "_isClosed(bytes)", +"cbaf566d": "updateRentInfo(uint256,uint256,uint256)", +"cbafee8a": "tokensToMint()", +"cbb01884": "setDefault(uint8,address)", +"cbb04cbd": "debtPaid()", +"cbb05527": "totalCapInWei()", +"cbb0c95a": "getPlayerWithdrawEarning(uint256)", +"cbb105d6": "NewWorld()", +"cbb1d761": "confirmBySigner(bytes32,address)", +"cbb2fd5d": "TRTToken()", +"cbb31da9": "maker(address)", +"cbb433ea": "DeepToken()", +"cbb45120": "TOTAL_WINS()", +"cbb45444": "test_transfer_to_contract_without_fallback()", +"cbb50d30": "teamAllocationTokenSend(address,uint256)", +"cbb6e5c9": "transferTopLevelDomainOwnership(bytes32,address)", +"cbb70c92": "addLOC(address)", +"cbb8b158": "TESTH()", +"cbb9818c": "turn_flag_ON()", +"cbb9dbb9": "depositCoupon(address[2],uint256[8],uint8,bytes32[2])", +"cbba3f4b": "DCSToken()", +"cbbacd48": "cliffs(address)", +"cbbaed1b": "incentiveDistributionMaxRounds()", +"cbbb2698": "checkBlackAccount(address)", +"cbbc1bf3": "setCosignerAddressForUser(address)", +"cbbc8504": "GnosisTalk()", +"cbbc8a51": "setForeignDailyLimit(uint256)", +"cbbcdf77": "addCurrency(uint256)", +"cbbd809c": "approvedAddressInLUT(uint256)", +"cbbda00e": "Ptest()", +"cbbdca36": "Upgradable(address)", +"cbbe2199": "ActualTokenManager()", +"cbbe2569": "Bogocoin()", +"cbbe300b": "FooMintToken()", +"cbbe974b": "unlockUnixTime(address)", +"cbbea348": "getModeratorAtIndex(uint256)", +"cbbf879c": "getNumParentOperation(bytes32,uint8)", +"cbbf9420": "distributeVES(address[],uint256,uint256)", +"cbbfe168": "getOrder(uint256,address)", +"cbc066ab": "_transferOrderMoney(uint256,address)", +"cbc12d13": "maxRingSize()", +"cbc1cfd2": "emergency_withdraw()", +"cbc24224": "MuskToken()", +"cbc264f2": "nestedFirstAllToAll(uint256)", +"cbc265ac": "revealSeckey(bytes32)", +"cbc3b73e": "delegateHasValidSignature()", +"cbc3fb0d": "blind_sha256(string,address)", +"cbc44835": "PlateMate()", +"cbc469de": "STRToken()", +"cbc52ee4": "EtherIslands()", +"cbc598c5": "isAmountAllowed(address,uint256)", +"cbc61daf": "mintForMarket(address,uint256)", +"cbc69c8d": "SocialMediaToken()", +"cbc6c267": "ejenfwdToken()", +"cbc7755c": "registerNameXnameFromDapp(address,bytes32,bytes32,bool,uint8)", +"cbc7854e": "setTokens(address,address)", +"cbc846d9": "setBoosters(address)", +"cbc85c97": "getAllCardsClaimContender()", +"cbc8ae5f": "TOKEN_SUPPLY_ICO()", +"cbc9023c": "forceRoll()", +"cbc91e98": "sendTokensAfterBuyExp(address,uint256,uint256)", +"cbc9c89c": "Claim_TRAC_3800()", +"cbca02d3": "trasnferFromOwner(address,uint256)", +"cbca99c7": "updateWLAddress(address)", +"cbcaacab": "checkTransferWithReference(address,uint256,string)", +"cbcabc13": "changeMdtTeamAddress(address)", +"cbcb3171": "tokenReserve()", +"cbcc65eb": "ACL_APP_ID()", +"cbccf9d6": "Simpletoken()", +"cbcd5dfe": "MintableMasterToken()", +"cbcdc2e4": "transferBalanceToOwner(uint256)", +"cbce2fcf": "setAmountBasedBonus(uint256[],uint256[],uint256[])", +"cbce4c97": "gift(address,uint256)", +"cbcf4d25": "icoAccounts(address)", +"cbcf8ece": "setAccountBonus(address,address,uint256)", +"cbcf98e6": "changeSecondaryWallet(address)", +"cbcffd2f": "ShowInfo(uint256,string)", +"cbd076f8": "depositForUser(address,uint256)", +"cbd07fd8": "paidDividends(address,uint32)", +"cbd08c8c": "config(uint256,uint256,uint256,uint256)", +"cbd1b782": "test_claimShare_notTranscoder()", +"cbd21f00": "JBartContract()", +"cbd243b4": "SetWhy(uint32)", +"cbd2ac68": "confirmWhitelistRemoval(bytes32)", +"cbd2bdfd": "getAllAuctions()", +"cbd2c73b": "signUserKeyChange(address)", +"cbd2ecd2": "transferAllowance(address,address,uint256)", +"cbd3b403": "getLuck(address)", +"cbd3faef": "amountOwedForApiForBuyer(uint256,address)", +"cbd49462": "_sender()", +"cbd5131b": "sponsoredBonusAmount()", +"cbd57134": "KTCToken()", +"cbd5bb2b": "setRound(uint8)", +"cbd6cc67": "SendDataToken(uint256,string,uint8,string)", +"cbd85c76": "bytesToBytes4(bytes,uint256)", +"cbd88663": "drawJurors(uint256,uint256)", +"cbd8877e": "stakeMinAge()", +"cbd8e690": "setTokenAmountPerHeritor(address,address,uint256)", +"cbd8ff79": "ContributionToPrizeFund()", +"cbd9597d": "GenChipLevel_Special(uint256,uint256,uint256)", +"cbd9d2e0": "InvalidCaller(address)", +"cbda1d85": "fundingGoalHardCap()", +"cbdb2469": "_getPetBonus1(uint256)", +"cbdb4f72": "GetClientBalance()", +"cbdc5aa4": "tokensTradeable()", +"cbdd3268": "genesisImportsComplete()", +"cbdd69b5": "tokensPerEth()", +"cbde2ff0": "isUnfreezed(uint256)", +"cbdf02fb": "rejectCertificate(address,address)", +"cbdf3878": "goldLevelBonusIsUsed()", +"cbdf8692": "Lockup()", +"cbe0a1aa": "totalEthCharityCollected()", +"cbe0e49a": "presaleGranteesMapKeys(uint256)", +"cbe211ec": "adPriceWeek()", +"cbe230c3": "isAllowedToken(address)", +"cbe239ed": "setIcoPaymentStatus(bool)", +"cbe23b94": "cards_start_total()", +"cbe29f34": "advisorsSupply()", +"cbe2e97e": "setGameStatus(bool)", +"cbe324d8": "_setSuggestedAdPrice(uint256,uint256)", +"cbe335c1": "verifyDocument(bytes32,bytes,uint16)", +"cbe37e25": "BYBToken()", +"cbe3a072": "add(uint32)", +"cbe3be97": "KeplerCoin()", +"cbe40622": "setup(address,address,uint256)", +"cbe432b0": "ico3Tokens()", +"cbe44fa2": "setWhitelisted(address,uint16)", +"cbe5404f": "setAccountFrozen(address,bool)", +"cbe56377": "amendLock(uint256,uint256)", +"cbe566de": "deleteCascade(uint256)", +"cbe7a150": "getCryptoMatch(uint256)", +"cbe7b838": "YunKaiCoin()", +"cbe8047e": "testValidation()", +"cbe8623f": "divUp(uint256,uint256)", +"cbe9ef39": "BasicCoin(uint256,address)", +"cbea4412": "getItemHolders(uint256)", +"cbeb5749": "ShoreCoin(uint256,string,uint8,string)", +"cbebc563": "computeTraitScore(uint256,uint256,uint256)", +"cbec09a7": "bonus01()", +"cbec455f": "continueCrowdsale()", +"cbec72f3": "ownerHasClaimedTokens()", +"cbec78b9": "requestPrice(string,string,int256)", +"cbecb89e": "refferal(uint256,address)", +"cbed1568": "addAdminWhitelist(address)", +"cbedbf5a": "sendMoney()", +"cbeea68c": "permit(address,address,bytes32)", +"cbefe55c": "calcTokenRate()", +"cbf09802": "rateOf(address)", +"cbf0b0c0": "kill(address)", +"cbf0fa2d": "totalWageredForAddress(address)", +"cbf1304d": "balances(address,uint256)", +"cbf1382f": "founderStorageVault()", +"cbf1591d": "setDenyContract(bool)", +"cbf21837": "isSelling()", +"cbf26c0b": "DeviceOwner()", +"cbf2ad23": "confirmedBy()", +"cbf2b203": "Crowdsale(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"cbf33562": "addTrustLink(address,bool)", +"cbf346cc": "_sellCrowd(uint256,address)", +"cbf4531d": "dividendsAmount(address)", +"cbf66a02": "withdrawRune()", +"cbf6fff9": "SALE_SUPPLY()", +"cbf7c9a7": "isUserKyc(address)", +"cbf7cc2e": "deployFinished()", +"cbf7f009": "FAPFounder()", +"cbf89ed8": "DividendDeposited(address,uint256,uint256,uint256,uint256)", +"cbf9051c": "setPublisherRewardPool(bytes32,uint256)", +"cbf93c9b": "_claimExploreItemUsingEMont(uint256,uint256)", +"cbf97572": "HipsterFarmer()", +"cbf9a125": "queryChibiAdd(uint256)", +"cbf9b6dd": "getRecorderAddress(uint32)", +"cbfa18ea": "contractRefundFinished()", +"cbfa3c9c": "scaling()", +"cbfba0e1": "withdrawFee(bytes8)", +"cbfc12ba": "Soniq()", +"cbfc4bce": "gift(address)", +"cbfd14a2": "publicSaleSupply()", +"cbfd79e2": "AirdropFan()", +"cbfe6d41": "documentExists(bytes32)", +"cbfebb34": "setETHRate(uint256,uint256)", +"cbff158f": "addPollOption(uint256,bytes)", +"cbff17fa": "_setMinted(uint256,address)", +"cbff2cfc": "_getValueEther(uint256,uint256)", +"cbff69db": "contributionAt(uint256,uint256)", +"cbffb1ae": "updateConflictResolution(address)", +"cc00814d": "setPublicOfferLimit(uint256,uint256)", +"cc00ce12": "set_arbits_sale_open(bool)", +"cc01e39f": "availableAmountToCollect(uint256)", +"cc0238be": "getsumdata2(bytes32)", +"cc027cc9": "register(address,uint256,address,address)", +"cc02d73f": "setColorContract(address)", +"cc03477d": "nMsgsWaiting()", +"cc03c342": "setPlatformAddress(address)", +"cc05d836": "executeOrder(bool,address[3],uint256[4],uint256,uint8,bytes32,bytes32)", +"cc062b58": "enableSelling()", +"cc06c359": "maxLevel()", +"cc06f5ea": "getPeriodReceivedBalanceFor(uint256,address)", +"cc071051": "purchaseWolk()", +"cc075fa7": "stopTeamTrade()", +"cc07a94d": "_createMobster(string,address,uint256,uint256)", +"cc07dc37": "userReferralsWei(address,address)", +"cc08ebf6": "CryptoSportZ()", +"cc09c6b3": "OXO(uint256,string,string)", +"cc0a26d1": "CurrentMined()", +"cc0b2c9f": "tokenToOwner(uint256)", +"cc0b5a5f": "cancel(uint256,address,address)", +"cc0b94b7": "getChannelStatus(bytes32)", +"cc0b9dff": "addExitToQueue(uint256,address,address,uint256,uint256)", +"cc0bb8e5": "proof_of_public_key2()", +"cc0d0c90": "BlueTitaniumClassic()", +"cc0e13e2": "enableMaintenance()", +"cc0e1f66": "startOver()", +"cc0e24e1": "CheckDOT(bytes32)", +"cc0e97c9": "logicContract()", +"cc0f1786": "feeDecimals()", +"cc0f65f7": "GetMinerData(address)", +"cc10145f": "ownerWithdrawRune()", +"cc1027ea": "_validateReferrer(address)", +"cc105441": "MMOcoin()", +"cc10d53d": "IsPatient(address)", +"cc10e401": "create(string,bool)", +"cc11298e": "getRewards(uint256,uint256)", +"cc121ac1": "unsoldTokensVault()", +"cc129f4d": "radd(uint128,uint128)", +"cc130482": "SUNX()", +"cc131be1": "CreateNewDraw(uint256)", +"cc135555": "currentGene()", +"cc1423bf": "releaseBubToken()", +"cc143ce9": "NewXRateProvider(address,uint16,address)", +"cc147334": "payAllRewards()", +"cc148bf4": "awardBalanceOf(address,uint8)", +"cc14a7a3": "paidAddress()", +"cc151c82": "tokensToSellOnce()", +"cc15bee7": "isPurchasingPaused()", +"cc15c26c": "buyTokensReserve()", +"cc15d080": "getEmployeeInformation(uint256)", +"cc1602df": "lotteryCore()", +"cc16e6e1": "TOTAL_RESERVE_FUND()", +"cc16f5db": "Burn(address,uint256)", +"cc17aa28": "numAdoptedAxies(address,uint8,bool)", +"cc181ca8": "king()", +"cc189d00": "Vault(address,uint256)", +"cc198380": "totalSoldSlogns()", +"cc1b63d5": "setStakeStartTime(uint256)", +"cc1b8de6": "freedWosPoolToTeam()", +"cc1bc747": "deallocate(address,address)", +"cc1c0937": "NeuralToken()", +"cc1d050d": "startBlockProfit()", +"cc1d1e18": "_getCurrentTokenPrice()", +"cc1d4c02": "certified(address)", +"cc1ef080": "startPreSTOSale()", +"cc204cc2": "amountsWithdrew(address)", +"cc20d075": "getChannelId(address,address,uint8)", +"cc212a48": "disburseFunds(uint256)", +"cc21a9a2": "_weekFor(uint256)", +"cc21e972": "US_INSTITUTIONAL()", +"cc234ee1": "setICORunning(bool)", +"cc23a690": "releaseValue2()", +"cc23b75b": "HARD_CAP_IN_TOKEN()", +"cc242f40": "CardsRead()", +"cc24f571": "releaseTenPercent()", +"cc255b38": "testBazMethodId()", +"cc25decd": "SampleOffer(address,bytes,uint256,uint256,uint256,uint256,uint256)", +"cc268393": "setDescendant(address)", +"cc2761a4": "test_me(int256)", +"cc27f97b": "LSYP()", +"cc289fa9": "getPartnerAddressStatus(address)", +"cc293aea": "setRenewalsCreditAffiliatesFor(uint256)", +"cc2942da": "SetAElfCommunityMultisig(address,address)", +"cc29a0e6": "transferTTProduction(address,address,uint256)", +"cc2a9192": "LogWinnerPaid(address)", +"cc2aa2c7": "NAMINORI()", +"cc2b20ff": "refferBonusFunction(uint256)", +"cc2c2058": "addSpinner(string,uint256,address,uint256,uint8,uint8,uint8)", +"cc2c2bcf": "MotionFactory(string,string,string)", +"cc2c5453": "add_sword(uint16)", +"cc2dcd7e": "removeSideService(address,uint256)", +"cc2e08ea": "getRecTransactionData(uint256)", +"cc2e15cc": "getSponsorableJobs(address)", +"cc2eacb1": "setReferralPercent(uint16)", +"cc2f5029": "updateNoteMetadata(uint64,uint16)", +"cc2f5186": "Balances(address,address,address)", +"cc2fd120": "unofficialUserSignUp(string)", +"cc304924": "DocumentAdded(uint256,string,uint256)", +"cc305ae6": "userAssignElement(uint256,uint256,address)", +"cc308a54": "whitelistStartBlock()", +"cc30eeb1": "isEligibleForRepayment(uint64)", +"cc3154f8": "attendeesList()", +"cc326e1c": "currentPhaseRate()", +"cc328f2f": "b531647b()", +"cc32f8ad": "transferMoneyForTaskSolutions(string,uint256)", +"cc33ad3d": "DSP(uint256,string,string)", +"cc33c875": "tokenInfo(uint256)", +"cc341430": "coordinatorAgreeForEmission(address)", +"cc342eba": "RoseToken()", +"cc3451d6": "MultiverseToken()", +"cc3471af": "maxClaimBlock()", +"cc348429": "Ethmall(address,address,address,uint256,uint256,uint256)", +"cc34a247": "icoEndTimestampStage1()", +"cc34f810": "AllstocksToken()", +"cc361cc4": "getTotalBonusPerShare()", +"cc364f48": "getRange(uint256)", +"cc36809f": "fee_msg()", +"cc36a328": "team0Query()", +"cc36f8eb": "ArtCoin()", +"cc373d79": "withdrawCommissions(uint256)", +"cc38639f": "newTuneOption(uint32,uint32,uint256,bool,bool,uint128,uint64)", +"cc38c8a0": "insuranceAccount()", +"cc3938f9": "chkLockedA(address,uint256)", +"cc397ed3": "getCurrentFor(address)", +"cc3a0c8d": "customerExchangeEther(uint256,address,string)", +"cc3ad9a1": "unPackParams(uint256)", +"cc3b8806": "getCertificateMetaDataCount(bytes32,bytes32,bytes32)", +"cc3bb31a": "crowdsaleStart()", +"cc3bde3d": "TOTAL_SUPPLY_LIMIT()", +"cc3bf9e9": "redeem(bytes32,address)", +"cc3c2c01": "getValidityBondFloor()", +"cc3c59cc": "Paymec()", +"cc3c7098": "createTokenToMarket2021()", +"cc3c74a1": "proposalNonce()", +"cc3ccf57": "previous_owner()", +"cc3d2721": "minWithdraw()", +"cc3d574b": "ElectedBoardController(address,address[],uint256,address)", +"cc3d967b": "getUserDetails(address)", +"cc3df01f": "issueToken(uint256)", +"cc3e378e": "hasEnoughFundsToStart()", +"cc3eacbb": "getOraclizeFee()", +"cc3efd6b": "PUKCoin()", +"cc3f44bf": "getGoldStatusMinted(address)", +"cc3f51d0": "hitPotProcess(string,bool,uint256)", +"cc3fa0fd": "NobleAssetsCoin(uint256,string,string)", +"cc3fdd4c": "buyFeePercent()", +"cc41a396": "rateStage3()", +"cc41d3b2": "refundPreIco()", +"cc422cc2": "coeRemainingAtCurrentRate()", +"cc423c28": "setSchellingExpansion(uint256,uint256)", +"cc42e83a": "withdrawWinnings()", +"cc436196": "initialFundsReleaseDenominator()", +"cc436e42": "memberIsActive(uint8)", +"cc442c3f": "ICO_PRICE4()", +"cc445611": "purchase(bytes32)", +"cc44b15b": "setCode(address,bytes32,uint256)", +"cc44fd2b": "changeManagement(address)", +"cc451581": "getCurrentBigPromoBonus()", +"cc4580c8": "getBetsLength()", +"cc459696": "contentCount()", +"cc466256": "_roll(address,uint256,uint256,bytes32,bytes32,bytes,bytes32,uint256)", +"cc4720c7": "calculateRewardTokens(uint256,uint8)", +"cc47a40b": "reserve(address,uint256)", +"cc47de73": "ExpandT()", +"cc490e64": "getSplitCount()", +"cc494291": "setJobController(address)", +"cc4999ea": "getTradingInfo(uint256)", +"cc49ede7": "getVesting(address)", +"cc4aa005": "getDestroySharesOwnerValue()", +"cc4aa204": "ERC20()", +"cc4b998a": "titleIds()", +"cc4bf6a3": "miningTen()", +"cc4c1c05": "SwytchToken()", +"cc4cc05f": "collectToken()", +"cc4d233c": "Reclaimed()", +"cc4d819c": "tokensPurchased()", +"cc4d96df": "_refreshVoteForVoter(uint256)", +"cc4da8f4": "EventWinReward(address,uint256)", +"cc4e0008": "Ticket(address)", +"cc4fa81b": "exchangeCalculator(uint256,uint256,uint256)", +"cc4fbc43": "acceptTokenPayment(address,uint256,address,uint256)", +"cc5061da": "voteForUser(uint16,address)", +"cc50dacb": "buyCar(uint32)", +"cc50fc28": "mintInternal(int256,address,uint256)", +"cc537821": "buyNextRank()", +"cc539eb1": "replaceAccount(address,address)", +"cc552c8e": "setHardCapUSD(uint256)", +"cc5530eb": "endPreSaleStage()", +"cc577f38": "addPresaleAmount(address,uint256)", +"cc57e4f8": "increasePregnantCounter()", +"cc58bcf8": "getCurrentLevel(uint256,uint256,uint256)", +"cc5a02cb": "withdraw(address,uint8)", +"cc5a7051": "_setMinDailyPerUser(uint256)", +"cc5a7804": "payoutTokens(address,uint256,uint256)", +"cc5aba27": "ConstructorTest(uint256,uint256,string,string)", +"cc5b13a0": "PAYOUT_DELAY_INTERVAL()", +"cc5b2292": "DepositForDividends(uint256)", +"cc5b542e": "toBeDistributed()", +"cc5c095c": "mintableSupply()", +"cc5c4224": "setFreezingManager(address)", +"cc5c4a6b": "attachPresale(address,address)", +"cc5cab33": "userRewarders(address,uint32)", +"cc5cee0a": "calculateEthereumReceived(uint256,uint256)", +"cc5f0240": "batchCancelVoteForCandidate(address[],uint256[])", +"cc5f09fb": "getNbCitizensLocation(string)", +"cc5fc0d7": "updateInvestBalance()", +"cc603ed5": "collectRate(address)", +"cc61d0cb": "changeMinWithdraw(uint256)", +"cc620704": "joinToTrack(bytes32)", +"cc6266a1": "getHashFromData(bytes32,bytes32)", +"cc6305ed": "getNumTicketsPurchased(uint256,address,address)", +"cc634dac": "get_kek()", +"cc63604a": "canExecute(uint256)", +"cc638e03": "rublaJEPoken()", +"cc63996e": "getHairValue(uint256)", +"cc63a3c9": "set_token(address)", +"cc642cc2": "numHolders()", +"cc64cfcb": "getDeployedMarriages()", +"cc64e2d5": "depositEthers(address)", +"cc657697": "GetMatchLength()", +"cc657e62": "sendToken(uint256,uint256)", +"cc668524": "verifyPosition(uint8,uint64,uint64,uint64)", +"cc66d3c7": "buyEngineer(uint256[8])", +"cc66ec47": "TerraformReserve(address)", +"cc677679": "setEMAPeriods(uint256)", +"cc679ffc": "TUPC()", +"cc67b1bf": "getTransferPerc()", +"cc69084f": "PHASE_CLOSED()", +"cc691763": "draw(uint32,uint8,bytes32)", +"cc6c010d": "ATMGold(uint256,string,uint8,string)", +"cc6c8e31": "NFXCoinToken()", +"cc6ca7b7": "specialBaseLayer(uint256)", +"cc6cf340": "BERTCLUBCOIN()", +"cc6d7850": "burnILF(address,uint256)", +"cc6d8ba6": "inheritInvestorPosition(uint256)", +"cc6da375": "recipientVIP(address)", +"cc6db55f": "setJackpotModulo(uint256)", +"cc6e15e5": "setDelayedTokenAllocator(address)", +"cc6e6f25": "Withdraw_5()", +"cc6e70e8": "MSTCOIN()", +"cc6e8593": "lawSupportProfitAddress()", +"cc6ec39a": "switchToGame(string)", +"cc6eced7": "priceOfTeam(uint256)", +"cc6f0ed0": "BirthdayCandy()", +"cc70993d": "earlyTimeLock()", +"cc70bb1a": "publish(string,string,string,address)", +"cc70decb": "showBonus(address)", +"cc7188a5": "unLinkFromMasterWallet(address)", +"cc724b27": "isTesting()", +"cc72c918": "queryOwnerAddr()", +"cc72ecb0": "purchaseStartBlock()", +"cc741c9c": "getDidClaimBooty(address,uint256)", +"cc743a86": "ICO_PROMO_REWARDS()", +"cc74e2ca": "min_refund_block()", +"cc750395": "setMonthOpen(uint256,uint256,uint8,uint256,uint256)", +"cc754a28": "ICOStartTimeChanged(uint256)", +"cc755b70": "releaseFrozenBalance()", +"cc759458": "unconfirm(address)", +"cc759f88": "removeBools(bytes32[])", +"cc75ac19": "_withdrawAffVault(uint256)", +"cc75c4b1": "abc(uint256)", +"cc75cc9b": "SendmoneyCall(uint256)", +"cc764986": "updateEmaDailyYield(uint256)", +"cc774681": "mapCompletionNumberForWithdraw(address)", +"cc77b82d": "BEEFYToken()", +"cc783c5e": "setBankrollerContractOnce(address)", +"cc78cc98": "multisigPreICO()", +"cc7949ae": "round_count()", +"cc797d8e": "setMaxAttackPrizePercent(uint256)", +"cc798890": "queryAccounts()", +"cc79aa04": "getProposal(bytes32,bytes32)", +"cc79eaf0": "getColors(uint32)", +"cc7a060f": "ethersCollecteds()", +"cc7a2049": "permissionManager()", +"cc7b2ee7": "initAirdropAndEarlyAlloc()", +"cc7b41ec": "changeRollUnder(uint256)", +"cc7b60fe": "_emitWorkFinished(uint256,uint256)", +"cc7c4c39": "gotWinner()", +"cc7cd9f8": "fundingEthGoal()", +"cc7cddb8": "dive3(address)", +"cc7d1a0f": "currentHighestBid()", +"cc7e1b9a": "setRedemptionAddress(address)", +"cc7e2208": "Order()", +"cc7e492e": "refillInstantMintPool()", +"cc7e930c": "commitmentsOf(address,address)", +"cc7f365c": "VLADALINA()", +"cc7f593c": "setRequiredMajority(uint256)", +"cc7f608d": "setSaleType(uint8,uint8,uint32,uint256,uint256)", +"cc7f8266": "read_i8_array()", +"cc7fa928": "nbMonthsPay()", +"cc7fe38c": "addPresaleInvestor(address,uint256,uint256)", +"cc80f6f3": "show()", +"cc80f9e8": "ownerOfID(uint256)", +"cc81dbb5": "DEFROST_FACTOR_TEAMANDADV()", +"cc822f54": "changeYDistAddress(address)", +"cc826160": "ownershipDistributed()", +"cc82e72e": "SetPlatformInformation(string)", +"cc833e69": "Cryptonationz(string,string,uint8,address,address,address,address,address)", +"cc851cac": "SecuritiesVaultBank()", +"cc863948": "withdrawTokenShare()", +"cc86566c": "tempMngr()", +"cc8658b3": "chkStaff(address,address)", +"cc865b71": "withdrawRoundController(uint256,address)", +"cc872b66": "issue(uint256)", +"cc876ded": "born(uint256,uint256)", +"cc87ed82": "checkNumCards(uint256,uint8,uint8,bytes32,bytes32)", +"cc8818f6": "setReservefund(uint256)", +"cc88be52": "NuoBaoChainToken(uint256,string,uint8,string)", +"cc891023": "depositLock(address)", +"cc893855": "calculateTotalPayment(uint64)", +"cc896494": "_setGameOver()", +"cc89698c": "getTopicCount()", +"cc897e40": "END_SKO1_UNITS()", +"cc89d596": "getCryptantFragments(address)", +"cc89e8bc": "ecosystemTokens()", +"cc8a86a0": "Y2_release()", +"cc8af0fe": "bytesToUInt(bytes,bytes)", +"cc8b34ab": "CrowdCoin()", +"cc8b96e5": "prepare(uint256,address,address)", +"cc8baf63": "m_tokenDistributor()", +"cc8bd060": "setUnitsOneEthCanBuy(uint256)", +"cc8c0f9f": "transferLocked(address,uint256,uint8)", +"cc8c3c45": "getTokenIdsLength()", +"cc8c49aa": "sc(uint256,uint256,uint256,uint256,uint256)", +"cc8cd5c5": "withdrawDragonsFilm()", +"cc8ce27e": "CryptoChamps()", +"cc8ce862": "allowedGasPrice()", +"cc8e4bc2": "LOCKAMOUNT3()", +"cc8eac6c": "isSTOAttached()", +"cc8eb425": "newuser(address,address)", +"cc8f0b48": "withdraw(bytes32,address,uint8,bytes32,bytes32)", +"cc90050e": "GetCurrentRoomAndRound(address)", +"cc9062f9": "finalizeTransferChildrenOwnership()", +"cc90da29": "bonusNum()", +"cc90e725": "addProject(string,address)", +"cc91e91c": "Freezable()", +"cc925957": "logAccess(string,string,uint256)", +"cc92bad4": "updateParkingRate(uint256)", +"cc92ebad": "createCrowdsale(uint256,uint256,uint256,uint256,address,address,address)", +"cc937ccd": "Doves()", +"cc93ee70": "forwardCoins(uint256)", +"cc93f66e": "endTournament(uint256,uint256)", +"cc9415d0": "commitOn(uint256)", +"cc9425b7": "OCTACryptoToken()", +"cc949797": "balanceAffiliateOf(address)", +"cc94d923": "createTransaction(address,uint256,bytes32,address,address,address)", +"cc94e4a2": "set_sale_address(address,address)", +"cc954820": "changeFallbackDeposit(uint256)", +"cc95d8d1": "s36(bytes1)", +"cc96019f": "referralTokenWallet()", +"cc96b943": "offerOptionsToEmployee(address,uint32,uint32,uint32,bool)", +"cc976620": "usdPerEthCoinmarketcapRate()", +"cc97b38f": "BANCOR_X_UPGRADER()", +"cc97edbf": "bmi()", +"cc98c893": "developer_Transfer_ownership(address)", +"cc98ff20": "purchaseVillage(uint256)", +"cc991d8a": "BTestToken(uint256,string,uint8,string)", +"cc996d1b": "bids()", +"cc9a31a7": "isRepresentor(address)", +"cc9a88c9": "canSend(uint32,uint32,int256)", +"cc9ab267": "voteForCandidate(bytes32)", +"cc9ac376": "addLock(address,uint256,uint256)", +"cc9ae3f6": "getMyReward()", +"cc9b31c9": "exchangeFeeIncurred(uint256)", +"cc9b714c": "ClearAuth(address)", +"cc9b71c2": "TaskCoin()", +"cc9b7826": "setGuaranteedAddress(address,uint256)", +"cc9ba6b2": "buyRef()", +"cc9c0936": "startedWorkTS()", +"cc9c437c": "get_orderAddress(address,uint256,uint256,uint256,uint256)", +"cc9d7519": "getTierInfo(uint256)", +"cc9d858d": "FundsRegistryTestHelper(address[],uint256,address)", +"cc9de25d": "bytesToUint256(bytes)", +"cc9e735f": "decrementDate()", +"cc9f28ea": "getDeletedTeams()", +"cc9fd9d9": "onSetCredit(address,uint256)", +"cca07f44": "setSpecialLimits(address,uint256,uint256)", +"cca08d55": "updatesolsforhire()", +"cca0feb6": "updateTax(uint256)", +"cca10ba5": "getMultiSigBalance()", +"cca213a1": "setTranchTime(uint256[])", +"cca2194c": "getInvestorContribution(address)", +"cca26917": "getRoundBalance(address,address,uint256)", +"cca3e832": "_balanceOf(address)", +"cca40111": "_recharge(address,uint256)", +"cca41651": "addressPrivateSale()", +"cca470d2": "roundInvestorInfoByAddress(uint32,uint32,address)", +"cca4f3c5": "winthdraw(address,address,uint256)", +"cca5020b": "totalLBSold_PRIVATE()", +"cca520ee": "transferFromMoreThanAllowedTest(address)", +"cca5dcb6": "isTransferEnabled()", +"cca63f4f": "buyXname(uint256,uint256,string)", +"cca6ae0b": "getGPSMinEth()", +"cca746df": "getAnnualFee()", +"cca78d53": "getActiveListLength()", +"cca794da": "setGzeBonusOnList(uint256)", +"cca91579": "PlaceHolder(address)", +"cca97025": "_performTransferFromWithReference(address,address,uint256,string,address)", +"cca9943c": "wei25()", +"ccaa5135": "LIFECOIN()", +"ccaa5c65": "LomeliToken()", +"ccaab1ca": "companyPercent()", +"ccaaef45": "purchaseCompanyAdv(uint256,string,string)", +"ccab1be7": "SubmissionAccepted(address)", +"ccab841b": "divf(int256,int256,uint256)", +"ccabcfca": "XMLYBadge()", +"ccac77f5": "GooLaunchPromotion()", +"ccad19e4": "sendEtherFromAddContract(address)", +"ccadd6b1": "bet1Of(uint256)", +"ccadef15": "_setOCPTokenContract(address)", +"ccae794a": "showFPCount()", +"ccaee929": "JihoyContract()", +"ccaf4b03": "setIreg(uint256)", +"ccb00344": "changeEtsAddress(address)", +"ccb07cef": "crowdsaleClosed()", +"ccb0893d": "isUIntPrivate()", +"ccb13cbd": "_acceptAnchorAdmin()", +"ccb1c0a1": "getQuestion(string)", +"ccb1cbbc": "testFailBurnNoAuth()", +"ccb20e8e": "StormBrewCoin()", +"ccb22e37": "description3()", +"ccb2e9a4": "insertAccount(bytes32,string,uint256,string,string)", +"ccb3449e": "NewPresaleAllocation(address,uint256)", +"ccb50a29": "SIGMA_MAX_CARGO()", +"ccb53365": "startICOPhase()", +"ccb570e3": "transfer(uint256,address,address)", +"ccb60e39": "rentOutMultiple(address,uint256,uint256[])", +"ccb61dad": "MICRO_DOLLARS_PER_BNTY_MAINSALE()", +"ccb64997": "isBCDCToken()", +"ccb6cbe8": "icoBottomIntegerPrice()", +"ccb767ae": "transferTo(address,uint32)", +"ccb783a9": "setGPSStartTime(uint16,uint8,uint8,uint8,uint8,uint8)", +"ccb98ffc": "setEndTime(uint256)", +"ccbac9f5": "randomNumber()", +"ccbae5f6": "createEscrow(address,address,uint256,uint256)", +"ccbb41d0": "TOC()", +"ccbb52f5": "getGroupRates(uint256)", +"ccbba441": "setMigrateStage()", +"ccbd5152": "bankrollBeneficiaryAmount()", +"ccbd8d25": "setDropAmount(uint256)", +"ccbd8d29": "tokenAvatar()", +"ccbda1af": "getChannelByName(string)", +"ccbde432": "delete_candidate(uint8)", +"ccbe2a68": "kill(uint8[176],uint8)", +"ccbe4968": "Withdawal(address,uint256)", +"ccbfc6ed": "revokeSignature(bytes)", +"ccc08913": "Restricted()", +"ccc08974": "setGameActive(bool)", +"ccc108d7": "reopen()", +"ccc11f11": "hasAssetRights(address,bytes32)", +"ccc13814": "max(int256[])", +"ccc39b5d": "DonationClaimed(address[2],uint256[8],uint8,bytes32[2],uint256,uint256)", +"ccc51afb": "lookupFillingRing(address,uint256)", +"ccc54d69": "LOCKUP_3M_ICO_TIMESTAMP()", +"ccc55189": "Nation(address,address)", +"ccc5d05f": "testNoTokensNoCalls()", +"ccc61bef": "REWARD_WIN_MULTIPLE_PER()", +"ccc62bbe": "assertEq2(bytes2,bytes2,bytes32)", +"ccc643d7": "updateSaleTime(uint256,uint256)", +"ccc6ddf3": "createPromoPow(address,string,uint256,uint256,uint256,uint256)", +"ccc72302": "AUDITED_AND_REJECTED()", +"ccc8b33c": "buyXnameQR(address)", +"ccc924ef": "TokensUndelegated(address,uint256,address)", +"ccc9735d": "ERCSpammer(uint256,uint256,string,string)", +"ccc98790": "w(uint256)", +"ccca123b": "waitTime()", +"ccca237c": "foundationAsset()", +"cccb987f": "withdrawTwice()", +"cccc020f": "changeInsuranceFeesOperation()", +"cccc8f91": "getDappId()", +"ccccc36b": "createAcceptAndAdditionalsFromBytes(bytes,bytes,bytes,uint256[])", +"cccd2ea8": "getProductData(address)", +"ccce413b": "symbols(uint256)", +"ccce6458": "createKingdom(string,string,uint256,bool)", +"ccceee48": "lastBlock_v1Hash_uint256()", +"cccf3a94": "gasForCLOUD()", +"cccf7a8e": "has(uint256)", +"cccf88f9": "batch_refund_bix(address[],address,uint256[])", +"ccd15921": "addTransferAndCallWhitelist(address)", +"ccd1a621": "addguess(uint256)", +"ccd30a62": "getWhitelistedAddresses(uint256)", +"ccd331bf": "bountyAmount()", +"ccd385f5": "staff_3()", +"ccd3948b": "removeRestaurant(address)", +"ccd39537": "dilute(address,uint256)", +"ccd4020c": "PassTokenReborn(address)", +"ccd46ae4": "BuyTicketUseVault(uint256,uint256)", +"ccd65296": "initialize(uint256,uint256,uint256,uint256,address)", +"ccd6559b": "newRandom(string)", +"ccd65c0a": "activateMainSale()", +"ccd68f3b": "stamps(uint256)", +"ccd6aca4": "preSaleSecondCap()", +"ccd71e8c": "armySubmarinesCount(uint256)", +"ccd75361": "setFooInt(uint256)", +"ccd89ecd": "calculateManyHash(address,address[],uint256[],uint256,uint256)", +"ccd8ad0c": "setGenTime(uint256)", +"ccd8c186": "DebitCoinTokenGenesis(address)", +"ccd8e2cf": "AnmiToken()", +"ccd8ead7": "addToCategorie2(address,address)", +"ccd93998": "getRequiredSignatures()", +"ccd95a50": "sendTokenToMultiAddr(address[],uint256[])", +"ccd96ab0": "cite(bytes32,string)", +"ccd9aa68": "passedKYC(address)", +"ccd9d08f": "MLIOU()", +"ccda4b99": "getMethodValue(string)", +"ccda696b": "ownersTransfer(address,uint256)", +"ccdaeab0": "getTechBonus3(uint256)", +"ccdb05d4": "NokuCustomERC20(string,string,uint8,address,address)", +"ccdb3f45": "newAddress()", +"ccdbbff5": "securityTokensWallet()", +"ccdc535e": "placeBetV1(uint256,uint256,uint256)", +"ccdd1979": "multisend(address,address[],uint256)", +"ccdd49f2": "StyToken(address,address)", +"ccdd95d6": "releaseEnjinTeamTokens()", +"ccdf68f3": "isOutcomeSet()", +"ccdfcfa4": "returnFundsForAll()", +"cce0244d": "setSafeContract(address,bool)", +"cce0a1ca": "isPresaleSetup()", +"cce0c0fa": "addOneGame(string,uint256)", +"cce0cd0c": "blockVersion()", +"cce106f8": "AmountToLittle()", +"cce1dfd2": "minimum_token_sell()", +"cce21eda": "DividendsWithdrawal(uint256,address,uint256,uint256,uint256,uint256)", +"cce2270a": "isSecondStageFinalized()", +"cce2771e": "redeemUTXO(bytes32,uint8,uint256,bytes,bytes,bool,uint8,bytes32,bytes32)", +"cce29ea7": "preSaleEndTime()", +"cce2f8e3": "checkAddressMisused(address)", +"cce356b5": "getHodlers()", +"cce3906b": "hasWithdrawnRake()", +"cce3c13b": "isLeaf(uint256)", +"cce48e65": "GeeTestCoin()", +"cce4bd52": "reclaimFunds()", +"cce7db58": "swipe(address)", +"cce7ec13": "buy(address,uint256)", +"cce81927": "EtherDice(address,address)", +"cce91957": "take(bytes)", +"cce93ae1": "PeriodChanged(uint256,uint256)", +"cceb6368": "receiveTicket(address)", +"cceb9214": "setAuctionStatus(bytes32,uint8)", +"ccebca11": "Foo(address,bytes32,address)", +"ccec1461": "bulkEtherSender(address[],uint256[])", +"ccecc71f": "getPlayerPoints(bytes32)", +"cced2bb6": "LogOwnerRemoved(address)", +"cced9b63": "setBestMatch(uint256,uint256,address)", +"cceda56c": "CAPPED_SUPPLY()", +"ccedf3d2": "getChainCode(string)", +"ccee31e8": "setNbKingdomsType(uint256,address,bool)", +"ccee8047": "settleCall(uint256,uint256,address)", +"ccef6d63": "_isClientPaidUp(address)", +"ccf053ba": "TOTAL_TOKEN_SUPPLY()", +"ccf06abf": "canCompose(string,uint256[],address)", +"ccf0768a": "transferDividends(address)", +"ccf12304": "set_mint(uint256)", +"ccf1454a": "addressOf(string)", +"ccf1ab9b": "usurpation()", +"ccf1e80b": "JUNE()", +"ccf20872": "ChainKey(uint256,string,string)", +"ccf24838": "updateOwner(uint256,address,address)", +"ccf27a4e": "setPrice2(uint256)", +"ccf2b87b": "sendWithFreeze(address,address,uint256,uint256)", +"ccf41499": "TokenFactory(uint256,string,uint8,string)", +"ccf4a941": "getVendorApplication(string)", +"ccf4b70a": "RATE1()", +"ccf4f413": "setSubRegistrar(string,address)", +"ccf53a84": "getFile(uint8)", +"ccf5401e": "checkQuest(address)", +"ccf5c5cf": "registerConsumer(address,uint32)", +"ccf64316": "playerRollDiceSingle(uint256)", +"ccf670f8": "setLevelUpFee(uint256)", +"ccf69e9b": "randomContract()", +"ccf6b8b3": "CCCoinToken(string,string,uint256,uint256,address,address,address,address,uint256)", +"ccf7ba0f": "recoverPrice(address,address)", +"ccf7d0d4": "sendTokensAfterCrowdsale()", +"ccf7fe56": "JustinCoin()", +"ccf82afd": "WataexToken()", +"ccf8bcf3": "transferOVISBookedTokens()", +"ccf8e5d0": "CLITOKEN()", +"ccf8ef24": "undelegateVote()", +"ccf9f35f": "awardsCount()", +"ccfa8e71": "addBank(string,address,string)", +"ccfaa72f": "setRentalPricePerHour(uint256)", +"ccfbdb9e": "CrowdSaleDapCar()", +"ccfc0053": "withdrawMILs(uint256)", +"ccfc1e4e": "preSaleWeiCap()", +"ccfc811b": "registerParticipant()", +"ccfc8729": "registerWithToken(address,uint256,address)", +"ccfc9556": "USDChain(uint256,string,uint8,string)", +"ccfcbdbe": "canMakerTerminate(bytes32)", +"ccfdca9a": "setMinPaymentAmount(uint256)", +"ccfe4691": "CtfToken()", +"ccfed305": "CMDToken()", +"ccff361f": "AibitbankToken()", +"ccff42b2": "isValidAdapter(address)", +"cd008f1a": "getMine()", +"cd00ee0d": "startToken()", +"cd027be5": "getAllowAmount(address)", +"cd034234": "refundRequest()", +"cd0389fd": "metadataToken()", +"cd03b093": "getSupportersForTopic(string)", +"cd041ae9": "removeCooldown()", +"cd048de6": "setWord(string)", +"cd04ccfc": "newProposalEthUSDOracle()", +"cd05c214": "TOKEN_FOURTH_PRICE_RATE()", +"cd05d1eb": "shopPants()", +"cd062734": "getCallABISignature(bytes32)", +"cd0643ee": "takeInvestments()", +"cd066fd6": "computeInitialPrice(uint256)", +"cd0699e9": "OysterPrePearl()", +"cd06a7bf": "rewardsupply()", +"cd076620": "mint(address,uint256,int16,int16,int16,int16,int16,int16,uint256)", +"cd0845fd": "bool2str(bool)", +"cd09039b": "PayForFlag(string)", +"cd09263f": "rate_toCap()", +"cd0a314b": "walletBalance()", +"cd0c5896": "etherBalance(address)", +"cd0c870d": "XAP()", +"cd0e761d": "getCurrentContextAddress()", +"cd0e8900": "DEFACTO()", +"cd0ee59b": "_payByErc20(uint256)", +"cd0f26c6": "setRedemptionContract(address,address)", +"cd0f5abd": "DTCC()", +"cd0fdc24": "getPaintingArtistId(uint256)", +"cd0ffdba": "NukTestToken()", +"cd103b4d": "RateToken(uint256)", +"cd11731d": "setPlayerBookAddress(address)", +"cd11c85d": "timeTillNextAttack()", +"cd12efc8": "getsecond(uint256[])", +"cd132aad": "addPrivateSale(uint256)", +"cd133c8f": "buyXid(uint256)", +"cd13592a": "claimTokensByUser()", +"cd13c6f8": "wildlifeconservationToken()", +"cd152c0a": "getPreAuthorizedAmount(address)", +"cd154c59": "mainSaleExchangeRate()", +"cd15c6ab": "MANACrowdsale(uint256,uint256,uint256,uint256,uint256,address)", +"cd15fc71": "ContractFeatures()", +"cd16ecbf": "setNum(uint256)", +"cd17c4b6": "numOfTokens()", +"cd180fdc": "transferTokensFromAdvisorsAddress(address,uint256)", +"cd1814d7": "selfDestroyTime()", +"cd187043": "_price_token_ICO1()", +"cd18c168": "TakeEth(address,uint256)", +"cd18d5a4": "airDrop(address)", +"cd197ff6": "fechVoteInfoForVoter(address)", +"cd1a4e4d": "setHyperDisbursementAddress(address)", +"cd1a5cad": "PricingStrategy(uint256,uint256,uint256,uint256,uint256,uint256)", +"cd1a8ad7": "EGGS_TO_HATCH_1SNAKE()", +"cd1b9311": "challenge(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[])", +"cd1ce6d5": "setAdvisorFee(uint256)", +"cd1dc527": "isTokenAddressAlreadyInList(address)", +"cd1e0355": "totalRefundedAmount()", +"cd1e0717": "getRequester()", +"cd1e484b": "reserveStarsForOwner(uint256)", +"cd1f63dc": "getMinBuy(uint256,uint256)", +"cd1f8393": "logsCount()", +"cd1f9a57": "totalContractHolders()", +"cd1fca94": "BETNetworkTeamAddress()", +"cd1fdc14": "_claimReward20(address,string)", +"cd2057d0": "fail(bytes)", +"cd20b24b": "saosao5()", +"cd22ccea": "GameRoll(address,uint256,uint8,uint8,uint256)", +"cd22f418": "_getAllRevisionTimestamps(bytes32)", +"cd22f536": "addProductByRegulator(string,uint256,string,string,string,string)", +"cd230ebd": "tokensClaimableAfter()", +"cd233e25": "oraclize_gaslimit()", +"cd23dde0": "create(string,uint256,uint256,address,uint256,uint16,uint8,uint256[3],bool)", +"cd257213": "RemoveTickets(uint256)", +"cd25f56e": "OptionExercise(address,uint256)", +"cd26e1a8": "SECURITY_ETHER_CAP()", +"cd271488": "newSaleProjects(string,string,string,uint256)", +"cd277e6c": "addSolution(bytes32,address,uint32)", +"cd27d1a0": "setMaxRaiseAmount(uint256)", +"cd27f1d9": "cappedTokenSupply()", +"cd29c71a": "metadataUrl()", +"cd2a0c29": "purchase_with_eth(uint256,address,uint256,uint256,uint256,address,bytes)", +"cd2a11be": "EnableTrade(bool)", +"cd2a68e5": "withdrawBillionsCoins()", +"cd2a7a61": "broadcastState(bytes)", +"cd2ab49e": "setupBankrollInterface(address)", +"cd2b5a82": "weiToDistribute()", +"cd2cdd5b": "claimOwnershi()", +"cd2cde48": "authorizeIcoBurn()", +"cd2d5291": "walletAdvisor()", +"cd2d8a2d": "historyId()", +"cd2ec3fe": "runAnnualInflation()", +"cd2f0710": "getItemById(uint256)", +"cd2f5f2b": "clearFooArray()", +"cd2f7357": "tokenTransfer(address,uint256,uint256)", +"cd2f7c1a": "Census()", +"cd306137": "initialiseGlobals()", +"cd31037c": "BlockScheduler(address,address,address)", +"cd313ad9": "listOfFunds(uint256)", +"cd31f391": "SixtyPercentRules(address)", +"cd3265a3": "setUpgradeTarget(address)", +"cd327398": "addExceptions(address[])", +"cd3293de": "reserve()", +"cd336707": "reopenContributions()", +"cd342917": "Lesson(address,uint256)", +"cd35c5e9": "Eurotrad()", +"cd3651a7": "setLevelBonusJPYC(uint256,uint256,uint256,uint256)", +"cd367936": "fundICO(address)", +"cd37dcb8": "peCap()", +"cd3882d5": "stage4()", +"cd38aa87": "chooseWinner()", +"cd394a41": "ETH10K()", +"cd395a96": "_transferAndLock(address,address,uint256,uint256)", +"cd3a1dde": "MaxAirDropXblock()", +"cd3a376a": "changeSeller(address)", +"cd3a7531": "loadVotesForParticipantVerify(bytes32,bytes32,uint8)", +"cd3b0309": "CTokenCoin()", +"cd3c3011": "getPublishTime(bytes32)", +"cd3ce306": "redeemEther(bytes32,address)", +"cd3cf20e": "messageWithinLimits(uint256)", +"cd3de8d5": "payToController()", +"cd3e0155": "BucketDestroyed(bytes32,uint256)", +"cd3e45c5": "getTop10Messages()", +"cd3f7a50": "DepositMTU(uint256)", +"cd3fe21d": "getTotalNumberPlayed(uint256,uint256)", +"cd40137f": "resetTimeSeal()", +"cd402189": "list_files()", +"cd402c8e": "payoutSize(address)", +"cd40a48d": "send1Mil(address)", +"cd41ada1": "addressDividendReserve()", +"cd4217c1": "freezeOf(address)", +"cd423c99": "getDistributedOreBalances(address)", +"cd42693d": "victorieumToken()", +"cd43def3": "updateServiceTokensPerCredit(address,uint32,uint256)", +"cd43ebf9": "totalSpankStaked()", +"cd43ee99": "isAffiliateProgram()", +"cd45376c": "sellWine(uint256)", +"cd45e561": "CHSToken()", +"cd45fcdb": "Fxxk2Token()", +"cd46abe4": "ecosystemPercentOfTotal()", +"cd46d7e5": "approveByIndex(uint256)", +"cd474b04": "chainStartBlockNumber()", +"cd47c0e1": "cooRemoveReviewer(address)", +"cd47f390": "rescueLostKydy(uint256,address)", +"cd482d9f": "getLLV_edit_2()", +"cd48578f": "MaxEth()", +"cd495391": "setNonlistedUser(address)", +"cd496e35": "votePositionOf(uint256,uint256)", +"cd497999": "isHardCapGoalReached()", +"cd499523": "userList(address,uint256)", +"cd4aed30": "errorWithMessage()", +"cd4b3c57": "newSubdomain(string,string,address,address)", +"cd4b6914": "getRandom(uint256)", +"cd4c04c6": "Appoint(uint256,address)", +"cd4c4c0c": "getCurrentBucket()", +"cd4d0570": "getbuynode(address)", +"cd4d1664": "EconomyRebated(string,string,string,string,string)", +"cd4d4b46": "BONUS_CAP()", +"cd4d6895": "verifyEIP20(address)", +"cd4e28b5": "setNextBidExpireBlockLength(uint256)", +"cd4e396b": "USER_ACQUISITION()", +"cd4f5e90": "MTToken()", +"cd4fb3be": "newBurnableOpenPayment(address,string,uint256,uint8,uint256)", +"cd501bf7": "SignalsCrowdsale(address,address,address,address)", +"cd503c0b": "claimFees(bytes4)", +"cd504bd8": "getPhasePricesPeriods(uint256)", +"cd50d44f": "CheckRepresentment()", +"cd51bcae": "setBuyRequestLimit(uint256)", +"cd51f084": "owner_freeze_term()", +"cd5286d0": "getAsset(string)", +"cd53a3b7": "makerWithdrawAsset(uint256)", +"cd53ac45": "MANHATTANPROXYFDR()", +"cd53e455": "receivedEther()", +"cd5406e4": "getBalanceAtSnapshot(address)", +"cd54c54e": "setCirculationCap(address,uint256)", +"cd550cc8": "XferMoneyTeamAddress()", +"cd55205b": "KotET()", +"cd559561": "getPeers()", +"cd55cda2": "determineFinalOutcome(uint256)", +"cd56028f": "ArjToken()", +"cd560862": "EZ25COIN()", +"cd5617b6": "STCDR()", +"cd5655da": "setPixelBlock(uint256[],uint256[],uint256[],uint256[])", +"cd565bc5": "determineAffID(uint256,uint256)", +"cd5681d5": "mintRefs(bytes32)", +"cd568d0f": "submit(string,int8,int8,int16,string)", +"cd56f019": "getDefaultClaim(address)", +"cd572a07": "BOF()", +"cd575c32": "mintGem(uint256,string,uint256,bool,uint256)", +"cd576dd0": "IPAC()", +"cd5777e2": "allocateTokensToInvestors(address,uint256)", +"cd57a448": "SwapContract(address,uint256)", +"cd57a650": "BasilNetwork()", +"cd584045": "enableApproval()", +"cd586a50": "OnliCoinToken()", +"cd58a867": "internalAssignTokens(address,uint256,uint256,uint256,uint256)", +"cd58e75b": "newBurnableOpenPayment(address,uint256,uint8,uint256,string)", +"cd591822": "CanaryV7Fast()", +"cd59bf5b": "getNowFromOwner()", +"cd5a489d": "killContract(bool)", +"cd5a57cb": "registerOpinion(uint256,string)", +"cd5a9bf3": "isCurrentOrPastAccountMinter(address)", +"cd5ab612": "buyEmptyPixelArea(uint256,uint256,uint256,uint256)", +"cd5acd4d": "setKey(bytes32,bytes32,bytes)", +"cd5b4ae0": "zHQPreSale()", +"cd5b8837": "distributeGREEN(address[],uint256,uint256)", +"cd5ba752": "firstPlacePot()", +"cd5ba978": "presale_end_block()", +"cd5bfb63": "tokenIdOf(bytes32)", +"cd5bfbe4": "initialVestAmount()", +"cd5c222f": "msgMap(uint256)", +"cd5c4c70": "deleteOwner(address)", +"cd5d6c2b": "betInfoIsLocked()", +"cd5d950f": "TaxiToken()", +"cd5dba1e": "WhiteElephant()", +"cd5dd1d0": "showMsgSender()", +"cd5e2038": "t_ImmlaTokenDepository2()", +"cd5e3c5d": "roll()", +"cd5ebd93": "calculateTimeout()", +"cd5ecd60": "theWinnernumber()", +"cd5f49d5": "transferRewards(address,uint256,uint256)", +"cd5f5c4a": "tryGet(bytes12)", +"cd60aa75": "TokenPurchase(address,uint256,uint256)", +"cd60fe35": "MAX_TOTAL()", +"cd619681": "count_nodes()", +"cd61a95a": "sellOrder(uint256,uint256)", +"cd61cb3a": "setTokenUpgrader(address)", +"cd62b382": "Sunset(bool)", +"cd634920": "buyLeader(uint256,uint256)", +"cd635b71": "ownerShipTransfer(address)", +"cd639e6c": "EthFundTransfer(uint256)", +"cd639e8c": "transferByInternal(address,address,uint256)", +"cd63acf9": "buyChest()", +"cd63d930": "distributionCap()", +"cd64b135": "_depositToken(address,uint256)", +"cd64d952": "buildConnection(address,address,address,int256,uint256,uint256)", +"cd6566b0": "battle(bytes8,bytes5,bytes8,bytes5)", +"cd65908e": "changeIPFS(string)", +"cd65bb67": "ViewToken()", +"cd67571c": "accept(address,uint256)", +"cd679413": "ASHLEY_ALLOCATION()", +"cd67e55e": "LSTRatePerWEI()", +"cd67f3bc": "LimingCoin()", +"cd68100c": "lastAddress()", +"cd69859e": "vestedAdvisors()", +"cd69a7f1": "weightsApportionDecimals()", +"cd6a7ca7": "allowance(address,address,address,address)", +"cd6c4bb0": "startSettlementPreparation()", +"cd6c8343": "getAttributeValue(address,uint256)", +"cd6d7f81": "PRICE_FACTOR()", +"cd6dc687": "initialize(address,uint256)", +"cd6dca9e": "SaleFinalised(address,address,uint256)", +"cd6e05e2": "totalPotAwayTeam()", +"cd6e4dad": "LBCToken(address,address)", +"cd6e8855": "setMedications(bool)", +"cd6ebff6": "betAmountAtNow()", +"cd6ee0c2": "WISDOM()", +"cd6f4e0d": "dragoCount()", +"cd6f7c50": "GeneNuggetsToken()", +"cd6f7fdb": "applyKarmaDiff(address,uint256[2])", +"cd6fafa2": "XXXXXXXX04()", +"cd6fc2d1": "addMiningWarPrizePool(uint256)", +"cd704cb4": "getGeneralRelation(uint32)", +"cd71a397": "contract6function1()", +"cd71a471": "withdrawMkt(address,uint256)", +"cd72250d": "multiTransfer(address[],address[],uint256[])", +"cd728815": "setSubContractAddresses(address)", +"cd7292a0": "ChessLottery()", +"cd729a91": "unlockedTeamAllocationTokens()", +"cd72ab69": "etherRaised()", +"cd73d26c": "blocksPerDeal()", +"cd73df78": "getAllUsers(bool)", +"cd74096a": "getDataHoldersRefBonus(address)", +"cd755b41": "subs(address,address)", +"cd761b9c": "Grass()", +"cd762827": "joinGame(address,uint256)", +"cd76635b": "_setAddr(address)", +"cd76aa16": "getTotalCollected(uint64,address)", +"cd76faf5": "listActiveEggs()", +"cd7724c3": "getEthToTokenInputPrice(uint256)", +"cd77521a": "setFSTAddress(address)", +"cd77a0c8": "purchaseToken(address)", +"cd7805bc": "pinged(address,uint256,uint256,uint256)", +"cd781bf3": "pullEntry(uint256)", +"cd784d1b": "isSuperUser(address)", +"cd78a3b7": "processVote(bool)", +"cd79f86d": "submitPkgHash(string,string)", +"cd7a2c3b": "ResumeICO()", +"cd7b6744": "lockGlobalToken()", +"cd7ba8fd": "currentBlockHashCst()", +"cd7c92e3": "requestPrice(uint256)", +"cd7d5b92": "STARTING_SWORD()", +"cd7da845": "throwsWhenFinalizingWithIncorrectCap()", +"cd7da914": "renounceArbiter(address)", +"cd7dfa31": "setStarDeleted(uint256)", +"cd7e3184": "getValueBonus(uint256)", +"cd7e9fa6": "RefondCoin(uint256,string,string)", +"cd7eac3a": "house_fee_pct()", +"cd7ec171": "developer_string_C(string)", +"cd7ecda0": "grantPromoPack(address,uint8)", +"cd7f85fa": "budgetMultiSigWithdraw(uint256)", +"cd7fa74b": "setPendingReview()", +"cd7fb38c": "isValidMatingPair(uint256,uint256)", +"cd7ff921": "stringIndexOf(string,string)", +"cd80da82": "tokenShare(address)", +"cd819bdd": "setaddrFWD(address)", +"cd82a778": "_allowTimelock(address,address)", +"cd836e15": "SHARDING_REWARD()", +"cd838f0f": "getNames()", +"cd83b57c": "TacoCoin()", +"cd84cff4": "wwwithdrawww(uint256)", +"cd852330": "buyFromTrusterDealer(address,uint256,uint256)", +"cd854072": "affiliatThreshold1()", +"cd8550b8": "setBonus(bool)", +"cd85e945": "EtalonToken()", +"cd863e25": "startOffering(uint256)", +"cd866ee1": "MaximCoin()", +"cd868648": "setEndBlockNumber(uint256)", +"cd86eee2": "tokenCreationMinMile1()", +"cd871b16": "matchBytes32Prefix(bytes32,bytes,uint256,bytes)", +"cd875247": "OffGridParadise(string,string)", +"cd880b1e": "kcck256stradd(string,address)", +"cd881742": "teamTokensReleased()", +"cd88333e": "coldStore(uint256)", +"cd887739": "getExpertiseId(uint256)", +"cd88bac4": "teamTokensLockAddress()", +"cd897b75": "withdrawSubRound(uint256)", +"cd8aa272": "Icarus()", +"cd8b02c8": "Revoce()", +"cd8b0a77": "getProjectJudge(uint256)", +"cd8c063b": "isTransferAllowed()", +"cd8cc844": "lotteryStart()", +"cd8cdccd": "XiiPay()", +"cd8d3918": "calcLuckyCoinBenefit(uint256)", +"cd8d8da0": "tokenFallbackExchange(address,uint256,uint256)", +"cd8db998": "isDepositBlock(uint256)", +"cd8df8ec": "activateLastSale()", +"cd8e250a": "frozenBalancesOf(address)", +"cd8ed6f6": "addMarking(bytes32,bytes32,int256)", +"cd8f8b3c": "updateMintingAgent(address,bool)", +"cd8fce49": "Consents()", +"cd905dff": "isOperational()", +"cd9063f6": "replaceToken(address)", +"cd906676": "changelp1(address)", +"cd90b99d": "spawnInstance(address,uint256,uint256,uint256)", +"cd91672d": "firstStageDatetime()", +"cd91866a": "_startGameRound()", +"cd9217f7": "eventListener()", +"cd928f69": "updateAllowedTransfers(address,bool)", +"cd92dec0": "WaterMeterAcorn(address)", +"cd92eba9": "debtLedgerLength()", +"cd932c9c": "parseTimestampParts(uint256)", +"cd93307a": "EthereumSmart(uint256,string,string)", +"cd9354e4": "successesOf(address)", +"cd9380d5": "testSetBalanceSetsSupplyCumulatively()", +"cd93f6f3": "SetPoolEntryFee(string,uint256)", +"cd943e54": "transferToLock(address,uint256,uint256)", +"cd944e3b": "EXPERTS_POOL_TOKENS()", +"cd94a2a4": "owlToken()", +"cd953744": "getZTKCheck(address,address)", +"cd9548ce": "CompanyURL(string,string)", +"cd955faa": "hasSantaCoins(address)", +"cd9679dd": "issuePRETDETokens(address)", +"cd9745f2": "voteForTransaction(uint256)", +"cd9847bc": "testAccessControl()", +"cd98b214": "getMarketCreatorSettlementFeeInAttoethPerEth()", +"cd997aa3": "getData_31()", +"cd9a1b63": "devBalance()", +"cd9a1fa6": "countOfOwners()", +"cd9a27ba": "defaultRegionTax()", +"cd9a3c98": "any(bool[7])", +"cd9a7a56": "revokeOperatorByTranche(bytes32,address)", +"cd9b2f05": "addContributors(address[],bytes32[])", +"cd9c8d80": "VerifiedInfoHash(bytes32)", +"cd9d12f2": "icoStartUnix()", +"cd9d27ed": "setDelegadoDeDistritoVerify(bytes32,bytes32,uint8)", +"cd9ea342": "testMode()", +"cd9f05b8": "balanceEtherAddress(address)", +"cda0574e": "emitNominUpdated(address)", +"cda0eeaa": "gameMinBetAmount()", +"cda113ed": "globalBet()", +"cda2695a": "sponsor(address,uint256,uint256,uint256)", +"cda35494": "bonusMintingAgent()", +"cda368c3": "teamV()", +"cda3c001": "getUnsoldPeriod()", +"cda4351b": "ViewBetByID(uint256)", +"cda43ec5": "returnHrt(address,string)", +"cda4beef": "createAuction(uint256,uint256,uint256)", +"cda6239d": "getArrayOfTiers()", +"cda68e5d": "LogDecreaseCap(uint256)", +"cda6e92a": "sendTransaction(address,uint256,uint256,string,bytes)", +"cda78dea": "DTransport()", +"cda8300e": "Transfer_data_enabled()", +"cda87e33": "getConfigBoolz(bytes)", +"cda95d80": "Reserve()", +"cdab73b5": "blackList()", +"cdab9b5b": "setProviderName(uint256,string)", +"cdaba786": "addBet(uint256)", +"cdad5f94": "sendState(bytes,uint256,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"cdad6576": "changeBountyArbiter(uint256,address)", +"cdadb0fa": "right58(uint256)", +"cdaeb47d": "removeAddressFromMaster(address)", +"cdaf4028": "getMigrationCount()", +"cdb0ec6b": "getLinkedWallets(address)", +"cdb0fed9": "Livetest()", +"cdb230be": "DHAMAR()", +"cdb23c2d": "getMonarchyFactory()", +"cdb2867b": "canVote(uint256,address)", +"cdb294a2": "startDeal(bytes32,address)", +"cdb30482": "setBalancesUSD(address,address,uint256)", +"cdb3344a": "createGravatar(string,string)", +"cdb38f4f": "preICOTokenIssuedTotal()", +"cdb532b9": "deleteCharity(uint256)", +"cdb58e21": "DUBI()", +"cdb616b2": "ForkDelta(address,address,uint256,uint256,address)", +"cdb627b2": "showRecastConfigs()", +"cdb62c16": "getCashOutAmount(uint256)", +"cdb6753b": "setNav(uint32)", +"cdb75f2b": "NemoXXToken()", +"cdb7699a": "manualTransferTokensToWithBonus(address,uint256,uint256,uint256)", +"cdb78a2a": "giveNxc(address,uint256)", +"cdb7ef81": "getMinAuditPriceMax()", +"cdb80c51": "_service()", +"cdb88ad1": "setPauseState(bool)", +"cdb986cc": "getExperience()", +"cdb99909": "fstPrivateSalePortionNumerator()", +"cdbaed5a": "_isValidDepositCountry(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"cdbb02af": "getAddressCount()", +"cdbccf50": "unfreeze_end_date()", +"cdbce03d": "checkOwner()", +"cdbcff6d": "getQuotas()", +"cdbd0f0e": "getRatioOf(address)", +"cdbd1031": "craftTwoCards(uint256,uint256)", +"cdbd3fc9": "bax()", +"cdbd7516": "allowUsers(address,address[])", +"cdbdc7a4": "DeveciToken()", +"cdbdd569": "SetLastRoomAndRound(address,uint8,uint256,bool)", +"cdbdf391": "left34(uint256)", +"cdbf9c42": "multiply13(uint256)", +"cdbfd448": "memberLog()", +"cdc04961": "setStates(address[],uint8[],uint8[])", +"cdc0563a": "presaleTokenRate()", +"cdc06bdd": "CrypviserICO(address[],uint256)", +"cdc07bbc": "_destroy(address,uint256)", +"cdc18424": "withdrawer()", +"cdc25845": "setBuyPrices(uint256)", +"cdc26dcb": "dorcasToken()", +"cdc2895c": "getOffer()", +"cdc39f4a": "addCardSet(uint256,uint256,uint256,bytes32,string,address,uint8)", +"cdc3e046": "balanceMaxSupply()", +"cdc57fd3": "modifyTokenPrice(uint256)", +"cdc5c7cd": "updateLinkHash(uint256,bytes32)", +"cdc62c03": "getFeeToTokenConversion(uint256)", +"cdc62d39": "ballotDetails(uint32)", +"cdc68b85": "create_all()", +"cdc7076d": "getMilk()", +"cdc81bc2": "totalInVaults()", +"cdc86ec4": "tokenCreationMinPayment()", +"cdc89404": "round5StartTime()", +"cdc8d357": "mintVerify(address,address,uint256,int256,uint256,int256)", +"cdcb3cdb": "crowdsaleSupply()", +"cdcb7c8f": "chase()", +"cdcb8788": "nextRoundFee()", +"cdcbac0d": "phase3StartingAt()", +"cdcc599b": "YunnimToken()", +"cdcc5d3e": "getTokenHolderTribunal()", +"cdcd77c0": "baz(uint32,bool)", +"cdcda9a8": "DogeCash(uint256,string,string)", +"cdcdb463": "getRiskParameters(bytes32)", +"cdce240c": "WillCoin(string,uint256,string,uint8)", +"cdce5206": "getUserNum()", +"cdcf0c4a": "dispute(string,address)", +"cdcf4b9b": "priceDenominator()", +"cdcf5794": "checkCooldown(address,address)", +"cdd11b83": "roundTotalWinnings()", +"cdd13589": "batchDistributeWithAmount(address[],uint256[])", +"cdd13673": "rewardReductionRate()", +"cdd13701": "getEventHashes(uint256[256])", +"cdd1b539": "getSequenceNumber(uint256,address)", +"cdd2067e": "getVendingAmountSold(uint256)", +"cdd247a9": "offerAd(uint256,uint256)", +"cdd2ef0c": "starBuy()", +"cdd3574a": "crowdsaleStartBlock()", +"cdd3ab58": "addDistributionSources(address[])", +"cdd432d0": "rewardNumerator()", +"cdd63344": "moveTo(uint256)", +"cdd6d079": "_tokensForEth(uint256,uint256)", +"cdd72253": "getVoters()", +"cdd739f6": "tokenCapForPreICO()", +"cdd7b1fd": "init(uint256,uint256,uint256,address)", +"cdd8750e": "getDueTime(bytes32)", +"cdd8b2b2": "registerBeneficiary(address)", +"cdd8cc49": "debug_string(string)", +"cdd8d4e8": "mgmtRewardPercentage()", +"cdd90fbb": "firstRoundWMDiscount()", +"cdd93332": "getTradingStart()", +"cdd977e0": "addrService()", +"cdda62ad": "FutureBlockCall(address,uint256,uint8,address,bytes4,bytes,uint256,uint256,uint16,uint256,uint256)", +"cdda96cf": "TokenPriceETH()", +"cddaf241": "distributeReservedTokens(uint256)", +"cddb4e44": "getDataAddress()", +"cddb523b": "changeTeamWallet(address,address)", +"cddb8e94": "buyProduct(address,uint256)", +"cddbe729": "game(uint256)", +"cddbff7c": "CRYPTODUBAI()", +"cddc028b": "IndexEmpireToken()", +"cddc37c1": "withdrawForTwoYear()", +"cddce877": "TOKEN_SHARE_OF_LEGALS()", +"cddd351c": "transferFromOnBehalf(address)", +"cdde5413": "updateTileTimeStamp(uint16)", +"cdde76f7": "hasAnyAttrs(uint256,bytes2)", +"cdde9294": "avgTokenWinValue()", +"cddeaba0": "setTokenPrice(uint256,uint256,uint256,uint256)", +"cddfbaaf": "AirDropAFTKSeven()", +"cde02b25": "totaldivineTokensIssued()", +"cde0a4f8": "setRegulator(address)", +"cde180a9": "listContractByModuleId(string)", +"cde1d97a": "ChangeTokenVaultAddress(address)", +"cde25f8a": "getWineOwner(address)", +"cde2c35a": "rewardBobaBase(uint256)", +"cde2d72a": "receiveBTC(address,string,address,uint256,string)", +"cde2e8d7": "A2ACrowdsalePartner()", +"cde4018e": "AgriChainData()", +"cde40bc8": "bonusFirstWeek()", +"cde43f28": "mintTokens(uint256,int256,address,uint256)", +"cde4efa9": "flip()", +"cde596b2": "Pay(address)", +"cde5f58f": "RELEASE_INTERVAL()", +"cde68041": "hasPermission(address,address)", +"cde74e51": "licenses(bytes32)", +"cde7da75": "claimActingPlayerOutOfTime(uint256)", +"cde7f980": "save(string,address,uint256)", +"cde93eec": "NewIssue(address,uint256)", +"cde99727": "calculateROI()", +"cde9f2ea": "startdate()", +"cdea76d6": "buyLong(address[2],uint256[2],uint8,bytes32[3])", +"cdeaf5bc": "addItem(uint256,uint256,uint256,uint32[8])", +"cdeb1485": "massTransfer(address[],uint256[],bytes32)", +"cdeb7bac": "MaiToken2()", +"cdebf885": "Rent(address,uint256,uint256,uint256)", +"cdecd1d7": "FUN()", +"cded6986": "_getBridgeTokenFee(uint256)", +"cded6fa5": "JesusCrowdsale()", +"cdeda055": "_assert(bool)", +"cdee2112": "CyberToken()", +"cdee2b92": "saleclosingTime()", +"cdee5c4a": "raceRegistration(uint256,address)", +"cdee8973": "Swapped(address,uint256)", +"cdef3911": "assignTokenOperator(address)", +"cdef9423": "create(address,address,address,address,address,address,address,uint8,string)", +"cdef9fb6": "SimpleStore(uint256)", +"cdefa007": "FondoNetwork(uint256,string,string)", +"cdefa4de": "ParaD2Test()", +"cdefe704": "getLOCbyID(uint256)", +"cdf016ca": "minimumBounty()", +"cdf05ab5": "voteTime(uint256)", +"cdf20e1e": "currentSyndicateValue()", +"cdf32cab": "totalInvestedWei()", +"cdf3bc6f": "revise()", +"cdf3bdab": "GetMyAcorn()", +"cdf45c03": "FourLeafClover()", +"cdf46344": "mint(address,string,string,uint256,uint64,uint64,uint64)", +"cdf4d6b4": "registerKYC(address[])", +"cdf574f1": "purchase(uint256,bytes7)", +"cdf6ddb4": "activeCrowdsalePhase1(uint256)", +"cdf744b2": "setFounderPercent(uint256)", +"cdf90e02": "Roles2LibraryAndERC20LibraryAdapter(address,address)", +"cdf93c0f": "EtherBlock()", +"cdf99413": "CrowdsaleToken(string,string,uint256,uint256,bool)", +"cdf9b77e": "getCurrency(uint256)", +"cdfb0a21": "PRVTSToken()", +"cdfb2b4e": "enableWhitelist()", +"cdfb5832": "setClaimer(address)", +"cdfbc437": "setMaxBetAmount(uint256,uint256)", +"cdfbc8f1": "MINIMAL_PURCHASE()", +"cdfbe22c": "isAnExchanger(address)", +"cdfc20aa": "addHashType(uint8,string)", +"cdfd293b": "BOUTSPRO_AMOUNT()", +"cdfd72e8": "calcTeamEarnings(uint256,uint256)", +"cdfd7474": "SONICToken(string,uint8,string)", +"cdfdb7d6": "increaseAllowance(address,uint256,address)", +"cdfe2815": "createVip(address,uint256,uint256,uint256)", +"cdff1be4": "pauseWithdrawal(address,address)", +"cdff5857": "updateUint256s(bytes32[],uint256[])", +"ce00d49c": "_transferWithRate(address,address,uint256)", +"ce017242": "updateICOPrice()", +"ce01e1ec": "set2(uint256)", +"ce021384": "numberOfReferralCodes(address)", +"ce0457fe": "NewOwner(bytes32,bytes32,address)", +"ce04a8c5": "isDAppReady()", +"ce04c10e": "highContributionAward(address)", +"ce050632": "setBettingTime(uint256)", +"ce05264f": "createInterceptorFromVault()", +"ce05369b": "releaseTokenHolder()", +"ce058d0d": "ChangeLEXTokenAddress(address)", +"ce0617ec": "lockedUntil()", +"ce072163": "collectPayments()", +"ce07d2b4": "proxyTransfer(address,address,uint256,bytes)", +"ce098093": "createtoken(string,string,string,address)", +"ce0a191a": "setLotteryTokensPercent(uint256)", +"ce0b5bd5": "cancelWhitelistRemoval(bytes32)", +"ce0bb9c4": "looksCoin()", +"ce0bd51f": "bancorConverterFactory()", +"ce0befcf": "remainTokens()", +"ce0d5f78": "addAddressToBlacklist(address,address)", +"ce0df06b": "FreezeAccount(address)", +"ce0e19ba": "appendString(string)", +"ce0f802d": "MaazBTC()", +"ce0f92b7": "hashOrder(bytes,uint64,uint64,uint256,uint256,uint256)", +"ce0ff8d8": "CSStoken(uint256,string,string)", +"ce10814c": "wmax(uint128,uint128)", +"ce109195": "internalDoesEventExist(bytes32)", +"ce10cf88": "getAddressByIndex(uint256)", +"ce11f2bb": "vote(uint256[])", +"ce120afb": "_safeTransferPaymnt(address,uint256)", +"ce139296": "icoPhaseDiscountPercentage1()", +"ce13bfb7": "cancelLoanOffering(address[9],uint256[7],uint32[4],uint256)", +"ce144eb9": "spiceUp(string)", +"ce146d3d": "getTotalWins()", +"ce148564": "TIER3END()", +"ce148c1f": "tempTokensPeriodOf()", +"ce14a46e": "totalPeriod()", +"ce14d404": "PieTokenBase()", +"ce14eeb8": "BASE_HARD_CAP_PER_ROUND()", +"ce14f10b": "disabled(uint256)", +"ce15647a": "getTeam(uint8)", +"ce158ba2": "approveCompanyAllocation(address)", +"ce160edd": "searchAndBid(uint256,uint256)", +"ce1619f8": "_lockPaymentTokens(address,uint256,uint256)", +"ce161b57": "AngelTestToken()", +"ce165894": "updateExpectedAmount(bytes32,uint8,int256)", +"ce17f01e": "Hostblock()", +"ce18eb0b": "stage1Deadline()", +"ce19419b": "testThrowsSetNotUpdatableNotOwner()", +"ce1a70a3": "SimplePreTGEContract()", +"ce1aafc0": "VinaexToken()", +"ce1afbe1": "_transferToken(address,address,uint256)", +"ce1b088a": "withdrawDonations()", +"ce1bd789": "DestroyTransferFeeCoin()", +"ce1c1538": "getCardByOwner(address)", +"ce1c93af": "abandon(string)", +"ce1cf229": "SimpleMultiSigWallet()", +"ce1d6ea0": "testAppendTranch()", +"ce1ed182": "getLastMilestoneStartsAt()", +"ce1ed2bb": "BecomeSquirrelDuke()", +"ce1f561c": "holdingTaxDecimals()", +"ce1ffcd9": "setTransferEnable(bool)", +"ce203b83": "officialUserSignUp(string,address)", +"ce204b78": "defrozen(address)", +"ce204bf1": "TOKEN_LOCKING_PERIOD()", +"ce20fd84": "query(bytes2,int256)", +"ce21abf3": "sendUnsoldPRETDETokensToTDE()", +"ce21fbf4": "GolemToken()", +"ce220ecf": "testAddBalanceFailsAboveOverflow()", +"ce2293ca": "EIB(string,string,uint8,uint256)", +"ce230030": "unlockSupervisedFunds(address)", +"ce233452": "limitPurchasing(uint256,uint256)", +"ce23772b": "removeWalletFromWhitelist(address)", +"ce23e8bc": "LIQUIDATION_TOKENS_PER_ETH()", +"ce23f2b2": "newLoan(bytes32,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"ce241d7c": "LogSetOwner(address)", +"ce248843": "removeOne(address)", +"ce255bba": "setsafekey(uint256)", +"ce266af8": "tom()", +"ce267b55": "ecdsaVerify(address,bytes,uint8,bytes32,bytes32)", +"ce2777a3": "BigchatToken(uint256,string,uint8,string)", +"ce27a21a": "setLogoPrice(uint256)", +"ce289284": "Result(bytes1)", +"ce2a9f62": "totalEthCollected()", +"ce2c6ad5": "getChainFeeArray()", +"ce2ce3fc": "getLocation()", +"ce2d173f": "setSelfOff()", +"ce2d3fa1": "returnKVTToOwner()", +"ce2dfd00": "createFootballerStar(uint256,uint256,uint256,uint256)", +"ce2f67a2": "exampleFunction()", +"ce2fc873": "setArticleHash(uint256,string)", +"ce2fc8b1": "RequestC(bytes32,bytes32)", +"ce2fce38": "getTransferInfo(address,uint256)", +"ce3099fa": "testNBool()", +"ce30b8d9": "operatorBurn(address,uint256,bytes)", +"ce3174ca": "revokeSubmission(address,address)", +"ce329570": "byzantineCloseChannel(bytes32)", +"ce347a65": "fund(uint16)", +"ce3498b8": "DelegatedIdentity(address)", +"ce356e3a": "addTeam2(uint64,uint64,uint64,uint16)", +"ce371431": "queryFunds(address)", +"ce373b95": "heroOfThePit()", +"ce376aa3": "buy_king()", +"ce3800e1": "moonLevel()", +"ce383ec7": "view68()", +"ce389e53": "getTokenAddHold()", +"ce394696": "calculateCost(uint256,uint256)", +"ce39952a": "disableSecureMode()", +"ce39976d": "getUrlAtIndexOf(address,address,uint256)", +"ce3a7076": "Cancelot(address,address)", +"ce3b0475": "changePriceDecraseTime2Action(uint256)", +"ce3be6bb": "withdrawWallet1()", +"ce3cc3aa": "changeTolerance(address,bytes32,uint256)", +"ce3ccfd0": "shouldReturnDefault(bytes32)", +"ce3cd997": "setStage(uint8)", +"ce3cef0d": "stopTakeToken()", +"ce3d9237": "mintMarginTokens(bytes32,address[7],uint256[8],uint32[2],bool,bytes,bytes)", +"ce3e82a4": "KorkToken()", +"ce3f865f": "collect(uint256)", +"ce3fff35": "ONTTotalSupply()", +"ce4150eb": "migrateMarketInFromSibling()", +"ce419871": "openKYC()", +"ce41d75d": "NewIntelTechMedia(address)", +"ce4254ce": "terminationTime()", +"ce4258e9": "OPENAI()", +"ce429429": "generateOrderByMerchant(address,uint256,string,string,string)", +"ce42bb11": "getLockedDevFundAmount()", +"ce42fa88": "Telcoin(address)", +"ce435f4b": "SetParticipantAgrHash(address,address,bytes32)", +"ce43b0c0": "creditorAddresses(uint256)", +"ce43c032": "getUsername(address)", +"ce43c097": "CradTimeLock(address)", +"ce44573a": "GenChipByRandomWeight(uint256,uint8,uint256[])", +"ce45a260": "CryptoDime()", +"ce45f981": "MooAdvToken(uint256,string,string)", +"ce468922": "transferCat(bytes5,address,address,uint256)", +"ce46e046": "isPayable()", +"ce471aee": "kompitechToken()", +"ce47befd": "checkoutCart(string)", +"ce47e604": "sendAliceBlue(address,uint16,uint256)", +"ce483c42": "statusI()", +"ce483e88": "incrementOpenInterest(uint256)", +"ce48a54d": "getHeroLevel(address,address)", +"ce49735a": "distributeAlliniTokens()", +"ce4a6f09": "offerCanvasForSaleToAddress(uint32,uint256,address)", +"ce4a9206": "minPayInterval()", +"ce4ae74a": "setRewardMinter(address,uint256)", +"ce4c4a74": "TrueFlipToken(address)", +"ce4cf4c8": "advisorTotal()", +"ce4d01a3": "validate(uint256)", +"ce4d66b9": "roundBonus(uint256)", +"ce4d6fdf": "maritalStatus()", +"ce4dbdff": "securityTokenRegistry()", +"ce4ddabd": "updateTimeRC(address,uint256,uint256)", +"ce4e42d2": "BountyManager(address)", +"ce4e5aa4": "findBestMatch()", +"ce4e84a3": "STARTING_CHICKEN()", +"ce4e8c1a": "createNextPremiumSale(uint8,uint256)", +"ce4eb657": "updateXDRRate(uint256)", +"ce4ef577": "tokensAllocatedForAs(address,address,address,address,address,address,address,address,address)", +"ce4efe62": "insert(uint256,bytes32,bytes32)", +"ce507401": "oraclizeGasPrice()", +"ce50f72d": "getAvailableBalanceOf(address,address)", +"ce50f926": "getMinLimit()", +"ce510d46": "neededAmountTotal()", +"ce513b6f": "withdrawable(address)", +"ce52242e": "gotchinfo(address)", +"ce522f22": "updateWeiCap(uint256)", +"ce52c4ef": "createDelegation(address,uint256)", +"ce52cf84": "encoding_format()", +"ce53ee2d": "voteNoLockByAdmin(address,address,uint256)", +"ce5440bb": "depositAgent3(uint256,uint256,uint256[],uint256[],uint256)", +"ce5478a4": "lockedCapitalOf(address)", +"ce5494bb": "migrate(address)", +"ce5566c5": "cash(uint256,uint256)", +"ce557031": "purchaseTokens(address)", +"ce5570ec": "isWallet(address)", +"ce563036": "BaseContract()", +"ce5659bc": "changePartner2(address)", +"ce56c454": "withdrawEther(uint256,address)", +"ce56f3fb": "moneybuy(address,uint256)", +"ce5774c6": "Proposal(string)", +"ce578cd6": "managementContractAddress()", +"ce57d8d5": "getSingleInvestor(address)", +"ce5910f3": "unfreez()", +"ce592586": "setThresold(uint256,uint256)", +"ce5968da": "onMint(int256,address,uint256)", +"ce597164": "normalDemurrageAmount(uint256)", +"ce5a5df7": "createUnicorn(address)", +"ce5a63ff": "purchaseBlock(uint256,uint256)", +"ce5ac32d": "Firmament()", +"ce5c073d": "setMintMaster(address)", +"ce5c2c33": "performTransaction(uint256)", +"ce5c4fd8": "finalizeSale(uint256,uint256)", +"ce5c5201": "cryptogsAddress()", +"ce5d80e6": "stealCardWithId(uint256)", +"ce5e13aa": "getPlayerProfit(address)", +"ce5e4190": "set_tokens_per_ether(uint256)", +"ce5e6393": "tgrSetFinished()", +"ce5e84a3": "activate(bool)", +"ce5e9ffb": "CORRECTION()", +"ce5f9454": "numerator()", +"ce5fa1e9": "secondExchangeRatePeriod()", +"ce5fd7f3": "OfferContract()", +"ce606ee0": "contractOwner()", +"ce60f78d": "createMarriage(bytes,bytes,uint256,bytes,bytes)", +"ce622ec5": "announceWinner(string)", +"ce6236ca": "getRoundLength()", +"ce627bd9": "mineblocksAddr()", +"ce629a6b": "_computeTournamentBooty(uint256,uint256,uint256)", +"ce63066f": "test_6_basicTransfer_increaseBlocksBy1000()", +"ce6342f3": "getAbiVersion()", +"ce63cc89": "postTask(string,string,uint256,uint256)", +"ce649b39": "setEthereumRate(uint256)", +"ce655952": "_cancelSale(uint256)", +"ce665dd8": "OFFSET()", +"ce67bda6": "testNop(int256,int256,uint256)", +"ce686e40": "IcoToken(string,string,uint256,string)", +"ce686e62": "BurnableOpenPayment(address,uint256,bool,uint256,string)", +"ce691294": "kRate()", +"ce6933d5": "fetchPaidOrdersForPayer()", +"ce695d7f": "_addArea(address,uint256)", +"ce699a41": "releaseVestedTokens(address)", +"ce69cd20": "MIN_BID()", +"ce6a9bd6": "proofType_Ledger()", +"ce6b3467": "withdrawExcessToken(address)", +"ce6c0b64": "_getTokenNumberWithBonus(uint256)", +"ce6c2589": "_emitOracleRemoved(address)", +"ce6c5080": "tokenSetAudit(address,address,address,address)", +"ce6c9a89": "changeMinimalWei(uint256)", +"ce6d35d1": "migrateToken(address,address)", +"ce6d41de": "getMessage()", +"ce6eaef5": "startSecondSale()", +"ce6eaff9": "YOU_BET_MINE_DOCUMENT_SHA512()", +"ce6efb07": "AmountLimitCrowdsale(uint256,uint256)", +"ce6f149c": "WEEKS_26()", +"ce6f899d": "EventLogin(address,string)", +"ce709c9b": "proposalCreateTime(uint256)", +"ce70faec": "createUltimateOracle(address,address,uint8,uint256,uint256,uint256)", +"ce71b83c": "TianqibaoTokenERC20(uint256,string,string)", +"ce71caee": "juryOperator()", +"ce72a696": "ICO_PERCENTAGE_1()", +"ce73a61d": "setWhitelistExpiration(uint256)", +"ce73b41a": "addBuyTokensRequest(address,string,uint256,uint256)", +"ce742222": "SCARABToken2()", +"ce744ba5": "SellOffer(address,address,uint256,uint256,uint256,uint256)", +"ce746024": "recover()", +"ce7462e9": "setStarSellPrice(uint256,uint256)", +"ce749c29": "defund()", +"ce774030": "raiseCoinsAdded(address,uint32,uint256)", +"ce77cf42": "Rafflecoin()", +"ce782e08": "floorLog2Test(uint256)", +"ce784216": "scrapCount()", +"ce7842f5": "referralBonus()", +"ce784564": "findPositionInMaxExpArray(uint256)", +"ce78b752": "ActivatedEvent(bool)", +"ce7917d7": "GEOCOIN()", +"ce794294": "multisignature()", +"ce799b0a": "changeStakeRate(bytes32,uint256)", +"ce79add1": "givableBalanceOf(address)", +"ce79d17d": "Storesumdata(bytes32,bytes32,uint64)", +"ce7a0697": "_internalTgeSetLive()", +"ce7a2b02": "processPayment(address,address)", +"ce7a60ab": "unlockBalance(address)", +"ce7a94eb": "SliceByte32(bytes,uint32)", +"ce7aa79f": "PXMCToken(uint256,string,uint8,string)", +"ce7ab6a7": "set_refunded(bool)", +"ce7ba916": "_initBadges(address,uint256,uint256,uint256)", +"ce7c2ac2": "shares(address)", +"ce7c5d7f": "transferEthToOwner(uint256)", +"ce7ca615": "FoundationAddress()", +"ce7ca665": "medalBoost()", +"ce7cdbb7": "getIndexRoot(bytes32)", +"ce7d3539": "AVMDisputeProcess()", +"ce7e23a0": "UnityToken(address,uint256,uint256)", +"ce7e51e3": "uint256ToString(uint256)", +"ce7f6e82": "CoinPulseToken()", +"ce7fc203": "accForTeam()", +"ce803a70": "noOfSeats()", +"ce806176": "setPurchasing(bool)", +"ce809e4e": "ETH_DECIMALS_FACTOR()", +"ce813d8f": "addTurretParts(uint8[])", +"ce816706": "X4BToken()", +"ce818ed5": "SiringClockAuction(address,uint256)", +"ce82eb33": "ico4Bonus()", +"ce830f5b": "_unlockToken(address)", +"ce845d1d": "currentBalance()", +"ce85e801": "MAX_PRICE_SALE()", +"ce85fbe2": "joojinta()", +"ce860a62": "getShipIdsByOwner()", +"ce869a64": "fails()", +"ce8721b2": "daoAccounts(address)", +"ce873a67": "processReferer(address)", +"ce8775a4": "win(uint256,uint256,uint256,bytes,uint256)", +"ce87f626": "replaceWizardRP(address)", +"ce8804c9": "setAdvertAddr(address)", +"ce883cdb": "getPoolsLength()", +"ce8883af": "potFee(uint256)", +"ce88a9ce": "setProduction()", +"ce88b145": "getAccount(uint256)", +"ce89a2a2": "changeSettings(uint256,uint8)", +"ce89b5de": "buy100()", +"ce89c80c": "calcKeysReceived(uint256,uint256)", +"ce8ac033": "getAvatar(address)", +"ce8ae9f3": "giveReward(address,uint256)", +"ce8b5b60": "setLockAfterManuallyMint(bool,int256)", +"ce8b7151": "isHF()", +"ce8b7be4": "consultantsAllocation()", +"ce8bbe4b": "bobMakesErc20Deposit(bytes32,uint256,address,bytes20,address)", +"ce8bcae3": "allFundsCanBeUnlocked()", +"ce8d054e": "_setupNoCallback()", +"ce8d096d": "redeemVestableToken(address)", +"ce8d1910": "claimFromSeveral(uint256,address[])", +"ce8d388d": "disableWithdraw()", +"ce8d73de": "o_labirinto(uint256)", +"ce8dc388": "TOTAL_ROUNDS()", +"ce8e120a": "thawTransfers()", +"ce8e2fd8": "SaintArnouldToken(address,uint256,uint256)", +"ce8e5170": "burnedAfterSaleCount()", +"ce8e95d4": "updateRegion(uint256,uint256,uint256[],bool,bool,uint8[128],bool,address)", +"ce8ebfc8": "makeSchoolToken()", +"ce8ff29b": "TicTacToeAdjudicator(address,address,address,address,uint256)", +"ce90203c": "computeSellPrice()", +"ce906c6a": "listPrycto5()", +"ce909980": "checkTimeout(address)", +"ce90bafa": "topUpERC20(address,uint32,uint192)", +"ce912692": "createNew(address,address,address,uint256,uint256,uint256)", +"ce916d85": "icoTokensReceived(address)", +"ce91e4b3": "freezeaccount(address,bool)", +"ce923728": "setDealMembers(address,address,address,uint256)", +"ce92dced": "newBid(bytes32)", +"ce93b0e4": "returnAdvisorTokens(address,uint256)", +"ce950d1e": "FancyAssetsCoin(uint256,string,string)", +"ce952345": "icoAssignReservedBounty(address,uint256)", +"ce95aad2": "isOnCraftingAuction(uint256)", +"ce95b475": "getBalanceByAdress(address,address)", +"ce96c8e4": "set_deposit_manager(address)", +"ce96ec6b": "setRefer(address)", +"ce972050": "token_orderSheet(address,uint32)", +"ce972f33": "Menu01(address,uint256)", +"ce97f61a": "submitTally(uint256,uint256,uint256)", +"ce9822c7": "Magic10(uint256,address)", +"ce99151e": "p_wallet()", +"ce9a3b0f": "special()", +"ce9a6ac8": "putOn(uint256,uint256,address)", +"ce9ae667": "PharmaWit()", +"ce9ae91c": "getARed(uint256,uint256)", +"ce9af2b9": "isReserved(string,address,string,bytes32)", +"ce9b4321": "calculateCommission(uint256)", +"ce9c39c9": "stepTwoStartTime()", +"ce9e673b": "forceOffsetBasicFeeRate()", +"ce9e6bb7": "setEndTimeIcoStage2(uint256)", +"ce9e7730": "createSubcourt(uint96,bool,uint256,uint256,uint256,uint256,uint256[4],uint256)", +"ce9f24dc": "SilentNotaryCrowdsale(address,address,address,uint256)", +"ce9fb088": "TransferSellAgentBounty(address,uint256)", +"cea024d9": "tokenPriceNum()", +"cea08621": "changeDailyLimit(uint256)", +"cea10af7": "hardFundingGoal()", +"cea15706": "DarkrenlandCoin()", +"cea16c83": "endFinalStage2()", +"cea198c8": "LogBidCanceled(bytes32)", +"cea22b51": "ico_stage()", +"cea289db": "debugInt(uint256)", +"cea2ed48": "CreatedPet(uint64)", +"cea4b687": "updateListingWithSender(address,uint256,bytes32,uint256)", +"cea5033c": "_requestTokens(address,uint256)", +"cea5b151": "getLabelHash(string)", +"cea5d64b": "shift_right(uint256,uint256)", +"cea63361": "transactionFeeRateM()", +"cea65e97": "addressIsOwner(address)", +"cea67184": "getHydroId(address,address)", +"cea7555b": "distributedFundariaStakes()", +"cea81ab1": "generateContestForDelegationSchemaHash(address,uint256,bytes32)", +"cea876ba": "EthMatch(uint256)", +"cea943ee": "getSaleConfig()", +"cea9707a": "getMyTicketList(bool,uint256,uint256)", +"cea99275": "hasInitMartial()", +"cea9b7af": "ICO_EOS_AIRDROP()", +"cea9d26f": "rescueTokens(address,address,uint256)", +"cea9f621": "setVars(address,address)", +"ceaa50d4": "getLastPayoutAmountAndReset()", +"ceaae25d": "massChangeRegistrationStatusForGoldWhiteList(address[],bool)", +"ceaafb67": "AnonymousDeposit(address,uint256)", +"ceab09d8": "set_participant(address,uint256,uint256,uint256,bool,uint8)", +"ceab4ea7": "VOODOO()", +"ceac2aed": "submit_payment(uint256,uint256,bytes32,bytes32,uint256,address,bytes32)", +"ceacc749": "calcCurrentMinBid()", +"cead2c29": "get_ptc_balance(address)", +"cead4620": "putBtoWithSto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"ceadd9c8": "donateAsWithChecksum(address,bytes4)", +"ceae3424": "balanceSoll(address)", +"ceae7f64": "thirdStageMinting()", +"ceaf0bfb": "admAccount(address,bool)", +"ceaf1e94": "_transferToAddress(address,uint256)", +"ceaf9519": "needToGetFree()", +"ceafb18d": "getCard(address)", +"ceb0884d": "getSolution(address,uint32)", +"ceb10f1c": "preIcoCap()", +"ceb21433": "Activate(address,address,address,address)", +"ceb22fa0": "meteredEarn(uint256)", +"ceb24797": "getKycLevel(address)", +"ceb2731a": "purchaseCrate()", +"ceb35b0f": "addAddress(string,address)", +"ceb408b4": "_set5()", +"ceb41385": "getHashLeftPad()", +"ceb44d04": "checkSplitEnd(uint256)", +"ceb51f0a": "setApproved(address,uint256)", +"ceb5bc46": "proshgold()", +"ceb60654": "getGroup(uint256)", +"ceb6dbc3": "time_of_token_swap_end()", +"ceb791d9": "priceRate()", +"ceb7bc87": "tokenTransferFrom(address,address,uint256,address[])", +"ceb7e43c": "getAddOnComplete(uint16)", +"ceb88ff4": "setContribution(address,uint256)", +"ceb8ee8b": "durationInMinutes()", +"ceb98dc7": "unbuy()", +"ceb9a5fd": "getGameCurrentRoundId(uint256)", +"ceba1794": "MAX_LOAN_AMOUNT()", +"ceba30b5": "scheduleTransaction(address,bytes,uint256[4],uint256)", +"ceba5029": "MOBTokenIssue(address)", +"cebac2f2": "LRCLongTermHoldingContract(address,address)", +"cebae575": "GLAU()", +"cebb8bb0": "testControlRestartEnforceRevisions()", +"cebbbce5": "ClaimAirdrop(address,uint256)", +"cebc141a": "devCount()", +"cebc9a82": "getDelay()", +"cebce72d": "token(uint64)", +"cebd31bc": "getStartingPrice()", +"cebe09c9": "quota()", +"cebf3bb7": "minRaise()", +"cebfa61e": "month18companyUnlock()", +"cec0213e": "HealthDataChain(uint256,string,string)", +"cec0f734": "setTransferToken(uint256)", +"cec10c11": "setFees(uint256,uint256,uint256)", +"cec1365a": "ShortLimit(uint256)", +"cec17a12": "ChrisBell(uint256,string,uint8,string)", +"cec33f4e": "getPatentFee(address,uint16[5],uint256)", +"cec3638d": "VotingChallenge()", +"cec36cb4": "refundPoweredUp()", +"cec4a1cc": "pauseRefund(bool)", +"cec4ab9c": "whitelistEnable()", +"cec63cea": "NamoToken()", +"cec68824": "registerFull()", +"cec7260b": "move_monster(uint16,uint16)", +"cec77ad5": "ALLOC_ADVISOR()", +"cec7b4e8": "Deposit(uint256,address,uint256,string)", +"cec8d277": "decrypt(address,bytes,string)", +"cec95aa1": "getReleaseHashForPackage(string,uint256)", +"cec9b4ef": "_executeTransaction(uint256)", +"cec9df89": "getAddressBetsForEvent(bytes32,address,string,string)", +"ceca122d": "activate(bool,bool,bool)", +"ceca7e8e": "fundLock(address,uint256)", +"cecaf395": "buildBlocks(int32,int32,bytes16)", +"cecb06d0": "mintOwner()", +"cecc33e7": "issueTickets(address,uint256,uint256)", +"ceccc10e": "getHoldersNameAddr()", +"cecd0264": "executePayment(string)", +"cecd0ab5": "_processFundsOverflow(address,uint256)", +"cecd9dd4": "_isNeededNewLottery()", +"cecdc6aa": "TEAM()", +"ced095d6": "getContest(string)", +"ced0a3a5": "setHookOperatorContract(address)", +"ced0bcc3": "MangaCoin()", +"ced0c0c2": "subscriptionRate()", +"ced0d31d": "setFeeRate(uint256,uint256,uint256,uint256,uint256,uint256)", +"ced11e40": "addMemory(string,bytes)", +"ced1a60b": "pooja()", +"ced29978": "LogFrozenAccount(address,bool)", +"ced32b0c": "setSender(address)", +"ced39558": "buyLand(uint256)", +"ced3fb9c": "isAddressAuthorized(address)", +"ced444bf": "offerStarForSaleToAddress(uint256,uint256,address)", +"ced4c064": "withdrawTo(string,address)", +"ced4f4b8": "sellEther()", +"ced659b6": "burnMktCoins()", +"ced72f87": "getFee()", +"ced78ed1": "getImageData(uint256,uint16)", +"ced7d018": "reFundByOther(address)", +"ced80aca": "updateMultipleReservedTokens(address[],uint256[],uint256[],uint256[])", +"ced84a71": "addInvestor(address,uint256,uint256)", +"ced92670": "changeMultiplier(uint256)", +"ced9f7c0": "mokenNoName(uint256)", +"ceda4a03": "NovioCoin_TEST()", +"cedadaca": "SingularityTest6()", +"cedbbeee": "createTokens(address)", +"cedc01ae": "getActivator(address)", +"cedc2ce1": "setMaxTransfers(uint256)", +"cedc7277": "getBuyPrice(address)", +"cedcbd99": "ACTION_BUY_OFFER_ACCEPTED()", +"cedcd770": "foundationWithdraw(uint256)", +"cedd90f6": "purchase(bool,bool)", +"ceddd07d": "balanceOfUnlocked(address)", +"cedf222e": "congressMemberThreshold()", +"cee024dc": "getNumberOfVotes()", +"cee02a86": "SOFTCAP_ETH_LIMIT()", +"cee0b4fe": "CRTSTAL_MINING_PERIOD()", +"cee13e28": "Conversion(address,address,address,uint256,uint256,int256,uint256,uint256)", +"cee24e31": "gambler1()", +"cee26ed5": "sellers(uint256)", +"cee2a9cf": "isInvestor(address)", +"cee401ef": "enableICO()", +"cee594c8": "addStage(uint256,uint256,uint256,uint64,uint64,uint256)", +"cee6b0d9": "AcceptsSunny2(address)", +"cee6b53c": "updateLastActivity()", +"cee6ee38": "aEthereumlotteryNet()", +"cee6f794": "SEKEM()", +"cee6f93c": "getResultOfLastFlip()", +"cee73630": "buyTPT(uint256,uint256,uint8,bytes32,bytes32)", +"cee749bc": "withdrawTokenRefund(uint256,address)", +"cee80356": "min4payout()", +"cee829ea": "refundMany(address[])", +"cee8fa1f": "Funding_Setting_cashback_time_end()", +"cee93e23": "isActive(uint32,int256)", +"cee96f49": "setissuedSupplyRatio(uint256)", +"ceea3914": "lookupUserDonationHistoryByCampaignID(address)", +"ceead4b6": "setCompte_10(string)", +"ceeafd9d": "withdrawFundsAdvancedRP(address,uint256,uint256)", +"ceeb7066": "setJoinFee(uint256)", +"ceebe28d": "repoInterfaceVersion()", +"ceec8f8f": "removeProduct(string,string)", +"ceee4119": "getUsersRadarsIds()", +"ceee9658": "rotate_right(uint256,uint256)", +"ceeea0ea": "completeAttack(bytes32)", +"ceef3800": "calculateBonusTierQuotient()", +"ceef3d93": "changelp7(address)", +"ceef644c": "LIFEINVIDER()", +"ceefbbd6": "prePreIcoEndAt()", +"cef037fd": "setContinueSelling()", +"cef062fc": "reserveVault()", +"cef0e9e2": "getFalconmasterReq()", +"cef24cac": "AmountToFund(uint256)", +"cef29521": "PRICE_MULTIPLIER_ICO4()", +"cef2e559": "marketplace_storage()", +"cef42254": "getContribution(uint256)", +"cef4be3c": "partialClaim(address,uint256)", +"cef55ae1": "newComp(uint8)", +"cef5ed69": "changeServiceAgent(address)", +"cef6a39a": "createMinerAuction()", +"cef6cfb2": "addToWhiteList(string,address)", +"cef75d9f": "myCardDividends()", +"cef7a4d0": "LogTemplateSet(address,address,address)", +"cef7e760": "initialCaps()", +"cef887b0": "storeBlockWithFee(bytes,int256)", +"cef8d343": "buyShare(uint256,bool)", +"cef94360": "updatefundingEndTime(uint256)", +"cef9601f": "timeTillNextSteal()", +"cef9ca6b": "ThreeDLPrivate()", +"cef9db6d": "TOKEN_SUPPLY_TOTAL()", +"cefa624b": "getPlayerAirdropGameData(address)", +"cefa80fc": "foundersTeam()", +"cefaba7f": "prc(uint256)", +"cefad386": "_accountOkayChecks(bytes32,uint64)", +"cefb09b6": "getBrokerInfo(uint256)", +"cefb3605": "vaultToWallet()", +"cefc0848": "minimumStakingTokenPercentage()", +"cefce1f2": "GameOver(string)", +"cefd2239": "unlocktoken(address,address,address)", +"cefddda9": "isGenesisValidator(address)", +"cefdfcf3": "testControlRetractNotRetractable()", +"cefe23dd": "HarjCoin()", +"cefeb6f7": "MeshPointManager(int256)", +"cefed526": "Atlantide(uint256,string,string)", +"ceff149b": "getRoundLuckyPot(uint256)", +"ceff6fe6": "cancelApproveForAddress(uint256)", +"ceffbaf1": "isReleaseApproved()", +"cf0023ec": "pvt_plmt_max_in_Wei()", +"cf007460": "nextClaim(address)", +"cf00c197": "stageOneEnd()", +"cf00cba0": "BlocksquareSeriesA()", +"cf00d4b9": "prizePoolPercent()", +"cf011b26": "excludedAddresses(address)", +"cf02ba9d": "optionsPerShare()", +"cf034b1d": "transferFromTrustedContract(address,uint256)", +"cf03e589": "Registered(address,string,address)", +"cf03f5f4": "activateMasterKey(address)", +"cf04dd7e": "DAPSTOKEN()", +"cf04fb94": "changeVerifier(address)", +"cf054fb2": "hardCapAmount()", +"cf0682bc": "warning()", +"cf06b141": "assertEq17(bytes17,bytes17,bytes32)", +"cf06b3ba": "KOIOSToken(string,string,uint256,uint256)", +"cf071005": "showLastPoolAddress(address)", +"cf07fbb6": "HUToken()", +"cf082176": "ETHERION()", +"cf083591": "listAllAttendants()", +"cf086765": "getPatronsCount()", +"cf094497": "betCount()", +"cf09c6dd": "lastBlock_f10Hash_uint256()", +"cf09e0d0": "createdAt()", +"cf09e6e1": "SetBigContract(address)", +"cf09e820": "getPropertyOwnerSalePrice(uint16)", +"cf0a07b2": "Choon(address,address,address)", +"cf0a50d3": "DopeToken()", +"cf0aed0e": "setMinimumBuyValue(uint256)", +"cf0cb613": "finalUnlockTransfer()", +"cf0dbc27": "getH2Bidder()", +"cf0e4076": "findAddress(address,address[])", +"cf0e4be5": "eggsInTimeSlot(uint8)", +"cf0e80fe": "getClaimedBalance(address)", +"cf0f02bd": "IntoQueue(address)", +"cf0f0593": "shl8(uint8,uint8)", +"cf0f2bf8": "transferPreSigned(address,uint256,uint256,uint256,bytes)", +"cf0f34c4": "setMaxDuration(uint256)", +"cf0f864e": "battleCardIdRange()", +"cf0fc7d5": "_fetchOrderByIdWithMerchant(string,address)", +"cf0fdacb": "getRarityBonusValue(uint256)", +"cf100287": "payToManager(uint256)", +"cf112453": "canUpdateNextGameInitalMinBetSize()", +"cf124ba3": "tokenSaleIsFinished()", +"cf1259d8": "badge_obj()", +"cf12789a": "percOf(uint256,uint256)", +"cf12b725": "releaseTokenPrivate()", +"cf12d99f": "xorexs()", +"cf12e870": "giveAccess(address)", +"cf134a06": "totalLicensePurchases()", +"cf136426": "IagonTestToken()", +"cf1405fe": "firstDay()", +"cf14b191": "recoverAddressOfSigner(address,address,uint256,uint8,bytes32,bytes32)", +"cf14cecc": "whitelistMaxTok(uint256,address)", +"cf1578dc": "getOwnerFunds()", +"cf157942": "endsigning()", +"cf158fe9": "scheduleTransaction(uint256,uint256,uint256)", +"cf15b87d": "IcoCompleted()", +"cf160cf2": "addModerator(address,string)", +"cf16b4a2": "_packPlayerData(address,uint256)", +"cf16cc83": "getRoundStart(uint256)", +"cf16e955": "buyOnBehalf(address)", +"cf187228": "_createChar(string,address,uint256)", +"cf187df1": "addFrozenBalances(address,uint256)", +"cf18811f": "getTrusteeIndex()", +"cf1893de": "TimeBasedContract()", +"cf191540": "retraitStandard_5()", +"cf19463d": "newPokemonMaster(address)", +"cf195101": "Zchain()", +"cf195e34": "issuedToDate()", +"cf1a6243": "MIOTCrowdsales(address,address)", +"cf1b037c": "registerCallback(address)", +"cf1b11e8": "tokensPerWeiPlusBonus(uint256)", +"cf1b3f08": "withdrawTop(uint256)", +"cf1b45c3": "User(address,address)", +"cf1c13ce": "setBonusRate()", +"cf1c316a": "addAuthorized(address)", +"cf1c9f52": "pauseDET()", +"cf1cd249": "secureSend(address)", +"cf1d21c0": "ETHER_ADDRESS()", +"cf1d567f": "cosmicDice()", +"cf1d8294": "setPresaleParticipantWhitelist(address[],bool)", +"cf1e3bcb": "projectReserve()", +"cf1eba78": "promoMap(bytes32)", +"cf1ec58d": "usdPerEthLog(uint256)", +"cf1edfea": "checkIfLockCanBeRemoved(address)", +"cf1ee6f9": "OVISRESERVED_TOKENS()", +"cf1eef50": "UpdateRateAgent(address)", +"cf1f335e": "sendLiquidityFund(address,uint256)", +"cf1f3dd7": "ledgerName()", +"cf200e9f": "getBalancesSeller(uint256)", +"cf202727": "myfirsttoken()", +"cf20ac40": "citadelBalance()", +"cf210e16": "restrictedAcct()", +"cf216207": "tokensToTransfer(address,address,address,uint256,bytes,bytes)", +"cf21977c": "mint(address,uint256,uint256,uint256,uint256,string)", +"cf225109": "getSellAgents(uint256)", +"cf22c803": "Election(bytes32[],uint256,uint256,uint256)", +"cf2317d5": "nBallots(bytes32)", +"cf235743": "whitelist(address[],uint256[])", +"cf23616e": "enableTimelock(uint256)", +"cf25e4e8": "getActiveBusinessesPerType(uint256)", +"cf26ac9b": "getLinkOwner(address)", +"cf27539e": "LBL(uint256,string,string)", +"cf278430": "split(address,bytes32,uint8,uint256)", +"cf279ff1": "inserirOuvidoriaNoCadastro(address,bytes32,uint8,bytes32,bytes32,int256)", +"cf27d016": "isInGracePeriod()", +"cf282878": "_createNode()", +"cf2887e5": "transferTo(address,address[],uint256)", +"cf28b18e": "p_update_tokensRewardsAllocated(uint256)", +"cf295a5c": "mintbuy(address,uint256)", +"cf299d04": "joinPre()", +"cf2a8612": "two(uint256)", +"cf2affca": "changeRequiredAdmin(uint256,bool,bytes)", +"cf2b16d9": "Game(address)", +"cf2b3b47": "createRoomQuick()", +"cf2b8c05": "getRealisation_effective()", +"cf2c52cb": "deposit(address,bytes)", +"cf2d03ae": "minJump()", +"cf2d31fb": "register(bytes32,string)", +"cf2d5d66": "TestSelfDropToken()", +"cf2d5eb4": "ICO_TRIGGER()", +"cf2d923f": "ADVISORS_AND_CONTRIBUTORS_ADDRESS()", +"cf2e011e": "link(string)", +"cf2e161c": "DOWN_winBets()", +"cf2e3efc": "GetBankAccountBalance()", +"cf2e80cc": "_setSentReveal(uint256,address,bool)", +"cf2f856e": "gracePeriodMinTran()", +"cf2f9a4a": "transferTokenContractOwnership(address,address)", +"cf2fb7ca": "setDIDTokenAddress(address)", +"cf3006a1": "setEthPriceInDollar(uint256)", +"cf309012": "locked()", +"cf310642": "Police_1()", +"cf314b6a": "verifyAccount(address,bool)", +"cf317b7e": "getSellerInfo(address)", +"cf31e9fe": "getOutputHash()", +"cf31ff86": "isAddressValid(address)", +"cf32b062": "deadlines()", +"cf32b957": "LockInventory()", +"cf33babc": "VotingStarted(uint256)", +"cf351c1d": "setFeeTokenAddress(address)", +"cf35238a": "googleSupply()", +"cf356f83": "parcelGzeWithBonusOnList()", +"cf357364": "getOrderType(bytes32)", +"cf35bdd0": "assets(uint256)", +"cf35f275": "transferFromStakedisbursementfund(address,uint256)", +"cf3630b4": "setNextStartTime(uint256)", +"cf36fe8e": "bobMakesEthPayment(bytes32,address,bytes20)", +"cf3743c6": "DuxToken()", +"cf38b609": "priceChibi()", +"cf397201": "addLockedTokeA(address,uint8,uint256)", +"cf39bff5": "accoutToSummonNum(address)", +"cf3b1967": "TOKEN_DECIMALS_UINT8()", +"cf3b70e6": "CreatedIAM(address,uint256)", +"cf3c6fd3": "distributeFounderTokens(address,uint256)", +"cf3ca0fa": "blockDotGasLimit()", +"cf3cb33f": "exchangeToken(address,uint256)", +"cf3d1e3c": "sellOffline(address,uint256)", +"cf3d29ea": "SNTMock(address)", +"cf3d3849": "getNumInvalidMarkets()", +"cf3d82e5": "setMaxStage1AllocationPerInvestor(uint256)", +"cf3dd39e": "existenceTotalSupplyTest(address)", +"cf3e172b": "getTokenInfo(address,bytes32)", +"cf3e194d": "calculateMultiplierAfterConversion(address,uint256)", +"cf3e52b8": "ValidateWorldSnapshotInternal(uint256)", +"cf3e52d9": "topWizard()", +"cf3e9519": "lrcUnlockPerMonth()", +"cf40bb58": "currentTimeIndex()", +"cf40f290": "EventLuckyNumberUpdated(uint256,uint256,uint8)", +"cf4186cb": "rejectMint(uint256,uint256)", +"cf41d6f8": "getPaid()", +"cf4228ea": "isSignedByAll()", +"cf4246a6": "ethereum2USDprice()", +"cf424b16": "releaseForSeed(address,uint256)", +"cf427d1b": "currentPenalty(address)", +"cf4315bb": "MINBET_perROLL()", +"cf43f4aa": "TrustedhealthToken()", +"cf4422e8": "getMilestoneDetails(bytes32)", +"cf44f5f7": "updateKeyMasks(uint256,uint256,uint256,uint256)", +"cf456865": "createCompany(bytes32,bytes32,uint256)", +"cf45f83b": "MADToken()", +"cf460fa5": "right16(uint256)", +"cf462616": "isVestingSet(address)", +"cf464997": "safeAssert(bool)", +"cf46827e": "getStakingMetrics(address,bytes32)", +"cf46bd24": "TransferContractOwnership(address,address)", +"cf46db5b": "isAllowed(uint8,address)", +"cf46dca7": "setProducer(address,bool)", +"cf47810c": "deleteAvatar(uint256)", +"cf478921": "addSpecialFeeTake(address,uint256,uint256)", +"cf47c326": "generateCryptsyToken()", +"cf488329": "BITCASH(string,string,uint8,uint256)", +"cf48d1a6": "setVox(address)", +"cf4a1612": "scheduleTransaction(uint256,address,bytes,uint256)", +"cf4baa4b": "kemnagToken()", +"cf4c3eac": "reservedWeis()", +"cf4cc8fb": "BitBallCoin()", +"cf4cea67": "dateBonus(uint256,uint256,uint256)", +"cf4d3a88": "PeopleSeedCapitalCoin()", +"cf4d6c0b": "AcceptsHyperDivs(address)", +"cf4e593a": "getPlayedGameJackpot()", +"cf4e964a": "cardStructs(uint8)", +"cf4e9ec3": "endCallRequestDate(address)", +"cf4fab1f": "PERFORMANCE_FEE_RATE()", +"cf504d48": "projectActive(uint256)", +"cf509b9d": "gracePeriodAmount()", +"cf51ee7a": "removeValueBonus(uint8)", +"cf51f582": "NucleusVisionAirDrop()", +"cf52a7b2": "whiteListAddress(address)", +"cf52ab0b": "New(address,uint256,uint256)", +"cf5303cf": "checker()", +"cf530bc3": "LOG_NewBet(address,uint256,uint256,bytes32)", +"cf53951d": "test_registrationInformationAccurate()", +"cf53d630": "getBetInfoByID(uint256)", +"cf54aaa0": "getDecimals(address)", +"cf561cea": "TestKToken()", +"cf564ab5": "getVehicleByAddress(address)", +"cf5713b6": "whatsMyName()", +"cf58802f": "getOverview(uint256,uint256)", +"cf58a045": "memberBuyToken()", +"cf58fbeb": "test_insert_findWithHintNextRemovedUpdateTail()", +"cf5ae516": "PauseICO()", +"cf5b5a77": "medalUnFreeze()", +"cf5b8018": "summSupporters()", +"cf5b90f0": "sendToken(address[])", +"cf5ba53f": "create(bytes)", +"cf5bd8e6": "EthBlockExplorer()", +"cf5c1b52": "setForSale(uint256,bool,uint256)", +"cf5c2ac7": "usdCentsBalance()", +"cf5c8b99": "CuratorRules(address,address[])", +"cf5cb132": "getRegisteredAssets()", +"cf5d4e4d": "BarterCoin()", +"cf5d57db": "changeReward(uint256)", +"cf5e36df": "getWeiContributed(uint16,address)", +"cf5f2201": "unMinedPop()", +"cf5f87d0": "updateConsumable(uint256,uint256,uint8)", +"cf6036fd": "length(bytes1)", +"cf62277c": "ThePiContract()", +"cf62d4e3": "changeMaxBetDoubleDice(uint256)", +"cf6304d4": "endPreTokensale()", +"cf6346cb": "presaleMinValue()", +"cf63bb83": "neymarHasMinted(uint256)", +"cf63edea": "tokenIdExist(uint256)", +"cf64c42f": "endCrowdsalePhase1Date()", +"cf64da7f": "HOVERCRAFT_TYPE()", +"cf652d1d": "setDefaultBoxNumber(uint256)", +"cf654886": "getHeroLevel(uint256)", +"cf65952c": "deactivateDevice(address)", +"cf662b5e": "JGCoinOld()", +"cf665443": "nextMint()", +"cf6661fb": "getNativeAsset()", +"cf67805c": "MumsTheWord()", +"cf682b3c": "VMVToken()", +"cf69318a": "left60(uint256)", +"cf693418": "_teamJackpot(uint256)", +"cf69443c": "getCurrentUserTotalReward()", +"cf69df28": "getDataRequestLength()", +"cf6a8722": "removeBytes32(bytes32)", +"cf6accab": "sendCharityPrizeToCharityAddress(uint256)", +"cf6ad876": "cancelAgreement()", +"cf6b1081": "proxyGetRefund()", +"cf6b3822": "WatchCollectedFeesInSzabo()", +"cf6b70cf": "many_payments()", +"cf6b8bbf": "XYT()", +"cf6bd8b9": "view62()", +"cf6d06a1": "transferFree(address,uint256)", +"cf6e4488": "custodianChangeReqs(bytes32)", +"cf6efb49": "getCdRate()", +"cf6f3b59": "userAdd(uint256)", +"cf6f3fe4": "distance_driven()", +"cf6fbb9d": "Mint(address,uint256,uint256,bytes32)", +"cf6fbeea": "takeAway(address,address)", +"cf6fcbb0": "calculateAveragePixelPrice(uint256,uint256)", +"cf7018d4": "setAdURI(uint256,string)", +"cf70ba36": "tokenZNT()", +"cf710b34": "showTeam()", +"cf710b73": "test_setMaxSize_update()", +"cf72085f": "deliverTokensBatch(address[],uint256[])", +"cf7209c5": "KyberHandler(address)", +"cf724096": "transferEthers(address,address,uint256)", +"cf72b511": "get_refund_deposit_addr_amount(uint256)", +"cf7315c6": "retract(bytes20)", +"cf731bd7": "Temgean()", +"cf73a1bc": "managerAddress()", +"cf756935": "determineLuckyVoters()", +"cf763d1c": "periodLimit()", +"cf76a3b9": "TokenState(uint256,uint8)", +"cf76cb7d": "simInstallments(bytes)", +"cf76ebf9": "carsGifted()", +"cf772c7d": "victims(uint16)", +"cf7730f1": "reserveFundSupply()", +"cf775255": "configureDomainFor(string,uint256,uint256,address,address)", +"cf77c8db": "setAffiliateContract(address,address)", +"cf78044d": "setMaxIndex(uint256)", +"cf783d8a": "allAccounts()", +"cf78a450": "unlockBBK(uint256)", +"cf78cf0d": "ContractCreated(address)", +"cf7956ab": "SIEToken(address,address)", +"cf79d8b4": "completeRemainingTokens()", +"cf7a8965": "steal()", +"cf7aebea": "transferAntique(address,bytes32)", +"cf7b38a2": "resumeCollectToken()", +"cf7b8c5f": "player_count()", +"cf7bb192": "canStakeExisting(address,bool,uint256,uint256,uint256,uint256,bytes8,uint256)", +"cf7c2985": "setAuctionPriceLimit(uint256)", +"cf7c2b31": "paymentOf(address)", +"cf7d0304": "MintableLazyCoderToken()", +"cf7d23a3": "Withdrawn(uint256,address,uint256)", +"cf7dcc15": "distributeEth(uint256,uint256)", +"cf7e01ba": "ICO1Period()", +"cf7e06cb": "setCapForParticipants(address[],uint256[])", +"cf7e69f8": "changeCooldownIndex(uint40,uint16)", +"cf7e9242": "getAgreements()", +"cf7efb4c": "SketchMarket()", +"cf7f12ea": "getBidCountForSketchesWithHolder(address)", +"cf808000": "iWantXKeys(uint256)", +"cf81377d": "eosDASH(uint256,uint256)", +"cf813e3f": "getLockTime(uint8)", +"cf81978b": "recipientMIT(address)", +"cf81f24d": "iWannaLiveForever()", +"cf820461": "txFee()", +"cf82601b": "removeInstitutionAsset(string,string)", +"cf82731f": "getPic(uint256)", +"cf832ce2": "ownerRefundPlayer(bytes32,address,uint256,uint256)", +"cf837fad": "contractLock()", +"cf8407c9": "registerFund()", +"cf854969": "rate1()", +"cf866d6f": "LastProposalCanDiscard()", +"cf86a95a": "transferMintership(address)", +"cf876b72": "setAccountUrl(string)", +"cf879e83": "isRevoke(address,address)", +"cf881ad9": "fUseAmount()", +"cf88eebe": "enableBuyBackMode(address)", +"cf8951d1": "CollateralTransfered(uint256)", +"cf89744f": "MaxBetUpdate(uint256)", +"cf89956e": "Base(uint256,string,uint8,string)", +"cf8a24de": "emulatePurchase(address,address,uint256,uint256,uint256)", +"cf8bc918": "getCrowdsalesLength()", +"cf8c9cc8": "submitTransaction(address,address,uint256,uint256,bytes)", +"cf8d652c": "tokenCreationRate()", +"cf8d8ca0": "walletName()", +"cf8e9996": "MuellerFiredby51()", +"cf8eb597": "AccountIsFrozen(address)", +"cf8eeb7e": "subBalance(address,uint256)", +"cf8f4d4f": "getParticipantRegistry()", +"cf8f8f12": "finishICOInternal()", +"cf8fee11": "getBasicRate(address,bool)", +"cf904e7d": "delCertAdmin(address)", +"cf9057f7": "findNextYear(uint256,bytes4)", +"cf905858": "hasIdentity(address,address)", +"cf90bfc9": "DatPayToken()", +"cf90e741": "Presale(uint256,uint256,address)", +"cf910b37": "_getRandom(bytes32[4],uint8)", +"cf913ae7": "setKoikeToken(uint256,address)", +"cf914a87": "ownerSetOverride(address,bool)", +"cf91e331": "TransferGenesis(address)", +"cf92e19b": "maxPlayableGameId()", +"cf934d67": "newIndex(bytes32,uint256)", +"cf934fb8": "sendToBeneficiaryContract()", +"cf94e395": "set_hosp(uint256,string)", +"cf951c9f": "initAsset(uint256,string,string,string)", +"cf9530d0": "totalSupplyOf(address)", +"cf957ce0": "ROSCA(uint16,uint128,uint256,address[],uint16)", +"cf9676c1": "setMintRequestUintMap(uint256,int256,string,uint256)", +"cf96ce03": "setHouseEdgePercent(uint256)", +"cf9779cd": "accountFor(address,bool)", +"cf984f16": "testFailRestartEnforceRevisions()", +"cf98e120": "calculateStagePrice()", +"cf991259": "BRANDS_ADDR()", +"cf99a4d9": "buybackTypeTwo()", +"cf99cd2e": "iterateThroughSwarm(address,uint256)", +"cf99d935": "finalizeIfNecessary()", +"cf9a60d4": "ETH_USD_EXCHANGE_RATE_IN_CENTS()", +"cf9ac727": "logPrice(address,address,uint256)", +"cf9ac928": "bbd36484()", +"cf9b62d9": "OwnerOf(uint256)", +"cf9b9e0a": "FDCToken()", +"cf9d33d8": "GeniusInvest()", +"cf9df5eb": "insert(address,address,address,address,uint256,address,bytes32,uint256)", +"cf9f3db2": "PresaleTimeRangeChanged(address,uint256,uint256)", +"cf9f5ef6": "MANW()", +"cf9faf1d": "ownerSetRate(uint256)", +"cfa0136f": "setPresaleEndTime(uint256)", +"cfa01baf": "prepareForEarlyFinalization()", +"cfa059ee": "getIssuanceIds(bool,bool,bool,bool,uint256,uint256)", +"cfa06700": "_emitAccessBlocked(address,bytes32)", +"cfa084b0": "setTransferOwnership(address)", +"cfa0c480": "addTx(address,uint256,bytes)", +"cfa12510": "returnHash(address[2],uint256[7])", +"cfa24ee3": "setFighterCoreAddress(address)", +"cfa3bfce": "_validateLockupStages()", +"cfa3c132": "parentOf(uint256)", +"cfa446ec": "Standard_2()", +"cfa46990": "getSellUnicornFullPrice(uint256)", +"cfa4a6a6": "getPools(bytes32)", +"cfa4f3e8": "setRelease(uint256)", +"cfa517df": "getOwnerByAnimalId(uint256)", +"cfa51e01": "getAllTokenSold()", +"cfa5cfd3": "balanceInSpecificTier(uint256)", +"cfa5d53b": "blocktubeTransfer(address,uint256)", +"cfa5df4b": "swapAbleToken()", +"cfa5f02a": "exchangeETH()", +"cfa675cc": "_revealBid(bytes32,address,uint256,address,address,address,uint256,uint256)", +"cfa7074b": "BuyRateChanged(uint256,uint256)", +"cfa75d43": "developer_add_string_B(string)", +"cfa83079": "minHpDeducted()", +"cfa86845": "RedeemingTimeLimit()", +"cfa9fa85": "percentageHumanityFund()", +"cfaa234c": "_isNotMixing(uint256,uint256)", +"cfaa759d": "privateIcoStartTime()", +"cfaaa266": "TransferOwnership(address)", +"cfaaff4c": "ADZbuzzCommunityToken()", +"cfab3056": "guesses(int256)", +"cfab472f": "isUserEnabledForContract(address,address)", +"cfab6554": "sumElements(uint16[])", +"cfab8862": "pfcController()", +"cfabe67b": "acceptVestingTrusteeOwnership()", +"cfac2280": "uniqueJingles(bytes32)", +"cfad5277": "totalAddresses()", +"cfae2c65": "dispenseTokensToInvestorAddressesByValue(address[],uint256[])", +"cfae3217": "greet()", +"cfae52e1": "createFirstDay()", +"cfaed1e2": "minAllowedBetInEth()", +"cfaf7315": "BuyEggs()", +"cfaf8a33": "sellTile(uint256)", +"cfb009cf": "Obredis()", +"cfb079d3": "DX()", +"cfb27084": "switchAirDrop(bool)", +"cfb3647b": "tokenMinter()", +"cfb3a493": "getMyBounty(uint256)", +"cfb3b886": "jack_nonce()", +"cfb45e3c": "_cancelOperation(bytes32,uint256)", +"cfb51928": "stringToBytes32(string)", +"cfb5a5f8": "getShare(uint256)", +"cfb64dfc": "addCustomerFromProviderAdmin(address)", +"cfb6e9af": "LogBet(address,uint256,uint256)", +"cfb75c92": "slavenAdress()", +"cfb7b9e9": "PROM()", +"cfb9147d": "exploreFastenETHFee()", +"cfb9e26f": "getStateOfPlan()", +"cfba0279": "hasSkill(address,uint256,uint256,uint256)", +"cfba24ac": "isSenderBiometricLocked()", +"cfba4fe0": "findBalance(address)", +"cfba99dc": "getQuoteAsset()", +"cfbb2047": "currentSmartSpeedNumber()", +"cfbb4b24": "Invent()", +"cfbb7d36": "teamWithdraw()", +"cfbb9f37": "DOW_THU()", +"cfbbbd9e": "PASS()", +"cfbbd902": "calcWinNumbers(string)", +"cfbbda3d": "seekApproval()", +"cfbd3bbb": "GetCarrot(address)", +"cfbd4885": "revokeMinter(address)", +"cfbe2cb3": "walletDeposit(address,uint256,uint256)", +"cfbed755": "getCard(uint64)", +"cfbef67d": "extract(bytes,uint256)", +"cfbf92a9": "getNodeStake(address)", +"cfbf9a36": "getBetRecord(uint256)", +"cfc05b56": "setTokensSoldGoal(uint256)", +"cfc0cc34": "getStrategy(uint256)", +"cfc19710": "closeMtr()", +"cfc220b6": "SpermLabs()", +"cfc2a93e": "dividendRoundsBeforeFoundersStakeUnlock()", +"cfc2aad2": "generateBonusForGene(uint256)", +"cfc41c91": "reb()", +"cfc450af": "maxInvestmentInWei()", +"cfc45610": "Makindo()", +"cfc4af05": "blt()", +"cfc4af55": "tau()", +"cfc4d0ec": "getOrderHash(address[5],uint256[6])", +"cfc54848": "sendEth(uint256)", +"cfc5a969": "bytesToUint(bytes32)", +"cfc5e7c8": "getSellCount(address)", +"cfc72007": "selfdestruct(address)", +"cfc7e2da": "getMinAmount()", +"cfc9cb7f": "ForestingToken(address)", +"cfca375c": "NooCrowdsale()", +"cfcb2b7e": "createController(address,address,address,uint256,uint256,uint256,uint256,uint256)", +"cfcb69d1": "TelegramTON()", +"cfcba2f8": "firstRefundRoundFinishTimestamp()", +"cfcc09a9": "simpleICO(string,string,uint8,address,uint256[],uint256[],int256)", +"cfcc57ad": "maxFundsThatCanBeWithdrawnByOwners()", +"cfcc7720": "rechargeRobot(uint256)", +"cfcccb32": "escrowList(address)", +"cfcd84a9": "collectibleIndexToPrice(uint256)", +"cfcd8c2d": "init(address,uint256,uint256,uint256,uint256,uint256,uint256,bool,address,bool)", +"cfcdde19": "PRICE_PREBUY_BONUS()", +"cfd00530": "isContractSignedBySigner(string,address)", +"cfd0a970": "TierClassicDividendAddress(address)", +"cfd129f8": "stageSoftcap(uint8)", +"cfd28966": "getMigrateOutDestinationValue()", +"cfd2eb49": "StoreComission(address,uint256)", +"cfd32aa0": "removeFunder()", +"cfd32ef7": "isMember(address,bytes32)", +"cfd3c17d": "currentLuckyStoneNumber()", +"cfd447d7": "startSale(uint256,bool)", +"cfd4ca6b": "contract_md5()", +"cfd4edcf": "ProofOf()", +"cfd550a3": "ICO_ENABLERS_CAP()", +"cfd56a13": "_sell(address,uint256,uint256)", +"cfd5cb77": "userAttackMonsterCDSeconds()", +"cfd65fdb": "assertEq19(bytes19,bytes19)", +"cfd6eea2": "QDCoin()", +"cfd7ab91": "STARTTIME()", +"cfd7be04": "backNewHopeOwner()", +"cfd7f1fb": "_chkBuyerLmtsAndFinl(address,uint256,uint256)", +"cfd8a175": "betPrice()", +"cfd8d6c0": "setProvider(address)", +"cfd938df": "Channel(string)", +"cfd94b01": "votersLen()", +"cfd9e0ea": "getStateForTime(uint256)", +"cfda7175": "getArbiterFeeAmount(uint256,uint8,uint256,address)", +"cfdac910": "getSketchesWithAuthor(address)", +"cfdacb58": "SetCryptoPrice(uint256,uint256)", +"cfdafde4": "saleIsFinished()", +"cfdb2eb7": "freeClaimAllowanceOf(address)", +"cfdb35ed": "setLKCExchangeRate(uint256)", +"cfdba320": "getRemainLockedOf(address)", +"cfdbf254": "MAX_BATCH_SIZE()", +"cfdd4520": "showCurrentBidValue()", +"cfdd7557": "CountOfAlastayaToken()", +"cfdd7e8a": "createFirstCommonsForum()", +"cfdf35b6": "removeLog(string)", +"cfe01e23": "anyAuditRequestMatchesPrice(uint256)", +"cfe0a5dc": "tokenKoef()", +"cfe0d487": "backup_finishIcoVars()", +"cfe0eeb7": "startSale(uint32,uint64,uint64)", +"cfe186b2": "finishGame(uint256)", +"cfe1887b": "delListReq(string,uint256,uint256)", +"cfe2b37a": "setIntF1ArrBoolF2AddressF1(int256,bool[],address)", +"cfe2f4e2": "Nicks()", +"cfe30939": "houseEarnings()", +"cfe3b8fb": "sTks(address,uint256)", +"cfe3d16d": "_register(address,address)", +"cfe3e683": "GWBCoin()", +"cfe4fb8e": "VECTORZILLA_RESERVE_VZT()", +"cfe52bdd": "sendFunds(address)", +"cfe5344a": "updateNovaAddress(address)", +"cfe5655c": "createDataControl()", +"cfe60c87": "LookRevToken()", +"cfe643ac": "getRightAndRoles()", +"cfe67587": "getWeeklySellVolume()", +"cfe6f220": "CertificateAddresses(bytes32)", +"cfe76488": "whitelistApplication(uint256,bytes32)", +"cfe7b770": "getBetInfo()", +"cfe7e7a0": "createLamboSale(uint256,uint256)", +"cfe7f3c0": "AddForm45(uint256,uint256,uint256,uint256)", +"cfe8c535": "giveAnimals(uint8,address)", +"cfe9a7b8": "getPackageName(uint256)", +"cfea3bb6": "swapTokenInfo(address)", +"cfea751f": "getIsAllTransfersLocked()", +"cfeaa5ea": "setBonusList(address)", +"cfeaaca1": "newCampaign(string,uint256,uint256,address)", +"cfeb93a8": "delABaddress(uint256,address,address)", +"cfeb9a97": "setSubFreezingTime(uint64)", +"cfeb9ec0": "BSmartValueCirculateAssets()", +"cfebb88b": "recallVoteToFreezeFund()", +"cfebc813": "changeExplain(string)", +"cfebf24d": "optionOf(address)", +"cfec22f8": "minSum()", +"cfec6ca3": "calculateProfitGameType1(uint256,uint256)", +"cfec8d83": "GetUserPELOAmount(address)", +"cfec934a": "runCrowdsale()", +"cfecd73d": "EtherIncPrivate()", +"cfed9199": "timePassed(uint256)", +"cfedc04a": "neverdieToken()", +"cfee88db": "closeClaims()", +"cfefaa8b": "Executed(string,uint256)", +"cfefb3d5": "payout(bytes32)", +"cfefcfb0": "VotedForProposal(uint256,address)", +"cfefe48b": "transferableTokensNow(address)", +"cfefe5a2": "isContribPeriodRunning()", +"cfefeb60": "airDropTime()", +"cff068a3": "random(uint256,uint256,address,uint8)", +"cff07771": "getEvaluationCount()", +"cff0ab96": "params()", +"cff12797": "setIcoPhase3(uint256,uint256)", +"cff13efb": "newCar(string,bytes17)", +"cff1b6ef": "updateAdminFee(uint256)", +"cff29dfd": "bidders(uint256)", +"cff2fa42": "_returnFee(address,uint256)", +"cff382ae": "AICrypto()", +"cff3d4d8": "stage1()", +"cff410b4": "Exit()", +"cff43a03": "verifyNewOrganizer(bool)", +"cff4d6cd": "payoutTotal()", +"cff5b28e": "FLUX()", +"cff61fb6": "batchExchange(address[])", +"cff6bc21": "allSigners(uint256)", +"cff72e67": "changeDevelopersRecipient(address)", +"cff76d67": "totalEthBankrollRecieved()", +"cff82e22": "getTicketCount(address)", +"cff9293a": "vote(uint32,uint32)", +"cff941fc": "Configured(address,address)", +"cffa4346": "DIETCoin()", +"cffc9997": "SetBuildingData(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"cffdc976": "WithdrawOwnerFunds(uint256)", +"cffe02cf": "setCrowdsaleRate(uint256)", +"cffe764c": "Insure()", +"cffee328": "successfulDeals()", +"cfff25bb": "getNumReserves()", +"cfff63ca": "assignMediator(address)", +"cfff8974": "mintToInfluencer(address,uint256,string)", +"cfffa030": "lanch_atak()", +"d0005aa4": "salesStart()", +"d0008a6d": "addNewMember(address,uint256)", +"d000a404": "PT(uint256,string,string)", +"d001425a": "bank2()", +"d0015500": "ownerSecondary()", +"d002462b": "setDeploymentFee(uint256)", +"d002a41c": "getUnReportedMatches()", +"d00408b7": "StandardToken(address)", +"d0044f9a": "_getLuckyList(uint256,uint8)", +"d0045341": "totalMintAmount()", +"d0047acf": "mint(address,uint256,uint32)", +"d004f0f7": "swap(address,uint256)", +"d004f38b": "setRates(uint256,uint256,uint256)", +"d0064c00": "maxDebt()", +"d0068f80": "getClient(uint256)", +"d0072e59": "forceReturn(address)", +"d007c644": "payInterest(address)", +"d007ff4b": "showJackpotBalance()", +"d0089141": "ovedclaimBountyairdrop(address,uint256)", +"d008d7a2": "BosToken()", +"d00910a3": "yearlyTeamTokensPaid(uint256)", +"d0095cc6": "genNumber()", +"d00a9058": "getOwnTokens()", +"d00cce41": "roleExists(string)", +"d00d20f4": "getTokensCrowdsaled()", +"d00eef6a": "TokenGranted(address,uint256,string)", +"d00ef880": "setShareTokenAddress(address,address)", +"d01296d9": "addmember(uint256,address)", +"d0130009": "Subtraction(uint256,uint256)", +"d013a182": "getServerBuildingWeapon(uint256,uint8,uint8)", +"d0142c47": "ImperialCreditToken()", +"d014c01f": "enter(address)", +"d014d667": "XCDT()", +"d0158b87": "fetchCancelledOrdersForMerchantByAdmin(address)", +"d015d86f": "getRoundStats()", +"d015f6dd": "NorthPoleAddress()", +"d01678f0": "raiseDay2()", +"d0169c1e": "lockAsset(bytes32)", +"d0169f4c": "start_POSTICO()", +"d016ec40": "vipBrokerNum()", +"d0174145": "create(address,address,uint256,uint256,uint256,uint256)", +"d017c2b4": "returnTokensToWallet()", +"d017cdcf": "acquireFame(uint256)", +"d017e20d": "processing(address,uint256,uint256,uint256)", +"d017f49b": "JustOneToken2()", +"d01860d0": "isFinishedSuccessfully()", +"d018a00f": "redeemBeer(bytes32)", +"d018db3e": "attack(address)", +"d0198c33": "getFunctionIdentifier(string)", +"d019d2c4": "MRT()", +"d01a69c9": "totalBeneficiaries()", +"d01a9453": "BitAirToken(address,string,string,uint256,uint256)", +"d01ab2e6": "_cancelOrder(address,address,uint256,address,uint256,uint256,uint256)", +"d01ab31a": "ICOStart()", +"d01b555d": "setSalePause(bool)", +"d01ba5f0": "increaseShardBalance(address,uint256)", +"d01bbdc9": "setOracleCallbackGasLimit(uint256)", +"d01c0904": "FujintoToken(uint256,string,uint8,string)", +"d01d0175": "StorageConsumer(address)", +"d01d6b86": "amountOfRegisters()", +"d01e2df9": "testContains()", +"d01ec886": "importPresaleContribution(address)", +"d01f4c9f": "hoursSinceTimestamp(uint256)", +"d01f4ffe": "stopSecondSale()", +"d01f63f5": "getWhitelist()", +"d02041f3": "advisorsPeriodAmount()", +"d02042a3": "relief()", +"d020ae40": "gameTotalGen()", +"d020dc3b": "rejectMessage(uint256,string)", +"d02143ed": "getRefToLength(address,address)", +"d0216dce": "XXXXXXXX07(address)", +"d021d8da": "Coinbase()", +"d0220b1c": "setCreateChampFee(uint256)", +"d0225e9e": "MAX_LRC_DEPOSIT_PER_ADDRESS()", +"d0237ab8": "EtherLiteSupply()", +"d023d2bd": "getGladiatorChestPrice()", +"d023d32c": "setEndAfterSecond(uint256)", +"d024768f": "computePropertyHash(string,string)", +"d024cd02": "startAuctionDirect(uint256,uint256,uint256,uint64,address)", +"d02528e6": "GetGameIndexesToProcess()", +"d02721cb": "withdrawProvider()", +"d02764f3": "releasesCount()", +"d0280037": "buyin(uint8,bytes32,bytes32)", +"d0286ab2": "setEmissionTime(uint256)", +"d028754b": "Withdraw_1()", +"d028a625": "deathData_v11()", +"d028c246": "Compaq()", +"d028f571": "getTokenForTeam(address)", +"d0297bc6": "changeMaximumContribution(uint256)", +"d02982cf": "isMember()", +"d029a530": "buyUnicornWithCandy(uint256)", +"d02a4f84": "bcn()", +"d02a6db7": "TokenLongExercised(address[2],uint256[7],uint8,bytes32[2],uint256,uint256)", +"d02a9889": "getDateOfFirstPayment()", +"d02b1653": "enablePrivateFund()", +"d02b97aa": "withdrawPromoter()", +"d02bf162": "spinTheWheel()", +"d02bf828": "lotteryTokensWallet()", +"d02c438a": "enableTokenSupport(bool)", +"d02c8cdf": "cancelMatch(uint256)", +"d02cc69f": "playWar(uint256)", +"d02d08b2": "hasCrowdsaleFinished()", +"d02d1382": "getPlayerCard(uint8)", +"d02d3892": "ApolloSeptemBaseCrowdsale(address,address)", +"d02d4554": "createUser(address,address)", +"d02d518d": "setArtEvt(string,string)", +"d02dade4": "getProviderCounter()", +"d02ddc12": "insert(bytes1,bytes1)", +"d02e140a": "finalizePrivatesale()", +"d02e5cfb": "mtcDailySpent()", +"d02e8f70": "MONUMENT_CITY_FEE()", +"d02ea39e": "DuckToken()", +"d02ecbb5": "ObitanChainxToken()", +"d02f5463": "pillarTokenFactory()", +"d02f7351": "seizeAllowed(address,address,address,address,uint256)", +"d02f8b98": "getApplications(address,bytes32,address)", +"d02fcad9": "wdiv(uint128,uint128)", +"d0302051": "rewardPercent()", +"d031370b": "reserveTokens(uint256)", +"d0315658": "getShareDistributionWithTimestamp(bytes)", +"d031babf": "LikeCrowdsale(address,uint256,uint256,uint256)", +"d031d8c4": "_transferLand(uint256,uint256,address)", +"d032ae76": "doAirDrop(address[])", +"d033c456": "addAddress(address,string)", +"d033d277": "OwnerNamed()", +"d033e6ee": "preAllocate(address,uint256,uint256)", +"d033f913": "getRoundSeedHash(uint32)", +"d034536e": "logFileClosing(string,uint256,string,string)", +"d0356fa8": "createVestingGrants()", +"d035bed4": "validContract(address,uint32)", +"d035e45f": "token_escape(address)", +"d0360e59": "drainContract()", +"d036261f": "amountBonuses(uint256)", +"d036bce2": "_calculateTokens(uint256)", +"d0376283": "onlyApprovedOrOwnerOfToken(uint256,address,bool)", +"d0378d07": "decreaseReserve(uint256,uint256)", +"d038906a": "FloraFicToken()", +"d0399bb8": "endGame(uint256)", +"d03b41a9": "bountyBalance()", +"d03bf119": "RANGESTART_11()", +"d03c8e34": "addAngel(address)", +"d03cff97": "devMiningRewardPerETHBlock()", +"d03d5231": "raffleDraw()", +"d03d9604": "maskIt(address,uint256)", +"d03e1021": "ORACLIZE_GASPRICE_GWEY()", +"d03e3059": "someMethod3(uint256,uint256,uint256)", +"d03e6817": "Volkstest()", +"d03e9bcc": "LogReceiveFunds(address,uint8,uint256)", +"d03e9fff": "plusTourFreezingTime(uint256)", +"d03ffefb": "createDeposit()", +"d04148d6": "m_account()", +"d04206f3": "CROSS_RESERVE()", +"d042a795": "multiSendA(uint256,uint256)", +"d042ce2c": "currentStageTokensBoughtByAddress()", +"d04301f2": "Annexe_SO_DIVA_SAS_5()", +"d0431cf5": "_openBox(uint256)", +"d0435cb0": "MonsterTokenCrowdsale(uint256,address,address,uint256,uint256)", +"d043d028": "toBytes4(bytes,bytes,uint256)", +"d045e1ff": "_inverse()", +"d046065e": "addBet(uint256,uint256,address,uint256)", +"d0471ee1": "Leverages(address[])", +"d04737bd": "Yuzhuralzoloto_2()", +"d0479abc": "burnUnsoldTokens(uint256)", +"d047a0d0": "getEmergencyTransferSigner(address,uint256)", +"d04807e9": "Heronium()", +"d0481f82": "hasLicenseTerms(bytes32,bytes32)", +"d048bc87": "inAngelPeriod()", +"d048db37": "getOfferCount()", +"d04a419b": "getDegree(bytes32)", +"d04a46b0": "sendFutureExpanstionBalance(address,uint256)", +"d04b019e": "getWalletResourceBalance(address)", +"d04b5f82": "test01Token()", +"d04bfc9c": "buyer_pay()", +"d04c9115": "getLoyaltyPoints(address)", +"d04cb43f": "withdraw_all_token(address,address)", +"d04d26fe": "updateStrength(uint256,uint8)", +"d04d2ca3": "BlacklistParticipant(address)", +"d04d8667": "authorized_recordPlatformFee()", +"d04dbdea": "Testtoken4()", +"d04e5586": "MEAManager()", +"d04f0535": "PisticciCash()", +"d04fe107": "getActiveAds()", +"d050498e": "assertEq24(bytes24,bytes24,bytes32)", +"d050557d": "bulkRegisterPoA(bytes32,bytes32,bytes,uint256)", +"d05144c8": "getMakeCount()", +"d0516650": "frozen(address)", +"d0516b82": "maxPresaleAmount()", +"d051dfd3": "prizes(uint256,address)", +"d052fbf6": "getHistory(string,uint256)", +"d05391d2": "admin_transferFrom(address,address,uint256)", +"d05407d4": "SetStepFunctionWrapper(address,address)", +"d054261e": "_generateRandomHash(string)", +"d05461a6": "mintForReportingParticipant(int256,address,uint256)", +"d0549602": "scheduleTransaction(address,uint256,uint256,uint256)", +"d054cd87": "badBoardSent(bytes10,uint256,uint8,bytes32,bytes32,bytes10,uint256,uint8,bytes32,bytes32)", +"d0569bc8": "getWinResults(uint256)", +"d056cc69": "stateCode(uint256)", +"d0578df9": "SMGC()", +"d0587032": "tablet_length()", +"d0590bad": "generateMessageToSign(address,uint256)", +"d05b7ca4": "uintToChar(uint8,uint256)", +"d05ba4da": "addPokemonToSellingList(address,uint256)", +"d05bb517": "withdrawFeeToken(uint256)", +"d05c78da": "safeMul(uint256,uint256)", +"d05c9342": "_getATxToken()", +"d05c9ad6": "setNumRewardsAvailableForAddress(uint256,address,address)", +"d05cb545": "registry(address,uint256)", +"d05d996f": "TXDELAY()", +"d05ec6c5": "getBonus4(uint256)", +"d05ee727": "teamAccount()", +"d05efd40": "directorA()", +"d0600560": "AD()", +"d0607948": "getteamnum(address)", +"d060a2a5": "doSmallDrop(uint256,uint256,uint256,uint256)", +"d0610ac9": "interpolate(uint256,uint256,uint256,uint256,uint256)", +"d0617f2f": "OMICrowdsale(uint256,address,address,address)", +"d062c7ab": "CleanBankerCandidate(uint8)", +"d06301d3": "__resolve(uint256)", +"d063f55f": "toLittleEndian(uint64)", +"d06426d5": "convertUsdToEther(uint256)", +"d0647f30": "_createDebt(bytes,bytes,uint256)", +"d06502b9": "batchTransferAgileToken(address[],uint256[],address,address)", +"d06544d0": "getCoinAddress(string)", +"d0658850": "ListingDB(uint64,uint64,address)", +"d066c841": "GenesisBuyPriceHistory(address,uint256)", +"d06760da": "isPartOfOrg()", +"d0676647": "ProposalClosed(uint256,uint256,uint256,uint256,bool,uint256)", +"d06798f2": "fourweeks()", +"d0679d34": "send(address,uint256)", +"d0683428": "executeRulingA(uint256)", +"d0692775": "gamesLeft(address)", +"d06980f1": "LogHodlClaimed(address,address,uint256)", +"d06982b2": "setDemurrageAmount(uint256)", +"d0699c98": "calcFees(uint256,uint256,uint256)", +"d06a0f5b": "setDynamicCeilingAddress(address)", +"d06a57b0": "pauseAllTokens(bool,string)", +"d06a89a4": "maxLength()", +"d06b3ea0": "whackingPool()", +"d06b44a6": "YKCToken(uint256,string,string,uint256)", +"d06b6f7e": "setMinTokensToSale(uint256)", +"d06ba559": "WrestleCoin()", +"d06c54fb": "acceptNextOwner()", +"d06c7b5b": "signalToken()", +"d06c91e4": "multisigEther()", +"d06ca26c": "managedWallets()", +"d06cdc73": "LuckyNumberService()", +"d06d4612": "jak()", +"d06f887b": "destroyMyToken(uint256)", +"d06f9734": "setTreasurer(address,bool)", +"d0707c61": "PerformingDrop(uint256)", +"d0708e31": "DocumentCertoChainContract(string,string,string,string)", +"d071f7b1": "recover(bytes32)", +"d073c531": "IMOSToken()", +"d073ca3d": "SUCCESS_FLAG()", +"d074443f": "DeathFactor_i()", +"d0747a9c": "getGoldmintFeeAccount()", +"d074a38d": "biddingTime()", +"d074de8c": "Testico()", +"d074f215": "PHASE_1_PRICE()", +"d075c11c": "viewNoncsallocations(address)", +"d0774f74": "GENSIS_TOTAL_COUNT()", +"d077814b": "divBase()", +"d0785dd7": "getNumberOfPlayersInCurrentGame()", +"d07866d2": "sizeOf(uint256)", +"d0799bee": "setRole(string,string)", +"d07a8bd7": "RisingToken()", +"d07ac4c4": "oraclize_query(uint256,string,bytes[4],uint256)", +"d07adab3": "getOutAmount()", +"d07bff0c": "getVoter(uint256)", +"d07c53b6": "thinkMode()", +"d07e7d7c": "setTTCTokenAddress(address)", +"d07e9f90": "getJobsCount()", +"d07f29e5": "addFounderAccounts(address,uint256)", +"d07f2ff6": "GreenWorldFarm()", +"d07f3a8f": "RobBanker(uint8,uint256,uint256,uint8)", +"d07f8181": "decreasePaymentsBalance(address,uint256)", +"d07fdfb0": "October12_2017()", +"d081b681": "vows()", +"d081b9f5": "networkState()", +"d081f2b8": "BOUNTY()", +"d0821b0e": "bet(uint8)", +"d08275f1": "WolframAlpha()", +"d08279b0": "unpauseTournament()", +"d082ea8c": "setExchangeAddress(address)", +"d083955c": "adjustMintRates()", +"d084f670": "getLocked(bytes16)", +"d085835a": "timeLock()", +"d085b82f": "TIMECOIN(address)", +"d085c8b8": "StartDistribution()", +"d085e66e": "GetPart(bytes32,uint256)", +"d0863580": "blocksRemaining()", +"d0868223": "returnATXChanges()", +"d086a201": "main_ico(address,uint256)", +"d087d288": "getNonce()", +"d088070a": "checkWhitelist(address,uint256)", +"d088f50d": "getNumeroCeldas()", +"d0894297": "EARLY_INVESTOR_WALLET()", +"d0897347": "engrave(bytes32,string,string,bytes32)", +"d089e11a": "accountRegistry()", +"d08a787c": "bytes32ToString(bytes32,bytes)", +"d08b89f3": "disableStopping()", +"d08bc007": "logRef(address,uint256)", +"d08bfe26": "CrowdsaleClose(uint256,bool)", +"d08c6803": "deletePerson(uint256)", +"d08d5559": "AABToken()", +"d08d66ec": "setBonusState(uint256)", +"d08d6753": "mdtRewardAmount()", +"d08e2354": "goldPercentage()", +"d08f2c67": "getHistoryAt(uint256)", +"d0900033": "COLONERToken()", +"d09119b4": "mortgage(address)", +"d0914c8d": "RelestToken()", +"d091b550": "newOwnerCandidate()", +"d0937598": "getLuckyblockBase(bytes32)", +"d09398ee": "transferCDP(address,uint256)", +"d093e04b": "payJackpot(uint256)", +"d0940a5d": "best()", +"d0946d00": "subFreeMineral(address)", +"d0949f99": "UINT256_MAX()", +"d094dd21": "getLLV_edit_14()", +"d095761f": "withdrawNetIncome()", +"d095d499": "profit3eggs()", +"d095edb2": "initializeModuleAddresses(address[])", +"d09677df": "TankSellMaster()", +"d09685b0": "getEntriesCount()", +"d096b8f0": "setupRaffle()", +"d0973af8": "transferTokensFromContract(address,uint256)", +"d09812e1": "settlementRegistry()", +"d0982feb": "tokenLockDuration()", +"d0983f4b": "tokenRatios()", +"d0988149": "MANHATTANPROXYMADISONAVE()", +"d0995198": "returnMinGoal(uint256)", +"d0995b33": "refundBalances(address[])", +"d09a6a62": "transferUnlock()", +"d09b0ae4": "RealEstate()", +"d09cb807": "isCurrentAdmin(address,address)", +"d09de08a": "increment()", +"d09e21ee": "ignore(bytes4,bool)", +"d09e3526": "setStatusI(address)", +"d09eae58": "SCAMToken()", +"d09edf31": "authorizer()", +"d09ef241": "getOrder(uint256)", +"d09f85ca": "Eventine()", +"d09f872a": "VenusToken(uint256,string,string)", +"d09f8b8b": "addXY(uint256,uint256,uint256,uint256)", +"d09fb45e": "setApprovedContracts(address,bool)", +"d09fbcee": "HumanTokenAllocator(address,address,address,address,address)", +"d0a05fea": "setI_S(uint256)", +"d0a06fb9": "cloneCard(address,uint256)", +"d0a1adf4": "contains(bytes1,bytes1)", +"d0a27473": "teamUnlock1()", +"d0a2da8e": "give(address,uint256,string,string)", +"d0a2f2c4": "getAllInvestors()", +"d0a45f84": "getVersionImplementation(address,bytes32,address,bytes32,bytes32)", +"d0a4a81b": "setTellerModerator(address)", +"d0a56299": "GetAssetTypeAverageSalePrice(uint256)", +"d0a579fb": "releaseForEarlyInit(address[],uint256)", +"d0a5eb4e": "setMainWallet(address)", +"d0a61995": "sell_(address,uint256)", +"d0a62566": "approveIndexed(address,uint256)", +"d0a63663": "incrementLimitBranch()", +"d0a6f018": "LogBalanceChange(address,uint256,uint256)", +"d0a6fa54": "getPriceById(bytes32)", +"d0a7b467": "setAragonDevMultisig(address)", +"d0a826f3": "setWildcardList(address,address,bool)", +"d0a835e3": "buyShip(uint32)", +"d0a8c801": "fshare()", +"d0aa0313": "setCompte_38(string)", +"d0aa407f": "withdrawEther(bytes32,uint256,uint256,uint256[])", +"d0aac5cf": "teamProfile(uint256)", +"d0ab0066": "calcFlexibleReward(uint256)", +"d0ab48e9": "toB32(bytes,uint256,bytes,address)", +"d0ab8432": "whitelistRegisteredAmount(address)", +"d0ac01ac": "setOfferExpiry(uint256)", +"d0ac2252": "getShipEarning(uint32)", +"d0ad7fb8": "buyTicket(uint256[],address)", +"d0ade72d": "assertEquals(uint256,uint256)", +"d0ae4356": "getRequestStatus(address,address)", +"d0ae9aec": "setMinInvest(uint256)", +"d0aff67d": "setNeverdieContractAddress(address)", +"d0b01e68": "__setBeneficiary(address)", +"d0b02abc": "createProductionUnit3()", +"d0b06f5d": "lastUpdated()", +"d0b0c0d5": "unlockDevTokenSupply()", +"d0b18fbf": "transferByForce(address,address,uint256)", +"d0b1b910": "FXSToken()", +"d0b2b579": "seedFund()", +"d0b368a0": "addToApproveList(address)", +"d0b3da99": "join(uint256,bool)", +"d0b4755c": "RATE_SALESTAGE1()", +"d0b52156": "getIpfsHash(address,address)", +"d0b5981f": "closePreICOPublic()", +"d0b68efb": "yoobaTokenAddress()", +"d0b6ba2a": "moveFunds()", +"d0b74806": "claimA()", +"d0b753f3": "sendPreSaleBonus(address,address)", +"d0b7ca57": "mintToken(address,uint256,bytes,bytes)", +"d0b83db9": "insertUser(address,bytes32)", +"d0b86d15": "FaradEscrow()", +"d0b8bc84": "OwnerUnfreeze(uint256,address)", +"d0b91ca7": "showBurnedCoins(address)", +"d0b94ffe": "web3ViewRoll(bytes32,bytes32,uint256,uint256,uint256)", +"d0b99ee2": "_distributeLandholderTax(uint256)", +"d0b9e58b": "SspContract(address,address,address,uint256,string)", +"d0b9e792": "returnBorrowedEth()", +"d0bb1d40": "airdropsCount()", +"d0bc1a88": "addMoney(uint256)", +"d0bc97d0": "isCrowdsaleFull(uint256,uint256)", +"d0bcebc8": "collectBack3()", +"d0bcfc0c": "Bankroll()", +"d0bec975": "countBid(uint8)", +"d0bf4d95": "SmokeExchangeCoin(uint256,address,address,uint256,uint256,uint256)", +"d0bf9502": "btcLastUpdate()", +"d0bff051": "testSetBalanceDb()", +"d0c03f35": "multisigVault()", +"d0c0c39c": "countTokens(uint256,address)", +"d0c1c844": "getLimitedBalanceOf(address)", +"d0c1d117": "editAddressDescription(address,string,address)", +"d0c24e93": "setNotUpdatable(bytes20)", +"d0c3033c": "generalBounty()", +"d0c32dd3": "otcPurchase(uint256,address)", +"d0c32ea9": "SearchALLFileLength()", +"d0c39f14": "Lottery(address)", +"d0c412ec": "ENDOairdrop()", +"d0c426e6": "burnAllRemainingIBC()", +"d0c475e5": "addRecordStrict(uint256)", +"d0c55ea9": "withdrawForPartner(bytes32,address,uint256)", +"d0c5c585": "getBurnAmount()", +"d0c5c946": "refundBpToken(address)", +"d0c75ea2": "verifyCommonTransaction(bytes32,uint256,address,address,uint256,address,address,uint256,bytes,bytes)", +"d0c7b012": "placeGame(uint24,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes32,bytes32)", +"d0c7c635": "mintToTeamAndAdvisors()", +"d0c8a7a5": "randgen()", +"d0c9bb92": "releaseTCLRinTeamTokens()", +"d0ca12ba": "ICO_START()", +"d0ca1982": "getCrowdsaleInfo(address,bytes32)", +"d0ca4dd7": "ownerWithdrawTokens(address,address,uint256)", +"d0ca5e7a": "createTokenToMarket2020()", +"d0ca7379": "mintReferralShare(uint256,address,uint256)", +"d0cac952": "HouseManaged()", +"d0cb874a": "getTokenByMineID()", +"d0ccf4bc": "createInstance(bytes32,bytes32,address,bytes,bytes32,bytes32,address,bytes,bytes32,uint256,uint256,bytes)", +"d0ce659f": "SwitzerlandvsCostaRica()", +"d0ce7360": "closeContract(uint256)", +"d0cf49e9": "zoLastRefreshTime()", +"d0d0ed05": "withdrawVault()", +"d0d13e87": "smartContractIsForSale(uint256)", +"d0d1ea70": "setTrustee(address)", +"d0d2e745": "manualExchange(address,uint256)", +"d0d38b65": "setFirstRankForFree(bool)", +"d0d390bf": "HubToken(address)", +"d0d3b9df": "IfModuleRegist(address)", +"d0d3f5ba": "removeNode()", +"d0d44cca": "setPOOL_edit_34(string)", +"d0d511f9": "getGoalsCount()", +"d0d529a7": "openWindow()", +"d0d552dd": "setAsset(address)", +"d0d68241": "betALenght()", +"d0d832ad": "fundraiseType()", +"d0d89ce3": "cummulativeTokensSold()", +"d0d968c0": "burnFromReserve(uint256)", +"d0d98276": "revokeOffer(address)", +"d0d9e21d": "emitCapabilityAdded(address,bytes4,uint8)", +"d0d9fcf7": "RANGE_STAT_MAX()", +"d0da3e86": "getNextAntiReplayTag(uint256)", +"d0dad7e1": "maxCapMain()", +"d0db5083": "hatch()", +"d0dc0a04": "all_creatures_for_species(uint256)", +"d0dc5c65": "updateTotalSupply()", +"d0dd38ad": "setDepositGasCost(uint8)", +"d0de7b29": "MetadiumVesting(address,uint256,uint256,uint256,bool)", +"d0def521": "mint(address,string)", +"d0e075c7": "BitcoinPurple()", +"d0e0813a": "promote(address)", +"d0e0ba95": "setId(uint256)", +"d0e0e8f6": "isLockedConfig()", +"d0e2bef0": "initFactorReward(uint256,uint256,uint256,uint256)", +"d0e2dc64": "playAway()", +"d0e30db0": "deposit()", +"d0e33b1b": "testGetResults()", +"d0e3cbbe": "getCurrentTotalEther()", +"d0e3f734": "setPubkey(string)", +"d0e4567e": "activeGroups()", +"d0e46235": "buyCardsAndSendGift(uint8,address)", +"d0e4713d": "CEC()", +"d0e55727": "changeOfferTime(uint256,uint256)", +"d0e6cfec": "bountyTokenWallet()", +"d0e709b6": "initialTransfer(address,uint256,uint256)", +"d0e7a5cb": "editPrice(uint256,uint256)", +"d0e95ded": "MithrilOre()", +"d0e98c14": "sendRestBack()", +"d0e9f00f": "BNTBalance()", +"d0ebdbe7": "setManager(address)", +"d0ec057e": "getFeeAmount(uint256,bool)", +"d0ec1607": "cancelPoll(uint256)", +"d0ed5c2f": "walletContract()", +"d0edf912": "createTransaction(address,uint256,uint256,uint256,uint256)", +"d0ee32c4": "getSymbolFromAddress(address)", +"d0ef1048": "_getRand()", +"d0ef368d": "setAllocation(address,address,uint256,uint256,uint256)", +"d0eff891": "weiToEther(uint256)", +"d0f040c4": "checkOwnerAllowance(address)", +"d0f0efcb": "buyPredictXname(bytes32,uint8)", +"d0f13638": "minimumPrepaidClaimedPercent()", +"d0f15e9e": "WalletWithEmergencyTransfer()", +"d0f17d41": "contributionMaximum()", +"d0f2019c": "hasToken(address,address)", +"d0f3235d": "_transferAirdrop(address[],uint256,bytes)", +"d0f3aa80": "allowSale()", +"d0f46c0b": "getUsersContract()", +"d0f4f99c": "solvePuzzle(uint256)", +"d0f5f4cd": "getPixelColor(uint16,uint16)", +"d0f6fc40": "QuantityFactorSet(uint256,uint256,address)", +"d0f76bb8": "End3()", +"d0f7a601": "etherRate()", +"d0f817db": "getOrgCertificatesCount(address)", +"d0f86c9d": "getUser(int256)", +"d0f86ea8": "getMemoryRead(uint256,uint256)", +"d0f86fec": "ENKToken()", +"d0f87ce7": "periodPreITO_mainCapInWei()", +"d0f89c6d": "setWhiteBackersByList(address[],bool[])", +"d0f8c714": "add(bytes32,uint256,bytes,bytes8)", +"d0f8e6a4": "DelegationTransferred(address,address)", +"d0f96983": "composite(uint256,uint256,uint8)", +"d0f96f6b": "DigitalPadlock(string)", +"d0fa968a": "s14(bytes1)", +"d0fab480": "meg()", +"d0fb8909": "activations(address)", +"d0fbb9e4": "claimRemainEth(uint256)", +"d0fbe7fe": "buyTickets(uint256[])", +"d0fc1e7d": "getFrequency(bytes32)", +"d0fc2782": "multisigs(uint256)", +"d0fc35cf": "StandardFormula()", +"d0fc899a": "presaleInvestorsETH(address)", +"d0fca0ca": "gogo(bytes,bytes,address[])", +"d0fe3e85": "releaseTokensTo(address)", +"d0febda9": "getModerator(address)", +"d0febe4c": "buyTokens()", +"d0fef78f": "Visor()", +"d0ffecaa": "setWhaleMax(uint256)", +"d10032dc": "getTokeRate()", +"d1013fec": "endTimeSale1()", +"d101d3b2": "timelock(address,uint256,uint256,uint256,bool)", +"d1026aa8": "YESToken()", +"d10271a1": "OxProtocol()", +"d103449c": "addURL(string)", +"d1037a11": "swap(uint256,address,address,address,address,uint256,uint256,bytes,bytes,bytes)", +"d1042e31": "getUserReward(address,address,bool,bool,bool)", +"d1047434": "getFactoryCount()", +"d1048bc9": "reserveVanityURLByOwner(address,string)", +"d104a136": "getBase()", +"d104bca2": "getUnitsAttack(address,uint256,uint256)", +"d1051a68": "DynamicToken()", +"d10523b7": "GoldenLightChainToken(uint256,string,uint8,string)", +"d105350b": "getLockedBalance(address,uint8)", +"d10541ab": "changeIdentityEthAddress(address)", +"d1058e59": "claimAll()", +"d1073bdb": "setBitwordsCut(uint256)", +"d107a5cc": "freezeAllowance(address,uint256)", +"d108177a": "removeEmployee(address)", +"d10865a7": "endSecondWeek()", +"d108b7d4": "KyberContributorWhitelist()", +"d108ffc0": "tokenToWei(uint256)", +"d1092be8": "transferAllowedDelete(address)", +"d1096155": "requireOnce()", +"d10a5e1d": "lockBalance(uint256,bool)", +"d10ac7eb": "balanceOfComisionDone(address)", +"d10adfe3": "setPricing()", +"d10aee9c": "mainPlayer()", +"d10bc924": "seeCurrentParticipants()", +"d10c3d1d": "removeFromInitialSupply(uint256)", +"d10c504f": "has_voted(address)", +"d10ceb47": "setConsolationRewardsPercent(uint256)", +"d10d42eb": "Dividend(address)", +"d10da303": "_createLinglongCatWithTime(uint256,uint256,uint256,uint256,address,uint256,uint256)", +"d10db2e1": "addCar(address,uint8,uint16)", +"d10e10b3": "testCanFinalizeEndedSale()", +"d10e23c8": "ClothingCoin()", +"d10e73ab": "createIdentity(address,address)", +"d10e99fe": "mint(int256,bytes32)", +"d10f6de9": "_requestSignature(bytes32[8],bytes)", +"d1100691": "BookCafe()", +"d1104bd3": "SLRC()", +"d110f0e6": "LEGAL()", +"d1110c5f": "buyMicroKeysWithHandle(string,string)", +"d11127c0": "lastBlock_f18()", +"d1120db0": "size2()", +"d112cf30": "PCNCoin()", +"d114751e": "getWeightRange(uint256,uint256,uint256)", +"d1153f25": "bugFund()", +"d1159747": "PREICOstart()", +"d115cac6": "joinTournament(uint256)", +"d115f02d": "updateMinReward(uint256)", +"d116c8c4": "releasePayment()", +"d11711a2": "participate()", +"d1180c98": "Lotoblock()", +"d11831c3": "generateHash()", +"d1190b7f": "changeTransferStepLock(bool)", +"d1195c48": "transferNashOut(address,uint256)", +"d119db4c": "addScore(address,uint256)", +"d11bd1a6": "sendContingencyFunds()", +"d11bee0f": "STSTEST6()", +"d11cd4c6": "changeStartPrice(uint256)", +"d11d8526": "isValidProductID(uint256)", +"d11db83f": "getPendingTransactions()", +"d11e77e4": "REIToken()", +"d11f13df": "numberOfParticipantsWaitingForPayout()", +"d11f5b9f": "VictorieumNewICOToken()", +"d11ffc55": "referralSupply()", +"d1206a29": "unlockRewardTokenMany(address[])", +"d120a284": "getBytesFromNumbers(uint8[3])", +"d120a4f2": "setUnderCollaterizedPosition()", +"d1211a71": "Solarex()", +"d1226567": "bulletAmount(address)", +"d1237220": "LogId(address,uint48)", +"d1239730": "mintEnabled()", +"d123b6e2": "ensureRegulated(address)", +"d1241e67": "getProductIdAt(uint256)", +"d125a7e2": "partialRefund(uint256)", +"d1260edd": "userDeposit(address)", +"d126ae0c": "TRLCOIN_DECIMALS()", +"d126dac4": "cashout(address,address,uint256)", +"d1279ea8": "AddTrust(address,uint256)", +"d127bb9d": "currentElement()", +"d12892e4": "setGiftMode(bool)", +"d128f2de": "cancelOwner()", +"d128fc20": "allocateTokensForFounder()", +"d1295eca": "ENDRoot()", +"d1295f13": "DTRACK()", +"d129ee38": "MediatedTransaction_Protection_Seconds()", +"d12a039c": "_getTokenBalance()", +"d12a0a2e": "icoClosed()", +"d12a6049": "setWeiLockSeconds()", +"d12a7b42": "whitelistResolver(address)", +"d12b51c0": "changeUserEduExp(bytes32)", +"d12b88a6": "SelimToken()", +"d12c08bf": "EGGS_TO_HATCH_1BULLS()", +"d12c1e28": "badgesOf(address)", +"d12c7b52": "WarToken()", +"d12d5c47": "ReferredBonusTokensEmitted(address,uint256)", +"d12d9510": "DFTBToken()", +"d12e0b2a": "MultiOwnable()", +"d12f6938": "crowdSaleStatus()", +"d12f7029": "STARTING_PRICE()", +"d1301074": "grantTokenOwnership(address)", +"d13091ed": "newGoal(bytes)", +"d1314ee0": "getBroker()", +"d1315ea3": "ISRA()", +"d131a803": "FetchlastHacker()", +"d131ab1e": "UpdatedTokenInformation(string,string)", +"d131af30": "precisionMinimum()", +"d131dfb8": "setFirstStageStartsAt(uint256)", +"d13209f9": "unhold()", +"d132391a": "setSaleEndTime(uint256)", +"d132a8f4": "totalBuyTokens()", +"d132eb02": "ProposalPassed(address,address,uint256)", +"d13319c4": "getHash()", +"d1342958": "refuseKyc(address)", +"d134474c": "winnings()", +"d134f4aa": "challengeCanBeResolved(string)", +"d1351e94": "getRoundPlayerKeys(uint256)", +"d1354f64": "ReceiveTips(address,uint256)", +"d135ae6e": "isSignedByToly()", +"d135cc4b": "withdrawLocked()", +"d135df42": "CONEGTY()", +"d1366f17": "sellerRequestCancel(uint16,address,address)", +"d136a579": "claimEarlyIncomebyAddressRound(address,uint256)", +"d1375f76": "COIN_SUPPLY_ICO_TOTAL()", +"d1376daa": "getClosingLine()", +"d13782a7": "addStage(uint256,uint256,uint256)", +"d137874b": "getDiscount()", +"d1382092": "getNumTokens(address,uint256)", +"d1384eb6": "institution()", +"d13936fe": "connectOrderPrice(address,address,uint256,uint256)", +"d1397162": "icoOverview()", +"d13a3386": "withdrawSale2()", +"d13a64d3": "getYanCoefficient(uint256,uint32)", +"d13a73c4": "numberOfStages()", +"d13a7efd": "earlyResolveB()", +"d13b54b7": "getGameAmount(address,uint256)", +"d13bf769": "foundersFundTimelock2Address()", +"d13c9c1e": "allocatePresaleTokens(address,uint256,uint256,uint256)", +"d13cb1fb": "fundings(uint256)", +"d13d1ace": "scheduleCall(bytes,bytes,uint16,uint8,uint256,uint256,uint256,uint256,uint256)", +"d13daa79": "TestTokenERC20()", +"d13e0808": "nextCommonTTMTokenId8()", +"d13e2a6a": "Wei_Remaining_To_ICO_Cap()", +"d13e5846": "tokenHolderCount()", +"d13e79ec": "getUSDRaised()", +"d13ea9ca": "setMinesPrice()", +"d13f092e": "setRaffleLimit(uint256)", +"d13f90b4": "initialize(address,address,uint256,uint256,uint256)", +"d13f9d55": "newIteration(uint256,string,bytes32,bytes32,bytes32,string,uint256,uint256)", +"d1407bec": "TraceCrowdsale()", +"d141138e": "getServerMoneyBag(uint256)", +"d1414b20": "_withdrawOrderBalance(uint256,address)", +"d14192ba": "numParameters()", +"d141b610": "MembershipPaid(address,uint8,uint256)", +"d1428e7a": "ratioFor(uint256,uint256,uint256)", +"d142bc5c": "individualWeiCollected(address)", +"d143dad0": "getLineSum(uint256)", +"d1442e93": "getStrField2()", +"d1472046": "CollectChips(address,uint256)", +"d14779c4": "signDigitalContract(string)", +"d1477f7b": "setInitialTokenValue(uint64)", +"d1479575": "creditcoinLimitInFrac()", +"d1482791": "updateInterest()", +"d148288f": "setHoldingPeriod(uint256)", +"d14ac7c4": "crowdSaleAllowance()", +"d14b2f9b": "addBonusToken(address,uint256)", +"d14b691d": "_resetReleaseTime(address)", +"d14cd233": "tokenSpread()", +"d14e1784": "paymentForWeek(uint256)", +"d14e62b8": "setCount(uint256)", +"d14ebab3": "NXE_Coin()", +"d14f17f7": "airdrop(address[],address)", +"d14f56f1": "moveUnsold()", +"d14f9219": "ham()", +"d150f835": "currentDonation()", +"d150fbe6": "convertToInd()", +"d151ec28": "getMadeTXFund(uint256)", +"d152865b": "getLastDIVDPeriod()", +"d15334a5": "firstVestAmount()", +"d15376a7": "lastBlock_f14()", +"d1538303": "docdetail(uint256,string,string)", +"d15392b2": "forceRelease(uint256)", +"d153ab40": "addMultipleTier1Members(address[])", +"d153b60c": "proposedOwner()", +"d153d118": "MyDice()", +"d1541264": "getManagerForCount(address)", +"d1555f1f": "approveCommitmentTransfer(address)", +"d1558b7c": "referrersCount()", +"d155908b": "addone()", +"d155feec": "EdisonCoin()", +"d156549f": "setExpiredAndWithdraw()", +"d1571996": "multisigOwner()", +"d1572e4c": "setResource(string,string,address)", +"d1577656": "purchaseTo(address)", +"d157e816": "MiningExtended(uint256,uint256,uint256)", +"d157ee04": "approveNextManager(address)", +"d157f27d": "sendAdvisorsSupplyToken(address)", +"d157f645": "setPaymentInterval(uint256)", +"d1587a18": "getAvailableRewardForUser(bytes32,address)", +"d1594403": "manualTransferTokensTo(address,uint256,uint256,uint256)", +"d15b506b": "TokenROC()", +"d15b95b4": "delegateDklBidAuction(uint256,uint256,bytes,uint256,uint16)", +"d15b9614": "GetLogMessageError()", +"d15c11e5": "providerRegistry(address)", +"d15c82e3": "reserveManyTokens(uint256[],uint256,address)", +"d15cfa25": "ChronoMint(int256,address,address,address)", +"d15d2745": "CLE_Beta_Pictoris()", +"d15d62a7": "getLibrary(uint256)", +"d15db5fb": "_computeBackground(uint256)", +"d15e06a0": "registerCrowdsales(address,uint256,uint256)", +"d15e1014": "marketingTokensPercent()", +"d15e3170": "payoutVoter(uint256,uint256)", +"d15e9459": "stopAddressesTotal()", +"d15ecbc2": "simulatedBlockNumber()", +"d15ee9ff": "setUsersCanTrade(bool)", +"d15f10cc": "acceptSubmission(uint256)", +"d15fc954": "wallet_Address()", +"d16058df": "getPayOrderKey(uint256)", +"d1613036": "releaseTokenTransfer(bool)", +"d1613731": "adminGetBalance()", +"d1614df3": "individualMinCap()", +"d1615300": "startWeekTwo()", +"d161b56a": "tokensMintedDuringICO()", +"d1622424": "_checkAgreement(address)", +"d1631361": "ms0()", +"d1632f67": "assignFundReceiver(address,uint256)", +"d16352af": "getProtocol()", +"d163b764": "row(uint32)", +"d163fcab": "getCurrentHero()", +"d1650f7f": "test_oneValidEqStringNoLog()", +"d1651786": "donateUnicorns(uint256)", +"d165288e": "setAllowMining(bool)", +"d165d7cd": "registerNameXnameFromDapp(address,bytes32,bytes32)", +"d1660f99": "safeTransfer(address,address,uint256)", +"d16617ae": "restartMiniGame()", +"d166539b": "_migrate(uint256)", +"d16712ed": "maxGoalReached()", +"d16782f6": "testMetered()", +"d1682600": "StandardToken(uint256,string,uint8,string)", +"d16856ca": "addAdmin(address,string)", +"d16865a3": "PRIORITY_ADDRESS_LIST()", +"d168f699": "Glv(uint256,string,uint8,string)", +"d1698430": "revokeAllTokenGrants(address)", +"d169a020": "evMgmtIssueBountyToken(address,uint256,address,uint256,bool)", +"d169c869": "endOfPreSale()", +"d16a7a4b": "FreezeAccount(address,bool)", +"d16a8fe7": "kickMember(address)", +"d16a9624": "winBidEth(address,address,uint256,uint256)", +"d16b04cf": "myCoinAge()", +"d16b6473": "getOnTokenTransferToValue()", +"d16be71b": "teamTokensDelivered()", +"d16c4cf5": "FOUNDER1()", +"d16e1ded": "requestTransferItem(address,address,string)", +"d16e443a": "previousDelegates()", +"d16e92db": "createCrowdsale(uint256,uint256,address,address,address,address,uint256,uint256,bool)", +"d16edc15": "chargeFeePool()", +"d16f8669": "crowdsaleClose()", +"d16ff4c8": "nextCandidateId()", +"d1701397": "Flip1Token()", +"d17222dc": "CATContract()", +"d1724881": "getBroker(address)", +"d17291bd": "icoRunning()", +"d1729a4a": "sendTokensManually(address,uint256)", +"d172d6fc": "playFast()", +"d1734eac": "isInNextGeneration(address)", +"d173707d": "hasPhysicalAddress(address)", +"d1738b72": "wroomWroom()", +"d173d531": "Amalgam()", +"d173e578": "setInitialAllocationLock(address)", +"d173fc82": "setTokenAdmin(address,address,address,address)", +"d1746107": "teamTokenRatio()", +"d174c388": "tokensaleToOtherCoinUser(address,uint256)", +"d1759141": "massEthFund()", +"d175958f": "cancelApproveForAll(uint256)", +"d175d38d": "calculateBonus(uint32)", +"d176be98": "DonorCrowdsale(uint256,uint256,uint256,address,uint256)", +"d1776731": "userToRobots(address,uint256)", +"d1778ed7": "UltrixCoin()", +"d177e6a6": "fillOrder(address,address,uint256,uint256)", +"d1786610": "getTokenRemaining()", +"d1789176": "AMOUNT()", +"d179eb71": "clonedFrom()", +"d17a1b5b": "SetAccessType(uint32)", +"d17a79c1": "totalNormalEtherCollected()", +"d17aa842": "GetDivPerCoinLarge()", +"d17ab3c6": "free2Of(uint256)", +"d17be133": "getAllHousing()", +"d17cf29f": "retrieveWarriors(address,address,uint8)", +"d17d0d29": "SITExchangerMock(address,address,address)", +"d17d25de": "marketingTokenAddress()", +"d17e45fb": "s23(bytes1)", +"d17e4889": "decodeProps(uint256)", +"d17f5d9d": "indice_vincitore()", +"d17f7142": "isLocked(uint256,uint256,address,address)", +"d17fd539": "_newInterest(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"d1802d79": "mintEGAS()", +"d18063cd": "registerParticipantAgent(address)", +"d1809fe8": "depositLiquidateThePool()", +"d180be1d": "isMemberOf(address,address,string)", +"d180d0bc": "_deliverTokens(address)", +"d180ebca": "FinishIco()", +"d1812be7": "newCustomFutureLottery(uint256,uint256,address,uint256)", +"d18165f6": "OEN()", +"d1818aed": "setPresidenteDeMesa(bytes32,uint256,uint256,uint256)", +"d181c37e": "NecroToken()", +"d182b4ff": "CurrencyHedge()", +"d182b83b": "validate(string)", +"d182d253": "ICO_PHASE1_LIMIT()", +"d183434d": "accountsBalances(uint256,address)", +"d1835b8c": "left21(uint256)", +"d184194b": "Smw()", +"d184935d": "getDebug()", +"d184adf6": "distributeToAddressesAndAmounts(address[],uint256[])", +"d184b88e": "AddedPrepaidTokensEvent(address,uint256,uint256,uint256)", +"d18523ac": "TimeDestroy(address)", +"d185c583": "ownerWithdrawFees()", +"d185f378": "_owns(bytes32,uint256)", +"d18611d6": "reactivate()", +"d1866019": "GetReferredCount()", +"d186659d": "setRateIcoMainSale(uint256)", +"d186899a": "issueAndLock(address,uint256)", +"d18746ed": "BonusChanged(string,uint256)", +"d188f550": "setPlayerGeneralLv(uint64,uint8)", +"d1893d23": "oldusesr(address,address)", +"d189b98d": "firstPrivateReleaseTime()", +"d189c1b0": "createUserByEmail(bytes32,bytes32,uint256)", +"d18a5563": "depositsStack(uint256)", +"d18ad4de": "getPlayerAff(address)", +"d18b07b2": "calculateCommission(uint256,uint256)", +"d18b93e6": "_owns(address,uint256,uint256)", +"d18c5da7": "FrogDaruma(address,address,address,uint256,uint256,uint256)", +"d18d944b": "setHardCap(uint256)", +"d18df96c": "vault_enableRefunds()", +"d18dfdc9": "parrot(uint256)", +"d18e031e": "verifyDeed(string)", +"d18e142d": "Announcements(uint256)", +"d18e81b3": "currentTime()", +"d18ffb8d": "inversorIsKyc(address)", +"d19003e5": "_endOfPreICO()", +"d1900a04": "TRCTotalSupply()", +"d191b336": "AdjustBetAmounts(uint256)", +"d191d7f4": "OPERATIONS_SHARE()", +"d191e11d": "rateSystem(address,uint256)", +"d192367b": "randomA()", +"d1925b80": "YACHT()", +"d1933a1b": "goalManagment(bool)", +"d19370bb": "resetKYC(address)", +"d1938376": "get_payment_by_id(uint256,uint256,address)", +"d193a0ca": "splitsSingle(uint256,uint256)", +"d1940a16": "announce(uint256)", +"d195bbd5": "AywakeToken(address,address)", +"d195ef83": "mintAdminApproval()", +"d195fd28": "RESERVED_BOUNTY_SIDE()", +"d1976a6f": "completeGame(uint256,uint256,string,address)", +"d19853c7": "exchangeBounty(address,uint256)", +"d1987a28": "setTradeRobot(address)", +"d1988b6a": "getGameHash(uint256)", +"d199168d": "claimedTokens(address,uint256)", +"d199c81d": "TokenSale(uint256,uint256,uint256,uint256,address,uint256,uint256,address)", +"d19b8d87": "refundManagerContractAddress()", +"d19b99b5": "turnMigrateOff()", +"d19c395f": "capPreICOTrasferred()", +"d19d1912": "getSelfGroupsContributedTo()", +"d19d8e1a": "Ethereumbonus()", +"d19e09ce": "setDefaultAccountingPeriodSettings(bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,bytes2)", +"d19e1ad4": "_calculateNewPrice(uint256)", +"d19e2364": "addDonateTokenAddress(address)", +"d19e6cf0": "ChangeDeadLine(uint256,uint256,uint256,string,uint256)", +"d1a0cc5c": "processPayment(address,address,uint256)", +"d1a0e8c8": "setFeeRebatePercent(address,uint8)", +"d1a132f9": "enableNodeRegistration()", +"d1a1beb4": "mint(address,uint256,bool)", +"d1a1f5ba": "addSongData(string,string,string,string)", +"d1a2749c": "Crowdsale(address,uint256,uint256,address,address,uint256,uint256,uint256,uint256)", +"d1a2bfaf": "Wallet_Initial_Supply()", +"d1a2dfd2": "isExistingDataIdentifier(bytes32)", +"d1a301e3": "setInitialBlockHeight(uint256,uint256)", +"d1a3d3ad": "assertEq9(bytes9,bytes9)", +"d1a3fb20": "updateUserRatio(uint256,address)", +"d1a40ce1": "_rewardVote(address,address,uint256)", +"d1a4a98c": "BeBitcoin(uint256,string,uint8,string)", +"d1a61025": "tradeBookOf(address)", +"d1a634e6": "OVC()", +"d1a69455": "get_enode_by_row(uint256)", +"d1a6ed67": "setFunctionIdSubcontract(bytes4,address,uint256,uint256)", +"d1a75e0d": "VOTE_FOR()", +"d1a75fea": "createTreatyRequest(uint8,string,uint256)", +"d1a7d1a8": "MyPinerTokenTest2()", +"d1a8d447": "get_all_bet_values()", +"d1a94e58": "TXOtoken()", +"d1a9eb19": "withdrawToContractOwner(uint256)", +"d1a9f5be": "createFileWithContents(string,uint256,bytes32[],uint256)", +"d1aadb6a": "setColour(uint8,uint8,uint8)", +"d1ab0457": "AddSoftware(string,string,bytes32,bytes32,bytes32)", +"d1abdab8": "divideDecimal(uint256,uint256)", +"d1acb464": "CreatedLoan(uint256,address,address)", +"d1ae0488": "transferBecauseOfAggregate(address,uint256,address,uint32,uint256[],uint256[])", +"d1ae2f01": "getVictim(uint16)", +"d1ae956f": "isPayed(uint256)", +"d1ae9607": "LFSTYLToken()", +"d1aea543": "forwardFunds(address)", +"d1af8a5a": "LinkerExample()", +"d1afaf1f": "addusertime(address)", +"d1afdb86": "buyAllowed()", +"d1b12b4e": "extCreateBot(uint256,uint256,uint256,uint256,address)", +"d1b1a22b": "set(string,uint256[],uint256[],uint256[],bool[],uint256[])", +"d1b1b65a": "rangeETHAmount()", +"d1b31a63": "cryptobank(bytes32,bytes32)", +"d1b33094": "addAccessor(address,uint8)", +"d1b33afa": "_calculateDayPass()", +"d1b39ae5": "decimalOffset()", +"d1b4ff7e": "multiAccessRevokeD(bytes32,address)", +"d1b53d2d": "tryFinalizeProposalByVoterIndices(uint256,uint256[],bool,int256)", +"d1b5e2be": "testFailRegisterContractIdAgain()", +"d1b648cd": "contractSendGas()", +"d1b6a51f": "finishEthGetToken()", +"d1b6dd30": "airdropClaimed(address)", +"d1b7cb9b": "transferBatch(address[])", +"d1b878e9": "getresult(uint256)", +"d1b9c430": "OPEN()", +"d1ba656b": "minimumTransferInWei()", +"d1ba8257": "SIX()", +"d1baaf58": "communityRoundStartDate()", +"d1bab4cc": "batchApprove(address,uint256[],uint256[],uint256[])", +"d1baceac": "DepositBank(address,uint256)", +"d1bb0433": "preSaleTokensPurchased()", +"d1bb5cf1": "marketplaceContract()", +"d1bb7b59": "tokensPerWeiBonus111()", +"d1bb8688": "ICO_SHARE()", +"d1bba64f": "Investment()", +"d1bc2cc4": "transferGift(address,address)", +"d1bc4157": "KanZhang()", +"d1bc5c8e": "KryptoroToken()", +"d1bc62de": "EARLY_FOUNDERS_USD()", +"d1bc76a1": "recipients(uint256)", +"d1bcbf6c": "_isReady()", +"d1bd328b": "bonusFirstIco()", +"d1bd56c1": "TripleT()", +"d1bdf639": "cards_black_check(address)", +"d1be7cc4": "serverPortUpdate()", +"d1bf942a": "rok()", +"d1bf9aba": "nextRune()", +"d1c01b26": "Crowdsale(address,address,uint256,uint256)", +"d1c06b2f": "availablePositions()", +"d1c1132f": "lockInTreasury()", +"d1c13abd": "returnRental()", +"d1c15acf": "OWNERS_AND_PARTNERS_SUPPLY()", +"d1c19fbc": "Withdrawn(address,address,uint256)", +"d1c1f19f": "NewPlay(address,uint256,bool)", +"d1c2babb": "merge(uint256,uint256)", +"d1c31f10": "tokenLockUp(bool)", +"d1c332c7": "preDistriToAcquiantancesStartTime()", +"d1c43558": "TheExtraordinarySpacemen()", +"d1c46916": "releaseLock(address)", +"d1c484f6": "proposedRecoveryKeyPendingUntil()", +"d1c4c206": "setRoute(string,address,bool)", +"d1c5e119": "getMyAnotherDragon()", +"d1c673e9": "transferAndCall(address,uint256,uint256,bytes)", +"d1c693f8": "TOTAL_TOKENS_FOR_PRICE()", +"d1c699aa": "exerciseFee()", +"d1c6b0ca": "setBonusAmount(uint256)", +"d1c6f448": "updateInitialRate(uint256)", +"d1c72c89": "isInRoundTwoState()", +"d1c73322": "tokenHardcapReached()", +"d1c7a6ac": "ActivationWithdrawal(address[2],uint256[8],uint256,uint256)", +"d1c7be4d": "_pushLuckyInfo(uint256,uint8,address,uint256)", +"d1c85478": "GGRocketToken(address,string,string,uint256,uint256)", +"d1c8e7e6": "charityDonation()", +"d1ca0218": "issueToken(uint256,uint256,uint256)", +"d1cb0f0f": "getAllTombs()", +"d1cb923c": "HUNDREDTIMES(uint256)", +"d1cb993d": "grantAllowance(address,uint256)", +"d1cbfc66": "getOneTotalFeesDistributed(uint256)", +"d1cbfe65": "setRefferal(address)", +"d1cc9976": "isTerminated()", +"d1cd19cf": "advisorCut()", +"d1cd7bfa": "setSUTokenContract(address)", +"d1cdcf71": "PRICE_STAGE_FOUR_BONUS()", +"d1cdfe84": "Bonus_PoolTransfer(address,uint256)", +"d1ce017c": "getABIHashForMod(bytes32)", +"d1ce36aa": "unLockIdx()", +"d1ce65ab": "isCryptoRomeLandComposableNFT()", +"d1cec3ac": "CrowdSaleTest()", +"d1cf113e": "multiAccessSetRecipient(address)", +"d1cfe644": "EventCashOutTank(address,uint256)", +"d1d115ac": "test_fourInvalidEqUint(int256)", +"d1d1c8ae": "ConvertNumbers(bytes)", +"d1d1f264": "setSubscriptionStatus(bool,bytes32)", +"d1d2bd55": "calculateRangeLength()", +"d1d3a898": "_createElement(uint256,string,address,uint256,uint256)", +"d1d3bb92": "testSetPkg()", +"d1d3d8a6": "MintLog(address,uint256)", +"d1d422f6": "roundEvent(address[6],bytes32[6])", +"d1d46d2b": "setChestPrice(uint16,uint256)", +"d1d4c4c6": "safeDiv(int256,int256)", +"d1d5190c": "changeStart(uint256)", +"d1d53493": "setMaximalInvestmentTimeTreshold(uint256)", +"d1d566cf": "allocateExtraTokens(address)", +"d1d5824d": "maxBetThresholdPct()", +"d1d58b25": "claimable(uint256)", +"d1d675e4": "setMaximumCoinsPerAddress(uint256)", +"d1d6d639": "EstimateGas()", +"d1d6e44a": "paintGraffiti(uint256,string,string)", +"d1d80fdf": "setAddr(address)", +"d1d8fd65": "TransferCoins(address,uint8)", +"d1d93318": "createAvatar(string,uint256)", +"d1da09ee": "extractImportFeeChargeLength()", +"d1da8436": "setAdData(uint256,string,string)", +"d1db1cc4": "LogRefundingOpened(uint256)", +"d1db99b6": "INR_Omnidollar()", +"d1dbcd70": "isNodeTLDOfRegistrar()", +"d1dc3706": "LogReceivedETH(address,uint256)", +"d1dc72a0": "METAHASHCOIN()", +"d1dd2794": "buy_end_time()", +"d1ddb24e": "recordResult(address,address,address)", +"d1de5011": "getAccount(bytes32)", +"d1de592a": "add(bytes32,bytes32)", +"d1defff2": "_educatedToken()", +"d1df1252": "ringBell()", +"d1df306c": "burnToken(address,uint256)", +"d1df81df": "getPlayerInfo()", +"d1dfdc07": "patentSaleTimeDelay()", +"d1e0363d": "_createLock(uint32,address,uint256)", +"d1e040ec": "ConvertColouredBkp(address)", +"d1e07bcb": "onlyCapperMock()", +"d1e15045": "sendBack()", +"d1e191a4": "withdrawEverything()", +"d1e19ab2": "distributeAllTokensToContributor()", +"d1e2eb5e": "countInvestor()", +"d1e34733": "GCOXACMToken(string,string,uint8,uint256)", +"d1e400f4": "ecoSystemAddress()", +"d1e4b8da": "importBalance(address)", +"d1e58e0f": "preIcoRate()", +"d1e692eb": "lastLottoTime()", +"d1e6a64f": "leftForSale()", +"d1e7e81f": "selfLock()", +"d1e83b8b": "ChangeInterest(uint256,uint256,uint256,uint256,bool)", +"d1e8acb4": "ABC(uint256,string,uint8,string)", +"d1e9822c": "RESERVE_WALLET()", +"d1e99563": "BACKLEAF()", +"d1e9ab13": "Swift()", +"d1e9dcbf": "serverForceGameEnd(address,uint256)", +"d1e9f75b": "testHitSoftCap()", +"d1ea2786": "offerSketchForSale(uint256,uint256)", +"d1ea8b89": "QNTUsdRate()", +"d1eabc94": "CardToken(uint256,string,string,string,string)", +"d1eb6404": "donationsFrom(address)", +"d1eba9c9": "getDeployedAuctions()", +"d1ec32ed": "secondsToHold()", +"d1eca85e": "startIcoPreICO()", +"d1ecdec6": "m_OwnerFees()", +"d1ed3dad": "getIndex(address,address)", +"d1ed74ad": "retrieve(bytes32)", +"d1ee2bf9": "icoDiscountTime()", +"d1ee32c3": "issueTokensForICO(uint256)", +"d1ef4e91": "vestTokens(address,uint256,uint256)", +"d1ef752d": "Post(address,address,address,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"d1efb5cd": "_getChamp(uint256)", +"d1efd30d": "secret()", +"d1f03514": "getRewardLevel(uint256)", +"d1f0bb2d": "populateAllowedFreeExchanges()", +"d1f1ef34": "setPrivateSale()", +"d1f1fff8": "minBalanceForTxFee()", +"d1f276d3": "releaseAgent()", +"d1f2a7e2": "isUserPolicyAccepted()", +"d1f2efd5": "isMainSale()", +"d1f2f971": "calculateDivi()", +"d1f34b14": "__uintToBytes(uint256)", +"d1f38097": "CTGToken()", +"d1f461d5": "getUsernameFromAddress(address)", +"d1f46c8d": "resolveCycle()", +"d1f4df47": "grantBountyTokens(address)", +"d1f55764": "shareContract()", +"d1f59db9": "isLatestMinorTree(bytes32,bytes32)", +"d1f61c44": "Totalizeum()", +"d1f61ed5": "dropRoute(uint32)", +"d1f6424f": "configurationCrowdsale(address,uint256,uint256,address,uint256[],uint256,uint256,uint8,uint256)", +"d1f69902": "getHeroClassId(uint256)", +"d1f6d676": "ExchangeContract(address,address,uint256,uint256)", +"d1f70760": "setAdditionalTokensFromCommonPoolWallet(address)", +"d1f7a4e4": "createCertificate(bytes)", +"d1f8a208": "removeOrganisation(address)", +"d1f92cab": "timereumDelta()", +"d1f95204": "propertyIndexToOwner(uint256)", +"d1f9c24d": "gameState()", +"d1f9f3a0": "bitdncToken()", +"d1fa338d": "TokenStorage(address)", +"d1fa74d2": "SimpleEscrow()", +"d1fa94d0": "setLockStatus(bool)", +"d1fa9cad": "Partners()", +"d1fae327": "CofounderSwitchedEvent(address)", +"d1fb386a": "_recordStashedPayout(uint256,uint256)", +"d1fb5646": "releaseTo(address)", +"d1fc0ddf": "prevOracle()", +"d1fc8cf3": "endDispute()", +"d1fccf9e": "bonusedPurchases()", +"d1fd260e": "getLotteriesByOwner(address)", +"d1fd3b12": "_rotateCauldron(uint8)", +"d1fe43ba": "migrateDueToNoReports()", +"d1fea3d5": "setReleased(bool)", +"d1feb5ee": "deleteArrayBytes32()", +"d1feca67": "addSpendingRequest(address)", +"d1ff535e": "PURCHASER_MAX_TOKEN_CAP()", +"d1ff8151": "getNumTanks()", +"d1ff9605": "setAdminFeePercent(uint256)", +"d1ffb796": "_ListingRemoved(bytes32)", +"d2004f8c": "getChance(uint256,uint256)", +"d20058af": "ESCBAirdropper(uint256,address)", +"d2008118": "logPromiseConfirmed(uint256)", +"d202158d": "keyHasPurpose(bytes32,uint256)", +"d2038d4d": "finalize4()", +"d2051f8e": "updatePassword(uint256,string,string,string)", +"d205ad7d": "proposeDissolve(bytes)", +"d205bcb0": "isPendingOracle(address)", +"d205f1e6": "testFail_set_price_without_token()", +"d2064e2f": "getStamp(uint256)", +"d2077782": "changeRequestCount()", +"d2079c0f": "playersLength()", +"d207e757": "ownerSetOraclizeSafeGas(uint32)", +"d2080ccd": "pauseWhitelist()", +"d20838f4": "setRegistryContractAddress(address)", +"d208fd60": "getMessageSender(uint256)", +"d209a566": "BP_PERSIAN()", +"d20ae2b5": "getMyWorks(bytes32,bytes32)", +"d20c34de": "TaylorToken()", +"d20cd8e5": "Solved(address,string,string)", +"d20d6119": "createTokenUri(uint8,uint8,uint8,uint8,uint8)", +"d20db416": "_approvePurchaser(address,uint256)", +"d20de0bc": "nextParticipantIndex()", +"d20e54a8": "startBet(uint256)", +"d20f5029": "advisorsTokensAddress()", +"d21077f3": "areFundsReleasedToBeneficiary()", +"d211483f": "RoleRemoved(address,string)", +"d211fd18": "capital()", +"d211fe86": "icoEndtime()", +"d21220a7": "token1()", +"d212a69a": "_fees()", +"d2134b26": "expTx(uint256,uint256,uint256)", +"d2135356": "isValidRelease(uint256)", +"d213ed96": "manageApprovedMintingModule(address,bool)", +"d213f109": "calcAmtReclaimable(address)", +"d21407fa": "crowdSalesCompleted()", +"d214326f": "GetWinners()", +"d214becb": "charactersCountOf(address)", +"d21577f2": "stakeEther()", +"d2161687": "reflectSwitch()", +"d2164302": "forgeWeaponPureDamage(uint256,uint256,uint256,uint256)", +"d216995b": "determineBonus(uint256,uint256)", +"d2169d2f": "getMonsterLevel(uint64)", +"d2169dfd": "RETURN_DATE()", +"d216a47d": "decreaseApproveAndCall(address,uint256,bytes)", +"d216a86c": "publicEventActive()", +"d216d55d": "etherandomExec(bytes32,bytes32,uint256)", +"d21705ff": "admin_proportion()", +"d2178b08": "get2()", +"d217b149": "managerUnset()", +"d218e144": "calculateRanking()", +"d218f92d": "checkinter()", +"d219f103": "collectedEtherFrom(address)", +"d21ad1ed": "calculateWinnerCut(uint256,uint256)", +"d21b84ac": "createNewDAO(address)", +"d21b93df": "Hypes()", +"d21b96ab": "ringhashRegistryAddress()", +"d21bcc7c": "get46(uint256,uint256)", +"d21bdee4": "Bitforce()", +"d21c39a1": "acceptPayment(address,uint256,address,uint256,uint256)", +"d21c700f": "stopToken()", +"d21cacdf": "referrerOf(address)", +"d21cbffc": "getIfVoted(uint256,address)", +"d21ceba0": "RemainingTokensReceiverAddress()", +"d21cf24f": "setSingleWithdrawMax(uint256)", +"d21d2cd1": "lifePoints()", +"d21d7950": "changeGasLimitOfSafeSend(uint256)", +"d21e17a6": "_payEthereum(uint256)", +"d21efc35": "endPhase()", +"d21fa4e1": "contract_alive_until_this_block()", +"d2201c3b": "CreateLUNETS(address,uint256,uint256)", +"d22057a9": "register(bytes32,address)", +"d220b727": "ProposalTallied(uint256,int256,uint256,bool)", +"d2225635": "getBetterNumOfWinnings(address)", +"d22290a4": "feeBips()", +"d222dc04": "requiredSignedAddress()", +"d2231919": "TransactionRefundedByMediator(uint256,uint256)", +"d22341a9": "withdrawDeveloperPot(address)", +"d2234b37": "withdrawal2()", +"d2235998": "_cancelAuction(address,uint256,address)", +"d223926f": "buyBooster(uint256)", +"d224118f": "PrepareDraw()", +"d224c3e0": "gen0Step()", +"d224f1ed": "proxiesCount(address)", +"d2254db0": "DDEToken()", +"d22591c8": "addBook(string,address)", +"d226d11f": "foundEvidence()", +"d226ff1b": "User(string)", +"d2273f37": "_changeTuneOption(uint32,uint32,uint256,bool,bool,uint128,bool,uint64,uint256)", +"d2282dc5": "setUint256(uint256)", +"d228cfc5": "claimHodlRewardFor(address)", +"d229a94a": "lockTokensForTradingMarketContract(address,uint256)", +"d22a1180": "finanReserveAllocation()", +"d22ac06f": "_approveEscrow(bytes32,uint256)", +"d22b1a0f": "secondVestStartsAt()", +"d22b32e9": "hivePerEther()", +"d22b3c8b": "ownerArmyCount(address)", +"d22b3de6": "setTitulaire_Compte_10(uint256)", +"d22b64a2": "getDonationByAddress(address,address)", +"d22b9177": "getImageRegionId(uint256)", +"d22bdce2": "_getNextStage()", +"d22c391a": "validateProposedThroneRules(uint256,uint256,uint256,uint256,uint256)", +"d22c78f8": "getPlanetDetails(uint256,uint256)", +"d22d9c6d": "tokensInUse()", +"d22dee48": "claimProfit(uint256)", +"d22e7b69": "validatePublisher(address,bool,string)", +"d2305f07": "getCloneArray(uint256[])", +"d230e875": "MaxValue()", +"d232790d": "setLastWinner(address,uint256,uint256,uint256)", +"d232a8f5": "firstStageCap()", +"d23376ec": "getPOOL_edit_14()", +"d233e5c0": "oxen(address)", +"d233fc0b": "changeRecovery()", +"d235f947": "setMaxHealthAndMana(uint256,uint32,uint32)", +"d23628f1": "CyberRailNET()", +"d2368f64": "Billing(uint256,uint256)", +"d237a427": "TT()", +"d237b43f": "reclaimResourceDeposits(address)", +"d237bc74": "paymentSizeC()", +"d238cd1b": "redeemVoucherSingle(uint256,address,address,uint256)", +"d238ec90": "HWGLToken()", +"d2395dcd": "buyTokens(address,uint256,uint256)", +"d239ea8b": "getSchemasLenght()", +"d23ad39d": "setCommons(address)", +"d23b8f5c": "drawDailyWinner()", +"d23dcee0": "_generateTokenURI(bytes32[],uint256)", +"d23df2d1": "RENEX_SETTLEMENT_ID()", +"d23e09f5": "trioContract()", +"d23e8489": "transferOwnership(uint256)", +"d23ea159": "eGoldchainStart()", +"d23ef360": "setExchangeRegulatorWallet(address)", +"d23f0abb": "issueTokensForPresale(uint256)", +"d23f1bba": "noBets()", +"d23f4450": "scoreDown(address)", +"d24155c1": "getAmountBonusRate()", +"d2415852": "TheDivine()", +"d241ead8": "testMinReturn0WithReturn()", +"d242448c": "transferredCrowdsale()", +"d24257c0": "betAmount()", +"d2427db5": "checkTotalPayout(address)", +"d242b051": "reserveWaveLockup()", +"d243ec26": "payDev()", +"d244059a": "whiteListLimit()", +"d24481ea": "checkWin()", +"d24594b8": "canApply(uint256,bytes32)", +"d245a084": "TransactionRefundedAfterDispute(uint256,uint256)", +"d245aa92": "endBlockBonus3()", +"d245da28": "updateEarlyParicipantWhitelist(address,address,uint256)", +"d2467e31": "GetSellingTokenDecimals()", +"d246a8c9": "lastNegativeVoting()", +"d246b379": "calculateRevenue(uint256,uint256,uint256)", +"d246d411": "burnAddr()", +"d247160a": "ethertoteDevelopmentTransferComplete()", +"d24876b7": "sellCMTAgainstEther(uint256)", +"d248cf1f": "DASHABI(uint256,string,string)", +"d24987fc": "getNewTokenPrice(uint256)", +"d24999ca": "getkillerPriceConversionFee()", +"d249a52e": "update(bytes,uint256[],uint256[])", +"d24ac764": "getRejectionCount(uint256)", +"d24b06b7": "registryRequestCustodian()", +"d24b08cc": "callstoredaddress()", +"d24b62a8": "lotteryReset()", +"d24b7090": "_payEtherAndDistribute(uint256)", +"d24b7e7a": "setEthPrice(uint128)", +"d24bcb15": "usechainWallet()", +"d24bcf54": "getEarlyIncomeByAddressRound(address,uint256)", +"d24c48bc": "getLiquidationSpreadForPair(uint256,uint256)", +"d24c5a36": "random1()", +"d24c8fe4": "_getCurrentStage()", +"d24d11ad": "BattleProvider(address,uint256,uint256,uint256,uint256,uint256)", +"d24ddcfe": "buyKissBTC()", +"d24ecc10": "initializeSale(uint256,uint256,uint256,uint256,address)", +"d24ef4f3": "PLATFORM_DEVELOPMENT()", +"d24f8a17": "convertShortedTokensToLiquidationToken(uint256)", +"d2500033": "RISE()", +"d25090ff": "withdrawContribution(uint256)", +"d25119c7": "getMsgHash(address,string,string)", +"d2521034": "marriageStatus()", +"d2526418": "getFeePercent(address)", +"d2531590": "CANCEL_EXTRA_GAS()", +"d2536893": "setDividendWinners(uint256[],uint256[],uint8[],uint256)", +"d2548393": "team2019TokenCreated()", +"d255494a": "removeInventory(bytes32)", +"d25570f2": "AliceToken(uint256)", +"d2558fca": "Token3D()", +"d2559533": "WinancesToken()", +"d256451c": "setRates(uint256,bytes32[],uint256[])", +"d256c7a5": "setTokensPerEther(uint256,uint256)", +"d2571062": "setAllContracts()", +"d2577fec": "_getRoleSignature(address,bytes32,address)", +"d258d7b6": "test_4_generateTokensAccrossBlocksAfterDestroy_increaseBlocksBy1000()", +"d258f2f4": "TeTeToken()", +"d2591068": "TLCMarketCrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"d259224a": "ssstt()", +"d2598c4c": "removeTrader(uint8)", +"d2599300": "savedReferral(address)", +"d2599312": "initShareRule4Publicity()", +"d259d761": "changeAdminContract(address)", +"d25a1212": "revokeAttributeSigned(address,uint8,bytes32,bytes32,string,bytes)", +"d25a13b4": "roundTwoBlock()", +"d25a5be9": "airdropTotalSupply()", +"d25b3ee1": "AcademiCon()", +"d25b4f2a": "CrowdsaleRC()", +"d25c0767": "isSaleAuction()", +"d25d19e2": "SetThrdOwner(address)", +"d25d603c": "cancelOrder(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32,string)", +"d25dc056": "transferToWinner(address,address,uint256)", +"d25e3443": "ISLToken(uint256,string,string)", +"d25f08b1": "adminAddICO(uint256,uint256,uint256,uint256,uint256,uint256[],uint256[],bool)", +"d25f1c35": "CPGPEREGRINE_MAX_CARGO()", +"d25f82a0": "getAirdrop()", +"d25ff342": "MNXToken()", +"d2602930": "RockPaperScissors()", +"d26031ab": "phase2EndingAt()", +"d261de38": "NVCTToken()", +"d261fbed": "addressCallWithArray(address[3])", +"d2620e2d": "holdOf(bytes32)", +"d2625fce": "pendingOracleB()", +"d2631e42": "changeRewardManager(address)", +"d263b7eb": "ownerkill()", +"d263be48": "myWallets()", +"d263d2a4": "setWildCardToken(uint256)", +"d264a878": "getOraclizeWinnerTimeOffset()", +"d264cfdc": "lockAccountOf(address)", +"d264e05e": "forward()", +"d2650fe5": "RedeemEvent(address,uint256,uint256,uint256,uint256)", +"d2651855": "changeERC20(address)", +"d2654219": "getCurrencyDenominated()", +"d2656069": "SmartContract_Allowed(address)", +"d26574ac": "setCardPerkText(uint256,string)", +"d2663184": "setDividendCardAddress(address)", +"d266e83b": "isActive(address,uint256)", +"d2670025": "REQ()", +"d2676711": "getCommentAccountsLength()", +"d267dc96": "Tradenexi()", +"d2689abc": "ecdsaverify(uint256,uint256,uint256,uint256,uint256)", +"d269ae55": "MAX_ALLOWED_TOTAL()", +"d26c8a8a": "coinBalance()", +"d26cbe1e": "Contributed(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"d26cfeae": "setMinAmount4Round(uint256)", +"d26da39e": "isRequestFromOwnerOrMeterKey(address)", +"d26dbd2a": "preSaleTokensDisbursed()", +"d26ee061": "getAvailableFundsForTheTeam()", +"d26f9cd7": "backofficeRedeem(uint256)", +"d26ff86e": "submit(bytes32,bytes32)", +"d270085e": "addNoFeeAddress(address[],address[])", +"d270b8e8": "tokenDistributionEndTime()", +"d270cbaf": "buyAAC()", +"d270e7ab": "mainContract()", +"d271011d": "transferEthers()", +"d2715a6b": "getEmblemOwner()", +"d2718fbe": "setOwnerFlag(uint256,uint8)", +"d271900d": "linkContract(address)", +"d2719d22": "btcRate()", +"d271b067": "ln(int128)", +"d2727e6c": "_oneTokenInWei()", +"d2728f90": "Bought(uint256,address,uint256)", +"d273285b": "createdWallets()", +"d27399b5": "countAddressesSet()", +"d27416ec": "verify(bytes32,uint8[5],bytes32)", +"d27482a4": "claimOwner(address)", +"d274b230": "registerFor(address,address,uint256,uint256,uint256)", +"d274fa91": "amendRetention(uint256,uint256)", +"d2756e11": "finalizeNumber(uint256)", +"d2758538": "createOneDrink(string)", +"d2760b64": "_isBuying()", +"d27626fd": "pushToken(address[],uint256,uint256)", +"d2769df1": "isValidComposition(uint256[],uint256)", +"d276a3e1": "auctionedEth()", +"d2786ba4": "getMetaData()", +"d2789aa5": "getPrivilegeState(string)", +"d279830c": "addMilestone(uint256,uint256,uint256)", +"d279c191": "claimReward(address)", +"d27a43f6": "_checkWin(uint256,address)", +"d27a6f28": "ZyPPACrowdsale(uint256,uint256,uint256)", +"d27aa18e": "Secure()", +"d27bf2e3": "getCurrentLocation()", +"d27d1bc4": "proposalsNumber()", +"d27d3e88": "bulkSend(address[],uint256[])", +"d27f41cd": "CharityInProgressWallet()", +"d27fcf96": "gmtFundAddress()", +"d27ffef1": "OLIFEToken()", +"d282866a": "whichTick(uint256)", +"d282db01": "_withdrawal(address)", +"d2835c58": "P4P()", +"d283833d": "toekensForTeam()", +"d283859d": "removeBlack(address)", +"d2840362": "addAdvisors(address,uint256,uint256)", +"d28442ef": "ownerProfit()", +"d2846c7b": "isProxyContract()", +"d285b7b4": "loan()", +"d286dbf2": "internalNewRound(uint256,uint256)", +"d2871105": "tokensIssuedBySTO()", +"d2874e49": "withdraw(address,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"d2879f47": "_getContractTokenBalance()", +"d2886ebc": "getUserSkills(address)", +"d288c878": "blackListERC20(address)", +"d289ade2": "payFee(uint256)", +"d289eb82": "buyMultipleItems(uint8)", +"d289f187": "_addBonus(address,uint256)", +"d28a4f9e": "setKyberContractAddress(address)", +"d28ae9ef": "calcMiningSharesAmount(uint256,uint256)", +"d28b5317": "setCampaign(bytes32,uint256,uint256,uint256,uint256,bool,address,string,int256)", +"d28be797": "getShitClonelordReq()", +"d28c25d4": "changeGreeting(string)", +"d28c2aaa": "fix_parents(uint256,bool)", +"d28cb7b5": "availableWallet(address)", +"d28cbded": "ERC20Token(uint256,string,uint8,string)", +"d28d4e0c": "queryAllAccounts()", +"d28d8852": "_name()", +"d28dcdea": "haltPurchase()", +"d28e4355": "updateClaimable(uint256)", +"d28e88bd": "freezeDateOf(address)", +"d28f95ba": "withdrawalEth()", +"d28fa960": "withdraw_all_funds()", +"d28fdde8": "updatePrice(uint256[])", +"d2901c47": "RATE_SOFT()", +"d290ee06": "revokeTokenTimelock(address,uint256)", +"d291fa81": "GetMinerAt(uint256)", +"d29208d4": "MasterCoin()", +"d292515d": "totalMintNums()", +"d292b920": "CryptaurMigrations()", +"d292e6cb": "_sendPriceUpdate(address,uint256)", +"d294cb0f": "accountBalance(address)", +"d294f093": "claimFees()", +"d2953f84": "assetByIndex(address,uint256)", +"d29543af": "FolioNinjaToken(address,address,uint256,uint256)", +"d296853a": "whitelistPreSaleAddress(address,bool)", +"d2968a7f": "addContribution(address,uint256,uint16)", +"d2970120": "getSettlingTimeoutBlock(bytes32)", +"d29709fb": "returnDeposit(address,uint256)", +"d2973f93": "setUserType(address,uint256)", +"d2983dfd": "LoadedRefund(address,uint256)", +"d299dac0": "blake2b(bytes,bytes,uint64)", +"d29b5d2f": "mintReputation(uint256,address,bytes32)", +"d29c8c96": "createdBlockOnCommitsPhase(uint256,address)", +"d29cafe1": "ZilliqaToken(address,uint256)", +"d29cbd60": "getMonsterBaseStats(uint64)", +"d29d44ee": "_transferOwnership(address)", +"d29d503c": "addHolder(address,uint256,uint8,uint256)", +"d29d91ca": "getNarcoHomeLocation(uint256)", +"d29db7e4": "_processPurchase(address,uint256)", +"d29dd76d": "whitelistAdmins(address)", +"d29e2746": "place_buy_order(uint16,string,address,string,string)", +"d29e319c": "TOKEN_ICO3_LIMIT()", +"d29e6803": "secretHash()", +"d29ebd2e": "privateOfferingSupply()", +"d29f541d": "getPosition(uint256,address)", +"d2a09b96": "_updateReferrals(uint256,uint256)", +"d2a17959": "transferTokensFromVault(address,uint256)", +"d2a1e045": "FuBi()", +"d2a2feaa": "STRI()", +"d2a32c12": "bonus_amount()", +"d2a3899c": "payOrder(uint256,uint256,uint256)", +"d2a3b190": "SAToken()", +"d2a405f7": "_issetConverter(address)", +"d2a4ccc5": "redeemBuzzCafeBal()", +"d2a569c3": "startAirdrop()", +"d2a59d69": "dragons(uint256)", +"d2a6629c": "playerActiveGames(address,uint256)", +"d2a6cf5e": "internalTrade(uint256,uint256,uint256,uint256,uint256,uint256,bool,address,address,bytes32)", +"d2a718ec": "isRefundLocked()", +"d2a753e4": "cancelBid(address,bytes32,int32,bool)", +"d2a764d1": "contributeInBNB()", +"d2a79e57": "tixPresaleDeposit()", +"d2a7d38a": "MIN_FUNDING_AMOUNT()", +"d2a7ea17": "setSelfAsPureShareholder(string)", +"d2a86985": "_ORAK()", +"d2a9b6ed": "getVotingFor(address)", +"d2aa24b6": "getControlInfoMaxPerBlockImbalanceList()", +"d2ab6be1": "start(uint8)", +"d2ab78b7": "getGameName(address)", +"d2ac0f59": "setHeroContract(address)", +"d2ac1c8e": "addApprovedAddress(address)", +"d2ac2d8a": "heldOf(address)", +"d2acbc0d": "card_metal_minamount()", +"d2accad3": "_changeText(uint256,string)", +"d2ace0cc": "_newVoting(bytes,string)", +"d2ae5f65": "earlyInvestorTokenRaised()", +"d2ae8eaa": "getGenesForSale()", +"d2aeb90f": "removePoweruser(address)", +"d2aee00b": "getCanAttackMonsterIds()", +"d2afa8c1": "isERC721()", +"d2afeeeb": "createBoard(bytes32,bytes32,uint256,uint256,uint256)", +"d2b001fb": "PREMIUM_TYPE_COUNT()", +"d2b022d5": "pendingWithdrawalsBalance()", +"d2b0d554": "getDisclaimer()", +"d2b10b75": "AirDropContract(address,address)", +"d2b1569e": "redeemRewardedAxies(address,uint256)", +"d2b3fe93": "updateRoundLimits(uint256)", +"d2b420ce": "isOfferSorted(uint256)", +"d2b4a460": "getJackpotFee(uint256)", +"d2b50743": "DOW_FRI()", +"d2b5c227": "AsideTokensHaveBeenAllocated(address,uint256)", +"d2b5d9e1": "refferalFee()", +"d2b73cea": "getActiveContractAddress(uint256)", +"d2b74f70": "CryptoFamousStorage()", +"d2b75b70": "_upsert(address,uint256,bool,bool,uint256)", +"d2b77264": "pollMap(bytes32)", +"d2b78529": "getContractNetBalance()", +"d2b7d957": "executeDelegatecall(address,uint256,bytes)", +"d2b8035a": "draw(uint256,uint256)", +"d2b8915c": "offerPosition(uint256,uint32,uint256)", +"d2b8b867": "doPayment(uint256)", +"d2b93303": "EternalToken()", +"d2b962f2": "createLiability(bytes,bytes)", +"d2b9da84": "Office(string,string,uint256)", +"d2ba499c": "IS_SIGNATURER(address)", +"d2ba5537": "numberOfClaimants()", +"d2ba8073": "minbid()", +"d2bafbe6": "setMaxCoordinate(uint256)", +"d2bb6fd5": "timeTier2()", +"d2bbda29": "registerName(string,address,string)", +"d2bbf6df": "getIndexId(address,bytes32)", +"d2bd3dd9": "YAP()", +"d2bec28c": "startCraftingAuction(uint256,uint256,uint256,uint256)", +"d2bf36c0": "getPackData(uint256)", +"d2bf779f": "getKingdomInformations(string)", +"d2bfd24b": "setgamecard(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"d2c03c01": "auto_withdraw(address)", +"d2c0e032": "set(address,string,string)", +"d2c18e0b": "api()", +"d2c18f59": "emergencyManager()", +"d2c33eb2": "claimRaisedWei(address,address)", +"d2c37621": "getUserLocalTokenBalance(address)", +"d2c3a1ec": "updateStageInfo(uint256,uint256)", +"d2c411d3": "closeBatch(uint256)", +"d2c49b7f": "getTimeUntilEnd(uint256)", +"d2c51c72": "withhold()", +"d2c5c368": "testFailRestartNotUpdatable()", +"d2c5ce31": "dateTimeAddr()", +"d2c73093": "createTokens(uint256,address)", +"d2c731d9": "TermsOfUse()", +"d2c877f8": "setDollarRate(uint256)", +"d2c87b02": "MB(address,address,address,address,address)", +"d2c936ff": "currentBonusLevel()", +"d2c94ec5": "C4FToken()", +"d2ca159a": "listUnconferences()", +"d2ca2115": "periodLength()", +"d2cad255": "BankDeposit(address,uint256)", +"d2cad6da": "bonusCalculate(uint256)", +"d2cae700": "getAllFailedInvestmentsCollected()", +"d2caeea8": "aomucoin()", +"d2cafe2d": "allAssetsOf(address)", +"d2cbcea6": "getSSP(address)", +"d2cc7015": "placeMove(uint8)", +"d2cc718f": "accumulatedInput()", +"d2cced90": "getAnnualInterest(uint256)", +"d2cd9673": "totalMining()", +"d2cd96bd": "changeQuorum(uint256)", +"d2cdf580": "setKYCpassed(address)", +"d2ce33f8": "preMinting()", +"d2ce89e5": "logoURL()", +"d2cf7704": "BanAttempt(address,address,uint256)", +"d2cfe5a7": "posscoin()", +"d2d0ded1": "referrerBonusPercent()", +"d2d0e066": "deposit(address,uint256,uint16)", +"d2d10162": "initialize(address,address,uint256,uint256,address,address)", +"d2d10be8": "TGEToken(string,string)", +"d2d153a4": "Grand_Solar_Minimum()", +"d2d21e85": "sendToNest(uint256)", +"d2d26edc": "Cloudcoin()", +"d2d3b8e0": "multiAllowance(address,address[],address[])", +"d2d3d7fb": "fetchAllVoters()", +"d2d42074": "getExchangeContractAddress()", +"d2d44955": "Cindicator()", +"d2d4bd72": "getCrossRate(bytes,bytes)", +"d2d5a55c": "ownerValidator()", +"d2d7231f": "calculateReward(uint256)", +"d2d791c0": "payBatch(bytes32[],uint256[],address,address,bytes)", +"d2d85cf2": "rootsMatch(address,address)", +"d2d8cb67": "TOKEN_PRICE()", +"d2d8fd0a": "settleFrom(address,address,uint256)", +"d2d92f24": "getWhitelistEntry(uint256)", +"d2d93f90": "ethRate()", +"d2d976da": "webpage()", +"d2d97d9f": "coldStorage()", +"d2d9b8c6": "setCompte_24(string)", +"d2d9d44e": "awardTitanium(address,address,address)", +"d2da29c7": "hostAddress()", +"d2db29af": "claimFutureUse()", +"d2dc0869": "add(string,uint256,string,string,address)", +"d2dcd933": "totalSupplyAtTime(uint256)", +"d2dd8d2a": "authorized_updateCardClaimerAddress(uint256,address)", +"d2dd9f79": "transferVault(address)", +"d2ddf1ae": "TradingForest(address)", +"d2de6cca": "getArrayValueByKey(string,string)", +"d2de6ec5": "distribute(uint256,uint256,uint256)", +"d2de9989": "stopPreIoc()", +"d2df254c": "weiToUSD(uint256)", +"d2df9222": "recoverStockKey(bytes12)", +"d2df9cc1": "startTimeSaleNoBonus()", +"d2e013d9": "Execution(string,string,string,string,string,string)", +"d2e01b2f": "getLockPosition(address)", +"d2e0637b": "createContractTot(string)", +"d2e10879": "getReceiptRoot(uint256)", +"d2e1d201": "setstring(string,string)", +"d2e2acf5": "_proxyTransferEvent(uint256,uint256,uint256,bytes32)", +"d2e3646c": "optionsConverter()", +"d2e474b3": "PROMOTORS_POOL()", +"d2e73d78": "withdrawDepositorFunds(address,uint256)", +"d2e78ace": "DestructionContract()", +"d2e80494": "setConversionRate(uint256)", +"d2e81bf9": "initPlayer(address)", +"d2e8309e": "test_messageSenderEq()", +"d2e90d0f": "startTimeICO()", +"d2e91b85": "getset()", +"d2e9236b": "sendEthValue(address,bytes,uint256)", +"d2e9953a": "setAdmin(address,address,bool)", +"d2ea7f7f": "CreditDAOfund(address)", +"d2eb6483": "EVMDB()", +"d2ecb4f9": "initialAllocation()", +"d2ed2d30": "setWorst(uint8)", +"d2eda057": "checkBool(bool[])", +"d2eeead7": "PatrickTestCoin()", +"d2ef0669": "denyAccess(address,address)", +"d2ef3b0d": "getCreateShareTokenMarketValue()", +"d2ef7398": "challenge()", +"d2efeef3": "TradableTokens()", +"d2f03bf6": "registerWithETH(address)", +"d2f070b9": "email(address)", +"d2f0be99": "getRefund(uint256)", +"d2f1f189": "ICOAddress()", +"d2f1f712": "getVoters(uint128)", +"d2f27cf4": "setCelebrityPrice(uint256,uint256)", +"d2f28141": "calculateBonus(uint256,address)", +"d2f2d549": "CLPTestNetToken()", +"d2f32d94": "get_card()", +"d2f343c7": "timeWindow()", +"d2f3b963": "dateICOEnded()", +"d2f3ea43": "getPurchaseAmount(uint256)", +"d2f40cab": "getFunctioName()", +"d2f4a50a": "wallets()", +"d2f5e28b": "requestEthereumPrice(string,string)", +"d2f65fbc": "setMockBytes32(bytes4,bytes32)", +"d2f6f67d": "mintingContract()", +"d2f7265a": "exchange()", +"d2f7c5db": "GetDetail(address)", +"d2f7f377": "testRegisterNickWalletEth()", +"d2f80c15": "addDivisionJurisdiction(bytes32[],bool[])", +"d2f82026": "quickSortBids()", +"d2f8dd45": "Owned(address)", +"d2fa1f8b": "proxyPurchases(bytes32)", +"d2fa635e": "setMaxGasPrice(uint256)", +"d2fa9a67": "RESERVED_TOKENS_FOR_FURTHER_TECH_DEVELOPMENT()", +"d2fabaec": "VITToken()", +"d2faf216": "withdrawBuyer(address[2],uint256[7],uint8,bytes32[2])", +"d2fafb19": "setAmount(address,uint256)", +"d2fb32c2": "getGen0ObjInfo(uint64)", +"d2fb8787": "recordExists(bytes)", +"d2fbbc51": "ADVISORS_TOKENS_PERCENT()", +"d2fbd0ed": "payOrder(uint256,uint256)", +"d2ff5d4f": "allWETHbalances(address,address[])", +"d2ff8fd8": "ICOtokensSold()", +"d2ffca2d": "currentTotalExcess()", +"d2ffd541": "mintAdminCancel(address,address)", +"d30047bc": "firstPreSaleEndDate()", +"d3006dea": "ValueFinalized(bytes8)", +"d300746f": "pullTokensBack()", +"d300a034": "oraclize_query(string,bytes[])", +"d300a968": "isSecurityToken(address)", +"d3017193": "addUser(address,uint256)", +"d301c85f": "ownerAllocateTokensForList(address[],uint256[],uint256[])", +"d30272b8": "signAgency(uint256)", +"d302af4a": "isAirdropContract()", +"d302b0dc": "unFreeze(uint256)", +"d303b750": "Coupon(address,uint256,uint256)", +"d303e3b2": "checkMidiNoteValue(uint8)", +"d3050195": "_ownsRobot(address,uint256)", +"d305399d": "addToWhitelist(address,uint16,uint256)", +"d305577e": "GSSingle(uint256)", +"d305671a": "Dario(uint256,int256,uint256)", +"d3057859": "trade(uint8[2],bytes32[4],uint256[8],address[6])", +"d30592c6": "_trim(uint256[],uint256)", +"d3059c91": "maxTokensForCommand()", +"d305a45d": "requestDivident()", +"d3062b24": "getIndicesWithClaimableTokensForBuyers(address,address,address,uint256)", +"d3066879": "withdrawVestings(address)", +"d306967b": "TokenCreated(uint256,string,uint256,address)", +"d30792d4": "bonusesMapPos(bytes32)", +"d30796a2": "OwnerTransfer(address,address,uint256)", +"d307cd53": "_b4(string,uint256)", +"d3087ff5": "startOpenPpTime()", +"d3088b52": "transferWithMessageAndRequestAddress(address,uint256,address,bytes)", +"d3088b5f": "CesaireToken()", +"d30895e4": "player1()", +"d308cbe2": "withdrawMoneyByAdmin(uint256,address)", +"d30920c1": "contractTotalInvested()", +"d3098883": "memberFee()", +"d30a119b": "calculateBonusTokens(uint256)", +"d30a1325": "checkProposalExistence(string)", +"d30a512e": "betOnColumnOrDozen(bool,bool,bool)", +"d30a969a": "RemiCoin(uint256,string,string,uint8)", +"d30b5386": "payFee(bytes32,uint256,address)", +"d30bbde8": "checkWorkingInfra(uint256,uint256)", +"d30beffa": "unholdGold(address,uint256)", +"d30bf323": "setTaskRewardPaid(bytes32)", +"d30c0a64": "encodeUint(uint256)", +"d30cad77": "nextRoundDuration()", +"d30e2004": "setRegionUrl(uint256,uint8[128])", +"d30e268b": "saleTokensPerUnit()", +"d30e9302": "distributionTokens()", +"d30f945a": "setNewManager(address)", +"d30fa946": "fulfillDeliverable(bytes32)", +"d30fbd0d": "safeSubtract(uint256,uint256)", +"d30fc8a1": "FundsAdded(uint256)", +"d3100538": "YOLOCASH()", +"d3109af3": "drainWei()", +"d310bc32": "releaseName(string)", +"d3111d3f": "_getLockedAmount(address,address)", +"d3115524": "_bptc(uint256,uint256,uint256,uint256,address)", +"d3118a5a": "addDoc(string,string)", +"d3119dc0": "minEtherForAccounts()", +"d311b44d": "everyBidFee()", +"d312846b": "uniqueContributors()", +"d313f235": "terminateTokenSale()", +"d3140a65": "createOpenLockAndDraw(address,address,uint256)", +"d3146a46": "Claim_TRAC_9600()", +"d316e912": "deleteGrantee(address)", +"d3183864": "calculateMultiplierAfterBurn(address,uint256)", +"d3195184": "_canNowTransfer()", +"d3195c82": "refundTransactionAfterDisputeFee(uint256)", +"d319ab75": "getProposalContractor(uint16,uint16)", +"d31a8be1": "setCentsPerEther(uint256)", +"d31af484": "updateTokenUri(uint256,string)", +"d31b3320": "getUserTokenInfo(address)", +"d31c153c": "AllocateAgentChanged(address,bool)", +"d31cfed6": "initialMonthWithdraw(uint256)", +"d31d7b0a": "MoonCatRescue()", +"d31efc7e": "createHero(string,uint16,uint16,uint16)", +"d31f0f38": "RamenCoin()", +"d31fdffd": "setHammer(address)", +"d31feea1": "OpenLongevity()", +"d31ff13c": "changeContractOwner(address,string)", +"d320ac9a": "DonationDeposited4Matching(address,uint256)", +"d321fe29": "getAmount()", +"d3220144": "newPriceDecreaseRate(uint256,uint256)", +"d3226425": "DuMangoCoin()", +"d324191c": "Codexstandard()", +"d3251aa2": "setHelpCoinAddress(address)", +"d3257034": "AgriChainCultivation()", +"d3258b9e": "DevDorothyCoin()", +"d325c2e8": "revertPurchase(address)", +"d3261592": "dripRate()", +"d32632fd": "migrationGate()", +"d327523a": "getTotalNumberOfBoards()", +"d329ce51": "developer_cycle(address,uint256)", +"d32a7ee0": "updateLand(uint256,uint256,uint256,uint256)", +"d32a9cd9": "settle(bytes32,bytes32)", +"d32ab21d": "voteFor(uint8,uint8,uint8)", +"d32aba42": "getPresaleBonusAmount(uint256)", +"d32b1bea": "encodeAddress(address)", +"d32b607c": "sumElements(uint32[])", +"d32b8575": "_startAuction(uint256)", +"d32c943a": "resolveChallenge(bytes32)", +"d32cb0fe": "exercise()", +"d32cbabb": "Ast()", +"d32e245b": "getContributorRemainingCap(uint256)", +"d32e29de": "setApproveFee(uint256)", +"d32e48c0": "LockOpen(address)", +"d32ef1e5": "RhodonToken(address)", +"d3309a7e": "productTribe(string)", +"d3313802": "EtheraffleDisbursal(address)", +"d331aeb3": "getAllFiatTransactionsCount()", +"d331b696": "computeNameFuzzyHashET(string)", +"d33219b4": "timelock()", +"d333d7cf": "destroyShares(address,uint256)", +"d333ec79": "changeServiceAccount(address)", +"d334d75b": "expireLoan()", +"d3363dd7": "icoThresholdBonus3()", +"d3364687": "PRESALE_START()", +"d33656e0": "primaryOperator()", +"d336ac80": "getPersonInfo(uint256)", +"d337616e": "resetLottery()", +"d337b9c9": "myWeapons()", +"d337ce86": "addProject(uint256,string,address,uint256,uint256)", +"d337e72e": "EtherToken2()", +"d3382a55": "whitelistRate()", +"d3392545": "spawnItem(uint256,uint256,address)", +"d33abd33": "t_2nd_StageEnd()", +"d33b79d9": "addBallotAndVoterNoPk(bytes32)", +"d33c0a4d": "getMyCells()", +"d33c449f": "gesamtGuthaben()", +"d33ca02b": "externalCall(address,uint256,uint256,bytes)", +"d33cf9fa": "MultiSigMint(address)", +"d33d1aac": "getWeeklyTokensForWebsitesAmount()", +"d33d5f3e": "CLOSE_TIME()", +"d33d6732": "totalSupplyMintTransfer()", +"d33d6f65": "Delivery(address,uint256,uint256,int256,int256,int256,int256,address)", +"d33e1a48": "genRNGContractAddress()", +"d33ecfee": "setResume()", +"d3400a1d": "etherRatioForOwner()", +"d34047b6": "mint(address,string,bytes32)", +"d340ab41": "addInvestorBonusInTokens(address,uint256)", +"d340dd8a": "getCCH_edit_13()", +"d340e8f8": "setDistributionPercentage(uint256,uint256,uint256)", +"d341281a": "ALH()", +"d3418fb7": "capOfTotalSupply()", +"d3419bf3": "prices()", +"d3419d4e": "TokenAiContribution(address,address,address,address,address,address,address)", +"d341e052": "JoyGameDemo(address,address)", +"d342275e": "setProgress(uint256)", +"d342c598": "Bou(address)", +"d342e4f4": "runInOneDay()", +"d3437bd3": "ProofOfStableClone()", +"d3437fe0": "assertFact(uint256,bytes)", +"d3446856": "tournamentPaused()", +"d344e01b": "stopTransferToken()", +"d3451379": "updatePower(uint256)", +"d3456121": "amountInContract()", +"d3462259": "howManyTokens(uint256,address)", +"d346feb8": "changeCertBot(address)", +"d3471035": "KarmaToken()", +"d347c205": "transferableTokens(address,uint64)", +"d347de03": "setPlayerGeneralCd(uint64,uint32)", +"d3481bd0": "buyBlock(uint256,uint256)", +"d3484c1c": "TOKEN_SUPPLY_MAINSALE_LIMIT()", +"d348b409": "calculatePrice()", +"d348ee9a": "correctResult(int16)", +"d349f8b4": "MobileGoToken()", +"d34a280a": "setPreAmounts(uint256,uint256)", +"d34a412c": "switchRankings(uint16,uint8,uint64,uint64,uint64,uint64,uint64,uint64)", +"d34acd12": "functionCalls(uint256)", +"d34afaff": "getLatestIndex(address)", +"d34b1537": "minFundingReached()", +"d34b1aef": "returnUnsoldSafeLarge()", +"d34b2451": "BurritoPurchased(uint256,address,uint256)", +"d34b6cd3": "BBDToken(uint256,uint256,uint256,uint256)", +"d34b7e25": "checkWin(uint256[])", +"d34bb772": "EndsAtChanged(uint256)", +"d34be5be": "startVotingPrepare(address)", +"d34cc179": "updateDaoContract(address,string)", +"d34d8e43": "oracleItQuery(string,string,uint256,uint256)", +"d34dd1f0": "safeWithdrawal(address,uint256)", +"d34e4b20": "getWinnerHistory(uint256)", +"d34ed095": "getSoilTempException(bytes32)", +"d35066e6": "rsrvToSale(uint256)", +"d3511f82": "getRoundBetNumber(uint256,uint256,uint256)", +"d3516b7e": "setVote(uint256,bool)", +"d3525adf": "setMetadata(bytes32,bytes32)", +"d35262ef": "getInt256Min()", +"d3528d9b": "createBetAcrossDeposit(bytes16,bytes16,bytes16,bytes16,uint256,uint256)", +"d352a862": "ownerOfTwitterId(uint256)", +"d3535452": "buyPosition(address)", +"d353a1cb": "finish(uint256)", +"d3554dd5": "NieShichaoToken()", +"d35590c2": "sponsors(address)", +"d355f139": "requestBatchLoans(uint256)", +"d3565934": "YANG()", +"d3568560": "calcDates(uint256,uint256)", +"d356a28b": "addSERAPHIM(address)", +"d356a879": "removeAddressByIndex(uint256)", +"d357aa15": "raise2ndAppeal()", +"d357f0ce": "_checkPixelLeft(uint256)", +"d357ff87": "sweepRoundsActive(bool)", +"d359b0c7": "XeniaToken()", +"d359be70": "distributeExternal(uint256)", +"d359f82c": "updateExpiry(uint256)", +"d35ada32": "addParticipant(address,address)", +"d35b9d83": "codeAt(address)", +"d35bcf88": "addCET4(uint32,uint64,uint64,uint64,uint16,uint16,uint8,uint8,uint8)", +"d35c7372": "theCeiling(uint256,uint256)", +"d35c9a07": "withdrawProfit(address,uint256)", +"d35cf913": "mint_tokens(address,uint256)", +"d35d031e": "SellerChanged(address,address)", +"d35d90ba": "MPKToken()", +"d35e29d7": "mint(address,uint32)", +"d35e48e6": "PLBToken()", +"d35e6537": "IONIATOKEN()", +"d35e656b": "userNameTaken(string)", +"d35f0a16": "_getShares()", +"d35f4a99": "mint(int256,address,uint256)", +"d35fbbfb": "range(uint256,uint256,uint256)", +"d3604bc9": "yesContract()", +"d3614854": "getAdministratorETH()", +"d3617e7a": "MyToken(address)", +"d361ab64": "sendFreeTokens(address,uint256)", +"d3626d09": "getyestoday()", +"d3631e00": "refundUnconfirmed()", +"d3637c27": "icoArray(uint256)", +"d3650fb8": "approvers(uint256)", +"d365a08e": "masterAddress()", +"d365a3fb": "settleBet(uint256[],bytes32)", +"d366f83b": "allSidesPledgedAmount()", +"d366fbab": "startLottery(bytes32,uint256,uint256,uint256,uint256,bool)", +"d3670cb4": "BitcoinBlackToken()", +"d3671166": "PurchaseSuccessful(address,uint256)", +"d367a398": "NVTAddr()", +"d3695161": "deleteUser(string)", +"d369a744": "CCtestToken(address)", +"d36a1fa8": "ALKACOIN()", +"d36a35c9": "strikersBaseContract()", +"d36a8026": "Phoenix()", +"d36ae26b": "commBallotPriceWei()", +"d36afad5": "hasKey(address)", +"d36b96a9": "controllerFailed()", +"d36b9e64": "contributorsPeriodsElapsed()", +"d36bed21": "getGameAddressById(uint256)", +"d36bf8a1": "increaseWithdrawalChunk()", +"d36d9b19": "request_callback(uint8)", +"d36dbc0c": "addWineryOperation(string,string,string,uint256,uint16,string)", +"d36e0f39": "EIP20Token()", +"d36e9ac3": "burnUnused()", +"d36e9b2a": "RentalAgreement()", +"d36ef2cc": "PolicyPalNetworkCrowdsale(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"d36f0e9c": "etherForCharity()", +"d36f5c87": "stitch(int256,int256,bool)", +"d36f69eb": "getEthInCents()", +"d3701ff2": "TongToken()", +"d3707129": "_removeShareFromLastOwner(address,uint256,uint256)", +"d3708487": "setInfoAboveSpot(uint256)", +"d37194f5": "getTotalDepositsAmountLeft()", +"d371d551": "addAddressToCappedAddresses(address)", +"d372e3a0": "isCrydrViewAddress(address)", +"d3732642": "FastRealisticPyramid()", +"d373507b": "setAllowSell(bool)", +"d37360a0": "efw()", +"d3749a15": "user_contract()", +"d375b921": "orderUsable(address[8],uint256[6])", +"d3775371": "has_reading()", +"d377bc5f": "lockedMoney(bytes16)", +"d377dedd": "currentNiceGuy()", +"d378f4e0": "NOOR()", +"d37990ce": "setGenerationSeasonController(uint256)", +"d379be23": "claimer()", +"d37a9bb0": "restrictTransfers()", +"d37aff82": "changeStatus(uint8,bytes32)", +"d37b34d7": "blacklistAccount(address)", +"d37b8a96": "deploy(string,string,uint8,string,address)", +"d37cd1d9": "TalentCoin(address,uint256,string,uint256,string,uint256)", +"d37d753f": "spin(address,uint256)", +"d37fe6cb": "balanceOfWithoutUpdate(address)", +"d3807fa5": "NameChange(string)", +"d380e036": "marketDefaultFeeLow()", +"d3811c0f": "setMetadataBase(string)", +"d38159b8": "testPass()", +"d38185d3": "_buyXid(uint256,uint256,bytes32)", +"d381ba7c": "setRootUser(address,bool)", +"d381c67e": "isRentAuction()", +"d383b80d": "getCurrency(bytes32)", +"d383f646": "issue()", +"d384077d": "_closeProvider(address)", +"d384af87": "checkpopa()", +"d384d177": "haveCommonPrefixUntilZero(bytes32,bytes32)", +"d385293d": "confirmTokenTransferToBooking(bytes32,string,bytes32,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"d38537cf": "TimerAuction(string,uint256)", +"d385fac9": "bwin()", +"d38609f9": "unhaltFX()", +"d386130c": "Encrypt(uint256)", +"d38685ee": "unlockGlobalToken()", +"d3872d57": "getLandRevenue(uint256)", +"d387978d": "cancelled(address,bytes32)", +"d387c4c1": "getOwnedTokens(address,address)", +"d388089a": "getJobDetail(uint256)", +"d3884c3f": "removeService(bytes32)", +"d38875ec": "addDeal(uint256,uint256,string,string,uint256,string,bytes32)", +"d388e416": "getAccountReferalsStats(address)", +"d3890a43": "DaoCasinoToken(uint256,uint256,uint256,address)", +"d3895c91": "changeConversionRate(uint256)", +"d38ac5ac": "WayBackToken()", +"d38bd9f0": "newTokenOwner()", +"d38bee56": "PlaceSell(address,address,uint256,uint256,uint256)", +"d38bfff4": "transferGovernance(address)", +"d38c3253": "ownerSelfDestruct()", +"d38c4cca": "removeFromTokenTransferDisallowedAddresses(address)", +"d38cba4b": "paymentRewardTokensPriority(uint256,uint256)", +"d38d0f28": "updateSplit(uint256)", +"d38e5ab7": "TransferDisable()", +"d38eb9d3": "escrowFrom(address,uint256)", +"d38f3b68": "getMedications()", +"d38fe43f": "setMembershipContract(address)", +"d390021d": "getLastTimeUpdated()", +"d390e819": "disableDonationContract()", +"d391014b": "ROLE_ADMIN()", +"d391a970": "removeFromOwnedTokens(address,uint256)", +"d391ce7a": "CrowdsaleContract()", +"d3927c15": "reimburse()", +"d392c5a2": "getNumOptionChains()", +"d3933154": "MYL(uint256,string,string)", +"d393c871": "register(string,address,uint256)", +"d393cde5": "wholeLineWrong()", +"d393f628": "changeDemurringFeeOwner(address)", +"d3943976": "getSGCUsers(address)", +"d3943ab4": "setIntArr(uint256,uint256)", +"d3943c83": "numberOfWithdrawls()", +"d3946ea4": "manuallyEndAuction()", +"d394a12e": "secondPresaleStart()", +"d39502bb": "AIBITTECH()", +"d3953822": "getThisAddress()", +"d395ee0f": "setQuickBuyPath(address[])", +"d3962239": "getCustomerPassword(address)", +"d3964ca1": "operationsEthWallet()", +"d397e9e4": "getDisputeCrowdsourcer()", +"d397f861": "TRAC_Tokens_left()", +"d3980d87": "ReferenceToken(string,string,uint256,address[],address)", +"d398806d": "updateMinJump(uint256)", +"d399354b": "KYC_USD_LMT()", +"d39aa15c": "_getTransferFeeAmount(address,address,uint256)", +"d39b0cbb": "Start10()", +"d39b1d48": "setDistributeAmount(uint256)", +"d39b7e4f": "setBPAddress(address)", +"d39bbf06": "MAX_INVESTOR()", +"d39c7880": "setAddressOfERC20Token(address)", +"d39c9afd": "OwnerKill()", +"d39cb111": "getShortId(bytes32)", +"d39cce1c": "calculateSaleReturn(uint256,uint256,uint16,uint256)", +"d39ce83a": "paymentMixed(uint256,uint256,uint256)", +"d39cee11": "benchTransfer(address[],uint256[])", +"d39d8fce": "presaleStart_6_December()", +"d39de6e9": "getAuthorizedAddresses()", +"d39e4607": "LogIcoCompleted()", +"d39eb301": "getStatus(uint8,uint8)", +"d39ebe2c": "setup(uint8,uint8)", +"d39ec1fe": "currentTethers(address,uint256)", +"d39f4149": "fxpMul(uint256,uint256,uint256)", +"d39f532d": "SafeGift(uint256,string,string)", +"d3a057c8": "isConfigured()", +"d3a05872": "AutoFareCalculator()", +"d3a0d0ab": "RTokenBase(uint256,string,string,uint8,bool)", +"d3a2d050": "addData(uint256[])", +"d3a3086e": "ActorCoin()", +"d3a39686": "getAddress(bytes32,bytes32)", +"d3a516d3": "viewSuperOwner()", +"d3a56ec3": "processRequest(uint256,uint256,uint256)", +"d3a5768b": "RoundWinner(address,uint256)", +"d3a57b9f": "showRdWonNum(uint256)", +"d3a5dcb0": "EQUITRADER()", +"d3a60bd5": "Exchange(address,uint256,uint256,uint256,address,address)", +"d3a61150": "setDatabaseDownloadUrl(string)", +"d3a699cd": "PePaDe()", +"d3a6be66": "donotXXXDappToken()", +"d3a6c234": "benWallet()", +"d3a70dba": "getReaderId(bytes32)", +"d3a73d12": "modifyLevelCaps(uint256[])", +"d3a85394": "currentPeriodTokenCollected()", +"d3a86386": "minimumBid()", +"d3a871e9": "REELToken()", +"d3a9187e": "mintTemplate(uint256,int256,uint256,uint256,uint256,string)", +"d3a99388": "JcashUpgradeableToken(address)", +"d3aa22c7": "transferTLA(string,address)", +"d3aa831f": "testOwnedTryAuth()", +"d3aceae2": "_balance(address)", +"d3ae2814": "LogTokensFrozen(bool)", +"d3aefeeb": "pauseUnpauseICO()", +"d3af4dc7": "processRequest(uint256,uint256)", +"d3b0d9eb": "refundFunds(address)", +"d3b15dd6": "Millet()", +"d3b19ee1": "dislike_trackable(address)", +"d3b234fc": "getAttoTokensToBeFounder()", +"d3b246d0": "upgradeEvilMorty()", +"d3b25696": "tradeIntentOf()", +"d3b302e7": "applyForMembership(string)", +"d3b3809c": "EscrowGoods(address,uint256,uint256,uint256,uint16,uint256)", +"d3b3eccb": "isARTDistributed()", +"d3b4be21": "Obtener_Reputacion(address)", +"d3b5305c": "setAgriChainDistribution(address)", +"d3b5695c": "setOraclizeCallbackGasLimit(uint256)", +"d3b58024": "RepeatCustomerToken()", +"d3b5c016": "submitSolution(uint256,string)", +"d3b5dc3b": "precision()", +"d3b6486a": "setLeastFund(uint256)", +"d3b6664a": "purchaseTrophy(uint256)", +"d3b6ac97": "defenceElementBySubtypeIndex(uint256)", +"d3b6fbc2": "MOVIECREDITS()", +"d3b7576c": "update(uint256,bytes32)", +"d3b7bcf1": "preAllocation()", +"d3b7bfb4": "fundingAddress()", +"d3b7ef5e": "SCE(uint256,string,string)", +"d3ba95ce": "throwsWhenFinalizingIfNotMultisig()", +"d3bac6e3": "coordinatorAccountCount()", +"d3bbb2c8": "b13ToBytes(bytes13)", +"d3bc89b7": "GetGuestTokenNo()", +"d3bc9aca": "addCourse(uint256,string,uint256,uint256,string,string)", +"d3bca884": "addBalance(address,address,uint256)", +"d3bced2c": "withdrawBotFee(uint256)", +"d3bd5a4b": "resetUserPromoBonus(address)", +"d3bd6e23": "newUpdater(address,address)", +"d3bd7713": "setCapAtDuration(uint256)", +"d3bdbd8f": "editMilestone(uint256,uint256,uint256,uint256,uint256,string)", +"d3bdd242": "isMovingEnable()", +"d3bf0ce6": "AAP()", +"d3bfe76a": "revokeApproval(address,address)", +"d3c0715b": "vote(uint256,bool,string)", +"d3c13c25": "GCOXAPLToken(string,string,uint8,uint256)", +"d3c18378": "getPlayersBalance(address)", +"d3c1c838": "batchTransfer(address[])", +"d3c2a592": "claimAsset(uint256)", +"d3c33c52": "ipc()", +"d3c4055d": "VITE()", +"d3c41dae": "FindCourseBaseOnIdStudent(uint256)", +"d3c564ad": "tokenZLT()", +"d3c567c1": "cancelVoteForCandidateByStage(address,uint256,uint256)", +"d3c5ea45": "ICO_PHASE3_PERIOD()", +"d3c62676": "MiamiToken()", +"d3c65384": "ContributedAmount()", +"d3c65737": "sumICOStage4USD()", +"d3c683e5": "LOG_FailedDraw(address,uint256)", +"d3c6a6d6": "getWitnessCount()", +"d3c764f2": "buyPixelBlock(uint256,uint256,uint256,bytes32)", +"d3c78097": "startDistribuion()", +"d3c7adf9": "JimatCoin()", +"d3c7c2c7": "getSupportedTokens()", +"d3c7ca2f": "Allinone()", +"d3c8dd69": "Parent()", +"d3c8e99e": "_shareDiscountPrice(uint256,address)", +"d3c9ad17": "REBALANCE()", +"d3c9cc26": "getTokens(uint256)", +"d3caee1b": "currencyToToken(address,bytes16,uint256,bytes)", +"d3cc0c37": "batchVote(address,address[],uint256[])", +"d3cc8d1c": "claimTokensFromSeveralAuctionsAsBuyer(address[],address[],uint256[],address)", +"d3cce1d2": "setOldContractData(address)", +"d3cd6052": "getProposalCount(bytes32)", +"d3cdb97b": "partIndexToOwner(uint256)", +"d3cde1a5": "updateReferral(address,uint256)", +"d3cde1c0": "getIndexAndCheckIfAllowedToPublish(uint256,uint256)", +"d3cdf6c5": "calculateTokenAmount(uint256,uint8)", +"d3ce71df": "buyCozy(uint256,uint256,bool,address)", +"d3ce77fe": "destroyTokens(address,uint256)", +"d3cea787": "setContractServerBlackWhiteListType(string,uint256)", +"d3cecc4d": "checkVestingCondition(address)", +"d3cedfee": "sspCount()", +"d3d10d87": "OwnerChanged(bytes32,address)", +"d3d18836": "publicLock(address,uint256)", +"d3d19965": "deleteCroupier(address)", +"d3d2172e": "total_reward()", +"d3d37a31": "setSaleCap(uint256)", +"d3d3b01c": "ToRent(uint256,uint256,uint256,address)", +"d3d3d412": "getGateAddress(address)", +"d3d3dd85": "updateHpbBallotAddress(address,address)", +"d3d43efa": "returnLoanStatus(uint256)", +"d3d44e8b": "getBlockCount(uint256,uint256,bytes32)", +"d3d54129": "setPCAddress(address)", +"d3d55493": "calculateRefundAmount(uint256,uint256)", +"d3d6a975": "testThrowsTransferNotEnabled()", +"d3d70c3c": "setPrivelegedWallet(address)", +"d3d77f98": "setCoeff(uint8,uint128,uint8,bytes32,bytes32)", +"d3d864f5": "isFundingOpen()", +"d3d8aa55": "IG()", +"d3d8acf8": "checkMyVestingPeriod()", +"d3d9e741": "SuperCoin()", +"d3da927f": "isRegistered(address,address)", +"d3daa8aa": "EtheremonPayment(address,address,address,address,address)", +"d3db2371": "DHCSToken()", +"d3dbc861": "Initiate()", +"d3dc9794": "pendingTxs()", +"d3dcc175": "devTeam()", +"d3dccb03": "ERC20Token(string,string,uint8,uint256,address,uint256,address[],uint256[])", +"d3dcd55a": "calcTokensFromEth(uint256)", +"d3dd9a18": "addManyAuthorizeToWhitelist(address[])", +"d3ddebce": "STATE_BET_DISABLED()", +"d3de5834": "disableFeesForUser(address,uint256)", +"d3deedfd": "MANHATTANPROXY2NDST()", +"d3df2d01": "maxUsdFundingReached()", +"d3e00f4b": "stampBirth(uint256,address)", +"d3e0996a": "checkProductGenuine(address,address,uint256)", +"d3e141e0": "left5(uint256)", +"d3e15747": "setLock(uint256)", +"d3e212c5": "bidExchange(uint256,uint256)", +"d3e242c2": "_confirmTransaction(uint256,address)", +"d3e2846a": "LINKFund()", +"d3e3623b": "earlyBackersAmountLeft()", +"d3e65414": "contributedToken(address)", +"d3e65b6c": "buyTicketByOther(uint256,bytes32,bytes32,bytes32)", +"d3e66a9e": "startCompetition()", +"d3e6dda7": "removeFound(address)", +"d3e6f49f": "isReadyToBreed(uint256)", +"d3e73312": "allocatedFounders()", +"d3e7d44d": "tokensBurnedTotal()", +"d3e82be8": "getMinPrivateSaleBuy()", +"d3e837cb": "setChecksOn(bool)", +"d3e848f1": "systemAddress()", +"d3e89483": "policies(uint256)", +"d3e8b207": "distributeWithLockup(address,uint256,uint256,uint256)", +"d3e91a98": "destroyAllTokens(address)", +"d3ea3322": "testBuildTokenSystemCost()", +"d3eb11d6": "payoutsWallet()", +"d3eb667e": "BigBoobsToken()", +"d3eb6f61": "isGoalReached()", +"d3ebd2dc": "transferFron(address,address,uint256)", +"d3ebf454": "LotteryRoundDraw(address,bytes4)", +"d3ecb95f": "wc()", +"d3ed0ea2": "setAuthor(uint256,string)", +"d3edcb0a": "_wholeToken(address)", +"d3edcb5b": "getCreditorAddresses()", +"d3ee86e7": "mmax(uint128,uint128)", +"d3eee5ad": "lockForDays(uint256,uint256)", +"d3efa856": "CreditBIT()", +"d3efbd7f": "freezeContract(bool,uint256,uint8[],bytes32[],bytes32[])", +"d3f01fbd": "calcToken()", +"d3f045d2": "Player(address,uint32,uint32,uint32,uint32,uint256,uint256)", +"d3f06def": "uploadFile(uint256,uint256,bytes32,bytes32[],bytes32[],uint256)", +"d3f16925": "setDevLimit(uint256)", +"d3f189bd": "COMMUNITY_ADDRESS()", +"d3f1a78c": "updateDelayTime(uint256)", +"d3f1fbd7": "updateLastMiningTime(uint256)", +"d3f233af": "burnOf(address,uint256)", +"d3f297d6": "claimLiquidityReward()", +"d3f2b996": "PTH(uint256,string,uint8,string)", +"d3f2e7cf": "runningRound()", +"d3f3bea2": "distributionRealized()", +"d3f40a02": "denyAccess(uint256,uint256)", +"d3f4fcd9": "claimInitialAllotment(string,string)", +"d3f574e7": "testToUint128()", +"d3f60667": "trackBuyBack(uint256,uint256)", +"d3f60d9c": "startTimeRound2()", +"d3f6a157": "setWallets(address,address)", +"d3f6be9f": "LogDeposit(address)", +"d3f6c328": "AMOCoin(address)", +"d3f6dc52": "oracleItQuery(string,string,string)", +"d3f71ecc": "checkIsOnSale(uint256)", +"d3f73bd4": "getOwnerCEO()", +"d3f8868b": "getFrequency(uint256)", +"d3f8cc95": "exhaustAfterFusion(uint256,uint256,uint256)", +"d3f92288": "WhiteList()", +"d3f9ba69": "processOneCombat(uint32,uint32)", +"d3f9fc33": "ownerRecoverTokens(address,uint256)", +"d3faaeca": "softCapInTokens()", +"d3fbf39d": "mintNFTNotForSale(uint256,string)", +"d3fc310a": "_addExtraReceiver(address)", +"d3fc9864": "mint(address,uint256,string)", +"d3fd311e": "trading_deactivated()", +"d3fd9eba": "transferAuction(address,address,uint256)", +"d3fe1ae1": "updateMember(address,uint256,uint256,uint256)", +"d3ff09a5": "setTotalTaskEscrow(uint256)", +"d40027ec": "lockoutPeriod()", +"d401defe": "getBasicInfo(address)", +"d40224ec": "triggerSale(bool)", +"d402be57": "calcMode()", +"d402f87c": "setTotalProfit(address,uint256)", +"d4030114": "tableSize()", +"d40394be": "batchAddWhitelistedTransfer(address[])", +"d404d6c2": "pushEther()", +"d404ea23": "hashKey()", +"d405a069": "grantInitialAllocations()", +"d405d6f4": "Chally()", +"d40619b8": "getUsersScannersIds()", +"d4065763": "returnRemainingMoney()", +"d406e403": "test_startBlock()", +"d407d212": "claimJ()", +"d408746a": "GetContractAddr()", +"d4088e33": "setPrice(uint256,uint256,uint64)", +"d4092dd2": "getPOOL_edit_29()", +"d409a12c": "Kcoin()", +"d409ddda": "EtherizationUtils()", +"d40a71fb": "step1()", +"d40b9d9a": "OwnerHeartbeated(address)", +"d40c0a58": "saveTeamSpent(address,uint256)", +"d40c3084": "fundValues()", +"d40d4d76": "etherToSendBankRoll()", +"d40dc870": "MAX_AMOUNT()", +"d40e35da": "Interest_Rate()", +"d40e985d": "decompose(uint256)", +"d40e9b9c": "rakeEventPlaceholderAddress()", +"d40fa8bf": "ZRX()", +"d40fd402": "salarySent()", +"d41097e3": "disbandTo(address)", +"d4112c56": "changeUtilityAccount(address)", +"d41212c8": "_insertTokenMetadata(uint256,string)", +"d41376e1": "withdrawl(address,address,bytes32)", +"d4138673": "IkuraTransferToken(address,address,uint256)", +"d413bd66": "OfflineMultiSig(address,address,address[],uint256)", +"d414da2a": "addPatternUserIndex(address,bytes32)", +"d4155d1f": "getJuror(address)", +"d41584ab": "LogCertifierRemoved(address)", +"d416c997": "_stringsEqual(string)", +"d416d1a6": "lastInvestorPaidOut(uint256)", +"d416d4f3": "Balance(address,address)", +"d416efdb": "donationTo(address)", +"d417f18d": "getTopicNameAndVotesAt(uint256)", +"d4186ba4": "test_oneValidEqInt3()", +"d41977cd": "contractFee()", +"d419ef9f": "WinToken(address)", +"d41b6853": "enter(address,uint256,uint8,uint8,uint8,uint32[11])", +"d41bcb81": "phaseEndTime(uint256)", +"d41bdea7": "unlock(bytes32,bytes32,bytes32)", +"d41be98d": "createDebtToken(string,string,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"d41c85fa": "__redeem()", +"d41cc314": "EventUpgradeTank(address,uint32,uint8)", +"d41d661e": "remOne(address)", +"d41ded30": "encodeLength(uint256,uint256)", +"d41e3281": "DocumentManager()", +"d4200f94": "setCreditBitContract(address)", +"d4203561": "transferFee(uint256)", +"d420e4e0": "BCaaS()", +"d420e527": "BuyLimitsCrowdsale(uint256,uint256)", +"d4212e93": "storeInitialClaim(address,uint16[],uint256,bool)", +"d4214d1b": "releaseUnclaimedBounty(address)", +"d42151b0": "FFCTToken()", +"d4229b1a": "appBase(bytes32)", +"d422cf58": "numLocks()", +"d422e4e0": "takeFee(address,uint256,string)", +"d422e810": "exchange_commission_wallet()", +"d423740b": "setter(uint256)", +"d423754b": "removeFactProviderFromWhitelist(address,address)", +"d4245e5b": "transferringETH(address)", +"d424f628": "fundingGoalReached()", +"d425bd91": "calculateDepositInfoWitnessHash(uint256[])", +"d4264af0": "mintTo(address,bytes32,string,uint256)", +"d4269986": "getPuzzle(uint8)", +"d426b04e": "largeContribThreshold()", +"d426bb47": "allocateForPrivateSale(uint256)", +"d42706bd": "Batix()", +"d4270d60": "recall()", +"d427ccbf": "getEventAddress()", +"d427ce74": "getBylawsProjectDevelopmentStart()", +"d428bf3b": "SetdivForPrice(uint256)", +"d4291e0c": "num_hosts()", +"d429bfae": "currentTokenOffered()", +"d42a5011": "setPackLimit(uint16)", +"d42a9dd5": "ICO_PHASE1_PERIOD()", +"d42aa2f6": "getHealth(uint8[176],uint8)", +"d42ad6ea": "getMinAuditPriceMin()", +"d42b31b9": "_DeclineInsurance()", +"d42bd8a4": "receivedUETreturn(address,uint256)", +"d42bf301": "doTriggerTryAuth()", +"d42c334e": "DepositMasterContract(address)", +"d42cc0d1": "Planetagro_Exchange(address)", +"d42cda15": "getOnMintTargetValue(int256)", +"d42cfc41": "transferFeeDenominator()", +"d42d24fc": "auditContract()", +"d42d4c10": "PASSToken()", +"d42d8eed": "tag(address,uint256)", +"d42db190": "versionAddresses(bytes32,bytes32,address)", +"d42dca55": "getAuditors(uint256)", +"d42e26f5": "initializePresaleFundraiser(uint256,uint256,uint256,uint256)", +"d42e87ed": "callOnSignUp()", +"d42ed758": "MixManager()", +"d42eeb4f": "EtherDrugs()", +"d4300225": "publicGetBalance(address)", +"d430381b": "mayorCutPercentage()", +"d4313945": "setProviderInvitedUser(uint256,address,bool)", +"d431b1ac": "setPause()", +"d431ba8e": "lastBlock_v8()", +"d432a885": "withdrawedFoundationCounter()", +"d4331c21": "setSubTourFreezingTime(uint64)", +"d4332f50": "changeBPaddress(address)", +"d4335bd2": "getSevenCount()", +"d433ea6a": "CueCrypto()", +"d4346010": "verifiedTransferFrom(address,address,uint256,uint256,uint256,uint256)", +"d43503ab": "Sunset()", +"d4357107": "address_to_tokens_prev_week1(address)", +"d43582c8": "removeNOSPackage(uint256)", +"d4365b4b": "Weaver()", +"d436b6e2": "EtherAdvance()", +"d4371968": "MAX_IMMORTALS()", +"d4384156": "UbexToken(uint256)", +"d438fdbd": "offlineSales(uint256,uint256)", +"d439390c": "MIN_PURCHASE()", +"d43948ee": "transferGainedEther()", +"d439ef55": "distributionMinimum()", +"d43a0b4c": "hodlerTotalValue9M()", +"d43a7c16": "finalizePrivateIco()", +"d43c3bb9": "getData_30()", +"d43c45b8": "withdrawSurprisePot(address)", +"d43c5a4a": "setTeamVault(address,address,uint64)", +"d43ea9e1": "levelTwoTokenNum()", +"d43ef6b9": "__mulmod(bytes,bytes,bytes)", +"d43f24b0": "removeApprovedContractAddress(address)", +"d43fb152": "isMilistoneSubmited(bytes32)", +"d4403495": "OWN_mintToken(uint256)", +"d440c6f3": "getWorkerAffectation(address)", +"d441ea62": "CleanBankerProfit(uint8)", +"d4430bc7": "tokenSaleOngoing()", +"d443173d": "requestUnFreezeAccount(address,string)", +"d4434387": "PolyCompliance()", +"d443f64a": "Start_Resume_PreICO()", +"d443fc85": "acceptGuardianVend(uint256)", +"d4440991": "callTransfer(address,uint256)", +"d44512e3": "changePrestige(address)", +"d445afdc": "week1Price()", +"d445cc78": "unfreezeTransfer()", +"d44750f5": "bonus_price()", +"d448273c": "mineForMany(address[],bytes32[])", +"d4483263": "secondRoundMayStart()", +"d4492c57": "addInvestorGrant(address,uint256,uint256,uint256)", +"d449844d": "XbitfwdToken()", +"d449a832": "decimals(address)", +"d449ce7c": "Administered()", +"d44a2863": "changeBooking(string,uint256[],uint256,address,bytes32)", +"d44aadf7": "initROS()", +"d44aecb0": "ico1_startdate()", +"d44b01ec": "safeWithdrawERC721(address,uint256,address,address)", +"d44bc088": "getTaskId(uint256)", +"d44cf3dc": "_setPriceFactor(uint256,uint256)", +"d44d159d": "mintWithBase(address,uint256,uint256)", +"d44d3394": "WIDTH()", +"d44dbbaf": "addStringComparison(bytes32,bytes32,bytes1)", +"d44dd681": "beginLiquidation()", +"d44f2d3d": "getInitialWithdrawalDone()", +"d45036c7": "viewTeamTokens()", +"d4508698": "driveCar()", +"d4524c72": "manualEtherWithdraw()", +"d45294f5": "charityAmtToCharity()", +"d45318b9": "scoringDuration()", +"d4538051": "_emitHolderAddressAdded(bytes32,address,uint256)", +"d4540ca7": "isDeployerOrOperator()", +"d454f92e": "mNumVoters()", +"d4550efd": "addEngineerQuest(address)", +"d455b973": "changeStageBlock()", +"d4565916": "activateproduct(uint256)", +"d45769b8": "N2Contract()", +"d4582b56": "Token(string,uint8,string)", +"d4589835": "sellMorties()", +"d4589e99": "assertDowntime()", +"d458c522": "participantCapTier1()", +"d459197b": "distributeALCTokenBatch(uint256)", +"d4595aaa": "blockExpiration()", +"d459654a": "techSupport()", +"d45973f4": "turretElementBySubtypeIndex(uint256)", +"d4597aa1": "tokenFrozenUntilTime()", +"d459fc46": "SetCheckpoint(uint256,bytes32,bytes32,uint64,uint8[],bytes32[],bytes32[])", +"d45a717e": "topGoodsId()", +"d45b1ae4": "StandardGasPriceLimit(uint256)", +"d45b5f71": "getIcoStep(uint256)", +"d45baeab": "Deposit(uint8)", +"d45bcac1": "listAddresses(address[],uint256[],uint256[])", +"d45c1b06": "Bank(string)", +"d45c241c": "minBonus()", +"d45c4435": "getTimestamp(bytes32)", +"d45e09c1": "canTransfer(address,uint256)", +"d45efad5": "getAccessControl(address,address,uint8)", +"d4607048": "buyForEverybody()", +"d461518c": "p_setGameDuration(uint256)", +"d4616967": "deployCode(bytes)", +"d4620041": "getFirstRoundReleaseTime()", +"d4625a3a": "equals()", +"d4629ae7": "ddftFund()", +"d46300fd": "getA()", +"d4631019": "_startCounter()", +"d4638401": "oneImpInWei()", +"d4638fea": "operatorRedeemByTranche(bytes32,address,uint256,bytes,bytes)", +"d463ca18": "findSsp(address)", +"d463eeb3": "numLoans()", +"d464520c": "PowX()", +"d4649fde": "expire(uint256,uint8,bytes32,bytes32,bytes32)", +"d4653a3b": "EXToken()", +"d465abca": "notInArray(address)", +"d465c392": "revealProofOfPerfBlock(uint32,string,bytes32,bytes16,bytes32,bytes16,bytes32,bytes32)", +"d466a03f": "citizensAmounts(uint256)", +"d466a046": "LogBidExpired(bytes32)", +"d466ab6b": "ROLE_BOUNCER()", +"d467cc00": "calculateRate(uint256,uint256)", +"d467cc64": "DoubleOrNothingImpl()", +"d4683f6d": "ArticCoin(uint256,string,string)", +"d4686534": "LYNIA()", +"d46a005a": "addWhiteListUser(address,uint256,uint256)", +"d46a5d7e": "vote(uint256,bool,uint256)", +"d46aa610": "buyInMarket(uint256)", +"d46b2987": "Luvtoken()", +"d46b9b84": "lifeN(uint256)", +"d46ba0c9": "etherRaisedPerWallet(address)", +"d46c0f40": "finishPrivatePlacement()", +"d46cddd4": "capPresale()", +"d46d0393": "getNextRegionId()", +"d46d0a22": "setV_S(uint256)", +"d46d79bb": "withdrawAllEth(address)", +"d46dbca1": "developerTemplateAmountLimit()", +"d46dd5bb": "showCurrentWinner()", +"d46ea4a4": "EXP_18()", +"d46eb119": "wrap()", +"d46f8eb1": "getSource(string,string,string,string)", +"d46ff2f1": "getTweetsDiff(uint256)", +"d470097c": "lastLargestHODLER()", +"d4701c35": "activate_kill_switch(string)", +"d4702576": "calculateTokens(uint256,uint256,uint256)", +"d4717240": "setkeytoken(address)", +"d4724a57": "TokenTransferForFounder(address,uint256,address,address)", +"d472d6bf": "get_token_balance(address)", +"d472fa26": "lockTokenToDate(address,uint256,uint256)", +"d472fe7e": "totalTokensICO1()", +"d4735d92": "Transfer(bytes32,address)", +"d4737d11": "setSampleRegistry(address)", +"d47380e0": "_mintToken(address,uint256,uint256,string)", +"d4740b78": "getAmountWeekly(uint32)", +"d4747f0a": "IQC()", +"d474a352": "submitBlockHeader(bytes,uint256)", +"d47510c0": "UNICORN_ID()", +"d475526f": "numActiveGames()", +"d475b1ab": "phase5Price()", +"d475bfa8": "proxyClaimTokens(address,address)", +"d47637f7": "getLittafiContent(bytes32,uint256)", +"d476620b": "winnerKey()", +"d476758f": "extractablePercentage()", +"d4768994": "soldIdeaWeiPostIco()", +"d477e3d4": "checkAddERC20(address)", +"d477f05f": "setDev(address)", +"d47875d0": "getScore(address)", +"d4788cc3": "HGT_Reserve()", +"d478f533": "allowFreezing(address)", +"d4793a9b": "getNextGuessId()", +"d4798327": "getPendingBattleRewardsCount(address)", +"d47a2010": "bnbRaised()", +"d47b44c3": "Fool()", +"d47bb75c": "TOKENERC20(uint256,string,string)", +"d47c0fb0": "onIncome()", +"d47c9e11": "eastadsCREDITS()", +"d47cc085": "sameNum()", +"d47cc9d7": "start_the_race()", +"d47cf598": "setDayThird()", +"d47d3202": "releaseINATokenToTeam()", +"d47d5cfe": "swarmTree()", +"d47d996e": "addCrowdSale(uint256)", +"d47dbde2": "buyerFundRelease(uint256,address)", +"d47e813d": "SteveCoin()", +"d47e81eb": "blockSettlement(uint64,uint64)", +"d47eb8ee": "validCall(uint256,bytes)", +"d47eca0a": "checkDiv()", +"d47ee6c1": "numberOfLeaderboardPlayers()", +"d47f269e": "getHand(uint256)", +"d4807fb2": "initializeRound()", +"d4810b61": "PRE_ICO_START()", +"d48210bc": "perValue()", +"d4821432": "endICOStage8()", +"d4849a8b": "newEthBackedLoan(uint32)", +"d484a285": "PRE_ICO_SLGN_LESS()", +"d48599e3": "setdrawadm(address)", +"d4859dbc": "UniversalFunctionSecure(uint8,bytes32,bytes32,bytes32,bytes32,bytes32)", +"d4859dc5": "disableManager(address)", +"d48675f3": "minGoal()", +"d4867694": "updateship(uint256,uint256)", +"d48684d8": "changeLimit(uint256,uint256)", +"d4868c32": "tokenReserved3Deposit()", +"d486d129": "releaseVesting(address)", +"d4871517": "BTCLotto(address,uint256)", +"d487758a": "forgive(uint16,uint32)", +"d4878cac": "_transferChild(address,address,uint256)", +"d487b21a": "assets_controller()", +"d4884b56": "getEventEnd()", +"d4897729": "getCET4InfoById(uint32)", +"d489a018": "adminAddWorldBalance()", +"d489b701": "starEthRate()", +"d489b83f": "teamOneShares()", +"d489c0bf": "getBuyCount(address)", +"d489e180": "getPendingPartCrateLength()", +"d489fc8b": "_useOraclize()", +"d48a1f6e": "returnPurchasedEther()", +"d48a9340": "SaveCryptoToken()", +"d48b2e92": "Identify()", +"d48b55e5": "calculateTokenOnlySellPrice(uint256)", +"d48b7a9d": "CryptoMyWord()", +"d48bb321": "next(bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,bytes4,uint256)", +"d48bfca7": "addToken(address)", +"d48c4193": "addWhitelistedTransfer(address,address)", +"d48d02f6": "withinLimits(uint256)", +"d48e638a": "getCreator(uint256)", +"d48e6a1b": "TEAM_TOKENS_PERCENT()", +"d48e9cd5": "OMG()", +"d48ea599": "getBeneficiaryByTime(address,uint256)", +"d48f08e5": "disableRegulator(address)", +"d48f7196": "numHodlers()", +"d48fb85c": "FIVE_YEAR_KEEPING()", +"d48fe280": "OK()", +"d4912ab1": "SNTPlaceHolderMock(address,address,address,address)", +"d491461a": "Gnosis()", +"d492283f": "switchLock(bool)", +"d4923d4e": "getUserVote(address)", +"d493b9ac": "transferAnyERC20Token(address,address,uint256)", +"d494c388": "setMinBuyAmount(uint256)", +"d49620ec": "RoundFinalized(uint256)", +"d49636c2": "san()", +"d496a4f1": "cashBackVotes()", +"d496bde4": "mainSaleTime()", +"d496f9d2": "PlayReferred(uint8,uint8,uint8,uint8,address)", +"d4971613": "HashBounty()", +"d49758d6": "use_bounty_token(address,uint256)", +"d4975d71": "changeVoter(address,address,string)", +"d4981928": "WorkOrder(uint256,address,address,address,address,uint256,string,address,address)", +"d499555b": "getFirstActiveDuel()", +"d49982cc": "sendPreSaleBonusMany(address[])", +"d499b2c3": "pks(uint256)", +"d49ab244": "ICOWhitelisted(address)", +"d49ad161": "addTokenDetails(uint256,address[],uint256[],uint256[],uint256[])", +"d49c51b7": "claimedMK(address)", +"d49ce78d": "WiggaToken()", +"d49d1836": "openegg(uint256,uint256)", +"d49d1bac": "transferERC223(uint256,address,address,uint256,bytes)", +"d49d5181": "MAX()", +"d49dbb5c": "minBalanceToSell()", +"d49dd9a8": "getStateofContract()", +"d49dd9e4": "SonnetCoin()", +"d49edbd8": "lastPrizeGiven()", +"d4a03f60": "acceptAdoptionRequest(bytes5)", +"d4a04ff4": "importFromOld(address,address,address,address,address[],uint256[])", +"d4a226c3": "bountyManagerDistributionContract()", +"d4a2498d": "addData(string)", +"d4a24f06": "checkPermissions()", +"d4a28823": "EOSSale(uint256,uint128,uint256,uint256,uint128,string)", +"d4a2f3ca": "getShipAuctionEntity(uint32)", +"d4a34564": "start3BonusPeriod3()", +"d4a34a9e": "tokenDecimalsLeft()", +"d4a3e9d7": "capture()", +"d4a436cc": "_countBits(uint256)", +"d4a4513e": "fpct_packet_size()", +"d4a61d61": "OnlineCasinoCoin()", +"d4a631ab": "ContractLogEvent(int256,int256,uint256,string,string)", +"d4a67930": "openBuy()", +"d4a6fd3e": "has_presale_started()", +"d4a8d9ba": "Inbox(string)", +"d4a9991f": "requestDividends()", +"d4a99d61": "finishDelivery()", +"d4aa6b59": "Button(uint64,uint64,uint64,uint64,uint64,address)", +"d4aa7394": "GameStatusUpdate(bool)", +"d4aa7d38": "City(uint256,string,string)", +"d4aae0c4": "kernel()", +"d4ab4a89": "_migrateRobot(string)", +"d4ac6af5": "MAX_REFERRAL_TOKENS()", +"d4acaf6c": "ecrecoverFromSig(bytes32,bytes)", +"d4acfa01": "tokenFrozenSinceBlock()", +"d4ad678e": "addItem(bytes16,uint16,uint16,bool)", +"d4ae1061": "getPurseDetails(uint256)", +"d4afc8b6": "retrieveERC(address)", +"d4b03d34": "changeValueBonus(uint8,uint256,uint256)", +"d4b088f9": "ICO_PHASE2_AMOUNT()", +"d4b0a23b": "addWhitelists(address[],uint256[])", +"d4b0c6e5": "stringToBytes10(string)", +"d4b0e966": "changeSaleStart(uint256,uint256)", +"d4b15ee0": "LogRefund(address,uint256,uint256)", +"d4b175d4": "mineTokens(address,uint256)", +"d4b182d4": "block(address,bytes32)", +"d4b1a462": "LogBought(uint256)", +"d4b1cdcc": "isResolverFor(uint256,address)", +"d4b1d19f": "testThrowsTransferDisabled()", +"d4b2931c": "tokenSEEDcap()", +"d4b2d5f0": "SQR_TOKEN()", +"d4b3f5b6": "tokenWithdraw(address,uint256,uint256)", +"d4b572be": "RESERVE_TOKENS_SUPPLY()", +"d4b64f35": "getBalanceOfModifiedWeth()", +"d4b71aa9": "maxPresaleWei()", +"d4b795c0": "getCurrentRoundEntry()", +"d4b83992": "target()", +"d4b8a6f1": "setFeeSchedule(uint256,uint256,uint256,uint256)", +"d4b9e410": "coiner()", +"d4ba15ad": "earlyPariticipantWeiPrice()", +"d4ba769c": "getLatestComponent(string)", +"d4badfad": "totumAllocation()", +"d4bb02e4": "changeRatePreSale(uint256)", +"d4bb1f28": "FCOIN1346Token(uint256,string,string,uint256)", +"d4bc0942": "withdrawOracleFunds()", +"d4bc87d9": "currentPriceChangeNumber()", +"d4bcffe4": "AbxyjoyCoin()", +"d4bd5a0d": "addCollaborator(uint256,address)", +"d4bdb879": "tokenSaleHasFinished()", +"d4bdc45f": "downvote(uint256,int256)", +"d4bde313": "ownBalance()", +"d4bdfe00": "ETCTransfer(address,address,uint256)", +"d4be5f68": "ATL_PER_ATP()", +"d4be6356": "authentication(bytes8)", +"d4be7714": "bornFamedStar(uint256)", +"d4bffa5a": "STATE_INITIAL_BIDDING()", +"d4c0cbce": "NovaCoinTransfer(address,uint256)", +"d4c1089b": "WorldRecord(string,bytes32,address)", +"d4c24db7": "StarterTokenSale()", +"d4c2b6b1": "scheduleTransaction(address,bytes,uint256[5],uint256)", +"d4c30ceb": "getFeeBalance()", +"d4c34dbb": "changeSoulCap(uint256)", +"d4c3eea0": "totalValue()", +"d4c46fa6": "setDeploymentPriceYear(uint256)", +"d4c49094": "WithrawDevToken()", +"d4c50f00": "coinPerEth()", +"d4c55f56": "wkaToken()", +"d4c6d9ad": "getbetresult(bytes32)", +"d4c72e7f": "etherollBeneficiary()", +"d4c76e8b": "MaxToken()", +"d4c80edf": "amountWagered()", +"d4c8fdae": "saleEtherRaised()", +"d4c9b1f2": "setMainAddress(address,address)", +"d4ca68ea": "replacePolicyTo(address,uint8)", +"d4cab39b": "AddedPrecommitment(address,uint256)", +"d4cae6e2": "getMetadataURL(bytes,uint256)", +"d4caf2a4": "setCodeSize(uint256)", +"d4cd5509": "CulturalCoinCrowdsale(uint256,uint256,uint32,uint32,address,address,address,uint256,uint256,uint256,uint256,uint256)", +"d4cdeb3c": "isInPresale()", +"d4ce1415": "detectTransferRestriction(address,address,uint256)", +"d4ce545a": "random(bytes32)", +"d4cf02ef": "getStringToSignWithKey(string,int256)", +"d4d0aced": "transferPartOfUnsoldTokens(address,uint256)", +"d4d0d6e6": "addTrusted(address)", +"d4d0e931": "resetAllVotes()", +"d4d1b7da": "approveTokensFromAnyWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"d4d227de": "PBToken()", +"d4d2af8d": "sellCoin(uint16)", +"d4d2e23c": "LogRandom(uint64)", +"d4d30bd9": "GreenX(address,address,address)", +"d4d33ece": "isRebirthAllowed(uint256,uint256)", +"d4d37883": "sendSurplusTokens()", +"d4d42658": "getTokenRateEther()", +"d4d42c91": "SetupML(uint256,uint256,uint256,uint256)", +"d4d5d32a": "collectFee()", +"d4d64f2b": "getRevokeHash(bytes,uint256)", +"d4d6adc0": "SiliconXCoin()", +"d4d6cdc4": "getStageTotal()", +"d4d6d366": "metadataUrlSuffix()", +"d4d6f5ee": "deleteChannel(address,address,address)", +"d4d70128": "totalContributions(uint256)", +"d4d728fe": "IsClaimed(bytes32)", +"d4d7b19a": "isHolder(address)", +"d4d81a13": "ClownCore()", +"d4d82dae": "MCFitCrowdsale(uint256,uint256,uint256,address)", +"d4d84da5": "addTokenShop(address,uint256)", +"d4d90bd5": "MINIMUM_PURCHASE_AMOUNT_IN_WEI()", +"d4d91bdd": "_createOpinion(string,address,uint256)", +"d4d92b14": "mintInternal(address,uint256)", +"d4d96ac5": "flag(string)", +"d4d9748d": "NeoToken()", +"d4d9bdcd": "approveHash(bytes32)", +"d4d9f559": "addWhiteListAddSetAuctionObj(address,uint256,uint256)", +"d4db3791": "processTransferResult(address,address,uint256,bool)", +"d4dc8e83": "walletCreateSnap(uint256,uint256)", +"d4dca69b": "thisAddress()", +"d4dcbc60": "declineApproval(uint256)", +"d4dd1594": "updateLandData(int256,int256,string)", +"d4dd26fb": "initKYCUser(uint256)", +"d4dd5d99": "LiteXTokenVesting(address,uint256,uint256,uint256,uint256,bool)", +"d4dd707f": "upgrade_node(address,address,string)", +"d4dd92a9": "TeamAllocation()", +"d4def0ba": "escrowedTokens()", +"d4df0c6d": "setSaleAuctionAddress(address,address)", +"d4df1be8": "getETHNeedPay(uint256,uint256)", +"d4df6152": "getInvestorByIndex(uint256,uint256)", +"d4df89e2": "messageBoard1(string)", +"d4dfadbf": "getMarket(address)", +"d4dfc4b9": "MinimalManuscript(bytes32,string)", +"d4e08743": "isVaidUsername(string)", +"d4e12f2e": "approve(address,int256)", +"d4e17e6d": "closeBuy(bool)", +"d4e19bd1": "HART_NETWORK_ID()", +"d4e30489": "NewYorkCoin()", +"d4e32938": "subuser(address,uint256)", +"d4e4716f": "_setWhitelistedUser(address)", +"d4e4841d": "tokenToEthTransferOutput(uint256,uint256,uint256,address)", +"d4e678b8": "refundTransaction(uint256)", +"d4e75363": "NextDistribution(uint256)", +"d4e77133": "SendCoin(uint32,uint32,uint32,address)", +"d4e78272": "Draw()", +"d4e7b9cf": "amountAvailableToCashout()", +"d4e823a3": "createVendingItem(uint256,uint256,uint256,uint256,uint256)", +"d4e8b749": "periodITO_weiPerToken()", +"d4e8e063": "startGrantAuthentication(address)", +"d4e90e24": "CCTC()", +"d4e93292": "withdrawal()", +"d4ea7b08": "_emitPublicCapabilityRemoved(address,bytes4)", +"d4eaa9fd": "approveAndCall(uint256,bytes)", +"d4eb139d": "migrateSet()", +"d4eb21ff": "PonderAirdropToken()", +"d4eb4186": "setB0xAddresses(address,address,address,address)", +"d4eb4540": "BLOCKTIMEOUT()", +"d4eb487e": "getProtectHourglass(bytes32,uint8)", +"d4eba667": "updateNovaContractAddress(address)", +"d4ebc5ff": "voteUp(uint256)", +"d4ed0b46": "setCRaddress(address)", +"d4ed2cf5": "candidateTillExchange()", +"d4ed8990": "updatePoolAddressCapTier1(uint256)", +"d4ee025f": "resetRequest()", +"d4ee1d90": "newOwner()", +"d4ee4041": "removeBlock(address)", +"d4ee9415": "addPurchased(uint256,uint256)", +"d4ee9fba": "existPublicKey(bytes32,address)", +"d4eeb6ad": "seasonTopSalesRewards(uint16)", +"d4eec5a6": "optOut()", +"d4efcfe4": "getAccountInformation(uint256)", +"d4f04289": "ownerSellArmy(uint256,uint256)", +"d4f06298": "UpdatedMainAccount(address)", +"d4f0ca3f": "onlyTestSetTimestamp(uint256)", +"d4f0ebe6": "getWeaponNb(uint8[176],uint8)", +"d4f114a6": "numOfBoundaries()", +"d4f11ab2": "updateCompanyWallet(address)", +"d4f2e67c": "ico(address,uint256)", +"d4f2f1da": "EthereumNano()", +"d4f397b5": "getLootClaimed(uint256,address)", +"d4f3d6b8": "updateEditionType(uint256,uint256)", +"d4f3dd84": "_generation()", +"d4f50f98": "getVoter(address)", +"d4f639ea": "run2()", +"d4f6aa98": "getLargePaymentBonus(uint256)", +"d4f7329e": "minttoken(uint256)", +"d4f74bf4": "curatorAccount()", +"d4f77b1c": "joinGame()", +"d4f96a09": "giveawayAddr()", +"d4fa83c3": "setWhitelistTx(address)", +"d4fa9021": "DeductABS(uint256,uint256)", +"d4fac45d": "getBalance(address,address)", +"d4fb0bc1": "payOut(uint256,uint256)", +"d4fb0d23": "totalGuess()", +"d4fb9a01": "tradingStatus()", +"d4fbe1e0": "devAllocation(address,uint256)", +"d4fbeb19": "registerToken(address,string)", +"d4fc5822": "userWeiSpent(address)", +"d4fdbcff": "ViewDividendPoolEnds()", +"d4fef717": "APC(uint256,string,string)", +"d4ff60cb": "URB()", +"d4ff88d5": "TokenSent(address,uint256)", +"d4ffd1bd": "updateStrategy(uint256,string,string,string,address[],uint256[],bytes32)", +"d5002f2e": "getTotalShares()", +"d50030ad": "getMyDividends()", +"d5005c35": "COINVR()", +"d5009584": "getManager()", +"d500ca00": "assignReward(address,uint256)", +"d500dd6a": "challengeTimeout(uint256,bool,address)", +"d500f861": "buyFromWallet(uint256,bytes32)", +"d501953d": "poolTokenAmount()", +"d5020ce8": "daysMinutesTilExpiryTime()", +"d5025625": "terms()", +"d502db97": "getAddr(string)", +"d5034f2f": "changeRegistrationStatuses(address[],uint256[])", +"d503d33f": "MyPoolBalance()", +"d503e948": "developer_edit_text_minimum_period(string)", +"d503ef95": "getCategoryEvaluation(address,uint256,uint256,address)", +"d50495f4": "addTransaction(bytes)", +"d504cb65": "currentBet()", +"d504ea1d": "getArray()", +"d5050493": "tokenOf(address,address)", +"d505c1cf": "currJackpotBetID()", +"d506355c": "getRentInfo()", +"d5064037": "BitcoinVision()", +"d5065090": "setVendingStartPrice(uint256,uint256)", +"d5072607": "auditTimeout()", +"d5089396": "Token(string,string,uint8,uint256)", +"d509b16c": "testWithdraw()", +"d509b1f9": "like(address,address,uint256,string,address)", +"d50a04f4": "dataPerUsd()", +"d50a3d2c": "privateSale(address,uint256)", +"d50b3065": "addTokenBalance(address,uint256)", +"d50b65d7": "startBlockjack()", +"d50b7123": "testLockTokensForTrading()", +"d50bb794": "getComponent(uint256,uint256,uint256,uint256)", +"d50cb88b": "priceMultiplier()", +"d50d4822": "revokeParticipation(address)", +"d50e38c6": "IbkToken()", +"d50e829e": "setStopped(bool)", +"d50f6bf0": "transferETH(address)", +"d50f6d3a": "getPartner(address)", +"d50f7c73": "lastBlock_v10()", +"d5102704": "testRenameStore()", +"d51033db": "getTuple()", +"d5119402": "PUBLIC_SALES_3_PERIOD_END()", +"d511beec": "WithdrawICOEarnings()", +"d511cc49": "DAILY_PURCHASE_LIMIT()", +"d511f6c0": "startBuyingTokens(bool,uint256,uint256)", +"d5144eca": "updateUserBio(string,string)", +"d515b1ce": "Team(address)", +"d515be39": "getTokenName(address,uint256)", +"d5167b26": "partialTrade(uint256)", +"d5170fcc": "BonusFinalizeAgent(uint256,address)", +"d5171523": "euroteambet()", +"d517bc6f": "calcPointShamir(uint256,uint256,uint256,uint256)", +"d5182b70": "blocked(uint256)", +"d5185115": "forwardTokens(address,address,uint256)", +"d51902cf": "fallbackAccount()", +"d5193235": "mintUserAdoptionTokens()", +"d519bdcb": "distributeSML(address[],uint256)", +"d519fdc5": "alterGiveKarmaFee(uint256)", +"d51abbd9": "updateMaxTxGas(uint256)", +"d51c2454": "stepOne(int256)", +"d51c86e7": "setData_12(string)", +"d51d4fa8": "Securities_3()", +"d51e1737": "creedex(address,address,address,uint256,uint256,uint256)", +"d51eda9a": "AMC()", +"d51f5abd": "BEXMToken(uint256,string,string)", +"d52230c4": "totalContributionsBySender(address)", +"d5235a04": "contractEnable()", +"d5246eba": "queryRandom()", +"d5250364": "checkWrapperBalance()", +"d52550a4": "TokenPool(address,address,address)", +"d525aa32": "conditionalTransitions()", +"d5260eea": "getChannelAddress(string)", +"d526b9bd": "_allow()", +"d526c08e": "uv()", +"d526c40c": "_denyPublishSecret()", +"d526d332": "getLogic(uint256)", +"d526eaeb": "getMaximumReadsPerStep()", +"d5280c28": "AuthorizedCreate(address,uint256)", +"d529a072": "buyAddress(address,bytes8,uint256)", +"d529debb": "subOnHold(uint256)", +"d52a3524": "addAction(bytes32,bytes32,string,uint256,bool,uint256,uint256)", +"d52a5fc4": "decomission()", +"d52a7cbf": "setWallet1(address)", +"d52a7e86": "totalRewardedAxies(bool)", +"d52b38cd": "updateVendorApplicationStatus(string,string,string,string,string,string)", +"d52b5cb4": "_addLegitRace(address)", +"d52b79bd": "XTT()", +"d52b8a0e": "addVineyardEndorsement(string,uint256,bool,string,string)", +"d52b9e40": "activateTokenSwitch()", +"d52c6c08": "approCertificate(uint256)", +"d52e4633": "futureRoundTokensRelease()", +"d52f7122": "myCredit()", +"d52f916f": "setAddressCrowdsale(address,address)", +"d52f9f0f": "axonburn(uint256)", +"d530040a": "createAddressHash(address,bytes32)", +"d5307b0c": "weiContributed(address)", +"d53087b2": "JANUS()", +"d531eeaa": "icoBonus1()", +"d5320300": "getWithdrawableAmountANPES(address)", +"d532968f": "_chkSellerLmts(address,uint256)", +"d532df3c": "setCraftAuctionAddress(address)", +"d532e481": "activateFrozenAccount(address)", +"d533d0db": "changeUserLangAbility(bytes32)", +"d534831c": "sumOfWeights()", +"d5349606": "removeDeadTurns(uint16)", +"d535268d": "BUZZ()", +"d5353792": "setWithdrawGasCost(uint8)", +"d5356b7d": "TOKENS_PER_USD()", +"d5356fe1": "tokenFallback(address,address,uint256)", +"d53590a7": "durationPreSale()", +"d5364231": "forcedRedeem(address,uint256)", +"d536c3ae": "beginPhaseTwo(uint256)", +"d5370904": "getAvailableTokenCount()", +"d5375a5c": "getHigherInstance()", +"d537c3e3": "blockLockActive()", +"d537df3c": "claimTwitterIdIfNeededThenStealCardWithTwitterId(uint256,address,uint8,bytes32,bytes32,uint256)", +"d537e131": "calculateMatchPrice_(address[14],uint256[18],uint8[8],bytes,bytes,bytes,bytes,bytes,bytes)", +"d538359e": "Copeland()", +"d5387acb": "buy4(address[],address[],uint256[],bytes,bytes,bytes,bytes)", +"d539a014": "SSDTokenSwap()", +"d539a226": "assertEq10(bytes10,bytes10,bytes32)", +"d53a9b85": "tokensPerCents()", +"d53aaec2": "cPT()", +"d53abe1b": "stopRound(bool)", +"d53b2679": "activated_()", +"d53b4ab4": "communityAllocation()", +"d53b932a": "percentLeft()", +"d53bb6ac": "EthBita()", +"d53bc605": "testMultitransfer1()", +"d53beee4": "isOk(bytes1)", +"d53c61bf": "slasherAddress()", +"d53ca3c7": "setDiscountMember(address,address,string,bool)", +"d53ce956": "setOperationAddress(address)", +"d53dbe8e": "publishier()", +"d53e35db": "Garfield()", +"d53e963b": "buyCore(uint256,uint256)", +"d53f1cbd": "getBidFee(uint256)", +"d53f8208": "fundaria()", +"d541ca5d": "BONUS_PCT_IN_ICONIQ_SALE()", +"d5420df4": "drawToHand(uint256,uint32,uint256)", +"d5425571": "gasonBuffPercentage()", +"d5427123": "insertData(uint256,string)", +"d543f9d6": "setTeamPerfitAddress(address)", +"d544361e": "increaseShares(uint256,address)", +"d544e010": "removeAuthority(address)", +"d5456bc6": "lastBlock_a14Hash_uint256()", +"d545782e": "updateTokenRate(address,uint256,uint256)", +"d545ee2d": "CustomToken(string,string)", +"d54604ae": "min_fundingGoal()", +"d54656d5": "startTrade(address,address,uint256,uint256,uint256)", +"d546c975": "getCharacterServer(uint256)", +"d5472a5e": "userRewardAccountBalance(address,address)", +"d5472fcb": "removeWhiteLister(address,address)", +"d5477d37": "getColdWalletAddress()", +"d54839bf": "FEE_DEV()", +"d54a6bfb": "setHmcAddress(address)", +"d54ac04d": "get_master(bytes32)", +"d54ad2a1": "totalClaimed()", +"d54ad593": "getgamecardintro(uint256)", +"d54b02ec": "weiToCollectByInvestor(address)", +"d54b066f": "calcAmount(uint256)", +"d54c03a9": "NOORToken()", +"d54c2a63": "improveCard(uint256,uint256,uint256)", +"d54c4726": "usageCost()", +"d54c7099": "TVContract()", +"d54c7b4f": "_triggerCooldown(uint256)", +"d54c8c87": "emitApprove(address,address,bytes32,uint256)", +"d54ced9c": "canContributeAmount(address,uint256)", +"d54cefc1": "transferTokens(address,address[],uint256[])", +"d54dc5eb": "REGISTRATION_COST()", +"d54dd8f9": "slice4(bytes,uint256)", +"d54e583a": "transferFrom(address,address,uint256[],uint256[])", +"d54f4dd6": "TestVeryCoin3()", +"d550172a": "verifySig(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address,bytes,address,address)", +"d5503d5f": "payBalance()", +"d550668d": "setContract(bytes32,uint256,address,address)", +"d550f044": "setAllowLocalBuy(bool)", +"d55108be": "JOLDEAME()", +"d5518feb": "RequestCollectInterface(address)", +"d551f601": "_auth_mode()", +"d552844b": "signTrueloveByCOO(bytes32,string,string)", +"d55321db": "newGame(address,string,string,uint256,uint256,uint8,uint8,uint8,uint256)", +"d5537c0d": "setUsersCap(uint256)", +"d553adf0": "frozenFunds(address)", +"d5544f94": "getFundsAndAvailable(address)", +"d5547587": "ReviewToken(uint256,string,uint8,string,address)", +"d554ba86": "round_b_begin_date()", +"d554f8b4": "changeDeDeStorageAddress(address)", +"d5551518": "CapitalMiningToken(string,uint8,string,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"d5556544": "offset()", +"d5562901": "getFeeSchedule()", +"d5563f31": "createAuction(uint256)", +"d556c8f5": "getHashID(address,bytes32)", +"d5572bd6": "closeCrowd()", +"d5582205": "getCertifiedStudentAtIndex(uint256)", +"d5582965": "stopMint()", +"d55a772d": "getCurrentOwner(string)", +"d55ac94c": "WhiteBullsToken()", +"d55b7703": "privateIcoCap()", +"d55b9eb1": "XIAOMI()", +"d55b9f4d": "DISCOUNT_PRIVATE_PRESALE()", +"d55bc06a": "LDEX()", +"d55bdc5f": "getCampaignPriceById(bytes32)", +"d55c4af8": "_p3dSellPercentage(uint256)", +"d55c980f": "submitEntry(bytes,string)", +"d55c9c84": "confirmWinner()", +"d55cc3e2": "JSONpath_raw(string,string)", +"d55d1fed": "EGGS_TO_HATCH_1Dragon()", +"d55e62a0": "removeTrusted(address)", +"d55e725b": "initialFunds()", +"d55ec654": "wash_list(uint128)", +"d55ec697": "upgrade()", +"d55edcfd": "freezeChangesToVesting(address)", +"d55fe582": "isAssociated(address)", +"d560f696": "releaseRoto(address,bytes32)", +"d561be54": "createVestingContractWithConstantPercent(address,uint256,uint256,address,uint256)", +"d561ef2b": "setMinBuyableAmount(uint256)", +"d562a121": "calcTokens(uint256)", +"d562de0b": "investor_insert(address,uint256)", +"d562deef": "getAffiliateFee()", +"d5630f71": "AlpenCash()", +"d5635444": "getCoupon(string)", +"d5656ccf": "getWager()", +"d5666b5f": "versionBase(bytes32,bytes32,address)", +"d5667d8a": "updateUSDWEI(uint256)", +"d5668a92": "_checkTransactions(address)", +"d5670f59": "VisualChainToken()", +"d567c0e1": "cashBackWeight(address)", +"d5687efd": "WhitelistSetDay(address,uint8,uint256)", +"d5698726": "LogSetPicosPerEther(uint256)", +"d56a0a88": "bipedaljoe()", +"d56a4555": "setLink(uint256[2])", +"d56a62cf": "getPurchases(address,uint256)", +"d56a9314": "transfer_m(address,uint256,string)", +"d56b2889": "finish()", +"d56b7577": "BM_ICO()", +"d56b7746": "mintTokenCollection(string)", +"d56bd142": "getPayments()", +"d56cd796": "addNewCourse(int128,string,string,string,string)", +"d56d229d": "nftContract()", +"d56de6ed": "adminAllowance()", +"d56e3068": "getTotalDonated()", +"d56ea1b0": "pausePending()", +"d56efabf": "LockableToken()", +"d56f279f": "resignOwnMembership()", +"d5708d5a": "setMinAmount(address,uint256)", +"d571829e": "mintTokensToEralyInvestors()", +"d571a9a9": "Hawaii()", +"d571dbac": "getHeadInfo()", +"d571e645": "validStoreBuff()", +"d571edb0": "getExchangeGroupsLength()", +"d572056e": "testItem(bytes)", +"d5722518": "setUintsOwnerCount(address,address,uint256,bool)", +"d5723bf7": "finishGame(uint256,uint256)", +"d572fd99": "getPlayerCardsNumber()", +"d574bcdf": "reLoadXname(uint256,bytes32)", +"d575af74": "getSubscriptionServiceId(bytes32)", +"d575f332": "updateCampaign(address)", +"d5762230": "overStakeAgeBurn()", +"d5767fb6": "_emitCapabilityAdded(address,bytes4,uint8)", +"d576dc58": "TOKEN_SALE_LIMIT()", +"d5775f5c": "getCurrentSellPrice()", +"d5778d37": "preIcoTokens()", +"d5778efa": "STASHToken()", +"d5778f07": "transferAdvocatedTAOLogos(address,address,address)", +"d5779b7f": "imageUploadComplete(address[16],uint256)", +"d577ab70": "authorizeEscrowService(address)", +"d577d785": "setJPYC(address)", +"d57869d4": "findTrustedContract(address,address)", +"d578ec6c": "uploadData(bytes32[100])", +"d578f434": "BONUS_PCT_IN_VREO_SALE_PHASE_2()", +"d579f9e8": "changeBinary(uint256)", +"d579fd44": "approveNextOwner(address)", +"d57a0577": "TEAM_BONUS_PER_CENT()", +"d57a12f5": "testCheckSigs()", +"d57a9e4f": "LATER_AUCTIONS_INITIAL_PERCENTAGE()", +"d57ad588": "hashToSign_(bytes32)", +"d57b8932": "leaseBlock(uint256,uint256,uint256,bytes32,bytes32,bytes32,bytes32)", +"d57bde79": "highestBid()", +"d57c00de": "PayForServiceETH()", +"d57c1ea2": "addIssue(uint256)", +"d57c25f8": "UnderratedToken()", +"d57f62ff": "getPeriodLockedBalanceFor(uint256,address)", +"d5812ae1": "positionPrice()", +"d5813323": "traded(bytes32)", +"d583644b": "upgradeStrength(uint256)", +"d5838ca7": "addPublicKey(address)", +"d5847d33": "conversionRatesContract()", +"d585b852": "DAOToken()", +"d586bd4e": "donateP3D()", +"d586d2e4": "cancelRequest(uint256,uint256)", +"d586e30f": "calcNextReward()", +"d587dbf9": "change_specific_addy(address,uint256)", +"d588acc4": "claimMiningReward()", +"d588b892": "testCount(uint256)", +"d588d4d8": "hasHash(bytes10,uint8)", +"d5893bb2": "tradeEventEnabled()", +"d58b8282": "roundFiveTime()", +"d58b82bb": "getCampaignDailyPrice(address)", +"d58bf09a": "redeem(bytes32,address,bool[4])", +"d58c4b85": "siteAccount()", +"d58d1566": "subsidyHalvingInterval()", +"d58e1758": "totalConvertLotsByAddress(address)", +"d59070f8": "mintCopieExecutoire(bytes32)", +"d5909149": "CerberusNetwork()", +"d590bf49": "deleteCase(uint256)", +"d590df4a": "setFirstPeriodCap(uint256)", +"d591221f": "testTransfer()", +"d59138ef": "markReleased()", +"d59167f6": "claimComputation(bytes,bytes32)", +"d591d777": "finanVestingStages()", +"d592c243": "Issuance(address,uint256,uint256,uint256)", +"d592f5fd": "reserveFullMintAllowance()", +"d593c953": "revenueShareIdentifierList(address)", +"d5949bf3": "RegistroBlockchain()", +"d595c331": "burnSupply(uint256)", +"d5969f2b": "grantEnable()", +"d596c862": "toggleRedeemActive()", +"d59768a3": "updateAddress()", +"d597b634": "ETC()", +"d597b8c8": "getOffer(bytes32)", +"d597c6bb": "_generateSpaceship(uint16,address)", +"d598aef8": "TESTToken()", +"d598b2c5": "getTopCompanyStartBlock()", +"d598cae5": "ACTIVE_LOAN_CANCELED_BY_LENDER_STATUS()", +"d598d2ab": "Reward(address,address,uint256,string,uint256)", +"d598d4c9": "service()", +"d5992ef5": "isSuited(uint8,uint8)", +"d5996502": "TheMLMDemo()", +"d59aec08": "notesOf(address)", +"d59b5d4e": "getDocumentIdWithContentHash(string)", +"d59ba0df": "setDistributor(address,bool)", +"d59cf17f": "WeAPOWH()", +"d59e31ed": "totalETHSold()", +"d59e6461": "addRoot(bytes32)", +"d59f1844": "content_intro()", +"d59f1f3f": "proposalsByShareholder(address,uint256)", +"d59f2827": "isTokenOwner(uint256,address)", +"d59f37e0": "verifyCanRemoveOrderById(uint32)", +"d59f4e68": "setPaintingArtist(uint256,string)", +"d59f5c6e": "OmegaNode()", +"d59f9cc7": "getFullAddressList()", +"d59fde06": "CredoIco(address,uint256,uint256)", +"d5a056d8": "AddOrigin(address)", +"d5a18e4c": "setMany(address,uint256,uint256[],uint256[])", +"d5a2040e": "AKM()", +"d5a31956": "commissionArt(uint256,uint256)", +"d5a34dfb": "VPC0x()", +"d5a3b734": "dataSourceAddress()", +"d5a41695": "fetchVoteNumForCandidateBySnapshotBlock(address,uint256)", +"d5a4726b": "sumICO2()", +"d5a4a3c6": "findRecentBet(address)", +"d5a506d0": "regionExists(uint16)", +"d5a53dec": "ACTION_SELL_OFFER_ACCEPTED()", +"d5a5825d": "currentEtherBalance()", +"d5a632b5": "addPartnerSaleWallet(address)", +"d5a683c0": "addDividends(uint256)", +"d5a6c97a": "setWhitelistModerator(address,uint8)", +"d5a73fdd": "getVestedAmount(address)", +"d5a7b500": "softCapTriggered()", +"d5a81428": "sellPriceInWei()", +"d5a841f9": "setFaucetThresholdSecs(uint256)", +"d5a8487f": "getSquareWins(uint256,uint256)", +"d5a849e9": "getRewardBalance(address)", +"d5a8c0d9": "Ghcwchain(uint256,string,string)", +"d5a9f356": "testTemp3()", +"d5aa1a26": "getRouteSize()", +"d5aa1aca": "setmmVaultAddr(address)", +"d5aa7803": "isGuessesOpen()", +"d5aaadd1": "finishMintingRequestSetup()", +"d5ab20a7": "removeNFBTNY(address,uint256)", +"d5ab7f30": "crowdsaleSuccessful()", +"d5abaa27": "JoinTheFray(address)", +"d5abeb01": "maxSupply()", +"d5acdeb2": "allocateCorporateToken(address,uint256)", +"d5aceaac": "closeBattleboard(uint16)", +"d5ad2e00": "m_wcStored()", +"d5ad3ad0": "setServiceController(address)", +"d5ad3cda": "removeWalletsFromWhitelist(address[])", +"d5ae1085": "updateNextOrderPrice(address,address,uint256,uint256)", +"d5ae79ea": "processCollision()", +"d5af8f24": "createAndSellAllAmountBuyEth(address,address,address,uint256,address,uint256)", +"d5afd6bc": "startOperation()", +"d5b014f8": "MoonTrail()", +"d5b01c99": "existIdAtCurrentVersion(bytes32)", +"d5b0c0d5": "numberOf(bytes16)", +"d5b1402c": "ViralTokenSale()", +"d5b235d0": "test_claimShares_emptyRewardPool_isTranscoder()", +"d5b2a01a": "ownerFee()", +"d5b2c102": "sendCoin(bytes32,bytes32,uint256)", +"d5b36845": "stage3Bonus()", +"d5b36eeb": "TEHToken()", +"d5b3b317": "minutestotal()", +"d5b40406": "signUpForAirdrops()", +"d5b42496": "enableShowValue(bool)", +"d5b4ea20": "USDcRaised()", +"d5b5dc49": "companyReserve()", +"d5b61da0": "PRE_SALE_MIN_ETHER()", +"d5b74699": "library1function()", +"d5b85b2d": "setBAAU(bytes32,address,address,uint256)", +"d5b89bc8": "Issuance(address,uint256,uint256)", +"d5b8a884": "ASStokenICO(address)", +"d5b9df87": "LEADER_FEE()", +"d5ba4d21": "changeHold(address,uint256,uint8,uint256,bool)", +"d5ba5f82": "getBattleCard(address)", +"d5bab53d": "xtestTransferToken()", +"d5bb7f67": "updateFeatures(uint256)", +"d5bc0a07": "LYBTToken(uint256,string,uint8,string)", +"d5bcecab": "setLeagueRosterAndSaleAndTeamContractAddress(address,address,address)", +"d5bcf8ef": "setGameRunning(bool)", +"d5bd3443": "newOption(address,uint256,bool)", +"d5bd57a1": "getCardsDetails()", +"d5bde837": "registerPoA(string,bytes32,uint64[],uint64[],address,address,string,bytes2)", +"d5be4153": "buyAd(uint256)", +"d5bec84e": "weiPixelPrice()", +"d5bee9f5": "randomAddress()", +"d5bf158a": "affiliateName(address)", +"d5bf2dbe": "setFeeParameters(uint256,uint256,uint256,uint256)", +"d5bf4da1": "eTicket()", +"d5bf5fc3": "sendBountySupplyToken(address)", +"d5c06d30": "icoEnabled()", +"d5c0c185": "canChangeBeneficiaryParams()", +"d5c14391": "getAvailableAmount(uint256)", +"d5c166d5": "getExchgComisnMulByThousand()", +"d5c21c4f": "setMinAuditPrice(address,uint256)", +"d5c2d2b6": "TEAM_INCENTIVES_AMOUNT()", +"d5c2e3ca": "destroyContract(string)", +"d5c2ee21": "hasLanguage(address,uint256,uint256)", +"d5c34755": "LogAuthCreate(address,uint256)", +"d5c4098d": "enableRenounceOwnership()", +"d5c44898": "updateLastPrice(uint256)", +"d5c469f8": "isP2SH(bytes,uint256,uint256)", +"d5c53c44": "DETEX()", +"d5c5d8e1": "yetAnotherFunction()", +"d5c60c97": "ShowInfoBool(bool)", +"d5c61301": "say(string)", +"d5c61881": "enableWithdrawl()", +"d5c655c9": "lastTaskIndex()", +"d5c7aece": "CertAdminDeleted(address)", +"d5c7bcc8": "coinIssuedEtc()", +"d5c80423": "lockDeposit(bytes32,string)", +"d5c813dc": "sellerfee()", +"d5c96b36": "gettotalCardValue()", +"d5c9712f": "getBytesLE(bytes,uint256,uint256)", +"d5c98db1": "setPropertyOwner(uint16,address)", +"d5c999f8": "getBanque()", +"d5c9b239": "getAllShops()", +"d5c9c144": "SetGasFeeReimbursed(uint256)", +"d5ca35bc": "withdraw(address,uint256,uint256,address,uint8,bytes32,bytes32)", +"d5cb4a04": "getParticipantTransactions(address,address)", +"d5cc1d49": "upload(bytes32,bytes32,bytes32,bytes32)", +"d5cc8813": "startingPriceOf()", +"d5cce45a": "showbuyPrice()", +"d5cd3243": "addUser(bytes32,bytes32,uint256)", +"d5cdd2c7": "tokenToPoint(uint256,address,uint256)", +"d5ce3389": "from()", +"d5ce44c1": "totalEthReceivedinWei()", +"d5ce6719": "AC(uint256,string,string,address)", +"d5ce6a34": "LogAddressTokenCapCalculated(uint256,uint256,string)", +"d5ce91fd": "isRegistered(address,bool)", +"d5ceecea": "ERC777DemoToken(string,string,uint256,uint256)", +"d5cef133": "requestRefund()", +"d5cf5c72": "setSoftCap(uint256)", +"d5cfa94e": "claimAdmin(string)", +"d5cfad68": "getUserCertificationDetails(string)", +"d5cfc01b": "lockAddressByKYC(address,address)", +"d5cfee3e": "playerIsRegistered(address)", +"d5d067b0": "createRequestAsPayerAction(address[],int256[],address,uint256[],uint256[],string)", +"d5d09021": "isCrowdsaleFull()", +"d5d0da83": "KingsToken(uint256)", +"d5d1b95a": "convertRegularToRewardTokens(address,uint256)", +"d5d1e770": "confirmOwnership()", +"d5d21e18": "createTokenContract()", +"d5d2f528": "setTokenCounts(uint256,uint256)", +"d5d434c9": "SocialXBounty()", +"d5d4dfad": "balanceHistoryLength(address)", +"d5d55931": "ETXCrowdsale()", +"d5d55c8a": "PurchaseConfirmed()", +"d5d5913c": "getCCH_edit_2()", +"d5d5cefa": "cancelOptionOrder(address[3],uint256[3],uint256[2],bool)", +"d5d5f469": "getDocumentIdWithIPFSdirectoryHash(string)", +"d5d66031": "Wp()", +"d5d75cad": "_changeWallet(address)", +"d5d8a751": "Gallery_MuYi_No3()", +"d5da9e82": "teamLockTransferFrom(address,address,uint256)", +"d5db3fe2": "LogTrade(address,address,uint256,uint256,uint8,uint8,uint256,int256,uint256,int256)", +"d5db72eb": "isRegistrar(address)", +"d5db9366": "cancelCollateralTransfer(uint256)", +"d5db9410": "ChangeProtectionTime(uint256,uint128)", +"d5dbb1ad": "solveBet(address,uint8,bool,uint8,bytes32,bytes32)", +"d5dbe634": "incrementTotalSupply(uint256)", +"d5dc7139": "Scratch()", +"d5dcc638": "StrongHands()", +"d5dcf127": "setAge(uint256)", +"d5dd5127": "managerNotSetInApp()", +"d5de30e0": "evMgmtInvestProject(address,uint256,address,uint256,bool)", +"d5de78bc": "getGrantBalanceOf(address)", +"d5df7559": "removeDocument(uint256)", +"d5df7bcc": "newFootballMatch(uint256)", +"d5e03fc6": "payoutParty()", +"d5e05c89": "isSpaceshipUpgradeAllowed(bytes5,uint16,uint8)", +"d5e0b616": "getAnyElementByIndex(uint256)", +"d5e0d8fc": "setCompositionPrice(uint256,uint256)", +"d5e0e131": "totalAdvisorsSupply()", +"d5e16567": "getAccountValues()", +"d5e38f60": "lpFeeBp()", +"d5e3fbb2": "payfee()", +"d5e45a83": "positionFrom(address,address,uint256)", +"d5e4a36e": "isPreSaleRunning()", +"d5e4b342": "trexdevshopWaited1Years()", +"d5e5e6e6": "preciseUnit()", +"d5e83d9c": "RisikoCoin()", +"d5e99dac": "rateLoss()", +"d5e9abfd": "mustKyc(address)", +"d5e9eb9c": "IPM()", +"d5ea36f9": "offMaintenance()", +"d5eb0cbf": "isContractPermanent(string)", +"d5ec40af": "buyToken(uint32,uint32,address)", +"d5ec7e1d": "left22(uint256)", +"d5ec8d82": "_estIntegerSqrt(uint64,uint64,int256)", +"d5ecc1bd": "papu()", +"d5ecf7c5": "getNumExcessTokens(uint256)", +"d5ed289d": "getClaimRate(uint256)", +"d5ed9cba": "setLandRegistry(address)", +"d5edca54": "Games(uint256,uint256)", +"d5ee739d": "tokenRateWei()", +"d5f0400e": "validClaim(bytes32,string,string,address,bytes32,bytes32,uint8)", +"d5f07396": "checkIfReferee(address)", +"d5f12812": "setSpend(address,uint256)", +"d5f17df2": "selectFight2DeathContract()", +"d5f1e8d8": "hardCapEther()", +"d5f222ee": "tally(address)", +"d5f24708": "gotake()", +"d5f37f95": "sign(uint256,uint256,address)", +"d5f39488": "deployer()", +"d5f404c7": "update_power()", +"d5f47a51": "Ethraffle_v3b()", +"d5f48e76": "cancelSynthesizingAuction(uint256)", +"d5f4f0b3": "addTokens()", +"d5f52d51": "withDrawMyBalance()", +"d5f5b788": "maxCapUSD()", +"d5f5df2a": "checkFiscal(bytes32)", +"d5f6b538": "getClaimsCountForStory(bytes12)", +"d5f72b2e": "addMany(address,uint256,uint256[],uint256[])", +"d5f7b144": "_burnToken(address,uint256)", +"d5f827e2": "TBrate()", +"d5f868b7": "removeReverseRate(address)", +"d5f87242": "assertInvalidState()", +"d5f9ac43": "transferFromTangibleAssetfund(address,uint256)", +"d5f9bdf1": "TokenCreated(address,address)", +"d5f9e6c7": "ProjectName()", +"d5fa2b00": "setAddr(bytes32,address)", +"d5fa2da5": "newEscrow(uint256)", +"d5fb1a1c": "ByteLockerShares()", +"d5fbe080": "_getEnd(int256)", +"d5fcc7b6": "setPresale(address)", +"d5fd5351": "WithdrawAddressApproved(address,address,bool)", +"d5fdb334": "getOpenGameIds()", +"d5fdfdbc": "setResult(string,string,string)", +"d5fe6062": "claimTusdProxyOwnership()", +"d5fec406": "abdicate(uint64,address)", +"d5ff0e7b": "transferToContract(address,address,uint256,bytes)", +"d5ff38ae": "migrateBasicData(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"d5ff56f8": "allowChange()", +"d600630c": "registerInstitution(string,address,address)", +"d6006e88": "send(address[],uint256[],uint256)", +"d6006e8e": "preSaleSuccess(address,uint256,uint256,uint256)", +"d600c846": "JingzhiContract()", +"d60207c7": "getLowestUnitPriceIdxFromBuy()", +"d6026ac1": "getPRewardedSumByRound(uint256,address)", +"d6030d57": "BOUNTY_CAMPAIGN_SHARE()", +"d6039a41": "totalsigs()", +"d603f872": "buyPreICO()", +"d603fd28": "sendToAddressWithTime(address,uint256,uint256)", +"d6046836": "setAllowBuy(bool)", +"d604d6a8": "getSkillRating(address,uint256,uint256,uint256,uint256)", +"d604d8d1": "checkHash(bytes32)", +"d605787b": "rng()", +"d6063225": "Ktx(uint256,string,uint8,string)", +"d606f34b": "century(address)", +"d60743b1": "read_total_number_of_user_purchases(address)", +"d6077912": "RRRToken()", +"d608b3b2": "totalCharity()", +"d609ea93": "stakingEpochDuration()", +"d609fe59": "OEO(uint256,string,string)", +"d60bf518": "Test3(address)", +"d60d7044": "_char(bytes1)", +"d60dcb5d": "Switch()", +"d60df5be": "xmr()", +"d60e1447": "supplyBezNolei()", +"d60f0e5a": "BonusWhiteList(address,address,uint256,uint256)", +"d60f2eae": "buyPBTTAgainstEther()", +"d60f6cd9": "sendNumber(uint16,address,address)", +"d60fa784": "Voicecoin()", +"d60fd1be": "Hopecoin()", +"d6103b26": "_newPepe(uint256[2],uint64,uint64,uint64,address)", +"d6106696": "withdrawal_last_voter()", +"d6106b3e": "buys(uint256)", +"d611225b": "addContract(string)", +"d61191bd": "distributeValidityBond()", +"d612be77": "dpToken()", +"d612cff5": "permissionHash(address,address,bytes32)", +"d613ac91": "buybackTypeOne()", +"d613be0a": "forceChangeContractOwnership(address)", +"d6142c5b": "createProvider(bool,string,string,string,string,uint8,bool,address)", +"d615950d": "mintUpdateToken(uint256)", +"d61647f2": "developer_string_golos(string)", +"d616fe6e": "setTxAboveLimits(address,uint256,bytes32)", +"d617ad7d": "getPatentFee(address,uint16[5])", +"d618996b": "orderEnd()", +"d6192c6c": "hodlerStakes(address)", +"d619d216": "retrieveEth()", +"d619f6b3": "sendIndividualAmount(address[],uint256[])", +"d61a4524": "setdissolveaddress(address)", +"d61bd8fb": "getAvlShares(bool)", +"d61ca7eb": "RYH()", +"d61ccf84": "RABAToken()", +"d61e7201": "updateStatus(uint256)", +"d61e9274": "SetRate(uint32)", +"d61f92a3": "getJoinAddr(uint256)", +"d61fb0bf": "dateIT()", +"d620c7c8": "LogNewContractProposal(address,address,address,uint256)", +"d620caaa": "walletFromTeam()", +"d621a4f2": "setWithdrawBankFee(uint256)", +"d621b83f": "_createKydy(uint256,uint256,uint256,uint256,address)", +"d621c878": "improvementContract()", +"d621e813": "tradeEnabled()", +"d6223305": "ReleaseableToken(uint256,uint256,address)", +"d6224a6b": "getPixelText(uint256)", +"d6233491": "getPaid(string,address)", +"d6236ad0": "MetisCoin()", +"d62457f6": "callValue()", +"d624fdb6": "approveUser(address)", +"d625a7a6": "BetAdded(uint256,address,uint256,uint256,uint256)", +"d625c654": "migrateLosingTokenRepToWinningToken()", +"d6264b75": "transferBack(uint256,address)", +"d626db79": "setPublicWhitelistAbility(bool)", +"d6271727": "processUpgrade(address,uint256)", +"d628e0a6": "WatchBalance()", +"d628ecd7": "multiValueAirDrop(address[],uint256[])", +"d6291f6f": "VitalKey()", +"d629bc12": "iNf4mation()", +"d62a13ac": "ExhaustionCoin()", +"d62a7127": "getlastid()", +"d62ac58c": "AdvisorsPartners()", +"d62b255b": "setOwner(address,string)", +"d62b6f7e": "Main()", +"d62c6523": "cancelReservedTokens(address,uint256)", +"d62d3115": "testCreate()", +"d62f0f22": "getMyRice()", +"d62f146b": "updateSkill(uint256,uint256,uint16)", +"d6300201": "getPercent(address)", +"d630bd53": "pledgeApprove(uint256)", +"d630d100": "releaseAdmPercent()", +"d630efbc": "getAllTotalPrize()", +"d63124d7": "checkMidiNotesValue(uint8[])", +"d631eed7": "withdrawEthForUser(uint256)", +"d631f6d4": "DeleteProject(string)", +"d63241a6": "EtherCheque()", +"d63249ee": "_placeBet(uint256,address,bytes)", +"d632f639": "_privateSale()", +"d632fd1d": "PIP()", +"d6349dd6": "referralDividendsOf(address)", +"d634ba22": "baseNumber()", +"d6351433": "getRichToken(uint256)", +"d635357e": "TestContract(int256,string)", +"d63547e6": "GetFreeCnt()", +"d63581de": "setPricePoints(uint64[])", +"d63587a2": "randomNum(uint256)", +"d635b69f": "preValidatePurchase(uint256)", +"d635fc63": "getReveralSupply()", +"d6362e97": "getMin()", +"d6370149": "_errorAndRefund(string,uint256,uint8)", +"d6380f37": "complete(uint256,uint256)", +"d6387a3e": "getMinersAt(uint32,uint32)", +"d638d981": "SingularityTest24()", +"d63900d5": "getTileLocation(uint16,uint16,address,address)", +"d6391a01": "Total_TokenSupply()", +"d639bf80": "Bitstocksmarket()", +"d63a1389": "mintFeeFlat()", +"d63a6ccd": "usd()", +"d63a8e11": "allowed(address)", +"d63bed4c": "_setPermissionManager(address,address,bytes32)", +"d63d4af0": "getOwnerTokens(address)", +"d63e6ce7": "increasePeriod()", +"d63e7cc1": "priceICO()", +"d63ebe92": "StepVesting(address,uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"d63eea42": "MAX_NUMBER_BETTERS()", +"d63fe1c7": "TARGET_TOTAL_SUPPLY()", +"d64196f8": "minInvestedLimit()", +"d641f3e4": "playGame(uint256,uint256,uint256,bytes32)", +"d64232c0": "option10name()", +"d6424ea7": "calculateAmount(string,uint64)", +"d6427c24": "randomPlayer()", +"d6449e15": "cancelTXwithCode(bytes32)", +"d644af34": "withdrawAndSend()", +"d644c46f": "wuxiaMasterPrice()", +"d644e356": "index(uint256,address,uint256,uint256)", +"d645ddf6": "mint(string,string,string)", +"d64637c7": "distributeDivident(uint256)", +"d6464b7c": "getSellerOfToken(uint256)", +"d6475c3a": "returnTokensForDay(uint256,uint256)", +"d647bb22": "Customcoin()", +"d647e2da": "test_set_get_RiskParameters()", +"d6481502": "setFreezingPercentage(uint8)", +"d648a647": "fundingStartBlock()", +"d648d7fd": "post(address,uint256)", +"d6495676": "emitPaymentReleased(uint256)", +"d64b12cf": "MAX_UNICORNS_TO_GIFT()", +"d64bcc1a": "releaseIcoTokens()", +"d64c2018": "setNextImagePart(uint256,uint16,uint16,uint16,uint256[])", +"d64c34fc": "getLockAmount()", +"d64d136d": "wnFromGas(uint256)", +"d64d6968": "isReferrer(address)", +"d64dc79f": "bidDkl(uint256,uint256,uint256,bytes,uint256)", +"d64e4e1b": "PKTToken()", +"d64ee8d2": "unBlockContract()", +"d64f5135": "In(address)", +"d64f86c0": "nextTransferFeeProp(uint256)", +"d64fe5ea": "getLockedWalletReleased(address)", +"d650cb2e": "forgiveMe()", +"d652818d": "ZYMToken()", +"d6528231": "FACTOR_3()", +"d6545ede": "hbtoken()", +"d6555687": "migrateUserData()", +"d655c786": "cancelOrderInternal(uint80,bool,bool)", +"d656a794": "stopForce()", +"d657ae0c": "actualTotalSupply()", +"d6582d0d": "isWeekDay(uint256)", +"d658d2e9": "hashes(bytes32)", +"d658d3ed": "setLedgerValue(string,address,address,uint256)", +"d65995ed": "attemptBeginLoanAtIndex(uint256)", +"d659afb6": "_isCooldownReady(address)", +"d659d968": "is_open()", +"d65a16c0": "isOneToken()", +"d65a4184": "tokenSaleActive()", +"d65aabc1": "t_Slava2()", +"d65ab5f2": "startGame()", +"d65b476c": "Governable()", +"d65b48fd": "ReceivedTokens(address,uint256,address,bytes)", +"d65c0035": "removeAddressFromWhitelist(uint256,address)", +"d65c8c6c": "claimDiamond(uint64,uint64)", +"d65d8876": "SitOut(address,uint256,uint256,uint256,uint256)", +"d65f86f2": "setLeed(string)", +"d6604881": "whitelistBonusLockPeriod()", +"d660521c": "depositStake(uint256,bytes)", +"d660c897": "theRichest()", +"d660ea36": "lastBlock_v1()", +"d661952a": "removePrivilegeAddress(address)", +"d6619ffb": "funds_address()", +"d661d206": "INITIAL_FOUNDER_SUPPLY()", +"d661dd31": "MULTIPLIER_DIVISOR()", +"d661f244": "getRoomName()", +"d6636307": "stateSetOver()", +"d66495cd": "getSpaceshipProductTotalSoldByModel(uint16)", +"d6649861": "tokenTransfertoACC(address,uint256)", +"d664cd89": "askMembership()", +"d6661999": "securityTokenOffering(address,uint256,uint256)", +"d6664653": "landmarkToOwner(uint256)", +"d667dcd7": "houseEdge()", +"d6680a69": "getAllIntel()", +"d6682007": "getGameNumSides(uint256)", +"d66847df": "distributeARTToken()", +"d668a461": "escapeHatch(bool)", +"d668e654": "LogTokenReceiver(address,uint256)", +"d669133f": "PotSplit(uint256)", +"d669899c": "sendLudumToSingle(address[],uint256)", +"d6699f48": "addPolicy(uint8,uint256,uint8)", +"d669e1d4": "MAX_CAP()", +"d66b0b51": "komission()", +"d66b2207": "escrowTransferInfo(address,uint256)", +"d66bd524": "reserves(address)", +"d66c7faa": "ICO_PHASE3_LIMIT()", +"d66c9cc2": "transferSenderPaysFee(address,uint256)", +"d66cac2b": "invest(uint32,uint32,uint64,uint16)", +"d66cb9e1": "renewbeginnerprotection(uint256)", +"d66d9e19": "leave()", +"d66e5726": "getWriter()", +"d66f146d": "refundPoll()", +"d66f3afa": "addEmployee(address,string,uint256[3],uint256)", +"d66fd10d": "LogVote(address)", +"d6714924": "calculateBoardScore(uint256)", +"d6721000": "addCommissionToPendingWithdrawals(uint32)", +"d6728d51": "developer_EKN()", +"d673c93b": "split(address,uint256,uint256,uint256)", +"d6740de5": "mint_for_testing()", +"d674d6a1": "RimuoviNegoziante(address)", +"d6755434": "remainingCapInWei()", +"d6757f39": "_existPlatform(bytes32)", +"d675ecbd": "addPrivateInvestor(address,uint256)", +"d67601ac": "starsRemainingToAssign()", +"d67772d3": "PennyEther()", +"d6779b01": "winningsClaimable(address)", +"d6779d6f": "isWarrantyValid(string)", +"d678724f": "getGameNumberOfEntries(uint256)", +"d6787711": "betHash()", +"d678ba48": "depositLRC()", +"d679677a": "currentTier()", +"d6798645": "set_cooldown(uint256)", +"d679c4f2": "claimDividendPercentage()", +"d67a073f": "Drain()", +"d67a10e3": "etherDelta()", +"d67a1140": "getMultiBalances(address)", +"d67a12d4": "getStrategyHiddenState(bytes32)", +"d67a1694": "getBountyChance(uint256)", +"d67a7e5f": "updateSignedDealsCountInBulk(address[],uint256[])", +"d67ae54d": "EUR(uint256)", +"d67b534e": "socialIdentityToCardId(uint256,uint256)", +"d67b9a89": "ONLY600Coin()", +"d67bf1ad": "coinBurnMkt()", +"d67bf379": "getByUser(address)", +"d67c1a7a": "finishCrowdSale()", +"d67c4497": "_approveTransfer(uint256,address,address)", +"d67c7f35": "p_update_mResaleMultipler(uint256)", +"d67c9961": "pass(uint256)", +"d67cbec9": "release(uint32,uint32,uint32,bytes20)", +"d67d0bb9": "tokenCreationMaxCap()", +"d67d3af8": "cancelRequest(address,address)", +"d67d73e0": "removeAllowedContract(address,address)", +"d67d78cd": "addCard(uint32,uint32,uint32,uint32,uint32,uint256)", +"d67f4d1b": "TittyFarmer()", +"d67fd89e": "setout(bool)", +"d6805f49": "novaTransfer(address,uint256)", +"d680914d": "SLABToken()", +"d6816cc1": "fixSpecications(uint256,bool)", +"d68199dc": "gameStats()", +"d681ffa7": "getDefinition(uint256)", +"d6820709": "beginTimeTS()", +"d6823455": "minQuanValues()", +"d682b601": "auditContract(address,bytes32,bytes,bool)", +"d6830af3": "setSettingTAOId(address)", +"d68314ea": "setReserveWeight(uint32)", +"d68352d2": "BeatTokenIcoPhase1Started()", +"d683d1a2": "markRedemptionFulfilled(bytes32)", +"d6847cd8": "getWithdrawalCoolingPeriod()", +"d68526c8": "withdrawGemmyMusic(address,uint256)", +"d68561a3": "_isOwnerOf(address,address,uint256)", +"d6858850": "AlphabetConvert(address)", +"d6872352": "sendEtherManually(address,address,uint256,uint256)", +"d6875520": "reclaimUnwantedGift()", +"d687a9b3": "_deleteAddress(bytes32)", +"d687b57e": "interSend(address,uint256)", +"d689cfe1": "_setClientPaidUpTo(address,uint256)", +"d68a9fb8": "getFreeTokensAmountOfUser(address)", +"d68c967f": "addAddressToBackEnd(address)", +"d68d961a": "ROLE_MINT()", +"d68e0ff7": "DestroyCoin(address,uint256)", +"d68e462c": "withhold(address,uint256)", +"d68e9b1e": "createGen0Token(uint8)", +"d68f30a7": "recordMoment(address,uint256,uint256)", +"d68f65f8": "SHAToken(uint256,string,string)", +"d68f6aac": "salers(uint256)", +"d68f93df": "changeBonuses(uint256[],uint256[])", +"d68fac6d": "knuckReward()", +"d68fbe5c": "testCannotGetTokensInNotInitiatedSale()", +"d6906295": "withdrawCloneTokens(address)", +"d691092a": "predictExploreReward(uint256)", +"d6914217": "getServerUserIndex(address,uint256)", +"d6916c34": "airDrop(address,uint256[],address[])", +"d6938c18": "StagebleCrowdsale()", +"d693dca2": "setAllowCnsContract(address,bytes32,address,bytes32,bool)", +"d693e17f": "internalSend(uint8,address,uint256)", +"d6940c8c": "_RemovedFromGeneration(address,uint256)", +"d69450d5": "setUUID4Bytes(bytes)", +"d6948c47": "winningTeamId()", +"d69570e2": "durationOfState(uint256)", +"d6960697": "confirmPurchase()", +"d6965ff7": "shops()", +"d696888a": "EpietherCrowdsale()", +"d697a9f1": "CooCoinToken(uint256,string,string)", +"d69932a3": "getLpBidPrice()", +"d699c00e": "transferWeiToWallet(uint256)", +"d699fe3d": "setPhase(uint256,uint256,uint256,uint256)", +"d69a0d2f": "getMostExpensiveCryptoGamer()", +"d69a1a5f": "getNextPayoutEstimation()", +"d69b6cf4": "IdolToken()", +"d69c3d30": "nextNonce()", +"d69c9275": "extraDistributionPart()", +"d69d895e": "NUM_RESERVED_COIN()", +"d69dbf63": "getIssuanceBlockTimestamp(bytes32)", +"d69dc9a5": "balance_(address)", +"d69dd156": "setInt256(int256,int256)", +"d69e37da": "doCall(address)", +"d69f13bb": "reportBenign(address,uint256)", +"d6a02bc2": "getSignedSubscribers()", +"d6a039f0": "Qbase()", +"d6a0810f": "ContractPurchased()", +"d6a0dec5": "buyTicketByOther(uint256,bytes32,bytes32,bytes32,bytes32)", +"d6a15231": "getIcedInfos(address)", +"d6a1f6a7": "breakIdUniqueness(uint256,uint256,address)", +"d6a2a596": "CrowdSale(address,uint256,uint256)", +"d6a30fb4": "start_quiz_quest(string,string)", +"d6a39db0": "lockUp(bool)", +"d6a3b623": "HONORABLE_LOSS_BONUS()", +"d6a3bc16": "finalReserveWallet()", +"d6a3f374": "dividendRate()", +"d6a43a3e": "setPermissionById(uint8,bytes32,bool)", +"d6a45623": "setAuctionsEnabled(bool)", +"d6a527eb": "share1()", +"d6a55e10": "sub_arbits(address,address,uint256)", +"d6a595ac": "payto2()", +"d6a5e546": "emergencyRefundContract()", +"d6a619e3": "transferIfPuritanical(address)", +"d6a62445": "confirmReturnToken(bytes32,string,bytes32,bytes32,uint256,uint256,uint256,uint256,uint256)", +"d6a6a520": "undoUpgrade()", +"d6a6da3e": "angelInvestorsTokens()", +"d6a75d82": "winningsClaimable()", +"d6a78004": "burnRemaining()", +"d6a83613": "bytes20ToString(bytes20,bytes20)", +"d6a90bcf": "tokenMultisigWallet()", +"d6a9c807": "_createDog(uint256,uint256,uint256,uint256,address,uint8,uint256,bool)", +"d6a9de51": "getSeller(uint256)", +"d6a9e9d1": "teamPercentage()", +"d6aab015": "getBonusPool()", +"d6abe110": "tokenDetails()", +"d6ac2394": "payoutInvestor(uint256)", +"d6ad00a9": "DOJC()", +"d6ad5e5e": "MIN_ACCEPTED_VALUE()", +"d6ae5f29": "getUsedReserveSupply()", +"d6aefb61": "setBatchTransfer(address,address,bool)", +"d6af9411": "Rouleth()", +"d6afc9b1": "getProfile()", +"d6b0f363": "OpusToken(address)", +"d6b0f484": "disableWhitelist()", +"d6b1deac": "KTOCrowdsale()", +"d6b1e4a9": "buyMinersWithEther(uint64)", +"d6b224f2": "getNextActiveBuyDetails(bytes32,uint64)", +"d6b2b242": "Realize(uint256)", +"d6b2e2ba": "PARSEC_CREDITS_PER_ETHER()", +"d6b33f59": "getNextActiveSellDetails(bytes32,uint64)", +"d6b44859": "scheduleUndoIt(uint256)", +"d6b4ec12": "getDailyWithdrawalLimit()", +"d6b52d9a": "partnerETHRewardsPercent()", +"d6b53175": "UpdatePoolState(uint8)", +"d6b5983d": "checkAmount(address,uint256)", +"d6b5abc9": "weiToPonzi(uint256,uint256)", +"d6b645bc": "react(address)", +"d6b6f9f1": "secondXRChangeBlock()", +"d6b74865": "watcher()", +"d6b7c81d": "BountyIssued(address,uint256)", +"d6b867e6": "exchange(uint256,address,uint256)", +"d6b8746d": "getConversionManager()", +"d6b8ae26": "jexp(uint256,uint256,uint256)", +"d6b8ec66": "presaleEth()", +"d6b92187": "_syncLockedDepositsAmount(bytes32)", +"d6b93d43": "fillBuy(address[8],uint256[6],uint8,bytes32,bytes32)", +"d6b94aba": "TTT(string,string,uint8,uint256)", +"d6bacb0e": "getTxRoot(bytes32)", +"d6bafa0c": "ECommercePaymentSystem()", +"d6bb0ad5": "CrowdsaleGummy(address,address)", +"d6bb358e": "LuckyBaby()", +"d6bb9eff": "getMartialCardTypeIdList(uint256)", +"d6bc1b39": "setPrices(bool,uint256)", +"d6bc1e57": "fromWei(address,address,uint256)", +"d6bd603c": "getBalance(address,address,address)", +"d6bd64fc": "test_get_expired()", +"d6bd8727": "getUrl()", +"d6be178d": "rateStage2()", +"d6be6bd5": "birth(bytes32)", +"d6bea5fd": "rangeToProposalID(uint256)", +"d6bec803": "setExpiredAndWithdraw(address)", +"d6beebf7": "buyTokens_ETH(address,uint256,uint256,bytes8)", +"d6bf28e4": "_sendMonsterPrize(uint256,address)", +"d6bf7530": "getEthDepositAddress()", +"d6bfc2d4": "oykooshi()", +"d6c0ceab": "changeBountyDeadline(uint256,uint256)", +"d6c12f88": "pricingPlan()", +"d6c1869b": "s33(bytes1)", +"d6c19fe0": "build(bytes,uint256,uint256,address)", +"d6c1be92": "gameEarnings()", +"d6c242d6": "approveViewer(uint256,address)", +"d6c2479a": "donationsAddress()", +"d6c3453c": "addTrancheRateAndTokens(uint256,uint256,uint256)", +"d6c54bf7": "destroyTokens(address,address,uint256)", +"d6c5a41e": "tier3End()", +"d6c5d823": "getScientificData(uint256)", +"d6c6f48e": "mintAgents()", +"d6c75abf": "RiskPrices(address[],uint128[])", +"d6c7b4ad": "receiver1()", +"d6c7b65b": "addInfo(address,address,uint256,string)", +"d6c8976b": "changeTokenController(address)", +"d6c8f93c": "getCooldownIndex(uint256)", +"d6c9d27a": "addCountry(uint256,uint256)", +"d6ca8ccb": "disown(bytes20)", +"d6cb56e6": "FishCoin()", +"d6cb9ec2": "viewContractState()", +"d6ccb332": "FED(uint256,string,uint8,string)", +"d6ccf7a7": "addTokenTime(uint256,uint256)", +"d6cd4a02": "listAgents()", +"d6cd9473": "renounceWhitelisted()", +"d6cf18e7": "createPiranhaTokens()", +"d6cf5297": "oracleItSetNetwork()", +"d6cfece1": "preBonus()", +"d6d02c51": "whois(string)", +"d6d0be9f": "getProductData(uint256)", +"d6d13ac0": "Split(bytes32,uint8)", +"d6d14171": "initialTimestamp()", +"d6d1b8bb": "TCLRToken()", +"d6d1f369": "Test4(uint256)", +"d6d1fc2a": "SoSoCoin()", +"d6d21dfd": "who()", +"d6d22fa4": "MetaCoin()", +"d6d25008": "coldStoreLast()", +"d6d30a51": "increaseJackpot(uint256)", +"d6d3286c": "geProposalInfo(uint256)", +"d6d329b9": "ships(uint64)", +"d6d34c7c": "coOwner()", +"d6d3e19c": "DigitalKeyCoinKO()", +"d6d4136a": "checkPos()", +"d6d5c8d5": "DEFROST_MONTHS()", +"d6d65f3d": "getCurrentMilestoneIndex()", +"d6d6945e": "doPurchase(address,uint256,uint256)", +"d6d707a6": "BaseStoreToken()", +"d6d76ed5": "status(address,bytes32)", +"d6d76fb7": "ArtCertificate(address,bytes32,string,string,string,string,string,address)", +"d6d7d525": "get(bytes)", +"d6d80f0b": "withdrawal_party_a_gets()", +"d6d86646": "UpdatePolicyState(address,string,string,uint8)", +"d6d902c4": "claimThroneFor(bytes,address)", +"d6d9266a": "setNewUseIndex()", +"d6d98ffc": "CosmicExperiencePoints()", +"d6da0805": "registerName(bytes32)", +"d6dad4cb": "BCFLeague(address,uint256,uint256,uint256,uint256)", +"d6db71e9": "allowRefund(address)", +"d6db85af": "fracExp(uint256,uint256,uint256,uint256)", +"d6db8ab6": "dividendPayouts(uint256)", +"d6dbf1c2": "getPOOL_edit_9()", +"d6dd1f0f": "ConnectLeaf(uint256,uint256)", +"d6dda33d": "isPremine()", +"d6ddbd2d": "purchaseAdv(uint256,uint256,string,string)", +"d6ddd21b": "vestingStartTimestamp()", +"d6de8dc4": "getPlayBlockNumber()", +"d6dfb77a": "getIndexToken(uint256,uint256)", +"d6e0bf29": "OwnerDeposit()", +"d6e0d73c": "mintA()", +"d6e20a56": "confirmKYC(address)", +"d6e2bcb5": "SwordMaster()", +"d6e325ae": "joinClub()", +"d6e38114": "addBet(address)", +"d6e3bb94": "addAudit(address,address)", +"d6e3dd77": "balancesImporter3()", +"d6e4ddc5": "ownerOf(address[16],uint256)", +"d6e5fe98": "setStakeRequirements(uint128,uint128)", +"d6e67215": "newCajutel()", +"d6e78eb0": "setGasMin(uint256)", +"d6e871ff": "loser(address,uint256)", +"d6e898ad": "vest2team(address,address)", +"d6e89cf0": "setTransferStatus(uint256)", +"d6e8a0b0": "incrementBid(uint256)", +"d6e95f77": "isSellable()", +"d6e9b019": "getDisputeData()", +"d6ea53b1": "changePayer(address)", +"d6ea5a0e": "distributionEntryCount()", +"d6ea8c90": "decimalOddsForOutcome(uint8)", +"d6eab9f2": "setHostFee(uint256)", +"d6eac4cd": "initTokenGrants()", +"d6eafd08": "scheduleCall(address,bytes,bytes,uint8,uint256[4])", +"d6eb1bbf": "authorised(address)", +"d6eb748c": "setRelation(address,address)", +"d6ec0065": "CHN()", +"d6ecb38a": "firstAddressFromDeployer(address)", +"d6ecff50": "Identified()", +"d6ed8f52": "addAirdropList(address,uint256)", +"d6edb047": "addAllocationPartOne(uint256,uint256)", +"d6ef25d5": "addVersion(uint64[3],address,bytes)", +"d6ef3de2": "Stocks()", +"d6ef7af0": "withdrawRewards(address,uint256)", +"d6efb030": "sendEthToContract(address)", +"d6efc8eb": "marketBuyOrders(uint256,bytes[])", +"d6effa2b": "ICOwei()", +"d6f0b484": "serverEndGame(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address,address,bytes)", +"d6f12a6a": "refundT4T()", +"d6f15469": "setBuyEnabled(bool)", +"d6f22e69": "getChecksumPairCount()", +"d6f327cc": "swapCardForReward(address,uint8)", +"d6f35eb4": "setMinAmountSale(uint256)", +"d6f3c45f": "tokenCrowdsaleCap()", +"d6f42038": "PhoneToAddress()", +"d6f4472d": "BTCS_PORTION_MAX()", +"d6f4c235": "setInstructor(string,uint256,string)", +"d6f4e56e": "allTokensSold()", +"d6f50ed6": "registrarApp(bytes32,address,bytes32[])", +"d6f5792d": "isCurrentAccountReader(address)", +"d6f5988e": "getInfoMarkTokens(address)", +"d6f5c939": "tie()", +"d6f6b6e7": "closeFailedVotingAndWithdraw()", +"d6f7ddf9": "topUp(address,uint256)", +"d6f8307f": "requesters(address)", +"d6f8560d": "withdraw_eth()", +"d6f8ecae": "time2()", +"d6fa3efa": "requiredTimeBetweenDraws()", +"d6fb1678": "mineableSupply()", +"d6fb69b9": "_sendWinnerJackpot(address)", +"d6fbf202": "startingPrice()", +"d6fc2e62": "rateProjectSecondParty(bytes32,uint8)", +"d6fd1fe9": "saleAction()", +"d6fd8822": "threeTimes(address,uint256)", +"d6fe3d6d": "afterForkRescueContractBalance()", +"d6fea306": "weiICOMaximum()", +"d6febde8": "buy(uint256,uint256)", +"d6feecde": "ret_len()", +"d700071a": "minorPartnerAddress()", +"d7003222": "unitCost()", +"d700ed39": "isStarterClaimed(address)", +"d70108a6": "getCmd_control()", +"d702087f": "setSecretSigner(address)", +"d7020b0c": "setarg_3(uint256)", +"d7020d2a": "approveEscrow(bytes16,address,address,uint256)", +"d702b63d": "for_longterm()", +"d702db81": "UserRetireHodl(uint256)", +"d702e364": "setPreICOSoldAmount(uint256,uint256)", +"d7052e17": "GotTokens(address,uint256,uint256)", +"d705763d": "Tset(uint256,string,uint8,string)", +"d705d6d7": "MainSale(address,uint256,uint256,uint256)", +"d70657ac": "getBalanceHolder()", +"d7067dc5": "crowdSalePaused()", +"d70695bb": "swarmRedistribution(address,uint256)", +"d706df8c": "BioStem()", +"d7074aaf": "GetCard(uint32)", +"d70754ec": "node()", +"d7079ee7": "startPublicsale(uint256,uint256)", +"d707d466": "allocToMember(address,uint256)", +"d7081e03": "transferAmount(address,uint256)", +"d7085e05": "SafeSend(address)", +"d70907b0": "freezeWithTimestamp(address,uint256)", +"d70925b4": "teamEthTransferComplete()", +"d70948b5": "_create_drug(bytes32,address,uint256,uint256)", +"d7098154": "claimPrize(uint256)", +"d70afa96": "FEE_ADMIN()", +"d70b6342": "minInvEth()", +"d70cf105": "moveBalance(address,address,uint256)", +"d70d2e26": "DetherTx()", +"d70d37e6": "OptedIn(address,address)", +"d70d532b": "provideAccess(address,uint8)", +"d70d9254": "isBetClosed()", +"d70d9604": "Sales()", +"d70dbf7d": "Aequitas()", +"d70e0f90": "disableAuto()", +"d70e62eb": "lowLimit()", +"d70ed38a": "withdraw(bytes32,uint256,address,address,uint256,uint256,bytes32,bytes,bytes,bytes32)", +"d70efa86": "_inRateFallEffectLimit(uint256,uint256)", +"d70fe207": "cancelOrdersOnOption(uint256,uint256)", +"d710999d": "SiliconValleyCoin()", +"d7109dda": "getCurrentSaleDay()", +"d710e2f0": "sendAllToOwner(address)", +"d710eaac": "NewWallet(address,address,address)", +"d71186b9": "Fund_Contract()", +"d7121f4b": "HolikopterToken()", +"d7123dff": "_createBuilding(uint256,uint256,uint256,uint256,uint256,uint256,address,bool)", +"d712800f": "setLockValue(address,uint256,string)", +"d712d06d": "tokenDestroyed(address,uint256,string)", +"d712eb4a": "voteWeight()", +"d7130651": "getCity(uint256)", +"d7131e5f": "createToken(uint256,address,string,string)", +"d71331c2": "getCountPlayerByTrackId(bytes32)", +"d715c8b2": "ownerHistoryCount(uint256)", +"d716222c": "is_owner(uint256,address)", +"d716e9ca": "getTotalInvoices()", +"d71710e0": "countAttributeTypes()", +"d717b05e": "exchangeLimit()", +"d71801d4": "gallerySix()", +"d7182850": "ownerTokensAllocated()", +"d7186f2b": "KNTTToken()", +"d718e763": "FinalizableCrowdsale(address,address)", +"d719213e": "preBuyPrice1()", +"d719843f": "getVendingStepPrice(uint256)", +"d71a0d7c": "HolahopxToken()", +"d71c14aa": "_isAOContentUsageType(bytes32)", +"d71c4028": "DRPCrowdsale(address,address,uint256)", +"d71cdd78": "BONUS_HI_QTY()", +"d71cf1e4": "getFee(uint256,address,address,address,address)", +"d71d3b3c": "CrowdSalePreICO()", +"d71d6cc5": "blendbacktest(uint32[],bytes32[],bytes32[],uint64[],bytes32)", +"d71d9e8a": "buyFlower(uint256)", +"d71db8aa": "getBonusPerShare(address)", +"d71df760": "oraclize_newRandomDSQuery(uint256,uint256,uint256)", +"d71e58f8": "admin_set_exchange_rate(uint256[])", +"d71e8296": "canIWithdraw()", +"d71e930c": "teamAddressTwo()", +"d71eb6ab": "recursive_store(uint32,uint256)", +"d71f1bd6": "LottesyAddress()", +"d71fcbe6": "BaseBountyContract(address)", +"d7203294": "ZeroXEth()", +"d7206124": "setInvestorLock(bool)", +"d721b0af": "batchExchange(address[],uint256[])", +"d721c760": "IssueAssigneeLoaded(bytes32,string)", +"d7228bb5": "doSucceedingTransferFrom()", +"d7237e45": "invitedByReferalBonus()", +"d723879c": "icoOver2()", +"d723b7c6": "rewardAtRound(uint256)", +"d723bb73": "fetchVoteInfoForVoterBySnapshotBlock(address,uint256)", +"d72473f3": "Added(uint256,string,address,uint256,bool)", +"d72503ba": "buyCat(uint256)", +"d725a9f0": "crowdSaleaddress()", +"d725f10d": "curse(address,address)", +"d7260cba": "refundGame(uint256)", +"d726755b": "moveFloor(uint256)", +"d726f7c7": "mainCoinSentToEther()", +"d7276479": "battlesOwner()", +"d727d64b": "disputeSettledTerminate(bytes32,address,uint8,address,uint8,bool,address)", +"d7289cb4": "FundsReturned(address,uint256)", +"d728b6db": "getCatOfferPrices()", +"d728cc72": "novaCoinAddress()", +"d7290181": "emptyWrongToken(address)", +"d7299009": "isCustomerHasACCfromWL(address)", +"d7299ef7": "pausePresale(bool)", +"d72ad259": "unlockFunds(address)", +"d72ad623": "getReferrerReward()", +"d72b11bd": "reserveWallet()", +"d72b6d3b": "CREATION_LIMIT()", +"d72bdc53": "initialize(address,string,string,uint8,uint256)", +"d72c83c0": "SmokeExchangeCoinCrowdsale(uint256,uint256,address,uint256,uint256,uint256,address)", +"d72c9391": "confirmTransactionSig()", +"d72d04db": "addGame(address)", +"d72d8dd6": "numRegistries()", +"d72dec33": "changeVaccinHistory(address)", +"d72e2b78": "soldTokensWithoutBonus()", +"d72e3de1": "createCustomReservation(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"d72e4167": "getCompte_38()", +"d72eabb8": "minimalToken()", +"d72f7958": "fortune_break_current()", +"d73019e9": "icoStartDate()", +"d7303eaf": "nicole()", +"d7304b09": "cleanupOdd()", +"d730bfe2": "RabbitCoin()", +"d7311963": "m_controller()", +"d7315d60": "totaldeposited()", +"d731a779": "removeTRA(address)", +"d732a3fa": "newRound(uint256,bytes32)", +"d732d30e": "getGamblingPartyInfo(uint256)", +"d732d955": "decrease()", +"d73478f8": "userToNumTowns(bytes32)", +"d735140d": "fourthTokenExchangeRate()", +"d7353371": "PeerLicensing()", +"d7354b49": "getBirthDay()", +"d735875d": "Start_quiz_g(string,string)", +"d735dc92": "multiAirdrop(address[],uint256[])", +"d735fa25": "wholeSaleValueLeft()", +"d7365f9b": "_purchaseMake(uint256)", +"d737035d": "holdersBonus(uint8)", +"d73792a9": "FEE_DENOMINATOR()", +"d7379999": "permissionAt(uint8,int256)", +"d737c2b0": "setContractInfo(bytes32,address,bytes20)", +"d737d0c7": "msgSender()", +"d7385abd": "placeBet(int8,int8,uint32,uint256)", +"d7397a72": "setUrl(address,uint256,string)", +"d739aaf8": "getGameInfoById(uint256)", +"d73a24fc": "canBeWithdrawn()", +"d73a2901": "setManagedVote(uint256,uint152,bool)", +"d73b0cf2": "buyerFundRelease(uint256)", +"d73b1dc9": "decreaseAllowance(address,address,uint256)", +"d73b3a67": "withdrawal_Eth(uint256)", +"d73c277c": "storageName()", +"d73cbc6b": "testLen()", +"d73cbcba": "daCall()", +"d73cedd4": "SPECTRUMZ()", +"d73dd623": "increaseApproval(address,uint256)", +"d73e0c89": "getBookCount()", +"d73ec78d": "_checkCancelAvailability(uint256,uint256,uint256)", +"d73f0b25": "lookupCampaignPart1(uint256)", +"d73f3408": "SimpleMultiSig(uint256,address[])", +"d73fe0aa": "getShares()", +"d73ff0db": "preSaleBfPlatform()", +"d740547e": "mintBonusTokensForGames(uint256)", +"d740766e": "testNoTokenTransferIfNotApproved()", +"d741e2f9": "pip()", +"d743015a": "createAssetPack(bytes32,uint256[],bytes32[],uint256,string)", +"d743ca38": "newWinner(uint256,address,uint256,uint256,uint256)", +"d7441753": "getTypicalItemById(string,uint256)", +"d7447c8c": "addCandidate(address,address,bytes32)", +"d744aec8": "getTokenBalanceInContract(address)", +"d744f2a3": "wantMyToken(uint256)", +"d744f330": "IdClaveChain(address)", +"d744f47c": "validateMessage(string,bytes32,uint8,bytes32,bytes32)", +"d744fcb8": "ClaimFeesFromSharesBought(uint256)", +"d74543f0": "communityusersCap()", +"d7463573": "getOpeningTime()", +"d746a38b": "getMicroModuleByIdPart1(uint256)", +"d7471ad2": "nemocoin()", +"d7480aa4": "AuctusEtherVesting(address,uint256,uint256,uint256)", +"d748d1f6": "revokeEditorRights(address)", +"d749eaab": "newPrimera(address,address)", +"d74a960e": "BGFTToken(uint256,string,string)", +"d74a99d4": "create(uint256,string,uint8,string)", +"d74ae98e": "redeemShip(uint256)", +"d74afaa1": "newowner()", +"d74b2722": "setRefunder(address)", +"d74be848": "maskSender(address)", +"d74c894e": "setSecurityWallet(address)", +"d74d763e": "setUCCoinPerEther(uint256)", +"d74d7e79": "calculateRewardAt(uint256)", +"d74e0d9e": "SetBanker(uint8,address)", +"d74ea11e": "addMockPendingWinner(address,uint256)", +"d74f8e9a": "getLastPayments(uint256)", +"d74f8edd": "MAX_OWNER_COUNT()", +"d7504385": "validateToAddress(address)", +"d7508a55": "prepareAuctionForNonOGChain()", +"d7517caa": "getPresaleStatus()", +"d751b8de": "Request(uint16[],string,address,uint32[],uint256)", +"d7520298": "SetfirstTTaxAmount(uint256)", +"d7522582": "isCurrentTierCapReached()", +"d752dd8e": "AFSBToken()", +"d75318f8": "SecretCoin()", +"d75320b1": "_subtractFromMintPool(uint256)", +"d7533595": "keccak_f(uint256[25])", +"d7533751": "UnvestedSkyeCrypto(uint256,string,string)", +"d75352e1": "marginCall()", +"d75446fe": "etherGet()", +"d7546da7": "Commitment(address,address,address)", +"d754a6bc": "adminResetEmail(address,address,string)", +"d754f0ac": "LOCKOUT_PERIOD()", +"d754f3d5": "currentEraIndex()", +"d75528a5": "addSpecial(uint256,uint256,uint256)", +"d7554a68": "addUser(address,string,string)", +"d7557f18": "closeCampaign()", +"d755cc4a": "buyGOP(address,string,uint256,uint256,uint256)", +"d755e021": "getPlayerShipBattleById(uint64)", +"d7560f2b": "numRewardsUsed(address)", +"d7575592": "addr_teamPartToken()", +"d757579e": "XxxTokenSale()", +"d7578295": "Cashpayz()", +"d75b2b18": "takeCollateral(address)", +"d75b363f": "userRewardCount(address,address)", +"d75b5d9d": "RAFEND()", +"d75b80cc": "a_incognita(uint256)", +"d75d93f6": "registerMeOnToken(address,uint256,string)", +"d75de4ab": "isAddressInWhitelist(address,address)", +"d75e30cf": "drawFee()", +"d75e662f": "OverpayRefund(address,uint256)", +"d75e7afd": "calDivs(address,uint256)", +"d75e87ef": "PersonalInfoAdded(address,string,string,string,string,string,string,string)", +"d75ebde2": "joinGameFromBalance(uint256)", +"d75f0dd6": "SixtusToken()", +"d75fabb0": "RewardOffer(address,address,bytes32,uint256,uint256,uint128,uint256)", +"d7604a78": "modifyWhitelist(address,uint256,uint256,uint256,bool)", +"d7625c88": "hasMigrated(address)", +"d762755d": "minimumContributionWeiByOneInvestor()", +"d7638b73": "phase2Cap()", +"d763f92d": "FintechChain()", +"d7642ae2": "COIN_COST_ICO_TIER_3()", +"d7643e18": "protoCount()", +"d7651471": "Notes()", +"d7655b98": "OmixToken(uint256)", +"d7669119": "NewPrice(uint256,string)", +"d767aee0": "bbb()", +"d767e0d6": "SoldToCustomer(string,string)", +"d767ee4d": "updateLogic(uint256)", +"d7682701": "_cancelPermissions(address,address[])", +"d768729d": "getRecentDiary()", +"d7688d31": "destEthFoundationDev()", +"d7689460": "CryptoRex()", +"d768d95b": "finaliseContract()", +"d768d95e": "fetchVoteMainInfoForVoterBySnapshotBlock(address,uint256)", +"d768dd4b": "Stage3Allocation()", +"d769ae1b": "SLCAdvancedToken(uint256,string,string)", +"d769f32a": "mulXY(uint256,uint256,uint256)", +"d76a0cb8": "HybridBlock()", +"d76a130a": "TokenCDCQ(uint256,string,string)", +"d76a69e2": "Fund(address,address,address,address,address,address,address,address,address[])", +"d76b6095": "phase1Rate()", +"d76bce7c": "dropEth(address[],uint256[])", +"d76d6ee0": "query(bytes32,bytes2,int256)", +"d76dc2eb": "LOCKAMOUNT1()", +"d76dc656": "GDCAcc02()", +"d76dddd3": "unfreezeTime()", +"d76e5765": "getUserIpfsFromId(uint256)", +"d76f288f": "metaBurnHash(address,uint256,uint256,uint256)", +"d76f94aa": "toAlphabet(uint8[])", +"d7717750": "tokenLogic()", +"d7723231": "getIcoPurchase(address)", +"d772ddc0": "setProcessorAddress(address)", +"d7730236": "maxEthRaised()", +"d7734855": "getDiff(uint256,uint256)", +"d77371e0": "GoodDayToken()", +"d7744b9f": "getReferee(uint256)", +"d774c038": "multisend(address[],address)", +"d775db2a": "testThrowsSaleWalletIncorrectMultisig()", +"d7760500": "partnersRelease()", +"d7768c47": "prepare(bytes)", +"d77727de": "seeOwner(uint256)", +"d7777c29": "startPreICOStage1()", +"d77844f6": "isLimitationPeriodActive()", +"d77849c7": "tokenTakeback(address,uint256)", +"d778610e": "updateStateWithPrivateSale(uint256,uint256,uint256)", +"d7787f33": "setUpgradeContract(address,address)", +"d7789a9f": "unsetEndorsement(address,uint256)", +"d778c911": "price3()", +"d7790c11": "waipaytoken()", +"d7796915": "checkWithdrawValueFX(uint256)", +"d779ca24": "payoutBonusesToHolders()", +"d77a39c9": "addPresaleTokens(address[],uint256[],uint256)", +"d77a80a8": "lastFunder()", +"d77a86a0": "sendTo(address,uint64)", +"d77ac32d": "discountSum(uint256)", +"d77b0ff7": "keyAtIndexHasNext(uint256)", +"d77bd1ae": "ProposalAdded(uint256,address,string)", +"d77bf0cf": "CONFIG_PRICE()", +"d77c96f8": "mainICOThirdWeekEndTime()", +"d77d0012": "getBankPercent()", +"d77d3f79": "KoaStandardToken(uint256,string,uint8,string)", +"d77da4f4": "withdrawToTeam(uint256)", +"d77e2f55": "pendingEtherForCroupier()", +"d77e8986": "isExistsEscrow(bytes16,address,address,uint256)", +"d77ec4a4": "executeWithdrawTransaction(uint256)", +"d77fc50f": "checkZeroValue(uint256)", +"d77ff9ea": "eventCardRangeMin()", +"d7800fa2": "PurchaseRegistered(bytes32,address,uint256)", +"d7815ba4": "shareholdersHolding1y()", +"d7816f45": "transferlocked()", +"d781be46": "endDatetime()", +"d781d0f4": "YaoToken(uint256,string,string)", +"d781f3f4": "FootScoutCrowdsale()", +"d781fbf9": "removeERC223(uint256,address,uint256)", +"d78235cf": "setconfigurationEtherPrice(uint256)", +"d78276c6": "withdrawERC20(uint256)", +"d782cc54": "setNewBonusLevel(uint256,uint256)", +"d782d647": "createdTokens(uint256)", +"d7837ec9": "withdrawNonTop(uint256)", +"d783aacf": "ItalyToken()", +"d783b53b": "addSupporter(address)", +"d784601a": "myEthBalanceOfNoFee()", +"d784d426": "setImplementation(address)", +"d78506ce": "RoyaltysOwing(address)", +"d785c19c": "worldCupResultPart1()", +"d785e5c9": "m_isCirculating()", +"d78724d6": "getUserContractCount(address)", +"d7872745": "GumToken()", +"d788a945": "_isLongitude(int256)", +"d7892b6a": "changePeaceRelayAddr(address)", +"d789479d": "celtic_cross()", +"d78996d8": "getUtilizationAndAnnualBorrowRate(uint256,uint256)", +"d789b4c1": "uintMax(uint256)", +"d78b16a1": "emitTokens(uint256)", +"d78c15d9": "isPromoted()", +"d78c20ff": "voteApprove(uint256)", +"d78cb1b2": "buyXgoldTokens(address)", +"d78d610b": "getRecipients()", +"d78db648": "multStore(int256)", +"d78e1bb1": "teamPot_()", +"d78ed508": "getShipProductStartPriceByModel(uint16)", +"d78efa67": "addrecruit(uint256,uint256)", +"d7901260": "closePreICOPrivate()", +"d7901645": "GetDappinfo(string)", +"d790dce7": "endOfSaleFullWithdrawal()", +"d79185d7": "StartGuess_wis(string,string)", +"d791de63": "unlock(address[])", +"d791ed7a": "BaoBaoToken(uint256,string,string)", +"d792b356": "teamTokenAllocation(uint256)", +"d793f7a9": "preICOamountBonusMultipierInPercent(uint256)", +"d7942050": "Setuppresale(uint256,uint256)", +"d79521e8": "getPokemonDetails(uint256)", +"d7955eaf": "Santal()", +"d7959cf9": "ipfs()", +"d7963f94": "changeOwners(address)", +"d7982a6c": "unlockEscrow()", +"d7984cff": "CappedAndBurnableToken(uint256)", +"d79875eb": "sell(uint256,uint256)", +"d7988c98": "makeGrant(address,uint256,uint256,uint256,uint8)", +"d7989a93": "advancedTokensPerEth()", +"d79941d8": "getQueryRandomCallbackGas()", +"d79964c3": "addDeprecation(uint256,address,address,address,uint256,address)", +"d79b5bc6": "DonationSentButNotMatched(address,uint256)", +"d79bd499": "retrieveBalance()", +"d79c1f7f": "batchReclaimExpiredSwaps(bytes32,bytes32[])", +"d79cb6fd": "buyScams()", +"d79d5c7a": "COMPANY_TOKENS_PERCENT()", +"d79d63be": "getCardPrice()", +"d79d8e6c": "set(bytes32,address,bytes32)", +"d79e1e7d": "sumElements(uint64[])", +"d79e3755": "totalPromo()", +"d79e5de8": "HeliumToken()", +"d79e7894": "isAfterICO()", +"d79f5678": "DazzioCoin()", +"d7a084e0": "isWhiteListGame(address)", +"d7a08641": "checkCanRelease(bool,uint256,uint256)", +"d7a10acb": "balances2(uint256)", +"d7a1192d": "STAGE3_TIME_END()", +"d7a14a05": "totalAmountOfEarlyPurchases()", +"d7a15951": "winnerReward(address,uint256)", +"d7a17187": "ico2Raise()", +"d7a1cfe1": "addFriend(address)", +"d7a23fd4": "getActivityCount(uint256)", +"d7a42b54": "isEntity(uint256)", +"d7a4a09d": "detectJanuary(uint8)", +"d7a58658": "changeHouseedge(uint8)", +"d7a5afcf": "holderPartnershipsTokens()", +"d7a5f278": "slashInvalidUsername(bytes,uint256)", +"d7a5fdee": "DGPTokenOldContract()", +"d7a66ebe": "readContent()", +"d7a71868": "setManualPrice(uint256)", +"d7a78db8": "freeze(uint256)", +"d7a8560f": "invoicesStackCount()", +"d7aa6d74": "ShitCloneFarmer()", +"d7aa8273": "getTransactionInfo(uint256)", +"d7aa89b8": "storageOracle()", +"d7aae0e6": "executeProposal(uint256,address)", +"d7ab2770": "fetchGiven(address,bytes32)", +"d7ac79ba": "deleteHeir(address)", +"d7ad28ec": "GSMulti(uint256,uint256)", +"d7ad4931": "buyNow(bytes32)", +"d7ae339b": "ForecastChainToken()", +"d7ae76b6": "DING()", +"d7af26f8": "getPlayersBalances()", +"d7b03000": "resetCards()", +"d7b0a358": "shiggidyToken()", +"d7b0ca65": "last50plusblokhack()", +"d7b0e692": "set_new_admin(address)", +"d7b11125": "pwr(uint64,uint64)", +"d7b12454": "checkContract(address)", +"d7b12f38": "PRICE_STAGE_TWO_BONUS()", +"d7b15a88": "getLockedFundsLastSpending()", +"d7b1b9c4": "foundationTokensAllocated()", +"d7b1bb22": "cadastrar(bytes32,uint8,bytes32,bytes32,int256)", +"d7b2aae6": "setContactInfo(string)", +"d7b2f360": "getEncounterDetails()", +"d7b32f5f": "GetPrivateSale()", +"d7b33f66": "updatePercentToTakeAsSeed(uint256)", +"d7b33f94": "PRE_ICO_AMOUNT()", +"d7b40107": "auctionByAssetId(uint256)", +"d7b4750c": "getFunder(uint256)", +"d7b4a7f6": "MinerOneCrowdsale(address)", +"d7b4c9b1": "lookupKittyDetails1(uint256)", +"d7b53081": "closeSaleAnyway()", +"d7b5507d": "blockchaincertified()", +"d7b701b6": "SarahCoin()", +"d7b7024d": "approvedWithdrawAddresses(bytes32)", +"d7b7913b": "f3(uint256)", +"d7b7961c": "getPairHash(address,address)", +"d7b84f68": "moveDataContractBalanceToWorld()", +"d7b8cdf4": "MinimumContributionChanged(uint256)", +"d7b8de00": "setMaxCollectable(uint256)", +"d7b91bcc": "buyTokensICO()", +"d7b96d4e": "locker()", +"d7b97db1": "setDistributionTime(uint256)", +"d7b9cc24": "setCasino(address)", +"d7ba30b2": "rateAirDrop()", +"d7ba42fc": "addActionAccount(address)", +"d7ba95ca": "share2()", +"d7baa041": "PublicLayer()", +"d7bb913f": "accountTokensPurchased(address)", +"d7bb99ba": "contribute()", +"d7bbce2a": "setOrCacheDesignatedReportStake(uint256)", +"d7bc23af": "newParameters(int256,uint256,uint256,uint256)", +"d7bd6d0d": "addExchangeAccounts(address,address)", +"d7bd8987": "testTransfering()", +"d7bdaaa6": "WLMWallet()", +"d7bdc3fa": "addVolumeDiscount(uint256,uint8)", +"d7be503f": "_tokePerEth()", +"d7be708c": "BoulePreSale(address,uint256,uint256,uint256,address)", +"d7be8ceb": "performFetch()", +"d7bea56a": "totalExcessEth()", +"d7bfc8c5": "BabyDragon()", +"d7c01c3e": "SetTakePot(uint256)", +"d7c0302e": "numOfCitizensWhoReceivedDrops()", +"d7c06439": "AriumToken()", +"d7c06919": "getAuctions()", +"d7c0d42d": "ControlledToken(uint256,string,uint8,string)", +"d7c0f72b": "getTitulaire_Compte_5()", +"d7c23572": "historyTimesPlayed(address)", +"d7c23578": "addSig(bytes32,bytes32,bytes32,uint8)", +"d7c26adb": "oraclize_setProof(bytes1)", +"d7c2a887": "MANAGEMENT_FEE_RATE()", +"d7c35657": "EthsqrGate()", +"d7c39cc6": "totalSellingItem()", +"d7c482ef": "Defroze(address,bool)", +"d7c48e2b": "preseller()", +"d7c4e7ac": "HarlleriumCoin()", +"d7c4f9d3": "SignatureAdded(string,string,uint256)", +"d7c5b986": "LogContribution(uint8,address,uint256)", +"d7c61e7b": "CreateSaleAvgPrice(uint256,uint256,uint256,uint256,uint64,address)", +"d7c7159c": "buyWithKYCData(bytes,uint8,bytes32,bytes32)", +"d7c74279": "deployChildren(address)", +"d7c8112d": "WithdrawAllFunds(uint256)", +"d7c81b55": "gameId()", +"d7c81fdc": "MSCCStandardToken(uint256,string,uint8,string)", +"d7c8843b": "getEggsSinceLastHatch(address)", +"d7c8e90c": "voteAmendment(uint256)", +"d7c8f959": "CreateEmployee(address,uint32,uint32,uint16)", +"d7c94efd": "teamFee()", +"d7c97fb4": "erc721Contract()", +"d7c9a0e3": "getMyMoney()", +"d7ca01b5": "confirm(address,uint256)", +"d7ca20e6": "HashStore(uint256)", +"d7ca3a90": "CelebrityMarket(address)", +"d7ca7cc5": "changeLockingPeriod(uint256)", +"d7ca9949": "totalSoldTokens()", +"d7cb55a2": "AToken()", +"d7cbac05": "BONUS_ICO_STAGE1_PRE_SALE1()", +"d7cbbb73": "getAllCardsAddress()", +"d7cc43bf": "aSetStart(uint256)", +"d7cc8362": "isLatestMajorTree(bytes32,bytes32)", +"d7ccc2c3": "getLastPayment()", +"d7cd6c13": "burnFundAccount(address,uint256)", +"d7cd7209": "newGroup(address,bytes32,address[])", +"d7ce330b": "Deco()", +"d7cea877": "monthStr(uint256)", +"d7cee31e": "houseAddress()", +"d7cf1d20": "HDT_Token()", +"d7cf61d7": "assertSignedByBoth(uint256,bytes32,uint8,bytes32,bytes32)", +"d7cf7bcb": "purchaseSafe(uint256,uint256)", +"d7cff986": "submitAnswerCommitment(bytes32,bytes32,uint256,address)", +"d7d0afa4": "_fetchCreatedOrdersForMerchant(address)", +"d7d12297": "taskTotalBalance()", +"d7d15059": "functionName()", +"d7d1b48c": "_setWingsValue12(uint256)", +"d7d1bdbd": "getUnsoldOwner()", +"d7d23155": "owner_linkage()", +"d7d29315": "drawReuslt(uint256,address[],address[],uint256,uint256,uint256)", +"d7d319e4": "CWCreturnQuery()", +"d7d3c4d5": "pvpContenderRemoved(uint256)", +"d7d40523": "HardwareWallet()", +"d7d43b41": "MoedaToken()", +"d7d49532": "lastBlock_a9()", +"d7d5878d": "revokeSchedule(address,address)", +"d7d7442f": "updateThreshold(uint256)", +"d7d7be34": "oraclize_query(string,bytes[1])", +"d7d88043": "endSaleDate()", +"d7d8cdd5": "addTRA(address)", +"d7d90fb1": "ClearCLevelSignature()", +"d7d96a12": "StarToken()", +"d7d9fef0": "scheduleTimelock(address,uint256,uint256)", +"d7dae83c": "active_withdraw(address)", +"d7dbb88b": "getn2Exception(bytes32)", +"d7dbdbe3": "setVicepresidenteDeMesa(bytes32,uint256,bytes32)", +"d7dc6203": "calculateInterest(address,uint256)", +"d7dcaa19": "BuToken()", +"d7dccb1e": "EthSplit(address[],address)", +"d7dd2ae3": "ValidateCitySnapshotInternal(address,uint256)", +"d7dd8652": "refundCrowdsale()", +"d7dde189": "StartupToken()", +"d7de57c6": "challengeWithFutureCustody(address,uint256,bytes32[],uint256[],bytes32[])", +"d7de9c6e": "setOracleQueryString(string)", +"d7df7ef9": "_createWonder(address)", +"d7dfa0dd": "logic()", +"d7e07d5f": "destTokensReserve()", +"d7e0b6e3": "registerUser(address,bytes32)", +"d7e0d83d": "setPrvd(address)", +"d7e0e776": "getBalanceOfInstance()", +"d7e11e9d": "AddTicket(bytes)", +"d7e25c36": "isCapReached()", +"d7e2f000": "preallocationsWhitelist()", +"d7e30832": "TankTransfer(address)", +"d7e31d67": "setRewardChance(uint256)", +"d7e3aab2": "VestedMultisigWallet(address[],uint256,uint256)", +"d7e44b89": "splitPay(address[],uint256,address)", +"d7e4e1f7": "setSail(uint16,uint16,bool)", +"d7e5c07d": "allocateTokens(uint256,uint256,address)", +"d7e64c00": "investorCount()", +"d7e7088a": "setUpgradeAgent(address)", +"d7e751ff": "tokenWithdraw(uint256)", +"d7e8015a": "FuckToken(uint256,string,uint8,string)", +"d7e84fbf": "builder()", +"d7e8553a": "_deleteValidator(address)", +"d7e9ec6e": "RemovedBlackList(address)", +"d7ea39c6": "referralDone()", +"d7ea977b": "V1ChainToken()", +"d7ea97e2": "setBTHFoundationWallet(address)", +"d7ead1de": "right74(uint256)", +"d7eae6db": "setUnPauseEmergence()", +"d7eaef90": "LGTToken()", +"d7ebf53d": "countActiveCastle()", +"d7ec1fac": "CrowdSaleTokenSoldout()", +"d7ecb5e3": "MINI_GAME_BETWEEN_TIME()", +"d7ecba0c": "numBarriersPerBoard()", +"d7ecc129": "supplyTo(address,uint256)", +"d7ed3fb1": "get_participant_topl_address(address)", +"d7ed7453": "redeemWinnings(uint256)", +"d7edddb2": "withdrawAdministratorMoney(uint256)", +"d7edf88c": "replenishEth()", +"d7ef1356": "best_adjustment(bool)", +"d7ef4a04": "CreateCredoIco(address,uint256)", +"d7efbf34": "transition()", +"d7f08eed": "unlistSubName(bytes32)", +"d7f0d86b": "attackUnit(uint256,uint256)", +"d7f0df73": "Betcash(uint256,string,uint8,string)", +"d7f0f01b": "fund(uint8,uint8,uint8)", +"d7f31eb9": "forward(address,uint256,bytes)", +"d7f3c770": "Mesut()", +"d7f42ee2": "getBBLibVersion()", +"d7f56ef7": "partnershipsTokenAddress()", +"d7f59fd0": "tgeSettingsBlocksPerStage()", +"d7f5b43e": "setCapacityByIndex(uint256,uint256)", +"d7f6f81c": "getProviderBadge(address)", +"d7f746ce": "tickingBomb()", +"d7f7582c": "totalCapitalization()", +"d7f7f3aa": "markTransferTokens(address,uint256)", +"d7f8a053": "TokenRate(uint256)", +"d7f9d655": "Divies()", +"d7fa1007": "setHash(bytes32,bytes32)", +"d7fa445e": "claimBidReward(uint256)", +"d7fb4f1d": "endTime_()", +"d7fb5ef5": "angelSupply()", +"d7fb7427": "transferNewCoin(address,uint256)", +"d7fb8dc0": "messageForReason(uint8)", +"d7fc1b9b": "register(string,string,bool)", +"d7fc23a2": "createNewAsset(string,string,uint256)", +"d7fc98c3": "subscribeIndividual(bool)", +"d7fd00b0": "TEAMS_PER_ENTRY()", +"d7fd0e77": "requestTime()", +"d7fe270e": "multipleTokensSend(address[],uint256[])", +"d7febcb9": "TestUserBitFlag(address,uint256)", +"d7ff4d7a": "WODECESHIBI(uint256,string,uint8,string)", +"d7ffbbaa": "setInformation(string)", +"d8013c4e": "addNote(bytes32,bytes20,string,string)", +"d80162fc": "setRecommendStatus(bool)", +"d8018c42": "getReleaseTimes(address)", +"d801aa84": "isWalletFromUser(string)", +"d8020a18": "marketingPercent()", +"d80326a9": "VentanaToken()", +"d80364ba": "LogRegister(address,string)", +"d8047a07": "RobotChain()", +"d80528ae": "stats()", +"d8055812": "votesDecline()", +"d8058712": "UnicornAccessControl(address)", +"d8063ea6": "addDelegate(address,address,string,address,uint256)", +"d8070c40": "IcoPrice()", +"d807a688": "wper(uint256,uint256)", +"d8085306": "mintTokensForSecondStage()", +"d8085f78": "ownerCanClaimCard(address,address,address[3],uint256)", +"d8085fee": "multiMerge(address[])", +"d80866da": "isValidZ(uint16)", +"d8090cbf": "resetReclaim()", +"d809d248": "startNextGame()", +"d80a5c3b": "MyContribution()", +"d80ad1ed": "getSponsorshipProportionalAmount(address,uint256,uint256)", +"d80aea31": "_setCreatedBlockOnRevealsPhase(uint256,address,bool)", +"d80b1a68": "createAndEndowC1(uint256,uint256)", +"d80b2056": "emptyWrongEther()", +"d80cc340": "retainBalance()", +"d80d3025": "changeBonusSystem(uint256[],uint256[])", +"d80d9c55": "changeSecondsInBlock(uint256)", +"d80e821c": "reevaluateICO(uint256)", +"d80e8700": "CurrentTime()", +"d80ffb20": "drawNumber()", +"d8104e19": "GetMyEarning()", +"d810f298": "computeSettlementAmount()", +"d81111ab": "BuyTokens()", +"d8112523": "sendIncentive()", +"d811b100": "getHouseAddressOne()", +"d811b7ca": "transferToOtherBucketContract(address)", +"d811f09e": "ownershipTransferAllowed()", +"d811fcf0": "farmer()", +"d81230c8": "shareactive()", +"d812d961": "getSanName(uint256)", +"d812f2b0": "setDelegadoDeEscuela(bytes32,uint256,uint256)", +"d8132807": "_getMinAuctionStartPrice()", +"d8134a23": "removeAcceptedToken(address)", +"d813b4b9": "setArtIdt(string,string)", +"d8145062": "squirrelmasterReq()", +"d8148166": "DistributionMint(address,uint256)", +"d81494ba": "blacklist_addys(address[])", +"d8149fe7": "dive1(address)", +"d814ebed": "TruUpgradeableToken(address)", +"d8152cbc": "createBalanceSnapshot()", +"d815fa30": "ERC20Token(uint256,string,string,uint256)", +"d816187f": "PreIcoWallet()", +"d8162db7": "lockedUntilBlock()", +"d8174150": "MAX_PRESALES_EXTENSION()", +"d8175101": "ownerHasCardSimple(address,address)", +"d81849b8": "additionalTokenRate()", +"d818eb63": "Fundraiser(address,address,uint256,uint256,uint256)", +"d818ecee": "setDisputed(address,string)", +"d81a91e9": "get_party2()", +"d81ab0c1": "invoke(uint256,address,address,bytes)", +"d81ad101": "IMPACT_REGISTRY_ADDRESS()", +"d81b1020": "setForceContract(address)", +"d81c2232": "icoPhase2TimeBonusInPercentage()", +"d81c6741": "removeAddressFromBonuslist(address)", +"d81d5062": "relayBuyerCancel(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32)", +"d81d8f89": "getSalaryTokensTotalValue(address)", +"d81dd9f7": "destroyGame(uint256)", +"d81dfe30": "LOCKED_TIME()", +"d81e8423": "get(address,address)", +"d81efdc4": "euroCentsInOneEther()", +"d81f53fd": "EtherId()", +"d81f84b7": "getAddr(uint256)", +"d81f9830": "BONUS_WINDOW_2_END_TIME()", +"d8207301": "MyWishCrowdsale(uint256,uint256,uint256)", +"d820ab95": "secondStageReserve()", +"d8211b0d": "BENZCoin()", +"d821b9f9": "initialAllocations(address)", +"d8220323": "setLoto(address)", +"d82277cc": "createInvestment(address,uint256)", +"d823eec9": "TEAM_TOKEN_CAP()", +"d825b510": "addDisagree(bytes32)", +"d825ebc3": "calculateMinting(uint256)", +"d826505d": "isEthNoEnc(uint16)", +"d8267fef": "letItRain(address[],uint256[])", +"d826853e": "sellKeys(uint256,uint256,string)", +"d826f88f": "reset()", +"d826fdf1": "checkRefundExistanceByOwner()", +"d8270dce": "creationTime()", +"d82745c8": "withdrawCooldown(address)", +"d828435d": "getNonce(address,address)", +"d8291e97": "CHELSCOIN()", +"d8294ede": "minimumTimeout()", +"d82974f8": "moveUnsoldTokensToFoundation()", +"d829f1e0": "blendWithOthers(address,uint256,uint256,uint256)", +"d82a6d56": "isOBR()", +"d82b394f": "createShip(uint256)", +"d82beb9e": "sender_enode()", +"d82c6df4": "inactivate()", +"d82ce857": "getPI_edit_26()", +"d82e3962": "calculateReward(address)", +"d82ed7eb": "unwhitelistAddressPresale(address)", +"d82f6a3f": "maxWeiInvestment()", +"d82f94a3": "deleteMinter(address)", +"d82fa3f1": "doInvest(address)", +"d831a158": "ownerCtuContract()", +"d831b714": "withdrawDeklaBalance(address,bytes)", +"d832d0c8": "isFoundation(address)", +"d833590f": "totalSupplyPretty()", +"d833c736": "tripleRoomMax()", +"d833dbe9": "preSaleRate()", +"d834e619": "min(uint256[])", +"d834f1e8": "setConfiguration(string,string,uint256)", +"d8353b75": "vestingDateEnd()", +"d83616b2": "TokenSaleLockTransfer(uint256,uint256,uint256)", +"d83623dd": "startDistribution()", +"d83671b7": "addLock(address,bool)", +"d83678ac": "tradeToken()", +"d8367d41": "startIncomeDistribution()", +"d836b12d": "getInvestorTokenPercentage(address,uint256)", +"d836f06a": "VestingKYCSetted(address,uint256)", +"d836f794": "sellKebabs()", +"d836fbe8": "changeHatchEscapeCaller(address)", +"d8377b20": "buyAndSetDividendPercentage(address,uint8)", +"d8381df0": "createCastle(uint256,string,uint64,uint64,uint64,uint64,uint64,uint64)", +"d8389dc5": "hash(bytes32)", +"d8392c92": "WithCoin()", +"d83a223a": "changeFounderWalletAddress(address)", +"d83a7f67": "getDepositAddress(address)", +"d83a8d11": "testProposing()", +"d83aabbe": "getWagerCount()", +"d83c68b9": "Pilendthereum(uint256,string,string)", +"d83cb681": "getMixer(bytes32,uint256)", +"d83d2afc": "leftoverWeiAmount(address)", +"d83edd70": "refundEth(address)", +"d83f24a2": "multiMerge(address[],uint256[])", +"d83fcfa3": "TMN()", +"d8412808": "HazzaTokenInterface()", +"d84201bf": "buy5()", +"d8420e3a": "_isValidWithCompositions(uint256[],uint256)", +"d8436663": "destroyIBTCToken(address,uint256)", +"d8439165": "upgradePonyResult(uint8,uint256)", +"d843dcbb": "ELF()", +"d843e40a": "getRoundNum()", +"d843e721": "convertToATK(uint256)", +"d844a0fa": "TierionNetworkToken()", +"d845a4b3": "request(uint256)", +"d8460e8c": "Menu09()", +"d8464746": "getEyesValue(uint256)", +"d847e48f": "BlingTokenSale()", +"d8485ed6": "FCOIN1519Token(uint256,string,string)", +"d84891da": "EM122()", +"d8489a81": "MaxDistribPublicSupply_()", +"d848dee7": "setDeprecated(bool)", +"d8493983": "GroverBucks()", +"d849eeba": "gotResult()", +"d84acf20": "restoreAllTempTokens(uint256)", +"d84bd737": "xcc()", +"d84cb6ad": "ETH_Rate_Factor()", +"d84d2a47": "spreadMultiplier()", +"d84d95ba": "confirmMultipleTransactions(uint256,uint256)", +"d84dbdc3": "verifyInvestor(address)", +"d84f93cb": "priceOfOfficalCardSold()", +"d84fdbed": "getSponsorships(address,address,bool)", +"d850288b": "etherlist_top()", +"d8507a8d": "unfrezee()", +"d851eb5d": "betPlaced(address,uint256)", +"d8523fc2": "askForMatch(uint256)", +"d8526677": "MintMasterTransferred(address,address)", +"d852748c": "totalPoolOptions()", +"d8528af0": "allowedSpenders(address)", +"d85349f7": "cliffDuration()", +"d8542d51": "oldTokenAddress()", +"d8550112": "putServerAddress(string,address,uint256)", +"d855c059": "setExtraConfig(uint256,uint256,uint256,uint256,uint256)", +"d85633ec": "releaseOwnership()", +"d8567213": "chargeAll(uint256)", +"d856cbae": "ICOMinTresholdReached(uint256,string)", +"d8574e16": "addressD()", +"d857561d": "enableWithdrawal()", +"d8578d14": "showPlayerSafeById(uint256,uint256)", +"d857eba6": "getTagAt(uint256)", +"d8583895": "getNumberOfDeposits()", +"d85874b9": "badgerAmount()", +"d8589be3": "CoinFlipper()", +"d858b5c8": "order_sell(uint256,uint256)", +"d858ebf4": "createVisaOffering(uint256,bytes32,bytes32,uint256,uint256,bytes32)", +"d8590f93": "clearingPrice(address,bytes32)", +"d8592d79": "closeWormhole()", +"d85a82f6": "processDIVD()", +"d85b07e0": "stopIcoAndBurn()", +"d85b228e": "testCreateGame(string,string,bool)", +"d85b559f": "startSelection()", +"d85ba798": "getCutieId(bytes)", +"d85bd526": "running()", +"d85c8966": "ownerTransfer(address,uint256)", +"d85d3d27": "mint(string)", +"d85d656f": "getSMPTokensAmountPerWei(uint256)", +"d85d6d41": "finishLocking()", +"d85e2d20": "b(address,uint256)", +"d85e5486": "privateCap()", +"d85e88db": "item(address,uint256,bool,bytes)", +"d85edab6": "m_investors(uint256)", +"d85f4450": "numberOfWins()", +"d860ced1": "TIER1END()", +"d86123e1": "setMany(address[])", +"d8615e5b": "transferAndPay(address,uint256,bytes)", +"d86202cb": "getUserProductAtIndex(bytes32,uint256)", +"d8627542": "intialSupply()", +"d862b611": "extraMint()", +"d8632388": "allPlayCount()", +"d8632ae3": "sign(uint8,bytes32,bytes32)", +"d863f7f4": "DigiPeso()", +"d86491fc": "testReentracy()", +"d864c322": "changeAccountStorage(address)", +"d864e740": "committee()", +"d8650f49": "tokenGenerationLock()", +"d865897c": "_getHashKey(address,uint256)", +"d865a374": "instruct_1()", +"d865ae9b": "hasRole(address,bytes32,bytes32)", +"d865dc4f": "tokensSoldCount()", +"d8674554": "tokenTransfertoKYC(address,uint256)", +"d867bb25": "getONG(bytes32)", +"d8682e69": "returnTimeLeft()", +"d86892a7": "setSellerGuarantee(uint256)", +"d868c718": "scheduleFight()", +"d8690c22": "isAvailableLockSlot(address,uint256)", +"d8692f17": "calcMerkleDefault(bytes32[],uint256,uint256,bytes32)", +"d869c681": "issuedTokenBalance()", +"d869d86d": "getAmountsForChangeWeight(address,address,uint256)", +"d86afbbb": "giveItem(address,uint256)", +"d86b2982": "numbersCount()", +"d86b3721": "getblock()", +"d86b8739": "redeemedTokens()", +"d86bc1b0": "cancelByAdmin(uint256[])", +"d86c31e5": "BOXSToken(address,address,int256)", +"d86c5bf7": "angelWheelFinanceSupply()", +"d86df333": "deleteAccounts(address,address,address[])", +"d86e1850": "AuditBalances()", +"d86e762d": "getTotalAmountRaised()", +"d86e79c3": "createFixedPeriodVpfFactory(string,bytes32,uint256,uint256,int256[],uint256,uint256,uint256)", +"d86eb3b7": "reservedTokensAddress()", +"d86ec25a": "setNotaryParcel(uint256)", +"d86f26f2": "BigBucksToken()", +"d86f8ccd": "getAccountLockState(address)", +"d86fb89d": "updateRoundsInformation(uint256)", +"d871e94b": "tokenClaimWaitingPeriod()", +"d8730ef2": "getMaxCommunityTokens()", +"d8737d8a": "buyEthUnit(uint256,uint256)", +"d873f0d6": "tokenSaleMin()", +"d874082a": "fundtransfer()", +"d8743fad": "weiMinContribution()", +"d87522ae": "pauseEnd()", +"d8754716": "createNewTankHull()", +"d87574e0": "airDropPot_()", +"d87624ba": "buyGrimReapersAgainstEther()", +"d87692d9": "transferAllAndCall(address,bytes)", +"d876c9c0": "SECOND_AUCTIONS_INITIAL_PERCENTAGE()", +"d8772e79": "get_transaction_count()", +"d8774d99": "restrict(bool)", +"d8783b04": "PRICE_MULTIPLIER_ICO6()", +"d8787fde": "nextContract()", +"d8788e68": "getTokensForSaleCap()", +"d879380d": "timeoutRegistration()", +"d879914a": "getBidsLength()", +"d879e911": "JORDAN()", +"d87a253b": "registerNameXnameFromDapp(address,bytes32,bool)", +"d87adaa0": "registerPubKey(address,bytes)", +"d87b5c29": "getSpawnCount(uint32,int256)", +"d87bc4cd": "WEGC()", +"d87bca3f": "VictorieumToken()", +"d87be21b": "lastBlock_a4Hash_uint256()", +"d87c3df5": "applyBonus(uint256)", +"d87c5df6": "assignTokensWallet(address,address,uint256)", +"d87c5fb9": "balanceOfBuyer(address)", +"d87c9478": "getStageAverageBonus(uint8)", +"d87ce037": "round1Cap()", +"d87d2a66": "ETH_CRWDTOKEN()", +"d87d2b8d": "BuyMOYTokens()", +"d87d9a66": "get_account_balance_eth(address)", +"d87ddccc": "WithdrawEvent(string)", +"d87e568a": "setHWCDeposit(address,uint256)", +"d87f8da5": "cancelAuction(uint256,bytes)", +"d880285e": "sPeriodEndDate()", +"d880610c": "appendKeyValue(string,address)", +"d88080ed": "ERC20Standard(uint256,string,string,uint256)", +"d880b0b0": "LogChangePCWallet(address)", +"d8819e0a": "maxTrainerLevel()", +"d8822727": "CarDeregistered(uint256)", +"d882ad5e": "Valeriumcoin()", +"d883e789": "PayWins(address)", +"d8844241": "getTotalCategories()", +"d884a322": "betMaxAmount()", +"d886daa2": "revokeAccessDeposit(address,address)", +"d8879dd8": "isValidString(string,string,uint256)", +"d8879fdc": "deleteBio(bytes3)", +"d887ac35": "mUpgradeCostFactor()", +"d8887efc": "withdrawForTrexdevshop()", +"d88905fa": "sanMint(string,string)", +"d8894bb5": "fraction()", +"d88a3af9": "register(address,string,string,uint256,string,string,bytes32,address,address)", +"d88ae250": "setProjectsContractAddress(address)", +"d88b0815": "numberOfCrySolObjects()", +"d88b2da2": "_registerReferral(string,address)", +"d88b8676": "addTrustedAccount(address)", +"d88b9732": "BUXCOIN()", +"d88bfbad": "ContractDisabledBlock()", +"d88c271e": "isWhitelistedUser(address)", +"d88c5237": "VenusCoin()", +"d88cdbd6": "setMe(uint256)", +"d88d8b38": "registerToken(uint256,bytes,uint256)", +"d88dc1c6": "winner_announced(address,uint256)", +"d88e92a7": "OmegaProtocol()", +"d8909e74": "withdrawMyDeposit(uint256)", +"d8910b70": "getTransferProxy(uint32,int256)", +"d89135cd": "totalBurned()", +"d8915fc5": "DCAssetBackend(bytes32,bytes32)", +"d8916bb9": "etherToWei(uint256)", +"d89397b1": "btcsBuyRecipient(address)", +"d893b9f1": "soldTokensPreSale()", +"d894e937": "setSomeValue(string)", +"d894f861": "costFunds()", +"d895530c": "getCurrentCandidateForPrize()", +"d8959512": "getConnectorBalance(address)", +"d8966ad3": "getTombByOwner(address)", +"d896dd64": "setStatus(uint256,uint8)", +"d89739b1": "Marketplace(address)", +"d897833e": "setSaleStatus(bool)", +"d898e1b9": "_depositEther()", +"d899299e": "realUnicornAddress()", +"d899d312": "Testimony()", +"d899e112": "target3()", +"d89ab6d3": "YouCollectCoins()", +"d89b465c": "getUnitAttackIncreases(address,address,uint256)", +"d89b8057": "setOscar(address)", +"d89b908d": "checkFundingCap()", +"d89bcaaa": "BATsPerEth()", +"d89cca38": "assignLawyer(string)", +"d89d4404": "_payEther(uint256)", +"d89dc0ad": "MarketOpen(address)", +"d89ea0f5": "setClearingPriceComponent(address)", +"d89edecf": "returnAmountPlusInterest(uint256)", +"d89ef018": "addUsersWhitelistA(address[])", +"d89f9719": "getOrderOtherArguments()", +"d89fb919": "episodePurchase(uint256,address,uint256)", +"d89fda34": "Fish()", +"d89fec58": "aboutCurrentPack()", +"d8a0aa6c": "getPositionById(address)", +"d8a119b9": "ownerSetVisible(string,string)", +"d8a140f9": "peony()", +"d8a1e70a": "widthrawDev()", +"d8a2848d": "setPaymentEscrow(address)", +"d8a351de": "_getDefaultPartitions(address)", +"d8a3daa0": "createEntry(uint256,uint256[])", +"d8a3f0bf": "getFactoryPrice()", +"d8a489d9": "pauseTournament()", +"d8a506f3": "thirdStageDiscountPriceOfTokenInWei()", +"d8a52178": "ContractManager()", +"d8a54360": "totalRemaining()", +"d8a5cca1": "Finalised(address,uint256)", +"d8a6021c": "transferTreasury(address)", +"d8a7233e": "addBook(string,string)", +"d8a74c7c": "getGamblingPartySummarizeInfo(uint256)", +"d8a74f3b": "ThrowError()", +"d8a79d87": "wolf3Balance()", +"d8a865f6": "getElementAt(uint256)", +"d8a8e03a": "move(uint256,address)", +"d8a9e45e": "getProductContractUser(address)", +"d8aa9f85": "totalForOutcome(uint8)", +"d8ab8274": "getStates()", +"d8ab9208": "addressByIndex(uint256)", +"d8aba1c6": "partFees()", +"d8ac1bb3": "buyTokensReferral(address,string)", +"d8ac26c0": "ForksTestContract()", +"d8ac289f": "frozenWallet4y()", +"d8ac5b4e": "tokensPerCents_gte5kUsd()", +"d8ad1c5c": "getCapAmount()", +"d8ae6139": "WavesPay()", +"d8aeedf5": "freezingBalanceOf(address)", +"d8afc2fe": "getAdminVariables()", +"d8afd392": "advisorySupply()", +"d8b0403a": "Bithemoth(address,address)", +"d8b0b499": "country()", +"d8b11d54": "AddItemExtra(uint32,uint16,uint256,uint16,uint16,string,address)", +"d8b120c1": "getMeshPointByName(int256,string)", +"d8b163d0": "eventsAdmin()", +"d8b29324": "unlockAmount(string,uint8)", +"d8b3315f": "public_withdraw(uint256)", +"d8b3a2eb": "isOdd(uint256)", +"d8b3ad77": "setDateTimeLib(address)", +"d8b3d69a": "getVendorApplicationScoringTrack(string,uint256)", +"d8b3e417": "USD20TestToken()", +"d8b4e580": "uploadBalances(address[],uint256[])", +"d8b50a63": "addAction(string,uint256)", +"d8b5cf43": "beneficiary_modify(address)", +"d8b66ae1": "sendTokens(address[],uint256[])", +"d8b79543": "FxxkToken()", +"d8b86753": "getOrderCount(address)", +"d8b964e6": "approved(address)", +"d8b98118": "CRLperEther()", +"d8b98fca": "AirDrop(address)", +"d8b9a2a0": "addContract(address,address,uint256)", +"d8b9a7e8": "CLC(uint256,string,string)", +"d8ba6de2": "Endorsements()", +"d8ba8ce3": "setNextDiscountTTMTokenId6(uint64)", +"d8baa905": "getAreaEvaluation(address,uint256,address)", +"d8bad5bd": "userLoans(address,uint256)", +"d8bbae03": "getTransferValueFor(address)", +"d8bd4761": "createCurrency(string,string,uint8,uint256)", +"d8be2838": "unSuspend(address)", +"d8be30fc": "getUserMessage(address)", +"d8bea898": "addReferredInvestor(string,address)", +"d8bf0568": "level1Bonus()", +"d8bf0ef8": "finishBurning()", +"d8bf1773": "calculatePoohBuySimple(uint256)", +"d8bf63b7": "START_BLOCK_NUMBER()", +"d8c02572": "Gallery_MuYi_No2()", +"d8c1c3c2": "getNumberOfTx(uint256)", +"d8c1fad1": "StakeIt()", +"d8c251b5": "isNotRegistered(address)", +"d8c26129": "foundationWithdraw()", +"d8c2c1c1": "getcoeffcient(address,uint256)", +"d8c2c878": "PlexCoin(uint256,string,uint8,string)", +"d8c30700": "getCurrentCap()", +"d8c34127": "isKnownSignature(string)", +"d8c35273": "getHumanNumber()", +"d8c37ecd": "calculateMarketPixelPrice(address[16],uint256)", +"d8c3c1ed": "finalizeIto(uint256,uint256,uint256)", +"d8c42e42": "doublePrice(uint256)", +"d8c4661c": "getNID()", +"d8c4c34e": "KaraOmToken()", +"d8c4cd7d": "saveStudent(uint256,string,string,address,address)", +"d8c57892": "getDecision(bytes32)", +"d8c5c6f8": "disapproveInternal()", +"d8c65cbb": "_setEyesValue4(uint256)", +"d8c681a7": "BaoFengChengCoin(uint256,string,string)", +"d8c6bd6f": "checkMine(uint256)", +"d8c90762": "addTrustedIssuer(address,string)", +"d8c929a8": "getCurrentRoundRewards()", +"d8c9334b": "TextChanged(bytes32,string,string)", +"d8c94cd5": "_addToken(address,uint256)", +"d8c97f34": "transferFromVest(uint256)", +"d8ca713a": "getStringMember()", +"d8ca8a55": "distributeIQTTokenBatch(uint256)", +"d8cb2d4a": "STOCoin()", +"d8cb4aa3": "bonus(address)", +"d8cb52d3": "getFreeRabbit(uint32,uint256,uint8,bytes32,bytes32)", +"d8cba0ba": "transferWallet(address)", +"d8cba7a2": "phase3Cap()", +"d8cbce53": "calculateDividendsFor(address)", +"d8cc3c5e": "get_milestone_information(uint256,address)", +"d8ccd0f3": "free(uint256)", +"d8cdac0d": "window0StartTime()", +"d8cecc7b": "MdedicalChainCoin()", +"d8cf9184": "getServerCreationFee()", +"d8cfd15a": "LogB(bytes32)", +"d8cff716": "NBAT101(address,address,address,address,address)", +"d8d07637": "poll(uint32)", +"d8d0819f": "CoinVilla()", +"d8d1d507": "whiteListContracts(address)", +"d8d1efea": "releaseTimeSecond()", +"d8d34c89": "ManualTransfer(address,uint256)", +"d8d3b1a4": "TIER1()", +"d8d40cee": "gameNumber()", +"d8d45d13": "setShipping(string)", +"d8d4a75e": "AUD_Omnidollar()", +"d8d4ec02": "checkVesting(address)", +"d8d5740c": "XMLYToken()", +"d8d5a200": "payBountyManager()", +"d8d736c5": "_makeDepositForPeriod(bytes32,uint256,uint256)", +"d8d777f2": "_attack(uint32,uint8,uint64)", +"d8d8e2f2": "test_23_assertGasUsage200Boards()", +"d8d9159d": "pr0coinAddress()", +"d8da3bc0": "getCurrentPotSize()", +"d8da708f": "preico_enddate()", +"d8db583f": "getFreelancerSkills(address,address)", +"d8dbb475": "JSONpath_string(string,string)", +"d8dbb712": "OfferCancel_internal(uint8,bool)", +"d8dbe4c9": "setContractManager(address)", +"d8dd2b79": "emitTransferFeeRateUpdated(uint256)", +"d8de5a41": "splTransferFrom(address,address,uint256,uint256,uint256)", +"d8df44fd": "maxTimeBonus()", +"d8df5dc1": "lockAmount()", +"d8df9aad": "setDayWithdrawCount(uint256)", +"d8e09dac": "setTrustee(address,bool)", +"d8e1b9ba": "explore2(uint256,address,bool)", +"d8e20e2c": "brickPrice()", +"d8e223b5": "issueMedal(address)", +"d8e2e392": "admin_set_isRequireData(bool)", +"d8e30740": "ETH_RECEIVED_CAP()", +"d8e3c1c8": "buyPlatinum(uint256,uint256,uint8,bytes32,bytes32)", +"d8e3c33f": "gridToIndex(uint256,uint256)", +"d8e476ab": "icoPhaseDiscountPercentage2()", +"d8e4ab0d": "isOmegaContract()", +"d8e4f9d9": "teamTwo()", +"d8e5ae6a": "Etheramid()", +"d8e5c048": "scheduleCall(address,uint256,uint256)", +"d8e5c797": "concat(string,string,string,string)", +"d8e5e64e": "getAsAddressOrZero(bytes32)", +"d8e60616": "OFNOG()", +"d8e6b249": "findPossibleDelegatorsOf(address)", +"d8e71b35": "ico3receivedTotal()", +"d8e74ed7": "monsterStrength()", +"d8e86854": "setPrices(uint256,uint256,uint256,uint256)", +"d8e8752a": "resetUsedToday(uint8,uint8)", +"d8e8b177": "interestOf(address)", +"d8e9602b": "tierCap(uint256)", +"d8e963b3": "PRE_ICO_END_TIME()", +"d8e97a56": "averageTimestamp()", +"d8eb3a98": "withdrawAuctionBalance()", +"d8eb6af3": "redeemEthers(address,uint256)", +"d8ebfe5a": "interaddmoney(address,uint256,uint256)", +"d8ec55ed": "meh()", +"d8ec696f": "__address1__()", +"d8edbd79": "ZTToken()", +"d8ee2ff4": "_buys(uint256,uint256)", +"d8ee796f": "founderAllocatedTime()", +"d8eea572": "getMinInt64()", +"d8eebd8d": "spentBalance()", +"d8eef28b": "ordersFor(uint256,uint256)", +"d8f012c6": "StatelessFactory(string,string,string)", +"d8f06b52": "closeAfterWhitelisted(address)", +"d8f0b9c4": "amountToBeneficiary()", +"d8f0c358": "getSetupParametersCount()", +"d8f163ab": "totalTokensDistributed()", +"d8f248b8": "getForge(uint256)", +"d8f2cd12": "onceSetOwners()", +"d8f2f09f": "china()", +"d8f306a1": "setAvailableToken(uint256)", +"d8f342be": "getBTCETH(uint256)", +"d8f3790f": "ethBalance(address)", +"d8f42fca": "SzeToken(address,address)", +"d8f45fdb": "LICToken()", +"d8f5d098": "privateUnlock(address)", +"d8f6d596": "getSale(uint256)", +"d8f6dcf2": "getTaskById(bytes32)", +"d8f71809": "MAX_COMMISION()", +"d8f9659b": "withdrawnTokens(address[],address)", +"d8f9d144": "changeOwner(string,address)", +"d8f9e51b": "EkoBeerCoin()", +"d8fa191b": "setProviderDetailFields(uint256,bool,bool,uint256)", +"d8faefc9": "fixDistribution(uint8,uint256)", +"d8fbbf31": "removeContractFromWhiteList(address,uint256)", +"d8fbe994": "transferFromAndCall(address,address,uint256)", +"d8fbff9f": "createDroneFromVault()", +"d8fce0d4": "pinchVillain(uint256,uint256)", +"d8fcfd6b": "convertRealTo256(int128)", +"d8fd1ed9": "creatorReward()", +"d8fd2043": "getSkullyById(uint256)", +"d8fd7ae3": "subtractAllowed(address,address,uint256)", +"d8fe1558": "BaseICOTokenWithBonus(uint256)", +"d8fe511f": "tithes()", +"d8fed39e": "tokenSoftcap()", +"d90025d1": "DIVIDEND_FUND_FRAC_TOP()", +"d900a6ae": "hgtSold()", +"d901402b": "getCommitHash(address,uint256)", +"d9019530": "request(address,uint32)", +"d901b98c": "test_1_generationAcrossBlocks_increaseBlocksBy100()", +"d902ac2e": "insert_data()", +"d9037441": "setEthFundDeposit(address)", +"d9037522": "removeVoter(address,string)", +"d903c5ae": "minimumTDEContributionInWei()", +"d904094e": "ownerCancelArmyMarketplace(uint256)", +"d9057007": "supportsInterface(address,bytes4)", +"d9067fbd": "initCongress(address)", +"d9076129": "secondBonusPercent()", +"d907e02e": "_cancelBet(uint256)", +"d9082962": "totalRefunded()", +"d9089b11": "_processDividends(uint256)", +"d9099f67": "endPreICOStage3()", +"d90a28c0": "fullProfit()", +"d90a8224": "getNumberOfSuccessfulDeals()", +"d90a88cd": "getContentReplies(uint256,uint256)", +"d90b02aa": "left80(uint256)", +"d90b4958": "completeProject(bytes32)", +"d90c1759": "dayFor(uint256)", +"d90c2861": "Albertheijn()", +"d90cdfb4": "getCanvasInfo(uint32)", +"d90d5b58": "copyright(address)", +"d90d870b": "adminSetPercent(uint256)", +"d9106264": "clearAuth(string)", +"d910c805": "MAX_POWERBALL_NUMBER()", +"d9114476": "addAudit(bytes32,uint256,bytes32)", +"d912d248": "transfertOwnership(address)", +"d912ebb2": "tokensIssuedIco()", +"d9134c46": "isGlobalConstraintRegistered(int256,address,int256,address)", +"d9135493": "AdPotato()", +"d913dea2": "UsdRateSet(uint256)", +"d9144448": "upgradeProposal(address,address,address,uint256)", +"d9144712": "numberClaimToken()", +"d914cd4b": "addPool(address)", +"d915562b": "isControlled()", +"d9159f60": "sealedBy()", +"d915cdbd": "investBalances(address)", +"d916d8fd": "getPlayersCountByGame(uint256)", +"d916ec32": "getEmissionProviders()", +"d917863e": "addExchangeTestAccounts(address,address)", +"d9178993": "maxPeriodDuration()", +"d917deb5": "Donate()", +"d91921ed": "addBalance(uint256)", +"d9194d2c": "toggleTransferable(bool)", +"d9194fcb": "setCEO(address,bytes)", +"d91aee02": "getTotalGamesParticipated()", +"d91c98d3": "startingBlock()", +"d91ca13e": "EquinoxCoin()", +"d91d81c6": "preIcoEndAt()", +"d91dc952": "timeLock(address,uint256)", +"d91e1c63": "totalGambles()", +"d91e24c2": "TIMEToken(address,uint256)", +"d91f3f33": "BookERC20EthV1Dec()", +"d91f68a2": "currentMessageNumber()", +"d92126fc": "NewFees(uint256,uint256,uint256)", +"d9214848": "CONFIGURE(bytes32,bytes32)", +"d921eb78": "isRefund()", +"d9226ced": "_setMaxAssets(uint256)", +"d922aa30": "core(uint256,address,uint256)", +"d922b6ab": "stage_1_tokens_scaled()", +"d922cd12": "InsightChainToken()", +"d922d5c8": "TimeLockedController(address)", +"d922f603": "Purpose()", +"d923a0be": "setLoyaltyWallet(address)", +"d923c99e": "getRecordByRow(uint256)", +"d9244bf9": "maximumHodlDuration()", +"d9246bec": "activateICO(uint256)", +"d9249e7e": "PuppiesCore()", +"d924c660": "shift_right(uint32,uint32)", +"d9269cb4": "at_permille(uint256)", +"d92782ac": "sumICOStage5()", +"d927b5ad": "addDistributionPeriod()", +"d928a3d8": "_getSchellingRoundSupply()", +"d928e32e": "ERC20Basic(string,string,uint8,uint256)", +"d9296e45": "totalWeiFunded()", +"d92c4f7c": "AirContactToken(uint256,string,uint8,string)", +"d92ca5b4": "tokensTeam()", +"d92cb5b0": "WinRound(address)", +"d92d5bb3": "ADSToken()", +"d92d7056": "option20name()", +"d92da722": "processBuyRequestFiat(string,uint256,address,uint256,uint256)", +"d92da8f8": "bountySupplyRemaining()", +"d92dc325": "MintAndTransferToken(address,uint256,bytes32)", +"d92ebe46": "createDAO(address,uint256,uint256,uint256,string,string,uint8)", +"d92ec71b": "addDeal(uint256,string,string,uint256,bytes32,string)", +"d92ed48d": "rebalanceBuckets()", +"d92fb5e9": "newClaimer()", +"d9300e30": "checkIfAllALCDistributed()", +"d9305ba7": "LOG_OwnerDeposit(uint256)", +"d930a90b": "testFailMoveBalanceDueToInsufficientFunds()", +"d93112e3": "totalEarlyStage()", +"d9326337": "PiaoPiaoToken()", +"d932b248": "AssetISR()", +"d932ed92": "MarriageCertificates()", +"d933b5f2": "SLABSToken()", +"d933c1fb": "XYOracleBonus()", +"d933dac7": "view26()", +"d9357438": "getInfoByAddr(address)", +"d9359419": "payoutERC20(string)", +"d935bac3": "test1Vote()", +"d935c8b4": "totalEthSales()", +"d935e0a7": "BBCC(uint256,string,uint8,string)", +"d936547e": "whitelisted(address)", +"d9368ba2": "getUserOptState(address,address)", +"d93761fb": "transferSKM()", +"d937ed44": "grantVestedEDEXContract()", +"d9386789": "coreTeamMemberTwo()", +"d9386c9f": "cofounderVUPDestination()", +"d939727d": "setMaxTokenNumbers()", +"d939c960": "fundRecipient()", +"d93a0a8e": "newClassPlayer(uint256,uint256,uint32,uint32,uint32,uint32,uint32,uint32,uint32)", +"d93a64a2": "updateDebris(bytes32,uint8,bytes32,address)", +"d93b4451": "Authorise(bytes16,address,address)", +"d93b4ee7": "disableLogic(address)", +"d93d6ad0": "isKeyHolder(address)", +"d93da7f0": "ROUND_5_PRESALE_BONUS()", +"d93dbeff": "calculateLevel(bytes8,bytes5)", +"d93debd5": "registerDappAddress(address)", +"d93e5aeb": "count_next_address(address,uint256)", +"d93e7573": "disown(bytes32)", +"d93eeb5c": "safeTransferManyFrom(address,address,uint256[],bytes)", +"d93ef85f": "Photos()", +"d93fabfa": "addSeller(address)", +"d94073d4": "PT()", +"d94085cc": "FindMyFish_EnterBarcode(bytes32)", +"d9409bc5": "WFCC()", +"d940c3ee": "processPayroll(address,uint256)", +"d94123b8": "channel_api()", +"d94178c2": "getvalue(string)", +"d9417b6a": "balanceWosPoolToWosSystem()", +"d9417d69": "wikiRemoveTokenFrom(address,uint256)", +"d941c4ad": "prepare(bytes32)", +"d94288de": "totalFeatures()", +"d94389bd": "__char(bytes1)", +"d94395e2": "lastCitizenPaid()", +"d943c8b6": "oldHolders(address)", +"d9441f14": "playerMsgs(uint256)", +"d944534a": "generate(uint256,address,string)", +"d944c749": "ADVISOR_FOUR()", +"d945799f": "removeLockFund(address)", +"d94585bd": "proveAndClaim(bytes,bytes,bytes)", +"d9468475": "findRecentInterest(address)", +"d946af8f": "addNodeAddress(uint256,address)", +"d9474ad7": "unlockedProvider(address)", +"d9479692": "contract_name()", +"d947c8d1": "transferSketch(address,uint256)", +"d947e234": "offerGuardianVend(uint256,uint256)", +"d948d468": "forward(bytes)", +"d94929fe": "setTokenSaleRounds(uint256[5],uint256[5],uint256[5],uint256[5],uint256[5],uint256[5])", +"d94a0a7d": "findNextwaitPairBetIDs(uint256,uint256)", +"d94a75bc": "MELON_CONTRACT()", +"d94acc0a": "distributeVSN(address[],uint256)", +"d94b9843": "toContractAddr()", +"d94c7c29": "updateTokPerLockRate(uint256)", +"d94ca0f9": "approvePrimordialTokenAndCall(address,uint256,bytes)", +"d94d0316": "timeIncrease()", +"d94d0787": "EthlyteToken()", +"d94fd026": "applyPixelChange(uint256,uint256,uint256,uint256,uint256[])", +"d94fe832": "idOf(address)", +"d95030cb": "ticketTransfers(uint256,uint256)", +"d9506c5f": "startSettle(bytes,uint8[2],bytes32[2],bytes32[2])", +"d950aec6": "splitWinnings(uint256)", +"d950c432": "multiFreezeWithTimestamp(address[],uint256[])", +"d950cc3c": "getUserCap()", +"d9510215": "withdraws()", +"d9515238": "forward_funds(uint256)", +"d951d39a": "tokensIssuedForBonusRangeThree()", +"d951d7ec": "updateMIN_BET(uint256,uint256)", +"d951e357": "bonusFourthWeek()", +"d9520c9a": "allTokenOwnerOnStart()", +"d9527fa7": "buyShares()", +"d95374ce": "pendingJackpotForHouse()", +"d95402e7": "Redeem()", +"d95405f2": "lockTokenDays(address,uint256,uint256)", +"d95425e6": "TXwithCode(bytes32)", +"d95431cd": "lookupFeaturedSprites(uint256)", +"d9548e53": "isExpired(uint256)", +"d954a949": "setDeal(address,bool,uint256,uint256,uint256)", +"d954af09": "revealBid(bytes32,uint256,address,address,address,uint256,uint256)", +"d954bd4a": "ICO_TIER_LAST()", +"d954cbcb": "amountInvested()", +"d95514a8": "Regulator()", +"d955ec17": "setMiniumInputEther(uint256)", +"d95660be": "timeNow()", +"d956634f": "claimTokensAndRefund()", +"d9573c1a": "taxEth(uint256,address)", +"d9575ec5": "registerNameXID(string,uint256,bool,uint8)", +"d95808f0": "lastBlock_f3()", +"d9583497": "acceptFulfillment(uint256,uint256)", +"d9592676": "packKey(uint8,uint128)", +"d9597016": "multisetCustomGasPrice(uint256[],address[])", +"d95983c3": "Destroy(address,address,uint256)", +"d959868a": "total_no_of_CTD()", +"d959cbd2": "fMul(uint256,uint256)", +"d959e244": "left25(uint256)", +"d95a0aa5": "setDirectMintLimit(uint256)", +"d95a2d42": "lendGovernmentMoney(address)", +"d95a820f": "LogStartPreICO()", +"d95ab72d": "getMemberWallet(address)", +"d95ace6f": "checkSigned(bytes32,uint8,bytes32,bytes32)", +"d95b6371": "isOperatorFor(address,address)", +"d95c6092": "StartreasureToken(uint256,string,uint8,string)", +"d95efb98": "genesisAddress(address)", +"d95ffc08": "myEthBalance()", +"d9606ca1": "WINE(uint256,string,string)", +"d96073cf": "swap(uint256,uint256)", +"d960924d": "dtAddEthBalance(address,uint256)", +"d960ede1": "sectionPrice(uint256)", +"d96152c3": "executeRuling(uint256,uint256)", +"d961de44": "domainConnector(bytes32)", +"d9629e06": "casinoGames(uint256)", +"d962a68b": "buyTokensByUSD(address,uint256)", +"d962c51e": "redeemByTranche(bytes32,uint256,bytes)", +"d962dd99": "setCompte_43(string)", +"d9637826": "safe_sub(uint256,uint256)", +"d964f28a": "TokenAiNetworkToken(address,address)", +"d9652cb1": "startTimestampOfBonusPeriod()", +"d965ea00": "getMemberLength()", +"d9663f6a": "START_PREICO_TIMESTAMP()", +"d966cfc3": "totalAllocatedToAdvisors()", +"d967f752": "rentMachine(address,uint256,uint256,uint256)", +"d968595f": "isValidProposal(uint256)", +"d968dab1": "chipBalanceOf(address,address)", +"d9696054": "readInfoList(address,uint256,uint256)", +"d969b919": "Etherplanet()", +"d969ead4": "countpro(uint256)", +"d96a094a": "buy(uint256)", +"d96a22b8": "windowBonusStep1()", +"d96a8687": "XMPToken()", +"d96aee49": "MultipleConstructorTest()", +"d96bcd8f": "randomTargetAssign()", +"d96bfbb3": "resetUser(uint256,address)", +"d96c0991": "quitFromAirdrops()", +"d96c26c9": "submitTransaction(address,uint256,bytes,bytes,bytes)", +"d96c30a4": "checkTime(address,uint256)", +"d96c550a": "_preValidatePurchase(address,uint256,uint8)", +"d96cb018": "icoCap()", +"d96cc905": "toB32(uint256,uint256,bytes,address)", +"d96d7ea2": "PRE_EXECUTION_GAS()", +"d96db2ec": "OfferToRealm(uint256,uint256)", +"d96de4ce": "AdminDrawError()", +"d96e1f76": "icoStatus()", +"d96e5565": "testThrowsRetractNotRetractable()", +"d96ed505": "minGasPrice()", +"d97036c2": "ARM1Token()", +"d9703dac": "getResoMethod()", +"d97049bb": "regs(uint256)", +"d97095f3": "AST()", +"d970c19b": "raiseCoinsSeeded(address,uint32,uint256,uint256)", +"d9710278": "TwoFucksToken()", +"d9719e56": "CROWDSALE_SHARE()", +"d971da94": "priceUSDcETH()", +"d972bc59": "setICO_Contract(address)", +"d972e8ad": "getTranche(uint256)", +"d972ea3e": "dragon()", +"d9740383": "SAWJewelleryChain()", +"d9741bd9": "PinMoToken()", +"d975767b": "eLitecoin()", +"d975f3b7": "withdr(uint256)", +"d977076e": "getExtraBets()", +"d9779fbe": "currentTokenSupply()", +"d977a59c": "getCurrentRateByStage()", +"d977b282": "getValue(address,address,uint256)", +"d9784223": "getEscrowAndHash(bytes16,address,address,uint256,uint16)", +"d9785451": "timerMax()", +"d9787517": "getTotalPossibleTokens(address)", +"d978a0d3": "setFinancialOfficer(address)", +"d9795f66": "usersNTD()", +"d9797076": "CoinBroSupply()", +"d979e906": "getXNKPurchased()", +"d979f5aa": "setHolder(address)", +"d97a9c39": "resetContent(string,address,string,string,string,uint256,uint256)", +"d97b0a6e": "Workcoin()", +"d97b14f0": "sendAdvisory(address,uint256)", +"d97c5be5": "losePooling()", +"d97cec3f": "transferMultiSameValue(address[],uint256)", +"d97cf075": "onlyBouncerExecuteCall(address,uint256,uint256,bytes)", +"d97d4f52": "FOUNDERS_LOCK_DATES(uint256)", +"d97dec19": "transferAll(address,address,uint256,address,uint256,uint256,address)", +"d97e38d6": "getApprovedBuyerForIndex(address,uint256)", +"d97fc929": "CommitSolutionHash(bytes32)", +"d9803cb2": "addOfficer(address)", +"d9823996": "withdraw(uint152,address,uint256)", +"d982466d": "getPlayerAwardByRndNo(uint256,address)", +"d98299a0": "RedBlue()", +"d9829cbc": "getRewardAndPrepareWithdraw()", +"d982a84e": "citadelAddress()", +"d9844e25": "hexAddress(bytes32)", +"d9852ca9": "nbDispute()", +"d985f122": "RelayToolsTest()", +"d9875c93": "stageNow()", +"d988a0f9": "Payoutnextrefund()", +"d989f5f2": "productOwners(address,uint256)", +"d98a977d": "TestWorldSnapshotInternal(uint256)", +"d98ae811": "transferDay(uint16,address)", +"d98b094c": "communityPeriodsNumber()", +"d98b2fbf": "getOverviewsCounter(uint256)", +"d98b43f7": "removeOracleAddress()", +"d98b9bb5": "placeBid(address,uint256)", +"d98bce37": "batchBurnAssets(uint256[])", +"d98bf529": "LimitTop()", +"d98c08b5": "CryptaurDepositoryTest()", +"d98c1524": "getPortfolio(bytes32,address)", +"d98d011d": "getCandidateKey(bytes,bytes,bytes,bytes)", +"d98de8a5": "isCrydrViewRegistered(string)", +"d98e14bd": "STAT_COUNT()", +"d98e2997": "addMiningToken(address,uint256)", +"d98f47fe": "recieveEscrowTransfer(address,uint256)", +"d98f4ea2": "sumICOStage7USD()", +"d98f6088": "blockDelay()", +"d9901ce4": "DappToken(uint256)", +"d991c58f": "mintMaster()", +"d99202c5": "STCDRListing()", +"d9923a16": "Account_timePayout(address)", +"d992aa70": "createBounty(string,uint256[])", +"d992bd5b": "testResultNotZero()", +"d9934a8c": "holdAddress4()", +"d993693c": "LOTTYcoin()", +"d9946793": "shareHolderBalanceOfAtTime(address,uint256)", +"d9946a79": "PERSONAL_CAP()", +"d9948af7": "sumICOStage1USD()", +"d9964d92": "getResourceName(uint16)", +"d9967889": "BalanceOf(address)", +"d9969061": "prove(bytes32,uint256)", +"d9971e92": "reject(uint64,string)", +"d99727cc": "removeBonus(uint8)", +"d9972b96": "isAuthorized(address,bytes4)", +"d997598b": "HoChiMinh()", +"d997933f": "canBreedWith(uint40,uint40)", +"d997a153": "transferBatchIdempotent(address[],uint256[],bool)", +"d997ccb3": "payMe()", +"d9987c07": "ReturnToOwner(address,uint256)", +"d998d0d5": "chunkNr()", +"d99929db": "getAssetIdTypeSequenceId(uint256)", +"d99969df": "DUNE_BUGGY()", +"d999741e": "grantFoundationToken()", +"d999b17e": "CROWDSALE_PHASE_3_START()", +"d999f132": "optionDescription(uint256)", +"d99a8dc3": "submit(string)", +"d99a9d20": "_setTransferFeeProp(uint256)", +"d99bb9f7": "removeOwnership()", +"d99c6c76": "_invest(address)", +"d99d83e3": "txsPerHour(uint256)", +"d99dbdbe": "changeBookState(uint256,uint256)", +"d99dd314": "companyTimeLock()", +"d99f8bd8": "VarnixToken()", +"d99fe20d": "dexTestApprove(address,address,uint256)", +"d9a0b299": "deactivateClaim()", +"d9a18f6d": "totalTokensForSaleDuringICO1()", +"d9a19a7a": "MMOTOKEN()", +"d9a2a083": "TeamWalletUpdated(address,address)", +"d9a2fff5": "airDropPercent()", +"d9a3988d": "LogPollApproved(bytes32)", +"d9a3c199": "testSaleToken()", +"d9a457fe": "endRound(address)", +"d9a4ad8b": "shouldHadBalance(address)", +"d9a4cc33": "_finalizeSale(bool)", +"d9a50120": "SaniCoin()", +"d9a52ab3": "getForkMigrationPercentageBonusDivisor()", +"d9a569f5": "OfferPlay(address,uint8,uint8)", +"d9a57382": "propertyIdToEscrow(uint256)", +"d9a5b0a7": "testHighestTranchNotExact()", +"d9a6c6db": "FactbarDeed()", +"d9a6cf81": "transferableUntil()", +"d9a6e2de": "VST(string,string,uint8,uint256)", +"d9a7556f": "indexThreads()", +"d9a8748c": "fundAccount()", +"d9a8e212": "GOLDQ()", +"d9a96c92": "LegalToken()", +"d9a96f9b": "saleManagerAddress()", +"d9aa1881": "tokenDestroyed()", +"d9aa5543": "newDoc(bytes32,uint256,string)", +"d9ab1ec9": "smallCount()", +"d9aba9ce": "getProduct(address)", +"d9abedb4": "take_fees_eth_dev()", +"d9ac03a6": "getCurrentCertificateNonce(address,address)", +"d9ac9a88": "getAuctionTotal()", +"d9aea707": "modifyCeo(address)", +"d9af3691": "verifyCertificate(address,uint256)", +"d9afa38b": "payDividends(address,uint256)", +"d9b02ddf": "setGeneral(uint32,uint8,uint8,uint16,uint16,uint16,uint16,uint32[4],uint32[4],uint8)", +"d9b058bd": "setOraclizeGasprice(uint256)", +"d9b158b1": "angelInvestorsWallet()", +"d9b238ea": "test_insert_findWithHintNotTightBound(int256)", +"d9b25a24": "proxyBuyTokens(address)", +"d9b36043": "TJFucks()", +"d9b4abf5": "marketplace_controller_v2()", +"d9b5134c": "getTotalExchanged(address)", +"d9b5618c": "TimeBroker()", +"d9b596c7": "generateRand()", +"d9b5b5ca": "exponential(uint256,uint256)", +"d9b5c4a5": "nodeRegistry()", +"d9b627dd": "CancelledByBuyer(bytes32)", +"d9b6aec4": "allInvestments()", +"d9b6b197": "tempAdvisorsTeam()", +"d9b7d154": "applyForTask(uint256)", +"d9b7d41b": "createFootballer()", +"d9ba32fc": "getWhitelistStatus(address)", +"d9ba8ea4": "finishLastRound()", +"d9bb57c6": "removeGameManually(address,address)", +"d9bb6102": "HealthCashMock()", +"d9bc9873": "getCanvasPaintedPixelsCount(uint32)", +"d9bcc65b": "setSeedContract(address)", +"d9bccfd6": "getWarrantyPrice(address,uint256,uint256,uint256)", +"d9bd0799": "clearPeriods()", +"d9bd2468": "getToken(uint256,address)", +"d9bdc10c": "getPlayerHasGetFree(address,address)", +"d9bdd6fa": "createCDPLeveragedAllDai()", +"d9be976c": "GainmersTOKEN(uint256,uint256,address)", +"d9bf3187": "setOutcome(int256,uint8,bytes32,bytes32)", +"d9bf8238": "setWinery(address,bool)", +"d9bfa73e": "orderEpoch(address,address)", +"d9c01911": "mintIdentityToken()", +"d9c090a0": "updateRoleName(address,bytes32)", +"d9c1a344": "balanceTotalOf(address)", +"d9c1ac25": "transferAllERC20Token(address,uint256)", +"d9c24acb": "_unlockedAmount(uint256)", +"d9c263f8": "purchaseWithEth(uint256,uint256,uint256,address,bytes)", +"d9c27cc6": "setPep(address)", +"d9c3193d": "setSpaceshipPrice(uint16,uint256)", +"d9c397f6": "gmtFund()", +"d9c39fca": "setSilverContractAddress(address)", +"d9c3d3c9": "checkReturn()", +"d9c4870e": "beneficiaryAddress()", +"d9c522ec": "daiRate()", +"d9c52d27": "getDiscountTrancheEnd(uint8)", +"d9c55ce1": "fill()", +"d9c57bcc": "importExchangeSale(uint256,address,uint256)", +"d9c67404": "getMerkleRoot(bytes)", +"d9c682a7": "borrowerReturnFiatPerEthRate()", +"d9c6925e": "AccountIsNotFrozenForReturn(address)", +"d9c693cb": "emergencyLock()", +"d9c7041b": "ownbalance()", +"d9c76d61": "coolHero()", +"d9c779ce": "_buyP3D(uint256)", +"d9c7ddfa": "_updateBurnRate()", +"d9c850f4": "getItemKindCount()", +"d9c88e14": "ownerWithdraw(address,uint256)", +"d9c97699": "__callback(bytes32,string,uint256)", +"d9ca0b7f": "transferRoutingCode(bytes32,address)", +"d9caa3d2": "submit(bytes32)", +"d9caaada": "minPreContribution()", +"d9caed12": "withdraw(address,address,uint256)", +"d9cba1a1": "MulTraToken()", +"d9ccf695": "strayToken()", +"d9cd6046": "BuyTicketSeed()", +"d9cd9273": "Arycoin(address,uint256,uint256,uint256)", +"d9cd98b0": "withdrawDevFees(address)", +"d9ce2451": "setLeaf2(uint256,uint256)", +"d9cea519": "getDealInfo(uint32,uint64,uint64,uint64)", +"d9cfc182": "getHighestPriceAt(uint256)", +"d9cff93a": "last_result(address,address)", +"d9d0b091": "AddMarking(bytes32,bytes32,int256,uint256)", +"d9d14d37": "numOfMiningTimes()", +"d9d1ceaa": "draw(uint256,bytes32[])", +"d9d1d4bb": "getCompte_28()", +"d9d1e0e5": "createBlock(uint256,uint256,bytes32,bytes32,bytes32,bytes32)", +"d9d1f5d9": "removePendingExplore(uint256,uint256)", +"d9d210b8": "changeHelper(address,bool)", +"d9d2d058": "Splitter()", +"d9d34ce1": "isForkingMarketFinalized()", +"d9d3cc78": "seriesByName()", +"d9d578e5": "airDropSetup(address,uint32,uint256)", +"d9d60b52": "getGameState(address)", +"d9d61655": "getOwnedTokens(address)", +"d9d61a10": "GetUserSafesLength(address)", +"d9d73887": "Diana()", +"d9d770bb": "_triggerPVEStart(uint256)", +"d9d84531": "getRemainingKingdoms()", +"d9d8b2ee": "creationInvestmenting()", +"d9d958ec": "setUint8(uint8,uint8)", +"d9da0142": "cancelEscrow(bytes20)", +"d9da2738": "changeOfficialAddressIfNecessary(address)", +"d9da486a": "initialEcologyAccount(uint8)", +"d9da76de": "DailyMint()", +"d9daa497": "getStageTargetAmount(uint256)", +"d9daae78": "CCH_Seaport_1()", +"d9dac92c": "acceptDiscipleVend(uint256)", +"d9dad80d": "ownerOf(uint256,uint256)", +"d9db1f55": "deprecate(string,string,string)", +"d9db3c73": "revealVoteOnSpecialProposal(bytes32,bool,bytes32)", +"d9db9d89": "globalSupplyAfterPercentageLogic()", +"d9dbd382": "FUTX()", +"d9dc7fcd": "EVM()", +"d9ddafb3": "exchangeTransfer(address,uint256)", +"d9de1e98": "HuuumanStandardToken(uint256,string,uint8,string)", +"d9def89a": "buyShitClones()", +"d9df2878": "CryptoCollectorContract()", +"d9e0dc59": "getLocation(address)", +"d9e19a91": "setAccountValue(uint16,uint8,uint8,int64)", +"d9e34038": "ODCToken()", +"d9e39e50": "getTransferDetails(address)", +"d9e4fa6a": "setUsdPerKEther(uint256)", +"d9e50186": "setWeiMin(uint256)", +"d9e55f7a": "getAllowedToMine(address)", +"d9e5a50b": "getSnakemasterReq()", +"d9e68b44": "left100(uint256)", +"d9e73095": "MiracleToken()", +"d9e79c72": "admin_dividend(uint256)", +"d9e7c8ca": "createRace(uint256,uint256,uint256)", +"d9e7ee1c": "new_game(uint256,uint256)", +"d9e8843f": "payRent(uint256)", +"d9e947f3": "kickOutMember(address)", +"d9e95a98": "addVoter(address,string)", +"d9e9c745": "decreaseShardBalance(address,uint256)", +"d9ea1b47": "Raffle_Finished()", +"d9ea372b": "myfichain()", +"d9ea9bfa": "createBtcAddressHex(uint256,int256,uint256,int256)", +"d9eac337": "MegaWattContract()", +"d9ead22b": "accountForClose(uint256)", +"d9eb547b": "extractCLNfromMarketMaker(address,uint256)", +"d9eb5947": "flatFee()", +"d9ec0508": "testThrowTransferNotEnabled()", +"d9ec3018": "submitSpendLimit(uint256)", +"d9ecad7b": "breed(uint256,uint256)", +"d9ece4c7": "changeMaximumContributionForPrivatePhase(uint256)", +"d9ee369a": "withdrawDifferentToken(address,bool)", +"d9ef1ee3": "insert(string,uint256)", +"d9ef58a5": "thisAddr()", +"d9f00023": "SBGToken()", +"d9f01878": "centralMinter()", +"d9f02210": "StarbaseMarketingCampaign()", +"d9f0354d": "buildMilestone(uint256,uint256,uint256)", +"d9f035aa": "cardList(uint256)", +"d9f0cf04": "createAuctionWhenPaused(address,address,uint256,uint256,uint256,uint256)", +"d9f165dc": "updateFactory(address)", +"d9f1a1a9": "PublicBallot(address,string,string)", +"d9f2ac8a": "decr()", +"d9f300ce": "referedRateBonus()", +"d9f38388": "RequirementChanged(uint256,bytes32)", +"d9f3afff": "addCurrency(string,uint8)", +"d9f47e41": "totalDevelopmentFundBalance()", +"d9f4ecbb": "lastProfit()", +"d9f4f56e": "_ethRefund()", +"d9f58923": "GlobalConstraintRegistrar()", +"d9f69e4e": "addUserWhoBuy(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"d9f754a3": "LogSetWithdrawLimit(address,uint256)", +"d9f7e285": "returnExcedent(uint256,address)", +"d9f7eacf": "removeGains(address,uint256)", +"d9f80c65": "setMinInvesment(uint256)", +"d9f81b83": "timeWithoutUpdate()", +"d9f861b1": "getFreelancerInvoices(address,uint8)", +"d9f884bf": "BIONICCOIN()", +"d9f8a3c3": "lastTransactionReceivedInWei()", +"d9f8a4e2": "calcCurrentTokenPrice()", +"d9fa1e78": "PractiParlezCrowdSale()", +"d9fa8c54": "unClaimedToken(address)", +"d9fa9335": "houseKeeping()", +"d9facbe0": "isObserver(address)", +"d9facc80": "MerchantWallet(address,string,address)", +"d9fb6963": "stateSetLocked()", +"d9fb7413": "lockTimeLeft()", +"d9fc4b61": "safeTransferFrom(address,address,address,uint256)", +"d9fc8026": "getPubKeyArr(bytes32,uint256,uint256[])", +"d9fca769": "setWinner(address)", +"d9fcb31f": "comm_channel()", +"d9fdd155": "isLegendaryPart(uint256,uint256)", +"d9fe0137": "_transfer_byProxy(address,address,uint256,bytes)", +"d9fe1045": "MidasDiscountToken()", +"d9fe60f3": "DTHPool(address,address,uint256,string,string,string)", +"d9feb8ce": "loserTwo()", +"d9feeeb6": "fillMyOrder(uint256)", +"d9fefb93": "getData_34()", +"d9fefbf8": "addData(uint256,uint256,bytes32)", +"d9fefd6c": "bountyTokenTimelock()", +"d9ff4ad8": "burnFrom(address,uint256,bytes)", +"d9ff8e9d": "setWalletOut2(address)", +"d9ff8ffc": "BetAnB()", +"d9ff94b7": "setRegionPurchasedAt(uint256,uint256)", +"da00586b": "houseKeep()", +"da00a1f4": "setGetFree(bool)", +"da0225db": "belongsTo(address,uint256)", +"da0239a6": "remainingSupply()", +"da025051": "freelancePlayer(address)", +"da02b6cf": "computeWinner(address,uint256,uint256,address,uint256,uint256,uint256)", +"da02f5f3": "updateIsVerified(address,bool)", +"da0321cd": "addresses()", +"da037fd1": "confirmPerfectReception()", +"da040c0f": "purchasingAllowed()", +"da04197e": "Duration(uint256)", +"da04f82b": "addUserManager(address)", +"da05277e": "ImpactRegistry(address)", +"da05f535": "RefundCrowdsaleFactory(address)", +"da062d68": "ExCToken11()", +"da06d96c": "_tokensToEthereum(uint256)", +"da074874": "getRemainingEthAvailable()", +"da0774ad": "getCallFeeScalar(uint256,uint256)", +"da081204": "littAdmins()", +"da08c5a3": "setTransferWhitelist(address)", +"da09118e": "addTokenGrant(address,uint256,uint128,uint16,uint16)", +"da09c72c": "devAddr()", +"da0a599e": "EjariRules()", +"da0a5fe0": "TestToken(string,string,uint256)", +"da0b0682": "beginGame()", +"da0b0c36": "getNumDesignatedReportNoShows()", +"da0bba7b": "changeOraclizeConfig(bytes32)", +"da0bba90": "sendPrize(address[],uint256[],uint64)", +"da0d76f8": "betContractDOWN()", +"da0e1451": "distributionForRefers(uint256,uint256,uint256)", +"da0ef68b": "ICO_END_DATE()", +"da0f039d": "MaxTotalSupply()", +"da0f3877": "postFreezeDevCATDestination()", +"da0f57d0": "confirmWithdraw(uint256)", +"da0fab61": "BlockContract()", +"da1070da": "newEscrow(address,address,bytes32)", +"da11f709": "bank1()", +"da122e02": "Fishbank(address,address,address)", +"da128527": "finalizeUpdateState()", +"da12e9ef": "TokenHolder(address,uint256)", +"da13610c": "rewarding(address)", +"da1441cd": "KudosBank(uint256)", +"da147d32": "tradeTracker()", +"da14c723": "setCustomBuyer(address,uint256)", +"da14e3b2": "transferAndFreezeTokens(address,uint256)", +"da16241b": "Platopay()", +"da17835f": "FermionToken()", +"da178cb0": "plot()", +"da17c21b": "BlockchainMoneyEngine(uint256,string,string)", +"da18bcef": "getMin(uint256[])", +"da1919b3": "mintFor(address,uint256)", +"da1a13ce": "fitsTokensForSaleCap(uint256)", +"da1aaa59": "_withdraw(address)", +"da1ad97f": "clearHpbNodeCache()", +"da1b2d9d": "comDrop(uint256,uint256,uint256,uint256)", +"da1b4359": "uploadFinish()", +"da1b620b": "getTarget(string)", +"da1b95a6": "DAO(address,address,bytes32,bytes32,address,address,address)", +"da1bd8ab": "setupTrustedAccounts()", +"da1d7711": "createHive()", +"da1eb542": "ceil1(int256,int256)", +"da1edb38": "shareLastTen(uint256,uint256)", +"da1ee417": "MoveChain(uint256,string,uint8,string)", +"da1f149c": "SECURRO()", +"da1f6433": "AtomUX()", +"da1fe7d5": "configureDomain(string,uint256,uint256)", +"da1ff555": "cliffTeamTokensRelease()", +"da2216ef": "getContractCreatedTimeById(bytes32)", +"da2242b8": "createActivity(uint256,string,uint256,uint256)", +"da228f9c": "bountyTokensCreated()", +"da22ec07": "storing()", +"da233128": "getCrowdsaleContract()", +"da23c057": "editAd(uint256,string,string,string,string,bool,bytes32,bytes2,uint8,bytes4)", +"da23d18b": "updateOnSaleSupply(uint256)", +"da2424ae": "setPI_edit_22(string)", +"da24b08c": "UsdPerKEtherUpdated(uint256,uint256)", +"da257cb4": "setMinRevenue(uint256)", +"da25c0cd": "ThisExternalAssembly()", +"da25de3c": "remainingBalance()", +"da262f58": "setTokenInfo(string,string)", +"da26358a": "unregisterVendor()", +"da26663a": "getPrice(uint32)", +"da26c241": "approvePauseChange(bool)", +"da26d0b9": "addAuction(uint256,address,uint128,uint128,uint64,uint64)", +"da26ebc2": "getPayeeCount()", +"da26f7f6": "CIFR()", +"da274488": "getMotd()", +"da27ab1f": "getFreeShitClone()", +"da27cb0f": "Lottery(string,uint256,uint256)", +"da280fe5": "resetHasAutoVote()", +"da284dcc": "expirationTime()", +"da28c81a": "updateKYClist(address[])", +"da293136": "TestCrowdsaleController(uint256,address,uint256)", +"da2a97d8": "GetCurrentNumbers()", +"da2aa615": "addRandomFight2Death(address,uint256)", +"da2b2589": "GenExtWeightList(uint8)", +"da2b7416": "testBitsAndFailIndexOOB()", +"da2bbfc7": "setTokenURIBase(string)", +"da2c0460": "gameGiftOnceAmount()", +"da2d7b70": "userSubscriptionsLength(address)", +"da2d8720": "payJackpot2()", +"da2d8c88": "updateRestrictedStockSendTime(address,uint256)", +"da2dcea6": "returnTokenMulti(address[])", +"da302fc3": "lighthouseLib()", +"da306946": "ShareDATA(string)", +"da30d418": "cancelDist()", +"da311588": "getCoin(uint256)", +"da31cf2a": "getStageEtherRaised()", +"da323c94": "getSketch(uint256)", +"da328377": "ownerSetStakeCommence(uint256)", +"da333ca6": "payOut(uint256)", +"da337465": "getPenguinsByOwner(address)", +"da34b7f3": "_transfer(uint256)", +"da35762a": "getPI_edit_16()", +"da359dc8": "setBytes(bytes)", +"da35a26f": "initialize(uint256,address)", +"da35d581": "DaoHubAccount()", +"da3678df": "transferTokenByContract(uint256,address)", +"da36d217": "lockupTok(address,uint256)", +"da36fd03": "FundingAccepted(address,uint256,uint256)", +"da374157": "changePopulous(address)", +"da38abb3": "randomGen(address)", +"da38daba": "getLeftCoordinate(bytes1)", +"da38f805": "TaskToken()", +"da38fe31": "ConsentDirectory()", +"da392f06": "availableNow()", +"da397985": "CBOToken()", +"da3986e4": "getTAOIds(uint256,uint256)", +"da3b6b35": "totalHashRate()", +"da3c300d": "currentFee()", +"da3cbf96": "getShipClass(uint32)", +"da3cd674": "GetDChainDOTHash(bytes32,uint8)", +"da3d18e8": "PlusUltra()", +"da3d23a9": "GetEnd()", +"da3d454c": "borrowAllowed(address,address,uint256)", +"da3d7d7f": "reconfigure(uint256,uint256)", +"da3e0fd1": "getAuctionsById(uint32[])", +"da3e3397": "approveToken(address,address,uint256)", +"da3f8c38": "Amethycoin()", +"da3fb6f7": "mainSaleRateP2()", +"da4077b9": "finishHim()", +"da421df5": "pageFiles(uint256,uint256)", +"da42eea5": "setRedeemWallet(address)", +"da440a1d": "wallcoinToken()", +"da446958": "totalTokensCap()", +"da4493f6": "activationTime()", +"da44d275": "viewWinners()", +"da44e034": "maximumTokensForForth()", +"da46098c": "setAllowance(address,address,uint256)", +"da465d3f": "saleSharesAvail()", +"da46a73c": "setGameOperator(address)", +"da46e48e": "setGLA(uint32)", +"da46e6c4": "transferFeeIncurred(uint256)", +"da46eda1": "setBlockDotDifficulty(uint256)", +"da46fe62": "ethereumToTokens(uint256,uint256)", +"da4751c0": "setMinPrivateSaleCompanyBuy(uint256)", +"da4778c2": "delayHours()", +"da4793ac": "setMaxSecurityGuardDelay(uint256)", +"da47d856": "getService(bytes32)", +"da481ce0": "DemeterCrowdsale(uint256,uint256,uint256,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"da489997": "addAsset(address,address)", +"da49613c": "ownedfunction()", +"da498084": "addTokenHolder(address)", +"da499f6f": "SupportAddOn(uint256,address,uint256)", +"da49cdb5": "getLostTokens(address)", +"da4a22dc": "MXN_Omnidollar()", +"da4a76c0": "becomeGameSponsor()", +"da4a77aa": "isRatifier(address)", +"da4a8ef6": "SettingsSet(address,uint256,uint256)", +"da4b5e29": "contains()", +"da4d0756": "vehicleExist(address,string)", +"da4d2615": "Gomblot()", +"da4f2899": "isUserInGroup(bytes32,address)", +"da5136b8": "setWhitelistAddress(address,address)", +"da5140fc": "lockTokensForAddress(address,uint256,uint256)", +"da5196e0": "getmemreqdetails(uint256,uint256)", +"da51bbd9": "luckyPendingIndex()", +"da51f168": "GetDayReward()", +"da5269a6": "getListOfConsents()", +"da5341a8": "issueMaxNomins()", +"da53462c": "initialize(address,address,uint256,uint256,uint256,uint256,address,address,uint256)", +"da535758": "lockUp(address,uint256,uint256,uint256)", +"da547dcf": "preIcoHardcap()", +"da548e29": "priceExpirationBlockNumber()", +"da5520cd": "HeroNodeToken()", +"da57736f": "stageThree()", +"da5950a4": "tokenBought(uint256,uint256)", +"da5a9366": "getAppBase(bytes32)", +"da5abf5d": "payment_returned(uint256)", +"da5b1f5c": "buy50()", +"da5c0a7c": "testDisown()", +"da5c5b55": "noVotes(uint256,address)", +"da5c7ec2": "WNCT()", +"da5da3b9": "initializeTokenSaleWithToken(uint256,uint256,uint256,uint256,address,address)", +"da5db748": "firstRelease()", +"da5e4489": "resetListing(string)", +"da5e9c62": "whitelistDayMaxStake(uint8)", +"da5ea40c": "computeMerkle(bytes32,uint256,bytes32[])", +"da5f3ac1": "GAME_END()", +"da5f838d": "weisRaised()", +"da5fa890": "_addManager(address)", +"da60278a": "receivable(address)", +"da60d7e8": "BOARD_2()", +"da62a246": "rewardsTokenSupply()", +"da640668": "checkNameOccupied(bytes32)", +"da6443ad": "addAddressToWhitelist(address,address)", +"da649c63": "startSalePhase(uint256,uint256)", +"da652b4a": "summBilborough()", +"da6585ff": "calcSrcQty(uint256,uint256,uint256,uint256)", +"da658f22": "birthPerHundred()", +"da66cb3e": "secondRoundICOTokensLimit()", +"da67ac42": "MIPCoinToken()", +"da682aeb": "onApprove(address,address,uint256)", +"da6838ff": "getIfBonus()", +"da683c63": "Token(string,bytes32)", +"da68d47d": "licenseNFT()", +"da69f1c8": "arrayTest(address[])", +"da6aabbe": "set_sale_address(address,string)", +"da6b31b9": "testErrorTransferToNullAuthority()", +"da6babca": "setNextPrice(uint256,uint256)", +"da6c5832": "CROSAIR_MAX_PRICE()", +"da6d8ca4": "LotteryRecharge()", +"da6dfea7": "setRate(address[],address[],uint256[],uint256[],bool)", +"da6e11a5": "approveFactoryContract(address,bool)", +"da6efb01": "winAddressOf()", +"da6f76b5": "updateEpisode(string,uint256)", +"da70db17": "HireGoToken()", +"da710422": "getTokenAmountForWei(uint256)", +"da7150b9": "Qwidex(address,address,address,uint256,uint256,uint256)", +"da721672": "checkFloatingSupply(address,uint256,bool,uint256)", +"da72c1e8": "adminTransfer(address,address,uint256)", +"da7360df": "paymentInternal(bytes32,uint256[],uint256)", +"da73630e": "addTeam(address,string)", +"da737613": "placeBet(bytes22)", +"da73f0f9": "conversion_rate()", +"da748b10": "pausedUntil()", +"da74c5a1": "citiesSold()", +"da74ce27": "tokenCapForFourthMainStage()", +"da7545d0": "titleCount()", +"da756ba7": "BEAT()", +"da75b901": "deployStepTwo()", +"da76d5cd": "withdrawBalance(uint256)", +"da7855a3": "reclaimLocalNodeFee()", +"da78d655": "owner1OK()", +"da7911e1": "getOrderListLengthFactor()", +"da79a9fc": "setTxAsSpent(bytes32,bytes32,uint256)", +"da7bd3e9": "getVestingScheduleEntry(address,uint256)", +"da7c0ad4": "SaleScheduled(uint256,uint256)", +"da7c6a42": "registrations(bytes32)", +"da7ccce9": "test_oneValidEqInt1()", +"da7d0082": "isCertification(address,bytes32)", +"da7d249f": "UnsetBlockForSale(uint256,uint256,address)", +"da7d57f9": "startRareRaffle(uint256,uint256)", +"da7d7827": "getSubscriptions(address,string)", +"da7d86fd": "softDelete(bytes32)", +"da7e019e": "AlterContactName(address,bytes32)", +"da7e6fdf": "TokenDrop(address[],uint256[])", +"da7eadd4": "totalAffiliateDDT()", +"da7fc24f": "setBackend(address)", +"da7fc7c5": "payoutCompleted()", +"da7fd1f0": "gemmyMusicSupply()", +"da7ffbd4": "generateRandomSpell(uint8[14],uint32)", +"da801f20": "approveAndCall(address,uint256,address,address,bytes32,uint256,uint256,uint256)", +"da81b09b": "lastPeriodStarDate()", +"da8267e3": "hasDirectorAccess(address)", +"da82a035": "sweepCommission()", +"da8300d2": "initialEnemyCombination()", +"da832237": "SMALLEST_TOKEN()", +"da834ac4": "getPayoutNumerator(uint256)", +"da83a649": "onlyAdmin(bool)", +"da850601": "MKYCToken()", +"da8567cb": "AldiyoCoin()", +"da857f2c": "reduceLastWeekStake(address,uint256)", +"da85868e": "fifthExchangeRate()", +"da883e6a": "addItems(uint256[],uint256[],address)", +"da88a831": "updateBaseTokensPerEther(uint256)", +"da89970b": "hasntStarted()", +"da8a01a5": "CROWD_WEEK2_BONUS()", +"da8a46e0": "listUserRecastsFrom(address,bytes32,uint256,bool)", +"da8ad6b6": "getTAO(address)", +"da8c229e": "controllers(address)", +"da8d2f35": "ChannelDeleted(address,address)", +"da8e2890": "payNihilum()", +"da8e44d8": "registerColor(string,uint256)", +"da8ee786": "transferFromContract(uint256)", +"da8f410a": "ApprovedToken()", +"da8f54d8": "testVali(address,uint256)", +"da8f9fe5": "DetailedERC20(uint256,string,string,uint8)", +"da8fb7cd": "ASSToken(uint256,string,uint8,string)", +"da8fbf2a": "pauseMinting()", +"da909b09": "setExchanger(address)", +"da91254c": "whoAmI()", +"da918f76": "placeBlock(uint16,uint16)", +"da9287d1": "acceptHybridization(uint256,uint256)", +"da9332bb": "addCompanyURL(string,string)", +"da93d0d1": "setPrice()", +"da93dfcf": "give(address,bytes32,address)", +"da93f938": "maxAppeals()", +"da942ab3": "issueTokensExternal(address,uint256)", +"da94e770": "YBVToken()", +"da9534b4": "Stex()", +"da9590cb": "addPublicSaleWallet(address)", +"da95ebf7": "requestWithdrawal(address,uint256)", +"da96bbcd": "publicEventTokens()", +"da977038": "volumeBasedBonus(uint256)", +"da979b8d": "SpecialRate(address,address,uint256,uint256)", +"da98655e": "getNullAddress()", +"da9893dd": "Resource(address,string,string,string)", +"da9ab565": "changeId(string)", +"da9ad094": "changeParameter(uint32,uint32)", +"da9b3cb4": "getGameBid(uint256,uint256)", +"da9b90c4": "TOKEN_FIRST_DISCOUNT_MULTIPLIER()", +"da9bca21": "numActiveMembers()", +"da9bdbfc": "CKCoin()", +"da9bf54c": "icoPhaseDiscountPercentage4()", +"da9c2697": "GaillardTokenSale()", +"da9c273d": "cancelInvoice(uint256)", +"da9c6a46": "getReplyCount(uint256)", +"da9c87fa": "changePayRate(uint256)", +"da9d0f6b": "withdrawCustom(uint256,address)", +"da9d56d7": "getBidIds()", +"da9d95bc": "commonWithdraw(address,uint256)", +"da9da572": "tryAirdrop()", +"da9dd8bf": "isAddressVerified(address)", +"da9e13aa": "getProviderSales(address)", +"da9eadac": "remit(address,uint256,bytes)", +"da9eeaeb": "PetroNetworkToken()", +"da9f40b8": "setAssetFileLink(string)", +"da9f4875": "freezeTokens()", +"da9f6918": "MultiSigWallet(address[],uint256,uint256)", +"da9f7550": "requestRandom()", +"da9f84a6": "rerollValue(uint256)", +"daa08539": "mintShares(address,uint64)", +"daa0ab0e": "majorityForTeam()", +"daa0f79f": "LEGAL_EXPENSES_ADDR_1()", +"daa147f3": "redeemLevAndFeeByStaker()", +"daa170ca": "difficultyBalance()", +"daa17f49": "marketplaceAddress()", +"daa1d7d4": "maximumPercentageOfDaysSupply()", +"daa21e0e": "testBitSetSuccess()", +"daa232ac": "_bonusRatio1()", +"daa283c8": "__callback(bytes,string)", +"daa3a163": "isUpgradeable()", +"daa44bf8": "getInStreamOf(address)", +"daa45281": "_addTo(address,uint256)", +"daa4cf88": "getCurrentStageIndex()", +"daa50ee0": "DSTMultisig()", +"daa5f48b": "findbit(uint256)", +"daa69c9e": "killDividentContract(uint256)", +"daa6f417": "howMuchTokensAvailableForExchangeFromStock()", +"daa7370f": "onFailure()", +"daa86216": "getAllowedContractsCount()", +"daa89fef": "issueNewHeldCoins(address,uint256)", +"daa94ab1": "frozenAccountProfit(address)", +"daa9604d": "byPonzi(address)", +"daaa50c9": "transferWithCustomReservingNet(address,uint256,uint256)", +"daaa6b5d": "setReleasedAddress(address,address)", +"daaadd8e": "arr(address,address)", +"daab88a6": "createEngine(uint256)", +"daac1f64": "reqfee()", +"daac518a": "playerTokenAddress()", +"daacb24f": "right42(uint256)", +"daad98f4": "socibit()", +"daae717c": "setIndividualMinCap(uint256)", +"daae7e98": "setCompte_20(string)", +"daaf3d2e": "attack(uint256,uint256,address)", +"daafe0a5": "setPrice(uint32)", +"dab0537b": "change_p2(uint256)", +"dab09999": "returnMyEthBalance(address)", +"dab122de": "dInit(address,address,bool)", +"dab12beb": "SmartSweep()", +"dab23f7c": "__callback(bytes32)", +"dab306b1": "votingFee()", +"dab30ccc": "addBonusPeriod(uint64,uint64,uint256,uint8,uint256,uint8)", +"dab3ed63": "withdrawMyInvestmentsBack()", +"dab41935": "TootyrToken()", +"dab43e6d": "PreSale3DAPP(address)", +"dab46553": "removeOracle()", +"dab4c65e": "totalDowSold()", +"dab4cb87": "gameValue()", +"dab4d1c1": "PixelPrice(uint16,uint16,address,uint256)", +"dab5cec2": "setExtraTokensPercent(uint256)", +"dab5f340": "setRoot(bytes32)", +"dab5fdc4": "DOWN_totalBets()", +"dab680dc": "getGlobalInfo()", +"dab78820": "ERC20Rescue(address,uint256)", +"dab80075": "Signature(address,string,string)", +"dab80d6f": "addSponsor(address)", +"dab8194f": "enableGame(address)", +"dab8263a": "weiPerToken()", +"dab83b9a": "selltokens0()", +"dab88ad7": "VI6()", +"dab8a18b": "specialTransfer(address,uint256,uint256)", +"dab8c01a": "Zorro01Token()", +"dab8ef38": "addRooms(string,uint256)", +"dab8fa73": "setPackage(string,uint64[3])", +"dab91e87": "linkToMasterWallet(address)", +"dab93a93": "PolarisDEX(address,address,address,uint256,uint256,uint256)", +"dab951ba": "arrayFunc(int256[10])", +"dab9938e": "setIcoBeginDate(uint256)", +"dab9afa4": "Test12Address()", +"dabb0531": "getCharacter(uint256)", +"dabb37d4": "Lakshmi(uint256,string,string)", +"dabb624b": "rate_ETHUSD()", +"dabb6360": "percentage_of_three()", +"dabb6778": "vestingTeamWallet()", +"dabbbd0b": "sharesChainToken()", +"dabbd2bd": "removePlayerFromServer(uint256)", +"dabbd670": "team2Token()", +"dabc0c37": "isPassOwner(bytes32,address)", +"dabc706e": "getProposalCost()", +"dabd2719": "setDiscount(uint256)", +"dabd2eb2": "changePrice(bytes32,uint256)", +"dabd5d65": "addDays(uint256)", +"dabdc1f2": "ChangeActiveDigger(address)", +"dabecd8d": "_newBid(bytes32)", +"dabed8be": "Update_UserWinningHistory_Data(uint32,uint32)", +"dabf7dc8": "PayoutDividendEarly(uint256,bool)", +"dabf7ec4": "helper(uint256)", +"dabf8246": "EventAuction(address,uint256,uint256,uint256,uint256,uint256)", +"dac00420": "maxHalvings()", +"dac05adc": "test_1_ensureVoteWorks_increaseBlocksBy100()", +"dac1182e": "signBBODocument(bytes,bytes)", +"dac17430": "lastVoteTime()", +"dac194f1": "setAutoInvest()", +"dac1e5e5": "_computePVPReward(uint256,uint256)", +"dac32ba9": "modifyPolicyTo(address,uint8,uint8)", +"dac34674": "setNextGameSettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"dac3ab88": "getCurrencyHash(uint256)", +"dac3f6d2": "queryFusionData_ext(uint256)", +"dac47a71": "SetGiftTime(uint256)", +"dac4fcdb": "getNewCustomPrice(address,address)", +"dac54b8a": "returnHoldings(address,uint256,uint256)", +"dac54daa": "OPLTest()", +"dac5b8ae": "TokenSale(address,uint256,uint256,uint256)", +"dac645bd": "getBUI(bytes32,uint256)", +"dac649c8": "NEWC()", +"dac6af5e": "SWIFTH(address,address[],address)", +"dac796bb": "getInvestorBalance(address,address)", +"dac7c858": "TOKEN_TRANSFER_PROXY_ADDR()", +"dac84ee4": "moveToReceiver(address,address,uint256)", +"dac8df25": "DEVELOPER_CUT()", +"dac90466": "_error(bytes32)", +"dac9555d": "allocate_slot(address)", +"dac9882a": "offChainAddresesValidCount()", +"daca5ce0": "bonusTokensPercent()", +"dacaeb07": "pledge(bool,uint256)", +"dacc8e11": "getTPrice(uint256)", +"dacd06fc": "KongQiCoin()", +"dacd4472": "PixoArenaFounderToken()", +"dacdbb93": "removeAccountSearch(address)", +"dace4557": "setUnlockTime(uint256)", +"dacef51b": "payincount()", +"dacf18c7": "getDeathCoin()", +"dacf9483": "getUIntValueConverted(bytes32,uint8,uint256)", +"dacfa06f": "manualDraw()", +"dad0128d": "calculateAdjustedFiguresForBattle(address[3],address[3])", +"dad03cb0": "returnError()", +"dad13822": "setMonsterClassSiteSet(uint256,uint256)", +"dad22781": "AdvancedArtificialIntelligenceSafetyDefense()", +"dad24541": "PresaleToken()", +"dad2771d": "signReceipt(uint256,int256)", +"dad30cfc": "test_transfer_to_contract_with_fallback()", +"dad38294": "PowTokenHashedBase()", +"dad39151": "multiApprove(address,address[],uint256[])", +"dad52c72": "_itemCancelMarkets(uint256)", +"dad59f35": "raisedEthers()", +"dad5c2e3": "validAstroCount()", +"dad5c3ee": "chainyShortLink(uint256,string)", +"dad5fda3": "vester()", +"dad6b482": "userHasPositveBalance(address)", +"dad72332": "claimUnsold()", +"dad788d9": "isJobExpired(uint256)", +"dad7ad9e": "aix()", +"dad7c095": "transferWithAllowance(address,address,address,uint256)", +"dad7e4d2": "Aaa()", +"dad86b45": "teamETHUnlock3()", +"dad90035": "withdrawalRequests()", +"dad901be": "callWithdraw()", +"dad950f4": "InvestorPart()", +"dad98b52": "MonsterBitToken()", +"dad99119": "ddf()", +"dad99989": "burnCoins(address)", +"dad9a423": "setDuesIn(uint256)", +"dada85c3": "setAirdropOn(uint8)", +"dadad8fe": "addNewStreetName(string)", +"dadb20be": "ChangeTokenName(address)", +"dadc89eb": "setPreIcoDates(uint256,uint256)", +"dadcb23a": "getRevenueFactor(uint256)", +"dadcb460": "bumpPointer()", +"dadce8b0": "setExpiration(uint64)", +"dadd9e8e": "withdraw_some_amount(address,uint256)", +"daddff33": "claimController()", +"daded88e": "addMessageRequest(address,address[],string)", +"dae072d9": "GameWon(address,uint256)", +"dae1bd84": "AddChip(address,uint32)", +"dae1ddd2": "check_period(address,address)", +"dae1f17a": "getShopOwner(string)", +"dae21454": "toEthereumSignedMessage(string)", +"dae37abc": "cancelParticipation()", +"dae37fac": "spendAvailable()", +"dae392ee": "softFundingGoal()", +"dae3f7e2": "Gralaxious()", +"dae595e5": "getAuctionStart(address,address)", +"dae611c4": "lockUnlockMatchGPForBetting(uint256,bool)", +"dae6f081": "setScrapMinStartPrice(uint256)", +"dae79483": "getMemsize()", +"dae7e05d": "_bonusAll(uint256)", +"dae8865c": "ETHERCToken()", +"dae89f18": "coordinatorAccountIndex(uint256)", +"dae8af77": "getFeeWindowId(uint256)", +"dae9c31b": "ProofPresale()", +"dae9e379": "getFundBalance()", +"daea85c5": "approve(address)", +"daeab905": "issueReceipts(address,uint256)", +"daeb1c98": "PlusToken()", +"daeb860d": "versionAddresses(bytes32,bytes32)", +"daec4582": "AuctionEnded(address,uint256)", +"daec75f3": "buyXwithdraw(bytes32,uint256)", +"daec8128": "mintTokensForFounders()", +"daecc910": "getCKOwner(uint256)", +"daed6726": "ETHCollected()", +"daee4dd6": "readCheck(address,uint256)", +"daee9e35": "level2Bonus()", +"daeed3a6": "rateFinalStage2()", +"daef0e92": "stopCurrentGame(uint256)", +"daef4df8": "addCar(string,address,uint256,uint256,uint256)", +"daef569f": "insChainTokenLedger()", +"daf017a9": "GetRocket(uint32)", +"daf059c6": "createGuess(uint16,uint64,uint64,uint16)", +"daf13a47": "reserveLockup()", +"daf161e2": "getThirdAdmin()", +"daf1af19": "Current_balance()", +"daf1db09": "readyForFinish()", +"daf22f4d": "identify(bytes32)", +"daf32370": "getPurchaseAddress(uint256)", +"daf47ba3": "incGenLabFace(uint256)", +"daf488b1": "setReferrerPercent(uint256)", +"daf49451": "BINGToken()", +"daf4f66e": "isLimitEnabled()", +"daf64aa5": "getCompanyDetails(uint256)", +"daf69093": "BLOCKCHAIN_DEPOSIT_BETA_1M()", +"daf6ca30": "saleContract()", +"daf6e5ae": "DeepBrain()", +"daf760d0": "getData_6()", +"daf7f103": "_error(uint256)", +"daf8f438": "startRedeeming()", +"daf9812f": "updateBincentiveErrand(address)", +"daf9a535": "getData_20()", +"dafa1d2d": "burn(string)", +"dafa55a1": "creatureIndexToOwner(uint256)", +"dafae408": "checkThreshold(uint256)", +"dafaf94a": "getOracle(bytes32)", +"dafba12f": "setMAGContractAddress(address)", +"dafc5608": "TransferFeeRateConfirmed(uint256,address,uint256)", +"dafc64c4": "ERC223MintableTokenFactory(address)", +"dafd54a6": "ExaEUR()", +"dafd70c9": "RESERVED_UTILITY_GROUP()", +"dafea207": "smax256(int256,int256)", +"daff0093": "setReference(address,address,bytes32)", +"db00345d": "BookToken()", +"db006a75": "redeem(uint256)", +"db00758a": "getSGNTokenManager()", +"db00b848": "_performGeneric(bytes,address)", +"db00d1a9": "_preValidateCancellation()", +"db0251e9": "contributeMsgValue()", +"db035918": "deployForeignBridge(address)", +"db041965": "fightBetaMonster()", +"db0436c2": "RUNEToken()", +"db04a0ee": "getOrganizerActivationStatus(uint256)", +"db04aef4": "getHoldersLength()", +"db051653": "setEtherFeePercent(uint256)", +"db054134": "mintForReportingParticipant(uint256)", +"db059dfb": "createSsp(address,uint256,string)", +"db05ccfc": "setValue(address,uint256,uint256,uint256)", +"db060e1a": "RESERVED_TOKENS_FOR_FINANCIAL_INSTITUTION()", +"db068e0e": "setExchangeRate(uint256)", +"db06f0c2": "doPresaleMinting(address,uint256,uint256)", +"db078f08": "toggleKey(address,bool)", +"db0827e9": "ashcashToken()", +"db0834cf": "lockedAllocation()", +"db08444a": "toUint(int256,string)", +"db087ad5": "getCurrentPricePerWei()", +"db08ccec": "enjinTeamAddress()", +"db0a087c": "getTypeName()", +"db0aa668": "Bittwatt()", +"db0ad29c": "SocialMediaMarketToken(uint256)", +"db0c154a": "hitCharacter(uint16,uint16,uint8)", +"db0c9a02": "marketSell(uint256)", +"db0d5175": "getTransfer(address)", +"db0d7ce5": "LotteryRoundCreated(address,string)", +"db0db014": "dividendsForAmountAndTime(uint256,uint256)", +"db0dd71e": "addAbility(string,bool,uint8,uint8,uint8,uint256,uint256)", +"db0e127a": "openDoor()", +"db0e16f1": "emergencyERC20Drain(address,uint256)", +"db0ec968": "transfer(address,uint16[])", +"db0edd08": "PubKeyHashAdded(bytes20,uint8)", +"db0fb107": "updateSafeSender(address)", +"db107371": "DecentrEx(address,address,address,uint256,uint256,uint256)", +"db11040f": "LogRegError(address,string)", +"db112977": "Project_Info(uint256)", +"db11ead1": "markContribution()", +"db1227da": "initGameReferred(address,uint8)", +"db122ad4": "committeeJoinVotes(address)", +"db123b1a": "ZRX_ASSET_DATA()", +"db12630a": "fundariaCap()", +"db12999b": "airdropTokens(address,address[],bool)", +"db1366bf": "buyExchangeRate()", +"db136b1e": "createAsset(address,uint256)", +"db15520d": "TPTContributors()", +"db15b72d": "getDInfo(bytes32)", +"db165a76": "createLand(address,uint256)", +"db16d0fe": "optionExist(uint256,uint256)", +"db171211": "returnToSender()", +"db171754": "vestedAddress()", +"db180b2b": "LOCKAMOUNT2()", +"db18c972": "play4(address,uint256)", +"db18f962": "updateSplitandSend()", +"db192761": "Clockpay()", +"db1a71ae": "trackable_likes(address)", +"db1b569f": "previousSender()", +"db1bdd1d": "TheTokenG()", +"db1c45f9": "getAllGames()", +"db1c53e2": "isTransferedUser(address)", +"db1d0fd5": "alpha()", +"db1d68b5": "countryWinnerID()", +"db1eeb51": "MizeCoin()", +"db1f6689": "authorContentByIndex(uint256)", +"db201648": "AppicsFund()", +"db21fc9c": "gettimeback()", +"db22032f": "rentalTimeRemaining()", +"db2307b6": "changeRecvEthStatus(bool)", +"db230b52": "viewScore(address)", +"db239951": "cbAddresses(address)", +"db23c5d7": "icoRuleAdd(uint256,uint256,uint256,uint256)", +"db23f7e3": "veztUserArrayIdentifier(address)", +"db246fda": "withdrawalTimeOf(address)", +"db248091": "assignBonus(address,uint256)", +"db25b407": "listActive()", +"db25c328": "joinToProvider(uint256,address)", +"db25e637": "Strikes(address[])", +"db264a36": "s10(bytes1)", +"db27b0bc": "addUInt(uint256,uint256)", +"db27b8dd": "vestingManager()", +"db299492": "IGFC(uint256,string,uint8,string)", +"db29fd6e": "increaseDistrictCoke(uint256,uint256)", +"db29fe12": "addShareholder(address)", +"db2a0cb7": "HumanStandardTokenFactory()", +"db2ac8d8": "WINTOKENADDRESS()", +"db2becb0": "getWalletFeeSignatures()", +"db2c4e2d": "complexScaleObsTest(address)", +"db2d10a5": "PreICOTokenPushed(address,uint256)", +"db2d5841": "batchRelease(address[])", +"db2e21bc": "emergencyWithdraw()", +"db2ea20e": "arrayTestMulti(address[],address[],uint256[])", +"db2ea5c0": "_callERC165SupportsInterface(address,bytes4)", +"db2f1d83": "TalkCrypto()", +"db3119bb": "manageLink(uint256,uint256)", +"db318833": "_ecAdd(uint256,uint256,uint256,uint256,uint256,uint256)", +"db31dd17": "removeAddressFromWhitelist(address,string)", +"db31fb03": "excessEth(address)", +"db3268d8": "getBU(bytes32)", +"db32be98": "refundICO()", +"db330794": "addToVestMap(address,uint256,uint256,uint256,uint256)", +"db3359f0": "makeNonFungible(uint256,address)", +"db35132c": "WithdrawEther(address,uint256)", +"db3543f5": "setFoundation(address)", +"db35a03d": "allowedSpenders()", +"db36c2e5": "destroyOldCoins(address,uint256)", +"db37ceec": "maxEthContribution()", +"db37e42f": "multisetProofType(uint256[],address[])", +"db383bf2": "MyNewToken()", +"db38b877": "testRsplit()", +"db395d2e": "bonusPercentForWeiAmount(uint256)", +"db39a8e8": "getTokenTransferInsByAddress(address,address,uint256)", +"db39ceac": "MyBalance2(address,address)", +"db3b73db": "getPlatformName()", +"db3c1b94": "EtmPerBtc()", +"db3d8421": "getTotalAngelCardSeries()", +"db3e7f4f": "forgeTokens(address,uint256)", +"db3fab84": "Hamza_Ahmed_Coin()", +"db3fd0b8": "usedReserveSupply()", +"db403747": "mintForYear(address,uint256)", +"db40e896": "stopExchange()", +"db40ed24": "WeGoldToken()", +"db412f39": "preSaleDelivery(address,uint256)", +"db420fe3": "serverAddress()", +"db422e0b": "sendTokensAndRefund(address)", +"db447c04": "getPurchaseDetail(uint256,uint256,address)", +"db45479b": "closeChannel(uint256,address,bytes32,uint256,bytes32,bytes)", +"db456f77": "extraReceiverByIndex(uint256)", +"db45a30f": "buyPlanet(uint256)", +"db475044": "SHITcoin()", +"db478d08": "levelTwoBonus()", +"db47b9c9": "isTokenSupported(address,address)", +"db480704": "HCTToken()", +"db4844f3": "setRequestFailed(uint256)", +"db491d49": "ContributionReward()", +"db491de9": "daysToUnfreeze(address,address)", +"db491e80": "getNote(uint256,uint256)", +"db4ad99f": "constructUserIdentity(address,string,uint32,string,string,bytes32,bytes32,uint8)", +"db4bb866": "bitskiToken()", +"db4bd421": "trackable_record(address,uint256)", +"db4c528b": "increasePositionOnBehalfOf(address,bytes32,uint256)", +"db4cacec": "Other()", +"db4ce763": "DTRExpensiveWallet(uint256)", +"db4cf8e6": "getAccountAddress(uint256)", +"db4d1296": "confirmAdminTx(uint256)", +"db4e1df5": "setBTTSToken(address)", +"db4ecbc1": "CONTRACT_ADDRESS()", +"db518db2": "withdrawFor(address,uint256)", +"db51d62b": "OpenTime()", +"db52e130": "saveString(string)", +"db530222": "nextEndTime()", +"db536d2f": "getDefaultKey(address)", +"db5370c3": "EEAcoin(address)", +"db543fdc": "adviserAndBounty()", +"db5517b0": "snapshots(address,uint256)", +"db5549d8": "TokenBurn(address,uint256,bool)", +"db55bd2d": "authoriseNextAction()", +"db56702b": "firstWeekEndTime()", +"db56c29d": "Billionstrader()", +"db56d26c": "ChangeFiliate(address)", +"db57c429": "createPromoGameItem(address,string,uint256,uint256)", +"db5861ed": "ULA(uint256,string,string)", +"db589907": "setCosts(uint256,uint256)", +"db589bbe": "getInternalDrawings(uint256)", +"db59190d": "C1(uint256)", +"db59c052": "getFreeTokens(uint32,bytes32,bytes32,uint8)", +"db5a2778": "adminAddCountry(string)", +"db5ad407": "setData(bytes32,uint256,uint256,uint256,uint8[])", +"db5b4183": "oracleOutcomes(bytes,address)", +"db5b5799": "setClientSupply(address,uint256)", +"db5b7635": "TokenMacroansyPower()", +"db5c92a7": "getTokensInUSD(uint256)", +"db5c9442": "TRIAL()", +"db5cf9de": "getSpaceshipProductClassByModel(uint16)", +"db5d855b": "getReceiptId(address,address,uint256)", +"db5df447": "redemptionPriceCalculate(uint256)", +"db5eef61": "PredictionMarket()", +"db5f2f31": "calcExchangeRate()", +"db5f5d7c": "usedAPI()", +"db606931": "pointRootNode(address)", +"db618c08": "TestAuditor()", +"db623bd5": "ErrorSendingETH(address,uint256)", +"db624887": "W()", +"db62df0e": "likeTrack(address,bytes32)", +"db6380ec": "tokenCapForMainICO()", +"db638e51": "resetUserRefBalance(address,address)", +"db63e149": "EmployeeWallet(string)", +"db641ab4": "Game_balance_in_Ethers()", +"db642bce": "GoddessToken()", +"db6648c0": "collateralisation(address)", +"db66ef59": "getPublicKeyN()", +"db6727c1": "myBitFoundationPercentage()", +"db680e3d": "getMeterInfoByMonth(uint8,uint256)", +"db681e1d": "GameScored(bytes32,int256,int256,uint256)", +"db681e54": "getGenerationForCall(bytes32)", +"db681e9f": "sendRefund(uint256)", +"db6997ae": "getCitiesData(uint256[])", +"db6a3652": "addOrder(address,uint256)", +"db6aef35": "amountOfWorkpointQueue()", +"db6bb289": "Zygoma()", +"db6bbeb2": "abx_token()", +"db6be534": "end_ts()", +"db6be871": "getAmountByCoupon(bytes32)", +"db6bed22": "addPresaleWallets(address[],uint256[])", +"db6c1831": "bonusSystem(bytes5,uint256)", +"db6c709c": "updateExchangeRates(uint256,uint256)", +"db6c71d6": "rspContract(address,uint256)", +"db6c7286": "CTokenGB()", +"db6c9416": "AgoraToken()", +"db6f1e74": "getUser(uint32)", +"db6f7537": "getPOOL_edit_22()", +"db6f9deb": "rewarded(uint256,address)", +"db6fcf01": "is_destroyed(uint256)", +"db7057fb": "rngId()", +"db714efe": "getBlocks(uint256,uint256)", +"db71c776": "setRateIcoPreICO(uint256)", +"db71d8b6": "FEE_SELECT_LRC()", +"db723e73": "personalMincap()", +"db72496f": "cancelSubscription(uint256,uint256)", +"db737c78": "getToken(uint256,bool)", +"db73bfce": "gameInfo()", +"db7400a5": "createAppInstance(bytes32,bytes)", +"db747f21": "setOraGasLimit(uint256)", +"db74847d": "distributeTratok(address[],uint256[])", +"db74c27a": "backRedPillTokenOwner()", +"db75dd5f": "AQBToken()", +"db76790f": "setAdvisorWallet(address)", +"db76e9c2": "setMemberLevel(address)", +"db77032d": "RATE_SALESTAGE4()", +"db775041": "donation(bytes32,uint256)", +"db775410": "setTypedJackpotWinner(address,uint256)", +"db7757cf": "valueRaised()", +"db78d0ce": "getAirdropAtSnapshot(address)", +"db78f5ef": "withdrawOnBehalf(uint256,string,uint256,uint8,bytes32,bytes32)", +"db79a65f": "resetUserWhiteListAmount()", +"db79e673": "getTradeOfferRecipientItems(uint256)", +"db7a0855": "MZToken()", +"db7a2f42": "projectAgent()", +"db7a4605": "getWallets()", +"db7a80f8": "getContributionUSD(address)", +"db7b87ff": "init(address,uint256,bytes32,uint256,uint256,uint256,bool,bool,address)", +"db7bc073": "refundWhenNotClosed(address)", +"db7ca38a": "XaurmProxyContract()", +"db7d2665": "FundTransfer(address,uint256,address)", +"db7d9065": "assignedAmountToCooperativePartner()", +"db7ed9e7": "addAssessorToPool(address)", +"db7ef562": "_2_nation()", +"db7ef7c6": "verifyEscrowVendor(uint256,address)", +"db7f1e6b": "getInitialEnemyCombination()", +"db7fea95": "WALLET_T8EX_RESERVED()", +"db803a86": "post(string,address[])", +"db80813f": "set(bytes32)", +"db80a787": "emitCourtUpdated(address)", +"db80fbc9": "balanceOfLockup()", +"db82967c": "createUsingProxy(address,bytes)", +"db8298f3": "_commissionTarget()", +"db833e3a": "sellShares(bytes32,uint8,uint256,uint256)", +"db83694c": "getSaleInfo()", +"db8374ee": "buyOracleFor(bytes,address,address)", +"db83d02f": "VREO_SALE_CLOSING_TIME()", +"db84252c": "tokenCreator()", +"db852ee7": "pieceSold(address,address,uint256)", +"db856759": "depositOldTokensFor(address,uint256,address)", +"db856f28": "_updateCard(address,uint256)", +"db85bd78": "registerTraderAccount(address)", +"db86d850": "transferGoo(address,uint256)", +"db87cbcc": "GetPermissionsList(address,address)", +"db88176f": "getQuestion(uint256)", +"db8850bc": "_merge(uint256,uint256)", +"db886f23": "Marketing()", +"db89c044": "reputationOf(address)", +"db89edb2": "BitDailyBot()", +"db8a61d4": "APP_BASES_NAMESPACE()", +"db8b6ccf": "addSubjectMatter(string)", +"db8b7fae": "transform(address)", +"db8bcec4": "MAX_TIME_RANGE_COUNT()", +"db8cee5e": "_generateRandomDna(uint256)", +"db8cfa5a": "HAVtoUSD(uint256)", +"db8d55f1": "getFees()", +"db8d7c39": "disableRestriction()", +"db8e9043": "SetOutRate(uint256)", +"db8ecf34": "registerFreelancer(string,string,bytes32,uint256,uint256,uint256[],string,string,bool,string,uint256,uint8,uint256[],uint256[],string)", +"db8ed8a7": "withdraw_a_bit(uint256)", +"db8ee692": "_price_tokn_ICO()", +"db8f0301": "getAEth(uint256,uint256)", +"db8f2f75": "EthStorageContract(address,address,address[],uint256,uint256,string,string,uint8)", +"db8f5a35": "feesAndBountySupplyRemaining()", +"db8f7fb5": "preDiscountPercentage()", +"db9078b4": "CheckGenChip(uint32)", +"db9090a7": "devTokenWithdraw(uint256)", +"db91095e": "LVXToken()", +"db91774c": "setMinValue(uint256)", +"db9254a5": "_buy(address,uint256,uint256)", +"db9311c2": "getBlocksToNextRound()", +"db93f375": "startTokenVotes(address[],uint256,uint256,uint256,address[])", +"db946a11": "PlayStationChain()", +"db958f18": "FootCoin(uint256,string,string)", +"db95937d": "orderContractorProposal(uint256)", +"db967d05": "endOfPhase3()", +"db97c24d": "uzziToken()", +"db98abd8": "testThrowCancelSellOrderTwice()", +"db98d73f": "setRecordAddress(address)", +"db99800c": "fetchCreatedOrdersForMerchant(address)", +"db9a21bb": "CreateRZM(address,uint256)", +"db9abbd4": "arr(bytes32,bytes32)", +"db9b6775": "testMintThis(int256)", +"db9b7170": "setApproval(address,bool)", +"db9cc410": "createAsset(string,uint256)", +"db9cc99d": "AuctionCancelled(uint256,uint256)", +"db9cd8d3": "tab()", +"db9d28d5": "numDigits(uint256)", +"db9d5d31": "AdminRemoved(address,address)", +"db9dfb35": "newTeamOnEnd(uint16,uint64,uint64,uint64)", +"db9f16a8": "takeOffItem(uint256,uint8)", +"dba01cfe": "distributePENT(address[],uint256,uint256)", +"dba07858": "_removeFromList(address[],address)", +"dba0e9bb": "ethertoteDevelopmentWallet()", +"dba1a5f9": "allocateFunds()", +"dba1ac3d": "getEnforceRevisions(bytes20)", +"dba21586": "ProofOfTrevonJames()", +"dba21657": "askForEther(uint256)", +"dba22cb0": "transferPlanet(address,uint256,uint256,uint256)", +"dba232e3": "POPToken()", +"dba2a570": "_tune(uint256,uint256)", +"dba2d875": "forcedRefund()", +"dba31911": "bookSpaVisit(uint256)", +"dba33c03": "saleTokensCents()", +"dba3e704": "setMinimumContribution(uint256)", +"dba4c85c": "GetWithdrawBalance(address)", +"dba56cb8": "buyTokensFromContract(address,uint256)", +"dba5e917": "SelfDestruct()", +"dba6f7be": "verifyCreateSig(address,uint256,uint256,bytes32,bytes)", +"dba72a4e": "ICONIQ_SALE_OPENING_TIME()", +"dba7ef7d": "Bookie(address,address)", +"dba86ab6": "claimCardboard(uint64)", +"dba8be6e": "chickenTokenDelegator()", +"dba989ca": "_bonusTime2()", +"dba9a8a2": "setTrCut(uint256)", +"dba9daab": "pickBigWinner()", +"dbaaa2dd": "MIN_CONTRIBUTION_PRESALE()", +"dbaab3e1": "setMarketingAdmin(address)", +"dbaad1e5": "ownerDied()", +"dbab2f97": "merge(address[],bytes32,bytes32,int256,int256)", +"dbab7f1b": "UserInfoContract()", +"dbac248b": "MannaCoin()", +"dbac4cbf": "GetContractStateTerminatedSecDep()", +"dbac7806": "milestone()", +"dbacc237": "holderOf(uint256)", +"dbad21af": "tickets1kprice()", +"dbaea636": "UVPToken()", +"dbaec0fd": "createPattern(bytes32,string,address,string)", +"dbaf023d": "LogoVote()", +"dbaf2145": "requestWithdrawal()", +"dbaf5ce7": "changeRatesToken(uint8,uint256)", +"dbaf7247": "getValueByIndex(uint256)", +"dbafd0f2": "getTotalSeconds()", +"dbafdbb6": "setBalanceLimit(address,uint256)", +"dbb094ef": "Crowdsale(address,uint256,address,address)", +"dbb173d9": "test_updateKey_decreaseNoHint(int256)", +"dbb183c2": "setAuthorizedLogicContractAddress(address)", +"dbb24554": "updatePriceDenominator(uint256)", +"dbb34667": "getDsoStake(uint256)", +"dbb3cef3": "developer_update_Terms_of_service(string)", +"dbb47d77": "claimPlayerWinnings()", +"dbb56384": "encodeUtxoPosition(uint256,uint256,uint256)", +"dbb57a4b": "transferOne(address,uint256)", +"dbb61238": "maxDelay(uint256)", +"dbb62f24": "setDataMining(address)", +"dbb633f1": "ownerWithdrawalDate()", +"dbb72f67": "nullify(address)", +"dbb80e42": "allTokensLength()", +"dbb82429": "_randByRange(uint256,uint256)", +"dbb833df": "investWithoutId()", +"dbb8a305": "getBetName(uint256)", +"dbb98cae": "limit7()", +"dbb9deda": "goNext()", +"dbbabdfe": "getnum(uint256)", +"dbbb119c": "addMaster(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint32,uint32)", +"dbbb206f": "buy(address,address,address,address,address)", +"dbbbe8df": "transferByCrowdsale(address,uint256)", +"dbbc6fcc": "isPayableEnabled()", +"dbbc853b": "tokenURISuffix()", +"dbbd3a71": "addClaim(address,bytes32,string,string,address,uint256)", +"dbbd4865": "isEarlyBirdsStage()", +"dbbd78da": "getAccountNickname(address)", +"dbbd7934": "findItem(address[],address)", +"dbbd9a04": "ALLOC_MAX_PRE()", +"dbbdad8c": "generateReleaseTokensSchemaHash(address,address,uint256,bytes32)", +"dbbdae63": "updateSeller(address)", +"dbbdf083": "register(uint256,address)", +"dbbe2ff9": "setCirculationShares(string)", +"dbbf01b2": "setAddUsers(address,address,string,string,uint256)", +"dbbfcd7c": "getCOR()", +"dbc02821": "XTVNetworkContractAddress()", +"dbc0c085": "teamMultisig()", +"dbc139be": "LogMigration(address,uint256)", +"dbc1f226": "suicide(address)", +"dbc27799": "pendingNewRound()", +"dbc2783d": "DoNotDeployThisGetTheRightOneCosParityPutsThisOnTop()", +"dbc2d042": "consumerAddress()", +"dbc2ef49": "getNotUsedToken_()", +"dbc38940": "executeTxn(uint256)", +"dbc45228": "newProposal(address,uint256,bytes,bytes)", +"dbc488e2": "ESlotsCrowdsale(address)", +"dbc53c07": "read(uint16,uint16)", +"dbc56297": "claim(address,bytes32,bytes32,uint8,bytes32,bytes32)", +"dbc57971": "getIcoStatus()", +"dbc5d002": "sendQuery(string,uint256,uint256)", +"dbc65f85": "preBuyPrice2()", +"dbc69521": "totContribution()", +"dbc7464b": "getEquippedItemId(address,uint256)", +"dbc837c5": "insurer()", +"dbc8817d": "GOLDENRATIO()", +"dbc91396": "cancelOrder(uint128)", +"dbc91ed1": "subset(string,uint256,uint256)", +"dbc933bc": "p_withdrawDevHoldings()", +"dbc9ef42": "_removeAuction(uint40)", +"dbca1207": "getLastSeed()", +"dbcbaca4": "investorInfo(address)", +"dbcbb362": "setTransperRun(uint256)", +"dbcc4658": "getSmartContractByPosition(uint256)", +"dbcc6caf": "second_release(uint256)", +"dbccb926": "CreatedToken(address,uint256)", +"dbcd258d": "blocksPerHour()", +"dbce1ff7": "referralRateInviter()", +"dbceb005": "split(uint256)", +"dbcf0531": "ContractFullfilled(address,int256)", +"dbcf194a": "GetInventoryCount(address)", +"dbd01de1": "cluster()", +"dbd05767": "RBA()", +"dbd0e1b6": "getSeller()", +"dbd16774": "IGMathsContract()", +"dbd19619": "round_earnings(uint256)", +"dbd1be77": "getDrone(uint256)", +"dbd1df92": "setTitulaire_Compte_1(uint256)", +"dbd229ff": "totalSupplyMarket()", +"dbd2a4c5": "promoterInfo()", +"dbd2ac60": "distributeCallback(uint256,uint256)", +"dbd3100e": "getBuilding()", +"dbd3313e": "PizzaPoll()", +"dbd3c372": "safeMulticastTransfer(address[],uint256[],uint256[],bytes)", +"dbd3cd62": "withdrawPayment(uint256)", +"dbd3d021": "findNextSecond(uint256,bytes2)", +"dbd42da5": "ranked()", +"dbd4a422": "synthetixState()", +"dbd4a8ea": "setBase(address,uint64,bool)", +"dbd54b62": "setMasterAuth(address)", +"dbd55fb3": "ACTION()", +"dbd594bb": "FoundsTransferd(address,uint256)", +"dbd5ef6d": "setFeeConfig(uint256,uint256,uint256,uint256)", +"dbd64ae9": "closeSale3()", +"dbd6da8c": "isUidSet(string)", +"dbd6f5c1": "allocationAddress()", +"dbd760ca": "PriceThreeDisable()", +"dbd7fd13": "saleMilk()", +"dbd84659": "receiveTokenByClientAccount(string,uint256,address)", +"dbd848e3": "ICO_Ended()", +"dbd8987c": "contractFeePercentage()", +"dbd8c25f": "BasicTokenImpl()", +"dbd91792": "multiowned()", +"dbd9a4d4": "setAllowances()", +"dbdb8b56": "eosGAS()", +"dbdb96c2": "updated_policy_payload()", +"dbdbbb28": "getRoundBonusRate()", +"dbdc275d": "createB()", +"dbdd5ae6": "actOnBehalf(bytes,uint256,uint8,bytes32,bytes32)", +"dbdd5d74": "swapsFor(address)", +"dbddcdb7": "getScouponBalances(address)", +"dbde1988": "transferFromWithoutReward(address,address,uint256)", +"dbde2f19": "min(uint8,uint8)", +"dbdef054": "setFinalizeAgent()", +"dbdf7fce": "resetCounter()", +"dbdf8538": "_emitWorkStarted(uint256,uint256)", +"dbdff2c1": "getRandomNumber()", +"dbe01790": "getAllHpbNodes()", +"dbe1053d": "sendEthBackToUsers()", +"dbe201c7": "getAllBidsByAdslot(uint256)", +"dbe2bc84": "_suspendMarket(address)", +"dbe2c85b": "checkFiscalVerify(bytes32)", +"dbe2e296": "pushToPot()", +"dbe3010c": "WINNER_SHARE()", +"dbe3071a": "Kitchen()", +"dbe3117a": "tier2Timestamp()", +"dbe35007": "getAuctionsLength()", +"dbe3e92f": "provenanceOf(address)", +"dbe54524": "set_CWC_Address(address)", +"dbe55e56": "platformAddress()", +"dbe587b9": "CashPokerProPreICO()", +"dbe5bab5": "getOpenOrders()", +"dbe5ca78": "POAP()", +"dbe5fe9d": "setMaxCoinSides(uint8)", +"dbe6c02f": "isOwnerOrOperator(address,address)", +"dbe705ea": "fetchCreatedOrdersForMerchantByAdmin(address)", +"dbe7e3bd": "claimed(uint256)", +"dbe992af": "updateEntry(uint256,address,uint256)", +"dbe9eebf": "getPricePointsLength()", +"dbea52d8": "lotteryPrice()", +"dbeab275": "createRoutingCode(bytes32)", +"dbeabd21": "getPplsAddr(uint32)", +"dbecc372": "Example(uint256)", +"dbecfb25": "koth_v1b()", +"dbed1e88": "getUnlockTime(address)", +"dbed3a30": "GamePoolAddress()", +"dbedf9e4": "TB01()", +"dbee0dea": "releaseTimeLock()", +"dbeea819": "tokenGrantees(uint256)", +"dbef0790": "returnUnsoldTokens(address)", +"dbefe789": "NUM_OF_PHASE()", +"dbf14295": "claimSilver(uint64,uint64,uint64,uint64,uint64,uint64)", +"dbf14dd9": "buyfloaksAgainstEther()", +"dbf1b00b": "claimBeer()", +"dbf1bfee": "ballotFee()", +"dbf1ede3": "_getLogTokenContract(uint256)", +"dbf1f780": "_hasEntryForCompetition(address,uint256)", +"dbf1fe48": "calculateTokensFromWei(uint256,uint256)", +"dbf27e0c": "updateConstitutionPoll(address)", +"dbf2c9da": "isValidAuthority(address)", +"dbf2f3c2": "get_reward(address)", +"dbf323dd": "DEDToken()", +"dbf35430": "ownedOwnershipTransferred()", +"dbf44530": "isWhite(address,address)", +"dbf45aa3": "EthBank()", +"dbf4c54c": "batchTransfer(address[],address[],uint256)", +"dbf502c0": "getCentsPerETH()", +"dbf517a2": "_connectModule()", +"dbf53a0e": "StandardTokenMock(address,uint256)", +"dbf552aa": "LOG_InvestorEntrance(address,uint256,uint256)", +"dbf5b91b": "setSafeGas(uint256)", +"dbf5eb1c": "closeTokenSale(address)", +"dbf63340": "availableSynthCount()", +"dbf675c9": "bonusAddresses(address)", +"dbf724c7": "setReceiver2(address)", +"dbf76c03": "bountyOfflineWallet()", +"dbf79dcd": "StatusCow(address,uint256)", +"dbf7dc0c": "getEntityList(bytes32[],uint8[])", +"dbf81cc6": "foundersTokensAddress()", +"dbf8d2fa": "sendTips()", +"dbf98f6a": "totalSupplyBonds()", +"dbfa5863": "_endDate()", +"dbfa6226": "interfaceInstances(uint256)", +"dbfa980b": "Slogan(string)", +"dbfab65b": "AvalonToken()", +"dbfb129e": "ChecksumDatabase(string,string,string)", +"dbfb18e7": "GoblinChainToken()", +"dbfc74cb": "ORACLIZEGASPRICE()", +"dbfccd16": "ethersplay(uint8)", +"dbfdb6e5": "getIcoTokensAmount(uint256,uint256,address)", +"dbfdef01": "TechnoEng()", +"dbfe791b": "confirmed(bytes32)", +"dbfeb17f": "eth_cap()", +"dbfec8b7": "CHEXToken(address,uint256,uint256)", +"dbfef710": "getDefaultRequiredGas()", +"dbff4182": "seedCoins(address,uint32,string,uint256)", +"dc00adef": "buyLand(bytes32,int256[],int256[],address)", +"dc00b602": "EllipseMarketMaker(address,address,address)", +"dc00e43b": "BananaBasket()", +"dc012626": "ballotOf(address)", +"dc015851": "minimumContributionPhase4()", +"dc01bd0c": "calculateAmountForDAI(uint256)", +"dc021628": "setFund()", +"dc02511e": "addPermittedContracts(address[])", +"dc02f456": "decodeTransfer(bytes)", +"dc042405": "getNames(address[],address)", +"dc048cf2": "withdraw(uint256,string)", +"dc0527de": "NDEX()", +"dc06269f": "showWhaleAddr()", +"dc06b859": "numMarketMakers()", +"dc06d8f8": "lnTest(uint256,uint256)", +"dc06e754": "_setRspTokenAddress(address)", +"dc070657": "changeBeneficiary(address)", +"dc08a80b": "safeToAdd(int256,int256)", +"dc08b611": "EXAC()", +"dc08e2c5": "getVIPOwner(uint256)", +"dc08e5ff": "getStockCount()", +"dc09426c": "GetGameInfo()", +"dc09996c": "escrowDatabase(address,uint256)", +"dc09d8fd": "showInvestorsComission()", +"dc0b3564": "players()", +"dc0b48c1": "startPubTrade()", +"dc0ba228": "change(bytes,uint256[])", +"dc0bd011": "collectDonations()", +"dc0bd38e": "appendDecryptedBids(uint256[],uint256[],uint256[],address[],address,uint256[],uint256[],uint256[])", +"dc0bd75f": "arr(address,uint256,uint256)", +"dc0c1a27": "numberOfMajorEvents()", +"dc0c7735": "isPreSaleTokenSet()", +"dc0d3dff": "funders(uint256)", +"dc0d4cb6": "merculetContract()", +"dc0eb1a3": "PredictTheFutureChallenge()", +"dc0f5ffc": "get_candidate_pic(uint8)", +"dc11a496": "changeAdmin(address,bool)", +"dc11b386": "getDailyTarget(uint256,uint256)", +"dc11be24": "smallSize()", +"dc126e63": "unlockVestedTokens(address)", +"dc1279d4": "getPureFromGene(uint256[2])", +"dc129870": "Loom()", +"dc12a805": "right57(uint256)", +"dc12abb5": "setPresaleDates(uint256,uint256)", +"dc132be8": "getAmountofTotalParticipants()", +"dc13352a": "TeamSupply()", +"dc135226": "getValueFromDollars(uint256)", +"dc13f85f": "getMaxPriceSale()", +"dc14af38": "setIncrEth(uint256)", +"dc1542aa": "testSafeAdd()", +"dc154918": "_computeTournamentContenderCut(uint256)", +"dc154a19": "buyAndSetDivPercentage(uint256,address,uint8,string)", +"dc15c635": "getdeptinfo(uint256,address)", +"dc165652": "bountyTokensVault()", +"dc1790e3": "getdeptreqdetails(uint256,address)", +"dc17c9ca": "getTokenOwner(address)", +"dc17e808": "getPaidOrderByIndex(uint256)", +"dc183d64": "setBridgeValidatorsImplementation(address)", +"dc184e70": "reserveAccount()", +"dc190074": "setsafemode(uint256)", +"dc19266f": "Total_of_Players()", +"dc199335": "checkIdentifier(string)", +"dc1997ea": "landlord()", +"dc1abb6e": "MAX_AUDIT_TIME()", +"dc1b93cb": "COREXCoin()", +"dc1bba17": "getTxAmountMCW(bytes32)", +"dc1bebe6": "creditExecutedFundsLessFees(uint128,uint256,uint256)", +"dc1c1389": "acceptOfferForCity(uint256,uint16,uint256)", +"dc1cb47b": "priceTLP2()", +"dc1d672d": "mQueue(uint256)", +"dc1d70c3": "presaleBonusLock()", +"dc1d83b3": "changeTelephone(address)", +"dc1df3f6": "myTokens(address)", +"dc1eab83": "standardSale()", +"dc1fb5a5": "community()", +"dc1fca7e": "dateSaleStarted()", +"dc1fdff0": "commissionSum()", +"dc201838": "QuickPrice()", +"dc206e5f": "oraclize_query(uint256,string,string[])", +"dc20d6e7": "updateRandomNumber(uint256)", +"dc20f957": "assetIncome(bytes32)", +"dc21b3de": "preIcoBonus(uint256,uint256)", +"dc22aca5": "GalaxiumCoin()", +"dc22cb6a": "series(uint256)", +"dc22eba6": "register(uint256,uint256,uint256,uint256,uint256)", +"dc2424fc": "setPositionPrice(uint256)", +"dc242e38": "calTotalSupply(uint256)", +"dc2811cd": "KDOU()", +"dc2816b7": "AddNewChip(uint32,uint8,uint8,uint8)", +"dc28d0c9": "tokenToValue(address,uint256)", +"dc298682": "createCategory(string)", +"dc29a89e": "concatBytes(bytes,bytes,bytes,bytes,bytes,bytes,bytes)", +"dc29da22": "getNodeHash(address)", +"dc29ec37": "tokenReserve(address,uint256)", +"dc29f1de": "topUp()", +"dc2a3056": "setTripleRoomMax(uint256)", +"dc2a60f6": "isReadOnly()", +"dc2af3de": "getCEOAddress()", +"dc2b32e6": "getWeiInvested(address)", +"dc2ba357": "SetupQDA(string,string,uint256,uint256,uint256,address,address,uint256)", +"dc2c928a": "pausePlayerContracts(uint256,uint256)", +"dc2cf3f5": "timeElapsed()", +"dc2d46f8": "getWeiAmount()", +"dc2df955": "get_project_information(uint256)", +"dc2e47c8": "save4(address,bytes,string)", +"dc2e7b33": "cal(uint256,uint256)", +"dc2ebcbc": "whitelistMainSaleAddressMany(address[],bool)", +"dc2f56cf": "transferAgreement(bytes32,address)", +"dc2f7867": "setMaxLength(uint256)", +"dc2f8744": "bounties(uint256)", +"dc2f8a38": "setResult(uint256,uint8,int8)", +"dc30685e": "gas4Token()", +"dc3080f2": "spentAllowance(address,address)", +"dc30e253": "doFinalizeSale(uint256,uint256)", +"dc30f912": "addTokenization(string,string,uint8)", +"dc3134ae": "getIslandBattleStats(uint256)", +"dc31adee": "releaseMarketingTokens()", +"dc31e06c": "NEKOCOIN()", +"dc31e473": "opmAddress()", +"dc322802": "stage2Bonus()", +"dc32c72f": "secondReserveTimeLock()", +"dc340a76": "dataControlDelOwner(address,address)", +"dc3496d7": "allHashTypes(uint256)", +"dc35213f": "change(address,uint256[])", +"dc35a6bd": "LOWER_PRICE_RESET_PERCENTAGE()", +"dc35a900": "createOffer(uint256,uint256,uint256)", +"dc35ea16": "bonusInPhase1()", +"dc371e54": "deleteName(bytes32)", +"dc376392": "ETCCoin()", +"dc3774b3": "availableBalances(address)", +"dc382cbf": "sumAcceptedContrib()", +"dc391176": "delayedPayments()", +"dc39537a": "AVAILABLE_BONUS2_SUPPLY()", +"dc39d06d": "transferAnyERC20Token(address,uint256)", +"dc39e5fe": "removeOperationType(uint32)", +"dc3a1cad": "setIBalances2(uint256[],uint256[])", +"dc3a8372": "controllerApproval(address,uint256)", +"dc3a9433": "lockedFundsPercent()", +"dc3ab866": "checkEarnings(address)", +"dc3acebe": "getApp(address)", +"dc3c39aa": "TCDC()", +"dc3ccfdd": "transfer_tokens_from_contract(address,uint256)", +"dc3d1a2a": "addNewEmployeeWallet(address,address)", +"dc3d2b5c": "MiniMeIrrVesDivToken(address,address,uint256,string,uint8,string,bool)", +"dc3d4203": "createPatient(bytes32,bytes32,uint256,uint256,uint256,bytes32,uint256)", +"dc3d6305": "_transferFromAllArgs(address,address,uint256,address)", +"dc3da6e9": "IcoAddressSet(address)", +"dc3ecbb4": "debug_wei()", +"dc3ef685": "feePromille()", +"dc3f65d3": "createdByMe()", +"dc3f7536": "AdamToken()", +"dc40af1f": "oneTimeTickets(address)", +"dc414448": "_addToParticipants(address)", +"dc415804": "setFiscal(bytes32,uint256,uint256,uint256)", +"dc419fd8": "cancelOrder(bool,uint256)", +"dc41e726": "IndoJek()", +"dc420fd2": "withdrawPayoutFromBet(uint256)", +"dc4243f1": "setSalaryToken(address,address,address,uint256)", +"dc441754": "addDocument(bytes32,string,string,uint256,uint256)", +"dc44bb1c": "createEscrowFrom(address,address,uint256,uint256)", +"dc454c13": "EDROP()", +"dc45b93a": "contributorsCompleteCount()", +"dc45bfb3": "buyPack(uint256)", +"dc45d08e": "getEtherBalance(address)", +"dc45e27f": "getBonusBalanceByType(uint256,uint256,bytes1)", +"dc460933": "assignRole(address,bytes32,address)", +"dc46a76d": "getIdeasSinceLastDeploy(address)", +"dc46c813": "TwoExRush()", +"dc46d984": "numGamesCanceled()", +"dc47b3c1": "numberOfTokenIds()", +"dc47e5b7": "approveAndCall(address,address,address,uint256,uint256,uint256,uint256,bytes,bytes)", +"dc489c9b": "setAirdropper(address)", +"dc493790": "advisoryWallet()", +"dc4a307c": "createCommonAuction(uint256,string)", +"dc4b3115": "thirdPriceTime()", +"dc4baedd": "checkVerify(address)", +"dc4bc06e": "getUserCategory(address)", +"dc4c4005": "RemoveUser(address,address)", +"dc4d2ccd": "DiscountPercentToken(uint256,string,string)", +"dc4ece27": "BONUS_3_DAYS()", +"dc4ee13f": "overallTakenEther()", +"dc4f63cc": "cap_max()", +"dc502d64": "ethToBeDistributed()", +"dc50af26": "against()", +"dc51fba8": "SetherFinalized()", +"dc52696f": "tokenSupplyChanged()", +"dc52c514": "batchCreateDrawings()", +"dc533342": "reconciliationDateSet()", +"dc53903b": "fundsReceived(uint256)", +"dc540979": "POFOMO()", +"dc5418b1": "view32()", +"dc541eb7": "SelfllerySale()", +"dc542a79": "isMaximumGoalReached()", +"dc542c0f": "ALIToken()", +"dc547301": "setCurrentSupply(uint256)", +"dc54d919": "long_tokens(uint256)", +"dc555090": "updateTime()", +"dc555766": "createWithdraw(address,uint256)", +"dc566787": "topdownAndCashout(address,uint256)", +"dc570aad": "setPermission(address,string,bool)", +"dc57726f": "TokenGenerationEnabled()", +"dc57c1ef": "CopyrightToken(uint256,string,string)", +"dc57c323": "nextInputProfit()", +"dc57d553": "epochLast()", +"dc583801": "doubleyour5()", +"dc585713": "EtherFundMeIssueTokensCrowdfunding(string,string,string,uint256,uint256,uint256,address,address,string,string,uint256,uint256,uint256,uint256)", +"dc5936f0": "addCountry(bytes2)", +"dc596304": "NineLTDevToken()", +"dc597b47": "getAnimals(uint8)", +"dc5a2199": "ICO_WALLET()", +"dc5aa474": "lastBlock_f2Hash_uint256()", +"dc5acb90": "getOrThrow(string)", +"dc5b041b": "validationPassed(address)", +"dc5b0662": "getIndexByShip(uint256)", +"dc5b87cf": "getPartnerAllocation(uint256)", +"dc5bc461": "RadToken()", +"dc5bcafb": "UnicornToken(address)", +"dc5bf961": "totalTokensLocked()", +"dc5c3e06": "setFundraiseLimits(uint256,uint256)", +"dc5c9677": "changeSellerProposedValue(uint256)", +"dc5d184f": "setID(uint256)", +"dc5d9bfe": "migrationStep(uint256)", +"dc5df3fd": "ExperimentalPreICO(address,uint256,uint256,uint256,uint256,uint256,address)", +"dc5dff36": "LottoComplete(address,uint256,uint256)", +"dc5fced4": "totalRake()", +"dc5fe025": "forward(address,bytes,uint256)", +"dc5fe349": "releaseManyStakes(uint256[],address[],address[],uint256[])", +"dc602df2": "tokenValueMultiplier()", +"dc6037d1": "setbaseconfig(uint256,uint256,uint256,uint256,uint256)", +"dc60457c": "publicIssue(address,uint256)", +"dc6055dd": "BOUNTY_WALLET()", +"dc61164d": "getMySperm()", +"dc61456c": "cooAddCro(address)", +"dc622bcc": "setTokensAllocation(address,uint256,address[],uint256[])", +"dc62da61": "checkGameListed(address)", +"dc63a62c": "getFileListHead()", +"dc63f0be": "getSatOwed(address)", +"dc646367": "endSale(bool)", +"dc64752d": "collectsAccountDividends(address)", +"dc659907": "useModule(address)", +"dc661aaa": "mainICOFirstWeekEndTime()", +"dc6668db": "make_anonymous_withdraw(uint256)", +"dc667d0c": "getCountriesCount()", +"dc669dd4": "EndorToken()", +"dc689d3c": "getBaseDenomination()", +"dc693ca7": "totalWeiAmountSale1()", +"dc69a2d6": "tearDown(uint256)", +"dc69aa23": "SudanGoldCoinCrowdsale(uint256,uint256,uint256,address)", +"dc6b1cbd": "setUser(address,address,uint256,uint256)", +"dc6b7fb4": "LockedAccountThresholdUsdUpdated(uint256,uint256)", +"dc6b9b29": "notesLength()", +"dc6bbdf5": "totalContributionInWei()", +"dc6bc372": "TokenChangerBNT(address,address)", +"dc6bfbb5": "nextBallotId()", +"dc6c0cdd": "Share()", +"dc6c3ee4": "setMaxTokenCap(uint256)", +"dc6dd152": "playerRollDice(uint256)", +"dc6e7262": "refundTransactionByMediatorFee(uint256)", +"dc6e9cf9": "_MINIMUM_TARGET()", +"dc6f39a3": "TriggerCooldown()", +"dc6ff38e": "MAIN_MAX_CAP()", +"dc7049bf": "annualManagementFee()", +"dc706a3a": "VictusToken()", +"dc70ab02": "setTotalExecutedPerDay(uint256,uint256)", +"dc718791": "changeRules(uint256,uint256,uint256,uint256,uint256)", +"dc71db43": "worldCupResultPart2()", +"dc720528": "AgriChainProduction()", +"dc726205": "rates(bytes32)", +"dc730c50": "initialSingleWithdraw(uint256)", +"dc73e49c": "swapToken()", +"dc7454dd": "amountReleased()", +"dc74665e": "totalLeaderboards()", +"dc75f2db": "multiowned(address[],uint256)", +"dc760edf": "hardCapCrowdSale()", +"dc76dc8d": "applyForCertification(string,string,string,uint256)", +"dc76fabc": "getSpotPrice()", +"dc77e5e1": "serviceTokensBurn(address)", +"dc787bba": "getCountTempHolders()", +"dc799f88": "BaseCertoChainContract()", +"dc79b176": "getUserGroup(address)", +"dc79c2ef": "addUser(bytes32,bytes32,bytes32,bytes32,bytes32)", +"dc79d069": "investorSupply()", +"dc7abeb3": "OPENSOURCE_TOKENS()", +"dc7ac1ba": "lendVault()", +"dc7b808e": "callLibSet(uint256)", +"dc7bbd72": "hasThreeStepWithdraw()", +"dc7cbfab": "priceCounter()", +"dc7df9d8": "testToUint(int256,bytes)", +"dc7e5762": "goNextPeriod()", +"dc7e88e8": "amountOfBooked(address)", +"dc7fc898": "bankermasterReq()", +"dc80035d": "setFoo(uint256)", +"dc801db6": "MyYLCToken(uint256,string,uint8,string)", +"dc80aaee": "DeltaToken()", +"dc81e2b8": "DarenHui()", +"dc82697c": "getContractValue()", +"dc835df5": "Sense()", +"dc8369ce": "myStakesOnCountry(uint256)", +"dc8452cd": "required()", +"dc845934": "getPlayerBetResult(uint256)", +"dc846d95": "Own()", +"dc84e79e": "raisedPreSaleUSD()", +"dc851b02": "itcERC20()", +"dc85561b": "firstRoomAvailable(string,uint256[])", +"dc85b996": "window1EndTime()", +"dc8650de": "_removeFreezer(address)", +"dc86e6f0": "baseUnit(bytes32)", +"dc87cfbf": "executeTransaction(uint256,bytes)", +"dc885527": "burnUnmintedTokens(uint256)", +"dc88e838": "getOAR()", +"dc8a0f65": "change_game_dice(string)", +"dc8b0203": "clearApprovalAndTransfer(address,address,uint256)", +"dc8bc70d": "finalizeSale(address)", +"dc8c06d8": "addEmployerFeedback(address,uint256,address,string,uint8)", +"dc8d1095": "simpleSubmit(uint256)", +"dc8d2696": "inboxSize(address)", +"dc8d26ad": "changeICODates(uint8,uint256,uint256)", +"dc8ee41e": "coldWallet1()", +"dc8f2ae0": "addExplicitPosition(uint32,int64[2])", +"dc8fbb44": "deathData_f12()", +"dc903eb7": "addChunk5ToWhiteList()", +"dc904e69": "waveCap3()", +"dc90e42f": "restrictedStockOf(address)", +"dc91868f": "backTo(address)", +"dc91b634": "Ticketh()", +"dc91ea68": "PayerStringUpdated(string)", +"dc92beec": "setManyWhitelist(address[])", +"dc93f7c9": "feePayedPerReserve(address)", +"dc94b4a4": "doPay(bytes32,uint256,uint256)", +"dc94e45d": "setDistrito(uint256)", +"dc9513c1": "JustifyClaimWithWitness(uint8)", +"dc951fdc": "totalOverthrows()", +"dc9564d5": "buy(uint256,string,address,address,address,address)", +"dc9590f0": "_START_TARGET()", +"dc965479": "FooContractCall(address)", +"dc97a4f9": "getTotalUnPayedDividendsAmount()", +"dc97d962": "getInt(bytes32)", +"dc97e366": "stageIndex()", +"dc9861db": "updateMeDao(address)", +"dc988b40": "allowWorkerToContribute(address,address,address)", +"dc992aa0": "minUSD()", +"dc998901": "SaveData()", +"dc9a1535": "isPublic()", +"dc9a190e": "isAllowedTrade(address)", +"dc9a1df3": "SafecontractsTREXToken()", +"dc9ac994": "iconiqSaleOngoing()", +"dc9ae17d": "burn(bytes,address,uint256)", +"dc9b6d68": "getTimeSinceLastEvent(address)", +"dc9bb7db": "noKing()", +"dc9c6e15": "_myinitialSupply()", +"dc9d625b": "setMaintainance(bool)", +"dc9deea3": "amountPurchasedWithDecimals()", +"dc9deeff": "setPresellPrice(uint256)", +"dc9e7a87": "TransferedERC20(address,address,uint256)", +"dc9e9ba0": "allowStart()", +"dc9eb903": "Tbond1()", +"dc9ebff7": "getTotalInvestedEther()", +"dc9f0622": "transferManual(address,uint256,string)", +"dca0b866": "TwoPersonContract(address,address,bytes32)", +"dca0f3ef": "getEntryFeePaid(address)", +"dca27d5e": "setV_R4(uint256)", +"dca44b39": "setPerOneEther(uint256)", +"dca5f188": "AddressBook()", +"dca5f6b0": "jurors(address)", +"dca60034": "isMapped(string)", +"dca6058c": "canSetTransferable()", +"dca67e5d": "_createResident(string,string)", +"dca6f378": "withdrawTokensFromPool(uint96)", +"dca703d0": "LogSetQuestionFee(address,uint256)", +"dca73e6b": "getMyStores()", +"dca7bcbe": "getWords()", +"dca80bc6": "EtheremonRankBattle(address,address,address)", +"dca92eb5": "terminateLiquidation()", +"dca95419": "recoverSigner(bytes32,string)", +"dca9fd5b": "editStatus(uint256,string,uint256,uint256,int8)", +"dcaa5620": "findNextWeekday(uint256,bytes)", +"dcaabed7": "getLastDeedByAddress(string)", +"dcabf93f": "refundstate()", +"dcac652e": "setOwnerShare(address,uint256)", +"dcac69c3": "inheritedPure(uint256,uint256)", +"dcace702": "getClientLastPaidRate(address)", +"dcacf19a": "finalizeAndRestart(address)", +"dcae2cb4": "getWinningPrize(uint256)", +"dcaee066": "setStakeDisbursementAddress(address)", +"dcaeea15": "setadmin()", +"dcaf391e": "totalAirDropToken()", +"dcafa43e": "SaxoToken()", +"dcafaec2": "setCostToCreateGame(uint256)", +"dcafee05": "killBalance()", +"dcb01759": "salesEth(address)", +"dcb032ce": "addNodeGroup(string)", +"dcb04503": "testConcatStorage33Bytes()", +"dcb0a094": "tokenSetBurnFeeProp(address,address,uint256)", +"dcb12421": "isSoftcapOn()", +"dcb1c012": "ChowSale()", +"dcb27883": "CallAborted(address,bytes32)", +"dcb31b82": "isConfig()", +"dcb35d06": "getTransactionApproveCount(uint256)", +"dcb36063": "crowdsaleMinter()", +"dcb3ff58": "updateDividendBalance(uint256,address,address,uint256)", +"dcb46e38": "setWorstCaseRateFactor(uint256)", +"dcb4775e": "tokenPartner()", +"dcb4876f": "removeAddresses(bytes32[])", +"dcb5930a": "ratingContractAddress()", +"dcb6af48": "calcAverageICOPhaseKeyPrice(uint256)", +"dcb7e083": "teamTokensInitial()", +"dcb7f86f": "getWinningPayoutDistributionHashFromFork()", +"dcb814ef": "presaleWhitelistDiscount()", +"dcb951de": "pushDividends(address)", +"dcb9528e": "getBiddingInfo(address)", +"dcb9d457": "updateClientOfContractorManagers(uint256,uint256)", +"dcba03da": "MINEA()", +"dcbab608": "initialize(uint256,uint256,uint256,uint256,uint256)", +"dcbac60c": "winPrizes(uint256)", +"dcbad97b": "setEndIcoMainICO(uint256)", +"dcbc1288": "m_SMR()", +"dcbc1c05": "Deposit(address,address,uint256,uint256)", +"dcbc84ab": "coinsIssuedMkt()", +"dcbda04c": "setCrowdsaleInterface(address)", +"dcbe7cf1": "addInsuranceProduct(uint256,uint256,uint256,string,string,bytes32)", +"dcbf16d4": "Normal(uint8)", +"dcbfa406": "sendVirtTokens(address,uint256)", +"dcbfa4b7": "addSkills(bytes32[])", +"dcbfe3d5": "clearRequests(bytes32)", +"dcc0ccf3": "Dao(address)", +"dcc0e622": "setTokensForCrowdSale(uint256)", +"dcc1fd02": "angelSaled()", +"dcc23730": "setCurrency(uint256)", +"dcc279c8": "setHalted(bool)", +"dcc33e0b": "updateOperationalAddress(address)", +"dcc42e9b": "cards_blue_total()", +"dcc439cf": "updatePlayersGooFromPurchase(address,uint256)", +"dcc5237b": "FlatPricing(uint256)", +"dcc53305": "getMail(uint256)", +"dcc60128": "getProjects()", +"dcc6131c": "checkBalance(uint256[],address)", +"dcc66b4b": "addRelationshipBindingWineryOperation(bytes32,uint256,bytes32,int256)", +"dcc66cc2": "getDelegate(uint256)", +"dcc6762c": "withdrawalInitiate()", +"dcc6e7ad": "refundEth(uint256)", +"dcc71ed4": "AdvisorsAndFounders(address,uint256)", +"dcc76a92": "Ranking()", +"dcc7f6b0": "Ethen(address)", +"dcc819c8": "computeCntrAmountUsingUnpacked(uint256,uint16,int8)", +"dcc8592c": "KOCMOCToken()", +"dcc8a508": "partnerBonus(uint8)", +"dcc9a58c": "testCreateGame(string,string,bool,string,address,string)", +"dccb0c89": "test_1_someTest()", +"dccb37f1": "initialTokenBalance()", +"dccb5afb": "_emitTimeAdded(uint256,uint256)", +"dccb70a7": "setEnableAllTransfers(bool)", +"dccb98da": "SparkToken()", +"dccbb14b": "payInterests()", +"dccbfa2a": "minInvestedCap()", +"dccc6c94": "fireCloseProposalEvent(address,uint256)", +"dcccb41d": "setTransferAddress(string,address)", +"dccd4315": "startingAt()", +"dccdc893": "setNewWhiteList(address)", +"dcceaaa8": "sendShipmentTo(address,uint256)", +"dccee5b2": "posibleDividendsOf(address)", +"dccf77ce": "setCurrentBlock()", +"dccfbb62": "overthrow(bytes23)", +"dcd0fa9e": "get_arbits_min_contribution(address)", +"dcd1e670": "checkAmount(uint256)", +"dcd320a0": "bouncyCoinToken()", +"dcd3c2e5": "QLALA()", +"dcd4090b": "getStage3Start()", +"dcd4eb14": "addNewTicket(uint256,bytes32,uint256,uint256,uint256,bytes32,string)", +"dcd58e2f": "FUTURE_ME_ADDRESS()", +"dcd65479": "numPeriods()", +"dcd6561d": "currentSaleSold()", +"dcd7dd2e": "setKYCLevel(address,uint8)", +"dcd8023c": "TokenBranch(uint256,uint8)", +"dcd84f2a": "UserDestroy(address)", +"dcd93691": "retrieveOnFail()", +"dcd9c289": "getBAA(bytes32,address)", +"dcda0c8f": "requestDiplomaByNr(uint256)", +"dcda2385": "TransferSellAgentCreators(address,uint256)", +"dcda4554": "dazoToken()", +"dcda4bf3": "mOwner()", +"dcdaa35b": "mintAmount2()", +"dcdb622b": "MessageSet(string,uint256,uint256,address)", +"dcdbbe37": "lockTransferFor(address,uint256)", +"dcdc055a": "doBuy(address,uint256)", +"dcdc7254": "admin_set_shopStorePrice(uint256)", +"dcdc7dd0": "mint(address,uint256,bytes,bytes)", +"dcdd6d38": "getHolderAddresses(bytes32)", +"dcdd9af2": "DEX(address,address,address,uint256,uint256,uint256)", +"dcdda6d7": "teamUnfreeze()", +"dcde0019": "disapprove()", +"dcde835e": "NewSale(uint256,uint256,uint256,uint256)", +"dcdea898": "MintToken(address,uint256)", +"dce0b4e4": "creationFee()", +"dce11375": "emitter()", +"dce1d3c6": "addTokenPendingToken()", +"dce23e97": "getPriceValue(bytes32)", +"dce293a7": "minLength(uint256)", +"dce2b4c1": "getMarkup(uint256)", +"dce2f2dd": "Vouched(address,bytes32)", +"dce388b6": "payeePartsToSell()", +"dce4a447": "at(address)", +"dce4ae87": "DigixConfiguration()", +"dce4b34e": "submitAnswerByArbitrator(address,bytes32,bytes32,address)", +"dce4fa38": "IcoTokens()", +"dce57755": "getBlockLength()", +"dce579d1": "extendIco(uint256)", +"dce59311": "didOwnerEndCrowdsale()", +"dce59c00": "addPayee(address)", +"dce5c5a9": "norsefirePrice()", +"dce5c757": "cool()", +"dce5f277": "investorsAddress(uint256)", +"dce6417d": "DebitCoinToken(string,string,uint8)", +"dce722dd": "getJobSkills(uint256)", +"dce77d84": "getCurrentRate(address)", +"dce85216": "moveUnsoldTokens()", +"dce98784": "NiewGold()", +"dce9f6c3": "SuperConductToken()", +"dcea0a64": "ADX()", +"dcea7113": "buyOutPrice()", +"dcea80a5": "exchangeIEO()", +"dceacb93": "_createNewBadge(address,uint256)", +"dceaf74c": "youAre(address)", +"dceb3e7d": "getConfirmations(bytes32,address)", +"dcebb122": "extendSale(uint56)", +"dcec5ecc": "calcNewEmployeePoolOptions(uint256)", +"dcec7204": "EtherNeo()", +"dced2f1a": "currentCharId()", +"dceda27b": "getRegularCarSupply(uint256)", +"dcede2c3": "testIsSameSign()", +"dcedeeed": "claimIfNeededThenSteal(uint256,uint256,address,uint8,bytes32,bytes32,uint256,uint256)", +"dceeeae8": "ServiceController(address,address,address,address)", +"dcef8165": "CoinBirdDEX()", +"dcefa538": "buyTokens(address,address,uint256)", +"dcefcb8e": "extractCallData(bytes)", +"dcf00b6e": "getAccreditationActive(bytes32,bytes32)", +"dcf1579c": "thirdBonusPercent()", +"dcf1a9ef": "commissionBalance()", +"dcf1df05": "showValue(address,address)", +"dcf219f2": "setLootboxFee(uint256)", +"dcf34a91": "SpendingUnblockedEvent(address)", +"dcf3fb2a": "revoke(address,address)", +"dcf537b1": "multiply7(int256)", +"dcf63591": "course()", +"dcf6a592": "isGreaterThan(uint256,uint256)", +"dcf72c10": "buyTo(address)", +"dcf73856": "generateGroups()", +"dcf7bb5c": "changeTarget(address)", +"dcf7c0d0": "TokenTrader(address,uint256,address,uint256,uint256,uint256,bool,bool)", +"dcf7c2f9": "asset(uint8,string,bytes)", +"dcf8045e": "tiersInitialized()", +"dcf8113e": "campaignEndedSuccessfully()", +"dcf86587": "_transferWallet(address)", +"dcf8f13a": "getCurrentItemPrice(uint256)", +"dcf90793": "IcoWallet()", +"dcf91ea9": "MoftakToken()", +"dcf946c2": "getAllParentIds(bytes32)", +"dcf97439": "revealX(uint256,uint256)", +"dcf988d6": "GetFeeBalance(uint256)", +"dcf9bbec": "hasVerifiedAttributeIndex(address,uint256)", +"dcf9e836": "setProviderLimits(address,uint256,uint256)", +"dcfa6ac4": "buyChamp(uint256,address)", +"dcfa9222": "transferAccessTo(address,address)", +"dcfa9cc0": "testProxyCall()", +"dcfac095": "CPX(uint256,string,string,address)", +"dcfc3b46": "getAdIdByUser(address,uint256)", +"dcfc4430": "groomAddr()", +"dcfcda2b": "changeEscrow(address)", +"dcfda779": "allowCrowdsaleAddress(address)", +"dcfe63a9": "finishPrivateSale()", +"dcfe64e9": "SHA256()", +"dcfe8eb4": "SetIPR(string,string,address,string,string,uint256,string,string)", +"dcff2f76": "createAndJoinCDP()", +"dcff5581": "NewFeeAddress(address)", +"dcfff171": "setDelegadoDeDistrito(bytes32)", +"dd001254": "nameToTokenId(string)", +"dd00182b": "dogeAddress()", +"dd004ca8": "_endEdit()", +"dd009f48": "recursiveCeil(uint256,uint256,uint256)", +"dd00a9dc": "close(uint256,uint256,bytes)", +"dd00b605": "normalCheck()", +"dd012a15": "setIt(uint256)", +"dd01f781": "goToWork(uint256)", +"dd01f9e4": "LogNeededBalance(uint256)", +"dd022727": "getGameByIndex(uint256,bool)", +"dd029560": "CoreLayer()", +"dd02e30d": "isValidTxPaymentForKWh(bytes32)", +"dd03447f": "DiamondCash()", +"dd052519": "withdrawAllPlayers()", +"dd05db9a": "amountPerRelease()", +"dd0669d4": "getZCount(uint8,uint8)", +"dd0702d6": "changeTeamPoolForFrozenTokens(address)", +"dd083f20": "teamPart()", +"dd0860a8": "IsOwner(address)", +"dd08b5c9": "disableRedemption()", +"dd090981": "setName(uint256,uint256,bytes32)", +"dd09de33": "soldTokensOnIco()", +"dd09e13c": "totalRegistrationBonusAmount()", +"dd0a1019": "isReserveGenerated()", +"dd0ac8ac": "HoldCrowdsale(uint256,uint256,uint256,uint256,uint256,address,uint256,uint256,uint256,uint256,address)", +"dd0b1af5": "setMythexTokenAddress(address)", +"dd0b281e": "start(address)", +"dd0b7ffe": "setBuyNowPrice(uint256)", +"dd0c189c": "updateFirstExhangeRate(uint256)", +"dd0c42ab": "updateRequiredEntries(uint16)", +"dd0cf15d": "sendFund()", +"dd0cf7d4": "stopGuess(uint32,bool)", +"dd0d74ff": "IssueBank(address)", +"dd0e2373": "voterAddresses(uint256)", +"dd0e3902": "setData_6(string)", +"dd0e7832": "transferWithChange(uint256,address,address,address,uint256,uint256,bytes,bytes,bytes)", +"dd0f0808": "genEvent()", +"dd0f5a9a": "presalePiEnd()", +"dd0fa641": "winning_bets_total()", +"dd100efa": "getIcoEnded()", +"dd10d97e": "getPlayerWaiting()", +"dd11247e": "totalTickets()", +"dd114c22": "publish(address,uint256,address,uint256)", +"dd1219fd": "powerSwitch(bool)", +"dd12b51f": "getPermissionCheck()", +"dd137b5d": "toBase58(uint256,uint8)", +"dd13e20a": "forgeWeaponRarity(uint256,uint256,uint256,uint256)", +"dd13fd5f": "_acceptContribution(address,uint256,uint8)", +"dd14ab79": "updateTimestamp(bytes32,uint256)", +"dd151d1e": "pushAddressArray(bytes32,address)", +"dd155f3f": "removeAddress(uint256,address[])", +"dd15b66c": "MyWill(address,string,string,string,address,uint256,uint256)", +"dd15f993": "depositUSD(address,uint256)", +"dd16d981": "isCampaignValid(bytes32)", +"dd16fe09": "getCashBackObject(uint256)", +"dd17e151": "sendabr(uint256)", +"dd17eaec": "setMultipleRates(bytes32[],uint256[])", +"dd18b250": "getIdArray(address,address,string,string)", +"dd192de7": "affiliatesAddress()", +"dd193e7b": "addPerSell(uint16,uint256,bool)", +"dd1956b0": "InfiniviToken()", +"dd1a293a": "burnTokensFrom(address,uint256,uint256)", +"dd1a56a7": "WellnessToken()", +"dd1a5f0d": "_grandPVPLoserReward(uint256)", +"dd1a68c1": "report(uint16,uint16,uint8)", +"dd1aa549": "PARTNERS_WALLET()", +"dd1b1928": "getInputSize(uint256)", +"dd1b6137": "push(uint256,uint256)", +"dd1b7a0f": "nonFungibleContract()", +"dd1b89c6": "freezeExists(uint256)", +"dd1b9c4a": "POOL_FEE()", +"dd1bb3d1": "confiscateBalance(address)", +"dd1bb6f5": "TokenICOGAT()", +"dd1c35bc": "recycle(uint256)", +"dd1cdf84": "keybasePubURL(string)", +"dd1d5e64": "incGenLabFight(uint256)", +"dd1dbc3a": "calcUnMaskedEarnings(uint256)", +"dd1dc0ad": "RequestSale()", +"dd1dffb7": "getFundsCollected()", +"dd1e2651": "getUserKey(uint256)", +"dd1e4e11": "_getRandom(uint256)", +"dd1ee3d7": "whaleAddress()", +"dd1eee44": "couponTokenSaleAddr()", +"dd1f969b": "PURCHASE_AMOUNT_RATE_REFERENCE()", +"dd1fc642": "_approvedFor(address,address,uint256)", +"dd20a53e": "createTournament(uint256)", +"dd215410": "getWinnersIndex(uint256)", +"dd217ce1": "getAddusers()", +"dd218ff2": "addPreIcoPurchaseInfo(uint256,uint256)", +"dd21f395": "t_3rd_StageEnd()", +"dd22148f": "investedSumOnPreIco()", +"dd228801": "setAffiliateRate(uint256,uint256)", +"dd234dc7": "PixelBought(uint256,bytes32,uint256,address,address)", +"dd23795f": "bobMakesEthDeposit(bytes32,address,bytes20,uint64)", +"dd238603": "unsetWhitelist(address)", +"dd2407d3": "sendOnlyHash(bytes32)", +"dd242fa4": "staff_4()", +"dd253cd0": "setTransferMinimumFee(uint8)", +"dd2594af": "changeTokenApproves(uint256)", +"dd27efa0": "_packPVPData()", +"dd27fcad": "EternalCoin(uint256,string,string)", +"dd280c7a": "requestDetachmentOnPause(uint256)", +"dd288173": "doStore(uint256,uint256,bytes32)", +"dd28d12b": "ZILINGGOSupply()", +"dd28d14d": "getMembersInGroup(uint256)", +"dd294142": "institutionTimeLock()", +"dd2a07a0": "LCS()", +"dd2ac276": "genToLuck(uint256,uint256)", +"dd2ad311": "scheduleCall(bytes,uint256)", +"dd2bcae0": "DeviceIsDeactivated(address)", +"dd2c4d3d": "AdoptionRequestCancelled(bytes5)", +"dd2c888e": "balanceHistory(address,uint256)", +"dd2d2a12": "minimum(uint256,uint256)", +"dd2d4ea0": "tokensMain()", +"dd2e0ac0": "unlockToken(uint256)", +"dd2f4ebd": "getNumberOfGames()", +"dd300c6d": "getSettingChangeConfirmationCount(uint256)", +"dd301057": "noOfTiers()", +"dd3032bc": "RoundCHardCap()", +"dd30651f": "activateUser(address,uint256)", +"dd3129a9": "calculateAllBuyBackSum()", +"dd31f462": "clearDebt()", +"dd321018": "levelItemClass()", +"dd324fe7": "PieceStandardToken(uint256,string,uint8,string)", +"dd3260fc": "checkOpenTimer()", +"dd32858e": "withdrawWinner()", +"dd34abd3": "transferDirectorA(address)", +"dd34c9a3": "capFlex()", +"dd34dab8": "startTimeOfSaleLot4()", +"dd34e129": "PriceTest()", +"dd34e7be": "Vault(address,uint256,uint256)", +"dd365b8b": "pwn()", +"dd36b59c": "getPlanetOwner(uint256)", +"dd36e18b": "ContractStatus()", +"dd37ad1f": "calculateValueMantisseTrick(int256,uint64)", +"dd37be12": "mod(uint32,uint32)", +"dd3840ef": "PRIVATEPLACEMENT()", +"dd386239": "manuallySetNumRewardsAvailableForChildAddress(address,uint256)", +"dd397e03": "preIcoTarget()", +"dd3b014c": "getLatestVersion(bytes32)", +"dd3bd008": "getReadyTime()", +"dd3c407f": "_set7()", +"dd3ccd84": "percentForHelpCoin()", +"dd3d0bee": "changelp18(address)", +"dd3e5f47": "_sharesValid(uint256,uint256)", +"dd3ef6a6": "deathData_v12()", +"dd3f2893": "_processTokensPurchase(address,uint256)", +"dd3f8608": "FloatGameToken(bytes32,address)", +"dd3f9526": "_controller()", +"dd3fa136": "ship(string)", +"dd3ff4f6": "sendFeeToWallet(address,address)", +"dd413da0": "Vendi(uint256)", +"dd4198f4": "getScore(uint8,bytes32)", +"dd41cc2f": "getQuestionCount()", +"dd41e1c7": "redeemFrom(address,uint256,string)", +"dd420fc5": "auditorComment()", +"dd4253f7": "MeosunToken()", +"dd42c228": "totalLockedFund()", +"dd42faf7": "window3TokenExchangeRate()", +"dd4314b2": "unique_players()", +"dd443c7b": "cancelMarkets(uint256)", +"dd449a83": "allower()", +"dd44a15c": "allocateTokensForContributor(address)", +"dd450d4e": "transferFromBankToAccount(bytes32,uint256)", +"dd457c7f": "balancesSet()", +"dd45e247": "getUserListSize()", +"dd462e2d": "withdrawAmountHashing(uint256,uint256)", +"dd467064": "lock(uint256)", +"dd473d2b": "withdraw_all()", +"dd47fe15": "sendToTarget(address,address,address,address,uint256)", +"dd48087f": "balanceOfContract(address)", +"dd486c35": "ownerWantMyEther()", +"dd489e44": "setSystemStartingPriceMin(uint256)", +"dd48d911": "totalSellOrders()", +"dd49756e": "depositTokens(uint256)", +"dd49f1c8": "BooMToken()", +"dd4a055b": "buySale(uint8,address)", +"dd4a8361": "setWhitelistEntries(address[],bool)", +"dd4a8f61": "contractorManager()", +"dd4aac73": "SELLER_STEP_2_GET_PASS()", +"dd4aeb92": "manageMinting(bool)", +"dd4bc101": "weightOf(address)", +"dd4bd4b7": "getProjectMilestoneStartWindow(bytes32)", +"dd4c97a0": "approveNode(address)", +"dd4dfb62": "kUnit()", +"dd4e6993": "leerGat()", +"dd4e8823": "poiLockup()", +"dd4f1f2a": "multipleHomocide()", +"dd4f5f0f": "withdrawBBO()", +"dd4f8f74": "roundStartTime()", +"dd506e09": "changeRound()", +"dd50e9d4": "clearSummonNum()", +"dd510361": "setTransformTarget_pool(address,uint256)", +"dd5108d1": "addressToTotalDonationAmount(address)", +"dd510e98": "newLockUpAddress(address)", +"dd515cdb": "checkVotingForStartPayment()", +"dd51faa2": "setGas(uint256)", +"dd523559": "devuelveAddressUsuario(bytes32)", +"dd5244b4": "testTryProxyCallWithValue()", +"dd53c301": "mintContract(address,address,uint256)", +"dd54291b": "tokenCap()", +"dd54a62f": "content(string)", +"dd54cc0c": "advBtyWallet()", +"dd550958": "getOwnerAddress(uint256)", +"dd55f11b": "deleteCitizen(uint256)", +"dd55fba0": "createSecondPromoCollectible(uint256,address,uint256,address)", +"dd563726": "GoingGems(uint256,address)", +"dd565e76": "pushDecoration(uint256)", +"dd57d5c5": "setTrust(address)", +"dd585e7b": "newincomelog(uint256,string)", +"dd5891b3": "join(address,string,string)", +"dd58f5d9": "isIcoFinish()", +"dd592a32": "topUpAmount()", +"dd595328": "untransform(uint16)", +"dd59c954": "mintBatch(bytes32,bytes32,bytes32,bytes32,bytes32,address)", +"dd5a4efd": "GameRefunded(uint256,uint256,uint256)", +"dd5a612c": "getCashPrior()", +"dd5a7f40": "getContractCreationTxGasprice()", +"dd5ac448": "payoutReferrer()", +"dd5b23df": "transferBond(address,uint256)", +"dd5b29b7": "toB32(uint256,bytes)", +"dd5c2678": "KappyKoin()", +"dd5ca673": "setMintRequestStringMap(uint256,int256,string,string)", +"dd5cba71": "CHXTokenSale()", +"dd5dcd52": "findActiveRange(address)", +"dd5dd552": "_cancelOrder(address)", +"dd5dd8f2": "timeGap()", +"dd5ddfe8": "setPermission(address,uint8)", +"dd5df59c": "nonEtherBuy(address,uint256)", +"dd5e403c": "IcoFund()", +"dd5e5cb5": "changeMaxDrawingTime(uint256)", +"dd5e8410": "jackpotMedium()", +"dd5ea752": "burnAndConvertToQUA(uint256)", +"dd5f63fd": "niceguy3()", +"dd5f9a22": "STSTEST5()", +"dd604fcb": "EgyptianPound()", +"dd60b394": "giveFreezePermission(address[],bool)", +"dd60c898": "participantsCount()", +"dd611e8d": "Setter(uint256)", +"dd616a45": "ZeroCap()", +"dd62b1a0": "LalaToken()", +"dd62ed3e": "allowance(address,address)", +"dd62f6f3": "getPayoutDistributionHash()", +"dd63133a": "onPurchase(uint16,uint16,uint8,address,uint256)", +"dd6350a0": "withdrawContributed()", +"dd63f7d0": "functionReturningValue(bytes32)", +"dd644f72": "basisPointsRate()", +"dd66111d": "gameRoundEnd()", +"dd67a360": "OrderLifeCycle()", +"dd681e51": "ecosystemGrantsReserveWallet()", +"dd68b386": "TransactionRefundedAfterExpiry(uint256,uint256)", +"dd6996a3": "LOL3()", +"dd6ad764": "withdraw(uint8,address)", +"dd6afdfe": "Chou(uint8)", +"dd6b2fc6": "isBarCodeData(bytes32)", +"dd6b996d": "endDividendPool()", +"dd6c1394": "GazeCoinCrowdsaleWhitelist()", +"dd6e66d0": "tokenHoldersTotal(address)", +"dd6e8e6a": "_markRedemptionFulfilled(bytes32)", +"dd6ed59a": "initSubPayees(bytes32,address[],int256[])", +"dd6f0f19": "ApplicationIsInDevelopment()", +"dd719d2c": "airDrop(address,address,address[],uint256[])", +"dd7202d8": "getQuantum(uint256)", +"dd722127": "adminRemove(address,string)", +"dd7221e8": "LogPause(bool)", +"dd727ea6": "runJackpot()", +"dd729530": "add_shield(uint16)", +"dd72ae4e": "availableICO_w1()", +"dd73d17b": "getComment(address,address)", +"dd751310": "isRegisteredPublicKey(uint256)", +"dd75e7ff": "getENow()", +"dd75ecce": "getVestingAmount(address,uint256)", +"dd76d2fa": "setIdArray(address,uint256,string,string,address[])", +"dd787875": "setupSale(uint256,uint256,address)", +"dd791ce5": "tokenDec()", +"dd796b07": "indexOfCardAddress(address)", +"dd79cc6a": "secretBidCount()", +"dd79e33e": "splitIdentifiers(string)", +"dd7a1722": "accountLocked()", +"dd7aabc8": "_transferHelper(address,uint256)", +"dd7b3e97": "buyoutsEnabledFromTimestamp()", +"dd7b3f26": "bytes32ToBytes(bytes32,bytes32)", +"dd7bff82": "removeCandidates()", +"dd7d168a": "getEthBullet(string)", +"dd7d6bb0": "getLpAskPrice()", +"dd7db870": "addFreeVineyard(address)", +"dd7dde04": "maxTeamSize()", +"dd7e11be": "InternationalPaymentToken()", +"dd7eba7a": "ValentineRegistry()", +"dd7f2225": "MiCarsICO()", +"dd7f88ee": "date_start()", +"dd80f2a6": "Vibrancier()", +"dd817963": "lastBlock_f0Hash_uint256()", +"dd819721": "setNFTbyTokenId(uint256,string,bool)", +"dd838808": "endMigrationPeriod()", +"dd83a303": "cancelMortgage(uint256)", +"dd83c825": "backersAddresses()", +"dd8432fe": "getRemainingTokensForSale()", +"dd847dfe": "get_contract_money()", +"dd84acaa": "addressesAllowed(address)", +"dd859739": "SetBeneficiary(string,string,string,string,string,string,string,string,string,string,address,string)", +"dd85b1dd": "setServiceProvider(address)", +"dd85b82e": "EthealWhitelist(address)", +"dd8617ca": "payether(address,uint256)", +"dd86210a": "medalSymbol()", +"dd864883": "changeApprovalCore(address,uint256,uint256)", +"dd86f719": "COMMUNITY_BOUNTY_HOLDER()", +"dd87c9f0": "exeStatus()", +"dd897767": "isRealWorldPlayerMintingEnabled(uint128)", +"dd898fa2": "MinterStorePoolCrowdsale()", +"dd89daa5": "getBBFarmID(bytes4)", +"dd8a0c56": "vacate(address)", +"dd8ad12a": "executeAppReturn(bytes32)", +"dd8b0ff6": "rmax(uint128,uint128)", +"dd8bd8cb": "Patient(address)", +"dd8bf1f5": "setDistrict0xNetworkToken(address)", +"dd8c8855": "addWarehouse(uint256,uint256,bytes32)", +"dd8d11e2": "isValidSubscription(bytes32)", +"dd8d149d": "tokenCrowdsaleRate()", +"dd8d1cef": "totalUserCampaigns(address)", +"dd8d4c40": "getCallers()", +"dd8e668c": "FUND_FRAC_BOT()", +"dd8ee602": "log(bytes,uint256)", +"dd8ef66b": "cancelTrade(address)", +"dd8f3195": "HyperChipsToken()", +"dd8fee14": "regulator()", +"dd905097": "organisationWallet()", +"dd90c403": "getAccountFeed(address,uint256,uint256)", +"dd9180ea": "tokenReservationAllocated()", +"dd91f1f5": "toggleAuthorization(address,address,bytes32)", +"dd924594": "distributeAirdrop(address[],uint256[])", +"dd92a8b0": "confirmSell(uint256)", +"dd932c5b": "voteEnd(uint256)", +"dd93890b": "setMeta(uint256,bytes32,bytes32)", +"dd939155": "recordUpdate(address,uint256,int256,bool)", +"dd93c74a": "setInactivityReleasePeriod(uint256)", +"dd946033": "right81(uint256)", +"dd952089": "getTaxDataSignatures()", +"dd9546b1": "minInvestments()", +"dd9555f1": "withdrawBidForCollectible(uint256,uint256,int256)", +"dd955c44": "sellEth(address,uint256)", +"dd955d4c": "rawTransfer(address,bytes32)", +"dd9568b0": "messageInfo(uint256)", +"dd96440e": "DDD()", +"dd967b0b": "refundLoan()", +"dd9815a2": "claimPlayerProfit()", +"dd982bdf": "FaceBookCoin()", +"dd999ade": "cleanUpRounding()", +"dd9a76ff": "pay(address,address,uint256,uint256)", +"dd9a9e2c": "CORReserveAccount()", +"dd9bc47e": "finish(address,address)", +"dd9bf998": "authorizeTradingAccounts(uint256)", +"dd9bfb04": "bakanceOfBeer(address)", +"dd9cfc4b": "tokenSalesByAsset(address,uint256)", +"dd9d687e": "namehash(bytes32)", +"dd9dd688": "calcStopPrice()", +"dd9e3848": "NewHolder(address)", +"dd9e4094": "makeMemChange1(uint256,uint256,uint256,int256)", +"dd9e7b1b": "max_raised_amount()", +"dd9ea299": "getLastDepositId()", +"dda0268d": "queryBetUnit()", +"dda0c1d6": "adminAmendBallot(uint32,string,uint256,uint256)", +"dda0e4ba": "finishAllGames()", +"dda0f1bb": "sendToTicker()", +"dda13903": "GoldOwner()", +"dda2d923": "setIcoAddress(address,address)", +"dda3342b": "ReplicatorFactory()", +"dda342bb": "list(address,uint256,uint256)", +"dda38380": "CFTRAD()", +"dda3baff": "showlevel(address)", +"dda44b10": "buyRecipient(address,uint8,bytes32,bytes32)", +"dda477fd": "walletTransfer(address)", +"dda4fa8f": "setReserveWallet(address)", +"dda5062c": "userIds()", +"dda51424": "right80(uint256)", +"dda55b18": "GxTraders(address)", +"dda5d5cb": "saosao2()", +"dda5d799": "PRT()", +"dda6020b": "freezeMintUntil()", +"dda61c00": "getIsSecurityWalletReg(address)", +"dda63359": "setSellToContract(bool)", +"dda69410": "add(address,uint16,uint8,uint8)", +"dda6abb8": "sendToVestingContract()", +"dda6c3ce": "checkWinning(uint256)", +"dda6c7cf": "setActiveUserListLength(uint256)", +"dda72292": "BONUS_TIER_6_LIMIT()", +"dda81c15": "TIER_4_BUYIN()", +"dda89912": "setExchangeDetails(bytes32,bytes32)", +"dda943d6": "maxSet()", +"dda9939c": "Store(address[])", +"dda9f1a3": "HODLRegistration()", +"ddaa26ad": "START_TIME()", +"ddaa4c48": "granularPreallocate(address,uint256,uint256)", +"ddaa7e02": "GetTickSize3(uint256)", +"ddaaff27": "generateSection()", +"ddac6654": "validUntil()", +"ddad2ffe": "newNode(address)", +"ddad3ca1": "tokenMaxCap()", +"ddae2e26": "__save128(uint256[])", +"ddafaf4d": "reclaimNtvuEther(uint8)", +"ddb0fdc0": "addAvailablePack(uint256,bytes4)", +"ddb12a35": "countPayOrder()", +"ddb141c2": "execute_transfer(uint256)", +"ddb1bdc8": "credit(address,uint256,uint256)", +"ddb1ede9": "canceledBookingfc(uint256)", +"ddb22537": "withdrawDeadBids()", +"ddb25d71": "GBPproxy()", +"ddb31cea": "TEAM_TOKENS_LOCK_PERIOD()", +"ddb4897a": "NitroCoins()", +"ddb49f98": "SpiceNinja()", +"ddb5b3ac": "SellTokens()", +"ddb62333": "readTaskState(string)", +"ddb6af4c": "setTimeStamp(uint256,uint256)", +"ddb6e116": "vote(uint16)", +"ddb72188": "chAirDropLimit(uint256)", +"ddb792a0": "admin_from_To_transfer(address,address,uint256)", +"ddb863be": "multiPartySend(address[],uint256[],bytes)", +"ddb8b099": "itemNameOf(uint256)", +"ddb8f090": "GlobalTransfersUnlocked(bool)", +"ddb9341b": "SetBuildingDataArray(uint256[])", +"ddb9769c": "_settingsApplied()", +"ddba8c45": "verifyEscrow(uint256,address,address)", +"ddbb4ab4": "_bytes32ArrayToString(bytes32[])", +"ddbbc35c": "searchByName(string)", +"ddbcb5cb": "registerAs(address,bytes32,address)", +"ddbcb5fa": "MIN_AMOUNT()", +"ddbcf3a1": "ensNode()", +"ddbdf242": "traders()", +"ddbe7c41": "NeverEndingApp()", +"ddbe8f09": "voteEnd()", +"ddbe92d3": "setBondFundAddress(address)", +"ddbf5856": "completeLottery()", +"ddbf5c8f": "checkFee(uint256,uint256)", +"ddbfbdbf": "ETHERKUN()", +"ddbfd63e": "AddGoods(uint32,uint32,uint256,uint32,uint32,uint32,uint32,uint8,uint8,uint8)", +"ddc002e8": "TokenSold(address,uint256,uint256,bool,bool)", +"ddc0db14": "AmountBonusPricing(uint256[])", +"ddc12019": "_triggerCooldown()", +"ddc23059": "SchemeRegistrar()", +"ddc23ddd": "erc165InterfaceSupported_NoCache(address,bytes4)", +"ddc33450": "MNLTGUNE()", +"ddc35950": "setOwner(uint32,address)", +"ddc3e344": "_sellPutToClose(uint256,uint256,uint256,uint256,address)", +"ddc4aacf": "token4Gas()", +"ddc53c2c": "lastFreeBlock()", +"ddc541dd": "publisher(address)", +"ddc63262": "harvest(uint256)", +"ddc645f8": "CollateralReturned(uint256)", +"ddc6a171": "allowance(address,uint256)", +"ddc6f83e": "setIdent(string)", +"ddc6ffaa": "SecuredLedgerToken()", +"ddc86af6": "extractById(int128)", +"ddc8bb54": "PriceOf1000TokensInUSD()", +"ddc8d7a6": "_removePauser(address)", +"ddc983f2": "bonusEnds50()", +"ddca15de": "ServiceContract()", +"ddca337e": "SetMaxChequeValue(uint256)", +"ddca3f43": "fee()", +"ddcb1a94": "serviceBurn(uint256)", +"ddcbf794": "addScore(uint256,uint256)", +"ddcd3681": "getRemainingTrialDrops(address,address)", +"ddcd7ee9": "lastJson()", +"ddcd8763": "requestBuywithETH()", +"ddcd887b": "testMiddleTranchNotExact()", +"ddceafa9": "recovery()", +"ddcfa217": "newRecurringBillingContract(address)", +"ddd1002e": "LogStart()", +"ddd113f4": "numMarriages()", +"ddd1527b": "transferFromOwner(uint256)", +"ddd1b67e": "getCurrentMonth()", +"ddd35de8": "tokensPerBTC()", +"ddd41ef6": "transferDirector(address)", +"ddd505f6": "addTransaction(address,uint256,uint256,string,uint256,bytes)", +"ddd53cc5": "setupICOPrices(uint256,uint256,uint256,uint256)", +"ddd57872": "setTimeStamp(string)", +"ddd5e1b2": "claim(uint256,address)", +"ddd5e68b": "transferEthersToOwner(uint256)", +"ddd641b0": "tierName(uint256)", +"ddd6d79a": "remainingWithdraw()", +"ddd7c879": "claimWei(uint256)", +"ddd81f82": "registerProxy()", +"ddd83259": "_normalDistribution(uint256,uint256)", +"ddd85dd8": "Freda()", +"ddd9537d": "getUsdEthExchangeRate()", +"ddda66db": "setMerchantWallet(address)", +"dddac167": "VotingFinished(uint256,uint256)", +"dddaf901": "wcapToken()", +"dddb983b": "testFailCreateWithParentsForeignNotInUse1()", +"dddbb753": "getAdsCount()", +"dddd3594": "ConsentDirective(address,uint256)", +"dddd3de8": "getvalid()", +"dddf31f1": "lastClaims(address)", +"dddf33cc": "offerCatForSale(uint256,uint256)", +"dddfb2f2": "buyEIT()", +"dddff84c": "StandardCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"dde0523f": "changeVisitCosts(uint256,uint256,uint256,uint256,uint256,uint256)", +"dde05a67": "TinaCoin()", +"dde070e8": "getClaimAmount(address)", +"dde0d085": "mathTransfer(address[],uint256)", +"dde107c2": "stampIndextotransactions(uint256)", +"dde1589c": "icoTokensPrice()", +"dde26ec9": "createGrant(address,uint256,uint256)", +"dde27e29": "distributeTokens2(address[],uint256[])", +"dde2b332": "setTransferFrozen(bool)", +"dde2fc22": "DLCToken()", +"dde37357": "MultiOwner(address[],uint256)", +"dde3ae6d": "changeAssetOwner(address)", +"dde41aa9": "canonizedRegistry()", +"dde42067": "paidTokensOf(address)", +"dde43cba": "REVISION()", +"dde49979": "unlockFor(address)", +"dde4a70b": "getSell(uint256)", +"dde4dc8e": "Show_Patient(uint256,uint256)", +"dde4f41a": "releaseMultiWithStage(address[],address[])", +"dde5a65d": "purchase(address,address)", +"dde68e2e": "refundETHToCustomer(address,uint256)", +"dde6b340": "calculateLoanerInterest(uint256)", +"dde6e256": "getCarProduct(uint32)", +"dde6f449": "GlobfoneCoin()", +"dde6f484": "setMainAccount(uint256,address)", +"dde7af32": "warriorGold()", +"dde82c2d": "coinsRemaining()", +"dde8535f": "getMemberStatus(address)", +"dde8b7ac": "setFeeAbsMaxGlobal(uint256)", +"dde8c8d6": "getUserVote(uint256,uint160,bool)", +"dde8dab2": "BEERCOIN()", +"dde9394c": "returnOwners()", +"ddea6df3": "isHumanToken(address)", +"ddeae033": "claimFor(address)", +"ddeae8ca": "markDone(uint16)", +"ddeb5094": "pause(bool,bool)", +"ddeb63b5": "setEscrowAddress(address)", +"ddec280e": "fetchAssetPrice(address)", +"ddec60d9": "Parents()", +"ddecc5d9": "getTradingTime()", +"dded49cb": "setadmin(address)", +"dded5dd8": "isAdminForGame(uint256,address)", +"ddedfc19": "TheLightToken()", +"ddeed1a4": "projectFailed(uint16)", +"ddef6421": "adventureContract()", +"ddef880f": "getDeepInfo(uint256)", +"ddef8f29": "HOTTO()", +"ddefdb90": "fillOrKill(address[5],uint256[6],uint256,uint8,bytes32,bytes32)", +"ddf0432f": "startPresale(address,uint256)", +"ddf063c8": "collectedEth()", +"ddf08ebc": "checkCaptain(address,uint32)", +"ddf09e89": "NelsonChenTestToken()", +"ddf0c070": "addBalances(address[],uint256[])", +"ddf187b0": "dogFight()", +"ddf1be5f": "setIII_R1(uint256)", +"ddf252ad": "Transfer(address,address,uint256)", +"ddf25ce9": "renExBalancesContract()", +"ddf27259": "LogCertificationDbUnRegistered(address)", +"ddf29872": "teamvalue()", +"ddf2d8cd": "setDesignatedReportReceivedTime(uint256)", +"ddf31394": "lockToken(address,uint16)", +"ddf33cc7": "TEAM_TOKENS1()", +"ddf34ab0": "getAgreedCompletionDate(bytes16,address,address,uint256,uint256)", +"ddf41bf4": "migrateHolders(uint256)", +"ddf4a032": "changeSettings(uint256,uint64,uint8,uint8,uint8,uint8)", +"ddf4b011": "TIME_UPDATE(bytes32)", +"ddf5cc29": "ActivationWithdrawal(address[2],uint256[8],uint256)", +"ddf6e5a0": "GEN_0_LIMIT()", +"ddf7e1a7": "tokenToTokenSwapInput(uint256,uint256,uint256,uint256,address)", +"ddf9d613": "getCustomBuyerLimit(address,address)", +"ddfa3a60": "getCrystalWeights()", +"ddfa53e4": "hardcapInWei()", +"ddfafa96": "getRates(address,uint256)", +"ddfb8b9b": "Start_quiz_qz(string,string)", +"ddfc50df": "setByte(bytes1,bytes8,bytes32)", +"ddfd72f8": "setHashByWriter(bytes32,address,bytes32)", +"ddff0346": "_getFechHpbBallotAddrInterface()", +"de002aa6": "pushWork(uint256)", +"de0099a3": "heldTokens(address)", +"de009e7f": "offerToChannel(address,uint256)", +"de00a094": "controlled()", +"de0123bf": "AddMultipleAddresseseToWhitelist(address[])", +"de01ec28": "setStateMigrated()", +"de024515": "DEMT()", +"de02ae96": "bytes32ToBytes(bytes32[],bytes32)", +"de02f1fc": "PER_ACCOUNT_ADDITIONAL_TOKENS()", +"de0498d3": "Date_Started()", +"de05905b": "doSetName(bytes32)", +"de06b7f4": "doTakerPayment()", +"de06ef49": "whaleStartTime()", +"de07a886": "DEFROST_MONTH_IN_MINUTES()", +"de080401": "SethTokenPurchase(address,address,uint256,uint256)", +"de089aee": "userMaximumPurchaseAmountNg(address)", +"de08a6d8": "metaTransfer(address,uint256,bytes,uint256,uint256)", +"de08c364": "removeAdminister(address)", +"de08f188": "storageStep()", +"de090b25": "LockInExpiry()", +"de0a1c5d": "changeVuePayETHDestinationAddress(address)", +"de0a7cc6": "purchasedTicket(address)", +"de0b18f2": "getAssetAttachment(uint256)", +"de0b5af2": "BONUS_COEFF()", +"de0bffc2": "GlobaLiquids()", +"de0cf58b": "callerAllocationStartBlock()", +"de0d0802": "getWeightAndUpdate(address)", +"de0d50e4": "incGen0PresaleCount()", +"de0d7083": "Alter_MediatedTransaction(uint256,bool)", +"de0e9a3e": "unwrap(uint256)", +"de0f2b49": "setCertifierStatus(address,bool)", +"de0f725d": "removeContract(address,address)", +"de0fe922": "addHashType(string)", +"de0ff7c5": "getEther()", +"de1079b3": "vestFromTime()", +"de10f04b": "eraseNode(bytes32[])", +"de117fb1": "buyDirector(uint256)", +"de11823a": "GoldAllocation(uint256,uint256)", +"de11892b": "isAuthorized(address,bytes32)", +"de11c94a": "factoryContract()", +"de121554": "addLike(uint256,bool)", +"de12b52c": "getTopBlock()", +"de12b839": "GetPie()", +"de13bec6": "getApiByName(string)", +"de1446e8": "view54()", +"de14bbf7": "randomGen(uint256,uint256)", +"de14c818": "approvePayment(uint256)", +"de14d323": "confirmAlice(uint256)", +"de14e54d": "setActivity(address,bool)", +"de150d5d": "throwSlammer(bytes32,bytes32,bytes32)", +"de154352": "getBlocksTillMattew()", +"de154761": "upgradeManager()", +"de1565fe": "MainnetProtocol()", +"de1682a5": "PTLC()", +"de170570": "getTiers()", +"de176643": "_advisorsSupply()", +"de179108": "allSaleCompleted()", +"de17dfa9": "setCryptaurToken(address)", +"de1881a8": "processingFee()", +"de18af92": "getEmployerInvoices(address,uint8)", +"de18bec6": "BeneficiaryChange(address)", +"de18dd18": "refuseSale(address[])", +"de192a20": "ARChain(uint256,string,string)", +"de1955df": "reclaimByReceiver(address,bytes32)", +"de1ac2fd": "checkOperator(address)", +"de1b0486": "withdrawFrom(address)", +"de1b27f5": "SALE_ALLOCATION()", +"de1bee1b": "dogexSupply()", +"de1c237f": "getarg_2_input()", +"de1c78fb": "batch_send(address[],uint256)", +"de1c7f70": "getEns(address)", +"de1c977a": "testPreDistribute()", +"de1e46e6": "placeBet(uint256,uint256,uint8,int256)", +"de1e8de8": "MINIMAL_INVESTMENT()", +"de1eb2d0": "withdrawQuantity()", +"de1f892a": "adjust_ERC223Transfer(bool)", +"de1ff163": "isCurrentOrPastAccountReader(address,address)", +"de2037a7": "createSensor(uint256,uint256,uint256)", +"de20555f": "getGoldStatusCustodianverify(address)", +"de20bc92": "Stake()", +"de2111e2": "got()", +"de217625": "setAssets(address[])", +"de2184bf": "voting(address,uint256,string)", +"de21cd78": "allItems(uint256,uint256)", +"de21dc6f": "fundit(address)", +"de2237d3": "getVotersLength()", +"de223f63": "transferPauseOperator(address)", +"de242ff4": "allowance()", +"de24d3ba": "WEBCOIN()", +"de255778": "relocationActive()", +"de26bbb2": "percentage(uint256,uint8)", +"de271ee0": "depositAngelInvestmentEth()", +"de272835": "advisorIssue(address,uint256)", +"de2831f2": "getRemainingBonus()", +"de283b21": "current_transferred()", +"de28431c": "priceLastUpdate()", +"de287359": "acl()", +"de28ba54": "MorpheusTokenFAKE()", +"de28fc1d": "icoSender()", +"de2904de": "CapUpdated(uint256,bytes32,uint256)", +"de292789": "getResult()", +"de2994c4": "unfreezingTimestamp()", +"de2a4a43": "RLLToken(uint256,string,string,address)", +"de2a9778": "createProxy(address,address,uint256,uint256,uint256,uint256,uint256,address,uint256,string,uint8,string,bool)", +"de2b2cd2": "changeDonor(address)", +"de2b4473": "setSaleDepositsAllowed(bool)", +"de2c1d09": "SendERC20ToDex(address)", +"de2c1e85": "_packWarriorCommonData(uint256,uint256)", +"de2c75ee": "getIncidentByUUId(bytes32)", +"de2e6136": "sendGift(address)", +"de2ed893": "totalDonations()", +"de2f827e": "saveChickenOf(address)", +"de301e8c": "getRTEBonusTokenVaultBalance()", +"de3039d2": "findPrecedingPrice(uint256)", +"de306341": "createMineForToken(uint256,uint256,uint256,uint256,uint256)", +"de31482a": "tokenHasDistributed()", +"de318242": "Mani()", +"de326c1e": "movePatentData(uint16[],address[],uint256[],bool[],uint256[],uint256[],uint256[])", +"de329396": "ownerSetMaxProfit(uint256)", +"de32abd1": "mulExp(uint256,uint256)", +"de33d8d8": "Print(string,address)", +"de341661": "unpause_2()", +"de346a40": "whiteListERC20(address)", +"de34bacd": "cardPrice()", +"de35a696": "Child(string,address)", +"de35be81": "submitSellOrder(bytes32,uint256,uint256)", +"de377015": "maxIcoTokensSold()", +"de37ca12": "MyFirstSmartContract()", +"de37e977": "thisTokenBalance()", +"de38460b": "nextSaleAgent()", +"de3849be": "owner_AirdropUpdateToken(address[],uint256)", +"de385438": "calculateEmission(uint256,uint256)", +"de38a5f4": "verifyKYC(bytes32,bytes32,bytes32,bytes32,bytes32)", +"de38c771": "setFundingAmount(uint256)", +"de38eb3a": "MAX_TIMEOUT()", +"de3989f5": "CalledA()", +"de39acea": "get32(bytes,uint256)", +"de3a8511": "teamKeepingSupply()", +"de3ab731": "evaluateAfterQuery(bool,uint256)", +"de3b5061": "updateBuyType(address,address,int256)", +"de3b653a": "IsReleaseToken()", +"de3bcb97": "takeAll()", +"de3bec59": "baseowner()", +"de3d0290": "gwtoken(uint256,string,uint8,string)", +"de3dac84": "freezeAccount(uint256)", +"de3e3492": "setRebase(uint256)", +"de3ea04a": "SAGAToken()", +"de3f18e2": "winningTeam()", +"de3f26eb": "oracleRegistryContract()", +"de3fbdee": "addRate(uint256,uint256)", +"de400629": "createListingWithSender(address,bytes32,uint256,address)", +"de4125b0": "addWineryOperationEndorsement(string,uint256,bool,string,string)", +"de4138de": "getCurrentStateId()", +"de41e1a1": "assignOwner(address[],uint256,address)", +"de42dcc9": "LuckCashToken(uint256)", +"de42f045": "auditTimeoutInBlocks()", +"de43844b": "fixedExp(int256)", +"de44a17e": "setNewModifier(address)", +"de44bf01": "getCreateUniverseParentUniverseValue()", +"de459c9b": "RATE_SALESTAGE6()", +"de469071": "hashBetSum()", +"de47864c": "testSafeAdd(uint256,uint256)", +"de47e0bf": "withdrawBaseETH()", +"de48ff52": "updateState(int128,uint128,uint8,bytes32,bytes32,bool)", +"de494190": "getCommentIdByAd(uint256,uint256)", +"de49bd54": "BurnTokensAndSetAmountForNewBlockchain(address)", +"de4b3262": "setBasePrice(uint256)", +"de4b3a73": "defaultText()", +"de4b4073": "devSend()", +"de4b45fa": "finalizeReclaim()", +"de4b51eb": "setTrustedAddress(address,address,bool)", +"de4c0574": "migrateAllowancesFromLegacyRep(address[],address[])", +"de4cd094": "convertToDecimal(uint256)", +"de4d51a5": "setSaleType_Airdrop(uint8,uint8,uint32,uint8,int256,uint256,int256)", +"de4f4d2b": "totalEthHandled()", +"de4f9383": "transferEtherFrom(address,address,uint256)", +"de5007ff": "sweepMsg()", +"de50f2fe": "KycClaveChain(address)", +"de5101af": "timestampToDate(uint256)", +"de51f57e": "setValueStep3(uint256)", +"de52ccbe": "NGX()", +"de530bbb": "EMISSION_FOR_SALESTAGE4()", +"de534744": "tokenDistribution(address,uint256)", +"de563b89": "removeRatio()", +"de56a245": "editionOptionalCommission(uint256)", +"de571e48": "getCollectedAmount()", +"de575a02": "dismissRoom(uint256)", +"de576c8a": "CREATED_STAR5()", +"de5785d5": "feesAvailableForWithdraw()", +"de578a90": "ApodTokenContract()", +"de57e8b4": "releaseEscrow(bytes16,address,address,uint256)", +"de583ed3": "_improveCard(uint256,uint256,uint256)", +"de5866f9": "s19(bytes1)", +"de589fa9": "TokenLongExercised(address[2],uint256[8],uint8,bytes32[2],uint256,uint256)", +"de58d156": "createAsset(string,string,string)", +"de5990ca": "INTREPID_VOUCHER_LIMIT()", +"de59a5cb": "SaleClockAuction(address,address,address,uint256,uint256)", +"de5ac86d": "createWager(bytes32)", +"de5b71f7": "distributeReward(address,uint256,uint256)", +"de5b9987": "getUnitDefenseMultiplier(address,address,uint256)", +"de5b9e4f": "BitMEDSmartToken()", +"de5bb5a2": "nEdits()", +"de5c995e": "Y2_lockedTokenReleaseTime()", +"de5cb7ed": "DutchAuctionPoD()", +"de5cf247": "giveTokens(address,address,uint256,string)", +"de5d953a": "logSingleIndex(bytes,bytes,uint256)", +"de5da0cf": "nextGiftId()", +"de5dc6c8": "tokenCapped()", +"de5dead6": "reduceInventories(uint256,uint256,uint256,uint16)", +"de5e21df": "timerStart()", +"de5e7ac4": "getOutcome(address)", +"de5eaa83": "donate(uint8,bytes32,bytes32)", +"de5eeb6e": "preICOAddress()", +"de5f3ec6": "buy10Price()", +"de5f5517": "lad(bytes32)", +"de5f72fd": "faucet()", +"de5f9866": "getTokensLeft()", +"de605ecc": "changeSettings(uint256,uint256,uint32)", +"de60a67d": "maxCapIco()", +"de620676": "_sellprice()", +"de622de4": "tgeStarted()", +"de62319c": "IQT_CONTRACT_ADDRESS()", +"de625d1f": "totalReceivedWei()", +"de628e3b": "tokensCalculator(uint256,uint256,uint256,uint256)", +"de629235": "getCertificationDocumentAtIndex(address,uint256)", +"de637901": "poptxs(address,uint256)", +"de63a530": "setAddressAndFunctionIdVoteRules(address,address,bytes4,bool,uint256[5])", +"de63dc35": "setPartnerFromPreICOAffiliate(address[],bytes32[],uint256[])", +"de640e19": "Investment(uint256)", +"de642b5a": "cbdc(uint256,string,string)", +"de644ebd": "firstMintRound0For(address[],uint256[],uint8[])", +"de648b87": "setSKLContractAddress(address)", +"de656b71": "BecomeSnailmaster()", +"de658979": "_updateCompany(bytes32,bytes32)", +"de6595b2": "WhitelistedUpdated(uint256,bool)", +"de65da20": "purchaseGame()", +"de661217": "left75(uint256)", +"de667e70": "setBuyer(uint256,address)", +"de66b5f7": "unidentifiedSaleLimit()", +"de66ed0d": "getTargetReporterGasCosts()", +"de6746a5": "founders(address)", +"de6764ba": "Swanroll()", +"de67fd05": "deleteLayer(uint256)", +"de683a7d": "change(address,uint256,address)", +"de68c43f": "noFee(address,address,uint256)", +"de6a1b19": "landmarkPoolTotal()", +"de6a9d83": "CheckResultCalled(bytes32,address)", +"de6ab39c": "INITIALSUPPLY()", +"de6b8a2e": "getOrderLength(address)", +"de6b978d": "POA20(string,string,uint8)", +"de6baccb": "transferWithLock(address,uint256,uint256)", +"de6bd0e8": "redistributeEthForAddresses(uint256,address[])", +"de6c4f4b": "reset(address,address,address,address,address,address,address)", +"de6ca3f0": "_setCommit(uint256,address,bytes32)", +"de6cdd2e": "getExchangeInfo(bytes32)", +"de6eb4be": "NBAONLINE()", +"de6ed7dc": "GoldIssueBurnFee(string)", +"de6ef007": "amountTokensPerEth()", +"de6f24bb": "sendMessage(address,string)", +"de7086f6": "TemplateToken()", +"de70b36c": "RevokeViewingPrivelege(address)", +"de718e3f": "initialWeiRais(uint256)", +"de71c467": "presentObject(bytes,bytes32)", +"de71d56b": "getStandartComponent(uint256,uint256)", +"de72a01d": "Agt()", +"de72b83d": "totalBountyAmount()", +"de72cab0": "finishBonusPeriod()", +"de733397": "allowClaiming()", +"de7337a1": "changeFloor(uint256)", +"de7383e0": "handleTokensReceived()", +"de742c2d": "getFreeAlien()", +"de74880c": "platformUnfreeze()", +"de74e57b": "listings(uint256)", +"de750f6f": "getNine(uint256)", +"de753fe5": "PrecioUnidadPase()", +"de758458": "IPFSProxy(address[],uint256,uint256)", +"de75c36e": "addressMasterNodes()", +"de763a40": "getEtherFeeForPriceInCandy()", +"de77229f": "MinterOwnershipTransferred(address,address)", +"de77743d": "needsbeneficiary(uint256)", +"de7874f3": "plyr_(uint256)", +"de78be15": "onSoftCapReached(uint256)", +"de78e78a": "tokenLaunched()", +"de78ed85": "actual_balance(address)", +"de795edd": "prova()", +"de79fb92": "UKTTokenVoting(uint256,bytes32[],address[],uint256[])", +"de7a5956": "getWinnerTeam()", +"de7ae335": "WithdrawDividendsAndCouponsTo(address)", +"de7b1a77": "finalizeTokenSaleManager()", +"de7b24b8": "ICOFailed(uint256,uint256,string)", +"de7b89bd": "GetUserExtraData1(address)", +"de7bea74": "getThreshold(uint8)", +"de7c2ed2": "TEAM_VESTING_DURATION()", +"de7c99c3": "releasePrivateBonusTokens(address[],uint256[])", +"de7cb327": "Proof()", +"de7d4fc4": "getGameNumber()", +"de7dd576": "etherPriceInPoundPences()", +"de7ea691": "getRandom(uint8,uint256)", +"de7fe3e7": "getItemInfo(uint256)", +"de803198": "setFunderSmartToken(address)", +"de80344d": "startStage(uint256,uint256,uint256,uint256)", +"de80b0a5": "promo()", +"de812733": "createBaby(uint256,uint256,uint256,uint256)", +"de81333e": "claimHeldBalance()", +"de815e61": "FourArt(address,address,address,address,address,address,address,address,address,address,address)", +"de81aaaa": "hardCapUSD()", +"de821a35": "_updateGenerationSeasonFlag(uint256,uint8)", +"de8248fb": "FEE_PERMILLE()", +"de824f93": "TimeLeft()", +"de82b54d": "cancelSellToConsumer(address)", +"de82efb4": "gimme()", +"de831ee7": "changeMinTransfer(uint256)", +"de840f11": "NassauToken()", +"de850c71": "dequeueAlternately()", +"de852afe": "revokeAccessDeploy(address)", +"de854065": "Portfolio(address)", +"de85a4a9": "tokenIssuedMkt()", +"de85c040": "GetMyRound()", +"de866db1": "buyContract()", +"de86ba28": "_addMintedTotallyByBridge(uint256,address)", +"de874962": "EOS_Silver()", +"de8801e5": "presaleStart()", +"de887bba": "getSecretBet(address)", +"de889d50": "refundWallet(address)", +"de88a342": "payDividends()", +"de894d3a": "_transferDividends(address,address,uint256)", +"de8a1c2e": "OMIToken()", +"de8a6fa2": "baseEthCapPerAddress()", +"de8b1d5c": "createCustomPresale(uint256,uint256,uint256,address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"de8b888e": "freezeTokenTransfers()", +"de8ba6d1": "getAndDel(bytes32)", +"de8bb64f": "TEFC()", +"de8bf3b6": "noRoundMiniGame()", +"de8c85ea": "operationToken()", +"de8f246c": "setStartTimestamp(uint32)", +"de8f50a1": "verify(bytes,bytes,bytes)", +"de8f55af": "dailyDistribution()", +"de8fa431": "getSize()", +"de901104": "setLLV_edit_15(string)", +"de9122f7": "wipeAttributes(string,bytes32[])", +"de917978": "SafecontractsTREXFund()", +"de91af7b": "totalPoolCap()", +"de91bb10": "CardManger()", +"de92af4b": "LongBought(address[2],uint256[3],uint256)", +"de931662": "callToken()", +"de934416": "balancePrivate(address)", +"de934d86": "BOT_ELEMENT_1()", +"de9364f4": "testFailBurnGuyWithoutTrust()", +"de940c29": "renounceOwnershipForever(uint8)", +"de942e62": "getLLV_edit_6()", +"de944520": "getBurnAmountApproval(address,address)", +"de9476dd": "addNewAirdrop(string,uint256,uint256,address,uint256)", +"de94b800": "backToken(address,uint256)", +"de957cf4": "setChunkSize(uint256)", +"de9652b1": "getcoinSortinglength()", +"de96587e": "removeAmbassador(address)", +"de96e823": "StarbaseCrowdsale(address)", +"de981f1b": "getContract(uint8)", +"de98bc4f": "LogMintingStopped()", +"de990bda": "etherMaximum()", +"de995b90": "sendOwnershipFrom(address,address,uint256)", +"de998dd0": "_affiliateProgramIsActive()", +"de9a1bdb": "MyToken(string,string,uint8,uint256)", +"de9b33f9": "getWithdrawNonce(bytes32)", +"de9b9364": "max_investment_eth()", +"de9d0e85": "_setPendingAnchor(address,uint256)", +"de9daf91": "setEmissionLimit(uint256)", +"de9db5d3": "projectShare()", +"de9eade3": "totalInitialAddresses()", +"de9ee13e": "calculateMaximumPayment(address,address)", +"de9f28e4": "getJobTotalSkills(uint256)", +"de9f4248": "identities()", +"de9f57f5": "LogBroker(address)", +"dea011f5": "updateService(address,address)", +"dea01b3e": "removeOneSecret(bytes32)", +"dea06188": "NumberOfBlockAlreadyMined()", +"dea09ef3": "takeFee(address,address,address,uint256,uint256)", +"dea0a837": "SetParticipantURL(address,address,string)", +"dea0cbd7": "viewMaxGasPrice()", +"dea19cda": "_fetchOrderByIdWithWithPayer(string,address)", +"dea1bd69": "setValidity(uint256)", +"dea216af": "nestedSecond(uint256)", +"dea2356c": "setInvestorGain(uint256)", +"dea37fb0": "Force()", +"dea3ce27": "setEligibleForReimburse(bool)", +"dea4267b": "addCourse(string,string,string,string,string)", +"dea5408f": "paymentSizeB()", +"dea5de80": "phase_4_Time()", +"dea6aec7": "getTargetSupply()", +"dea7b768": "submitBallotNoPk(bytes32)", +"dea89056": "holdMax()", +"dea8d6b6": "testCannotSetPresaleTokensAfterSaleStarts()", +"dea90acf": "getEmergencyTransferSignersCount(address)", +"dea95ff8": "setRoundNum(uint256)", +"dea97078": "getPendingTransactionsSellerAddresses()", +"dea9b464": "depositCollateral(bytes32,uint256)", +"dea9c72b": "getLatestPreReleaseTree(bytes32,uint32,uint32,uint32)", +"dea9ecd6": "DeanCoin(uint256,string,uint8,string)", +"deaa0d0a": "withdrawal1()", +"deaa59df": "setWallet(address)", +"deab5a78": "TEGTY()", +"deac4659": "inArray(address)", +"deaca58e": "settlvlement(address,uint256,address,string,string)", +"dead98f6": "part_to_vehicle(uint256,string,uint256)", +"dead9f93": "setParams(uint256,uint256,address,address)", +"deadc3dc": "currentStepIndexByDate()", +"deae5d4d": "networkPlaceholder()", +"deaf5a5e": "transferDocument(bytes32,address)", +"deb06c3a": "gameActive(uint256)", +"deb077b9": "nextSaleId()", +"deb081df": "getIslands()", +"deb0e09b": "getVotingDuration()", +"deb209f6": "isProviderValid(uint256)", +"deb2432b": "zecId()", +"deb27fc5": "getDragonTypes(uint256)", +"deb2e0b9": "MedNet()", +"deb36e32": "startVesting()", +"deb41f8d": "setTuple(uint256,uint256,bytes32)", +"deb43874": "Heritable(uint256)", +"deb52738": "finaliseFirstPhase()", +"deb53ab4": "BeneficiaryStake(uint256)", +"deb5d6c2": "inviterReg()", +"deb60627": "MhpCoin()", +"deb6930c": "PriceTicker()", +"deb77083": "stage2Bounty()", +"deb775a7": "tokenEmission(uint256,uint256)", +"deb80111": "transfer_asset(address,uint256)", +"deb80d66": "ProvidencePresale()", +"deb83bcc": "crowdsaleEndLockTime()", +"deb931a2": "getOwner(bytes32)", +"deb93b5b": "balanceOfOn()", +"deb979ac": "mktValueupdated(uint256)", +"deba5e95": "addCandidate(address,bytes32,string)", +"debad25e": "TeslaTest()", +"debad27f": "getProducts(uint256)", +"debaeb0e": "bonusLevel1PercentModifier()", +"debbc6eb": "btcRelay()", +"debc74f6": "buyRateZeroQuantity(uint256)", +"debc94ff": "Buckcoin()", +"debcbdcf": "preSaleStartdate()", +"debd122e": "setUp(uint256)", +"debe1c69": "setAccountingParams(uint256,uint256,uint256)", +"debe9768": "mintTokensLockedMultiple(uint256,int256,address[],uint256[],uint256[])", +"debf5b9f": "phase_4_rate()", +"debfbade": "calcNextNumShareholders(address,address,uint256)", +"dec0257d": "deleteContract(bytes32)", +"dec04b9b": "testNow()", +"dec10357": "currentCandyTotalSupply()", +"dec18b46": "second_withdrawal(uint256)", +"dec22b07": "forceExecuteRandomQuery()", +"dec24118": "lastCallBlock()", +"dec26d55": "LifeSet_003()", +"dec32ae8": "byTokens()", +"dec4b436": "subAttack(uint256,uint256)", +"dec57e94": "QTUM()", +"dec5cf53": "Exile()", +"dec6bc91": "EthernautsPreSale()", +"dec6c2d8": "updatedDistributee(address,uint256)", +"dec74ae9": "eurId()", +"dec7542f": "changePermission(address,address,bytes32,bool)", +"dec7ee57": "convert2Platinum(uint256)", +"dec7fa11": "minimumTokenAmount()", +"dec8f52e": "getVested(address)", +"dec96e7b": "setTitulaire_Compte_3(uint256)", +"dec9ba44": "createBet()", +"deca15db": "calcQueryCost(uint256,uint256)", +"deca6e76": "adminsInitialized()", +"decadbcc": "mainstreetCrowdfund()", +"decb3a90": "winAmount()", +"decb4803": "Tipcoin()", +"decbd169": "createPet(uint8,string)", +"decd8785": "addPartnerAddress(address)", +"decd8a25": "MINI_GAME_PRIZE_CRYSTAL()", +"decde7c0": "GetCert(uint32)", +"decdffbb": "_emitJobRatingGiven(address,address,uint256,uint8)", +"dece296f": "RET_DIV()", +"dece2e67": "releaseFundsSeller()", +"dece3355": "MinePoS(address,uint256)", +"decebbce": "getFunds(address)", +"decf1e64": "minimumPledgeAmount()", +"decfe0d4": "destroyEnabled()", +"ded04fe9": "testFailCreateNewRevisionNotOwner()", +"ded05da5": "changeIcoAddress(address)", +"ded1588c": "OwnerWithdrawTokens(address,address,uint256)", +"ded1c11b": "startFinalStage1()", +"ded1d0b8": "createMiniTicket(address,uint256)", +"ded1e438": "checkRatio(uint256,uint256)", +"ded1e4de": "DisputeResolver(address[],address)", +"ded1e7e3": "innerGreet()", +"ded1f580": "Unregister(address,bool)", +"ded24016": "getDynamicArrayElement(uint256)", +"ded2d0f4": "awardToken(address,uint256)", +"ded30375": "setectoken(address)", +"ded317a8": "minCapUSD()", +"ded37745": "maybeAnotherTime(uint256)", +"ded4980f": "withdrawInvestmentsBeneficiary(address,address)", +"ded54a4c": "stitch(uint256,uint256,bool)", +"ded5bc6c": "getBdpImageStorage(address[16])", +"ded5bd14": "setApp(string,uint256,address)", +"ded78d3d": "trade(address,uint256,address,uint256,uint256,address,uint8,bytes32,bytes32,uint256)", +"ded8454a": "addressToBytes(address)", +"ded8f76d": "_sort(uint256,uint256)", +"ded94688": "showOwner()", +"ded9b075": "getAllDepositesCount()", +"deda0b5a": "mockSetResult(string)", +"deda20de": "doPurchaseFor(address)", +"deda2f9d": "triggerStealManually(uint32)", +"dedb7e25": "_ifEvenThenOddTooFlags(uint256)", +"dedc440f": "getEscuela(uint256,uint256)", +"deddab12": "withdrawalToken(uint256)", +"dede12a4": "startWeekOne()", +"dedeb3ca": "referralRateInvitee()", +"dedf141e": "setDates(uint256,uint256)", +"dedfb567": "multiFreezeAccount(address[],uint256)", +"dee023e2": "transferAllArgsNoAllowance(address,address,uint256)", +"dee1bfbe": "totalLendingFiatAmount()", +"dee1cfd8": "icoStartTimestampStage()", +"dee1f2af": "addToken(address,uint256,uint256)", +"dee2596b": "changeBonusTokenAddress(address)", +"dee2b058": "setCapacity(uint256,uint256)", +"dee2fedd": "setproduct(uint256,uint256,string,string)", +"dee3a226": "finalizeSto()", +"dee3efb2": "getWorkerPoolByIndex(uint256)", +"dee4b246": "buyTokens(uint64,uint256,uint8,bytes32,bytes32)", +"dee5216e": "applyRuntimeUpdate(address,address,uint64,uint64)", +"dee54b68": "WalletAddressUpdated(address,address)", +"dee555bf": "discountRateIco()", +"dee5a9e7": "PRICE_STAGE_THREE_BONUS()", +"dee6e5a4": "toggleKYC(address,bool)", +"dee73dbb": "AcceptedOwnership(address)", +"dee751ce": "createHoldToken(address,uint256)", +"dee7e59b": "LogWithdrawTokens(address,uint256)", +"dee81a13": "Local()", +"dee846c5": "updateJoinedCrowdsales(address)", +"dee8575c": "getNumBits(uint256)", +"dee86dfb": "marketIdeas()", +"dee8bd51": "ReleaseICO()", +"dee9f53f": "idOf(uint256)", +"deeb2efe": "getShifters(address,uint256)", +"deeb7124": "MDAToken()", +"deebeac9": "transferToken(address)", +"deec053d": "getMarketCachedIndex(uint256)", +"deec4c20": "getCardsInfo(uint256)", +"deecb187": "KyberNetworkProxy(address)", +"deed18e2": "isReadyToFinalize()", +"deed2be0": "getDailyPlayers()", +"deed4b80": "isFirstLockTimeEnd()", +"deee9adb": "setPOOL_edit_10(string)", +"deef6c99": "ZigguratToken(uint256,string,uint8,string)", +"def04570": "TheFrozenDeadShitCoin()", +"def0defa": "getOwnerHistoryCountOf(bytes32)", +"def18101": "currentBid()", +"def1a2da": "vc3Wallet4Pct()", +"def2489b": "convert(address)", +"def2be48": "getBAAAU(bytes32,address,address,address)", +"def4ba32": "utrTestToken()", +"def51dc2": "CIC()", +"def59575": "manualyAddReferral(address,uint256)", +"def59ea5": "addMember(address,address,uint256)", +"def5bbd0": "strConcats(string,string,string,string,string)", +"def7eb44": "maxChangeFee()", +"def843ef": "createOfAthleteCard(string,address,uint256,uint256,uint256)", +"def86cbb": "modifyWhitelist(address[],address[])", +"def871ef": "AirDrop(uint256)", +"def8ecf4": "removeBuyOrder(uint256)", +"def9176c": "team1Balance()", +"def92c69": "MAX_BALANCE()", +"def98a72": "recipientExtraMIT()", +"def9c7e2": "_escrowStakeOwnerPaymentEarning(address,bytes32,uint256,uint256,address,bool)", +"defa92ee": "depositDividends()", +"defaa5f2": "_transferEthereum(uint256,uint256,uint256)", +"defafa37": "setRefundTimelock(uint256)", +"defb9584": "PROMO_CREATION_LIMIT()", +"defbc073": "weiUnlocked()", +"defc876e": "removeAddressFromCaller(address)", +"defc8ae9": "BuyOffer(address,address,uint256,uint256,uint256,uint256)", +"defce6d8": "FlagAddress(address)", +"defe2883": "totalSupplyByAsset(bytes32)", +"defe2c47": "_checkRecommend(bool,uint256)", +"defefe96": "payCompoundTerm(uint256,uint8,uint8)", +"deff30c6": "sellTokens(address)", +"deff3a37": "purchaseReject(address)", +"deff41c1": "m_owner()", +"deff5757": "setPartnersRelease(uint256)", +"deff71b8": "setAllFlagPairs(bool[2][])", +"deff7f2f": "CrowdFundings()", +"deffbaee": "addOwnershipChest(address,uint256)", +"df000ff7": "acceptParityOwnership()", +"df013fab": "setDelegadoDeEscuela(bytes32,bytes32,uint256,uint256)", +"df018dbd": "process(address,address,address,string,string)", +"df022cbc": "hello1()", +"df034586": "lockCount(address)", +"df034cd0": "updater()", +"df034db8": "aCASATest()", +"df037443": "timeoutX()", +"df0441cc": "_checkUnlock(address)", +"df054797": "securityAudit()", +"df0584af": "ClimateCoinAddress()", +"df065d78": "TEST_PLAYER()", +"df06c1d8": "plotsOwned(address,uint256)", +"df06f906": "numBets()", +"df0795aa": "setKycProvider(address)", +"df08ce62": "give(address[],uint256[])", +"df09176b": "ActualizePrice(uint256,uint256,uint256,uint256)", +"df0969dc": "clearPlayerPrize(address)", +"df09921f": "institutionAllocation()", +"df0a2bda": "refundIgnoredBids(uint256)", +"df0a8589": "dealAmount()", +"df0ad3de": "upgradeabilityAdmin()", +"df0b1344": "SchmeckleTokenSale()", +"df0b52c8": "keyAddress()", +"df0bcf4d": "setAvatar(uint256)", +"df0c428c": "releaseAdvisorsTeamTokens()", +"df0c7a55": "nextPrice(uint16)", +"df0cd37b": "Etheremojis()", +"df0d05d9": "EmporioExchage()", +"df0d1078": "volumeType1()", +"df0da20e": "BONUS_WINDOW_1_END_TIME()", +"df0efbf5": "rateForSale(uint256)", +"df0f093b": "purchasePeriod()", +"df0f26f9": "getBalanceAddr(uint256)", +"df0f3227": "DurationAltered(uint256)", +"df0f3c19": "getGameCountdown()", +"df0f3e1c": "isFalse(bool,string)", +"df109ee1": "AuctionManager()", +"df10dd6e": "checkSubAvailability(bytes32)", +"df117c47": "updateSuperPrivilegeParams(uint256,uint256)", +"df11d258": "witness(bytes32,bytes32,bytes32,bytes32,uint8,bytes32,bytes32)", +"df12b94e": "investBalance()", +"df133cf9": "minesPrice(uint256)", +"df1340a0": "QTR_Token()", +"df13569d": "FACTOR_6()", +"df13994e": "callback(bytes32)", +"df143fb7": "HackerGold(address)", +"df148cdb": "setPonziAddress(address)", +"df155488": "startLockTime()", +"df15c37e": "getWinners()", +"df15f87e": "FiatRaisedUpdated(address,uint256)", +"df1614cf": "setLendFee(uint256)", +"df1673e9": "CHINESE_EXCHANGE_4()", +"df175e9b": "newCampaign(address,uint256,uint256)", +"df17c4b1": "delegateTransferAndCall(uint256,uint256,address,uint256,bytes,uint8,bytes32,bytes32)", +"df181831": "staff_1()", +"df1836ca": "referrerAndOwnerPercent()", +"df18e215": "updateTokenStore(address)", +"df190048": "getAdPrice(uint256)", +"df19b71c": "digitToNumber(uint8)", +"df19df5d": "ownerOperationsLength(address)", +"df1a5aab": "reservedTokensClaimStage()", +"df1abf83": "revertTokensByKYC(address)", +"df1b817e": "setupCutie(uint40,uint16)", +"df1c455c": "unallocated()", +"df1cd2b5": "volumeBonusesTokens(address)", +"df1cf293": "addAuction(uint32,uint256,uint256,uint256)", +"df1d4559": "setFOUNDATION_POOL_ADDR(address)", +"df1dbbc9": "ShareToken()", +"df1dd826": "trade(uint256)", +"df1e36c6": "unlockDeposit(string,address)", +"df1ead82": "disinvest()", +"df1ec3ea": "BesideERC20(uint256,string,string)", +"df1f4a6e": "getTimestring(uint256)", +"df1fc781": "KickicoCrowdsale(address,address,address,address,address,address,address,address,address)", +"df201a46": "simple()", +"df203ff7": "depositGasCost()", +"df20b119": "balanceEthCrowd(address)", +"df20c021": "addNewChannelAndRankofuser(address,string,int256)", +"df20d738": "BokkyPooBahsEtherRefundablePrize()", +"df221223": "setWeiExchangeRate(uint256)", +"df22bf83": "canUseTokens(address,uint256)", +"df23128f": "adjustTranche(uint256)", +"df234815": "tokensAvailableAtTierInternal(uint8,uint256,uint256)", +"df2436b3": "isExistByBytes(bytes32)", +"df247c5d": "CareerXonToken(uint256,uint256,uint256,uint256)", +"df25322d": "getFundReceiver()", +"df25ecf8": "DSTContract(string,string)", +"df25ee23": "getIndexId(address,bytes)", +"df25f3f0": "minPerTx()", +"df26ca08": "emitError(uint256)", +"df28aef7": "withdrawLiquidatePool(uint256)", +"df28d6fa": "Dex2(address)", +"df294588": "get_Gains(address,address)", +"df294cad": "allocateNominalToken(address,uint256)", +"df295080": "changeAbstractStorage(address)", +"df29b982": "emergencyWithdrawERC20(address,uint256)", +"df29dfc4": "get_start_time()", +"df2a201b": "setSystemOraGasLimit(uint256)", +"df2a2753": "LDGToken()", +"df2a29da": "getDenominationToken()", +"df2a6e4f": "kscBatchSellByOtherCoin(address,address[],uint256[],uint256,uint256[],string)", +"df2b1cf8": "toBytes(uint256,uint256)", +"df2b1f28": "tokenSetTransferFeeReceiver(address,address,address,address)", +"df2bf12b": "totalBatchOf(bytes32)", +"df2c05a9": "UbermenschPrefundToken(address)", +"df2c7fc1": "AuctionFinished(address,uint256,uint256,uint256,uint64,uint256,address)", +"df2cdbed": "_setBidState(bytes32,uint8)", +"df2d33d5": "isBreakingCap(uint256)", +"df2d44af": "EthLongExercised(address[2],uint256[7],uint8,bytes32[2],uint256,uint256)", +"df2df29a": "CEO_Signature()", +"df2dfb20": "canIBuy()", +"df2e5c0f": "changePricePerUnicorn(uint256)", +"df2f0a4a": "getDecisionBlockNumber(uint256,uint256)", +"df2fbae6": "totalAvaliableSupply()", +"df300b46": "getThing(bytes32[])", +"df305680": "clearProposalLocked(address)", +"df30e592": "isValidContributorId(uint256)", +"df31566e": "setUInt(string,uint256)", +"df3164c6": "Release()", +"df31b589": "bonusForPreICO()", +"df320b29": "refundBet(bytes32)", +"df32754b": "owned()", +"df32dc5c": "withdrawEarning(uint256)", +"df331545": "reservedOperationalExpenses()", +"df334093": "acceptingDeposits()", +"df342d66": "setSubcontractAddressAndDataPattern(uint256,address,uint256,uint256,uint256,uint256,bytes,bytes)", +"df36318a": "exchangeStart()", +"df3864d5": "ticketsSold(uint256)", +"df390d63": "encodeData(uint128,uint256,uint24,uint40)", +"df3959f5": "setInitializeUniverseValue()", +"df3a4fa1": "maxSubdivisions()", +"df3a635a": "removeDeed(address,uint256)", +"df3a6b10": "testMemberAddedEvent()", +"df3aa1fc": "FTXToken(address)", +"df3b75f0": "test_standardCampaignDeploymentAndUse()", +"df3be668": "productLimits(bytes32)", +"df3be9e8": "ERCFW()", +"df3c211b": "calculateVestedTokens(uint256,uint256,uint256,uint256,uint256)", +"df3c3a30": "mintLocked()", +"df3c5a42": "supplyICOContract(address)", +"df3c8620": "num_challenges()", +"df3cc390": "setUsdRate(uint256)", +"df3e0a1d": "completeEscrow(uint256)", +"df3f5974": "readPublicRecord(bytes32,bytes32)", +"df3fb59e": "DSPRegistryReplaced(address,address)", +"df40503c": "getRemainCoins()", +"df40a089": "setDrawAddress(address,address)", +"df41765e": "circulatingTokensFromSale()", +"df418fbf": "returnBytes1(bytes)", +"df41d979": "ico_distribution(address,uint256)", +"df426401": "founderTokenUnlockPhase2()", +"df428e3b": "createChildUniverse(uint256[],bool)", +"df42dfa9": "initialARXSupplyInWei()", +"df42e80e": "Asset()", +"df43b699": "setInvoiceCancelled(address,address,uint256)", +"df43b830": "absolutCBD()", +"df444df1": "createEscrowBySeller(address,uint256)", +"df459426": "parse_signature(bytes32,bytes,bytes)", +"df4604b3": "submitOrVote(bytes32)", +"df462098": "setNextCommonTTMTokenId7(uint64)", +"df463ed3": "buyService(uint64,uint64)", +"df47a924": "DiaToken()", +"df482ad5": "privateFundSupply()", +"df483622": "addLotteryParticipant(address,uint256)", +"df487962": "FibokenCreated(uint8,address,uint256)", +"df48a2b0": "setReinvestmentAddress(address)", +"df49804a": "mtv()", +"df49dfe3": "updateTransferMinimumFee(uint8)", +"df4a2ecc": "hasNext()", +"df4aaf04": "COIN_SUPPLY_ICO_TIER_2()", +"df4adb94": "getOutcomeByIndex(uint256)", +"df4b2970": "getRabbitMother(uint32)", +"df4b3351": "collectEtherBack(address)", +"df4bcf58": "isMigrationAgent()", +"df4bd18d": "setPriceAndRate(uint256,uint256)", +"df4bef32": "searchInList(address)", +"df4c2164": "mintableAddress()", +"df4c98b5": "createRentAuction(uint256,uint256,uint256,uint256,uint256)", +"df4cbb96": "commitProposal(bytes32,string)", +"df4d17dc": "initToken(address)", +"df4dfa7f": "PRE_ICO_TOKENS_AMOUNT()", +"df4e79fa": "VESTED_TOKENS()", +"df4ebd9d": "buyWanCoin(address)", +"df4ec249": "step3()", +"df4f0088": "guardVillain(uint256,uint256)", +"df4f011c": "licenseIds(uint256)", +"df4f5a72": "refunder()", +"df4fc373": "SetIPR(string,string,address,string,string,uint256,address)", +"df4fcf8e": "newFeePercentageIsSet(uint256)", +"df5055e6": "adminVer()", +"df506768": "payTeam(address)", +"df506801": "preSaleThirdCap()", +"df50a8c1": "updateFundraiser(address,bool)", +"df50afa4": "setAllowTransfers(bool)", +"df51d46b": "setUnlockEarlier(uint256)", +"df520efc": "pricePerTokenInWei()", +"df52f321": "CinociCoin(uint256,string,string)", +"df53623f": "_unlockContract()", +"df5483ad": "setImageWidth(uint256,uint16)", +"df54c659": "TransferredFoundersTokens(address,uint256)", +"df55b41a": "owner(string)", +"df55f529": "UNLOCK_TEN_PERCENT_PERIOD()", +"df565ca2": "rateRatioCVSThreshold()", +"df571e33": "postSoftRate()", +"df57904a": "GoodfieldNewRetail(uint256,string,string)", +"df57a6ec": "_generateRandomDna(string)", +"df57b742": "getReverse(bytes32)", +"df58471d": "increaseFundingGoal(uint256)", +"df58d236": "WipedAccount(address,uint256)", +"df590d89": "KnowHowChain()", +"df591e82": "goForward()", +"df59cbeb": "OwnedUpgradeabilityProxy()", +"df5a1417": "PLAYERWIN()", +"df5b588c": "PublishWinnersScoreThres(uint16)", +"df5cc291": "get4(bytes,uint256)", +"df5cf723": "delegation()", +"df5d3e89": "subBuy(bytes32,bytes32,address)", +"df5d3ec7": "setSaleEnd(uint32)", +"df5dd1a5": "addOracle(address)", +"df5dd98f": "refFeeVal()", +"df5e3569": "hasBet(uint256)", +"df5f0603": "retrieveEth(uint256)", +"df5f53f1": "checkWithdrawal(address,address,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"df603769": "reconcile(uint256,address[],int256[],uint8[],bytes32[],bytes32[])", +"df61f51b": "TokensIssued(address,uint256,uint256,uint256)", +"df6378e9": "getAuctionAddress(uint256)", +"df63d908": "testYBool()", +"df63e659": "deleteAllMessages()", +"df642cad": "setCost(uint8,uint256,uint32)", +"df65d1ef": "getLuckBoyAddrList()", +"df66fc14": "sendTokenTeamAdvisor(address)", +"df67184a": "getRequiredBalance(uint256)", +"df673d35": "SISA_token()", +"df67ae3d": "GetStuffList(address)", +"df67d82d": "minETH()", +"df68a516": "viable_print(int256,uint256,uint256,uint64)", +"df68c1a2": "canTransfer()", +"df68fd99": "popElementWithPos(uint256)", +"df6a000d": "safe_withdraw(uint256)", +"df6a6002": "fourthMonthEnd()", +"df6a6b38": "redeemed(address,uint256)", +"df6ab3d5": "masssend(address[],uint256[])", +"df6abd34": "icoHardcap()", +"df6adc2a": "JackpotWinner()", +"df6af2f8": "setpatient(string,string,uint256,uint256)", +"df6af7d1": "getUnclaimedBuyerFunds(address,address,address,uint256)", +"df6afed9": "replaceArtwork(uint16)", +"df6b1ebb": "analyzeCondition(uint8)", +"df6c13c3": "getMinFunding()", +"df6c7cf4": "changeAssembly(uint256,uint64[],uint64[])", +"df6cf923": "IXTPayment()", +"df6d3afa": "setAngelHolder(address)", +"df6d4843": "getMaxLimit()", +"df6da6f9": "tokenSellData(address)", +"df6e1331": "drawGame(uint256,string)", +"df6e7a5f": "setTokenDelegation(address,address)", +"df6ee5f2": "lend(bytes32,bytes,address,uint256,bytes)", +"df6ee6b7": "addStage(uint256,uint256,uint256,uint256,uint256,uint256)", +"df6f023d": "reLoadCore(uint256,uint256,uint256,uint256)", +"df700074": "setadmin(address,address)", +"df706f77": "JTrex()", +"df708f01": "setMainContract(address,address)", +"df70ab71": "increasePositionOnBehalfOfRecurse(address,address,bytes32,uint256)", +"df70f3b5": "Jumanji()", +"df713abd": "get_time_locked_contract_size(address)", +"df7447dd": "createTicker(uint256)", +"df7458cd": "addReply(bytes32,string,uint256,address)", +"df745d28": "releaseBatch(address[])", +"df752519": "MANHATTANPROXY1STST()", +"df75574a": "buyItem3()", +"df755a98": "prPercent()", +"df75f3fb": "setPreSaleDurance(uint256)", +"df761fff": "TokensClaimedEvent(address,uint256,uint256,uint256)", +"df76d18d": "RegisterIP(bytes32,string)", +"df775a93": "skipInitBecauseIAmNotOg(address,address,uint256,uint256,uint256,uint256,bytes8,uint256)", +"df776689": "BasicIterator()", +"df77a290": "OddsAndEvens()", +"df77e074": "GetBetInfo(uint8,uint256,address)", +"df77eb1e": "transferHomeViaRelay(address,uint256)", +"df78c1dd": "payIn(uint256)", +"df79d8fa": "initialInvestorAccount(uint8)", +"df7ae3d8": "debugVal()", +"df7b70ab": "writesExercised(bytes32,address)", +"df7be446": "_removeNFToken(address,uint256)", +"df7bf704": "matchResult()", +"df7c5fca": "checkPeriodic()", +"df7cc70d": "ethUnPause()", +"df7cec28": "cancelBid(bytes32)", +"df7dbd70": "prTokens()", +"df7dfef7": "deleteAction(uint256)", +"df7efed8": "WeiinEth()", +"df8011b2": "HOWL()", +"df8089ef": "setAdministrator(address)", +"df811d7d": "numberOfPlayersInCurrentRound()", +"df816206": "getGiftIdsByRecipient(address)", +"df817e54": "checkPreIcoStatus()", +"df821cf7": "BIDCOIN()", +"df833a1a": "createGato(uint256)", +"df8344fe": "allAllowancesForManyAccounts(address[],address,address[])", +"df84807a": "templateIdOf(uint256)", +"df851f03": "calcNextPrice(uint256)", +"df8713ed": "addPot(uint256)", +"df88126f": "lockedInBets()", +"df8812c7": "addStageAmount(uint256)", +"df88401c": "KillahyToken()", +"df885536": "nxtAddr()", +"df888f4e": "AO()", +"df88f5b8": "setNotConstant()", +"df88fb44": "exchangeByPet(uint256,uint256,address)", +"df8b7771": "initialiseValues()", +"df8bb140": "cancelCampaign(bytes32)", +"df8d52a9": "get_comp(uint256,uint256)", +"df8d66e4": "addPlatform(bytes32)", +"df8dc370": "Reservation(address,address[])", +"df8de3e7": "claimTokens(address)", +"df8e03b1": "BasicWhitelist()", +"df8e739d": "bitzToken()", +"df8e9261": "_testItem()", +"df8f4376": "calcSTQAmount(uint256)", +"df8f4eb7": "originalTotalSupply()", +"df8f7971": "ProfileOwner()", +"df8f8a81": "setETCLockingAddr(address)", +"df90061b": "onSaleTokens()", +"df90c98d": "whiteListEndTime()", +"df90f719": "mln()", +"df91f2ab": "SggCoin()", +"df9204b6": "powerStatus()", +"df922744": "ScamSeal()", +"df922f3a": "changeCommission(uint256)", +"df93c9aa": "testrevert()", +"df957b04": "_couldWithdrawFromHolder(address,uint256)", +"df958553": "burnForGateway(address,string,uint64,uint64)", +"df9669e0": "setCrowdsaleEndDate(uint32)", +"df969bc0": "ADVISOR_TWO()", +"df96a336": "Bitkeun()", +"df979b92": "setIncreaseTotalWinningStake(bool)", +"df98ba00": "m_opNum()", +"df98ef33": "getResource(bytes,uint256,bytes)", +"df990c33": "becomeOwlmaster()", +"df9933e5": "SetPwd(bytes32)", +"df998f59": "checkSertificate(address,address)", +"df99f8bf": "TradeToken()", +"df9a4f56": "registerAuditor(address)", +"df9abaa0": "smallUintFunc(uint8,uint256)", +"df9b0774": "SwapResumed(uint256)", +"df9b2931": "FANBASE()", +"df9b3bae": "ZperToken(address,uint256,uint256)", +"df9b5fe9": "ALH3()", +"df9d3580": "accountBuyLimit()", +"df9e33e8": "getForeverRose()", +"df9f3139": "out4Done()", +"df9f92fb": "Scan(address[],uint256[])", +"dfa0ca14": "swapProject(uint256)", +"dfa13498": "LeasedBlock(uint256,uint256,uint256,uint256,bytes32,bytes32,bytes32,bytes32,address)", +"dfa15809": "databaseAddress()", +"dfa15b58": "RESERVED_OTHERS_SIDE()", +"dfa22fed": "buyFromOwner(string)", +"dfa24e8e": "sendEther(address,uint256,uint256)", +"dfa38fea": "NANI(address)", +"dfa4591c": "removeLogicVersion(uint256)", +"dfa54594": "getStandartRobot(uint256)", +"dfa5a25d": "purchaseCoffee()", +"dfa6bc72": "LoggedPhaseICO(uint256,uint256,uint256,string,string,uint8,bool,bool)", +"dfa72237": "innerPlayerFlight(uint256,uint16,uint256)", +"dfa78bf5": "savior()", +"dfa8be5f": "hackEducated(address)", +"dfa93d64": "relayContractAddress()", +"dfa9b440": "addAddressToWhiteList(address[])", +"dfaa3136": "addToMap(uint256[])", +"dfadb43c": "candyLandSaleAddress()", +"dfae7dc1": "vestingWhitelister()", +"dfaeaf67": "ThrowProxy(address)", +"dfaf3658": "closeCdp(address,uint256,uint256)", +"dfaf734a": "lastReleaseTime()", +"dfafaa72": "sendTo(address,uint256,address)", +"dfafb31d": "QUANTH()", +"dfafcf7e": "isMinion(address)", +"dfafe10f": "addParticipant(address)", +"dfb01c8f": "BCC()", +"dfb03cf7": "put(address,address)", +"dfb06d85": "AgentContract(address,address,address,uint256,uint256)", +"dfb0fb28": "ANGEL_ADDRESS()", +"dfb1913d": "withdrawFor(address[],uint256[])", +"dfb1abc0": "distributeReservedTokens(address,uint256)", +"dfb1c0e5": "buyToKen(uint256)", +"dfb259de": "SmartPoolToken(uint256,address)", +"dfb2866d": "priceFactor()", +"dfb29935": "sendHash(string)", +"dfb30c14": "getPlayerSpaceshipModelById(uint256)", +"dfb3557b": "BNB_MIN_CONTRIB()", +"dfb36b0b": "villagePrice()", +"dfb41e7c": "getForecast(bytes32,uint8,uint256)", +"dfb4a12e": "updateCandidateInfo(address)", +"dfb4ae3a": "WHOM()", +"dfb4b2f0": "deadline_status()", +"dfb59249": "EthRental()", +"dfb5a995": "countStureq()", +"dfb5f420": "Crowdsale(address,uint256,uint256,uint256)", +"dfb685cb": "BIT()", +"dfb69cb2": "colors(uint8)", +"dfb6c468": "transferCoinvest(address)", +"dfb873fb": "getPrizeByToken(uint256)", +"dfb87be1": "setEndRate(uint256)", +"dfb8a38d": "getTokenPackPrice()", +"dfb8c6c2": "battleContractAddressCanBeUpdated()", +"dfb9560c": "right24(uint256)", +"dfb9bdca": "exchange(address,address[],uint256[],uint256)", +"dfba3be1": "pvpFinished(uint256[],uint256)", +"dfba9570": "removeStaff(string)", +"dfba9798": "withdrawMytoken(uint256)", +"dfbb3036": "currentRoundInformation()", +"dfbb4021": "checkGrid(uint8)", +"dfbb70c9": "timeOfLastIncrease()", +"dfbc3de1": "applyMember()", +"dfbcb8d9": "transferCard(address,address,address)", +"dfbd5c69": "EggsRedeemed(address,uint256)", +"dfbd6150": "subowner()", +"dfbd9973": "pageByAccount(address,uint256,uint256,uint256)", +"dfbde5a7": "FedCoup()", +"dfbe0587": "sellPorftolio(uint256,uint256)", +"dfbebd07": "licenseExpirationTime(uint256)", +"dfbec00e": "requestTopic(string)", +"dfbed623": "updateCaller(address,bool)", +"dfbef8de": "AllowExchanger(address)", +"dfbf53ae": "winner()", +"dfc027ef": "replayAnser(uint256,uint256[])", +"dfc0bedb": "setCode(uint256)", +"dfc10ea8": "callerAllocationEndBlock()", +"dfc119b0": "testRfind()", +"dfc28653": "NucleusVisionTokenUnlocked()", +"dfc2a146": "ORACON(uint256,uint256)", +"dfc366e8": "tenthousandths()", +"dfc3a987": "cntMembers()", +"dfc42f7c": "OmegaContract()", +"dfc4a516": "doApprove(address,address,uint256)", +"dfc6fbaa": "presaleBalanceOf(address)", +"dfc6ffc6": "CharlieCoin()", +"dfc74cb4": "testPlaceBet()", +"dfc75b9c": "sendJigouByOwner(address,uint256)", +"dfc765dc": "getMatchers_by_index(uint256)", +"dfc78bdc": "ProposalTallied(uint256,bool,uint256)", +"dfc7d488": "getTransactionFee(uint256)", +"dfc86d56": "UsdToEtherConvert(uint256)", +"dfc89632": "PresidentElections()", +"dfc8bff1": "updateLock(uint256)", +"dfca2f53": "LookAtPrizes()", +"dfca685a": "unlockPrivate()", +"dfca8fd2": "contributeForMakers(address)", +"dfcb4157": "saleAfterRefundPeriod()", +"dfcb737f": "allocateMarket_CommunitTokens()", +"dfcbb794": "TrustFund(address,uint256,address)", +"dfcbc298": "CancelBuyOrder(bytes32,address,uint256,uint256,address)", +"dfcc4b86": "ConcludeChallenge(uint256)", +"dfcc525d": "info_SeeTINAmotleyLine(uint256)", +"dfccdef5": "collectedETH()", +"dfcdc7f2": "regReferrer(address)", +"dfcdde5e": "calcAmount()", +"dfce5a7a": "changeGrantsController(address)", +"dfce791a": "counterWagerAndDeposit(uint256)", +"dfce8ac3": "fipsLegacyRegister(bytes20,address,bytes)", +"dfceb5ba": "refund_and_die()", +"dfcefd7e": "indexOf(uint64[],uint64,bool)", +"dfd0163e": "voteNoLockBatchByAdmin(address[],address[],uint256[])", +"dfd024c1": "allocateInvestors()", +"dfd0c510": "ICOReward()", +"dfd142c1": "IncreaseWithdrawalAmount(uint256)", +"dfd17111": "ConstructZCashClue(bytes32)", +"dfd17f2b": "buyInBatch(uint256,uint256,uint256[],uint256)", +"dfd1be58": "platformFundingPerEpoch()", +"dfd200c5": "setRunning(bool)", +"dfd2c96d": "updateHouse(address,address)", +"dfd2ddec": "setForeignBridgeProxyOwner(address)", +"dfd4715e": "setDAdmin(bytes32,address)", +"dfd4e0f6": "setPrivateSaleHalt(bool)", +"dfd50f52": "contestants(uint256)", +"dfd51b4c": "updateIris(bytes32,address)", +"dfd52b74": "_getIcoAddr()", +"dfd5d3b0": "creditMcAddress()", +"dfd5dd6b": "ranksCount()", +"dfd6a9d5": "getPoolTotalStakeQspWei(uint256)", +"dfd6e6c5": "getIcoPhaseOneThreeDayIndex(uint256)", +"dfd80665": "whitelistAgent()", +"dfd84c13": "sendGain()", +"dfd8d516": "IsThisInternal()", +"dfd92f8a": "registerProduct()", +"dfd94849": "addNewSpinner(uint256)", +"dfd9e184": "droneIndexToApproved(uint256)", +"dfdadcb9": "isValidPurchase()", +"dfdadec6": "AlphaCarToken()", +"dfdb27da": "FoundGameCoin()", +"dfdb5f17": "doBurn(address,uint256)", +"dfdc349d": "getLestCommonMul(uint256,uint256)", +"dfdc99c7": "setKpopCelebContractAddress(address,address)", +"dfdce77b": "setScrapPercent(uint8)", +"dfdd3997": "maxETHAutoContributions()", +"dfdd4293": "voidCaller(address,address)", +"dfde567f": "processAR(uint256)", +"dfdfb261": "addEsgoTX(address,uint256,uint256,uint256,uint256)", +"dfe0f0ca": "transferWithSender(address,address,uint256)", +"dfe1304c": "HumanStandardToken123(uint256,string,uint8,string)", +"dfe138a6": "rewardPerUnit()", +"dfe1b17e": "dequeueOrder()", +"dfe1dcf6": "adminSendEthtoAddContract()", +"dfe1f357": "checkHash(address,uint256,address,uint256,uint256,uint256)", +"dfe2de30": "boughtTime(address)", +"dfe333bd": "copiesSold(uint256)", +"dfe33748": "TokensAreFrozen()", +"dfe346d0": "NicksTastyToken()", +"dfe3a52b": "CUTOFF_PRESALE_TWO()", +"dfe3e746": "setMasterNode(address)", +"dfe4858a": "constuctor()", +"dfe4c261": "approveTransaction(uint256,uint256,string)", +"dfe525a2": "addHandler(address,address,string,string)", +"dfe5ef48": "issue(address,uint256,uint256)", +"dfe64599": "getAllHpbNodesExt()", +"dfe699b1": "SetApplicant(string,string,string,int256,string)", +"dfe6af85": "testThrow_testablePayoutCaseShouldBeFailure()", +"dfe6d366": "gamblers()", +"dfe71183": "createCDPLeveraged()", +"dfe71486": "displayuserdetails(address)", +"dfe81a26": "GnarlyTimes()", +"dfe921cb": "lifeReserveTimeLock()", +"dfea6ec2": "placeBetWithInviter(uint256,uint256,uint256,uint8,bytes32,bytes32,address)", +"dfea8483": "Countout()", +"dfeade00": "AceEquityToken(uint256,string,string,uint8)", +"dfeb1719": "getNotaire()", +"dfeb1fd3": "getUserVotes(address,string,string)", +"dfeb34b6": "stakeFailOverRestrictionLifted()", +"dfeb3c49": "getNonces(address,address)", +"dfebb4ee": "viewMostRelevantClauses()", +"dfec375e": "calcCurPointsForAcct(address)", +"dfedff20": "getTwit(address,uint256)", +"dfee01d8": "mUpgradeSpeedup()", +"dfee2bad": "phaseReleaseAmount()", +"dfee6348": "COMMUNITY_PLUS_PRIORITY_SALE_CAP_ETH()", +"dfef54a3": "TihoToken(uint256,string,uint8,string)", +"dfef58a6": "registration(bytes32,uint256,address)", +"dfef5f69": "mintingStartTime()", +"dfefaf3f": "secureUnapprove(address)", +"dff0259f": "donationSum()", +"dff05de4": "pctDIDOwned(address,address)", +"dff114dd": "investedCrowdsaleTokenOf(address)", +"dff18fe0": "provideTeamHolderToken(address)", +"dff1ab15": "checkProposalCode(uint256,address)", +"dff2db71": "binaryAddress()", +"dff3f3b9": "ownerWithdrawal(uint256)", +"dff3f83e": "resolveRawDelegation(bytes32,uint256)", +"dff44b2f": "divorce()", +"dff4a5e8": "getRestaurant(address)", +"dff53231": "love()", +"dff538e6": "_currentDay()", +"dff5f5cb": "updateStartPhase(uint256)", +"dff649dc": "NameChanged(address,uint256,string,string,uint256)", +"dff675c2": "getDelivery()", +"dff79905": "LogTokenRemover(address,uint256)", +"dff90b5b": "sendFees()", +"dffa771f": "_setWeaponValue9(uint256)", +"dffb0bd1": "getPlayerTotalDividend(address)", +"dffbbef5": "stopDistribution()", +"dffbd9de": "TokenAdded(address,address)", +"dffcf9a7": "transferableHavvens(address)", +"dffd5e57": "buyToken(bytes32)", +"dffd6054": "changeGameAddress(address)", +"dffd722f": "totalEarn()", +"dffd9b8e": "CEO_TEAM_SHARE()", +"dffdc75d": "forward(address,bytes,uint256,bool)", +"dffe0a63": "getStatGames()", +"dffeadd0": "main()", +"dfff2f79": "autoReinvestFor(address)", +"dfffcbdb": "triggered(uint256)", +"e0004f43": "batchTransferTokenS(address,address[],uint256[])", +"e000eec3": "createPixel(uint24,uint32)", +"e0018f2f": "showPlayerSeasonScores(address,int8)", +"e001ddf1": "teamTokensCurrent()", +"e0020f1a": "tokensPerEthPublicSale()", +"e0024ae3": "_mine(uint256,address)", +"e002a486": "changeForwardTo(address)", +"e002f2ee": "cpCap()", +"e0031b1d": "GetDOTDelegatedRevoker(bytes32,uint8)", +"e003604e": "close(address,uint32,uint192,bytes)", +"e0036d1d": "verifyPosition(uint16,uint8,uint64)", +"e0041396": "slice(bytes,uint256,uint256)", +"e0046553": "ownerSetSpreadPremium(uint256)", +"e004b76f": "PermissionRemoved(address)", +"e004fe97": "CarRegistry(string)", +"e004feb0": "testFailMintGuyWhenStopped(int256)", +"e0056019": "setLand(uint8,uint8,uint8,bool,uint8[])", +"e0063224": "vouchers(bytes32,uint256)", +"e0068052": "division(uint256,uint256)", +"e00686e4": "rewardPerBlockPerAddress()", +"e006997c": "authenticate(string,bytes)", +"e007b330": "sterilize(uint256[])", +"e0081b8c": "approve(bytes32,bytes32,uint256)", +"e00824bb": "payCreator()", +"e0089ce7": "UCtestCoin(uint256,string,uint8,string)", +"e008cdf3": "SBSCoin()", +"e00a1e8b": "addToSendAllowed(address)", +"e00a7fc5": "transferFromOwn(address,uint256)", +"e00ab6dd": "private_setminBet(uint256)", +"e00ac9a3": "thirdTime()", +"e00bc0f4": "setIsContainerForMarket(bool)", +"e00bc7fb": "vota_un_candidato(address)", +"e00be2a9": "getErc20Rate(string)", +"e00cb0bc": "etherReceivedPrivate()", +"e00d0aed": "TalosToken()", +"e00d0f3d": "updateCandidateAddrByIndex(uint256,address,address)", +"e00d7e5c": "ExampleToken()", +"e00dd161": "currentId()", +"e00f882c": "numberOfExchInEstateNasAlice(address,uint256)", +"e00fb7b7": "getInvited(uint32)", +"e00fe2eb": "getText()", +"e01060f8": "transferOwnership(uint8[],bytes32[],bytes32[],uint256,address[])", +"e010c686": "newProposal(uint256,uint256,bytes32)", +"e011171d": "setDOwner(bytes32,address)", +"e0117441": "setRegistrationPrice(uint256)", +"e011ac87": "amountLeft()", +"e01330bb": "testMul(uint256,uint256,uint256)", +"e014a39f": "weiRaisedIncludingFiatCurrencyRaised()", +"e014a83f": "takeToken(address,uint256,string)", +"e01546a8": "fromFraction(int256,int256)", +"e01567cf": "ethBioxRate1()", +"e015c62a": "calculatePrice(uint256,uint256,uint256)", +"e015d863": "variation()", +"e016603f": "createMultipleShows(uint256[])", +"e0179e6c": "etherValue(uint256)", +"e0180115": "culcurateBonusRate()", +"e0182436": "cancelEscrow(uint256)", +"e0187d18": "third_partner_address()", +"e018c36c": "buyFirstPackFromReferral(address,bool)", +"e0192072": "Rescue(address,address,uint256)", +"e0195a53": "maxRandom(uint256,address,uint256)", +"e01964d0": "sterile(uint256)", +"e019ac29": "setKycCertifier(address)", +"e01a38c6": "ecrecoverSigner(bytes32,bytes,uint256)", +"e01a6ace": "vote_Candidate_name(bytes32[])", +"e01ac5a4": "giveReward(bytes32,address,uint8)", +"e01b1b10": "ICODays()", +"e01bb918": "_withdrawAll(uint256,address)", +"e01bc60b": "totalCustomBuyersMapping()", +"e01c6d4e": "cashin()", +"e01c979a": "GuneToken()", +"e01cd37a": "cancelSellingToken(address)", +"e01cdfaa": "getEmployeeInfoById(uint256)", +"e01cff84": "getTransferringForCount(address)", +"e01d1f3d": "MultiSigWallet(address[],uint256,uint256,string)", +"e01dd67b": "AMBASSADOR_THREE()", +"e01e0618": "feeDiv(uint256,uint256)", +"e01e92d2": "abs(int128)", +"e01ea00c": "getDarknodesFromEpochs(address,uint256,bool)", +"e01ef1f8": "addInventory(bytes32,string,string,string,string,uint256,uint256)", +"e01fff13": "familyContract()", +"e0201e07": "Eclipse()", +"e0204585": "get_bet(address,address)", +"e020b8a3": "contract_date()", +"e02163e7": "etherContributionOf(address)", +"e021b8cb": "useWeapon(uint8,uint8,uint8,uint8,uint8[176])", +"e021deff": "meta(address)", +"e022040c": "setReceiver5()", +"e02243ee": "buyInternal(address,uint256)", +"e023094f": "createDroid(uint256,string,uint256,uint256,uint256)", +"e023f90e": "getCity(uint16)", +"e02426c1": "getSignatureHash(bytes4,uint256)", +"e024ec5a": "getFmmsDetail(bytes32)", +"e0256835": "balancesCrowd(address)", +"e02584bf": "listPairForReserve(address,address,bool,bool,bool)", +"e025a666": "rewardPercentageDivisor()", +"e027034d": "isWithinIEO()", +"e028222f": "CreateABet(address,uint256)", +"e028ff3b": "lotteryGiveHuntMinimalNumber()", +"e0299621": "GBIToken(uint256,string,string)", +"e02b8b29": "HardcapToken()", +"e02ba030": "excess_token()", +"e02bc1c6": "bidDeposit(bytes32)", +"e02bcd3e": "getLendTokenBalance()", +"e02c3b5d": "getAllLeftLeg()", +"e02c7e1f": "timelockAllocationAddress(address,uint32)", +"e02c85a4": "_checklottery(uint32,uint32)", +"e02cec51": "refund(address[])", +"e02d1c0e": "tradeStarttime(uint256)", +"e02d306f": "getUNTSQM()", +"e02df495": "MAX_ETHER_24H()", +"e02f8d33": "PRICE_STAGE_THREE()", +"e02f9027": "iTime()", +"e02fab06": "anubisToken()", +"e0300fc4": "unregisterFor(address,bytes32,address,uint256,uint256,uint256)", +"e0303a2e": "getFirstTwoOutputs(bytes)", +"e0304542": "oddEven(uint8)", +"e0307e94": "gcsp(uint256)", +"e030bbd5": "tokenToPointByMetaMask(uint256,uint256)", +"e030dfb9": "emergency(bytes32,bytes1)", +"e03179b4": "LogContribution(uint256,uint256)", +"e031d6f0": "isICOFinished()", +"e0328c5f": "setRecovery()", +"e0328c80": "hasRedeemed(address,address,uint256)", +"e033192c": "gettransferableStartTime()", +"e03335b4": "_calculatePricePerPixel(uint256)", +"e033f73c": "executeApplication(address)", +"e0340a05": "Maya_Preferred()", +"e035e1ac": "thirdBonusEnds()", +"e03652c2": "isTransactionPending()", +"e0376e74": "LOG_EmergencyWithdrawalSucceeded(address,uint256)", +"e037a71c": "withdrawLimit(address,uint8)", +"e03827d2": "left70(uint256)", +"e0389a47": "removeAccountMilestone(address)", +"e038c75a": "circulating_supply()", +"e0391b6f": "trackable_dislikes(address)", +"e03992fd": "nextForkUrl()", +"e039967c": "migrateTransfer(address,address,uint256,uint256)", +"e039e4a1": "getOwner(uint8,uint8)", +"e039f224": "isFork()", +"e03b3044": "setAyantDroitEconomique_Compte_7(uint256)", +"e03bc7e1": "_registerDevice(address,bytes32,bytes32,bytes32)", +"e03c151e": "LogSetSTOContract(address,address,address,uint256,uint256)", +"e03c1c4b": "setLineStartTime(uint256,uint256)", +"e03c639c": "addPreSaleWallet(address)", +"e03cca4d": "setChallengeFormulaContract(address)", +"e03d890b": "_addTokenToAllTokensEnumeration(uint256)", +"e03e09a8": "_createAuction(address,address,uint256,uint256,uint256)", +"e03ec01d": "getTargetWallet(address)", +"e0401918": "SMRToken()", +"e0402d26": "validDoHash(bytes32)", +"e04093d6": "updateOracleWithENS()", +"e040c164": "createT513(uint256,uint256,address)", +"e040f3e1": "_humanSender(address)", +"e0412a54": "setBonusRound2(uint256)", +"e0429b6c": "ShinySquirrels()", +"e042ad58": "operationWallet()", +"e0443e92": "LogCreate(address,address,uint256,uint256)", +"e0446273": "messageIsEmpty(string)", +"e044c2de": "newLoan(bytes,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"e044c47f": "playerRollDice()", +"e0453376": "hasFourYearWithdraw()", +"e0457049": "trustedInput()", +"e0457884": "betResolution(uint8,uint8,uint8,bool)", +"e0462547": "setEndPreSale(uint256)", +"e0462d0a": "coreTeamMemberOne()", +"e046c4dc": "Delete()", +"e046f06f": "deathData_a1()", +"e0470e02": "matureDragon(uint256)", +"e0472e36": "swapProposal(uint256)", +"e0475e27": "holderMarketingTokens()", +"e048d0fc": "voteCancelCurrent()", +"e0495a64": "getNormalBuyers()", +"e04a1942": "test_fourValidEqUint()", +"e04a2525": "NoahDividend(address)", +"e04a8c08": "Sold()", +"e04ac09e": "BountyIssued(uint256)", +"e04c130b": "token_transferFrom(address,address,address,uint256)", +"e04c1830": "findNextHour(uint256,bytes2)", +"e04cd07c": "BOLTH(address,address[],address)", +"e04d5105": "calculateSeedBuySimple(uint256)", +"e04f31e9": "forward(address,uint256,bytes,bool)", +"e04fac0c": "aVideoCost()", +"e0504910": "buyWithTokens(address)", +"e050674c": "_deliverWhitelistBonus(address)", +"e0522012": "getAdjustedPotAsFixedPointForGameId(uint256,bool)", +"e052a587": "isNotExpired(uint256,uint256)", +"e052f0c8": "setParams(string,string,string,string,uint256,address,uint256)", +"e053178a": "XCPlugin()", +"e0539225": "preicoPrice()", +"e054057d": "LogBuy(uint256,address,uint256)", +"e0540d85": "CDreamingICO()", +"e054c029": "changejp2(address)", +"e055bba4": "turnId()", +"e056989a": "OfferUpdated(uint256,bytes,uint256,address)", +"e056c1eb": "isGlobalPause()", +"e056f2ff": "takerFeeRateE4()", +"e0576665": "addLen(string)", +"e0585ce8": "BetcoinICO()", +"e058cc59": "setMemeTemplate(string)", +"e0591ddc": "gizerItemsContract()", +"e059c868": "private_UpdateGameBarLimit(uint256,uint256)", +"e05a48cd": "unregisterVendor(address,address)", +"e05b4c5f": "GetReferredAt(uint256)", +"e05b5456": "ChenToken(address,address)", +"e05bac82": "amountReceivedFromExchange(uint256)", +"e05c5a83": "sellerOf(uint256)", +"e05cb6f4": "Mitrav()", +"e05d769e": "expirationSeconds()", +"e05e3028": "getCommunityManagement(uint256)", +"e05e91e0": "returnUint64(uint64)", +"e05ea744": "frost()", +"e05ee7a4": "RATEotu()", +"e05f149e": "getTotalRuns()", +"e05f7d67": "setPCoinContractAddress(address,address)", +"e05fad90": "decode(bytes,uint256,uint256)", +"e0607290": "confirmChangeOracle()", +"e06174e4": "settings()", +"e0619859": "At(uint256,bytes32)", +"e061ddca": "getSensorAddress()", +"e0623632": "UNSOLD_ADDRESS()", +"e062aff8": "startTimeNumber()", +"e06309bb": "ValueOwners()", +"e06375c8": "_fDist()", +"e063a439": "_computeFee(uint128)", +"e06452d0": "Completed()", +"e064bc82": "setFoundersTokensWalletSlave(address)", +"e064c1ec": "denyChanges()", +"e065029e": "PokemonPow()", +"e0655fe5": "changeBuyFee(uint256)", +"e06572ec": "sell(address,uint256[],uint256[],bool)", +"e065914c": "isPersonalLock(address)", +"e065e388": "NewBOP(address)", +"e067ea46": "Etherep(address,uint256,address,uint256)", +"e067f631": "intervalUpdate()", +"e06868e2": "numberOfBet()", +"e06902fa": "ito()", +"e06a09ec": "calculateInterestIndex(uint256,uint256,uint256,uint256)", +"e06a60ff": "HumanityCard()", +"e06aa145": "TokenBurned(address,uint256,uint256,uint256)", +"e06abd36": "updateMAX_AMOUNT(uint256,uint256)", +"e06af204": "BetlyCoin()", +"e06b5837": "getCanSellUnit(address,address,uint256)", +"e06b7e39": "getInitOrInput()", +"e06b850c": "testIntParserTwoDecimal()", +"e06c0fd2": "SatoshiToken()", +"e06c5808": "burnFromAddress(uint256)", +"e06d8de9": "acquisitionsLockEndingAt()", +"e06e0051": "withdrowETH()", +"e06e0e22": "postRelayedCall(bytes,bool,uint256,bytes32)", +"e06e0e43": "overLimit()", +"e06e3873": "encrypt(uint256[])", +"e06e6b20": "Like(bytes32,bytes32,uint256)", +"e06e82b2": "teamNIMFAAddress()", +"e06e9d22": "addCustomerTokenAmount(address,uint256)", +"e06ec0bb": "isListing()", +"e06f3d38": "ownerA()", +"e06fa13d": "ETCL()", +"e06fa68e": "updateAfter(uint256)", +"e06fc6d4": "mainsaleRemaining()", +"e0709589": "blink_block()", +"e0715a86": "unlocksCount()", +"e071681d": "setManyAccountsVerified(address[])", +"e071c0ca": "transferVaultOwnership(address)", +"e072830c": "FUNDING_ETH_HARD_CAP()", +"e0728801": "ANV()", +"e072bd10": "getPlayerInventory(address)", +"e073ef69": "pubKeyToBitcoinAddress(bytes,bool)", +"e0741187": "createBreedingAuction(uint256,uint256,uint256,uint256)", +"e074278d": "setOwnerAddr(address)", +"e074b027": "hasExecuted(uint256)", +"e074bb47": "removePermission(address)", +"e074ee55": "getPeriodsToPay(bytes32,address,uint256)", +"e0755792": "Permission(bytes32,address[],bytes4[])", +"e0755b35": "WePOW()", +"e076c0ae": "queryNow()", +"e0772f6a": "CROWDSALE_TOKEN_IN_WEI()", +"e0775be1": "create(address,address,address,address,address,address,address)", +"e0778211": "_releasableAmount(address,uint256)", +"e077ca97": "fx()", +"e078c549": "getNumberOfTokensToIssue(uint256)", +"e07959bd": "setGainsRate(uint256)", +"e079e334": "getNewCoinFee()", +"e079e7e5": "addStock(string,uint256,uint256,uint256,uint8)", +"e07a2671": "migrationSetPlayer(bytes32,uint256,bytes32,address,uint256,uint256,uint256)", +"e07a31c7": "getWinningCount(uint256,uint256)", +"e07a5d29": "CLRCoin()", +"e07be247": "createSellENS(string,uint256)", +"e07c80fb": "getKindAddress()", +"e07ccdeb": "totalPartnerWithdrawSupply()", +"e07cd936": "ArtcoinPlaceholder(address,address)", +"e07d4f6b": "saveCarDataTransaction(address,address)", +"e07f0b66": "SendMessage(uint256,string,address)", +"e07f0f13": "ZhangPeiPei(uint256,string,uint8,string)", +"e07f0f5e": "transferToken(address[],uint256[])", +"e07f3dd6": "go(uint8)", +"e07fa3c1": "withdrawFund()", +"e080241c": "setNFTDetached(uint256)", +"e080b60c": "apiCallsContractAddress()", +"e0812c75": "migrateInvestorFromHost(address,address)", +"e0813e25": "getRandomInt(uint256)", +"e0813e5e": "updateTokensPerEthOnce(uint256)", +"e08155dd": "ICO_PERCENTAGE_4()", +"e0815ca9": "findNextMinute(uint256,bytes2)", +"e0818669": "lps()", +"e081b569": "DiceOnline()", +"e081fdfe": "availableBalanceOf(uint256,uint256)", +"e082707c": "_uintToString(uint256)", +"e0832cf6": "getWinCount(address)", +"e0834ea4": "WatchBalanceInEther()", +"e083a1b5": "_createEstate(int256[],int256[],address,string)", +"e083d4c8": "dividendBalanceOf(address)", +"e084a819": "prepareCrowdsale()", +"e08503ec": "calculateNextPrice(uint256)", +"e085448f": "FIRST_USER_CUT()", +"e085942a": "getSubjectMattersSize()", +"e085c539": "getPlayerScore(address)", +"e085f82b": "rejectCertificate(address)", +"e086141d": "Assigned(address,uint256)", +"e0862fd7": "getNumBadBets(uint256)", +"e086e5ec": "withdrawETH()", +"e0873c06": "reissueAsset(bytes32,uint256)", +"e08761f5": "dtValidateCitySnapshot(address,uint256)", +"e087cd55": "withdrawIncentives()", +"e0882af8": "airDrop(address,address[],uint256[])", +"e0886f90": "at(uint256)", +"e088747b": "withdraw(address,uint256,string)", +"e088a96b": "claimerUnset()", +"e08a5f9e": "startPresaleDate()", +"e08ac014": "unlockPeriodNum()", +"e08b63ad": "getAddTokenNonce()", +"e08bc3fe": "parseInt(bytes)", +"e08d28d3": "maxInvestmentICO()", +"e08d8497": "ICO_LEVEL_2()", +"e08e433a": "transferTime()", +"e08ed5f9": "withdrawBid(int256,int256,int256)", +"e090318c": "setFacts()", +"e090ebab": "VUO()", +"e0911183": "devTeamAutoBuy(uint256,uint256)", +"e091de56": "MDA()", +"e091f453": "setDividend(uint256)", +"e0929b95": "claimFreeFirstCard(address)", +"e092e85f": "getStakedBalanceUnOrdered(uint256,bytes32)", +"e093a157": "abs(uint256,uint256)", +"e09413ba": "totalDistributedAirdrop()", +"e0945a80": "wbcoin()", +"e0950ddf": "getBet(uint256,address)", +"e095f814": "etherToToken(uint256)", +"e0963ced": "LinkEyeStandardToken(uint256,string,uint8,string)", +"e09678fd": "setIcoContract(address)", +"e097e7b9": "sendTokensBack()", +"e098161b": "getRareCoinAddress()", +"e09874c0": "setPlayConfigs(uint256,uint256,uint256)", +"e0987873": "BurnedAllRemainedTokens()", +"e098c76d": "optionPoolTotalMax()", +"e09adc70": "ethToTokenRate()", +"e09ca60c": "secureApprove(bytes32,uint256)", +"e09ceada": "_newAuction(uint256,uint256,uint256)", +"e09cffcf": "SingularityTest18()", +"e09d0b75": "compareLeaf(uint256,uint256,uint256,uint256)", +"e09dbfa4": "checkPatternExistance(bytes32)", +"e09dd024": "FNCTToken()", +"e09ded57": "lengthOfCommonPrefix3232(bytes32,bytes32)", +"e09e9490": "releasePendingTransfer()", +"e09ea701": "BaseMonoretoCrowdsale(uint256,uint256,uint256)", +"e09ee57f": "feePercentageMax()", +"e09ef83e": "promoCutieCreatedCount()", +"e09f0020": "subCreditScore(uint256,string)", +"e09f310a": "get_iconiq_presale_open(address)", +"e09f6f49": "successAtBlock()", +"e0a09c1f": "Crowdsale(address,address)", +"e0a0f50d": "setSlaveWalletPercent(uint256)", +"e0a1a292": "addressAdvisors()", +"e0a1be53": "updateTargetedMoneyReached()", +"e0a1ca6e": "winningChance()", +"e0a1fdad": "unset(bytes12)", +"e0a21739": "setBlackFundsWallet(address)", +"e0a27b2c": "withdrawWinnings(uint256,uint256)", +"e0a29e23": "owner_freeze_start()", +"e0a3bff7": "RollCount()", +"e0a3e7ec": "computeDeferBlock()", +"e0a49f14": "setMatchOutcome(uint256,string)", +"e0a4aacb": "ExacoreContract(uint256,string,string)", +"e0a53397": "createSingle(uint256)", +"e0a550fc": "closeMainSaleICO()", +"e0a60ea3": "BITTOToken()", +"e0a62339": "getSha256_UInt(uint256,uint256)", +"e0a668b4": "setVesting(address,uint256,uint256)", +"e0a70811": "restart(bytes20,bytes)", +"e0a73a93": "premium()", +"e0a7527d": "updateCABoxToken(address)", +"e0a7b2c3": "startChallenge()", +"e0a802ba": "scanInputs(bytes,uint256,uint256)", +"e0a827c6": "RxI()", +"e0a8299f": "galleryTwo()", +"e0a82ea8": "setMinBetPerRoll(uint256)", +"e0a8aa72": "channelOpened(uint64)", +"e0a8f6f5": "cancelProposal(uint256)", +"e0aa5654": "getCountReadyPlayerByTrackId(bytes32)", +"e0abdf66": "setBlockTimestamp(uint256)", +"e0ac2b72": "HaHaChainToken()", +"e0ac50cb": "isTreasureBox(address)", +"e0ac61bb": "changeOwnerSharePerThousandForMating(uint256)", +"e0acac7f": "withdrawSum()", +"e0ad411d": "assets(bytes)", +"e0ae751f": "setAuthorizedContract(string,address,bool)", +"e0ae96e9": "din()", +"e0b1cccb": "updateBalance(address,uint256)", +"e0b1cecd": "DataToken()", +"e0b30178": "OVCLockAllocation(uint256,address,address,address)", +"e0b3198c": "serverPort()", +"e0b34ef1": "_setERC820compatibility(bool)", +"e0b3c49c": "acceptTermsAndJoinDXF()", +"e0b3cc90": "priceOf(uint32)", +"e0b438ef": "removeNameByOwner(string)", +"e0b45487": "_setValidator(address)", +"e0b490f7": "getAccountId(address)", +"e0b4cf0a": "setMinMaxBet(uint256,uint256)", +"e0b6cddd": "LLV_311_EDIT_2()", +"e0b78225": "RemoveTrustedContractAddress(address,address)", +"e0b86c53": "decreaseLock(uint256,uint256,address)", +"e0b999a1": "getAmount(address,uint256)", +"e0b9e83d": "update(address,address,address,uint256,uint256,address)", +"e0bab523": "for_rewards()", +"e0bb933b": "getDragon(uint256)", +"e0bc6c44": "claimInsurance(bytes32)", +"e0bc6dea": "removeTransferableAddress(address)", +"e0bd3015": "getClaimableBalance()", +"e0bd53be": "sellTokensForZec(string,address,uint256,uint256)", +"e0bd7d15": "addContributor(address,uint256)", +"e0bede59": "firstPeriodSupply()", +"e0bfa1f7": "removeUtilityHolder(address)", +"e0bfe9ad": "MAX_TOKENS_RESERVE()", +"e0c012ff": "modifyairdrop(uint256,uint256)", +"e0c104ad": "DONC()", +"e0c2bc77": "CDEos(uint256,string,uint8,string)", +"e0c2dcbd": "last_win_wei()", +"e0c4cea8": "GrowToken()", +"e0c5f3a0": "add256(uint256,uint256)", +"e0c6046c": "donateToProject(uint16)", +"e0c6190d": "checkTime()", +"e0c63902": "Ok()", +"e0c67b9c": "ROKToken()", +"e0c68158": "changeIssuanceAddress(address)", +"e0c68db0": "shr(uint32,uint8)", +"e0c6d1ed": "migrateForInvestor()", +"e0c78337": "XITOToken(address)", +"e0c7c117": "Randao()", +"e0c82651": "RWToken()", +"e0cb3aa0": "buyWithLimit(uint256,uint256)", +"e0cbbde7": "makeCode(uint256,string)", +"e0cbc2cb": "changeInGameAmount(uint256)", +"e0cbf845": "testAddLocked()", +"e0cc4e1b": "LifCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"e0cd34f6": "getBlockBuildFee(uint256)", +"e0cd6eff": "board_size()", +"e0ce0b79": "processSeason(uint32)", +"e0ce72cb": "_fConfig()", +"e0ceb25b": "fairsaleProtection()", +"e0cec919": "setDailySupply(uint256)", +"e0cee23f": "SuccessfullyTransferedFromCompanyInventory(address,uint256,bytes32)", +"e0cf1316": "_transferPlayer(address,address,uint256)", +"e0cf17a5": "totalStoredDDT()", +"e0cf1e4c": "removeMembers(bytes32,address[])", +"e0cf715d": "EtherTrend()", +"e0cf72e1": "ERC20Token(uint256,string,string)", +"e0cfc05c": "testThrowsRetractLatestRevisionDoesntHaveAdditionalRevisions()", +"e0cfde22": "setRestrictedParticipationCap(address[],uint256)", +"e0d05c51": "MemoireClement()", +"e0d1ba52": "Rate_Eth()", +"e0d2771d": "MINIMUMINVESTMENTPRESALE()", +"e0d29d38": "STARTING_POOH()", +"e0d3558e": "GetBoosterData(uint256)", +"e0d370ac": "site()", +"e0d4ea37": "getSeed(uint256)", +"e0d4ea7e": "addDestructionProposal(string)", +"e0d54970": "getInstructions()", +"e0d5af94": "ownerWithdrawAll()", +"e0d669d8": "tradesLock(address)", +"e0d6d530": "setContracts()", +"e0d751da": "returnBets()", +"e0d77ff6": "hasBeenBooted(uint32)", +"e0d79d38": "addcertifieddata(string,string,string)", +"e0d872b7": "getSideServices()", +"e0d9bc7b": "sybmol()", +"e0da260c": "widthdraw(uint256)", +"e0da4abd": "getDefaultExchangeRate()", +"e0db6781": "offerDraw(bytes32)", +"e0db874d": "moneyBack(address)", +"e0dba60f": "setController(address,bool)", +"e0dbbea2": "search(uint256,bytes32)", +"e0dc892c": "GiftHasBeenSent()", +"e0dcf2d8": "processInitialDistribution()", +"e0dd31da": "MDCSToken(uint256,string,uint8,string)", +"e0dda563": "GetContractStagePreMoveIn()", +"e0ddaa0e": "MAX_TOKEN_BUYIN()", +"e0dec0c0": "contractValue()", +"e0df51bb": "test_oneValidAndInvalidEqAddress()", +"e0df53b9": "LotteryRoundStarted(bytes32,bytes32,uint256,string)", +"e0df5b6f": "setTokenURI(string)", +"e0dfd0a6": "GIFTCOIN()", +"e0e04685": "setOldContract(address)", +"e0e081d7": "marketStatus()", +"e0e0e2d3": "random(uint8)", +"e0e1104d": "tierWhitelist(uint256)", +"e0e11a14": "newVowIdFlag(address,uint256,uint256)", +"e0e1593c": "decayedPriceFrom(uint256,uint256)", +"e0e16f91": "TestContract(address,uint256)", +"e0e1a7f0": "testSHA3()", +"e0e267e5": "minimumWei()", +"e0e29ac1": "SLMICO(address)", +"e0e32504": "isDaySixtyChecked()", +"e0e34e06": "getGlobalConstraintParameters(address,int256,address)", +"e0e3671c": "checkOwner(address)", +"e0e3b9d7": "ImmutableShares()", +"e0e3ba5a": "getLosesShare(address)", +"e0e3feae": "skimALittleOffTheTop(uint256)", +"e0e40349": "name(address,bytes32)", +"e0e4704e": "RequestDetachmentOnPause(uint256)", +"e0e4731a": "TokenGoalReached()", +"e0e4c438": "sendInternally(address,uint256,uint256)", +"e0e58009": "BookingPoC(address,address,uint256)", +"e0e5fffd": "preSale4()", +"e0e69937": "setDefaultVestingParameters(uint256,uint256,uint256,uint256,bool)", +"e0e6d6cb": "requireValidIndex(uint256,uint256)", +"e0e7127a": "getContractOwnerAddress()", +"e0e722b7": "MAX_ALLOWED_STAGE_3()", +"e0e81ccb": "getCurrentSchellingRoundID()", +"e0e848c0": "checkDone()", +"e0e84e81": "changeCompanyWalletAddress(address)", +"e0e85fe8": "StatEventA(string,address)", +"e0e8823c": "withdrawDai(uint256,address)", +"e0e8a555": "KAL3Token()", +"e0e9b349": "getReportRegistrationFee()", +"e0ea129e": "militaryToken()", +"e0eb3035": "registerAudits(bytes32[],bytes,bool)", +"e0eb60b2": "initialSpinners(uint256)", +"e0eb6613": "PresalePool(address,uint256[],uint256)", +"e0eb9449": "mateAnimal(uint256,uint256,string,string)", +"e0ebd259": "discountValue()", +"e0ebdbff": "getAuditRequestor(uint256)", +"e0ec289a": "creditsExchanged()", +"e0ed78d1": "setRouletteRules(address)", +"e0ee74e9": "changeActualQueue(address)", +"e0ee94e9": "PocketCoin()", +"e0eef0b9": "BOOKIE_POOL_COMMISSION()", +"e0efdaf9": "softCapTokensAmount()", +"e0f0497d": "currentTokenSaleId()", +"e0f06352": "testIsContractAddress()", +"e0f20a65": "etherLock()", +"e0f31fae": "isDoneReporting(address)", +"e0f32198": "runSweepStake()", +"e0f3691d": "thisEther()", +"e0f426fa": "numMCApplied()", +"e0f47580": "withdrawCommisionToAddress(address,uint256)", +"e0f4a1a2": "minimumPRETDEContributionInWei()", +"e0f4ed01": "parcelEth()", +"e0f50bac": "senderWithdrawal(uint256)", +"e0f609d4": "unsafeIsEncrypted()", +"e0f6cc07": "isChain(string)", +"e0f74cde": "BONUS_TIMES_VALUES(uint256)", +"e0f76121": "GlobalCryptoShares()", +"e0f771c9": "Bithumb(uint256,string,string)", +"e0f7b44d": "PreTgeExperty()", +"e0f898e4": "totalTokenLossValue()", +"e0f8c670": "getFirstPaymentAmount()", +"e0f8da97": "sponsoredBonusToken()", +"e0f9210b": "batchDistributeReward(address[],uint256[],uint256)", +"e0faf0a8": "getOnSaleIds()", +"e0fb8459": "recevedEthFromExchange(address,uint256)", +"e0fce922": "deliver(address,uint256,uint256)", +"e0fd59bf": "disableAdminForever()", +"e0fddf81": "setemployee(address,string,uint256)", +"e0fdf336": "finalReserveTimeLock()", +"e0fe01f4": "makePrediction(int8,string)", +"e0fe075e": "payoutReady()", +"e0fe42be": "existsPriceOnAssetPair(address,address)", +"e0fe4a84": "updateStrategyCategory(bytes15,uint256)", +"e0fe6d07": "SideBridge(uint256,address[])", +"e0fe9ccf": "WaltonTokenLocker()", +"e0ff5b8b": "getBook(uint256)", +"e0ff5d2f": "setMaxRacers(uint8)", +"e0ffa0da": "lastBlock_f13()", +"e0ffe8e3": "newOrder(string,string,uint256,uint256,string,string,string)", +"e1005556": "allowTransferWhitelist()", +"e1017332": "sellPaused()", +"e1021b53": "getLuckyRecordSize()", +"e10289b8": "addContributor(uint256,address,uint256)", +"e102baab": "setTokenController(address)", +"e102d950": "getNameHash()", +"e1036f86": "tax_distributed()", +"e103f176": "transfer_master(address,address,uint256)", +"e1041d86": "__throw()", +"e106fae9": "lottoLowestNumber()", +"e106fb4b": "stringToBytes(string)", +"e1082335": "to(bytes32,address)", +"e1089240": "Csts()", +"e108d2d6": "setMintAdminApproval(address,address,address)", +"e1094ff6": "DGZTokensSold(address,uint256)", +"e1097249": "initStage()", +"e109ef24": "setTokenOperatorApprovals(address,address,bool,bool)", +"e10a70b7": "LogRedeemVIBE(address,uint256,uint256,uint256)", +"e10aa985": "Elyxr()", +"e10b650b": "winnerWithdraw()", +"e10bcc2a": "startMilestone(bytes32,uint256,address,uint32)", +"e10be707": "changeGoodBye(string)", +"e10c7bb5": "EventStore()", +"e10d29ee": "queue()", +"e10d416f": "enablePurchasing(bool)", +"e10d4c0b": "isSaler(address)", +"e10e274a": "CrazyEarning()", +"e10e5dce": "_build(bytes)", +"e10e66e6": "changeWeiPerToken(uint256)", +"e10e8ffe": "doOraclize()", +"e10e95c9": "fundingEnabled()", +"e10eda7a": "IOCFundIndex()", +"e10f1b06": "isTournament(address)", +"e10fb98f": "testMul()", +"e1103422": "retractRewards()", +"e11074cb": "initFund()", +"e1108706": "rfind()", +"e1112648": "record(bytes)", +"e1115aa5": "addUserRewards(uint256,uint256,address)", +"e1134799": "claimDaoStakeSupply(address)", +"e11398e8": "burnLeftovers()", +"e113c6fd": "ICO_SINCE()", +"e11443cb": "UWNToken(uint256,string,string,address)", +"e1152343": "payout(uint256)", +"e11527d4": "linkedContract()", +"e11583b7": "TokenOPSSaleAddress()", +"e116b17e": "getKudosLeftForProject(address,address)", +"e1175a79": "getMyTickets(string,address)", +"e117e6f9": "MyToken(uint256,string,uint8,string,uint256,uint8,uint256,string,string,string,string,string,string,string)", +"e1181c73": "faucetLif()", +"e1187e2e": "getCollectibleWithMeta(uint256)", +"e118eda4": "featuredSpritesLength()", +"e118fba2": "redeemPurchases()", +"e119f8bb": "migrateMarketInFromNibling()", +"e11a5a4f": "allocateStartBlock()", +"e11aa56d": "getDeedTimestampByAddress(string,uint256)", +"e11b09e0": "softCapCompleted()", +"e11b53af": "getContributionsCount()", +"e11dba54": "messagesLength()", +"e11df80d": "batchVipWithLock(address[],uint256[],bool)", +"e11e1b0c": "escrowBalance()", +"e11efa06": "getProgress(uint256)", +"e11f493e": "reentrancy()", +"e11f6398": "MAXIMUM_PERCENT()", +"e11fe9ec": "hasItem(uint256,uint256)", +"e12073a0": "getAllDetails(address)", +"e12097b7": "getCurrSale()", +"e121c102": "incentives(uint256)", +"e1221400": "getCoinInfo(string)", +"e1226164": "getFamilyById(address)", +"e122c028": "totalLBSold_GENERAL_2()", +"e122f1b2": "GoldenCurrencyToken()", +"e123182b": "purchase(bytes32,uint256)", +"e1248d52": "DYLC_ERC20Token()", +"e124e37b": "add_allowedAddress(address,address)", +"e124f899": "toPool()", +"e1252b9b": "make_anonymous_registration(uint256,uint256)", +"e1254fba": "getDeposit(address)", +"e125501f": "refundParticipants(uint256)", +"e125f88b": "aoccoin()", +"e1266042": "setTakeOwnershipFeePercents(uint256)", +"e126eb7d": "referralCodeFromAddress(address)", +"e1270b6e": "approval(address,address)", +"e1281280": "setAddressUIntMapping(address,uint256)", +"e12849b2": "getMineGenesis()", +"e1287520": "getBets(uint256,uint256)", +"e128f0d6": "getTogetherDate()", +"e12925a9": "setUnownedNickname(uint256,string)", +"e129330b": "factorContributed()", +"e129c99d": "notaryBookSize()", +"e129f783": "NameRegistered(address,bytes32)", +"e12a3bbe": "icoAllocation(uint256)", +"e12a894e": "CbdStandardToken(uint256,string,uint8,string)", +"e12badcf": "PlatformInformation()", +"e12bcd68": "relayerName()", +"e12bceeb": "performEqual(address,address[],uint256)", +"e12cbb3c": "SIGNAL_DELAY()", +"e12cbb9e": "updateOrderBatch(bool[],uint32[],uint128[],uint128[],uint32[],int256)", +"e12ed13c": "currentBlock()", +"e12ee8d7": "totalAmountRaked()", +"e12f3a61": "getClaimableAmount(address)", +"e12f670f": "DiscourzeToken()", +"e13044fb": "changeEth_to_usd(uint256)", +"e13062c2": "getInvoices(address,uint256[])", +"e1313dfb": "additionalInfo(uint256)", +"e13245b1": "getCommunityBallotsEnabled()", +"e13251b9": "listAssetsFrom(uint256,bytes32,uint256,bool)", +"e132db41": "checkRate()", +"e1332ab9": "setParameter(string,string)", +"e13380e9": "EmClassic()", +"e133ad53": "extendCost(uint256)", +"e1345b02": "SMARTGold()", +"e134c9ff": "shutdownMarket(address,bytes32)", +"e134e33d": "reason()", +"e1351c05": "pay_coin()", +"e1370365": "makeLogFill(address,address,address,address,address,uint256,uint256,uint256,uint256,uint256)", +"e137047b": "RESELLING_LOCK_UP_PERIOD()", +"e1376da2": "updateFirstActiveGamble(uint256)", +"e137cdd9": "totalTokenCreationCap()", +"e138efb2": "setAllowStart(bool)", +"e139bbd8": "getBalance1(address,address)", +"e139e569": "getPriceAndTime()", +"e13a7716": "testReturn()", +"e13aba48": "testBurn()", +"e13bd03c": "delCashier(address,address)", +"e13c6b39": "externalContribution(address,uint256)", +"e13da09f": "HARJToken(string,uint8,string)", +"e13dc28b": "testValidTransfers()", +"e13e2ecf": "dev_issueTo(address,uint256)", +"e13ec1fa": "RoundChanged(uint256)", +"e13efb79": "getReferenceHash(bytes32)", +"e13fafdb": "marketCoins()", +"e13fe91c": "REALPlaceHolderMock(address,address,address)", +"e1404b41": "setNewMembers(address,address,uint256,uint256)", +"e1419546": "makeLiquid()", +"e1421a45": "makeIntString(string,uint256,string)", +"e142967e": "addClaim(uint32,int256,string,string,bytes)", +"e1437b00": "calculateCurrentMarketPixelPrice(address[16])", +"e143b3a1": "createNewEscrow(address,address,address)", +"e1444721": "minGoalReached(uint256,string)", +"e1472d88": "increaseBalance(address)", +"e1479d07": "megoAddress()", +"e1479ebe": "is_registered(bytes32)", +"e1482188": "showCollectedFee()", +"e1486ea8": "getContest(uint32)", +"e1489191": "commission()", +"e148bae9": "assignClientIfNotAssigned(address)", +"e148fe28": "transferTokensFromReserveAddress(address,uint256)", +"e1496d16": "TEAM_NAMES(uint256)", +"e149f036": "ownedTokens(address,uint256)", +"e149fbfa": "ShapeshiftBotSolo(string)", +"e14a147e": "addPokemon(string,address,uint256)", +"e14acc04": "getCanLoanAmount()", +"e14b238a": "EITToken()", +"e14b7571": "stage_3_price()", +"e14b983e": "LevelToken()", +"e14c4675": "rateForMainICO()", +"e14c5e17": "setcreatorAddr(address)", +"e14ca10e": "oraclizeCallbackGasLimit()", +"e14df8b7": "subDepotEth(address,uint256)", +"e14e1ba7": "_getTokenAmountWithReferal(uint256,uint8)", +"e14e5ca4": "BETHER()", +"e14ed045": "getContributionOf(address)", +"e14f08d5": "renounceTokenOwnership()", +"e14f680f": "sendAll()", +"e151fb62": "_updateMetadata(uint256,string)", +"e153591c": "FairyFarmer()", +"e1538b32": "gasPayback()", +"e1539c53": "claim(bytes32,string,string)", +"e153af40": "RiyazToken()", +"e153b74e": "tokenFallback(address,uint48,bytes)", +"e154179e": "addToTrusted(string)", +"e1541b7d": "testDiacritcs()", +"e1541bc3": "setTdeIssuer(address)", +"e154d17d": "heldTokens(address,uint256)", +"e155999e": "getFreeCrocs()", +"e155b66c": "ConvnertToSecret(uint8,string)", +"e15618b9": "founderWithdrawablePhase4()", +"e1567997": "kscBatchTransferToBounty(address,address[],uint256[],uint256,uint256[],string)", +"e1568024": "totalAmountOfCrowdsalePurchasesWithoutBonus()", +"e1569f6b": "testThrowsSetNotRetractableNotOwner()", +"e15746af": "TJCUToken(uint256,string,uint8,string)", +"e157819a": "distributeCOMIKETCOIN(address[],uint256)", +"e1587aae": "maxFinneyPerSaleLessThan()", +"e158a24e": "ethTransfertoACC(uint256)", +"e1590ed7": "mainEtherReceived()", +"e15a307c": "killAndRefund()", +"e15cba26": "_pay(bytes32,address,uint256,uint256,uint256)", +"e15d051f": "adminUnsigned(address)", +"e15e9d47": "depositFlag(address,uint256,uint256)", +"e15f3ec2": "Sent(address,address,int256)", +"e1606013": "issueCert(uint256,bytes)", +"e160a1d6": "manaPerEth()", +"e160e146": "createContractToken(string)", +"e161c3bf": "getPercentage(uint256)", +"e1621b04": "getDatePosted(uint256)", +"e163698a": "setTokenForPublicSale(uint256)", +"e16385fc": "destroyTokens(uint256,address)", +"e163b75b": "settleBet(bytes20,bytes20,bytes32)", +"e164483f": "numberOfBlocksToStartGame()", +"e164ac50": "teamPercent()", +"e1654fad": "roundIn(uint256,string)", +"e1661eff": "getClaim(address,address,bytes32)", +"e1661ff2": "Later(address)", +"e1662aa6": "saveMsgByUser(string,string)", +"e166b756": "ownerMethod()", +"e166bebd": "BINOToken()", +"e1674588": "getTokenURIs(uint256,bool)", +"e1675421": "changeFsTKAuthority(address)", +"e167dbca": "exchangeTokens()", +"e168a31a": "getOwnedArea(address)", +"e168ae8a": "_isPreICO()", +"e168c3ec": "votes()", +"e16b924d": "sellBonds(uint256,bool)", +"e16ba8c6": "privateSale1Hardcap()", +"e16bd3b7": "getSales(address)", +"e16c7d5e": "signedApprove(address,address,address,uint256,uint256,uint256,bytes,address)", +"e16c7d98": "getContract(bytes32)", +"e16c8053": "setTransfer(uint256,uint256)", +"e16c8d4b": "viewMyShares(bool)", +"e16c93e5": "Swarm(address,address,uint256)", +"e16dbb2f": "Multiplication(uint256,uint256)", +"e16dd936": "getVestingSchedule(address,address)", +"e16e2843": "setdividendFee(uint8)", +"e16e9340": "getAddressArrayIndex(bytes32,uint256)", +"e16e93aa": "DU30Token(string,uint8,string)", +"e16f374c": "getHarborLocation(uint16,uint16)", +"e16f5fe9": "DeathFactor_iv()", +"e16fb2f9": "recordInvestment(address,uint256,uint256)", +"e16fe580": "CalcHash(bytes)", +"e1703521": "setPriceMoreThanOneETH(bool)", +"e170dd81": "MintingSale(address)", +"e1725c92": "decimalPlaces()", +"e1726faa": "pushDividendPayment(uint256,uint256,uint256)", +"e1727807": "splitPot()", +"e1727fc6": "contractDeployedTime()", +"e172a57e": "updateGenerationStopTime(uint256,uint8)", +"e172dac8": "ethOdinRate1()", +"e1733234": "get_all_activity(uint256,address)", +"e173b0d0": "reserveAll()", +"e17463c2": "changelp5(address)", +"e174f106": "ManualMigration(address)", +"e1757a3c": "TIMEOUTBLOCKS()", +"e1758bd8": "nativeToken()", +"e175c86a": "getInviteInfo()", +"e1765073": "getPath(uint256)", +"e17682eb": "StablePrice(uint8)", +"e177246e": "setDelay(uint256)", +"e17755c4": "zrxTokenContract()", +"e177573c": "setHatchTime(uint64,uint256)", +"e177644a": "TimeStamp()", +"e177b18b": "minCoordinatorCount()", +"e177b707": "Valdela()", +"e177bb9b": "registerCode(string)", +"e17928ba": "BOBOTOKEN()", +"e17a3ccf": "paused_4()", +"e17a5894": "yoobaTeamAddress()", +"e17a7c70": "stage3_start()", +"e17b25af": "setMetadataAddress(address)", +"e17b3054": "creatorOwner(address)", +"e17b35ed": "isMint(address)", +"e17bf87a": "testRewardBB(bytes32)", +"e17cb777": "rewardRetweet(address)", +"e17e1274": "testTransferToRejectAuthority()", +"e17e1a86": "SetupWWC(string,string,uint256,uint256,uint256,address,address,uint256)", +"e17e7a20": "setTotalStaked(uint256)", +"e17fc704": "canMintFoundation(uint256)", +"e17fe6a0": "getCreatorReward()", +"e17fec26": "Unregistered(bytes32)", +"e180819e": "setBuyTime(uint256)", +"e18099e1": "ethTokenRate()", +"e180dbbd": "isEarlyBird(address,address)", +"e180e23b": "Annexe_CPS_6()", +"e182e27a": "fastHatchingPrice()", +"e182fd01": "tokensBankPartners()", +"e184c9be": "expiry()", +"e1851b83": "getMaximumFundsInEuroCents()", +"e1859169": "communityContributionQuota()", +"e185a890": "widthdrawRefunds(address)", +"e185b24c": "emptyIndex(address[])", +"e1863b19": "MultisigWalletMock(address[],uint256,uint256)", +"e186fb27": "checkcitizendetails(uint256,string,string,string,string)", +"e1878925": "isDeregisterable(address)", +"e187a550": "logCall(uint256,uint256)", +"e187eaf7": "addMoreTime(uint256,uint16)", +"e1883433": "withdrawEther(uint64)", +"e189dba1": "sellIssuerTokens(uint256)", +"e18a9134": "getLockProducts(uint256)", +"e18af2b8": "PHPCoin(uint256,string,string)", +"e18b170e": "tune(uint256,uint256,uint256,uint256,uint256)", +"e18b7fcf": "receiveFee()", +"e18c52ae": "testControlTransferNotTransferable()", +"e18c8cf9": "etherInWei()", +"e18d38ce": "getPlayerName(address)", +"e18d9bba": "getUSDAmountByWeis(uint256)", +"e18dc0f6": "pricingStrategyAddress()", +"e18e34d5": "setPayoutFee(uint256)", +"e18ed57b": "_calculateTax(uint256)", +"e18f1355": "TestERC20Token(uint256,string,uint8,string)", +"e18faad8": "_adduserdayget(address,address,uint256,uint256)", +"e18fb814": "setFixPrice(uint256)", +"e18fe709": "AirRewardTotalSupply()", +"e190264f": "newCampaignAccount(uint256)", +"e1909035": "GetCompetitionResults(uint32,bool)", +"e190d1b5": "claimFreeCrab()", +"e1911d70": "METADATA_URL()", +"e19136a4": "urbitAdminAddress()", +"e191548d": "AnimecardCore()", +"e192c4e0": "investor_Refund()", +"e193289f": "setVotingHelper(address)", +"e1938b14": "oraclizeSetWinner()", +"e193b735": "tokensDonated()", +"e1948e44": "ethRateExpiration()", +"e194e369": "getFamedStarByName(string)", +"e19593e5": "cashout(uint256,address,address,address,uint256,bytes,bytes)", +"e195d096": "tokenReserved()", +"e195f2ec": "howManyFees()", +"e1980d15": "setBuyAuctionAddress(address)", +"e199b7e4": "getMasterAdress()", +"e199c8a8": "SafiraToken()", +"e19a7bc8": "stopMigration()", +"e19ab767": "totalDistrictSupply()", +"e19aca85": "takeDividends(address)", +"e19bb964": "priceIncreasingRatio()", +"e19bc813": "bonusesCount()", +"e19bc8e5": "initPrivateIco(uint256,uint256,uint256,uint256,uint256)", +"e19d36ff": "removeAsset(bytes32,address)", +"e19eaf79": "blocknumber(address)", +"e19f1c55": "EstatePurchased(uint256,address,uint256)", +"e19fb933": "MentalHealthLifeToken(uint256)", +"e19fd3c5": "determinePurchase()", +"e1a05087": "getImpactUnmatchedValue(string)", +"e1a05344": "createSaddle6(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"e1a1cd8d": "crowdfundEndDate()", +"e1a27ad3": "needsAdministration()", +"e1a283d6": "mintingPaused()", +"e1a29a3f": "setVariationAddress(address,address)", +"e1a2c446": "lockRewardTokenMany(address[])", +"e1a382f4": "ZTHToken(uint256,string,string,uint8)", +"e1a3e55c": "buy(string,address)", +"e1a44749": "setOptions(uint256)", +"e1a566f4": "challengeExists(string)", +"e1a57611": "tokenReceivers(uint32)", +"e1a58a74": "flowerContract()", +"e1a63c14": "PixelMap()", +"e1a67cd3": "overrideTokenHolder(address,uint256)", +"e1a69d88": "level_1_amount()", +"e1a6ddcd": "isValidContribution()", +"e1a6df9e": "FLIGHT_NUMBER()", +"e1a6e625": "TradingStart(uint256)", +"e1a6f014": "offer(uint256,address,uint256,address,uint256,bool)", +"e1a7739c": "getExercisePeriodDeadline()", +"e1a8af8a": "getWinnerPrize(uint256)", +"e1a9109d": "setSeedPrice(uint256)", +"e1a9a2b1": "endRound(uint256,uint256)", +"e1a9f9b9": "_buyCallToClose(uint256,uint256,uint256,uint256,address)", +"e1aa1098": "GuardaRegistro(string)", +"e1aa1bcc": "refundDeadline()", +"e1aa60dc": "lastBlock_v3()", +"e1aa7e95": "createNewUser(bytes32,bytes,address)", +"e1ab5860": "declarePublicOfferingPlan(uint256,uint256)", +"e1ab690e": "ANRToken()", +"e1ab7cda": "OnetVN()", +"e1aba68e": "newProposal(address,string)", +"e1abf819": "GetWinner(bytes32,address,bytes32,address)", +"e1ac48ad": "saleableTokens()", +"e1aca6fb": "quickSort(uint256,uint256)", +"e1ad1162": "transfer(address,uint256,bool)", +"e1ad7699": "setPayload(string)", +"e1ad84a0": "GetFixedPrice(uint256)", +"e1addfbb": "priceOfreservations(address)", +"e1ae91b3": "TestToken(address,uint256,uint256)", +"e1af0121": "associationOf(address)", +"e1af915d": "changeGenes(uint40,uint256)", +"e1afb08c": "unlock(bytes16)", +"e1b0513b": "withdrawGame()", +"e1b0d4b2": "setTransactionsAllowed(bool)", +"e1b10970": "moveFactory(uint8,uint8)", +"e1b27e6b": "COO()", +"e1b3f338": "undoPending(address)", +"e1b40a76": "ipfsAddress()", +"e1b41513": "LIVEToken()", +"e1b4d6cb": "HOTCRYPTO()", +"e1b5265a": "PutForExchange(address,uint256)", +"e1b53078": "makerAffiliateFee()", +"e1b54285": "endDateOfVipPlacement()", +"e1b5989d": "FastLoan()", +"e1b5ce0f": "buy(uint256,string,string)", +"e1b7535f": "getDepositor()", +"e1b7abda": "HOST_SHARE()", +"e1b8347b": "testFundsAreTransferrableAfterSale()", +"e1b84ac3": "_storeSettingCreation(address,uint8,string,address,address,string)", +"e1b8708f": "OwnerChanged(address,address,bytes32)", +"e1b92b21": "LogOmegaEggSale(address,uint256)", +"e1b9dc08": "setCallbackGasLimit(uint256,uint256)", +"e1b9dea4": "Globglogabgalab()", +"e1b9ed9d": "_buyTokens(address,uint256,uint16)", +"e1ba84a9": "testFallbackThenAdd()", +"e1baa2a0": "ownerAngelTransfer(address,uint64)", +"e1baa9cb": "CNT_Common()", +"e1baed1a": "hireBountyHunter(uint256)", +"e1bc048e": "clones_to_create_one_idea()", +"e1bc3003": "reveal(bytes,string)", +"e1bccc7f": "FccToken()", +"e1bd5af9": "contractHolderAddress()", +"e1bdc3c9": "addAddressMappingProposal(address,address)", +"e1be7467": "bounties()", +"e1bedf2a": "AlarmTester(address)", +"e1bf34e9": "transferToKnownContract(address,uint256,bytes32[])", +"e1bf4f50": "upgradeM5Logic(address)", +"e1bf50c8": "_transferChamp(address,address,uint256)", +"e1bfc31e": "acceptOp()", +"e1c0669d": "getJobSponsorshipId(address,address,uint256)", +"e1c093da": "getMinerBlock()", +"e1c1451a": "tokensIssuedMkt()", +"e1c18c42": "setEarned_money(uint256)", +"e1c1b939": "verifyTransaction(bytes32,uint256,address,address,uint256,address,address,uint256,bytes,bytes)", +"e1c33523": "xpaFundDeposit()", +"e1c3aedc": "updateRewardVaultContract(address)", +"e1c3bac6": "stakeMaxAge()", +"e1c3fb91": "_hasClosed()", +"e1c49dde": "previousRounds()", +"e1c4a6a6": "getIsRemoved(bytes32)", +"e1c4c9fe": "remainingReward()", +"e1c52dc6": "Confirmation(address,bytes32)", +"e1c5d838": "createOrgan(string)", +"e1c621c0": "_rewardTokens(address,uint256)", +"e1c66292": "Create(uint32,address)", +"e1c68f31": "findFloorKey(uint256)", +"e1c6b14b": "addToOtherMap(uint256,uint256)", +"e1c70b29": "_createPow(string,address,uint256,uint256,uint256)", +"e1c7392a": "init()", +"e1c7f06a": "AddSharedAccount(bytes32,bytes32,bytes32,address)", +"e1c80391": "setArtcoin(address,address,address)", +"e1c941b0": "batchSendWebGiftToken(address[],uint256)", +"e1c95bb9": "updateThresholdNewTokenPair(uint256)", +"e1c9ccaa": "ShopalToken()", +"e1ca1b7d": "FilmoljupciCoin()", +"e1ca6f6f": "distribute_100_tokens_to_many(address[])", +"e1ca8b57": "setNewPriceFuncAddress(address)", +"e1caa0c7": "createAndCall(string,bytes)", +"e1cb0e52": "getVal()", +"e1cb5515": "newArticle(string,string,string,address)", +"e1cba8d2": "TUBECOINcontract()", +"e1cd5fc0": "PROJECTOPERATION_SUPPLY()", +"e1cda468": "createRequestFromBytes(bytes)", +"e1ce95c8": "summon10SkinAppearance(uint256)", +"e1cf0b3b": "refundAllPlayers()", +"e1d001eb": "mintAllowance(int256)", +"e1d03d11": "setUnlockedAddress(address)", +"e1d07058": "_modifySpendLimit(uint256)", +"e1d10d85": "getMyTickets()", +"e1d10f79": "calluseraddress(address)", +"e1d1e8ef": "getCurrentUnitPrice()", +"e1d2d3e4": "SocialMedia()", +"e1d2f649": "restartAuction(uint256,uint256,uint256)", +"e1d30979": "wolkInc()", +"e1d35155": "ProudofYourCoin()", +"e1d4efc4": "YHT()", +"e1d5988e": "discount(uint256,uint256,uint256,uint256,uint256)", +"e1d5e8eb": "rollDices(uint256)", +"e1d5ec4c": "seedShare()", +"e1d6aceb": "transferWithComment(address,uint256,string)", +"e1d6e166": "getContracts(address,uint256)", +"e1d76c8e": "getBlocksByOwnerDesc(uint256,uint256,address)", +"e1d7ce2c": "EthCentsUpdated(uint256)", +"e1d7fadc": "disqualifyHopeful(uint256)", +"e1d81736": "addUser(uint256)", +"e1d8501d": "getUSDAmount(uint256,uint256)", +"e1d94d94": "ownerChangeSlogan(string)", +"e1d9627f": "ReputationChanged(address,int32,int32)", +"e1da4135": "bountyFundAddress()", +"e1da4f85": "setStartStage2(uint256)", +"e1da5637": "setPercentWeiJackpot(uint256)", +"e1dace1a": "rewiewToken()", +"e1dad94c": "recountUsersBalance()", +"e1db206c": "limitTier1()", +"e1db8e7e": "getCreatedPayoutNumerators()", +"e1db8ff2": "mineForMany(address[],address[],uint8[],bytes32[],bytes32[])", +"e1dbc281": "changeBank(uint256)", +"e1dc7792": "OptedOut(address,address)", +"e1dcafa3": "setDefaultReputationReward(uint256)", +"e1dcf3de": "NewBooking(address,uint256,uint8,uint256)", +"e1de02f3": "_exit(address)", +"e1de373f": "addPlayerName(string)", +"e1df4517": "WealthChainToken()", +"e1df507c": "calculateAmounts(uint256)", +"e1df7f60": "startstopICO(bool)", +"e1e073b6": "amountTokenIssued()", +"e1e09299": "addUserRole(address,uint8)", +"e1e158a5": "MIN_DEPOSIT()", +"e1e1f977": "parseTx(address[4],uint256[3],uint32[4])", +"e1e29558": "completeTask(uint256)", +"e1e2ccd2": "sellDrugs()", +"e1e3f915": "parameterizer()", +"e1e46351": "mvpLaunchedAt()", +"e1e46f24": "tokenRate2()", +"e1e471eb": "BankingPayToken()", +"e1e4d737": "setTokenFront(address)", +"e1e5c093": "controlSum()", +"e1e7c320": "getGamesPlayerBids(uint256,address)", +"e1e85c4b": "splitProfit(uint256)", +"e1e867e5": "getFees(uint256,uint256,address)", +"e1e87c28": "refundToBuyers()", +"e1e87f40": "LogDividend(address,uint256,uint256)", +"e1e87f60": "_getBid(address,uint256,uint256)", +"e1e902af": "transferToLock(address,uint256,string)", +"e1e93604": "atomicMatch_(address[14],uint256[14],uint8[6],bytes,bytes,bytes,bytes,bytes,bytes,uint8[2],bytes32[5])", +"e1e9e249": "encodeAddress(address,address)", +"e1ea0a57": "TOKKA()", +"e1ea5e05": "token_fallback(address,address,uint256,bytes)", +"e1eac4a8": "get_bountyHunter(address,address)", +"e1eae0b4": "fullUnitsStaked(address)", +"e1eb5f87": "NewPrice()", +"e1ebdb6d": "setWhitelistA(address,address)", +"e1ec12c7": "TopPlayerToken()", +"e1ed7fcb": "setBagMultiplier(uint256,uint256)", +"e1edd8ec": "getSupplyAgent(address)", +"e1eddc6d": "_rand(uint256)", +"e1ee9284": "getOwnCard(address)", +"e1ee9a3d": "isPreIcoDate()", +"e1ef42b1": "Total_Investors()", +"e1efda6d": "airaSend(address,address,uint256)", +"e1f0ae1b": "NexoToken()", +"e1f0c376": "gameDuration()", +"e1f11822": "carnumOf(address)", +"e1f16616": "invcoinSentToEther()", +"e1f21c67": "approve(address,address,uint256)", +"e1f4895a": "getCostToken()", +"e1f4a9b1": "set_pre_kyc_bonus_denominator(uint256)", +"e1f51aca": "listTokenByRank()", +"e1f5760b": "horsesRemaining(uint256)", +"e1f57846": "com_fee_transaction(address,address,address,uint256,uint256)", +"e1f5eb3f": "convertTokens(uint256,address)", +"e1f5ebc5": "_projectAddNew(address,uint256)", +"e1f6452e": "AggiungiNegoziante(address,bool)", +"e1f69952": "voteSvp02(bool)", +"e1f7d0e1": "PRE_SALE_END()", +"e1f7ec5a": "getStored()", +"e1f82d60": "publicReservedToken()", +"e1f86887": "getPortfolioTable()", +"e1f87904": "getNextDouble(address)", +"e1f8922e": "transferName(address,string)", +"e1f8926b": "depositEthPool(uint256)", +"e1fa70ef": "endCloseSale()", +"e1fa7638": "attack(uint256,uint256)", +"e1fa78e9": "AgriChainLabelInt()", +"e1fa82d0": "transferFromFlower(address,address,uint256)", +"e1fa8b02": "distribute(uint256,address)", +"e1fa8e84": "register(bytes32)", +"e1fac58d": "lockedBalanceOfByDate(address,uint256)", +"e1fb070e": "MtTaborToken()", +"e1fbeaed": "CUCUX()", +"e1fcad6a": "_equipUpOne(address,uint256)", +"e1fcb86d": "YouTube()", +"e1fd3d4e": "emergencySetDOwner(bytes32,address)", +"e1fd632f": "EDU_KYC_BONUS()", +"e1fdb4b4": "refundBet(uint256)", +"e1ff98f2": "getTotalCounter()", +"e1ffdecb": "tokensPerTranche()", +"e20056e6": "replaceOwner(address,address)", +"e200cee8": "setBossWannaCryInterface(address)", +"e201be98": "airDropToken()", +"e201d466": "MultiToken(uint256,string,uint256,string,string,uint256)", +"e2021f66": "getAttack(bytes32,bytes32,uint256)", +"e2022d3a": "storeNewVesting(address,address,address,string,uint256)", +"e202e1eb": "contractPartOne(uint256)", +"e20314ed": "trade(uint256[10],address[4],uint256[6],bytes32[4])", +"e2034834": "RemoveRocketForSale(uint32)", +"e203f335": "leafPrice()", +"e2045452": "setUsername(address,string)", +"e2045b5e": "getBadgeInfo(uint256)", +"e2047589": "assertEq(address,address,bytes32)", +"e204ce12": "transferExtra(address,uint256,uint256)", +"e2056c46": "ExtraBalToken()", +"e2059fdf": "showIssueDetail(address,bytes32)", +"e2069734": "destroyRemainingTokens()", +"e2087a44": "receiveApprovalTest(address,uint256,address,bytes)", +"e209bf22": "addMeme(string,string)", +"e20a4bcd": "recoverAddressFromCooperativeSettleSignature(bytes32,address,uint256,address,uint256,bytes)", +"e20a5ac2": "bonusFourthWeekPeriod()", +"e20a9ae9": "Tesoro()", +"e20acc79": "changeInterval()", +"e20b7d3c": "checkPoolAddressTierCap(uint8,uint256)", +"e20bbd8d": "RecoveryWithTenant()", +"e20bc67b": "autoUnlock(address)", +"e20bce0a": "lowTimeBonusValue()", +"e20c6d3d": "getMessageData()", +"e20ccec3": "pending()", +"e20cfc4a": "payedDividendsUSD()", +"e20d35ad": "CellBlocksToken()", +"e20dc05b": "globalOperator()", +"e20de6eb": "addrLockedFunds()", +"e20e1dc3": "createProxy(address[],uint256)", +"e20e36a0": "ExchangeAdapterBase(address,address)", +"e20e54a5": "getMHTHoldersNumber()", +"e20ff6f7": "fetchCurrentSatoshiState()", +"e2101509": "getSketchesWithHolder(address)", +"e211003d": "processOffChainPurchase(address,uint256)", +"e2119c80": "computeRealCap(uint256,uint256)", +"e2121de1": "withdrawAny()", +"e2130d1e": "unlockTeamTokens()", +"e21316ea": "mortal(address)", +"e213beb7": "transferCoOwnership(address)", +"e213e10a": "_createMeme(uint256,string,address,uint256)", +"e2153231": "SahilToken()", +"e2155c14": "galleassMint(address,uint256)", +"e21608be": "ReserveToken()", +"e2164700": "currentRewardNum()", +"e216bf4d": "SetBlockForSale(uint256,uint256,uint256,address)", +"e2172000": "left63(uint256)", +"e2179b8e": "g()", +"e21827a1": "unmintedTokens()", +"e218519c": "getref()", +"e2187e6e": "endTimeLockedTokensTeam()", +"e2188190": "CROWD_WAVE3_PERIOD()", +"e219aa11": "GetEscrowETHBalance()", +"e219b9e1": "rebateOneFenmu_()", +"e21a430b": "publicRelease()", +"e21aaa0f": "_getShipPrice(uint256,uint256)", +"e21ac8a1": "AvatechToken()", +"e21b0b95": "updateGlobalMinContribution(uint256)", +"e21b63b2": "setNewMint()", +"e21b9d08": "m_changeable()", +"e21be4f4": "CBMTToken()", +"e21c4783": "isPermitted(address,bytes32)", +"e21e221b": "ContributionRegistration(address)", +"e21f37ce": "message()", +"e21f44f4": "PoolCreated(uint8,uint256,uint256)", +"e21f8e56": "get_game_fees()", +"e21fd9fc": "_owns(address,uint256)", +"e2202a4d": "jester()", +"e2211592": "TWO_DAYS()", +"e2217114": "forwardEther(uint256)", +"e2217d5c": "payeth()", +"e2219773": "webGiftOnceMaxAmount()", +"e221d5d5": "getDukeNickName(string)", +"e222b00c": "blocksPerPayPeriod()", +"e22325ad": "transferBase(bytes32,address)", +"e2233ada": "smartDoor(address[])", +"e223b547": "calcFixedReward(uint256)", +"e223cb37": "AddBill(uint256,uint256,uint256,bool)", +"e223ed87": "getPetValue(uint256)", +"e223facb": "USER_GAME_WITH_TOKEN(uint256)", +"e224179e": "icoOverride()", +"e22497e4": "removeFromPublicSaleWhitelist(address[])", +"e225c56b": "KudosToken()", +"e225e588": "TNCN()", +"e226a1b6": "getAddressStatus(address)", +"e226cdec": "sellOffline(address,address,uint256)", +"e226ed22": "balanceOfERC20(uint256,address)", +"e227b5d1": "ETHContributed(address)", +"e228647f": "olty_6()", +"e228a6f4": "withdraw(uint256,uint8,uint16)", +"e228d627": "nextTokenAddress()", +"e228ecb4": "lockBalance()", +"e22938bd": "ShareManager()", +"e22955c6": "MultiplyContract(address,uint256,uint256,uint256,uint256,uint256)", +"e2298591": "xIPFSPublicKey()", +"e22a3af8": "canClaimTokens()", +"e22a6231": "addCandidate(address,string,string)", +"e22a9877": "getHWCAddress(address)", +"e22aa47a": "lockTokensForCs(address,address,address)", +"e22ad518": "startNextPremiumSale()", +"e22ae31d": "FrameCoin()", +"e22b0c46": "verify(uint256,uint256,uint8,bytes,bytes)", +"e22b3fb4": "changeOwner(bytes)", +"e22b94e8": "ForceCryptoInvestmentCoin()", +"e22baa56": "nonZero(uint256)", +"e22bda35": "eventVenue()", +"e22c6128": "getIncome(address)", +"e22d1581": "saleEnd2()", +"e22e8046": "getLunckyIndex()", +"e22ed995": "createStudent(string,string,string,uint32,bytes1)", +"e22f8dc9": "buy_lovelock(string,string,string,uint256)", +"e22fb860": "CJXToken()", +"e22fcd08": "useItems(uint32,uint256,address,uint256)", +"e23000a0": "buyBackPrice()", +"e2301d02": "subApproval(address,uint256)", +"e2306253": "o1Address()", +"e230dfbd": "setETHUSD(uint256)", +"e230e246": "cutFor(address,uint256,uint256,uint256)", +"e2311a78": "Payperblock()", +"e2313d1f": "ClaimOrichalcum()", +"e231bff0": "redeemed()", +"e2322c73": "firstPeriodWindows()", +"e2326909": "addCourse(string,string,string,uint256,uint8,uint8,uint16,uint8,uint8)", +"e2331332": "AortaToken()", +"e2332120": "secondUnlockTime()", +"e233ee0d": "publicFillOrder(bytes32,uint256,bytes32)", +"e2356efd": "holdTokensOnStage()", +"e235847a": "addSourceForTimeline(uint256,uint256,string,bool)", +"e235ca59": "revealsCount(uint256)", +"e236de22": "distributorWallet()", +"e2376be1": "sendMon(address,address,uint64)", +"e2387bb6": "AuctionHouse()", +"e238c7ed": "setAllowanceAdmin(address,address,uint256)", +"e238def9": "getReleasedBalance()", +"e23941bc": "testDepositWithdraw()", +"e239421d": "Lotthereum(uint256,uint256,uint256,uint256,bytes32)", +"e239ccba": "Disco()", +"e23a15b5": "logSigned(string,bytes16)", +"e23a4916": "getMainLockup()", +"e23a7785": "approveAndBuy(uint256,address,uint256,bool)", +"e23a845a": "getExpirationTime()", +"e23c5063": "getAttributeValue(address,bytes32)", +"e23caa06": "getLotteryDetailsA(int256)", +"e23cbad1": "getArkData(uint256)", +"e23d0996": "getDBallotID(bytes32,uint256)", +"e23d0b23": "week2Price()", +"e23da75a": "setTokenApproval(uint256,address)", +"e23e231f": "TOKENS_NOT_FOR_SALE()", +"e23e3229": "investorIndex()", +"e23eaae6": "SmogToken()", +"e23eb0c5": "_calculateFEE2Distribute()", +"e23f5e49": "checkLucky(address,uint256,uint256)", +"e23f61f6": "isCurrentOrPastAdmin(address,address)", +"e23fc908": "_setBurnFeeAbs(uint256)", +"e2418c15": "throwsWhenNetworkPlaceholderIsBad()", +"e241c1d9": "deriveKey(uint256,uint256,uint256)", +"e241e9c5": "_getUt(address)", +"e2420bd2": "setTwitterBot(address)", +"e242df57": "MiracleTeleToken(uint256)", +"e242fbbb": "addHuman(string,uint8)", +"e244054a": "trade(bool,bytes,uint256,uint256)", +"e2442441": "VpaxContract()", +"e24459ce": "rakugoPresaleAddress()", +"e2449c13": "createSqr(uint256,address,uint256,uint256)", +"e244fe89": "addToCommunitySaleWhitelist(address[])", +"e2454522": "verify(uint8,bytes32,bytes32)", +"e2457f50": "changeZS(address,address,uint256,uint256)", +"e24613ea": "getNexOrdertUser(address,address,uint256,address)", +"e2466cb6": "invalidateAnnouncement(uint256)", +"e24670eb": "EthToCentsUpdated(uint256)", +"e246ddba": "icoFinishTime()", +"e246f71a": "EventAddManager(address,address)", +"e247a2e2": "updateVolume(uint256)", +"e248b435": "setCCH_edit_15(string)", +"e2496d5b": "tokensWeiRaised()", +"e2499b98": "stakedContentById(bytes32)", +"e249a575": "setTermsNumber(uint256)", +"e24a1d1e": "deauthoriseMaker(address)", +"e24a5042": "transmuted(uint256)", +"e24b4403": "_emitDeposited(address,uint256,address)", +"e24b7721": "addressLeskiw()", +"e24c36d0": "flushEra()", +"e24cddd6": "getCartLength(address)", +"e24cf226": "closeEscrow(uint256)", +"e24f8313": "addReputation(address,uint256)", +"e24fe110": "Decentralized()", +"e24fed00": "assertEq(bytes,bytes,string)", +"e2506eab": "setEMAValue(uint256)", +"e250ecfe": "Cogenero(uint256,uint256,uint256,address)", +"e251e358": "preIcoSoftCap()", +"e25209b6": "roundOneLimit()", +"e253c21d": "ZBCToken()", +"e253dd6b": "setBonusRound4(uint256)", +"e2542f03": "updatePurchasePossible(bool)", +"e2550156": "smallBlind()", +"e25520a7": "LocklistAddressdisable(address)", +"e2558086": "calculateLandmarkPrice(uint256)", +"e255d5ad": "maxBuyRateInPrecision()", +"e25665da": "earlyBackersPoolAddress()", +"e256888f": "PERCENTAGE_PRECISION()", +"e2573266": "withdrawRC()", +"e2575e48": "_isMultiple(uint256)", +"e2576998": "changeMaxCoefPartnerForEmission(uint256)", +"e2583070": "balanceImportsComplete()", +"e25876d3": "weiToFinney(uint256)", +"e258a0f0": "createItem(string,uint256,uint256,uint256[6])", +"e258aa02": "createPromoRegion(address,string,uint256)", +"e258be32": "removeBookSigner(bytes16,address)", +"e259501e": "contributorsWallet()", +"e2595235": "addPack(uint8,uint128,uint256)", +"e259d074": "endauctionother(uint256)", +"e25a2a99": "updateTier(uint256,uint256,uint256)", +"e25a51b6": "setCompositeReputation(string,uint32)", +"e25ade5f": "issueTokens(address,uint256,uint256,bool)", +"e25b5cbd": "STAKE_APR()", +"e25bc771": "_transferCard(address,uint256,uint256)", +"e25bd409": "receivePositionOwnership(address,bytes32)", +"e25c80d0": "_currentIcoPhaseMinimum()", +"e25c9c33": "getBadgeLevel(bytes32,uint256)", +"e25d4dac": "mintFund(address,uint256)", +"e25f0a98": "requestedForMigrationAt()", +"e25f71ac": "isRoundAwarded()", +"e25fe175": "step()", +"e2616387": "MPY(uint256,uint256)", +"e26176d9": "FundRanking(address)", +"e261fc63": "UserRank(address)", +"e2621a66": "HPBToken(address)", +"e26259a4": "updateMyHns(string,address)", +"e264172c": "drainETH()", +"e26422fe": "DaysToDestroy()", +"e2646a9f": "getICOStage()", +"e2649caf": "voteToFreezeFund()", +"e264a2f4": "KIN_PER_USD()", +"e264fc07": "_buyFillet(address,uint256,bytes)", +"e2651539": "priceCreatingChannel()", +"e26534bf": "whaleExchangeRate()", +"e2659324": "require_email(bool)", +"e265c5e2": "getTotalTokenWithdrawByAddress(address)", +"e2664254": "priceDivisor(uint256,uint256)", +"e26659da": "getAllBaller()", +"e26693ac": "stakeDice()", +"e266e5ad": "Mystical()", +"e267761f": "unmintedGBT()", +"e267dd9b": "addAgent(uint256,uint256,uint256,address)", +"e26814d8": "withdrawCoins(address,uint256)", +"e26835ce": "giveToken(address)", +"e2684f08": "_isPaused()", +"e268ea6b": "SOFT_CAP_T()", +"e269053a": "getNumberOfAssets()", +"e2693180": "DHANACOIN()", +"e269f929": "recoverRevokeHash(bytes,bytes,uint256)", +"e26a687f": "BP_IMMORTAL()", +"e26ba086": "getTargetInvalidMarketsDivisor()", +"e26bc039": "numRegisteredModules()", +"e26c2da9": "TerraToken()", +"e26c551e": "publishConditions(string)", +"e26c8434": "AdminStartDraw(string,bytes)", +"e26dee0e": "IcoExt()", +"e26e7b50": "calculateCritMassRewards(uint256)", +"e26e8d84": "FillSellOrder(address,address,uint256,uint256,uint256,uint256,uint256)", +"e26f0342": "ArrayTypesTest(uint256[10])", +"e26f21bf": "setHoldPercentage(uint256)", +"e26fdc12": "equipDown(uint256)", +"e27008c2": "_createRareCard(address,uint256,uint256,uint256,uint256)", +"e270398a": "emitJobPosted(uint256,address,uint256,uint256,uint256,bytes32,bool)", +"e270bc81": "resumeICO(address)", +"e270f88c": "_getFreezeTime(uint256)", +"e27131f9": "MintCoin()", +"e2725161": "calculateOdds(uint8)", +"e2726e94": "minSumICOStage4USD()", +"e272b892": "pauseContract(bool)", +"e2734c93": "getPlayerBalance(address)", +"e273f117": "SetServiceProviderFee(address,uint256)", +"e2740b4e": "getTradesRoot()", +"e2749799": "GBank(uint256)", +"e274a3e7": "Papergold()", +"e274fa4e": "BitcoinXL()", +"e274fd24": "eventContract()", +"e2757a50": "PepFarmer()", +"e275a016": "check_data(string)", +"e275f296": "transferFromMulti(address[],address[],uint256[])", +"e27671ff": "hillpayout()", +"e276729d": "getPeriodStarted(uint256)", +"e276c799": "getx()", +"e2775da5": "getMartialOwner()", +"e2776ab8": "CryptoPhoenixes(address)", +"e2786d65": "refundSplitMembers()", +"e278c0f2": "setInvestorsFee(uint256)", +"e278d283": "getLineUpEnable_pool(address)", +"e278fe6f": "closeRound()", +"e2790853": "OX()", +"e27929b6": "addRecord(bytes32,string,string)", +"e27a8aca": "addWhiteListedInvestor(address,string)", +"e27a9c74": "setOwnerName(uint256,string)", +"e27b73f0": "issueWithExternalFoundation(address,uint256,bytes32)", +"e27c5b17": "testSlice()", +"e27da9c6": "current_tier()", +"e27e3fd3": "CancelGame()", +"e27ecfcc": "LogStartDate(uint256,uint256)", +"e27f0236": "agingBalanceOf(address,uint256)", +"e27f1692": "Bitsonatoken()", +"e27f3853": "timeFreezeTeamTokens()", +"e27fe50f": "startAuctions(bytes32[])", +"e280b58f": "tokenIssuedLockUp()", +"e280d66b": "updateWonNums(uint256,uint256)", +"e2812256": "Monarch()", +"e281d7e4": "CryptoSlotsGame()", +"e282348c": "w_Founders()", +"e282726b": "reserveAddr()", +"e282938d": "founderLockEndTime()", +"e282969e": "getPerson(uint256,bool)", +"e282cda6": "calculateBucketId(bytes32[])", +"e283d1ec": "registerEscrow(string,string)", +"e2842d79": "getAllUsers()", +"e28435c4": "ownerETHCashout(address)", +"e284cbfa": "getAllAdIdsByCat(uint256)", +"e284f217": "distributeToAll(uint256)", +"e2861c8d": "cashOutProfit()", +"e2865b4d": "growCost()", +"e2868c54": "Airdrop2(uint256)", +"e2869853": "RefID(string,string)", +"e2869f70": "setCrowdsaleAndVesting(address,address,address)", +"e2877e04": "transferFactoryResourceAmount(uint16,address,uint256)", +"e287adf4": "addSig(address,bytes32)", +"e2889c82": "setTimeLimit(uint256)", +"e2894a8a": "OwnerAnnounce(string)", +"e2896598": "leaderTimestamp()", +"e289fcb6": "contractActive()", +"e28a5e63": "sellDeadline1()", +"e28ab336": "MAX_INVEST_SHARE()", +"e28b0d9a": "updateFundingEndBlock(uint256)", +"e28b2b76": "ipoPlatform()", +"e28b7555": "CapiterContract()", +"e28d717b": "transferETH()", +"e28d8c4b": "claimBonusTokens()", +"e28deda5": "sweepTokenAmount(address,uint256)", +"e28e6b3a": "masterTotalEarning()", +"e28fa27d": "setHardcap(uint256)", +"e28fed1e": "userRescues(address)", +"e29121de": "ADVISOR_TOKENS()", +"e2912367": "_getValuePartByPercent(uint256,uint256)", +"e292c740": "setLargeInvestorWei(uint256)", +"e2935edb": "getUpgradeCardList(address)", +"e2948c21": "marketingTeamTokens()", +"e29532c1": "getDataFromCode(string)", +"e2954a14": "purchaseSeconds()", +"e29581aa": "getNodes()", +"e2958974": "read_transfer_config()", +"e295c9d6": "getActiveBanners()", +"e297273a": "getBlockHashOrZero(uint256)", +"e298287f": "senderAddressIsSecretContract(address)", +"e2982c21": "payments(address)", +"e2985596": "angelCardDataContract()", +"e298d85c": "discountBlock()", +"e2996879": "HuoNiu()", +"e299beb3": "SimpleIndex()", +"e29a2e89": "publishMessage(string,string,string)", +"e29a82d3": "BigFishRoll()", +"e29bfe13": "submitWithdrawTransaction(address,uint256)", +"e29c6a7b": "addYearToken()", +"e29caee2": "currentStageTokensRate()", +"e29e1345": "amountPerDay()", +"e29e1864": "PresaleCapChanged(address,uint256)", +"e29e3a4c": "artistsArtworkCount()", +"e29e436a": "setWorldCupTeamDesc(uint256,string)", +"e29eb836": "totalCollected()", +"e29f5182": "byte32ToString(bytes32)", +"e29f610d": "end1Timestamp()", +"e29f99f0": "tokenAdd()", +"e29f9da6": "_getrand09()", +"e29fa4b4": "setOriginalOwner(uint256,address,address)", +"e29fb547": "scheduleCall(bytes4,uint256,uint256,uint8,uint256)", +"e2a034dd": "participantsFirst(uint256)", +"e2a0d56d": "FundsBurned(uint256)", +"e2a27ca8": "_setBorderValue14(uint256)", +"e2a288c0": "placeCoin(uint16,uint16)", +"e2a2adc2": "divisionRoundedUp(uint256,uint256)", +"e2a3382f": "holdedOf(address)", +"e2a376ec": "addContributor(address,uint256,uint256,uint256,uint256)", +"e2a38a4b": "removeTokens(address,address,uint256)", +"e2a4853a": "setUint(bytes32,uint256)", +"e2a51b8f": "amountOfParticipants()", +"e2a5c39f": "revealPeriodStartedTimestamp(bytes32)", +"e2a71f12": "accountDelete()", +"e2a8215b": "purchaseTokens(address,uint256,address)", +"e2a9ba05": "getBoosterDuration(uint256)", +"e2a9bb53": "CreateBattleCards(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"e2a9ca4c": "disableTokenTransfer()", +"e2aa2dcf": "CryptoPeopleName()", +"e2aa6003": "gameResult(uint256,uint256,uint256,bool,uint256,uint256)", +"e2aa6c66": "createPasswordChallenge(bytes20,bytes32)", +"e2aa99ab": "startCrowdsaleY2(address)", +"e2aafa21": "inWhitelist(address)", +"e2ab691d": "lock(address,uint256,uint256)", +"e2acf75d": "auctionCancel(bytes32)", +"e2ad0699": "addCertification(address,bytes32,bytes,bytes32)", +"e2ae0c79": "setParentID(uint256,uint16)", +"e2ae9de0": "deleteArrayUint(bytes32,uint256)", +"e2b05077": "getSaleDate(bytes,uint256)", +"e2b0caef": "when()", +"e2b13fa0": "ManagerPermissionRevokedEvent(address,string)", +"e2b178a0": "getAuthority()", +"e2b202bf": "deleteUint(bytes32)", +"e2b20a72": "SecretToken()", +"e2b2579b": "isClean(address)", +"e2b26323": "proceedToNewStage(int256)", +"e2b375a9": "transferOwnership2(address)", +"e2b43e23": "setDepositInterface(address)", +"e2b4b30d": "getvaluejoinlist_odd(uint256)", +"e2b4f4b5": "lockedTeamUFT()", +"e2b770b4": "updateUSDMonthlySalaries(address,uint256,uint256)", +"e2b7713f": "Midel()", +"e2b863cf": "calculatePayout(bytes32,uint256)", +"e2b8766c": "testFailTransferNotTransferable()", +"e2b91318": "createOptionAndUnderwrite(bool,address,uint128,uint128,address,uint64,uint256)", +"e2b9e186": "name_()", +"e2b9e322": "bondsOutstanding(address)", +"e2ba53f0": "winnerName()", +"e2ba600e": "starting_giveaway()", +"e2ba6ce8": "m_KYCProvider()", +"e2bbb158": "deposit(uint256,uint256)", +"e2bc1971": "getGamblerGameIds(address)", +"e2bca77e": "calculatePrizeAmount(uint256,uint256,uint256)", +"e2bd505b": "setTitulaire_Compte_2(uint256)", +"e2bd8e43": "CodysToken()", +"e2c03ace": "itemsCount()", +"e2c14bdd": "getMapping(bytes32)", +"e2c1f02c": "buySuperDragon()", +"e2c1f7d7": "firstCapEndingBlock()", +"e2c20836": "updateAndGetHodlTotalValue()", +"e2c2ae5a": "isBuyPrice(uint16)", +"e2c2d72c": "setChallengeScienceContract(address)", +"e2c31be6": "icssale(address)", +"e2c345e2": "originalContract()", +"e2c38eaf": "findProductIndexById(uint256)", +"e2c3941a": "DOG_Token()", +"e2c3f9a8": "RATE_PUBLIC_SALE()", +"e2c41dbc": "depositFunds()", +"e2c516be": "icoReceivedWei()", +"e2c518fa": "lastMovement(address)", +"e2c5449e": "chanceNo()", +"e2c61114": "setImportFee(address,uint256)", +"e2c6d41c": "council()", +"e2c718d8": "right20(uint256)", +"e2c76bb0": "SpeculateCoin()", +"e2c7f7ae": "majorOwnerShares()", +"e2c86092": "ifoodCommunity()", +"e2c8a8ad": "contributorPoolMintQuota()", +"e2c8dd34": "dividendsWallet()", +"e2c8e54a": "senderIsPosition(address,address)", +"e2c8f7c8": "ARIWallet()", +"e2c92a52": "distribute(address,uint256,uint256)", +"e2c9b07d": "ChangeBillLeasingInfo(uint256,uint256,uint256,bool)", +"e2c9bc9e": "GenesisTransfersCount()", +"e2ca01f0": "addNewOrUpdateHolder(uint256,bytes32,bytes32,bytes32)", +"e2ca481c": "swaps(address,bytes20)", +"e2cbb9b7": "evCreatedToken(address,uint256,address,uint256)", +"e2cc20bd": "dealerHit()", +"e2cc7a51": "signingPrefix()", +"e2cdd42a": "vote(uint256,address,bool)", +"e2ce7e67": "read_i16_array()", +"e2cf8b0d": "createBundle()", +"e2d07a33": "QYKToken()", +"e2d0d519": "sendOwnership(address,uint256)", +"e2d17ab1": "checkGoals()", +"e2d1da31": "createBuildingOmni(uint32,uint8,uint8,uint8,uint8,uint8,address,bool)", +"e2d2a868": "autoRefundCrowdsaleContributor(address)", +"e2d2dcca": "removeMemberAcct(address)", +"e2d2e219": "dividendsPerShare()", +"e2d31df4": "getTeamPerfitAmuont()", +"e2d45f7b": "transferMultipleDelegated(address,address[],uint256[],uint256,uint256,uint256,bytes)", +"e2d56060": "balanceInWei()", +"e2d5d11b": "revealCap(uint256,uint256)", +"e2d6eddc": "get_row_col(uint256,uint256,uint256)", +"e2d7a7c0": "setAttrCustom(uint256,uint256,uint256,uint256)", +"e2d7c64c": "darknodeRegisteredAt(address)", +"e2d84e23": "getLink()", +"e2daeb9c": "NICTO()", +"e2dbbf62": "changeIcoDiscountLevels(uint256,uint256)", +"e2dc35e0": "transferFund(address,uint256)", +"e2dc5da5": "finishMintingTokens()", +"e2dc7763": "freeze(address[],bool)", +"e2dc9aa1": "addTransaction(string,uint64,string)", +"e2dea715": "getMinerId(address)", +"e2deaa81": "set_reference(uint256,uint256,uint256)", +"e2deb962": "signUp(uint256,bytes32)", +"e2dede94": "getNode(uint256,uint256)", +"e2df0463": "changeTrancheAdmin(address)", +"e2df15d6": "setRewardClosed(uint256)", +"e2df20d1": "setAvailable(bool)", +"e2df2472": "Aurum()", +"e2df6c6f": "getBonus3(uint256)", +"e2e0c049": "UpdateSellAgent(address)", +"e2e15f2e": "Reward()", +"e2e1ff4d": "getBallotsNum(address)", +"e2e267fc": "SintToken(uint256)", +"e2e29ffe": "assertThat(bool)", +"e2e2e5cf": "UpdateMinBalance(uint256)", +"e2e39498": "_verifySignature(bytes,bytes,bytes)", +"e2e51348": "LogContractCreated(address,uint256)", +"e2e54288": "getCertificationList(bytes32,bytes32)", +"e2e5bd42": "setBetBasic(uint256)", +"e2e5fade": "presaleSales()", +"e2e616bb": "whiteListEnabled()", +"e2e68372": "IAM_PER_ETH_PRE_SALE_RATE()", +"e2e686d0": "safeAdd32(uint32,uint32)", +"e2e71098": "_FCTOKEN(uint256,string,uint8,string)", +"e2e794c3": "setPremiumMultiplier(uint8)", +"e2e79a02": "level2(address,address)", +"e2e7ab3a": "setEthlanceInvoiceContract(address)", +"e2e831cf": "genders(uint8)", +"e2e8b978": "sizeOfUint(uint16)", +"e2e9e6e8": "updateMaxMinComparables(uint256,uint256,uint256)", +"e2eb3336": "_performPurchase(uint256,uint256,address,uint256,address)", +"e2eb91cc": "removeAddressFromOwners(address)", +"e2ec6ec3": "addAddressesToWhitelist(address[])", +"e2ecb311": "createEscrow(address,uint256,uint256)", +"e2ecef03": "boleno()", +"e2edf7be": "usd2FokenByStage(uint256,uint16)", +"e2edfc20": "collectAirDropTokenBack(uint256)", +"e2ee2e89": "isPlayerInRound(uint256,address)", +"e2ee9941": "tap(bytes20)", +"e2ef9241": "FawnCoin()", +"e2f0a05a": "TokenCLC(uint256,string,uint8,string)", +"e2f1d298": "_addGroupToMember(address,bytes32)", +"e2f23224": "isEnableBuySell()", +"e2f273bd": "updateAdmin(address)", +"e2f2eb27": "NUMBER_OF_BOOSTERS()", +"e2f31829": "updateStatus(uint256,uint256)", +"e2f35f17": "teamAccountAddress()", +"e2f36034": "calculateRevenueAtBlock(uint256)", +"e2f45eba": "PrettyGirl(uint256,string,string)", +"e2f60706": "specialPurchase()", +"e2f60c26": "getMintAuditApproval(address,address)", +"e2f779f3": "withdrawTokensFromCustody(address,uint256,address,address)", +"e2f77ae2": "setPriceInExoTokens(uint256,uint32)", +"e2f8a017": "payInstallment(uint256)", +"e2f8b790": "buyBlueStarEgg(uint256,uint16)", +"e2f8fa16": "getPendingTaxData()", +"e2f8feb2": "internal_tester(int256)", +"e2f90632": "notTooLongSinceUpdated()", +"e2fa5398": "pack(uint16,uint64,uint64)", +"e2fa5fb1": "secondDiscountCap()", +"e2fa6f90": "_removeTokenFromOwnersList(address,uint256)", +"e2fa9ee0": "openShop(uint256)", +"e2faf044": "createDAO(address,uint256,uint256,uint256)", +"e2fb3d4a": "setReferralSmartContract(address)", +"e2fc2691": "upvotePost(bytes32)", +"e2fc421d": "crowdsaleStartTime()", +"e2fc5d19": "setConfirmations(bytes32,bool,bool)", +"e2fc6f68": "beneficiaryBalance()", +"e2fd38e9": "startEvent()", +"e2fd3c08": "OmVPNToken()", +"e2fdcc17": "escrow()", +"e2fdf807": "purchasableTokens()", +"e2fecdf3": "copy(bytes,uint256,uint256,uint256)", +"e2ffe3f3": "storageToUint(string)", +"e3004b57": "depositToken(address,bytes)", +"e30081a0": "setAddress(address)", +"e3038aaf": "calcOrderToMsAmount(uint256)", +"e303a92b": "drawLottery(uint256)", +"e303cccd": "sellKun(uint256)", +"e303e81e": "authorizeForTier(uint256,address[])", +"e30443bc": "setBalance(address,uint256)", +"e3049b6f": "getFighters(uint32)", +"e3049ded": "AllyNetworkToken()", +"e305044f": "disableServiceMode()", +"e3059cef": "recover(uint8,bytes32,bytes32,address)", +"e305c210": "getPositionFromBattleboard(uint16,uint8)", +"e30637d6": "REFF_TOKENS()", +"e30651b4": "COMMUNITY_CAPPED_VALUE()", +"e3069e4d": "HTX()", +"e306d361": "setUnits(address)", +"e306f779": "EIP712_DOMAIN_HASH()", +"e308262a": "kycPassed(address,address)", +"e3083fb5": "removeFromContribution(uint256)", +"e308700f": "thresholdEtherLimitForSeedRound()", +"e308c213": "getBag(uint256)", +"e30922fc": "isGameLocked(address)", +"e309396b": "addSchema(string,string)", +"e3098986": "totalSold_()", +"e309aa15": "RefundSent(address,uint256)", +"e309d1b5": "tierTwoRate()", +"e309f318": "spermlordAddress()", +"e30addb4": "set_property_layout(uint256,string,string,string)", +"e30b407e": "payWinningGladiator(uint256,uint256)", +"e30bd740": "reverse(address)", +"e30c36f1": "bubbleSort(uint256[])", +"e30c3978": "pendingOwner()", +"e30c7b0a": "TronXtended(uint256,uint256)", +"e30ca7cb": "getBalanceOfContractInSzabo()", +"e30cfa40": "isExecuted(uint256,uint256)", +"e30d1625": "stateUpdate(uint256,uint256,uint256,uint256,uint256,uint256,bytes)", +"e30dd27a": "EpsBonus()", +"e30dfb94": "callAndFailWithoutReason()", +"e30e3334": "BonusTokens()", +"e30f4e2b": "addMultipleAddressesToWhitelist(address[])", +"e30f4f84": "addWhiteBacker(address)", +"e30f7c8b": "startAirdrop(address[],uint256)", +"e30fe37a": "setQueryAddress(address)", +"e310c2ca": "emissionPay(uint256)", +"e312e00f": "approve(address,uint256,bytes,string)", +"e3140c51": "PCHAIN()", +"e31418be": "rateMap(uint256)", +"e3142e90": "logInitialReporterTransferred(address,address,address,address)", +"e31430c0": "acceptEscrow(address,address,uint256)", +"e314d852": "mintWithMemo(string,address,uint256)", +"e3153827": "reading_card_reversed_at(uint8)", +"e316bd56": "hashMsg(bytes32,address,bytes32,address,uint256,bytes32,string)", +"e316e9c0": "Issue(uint256,address,uint256,uint256)", +"e31743d7": "setTransferBlocked(bool)", +"e31870dc": "mlDevelopers()", +"e318a74c": "RACEFORETH()", +"e318b52b": "swapOwner(address,address,address)", +"e318de73": "getString(address,bytes32)", +"e3199044": "setGoalsPlayed(uint256,uint256,uint256,bool)", +"e319b0e2": "advisorsUnlockedAfterCliff()", +"e31a0292": "getostToken()", +"e31a7c01": "triggerTransfer(address,address,uint256)", +"e31a8116": "getMinPrice()", +"e31a9d92": "lastID()", +"e31b1aae": "ChangeInterest(uint256,uint256,uint256,bool)", +"e31bfa00": "next_id()", +"e31c60e3": "Request(address,uint256)", +"e31c71c4": "safeToSub(uint256,uint256)", +"e31d3460": "addused(uint256)", +"e31d3938": "MINT_INTERVAL_SEC()", +"e31e0c46": "set_end_block(uint256)", +"e31e2d6d": "func_0A93()", +"e31e450d": "checkBoard(uint256)", +"e31f28ef": "getTransferInfoTime(address,uint256)", +"e31f3e0c": "startUpgradePoll(address)", +"e31f4263": "theCamp()", +"e31ff6c2": "recordOffChainContribute(uint256,address,uint256)", +"e3206975": "bet_MAX()", +"e321045a": "_storeSettingDeprecation(uint256,address,address,address,uint256,address)", +"e321192b": "addTransaction(address,uint256,uint256,string,bytes)", +"e3218219": "DungeonTokenAuction(uint256)", +"e321adb3": "_canTransfer(uint256,address)", +"e3224ac3": "piecesOwned(address)", +"e32381b6": "kscMintTo(address,uint256,string)", +"e32497c4": "getArtefactsIds()", +"e3252a76": "oraclize_randomDS_proofVerify__sessionKeyValidity(bytes,uint256)", +"e32540b4": "OptionTransfer(address,address,uint256,uint256)", +"e3256429": "COMPANY_RESERVE_FOR()", +"e325fb4b": "bonusCap()", +"e326acbf": "uintFloor(uint256,uint256,uint256)", +"e326e6ad": "DEFAULT_PRESALES_DURATION()", +"e32754a0": "MyFreeCoin112(uint256,string,uint8,string)", +"e327a46f": "breakdown(uint256)", +"e3280126": "addOrder(string,bool)", +"e328cc5c": "getActiveArbiters()", +"e328ef67": "INDInflationVesting()", +"e3296684": "transferToPie(uint256)", +"e329e871": "endTime1()", +"e32a29bb": "burnClosedTokenMultiple(bytes32[])", +"e32aa56a": "acceptLastMilestone(bytes32)", +"e32ae93b": "getQueueOpening()", +"e32af410": "CSClosed(bool)", +"e32b349a": "JCB()", +"e32b6325": "releaseForIco(address,uint256)", +"e32c5f01": "managePID(uint256,uint256)", +"e32c65f2": "tokensPerWei15()", +"e32cb7fc": "decimalPlace()", +"e32d264e": "addDefaultOperatorByTranche(bytes32,address)", +"e32d5cf8": "setApprovals(address,address,uint256)", +"e32d76de": "validBeneficiary(address)", +"e32e68ec": "isNewSchool(uint256)", +"e32e9f22": "setDeploymentReward(uint256)", +"e32ecd18": "LEXT()", +"e32ef3c5": "refereesCount(address)", +"e33051dd": "setGasPriceLimit(address)", +"e3306a6f": "CurrentStatus()", +"e330a737": "setCrowdsaleCloseTimerFor(uint256)", +"e332dfe9": "Token0901(uint256,string,string)", +"e333f969": "setUserAllocMax(address,uint256)", +"e3343501": "_playRealOdds(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"e3349637": "addshop(uint256,string,string,string)", +"e334cd92": "getAstrosLength()", +"e334f32e": "encodeString(string)", +"e3350d7c": "setValidKYC()", +"e3353f3e": "increaseBlockTarget()", +"e335b5e9": "allocateSupply()", +"e335e1f8": "LogFundsLocked(address,uint256,uint256)", +"e33607da": "saleMarket()", +"e336e01d": "saleQuantity()", +"e33734fd": "changeProposalDeposit(uint256)", +"e337db6e": "NANJCOIN()", +"e337dd35": "SendingBounty(bytes32,uint256)", +"e337eca6": "TalkBounty(bytes32)", +"e3380b7e": "joinPillarCore(uint256,uint256,uint8)", +"e3386a98": "trustedToken()", +"e338a490": "DEVELOPER_FEE_FRAC_BOT()", +"e3393a6d": "voting(string)", +"e3396d2f": "updatePlayersCoin(address)", +"e339886c": "ADDR_WITHDRAWAL1()", +"e3399538": "ArithValue()", +"e33a9ab7": "createOffer(uint16,uint256)", +"e33b7de3": "totalReleased()", +"e33b8707": "append(uint256)", +"e33ba574": "hashSecret(bool,bytes32)", +"e33bb62a": "BRDCoin()", +"e33c7ae2": "scheduleTransaction(uint256,uint256,bytes)", +"e33c9755": "getActionIds(bool,bool,bool)", +"e33d27e4": "complete_sell_exchange(uint256)", +"e33d28d7": "vestBalanceOf(address)", +"e33dafbf": "emitters(bytes4)", +"e33e59d8": "getInsuranceContracts()", +"e33e5c5e": "getAddressUInt8(bytes32,bytes32)", +"e33f6aaf": "getOnBurnAmountValue()", +"e3407276": "bigModExp(uint256[6])", +"e340c2fb": "bidETHIncrement()", +"e340d0d6": "renewDec(uint256,uint256)", +"e3419202": "redits()", +"e341eaa4": "sign(uint256,bytes32)", +"e342c2e6": "investorWhiteList()", +"e343fea6": "contractPays()", +"e344606b": "hashtagCommission()", +"e34486f8": "isActivePoll()", +"e344ce6b": "updateWhiteLists(address[],bool[])", +"e3450e13": "lastPlayer()", +"e34514ba": "getVirtualBalance(address)", +"e345514c": "CreateTokenToTax(address,uint256)", +"e345f098": "showLastBidder()", +"e34639cb": "AllocatedCappedCrowdsale(uint256,address,address,uint256,uint256,uint256,uint256,address,address,address,address,uint256)", +"e3464b1b": "Drop()", +"e346b380": "totalPreSale()", +"e346f79e": "submitTokens(address)", +"e3470882": "markFirstSaleComplete()", +"e347a773": "shares(bytes32,bytes32)", +"e348270d": "killMePlease()", +"e3489a4f": "setII_R1(uint256)", +"e3495569": "MAX_DISCOUNT()", +"e3499381": "checkPlayerPayout(address)", +"e349c313": "addPlayerToBoard(bytes32,bytes32)", +"e349c7df": "settleUncle(bytes32,bytes32)", +"e349cb12": "change_name(string)", +"e349f108": "jokerAddress()", +"e34a90a7": "distributeBounty()", +"e34ac873": "avatarTransferState()", +"e34ad653": "EmissiveToken(address,string,uint8,string,string)", +"e34b7983": "doPremine()", +"e34c3896": "FundUpdated(uint256)", +"e34c8dbf": "distributionDate()", +"e34da795": "claimTokens4mBTC(address,uint256)", +"e34dd755": "CrowdsaleAddress()", +"e34e1700": "StarlightToken()", +"e34e32c0": "assignOwnership(address)", +"e34e5786": "test_testableStandardCampaignPayoutToBeneficiary()", +"e34e7889": "unlistDomain(string)", +"e34e7cda": "maxRoundDelta()", +"e34f2a9e": "fundingStartTimestamp()", +"e34f7137": "_performApprove(address,uint256,address)", +"e34f947d": "repairCar(bytes17,string,string,uint256)", +"e34f9dcc": "GCOXPACToken(string,string,uint8,uint256)", +"e34ffcb8": "changeMinAmount(uint256)", +"e3500b48": "setResolver()", +"e35060d9": "RequestEthereumCollect(address)", +"e350b490": "gameToWinner(uint256)", +"e3524d36": "getCurrentDiscountPercent()", +"e3528455": "burnPrimordialTokenFrom(address,uint256)", +"e3530e9c": "spendFromMultisig(bytes32,uint256,address)", +"e3539dcc": "LogReceivedETH(address,uint256,uint256)", +"e3546ac5": "isRatio()", +"e354a3f2": "freezeAccount(address,bool,string)", +"e35501be": "activate_admin_commission()", +"e3552808": "RoboToken(uint256)", +"e35568cb": "getAvailableTokens()", +"e355cd4a": "SharkPool()", +"e35694c0": "callFunction(address,address,uint256,bytes32)", +"e3577e71": "setPaymentSettings(string,string)", +"e3579ea5": "publish(string,string,address,uint256)", +"e3583870": "replaceDecomissioned(address)", +"e358b0e1": "withdrawPreICOEth()", +"e358d75a": "getFairymasterReq()", +"e3599c21": "updateGame(uint8,uint8[],uint32,uint8,uint8)", +"e359cbbb": "hasEnoughBalance(address,uint256)", +"e35b37fe": "TRANSFER_COST()", +"e35b8717": "GolixTokenDistribution(uint256,uint256,uint256,address,address,address)", +"e35b9699": "Namek()", +"e35c606b": "JiggsR()", +"e35c96d4": "NextToken(address)", +"e35ca326": "cancelOrder(uint80,bool)", +"e35d1a86": "sendFundsToOwner(address,uint256)", +"e35d3590": "AddSocialAccount(bytes32,bytes32,bytes32)", +"e35d75a9": "tokensToEthereum_3(uint256,uint256)", +"e35e6078": "tokenPerUsdDenominator()", +"e35e6e0c": "setPrice(uint16,uint16,uint8,bytes32,uint256)", +"e35f0254": "numberOfProposals(string)", +"e35f4db3": "developer_edit_text_amount(string)", +"e3602077": "withdrawInWei(address,uint256)", +"e360736e": "getHistory(string)", +"e360a49e": "latestUpdate()", +"e361112a": "isPaying()", +"e3611578": "testFooKill()", +"e36255e2": "_checkGeneralRequirements(uint256,uint8,uint8)", +"e3625dee": "REFERPAYToken()", +"e362bc9a": "confiscateDeposit()", +"e362efdc": "getTotalPayout()", +"e362f168": "CoinAdvisorPreIco(address,address,uint256,uint256)", +"e362fcaa": "Creditors(address)", +"e3637435": "supportAccount()", +"e3643106": "getLatest(uint256,uint256)", +"e364bd01": "KEOS()", +"e3650781": "setGasForGR(uint256)", +"e3651ef3": "fetchRecentSubmittals()", +"e3659e69": "CNIFCrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"e365fd7f": "setMiniPoolEdit_8(string)", +"e3661586": "confirmManager()", +"e3669d7c": "Ballot(string,bytes32[])", +"e3677664": "transferPiece(uint256,address)", +"e3685ef7": "PocketMoneyContract()", +"e3686b49": "PopeCoin(uint256,string,uint8,string,address)", +"e3688d7a": "maxNumMC()", +"e3692473": "setMockedDate(uint256)", +"e3699763": "_addAddress(address)", +"e36a0e6e": "hasPermissionFrom(address)", +"e36af50d": "betsKeys()", +"e36b0b37": "stopSale()", +"e36b9b9f": "addMemberById(uint256,address,address)", +"e36ba174": "updateMaxCapEthOnce(uint256)", +"e36c2072": "countCourses()", +"e36c3f70": "BENEFITToken(uint256,uint256,uint256,uint256,uint256)", +"e36d036c": "mintPresale(uint256,address)", +"e36d3844": "CardCreated(address,uint256,uint256,uint256)", +"e36d392c": "DeliverInfo(uint64,uint256,uint256,uint256,uint256,bytes32,uint64,bytes32)", +"e36d3a43": "SENDING_BLOCK()", +"e36db785": "creditor()", +"e36dd1f9": "withdrawalMoneyBack()", +"e36e1051": "setcardsalemoney(uint256,uint256)", +"e36e5d18": "showTopsPlayer()", +"e36f3177": "maxIssuingSupply()", +"e36f3e7c": "getAddressDescription(address)", +"e3710599": "SendTokens(string)", +"e371817e": "calculateTokenAmount(uint256,address)", +"e371c0e6": "transferPermissions(address,uint256)", +"e371cdd4": "luke(uint256,string,string)", +"e371dfdb": "allFamily(uint256,address)", +"e372d0eb": "ownersOfArea(uint256,uint256,uint256,uint256)", +"e37362ab": "NRB_Main()", +"e37426d4": "StopCrowdsale()", +"e374e8d4": "isMyWalletLocked_Receive()", +"e375dfed": "StarbaseCrowdsale(address,address)", +"e377ac31": "legal()", +"e3787c61": "TestContract(string)", +"e3788da6": "ExternalAccountsBase()", +"e378f045": "window0TokenCreationCap()", +"e37a012f": "fireEventOnTokenTransfer(address,uint256)", +"e37a7fff": "newPlayer(uint256,uint256)", +"e37aa618": "distributeValue()", +"e37aca99": "BOXICOIN()", +"e37b346d": "redistribution()", +"e37b71ce": "getFundTX(address,uint256)", +"e37bddc3": "changeEnd(uint256)", +"e37c6cf8": "redeemDisavowedTokens(address)", +"e37c8613": "balanceOfPendingToken(address)", +"e37ccac7": "getSuperseded(address)", +"e37cd202": "getBonusRate(uint256)", +"e37d46bd": "myDivs()", +"e37d4fed": "withdrawToFounders(uint256)", +"e37d883a": "NumbersToken()", +"e37e26cc": "_buyFromMarket(uint256,bool,uint256)", +"e37e60d1": "testControlRetractNotOwner()", +"e37e7d1a": "init(address,uint256[],uint256,uint8)", +"e380575a": "presaleFundsRaisedInWei()", +"e380ae96": "setNow(uint256)", +"e380b7bd": "balanceOfToken(address,uint256)", +"e38138a2": "startPurchaseTokens()", +"e3814b19": "fromUint(uint256)", +"e38180ec": "addToPayeeBalance(address,address,uint256)", +"e381a8d9": "StegoCoin()", +"e38296e4": "changeDelegate(address)", +"e382b854": "_setPackedTimestamp(bytes20,uint256)", +"e382c3e6": "getPeriodBonus()", +"e382fe45": "deathData_v4()", +"e383da38": "totalAffiliateTokensSent()", +"e3843f6e": "myLoseShare()", +"e3844a61": "isBetPossible(bool)", +"e3848e5b": "thing(string,string,string)", +"e385b43a": "DistributionNextPos()", +"e385f7d2": "SendResult(uint64,bytes18,bytes32,bytes11)", +"e3873ad7": "setDepositBankFee(uint256)", +"e3877391": "DDJETHToken()", +"e3877acd": "frozenDaysForAdvisor()", +"e38787aa": "internalBurnTokens(address,uint256)", +"e387d31a": "estateRegistry()", +"e388cbb9": "swpFundDeposit()", +"e389b63f": "transfer(address,uint256,bytes,string,uint256)", +"e38bc1f0": "timeThatFinishGuaranteedPeriod()", +"e38c35b6": "getLockedUserBalance(bytes32)", +"e38c4585": "JointICOContractAddress()", +"e38c9825": "maxgame()", +"e38cc06b": "testDiv()", +"e38d0fbd": "FirstTradingEcosystem()", +"e38d6b5c": "maxPrice()", +"e38d7e99": "_next_id()", +"e38da1a1": "storeDoi(bytes32,bytes32)", +"e38e2cfb": "step(uint16)", +"e38f4861": "initLock()", +"e38fbdf6": "addBoundary(address)", +"e38ff5dc": "updateInvestor()", +"e39062f5": "MDTKAirdrop(address,address)", +"e3906b3d": "mintNextCard()", +"e390e263": "disableWhiteListForever()", +"e3914699": "dEthereumlotteryNetWinners(address)", +"e391a7c4": "revokeSignaturePreSigned(bytes,bytes,uint256)", +"e391b3d1": "ssword(string)", +"e391bda5": "transferImpl(address,address,uint256)", +"e39253e6": "SampleToken(uint256,string,uint8,string)", +"e392a521": "indexPrice(uint8)", +"e3945eba": "planetLife(uint256,uint256,uint256)", +"e395983a": "bountyTokensBatch(address[],uint256[])", +"e39608af": "ETUToken(string,string,uint256,uint256)", +"e3961174": "tokensCreationCap()", +"e3964b8c": "ERC20Token(string,string,uint8,uint256,address)", +"e3967d6a": "currentTimeBonus()", +"e3967eed": "totalUserNumber()", +"e396bd60": "LogEscrowWeiReq(uint256)", +"e396da73": "checkProof(bytes32,bytes32[],uint256)", +"e3973b5a": "NiteshToken()", +"e397dfd1": "updatetoken(uint256,string,string,uint256)", +"e39898d1": "checkSaleValid()", +"e399331b": "coinAllocation()", +"e3994993": "addDiary(string)", +"e399cb0d": "initializeCappedFundraiser(uint256)", +"e399daab": "zoomraffleFee()", +"e39a686c": "ChainBackedOption()", +"e39b2284": "ZEONPrivateSale(address,address,address,uint256,uint256)", +"e39b40d8": "_createCard(string,uint256,address,address,bool)", +"e39bbf68": "dividedBy(uint256,uint256)", +"e39bdfab": "getCutie(uint40)", +"e39c6d80": "batchTransfer(address,uint256[],uint256[])", +"e39c742a": "_caluLocktime(uint8)", +"e39cbe80": "senderAdminAndSaleNotFinal()", +"e39d2a98": "nextCommonTTMTokenId2()", +"e39dcc21": "blah()", +"e39ebde9": "FOLIToken()", +"e39fa059": "queryRandomCallback(bytes32,string,bytes)", +"e39fbd88": "tokensDispensed()", +"e39fff72": "Divs()", +"e3a0a148": "giveOwnership(address)", +"e3a0de36": "admin(string,string,string,string)", +"e3a12480": "getBalance(uint8)", +"e3a135b9": "_bid(uint256,uint256,uint256,uint256,address)", +"e3a199d6": "testThrowCreateNewRevisionNotUpdatable()", +"e3a2a327": "SmartCityCrowdsale(address,address,address,uint256)", +"e3a37ea2": "newIndex(bytes32)", +"e3a47b00": "standing()", +"e3a531a3": "setSaleAuctionContractAddress(address)", +"e3a5f6f8": "_receiveToken(address,address,uint256)", +"e3a70ec1": "max_goal_amount()", +"e3a71e32": "deliverBonusTokens(address[])", +"e3a75485": "TORUE()", +"e3a797f1": "getCandidateMemberInfo(uint256)", +"e3a79840": "finishPresale(uint256,uint256)", +"e3a7f45a": "ecrecoverWrapper(bytes32,uint8,bytes32,bytes32)", +"e3a83290": "SALE_address()", +"e3a861a4": "setCrydrView(address,string)", +"e3a87f8b": "secondPrivateReleaseTime()", +"e3a8b13a": "core(uint256,uint256,address,uint256,string,uint256)", +"e3a8b345": "emptyContract()", +"e3a8e29c": "addBorrower(address)", +"e3a8e50b": "Subscription(bytes,address,bytes)", +"e3a94e9f": "addPacksToStandardSale(uint32[])", +"e3a96cbd": "getDispute(uint256)", +"e3a9744b": "mintTokens(int256,uint256,address,bool)", +"e3a97893": "secondPresaleEnd()", +"e3a99d2b": "updata(uint256,uint256)", +"e3a9b508": "EnableDisableTokenProxy()", +"e3a9db1a": "depositsOf(address)", +"e3aa018e": "setRank(address,uint256)", +"e3aa3c6e": "initialBonuslistTokens()", +"e3aa3fbb": "startEscrow(string,uint256,uint64)", +"e3aa62b1": "responsavel()", +"e3aae11b": "isStartGame()", +"e3ab8492": "requestGWAPrice(string)", +"e3abeaf3": "setAllowedTransferTo(address,bool)", +"e3ac3880": "backupfarmItems(address[],uint256[])", +"e3ac5d26": "prize()", +"e3ac8e16": "setFinalizationTime(uint256)", +"e3acc49a": "catIndexToPriceException(uint256)", +"e3adf4ea": "ChangeICOEnd(uint256)", +"e3ae1667": "commRate()", +"e3ae85f0": "winReward()", +"e3aec30c": "ballotStarted()", +"e3aeedc4": "lastMintedTokens()", +"e3aef2bd": "checkUnlockedTokensData()", +"e3af2ed9": "TWToken()", +"e3b0073e": "getVoteCounter(uint256,uint256)", +"e3b08f56": "concatYearMonth(uint16,uint8)", +"e3b09a85": "HungrCoin()", +"e3b10447": "GITToken()", +"e3b2594f": "fundingCap()", +"e3b26a8c": "SocialNetwork()", +"e3b3847c": "SubmitProofOfOwnership(bytes32)", +"e3b3932a": "bookKeeper()", +"e3b45ab7": "MIN_TOKEN_AMOUNT()", +"e3b460c9": "hookOperator()", +"e3b49a03": "rollSystem(uint256)", +"e3b55276": "AdminBuyForSomeone(uint16,address)", +"e3b5a153": "lastEpochTX()", +"e3b6040e": "amountSlicesCount()", +"e3b61135": "reinvestProfit()", +"e3b62158": "TokenVault(address)", +"e3b71ded": "setMaxContributionCrowdsaleAddress(address)", +"e3b7b668": "_setMaxDailyPerUser(uint256)", +"e3ba3398": "importTokens(address)", +"e3ba80d0": "purchaseImpl(uint16,uint64,address)", +"e3bab7ce": "buildInternalSalt(uint128,address,address,address,uint256,uint64)", +"e3bb01ac": "viewCancelledList(address)", +"e3bb3445": "releaseSupply(uint256,uint256)", +"e3bbab85": "test_smallDeviationPermitted()", +"e3bbb4f1": "MAX_GAS_PRICE()", +"e3bc2bb5": "newPassword(string,uint256)", +"e3bd9638": "getContract(address,address,uint256)", +"e3bea282": "callnotchecked()", +"e3bfdcfe": "pollBurnInc()", +"e3c04c32": "getNota(uint256)", +"e3c08adf": "getPlayerLAff(uint256)", +"e3c10714": "setMinContrib(uint256)", +"e3c2e4b9": "_setCreatedBlockOnCommitsPhase(uint256,address,bool)", +"e3c33a9b": "hasRole(string)", +"e3c3b200": "proposeWithFeeRecipient(address,address,bytes)", +"e3c3ec92": "BONUS_REWARD()", +"e3c3f180": "_setPurchasePremiumRate(uint128)", +"e3c4b1ae": "minSumICOStage2USD()", +"e3c517a9": "lockFlag()", +"e3c5862b": "setCAO(uint256,uint256,uint256,uint256,uint256,uint256)", +"e3c5a852": "buyTickets(uint256[],uint256,uint256)", +"e3c5d11a": "MIN_BUY_TOKENS()", +"e3c6e66d": "discountedIcoStartBlock()", +"e3c73d32": "minimumPriceCount()", +"e3c79a20": "enterOnBehalfOf(uint256[],uint256,address)", +"e3c82106": "becomeDuke(string,string)", +"e3ca12c6": "sendtoB(uint256)", +"e3cafbb0": "TOKEN_EARLYSUPPORTERS()", +"e3cb0cf0": "maxTransferPerTimeframe()", +"e3cb49f9": "setBlockingState(address,uint256,uint256)", +"e3cb8563": "playToken()", +"e3cbe744": "updatePlayersCoinByOut(address)", +"e3cc3570": "mintMigrationTokens(int256,address,uint256)", +"e3cc65e2": "getInvestorsLength()", +"e3cc83cf": "withdrawWhenFinished(address)", +"e3ccb809": "voteOnProposal(bool)", +"e3cd30f6": "getBuilding(uint8[176],uint8,uint8)", +"e3cd7c03": "getPass(address)", +"e3ce9714": "proxyWithdraw(address,uint256,uint8,bytes32,bytes32)", +"e3ceb06d": "YesNo(bytes32,address,string,address,uint256)", +"e3cee57b": "calLast5RoundProfitForRead(uint256)", +"e3cf1ad3": "changeRegistrationStatus(address,uint256)", +"e3cf6644": "sendKmPards()", +"e3cfef60": "timeRemaining()", +"e3cff634": "test(uint32)", +"e3d021d5": "purchaseTicket(uint16[])", +"e3d0252b": "defaultTriggerTime()", +"e3d0799c": "PLATFORM_FEE_PER_10000()", +"e3d0be5c": "EARLY_INV_BONUS()", +"e3d1072c": "Giveafuck()", +"e3d13592": "newTechSupport()", +"e3d1afd4": "TestToken(uint256,string,string,address)", +"e3d1e6d6": "hasProof(bytes32)", +"e3d2a98c": "setCurrentFundingGoal(uint256)", +"e3d2c1bf": "presaleTokensPerDollar()", +"e3d33fc9": "transferCount()", +"e3d36a98": "Credit(address)", +"e3d3f4cd": "bidGift(uint256,address)", +"e3d4187f": "Buy(address,uint256)", +"e3d51a0f": "repayBorrowInternal(uint256)", +"e3d5d88b": "getServerBuildingName(uint256,uint8,uint8)", +"e3d5e6a3": "year2Unlock()", +"e3d670d7": "balance(address)", +"e3d6ce2b": "addFiatTransaction(string,int256)", +"e3d6e4a3": "setFundsCreditBitContract(address)", +"e3d74457": "releaseTimeFirst()", +"e3d7f159": "FIRST_TIER_DISCOUNT()", +"e3d86998": "declareNewerVersion()", +"e3d91ebf": "bonusPoolsOf(address)", +"e3d9e8ea": "drawnArbiter(address,uint256)", +"e3da41b5": "sortWinningNumbers(uint8[5])", +"e3da5399": "left90(uint256)", +"e3da9f8f": "tranchesOf(address)", +"e3dac959": "makeTapTop()", +"e3db17b8": "updateContract(address)", +"e3db6670": "isHardCapTokensReached()", +"e3dbaff1": "tokensSpent()", +"e3dbda67": "setArtistsControlAddress(uint256,address,address)", +"e3dcd2c8": "maxPaymentInEther()", +"e3dd164e": "setNewTokenImporter(address)", +"e3de18b2": "withdrawMyClosedDeposits()", +"e3dea4b7": "setMcrAmountForGas(uint256)", +"e3debbbe": "getSubscriptionServiceID(bytes32)", +"e3e06c45": "PayPayCoin()", +"e3e10762": "calculateIdeaBuySimple(uint256)", +"e3e1dcb3": "getRouteNameByIndex(uint256)", +"e3e2342f": "callTokenHolderTribunal(string)", +"e3e28bab": "setTimes(uint256[],uint256[])", +"e3e2b1ba": "add_number(uint256)", +"e3e4001b": "buyWithReward(address)", +"e3e42b0c": "ZenAD()", +"e3e4a1b4": "burnUserTokens(uint256)", +"e3e4b9fb": "claimJob(uint256)", +"e3e5075c": "depositBattleValue(address)", +"e3e532a2": "setInstantToken(address)", +"e3e5439c": "specDWallet()", +"e3e54ac2": "CarDeregistrationFaled(uint256)", +"e3e5c9c1": "WhiteListBonusTokensEmitted(address,uint256)", +"e3e7399e": "addWinner(address,bytes4,uint256)", +"e3e7519c": "getTokenPriceforDapp()", +"e3e77055": "MultipleTokenVesting(uint256,uint256,uint256,address,uint256)", +"e3e7903f": "updateScore(address)", +"e3e7b439": "cryptoWillToken()", +"e3e7c665": "makeMoney()", +"e3e7d4f4": "leaderboardEntries(uint256)", +"e3e88734": "SigUser(address)", +"e3e9800d": "_cancelSellOfferInternal(uint32,bool)", +"e3e98cad": "COSSToken()", +"e3e9bc3f": "becomeSponsor()", +"e3e9cb4c": "Birth(address,uint256)", +"e3ea6496": "newCarProductID()", +"e3ea67d4": "STARTING_TURTLES()", +"e3eba060": "allowedToSpend(address,address)", +"e3ec0251": "subtraction()", +"e3ec0666": "clearJackpotParticipants()", +"e3ec5046": "DECIMALCOUNT()", +"e3ec7584": "showTokensUnfreezeDate(address)", +"e3ecbd7e": "isEditionEnabled(uint256)", +"e3ed14db": "getDiamond(uint256)", +"e3ed48a4": "getTokenScope(uint256)", +"e3edbfd3": "getAmountDue(address)", +"e3f037d8": "FlightDelayUnderwrite(address)", +"e3f0920a": "coinMaster()", +"e3f0b761": "walletF()", +"e3f0dd48": "getMult(bytes32,bytes32,uint256)", +"e3f10188": "updateFlagCount(address,address,uint256)", +"e3f16a61": "GRPlaceholder(address,address)", +"e3f25f01": "_delegateforward(address)", +"e3f2e4a4": "ante()", +"e3f310c7": "priceToSpend(uint256)", +"e3f38dd6": "GetSignVersion(string,address,uint256)", +"e3f4937f": "outOverRoundId()", +"e3f4ffdc": "GeezerToken()", +"e3f5009f": "payWithMileagePoint(uint256)", +"e3f508f5": "setLeaf(uint256,uint256)", +"e3f52c99": "warrior()", +"e3f563f6": "generateCompoundTerms(uint256)", +"e3f596a4": "ownerPrice()", +"e3f61948": "getStartIndex(uint64)", +"e3f688d3": "ThingschainToken(address)", +"e3f6b544": "member()", +"e3f7faaf": "calculatePrice(uint256,uint16)", +"e3f954be": "buyICOTokens()", +"e3f96400": "getTotalOwnerAccounts()", +"e3f9ba0e": "returnEth()", +"e3f9cd17": "lockTokenForExchange(address)", +"e3fa5882": "tryWithdraw(uint256)", +"e3fc03a8": "Guess(address,uint256,int256,int256,uint256)", +"e3fc43b2": "ended(bool)", +"e3fcbac1": "getSharesPercentage(address)", +"e3fcf122": "_sctc(uint256,uint256,uint256,uint256,address)", +"e3fe0317": "_setAllocationFee(bytes32,uint256)", +"e3fe48a1": "loadWhiteList(address[],bytes32[])", +"e3fe6a9e": "sehrRaised()", +"e3fe9740": "icoThresholdReached()", +"e3ff2f05": "weiExchangeRate()", +"e3ff9ac2": "MACHToken()", +"e3ffc9a3": "sendEtherToOwner()", +"e3ffcb84": "loserOf(uint256,uint256)", +"e3ffefe3": "ZeroReturnProfit()", +"e4002b30": "commitEuro()", +"e4007949": "buyRegistration()", +"e4019e07": "BOB()", +"e40205d6": "roundEndTime()", +"e4020804": "isHealthy()", +"e4024194": "returnedData()", +"e4027126": "mSumRawSpeed()", +"e40418a0": "trustedContractAddr()", +"e4043b37": "updateProduct(uint256,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"e4048049": "createBool(bytes32,bool)", +"e4062df5": "SkychainToken()", +"e4063140": "getAllActivity(uint256)", +"e40652e3": "creatUserPurchase(address,string)", +"e4065c4c": "Alias()", +"e406bb4b": "minedTokenCount()", +"e407ccb9": "Repayment(uint256)", +"e40819af": "lastTokenCreated()", +"e4083daf": "create_game_invite(bytes32,address,uint32,uint32,uint8,uint16,uint8,address,uint256)", +"e408de80": "buyInWithAllBalanced()", +"e40906ed": "getBorrowBasicInfo(uint256)", +"e4098655": "getCallCalledAtBlock(bytes32)", +"e409edf1": "chooseWinnerDeadline()", +"e40a72d4": "_internalToken()", +"e40a7545": "collectBuyFee(uint256,address)", +"e40a955c": "grantTeamTokens(address)", +"e40b4523": "activateVault(address,uint256,uint256,uint256,uint256)", +"e40c231e": "StoneToken()", +"e40cc359": "getListParamsUnOrdered(uint256)", +"e40d3692": "contributedAmountOf(address)", +"e40d835e": "getPositionIdFromNonce(uint256)", +"e40d8fc3": "addICOEndDate(uint256)", +"e40dd35b": "isGameApproved(address)", +"e40e56d3": "regular_coins()", +"e40e8457": "requestBurnerContract()", +"e4105ed5": "setToken(uint8,address)", +"e4109df8": "MAGTOKEN()", +"e410a0c6": "setup(address,uint16)", +"e4115a8c": "ApcrdaZebichain()", +"e4120220": "getTokenTrust(address)", +"e412828a": "Shark()", +"e412c526": "set_pre_kyc_bonus_numerator(address,uint256)", +"e415f4ee": "_addDai(uint256,address)", +"e4160e48": "admin_active_withdrawable()", +"e4165e15": "ownerDeactivateToken()", +"e416d173": "PreICO(uint256,uint256,address,address,uint256)", +"e416f6b4": "_startRound()", +"e416faa0": "getBetNum()", +"e4171746": "major_partner_address()", +"e417291b": "undelegateDAOTokens(uint256)", +"e41763f2": "setTokenFeeDeposit(address,uint256)", +"e41765de": "addBotAddress(address)", +"e417c38c": "Reward(address,uint256,uint256,uint256)", +"e417c62c": "ProofFund(address)", +"e4187d02": "multiplyDecimal(uint256,uint256)", +"e418f592": "receiveToken(address,uint256,bytes)", +"e419f189": "multiAccessIsOwner(address)", +"e41adb25": "PoolPreICO()", +"e41b1d28": "noAccountedWithdraw()", +"e41c02c9": "determineFirstPeriodOutcome(uint256)", +"e41cc093": "getItemStore(bytes12)", +"e41d0944": "acceptDonate()", +"e41d65e0": "payWinnerManually()", +"e41eaa41": "fakeNow()", +"e41ee46a": "MAX_QUANTITY()", +"e41f7dc1": "ethPriceProvider()", +"e41fb842": "comunityMintedTokens()", +"e420264a": "g(uint256)", +"e420a904": "FirstToken()", +"e420dcc5": "tokenDrian()", +"e4218416": "redemptionPayouts(uint256)", +"e422d6b8": "createRareCard(uint256,uint256,uint256)", +"e422ebe9": "getBot()", +"e422f311": "secondWeekEndTime()", +"e422f699": "toBE(uint256)", +"e4232069": "MAX_INPUT_USERS_COUNT()", +"e4246ad2": "canContractExchange(address)", +"e4246ba0": "setPaymentContract(uint8,address)", +"e424ddbd": "allocateFoundersTokens(uint256)", +"e4251361": "getTodayInvestment()", +"e4254585": "MFNToken()", +"e4274453": "PUBLIC_CROWDSALE_SOFT_CAP()", +"e4277f78": "backToOldOwner()", +"e427a197": "previousMinters(address)", +"e428ad8a": "ReferralReward(uint256)", +"e428fd5f": "takeBackMoney()", +"e42996d1": "redeemCoinsToICO(uint256)", +"e429bd8b": "getUsableAmount(address,address)", +"e429cef1": "addAuditor(address)", +"e42a4556": "KKTokenNew()", +"e42a8bc9": "dAddBallot(bytes32,uint256,uint256)", +"e42a9156": "AppleproToken()", +"e42a96e7": "escrowContract()", +"e42b0193": "test_insert_findWithHintNextIncreased(int256)", +"e42bb93f": "StarUniteChain(uint256,string,uint8,string)", +"e42bff66": "mintBadge(address,uint256)", +"e42c04f4": "Cryptshopper()", +"e42c08f2": "tokenBalanceOf(address)", +"e42c1337": "getSalary(string)", +"e42c1b76": "BountyActivated(uint256,address)", +"e42cb9f3": "statement()", +"e42d5be0": "getPaymentOf(address)", +"e42d674d": "refundIco()", +"e42d6efa": "unregisterUsers(address[])", +"e42d70ba": "safeAddCheck(uint256,uint256)", +"e42def21": "CryptoHill()", +"e42f4cc0": "addPersonalInfo(address,string,string,string,string,string,string,string)", +"e4309307": "fortifyClaims(uint16[],uint256,bool)", +"e430bb5b": "getFreeCoins()", +"e4310205": "addMastercardUser(address)", +"e431af36": "_addMember(address,uint256)", +"e431d241": "validateAndRegisterClaim(address,bytes32,uint8,bytes32,bytes32)", +"e4322464": "MatchBettingFactory(address)", +"e43252d7": "addToWhitelist(address)", +"e432f0e5": "queryOracle(string)", +"e4330545": "dump()", +"e433bb3a": "HAVY()", +"e4340e6a": "Wallet5()", +"e435f2c9": "takeOwnershipMultiple(uint256[])", +"e4360fc8": "getFileListElement(bytes)", +"e43650b6": "changeILFManager(address,bytes32)", +"e436a3f7": "getRoot2_16(uint256)", +"e436bdf3": "Draws(uint256)", +"e4372d0f": "setRestrictedAcct(address,uint256)", +"e437d1a7": "unRedeem(uint256)", +"e437d815": "getDsitributeMulti(address[],uint256[])", +"e438ff55": "changeINAWallet(address)", +"e43926fb": "refundTokenToCustomer(address,uint256)", +"e439501e": "AntmineToken()", +"e4397db1": "getBetsState()", +"e43a0bb2": "pullFunds()", +"e43a8897": "DonatedBanner()", +"e43aa5ff": "Medban()", +"e43ac447": "DirectConnectionFactory()", +"e43ae642": "deleteDIDHolderWhenBalanceZero(address)", +"e43b72b4": "discountedInvestors(address)", +"e43ba0bd": "isStrategy(bytes15)", +"e43bb0f6": "link(uint256,address,address)", +"e43bc1e9": "functionName3(bytes32)", +"e43c74a4": "BRoyalCoin()", +"e43cd900": "PoolBounty()", +"e43d68ce": "GetBanker(uint8)", +"e43dfebf": "burningTokens()", +"e43f696e": "setWhiteList(address[],bool)", +"e43f8424": "burnGoldTokens(address,uint256)", +"e4403507": "tokenContractBalance()", +"e4415d98": "investorDividends(address,address)", +"e44171b1": "Arina_amount_judgment(uint8,uint256)", +"e4424c9e": "createNew(bytes32,address)", +"e443253a": "DataFromSetting(uint8)", +"e443348e": "ONE_TOKEN()", +"e4440a86": "marketWallet()", +"e4444feb": "removeAllowedAddress(address,address)", +"e444504c": "nextClaim()", +"e44451ba": "removeAddressFromAdminlist(address)", +"e444a2e1": "_birthPerson(string,string,uint64,bool,bool)", +"e44501c4": "inactive_dividend(address)", +"e4454fdc": "GetMaxStageEthAmount()", +"e44591f0": "isNonFungible(uint256)", +"e4480dd8": "withdrawl(uint256)", +"e448ee26": "joinChallenge(uint256)", +"e4492fcd": "TokensPerETH()", +"e4495b15": "confirmSetIssuer()", +"e449c52a": "getStr(string)", +"e449de9f": "prevContract()", +"e44a94d3": "minContributionPresale()", +"e44ac1e4": "addLock(address[])", +"e44b974f": "placeBet(uint8,uint256,uint256,uint8,bytes32,bytes32)", +"e44bc43f": "stepOneRate()", +"e44c333a": "DreamTeam()", +"e44c96c9": "addInitialOwners(address[])", +"e44caea6": "balances3(uint256)", +"e44d3084": "testFailure()", +"e44d311b": "ticketPrices(uint256)", +"e44d6f04": "beatTeamWallet()", +"e44dbb75": "addAddressListItem(uint256,address)", +"e44ddaf5": "healthAndMana(uint256)", +"e44de421": "buyTokenFrom(address,address,uint256)", +"e44f777c": "returnETHforUnqualifiedBuyers(uint256,uint256)", +"e450056c": "tokenPartition(uint256)", +"e4503da4": "startPhaseMaximumcontribution()", +"e4504f62": "dogCore()", +"e451197a": "OrdoCoin()", +"e451ecfa": "swapTokenValueForCredits(address,address,uint256,address,string,uint256,uint8,address)", +"e45285cf": "setAIRDROPBounce(uint256)", +"e4536316": "removeARA(address)", +"e4536b84": "BalanceReader()", +"e453877e": "_approveTransfer(uint256)", +"e4538c6c": "addUndergraduateTo(address,string,string,string,uint8,uint8,uint8,uint8,uint8,uint8,uint32,uint32)", +"e454158c": "futureSaleAllocation()", +"e4543410": "setIncrementPercentage(uint256)", +"e4547443": "releaseTimeLock(address,uint256)", +"e4547f98": "documentExists(bytes)", +"e45499c1": "updatePriceOfToken(uint256)", +"e4556549": "get_session_balance(address,uint32,uint32)", +"e4556f2d": "MaturityPrice(uint256,uint32,bool,bool,bool)", +"e455d26c": "getCurrentNeedsCount()", +"e455fce7": "extractOversightAddressesIndexLength()", +"e4560388": "endTimeMain()", +"e45648ac": "exchangeOldVersion()", +"e4564a4a": "returnAddressBonuses()", +"e4569c4e": "eeeeeeeeeeee()", +"e4578590": "SplitPaymentMock(address[],uint256[])", +"e457deda": "FindSlug()", +"e457e1e5": "charge(uint256)", +"e458c754": "whitelists(uint8,address)", +"e45a4fb4": "isMultipleOf(uint256,uint256)", +"e45a93cc": "GIT()", +"e45aa608": "tokensForfortis()", +"e45ab391": "Technology5G(address)", +"e45b1d1b": "openClosedToken()", +"e45b7388": "subscribers_TO_HATCH_1CraigGrant()", +"e45b8134": "transfersFrozen()", +"e45bc0ae": "dollcoin()", +"e45be8eb": "minPrice()", +"e45bf7a6": "forwardTo()", +"e45c1879": "getAuctionsCount()", +"e45c210c": "LogFunderInitialized(address,string,uint256)", +"e45c47b9": "SetPermissionsList(address,address,uint8)", +"e45ce7e3": "refillTxFeeMinimum()", +"e45ceec1": "getUnreadMessages(address)", +"e45d0550": "getAddressArray(address,string,string)", +"e45d4717": "withdrawLogic(bytes32,uint256,uint256,uint256[])", +"e45da0be": "freezeAddress()", +"e45dbabd": "addAddressesToWhitelist(uint256,address[])", +"e45ebe93": "checkVoteStatus()", +"e45ef4ad": "bobClaimsPayment(bytes32,uint256,address,address,bytes20)", +"e45fc71f": "getPeriodCycle(uint256)", +"e460382c": "importBalanceBatch(address[])", +"e4614066": "MelonToken(address,address,uint256,uint256)", +"e46164c5": "waitingForPayout()", +"e4626c8f": "like(address,uint256)", +"e462c888": "createEscrowByBuyer(address,uint256)", +"e463b659": "EtownCoinTest(uint256,string,uint8,string)", +"e463fa6b": "AddWhitelist(address)", +"e464dcc8": "userHasLuckyStone(address)", +"e4651465": "addEthTeller(address,uint256)", +"e46523f2": "_isNeighbor(uint8,uint8)", +"e46537ba": "JJCOIN()", +"e465c465": "like(address)", +"e46617b6": "releaseMultiAccounts(address[],address)", +"e4662939": "CLBToken()", +"e46638e6": "canTransfer(address,address,uint256)", +"e46694e8": "lastStakePriceUSCents()", +"e46751e3": "exp(int256)", +"e467f7e0": "mint(address[],uint256[])", +"e4682f00": "cancelSpendLimit(uint256)", +"e4683a79": "refund(bytes32,bytes32)", +"e4684d8f": "AXNETToken()", +"e468688e": "addTotalSupply(uint256)", +"e46871f1": "governingLaw()", +"e468cb72": "FUTM()", +"e468dc16": "Testokenmaking()", +"e4690a0b": "popRequest()", +"e469185a": "updateReserveRatio(uint8)", +"e4693e98": "endFundingTime()", +"e4698ee7": "start5Phase2020()", +"e46a5c21": "getArmyBattles(uint256)", +"e46c2cc4": "bytarr28(bytes28[])", +"e46d1939": "napoleonXAdministrator()", +"e46d6cb1": "canChangeRecoveryAddress(uint256)", +"e46da1b9": "MeiJiuToken(uint256,string,uint8,string)", +"e46dcfeb": "initWallet(address[],uint256,uint256)", +"e46dea92": "BlockChainPay()", +"e46f20dc": "getTransferHash(address,uint256,address,address,uint256,uint256)", +"e46f9ecf": "enableCodeExport()", +"e46fbe76": "burnSomeEther()", +"e46feb2c": "orgy1f(string,string)", +"e4706e3a": "TokenRateChange(uint256)", +"e470ddf8": "totalKittiesBurned()", +"e47112bd": "sendTokens()", +"e471a5b9": "putIntoPackage(uint256,uint256,address)", +"e471d770": "StopTheFakesPromo()", +"e472311b": "handleHTLCUpdateTx(address,bytes32,bytes32)", +"e4723828": "TestMath()", +"e4725ba1": "accept(bytes32)", +"e4745970": "transfer(uint256,address,string)", +"e474777e": "applyForCertification(string,string,bool,string,address,string,string)", +"e474f97a": "setPreicoAddress(address,uint256)", +"e4752159": "DigitusToken()", +"e475222e": "activeGames()", +"e476137b": "windUp()", +"e476af5c": "revokeAttributeSigned(address,uint8,bytes32,bytes32,bytes32,bytes)", +"e476cb86": "_mintTokens(address,uint256)", +"e4772ae3": "getDailyCount(address)", +"e4779d73": "register_user(address)", +"e4788384": "CancelAuction(address,uint256,uint256,uint256,uint64,uint256,address)", +"e478b578": "ProofofConcept()", +"e47a192e": "FactomIssued()", +"e47a6a9f": "disbursementPeriod()", +"e47bc32b": "ShanHuCoin()", +"e47c0c20": "GetCityData(address)", +"e47c5902": "ecverify(bytes32,bytes)", +"e47c66ca": "removePanelist(address,address)", +"e47ca4eb": "LogNewAnswer(bytes32,bytes32,bytes32,address,uint256,uint256,bool)", +"e47cb18f": "PointToken(uint256,string,string,uint256)", +"e47d8085": "isCurrentUser(address)", +"e47d914a": "fechVoteInfoForVoter()", +"e47da59e": "consumeTicket(address,string,uint256)", +"e47dace5": "totalLenderBalance()", +"e47dea1d": "setWithdraw(address)", +"e47e1c0b": "getAssetIds()", +"e47e7e66": "ask(uint256)", +"e47ea649": "isICOfinalized()", +"e47f0d64": "list_products()", +"e47f18d0": "CryptoTorchToken()", +"e47ffb64": "setSoft_Cap(uint256)", +"e480ba6a": "isDailySettlementOnGoing()", +"e4818a5d": "totalUnreleasedTokens()", +"e4818e4b": "secondPeriod()", +"e481c884": "ACFWallet()", +"e481ebf0": "getOwnedActiveEntry(uint256)", +"e48225ce": "startStakingAt(uint256)", +"e4828367": "buyEther(uint256)", +"e48341db": "getUpdateCount(bytes32)", +"e4845c2f": "Sperm()", +"e4849b32": "sell(uint256)", +"e4852b9b": "transferAccount(address)", +"e4860339": "tokens(address)", +"e486387a": "ReferenceToken(string,string,uint256)", +"e486869b": "setstoredaddress(address,address)", +"e487624b": "EarnedGNS(address,uint256)", +"e487c88b": "CROWDSALE_UNVERIFIED_USER_CAP()", +"e487e87b": "activateICOStatus()", +"e487eb58": "getOwner(bytes20)", +"e487fdb6": "participant1SentTokensCount()", +"e4881813": "cat()", +"e489c5ff": "haltIco()", +"e489d510": "MAX_TOKEN_SUPPLY()", +"e489fc68": "NdexSupply()", +"e48a1d60": "assertPaymentIndexInRange(uint256)", +"e48a4a29": "mayjaKill()", +"e48c09fe": "getFiltersLength()", +"e48c3c5c": "lockInDays()", +"e48cf65f": "_setClassViewValue2(uint256)", +"e48d81a8": "multisigwallet()", +"e48db5d4": "ProofVote(address)", +"e48e0d69": "ownerRetrieveTokenDetails()", +"e48e603f": "right54(uint256)", +"e49013b3": "jigoutuihuan(address,uint256)", +"e490c513": "getEntityState(bytes32)", +"e49168f3": "whichEpoch(uint256)", +"e4917fd2": "provenAddresseList(address[],bool)", +"e491936f": "getDisputeTX(uint256)", +"e49280cb": "close(address,uint256)", +"e492814f": "play(address)", +"e4928550": "daylimit()", +"e4929aa4": "FCC(address)", +"e4932abe": "INC()", +"e493ef8c": "Q()", +"e4942930": "SetMinLot(uint256)", +"e4952ddb": "transferDataOwnership(address)", +"e495f08e": "getHouseInfo(bytes32)", +"e495faf4": "bonusesPayed()", +"e496f510": "oraclize_query(uint256,string,bytes[3],uint256)", +"e497718e": "receiveLoan(address)", +"e497e88e": "XDCE()", +"e4983e27": "HEOContract()", +"e498922f": "getExp(uint256)", +"e498b98f": "setRedeemRequestLimit(uint256)", +"e498f5de": "FrozenFunds(address,bool,uint256)", +"e4995a1d": "ProdTokensale()", +"e4997dc5": "removeBlackList(address)", +"e4998173": "blockHalving(uint256)", +"e499f542": "distribute_reward(uint256,uint256)", +"e49b4c64": "ownerModAdmin(address,bool)", +"e49b606c": "claimWinnings(bytes32)", +"e49c9529": "underwrite(uint256,uint256[6],bytes)", +"e49cb2fb": "withdrawERC20Tokens(address,uint256)", +"e49cc6a9": "getUserBalancesLastBet()", +"e49dcee9": "fixTokens()", +"e49f6e91": "editContact(address,string)", +"e49fdaa8": "setClaimLimit(address,address,uint256)", +"e4a008a0": "cancelEthOffer()", +"e4a05c1f": "_nibblesToTraverse(bytes,bytes,uint256)", +"e4a0c124": "QCSTToken()", +"e4a0d386": "ethToBeClaimed()", +"e4a13fa4": "getICOAddress(uint8)", +"e4a1d868": "deposit_token(address,uint256)", +"e4a27ba0": "_play()", +"e4a2a8af": "getOwnerClientDetails()", +"e4a2ac62": "getCompactData(address)", +"e4a2c6d6": "loadProfit()", +"e4a30116": "initialize(uint256,uint256)", +"e4a30200": "BRV(uint256,string,string)", +"e4a358d7": "getPrefix(uint32)", +"e4a36a77": "getBondRemainingToBePaidOut()", +"e4a41c7f": "becomeFriendsWithMe()", +"e4a46a99": "howManyEthersToBecomeOwner()", +"e4a682d8": "InvestorToken()", +"e4a6e85a": "CoinStorage()", +"e4a72b13": "bZxContractAddress()", +"e4a77d29": "setInitialVaribles(uint256,uint256,uint256,address,address,address)", +"e4a7f363": "NewSymbol(string,uint8)", +"e4a86349": "getSubscribersCount()", +"e4a8de44": "quater1()", +"e4a9b286": "getVestingDuration(address,address)", +"e4aa0741": "AmericoTokenToken()", +"e4aa2436": "SouthAfricanRandsToken()", +"e4aa533e": "guess(bytes32)", +"e4aa6c5c": "MHCBC()", +"e4aa8140": "MAX_WEI()", +"e4aa82d7": "test_addAndGetVersion()", +"e4aa8da9": "checkReceiptProof(bytes,uint256,bytes,bytes)", +"e4abae32": "respond(uint256,address,address,bool,bool)", +"e4abf00e": "UnFrozenAddress(address)", +"e4ac3206": "withdrawIQT(uint256)", +"e4acecf3": "SALE0_END()", +"e4ad9a18": "takeTokens(address,uint256)", +"e4ada9fa": "setFeeForFirstArtWorkChangeRequest(uint256)", +"e4adc325": "UBS()", +"e4adc4f0": "ownerTransferWeiThirdWallet(uint256)", +"e4ae2e88": "enableEdition(uint256)", +"e4ae7d77": "getResolver(string)", +"e4af29fc": "accountCount()", +"e4af5f30": "getMinMaxBet()", +"e4af8331": "func_02E5()", +"e4b0a97b": "test_doubleVotingAgainst()", +"e4b0d3e6": "preRelayedCall(address,address,bytes,uint256)", +"e4b1443b": "KIK_ADDRESS()", +"e4b19e98": "amountRefunded()", +"e4b1e977": "hadd(uint128,uint128)", +"e4b1f93a": "isValidPurchase(uint256,uint256)", +"e4b1fe54": "totalGas()", +"e4b203ef": "sealed()", +"e4b34274": "round4StartTime()", +"e4b3c517": "crowdsaleContinue()", +"e4b42498": "AfrFballCoinXToken()", +"e4b503ec": "MinAmountByBetChanged(uint256)", +"e4b50cb8": "getToken(uint256)", +"e4b50ee8": "setRaiseRatio(uint256)", +"e4b541f3": "currentDevFees()", +"e4b5553c": "AddPromoter(address)", +"e4b5762a": "setPriceFeed(uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"e4b5ddeb": "addInvestorAtID(uint8)", +"e4b5e557": "CPWAToken()", +"e4b64da9": "sellOrders(address)", +"e4b6ac4c": "bonus2StartETH()", +"e4b6f799": "withdrawDai()", +"e4b6fbe2": "getApproveSpenderValue()", +"e4b73ac9": "foundersWallet3()", +"e4b74590": "distance(uint256,uint256,uint256)", +"e4b7b1b0": "Payroll(address,address)", +"e4b7fb73": "getRemainingSupply()", +"e4b8ebb7": "powercoin()", +"e4b90ed2": "reclaimInternal(address)", +"e4ba3969": "supportRecord(uint256)", +"e4bb7160": "adjustInflationRate()", +"e4bbb4b0": "POLY()", +"e4bc01b4": "FooMintableToken()", +"e4bd6695": "create(string,string,uint8,address,uint256)", +"e4bd9ebd": "calcId(uint256)", +"e4bdaa61": "buy(uint16,address)", +"e4be5159": "queryChild()", +"e4be782a": "createSecurityToken(string,string,uint256,uint8,address,uint256,address,uint256,uint8,uint256,uint8)", +"e4bf56b8": "getPastGamesLength()", +"e4bf6195": "changeGroupInfo(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"e4bff515": "_pointToResolverAndResolve(int256,bytes32,address)", +"e4c01bbb": "LogSetSymbol(string)", +"e4c05a7d": "checkEngineerQuest(address)", +"e4c0aaf4": "changeGovernor(address)", +"e4c14a34": "Tx(address,address,uint256,string)", +"e4c19408": "startPreIco(uint256,uint256)", +"e4c21cf2": "CheckSoftCap()", +"e4c28308": "buyPortfolio(address,uint256,uint256)", +"e4c2db06": "getPreviousFile(bytes)", +"e4c487c9": "Betsicbo()", +"e4c53f04": "setCreationCurator(address)", +"e4c5ff46": "manualMint(address,uint256)", +"e4c60492": "RANGESTART_8()", +"e4c82881": "change_tokenReward(uint256)", +"e4c92731": "FAST()", +"e4ca784b": "isPoliceNode(address)", +"e4cb30ad": "getCharacter(address,uint256)", +"e4cc1161": "seedWithGasLimit(uint256)", +"e4cc18be": "finishMint()", +"e4cc98a5": "dividendPeriod()", +"e4cd7d96": "OX_ORG()", +"e4cdf3cc": "takeBack(uint256,uint256,bytes32,uint8,bytes32,bytes32)", +"e4ce25ac": "roundEthShares()", +"e4ce6ccf": "deed(bytes32)", +"e4cecd32": "cf_request(uint256,uint256)", +"e4cf77bb": "GoodBoyPoints(uint256,string,string)", +"e4cfcbf7": "setChainNext(address)", +"e4cfe9eb": "callerAllocationPeriod()", +"e4cff610": "process_merge_mint_ious(address)", +"e4d0f41d": "setAuthorized(address,address,bool)", +"e4d13625": "pauseActivity(uint16)", +"e4d1b2cc": "allocatedToken()", +"e4d2fecf": "isListening(address,address)", +"e4d433e8": "startDealForUser(bytes32,address,address,uint256,uint256,bool)", +"e4d534cb": "feewallet()", +"e4d5a558": "updateAndSafeTransferFrom(address,uint256,string,bytes)", +"e4d609cc": "addRequester(address)", +"e4d6d778": "getused(address)", +"e4d74f2e": "BCBcyCoin()", +"e4d75c9d": "setVestingAddress(address)", +"e4d76d3b": "ATN(uint256)", +"e4d7a3d4": "getAllClients()", +"e4d7c28c": "decision()", +"e4d8dead": "setChild(uint256,string)", +"e4d91372": "setlevel(address)", +"e4d9d212": "isPVPListener()", +"e4d9de94": "getInfo(uint8)", +"e4d9e130": "CrowdsaleToken()", +"e4da3860": "XfinityAsset()", +"e4db2230": "addCard(uint256,uint256,address)", +"e4db2ceb": "auth(string)", +"e4db4dc1": "CheckEligibility(address,string,string)", +"e4db6062": "GivethBridge(address,address,uint256,uint256,address,uint256)", +"e4db915e": "citadelBuy(uint256,address)", +"e4dbc385": "assertEq12(bytes12,bytes12)", +"e4dbf719": "FlightDelayLedger(address)", +"e4dc2aa4": "totalSupply(address)", +"e4dc3d8b": "raisedSale1USD()", +"e4dcb06b": "open(string)", +"e4dd7794": "fundingPaused()", +"e4de6ec6": "AyeshaCoin()", +"e4deb007": "setNextSaleAgent(address)", +"e4dec825": "setAllowContributionFlag(bool)", +"e4dedc7f": "DeleteContract()", +"e4df2531": "topBalance()", +"e4e075cc": "_getPlayerInfoByAddress(address)", +"e4e0bd1f": "PointPowerCoin()", +"e4e0c030": "makePayment(bytes32,uint8,bytes32,bytes32,uint256,uint8,uint256,bool)", +"e4e103dc": "rewardUser(address,uint256)", +"e4e1aae6": "BlockChainShopCoin()", +"e4e1bd53": "DisableTransfers(address)", +"e4e1f29b": "discountStep()", +"e4e1f6c5": "compare(address)", +"e4e1f7af": "mintTokensMultiple(uint256,int256,address[],uint256[])", +"e4e299f7": "zero_out(uint256)", +"e4e2bfe4": "canFinalize(uint256)", +"e4e2ca59": "supportsEIP20Interface(bytes4)", +"e4e2d2ae": "changeScore(uint256,uint256)", +"e4e3466a": "AIToken()", +"e4e4c8c0": "eMTV()", +"e4e57b9e": "sellTokens(address,uint256,uint256)", +"e4e609de": "LogBuyCoins(address,uint256,string)", +"e4e663a9": "getStatLotteries()", +"e4e6de18": "setPaoContactAddress(address)", +"e4e713e0": "DTCC_ILOW_6()", +"e4e76c16": "setCryptoSoulContract(address)", +"e4e790b8": "withdraw_GIC(uint256)", +"e4e80c49": "SpudToRotator(uint256)", +"e4e85963": "tokenRemainPreSale()", +"e4e985a8": "getKycProvider()", +"e4e9bcca": "setEthPriceProvider(address)", +"e4ea58a5": "withdrawInviteRewardToOrder()", +"e4eab468": "getWarrantyPrice(address,string,uint256,uint256,uint256)", +"e4eacd70": "curentBallotId()", +"e4eaee4c": "setBool(bool,bool)", +"e4eba2ef": "supplylimit()", +"e4ec3762": "onChain(address)", +"e4ec404c": "AG()", +"e4edf852": "transferManagement(address)", +"e4ee07b7": "UtlToken(address,address,address,address,address,address)", +"e4ef2cef": "link(address,string)", +"e4ef3eaa": "SetEvaluate(address,uint8,uint8)", +"e4f02750": "listGlobalAuditDocumentsFrom(bytes32,uint256,bool)", +"e4f06100": "adminSetDiv(uint256)", +"e4f20fb2": "mintPresale(address,uint256)", +"e4f2487a": "salePhase()", +"e4f26633": "betStage(uint256,uint256[])", +"e4f37374": "pixels(uint32)", +"e4f3f47f": "BuyCurrentTypeOfAsset(uint256)", +"e4f4c554": "AddressDefault()", +"e4f627fe": "keysCount()", +"e4f6973f": "BIPOOH_DAO_32()", +"e4f7a076": "set3RoundTime(uint256)", +"e4f7de93": "isIcoComplete()", +"e4f84173": "defValue()", +"e4f843f9": "deprecateTurretSubtype(uint8)", +"e4f896e8": "proclaimAllInactive()", +"e4f8b908": "_payout(address)", +"e4f8c6fb": "YettaCrowdSale()", +"e4f95226": "getLastInvestors()", +"e4fa8fc3": "hash_of(address)", +"e4fab06f": "delegatedFwd(address,bytes)", +"e4fae421": "ALLOC_ECOSYSTEM()", +"e4fc6b6d": "distribute()", +"e4fcf329": "setBonusRate(uint256)", +"e4fe8eb1": "getUserBigPromoBonus(address)", +"e4ff0f18": "rocketshipReachedDestination()", +"e4fffb3a": "updateMaxTokensToDistribute(uint256)", +"e50007b9": "TerminateEmployee(address,address,uint32,uint8)", +"e5002347": "setLimitMaxCrowdsale(uint256,string)", +"e5002a05": "whitelistAddress()", +"e5027880": "fortyEndTime()", +"e50278a6": "sellAllAmountPayEth(address,address,address,uint256)", +"e5033268": "endPreICOTimestamp()", +"e5033ee4": "maxBridgeHeight()", +"e503f70d": "newArticle(string,string,string)", +"e5042271": "setNick(string,string)", +"e5043632": "ElectronicHealthRecordToken(uint256,string,uint8,string)", +"e5045002": "setSecurityWalletAddr(address)", +"e504862b": "assertEq30(bytes30,bytes30)", +"e5065522": "updatePermissions(address,uint256)", +"e506b9b7": "joule()", +"e5071024": "setSemaphoreExternalNulllifier()", +"e5071b8e": "incrementCount()", +"e5075f4f": "ezpzToken()", +"e507d6dd": "getPlanActiveTime()", +"e507e7a4": "brandAccountsLength()", +"e508202d": "triggerLibraryEvent()", +"e5098e85": "eliminarEntidades(uint256)", +"e509b9a0": "initiateTransfer(string,string,uint256,uint256)", +"e509cac5": "_changeTokenAddress(address)", +"e50a32a9": "PriorityQueue()", +"e50a3bb1": "oraclize_query(string,string[],uint256)", +"e50ab759": "contractIndex(bytes32)", +"e50beffb": "voteStart(uint256)", +"e50d0473": "SetRank(uint8,address,uint16)", +"e50d2da1": "setSuperInvestor(address)", +"e50d8a8a": "deauthorizeMintRequester(address)", +"e50dce71": "testControllerApproveSetsAllowance()", +"e50dd26a": "contractTokenWithdraw(uint256,address)", +"e50dd478": "isFiscal()", +"e50e2f65": "EARLYADOPTERS()", +"e50ff8e9": "TestSportsG()", +"e5104307": "IsPlayer(address)", +"e5106ae9": "isValidNodalblockJson(string)", +"e51073f4": "withDrawInWei(uint256)", +"e510989a": "setNewDepositCommission(uint256)", +"e5113280": "RecipientStringUpdated(string)", +"e513575a": "getGblockWithOffsetFromCurrent(uint8)", +"e5135ae3": "CSZ_ERC20()", +"e515a4d1": "gen0Limit()", +"e515cd38": "deliver(address)", +"e516f4dd": "LogOwnerChange(address,address)", +"e5173942": "PRE_SALE_SOFT_CAP()", +"e517fd54": "getBonusPercents(uint256)", +"e5189e2a": "minSumICOStage3USD()", +"e5193c48": "withdrawGalacticTokens(address)", +"e51949fb": "getMinAuditPriceSum()", +"e51a3b40": "mul(uint8,uint8)", +"e51a7826": "buyCore(uint256,uint256,uint256,bytes32)", +"e51ace16": "record(string)", +"e51bfd9a": "selfHybridizationPrice()", +"e51c3257": "isTokenRateCalculated()", +"e51d2093": "getSaleFee()", +"e51d5c33": "Bitstraq_Token()", +"e51dc14a": "setMinBidDifferenceInSzabo(uint256)", +"e51dfd90": "cancelSellOrder(uint256,uint256)", +"e51e3c61": "transferReserveFundTokens(address,uint256)", +"e51e88bd": "MintingManagerApproved(address)", +"e51f2c68": "change(address,uint256)", +"e51f95cc": "init_crowdsale(address)", +"e51fcfa2": "LLV_311_EDIT_4()", +"e51ff1fc": "iterateOverThings()", +"e520f09e": "tokensToMintInHold()", +"e520fc7e": "treasure()", +"e5212deb": "_buyIcoToken(uint256)", +"e521357c": "LocalsValidation()", +"e521889c": "distributePrizes(uint256,uint8)", +"e5225381": "collect()", +"e52269c2": "Ooredoo()", +"e523757e": "Cashback(address,uint256)", +"e524d618": "UBetCoin()", +"e5254036": "changeNameOperation()", +"e5258557": "setMigrateFeesDueToFork(bool)", +"e525af22": "TOAB()", +"e525c3d8": "dTRIGGER_NEXTWEEK_TIMESTAMP()", +"e5260958": "Defraycoin()", +"e5269bbf": "limitDefaultType()", +"e526d7a0": "getTeamAddress(bytes32)", +"e527217b": "Object(string,string)", +"e52858c6": "token_b()", +"e5286c80": "token1stContract()", +"e5291ac5": "getVMParameters(uint256)", +"e52b6a56": "getAmountBonus(uint256,uint256)", +"e52bb742": "getGenre(uint256)", +"e52c0f24": "changeICOStartBlock(uint256)", +"e52c17a8": "test_increaseTimeBy800000_timecheck()", +"e52c66c1": "getTotalLosses()", +"e52c9da1": "giveaway(address,uint256,uint8)", +"e52d0404": "addressOfIndex(uint32)", +"e52d0659": "setPriceForBasePart(uint256)", +"e52e9f15": "isAddressLocked(address)", +"e52eb288": "buyFuel(address)", +"e52eb764": "updateVIPBoard()", +"e52efbf1": "getCompte_4()", +"e52f64ce": "releaseMany(address[])", +"e530db1c": "pool_percentage()", +"e531a9b8": "numOfUntransferableEcTokens(address)", +"e53229c7": "zasxzasxqa()", +"e5333b5e": "close_next_bucket()", +"e534155d": "holder()", +"e534a34b": "addThing(uint256,uint256,uint256,uint256,bytes32)", +"e534bf4f": "sha(bytes32)", +"e534c676": "getRefillPercFor(string)", +"e5357b02": "ReturnCode(uint8)", +"e535ed35": "closeChannel(bytes,bytes,bytes)", +"e5362206": "hdiv(uint128,uint128)", +"e5362667": "getTotalTokenCount()", +"e5363ab8": "initialise(address,uint256,uint256,uint256,uint256,uint256,string,uint8,string)", +"e536a41f": "USD20Crowdsale()", +"e536c723": "lowestContribution()", +"e536f869": "pai_add(string,string)", +"e53767bd": "denied(address,address)", +"e537a195": "getSeatAvatarUrl(uint256)", +"e537ceb9": "userOddsCycle(address)", +"e53831ed": "setSomeValue(uint256)", +"e5390e05": "thirdPeriodOfICO()", +"e53910a2": "TestNetReputationToken()", +"e5393f25": "GetSoftwareCount()", +"e53a22ac": "addSubMilestone(uint16,string,string,uint64,bool)", +"e53a8a5f": "GRAPE()", +"e53a8cf4": "getTokensLeft(string)", +"e53ae072": "PUCOINToken(address,uint256)", +"e53b373e": "TimeBankChain()", +"e53c4548": "transferOwner(address,uint256)", +"e53c9a5f": "cf_confirm(uint256,uint256)", +"e53cacba": "listOutEmployees()", +"e53cf8c9": "XBornID()", +"e53cfed9": "setupMiniGame()", +"e53d4988": "WLLToken()", +"e53e04a5": "refillGas()", +"e53eb53d": "amountToSeedNextRound(uint256,uint256)", +"e53ecb79": "allocatedBalance()", +"e5408eae": "TEAM_RESERVE()", +"e5411525": "crowdsaleStartTimestamp()", +"e54135ac": "updateExchangeRates(uint256)", +"e54280e7": "setBZxContract(address)", +"e542e7a3": "updateEtherCost(uint256)", +"e542e7c5": "newIdAuctionEntity()", +"e54384f9": "removeEntryManual(uint256,address)", +"e5438f5e": "FLiK(uint256,string,string,uint256,uint256)", +"e5449600": "unFreezeUser(address)", +"e544b52c": "setNextRules(uint256,uint256,uint256,uint256)", +"e545f941": "releaseToken(address)", +"e546299b": "activatePass(bytes32)", +"e5463032": "getWLAddress()", +"e546bb0c": "apiAddress()", +"e546d9c4": "removeTeam(address)", +"e548799c": "registerCrowdsale(address,address,uint256[8])", +"e548cf13": "betOnColumn(bool,bool,bool)", +"e548f086": "ETHOfCrySolObjects()", +"e549053f": "AnotherStorage(address)", +"e549114b": "stageOneCap()", +"e54919e6": "hasInitCard2()", +"e5494be1": "unlock2Y()", +"e5499e55": "LWFToken()", +"e549ec26": "safeDrain()", +"e54a29bb": "getRegisteredUser(address)", +"e54a9646": "netAddress()", +"e54aae13": "getMarketTopLevels()", +"e54c495a": "majorityReward()", +"e54c4f98": "getRefundValue(address)", +"e54d4051": "receiveInteger(bytes,uint256,uint16)", +"e54d62e9": "simDuration(bytes)", +"e54d8ccb": "Mappings()", +"e54ebe61": "updateBalance(uint256,bool)", +"e5514c9d": "MAX_PRESALE_TOKENS_SOLD()", +"e55156b5": "setFee(address,uint256)", +"e5515b55": "updateAssignedAudits(uint256)", +"e55186a1": "getUnit()", +"e551bff0": "PokerPayoutValue()", +"e5520228": "getEarningsRate()", +"e55219c6": "Chromium()", +"e5522a5b": "getClassMintCount(uint32)", +"e5533790": "setBiddingComponent(address)", +"e554482e": "arrayLength()", +"e554a5ff": "closeBid(address,uint256)", +"e554af57": "BAJIDOR(uint256,string,uint8,string)", +"e5553b33": "GenChip(uint32)", +"e555c1a3": "sellMyTokens()", +"e5568317": "setDeliveryAddress(string)", +"e556a08c": "validateToken(address,bool)", +"e557498b": "reFund(address,uint256)", +"e5575e61": "getTheLengthOfUserFreeze(address)", +"e557a18e": "activateHedge(address,uint256)", +"e557bb4e": "places(uint256)", +"e55834cb": "write(string,uint256)", +"e5583c59": "executeTxn(address,uint256,uint256)", +"e5589756": "Debug(string,address,uint256)", +"e5593b4d": "allocateTeamAndPartnerTokens(address,address)", +"e559afd9": "addToWhitelist(address,address[])", +"e559c724": "TEAM_VESTING_PERIOD()", +"e55a07b6": "setTiers(bytes32[],uint256[],uint256[],uint256[],uint256[],uint256[],bool[],bool[])", +"e55a07c2": "tokenSaleClosed()", +"e55a6ef6": "votingPeriodStartTime()", +"e55a7afb": "Gemmes()", +"e55ae4e8": "getPlayer(uint256)", +"e55b4aa8": "getBalloonCosts()", +"e55b55ce": "getPreSaleTokensAvailable()", +"e55b69b3": "startPostIco(uint256)", +"e55b8b62": "getPeerTokens(address)", +"e55c6d07": "getStartDateOfCampaign(bytes32)", +"e55db48e": "roundId_()", +"e55ed42e": "_phxToken(address)", +"e55f98f3": "Log1(uint128,string)", +"e55fae77": "setUpdatePeriod(uint256)", +"e56044c8": "incMemberBadRep(address,uint256)", +"e5604559": "UserUpgraded(address,uint256,uint256,uint256,uint256)", +"e560bf2e": "setOraclizeGasCost(uint256)", +"e5612b3b": "finishDistribute()", +"e5612d0e": "transferPaillier(string,address)", +"e561f28a": "cityIndexToApproved(uint256)", +"e562dfd9": "openRound()", +"e562f0ec": "setKYCRequiredToSendTokens(bool)", +"e5637956": "MIN_INVESTED_ETH()", +"e563d541": "delFrException(address)", +"e564bd4d": "accFoundation()", +"e564f88e": "tokensToIssue()", +"e564fd25": "setNotary(address,bool)", +"e56556a9": "getPlayerID(address)", +"e5656f9c": "updateMsgSenderBonusDrops(uint256)", +"e565b387": "FOUNDATION_POOL_ADDR_VEST()", +"e565beeb": "softMtcTransfer(address,uint256)", +"e565fd1b": "SetStorage(address,address)", +"e56646ae": "SmartPonzi()", +"e5664f65": "prePreSalePeriod()", +"e5665b57": "_softcap()", +"e566be4e": "EthRelief(address)", +"e566dfc6": "_handleFunds(uint256,uint256,address,uint256)", +"e567756f": "setDevelopmentAuditPromotionWallet(address)", +"e56860c3": "fundingLock()", +"e5689afa": "updateStorage(uint256,uint256)", +"e56988dd": "latestBidTime()", +"e569c1d4": "getMintOwner()", +"e56a9973": "marketCells()", +"e56adb5f": "IsWhite(address)", +"e56b3e68": "mediate(uint256)", +"e56b9dce": "GetPrize(uint256)", +"e56bb194": "calculateMyPercents()", +"e56c10a0": "ONTExchangeRate()", +"e56c174b": "getRate(address,address,uint256)", +"e56c38b1": "modify_uint(uint256)", +"e56c8155": "initialiseMultisig(address,uint256)", +"e56c8552": "spinTheWheel(address)", +"e56d3fea": "developer_add_address_for_B(address)", +"e56e4776": "avgSalesToCount()", +"e56e56b2": "sellCard(address,uint256,uint256,uint256,uint256)", +"e56e60f6": "SingularityTest12()", +"e56ee3c1": "cityPrice()", +"e56f3815": "isKnownOnly()", +"e5700ddf": "jack_winner()", +"e5702701": "minSellRateInPrecision()", +"e57053cd": "airdropWinTime()", +"e5707fa2": "teamContact()", +"e570be18": "DVIPBackend(address,address)", +"e5714ea3": "insertCLNtoMarketMaker(address,uint256)", +"e571c35e": "ReverseRegistrar(address,bytes32)", +"e571fd2d": "addPrescription(uint256,string)", +"e5720f2d": "getCredibilityScoreOfClaim(bytes12,bytes12)", +"e5723b6d": "buyerApprove(address,uint256,bytes32)", +"e572dee5": "bountyTokens(address,uint256)", +"e5731b77": "UnpackRevocation(bytes)", +"e5734c57": "setPhase1DurationInHours(uint256)", +"e574015c": "auditSupply()", +"e57405e2": "EMISSION_FOR_TEAM()", +"e575c5cb": "assertOnlyTo(uint256)", +"e575df72": "getUserStatus(uint256,address)", +"e576038f": "addNewSampleType(string,uint256)", +"e5760520": "bountyWallet()", +"e5766e84": "initPayoutTable()", +"e5769ab9": "getLastPresser()", +"e5775515": "getUserWallet(string)", +"e577d2c2": "updateEthToTokenOrderWHint(uint32,uint128,uint128,uint32,int256)", +"e5781b71": "SatFix(int256,int256,int256)", +"e5782fd5": "setFeeStructure(uint256,uint256,uint256)", +"e5789f5f": "getTotalLevelValue()", +"e5791c3e": "mustHoldFor()", +"e5796716": "restrictTransfert()", +"e579ebeb": "chAirDropFshare(uint256)", +"e57a68da": "StephenHawking()", +"e57ac748": "resolveDisputeSeller(string,address)", +"e57b921d": "_createNumber(string,uint256)", +"e57bc079": "DrawAddr()", +"e57c09bc": "contentById(bytes32)", +"e57c78ec": "unregisterPresale(address)", +"e57c8d1b": "dummyAgent()", +"e57d4adb": "approvedOrders(bytes32)", +"e57d880a": "externalPurchase(address,string,uint256,uint256,uint256)", +"e57e31fa": "approveSubmission(address,address)", +"e57e5741": "onXon()", +"e57e6593": "createClaim(string,string,address,uint256,string)", +"e57ea16d": "checkValueSent(bytes,bytes20,uint256)", +"e57ebc0f": "FRPToken()", +"e57f5a1d": "removeFromStud(uint256)", +"e58018c5": "openSaleEndTime()", +"e5807e06": "unfreezeBoughtTokens(address)", +"e580b2b0": "presaleEnded()", +"e580f47b": "lotteryId()", +"e580f6ab": "createGame(uint8)", +"e581002e": "strategybacktest(uint32[],bytes32[],bytes32[],uint64[],bytes32)", +"e5815b33": "JohanNygren()", +"e58172b1": "cardCost()", +"e5820af7": "pushtx(address,uint256)", +"e582645e": "isTokenSaleRunning()", +"e582b7e0": "lastBidAmount()", +"e582dd31": "stored()", +"e58306f9": "adminMint(address,uint256)", +"e5834b4d": "setShareactive(bool)", +"e5839836": "isFrozen(address)", +"e585f69f": "TokenResolver()", +"e587fb71": "setTreasureBox(address,bool)", +"e588a2bb": "ChannelWithdraw(address,address,uint32,uint192)", +"e5893cbe": "Register(address,bool)", +"e58a6509": "SMTfund()", +"e58ae45b": "migratePhraseData(uint256,uint256,uint256,uint256,uint256)", +"e58b0eb1": "WinkelERC20()", +"e58b5ab2": "setFinishedTx()", +"e58b69f2": "getCompte_6()", +"e58ba9e4": "stealCardWithSocialIdentity(uint256,uint256)", +"e58c68bc": "MAX_GEN0_GIRLS()", +"e58c8c5c": "checkParticipantStatus(address)", +"e58ca07e": "IntegratedMoney()", +"e58cd3cb": "setTokenCapInUnits(uint256)", +"e58d116b": "addConfirmation(bytes32)", +"e58d478e": "btcAddrPubKeyUncompr(bytes32,int256,bytes32,int256)", +"e58dd55a": "endThirdBonus()", +"e58dede7": "_tokenAllocator()", +"e58eda1b": "ARTWORK_AUCTION_DURATION()", +"e58ef8a8": "executeTransfer(address,address,uint256)", +"e58f0289": "MANGGAHTOKEN()", +"e58f2623": "getLotteryData()", +"e58fc54c": "withdrawForeignTokens(address)", +"e58fdd04": "isFeed(address)", +"e5910f04": "setCourceSale(uint256)", +"e591253c": "refundPreICO()", +"e59160e3": "nomin()", +"e591fa26": "getProjectFeedbackWindow(bytes32)", +"e5920ab5": "getNoVotes()", +"e592172e": "test_twoInvalidEqString()", +"e5926ddc": "getSaleLength()", +"e592f95a": "getRewardWinnings(address,uint256)", +"e593428f": "PURCHASE(bytes32,uint256)", +"e5949b5d": "channels(uint256)", +"e594ad35": "assignCore()", +"e5962195": "blocked(address)", +"e596d811": "approveBatchTransfer(address)", +"e597a27f": "getNumberOfBlocksRemainingToWin()", +"e597f402": "create(bytes1,bytes32,bytes)", +"e59843ec": "allowAutoInvest(address)", +"e5994905": "transferTokenFrom(address,address,address,uint256)", +"e59997c9": "getFmmsDetail(uint256)", +"e599a767": "GGG()", +"e59a29a6": "getStakePerDraw()", +"e59af25b": "buy_spice_melange()", +"e59b0e14": "testIsNull(bytes)", +"e59bcf52": "subLockValue(address,uint256)", +"e59c4fa3": "smallUintFunc(int256,uint8,uint256)", +"e59c5e56": "Filled(address,uint256,address,address,uint256,address,uint256,uint256)", +"e59c9ada": "getBonuses(uint256)", +"e59cef17": "RaisedFunds()", +"e59cf926": "FOUNDER_ADDRESS3()", +"e59d2b7f": "unfreezeTeamWalletBlock()", +"e59d4912": "setOracleInterval(uint256)", +"e59d843a": "Replicator(bytes,uint256,uint256,address)", +"e59de295": "setItemPerPage(uint16)", +"e59de3a5": "drawToken(address)", +"e59e1ca6": "getBrickBuilders(uint256)", +"e59e6759": "ZXZX(uint256)", +"e59eee2e": "PRE_ICO_MIN_DEPOSIT()", +"e59f611f": "InputLimit(uint256)", +"e59ff828": "createOrder(uint32,uint32,uint256,bool)", +"e5a01e69": "getWeaponNumber()", +"e5a07419": "sellDividendPercentEth()", +"e5a078a7": "cancelRegistration()", +"e5a17818": "cancelSeller(bytes32,uint256)", +"e5a1eac2": "setSellDividendPercentageFee(uint8,uint256,uint256)", +"e5a23e7e": "changeBirthSettings(uint256,uint8,uint8)", +"e5a252b1": "playerTempReward()", +"e5a27038": "Pluton(uint256,string,uint8,string)", +"e5a284f8": "roundFourBlock()", +"e5a31c5d": "canGrantVestedTokens(address,address)", +"e5a3363c": "luckyVoters(uint256)", +"e5a34f97": "getFullround()", +"e5a3c0ad": "addPrivateSaleTokens(address,uint256)", +"e5a3c771": "expiredLockPeriod()", +"e5a4bed3": "getInterest()", +"e5a512af": "refund_with_close_position(address[],address,uint256[])", +"e5a5fbc8": "crowdsaleInProgress()", +"e5a62ffc": "Tile()", +"e5a64de6": "CompraUnidadesPases(uint16,uint8)", +"e5a6b10f": "currency()", +"e5a6fadd": "ReinsureSeveralDeaths(bool)", +"e5a70ef7": "feeMultiplier()", +"e5a71eb6": "Itterator9000Ultra()", +"e5a749e8": "needSurvive(bytes32)", +"e5a7b51f": "parentChange(address,uint256)", +"e5a82fe7": "REXEN(address)", +"e5a85478": "getUserTXCount()", +"e5a912c7": "xdest()", +"e5a93dd8": "inCirculation()", +"e5a9d6b0": "get_registrant(bytes32)", +"e5aa3d58": "i()", +"e5ab8be0": "isCollaboratorOrOwner(address,uint256)", +"e5ac7291": "lockAccounts(address[],uint256)", +"e5ac808e": "checkProof(bytes32,bytes32,bytes32[],uint256)", +"e5ace862": "getPoolMinStakeTimeInBlocks(uint256)", +"e5aceac5": "getWorlCupByID(uint256)", +"e5ae7721": "submitPayment(bytes32,bytes32[],uint256,uint256,uint8)", +"e5af0e89": "setNewTokenURI(string)", +"e5af18c5": "score(bytes32)", +"e5af350e": "reloadWhiteByName(uint256)", +"e5af3a35": "throwsSaleWalletIncorrectMultisig()", +"e5af48d8": "isApproved(address,address,uint256)", +"e5af8d92": "iiinoTokenAddress()", +"e5afe3e6": "tokenPrices(uint256)", +"e5b02393": "addSaler(address)", +"e5b02447": "findTopNValues(uint256[],uint256)", +"e5b0ee4d": "changeVestingPeriod(uint256)", +"e5b2169f": "Registry(string)", +"e5b28c07": "weeksFromEndPlusMonth()", +"e5b2a58d": "SinoeCoin()", +"e5b4003b": "grantPoolRole(address)", +"e5b5019a": "MAX_UINT()", +"e5b598d9": "hasChampSomethingOn(uint256,uint8)", +"e5b5a527": "giveStellarReward()", +"e5b5fe72": "Put(address)", +"e5b6b4fb": "Securities_5()", +"e5b6eac4": "teamUnlock2()", +"e5b73e08": "payer(address)", +"e5b754fb": "Redeem(address,uint256,uint256)", +"e5b7ec88": "setVoteCut(uint256)", +"e5b82bba": "dayTokenFees()", +"e5b8d6e0": "withdrawTokenRefund(uint256)", +"e5b9a74c": "submit(address,string,string,string)", +"e5ba08e5": "_baseDebt(uint256,uint256,uint256,uint256)", +"e5ba0b8a": "sellOffer(uint256,uint256,address,bytes32)", +"e5bb6575": "blockUser(address,address)", +"e5bb9fb9": "cancelTx(uint8)", +"e5bc7be0": "replaceModuleHandler(address)", +"e5bcb303": "getAccessorPurpose(address)", +"e5bf1b75": "getElectionId(string)", +"e5bf93b9": "balanceEther(uint256)", +"e5c0de3e": "Labereon()", +"e5c0fa69": "torchDividendsOf(address)", +"e5c19b2d": "set(int256)", +"e5c2205e": "_calculateTokens(uint256,uint8,uint256)", +"e5c31ddc": "rejectTransfer(uint256,uint256)", +"e5c361b0": "totalTokensICO4()", +"e5c389cd": "setConfig(uint256,uint256,uint256,uint256)", +"e5c42fd1": "addStakeholder(address)", +"e5c46869": "refPercentage()", +"e5c46944": "MultiSigWallet(address[],uint256)", +"e5c5dabb": "CSCResourceFactory()", +"e5c60091": "highest_bid()", +"e5c60d0b": "INVESTMENT_FUND_TOKENS_SUPPLY()", +"e5c6258d": "withdrawCrowdsaleTokens(address,uint256)", +"e5c774de": "houseEdgeDivisor()", +"e5c7bc6c": "treesOnSale(uint256)", +"e5c7e509": "testThrowTransferDisableNotEnabled()", +"e5c8b03d": "renounceSigner()", +"e5c8eb2f": "mytesttokenToken()", +"e5c91047": "addMeByRC(address)", +"e5c92020": "freezeFrom(address,uint256,uint256,uint256)", +"e5c98b86": "RoundSet(uint64,address)", +"e5c9c2ed": "_initialize(address,address)", +"e5ce8200": "withdrawForMkt(address)", +"e5cf2297": "amountOwed(address)", +"e5cf45b0": "FruitionToken()", +"e5cfd1bc": "player3Timestamp()", +"e5d00bee": "initiateCrabPartData()", +"e5d00f1f": "checkDepositQuest(address)", +"e5d02cd0": "PriceReturn(uint256,uint128)", +"e5d0713b": "maxGamesPerBlock()", +"e5d0c1bd": "LATToken()", +"e5d17171": "skl()", +"e5d2ce2f": "setCategory(uint256)", +"e5d3d9d7": "getBuyArray(address)", +"e5d4610f": "generatorTransfer(address,uint256)", +"e5d5876d": "_sell(uint256)", +"e5d5c898": "isSuperior(bytes32[],bytes32[])", +"e5d607f3": "SocialLendingToken(uint256,string,string,uint256)", +"e5d71cfe": "rewardLottery(bool)", +"e5d787f2": "moreTokenPerEtherForPresaleRound()", +"e5d8011f": "getCurrentTokenAmountForOneBtc()", +"e5d8103e": "setTotalBonuses(uint256)", +"e5d824a7": "addData(uint256)", +"e5d8f1ca": "removeAmount()", +"e5d90d94": "LuckchemyToken()", +"e5d9dac4": "assetTransfer(address,uint256)", +"e5da2717": "BOBToken()", +"e5dada63": "_pushRoomNight(address,uint256,bool)", +"e5db1a68": "bytes32Func(bytes32)", +"e5db2612": "addPrivatePurchaser(address,uint256,uint256,uint256)", +"e5db7a20": "mainnetAccountDict(address)", +"e5db9b49": "getJobInvoices(uint256,uint8)", +"e5dc476f": "getVideoGameCurrentPrice(uint256)", +"e5dc67d6": "setGameCloneFee(uint256)", +"e5dcc824": "getInfo1(address,address)", +"e5dd05ab": "primaryLedgerCount(string)", +"e5dd90a5": "HumanStandardToken(uint256,string,uint8,string)", +"e5ddb19d": "_applyLevelBonus(int256,uint256)", +"e5de0b89": "EGGS_TO_HATCH_1FALCON()", +"e5de2925": "endPreSales()", +"e5df3dd0": "unfrozen(address,uint256)", +"e5df669f": "recoverAddr(bytes32,uint8,bytes32,bytes32)", +"e5df7b10": "getBoughtTokens()", +"e5dfbe78": "setCreateDividendPercent(uint256)", +"e5e04a33": "SendResult(uint64,uint64)", +"e5e123f1": "funeral(bytes32,int256)", +"e5e1a202": "endTimeOne()", +"e5e231dd": "pauseTokens()", +"e5e288e5": "sendTransaction(address,uint256,bytes)", +"e5e2fd7b": "balanceTreasury()", +"e5e38fc7": "test_twoTrueAndFalseAssert()", +"e5e3ac4f": "removeAssociatedAddressDelegated(address,address,uint8,bytes32,bytes32,uint256)", +"e5e41a63": "publishOption(uint256,uint256)", +"e5e45b16": "notifyTempBreach(int256)", +"e5e4807f": "setPriceToPreSale()", +"e5e51bd7": "getOrderTokenCompletedAmount(uint256,address)", +"e5e53493": "requestKinTokenOwnershipTransfer(address)", +"e5e5cfac": "Altcoin()", +"e5e5dff1": "cancelBounty(uint256)", +"e5e5e5d6": "emitGenericProposal(string)", +"e5e6a0aa": "ticketTransfereesAmount(address)", +"e5e75fee": "fountainContractAddress()", +"e5e792de": "_pro(address,uint256)", +"e5e7a136": "CEO_SHARE()", +"e5e7b82b": "ethEurRate()", +"e5e7c276": "isData()", +"e5e7fa53": "div(uint96,uint96)", +"e5e88590": "unholdSubscription(uint256)", +"e5e9a9bb": "registerUsers(address[])", +"e5ea1201": "changeTicketType(uint256,string,uint256)", +"e5eab096": "setDomain(string)", +"e5eabf14": "playInternal(address,uint256,uint256,address,uint256)", +"e5eb9d7a": "SilverMoon()", +"e5ec8df3": "calcTimedQuotaByPower(uint256,uint256,uint256,uint256)", +"e5ed1d59": "startGame(uint256)", +"e5ed31cb": "updateBytes32(bytes32,bytes32)", +"e5ed44c2": "Koplak()", +"e5ed78bb": "setDateStart(uint256)", +"e5ee8dae": "publicGetElementOffer(uint256,uint256,uint256)", +"e5eee9be": "longJudge(uint256,address)", +"e5ef0b95": "BitRRToken()", +"e5f06556": "fillRequest(bytes32,string,uint256)", +"e5f171d6": "BLOCKCHAIN_DEPOSIT_BETA()", +"e5f2806a": "createPlayer(uint32[7],uint256,address)", +"e5f2d88f": "settotalCardValue(uint256)", +"e5f363f8": "FTTtoken()", +"e5f3b2dc": "advisorsTokensWallet()", +"e5f3e7b5": "placeBet(uint256,uint256,uint256,uint256,uint256,bytes32,bytes32)", +"e5f3fcb1": "alias_price()", +"e5f4906a": "moveTokenICO(address,uint256)", +"e5f59e7c": "setIsChargingManagementFee(bool)", +"e5f5d05b": "tokensRaisedRound()", +"e5f6186d": "maxContributionWei()", +"e5f643cf": "InvestorWhiteList()", +"e5f65c71": "initialBlockCount()", +"e5f6a908": "AddrCommunityDistribute()", +"e5f6b137": "getOutCar(string,uint256)", +"e5f6d376": "updateStatusViaTokens()", +"e5f6f252": "getUserNumEntries(address,uint256)", +"e5f6f716": "thirdChainETH()", +"e5f796fd": "CONTRIBUTION_END()", +"e5f79bee": "PRE_SALE()", +"e5f8ce92": "setPercent2(address,uint256)", +"e5f92973": "conclude()", +"e5f952d7": "rewardMathGeniuses(uint256,uint256)", +"e5f982a4": "validateChainlinkCallback(bytes32)", +"e5f9a40f": "TRHToken(address,string,string,uint256,uint256)", +"e5f9ec29": "left51(uint256)", +"e5f9f510": "BetMe(address,uint256)", +"e5fb08c0": "tokenExchangeRateMile2()", +"e5fb9211": "constructLeaf(uint256,address,uint256)", +"e5fb9332": "mintProject(string,string,string,address)", +"e5fd6364": "unregisterPublicKey(uint256)", +"e5fdac45": "presentMissingChunk(bytes)", +"e5fe3d7a": "aprovaPagamento(bool)", +"e5fe4f31": "buy(uint8,bytes32,bytes32)", +"e5fe7870": "vote(string,uint128,uint256)", +"e5ff2e8a": "mintTeamTokens()", +"e5ff7674": "restartPresale()", +"e5ffea8e": "testCalculateNeededCollateral()", +"e5ffeaf6": "fixAddress(address,bytes32)", +"e600c817": "verifyUser(string)", +"e600fd93": "getBonusPercentageByMachineMode(uint8)", +"e6025572": "ShadowBox()", +"e602af06": "confirmChangeOwnership()", +"e604cf9f": "get_all_squares()", +"e6072d5a": "BONUS_MID_QTY()", +"e607a638": "DataController(address,address)", +"e608433b": "weiForRefundPreICO(address)", +"e608ca67": "calculateSubscore(address,int16,int16)", +"e608d3e5": "marketingCap()", +"e609120a": "intercrypto_convert(uint256,string,string)", +"e609348a": "upgradeOwner(address)", +"e60a33aa": "userEndGame(uint32,int256,bytes32,bytes32,uint256,address,bytes)", +"e60a72bc": "ReferalsTokenHolder(address)", +"e60a955d": "setActive(uint256,bool)", +"e60aafab": "setIcoStatus(uint256)", +"e60b0cad": "endPreICOStage1()", +"e60b1424": "bytes32ToUint(bytes32)", +"e60b2c9a": "SALE_2WEEK_BONUS()", +"e60b7ff7": "batchTransferToken(address,address[],uint256)", +"e60c11a0": "subContractBalance(uint256,uint256)", +"e60d3caf": "updatePowerDayRate(uint256)", +"e60dbaae": "Jump()", +"e60f1ff1": "getExit(uint256)", +"e60fb021": "publishOwner()", +"e60fd342": "getCreateSharesFxpValue()", +"e6107cbb": "isBurnApproved()", +"e6108fc9": "increaseLockBalance(address,uint256)", +"e61109fd": "setFiscalVerify(uint256,uint256,uint256,bytes32)", +"e611ad32": "CourseBaseOnIdStudentFunct(uint256)", +"e6120842": "warningERASEcontract()", +"e612a4b6": "get_order(string,uint256)", +"e612c0ad": "team2()", +"e6131706": "updateTransaction(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)", +"e6131a64": "UpdateBeneficiary(address)", +"e6135ffe": "_removeIndex(uint256)", +"e6136d84": "icoBegintime()", +"e61387e0": "knc()", +"e6138b37": "TESTBRB()", +"e613d3b2": "getParentUser(address)", +"e6153d1b": "mint(string,bytes16,uint256,uint32,address)", +"e615ed91": "AragonTokenSaleTokenMock(address,uint256)", +"e61604cf": "liquidateBorrow(address,address,address,uint256)", +"e616c975": "GetAccountIsFrozenCount()", +"e6175794": "MaPToken()", +"e617f204": "setWhiteListAdmin(address,address)", +"e618f558": "TempTokensSend(address,uint256,uint256,uint256)", +"e6197f41": "setTokenSaleFinished()", +"e61a3c73": "GuDuFengCoin(uint256,string,uint8,string)", +"e61ab6c9": "accountPubPreSale()", +"e61b6557": "reserveOwner()", +"e61b762b": "cancelAllSellOrders(address,uint256,uint256)", +"e61b959e": "dev_outStream()", +"e61c51ca": "topUpGas(uint256)", +"e61c6320": "_recoverAddressFromSignature(bytes,bytes32)", +"e61ca819": "indexToAddress(uint256)", +"e61d5d50": "raisedOBR()", +"e61fde91": "BiciDevuelta()", +"e6206711": "SendEthOn()", +"e6207611": "setChests(address)", +"e6213127": "deprecate(bool,address)", +"e621350d": "getDiscountAndSupply()", +"e621b149": "softCapUSD()", +"e621b5df": "redeemEther()", +"e6229c14": "_createBid(address,uint256,address,address,bytes32,uint256,uint256)", +"e622abf8": "LOCK_END(uint256)", +"e6232ba1": "updateEndDate(uint256,uint256)", +"e6234260": "depositCollateralOnBehalfOf(address,bytes32,uint256)", +"e623a1a6": "kcck256straddadd(string,address,address)", +"e623a93b": "votesForAnswer()", +"e623c4ac": "addressInSwap(address,address)", +"e6240deb": "activityCount()", +"e62420d9": "getChild(address,uint256)", +"e62444e1": "submitJRH(uint256,uint256,bytes32,uint256,bytes32[],uint256,bytes32[])", +"e624b02a": "changeHold(address,uint256,uint256)", +"e624d199": "partnerSaleWallets(uint256)", +"e625215c": "withdrawStake(uint256,bytes)", +"e6252c0f": "deleteHpbNodeCache(address)", +"e6256509": "SPNToken()", +"e62580cb": "MYToken(uint256,string,uint8,string)", +"e6259f53": "timeArrayOf(uint256)", +"e6281254": "FundsMoved(uint256)", +"e628dbf9": "changeTiming(uint256,uint256,uint256,uint256,uint256,uint256)", +"e6293e23": "burnerAddress()", +"e629837c": "updateAndSafeTransferFrom(address,uint256,string)", +"e62a4ac9": "setBUI(bytes32,uint256,int256)", +"e62af875": "isContractOwnerLocked()", +"e62b795c": "addCourse(string,string,string,string,uint8,uint8)", +"e62bd899": "mintStart1()", +"e62c04bb": "OwnershipTransferred(address[],address[])", +"e62c2f9c": "get_location()", +"e62c9df9": "participantToEtherSpent(address)", +"e62cc611": "ETHER_HARD_CAP()", +"e62cd55c": "test_oneInvalidFalseEq()", +"e62d64f6": "withdrawableBalance()", +"e62d809d": "subdividendsOwing(address)", +"e62d909f": "TargetCreated(address)", +"e62e3c07": "getTransactionDetails(bytes)", +"e62eea47": "startSettling(bytes32)", +"e631b536": "fields(address,uint256)", +"e631e9b3": "solveIO(uint256,bytes32,bytes32,bytes32,bytes32)", +"e63227b0": "freezeGlobalTansfers()", +"e6324270": "profilParticipant(uint256)", +"e632c2f3": "totalPurchased()", +"e633cefe": "itemInfo(address,address,uint256,bytes)", +"e63466a3": "_getToken(address)", +"e6346867": "imaxChainToken()", +"e63697c8": "withdraw(uint256,address,uint256)", +"e6369e41": "Timestamp()", +"e636bc3c": "addRoyLuxList(string,string,uint256,uint256)", +"e6378d3a": "joinGame(bytes32,string)", +"e637f824": "GetPlayerDataAt(address)", +"e638d76d": "migrateDomain(bytes32,uint256)", +"e638f372": "getDIVDPayoutPercent()", +"e639481a": "getUpperBoundBlocksTillGameEnd()", +"e63988bd": "getContributorInformation(address)", +"e63a6788": "miningOnePlat()", +"e63b029d": "finishSalvage(address)", +"e63b681e": "redeemExternalToken(bytes32,address)", +"e63b6b87": "DipTokensale()", +"e63bc62d": "processProposal(uint256)", +"e63c83c1": "getTotalWithdrawn(uint64,address)", +"e63d38ed": "disperseEther(address[],uint256[])", +"e63d4957": "totalLimitUSDWEI()", +"e63da5f7": "bootstrap2()", +"e63da84c": "getBattleRandom(uint256,uint256)", +"e63df4a7": "createJobEscrow(bytes16,address,address,uint256,uint256,uint32,uint32)", +"e63edfef": "Learn()", +"e63fb7d2": "getAdText(uint256)", +"e6400bbe": "suspend()", +"e64044c0": "payoutKeys(uint256)", +"e640663a": "removeFromOwnershipAuctionTokenIDs(address,uint256)", +"e640d5a8": "PubAccepted(address)", +"e6416f4e": "sendFoo(address,uint256,bytes)", +"e641bde1": "addInvestor(address)", +"e642b7b6": "isWhitelistOnlyStatus()", +"e642b900": "Bugcoin()", +"e642b9be": "MTP_PER_ETH_PRE_SALE()", +"e643197b": "TRY_Omnidollar()", +"e643d63c": "_setProposal(uint256,string,bytes32,bytes32,bytes32,string,uint256,uint256)", +"e6441201": "set_foo(string)", +"e644d886": "ico3total()", +"e644f60b": "isFresh(string)", +"e6452f64": "TGEDeployer(uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"e6456a30": "HARDCAP_ETH_LIMIT()", +"e6458f6e": "getExternalDependencies()", +"e646350d": "getTokensAvailableForSale()", +"e6468b9f": "mCoinPerBlock()", +"e6470fbe": "updateDefaultPayment()", +"e6471555": "remForSalesBeforeStageLast()", +"e64853c4": "polls()", +"e648ce75": "setSelfClaim(bytes32,bytes)", +"e64906a4": "setTokenForPreSale(uint256)", +"e64a4e27": "updateDealConditions(uint256,uint32,uint32,bool,uint256)", +"e64acfa4": "getRealValueToReturn(uint256)", +"e64e3241": "mint(bytes32,bytes,uint256[],bytes,bytes)", +"e64f15a2": "deleteTask(bytes32)", +"e64fd8b0": "transferTokenWallet(address)", +"e650672b": "setGreenToken(address)", +"e6506873": "bookingMetadataForKey(bytes32)", +"e650ca40": "firstWeekBonusInWeek()", +"e6511ce2": "createCodeContract(string)", +"e6512ea2": "fundBounty()", +"e6514de2": "PreSaleLimit()", +"e6519a35": "getCreationTime()", +"e6527376": "OneWorldCryptoCoin()", +"e65284f1": "getRealPriceSpeed()", +"e652ca86": "LowcarbonToken()", +"e652f4cc": "getVoteCount(address)", +"e6530b97": "addArbiter(address,uint256)", +"e653d52d": "approveProxy(address,address,uint256,uint8,bytes32,bytes32,string)", +"e653d5d3": "GlobalStorageMultiId()", +"e653ec6a": "unsubscribeFromPool()", +"e6544b87": "ICORatio()", +"e65500e9": "startincreaseWithdrawalTeam()", +"e6560c94": "_saveBonus(address,uint256)", +"e6562fe1": "approveForwardedAccount(address,address,string)", +"e6569b1e": "getConID()", +"e6571176": "checkCertificate(bytes)", +"e657807b": "endIco()", +"e658d221": "claimPlotMultipleWithData(uint256[],string,string,string,string)", +"e6591f4e": "setNSFW(uint8,bool)", +"e65a0117": "earn(uint256)", +"e65a2e7f": "forceEmpty(bytes32)", +"e65af219": "PlusCoin()", +"e65b00b6": "Confirmation(address,bytes32,bool)", +"e65b1fd0": "getConsecutiveDeaths()", +"e65b490d": "_rewardWinners()", +"e65b743e": "dispatchGains()", +"e65b782f": "getCurrentTranche()", +"e65b96a7": "MyDanaToken()", +"e65b99c6": "uservalue()", +"e65bbceb": "makeAdoptionRequest(bytes5)", +"e65c1244": "holderEthers(address)", +"e65ca2fe": "Crowdsale(uint256,uint256,uint256,uint256,uint256,address)", +"e65d1522": "fromWei(uint256)", +"e65d19ca": "createInactiveEdition(uint256,bytes32,uint256,uint256,uint256,address,uint256,uint256,string,uint256)", +"e65d6b49": "getCommission()", +"e65d9717": "pushVendor(string,address,bool)", +"e65da9a2": "PROMOTION_ACCOUNT()", +"e65de3ca": "removeTitleTransfer(string)", +"e65dea55": "validate(uint256,uint256,uint256,string,string,string)", +"e65e63ed": "secondsaleclosingTime()", +"e65e73e2": "oneavl()", +"e65e95a8": "token_address(address)", +"e65f0246": "updateCountryHoldersCount(uint256,uint256)", +"e65f1d98": "bigLoop(uint256)", +"e65f2a7e": "enroll()", +"e65f5ea4": "distribute10MT(address[])", +"e6601fb4": "viewFunds(address)", +"e660c7aa": "PresaleAddress()", +"e660dd54": "compWallet()", +"e661a98f": "ecosystemtoken()", +"e661b3d5": "returnStatus(uint256)", +"e662bd25": "doTransfer(address)", +"e662e9af": "getPersonalStakes(address,address)", +"e662ff97": "sellMyTokensStocks()", +"e6634e41": "tokensPerEthAtRegularPrice()", +"e664214a": "releaseUnlocked(address,address,uint256,uint256)", +"e6642528": "BitcoinIndigo()", +"e664725b": "bn128_add(uint256[4])", +"e664755b": "withdrawAttacker()", +"e664d8e8": "showhospital(uint256)", +"e664e1e0": "getAddressTwo(address)", +"e6657008": "TicketsInGame()", +"e665dba0": "addAuthorizedExternal(address,address)", +"e66623ad": "ETbankWord()", +"e6662e2b": "UrbitToken(address,address)", +"e666767b": "getPlayerBetForCurrentPlayRound(address)", +"e6678f33": "updateReferralBonusRate(uint256)", +"e66825c3": "pricePerUnit()", +"e668a547": "SingularityTest8()", +"e668a7af": "buyFrom(address,uint256)", +"e668e1f3": "noContestTime()", +"e668e5ce": "getPlayerBetCount(string,uint256,string)", +"e6690fb1": "nextAuction(uint256)", +"e6691249": "getCompte_5()", +"e66a5e6b": "waveCap1()", +"e66a6b22": "isSigned()", +"e66aa720": "pureBalance(address)", +"e66bf416": "DLK()", +"e66c4175": "LargeCapStartTimeChanged(uint256)", +"e66c66d9": "setMonsterCreatorAddress(address)", +"e66caeb4": "payFortune(uint256)", +"e66d1b84": "countHoldAmount(address)", +"e66d4694": "gymContract()", +"e66d9874": "REQUEST_REJECTED_BY_HOST()", +"e66dda4e": "wallocked()", +"e66dde38": "startRound(bool)", +"e66e00f8": "getAdminDashboard()", +"e66f51fd": "AxieERC721Metadata()", +"e66f53b7": "curator()", +"e66f6e75": "getIsAttack()", +"e66f7bba": "oracleItQuery(uint256,string,string)", +"e670f7cd": "checkHash(string)", +"e6714f63": "eth_min()", +"e6717d3f": "setPresidenteDeMesa(bytes32,uint256,bytes32)", +"e671ac23": "getMonthClaimed(address)", +"e671f510": "onEtherandomExec(bytes32,bytes32,uint256)", +"e6722531": "checkBoosterQuest(address)", +"e672eb49": "GetBetInformation(uint256)", +"e673f646": "setContributor(address,address,bool,uint8,uint8,address)", +"e6744035": "booleanToUInt()", +"e6748da9": "setBytes(bytes32)", +"e674a0bd": "unlock(address,address)", +"e67524a3": "mintTokens(address,uint256,string)", +"e6758649": "revokeStakeholderConfirmation(uint256)", +"e676d53f": "GRAD()", +"e6774e1e": "setCapTab(uint256,uint256)", +"e6779bba": "_calculateTokensAmount(uint256)", +"e677d67d": "decode(bytes,uint256)", +"e679366f": "setExchangeTime(uint16,uint8,uint8,uint8,uint8,uint8)", +"e67ad254": "airBegintime()", +"e67bcfb6": "viewPreSaleCancelledList(address)", +"e67c4f96": "_createItem(string,address,uint256)", +"e67cdfb7": "moveOldUser(uint256)", +"e67d35c6": "UmeTravelNet()", +"e67d5b16": "SpeedJump()", +"e67e04f9": "startAcceptingDonation()", +"e67e3d56": "ethTaxRate()", +"e67e8aaf": "cliffPercent()", +"e67eed44": "getTicketOwner(int256,uint256)", +"e67f3cde": "about(address)", +"e67fcd10": "createSale(string,uint256,uint256,uint256,uint256)", +"e6807ca9": "checkBlacklist(address)", +"e68122e2": "createConsent(address,string,string)", +"e681e906": "_disableModule(bool)", +"e681f989": "saveMetaData(address,bytes32,bytes32)", +"e68215ec": "getOrganizerInforById(uint256)", +"e6821bf5": "videos(uint256)", +"e6824b0d": "REAPER_INTREPID()", +"e682c9ea": "rescindVote(bytes32)", +"e682e290": "getWhitelistStatus(address,address)", +"e682e2b2": "PingToken()", +"e6838ffa": "CbDataStandardToken(uint256,string,uint8,string)", +"e684aa5c": "amountAlreadyPaidBack()", +"e684d75d": "from_Initialisation_to_Lifecycle()", +"e685f2fe": "SilcCrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"e686b89a": "stage_2_price()", +"e6885aad": "Notary()", +"e688aab4": "changeOperative(address)", +"e688d097": "activekey(address)", +"e688f89d": "getMax(uint256)", +"e6890105": "addRefundTransaction(uint256,uint88)", +"e6891995": "KStarCoin()", +"e6891a55": "underwritePriceOf(uint256)", +"e6898a7d": "getSex(uint256[2])", +"e689928e": "seventyeight()", +"e689aa66": "isAllocated9()", +"e68a471d": "getLatestTokenPayday(address,address,address)", +"e68a555d": "UpdateUserPELOAmount(address,uint256)", +"e68a655c": "setEtherDeltaFees()", +"e68a7c3b": "getAccounts(uint256,uint256)", +"e68a9610": "releaseTokensTo(address,address)", +"e68c32b3": "cgadmin(address)", +"e68d3ae3": "escrow(uint256,string,address,uint256)", +"e68d7535": "cancelWhiteList(address[])", +"e68e64cb": "getCurrentUserReward(bool,bool)", +"e68f05fe": "SetCrowdsaleAddress()", +"e68f08a0": "MatchGetted(uint256,bool,uint256,uint256,uint256)", +"e68fb207": "makeOrder(address,address,uint256,uint256)", +"e690833a": "getPropertyRatingTuple()", +"e690d9bf": "Rollercoaster()", +"e6917e67": "tierOnePurchase()", +"e691bed4": "get_arbits(address,address)", +"e693e4d1": "neironixProfitAddress()", +"e69405fd": "_endDutchAuction(uint256,uint256)", +"e69432c8": "getMyNormalDragons()", +"e694d107": "getlastDividendPoints()", +"e694f694": "distributeLRNX(address[],uint256)", +"e69506aa": "Tokens_Per_Dollar_Denominator()", +"e6955d7c": "XYCC()", +"e6957514": "mergedMinerValidatorAddress()", +"e695c00c": "assertEq29(bytes29,bytes29,bytes32)", +"e696d10d": "processPurchase(address,address,uint256)", +"e696fb9a": "_6_friends()", +"e696fd64": "change_ico_finish(uint256)", +"e6972dbb": "readEventFromDatabase(uint64)", +"e6979b90": "multiAdd(address[],uint256[])", +"e697b5d8": "referrals(address,uint256)", +"e69852d0": "getUserNameOf(address)", +"e698816f": "getTokenIdOfCR(string)", +"e69932e5": "getFreeSeeds()", +"e6997f6d": "rootUTXOMerkleTreeHash()", +"e699e8c3": "removeDefaultOperator(address)", +"e69a2d9a": "Lent(uint256,address)", +"e69b414b": "issuedTokensAmount()", +"e69b9b65": "exchangeableTokensFromSale()", +"e69d09cf": "releasedForTransfer()", +"e69d27a8": "lifeFactor_v()", +"e69d849d": "donate(address,uint256)", +"e69e04b3": "defaultPrice()", +"e69e4640": "calculateBalance(uint256,uint256,uint256)", +"e69e9337": "PERSONAToken()", +"e69fde41": "KentraToken(uint256,uint256)", +"e69ffce8": "changeRegulator(bool)", +"e6a0525f": "getStudentID(bytes)", +"e6a1e811": "newBet(uint8)", +"e6a27cf2": "getUserEarningsInfo()", +"e6a33268": "secondRate()", +"e6a3afe8": "sendTreasuryTokens()", +"e6a43d63": "crowdsaleSoftCap()", +"e6a45026": "fetchStageIndexBySnapshotBlock(uint256)", +"e6a50d84": "getAddressFromIndex(uint256,uint8)", +"e6a5d78d": "_getMerkleRoot(bytes32,bytes32[])", +"e6a605df": "PreTgeEnable()", +"e6a6d4c8": "getExecutedTransactions()", +"e6a7638c": "eucledianDistance(uint256,uint256,uint256,uint256)", +"e6a8fe04": "evHarvest(address,uint256)", +"e6a9026b": "submitTransaction(address,uint256,string,bytes)", +"e6a9627c": "setAgentAddress(address,address)", +"e6a9b2d8": "createTAO(string,string,string,string,bytes32,address,uint256)", +"e6aa216c": "getExchangeRate()", +"e6aa96a5": "CRS()", +"e6aaae81": "tokensSoftCap()", +"e6aac98f": "currentDayTS()", +"e6ab96ed": "unstakeContent(bytes32)", +"e6abaaba": "tier_cap_2()", +"e6ac17a1": "tokens_total()", +"e6acca00": "_finishBet(address)", +"e6acf0c1": "determineOutcome(bytes32,uint8[],uint8[])", +"e6ad204e": "vestingAccounts(address,uint256)", +"e6ad5bc7": "getFrozenTimestamp(address)", +"e6adde32": "setIsHiddenMessages(bool)", +"e6ae0536": "UpdateBackedAmount(uint256)", +"e6ae1a97": "getTokenAmount(address)", +"e6ae89b4": "getPlayerInfoInRound(uint256)", +"e6ae92b0": "getItem(address,address)", +"e6ae967b": "updateOrder(bool,uint32,uint128,uint128,uint32,int256)", +"e6af2d5d": "TRICToken()", +"e6af35f0": "calculateFee()", +"e6b09e92": "setAd(string,string)", +"e6b1602f": "buyOneRabbit(uint256)", +"e6b18f52": "LongTermProjectTokensAddress()", +"e6b1c48d": "Amal()", +"e6b1e71c": "jackpot(uint256,uint256)", +"e6b35875": "getAllbetByGtype(int8)", +"e6b55ff3": "TokenEmissionEvent(address,uint256,bool)", +"e6b6f9d5": "baseDiscounts(uint256,uint256,string)", +"e6b71e45": "changeIncrease(address[],uint256[])", +"e6b827a6": "becomeSpermlord()", +"e6b950f3": "_computeCooldownRemainingTime(uint256)", +"e6b96447": "updateMaxNum(uint32)", +"e6b96fe3": "setupFund(bytes32,address,uint256,uint256,address,address,address[],address[],uint8,bytes32,bytes32)", +"e6b972f5": "userName(address)", +"e6ba54c1": "specialInfo(uint256)", +"e6bb64b4": "generateChampionTokens(address,uint256,uint256)", +"e6bb88b3": "setMinEscrow(uint256)", +"e6bbe9dd": "getMinThreshold()", +"e6bc2cc9": "Marcela_Birthday(string,string,string,string)", +"e6bc5269": "CrypexToken()", +"e6bc7d2a": "FairDistributionToken()", +"e6bcbc65": "mostSignificantBit(uint256)", +"e6bcc297": "STARTING_BANKER()", +"e6bd0eca": "newUser(address,string,uint256)", +"e6bd11b2": "availableBuyInShares()", +"e6bf3fdc": "removeFarmer(address)", +"e6bf6ca2": "check_deadline()", +"e6bf70e2": "register(bytes20,uint96,uint32,bytes32[],uint16)", +"e6c01488": "addComment(bytes32,bytes32,string)", +"e6c0459a": "right79(uint256)", +"e6c0e6d5": "discountRate()", +"e6c0e9e1": "randomDS_sessionPubKeysHash(uint256)", +"e6c160dc": "RateSetter()", +"e6c1beb4": "prepend(address)", +"e6c1d7fc": "getHedgeIndices(address)", +"e6c21c24": "isCertified(uint256,uint256)", +"e6c22a11": "district0xNetworkToken()", +"e6c25aa1": "totalPhase2Donations()", +"e6c28db4": "getPlayerSpaceshipCount(address)", +"e6c2dee8": "Vish()", +"e6c2f4fe": "SendmoneySend(uint256)", +"e6c3329d": "EthaToken()", +"e6c35a91": "batchAirDrop(address[],uint256[])", +"e6c3b4ab": "testBalanceAuth()", +"e6c4498b": "LOCKING_UNLOCK_TIME()", +"e6c4a46a": "_addRecord(bytes32,address,string,string)", +"e6c4c2c7": "admin_tokenAdd(uint256)", +"e6c50020": "callAllFromMew(uint256,address)", +"e6c52016": "setToken(address,uint256,address)", +"e6c54139": "BitmassXToken()", +"e6c57a08": "timeIncreasePerTx()", +"e6c5e94c": "setinterval(uint256,uint256)", +"e6c63912": "lastBlock_a17Hash_uint256()", +"e6c721e4": "senderDelegates(address,address)", +"e6c75c6b": "triggerEvent(string)", +"e6c7c456": "balanceOfContract()", +"e6c88b31": "auditor(uint256,bytes32)", +"e6c89d4a": "makeOfferForCityForSomeone(uint16,uint256,address)", +"e6c8fcf1": "getExpirationRequest(uint256)", +"e6c9f6ee": "shelf(string,address)", +"e6ca00b5": "_abortAllRounds()", +"e6ca0f47": "setStages()", +"e6cb9013": "safeAdd(uint256,uint256)", +"e6cbcba9": "PlusOnePonzi()", +"e6cbd74c": "TokenSold(uint256,uint256,uint256,uint256)", +"e6cbe351": "saleAuction()", +"e6cda5ff": "countDays()", +"e6ce1622": "ProcessMarkings(bytes32,uint256,uint256,uint256)", +"e6d02bf0": "unsubscribeCaller(address,address)", +"e6d04d5e": "whitelistedParticipants(uint256)", +"e6d09529": "getTTTCount()", +"e6d0a37d": "RemovePoolMember(address,string)", +"e6d0dfda": "setDiscountTime(uint256)", +"e6d1092d": "vestedTeam(uint256)", +"e6d17238": "specialWallet()", +"e6d17cfc": "_updateToken(uint256,uint256)", +"e6d18a7a": "nihilumBalanceOf(address)", +"e6d20a23": "king_of_returning_shirts()", +"e6d26bc6": "setTeamContractAddress(address,address)", +"e6d2ceab": "set_pool_percentage(uint8)", +"e6d30bf2": "finishMinting(bool,bool)", +"e6d343a5": "getTransContractLocked()", +"e6d3b85b": "getOwnershipForCloning(uint256)", +"e6d3f673": "distributeGeneratedPower(uint256)", +"e6d41b39": "isApprovedTransferer(address,uint64)", +"e6d44122": "limitPreSale()", +"e6d4d217": "addAddressToWhitelist(address,string)", +"e6d54815": "delSpecialPrice(address)", +"e6d55f3a": "buy10ktickets()", +"e6d61f70": "resetInactivityTimer()", +"e6d660dc": "UBT(uint256,string,uint8,string)", +"e6d66ac8": "sendTokens(address,address,uint256)", +"e6d76a76": "withdrawSynthetix(uint256)", +"e6d78add": "tokensPerWei5()", +"e6d7fd33": "TokenERC20(uint256)", +"e6d8a47a": "MIN_INVEST_BUY()", +"e6d8d435": "AMBASSADOR_ONE()", +"e6d944a7": "computeCurrentPrice(uint16)", +"e6d95eb8": "DSAuthorized()", +"e6d970aa": "registry(address,address,bytes32)", +"e6d9bb0f": "secondsUntilEnd()", +"e6da89cd": "addVestingForBeneficiary(address,uint256)", +"e6dab965": "startTrack(bytes32,uint256)", +"e6dad824": "withdrawFrom(uint256)", +"e6db38c7": "purchaseFromTime(uint256)", +"e6dba7e8": "EX()", +"e6dbf486": "setCLC(address)", +"e6dc3655": "_validateUrl(string)", +"e6dc85a3": "weiTotal()", +"e6dc992d": "buySquareAtAuction(uint8,uint256,address)", +"e6dd672c": "enterMainSale()", +"e6dd9a8d": "endBookings()", +"e6deb223": "addPlayerMapping(string,string,uint256,uint256)", +"e6deefa9": "deposit(address,uint16)", +"e6dff3b4": "whitelistInvestor(address,bool)", +"e6e05562": "getIslandPreviousOwners(uint256)", +"e6e08ba4": "openPreICOPrivate()", +"e6e13795": "_addEntry(bytes32)", +"e6e261b2": "getFundAllTx(uint256)", +"e6e2c041": "_removeDiscount(uint256)", +"e6e2e1cd": "VestFFTokens(uint256,uint256)", +"e6e35407": "startCoinFlip(bytes32,bytes32,bytes32)", +"e6e45ea2": "MyHumanStandardToken(uint256,string,uint8,string)", +"e6e46238": "idCount()", +"e6e5b492": "AirwayBill()", +"e6e623d5": "setTokenSymbol(address,bytes32)", +"e6e68cb3": "map(uint256,uint8)", +"e6e7237f": "claim_time_victory(uint256)", +"e6e84bf8": "Suren3Token()", +"e6e88593": "_contractStatus()", +"e6e8c692": "computeResponseFirstHalf(uint256,uint16)", +"e6e91cfc": "voidFailedPayment(uint256)", +"e6e93b14": "setbetEnd()", +"e6eb00ce": "drawingNo()", +"e6eb6867": "updateKey(bytes)", +"e6ecc9c1": "getReservedAmount(address)", +"e6ecf8a0": "CONTENT_FUND()", +"e6ed4746": "setBonus(uint8)", +"e6ed51b7": "createToken(uint256,address,address)", +"e6ed6c74": "getRabbit(uint256)", +"e6ee78bd": "approveRemoveOwnerRequest()", +"e6effbe9": "createAuction(address,uint256,uint256,uint256,uint256,address)", +"e6f02bf9": "computeBonuses(uint256)", +"e6f041c1": "testLessThan()", +"e6f0823c": "deleteNota(uint256)", +"e6f091f9": "isAccepted(address)", +"e6f0b6cf": "individualCapInWei()", +"e6f0beeb": "sort(uint8[4])", +"e6f1a189": "isCustomToken()", +"e6f3ae3c": "neighbor(uint256,uint8)", +"e6f46410": "RBC()", +"e6f47613": "multiSubWithdrawFor(address[],address[])", +"e6f4c4a7": "setOtherSettingOwner(address)", +"e6f602ff": "benTook()", +"e6f6266a": "numMinters()", +"e6f67ef2": "payOrganizer()", +"e6f6b789": "setInterfaceImplementation(string,address)", +"e6f6e19f": "emissionStage()", +"e6f7bf89": "GetOwnerAddress()", +"e6f7ec75": "populateTierRates()", +"e6f8263e": "JackpotPeriods()", +"e6f8298c": "cancelActiveLoanAtIndex(uint256)", +"e6f82ca3": "_clearBridgeTokenFee(uint256)", +"e6f859e7": "descriptions(uint256)", +"e6f9476a": "getContribPeriod()", +"e6f9f265": "areNoncesValid(bytes,uint64[],uint64[])", +"e6fafef0": "ContributionMinimumUpdated(uint256)", +"e6fb5c4a": "CHLToken()", +"e6fbf441": "transferFromSenderPaysFee(address,address,uint256)", +"e6fd2982": "initialReserve()", +"e6fd42ee": "currentHalving()", +"e6fd48bc": "startTimestamp()", +"e6fd604c": "cut()", +"e6febc9b": "investorWithdraw(uint256)", +"e6ff0853": "advisorsTokenWallet()", +"e6ffd50d": "OXGOLD()", +"e6fff409": "TetherGBP()", +"e7001b84": "setOwnedCount(address,uint256,uint256,bool)", +"e700d63a": "FeesConverted(uint256,uint256,uint256)", +"e700efc4": "MaxSupply(address,uint256,bool)", +"e701900c": "refundTransaction(bool)", +"e701a6d3": "handlePresaleTokenMany(address[],uint256[])", +"e701d051": "setMarketerRate(uint256)", +"e70265a5": "FRACTION_ETHER()", +"e7031501": "jackpotWinPercent()", +"e703e9c3": "CheckActivate()", +"e704430d": "numberOfTreasuryOfficials()", +"e70468b1": "cancelOpenBids()", +"e7046bf0": "setFx(address)", +"e704f151": "burnContributorTokens(address)", +"e7058e15": "Rollback()", +"e705a519": "SALE_1WEEK_BONUS()", +"e7062263": "checkEndorsementExists(bytes32,bytes32)", +"e706918c": "testToggleBitSuccess()", +"e7073a4c": "MarketplaceV2(address)", +"e7074de2": "FOUNDATION_TOKENS()", +"e7077a3a": "CCToken()", +"e7084b7e": "closeTimeout()", +"e7092b41": "getAllowance(address,address,address)", +"e7095e97": "mintTo(address,string,uint256,uint256)", +"e70990d7": "summon10()", +"e7099763": "client_wallet()", +"e709cd09": "ONDEONE()", +"e70addec": "right87(uint256)", +"e70b11df": "revokeAllocation(address)", +"e70b5259": "mapHeight()", +"e70b793a": "blankbreedingdata(uint256,bool)", +"e70c052a": "ethFundDepositAddress()", +"e70c3276": "HyipProfitTokenTeamAddress()", +"e70cd5ec": "destroyItemsStorage()", +"e70e690a": "set_gas_price_max(uint256)", +"e70e6ece": "BOURSETOKEN()", +"e70eb392": "claimReward(uint256,address)", +"e70f5d95": "setIV_R3(uint256)", +"e70fe5e3": "GenesisToken(address,uint256)", +"e7105795": "_raceOpened(uint256)", +"e710efc6": "regSpot(uint16,bytes32)", +"e711da27": "writeToStorage()", +"e71264fa": "addNewTokens(uint256)", +"e7127e29": "addressToTrainer(address)", +"e712b694": "comp_count()", +"e712bbad": "enterArena(uint256[4],address)", +"e71346f4": "removeAnimalIdFromCountry(uint256,uint256)", +"e7137dbf": "withdrawETH(address,address,uint256)", +"e713cda8": "returnUint32(uint32)", +"e714a028": "cancelWithdrawalRequest()", +"e7151828": "deathData_v1()", +"e7152a5c": "transferStar(address,uint256)", +"e715920f": "doBuy(address)", +"e717db5c": "CheetahCoin()", +"e717dc3d": "tax_fund()", +"e717ea61": "getCurrentAddress()", +"e718234d": "tokenLock()", +"e71897cd": "alfatokenteam()", +"e718ad01": "ReclaimPeriodChanged(uint256,uint256)", +"e718f7aa": "_Setting_Default_GameBoard(uint256)", +"e7199f82": "transferCentralBanking(address)", +"e71a02e1": "DELAY_PERIOD()", +"e71a402e": "mul_float_power(uint256,uint8,uint8,uint8)", +"e71a5577": "getNumPullRequests()", +"e71a7811": "completeOwnershipTransfer()", +"e71b49ad": "ADDR_TKG_ORG()", +"e71b7913": "expireTransfer(address)", +"e71b8b93": "bye()", +"e71bbf48": "TokenSyndicateFactory()", +"e71bdf41": "addDelegate(address)", +"e71c3b38": "LogSetRBInformationStoreAddress(address)", +"e71c9697": "placeBet(uint256,uint256,uint256)", +"e71d3ae2": "CYFR()", +"e71d77a7": "PRICE_CHANGE_TIME_STEP()", +"e71d7bf0": "testControlTransferNotEnabled()", +"e71df6d6": "acceptMembership(address,uint8,uint256)", +"e71e592b": "replaceDelegates(address[],address[])", +"e71ecf6e": "revenueShareCurrency(address)", +"e71efd18": "Mytoken(uint32,string,uint8,string,address)", +"e7201d7d": "masterOwner()", +"e720b4a7": "DEEM()", +"e720e1b3": "marmoOf(address)", +"e7211134": "createDAO(uint256,string,bytes32)", +"e7212728": "getFreeChicken()", +"e7225175": "timeoutSEC()", +"e722a522": "createContractPeriodicTable(string)", +"e7233ce7": "getAdIds()", +"e7239ed2": "getTimebasedBonusRate()", +"e723a8f9": "setFundraising(address)", +"e724529c": "freezeAccount(address,bool)", +"e7255ef9": "desiredOutcome()", +"e7271c34": "removeArts(address)", +"e7278231": "DesToken()", +"e727de55": "setEggPrice(uint128)", +"e7299675": "DroplexToken()", +"e729b416": "lockIndexes(uint256)", +"e729ebe8": "getSignatureParts(bytes)", +"e72b0e23": "CreateTUBE(address,uint256)", +"e72b6091": "extendSaleTime()", +"e72c40dc": "CoreTeamMinted(address,address,uint256,uint256)", +"e72c81cf": "demo1(address,uint256,bytes,string)", +"e72cba6e": "ICO_PHASE1_AMOUNT()", +"e72e46fd": "ImmlaIco(address,address,uint256,uint256,uint256)", +"e72eb439": "DogTestToken()", +"e72f4f2a": "s38(bytes1)", +"e72f5f63": "maxRandom()", +"e72f7a78": "finishCurrentGame()", +"e72f99ac": "deathData_a18()", +"e72fd4e1": "developerCut()", +"e72fee5d": "massTeamMsgHash()", +"e7302541": "convertOldToken(address)", +"e730e87a": "stageOneSupply()", +"e73140c1": "setPublicOfferingDate(uint256,uint256,uint256)", +"e7316a95": "_set10()", +"e731b034": "HawalaKickoffTime()", +"e731bb09": "cpn(uint256)", +"e7320f9e": "getGameMaxNumberOfBets(uint256)", +"e7326806": "transferOracle(address)", +"e7328000": "userTokenBalances(address)", +"e7329e71": "scheduleCall(bytes,bytes,uint256,uint256,uint8,uint256)", +"e732a7e1": "preAllocationsPending()", +"e7334156": "processNextDeposit(address)", +"e73471fa": "_mintNativeCoinsByErcToNativeBridge()", +"e735b48a": "updateDescription(string)", +"e735f667": "destroyChildren(uint256)", +"e7368a1f": "isOnSale(uint16,uint64)", +"e736f03c": "actived()", +"e7377ccb": "vestingMembers(address)", +"e7383c91": "ICOStarted(uint256,string)", +"e73886b0": "addLocked(address,uint256)", +"e738a7a5": "createDungeon(uint256,uint256,uint256,uint256,address)", +"e738cb69": "EventLogged(string,uint8,uint256,address)", +"e738d2b3": "claimingFee()", +"e7398fa3": "setTokenRate(address,uint256)", +"e73995cd": "setSale(uint256,uint256,uint256,address)", +"e739a4fe": "initialSeed()", +"e73a914c": "setDAO(address)", +"e73b7d77": "testControlCreateNewRevisionNotUpdatable()", +"e73b9e2f": "bridgeAmount(address)", +"e73c032b": "PRESALE_TOKENCAP()", +"e73c3c53": "pingOracle(uint256)", +"e73c6353": "Payroll(address,uint256,uint256)", +"e73c99a0": "METADOLLAR()", +"e73cba34": "getTicketRound(uint256)", +"e73cc2eb": "walletPeriodOf(address)", +"e73cf000": "EMIToken()", +"e73de430": "releaseAccount(uint8,address)", +"e73e5063": "setRewardManagerLimit(uint256)", +"e73fc0c3": "getTokenByName(string)", +"e740ce26": "DSToken()", +"e740f4fc": "card_start_first()", +"e7416f01": "lastBlock_a18Hash_uint256()", +"e7422d29": "sendBalance()", +"e742b943": "ispackagesaleSetup()", +"e742db66": "tokenTaxRate()", +"e742f18a": "Task(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"e743892b": "escrowExpiration(bytes32)", +"e744052b": "FalconFarmer()", +"e745656b": "removeImmigration(address)", +"e7463688": "MasharibTestCoin()", +"e7477f1c": "WithdrawDeposit(uint256)", +"e74799b4": "TOKEN_MIN()", +"e747f31c": "debit(uint256,uint256)", +"e74803db": "putSaleRequest(uint256,uint256)", +"e74915d0": "distribute(address,uint256,address)", +"e74997a8": "transferInternal(string,address,string,address,string,uint256,uint256)", +"e74a19fa": "AirdropTokensHolder(address,address,address)", +"e74a48be": "reservedTokens(address,uint256)", +"e74a5847": "getGladiatorCooldown(address)", +"e74a84ea": "issueToken(address,uint256)", +"e74ab046": "increasePrice_20_January()", +"e74ac94a": "RetailLoyaltySystemToken()", +"e74b981b": "setFeeRecipient(address)", +"e74b9d11": "safeToSubtract(uint256,uint256)", +"e74ba7b3": "getMntTokensPerEth(uint256)", +"e74baeef": "Upgrade(address,bytes)", +"e74cd692": "testNextRune()", +"e74ceb77": "EGGS_TO_HATCH_1CHICKEN()", +"e74d6d1b": "getLeader(address)", +"e74e66d7": "toB32(uint256)", +"e74e6e9e": "GBMToken()", +"e74f3fbb": "claimVestedTokens()", +"e74f8eff": "firstDayTokenLimit()", +"e74ffbd5": "getPart(bytes32,uint256)", +"e750b5c0": "getProjectAddress(string)", +"e7514287": "IsGenesisAddress(address,address)", +"e7519ac0": "_setTokenName(address,uint256,string)", +"e751f271": "execute(bytes32)", +"e75235b8": "getThreshold()", +"e7528e1f": "createSubmission(string,bytes32)", +"e75303a5": "recentWinners()", +"e7530cfc": "_batch3_icosaleStartTimestamp()", +"e7542782": "Recovery(address)", +"e754a4e5": "presale2_startdate()", +"e75528cc": "buyBuilding(uint256,uint256)", +"e75539e7": "Schrodinger()", +"e7556704": "GPSToken()", +"e755aaaf": "takePoint(uint32,int256,bool)", +"e755e077": "MKToken()", +"e755e60f": "settleBetTest(uint256,bytes32)", +"e75623d8": "setDeploymentAdminsContract(address)", +"e75705c7": "submitFakeHeader()", +"e7572230": "getPrice(uint256)", +"e7574128": "abcToken()", +"e757835e": "Yotra()", +"e7579c24": "totalBuyerSupply()", +"e757c17d": "preSalePrice()", +"e75864e4": "StarsICO(uint256,uint256,uint256,address,address,address,address,uint256)", +"e758d445": "getCurrentTierInfo(address,bytes32)", +"e759dfb8": "investorsBatchSize()", +"e75a0747": "Staker()", +"e75afb65": "endCrowdfund(address)", +"e75b4642": "_decreaseAllowance(address,uint256)", +"e75b8b23": "getRecordById(uint256)", +"e75bd44a": "currentPrize(address)", +"e75bf79b": "ESEVENTYSEVEN()", +"e75bf820": "extraTokensHolder()", +"e75cdd7b": "isAddressInServer(uint256,address)", +"e75d1721": "vevcoin()", +"e75dcb19": "partnerSaleTokenPrice()", +"e75e69d6": "TryCoin()", +"e75ea9da": "preICOEndDate()", +"e75ef9b2": "trackSpend(uint256)", +"e75f02e3": "UraniumPlus()", +"e75f1634": "pearlSend(address)", +"e75f6e21": "totalMfr()", +"e7609c16": "getFarmer(address)", +"e760a11a": "attachContracts(address,address,address,address,address)", +"e760d284": "BOOKIES(uint256)", +"e760da9d": "createCP(address,string,string)", +"e760fb06": "groveAddress()", +"e7619fad": "allTokenIds()", +"e761eec6": "RecordTransfer(address,address,uint256)", +"e76240a4": "calcZWCAmountByToken(address,address,uint256)", +"e76261fb": "GetContractStateCancelledByLandlord()", +"e7637b5b": "deleteInfo(uint256,bytes32)", +"e7638445": "getRaffleTimeLeft()", +"e7651d7a": "normalProcess()", +"e7657e15": "ids()", +"e765bc5a": "thirdStageEnd()", +"e765c69a": "betOnDozen(uint256)", +"e765cb44": "auctionMinPrice()", +"e7663079": "owner_()", +"e766d79e": "CrowdsaleEndChanged(uint256,uint256)", +"e767b578": "createPlayerAndAssign(uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8,bytes,string,address)", +"e76895bf": "OwnerAdded(address,bytes32)", +"e7694493": "is_white_listed(address,uint256,bytes)", +"e7696a29": "updateWeedTotal(uint256,bool,uint16)", +"e769dfbd": "buyTransferFee()", +"e769f61f": "private_withdrawAll(address)", +"e76abcb9": "presaleBonusTier2()", +"e76b8126": "finish(address,address,address,address)", +"e76cc0d3": "failWithoutReason()", +"e76dd3ef": "returnBet(uint64)", +"e76e337d": "Honolulu()", +"e76e5ecf": "__DEBUG_BAL()", +"e76e9286": "depositPresale(address,uint256,uint256)", +"e76eabe5": "finishPreIcoAndStartIco()", +"e76ece01": "setInvestStart(uint256)", +"e76ed0e3": "DividendToken()", +"e76f0836": "getcurrNumOfCards()", +"e76f3d5a": "REFERRED_BONUS_PERMILLE()", +"e76f62cd": "Reissue(uint256)", +"e770390d": "deleteMultitoken(uint256)", +"e771066f": "marriageProof(bytes)", +"e7712a94": "MDTCrowdsale(address)", +"e7718594": "totalAccessories()", +"e771e193": "GetCountryCode(uint16)", +"e7722f9b": "isAddressInvited(address)", +"e773c82f": "bonusEnds2()", +"e773ffd5": "queryPlayerUnAwakeSkillIds(uint32[11])", +"e7740cf9": "revealPaper(string)", +"e7751e48": "ownershipAuctionCount(address)", +"e775781b": "getPopularity(bytes32)", +"e775f01f": "CAPToken()", +"e776a5b5": "wallet_address()", +"e776fa22": "AlphaconCrowdsale(bytes32[5])", +"e77772fe": "tokenFactory()", +"e777b97b": "LogRegisteredInterval(uint64,uint64)", +"e777d060": "removeProviderAdmin(address)", +"e7781f3c": "ToppedUp()", +"e77900e9": "projectMemberAddress()", +"e779a8cf": "airLimitCount()", +"e77a6daa": "tokenCalculate(uint256)", +"e77a912f": "prefilled()", +"e77aaee2": "enterRecoveryMode()", +"e77b077f": "canExchange(address)", +"e77b8d94": "ipow(int128,int64)", +"e77ba2c9": "checkIfMegaJackpotWinner()", +"e77c646d": "redeem(uint256,bytes)", +"e77cfa1c": "weiPending()", +"e77db232": "isKYCApproved(address)", +"e77dd5b3": "setSoftCapUSD(uint256)", +"e77df041": "LykkeTokenBase(address,string,uint8,string,string)", +"e77e02d3": "giveAdvisorsTokens(address,uint256)", +"e77ef21f": "drawdown()", +"e77f9906": "gameListOf(address)", +"e77ff2f6": "centralAuthority()", +"e77ff818": "privateSaleEndTime()", +"e780377e": "liquidityPoolAllocation()", +"e7804444": "allowMigrate()", +"e780f6c9": "setDestructionAddress(address)", +"e7810318": "updateInitialBonus(uint256)", +"e781d8c5": "getPC()", +"e7827e85": "unfreezeTokens(uint256)", +"e7829152": "prometh(address)", +"e782b172": "transferWithLockBatch(address[],uint256[],uint256[],uint256[])", +"e783bfb1": "totalAllocatedToTeam()", +"e7843949": "STATE_PAYOUT()", +"e784a923": "thisweek()", +"e7850f2d": "Sunny()", +"e78562c0": "dividendRecentBuyersPercentageDecreaseFactor()", +"e785bab2": "withdrawAdminRevenue()", +"e785daaf": "setUnownedPurchaseableMode(uint256,bool)", +"e786140e": "setBio(bytes3,bytes)", +"e78631fb": "changePhaseToICOweek2()", +"e78686eb": "reclaimContribution(address)", +"e78721af": "getSmartSharingByID(uint256)", +"e7873b58": "tokensBurned()", +"e787418a": "isSubmitted(uint256)", +"e787654c": "_forumIdToAddr(string)", +"e787887b": "initialRewardFraction()", +"e787b523": "CLKToken(address)", +"e788b5eb": "emitAreaSet(uint256,bytes32)", +"e78b8a37": "setPoolSize(uint16,uint32,uint16)", +"e78bfee0": "allocate(address,uint256,uint128,uint256)", +"e78c1136": "CreateLCD(address,uint256)", +"e78c219b": "takeBuy(address,uint256,uint256,address)", +"e78c3462": "betsOff(uint256)", +"e78ce8db": "getCarEarning(uint32)", +"e78ce986": "KOK()", +"e78cea92": "bridge()", +"e78d6306": "getBountyTransfers(uint256)", +"e78dd6f1": "mainSaleTokenLocked()", +"e78e3ab1": "ESOPOpened(address)", +"e78f5412": "_whichCourse(uint256)", +"e78fd9a8": "submitMint(address,uint256)", +"e78ff581": "getProposalPayloadHash(bytes32,uint256)", +"e7906208": "setA_Signature()", +"e790aa9e": "joinMountain(bytes32,address)", +"e791b66c": "Wemark()", +"e79206e6": "finishElections(uint256)", +"e7921023": "getHolderLink(address)", +"e79248ea": "setRelationFrom(uint8,address)", +"e7930d21": "DeliverToken()", +"e7933601": "getOverBalanceWEIInfo()", +"e7933d58": "setIcoPhaseAddress(address)", +"e7938b82": "minAllowedStakeInPercentage()", +"e79487da": "checkInvariant()", +"e7950ede": "logs(bytes)", +"e795c149": "FinalToken(uint256)", +"e79609e2": "getOrCacheDesignatedReportStake()", +"e7964b49": "sendeth(uint256)", +"e796570b": "isClearingPriceValidator(address)", +"e796818e": "AEFTOKEN()", +"e79695da": "WhitelistUpdate(address,bool)", +"e796a6eb": "refund(uint256,address,uint256)", +"e796c43c": "_cancelActiveAuction(uint40,address)", +"e797398f": "IsMultiFreeze(address,address[])", +"e797496b": "sigDestinationApproveAndCall()", +"e7977701": "setLotteryOptions(uint8,uint256,uint16,uint256)", +"e7979efa": "LOG_BetWon(address,uint256,uint256,bytes32)", +"e797ec1b": "enableMinting()", +"e7984a3b": "updateRewardForContributor(address,uint256,string)", +"e7986466": "setSupportedToken(address,bool)", +"e798f4eb": "webpud()", +"e7990596": "getAddressAndBalance(address)", +"e7992845": "pendingInstallments()", +"e7996f07": "removeAttribute(bytes32)", +"e799f374": "fundingMaxInWei()", +"e79a198f": "unregister()", +"e79ab547": "bulkTokenSender(address[],address[],uint256[])", +"e79b4388": "LogBidExpired(uint256)", +"e79d0860": "partnerCount()", +"e79e0a22": "getEthers(uint256)", +"e79e2bd3": "updateArea(uint256)", +"e79e770f": "EmergencySafe()", +"e79faa58": "unpause(string)", +"e79fb53c": "setUSDEtherPrice(uint256)", +"e79ffa11": "_dev()", +"e79ffa99": "getpurchasersLength()", +"e7a01215": "right2(uint256)", +"e7a01352": "adjustHardCap(uint256)", +"e7a02352": "MintDarioToken(address,int256,uint256)", +"e7a0459a": "setCatalogPlayersAddress(address)", +"e7a05f08": "isTokenSaleToken(address)", +"e7a17d83": "emitTaskCreated(uint256,uint256)", +"e7a25bfc": "JustEscrowTestCoin()", +"e7a2e28e": "fishbank()", +"e7a33822": "seal(address,uint256)", +"e7a35405": "managerAddressNumberMap(address)", +"e7a3c218": "testFail_mint_without_add_authority_to_controller()", +"e7a4581a": "getCirculationSupply()", +"e7a49c2b": "trustedTransferTokens(address,uint256)", +"e7a4d9d3": "LIQUID_TOKENS()", +"e7a60a9c": "getValidatorAtIndex(uint256)", +"e7a6e75c": "ETH_USD_rate()", +"e7a7043d": "addPrecommitmentAdjustment(address,uint256)", +"e7a83c74": "AT()", +"e7a8a5cb": "setTier(uint256)", +"e7a95a7f": "WHOLESALE_THRESHOLD()", +"e7aa3afc": "getProjectStatus()", +"e7aa8ed5": "CrowdsaleMCS()", +"e7aab290": "set_s(string)", +"e7ab4f1c": "getShareholderArray()", +"e7ac4df8": "launchInvestment(uint256)", +"e7ac81e5": "productSold(uint64,uint32,string)", +"e7acaa1e": "createJob(bytes32,address,address,uint256)", +"e7acb2b4": "ZitronSupply()", +"e7acdcd0": "deleteInvest(uint32,uint32)", +"e7aef169": "refreshInvestor(address,address,uint256)", +"e7aefd01": "allowTransfersEnabled(bool)", +"e7af4540": "ChiyouCulturalAcchain(uint256,string,uint8,string)", +"e7afae52": "WayCellToken()", +"e7b0f666": "totalPaid()", +"e7b172ed": "GAS_PRICE_LIMIT()", +"e7b1983e": "giveReward(uint256[4],uint32,uint8,bool,uint32[4])", +"e7b1a7ae": "collect_fee(string)", +"e7b1d43c": "withdrawVotingRights(uint256)", +"e7b1d6dd": "setServerStatus(string,uint256)", +"e7b2d7e5": "deprecateAndUpgrade(address)", +"e7b3387c": "getVoteCount()", +"e7b379c6": "TokensUnlocked(address,uint256)", +"e7b43c44": "changePuzzle(uint8,uint8,uint8,uint8,uint8)", +"e7b48d98": "getBurningMans()", +"e7b48f74": "get(int256,address)", +"e7b4e5ab": "entrants(uint256)", +"e7b512ec": "setAddress(bytes32,bytes32,address,bool)", +"e7b5d97d": "getMyReferralDividends()", +"e7b6135d": "getClown(uint256)", +"e7b6805b": "OriginalMyIdRepository()", +"e7b686a7": "UnpackEntity(bytes)", +"e7b69e74": "interest(uint256)", +"e7b6ff08": "beerAndHookersCap()", +"e7b70b38": "getPurchaseInfo(uint256,uint256,uint256,bool,uint256,uint256)", +"e7b7aea5": "changesp2(address)", +"e7b7c2a6": "setup(uint256,uint256,uint256,address,uint256,uint256,string,address,address)", +"e7b808ea": "getAccountFeeModifiers(address)", +"e7b83730": "tokenAmount(uint256,uint256)", +"e7b89977": "setFeeAccount2(address)", +"e7b8d977": "editionsOfType(uint256)", +"e7b94df4": "donationWallet()", +"e7b9aaef": "FIRST_VOLUME_BONUS()", +"e7b9db8d": "confirmBurning(uint256)", +"e7ba1012": "supplyController()", +"e7ba2cc8": "BelottoCrowdsale(uint256,uint256,uint256,uint256,uint256,address,address,address,address,address,address)", +"e7ba6c46": "resetReservations(address,bool)", +"e7bb22cd": "getValidClassId(uint64,address)", +"e7bb5233": "crowdsaleState()", +"e7bbda11": "heroCore()", +"e7bd85ca": "PFGC(uint256,string,string,bool)", +"e7be5617": "setOracleReference(address,address)", +"e7bf5352": "_withdraw(uint128,address,uint256,uint128)", +"e7bf7b08": "GroupCreated(uint32,uint256)", +"e7bf7dfc": "getProductPrice(uint256)", +"e7bfcf57": "HighCoin()", +"e7bfdc93": "clearLevels()", +"e7c0bd15": "SeedLog(address,bytes32,uint256)", +"e7c0dad5": "checkApprovalRatio()", +"e7c0e558": "BoomerangLiquidity(uint256,address)", +"e7c12837": "getPOOL_edit_24()", +"e7c158c6": "_setStrengthValue18(uint256)", +"e7c17972": "btcToTokens_(uint256)", +"e7c4118a": "certIssued()", +"e7c5c27f": "saleOpen(address)", +"e7c5d907": "Broker(bool)", +"e7c6229a": "publicOfferingHolder()", +"e7c6978e": "RSCCoinCrowdsale(address,address)", +"e7c77c80": "getAmountDailybyNum(uint32,uint8[4])", +"e7c8d171": "getTotalWidth(uint16,uint16)", +"e7c8dd6d": "GemsToken()", +"e7c8f61e": "enableAura(uint256,uint256)", +"e7c957c0": "MultiTransact(address,bytes32,uint256,address,bytes)", +"e7ca1343": "setReserveForCompany(address)", +"e7ca438d": "getUserDisplay(address)", +"e7cc62bd": "total_users()", +"e7cc862b": "storehouseIndex(uint256)", +"e7cc8ded": "generateLockupTokensDelegationSchemaHash(address,uint256,bytes32)", +"e7cd4a04": "addWhiteList(address)", +"e7ceaeab": "getTrackOwner(bytes32)", +"e7cf0171": "enableTokenClaiming(bool)", +"e7cf514d": "setMinOrderEthAmount(uint256)", +"e7cf548c": "getBurnCount()", +"e7cf6fcb": "changeEtherTxLimit(uint256)", +"e7cf7b34": "ICO_PRICE3()", +"e7cfafce": "getBirthMonth()", +"e7d00518": "FinishTokensale()", +"e7d0242b": "totalWeiCollected()", +"e7d03e93": "setMaxiumInputEther(uint256)", +"e7d0c552": "getRoyaltyPartners()", +"e7d0c7e7": "timeStampOfCrowdSaleStart()", +"e7d11a44": "getFutureTransByIdx(uint256)", +"e7d137ec": "balancesAddressDescription(address)", +"e7d1a024": "NewOne(address,uint256,uint256)", +"e7d2340f": "playervanity(address)", +"e7d29d8b": "withdrawExtraToken(address)", +"e7d29e38": "addHolderAddress(bytes32,address)", +"e7d2c590": "showCompany(uint256)", +"e7d2f315": "totalSupplys(address[])", +"e7d3fe6b": "mint(uint256,uint256,address)", +"e7d4761b": "unhalt_15day()", +"e7d47c2e": "selflleryManagerWallet()", +"e7d48741": "allOldUsers(uint256)", +"e7d4fd91": "getTokenControlInfo(address)", +"e7d50e5c": "FarmShare()", +"e7d53fcb": "privateSale(address)", +"e7d5a62b": "testNot()", +"e7d80c70": "getOrderCreator(bytes32)", +"e7d854af": "setWithdrawABIHash(bytes32)", +"e7d86204": "registerTeamScores(uint256[])", +"e7d87cda": "arbTokenExists(uint256)", +"e7d8c7db": "MicroToken()", +"e7da257f": "highestBidderCC()", +"e7daaa5a": "OwnerManager()", +"e7dac983": "submitClaim(uint256,uint256,uint256,uint256,uint256)", +"e7dafdb6": "transfer_token(address,address,uint256)", +"e7db6770": "startWork(uint256,bytes32,bytes32,address)", +"e7dde9a3": "_setDailyLimit(uint256)", +"e7de559c": "contrDividends(uint256[])", +"e7de72a4": "createFlag(uint16,uint256)", +"e7dee968": "KittyCore()", +"e7df2f3e": "disburseAddr()", +"e7e00d1d": "assignTestAddresses(bool)", +"e7e024ce": "janwin(uint256,uint256)", +"e7e0ca7b": "tariffIndexForAmount(uint256)", +"e7e10490": "cancelSale()", +"e7e1e69f": "commitBid(bytes32,string)", +"e7e2aa0e": "buyer_cancel()", +"e7e31d52": "setNinjaKindCount(uint8)", +"e7e31e7a": "addSpender(address)", +"e7e3411d": "fechBalanceByAddress(address[])", +"e7e3e167": "rate(address,int256)", +"e7e481c5": "BP_SPARTAN()", +"e7e52369": "firstMembershipPurchase()", +"e7e6aed1": "test_testableStandardCampaignContribution()", +"e7e766ca": "CSCRarePreSaleManager()", +"e7e7e3e8": "ETHEREMON_PROCESSOR()", +"e7e8116e": "forceTransferTokenOwnership()", +"e7e96a43": "getPOOL_edit_2()", +"e7e9e106": "rewardVote(address,address,uint256)", +"e7e9f385": "notarise(bytes32)", +"e7ea3d2d": "usernames(bytes16)", +"e7ea4406": "Civiq()", +"e7ea8065": "setNameRefer(string,address)", +"e7ea8122": "isStateInitializing()", +"e7eaaa05": "totalAvailableForSale()", +"e7eb285f": "stepEtherValue()", +"e7ebc348": "nonActivationWithdrawal(address[2],uint256[8],uint8,bytes32[2])", +"e7ec6aef": "getSigners(bytes32)", +"e7ec8182": "issueTeamTokens()", +"e7edab45": "_cancelParticipation()", +"e7ee6ad6": "rate(uint256)", +"e7ee85a5": "quickBuyPath(uint256)", +"e7eed1f7": "getCurrentPot()", +"e7efcfc2": "totalPayoutAmount()", +"e7f034c1": "getUri(address,uint256)", +"e7f0a865": "transfertokenContract(address)", +"e7f1111e": "initializeHolding(address)", +"e7f18249": "insertShareholder(address)", +"e7f1c468": "UserSold(address,uint256,uint256,uint256,uint256)", +"e7f23cb1": "getCallStack(uint256)", +"e7f35484": "NewAquarium(address)", +"e7f4037a": "demintTokens(address,uint8)", +"e7f40d35": "IntervalBytecodes()", +"e7f44523": "ReceivedLTC(address,uint256,string)", +"e7f4767c": "delimiter()", +"e7f56111": "ClaimPayout(uint8[],bytes32[],bytes32[],bytes)", +"e7f578e1": "createDoc(string,string,string)", +"e7f6edbd": "holdingTax()", +"e7f9e408": "stopTransfer()", +"e7fa443e": "unlockCashpledge(bytes32)", +"e7fa6883": "investFor24Months(address,uint256,uint256)", +"e7fa7969": "assertEq25(bytes25,bytes25)", +"e7fac728": "friendsFingersRatePerMille()", +"e7faecec": "testFailInsufficientFundsTransfers()", +"e7fb5388": "exit(string)", +"e7fb74c7": "buyItem(uint256)", +"e7fbee28": "checkIfCustodiesServedBBD(address[])", +"e7fc4b64": "ricardianVoucher(uint256,string,uint8,string,string,string,uint8,uint8)", +"e7fcde9b": "setFeeType(uint256,uint256,uint256)", +"e7fcf520": "signToResetTokenControlInfo()", +"e7fd9a13": "addEmployee(address,uint256)", +"e7fdc514": "buyFromVault(uint256,uint256,uint256)", +"e7fde97a": "_withdrawDividends(address)", +"e7ff0e38": "bountyDistributed()", +"e7ff8901": "transferWine(address,bytes32)", +"e8001e93": "sellerApprove(address,uint256,bytes32)", +"e80080d0": "cancelBurnRequest(uint256,string)", +"e80160ab": "order(bytes32)", +"e8017bb7": "getHTLCSpendingHash(int256,bytes32)", +"e801a361": "tileTimeoutTimestamp(uint256,address)", +"e8022dc9": "PLAgreements(address,address)", +"e8024468": "getHeroRequiredGoldForLevelUp(uint256)", +"e8024d75": "eNomCoin()", +"e8025d77": "changeStatus(uint256)", +"e8038e25": "TokenSale(uint256,uint256,address)", +"e803b708": "setDetails(string,uint256)", +"e803bcc6": "SetPriceIncrease(uint16)", +"e8046759": "decimals_multiplier()", +"e8055e9c": "burnExcess(uint256)", +"e8069e84": "verify(bytes32,bytes,address,address)", +"e806c603": "robottradingToken()", +"e8071f30": "exponential_decay(uint256,uint256)", +"e8078d94": "addLiquidity()", +"e8083863": "finalizeAuction(uint256)", +"e8088ca2": "GetEvaluate(bytes32,uint8)", +"e808aef7": "isIcoSuccess()", +"e808d671": "crowdsaleTokenMint()", +"e809046f": "NumeraireBackend(address[],uint256,uint256)", +"e80919d5": "mintUnderCap(uint256,uint256)", +"e80a4df7": "NotusNetwork()", +"e80b128f": "tournamentsAddr()", +"e80b7ab6": "clearArray()", +"e80bd3e5": "addCertificationDocumentToSelf(bytes32)", +"e80c4182": "ShresterToken()", +"e80d2ef8": "calculatesubscribersell(uint256)", +"e80d47dd": "USDSTEMPRICE()", +"e80d60b8": "CryptohomaToken()", +"e80db5db": "coreContract()", +"e80f23aa": "tokenApprovalWithSignature(address,address,address,uint256,uint256,uint256,bytes32,bytes)", +"e80f72c0": "getTransactionFromProposal(uint256,uint256)", +"e80fd970": "etherToSendDev()", +"e810267a": "dateEcoRelease6()", +"e8107ed4": "ElectriumToken(uint256,string,uint8,string)", +"e81140a8": "setPreICOStartTime(uint256)", +"e811f50a": "collectedFee()", +"e8125eb9": "updateContractTokenBalance()", +"e814018d": "getCrowdsaleHardCap()", +"e8141f93": "logUint(int256,uint256)", +"e8144c42": "advisorsTokensLock()", +"e8147a25": "changeMinBet(uint256)", +"e814c941": "removeParticipant(address[])", +"e815b60d": "SencToken()", +"e8168177": "lastBlock_a2()", +"e816a515": "takeFlight()", +"e816f76f": "Association(address,uint256,uint256)", +"e8171f37": "valueOfScheme(uint256)", +"e81766e8": "AgriChainDataContract()", +"e8179abf": "getStar(uint256,string,string)", +"e819172a": "TestCoin2()", +"e8197a4b": "totalSuppliedAfterLock()", +"e81a6c58": "issueRefundIfNecessary(uint256)", +"e81b34af": "_deployContract()", +"e81b3c88": "CardCount()", +"e81b53d0": "computeCost(address,bytes32,bool)", +"e81ba080": "updateMaxCap(uint256)", +"e81c17a1": "setOwnerAt(uint16,uint16,uint8,address)", +"e81c2fec": "reDistribution()", +"e81ca129": "consumeTicket(address,uint256)", +"e81cf24c": "replace(uint256,uint256)", +"e81d53cf": "arr()", +"e81d6c6f": "reserveY2()", +"e81dd181": "callSoftCap()", +"e81e0a09": "Win(address,uint8,uint256)", +"e81e1ccc": "withdrawDonation()", +"e81e935a": "summPrivateSale()", +"e81ecb4c": "received(uint64)", +"e81f0154": "pipeIndex()", +"e81f02b6": "withdrawFrom(address,address)", +"e81f35fd": "setLastTokenId(uint256)", +"e81fdd77": "restCandy()", +"e8203e38": "emitWithdrawn(address,uint256,address)", +"e820a32f": "vetoPayout(uint256,uint256)", +"e820ce4a": "setCTime(uint256)", +"e8211eeb": "setUpDistribution(address[],uint256[],uint256)", +"e8223468": "sha3clone(bytes)", +"e8227611": "setRealisation_effective(uint256)", +"e8238688": "setTokenVestingFactory(address)", +"e823b9bf": "toInt256Safe(uint256)", +"e823da03": "VKBToken()", +"e823fa20": "checkDragonStatus(uint256,uint8)", +"e8244d48": "changeHouseEdge(uint256)", +"e824b9c7": "moftakToken()", +"e827653c": "referalCount(address)", +"e827b3e2": "latestPost(address)", +"e827f7f3": "request(bytes32,string,uint256)", +"e827ff89": "HDToken99(uint256,address)", +"e82898b3": "loser()", +"e828a293": "TestyToken()", +"e82906b3": "ISCoin(address)", +"e82935da": "like(uint256)", +"e8294aad": "bonus1Ends()", +"e8297da2": "defaultLockInDuration()", +"e829945a": "buyProperty(uint16,uint256)", +"e829a171": "MIN_GET_AMOUNT_FINNEY()", +"e829d86d": "releaseAgents(address)", +"e82a7d8d": "submitAnswer(address,uint256)", +"e82aa31f": "createTeam(uint256[])", +"e82b7cb2": "proxySetCosignerAddress(address,bytes32)", +"e82bef29": "fundAddress()", +"e82c6e7b": "totalTokenSales()", +"e82c6e8a": "mintFirstTokens(address,uint256,uint256[])", +"e82cc47f": "getFundInfo(bytes32,string,address,address)", +"e82d777c": "FHCContract()", +"e82db7a0": "Batman(uint256,string,string)", +"e82ed40c": "communityContributionWithdraw(uint256)", +"e82f7dd4": "testThrowsRetractLatestRevisionNotUpdatable()", +"e83007b2": "RunLottery()", +"e83029bb": "checkbalance(address)", +"e8303659": "ETHER_CAP()", +"e8307d00": "setMinPurchase(uint256)", +"e8315742": "maxTokens()", +"e831884e": "getPhaseAtTime(uint256)", +"e832b482": "channelConfiguration(uint64)", +"e832fda3": "select_at(uint256)", +"e833bb53": "FLKDForGas()", +"e833cc12": "getNamespace(uint256)", +"e83400f6": "getBudgetOfCampaign(bytes32)", +"e83447d0": "breakLink()", +"e834a834": "claimed()", +"e834e89c": "FlexCoin()", +"e8350fae": "proclaimInactive(uint8)", +"e8358025": "isCrowdSaleFinalized()", +"e835852b": "LogQueryFeeSet(uint256,uint256)", +"e835dd27": "STAKE_MIN_AGE()", +"e837ab59": "getParticipantByAddress(address)", +"e8380983": "BChain(uint256,string,uint8,string)", +"e83851f8": "EtherAsteroid()", +"e8387af8": "_mint(int256,address,uint256)", +"e839554e": "getBasicCentsPricePer30Days()", +"e839e65e": "query2(string,string,string)", +"e83b2adf": "PTestYankeeCoin(uint256,string,string)", +"e83ba1fe": "stageFundGoalReached(uint8)", +"e83c0bba": "setEmployeeTokenAllocation(address,address,address[],uint256[])", +"e83c272c": "setTime2(address,uint256)", +"e83c460d": "TimeWeekOne()", +"e83c78d4": "toggleContractStopped()", +"e83ce1f9": "addAddressAlias(address,address)", +"e83cf468": "sendBattleTokens(address,uint256)", +"e83d1c5e": "LatestRechargeTime()", +"e83d589b": "getLLV_edit_24()", +"e83ded8e": "balanceOfLockTime(address)", +"e83dfe5a": "ConcludeChallenge(uint256,string)", +"e83e0359": "dividendsRightsFixUpdate_(address,uint256)", +"e83e34b1": "maxFees()", +"e83e92ac": "setSalesFee(uint256)", +"e83f682a": "beginContinuousSale()", +"e8400be5": "startBetting(uint32,uint32)", +"e840c116": "SocialNote()", +"e8421b94": "PlayToken()", +"e84221ef": "playBigOrSmall(uint256,uint256)", +"e8425467": "USDDecimals()", +"e8429510": "TokenForInvestor(uint256,uint256,uint256)", +"e8436936": "StatsMinted()", +"e8436ca5": "setMainCampaignStatus(bool)", +"e8443708": "PaygineHasDeployed(uint256)", +"e844ca34": "withdrawTokensToAdvisors()", +"e844cb18": "batatacoin()", +"e844d097": "addCandidate(uint256)", +"e845105c": "countriesLockEndingAt()", +"e846e7c0": "drawPeriod()", +"e846f1f4": "collectPercent(uint256)", +"e846f997": "contributionWallet()", +"e8474230": "getHybridizationFullPrice(uint256)", +"e8477bda": "setBuyMaxLimit(uint256)", +"e847ca9c": "BAXI()", +"e84818bc": "largeContribPercentage()", +"e8489626": "setProxy(address,address,bytes32)", +"e848aba2": "addWhiteListUsers(address[],uint256[],uint256[])", +"e849ec8c": "ChangeTokenContractOwner(address)", +"e84a481b": "adddotchtooffer(uint256,uint256)", +"e84b53bd": "addItemTo(address,uint256,uint256,uint256,uint256)", +"e84b69e4": "editTimer(uint8,uint256)", +"e84c9d5c": "removeWhitelister(address,address)", +"e84d2abf": "inMainSalePeriod()", +"e84d90c0": "checkDisabledStatus()", +"e84d92e8": "_getBridgeNativeFee(uint256)", +"e84f7054": "refundMyIcoInvestment()", +"e84f82f0": "emitBegin()", +"e85034a2": "walletTrade(address,uint256,address,address,uint256,uint256,bool,bytes32)", +"e85061ca": "playerAction(uint256,uint8)", +"e850899a": "StartPreSale()", +"e850a8ef": "payTo(address[])", +"e850e4c4": "GetContractStateEarlyTerminatedByLandlord()", +"e850efaf": "setRegionTax(uint16,uint8)", +"e850f3ae": "getGenerationIdForCall(bytes32)", +"e851808e": "CHARITYSEACOIN()", +"e8518341": "transferOwnershipWithHowMany(address[],uint256)", +"e8518be0": "requestReplaceOwner(address,address,string)", +"e8518dc6": "rateWithBonus()", +"e85230e9": "minETHin()", +"e85353e1": "admin_set_withdraw(address,bool)", +"e85365d5": "firstblock()", +"e8539244": "SetPayrollLocked(bool)", +"e85393d7": "WithdrawEmergency()", +"e853cda3": "checkKncArbitrageRate(uint256)", +"e853ce64": "joinTeam(uint256,uint256)", +"e854d135": "executeWill(address)", +"e854dfb4": "Order(address,uint256,uint256)", +"e854eeb3": "fciDecimals()", +"e85501d8": "revokeRequest()", +"e8554e8b": "getRaceBaseStats(uint256)", +"e855aee5": "_mint(uint256,address)", +"e8561d36": "cashBackFromProject(address,address)", +"e856528a": "mul(uint128,uint128)", +"e8580dd4": "Survey(address,uint256,string,bytes32[])", +"e85ac5b0": "ownerSetAuditor(address)", +"e85b26c0": "createClaim(address,uint256)", +"e85ca2a4": "bitcoin_multisig_vault()", +"e85dcfe8": "ScheduleTransaction(string,uint256,uint256)", +"e85de8e7": "valueInUSD()", +"e85e0bd7": "addToken(uint256,uint256,uint256)", +"e85e3d92": "LongClosed(address,uint256)", +"e85efc50": "assertEq(uint256,uint256,bytes32)", +"e85f3be6": "TOSPrivateHoldingContract()", +"e85f3fb0": "setAuthorizedSpender(address)", +"e86142b5": "orderOnSaleAuction(uint256)", +"e861c4f1": "dividendEndTime()", +"e861dc85": "VETO_PERIOD()", +"e861e34d": "minInvestInWei()", +"e861f077": "HaltStatus(bool)", +"e8625060": "testDisputedInvalidSequenceWrongWriteValue()", +"e863051c": "SmartForestCoin()", +"e86310eb": "exp(address,address,uint256)", +"e863a122": "getPercentageCW()", +"e863d8cc": "repeatedPayment(address,uint256,uint256,uint256)", +"e863f0d3": "acknowledgeOrder(uint256)", +"e8641652": "strCompare(string,string)", +"e86434ef": "startRefundPayment(uint256,uint256)", +"e864f2b6": "exchange(address,uint128)", +"e864fd27": "checkCap(uint256)", +"e8665638": "bonusVestingPeriod()", +"e866d302": "setJackpotWinCount(uint256)", +"e86701e0": "playerFlight(uint256,uint16)", +"e8672de9": "removeRatePlan(uint256)", +"e8679512": "getTransformInfo(uint32)", +"e867ecda": "setPricing(uint256)", +"e8685ba1": "getNumOfCandidates()", +"e8689bf8": "_emitUserRatingGiven(address,address,uint256)", +"e868b55e": "createReaderWriter(bytes32,address,address,bytes32)", +"e868cd17": "ManUnitedSC()", +"e86994ea": "getPropertyColors(uint16)", +"e869d45f": "registerScheme(address,bytes32,bytes4,address)", +"e86a3b8b": "WSIPrivateEquityShare()", +"e86a9b1e": "Custodian(address[],uint256,uint256,address)", +"e86afde0": "description(uint64)", +"e86ba262": "getTimeLimitForReplyOnProposal()", +"e86ba99d": "tryFinalizeProposals(uint256[],address[],bool[])", +"e86bf267": "takeCfd(uint128,address)", +"e86c6431": "isTransferManager(address)", +"e86c87d3": "func_0778()", +"e86cf04b": "TinyProxy(address,uint256)", +"e86d24ca": "getSmartSharingByHash(bytes32)", +"e86d86ea": "totalTransferWhitelistMapping()", +"e86dad29": "assetArray(uint256)", +"e86dea4a": "feeNumerator()", +"e86e3f2a": "setArrIntF1StrF2(int256[],string)", +"e86e52ec": "isBlocked(address,uint256)", +"e86f2c75": "mainSaleSecondBonus()", +"e86f6699": "isWhitelistedAddress(bytes32,uint8,bytes32,bytes32)", +"e870a88e": "setnumMax(uint16)", +"e870bec1": "logging(uint256)", +"e871614a": "getResponseUint(uint256,bytes32)", +"e871f35f": "addCourse(string,uint256,uint256,string,string)", +"e872a05e": "addrMine()", +"e873d02d": "cap2(address)", +"e8742b55": "setComment(string)", +"e87508be": "investorDeposit()", +"e8755d00": "setServiceFee(uint256,uint256)", +"e8756037": "finishExchange()", +"e8757d19": "donations()", +"e875bfbc": "getMinimumFunds()", +"e8763023": "ProofOfAwareness()", +"e876bdef": "getEtherRaised()", +"e876c273": "TotalSupplySet(uint256)", +"e876e3f1": "investorsFee()", +"e87752f4": "icsToken()", +"e8777158": "grantVested(address,address)", +"e877e541": "bankuToken()", +"e877f910": "sendToContract(address,uint256,bytes)", +"e8787040": "ElevenElevenToken()", +"e8789d88": "getEndTimeOfStage(address,uint256)", +"e878d65f": "QIUToken()", +"e879790a": "HHRFallback(address,uint256,uint256)", +"e87a0a59": "EIB()", +"e87a9d84": "phase1AccountTokensMax()", +"e87aa769": "_getShinyPurity(uint16,uint16)", +"e87b0242": "ADVISORS_LOCK_DATES(uint256)", +"e87bbdbb": "spawn(bytes32,address,address)", +"e87c05c6": "restSupply()", +"e87c0ee6": "getGameCount()", +"e87c1463": "bidTicket(uint256)", +"e87da468": "addChild(bytes32,bytes32)", +"e87df70e": "fivetimes()", +"e87e77fe": "switchAirdrop()", +"e87ea055": "checkCurrentStage()", +"e87ed8b5": "RTB2()", +"e87f41bb": "deleteInvestorTokens(address[],uint256[])", +"e87ff056": "getTeamByPosition(uint8)", +"e8801360": "soldTokensCounter()", +"e8814606": "CryptosisToken(uint256,string,string)", +"e882f844": "DINAR()", +"e883429a": "isTransferAllowedteam()", +"e8836183": "blockLock()", +"e88390aa": "coinSendDifferentValue(address,address[],uint256[])", +"e883d157": "outstandingPower()", +"e88499a9": "claimPayout()", +"e8850978": "reportMissingChunk(bytes32,uint256,uint8,bytes32,bytes32)", +"e8853e32": "getData_28()", +"e8854cfd": "getPointer(uint256)", +"e885910f": "trackCrowdsale(address)", +"e885b81f": "Bonuslist(address)", +"e8862924": "decodedLocksroot()", +"e886dade": "bulkTransfer(address,address[],uint256[])", +"e887841e": "to(uint256)", +"e8878b11": "wakeUpProxy()", +"e88810ff": "presalePiDiscount()", +"e8884aee": "_useFromDailyLimit(uint256)", +"e88885fa": "price1Of(uint256)", +"e888e445": "CatalogoOuvidorias(bytes32,uint8,bytes32,bytes32,int256)", +"e88a728f": "getAssetIdOwnerAndOIndex(uint256)", +"e88ab341": "contributorsVestTokenAllocation()", +"e88b0067": "mintInvestment(string,string,uint256,address,uint256)", +"e88b8ac6": "confirmAndCheck(bytes)", +"e88b9436": "MYR_Omnidollar()", +"e88bc2ba": "Variation(address,address)", +"e88c6a8a": "moveToken(address)", +"e88d27eb": "registerProperty(string,string,string,string,string)", +"e88d9567": "changeDepositFee(uint256)", +"e88dc5b7": "rewardPeriod()", +"e88eff06": "setUserRoles(address[],bytes32[],address[],uint8[])", +"e88f3a86": "addBonusToBlock(uint256,uint256,uint256)", +"e88f4510": "LigerToken(address,address,address,address,address)", +"e88f4c6f": "usedCoreSupply()", +"e88f97bd": "query2_fnc(uint256,string,string,string,uint256)", +"e8903656": "executeSubscription(uint256)", +"e8906a2d": "addSigners(address[])", +"e89152ac": "ItemReceived()", +"e8916af9": "addLicenseTerms(bytes32,bytes32,bool,uint256,bool,uint256)", +"e891c9db": "validateWithdrawalSignature(address,uint256,address,address,bool,uint256,uint8,bytes32,bytes32)", +"e8927fbc": "increase()", +"e8928f7a": "setMaxWei(uint256)", +"e8930efd": "Investors(address)", +"e8932ea1": "burnClosedTokenInternal(bytes32)", +"e8936b29": "liveSince()", +"e894000b": "authorizedPower()", +"e89401a1": "multihash(bytes32)", +"e894326c": "addDepositCreator(address)", +"e8944564": "test_insert_findWithHintPrevRemoved()", +"e894f117": "TokenTimelock(address,address,uint64)", +"e8959b94": "addUser(int256)", +"e8974832": "levelTwoBonus(uint256)", +"e89826ac": "addGame(string)", +"e89876d6": "POSController(address,uint256,uint256,uint256,uint256)", +"e89927ef": "voteForCandidate(string)", +"e8992d40": "additionalTotalSupply(uint256)", +"e8997dbd": "setFeesController(address)", +"e899e848": "Fastmarketnetwork()", +"e89a49e2": "setPrivateName(bytes32)", +"e89a4e92": "getFeeRatioForJS(address)", +"e89ac5dd": "OrganizeFunds()", +"e89aeaca": "redeemLand(address)", +"e89b0e1e": "addAccount(address)", +"e89b2564": "Rate5()", +"e89b3ecb": "withdrawPUB()", +"e89b5d4b": "incrementInventory(uint256,uint256)", +"e89b727c": "myTotalStakeAmount()", +"e89b9ff6": "errCounter()", +"e89bc86b": "getBooleanMapCount(string)", +"e89c9b5d": "doThrow(string)", +"e89cdff5": "setTeamName(uint256,string)", +"e89d0d17": "getTeamLeaders()", +"e89d7f23": "payDividend(uint256,uint256)", +"e89df228": "shippingService()", +"e89f0f40": "DTR()", +"e89f3477": "grip()", +"e89f38d4": "BonusToken()", +"e89f5329": "createDebt(uint256,address,uint256)", +"e89f7672": "fight(bytes32,bytes32,bytes32)", +"e89f98a2": "TokenContractChanged(address)", +"e8a01f11": "BagSold(uint256,uint256,uint256,uint256,address,address)", +"e8a0aed3": "createToken(string,string,uint8)", +"e8a0cf44": "getScannersIds()", +"e8a0d312": "issueIndividualTokens(address,uint256)", +"e8a0e3c9": "BigbomPrivateSaleList()", +"e8a12479": "CBCT()", +"e8a1c08f": "nibbleToChar(uint256)", +"e8a207ad": "freeTokensAvailable()", +"e8a21157": "setNonEtherController(address)", +"e8a21382": "calculateInstantBonusAmount(uint256,address)", +"e8a28d52": "changeAllowAllBurnTransfers(bool)", +"e8a2a5ba": "Resolved(address,uint256,uint256,bool)", +"e8a43960": "elixor()", +"e8a478ad": "round0Bonus()", +"e8a481bd": "edit(address,bytes32,bytes32,bytes32,bytes10,bytes32,bytes32,bytes32)", +"e8a4b797": "isTokenApproved(address,uint256)", +"e8a5282d": "setConfig(bytes32)", +"e8a55471": "_transfer(address,uint40)", +"e8a61357": "testInternal(uint256)", +"e8a61cc8": "refundBuyer()", +"e8a62235": "storeAction(address)", +"e8a6d7dc": "START_RATE()", +"e8a71012": "switchCrowdSaleStage()", +"e8a7228b": "hasEnoughValidSignatures(bytes,uint8[],bytes32[],bytes32[])", +"e8a748e7": "whitelistOneAddress(address)", +"e8a7be57": "MRVToken(address,address)", +"e8a7e256": "ownerTopUp()", +"e8a9594f": "rateOfEmissionPerYear()", +"e8a96b46": "getHolder(uint256)", +"e8a97ea8": "StateChanged(uint8,uint8)", +"e8aa1f5e": "makeOwnerBitmapBit(address)", +"e8aa377b": "storeHarvestOperation(string,string,uint32,uint16,uint16,string)", +"e8aa58ce": "vaultToWallet(address,uint256)", +"e8aa6b6f": "TeamtokenRelease4()", +"e8aabf9c": "ownerTransferWeiSecondWallet(uint256)", +"e8aada0c": "ViewBet(address)", +"e8aadc3f": "locationId()", +"e8ab245b": "WarriorsAssignedToBattlefield(address,address,uint256)", +"e8ac0e76": "getPropose(address)", +"e8ac764b": "twoMillionFourHundredThousand()", +"e8aca46a": "addReferral(address)", +"e8aca672": "getNodalblockURL()", +"e8acee9e": "fundPreSale()", +"e8ad1015": "__FindProjects(string)", +"e8ad2369": "getCaseAtIndex(uint256)", +"e8ad6912": "setGasForCLOUD(uint256)", +"e8ad7bcc": "secondTTax()", +"e8adf589": "getRateScale()", +"e8ae7dd2": "getCCH_edit_22()", +"e8ae8c6e": "DescriptionInt()", +"e8af214a": "fundingRemainingAvailableInEth()", +"e8afedd9": "setCommissionTarget(address)", +"e8b0a262": "ICO2Period()", +"e8b13c44": "getChainyTimestamp(string)", +"e8b1d0f3": "relayCall(address,bytes4,bytes)", +"e8b1e825": "getTokenPriceInWeiAndPhaseIdxs()", +"e8b23632": "playerRefundAll()", +"e8b3891e": "userTransferUser(address)", +"e8b3ed65": "addDoc(string,string,string,string)", +"e8b49df2": "payWithEth(uint256,address)", +"e8b4c9d7": "OPEN_PACKAGE_PRICE()", +"e8b50802": "PRESALE_END()", +"e8b5b796": "transferownership(address)", +"e8b5e51f": "invest()", +"e8b611d6": "dailySupply()", +"e8b69081": "checkActionIsAuthorisedAndReset()", +"e8b6bbe4": "feeToSeconds(uint256)", +"e8b6fa80": "claim(int256,int256,int256,int256)", +"e8b9d536": "SingularityNetToken()", +"e8ba2fc9": "FundWallet(address,address)", +"e8ba6509": "isFinished(uint256)", +"e8ba854f": "updateWallets(address,address)", +"e8ba8f8b": "fixPlayerSurname(uint256,string)", +"e8bb7143": "removePackCategory(uint256,bytes4)", +"e8bba4f6": "getDepositedOf(address)", +"e8bc0d40": "activateNextRound()", +"e8bccab3": "Neglect(address,uint256,uint256,int256)", +"e8bd09ff": "GetPlayerNumber(uint8)", +"e8bd5cc4": "NTRYPerEther()", +"e8be2e8e": "NewsContractEntity()", +"e8be3853": "setOffchainPayment(address,bool)", +"e8be73dc": "BenkiICO(address)", +"e8beef5b": "fireEventLog3Anonym()", +"e8befc0d": "getDividends(bool,address)", +"e8bfe5b8": "landmarkPriceStepNumerator()", +"e8bfebec": "ISSUE_METHOD()", +"e8c0485f": "profile(string)", +"e8c09c0d": "verificationHoldersValueMap(address)", +"e8c0a0df": "totalDepositBalance()", +"e8c23649": "referralName(string)", +"e8c28358": "calculateDispensedTokensForGasPrice(uint256)", +"e8c2cb16": "equal(string,string,string)", +"e8c32d13": "DoacaoEvento()", +"e8c3a65f": "save1(address,bytes,string)", +"e8c3e34d": "GetProperty(bytes32,uint256,uint256)", +"e8c494f1": "calcPresaleTokenSupply()", +"e8c4d328": "airDropNumber()", +"e8c4fa04": "coinIssuedGemmyMusic()", +"e8c5ff96": "jackpotLarge()", +"e8c61c4e": "actionB(uint256)", +"e8c66cac": "fundingReserve()", +"e8c67216": "getRateLimit()", +"e8c6ed14": "niceGuy()", +"e8c78934": "disableReservePurchases(address,bool)", +"e8c7df8a": "admin_token_add(uint256)", +"e8c80880": "VestingAddressChanged(address,address)", +"e8c8a52a": "reinvestDivs(uint256)", +"e8c8bb52": "_getRegistry()", +"e8c93aa9": "createProductionUnit7()", +"e8c96256": "Lesson_2(address,uint256)", +"e8c9a3e5": "withdrawnTokens(address)", +"e8c9f9de": "LocalToken(uint256,uint256,string,string,string,address,address,address)", +"e8ca1609": "startNewPayoutPeriod()", +"e8ca3bbb": "auctionsContract()", +"e8cb635b": "checkRequestSignature(bytes,bytes,uint256,bytes)", +"e8cc00ad": "withdrawOwner()", +"e8cf0aca": "depositEthersFor(address)", +"e8cf56a9": "C2L()", +"e8cf86ff": "MyTestCoin()", +"e8cf958e": "setBwMarketValidCaller(address)", +"e8cfc40d": "EtherPrice(uint256,uint8)", +"e8d03e91": "deployBoard()", +"e8d07525": "getLockerAddr(uint256)", +"e8d0affb": "addOwner(address,bool,bytes)", +"e8d0ed31": "sendInvestor(address,uint256)", +"e8d11d9c": "DavidCoin()", +"e8d1891b": "removeOracle(address,uint256)", +"e8d199ec": "BetterBitcoin()", +"e8d1e961": "lockAccount(uint256)", +"e8d320e6": "coinBalanceOf(address,uint8)", +"e8d3280f": "decrement(address)", +"e8d34f5d": "ensureCollateralBalance(uint256)", +"e8d375fe": "week_in_blocs()", +"e8d3a5a9": "joinboard(string)", +"e8d3cad5": "getDepositsLength(address)", +"e8d47923": "fAdd(uint256,uint256)", +"e8d50403": "ChangeDates(uint256,uint256,uint256,uint256)", +"e8d59fae": "PROMO_TOKEN_AMOUNT()", +"e8d663a4": "requalify(address)", +"e8d6b5aa": "TORCToken()", +"e8d6f62d": "p1Of(uint256)", +"e8d70569": "setGameAddress(uint8,address)", +"e8d83383": "whitelistMaxContribAmount()", +"e8d88bd4": "Race()", +"e8d8c3a7": "decreaseApprovalAllArgs(address,uint256,address)", +"e8d9d76a": "WCMY()", +"e8dad6d3": "getOrganizerAddress(uint256)", +"e8dc800c": "setReadings(bytes32,uint256,bool)", +"e8dca673": "throwsWhenSaleIsNotTokenController()", +"e8dcd15f": "NeuralProtocol()", +"e8ddb731": "myshowindex(address)", +"e8ddf15a": "withdrawEthBalance()", +"e8de636c": "add(bytes20,address)", +"e8df0ca1": "checkRefundPollDate()", +"e8dfa50d": "addPigment(address,uint256,uint256,uint256,uint256)", +"e8e03280": "window0EndTime()", +"e8e09563": "PresaleToken(address,address)", +"e8e0d5bf": "getConversionInfo(string)", +"e8e44248": "transferMiner(address,uint256)", +"e8e5882e": "SmartpoolVersion(address[3])", +"e8e72f75": "ownerSetPriceOracle(uint256,address)", +"e8e7426e": "Presale(address)", +"e8e7c73d": "useMonthlyAccess()", +"e8e81fe4": "setTelegram(string)", +"e8e9eeae": "getPremiumCentsPricePer30Days()", +"e8ea0675": "redeemedEscrow(bytes32)", +"e8eb2284": "amountOf(uint256)", +"e8ebf3c5": "iii()", +"e8ecea05": "getSpecialNum()", +"e8ed024e": "LoopringToken(address)", +"e8ed1cdd": "getAccountQuantity()", +"e8edb2ff": "geneticallyEngineer(string)", +"e8edc816": "spender()", +"e8ee8b44": "MIS()", +"e8ee8c75": "deleteCandidateBySnapshotBlock(address,uint256)", +"e8eecf4c": "maxTxValue()", +"e8eed374": "hashTerms(string,string)", +"e8ef51db": "getCCH_edit_15()", +"e8efc1a0": "updatedValue(bytes32)", +"e8efe846": "blocksOwners(uint256)", +"e8f00990": "calcPlayerDivs(uint256)", +"e8f04e84": "disableLotteryGiveHunt()", +"e8f09e24": "getDisableBet(uint256)", +"e8f1736c": "TakeMoney()", +"e8f1bd8c": "getNeighbourhoodOf(uint256)", +"e8f1dc9a": "_unpackMakeData(uint256)", +"e8f35f2c": "updateUSeqvol()", +"e8f38323": "getJobHunterWithdrawalAmount()", +"e8f3cd59": "getFunderContributionClaimed(address)", +"e8f4bc12": "InitUpgradeCard()", +"e8f54364": "JJ(uint256,string,string)", +"e8f5cf36": "changeWCT2Controller(address)", +"e8f62764": "feesController()", +"e8f62f46": "someMethod2(uint256,uint256,uint256)", +"e8f64680": "purchaseFor(address,bytes32,uint256)", +"e8f6bc2e": "changeAccountLevelsAddr(address)", +"e8f72850": "interactWithXYZ()", +"e8f88890": "dev_inStream()", +"e8f8a1d2": "buyBuyerTokens()", +"e8f95666": "transferPreSigned(address,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"e8fa1d51": "handleCloseChannel(address,bytes32,uint256,address,uint256,address,uint256)", +"e8fac4cd": "transfer(address,address,address,address[],uint256,uint256)", +"e8faf89c": "ETHER_MAX_CONTRIB_USA()", +"e8fb02d2": "sellFeeMilliPercent()", +"e8fbc67d": "MultisigWallet(address[],uint256,uint256)", +"e8fc0780": "_malloc(uint256)", +"e8fc451a": "init(uint256,uint256,address,uint256,uint256,uint256,uint256)", +"e8fc9273": "verify(address,string)", +"e8fc9c10": "UnicornContract(address,address,address)", +"e8fcda45": "_set8()", +"e8fe6b66": "getCode(bytes32)", +"e8fe9473": "test_threeInvalidEqUint(int256)", +"e8ff269e": "setMaxAvatarNumber(uint8)", +"e900604d": "claimTokenOwnership(address)", +"e9007d4e": "settleGame(uint256,uint256,string,uint256)", +"e9013cf7": "getFreelancerInvoicesByStatus(address,address,uint8)", +"e9024691": "recoverPreSignedHash(address,bytes4,address,uint256,uint256,uint256)", +"e9024ff5": "modifyMessage(string)", +"e90352eb": "_transferCheck(address,address,uint256)", +"e90389bd": "setWaitingTimeBuffer(uint256)", +"e90459f8": "emitError(bytes32)", +"e906c804": "_distributeBridgeFee(uint256,bool,bool)", +"e906e664": "getx2Policy(address,uint256,uint256,uint256)", +"e90799d2": "unlock4Circulate(uint256)", +"e9083a41": "drainMe()", +"e9084739": "economyBoost(uint16,uint16)", +"e9085957": "RANGESTART_1()", +"e9087eb7": "canMove(address)", +"e908a6d6": "Initialize_PlayUnit(uint256,uint256,uint256)", +"e9092bca": "weeOneEthCanBuy()", +"e90956cf": "setCurator(address)", +"e909ebfa": "addDelegate(address,address)", +"e909f2cc": "updateCancelDistFlag()", +"e90a3cf2": "addressCashwolf()", +"e90ab7fe": "lunetReserve()", +"e90acd53": "bidder(bytes32)", +"e90bcb32": "senderToProxy(address)", +"e90cb9b9": "setBurnAddress(address,address)", +"e90d2120": "etcWallet()", +"e90dae86": "TokenAUC(uint256,string,uint8,string)", +"e90dd9e2": "tokenState()", +"e90e5453": "rand(uint256,uint256,uint256)", +"e90ecfce": "EvoToken(address)", +"e90f84bd": "getETHFromTokens(uint256)", +"e9105cf1": "unblockTokens()", +"e9108538": "mintSilcToken(address,uint256)", +"e91208ad": "galleryFour()", +"e9121758": "token_holders_array(uint256)", +"e9121b12": "transferAndApply(address,uint256)", +"e9126154": "returnLoan(uint256)", +"e912ae4f": "getLastPaidTransaction()", +"e9130d4a": "test_twoInvalidEqBytes()", +"e9140274": "stakeTAOContent(uint256,uint256,bytes8,uint256,string,string,string,string,uint256,address)", +"e914575b": "endPublicIcoForTesing()", +"e9149e34": "investedWei()", +"e914d828": "TimeMoneyToken()", +"e9156cfe": "getMutation(uint32)", +"e916d0f0": "doBalance(address)", +"e916d29e": "matchBytes32Prefix(bytes32,bytes)", +"e91710aa": "DogCoinCrowdsale(uint256,uint256,uint256,uint256,address)", +"e9171abb": "airdropRecipientCount()", +"e91723b2": "aggiungi_candidato(string)", +"e9177f1b": "HTCToken()", +"e917b027": "setProjectManager(address)", +"e917f82d": "OxyCoin()", +"e918268b": "changeDrawer(address)", +"e9187ef4": "refundAction(bytes32,uint256)", +"e9198076": "fillBuyOrderPartially(uint256,uint256,uint256)", +"e919ca10": "getMyDiscount()", +"e91a08a2": "grantedParsecCredits()", +"e91a68bf": "getAllRightLeg()", +"e91b3ac5": "getMutalbeInfo()", +"e91b6987": "addNewObj(address,uint32)", +"e91bb26e": "redeemEgg(address)", +"e91c3a3e": "getStatusInfo()", +"e91cc17c": "withdrawFunder(address)", +"e91ccdc0": "allFundingProcessed()", +"e91cd09d": "thisbalanceETH()", +"e91d1ea0": "downtime()", +"e91dcba1": "MDL()", +"e91df414": "Nurucoin()", +"e91df8da": "AuctionSoldOut(uint256)", +"e91e10af": "allocationFinished()", +"e91e13a9": "CHUNK_SIZE()", +"e91f9d96": "getNftsByOwner(address)", +"e91ff7ca": "STORAGE_WALLET()", +"e921528e": "evTransfer(address,uint256,address,address,uint256)", +"e921b4f8": "buyByAddress(address)", +"e922248e": "MinterFunc(address,uint256)", +"e92254ba": "finaliseFunding()", +"e922ee6f": "removeParent(address)", +"e9233a65": "getNameIds(uint256,uint256)", +"e92340b5": "ICO_BONUS_TIME_2()", +"e923c3d6": "_setUint(bytes4,uint256)", +"e923e707": "hardCapWei()", +"e9253156": "force_deduct_fees()", +"e92565be": "settrans(bool)", +"e9262dae": "changeMinApproval(uint8)", +"e9263f9d": "ifcoinToken()", +"e9266fca": "collectRobot(uint256,uint256,uint256,uint256,uint256)", +"e92704e8": "setGason(uint32,bool)", +"e927a8c0": "changeContracts(address,address,address)", +"e927ca04": "addVesting(address,address,address,string,uint256)", +"e927da3f": "buyPackWithKitty(uint256)", +"e927ea7a": "ballotVoteCount(uint32,uint32)", +"e927f1f9": "getLeaderBoardData(address)", +"e927fc5c": "creatorAddress()", +"e9288d72": "pushToBank(address)", +"e928ad47": "createEthBidAuction(uint256,uint256,uint16)", +"e9298b97": "changePermissions(address,uint8)", +"e92a5d74": "createTimeDecayingToken(uint256,uint256,uint256,uint256,uint256,string,uint8,string,uint8)", +"e92b6818": "CONTRIB_PERIOD1_STAKE()", +"e92b7f4b": "AddVoters(string)", +"e92ba335": "airdropCountLimit1()", +"e92bb686": "_CallAborted(address,bytes32,bytes18)", +"e92bf2a8": "saveData(uint256,bytes32,uint8,bytes32,bytes32,bytes32,address,address)", +"e92c02cf": "startOpenWindow(uint256,uint256)", +"e92d5178": "bankerBeginTime()", +"e92dfb23": "LimitBalance(uint256)", +"e92e4505": "test_9b_testGoodTransfer_thenInvalid()", +"e92e4d63": "setReservingStep(uint256)", +"e92e5c34": "getVoterCount(uint256)", +"e92e5f03": "PRESALE_TOKEN_SUPPLY_LIMIT()", +"e92f2904": "Compra()", +"e92f7447": "isDayThird()", +"e92f8cfc": "MIN_BUYBACK_VALUE()", +"e92f9c1d": "getWarriorsFromIndex(uint256,uint256)", +"e92fdeaa": "ethRec(uint256,uint256,uint256)", +"e930f06f": "setToSaleWallet(address)", +"e930f3a6": "ethContractBalance()", +"e93119d9": "balanceOf(address,address,uint256)", +"e931f1ba": "secondRoundMayEnd()", +"e931fa0c": "setMonsterGene(uint64,uint256)", +"e93239d3": "outputWalletAddress()", +"e9324444": "preSaleState()", +"e93314ab": "getS()", +"e9333fab": "set_admin(address)", +"e9339de5": "Moneda(address,address,address)", +"e933cfb0": "mintCard(uint256,address)", +"e933e6eb": "checkPriceCrowdsale(uint256,uint256)", +"e9347e31": "_sellKeys(uint256,uint256,bytes32)", +"e9348532": "kncRateBlocksTrade()", +"e934ab0c": "ActualCommitteeRoom()", +"e9353cb7": "createProductionUnit3Beta()", +"e9358b01": "newENS(address)", +"e9360096": "cancelCompetition(uint256)", +"e9361d34": "ethartRevenueReward()", +"e93680d5": "_my_transfer(address,address,uint8)", +"e936e878": "disburser()", +"e9377aca": "mtEndTime()", +"e937f689": "_getElement(string,uint256)", +"e938f121": "testFunction(address,uint256,bytes)", +"e9391db9": "getBenificiary()", +"e9395679": "uintToString(uint256)", +"e93a1906": "buyFeeMilliPercent()", +"e93ab977": "bids_ignored_refunded()", +"e93b9c89": "stepVestingPercent()", +"e93ba042": "distributePrices(uint256)", +"e93ba06f": "getWhitelistAt(uint256)", +"e93c5973": "UpdateRequiredSignatures(uint256)", +"e93c980d": "tokenUnit()", +"e93d3e5f": "setNextRoundFee(uint256)", +"e93e25fe": "zilleriumToken()", +"e93e40db": "offerCollectibleForSale(uint256,uint256,uint256)", +"e93e7b26": "Stage3Deadline()", +"e93f29bd": "_setPartitionControllers(bytes32,address[])", +"e93f3f8d": "setBuyPrice(uint256,uint256)", +"e93f57b9": "capAmount()", +"e9408491": "setInitialBal(uint256)", +"e94087d6": "joinAsBroker()", +"e941fa78": "withdrawFee()", +"e94200f1": "burnAllOwnerTokens()", +"e94233f6": "oraclizeGasCost()", +"e942b516": "set(string,string)", +"e942c564": "getWei(uint256)", +"e9433ab6": "endDonations()", +"e943cc01": "powerDayEndTime()", +"e944267c": "FourArt()", +"e9445d5a": "createAudit(uint256,uint256,uint256)", +"e94479a9": "MinterRemoved(address)", +"e944a6d7": "claimSpecialResource(uint256)", +"e944f52d": "addressToBytes(address,address,address)", +"e94559b1": "ETToken()", +"e945c391": "setEndTime(uint64)", +"e945e26c": "CCH_OLI_1()", +"e946115b": "flushVault(uint256,address)", +"e946ad4a": "getUpgradesOwned(address,uint256)", +"e947962b": "pushRefIncome(address)", +"e9482aa6": "UsingANormalStruct()", +"e9485982": "canBePurchasedByETH(uint16)", +"e949fba1": "_getPurchaseToken(address,uint256)", +"e94a4db1": "isSuitableGen(uint256,uint256)", +"e94acf0e": "TinyRouter(address)", +"e94aea8a": "lastStealBlockNumber()", +"e94b6aef": "getLayEggInfo(uint32)", +"e94bc926": "cancelVoteForCandidate(address,address,uint256)", +"e94c8dc0": "NXX()", +"e94d7af6": "getCountAllBuildings(uint256,bool)", +"e94dc568": "freeBalancesOf(address)", +"e94e4bf1": "maxDailyCap()", +"e94e80fa": "playerIndexToApproved(uint256)", +"e94e83d8": "Answer(string)", +"e94f1dc6": "setWhitelistInternal(address,address,uint256)", +"e95015b9": "spawnMonster(uint256,address)", +"e9506c73": "_investAsBonusProgram(address,uint256)", +"e9512fa4": "setVotingQuestions(string,string,string)", +"e9519a6b": "FirexToken()", +"e951c35b": "NewAppleToken()", +"e9523c97": "getAllAdmins()", +"e952f74f": "airdropCount()", +"e9540395": "getRewardDivisor()", +"e9546d08": "increaseK()", +"e95502fb": "lockedShares()", +"e9556430": "SECONDS_PER_MINUTE()", +"e9559803": "getShipById(uint256)", +"e955ee03": "revertNoncsallocation(address)", +"e9560b3b": "getParticipantBalance(address)", +"e95626c5": "Lizun()", +"e95715cb": "jackpotSend()", +"e9577a11": "getHistBtcRate(uint256)", +"e95823ad": "safe(bytes32)", +"e958d15f": "partnerMessagesCount(address,address)", +"e958d1ae": "TreeContract()", +"e9592a9f": "AuctionStarted(uint64,uint64,address)", +"e9596db3": "betInfo(bytes32)", +"e95a644f": "checkIn(uint256)", +"e95ac9f7": "LBToken(address,uint256)", +"e95af01b": "identify(address,address)", +"e95b2bb8": "Ethraffle_v2b()", +"e95b4aa8": "nameOf(address,address)", +"e95bcfb1": "UVDICO()", +"e95bd5f2": "testToData(bytes)", +"e95bee59": "checkFormat(string)", +"e95d0a59": "MarbleEarth(address,address)", +"e95d716c": "FEE_SELECT_MARGIN_SPLIT()", +"e95d74e0": "set_coin_minimum_trade(string,uint256)", +"e95db6f9": "buyKey()", +"e95f206e": "MIN_WEI_AMOUNT()", +"e95f2c7d": "getMaxLoanAmount(uint256)", +"e95f6414": "dayPotExpiration()", +"e95f72e3": "ROD()", +"e95fa798": "SellerCancelDisabled(bytes32)", +"e9600f12": "release(bytes16,address,address,uint256,uint16)", +"e960127e": "set2RoundTime(uint256)", +"e960b940": "DoubleSixToken()", +"e960bb48": "balanceOfLocked(address)", +"e9616fb0": "changeFreezingAgent(address,bool)", +"e962867d": "BillionsToken()", +"e9629d7f": "phase1Cap()", +"e96309e7": "gatherOldBalanceOf(address)", +"e9639c80": "releaseTheOriginal(uint256)", +"e963f3e8": "MAX_BUYIN_GAS_PRICE()", +"e9653482": "hasValidProfile(address)", +"e966668c": "advisorset()", +"e9668128": "isTransactionsAllowed()", +"e9677b6b": "safeExecuteOrder(address,uint256,uint256,bytes,int256)", +"e967a9b7": "dataSourceCallbackExtras(uint256,uint16)", +"e967bb18": "refundAllMoney()", +"e967e60c": "placeBid(string)", +"e968ab95": "enableTokenTransferability()", +"e968d087": "shrink128(uint256)", +"e968e1ec": "setPLATPrice(uint256)", +"e9698f62": "setBurnAmountApproval(address,address,uint256)", +"e969c871": "swapTokens(address[],uint256[])", +"e96a6b38": "getSignerFlagFor(address)", +"e96b462a": "isOwner(address,bytes32)", +"e96b5e13": "SERENITY()", +"e96b8aa6": "bitwordsWithdrawalAddress()", +"e96bf86d": "lastHour()", +"e96cd01c": "SoraToken()", +"e96d01d4": "setPlayerOverrideId(uint256,uint256)", +"e96d36ac": "communityAllocating()", +"e96d6e4f": "publicKeys()", +"e96da99e": "reply(bytes32,uint256)", +"e96e5950": "getEventHash()", +"e96fefec": "resetTransferToValues()", +"e9703701": "byteToUint(bytes1)", +"e970754b": "getTxs(uint256,uint256)", +"e970e86d": "testBlockNumber()", +"e9715de9": "referralBonusPercent()", +"e97193a6": "removeAuthor(address)", +"e971c252": "issue(address[],uint256[])", +"e972261d": "calculateProfit(uint256,uint256)", +"e9733b27": "checkStakeBalance()", +"e9734172": "createWagerAndDeposit(bytes32)", +"e9739db7": "getTokenRate(uint256)", +"e973b7ba": "node_height(uint256)", +"e973f2c4": "reinvest_color(uint256,uint256,uint256)", +"e9742d23": "createGun(uint256)", +"e9748e58": "renewalsCreditAffiliatesFor()", +"e974c000": "checkIsOnlyOwner(bytes32)", +"e97758a2": "thirdRewardPeriodEndBlock()", +"e977992d": "Doubler()", +"e9779b76": "depositOldTokens(address,uint256)", +"e977a11c": "wavesAssetId()", +"e977fa76": "_forceTransfer(address,address,uint256)", +"e9794dc1": "CreateHash(uint8,string)", +"e9799993": "Wafflecoin()", +"e979af97": "pushArray(bytes32,string)", +"e979bac1": "getCustomerBankRating(string)", +"e979fed6": "ownerstake()", +"e97a4779": "evaluateProposalPreCondition(uint256)", +"e97b2190": "add_wall(uint16)", +"e97b7689": "getTotalBuyers()", +"e97b97fe": "neumark()", +"e97cf883": "calculate(uint256,uint256,uint256)", +"e97cfab4": "withdrawDivs(uint256)", +"e97d87d5": "releaseStartTime()", +"e97db66e": "setJackpot()", +"e97dcb62": "enter()", +"e97e490c": "canuse(address)", +"e97e6dca": "applyPresale()", +"e97ed99c": "TurtleFarmer()", +"e97f6313": "token_airdrop_amount_each()", +"e97fe114": "tradeModifiers(address,address)", +"e98096fc": "numberOfNames()", +"e980c2e0": "littafiContentCommit(bytes32,string,string,string,string,bool)", +"e9813f9c": "_distinctOwners(address,address)", +"e981c803": "rejectPauseChange(bool)", +"e982d5a9": "transferOwnership1(address)", +"e9835ee1": "LogAgreementAmended(address,string)", +"e9841bd8": "certifyTradeAsCounterparty(bytes32,address)", +"e98444e8": "BIMI_DAO_31_a()", +"e984d794": "setRarity(uint256,uint256)", +"e984dd74": "ZenixSupply()", +"e985e367": "saleToken()", +"e985e9c5": "isApprovedForAll(address,address)", +"e9867fe7": "_splitElement(uint256)", +"e9874106": "pricePerTicket()", +"e98799e0": "Mejasa()", +"e987cc45": "getfrom(address)", +"e9884b44": "depositClient()", +"e9886064": "_sendPrimordialTokenAndRewardDev(uint256,address)", +"e988998a": "refreeze()", +"e9892821": "isSpendableFrozenCell(address,uint256)", +"e9893c67": "awardAmount()", +"e98a0de7": "setGitHub(string)", +"e98a1439": "priceOfMultiple(uint256[])", +"e98ae339": "cancelMarginCall(bytes32)", +"e98b1679": "set_pre_kyc_bonus_denominator(address,uint256)", +"e98b7f4d": "getKitty(uint256)", +"e98bf38e": "test_insert_zeroKey()", +"e98c365b": "totalMigratedOut()", +"e98c7608": "mod9710(bytes)", +"e98cab50": "burnIndexed(uint256)", +"e98cf987": "turnOnSale()", +"e98d3112": "OwnableWithDAO()", +"e98dcba2": "approveExchange(address,address,uint256)", +"e98df8bf": "registerMeeting(address,uint256)", +"e98e130c": "GetCandidatePrincipal(uint8)", +"e98e8a64": "getKeccak(bytes32)", +"e98ebdd5": "numResponses()", +"e98f402c": "getClassCheckOwner(uint64,address)", +"e98f5708": "Dgp(address)", +"e98fe5ce": "AgriChainType()", +"e9900714": "sendIBTCToken(address,uint256)", +"e991ae55": "valid_weights(int256[],uint256,uint256,uint256[])", +"e9922f12": "getCoinInfoFromId(uint16)", +"e992a041": "_setPendingImplementation(address)", +"e992ae5a": "INCXToken()", +"e992d8d8": "KNC()", +"e992f6cd": "pos(address[],uint256)", +"e99358a5": "TeamtokenRelease2()", +"e9938919": "EnterBetsForRaz(uint256,uint256[])", +"e9938e11": "getPricePerCoin(uint80)", +"e99392c0": "localsAvatar(bytes32,address,bytes32)", +"e993a9c0": "change_flag_hash(bytes32)", +"e993c056": "SaloniToken()", +"e9947583": "addAuditorToMultiRequestAssignment(uint256,address)", +"e995064e": "changeEmployee2(address)", +"e995194f": "transfer(address,uint256,uint256,int256)", +"e99543aa": "Trash(uint256)", +"e9958314": "getRequest(uint32)", +"e9959105": "setMintHelper(address,int256)", +"e99667ad": "OwnershipTransfer(string,address,address)", +"e99671ad": "movePermission(address)", +"e996ee88": "getItemStage(uint256,bytes32)", +"e9970b6c": "isLessThan(uint256,uint256)", +"e99718d8": "addressOf(address,bytes32)", +"e9986f90": "activeStarGenome(address)", +"e9989220": "viewShareholderListing(uint256)", +"e998d2fa": "revokeVerification(address)", +"e998db2a": "directMessage(uint8,string)", +"e99a7a72": "createCeleb(string,uint256,address,uint256[6],uint256[6])", +"e99a7dca": "lastCampaignID()", +"e99b9ab7": "getProposalCreatedOn(address,uint256)", +"e99d2866": "setSeller(address)", +"e99d2db4": "universalToken()", +"e99d7333": "BlitzCrypto()", +"e99ebee2": "dist_multiple_airdrop(address[],uint256)", +"e99ed199": "getAddressLiquidatePool()", +"e9a05055": "newMerchant(address,string)", +"e9a0dd77": "cancelBid(bytes32,int32,bool)", +"e9a158a6": "currentETHPrice()", +"e9a1e689": "PreICO(uint256,uint256,uint256,uint256,address,address)", +"e9a241cc": "checkRoundsNumberToRun()", +"e9a24e24": "userlength()", +"e9a3773c": "setBotContract(address)", +"e9a3f454": "setAgriChainSeal(string)", +"e9a51c0d": "call1(uint256)", +"e9a5605d": "WheelOfFortune(uint256)", +"e9a58c40": "fun(uint256,uint256)", +"e9a59b32": "participantRoundAmount(address,address,uint256)", +"e9a5c776": "THETOKEN()", +"e9a62ba6": "MEGAMALLCOIN()", +"e9a6cce4": "getClaimKeysCount()", +"e9a6fdc3": "addressAt(bytes,uint256)", +"e9a765eb": "checkICOStatus()", +"e9a76ff7": "getInputName(uint256,uint256)", +"e9a78a1e": "decodedNonce()", +"e9a8bae6": "getArray(string)", +"e9a909a2": "setOraclizeAddrResolverI(address)", +"e9a9c1b4": "get_party1_balance()", +"e9a9c50c": "redeemTokens()", +"e9aa80b1": "contributorsAddress()", +"e9ab04a8": "hatchEgg(uint256,string)", +"e9ab1bd7": "True()", +"e9ab77e5": "getTimes()", +"e9ac31f2": "msgdata()", +"e9ac5918": "whatDidJasonSay()", +"e9ad1b38": "findAddressByEndpoint(string,int256)", +"e9ad72d7": "_canLotteryFree(address)", +"e9aeb932": "dUpgradeToPremium(bytes32)", +"e9afa7a1": "signedApprove(address,address,uint256,uint256,uint256,bytes,address)", +"e9afad38": "getTotalVesting()", +"e9b00581": "LogStartWeek(string)", +"e9b04e69": "addSourceForBudget(uint256,uint256,string,bool)", +"e9b07bbf": "transfer(address,uint256,bytes,bytes)", +"e9b0c0e1": "adminContractSecurity(address,bool,bool,bool)", +"e9b18084": "Diary(address,bytes)", +"e9b1f1ce": "updateRandomSource(uint256)", +"e9b23b8b": "updateLeaderboard(address,address)", +"e9b29a9d": "setAPI(address)", +"e9b2f0ad": "unfreezeTokens(address,uint256)", +"e9b32a3f": "HOUSE_EDGE_DIVISOR()", +"e9b3fd39": "TradeBox()", +"e9b48288": "insertMessage(string,bool)", +"e9b4a028": "payAirdrop(address[],uint256)", +"e9b54840": "viewReferral(address,uint256)", +"e9b58225": "extDestroyBot(uint256)", +"e9b5a2f7": "firstWithdraw()", +"e9b62f13": "lastBlock_f4()", +"e9b6953b": "team1Token()", +"e9b85cf4": "SimpleOwnedStorage(string)", +"e9b93569": "OwnerGetFee()", +"e9b991cc": "refundPct()", +"e9ba267e": "distributeETHP(address[])", +"e9ba2e9b": "Storage(uint256)", +"e9ba77fb": "receiveToken()", +"e9ba8698": "TheBillionCoinCash()", +"e9bacc1a": "freeBalances(address)", +"e9bb4aac": "WaltonTokenLocker(string,address,address,uint256)", +"e9bb84c2": "transferEth(address,uint256)", +"e9bbc19e": "Example3(string)", +"e9bc13b8": "_createCanvasInternal(address)", +"e9bc63f7": "getSellInfo(uint256)", +"e9bc9598": "totaltransactions()", +"e9bce432": "yetAnotherTransferTo(address,uint256)", +"e9bd48b8": "VLTToken()", +"e9bd97dc": "getData_24()", +"e9bdab6a": "tips(address,bytes32)", +"e9bec833": "setCrowdsalePause(bool)", +"e9bf42b8": "existenceName(address)", +"e9c003d2": "indexOf(bytes32[],bytes32)", +"e9c1a9c4": "ProcessGame(address,address,bool,uint256)", +"e9c24166": "executeRequest(bytes32)", +"e9c26893": "setValidDurationData(uint256)", +"e9c2fbd5": "Banned(string)", +"e9c31315": "checkBetParity(uint8,address,bytes32,bytes32)", +"e9c33249": "ReceivedBTC(address,string,uint256,string)", +"e9c33dfe": "getHouseEdgeFee(uint256,uint256)", +"e9c35ea8": "universalCall(string)", +"e9c4a3ac": "dispatch()", +"e9c54384": "doesContractImplementInterface(address,bytes4)", +"e9c63b9c": "requestPeerBalance()", +"e9c64ad7": "evRecord(address,uint256,string)", +"e9c6c176": "addBlock(uint256,uint256,bytes32)", +"e9c6ed11": "withdrawNomins(uint256)", +"e9c714f2": "_acceptAdmin()", +"e9c771f2": "KBItoken()", +"e9c801e1": "refundInternal(uint256)", +"e9c9262e": "_productExists(uint256)", +"e9c93ce7": "cbtFundDeposit()", +"e9c9db5c": "ICOcontroller()", +"e9c9f4e0": "_finalizeFailure(uint32,string)", +"e9ca9b2a": "phase1StartingAt()", +"e9cac389": "onlyWhitelistedCanDoThis()", +"e9cafac2": "deleteArray()", +"e9cb364f": "lastTip(address,bytes32)", +"e9cbd678": "_resetBalanceDivis(address)", +"e9cddb1d": "EARLY_BET_INCENTIVE_COMMISSION()", +"e9ceef50": "createCanvas()", +"e9cf287a": "sellerGuaranteeEther()", +"e9cfa745": "calculateNetworkTokenBonusAmount(uint256,uint256,uint256,uint256,uint256)", +"e9cfb399": "SoupToken(string,string)", +"e9d16224": "maxFundedValue()", +"e9d1c598": "isEligibleForAirdrop(address)", +"e9d1d700": "assertFunction()", +"e9d1e422": "JZCoin()", +"e9d36c56": "transferredAmountToReceive(uint256)", +"e9d41d48": "getAuthorizationDataSource()", +"e9d56d2e": "releaseDividendsRightsForce(address,uint256)", +"e9d5d43b": "getWinnerByDrawBlockNumber(uint256)", +"e9d724e5": "changePreIcoEndDate(uint256)", +"e9d7d79a": "SRNT_per_ETH()", +"e9d7f309": "addRemainingTokens()", +"e9d862b0": "_updateTokensAvailable(uint256)", +"e9d8d3d7": "MAX_CONTRIBUTION_DURATION()", +"e9d8dbfd": "isService(address)", +"e9d979dd": "CioCoinERC21Token(uint256,string,string,uint256)", +"e9d9c4a9": "devTokenTimelock()", +"e9d9d5ec": "releaseBBT(address,uint256)", +"e9da12ab": "ATRToken()", +"e9db5d79": "Steak()", +"e9db5f5a": "addSpecialAccount(address)", +"e9db787b": "cancelStack(bytes32)", +"e9dc0614": "vote(bytes)", +"e9dc2e49": "createItem(uint256,uint256,uint256,uint256,uint32)", +"e9dc438e": "confirmAllSells()", +"e9dd7b6c": "getUID(uint256)", +"e9de432f": "testGasPrice()", +"e9de5c0f": "gen(bytes32,uint256)", +"e9de78fd": "TestRobotarCrowdsale()", +"e9deb98c": "presaleConcluded()", +"e9dff847": "withdrawMatingRequest(uint256)", +"e9e04195": "GEEKSID()", +"e9e041f3": "getTotalWeightedContribution()", +"e9e22362": "setWinPercent(uint256[])", +"e9e2990e": "bankManager()", +"e9e2c786": "returnMessage(uint256)", +"e9e30746": "withdrawBankroll(address,uint256)", +"e9e30997": "awardMiniGameAirdrop()", +"e9e32bfb": "firstLevelPrice()", +"e9e3b1cf": "checkAuthenticity(string)", +"e9e43eef": "getLLV_edit_10()", +"e9e44349": "hashLicenseTerms(bytes32,bytes32)", +"e9e48842": "token_unlock_time()", +"e9e48880": "BOUNTY_AMOUNT()", +"e9e55c71": "PRESALE_LEVEL_1()", +"e9e61da5": "updatePolicy(bytes32,address,uint256,uint256,uint256,uint256,bool)", +"e9e69a48": "getCurrentPageSize()", +"e9e7a667": "get_stake(bytes32)", +"e9e7e908": "BlockOfLifeToken(uint256,string,string)", +"e9e972d9": "fileLink()", +"e9e98e76": "WSKYCoin()", +"e9e99d81": "getChannelFeed(address,uint256,uint256,uint256)", +"e9e9b5bc": "setIntF1F2(int256,int256)", +"e9ea666b": "test_remove_singleNode()", +"e9eaa69b": "sweepToOwner()", +"e9ebeafe": "greet(bytes32)", +"e9ec42e6": "getConsistency(uint256)", +"e9ec9e8b": "renounceBurner()", +"e9ecc0cf": "getInvestorsTokens(address)", +"e9ecd32b": "RajTest()", +"e9ed8281": "getDiniRequest(uint256)", +"e9ed8667": "balanceLocks(address)", +"e9ed9b64": "setProposer(address,bool)", +"e9edd759": "CCoinToken()", +"e9edf4cd": "hardwareWallet()", +"e9ee6eeb": "transferAdmin(address,address)", +"e9ef5318": "_isValidLandID(uint8)", +"e9efdd6b": "getByFrom(uint256,uint256)", +"e9f0509f": "Commit(uint256,address,bytes32)", +"e9f0ee56": "addPrice(uint256)", +"e9f12ed3": "itemsByName(string)", +"e9f1c4c3": "f2(uint256,uint256)", +"e9f21537": "setUint(bytes32,bytes32,uint256,bool)", +"e9f29b7b": "setTokenUriPref(string)", +"e9f2dbfb": "makeCommitment(uint256,bytes32,address,address)", +"e9f3b9ee": "triggerSteal(uint32,uint256)", +"e9f4043f": "buyTokens(address,uint8)", +"e9f50b02": "_transferHelper(address,address,uint256)", +"e9f58a52": "rotate_left(uint256,uint256)", +"e9f6af47": "getZethrTokenBankroll(uint256)", +"e9f6bd0b": "numberOfDays()", +"e9f702f2": "createDiamond(string,address,string,string,string,string)", +"e9f84c5b": "ClearToken()", +"e9f88ca5": "ICHAINToken()", +"e9f89121": "getWeeklyJackpot(uint32)", +"e9f8cd70": "addTokenPair(address,address,uint256,uint256,uint256,uint256)", +"e9f90fe6": "listPokemons(address)", +"e9f998ce": "checkInventory(uint256)", +"e9f9d8e2": "unidentifyParticipant(address)", +"e9fa6277": "updateMasks(uint256,uint256,uint256,uint256)", +"e9fa65aa": "updateNextStealTime(uint32)", +"e9fad716": "itemPrice(address,address,uint256,uint256)", +"e9fad8ee": "exit()", +"e9fb078e": "setFreeTime(uint256,uint256)", +"e9fca283": "buy(uint256,bytes32)", +"e9fcc787": "buyCoinsAtICO()", +"e9fd3434": "Cedex()", +"e9fd4e1f": "setAllowCnsContract(bytes32,address,bytes32,bool)", +"e9fd74dc": "create(string,string,uint8,uint256,address,string,address)", +"e9fe799e": "registrantRemove(address)", +"e9fee16f": "refundAll(uint256)", +"e9ffd6de": "allBlockCoordinates(uint256)", +"e9ffdf28": "Erc20Dist()", +"ea00a289": "getStateofContractString()", +"ea00cdb2": "DrazenToken()", +"ea00fad4": "callSender(address,bytes4)", +"ea011db4": "isCustomerHasKYCfromWL(address)", +"ea014645": "PTYC(uint256,string,string)", +"ea020f7b": "WindToken()", +"ea0217cf": "setVotingPeriod(uint256)", +"ea02db0f": "communityPoolAddress()", +"ea03918c": "AGC(uint256,string,string)", +"ea03c115": "getFunctionType()", +"ea045f34": "CROSS_RESERVE_FTX()", +"ea048256": "PROCOIN()", +"ea049958": "stakeScale(address,uint256)", +"ea05667a": "maximumPurchaseFraction()", +"ea0570e0": "convertToBytes32(uint256)", +"ea0599c7": "buyIt()", +"ea05cd01": "addCarProduct(string,uint32,uint32,uint32,uint32,uint32,uint256,uint256)", +"ea061e77": "changeNeat(address)", +"ea06ad02": "postBuyTokens()", +"ea071ac0": "depositShares()", +"ea083b86": "contract_enabled()", +"ea08bb89": "creatureCosts(uint8)", +"ea08ec2c": "accountModifiers(address)", +"ea0930f2": "_currentTime()", +"ea0a5237": "announce(string)", +"ea0a73d2": "TokenGMCT(uint256,string,string)", +"ea0a93e2": "miningLeader()", +"ea0aee14": "BuyStockRocketEvent(address,uint32,uint32,address)", +"ea0d0015": "_bill_all_participants()", +"ea0d1027": "calculateSumToWithdraw()", +"ea0d1702": "verifyEscrowCustomer(uint256,address)", +"ea0d18b0": "CurrenXToken()", +"ea0d5dcd": "getUserStatus(address)", +"ea0d6ad2": "setErrorROFR(bytes)", +"ea0d8da4": "amountReserved()", +"ea0d98aa": "changeParticipants(uint256)", +"ea0f5449": "Transaction(bytes32,address,address,uint256,uint256)", +"ea107240": "deleteRegionData(uint256)", +"ea10b18f": "withdrawMainDivi()", +"ea10d246": "get_orders_sell_amount(address)", +"ea110eda": "setOraclizeGasLimit(uint256,uint256)", +"ea112b6c": "updateCrowdsaleAddress(address)", +"ea116243": "_setCampaign(bytes32,uint256,uint256,uint256,uint256,bool,address)", +"ea118590": "vote_proposed_address(string)", +"ea11e00e": "LogMatchingEnabled(bool)", +"ea1325be": "createTokenUri(uint8,uint8,uint64,uint64)", +"ea135eeb": "computeSha3(uint256[16],uint256[8])", +"ea14457e": "emitRecovery(address,address,address)", +"ea149ab5": "bank2Val()", +"ea14bc11": "box1Star5()", +"ea15f262": "ETHEREAL()", +"ea1642f8": "getManyBalances(address[])", +"ea16c148": "isIcoAgent(address)", +"ea16cee5": "migratestate()", +"ea177073": "nextMaxPlay()", +"ea18e3d5": "getFreeSword()", +"ea19efb5": "startVoting(bytes32)", +"ea1a20d5": "shareholdersWallet()", +"ea1a9537": "IOBSTestToken()", +"ea1b28e0": "maxStake()", +"ea1bbe35": "getIndex(string)", +"ea1bf386": "getNextSellerBOTdata(uint256)", +"ea1c0379": "maximumAllocationPerParticipant()", +"ea1c1690": "timestampToDateTime(uint256)", +"ea1c41be": "RxEALSaleContract()", +"ea1cf495": "ImagodeiToken()", +"ea1d64b8": "startPostIco()", +"ea1da8b9": "updatePresaleMinWei(uint256)", +"ea1df439": "timestampFirst()", +"ea1e4c2d": "Transaction2()", +"ea1e572b": "addOrderBasicFields(uint256,address,uint256,uint256,bytes32)", +"ea1e74ef": "withdrawEtherToIfPossible(address,uint256)", +"ea1eaecb": "buyMinersWithGem(uint64)", +"ea1ecff4": "sendByTranches(bytes32[],address,uint256[],bytes)", +"ea1f2954": "transferSnowflakeBalance(string,uint256)", +"ea1f4082": "RGXToken(string,string,uint256,uint256,uint8)", +"ea1f9b3e": "NoxonInit()", +"ea2028b7": "changeSaleHardcap(uint256)", +"ea212b1e": "withdrawRequest(address,bytes32)", +"ea217d4d": "logSaleStart(uint256,uint256)", +"ea21c6be": "find_and_or_register_user(address,address)", +"ea21d12d": "deleteUncompletableRequest(bytes32)", +"ea222fde": "getAmbientLightControlLimits(bytes32)", +"ea22ee15": "LOG_EmergencyWithdrawalVote(address,bool)", +"ea23c473": "scheduleUpgrade(address,string,string,bytes32,uint256)", +"ea2470ab": "priceLocked()", +"ea251c2f": "owner_BurnUpdateTokenFrom(address,uint256)", +"ea25415a": "getAcceptedGames()", +"ea25f24a": "TokenCreation(uint256,uint256,address)", +"ea26b575": "Eth_Collected()", +"ea273277": "setAyantDroitEconomique_Compte_8(uint256)", +"ea274a6b": "processBuy(address,uint256)", +"ea27a881": "getMinimumEndowment(uint256,uint256,uint256,uint256)", +"ea28baee": "getRealWorldPlayerRosterIndex(uint128)", +"ea295ec2": "calcRevenue(address)", +"ea29a210": "TokenVesting(address,uint256,uint256,uint256)", +"ea2a31fc": "NMK()", +"ea2a33fc": "getInitialREPSupply()", +"ea2a9599": "callThisToStart()", +"ea2bc862": "optionDescription(uint256,uint256)", +"ea2c23da": "createAccounts(uint256)", +"ea2c2f36": "doubleBonus(address)", +"ea2c4357": "newTokenUnlockPercent(uint256)", +"ea2c69d1": "Marijuaneum()", +"ea2ce651": "isTokenUpgrader()", +"ea2d4cf8": "__DeployerFunctions(address,address,uint256)", +"ea2da598": "NLToken()", +"ea2e34f2": "isTransformAgent()", +"ea2ea847": "testChallengeFinalize()", +"ea2f28d3": "countWeeks()", +"ea2f43c3": "currentIncreaseWithdrawalTeamBallot()", +"ea2f9ebe": "retrievePoolFee(uint256)", +"ea2fe1a2": "nay()", +"ea3015b8": "burnUnusedTokens()", +"ea304511": "changeParameters(uint256[],uint256[],uint256[],uint256[])", +"ea30e2e6": "XiaoMuMuToken()", +"ea316027": "creditWalletUserLMNO(address,uint256)", +"ea317f6d": "setdissolveprice(uint256)", +"ea31b291": "getCreatorByTrackId(uint256)", +"ea31c53c": "_openGameLoop()", +"ea31ccb6": "rICO(address,address,address)", +"ea31d56b": "mintTrusted(address,uint256)", +"ea326431": "Neulaut()", +"ea32a8f4": "addshares(uint256,address)", +"ea32c95e": "EMPTY_PUBLIC_KEY_ID()", +"ea3367ae": "divMasterAmt()", +"ea337cdb": "batchChangeHoldPeriod(uint256)", +"ea33dd24": "developer_increase_prices(uint256,uint256)", +"ea341309": "catsRemainingToAssign()", +"ea348da6": "FuckERsToken33()", +"ea352634": "closeChannel(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)", +"ea359082": "End4()", +"ea35df16": "unlockBlock()", +"ea35e805": "calculateWinner()", +"ea364a9a": "addSingleApprovedAddress(address,address,uint8)", +"ea36ad91": "transferERCXTokenInitiation(string,address,address,uint256)", +"ea383176": "month30Allocated()", +"ea391420": "endIcoRound()", +"ea3b3a91": "recoverAddress(bytes32,uint256[3])", +"ea3b9ba1": "enter(uint256,address)", +"ea3bd5df": "purchase(uint256,uint256,address)", +"ea3c281a": "removePartner(address)", +"ea3d2827": "selectWinner(string)", +"ea3d4109": "rateIsStale(bytes4)", +"ea3d508a": "selector()", +"ea3d7e2c": "getOraclizeGas()", +"ea3d895f": "vestingBonusMultiplier()", +"ea3ebae6": "getConfigBool(bytes32)", +"ea3f190e": "devFee2(uint256)", +"ea3f6ce0": "joinGroupAndInvest(uint32,address)", +"ea4061cc": "calculateToFund(address,uint256)", +"ea4099e4": "QuantumPigBlockchain()", +"ea40c9e7": "ARCHETYPALXToken()", +"ea414b28": "setTaxWallet(address)", +"ea41bca5": "doStake(address,uint256,uint256,address,address)", +"ea42418b": "settlementContract()", +"ea428bad": "ACLYDcidTOKEN()", +"ea4354dc": "totalDividendWinners()", +"ea43671d": "watchPercent()", +"ea439e10": "transactionRawToBytes(uint256,address,address,uint256,bool,bool)", +"ea43b069": "PRIVATE_SALE_TOTAL()", +"ea43b79f": "unhaltDirectTrade()", +"ea448370": "setUserEmail(string)", +"ea454da8": "WonderDogToken(uint256,string,uint8,string)", +"ea46193e": "getEtherBalance()", +"ea46336b": "ShiversToken(uint256,string,uint8,string)", +"ea4634a7": "MarginlessCrowdsale(address)", +"ea46d7b9": "TACOS()", +"ea470d33": "voteForAnswer(uint256,address,bool)", +"ea4796b9": "revertIfReturnLessThanMinAndDie()", +"ea47cb24": "ownerAccount()", +"ea486cb1": "moderList()", +"ea490b84": "ethereumForkArbiter()", +"ea49ac03": "allScamsForSale()", +"ea4a294f": "addCard(uint256,uint256)", +"ea4a6aad": "LogQuantity(uint256,string)", +"ea4af029": "ConferenceCertification()", +"ea4afc54": "reserves(address,address)", +"ea4b466b": "admin_deposit(int256,int256)", +"ea4b9dce": "getLastBetNumber()", +"ea4ba8eb": "getOutcome(bytes)", +"ea4c4388": "createCredit(uint256,address,uint256)", +"ea4cc26d": "CryptoPayment()", +"ea4cc7eb": "divvy(uint256,address,uint256)", +"ea4ce239": "totalSale()", +"ea4dfce9": "benAddress()", +"ea4e6ded": "getListOfSupportedTokens()", +"ea4ef51f": "relockPart(address,uint256,uint256,uint256,int256)", +"ea4efa5d": "ganeshrajToken()", +"ea4f0882": "clearVolumeDiscounts()", +"ea503429": "privateSaleWallet()", +"ea5136a1": "adminUpdateSettings(address,address)", +"ea515c98": "pgoUnlockedLiquidityWallet()", +"ea51b3d6": "allocateOwnership(address)", +"ea51c343": "verifyLoanOffering(address[9],uint256[7],uint32[4],bytes32,bytes)", +"ea520b18": "totalDrop()", +"ea5213e1": "removeExternalContributor(address)", +"ea5366c1": "set_contract2address(address,address)", +"ea56a44d": "changeUpgradeMaster(address)", +"ea57712a": "SetFreeMKI(uint256)", +"ea57d818": "EmilToken()", +"ea5815f5": "getDatesForUser(address)", +"ea584ee6": "changeFreeZombiewCount(uint16)", +"ea58c644": "EUSD()", +"ea58c955": "powerDayRate()", +"ea58ca03": "DATE_01_JUN_2018()", +"ea593025": "giveKarma(uint256,string,string)", +"ea595672": "_transfer(address,address,uint32)", +"ea596a34": "EBIT()", +"ea598cb0": "wrap(uint256)", +"ea599cb3": "totalAward()", +"ea59a4e8": "GetPlayer_FromAddr(address,uint8)", +"ea5a13aa": "coindropsTokens()", +"ea5a22eb": "mintax()", +"ea5b2ae2": "checkIsWinner(uint256)", +"ea5b561f": "guardian1Vote()", +"ea5c204b": "MecStandardToken(uint256,string,uint8,string)", +"ea5c3204": "foundersAmount()", +"ea5ea470": "payFunding(uint256)", +"ea60e4ab": "Yusuf()", +"ea60e79b": "preICOLimit()", +"ea612545": "setBorrowAgreement(uint256,uint256,string)", +"ea62f24c": "unlockTeamAdvisorsPartnersTokens()", +"ea636aca": "setNinjaContract(address)", +"ea63ceb6": "allowAccount(address,bool)", +"ea64ad37": "totalUserTransfered()", +"ea64aee5": "GameBidAccepted(address,uint256,uint256,uint256,bytes,bool)", +"ea64faca": "init(string,string,address,uint256,uint256,address,uint256,address)", +"ea650378": "getTokenIDRelateWithTx(bytes32)", +"ea650c7d": "tokenToExchangeSwapOutput(uint256,uint256,uint256,uint256,address)", +"ea663631": "openTimerElapsed()", +"ea66543f": "isEmployee(address)", +"ea669a8a": "setTusdRegistry(address)", +"ea6723cd": "usdMnr()", +"ea680080": "firstAuctionsReferrer()", +"ea681932": "weiWantedOf()", +"ea6825aa": "VieToken()", +"ea6955e5": "ownerWithdrawUnspentCredits()", +"ea6a49ea": "setBetPrices(uint256[])", +"ea6b1377": "MAXTOKENSOLD()", +"ea6b8243": "switchOwnerTo(address)", +"ea6be96f": "estimateTokens(uint256)", +"ea6c1258": "setFSTKCentral(address)", +"ea6c9750": "transferToInvester()", +"ea6ca182": "addAgingTimesForPool(address,uint256)", +"ea6cc6e9": "delayedTokenAllocator()", +"ea6dee80": "addKey(address,address)", +"ea6ef2fe": "teamShare()", +"ea6f0725": "initCompoundContract(address,uint256,uint256,uint256)", +"ea6f1c4a": "sponsorLevel()", +"ea6f67e1": "SingularityTes26()", +"ea6f7f3e": "addAllValidShaHashes()", +"ea7000d6": "buyTokens(bytes32)", +"ea70b4af": "pendingCount()", +"ea70bdad": "attackTileForExistingUser(uint16,uint256,bool,bool)", +"ea726acb": "getReferrerAddr(address)", +"ea727ba2": "changeInterest(uint256[])", +"ea72d9de": "SENS_PER_ETH_BASE_RATE()", +"ea737b54": "getCompte_42()", +"ea74329c": "tokensRemainingPreCrowd()", +"ea74838a": "setControllers(address[])", +"ea7553f0": "vault_wallet()", +"ea75d311": "isBuyOrder(bytes32)", +"ea760a6b": "kkICOTest80()", +"ea760df8": "partner1_vows()", +"ea769e97": "changeTradeState(bool)", +"ea76a36f": "Mahjongcoin()", +"ea770a4c": "getNewCoinsIssued(uint256,uint256,uint256)", +"ea773d9e": "blink()", +"ea77d01a": "buyWarriorChest(uint256)", +"ea77ffd8": "consumeDiscount(uint8,uint8)", +"ea780bf2": "overloadedMethod(address,uint256,string)", +"ea782500": "curr_number()", +"ea7858f5": "player_cancelGame(uint256)", +"ea7873db": "addCompany()", +"ea794ef4": "constructWeaponTokenIdForWinner(uint256,uint256)", +"ea79dd79": "equal(bytes32,bytes32,string)", +"ea79f33d": "uniquenessIndex()", +"ea7a0142": "setRemark1(string)", +"ea7a7184": "testGetBalanceDb()", +"ea7b5df3": "pecunioTokenBalance()", +"ea7c2115": "lookupKittyDetails2(uint256)", +"ea7cabdd": "checkAllOwner(uint256[],address)", +"ea7ceaf7": "stopRefunds()", +"ea7f4d27": "right13(uint256)", +"ea7f537a": "percentOfGoal()", +"ea7f7a59": "finalizeLottery(uint256)", +"ea7f9244": "getRank08()", +"ea801802": "AviaC01n()", +"ea8037d6": "batchEscrowToTeamContract(address,uint32[])", +"ea8118ba": "Trustcoin(address)", +"ea8269f4": "balanceAddress(address,address)", +"ea82fa2a": "VestingScheduleConfirmed(address,address,uint256,uint256,uint256,uint256)", +"ea830cde": "getSendIndex(uint256)", +"ea83add4": "DoTrade(address,address,uint256,address,uint256,address)", +"ea842e65": "deleteTeam(uint256)", +"ea8466dc": "LBQ(uint256,string,string)", +"ea84a6cd": "memberShare(uint256)", +"ea84bfee": "update(address,bool)", +"ea851885": "buyStake(bool)", +"ea85b367": "create(address,int256,address,address)", +"ea85b581": "Deadpool2RottenorFresh()", +"ea85c7ac": "getOriginalSpinnerPrice(uint256)", +"ea863e62": "JorgeToken()", +"ea87003c": "setRenamingCosts(uint256)", +"ea871246": "LOW_RANGE_RATE()", +"ea87152b": "register(string,uint256)", +"ea879634": "getCode()", +"ea87a0aa": "updateItemsPrices(uint256[],uint256[])", +"ea88246d": "Transction()", +"ea885b55": "UNDERWAY_STATUS()", +"ea89c6bc": "TrackChain()", +"ea8a0a23": "PlotTerrainUpdate(uint256,uint256,address,uint256,bytes32)", +"ea8a1af0": "cancel()", +"ea8a4305": "Zigicoin()", +"ea8a66c7": "absoluteMinTimeLock()", +"ea8ab096": "XEV()", +"ea8acb67": "_transferToContract(address,address,uint256)", +"ea8af87d": "sumPreICO1()", +"ea8b03c2": "innerGuess(uint256,uint256,uint256,address)", +"ea8b3e9f": "setFlag(string,uint256)", +"ea8b4627": "playerLastScoredGame(address)", +"ea8b5ca3": "isContractExpired()", +"ea8b73df": "createEthCommunityTokenAndMint(string,uint8,string,uint8,uint256)", +"ea8c1516": "isBlockedAccount(address)", +"ea8d103f": "transferFundToAccount(address)", +"ea8dc8d0": "buyTicket(uint256,uint8)", +"ea8e84a1": "RecoveryEvent(string,address)", +"ea8eb4be": "blockingDuration()", +"ea8eee87": "updatePrivateExhangeRate(uint256)", +"ea8ef515": "airdropSameAmount(address[],uint256)", +"ea8ef6be": "getBranch()", +"ea8f6691": "mintSpecificCard(address,uint8,uint256)", +"ea903c78": "setEndStage3(uint256)", +"ea905308": "LogSaleCapReached(uint256)", +"ea90ad7e": "FAUT()", +"ea91ec69": "TokensReleased(uint256,uint256,uint256)", +"ea91f8c7": "showMyTokenBalance()", +"ea920b2b": "betSummary()", +"ea92c2d0": "usd2wei(uint256)", +"ea92dd1d": "withdaw(uint256)", +"ea932954": "withdraw_token(address,uint256)", +"ea9362de": "maxMintingTime()", +"ea93a324": "getCreateShareTokenCounter()", +"ea941538": "TradeExecute(address,address,uint256,address,uint256,address)", +"ea94c696": "distributeAmount(address[],uint256)", +"ea94eaa2": "CreateTokenByAtes(address,uint256,string)", +"ea95e4d8": "BreezeCoinICO()", +"ea961d78": "decreaseTokensMulti(address[],address,uint256[])", +"ea963a21": "ReconCongress(uint256,uint256,int256)", +"ea9707a3": "getCaptainIndexToCount(uint32)", +"ea9746a2": "FNTCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address,uint256,address,address)", +"ea983f7f": "Alfacoin()", +"ea985057": "BountiesMinted(address,address,uint256,uint256)", +"ea98847b": "withdraw2()", +"ea988ebd": "mine1000(uint256)", +"ea98de9f": "runDividendPayment()", +"ea98e540": "proxyTransferFromToICAPWithReference(address,bytes32,uint256,string)", +"ea98fcf9": "tokenForBounty()", +"ea9960d8": "participate(bytes32[],bytes32[])", +"ea996c9c": "approvedRewardSources(address)", +"ea99e689": "withdrawFeeRate()", +"ea9a3eb5": "AFWToken()", +"ea9ac537": "emitExchangeFeeUpdated(uint256)", +"ea9ae72e": "setPosTokens(uint256)", +"ea9b4be5": "Rearden()", +"ea9b6025": "burnTimeChange()", +"ea9c2859": "CurrentGoldPercentIncrease()", +"ea9c3bb3": "ico2_startdate()", +"ea9c8e63": "addSmartContracts(address[])", +"ea9ce8fd": "redeemToken(bytes)", +"ea9e107a": "acceptRegistrarTransfer(bytes32,address,uint256)", +"ea9e372f": "withdrawImpl(address,address)", +"ea9eb855": "setWLMTPrice(uint256)", +"ea9f0c4c": "Partial20Send()", +"ea9f4968": "withinLimit(uint256)", +"ea9fa768": "newWeiController(address,address,uint256,bool)", +"eaa0e760": "automaticWithdrawLoop(uint256,uint256)", +"eaa1f9fe": "reqisterListening(address)", +"eaa26f0f": "withdrawal_delay()", +"eaa2b2f6": "kill(string)", +"eaa2f447": "BelottoCoin(address)", +"eaa37394": "create(bytes,bytes32,bool,bool,bool,bool,bool)", +"eaa382c2": "isMintingManager(address)", +"eaa40283": "getNewsContractAddress()", +"eaa4077a": "SetICOPhase(address,uint256,uint256,uint256,uint256,uint256)", +"eaa42a15": "_setSnapshotStakeAmount(uint256,address,address,uint256)", +"eaa47de2": "RickAndMortyShrimper()", +"eaa4d4c2": "tokenallowance(address,address)", +"eaa59c74": "rejectShipping(uint256,string)", +"eaa5dd76": "set_prod(uint256,uint256,string,string)", +"eaa61dc2": "changeLicenseTerms(bytes32,bytes32,bool,uint256,bool,uint256)", +"eaa61e91": "BagpackicoToken()", +"eaa643d5": "StandingOrder(address,address,uint256,uint256,uint256,string)", +"eaa8e6d8": "LifeFactor_iii()", +"eaa968cc": "closeBet()", +"eaa9b9a7": "timestamp_ack()", +"eaaad8e9": "masterKeys(address)", +"eaabd05e": "setTokenSwarmHash(address,bytes32)", +"eaac77a7": "priceTokenWeiPreICO()", +"eaac77ea": "supply_cap()", +"eaacc753": "verifyHolder(address,string)", +"eaae46e5": "clearClaims(uint32)", +"eaae7b7e": "sendable(address,uint256)", +"eaaf2489": "_registerContributors(uint256,address)", +"eaaf88c1": "setTeleportContractAddress(address)", +"eaaff394": "getListing(uint64)", +"eab07d42": "GetDayCount(uint256)", +"eab15085": "setData_9(string)", +"eab184b8": "JLCToken()", +"eab228b9": "PRE_ICO_TIER_LAST()", +"eab23779": "validateAndGetTransferFee(address,address,address,uint256)", +"eab27a7c": "getMigrateInReporterValue()", +"eab2d378": "setPauseMode(bool)", +"eab4fb18": "THIRD_PARTY_LOCKUP()", +"eab5cd84": "createHONtokens(address)", +"eab65fb2": "EmpAgreements(address)", +"eab88624": "lockMoney(address,uint256,uint256)", +"eab8d67b": "GetPlayerAt(uint256)", +"eab9eb2d": "sellGrapes()", +"eabbcb4b": "startIco(uint256,uint256,uint256,uint256)", +"eabc8b8e": "canBeBidden(uint256)", +"eabd11af": "RandomNumGenerated(uint64)", +"eabd5dd6": "superman()", +"eabd94ba": "tryUnlock()", +"eabd9e60": "BlackNWhite()", +"eabdd572": "withdrawDAI(address,uint256)", +"eabe09ad": "addr1()", +"eabe7d91": "redeemAllowed(address,address,uint256)", +"eabf1ce3": "Approved(address,address,uint256,string)", +"eabf4240": "mintableTokenAddress()", +"eabffab6": "VestingScheduleRegistered(address,address,uint256,uint256,uint256,uint256)", +"eac037b2": "tierBudget()", +"eac046ce": "AFFBToken()", +"eac116c4": "createKingdom(string,address,address,address,address)", +"eac12cae": "stage1Tokens()", +"eac1e58f": "PRICE_BTCS()", +"eac24932": "setEarlyParicipantWhitelist(address,bool)", +"eac257dc": "StandardTokenImpl()", +"eac2f8d9": "MultiOwnable(address)", +"eac34569": "redeemLottery(uint256)", +"eac38f75": "_rotateRight(bytes32)", +"eac3e799": "target1()", +"eac449d9": "revoke(address,uint256)", +"eac471a0": "cycleLength()", +"eac472bf": "p_setDevPercent(uint256,uint256)", +"eac48278": "mintToFounders()", +"eac50c47": "setOnSale(uint256,bool,uint256)", +"eac533e1": "privateSell2Token()", +"eac5426f": "setOwnTheDayContract(address)", +"eac58572": "transferDuringIntialOffer(address,uint256)", +"eac5a89d": "checkWhitelisted(bytes32,bytes)", +"eac5ab43": "verifyModule(address,bool)", +"eac60b27": "AddTag(address,string)", +"eac66cd8": "getNumberContracts()", +"eac80b2d": "changeVariables(uint256,uint256)", +"eac8221e": "previousRoundsCount()", +"eac8f5b8": "getAsset(uint256)", +"eac9d94c": "averageGen0SalePrice()", +"eaca7a0f": "setBaseTokens(address,address)", +"eacb05d8": "Total_ICOSupply()", +"eacb6c08": "addressToSubscriberCount(address)", +"eacba6c7": "setFounderUser(address)", +"eacbc236": "emitTransferToICAP(address,address,bytes32,uint256,string)", +"eacbe9ca": "removeDeal(bytes16)", +"eacc25e7": "Team_Wallet()", +"eacc501a": "setTransferFeeReceiver(address,address)", +"eacc5b3b": "safeSend(address,uint256,uint256)", +"eaccb2e8": "transferOperationsFunction(address)", +"eacccaf0": "setReward(address,uint256)", +"eacd2141": "ReasignTokens(int256,int256)", +"eacd2ff3": "addCar(string,address,uint256,uint256,uint256,bool)", +"eacde2cb": "tokenIdByIndex(uint256)", +"eace4827": "player_make_bet(uint8)", +"eaced5b7": "setSoldTokens(uint256)", +"eacf7d8a": "MAX_EXPIRE_DELAY()", +"eacfb78a": "getServerName(uint256)", +"eacfc0ae": "Authorized()", +"ead0327d": "getNickName(address)", +"ead04e44": "addressIsSplitter(address)", +"ead0f75a": "capFinalized()", +"ead17f58": "bonusWindow3EndTime()", +"ead1ed5b": "registerPayment(address,uint256,uint256)", +"ead2a439": "getUniqueAddressByIndex(uint256,address)", +"ead2bfdc": "getGamePrize(uint256)", +"ead2fba4": "setApprove(address,address,address,address,uint256)", +"ead3a1de": "QYQ(uint256,string,string,address)", +"ead3c2cf": "multiMint(int256,address[],uint256[])", +"ead490ad": "recoverLeftoversICO()", +"ead491ac": "getMarketDataByTokenIdx(uint256)", +"ead4c32c": "dividendCalculation(uint256)", +"ead4faaf": "Starmid(uint256,string,string,uint8)", +"ead50da3": "frequency()", +"ead5d359": "withdraw(address,uint256,bool)", +"ead710c4": "greet(string)", +"ead81e86": "addCourse(uint256,uint256,string,string,string)", +"ead956c1": "_orderTokens(address,uint256,uint256)", +"eada8645": "GetSchool(uint256)", +"eadb2481": "TransfersEnabled()", +"eadb6e84": "startRitual()", +"eadb6fa9": "deleteAccountsInBulk(address[])", +"eadb80b8": "ownerOfChild(address,uint256)", +"eadc56d2": "betting(uint256)", +"eadcbf39": "MFTcreator()", +"eadd2f91": "distributionTwo(address)", +"eadd94ec": "usdRaised()", +"eadd9c8d": "CabChain()", +"eadddb3c": "getRoomCount()", +"eaddf568": "WhitelistAddressRemoved(address,address)", +"eaddf7b9": "getNextImageId()", +"eadf1f39": "lastBlockRewarded()", +"eadf4672": "checkScope(address,address)", +"eadf6258": "updateRound()", +"eadf9760": "setUint(bytes32,string,uint256)", +"eae00565": "getVotesResult()", +"eae19df4": "tokenReceived()", +"eae3d479": "createItem(uint256,uint256,uint256,uint256)", +"eae445ed": "masternodeInfo(uint256)", +"eae45561": "setWhitelistedBatch(address[])", +"eae4c19f": "deployedAt()", +"eae4e5ce": "getPersonalAirdropAmount(address,address)", +"eae5a62d": "getProposedOwner()", +"eae6754a": "totalEthDeposited()", +"eae70d5e": "setprize(address,uint256)", +"eae7236f": "transferBack(uint256)", +"eae81c37": "getDeployedGames()", +"eae8675d": "getCompanyToken(uint256)", +"eae8a3d6": "setMigrate(address)", +"eae8cf88": "Zitron()", +"eae903e3": "CreatePayroll(address)", +"eae9dbec": "RESERVED_BUSINESS_GROUP()", +"eaea25ec": "blockSubsidy(uint256)", +"eaeb83a2": "User_4()", +"eaec3fc8": "addCantonEmployee(address)", +"eaec75aa": "finalizeBuyback()", +"eaecfca7": "changeBackend(address)", +"eaed2210": "TransactionCancelled(address,uint256,string,address)", +"eaefea72": "addStringTag(bytes32,bytes32)", +"eaf03fc5": "withdrawFromFeeBalance()", +"eaf0ded9": "presale_price_in_wei()", +"eaf16303": "DYC(uint256,string,string)", +"eaf18c45": "setTTMTokenAddress(address)", +"eaf214ea": "changeTxnTax(uint256)", +"eaf2402d": "_getStartIndex(uint64)", +"eaf2a5ef": "itemNum()", +"eaf39a14": "setCustomBonus(uint256)", +"eaf4170c": "implementsSaleClockAuctionListener()", +"eaf4181a": "stopPortalGunAndRick()", +"eaf4438f": "SuperEdge()", +"eaf44931": "TokenReturned(address,uint256)", +"eaf49a82": "numAnimalsXType()", +"eaf4b6df": "allocate3ProjectToken()", +"eaf5815a": "recoverAddr(bytes32,bytes)", +"eaf59375": "returnUnsoldSafe()", +"eaf626c2": "Set(bytes32,address,address,uint256)", +"eaf6d212": "getCertificateSince()", +"eaf7e325": "getNumItems()", +"eaf82213": "getContributionsForAddress(address)", +"eaf8294b": "fundTransfer(uint256)", +"eaf86db3": "isSellingState()", +"eaf8b774": "getAllbetByNum(int8,int8)", +"eaf9144a": "addWhitelister(address)", +"eaf97475": "disableAutoReinvest()", +"eaf98d23": "FEE_PERCENT()", +"eaf994b2": "mintReputation(uint256,address,address)", +"eaf9d194": "updateNameAndSymbol(string,string)", +"eafac339": "ICOendtime()", +"eafb2b7a": "setMembershipType(address,uint256)", +"eafb704f": "majorEventFunc(uint256,bytes32,bytes32)", +"eafc99a7": "frenzyContract()", +"eafde28c": "unwrapEth()", +"eafe5eec": "joinGameWithBalance(uint256)", +"eaff425a": "MIN_JURORS()", +"eaff4b37": "FundsWithdrawn(address,uint256)", +"eaffb3f9": "rebond(uint256)", +"eaffd429": "getOrganisations()", +"eb0030b3": "Paydata(address,uint256,bytes,uint256)", +"eb009642": "mapInvestors(address)", +"eb00f20e": "utilityAccount()", +"eb0166d9": "AccountBalance(string,string,uint256,string,string,uint256,uint256)", +"eb01d83b": "getBidAmount()", +"eb01f42d": "KOIOSTokenPreSale(address,uint256,uint256,uint256,uint256,address)", +"eb0207e3": "hPayMultiSig()", +"eb02c301": "getPosition(uint256)", +"eb03085b": "set_bonus_received()", +"eb0331d5": "destroyAccount()", +"eb03791b": "BastetToken()", +"eb03db73": "suicideFunds(address)", +"eb03e351": "purchased_snt(address)", +"eb03fb71": "winningValue()", +"eb045789": "ChannelSeries(address)", +"eb04c36c": "fundingRaised()", +"eb04df1d": "setRNGCallbackGasConfig(uint256,uint256)", +"eb053fad": "calc(bytes4,bytes32,uint256,address,bytes24)", +"eb05920e": "func_2(string)", +"eb05bfc0": "disableSaleOwner(address)", +"eb0616e5": "gimmePizza()", +"eb068fe5": "F0001Token()", +"eb06980f": "userAtIndex(uint256)", +"eb06e65e": "allowanceFromProxy(address,address,address)", +"eb06ec32": "rewardTaskCompletion(uint256,address)", +"eb08aa3b": "preSaleAddress()", +"eb08b304": "changeMeatProvider(address)", +"eb08dbfc": "emitBurned(address,uint256)", +"eb09ad46": "EthernautsExplore()", +"eb09b5bc": "FUNCToken(uint256,string,string)", +"eb0a70c1": "hasVersion(string)", +"eb0bfa38": "setRegionPrice(uint16,uint256)", +"eb0c9e5a": "verifySignature(address,uint256,uint8,bytes32,bytes32)", +"eb0db6ac": "setChemistryAddress(address)", +"eb0e9240": "checkNumber(uint256)", +"eb0eea61": "Securities_4()", +"eb0f2100": "sweep(uint256,address,uint256,uint8[],bytes32[],bytes32[])", +"eb0f46cc": "revokeAccessMint(address,address)", +"eb0f4b33": "numOwnershipStatuses()", +"eb0f5186": "_determineDefence(uint256)", +"eb0fb0a3": "setTokenToOwner(uint256,address,bool)", +"eb1098b8": "packLimit()", +"eb10b4bd": "getSettingDeprecation(uint256)", +"eb11dd7b": "squirrelReq()", +"eb121e2f": "update(uint256,uint256[101][])", +"eb1257c5": "create(int256,int256)", +"eb12d61e": "addSigner(address)", +"eb12fd82": "setRates(address[],address,uint256[])", +"eb12fef5": "nAddressLog()", +"eb1301a2": "addAddressToUncappedAddresses(address)", +"eb142e36": "_setUserInfo(address,uint64,uint256,address)", +"eb14367d": "layEgg(uint64)", +"eb14b353": "setGenesis(address)", +"eb14f53e": "batchTransferEther(address[],uint256[])", +"eb15d21b": "QiToken()", +"eb1635ed": "getMintingPrice(uint256)", +"eb18747a": "getGoldStatusCode(address)", +"eb18ebdf": "product4()", +"eb18fbe7": "setPreIcoEnd(uint256)", +"eb195635": "IQT_DECIMALS()", +"eb1ab91b": "AtomicSwap(address,uint256,bytes32,uint256)", +"eb1bb9d9": "hybridizationListSize()", +"eb1c6e6b": "getRiskLimits()", +"eb1cae39": "EvNewPrice(uint256,uint256)", +"eb1cfa82": "setMaxDrops(uint256)", +"eb1d380e": "callContractFunctionByAddress(address,string,address,address,uint256,uint256,bool,string,bytes32)", +"eb1d74c8": "UpdatedBonusAccount(address)", +"eb1de3e5": "ICDStopTime()", +"eb1e2cd9": "getPlayerAccountBalance(address)", +"eb1ea5be": "clearTracks()", +"eb1ebd93": "BLS_TOTAL_CAP()", +"eb1edd61": "FEE_ADDRESS()", +"eb1f9c78": "HasDelegateAuthority()", +"eb1fa690": "queryVestingRemain(uint256,uint256)", +"eb1ff845": "changeId(uint256,uint256,uint256)", +"eb222098": "ProGenTech()", +"eb229f1e": "totalSupplyFromInventory()", +"eb230b2d": "bobClaimsDeposit(bytes32,uint256,bytes32,bytes20,address,address)", +"eb239d9a": "timeAdjustNeg()", +"eb245d91": "custodianTransfer(address,address)", +"eb24ffdd": "getCountriesData(uint256[])", +"eb26df0a": "updateDiscounts(uint256[],uint256[])", +"eb28615e": "createCommunityToken(string,uint8,string,uint8)", +"eb28d249": "setMissions(uint256,uint16)", +"eb28ddcf": "_isTAOSignatureAddressValid(address,address,address,uint256)", +"eb290e12": "Mimicoin(uint256,string,string)", +"eb295b27": "getChannelId(address)", +"eb29d9ea": "transferWithEther(address,uint256)", +"eb2a783e": "canBuyExistentToken(uint256)", +"eb2a7c4a": "freeLottery(uint256)", +"eb2b381a": "toDecimals(uint256)", +"eb2b6e95": "PUNDI()", +"eb2bab77": "increasePot()", +"eb2bdbab": "getBUU(bytes32,uint256)", +"eb2bef47": "BetterAuction(address,address,address,uint256,uint256)", +"eb2c0223": "upgradeContract(address)", +"eb2c118a": "ExtTokenPurchase(address,address,uint256,uint256,uint256)", +"eb2c6a19": "setInvestorWhitelist(address,bool)", +"eb2c8408": "setOrganizationDescription(string)", +"eb2c87a4": "partner2_vows()", +"eb2cf098": "get_data_item()", +"eb2f3038": "buyout(address,uint256)", +"eb2f4817": "requestAccess()", +"eb2f8696": "_getCurrentSecret()", +"eb2ff2d2": "softCapPreSale()", +"eb3087bf": "buyFci(address,uint256)", +"eb30db7b": "trade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,string)", +"eb30f57d": "maxEthToRaise()", +"eb31f3d0": "Zoltan()", +"eb321173": "claimStake()", +"eb32cf9b": "saleExchangeRate2()", +"eb338f4e": "raiseMaxNumInterests(uint256)", +"eb343301": "registerCertWithID(bytes32,bytes,bytes32,uint256,bytes32)", +"eb34967a": "gameGeneration()", +"eb34c173": "firstAuctionsStartDate()", +"eb34fa12": "CurrentTLSNProof(address,string)", +"eb357e99": "payment_time()", +"eb35a849": "getSignerby()", +"eb36622d": "readBytes32(bytes32)", +"eb36d549": "WINR()", +"eb36f8e8": "stringToBytes64(string)", +"eb3721be": "getMarketOrder(uint256)", +"eb37df4f": "getGiftsByTemplateId(uint256)", +"eb37ec99": "seasonTopSalesRemain(uint16)", +"eb381429": "mint(int256,uint256,bytes32)", +"eb38615b": "setLiveTx(address)", +"eb39bc90": "setPropertyColors(uint16,uint256[5])", +"eb39f443": "startMintingDate()", +"eb3a2345": "setFunding(bool)", +"eb3a733f": "responseOptions(uint256)", +"eb3a867b": "LogVote(bytes32,bool,address)", +"eb3a88dc": "lockupTokens(address,uint256)", +"eb3b0ab3": "setFeeLocked(bool)", +"eb3b41be": "OrderFulfilled(uint256,uint256)", +"eb3b6891": "throwsWhenTransferingDuringSale()", +"eb3beb29": "silo()", +"eb3c8d7d": "changeMaximumValueWithoutProofOfAddress(uint256)", +"eb3cd55c": "setEveryBidFee(uint256)", +"eb3d032d": "FAPFundDeposit4()", +"eb3de344": "whitelistInvestor(address,string,string)", +"eb3f1b61": "allocateAngelWheelFinanceToken(address[],uint256[])", +"eb3f2427": "plainPay()", +"eb3fa926": "manager_()", +"eb3fee82": "setCompte_16(string)", +"eb40a9c8": "setRecommenderAllow()", +"eb41fbca": "changeTargets(uint256,uint256)", +"eb42b0cb": "payBeneficiaries()", +"eb4435a3": "Github()", +"eb4439fb": "enableVoting()", +"eb446ad8": "WHITELIST_SUPPLIER()", +"eb4475a1": "reducerunmoney(address,uint256)", +"eb44bb04": "frozenPool()", +"eb44dd5d": "preSale5Finished()", +"eb44fdd3": "getMarket(uint256)", +"eb455dc6": "sendBitcoin(string,uint256)", +"eb464316": "TOKENSALE_BLACKLIST()", +"eb46a11a": "setInvestorId(address,bytes32)", +"eb470ebf": "getTimeStamp(address)", +"eb473fc7": "alreadyAvailedOffer(address,address)", +"eb49168f": "getIntervals(bytes32,uint256)", +"eb496a80": "exploitMe(bytes8)", +"eb4999f4": "ticket1price()", +"eb4a2935": "getScribes()", +"eb4b41b2": "disableAmbassadorMode()", +"eb4b8091": "payWinners(address[20],uint256[20])", +"eb4be616": "CanBaoToken()", +"eb4c5593": "FREEZE_END()", +"eb4c5ab9": "createShapeShiftConversionPost(string,string)", +"eb4c9ae7": "claimUpdateToken()", +"eb4d0e32": "redemptionFund()", +"eb4dd8f2": "confirm(address)", +"eb4defcb": "returnCoupon(address[2],uint256[7],uint8,bytes32[2])", +"eb4df824": "getOwnItemCount(address)", +"eb4e64d6": "amendAgreement(string)", +"eb4eecec": "altarFund()", +"eb4f16b5": "addStake(uint256)", +"eb4f17e7": "saleProceedsEtherAllowStale(uint256)", +"eb4f54b2": "TokenRUSD(uint256,string,uint8,string)", +"eb4fe500": "logoVote()", +"eb502d45": "transferProxy(address,address,uint256,uint256,uint8,bytes32,bytes32)", +"eb5068f2": "exitWallet()", +"eb50849e": "setCanAcceptTokens(address,address,bool)", +"eb508932": "lastPayouts(uint256)", +"eb51e2e4": "_popularitySetting(uint256,uint8)", +"eb51e575": "getNextPrizePool()", +"eb5230d7": "ETHERFUNDME_FEE()", +"eb52835b": "nextShareTime()", +"eb52e404": "adminTrade(uint256[8],address[4],uint8[2],bytes32[4])", +"eb531996": "getConversation(address,address,uint32)", +"eb53367a": "delABaddress(string)", +"eb533750": "extLockNinja(uint256,uint16)", +"eb5392ff": "Leonardo()", +"eb53a9a3": "getInitializeNumTicksValue()", +"eb53d273": "getServerNb()", +"eb55b2a3": "replaySweep(address[],address)", +"eb56105d": "marketSize()", +"eb5625d9": "safeApprove(address,address,uint256)", +"eb5653d7": "tokenIdToApproved(uint256)", +"eb570b05": "currentSalePriceInWei()", +"eb57d309": "TenantTerminateMisrep(string)", +"eb581c8f": "ScudoCoin()", +"eb58705b": "_performTransferFromToICAPWithReference(address,bytes32,uint256,string,address)", +"eb5904c0": "setProfitDistributionContract(address)", +"eb59ec82": "setLastMint(address,uint256)", +"eb5a458e": "unregisterByList(address[])", +"eb5a662e": "getAllowance(address)", +"eb5a7033": "getPrefixedHash(address)", +"eb5ae7ad": "set_stop(bool)", +"eb5b135b": "tFinalized()", +"eb5b62b4": "BOPToken(address,uint256)", +"eb5ba3b4": "polyTokenAddress()", +"eb5ba56e": "creator_tablets_count(address)", +"eb5baebf": "MAX_SUPPLY_DECIMAL()", +"eb5bbef8": "withdrawInternal(uint256,bool)", +"eb5bdda0": "allocateAdvisorTokens(address,uint256,uint64,uint64)", +"eb5ce181": "Sample()", +"eb5dd1e3": "shouldPass()", +"eb5dd94f": "updateController(bytes32,address)", +"eb5ea1c0": "RemovePoolCoOwner(string,address)", +"eb5edde3": "bonusPreICO()", +"eb5f2cf8": "InsertCard(uint32,uint32,uint8,uint16,uint16,uint16,uint16,uint32[])", +"eb60082b": "profitsSendable()", +"eb601c70": "Vogeldubastardtoken()", +"eb605e9f": "hasPlayerWagered(address)", +"eb60764f": "getDayCount()", +"eb60c5d7": "DadsToken()", +"eb60e2c7": "setCountPlayersInPosition(uint256)", +"eb614fc7": "locked_allocation()", +"eb6157f7": "Abloxx()", +"eb6192a9": "getMTUBal(address)", +"eb62a013": "Offer(address,address,bytes32,uint256,uint256,uint128,uint256)", +"eb62df61": "acceptOffer()", +"eb639fd0": "luckyPot()", +"eb63e140": "getBuyPriceAfterTax()", +"eb63eadd": "setValue(uint256,uint256,uint256)", +"eb6443a3": "getIntelsByProvider(address)", +"eb64922b": "sendTeamTokens(address)", +"eb64d3e0": "TokenDrain(address,address,uint256)", +"eb64d5ce": "getUnitsStealingCapacity(address,uint256,uint256)", +"eb65a2c7": "crownDecimals()", +"eb663cf2": "LOOMIA_REMAINDER()", +"eb665994": "_0xBitcoinToken()", +"eb6779d4": "test_oneFalseAssert()", +"eb67cee8": "contractSize(address)", +"eb680744": "nextCheckpoint()", +"eb6855e3": "BossToken()", +"eb685867": "withdrawForFourYear()", +"eb685c47": "setTokenPrice(uint256,uint256)", +"eb68b4c7": "sellAura(uint256)", +"eb68ce95": "processRegisterUser(address,address,address)", +"eb6a145b": "extractPartsFromGene(uint256)", +"eb6b192f": "ownerByAddress(address)", +"eb6bbd78": "getUserImages(address)", +"eb6bce5e": "makeBet(uint256,uint256,uint256,uint256,uint256,bytes32,bytes32,address)", +"eb6c4bc8": "monsterIdToGeneration(uint256)", +"eb6d509e": "Test(uint8)", +"eb6d9fb5": "constructOwned()", +"eb6dc7c4": "processBurn(address,uint256)", +"eb6ecc03": "triggerTokenFallbackIfNeeded(address,address,uint256)", +"eb6ed29a": "setCanGetMoneyBack(bool)", +"eb6f80f1": "setPreferredSaleTLYperETH(uint256)", +"eb700331": "getLockTokenSupply()", +"eb70095d": "showVault()", +"eb701349": "updateHpbNode(address,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"eb70696e": "YiWenTest2(uint256,string,string,uint256)", +"eb7085cb": "teamReserveTokens()", +"eb70bc86": "BountyFulfilled(uint256,address,uint256)", +"eb70e13e": "_unpackStrengthValue(uint256)", +"eb70e498": "observer()", +"eb712a48": "etherTransfer(uint256,address[])", +"eb71b7e4": "prepayProposal(address)", +"eb727714": "trustNet()", +"eb73900b": "Whitelist(address)", +"eb7402f5": "multiAccessHasConfirmed(bytes32,address)", +"eb7492d1": "testTotalSupply()", +"eb74fa0b": "BCAClubCoin(uint256,string,string)", +"eb7550d8": "manualFinishGame(uint256)", +"eb75c410": "getOffer(address)", +"eb75dc03": "TOKEN_PRESALE_CAP()", +"eb76174e": "calcProfitInvestorForRead(address,uint256)", +"eb76607d": "creationCap()", +"eb7698e2": "RaffleBitcoinBook(string,uint256)", +"eb770d0c": "setEntryFee(uint256)", +"eb780d3c": "SMILO_FOUNDATION_AMOUNT()", +"eb782d8c": "ContentSeries(address)", +"eb78a26d": "blackFundsWallet()", +"eb78a2af": "checkrespond(uint256,address)", +"eb794dd7": "addBlack(address)", +"eb795549": "safeTransfer(address,uint256,bytes)", +"eb799177": "gasOraclize()", +"eb79ec7c": "withdrawStocks()", +"eb7a10b1": "test_36_assertGasUsage2000Boards()", +"eb7a6471": "getPersonalAirdrop(address,address)", +"eb7a7241": "last_mint()", +"eb7b7006": "getRefundInfo(address)", +"eb7bb9fb": "CrowdsaleHardCapReached(uint256)", +"eb7bdc37": "withdrawSfowns(address)", +"eb7c244d": "amount5kUsdInCents()", +"eb7c6525": "ZbzStandardToken(uint256,string,uint8,string)", +"eb7c6f72": "step6()", +"eb7cdb56": "rankDown(uint256,uint256)", +"eb7db21b": "flip32(bytes32)", +"eb7ea41b": "showLastGlobalAuditTime()", +"eb7f3905": "tradeWithTips(uint256[10],address[4],uint256[10],bytes32[4])", +"eb7f4c0d": "CrowdsalePorto(address,address)", +"eb7fabd7": "getMax(uint64[])", +"eb800846": "setLLV_edit_18(string)", +"eb807339": "getRiskId(uint256)", +"eb80b3d1": "raceDistCon()", +"eb810864": "addTokensMulti(address[],address,uint256[])", +"eb8136f3": "stockTokens()", +"eb81e95a": "controllerBurn(address,bytes32,uint256)", +"eb8222eb": "spendMoney()", +"eb823572": "ProfitContainerAdapter(address,address,address)", +"eb8266b5": "addNumberToDynamicBytes(uint256)", +"eb829aef": "MPTToken(address,address,uint256,string,uint8,string)", +"eb83e2b5": "receiveApproval(address,uint32,address,bytes)", +"eb83f015": "castleContract()", +"eb845c17": "gen0AuctionDuration()", +"eb846c6f": "ReferrerReward(address,uint256)", +"eb854131": "mbtcToUsd(uint256)", +"eb8571c8": "trans(address,address,uint256)", +"eb85c61e": "GUIDEToken()", +"eb85d999": "IVE()", +"eb869b8b": "Scheduled(uint256,uint256)", +"eb87073a": "verifyImages(bytes32,uint256,uint8,uint256,bool)", +"eb87ec01": "newStatus(address)", +"eb880380": "checkCooSeed(uint32)", +"eb886568": "signatureCheckerFreezed()", +"eb88d688": "createCommitment(uint256)", +"eb88e84d": "LatiumSeller()", +"eb89022e": "endDate1()", +"eb8ac921": "test(uint256,uint256)", +"eb8b12d4": "PLATFORM_WALLET()", +"eb8ba66c": "insertStage(uint8,uint256,uint256)", +"eb8bbd28": "getTotalFunds()", +"eb8cad45": "doMarriage()", +"eb8cb983": "LogPauseICO()", +"eb8d2444": "saleIsActive()", +"eb8d3321": "start_PRIVATESALE()", +"eb8e1660": "getPlayerOption()", +"eb8eea15": "totalMainSaleTokenIssued()", +"eb8fa486": "contributionInCauldron(uint8,address)", +"eb8fb32c": "setPercentageToKill(uint8)", +"eb8fb3ec": "getConstraint(bytes32,address,address)", +"eb90450f": "getFirstBuyerAddress(uint256)", +"eb907398": "changeSoftCap(uint256,uint256)", +"eb90fff8": "blockContract()", +"eb91385a": "UnauthorizedAccess(address,bytes4)", +"eb91b5ac": "ALUXToken(uint256,string,string)", +"eb91d37e": "getCurrentPrice()", +"eb9220ab": "updateRent(uint256)", +"eb9253c0": "seize(address,uint256)", +"eb931024": "passKYC(address)", +"eb935e70": "bigbrother()", +"eb93c515": "burnUpdateToken(uint256)", +"eb944e4c": "revokeTokenGrant(address,uint256)", +"eb947f19": "ExampleResourcePool()", +"eb94eecb": "isContributionAllowed()", +"eb95264c": "consolationRewardsPercent()", +"eb95b7d5": "Bounty(address,address)", +"eb95d4e6": "purchaseTokens(uint256,address,address)", +"eb95f0bf": "getCurRoundId()", +"eb965c5e": "Orientation(bytes32[])", +"eb967a2a": "refundsClaimed()", +"eb968ac7": "change(address,int256)", +"eb96ada7": "gameUnpause()", +"eb975390": "lockedTokenTransfer(address[],uint256[])", +"eb9763ed": "transferby(address,address,uint256)", +"eb981fea": "withdrawFromToken(uint256)", +"eb987ca7": "placeBet(address,uint256,string)", +"eb98c8d6": "getGoldsSinceLastCollect(address)", +"eb990c59": "initialize(address,address,uint256,uint256)", +"eb9969a8": "getAllBalance()", +"eb9a5211": "DonationMatched(address,address,uint256)", +"eb9aec0a": "oraclizeIds(uint32)", +"eb9af834": "removePolicy(uint8,uint256)", +"eb9bc6ff": "partyCount(address)", +"eb9c9708": "SisterToken(uint256,string,string)", +"eb9df7db": "updateContractOwner(address)", +"eb9e0398": "mint(int256,uint256,address)", +"eba0184f": "issuable()", +"eba052e7": "RefreshChipUnableList(uint8)", +"eba068ce": "addBountyForHunter(address,uint256)", +"eba2a91b": "superMintBulk(address[],uint256[])", +"eba36dbd": "setAddr(uint256,address)", +"eba37aff": "nrMeasurements()", +"eba37dbd": "getAllReportersDisputeBondToken()", +"eba38402": "finishEvent(address,uint256)", +"eba3cdfe": "bundle(address,uint256)", +"eba4ae3b": "NewDungeonFloor(uint256,uint256,uint32,uint128,uint256)", +"eba56302": "tier1Total()", +"eba60632": "drawNow()", +"eba66dc9": "JOTUNSupply()", +"eba6a307": "getQuotePrice()", +"eba74c0b": "updateCodeWeight(string,uint256)", +"eba898a0": "_authenticate(string,uint256)", +"eba9a4a8": "DiamondBond()", +"ebaa32f3": "submission_stage_block_size()", +"ebaa4470": "getOwnerAuctions(address)", +"ebaac771": "write(string)", +"ebab43e4": "isPreSaleTime()", +"ebabfb0b": "volumeType6()", +"ebac0a56": "fillGoldBuyOrder(address,uint256,uint256)", +"ebad6612": "m_ETHPriceInCents()", +"ebaddea7": "unlockAccounts(address[])", +"ebadfd3d": "checkGivenAway()", +"ebae35a6": "DAOTokenCreationProxyTransferer(address,address)", +"ebae46be": "finishFunding()", +"ebae743b": "addCET6To(address,uint32,uint32)", +"ebae7bf1": "addHpbNode(address,bytes32,bytes32,bytes32)", +"ebaf0e74": "dInit(address,bool)", +"ebaf7f2f": "returnReward(uint256)", +"ebafefb1": "makeInitAccount()", +"ebb045fa": "PublicResolver(address)", +"ebb05f9c": "setItemApproveForAll(uint256,bool)", +"ebb0a856": "leastSwap()", +"ebb0e631": "dtGetCityData(address)", +"ebb11c93": "_build(address,uint256,bytes)", +"ebb1b7ed": "apiAuthorized()", +"ebb1dc21": "ERC20ByteCode()", +"ebb240ef": "ExampleUpgradeable23Token(address,uint256,bytes32,bytes32,uint256)", +"ebb31418": "disableTicker()", +"ebb32c65": "FooAbi(address)", +"ebb332be": "getFunStr()", +"ebb3fd8d": "kingdomName()", +"ebb44389": "bulkMintVested(uint256,address[],uint256[])", +"ebb4ac3c": "ForwarderFactory(address,bytes32,address)", +"ebb4f484": "ROLE_SUPERUSER()", +"ebb5a996": "setUsdLockAccountThreshold(uint256)", +"ebb5f11c": "explore(uint256,address,bool)", +"ebb689a1": "clearAll()", +"ebb6b338": "certifiedPartner()", +"ebb6c59f": "right72(uint256)", +"ebb6dc3a": "returnEther()", +"ebb71194": "withdrawFees(bytes32)", +"ebb741cb": "getChannelSize(uint256)", +"ebb75afc": "debugLog(string,uint256)", +"ebb85502": "GAME_START_TIME()", +"ebb88b97": "getABaddressByName(string)", +"ebb8c22c": "Win(address,uint256,uint256,uint256,uint256)", +"ebb940e6": "BuyBackContract()", +"ebb9ab25": "moveState(uint256,uint256)", +"ebb9b466": "phase_5_Time()", +"ebb9ba80": "calculateRewardForLevel(uint8,uint256)", +"ebba1400": "setIntegerValue(uint256)", +"ebba5184": "WuZeFoundation()", +"ebbaa1fc": "AdvancedToken()", +"ebbb76c8": "LongTermProjectTokens()", +"ebbbe00b": "testNopUnroll16(int256,int256,uint256)", +"ebbc4965": "acceptOwner()", +"ebbc9543": "_getPersonalAirdropUnlockTimestamp(address,address)", +"ebbe05d0": "setMinWeiAmount(uint256)", +"ebbf2f6a": "PixelColor(uint16,uint16,address,uint24)", +"ebbfb637": "Registered(bytes32,uint256,address)", +"ebbfb994": "startTokenSale(uint256,uint256)", +"ebbfcfef": "tomoDepositAddress()", +"ebc04649": "ChangeDatabase(address)", +"ebc16c5c": "getDrugsSinceLastCollect(address)", +"ebc1b4f1": "ForexCoin()", +"ebc20426": "minCapWei()", +"ebc26c95": "ToniToken()", +"ebc33c51": "minContrib()", +"ebc46fdb": "detachControllerForever()", +"ebc56c33": "_hardRequire(bool,bytes32)", +"ebc56eec": "set_allow_refunds(bool)", +"ebc58f62": "MSXAdvanced()", +"ebc59f32": "configPerShares()", +"ebc66bac": "Payreum()", +"ebc697d1": "testControlRestartNotOwner()", +"ebc6a661": "endICOStage2()", +"ebc6e332": "AuctionCreated(address,uint256,uint256,uint256,uint256,address)", +"ebc73e65": "setWaitingTime(uint256)", +"ebc824a2": "killItWithFire()", +"ebc8b934": "add_player(bytes32)", +"ebc97c36": "advisorsPeriodsNumber()", +"ebc98117": "getUserId(uint256)", +"ebcbee16": "totalRaisedInWei()", +"ebcc0de1": "closingPrices(address,address,uint256)", +"ebcc8eb6": "ETHCONEarlyBirdDonation(address)", +"ebcc9a31": "ICOweek2End()", +"ebccb566": "Halo3DPotPotato(address)", +"ebcd8d8a": "setStarInitialPrice(uint256)", +"ebce79ff": "enableBlacklist(address[])", +"ebcfd89e": "AGCoin()", +"ebcfd922": "playerEther()", +"ebd03c55": "changePlatPrice(uint32,uint256)", +"ebd057fa": "owner_withdrawal(uint256)", +"ebd062de": "removeOwnerAddress(address)", +"ebd0f599": "asktoken()", +"ebd3d58a": "InitPeculiumAdress(address)", +"ebd4587d": "GetCourseCode(uint256)", +"ebd46d64": "encodeTokenId(uint256,uint256)", +"ebd4d009": "TotalFloatingInt()", +"ebd56581": "bitservice()", +"ebd58975": "sub2(uint256,uint256)", +"ebd66a9c": "MAX_ALLOWED_PRE_SALE()", +"ebd7cda4": "cTime()", +"ebd83378": "get_blocks_for(uint256)", +"ebd863ac": "DccbtcToken()", +"ebd8d7a0": "getRefReservedTokens()", +"ebd8fde3": "calculatePriceIncrease(uint256)", +"ebd9954c": "tgrStageBlockLeft()", +"ebda6686": "referrerLevel3Percent()", +"ebdac090": "depositFees(uint256)", +"ebdb6063": "lastIssuance()", +"ebdb730d": "weiPerFee()", +"ebdbc7d6": "CurrentTokenOwner()", +"ebdbd65e": "update_private_room(bytes32)", +"ebdcc8ac": "testrc(bytes32,uint8,bytes32,bytes32)", +"ebdd3f77": "triggerRecoveryAddressChange(uint256,address,bool)", +"ebde0bce": "MultiUser()", +"ebde609b": "LykkeTokenErc223Base(address,string,uint8,string,string,uint256)", +"ebdf0d5d": "endianConvert32bit(uint256)", +"ebdf86ca": "add(string,string)", +"ebdfa455": "joinedCrowdsalesLen()", +"ebdfd722": "whitelistEndTime()", +"ebdfe5ad": "picops_is_verified(bool)", +"ebe010b8": "_setStakeHolder(address)", +"ebe02377": "submissionPool()", +"ebe09a93": "getGoldTransaction(string,uint256)", +"ebe14170": "EdgelessToken()", +"ebe1df4f": "LLV_v31_4()", +"ebe22b12": "unsale()", +"ebe24dfd": "deployCtorContract()", +"ebe25056": "isWarlordChest(uint256)", +"ebe29383": "initializeSomeAddress(address,address,address)", +"ebe347d1": "lastTimeWithdrawal()", +"ebe36cb0": "read_price_floor()", +"ebe41b73": "deposit(uint8)", +"ebe4c0d1": "dividendsSumForUser(address)", +"ebe4c597": "VestingRevoked(address,uint256,uint256)", +"ebe599aa": "updateAppExec(bytes32,address)", +"ebe5a4b2": "toB32(bytes,address)", +"ebe5f590": "isJobHasFreelancer(uint256)", +"ebe64f97": "draw_random_card(uint8,uint8[])", +"ebe65f60": "withdrawOffer(uint256,uint256,bytes32)", +"ebe6ba07": "deprecateInterface()", +"ebe6f3cc": "setDappTokenContractAddr(address)", +"ebe749d3": "tokenLockTime()", +"ebe74b21": "PRE_SALE_30_ETH()", +"ebe771da": "setPercent5(address,uint256)", +"ebe7e852": "calculateResult(uint256,uint256,uint256)", +"ebe87ca4": "between(address)", +"ebe89597": "validate(uint256,bytes32,address,bytes32,bytes32)", +"ebe955fe": "simFrequency(bytes)", +"ebea3815": "setDays(uint256)", +"ebea3d30": "setFixedRate()", +"ebeac0c8": "marketCapBlue()", +"ebeac2b5": "reactivate(address)", +"ebead05f": "getOrderSharesEscrowed(bytes32)", +"ebeae1ad": "DrocoinCrowdSale()", +"ebeb0838": "delFromWhiteList(address)", +"ebeb0f48": "lockTotalSupply()", +"ebeb1b5e": "transferTokenToMultisig(address,address)", +"ebeb76bb": "assignMeta(string,uint256)", +"ebec7352": "numVideos()", +"ebec7752": "usableBalanceOf(address)", +"ebed561b": "engineRunning()", +"ebed7a95": "mineral2Shares(uint256)", +"ebedef1a": "approvalFallback(address,uint256,bytes)", +"ebef28aa": "BID_DELAY_TIME()", +"ebf04917": "tranches()", +"ebf056e3": "revoke(bytes32,address,bool)", +"ebf06bcb": "spawnSite(uint256,uint256,address)", +"ebf0c717": "root()", +"ebf0da65": "erc223()", +"ebf0e5f1": "SimplePriceFeed(address,address,address)", +"ebf1356e": "minMineSize()", +"ebf1a495": "sendEthTweet(uint256,bool,string,bool,string,uint256)", +"ebf31253": "getMoneyness()", +"ebf469dc": "issue(address,uint256,string)", +"ebf5128c": "mintUnICOLeftToken(address,address,address)", +"ebf522b8": "_newJockey(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"ebf53e0e": "countAllCliDrm()", +"ebf59068": "exitOnHalt(address[],uint256[],bytes,bytes,bytes32)", +"ebf5cdfd": "jackpotGuard(uint256)", +"ebf652cc": "lockInTime1()", +"ebf6e91d": "hit(uint256)", +"ebf70010": "ChangeWhiteList(address,bool)", +"ebf701e0": "getAccountBalance(bytes32)", +"ebf76522": "selfDestroy(address,address)", +"ebf81d30": "_Withdrawal(bytes32,uint256,uint256)", +"ebf88de4": "removeHeir()", +"ebf89fa9": "withdrawPonzi(uint256)", +"ebf95043": "balanceOfMorty(address)", +"ebfa3c1b": "maxRandomRound()", +"ebfaacce": "uncappedBuyerList(address)", +"ebfb3630": "vernamCrowdsaleToken()", +"ebfd288a": "getVerifiedReceipt(bytes,bytes,bytes)", +"ebfd5b26": "addTokenTo(address,uint256,uint256,bool)", +"ebfda085": "LOOT()", +"ebfdc657": "foundersAddress()", +"ebfe0f39": "makeCoin(uint256)", +"ebfed9f2": "motionVoting(uint256)", +"ebff2602": "Withdraw(address,address,uint256,uint256,uint256)", +"ebff410d": "bonusAccountBalances(address)", +"ebff831f": "getFactories(address)", +"ebffd7e3": "getStage1Cap()", +"ec000bb5": "getPrizes()", +"ec003704": "getVestingStart(address,address)", +"ec005255": "boolToInt(bool,bool)", +"ec00d2a4": "frozenRecordsCount()", +"ec017820": "TransferToBTCoE(address,uint256)", +"ec01f75f": "initOperated(address)", +"ec0274ed": "CreateBatch(uint256,string)", +"ec0317ff": "AidCoin()", +"ec034bed": "donationAddress()", +"ec035393": "_getAllRevisionBlockNumbers(bytes20)", +"ec035aac": "bonusOver3ETH()", +"ec0373c6": "adminGetPlayerCount()", +"ec041a24": "getOrModifyBlocked(address)", +"ec0484ef": "roiEscrow(bytes32)", +"ec049219": "AtmanToken()", +"ec0493f7": "_populateTokenData(uint256,bytes16,uint256,uint32)", +"ec062ac0": "getMaxProfit()", +"ec066a4c": "ALLYToken()", +"ec0904f7": "releaseFor(address)", +"ec096f8d": "addTransaction(address,uint256,bytes)", +"ec0a0b50": "TOKENS_SUPPLY()", +"ec0a12d3": "JKToken()", +"ec0b3d21": "testThrowsIfPlaceholderIsBad()", +"ec0b3de4": "deletePetition(uint256)", +"ec0b4153": "getMoneyness(int256,uint256,uint256)", +"ec0b4207": "initCountTokens()", +"ec0b529f": "lockMinSiteTipPercentage()", +"ec0ba006": "countEgg(uint64)", +"ec0be13d": "Location()", +"ec0c6a72": "issue(bytes32,int256,string,bytes,uint256)", +"ec0cfd0b": "getProperties()", +"ec0d69e3": "train(uint256,bool,uint8)", +"ec0da0cd": "registerOptionPair(address,uint256,address,uint256,uint256)", +"ec0da330": "testSafeSub(uint256,uint256)", +"ec0de26e": "foundationTimelock()", +"ec0ea816": "breed(uint256,bool,uint256,bool,string,string)", +"ec0f1025": "testBitsOrSuccess()", +"ec0f60d9": "ICOcontributors()", +"ec1024d1": "censoredChatMessages(uint256)", +"ec10286d": "PointlessCoin(uint256,string,uint8,string,address)", +"ec109249": "RefundableAllocatedCappedCrowdsale(uint256,address,address,uint256,uint256,uint256,uint256,address,address,address,address,uint256)", +"ec112460": "_updateDistribution()", +"ec1182c2": "freezePrice()", +"ec11d0cf": "DeltaBalances()", +"ec12f1ef": "increaseMaxAvailableTokens(uint256,string,uint256)", +"ec1329c2": "makeProposal(address,uint8,uint256)", +"ec132ce3": "unconfirm(uint256)", +"ec13cc7b": "freeze(bytes32)", +"ec13df6b": "setExecutiveOfficer(address)", +"ec140a1f": "BTSJToken()", +"ec149de9": "Ethereumwhocoin()", +"ec14f974": "MAX_CARS()", +"ec1553d1": "mintCoin(address,uint256)", +"ec15afe1": "filmpaid()", +"ec15c6ba": "substring(string,uint256,uint256,uint256,uint256)", +"ec164625": "_clearTotalBonusTokensByAddress(address)", +"ec176dee": "weiToTokenFactor()", +"ec17a7a3": "addressSCICO()", +"ec17b20e": "setStartingBlock(uint256)", +"ec1847b6": "getWorkerIndex(address)", +"ec1893b4": "getProps()", +"ec18ca9c": "lastPresser()", +"ec18e2f1": "logInitialReporterRedeemed(address,address,address,uint256,uint256,uint256,uint256[])", +"ec1938a8": "AddNewSegment(address,address,uint256,uint256,uint256,string)", +"ec1ad474": "removeFromWallet(address,uint256)", +"ec1b375a": "spardosenName()", +"ec1d9bf4": "isGoldRegistry(address)", +"ec1e4861": "assignWinnings(uint256)", +"ec1e6a4f": "tearDown()", +"ec1e74a7": "commitThreshold()", +"ec204f87": "_getTokenAmount(uint256,uint8)", +"ec20b457": "addInvestor(address,uint256)", +"ec20fc35": "populationIncrease()", +"ec216c34": "checkOwnerIndex(uint256)", +"ec21a913": "setUint256(int256,uint256)", +"ec22f94f": "getRedeemableReputationVoter(bytes32,address)", +"ec238994": "trustedTransfer(address,address,address,uint256)", +"ec23ba66": "Kapitalexote()", +"ec24aa01": "startPrivateSaleStage()", +"ec25adf4": "addtokens()", +"ec271be2": "charityWalletAddress()", +"ec277ce7": "Resilience()", +"ec27bdd3": "challengingInput()", +"ec27f6d8": "LegacyRepContract()", +"ec280bf6": "moreMinFunds(uint256)", +"ec28118e": "nextDiscountTTMTokenId1()", +"ec2929fb": "divbonus()", +"ec29781e": "deliveryId()", +"ec29ff7c": "getMaxiumInputEther()", +"ec2a4062": "setOpenBlock(uint256)", +"ec2ac54e": "deposit(address,uint256,bytes32,uint256)", +"ec2af44d": "test_oneValidEqBool()", +"ec2b189c": "GetURL(address,uint256)", +"ec2b50bf": "setUserLibrary(address)", +"ec2bb963": "openPrize()", +"ec2bcd22": "addressCanContribute(address)", +"ec2c28b4": "checkBuy(uint256)", +"ec2c8fec": "getEggsOff(address)", +"ec2c9016": "getMarkets()", +"ec2cdb87": "initialSaleComplete()", +"ec2ec781": "testFailGetUnsetToken()", +"ec2efe40": "MinPayment()", +"ec2f39b4": "isICOStarted()", +"ec2f81ac": "createGroup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"ec300fcc": "MediChainToken(uint256)", +"ec309038": "canStart()", +"ec30ad95": "EthsqrCore()", +"ec30c4e3": "getPointsToSpend()", +"ec3178f9": "getMemesByOwner(address)", +"ec322a88": "tokenlenth()", +"ec32d68f": "xrateProviders(uint256)", +"ec32e4e8": "admin_inactive_withdrawable()", +"ec332488": "openForPublicTrade()", +"ec342ad0": "BASE()", +"ec343a97": "Rate4()", +"ec35576e": "GetProfitFunds()", +"ec3575ec": "soccer()", +"ec357c64": "getIsCoinReg(string)", +"ec36196e": "toSpread()", +"ec3743f1": "setTeamFund()", +"ec37a6e4": "logReputationTokensTransferred(address,address,address,uint256)", +"ec38027e": "MadToken()", +"ec384a3e": "tokenToExchangeTransferInput(uint256,uint256,uint256,uint256,address,address)", +"ec38e855": "mintOperations(uint256)", +"ec3a0489": "PAYToken()", +"ec3a6d64": "getGoodDecision(bytes32)", +"ec3a6f73": "numRegistrants()", +"ec3adf65": "editUser(bytes32,bytes32,bytes32,bytes10,bytes32,bytes32,bytes32)", +"ec3af4a9": "getProjectKudos(address)", +"ec3bb11a": "maximumRaised()", +"ec3c155e": "ERC20TokenMock(uint256,string,uint8,string)", +"ec3d21e1": "kycPass(address)", +"ec3d45e8": "setMinParticipants(uint256)", +"ec3d5ffb": "stillAllowedReadable()", +"ec3f3636": "firstStage()", +"ec3f5d62": "withdrawRestOfBalance()", +"ec3fdf1d": "getExpiredAddressIndexes(address)", +"ec40c43d": "SmartPool(uint256,uint256,uint256)", +"ec40db16": "HedgeContract1(uint256,address,address)", +"ec412e00": "targetDiscountValue2()", +"ec42f82f": "finishIco()", +"ec439d67": "countAllUsers()", +"ec43eeb6": "getAddressOfId(uint256)", +"ec443813": "BytesToAddress(bytes)", +"ec449e67": "currentPriceInfoOf(uint256,uint256)", +"ec44acf2": "trading()", +"ec46009d": "EstateX()", +"ec4673d1": "approveWithdraw(uint256)", +"ec46bf8f": "emergency_withdraw(uint256)", +"ec47297e": "_CallCancelled(bytes32)", +"ec4754c6": "endetoken()", +"ec47a795": "getLockedStages(address)", +"ec47e7ed": "EtherWithdraw(uint256,address)", +"ec480557": "readTotalNumberOfPurchases()", +"ec486c23": "NewBToken()", +"ec4a79cf": "unlockaddress(address)", +"ec4aca2a": "bancorTradingContract()", +"ec4b48ad": "testCanDeposit(address)", +"ec4baa83": "StaticEthAvailable()", +"ec4bfdd4": "calculateOptionsComponents(uint256[9],uint32,uint32,bool)", +"ec4c76bb": "setInitialBuyoutPrice(uint256,uint256)", +"ec4cd0cf": "isSuccessful()", +"ec4d88d7": "usernames(bytes32)", +"ec4e530d": "_decodePriceData(bytes)", +"ec4eb442": "author(uint256)", +"ec4fb7a0": "totalTokensPresale()", +"ec4fd09d": "getEtherDog(uint256)", +"ec503611": "profitsSent()", +"ec505f58": "INDOCASH()", +"ec5134ca": "processStep()", +"ec51431f": "Unvault(uint256,uint256)", +"ec530de6": "countAddresses()", +"ec5325c1": "getDarknodes(address,uint256)", +"ec53589d": "FhnwCoin()", +"ec54a36a": "updateTimer(uint256)", +"ec54fa5e": "listCOFI()", +"ec556889": "proxy()", +"ec559176": "setEthBalance(address,uint256)", +"ec560828": "monarchyEndReward()", +"ec56a373": "contracts(bytes32)", +"ec56c6b0": "contracteventcount()", +"ec56eb93": "getComponentCount(uint256)", +"ec57e25b": "Magzia()", +"ec582a00": "IkuraStorage()", +"ec58b996": "encodeMessage(uint256,uint256,uint16[])", +"ec58f4b8": "addSolver(address)", +"ec591b20": "cancelSellCard(uint8)", +"ec59565f": "BinaryOptionV2(address,address,address)", +"ec597128": "addition()", +"ec5975c6": "getTokensReserve()", +"ec5a25e0": "WalletLibrary()", +"ec5aceab": "createOrder(address,address[3],uint256[5],int256)", +"ec5c71b3": "getChildIds(address,uint256,uint256)", +"ec5c9036": "Crowdsale(address,uint256,uint256)", +"ec5d9cc8": "balanceAvailableTokens(address)", +"ec5d9e58": "organisationName()", +"ec5dfaa2": "initHolders(address[],uint96[])", +"ec5dfb84": "bbBalance()", +"ec5ffac2": "minimumStake()", +"ec607f7d": "nextPeriod()", +"ec60bcf3": "burnFrom(address,address,uint256)", +"ec61c430": "YudiToken(uint256,string,string)", +"ec620eb3": "setClaimBlocks(uint256,uint256)", +"ec622892": "disableInvestment(address[])", +"ec62558d": "adminBurnToken(uint256)", +"ec62b216": "PRE_ICO_BONUS_PERCENTAGE()", +"ec647d42": "JESToken()", +"ec64f52f": "brag()", +"ec6507d7": "debug_transfer(address,address,uint256)", +"ec651551": "PVP(uint256,uint256,uint256)", +"ec653833": "totalAuctionItems()", +"ec654389": "tokenBountyAllocated()", +"ec654e38": "accident()", +"ec65b7a0": "FINALIZE(bytes32)", +"ec664694": "GooToken(uint256)", +"ec672cf6": "setAddressArray(bytes32,address[])", +"ec67abe4": "MOMCoin()", +"ec67e37a": "assignRevenueContract()", +"ec68197b": "setGameAddrt(address,bool)", +"ec688e8f": "walletNotLocked(address)", +"ec68a73d": "totalSpecies()", +"ec698a28": "__transferFromWithReference(address,address,uint256,string,address)", +"ec6a4487": "setMoneyWallet(address,address)", +"ec6acb33": "reputationClear(address,string)", +"ec6afc22": "oraclize_query(uint256,string,string[3])", +"ec6b16ca": "pMinInFp()", +"ec6b1d1e": "findAddress(bytes32)", +"ec6b393d": "subWeiRaised(uint256)", +"ec6be06e": "setBeneficiaryAddress(address)", +"ec6c18fc": "TOKEN_DECIMALS_MULTIPLIER()", +"ec6c32cd": "amendArticleItem(uint256,uint256,bytes)", +"ec6e43ae": "PRICE_CHANGE_ENDING_TIME()", +"ec6e5d09": "SellerHistory(address,address,uint256,uint256)", +"ec6e7bbf": "getTargetSite(address,uint256,uint256,uint256)", +"ec6eb411": "adjustBalance(address)", +"ec6f3a8c": "originalTokenHolder()", +"ec6f509e": "IcoStartTime()", +"ec6f772d": "addVirus(address,uint256)", +"ec704095": "getMyCrocs()", +"ec714926": "setTargetDiscountValue8(uint256)", +"ec715a31": "releaseToken()", +"ec7219a1": "growthReserveTokenSend(address,uint256)", +"ec727000": "getApprovalDB()", +"ec736b67": "validPerc(uint256)", +"ec737576": "finalizeMintUtility(address,uint256)", +"ec7380d9": "transferManually(uint256,address,address)", +"ec747b09": "getPaymentById(uint256,uint256)", +"ec74b818": "rbInformationStore()", +"ec756ee5": "getOrCacheValidityBondWallCalled()", +"ec759b80": "getOwners(uint8)", +"ec759f87": "setTemporaryVariables()", +"ec76312a": "sendInvestorIndex()", +"ec76bd65": "volumeType5()", +"ec77537b": "finalizeDispute()", +"ec77809f": "removeAssetPartOwner(bytes32,address)", +"ec77a89f": "GoldTokenLedger()", +"ec78626f": "setPOOL_edit_11(string)", +"ec788712": "toAddress(bytes,uint8)", +"ec789ef3": "sellpr0coinsAgainstEther(uint256)", +"ec796908": "tokensArray(uint256)", +"ec79efa8": "candidateETHAssets()", +"ec79f9bd": "setDisputeThresholdForFork(uint256)", +"ec7a3ab6": "calcBurnFee(uint256)", +"ec7b2843": "kvcMul(uint256,uint256)", +"ec7b642a": "setEvent(uint256)", +"ec7b8c40": "deleteFrozenAddresses(address)", +"ec7b9655": "spiritual_guidance()", +"ec7bb2ac": "setGen0Limit()", +"ec7bbcd2": "TradeAdsCoin()", +"ec7bf78d": "SetWorldSnapshot(uint256,bool,uint256,uint256,uint256)", +"ec7c06be": "doMigrate()", +"ec7c2ef7": "withdraw_excess_tokens()", +"ec7c637d": "getBalanceLimit(address)", +"ec7dd7bb": "getOrderDetails(uint256)", +"ec7de1e9": "masterOfCeremonyPending()", +"ec7df86e": "hasSDCC(address,address,uint256)", +"ec7dfb4d": "weiGoal()", +"ec7ecec5": "getPlayerState(uint256)", +"ec7f2ae7": "LogTransactionComplete(bytes32,address,uint256,bytes)", +"ec7f9906": "changeFreeAnimalsLimit(uint256)", +"ec7fea7b": "BiXuTo()", +"ec7fec8b": "defineWinner()", +"ec7ff617": "getMatchIdx()", +"ec801286": "BITHELPTOKEN()", +"ec810684": "registrationVote(address,uint256)", +"ec8120c9": "totalItemsForSale()", +"ec814f4e": "doDevelopFunds(uint256)", +"ec81aadb": "deployedTokens(uint256)", +"ec81b483": "CAP()", +"ec81e22e": "returnmoneycreator(uint8,uint256)", +"ec824ca9": "hashNumber(uint8)", +"ec82bf91": "_pay_token_commission(uint256)", +"ec82cf4e": "setDepositPpm(uint32)", +"ec841fe0": "LogTokensPerEthUpdated(uint256)", +"ec845dd8": "totalSubscription()", +"ec847fe8": "divholder()", +"ec854a04": "DogToken()", +"ec85d2f2": "regulatorStatus()", +"ec85d464": "returnAmountRaisedSoFar(uint256)", +"ec866d28": "isApproveOnly()", +"ec867b27": "isTokenVerified(address)", +"ec86e1d7": "getReleaseType(address)", +"ec86fdbd": "getOrCacheMarketCreationCost()", +"ec87543b": "lockedCZRMap(address,uint256)", +"ec875f98": "addCourses(string,address[])", +"ec881472": "Validator(string)", +"ec8861e7": "switchDelegate(bool)", +"ec88abc8": "SOVv11Token()", +"ec8909c0": "setShort(address)", +"ec89331b": "get_invester_detail(uint256)", +"ec89c8f0": "MicheleToken(uint256,string,string)", +"ec8a2c88": "investments()", +"ec8ac4d8": "buyTokens(address)", +"ec8b283c": "give(address,address,uint256)", +"ec8b8f4e": "addMinerTokens(uint64,address[],uint64[])", +"ec8be5b9": "canClaim(bytes32,uint256,address,bytes)", +"ec8cae23": "changeHolderCount(uint256)", +"ec8cb281": "openDate()", +"ec8d140b": "setLockedWalletEntity(address,address)", +"ec8d82f8": "oraclize_query(string,bytes[],uint256)", +"ec8e1afa": "interfaceInstanceCount()", +"ec8edf7a": "changeWalletAddress(address)", +"ec8f3fa5": "getWithdrawalAddress()", +"ec8f4d04": "onApprove(address,address,uint256,uint256)", +"ec8f850b": "withdrew()", +"ec8f95fc": "refCount(address)", +"ec8fb8ef": "withdrawOldTokens(address,uint256)", +"ec8fe065": "buyItem(address,uint8,uint256)", +"ec901017": "mintTokensWithTimeBasedVesting(address,uint256,uint256,uint256,uint256)", +"ec902779": "scribes(address)", +"ec9029a3": "minerToken(address,uint256)", +"ec90a79a": "recv_from_side_chain(uint256,bytes)", +"ec912d61": "markCredit(address,uint256)", +"ec91b550": "miningThree()", +"ec92b98d": "bancorErc20Eth()", +"ec933789": "ParticipantAgent(string,address)", +"ec93a081": "HelperSearchToken()", +"ec93b3f8": "GetCardType(uint8,uint8,uint8)", +"ec93cfae": "FountainOfWealth()", +"ec941ef8": "BXZToken()", +"ec94ce4b": "enabledMintTokens(bool)", +"ec9723ad": "setSalePeriod(uint256,uint256,uint256)", +"ec972a07": "lastBlock_f15()", +"ec972fb0": "timeOfLastDistribution()", +"ec973642": "enable(address,bool)", +"ec979082": "marketCount()", +"ec97cff7": "addCertificationDocument(address,bytes32)", +"ec985c99": "minfinney()", +"ec98618e": "getDial1Type(uint8)", +"ec98eefc": "createTokenContract(address,uint256)", +"ec993f3d": "changeDiscount(uint8)", +"ec9974eb": "getTotalWEIEther()", +"ec99bfe9": "setPreSaleParams(uint256,uint256,uint256,uint256)", +"ec99c60c": "getMatchFromList(uint256)", +"ec9a6e87": "setDefaultPartitions(bytes32[])", +"ec9b5cb2": "publicSaleEnd()", +"ec9be5fe": "setPotatoOwner(address)", +"ec9c677d": "checkDeck(uint256,uint8[],bytes32)", +"ec9d35aa": "transferWithCommission(address,uint256)", +"ec9d7fd2": "getAccumulatedServiceFee()", +"ec9da59e": "setMainContractAddress(address)", +"ec9e7971": "kycAdmin()", +"ec9edfc2": "addSmallInvestor(address,uint256,uint256)", +"eca001dd": "checkWhitelisted(address,uint256,uint256,uint8,bytes32,bytes32)", +"eca0290b": "rawSetAttribute(bytes32,bytes32,bytes)", +"eca058cc": "tokensForWei(uint256)", +"eca0be47": "TEAM_GROUP_WALLET()", +"eca10286": "loseNum()", +"eca1ada7": "getPlayersCount(uint256)", +"eca25f42": "TARGET_ADDRESS()", +"eca28cb7": "AleaPrivateSale(uint256,uint256,uint256,address,uint256,address)", +"eca2e604": "makeWorkStage(uint256,uint256)", +"eca38e0c": "ethSent()", +"eca3ee2c": "currentFundingAmount()", +"eca4742a": "getApprovedAddress(uint256)", +"eca49641": "TurnBasedGame(bool)", +"eca5339d": "mintExtraTokens(uint256)", +"eca5c793": "testErrorUnauthorizedNameRegister()", +"eca6e42d": "set_minimum_trade(uint256)", +"eca73f64": "currentBonus()", +"eca85419": "_getAllChildIds(bytes32)", +"eca90ffc": "LogGetEther(address,uint256,string)", +"eca95377": "generateRandom(string,uint256,uint256)", +"ecaa0e45": "OXGOLDSupply()", +"ecaaf6c8": "newIdTankHull()", +"ecab1a06": "_getExpProportion(int256)", +"ecabaf24": "NewHighestBid(uint256,address)", +"ecac7f4b": "symbolsCount()", +"ecacb3e0": "BitcoinSinhalaToken()", +"ecad17c1": "HurtleCoin()", +"ecad78a2": "paydCouponsETH(address)", +"ecaeacf6": "RESERVED_TOKENS_FOR_CYNOTRUST()", +"ecaeb904": "getDeltaMonth(uint256,uint256)", +"ecaf76b8": "minReferAmount()", +"ecb0116a": "getExitFee()", +"ecb0256b": "relayTx(bytes,int256,int256[],int256,int256,bytes,int256,int256[],int256,int256)", +"ecb071cf": "mainSaleStartdate()", +"ecb0b862": "payContract()", +"ecb14519": "payToken(address,address)", +"ecb15644": "GasFiles()", +"ecb1b31c": "TRONIC1()", +"ecb20de7": "takeBuyTokenOrder(address[3],uint256[3],uint256,uint8,bytes32,bytes32)", +"ecb389e0": "mmVaultAddr()", +"ecb39cba": "developer_edit_stake_reward_rate(string)", +"ecb3dc88": "depositCounter()", +"ecb41054": "doesUserExist(address)", +"ecb4136e": "NotAnotherPonzi()", +"ecb42795": "MANA()", +"ecb42914": "STAGE_1_MAXCAP()", +"ecb46858": "buyGolds()", +"ecb58c74": "ownerAllocate(address,uint256)", +"ecb5fff6": "DELTA()", +"ecb62e49": "defaultParameters(uint256)", +"ecb63011": "receiveApproval(address,uint256,address,uint8)", +"ecb6af21": "accountB()", +"ecb6b50c": "RAVI_ADDRESS()", +"ecb6c47a": "allStop()", +"ecb70a98": "tokensByDashTx(string)", +"ecb70fb7": "hasEnded()", +"ecb75089": "jackpotRoundNumber(uint256)", +"ecb828ea": "lastTokensIssued()", +"ecb86574": "getSum(address)", +"ecb87dc4": "cjTeamWallet()", +"ecb98714": "random_damage(uint256)", +"ecb98e3d": "getUSDAmountByTokens(uint256)", +"ecb9d6a3": "_cancelTknOffer(address)", +"ecba18c0": "closeCrowdsale(bool)", +"ecbb06c9": "setPlayerGeneralAttr(uint64,uint32,uint32,uint32,uint32)", +"ecbb596a": "DecentralizedCrowdFunding(address,uint256,string,uint256,uint256)", +"ecbbcdda": "processFundsIfAny()", +"ecbbd1ca": "calculateMaximumBurnAmount(address)", +"ecbc1481": "calcVIPBenefit(uint256,uint256)", +"ecbc3177": "shitFundAddress()", +"ecbc328d": "totalCardValue(uint256)", +"ecbc8fa7": "adjustBalance(address,int256)", +"ecbca55d": "setConversionFee(uint32)", +"ecbd15fd": "alterTokenGrant(address,uint256)", +"ecbdb633": "getDataHolders(address)", +"ecbdbb32": "balanceETH()", +"ecbdee9b": "setWeiPerSatoshi(uint256)", +"ecbee997": "getPlayerBetInfo(address)", +"ecbf171c": "setSiteRewards(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"ecbfc077": "startClaim()", +"ecc0148e": "inquire()", +"ecc06c76": "setFormula(address)", +"ecc0ee18": "fortune_setimgnme(uint256,bytes32[144],bytes32)", +"ecc137db": "getRandomAdversary(uint256,uint8)", +"ecc18582": "exitContest(uint32)", +"ecc1a0c9": "SetApplicant(uint256[])", +"ecc1caef": "founderReward()", +"ecc1cfaf": "withdrawALC(uint256)", +"ecc21830": "setBuyoutFeePercentage(uint256)", +"ecc258dd": "removeSecondAdvisorLock(address)", +"ecc2c47c": "outSdcForUser(uint256)", +"ecc2e57d": "classVariants(uint256)", +"ecc310ae": "kittyActions(uint256,uint256)", +"ecc38a1f": "REFERER_PERCENT()", +"ecc4029b": "getSpentAmount(address,address)", +"ecc46d1b": "DEBATE_PERIOD_MINUTES()", +"ecc4a6c2": "getSelled(uint256)", +"ecc54067": "TopTokenBase()", +"ecc55e4b": "setBool2(bool)", +"ecc57df4": "_fetchOrderByIdWithPayer(string,address)", +"ecc5aaaa": "startMint(uint256,bool,int256,uint256)", +"ecc7296b": "rebalanceMargin()", +"ecc72b0f": "getSentTrade(address,uint256)", +"ecc73f48": "collectedSum()", +"ecc7e7bc": "TestTokenToken()", +"ecc91c28": "addEtherBroAuction(uint256,uint128)", +"ecc91fdc": "buyCopyright(uint256,uint256,string,string)", +"ecc9665b": "maxWithoutWhitelist()", +"ecc98ce4": "ERC721_RECEIVED()", +"ecc99af0": "getNegID()", +"ecca031f": "hasVoted(uint256)", +"ecca9c2e": "getPrizeAmount()", +"eccaa8b5": "getSpellAbility(uint32)", +"eccb15bc": "SatPosition(int256,int256)", +"eccb6bd0": "addTicket(uint256,address)", +"eccbc596": "maxAttackPrizePercent()", +"eccbf4cc": "getTokenCountFor(address)", +"eccc32f2": "DD()", +"eccd162e": "Fortune(string)", +"eccd1a8d": "NEWT()", +"eccd8e0d": "getExchangeRate(uint256,uint256,uint256)", +"ecce7e63": "setWinningTeam(uint256)", +"eccf1b29": "CrystalDoubler()", +"eccf93c0": "updateCrowdsale(uint256,uint256,uint256,uint256)", +"ecd08bc3": "rap()", +"ecd0c0c3": "_token()", +"ecd13b89": "discountDivisor()", +"ecd1a83a": "getUserCoolDown(address)", +"ecd1c4a5": "availableZLT()", +"ecd22328": "weiCrowded()", +"ecd27189": "freeToUseTokens()", +"ecd370bd": "withdrawCoinToOwner(address,uint256)", +"ecd4eb74": "sendFees(uint256)", +"ecd57ec1": "setMinMaxDays(uint8,uint8)", +"ecd59d9b": "OTHERCRUISER()", +"ecd63757": "makePresale(string,address,uint256,uint256,string,string)", +"ecd747de": "getFishByPos(uint256)", +"ecd75c59": "FourWaySplit(address,address,address,address,address,address,address,address)", +"ecd79066": "getRedeemableReputationProposer(bytes32)", +"ecd7df06": "ICOweek4End()", +"ecd9297d": "withdrawAffBonus()", +"ecd9442e": "setMaxWeiAllowed(uint256)", +"ecd9c155": "transferDistributorship(address)", +"ecda10f5": "deploymentTime()", +"ecda249b": "UIWishSale(address,uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"ecda3055": "start_ICO1(uint256)", +"ecda58c2": "withdraw_3Completed()", +"ecda5fb6": "prizeFundFactor()", +"ecda6635": "owner_MIN_LIMIT()", +"ecda98dd": "start_bond(address[],address,uint256[])", +"ecdb065b": "bitNot(bytes32)", +"ecdb620d": "offlineRealmSold(uint256,address,uint256)", +"ecdc454c": "finalizeProposal(uint256,address[],bool,int256)", +"ecdc7135": "GoldeaBonusCalculator(uint256,uint256)", +"ecdd9549": "bonusOver10ETH()", +"ecdd9632": "generateOrder(address,address,address,uint256,string,string,string)", +"ecdf419a": "doCoinage()", +"ecdf5459": "awardReferralBonus(address,address,uint256)", +"ecdf6fed": "shareDividends()", +"ecdfca06": "tokensPreSale()", +"ecdfdc27": "ROLE_ADMINISTRATOR()", +"ece02921": "queryGameHistory(uint256)", +"ece0d561": "CashSaved(uint256)", +"ece11912": "getBetValue(uint256,uint256,uint256)", +"ece1d6e5": "maxRate()", +"ece1de44": "appeal(bytes32)", +"ece2064c": "setCurrentRewardTokens()", +"ece20f36": "nullify()", +"ece2ea40": "nextCapTime()", +"ece2f7e0": "getPlayersUnits(address)", +"ece35d01": "sessionDuration()", +"ece44b81": "numCollected()", +"ece4f10d": "LULUCOIN()", +"ece5ca56": "getData_33()", +"ece62017": "sTCBonus(uint256,uint256)", +"ece66346": "CryptoSagaHero(address)", +"ece67270": "countdownIsUp()", +"ece7c397": "SurveyTokenSale()", +"ece7fa5d": "registerToken(address,string,string,uint256,uint256)", +"ece84fd5": "crowdsaleFinished()", +"ece8557f": "modifyICOEndDate(uint256)", +"ece866b9": "l()", +"ece8a1d9": "baby()", +"ece8a29d": "addCourse(string,string,string,string,string,string)", +"ece9aed4": "crearJuegosPublico()", +"eceadfd1": "ONEX()", +"eceae9bf": "setRequiredGoldIncreaseFactor(uint256)", +"eceb2945": "checkProposalCode(uint256,address,uint256,bytes)", +"eceb9eef": "SweetTokenLogic(address,address,address,address[],uint256[])", +"eceba876": "getChildUniverse(bytes32)", +"ececa529": "mainFundPrecent()", +"eced0280": "getPhase()", +"eced2967": "calculateAndRegisterEarlyBonuses(uint256)", +"eced5526": "SCALE()", +"eced6c57": "extraTokensPerUnit()", +"ecedafcb": "SampleCrowdsale(uint256,uint256,uint256,uint256,uint256,address)", +"ecedf7b2": "initialisation(address,address)", +"ecee4eb1": "calculateNoOfTokensToSend(uint256)", +"eceebc3f": "setAllowTrading(bool)", +"ecef0e54": "DigixbotUsers(address)", +"ecef615b": "sellTransferFee()", +"ecf0848f": "MIN_PRESALE()", +"ecf12669": "FinToken()", +"ecf1e0fd": "addManyUsers(address[],uint256[])", +"ecf1fca0": "tradeProfileImplementation()", +"ecf1fdea": "setper(uint256,uint8,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"ecf24ec0": "Contribution(address,address,address,uint256)", +"ecf41c8c": "createOption(uint256,bytes32)", +"ecf42e5a": "ETHRLINK(address,address)", +"ecf477d5": "CrowdsaleStarted(address)", +"ecf56d82": "etherToTokens_(uint256)", +"ecf59b83": "ico3Min()", +"ecf6512f": "modify_Presale2StartDate(uint256)", +"ecf68eb8": "TokenTransferAllowed(uint256,address)", +"ecf6eb22": "setConfigAddress(bytes,address)", +"ecf6f108": "bigToken()", +"ecf6f2f8": "Bitgram()", +"ecf7105e": "etherBounty(address,uint256)", +"ecf7b873": "_airdropUnlocked(address)", +"ecf82c91": "setPixelDistributor(address)", +"ecf836ba": "updateInstance(bytes32,bytes32,bytes32)", +"ecf862cc": "stopSweepStake()", +"ecf88111": "setConfig(address,uint256,uint256,uint256)", +"ecf90824": "testegy(uint256,string,string)", +"ecf9d3e9": "getDesignatedReportPayoutHash()", +"ecf9ea1d": "expanded()", +"ecfa3292": "Forwarder(address,bytes32,address)", +"ecfb49a3": "totalPool()", +"ecfb5d17": "deleteFromWhitelist(address)", +"ecfbe70c": "withdrawERC20Token(address,address)", +"ecfc5964": "incTotalSupply(uint256)", +"ecfc7ecc": "placeBid()", +"ecfce7b4": "addProductEndorsement(string,uint256,int256,bool,string,string)", +"ecfd0a56": "account1()", +"ecfd8928": "contributorCount()", +"ecfef21a": "Mojito()", +"ecff39af": "START_WEEK_1()", +"ecff537f": "getGen0COnfig(uint32)", +"ecff58df": "countProjects()", +"ecff7531": "BankerFarmer()", +"ecffc18a": "RussianCash()", +"ed007cb6": "AggiungiMiner(address)", +"ed00b73f": "EbolaToken()", +"ed016620": "EtherToken1()", +"ed01bf29": "budget()", +"ed02a732": "doBountyairdrop(address,uint256)", +"ed02ad37": "numberOfGuesses()", +"ed02ada4": "TransferCoinsFrom(address,address,uint8)", +"ed02dded": "lossToCharity(uint256,address)", +"ed032ad2": "lastCharNoZero(string)", +"ed03a5b3": "cloneArray(uint256[],uint256)", +"ed03d0da": "withdrawShares(address)", +"ed045a3c": "doRefund(uint256,uint256,uint256)", +"ed047efd": "assignAnotherOwner1(address)", +"ed04d9f2": "getBuyingAmountRanges()", +"ed05084e": "setWinner()", +"ed05582b": "getHash(address,uint256)", +"ed05ae78": "getDepositBalance(address)", +"ed060ac1": "batchMount(address,uint256[],uint256)", +"ed0668fb": "getMyTurtles()", +"ed06a62c": "confirmBobDirectPay(uint256)", +"ed06d4dc": "KiwiTestToken()", +"ed06fb91": "PART_REWARD_CHANCE()", +"ed07e7b6": "arbifi(uint256,bool)", +"ed081329": "vote(address[])", +"ed09d19a": "get3(uint256)", +"ed0ad321": "releasedOf(address)", +"ed0b01cf": "MINERS_STAKE()", +"ed0b1cb3": "LLV_311_EDIT_1()", +"ed0bce14": "Cryptolotto1Day(address,address,address,address)", +"ed0c4123": "tokensPaid(address)", +"ed0c7091": "resignOwnership()", +"ed0cc2e1": "balancesUploaded()", +"ed0cdfdb": "MonsterAuction(address,uint256)", +"ed0e4665": "AVAILABLE_ADVISOR_SUPPLY()", +"ed0e92e5": "removeControllerContract(address)", +"ed0f22d5": "Start6()", +"ed1062ba": "CallExecuted(address,bytes32)", +"ed10e33c": "unLock()", +"ed11a690": "STARTING_TURTLE()", +"ed11d089": "Fortecoin()", +"ed129c2d": "printMarket()", +"ed12e8ef": "getVaultBalance()", +"ed1426e6": "purchasePixel(uint256,uint256,uint256)", +"ed148ea7": "testEnsFail()", +"ed149514": "setPartners(address,address)", +"ed14b6a5": "takeOver()", +"ed14d17e": "collectRevenue()", +"ed156449": "HeroCoin(address,address,address,address)", +"ed15863a": "bookWeekVisit(uint256)", +"ed15c31d": "Token10xAmin()", +"ed15c5e6": "targetDiscountValue6()", +"ed15dafd": "LBToken()", +"ed1627e9": "closeThisTurn()", +"ed17dab7": "tokensDistributedPresale()", +"ed17faa8": "setPlayerDayEthInLimit(uint256)", +"ed180443": "getUint256(int256)", +"ed185562": "presaleDeadline()", +"ed18838c": "setAutoBuy()", +"ed188f33": "cSale()", +"ed18bc3f": "Slot(address)", +"ed18ecae": "scan(address,bytes1)", +"ed18f0a7": "blue()", +"ed190746": "testSplit()", +"ed1923ee": "mediumRate()", +"ed1a9ca1": "returnsOneUnnamed(uint256,uint256)", +"ed1b71ea": "registerUser(address,address,address)", +"ed1ba837": "PensionFundRelease(address[],address,address,uint8,uint256,uint256,uint8,address)", +"ed1d4870": "changeReceiver(uint256,address)", +"ed1d840d": "getPriceForAssetAmount(address,uint256)", +"ed1ece04": "mineCard()", +"ed1eee68": "getFee(string)", +"ed1f1656": "totalaccumulated()", +"ed1f2229": "distributeForBountiesAndAdvisors()", +"ed1f9991": "getParticipantIndexAddress(uint256)", +"ed20f370": "debundleAndWithdraw(uint256)", +"ed21187a": "getInvestorsCount()", +"ed21248c": "Deposit()", +"ed214fff": "getParticipantList()", +"ed21a7e7": "Airsavecoin()", +"ed225a8a": "equipmentTrainingFeeMultiplier()", +"ed22671d": "set(bytes32,bytes32,bytes32,bytes)", +"ed22c02f": "SGEPreICO()", +"ed23378b": "getMarketCreatorMailbox()", +"ed234e20": "addCompany(address,string)", +"ed23e5b7": "requestObjectRoot(bytes32,uint256,uint8,bytes32,bytes32)", +"ed244fcd": "getAccountValues(uint16,uint8)", +"ed24e3e0": "CryptoABS()", +"ed25ba8c": "blinc_block()", +"ed25e6c2": "expand(uint32[4],uint32[26])", +"ed2648d3": "setCCH_edit_14(string)", +"ed26cae8": "contains(address,address)", +"ed26e60d": "GetReserveAmount(address)", +"ed26fc86": "SnowBall()", +"ed287795": "transferFromAndLock(address,address,uint256,uint256,uint256)", +"ed28d37f": "TokenOne()", +"ed28ef51": "addManyUsers(address[])", +"ed29211b": "claimReward(address,uint256,address)", +"ed29c12b": "MFI()", +"ed2a2d64": "nonceOf(address)", +"ed2b5a3c": "getBorrowRate(address,uint256,uint256)", +"ed2b8e0b": "getPoolRotationDelay()", +"ed2c92b1": "finalizeLastCampaign()", +"ed2cbf06": "_deliverTokens(address,uint256)", +"ed2d1d9e": "goodNightSweetPrince()", +"ed2d4a1b": "process_game()", +"ed2ddeae": "claimAllSupporterTokensByOwner(address)", +"ed2de952": "setInvestorsStorage(address)", +"ed2df26d": "getGameResult(uint256)", +"ed2e3f7e": "ChainBankToken(uint256)", +"ed2e5a97": "read(uint256)", +"ed2eb843": "withdrawEther(address,address,uint256)", +"ed2f2369": "activeStakes()", +"ed2f5b1a": "getRestoredTransactionStatus(uint256)", +"ed2fbf96": "timesno()", +"ed3058e0": "transferRight(address,bytes)", +"ed30ec8f": "_validFee(uint256,uint256)", +"ed319520": "_validateTokensLimits(uint256)", +"ed3375f5": "RSPLT_I()", +"ed338ff1": "saleEndTime()", +"ed3390ea": "findBest(uint256,uint256)", +"ed33e00c": "participantClaimCredits()", +"ed33fba7": "PitisCoin()", +"ed3411dc": "register(bytes20,uint24,uint32,bytes32[],uint16)", +"ed3437f8": "scalingFactor()", +"ed343f65": "totalDropPerUnlockedToken()", +"ed34ca2e": "ThePlat()", +"ed355b0b": "getBestInvestor()", +"ed361694": "failSafeMode()", +"ed361c17": "burningCapableAccount(address[])", +"ed3643d6": "checkSignersByName(bytes32,uint256,uint256,uint256)", +"ed36a874": "getOracleAddressByName(string)", +"ed3788c9": "futureDevelopmentPoolAddress()", +"ed3831ae": "p_count(uint256)", +"ed39eab3": "HGT()", +"ed3a2164": "PrincelyGoldenDollar()", +"ed3a865e": "raceId()", +"ed3ad43e": "finalizeDeprecation(uint256,address)", +"ed3b4eca": "setMinAmount1Round(uint256)", +"ed3d4dc1": "POWM()", +"ed3e3e0b": "update_counts(uint256)", +"ed3e46ae": "tipHash()", +"ed3f1c87": "allowAccess(address,address)", +"ed3f443f": "getMyBetRecordCount()", +"ed3fd0d7": "EVMScriptRegistryFactory()", +"ed40175d": "testFailOnFailedCall()", +"ed4080b1": "getPreminerAllocation(address,uint256)", +"ed40a8c8": "getWord()", +"ed4127df": "CANVAS_HEIGHT()", +"ed429d1b": "_amountCourse()", +"ed43191d": "DataRecordStructs(bytes32)", +"ed442e14": "getDividends()", +"ed45747f": "editCell(address,uint256)", +"ed45c9be": "getAllTheThings()", +"ed45e578": "getAttoTokensLeftForICO()", +"ed46eb52": "deleteCaller(uint256)", +"ed47ca94": "debug_verifySharesTreeSubmission(uint256[],uint256[],uint256,uint256,uint256,uint256)", +"ed49196b": "auctionleader()", +"ed498fa8": "userTokens(address)", +"ed49d2f8": "maxDelay()", +"ed4ae6b5": "isValidVoting(address)", +"ed4b1d0d": "scheduleTransaction(uint256)", +"ed4c1cdd": "xauToEur()", +"ed4c1d97": "syncToken()", +"ed4c87ac": "startProject(string,address,address,address,bytes,uint8,uint8,uint8,bool)", +"ed4dd2ab": "SECOND_TIER_DISCOUNT()", +"ed4e65fb": "noStoreIsActive()", +"ed4e73da": "signedTransferFrom(address,address,address,address,uint256,uint256,uint256,bytes,address)", +"ed4f114d": "ConversionRateChange(uint256)", +"ed4f2b33": "setup(uint8,bytes32[])", +"ed4f415e": "Holahop()", +"ed505d3e": "totalAmountOfPresalePurchasesWithoutBonus()", +"ed50dd4e": "ChiSale(address,uint256[],uint256[])", +"ed52068c": "revokeBurnDelegate(address)", +"ed526601": "greenOnFanChun()", +"ed54746e": "lastAuction()", +"ed550443": "proxyContract()", +"ed561fe5": "receiveSecurityDeposit(address)", +"ed56531a": "pause(bytes32)", +"ed5667b4": "transferOfPower(address)", +"ed5677f6": "tierThreeMin()", +"ed56de8c": "withdrawZRX(uint256)", +"ed5850b9": "register(address,uint8,bytes32[5],address)", +"ed5863f6": "agaisnt_votes()", +"ed58bad8": "setAuthorizedMinter(address,bool)", +"ed58c840": "transferGu(address,uint256)", +"ed58d5ec": "setLendingContract(address)", +"ed59313a": "setUsername(string)", +"ed598be7": "TenantMoveIn(string)", +"ed59eda1": "_addSuperInvestor(address)", +"ed5bc87b": "fundedProxy()", +"ed5c58f3": "set0xTokenProxy(address)", +"ed5d2289": "latchFciUser(uint256)", +"ed5d3f1a": "pow_10(uint256)", +"ed5d6fbc": "completion()", +"ed5da4f9": "computeReturnBonus(uint256)", +"ed5dc952": "getIsRoundOver(uint256)", +"ed5e68f9": "closeAnnualInvest()", +"ed5e7691": "CrowdCoinPreICO(address,address,address)", +"ed5e8437": "locks(bytes32)", +"ed5eafa2": "ClinicalTrial(address,address,uint256,uint256,uint256,bytes32,bytes)", +"ed5ec919": "voidTransaction(uint256)", +"ed60ade6": "bidOnSiringAuction(uint256,uint256)", +"ed611895": "ManualChangeUnholdDate(uint256,uint256)", +"ed6183bf": "isWinner(uint8,uint8[5],uint8[5])", +"ed621591": "KaratBankCoin()", +"ed621ae1": "PriceWeekFour()", +"ed621df6": "GuessNumber()", +"ed621e9a": "addWhitelistUsers(address[],uint256[])", +"ed621f0f": "YUN(uint256,string,uint8,string)", +"ed62543d": "bttsToken()", +"ed62986b": "_getBattleResult(int256,int256,int256,int256,uint256)", +"ed62cf1f": "setCanCall(address,address,bytes,bool)", +"ed62f501": "maxPendingPayouts()", +"ed6302be": "left98(uint256)", +"ed63455c": "stringContains(string,string)", +"ed644025": "X5Coins(uint256,string,string)", +"ed64b36b": "left15(uint256)", +"ed64bea4": "JamCoin()", +"ed64c08c": "clearBudget(address)", +"ed653164": "releaseEscrow(uint256)", +"ed654fd7": "logCompleteSetsSold(address,address,address,uint256)", +"ed666e96": "artsCreatedCount()", +"ed67bca3": "_finalize()", +"ed67e002": "getFreezeTime()", +"ed684cc6": "trigger(uint256)", +"ed68ece1": "newFeed(string)", +"ed68ff2c": "setRequireSignedAddress(bool,address)", +"ed6a2bc9": "LLToken(uint256,uint256,address)", +"ed6a2d35": "Blincoin()", +"ed6a897d": "teamTokensHolder()", +"ed6b2d7d": "extractTokens(address,address)", +"ed6b40c0": "PRICER_DELAY()", +"ed6b5ad5": "pauseSwap()", +"ed6bcd84": "TransactionPending(uint256,address,address,uint256,uint256)", +"ed6bd807": "phase2StartTime()", +"ed6be066": "charitySpaceToken()", +"ed6bf091": "changeEndDate(uint32)", +"ed6bfa2b": "toggleDeposit(bool)", +"ed6c3e84": "blockStart(uint64)", +"ed6cb909": "transferAddress(address)", +"ed6cd5d3": "get_recipient_balance()", +"ed6cd66d": "CreateUKGEvent(address,uint256)", +"ed6d4055": "SBIBank(address)", +"ed6d8521": "VULToken()", +"ed6d9169": "pushBounty(uint256)", +"ed6d969a": "addSegmentation(address,uint256,uint256,uint256)", +"ed6db106": "_HUNDRED()", +"ed6e7f7a": "processMutuallyAgreedJobCancellation(bytes16,address,address,uint256,uint256,uint8,bytes,bytes)", +"ed6e85c7": "installDonationContract(address)", +"ed6eba84": "getLockedUserDeposits(bytes32)", +"ed6f0792": "askOracle()", +"ed70d83c": "setRefProgram(address)", +"ed70e032": "_removeAvatar(address)", +"ed713d55": "ZerroXBToken()", +"ed71cfb3": "isDepositContract()", +"ed724103": "isRoundOneSalePeriod(uint256)", +"ed7305ea": "Enrium(uint256,string,uint8,string)", +"ed732ddb": "placeBet(uint256,uint256,string)", +"ed73b6a6": "PariMutuel()", +"ed743556": "YISSToken(address,uint256)", +"ed74de9d": "clone(address,uint256,uint256)", +"ed7510a0": "registerContributorPool(address,uint256)", +"ed7546b7": "_checkEvenIfCommBallot(bytes32)", +"ed769922": "buypr0coinsAgainstEther()", +"ed782750": "ICONIQ_TOKENS_NEEDED_PER_INVESTED_WEI()", +"ed785e29": "PresaleBREMP(address,uint256)", +"ed786cd6": "getCurrentWeek(uint256,uint256)", +"ed78cf4a": "potSwap()", +"ed793207": "_burnRemainingTokens(uint256)", +"ed7a1548": "updateSecondExhangeRate(uint256)", +"ed7a4e0b": "winnerAddress()", +"ed7a96e7": "saleInProgress()", +"ed7ad2d2": "createDeposit(uint256,bytes)", +"ed7b4753": "BULL()", +"ed7c238d": "getFileName(uint256)", +"ed7caa8e": "profitOrgPay()", +"ed7ce71a": "KWRT()", +"ed7dd693": "PlaceNewForecast(bytes32,bytes32,bytes32,bytes12)", +"ed7eff2b": "setConvertContract(address)", +"ed7f8deb": "refRewardL1Per100()", +"ed80577d": "offerBtc(address,uint256,bytes32)", +"ed806207": "isInt128ValidIn64(int128)", +"ed810cfa": "emitBurnEvent(address,uint256)", +"ed810d02": "tokensSentMain()", +"ed815d83": "query(bytes)", +"ed81a68e": "edgeRange()", +"ed81cdda": "rootOwnerOfChild(address,uint256)", +"ed81f681": "currentDayOfWeek()", +"ed824f2f": "tokenETHAmount()", +"ed82cac9": "toEthers(uint256)", +"ed83e9aa": "YDHTOKEN(string,string,uint256)", +"ed83eb7d": "FileStorage()", +"ed84115e": "publisherMessage()", +"ed857bfd": "BitmassExchangeToken()", +"ed861328": "submitStack(uint256,uint256,uint256,uint256,uint256,bool)", +"ed861e13": "managerCountInt()", +"ed864190": "testMultipleGetters()", +"ed86d9c7": "playSpecificTriples(uint256,uint256)", +"ed879c77": "computeNextSystemSalePrice()", +"ed885897": "getTotalPot(uint256)", +"ed88c68e": "donate()", +"ed8991fb": "balanceMap()", +"ed89b2a0": "calculateQuantityBonuses(uint256)", +"ed89e864": "SupplyChanged(uint256,uint256)", +"ed8a4116": "_resetPotatoes()", +"ed8a73a3": "developer_edit_text_crowdsale(string)", +"ed8a9c0f": "clearExpiredFreezing(address)", +"ed8b6556": "getJackpotAmount()", +"ed8b9059": "set_withdrawal_gas(uint256)", +"ed8bfa4d": "drainSMS()", +"ed8c2aed": "closePoll()", +"ed8d806b": "largestHODLERAddress()", +"ed8df164": "New(string,bytes32)", +"ed8e690b": "MessageUpdated(uint256,address,string)", +"ed8e873c": "gvAgent()", +"ed8e9f2c": "LogUnfinalized(uint256)", +"ed8f02d0": "tokenValuePublish(uint256,string,uint256)", +"ed8f10df": "testSign()", +"ed8f11de": "Evocoin()", +"ed8fe3c1": "totalTRsWon()", +"ed8fee35": "MSCE()", +"ed90c7b7": "deleteProduct(uint256)", +"ed918136": "Pilfered(uint256,uint256,uint256)", +"ed91c906": "stopGo()", +"ed927dae": "bytes32ToString(bytes32,bytes32,bytes32)", +"ed92f0a0": "BTC7500on49()", +"ed93a8c9": "Bet0xgame(string,string,uint256,uint256,string)", +"ed93ca26": "startTimeDay()", +"ed950638": "whitelistRegistry()", +"ed952728": "getProposalHash(address,uint256,bytes)", +"ed953b69": "keyLocked()", +"ed95f52b": "startMark()", +"ed981d4f": "calculateNeededCollateral(uint256,uint256,uint256,int256,uint256)", +"ed98f12c": "EthearnalRepTokenCrowdsale(address[],address,address)", +"ed996590": "processWhenStop()", +"ed9978c7": "language()", +"ed9980a6": "numPayTables()", +"ed9a3ac1": "bidProxy()", +"ed9a3d2e": "isCustomerinBL(address,address)", +"ed9a6a65": "tokenVendor1()", +"ed9b0107": "get_senderCryptobank(uint256)", +"ed9bb8d7": "getTweets(uint256)", +"ed9beb05": "setICO(bool)", +"ed9c6d53": "getCCH_edit_9()", +"ed9c7c11": "validateTAOSignature(string,uint256,address,string,uint8,bytes32,bytes32)", +"ed9ca4ff": "setAllowedToPurchase(bool)", +"ed9cf58c": "setToken()", +"ed9d2d79": "transferTeamTokens(address,uint256)", +"ed9d7dd3": "transferCommissionGetter(address)", +"ed9da760": "uniq(uint128[])", +"ed9e3ca2": "addAuditAddress(address,address)", +"ed9f18fb": "setMinStake(bytes32,uint256)", +"ed9f4010": "getATokenHolder(uint256)", +"ed9ff004": "privateStage()", +"eda003ce": "setSaleController(address)", +"eda0576b": "seeZombieRole(uint256)", +"eda09d80": "SELLER_CHECK_STEP(bytes32)", +"eda1122c": "redeem(bytes32)", +"eda14233": "timeStampOfCrowdSaleEnd()", +"eda20bc9": "completeFailed()", +"eda23f20": "getListTempHolders()", +"eda2a0af": "calcPayouts(bool[])", +"eda30c9e": "delGame(address)", +"eda4597f": "fake_airdrop(address,address,uint256)", +"eda4e6d6": "periodStart()", +"eda50e33": "addDescription(string,uint256)", +"eda5d80b": "test_startNumber()", +"eda5de7c": "toggleDrain()", +"eda5ffdc": "newWork(uint256,uint256,uint256,address)", +"eda6e2db": "EarlyContribReceipt(address,uint256,bytes32)", +"eda70f7e": "expiredCount()", +"eda71f6e": "getEstimateObligation(bytes32)", +"eda8669e": "setAtomCool(uint256,uint8)", +"eda89279": "getAuctionEnd(uint256)", +"edaa6a8d": "Sylence()", +"edaaeed2": "DT()", +"edac3cb3": "popExperience()", +"edac985b": "addWhitelist(address[])", +"edacfd25": "invalidateHashes(bytes32[])", +"edad7f9b": "VestingContract()", +"edad8585": "tokenIssuedPreFirstIco()", +"edadeb26": "initCommunityAddr(address)", +"edae7771": "setKingdomCreationFeeWei(uint256)", +"edaebc20": "getTrait(uint32)", +"edaee1dc": "buyAnimalsFromUser(uint256)", +"edafe588": "feeSharingBps()", +"edb04c12": "OpenWindow(uint256,uint256,address)", +"edb08434": "mint(int256,address,uint256,bool,uint32)", +"edb0bb3a": "updatePrice(uint256,uint256,uint256,uint256,uint256)", +"edb0f2ca": "MockGetTogether()", +"edb1072e": "buyWithTokensBy(address,address)", +"edb17d10": "join_refund(uint256)", +"edb25841": "getOrder(address,uint256)", +"edb27f4e": "switchWizard(address)", +"edb2b809": "nextGameCost()", +"edb3623f": "goldTransfer(address,uint256)", +"edb41dec": "onRoundEnd()", +"edb5d946": "fillSell(address[8],uint256[6],uint8,bytes32,bytes32)", +"edb649de": "updateReferalBonus(uint256)", +"edb78e36": "claimBonus(address,address,uint256)", +"edb9548c": "_increasePrice(uint256)", +"edb961ff": "toHexString(bytes32)", +"edbae7c6": "setSaleAdvertisementRate(uint256)", +"edbb1d43": "savings_goal()", +"edbe32c4": "getTradeOfferState(uint256)", +"edbea0b1": "mintWallets(address,address,address,address,address,address,address,address)", +"edbeee22": "getItemTypeIdByTypeAndId(string,uint256)", +"edbf4ac2": "initialize(address,address,uint256,uint256,uint256,uint256,uint256)", +"edc0aee6": "createPlayerMatch(uint256,uint256,uint256,uint256,uint256)", +"edc11a11": "isReadyToFight(uint256)", +"edc19a81": "safeTransferFromWithFees(address,address,address,uint256)", +"edc1ab6a": "announce_therand(uint32,bytes32)", +"edc1e4f9": "setAllowanceSheet(address)", +"edc25f42": "calcRefill(string,uint256)", +"edc2ee4e": "configOf(uint256)", +"edc31e14": "testExecuteSellOrderShouldIncreaseSellerBalance()", +"edc3b4db": "getCharacterNuja(uint256)", +"edc41d06": "canCloseVoteRevealPhase(address,bytes32,bytes32)", +"edc423e6": "cancelChangeOracle()", +"edc427fc": "pullEtherFromContractAfterPreICOPublic()", +"edc42b2d": "changeWhitelistedContract(address)", +"edc48941": "buyByAtom(uint256)", +"edc62aaf": "_generateRandomPart(uint256,address)", +"edc6454d": "SaleToken(string,string,uint256)", +"edc65c83": "setOraclizeCallbackGas(uint256)", +"edc74092": "determineOutcome(uint256,uint256,uint256,bool)", +"edc7aeda": "HYCToken()", +"edc7bcf5": "EscrowContract(address,address,uint256,address)", +"edc7d4ab": "changeOriginWalletIdForAthlete(uint256,address)", +"edc922a9": "getProviders()", +"edc93066": "CompShare1()", +"edc94527": "TgeProxy()", +"edc9f182": "migrate(address,uint40,uint40)", +"edca1e40": "blike()", +"edca371d": "BuySeed()", +"edca914c": "buyTicket()", +"edcb3c08": "IsInitAssign()", +"edcb9e9e": "updatePayout(address)", +"edce50de": "deposit(bytes32,uint256,uint256,address,uint256)", +"edcf2ad4": "_addLegitOwner(address)", +"edcf4d56": "deletePriceValue(bytes32)", +"edcf6b26": "getVersion(string,string,uint256)", +"edcfd050": "advisors()", +"edd004e5": "next(uint256)", +"edd0b5cb": "getFeeRatio(address)", +"edd0d90d": "__max__(uint256,uint256)", +"edd13e38": "mediumFunding()", +"edd19ded": "PaymentManagerUpdated(address,address)", +"edd1d02e": "getNextFeeWindow()", +"edd20050": "LOG_SuccessfulDraw(address,uint256)", +"edd21840": "calculateKnowledgeSell(uint256)", +"edd27b8f": "setDestroyThreshold(uint256)", +"edd36afd": "ProjectValidation(address,address,address,address[],address)", +"edd3896c": "ShowWhaleAddress()", +"edd3def5": "setTmpWriteTimestamp(bytes32,uint256)", +"edd3ff84": "isSponsorableJobApproved(address,uint256,address[])", +"edd403a9": "TOP1000()", +"edd40c3c": "setMnyTiers(address)", +"edd57e32": "_decodeTokenId(uint256)", +"edd5ede6": "passTo(uint256,uint16[],uint8,bytes32,bytes32,address)", +"edd634b8": "fullPrice()", +"edd637ca": "CreateCRS(address,uint256)", +"edd637d0": "bonus(address,address)", +"edd6705a": "changeExchangeRate(uint256,uint256)", +"edd6cfb1": "removeStudent(string)", +"edd6fb16": "countConfirmed()", +"edd70a75": "removeContractRole(bytes32,string)", +"edd7716a": "checkVotingForChangeBuySellPrice()", +"edd7bb75": "changeBet(uint256)", +"edd7ca6f": "getInterest(address,address)", +"edd7fcc4": "_createPermission(address,address,bytes4,address)", +"edd83104": "amended(address)", +"edd8dd89": "CalculationUpdate(uint256,uint256,uint256,uint256,uint256,uint256)", +"edd94fb9": "setBaseEthCap(uint256)", +"edd9e183": "feedUnicorn(uint256)", +"eddb00d4": "placeBuyOrder(uint256,uint256,uint256,uint256)", +"eddb53e1": "TokenWithdrawal(address,uint256)", +"eddce76b": "testFailDisownNotTransferable()", +"eddd0d9c": "setMintFee(uint256)", +"eddd2d39": "getResourceERC20Address(uint16)", +"eddd9d82": "tokenController()", +"edddb350": "getAccessorySeries(uint8)", +"edde6407": "_transfer_byProxy(address,address,uint256)", +"edde8349": "random_num()", +"edde9145": "PlaceSellOrder(uint32,uint256)", +"eddf3a48": "BsToken_STN()", +"eddfcffa": "getDealsLength()", +"ede02b71": "bleach(uint128,uint128)", +"ede05887": "getActiveContractRecordConcat(string)", +"ede2271c": "DOO()", +"ede340ec": "getEloRating(address,address)", +"ede38421": "totalStakedForAt(address,uint256)", +"ede3d9d5": "returnDynamic()", +"ede42186": "gettotal_Supply()", +"ede48fb7": "triggerEvent()", +"ede4edd0": "exitMarket(address)", +"ede5a07d": "getSquareArea(uint256)", +"ede5f66f": "getNumberMilestones(uint256)", +"ede729ad": "expertTokensPerEth()", +"ede778d2": "EventCancelAuction(uint32)", +"ede78573": "EDT2()", +"ede8acdb": "startAuction(bytes32)", +"ede8af01": "getNextGameId()", +"ede8cf8f": "RaidenToken(address,address,address,address,uint256)", +"ede8e035": "FITN()", +"ede8ebf3": "checkApprove(address,uint256)", +"ede8eed4": "MemberAdded(address,uint256)", +"ede930c9": "changeOwnershipto(address)", +"ede963d1": "isAddressExpired(address,uint32)", +"edea3e5d": "createFincontractWithParties(address,address,bytes32)", +"edeb34f7": "GrantsControlled()", +"edeb4ea9": "howMany(uint256)", +"edeb797c": "getNumOptions(uint256)", +"edebb8c5": "generateCryptsyToken(uint32,uint32,uint32)", +"edecde0e": "withdrawAllChannels(address)", +"eded5d9e": "getColor(uint256,uint256)", +"ededb770": "payeeWithdrawInterest(uint256)", +"edede601": "testBalance()", +"edeeb143": "minPlay()", +"edef8bdd": "teamStakesFrozen()", +"edeff589": "giveMeSomeBBUCKs()", +"edf049f7": "sendPer3()", +"edf0b0df": "getPositionCount(address,address)", +"edf0d328": "setBlockDotCoinbase(address)", +"edf0ede3": "withdrawTokenUser(address,uint256,address)", +"edf1da66": "GxOrderList(address)", +"edf1eeb0": "oraclize_useCoupon(string)", +"edf26d9b": "addresses(uint256)", +"edf2d2a2": "setWithdrawGasOverhead(uint256)", +"edf2f745": "notifyTerminate(uint256)", +"edf3cbb1": "TeamDisqualified(address)", +"edf4a403": "getRateWithBonus()", +"edf53886": "addressToUser(address)", +"edf576d1": "MaybePerformClose()", +"edf5c0c0": "getChannelList()", +"edf6466d": "NewMayor(address,address)", +"edf6601c": "getMintRequestStatus(uint256,int256)", +"edf69f2b": "iCarChain(uint256,string,string)", +"edf6fb4b": "isBiometricCompleted(bytes32)", +"edf8333d": "transferFromNonprofitdisbursementfund(address,uint256)", +"edf87aff": "createUint256s(bytes32[],uint256[])", +"edf89793": "routingCodeMap(bytes32)", +"edf92ff3": "rentModified(address,uint256)", +"edfa45e6": "GetMyProd()", +"edfab4fc": "receivedWeiCap()", +"edfb4175": "getRollResults(uint256,uint8,uint8,uint256,address)", +"edfb4191": "getInterestCount()", +"edfbda27": "_addNFToken(address,uint256)", +"edfbf7b6": "setVotingDeadline(uint256)", +"edfbf9cf": "addService(string,string,int256,uint256,uint256)", +"edfceace": "deleteStrategy(bytes15)", +"edfd2f81": "percentageRecipient3()", +"edfd786e": "uint2str()", +"edfdd9d8": "coolduwnUP(uint32)", +"edfe5483": "IQFToken()", +"edfe676b": "refundPlayersAfterVeryLongGame()", +"edfea70c": "playerProfit()", +"edff2702": "window0TokenExchangeRate()", +"edffe3e8": "setAddressF1F2(address,address)", +"edfffca0": "minedToken()", +"ee00362f": "strToOperator(bytes32)", +"ee007a54": "pickRandomAssets(uint256,bytes32[])", +"ee00adcd": "ICOEndedSuccessfuly(uint256,uint256,string)", +"ee00dd43": "getEventFirst(uint256)", +"ee0145f3": "calcETCtoCOR(uint256)", +"ee0186b6": "buyPreSale(address,uint256)", +"ee029de1": "exchangeInterval()", +"ee0446b2": "approvedAmount(address)", +"ee0465d3": "BetComplete(bool,uint256,uint256,uint256,address,uint256)", +"ee04b4b9": "rescueIndex()", +"ee069097": "getAllFunding()", +"ee06eece": "Opulentos()", +"ee070805": "disabled()", +"ee0715ed": "updateRenExBalances(address)", +"ee071aad": "hasCollectedWinnings(address)", +"ee07a22c": "MakeDai(address,address,uint256,uint256,uint256)", +"ee07bf22": "Supply()", +"ee08022a": "getNumRegularTokensBought(address,address)", +"ee08388e": "parentOf(address)", +"ee08fcf3": "getAttributesForAssets(uint256[])", +"ee091034": "IcoDiscountPercentagesChanged(address,uint8,uint8,uint8)", +"ee095c0e": "endRaffle()", +"ee09a001": "_saveAndTransfer(uint256,uint256,uint256)", +"ee09ae4a": "ethFundManager()", +"ee09d27c": "Result(address,string)", +"ee0a8011": "grantCoins(address,uint256)", +"ee0b04be": "claimTokensFor(address)", +"ee0b0eb0": "IotWifitoken()", +"ee0b5445": "transferStorageOwnership(address)", +"ee0b5d8b": "getPlayerInfoByAddress(address)", +"ee0c0346": "changeSupervisor(address)", +"ee0c3e02": "tradeEventHandler(address,uint256,address,uint256,address,address,bytes32,uint256)", +"ee0cb64c": "weekFourthRate()", +"ee0d605c": "authenticate(bytes)", +"ee0d93ce": "optionInitialSupply()", +"ee0d9c61": "withdrawXPI(uint256)", +"ee0dc478": "testSetEnforceRevisions()", +"ee0e21a0": "Amount(uint256)", +"ee0ebe0c": "packageCount()", +"ee0f1d6b": "checkPlayerClaimed(uint256,address)", +"ee0f809e": "buyTulip(bytes32,uint16)", +"ee0fcc75": "setScore(address,uint256)", +"ee0fdd0f": "pledgeTokens(uint256,uint256)", +"ee10a45d": "EMPresale()", +"ee112b59": "Aereum(uint256,string,string)", +"ee11ab9d": "getCEdetails(bytes32)", +"ee1333a1": "setProviderWebsite(uint256,string)", +"ee1374a2": "transferAdvisor2Tokens(address,uint256)", +"ee13e042": "Vix18Coin()", +"ee15b84b": "TokenFulfillment(address[2],uint256[8],uint8,bytes32[2],uint256)", +"ee15ee31": "PartnersAddress()", +"ee166bba": "setOfferSize(uint256)", +"ee16bf57": "FailSafeActivated(bool)", +"ee16c7bd": "GetTickSize(uint256,uint256,uint256)", +"ee172546": "totalRewardsDistributed()", +"ee174697": "winnerAnnounced()", +"ee179857": "addVestingGrant(address,uint256,uint256,uint256)", +"ee1879ef": "makeRecorderID()", +"ee192d13": "createRoom(uint8,uint8)", +"ee196fb8": "doApproval()", +"ee1971ea": "getOwnersBalance()", +"ee19a7fc": "getReleaseBlock(address)", +"ee19bfb5": "increaseWorldCorner(uint64,uint64,uint64)", +"ee19c6dd": "setTether(address,uint256,uint32,uint256)", +"ee19fbec": "stop_service(uint256,uint32)", +"ee19fe96": "minSiteTipPercentage()", +"ee1a4b5a": "sT2()", +"ee1a6295": "bonusEndTime()", +"ee1ae93b": "executeRecallCapital(address,uint256)", +"ee1b4828": "closeBooks()", +"ee1bb82f": "SetURI(uint256,string)", +"ee1c888a": "setEnableBuyAndSell(bool)", +"ee1ce841": "getKeyCount()", +"ee1d036c": "getVestingQuantity(address,uint256)", +"ee1df50d": "poolStartDate()", +"ee1df98e": "LTO()", +"ee1e61b2": "currentFundingStage()", +"ee1e84f6": "performRefereeDecision(uint256,uint256)", +"ee1ec46c": "MembersLength()", +"ee1f5a7f": "setEtherWallet(address)", +"ee1fae7f": "setMaxBatchAssignment(uint256)", +"ee1fc2e6": "decreasePreSaleSupply(uint256)", +"ee1fe2ad": "mint(address,address)", +"ee207e07": "getTimeBonus()", +"ee2089b2": "setPresale(address,bool)", +"ee20e493": "CloudX()", +"ee20e784": "setAllowance(address)", +"ee20f05c": "generatePseudoRand()", +"ee2127c8": "RATE_TIER2()", +"ee216932": "getIcoPhaseOneTokenPriceInPoundPences(uint256)", +"ee216ff5": "setPresaleClosingTime(uint256)", +"ee21aa64": "_getBalance(address)", +"ee224707": "withdrawAllocation()", +"ee22610b": "executeTransaction(uint256)", +"ee2269e5": "returnPtSafeLarge()", +"ee228dec": "createQueue(bytes32,bytes32,bool,bytes32,bytes32,bool)", +"ee22adf8": "_recomputeAccountLastAverageBalance(address)", +"ee2316db": "rand2()", +"ee2383a6": "CreateCampaign(uint16,uint16)", +"ee23a94a": "setSpecialPrice(address,uint256,uint256)", +"ee23e7f7": "runTime()", +"ee245b53": "setFishbank(address)", +"ee24b5e4": "historyBlue(uint256)", +"ee24bba8": "htoa(address)", +"ee255c57": "controllerAddr()", +"ee259ff2": "buyWithEther()", +"ee25f580": "consumeMsg()", +"ee2661ca": "operationalSplitPercent()", +"ee2679bc": "auctionStarted()", +"ee26ab66": "distributeEbyteForEBYTE(address[])", +"ee26bf68": "LogSetup(address,uint256,uint256)", +"ee27ab57": "endFirstDayICO()", +"ee27ac98": "set_new_dividend_share(uint256)", +"ee27e707": "buy(uint8,bytes)", +"ee280f89": "lotteryByETH(address)", +"ee28b744": "getClaimable()", +"ee28ea62": "acceptEscrow(uint256)", +"ee295b32": "Erc20Token(string,string,uint8)", +"ee298d19": "winningChanseSt()", +"ee29ce15": "shareKey(bytes32,address)", +"ee2a0c12": "setPrivateSaleAddress(address)", +"ee2a1ec1": "_removeTokenFromBarn(uint256,address)", +"ee2aab77": "canSend(bytes32,address,address,uint256,bytes,bytes)", +"ee2af3fb": "set_factory(address)", +"ee2b78a1": "minPurchaseQty()", +"ee2c4fec": "PARTNER_SALES()", +"ee2d2490": "bidfailure()", +"ee2dbd8c": "_addSigner(address)", +"ee2dbf86": "hasvote()", +"ee2e66c7": "CryptoSlotsCrowdsale()", +"ee2eba5b": "updateUserClaimInBulk(address[],uint256[])", +"ee2ee146": "unlockTokenForExchange(address)", +"ee2ef6ec": "makeItSellable(uint256)", +"ee2ef9d9": "midasDepositAddress()", +"ee2f00a8": "totalPresaleCount()", +"ee2faf74": "setCrowdsaleBlocks(uint256,uint256,uint256,uint256)", +"ee2fbf3a": "privateFundingSupply()", +"ee30839f": "IkuraMint(address,uint256)", +"ee314997": "calculateTotalGamePrize()", +"ee31bf00": "quickChange(uint256,address[],uint256)", +"ee31eb04": "setBrickAddress(address)", +"ee31f9f6": "totalSupplyTmp()", +"ee3244aa": "unreg_bountyHunter(address,address)", +"ee331490": "Addition(uint256,uint256)", +"ee339fd7": "Pruebacoin123()", +"ee33a04e": "recordId(address)", +"ee33c5f0": "_updateCompanies(bytes32[],bytes32[])", +"ee34c6ad": "hybridizationExists(uint256)", +"ee35478a": "tokenMarketPool()", +"ee355b1f": "cancelTicket(uint256)", +"ee359959": "refundGameAfterLongInactivity()", +"ee360ff0": "transferTokensToDividendManager(address)", +"ee362d3d": "ACATokenSale(address,uint256,uint256,uint256,address)", +"ee36d4ab": "placeBuyOrder(uint256,uint256)", +"ee3711be": "Storage()", +"ee3743ab": "nextStage()", +"ee378610": "etherToTokens(uint256)", +"ee37e271": "setSaleType_Presale(uint8,uint8,uint32,uint256,uint256)", +"ee38232f": "updateNota(uint256,string,string)", +"ee386beb": "TokensPerKEtherUpdated(uint256)", +"ee389b94": "TenToken()", +"ee38c7d3": "BONUS_ICO_STAGE1_PRE_SALE5()", +"ee38cad3": "setYxName(address,address,string)", +"ee39e7a0": "getK()", +"ee3a0229": "processBTCTransaction(bytes,uint256,address,bytes20)", +"ee3a5075": "removeEthInvestorRequest(uint256)", +"ee3a8816": "TheSwifthDAICO(address,address,address,address,address,address,address,address)", +"ee3c3bad": "isAllowedPurchase(address,uint256)", +"ee3cc63d": "MSP(address)", +"ee3d2f07": "massClaim()", +"ee3e3e2a": "tokensPerOneEther()", +"ee3e8a02": "enableSaleOwner(address)", +"ee3ec146": "calculateAccountValuesInternal(address)", +"ee3f1bc7": "changeVoters(address,string)", +"ee4024db": "setAdmin(bytes32,address)", +"ee40a13c": "addNewReport(string)", +"ee40b9bc": "TestRo(uint256,string,uint8,string)", +"ee40d7c6": "SvelteyCoin(uint256,string,uint8,string)", +"ee41858e": "addBlock(address,uint256,uint256,uint256,uint256)", +"ee41ed47": "insertCase(uint256)", +"ee422f13": "borrowItem(uint256)", +"ee428514": "CPTestCoin()", +"ee42b10b": "act()", +"ee42c2d9": "getRewardMatrix()", +"ee4350ed": "sellBonds(uint256)", +"ee43d30f": "allocateRestOfTokens()", +"ee44b7d1": "removeSubOwner(address,address)", +"ee44de25": "BaseExspaceToken()", +"ee4516d9": "getChannelParticipantInfo(uint256,address,address)", +"ee453126": "setErc20token(address)", +"ee45487b": "coinsIssued()", +"ee460c64": "isStored()", +"ee47c809": "BEZOP_EXCHANGE()", +"ee47dcec": "ClubTeamLockContract()", +"ee4827ea": "getCardInfo(uint256,uint256,uint256)", +"ee4833d8": "setupStorage(uint256,uint256)", +"ee48a6e6": "setActivationTime(uint256,uint256)", +"ee4a0122": "chkAdmin(address,address)", +"ee4a8fda": "IncreaseSupply(uint256,uint256,uint256)", +"ee4aa327": "TOKENS_PER_ETHER_DAY_ONE()", +"ee4ae2c9": "sendMoney(address,uint256)", +"ee4be288": "claimBounty()", +"ee4c1ed3": "stakeGLX(address,address)", +"ee4ca97e": "setupAssetProxy(address)", +"ee4d09d9": "Floxytoken()", +"ee4d2823": "burnGold(uint256)", +"ee4d3c7f": "spiceUp(uint256,string)", +"ee4d9402": "addComment(address,uint256,bytes32,bytes32,bytes32)", +"ee4de756": "getEtherollAddress()", +"ee4e4416": "isMaintaining()", +"ee4eabce": "updateContractBalance(uint256)", +"ee4fb202": "NARCoin(address,address)", +"ee51575e": "getUnapprovedUsersTop150(bool)", +"ee51b879": "ceilingStrategy()", +"ee5200a1": "testEggIds()", +"ee52ecae": "generateWinNumberTest(uint256,uint256,uint256,uint256,uint256)", +"ee5301d5": "mint(address,bytes32,bytes32,bytes32[],bytes)", +"ee532f31": "transferFromWithData(address,address,uint256,bytes)", +"ee533a4d": "lockTip(bytes32)", +"ee53b1ad": "getExitFee2()", +"ee53d244": "validCourses(address)", +"ee53d619": "CollectChips(address)", +"ee5418f0": "getRandomCase(uint256,uint256[])", +"ee54876e": "ALXToken()", +"ee5493b6": "isRegisteredFirm(string)", +"ee54d54f": "isVendor(address)", +"ee552390": "getUser(uint64)", +"ee556b5b": "saveMetaData(address,bytes32,bytes32,bytes32,bytes32,uint32,uint256,uint256,bytes32,uint256)", +"ee55efee": "closeSale()", +"ee564544": "_slotCancelNew()", +"ee57e4df": "emptyActiveUserList()", +"ee5845cc": "makeOfferForCity(uint16,uint256)", +"ee588b69": "PORNO()", +"ee594a50": "darknodePublicKey(address)", +"ee59da42": "withdrawERC20(uint256,uint256,address,uint256)", +"ee5c3dfd": "recentWins(uint256)", +"ee5c9654": "changeIncomesSplits(uint256,uint256,uint256,uint256,uint256,uint256)", +"ee5e1551": "BICOIN()", +"ee5e2988": "FreezeTokens()", +"ee5e862f": "purchaseExactWolk(uint256)", +"ee5f013e": "addOptionChain(uint256,uint256,string,uint256,uint256,bytes32,address,int256[])", +"ee5f8c8f": "roundTime()", +"ee607ab1": "lowEtherBonusLimit()", +"ee60b201": "operatorSendByTranches(bytes32[],address,address,uint256[],bytes,bytes)", +"ee60bfd0": "CELLS_TO_MAKE_1_SPERM()", +"ee61873c": "distributeBonusTokens(address,uint256)", +"ee620965": "presaleAddr()", +"ee6392ce": "getWhitelistTotal()", +"ee64f2a4": "ManagersChanged(string,address)", +"ee650248": "vote(uint256,int8)", +"ee65eec2": "ProtoTrailToken()", +"ee66a18d": "setDynamicArrayElement(int8,uint256)", +"ee66dc36": "_updateReputationScore(bytes32,bytes32)", +"ee67575f": "transferWeb3js(address,uint256)", +"ee67aa5a": "_lockToken(uint256,uint256,uint256)", +"ee67fcda": "testBuyManyTimes()", +"ee683d2d": "_clearAllRequest()", +"ee684830": "pollEnded(uint256)", +"ee68702c": "CHRTToken(uint256,string,uint8,string)", +"ee6891af": "transferByThirdParty(uint256,address,uint256,uint8,bytes32,bytes32)", +"ee68edad": "Pacul()", +"ee69590f": "setMarketCreatorSettlementFeeDivisor(uint256)", +"ee699681": "SellableToken(address,address,uint256,uint256,uint256,uint256)", +"ee6a5e54": "setBirthDate(address)", +"ee6ab4a6": "win(address,uint256)", +"ee6c2f49": "getFreeSummonTimestamp(address,address)", +"ee6c5a8b": "totalDestinationBalance()", +"ee6d2641": "sendWithExtraGasExt(address,uint256,uint256)", +"ee6d84c5": "getBlack()", +"ee6e1bba": "initBloomFilter()", +"ee6ef19f": "init_dev_and_presale_allocation(address,address,address)", +"ee6f3a55": "getAmountOfVotersInProposal(uint256)", +"ee6f5dac": "currentAmountRaised()", +"ee70f392": "managerSecondary()", +"ee712f59": "balanceIsNotZero(address,string)", +"ee718c60": "CAC()", +"ee7203b8": "startlistUploaded()", +"ee720837": "Sendmoney(uint256)", +"ee72302b": "_getBidIdList()", +"ee725d44": "toChannelID(string)", +"ee737c12": "TOKEN_DESK_BONUS()", +"ee73c117": "getTokensDistributedPlusTrickleDownBonuses()", +"ee74612b": "PayFreelancer(int256)", +"ee749b26": "putToBank()", +"ee75caa9": "SoldNoBonuses()", +"ee76ac07": "setCalleeContract(address)", +"ee76c2d6": "getInventory(uint256,uint256,uint256)", +"ee777c99": "decreaseRate(uint256,address)", +"ee7782f1": "getPK(uint256)", +"ee77cc51": "_creditUser(address,uint256,uint32)", +"ee77fe86": "scheduleCall(address,bytes4,bytes,uint256,uint256,uint8)", +"ee783c14": "getPriceUSDcETH()", +"ee784123": "getTwo()", +"ee786838": "initialize(address[4],address,uint256[12],uint256,bytes,address)", +"ee78b99c": "setGameConfigContract(address,address)", +"ee790db2": "getDesignatedReportDueTimestamp()", +"ee7a301d": "oldUsers(bytes32)", +"ee7c0db0": "getTokensSold()", +"ee7c1786": "isBidFinal()", +"ee7cf9f2": "kingBlock()", +"ee7d72b4": "setGasLimit(uint256)", +"ee7d92b8": "GenesisAddressTransfer(address,address,uint256)", +"ee7e18df": "drawRound(uint256,string)", +"ee7e2039": "createNewAuction(uint256,uint256)", +"ee7e508a": "getFirstCommonsForum()", +"ee7e94f3": "logging()", +"ee7f371c": "JadeCoinToken()", +"ee7f9c47": "view48()", +"ee7fc5a3": "mulRate(uint256,uint256)", +"ee80d7cb": "currentPreSale()", +"ee815eae": "setAutoPayFee(bool)", +"ee81f3ec": "returnTokenAmount(address[2],uint256,uint256[8],uint8,bytes32[2])", +"ee81f57c": "getCreateUnicornPriceInCandy()", +"ee828cdb": "UnFreeze(address,uint256,uint256)", +"ee82ac5e": "getBlockHash(uint256)", +"ee82ea2d": "performRead3()", +"ee832165": "lastEfficientBlockNumber()", +"ee8327fd": "KpopCeleb()", +"ee836fbc": "DummyToken(string,string,uint256,uint256)", +"ee83ce87": "getToJackpot(uint256)", +"ee84c008": "Boostmi()", +"ee86eccc": "getLastRoundAddress()", +"ee8734d0": "turnFaucetOn()", +"ee87b286": "setQuantstampAudit(address)", +"ee87c3b3": "marginBalanceOf(address)", +"ee880879": "getCommAuction()", +"ee882a99": "getSecondsRemaining(bytes32)", +"ee889ed0": "endPreSale()", +"ee89bb87": "unlockVoterMusic(uint256)", +"ee89dab4": "getInitialized()", +"ee8a0a30": "setArrayLimit(uint256)", +"ee8a4ee2": "releaseAllatOnce()", +"ee8b39f6": "withdrawFreeBalance()", +"ee8b7cd9": "updateProfileName(string)", +"ee8bd1f6": "AddTickets(uint256)", +"ee8bd224": "obtainBounty(address,uint256)", +"ee8c24b8": "getTokenAddresses()", +"ee8c4bbf": "getBounty(uint256)", +"ee8c4c6d": "testPayTeam()", +"ee8cbc9d": "addLimitedWalletAddress(address)", +"ee8cdd4e": "setNewPrice(uint256)", +"ee8d75ff": "emissionFundsAmount()", +"ee8e520f": "confirmPurchase(uint256,address)", +"ee8e993c": "updateBonusPercent(uint256)", +"ee8f31c3": "createNullTile(uint16)", +"ee8f997b": "importPresaleBalances(address[],uint256[],address)", +"ee8ff562": "setMaxProfit()", +"ee91877c": "usernames(address)", +"ee919d50": "setA(uint256)", +"ee91afab": "getNameHash(address)", +"ee91b8a7": "pausedToPublic()", +"ee9267d1": "airdropBalance()", +"ee92d2b5": "setLastAlert(string,int256,string)", +"ee92d484": "isCreator()", +"ee92ef5c": "auctioneerCut()", +"ee92fda1": "getUid(address,address)", +"ee93114c": "thresholdNewAuction()", +"ee947a7c": "lockupPeriod()", +"ee94bdaf": "switchUpgradeAgentLocked(bool)", +"ee94c797": "getMerkleTreeRoot(bytes20)", +"ee94d631": "addPetIdMapping(address,uint64)", +"ee94d7ba": "carousalRatio()", +"ee94ee98": "LogFundingSuccessful(uint256)", +"ee95a9de": "registerNewMerchant(address,address)", +"ee95feaf": "isSeller(address)", +"ee97adbc": "loadEarlyPurchases()", +"ee97f7f3": "master()", +"ee987ffc": "setNextDiscountTTWTokenId1(uint64)", +"ee98aee6": "endCrowdSale()", +"ee99205c": "stakingContract()", +"ee992fd8": "tokensOfCaptain(uint32)", +"ee994a54": "Omisgo()", +"ee999096": "getuseraddressbyid(uint256)", +"ee9a5432": "markMilestoneComplete(uint256)", +"ee9a8489": "getLastDrawBlockNumber()", +"ee9adde1": "medalTransfer(address,uint256)", +"ee9b26bd": "transferPointer()", +"ee9b4152": "MIN_HOLDER_TOKENS()", +"ee9c087a": "bittToken()", +"ee9c26d6": "getmypostlastid()", +"ee9c7f43": "isValidGid(uint8)", +"ee9cb414": "LogEscrowWei(uint256)", +"ee9ce090": "decodeIndirect(bytes)", +"ee9cebde": "unitEthCost(uint256)", +"eea0168a": "completeContract(bool)", +"eea086ba": "currentContextAddress()", +"eea0d168": "deployMiners(address,uint32[],uint32[],uint32[])", +"eea147c7": "getCompoundContract(uint256)", +"eea17587": "getFreelancerContractsByStatus(address,address,uint256[],uint256[])", +"eea19185": "getMaxDisplayPrice()", +"eea21c6e": "EICToken(uint256,string,uint8,string)", +"eea23d8a": "setPromoMoney(uint256)", +"eea2a3ff": "ChangedFeePercentage(uint256)", +"eea327e0": "untrust(address)", +"eea42151": "getCompte_43()", +"eea4b1ad": "setPayloadFrom(address,string)", +"eea4cf1c": "subDev()", +"eea5ac01": "SuperiorBit()", +"eea5d10e": "DepositorLimitChanged(uint256,uint256)", +"eea6753b": "accept(address,uint256,uint256)", +"eea6c540": "getRandomNumber(uint256,address,uint256,uint256,uint256)", +"eea7570e": "gasReserve()", +"eea7e46b": "setAirAmount(uint256)", +"eea8465a": "tokensCommunity()", +"eea8c4da": "changeBSTRequirement(address,uint256)", +"eea95aaa": "unsafeWriteUint(uint256,uint256)", +"eeaa75b9": "getTaskFromToken(bytes32)", +"eeaaf19d": "vote(bytes32,bytes32)", +"eeab221c": "getFreePlumber()", +"eeab57bf": "ALLOC_COMMUNITY()", +"eeaba083": "updatePositions(address,address,int256,uint256)", +"eeac6d78": "FakeZRX()", +"eeac848b": "ChestsStore(address)", +"eeae1f4c": "allPlayerTokenContracts()", +"eeae5e4d": "sharesOfScheme(uint256)", +"eeaec245": "testInitial2of2()", +"eeaee3e4": "LIMIT_PER_USER()", +"eeafe7b0": "setACL(address,uint8)", +"eeb046b3": "BidAccepted(uint256,uint256)", +"eeb0af89": "amountMintPerDuration()", +"eeb2d26b": "getRateAt()", +"eeb3c910": "requestRedemption(uint256)", +"eeb415ee": "batchNewAuctions(uint128[],uint256[],uint256[],uint256[])", +"eeb441a4": "updateLoveStory(bytes16,bytes32,bytes32)", +"eeb46634": "getHolding(address)", +"eeb522aa": "ido()", +"eeb57139": "CollectMoney(uint256)", +"eeb58410": "AGCoin(uint256,string,string)", +"eeb64f0c": "PONADistributionContract()", +"eeb6588a": "donationsStartTime()", +"eeb72866": "identify()", +"eeb7ab0c": "checkImageInput(uint256,uint256,uint256[],bool,bool)", +"eeb7beb2": "designarHeredero(address)", +"eeb8a8a9": "upRoundID(uint256)", +"eeb8b934": "priceMultiplier(uint256)", +"eeb92294": "WithdrawalAfterGoalReached()", +"eeb9635c": "mintTokens()", +"eebb7fe9": "BDragon()", +"eebba256": "HOURLY_VALUE_DECAY_RATE()", +"eebbd2b7": "_transferFunc(address,address,uint256)", +"eebc20d2": "createCopyright(string,address,uint256,uint256,string,string,string,uint256,uint256)", +"eebc5081": "checkpointPrice(address)", +"eebc5a26": "_getFinance()", +"eebc7a39": "getPendingValidators()", +"eebcd477": "setIsBuying()", +"eebddedd": "Redemption(address,uint256,uint256)", +"eebdff04": "_bonusLucy(uint256)", +"eebe18cf": "startGamGetToken()", +"eebe41e0": "changePrefererForTask(address,uint256,address)", +"eebed750": "wDiamond()", +"eebf9808": "PiggyBank()", +"eec03444": "enableBundling()", +"eec0ddd7": "Holders(address)", +"eec11f64": "ABCTokenContract(address,address,uint256,uint256)", +"eec13165": "tokenTest()", +"eec1a391": "addBond()", +"eec2898a": "getRefundGasAmount(uint256)", +"eec2b628": "beforeExecute(address)", +"eec3589d": "_updateSaleInfo(uint256,uint256)", +"eec38cec": "set_pauseSale(bool)", +"eec3cb41": "placeBet(bool[],uint256,uint256)", +"eec3e2e8": "setLLV_edit_29(string)", +"eec3fcff": "CloseCrowdSale(uint256)", +"eec48ca5": "setReferralBonuses(uint256,uint256)", +"eec4bcef": "setMaxPrivateSaleBuy(uint256)", +"eec5d076": "getTotalUnvestedAndUnreleasedTokens(address)", +"eec5f1dc": "audit(address)", +"eec65b98": "transferToMainViaRelay(address)", +"eec65c58": "getOrderMakerTokenAmount()", +"eec69548": "BBTCToken()", +"eec6d500": "multiSend(address,address,address[],uint256[])", +"eec7006f": "roundThreeBlock()", +"eec71bea": "LogTokenIssued(address,uint256,uint256,uint256)", +"eec78546": "buy_Exchg_booking(address,uint256,uint256,address,uint256)", +"eec7faa1": "tokenAmount()", +"eec809ff": "setMonthWithdraw(uint256)", +"eec8d544": "CROWDSALE_TARGET()", +"eeca6afd": "CPSToken()", +"eeca6df7": "getFreeVines()", +"eecb24ec": "priceDecreaseRate()", +"eecb4a65": "GRETToken()", +"eecb7005": "useAsBankroll()", +"eecc3135": "DAICOCap()", +"eecc3be8": "all_creatures()", +"eecd2789": "left86(uint256)", +"eecd8876": "GexAlloc(address)", +"eece1e1f": "scheduleShuffling()", +"eece203a": "disableTransferAgreement(uint256)", +"eeced605": "addPrediction(bytes32,uint256,uint256,uint8,uint256,address,address)", +"eecf78b3": "makePurchase(uint256,address,string)", +"eecfb384": "icoBonus5EndDate()", +"eed02e4b": "joinGroup(uint256)", +"eed04e69": "preBuyPrice3()", +"eed0c172": "FoodSafetyChain()", +"eed0fc03": "generateFinalTokens(uint256)", +"eed11836": "getTreeSize()", +"eed331f7": "tokenOwnerNumberMax()", +"eed3f79e": "gameRefund(uint256)", +"eed45ca8": "setIsShareToken(bool)", +"eed47127": "TOTAL_MIND_TOKEN_SUPPLY()", +"eed50a32": "delegation(address)", +"eed65c11": "auctionSize()", +"eed7128c": "_generateRandomGenes()", +"eed72217": "addressToMinimumTextDonation(address)", +"eed7eaea": "getAirdropStatus(address)", +"eed857e1": "surrender(address,bytes32,uint256)", +"eed92ad5": "AdrenalinCoin(uint256,string,string)", +"eeda0e21": "earningsFromNumberOfCells(address,address)", +"eeda149c": "Register(address)", +"eeda22c6": "ownerPauseRecommend(bool)", +"eeda6357": "betCount_()", +"eedb1743": "removeSaler(address)", +"eedb714c": "CO_FOUNDER_PORTION()", +"eedb95c9": "changeZS(address,uint256)", +"eedb9ed5": "minPremium()", +"eedbd7eb": "ClosePatent(bytes32)", +"eedbe31d": "getCurrentStage()", +"eedc966a": "tokenBalance(address)", +"eedc9a8d": "IndorseToken()", +"eedcf50a": "mainDAO()", +"eedd1dd3": "doesProofExist(uint256,string,string,uint256,bytes32)", +"eede471e": "goToSleep(uint256)", +"eedf504d": "BG1Token()", +"eee007e2": "initialSingleWithdrawMax(uint256)", +"eee02e61": "getMerchantPassword(address)", +"eee09758": "setMyCut(uint256,uint256)", +"eee0b552": "resetCallsCount()", +"eee0d9e2": "Elements()", +"eee14119": "PROSH()", +"eee144df": "getInitialSeedAsFixedPointForGameId(uint256)", +"eee187fd": "getMemberIdxOfUser(address)", +"eee1c59d": "oneHourAfterStartTime()", +"eee1e7e5": "calculateBurnAmount()", +"eee1f5f9": "getOwnedWineCountOf(address)", +"eee24219": "rateContract()", +"eee24570": "getPet(address)", +"eee2cc46": "returnEverything()", +"eee3671b": "wadmin_withdrawFund(uint256)", +"eee392c8": "initialTransfer(address,uint256)", +"eee3c4c9": "stageThreeCap()", +"eee428c0": "MAX_FUND_ASSETS()", +"eee457f7": "getContributionFromHash(bytes32)", +"eee56b7a": "takeout(uint256)", +"eee59ccf": "ownerAccessoryTransfer(address,uint64)", +"eee6ce93": "PRESALE_ETH_IN_WEI_ACCEPTED_MIN()", +"eee78595": "transferCustomToken(address,address,uint256)", +"eee881e8": "_stand(uint256,uint8[],bytes32,uint8,uint8,bytes32,bytes32,bool)", +"eee908ed": "changePriceCurveSettings(uint256,uint256,uint256,uint256,uint256)", +"eee92395": "fund(uint256,address)", +"eee94805": "getTokens(uint256,uint256,bool)", +"eee95f6d": "setbtyctoken(address)", +"eee97206": "double(uint256)", +"eeeb17e7": "deauthorizeMintFulfiller(address)", +"eeeb4f36": "ASTC()", +"eeebb30c": "changeRateWin(uint256)", +"eeec0e24": "relay(address,uint256)", +"eeed1767": "whiteListInvestor(address)", +"eeed1b26": "extensionTime()", +"eeed908a": "PublisherUnregistered(address)", +"eeee7cc0": "depositFiat(address,uint256,bytes32)", +"eeef9d55": "getAuctionIdArray(uint64,uint64)", +"eef017f1": "getCompte_2()", +"eef05f65": "setTokenIpfsHash(address,bytes)", +"eef0ef1e": "changeTeamPoolInstant(address)", +"eef0fdbe": "closeLoanOnBehalfOfRecurse(address,address,address,bytes32,uint256)", +"eef1812d": "settingsIco(uint256,address,uint256,uint256,uint256)", +"eef21cd2": "removeCaller(address)", +"eef22a79": "MultiAirDropToken(uint256,string,uint8,string)", +"eef27913": "ContractFeeChanged(uint256,uint256)", +"eef3a0fa": "PPPC(uint256,string,uint8,string)", +"eef3c914": "DelegatedTo(address)", +"eef44945": "Sudosucks()", +"eef49ee3": "deposited()", +"eef547d7": "deal_details(uint32)", +"eef55c72": "getBallotOfSender()", +"eef5a499": "createProductionUnit6()", +"eef5acb4": "SubscriptionDepositReturned(uint256,uint256,address,address)", +"eef5bfae": "UpdateSavingsBank()", +"eef68db5": "gameFinished(uint256,uint256,uint256,uint256)", +"eef6f89d": "bonusClosingTime1()", +"eef719b1": "getQuarterResult(uint256)", +"eef72a3c": "claimTokens(address[])", +"eef73ebb": "setSaleRate(uint256)", +"eef73ff9": "Devs_Supply()", +"eef7dd0a": "GetBetId(uint256,uint256)", +"eef80bbc": "getData_11()", +"eef85ced": "getMytokenBalance(address)", +"eef892aa": "tokenMint(address,uint256)", +"eef8e35f": "setChainyURL(string)", +"eef90cbe": "tokenPublicSale()", +"eef93611": "GetDChainRevokableHash(bytes32,uint32)", +"eef9495c": "CABoxToken()", +"eef94a21": "createT513many(uint256,uint256,address)", +"eef9c27c": "requestTokens(uint256)", +"eefa597b": "isToken()", +"eefa5dfc": "PingPaid()", +"eefb9538": "setData_32(string)", +"eefc3083": "tokenColors(address)", +"eefe3818": "createOpenAndLock(address,address)", +"eefe8527": "MysteriumPricing(uint256)", +"eefea6b7": "feeFromTotalCostForAccount(uint256,uint256,address)", +"ef006b65": "presaleBonusTier4()", +"ef0143a3": "sendPixelsToMarket(bytes32,uint256)", +"ef01db0e": "assignItemRafflePrize(address)", +"ef02ad08": "getTokenInfoDataTracking()", +"ef02ce46": "Rafatar()", +"ef02d5d6": "durationCrowdSale()", +"ef0377fd": "SomaIco(address,address,address,uint256,uint256,uint256)", +"ef043c5a": "Netkrone()", +"ef04fdb7": "buyShares(bytes,uint8,uint256,uint256)", +"ef051f0c": "BlankCanvas()", +"ef057245": "SECUREOURSCHOOLS(uint256,string,uint8,string)", +"ef0582b6": "addEpisodeData(uint256,uint256,uint256,string)", +"ef058f52": "getGoldInfoVendor(address)", +"ef05bf0e": "ROUND_2_PRESALE_BONUS()", +"ef05dc2f": "modX(uint256)", +"ef0614b9": "getItemIds()", +"ef069ae3": "changeSaleMinimum(uint256)", +"ef07a81f": "getDonation(uint256)", +"ef084006": "unholdDate()", +"ef0901b8": "_gapOfCubeSum(uint256,uint256)", +"ef096063": "PollCreated(uint256,uint256,uint256,uint256)", +"ef0a14f8": "removeAddressFromAdmin(address)", +"ef0a3046": "sendOutEther()", +"ef0ad164": "testContractOrNormal(address)", +"ef0aea3c": "getisPlay(bytes32)", +"ef0b2368": "bytes32ToStr(bytes32)", +"ef0b44db": "bonus2Ends()", +"ef0b4db3": "markAsProject(address)", +"ef0b5420": "getOwedDividend(address)", +"ef0dbcbb": "setContractAt(uint16,uint16,uint8,address,address)", +"ef0dd241": "minCapTokens()", +"ef0dddba": "earlybonus()", +"ef0e239b": "getService(uint256)", +"ef0f52bc": "hodlAdded(uint256,address,uint256,uint256)", +"ef110f49": "TotalDeposits()", +"ef113b69": "_internalVote(address,address,uint256)", +"ef115542": "clearStorage(uint256[])", +"ef11e18b": "log_transfer(address,address,uint256)", +"ef11e55b": "isEarlyBonus()", +"ef11ef3d": "HubiiNetworkTokens()", +"ef125360": "removeWhiteListed(address)", +"ef12af52": "ReentrancyMock()", +"ef13070b": "ChangeicoWallet(address)", +"ef1367dd": "setLanguages(bytes3[])", +"ef14124f": "getAmountToUpdate(uint8)", +"ef14a0f6": "CBITToken()", +"ef14adc7": "sellingEnable(uint256)", +"ef15c51c": "deleteRoomByRoomID(uint256)", +"ef1706ce": "drainTokens()", +"ef18374a": "getOwnerCount()", +"ef18e458": "frozenTransferFrom(address,address,uint256,uint256,bool)", +"ef18e9ed": "acceptOrder(uint256)", +"ef1961b4": "Dropped(bytes32,address)", +"ef19792a": "licenseTerms(bytes32)", +"ef19c332": "_checkSigned(bytes32,uint256,uint8,bytes32,bytes32)", +"ef1ad460": "DAPPStoreToken()", +"ef1bfef9": "m_sharedDividendBalance()", +"ef1e5663": "updateBalances(address,uint256)", +"ef1e7e3f": "deauthorizeBurnFulfiller(address)", +"ef1e8dae": "lastBlock_a13()", +"ef2025c2": "burnTokenStatus()", +"ef20bff8": "getSpawnLimit(uint32,uint256)", +"ef21059e": "cancelEth(uint256)", +"ef220233": "getGrid8()", +"ef228e1a": "UCASH()", +"ef229dc7": "setStepMoney(uint256)", +"ef22b87f": "executeTransaction(address,uint256,uint256)", +"ef233f5c": "RELEASE_THRESHOLD()", +"ef23b3a3": "quotaOf(address)", +"ef24b77c": "RegisterNewKey(address,address)", +"ef24bd6b": "ESCBTokenSale(uint256,uint256,address,uint256)", +"ef2573fc": "calculateHouseCutAmount(uint256)", +"ef265d6d": "burn(uint256,address,address)", +"ef26e41d": "whiteLister()", +"ef270ee2": "getApproved(bytes32)", +"ef284d8f": "DiscardToken()", +"ef289d8d": "NewKing(uint256,address,string,uint256,uint256,uint256)", +"ef29a7e5": "emitWorkFinished(uint256,uint256)", +"ef29d2bb": "setNeighbourRewardPercentage(uint256)", +"ef2a9147": "balancesListAddressMap(uint256)", +"ef2b04d1": "callBtcWithStc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"ef2b7d65": "publicGetParticipant(uint256,uint256)", +"ef2bbbdf": "updateEndDate(uint256)", +"ef2bd19e": "getDisapprovalsFor(address)", +"ef2c5842": "_getTknAddr()", +"ef2cc977": "MAX_AIRDROP_TOKENS()", +"ef2d44c3": "setChampForSale(uint256,uint256)", +"ef2d5786": "createDelegation(address,uint64,address)", +"ef2d8700": "getDocuments()", +"ef2ddb55": "presaleUnfreeze(uint256)", +"ef2de6f8": "ownsPlayerTokens(uint32)", +"ef2e2059": "resetGenesisBlock(uint256)", +"ef2e3fbc": "getTokenInfoHeritor(address)", +"ef2e7321": "INITIALGASFORORACLIZE()", +"ef2e7c48": "IMDEXtrade(uint256[8],address[4])", +"ef2e95d7": "ubdateBTC()", +"ef2f2750": "request_payout_users()", +"ef2f92ad": "forfeitShares(uint256)", +"ef2fa169": "setServiceFee(address,uint256)", +"ef2fd54d": "viewVotes()", +"ef303553": "athleteCanClaimPercent()", +"ef3088d1": "AirDropRedeemAFTK2()", +"ef31bfd1": "isValidSignatureAndMethod(address,address,bytes)", +"ef3229db": "addTokenFunds()", +"ef323d85": "getPlotPrice()", +"ef326c6d": "isOps(address)", +"ef3336f5": "paymentsByBenefactor(address)", +"ef3377ca": "devWalletLocked()", +"ef338b88": "seekOdd(uint256,uint256)", +"ef339fc4": "getTokenProxyAddress()", +"ef33f8f0": "bet1000_001eth()", +"ef343588": "trade(uint256[8],address[4],uint8[2],bytes32[4])", +"ef34ded2": "lottoLength()", +"ef35b59d": "_withdrawTokensToWallet()", +"ef35cdbb": "getLLV_edit_30()", +"ef35d902": "preIcoEnds()", +"ef35fc16": "HIGH_RANGE_RATE()", +"ef3613c3": "allEth()", +"ef36a883": "termsAndConditionsAreSigned(address,uint8,bytes32,bytes32)", +"ef36fa39": "fpart(int256)", +"ef37052d": "isArrAccountIsNotFrozen(address)", +"ef37cfe9": "getBetsCountAndValue()", +"ef37f061": "IPOcoinHotelShares()", +"ef387a50": "rateIco()", +"ef38a306": "genWallet()", +"ef38d089": "UpdateSellAgent(address,address)", +"ef394e1b": "getFastest(uint16,uint8,uint8)", +"ef39fe35": "updateSaleStageManually(uint256)", +"ef3a6031": "testBaseToken()", +"ef3aaf54": "setHouseAddress(address)", +"ef3adfb3": "XPAAssets()", +"ef3b70bc": "setMultiRequestRegistrar(uint256,address)", +"ef3bec3d": "endow(address,uint256)", +"ef3c0531": "contentHostById(bytes32)", +"ef3c64a8": "IcoTokenMock()", +"ef3cbc39": "minOrderEthAmount_()", +"ef3cdb2f": "upgradeM5Token(address)", +"ef3d622b": "EOSBetBankroll(address,address)", +"ef3e8869": "claimStarter(string,uint256)", +"ef3f7c55": "TokenSold(uint256,string,uint256,uint256,address,address)", +"ef406d01": "TokenEBU(uint256,string,string)", +"ef4080bd": "init_pre_ico(address)", +"ef40c3e6": "tokenSwapLock()", +"ef416aec": "firstMonthEnd()", +"ef41e06f": "testThrowSetEnforceRevisionsNotOwner()", +"ef41ea7e": "feePerc()", +"ef41f95a": "newProposal(string,address,uint256,address,uint256,bytes)", +"ef427776": "internalCalculateBonus(uint256,uint256,uint256)", +"ef42b5da": "withdrawFunds(address[])", +"ef430aa6": "category()", +"ef431437": "lastDayPaid()", +"ef43a2b8": "ChangeEmissionRateCoefficient(uint256)", +"ef4445b8": "contribute(uint8,bytes32,bytes32)", +"ef449888": "allowsNewGames()", +"ef455b3c": "substractFromNumber(uint256)", +"ef4592fb": "getResult(bytes)", +"ef464e19": "internalRelease(uint256)", +"ef46e0ca": "executeOrder(uint256,uint256)", +"ef474056": "changeOpenString(string)", +"ef47492b": "summFoundersShare()", +"ef4787a1": "getIsLimited()", +"ef478bf6": "deleteInvestor(address)", +"ef47ff4b": "balance(uint8)", +"ef4886ef": "retrieveVanityForWallet(address,address)", +"ef48eee6": "pay(uint256,uint256)", +"ef49567e": "E_Bid(address,uint256)", +"ef49b414": "isGladiatorChest(uint256)", +"ef4a0c61": "ico_starting_supply()", +"ef4b31d8": "proxySetup()", +"ef4b41b9": "upgradeShifter(address)", +"ef4b6831": "callModifiedDeposit(uint256)", +"ef4b91c0": "ProxySender(address)", +"ef4ba598": "offerPriceEth(uint256)", +"ef4bdfdd": "Set_your_game_number_between_1_15(string)", +"ef4c8685": "LogNewWallet(address)", +"ef4d6149": "investedAmoun(address)", +"ef4e679b": "totalNtsSold()", +"ef4ec047": "addFounder(address)", +"ef4ef103": "bankrollExternalUpdateTokens(uint256,uint256)", +"ef4f0c5f": "changeExtraBets(uint256)", +"ef4f6e9c": "calcUnMaskedEarnings(uint256,uint256)", +"ef4fac01": "calcTotalTokens(uint256,uint256)", +"ef4ffee2": "Honestgamble()", +"ef50aec0": "set_taxi_driver(address)", +"ef5121b3": "appreciationRateWei()", +"ef520aba": "getall_horsesCount()", +"ef52ad21": "MintMade(uint256,uint256,uint256)", +"ef52b0dc": "RuneToken()", +"ef53030c": "thelnwaonCoin()", +"ef532a47": "addBagAndGift(uint256,address)", +"ef538593": "NeptaToken()", +"ef54801b": "getGrantBeneficiaries()", +"ef548aaf": "PLAYER_TURN_SINGLE_PERIOD()", +"ef54af8b": "TieToken(address)", +"ef551b38": "PaymentAddress(address,bytes4)", +"ef556029": "testFallbackIsCalledOnTransfer()", +"ef5793c2": "LOG_OwnerWithdraw(address,uint256)", +"ef57cbec": "BARToken()", +"ef5850c7": "stakersForPoll(bytes32)", +"ef589693": "getSMPTokensBoughtInICO()", +"ef599ba5": "getCoinBalance(bytes4,bytes32)", +"ef59f8c8": "setRaffleAddress(address,address)", +"ef5a3a88": "dividendsIndex()", +"ef5a625b": "disqualify(address)", +"ef5a80af": "ProductAdded(address,address,address,string,bool)", +"ef5a8fb5": "sellLand()", +"ef5ba9ed": "ALLOC_AIRDROP()", +"ef5c2010": "SelfPayPreSale(uint256,uint256,uint256,uint256,uint256,address,address)", +"ef5d5331": "isHashValid(bytes32)", +"ef5daf01": "_dumpToCompany()", +"ef5f937c": "OpportyToken()", +"ef5fad95": "DaWeiToken(uint256,string,string)", +"ef5fb05b": "sayHello()", +"ef5fbdb2": "stopPlaying()", +"ef5fd51b": "getKeys(uint32,int256)", +"ef61041c": "_approveAllArgs(address,uint256,address)", +"ef616584": "getPurchaseETHNum()", +"ef642054": "car_propose(uint256,uint256,uint256)", +"ef6506db": "credit(address,uint256)", +"ef660169": "withdrawRest()", +"ef660ab8": "deliverCandidate(uint256,uint256)", +"ef674e66": "isWhiteListed()", +"ef67caa0": "reservedTokensFounders()", +"ef685294": "addCascade(address,uint256)", +"ef688df5": "addFundraiser(address)", +"ef68913c": "dronesDeployed()", +"ef6957d0": "ownerSetIsClosing(uint256,bool)", +"ef69f408": "protectedTransfer(address,address,uint256)", +"ef69f7d9": "ManagerRemoved(address)", +"ef6a676d": "allowTransferToken()", +"ef6a6bcc": "LogAddressCapExceeded(address,uint256,string)", +"ef6a88de": "AbstractQuintessenceToken(uint256,uint256)", +"ef6ac0f0": "run(bytes32)", +"ef6b141a": "setStarted(bool)", +"ef6b329a": "close_down()", +"ef6c4b93": "addLimitAddress(address)", +"ef6d1cc8": "QZToken(string,string,uint8,uint256)", +"ef6d7b3b": "emitCancelled(address,uint256,uint256)", +"ef6da43c": "setIsWeiAccepted(bool,uint256)", +"ef6f1f36": "setData_25(string)", +"ef6f8e92": "Creative()", +"ef6face6": "privateContribution()", +"ef706adf": "cancelOffer(uint256)", +"ef70aebf": "endMinting()", +"ef71a1f2": "BCREWARDS(uint256,string,string)", +"ef7293d7": "SELLER_STEP_4_ACCEPT(bytes32)", +"ef739d0f": "changeCountry(uint256,bytes2)", +"ef7507c8": "testWinner(uint256)", +"ef765af8": "erc20ApproveChecking()", +"ef76c060": "HPQToken(address)", +"ef778d30": "createProject(address,string,string,bytes32)", +"ef77b601": "SHAREFIDENCE()", +"ef77ed99": "isFundingState()", +"ef78a5b2": "singleUserSignUp(address,address)", +"ef78d4fd": "period()", +"ef79a35f": "getNumberOfLocks(address)", +"ef7a4a32": "logoId()", +"ef7a5956": "BRONZE_AMOUNT_SKL()", +"ef7a5a2a": "getIudexScoreAll(address,bytes32)", +"ef7ac0e5": "enableTransfer(bool)", +"ef7c7797": "getSaleContractDepositAddressVerified(address)", +"ef7c9ecd": "preIcoTotalSupply()", +"ef7d47a5": "setMinBlockPurchaseInOneGo(uint256)", +"ef7dbc54": "listCompetitors()", +"ef7dd831": "SUPPLY_FOR_ADVISORSL()", +"ef7e1e89": "pow()", +"ef7f23a6": "numberOfBlocksBetweenSupplies()", +"ef7f2e1c": "addHashrate(address,uint256)", +"ef7f3834": "grantInitialAuthentication(address)", +"ef80027e": "Members_info(address)", +"ef802e62": "tokensRemainingStage2()", +"ef804ead": "testInequalityBytes()", +"ef80c53a": "earlyReserveBeginTime()", +"ef80f1ab": "LitmusCrowdsale()", +"ef80ff18": "tokenExchangeAddress()", +"ef816fd9": "isState(uint256,uint8)", +"ef817f2a": "EtherZaarFactory()", +"ef81eb57": "removeLastSaleOnlyNotActivated()", +"ef82c8a8": "geProposalCount()", +"ef82f95c": "setFront(address)", +"ef8322fd": "queryRoles(address)", +"ef84e27f": "getWorkpointSupportCancel()", +"ef8594be": "setPriceStep6(uint256)", +"ef85fdad": "IRC_PER_ETH_SALE()", +"ef869443": "investWithCustomerId(address,uint128)", +"ef8700e5": "tokensForDevelopment()", +"ef885772": "GCCERC20(uint256,string,string)", +"ef890cc8": "isGameFinished()", +"ef898355": "revealHiddenPosition(uint32,int64[2],bytes16)", +"ef89d6e3": "getArmorValue(uint256)", +"ef8a22ac": "mineableTokens()", +"ef8a9235": "currentStatus()", +"ef8a9c8f": "allocatedStage()", +"ef8b0e15": "processContribution(address,uint256,uint256)", +"ef8b5892": "setRoundTwoRaito(uint256)", +"ef8c1d86": "ownerWithdrawParsecs(uint256)", +"ef8c2c58": "openModifyCountdown()", +"ef8c8944": "setPlayerId(uint256)", +"ef8d4a49": "getAssetIDForTypeSequenceID(uint256,uint256)", +"ef8dcc2e": "LogTransactionConfirmed(bytes32,address,uint256)", +"ef8dd09b": "deleteEntry(bytes32)", +"ef8e8069": "smallPrice()", +"ef8ea3d0": "NewRegistration(uint256,address)", +"ef8f1229": "EMISSION_FOR_SALESTAGE3()", +"ef8fdfd8": "Bonus()", +"ef902a0c": "ShowBool(bool)", +"ef9089d6": "nextPrice()", +"ef90aa46": "givenBountyTokens()", +"ef9124e1": "TrinityToken()", +"ef9130b9": "getBetItemCount()", +"ef921826": "setMaxDuration(uint32)", +"ef922305": "DACCToken()", +"ef92742e": "ICOmint()", +"ef92b384": "saveGenCode(address,uint256)", +"ef92b701": "CFC()", +"ef940837": "payday(uint256,address,uint256)", +"ef941dca": "issueTokens(uint256,string)", +"ef943909": "PublisherAddress()", +"ef94ce1e": "addMenu(string)", +"ef9521ea": "GruffinzContact()", +"ef95aa5d": "getManifest(address,bytes32,uint256)", +"ef961367": "registerForCompetition(address,uint8,bytes32,bytes32)", +"ef982eba": "settournamentPrizeAddress(address)", +"ef984923": "transferTenuousTokenOwnership(address)", +"ef98dea3": "getAuctionManagerAddress()", +"ef99c9ef": "DACVest()", +"ef9b0214": "read_i32_array()", +"ef9b559a": "CLX()", +"ef9bfe1a": "returnInvestors()", +"ef9c3512": "falconmasterReq()", +"ef9c4446": "cancelProposeTo()", +"ef9c52ea": "maxIco()", +"ef9c79da": "getFileNum()", +"ef9cb474": "changeWorkerPoolPolicy(uint256,uint256,uint256,uint256)", +"ef9da13d": "getPeriodOwnerLockedBalance(uint256)", +"ef9e7f95": "self_readyTime()", +"ef9f6023": "PUBLICSALE_SUPPLY()", +"ef9fc1de": "DelegateChanged(address,address)", +"ef9fc50b": "addNumbers(uint256,uint256)", +"ef9fe3ac": "setCompte_8(string)", +"efa08854": "companyShare()", +"efa0a1ef": "SettankImposedMax(uint256)", +"efa0e659": "EthX()", +"efa1c34c": "destroyChannel(address)", +"efa227ca": "finish(uint16)", +"efa25196": "getDevidends()", +"efa390f6": "createNewEvent(bytes32,string,uint256,uint256,string,string)", +"efa3d586": "add(address,uint8,uint256)", +"efa3dccd": "totalDividendsPerCoin()", +"efa408de": "setReservedTokensListMultiple(address[],uint256[],uint256[],uint256[],bool[])", +"efa40c2a": "engine(string,string,address)", +"efa4f94d": "computeDeadline()", +"efa52fb3": "iterateGet(uint256)", +"efa56a1e": "use_OEM_Parts(bytes32,uint256,uint256)", +"efa5d431": "vote(address,address,uint256)", +"efa6fd63": "perTransactionRate()", +"efa726e8": "setEggLimit(uint16,uint16)", +"efa74f1f": "getTokenBySymbol(string)", +"efa7e56b": "GameEnds()", +"efa85335": "Registrar_Oraculo(address)", +"efa8d998": "GetEtherSpent(address)", +"efa94e47": "createToken(bytes32,string,string)", +"efa99ecf": "SubModuleSuspended(uint256)", +"efaa55a0": "joinGame(uint256)", +"efaa86b1": "claimTeamTokens(address)", +"efab1e50": "getInvestorDetails(address)", +"efab4b91": "_unpackIntelligenceValue(uint256)", +"efabaa89": "sortTrusted()", +"efac0fd0": "PowerEvent(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address[],uint256[])", +"efac4db4": "add(address[],uint256)", +"efacd73b": "_createRocHunting(uint256,uint256)", +"efad6df3": "cycleLimit()", +"efada80b": "getRunDetails(uint256)", +"efada94b": "setParentPayoutDistributionHash(bytes32)", +"efae0f2f": "AIR_1()", +"efaf8e22": "isSenderRegisteredAgent(address)", +"efaf90c8": "DAYS_31()", +"efb0cdd9": "MeTooToken()", +"efb109d4": "privlocatum(string,string,uint8,uint256)", +"efb173d4": "addCompany(uint256,string)", +"efb1900d": "deleteThisContract()", +"efb20f6a": "Worldcoin1()", +"efb23d73": "getFirstHexByte(bytes1)", +"efb2bfd3": "signatureChecker()", +"efb369c7": "transferFundsByOwner(address,address)", +"efb588e4": "presaleMaxValue()", +"efb610bc": "isExternalBuyer(address)", +"efb7601d": "getExchangeRate(address)", +"efb7e8b3": "mistakenTokens()", +"efb7fa77": "unLinkFromMasterWallet(address,address)", +"efb8b6b1": "after10Seconds()", +"efb95ced": "masterRewardsPercent()", +"efb98bcf": "getRemainingTime()", +"efba9bd2": "recoverLeftovers()", +"efbb5f17": "retrait_2()", +"efbb6108": "transferStbToOwner(uint256)", +"efbbbd65": "getLambo(uint256)", +"efbbe160": "abiDecodeRegister(bytes)", +"efbc0075": "transferOwnerShipToPendingOwner()", +"efbc5469": "addTransaction(address,uint256,uint256)", +"efbcae98": "deleteMemberOfCommunity(address,uint256)", +"efbcebe5": "ObsToken()", +"efbd4bff": "priceForRect(uint256,uint256,uint256,uint256)", +"efbd863e": "setRealTokenPrice(int128)", +"efbd8a92": "setPriceFactor(uint256)", +"efbd9ec2": "changeList(address,bool)", +"efbe1c1c": "end()", +"efbe31d5": "removeHoldByAddressIndex(address,uint256)", +"efbe3894": "MakePatient()", +"efbe4262": "_removeSuperInvestor(address)", +"efbe584d": "isDEditor(bytes32,address)", +"efbe62e8": "validate(uint256,bytes)", +"efbe8fd1": "createToken(string,string,string,uint256)", +"efbec487": "payBoss(uint256)", +"efbee9b3": "_stake(address,bytes32,uint256)", +"efbf7d83": "GrowGuildToken()", +"efc018cc": "coupDetat(address)", +"efc0712c": "activateGladiator(address)", +"efc07e84": "withdrawBalanceERC20(address,uint256,address)", +"efc139cd": "SmartBooking()", +"efc1595e": "DeDice()", +"efc1ba92": "FakeMembershipRegistry(address)", +"efc1c0ab": "SimpleNameRegistry()", +"efc2fd2a": "getRefillStatFor(string)", +"efc3323c": "createEvent(bytes16,bytes16[],bytes16[],uint256[])", +"efc3d252": "GetLuckyLandIds()", +"efc4cbdd": "Fiocoin()", +"efc4f1dc": "switchSaleState()", +"efc58aea": "spawnAsset(address,uint256,uint256,uint256)", +"efc5c693": "executeSell()", +"efc63bd3": "_rawGetGlobalDelegation(address)", +"efc65b3a": "CindicatorIssued()", +"efc7285c": "mintPresaleWithBlock(address,uint256,uint256,uint256,uint256)", +"efc7652e": "getBAU2(bytes32,address,uint256)", +"efc77f3f": "LTHToken()", +"efc78401": "isSenderAllowed(address)", +"efc81a8c": "create()", +"efc82381": "FirstTimeTransfer()", +"efc8d3c6": "amountReservedRefsTokens()", +"efc927b9": "ShowEmissionRate(uint256)", +"efca0214": "HotPotToken()", +"efca2eed": "totalDistributed()", +"efca9f09": "minimumPurchaseLimit()", +"efcb6cde": "changeOwner(bytes32,bytes32,bytes32,address,string,bytes32,bytes32)", +"efcc3c7f": "getMiniPoolEdit_3()", +"efcceaae": "getGamePaused()", +"efcd1cd9": "signatureSplit(bytes)", +"efcd2ddd": "changeOracleAdd(address)", +"efcd853f": "DogezerPreICOCrowdsale(address,address,address,address)", +"efce0688": "createPrometh(address)", +"efce079e": "doQuest(uint256)", +"efce1d66": "BitEyeEx(address)", +"efce6e78": "PinkyToken()", +"efce828e": "skinCreatedNum()", +"efcee869": "vote(bool,string)", +"efcefb40": "withdrawAllFor(address[])", +"efcf095c": "viewNumberOfMemories()", +"efcf2479": "trim(string,string)", +"efcf2730": "_premint(address,uint256)", +"efcf4f41": "getPixel(uint16)", +"efcf6d68": "finanReserveTimeLock()", +"efd0c851": "getPayoutReadyState()", +"efd0f455": "getChStatus()", +"efd12624": "startPostICO()", +"efd2abec": "calculateAntBuySimple(uint256)", +"efd2fb9b": "DeltaToken1()", +"efd46e1d": "E4RowEscrow()", +"efd4d0a6": "finishedloading()", +"efd6479a": "publicGetUserInfo(address)", +"efd64af9": "getReportingWindow()", +"efd71eb0": "updateVaultWallet(address)", +"efd7313d": "setExists(bytes32,bool)", +"efd73adc": "MigrationFund()", +"efd76499": "_cancelOrder(address,uint256)", +"efd8871a": "revoke(bytes32,address)", +"efd8c379": "userXRTBalance(address)", +"efd979cb": "setMinimumEtherToAccept(uint256)", +"efd9d7e0": "KoosAlbertsToken()", +"efdc4d01": "extraReceiversLength()", +"efdc5b77": "change_nodelist(address)", +"efdcb506": "getMsgGasBefore()", +"efdcc0f8": "getTeamTokens(uint256)", +"efdcd974": "setFeeReceiver(address)", +"efde6dcf": "Rejected()", +"efde9d6e": "InitChallengeAddress(address[10],address,uint256[10])", +"efdea046": "test_3_someTest()", +"efdecd9b": "check_withdrawdao()", +"efdee94f": "deployerAddress()", +"efdff7bb": "getContractAddressById(bytes32)", +"efe08a7d": "changeAddress(address,address)", +"efe0e495": "calculateVestedTokensNumber(uint256,uint256,uint256,uint256,uint256)", +"efe1525e": "viewFeaturedLength()", +"efe213a9": "_getCurrentPeriod()", +"efe2c8a4": "setConsumerAddress(address)", +"efe37d6f": "ELTTokenImpl()", +"efe3f4f4": "determineInterfaceImplementationStatus(address,bytes4)", +"efe43338": "determineWinner(uint256)", +"efe4e0a1": "iterateThroughSwarm(address,uint256,uint256)", +"efe51cca": "state2()", +"efe6bfa3": "sellOrders(bytes32)", +"efe6c772": "MAX_PLAYERS_PER_STAGE()", +"efe79268": "PRICE_STANDARD()", +"efe7a504": "END()", +"efe7c791": "RANGESTART_5()", +"efe86dd5": "batchPunchOut(address[],uint64[])", +"efe89d5a": "tokens2owners(address)", +"efe8c94f": "_safeSub(uint256,uint256)", +"efe93036": "getListTeamByPlayType(uint256)", +"efe998b9": "ethDividendAmount()", +"efe9b08d": "dissolve(address)", +"efe9e86b": "MyPinerTokenTest3()", +"efea0172": "startIco(bool)", +"efea835a": "devfeesoutstanding()", +"efeb4ad7": "onMoneySent()", +"efeb5e58": "beneficiaries(uint256)", +"efeb5f1f": "addWallet(address)", +"efeb941d": "ICOstart()", +"efebc720": "swapEndTime()", +"efecab8a": "addSale(address,uint256)", +"efed160f": "func_0431()", +"efed7b0a": "fondPlatform()", +"efedf429": "admin_member_isWithdraw(address,bool)", +"efeecb51": "getNumberOfTokens()", +"efef39a1": "purchase(uint256)", +"efef445b": "transferDataFrom(address,address,uint256,bytes)", +"eff02ec5": "returnBorroweedEth()", +"eff134ee": "withdrawTokenOwnerReward()", +"eff14c78": "submitValue(bytes8)", +"eff24744": "getTaskAddress(bytes32)", +"eff26a3b": "checkExist(address)", +"eff35f75": "setTickTime(uint256)", +"eff38f92": "getQuestion()", +"eff3c4e7": "openForPublic()", +"eff413ad": "setGoldMigrated(address,bool,string)", +"eff5c266": "addToMemeList(string)", +"eff60f56": "LRXCOIN()", +"eff631cf": "setNewPeriod(uint256)", +"eff6be2f": "changeBaseFee(uint256)", +"eff6e83d": "getIndexOrder(uint256)", +"eff7ed65": "setExchangeRateETHToUSD(uint256,uint256)", +"eff841d1": "setReserveWeight(uint256)", +"eff867e5": "CruzeiroToken()", +"eff877e2": "calcTokenPriceInWei()", +"eff883bd": "takerSellAsset(uint256)", +"eff8e748": "discountRate(address)", +"eff91c7e": "getLatestId()", +"effa00a6": "isIQTDistributed()", +"effb8415": "set_recivers(address,uint256)", +"effbbf92": "enableDisableTokenProxy()", +"effc4c1f": "throwIfLocked()", +"effc792d": "stakeInCurrentPeriod(uint256)", +"effcd413": "wallstreet2()", +"effd88b7": "ethToWei()", +"effda074": "addFactoryToCP(address,address)", +"effe031e": "payBankRoll()", +"efff1fb9": "_collect(address,uint32,uint32,uint32)", +"efff718d": "BITBIX()", +"efff78a5": "setRule(uint16,uint256,uint256,uint256,uint256)", +"effff82f": "valueToken()", +"f0004ab4": "PRIVATESALE_TOKENCAP()", +"f0006707": "setWriteTimestamp(bytes32,uint256)", +"f000999e": "upgrade(address,address,address)", +"f0024677": "deleteTellerMods(address)", +"f0032567": "computeFare(uint16)", +"f00388f7": "give(address,uint256)", +"f003a487": "unpauseCrowdsale(address)", +"f004073a": "performAction(uint256)", +"f00423ac": "XXXcoin()", +"f0044924": "BitGemPlayToken(address,address)", +"f004b12b": "CrowdFund(uint256,uint256,address)", +"f005b1b7": "UniversalTradeCoinToken()", +"f0061866": "deleteCourse(address)", +"f006228c": "guardian3()", +"f00648b8": "withdrawCoreTeamTokens()", +"f0072795": "itemsRange(uint256,uint256)", +"f007557f": "IPXTokenBase()", +"f0075829": "isValidPubKey(bytes)", +"f0083250": "canImplementInterfaceForAddress(address,bytes32)", +"f0086703": "setNextMilestone(uint256,uint256)", +"f008be46": "currentTierDiscountPercentage()", +"f009347d": "KudosProxy(address)", +"f00989a8": "FOUNDING_TEAM()", +"f00aac7f": "ArrayRR()", +"f00ac1da": "Login()", +"f00acc47": "prepareRoll(uint256,uint256)", +"f00c67fc": "Bounty0xEscrow()", +"f00c7669": "lastBlock_v2()", +"f00c9e67": "testStoresChallengeOwner()", +"f00d2823": "TokenMinted(uint256)", +"f00d4b5d": "changeOwner(address,address)", +"f00d7326": "isSenderInvestor(address,address[])", +"f00db260": "underwriter()", +"f00e4129": "EmergencyFundingReleaseApproved()", +"f00e6a2a": "getTarget()", +"f00e6f0a": "getResultData(uint8)", +"f00e8651": "createRequest(address[2],address,uint256[11],uint256,bytes)", +"f00f087f": "operationsPercent()", +"f00f7b33": "loseOdd()", +"f00f9b4d": "transferForMining(address)", +"f00ff174": "verifyWithdraw(bytes32,bytes32)", +"f0109f84": "valueAirDrop()", +"f010b6e5": "wipeBlackListedTrueUSD(address)", +"f011a7af": "claimProfit()", +"f011e270": "_payoutWinner(uint256,uint256,uint256,uint256)", +"f0123bc2": "dtStart()", +"f0137edf": "tokensFor1EthP3()", +"f013e0e1": "setWhitelist(address[],uint256[])", +"f0141d84": "getDecimals()", +"f0144a91": "dataset_md5checksum()", +"f0149751": "getTotal(bytes32)", +"f0149b9d": "ZenswapNetwork()", +"f01551f6": "difficultyAdjustmentPeriod()", +"f015bc93": "PRESALE_ADDRESS()", +"f0163621": "changeDomain(uint256,uint256,address)", +"f0163a82": "getNobleBalance()", +"f0173703": "ROLE_ORACLE()", +"f0174a25": "initMetadataDisable()", +"f018f741": "isPresidenteDeMesa(bytes32)", +"f019bd5e": "_generateOrder(address,address,address,uint256,string,string,string)", +"f019c267": "decreaseApproval(address,address,uint256)", +"f019c5da": "expReward()", +"f019c941": "SLAV()", +"f01b896f": "ambi2()", +"f01cc531": "setMonarchyRewards(uint256,uint256)", +"f01dbd03": "rewardAddressesSet()", +"f01de8c3": "getNextBattleTime(uint64)", +"f01e0648": "Voted(address,address,bool)", +"f01e341b": "addPostOnUser(address,address)", +"f01e66ec": "getAvgPrice()", +"f01eddda": "claimMyApis()", +"f01ee2cf": "sendERC20Tweet(uint256,string,string,string,string)", +"f01f20df": "burnPercentage()", +"f01fe692": "create(uint256,address)", +"f020044f": "gameActive()", +"f02011a8": "StatusContributionMock()", +"f0204007": "allocateTokens(uint256)", +"f0206a0d": "DayToken(string,string,uint256,uint8,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"f0207fb1": "_commission()", +"f020bfe1": "McCringleToken()", +"f020d093": "applyInsurance(bytes32)", +"f020f279": "balanceWinPoolForSecondStage()", +"f02137c8": "updateTicketPrice(uint256)", +"f02152ab": "sponsorOpinion(uint256,uint8,bool)", +"f02175c7": "checkNewOwnerArgs(uint256,uint256,uint256)", +"f0217c32": "changeSaleBlocks(uint256,uint256,uint256)", +"f0217ce5": "permit(bytes32,bytes32,bytes32)", +"f02286c1": "topUpLuck(uint256)", +"f022a694": "ToxbtcToken()", +"f022a867": "unholdMntp(address,uint256)", +"f022d9f6": "setContractProtection(bool)", +"f023d600": "purchase_address()", +"f0247f78": "maxQtyInFp()", +"f024a95a": "setMinimumTribute(uint256)", +"f02694f6": "SetStartVesting(uint256)", +"f027c7e0": "initOptionProgram()", +"f027d1f0": "setC4FContractOwner(address,address)", +"f0285b96": "_ownerSupply()", +"f02895e4": "ICO_ADDRESS()", +"f0296bfa": "setRefBonus(uint256,uint256)", +"f029e102": "SandwichShop()", +"f02a306e": "timeoutXEnabled()", +"f02a4463": "SkyExchange()", +"f02d7ef0": "issued(address)", +"f02dd53f": "getLand(uint256)", +"f02e0b3c": "SALE_IN_PROGRESS()", +"f02f1b6f": "getDailyLotteryParticipants(uint256)", +"f02f3a89": "oem_share()", +"f02f85c5": "timeOfLastBlock()", +"f02fc78f": "batchRegularTransfers(bytes32[],bytes32[])", +"f02fff9d": "Fcoin()", +"f0303452": "approveAll(address,uint256[])", +"f0314df0": "addTrustedContract(address)", +"f031a4d2": "TasksHandler(address,uint256,uint256,uint256,uint256)", +"f0330d54": "claimTwitterBonus()", +"f03342ad": "initiatedBy(address)", +"f0342179": "setPriceUnits(uint256)", +"f0349d5f": "setupStages()", +"f0350c04": "transfer_ownership(address)", +"f03529c3": "setMasterFeeContract(address)", +"f0356a36": "balanceOfContractFeeEth()", +"f036417f": "setTokenSymbol(address,string)", +"f0366c45": "imageExists(uint256)", +"f0369550": "getStage0Cap()", +"f036b592": "getBonusFactor(uint256,uint256)", +"f036ed56": "addResources(address,address[],bytes4[])", +"f0375c55": "SudanGoldCoinToken()", +"f038a969": "createScanner(uint256,string,uint256,uint256,uint256)", +"f038e106": "CKAOTToken()", +"f039218a": "Robycoin_test1()", +"f039d9d5": "totalPicks()", +"f03a1bc6": "addBet(address,uint256)", +"f03a5687": "reinvestDividend()", +"f03a6872": "bitmask_add(address,uint256)", +"f03aa262": "noContributors()", +"f03b0c0b": "setMultiSigWallet(address)", +"f03b7c70": "addComment(string,address,bool,uint256)", +"f03b8bf5": "UoBAMZNToken()", +"f03bcc7f": "submitAudit(address,bytes32,bool)", +"f03c0e8f": "D3JDemo(uint256,string,uint8,string)", +"f03c58ca": "test_feePoolShare_isTranscoder()", +"f03c7c6e": "pit()", +"f03c867a": "ownerDisablePayee(address)", +"f03d43ed": "updateTokenTicketPrice(uint256)", +"f03d7d2f": "transferReferralFee(address,uint256)", +"f03dc3d3": "getUsedReveralSupply()", +"f03dc4e4": "private_setMinGamePlayAmount(uint256)", +"f03dc5ef": "publicKeys(bytes32)", +"f03dd010": "WithdrawalETH(uint256)", +"f03de5fe": "buyHLPMT()", +"f03e5de5": "isDisputeActive()", +"f03e786a": "approveAndCall(bytes,address,address,address,uint256,uint256,uint256,uint256,bytes)", +"f03fbf2f": "CheckChangePlatformFlagAndAddAccountsInfo(address,address,uint256)", +"f03fed22": "nwmToken()", +"f040d973": "ERC20Token(string,string,uint8,uint256,address,address)", +"f0413191": "badge(uint8,string,bytes)", +"f04182d8": "insertProposal(address,uint256,address)", +"f0419588": "reply(uint256,uint8)", +"f0425fe1": "swappedTokens()", +"f04303e3": "setSealableProperty(address,uint256,bytes32,bytes32)", +"f0437a36": "getMyCommitmentHash(uint256)", +"f0439e0f": "removeExpiredName(string)", +"f044632f": "loikikdid()", +"f0446e02": "testFailMintNoAuth(int256)", +"f0456691": "PrevOwner()", +"f0459440": "readPermissions(address,uint256)", +"f046395a": "subscriptions(address)", +"f04646fe": "roll(bytes)", +"f04686aa": "LogOrderCreated(address,address,address)", +"f046cdec": "private_setHouseEdge(uint256)", +"f0474350": "proposalWeight(uint256)", +"f0479392": "poolAdd(uint256)", +"f047a528": "isRoundingErrorCeil(uint256,uint256,uint256)", +"f047d077": "cancelBuyNowOffer(uint256)", +"f0485328": "setAccessory(uint8,address)", +"f04893c2": "modCFOAddress(address)", +"f048b97f": "userPurchaseNumMap(address)", +"f04961ba": "getEther(uint256)", +"f04991f0": "deposit(int256)", +"f04aa255": "_transferAvailable(address,address,address)", +"f04be582": "tokentBalance(address,address)", +"f04bf0c5": "updateTrustScoreInBulk(address[],uint256[],uint256[])", +"f04cb80c": "setInvestorDataAndIssueNewToken(address,uint256,uint256,uint256)", +"f04d4d55": "deactivateLineItem()", +"f04da65b": "getShares(address)", +"f04e2b45": "_init(address)", +"f04e42cd": "allocateCoins(address[],uint256[])", +"f04e7476": "BSBCoin()", +"f04e8c6f": "payoutPeriodStart()", +"f04ed952": "typeSize(uint256)", +"f0502ff7": "tokensRequiredForAllWins()", +"f05168e6": "getAddTokenResetSignatures()", +"f052a76b": "setSpecialOffer(uint256,uint256,uint256,uint256,uint256)", +"f052d65a": "getCreature(uint256)", +"f0534e0a": "addWalletBonus(address,string)", +"f05396ac": "currentOperation()", +"f05492e0": "_getMaker(bytes32,uint8,bytes32,bytes32)", +"f054d139": "decimalsFactor()", +"f055d324": "walletBountyProgram()", +"f0560ea0": "approvedRatio(uint256,uint256,uint256,uint256)", +"f056a5c7": "declareRF(string)", +"f0575008": "Locked(bytes32,bytes32,bytes32)", +"f05764a0": "Currenttask()", +"f05834d6": "setReservedTokensListMultiple(address[],uint256[],uint256[],uint256[])", +"f05854ba": "SealToken()", +"f0586f0d": "doThrow(bool)", +"f058e6d1": "TXOsale()", +"f0591308": "getMem()", +"f0594d38": "PrizeAwarded(uint256,address,uint256)", +"f059bb6d": "buyTokensPreHook(address,uint256)", +"f059cf2b": "spentToday()", +"f05a2818": "changeMinimumBetAmount(uint256)", +"f05a64bc": "potTime()", +"f05a781d": "acceptNewOwner()", +"f05aa334": "cofounderA()", +"f05ad9f3": "communityTotal()", +"f05b854f": "LogSquareWinsUpdated(uint256,uint256,uint256)", +"f05ccd75": "onDecreaseApproval(address,address,uint256)", +"f05d16f7": "setTxFee(uint256)", +"f05d5547": "named(string)", +"f05d68c1": "_newIncomingTransaction(address,address,uint256,string)", +"f05d85d6": "atmToken()", +"f05dd6d5": "LogWinner(address,uint256)", +"f05dda57": "XeinToken()", +"f05f3e77": "developer_voting_info(string)", +"f05f45b1": "authoriseEntrants(address[])", +"f05fae68": "getStoreBalance()", +"f06067ac": "transferByLock(address,uint256,uint256,uint256)", +"f060ccb5": "escFundAddress()", +"f060f617": "setCursedContract(address)", +"f0610b5e": "unlockAllAccount()", +"f0611c44": "lockAfterMinting(uint256,uint256)", +"f06186c7": "testReality()", +"f0624097": "checkBlockEmpty(uint256,uint256)", +"f062e26b": "check_darkdao()", +"f0640355": "AddTeamAccount(address,address)", +"f0646a3c": "DART()", +"f064b971": "tryToCloseProject()", +"f065c36e": "MonopolyBank(uint256,string,uint8,string,address)", +"f0664a4f": "ownerOne()", +"f0666fba": "burnedBitcoin(address,uint256)", +"f066719f": "arbTrade(address[],uint256[],uint8[],bytes32[])", +"f066844e": "_emitAreaEvaluated(address,address,uint8,uint256)", +"f066cb83": "treeBuild(address,address)", +"f0685bf0": "TestFund()", +"f068a3a6": "setNextSmartContract(address)", +"f068dc81": "authorizeRequestorAddress(address)", +"f069629c": "generalSaleStartDate()", +"f06a1e13": "QUOTE_ASSET()", +"f06b0901": "interRefreshLock()", +"f06b53e9": "saveDividends()", +"f06b9ca6": "avgTokenBetValue()", +"f06bbf75": "EXTERNAL_QUERY_GAS_LIMIT()", +"f06c5610": "constructionTime()", +"f06d335e": "_recoverAccount(address,address)", +"f06d56ae": "ICO3Period()", +"f06ea69c": "toUint16(bytes,bytes,uint256)", +"f06ebc38": "setKv(uint256,uint256)", +"f06ef632": "fundOrderInternal(address,address,uint256)", +"f06fc103": "sendTokens(address,uint256,uint256)", +"f0704f02": "week3Price()", +"f0705249": "updateSspAbi(string)", +"f07065b3": "writeToDiary(uint256,bool)", +"f0715594": "_addAdminAccount(uint256,address)", +"f071b5fb": "LogEscrowReq(uint256)", +"f071cacb": "_setClientSupply(address,uint256,uint256)", +"f071db5a": "feesCollected()", +"f071ecc5": "AFTER_MAX_GOAL_DURATION()", +"f07227dc": "release(address[],address,uint256[])", +"f07255e3": "nextBoundaryAmount()", +"f073b277": "euroRaisedRc()", +"f07494a0": "bla()", +"f0757a91": "TOKEN_PRICE_THOUSANDTH()", +"f075f253": "QRRial()", +"f07629f8": "eventsHistory()", +"f076ba9c": "ethercrowdfund()", +"f077ae0f": "removeSample(address,uint256)", +"f07819a3": "setMesa(uint256)", +"f0782640": "getCompanyCount()", +"f0793782": "modifyHorseyDna(uint256,bytes32)", +"f0794ca6": "getRocOwnerItem(uint256)", +"f07a019d": "ownerRecoverTokens(address,address)", +"f07b454c": "divMultiplier()", +"f07b4608": "destruirContrato()", +"f07b9a04": "certAuthIssuesCerticate(address,address,uint256,string,string,string,string,uint256)", +"f07b9f20": "MapleCoin()", +"f07c0b21": "AgriChainLabel()", +"f07c44c2": "appropriate(uint256)", +"f07d0c49": "Logs(address,uint256,string)", +"f07edbf4": "maximumAdminBalance()", +"f0803358": "TSpaceCoin()", +"f080f860": "MAYA()", +"f081d9bd": "HaraKiri()", +"f081fc2e": "MAX_TOTAL_AMOUNT_GET_ETH()", +"f082650b": "setStarData(uint256,uint16,uint16,uint32,uint32,uint32,uint64,uint64)", +"f0829c37": "VeraCoin()", +"f083156c": "LYBToken(string,uint8,string)", +"f083e8f2": "addressFundFounder()", +"f0843ba9": "quickConvert(address[],uint256,uint256)", +"f085b2a1": "clearTokenLock(address)", +"f0863c08": "maxPowerUserAddress()", +"f0869641": "normal_trade_date()", +"f086965e": "changeOwner(bytes32)", +"f08697a3": "QuyDau()", +"f0876747": "KocoCoin()", +"f087d2ec": "STREAMING()", +"f088d547": "buy(address)", +"f0893de2": "maxTradingStartTime()", +"f089b7dd": "hashtag()", +"f089d566": "AdmineTeamTokens()", +"f089e2ed": "getProject(string,uint256)", +"f089e972": "currentNetfRound()", +"f08a5faa": "getSmartHash(string)", +"f08b82e6": "getTotalTokens()", +"f08c9e2e": "deathData_f2()", +"f08ccd02": "allocatePresaleTokens(address,uint256,uint64,uint64,bool,bool)", +"f08d5a25": "initialLockedValues(address,address,address,address,address,address,address,address)", +"f08e362f": "transferFunds(uint256,address)", +"f08ea4cc": "_startContract(uint256)", +"f08fa322": "investors_deliveryDate(address)", +"f090cee8": "addInvestor()", +"f091e5a2": "CoinMeet()", +"f0920a41": "wminus(uint256,uint256)", +"f0921b80": "habichnet1()", +"f09304b5": "setIntervalSchedulePresale(uint256,uint256,uint256)", +"f0932bd7": "setNextRoundLength(uint256)", +"f0933ab9": "isInActiveStage()", +"f093fd0a": "_bidEth(uint256,uint256)", +"f0942d35": "gameStatus(bytes32)", +"f0947680": "lockstatus()", +"f095ed3c": "cancelAndEndEvent(bytes32)", +"f09649ed": "getStateLength()", +"f0965328": "transferFor(address,uint256)", +"f0970566": "createDklAuction(uint256,address,uint256)", +"f097e106": "maxBuyingDate()", +"f098efb3": "ICOActive()", +"f098f8e4": "finalWindowTime()", +"f09915d4": "assign(uint256,uint256)", +"f0995961": "notarize(bytes32,uint256)", +"f099ce67": "getGladiatorDistributedRandom(uint256)", +"f099fbbd": "callBurnTokens(uint256)", +"f09a1f87": "hashOrderTyped(uint8,address,uint256,uint256,uint256,uint256)", +"f09a4016": "init(address,address)", +"f09a58f8": "internalSellTokenFromAdmin(address,uint256,bool)", +"f09a9b3c": "addGoal()", +"f09b538f": "function_3(string)", +"f09bea14": "totalCities()", +"f09bfcc2": "distributeFixed(address[],uint256)", +"f09c25e6": "playerCheckProvablyFair(uint256,bytes)", +"f09c3152": "NerdShitCoin()", +"f09c5829": "swaps(uint256)", +"f09cac98": "receiveApproval(address,uint8)", +"f09d3103": "royaltyTracking(address)", +"f09dd7c6": "withdrawAffiliateCommision()", +"f09dd844": "revealPurchaseOrder(bytes32,uint256,uint256,bytes32,address)", +"f09e34f0": "addReleaseAgent(address)", +"f09e65f1": "setAtomFath(uint256,uint64)", +"f09ea2a6": "offer(uint256,address,uint256,address)", +"f09ecf10": "Contract_Owner()", +"f0a03aa3": "ITE()", +"f0a0a299": "VIPFee()", +"f0a15f10": "TIER2_RATE()", +"f0a233d4": "SharesChainToken(address)", +"f0a279ae": "phase1EndingAt()", +"f0a2bea2": "testCheckRokBalance()", +"f0a2c430": "inGameRewardAddress()", +"f0a32e7b": "maxRefundStageDuration()", +"f0a3563c": "userClaims(address)", +"f0a3ce5d": "distributeDivs(uint256,uint256)", +"f0a3d4fd": "freezeAPI(uint256,string)", +"f0a3dfa4": "isStartTimeCorrect(uint256,uint256[])", +"f0a42aa0": "_upgradeLevel(uint256,uint16,uint16,uint16,uint16,uint16,uint16,uint16)", +"f0a43714": "whitelistSize()", +"f0a45cff": "report_death(uint256,uint256)", +"f0a71ef6": "getPrevBlock(bytes)", +"f0a72a84": "accountMaster()", +"f0a78538": "scheduleTransaction(uint256,bytes)", +"f0a7975f": "setDayQualitys(address)", +"f0aadcda": "AIMcoin()", +"f0aaf4ec": "getOptionsForModel(uint64)", +"f0abb382": "isHotWallet(address,address)", +"f0acc83a": "QCSCToken()", +"f0acd7d5": "spin()", +"f0acfea2": "piranhasTotalSupply()", +"f0ad243e": "getCoefficient(bytes2,uint256)", +"f0adcedb": "executeWinningProposal()", +"f0adda7d": "setNextVersionAddress(address)", +"f0ae03be": "robotCoin()", +"f0af0844": "addTimeUnequalledDefence(address,uint256)", +"f0af50c9": "stoppedSale()", +"f0af7e65": "cancelAgon(uint64)", +"f0afbf84": "newFutureLottery(uint256,uint256,uint256)", +"f0afd95a": "_2_education()", +"f0b01d56": "VINEYARD_ADDRESS()", +"f0b05bfd": "getGamesOfPlayer(address)", +"f0b070ca": "createAppeal(uint256)", +"f0b087c5": "getConfigUint(bytes)", +"f0b0cfa3": "readSoftwareInformation(address,address,uint256)", +"f0b1adbe": "registerEarnings(uint256)", +"f0b1b42e": "createContractPow(string,uint256,uint256,uint256)", +"f0b24181": "totalSupplySale2()", +"f0b25186": "shopKnife()", +"f0b30f69": "saveLockedERC20Tokens(address,address,uint256)", +"f0b32c69": "test_threeValidEqBytes32()", +"f0b37c04": "unauthorize(address)", +"f0b3a7ba": "hardCapToken()", +"f0b3adee": "updateRewardRate(address,uint256)", +"f0b5165f": "delayOfPreICO()", +"f0b53256": "SoftCap()", +"f0b534cb": "getApprovedVotes()", +"f0b620a2": "isPaymentCompleted(address)", +"f0b6e707": "ORDER_CANCEL(address,address,uint256)", +"f0b7e532": "withdrawTaker(address,uint256)", +"f0b80000": "PRESALE_START_DATE()", +"f0b85b19": "setDefaultLockInDuration(uint256)", +"f0b9e5ba": "onERC721Received(address,uint256,bytes)", +"f0ba23e6": "minterChangeable()", +"f0ba958c": "Error(uint8)", +"f0ba96ff": "performPayouts()", +"f0bae2c5": "doIssueDividend()", +"f0bae787": "_receiveBuyRank(address,uint256)", +"f0bbab3b": "HSHToken()", +"f0bbe08b": "phasePublicSale2_To()", +"f0bbe877": "Deployed(address,uint256,string)", +"f0bc153a": "get_contract_balance()", +"f0bc6cfb": "isReferred(address)", +"f0bc9cc5": "receivedDETreturn(address,uint256)", +"f0bcaf75": "UsingDB(address)", +"f0bd9ab5": "pushToken(address,bool)", +"f0bea8c7": "downVoteHouse(address)", +"f0bf1aea": "Paint(uint256,bytes3)", +"f0bf4df4": "setMinEnterFee(uint256)", +"f0bf611b": "transferDao(address)", +"f0bfd737": "Testtoken(uint256,string,string)", +"f0c001df": "proofType_Android()", +"f0c0546c": "closedRound()", +"f0c06aa5": "distrust(address)", +"f0c1d1c7": "setContributionPool(address)", +"f0c295fd": "seeZombieColor(uint256)", +"f0c388c7": "convertMainchain(string,string)", +"f0c413dd": "balanceOfContract(address,address,address)", +"f0c41bb2": "getChampsByOwner(address)", +"f0c45472": "modifiyEndFundingTime(uint256)", +"f0c4c04e": "extractFunds()", +"f0c4c339": "getFreezeSinceDetails()", +"f0c4fcc5": "mustToSellCourses()", +"f0c4fd0c": "isAttributesValid(uint256)", +"f0c5a46b": "periodPreITO_period()", +"f0c5a77b": "updateBurnableStatus(bool)", +"f0c69e8d": "calculateWithdrawable()", +"f0c71318": "zenOSCrowdsale()", +"f0c87852": "moveData(uint128[],address[],bool[],uint256[])", +"f0c95bc1": "setAdminVariables(uint256,uint256,uint256,uint256,uint256)", +"f0c99750": "endICOStage4()", +"f0ca618e": "Indemnisation_3()", +"f0caea2b": "SmartRoulette()", +"f0cafe0e": "tokenGNO()", +"f0cb556c": "updateLatestRevision(bytes32,bytes)", +"f0cb740a": "isJobStart(bytes)", +"f0cb8e77": "savedAddresses(address)", +"f0cbe059": "proxyTransferFromWithReference(address,address,uint256,bytes32,string)", +"f0ccc21a": "chunk5IsAdded()", +"f0cd58b7": "AuthAddr(address)", +"f0cd5c17": "cancelTx()", +"f0cd8057": "OACC()", +"f0ce6231": "XIAOZHI4()", +"f0cecafc": "privateSale2Hardcap()", +"f0cf198a": "RemoveSubscriber(address)", +"f0cfcaa8": "_getNewEstateId()", +"f0d02ce9": "AVG_BLOCKS_02W()", +"f0d07014": "allItemsForSale()", +"f0d0dd3f": "subDomainOwner(string,string)", +"f0d1c8ce": "hasTrade()", +"f0d1d021": "set_stoptransfer(bool)", +"f0d1eaaf": "getChannelById(bytes32)", +"f0d22ade": "isRepeated(int256)", +"f0d30786": "getPositionCallTimeLimit(bytes32)", +"f0d3a9df": "getBuyersCount()", +"f0d474f9": "underdogCount()", +"f0d4753e": "TOKEN_OFFERING_ALLOWANCE()", +"f0d4c92d": "setTimeBonus(uint256)", +"f0d4d1a6": "lotteryParticipants()", +"f0d504eb": "lookupKitty(uint256)", +"f0d5511c": "isArrAccountIsFrozenByDate(address)", +"f0d655f8": "_calculateTokenAmountAndRemainderBudget(uint256)", +"f0d6cc70": "endFullBonusTime()", +"f0d6ff48": "MeetOneTokenBase()", +"f0d7c9ff": "setPreviousSurplus(address[],uint256[])", +"f0d7f3eb": "auctionPause()", +"f0d85c89": "setRecovery(address)", +"f0d89e67": "LogRedeemTicket(uint256,address,string)", +"f0d8d4af": "sendTest()", +"f0d8e968": "getLastLease(uint8)", +"f0d90937": "usdAmount()", +"f0d97469": "setTokenExchange(address)", +"f0d9bb20": "yesToken()", +"f0da84f8": "getTransferable(bytes32)", +"f0daa286": "doubleXY(uint256,uint256)", +"f0daba01": "merchantIdHash()", +"f0dc4171": "collectTokens(address[],uint256[])", +"f0dce839": "IBU()", +"f0dd7a5d": "borrowBook(uint256,address,address)", +"f0dda65c": "mintTokens(address,uint256)", +"f0ddc0c6": "InjurymapCoin()", +"f0df232f": "buyMessage()", +"f0df6929": "RequireHuman()", +"f0e02bd6": "WEI_MAXIMUM_EARLYPURCHASE()", +"f0e10c0d": "play(address,uint256)", +"f0e1354c": "removeFromEggPhase(uint256)", +"f0e1691a": "addEvent(string,uint256)", +"f0e1ba2c": "priceLimit()", +"f0e1f84d": "setVotingProxy(uint32,int256,address)", +"f0e231b5": "Datenow()", +"f0e26f80": "getBattleDetails(uint256)", +"f0e3d1ba": "setEnd(bool)", +"f0e3fff8": "totalWon(address)", +"f0e40662": "getTotalAmount(uint256)", +"f0e42a1f": "getDividendTransactionLeft()", +"f0e4c4fe": "setGatewayI(address)", +"f0e53489": "integrity()", +"f0e5eeac": "ico2total()", +"f0e61771": "tokenFreezing(address,bool)", +"f0e6c2dc": "CASToken()", +"f0e769dc": "resumeSwap()", +"f0e7cf13": "adminClaimAirdropMultiple(address[])", +"f0e86f93": "ICOBlacklisted(address)", +"f0e959f9": "TokenSales(address)", +"f0ea0294": "setStage2Start(uint256)", +"f0ea433a": "sendQualifiedPartnerCommissionFee(address,uint256)", +"f0ea4bfc": "raised()", +"f0eb29fb": "_communitySupply()", +"f0eb737a": "getCurrentDiscount()", +"f0ebce5a": "getEnum()", +"f0ec03ae": "tokenWeiSold()", +"f0ec747e": "VETRA()", +"f0ec94cf": "edgePerPosition()", +"f0ecadaf": "comprueba(address,bytes32)", +"f0ecadcc": "voteSvp03(bool)", +"f0ed029e": "DebugUint(uint256)", +"f0ed14e0": "right95(uint256)", +"f0edb7cf": "admin_set_Apply_Store_Id_Fee(address)", +"f0ee7df2": "setMaxWin(uint256)", +"f0ef7621": "FishOne()", +"f0f0fe10": "ownerSetRecommendProportion(uint256)", +"f0f21344": "right27(uint256)", +"f0f2805f": "isOnSale(uint256)", +"f0f3f2c8": "getProject(uint256)", +"f0f44260": "setTreasury(address)", +"f0f46302": "shopHelmet()", +"f0f53ee4": "setBool(bytes32,bytes32,bool)", +"f0f5af8b": "calculateObtainedAMIS(uint256)", +"f0f7bd31": "LibertyToken()", +"f0f87e98": "TokenWithoutStart(string,string,uint8)", +"f0f8aff9": "getPriceForAssetAmountMulCollatRatio(address,uint256)", +"f0f8b7a5": "betX5()", +"f0f967e8": "canCall(address,address,bytes)", +"f0f9a729": "dividendsOf()", +"f0fa55a9": "setSlippage(uint256)", +"f0fb4372": "RatingStore(address,address)", +"f0fb8efd": "allowDefaultToken(address,bool)", +"f0fbc8ac": "indInflationDeposit()", +"f0fbe2e4": "addressAirdrop()", +"f0fbfd3a": "targetDiscountValue5()", +"f0fc1438": "tradeComplete(address,uint256,address,uint256,address,address,uint256,uint256)", +"f0fc6bca": "claimDividend()", +"f0fcc6bb": "pay(address,uint256,address)", +"f0fdb32f": "canStartWork()", +"f0fdc689": "setInv2(address)", +"f0fdf834": "a(uint256)", +"f0fe3d68": "metaBurnCarbonDollar(address,uint256,bytes,uint256,uint256)", +"f0fee1f7": "LogMigrate(address,address,uint256)", +"f0feef96": "closeChannel(bytes,uint256,uint8,bytes32,bytes32)", +"f0ff4840": "LuckchemyCrowdsale(address)", +"f0ff6ac4": "withdrawal(uint256,address,uint128)", +"f1001f8c": "getTotalLockedBalance(address)", +"f10143e1": "TokenToppedUp(address,uint256,uint256)", +"f101618a": "getMiniPoolEdit_8()", +"f1018c6f": "boughtNum()", +"f101b269": "appstore_share()", +"f103b433": "updateMaxSupply(uint256)", +"f104c836": "setAssetTransferGas(address,uint256)", +"f1052af5": "isRegisteredContract(address)", +"f105c981": "get_contrib_arbits_min()", +"f105e23b": "PVE_COMPENSATION()", +"f1068454": "pid()", +"f10700c2": "shouldCompleteDay()", +"f1076703": "getVerificationId(address,bytes,bytes)", +"f107941b": "buyTest(address,uint256)", +"f107b5e7": "getMaximumLimit()", +"f108a7d2": "withdraw(uint256,address,string)", +"f109517c": "delegatedTxHashesUsed(bytes32)", +"f10968ea": "assertEq(bool,bool,bytes32)", +"f10a4f0a": "WALLET_PARTNER()", +"f10a7798": "setAuth(address,address)", +"f10a9848": "currentNumberOfUpgrades()", +"f10ae2ab": "__dig_then_proxy(uint256,address,bytes)", +"f10ca95a": "close(bytes32,bytes32)", +"f10cb3da": "ObjectToken(uint256,string,uint8,string)", +"f10cb5dc": "DomainChanged(address,uint256,uint256)", +"f10ce7c4": "registration(address,string)", +"f10d1de1": "setUnbondingPeriod(uint64)", +"f10e5ceb": "getNumAdd(uint8)", +"f10ecc65": "chainlinkToken()", +"f10fae62": "setLLV_edit_21(string)", +"f10fdf5c": "getContribution()", +"f11079cf": "createType(address)", +"f110bbdf": "SetupAccounts()", +"f1112e70": "payYearlyJackpot(address)", +"f1115024": "registerBusinessOwner(bytes32,address)", +"f1115c7e": "transferMSI(address,uint256)", +"f112ddc0": "GJMI()", +"f113c854": "icoThresholdBonus1()", +"f113f700": "advisoryReserveTokens()", +"f113fccd": "trueGods()", +"f1144ce0": "HCoinToken()", +"f1145727": "buyStarterPack()", +"f1147bae": "withdrawRoyalty()", +"f1156cdf": "getCurrentVoting()", +"f115f06a": "WhiteListSet(address,bool)", +"f1160dc2": "ParticipantAuthority(string,address)", +"f116260f": "CryptoTreasure()", +"f1167e0d": "createPlayerIfNeeded(address)", +"f1168e11": "_createMobster(string,address,uint256,uint256,uint256,string)", +"f1173928": "RemovedFromGeneration(address,uint256)", +"f11745df": "totalHolder()", +"f117c924": "totalInvestedInWei()", +"f1183e21": "assertEq0(bytes,bytes,bytes32)", +"f118e465": "LogCreateVIBEX(address,uint256)", +"f118f7d6": "setDestinationMultisigWallet(address)", +"f119a48d": "toUnixtime(uint32,uint8,uint8,uint8,uint8,uint8)", +"f119ada4": "addTeam(string)", +"f119fcaa": "isMintableNFT()", +"f11a8911": "accountTxs(uint256)", +"f11a97ef": "MinerToken()", +"f11af32a": "EuroToken()", +"f11b9b46": "FRPTOKEN()", +"f11b9fc8": "emitTokens(address,uint256)", +"f11bdfa4": "_isValidHeight(uint8)", +"f11be7c1": "getTrustedContracts()", +"f11c2cec": "changeOwner(address,address,address)", +"f11c4482": "approveFromProxy(address,address,uint256)", +"f11c46f4": "How_to_interact_with_Smartcontract()", +"f11c8de8": "ZENT()", +"f11cfc56": "Vicky()", +"f11d5039": "place_holder()", +"f11d5b33": "reward(address,bytes32,uint256)", +"f11dd6ac": "viewGiveKarmaFee()", +"f11eb099": "preIcoAllocation()", +"f11ef5cf": "reserve(uint8)", +"f11f7d2d": "maximumBidAllowed()", +"f12001ae": "Testereumx()", +"f1204db6": "maximumJackpot()", +"f1208af8": "drawWeeklyWinner()", +"f120974e": "CHENDE()", +"f1215d25": "deposit(uint256,string)", +"f122ed60": "send_message(address,string)", +"f1233b79": "updateTimeBetweenGames(uint256)", +"f12479ac": "getPhase(uint8)", +"f124a300": "setPayable(bool)", +"f124eab5": "ETD()", +"f125561d": "notifyReceiver(address,address,uint256,bytes)", +"f12585f5": "getStageVolumeBoundaries(uint256)", +"f12611f1": "XID(address)", +"f1261fce": "permitTransfers()", +"f126e30f": "countUser(address)", +"f1272f35": "ICOBlaster()", +"f127328a": "totalTokenCollected()", +"f12782b2": "EPXAirDrop()", +"f127e53c": "LunchMoney()", +"f1280c23": "getCCH_edit_32()", +"f1287aef": "Ethmoji()", +"f129c5d7": "getGeneScienceAddress()", +"f12a1580": "withdrawDevReward()", +"f12a15b1": "heapify(int128[])", +"f12acca2": "upgradePonyHashing(uint256,uint256)", +"f12b3d3c": "SentFeeToPlatform(uint256)", +"f12b60f2": "TEAM_POOL_INIT()", +"f12c095b": "developer_string_A(string)", +"f12c87eb": "planetIndexToOwner(uint256)", +"f12d15c3": "transwerFunds(uint256)", +"f12d394f": "execute(uint8[],bytes32[],bytes32[],address,uint256,bytes)", +"f12ddd2b": "sendTokensToOwner(uint256)", +"f12e5eaa": "withdrawPartial(bytes32,address,uint256)", +"f12f5409": "accrueInvestorsTokens(address,address,uint256)", +"f12f6925": "NokuFlatPlan(uint256,uint256,address,address)", +"f13016d5": "internalPresale(address,uint256)", +"f1309dc0": "transferTokens(address,uint256,uint256,uint256)", +"f130da53": "GreenXToken()", +"f13101e9": "_delegate(address)", +"f1311a2e": "pgoMonthlyInternalVault()", +"f1317352": "setVCX(address,address,uint256)", +"f1317c09": "halt_purchases()", +"f1319892": "CoinifinexToken()", +"f131a7ae": "clearGame()", +"f1320af2": "exempt(address)", +"f13375bd": "addApprovedWalletAddress(address)", +"f13397b4": "EmeraldToken(string,string,uint256)", +"f133a7c6": "_update(uint256,uint256)", +"f133c38c": "testIntParserOneDecimal()", +"f1348138": "DoAirDrop(address,uint256)", +"f13497d6": "notifyCollateralNotTransfered(uint256)", +"f1349955": "externalTxs(uint256,bytes32)", +"f1352e78": "rewardPlayers(address[],uint256[])", +"f136a874": "approvedAddresses(address)", +"f137005f": "EOCHToken()", +"f13707b3": "adminGetPlayer(uint256)", +"f1378efa": "QuanYToken()", +"f137c236": "DSNCOIN()", +"f137d1a3": "getVestedAmount(uint256,uint256)", +"f13837f6": "ALPToken()", +"f1388f14": "mtrx()", +"f1388f46": "set_value()", +"f138fca5": "resetKoth()", +"f1395f3f": "tokensForDevteam()", +"f1398db1": "MbbToken()", +"f13a38a6": "getConstant()", +"f13ab647": "doMakerPayment(address)", +"f13ad3bf": "RemoveAllHeaders()", +"f13b68e8": "getPurchaseableMode(uint256)", +"f13b8d66": "removePerformer(address)", +"f13ba6a9": "_calcPhase()", +"f13c310c": "_createPlayer(string,uint256)", +"f13c7f57": "returnAllBalance()", +"f13c8fef": "weiTokensRaised()", +"f13c9b2b": "gcFundAmount()", +"f13ca4b8": "setEtherAmount()", +"f13cc606": "buyNOS(uint256)", +"f13d111f": "reverse(uint8[])", +"f13d22c1": "getModuleByName(string)", +"f13dc2e2": "watermark()", +"f13fc23b": "FINX()", +"f14053ad": "minVal()", +"f140b8ea": "getSentTransfer(uint256)", +"f141d076": "DURATION_DECREASE_PER_ETHER()", +"f14210a6": "withdrawETH(uint256)", +"f1437bd0": "setFrom(address)", +"f143e6db": "clearRequest(uint256)", +"f143ffe9": "ProfToken()", +"f14467fb": "ViewMyPrivateKeys(string)", +"f1448e10": "requestExecution(bytes)", +"f1455328": "CappedCrowdsale(uint256,uint256)", +"f145761c": "StartedGame(uint256,uint256)", +"f145cae9": "updateStoreFee(uint256)", +"f145ff23": "getDistributedTokens()", +"f1469382": "updateRates(uint256,uint256)", +"f147decc": "buscarAssinatura(string)", +"f147df3b": "get_king_address(address)", +"f1496070": "getAuctionArray(uint64,uint64)", +"f14ae17d": "isPresalePurchase(address)", +"f14b1c01": "upgradeFactory(uint256)", +"f14bd85d": "resignFromGroup()", +"f14be97f": "setTgeAddr(address)", +"f14ca7d7": "getVestingReleaseInterval(address,uint256)", +"f14ca885": "preICOcontributors()", +"f14d147f": "tokenSaleWeiMax()", +"f14dc176": "setDestructionCurator(address)", +"f14e96f1": "getBestBid(uint256)", +"f14eb30d": "SaleClockAuction()", +"f14f58f1": "removeAsset(uint256)", +"f14faf6f": "donate(uint256)", +"f14fcbc8": "commit(bytes32)", +"f14ff5cf": "getSeatMessageUrl(uint256)", +"f1508105": "Ohni(uint256,string,uint8,string)", +"f1518627": "anotherOwner()", +"f151e4ae": "devuelveToken()", +"f1522d53": "redeemablevilsinfo(address)", +"f1533936": "BNTPrice()", +"f153d3ad": "BurnupHoldingAccessControl()", +"f15467c4": "WelCoinICO(uint256,uint256,address,address)", +"f15627a1": "mintArray(address[],uint256[])", +"f156deb2": "miningTokensOf(address)", +"f1572e7d": "getQuoteKey()", +"f15732b8": "REAL()", +"f157c54b": "operatorRedeemByTranche(bytes32,address,uint256,bytes)", +"f157ea0b": "forkAddress()", +"f158458c": "getMinimumEndowment(uint256,uint256)", +"f15886db": "addressToReceiverToAllowedSprite(address,address,uint256)", +"f1588d66": "getPurchaseAmount(address,uint256)", +"f158e478": "destroyCampaign(bytes32)", +"f159eb84": "KVCToken()", +"f159f38f": "getTracks2()", +"f15a1b59": "tokenForTeam()", +"f15a691d": "validPurchase()", +"f15a9ae8": "maxPVPContenders()", +"f15ae568": "addEntry(address)", +"f15afa50": "fpMulI(int256,int256)", +"f15b2bda": "approveMintLocked(address,uint256)", +"f15beecf": "payNode(bytes32,uint32)", +"f15bf739": "getShareholderArrayLength()", +"f15caaa9": "insertDate(uint256)", +"f15cfe33": "KRWT_Token()", +"f15d775d": "changeMedianier(address)", +"f15e3af1": "getMatchAtRoundIdAtIndex(uint256,uint256)", +"f15e5548": "PasesSocio(uint16)", +"f15f14c5": "Dividends()", +"f15f2bf0": "blockEndICO()", +"f15f56a7": "calcBingo()", +"f1608682": "updateUserDetailsInBulk(address[],uint256[],uint256[],uint256[],bool[])", +"f160d369": "updateFeeRecipient(address)", +"f1610120": "next_giveaway()", +"f1625534": "deactivateRound(uint256)", +"f16270c3": "VITTokenSale(address,uint256,uint256,uint256,uint256,address[20])", +"f162c5a1": "totalScaleStaked()", +"f1637630": "withdrawBatch(bytes32[],address)", +"f1644b6c": "getFaucets()", +"f16638ec": "UselessReserveBank()", +"f1665a48": "NewVestedToken(address,address,uint256,uint256)", +"f166dc27": "Bid(address,string,uint256)", +"f1671b56": "getWeightRange()", +"f16787bc": "readFromCards(uint256,uint256)", +"f1679095": "getTransferAddressUser(address)", +"f167d695": "sacarDoacoes()", +"f1684237": "Ownable(address)", +"f1686296": "Hodor(string)", +"f1687a8d": "tokenSellCost()", +"f1694b3d": "updateResearch(address,uint256)", +"f16b6482": "gameCountdown(address)", +"f16b9422": "_recordFailedOldOwnerTransfer(address,uint256)", +"f16bdb9c": "validate(bytes20,uint96,uint32,bytes32[],uint16)", +"f16bdba9": "isCustomerinBLFromWL(address,address)", +"f16c5e8d": "issuerGuiveToken(address,uint256)", +"f16d9aca": "khabibToken()", +"f16dfbe9": "verifyAccount(address)", +"f16e74ac": "minDividendEtherAmount()", +"f16f9b53": "signedApproveAndCall(address,address,uint256,bytes,uint256,uint256,bytes,address)", +"f16fa66a": "updateLotteryData(address)", +"f16fa954": "debug_resizeRealPrefix(uint256,uint256)", +"f1700f94": "getInfoF1(address)", +"f1703d24": "addEntity(address)", +"f170c83c": "famedStarAddress()", +"f1714e97": "preserveTokens(address,uint256)", +"f1714fcc": "AddCommitteeToMapAndArrayEvent(address)", +"f171a730": "transferEvent_(address,uint256,bool)", +"f171ba5d": "verdictExecuted(address,bool)", +"f172f58f": "getPositionOwner(bytes32)", +"f172f84f": "jockeyLevel(address)", +"f17313e6": "unFrozenAddress(address)", +"f1736d86": "m_dailyLimit()", +"f17382ae": "SUPPLY_FOR_RESERVE()", +"f1739cae": "transferProxyOwnership(address)", +"f17401de": "init_multiowned(address[],uint256)", +"f17454b0": "UserAdded(bytes20)", +"f174683a": "VTrust()", +"f174b333": "buscarDocumentoPorId(uint256)", +"f1751688": "showReportForDevice(uint16)", +"f17520e5": "changeWhitelistAdmin(address)", +"f1753550": "supportsInterface(bytes32)", +"f175e6a9": "getTwitter()", +"f1762e5d": "bnbRefundEnabled()", +"f1765b22": "acceptSale(address[])", +"f1771cf0": "BURNABLE_UP_TO()", +"f177e837": "to62Encoding(uint256)", +"f177fc4f": "PornSceneToken()", +"f1781c72": "removeLockedTime(address,uint256)", +"f1797233": "positionAtIteration(uint256)", +"f179a86e": "setEtherToTokenAllowed(bool)", +"f179c6ef": "confirmBatch(address[])", +"f179f9f1": "parsecCreditContract()", +"f17a1ff5": "BAG_TRANSFER_FEE()", +"f17a3c4b": "FTST()", +"f17b1d63": "BacCara()", +"f17b5bb0": "assertMatchingBalance(uint256,uint256)", +"f17b6d9b": "relayCMCT(address,uint256,bytes32)", +"f17ba16b": "approveByAddress(address,address,uint256)", +"f17cc54b": "TestLib()", +"f17ccd73": "DNMC()", +"f17d186c": "withdrawAllFundsFromContract()", +"f17e48ec": "adminTransfer(address,uint256)", +"f17f29d0": "getGoldDataSerial()", +"f17f3ca3": "AUCTION_WHEN_PERCENTAGE_LOGIC_STARTS()", +"f17f6f8a": "escapeCaller()", +"f1806a21": "getUnapprovedUsers()", +"f180743a": "tokensForFounder()", +"f1807e35": "removePermission(uint8)", +"f18166c2": "TRADE_REWARD()", +"f181b388": "setTotalWithdraw(uint256,address,uint256,bytes,bytes)", +"f181f396": "unspentAmounts(uint256)", +"f182dd3b": "releaseTokens4Sender(uint256)", +"f183452c": "releaseTokenByOwner(address)", +"f1835db7": "verify(bytes32,uint8,bytes32,bytes32)", +"f1838a15": "burnFeatureDeactivation()", +"f1838fe4": "getExpectedRates(address,address[],address[],uint256[])", +"f1850af8": "getTokenSymbol()", +"f1860118": "tradeExecuted(address,uint256)", +"f1861749": "nextDiscountTTMTokenId6()", +"f18697cf": "IdolCoin()", +"f186a625": "transferContentOwnership(bytes32,address,address,string)", +"f186bb79": "getPixelPrice(uint16,uint16)", +"f186c67f": "permit(address,bool)", +"f186d77e": "setStarContract(address)", +"f1870e0c": "contractFinalized()", +"f187650d": "DeskBellPresale()", +"f18771de": "NujaRegistry()", +"f1880128": "getSTMPDecimals()", +"f1880b24": "checkToken(address)", +"f18899be": "getOpenApplications()", +"f189348a": "teleportCharacter(uint32)", +"f1895e08": "__issueTokens(address,uint256)", +"f1898fda": "TOKEN_CONTROLLER_INTERFACE()", +"f18ab544": "pendingList(address)", +"f18ad6fb": "getRecord()", +"f18b7bde": "SplitDividendsAmongstOwners(uint256)", +"f18ba98c": "handleSaleCompletionCallback(uint256)", +"f18cbe08": "_byteToString(bytes32)", +"f18d03cc": "transfer(address,address,address,uint256)", +"f18d20be": "adminWithdraw()", +"f18d4dbb": "addTokenSupply(uint256)", +"f18d5a93": "TokensSent(address,uint256)", +"f18dd512": "PERSONAL_FIRST_HOUR_CAP()", +"f18df6bb": "increaseAllowanceToken(address,uint256)", +"f18e120b": "setMaxTokensPerAccount(uint256)", +"f18ecf80": "OfferToken(uint256,string,string)", +"f190a793": "companyTokenWallet()", +"f190ac5f": "mintToAddresses(address[],uint256)", +"f190b4d3": "newUserRewardPool()", +"f1914dc5": "StaticEthAvailable(uint128,uint128)", +"f191c26d": "CPT()", +"f192866a": "sellTicket(uint256)", +"f192e91c": "forfeit(bytes32)", +"f1931b9e": "LAFIN()", +"f193a3f7": "changeBank(address,address)", +"f19414d5": "admin_inactive_dividend(address)", +"f194c23f": "_getCurrentAltarRecordId()", +"f1952473": "AcoraidaMonicaWantsToKnowTheNewQuestion(string)", +"f195995c": "isValidGeneration(uint8)", +"f195f0f9": "slice2(bytes,uint256,uint256)", +"f19674f6": "PatronThreeWithdrawal()", +"f19798ab": "numRolls()", +"f1979de8": "setPixelAreaColor(uint256,uint256,uint256,uint256,uint32[])", +"f197bbdd": "deadlineOne()", +"f1991a27": "saleStartTokenCreationRate()", +"f199265f": "internalExecuteCall(address,uint256,uint256,bytes)", +"f199f56d": "roundReward()", +"f19a5810": "changeBaseTokenPrice(uint256)", +"f19ab230": "Bcoin()", +"f19ac52d": "newDepositCommission(uint256)", +"f19be31b": "btcAddrPubKeyCompr(bytes32,bytes32)", +"f19be5d5": "JackpotCore(uint256,uint256,uint256,uint256)", +"f19c020d": "returnTokensAll(address)", +"f19c78b5": "contributorsKeys()", +"f19cfeff": "RepossessionBounty(address,uint256)", +"f19d2bcd": "EOS_address()", +"f19d736e": "Prosper()", +"f19dd75b": "lspToken()", +"f19e3c9f": "LogSnapshotCreated(uint256)", +"f19e75d4": "ownerMint(uint256)", +"f19e774e": "isValidBet(uint256)", +"f19eb731": "TKT_TokenERC20(uint256,string,string)", +"f19ee2a9": "_getAsset()", +"f19efc43": "getRoundInProgress()", +"f19f3246": "rejectOwnership()", +"f19fb157": "withdrawnow()", +"f19fc6ab": "gonIIToken()", +"f19fe69b": "withdrawTokenTo(address,address)", +"f19fefbc": "Hodling(address,address,uint256)", +"f1a00a53": "unregisterListening(address)", +"f1a0a85c": "div(uint64,uint64)", +"f1a138f4": "Airdropsamount()", +"f1a252b8": "getMoneyBack()", +"f1a39bde": "indexByTokenId(uint256)", +"f1a3de09": "register_minting(address)", +"f1a5158b": "Contest()", +"f1a570b8": "DividendRecycled(uint256,address,uint256,uint256,uint256)", +"f1a5fc99": "bytesToInt(bytes)", +"f1a63733": "createBountyToken(address,uint256)", +"f1a6ed46": "ORIGIN_ETH_BRT_RATIO()", +"f1a9af89": "startPrice()", +"f1a9d749": "LRCCcoin(uint256,string,string)", +"f1aaea1c": "updateLabAddress(address)", +"f1ab36b4": "getSaleInformation()", +"f1ace1a1": "ART_DECIMALS()", +"f1ad3334": "storeETH()", +"f1ade50c": "VelesCoin()", +"f1ae5437": "changeTakeFee(uint256)", +"f1ae72a5": "minAcceptedEthAmount()", +"f1ae8c55": "startRaffle(uint256)", +"f1afc4f6": "ShareHolderController(address,address[],uint256[],address,uint256,uint256,uint256,uint256,uint256,uint256)", +"f1b0202e": "TalkToExpertPayment(address)", +"f1b07f96": "deblacklistAddress(address,address)", +"f1b12493": "IcoContract(address,address,uint256,uint256,uint256,uint256,uint256)", +"f1b234ad": "setWallet(address,address)", +"f1b2b03c": "start_ts()", +"f1b2d6a3": "getListings()", +"f1b3ea6f": "asyncDebit(address,uint256)", +"f1b3f968": "getRaceEndBlock()", +"f1b3fd80": "momentTimeOf(uint256,uint256)", +"f1b46bc8": "generateRandomCard(uint32)", +"f1b4d548": "isValidTeam(uint256[])", +"f1b50c1d": "enableTransfer()", +"f1b541c2": "startPublicSaleStage()", +"f1b5bc17": "mintAmount4()", +"f1b5c777": "contributeWasCalled()", +"f1b5d7de": "pre_prices(uint256)", +"f1b6315e": "StartRoulette(uint8)", +"f1b676a4": "ico3Ended()", +"f1b6cee5": "winPot(uint256[])", +"f1b74348": "addExisitingContributors(address[],address,uint256[])", +"f1b75173": "getLegacy(uint256)", +"f1b8a5bf": "commitPhaseMinVotes()", +"f1b9ee24": "setInactive()", +"f1bab09c": "setExtraBonus(uint256)", +"f1bab410": "manualSale(address,uint256)", +"f1bba50a": "GoldBlocksTickets()", +"f1bba6f9": "account(string)", +"f1bbc663": "tokenSaleClosedTime()", +"f1bca30f": "removeManyAdmins(address[])", +"f1bca7a4": "doCall(uint256)", +"f1bcb6e5": "createContractor(address,address,bool,address,string,string)", +"f1bd4c04": "getJackPot()", +"f1bd5978": "__address3__()", +"f1be1679": "getMarket()", +"f1be42f1": "numCharacters()", +"f1bf18db": "availableZNT()", +"f1bfb9cd": "listSingleCard()", +"f1c05831": "authoriseSale(uint256,uint256,address,uint256)", +"f1c10c24": "infoTokens(address)", +"f1c16deb": "validPurchase(address,uint256,uint256,uint256,uint256,uint256)", +"f1c21077": "PROBABILITY_DIVISOR()", +"f1c22a05": "setNewPixelPrice(uint256)", +"f1c30ec0": "reclaim(bytes)", +"f1c36ce0": "burnFromAddress(address)", +"f1c3dd3e": "fuckTest()", +"f1c41b68": "setConsensusRules(uint256[6])", +"f1c461c7": "mesasCreatedVerify()", +"f1c4d6b0": "DOG_Crowdsale()", +"f1c4ecb4": "maxCapWei()", +"f1c53a3a": "UpdateUserExtraData1(address,bytes32)", +"f1c55931": "reserveFunds(address)", +"f1c5d07b": "totalLoveBlocks()", +"f1c61958": "DIGITALCASH()", +"f1c6aeb7": "SetApplicant(string,uint32,uint256,int256,string)", +"f1c6c520": "runningauctions(uint256)", +"f1c760ae": "fixBalanceInternal(address)", +"f1c7689e": "CandyRate()", +"f1c94b45": "lastBlock_a7Hash_uint256()", +"f1c9cc11": "lockMin()", +"f1ca9410": "gen0CreatedCount()", +"f1cca8aa": "setTakerFee(uint256)", +"f1ce37d9": "eachUserWeight()", +"f1ce9595": "TIME_PERIOD_IN_SEC()", +"f1cea858": "TCLRToken(address,address,address,address,address,address)", +"f1cf5b38": "setWethContractAddress(address)", +"f1cf8d27": "addFuel(uint256,uint256,uint256,uint256,uint256)", +"f1cfb100": "remainingEscrow(bytes32)", +"f1cff4b5": "testBitsNotSetSuccess()", +"f1d02a8c": "MiningToken(string,string)", +"f1d0469e": "get_sec_by_year(uint256)", +"f1d08bfa": "setOpenForSale(bool)", +"f1d15f1f": "setLandPrice(uint256,uint256)", +"f1d1768c": "updatePresaleListMapping(address[],address,bool)", +"f1d18a42": "safediv(uint256,uint256)", +"f1d20d4d": "provider(bool,address,address,address)", +"f1d2165f": "SaleActive()", +"f1d22be0": "freezeAll(address)", +"f1d2b3c2": "Owner1()", +"f1d2b8ab": "seePurchase(uint256)", +"f1d308d5": "SingularityTest17()", +"f1d35260": "setGovernor(uint8,address)", +"f1d3a853": "PalliumCrowdsale(uint256,address)", +"f1d588c5": "setRoleManager(address)", +"f1d59443": "getUSETTotalSupply()", +"f1d61850": "confirmationPeriodOver()", +"f1d61f23": "timeLockAdvisor(address)", +"f1d71b73": "betBlueCoin()", +"f1d73540": "Quiz(string,string)", +"f1d841f1": "minAcceptedAmount()", +"f1d89857": "RequestFactory(address,address)", +"f1d91942": "setInfoUrlPrefix(string)", +"f1da588a": "PrivateCoin()", +"f1da7e63": "getMortgageRate(address)", +"f1daa1f0": "writeDefinitions(uint256,string)", +"f1daa5ba": "calculateAmountForETH(uint256)", +"f1db23dc": "totalProceeds()", +"f1dbd547": "FINAL_AML_DAYS()", +"f1dbd647": "receiveDividends(uint256,uint256)", +"f1dc24ae": "getMeshPointByCreator()", +"f1dd08b4": "transferCommissionReceiver(address)", +"f1dd6147": "buyTokensIco(address)", +"f1de75e3": "getPrefixOwner(string)", +"f1dfcddb": "testTransferGasIssue()", +"f1dffed7": "setIntValue(int256)", +"f1e02620": "setFirstTime(uint256)", +"f1e03d67": "createEscrow(bytes16,address,address,uint256,uint16,uint32,uint32,uint8,bytes32,bytes32)", +"f1e253dd": "brickIds()", +"f1e298c3": "addFee(address,uint256,address,uint256)", +"f1e2ac12": "evalParam(bytes32,uint32,address,address,bytes32,uint256[])", +"f1e2e921": "_Owned()", +"f1e328f9": "left68(uint256)", +"f1e4a540": "unsetCoordinator()", +"f1e50ce9": "saveMe()", +"f1e69009": "registerDsp(address,uint8,bytes32[5])", +"f1e6bb1c": "getVoteOptions(uint256)", +"f1e6f4cd": "right40(uint256)", +"f1e7ae1f": "modifyMemberLimits(address,uint256,uint256)", +"f1e8ace7": "decodeBillingMetadata(uint256)", +"f1e8aec4": "isStardted()", +"f1e954d8": "increaseTokenSaleAllocation()", +"f1e9951f": "getActionCount(bool,bool,bool)", +"f1e9a514": "VREO_SALE_PHASE_2_END_TIME()", +"f1ea43e7": "TCSCCoin()", +"f1ea6cbd": "creationMinCap()", +"f1ead3d6": "getAuctionsFor(address)", +"f1eae25c": "mortal()", +"f1eae64a": "openSell()", +"f1eb0ed9": "newInitialPlayerOffering(string,string,uint256,uint256,address,uint256,uint8)", +"f1ebe451": "ChooseB()", +"f1ecff08": "BastoneToken()", +"f1ed9923": "isEcoAllocated6()", +"f1eeec2e": "insureClient(address,uint64)", +"f1ef9881": "hashSecret()", +"f1ef9a08": "preicoAddresses(address)", +"f1efb76a": "getPayTo()", +"f1f05a3f": "getAttr(bytes32,uint256)", +"f1f0b290": "lockToken(bool)", +"f1f1e30f": "ethForKey(uint256)", +"f1f201e8": "getArtworkInfo(uint256)", +"f1f33565": "ENG()", +"f1f339ef": "doCheck()", +"f1f3ae31": "novaContractAddress()", +"f1f49033": "deductDeposit(address,uint256)", +"f1f4e25d": "OctaBlock()", +"f1f62f10": "isWalletLocked_Send(address)", +"f1f6d945": "webAddress()", +"f1f732cb": "BONUS_TOKENS_RESERVED()", +"f1f76438": "checkNumber(address)", +"f1f87fc9": "BitMix()", +"f1f9539f": "KittyRace(address)", +"f1fa1744": "sellpause()", +"f1fa906c": "getProjectName(uint256)", +"f1fb3ace": "minEth()", +"f1fb5219": "_calculateContribution(uint32,uint8,uint64)", +"f1fbf2a3": "calculateObtainedSBT(uint256)", +"f1fc4db4": "updateCutoff(uint24)", +"f1fd9614": "getNumData(uint256)", +"f1fe42b8": "TransactionRequest(address[3],address,uint256[11],uint256,bytes)", +"f1fea32a": "setPOOL_edit_7(string)", +"f1fec2b8": "nodePrice()", +"f1ff3d4b": "totalNumberMinted()", +"f1ff4a67": "releaseWithheldTokens(address,bool)", +"f1ff732b": "setBanker(address)", +"f1ffde45": "BasicBallot(address,string,string)", +"f20001b0": "Menu08()", +"f20151e1": "setExecutionMaxPerTx(uint256)", +"f2016a4f": "updateMinEthPerNotification(uint256)", +"f201da0d": "newChannel(address,address,uint256,uint256,uint256,address)", +"f2020275": "users()", +"f2021550": "QBankChain()", +"f2022905": "toldYouItWouldWork()", +"f20341a8": "getRemainingTarget()", +"f203af26": "registerImport(bytes8,bytes8,uint256)", +"f203c19d": "usersAddress()", +"f203c857": "getSpeaker(address)", +"f20431c8": "MyTotalNTD()", +"f2057179": "changeInstitutionOwner(string,address,address)", +"f20652a1": "nxcSold()", +"f2068bfc": "addUniqueSpinner(string,uint256,address,uint256,uint8,uint8,uint8)", +"f206cf74": "MINIMUM_ETH_SOFT_CAP()", +"f206e7c9": "fechAllVoteResultBySnapshotBlock(uint256)", +"f20717e9": "getNbTrade()", +"f207564e": "register(uint256)", +"f2080ba6": "Pong(int8)", +"f2083220": "activeTranscoderTotalStake(address,uint256)", +"f2091083": "dollaryDanToken()", +"f2097550": "bucketExists(bytes32)", +"f2097b9b": "doesAddressOwnSpinner(address,uint256)", +"f209fc1f": "purchaserWhiteList(address)", +"f20b2cf5": "getMJModel(uint256)", +"f20b4368": "AllocateMainSale(address,uint256)", +"f20b93ea": "getInvoiceAmountPaid(bytes32)", +"f20d5385": "endCrowdsalePhase2Date()", +"f20d5943": "s0(bytes1)", +"f20d5e57": "distributeToReferreal(uint256,address)", +"f20dde7b": "updateCostETH()", +"f20de9d6": "openGameLoop()", +"f20e5e35": "getAuctionDetails(uint256)", +"f20e5f51": "PeriodChanged(uint8)", +"f20eaeb8": "output()", +"f20f24ec": "pauseTokenSale()", +"f2102390": "SOFTCAP_RATE()", +"f2107f83": "getStakingInfoPayload(bytes)", +"f2108aa8": "FraCoin()", +"f2114752": "viewSecondLotOfContractState()", +"f21153d2": "withdrawSettle(bytes32,uint256,address,address,uint256,uint256,bytes32,bytes,bytes,bytes32)", +"f211c9ed": "releaseMultiByStage(address[])", +"f2125f40": "SEELE()", +"f212c216": "setSystemAuctionDuration(uint256)", +"f213159c": "depositTo(address,address,uint256)", +"f2139abf": "getBigPromoBlockInterval()", +"f213aad2": "dayWithdrawCount()", +"f2141ab9": "lossToCharity(uint256)", +"f21439b5": "envokeTokenAllocation()", +"f2147f7b": "currentPeriodPrice()", +"f21502e5": "ZTHTKNADDR()", +"f2153fae": "BNKCToken()", +"f215bc3e": "genEstKeyBlockNr(uint256)", +"f21632e1": "icoEtherReceived()", +"f2166ab1": "xpanda(uint256,string,string)", +"f216b203": "TokenSyndicate(address,uint256,uint256,uint256,uint256)", +"f216bfd6": "updateUportInfo(string)", +"f216f45d": "nextStageBonus()", +"f21711f3": "currentRating()", +"f217d6a3": "standardDailyLimit()", +"f217f15c": "doCreate(uint256,bytes)", +"f2180c61": "versionCode()", +"f2181e23": "initializeGasPriceLimitFundraiser(uint256)", +"f219fa66": "depositERC20(address,address,uint256,uint256)", +"f21a1468": "getOutcomeTokens()", +"f21aaee6": "MinerChain()", +"f21aefd2": "isDebug()", +"f21af007": "unWhitelist(address)", +"f21b1150": "test_div(uint256,uint256)", +"f21b422a": "unregisterCustodian(address,address)", +"f21b64ad": "DepositETH(uint256)", +"f21b9379": "setRoundAvailableToken(uint256,uint256)", +"f21baec7": "withdrawPreIcoFounds()", +"f21c27a7": "CTAMToken()", +"f21cdf6f": "defrost()", +"f21d5dea": "withrawAll()", +"f21ddc7a": "teamBalanceOf(address)", +"f21f537d": "startedAt()", +"f21f80d0": "setGenome(uint256,uint256)", +"f21f8236": "getRefTo(address,address)", +"f2204d35": "getWalletsFromUser()", +"f220cbe0": "GetIsPaused()", +"f2218819": "getAddressAndSharePriceOfFunds()", +"f221abef": "isReachedThreshold()", +"f221b25b": "addSponsorshipsTotalRefunded(address,uint256,uint256)", +"f221b75a": "addCET4(uint32,string,uint32,uint32,uint32,uint32)", +"f221fda0": "totalRooms(string)", +"f2225500": "FHCoin()", +"f222d0b9": "getNumberOfBets()", +"f223446c": "start_game(bytes32,uint8,uint32,uint16,address,uint256,uint8)", +"f2234f6e": "confirmAdmin()", +"f223885a": "deposit(uint256[],uint256[])", +"f2245b64": "DioToken()", +"f225138b": "littCapsuleGet(bytes32)", +"f22513a7": "withdrawLatium(uint256)", +"f225415a": "getFrozenBalanceByAddress(address,address)", +"f225ba3f": "unLockBounty(address)", +"f2260031": "lockAddress(address,bool)", +"f2263e12": "refundedFunding()", +"f2269c8e": "_createFootballerStar(uint256,uint256,uint256,uint256)", +"f2269dba": "airdropCooldownEnd()", +"f2274abb": "getReservedIsVested(address)", +"f227b198": "CreateWEE(address,uint256)", +"f229abbd": "enableBurn(bool)", +"f22a0b31": "getDays(uint256)", +"f22a598f": "changePriceUpdateTimeline(uint256)", +"f22aa38b": "getSDCCSupply()", +"f22aae52": "_memcpy(uint256,uint256,uint256)", +"f22b0c94": "setBonusOff()", +"f22b258a": "trustedMarketTransfer(address,address,uint256)", +"f22b683e": "delKycVerifiedInvestor(address)", +"f22c0f7d": "isValidTxPaymentForMCW(bytes32)", +"f22c10d7": "setShareHolders(uint256,address,uint256,bool)", +"f22c618e": "isItemStopped()", +"f22c6a7c": "STE(string,string)", +"f22c71e5": "finalizeLottery(uint16,bytes32,uint256)", +"f22c8f63": "FINANCE_CAP()", +"f22d022b": "burnIcoCoins()", +"f22dbfe6": "forLoyalty()", +"f22f264d": "setMinBalance()", +"f22ffd1d": "TLN_TOKEN_DECIMALS()", +"f23008ca": "CarBonCash()", +"f2309723": "setUserApproval(address,address,string)", +"f23103ee": "subTx(address,uint256,bytes)", +"f2316472": "transferMyTokens()", +"f2325244": "VULCAN_PROMETHEUS_MAX_CARGO()", +"f232880d": "reserveWaveTokens()", +"f232a84d": "getAmountAttempted(address)", +"f232e351": "initializeBalances()", +"f23342d8": "checkHashExists(bytes32)", +"f2335e9d": "setAvgGas(uint8,uint16)", +"f2342bba": "getBagDetails(uint256)", +"f2342cd5": "Contributor(string,address,address)", +"f234bac5": "tokenCreationCapUpdate(uint256)", +"f235bdfd": "getRetailerTotalBalances(address)", +"f235bfa4": "addAccount(address,string,uint256)", +"f236e2fb": "UTCT()", +"f2371fb3": "grantGiveableKudos(address,uint256)", +"f2371fd1": "newEmployer(bytes32)", +"f238683f": "lastKing()", +"f238dbea": "minimum_payment()", +"f2393d55": "getKebabsSincelastKebab(address)", +"f239c5dd": "crowdsaleMinted()", +"f239e528": "sendOneEtherHome()", +"f23a6e61": "onERC1155Received(address,address,uint256,uint256,bytes)", +"f23a8155": "internalInvest(address,uint256,uint256)", +"f23a8aa6": "getOwnerLink(address)", +"f23b55c3": "BB8Token()", +"f23b6fa2": "emitApprovalEvent(address,address,uint256)", +"f23b872e": "tvc()", +"f23ba8e6": "hire(address,uint256)", +"f23bc4f8": "acceptOffer(uint64)", +"f23bd5f8": "getYes(uint256)", +"f23c51cd": "setReceiverContractAddress(address)", +"f23ca012": "becomeNorsefire()", +"f23e22a7": "rescheduleTransaction(uint256,uint256)", +"f23f07f6": "getMinAuditPriceMedian()", +"f23f16e6": "appealCost(uint256,bytes)", +"f23f2cbe": "withdrawWithFee(address,uint256,uint256,bool)", +"f2405395": "STAGE_THREE_ETHRaised()", +"f2408d6b": "PIN(uint256,string,string,uint256,uint256,uint256)", +"f2409d65": "getMileagePoint(address,address)", +"f240d0f5": "feesWithdrawn()", +"f240f7c3": "dispute()", +"f24113c6": "updateProfile(bytes32,bytes32)", +"f241335d": "calculatePrice(string,uint88)", +"f2414cbd": "YASToken()", +"f24150ae": "VoxelDestroyed(uint8,uint8,uint8)", +"f2415183": "Tithe()", +"f2416f64": "oracleItCallbackAddress()", +"f242432a": "safeTransferFrom(address,address,uint256,uint256,bytes)", +"f2429b1c": "buyCryptopinions(address)", +"f2430fe5": "Plumix()", +"f243c170": "buyTokens2(address)", +"f243c2a7": "tokenIssuer()", +"f244815e": "setBuyUnfreezePeriodSeconds(uint256)", +"f245036e": "setPools(address)", +"f2451a43": "addOwnerNotations(string)", +"f2455807": "setDesignatedReporter(address)", +"f24570e0": "approvedFactories()", +"f245b9e4": "DVIP(address)", +"f245d8c6": "NewHero(address)", +"f2460172": "_removeAssetFrom(address,uint256)", +"f246080a": "addvehicles(address,string,string,string,string,string,string)", +"f246317c": "SafeTimeLock()", +"f247016c": "isVoteOngoing()", +"f2477f7c": "BLOCKREWARD()", +"f24818cb": "unholdTime()", +"f2491377": "MAX_SINGLE_ISSUED_FROM_OTHER_CURRENCIES()", +"f249cf19": "get_all_challenges()", +"f24a0faa": "balance3()", +"f24a534e": "Oracle()", +"f24a6997": "maxGasRefund()", +"f24ae640": "countAccounts()", +"f24b5779": "removeTrustedIssuer(address,string)", +"f24b6782": "updateCrowdsaleTimeline(uint256,uint256)", +"f24d2532": "changeRegistrationStatus(address,bool)", +"f24e4a15": "Purge()", +"f24e7fd9": "activateKillSwitch()", +"f24edfd6": "setWhitelistedAddressPre(address[],bool)", +"f24f9abe": "grantBonusTokens(address,uint256)", +"f24ff92c": "withdrawal(uint256,address,uint256)", +"f2505211": "oracleItQuery(uint256,string,string,string)", +"f2513ee9": "cancelMarketsWhenPaused(uint256)", +"f2518983": "reinvestEther()", +"f251bc8c": "addPack(address[],uint16)", +"f251fc8c": "totalContributors()", +"f25214e4": "CRYPTODOL()", +"f2523e7a": "setUseRegistry(bool)", +"f2529e55": "Fidget(address,address,uint256,uint256,uint256,uint256)", +"f2530d1d": "claimableDividend()", +"f2534e47": "changeCertifier(address)", +"f253e6ae": "Daric()", +"f2540e39": "_unfollow(address,address)", +"f2556289": "endDutchAuction(uint256,uint256)", +"f255c21f": "Offer(address,string,uint256,uint256)", +"f2561a43": "voteSuicide(address)", +"f25633dd": "year1Unlock()", +"f256b130": "marketingFund()", +"f256b48e": "getBalanceOfDist(bytes32)", +"f257bf3b": "getAuthorityIndex(address)", +"f2582ef5": "UserStatus(string,address,uint256)", +"f258a4ea": "investorAccounts(uint256)", +"f2590315": "ClockAuction(address,address,uint256)", +"f25a7815": "MockSale(address,bool,uint256,uint256,uint256,uint256,uint256,uint256[])", +"f25acb35": "acceptDeal(bytes16)", +"f25aed54": "accountWithUpdatePermissions()", +"f25b278b": "fetchHash(uint256)", +"f25b3f99": "blocks(uint256)", +"f25c130a": "createOnRound(uint256)", +"f25c870a": "MyERC223(string,string,uint8,uint256)", +"f25d2422": "fetchVoteInfoForCandidate(address)", +"f25dafd1": "drainAUC(uint256)", +"f25e34a9": "checkJuryVoted(address)", +"f25e7bb4": "getState(bytes20)", +"f25e9ed2": "getMaster(address)", +"f25eb5c1": "removeReverse()", +"f25ebdad": "isProxyManager(address)", +"f25ee28d": "MySecondToken()", +"f25efc49": "frozenRecords(uint256)", +"f25f4b56": "feeWallet()", +"f25fbe6f": "MetaGold()", +"f25fd5cf": "createGoldSellOrder(uint256,uint256)", +"f260ad05": "titanToken()", +"f260bd94": "validateRequestParams(address[3],address,uint256[12],uint256,bytes,uint256)", +"f261a8c0": "withdrawbymanager()", +"f2624067": "LogIncreaseCap(uint256)", +"f2624b5d": "whitelistCount()", +"f262521f": "PHASE_5_PRICE()", +"f262de8c": "add_staircase(uint16)", +"f2634485": "setGameRules(uint256,uint256,uint256,uint256)", +"f26377ed": "kittyGym()", +"f2642d0f": "decayedTransfer(address,uint256,address)", +"f2653966": "createReleaseAuction(uint256,uint256,uint256,uint256,uint256)", +"f26557d8": "AdeelaTestCoin()", +"f2659bd1": "GetCityLandNums()", +"f265d351": "rateSetter()", +"f2663a03": "TERSERAH()", +"f267035f": "BOARD_1()", +"f267215a": "_getProviderClosed(uint256)", +"f267ded5": "TokenStarted(address)", +"f268225c": "setBountyWalletAddress(address)", +"f26835d4": "tokensRemainingInHolding(address)", +"f26a058d": "U21Y()", +"f26b9834": "ENOM()", +"f26baecc": "_capLevelEth()", +"f26bb53d": "setCityPlan(address,uint256)", +"f26bbde8": "WHOMCrowdsale(address)", +"f26c159f": "freezeAccount(address)", +"f26c6aed": "newChannel(address,uint256)", +"f26cbe9a": "raiseDollarsDeducted(address,uint160,int160)", +"f26df083": "finalIntervalForTokenGen()", +"f26e5e85": "GetUpgradeCost(uint256,uint256)", +"f26e787e": "sendDelayedTransactions()", +"f26f336e": "MINING_RESERVE()", +"f26f4f61": "threshold(bytes32,address)", +"f26f6334": "setCraftingAddress(address)", +"f26fb705": "getPayoutRoundId()", +"f270bcda": "getClosingBlockNumber(uint256)", +"f2711812": "milion()", +"f27197ab": "getIsAvailable()", +"f272404d": "_approve(address,uint256,address)", +"f2729497": "numberOfFarmers()", +"f2729d8a": "getMinutes(address)", +"f272a60c": "addBagDelayed(uint256,uint256)", +"f272fe18": "Campaign(uint256,uint256,uint256,address)", +"f273515c": "Cyberminer(uint256,string,string)", +"f273fbbc": "perform_withdraw()", +"f27402e9": "bchRaised()", +"f274a828": "icoPhase3Start()", +"f274d00c": "LAWCoin(uint256,string,string,address)", +"f2759ee2": "transferDomainBackToSeller(string)", +"f2760d9c": "shareHoldersWallet()", +"f2761444": "MathUtil()", +"f2766051": "lastFinish()", +"f276e1c7": "voteResultPublish(address[],uint256[])", +"f276f36b": "getGameDataByIndex(uint256)", +"f276fdde": "onTaxTransfer(address,uint256)", +"f277010d": "percentFeeTimes100()", +"f27715b4": "updateMultiSig(address)", +"f2787d33": "feeAccountToken()", +"f278bd02": "newBooleanValue()", +"f279648b": "setConstraint(int256,bytes32,bool,bool)", +"f279fac5": "internaltransfer(address,address,uint256)", +"f27a4188": "icoSucceed()", +"f27a73ca": "frozenCell(address,uint256)", +"f27a8a99": "updateEmployeeInfo(uint256,string)", +"f27ac4d9": "decrease(address,uint256)", +"f27ae77d": "DGDIssued()", +"f27b6d8f": "Message(string,address,uint256)", +"f27b8084": "walletWebydo()", +"f27b9341": "getTeamPlayersNum()", +"f27c24ed": "startCloseSale()", +"f27c3bf6": "oneYear()", +"f27c85bc": "getQuickPromoPercent()", +"f27d0afe": "deleteArbitrator(address)", +"f27d3977": "NEOBleu()", +"f27db8c9": "getWinnerPayout()", +"f27e2ef6": "nextMineEvent()", +"f27e4b1e": "SwitchTokenTransactionsOn()", +"f27ee76c": "lastPot()", +"f27eede0": "getTotalBid(address,uint256)", +"f27f974b": "Margaret()", +"f2801fe7": "getUserInfo(address,address)", +"f28063ce": "getMemeHolders()", +"f28075af": "get_player_address(uint256)", +"f280efaf": "addressToBytes1(address)", +"f28109d1": "ConsentTemplate(string,string,uint256,string,string,string)", +"f281c386": "_percent(uint256,uint256,uint256)", +"f281e7d1": "checkManagerStatus(address)", +"f282b1df": "batchAddCandidateByIndex(uint256,address[],bytes32[])", +"f282f551": "setCrowdsaleTokenExtv1(address)", +"f2836e1c": "contributorStatement(uint256,string)", +"f28386bf": "Nexium()", +"f2853292": "ChangeOwner(address)", +"f2856a2a": "getTeamPlayers(uint256)", +"f285d98e": "unlockSecret()", +"f285f25c": "tokenMetadataHash(uint256)", +"f286c1c5": "addtoOwners(address,address)", +"f287900d": "LogContribution(address,address,uint256,uint256,uint256,uint256)", +"f2887132": "baseHourglass()", +"f288753d": "centsPerEth()", +"f2888dbb": "unstake(address)", +"f2891b3d": "assetRegistrant(bytes32)", +"f28a2f75": "_allocateUnspentRefTokens()", +"f28a7912": "quick2()", +"f28ac86a": "token(string,string,uint256)", +"f28adc4d": "Attack()", +"f28afb1e": "pushAngelInvestmentData(address,uint256)", +"f28b325d": "admin_set_shopStoreRegister(address)", +"f28b7a9c": "disbursementAmount()", +"f28b824e": "MAT_TOTAL_SUPPLY_LIMIT()", +"f28c0716": "approveDeal(bytes32)", +"f28ce253": "is_min_goal_reached()", +"f28d253d": "getDividents()", +"f28e59c9": "get_sale_owner(address)", +"f28ee00c": "permittedSender()", +"f28f0f6a": "bulkCreateLambo(uint256,address,uint64,uint256,uint256)", +"f2901ae2": "ownerSetGlobalOperator(address,bool)", +"f29143ad": "Project_ChangeOwner(uint256,address)", +"f2928eea": "CaptainPreSell()", +"f2934817": "HalalPenny()", +"f293bab5": "numberofnews()", +"f294aa26": "EndoSHARD()", +"f295206f": "_unsafeSend(address,uint256)", +"f295587e": "giveITup()", +"f29617da": "registrationDeposit(address)", +"f2965a2c": "BurnupGameCore(address)", +"f296c1f2": "buyTokens(address,uint256,uint256,string)", +"f297109d": "RESERVED_TEAM_LOCKED_SIDE()", +"f2977c97": "approve(address,bytes32,bool)", +"f298083b": "setLottery(address)", +"f2980eb2": "getPRewardLength(address)", +"f2983257": "setFeatureStatus(string,bool)", +"f29a72ff": "_addTokenToPartition(address,bytes32,uint256)", +"f29b2040": "export(address,bytes8,address,address,uint256,uint256,bytes)", +"f29c1bc2": "setIsChargingTokenTransferFee(bool)", +"f29c7870": "setRefineCost(uint256)", +"f29d2f28": "setTokenHolder(address)", +"f29f1fa2": "RecievedEth(address,uint256,uint256)", +"f29f4d0b": "lastBuyTime()", +"f29f7b1b": "remove_coin(uint256)", +"f29fdb8a": "createSeason(uint32,uint64,uint64,address[8],uint256[8],uint16[8],address[8])", +"f29fe77e": "testMintGuy(int256)", +"f2a0928d": "preICOduration()", +"f2a0a987": "GCNYToken()", +"f2a16d5a": "GetNonce(uint8)", +"f2a38dac": "setKYCAdmin(address,address)", +"f2a40db8": "accounts(uint256)", +"f2a4a82e": "item()", +"f2a5630a": "BallotUp()", +"f2a5c79c": "getViewDatas()", +"f2a6517f": "updateTokenContractAddr(address)", +"f2a69417": "cancelFoundationTransfer()", +"f2a6e605": "evenDistThresh()", +"f2a724b1": "SnoqualmieCoin(uint256,string,string)", +"f2a75fe4": "empty()", +"f2a7e624": "approvedWallet()", +"f2a9a8c7": "allowance(bytes32,bytes32)", +"f2ab3e60": "incomeOf10k()", +"f2ab59d9": "contributionTarget_()", +"f2ab9384": "sumElements(uint256[])", +"f2abd01d": "initialBeating()", +"f2ac9427": "pricesToCommit(address[])", +"f2adc939": "removeBoundary(uint256)", +"f2af0e2f": "getProviderCurrentSupply(address)", +"f2af59bf": "fourthStage()", +"f2afe985": "LEBRON()", +"f2b0318e": "_getNibbleArray(bytes)", +"f2b05c15": "getTopicCount(address)", +"f2b0a55d": "getPlotData(uint256)", +"f2b175c0": "sendTokenTeam(address,uint256)", +"f2b1be45": "setAquariumCost(uint256)", +"f2b265ca": "playGame(uint256,string,string,string)", +"f2b26d8f": "nextEtherForSale()", +"f2b29993": "getMineral(uint256)", +"f2b2f40c": "allowPurchase(uint256)", +"f2b2ff1b": "platformReferral()", +"f2b3ddfa": "getCET4ByAddr(address)", +"f2b40209": "RATE3()", +"f2b445ad": "rowround(uint256,uint256)", +"f2b45ac1": "startCrowdSale()", +"f2b45ec5": "DonQuixoteToken()", +"f2b47d52": "geneScience()", +"f2b4c1b9": "isValidDataHash(bytes32,bytes)", +"f2b559ac": "printQuotation(int256)", +"f2b6e8b6": "emitSynthetixUpdated(address)", +"f2b7a54b": "destTokensAirdrop()", +"f2b841c0": "isPlayerIdle(address,uint256)", +"f2b85515": "addNewGame(address)", +"f2b904c3": "checkBetColumn(uint8,address,bytes32,bytes32)", +"f2b9541f": "createEthCommunityToken(string,uint8,string,uint8)", +"f2b9b40f": "enableRegistration()", +"f2b9f903": "_getParticipantRoles(address,address)", +"f2b9fdb8": "supply(address,uint256)", +"f2ba18ed": "calculateVotes()", +"f2ba31ea": "Marine()", +"f2ba478d": "EtherCashPay(address,address,address,uint256,uint256,uint256)", +"f2ba810e": "PRE_SALE_30_BONUS_MIN()", +"f2baaa07": "createBet(uint32,uint256)", +"f2bb5ce1": "maxMintProofOfStake()", +"f2bbca67": "checkVotingForChangeBuySellLimits()", +"f2bbdab4": "N2C()", +"f2bc7ded": "getHowManyOwnersDecide()", +"f2bcd022": "withdrawalAddress()", +"f2bddf66": "redemptionInfo(address,uint64)", +"f2be600d": "getNumTanksType(uint256)", +"f2bea1fc": "MANAGER_SUPPLY()", +"f2bee03d": "set_sale_address(address)", +"f2bf7e7a": "TokenGAC(uint256,string,string)", +"f2bff63b": "ico_tokens()", +"f2c00979": "_emitTransferred(address,address,uint256,address)", +"f2c0cdbe": "dividendsPercent()", +"f2c0d168": "newOwner(address,address)", +"f2c1d74e": "FansToken()", +"f2c298be": "register(string)", +"f2c2dff2": "testFailSetNotRetractableNotOwner()", +"f2c340f2": "chfCentsPerToken()", +"f2c3e6d9": "requireTokenFuel()", +"f2c402b6": "todayReserved()", +"f2c44e77": "UpgradeEnabled(address)", +"f2c4c45d": "makeInvestment(address,uint256,address,address,uint256,uint256,address)", +"f2c51f9d": "DNAc()", +"f2c5925d": "setNext(bytes12)", +"f2c6bab0": "doCallNumber()", +"f2c70bda": "addInvestorIfNotExists(address)", +"f2c768e1": "Register(string,string,string,uint256,uint256,address)", +"f2c7d331": "receiveDividends(uint256)", +"f2c80435": "addToUnminted(uint256)", +"f2c816ae": "addAddressToBlacklist(address)", +"f2c8257e": "getcapname()", +"f2c8a87b": "SYC2ndEarlyPurchase()", +"f2c8b676": "FACTOR_8()", +"f2c8d247": "convertibleToken(uint16)", +"f2c9e0ed": "SkrumbleToken()", +"f2c9ecd8": "getNumber()", +"f2cba6a6": "REPUTATION_DECIMALS()", +"f2ccaed5": "getSaleContractEndBlock(address)", +"f2cd84d5": "tokenHoldersToClaim(address)", +"f2cedaa0": "destroyCoins(address,address,uint256)", +"f2cee589": "TIER1_PERCENT()", +"f2cf687a": "MAXPERWEI()", +"f2cf70e4": "setWeekly()", +"f2cfe267": "setEpochData(uint128[],uint64[],uint64[],uint256[])", +"f2d05f2b": "playerIndexToOwner(uint256)", +"f2d06540": "setBitpaintingStorage(address,address)", +"f2d15c48": "setLicenceTellerPrice(bytes2,uint256)", +"f2d213c8": "BONUSED_PURCHASES_LIMIT()", +"f2d2e1a7": "QSHU()", +"f2d2fa91": "privateSaleMaxContrAmount()", +"f2d386b9": "getjournalists()", +"f2d439d8": "PokerPayout()", +"f2d50151": "verifyRs1Hash(bytes,bytes32)", +"f2d578dc": "RHToken()", +"f2d57adf": "setClaimInterval(uint256)", +"f2d5866d": "ATTR_EXPLORABLE()", +"f2d5d56b": "pull(address,uint256)", +"f2d68ee0": "withdrawCollateralFromPool(address,uint256)", +"f2d6cd26": "CEO_Trader()", +"f2d6e0ab": "__process(bytes,address)", +"f2d701a7": "giveaway(uint256,uint256,uint256,bool,address)", +"f2d73dc6": "VoteZoneToken()", +"f2d7f637": "closePosition(bytes32,uint256,address,address,bool,bytes)", +"f2d805d5": "firstStageRaisedInWei()", +"f2d906cc": "addressFounders2()", +"f2d93fb0": "setRushTimeFloorCount(uint256)", +"f2d9f46e": "flipPayingDoublrs(bool)", +"f2da1f0a": "imageAddress(address)", +"f2da67db": "setMany(uint256,int256,uint256,bytes20,address,bytes)", +"f2da877d": "dataOfSell(address,uint256)", +"f2dabd26": "multipleMint(address[],uint256[])", +"f2dadd3d": "FundRequestPrivateSeed(uint256,address)", +"f2db5493": "VGS()", +"f2dbe0f8": "options(bytes32,address,address)", +"f2dbf12e": "personalInfo()", +"f2dc8878": "setTokenSaleAmount(address,uint256)", +"f2dd4be8": "publish(string,bytes32,uint256)", +"f2dd4e03": "getTxCon(bool,bool)", +"f2dd6585": "garanteSystemDepositInAllFunds()", +"f2ddc772": "confirm(bytes)", +"f2dddd95": "BLDAToken(uint256,string,uint8,string)", +"f2de12fc": "getFxUSDAmount(string,uint256)", +"f2dfa136": "STATUS_DEAL_WAIT_CONFIRMATION()", +"f2dfd7f5": "cancelWarranty(string,string,address)", +"f2e03ad0": "openProvider(address,bool,string,string,uint256,string,uint8,bool,address)", +"f2e09c7a": "activatePoint(uint32,int256)", +"f2e0d636": "registerSponsor(uint32,int256,bool,uint32)", +"f2e1192a": "wolkSale()", +"f2e12a39": "setRole(uint8,address)", +"f2e1b1cc": "getWinSlot(uint256)", +"f2e1be50": "GDPOracle()", +"f2e22ae0": "messageBoard(string)", +"f2e253ec": "FUTURE_ME_TOKENS()", +"f2e27b33": "signedTransferHash(address,address,address,uint256,uint256,uint256)", +"f2e28e16": "BrianexToken()", +"f2e29341": "accountQuery(address)", +"f2e2e5ea": "trustedAddressInLUT(uint256)", +"f2e34909": "PRICE_CUTOFF()", +"f2e41c0b": "birthDateOf(uint256)", +"f2e4ff30": "isValidAuction(uint256)", +"f2e552a5": "verifyUpdateTransaction(bytes32,uint256,address,uint256,address,uint256)", +"f2e55ac1": "getDestinationByIndex(uint256)", +"f2e62772": "admin_address()", +"f2e650ff": "PerpetualTestCoin()", +"f2e6e170": "addressesImported(address,uint256,uint256)", +"f2e6fecd": "Ethernational()", +"f2e7269b": "transfer_token2_toContract(address,address,uint256)", +"f2e7514c": "buyByName(string)", +"f2e79ab7": "ETHealth()", +"f2e84f24": "_byrne(uint256)", +"f2e998df": "ownerRevealOverride(uint256)", +"f2ea83e6": "executeRecursive(address,address,bytes32,int256)", +"f2eae773": "getLockedWalletAmount(address)", +"f2eaee02": "applyWait()", +"f2eb32fb": "addOffChainContribution(address,uint256,uint256,string)", +"f2eb3e34": "init1()", +"f2eb5dd3": "tokenUSDRate()", +"f2ebde57": "tryExec(address,bytes)", +"f2ec602c": "feeWithdrawn()", +"f2ec6264": "ownerAddressLUT(uint256)", +"f2ecebea": "ratePreIco()", +"f2ed2148": "newGateway()", +"f2edb7c7": "purchaseWonder(uint256)", +"f2ee8be9": "setSubmissionOpen(uint256)", +"f2eea5c1": "setupAccreditedAddress(address,uint256)", +"f2eec570": "transferredAmount(address)", +"f2eec69b": "CTOAddress()", +"f2f03877": "commit(uint256,bytes32)", +"f2f0967b": "setLifToken(address)", +"f2f18af2": "Withdraws(address,uint256)", +"f2f254c7": "getLatestMinorTree(bytes32,uint32)", +"f2f2a043": "setUserCommissionRate(uint256)", +"f2f3384e": "_getGen0Address(uint256)", +"f2f3a1d2": "Erc20Token(string,string,uint8,uint256)", +"f2f3c773": "vestInterval()", +"f2f48e20": "Update_START_PRESALE_TIMESTAMP(uint256)", +"f2f4eb26": "core()", +"f2f56ffe": "getCommit(uint256,address)", +"f2f62ac7": "TOSPrivateIncentiveContract()", +"f2f65960": "setGracePeriod(uint256)", +"f2f6861b": "WinbitTest()", +"f2f6ccda": "getBalanceFromOwner()", +"f2f6ff15": "COLOR_BLACK()", +"f2f70594": "disableMintForever()", +"f2f76549": "startExit(uint256,uint256,uint256,bytes,bytes,bytes,bytes)", +"f2f8569f": "buyAndTransfer(address,address,bytes)", +"f2f85fce": "GRAND()", +"f2f921e6": "snapshotDailyGooDepositFunding()", +"f2f977a7": "getBetsByCategory(string)", +"f2fa8f69": "TokenPolicy(address)", +"f2fb5706": "deletePersons()", +"f2fc6deb": "weiToTokensBono(uint256)", +"f2fc9100": "init(address,string,string,uint8,uint256,bool)", +"f2fd2a49": "galleryThree()", +"f2fdddf4": "setEncryptContract(address)", +"f2fde38b": "transferOwnership(address)", +"f2fdfe34": "createSpecies(uint256,string,address)", +"f2fe1a1d": "geSoftwareVersionRecordsLength()", +"f2fec913": "collectMKR(uint256)", +"f2ff0912": "getHolderAtIndex(uint256)", +"f2ffb4fc": "stopLive()", +"f30000f9": "NewCloneToken(address)", +"f300cf1d": "addUserToMeta(address,uint256)", +"f301ac65": "hashBid(address,uint256,address,address,bytes32,uint256,uint256)", +"f3022de8": "setNewContractAddress(address)", +"f3025556": "newDeveloper(address,uint64,bool)", +"f3025f10": "dataOfBuy(address)", +"f302be42": "startTokenRaffle(uint256,address,uint256)", +"f3036c24": "UTORN()", +"f30398ef": "Wishcoin()", +"f30416ca": "setSaleAuctionContractAddress(address,address)", +"f30431b5": "addAdminAccount(uint256,address)", +"f3052d26": "getCategory(uint256)", +"f30562b6": "updateRecord(string,string,string)", +"f3057ff9": "accsessAccountTransfer(address,uint256)", +"f3072020": "partner_1_name()", +"f3074b58": "withdrawSDTfromcontract()", +"f307946d": "hardCapMainSale()", +"f3083c44": "GetMyEarnings()", +"f308846f": "registeredCallbacks(address)", +"f3095511": "GetTokenPriceCents()", +"f309782b": "LescovexAddr()", +"f309caca": "icoEndOfStageB()", +"f309e3c5": "allocateUnsold()", +"f30a4a70": "getSoldToken()", +"f30a7166": "multiTransferFrom(address,address[],address[],uint256[])", +"f30ba854": "tokensPerEther_numerator()", +"f30bb8af": "GoalReached()", +"f30c0ee6": "getRank05()", +"f30c9296": "myUsableBalance()", +"f30d3ad4": "crowdSaleAmountRaised()", +"f30d4d3f": "signedTransferFromCheck(address,address,address,uint256,uint256,uint256,bytes,address)", +"f30df155": "calculateBorrowAmountWithFee(uint256)", +"f30f8508": "setReservedTokensList(address,uint256,uint256)", +"f30faff6": "SetExtra(uint256)", +"f31011ac": "ANTS_TO_COLLECT_1ANTHILL()", +"f310348e": "_removeFrom(address,uint256)", +"f3106780": "DoDividend(uint256,uint256,uint256)", +"f3107c48": "nestedFirstAnyToAny2(uint256)", +"f310a19d": "getPlayerVaultsHelper(uint256,uint256)", +"f31174ee": "inactivityReleasePeriod()", +"f3125a1f": "deposit(address,uint256,bytes,uint256)", +"f31294a4": "announcementURI()", +"f3130ba5": "setTokensSoldInPresale(uint256)", +"f3147b00": "totalICOAmount()", +"f314bf46": "setReleaseDb(address)", +"f314e2c0": "CoinExchangeToken(uint256,string,uint8,string)", +"f314e976": "parcelGzeWithoutBonus()", +"f315e81d": "getStage1End()", +"f31604c7": "setData()", +"f3161022": "convertToEther(uint256)", +"f3164eb6": "transferAndFrozen(address,uint256)", +"f31660e9": "getOrganisationsSize()", +"f3169506": "readPurchaseAtIndex(uint256)", +"f316ea78": "buyOrderTotal()", +"f317b85b": "ownerAddressNumberMap(address)", +"f3181001": "founderAndTeamSent()", +"f3182d6c": "setFeeRate(address,uint256,uint256)", +"f31887e6": "tokenTransferByAdmin(address,uint256)", +"f318c75f": "dvipAddress()", +"f318cc4a": "invite(uint256,uint256,uint256)", +"f3191443": "toggleMigrationStatus()", +"f3199e98": "setMinWeiForDInit(uint256)", +"f319a899": "NameProvider(address)", +"f31a044d": "test_bytes(bytes,bytes)", +"f31a18a5": "endICOStage7()", +"f31b4e89": "updateEpisode(uint256,string,uint256)", +"f31bac4d": "SwitchLoanOwner(address,uint256)", +"f31bebaf": "BugBountyOneBreaker()", +"f31df3f8": "AddItem(uint32,uint16,uint256,uint16,uint16,string)", +"f31e3e84": "AML()", +"f31e731e": "attack(address,bytes32,uint256)", +"f31ed9e6": "DescartesToken()", +"f31fe982": "endGround(uint256)", +"f3200a1c": "change_symbol(string)", +"f3201424": "register(address,address,address)", +"f3203dc0": "MultisigsChanged(address,address)", +"f3205c93": "isUserBanned()", +"f320d963": "assertEq(string,string)", +"f320f858": "setRandomAddress(address,address)", +"f32106f0": "TemplateToken(uint256,string,uint8,string)", +"f32113d5": "setBgxWalletAddress(address)", +"f3214652": "NHSToken()", +"f321653a": "setCommunityBallotStatus(bool)", +"f3217345": "getShowText()", +"f32188a5": "reinvest(address,bool)", +"f3221c7f": "hasHash(address,bytes32)", +"f322770c": "LogWhitelistAdd(address,uint256,address)", +"f3227dc4": "cancelDeal(string)", +"f322a1cf": "BlueChainToken()", +"f322c755": "daoManager()", +"f32306d2": "registerNameXID(string,uint256)", +"f3236460": "closeUp()", +"f323a061": "lottoQueue()", +"f3269716": "year()", +"f326be05": "Centaure()", +"f3278191": "BuyFST(address,uint256,uint256,uint256)", +"f32784cd": "getGratitudeOf(address,uint256)", +"f327b7fc": "isNotZero(address,string)", +"f3283fba": "setMultisig(address)", +"f3290290": "createIncident(bytes32,bytes32,uint256,uint256,bytes32,uint256,uint256,uint256,bytes32)", +"f32a547c": "getBuy(uint256)", +"f32a72eb": "airDropMembers(address)", +"f32a9f77": "ReceiveEther(address,uint256)", +"f32b85e8": "timeScale()", +"f32d61eb": "setDevTokensPercent(uint256)", +"f32e8038": "setPercentIncrease(uint256,uint256,uint256)", +"f32eca11": "revokeAccessDeposit(address)", +"f32efd3c": "recoverUser(address,address,uint256,uint8,bytes32,bytes32)", +"f32f6a23": "olympus()", +"f32fc856": "Wanchain()", +"f32fe995": "left96(uint256)", +"f3302a4d": "ChangeTransferStatus(bool)", +"f3305ae2": "setName(bytes32,address)", +"f331020c": "GAMEPAUSED()", +"f3310628": "allocateTokensInternal(address)", +"f33146af": "test_twoTrueAsserts()", +"f3316ef5": "countStudentRequest()", +"f3318fed": "ThrowsInConstructor(bool)", +"f3319243": "decimalFraction(uint256,uint256)", +"f331de4c": "addShare(address,uint256,uint256,uint256)", +"f332511f": "getTxcode(uint256)", +"f33261ac": "stageCount()", +"f33280b2": "etherLimit()", +"f332a245": "unbanToken(address)", +"f3332d1c": "burnTokensExp(uint256,uint256)", +"f3333e7f": "etherProceedsAccount()", +"f33376c6": "createNext(address,string)", +"f333fe08": "getCertificate(bytes32)", +"f3358ac4": "getNum(uint256)", +"f33670aa": "sharesAddress()", +"f336bc7e": "maxDecreasePct()", +"f336e80a": "setMaximumVotingWindow(uint256)", +"f3372898": "dtrade(address,uint8,uint8,uint256[],address[],bytes32[])", +"f337616c": "PETER()", +"f337a0bb": "getLLV_edit_4()", +"f337c2e1": "calculateNextEtherValue(uint256)", +"f33801e0": "setCoachPrice(uint256,uint256)", +"f3382694": "isCamp()", +"f3388e75": "timelockController()", +"f338c984": "initialBountyAmount()", +"f3391998": "hasHash(uint256)", +"f339292f": "mintingStopped()", +"f3396905": "lockedNowBalanceOf(address)", +"f339c504": "lockBalance(uint256)", +"f33aa95d": "setIsTransferEnabled(bool)", +"f33ae7fd": "auctionOf(uint256)", +"f33b1ea5": "rewardUsers(uint256,address[],uint256[])", +"f33d0f3a": "requiredBet()", +"f33d9a52": "get_data_benefited(address,string)", +"f33dc1fa": "founderTokensAllocated()", +"f33f8f26": "setpubprize(uint256)", +"f33f9522": "readCoin(uint256)", +"f33ffc16": "addSpecialBonusConditions(address,uint256,uint256)", +"f34080b3": "MIN_INVESTMENT_ICO_PHASE_TWO_POUNDS()", +"f3408110": "transferWithFee(address,address,uint256)", +"f340fa01": "deposit(address)", +"f3412942": "accountLevelsAddr()", +"f34186c8": "endEthGet()", +"f341cae8": "setEmergencyAccount(bytes32,bytes32)", +"f341d3ba": "bandwidthFactor()", +"f3433ff2": "callbackTime()", +"f3436873": "totalAxiesRewarded()", +"f3436c85": "TKXToken()", +"f343ccbd": "CrystalSkull()", +"f3444701": "newTankType()", +"f344f4fa": "HARDCAPPED_SUPPLY()", +"f345d06b": "getTileHp(uint16,uint8)", +"f3463272": "signupFee()", +"f3465181": "preSeedAllocation()", +"f3466b47": "setTotalCollected(uint256)", +"f346fd74": "TraceChain()", +"f34839d1": "C50()", +"f3492915": "confirmSpendLimit(uint256)", +"f34969d1": "minimumFundingCHF()", +"f349e3e3": "own(address)", +"f34a5e85": "MercuryToken()", +"f34b95b3": "register(string,address,bytes32)", +"f34c7010": "commitSecurity(address,uint256,uint256)", +"f34d22d0": "getQuickPromoRemainingBlocks()", +"f34df94e": "Version(string,address,address,bool)", +"f34e2699": "isPresaleFinalized()", +"f34e3723": "release(string)", +"f34e4c60": "currNumOfBattleCards()", +"f34ed4e6": "RanDAOPlus(address)", +"f34f43f6": "getRepTokenAddress()", +"f34f5f45": "Election(string)", +"f3512ce0": "multiLock(address[])", +"f351d166": "_depositEscrow(uint256)", +"f3522656": "getRejections(uint256)", +"f352c45c": "createChallenge(string,string,uint256,uint256)", +"f353108b": "fechVoteResultForCandidate(address,uint256)", +"f353ae48": "goodluck()", +"f354040c": "SpreadToken()", +"f3541901": "execute(address,bytes,uint256,uint256)", +"f3548cd3": "getBagCount()", +"f354e2c3": "_getSeason()", +"f355b92d": "BuyTokens(address)", +"f356d6cc": "getPI_edit_18()", +"f356e8de": "placeNewSurvey(bytes32,uint256,uint32,uint256)", +"f3574a20": "TokenTransacted(address,address,bytes32,address,uint256,address)", +"f3576220": "withdrawls()", +"f3582373": "getTokenAddressesLength()", +"f3586fb9": "_isAuthorized(address,uint256)", +"f35898bd": "PreviousPayout()", +"f358b3de": "REKTMultiSigWallet()", +"f359671c": "withdrawWithReference(address,uint256,string)", +"f359b03c": "recalcBonuses()", +"f359d66d": "driverCount()", +"f35a8796": "removeHouseHold(uint256)", +"f35b3b51": "Bullioncoin()", +"f35b6068": "selectWinningNumber()", +"f35ba5d3": "acceptCeoOwnership()", +"f35c172e": "getSecondHexByte(bytes1)", +"f35d606c": "ETFToken(address[],uint256[],uint256)", +"f35dad40": "totalRedeemed()", +"f35e3945": "SRHCoin(uint256,string,string)", +"f35e4a6e": "setStartBlock(uint256)", +"f360234c": "compare(uint256,uint256)", +"f3604e54": "advisorsKey()", +"f36089ec": "getConversionRate()", +"f3608b57": "_getEthToUsdPrice(uint256)", +"f360c183": "setNonce(uint256)", +"f360e22f": "celebrityCount()", +"f3611719": "confirmFriendship(string)", +"f3616a90": "UpdateHOLDer(address,address)", +"f362b9af": "StartNewMiner()", +"f362d78f": "testBitNotEqualSuccess()", +"f3634033": "token_b_amount()", +"f363441f": "getCreatorDotBalance()", +"f363449f": "reservationSupply()", +"f3635a02": "vc2Wallet4Pct()", +"f3637d51": "setPayLock(bool)", +"f3647597": "setGrantVestedEDEXContract(address)", +"f364e7f4": "_investAsEarlybird(address,uint256)", +"f36631e7": "createHero(uint16,address)", +"f3667517": "getMinter()", +"f3669ec9": "hopefuls(uint256)", +"f36706cb": "SENSToken(address,address,uint256,uint256)", +"f3678cd3": "updateOffChainTokens(uint256)", +"f36a1fd9": "_allowBuyDirect()", +"f36a4bd3": "ReceivingContractTokenFallbackFailed(address,address,uint256)", +"f36b135d": "PRICE_EXPONENT()", +"f36c0810": "RANDOM_BYTES_COUNT()", +"f36c83f0": "getPuppy(uint256)", +"f36d1b8e": "SignStopDividend()", +"f36d1e4e": "setRewards(uint256,uint256,uint256)", +"f36d29e7": "triggerTansferEvent(address,address,uint256)", +"f36db900": "gameStarterDividendPercentage()", +"f36e20db": "getStage1Start()", +"f36e8dea": "MedicalCannabis()", +"f36f235d": "getLedger()", +"f36fd108": "editTitle(uint256,string)", +"f370031e": "BetOnATeam(address,uint256,uint256)", +"f3701da2": "build(address)", +"f3702b82": "setBonusPattern(uint256[],uint256[])", +"f3703a69": "LogGrantCreated(bytes32,uint256)", +"f3706bb7": "killTransaction(bytes32,bytes32,string,string)", +"f370ff51": "LogTokenPurchase(address,address,uint256,uint256)", +"f371475a": "initialiGnSupply()", +"f371ec49": "pausedB()", +"f3737ffd": "setDiscount(uint256[],uint256[])", +"f3746947": "giveBirth(uint256,uint256[2],uint256[2])", +"f3746ff7": "advisorReserve()", +"f375bcaa": "failedTimestampSeconds()", +"f37633f9": "Internet()", +"f376daa8": "MMX(uint256,string,string)", +"f3773466": "endIcoRoundManually()", +"f377f5b7": "setAirdropTotalSupply(uint256)", +"f3781697": "HubiiCrowdsale(address,uint256,uint256)", +"f3784dec": "withdrawFailed(address)", +"f378ff76": "random(uint32,uint32)", +"f3791477": "OLD_TOKEN()", +"f3794914": "mintParticularPart(uint8[4],address)", +"f37a7d4d": "boosters()", +"f37a9c1c": "ALLOW_BETA()", +"f37b0427": "CryptrustToken()", +"f37b437b": "scheduleCall(address,bytes,uint256,uint256,uint8,uint256,uint256)", +"f37b74ca": "authorizePayment(string,bytes32,address,address,uint256,uint256)", +"f37b916a": "tokenCreateUtcTimeInSec()", +"f37bdaac": "transferSig(bytes32,uint256,address)", +"f37bf1be": "getParticipateName(uint256)", +"f37cc477": "calcOutput(uint256,uint256)", +"f37d11cc": "canTransferFrom(address,address,uint256)", +"f37e592d": "shopStoreId(address)", +"f37e741e": "projectWeight(uint256)", +"f37f8345": "getTokenRates(address,address[])", +"f37fda1b": "setUser(address,address,bool)", +"f37fdaf5": "calculateProfitPercent(uint256)", +"f37ff01b": "getLLV_edit_13()", +"f380729d": "claimB2()", +"f3813163": "proxyTakeEtherBack(address)", +"f3817b23": "getWizzPandaCountOf(uint256)", +"f381a3e2": "FuelingToDate(uint256)", +"f381f2a5": "minimumCap()", +"f38323bb": "bountyDurationInBlocks()", +"f383c7b3": "setCrowdsaleStart(uint256)", +"f383d6b9": "OwnerValidatorImpl()", +"f384632c": "updateContestTeam(uint32,uint32,uint8[],uint32[])", +"f384764c": "oraclize_query(string,bytes[2])", +"f3850fda": "receiveTokens(uint256,uint256)", +"f385d890": "cnt_registrations()", +"f3868555": "orderEthOf(address)", +"f386b8fd": "TestToken2()", +"f3873e7b": "PublicBattle()", +"f38780e2": "winnerPaid()", +"f388b046": "currentTask()", +"f388ef80": "updateXPLPerEther(uint256)", +"f389057f": "_setMouthValue5(uint256)", +"f3898a97": "convert(address[],uint256,uint256)", +"f38a6163": "IncMainSupply(uint256)", +"f38a8262": "grantPermission(address,bytes32)", +"f38ad578": "setSecondWinner(address[])", +"f38afbf7": "setModuleEnable(string,uint256)", +"f38b0585": "withdrawAdvisorFunds()", +"f38b0600": "fireEventLog3()", +"f38b2ef0": "testTheFirstMultiplier()", +"f38d5cb9": "_getHash(address,address,address,address)", +"f38db3d8": "setRunningInternal(bool)", +"f38e5ca2": "getBlobStoreFromFullBlobId(bytes32)", +"f38fb65b": "revertCall()", +"f3905b82": "ibaMultisig()", +"f390cae4": "ADDR_TKG_TECH_FUND()", +"f390e4b4": "getResidentNumber()", +"f3913e69": "tokenTransferFrom(address,address,address,uint256)", +"f391f074": "accountIdForAddress(address,address)", +"f3922cde": "addExceptAddress(address)", +"f39259d0": "_batch2_icosaleStartTimestamp()", +"f393b3b0": "_DataRegistered(bytes32)", +"f393f022": "icoStartP5()", +"f3942753": "addTxToCustomerRegistry(address,bytes32,uint256,uint256)", +"f3945ca0": "addEndorsement(bytes32,bytes32)", +"f39460c4": "setCheckMinContribution(bool)", +"f3956a71": "isMEH()", +"f396282d": "signupVerify(bytes32,bytes32)", +"f396cd66": "weiAmountShare()", +"f396e81b": "SALES_DURATION()", +"f397884b": "preIcoOpeningTime()", +"f3983e44": "createAmountFromTmedForAddress(uint256,address,address)", +"f398dc28": "aprovarUsuario(address,uint256)", +"f398faaa": "getRank09()", +"f3993d11": "batchTransferFrom(address,address,uint256[])", +"f39981e1": "burnStake(address)", +"f3998918": "getPreSaleTokenAmount(uint256)", +"f39992e4": "Blackwood()", +"f399c7e6": "startGame(address,uint256)", +"f39afaba": "GCV()", +"f39b1e74": "CQMVValueCirculateAssets()", +"f39b5b9b": "ethToTokenSwapInput(uint256,uint256)", +"f39b7fb1": "get_dati_articolo(bytes,bytes,bytes10)", +"f39bfb52": "giveBountyTokens(address,uint256)", +"f39c2197": "numberOfPartners()", +"f39cce01": "convertLotIdsByAddress(address)", +"f39d359b": "initDemoc(string)", +"f39d9f19": "CSES1()", +"f39e6e1e": "OwnerAddition(address)", +"f39e9fa6": "setERC223Activated(bool)", +"f39ec1f7": "lookup(bytes32)", +"f39f421e": "FIBKAD()", +"f3a04af4": "PUBLIC_TOKENS()", +"f3a133a9": "setStartAt(uint256)", +"f3a16c3e": "tokenCreationCapWithOutBonus()", +"f3a1b4b2": "setCrowdsaleStartandDuration(uint256,uint256)", +"f3a1d297": "addToken(address,string,string,uint8,string)", +"f3a1f828": "EventRandomLedgerRequested(address,uint256,uint256,uint8,address)", +"f3a247cb": "ZooToken(uint256)", +"f3a27963": "unpauseMints()", +"f3a3abc6": "setWhitelistTransfer(address,address,bool)", +"f3a3bef4": "innerScope()", +"f3a3de38": "EMACCrowdsale(uint256,uint256,uint256,address)", +"f3a44fe1": "withdrawForWorkshop()", +"f3a49f90": "sendOwner()", +"f3a504f2": "funded()", +"f3a53cd8": "ICOWIZARD(string,string,uint8,uint256)", +"f3a5626b": "addPurchased(bytes32,uint256)", +"f3a5644d": "crowdsaleEndedTime()", +"f3a5950e": "testHighestTranch()", +"f3a5f262": "setMemberTier(address,uint256)", +"f3a60cb4": "unLockAddrOwner(address)", +"f3a670cd": "Redeemed(address,uint256,uint256)", +"f3a67ad2": "subAccountBalance(address,uint256)", +"f3a8041f": "Crowdsale(address,uint256,uint256,uint256,uint256,uint256)", +"f3a87492": "AntiFakeLabelToken(address,uint256)", +"f3a8bcaa": "_logGameGiftInfo(address)", +"f3a9bf03": "verifyImage(address,string)", +"f3aa4420": "_grandTournamentBooty(uint256,uint256,uint256,uint256)", +"f3aa67ad": "buyTokensOraclePayIn(address,uint256)", +"f3ab7ea9": "seeker()", +"f3ac2732": "confirmed(uint256)", +"f3ac3df5": "prizeFund()", +"f3ac9ee4": "parseOpenTx(address[11],uint256[10],uint32[4],bool,bytes)", +"f3acc06b": "retrait_1()", +"f3acc477": "addTotalEtherValue()", +"f3ad0dd8": "multiTransferToken(address[],uint256[])", +"f3adcc46": "getMinerHashRateCurrentHalving()", +"f3ae2415": "isManager(address)", +"f3ae5acd": "LastExtractTime()", +"f3aee9f9": "tokensUnlockPeriod()", +"f3afe129": "hourPotExpiration()", +"f3aff181": "collectBagHolderFund(uint256)", +"f3b07bb1": "maxEthPerTransaction()", +"f3b15ffd": "test_insert_containsId()", +"f3b16265": "onDraw()", +"f3b303cd": "AdvanceToken()", +"f3b35100": "voteOf(address)", +"f3b3a9fa": "maxReserve()", +"f3b423d5": "updateReloadAmount(uint256)", +"f3b42c40": "isOnSaleAny3(uint256,uint256,uint256)", +"f3b4735e": "lotteryAddresses(uint256)", +"f3b4eccb": "ChallengeFund()", +"f3b50c04": "rescind()", +"f3b55007": "TDx(uint256,string,uint8,string)", +"f3b5678f": "ETHER_MAX_CONTRIB()", +"f3b585cc": "nSteps()", +"f3b5a5af": "bonusForEveryone()", +"f3b600ec": "_allocateTokens(address,uint256,uint256)", +"f3b6a748": "unpauseFrom(uint256)", +"f3b75ee3": "totalCommunityFundMinted()", +"f3b77f30": "close(bytes,bytes)", +"f3b849d6": "_allocateReferralTokens(address,uint256)", +"f3b8b2a9": "weiBuysHowManySeconds(uint256)", +"f3b978c1": "checkProof(bytes32[],bytes32[])", +"f3ba138e": "MineLevel(uint256)", +"f3baa092": "RemoveRequestEvent(address,address)", +"f3bb9741": "commitmentCampaign(uint256,bytes32)", +"f3bbc84c": "tierNum()", +"f3bd27a4": "secondStageMinting()", +"f3bda50a": "getSetNewTerrainPrice(uint256,uint256,bytes32)", +"f3bdc228": "destroyBlackFunds(address)", +"f3bdea04": "burnICACOIN(uint256)", +"f3bdf8ba": "requestEthereumLastMarket(address,string)", +"f3be07eb": "getDefaultTranches(address)", +"f3be1e35": "VIVAToken(uint256)", +"f3becb59": "C(address)", +"f3bf6b73": "proposalChecked(address,uint256,uint256)", +"f3bf78e7": "setBAAAU(bytes32,address,address,address,uint256)", +"f3bf93a0": "forceReleaseAdmin(bytes32)", +"f3bfddb7": "getById(string)", +"f3bfe75e": "BeatTokenIcoFinalized()", +"f3c0efe9": "tokenToTokenTransferOutput(uint256,uint256,uint256,uint256,address,address)", +"f3c156f3": "purchaseDigitalArtSellingItem(uint256)", +"f3c15f49": "getLiability()", +"f3c16e54": "Resolve(bytes32)", +"f3c1c7c0": "LogCoinsEmited(address,uint256)", +"f3c20de0": "tokens(uint16)", +"f3c274a6": "isPut()", +"f3c37bd5": "Verifier(address,uint256,uint8)", +"f3c505c2": "updateInventories(uint256,uint256,uint256,uint16)", +"f3c50ce0": "CobeFriendCore()", +"f3c51c84": "_EnvoisTokens(uint256,uint256)", +"f3c537c5": "fint8(int8)", +"f3c64850": "amendedEarlyPurchaseIndexes(uint256)", +"f3c6a223": "Bifrost1Token()", +"f3c74496": "logWorkerStatement(string)", +"f3c78091": "AcceptingDepositsChanged(bool)", +"f3c7d275": "prenup(string,string,string,string,string,address,address)", +"f3c7e538": "set_successful_verifier(address)", +"f3c85eba": "compound(uint256,uint256,uint256)", +"f3c8f3ef": "startListing()", +"f3c8ffaa": "endPreICOStage()", +"f3c957f2": "haltCommitPeriod(address,bytes32,bytes32)", +"f3c95c60": "isValidUser(address)", +"f3c9a5cc": "CrowdsaleController(uint256,address,address,bytes32)", +"f3ca062a": "setLevel(uint256,uint8,uint8,uint16)", +"f3ca29b1": "ownerDailyWithdrawal()", +"f3ca2b54": "test_twoValidEqString()", +"f3ca5679": "Fund(address,string,address,uint256,uint256,address,address,address,address,address[],address[])", +"f3ca7425": "exercisePriceOf(uint256)", +"f3ca824c": "setStartCloseSale(uint256)", +"f3caad03": "isCitizen(address)", +"f3cb1805": "bidOnBreedingAuction(uint40,uint40)", +"f3cb4aae": "confirmBusiness(address)", +"f3cb8c31": "addEmployee(address)", +"f3cbc040": "checkVerify(bytes32,uint256,uint256,uint256)", +"f3cbe7b5": "exchangeableTokensFromStock()", +"f3cc2436": "maxPoolTotal()", +"f3cc6860": "setHash(bytes32,uint256,bytes32)", +"f3cca49a": "restoreUnsoldTokens(address)", +"f3cca5b4": "crowdSaleSoldAmount()", +"f3cca85a": "getInputAddress()", +"f3ccaac0": "image()", +"f3ccb401": "DistributeAirdropMultiple(address[],uint256)", +"f3ccc2f2": "buscarDocumentoPorQM(string)", +"f3cd1c28": "setTransfersAllowed(bool)", +"f3cd543f": "sendBoughtTokens(address,uint256)", +"f3ce2bc6": "_updateSaleAvgHistory(uint256,uint256)", +"f3ce40eb": "setSchellingRoundSupply(uint256)", +"f3ce782e": "LongBought(address[2],uint256[5],uint256)", +"f3cee129": "getOwnerServer()", +"f3cee64d": "setCmd(uint256)", +"f3d1dfee": "calcSeason(uint16)", +"f3d2f17b": "getData_22()", +"f3d2f824": "setXQU(string)", +"f3d305b4": "getBoostedProposalsCount(address)", +"f3d3402a": "changeBountyData(uint256,string)", +"f3d38a7b": "setBTBAddress(string)", +"f3d3d448": "setControllerAddress(address)", +"f3d3fce7": "settleLend(bytes,bytes,address,uint256,bytes,bytes,bytes,bytes)", +"f3d448d2": "countryInfo(uint256)", +"f3d47d1b": "transferAllFrom(address,uint256[])", +"f3d490db": "transferByPartition(bytes32,address,uint256,bytes)", +"f3d4b942": "emergencyFreeze()", +"f3d544d2": "FRTToken(uint256,string,string)", +"f3d6b54e": "setAirdropPrize(uint256,uint256)", +"f3d6cb29": "setLLV_edit_34(string)", +"f3d791ea": "submitTrade(address,uint256,address,bytes)", +"f3d79244": "frozenProfitDate(address)", +"f3d7bf1d": "privateStageTokensSold()", +"f3d7c6f7": "claimPrivateTokens(address[],uint256[])", +"f3d7e464": "EARLY_CONTRIBUTOR_VESTING_PERIOD()", +"f3d838a0": "Copyright()", +"f3d89c49": "setAutoCreationFee(uint256)", +"f3d91708": "isEligibleForUpgrade(address)", +"f3d97a25": "cancelTrade(address,address,uint256,uint256,uint256)", +"f3d9bc65": "sendBountyTokens(address,uint256)", +"f3d9eeec": "CourseChanged(uint256,uint256)", +"f3db09b8": "invoice(bytes32,address,address,uint256,uint256,uint256,uint64,uint64)", +"f3db4f2b": "retrievePieceFromEscrow(uint256)", +"f3dbaf0d": "removeVestingAdmin(address)", +"f3dd3d8a": "newCurrency(string,string,uint8)", +"f3ddb946": "bets_total()", +"f3de56de": "createNewSociety(string)", +"f3df0bbe": "startNewBallot(bytes32,bool,bytes32[])", +"f3df29b6": "periodITO_endTime()", +"f3e1cb63": "rsVerifyPublic(bytes32,uint256[2],uint256[],uint256[],uint256[],uint256[])", +"f3e1efbf": "validation_inviter(address)", +"f3e238d2": "StrongKek()", +"f3e2aa83": "requestReclaimEther()", +"f3e3c629": "testBalanceOfStartsAtZero()", +"f3e41a99": "addRound()", +"f3e4877c": "distribution(address[],uint256)", +"f3e4cac4": "_getTokenPrice()", +"f3e5c15e": "screenstate()", +"f3e62640": "buyToken(uint256,address,uint256)", +"f3e664c9": "setSaasApiProfitAddress(address)", +"f3e68264": "getSignerOfBalanceHash(address,uint8,uint256,bytes)", +"f3e71756": "checkTickets()", +"f3e84c4c": "FundingClosed()", +"f3e84cf3": "createNewRevision(bytes32,bytes)", +"f3e94596": "LogReferral(address,address,uint256)", +"f3ea1241": "releaseFirst()", +"f3ea4c68": "set_symbol(string)", +"f3eac094": "defaultAuctionPrice()", +"f3eb2445": "SimpleToken(string,string,uint256,address)", +"f3ec3f4a": "whitelistPreSaleAddressMany(address[],bool)", +"f3ecda21": "ITSM()", +"f3ece9f4": "addBlockList(address)", +"f3ed064a": "bonus01End()", +"f3edf112": "changeHelper(address)", +"f3ee6305": "removeCertificationDocument(address,bytes32)", +"f3eeb84b": "lastBlock_f9Hash_uint256()", +"f3eef981": "_init(uint40,uint40)", +"f3f10da7": "Balance(string,uint256,address)", +"f3f11048": "ethAddressPublicKey(bytes32,int256,bytes32,int256)", +"f3f16a15": "voted(address,bool)", +"f3f18615": "verifyTrustedSender(uint256,address,uint256,uint8,bytes32,bytes32)", +"f3f1b5a7": "CongressOwned()", +"f3f1d909": "redeemCoin(uint256,address,bool)", +"f3f1e4ea": "MenglaToken(address)", +"f3f2e656": "setAttributeSigned(address,uint8,bytes32,bytes32,string,bytes,uint256)", +"f3f2f0bc": "beneficiary2()", +"f3f31853": "getPayTable(uint16)", +"f3f43703": "pendingWithdrawals(address)", +"f3f458f8": "cycleCount_()", +"f3f480d9": "challengePeriod()", +"f3f4aef3": "getUserIDAndInviterEarnings()", +"f3f52865": "getPersonalStakeAmounts(address,address)", +"f3f6f0d7": "lastIndex()", +"f3f70674": "oracle_call(uint256)", +"f3f7650d": "fetchOrdersForMerchant(address)", +"f3f79a97": "setDebtIncreasingFactor(uint256)", +"f3f9240b": "investAs(address)", +"f3f969a0": "setRegisteredAuthority(string,address,bool)", +"f3f9c004": "reffalPool()", +"f3fa1e7b": "bulkApproveTransfers(uint256[])", +"f3fa2c37": "getUpdateHash(uint256,uint256,uint256,uint256)", +"f3fac412": "_calcEndTime(uint256)", +"f3fb9a02": "setInfo(uint256,uint256)", +"f3fbabb5": "setDedicatedProxy(address)", +"f3fbfc60": "SFTSEV()", +"f3fc536d": "revokeConfirmation(bytes32)", +"f3fc7fb2": "Ordient()", +"f3fce3b5": "setC4FContractProviderCompleted(address,bool)", +"f3fd826f": "transferFromTokens(address,address,address[],uint256[])", +"f3fde261": "onTransition(bytes32)", +"f3fe12c9": "claim(string)", +"f3fe5bc2": "totalWitdrowedToken()", +"f3fef3a3": "withdraw(address,uint256)", +"f3ff10bf": "UseQuantity(int32)", +"f4009d99": "changeMainStartTime(uint256)", +"f400a3d7": "finishDate()", +"f400d37b": "yesVoteSum()", +"f400fde4": "amount1()", +"f4010db0": "deleteTile(uint16)", +"f4016ac3": "setInitialState(address)", +"f4016b17": "destroyBPESOToken(address,uint256)", +"f4025568": "approveCertificate(uint256)", +"f4029e92": "getMonsterReturn(uint64)", +"f40314f4": "tokenCurrentStage()", +"f4044697": "xrateProviders()", +"f404d1e2": "transferAndCall(address,uint256,bytes,string)", +"f404df8e": "_getExpectedRate(address,address,uint256)", +"f405311b": "Made(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"f405a275": "EventJoinedBattle(address,uint256)", +"f4064471": "messagePreSignedHashing(bytes8,address,address,uint256,uint256,uint256,uint8)", +"f4071928": "mintAuditApproval(address,address,uint256)", +"f407c81d": "tokenNoByAddress(address)", +"f408ebe9": "dev_reset()", +"f409a609": "internalMintToken(uint256)", +"f409ab66": "getDepositedCount()", +"f409e633": "SetENGDevAddress(address,address)", +"f40a049d": "triple(uint256)", +"f40a9112": "whaleIncreaseLimit()", +"f40c0843": "subscribe(address,uint8,bytes32)", +"f40d71f1": "releaseTokens(address,uint256)", +"f40d8d8f": "updateAllowance()", +"f40e0b6e": "coinsToSell()", +"f40e28f2": "createGen0Auction(uint256,uint256,uint256,uint256,address)", +"f40e8d8b": "retryWinner(uint256)", +"f40ea5cb": "setReservePricing(uint256)", +"f40ebcf3": "setBalanceOfValueFor(address,uint256)", +"f40ef739": "preIcoEndsAt()", +"f41017fc": "finalize(uint24)", +"f410a26b": "receive(address,uint8,uint32[])", +"f410aa39": "_issueByPartition(bytes32,address,address,uint256,bytes,bytes)", +"f4116381": "setFiscal(bytes32)", +"f411fb21": "freezeWithdraw(address,uint256,bool)", +"f41293c7": "getIndexForTeamId(uint32,uint32)", +"f412af91": "getOuvidoriaEndpoint(address)", +"f41377ca": "setFoundationAddress(address)", +"f41440d9": "setCreator(address,address)", +"f414cccb": "removeFreezableAddresses(address[])", +"f4156757": "TeamPoolAddress()", +"f415ed14": "slash(bytes32)", +"f4162530": "nodeFee()", +"f4163340": "isFailed()", +"f416d2cb": "emitTokensSince()", +"f417614a": "validateAndReturnContribution()", +"f418b153": "replaceMarketingToken(uint256,uint256,uint128)", +"f418cf4e": "recordSenderIfNecessary()", +"f4199bb8": "initializeWhitelist(address[])", +"f4199fb7": "ayy()", +"f419c69d": "_createPony(uint256,uint256,uint256,uint256,address)", +"f41a12c8": "_takeOwnership(address,uint256)", +"f41b536e": "getRecipientString()", +"f41bc988": "isPartyA(address)", +"f41bfa9e": "mint(int256,uint256,string)", +"f41c1c93": "setAnswerFee(uint256)", +"f41c639e": "sendMsg()", +"f41d0b0c": "getInfluencer(string)", +"f41d1a82": "partner1_name()", +"f41d97fc": "getPriceOfTokenInLastAuction(address)", +"f41db329": "addAuction(uint40,uint40,uint128,uint40)", +"f41dc25f": "totalWeiLose()", +"f41e3494": "hasFailed(uint256)", +"f41e60c5": "enableTransfers(bool)", +"f41e8fc8": "periodAmount()", +"f41f4b10": "retrieveHouseTake()", +"f41fa999": "TTest()", +"f4201c3c": "isVIP(address)", +"f4206706": "withdrawEthers(uint256)", +"f420977d": "noOfTokenAlocatedForSeedRound()", +"f420c5b1": "getCloneWallets(uint8)", +"f420d9d2": "setNumRewardsAvailableForAddress(address,address)", +"f4217648": "setWhitelist(address[])", +"f421e02b": "testCantFinalizeWithIncorrectCap()", +"f42206d1": "HouseEdgeUpdate(uint256)", +"f422878a": "addressIsStakeDiceGameContract(address)", +"f42355a4": "isSaleInitialized()", +"f4239eec": "affiliatePercent()", +"f4246be4": "addToBundle(bytes32,bytes32)", +"f4250f75": "AgriChainPrevData()", +"f42541be": "promoToonsMinted()", +"f42598f0": "get_mintable()", +"f4268e46": "g17token()", +"f426ceee": "award(bytes32,uint256,address,bool,uint256)", +"f426d8ac": "withinHomeLimit(uint256)", +"f426f03a": "setFrequency(uint256)", +"f427211c": "getTime2(address)", +"f4279d1f": "updateEthUSDOracle()", +"f42a2c42": "removeAssetListing(uint256)", +"f42aa287": "getBlobStore(bytes12)", +"f42ac1de": "minQuorum(uint256)", +"f42b1ae0": "unPauseGame()", +"f42b9999": "icoMinInvest()", +"f42c051e": "submitTokenToEthOrderWHint(uint128,uint128,uint32,int256)", +"f42c0f02": "MARKETING_SHARE()", +"f42c56c2": "cbrt(uint256)", +"f42ca2ee": "sub_32(uint32,uint32)", +"f42d1d30": "creditorAmounts(uint256)", +"f42eb765": "getAgreement(bytes32)", +"f42ef9ec": "emitWithrawalRequestEvent(address,address)", +"f42f0c7d": "lengthOfCommonPrefix32(bytes32,bytes)", +"f430511a": "setMaxAddresses(int32)", +"f43098af": "resetTokenOwnership()", +"f4320f00": "getProjectUnusedTokens()", +"f4325417": "App(address,string,uint256,string)", +"f4325d67": "reserveToken()", +"f43313b6": "assertEq31(bytes31,bytes31,bytes32)", +"f433262f": "updateFromRegistry()", +"f4338e89": "getAllTeamCosts()", +"f433e12e": "marketingTokenWallet()", +"f4347267": "getX(bytes)", +"f434e028": "PreICOProxyBuyer(address,uint256,uint256,uint256)", +"f4351908": "InitialRateChange(uint256,uint256)", +"f4351e15": "addAndMintPlayers(uint128[],bool[],uint256,uint256,uint256)", +"f43532ac": "changeWaveVoteContract(address,string)", +"f435d012": "setUnitJadeStealingIncreases(address,address,uint256,uint256,bool)", +"f435f5a7": "lock(address)", +"f436de14": "setAllowanceValue(uint256)", +"f437019c": "stop_service(uint256)", +"f437bc59": "host()", +"f437d6bc": "objectShield()", +"f4381136": "DeferredPresaleTokenPurchase(address,address,uint256,uint256)", +"f4385912": "getPlayerId(uint256)", +"f4385eaf": "KPISToken()", +"f4387d86": "arbitrateApproveMilestone(uint256)", +"f4395dbc": "bitmcoinToken()", +"f4399f2d": "MDIToken()", +"f43a72b0": "setactive(bool)", +"f43abdf3": "getCrowdsaleUserCap()", +"f43acb52": "checkLottery(uint256)", +"f43b1620": "addUserAuto()", +"f43b4808": "viewPassword(uint256)", +"f43b7a76": "AdmineAdvisorTokens()", +"f43bac53": "poolFeeIncurred(uint256)", +"f43e34b2": "unFreezeAll(address)", +"f43e3918": "MELON()", +"f43e98c7": "refunding()", +"f43f523a": "mod(uint256,uint256)", +"f43fd7e0": "_handleTrainingFailure(uint256,uint256,uint256)", +"f4412803": "currentTotalAirDrop()", +"f44191f0": "getAccessoryByIndex(address,uint256)", +"f441b1c8": "currentAmount()", +"f4424cac": "getNumberOfLogEntries()", +"f44349dd": "angelTokenSupply()", +"f44376a2": "preFixed(address,uint256)", +"f443ea83": "MindHacker()", +"f444c136": "createDklAuction(uint256,address,uint16,uint256)", +"f444ea30": "allowBack()", +"f4451628": "buyHSShop(uint256)", +"f44544b3": "fundPos()", +"f4462d04": "periodicity()", +"f44637ba": "addBurner(address)", +"f4463fb7": "emergencySelfDestruct()", +"f44667a6": "tokensAmount(address,address)", +"f446c1d0": "A()", +"f449619e": "collectPrize(uint256)", +"f449958d": "deliverManagementTokens(address)", +"f449c3cb": "_presaleSupply()", +"f449ffe4": "setPresaleRate(uint256)", +"f44a06b9": "endIcoSaleRound1()", +"f44a6ca9": "addProduct(address)", +"f44b43f8": "approveAmount(uint256,address,uint256)", +"f44b54ca": "functionName1(bytes32)", +"f44b79b3": "withdrawalAll()", +"f44bd811": "TRCERC20(uint256,string,string)", +"f44dc562": "_addKey(address,uint256)", +"f44e1351": "setEpisodeManager(address)", +"f44f13d8": "assert2()", +"f44f8be9": "sendNegReq(uint256,uint256,uint256,string)", +"f44ff712": "blockHeight()", +"f450096f": "updateOraclizeGas(uint256,uint256)", +"f4500eb5": "ETHERCFeeModifiers()", +"f4508082": "_price_token()", +"f4509fc2": "LOCKED_1Y_DATE()", +"f450b574": "_mixer()", +"f450cfee": "disablePrivileged()", +"f450d53a": "allFinalised()", +"f450e5f8": "TOKENS_SOLD_LIMIT()", +"f4510455": "STQPreICO2TestHelper(address,address[])", +"f4514ca6": "buySome(uint256,uint256,uint256,uint256,uint256)", +"f4519035": "betOdd()", +"f452b69c": "getCommandTokens()", +"f452f32d": "getByTo(uint256,uint256)", +"f45346dc": "deposit(address,uint256,address)", +"f45392fb": "getReportingWindowByMarketEndTime(uint256,bool)", +"f453c827": "getAddressField3()", +"f4544255": "refer(address,address)", +"f454c32c": "teamReserveTokensDistributed()", +"f4559619": "newOwnerTemp()", +"f4560403": "Zero()", +"f456106d": "ProdCToken()", +"f4572664": "changeMinimumPurchaseAmount(uint256)", +"f457361a": "paidversion()", +"f457547a": "spreadPercent()", +"f457688d": "can_i_jump()", +"f4577298": "EthGet()", +"f457ee5a": "donation(address)", +"f45811bd": "Voyager()", +"f4586cba": "setVestingRevokeDate(address,address,uint256)", +"f4591074": "finishInvite()", +"f45934b6": "cards_gold_total()", +"f45984fd": "TOKEN_UNIT_RATIO()", +"f459ce60": "btycbuy(uint256)", +"f459eb61": "generateKeccak256(bytes)", +"f459f517": "dividendsPoolAddress()", +"f45a729c": "getEtherValue(uint256)", +"f45b106a": "increaseMonthlyTransactionVolumeReceiving(uint256)", +"f45b4fba": "setPersonalBonus(address,uint256,address,uint256)", +"f45b96a0": "financePeriodsCount()", +"f45c85e5": "currentOwnerFeePercent()", +"f45ce8d7": "setAddressKYC(address,bool)", +"f45dae6e": "parseLoanOfferRates(uint256[7],uint32[4])", +"f45e29bb": "hashCoin()", +"f45e8dc4": "buyWarlordChest(uint256)", +"f45eb5b4": "_generateRandomhashNumber(string)", +"f45ef033": "nextReduceSupply()", +"f45efe88": "stage1Bounty()", +"f45f74f8": "VerityToken()", +"f460473e": "fillArray()", +"f460590b": "updateSigner(address,bool)", +"f460c5e4": "listItem(uint256,uint256,uint8)", +"f460e5d0": "setRamenContract(address)", +"f461847c": "DatGirl()", +"f4619e71": "NokuCustomERC20Service(address)", +"f461db0e": "teamAllocatedTime()", +"f461db4a": "getdoc(uint256)", +"f4623d44": "getStorage(address,uint256,uint256,bytes)", +"f4623e0b": "addBalance(address,address,uint256,uint256)", +"f462671e": "isAuthDisabled(uint256,uint256)", +"f46332e0": "test_claimShare_emptyFeeAndRewardPools()", +"f4635674": "countryOwnersOf()", +"f4637003": "transferChildren(address)", +"f463be37": "setSecondAddressBalance(address)", +"f463edd1": "createDocument(uint256)", +"f464e64e": "premiumPacks(uint256)", +"f464e7db": "sellToken(address,uint256)", +"f4656219": "PRICE_RATE_FOURTH()", +"f4660ff5": "timeVault()", +"f4662f71": "canUnshelf(string,address)", +"f466f106": "addHouseHold(uint256,uint256,uint256)", +"f4674b89": "withdrawByAdmin(address,uint256,address)", +"f4686b42": "GxAdminOperations(address)", +"f468e9b3": "inICO()", +"f469707f": "addToGoldList(address)", +"f46b5321": "calculatePoolAmount(uint256)", +"f46b986a": "secondExtendedBonusSalesEnds()", +"f46bbc09": "thirdStageTokenRate()", +"f46c0f29": "compensate(uint256)", +"f46c50dc": "doFail()", +"f46c858a": "addAdvisor(address)", +"f46d1982": "setup(address,uint256)", +"f46d91f4": "TokenBurn(uint256)", +"f46da084": "createName(string,string,string,string,bytes32)", +"f46de44a": "Etherumchain()", +"f46eccc4": "minters(address)", +"f46f16c2": "MARKET()", +"f46ff44f": "dollarToEtherRatio()", +"f4700d3e": "lpMaxVolume()", +"f4703d26": "numbersCountMax()", +"f47073f4": "setTotalIncomeFeePercent(uint256)", +"f470fd5e": "BLU()", +"f47125f5": "StableICO()", +"f471e626": "disapproveByC(uint256,string)", +"f47279d2": "capRemaining()", +"f47289e1": "_ecDouble(uint256,uint256,uint256)", +"f472d615": "enableIco()", +"f472e136": "fraction(int64,int64)", +"f4734818": "_random(uint256,uint256,uint256,uint256,uint256)", +"f4736429": "changeUnicornRanchAddress(address)", +"f473c484": "BatchDetachAssets(uint256[10])", +"f4749624": "dist_list_set(address[],uint256[])", +"f474b6b2": "aboutWorker(address)", +"f4752806": "convert2PeonyToken(uint256)", +"f4757a49": "HighestBidIncreased(address,uint256)", +"f47599db": "WLMTBounce()", +"f4773d26": "AESSignatum(uint256,string,string)", +"f47760ac": "forceGame(uint256,uint256)", +"f47795f3": "CommonTokensale(address,address,address)", +"f477a6b7": "depositEthers()", +"f477c2b9": "setColdWalletAddress(address)", +"f4784b37": "placeCube(uint256,uint256,uint256,uint256,uint256)", +"f478cef1": "leader_2()", +"f47a6e84": "getReleased()", +"f47aa124": "AutoSplitCurator(address)", +"f47b7740": "information()", +"f47c84c5": "MAX_TOKENS()", +"f47cd133": "AMBASSADOR_FOUR()", +"f47ce310": "getRoomCurrentSet(uint256)", +"f47efbca": "getMemberLinks(address)", +"f47f5921": "exerciseOption(address[3],uint256[3])", +"f4807a4d": "downTickTest(address,uint256)", +"f4812eb9": "tokenIdToPrice(uint256)", +"f4814444": "_withdrawBalance()", +"f481d2d0": "BaseFareCalculator()", +"f4833360": "getTeamInfoByID(uint256)", +"f48339e4": "MintingEnded()", +"f4835aea": "postHardRate()", +"f4838452": "loseWager(address,uint256,uint256,bool,uint256)", +"f484e827": "slashSmallUsername(bytes)", +"f48513ed": "setFundOnContract(bool)", +"f4869726": "buyWithSignedAddress(uint128,uint8,bytes32,bytes32)", +"f487404f": "oldOwner()", +"f487c403": "DataStore(string)", +"f487e4b6": "SendERC20ToAsset(address)", +"f4880b22": "transferStatus()", +"f489faf9": "addAddressToBonuslist(address)", +"f48a3f2b": "PlazaToken(uint256,string,string)", +"f48aa044": "upgradeEthCost(uint256)", +"f48b4391": "SBToken(address,address)", +"f48be22b": "initialiseAllocations()", +"f48c157d": "createGame(string,bytes32[])", +"f48c2afa": "PVCCrowdsale(uint256,address,address)", +"f48c3054": "proxyPayment(address)", +"f48c4633": "disableRefunds()", +"f48d11af": "removeFromVIPList(address[])", +"f48d1c5e": "totalDisposed()", +"f48d371c": "create(uint256,uint256,int256,address,address)", +"f48d60ca": "hasOwner(uint256)", +"f48e20f2": "getCreateFeeWindowUniverseValue()", +"f48e5f27": "infoWithdraw1()", +"f48e9c33": "ETPotatoPresale(address,uint256,uint256)", +"f48edf0c": "partner(address,address)", +"f48f378d": "KuyyomToken()", +"f48f3ced": "HFCoin(string,string)", +"f4903ca0": "newContract(string,address[],string,bytes32,uint256)", +"f4914919": "incrementContinuityNumber(uint32)", +"f4915f5f": "BHM()", +"f4916f05": "VoteSvp002(address,uint256,uint256)", +"f49259b7": "UpgradeableToken(address)", +"f49296ae": "WasHere()", +"f4929cc5": "initPair(address)", +"f492a72f": "signUp(address[],uint256[],string)", +"f493c848": "transferMultiply(address[],uint256[])", +"f49501f3": "soldOnCurrentSale()", +"f4954387": "setHalt(bool)", +"f49627be": "Technology4G()", +"f4970e71": "approveWithdrawal(address,uint256)", +"f49727bd": "getSkillEvaluation(address,uint256,uint256,uint256,address)", +"f497463a": "setVariables(uint256,uint256,uint256,uint256)", +"f49808ea": "addEthForPayment()", +"f4993bbd": "executeEmergencyWithdrawal()", +"f499a349": "NewPrefixPrice(uint256,uint256)", +"f49a5504": "permittedInvestors(address)", +"f49a616c": "updateFeePayoutAddress(address,address)", +"f49a66fd": "_pushLandId(uint256,uint256)", +"f49b728e": "setAllResourceERC20Addresses(address)", +"f49b8e10": "BelezaNetwork()", +"f49bb5a8": "numberPlateExist(address,string)", +"f49bbb23": "getUserClientsCount(address)", +"f49bff7b": "getBounty()", +"f49d1d19": "viewSellOffersAtExchangeMacroansy(address,bool)", +"f49dec70": "buyPepeAffiliated(uint256,address)", +"f49e8135": "calculateTokenBuySimple(uint256)", +"f49eee20": "priceFactorB()", +"f49f0974": "proxyList()", +"f49fc563": "SULTANS()", +"f4a011be": "transferWithReserving(address,uint256)", +"f4a05f8f": "_transferAsset(uint256,address,bool)", +"f4a1585b": "setNextCycle()", +"f4a222e9": "icoRaisedETH()", +"f4a32ef8": "bonusTokensSold()", +"f4a43448": "getEstateSize(uint256)", +"f4a475cb": "t_ImmlaTokenDepository()", +"f4a4b8c7": "OfferUnHold(uint256,bytes,bool,address)", +"f4a67395": "showAddresses()", +"f4a6ef99": "logBytes(bytes32)", +"f4a81d08": "getKudosGiven(address)", +"f4a8619a": "prep(address,uint8)", +"f4a8a699": "_mint_with_uri(address,uint256,string)", +"f4a8cbc0": "tokensToWei(uint256,uint256)", +"f4a92020": "rawApprove(address,bytes32)", +"f4a972de": "softEthTransfer(address,uint256)", +"f4a9c919": "startThinking()", +"f4a9df62": "annul(address)", +"f4aa1291": "withdrawFundsAdvanced(address,uint256,uint256)", +"f4aa956c": "preIcoIsRunning()", +"f4aac034": "charityFraction()", +"f4ab2928": "isContractPaused()", +"f4ab2b19": "releaseAllOldBalanceOf(address[])", +"f4ab4d1d": "_getPetAura(uint256)", +"f4ab9adf": "addVoter(address)", +"f4ac6560": "batchVipWtihLock(address[],uint256[],bool)", +"f4acc2ed": "setContractAdmin(address,bool)", +"f4accda5": "order(uint256,uint256,address)", +"f4ace1a5": "processContribution(address,uint256)", +"f4ad2212": "EthereumEmerald()", +"f4ad8e37": "listings(uint64)", +"f4ae0d2f": "getTechBonus1(uint256)", +"f4ae2164": "EDToken()", +"f4ae67a1": "setTargetDiscountValue9(uint256)", +"f4af9146": "setDefaultTranche(bytes32[])", +"f4afbdca": "assets_explorer_controller()", +"f4b0ce03": "NewIssue(address,uint256,bytes)", +"f4b103d4": "SimpleStorage(uint256)", +"f4b186a7": "setProfitOwner(address)", +"f4b272db": "licenseAttributes(uint256)", +"f4b28747": "CaptainToken()", +"f4b2dfea": "Matching_Finneys()", +"f4b2f5b6": "maxTokenSupplyICO1()", +"f4b43268": "phrase()", +"f4b432b8": "validUser(string)", +"f4b489e7": "upgraded(address)", +"f4b4d77e": "cutOf(uint256)", +"f4b5cbc4": "setCrowdSale(address)", +"f4b74ae9": "updateBestInvestor(address,uint256)", +"f4b79379": "generalRate()", +"f4b86c48": "isMarketplace()", +"f4b95676": "IsReady()", +"f4b96570": "greet_omar(uint256)", +"f4b97c4c": "insertNode(bytes32,bytes32,bytes32)", +"f4b9fa75": "dai()", +"f4ba89f9": "escrow_fee_numerator()", +"f4bbd5d4": "getDealByNumber(uint256)", +"f4bbfd6a": "scheduleCall(bytes,bytes)", +"f4bd0bcf": "isConditionMet()", +"f4bd0eb2": "getSplit(uint256,uint256,uint256,uint256)", +"f4bd65a7": "_updatePhaseTimes()", +"f4bd9429": "unassignOwner(address,address)", +"f4bead6e": "percentageToToteLiquidatorWallet()", +"f4bebac2": "winner_bids()", +"f4bffad6": "bonusForMainICO()", +"f4c06c8e": "removeConfirm(bytes)", +"f4c140b2": "setArtistFees(uint256)", +"f4c28ea3": "lowerLimitForToday()", +"f4c2ebdd": "createLandAndAuction(address,uint256,address,uint256,uint256)", +"f4c38aa1": "initLending(address,uint256,uint256)", +"f4c3b4d7": "transferable(uint256)", +"f4c3f3f7": "fetchAllDataForCustomer(address)", +"f4c52644": "requestRefundDonator()", +"f4c5ab7c": "validateCallGas(uint256,uint256)", +"f4c679db": "Gidnist(address)", +"f4c6f423": "requestWarranty(string,address,uint256,uint256)", +"f4c7f92c": "newRubesUntilPayout()", +"f4c84d19": "update(string,string)", +"f4c91807": "calculateCurrentPrice_(address[7],uint256[7],uint8,uint8,uint8,bytes,bytes,bytes)", +"f4c97199": "updateNextGamePotSplit(uint256)", +"f4c99177": "setBlocksPerPayPeriod(uint256)", +"f4c9b1fd": "campaignState()", +"f4caee88": "isParticipating(address)", +"f4cb09cf": "setAmbassadors(address,bool)", +"f4cb290b": "editMemeInfo(uint256,string,string,string,string)", +"f4cb4ae3": "tokenCreationMaxPrivateSale()", +"f4ccbc4f": "getWithdrawals(address,address)", +"f4ce66e0": "extractUint(bytes,uint256,uint256)", +"f4ce7c1c": "purchaseWithEther(uint256)", +"f4ce7d4a": "ChannelContractAddressChanged(address,address)", +"f4cebdc2": "HeroCore()", +"f4cee3b5": "jasontestToken()", +"f4d0b2a5": "RefundInvestorsBallot(address)", +"f4d0b67f": "SetTime(uint256)", +"f4d176e1": "mapMaster()", +"f4d21515": "submitQuery(uint256)", +"f4d218f9": "lastBlockClaimed()", +"f4d22b02": "transferMoreETH(address,uint256)", +"f4d24fea": "setItem(uint8,uint8,uint256)", +"f4d26fec": "upgradable()", +"f4d28ab0": "Update_START_PREICO_TIMESTAMP(uint256)", +"f4d2cac3": "setBonusSale(uint256)", +"f4d3e94f": "weiRaisedInPresale()", +"f4d44b72": "getBoardsCount()", +"f4d48c0d": "channelParticipant(uint64,uint64)", +"f4d56a51": "isIdValid(bytes16)", +"f4d5d6ce": "seriesBSupply()", +"f4d64745": "HgcToken()", +"f4d76b60": "postValidatePurchase(address,uint256)", +"f4d7b725": "GasPrice()", +"f4d87f8a": "WW3Token()", +"f4d92886": "test_shutDownVersion()", +"f4d94699": "EndowmentRetriever()", +"f4d957a5": "test_validProxyFundTransfer()", +"f4da6a54": "AUTHORSIGHASH()", +"f4da834c": "cancelAuctionToBuy(uint256)", +"f4daa98c": "BitcoinFuture()", +"f4dadc61": "locks(uint256)", +"f4dae266": "total_wei_given()", +"f4dafe71": "update_hash(bytes32)", +"f4db9ad1": "bountyOnlineTokens()", +"f4dba182": "take(uint256,uint256[])", +"f4dbeb9d": "getCredRanksByContents(address,uint256[])", +"f4dc2d21": "Deed(uint256)", +"f4dd0fe9": "ico1Max()", +"f4ddca3c": "shortenBonusPreIco(uint256)", +"f4ddff1c": "_teamID()", +"f4de8dfe": "generateUID(uint256,uint256,uint256,uint32)", +"f4def44b": "getStaff(uint256)", +"f4df1fb2": "themedSpinners(uint256)", +"f4df80ee": "subUserTokens(address,uint256)", +"f4e0f412": "exec(address,uint256)", +"f4e1358a": "transfer_enabled()", +"f4e2d68b": "ltcBalance()", +"f4e340ac": "RedFoo()", +"f4e36afd": "findThroneByNameHash(uint256)", +"f4e3be2d": "getSpawnProxy(uint32)", +"f4e42844": "ResetTransferState()", +"f4e50a4d": "getSupportedTokenByIndex(uint256)", +"f4e62c34": "OrigoToken()", +"f4e68486": "weiICOMinimum()", +"f4e6a70d": "addAnimalType(uint128,uint8)", +"f4e6d3f9": "calculateLockedPercentage(uint8)", +"f4e733c3": "lifeTime()", +"f4e75b79": "OwnershipTransferProposed(address,address)", +"f4e76a46": "getBalanace(bytes32,address)", +"f4e83593": "Volunteertimedollartocken()", +"f4e96093": "IntimateShoppe(uint256,uint256,uint256,address,address,address,address,uint256,uint8)", +"f4e9c944": "PRE_ICO_START_TIME()", +"f4ea7263": "Take_share_team_AES()", +"f4ea77f3": "coinPool()", +"f4ea95b9": "validateReleaseVersion(uint32[3])", +"f4eb20da": "SNC()", +"f4eb6889": "description1()", +"f4ebed78": "currentReward(uint64)", +"f4ec186d": "MoonCoin()", +"f4ec593d": "ICOCrowdsale(uint256,uint256,address,address)", +"f4ed0f46": "editionSize()", +"f4ed216c": "removeExchangePartnerTargetAddress(address)", +"f4ed660f": "testIfElse()", +"f4eda76a": "traitIdxToName(uint256)", +"f4eda996": "extractEntry(address[],uint256[])", +"f4edb15b": "narcosByOwner(address)", +"f4ee82ee": "TOKEN_SECOND_DISCOUNT_MULTIPLIER()", +"f4ee9efe": "mintPartOfEmission(address,uint256,uint256)", +"f4eef932": "deptcheckapproval(string)", +"f4efa24c": "getConsensusDetails(address)", +"f4f0b6e5": "investorDate(address)", +"f4f0dafd": "T0XToken()", +"f4f0fc21": "raiseCap(uint256,uint256)", +"f4f22662": "setPersonalBonus(address,uint8)", +"f4f27042": "open(address,address,uint256)", +"f4f3122e": "startSale(uint256,uint256)", +"f4f3b97c": "updateSubjectMatter(uint256,string)", +"f4f3bdc1": "minus(uint256,uint256)", +"f4f3c8a4": "comment()", +"f4f42246": "percentageCut()", +"f4f4d237": "getById(uint256)", +"f4f572ae": "CMO_Signature()", +"f4f59992": "m_analytics()", +"f4f5b30f": "unitTestGetAvailableReward(uint256,uint256)", +"f4f5e1c1": "SHARE_BOUNTY()", +"f4f61563": "setInviteeCount(address,uint256)", +"f4f6d6fe": "weiMinSale()", +"f4f724b3": "getEmployerJobsByStatus(address,address,uint8)", +"f4f7c6c2": "disagreeWithdraw(uint256)", +"f4f864f0": "STARBITToken(address)", +"f4f87730": "create_token(uint256)", +"f4f94a40": "ownerSetRandomGenerateMethod(uint256)", +"f4f96d29": "smartWallet()", +"f4f98ad5": "commit(uint256)", +"f4f996d5": "WandtChain(uint256,string,uint8,string)", +"f4fa6c1d": "blockheight()", +"f4fa8603": "fabricTokenSafe()", +"f4fab748": "end2Timestamp()", +"f4fb6789": "tknfwdToken()", +"f4fb7d4e": "m_nonEtherController()", +"f4fba1bc": "executeProof(bytes32[],uint256)", +"f4fc3570": "disableController(address)", +"f4fc5d13": "RevealBet(string)", +"f4fd326c": "SuperCarbonCoinToken()", +"f4fde3b6": "sendMoneyOwner()", +"f4feccbb": "LogUserUnRegistered(address)", +"f4ff56f4": "ProposalCloned(uint256,uint256,uint256,string,bytes32)", +"f4ff78bf": "changeMaster(address)", +"f4ffa7a9": "getMountTokenIds(uint256,address)", +"f50059b6": "reconcileDividend(address)", +"f500a0a3": "VeritasToken()", +"f5012d4b": "sendOtherTokens(address,uint256)", +"f5015000": "setMaxCharacters(uint16)", +"f5018d1c": "IronHands2()", +"f501af70": "OpenLongevityPresale()", +"f501d8b8": "transferFromICO(address,uint256)", +"f5023de9": "founder2Wallet()", +"f50249fc": "totalSupplyMax()", +"f502cdc0": "distributeNIM(address[],uint256,uint256)", +"f5037b2a": "addressLength(address,address)", +"f503a994": "leaveTeam(uint256,uint256)", +"f5042801": "setAsRefunded(address,uint256,uint256)", +"f504b089": "memberKeys(uint256)", +"f504e0da": "load_level(uint16)", +"f504efa7": "popHatch()", +"f50522ca": "setNote(uint256,bytes32,string,string)", +"f5059560": "makeProject(string,uint256,uint256)", +"f505a299": "getLLV_edit_32()", +"f505a92d": "reserveFor(address,uint256)", +"f505eb6e": "WolkDestroyed(address,uint256)", +"f505f5f7": "quicksort_core(uint256[],uint256,uint256)", +"f506d7e5": "getCompte_31()", +"f506fc54": "acceptValentineRequest(address)", +"f5074f41": "destroyAndSend(address)", +"f5088730": "copy(uint256,uint256,uint256)", +"f509078f": "isForAuction(uint256)", +"f5093ab4": "UpdateState(uint8,uint8)", +"f509b627": "confirm(address,uint224,uint32,address)", +"f509c554": "PIPSCHAIN()", +"f50a2644": "canCompleteContribution(address)", +"f50aac53": "register(address,string,uint8,string)", +"f50ab247": "StopGame()", +"f50ab7b0": "updateCoupleImageIPFShash(bytes)", +"f50acfa0": "transferToParent(address,address,uint256,uint256,bytes)", +"f50b486d": "getTokenIdsIndex(uint256)", +"f50b5308": "PRICE_MULTIPLIER_ICO1()", +"f50b769e": "lastEditionOf(uint256)", +"f50bab3f": "distributeCRTM(address[],uint256,uint256)", +"f50ca46a": "hasICOFinished()", +"f50d3914": "resetFoundationtList()", +"f50e3ac8": "_getAllInterest()", +"f50ebd21": "OHGLuangPrabang()", +"f50ecf0b": "basicIncomeLimit()", +"f50f1ba9": "_getRevisionTimestamp(bytes32,uint256)", +"f50fc02e": "flipsLost()", +"f510371a": "deleteOperation(bytes32)", +"f510c329": "EmitTransactionDetails(address,uint256,uint256,uint256,string,string,string)", +"f510c32b": "setRateWaiForCentPerToken(uint256)", +"f510ccd3": "CancelAuction()", +"f51119db": "checkAuditor()", +"f5112373": "testFloatArray()", +"f5112f87": "welcomeBonus()", +"f512106a": "testStringKeyValue()", +"f5122232": "LogAccess(address,bytes32,address,bytes4,bool)", +"f513a671": "soldItems()", +"f5143b1c": "HNContract()", +"f514e92c": "TARGET_DURATION_BETTING_BLOCK()", +"f514f0f9": "STAGE_THREE_TIME_END()", +"f5156fba": "CECToken(uint256,string,string)", +"f5166eea": "reservedTokensLockedPeriod()", +"f516e9ec": "ethDeltaDepositAddress()", +"f5173120": "TOKEN_FIFTH_PRICE_RATE()", +"f518e66d": "_addStakeholder(address)", +"f5194ae2": "MainToken()", +"f5195b62": "c_dateTo()", +"f5196002": "getBOPCount()", +"f519618f": "addMultipleTier2Members(address[])", +"f51b793a": "get_appuration(uint8)", +"f51c2907": "affiliatThreshold2()", +"f51c755b": "testConcatMemory33Bytes()", +"f51cbc72": "Level()", +"f51d0c6f": "_awardForRecommender(bool,uint256,uint256)", +"f51d1399": "reduceBalance(address,address,uint256)", +"f51d401f": "getStageStartTime(int256)", +"f51d4cb1": "getCurrentVUPRate()", +"f51d61ff": "Thanatos()", +"f51d7d5f": "getTitle(address)", +"f51dcaa7": "AVGONE()", +"f51e181a": "scale()", +"f51f4738": "setCompleted(bool)", +"f51f5e78": "addPlayer(bytes32,bytes32,bytes6)", +"f51f96dd": "salePrice()", +"f51fb6a1": "leftInTier()", +"f5207c31": "businessPlannedPeriodDuration()", +"f5218ec2": "increaseRepAvailableForExtraBondPayouts(uint256)", +"f522ec0e": "_refundTokens(address)", +"f52343f4": "flipExecutionSwitchTo(bool)", +"f5235a46": "withdrawFoundersTeamAndAdvisors()", +"f5238546": "stopInvest()", +"f5238660": "totalMarketingFundMinted()", +"f524613f": "freeze(address,uint256,uint8)", +"f5251269": "ETHDividends()", +"f5254af8": "startPriceForHLPMT()", +"f5258aee": "ContractAdded(address,uint256)", +"f525cb68": "poolCount()", +"f525dcf1": "setLockFund(address,uint256)", +"f52706c9": "setMinResalePercentage(uint256)", +"f527c856": "TOKENS_PER_KETHER()", +"f527dd6c": "_emitSkillSet(uint256,uint256,uint256,bytes32)", +"f5292748": "_stakeContent(address,bytes32,uint256,uint256,bytes8,uint256,uint256)", +"f5298aca": "burn(address,uint256,uint256)", +"f529d448": "changeBalance(address,uint256)", +"f52a41f3": "mintOWL(address,uint256)", +"f52ad690": "badgeUnFreeze()", +"f52ae24b": "transmute(address,uint256)", +"f52b8d1f": "tokenReserved1Deposit()", +"f52bbc2d": "withdraw(address,address,uint256,uint256,address)", +"f52bd7cb": "addSwap(bytes5,bytes5,bytes32,bytes32,bytes12,bytes32,bytes32,bytes12)", +"f52c456f": "_createClown(uint256,uint256,uint256,uint256,address)", +"f52f2526": "exerciseOption(uint256)", +"f52f77b2": "createEntity(address,address)", +"f52fa89b": "evolveGeneration(uint16)", +"f52ff1da": "SDT(address)", +"f530259e": "isBlacklistDestroyer(address)", +"f5308c7d": "removeTransferLock()", +"f5318389": "setEmbassyCtrl(address)", +"f531aff2": "THINK_TANK_FUND_TOKENS()", +"f531cc63": "LogCreateEVN(address,uint256)", +"f531dbbf": "TOKEN_SWAP_DURATION_HOURS()", +"f5323da4": "phase_5_bonus()", +"f532e888": "getBookForUser(uint256)", +"f5336737": "BFTcoin()", +"f5341b4e": "UserTipped(address,bytes32,uint256,bytes32,bool)", +"f5343752": "exchangeEnabled()", +"f534b022": "burnleftToken()", +"f534d187": "girlBasicToken()", +"f5357102": "tohash(address,address,uint256)", +"f536c61a": "deleteAllChildren()", +"f5370884": "WithdrawalVotedEvent(uint256,address,uint256,uint256)", +"f5376e49": "TestingToken(uint256)", +"f53773dc": "withdrawBattleValue(uint256)", +"f5383f3a": "getFoundationStatus(address)", +"f5385345": "acceptOwnershipOffer()", +"f5397b5d": "initiate(bytes32,address,address,bytes32,uint256,uint256)", +"f53995ff": "setIncludeAuctions(bool)", +"f53a93f8": "MyFinalizableCrowdsale(address)", +"f53b0b3a": "_regularDonationsTotal()", +"f53b396b": "SimpleTokenCoin()", +"f53b8ded": "mintPreSaleTokens(address[],uint256[],uint256[])", +"f53bc835": "setMaxBuy(uint256)", +"f53bde25": "RATE_PRIVATE()", +"f53c5c87": "setTileContract(uint16,uint16,uint8,address)", +"f53d0a8e": "administrator()", +"f53d9d58": "AddLiquidity(uint256)", +"f53da97e": "currentSalePhase()", +"f53f43d9": "setcapname(string)", +"f53fb0cb": "isCollectionAllowedAt(bytes8,bytes8,uint256)", +"f53fbaf6": "send_ETH_from_contract(address)", +"f53fd201": "_modifyPixelColor(uint24,uint32,address)", +"f54011f5": "blockExternalTransfer()", +"f54095a7": "standart()", +"f5414023": "claimReward(bytes32)", +"f5419108": "view46()", +"f541c812": "releaseReward(address,uint256)", +"f543d3c6": "Stockfinex(uint256,string,uint8,string)", +"f544cf4f": "decayedPriceOfCard(uint256)", +"f545118b": "subdividendsOf(address)", +"f54575d6": "addAdvisor(address,uint256)", +"f54580cc": "card_blue_minamount()", +"f5459d6b": "INVESTOR1()", +"f5462105": "isFundedMax()", +"f546232d": "ComputeMyEggs(address)", +"f5465992": "totalTokenBalance(address)", +"f5470d7b": "itemType()", +"f5486860": "nextPrizeTime()", +"f548a578": "removeBurnupGame(address)", +"f549dd0e": "Vitamin()", +"f54a2ddc": "setRefundable(address,uint256)", +"f54b384d": "withdrawBuildingTokens(address)", +"f54cc2d0": "mintTokensForServices()", +"f54d28ae": "OPSPoolAddress()", +"f54d41db": "updateInventories(uint256,uint256[],uint16)", +"f54da8ee": "addWasteType(string)", +"f54dbf4c": "Emission(address,uint256)", +"f54dd191": "Flag()", +"f54dd974": "setResourceERC20Address(uint16,address)", +"f54e3977": "BTML()", +"f54e7a40": "offlineTransaction(address,uint256)", +"f550cb45": "rank(address,uint256)", +"f551924c": "testpidgeon()", +"f5519e8d": "WanChainToken()", +"f55206a5": "validatePurchase(address)", +"f5521bf1": "loanDuration()", +"f5529d3f": "ESIT()", +"f552b2ba": "threads(uint256)", +"f552d91b": "tokenToTokenTransferInput(uint256,uint256,uint256,uint256,address,address)", +"f5537ede": "transferToken(address,address,uint256)", +"f5539407": "getInvestorInforAddr(uint16)", +"f554567f": "getTeller(address)", +"f554e8cc": "officialHold()", +"f554e934": "TOKEN_COMPANY_OWNED()", +"f55523e7": "fiat_contract()", +"f5552b42": "wotDay(uint256)", +"f5556d78": "Vegas()", +"f555b815": "rate2()", +"f5562753": "getClaimAmountForBlock(uint256)", +"f5582870": "CENTS()", +"f559417c": "finalizebackup()", +"f559468c": "initiallyLockedAmount(address)", +"f5596659": "HoloWhitelist()", +"f5597e21": "addProperty(string,string,uint64,uint64,uint64)", +"f55ab987": "penalizeInactiveJuror(address,uint256,uint256[])", +"f55b23c0": "externalLeave()", +"f55b39a3": "PetCore()", +"f55b8fc9": "setraisedAmount(uint256)", +"f55bddcc": "NFTAuctionBase()", +"f55befee": "TOURNAMENT_TOKENS_PERCENT()", +"f55c9f60": "developerReserve()", +"f55ecf06": "setExchangeRate(uint256,uint256)", +"f55f41f9": "Version(string,address,address,address,address,address)", +"f560783d": "getLastProfit()", +"f560aa57": "setTokenPrices(uint256[],uint256[])", +"f560d415": "privateSalePrice()", +"f5610668": "currNumOfCards()", +"f56142b3": "burnPrivate(uint256,uint256,uint256)", +"f561e2f9": "refundTransactionFee(uint256)", +"f5620ed6": "addItemTo(address,uint256,uint256,uint256,string)", +"f562db76": "wct1()", +"f56311d7": "getMntpMigration(uint256)", +"f5632ab4": "receivedEth()", +"f563424e": "fetchBilateral(address,bytes32)", +"f564ae65": "getRemainingCount(uint32)", +"f564bb8c": "getNodeIdx(string)", +"f564dca9": "setUrls(string,string)", +"f564ea7e": "get_bank_data(address)", +"f5653a79": "_presentValue(uint256)", +"f56585de": "transferOtherTokens(address)", +"f56589d5": "PupToken()", +"f56613e4": "lockBetInfo()", +"f5663819": "minContributionETH()", +"f566c1b5": "_normalizeDecimals(uint256,uint256)", +"f5672f92": "garbageCollect()", +"f567a72a": "listMultipleItems(uint256[],uint256[],uint256,address)", +"f568006f": "generateBalanceHash(address,uint8,uint256)", +"f5681f9d": "Deposited(address,address,uint256,uint256)", +"f5685061": "startPreICOnow()", +"f56898fe": "getCompte_40()", +"f5689a80": "TOKEN_CREATED_MIN()", +"f5691b07": "_bidDkl(uint256,uint256)", +"f569626d": "sanTTTCost()", +"f569a2fc": "withdraw1(address)", +"f56a5176": "getMostRecentAuctionStart()", +"f56b8a46": "TEAM_BONUS_PERCENT()", +"f56c66b1": "parseInt128(string)", +"f56d7abe": "PaceCoin()", +"f56e0609": "WorldCup(bytes32,bytes32,bytes32)", +"f56e4cb1": "blockTokens()", +"f56e8421": "currentSquirrelOwner()", +"f56eba15": "SGEToken()", +"f56f516f": "isValid(bytes32[])", +"f5710cc5": "setInitialBalance(uint256)", +"f5716958": "updateSplits(uint256,uint256,uint256,uint256)", +"f571da7f": "confirmAssessor()", +"f5720769": "setDrawer(address)", +"f57213d8": "subsafe(uint256,uint256)", +"f57271cd": "LogEnded(bool)", +"f5727f5c": "chainLedger()", +"f572ae2e": "toggleInPlayJoining()", +"f573864f": "PrandexBountyToken()", +"f5738bcd": "setInstructions(string)", +"f5743c4c": "incrementNonce(address)", +"f574c691": "KCoinToken()", +"f5751524": "unfixTokenPriceInWei()", +"f575c810": "finishPrivateSaleAndStartPreSale(address,uint256,uint256,uint256)", +"f57688b6": "communityVesting4Years()", +"f576f722": "getCurrentTierInfo()", +"f577990d": "passoverEndTime()", +"f577a5d0": "publicTokens()", +"f578fd7c": "applyForToken()", +"f578fd85": "assertEq0(bytes,bytes)", +"f57a1ccc": "f4(uint256,uint256)", +"f57ac2df": "World2()", +"f57ad503": "resetRole(address)", +"f57ad6ea": "deposit_token(uint256)", +"f57ae7b9": "buildId2(address,address,address,uint256,bytes)", +"f57be85d": "ownerActivateToken()", +"f57d74d8": "blaze()", +"f57d76d5": "RestrictedShares(string,string,uint256,uint256)", +"f57db6e1": "signLoan(address)", +"f57e2368": "bonusAvailable()", +"f57e63e2": "eventEnded()", +"f57ee77b": "getRoundId()", +"f57fc26a": "lccxTeamTokensVesting()", +"f5804c35": "test_someTest()", +"f5811447": "createAuction()", +"f5812687": "distributeTokenFunds(address,address,uint256)", +"f5813085": "getTotalTokensByAddress(address)", +"f5818d94": "EtherModifierPandee()", +"f581ec95": "FIRST_VOLUME_EXTRA_BONUS()", +"f581f1ef": "setPicopsCertifier(address)", +"f5820ac6": "unPauseAllTransactions()", +"f5823b0b": "parseOrder(bytes,address,address)", +"f582d293": "buyEnabled()", +"f582fe70": "PundiXToken()", +"f58339c1": "_generateGuardianSale(uint256,uint256,uint256,uint256,uint256)", +"f5836761": "DGBLY()", +"f58431fd": "Citizen(address)", +"f584bf09": "Softcap()", +"f58589ff": "setAirdrop(uint256,uint256,uint256,uint256,uint256)", +"f58590e9": "ReturnChametz(address,uint256,uint256)", +"f5866066": "setStringValue(bytes32,string)", +"f5868e49": "Administrable(address)", +"f586c6d9": "getPoolAddress()", +"f586df65": "checkMembership(bytes32,bytes32,uint64,bytes)", +"f5877bdb": "maintaining()", +"f5878d40": "maxSCount()", +"f587c53f": "_generateGene(uint64,uint64,uint256,uint256)", +"f58951d1": "approve_reject_deleteCertificate(uint256)", +"f589cbbe": "addPick(uint256)", +"f58a1adb": "setup(uint256,uint256,uint256,address,uint256,uint256,bytes,address,address)", +"f58a535f": "phasePublicSale2_From()", +"f58adfe5": "CharityReservesSupply()", +"f58b4554": "userPayout()", +"f58bb0c9": "dealInitialCards()", +"f58c251c": "sentinel()", +"f58d3321": "usersCanUnFreeze(bool)", +"f58e2327": "foundationTokenHolder()", +"f58edbca": "ISBParentsCoin()", +"f58fc2f2": "LimorToken()", +"f58fef8e": "Destroy()", +"f590aacc": "preBuy()", +"f5923a6e": "withdrawEth(address,address,uint256)", +"f5933f66": "changeFlagArraySize(uint256)", +"f5938baf": "getRemainingBlocks()", +"f593efec": "briqcoin()", +"f594ba7b": "assignManagement(address)", +"f594f13f": "votedFor(address)", +"f595f1cc": "pendingFees(address,uint256)", +"f5963aa5": "isJson(string)", +"f5965d55": "windowOf(uint256)", +"f5967a2f": "holdPeriod()", +"f596d10a": "parseSignature(bytes)", +"f597a499": "UserDatabase(uint256)", +"f597d097": "streamerContractMaxAmount()", +"f597f97d": "fractionalBits(int256)", +"f59823cf": "Congress(uint256,uint256,int256)", +"f598e201": "finishDividend()", +"f5991a05": "sellCoins()", +"f59ae82c": "getTokenPurchase(address)", +"f59da238": "MBDCToken(uint256,string,string,uint8)", +"f59db647": "precommitmentAdjusted()", +"f59dfdfb": "feed(uint256)", +"f59e0894": "sendSecond(address,uint256)", +"f59e38b7": "balanceOfToken(address,address)", +"f59e754c": "setAuctionFee(uint256)", +"f59ed863": "privateSaleDate()", +"f59f5e65": "createWheelBetHash(uint256,uint256,uint256)", +"f59f99ee": "createNextGeneration()", +"f59faf9e": "GrainToken()", +"f5a0ea6c": "createMatch(uint256,uint256)", +"f5a1c96d": "nextFeesPerMillion()", +"f5a1f5b4": "setNewOwner(address)", +"f5a23083": "listMOT()", +"f5a23af0": "myColorIs()", +"f5a2d3c7": "DomainSale(address)", +"f5a30cee": "individualMaxCap()", +"f5a332f6": "endICO(uint256)", +"f5a486f3": "issueResolved(bytes32,string)", +"f5a5438e": "dist_airdrop(address,uint256)", +"f5a647aa": "sendTokensToSevenAddresses(address,address,address,address,address,address,address,uint256)", +"f5a79767": "getAmount(address)", +"f5a7ffeb": "dontPanic()", +"f5a8ea09": "viewClaimedThisPool()", +"f5a908f0": "getOraclePrice(string)", +"f5a91ef7": "getEmailAddressOwner(string)", +"f5a956d8": "swap(uint256[],uint256,uint256)", +"f5a98558": "restrictionRemoved()", +"f5a9e21f": "canUpdateCompanyPreferences(string,address)", +"f5aa0200": "makeClaim()", +"f5aa19b7": "reclaimUnclaimed()", +"f5aab219": "currentIcoRate()", +"f5ab16cc": "rewardTokens(address)", +"f5ab4c62": "participationEndTimestamp()", +"f5ab69c8": "thirdPlacePot()", +"f5ab865a": "tokensAirdrop()", +"f5ac0b6b": "BasketFactory(address,address,uint256)", +"f5ac481d": "leaveTeam(uint256,address,uint256,uint256)", +"f5ac6319": "_raised()", +"f5ac9db6": "tradeable()", +"f5ad9034": "TokenTranchePricing(uint256[])", +"f5adad57": "BdpControllerHelper(bytes8)", +"f5aec88c": "getUserTokenBalance(address)", +"f5af374b": "withdrawEth(address,uint256[],uint256[])", +"f5af4035": "sellTokensForEth(address,uint256)", +"f5af6289": "EAI_TokenERC20(uint256,string,string)", +"f5af6621": "getEscapeRequest(uint32)", +"f5af6de6": "firstStageEnd()", +"f5affc60": "claimHash(bytes32)", +"f5b01fd7": "TruCrowdSale(uint256,uint256,address,address,uint256,uint256)", +"f5b0f72d": "Ethername()", +"f5b12540": "STATE_NOT_STARTED()", +"f5b33d0a": "MicroDex()", +"f5b3beba": "OverAllPerSell()", +"f5b41aaa": "set_iconiq_token_amount(address,uint256)", +"f5b45714": "currentKing()", +"f5b490d5": "roundLockAmount()", +"f5b4f3c1": "WFC(string,string,uint8,uint256)", +"f5b53e17": "getInt256()", +"f5b53fc1": "checkMonsterAttack(uint16,uint8,uint8)", +"f5b56c56": "highestBindingBid()", +"f5b57a8d": "transferFeeDenum()", +"f5b5af16": "closePlayerGame(bytes32)", +"f5b5bfb9": "provideDividend(uint256)", +"f5b61230": "escapeHatchDestination()", +"f5b85ad8": "RoundToken()", +"f5b944eb": "ROLE_MANAGER()", +"f5b9644c": "PRE_ICO_RATE()", +"f5babff2": "convertBytesToBytes32(bytes)", +"f5bade66": "setDeposit(uint256)", +"f5bae6b6": "equal(int256,int256,string)", +"f5bb02b2": "ICODepositContract()", +"f5bb5aac": "TokenStore(uint256,address)", +"f5bbc6d5": "isArbiter(address)", +"f5bd48c4": "totalLotsByAddress(address)", +"f5bd4931": "transferFlower(address,uint256)", +"f5bd8f5f": "_isTrue(address)", +"f5bdeca1": "SetGasLimit(uint256)", +"f5be3193": "totalIssued()", +"f5bea782": "userWithdrawPendingTransactions()", +"f5bee4e6": "priceTokenToCoin()", +"f5bf6d63": "totalIssuerSupply()", +"f5bf7413": "close(address,address,uint256)", +"f5bf7e3d": "registerDINs(address,uint256)", +"f5c15237": "isPlatformManager(address)", +"f5c217da": "lastSaleTimestamp()", +"f5c233f1": "transferAndLock(address,uint256,uint256,uint256)", +"f5c256ca": "sendPrepaidERC20Tweet(uint256,string,string,uint256)", +"f5c3f206": "setApprovers(string,string,address[])", +"f5c4201f": "denyTransfer(address)", +"f5c454ca": "ProjectDescriptionUpdated(address,string,bytes32)", +"f5c476f9": "totalLockedTokens()", +"f5c4ceda": "SimpleConstructorArray(uint256[3],uint256[3])", +"f5c57382": "nameOf(address)", +"f5c5906e": "setBlockRoot(uint256,uint256,bytes32)", +"f5c5ad83": "decrementCounter()", +"f5c60309": "YuChainToken()", +"f5c6ca08": "sendTokens(uint256)", +"f5c6cd0a": "GlobexSciICO()", +"f5c6cf05": "changeTokenForSale(uint256)", +"f5c758c4": "getKycApproved(uint256)", +"f5c86d2a": "ledgerTransfer(address,address,uint256)", +"f5c87d20": "setAdminPayout(uint8)", +"f5c89f83": "StartMiningByIdArray(uint256[])", +"f5c8d71b": "forceMove(address,address,uint256)", +"f5c901db": "ck()", +"f5c91f5a": "init(address,uint256,uint256,uint256,uint256,uint256)", +"f5c972ac": "setUserInfo(address,uint256,uint256)", +"f5c98aff": "GreeterB(bytes)", +"f5c99ae9": "createToken(string,string,uint256,uint256,uint256,uint256)", +"f5c9d5f1": "refundPart(address)", +"f5ca6cd4": "TOKEN_SALE_ALLOCATION()", +"f5caccad": "gatherCollateral()", +"f5cb0daa": "queryWaitingTimeBuffer()", +"f5cb3dff": "getAddressFromData(bytes)", +"f5cb911d": "divideByNumber(uint256)", +"f5cbf6cc": "construtor(uint256)", +"f5cc4056": "BSMinting()", +"f5cce54d": "preSaleCoinCap()", +"f5ce0d5b": "onRemoval(string,uint256)", +"f5cf673b": "setClaimer(address,address)", +"f5d00ccf": "NewPatent(bytes32)", +"f5d05f7e": "foundationVestedPayment()", +"f5d09857": "createDungeon(uint256,uint256,uint256,uint256,uint256,address)", +"f5d09ff7": "bancorETHToken()", +"f5d17f10": "get_term_deposit_end_date()", +"f5d1d299": "setProviderTitle(bytes32)", +"f5d241d3": "update(uint80,address,uint32,uint32,uint32,uint256)", +"f5d36a57": "quorumVersion()", +"f5d3c79a": "setReinvest(bool)", +"f5d50f86": "balanceAsSupporter()", +"f5d5edc4": "deployService(bytes32,address)", +"f5d60a51": "accessPolicy()", +"f5d60acd": "EtherTakeAfterSoftcap()", +"f5d67a20": "currentCrowdsale()", +"f5d6fa14": "whichPrice(uint256)", +"f5d72a28": "setTakeRewardsPeriod(uint256)", +"f5d73261": "transferAnyTokens(address,uint256)", +"f5d78625": "getPersonalInfo(address)", +"f5d82b6b": "add(address,uint256)", +"f5d9356e": "newKrakenPriceTicker(string)", +"f5d97789": "changeBinaryAddress(address)", +"f5d9d3fd": "formated_data_url()", +"f5da16e9": "RECHToken()", +"f5da210c": "getClientData(address)", +"f5dabc58": "transferDistributePxl(address,uint256,bool,string)", +"f5db370f": "setSanityRates(address[],uint256[])", +"f5db8bc7": "depositedETH(address)", +"f5db9820": "firstTarget()", +"f5dd7650": "_computeTournamentBeneficiaryFee(uint256)", +"f5ddff92": "getReputationUpdateLogEntry(uint256)", +"f5df1d10": "getCollectibleTypeBalance(address,uint256,uint256)", +"f5df1f1d": "PresalePool(uint256,uint256,uint256,address[])", +"f5df6618": "newUser(string,string,string)", +"f5e1713e": "sale_state()", +"f5e27f5f": "emperor()", +"f5e3394f": "getUnicornGenByte(uint256,uint256,bytes1)", +"f5e33a9d": "createPot(string)", +"f5e3542b": "lookup()", +"f5e37d57": "_doTradeForEth(address,uint256,address,uint256)", +"f5e47f96": "getTicketsByAddress(address)", +"f5e493aa": "getCrowdsaleTierList(address,bytes32)", +"f5e53f2b": "register(bytes7)", +"f5e736ed": "tacoPoolTotal()", +"f5e7b8e3": "setScoringThreshold(uint256)", +"f5e7ce99": "canPerform(address,address,bytes4)", +"f5e7ef7a": "getCountCities()", +"f5e82554": "executeFill(address,address[5],uint256[8],uint256,uint8,bytes32,bytes32)", +"f5e8e8a9": "NASRToken()", +"f5e998f7": "FuckCoin()", +"f5ea15d3": "setContracts(address[16])", +"f5ea25f0": "setTokenAcceptanceRate(address,uint256)", +"f5eacece": "create2()", +"f5eb2313": "UrlHint()", +"f5eb42d1": "ExecLog(address,bytes32,uint256,bytes32,bytes32,uint256)", +"f5eb8890": "balanceUser(address)", +"f5ec2eed": "companyName()", +"f5ec8685": "claimAfter45days()", +"f5ece00a": "cryptoChallenge()", +"f5edc92f": "subwooferUSBToken()", +"f5ee3348": "setLive(bool)", +"f5eeaea3": "openChannel(address,uint256,uint8)", +"f5eed98d": "publisherCount()", +"f5ef98ea": "setDeathBlock(uint256)", +"f5efbd2d": "addModule(address,bytes,uint256,uint256)", +"f5f06acc": "airDropTokens()", +"f5f0f1e9": "firstBuyPrice()", +"f5f23b52": "makeTradable(uint8)", +"f5f2669b": "isAddressNotEmpty(address)", +"f5f2b62f": "nextSale()", +"f5f2de34": "ethReceived()", +"f5f3e58f": "preSale1()", +"f5f4123f": "_createAvatar(address,string,uint256)", +"f5f56b7a": "seasonRefAccounts(uint16)", +"f5f5ba72": "getContractName()", +"f5f5bb3b": "hashBid(address,uint256,address,bytes32,bytes32,uint256,uint256)", +"f5f5c622": "setDErc20(bytes32,address)", +"f5f5f123": "changeMaximumContributionForPublicPhase(uint256)", +"f5f6ea26": "EthOne()", +"f5f83a61": "transferManyLandToEstate(int256[],int256[],uint256)", +"f5fb17f2": "offerPieceForSaleByAddress(address,uint256)", +"f5fb1b74": "buyname(string)", +"f5fb22ca": "claimMobsterFunds()", +"f5fb9137": "donate_step()", +"f5fc20c6": "canUse(uint256)", +"f5fc32c8": "getAllot(bytes32,uint8)", +"f5fc3d47": "giftToken(address,address,uint256)", +"f5fc58c4": "totalLosts()", +"f5fd118e": "coordinatorSetAgreeForEmission(uint256)", +"f5fd1936": "countZTKChecks()", +"f5fd2108": "ethToBeDistributedSet()", +"f5fd9343": "Reco()", +"f5fda5da": "test_35_assertGasUsage1400Boards()", +"f5fda8cd": "testPublic()", +"f5ff3dc7": "setOraclizeWinnerTimeOffset(uint8)", +"f5ff5c76": "agent()", +"f5ff8977": "renameArtwork(uint256,string)", +"f60203c6": "createUser(uint256,uint64,uint64)", +"f602467e": "FundWithdrawal(address,uint256,bool)", +"f602c312": "erc20Store()", +"f602e325": "reserveAdress()", +"f6030aeb": "mint(address,uint256,int256)", +"f60381a1": "stra2cbor(string[])", +"f603fa92": "toggleAttachedEnforement(bool)", +"f60436cd": "reduceTime()", +"f604498a": "getClientSupply(address,uint256,uint256)", +"f604620a": "getTicketsAtAdress(address)", +"f604e6a6": "withdrawXNK(address)", +"f6054027": "IFLTSidechain()", +"f605ef93": "LongBought(address[2],uint256[5],uint8,bytes32[3],uint256)", +"f606b648": "transferTokensFromSpecialAddress(address,address,uint256)", +"f60744d5": "verifySignature(bytes32,uint256,uint256,uint8,bytes32,bytes32)", +"f607e88a": "_tokenPurchase()", +"f6089e12": "melt(uint256[],uint256[])", +"f60957c0": "HowLongIsDisputeStillRunning(uint256)", +"f609a1a1": "extraMintArray(address[])", +"f609bad6": "newDaoRulesProposal(uint256,uint256,uint256,uint256,uint256,bool,address,uint256)", +"f609bf42": "getSecondsTimeLocked(bytes4)", +"f60a696d": "migrateUsers(address[10])", +"f60b0714": "EscrowContract(address,address,uint256,uint256)", +"f60b9406": "vestingStartUnixTimestamp()", +"f60ba338": "setOpenTime(uint256)", +"f60bb720": "receiveFees()", +"f60ca60d": "project()", +"f60ca6b6": "distory()", +"f60cdcf6": "totalPlayers()", +"f60daa71": "dutchAuctionToCraft()", +"f60e28f7": "checkUserAndInitIfNecessary(address,address)", +"f60edb0e": "proposedController()", +"f60f1ccb": "useregister(address,string)", +"f60f49bb": "PayToken()", +"f6105254": "CryptoSagaArenaVer1(address,address,address,address,address,address,uint32,uint256,uint32,uint256,bool)", +"f610e52a": "acceptInvite(bytes)", +"f612a62d": "getSaleContractIsFinalised(address)", +"f613f7a0": "mintUsingSignature(uint256,uint8,bytes32,bytes32)", +"f6142990": "altDeposited(address)", +"f614fd72": "assertEq24(bytes24,bytes24)", +"f6150d17": "payedAmount()", +"f6151ff6": "transferTokenTo()", +"f6153ccd": "totalDeposit()", +"f615e369": "selectDeliverer(uint256)", +"f615ed54": "subSeconds(uint256,uint256)", +"f616b7b7": "report(string)", +"f616ce3c": "candy()", +"f616f29f": "transferEthFeeAndRefund(uint256,uint256,uint256,address)", +"f6174b90": "transferCheques(address,address,uint256,uint256)", +"f617642b": "getlevellen(uint256)", +"f617a0e9": "BoSenCoin_Test(uint256,string,uint8,string)", +"f6187006": "crowdSaleIsRunning()", +"f618c39f": "PartiallyForgived(address,address,uint256)", +"f619304a": "getSellOrdersBlackMarket()", +"f61a3e2b": "roundWithdraw(uint256)", +"f61a7f6f": "fixSaleCompleted()", +"f61ac3a4": "checkForReceivedTokens()", +"f61adfdd": "UnitedfansToken(address)", +"f61b7483": "M5Logic()", +"f61b9aed": "transferFrom(address,address,uint256,bool,uint256)", +"f61c266b": "getExpiry()", +"f61c6c4b": "LobsterFarm()", +"f61ca773": "transferWithPurpose(address,uint256,bytes)", +"f61ca87a": "setUserValue(bytes20,uint256,uint256)", +"f61cd7de": "callerTokenAmountAtBlock(uint256)", +"f61d9afc": "Errors()", +"f61eab7a": "getExtension(uint256)", +"f61ed985": "Kill(uint256)", +"f61f019d": "GitBitToken()", +"f61f35dd": "FOG()", +"f61f54c2": "SendEtherToFund(uint256)", +"f61ff377": "AccountFilledWithBonus(address,uint256,int256)", +"f6205042": "storeClaimSeed()", +"f622a105": "createDApp(bytes32,uint32)", +"f622cc82": "declareWinningOutcome(uint8)", +"f6232556": "Security_GetNumberOfAttemptsToConnectBankAccountToANewOwnerAddress()", +"f6233016": "DomenoToken()", +"f623d7a7": "TrustlessTransactions_Log(uint256)", +"f625ca7d": "lengthOf_addressAndDataPattern_to_voteRulesHash(address,address)", +"f625ee28": "startMasterCopyCountdown(address)", +"f625f472": "MultiownedControlled(address[],uint256,address)", +"f6261a0f": "_isValidWithdrawLimits(uint256,uint256,uint256)", +"f62732b8": "index(address,address[])", +"f627fe6c": "returnSomething()", +"f6281a9b": "getTierWhitelist(uint256)", +"f62847f4": "TerrionFund()", +"f6288422": "commission_system()", +"f628e8e8": "startDonations()", +"f62a92fa": "testRevertTx()", +"f62bc2dc": "ICTA()", +"f62cce34": "_clearRecordHierarchy(uint256,bytes32[],bytes32)", +"f62cec27": "setStartPreICO(uint256)", +"f62de0c3": "weiPerUSD()", +"f62e037c": "BETTING_CLOSES()", +"f62eded9": "buyStar(uint256,uint256)", +"f62ee1af": "burnFrom(address,uint32)", +"f62eec09": "rejectLastDeliverable(bytes32)", +"f62f47ab": "UDF_PORTION()", +"f62f9dbb": "tokenRatios(uint256)", +"f63051ff": "FXTOKEN(address,uint256)", +"f630a468": "setAtomIsRent(uint256,uint128)", +"f630e0f5": "submitTransaction(address,uint256,bytes,bytes,bytes,uint256)", +"f6310813": "transferDoc(uint256,address,address)", +"f631345b": "setlargeBonusStopTime(uint256)", +"f6326fb3": "depositETH()", +"f633adc1": "getRegister(int256,string)", +"f6340be4": "updateProvision(address,uint32,uint256,uint256)", +"f634bd29": "sec_addr()", +"f635052f": "colorPrice()", +"f635d160": "setPOOL_edit_20(string)", +"f635f50c": "minedTokenStartTime()", +"f6360d37": "requestDiploma(uint256)", +"f6366b9f": "OwnerTokensAllocated(uint256)", +"f6368f8a": "transfer(address,uint256,bytes,string)", +"f636931e": "PineapplePoints()", +"f6373296": "applySettings(uint256,uint256,uint256,uint256)", +"f637b7da": "collectedWei()", +"f637d950": "getAssetInfo(uint256)", +"f63841e4": "featurePrice()", +"f6384cb8": "sendReferallFundBalance(address,uint256)", +"f63850d0": "GanaTokenPublicSale(address,address,address,uint256,uint256)", +"f639365d": "testSetGet()", +"f63a43c0": "TokensPurchased(address,uint16,uint256,uint256,uint256,uint256,uint256)", +"f63a5d22": "divideDecimalRoundPrecise(uint256,uint256)", +"f63b1f7c": "GoldenLightCoin(uint256,string,uint8,string)", +"f63c2659": "PriceCalculator(uint256)", +"f63c533c": "Cost()", +"f63c5532": "incrementStat(uint256,uint256)", +"f63cb8a3": "requireTokenFuel(address[])", +"f63da25b": "Emailer()", +"f63df2e9": "createStandardToken(address,uint256)", +"f63ef744": "sendCharityETH(bytes)", +"f63f0e62": "turnOffCanUpdateNextGameInitalMinBetSize()", +"f640b81e": "test_oneInvalidEqBytes32Message()", +"f640d508": "transferToken(address,uint256,address)", +"f6413e46": "getFaucetAmountValue()", +"f6418b0b": "buyLandForEth()", +"f641d753": "changeElementName(uint256,string)", +"f6420e15": "tc()", +"f6432b8c": "publishLawyersInAttendance(string)", +"f6436a7c": "BONUS_ICO_PERIOD_TWO()", +"f643cf3d": "NEToken(address,uint256,uint256,uint256)", +"f64402c4": "setVicepresidenteDeMesa(bytes32)", +"f6444bcc": "isDeploying()", +"f6446614": "withDrawToPoolOwner(uint256)", +"f6448391": "getAllERC20(uint256)", +"f644c926": "SarmayehaaToken()", +"f6454620": "add_certifications(string,string)", +"f645496e": "giveawayFee()", +"f645835b": "beneficiaryAddresses(address)", +"f6458c6a": "toZ1(uint256[3],uint256)", +"f6460964": "teamKeepingPerEpoch()", +"f64623f1": "getBalanceB(bytes)", +"f646286b": "getPlayerShipOwnerById(uint64)", +"f6469342": "_setPackedBlockNumber(bytes32,uint256)", +"f64820f9": "addAttendant(string)", +"f6486cad": "burnReserveFees(address)", +"f6487e4e": "rejectCampaign(address,string)", +"f648f20b": "agencyWallet()", +"f64ab21a": "getOnMintAmountValue(int256)", +"f64b5c16": "distDay()", +"f64bfaba": "getBuyers()", +"f64c08b1": "onThrone()", +"f64ccca6": "payToken(address,address,uint256,uint256)", +"f64cd26b": "gcmp(uint256,uint256)", +"f64e167e": "getTextCount()", +"f64efacb": "icoHardCapInWei()", +"f64fca2e": "getNodeId(bytes)", +"f64fe563": "asyncSend(address,uint256,uint256)", +"f64ffde4": "getAccountPendingValue(address)", +"f6503662": "safeApprove(address,uint256,uint256)", +"f65045df": "totalClosedBID()", +"f6508be6": "tokensPerWei(uint256)", +"f651bf44": "move_to(uint16)", +"f652076b": "_getTokensAmount(uint256,uint256)", +"f652badb": "bitSSAToken()", +"f653279c": "TOKENS_FOUNDERS()", +"f653d286": "toggleTokenSaleOnHold()", +"f6560449": "evaluateProposalMetricEnd(uint256)", +"f65625ae": "changeWinnerPrizeMoneyForRaz(uint256,uint256)", +"f6577774": "BonusCrowdsaleImpl(uint256,uint256,uint256,address)", +"f6585116": "bytesFunc(bytes)", +"f658b1d5": "calculateContribution(uint256)", +"f659a45f": "airdropTokens(address,uint256)", +"f65bed0d": "initNewGame(uint8[16])", +"f65bffc3": "checkDividend(address)", +"f65c4d42": "Participate(uint256)", +"f65d1488": "setMarketingProfitAddress(address)", +"f65d226f": "getTotalBetAmount(bytes32,bytes32)", +"f65d6d4f": "MAX_MINT_NUMBER()", +"f65e2761": "RandomNumberGuessed(uint256,address)", +"f65e8d4d": "potMembers()", +"f65f5eeb": "choose(bytes32,bool)", +"f6618bab": "getBuyRequestsLength()", +"f661b886": "testCanTransfer()", +"f661e767": "villainIndexToApproved(uint256)", +"f6621121": "setSlammerTime(address)", +"f6623552": "getWalletBonuses(address)", +"f6626856": "LTT()", +"f662a12a": "oraclize_randomDS_proofVerify__returnCode(bytes32,string,bytes)", +"f662b881": "commitmentOf(address)", +"f662f291": "getInit(address,address)", +"f66302a2": "releaseMe(uint256)", +"f6631c64": "PPBC_Ether_Claim()", +"f6644c5a": "STARTING_FAIRY()", +"f6648d4c": "publishMixerType(bytes32)", +"f66597c2": "listTrophy(uint256,uint256,uint256,uint256)", +"f665a541": "coinsAdded(address)", +"f6660246": "fundOrderInternal(address,uint256)", +"f666323e": "UUIDProvider()", +"f669052a": "maxTokensToMint()", +"f66a79a0": "secondaryWallet()", +"f66afcac": "isTheAO(address,address,address)", +"f66b48da": "getHorseData(uint256)", +"f66bf229": "minBuyAmount()", +"f66c3af1": "getAddTokenApproveSignatures()", +"f66c6691": "shortTimeLock()", +"f66c75e5": "refund(bytes20,address)", +"f66cce0e": "adjustKPIs(uint256,uint256)", +"f66d0076": "getNumberOfCE()", +"f66d1f65": "releaseToEarlyInvestors(address,uint256)", +"f66d278e": "AgriChainDescriptionInt()", +"f66d685a": "lockInsolventTransfers()", +"f66e86bb": "withdrawGasPayback()", +"f66f0bd9": "MingYuanToken(uint256,string,uint8,string)", +"f66f2449": "THANKSTEST4()", +"f66f640e": "pregnantZodiacs()", +"f66f83f6": "latestSeriesForUser()", +"f67028be": "trade(uint256,uint256,bool,bool)", +"f67187ac": "lookup(string)", +"f671cae4": "setIcoThirdWeekRate(uint256)", +"f671f5b3": "deleteEntireGlofile()", +"f6724a55": "totalAmountInvested()", +"f6729bf2": "canChangeLocked()", +"f672c1aa": "totalBountyCount()", +"f672e4d8": "changeAdminUser(address)", +"f6731d62": "intCallWithArray(int256,uint8[4])", +"f673745a": "edoPerWei_()", +"f674cfe5": "VOLUME_60()", +"f674d799": "removeManyFromWhitelist(address[])", +"f67501f7": "changePet(uint256,uint256,uint256,uint256)", +"f6757cff": "getEmployeeInfo(uint256)", +"f6761151": "Withdraw(address)", +"f676d539": "get_dati_lotto(bytes)", +"f6774660": "calculateNumDIDToIssue(uint256,uint256)", +"f677cf0d": "isDistributed()", +"f678142a": "ethLandSaleOpen()", +"f6783518": "KYCToken()", +"f678462f": "termsAndConditions()", +"f6785de7": "newPayOutPercentageIsSet(uint256)", +"f678cf02": "setRelation(uint8,address)", +"f6791858": "tgeStartTime()", +"f679791d": "playerRoll(uint256,uint256,address)", +"f67a1d37": "BlockChainChallenge()", +"f67a7782": "periodOne()", +"f67a81ea": "Bigba()", +"f67abd87": "entryDetails(uint256)", +"f67b3047": "setItemActive(address,address,string,bool)", +"f67d5a8d": "sendDividendsWithRefBonus(address,uint256,uint256)", +"f67e3d0d": "howManyShips()", +"f67e8db2": "getEthToTokenOrderList()", +"f67f83a8": "updateFileds(uint256,uint256)", +"f67ff0af": "_llTransferFrom(address,address,address,uint256)", +"f68009b9": "getRoundBetAmount(uint256,uint256,uint256)", +"f68016b7": "gasLimit()", +"f68036f0": "FaucetManager()", +"f6805019": "addMeeting(string,uint256,uint256,uint256,uint256,uint256)", +"f6806074": "withdrawBonds(uint256)", +"f680b106": "RateEth()", +"f6814165": "castToInt(uint256)", +"f681f6e7": "capitalRaised()", +"f68297f3": "emergy_withdraw(address)", +"f6832c4a": "DO()", +"f683b247": "openSecret(bytes32,bytes32,string)", +"f68445dd": "myContract2()", +"f685e618": "_crownUnFreeze(uint256)", +"f685f942": "ZNCoin()", +"f685f9ad": "Moac()", +"f6860955": "emitAborted()", +"f686640b": "getCrabsOfOwner(address)", +"f686f019": "getCompte_9()", +"f686fa10": "verifyBBODocument(bytes,bytes)", +"f6879623": "addBountyReward(uint256)", +"f688bb2b": "setAirDrop(uint256,uint256,uint256,uint256)", +"f68975a9": "Total_Savers()", +"f68abb25": "approveToFight(uint256,uint256)", +"f68c021b": "EtherXeum()", +"f68c5b6a": "equalBytes32ToBytes(bytes32,bytes)", +"f68ce40b": "turtlemasterReq()", +"f68da9a0": "AthenaLabsICO(uint256,uint256[7],uint256,address,address[3])", +"f68dcd2b": "MHTHolders(uint256)", +"f68e63e3": "PRICE_MUL()", +"f68f1a0c": "recoverETH_SendbyMistake()", +"f68f8e42": "dataSourceGetGroupResult(uint256)", +"f6903c9c": "processEndOfYear(uint256)", +"f691b30b": "lockReleaseDate6Month()", +"f691e362": "EtherDOGEICO()", +"f692715c": "getGameResult(uint64)", +"f6928070": "numberOfGames()", +"f6933c7d": "isICOActive()", +"f693de1d": "signUpForTournament(uint32[])", +"f694211c": "Composed(uint256,address,uint256[5],uint256[5],string,string)", +"f6946940": "jack_pot()", +"f694b761": "createPool(string,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"f694c4be": "NSEToken()", +"f6950d5f": "LIFEWORLD()", +"f6951038": "testCreateWithParentsForeign1()", +"f696c4ed": "fightAgon(uint64,uint64,uint256,uint256)", +"f6973532": "setAddOwnerRequest(address)", +"f6978685": "HashnodeTestCoin_new()", +"f697a0ed": "ppb(uint256,uint256)", +"f697ddb2": "firstAddress()", +"f69871e9": "WithConstructorArguments(uint256,bytes32)", +"f6988b79": "getDeveloperReservedLockInfo(uint256)", +"f698bceb": "getMintable()", +"f698da25": "domainSeparator()", +"f698e626": "WrapReadTokenData()", +"f699ad94": "setupFundingInfo(uint256,uint256)", +"f69a3c7b": "termsAndConditionsAreSigned(uint8,bytes32,bytes32)", +"f69a6982": "getVirtualTradesSummed(bytes32,uint256)", +"f69adce6": "dinoToken()", +"f69b9dd8": "safeWithdrawalTokens(uint256)", +"f69ba02c": "toB32(address,uint256)", +"f69bbf16": "setContributions(address,uint256,bool)", +"f69bf03b": "issuePartnerTokens(uint256)", +"f69c3b24": "registerEarlyContrib(address,uint256,bytes32)", +"f69d03c9": "ETCWalletCreated(address)", +"f69d5f0e": "icoPhases(uint256)", +"f69da37e": "toRefer()", +"f69e672e": "modifyContactManual(uint256,address,string)", +"f69e739e": "voteForCandidate(uint256,address,address)", +"f69e8384": "ceoRemoveCoo(address)", +"f69e98d7": "bite(uint256,uint256)", +"f69f1027": "PRESALE_WEI_GOAL()", +"f69f18a6": "timesIsOver(address)", +"f69f190c": "getWorkerStatus(address)", +"f69f64f7": "setInfo(uint256)", +"f69f7cab": "createTokenVault(uint32)", +"f69f8a5c": "approvedBuyerForIndex(uint256)", +"f6a01234": "TokenStorage(uint256,address)", +"f6a03ebf": "setStart(uint256)", +"f6a08ced": "OracleBitfinex()", +"f6a0be88": "NCRCoin()", +"f6a0e8a4": "DTCC_ILOW_7()", +"f6a10249": "TransferedEth(address,uint256)", +"f6a12b48": "MatchmakerPrevails(address,address,uint256,uint256,uint256)", +"f6a14bf7": "getNumberOfTokensForTheTeam()", +"f6a176ae": "fpMul(uint256,uint256)", +"f6a25127": "test_set_label()", +"f6a29b81": "EntropyTxDetails(address,string,uint256)", +"f6a30e3e": "minTicket()", +"f6a31715": "Revocation(address,uint256)", +"f6a31b9c": "transferManagerContract()", +"f6a33253": "changeRatio(uint256)", +"f6a3b1dd": "totalHardcap()", +"f6a3d24e": "exists(address)", +"f6a3e8c8": "lockInfo(address,uint64)", +"f6a46c2e": "settleBaseDeliveries()", +"f6a47e9a": "MongoliaNationalToken()", +"f6a5546a": "testBilibirdaToken()", +"f6a56bcf": "TianLianCoin(uint256,uint256)", +"f6a58558": "withdrawRemainingRtc()", +"f6a5b13e": "m_beneficiary()", +"f6a5fa30": "subShares(uint256)", +"f6a60d89": "resumeCrowdsale()", +"f6a74ed7": "removeController(address)", +"f6a84013": "totalMEATonsSupply()", +"f6a8aea7": "financialStrategy()", +"f6a92de9": "mycontracts(uint32,address)", +"f6a94ecb": "notifyOfArbitrationRequest(bytes32,address,uint256)", +"f6ab4243": "buyCastle(uint256,uint256,uint256)", +"f6ac54dd": "checkRegPeriod(bytes32)", +"f6ac6684": "getStringZero(uint256,uint256)", +"f6ad660b": "f3(uint256,uint256)", +"f6ada1ad": "rewardDaysLeft()", +"f6adab61": "delayOfICO1()", +"f6af18f5": "montly_pay()", +"f6af2718": "Quantastic()", +"f6afad47": "getDatabase(uint256)", +"f6afe805": "PRE_SALE_GMRP_TOKEN_CAP()", +"f6b09195": "preicoTokensPerEth()", +"f6b098f8": "nextAttackTimestamp()", +"f6b10854": "safeWithdrawAll()", +"f6b12f28": "gameOwner()", +"f6b15fe6": "getProfit(uint256,uint256)", +"f6b19c74": "drain(uint256)", +"f6b2b334": "upgradeTo(address,uint256)", +"f6b2c3b6": "VendTitle(uint256)", +"f6b39b3c": "ContractTotalMined()", +"f6b3e080": "roundOneRate()", +"f6b44d03": "validFactories()", +"f6b4c691": "getPendingCratesForUser(address)", +"f6b4dfb4": "contractAddress()", +"f6b5460f": "withdrawTrackOf(string)", +"f6b55a93": "hotWalletAddress()", +"f6b63224": "_getHpbNodesInterface()", +"f6b69697": "importPreviousWinners(uint256[],address[],uint256[])", +"f6b6daf1": "supportedTokens(uint256,uint256)", +"f6b70702": "LightComplexAirdrop()", +"f6b781a1": "Bolton()", +"f6b87500": "internalCalc(int256,int256)", +"f6b911bc": "burn(address,address,uint256)", +"f6b91944": "walletLists()", +"f6b924f8": "EventAuction(address,uint32,uint256,uint256,uint256,uint256)", +"f6b94cb4": "negotiate(uint32)", +"f6b9571a": "remove_owner(address)", +"f6b97131": "redemptionCount(address)", +"f6b9d05d": "bountyAllocation()", +"f6b9fd79": "STARTING_VINES()", +"f6ba13a5": "lastBlockNumberInRound()", +"f6ba3b6c": "addThing(string,string,bytes32,string)", +"f6bb3cc4": "deleteString(bytes32)", +"f6bd5893": "getGas(uint256)", +"f6be4776": "CannabizToken()", +"f6be71d1": "setDuration(uint256)", +"f6bea5dd": "LOCKEDiN()", +"f6bed059": "mixer()", +"f6bf0edd": "removecantonEmployee(address)", +"f6bf44b6": "getPoolStakeCount(uint256)", +"f6bffff8": "_createTombWithData(address,string)", +"f6c05625": "isValidNumber(uint8)", +"f6c0736b": "register_token(address,string)", +"f6c0d6a3": "_getChainLength(uint256)", +"f6c1acdf": "proofFor(string)", +"f6c1db4c": "GetChequeInfoByHash(uint256)", +"f6c28241": "BuyForFriend(address,address,uint256,uint256,uint256)", +"f6c3f6cd": "readUserPurchaseAtIndex(address,uint256)", +"f6c42713": "changeExpiredLimit(uint256)", +"f6c50d8b": "_ownersTokens()", +"f6c536a0": "sendBonusMany(address[],uint256[])", +"f6c5c80d": "cleanUp()", +"f6c6b731": "activeFirstRound()", +"f6c7430e": "JAPACHELOR()", +"f6c8f62e": "TransferBack(address,uint256,uint256)", +"f6c976d2": "test_1_assertGasUsage50Boards()", +"f6c98dd7": "WikiToken()", +"f6c99dad": "SETUP()", +"f6c9e930": "approveSender(address,address,bool,uint256,uint256)", +"f6ca75d8": "AkonCoin()", +"f6cabaa0": "burnedToDate()", +"f6cb86db": "whitelistTransferPrimordialTokenFrom(address,address,uint256)", +"f6cbcab0": "mintParts(int256,uint16,address)", +"f6cbea50": "ErrorReturningEth(address,uint256)", +"f6cc7d60": "setUnitDefenseIncreases(address,address,uint256,uint256,bool)", +"f6cdf281": "returnPtSafeMedium()", +"f6ceecc4": "TokenAdminContract(address,address[],uint256,uint256)", +"f6cf3a7d": "setDeveloperCut(uint256)", +"f6cf4570": "BoughtBlock(uint256,uint256,uint256,address,bytes32,bytes32,bytes32,bytes32)", +"f6cf5411": "startTimePreIco()", +"f6d024c6": "test_add(uint256,uint256)", +"f6d0bf2f": "GetContractBalance()", +"f6d2eb65": "_validateQualityConsensus(bytes32,bytes32)", +"f6d2ff9d": "setFreelancer(address,address,bool,string,uint256,uint8,uint256[],uint256[],string)", +"f6d339e4": "setAddress(bytes32,string,address)", +"f6d361cc": "ENTRY_FEE()", +"f6d3aebc": "get_salary()", +"f6d3d52d": "RatesChanged(address,uint32,uint32)", +"f6d3df65": "ownerStartsCrowdsale(uint256)", +"f6d4a265": "addLacks(uint16[],int64[],uint16[],int256,int64[],int256,int64[],uint8[])", +"f6d51638": "getRocIdToTokenId(uint256)", +"f6d5959b": "getActionStatus(uint256)", +"f6d68fca": "balanceWinPoolForThirdStage()", +"f6d6d5aa": "claimableToken()", +"f6d72acd": "setVoter(uint256,address,uint256)", +"f6d860d1": "approveUserKYCAndSetReferrer(address,address)", +"f6d89563": "airdropTotalCurrent()", +"f6d956df": "buy(uint8,uint256,uint256)", +"f6da1c0a": "getPriceSMPTokensPerWei()", +"f6dab356": "getGPSEndTime()", +"f6db2bac": "LOG_BetLost(address,uint256)", +"f6db6e50": "ponziToWei(uint256,uint256)", +"f6dbc252": "MOREToken()", +"f6dcb32c": "sendRewardTokens()", +"f6dd0187": "getSubject(uint256)", +"f6ddac74": "updateLocation(string,string)", +"f6ddcee5": "_generate_seed(uint256)", +"f6de4b81": "_doVote(address,uint256,uint256)", +"f6df0d50": "setFrozenAccountICO(bool)", +"f6df26d2": "kickOutCommunity(address,uint256)", +"f6dfafe1": "getShareHolder(uint256)", +"f6dfcff7": "getCooldownEndTime(uint40)", +"f6dfdad1": "getContractInformation()", +"f6e158b9": "getPickedAssetsAndFinalSeed(bytes32[],uint256[],uint256,uint256)", +"f6e212ea": "addCrystal(address,uint256)", +"f6e4641f": "purchaseFor(address)", +"f6e4a3dd": "tradeBalances(address,uint256,address,uint256,address,address,uint256)", +"f6e5c6a4": "totalWeiDonated()", +"f6e5e112": "startingEtherValue()", +"f6e5e298": "setScientificData(uint256,string)", +"f6e66c17": "totalAwards()", +"f6e681a9": "IkuraApproval(address,address,uint256)", +"f6e72981": "mintManyTo(address,string,uint256[],uint256[])", +"f6e7b785": "tdeStarted()", +"f6e7f69d": "test_insert_findWithHintPrevRemoved(int256)", +"f6e87f81": "SkillChainToken()", +"f6e898b0": "getIcedAddresses()", +"f6e9b85c": "doSetCanCreateGrants(address,bool)", +"f6ea1a3f": "CryptoSpin(address)", +"f6ea6252": "MINER_END_PRICE()", +"f6eb1337": "TokenBought(address,uint256,uint256,uint256,uint256)", +"f6eb13b3": "VietnamToken(uint256,string,uint8,string)", +"f6eb58de": "TransferManagerRevoked(address)", +"f6ebe41a": "defaultURIStart()", +"f6ec91d5": "developerAccount()", +"f6ecb9ee": "getprizemoney(address)", +"f6ecd724": "init(address,uint256,bytes32,uint256,uint256,uint256,uint256,bool,bool,address)", +"f6ecebf2": "LeagueAdministrator()", +"f6ed4b71": "getBasketDetails(address)", +"f6ed5342": "updateEscrow(uint64,uint256)", +"f6ed860e": "cancelGoldSellOrder()", +"f6ed8fe7": "grantsUnlock()", +"f6ee2d8d": "developersTokensWallet()", +"f6ee439f": "registerAssetComment(int256,string,string,uint256)", +"f6ee87b8": "_0xEtherToken()", +"f6ee8c59": "FirstBonus()", +"f6eeb89c": "addBid(string,string,uint256,address)", +"f6eeff1e": "punkNoLongerForSale(uint256)", +"f6ef97ff": "transferEthToWallet(uint256)", +"f6efcb7a": "setKeyData(bytes32,bytes32,bytes32)", +"f6f0fa8d": "teamReleased()", +"f6f10a26": "topUpWithEtherAndTokensForHolders(address,uint256)", +"f6f15ec9": "Larbaoui()", +"f6f17bba": "distributePreSoldShares()", +"f6f1995d": "onlyOwnerSetBountyWallet(address)", +"f6f3144d": "GetEthBalance(address)", +"f6f32cc4": "CICToken(string,string)", +"f6f36028": "Score()", +"f6f36641": "setV_R5(uint256)", +"f6f3973f": "fundIco()", +"f6f494c9": "getTermsContract(bytes32)", +"f6f505c4": "RaffleResult(uint256,uint256,address,uint256,uint256,uint256,uint256,uint256,uint256,address,address,bytes32)", +"f6f54833": "HighEndTreasureChain()", +"f6f55ada": "TokenDistributed(address,uint256)", +"f6f5eb59": "transferableStartTime()", +"f6f5f567": "SMPAcquired(address,uint256,uint256)", +"f6f65f1a": "ASTRN_TOKEN()", +"f6f6edd4": "issuerDecimals()", +"f6f6fc74": "holderTeamTokens()", +"f6f7301e": "getById(int128)", +"f6f82ecb": "massChangeRegistrationStatusForSilverWhiteList(address[],bool)", +"f6f844e4": "setOp(bytes32)", +"f6f8ca07": "burnPXL(address,uint256)", +"f6f91737": "MAX_FREE_REFERRAL_PACKS()", +"f6f94a85": "ScaleFactor()", +"f6f94b47": "MiningPayout(address,uint256,uint256)", +"f6f96d91": "rateOfEther()", +"f6f98e34": "calcReleaseToken(address,uint256,uint256)", +"f6fb2c72": "buyGuardian(uint256,uint256,uint256)", +"f6fb4c9a": "_createFilm(string,address,uint256)", +"f6fb6ecf": "buildHouse()", +"f6fbc06a": "getWeiInvested(address,address)", +"f6fc8160": "addSeed(uint256)", +"f6fc96ad": "mainsale()", +"f6fcbee1": "getArrayUint(bytes32)", +"f6fcc14e": "agTechWallet()", +"f6fe3a01": "getUint256Min(int256)", +"f6fee732": "getAccountNote(address)", +"f7008156": "_haveEveryoneDeposited()", +"f700abf1": "addBudget(uint256,uint256)", +"f700ead9": "withdrawTokenMulti(address[],uint256[])", +"f702dd8a": "hkchain(uint256,string,string)", +"f703601e": "safe_add(uint256,uint256)", +"f703e773": "changeLifeExpectancy(uint256)", +"f7044bae": "getShareHolderCount()", +"f7048161": "checkRefundSignature(uint8,bytes,address)", +"f704b57a": "Bitconnect()", +"f704cb98": "addInvitation(address,address,uint256,address,string)", +"f70532fe": "getContractsOf(address,uint256)", +"f705fb87": "preICOend()", +"f7066121": "lastJackpotRound()", +"f706b476": "set_pauseUET(bool)", +"f706b814": "PARSEC_CREDIT_DECIMALS()", +"f7073490": "buyLink()", +"f7074919": "seenHereA()", +"f70794ea": "acceptHelp(uint256)", +"f707a308": "tierTwoMin()", +"f7086dd1": "SmigesToken()", +"f70904b4": "sale1Accepting()", +"f7095d9d": "updateTentativeWinningChildUniverse(bytes32)", +"f709dd51": "getTrademark()", +"f70ad595": "team_release_epoch()", +"f70b0a07": "setTrustedLateCloser(address,bool)", +"f70b13c5": "vestedTokens(uint64)", +"f70bbb9a": "getProposalExternalToken(bytes32,address)", +"f70bbdaf": "create(string,string,uint32,int256,string,address)", +"f70bdba7": "AdidasCoin()", +"f70c92de": "GOSHUIN()", +"f70ccc6e": "MaptPricing()", +"f70d7629": "_verifyOwnershipOfTokens(uint256,address,uint256)", +"f70dbb77": "isPresalePeriod()", +"f70dd1fe": "isAllocated6()", +"f70eabff": "addTeamAndAdvisorsAllocation(address,uint256)", +"f70f1821": "weeksFromEnd()", +"f70fa221": "getInitializeCashValue()", +"f71143ca": "isSaleLive()", +"f712d7ff": "testFailControllerTransferFromWithoutApproval()", +"f712f3e8": "implementsERC165Interface(address,bytes4)", +"f7138eaf": "createArtworkAuction(string,string,uint32)", +"f71441a5": "maxGoal()", +"f7146269": "testGetRandomDragon(uint256)", +"f7149220": "RNG()", +"f714a96e": "myCompany()", +"f714bf3d": "overflowOwner()", +"f714de9c": "MultiAccess()", +"f7160766": "getCompte_13()", +"f716171c": "createTrade(uint16,address,address,uint256,uint16,uint32)", +"f7164029": "upgradePrefixPreSignedFirst(uint8,bytes)", +"f716b7bf": "initInvesters()", +"f716c400": "getCrowdsaleUniqueBuyers()", +"f716fe43": "s37(bytes1)", +"f717442a": "previousPriceOf(uint256)", +"f717c310": "freezeTransfersSince(uint256,string)", +"f71868da": "Ethereumcapital()", +"f719254d": "cancelEthToTokenOrder(uint32)", +"f719e111": "useOraclize()", +"f719edfb": "firstPublish()", +"f71ad40e": "icoCapInWei()", +"f71b041c": "refundUser(bytes32,uint8,uint256,uint256)", +"f71b382c": "PIEXTREAM()", +"f71be837": "sign(address)", +"f71c60bd": "AMBASSADOR_FIVE()", +"f71cc3a5": "setUserStatus(address,uint256)", +"f71db383": "setArbitrationContractAddress(address)", +"f71dcb10": "CreatedMTP(address,uint256)", +"f71f7a25": "set(bytes32,bytes32)", +"f71f9c38": "SupplyChanged(uint256)", +"f72047ff": "_enableRefunds(address)", +"f72084b2": "foundationShare()", +"f720a453": "senderStake()", +"f720d563": "endAttack(address,bool,uint256,uint256,uint256,uint256,uint256,uint256[])", +"f720ef08": "setTokenAiNetworkToken(address)", +"f720f3d2": "tokensToEther(uint256,uint256)", +"f720f80b": "isMaster(address)", +"f7213db6": "orderFills(bytes32)", +"f72457af": "CertifierDb()", +"f7253071": "lastBlock_f0()", +"f725839f": "multiGenerate(address,address[],bytes)", +"f7260d3e": "receiver()", +"f7265042": "getUsersShipsIds()", +"f726af40": "MilestoneAmountRaised()", +"f726f715": "distributeFunds(uint256)", +"f727550e": "determineOutcome(uint256)", +"f72755fe": "getRequest(int256)", +"f72758e7": "getBracketDataMiddleTeamIds(uint8)", +"f72860ca": "modifyCustomer(string,string)", +"f7286888": "getPhaseNumber()", +"f72918ef": "addVoterVote(address)", +"f729688e": "_hasFlags(uint256,uint256)", +"f729b216": "moreTokenPerEtherForSeedRound()", +"f729cf0d": "getJob(bytes32)", +"f72a244d": "handleAllowance(string,uint256)", +"f72ae72c": "remainingTokenForSale()", +"f72b7ab9": "SbloccaConto(address)", +"f72c436f": "isHuman(address)", +"f72c75a5": "delegateVestingContractOwner(address)", +"f72d2c22": "BONUS_HI()", +"f72d3b15": "LamboPresale(uint256,uint256,uint256,address)", +"f72d50a9": "getPOOL_edit_4()", +"f72d53ba": "getNumMatches()", +"f72db5a3": "getLLV_edit_8()", +"f72e460a": "getBUUU(bytes32,uint256,uint256)", +"f72e695b": "setPoolCut(uint256)", +"f72f30e1": "Vesting(address)", +"f72f34db": "getDCountedBasicBallotsN(bytes32)", +"f72f6826": "ChangeEnd(uint256)", +"f72fc599": "_isThereAnOnGoingTapProposal()", +"f73052e8": "totalSoldCount()", +"f73079a6": "Auto(address,string)", +"f73089b9": "sale2Stopped()", +"f7309f29": "testLedgerUnderPayback()", +"f731c3bd": "lotteries(uint32)", +"f731d33c": "ApzCoin()", +"f7326286": "getARInvIndexTable()", +"f73294b8": "isValidatorAlreadyVoted(address,address)", +"f732eb66": "getPayoutDenominator()", +"f7342cd3": "SGF()", +"f7362152": "testThrow_testableContributionCaseExpectFailure()", +"f73770e7": "is_contract_paused()", +"f737f274": "getBuyDemand(uint256)", +"f73857cc": "deauthorizeAddress(address)", +"f738e5ca": "ownerTakeProfit()", +"f739a501": "snapShot(uint256,address)", +"f739ba2f": "picops_withdraw_excess()", +"f739c261": "legendary()", +"f739ed4c": "id_for_user_version(uint256,uint256)", +"f73a590c": "distributed_team()", +"f73b5541": "bulkWhitelist(address[])", +"f73baf62": "proxy_initialization()", +"f73c30e3": "getESOP()", +"f73c8dfd": "pvpQueueSize()", +"f73cc97c": "AddDOT(bytes)", +"f73d05db": "getSha()", +"f73d594c": "ERC20Base()", +"f73e05dd": "RetrieveCommissions()", +"f73f4ebc": "processBuyRequest(string,address,uint256,uint256,bool)", +"f74034df": "purchaseGen0Token(uint256)", +"f7407178": "get_banlance(address)", +"f740fbc9": "test_validPerc()", +"f74100e3": "getBits(bytes)", +"f741b602": "denyInvestor(address)", +"f742048b": "NlvToken(uint256,string,string)", +"f7426b62": "unlock(bytes32,bytes,uint256[],bytes,bytes,bytes,uint256[],bytes,bytes)", +"f74279b0": "totalEarning()", +"f7434ea9": "arbitrationCost(bytes)", +"f7437384": "NucleusVisionAllocation()", +"f743d334": "BancorBuy()", +"f744538d": "submitClearingPrice(address,bytes32,uint256)", +"f7448a31": "transferERC20(address,uint256)", +"f745630f": "update(uint256,string)", +"f746e28d": "fundSchool(uint256)", +"f746f365": "icoSoldCap()", +"f746fcdb": "presaleMade(string,uint256)", +"f74715cb": "ApproveERC20(address)", +"f7474d00": "payEther()", +"f74758ef": "safeSendCard(uint256,address)", +"f7477435": "TokensWorldCoin()", +"f747a5eb": "auctionBid(bytes32)", +"f747b744": "investFromWallet(uint256)", +"f749013e": "dateStartContract()", +"f7493c6a": "UpdatePremiumLimit(uint256,uint256)", +"f749bdc1": "BUYER_CHECK_STEP(bytes32)", +"f749d980": "LastExecuted()", +"f74a4e63": "transferToMint(uint256)", +"f74b766a": "createBet(uint256,uint256,uint256,bool,string)", +"f74c67b3": "getAddressKYCState(address)", +"f74c753f": "dontReturn()", +"f74d73ec": "issueSertificate(address,address)", +"f74deae3": "MultiSigWallet(address,string,uint256,uint256,string)", +"f74e8655": "setWhitelistAgent(address,bool)", +"f74e9bde": "pwr(uint256,uint256)", +"f74f4702": "changeRequiredMajor(uint256,bool,bytes)", +"f74fbb47": "StateChanged(bool)", +"f74fc598": "listSharesForSale(uint256,uint256)", +"f750aaa6": "withdrawEverything(address)", +"f75165c6": "right22(uint256)", +"f751758b": "getCurrentTokenPrice()", +"f751b26a": "unclaimedRoyalty()", +"f751c2f5": "MAC()", +"f751cd8f": "drop()", +"f752644c": "aelfCommunityMultisig()", +"f752fdc3": "wdivide(uint256,uint256)", +"f75316b4": "CobinhoodToken()", +"f754f766": "setBonus(uint8,uint8,uint8,uint8)", +"f7553098": "voteForOutcome(int256,uint256)", +"f755a76e": "createBoard(bytes32)", +"f755a98b": "setCrowdsaleEndBlock(uint256)", +"f75640b3": "crowdsaleCanceled()", +"f7566b49": "getBet(address)", +"f756b574": "getDropAmount()", +"f7572cf3": "newCampaign(address,uint256)", +"f757342c": "setRewardWasSent(address)", +"f758ff59": "SentDeveloperFee(uint256,uint256)", +"f759c480": "balanceOfrun(address)", +"f759e298": "getNumberOfBlocksPerKick()", +"f75a275b": "reservedLPT()", +"f75b8d3c": "getExpiredCratesForUser(address)", +"f75beacf": "HuaTuo()", +"f75ccbf0": "checkErrors(bytes32)", +"f75cf7d5": "IndecoinBounty()", +"f75d34bb": "ICOChanged(address)", +"f75e5d85": "selfDestruct(uint8,bytes32,bytes32)", +"f75eb240": "removeCallSpenderWhitelist(address)", +"f75ec528": "getSpaceInfo(uint256)", +"f75fa5e1": "xorReduce(bytes32[],uint256)", +"f75fb878": "preICOwei()", +"f75fdcaa": "cancelMilestone(uint256)", +"f760d2a2": "_incrementBlockStats(bytes16,uint8)", +"f761720a": "isEquiped(address,uint256)", +"f7618a40": "LIMIT_PROMO()", +"f7620435": "inquire_length(uint256)", +"f7627da2": "startUnlimitedSale(uint256)", +"f7628949": "B2ANDcoin()", +"f762e147": "addAsset(uint256,uint256,bytes)", +"f7637bec": "AccountReaderRemoved(address,address)", +"f764531d": "saleStartAtBlock()", +"f7647f36": "acceptPurchase(uint256,uint256)", +"f764e8a0": "partPos()", +"f764eb93": "LogDepositForDividend(uint256,uint256)", +"f765088f": "UpdateClientAddress(address)", +"f7654176": "split()", +"f76543e9": "hasOpening()", +"f7658e0f": "bonusDecreaseDay()", +"f765b6b1": "getEventInfo(bytes32)", +"f765e6e4": "return_pause()", +"f765ec6f": "lastBlock_a11Hash_uint256()", +"f766658d": "finalizePreIcoDate()", +"f76692a6": "dtTestCitySnapshot(address,uint256)", +"f766cd3e": "minInvestorCap()", +"f766eca7": "EtherDeltaApproveToken(address,uint256)", +"f7670b0c": "updateAuth(address,address,bool)", +"f7678fda": "setNewRegister(string,string,uint256)", +"f767fdcf": "KRYPT()", +"f767fe97": "MarketingAddr()", +"f7682aa5": "CURVE_CUTOFF_DURATION()", +"f7683b37": "ETTCE()", +"f768402a": "addProduct(address,string,string,uint256,string)", +"f768923a": "ignite()", +"f768f0f5": "setTrustValue(uint256,uint256)", +"f769aeb2": "getNextPoliceAssignment()", +"f76a24e6": "isTesting(uint16)", +"f76aae2f": "addVerifiedAddress(address)", +"f76b8c5e": "destinationOf(uint256)", +"f76bd7d1": "disableIssuance()", +"f76bf292": "StormToken(address)", +"f76bf757": "registerPage(bytes8,string,bytes32,string)", +"f76c0f4e": "updateFlipTokenRewardAmount(uint256)", +"f76c1ea5": "setReceiptLiablity(address,address)", +"f76c84eb": "manualChangeMonth(uint256)", +"f76c906b": "mCurrentSnapshotId()", +"f76ce123": "ERC20Template()", +"f76cf4bf": "BiToro()", +"f76d270e": "_setTokenBudget(address,uint256)", +"f76d3569": "auditorDelegate()", +"f76e8d29": "createSplitAgreement(address,address,address)", +"f76e9183": "VitalSkin()", +"f76f8d78": "SYMBOL()", +"f76f950e": "uint2str(uint256)", +"f76ffe7a": "startMintingData()", +"f77014da": "setGVE(uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32)", +"f7701b47": "downloadPriceInWei()", +"f7701ce8": "batchDistribute(address[],uint256)", +"f770a865": "FaradCryptoken()", +"f770c96f": "TDESupply()", +"f771bc6b": "minerSaleCount()", +"f772547b": "addressToSubscriptions(address,uint256)", +"f77267ea": "sendTokensToWorkers(uint8,uint8)", +"f77282ab": "finalizeAuction()", +"f773a3fb": "maxAssignedRequests()", +"f773ab80": "isPVPProvider()", +"f773c770": "TMSYToken(address,address)", +"f77404e5": "totalCommonWithdrawSupply()", +"f7745f88": "BudCoin()", +"f7746e36": "cars(uint256)", +"f7749e32": "rocketTimeUntilMoon(uint256)", +"f7750bd5": "startEthGetToken()", +"f7759c84": "maxTokenSupplyPreICO()", +"f7768580": "EventTransferAction(address,address,uint32,uint8)", +"f7770906": "buy_energy_core(address,uint32,uint32,uint64,uint32,uint64)", +"f778f32b": "addAlgo(uint256)", +"f7791010": "approveWriter(uint256,address)", +"f779a68d": "_deposit(address,address,uint256,bytes)", +"f779abf7": "DaoUpgraded(address)", +"f77a0923": "BitcoinProcessor(address)", +"f77a490d": "setMinPurchaseInWei(uint256)", +"f77aa0ad": "changeRedTeamAddress(address)", +"f77abd74": "getMatchPointsGroups(uint256,uint192)", +"f77b1856": "getAddTokenData()", +"f77b6f61": "getCRhashOfCRTokenId(address,uint256)", +"f77c1dc6": "unknownInvestors(uint256)", +"f77c4791": "controller()", +"f77c4ff9": "_firstRoundFight()", +"f77ca208": "managerIsPaused()", +"f77d62f0": "roundNumber_()", +"f77da6d5": "claimImmediateTokens(address)", +"f77dc854": "setHookableTokenAddress(address)", +"f77dff06": "joinPillarWithEarnings(uint256,uint8,uint256)", +"f77e4d8b": "test_YayIsNotOverSixtyPercent()", +"f77e8b83": "addPlayer(string)", +"f77f29b1": "getFeeWindow()", +"f77f2f2e": "setRewardStatus(address,bool)", +"f7800e69": "fundVault()", +"f780259e": "totalPrayers()", +"f780d867": "add_coin(string,string,address,uint8)", +"f7815fae": "getIntField2()", +"f782b2ea": "_confirm(address)", +"f784cae5": "Fetish()", +"f784dd61": "RealeaseTime()", +"f78525a1": "getFaucetByName(string)", +"f785ef72": "decimals_()", +"f785f03d": "setMigrating(bool)", +"f7860bb1": "addToBounty()", +"f7862ec2": "feeWindowBurn(address,uint256)", +"f7868884": "FOUNDERS_REWARD()", +"f786bb62": "Hiken(uint256,string,uint8,string)", +"f786becd": "MAJOR_VERSION()", +"f786cb82": "updateLemontokensRemainingToDrop()", +"f7870c5b": "Unlock(address,uint256,uint256)", +"f7888aec": "balanceOf(address,address)", +"f7892887": "phase_1_Time()", +"f7899d9e": "_buyCommonTTM(uint256,uint256,address,address)", +"f78a706a": "extraEmission(uint256)", +"f78a7a55": "createBurnRequest(address,uint256,string)", +"f78c6b54": "donations(bytes32,uint256)", +"f78cc9cf": "getTokenNextPrice(uint256)", +"f78d1c6a": "managePID(uint256)", +"f78d5494": "approveNewMintRequest()", +"f78dd0c1": "MovieCoin(uint256,uint256)", +"f78e4210": "test_oneValidEqAddress()", +"f78ed322": "regNameWOwner(string,address,address)", +"f78fa141": "_uintToSPDStr(uint256)", +"f78fadc6": "HXC()", +"f78fe0e9": "stand(uint8[],bytes32,uint8[])", +"f7903871": "RevTokens()", +"f7908f00": "verifyTransaction()", +"f79098f4": "getEditionLimits(uint256)", +"f793595a": "ThreeAT()", +"f7935969": "getRank(address,uint256)", +"f793fb64": "valInt()", +"f794062e": "isListed(address)", +"f79480f8": "lastBlock_f19Hash_uint256()", +"f794e7f2": "addDefenceParts(uint8[])", +"f794eb58": "getBonusRate()", +"f7963e8a": "testNewCounterValueIszero()", +"f7966eef": "changeReputation(address,int32)", +"f7969147": "currentBurned()", +"f796e06f": "calculateAndRegisterBonuses(uint256)", +"f79710fd": "extraTokens(address,address,uint256)", +"f797ac0e": "addSellingItem(uint256,uint256,uint256)", +"f797b617": "buyInvestorPack(uint256)", +"f797f7b6": "ETH_SIGN_TYPED_DATA_ARGHASH()", +"f7981bdd": "indSeed()", +"f7982243": "addRecipient(address,uint256)", +"f7987a03": "applySetMaxFeeWithdrawal()", +"f798abce": "teamLockAddr()", +"f79915ce": "kkTestICO91()", +"f7992d85": "eta()", +"f7996163": "joinSinceOf(uint256)", +"f79a2b84": "setFirstMile(address,address)", +"f79a3c25": "voteForDisable()", +"f79a97fc": "isSpentTxPaymentForMCW(bytes32)", +"f79acad3": "approveInvestorsInBulk(address[])", +"f79b22e0": "betOnATeam(uint256)", +"f79cfaea": "STLToken(string,string,uint8,uint256)", +"f79d0a8b": "callSomeFunctionViaInner1()", +"f79d6687": "removeTokenTime(uint256)", +"f79dcf8d": "earliest_buy_time()", +"f79e2b32": "inListAsOf(address,uint256)", +"f79ea94d": "VoipToken()", +"f79ebd7f": "tokenPriceDenom()", +"f79ed94b": "reserveAddress()", +"f79f528b": "getMinAuctionValue()", +"f79fc70d": "testBaseStoreTokenUsingDeployedContract()", +"f7a01b93": "StateMachine()", +"f7a06a88": "setSellerGuarantee(bool,uint256)", +"f7a0715f": "DoneToken()", +"f7a084c0": "AIRDROP_START_AT()", +"f7a0b2da": "updatePeloExtenstionContract(address)", +"f7a0ee1c": "maxtokens()", +"f7a0fa0a": "getShareDistribution(bytes)", +"f7a268c4": "freezeAccount(address,bool,bool)", +"f7a33598": "round(uint256[4])", +"f7a34573": "setAction(string,uint256)", +"f7a40e99": "moveERC721Tokens(address,address,uint256)", +"f7a4c45c": "calculateSaleReturn(uint256,uint256,uint8,uint256)", +"f7a6a046": "backOrenCoinOwner()", +"f7a7408b": "BuyLevel()", +"f7a7ec12": "fund_color(address,address,uint256,uint256,uint256)", +"f7a80784": "addProduct(string,uint8)", +"f7a8b34d": "planetName(uint256,uint256,uint256)", +"f7a919be": "createRegion(address[16],address,uint256,uint256,uint256,uint256)", +"f7a9a152": "count_users()", +"f7aa4e0e": "MithrilArrows()", +"f7aad9ed": "amendBalances(address[])", +"f7ab6ec6": "getOfferingByProposal(address,uint8)", +"f7abab9e": "tokenTotalSupply()", +"f7ac5611": "pushStatus(string,uint256,uint256,int8)", +"f7ac9c2e": "approvePreSignedHashing(address,address,uint256,uint256,uint256)", +"f7ad51ce": "cardsKeys()", +"f7ad7d8f": "getAllowedAmountByTeam()", +"f7ad906f": "contractTransfer(address,address,uint256)", +"f7adc48f": "test3(uint256)", +"f7ae24ae": "FundWithdrawal(address,uint256)", +"f7ae9421": "checkInvestorBalance(address)", +"f7aeea14": "removeGlobalConstraint(address,int256,address)", +"f7af21c9": "cancelCrowdsale()", +"f7af630b": "GetBindTokensAccountEvent(address,string)", +"f7b09d33": "giveReserveFund(address,uint256)", +"f7b14066": "setup(uint256,uint256,uint256,uint256,uint256,uint8,uint256,uint256,uint256,uint256)", +"f7b188a5": "unPause()", +"f7b22fa2": "getCurrentBeneficiaryCap()", +"f7b28073": "moleculartechnology()", +"f7b2a7be": "rewardAmount()", +"f7b3ae2f": "getSwapData(bytes32)", +"f7b42d08": "set_price_and_sell(uint256,uint256)", +"f7b43abf": "PRESALE_ICO_PORTION()", +"f7b47870": "setPublicOfferingHolder(address)", +"f7b4b087": "purchaseFirstTokens(uint256)", +"f7b4feec": "FaucetsToken()", +"f7b53431": "feesTaken()", +"f7b54065": "getInvestmentCurrentValue(address)", +"f7b578ee": "LiveCoin()", +"f7b6302e": "getInvestorTokensPurchase(address,uint256)", +"f7b75258": "withdrawlsEnabled()", +"f7b77a21": "MasternodeRegistered(address,uint256)", +"f7b822db": "setDEditor(bytes32,address,bool)", +"f7b89a3e": "getTotalCosts()", +"f7b8a600": "payAltCoin(bytes32,uint256,bytes)", +"f7b8eeb7": "getWhale(uint256)", +"f7b92f34": "CandidToken()", +"f7b95d35": "setRNGCallbackGas(uint256)", +"f7ba8896": "random(uint256,uint256,address)", +"f7bada53": "randomChoiceFromticketPool()", +"f7bbd1c1": "setMinAcceptEther(uint256)", +"f7bc2003": "releaseApprove(bytes32,uint8,bytes32,bytes32)", +"f7bc39bf": "owns(address)", +"f7bd2361": "LookAtBalance()", +"f7c0085b": "changeRandomOrgAPIKey(string)", +"f7c00e2f": "presaleWeiRaised()", +"f7c07442": "getReferrals(address[])", +"f7c0f4c6": "calculateRates()", +"f7c0fa4a": "requireCorrectReceipt(uint256)", +"f7c15df9": "_addExtraGasLimit()", +"f7c2b38c": "seconds_left()", +"f7c360e0": "fee_claimer()", +"f7c38052": "createBuyOrder(address,uint256,uint8[],address[5][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[])", +"f7c3b210": "ENCKToken(uint256,string,uint8,string)", +"f7c3ee7a": "immortality()", +"f7c42ac8": "onChainIdentities(address)", +"f7c45aa4": "sld(address,uint256,string)", +"f7c46a73": "totalhospital()", +"f7c58b62": "weiPerEther()", +"f7c5f4b6": "getPreICOBonus()", +"f7c618c1": "rewardToken()", +"f7c68ffb": "isReleasedOnce()", +"f7c824f1": "CombineCard(uint32)", +"f7c8a091": "forPresale()", +"f7c8af48": "destroyItem(uint256)", +"f7c8d634": "tab(bytes32)", +"f7c9a7be": "drawTertiaryCWinners(uint256)", +"f7c9afa2": "onlyOwnerGetAdvWallet()", +"f7c9f1da": "setPonziPriceinWei(uint256)", +"f7c9f74a": "insert_contribution(address,uint256)", +"f7cab847": "getRule(bytes32)", +"f7cb5709": "CoinsLimitUnalterableInteger()", +"f7cb789a": "roundDuration()", +"f7cb8e66": "testIt()", +"f7cbcb8f": "withdrawCrowdsaleOsherCoins()", +"f7cc8c13": "MobSquads2()", +"f7cc8f40": "nbBackerWithMoreOrEqualTen()", +"f7cdf47c": "ETHEREUM()", +"f7ce25bb": "cardAndChecklistIdsForOwner(address)", +"f7ce4479": "setCommunityAddress(address)", +"f7cf0aa1": "updateMinBet(uint256)", +"f7cf9a1c": "Create(address,uint256,address,string)", +"f7cfd902": "removalBlackList(address)", +"f7d08eae": "distributeReserveSupply(uint256,address)", +"f7d0e04b": "setReputation(address)", +"f7d4c7e3": "getBracketDataFinals()", +"f7d518b5": "StartNewGame(string,string,string)", +"f7d5e485": "airdropToken(address[],uint256)", +"f7d6dbe5": "UpgradeProposals()", +"f7d7477b": "sumAmounts(uint256[])", +"f7d8417d": "MYRED(uint256,string,uint8,string)", +"f7d871df": "NucleusVisionAirDropTokensMinted(address,uint256)", +"f7d8c883": "breedWithAuto(uint256,uint256)", +"f7d9078e": "mintToSpecialFund(address)", +"f7d91cd4": "allocateReserveCompanyTokens()", +"f7d97577": "setPrice(uint256,uint256)", +"f7d978a2": "changeEntryFee(uint256)", +"f7d9a5ae": "BtcToken()", +"f7dadf7d": "setBurnFormula(address)", +"f7daef72": "getIndexBatchByUsername(bytes20[])", +"f7db7348": "preapprove(address,uint256,uint256,uint16)", +"f7dba1dc": "nullifyProduct(bytes32)", +"f7dc0455": "transferInitialAllocation(address,uint256)", +"f7dc909b": "createNewEvent(bytes32,string,string,uint256,string,string)", +"f7dd2e28": "BAG_TRANSFER_MINIMUM_AMOUNT_OF_BUYS()", +"f7ddfb4b": "meltingContract()", +"f7decfd1": "blacklistSwitch()", +"f7defe8c": "pickTheWinner()", +"f7df8f87": "vestingFounderAddress()", +"f7e0bc92": "COLOR_CUSTOM()", +"f7e0e743": "removeFirstAdvisorLock(address)", +"f7e23677": "catAttributes(uint256,uint256)", +"f7e23778": "PresaleEnd(uint256)", +"f7e28f8b": "weiRaisedAfterDiscountRounds()", +"f7e2ed66": "mOnTransfer(address,address,uint256)", +"f7e2ff00": "userWithdrawalStartTime()", +"f7e3c068": "PrestigeUp()", +"f7e3f00e": "PUBLIC_SALES_2_RATE()", +"f7e42647": "updateTrustRank(uint256)", +"f7e498f6": "verifyProof(bytes32,bytes,bytes,uint256,bytes32[])", +"f7e4a4a9": "hardCapPreSale()", +"f7e502cb": "HALToken()", +"f7e5951e": "_calcRemainReward()", +"f7e6af80": "_getOwner()", +"f7e74e65": "updateEmployee(uint256,uint256,string)", +"f7e77e44": "releaseMyVestedTokens()", +"f7e78e78": "verifyDeal(bytes32,bytes)", +"f7e7d6d8": "Noscam()", +"f7e80582": "enableAutoReinvest(uint256)", +"f7e83aee": "verify(bytes,bytes)", +"f7e95364": "updateGuMasks(uint256,uint256,uint256)", +"f7e98d15": "YELLOWLAMBO()", +"f7ea7a3d": "setTotalSupply(uint256)", +"f7ead092": "totalWinAmount()", +"f7eaec4f": "removeAgent(address,uint256)", +"f7eb4017": "findAddressByEndpoint(int256,string)", +"f7ebc39a": "isTransferAllowed(address,address,uint256)", +"f7ec221e": "authorizedToDraw()", +"f7ec2f35": "isContract()", +"f7ec7b51": "create_new_deal(uint32,uint256,uint32)", +"f7ecc428": "mintForInvestor(address,uint256)", +"f7ed6031": "getRoundDividendShare()", +"f7ed71d0": "left40(uint256)", +"f7edbbe6": "nextLapId()", +"f7ee503e": "editTicketPrice(uint256)", +"f7efd150": "create(address,address,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"f7efd408": "votesIter(uint256)", +"f7f03516": "EasyHashingCoin()", +"f7f15304": "ARCD_FUND()", +"f7f1962e": "firstAuctionsInitialDuration()", +"f7f20cb3": "getTournaments()", +"f7f2210c": "openBetIndex()", +"f7f2741c": "AFTCoin()", +"f7f32916": "computeTokenWithBonus(uint256)", +"f7f33c54": "CriptaliaRewards()", +"f7f3815c": "setOperation(address)", +"f7f3ad16": "FixBet51()", +"f7f3da3b": "TestContractOne()", +"f7f4b9d4": "saleEnd1()", +"f7f50faa": "chunksAlreadyVested()", +"f7f5886e": "initializeS4FE(address)", +"f7f59411": "purchaseExistent(uint256)", +"f7f59b0f": "LogCustomerVerified(address,address,uint8)", +"f7f6d4da": "GreenEarthEconomyFund()", +"f7f74b56": "closeVoring()", +"f7f7915d": "setNextRoundFee(uint32)", +"f7f8303b": "product1_sell()", +"f7f87361": "DepositProxy(address,address)", +"f7f8aae9": "SudoEnabled(bool)", +"f7f9cb1c": "wrappedContract()", +"f7fad9fc": "UpdateState(uint256)", +"f7fb07b0": "getCurrentRate()", +"f7fb4801": "firstRoundWMEnd()", +"f7fc1bd6": "PROMETHEUS_SHIP_PRICE()", +"f7fc7783": "SanityPricing(address)", +"f7fc8a91": "haveShelf(string)", +"f7fca4f4": "setFeeFormula(address)", +"f7fca8d3": "ratePublicSale()", +"f7fce4da": "raffle_addr()", +"f7fd2e19": "TCoin()", +"f7fd3d01": "releaseCarbonDollar(uint256)", +"f7fe2e32": "newBurnableOpenPayment(address,uint256,uint256,string,string)", +"f7fe3477": "assertEq(bool,bool)", +"f7fe6f39": "fibo()", +"f7feeb31": "amendEntry(uint256,bytes32,bytes32,bytes32,bytes16,bytes1,bytes16,bytes32,bytes32)", +"f7ff50e2": "transaction_count()", +"f7ffaa5b": "ExTokeA()", +"f7ffbd85": "amountRemaining()", +"f7ffc366": "executeRulingB(uint256)", +"f80176ab": "GetEthereum(address,uint256)", +"f8018a79": "prepend(address,address)", +"f801fae9": "_fCancelDist()", +"f802075f": "requiredEndowment()", +"f8024d10": "getMemberAtIndex(uint256)", +"f80334ae": "selfDestruction()", +"f803bef0": "forceUpdateWinners(address[])", +"f803f97e": "transferAUTOtokens5(address[])", +"f8058bdf": "_CROWDSALE_PAUSED()", +"f805b300": "SALE_4WEEK_BONUS()", +"f8065ed6": "setStopMatchBetting()", +"f8083bab": "simulatedWithdrawal(address,address)", +"f8085c58": "updateStakerRanking(address)", +"f80979d6": "isPreSalePeriod(uint256)", +"f809c826": "managerToFunds(address)", +"f80af907": "roundThreeAmount()", +"f80b3564": "returnAddress(bytes32,uint8,bytes32[2])", +"f80b3cfa": "checkBetLowhigh(uint8)", +"f80bb2a7": "activateSubRound(uint256)", +"f80bbedc": "ethToToken(uint256,uint256)", +"f80d6e90": "GPHToken()", +"f80d9e58": "PVE_BATTLE()", +"f80db825": "AffiliateCoinMultiSigWallet()", +"f80dfdc2": "getTmpWriteTimestamp(bytes32)", +"f80e77d2": "updateETHNZD(uint256)", +"f80ea517": "getDealerInfo(string)", +"f80eba7c": "getTrapid(uint256,uint8)", +"f80f44f3": "right97(uint256)", +"f80f4ea8": "mintAdminApproval(address,address,uint256)", +"f80f5d4a": "EightteenToken()", +"f80f5dd5": "addWhitelist(address)", +"f80f96f6": "returnGanaBeforeSale(address)", +"f80fb7ae": "addCET4To(address,uint32,uint32)", +"f81126a7": "periodICOStage3()", +"f8115814": "TOKToken()", +"f8115891": "getSatTokensOwed(address)", +"f8125093": "set_devcon_map()", +"f8129cd2": "send(address,address[],uint256[])", +"f812f423": "advanceEndTime(uint256)", +"f8132b66": "lockCycle()", +"f813f027": "requestedTokens()", +"f813fcfa": "changeFooIntArrayDynamicSize(uint256)", +"f8140a7e": "standardFee()", +"f814530b": "_allocateETH(uint8,bool)", +"f8147d67": "callTest(uint256,address)", +"f81501f8": "smartContractPriceIsSet(uint256)", +"f815a842": "_getETHBalance()", +"f815e6ab": "kdtFundDeposit()", +"f816f0aa": "gameCancelled(uint256)", +"f8185a13": "getBatches(address)", +"f818d723": "transferPower(address)", +"f8193547": "transferAndExecute(address,uint256,string,string)", +"f81a1860": "killOnUnsupportedFork()", +"f81a95db": "setReferrerFee(uint256)", +"f81b1998": "StopTransferGuard(address[])", +"f81bfa3f": "killThisContract()", +"f81d0292": "setParentAddress(address,address)", +"f81d087d": "prepareLottery()", +"f81d29df": "GambangCoin()", +"f81dc03f": "QuizwinToken()", +"f81de228": "getInvestorPacksAvailable()", +"f81dee03": "set_koef(uint256)", +"f81e8775": "resolveAddress(address)", +"f81ed6ae": "updateStart(uint256)", +"f81f8101": "initializedTime()", +"f81f8bf6": "burnReputation(uint256,address,bytes32)", +"f81ff8e7": "CurrentCoinPrice()", +"f8201a32": "requestLoan(uint128,address,address,address,uint256,uint64,bytes)", +"f821a17c": "getVotingNetworkDetails()", +"f821c423": "sendAirdrops(address[],uint256[])", +"f822372e": "Lab51TestToken()", +"f8225a05": "_setTransferFeeAbs(uint256)", +"f8226dbf": "TC(uint256,string,string)", +"f822841e": "PropertySet(address,bytes32,bytes32)", +"f8228f14": "assignSpartansToBattle(uint256)", +"f8229eba": "addAuthByCode(string,string,string)", +"f8241d7e": "updateAddresses(bytes32[],address[])", +"f8242c32": "addChallenge(address)", +"f824384a": "addInvestorAtID(uint256)", +"f8247299": "getIudexScoreAll(address,address)", +"f8256121": "publicResolver()", +"f8264772": "getTokenss()", +"f828500d": "isValidMessageLength(string)", +"f828c3fa": "scheduleCall(address,bytes4,bytes32,uint256)", +"f828edbe": "excludeWallet(address,bool)", +"f829d1a0": "walletSplitPercentage()", +"f82a4707": "secondsBetweenMints()", +"f82a7496": "giveMeCDP(uint256)", +"f82ab2ec": "PRIVATE_SALE_PRICE()", +"f82b2c31": "confirmByC(uint256,string)", +"f82bffa0": "get_merkle_proof(uint256)", +"f82c09a3": "PresentToCEO()", +"f82c2301": "resignFromCommunity()", +"f82c50f1": "log(uint256)", +"f82de7b0": "mineBlocks(uint256)", +"f82e4a4f": "Cointum(address,address,address,uint256,uint256,uint256)", +"f82ec3e6": "Norm()", +"f82edc1b": "unSign(address,address)", +"f82f396f": "sha(string,string)", +"f82f7a4b": "startDepositExit(uint256,address,uint256)", +"f82fb363": "icoController(address)", +"f82fe152": "PLAYER_METADATA()", +"f83064c7": "transferMintship(address)", +"f830c325": "updateToken(string,string)", +"f830d489": "depositExit(uint256,bytes32,bytes,bytes)", +"f83186f5": "HoryouToken()", +"f831aee6": "kingdomCreationFeeInFinney()", +"f831e962": "getWebStats()", +"f831ebab": "freezeTokens(address,uint256,uint256)", +"f831fe32": "updateApp(string,address,uint256,bool)", +"f833061b": "RESELLING_LOCKUP_PERIOD()", +"f8333e0e": "Aramco()", +"f8339005": "getSaddle(uint256)", +"f833f984": "OSEToken()", +"f8341fca": "BezantToken(string)", +"f8347242": "betsNum()", +"f834db41": "getBeneficiaryManage()", +"f834e212": "setGamePrize(uint256,uint256)", +"f8351daf": "winningCard()", +"f8354a82": "nextArenaTime()", +"f835a686": "setSaleEnd()", +"f835eb1b": "New(string,uint256,uint256,string,string)", +"f83629e0": "EBLCreation(uint256,string,string)", +"f83761e5": "setBAU2(bytes32,address,uint256,uint256)", +"f837e7c1": "battleAdd(uint256)", +"f838b0e9": "get_allowance_expires(address,address)", +"f838ea1a": "setDefaultMaxJump()", +"f838f6dd": "AssignBurnFees(address,uint256)", +"f8392303": "changeTicketMag(uint256)", +"f839407b": "setRateRoundSeed(uint256)", +"f83944ab": "LogEggAcquisition(address,uint256)", +"f839686d": "STSTEST7()", +"f839dc62": "pauseWork(uint256)", +"f839eb1a": "Referral(uint256,address,address,address)", +"f83a4c8a": "claimBet(uint8,uint8)", +"f83a768d": "addDiceRoll(uint256,uint256)", +"f83b5dce": "ec()", +"f83c4f82": "enableCirculation()", +"f83c6f64": "MIATOKEN()", +"f83ce05d": "deauthorizeBurnRequester(address)", +"f83d08ba": "lock()", +"f83d14e6": "buySketch(uint256)", +"f83d69db": "intMin(int256)", +"f83d96c1": "InsuranceAgent()", +"f83e3f5a": "SetProjectName(string)", +"f83e5793": "caged()", +"f83e9a20": "lock_period()", +"f83eb5dc": "forcedRefund(address)", +"f83fcdea": "setPrice(uint256,uint256,address)", +"f84038b1": "getMinimumContribution()", +"f8407634": "checkFunderAccount(address,address)", +"f8408a8d": "Funding_Setting_cashback_time_start()", +"f843545c": "active_payable()", +"f843b1b6": "singleWithdraw()", +"f843d4ec": "setEthereumBalance(uint256,bool)", +"f843dad6": "phaseTwoEnd()", +"f843ea4d": "updatePhaseSupplyAndBalance(uint256)", +"f843ebb1": "runTests(address,address)", +"f844a9f4": "requestArbitration(bytes32,uint256,address,address)", +"f84501e0": "prosperaTokenAddress()", +"f84564f6": "RGTOKEN()", +"f845862f": "newUser(bytes32)", +"f8465534": "removeFromSendAllowed(address)", +"f8469646": "slice(address[],uint256,uint256)", +"f847b16d": "INAToken()", +"f848091a": "claimERC20(address,address,uint256)", +"f8482ca5": "Payroll()", +"f848d541": "withdrawLimit()", +"f84907d7": "tokens_backed(address)", +"f849acb8": "overrideLock(bool)", +"f84a0e74": "BSWCValueCirculateAssets()", +"f84a6519": "requiredDownPayment()", +"f84ad0fb": "ProvideWorkOrder(address,address,address,address,address,uint128)", +"f84af7f3": "isAssetIdOwnerOrApproved(address,uint256)", +"f84b2f51": "disqualified()", +"f84b624e": "ProjectCoin()", +"f84b903e": "distributed()", +"f84bcb11": "setEtherReceivers(address,address[])", +"f84ce165": "setEndStage1(uint256)", +"f84dcb1e": "CFToken()", +"f84ddf0b": "lastTokenId()", +"f84f30c4": "_isCorrectBuyin(uint256)", +"f84f420b": "getRandomNumber(address,uint256)", +"f84fce56": "isDraw()", +"f850a136": "get_lose_coefs()", +"f850a7a4": "_addUser(address,address)", +"f850b7f8": "ERC20YSLToken()", +"f851019a": "BONUS_50_100()", +"f8515cfc": "destroyFactory()", +"f8515eca": "Operable(address[])", +"f8516c6c": "groupPolicyInstance()", +"f851a440": "admin()", +"f8524236": "DeleteImage(uint256)", +"f852b976": "_updateState()", +"f853343d": "addStakeAD(uint256,address)", +"f8536b94": "participated(uint256,address)", +"f8538662": "signup(bytes32,bytes32)", +"f853ee49": "rateUSD()", +"f8542f5e": "getCopaCoreAddress()", +"f8548bea": "quarterFirst()", +"f8548e36": "transfer(uint256,address,uint256)", +"f854d74c": "withdrawCommunityTokens(address,uint256)", +"f856d605": "tokensPerEther()", +"f8570b01": "_newEpoch(uint256)", +"f85771b2": "removeManager(address,address)", +"f8579af8": "test_percPoints()", +"f8588593": "isSuperContract(address,address)", +"f85905ac": "testEqualityUint(int256)", +"f85a253f": "setTEx(address)", +"f85a3dea": "totalAmountOfEarlyPurchasesWithBonus()", +"f85aefba": "testBitsSetFailIndexOOB()", +"f85b2160": "recoverFailedLock()", +"f85c6b3b": "_safeGasCall(address,bytes)", +"f85cb0b5": "Start2()", +"f85cd33e": "timelockTokens()", +"f85d9cc7": "setReviveFee(uint256)", +"f85daa38": "authorityContractAddress()", +"f85e4854": "tokenIssuedPreSecondIco()", +"f85ef43b": "modifyPolicyAttribute(uint8,uint256,uint8)", +"f85f0972": "FoxicoPool(uint256,uint256,address)", +"f85f3b7f": "defaultIcoDeadline()", +"f85f8a3a": "BiTianToken()", +"f8605230": "getNewTeamPositionAndCheck(uint16,uint8,uint64)", +"f860a6d8": "withdrawlBalance()", +"f860e64a": "Lottery(uint256,uint256,uint256)", +"f8615d24": "getBio(address,bytes3)", +"f861d2bf": "MIRC()", +"f86282da": "doStateChanges()", +"f862d780": "addIn(address)", +"f862f6f4": "cap_nuru()", +"f86325ed": "BASE_PRICE()", +"f8635ece": "openSession()", +"f86418e5": "_privateSaleTransferFromOwner(address,uint256)", +"f864bc65": "lastBlock_a5Hash_uint256()", +"f864ca14": "withdrawToWallet(uint256)", +"f864e729": "getAvailableTokenForUser(address)", +"f8651d56": "Prether()", +"f868061e": "setICOExchangeRate(uint256)", +"f8688ddd": "setTargetFeePeriodDuration(uint256)", +"f869b11a": "declareVictor(uint256,uint256)", +"f869b3ff": "AdvisorsFund()", +"f86a3529": "totalStages()", +"f86a3eeb": "MyGaoguans()", +"f86a6334": "setCampaignStartDateById(bytes32,uint256)", +"f86abfd9": "mainSaleRateP4()", +"f86ae8b2": "TokenSaleStop()", +"f86b0669": "burner_addr()", +"f86b5ebc": "DANSSold()", +"f86c4354": "GovcTechnicalGases()", +"f86c8ed3": "blocksUntilNewPotentialWinner()", +"f86ccd41": "amountDeposited()", +"f86cd33d": "noThrowCall(address,bytes4)", +"f86da6ed": "checkTotalBets()", +"f86db133": "forwardWithRevert(address,uint256,bytes)", +"f86e898c": "hasMinCreatedOn(address,uint256,uint256)", +"f8702fe1": "calcFees(uint256,string,uint256)", +"f870849d": "GetBankerPrincipal(uint8)", +"f871cca9": "_check(uint8)", +"f871e0e1": "DutchAuction(address,address,address)", +"f8721a4e": "calcReturnValue(uint256,uint256)", +"f8721f1e": "nAlarms()", +"f8725493": "GCA1()", +"f872bec0": "sn()", +"f872c9dd": "Vote(address,string,uint256)", +"f872f047": "testControlMixItemStoreNotRegistered()", +"f8732d3e": "goodLuck(address,uint256)", +"f8737bc0": "nextUnlockTime()", +"f87394d6": "DonateEther()", +"f873d7e6": "initializeTrueUSD(uint256)", +"f8742a14": "hivePerUSD()", +"f87482e1": "changeMigrate(address)", +"f875c421": "delegateReferalTokens(address,uint88)", +"f876101c": "setConstantsContract(address)", +"f876250a": "getNumClonesInWild(uint256)", +"f876fe1a": "availableHavvens(address)", +"f8779524": "addNewGame(string,int8)", +"f87876c5": "resignFromMatch(uint256)", +"f8788382": "payService(uint256,uint32,string,uint64,uint64,uint64,uint64,uint64,uint64)", +"f8789e1a": "_createUnitHelper(uint256,address)", +"f878fcc2": "migrationAllowed()", +"f87aa82f": "_setBuyPrice(uint256)", +"f87aad3e": "SetAllLock(bool)", +"f87aba30": "placeBet(uint256,uint256,uint256,bool)", +"f87c77c0": "getVirtualChannel(bytes32)", +"f87d7236": "addCapFreeAddress(address)", +"f87e7446": "Houton()", +"f87eac7f": "lastBlock_v15()", +"f87f31c3": "mintMiniICOTokens(address,uint256)", +"f87f44b9": "setWebsite(string)", +"f87ffb74": "gameIdCntr()", +"f88001d4": "reopenSale()", +"f8801631": "getTotalDonateWEIInfo()", +"f8806544": "getBioLanguages(address)", +"f880f920": "calcMax()", +"f8811c36": "registerNewAccount(address)", +"f8811efd": "mintMonster(address,uint256)", +"f88218e0": "claimPheonix(address)", +"f8823353": "_isListed(address,address)", +"f88339a5": "CBOPToken(address)", +"f8833efd": "probabilities(uint256)", +"f88351d9": "getDividendsBalance(address)", +"f88371e8": "balancesLocked1Y()", +"f883dfb5": "initializeLevel()", +"f8840c38": "TopforceCoin(uint256,string,uint8,string)", +"f88489a6": "getBidIdsByToken(address)", +"f884e54a": "giveCat(bytes5,address)", +"f88573c8": "Administration()", +"f885eaf2": "returnAllowedTime()", +"f88607e4": "ICO_PRICE2()", +"f88649a1": "getLastWinner()", +"f8868778": "change(uint256[])", +"f886cbda": "reado()", +"f886e9b6": "removeRelation(address)", +"f8887cd3": "TransferToken(address,address,address,address,uint256)", +"f8895cc8": "schema()", +"f8896ea6": "Interim()", +"f8897945": "min()", +"f889ac54": "JP_sum()", +"f88a067f": "registerHotel(string)", +"f88a742b": "insertStage(uint8,uint256,uint256,uint256)", +"f88b07a3": "SoldToken()", +"f88b1f38": "balances6(uint256)", +"f88bf15a": "removeLiquidity(uint256,uint256,uint256,uint256)", +"f88bfe3e": "getCountStages()", +"f88cc87c": "decline(bytes32,bytes32)", +"f88cf827": "getVendorProducts(address,uint256,uint256,uint256,uint256,uint256,bool)", +"f88d2047": "cancelOrder(uint256,bool)", +"f88d6732": "dice(uint256)", +"f88d88e4": "address_book(bytes32)", +"f88e0b09": "getTransferValueValue()", +"f88e9fbf": "divide(uint256,uint256)", +"f88edaf2": "mMultiSigWallet()", +"f89005e7": "depositWithReference(string)", +"f8900ddd": "godAddress()", +"f89037a9": "TureTreasureChain()", +"f8907491": "isCollectionAllowed(bytes8,bytes8)", +"f890e286": "oracleOf(address)", +"f8910119": "AuctionStarted(uint256,uint256)", +"f8910241": "_getTokenAmountForBuyer(uint256,bool)", +"f892ee05": "subDevTwo()", +"f894d398": "withdraw_asset(uint32,address,uint256)", +"f894d957": "signedApproveCheck(address,address,uint256,uint256,uint256,bytes32,address)", +"f895436a": "setLotteryParameters(uint256,uint256,uint256,uint256,bool)", +"f8956a67": "getBonus(address,address,uint256)", +"f896503a": "getConfigAddress(bytes32)", +"f896680c": "testInitialEtherBalanceShouldBeZero()", +"f8975cd9": "ZanteCoin()", +"f8976385": "RokToken()", +"f897ae8c": "numEmptyIndexes()", +"f897c998": "lastSaleTime()", +"f897ebbc": "setDelegatedFromOperation()", +"f8981789": "setCompliance(address)", +"f8984677": "_calculateMinimumprice()", +"f898e574": "incentiveDistributionDate()", +"f898f8ab": "Escapable(address,address)", +"f8995981": "ABAS()", +"f899b607": "FxdCoin()", +"f899e9f3": "annihilateShares(address,uint256)", +"f89a053b": "setAccountFeeModifiers(address,uint256,uint256)", +"f89a5100": "RGP()", +"f89a77b1": "removeValidator(address,bool)", +"f89be593": "softcap()", +"f89ca001": "revealMove(bytes32,uint256,bytes32)", +"f89e4df3": "saleMilk(uint256,uint256)", +"f89e6512": "CMDCrowdsale()", +"f89ea906": "_refundExcess(address,uint256)", +"f89eae17": "testStop()", +"f89f0e44": "getMyDividendTokens()", +"f89f2a65": "addExchanger(address)", +"f89f3834": "getAccountChartDetailsByEntityId(address)", +"f89f74bf": "MATCHES_PER_ROUND()", +"f89f7cb3": "updateDrawPeriod(uint256)", +"f89fdabc": "TokenTransferContract(address,address)", +"f8a05d13": "transferLd(address,uint256,string)", +"f8a09cd0": "settlementDetails(uint64)", +"f8a0cdee": "addUserRewardPayouts(address,uint256)", +"f8a17d7f": "League(address,uint256)", +"f8a21631": "PrivateCoinSupply()", +"f8a321e1": "checkInvestorContribution(address)", +"f8a34b26": "presale(address,uint256)", +"f8a35b35": "maximumSubscription()", +"f8a39a6e": "test_twoTrueAssertNoMessage()", +"f8a3ce82": "resetSession()", +"f8a40b7d": "requestSetWithdrawalLimit(address,uint256,string)", +"f8a46568": "HashnodeProCoin()", +"f8a47213": "VnixNetwork()", +"f8a4cc33": "withdrawPoly(uint256)", +"f8a4e608": "verifiedKYCAddresses(address)", +"f8a5399a": "settleExtraToken(address)", +"f8a56efd": "balanceOfRaws(address)", +"f8a5a8dd": "getTranchesLength()", +"f8a6172e": "receiveToken(address,uint256,address,bytes)", +"f8a6c595": "constructor(address)", +"f8a6fca8": "confirmImperfectReception(uint256)", +"f8a777f5": "batchCreateInternalDrawings()", +"f8a8fd6d": "test()", +"f8a9972a": "selectWinner20()", +"f8a9c6ae": "golix()", +"f8aa0a59": "updatebalance()", +"f8aa836b": "THRESHOLD2()", +"f8aabbd9": "makeTJs(address)", +"f8ab02dd": "isRefAvailable(address)", +"f8ab745e": "validTransfer(uint256)", +"f8abb93d": "hasVotedOnUpgradePoll(uint8,address)", +"f8abe7f2": "testSandwichOrder(uint256,address)", +"f8ac6570": "tokensBoughtInEarlybird()", +"f8ad69a8": "HetherToken()", +"f8adb686": "earlyBackerSupplyRemaining()", +"f8adccdb": "doPartnerShares(uint256)", +"f8aed03a": "btcsPortionTotal()", +"f8af2514": "IsItConstantinople()", +"f8af56b7": "_finish()", +"f8af9e6f": "setAdv(uint256,string,string)", +"f8b096bb": "setupRegion(uint256,uint256,uint256[],bool,uint8[128])", +"f8b0c0b6": "getTransferStat()", +"f8b10464": "pause_PRIVATESALE()", +"f8b11853": "getGenerationStartAt(uint256)", +"f8b14500": "EmissionProvider(address,address,address,uint256,uint256,uint256,uint256)", +"f8b1db8f": "donationBoxes(bytes32)", +"f8b28c26": "getSecretByHash(bytes32)", +"f8b2cb4f": "getBalance(address)", +"f8b2e259": "lowCapWei()", +"f8b332ad": "onpayInstallment(uint256,address,uint256)", +"f8b367c1": "categoryCap(uint256)", +"f8b3d3b1": "receiveInitialFunds()", +"f8b42f78": "getOrderBookKeys(uint256)", +"f8b45b06": "totalsData()", +"f8b4ab7a": "updateTotalSupply(uint256,uint256)", +"f8b4cfc6": "lock(uint8,uint256)", +"f8b4e080": "changeRateOfToken(uint256)", +"f8b542c8": "_0xPeriheliaToken()", +"f8b608a1": "addTournamentContender(address,uint256[])", +"f8b71c64": "rewardTo(address,uint256)", +"f8b746dd": "BdpEntryPoint(address[16],bytes8)", +"f8b89dfb": "setStep(uint8)", +"f8b91abe": "renounceManager()", +"f8b991e8": "firstRewardPeriodEndBlock()", +"f8ba7317": "sealManualMigration()", +"f8ba8e6a": "getAllowanceAmount(address)", +"f8bb201c": "setCroupier(address)", +"f8bb801d": "getTxIds(uint256,uint256,bool,bool)", +"f8bb9160": "TIGER()", +"f8bbca99": "multivestBuy(address,uint256,uint256)", +"f8bc0505": "left76(uint256)", +"f8bc8548": "getPOOL_edit_31()", +"f8bd4498": "AMOUNT_BASETEAM()", +"f8bd526e": "setCoinageContract(address)", +"f8bd71c7": "unstop()", +"f8bdbb60": "assertEq10(bytes10,bytes10)", +"f8bdc610": "_preProcessProposal(bytes32)", +"f8bdc9dd": "get_shares()", +"f8bf77ae": "managedContracts(uint256,address)", +"f8bfb34c": "getBorderValue(uint256)", +"f8c1c186": "isSale()", +"f8c206b0": "killFaucet(address,address,string,address)", +"f8c25c48": "changeCreatorBalance(uint256)", +"f8c28ce0": "releaseOperation()", +"f8c32ccb": "APG()", +"f8c34050": "priceIncrease()", +"f8c3a293": "ADVISORS_AND_PARTNERS_PER_CENT()", +"f8c439dc": "ETH_EUR()", +"f8c46eff": "FinalizableToken(string,string,uint8,uint256)", +"f8c4892f": "transferProxy(address,address,uint256,uint256,uint8,bytes32,bytes32,string)", +"f8c4ab92": "getNewCumulativeAllowance()", +"f8c52125": "deriveMarketCreatorFeeAmount(uint256)", +"f8c587ac": "paper()", +"f8c5e217": "getSellRatio()", +"f8c64800": "signTwo()", +"f8c65bae": "Bgc(uint256,string,string)", +"f8c75351": "transferViaProxy(address,address,address,uint256)", +"f8c80d26": "privateCreation()", +"f8c8282b": "transfer_storage_ownership(address)", +"f8c8765e": "initialize(address,address,address,address)", +"f8c8de10": "stringToUint8(string)", +"f8c95160": "tokenEmission5(address,uint256,address,uint256,address,uint256,address,uint256,address,uint256)", +"f8ca3e22": "CustomCrowdsale(uint256,uint256,uint256,uint256,address,address)", +"f8ca9442": "getBalance_in_token()", +"f8cbd580": "freezeIndex(uint256)", +"f8cc1055": "transferCallership(address,uint256)", +"f8ccb027": "AdminTransferred(address,address)", +"f8ccbd38": "validPurchaseForManual()", +"f8ce3164": "accumulatedFee()", +"f8ce5894": "updatePrizePool(address)", +"f8cf0e1c": "unlockAddr(address)", +"f8d09593": "Kikicoin(uint256,string,string)", +"f8d1f5f0": "setProvider(uint8,address)", +"f8d29219": "fundingStartUnixTimestamp()", +"f8d29f8a": "hasProfilePicture(address,address)", +"f8d3277d": "removeFromWhitelist(address,address)", +"f8d3a26a": "QuasaCoinExchanger()", +"f8d3afa4": "numberOfTransactions()", +"f8d3e256": "publicLockEnd()", +"f8d420a1": "cancelGame(uint32)", +"f8d50542": "addToWhitelist(address[],uint256[])", +"f8d506e1": "TCNYCoin()", +"f8d578f0": "registerContribution(bytes32,address,uint256)", +"f8d599eb": "appendContribution(address,uint256)", +"f8d609b2": "assert_ex(bool)", +"f8d67506": "Shop(uint256,address)", +"f8d6b70a": "setAyantDroitEconomique_Compte_5(uint256)", +"f8d7f790": "COMMUNITY()", +"f8d86bbc": "setNewEndtime(address,uint256,uint256,uint256)", +"f8d93136": "Savings(uint256,uint256)", +"f8d95520": "extUnlockNinja(uint256,uint16)", +"f8d970b6": "checkTemplateRequirements(bytes32,bytes32,bool,uint8)", +"f8d988d6": "toExchange(address)", +"f8daa0ee": "transferGroupCommune(uint256,address)", +"f8dad3db": "MAXIMUMINVESTMENTSALLOWED()", +"f8db188b": "MeetToken()", +"f8db5d07": "unlockKyc(address)", +"f8db71b5": "getStatusContract(address)", +"f8dc11cc": "soldTokenInPublicsale()", +"f8dc5dd9": "removeOwner(address,address,uint256)", +"f8dcbddb": "setStep(uint256)", +"f8dcc3e0": "getLinkStatus(bytes32,address)", +"f8dcc9a9": "potato()", +"f8dd1764": "ClearToken(address,address,address,address,address)", +"f8ddd288": "s31(bytes1)", +"f8de2dfd": "destroyCoins(address,uint256)", +"f8dea17f": "startraffle()", +"f8df084d": "ZUR()", +"f8dfaa1e": "ret_img(uint256)", +"f8e0cc1c": "getPI_edit_32()", +"f8e1badd": "getCrowdsalePrice()", +"f8e1ec40": "CTOcoin()", +"f8e217c4": "getDivBalance(address)", +"f8e29885": "get_game_balance()", +"f8e2d041": "maxNumberMembers()", +"f8e2d4f9": "settleBetVerifi(uint256[],bytes32)", +"f8e2dc6a": "rangeOfBets(uint256,uint256)", +"f8e39177": "intrepidShipMinted()", +"f8e3aa92": "sendNugget(address,uint256)", +"f8e43382": "icoRunningStatus()", +"f8e4500a": "getTokenIssued(address)", +"f8e48488": "returnDevelopersCut(uint256)", +"f8e4ed5f": "escrowDecision(uint256,uint256,address)", +"f8e5521a": "getBlockHashOddOrEven(uint256)", +"f8e58024": "colors()", +"f8e65295": "storeIt(string)", +"f8e6a8cf": "payETH(address)", +"f8e6b331": "jtest()", +"f8e7577d": "FIBToken()", +"f8e76cc0": "_exists(uint256)", +"f8e8b93d": "setTrueUSD(address)", +"f8e8e035": "COSHACNYToken(address)", +"f8ea5daf": "withdrawalEnabled()", +"f8eac151": "Multiply(uint256,uint256)", +"f8ead7cf": "getUserAverageDividendRate(address)", +"f8eb5fc5": "getSalePrice(uint256)", +"f8ebabcd": "_setPixelBlockPrice(uint256,uint256,uint256)", +"f8ebf282": "changeHSShopPrice(uint256,uint256)", +"f8ec4bf2": "setAllowTransactions(bool)", +"f8ec4cd5": "withdrawBidForCollectible(uint256,uint256)", +"f8ec6911": "buyback()", +"f8ec7e83": "test_updateKey_zeroNewKey()", +"f8ecb558": "getFishByAddress(address)", +"f8ed0dfb": "setBuff(uint256,uint8,uint32)", +"f8eee5d6": "returnPaidBackBlock(uint256)", +"f8ef13f4": "EthbetToken()", +"f8ef9a3d": "getPaymentLog(uint256)", +"f8efaf2b": "partner_2_name()", +"f8efc03e": "approveWhitelisted(uint256)", +"f8eff67c": "takeInvest()", +"f8f079bb": "reserveAllocation()", +"f8f122ba": "numCompletedRequests()", +"f8f1939d": "PRESALE_TOKEN_CAP()", +"f8f1d927": "multiERC20TransferTightlyPacked(address,bytes32[])", +"f8f1f151": "testToAddress(bytes)", +"f8f2d5e4": "preIcoTokensCount()", +"f8f32de6": "revealAssertion(uint128,uint256,uint256,uint256,string)", +"f8f46b5f": "getCurrentMinerAddress()", +"f8f53ce7": "nestedSecondAnyToAny(uint256)", +"f8f5cefd": "updateNextMemberPayment(address,uint256,uint256)", +"f8f63375": "YXLToken()", +"f8f6773b": "calculatePurchaseBonus(uint256)", +"f8f6882e": "LavaWallet()", +"f8f6e080": "UnclaimedDividendTransfer(uint256,uint256)", +"f8f7312d": "ChangeBurnBoundsEvent(uint256,uint256)", +"f8f73808": "create(address[],uint256)", +"f8f8a912": "GetBalance()", +"f8f9271c": "changeRegistrationStatusForSilverWhiteList(address,bool)", +"f8f9456c": "CrowdsaleFactory(address)", +"f8f96a55": "lastBlock_v6Hash_uint256()", +"f8f9be36": "settlementRegistration(uint64)", +"f8f9da28": "borrowRatePerBlock()", +"f8fb1d0f": "countUsers()", +"f8fb1f07": "sponsorsOf(uint256)", +"f8fb3366": "stopPreSale()", +"f8fb491f": "setSaleAddress(address)", +"f8fb4ab7": "NBAT001(address,address,address,address,address)", +"f8fbdbb6": "getChkLockedTokens(address,uint256)", +"f8fc16ef": "minWeiToAccept()", +"f8fc6fcd": "QNBAI()", +"f8fc94aa": "refundTransactionAfterExpiryFee(uint256)", +"f8fd72ac": "getCompte_44()", +"f8fdebd3": "weiMaxCap()", +"f8fe2cb0": "toDepositCommitmentRecord(address,address,uint256,uint256,uint256)", +"f8fe2f9d": "KyberGenesisToken(address)", +"f8fe63b0": "getERC721Id(uint256,address)", +"f8ff612e": "WithdrawToHolder(address,uint256)", +"f8ffe42a": "SetCoefRew(uint256)", +"f900592a": "ToggleTransferAllowance(bool)", +"f900b5d6": "getUserTotalPaid(address,address)", +"f9010d19": "joinEvent()", +"f901a18f": "setSale(uint256,uint256)", +"f9020e33": "saleStatus()", +"f9039f33": "update_current_rate(uint256,string)", +"f904b9ff": "GXDHRPToken()", +"f9059832": "isSaleEnded()", +"f906a440": "getInvoice(string)", +"f9079685": "SPCoin()", +"f9081ba2": "safeContract()", +"f908326b": "payRewardForAddress(address,address)", +"f90836df": "_transferFundkeeper(address)", +"f9084729": "pvt_plmt_token_generated()", +"f9094303": "finishVoting()", +"f909640c": "InitialPriceDisable()", +"f909d60d": "getMinimumGasLimit()", +"f90a2f30": "usedNonce(address,uint256)", +"f90b2bfe": "dissolve(uint256)", +"f90b2e74": "setInitialTime()", +"f90c3f27": "FUNDING_PERIOD()", +"f90ce548": "SmartDeposit()", +"f90cf0a4": "Land(address)", +"f90ddee2": "tokenBurners(address)", +"f90e292c": "stage3Start()", +"f90f11b7": "withdrawNVTfromGame(uint256,uint256)", +"f90f3278": "resetUsername(string)", +"f90f4560": "placeBet()", +"f90f4a30": "Matthew()", +"f90fa5dd": "sendTokensToAdvisorsLock(address)", +"f910feaa": "safeTransfer()", +"f912e58c": "setPreCrowdsaleAddress(address)", +"f912ed00": "lockMe()", +"f913a879": "getBidsNum(address)", +"f913b919": "setAssetLevel(uint16,uint256)", +"f9146b2f": "newRefPayStation(address)", +"f9153fbc": "changeHouse(address)", +"f9154476": "__redeemAmount(address)", +"f915cf42": "MINIMUM_BET_VALUE()", +"f9163e64": "lockUpAmountStrOf(address,address)", +"f9172266": "setOldSeelToken(address)", +"f9174551": "cooperativeSettle(address,address,uint256,address,address,uint256,bytes,bytes)", +"f9177aad": "CreateFBL(address,uint256)", +"f9190fcc": "smartSponsor(address)", +"f9191b18": "revealVotes(address,bytes32,bytes32,address[],uint256[],uint256[])", +"f9195a30": "doFunding(bytes32,string,address,uint256,address)", +"f91a545b": "getLossTokenAmount()", +"f91a792e": "decryptHand(string,uint256,uint256,uint256)", +"f91b853b": "upgradeFrom2To3()", +"f91bb05a": "withdrawForeignTokensTo(address,address)", +"f91bcd76": "getMintForReportingParticipantAmountValue()", +"f91c022b": "secondTokenCap()", +"f91c26a5": "dLogN()", +"f91c339e": "calculateTxHash(address,address[],uint256[])", +"f91cb3d6": "proposalAvatar(bytes32)", +"f91d4db7": "TokenTracker(uint256)", +"f91e89db": "maxMonsterHit()", +"f91f681f": "targetFromBits(uint32)", +"f91f87f2": "tokenDistributionDuration()", +"f9215676": "paymentsByCustomer(uint128)", +"f921991c": "transferTokensWithOffsetAndLimit(uint256,uint256)", +"f922501a": "CRYPTOBULL()", +"f9226daf": "LogWithdrawal(address,uint256,uint256)", +"f922da7e": "addTokensToCampaign(bytes32,uint256)", +"f922f216": "disableERC20()", +"f923058c": "get_total_supply()", +"f923b8aa": "setBCY(uint256)", +"f9244a9b": "sendToMinter(uint256)", +"f9249fbf": "initiateTeamVesting(address)", +"f924c276": "fechStageIndexBySnapshotBlock(uint256)", +"f92561f3": "lambosBuildCount()", +"f9261d3f": "setProviderDetails(address,string,string,string,uint8,address)", +"f9268170": "setEdgePerPosition(uint256)", +"f926ac20": "totalInWei()", +"f9271fd3": "changeFundAddress(address)", +"f928655b": "transferA2B(address,address)", +"f92883a2": "mint(address,uint256,uint256,uint256,uint256)", +"f9297a40": "getPrice(bytes,int256)", +"f92a373b": "payForOption(address,address,address,uint256)", +"f92a69ec": "createPolicy(address,uint256,uint8,bytes32,bytes32)", +"f92a73d7": "ICONIQ_SALE_CLOSING_TIME()", +"f92a7595": "fxpMul(int256,int256,int256)", +"f92a79ff": "getExecutor(bytes)", +"f92a9de5": "developmentFunds()", +"f92abed9": "GetEvaluate(uint32,uint8)", +"f92ad219": "initialize(address,uint256,uint256,uint256,uint256)", +"f92b359a": "instrumentManifest()", +"f92b9dc7": "TVThreshold()", +"f92bb8c9": "getConfigUint(bytes32)", +"f92c33f7": "EventLuckyNumberRevealed(address,uint256,uint256,address)", +"f92c45b7": "reservedAmount()", +"f92c6bb6": "getGuessStatus(uint256,uint256)", +"f92c9b47": "TOKENS_FUTURE()", +"f92caf3a": "UploadIMG()", +"f92cd2b2": "airdropTokensBatch(address[],uint256[])", +"f92ec991": "preEtherReceived()", +"f92fff12": "requestEtherToUSD(bool,uint256,uint256)", +"f9307837": "setMaxcap(uint256)", +"f930a3d2": "presaleMint(address,uint256,uint256)", +"f9319a88": "SECOND_TIER_RATE()", +"f931eaef": "untokenizeProperty(string)", +"f931edb4": "ClaimedTokens(address,address,uint256)", +"f93231ba": "GetAskingTokenMutiplier()", +"f932380e": "RoyalPanties(uint256,string,string)", +"f9323a32": "_selling()", +"f9324c5f": "EarlyBird(bool)", +"f9327b9f": "preSaleDeadline()", +"f933b844": "_addToVesting(address,address,uint256,uint256)", +"f9355dca": "functionFour()", +"f93589ce": "didWin(bytes)", +"f935ae8b": "requestExchangeRate(string,string)", +"f935fd94": "WeiTransfer(address,uint256)", +"f937a6eb": "setLockup_investors(address,uint256,uint256)", +"f938075c": "weiToRecoverPreICO(address)", +"f9391d24": "AllPayAuction()", +"f939499d": "backupfarmSingle(address,address,uint256)", +"f9394c10": "getCarrotCredits()", +"f93a2109": "ADT()", +"f93a8d96": "EtheeraCrowdsale(uint256,address)", +"f93acbe9": "SubBankerProfit(uint8,uint256)", +"f93af357": "updateSigners(address,bool)", +"f93b4466": "LudumToken(address,address,address,address)", +"f93ca568": "ActualQueue()", +"f93d029a": "sendICOByOwner(address,uint256)", +"f93de2c3": "updateMinimumQuota(uint256)", +"f93e2d31": "adminEditCity(uint16,string,uint256,address)", +"f93e6715": "freeUntilDate()", +"f93ee24c": "addMinerTokens(uint32,address[],uint32[])", +"f93f1391": "getPokemonBetTimes(uint256)", +"f93f1b02": "incByTwo()", +"f93f7ab5": "saleRateFirstDay()", +"f93f9a76": "WhitelistUpdated(address,bool)", +"f93fc97b": "test_updateKey_increaseNoHint(int256)", +"f940e385": "withdraw(address,address)", +"f9419088": "mintNonFungible(uint256,address[])", +"f941c01a": "getOwnerToken()", +"f942be1c": "endDayOneTime()", +"f9432517": "transferLimit()", +"f94497fe": "testCreateWithParentsForeign0()", +"f944f4c7": "removeUser()", +"f9454f3f": "register(address,uint256,uint256)", +"f9455301": "setHoldTime(uint256)", +"f945b274": "jackpotTokenEthRate()", +"f945ba2d": "avatarFee()", +"f945e8b2": "getCurrentRound(uint256,uint256)", +"f946372c": "TOKENS_SALE_HARD_CAP()", +"f946d61c": "logReputationTokensTransferredCalled()", +"f94789bf": "KungfuToken()", +"f948d276": "changeShare(address,uint256)", +"f948e51a": "implementation2()", +"f949116d": "ICDCap()", +"f94a3223": "submitCro(bytes32,bytes32)", +"f94a360d": "MAXIMUM_BET_SIZE()", +"f94aa8bf": "BliBliToken(address,uint256)", +"f94b97c9": "IntoQueue(address,address)", +"f94c12cb": "cancelPendingChange()", +"f94c81c3": "RobotTradingToken(address)", +"f94c9e13": "getChannelInfo(address,address)", +"f94d2d44": "formatNumber(uint24,uint256)", +"f94d71a0": "unregisterObserver(address)", +"f94d7a10": "setTransferFromWhiteList(address,bool)", +"f94df54f": "importersBanksLetterOfCredit()", +"f94df678": "getAuthorizedEditAgents()", +"f94df97f": "Lotery(uint256,uint256,uint256,uint256,address,uint256)", +"f94e08d0": "queryWaitingTime()", +"f94e45de": "Scaltinof()", +"f94f04e4": "sendPresaleTokens(address,uint256)", +"f94f1e9a": "LifePasswordAI()", +"f94f6910": "POINTS_TO_LEVEL()", +"f9500927": "eth_amount_judgment(uint8)", +"f950db2b": "unfreezeUpgrade()", +"f951410d": "setBcouponTransferCost(uint256)", +"f9514ec9": "ApprovedBy(address)", +"f9515f1b": "addGroup(address)", +"f951f856": "getPeriodTotalReceived(uint256)", +"f952279e": "cancelOffer(bytes32)", +"f952f938": "CreateCreature(uint256,address)", +"f953927e": "openRoom(uint256,uint256,address)", +"f95440ba": "decimalPoints(bytes32)", +"f954501f": "validRouletteBetData(bytes,uint256)", +"f95547fa": "getGameFees(uint256)", +"f9565aec": "NewTokenGrant(address,address,uint256,uint256)", +"f9566392": "WeightedSubmission()", +"f956a1b5": "EthereumPinkToken()", +"f956c139": "getMatchIndex(uint256)", +"f956ecde": "invalidatePurchase(uint256)", +"f956fc52": "didWithdrawCollateral(bytes32,address,uint256)", +"f957417e": "activateToken()", +"f957ddba": "withdrawAllFrom(address)", +"f958530f": "bountyTransferToken(address[],uint256[])", +"f9586eaa": "setScouponAllocationFactor(uint256)", +"f9587219": "SetPetCardDataContact(address)", +"f9589eb3": "onceOuttime()", +"f95918eb": "indexOfUserInfo(uint256)", +"f959300b": "calculateSetupAllowedUntil(uint256)", +"f959fe4b": "admin_set_dividend(address,bool)", +"f95a5504": "buyandearn(uint256)", +"f95a77e5": "MALCoin(uint256,string,string)", +"f95a78fd": "milestone(uint64)", +"f95af64c": "freezeUpdateTokenAccount(address,bool)", +"f95af865": "selfWithdrawBalance()", +"f95afe2c": "getPortion(uint256)", +"f95b4309": "get_selected_player()", +"f95b5a58": "getInitialAnswer(uint256)", +"f95b5e0d": "mintTokensWithReferal(address,address,uint256)", +"f95bbc9c": "activeValueBonus()", +"f95c1a73": "allocationForESCBbyStage()", +"f95e0a54": "update(uint256,string,string)", +"f95e6306": "processInterval()", +"f95fbf67": "registerBarcode(bytes32,string,string,string,string,string,string)", +"f95fe2e7": "AddNewChallenge(uint256,uint256,uint256,uint256,bool)", +"f9609f08": "deposit(address,address)", +"f9614ac5": "content(string,address,uint256)", +"f9616bfa": "AidEvaCoin()", +"f9618364": "DGDb_Auction(address,address,address,address,uint256)", +"f9619147": "InbestDistribution(uint256,address)", +"f9639d80": "getCanAcceptAmount(address)", +"f963aac6": "CONFIG_MAX_PLAYERS()", +"f96512cc": "createPerDay()", +"f9654378": "TokenWithValidityPeriod(string,string,uint8,uint256,address,string,address)", +"f965e32e": "changeValue(uint256)", +"f9660347": "fetchAllBlocks()", +"f9662c8f": "returnInterest(uint256)", +"f966ade7": "repayLoan()", +"f9672443": "getMyEntityParents(uint256)", +"f9672820": "distributeARTTokenBatch(uint256)", +"f9676db4": "purchaseWithDai(uint256,uint256,uint256,uint256,address,bytes)", +"f96777d4": "payJackpotToWinner(address,uint256)", +"f9677e22": "computeSecret(uint256,address,address)", +"f96803d3": "getJobInvoicesByStatus(address,uint256,uint8)", +"f9683828": "coinback(uint256)", +"f968adbe": "maxPerTx()", +"f968f493": "unlockTokens()", +"f96a181e": "getContact(address)", +"f96abf0c": "deleteCrowdsaleContract(address)", +"f96b636d": "GILLIONTOKEN()", +"f96c166c": "isInPresalePhase()", +"f96cecc1": "returnAmount(address,uint256,bytes32)", +"f96d1c94": "closeStage()", +"f96ddf7a": "getSigner(bytes32,uint8,bytes32,bytes32)", +"f96eb003": "migrateManual(address)", +"f96f143e": "RELEASE_GAS_FEES()", +"f96f2fa1": "Shareable(address[],uint256)", +"f9706844": "recommendFundToPlayer(uint256,address,uint256)", +"f970bbfc": "removeDiscountStruct(uint256)", +"f97110a3": "getDeployedBlogs()", +"f9715458": "minActivatedToken()", +"f9718fc8": "returnTokens()", +"f971b054": "StoxSmartToken()", +"f972e2bf": "dateTransferable()", +"f974a1a2": "PURCHASE_AMOUNT_UNIT()", +"f974ae3c": "PrivateSaleExchangeRate(uint256)", +"f975a024": "openNonceId()", +"f975f3a2": "INITIAL_TOKEN_SUPPLY()", +"f976104f": "revokeDelegate(address,address,bytes32,address)", +"f976c371": "ZLHToken()", +"f9778d0d": "fixPlayerCountryId(uint256,uint256)", +"f9781eae": "test_curators()", +"f9782191": "fifth()", +"f978e842": "_addAdmin(address)", +"f97944e0": "CREATE_AMOUNT()", +"f9794660": "finneyToWei(uint256)", +"f9795a95": "minSlippageFactorInBps()", +"f979764d": "blockDotNumber()", +"f97a02fa": "inActive()", +"f97a9d38": "bonusSubscription()", +"f97b392a": "unregisterEmployee(address)", +"f97b65da": "closeShortPosition()", +"f97b7390": "getCurrentDiscountTrancheIndex()", +"f97bf9e4": "close(address,uint256,uint256,bytes)", +"f97c72b1": "_onBall(uint8,uint8,uint8,uint8,uint8[3][3][31])", +"f97cebed": "BellaStandardToken(uint256,string,uint8,string)", +"f97d0591": "parseTimestamp(uint256)", +"f97d8aee": "WriteBond(uint256,address,address)", +"f97e17d9": "payRate()", +"f97ea6fc": "getIndicesWithClaimableTokensForSellers(address,address,address,uint256)", +"f97f8e17": "takeOrder(address,address[5],uint256[8],bytes32,uint8,bytes32,bytes32)", +"f97fa1bd": "FrozenTokenEvent(address,uint256)", +"f98038ee": "howManyDicks()", +"f980a012": "mainSaleRateP1()", +"f980e52d": "clam()", +"f98139be": "getCensuredByCount(uint16)", +"f98157bd": "GetDeadline()", +"f9819884": "toggleDeathConfirmationByProxy()", +"f981aaca": "addDeal(uint256,string,string,uint256,string,bytes32)", +"f981f0c0": "_getAddress(address,bytes32)", +"f9820cc1": "Nothing()", +"f983c0fa": "run1()", +"f98456d2": "unenableTransfers()", +"f9854bfc": "creditsBalanceOf(address)", +"f985779c": "sin(uint16)", +"f985f5fc": "authorized_createCard(uint256,uint256,address,address)", +"f9869165": "ELIPSToken()", +"f9870705": "getProject(address)", +"f98765b2": "BotRemoved(address)", +"f988279c": "isAce(uint8)", +"f9888687": "raiseethamount()", +"f9889f78": "batchTransferFixedAmount(address,address[],uint256)", +"f988da4a": "TopsToken(uint256,string,uint8,string)", +"f9892c28": "ProofOfStableCoin()", +"f98a4eca": "executeVote(uint256)", +"f98b19f4": "publishBatch(uint16,uint16,string,string,bytes3)", +"f98b26a9": "submitProposal(address,uint256,uint256)", +"f98bbc60": "commit(address,bytes32,bytes,bytes32,uint8,bytes32,bytes32)", +"f98c48c1": "setData_18(string)", +"f98cbf76": "closeEXORImports()", +"f98d28bb": "priorityWallet()", +"f98d7c75": "SALE_STAKE()", +"f98dbad0": "hashCompareWithLengthCheck(string)", +"f98e09a6": "listResources()", +"f98e17a7": "PerSellOver(uint16[])", +"f98e87ba": "hashedParameters()", +"f98eaa9c": "ClaimTokens(address,address,uint256)", +"f98f5b92": "setWhitelister(address)", +"f9900bbb": "reinvestGameDividend()", +"f99031a7": "isWhiteList(address)", +"f9907274": "allTokenAddress()", +"f9909915": "bulkStoreHeader(bytes,int256,bytes,int256)", +"f990b73b": "end_crowdsale()", +"f991a43f": "currentTadpoleOwner()", +"f992905d": "deployContracts(uint256,address)", +"f9937c2b": "getCertificateKeys()", +"f9938192": "reenduser()", +"f993bef3": "postDeadline()", +"f993d955": "BTC_SUISSE_TIER_3()", +"f9943133": "MeltingContract()", +"f99450b9": "getEOSIO_USERNAME(uint256)", +"f994789a": "proposeRewardsWithdrawal(address)", +"f994bffa": "addCard(string,string,uint8,string,string)", +"f99514e2": "noInputReturn()", +"f9952ecf": "changeBoat(address)", +"f9953de5": "addOrg(string)", +"f9956289": "PRESALE_OPENING_TIME()", +"f99638a5": "bTest()", +"f9965dbf": "giveBounty(address[],uint256)", +"f996c697": "THRESHOLD1()", +"f9974d9d": "calculateWineSellSimple(uint256)", +"f9977329": "CROWDSALE_AMOUNT()", +"f997e136": "safeAdd(int256,int256)", +"f997f0c1": "_minHouseEdge()", +"f997f7eb": "ojiletoken()", +"f998393c": "Icostart()", +"f9983a12": "GetMyInvestmentBalance()", +"f9991f33": "AddProject(uint256,address)", +"f999ad04": "CreatePCC(address,uint256)", +"f999eead": "donateToDivs()", +"f99b7f0b": "getAllMatches(uint256)", +"f99ca1ee": "productionOf(address)", +"f99ca808": "totalDonationsWithBonuses()", +"f99cc96e": "tokenMaxSupply()", +"f99d18eb": "VIUREFoundersTokenSale(uint256,uint256,address)", +"f99d948f": "gameExpirationTime()", +"f99e574b": "BCEK(uint256,string,string)", +"f99ebb71": "testFailUpdateLatestRevisionEnforceRevisions()", +"f99ec32c": "lastFreezeSeq(uint8)", +"f99ee846": "KEACoin(uint256,uint256)", +"f99f128c": "make_initial_deposit(uint256)", +"f99f977c": "bountyPercentOfTotal()", +"f99fc046": "dEthereumlotteryNet()", +"f99fddae": "isValidUser(address,uint256)", +"f99ff180": "readMail(uint256,bytes16)", +"f99ff4df": "paged(uint256,uint256)", +"f9a01e94": "mintReward(address,uint256,uint256,uint256,uint256,uint256)", +"f9a075dc": "releaseETH(uint256)", +"f9a0fcc7": "RequestEthereum(address,address)", +"f9a191c8": "giveDirectoryTokenAllowance(uint256,address,uint256)", +"f9a2916f": "getInitiated()", +"f9a2cbd5": "INTREPID_SHIP_LIMIT()", +"f9a32246": "_transferFromToICAPWithReference(address,bytes32,uint256,string,address)", +"f9a329a6": "toVault()", +"f9a381e2": "CurrentToken()", +"f9a3e07d": "getObjInfoWithBp(uint64)", +"f9a42b8b": "_updateSpaceshipPrice(uint256)", +"f9a56fd8": "GamersCoin1()", +"f9a57ae4": "notDistributedAmount()", +"f9a596dd": "validatePrograms(uint256[])", +"f9a6da0c": "pks()", +"f9a794ad": "EtherLovers()", +"f9a7a2ef": "named(bytes)", +"f9a7c906": "setBonusTokenRateLevelTwo(uint256)", +"f9a86856": "maxWeiSMSVerified()", +"f9a87d4f": "buyAllAmountBuyEth(address,address,uint256,address,uint256)", +"f9a8b0ba": "latchTotalFci(uint256)", +"f9a8b611": "moveUnsold(address)", +"f9a8c5b9": "teamSum()", +"f9a8e898": "slashReservedUsername(bytes,bytes32[])", +"f9a8f797": "setLatestContract(address)", +"f9a94d43": "finalisePreSale()", +"f9a94ecd": "SellTokenToRaj()", +"f9ab21e2": "indexOf(uint32[],uint32,bool)", +"f9ac71bf": "allowNorthPoleMinting()", +"f9add1b9": "ourLastWinner()", +"f9ae77ff": "supportNewPurge(address,address,uint256)", +"f9aef74e": "PureGold()", +"f9b04f72": "reinvestByProxy(address)", +"f9b07b9b": "TeikhosBounty()", +"f9b16430": "HonestisNetworkETHpreICO()", +"f9b18e72": "RentableProvider(string,string)", +"f9b207f6": "Teepee()", +"f9b220f4": "modify_uint8(uint8)", +"f9b290b6": "PDPCointoken()", +"f9b2b19a": "getCns()", +"f9b2d1ee": "buyForFriend(address)", +"f9b2ec8e": "MinStarIndexAvailable()", +"f9b35ca3": "seed_traded_token()", +"f9b3e7f0": "hashAccountId(string)", +"f9b41139": "getBoxCount(uint16)", +"f9b4257d": "newXcat(bytes32,address,string,uint256,string,uint256,uint256)", +"f9b4d63a": "ownerOff(address)", +"f9b5c633": "ICONClassicToken()", +"f9b646db": "isTokenType(address,uint256)", +"f9b6b0c4": "create(address,uint256,uint256,uint256,uint256)", +"f9b71e73": "tankImposedMax()", +"f9b7fb56": "MarketboardListingBuyback(address,uint256)", +"f9b83323": "getNumberOfChecks()", +"f9b8659f": "detach(uint32,int256)", +"f9b87d40": "setKeys(uint32,bytes32,bytes32,uint32)", +"f9b8d639": "getMemberBonus(address)", +"f9b9a626": "getTotalWithdraws()", +"f9ba134d": "subtractAmount(address,uint256,uint256)", +"f9baa6ec": "freezingAgent(address)", +"f9bacc1c": "totalBonuses()", +"f9bb656b": "crowdSaleState()", +"f9bb84f5": "areWeekdaysOpen(uint256[],uint256[],uint256,uint256)", +"f9bbcc6d": "setMinVoteWeightK(uint256)", +"f9bcb4b1": "symbolLocked()", +"f9bd9338": "onFrozenAccount(address,bool)", +"f9be029f": "disableWhitelistAddress(address)", +"f9be437a": "UpdateTokenAddress(address)", +"f9befdef": "ownerSetGasLimit(uint256)", +"f9bfc71b": "mulUIntValue(bytes32,uint256)", +"f9bffc0f": "phID_()", +"f9c113cb": "ReadContent(string)", +"f9c12dda": "collectAll(uint8)", +"f9c1437e": "test5_searchAcrossNodes()", +"f9c15f94": "sendStableReward(address,address,uint256)", +"f9c1a197": "TransferEthToAddr(address,uint256)", +"f9c29e66": "hashOrder_(address[7],uint256[7],uint8,uint8,uint8,bytes,bytes,bytes)", +"f9c38ebf": "APTest1()", +"f9c397f8": "VoteInOrganizationScheme()", +"f9c3a68e": "setminimumAmount(uint256)", +"f9c447a9": "PurchasedTokens(address,uint256)", +"f9c4fb94": "addallbuy(address[],uint256[],address,uint256)", +"f9c58926": "_emitJobOfferPosted(uint256,address,uint256,uint256,uint256)", +"f9c5e0aa": "updateAttribute(bytes32,bytes32)", +"f9c6046a": "setForDutchSale(uint256,uint256,uint256)", +"f9c638ea": "globalMin()", +"f9c71f79": "isEquipedAny3(address,uint256,uint256,uint256)", +"f9c78097": "betToken(address)", +"f9c809fe": "addTip(address,bytes32,uint256)", +"f9c811f1": "regWL(address,uint256)", +"f9c8dec3": "KYC_ROLE()", +"f9c926c1": "has(address,address)", +"f9c935cf": "discountValue5()", +"f9c9b9de": "ExperimentalToken()", +"f9cb1b48": "getTotalInvestment()", +"f9cb6d7a": "reservedTokensAreDistributed()", +"f9cbcef0": "setStages(uint32[],uint8[],uint32[])", +"f9cbec43": "transferLandToEstate(int256,int256,uint256)", +"f9cc0605": "getAvailable()", +"f9cc2e66": "setPlatformFeePer10000(uint256)", +"f9cc6fce": "TestIOTACoin()", +"f9cd3ceb": "oracleFee()", +"f9cdbc4e": "paySmartContract(bytes32,uint256[])", +"f9ce67dd": "compareToIgnoreCase(string,string)", +"f9ce733b": "Pets()", +"f9ce7813": "transfer(address,address,uint256,address)", +"f9cee7b5": "totalScammedQuantity()", +"f9d09126": "updateTopicAssetClass(bytes15,bytes15)", +"f9d0fed4": "allowanceProvider()", +"f9d13bf0": "validate(address[4],address,uint256[12],uint256,uint256)", +"f9d176b4": "setManualWithdraw(bool)", +"f9d20590": "distributeFinancialAward(bytes12,int256,bytes12)", +"f9d38868": "exy()", +"f9d3b4e9": "obol()", +"f9d429ee": "NO_BATTLE_LOG()", +"f9d49797": "whitelistMaxWei(address)", +"f9d53ac8": "addPaper(address)", +"f9d593c8": "setNAVAdmin(address,address)", +"f9d5b4bb": "LogContribution(address,uint256,uint256,uint8,uint8)", +"f9d5e08b": "adminUsrCount()", +"f9d630a1": "TUI_ALLOCATION()", +"f9d6de48": "WALLET_LB_COMMUNITY()", +"f9d70200": "buyCrystal(uint256,uint256)", +"f9d75f25": "editDailyLimit(uint256)", +"f9d7f0fc": "CSES2()", +"f9d80dcd": "getInstanceImplementation(bytes32)", +"f9d8241c": "renterExists(address)", +"f9dbe5e9": "_updateStage(uint256,uint256)", +"f9dc0793": "getCustomerBankName(string)", +"f9dc5d43": "getAllPayment(uint256)", +"f9dca989": "becomeOwner()", +"f9dcef27": "cityPoolCutPercentage()", +"f9df65eb": "nullified()", +"f9df6c33": "calculateTokensAmount(uint256,bool)", +"f9df816a": "changeWhitelistPrivateStatuses(address[],bool)", +"f9dfa4a3": "setMaximumEtherToAccept(uint256)", +"f9dfb361": "preSaleStartBlock()", +"f9dfcfcc": "transferContract(address,address,address)", +"f9dfd0a5": "Token(address,string,string,uint8,uint256)", +"f9dfea54": "relockGroup(uint256)", +"f9dfecb9": "preICOTokens(uint256,uint256)", +"f9e0093d": "multiWithdraw(address[])", +"f9e05ed9": "sha(uint128)", +"f9e13de4": "doMigration(uint256,uint256)", +"f9e19fa5": "resetState()", +"f9e1ceda": "getBalancePercentRate()", +"f9e24dc2": "balanceOfMineral()", +"f9e27106": "investmentEntryCost()", +"f9e37733": "_createUnicorn(address)", +"f9e3c1e9": "setNextAddr(address)", +"f9e40a21": "allWon()", +"f9e4fb34": "fundTransferIn(address,address,uint256)", +"f9e51b1d": "withdraw(uint128,string,uint32)", +"f9e54282": "dropUsername(bytes32)", +"f9e68952": "createDrone()", +"f9e73764": "airdropExecute(address,address[],uint256)", +"f9e84395": "unexempt(address)", +"f9e856ae": "oldE4RecycleBin()", +"f9e8ad7c": "isPreIcoStage()", +"f9e9d34a": "getUserRefBalance(address,address)", +"f9ea3a18": "getHTLCSpendingData(uint256,int256,bytes32)", +"f9ea8839": "AlphaMarketCoinExchanger(address[],address)", +"f9eab09f": "setChickenHunt(address)", +"f9eb4ee2": "APPROVAL(address,address)", +"f9eba935": "debit(string,uint256)", +"f9ebdc8b": "isConfirmed(bytes32,address,address)", +"f9ec2edb": "startNewBoss()", +"f9eec610": "next(string,string,string,string,string,string)", +"f9eee901": "setClaimTreshold(uint256)", +"f9ef04be": "free(address,bytes32,uint256)", +"f9ef2c7d": "HTC()", +"f9ef33ff": "walletOEM()", +"f9ef66f5": "getRoundWinnings(address,uint256)", +"f9f03556": "ERC20(uint256,string,string)", +"f9f0507f": "timeLockedStart()", +"f9f14f6a": "library14function()", +"f9f16ef2": "numberOfTokens()", +"f9f20540": "setInvestTokenLimit(uint256)", +"f9f22d6c": "createNamespace(string,address)", +"f9f286f9": "setMultisigMain(address)", +"f9f2c161": "setGod(address)", +"f9f2c93c": "santaClaus()", +"f9f2ecb6": "getExtendAddr(address)", +"f9f39a9c": "initialize_bannable(address)", +"f9f411d8": "userTokens(address,uint256)", +"f9f447eb": "getCallDataHash(bytes32)", +"f9f53be0": "ChangeAmountPrice(uint256)", +"f9f5e8c8": "changeToCoin(address,address,uint256)", +"f9f71423": "increasePlayersGooProduction(uint256)", +"f9f73135": "get_heap(uint256)", +"f9f7d9de": "TOTAL_PERCRENTS()", +"f9f81a73": "setAccountCoords(string)", +"f9f86baf": "airdrop(address[],uint256[],uint8)", +"f9f8b586": "JMToken()", +"f9f8bdb7": "currentRate()", +"f9f8f895": "switchOn()", +"f9f90a60": "durationInBlocks()", +"f9f92be4": "blacklist(address)", +"f9f94bc6": "bioUnlock(bytes32,uint8,bytes32,bytes32)", +"f9fae4f7": "TOKEN_CREATION_CAP()", +"f9fafb59": "LogBidFinal(address,uint256,uint256,uint256)", +"f9fb12ad": "TestXRPCoin()", +"f9fb3c95": "transferBonus(address,uint256)", +"f9fb452f": "productID()", +"f9fbd554": "test(string)", +"f9fc0d07": "processRewards()", +"f9fc4816": "withdrawAmountETH(uint256)", +"f9fd41d8": "setRevolution(address)", +"f9fd5250": "DOW_MON()", +"f9fef3b3": "withMod(uint256)", +"f9ff1378": "solicitaDevolucao()", +"f9ffabca": "NewAdmin(address,address)", +"fa003b2e": "SCCAIToken(address,address)", +"fa006d87": "newPlaySeed(address)", +"fa009e36": "xxx7Coin()", +"fa0196eb": "OsherCoinAward(uint256)", +"fa01dc06": "revoked(address)", +"fa01dd3c": "BRTToken()", +"fa02955f": "registerMeOnEther(string)", +"fa02c4b7": "approveTransfer(address,uint256)", +"fa02dcc1": "TankWithdrawAll()", +"fa030ef1": "baba()", +"fa03446c": "tokensFromEther()", +"fa036370": "Athereum()", +"fa043b0f": "checkSig(bytes32,bytes32,uint8,bytes32,bytes32,address)", +"fa044862": "requireOk(bytes1)", +"fa048a18": "addHpbNode(address,bytes32,bytes32)", +"fa05064e": "setBountyDistributionContract(address)", +"fa058795": "logAdr(address)", +"fa061d48": "isReadyToSynthesize(uint256)", +"fa066fbd": "AccountGasLimitReached()", +"fa07153a": "commitVote(uint256,bytes32,uint256)", +"fa097028": "_burnRemainingTokens()", +"fa09cb30": "PatCoin()", +"fa09e630": "withdrawAll(address)", +"fa0a6cfe": "AFEBToken()", +"fa0a8f26": "calculateNextPrice(uint256,uint8)", +"fa0b5e55": "registerUser(address,uint256)", +"fa0b6211": "hasRoundEnded()", +"fa0bad28": "onholdBalance()", +"fa0bc8e1": "ownerOfSocialIdentity(uint256,uint256)", +"fa0c3034": "GenoPay()", +"fa0c498e": "refundJobSponsorships(uint256,uint256)", +"fa0c76c5": "calcUserDivsAvailable(address)", +"fa0cdc81": "getManifestById(bytes32)", +"fa0d5b52": "BerryLakeCoin()", +"fa0d80fc": "icoDenominatorPrice()", +"fa0ff39f": "setDummy(uint256)", +"fa1026dd": "getCommitment(address)", +"fa107a41": "Cajutel(uint256,string,string,address,address,address,uint256,uint256)", +"fa113488": "setCMTForGas(uint256)", +"fa113773": "BlackSeaCoin()", +"fa1152f3": "MoregainCoin(uint256,string,string)", +"fa11c471": "holdsValidLicense(address)", +"fa12d782": "openGame()", +"fa130b68": "developer_edit_text_price(string)", +"fa133fdb": "massTransferTokens(address[],uint256)", +"fa13af97": "InServiceToken()", +"fa140e3d": "MitToken()", +"fa1456a9": "transferKROContractOwnership(address,string)", +"fa147e5e": "remainingTokensAndCost()", +"fa14df6b": "getChangeRecipientFee()", +"fa169ec8": "getHashDigest(string)", +"fa16ab6c": "Platform()", +"fa16c53b": "DiscrashCredit()", +"fa17a19d": "forceStand()", +"fa188644": "whitelist5Addresses(address[5])", +"fa188df2": "addMinter(address,address)", +"fa1896f4": "getOneTokenInWei()", +"fa18dd2b": "isSetupMode()", +"fa193a6e": "Voter()", +"fa198656": "roundingPercent(uint256,uint256,uint256)", +"fa1a5f59": "soldAmount()", +"fa1acb5c": "_startTime()", +"fa1ad09e": "fundTransferOut(address,address,uint256)", +"fa1b3eb8": "gamesOf(address)", +"fa1ba1e1": "burn(uint256,bool,uint256,uint256)", +"fa1bde89": "test_set_get_OraclizeCallback()", +"fa1c594e": "disableRegistryUpdate(bool)", +"fa1ca37e": "_transferCeo(address)", +"fa1cee57": "approveKNCRateRange(uint256)", +"fa1d9cf8": "getZoneTeller(bytes2,bytes16)", +"fa1db1e7": "SendResult(uint64,bytes32,bytes32)", +"fa1e4fcb": "holdoverBalance()", +"fa1eae3c": "newSchellingRound(bool)", +"fa1f919f": "pre_enddate()", +"fa2073ad": "getAnswerCounts()", +"fa208cc5": "KickTheCoin()", +"fa20e77d": "burntTokens()", +"fa212d37": "getCurrentMaximalDeposit()", +"fa2299ee": "soldSupply()", +"fa23023b": "lockSales()", +"fa233620": "RENTALTOKEN(uint256,string,string)", +"fa24e7a0": "xyjtoken(uint256,string,string)", +"fa255179": "getCheckResultMessage()", +"fa25fd57": "settleOrder(uint256,uint256)", +"fa26db7e": "setMinAllowedReservingPercentage(uint256)", +"fa26fe32": "delivery(string)", +"fa27e070": "removeProxyForSender(address,address)", +"fa28a6b6": "checkTrainingPrice(uint256,bool)", +"fa28ba0d": "validateReleaseLockfileURI(string)", +"fa29141b": "minSellAmount()", +"fa292c44": "BitcoinPower()", +"fa2a68d2": "QToken()", +"fa2a8997": "isReleased()", +"fa2a9be6": "createPoll(bytes,uint16,uint256,uint256)", +"fa2acd87": "G(uint64[16],uint256,uint256,uint256,uint256,uint64,uint64)", +"fa2af9da": "platformWallet()", +"fa2b579d": "at_percentile(uint256)", +"fa2b76e2": "tokenReserved2()", +"fa2c7f9b": "getLender(uint256)", +"fa2cac28": "rejectEthTransactionRequest()", +"fa2cc19e": "calculate_price(uint256,uint256)", +"fa2d7efa": "AdlasToken()", +"fa2d84b6": "addBlacklistAddress(address,address)", +"fa2dedec": "SATS_TO_TOKENS()", +"fa2e9db8": "sunsetWithdrawDate()", +"fa2f29b6": "claimEOSclassicFor(address)", +"fa2f3e9a": "numAccountsInfo()", +"fa2f7a8f": "renounceContract()", +"fa307fcb": "sendMultipleMessages(address[],string,string,uint256)", +"fa309571": "delegateGetTokens(address,uint256)", +"fa30b251": "buyTicket(string)", +"fa314c67": "newAtomFee()", +"fa31b371": "deletePublicKey(bytes32,address)", +"fa31e684": "releaseTokensSaleCount()", +"fa3276bc": "isModifiedInRound(address,address,uint64)", +"fa332152": "giftSendIndex()", +"fa33bcf3": "isInList(address)", +"fa34b345": "walletsDelegate()", +"fa34b37b": "bonusPreviousOwner(uint256,uint256,uint256)", +"fa34da5e": "getTarget(bytes32,bytes4)", +"fa352dec": "tokensToEthereum_(uint256,uint256)", +"fa3559f7": "attestToContract(uint256,bool,string)", +"fa355d1c": "_distributeFloatWalletToken(uint256)", +"fa358c24": "refundPaused()", +"fa35a310": "Contributed(address,uint256,uint256)", +"fa35aa94": "deathData_f10()", +"fa36316e": "setFiatPerEthRate(uint256)", +"fa368e6d": "isWMSale()", +"fa369e66": "batchTransfer(bytes32[])", +"fa3754ca": "getCurrentDiscountRate()", +"fa37668f": "createContract(bytes32,bytes20,bytes20,uint256,uint256,uint256)", +"fa391c64": "isCompleted()", +"fa3a0f78": "getCreateMarketController()", +"fa3a3a7e": "DemoPreSale(uint256,uint256,address,address,address,uint256,uint256,uint256)", +"fa3b8f2c": "AdvertisementPayout(uint256)", +"fa3c6320": "intercrypto_recover()", +"fa3c8251": "TimeDecayingTokenEnvironment(uint256)", +"fa3c9bbc": "getHostRoomLists(address,address)", +"fa3e9b45": "setCreditDao(address)", +"fa3ed04d": "getDArbitraryData(bytes32,bytes)", +"fa3f1e99": "testBlobStoreRegistered()", +"fa3f5acf": "sendMsg(string,string)", +"fa3f998c": "redeem_deposit(uint256)", +"fa3fa196": "transferCreator(address)", +"fa404e34": "revokePoolRole(address)", +"fa407c19": "NRCToken()", +"fa40ce34": "addAllowedContracts(address[])", +"fa4125f7": "activateNextRound(uint256)", +"fa41fd32": "lastCallstopPreICO()", +"fa42f3e5": "map_address(string)", +"fa448f7a": "_handleAffiliate(address,uint256,uint256,uint256)", +"fa45858e": "changeSellPOPPrice(uint256,uint256)", +"fa45aa00": "executeWithdrawal()", +"fa461f33": "setValueStep2(uint256)", +"fa462e95": "mintStepPrice()", +"fa46b8b4": "SellRateChanged(uint256,uint256)", +"fa472bad": "SkillCoinTest()", +"fa47c564": "confirmERC20(bytes32)", +"fa48b4bf": "mintEtherBro()", +"fa48dfcd": "setLockup_jiedians(address,uint256,uint256)", +"fa49841d": "ownerAdmin()", +"fa49a13a": "Vulgus()", +"fa4a2e36": "ShyneTokens(uint256,string,string)", +"fa4a80f1": "Matrioska()", +"fa4ac15d": "withdrawAffVault(uint256,string)", +"fa4bb165": "setRoundNumber(uint256)", +"fa4c4271": "reClaimIFS(address)", +"fa4c5dc0": "addMessage(string,uint8,uint8,uint8)", +"fa4d0c3c": "lockDeadline()", +"fa4d300d": "ICOSplit()", +"fa4d3698": "setOwners(address[])", +"fa4de094": "KPOP_ARENA_CONTRACT_ADDRESS()", +"fa4e5e5a": "notify(uint8,string,string)", +"fa4f34a0": "GetChallengeTimings(uint256)", +"fa4f5511": "campaignUrl()", +"fa4f96c4": "ActivatedEvent(bool,bool)", +"fa4fb369": "addPreSaleTokens(address,uint256)", +"fa4feb65": "icoTokens()", +"fa5007cc": "getHold(uint256,bytes6)", +"fa502cf7": "addBidToStack()", +"fa5064be": "submitProposal(uint256,uint256,uint256,uint8,uint64,string)", +"fa5083fe": "getMaximumBetRate()", +"fa508d3e": "dnnToken()", +"fa509eda": "nextonetogetpaid()", +"fa509ff7": "collected_eth()", +"fa50b335": "IS_TIER_CONTRACT_MAGIC_NUMBER()", +"fa518054": "_addToWhitelist(address)", +"fa51a2bf": "setSupplyLock(bool)", +"fa51ae86": "RATE_CORNERSTONE()", +"fa5201e1": "LuckToken(uint256,string,string)", +"fa5252e4": "pbWinner()", +"fa52bcb3": "ICSTCrowSale()", +"fa52c7d8": "validators(address)", +"fa52caf6": "HECoin(address)", +"fa53bb1b": "setauctionother(uint256)", +"fa544161": "getOwner(address)", +"fa550659": "approvalForAll()", +"fa552d8e": "withdrawSale1()", +"fa556996": "TimeClock(string,uint256,uint256,uint256,uint256)", +"fa55afe2": "setABIHashForMod(bytes32,bytes)", +"fa55f4d4": "modifyEligibility(uint256)", +"fa566ddd": "doAllowance(address,address)", +"fa56780d": "getPurseContributions(uint256,uint256)", +"fa57e2ab": "resolved(bytes32,bytes32,uint256)", +"fa57ff82": "ownerSetJackpotToken(address,uint256,uint256,uint256)", +"fa58f510": "getFeeMake(uint256)", +"fa5919a8": "DAOSecurity(address,address,bytes32,uint256,uint256,uint128)", +"fa59d199": "removeHash(string)", +"fa5a1db6": "save(uint256,uint256,uint256)", +"fa5b344e": "assignSubMember(address,uint256)", +"fa5ba0f9": "stepPrice()", +"fa5bbcd2": "crowdsaleCreators(address)", +"fa5bc660": "offerDiscipleVend(uint256,uint256)", +"fa5be8f8": "setBonus(uint256,uint256,uint256)", +"fa5bfc1e": "claimedRewardHook(uint256,address,address,uint256)", +"fa5c0c70": "getSaleOrder(uint256)", +"fa5c5857": "createStakingContract(uint256,bool)", +"fa5cd179": "join_address(uint256)", +"fa5cdc2b": "OLTestSynatax()", +"fa5da441": "incrementedIndexOfName(string)", +"fa5e288c": "ABBC()", +"fa5ed321": "_pointToResolverAndResolve(bytes32,address)", +"fa5ef276": "getVotedData(address,uint256,address)", +"fa5f090b": "SmartIdeaTokenERC20(uint256,string,string)", +"fa5f2d80": "AOG(address,address,address,address,address,address,address)", +"fa607442": "timeOneSession()", +"fa608890": "withdrawRemainingRewards(uint256)", +"fa60a16e": "serviceAddressOf(address,uint256)", +"fa60fb0b": "getTxRoot(uint256)", +"fa6140dd": "weekPotLeader()", +"fa6171e4": "superMint(address,uint256)", +"fa62a1ff": "revokeAdminStatus(address)", +"fa640427": "setPermissionsProvider(address)", +"fa64dffa": "getDestQty(address,address,uint256,uint256)", +"fa65d336": "hasFreePlaces()", +"fa6669b7": "updateAccountData(uint256,uint16,bytes32,uint256,uint16,bytes32)", +"fa667907": "changeOwnerSharePerThousandForBuying(uint256)", +"fa66be4e": "countryLengthOf()", +"fa66e143": "employeeSignsToESOP()", +"fa671e5f": "deathData_v19()", +"fa671f6b": "validPurchaseIco(uint256)", +"fa6799f2": "revokeVesting(address,uint256)", +"fa67ae5a": "setBlockDelay(uint256)", +"fa67ba6f": "getSecondsTimeLockedByTx(uint256)", +"fa6878a7": "setBAB(bytes32,address,bytes)", +"fa68829a": "UnKoin()", +"fa68b4ce": "lookupISO3116_1_alpha_3(bytes)", +"fa691a26": "totalRoundsPassed()", +"fa695dd7": "createItem(string,uint256,uint256,bool,bool,string,uint256)", +"fa696d98": "ART_FOUNDATION_ADDRESS()", +"fa69ede9": "setNewRatesBase(uint256)", +"fa6a0712": "setOwnerPrice(uint128)", +"fa6ab63b": "getTokenSum()", +"fa6ac98e": "test_0_testBasicTxProposal()", +"fa6ad04c": "PRCT_BOUNTY()", +"fa6b129d": "tokenGenerationEvent(address)", +"fa6b535d": "deleteContact(bytes32,address)", +"fa6bdbf8": "_transfer(address,address,uint256,bytes)", +"fa6d373c": "LeaderHash()", +"fa6d8f1f": "callAndReward_1(string,string,uint256)", +"fa6e01a2": "ARTCToken()", +"fa6e5776": "haveExtension(string)", +"fa6ec547": "registeredAddress(address,bool)", +"fa6f3522": "EthimalFounderEggs()", +"fa6f3936": "isModerator(address)", +"fa6fc037": "prepareToBreed(uint256,bool,uint256,bool,uint256)", +"fa6fcc50": "_startBetBlock()", +"fa70466e": "getMonsters(uint16)", +"fa70f6da": "STRATToken()", +"fa712f71": "isBattleboardLive(uint16)", +"fa713023": "IEICrowdsale(uint256,uint256,uint256)", +"fa725ea3": "requireValidAddress(address)", +"fa7299f7": "getOwnerVirusLength(address)", +"fa729b5b": "CNY_Omnidollar()", +"fa72c53e": "providerFeePerEth()", +"fa73af0b": "GRANT_BATCH_SIZE()", +"fa73cb37": "ptxToken()", +"fa73f074": "useAddr()", +"fa76b253": "getAddressForAccount(string)", +"fa779bd6": "checkBalanceTier(address)", +"fa77c074": "shaThree(string)", +"fa785263": "checkRemoveOwnerArgs(uint256,uint256,uint256)", +"fa785928": "_revealBid(bytes32,address,uint256,address,bytes32,bytes32,uint256,uint256)", +"fa7860da": "etherHardCap()", +"fa78b172": "drawSecondaryWinners()", +"fa796124": "BitLumensCrowdsale(address,address)", +"fa796fa1": "CryptoZoo(address,address,address)", +"fa7a6cd3": "developer_string_symbol(string)", +"fa7ae620": "cryptaurReserveFund()", +"fa7af6fe": "investInternal(address,address)", +"fa7c31af": "withdrawCommunity(uint256)", +"fa7ca492": "preICOStats()", +"fa7d68f1": "getAccountInfo(uint256,uint256)", +"fa7e4eaa": "BELIBELA()", +"fa7e8f7c": "EtradeMarketsCoin()", +"fa7f6b96": "tokensLocked(address,uint256)", +"fa80918b": "computeNodeId(bytes,bytes)", +"fa81b200": "masterOfCeremony()", +"fa825185": "getChargers()", +"fa82b674": "ETHContract()", +"fa82e9fc": "organizer1()", +"fa83c01b": "setStopSendWebGift(bool)", +"fa848fb0": "startDayOneTime()", +"fa849243": "targetDiscountValue1()", +"fa85d33e": "istransferAllowed()", +"fa878e8f": "TOKEN_RATE_10_PERCENT_BONUS()", +"fa885329": "setTableSize(uint256)", +"fa885868": "addPreminer(address,address,uint256,uint256)", +"fa888c74": "callIt(uint256)", +"fa89401a": "refund(address)", +"fa894c08": "balanceWosPoolForSecondStage()", +"fa89ae7d": "ownerTransferEth(address,uint256)", +"fa8a3c1c": "rateC()", +"fa8a975d": "forcedTransferAll(address,address)", +"fa8ad6b9": "unsetIsRentByAtom(uint256)", +"fa8b72ff": "setBountyTokensWallet(address)", +"fa8b9a4b": "GetApplicant(uint256)", +"fa8dc33a": "checkRecordExists(bytes)", +"fa8ec0b2": "_transfer(address,address,uint256,string,uint256)", +"fa8edab6": "checkBalance(address,address,uint256,uint256)", +"fa8fc08d": "GxCoin(address)", +"fa8fd2b5": "LockRequestable()", +"fa90693b": "isBlockRedeemed(uint256)", +"fa912743": "feesStrategy()", +"fa922e66": "pickaxe()", +"fa923d10": "FutureCoin()", +"fa92fb6e": "IssueRejected(uint256)", +"fa93019c": "getBlocks(uint8,uint8)", +"fa93185f": "LockedDayRemoved(address,uint256,uint256)", +"fa93f883": "getMinute(uint256)", +"fa967415": "nextUpgradeMaster()", +"fa968eea": "minBetAmount()", +"fa96a49e": "totalSupplyUpgraded()", +"fa9768c9": "getOnMintAmountValue()", +"fa9789cf": "trainKitty(uint256)", +"fa984da8": "SujiToken()", +"fa985a2f": "p_update_mNewPlotDevPercent(uint256)", +"fa9907ad": "pay500Winners(uint256)", +"fa99d7ae": "enterDungeon(uint256[4],uint32)", +"fa9a4c35": "getPOOL_edit_21()", +"fa9acb05": "addressInArray(address,address)", +"fa9aecfb": "isUnowned(uint256)", +"fa9af30f": "getGoldXchgRate()", +"fa9b44b7": "PendingETHs(address[])", +"fa9ba8b4": "FunFaceToken()", +"fa9ce7e7": "moveTokensFromStockToExchange(uint256)", +"fa9d2352": "hasRequiredStateChanges()", +"fa9df423": "setShp(address)", +"fa9e6f11": "Exafire()", +"fa9e82cf": "uploadStartlist(uint256[])", +"fa9f117f": "setNextRoundMaxDonors(uint256)", +"fa9f245c": "CappedToken(uint256)", +"fa9fd8b2": "incremental(uint256,uint256)", +"faa06c06": "GetCityName(address)", +"faa0a264": "burnToken()", +"faa10f43": "require(bool)", +"faa1a8ff": "getOwnedBot(address,uint256)", +"faa3981a": "boolMemoryArray(bool)", +"faa458f4": "submittedHashes(bytes32,uint256,uint256)", +"faa51485": "isValidTraderAddress(address)", +"faa5369d": "getBorrowingItem(uint256)", +"faa5c564": "register(uint256,uint256,uint256)", +"faa5ca93": "erc20Buy(address,uint256,string,string)", +"faa5d0ea": "updAmountBonusEnabled(bool)", +"faa5e124": "ref_percent()", +"faa5e74a": "TokenPurchaseWithGuarantee(address,address,uint256,uint256)", +"faa62d3f": "setPercentageToLock(uint256)", +"faa679bf": "TraceToken()", +"faa7fc61": "bustRange()", +"faaa4d22": "distributePCY(address[],uint256,uint256)", +"faaa58da": "RemovePauser(address)", +"faaad90f": "getBlocksUntilNextRound()", +"faaad91d": "convertToPrimordial(uint256)", +"faab806f": "emergencyStopSale(address)", +"faab9d39": "setRegistrar(address)", +"faabc195": "updateContract(uint256,address,uint256)", +"faac90ec": "StorageFactory()", +"faacf0fd": "toChar(bytes1)", +"faad4a49": "setDividends(uint256,uint256)", +"faad6eb5": "updateAgent(address,bool)", +"faadb14a": "getCustomerTxPaymentKWh(address,bytes32)", +"faae4c17": "usernamesToAddresses(bytes32)", +"faaebd29": "Fight_Results(uint256,address,address,uint128,uint128,uint32,uint256,uint32,uint256,uint8)", +"faaf027b": "getAddressTokenSaleId(address,address)", +"faaf1921": "updateEthToCentsRateCycleStarted()", +"faaf71e6": "checkSoftCapOk()", +"faafa08f": "CatICO(address)", +"fab0568c": "GIFTToken(uint256,string,uint8,string)", +"fab14b36": "saleBalance()", +"fab18075": "numLots()", +"fab2c469": "getSlots()", +"fab2cb36": "totalSharesIssued()", +"fab2e425": "GAMESPLAYED()", +"fab2f86b": "stopVoting()", +"fab37154": "setMintAddress(address)", +"fab3be9a": "WETCToken()", +"fab3ebb1": "NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_SET_ID()", +"fab4087a": "parse(bytes)", +"fab425e7": "external_to_internal_block_number(uint256)", +"fab43cb1": "getPongAddress()", +"fab4969f": "amountRaisedPhase()", +"fab4cb39": "getWarrantyPrice(string,uint256,uint256,uint256)", +"fab55a49": "addr_forge()", +"fab57a21": "truebitAddress()", +"fab5ccb1": "submitBlock(bytes32,bytes)", +"fab67bb6": "hasNotEnded()", +"fab825c6": "setCanvasName(uint32,string)", +"fab88d39": "STS(uint256,string,uint8,string)", +"fab8cbe4": "splitTokensBeforeDistribution(uint256)", +"fab93805": "ballotLog(bytes32[2])", +"fab9b243": "isUpgradable(address,address,string)", +"fab9caaf": "JungleScratch(address)", +"fab9f0c4": "DigiWillToken()", +"faba1f16": "_createPow(string,address,uint256,uint256,uint256,uint256)", +"fabacf0d": "Yetxkd1601()", +"fabae696": "updatefxFee(uint256)", +"fabb25fa": "x_constructor(address)", +"fabb7952": "setPaintingName(uint256,string)", +"fabbdc5b": "COIN_COST_ICO_TIER_2()", +"fabc1cbc": "unpause(uint256)", +"fabcc880": "update(uint256,int256[2],uint256[2],int256,bytes32,address,uint256,uint256,uint256[3])", +"fabde80c": "coinBalance(address)", +"fabe1416": "canClaimToken()", +"fabec44a": "getCurrentVersion()", +"fabee62d": "taxTo(address)", +"fabefafe": "computePayout(uint256,address)", +"fabf00c3": "NewGrant(address,address,uint256)", +"fabf5ea5": "maxInvestedLimit()", +"fabf657a": "approveAddress(address)", +"fabfbefb": "lastPayoutIndex()", +"fac08874": "BPTestCoin()", +"fac20ab8": "getGameWinner(uint256)", +"fac2548b": "updateMember(address,uint256,bool,string)", +"fac28349": "setInvite(address,uint256,uint256)", +"fac2b5f8": "setEplay(address)", +"fac333ac": "ids(uint256)", +"fac34ff6": "throwFoo()", +"fac3a4db": "changeWithdrawableNetfRe(uint256)", +"fac3c1f4": "setOracleName(address,string)", +"fac416ab": "PriceThreeEnable()", +"fac50e4c": "StgTwobonusEnds()", +"fac5235b": "teamTokensAllocated()", +"fac52bfd": "my_name()", +"fac57fc9": "hasUpgraded(address)", +"fac5bb92": "getPreRelease(bytes32)", +"fac5fbc7": "ContractDisabled(uint256)", +"fac647cc": "testLongerJson()", +"fac65256": "wavesTokens()", +"fac66f01": "getConditions(uint256,uint256)", +"fac67cf6": "updateVIPRank(address)", +"fac6a8a2": "withdrawExchangesToken()", +"fac6fb16": "getVoteStatusFromProposal(uint256,address)", +"fac6fe0c": "level_6_percent()", +"fac78d83": "tierModifiable(uint256)", +"fac7abe3": "latestAuctionIndices(address,address)", +"fac7b20a": "maxCapTokenTotal()", +"fac8a800": "isTeller(address)", +"fac952c5": "getLastWithdraw()", +"fac97122": "ownerSetJackpotAddress(address)", +"fac9d2c7": "Blockkonnect()", +"faca7cfa": "prevBalance()", +"facaa838": "IsEscrowActive()", +"facb2195": "setIntF1(int256)", +"facbf93b": "totalBlocks()", +"facc7905": "unLockTime()", +"facce5bb": "wingsTokenRewards()", +"facd0934": "BONUS_250_500()", +"facd743b": "isValidator(address)", +"face030b": "SpinTheWheel(address)", +"face873f": "getAllActiveSales()", +"face9e8e": "hash_sha256(string,uint256)", +"facef32a": "IGI()", +"facf55e6": "getMyClones()", +"fad09ab3": "closeProvider(address)", +"fad09c3c": "DemoContract()", +"fad15673": "UmkaToken(string,string,uint8,uint256)", +"fad18e7b": "registerNameXaddrFromDapp(address,bytes32,address,bool,uint8)", +"fad239ac": "PermTokenTest()", +"fad356f8": "testTransferFromSelf()", +"fad35818": "calcInviterBenefit(uint256)", +"fad3f8f7": "maxPreSale()", +"fad4b99a": "updateChannelMinimum(address,uint256)", +"fad4e1f2": "getIDMapping(uint256,uint256)", +"fad5a2af": "isClosedAndValid()", +"fad6049b": "_transferFrom(uint256,address,uint256)", +"fad60615": "roundProfitByAddr(address,uint256)", +"fad774ee": "BONUS_LEVEL_2()", +"fad7ed8c": "_A_tokenSaleCompleted()", +"fad8200e": "userToNumCelebs(address)", +"fad88be7": "VOISE()", +"fad8b32a": "revokeOperator(address)", +"fad9100c": "FOMOed()", +"fad992ea": "claimINRDividends()", +"fad9aba3": "dust()", +"fad9bf9e": "storeBlockWithFeeAndRecipient(bytes,int256,int256,bytes,int256,int256)", +"fada2c18": "transferBond(uint256)", +"fada4b76": "quater3()", +"fada5da1": "collectEth()", +"fadc0700": "InitiateMakes()", +"fadc342e": "_checkRevenueFactor(uint256,uint256,uint256,uint256)", +"fadc51cf": "isAlpha(bytes1)", +"fadc554b": "updateNonClosingBalanceProof(uint256,address,address,bytes32,uint256,bytes32,bytes,bytes)", +"fadcd861": "createMarriage(string,string,string,string)", +"fadcf13c": "startBounty()", +"fadd3235": "gameEndBlock()", +"fadda208": "getMemberAdresse(uint256)", +"fadeb59c": "getListingDB(uint8)", +"fadf4cb2": "batchAssignTokens(address[],uint256[],bool[])", +"fadf4f3b": "GECToken(address,uint256)", +"fadf617b": "reveal(int128,string)", +"fadf87b1": "testGetBitsSuccess()", +"fae14192": "changeFeePercentage(uint256)", +"fae17e21": "createBid(uint256,address,address,address,uint256,uint256)", +"fae21f0a": "initBank()", +"fae24454": "removeFromManagementWhitelist(address)", +"fae25444": "getNumberOfOffers()", +"fae29ee8": "setWebInfo(string,string)", +"fae2dd4b": "myName()", +"fae429af": "NinjaCoinNC()", +"fae4a213": "buyWithAddressAndFunction(address,bytes4)", +"fae53222": "addPlayerGeneral(address,uint32,uint32,uint8)", +"fae59753": "transferOwnershipMessage(address)", +"fae6edcf": "getI2()", +"fae72303": "totalWeiRaisedDuringPhase3()", +"fae73549": "Burnt_Token()", +"fae8529a": "maxprice()", +"fae860db": "transferToLockedBalance(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"fae8c29e": "setPromoPause()", +"fae8f9a2": "setInitialParent(int256,int256,int256,int256,int256,int256)", +"fae92612": "setMarketAddress(address)", +"fae95a71": "participationPresaleHistory(address)", +"fae9c6b3": "preICOTokenRemaining()", +"fae9d06d": "calculateTxFee(uint256,address)", +"faea1878": "cooRemoveCro(address)", +"faea624c": "VestTokens(address,uint256,uint256,uint256,bool,string,uint256)", +"faea9129": "Syndicate()", +"faed08a9": "reLoadXname(uint256)", +"faed1922": "purchaseWhaleCard()", +"faed77ab": "wipeAndFree(address,bytes32,uint256,uint256)", +"faed86ab": "strConcats(string,string,string,string)", +"faede6a1": "Y2_lockedTokenAmount()", +"faee13b9": "set(int8)", +"faee4402": "donateToWhale(uint256)", +"faee4a10": "initialBankroll()", +"faef2ad2": "getCategoryHash(address)", +"faeff650": "phase1TokenPriceInEth()", +"faf0952b": "testThrowRestartNotOwner()", +"faf21148": "ValoremICO()", +"faf236c7": "emitTokensFor(address,uint256,uint256,uint256)", +"faf27bca": "greeter(string)", +"faf3d174": "upgradeStart(address)", +"faf42125": "setTokenURIAffixes(string,string)", +"faf5115f": "setBank(address,address)", +"faf81ba5": "applyBonus(uint256,uint256)", +"faf87b8a": "payoutEF()", +"faf880ad": "SoftcapReached(address,uint256)", +"faf924cf": "proof()", +"faf95e3d": "PayForServiceETHEvent(address,uint256)", +"faf9859c": "NIU(uint256,string,uint8,string)", +"faf9b5cf": "mintSendTokens()", +"faf9f330": "accrueTeamTokens(address,address,uint256)", +"fafa4c82": "defaultTransferGas()", +"fafa8e1a": "removeDat(string)", +"fafaacfa": "hasConfirmed(bytes32,address,uint256)", +"fafb2330": "setPayout(uint256,uint256)", +"fafb3c7a": "giftCar(address,uint256,bool)", +"fafb76dd": "getOffsetIndex()", +"fafb9334": "roll_normal(address,uint256,uint256,bytes32,bytes32,bytes,bytes32,uint256)", +"fafbb62b": "create(string,string,uint8,uint256,address,string,address,address)", +"fafbb9a3": "getNextPayoutTime()", +"fafbcc08": "IBNZDEVELOPERSERC20_Crowdsale()", +"fafc56d9": "setStepTwoRate(uint256)", +"fafcdc34": "dist(address)", +"fafd2efb": "cashoutable(address,address)", +"fafd4bba": "RESERVED_TOKENS_FOR_CRYPTO_EXCHANGES()", +"fafd6bcb": "isConfirmedBy(bytes,address)", +"fafdb3af": "PlayerBalance(uint8,uint256,uint256)", +"fafe029f": "getWtotalTransCnt(uint8)", +"fafe0902": "gift_ClaimTINAmotleyLine(uint256)", +"fafe805e": "BLOCK_PER_PHASE()", +"fafe8845": "StateChanged(uint256,uint8)", +"faff50a8": "rootNode()", +"faff660e": "isPrivate()", +"fb007107": "CanMint(bool)", +"fb00cc67": "search_winner_bid_address(uint8)", +"fb00fec6": "getStatusForRootHash(bytes32)", +"fb0101c4": "getUserSpaceIds(uint256)", +"fb01badd": "companyShares()", +"fb01f4b1": "developerPrizeClaim()", +"fb02191c": "addRepo(bytes32,string)", +"fb03735e": "contractTokenReward()", +"fb03eaea": "getDisputeThresholdForFork()", +"fb048705": "itemOf(uint256)", +"fb04f22c": "secondReleaseDone()", +"fb054439": "canBearWith(uint256,uint256)", +"fb05594f": "STARTING_SHRIMP()", +"fb062a84": "offerOptionsToEmployeeOnlyExtra(address,uint32,uint32,uint32)", +"fb064161": "advisorsAllocation()", +"fb06603c": "modifyToken(address,uint256,string,string,string,string,bool)", +"fb070d0d": "CatFarmer()", +"fb0720dc": "icoStartP1()", +"fb072d2a": "random(uint256,uint8)", +"fb07ac86": "realPriceOracle()", +"fb083fdc": "EtherDelta()", +"fb088558": "contributeWithoutVesting()", +"fb08937c": "tokenTransfer(address,address,address,uint256)", +"fb08f3a1": "whitelistRequired()", +"fb08fdaa": "replaceContract(address)", +"fb099c84": "newInvestor()", +"fb09b1ac": "testBalanceOfReflectsTransfer()", +"fb09c964": "getXQU()", +"fb09db11": "setActiveWhitelist()", +"fb0a0344": "mockBuy()", +"fb0a2e3c": "buyerDecimals()", +"fb0a3867": "updateClientAddress()", +"fb0a8c62": "addGenerator()", +"fb0b0220": "outFromPool(uint256)", +"fb0b02cd": "destroyBucket(bytes32)", +"fb0b6b6d": "confirmTransactionByMediator(uint256)", +"fb0c0782": "buy2(uint256)", +"fb0c1faa": "LearnX()", +"fb0cf7ab": "getStagePrice(uint8)", +"fb0d7e43": "initialBonus()", +"fb0f6f42": "s1(bytes1)", +"fb0f9363": "getAuctions(address)", +"fb0f97a8": "depositToken(address,address,uint256)", +"fb0fcd8c": "triggerRselfdestructRefund()", +"fb101581": "transferToCharity(address)", +"fb10b0d3": "currentMaximumSalePercentage()", +"fb114f57": "oraclize_query(uint256,string,string[3],uint256)", +"fb11613e": "getGamesByDay(uint256)", +"fb1161f1": "bountyCap()", +"fb1291c3": "getPixels(bytes32)", +"fb12ee85": "amountOfOpenRFQs()", +"fb13a707": "changeVestingWhitelister(address)", +"fb13bfae": "getFreezeInfo(address)", +"fb1478e5": "changeSaleEndBlock(uint256)", +"fb14cbca": "check(bytes32,uint256,address,uint32,uint32,bytes32[])", +"fb14f058": "addVestingAdmin(address)", +"fb15e737": "boolToBytes32(bool,bool)", +"fb1641d6": "rejectGame(address,uint256)", +"fb1669ca": "setBalance(uint256)", +"fb1684f9": "lockTextKey(string,uint256)", +"fb171eac": "witdrawToken(address,uint256)", +"fb173712": "SetRate(address,address,uint256,uint256)", +"fb176b69": "paleyer1show(uint8,uint8,uint8,uint8,uint8)", +"fb17905f": "DemolishByCredits(uint256,uint256)", +"fb18962d": "setSoftwareTokensPercent(uint256)", +"fb1ace34": "notarize(bytes)", +"fb1ae783": "getWinnerTeam(uint256)", +"fb1bc4d7": "PsExToken()", +"fb1c3461": "_calculatePercent(uint256,uint256)", +"fb1ce13a": "TestEOSCoin()", +"fb1ce2ea": "NotifyMe(address,uint256)", +"fb1d8201": "addClaim(uint32,string,string,bytes)", +"fb1d9eea": "transferFundsTokens(address,address,uint256)", +"fb1db11f": "updateEarlyParticipantWhitelist(address,address,uint256)", +"fb1de995": "solveTask(uint256,uint256,uint256,int256,uint256,int256)", +"fb1e3804": "FULL_TOKEN_AMOUNT()", +"fb1e61ca": "getRequest(bytes32)", +"fb1f41f9": "info_OwnerTINAmotleyLine(uint256)", +"fb1fad50": "halt(uint256)", +"fb1fdc2e": "lengthNotEqual(address[],uint256,string)", +"fb2004f2": "BCOExtendedToken(address,string,string,uint256,uint256)", +"fb203f90": "ShopereumTokensPerEther()", +"fb20b70d": "setBonusDate2(uint256)", +"fb20d071": "registerVestingSchedule(address,address,uint256,uint256,uint256,uint256,uint256)", +"fb20d98f": "deleteEditor(address)", +"fb20dc80": "setPriceForVerification(uint256)", +"fb213549": "confirmApplication(address)", +"fb21364b": "allocate2ProjectToken()", +"fb214f4c": "presetGymTrainer()", +"fb218f5f": "storeData(string)", +"fb21eefd": "fwdData(address,bytes)", +"fb222d48": "extractVaultTokens(address,address)", +"fb236bba": "_deleteOffer(uint256)", +"fb237eb2": "isUserWhitelisted(address)", +"fb23bbb1": "BONUS_WINDOW_3_END_TIME()", +"fb241406": "RedPen()", +"fb25b62c": "LineToken()", +"fb2643c0": "DragonKing(address,address,uint8,uint8,uint8,uint16[],uint16[])", +"fb26c00f": "Treasury(address)", +"fb26c3f8": "minimumPresaleWeiDeposit()", +"fb26e2d8": "tgrStartBlock()", +"fb274654": "offerCollectibleForSaleToAddress(uint256,uint256,int256,uint256,address)", +"fb277a24": "testMintInvalid(int256)", +"fb27961c": "softCapAmount()", +"fb279ef3": "tip(uint256,address,uint256)", +"fb282a17": "distributeCallback(uint256,address[])", +"fb282f92": "solveGame(uint256,uint256)", +"fb283111": "setRunSwitch(bool)", +"fb2861ff": "MINTTIME()", +"fb2898e4": "startSaleDepo(uint256)", +"fb28be72": "SetupQPY(string,string,uint256,uint256,uint256,address,address,uint256)", +"fb293a34": "backGamePlayerCoinOwner()", +"fb29aa97": "getNumLoveItems()", +"fb2c95b6": "PlayX3()", +"fb2cb34e": "transferPaused()", +"fb2dfa45": "getKitties()", +"fb2e0078": "withdrawalFunds(bool)", +"fb2e3240": "setDOwnerFromClaim(bytes32,address)", +"fb2ee901": "getBattleFee()", +"fb2eff20": "PhoenixFund()", +"fb2f3a8a": "MAX_BOUNTY_SUPPLY()", +"fb2f5064": "getPendingTokens(address)", +"fb2fbf49": "registerEOSAddress(string)", +"fb305569": "UbiqIssued()", +"fb30d070": "setNewAge(int256)", +"fb31a6cc": "executeOffer(address)", +"fb31b262": "VuePayTokenSale()", +"fb31ff37": "getFullRecord(bytes32)", +"fb3220fe": "addNodalblockData(string)", +"fb3296ea": "transferFromNA(address,uint256)", +"fb32ade3": "releaseLockedTokensFor(address)", +"fb32aedb": "voteB()", +"fb32f4f5": "ARK_FLAGGER_1_00()", +"fb3458d1": "extractElementsFromGene(uint256)", +"fb346eab": "totalSpent()", +"fb34d075": "channelCloseTimeout(uint64)", +"fb34fc6f": "WatchNextBlockReward()", +"fb350502": "calculateWalletTokens()", +"fb35370b": "transferDari(address,address,uint256)", +"fb3551ff": "getAgent(address)", +"fb357f74": "EBLLToken(address,uint256)", +"fb35a4ba": "KKToken(uint256,string,uint8,string)", +"fb35b4e4": "totalDeployments()", +"fb35d545": "unlockDate4()", +"fb3650c2": "grab(address[],uint256[])", +"fb368e8f": "getServiceName(bytes32)", +"fb36eba1": "createCard(address,uint16,uint16)", +"fb36fae4": "setJpycContactAddress(address)", +"fb37baa1": "whitelistUserForTransfers(address)", +"fb386216": "getSeatAddress(uint256)", +"fb38ec94": "founder3()", +"fb3918d7": "fillReserve()", +"fb3979f0": "updateAccountChartAgainstExistingEntity(address,uint256,uint256,uint256)", +"fb3a1fb2": "getReleaseDb()", +"fb3a3ff3": "HODLERAddress(address)", +"fb3ab12b": "setEndSale(uint256)", +"fb3b11af": "CWCCToken()", +"fb3ba9b3": "LogNewBlacklistedAddress(address,address)", +"fb3bc400": "myProfitsReceived()", +"fb3c0d70": "transferFromToken(address,address,address,uint256)", +"fb3d8b6e": "SiringClockAuction(address,address,uint256,uint256)", +"fb3dc0b3": "Leader(string,address,bytes32)", +"fb3ea59b": "acceptBatched(address[],bool)", +"fb3ed5c7": "airdropSupply()", +"fb3f1fd6": "nextroundblocksbeforenewpay()", +"fb3f4d29": "tokenApprove(address,address,uint256)", +"fb3f71c8": "addContract(address,uint256,string)", +"fb3fd6a1": "m_bIsLock()", +"fb402c26": "BuyTokensWithTokens(address,address,uint256,uint256)", +"fb40340d": "totalNormalTokenGenerated()", +"fb40c22a": "getAllCases()", +"fb4101c0": "reward(address,bytes32)", +"fb43b2a2": "approveBreeding(address,uint40)", +"fb43d9f4": "getTotalValue(address[],uint256[],address)", +"fb441663": "claimExit(address[],uint256[],bytes,bytes,bytes32)", +"fb4460dd": "getVoterStakes(address,uint256)", +"fb45d080": "pieBalanceOf(address)", +"fb468340": "getTotalMember()", +"fb46d4c5": "tweet(string)", +"fb46d5b1": "awardCyclePrize()", +"fb46f492": "emissionMas(address[],uint256[],bytes32[],uint256[])", +"fb470a92": "FlukeCoins()", +"fb471ce5": "ERC223Transfer_enabled()", +"fb47a067": "_getRevisionBlockNumber(bytes20,uint256)", +"fb486250": "confirmOwner(uint8)", +"fb486c7b": "setGivenName(uint256,string)", +"fb48ca1d": "NewSuggestion(address,string,uint256)", +"fb48cf0e": "getVoter(uint256,uint32)", +"fb490695": "griefCost()", +"fb497ad2": "stage_1_TokensSold()", +"fb49dc4a": "AEFFTOKEN()", +"fb4a18a2": "setCrowdfundPayout(address,uint256)", +"fb4a6cde": "StarbaseEarlyPurchase()", +"fb4a86bc": "amountToBeRaised(bytes32)", +"fb4aa0a1": "fundReceiver()", +"fb4b7693": "sendSeedAndHash(string)", +"fb4cd8e2": "numBidders()", +"fb4ce0a9": "addAssetsOwner(address)", +"fb4da5b7": "pay(address,string)", +"fb4fbcd8": "getClaimTradingProceedsWaitTime()", +"fb4fd984": "requestPrize(bytes32,uint8,bytes32,bytes32)", +"fb50aec5": "getVendorApplicationStatus(string)", +"fb51a1ea": "read_total_purchased_today(address)", +"fb5209bf": "trickleUp(address)", +"fb524c32": "GetMaximumBet()", +"fb5274e5": "generateWinners()", +"fb54047c": "getCustomExtraData(bytes32,uint256,bytes32)", +"fb557c8c": "PrideToken()", +"fb5589b4": "memCopy(uint256,uint256,uint256)", +"fb55d09d": "EtherGames()", +"fb55ed2a": "transferBlocToUser(address)", +"fb58674d": "Npole()", +"fb598f87": "createPost(uint256,uint256)", +"fb5a3282": "restFinish(address)", +"fb5b82d0": "setCollector(address)", +"fb5bd32b": "withdrawDevBalance()", +"fb5d5729": "getPongvalTransactional()", +"fb5d5999": "getDepositary_function_control()", +"fb5d7376": "step4()", +"fb5e6a76": "WithdrawMulti(uint256,address[])", +"fb5f39dd": "offlineSell(address,uint256)", +"fb5f8a13": "changeAddressKnight(address)", +"fb5fef42": "distributeALCToken()", +"fb6021ae": "ICO(string,string,uint8,uint256)", +"fb60938f": "getSumAmountOfSuccessfulDeals()", +"fb6139b5": "setServerFee(string,uint256)", +"fb6168ac": "BUY_ME()", +"fb621f14": "getSecurityTokenAddress(string)", +"fb6287d2": "setWalletAddresses(address,address,address)", +"fb62e083": "addWhiteListed(address)", +"fb632ef9": "transferrableBalanceOf(address)", +"fb63c4fc": "MESSAGE_PRICE()", +"fb63e4b1": "CEZA(uint256,string,string)", +"fb640453": "_getTotalBmcDaysAmount(uint256,uint256)", +"fb644a14": "Force(address)", +"fb64e072": "recordTransfer(address,address,uint256,uint256)", +"fb64e6b1": "icoAddr()", +"fb656067": "genesisCallerAddress()", +"fb659c3a": "addArticleItem(uint256,bytes)", +"fb65a1a3": "teamdistr(address,uint256)", +"fb65a3cb": "createCampaign(bytes32,uint256,address)", +"fb65e4b1": "Contribution()", +"fb674cf4": "emissionEnabled()", +"fb67983c": "fuckingClaim1(bytes,bytes)", +"fb687c24": "refundMethodABI()", +"fb68a3be": "printTokens(uint256)", +"fb68aa89": "hasInitCard1()", +"fb690dcc": "donated(address)", +"fb6a53d2": "multiBurn(uint256[])", +"fb6aeb42": "PRE_PUBLIC_LOCKUP_PERIOD()", +"fb6b18c0": "totalAirDrop()", +"fb6b3857": "transfer_to_session(uint32,uint32,uint64)", +"fb6b4afd": "getWeaponModel(uint256)", +"fb6bbbce": "Crowdsale()", +"fb6c2b6f": "stopMarket(uint32)", +"fb6cae8e": "NetkillerToken(uint256,string,string,uint256)", +"fb6d0e8f": "pullShares(address)", +"fb6e155f": "availableVolume(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", +"fb6e6558": "holderNumber(address)", +"fb6f6875": "deleteHotel(address)", +"fb6f71a3": "setCharity(address)", +"fb6f93a4": "setEthUsdRate(uint256)", +"fb6f9579": "Increase()", +"fb702ed1": "multiDistribute(uint256[])", +"fb7043ea": "isRefundPossible()", +"fb709d2e": "charities(uint256)", +"fb70f765": "foundationTokenSupply()", +"fb70ff96": "increasePieceCount(uint256)", +"fb71807f": "setUser(string,string,bytes32,uint256,uint256,uint256[],string,string)", +"fb719113": "deathData_f17()", +"fb7248cb": "playerGuess(address,int16)", +"fb72d24e": "shift_right(uint64,uint256)", +"fb72fdfe": "setTotalAllowed(address,uint256)", +"fb73a593": "modifyAllLevelCaps(uint256[],uint256)", +"fb741504": "IndividualCapCrowdsale(uint256,uint256)", +"fb7450be": "setBtcToken(address)", +"fb74da7e": "setTentativeWinningPayoutDistributionHash(bytes32)", +"fb74e6f7": "ADVISOR_STAKE_FOUR()", +"fb756f97": "Tokenomicx()", +"fb75b2c7": "rewardWallet()", +"fb77269e": "periodITO_period()", +"fb77378a": "SCOOP()", +"fb775b46": "giver()", +"fb77eae2": "startTimeSaleWithBonus()", +"fb78eb53": "Oncology()", +"fb78f85c": "mgrCount()", +"fb791b0b": "withdrawOrder(uint256)", +"fb794281": "gas_amount()", +"fb79e70f": "superNovaSupply()", +"fb7a2c1f": "addQuestion(string,uint256,uint256,string)", +"fb7a5f4f": "getEndBlock()", +"fb7a809c": "buyStageDataRecord(uint256,uint256,uint256,uint256,uint256,uint256)", +"fb7ae31e": "getCurrentRoundLeft()", +"fb7baf70": "initRegistMatch(uint8,uint8,uint8,uint256)", +"fb7c0a3f": "doBuy(uint256)", +"fb7cb850": "setMaxMerge(uint8)", +"fb7cf694": "buyPriceInWei()", +"fb7e54eb": "vcx()", +"fb7e7456": "endOfLockProjectToken()", +"fb7f21eb": "logo()", +"fb80d66f": "SQR_TOKEN_MULTIPLIER()", +"fb80fe9e": "test(uint256,address)", +"fb81299b": "setAllMarketsFinalized(bool)", +"fb815503": "withdrawWin()", +"fb81563b": "SpaceImpulseERC20()", +"fb84da41": "createSketch(string,string)", +"fb850fab": "newCampaign(uint32,uint256)", +"fb8621df": "push(bytes32,string,bytes)", +"fb8632b8": "availableEmission()", +"fb867165": "getSaveData(address)", +"fb86a404": "hardCap()", +"fb87bf7b": "LLX()", +"fb87d5ea": "TransactionRequest(address[4],address,uint256[11],uint256,bytes)", +"fb87eb0b": "setRefundsActive(bool)", +"fb88e7c1": "updateBestPromouter(address,uint256)", +"fb890a17": "YUPToken(address,address,address,address,address)", +"fb89fb28": "yield7Day()", +"fb8a5bf8": "H2OC()", +"fb8a5f1c": "createTransaction(address,uint256,bytes32,address,address)", +"fb8b0197": "claimReceivables(address[])", +"fb8bc297": "getInvestorPackPrice()", +"fb8c7420": "GetRandomNumber()", +"fb8dd3bb": "createEvent(bytes32,bytes32[],address,uint256,uint256,uint256,uint256)", +"fb8e4f1a": "BountyChanged(uint256)", +"fb8e7870": "buyKebabs()", +"fb8e82b4": "min(uint32,uint32)", +"fb9073eb": "reLoadXname(bytes32,uint256)", +"fb913d14": "sendByTranche(bytes32,address,uint256,bytes)", +"fb920ad1": "reclaimAndBurn(address,uint256)", +"fb92488b": "ChangePrice(uint256)", +"fb92507d": "daytime(uint256)", +"fb92e4fb": "_isGoodAddress(address)", +"fb932108": "distribute(address,uint256)", +"fb950559": "getAffiliation(address)", +"fb950a7f": "addGrantableAllocation(address,uint256,bool)", +"fb95adeb": "testFailBlockhashInsuffiecientFee()", +"fb95d9e7": "addConfigEntryAddr(bytes32,address)", +"fb961571": "ICOStartBlockChanged(uint256)", +"fb969b0a": "bootstrap()", +"fb9734fc": "confirmProposal(address,bytes32,uint256)", +"fb979ba2": "ROUND_1_PRESALE_BONUS()", +"fb97b61f": "lpAskVolume()", +"fb98a409": "skinContract()", +"fb990288": "_newInterest(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"fb9a0c58": "startRefundProcess(uint256)", +"fb9a2ce2": "getSellPosition(bytes32,uint256)", +"fb9a4595": "GitHubBounty()", +"fb9ab10b": "EpsToken()", +"fb9b4ab8": "createrAddress()", +"fb9ba033": "checkAllowedAddressForMinting(address,address)", +"fb9ba7bc": "removeAccreditedInvestor(address)", +"fb9bbeaf": "RaiSed()", +"fb9c7303": "completeInvestment()", +"fb9ca16b": "MarianaKey(uint256,string,uint8,string)", +"fb9cb15d": "numChipsMinted()", +"fb9dd851": "getGameInfoByIndex(uint256)", +"fb9ded46": "totalWeiRaisedDuringICO3()", +"fb9e1270": "investmentIdLastAttemptedToSettle()", +"fb9ec0a8": "assignPersiansToBattle(uint256)", +"fb9efcf0": "setCustodianForeign(address)", +"fba06849": "fipsPublishDataMulti(bytes20[],bytes)", +"fba07791": "fiatCost()", +"fba0aa5b": "txFeeSentInWei()", +"fba0ce5e": "setLinkedIn(string)", +"fba12c17": "minerLockAddress()", +"fba13bd0": "depositBalanceOf(address)", +"fba17fc9": "Flye()", +"fba246de": "DepositETH()", +"fba26207": "setUint64(int64,uint64)", +"fba2a2d2": "setPeriod(uint16)", +"fba2b18b": "_getplayersurplus()", +"fba2fb66": "newPolicy(bytes32,bytes32,uint256,uint256,uint8,bytes32)", +"fba36b31": "payWithRef(address)", +"fba4734f": "withdrawEthereum(uint256)", +"fba4abb2": "payoutBalanceCheck(address,uint256)", +"fba52ff1": "getInvestorClaimedTokens(address)", +"fba5de1c": "cancelGetTogether()", +"fba5ee24": "getSinistre_effectif()", +"fba5f1f6": "weaponModels(uint256)", +"fba6651c": "getCommunityTaxes(uint256)", +"fba6748c": "getMaxPrivateSaleBuy()", +"fba6e51b": "_getFinalAddress(uint256[],address[],uint256)", +"fba70381": "adventureByToken(address,uint256,uint256,uint256,uint64,uint64)", +"fba71fe9": "periodICOStage6()", +"fba74490": "PoseidonQuark()", +"fba779f6": "armyHelicoptersCount(uint256)", +"fba79777": "test1cash()", +"fba7c1ab": "addMake(string,address,uint256,uint256)", +"fba7cc79": "getIsActive()", +"fba83066": "topSalesRatio(uint16)", +"fba84b2a": "LjwStandardToken()", +"fba90629": "totalSupplyPrivateSale()", +"fba906c5": "HiroyukiCoin()", +"fba939f8": "_goal()", +"fba9ce40": "donateToDev()", +"fba9cea9": "someAction(address)", +"fba9dbbb": "chnageSpecialFeeTake(uint256,address,uint256,uint256)", +"fba9ecac": "getFreeBanker()", +"fbaa0ece": "weekTwoRate()", +"fbaa6050": "getApprovalRequirement(bytes4)", +"fbaa89d3": "LogBidRemoved(address,uint256)", +"fbabc444": "PeaceChainToken(uint256,string,string)", +"fbabdb06": "disapprove(address,uint256)", +"fbac3951": "isBlocked(address)", +"fbac7d1d": "setCampaign(bytes32,uint256,uint256,uint256,uint256,bool,address)", +"fbac89f6": "unlock(bool)", +"fbacc43f": "getBases()", +"fbad8983": "sendyum(address)", +"fbae5e7d": "Investors(uint256)", +"fbaeac89": "newOwnerAPI()", +"fbaf094a": "provider(address)", +"fbaf12a7": "_removeBlacklistedUser(address)", +"fbb0eb8b": "mintingNonce()", +"fbb11f29": "setTokenGbi(address)", +"fbb1c5c4": "XBCOMMUNITY()", +"fbb26d00": "releaseBasicAccount()", +"fbb39f6e": "offerTrade(uint256,uint256)", +"fbb4d51b": "OverseasReturneesUnion()", +"fbb4dc6b": "secondMonthEnd()", +"fbb4f0e3": "NuToken()", +"fbb58c5c": "STARTING_FALCON()", +"fbb5d52d": "sellCoinsToICO(uint256)", +"fbb5f682": "KUNTEStandardToken(uint256,string,uint8,string)", +"fbb6272d": "tokens(uint32)", +"fbb65708": "freedWinPoolForSecondStage()", +"fbb78719": "private_setmaxBet(uint256)", +"fbb8932a": "getSeatMessage(uint256)", +"fbbb75c5": "getClaimedOwners()", +"fbbc3448": "getWrefundIndex(uint8)", +"fbbcb4de": "GointoMigration(address)", +"fbbd6545": "pushHatch(address,uint32,uint16,uint16)", +"fbbdb68c": "hiddenOwner()", +"fbbdbf22": "_setTimes()", +"fbbe20a9": "breeding(uint256,uint256)", +"fbbe7887": "NewBOP(address,address,uint256,uint8,uint256,string)", +"fbbedf5c": "ERC20Token(string,string,uint8,uint256)", +"fbbf119b": "BTCCCoin()", +"fbbf93a0": "getDetails()", +"fbbfa45e": "destory(address)", +"fbbfe830": "refundTokenHolder()", +"fbc00b4a": "GACC()", +"fbc032ab": "GCFcoinF(uint256,string,string)", +"fbc09b26": "m_totalDatasetCount()", +"fbc34d1c": "artistsArtworkCount(address)", +"fbc3d0ef": "frozenReserveTeamWallet()", +"fbc402fc": "updateDarknodeBond(address,uint256)", +"fbc44458": "setTransferAuthorizations(address)", +"fbc449a7": "FirstContract()", +"fbc47e56": "tokenListContract()", +"fbc4f981": "ReceivedBTC(address,uint256,string)", +"fbc53c8e": "Arascacoin(uint256,string,string)", +"fbc5db95": "lowestAskTime()", +"fbc6c0f0": "firstChipBonus()", +"fbc6d0ff": "confirmTransactionWithSignatures(bytes32,uint8[],bytes32[])", +"fbc6d545": "ADST()", +"fbc7ad3e": "finishedLoading()", +"fbc805ee": "changeMaximumContributionForAllPhases(uint256)", +"fbc80af6": "FakeNewsToken()", +"fbc8aafe": "delegateExecute(address)", +"fbc94bd1": "icoFinishInternal(uint256)", +"fbc94f24": "changeTokenPrice(uint256)", +"fbc990d0": "_removeMember(address)", +"fbc9c601": "requestAccess(address,int256,address)", +"fbca1c9d": "get_charge()", +"fbca6ba6": "maintenance(uint256)", +"fbcbc0f1": "getAccount(address)", +"fbcc3775": "isMyWalletLocked_Send()", +"fbccc2b1": "setBoolF1UintF1StrF2Intf3(bool,uint256,string,int256)", +"fbcebd02": "delegatedRefund(address)", +"fbcece85": "freeTokens(address,uint256)", +"fbceff0e": "WangWangCoin(uint256,string,uint8,string)", +"fbcf1594": "UNLOCK_TEAM_2()", +"fbcfa0d7": "createCard(string,uint256,address,address,bool)", +"fbd06cb6": "s42(bytes1)", +"fbd0c5d7": "SaleClockAuction(address,address,uint256)", +"fbd0e7df": "Reimburse()", +"fbd15163": "lengthMessages()", +"fbd18b58": "setBlockBalance(uint256,uint256,uint256)", +"fbd1df54": "TotalCount()", +"fbd1eb7b": "deployAgentWallet()", +"fbd22407": "EscrowRaj()", +"fbd275f8": "randomGen(address,uint8)", +"fbd2dbad": "previousDelegates(uint256)", +"fbd395f8": "pauseToken(uint256)", +"fbd3c51a": "left83(uint256)", +"fbd3d51b": "setMasterAddress(address,address)", +"fbd4200c": "base_token_is_seeded()", +"fbd42e0f": "releaseLockedTokens()", +"fbd4e0f0": "chkdrawadm(address)", +"fbd54a63": "sendAmount(address[],uint256)", +"fbd59425": "ETLToken()", +"fbd668a9": "setMaxProfit(uint256)", +"fbd6d77e": "addCoordinator(address)", +"fbd6fdde": "reLoadCore(uint256,uint256)", +"fbd70768": "___setProxyOwner(address)", +"fbd7b853": "setTokenSupplyLimit(uint256)", +"fbd7c5f1": "priceT3()", +"fbd7d081": "TOKEN_HODL_3M()", +"fbd81564": "logger(string)", +"fbd902f2": "_distributeTokenToPurchaser(address,address,uint256)", +"fbd95a39": "sendToAddress(address,address,uint256)", +"fbd9c625": "changeAddressPaladin(address)", +"fbd9c902": "vendi()", +"fbda68e2": "numberOfMessages()", +"fbdafaf9": "getInvestorAtIndex(uint256)", +"fbdb70fb": "KRWT()", +"fbdbad3c": "lastCompletedMigration()", +"fbdc03fe": "nettingContractsByAddress(address,address)", +"fbdc562a": "setCanChange(bool)", +"fbdd3982": "s17(bytes1)", +"fbdd7852": "Ownership()", +"fbdd8508": "PriceAccepted(uint256,uint256)", +"fbdda15a": "isTrustedContractAddress(address)", +"fbde47f6": "FEE_RANGE()", +"fbde5b64": "gameLength()", +"fbde8ad4": "pStartBlock()", +"fbde8d75": "manualWithdrawTokens(uint256)", +"fbdeecab": "endTimePreIco()", +"fbdf0378": "getAllChildren(bytes32)", +"fbdf45c8": "ZoosCoinToken()", +"fbe00e8e": "receiveEtherFromGameAddress()", +"fbe04e1c": "boolFunc(bool,bool,bool)", +"fbe0508c": "toggleActive(bool)", +"fbe093dc": "targetFeePeriodDurationSeconds()", +"fbe0fa4b": "checkDivsMgView(address)", +"fbe2e125": "addBet(uint256,uint8,uint256,bool)", +"fbe334f8": "getNumFulfillments(uint256)", +"fbe3462c": "minBuyRateInPrecision()", +"fbe3549c": "addWeight()", +"fbe38ffb": "canEscapeTo(uint32,int256,uint32)", +"fbe3bb40": "TSTOraclzAPI()", +"fbe3e1a2": "_setCap(uint256,string)", +"fbe413e4": "createMember(address,bytes20,uint64)", +"fbe45b48": "unitPLATCost(uint256)", +"fbe5ce0a": "removeOwner(address,address)", +"fbe5d87e": "getTotalCollected()", +"fbe6529f": "findOldest()", +"fbe6a9b2": "winners_count()", +"fbe7913f": "Accept_Payment()", +"fbe89965": "GoldenCoinToken()", +"fbe8dab9": "getProfitForDay(uint256,uint256)", +"fbe9bb6d": "_isValidDepositCountry(uint256,uint256,uint256)", +"fbeaa807": "RefundSent(uint256,address,uint256)", +"fbeaaed2": "VersionedAgreementControll()", +"fbeac9c9": "setRefBonus(address,uint256)", +"fbeaebc6": "murder()", +"fbeb89dd": "tournamentContract()", +"fbebc9af": "getPixelAuthor(uint32,uint32)", +"fbec4769": "MatchpoolAdministrator()", +"fbec51bc": "requestRedemption(address)", +"fbec6f21": "gold()", +"fbec9121": "maxRandom(uint256)", +"fbece99f": "abortive(uint256,uint256)", +"fbee7b58": "giftIsFrom()", +"fbeecb47": "safeTransferByContract(address,address,uint256)", +"fbeee7e4": "isPeriodClosed(uint256)", +"fbef0195": "_calcDelta(uint256,uint256,uint256,uint256)", +"fbef957b": "ada()", +"fbf05e69": "GasLog(string,uint256,uint256)", +"fbf0ade1": "setOwnerFee(uint256)", +"fbf0f7da": "buildOutAddress()", +"fbf184c6": "getBankermasterReq()", +"fbf1a44b": "holyBountyFundDeposit()", +"fbf1f78a": "unapprove(address)", +"fbf22dea": "issueSoftcapToken(address,address,uint256)", +"fbf2360c": "isMessageEnabled()", +"fbf2dd6a": "depositTokensForAccount(address,address,address,uint256)", +"fbf350e2": "TokenBBBasic()", +"fbf3c88d": "getSignedPublicEncKey(address)", +"fbf405b0": "pinakion()", +"fbf42072": "CashPoints1()", +"fbf44a1b": "setOraclizeGas(uint256)", +"fbf552db": "hint()", +"fbf561fe": "developer_add_address_for_A(address)", +"fbf58b3e": "transfer(string,address)", +"fbf69367": "FuleexToken()", +"fbf788d6": "cash(address,uint256,uint8,bytes32,bytes32)", +"fbf7980f": "setChainsAddresses(address,int256)", +"fbf7ba65": "claimExploreItem(uint256)", +"fbf7e985": "ExaUSD()", +"fbf80773": "isUserRoot(address)", +"fbf82d31": "WorldWideCoin()", +"fbf9180e": "getLastAuditTime(address)", +"fbf92322": "getPoolSizeQspWei(uint256)", +"fbf94ce1": "GlaidexToken()", +"fbf9dab7": "getBetters()", +"fbf9dc12": "GoldBank()", +"fbfa49a8": "icoWithdraw()", +"fbfa4b7f": "requestsCount()", +"fbfa77cf": "vault()", +"fbfb76c4": "GUAEX(uint256,string,string)", +"fbfb77d7": "setArquivo(bytes)", +"fbfb7e70": "market_WithdrawForSale(uint256)", +"fbfb8b02": "createMintRequest()", +"fbfbb62e": "BASE_CLB_TO_ETH_RATE()", +"fbfc1653": "XBLToken()", +"fbfca20b": "_Send_Bettings_to_Winner(uint256,uint256)", +"fbfd1da4": "getKeccak256Uint(uint256,uint256)", +"fbfd45f5": "PRE_SALE_START_2()", +"fbfd90cb": "finishBurningByCreator()", +"fbff728f": "HodboCrowdsale()", +"fbffb355": "testBitsEqualFailIndexOOB()", +"fc00234e": "icoStage()", +"fc006216": "MODICOIN()", +"fc01157c": "firstCrowdSaleEndDate()", +"fc017495": "EmployeeOptionsExercised(address,address,uint32,bool)", +"fc018c05": "makePublic()", +"fc01987b": "setLockAccount(address)", +"fc01abbe": "stringToBytes32(string,string)", +"fc01ce83": "increaseClaimsBalance(address,address,uint256)", +"fc01dfbb": "mintUpto(address,uint256)", +"fc0262e0": "CpublicGold()", +"fc02c1df": "assertExpectations()", +"fc03441c": "allDecimals()", +"fc034bd8": "getPoolOwners()", +"fc036d7c": "SECURITY()", +"fc037776": "assertEq31(bytes31,bytes31)", +"fc03c7ec": "setLockend1(uint256)", +"fc03fb11": "MacBookOracle()", +"fc043830": "getNetworkFee()", +"fc043cad": "setPullPaymode()", +"fc04771a": "RT()", +"fc04a2ec": "_getOriginAddressHash(address,address,string)", +"fc04c0c4": "partnerTransfer(uint256,bytes32,address,uint256)", +"fc04c62e": "offerAsSacrificeFromVault(address)", +"fc05a6fc": "getPeopleBeforeMe(address,address)", +"fc06013a": "updateTokenEmission(uint256,uint256,uint256,uint256)", +"fc0656c9": "candyTokenAddress()", +"fc06a877": "createApp(string,uint256,string)", +"fc06d2a6": "sunrise()", +"fc078bd4": "GDCAcc05()", +"fc0808e5": "bet_MIN()", +"fc091b71": "MitCoin()", +"fc09ff9e": "submitTransaction(address,string,string,uint8[],bytes32[],bytes32[])", +"fc0a39b7": "isJackpot(bytes32,uint256)", +"fc0c3460": "CryptoSoft()", +"fc0c38a7": "Dsocial()", +"fc0c50fe": "getCallPtr()", +"fc0c546a": "token()", +"fc0d0117": "masterWallet()", +"fc0dce74": "ATL(address)", +"fc0e3d90": "getStake()", +"fc0e4262": "___AllBalance()", +"fc0e64de": "setInitialGasForOraclize(uint256)", +"fc0e74d1": "shutdown()", +"fc0ea853": "processWithITG(address,uint256)", +"fc0f392d": "activateSafeMode()", +"fc100eb2": "inxToken()", +"fc10655e": "actual_feedin()", +"fc10881a": "CXCoin()", +"fc108f70": "GamblerPerAddress(address)", +"fc10d4d5": "getFeeRecipientById(uint256)", +"fc11f71c": "setInstructor(address,address,uint256,bytes16,bytes16)", +"fc122892": "deleteOpenAction(string,address,string)", +"fc12c7da": "blocknumbersOf(uint256)", +"fc12dfc7": "weiDelivered()", +"fc13440c": "HealthCharityToken(uint256,string,uint8,string)", +"fc136941": "EmergencyWithdrawalProposed()", +"fc13a76a": "testFailAddForeignChildNotInUse()", +"fc14230f": "wei2euroCents(uint256)", +"fc143f2b": "defrostOwner()", +"fc14a47c": "CTBToken()", +"fc14ed71": "updateForSale(uint256)", +"fc157b13": "getOrganFunction(uint256)", +"fc15dcef": "resAmount()", +"fc1711f2": "setWeight(uint256)", +"fc176c4c": "getAdsCountByUser(address)", +"fc177bd6": "resetArray()", +"fc178f2a": "MoonTokenERC20(uint256,string,string)", +"fc17ce26": "Panthercoin()", +"fc17d2ac": "setFunctionEightPrice(uint256)", +"fc184fff": "addPhenomenon(string,string,string,uint8)", +"fc190261": "getIntervalsForWindow(uint256,uint256,uint256,uint256,int256)", +"fc190d6e": "newUpdate(string,bool)", +"fc192fb0": "setMinimumWithdrawal(uint256)", +"fc196cf3": "getNoInvestor()", +"fc1a1110": "currentLiquidInDeal()", +"fc1a142d": "adPriceHour()", +"fc1a3f0a": "decreaseTokenLock(address,uint256)", +"fc1adfdf": "invest(address,uint256,uint256,uint256)", +"fc1b8a7e": "richestPlayer()", +"fc1b9286": "rewardActivityEnd()", +"fc1c01b2": "setCrowdsaleParams(uint256,uint256,uint256)", +"fc1c2180": "setHotWalletAddress(address)", +"fc1c32fa": "fundariaBonusFundAddress()", +"fc1c5218": "RemoveOpenOrder(uint32)", +"fc1c9620": "depositOrWithdraw(address)", +"fc1da46a": "parcipateCrowdsaleAll()", +"fc1dfdf1": "extraData1FromHash(string)", +"fc1e1a32": "NetfBalance()", +"fc1e2ce9": "getGameAmounts(uint256)", +"fc1eb4d1": "withdrawPoly()", +"fc1ed437": "initialAmount()", +"fc1f2a70": "Add(uint256,string,string)", +"fc1f2d46": "setAllowTransferWhitelist(bool)", +"fc1f5c9c": "personalSegmentHash(string,uint256,bytes32)", +"fc1f5e53": "resetTimeLockValue(address)", +"fc1f7652": "_isBoardMember(address)", +"fc200a55": "mintWithTimeLock(address,uint256,uint256)", +"fc201122": "_setOwner(address)", +"fc204334": "sendAwardToLastOne()", +"fc207c8f": "periodAt(uint256)", +"fc21fa40": "getAmountByCurrency(uint256)", +"fc223410": "doBet(uint256[],uint256[],uint256[],uint256)", +"fc22545c": "getPreICOFundersCount()", +"fc22a9f8": "initialIssuance()", +"fc22d0e5": "migrate(address,uint256,uint256)", +"fc23466d": "search_data()", +"fc235fb8": "timeWaitApply4Redeem(address)", +"fc236188": "setData_7(string)", +"fc23f5b1": "getAddressByID(uint256)", +"fc248fd6": "RegisterNode(bytes32)", +"fc24e589": "badgeTotalSupply()", +"fc2525ab": "get(address,string)", +"fc252b94": "_getBuyPrice()", +"fc257baa": "traderWithdrawalSignals(address,address)", +"fc2584a2": "fillOrMarket(address)", +"fc26088e": "K_INITIAL_SUPPLY()", +"fc2615d5": "getRemainTime()", +"fc2634b7": "callURL(string,string,string)", +"fc26d522": "tip_total()", +"fc26fe01": "setairDropManagerLimit(uint256)", +"fc27ea83": "defaultAmount()", +"fc281217": "TokenInformation(address)", +"fc284d07": "earlyBackers(uint256)", +"fc28bc8f": "staffContract()", +"fc2b8b7b": "initTokenSupply(uint256)", +"fc2b8cc3": "quit()", +"fc2bd7ae": "sendtoMultiWallets(address[],uint256[])", +"fc2c1ddb": "setItemAvailable(uint256,bool)", +"fc2c3e08": "getIteration()", +"fc2d2b69": "SmartBondsToken()", +"fc2d64e3": "getProviderData(address)", +"fc2df281": "withdrawICOEth()", +"fc2e5bf2": "OfferOnHold(uint256,bool,address)", +"fc2ea8a5": "airdropAmount()", +"fc2f5e67": "recoveryAllowed()", +"fc300522": "getCallFee(bytes32)", +"fc303ef1": "destroyBottle()", +"fc3087f8": "withdrawAll2()", +"fc314e31": "tokenDetails(uint256)", +"fc317cbe": "mainSaleDate()", +"fc322d73": "challengers(bytes32)", +"fc324642": "__createNewToken(address,string,uint256,uint256,uint256,uint256)", +"fc325efd": "getItemByIndex(uint256)", +"fc3280c2": "getDegreeAtIndex(uint256)", +"fc32f09c": "MyShareToken()", +"fc331ebb": "transfererc20(address,address,uint256)", +"fc334e8c": "reveal(bytes32,bytes32)", +"fc335bb5": "OrmeCash()", +"fc337f5a": "getFreeCat()", +"fc342947": "renewFeatured(uint256)", +"fc34b908": "TOTAL_BONUS_SUPPLY_ETH()", +"fc366a2a": "RETZE()", +"fc36cc9d": "setCoolHero(uint32)", +"fc36e15b": "vote(string)", +"fc37987b": "buyRate()", +"fc380d96": "addBonusTokens(uint256,uint256)", +"fc384b7c": "executeStackholderTransaction(uint256)", +"fc385d51": "changeRelease6m(address)", +"fc3880ae": "priceWithBonus()", +"fc38ce19": "validPurchaseTokens(uint256)", +"fc38d4a4": "upgradeAgility(uint256,uint256)", +"fc395c90": "AddBillModerator(address)", +"fc3b7379": "lastBlock_a18()", +"fc3c28af": "devPercent()", +"fc3c8561": "testDistribute(uint256,address[],uint8[])", +"fc3d9f9f": "calcUnMaskedKeyEarnings(uint256,uint256)", +"fc3daf81": "_CalcDiv()", +"fc3f162b": "unregisterAuditor(address)", +"fc3fc168": "DIVIDEND()", +"fc3fc4ed": "getAuctionInfo(uint256)", +"fc4116bb": "p_update_mResalePlotTaxPercent(uint256)", +"fc416159": "coreERC()", +"fc429e6a": "transfer_from_session(uint32,uint32,uint64)", +"fc42b58f": "getTransferFee(address,uint256)", +"fc4333cd": "clean()", +"fc434891": "unWhitelistAddresses(address[])", +"fc43bbfb": "setWhitelistAddress(address,uint256)", +"fc442ec3": "getFlavor()", +"fc44e41b": "RANDOMFACTToken()", +"fc44fd28": "payBalanceToReturnWallet()", +"fc450ae6": "MummyAccountWithdraw()", +"fc45c822": "getDividends(address,address)", +"fc470105": "TestcoinToken()", +"fc47b9d2": "brulerDe(address,uint256)", +"fc47fcf5": "total_devidend()", +"fc48b653": "authorizedTransfer(address,address,uint256)", +"fc49926f": "getCountdowns()", +"fc4a089c": "newPermission(bytes32,address[],bytes4[])", +"fc4a4a1e": "StartTime()", +"fc4b01ff": "addTicketsToDraw(uint256,uint8,uint8)", +"fc4b2473": "ALC_CONTRACT_ADDRESS()", +"fc4bd9d7": "throwIfSetPresaleTokensAfterSaleStarts()", +"fc4c0daa": "_agent()", +"fc4d20f5": "addMonsterObj(uint32,address,string)", +"fc4d705b": "COLOR_GOLD()", +"fc4db64e": "SendAmount(address,address,uint256)", +"fc504655": "getPriceInWei()", +"fc512b92": "postCrowdsaleWithdraw(uint256)", +"fc515d93": "approvedAddressSize()", +"fc51b9c5": "cancelOrder(address[3],uint256[5],int256,int256)", +"fc51daef": "getCurrentRoundWinner()", +"fc523f7a": "settte(uint256,address)", +"fc525c75": "Ammbr(string,string,uint8)", +"fc52be0a": "getLatestTokenAllocation(address,address)", +"fc52cc1d": "incPreSell(address,uint256)", +"fc52f2eb": "DogRacingToken()", +"fc5378bb": "getEmployeeInfoById(address)", +"fc539a4a": "getInstances(bytes32)", +"fc53c821": "getMembersLength()", +"fc53f958": "ADMIN_ALLOWANCE()", +"fc53fe51": "_authorizePayment(address,uint128)", +"fc548f08": "changeArbitrator(address)", +"fc55c8d6": "buyPixel(uint256,bytes32)", +"fc55ea9d": "removeCustomer(string)", +"fc56200e": "JCFv1(uint256,string,string,uint8)", +"fc563658": "getNumber(uint256)", +"fc578323": "getProposalProposedBy(bytes32,bytes32)", +"fc57fadf": "IsValidAddress(address)", +"fc58452e": "castVote(bytes32,uint16)", +"fc58edea": "FoundationAddressFreezeTime()", +"fc58fc49": "setUser(address,address,string,uint256)", +"fc59116d": "setTokenTypes(uint16,uint16,uint16)", +"fc591ce5": "AddForm46(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"fc5a0152": "div256(uint256,uint256)", +"fc5ab1c6": "_unlockOther(address)", +"fc5b57a6": "removeStackholder(address)", +"fc5b652a": "LogNeumarksBurned(address,uint256,uint256)", +"fc5be8ec": "bonuscalico(uint256)", +"fc5c0cde": "allTimeDiscount(uint256)", +"fc5d9244": "totalBonusTokens()", +"fc5e2cce": "calculatWithdrawForPeriod(uint8,uint256,uint256)", +"fc5eb846": "currentHunterNumber()", +"fc5f3e1d": "ATEC_Token()", +"fc5faa82": "ProWalletToken()", +"fc5fc345": "getPlayerIds()", +"fc5fc8ae": "preICOEnds()", +"fc601902": "_isAdmin()", +"fc608e17": "getAllocatedTokenCount(address,address)", +"fc60bb36": "_removeGroupFromMember(address,bytes32)", +"fc60e82c": "calculatePrize(uint256,uint256,uint256,uint256)", +"fc612a8d": "priceUpdater()", +"fc623ef8": "hashToSign(bytes32)", +"fc632647": "MNToken(uint256,string,uint8,string)", +"fc63977a": "getAddressFromUsername(bytes32)", +"fc63d4fb": "order(bool,uint32,uint128)", +"fc63dad6": "getLastBuyer(bytes32,uint8)", +"fc65169a": "phase4Duration()", +"fc65b3ac": "all_team_accounts()", +"fc65ee05": "marginCallOnBehalfOfRecurse(address,address,bytes32,uint256)", +"fc65f812": "_currentPrice(uint256)", +"fc6634b9": "setSellPrice(uint256)", +"fc673c4f": "operatorBurn(address,uint256,bytes,bytes)", +"fc676652": "Embassy(address,address)", +"fc67af2d": "withdrawCommunityBalance()", +"fc68521a": "f(address)", +"fc687311": "betOn(int8)", +"fc688e87": "logAccount(address,uint256)", +"fc6a0ca6": "changeTeamSize(uint8)", +"fc6a3ff7": "ticketsOwnedByUser(address)", +"fc6b72b6": "bringCat(uint256)", +"fc6c403b": "getMySalePrice(bytes32)", +"fc6d0dd0": "getLightingWithdraw(address,address,bytes32,bytes32,uint256,uint32)", +"fc6d1892": "setArrUintField1(uint256[])", +"fc6def15": "decider()", +"fc6e33ee": "MAX_SALE_DURATION()", +"fc6ef5a5": "getUserTokenLocalBalance(address)", +"fc6f46a0": "addTether(address,string,uint256,uint32,string)", +"fc6f9468": "adminAddress()", +"fc6fadec": "LoggedReward(uint256,string,uint8,string,bool,bool)", +"fc700dc0": "createBucketLender(bytes32,address,address,address,uint32[7],address[],address[])", +"fc70b462": "viewReputation(address)", +"fc722b2b": "trustedDarknodeRegistry()", +"fc72c1ef": "ERC20Base(uint256)", +"fc735e99": "verify()", +"fc7368fa": "reopenBet(uint256)", +"fc73c86e": "getInvestments(address)", +"fc73ec00": "changeDividend(uint256)", +"fc741c7c": "makerFee()", +"fc749323": "NTC()", +"fc74dadd": "delegateProxy(address,bytes)", +"fc74f55c": "IexecHubAccessor(address)", +"fc753ce3": "NAME_ARK()", +"fc756c69": "createship(uint256,address)", +"fc7596a8": "GoldBoxToken()", +"fc763176": "agreeAmendmentJUR(address)", +"fc76501a": "preIco1Raise()", +"fc76687c": "jinglesOnSale(uint256)", +"fc77060d": "withdrawEtherHomeExternal()", +"fc772c8b": "reclaim(address)", +"fc773166": "GCoin()", +"fc78b430": "delegateVote(address,address,uint256)", +"fc792719": "hasBeenClaimed()", +"fc794183": "timesfucky()", +"fc79c8eb": "TBCoin()", +"fc7ae9f5": "presaleMaxContribution(address)", +"fc7b78b1": "changeVestingAgent(address)", +"fc7b9c18": "totalDebt()", +"fc7ba686": "affiliatesCutOutof100()", +"fc7c1c80": "getParentB(uint256)", +"fc7c41af": "doDisown()", +"fc7cb268": "PoSToken()", +"fc7d07ce": "AllocateFounderTokens()", +"fc7d2b3a": "EtherOcrend()", +"fc7d6518": "getLockSdc()", +"fc7e061f": "convertPresaleTokens(address,uint256,uint256,string)", +"fc7e286d": "deposits(address)", +"fc7e4768": "saleMinShares()", +"fc7e9c6f": "nextIndex()", +"fc7f1a88": "increaseBurnApproval(address,uint256)", +"fc7f7957": "callMeMaybe()", +"fc7fcae1": "extractFund(uint256)", +"fc800df4": "getBuyerbyaddress(address,address)", +"fc818684": "burnFromContract(uint256)", +"fc8234cb": "_unpause()", +"fc82d0f7": "currentIterationSupplyLimit()", +"fc836563": "SendTokens()", +"fc845834": "GoldenCoin()", +"fc860e96": "emissionTime()", +"fc862027": "setNameTAOLookupAddress(address)", +"fc86a7a5": "getTokenSoldPrice(uint256)", +"fc87790f": "addToWithoutFee(address)", +"fc8791c0": "change_p1(uint256)", +"fc87c766": "addressCap(address)", +"fc880be0": "SetCommissionValue(uint256)", +"fc882dff": "ownerHashed()", +"fc88ee77": "optionExerciseOf(address)", +"fc891b97": "MosesToken()", +"fc892cfe": "setup_token()", +"fc89aff6": "submitVerifiedUsers(address[])", +"fc89f349": "ORZToken()", +"fc8aaa76": "disableManualEmission(bytes32)", +"fc8ad37c": "changeParameters(uint256,uint256,uint256)", +"fc8b4a90": "checkDuplicateMatchId(address,uint256,uint256)", +"fc8bbb6d": "AddresstoAsciiString(address)", +"fc8c2f0d": "AlphaMarketTeamBountyWallet(address[],address)", +"fc8cddf2": "ARCADIA()", +"fc8d4f4f": "getShareHoldersInfo(uint256)", +"fc8dae84": "AllAmericanCoin()", +"fc8f3a94": "_getPayTo()", +"fc8f616e": "XXX()", +"fc8fc6f7": "KittyCoins()", +"fc9017a8": "sendMessage(address,string,bool,uint256,bytes32)", +"fc906720": "setSiringWithId(uint256,uint32)", +"fc906897": "StageDistributed(uint8,uint256)", +"fc909fc7": "EtherGrand()", +"fc912461": "_setControllers(address[])", +"fc914949": "ValidContractRemoved(address,address,uint256)", +"fc91a274": "getAmountByToken(bytes32,string,address)", +"fc91e03d": "EtherDeltaWithdraw(uint256)", +"fc94dd18": "verifyHumanStandardToken(address)", +"fc959d9a": "getMin(uint32[])", +"fc961664": "setPI_edit_7(string)", +"fc966d45": "uintToStr(uint256)", +"fc970859": "PacBall()", +"fc976827": "TOTAL_TOKEN_AMOUNT()", +"fc9774c1": "dividendShares(address)", +"fc989bbb": "addStockProfitInternal(uint256)", +"fc98f71e": "developerLock()", +"fc99342e": "create_table()", +"fc9937e5": "orders_sell_total()", +"fc996557": "goldContract()", +"fc998981": "sendBountyBalance(address[],uint256[])", +"fc9bfaa6": "externalCallFlag()", +"fc9c473d": "limitPerHolder()", +"fc9c8d39": "caller()", +"fc9dab52": "soldSale()", +"fc9dc608": "setRoundTime(uint256,uint256)", +"fc9e53df": "setNextRegistrar(address)", +"fc9ede65": "getPropertyBecomePublic(uint16)", +"fc9ee045": "getMaximalDeposit(uint256)", +"fc9f8cae": "_isApprovedPack()", +"fc9ffe02": "getWalletList()", +"fca062d3": "blockBeforeChange()", +"fca10682": "randomGen(uint256,uint256,uint256)", +"fca129a3": "finalizeDescription()", +"fca16c3b": "getBuyPrice(uint256,uint256,uint256)", +"fca2452b": "change_b(address)", +"fca2d9f5": "senttest()", +"fca2efd5": "DocnotaPresale(address,address)", +"fca346af": "SetupCrowdSale()", +"fca3644a": "verifyMessage(uint8,uint256,bytes32[4])", +"fca3b5aa": "setMinter(address)", +"fca495f0": "receivePurchase(uint256)", +"fca5d057": "migrateTokensV1(address,uint256)", +"fca5d21f": "playSlot()", +"fca5e61e": "drugs(uint256)", +"fca64947": "setMetaBet(uint256)", +"fca69afa": "CYCLE_CAP()", +"fca6d4e2": "LogAccess(address)", +"fca76c26": "lockMaxSupply()", +"fca7820b": "_setReserveFactor(uint256)", +"fca7c355": "MUSTToken(address,string,string,uint256,uint256)", +"fca7cdba": "pgoMonthlyPresaleVault()", +"fca865dd": "aSetProportion(uint16)", +"fca981f6": "setStepFunctions()", +"fca9bb5f": "FACTOR_1()", +"fcaa7664": "getStage()", +"fcaa96fa": "withdrawForThreeStep()", +"fcac1c77": "DragonKing(address,address,address,address,uint8,uint8,uint8,uint16[],uint16[])", +"fcad399f": "TheFlashToken(uint256,string,string)", +"fcad8cf3": "RentOffice()", +"fcae08e1": "fundTokens()", +"fcae4484": "unsubscribe()", +"fcae8c06": "takeMoney()", +"fcaf343e": "getUnsoldTokensAmount()", +"fcb0339e": "icoMinCap()", +"fcb0368c": "BuyToken(uint256)", +"fcb0a7ad": "getMinAuditPrice(address)", +"fcb0e55c": "_validGenes(uint256)", +"fcb163c7": "ExecuteOptions(address,uint256,string,uint8)", +"fcb1804d": "getRateAndTimeRemaining(uint256,uint256,uint256,uint256)", +"fcb1b62d": "arbiterAcceptCount()", +"fcb1cba0": "GetQuota()", +"fcb2931b": "LockupContract(address,address,address)", +"fcb2acd5": "_preValidatePurchase(address,uint256)", +"fcb2cafc": "verifyAddress(address)", +"fcb300e6": "_activate()", +"fcb36ce2": "buyCalcAndPayout(address,uint256,uint256,uint256,uint256,bool)", +"fcb3a3a3": "setCrowdsaleMinter(address)", +"fcb5bc29": "startPhase2()", +"fcb5ced3": "saveToCW()", +"fcb5d44d": "doExchange(uint256)", +"fcb6323a": "unclaim(address[])", +"fcb71ea9": "balanceOfHolder(address)", +"fcb750cf": "REFUND_DIVISION_RATE()", +"fcb806ac": "ReserveManager()", +"fcb80d16": "getCurrentFgcCap()", +"fcb899d7": "LEGAL_EXPENSES_ADDR()", +"fcb8b1e1": "NewHardCap(uint256)", +"fcb927aa": "addPublisher(string,bytes,address,address[],uint256[],address,uint32[])", +"fcb941c9": "setGenomeContractAddress(address,address)", +"fcb94dbb": "toBytes(address,address)", +"fcb9b505": "updateBeneficiary(address,uint256)", +"fcbc1bc4": "Standard23TokenMock(address,uint256)", +"fcbcf436": "clearSums()", +"fcbd06aa": "supportersMap(address)", +"fcbd2731": "transferToProxy(uint256)", +"fcbe0f5f": "BRD()", +"fcbeaaa7": "buyTile(uint16,uint16,uint8)", +"fcbf3131": "private_setBankAddress(address)", +"fcbf323a": "ScienceToken()", +"fcc01cce": "getExpectedAmount(bytes32)", +"fcc101ba": "getCommunityDescription(uint256)", +"fcc11241": "addOrder(uint256,uint256,uint256,uint256,uint256,uint8)", +"fcc15c8e": "Strike(uint16,uint32,uint16,uint8)", +"fcc1cc9b": "removeLockMultiple(address[])", +"fcc21e56": "withdrawToTeam()", +"fcc29ae8": "setMaxContributor(uint256)", +"fcc2a69b": "BankuNetwork()", +"fcc34e89": "migrateCrowdsale(address)", +"fcc36c49": "refuseInvestment()", +"fcc47803": "removeSpecialOffer(address)", +"fcc4a54c": "getDeedIds()", +"fcc4dec9": "refound(uint256)", +"fcc550c6": "CreateCCM(address,uint256)", +"fcc5b5ad": "investContracts(uint256)", +"fcc60b6a": "isInited()", +"fcc648f6": "withdrawEtherToReserveEscrow()", +"fcc6b5d5": "fillTheirOrder(address)", +"fcc73637": "updateExchangeRate(uint256,uint256)", +"fcc8221f": "getfromsun(address,uint256,uint256)", +"fcc830be": "getMyRickAndMorty()", +"fcc89710": "LogTokenSaleInitialized(address,address,uint256,uint256,uint256)", +"fcc9b48c": "isIcoFailed()", +"fcca4040": "tokenCapReached()", +"fcca8949": "p_setDevPercent_out(uint256,uint256)", +"fccc2813": "BURN_ADDRESS()", +"fcccc68f": "LoveBite()", +"fcce0492": "AdminTransferredOwnership(address,address)", +"fcce2622": "challengeAnswer(uint256,bytes)", +"fcceea26": "communitySupply()", +"fccf5a68": "SmartBinding()", +"fccf6e67": "newOrdersContract(address)", +"fccf82a4": "endDateOfPreSale()", +"fcd0a747": "RICTToken()", +"fcd10753": "_getProviderSupply(uint256,uint256,uint256)", +"fcd13382": "OsherCoinPresaleAward(uint256)", +"fcd13d65": "setContractRegistry(address)", +"fcd14456": "teamVestingPeriod()", +"fcd24400": "lookupCampaignPart2(uint256)", +"fcd307c4": "processReferral(address,address,uint256)", +"fcd3533c": "burn(uint256,address)", +"fcd41502": "requiredMajorityPercent()", +"fcd41c1f": "officialAddress()", +"fcd45807": "isTokenRegisteredBySymbol(string)", +"fcd47e79": "getnowcardcount()", +"fcd51a4e": "_setIntelligenceValue16(uint256)", +"fcd58363": "refundCancelledGame(uint32,uint32[])", +"fcd6e339": "giveBlockReward()", +"fcd6ec11": "HELLO()", +"fcd735dd": "transferVesting(address,uint256,uint256,uint256)", +"fcd778da": "setCardsAddress(address,address)", +"fcd792f4": "nextAvailableId(uint256)", +"fcd830c4": "setCCH_edit_28(string)", +"fcd8c9d4": "_goldTotalSupply()", +"fcd92992": "resync()", +"fcd936b1": "Simple()", +"fcd9da44": "setParameters(uint256,uint256,uint256,uint256)", +"fcd9f4ce": "withdraw(bytes32,string,string)", +"fcda4ded": "showBankAmount()", +"fcdb2c04": "getMyGameInfo()", +"fcddd056": "payIn()", +"fcde22fa": "_eachPrize(uint32,uint256,uint8,uint32,uint256)", +"fcde2ff6": "getPI_edit_23()", +"fcde6831": "addTokens(address[],bytes32[],uint256[],uint256)", +"fcde6ebe": "createSalesTierConfigMap()", +"fcde7b69": "TokenFRT(address)", +"fcde9925": "proposalOwner(uint256)", +"fcdf350b": "EGGS_TO_HATCH_1FAIRY()", +"fcdf9750": "createDispute()", +"fce14069": "partnerBonusPercent()", +"fce1cc35": "setInt(int256,int8,int16,int32,int256)", +"fce1ccca": "voting()", +"fce1e3e9": "setPatentFees(uint256[9])", +"fce20190": "_refund(uint256,uint256,uint256,uint256)", +"fce22c4c": "generatePseudoRand(bytes32)", +"fce266cb": "artworksFactory(address)", +"fce33f01": "withdrawLimit(address)", +"fce3b91e": "IdolToken1()", +"fce3bbb5": "setSelling(bool)", +"fce44634": "isValidHashType(uint8)", +"fce48558": "countryOf(uint256)", +"fce4c128": "checkInvestmentRequired(uint16,bool)", +"fce4f84f": "sellToConsumer(address,uint256,uint256)", +"fce59d0c": "MangoRepo()", +"fce6d586": "LogClaim(address,uint256)", +"fce78e5e": "TurtleToken(uint256,string,string)", +"fce846e8": "getExtraBonus()", +"fce87fb0": "tokenUriPrefix()", +"fce897e5": "payBid(address,uint256,bytes)", +"fce908ad": "whitelistTx(address,address)", +"fce927f3": "issueReservedTokens(uint256)", +"fce9fbff": "minWeiPerContributor()", +"fce9fdd9": "MPYCreation(address,uint256)", +"fceb9852": "isToOffChainAddresses(address[])", +"fcec617a": "conflictEndFine()", +"fcec962e": "adminWithdraw(address,uint256,uint256)", +"fceca4a0": "VICOXToken(uint256,address)", +"fcecbb61": "getReceipt(bytes32)", +"fced4a86": "CryptoHuntIco(uint256,uint256,address,address)", +"fced5694": "FOUNDER1_STAKE()", +"fced6ad2": "KARMAtoken()", +"fcee45f4": "getFee(uint256)", +"fcef09d6": "BlipCompetition(address)", +"fcef56a4": "createBar()", +"fcefe706": "getOutputIndex(uint256)", +"fcf07c6b": "foundationAddress()", +"fcf0f55b": "eventOracles(bytes32,uint256)", +"fcf23a92": "LogOwnerChanged(address,address)", +"fcf23d63": "getMatchInfoList03()", +"fcf2f85f": "requiredDevSignatures()", +"fcf32769": "adminWithdraw(address[4],uint256[5],uint8,bytes32,bytes32)", +"fcf3438c": "setSmsCertifier(address)", +"fcf36918": "doCall(bytes32)", +"fcf40170": "cleanWallets()", +"fcf4333a": "updateHashrate(address)", +"fcf43ce2": "setValidTransferAddress(address)", +"fcf4b576": "getVaultAccess(address)", +"fcf516aa": "VuePayToken()", +"fcf5462e": "SuperUltraUltraCoin()", +"fcf56577": "setRequesterLock(bool)", +"fcf7e73d": "addBeneficiary(address,uint256,uint256,uint256,uint256,bool,string)", +"fcf7fe50": "push(address,uint256,uint256,bool)", +"fcf84962": "InvestAddEvent(address,uint256)", +"fcf8566e": "unsoldCleanUp()", +"fcf911e7": "delAddressValue(bytes32)", +"fcf9c44d": "soldUET(address,uint256,bytes32)", +"fcfa2bfe": "SALES_START()", +"fcfa63e3": "getResourceAddress(string)", +"fcfbc962": "Unset(string,string,address)", +"fcfc1577": "masterFns(bytes32)", +"fcfc208e": "unclockAddressDuringITO(address,address)", +"fcfd3a4c": "PreICO(address)", +"fcfdaa52": "successfulTime()", +"fcfdbc23": "perform_withdraw(address)", +"fcfdcf8a": "removeOpenMakeOrder(address,address)", +"fcfdeba8": "changeGameEnable(uint256)", +"fcfdf7c5": "decApprove(address,address,uint256)", +"fcfe2247": "setContributionDates(uint256,uint256)", +"fcfe6af1": "transfer(address,uint256,address,address,uint256,uint8,bytes32,bytes32)", +"fcff1eaf": "increaseGasSpent(bytes32,uint128)", +"fcff5ed6": "createChannelDelegate(address,address,uint192)", +"fcffb14e": "getNormalPayout(uint256)", +"fcfff16f": "open()", +"fd004f2d": "IRONtoken()", +"fd01249c": "createGen0Auction(uint256,uint256)", +"fd01d4a1": "ownerDivRate()", +"fd0326b4": "m_nextSale()", +"fd036052": "modPass(uint256,uint256,string,string,string)", +"fd037bc5": "changeIsPayableEnabled()", +"fd03846e": "setCreditBondContract(address)", +"fd03c006": "agreeCount()", +"fd03d762": "resumeWork(uint256)", +"fd03e721": "referraltokencontract()", +"fd049319": "distribute1BTCO(address[])", +"fd04a902": "totaletherstransacted()", +"fd04b606": "getMarketMarginPremium(uint256)", +"fd05ddfc": "CCCRCoin()", +"fd062d3b": "handleFees(uint256,address,address)", +"fd06c6a9": "issuePass(address,bytes32,uint8)", +"fd070667": "tournamentResult(uint32[3][11][32])", +"fd074c28": "removeWeapon(uint8[176],uint8,uint8)", +"fd074e8e": "checkIfMissionCompleted()", +"fd0801c1": "appendNumToString(string,uint256)", +"fd080993": "submit(bytes32,bytes32,bytes32)", +"fd083748": "isGason(uint64)", +"fd084b16": "etherPartition(uint256)", +"fd085b41": "minSaleAmount()", +"fd08921b": "getYear()", +"fd090e47": "DEPOSIT_PERIOD()", +"fd0998de": "Totalbalance()", +"fd09b6f0": "JNDToken()", +"fd09d013": "CROWDSALE_ALLOCATION()", +"fd0a7f3e": "grantGrantableAllocations()", +"fd0aeb34": "EderCoin()", +"fd0b9dc2": "verifyWithdrawUpdate(bytes32,bytes32,uint256,uint256)", +"fd0bb752": "getBonusReceived()", +"fd0c1edb": "_setVault(address)", +"fd0c2a76": "Crowdsale(uint256,uint256,uint256,address,address)", +"fd0c78c2": "secondaryOperator()", +"fd0cdcdb": "withdrawRemaining(address)", +"fd0cfa91": "baseFeeDivisor()", +"fd0d1322": "WETCC()", +"fd0dd4d0": "btnSupply()", +"fd0e4695": "_canceloffer(address)", +"fd0edbd6": "refundSeller(address,address,uint256)", +"fd0f267b": "deathData_v0()", +"fd0f5a81": "updateWEIAmount(uint256)", +"fd1075d0": "setTokenRewardRate(uint256)", +"fd1094a9": "JaiHoToken()", +"fd12c1cb": "ethFnkRate2()", +"fd1343f1": "ESOPAndCompanySet(address,address)", +"fd138223": "remainingBountySupply()", +"fd13a7ce": "isPurchaseWithinCap(uint256,uint256)", +"fd14492a": "DinoTokenSale()", +"fd14ecfe": "balanceOfSPS()", +"fd15e091": "changeSymbolName(string)", +"fd17f289": "teamTokenSupply()", +"fd186de6": "StoToken(address,address)", +"fd18b484": "VitaToken()", +"fd19368a": "isEditionAvailable(uint8)", +"fd1a0a55": "JINGJING()", +"fd1aaa72": "sendToOwnerBalance(address,uint256)", +"fd1af169": "canSend(address,address,uint256,bytes)", +"fd1bd9b0": "getAmountLeft()", +"fd1c50e0": "sellAtIndex(uint256,uint256)", +"fd1c66da": "getCertificateIssued()", +"fd1ccaf3": "HideraNetwork(uint256,string,string)", +"fd1dc137": "settoken(address,bool)", +"fd1e582d": "ownertransfer(address,uint256)", +"fd1e5e7a": "getOrCacheDesignatedReportNoShowBond()", +"fd1f4ba5": "setAgenda(string)", +"fd1fb2fa": "rateB()", +"fd1fc4a0": "airDrop(address[],uint256)", +"fd203906": "getCarState(string)", +"fd208ca7": "endprivateIco(bool)", +"fd214edd": "collect(uint64,address[],address[],address)", +"fd221031": "tap()", +"fd221889": "priceFactorA()", +"fd222745": "melonport()", +"fd225cfd": "CoCoCoin()", +"fd228c0b": "isMintAgent(address)", +"fd22a6cf": "openGames(uint256)", +"fd23022a": "Orocoin()", +"fd232b59": "getEscrowPayments(uint256)", +"fd241e2b": "mintWithLocked(address,uint256,uint256)", +"fd2457d7": "clearStorage(bytes32[])", +"fd253492": "leadingHitCount()", +"fd255683": "getAddressValue(string)", +"fd260dfc": "getCertificationDbStatus(address)", +"fd263390": "setBank(address,bool)", +"fd26c460": "set_game(string,string)", +"fd275dd5": "TokenFreezerRules(address)", +"fd277399": "isService(bytes32)", +"fd27b51e": "getMarketSize()", +"fd27ce93": "checkRelease(address,uint256)", +"fd27d1d3": "getBlockPrice(uint256)", +"fd282afe": "batchSingleAmount(address[],uint256)", +"fd28392a": "changeSweepAccount(address)", +"fd289797": "_canSynthesizeWithViaAuction(uint256,uint256)", +"fd28feb3": "createInitialItems()", +"fd2994f7": "totalPointsPerToken()", +"fd2b4f23": "TheTestCompany()", +"fd2b6b19": "crowdSaleEnded()", +"fd2b863d": "produceUnitSeconds()", +"fd2c3abb": "targetDiscountValue8()", +"fd2c80ae": "updateInterval()", +"fd2ce18e": "getPayloadFrom(address)", +"fd2cee78": "pollEnded(bytes32)", +"fd2cf77a": "COLOR_BLUE()", +"fd2d39c5": "positionOf(address)", +"fd2db3f4": "countTotalInvestorsInCrowdsale()", +"fd2dba2f": "largeRate()", +"fd2e9caf": "PendingETH()", +"fd2ecc3f": "_setLastDate(uint256)", +"fd2edd76": "TOTAL_LOCKS()", +"fd306ca7": "transferProfitToHouse()", +"fd30929a": "disable(address[])", +"fd32649f": "cleanLog()", +"fd32f088": "calVoteResultByIndex(uint256)", +"fd330b26": "Total_Gamblers()", +"fd338726": "updatePlayerRewards(address,address)", +"fd339d18": "testAuthorityTryAuthUnauthorized()", +"fd345fc2": "totalNominees()", +"fd34d443": "kyberSwap(uint256,address,address,bytes32)", +"fd34e22e": "addrToForumId(address)", +"fd35c16d": "createLibra(bytes32[],bytes16[],uint256[])", +"fd35e71b": "entryPayoutDue(uint256)", +"fd367f7d": "toggleFeatured()", +"fd36c3f9": "burnFromAdmin(uint256)", +"fd37f1d0": "setInv1(address)", +"fd38af55": "testDebugClock()", +"fd39b40b": "GameScored(bytes32,int256,int256)", +"fd39ba59": "totalPreICOSupply()", +"fd3a77db": "acceptManagership()", +"fd3ab282": "q()", +"fd3acb5c": "getRoundOfSixteenResult(uint256)", +"fd3b34e6": "AddEntity(bytes)", +"fd3bbba5": "openOrCloseSale(bool)", +"fd3c1391": "flushShareNext()", +"fd3c1c43": "wolkAddress()", +"fd3c4277": "BattleDromeICO()", +"fd3c4cbf": "bidERC20(uint256,uint256)", +"fd3c88bd": "MultiVault(address,uint256)", +"fd3c9144": "intervalTime()", +"fd3cabc0": "_triggerPVEFinish(uint256)", +"fd3cb5d1": "doCommunityMinting(address,uint256,int256)", +"fd3d0dbf": "ioxis()", +"fd3d8cdc": "registerNameXID(string,bool)", +"fd3e2d86": "EpayToken(uint256,string,string,uint8)", +"fd3e50a7": "deliver()", +"fd3e6a0a": "transfers(address,address,uint256)", +"fd3ecae6": "changeExtendedTime(uint256)", +"fd3eefe9": "getAvailableAmount(string)", +"fd3f1a04": "unapprove(uint256)", +"fd3f2f66": "changePrivateContribution(uint256)", +"fd408767": "fireEventLog4()", +"fd40a1e9": "addMarketItem(bytes16,bytes16,bytes16[])", +"fd413596": "addBulk(address[])", +"fd41477f": "previligedLock(address,uint256)", +"fd414a29": "TOKEN_RATE_20_PERCENT_BONUS()", +"fd425dd5": "initCopper()", +"fd42657a": "_currentOwner()", +"fd426e40": "remainingTokensVIPs()", +"fd4446f3": "ICOSALE_JOINTTOKENS()", +"fd460302": "internalPresaleVesting(address,uint256,uint256,uint256,uint256,uint256)", +"fd4649ae": "UpdateUserPELOBonus(address,uint256)", +"fd46544a": "deleteAllBioTranslations()", +"fd467473": "setupFundingRate(uint256,uint256)", +"fd468aaa": "setPeriods(uint8)", +"fd473852": "TaiChiCoin()", +"fd475875": "newInversor(address,address)", +"fd475fa2": "requestAddAdmin(address,string)", +"fd478ca9": "getNumParticipants()", +"fd47eda6": "getMarketInterestRate(uint256)", +"fd48cc45": "challenge(bytes32,uint256,string)", +"fd4931a3": "getUintUsername(address,address)", +"fd4a343d": "extraMint(uint256)", +"fd4ad523": "recentlyEndedGames(uint256)", +"fd4b9d4d": "smalobox()", +"fd4bd17b": "calculateWineBuySimple(uint256)", +"fd4c5c9f": "MIN_LEADER_FRAC_BOT()", +"fd4c8c30": "PlayX20()", +"fd4d603c": "PS_PRICE()", +"fd4dabef": "solved(uint256,bytes32[])", +"fd4dbdf2": "T20coin(uint256,string,uint8,string)", +"fd4e165e": "RiceFarmer()", +"fd4e4d75": "addressA()", +"fd4eeb8f": "isOMICrowdsaleContract()", +"fd4f4125": "totalEtherHasBeenReceived()", +"fd4faee0": "Chain1()", +"fd4ff437": "addWhitelistBulk(address[],uint256[])", +"fd50299a": "addFeedback(address,uint256,address,string,uint8)", +"fd507f75": "airdropMultiple(address[])", +"fd50b005": "buyForWhitelisted()", +"fd52b3cd": "olumla()", +"fd52bdd5": "TweetherToken()", +"fd530c17": "Deposit(bytes20,uint256)", +"fd531e93": "getCertificate(address)", +"fd535203": "refundEther(uint256)", +"fd53e7b4": "admin_active_withdraw(address)", +"fd54fab8": "calculateBonusTokensAmount(uint256,uint256)", +"fd554229": "getGidOfRarity(uint8,uint8)", +"fd55714d": "getTotalCampaignsByCountry(string)", +"fd557d39": "queryCost()", +"fd56317d": "ANMvesting()", +"fd56d4c8": "getControlInfoPerToken(uint256)", +"fd577343": "setDefaultOperator(address)", +"fd57e9f9": "deleteElement()", +"fd57ee6d": "timelock(address,uint256,uint256)", +"fd58e63a": "setBonusMultiplier(uint256)", +"fd5a6019": "testUser(address)", +"fd5a60e1": "killDragon(uint256)", +"fd5c0663": "distributeBalanceToInvestors()", +"fd5c40ea": "ELIX_ADDRESS()", +"fd5c6694": "createGennezise(uint32)", +"fd5cb32c": "ItemBought(address,uint256,uint256,uint256,uint256)", +"fd5d173b": "MAX_NUM_OZT_TOKENS()", +"fd5d3e01": "getContractOrigin()", +"fd5eddf3": "supplyTokens(uint256)", +"fd5f1e03": "getParticipantLockedAmount(address,address,bytes32)", +"fd5f7256": "adminRetrieveContractConfig2()", +"fd5fde65": "mintTimeLockedTokens(address,uint256,uint256)", +"fd600107": "BONUS_TIER2()", +"fd600408": "tpe()", +"fd607594": "min_payment()", +"fd609b91": "DelVoteMemberCandidate(uint256)", +"fd60e1a8": "getReferralCounts()", +"fd6133a6": "updateTokensAvailable()", +"fd6180cb": "tokenDividendsOf(address)", +"fd619dce": "sigBountyProgramAddress()", +"fd61a725": "getMinimumReportingFeeDivisor()", +"fd626a86": "sellKWHAgainstEther(uint256)", +"fd6273a3": "ERC20KKToken()", +"fd6358ce": "setPricingStrategy(uint256,uint256,uint256,uint256,uint256,uint256)", +"fd636975": "addWeight(address,uint256)", +"fd637f02": "TEAM2()", +"fd63f640": "getLLV_edit_5()", +"fd645193": "RegistrationBonus(address)", +"fd64eccb": "isForwarder()", +"fd651d2c": "TransferBy(address,address,uint256)", +"fd655073": "balancesForWithdraw(address)", +"fd6673f5": "getNumberOfPlayers()", +"fd669810": "close(address,address,uint8,uint256)", +"fd67db81": "getCharity(uint256)", +"fd68610f": "getEtherBack()", +"fd6887af": "queenPrestige()", +"fd68a422": "returnmoneycreator(uint8,uint128)", +"fd68e463": "FeitebiToken(uint256,uint8,string,string)", +"fd68f377": "ethyclos()", +"fd69f3c2": "getMarketCount()", +"fd6aad25": "indexOf(address)", +"fd6b7ef8": "safeWithdrawal()", +"fd6ba459": "mintCard(address,uint8[14])", +"fd6bb46c": "addWeb(string)", +"fd6dd889": "marketTokenCreated()", +"fd6e1b50": "reportBenign(address)", +"fd6e3bfe": "setNFTAddress(address,address)", +"fd6ecb7b": "getReceiptDetails(bytes)", +"fd6efe80": "DiscCoin()", +"fd6f4137": "getAdvocate(address)", +"fd6f5270": "CouponDeposit(address[2],uint256[7],uint8,bytes32[2],uint256)", +"fd6f5430": "setContent(string,bytes32)", +"fd70813b": "setTermsAndConditions(string)", +"fd70b40d": "HashToken(address)", +"fd70f406": "citiesCount()", +"fd71b579": "LockMechanism(address,uint256)", +"fd720090": "right86(uint256)", +"fd7230d6": "create(uint256,bytes)", +"fd72a11a": "TorusCoin(uint256,address)", +"fd72e22a": "operationsWallet()", +"fd735602": "executeN()", +"fd7394ae": "IndividualityToken()", +"fd743f2b": "Coke()", +"fd747c0b": "rsaVerify(bytes,bytes,uint256,bytes)", +"fd74a151": "ETH_FUND_DEPOSIT()", +"fd7560ca": "distributeEarningsBasedOnScore(address,address)", +"fd75b8d4": "calculateGrantClaim(address)", +"fd7611c7": "withdrawContractTokens(address)", +"fd764e68": "transfer(uint256,address,address[],uint256[],uint8[],bytes32[],bytes32[])", +"fd777d9e": "teste1()", +"fd77905c": "setColorMetadata(uint256,string)", +"fd7801df": "getCitationLength()", +"fd782de5": "Proxy()", +"fd7903a0": "getTeamFromLeaderboard(uint16,uint8)", +"fd790923": "keyImageUsedUpdate(uint256[2])", +"fd791031": "gamesFund()", +"fd793c76": "btg()", +"fd79c2a9": "ContractName()", +"fd7a1b00": "forbidDeploy(address)", +"fd7ab1ad": "chiudi_votazioni()", +"fd7ac203": "TestToken()", +"fd7af387": "canTransferBetweenUsers()", +"fd7afee8": "insertData(uint256,string,string)", +"fd7c074f": "changeReceivingAddress(address)", +"fd7c460d": "ciberLottery()", +"fd7caf4d": "loyaltyCap()", +"fd7d7948": "getTranformedId(uint64)", +"fd7e1bee": "freezeTime()", +"fd7f611e": "createCompany(string)", +"fd7fc0e0": "invest(uint32)", +"fd7fe115": "grantAccess(address,bool)", +"fd7feb35": "cancelWonderSale(uint256)", +"fd7ffdb8": "recordSystemOnSaleToken(uint256)", +"fd8055d2": "updateBOTBillingInfo(uint256,string,address,string,string,uint256)", +"fd809759": "getYearIdx()", +"fd810eb3": "logAccess(bytes32,string)", +"fd8113e9": "checkprevowner(address)", +"fd812e7c": "revealHash(uint256,uint256,bytes4)", +"fd814dbd": "GameXToken()", +"fd8258bd": "canIssue(address,address,address,uint256)", +"fd82902d": "MeowCoin()", +"fd82a59f": "advisorsTokensVault()", +"fd83915e": "changeOwnership(bytes32,address)", +"fd83da09": "lastSaleDate(uint256)", +"fd83f3e3": "QueueUserMayBeDeliveryDroneCotnrol()", +"fd842125": "ricardianVoucher()", +"fd854148": "periodDuration(uint256)", +"fd85b1a7": "openChannel(uint256)", +"fd8663d2": "setBuyBackFund(address)", +"fd86e49d": "token_is_active(address)", +"fd872458": "PK(address,uint8,bytes32)", +"fd874a7b": "blockedTimeForBountyTokens()", +"fd87f2cb": "ADXProxy()", +"fd8828eb": "rawSetPrice(bytes32,uint256)", +"fd89a9b5": "enableImpairedTokenContract(address,bool)", +"fd89d17f": "THIRD_SUPPLY()", +"fd8ac8d0": "capDay2()", +"fd8acc42": "buyAuction(uint256)", +"fd8ae24b": "getTimeLeftInQ1()", +"fd8b09c2": "ENBToken()", +"fd8bb681": "earlyBackerList(uint256)", +"fd8bcf6d": "requestCancelationTime()", +"fd8be237": "CrowdsaleToken(string,string,uint256)", +"fd8c46e7": "distributeTokensToShareholders(address,uint256)", +"fd8c6fe4": "RexToken(uint256,address,address)", +"fd8d4bff": "MoyOpenDistribution()", +"fd902d1e": "setCutoffs(uint256)", +"fd904207": "OPTCToken()", +"fd906c0f": "createClone(address,string,string,string,address,uint256)", +"fd906ec9": "participate(bytes1[64])", +"fd909594": "icoGoal()", +"fd90a668": "allowManuallyMintTokens()", +"fd911997": "make(uint256,address,address,bytes32,bytes32,uint256,uint256)", +"fd9133f3": "LOCKTokenCOIN()", +"fd9168a9": "setRef(uint256)", +"fd9177b5": "LogMoveMade(uint256,uint8,uint8,uint8,uint8)", +"fd922a42": "server()", +"fd923a9e": "setCentsExchangeRate(uint256)", +"fd925795": "pvt_plmt_remaining_in_Wei()", +"fd9304cd": "minInvestmentValue()", +"fd93236b": "bankerEndTime()", +"fd9393c3": "init(uint256,string,string)", +"fd93bdb1": "changeRestricted(address)", +"fd94c80b": "priEtherReceived()", +"fd958695": "isAlphaNumeric(bytes1)", +"fd97a008": "autoDividendsFor(address)", +"fd97c61a": "getgamecardcount()", +"fd97d3c1": "giveCrypto()", +"fd9923ce": "asmTransfer(address,address,uint256)", +"fd994513": "executeVote(uint256[])", +"fd99a746": "transactionsCount()", +"fd99c012": "USDTUBESupply()", +"fd99c6a4": "upgradeCar(uint32,uint8)", +"fd9a4e61": "transferTokens(uint256)", +"fd9b41ff": "getCurrentFieldBalanceAndTarget()", +"fd9b8763": "Multiplier()", +"fd9be522": "withdrawFee(address,uint256)", +"fd9bf0a4": "_setPermissions(address,address[])", +"fd9bf3aa": "mint(address,int256)", +"fd9e2120": "initPara(uint256,uint256,uint256,uint256,address,uint256,uint256)", +"fd9e5fbf": "setTimeStaked(uint256,address)", +"fd9e8ff7": "Shard()", +"fd9f12b0": "isYellow()", +"fd9f6856": "lastDepositor()", +"fd9f9b87": "isOption(address)", +"fda0078f": "AKTestEther1(address,address,address,uint256,uint256,uint256)", +"fda03476": "luckySevenBets()", +"fda08958": "isServer(address)", +"fda0c61d": "setupWhitelist(address)", +"fda237f8": "genesisToken()", +"fda263e8": "timeEnd()", +"fda27af2": "claimSiteToken(uint8,uint256)", +"fda49eb4": "treasurer()", +"fda69fae": "getInt(string)", +"fda76eef": "RewardsGiftToken()", +"fda78599": "ecoSystemWallet()", +"fda79925": "complianceAddress()", +"fda80435": "c_MinInvestment()", +"fda86c95": "internalRevokeCert(bytes32,bytes,bytes32,bool,uint256)", +"fda92d3e": "ErrorMsg(string)", +"fda962d3": "totalGenesisRecipients()", +"fda9aafe": "WyzonCredit()", +"fdaa2632": "UploadURL(uint256,string)", +"fdaa94de": "deleteAddr(address,bytes)", +"fdaacf1b": "transferOwnerMoney(address)", +"fdab1b7b": "getCurrentAuctionPrice(address,address,uint256)", +"fdab5627": "_approveCertificate(uint256,bool)", +"fdac0025": "cups(bytes32)", +"fdac3a20": "set_eth(uint256)", +"fdac9ff7": "setAttributeValue(address,bytes32,uint256)", +"fdacbecd": "geteths(address)", +"fdacd576": "setCompleted(uint256)", +"fdad711d": "setFinalPayoutDistributionHash(bytes32)", +"fdade29f": "BuyBooster()", +"fdae3b70": "proofOfSms()", +"fdae6a92": "setTokenFeeMake(address,uint256)", +"fdae8a4c": "isAddressInBlackList(string,address)", +"fdaed331": "getTransferedUser(uint256)", +"fdaed778": "testConcatStorage32Bytes()", +"fdaf150c": "abc_initNetwork()", +"fdaf22e8": "minutos()", +"fdb04023": "closeVirtualChannel(bytes32,bytes32)", +"fdb31d10": "_createToken(string,bytes5,string,string,string,string,string,address,uint256)", +"fdb357be": "getVotingForCount(address)", +"fdb39c40": "userNameHashTaken(bytes32)", +"fdb406cb": "outstandingTokens(address)", +"fdb473b1": "unsetMyName()", +"fdb4dbe0": "totalEgg()", +"fdb5a03e": "reinvest()", +"fdb7b065": "marketDataOracle()", +"fdb7d435": "TEC(uint256,string,string)", +"fdb837e8": "GetTotalClicks()", +"fdb89360": "ParkCoin(uint256,string,string)", +"fdb914e2": "capPreSale()", +"fdb986cc": "NiobiumToken()", +"fdbab5f5": "PUBLICSALE_ENDTIMESTAMP()", +"fdbaf779": "internalBuyTokens(address,address)", +"fdbb16fd": "setEthPercent(uint256)", +"fdbb5aee": "ChannelNewBalance(address,address,uint256,uint256)", +"fdbb9fdb": "UNJUST(string,string,uint256,uint256,bool)", +"fdbc368a": "_ensureNewUser()", +"fdbc4006": "getCandidateList()", +"fdbc6530": "updaterAddress()", +"fdbc938d": "BlessingChainAlliance()", +"fdbd2534": "acceptCoinSale()", +"fdbd8dd8": "investInternal(address,uint256)", +"fdbd956d": "oraclize_query(uint256,string,bytes[],uint256)", +"fdbda9a7": "parentChange(address)", +"fdbdc112": "backersIndex(uint256)", +"fdbf0765": "hash(bytes20,uint96,uint32,bytes32[],uint16)", +"fdbf17d0": "computeFinalStake(uint256)", +"fdc03ca2": "enterContract()", +"fdc0713b": "getMinAuditPriceCount()", +"fdc193a4": "test3Fails()", +"fdc202f1": "Ticket(string,uint256)", +"fdc24095": "returnMasterNodes(address,uint256)", +"fdc272fe": "getTokenVolumebasedBonusRateForPhase3(uint256)", +"fdc292ea": "token(address,address)", +"fdc35112": "LogBuy(address,uint256,uint256)", +"fdc37c85": "securityCheckURI()", +"fdc3d8d7": "nextTaskId()", +"fdc40466": "maxInterestTime_()", +"fdc4741b": "addRecToQueue(address,uint256)", +"fdc487a7": "FundWithdrawl(address,address,uint256)", +"fdc4b338": "authorizeExtension(uint256,bool,string)", +"fdc4c3eb": "reservedWithdraw()", +"fdc5bf2c": "releaseToBuyer()", +"fdc61dd1": "coinAddress()", +"fdc63c5c": "aprobarMensaje(uint256,uint8,string)", +"fdc65c8c": "stakingBonusTokens()", +"fdc69291": "_adjustSupply(address,uint256)", +"fdc89f73": "toPowerOfThreeHalves(uint256)", +"fdc967e5": "jDallyCoin()", +"fdc98399": "getCurrentBuyerRateInPermilles(bool)", +"fdc99064": "unregisterNotary(address)", +"fdc9d0f4": "Telegram()", +"fdc9e72d": "_ownMint(uint256)", +"fdcb6068": "accessManager()", +"fdcb7539": "contruibuteData(bytes)", +"fdcbd0ec": "_deleteMinion(uint32,uint8,uint64)", +"fdcbd9b0": "GatewayStatusUpdated(bool)", +"fdcc6be3": "claimedPreICO(address)", +"fdccf45e": "computeCurrentPriceImpl(uint16,uint64)", +"fdcd0a18": "isRefundsEnabled()", +"fdcd649e": "EthAnte()", +"fdcd86ab": "addBets(bytes32)", +"fdce7f5e": "JinglesOpened(address,address,uint256)", +"fdce8e02": "checkHash1(address,uint256,address,uint256,uint256,uint256)", +"fdce9565": "determineWinner(uint256[7][],uint256[7][])", +"fdcea342": "fixPlayerMiddlename(uint256,string)", +"fdced779": "KozzProjectToken()", +"fdcf154c": "SODCOIN()", +"fdcf6f16": "getTopCompanyAtIndex(uint256)", +"fdd0298e": "PresaleAdded(address,uint256,uint256)", +"fdd080a4": "activateSaleContract(address)", +"fdd12c5e": "r(address,address)", +"fdd1a4e9": "externalCheckSign(bytes32,bytes,address)", +"fdd245ee": "referralLinkMinimum()", +"fdd2f2b0": "TIME_MULTIPLIER()", +"fdd3a879": "quick()", +"fdd3af8f": "fillTrade(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"fdd3c1a1": "distributeTimelockedTokens(address,uint256,uint256)", +"fdd3e3ff": "_removeAuction(uint256)", +"fdd3ea94": "submitPeerReview()", +"fdd42e29": "TokenOTBC(uint256,string,uint8,string)", +"fdd4fd69": "penaltyDisbursalAddress()", +"fdd5828f": "massPay(address[],uint256)", +"fdd6a803": "readowners()", +"fdd6df8c": "mul2Require(uint256)", +"fdd7d87b": "decline(address,address)", +"fdd868df": "getTracks(uint256,uint256)", +"fdd8a733": "TokenCoinExchanger()", +"fdd8ed02": "BetPlaced(uint256,uint256,address,uint256)", +"fdd96ae0": "compensateContributors(uint256,uint256)", +"fdda3d8a": "setVicepresidenteDeMesa(bytes32,uint256,uint256,uint256)", +"fddaf68a": "getTipperPercentage(uint256,uint256)", +"fddb4683": "ERC20(string,string,uint256)", +"fddb7ef0": "mainSaleBonuses(uint256)", +"fddbcca5": "pause_4()", +"fddc4686": "getOwnedAssetsLength()", +"fddc5545": "BitHaus()", +"fddcbd09": "burnByCreator(address,uint256)", +"fddcc148": "iterator()", +"fdddb3ae": "Athena()", +"fddf0fc0": "ethRaised()", +"fddf16b7": "INTERFACE_SIGNATURE_ERC721()", +"fddf4e3b": "_packCombinedParams(int256,int256,int256,int256,int256)", +"fddfec78": "allowTransfer(address,address)", +"fde045b9": "HODLaddress()", +"fde07212": "Betting()", +"fde074c8": "betAddrsCount_()", +"fde0a64d": "admin_inactive_payable()", +"fde1276a": "removeDiscount(address)", +"fde17733": "demiseCEO(address)", +"fde1ee44": "addAttestation(string,bool,address)", +"fde20b6c": "tipPercentageLocked()", +"fde34dc4": "finalize(uint256,uint256,bytes32)", +"fde3cbd6": "NucleusVisionCoreToken()", +"fde440bb": "setPayoutNumeratorsValue(uint256[])", +"fde45344": "untrustContract(address)", +"fde46b03": "_set1()", +"fde4b39d": "updateStages()", +"fde4d9bf": "setAutoPrice()", +"fde5ca7d": "calcDevReward(uint256)", +"fde5e124": "t_Andrey2()", +"fde63e96": "CreateSpecialPlayer(bytes32,uint8,uint8,uint256,uint256,address)", +"fde6adb1": "placeBet(uint256,uint256,uint256,uint256)", +"fde7c834": "increase_bounty(address)", +"fde83a34": "tokensForTeam()", +"fde90733": "isRequestingEscapeTo(uint32,uint32)", +"fde9683d": "ICO_DAYS()", +"fde99668": "removeOrder(bytes32)", +"fde9ba41": "transfer(bytes,address,uint256)", +"fde9cded": "whichAuction(uint256)", +"fde9e506": "calcDividendsSum(address)", +"fdea8e0b": "presale()", +"fdeb49b0": "allocationsLength()", +"fded813c": "getInvoiceBalance(bytes32)", +"fdeddab2": "windUpContract(uint64)", +"fdee38a9": "ETH_TLD_NODE()", +"fdee4ff9": "setExpectedReturn(uint256)", +"fdee579c": "MINfinney()", +"fdee5c22": "THAWING_DURATION()", +"fdee60e9": "peloExtenstion()", +"fdee69f4": "calResult()", +"fdef9106": "hasPermission(address,address,bytes32,bytes)", +"fdf061f0": "adminWithdrawBalance()", +"fdf0d8e0": "get_account_balance_token(address)", +"fdf1a434": "updateMinInvestmentForIco(uint256)", +"fdf1aba0": "check1(uint256,uint256)", +"fdf31b39": "incrementTasksCompleted(address)", +"fdf372ad": "niceguy2()", +"fdf3b97f": "calculateVestedTokens(uint256,uint256,uint256,uint256)", +"fdf3fa53": "RemoveCategory(uint256)", +"fdf54c98": "SocialNode()", +"fdf55523": "numRefCredits(address,bool)", +"fdf56d57": "voteElection(uint256)", +"fdf58814": "getLLV_edit_3()", +"fdf62f05": "createEngine(uint256,string,uint256,uint256,uint256,uint256)", +"fdf6393c": "removeExistingDiscount(address)", +"fdf762bb": "TEAM_AND_ANGEL_SUPPLY()", +"fdf78f70": "unlockStatus(address)", +"fdf7983a": "safeTransferChild(address,address,uint256,bytes)", +"fdf8e11c": "getTotalAngels()", +"fdf97cb2": "trustee()", +"fdfa571e": "getDrawStatus(uint32)", +"fdfac8e5": "BMC()", +"fdfcb425": "activate(address,uint256,uint256,uint256,bool,bool)", +"fdfd5b43": "determineWinnerScript()", +"fdfecb0c": "isEcoAllocated12()", +"fdff31ed": "getPairSellLoyaltyPerc(address,address)", +"fdff6b30": "testInitialBalanceUsingNewContract()", +"fdff85b4": "CONFIG_RETURN()", +"fdff9b4d": "managers(address)", +"fe0030d9": "IRPToken()", +"fe00344a": "AuctionCompleted(uint256,uint256,address)", +"fe006839": "INITIAL_SUPPLLY()", +"fe00779e": "removeBountyAddresses(address[])", +"fe007eeb": "SmartRouletteTokenDividend()", +"fe00b3a3": "kosacafToken()", +"fe0149a0": "ZQCToken()", +"fe01ee96": "Clearing(address,uint256)", +"fe01f1ff": "TokenTester()", +"fe01ff62": "verifyTx(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2])", +"fe02739c": "releaseJackpot()", +"fe029156": "swap(address,address,uint256,uint256)", +"fe038093": "createTeams()", +"fe04a5bc": "senderMIT()", +"fe04cb1d": "setStatusPrice(uint256)", +"fe052bc6": "minimumInvestmentInWei()", +"fe05e8b1": "assertFact(uint256,string)", +"fe05f7c2": "destroyforeth(uint256)", +"fe063351": "newCustomer(address,string)", +"fe06a915": "totalMTPAllocated()", +"fe082a21": "SFEscrow()", +"fe085775": "PresaleAllocation(address,uint256,uint256)", +"fe08e5fe": "setGalleryTwoPrice(uint256)", +"fe0904e6": "minerDifficulty()", +"fe094708": "Map(address,address,uint256,uint256)", +"fe098371": "findFrozenCell(address,uint128,uint128)", +"fe0a2c30": "returnArrayBytes1(uint8)", +"fe0a5ab0": "BLOCKS_BUCKET_SIZE()", +"fe0ba34e": "placeSellRequest(uint256,uint256,uint256)", +"fe0c32ae": "INEX()", +"fe0c4085": "vestingEnded(address)", +"fe0d94c1": "execute(uint256)", +"fe0dadd7": "teamTwoTotalPlayers()", +"fe0f2fab": "ChangeClaimAddress(address,address)", +"fe10d836": "setTokensToBeClaimed()", +"fe110116": "transferToPool()", +"fe12aeec": "SalesAgentAppointed(address,address)", +"fe1391ad": "generateFixtures()", +"fe13a823": "computeResponseFirstHalf(uint16)", +"fe13b118": "beginDutchAuction(uint256,uint256)", +"fe13baf7": "_encodeTokenId(int256,int256)", +"fe1439b4": "setCTO(address)", +"fe14b085": "walletUserCount()", +"fe164a5b": "setWhitelistThresholdBalance(uint256)", +"fe168eef": "_isNoNeedInCountryLimitChange(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"fe16e862": "transactionsOnForHolderUpdate(address,uint256)", +"fe16ed13": "getNDay(uint256)", +"fe173b97": "gasPrice()", +"fe1798a7": "randomAttack()", +"fe1829b6": "extendPublicSaleDiscountEndTime(uint256)", +"fe1865cd": "setCompte_26(string)", +"fe188184": "lastWinner()", +"fe18d6e6": "convertToEth(uint256)", +"fe18f82a": "getReceivedFunds(address)", +"fe192f1e": "parseIntRound(string,uint256)", +"fe195767": "distributeEPAL(address[])", +"fe19f495": "VESTING_CLIFF_DURATION()", +"fe1b0a5c": "setHardCap(address)", +"fe1b588f": "CoinExchange()", +"fe1b602a": "getPVPCycles(uint32[])", +"fe1b6f8f": "getVendorName(address)", +"fe1bae83": "callforhelp(uint256)", +"fe1c5aac": "SetParticipantURI(address,address,string)", +"fe1c91fa": "performWithdrawAccounting(uint256,address)", +"fe1cdbb8": "Module(address)", +"fe1ce5d7": "checkOwner(address,address)", +"fe1d2295": "BankWithdrawal(address,uint256)", +"fe1d470d": "calculateDiceProfit(uint256,uint256)", +"fe1da528": "tokensByEurTx(string)", +"fe1dcbb1": "AuthorizeOperator(address,address,bool)", +"fe1e079e": "getNumAnimalsXPlayer(address)", +"fe1ebb04": "augmintReserves()", +"fe1f06ea": "IQIAN(uint256,string,uint8,string)", +"fe1f11f1": "getNbits(bytes)", +"fe1f6a0b": "createGame(bytes32,address)", +"fe1fd352": "validEmitBuff()", +"fe211279": "testPrintableToken()", +"fe213712": "USER_GET_PRIZE()", +"fe21f306": "chainlinkOracleAddress()", +"fe229b61": "_softRequire(bool,bytes32)", +"fe229f7c": "RecToken()", +"fe22fcd8": "issuanceLastModified(address)", +"fe230675": "hasRecord(address)", +"fe23583d": "fechVoteResultForCandidate(address)", +"fe23b262": "currentPreICObalance()", +"fe23baea": "setHashByWriter(address,bytes32,address,bytes32)", +"fe23c6d1": "BetWon(address,uint256)", +"fe2450c1": "challengeRewardsPercent()", +"fe2506a4": "buyFromBal(uint256,uint256,bytes32)", +"fe2545dc": "purchaseFromVault(uint256)", +"fe25e00a": "arbiter()", +"fe26063f": "getTradeAndHash(uint16,address,address)", +"fe261ab0": "boolToUInt(bool,bool)", +"fe2622a5": "AgriChainDocuments()", +"fe2644c6": "creator_fee()", +"fe26cdeb": "And(bytes32,bytes32)", +"fe26da0c": "publicGetState()", +"fe26f16f": "withdrawABIHash()", +"fe275280": "Silver()", +"fe277aba": "chAllowAirdrop(bool)", +"fe280f2b": "roundInfo(uint32,uint32)", +"fe2830d3": "PausableCrowdsaleImplPaused(uint256,uint256,uint256,address)", +"fe28d1d8": "CROWD_WAVE2_BONUS()", +"fe29fc12": "CategoryCapSet(uint256,uint256)", +"fe2a4e62": "lockAndDistributeTokens(address,uint256,uint256,uint256)", +"fe2b6246": "updateMaxMinComparables(uint256,uint256,uint256,uint256)", +"fe2c6198": "price(string)", +"fe2ca553": "setBalances(uint256,uint256)", +"fe2cce6f": "PaylessMinisplit()", +"fe2cec21": "NeobitToken()", +"fe2d8933": "preIcoInvestors(address)", +"fe2da970": "getUserByUsername(bytes32)", +"fe2dac15": "LogNewQuestion(bytes32,address,uint256,string,bytes32,address,uint32,uint32,uint256,uint256)", +"fe2dc64b": "finalizeProposalVoteResults(bytes32,bytes32)", +"fe2e306b": "playe2Bid()", +"fe2e5db4": "SwapyExchange(address,address)", +"fe2edc1e": "retrieveFinished()", +"fe2fdf0b": "determineAllocation(address[],uint256[])", +"fe2ff4cf": "TokenSold(address,uint256)", +"fe31da3b": "disapproveByB(uint256,string)", +"fe32a6a7": "pushICO(uint256)", +"fe32c448": "TokenHolder(address)", +"fe332a0c": "backDARFtokenOwner()", +"fe33ada9": "isExistFounder(address)", +"fe34e486": "getStatus(bytes16)", +"fe353a5e": "checkWithdrawValueForAddressFX(address,uint256)", +"fe353d28": "_computeNextGen0Price(uint256)", +"fe35530c": "setUserWithdrawalAccount(address)", +"fe35804e": "createLottery(uint256,uint256)", +"fe37f21a": "changelp17(address)", +"fe389e09": "removeContract()", +"fe38ed66": "MarketManager()", +"fe396c71": "mintEarlySupportersTokens(address,uint256)", +"fe399121": "referrerEarnings_()", +"fe3b24b1": "createBBODocument(bytes32,uint256)", +"fe3c333b": "getActiveJudgmentByParty(address)", +"fe3c458e": "addContract(bytes32,address,bytes32)", +"fe3c51df": "getTeamId(string)", +"fe3c5d80": "becomeSnailmaster()", +"fe3c6ad4": "addclip(address,string,string,string)", +"fe3c9b6b": "setIcoEndTime(uint256)", +"fe3ce632": "lookup(bytes4,bytes)", +"fe3d002b": "AllocateAngelTokens(address,address,uint256)", +"fe3d07e4": "decrementInventory(uint256,uint256)", +"fe3d2236": "Oracle_ChangePeriod()", +"fe3e0efd": "TestERC20Token(string,string,uint256)", +"fe3ead72": "interreducemoney(address,uint256)", +"fe415139": "ProdPublicSale()", +"fe4170bc": "setDepositLock(bool)", +"fe417fa5": "claimTokens(address,uint256)", +"fe41b2da": "setInitialValidators(address[])", +"fe4215f7": "read_recast_config()", +"fe4259e3": "isMntpMigrated(address)", +"fe42cb2d": "setTokenExpectedFee(address,uint256,uint256,address)", +"fe42da15": "deleted(string,string,address,uint256)", +"fe435f6b": "getLLV_edit_33()", +"fe43be3f": "startDestruction()", +"fe442478": "sendFromContract(address,address,uint256)", +"fe44a664": "generateWithdrawalHash(string,uint256,address,uint256)", +"fe44d401": "MoncionToken()", +"fe4520ad": "_getOwnerTokens(address)", +"fe45c996": "reVerifiPost(uint256,bool,bool)", +"fe460201": "getTermsAndConditions()", +"fe4667e9": "getMaxLossAfterTrade(address,uint256,uint256,int256,int256)", +"fe47a2ad": "multiRequestAudit(string,uint256,uint256)", +"fe47a8a7": "totalFunding()", +"fe47c806": "processFunding(address,uint256,uint256)", +"fe47d34f": "USC(uint256,string,string)", +"fe49a9be": "ethGiven(address)", +"fe49ba1c": "getUnlockIdentifier(uint256,address,address)", +"fe49dd5f": "halveEntryPrice()", +"fe49e949": "requestChangeInsuranceFees(uint80,uint80,uint80,uint80,uint256,uint80,uint80,uint256)", +"fe4a3ac9": "setExecPrice(uint256)", +"fe4a3e5c": "TokenrateUpd(uint256,uint256)", +"fe4b84df": "initialize(uint256)", +"fe4c39fe": "setMaxArenaOneDay(uint256)", +"fe4c6b08": "_deliverTokens(address,uint256,uint256,uint256)", +"fe4caa64": "isAborted()", +"fe4cee66": "numberOfPartitions()", +"fe4d2a02": "_setupStages()", +"fe4d62f9": "getMiningKing()", +"fe4dd8d9": "getTokenApproval(uint256)", +"fe4e4a84": "exchangeIsRegistered(address)", +"fe4e6bf9": "queueMint(address,uint256,uint256)", +"fe4ee216": "transferTips(address,uint256,address,uint256,uint8,bytes32,bytes32)", +"fe4f7e11": "KangenToken()", +"fe501c6f": "ChannelSettled(uint256)", +"fe50cc72": "getGreeting()", +"fe50ce60": "getBloodlineFromParents(bytes32,bytes32)", +"fe51717a": "releasePause()", +"fe51c588": "changeFactoryAdmin(address)", +"fe52ee70": "setStartingTokensAmount(uint256)", +"fe530027": "trusteeWithdraw(uint256)", +"fe536ebe": "setPreferredSaleStartAndEndTime(uint256,uint256)", +"fe537a82": "upgradeTarget()", +"fe549815": "pendingTokenBalance()", +"fe54b5fc": "kyberHash()", +"fe553250": "adminTransferWorldBalance(uint256)", +"fe556cf0": "CirculationSupply()", +"fe55932a": "setName(uint256,string)", +"fe562ee6": "moveBlockValue(address,uint8,uint8,uint8,uint8,uint256)", +"fe5675cc": "toNext()", +"fe56e232": "setManagementFee(uint256)", +"fe56f5a0": "setEntranceFee(uint256)", +"fe5709c2": "getSlotWeight(uint256,uint256)", +"fe5709cd": "createPainting(uint256)", +"fe575a87": "isBlacklisted(address)", +"fe5815a6": "hasFinished()", +"fe58d3a3": "timeLimitEnable()", +"fe599559": "updateEthToUsdExchangeRate(uint256)", +"fe5a4e2d": "contractorReleaseFunds(bytes16,address,address,uint256,uint256)", +"fe5aa8e0": "getUserIndexOnToken(address,address)", +"fe5ba303": "reservesPerUnitToken()", +"fe5d5868": "XZBX()", +"fe5daae6": "_queAmount(uint256)", +"fe5e1853": "totalBet()", +"fe5e7e3e": "endICO14()", +"fe5f1dc4": "PRESALEPLUSCROWDSALE_EVE()", +"fe5f2e88": "refund(string)", +"fe5ff154": "recruitHeroFee()", +"fe602c65": "is_proposal_supported()", +"fe60d12c": "reserved()", +"fe60ed81": "changeUserGroup(address,uint256)", +"fe6129d5": "setPromoBonus(address,uint256)", +"fe61303b": "createGuardianSale(uint256,uint256,uint256,uint256,uint256,uint256)", +"fe6214c4": "LDTCrowdsale()", +"fe62a0a6": "transferFromPretgefund(address,uint256)", +"fe63300a": "registerExternalBill(uint256,address,address,uint256,uint256,uint256)", +"fe637e5e": "getScoreChange(int256,int256)", +"fe63d701": "removeQueueElement(uint256)", +"fe647394": "setTeamProfitAddress(address)", +"fe64d6ff": "changeAddress(address)", +"fe65066e": "setUsdMnr(uint256)", +"fe65bb65": "cashHistory()", +"fe669c26": "addPhase(uint256,uint256,uint256,uint256)", +"fe675deb": "Exchange(address,address,address,address,bytes32,uint256,address)", +"fe675f13": "toggleFieldActivation(string)", +"fe67a189": "finalizedTime()", +"fe67a54b": "endAuction()", +"fe687b2b": "teamc()", +"fe68b528": "getExchangeInformation(address)", +"fe68e285": "toNextStage()", +"fe68f73b": "getTargetBudget(uint256,uint256)", +"fe69c926": "onFrozenToken(address,uint256,uint256)", +"fe69dacd": "validDraws(address,uint256,uint256[])", +"fe6a0cd6": "hasNextSeedHashB()", +"fe6ad6c6": "isNotarized(bytes32)", +"fe6bca8f": "AllTest7()", +"fe6c19a4": "HelixexToken()", +"fe6cf9ee": "Krypticion()", +"fe6d4305": "ALC_DECIMALS()", +"fe6dcdba": "top()", +"fe6e0441": "minimalWeiTLP1()", +"fe6f0d82": "testConstructorEvent()", +"fe6f1b05": "percentDivider()", +"fe6f2a60": "matches(bytes32,bytes32)", +"fe6fef44": "setTokenQuota(uint256)", +"fe7009f2": "getSupplier(address)", +"fe704c1f": "RWQToken(uint256)", +"fe70a123": "KilledTokens(address)", +"fe70f417": "getNewForkReputationGoal()", +"fe71aec5": "LittleCactus()", +"fe71be6e": "monarchToken()", +"fe72277d": "addHashType(bytes32)", +"fe7279b1": "setTokenTransferFeeReceiver(address,address,address,address)", +"fe72ac7f": "newPrice(uint256)", +"fe72e717": "toDie(bytes)", +"fe72f3be": "addMember(string,string,string,uint256,string,string,uint256,string)", +"fe73bf21": "developer_edit_text_Exchanges_links(string)", +"fe73e3ec": "preliminaryGameResult(uint64)", +"fe73f74c": "withdrawTokenFromTAR(address,uint256)", +"fe742c6a": "millionInCents()", +"fe74f05b": "assertEq(int256,int256)", +"fe757fb5": "lastClaimPrice()", +"fe758a1e": "_timelimitCal(address)", +"fe75dff6": "GcoinProto()", +"fe75ff54": "runLottery(uint256)", +"fe76fbe3": "setStageOpeningTime(uint8,uint32)", +"fe777bcd": "etherForSale()", +"fe77adda": "reloadTickets(uint256,uint256,uint256)", +"fe77f5e5": "getCostToNextLevel(uint256)", +"fe7805f2": "MultiSigWallet()", +"fe786c5f": "prependUnderscore(string)", +"fe79bfd0": "giftCode(string,address)", +"fe7b0007": "calculateClaimable(address)", +"fe7baf8e": "RemoveAuthorityAddress(address)", +"fe7bf05e": "deathData_v6()", +"fe7c550f": "fibos(uint256)", +"fe7ccb79": "CCN()", +"fe7cd999": "registerForICO(address[],uint8)", +"fe7d1587": "canCall(address,address,address,address,bytes4)", +"fe7d8740": "getFreelancerContracts(address,uint256[],uint256[])", +"fe7e187f": "add_kycer(address)", +"fe7eba06": "getCurrencyLength(uint256)", +"fe7f0d14": "DST_BOUNTY()", +"fe800489": "totalUnitsLeft()", +"fe802d7f": "isMHTHolder(address)", +"fe8190ce": "test_v1()", +"fe8252f3": "withdrawlEnabled()", +"fe830334": "initToken(string,string,uint8,address,uint256,bool)", +"fe8311db": "sendLimitTokensToPartner(uint256)", +"fe8312c1": "validateWallet(address,bool,string)", +"fe836931": "freezeAmount()", +"fe8370bb": "NinjaCoin()", +"fe84bff5": "getTransferValue(uint256)", +"fe84c5ec": "fixedExpUnsafe(uint256,uint8)", +"fe853650": "getRandomHashesLength()", +"fe856722": "gasPrc()", +"fe859472": "PractiParlezToken()", +"fe86338c": "cancelOrderList(bytes32[],uint64[])", +"fe86de13": "testTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address,bool)", +"fe8705d5": "throwOnIncompatibleContract()", +"fe87ee28": "endRC()", +"fe8806f5": "removeRequest(address,address)", +"fe882fe2": "getValueAndBox(address)", +"fe88fc00": "balancsHolder(address)", +"fe892327": "DML_TOTAL_SUPPLY()", +"fe8925f4": "interestFeePercent()", +"fe89960f": "getFreeToken(string,address,uint256,bytes32,bytes32,uint8)", +"fe89a6c1": "MAX_ALLOWED_STAGE_1()", +"fe8a7458": "_isLowercaseLetter(bytes1)", +"fe8b2707": "depositedEtherGeneric(address,bytes4,address)", +"fe8b6642": "setEnforceRevisions(bytes32)", +"fe8beb71": "getVersionFor(address)", +"fe8cbe18": "LogBidWithdrawn(address,uint256,uint256)", +"fe8d640c": "setifoodCommunityAddress(address)", +"fe8d8c77": "setShouldGateGuard(bool)", +"fe8e6a63": "quarryCities(uint256)", +"fe8e77c7": "getGameIdByWalletUser(address)", +"fe8e992f": "unpackAllocation(bytes32)", +"fe8f4763": "ROYBOITokenIToken()", +"fe8f4bbe": "freedWinPoolToWinSystem()", +"fe8fb49f": "setLastMaxInvestments(uint256)", +"fe908b7a": "pay(bytes32,address,address,uint256,uint256,bytes)", +"fe90f3df": "WPAYCoin()", +"fe91d37f": "semanticVersionHash(uint16[3])", +"fe92049d": "submitAnswerByArbitrator(bytes32,bytes32,address)", +"fe925e80": "createLoan(address,address,address,uint256,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"fe937fa4": "setEndMintDate(uint256)", +"fe949159": "sendMessageToChannel(string,string)", +"fe94e504": "setColor(uint8,string)", +"fe95112c": "faythe()", +"fe95a5ce": "hat()", +"fe95cbdd": "getAgentsWithService(uint256)", +"fe95ec9c": "popcnt32(uint32)", +"fe968ade": "putStcWithBto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"fe972054": "create(string,string,uint8,uint256,address,uint256,uint256,uint256)", +"fe972f11": "_toMill(uint256)", +"fe97bcf4": "RandomNumberGenerated(uint256,uint8)", +"fe97e481": "maxCap_MInt()", +"fe97ee88": "hasPhone(address)", +"fe98184d": "trustedUniverseTransfer(address,address,uint256)", +"fe985cb9": "buyin(address)", +"fe98f1d1": "testCantFinalizeIfNotMultisig()", +"fe99049a": "transferFrom(address,address,uint256,uint256)", +"fe992c98": "balanceOfAll(address)", +"fe996956": "PMET(uint256,string,string)", +"fe99ad5a": "transferMinter(address)", +"fe9a3664": "supportList(address)", +"fe9afc5a": "LastUser()", +"fe9b7f2f": "maxAmountETH()", +"fe9bb2da": "setCSCFactoryERC721(address)", +"fe9bf404": "createManager(address,address)", +"fe9c3c28": "purchaseHalted()", +"fe9cc7f4": "VebEX()", +"fe9ccc1e": "maxBetWei()", +"fe9d2828": "getPI_edit_11()", +"fe9d7121": "StorageEther(address,address,address[],uint256,string,string,uint8)", +"fe9d744d": "buyBulkRegularCar(address,uint256[],address)", +"fe9d9303": "burn(uint256,bytes)", +"fe9e1c0f": "buyTokens_Vault(address,uint256,bytes8)", +"fe9fa16f": "testThrowExecuteSellOrderTwice()", +"fe9fab4d": "setPrices(string)", +"fe9fbb80": "isAuthorized(address)", +"fea0029d": "getEmissionType()", +"fea1377d": "USD_HARD_CAP()", +"fea22ae4": "newMinimumTokens(uint256)", +"fea277dc": "withdrawERC721(address,uint256,address,address)", +"fea2920e": "createNewDraw()", +"fea3afb6": "Update_UserPlayHistory_Data(uint32,uint32)", +"fea45621": "changeTotsupp(uint256)", +"fea5d7b1": "mgmtIssueBountyToken(address,uint256)", +"fea5d9e0": "lengthEqual(uint256[],uint256,string)", +"fea708f6": "totalPeriods()", +"fea78df4": "buyGold(uint256,uint256,uint8,bytes32,bytes32)", +"fea7bcfb": "additional(uint256)", +"fea8ae97": "MakerWithdrewERC20Token(address,uint256)", +"fea9b572": "MAX_NUMBER()", +"feaa29d8": "insertProfitHere()", +"feaa4cf3": "updateIntention(uint256,string,string,string)", +"feaaa476": "BurnToken(address[])", +"feac36d7": "insert(bytes32,bytes32)", +"feaceab4": "addPayment(string,address,string,uint256,uint256)", +"fead0097": "setTotalUnvestedAndUnreleasedTokens(address,uint256)", +"fead83a4": "redeemContingencyFundsBal()", +"feadce9c": "servicePause()", +"feadfdbd": "getTimeFromPrize()", +"feaea586": "recoverToken(address,address)", +"feaed589": "releasedMarketingTokens()", +"feaf0872": "getTokenTransferCount()", +"feaf1fe1": "registerToBlacklist(address)", +"feaf653d": "sendEth(address[],uint256)", +"feafb79b": "foundationAddr()", +"feb03fe1": "_handleProductionIncrease(address,uint256)", +"feb088ab": "openingTimePeriodTwo()", +"feb2432a": "addMediator(address)", +"feb272e4": "noDuplicates(bytes)", +"feb27ac9": "Proof_of_Tacos()", +"feb2a20c": "apiAccessDisabled()", +"feb31939": "attack(address,uint256,uint256[])", +"feb371cd": "VUP_TOKEN_SUPPLY_TIER2()", +"feb4ad89": "addEarlyPurchases()", +"feb4c708": "nextIdentityAccount()", +"feb50430": "getLevitatingKittens(bytes32,uint64)", +"feb5d106": "getBPCount()", +"feb7267b": "deleteMintable(address)", +"feb7d2fb": "KoniosToken(uint256,string,string)", +"feb80ee4": "stakeFromTokenContract(address,uint256)", +"feb99390": "add(uint128,uint128)", +"feba95fb": "purchaseFor(uint128,address)", +"febb0f7e": "bar()", +"febb1315": "gasLimitInWei()", +"febb5407": "currentLiquidity(address)", +"febc14b1": "roundCounter()", +"febc2980": "calculateWinnersCount(uint256)", +"febc8c39": "feeAffiliate()", +"febc9dec": "stringEquals(string,string)", +"febdb9b8": "rewardWinner()", +"febe4909": "approve(uint256,address)", +"febe8129": "destrcut()", +"febec059": "GetCurrentTypeSaleCount(uint256)", +"febefd61": "startAuctionsAndBid(bytes32[],bytes32)", +"fec07cb2": "calculateTally(address,uint256)", +"fec0cc19": "setIcoPhase4(uint256,uint256)", +"fec1aa12": "codetokenIndexToApproved(uint256)", +"fec1c41f": "AddNewBooster(uint256,int256,uint256,uint256,uint256,uint256,uint256)", +"fec2e27b": "acceptManagement(string)", +"fec320f4": "ListPairsForReserve(address,address,address,bool)", +"fec35182": "Crowdsale(address,uint256,uint256,uint256,uint256,address,address)", +"fec3e941": "MintAndTransferIAC(address,uint256,bytes32)", +"fec3fbe2": "functionTwo(uint256,uint256,uint256,uint256)", +"fec5438c": "costToCallOraclizeInWei()", +"fec568d4": "TransactionCompleted(uint128,uint256,uint256,string)", +"fec5c5f7": "FINX2Token()", +"fec5d3b0": "BTCRate()", +"fec5f0d2": "applyForGladiatorBattle(uint256,uint256,uint8[2])", +"fec69a87": "OneStandardToken(uint256,string,uint8,string)", +"fec6c66e": "applyFromCertificate(string,string,string,uint256)", +"fec74d31": "eolBlockNumber()", +"fec7c0a2": "FRPRUPEES()", +"fec7fc8e": "isSigned(bytes16,address)", +"fec84aac": "LogUserAddedToWhiteList(address)", +"fec850c3": "tokenSetBurnFeeReceiver(address,address,address,address)", +"fec86fb5": "userdynamicprofis()", +"fec8db83": "C3_TokenCreate(uint256,string,string)", +"fec966df": "countSmartSharingContract()", +"fec97c03": "finishFundraiser(uint256)", +"fec9cd77": "allowanceToBurn(address,address)", +"fec9dc1f": "updateNewToken(address,address)", +"fecab4bf": "vreoSaleOngoing()", +"fecadafd": "pushAtom(uint64,uint8,uint8,uint8,uint32,uint64,uint64,uint128,uint128,uint32)", +"fecc36c0": "fun(int256)", +"fecca5a5": "checkMyDonation()", +"fecd3486": "getTulip(uint256)", +"fecd817c": "cancelBuy()", +"fece5543": "mock_remove(address,address)", +"fecf9959": "withdrawTokens(uint256,address,uint256)", +"fed03118": "getTDETokenExchangeRate(uint256)", +"fed0827e": "RoseCoin()", +"fed09b2f": "isFemaleSale()", +"fed0b877": "distributeAirdropMulti(address[],uint256[])", +"fed0d2a1": "sellMultiplier()", +"fed1c977": "blockTransfering()", +"fed1cec2": "addWinners(uint256)", +"fed2063c": "mintDataStream(address,uint256,bytes32,bytes32,uint256)", +"fed23223": "sellFirst(uint256)", +"fed26772": "zeroFeeTransferByowner(address,address,uint256)", +"fed39929": "productOwner(string)", +"fed3a300": "right89(uint256)", +"fed3b141": "Coinbase(uint256)", +"fed3f18d": "admin_inactive_withdraw(address)", +"fed4614b": "funeral(bytes,int256)", +"fed4de76": "addAuthorizeRole(string,string,string)", +"fed503cd": "transferCoinInStages(address,address,uint256,uint256)", +"fed73b54": "getPlayerIdOfIndex(uint256,uint256)", +"fed7bb07": "getSeedAmountForGameId(uint256)", +"fed82ef3": "setSanityBounds(uint256)", +"fed8a53b": "callbackInsertApproveAndDistribute(uint256,address[],uint256[])", +"fed8b30a": "canSettleOrder(uint256,uint256)", +"fed8f40f": "invalidateMail(uint256)", +"fed9981e": "setDemocAdminEmergency(bytes32,address)", +"fed9d44f": "ARBITRARY_VALUATION_IN_ETH()", +"feda1045": "slaveWallet()", +"feda38bc": "setCrowdsaleOpen(bool)", +"fedabacf": "claimPrepaid(uint256,uint256,uint256,string,uint256)", +"fedb6dfd": "TACTICALCRUISER_FTL_SPEED()", +"fedbceba": "getRankLandLimit(uint256)", +"fedc2a28": "_rewardWinners(string,uint8,address[])", +"fedce093": "TheNextBlock()", +"fedda73b": "HC8ICO()", +"fedda89c": "claimVesting()", +"feddb41c": "peculOld()", +"feddd053": "updateStakers()", +"fede04c3": "reject(uint32,int256)", +"fede5cc6": "issueInternal(address,uint256,bool)", +"fedeac70": "handleQuickCloseChannel(address,bytes32,address,uint256,address,uint256,uint256)", +"fedf1ed8": "getCompte_21()", +"fedfd535": "Config()", +"fedfe46c": "vote(address,uint256,uint256,uint256)", +"fedffec0": "currentReferralPercent()", +"fee01177": "getTopics()", +"fee0596f": "createContractCompany(string)", +"fee13823": "ChargeTreasure()", +"fee1396b": "registerNewRecord(bytes32)", +"fee160be": "CarFare(uint16,uint16)", +"fee16841": "showDeposit(address)", +"fee21471": "getDayIndex_(uint256)", +"fee24454": "sendNowLastCount()", +"fee2cb05": "R2()", +"fee3154c": "setTransferWhitelist(address,address,bool)", +"fee35ff8": "newInvest(uint256,address,uint256)", +"fee4f41e": "signUp(string,address)", +"fee4f84d": "CryptopusToken()", +"fee692a3": "getAutomatedReportDisputeDueTimestamp()", +"fee6d28c": "addSnapshot(string)", +"fee7e35d": "tokenURISafe(uint256)", +"fee8775b": "Ping(address)", +"fee87e3b": "addresstoBytes(address)", +"fee99898": "getFee(address,address)", +"fee99e93": "HPAToken(uint256,string,uint8,string)", +"fee9aa44": "calculateRewardForAddress(address,address)", +"fee9ca13": "continueSale()", +"feea01b9": "create(bytes16,uint64,bytes)", +"feea799b": "rejectTransaction(uint256,bytes)", +"feec6fc1": "Tegchain(uint256,string,string)", +"feec756c": "updateRecipient(address)", +"feec7680": "changeFeesAddress(address)", +"feed5561": "getContributorsCount()", +"feed58ff": "setBackgroundColors(bytes3[])", +"feeda367": "addMarketTo()", +"feee8139": "setColors(uint32[],uint8[])", +"feefee1b": "firstExchangeRatePeriod()", +"fef038e8": "piggyBank(address)", +"fef10b95": "poolReward()", +"fef1dc7d": "seekerValue()", +"fef28cac": "Yudhacoin()", +"fef2cc97": "getPreAuthorizedAmount(address,address)", +"fef429e9": "linkClaimedTo(address)", +"fef47e38": "CREATE_NAME_ROLE()", +"fef4b969": "refundFromSeveral(uint256,address[])", +"fef5ae43": "enterCurrentRound()", +"fef5b185": "updateUserEducation(string,uint256,string,uint16)", +"fef5f1e7": "validateRequestParams(address[4],address,uint256[12],uint256,bytes,uint256)", +"fef636a8": "stage2Start()", +"fef64e37": "packedToStartTime(uint256)", +"fef7d5a8": "findEmptyBenefactorIndex()", +"fef8383e": "gameOpponent()", +"fef88502": "hommie()", +"fef9b5ae": "changeminpublicsale(uint256)", +"fef9cfe1": "setAvailableAfterStart(uint256)", +"fefa69a0": "batchCancelOrders()", +"fefa7d1c": "isLockup(address)", +"fefa7e41": "countDrugs()", +"fefa9bb1": "addReferrer(address)", +"fefaa293": "reservedTokensTeam()", +"fefaa626": "gameFinishedTime()", +"fefacee1": "MediatorFees()", +"fefb130e": "srb(uint256)", +"fefb8dc3": "publishPost(string,string)", +"fefb94a5": "PFAToken()", +"fefba6dd": "transferAnyERC223Token(address,uint256)", +"fefc38fd": "startActivated()", +"fefc7089": "AVAILABLE_RESERVE_SUPPLY()", +"fefc8b41": "test_insert_findWithHintNotTightBound()", +"fefd336c": "getSettingValues()", +"fefd41b9": "balanceOfRick(address)", +"fefd51b2": "getBrick(uint256)", +"fefd6e9a": "allocateEqual(address[],uint256)", +"feff0506": "addListing(string,string,uint256,address)", +"feffd402": "fetchVoteMainInfo()", +"ff00c592": "setNumRewardsAvailableForAddress(uint256,address)", +"ff01f11a": "finalUnpaused()", +"ff01ff08": "setGameVars(uint256,uint256,uint256,uint256,uint256)", +"ff01ffa8": "refundCrowdsaleContributor()", +"ff02326f": "MoonDustDividends()", +"ff025819": "numberOfActiveProposals(bytes32)", +"ff026158": "setSale(uint256,address)", +"ff044add": "oldCratesSold()", +"ff056949": "decreaseBalance(address,uint256)", +"ff05a9f0": "giftPlot(uint256,uint256,address)", +"ff05edd8": "inflateSupply(uint256)", +"ff069b4c": "getPetbyTileId(uint16,uint8)", +"ff06bb57": "setEthInCents(uint256)", +"ff07061b": "LUC()", +"ff08d2b0": "PayMiners()", +"ff09068f": "SMRTCoin()", +"ff0935b1": "checkFeeSchedule(address)", +"ff0938a7": "isPause()", +"ff097659": "getServerInfo(uint256)", +"ff09ff99": "purchaseCity(uint256)", +"ff0a22db": "_shareProfit(uint256,uint256,address)", +"ff0b3fc5": "intervalLength()", +"ff0b9c90": "createCheckpoint()", +"ff0bfc91": "mayGenerateAddr()", +"ff0c5a4b": "ContributionReceived(bytes32,address,address,uint256,uint256)", +"ff0cd868": "ShareEstateToken()", +"ff0ec23e": "setEditionName(uint8,string)", +"ff0efd6c": "submitDistance(uint256[])", +"ff0f27de": "setIDChain(address,address)", +"ff0f2e80": "getNumOrdersByPayee()", +"ff0f2f71": "setTTCAddress(address)", +"ff102896": "tokenRedemption(address,string)", +"ff10dc66": "quickTrade(address,address,uint256)", +"ff11e1db": "collectEther()", +"ff12128a": "step(int256,bool)", +"ff125c8a": "transferAllowed(address,address,uint256)", +"ff13c6c6": "RefundLoaded(uint256)", +"ff1401cc": "OdinCoin(address)", +"ff163aca": "AcquinomToken(address)", +"ff176844": "ThanosXToken()", +"ff1780ec": "rescueToken(address[],uint256[])", +"ff178834": "testApproveWillModifyAllowance()", +"ff17bc98": "burnOwnerTokens()", +"ff184b5d": "EthPerToken()", +"ff18539b": "setDepositCreator(address)", +"ff186b2e": "ethPrice()", +"ff190061": "balanceOfActiveToken(address)", +"ff192bc8": "isFreeze(address)", +"ff197bc3": "presaleTokenSold()", +"ff1ad781": "deadbids(address)", +"ff1ad7fa": "claimRewardBy(address,uint256,string)", +"ff1b01a6": "bet1000(uint256)", +"ff1b4341": "easyPropose(address,uint256,uint256)", +"ff1b636d": "Admin()", +"ff1c52d8": "Queue(bytes32,bytes32,bool,bytes32,address)", +"ff1c559e": "ChampionGameFinished(uint256,address,uint256,uint256)", +"ff1ca005": "supportComponent(uint16,uint256)", +"ff1d20b5": "getSecondStageWallet()", +"ff1d2712": "versionIndex()", +"ff1d83ae": "getTokenGranteesLength()", +"ff1d91b4": "ccStartTime()", +"ff1d9dd4": "updatePoolContract(address)", +"ff1e28a4": "createStamp(address,uint256)", +"ff1f7046": "requiresAuction(string)", +"ff1fd974": "getPayAmount(address,address,uint256)", +"ff2073d7": "fundRaiser()", +"ff208fa5": "test_insert_findWithHintNextAtPosition(int256)", +"ff213498": "FlowingHair()", +"ff21984a": "testMintAuth(int256)", +"ff21f27f": "issueToken(uint256,uint256,uint256,uint256)", +"ff22028b": "requireOwnerUnlockedAmount(uint256)", +"ff2258cb": "diffYears(uint256,uint256)", +"ff2263b7": "firstRoundStartTimestamp()", +"ff2311a4": "GetPatient()", +"ff238839": "showDelegateMsgSender(address)", +"ff23c7f2": "createArtefact(uint256,string,uint256,uint256,uint256)", +"ff23e1eb": "ShalloToken()", +"ff249bb0": "getTokenPacksAvailable()", +"ff25af24": "migrateAccount(bytes32,bytes32,uint256,uint256,address)", +"ff25e16d": "getLogErrorArguments()", +"ff25f859": "KIN_FOUNDATION_ADDRESS()", +"ff262ea5": "construct(uint256)", +"ff266d26": "reopen(address)", +"ff272ad4": "__toDecimals(uint256)", +"ff27848a": "GoldToken(address)", +"ff27c476": "shiftBitsRight(bytes,uint256)", +"ff27cbda": "getPI_edit_4()", +"ff28bcc2": "increaseReward()", +"ff28cdaf": "WCT(address)", +"ff28d625": "releaseEarning(bytes32,bytes32,bytes32,bool,address,address)", +"ff29507d": "fundingStopBlock()", +"ff299a63": "BTCUToken(uint256,string,uint8,string)", +"ff29bc95": "assignBalance(address,uint256,uint256)", +"ff29c104": "getTotalLeaderboards()", +"ff2a3776": "claimAllUnsold()", +"ff2b0571": "doFreeExtension(bytes32)", +"ff2b247f": "addNewTicket(uint256,bytes32,uint256,uint256,uint256)", +"ff2b350d": "acceptGiftTokens(address)", +"ff2d4b71": "addDoctor(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint32,uint32)", +"ff2eff94": "Cow()", +"ff2f7a35": "getDeed(bytes32)", +"ff30feef": "walletTranslate()", +"ff31e930": "prizePoolAddress()", +"ff31f9e6": "getSecurityDepositRegistry()", +"ff332ab7": "getTokenDetails()", +"ff34ef7d": "PrimaToken()", +"ff359cb8": "RATE_SALESTAGE2()", +"ff36cf59": "contributeETH(address)", +"ff377705": "getNumEntries(address,address,uint256)", +"ff37839b": "getTxt(uint256)", +"ff37d31d": "escrowDeed(uint64)", +"ff394153": "transferEthersToDividendManager(uint256)", +"ff39ae55": "EthereumExtreme()", +"ff3a5eea": "isIco()", +"ff3a91d9": "getOwnerPicture(bytes32)", +"ff3adc83": "GazeCoinCrowdsale()", +"ff3af97f": "setBonusToken(address,uint256,uint256,uint256,address,uint256,uint256,uint256)", +"ff3bf1f4": "sitePercent_()", +"ff3c1a8f": "getTitle()", +"ff3c9472": "adduser(string,string,address)", +"ff3d1be0": "stopPreIco_step1()", +"ff3d398c": "buyTokensByAtes(address,uint256,string)", +"ff3e51c8": "ZULICC()", +"ff3e8ba1": "_transferDirect(uint256,uint256,uint256,bytes32)", +"ff3ef460": "_userOwnsToken(address,uint256)", +"ff3f427c": "createMobsterWithOwner(string,address,uint256,uint256,uint256,string)", +"ff3fb765": "testUpdateCase()", +"ff4039ea": "getDelegate(uint32)", +"ff40807b": "getAccumulator()", +"ff40fcf6": "buyBBC(address)", +"ff414b64": "getBalanceERC20(address)", +"ff41f5cc": "HUT34_RETAIN()", +"ff423357": "withdrawAmount(uint256,address)", +"ff429fc8": "getCooldown(uint16)", +"ff42fd41": "getTotalLockedAmounts(address)", +"ff4329ee": "receiveCashback(address)", +"ff4408ee": "stopCrowding()", +"ff46f210": "isUnfrozenAccount(address)", +"ff470507": "VaultbankVotingToken()", +"ff48fd9c": "mintGreen(address,uint256)", +"ff49b26e": "createEvent(uint256,uint256,uint8,uint32,address,uint256,uint8)", +"ff49b8ef": "KyberWhiteList(address)", +"ff4a6638": "followTrader(bytes,address,bytes32,uint256,address,uint256)", +"ff4a7a7c": "Blin()", +"ff4ab29c": "setMarketFees(uint256)", +"ff4b6fea": "_shiftLeft(bytes32,uint256)", +"ff4b9b95": "clearCandidateCache()", +"ff4bd173": "dealBuyContract(uint256,uint256,string,uint256,uint256,string)", +"ff4bf170": "TechieCoin()", +"ff4c9fa5": "getCurrentPriceForToken(uint256)", +"ff4cfa5e": "onSignUp(string,uint256)", +"ff4d7404": "sell(uint8,string,uint256,uint256,uint32)", +"ff4dddc4": "tokensInWeiSold()", +"ff4ea29e": "migrateTokens(address[])", +"ff4f03a9": "developeo()", +"ff507efa": "Consulteth(uint256,uint256)", +"ff508d76": "renderWeb()", +"ff50abdc": "totalDeposited()", +"ff50fcb6": "usedIcoSupply()", +"ff510ad8": "isOnTrade(uint256)", +"ff51d18c": "getFlightConnections(uint16)", +"ff523cb2": "oraclizeQueryGas(uint256)", +"ff53c5a3": "refundInvestor(address)", +"ff552482": "GennovaToken()", +"ff556ecb": "releaseUnicorn(uint256)", +"ff55da1c": "assertOnlySpecifiedCaller(address,bytes32)", +"ff55e2ee": "setCasinoAddress(address)", +"ff5639c4": "optInFromClassic()", +"ff56b59a": "start6Phase2025()", +"ff56b65a": "getTxPaymentKWh(bytes32)", +"ff5732a5": "calculateTokenGet(uint256,uint256,uint256,bool,bytes32)", +"ff574213": "YeekFormula()", +"ff584597": "setGameResult(bytes32,int256,int256)", +"ff585caf": "callback(uint256)", +"ff592125": "issuedNum()", +"ff596069": "computeAddressBonus(uint16)", +"ff597790": "getSold(uint256)", +"ff598a06": "betTotalGasprice_()", +"ff59f3cc": "theCyberGatekeeper()", +"ff5a478b": "finalizeTge()", +"ff5a47bd": "generateSeedB()", +"ff5b98b8": "setAvgReportingGasPrice(uint256)", +"ff5bc8a7": "getSaleContractTokensLimit(address)", +"ff5ce378": "_addTokenTo(address,uint256)", +"ff5d2c39": "to62Encoding(uint256,uint256)", +"ff5de44b": "getStockBalance(address,address,uint256)", +"ff5e51b3": "VTOSToken(uint256,string,string)", +"ff5e7d4d": "lockedFundsSeconds()", +"ff5f1346": "forSell()", +"ff5f8b4b": "takeOwnership(uint256,address)", +"ff5fcf01": "initializeNewSale(uint256,uint256,address,address)", +"ff5feb3e": "getVoterVotesCount(address)", +"ff5ff81f": "LastWillContractOraclize(address,address[],uint8[],uint256)", +"ff600081": "getValuePerMicroKey()", +"ff60af84": "setNewMinDeposite(uint256)", +"ff60cdf6": "get1TokenSellPrice()", +"ff615b87": "SECOND_PHASE_PRICE_FACTOR()", +"ff61ad09": "getRoomBalance(uint256)", +"ff62d2cf": "rewardAdjustmentPeriod()", +"ff630748": "setStepLimits(uint256,uint256)", +"ff6307f8": "angelFoundationShareDenominator()", +"ff6387ad": "setconfigurationTokenPrice(uint256)", +"ff6395a4": "assigned_bids()", +"ff63ac3b": "_getTime()", +"ff6417c1": "paidAddress(uint256)", +"ff6477be": "getScam(uint256)", +"ff64d469": "weR()", +"ff65226c": "canBuy()", +"ff655320": "withdrawFirst()", +"ff65e44a": "purchaseBronze()", +"ff668cbe": "donacionTeleton()", +"ff66a305": "setBountyManager(address)", +"ff67577a": "Appoint_Mediator(uint256)", +"ff67c9f5": "getRequirementTime(address)", +"ff6867c0": "startAndSetStopTime(uint256)", +"ff69ac36": "currentTokenAmount()", +"ff69e2bc": "CurrentPrice()", +"ff69f35e": "CryptoEmojis()", +"ff6a6df7": "MultiValidator()", +"ff6c33e6": "TOKEN_OWNER()", +"ff6c8b87": "MPGame(uint8)", +"ff6d24b1": "SedPOWToken()", +"ff6d6f63": "BCTToken(uint256,string,string)", +"ff6f0d54": "TipSmart()", +"ff6f2914": "foundersRewardsAccount()", +"ff7070eb": "_processIncomingEther(address,uint256)", +"ff70bd9c": "PirateNinjaCoin(string,uint8,string,uint256,uint256)", +"ff70c4d1": "getBuyerAddress(uint16,uint16)", +"ff70e8d9": "STAKE_MULTIPLIER()", +"ff70fa49": "setDeveloper(address)", +"ff71c6b0": "WALLET_T8EX_COMMUNITY()", +"ff722b08": "getSkillTypeCnt()", +"ff72c845": "bat()", +"ff739e40": "minEnterFee()", +"ff73d2d8": "getIsRevenuePaid(address,uint256)", +"ff74927b": "strConcat(string,string)", +"ff74c0b8": "subTotalInvoiced(address,uint256,uint256)", +"ff74e915": "NewContent(string)", +"ff75567b": "participant2SentEtherCount()", +"ff757d59": "kittenContract()", +"ff776f55": "regist(address)", +"ff77898a": "numberOfContractors()", +"ff7835bf": "SmartCoinCash()", +"ff78461c": "initSilver()", +"ff786f2d": "LogTradeError(address,address,uint256,uint256,uint16)", +"ff7885e8": "withdraw(address,address,address)", +"ff78d5ed": "mdtComparable()", +"ff78e48b": "setIsParentOf(bool)", +"ff79d600": "BATAGOR()", +"ff7b5730": "getSCF()", +"ff7c9329": "setMintingCompleted()", +"ff7c977f": "admin_dividend(int256,int256)", +"ff7e17b6": "endTimeTLP1()", +"ff7e5abd": "vestingIsCompleted(address,uint256)", +"ff7f5f2a": "EtherizationUtils2()", +"ff8028b3": "megaCandyToken()", +"ff80b69a": "minPresaleAmount()", +"ff81c554": "coinMinted()", +"ff81fb91": "unhint(int256,bytes32)", +"ff82b174": "getUserBigPromoBonus(address,address)", +"ff83ce17": "ManagerSet(address,bool)", +"ff83f562": "acceptOwnership(string)", +"ff840553": "roundid()", +"ff8489df": "tokensForFinalize()", +"ff848eaf": "newDeal(uint256,uint256,uint256,uint256)", +"ff84990c": "MRDSCoinToken()", +"ff84d49f": "setMiniPoolEdit_3(string)", +"ff84ed36": "Identity(address,address)", +"ff855ac3": "withdrawTokens1(uint256)", +"ff85bd39": "Free()", +"ff85fba2": "forceStart()", +"ff862839": "modifyairdrop(uint256)", +"ff8872c2": "accountEthAmount(address)", +"ff895a62": "deActivate()", +"ff897dbd": "updateMinAmount(uint256)", +"ff89a720": "ECCToken(uint256,string,string)", +"ff8bfffc": "sendEthTweet(uint256,bool,string,bool,string,string,string)", +"ff8cffc1": "returnBorrowerPaidLate(uint256)", +"ff8ed0f7": "Map(address,uint256)", +"ff8ee507": "EthernalLoveParent()", +"ff8f7551": "FINCO()", +"ff8f9b9f": "LOL10()", +"ff8f9de7": "BuyRTCtokens()", +"ff8fa0dd": "transferFromWithData(address,address,uint256,bytes32)", +"ff8fec7f": "setHashByProvider(bytes32,bytes32)", +"ff9151dd": "retrait_4()", +"ff91b949": "nonPublicSupply()", +"ff91bb45": "castVote(address,uint256)", +"ff92eb2c": "selleth(uint256)", +"ff938f4a": "addClientAuthority(address)", +"ff93a512": "createEvent(uint256,uint256,uint256,uint256,uint256,uint256,address[])", +"ff947525": "isShutDown()", +"ff94e502": "getIdByIndex(uint256)", +"ff950e90": "batchSpawnAsset(address[],uint256[],uint256[],uint256)", +"ff95a8d2": "grantFounderTeamToken()", +"ff96b467": "setLockup_contributors(address,uint256,uint256)", +"ff97278f": "_timeLimit(uint256)", +"ff981099": "getVotes(uint256)", +"ff9852bf": "balanceOwed(address)", +"ff989a0d": "safeDecrement(uint256,uint256)", +"ff9913e8": "allow(address)", +"ff992ef5": "addInvestorList(address,uint256)", +"ff993272": "bonus10end()", +"ff993a18": "ChangeBuyRate(uint256)", +"ff9a6773": "DexToken(address,address,address,uint256,uint256,uint256)", +"ff9b3acf": "house()", +"ff9c1c5c": "preICODataInitialized()", +"ff9c8437": "releaseStake(uint256,address,address,uint256)", +"ff9e1b38": "addUndergraduate(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint32,uint32)", +"ff9e3948": "phase_3_remaining_tokens()", +"ff9e7fe1": "MaxPowerCoin()", +"ff9f0e5c": "updateToken()", +"ff9f3055": "generateDna(uint256[])", +"ff9f633f": "lockedAddresses(address,uint256)", +"ffa05698": "get_back()", +"ffa08cb7": "checkPendingWithdrawal()", +"ffa094fb": "highestBidIsCC()", +"ffa1a2f1": "deleteMark()", +"ffa1ad74": "VERSION()", +"ffa230b0": "totalCharitySent()", +"ffa2548a": "LifeSet_008()", +"ffa2f5c2": "coindropsStatus()", +"ffa309e4": "currentFiscalYear()", +"ffa32d1c": "DST_ADVISERS()", +"ffa34f7c": "isFreezing(address)", +"ffa39d27": "ElectricCoin()", +"ffa39d3f": "_isAuthorized(address,bytes4)", +"ffa40a4c": "pregnantPandas()", +"ffa49c6a": "expiryEpoch()", +"ffa59501": "votesRemaining(uint64,uint64,uint8)", +"ffa61f69": "AllowSuccess(address,address)", +"ffa640d8": "tradeContract()", +"ffa651b6": "setEngineerInterface(address)", +"ffa67f6c": "crowdsaleUnpause()", +"ffa68839": "initDate()", +"ffa696d3": "exits(bytes32)", +"ffa6ae80": "isIdRegistered(bytes16)", +"ffa72707": "startBuying(uint256)", +"ffa82f78": "advisorsTokenAmount()", +"ffa89a00": "permissionToChange(address,address,uint256)", +"ffa8acde": "StrongHold()", +"ffa8c44a": "MINSALESCAP()", +"ffa90f7f": "redeemFrom(address,uint256,bytes,bytes)", +"ffa97aca": "getInvoice(address,bytes32)", +"ffaa3608": "voteFor()", +"ffaa67d4": "deployVesting(address,string,uint256,bool,bool,bool,address)", +"ffaa9c22": "setAllSupply(uint256)", +"ffaad6a5": "depositTo(address,uint256)", +"ffab0959": "backersRedeemed()", +"ffab3269": "EthRefunded(address,uint256)", +"ffab7dcd": "setPlayerGeneralDt(uint64,uint32)", +"ffab984d": "preIcoBuyPrice()", +"ffacade4": "setFilter(uint256,address)", +"fface4a3": "rowQuiter()", +"ffacf300": "doCrowdsaleMinting(address,uint256,int256)", +"ffad4fc1": "batchLock(address[],uint256)", +"ffad75eb": "finishICO(bool)", +"ffae15ba": "e()", +"ffae2c5b": "getAuthority(uint256)", +"ffae399e": "shouldRevert(bool)", +"ffaef25e": "addDataResponse(address,address,string)", +"ffaf78c2": "_createPiranha(string,address,uint256,uint8,uint256,uint8)", +"ffaf862f": "getProductWeiRaised(address)", +"ffb00df1": "TOKENS_LOCKED_2Y_TOTAL()", +"ffb05c6f": "minRequiredBlockQueueTime()", +"ffb0885d": "forceTransfer(address,uint256)", +"ffb171fb": "verifyBalanceProof(address,uint256,bytes)", +"ffb1a06d": "priceIsStale()", +"ffb1a6cb": "getWins(address)", +"ffb24446": "setMaxTicket(uint256)", +"ffb2c479": "process(uint256)", +"ffb2d35d": "allowRefund()", +"ffb308ef": "writeDocument(uint128,uint16,uint256,bytes32[],string,string,string)", +"ffb31c62": "BetterAuction()", +"ffb3401d": "SimpleAuction(uint256,address)", +"ffb38e84": "_setMinter(address,bool)", +"ffb391fe": "HM(uint256)", +"ffb40152": "contract_verified()", +"ffb4c857": "_confirmAndCheck(bytes32)", +"ffb4e44d": "get_participant(address,address)", +"ffb54a99": "tradingOpen()", +"ffb58247": "Ektcoin(uint256,uint256)", +"ffb5fc2a": "changeDeDeNetwork(address)", +"ffb747f0": "updateBatches(address,address,uint256)", +"ffb7bfba": "watchProposal(uint256)", +"ffb87173": "pixelPrice()", +"ffb92678": "commFoundAddr()", +"ffba376c": "unfreezeTokens()", +"ffbac044": "KickCommitteeFromMapAndArrayEvent(address)", +"ffbafdfe": "updateState(uint256,uint8)", +"ffbb62a3": "withdrawCoins()", +"ffbc9bd0": "canSubmit()", +"ffbd26ce": "addReinforcedWhitelist(address[])", +"ffbd400b": "boolToUInt(bool)", +"ffbd4dd5": "checkCertificate(string)", +"ffbd6f72": "splice(uint8[],uint256,uint256)", +"ffbd73d0": "OSUniEDUSupply()", +"ffbd8c37": "buyBNNTokens()", +"ffbfd19e": "accUserReward()", +"ffbfd38b": "FooStdToken()", +"ffc0060e": "QingFengCabve(uint256,string,uint8,string)", +"ffc0483d": "CoreAddress()", +"ffc0d035": "hgtDecimals()", +"ffc1b038": "blacklistInvestor(address)", +"ffc31215": "getStore(string)", +"ffc3a769": "transfer(address[],uint256[])", +"ffc3f1f2": "HyperToken()", +"ffc42904": "MarketContract()", +"ffc48c61": "buyerAddressTransfer(string,address,address)", +"ffc4bbb3": "FirstLevelCost()", +"ffc52a1f": "registerByList(address[],uint256[])", +"ffc54ea4": "setTokenActive(uint256,bool)", +"ffc6ff1e": "closeSubmission()", +"ffc797e4": "setLowerBondPrice(uint256,uint256)", +"ffc85dc5": "finalizeDeposits()", +"ffc8bcd7": "getRefToById(address,address,uint256)", +"ffc8c4cb": "totalConsume()", +"ffc9152e": "isRefunded(address)", +"ffc92376": "subEmployerTotalInvoiced(address,address,uint256)", +"ffc9896b": "getUserData(address)", +"ffca2968": "ExternalSaleSha3(uint8,bytes32,address,uint256,uint256)", +"ffcab3e9": "getValidDurationSignatures()", +"ffcad44e": "getGroupFileCount(string)", +"ffcb1edb": "getDividendTokenSupply()", +"ffcb39c2": "tier0(address)", +"ffcbb5df": "printStats()", +"ffcc7bbf": "getUserAtIndex(uint256)", +"ffcc8484": "nextroundERCtradeactive()", +"ffcce369": "changeIPFSHash(string)", +"ffcd64e5": "_issueByTranche(bytes32,address,address,uint256,bytes,bytes)", +"ffcdcb51": "AhooleeTokenPreSale(uint256,uint256,address,address,uint256,uint256,uint256,uint256,uint256)", +"ffcecf09": "PRE_SALE_START_3()", +"ffcf1ade": "logPromiseCanceled(uint256)", +"ffcf21a9": "eventOracles(bytes,uint256)", +"ffd10e07": "enterPool(address)", +"ffd19e8c": "isAlreadyProcessed(uint256)", +"ffd40b56": "allocatorBalance(address)", +"ffd4185c": "QuantumXICO()", +"ffd45f16": "calculateTokenCount(uint256,uint256)", +"ffd479bb": "setBaseInfo(uint256,bool,bool)", +"ffd48b73": "buyInternal(address,uint256,uint256)", +"ffd48f40": "setDelegadoDeDistritoVerify(bytes32)", +"ffd4e0e2": "getTotalIcoTokens()", +"ffd4e799": "HTJToken()", +"ffd4f4b2": "withdrawTokensFromContract(uint256)", +"ffd571ca": "ethersContributed()", +"ffd68462": "readCheckList(address,uint256,uint256)", +"ffd6a052": "ChangeAdminWalletAddress(uint256,address)", +"ffd71e13": "loadCoreAddress(address)", +"ffd740df": "removeNode(uint256)", +"ffd7b5e6": "investWithCustomerId(address,string)", +"ffd85b68": "setControllerDelegate(address)", +"ffd864d3": "chief()", +"ffd9ca40": "register(bytes20,uint64,bytes)", +"ffda0a37": "settleInterest()", +"ffdaa1b8": "TokenWithdraw(address,uint256,address,uint256)", +"ffdab909": "removeEntry(uint256)", +"ffdb0eb3": "getXRateProviderLength()", +"ffdcf095": "transferWithNarrative(address,uint256,string)", +"ffdd108b": "addEvent(uint256,string)", +"ffdd5cf1": "getInfo(address)", +"ffde0c74": "getGameState(uint256)", +"ffde8eae": "dismissBunner(address)", +"ffe0a9f2": "contractSymbolUpdate(string,bool)", +"ffe0fa66": "CarRegistry()", +"ffe189ef": "prev(uint80)", +"ffe280ee": "setWeight(uint256,uint256,bytes)", +"ffe2d77e": "directorLock()", +"ffe302d1": "setPlz(string)", +"ffe34512": "getNumChannels(address)", +"ffe3acc7": "changeGeneralSaleStartDate(uint256)", +"ffe3c6fd": "zKill()", +"ffe45b14": "getHTLCInvalidationTimeoutExtension(uint256,int256,bytes32,bytes32)", +"ffe48c76": "getBCDTRateForCurrentRound()", +"ffe4914a": "hdivide(uint256,uint256)", +"ffe496f2": "setMarginSpend(uint256)", +"ffe4fe4c": "roundFor(uint256)", +"ffe55303": "unfreezeCreditScore(uint256,string)", +"ffe5725f": "create(address,address,uint256)", +"ffe575b1": "Daxther()", +"ffe57c16": "byuoutActive()", +"ffe619df": "buyPixelToken(uint24,uint256,uint24)", +"ffe648d4": "releaseAllOnceLock(address)", +"ffe6bbd8": "myEarnings()", +"ffe8ee35": "SetDivTime(uint256)", +"ffe90ba6": "offsetIndex()", +"ffe94af0": "burnPass(bytes32,address)", +"ffe99ca7": "getCitiesStrings(uint256[])", +"ffea632b": "initialize(address,address,uint8,address)", +"ffeb7d75": "setUpgradeMaster(address)", +"ffec34e3": "TokenMintPoD(int256)", +"ffecf516": "addBot(address)", +"ffed6ed7": "buyAd(uint8,uint8)", +"ffeddd49": "addPolicy(bytes32,uint32,uint32,uint256,string)", +"ffee7c97": "getBookLength()", +"ffeea273": "withdrawWallet2()", +"ffeeac82": "info_Name()", +"ffeecfaa": "Log1(address,bytes32,uint256,string,string,uint256,bytes1)", +"ffef2b00": "SortCompetitionScores(uint32)", +"ffef8f88": "Share(uint256)", +"ffef9b3c": "_checkMaxRoundSupply(uint256)", +"fff04a87": "test_invalidBalanceNotZero()", +"fff07241": "playerExist(address)", +"fff10aba": "getEventsHistory()", +"fff28137": "reclaimToken()", +"fff311b1": "ownerSetjackpotContract(address)", +"fff35670": "icoLaunchTimestamp()", +"fff3a01b": "transfer(address,string,uint256)", +"fff3ad33": "getAddTokenDataTracking()", +"fff3c457": "readMessages(uint256)", +"fff43b4e": "_setBurnPool(uint256)", +"fff57ba3": "withdrawSettle(bytes32,bytes32,bytes32)", +"fff57fe1": "claimableOCDividend(address,address)", +"fff6a540": "LongBCoin(uint256,string,uint8,string)", +"fff6fb54": "TTOH()", +"fff78f9c": "doThrow()", +"fff7a97e": "addWallet(address,address)", +"fff83edf": "founderAmounts(uint256)", +"fff85d49": "addChunk1ToWhiteList()", +"fff8d42b": "phase2StartingAt()", +"fff93ec3": "setLandingPage(string)", +"fff95ce3": "getIsPoop()", +"fff9627d": "PRESALE_VAULT_START()", +"fff9d5b9": "confirmProofOfWork(uint256)", +"fffa932b": "withdrowTo(address)", +"fffa9d0c": "setGood(bytes32,uint256,uint256)", +"fffb5183": "initialize(uint256,address,uint256)", +"fffcde7c": "EOSINT()", +"fffce84f": "bountyFreeze(address,bool)", +"fffd52c6": "reading()", +"fffda870": "lastHorseSex()", +"fffdbe2c": "frozenTokensSupply()", +"fffe088d": "saleAddress()", +"fffeb1ca": "externalCheckSignBool(bytes32,bytes,address)", +"ffff6b04": "vestingSchedule(address)", +"ffffce47": "exchangeRateOracle()" +}`) + +func _4byteJsonBytes() ([]byte, error) { + return __4byteJson, nil +} + +func _4byteJson() (*asset, error) { + bytes, err := _4byteJsonBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "4byte.json", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)} + a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x97, 0xc1, 0x67, 0x6, 0x1e, 0x89, 0x76, 0xf7, 0x19, 0xd6, 0x8b, 0x43, 0xb4, 0x1c, 0xf6, 0xab, 0x7f, 0xc7, 0xc4, 0xca, 0x25, 0x21, 0x2, 0x13, 0x6d, 0x5b, 0xe2, 0x72, 0xb1, 0x7, 0xbc, 0x77}} + 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) { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; 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) +} + +// AssetString returns the asset contents as a string (instead of a []byte). +func AssetString(name string) (string, error) { + data, err := Asset(name) + return string(data), err +} + +// 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 +} + +// MustAssetString is like AssetString but panics when Asset would return an +// error. It simplifies safe initialization of global variables. +func MustAssetString(name string) string { + return string(MustAsset(name)) +} + +// 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) { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; 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) +} + +// AssetDigest returns the digest of the file with the given name. It returns an +// error if the asset could not be found or the digest could not be loaded. +func AssetDigest(name string) ([sha256.Size]byte, error) { + canonicalName := strings.Replace(name, "\\", "/", -1) + if f, ok := _bindata[canonicalName]; ok { + a, err := f() + if err != nil { + return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err) + } + return a.digest, nil + } + return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name) +} + +// Digests returns a map of all known files and their checksums. +func Digests() (map[string][sha256.Size]byte, error) { + mp := make(map[string][sha256.Size]byte, len(_bindata)) + for name := range _bindata { + a, err := _bindata[name]() + if err != nil { + return nil, err + } + mp[name] = a.digest + } + return mp, nil +} + +// 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){ + "4byte.json": _4byteJson, +} + +// 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, and +// AssetDir("") will return []string{"data"}. +func AssetDir(name string) ([]string, error) { + node := _bintree + if len(name) != 0 { + canonicalName := strings.Replace(name, "\\", "/", -1) + pathList := strings.Split(canonicalName, "/") + 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{ + "4byte.json": {_4byteJson, 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 + } + return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) +} + +// 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 { + canonicalName := strings.Replace(name, "\\", "/", -1) + return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...) +} diff --git a/signer/fourbyte/4byte.json b/signer/fourbyte/4byte.json new file mode 100644 index 000000000000..31d0e1719496 --- /dev/null +++ b/signer/fourbyte/4byte.json @@ -0,0 +1,146843 @@ +{ +"00000001": "account_info_rotate_tine(uint256)", +"00000002": "razor_balance(bool)", +"0000000c": "gumXZCZ()", +"00000033": "matchTokenOrderByAdmin_k44j(uint256[])", +"00000039": "XXX_unrecognized_adapter(string)", +"0000003a": "good_mirror(uint256,uint32)", +"00000063": "math_rotate(uint256,uint256,uint64,uint64)", +"0000006e": "display_allow(uint256,uint256,uint256,uint32)", +"00000080": "conduct_auto(uint256,uint256,uint256)", +"00000082": "artefact_keep(bytes1)", +"000000a0": "tree_stream(bytes,bytes)", +"000000a1": "pistol_valve(uint256,uint32)", +"000000b6": "matchByAdmin_TwH36(uint256[])", +"000000c4": "festival_happy(uint256,uint256)", +"000000c7": "lend_during(uint256,uint256,uint64,uint32)", +"000000da": "muscle_teach(uint256,uint64,uint8)", +"000000db": "viable_print(uint256,uint256,uint64)", +"000000de": "pledge_future(uint256,uint32,uint8)", +"000000ed": "access_coconut_alarm(uint256)", +"000000f5": "cherry_tomorrow(uint256,uint64,bool)", +"000000f8": "required_strconv(string,string)", +"00008962": "token(string,uint8,string)", +"0000aeb3": "migrateByAdmin_DQV(uint256[])", +"00012f8b": "LatiumX()", +"00014502": "totalInfected()", +"000150a0": "DEV_TEAM_STAKE()", +"0001fd01": "PamToken()", +"00020a28": "HaltTokenAllOperation()", +"000267a4": "getUint()", +"00026e13": "checkAtkBossQuest(address)", +"00027737": "aicontract()", +"0002aa37": "richtestkk(uint256,string,uint8,string)", +"0002c1dc": "Johnsonville()", +"00046c1f": "totalDragons()", +"000525fd": "robCoin()", +"0005a533": "CoalichainToken()", +"0005bfb7": "gemmyMusicLockTime()", +"000713fe": "Initiate(address,uint256,uint256,uint256,bool)", +"000751b8": "LogExtendSale(uint256)", +"00076943": "unlocker()", +"00076de7": "disableSellerCancel(uint16,address,address)", +"00085d25": "round3()", +"0008f8df": "changeIcoFinish(uint256)", +"00094161": "TERMS_AND_CONDITIONS()", +"00096469": "AuctionCreated(uint256,address,uint256,uint256,uint256,uint256)", +"0009803b": "makeProject(address,string,uint256,uint256)", +"00099cdf": "withdrawTokens3(uint256)", +"000a4a7a": "backAtIndex(uint256,uint256,uint256)", +"000ac1ff": "addparts(bytes32,uint256,uint256,uint256)", +"000adc67": "buy_the_tokens(string)", +"000b66d3": "setIcoStartTime(uint256)", +"000b9726": "MintingContract()", +"000be356": "expiredBlock()", +"000c12af": "TOTAL_TOKENs_SUPPLY()", +"000c65c3": "withdrawVNET(address,uint256)", +"000ca58e": "refundRequestTimelock()", +"000dae5c": "claimantConvicted(uint256)", +"000e02d0": "fiveHundredThousand()", +"000e28d3": "setLandsLimitPerBid(uint256)", +"000e2f3a": "totalLBSold_GENERAL_1()", +"000e60f8": "pendingBetsBalance()", +"000e7fa8": "presalePrice()", +"000f0ded": "doAirdrop(address,uint256)", +"000f71f8": "recieveNegReq(uint256,uint256,uint256,uint256,string)", +"00100a18": "NewPoll(string,string,uint256,uint256)", +"0010ed99": "getBraggerAtIndex(uint256)", +"00113e08": "getBalances()", +"00115cba": "UpdateSellAgentBounty(address)", +"001246eb": "availableFlg()", +"0012d90a": "BNB_HARD_CAP()", +"001339b0": "prizePoolTotal(bytes4)", +"00137d6e": "peculAdress()", +"0013da50": "delList(string,uint256,uint256)", +"0013eb4b": "isExist(address)", +"0014f956": "getResourcesInfo(address)", +"00152924": "setSelfContractAddress(address)", +"0015be71": "executiveOfficerAddress()", +"001667bb": "getPI_edit_34()", +"00173d65": "getShouldGenerateDna()", +"001773e6": "convertMetToEth(uint256,uint256)", +"0017cd8b": "PRIME()", +"0017e1cf": "getTeamNameForAddress(address)", +"0018b1d3": "pps()", +"0018b665": "killTokenContract()", +"0018fe0b": "changeInGameFee(uint256)", +"00190f64": "getStatusLogs()", +"00199b79": "_updateList(address[],address,address[])", +"0019a46b": "gen0CutieCreatedCount()", +"0019c97d": "redeemPop(uint256)", +"001a4f5e": "createNewRevision(bytes32,bytes32)", +"001aa026": "withdrawMarginPreSigned(bytes,address,uint256,uint256,uint256,uint256)", +"001ab1cd": "setAsBurner(address,bool)", +"001ab993": "VTestDistribution(address,uint256,uint256)", +"001b1441": "Ethernext()", +"001b1cf0": "DualMintableToken(address,address)", +"001b3fe6": "card_blue_first()", +"001ba7ea": "signWitness()", +"001baa89": "createdBy(uint256)", +"001bc69a": "getGratitudesOf(address)", +"001cf577": "wcOnCrowdsaleFailure()", +"001d7bf6": "getInvestmentArray()", +"001db74d": "FreeLove()", +"001dbe8a": "getSoftwareExecRecordLength()", +"001ed012": "previousBurners()", +"001ee6b2": "participateGame(uint32,uint32,uint32,uint32)", +"001f0479": "getResultMask(uint256,uint256)", +"001f4701": "Examples()", +"001f8d11": "removePackage(bytes32,string)", +"001f91ce": "curatorAddress()", +"001f9bc0": "set_arbits_presale_open(address,bool)", +"00201e33": "BONUS_6_DAYS()", +"00203116": "endGame(address,uint8)", +"00203385": "getTotalBorrowingItem()", +"00212667": "m_Creator()", +"0021b6cb": "getElementOfBoughtTicketList(uint256)", +"0021d364": "getNOVotesByEntity(uint256)", +"00226eb5": "getDepositNum()", +"0022771f": "numAdviserDeposits()", +"002338ef": "TLSC()", +"0023de29": "tokensReceived(address,address,address,uint256,bytes,bytes)", +"00245220": "HAJDToken(string,uint8,string)", +"0024eb4b": "getCompanyAllocation(uint256)", +"00277883": "TeamTokensHolder(address,address,address)", +"0028b91f": "Distributor(address,address)", +"0029514f": "PROCESSBY()", +"00297671": "cancelOneSell()", +"002a2133": "createCitizen(uint16,uint16,uint8,bytes32,bytes32,bytes32)", +"002a228c": "initSeed(uint256)", +"002a4b14": "Nine()", +"002a5cc9": "getTicketHolders(uint256)", +"002beece": "unfroze(uint256,address)", +"002c1a9e": "percent(uint256,uint256,uint256)", +"002c8456": "toOpenVote()", +"002ce636": "settrusteeVaultAddr(address)", +"002d7c9d": "concludeFirstAuction()", +"002dc7f1": "ChangePeriod()", +"002e0ae7": "transferTokenOut(address,uint256)", +"002e1316": "maxInvestment()", +"002e1d7e": "LCOpenTimeout(bytes32)", +"002f15ca": "isExistInvestor(address)", +"002f9569": "allocatedTokens()", +"002fd07c": "_approve(address,uint256,uint256)", +"003074ff": "getFrontend()", +"003078b0": "unlockTo(address,string)", +"00310e16": "sellWolk(uint256)", +"00319aad": "_transferadvanced(address,address,uint256)", +"0031a48e": "myICO()", +"00322bb6": "sendPlatformMaintenance()", +"003259ea": "voteResult()", +"003271d5": "checkStateProof(bytes32,bytes,uint256[],bytes,bytes)", +"00333375": "minimumMainSaleRaise()", +"003338a0": "DrawOp()", +"0034451c": "_buildInternalSalt(uint128,address,address,uint256,uint64)", +"00346b57": "setHodlerStake(address,uint256)", +"003495a4": "getHighestBidder()", +"0034b5fd": "withrawFundTeacher(uint256)", +"0034f529": "_requestExists(address,uint32)", +"003538c5": "TestRegistrar(address,bytes32)", +"00354975": "VRYCoin()", +"00359e08": "presaleFinishedAt()", +"0035a45c": "isAllowedToPurchase()", +"0035ceb1": "BrinkzToken()", +"0036059c": "TESTER(uint256,string,string)", +"00360b66": "MyMonsterIds(address,uint256)", +"0036242d": "Power2X()", +"00362509": "LogWin(address,uint256,uint256,uint256)", +"00362a95": "donate(address)", +"00364ceb": "bountyManagementWalletAddress()", +"0036624a": "AmountReceived(address,uint256)", +"003705bc": "getTotalUSDInTokens()", +"0037dd47": "addUniqueSaleTokens(address,uint256)", +"00383d0a": "maxSignup()", +"00387733": "setGameResult(uint256,uint8)", +"0039522c": "emergencyWithdrawal(uint256)", +"003958e2": "LogOperatorAdd(address)", +"00397647": "addToFreelancerTotalEarned(address,address,uint256)", +"0039ad6d": "ROUNDS_KEPT()", +"0039d9db": "getNextStageStartTime()", +"003a3d80": "GetSale()", +"003a5b06": "getRoundEndBlock(uint32)", +"003a661d": "renounceOwnedOwnership(address)", +"003ab1ff": "timereum()", +"003b0a3f": "getFreeDino()", +"003b9d88": "setLowerFeePercentage(uint8)", +"003ba1ed": "setRoot(address)", +"003bcb34": "Received(address,bytes,uint256)", +"003cdf26": "Lima()", +"003cee5a": "HLCToken(address,string,string,uint256,uint8)", +"003db783": "Purchase(uint256,uint256,uint256,uint256)", +"003de230": "participantClawbackEther(uint256)", +"003e9d5b": "FillOrder(uint256,uint256)", +"003ead5f": "setPVEBattleFee(uint256)", +"003f07fa": "isValidAddress(address)", +"003fd35a": "CONTINUE_MINTING()", +"00404930": "CryptoRiyal()", +"00405351": "getWarriorChestAvailable()", +"004056c7": "validateNameInternalET(string)", +"004079b6": "CheckExec(string)", +"0040ff6c": "changeFee()", +"0041edee": "preSaleTokensLimit()", +"004240e3": "startTransaction(address,address,uint256)", +"004264c3": "overflow()", +"0042a3be": "isPublish(bytes32)", +"00432cf3": "getCurrentMarginAmount(address,address,address,uint256,uint256,uint256)", +"0043cce7": "technologyShare()", +"00442a07": "getLoanConfig(uint256)", +"00452636": "GxManagedWallet(address)", +"0045626f": "returnETHByOwner()", +"0045a4d4": "isPointerExpired(uint8)", +"0047850a": "getOfferCountByToken(address)", +"00478f87": "TIC()", +"0048236b": "setOrganName(string)", +"0048d680": "testTransferVotes()", +"00498257": "maxWeiTier2()", +"0049f068": "onContribute(uint256,address,uint256)", +"004b1e75": "actionAuthorisedBy()", +"004bd9a5": "setRate5(uint256)", +"004c942e": "Request_Dividends()", +"004d39b1": "HavvenGold()", +"004d4ed9": "setRegion(uint256,uint256)", +"004db370": "DawnCoin()", +"004dcd1c": "changeBrick(uint256,string,string,string,bytes32[],uint256)", +"004ebaa8": "silo_timer()", +"004ef6c6": "book(uint256,uint256)", +"004f3e86": "forceCancel()", +"004f4042": "takeAllPossible(address[3][],uint256[3][],uint256[],uint8[],bytes32[],bytes32[],bytes4)", +"004f4803": "raise(uint256)", +"004fba00": "addAdminAddress(address)", +"00501553": "subHours(uint256,uint256)", +"005016a3": "checkReturnValue(bool)", +"0050945d": "referrerLevel2Ether()", +"0050a315": "getCreationTs(uint256)", +"0050b3df": "newAlex(address)", +"0052992e": "buyForInvestor(address,uint256,string)", +"00530933": "BuyAsset(uint256)", +"00541756": "jackPotB()", +"0054438d": "validateResale(address,uint256,uint256)", +"00549c2b": "mintNonFungibles(uint256,address[])", +"0055bc9c": "withdrawAtOnce(uint256)", +"0056c4c2": "getTokensForWei(uint256,uint256,uint256,uint32)", +"0056ce89": "getCryptoPicture(uint256)", +"005733e6": "EMISSION_FOR_SALESTAGELAST()", +"00573858": "setrateIco(uint256)", +"0057e18f": "setPlatformMaintenance(address)", +"0057e8d4": "restoreToColdWallet(uint256)", +"00599e65": "getTokenOrder(address,address)", +"005a7d9a": "forFund()", +"005ab803": "LogRegister(address,address)", +"005b42cb": "MainSalePrice()", +"005b4487": "totalPayments()", +"005b7ce8": "SIGMA_EXTRACTION_BASE()", +"005b9b48": "sellAnimal(uint32)", +"005bb714": "BlocksToken()", +"005c0541": "_totalActiveBets()", +"005c33e1": "receiveFunds()", +"005d204d": "dataIdentifiers()", +"005e885e": "getSigners(uint256,uint16)", +"005ef4ec": "setReservedTokensList(address,uint256,uint256,uint256)", +"005f41cc": "create(address,uint256,uint256,uint256,bool)", +"00601801": "setCCH_edit_4(string)", +"00601d6c": "board(uint256,uint8,uint8)", +"00603126": "computeNodeId(bytes32,bytes32)", +"00604854": "FreePPCoin()", +"0060c778": "removeCompany(bytes32)", +"00613e27": "register(address,uint8,uint16,address)", +"0061c78e": "PayoutIncreased(uint256,uint256)", +"0061ebed": "TransactionFeeChanged(uint256)", +"0062c8cb": "canCallWithNoOne()", +"00634064": "Lescoin(address,address)", +"00639319": "Milestone_BankLicenseSuccessful(string)", +"006409c4": "Signed(address,uint256,uint8,bytes16,bytes)", +"0064575f": "shiva()", +"0064b1f8": "gameNum()", +"0064d618": "add_referral(address,string,uint256)", +"0065318b": "dividendsOf(address)", +"0065d700": "getTileFromBattleboard(uint16,uint8)", +"0066753e": "removeCertifier(address)", +"00675149": "isGroupExist(uint256,uint256)", +"0067a9fb": "BrokerImp(address,address,uint256,address,uint256)", +"0067ba69": "FT_TOKEN_SALE_CAP()", +"00686741": "registerProxyFor(address)", +"00691967": "SUPER_HERO_MULTIPLIER()", +"006932bb": "whitelistAllAddresses()", +"0069a132": "AshenVoid()", +"006a003e": "planetCordinates(uint256)", +"006a6ef6": "create(address,address,address,address,address,address,address,uint256)", +"006ac4bf": "findNextMonth(uint256,bytes2)", +"006ae9d5": "HopeToken()", +"006b1fd1": "purchasedCount()", +"006bcb71": "witness(bytes32,address)", +"006c10e8": "trackPurchase(uint256,uint256)", +"006c2abc": "privateSaleEndDate()", +"006c81d3": "isAllocated()", +"006cfea8": "_delegateAssetOwnerAdded(bytes32,address)", +"006d96e0": "hasVaultAccess(address,address)", +"006ddae3": "changevotePrice(uint256)", +"006e3a1d": "exitOverPlayer()", +"006f91d2": "RiskPrice(uint128,uint128,uint128,uint128)", +"006fbd88": "changeSellGenesPrice(uint256,uint256)", +"00703d48": "crearCelda(uint256,uint256,uint256,uint256,uint256,uint8)", +"0070c3b3": "Proxy(address)", +"0070c537": "increaseBid(uint256)", +"007188d3": "FAOC()", +"0072615c": "claimedBoards(uint256)", +"00728f76": "vestingAmount()", +"0072d7b5": "addressAdded(address)", +"00732113": "setHolderInformation(address)", +"00739f2a": "changeStartDate(uint256)", +"0073c769": "disableTime()", +"0074477d": "listMultipleItems(uint256[],uint256,address,bytes32)", +"0075a317": "mintTo(address,string)", +"00761731": "createContract(bytes32,uint256,uint256,uint256)", +"00774360": "deploy(bytes)", +"00797f77": "has_donated(address)", +"0079efb0": "withdraw1()", +"007aa091": "san_whitelist(address)", +"007aaac9": "sisterCheckPrice(uint256)", +"007b2a03": "GoldTokenERC20()", +"007bd509": "generalTerms()", +"007c197d": "ISE()", +"007cb3fb": "updateOraclizeGasPrice(uint256)", +"007cc224": "RESERVED_TOKENS_FOR_PLATFORM_OPERATIONS()", +"007d8051": "issueAndFreeze(address,uint256,uint256)", +"007e3dd2": "isComptroller()", +"007e5d08": "updateAvailable()", +"007e9355": "GetAllChallengesByAUser(address)", +"008000d6": "configSale(uint256,uint256,uint256,uint256)", +"008066b6": "doftManaged()", +"0081d6e5": "updateGravatarImage(string)", +"008201e7": "TokenSold(uint256,uint256,uint256,address,address,string)", +"00821b81": "bonusCalculation(uint256)", +"00821de3": "parentAddress()", +"00822599": "deleteMasternode(uint256)", +"008250e5": "fortune_new()", +"00837b15": "balanceEth(address)", +"00849f88": "changeFundCollection(address)", +"0084dbf5": "ProofOfEtherDelta()", +"0084fe51": "Exercise(uint256,uint256)", +"00851303": "tokensForSiteReg()", +"008557d2": "Buy(uint32,bool,bool,address)", +"0085c647": "setPreICOEndDate(uint256)", +"00862c3c": "areTokensUnlocked()", +"00865f92": "parseJsonArrayAndGetFirstElementAsNumber(string)", +"0086969f": "dissalowFreezing(address)", +"0086bb3e": "teamUnlockedAfterCliff()", +"0086ce4d": "LogUpdatedLimitPerDay(uint8,uint256)", +"00873367": "comparisonchr(string)", +"00873c97": "CLPContractToken()", +"00882097": "EtherDeltaDeposit(uint256)", +"00886980": "LogClaimReward(address,uint256)", +"0088fca8": "start_go_quiz(string,string)", +"0088fed7": "addIndex(address,address)", +"008a3ca1": "reverseSplit(uint8,bytes6,uint8,uint32)", +"008a5c23": "getCurEarlyIncomeByAddressRound(address,uint256)", +"008a706b": "Primal()", +"008a745d": "claimDividendShare(uint256)", +"008ad306": "changeLockCostPerHour(uint256)", +"008bdd13": "isWithinSaleTimeLimit()", +"008bed3e": "getAgreementCount()", +"008c1b28": "POSTSALE_START()", +"008c3215": "addReplies(address,address[],string,string)", +"008c8920": "currentType()", +"008ca816": "isSalePaused()", +"008cbc8c": "oraclize_query(uint256,string,bytes[4])", +"008df454": "ratio(uint256)", +"008e0f1b": "getTeam(uint256)", +"008e6865": "buyTicket(uint256,uint256,address)", +"008e8135": "setProviderRateHistory(uint256,uint256,uint8,bool)", +"008f7cc2": "requestLoan(bytes8,uint128,address,address,address,uint256,uint64,bytes)", +"008f8b35": "currentRoundInfo()", +"008fcc94": "stageEndDate(uint8)", +"00903c69": "Kether()", +"0090e9c2": "transferBonuses(address)", +"00918c7b": "icoPeriodTime()", +"0091d862": "Minaxis()", +"00922db6": "secondWeekBonusInWeek()", +"00923f9e": "tokenExists(uint256)", +"0093703c": "bankConfirm(address,uint256)", +"0094151b": "setPurchasable(uint256)", +"0095716b": "crownBalanceOf(address)", +"00961320": "stringToUint()", +"0097130e": "_realBalanceOnEther()", +"00971a30": "court()", +"00975ba6": "_sendP3D(address,uint256)", +"0097b607": "validRareId(uint256)", +"00983401": "setAuthor(string,string,address,uint256)", +"00987265": "migrateThroughAllForks()", +"0098728f": "buyXaddrForContract(address,uint256)", +"009888ce": "calcNextPrize()", +"00988a16": "EthMinContributionUpdated(uint256,uint256)", +"0098fe2b": "refundWhite(uint256,uint256,uint256,uint256)", +"00991d8e": "setMakeFee(uint256)", +"0099d386": "enableTrade()", +"009a1faf": "getSumOfGamblingPartiesBonusPool(uint256)", +"009af857": "setnextRoundId(uint256)", +"009b38fa": "canBeFinalizedNow(uint256)", +"009b9369": "getVoteNumber(uint256)", +"009ca5e8": "maxTokenWinValue()", +"009e2297": "SetFreeDCT(uint256)", +"009f9262": "setEthPrice(uint256)", +"00a0190e": "BIDDING_DURATION()", +"00a051ca": "FiCoinFundDeposit()", +"00a09a7a": "devTokensToken()", +"00a0d28f": "batchExecute(uint256[])", +"00a13901": "burnRemains()", +"00a16cab": "checkCutoffsBatch(address[],bytes20[],uint256[])", +"00a18b30": "setTeamAddress(address,address,address,address,address)", +"00a219f4": "payForDemocracy(bytes32)", +"00a22ee4": "EXOToken(address,address,address,address,address)", +"00a3216c": "getNextDepositBlockIndex()", +"00a32af6": "AIRDROP_WALLET()", +"00a35aa2": "deleteBoolValue(bytes32)", +"00a470d0": "doInvite(uint256,uint256,uint256)", +"00a4b146": "SDCToken()", +"00a53598": "emergencyToggle()", +"00a58a2a": "Coffee()", +"00a5e715": "TripCoinTeamSupply()", +"00a626f6": "getACLRole7123909213907581092()", +"00a676f9": "getExists(bytes32)", +"00a6dec6": "setPayerPercent(uint256,uint256)", +"00a70e03": "priceOfTicket()", +"00a7d6b3": "checkTransferFromToICAP(address,bytes32,uint256)", +"00a7fdfc": "bids_count()", +"00a81ef6": "emitRoleRemoved(address,uint8)", +"00a8efc7": "subBalance(uint256)", +"00a8f276": "last_transfer_state()", +"00a94b6e": "oraclize_query(uint256,string,string[5],uint256)", +"00a9f0d4": "getDayRestDepositLimit(uint256)", +"00aa21e6": "transferFromVault(bytes32,address,address,uint256)", +"00aa25b2": "_isValidAddress(address)", +"00aac98b": "Griefing(uint256)", +"00ac4663": "getWarrantyQuote(string,address,uint256,uint256,uint256)", +"00ac77a0": "ownerSetCanBurn(bool)", +"00ad3a23": "RELEASE_PERIODS()", +"00ad800c": "name(uint256)", +"00ad8035": "SwingerTokenSPICO()", +"00ad861f": "README()", +"00ad8b69": "releaseVestingAllocation()", +"00adc382": "addressHash(address)", +"00aea59b": "reviewAudit(uint256)", +"00aec05d": "BEECASHBACKHOME()", +"00aeef8a": "deposit(uint256,uint256,uint256)", +"00af4274": "getTokensForEther(uint256,uint8)", +"00af9811": "checkRedemptionFulfilled(bytes32)", +"00afd295": "getAllCellInfoFrom_To(uint256,uint256)", +"00afdcef": "ELink()", +"00b08526": "GXCH()", +"00b172d7": "buyTokensForProposal(uint256,address)", +"00b23740": "VersusArenaToken()", +"00b2516d": "vetoMotion(uint256)", +"00b34747": "contractInitialized()", +"00b37044": "totalDonated()", +"00b3c619": "VoteSvp001(address,uint256,uint256)", +"00b3c91b": "purgePack(uint256,uint256)", +"00b44750": "acceptMembership(address,uint8,uint256,address,uint256)", +"00b5152b": "VibeXChainToken()", +"00b526e4": "_sendTokensManually(address,uint256,uint256)", +"00b5277a": "checkSell(uint256)", +"00b55554": "emergencyDropEth()", +"00b56aa7": "emitSynthRemoved(bytes4,address)", +"00b5988e": "lockTournament(uint256,bool)", +"00b5b223": "computeResponse(uint256,uint16)", +"00b6849f": "airDrop(address[])", +"00b6b707": "accept(uint256,address,uint256)", +"00b76307": "ChangePrivilege(address,bool,bool)", +"00b767fa": "EventAddAdmin(address,address)", +"00b79dd9": "taxlvlEconomy(string,string,string,string,string)", +"00b7f20a": "isDebtor()", +"00b8a73c": "IntegrativeWalletToken()", +"00b9189d": "setPreIcoContract(address)", +"00b9840a": "DBDHToken()", +"00b99f8c": "view28()", +"00b9eb8b": "Coinchangex(address,address,uint256)", +"00ba092c": "is_current()", +"00ba3e50": "setProductAttributes(string,uint256,uint256,string)", +"00badc85": "getcvotesid(string)", +"00baea15": "pastOneDay()", +"00bbec1c": "payServiceProvider()", +"00bc83a9": "xToken(address,string,string,uint8,uint256)", +"00bca785": "state_of(address)", +"00bcb883": "ProposalAdded(uint256,address,string,uint256)", +"00bd35b8": "EventAddToBattle(address,uint64)", +"00bd6f4c": "transferToAddress(address,uint256,bytes,bool)", +"00bde030": "getDurationS()", +"00bdfbcd": "installed()", +"00c023da": "revokeAttribute(address,bytes32,bytes)", +"00c17ee4": "setConfig(uint256,uint256,string,string,uint256,uint256)", +"00c1e956": "addressFundBounty()", +"00c2943c": "declareWinner(uint256)", +"00c2b78e": "voteFor(uint256,uint256)", +"00c33731": "prepair(address)", +"00c42173": "winnerDeterminedDate()", +"00c43503": "totalReturns()", +"00c4cefa": "toKeyValue(int256,string)", +"00c56675": "setNegativeGrowth(int256)", +"00c5f509": "preICOSupply()", +"00c61e93": "hRCoin()", +"00c721ab": "setHand(uint256)", +"00c822fb": "oraclize_query(string,bytes[2],uint256)", +"00c8bb45": "addMeleeParts(uint8[])", +"00c90ac8": "AutoCoinICO(uint256,uint256,uint256,address)", +"00c988e8": "crowdsaleConcluded()", +"00c99206": "setIdentifier(bytes32)", +"00c9c8e7": "_emitFeeSet(uint256,address)", +"00cab8b1": "lockAddressValue(address,uint256)", +"00cae5df": "solve(uint256,bytes32)", +"00cb1ae4": "methodThatThrows(bool)", +"00cb41e3": "getWithdrawableDates()", +"00cb527f": "miningFive()", +"00cc15b0": "lengthEncode(uint256)", +"00cc48a6": "updateNameIP(string,string)", +"00ccbc68": "firstRedemptionRequest()", +"00ccfdab": "removeForgivedChar(uint256,string)", +"00cdbc1f": "changeHash(bytes32)", +"00cde2bb": "releaseAccount(address,address)", +"00ce2057": "triggerPayment()", +"00ce4462": "register_with_node()", +"00ce8e3e": "getUsers()", +"00ce9f8a": "getPeggedTokenValue(address,address,address)", +"00d11245": "Mallory(address)", +"00d17799": "defaultCreatedCount()", +"00d2c31d": "getHashSignatures(uint256)", +"00d30eb9": "firstWeekPreICOBonusRate()", +"00d32a75": "TransferDFN(address,address,uint256)", +"00d357d1": "CustomcoinCrowdsale(address)", +"00d3f51a": "VirtualRealityChain()", +"00d4b768": "currentMideTokenTime()", +"00d4b959": "ico1total()", +"00d52342": "loseGame()", +"00d56d71": "StageTwoEnable()", +"00d5da02": "setTokenDescription(string)", +"00d7b3a9": "Exoso()", +"00d7e9cf": "landPricePrevious()", +"00d7f5d8": "Human1StandardToken(uint256,string,uint8,string)", +"00d80e07": "getGuardianSale(uint256)", +"00d84fd8": "remove(uint32)", +"00d9694c": "setBonusRound3(uint256)", +"00d9f24e": "UpdateNumPlayers(uint256)", +"00db90d1": "setCanWithdrawBeforeEnd(bool)", +"00dba80c": "mineableTokenStorageContract()", +"00dba864": "TOKENOPSPLATFORM_JOINTTOKENS()", +"00dbeb31": "getPromoCodeForEther(bytes16)", +"00de1eb4": "cofoundersSupplyRemaining()", +"00de8393": "SetLimit(uint256,uint256)", +"00dee43f": "initMinting()", +"00df415e": "preSaleZxcCap()", +"00dfafa4": "addMarket(address,uint256,uint256,uint256,uint256)", +"00dfd21a": "getUserDocId(address,uint32)", +"00dff399": "Fibonzi()", +"00dff60a": "partnerPreICOBonus(address)", +"00e063bc": "AddressQuery(address)", +"00e0c53f": "hold()", +"00e11919": "setClamTax(uint8)", +"00e1986d": "grantVestedTokens(address,uint256,uint64,uint64,uint64)", +"00e29488": "selfRegisterDINWithResolver(address)", +"00e31614": "modifyGuess(uint32,uint64,uint64)", +"00e37634": "batchRefundzFixed(address[],uint256)", +"00e38410": "getVotingMetadata(uint256)", +"00e43ee9": "setMigrationStatus(uint256,address)", +"00e46700": "setMinimumPassPercentage(uint8)", +"00e4768b": "setPrice(address,uint256)", +"00e4778a": "addAccessoryIdMapping(address,uint64)", +"00e4fc14": "withdrawNetfRevenue(uint256)", +"00e520d0": "_emitSkillEvaluated(address,address,uint8,uint256,uint256,uint256)", +"00e5fc5f": "rawVotes(address)", +"00e610fc": "passwordMint(address,uint256,bytes32)", +"00e62620": "zoDailyLimit()", +"00e64f6d": "regularDonations()", +"00e6abbe": "EggFactory(address)", +"00e6b9f8": "MetalToken()", +"00e756cc": "roleAddressAliaser()", +"00e7d289": "registerListening(address)", +"00e8516a": "buySamples(uint256,address)", +"00e85279": "ownerLock()", +"00e893ce": "crowdsaleTokenPriceDenominator()", +"00e97827": "percentRake()", +"00e9c006": "deleteTransaction(uint256)", +"00ea11ec": "calcCakAmount(uint256)", +"00ea3146": "postGood(bytes32,uint256)", +"00ea81c0": "mint(address,uint256,string,string,bytes32[],bytes32[])", +"00ea8737": "myTickets()", +"00ead724": "Ticket(uint256,address,bytes3)", +"00eaedc8": "retrieveVanityForWallet(address)", +"00eb52f2": "setIsActivated(bool)", +"00ebc96e": "setCrowdsaleEndTime(uint256)", +"00ed015b": "setETH(address,uint256)", +"00ed2592": "sendEvents(address,uint256,uint256)", +"00efaa75": "tokenFinishMinting(address,address)", +"00f052f6": "getBidByBidder(address,uint256,address)", +"00f12159": "SpectrumNetworkNetwork()", +"00f17754": "accountAt(int256)", +"00f1c7ec": "setAllocationFee(bytes32,uint256)", +"00f29d55": "isOrdered(address,bytes32)", +"00f2c41b": "calculateTotalPayoutAmountAndCommission()", +"00f31e76": "isPresent(bytes32)", +"00f380f4": "communityFund()", +"00f3e717": "mrate()", +"00f40839": "LogTowncrierCallback(uint64,uint64,bytes32)", +"00f43f6d": "Simple_Claimable_Temporized_Stake()", +"00f45438": "createTokenToMarket2019()", +"00f49203": "Hard_Cap()", +"00f545c6": "addressBelongsToAccount(address,address)", +"00f54f0a": "Wallet2()", +"00f5544f": "openGame(uint256)", +"00f55d9d": "destroy(address)", +"00f5822c": "changePinakion(address)", +"00f62717": "setMockedBlockTime(uint32)", +"00f64e66": "StakePoolICO()", +"00f666d4": "QueueManager()", +"00f6ca59": "runCredits()", +"00f714ce": "withdraw(uint256,address)", +"00f733e9": "pieceForSale()", +"00f784a4": "OrderAdded(address,address,uint256,uint256,uint256)", +"00f7c5be": "unregisterAddress(address)", +"00f821a7": "addMintContract(address)", +"00f9ac78": "setVoteFactory(address)", +"00fa081a": "multiplicator()", +"00fa7be5": "EnterToken()", +"00fac74a": "salesdeadline()", +"00faf4dd": "getTokenDivisor()", +"00fca46f": "initialAuctionEndTime()", +"00fdc73f": "currentMinPurchase()", +"00fdd58e": "balanceOf(address,uint256)", +"00fe03e3": "icoSoftCapInWei()", +"00fe4789": "batchFillOrKillOrders(uint256[],bytes[])", +"00fe9590": "getMaxInt64()", +"00fec4ba": "afterForkBlockNumber()", +"00fece08": "giveDown(address,address)", +"00ff2fb1": "log_2(uint256)", +"00ff6262": "DefensorWallet(uint256,string,string,uint8)", +"010066ad": "joinWhiteList(address)", +"01008275": "addPersonalCap(address,uint256)", +"0102305b": "logGameData(bytes32[],bytes32[],int256[],uint8,bytes32,bytes32)", +"01024700": "OnePhaseAuction()", +"0102fcfc": "distributeOwnership()", +"010342f4": "averageSalePrice()", +"0103c92b": "userBalance(address)", +"01044632": "setDevelopersTokens(uint256)", +"0104855f": "mctTotalSupply()", +"01056361": "setupFunding(uint256,uint256,address)", +"0106172a": "invalidEarlyPurchaseIndexes()", +"01061ae1": "removeArtworksByString(string,uint32)", +"010648ca": "setDocument(bytes32,string,bytes32)", +"01067543": "getParentCount(address)", +"01068767": "ABL(address,address)", +"0106bc8f": "PVE()", +"010731c0": "sendCryptedHand(bytes32)", +"0107a4eb": "XRRfrozen()", +"0107a8df": "withdraw_bonus()", +"01080c6f": "activateTokensForArbitration(uint256)", +"0109057e": "WIZISHOPPINGCOIN()", +"01090c4e": "_removeProxyManager(address)", +"01090c9e": "PowerOfPutin()", +"01095962": "oraclize_setCustomGasPrice(uint256)", +"0109f22e": "CrowdSale()", +"010a38f5": "getTokenId()", +"010a7d65": "tryTransfer(address,uint256)", +"010abbd0": "getCardOwner(uint256)", +"010ae545": "creditTokens()", +"010afc20": "claimWrappedContractAdmin()", +"010b66de": "mainSale_Cap()", +"010b8701": "hasSubstring(string,string)", +"010ba4e2": "balanc()", +"010bd255": "DPNToken(address,address)", +"010cbd30": "_triggerPVPSignUp(uint32,uint256)", +"010cc97c": "transferMarketIncentivesFund(address,uint256)", +"010d214e": "WithdrawProfit(address,uint256)", +"010d2446": "getProblem(uint256)", +"010d3bf6": "buyUsingRefBonus(address,address)", +"010dbfec": "sell(uint256,bool)", +"010e3964": "mintTokenForPreCrowdsale(address,uint256)", +"010e3c1c": "setInflationChange(uint256)", +"010e8209": "admin(address,uint8)", +"010f7735": "burnToken(uint256,string)", +"0110ea76": "TanterX(uint256,string,uint8,string)", +"01114d74": "getCCH_edit_33()", +"0111ae8a": "maximumValueAfterGuaranteedPeriod()", +"01122ddb": "BonusEnrolled(address,uint256,uint256)", +"011285da": "multiplication()", +"0112e2c4": "CotteToken()", +"01132b70": "setXTVNetworkEndorser(address,bool)", +"0113b261": "getNumberOfShareHolders(uint256)", +"01146844": "loadFund()", +"0114af17": "investment_address()", +"0115a2f2": "_packAddressAndFunctionId(address,address,bytes4)", +"01169399": "createEthTknDelegation(address,address,address)", +"0116bc53": "CostChip(uint32)", +"0116bfc0": "BuyUpgrade(uint256)", +"01172005": "affiliateContract()", +"011721ad": "getValidation(address,uint256)", +"01173a74": "mintToken(address)", +"0117b324": "addTestimonial()", +"0118251c": "getHighWinPercent(uint256)", +"011847a2": "inviteReward()", +"011857d0": "bntConverter()", +"011879db": "createAuction(uint256,uint128,uint128,uint128)", +"0118895c": "reservations(address,uint256)", +"0118e662": "SiekechuCoin()", +"0118e686": "isCrowdsaleActive()", +"0118fa49": "create(uint256,string)", +"0119ada7": "eliminate(address)", +"011a44bf": "isAllFrozen()", +"011a8eb7": "DrawPrepareEvent(uint256)", +"011aab02": "Oculta(uint256,string,string)", +"011afdd7": "hello2()", +"011b1a7b": "setCrowdsalePrice(uint256,string)", +"011b29e3": "changeCourse(uint256)", +"011bc2e1": "calculateWinners()", +"011c3d06": "getCurrentStats(uint256)", +"011ce353": "OwnerRecall(address,uint256)", +"011d07c0": "getMyIdeas()", +"011d0b58": "buyListing(bytes5)", +"011d79ca": "CrowdsaleEnabled()", +"011db570": "calculateObtained(uint256)", +"011de7aa": "intervalAtTime(uint256)", +"011e0162": "Flercoin()", +"011e6492": "checkSuccess()", +"011eb18c": "removeAddressFromOperators(address)", +"01201c0b": "getTheTokens()", +"01209d09": "updateVaults(address,address)", +"0121683f": "createAuction(uint256,uint256)", +"01216f05": "calcEthReceived(uint256)", +"0121b93f": "vote(uint256)", +"0121be14": "_createCard(address,uint16)", +"01233474": "saleInProgressB()", +"012397ff": "firstroundprice()", +"01239adf": "maxPos()", +"0123aff4": "BurnCoinToken()", +"0124188d": "CAIRToken()", +"01250e4d": "CraigGrantEatDick()", +"01253fbf": "threshold1()", +"0125ae62": "setMeterPoint(int256,address,int256)", +"0125d7c8": "IPAYTOKEN()", +"0126b8b6": "batchAllocateTokensBeforeOffering(address[],uint256[])", +"01272c2c": "canExecute(uint32)", +"0127eb0d": "angelAdminAddress()", +"01281641": "OfferCanceled(uint256,bytes,address)", +"01281867": "keccak256calc(address)", +"01284ad4": "removeAddressFromPrivateWhiteList(address)", +"012874a3": "EthsMePresale(address,address)", +"01289e3a": "AvenceToken()", +"01293b5c": "defaultURIEnd()", +"012a08f8": "_vote(uint256,bool,address)", +"012aa25e": "releaseTokens(string,address,uint256)", +"012aa809": "InvalidCoinUsage(string)", +"012b1f73": "announceEndOfGame()", +"012bac23": "addCoinAllowance(address,address,uint256)", +"012beac9": "vendorRegistry()", +"012cd104": "LoveCrowdsale()", +"012d61e1": "buyRedirect()", +"012defec": "harvests(bytes32)", +"012ea37c": "arrangeFreePoints(uint256,uint256,uint256,uint256)", +"012f52ee": "escrows(uint256)", +"012fd089": "EscrowAccountCrowdsale()", +"012fec73": "KakushinToken()", +"0130371a": "MAX_SUPPLY_NBTOKEN()", +"01303778": "refreshMonarchyGamesReward()", +"013054c2": "redeemToken(uint256)", +"01307338": "dispatchRewardToken()", +"013130c0": "maximalInvestmentTimeTreshold()", +"01326c34": "clearAddresses()", +"0132cc82": "tokenFounderLockTime()", +"0133311b": "deleteLockTime(address)", +"01339c21": "launch()", +"0133db3a": "nameOf(uint256,address)", +"0133e1fa": "RunchuToken(uint256,string,uint8,string)", +"01340592": "MAX_CONTRIBUTION_USD()", +"01345514": "BJLToken()", +"013459ca": "getTokensForGraphenePower()", +"013512e3": "CABtoken()", +"0136356d": "unregisterAddresses(address[])", +"01365406": "deathData_f19()", +"01367751": "PryzeSale(address)", +"01372911": "throwsWhenActivatingBeforeDeployingANT()", +"0138aac1": "getUserBalanceOnToken(address,address)", +"0138e31b": "_jAdd(uint256,uint256,uint256,uint256)", +"013953a6": "amountForRefundIfSoftCapNotReached()", +"01395d33": "tokenPriceInWeiForDay(uint256)", +"0139caad": "payout(address,uint256,uint256,bool,uint256)", +"013a0e9b": "pairwiseOr(uint64)", +"013a83f1": "beat(uint256,bool,uint8)", +"013a9c50": "updateWallet(uint256,uint256)", +"013b490c": "updateDaoAddress(address)", +"013cf08b": "proposals(uint256)", +"013d48bd": "getGuessStatus(uint256)", +"013d64bd": "setCanCall(address,address,string,bool)", +"013dbf17": "crowdsaleProgress()", +"013e5415": "getGoldDataInitialized()", +"013e7c35": "getUrlCountOf(address,address)", +"013ed428": "author1()", +"013eebd7": "getmaxcardcount()", +"013efd8b": "tokenToEthSwapOutput(uint256,uint256,uint256)", +"013f83c9": "createTeam(address,uint32[])", +"013f84fa": "getAllNumberOfBets()", +"013fc2a3": "SmillesCoin()", +"0140e359": "stand(uint256,uint8[],bytes32,uint8,uint8,bytes32,bytes32)", +"0140ea82": "setNormalRoomMin(uint256)", +"0141e90a": "ICOaddress(address)", +"01429244": "getVendorApplicationsCount(string)", +"0142b8d1": "makeMerkle(bytes,uint256,uint256)", +"0142c8de": "currentPeriodRate()", +"0142c9ae": "isSoleout()", +"0142d43e": "notHungry(uint256)", +"0142d7b4": "authorizedBurnTokens(address,uint256)", +"0142f904": "CalculatePriceofRigs(uint256,uint256,uint256)", +"0143279c": "whitelistTicket(address)", +"014345c8": "SENDER_BALANCE()", +"01447eba": "disableCrowdsale()", +"0145e333": "init(address,address,address,uint256,uint256)", +"014647f4": "approve(address,bytes)", +"0146705b": "approvedRatio(string)", +"0146d0ca": "sendVote(string)", +"01491f09": "baseRateInCents()", +"01492a0b": "matchingEnabled()", +"0149ae4b": "finalizeExit(uint256,bytes32)", +"0149eea0": "view_get_Treasure()", +"014a7453": "getPI_edit_22()", +"014a897d": "Token_2()", +"014b0732": "validateTrade(address,address,address)", +"014bed81": "setAmountToKoikeToken(uint256)", +"014c3dbc": "current_external_block()", +"014c8ac0": "CBToken()", +"014d0f68": "hardCapHighUsd()", +"014d36f4": "Afroin()", +"014e5fde": "ARKController_1_00()", +"014e6996": "ZTF()", +"014e95ba": "rateBase()", +"014f7f22": "joinCount()", +"014fc169": "setLockToAccount(address,address)", +"015008b1": "reLoadXaddr(address,uint256)", +"01500a97": "getTokenForCommunity(address,uint256)", +"01501347": "disableRefund()", +"01502460": "freezeTransfers()", +"01509730": "userdynamicprofis2()", +"0150b530": "addressesLength()", +"015129a1": "sellPriceEth()", +"01512db1": "removeIntervalCoefficient(bytes2,uint256)", +"01515a7b": "weiToReceive()", +"01518d76": "sendQuery(uint256)", +"0151cf1d": "setVotingWinner(address)", +"01538868": "_setTokenURI(uint256,string)", +"015493b4": "setFoundationWallet(address)", +"0154d3ea": "notexistdept(string)", +"01567739": "beneficiaries(address)", +"015689c6": "testControlCreateWithParentsParentSameItemId()", +"0156b323": "destroyTokensFrom(uint256,address)", +"015773b6": "set_private_sale_total(uint256)", +"015854f8": "quoteBid()", +"0159a91d": "concatenate(string,string,string,string)", +"015a18ed": "start(bytes32)", +"015a4ead": "unfollow(address)", +"015aeda7": "setAttribute(address,bytes32,uint256,bytes32)", +"015afa55": "winnerIsB()", +"015bf264": "depositTokens(uint256,address,uint256)", +"015c1c7a": "toTokenAmount(address,uint256)", +"015cb3ff": "pauseTime()", +"015cb8cf": "baxianchain()", +"015ccd07": "DockToken(address)", +"015d200f": "lockBalanceAll(address)", +"015def53": "priceFactorC()", +"015e4f3a": "getConfigUint(int256,bytes)", +"015e52c6": "getPool(uint32,int256)", +"015f32f9": "cappedSaleStartTime()", +"015fa6c1": "setWeiCap(uint256)", +"015ff39f": "GNOSIS()", +"0160751c": "setDepositary_function(uint256)", +"01608f5f": "amountOf(address)", +"0160e2f6": "cancelOptionOrder(address[3],uint256[3],bool)", +"01612def": "additionalInternal(bytes32,uint256[])", +"0161d5f0": "createCampaign(address,uint256,bytes32,bytes32,bytes32,bytes32)", +"016211b5": "bonusAllocation()", +"01621527": "destEthDevs()", +"01623ee4": "basicRate()", +"0162827c": "bonus02End()", +"0162f799": "getPrivatePresaleFundersCount()", +"01637ff4": "getAccessory(uint256)", +"0163d8ff": "MostValuableCoin()", +"01644ea7": "getSimple()", +"016474ce": "withdrawalRound(address,uint256)", +"01655e31": "CollectibleBidEntered(uint256,uint256,uint256,address)", +"01659863": "_0xBitcoincashToken()", +"01665393": "BLOCKRADIO()", +"016774e9": "donatetokens(uint256)", +"0167eb85": "stone()", +"01681a62": "sweep(address)", +"016899de": "depot()", +"0168e2e3": "JonsCoin()", +"0168f063": "tokenAmountOf()", +"016a8cf6": "topUp(address,uint32,uint192)", +"016aba15": "setDividendTransactionNumber(uint256)", +"016b0882": "Cst()", +"016c6601": "_receiveDeposit()", +"016d5807": "_mint(address,uint256,uint256,uint256)", +"016d60b3": "buyStoreCore(uint256,uint256,uint256)", +"016d7c83": "pauseLottery(uint8)", +"016deccc": "createContractSpecial(string)", +"016e03b1": "getItemIdToTokenId(uint256)", +"016e128b": "ProfitWithdrawn(address,uint256)", +"016ea771": "isNotCommittee(address)", +"016eb8a8": "percentage(uint256,uint256)", +"016f34ad": "callgSoftCap()", +"016fa018": "getPartnerBalance(address)", +"01725a0b": "demo()", +"01738ecd": "setCurrent(uint256)", +"0173e3f4": "addCoins(uint256)", +"0174e12b": "myx()", +"01750152": "isNode(address)", +"01769b37": "sendTokensToSeven(address,address,address,address,address,address,address,uint256)", +"0176b596": "DreamBit()", +"01770e0c": "NKTToken()", +"01775f23": "_closeBooks()", +"01778b6d": "Ynfiniti()", +"0178090c": "toSHA256(string)", +"01788d1d": "Decabes()", +"01788d56": "balanceOfTranche(bytes32,address)", +"0178b8bf": "resolver(bytes32)", +"0178fe3f": "getData(uint256)", +"017945ba": "changeDollarPrice(uint256)", +"017972af": "getNumbersFromHash(bytes32)", +"017b0d00": "highestBidForEdition(uint256)", +"017b39a7": "getMiniPoolEdit_1()", +"017bef67": "addExplorationByShip(uint256,uint256,uint256)", +"017e322c": "getCurrentGameSteps()", +"017e6f5f": "reOrganizeAuthorities()", +"017f27fc": "saleIsClosed()", +"017fa10b": "returnUint128(uint128)", +"017fa51d": "shouldRevertPure(bool)", +"017fe809": "getPower(uint256)", +"01828e61": "Quecoin()", +"01836037": "foundationBoard()", +"01838f01": "addAnimal(uint8,address)", +"0183f310": "potMembers(uint256)", +"0184e952": "award(uint256)", +"0184fc35": "crowdSaleAddress()", +"0185f409": "getInvestorAddress(uint256)", +"01863f79": "thisContactsTokens()", +"0186aa16": "OxBioToken()", +"0186c36e": "getCurrentExchageETH()", +"0187699c": "VerixChain()", +"0187a677": "bbodServiceRegistry()", +"0187e973": "PricingStrategy(uint256,uint256,uint256,uint256)", +"0188c09f": "altList(uint256)", +"0188fdef": "setMaximumBuy(uint256)", +"01890840": "MilestonePricing(uint256[])", +"0189bd41": "getProofOfPerfBlockStateState(bytes32)", +"018a25e8": "getBuyPrice()", +"018aba3f": "createPledge(address,uint256,uint256)", +"018b06ff": "isWinner(address,bool)", +"018b64b6": "AuctionCancelled(address,uint256)", +"018d3490": "assignOracles(uint256,address[])", +"018d6f7a": "showethconf(address)", +"018de5c5": "distributeCBC(address[],uint256,uint256)", +"018dfaa0": "calcCount(uint256)", +"018e13d0": "numOfCurrentEpoch()", +"018ed439": "_getTokenForType(address,uint256)", +"018f5472": "isAUser(address)", +"018fa360": "getDeposits(address,address)", +"018fbf9f": "hashAt(uint16)", +"01909317": "_storeSettingDataState(uint256,address,uint8,string,address,address,string)", +"0190b805": "editEarlyParicipantWhitelist(address,bool)", +"0190e84f": "Bitscorone()", +"0191903e": "setBlogregistry(address)", +"0191d35c": "summFounders2()", +"0191dc92": "numOfAdmins()", +"01930b6e": "darknodeDeregisteredAt(address)", +"01933c43": "TOWN_START_PRICE()", +"0194abaf": "prolong()", +"0194ac16": "BlockchainFUN(uint256,string,string)", +"0194db8e": "sum(uint256[])", +"01968a56": "mintAllocation(address,uint256)", +"01970353": "setStepOneTime(uint256,uint256)", +"01970c6b": "team_funds()", +"0197d972": "VESTING_PERIOD()", +"01984892": "name(address)", +"019859bb": "changeMembershipContractAddr(address)", +"0198632a": "getPurchasedProducts()", +"0198aa74": "firstsaleOpen()", +"01991313": "scheduleCall(address,bytes4,uint256)", +"01996951": "ethPerTransactionLimit()", +"01998ad4": "GlobalAdminChanged(address)", +"0199c7b2": "numberOfHolders()", +"019b1576": "backupAddress()", +"019b32ad": "transferToSalesPartner(address)", +"019c3f52": "newCollectible(uint256,string,uint256,uint256,uint256,int256,string,uint256,string)", +"019c5675": "BatchComplete(uint256)", +"019c920c": "setcompany(uint256,string,string)", +"019d2729": "approve(bytes)", +"019e56fd": "findCurrentFor(address)", +"019f232a": "getTask(address)", +"019f5c5b": "narcoCore()", +"019f64cc": "payBack()", +"019f80b6": "toSecond(uint256,uint256)", +"019f8e26": "AddedManager(address)", +"019fef03": "resetFine(uint16)", +"01a00216": "addMod(address)", +"01a01551": "getApprovers(string,string)", +"01a048c3": "mintLockTeamTokens(address)", +"01a08a8b": "getWorkerPool(address,uint256)", +"01a0dee1": "investorsSupply()", +"01a12fd3": "removeAlerter(address)", +"01a15ee9": "mintTokensLocked(uint256,int256,address,uint256,uint256)", +"01a1b778": "battleId()", +"01a2789e": "transferPreSignedBulk(address[],address[],uint256[],uint256[],uint256[],uint8[],bytes32[],bytes32[])", +"01a2f48a": "changeAssetPackPrice(uint256,uint256)", +"01a2f75c": "createContract(address,uint256,uint256,uint256)", +"01a340a5": "totalBoughtColor()", +"01a413b9": "bankrollAvailable()", +"01a50001": "rewardEvery100000Draw7(uint256)", +"01a521d6": "getSellerBalancesOfCurrentAuctions(address[],address[],address)", +"01a53d3b": "maximumBuyBackPriceInCents()", +"01a5e3fe": "isWhitelisted(bytes32)", +"01a682c1": "createTeam(string,string)", +"01a68a94": "donkeyCoin()", +"01a6ab93": "PassedGateway(address,uint256)", +"01a77625": "_subEth(uint256,address)", +"01a7a8c0": "batFundDeposit()", +"01a80669": "createInvestorWallet(uint256,address,uint256)", +"01a88f7d": "buySeeds()", +"01a8d07f": "addBidder(uint256,address,uint256,uint256)", +"01a93f1c": "giveAwayOwnership(address)", +"01a96b94": "set_stage_Discount(uint256)", +"01ab2a66": "getPlayer1()", +"01ab2f14": "Manus()", +"01ab9806": "BUY()", +"01ab9f19": "_safeCall(address,bytes)", +"01ad35e3": "mintTokensForCommand(address,uint256)", +"01ad3936": "assignedAmountToDevelopmentTeam()", +"01ad62a3": "getBackendWallet()", +"01ae19d6": "LogLOTTransfer(address,uint256,uint256,uint256,uint256)", +"01aef755": "setBestProbability(uint8)", +"01afd5f3": "allBalancesForManyAccounts(address[],address[])", +"01afebac": "ICOopen()", +"01b057b1": "isAdminSet()", +"01b07f75": "adjustValue()", +"01b0c649": "collect(address,address,uint256,uint256)", +"01b11792": "toggleLocked()", +"01b125e6": "resetTimer(string)", +"01b14149": "getFcontracts(address)", +"01b2320e": "getStartBlock(uint256)", +"01b2a413": "baseVerifierFee()", +"01b490ed": "CAIDToken()", +"01b54744": "setLLV_edit_24(string)", +"01b5990c": "getCreatedOn(address,uint256)", +"01b5ffcf": "addVesting(address,address,uint256,uint256,uint256,uint256,bool)", +"01b6b523": "viewMyContribution(bool)", +"01b74d73": "TEAM_SHARE_PERCENTAGE()", +"01b78b12": "BitcoinMoon()", +"01b852c9": "MetadollarCrw()", +"01b869f1": "release(uint32,uint32,uint32,bytes)", +"01b8a0b9": "createTestingEnvironment()", +"01b96aaf": "waveCap2()", +"01b98853": "assetFreeze()", +"01b9a397": "setDescriptor(address)", +"01b9fe59": "testMint(int256)", +"01ba2bd5": "Request_Airdrop()", +"01ba6805": "loseEth(address,uint256)", +"01baa2e7": "validateCap()", +"01bb4edf": "RAIOCO(uint256,string,string)", +"01bb67a8": "InvestCancelEvent(address,uint256)", +"01bb7e5a": "getLockerDetails(address,uint256)", +"01bb85a4": "__startBlock(string)", +"01bbb8fa": "verifyTimelock(bytes32,uint256,address,address,uint256,uint256,bytes32,bytes,bytes)", +"01bbc3f5": "stopWhitelistReservetion()", +"01bc237d": "researchers(address)", +"01bc43a0": "sha(uint128,bytes32)", +"01bc45c9": "_admin()", +"01bc757a": "getstudentInfo(uint256)", +"01bc9533": "totalTokensGenerated()", +"01bd4051": "disown(string)", +"01bea2bd": "Mountain()", +"01beb7cf": "setBadgeLevel(bytes32,uint256,string,string,bytes)", +"01bebf36": "updateAirdropStageState(string,bool)", +"01bf6648": "removeFromWhiteList(address)", +"01c0c6bc": "_processRefund(bytes32)", +"01c11d96": "MAX_PRICE()", +"01c1c877": "setChampion(uint256)", +"01c1de96": "fechVoteInfoForVoterByStage(address,uint256)", +"01c24a90": "minimum_balance()", +"01c28786": "date_end()", +"01c2b6f5": "commitDeadline(bytes32)", +"01c355df": "appSelectors(bytes4)", +"01c432ce": "wrongClaimerOrUnsetInManager()", +"01c4a07e": "convertDeposit100to70(address)", +"01c516b1": "crowdsale_end()", +"01c543c2": "claimOreOnlyFromAssetId(uint256)", +"01c5b2f0": "compressBoard(uint256[81])", +"01c64ce8": "maxTxGas()", +"01c68b4e": "addSrNumberOfbook(uint256,uint256,uint256,uint256,uint256)", +"01c69452": "brandAccounts(uint256)", +"01c6adc3": "transferFrom(address,uint256)", +"01c6f167": "auctionsRunByUser(address,address)", +"01c7cb58": "migrateMileageLeader(uint8,address,uint256)", +"01c835e5": "returnRemainRewardToken()", +"01c8c9d4": "getCurrentBonus(bool)", +"01c96df6": "ZeusShieldCoin()", +"01ca1d72": "getTransformRate()", +"01cb0261": "getWeightedVote(bytes20,uint256)", +"01cb3b20": "checkGoalReached()", +"01cb63e8": "arrayIndexOutOfBoundsDynamic(uint256)", +"01cceb38": "setExpiry(uint256)", +"01cdc371": "getCBATransactionMessageLength(address)", +"01ce5e75": "fundsCombinedValue()", +"01ce616f": "setMaxweiAmount(uint256)", +"01cff174": "getNumberOfAvailableStartTickets()", +"01cffa17": "getTokenWithBonus(uint256)", +"01d09a3c": "setCallbackGas(uint256)", +"01d0ac0b": "requestAccess(address,address)", +"01d1c7fd": "BTCS_ETHER_CAP()", +"01d223c1": "set_modified_weth_address(address)", +"01d2db89": "isValidKyc(address)", +"01d37b0c": "changeHiddenValue(string)", +"01d4277c": "thisisalsofind(uint256)", +"01d42a9c": "closeChannel(address,uint256)", +"01d490fd": "registerVestingSchedule(address,address,uint256,uint256,uint256,uint256)", +"01d4fb7c": "fundsKeeper()", +"01d511f1": "request(string,string)", +"01d5c488": "gemCriticalRateConversion()", +"01d6e35b": "unfreezeTeamTokens(address)", +"01d78a8b": "alterTotalSupply(uint256)", +"01d81121": "allocateCreationInvestmentingToken(address[],uint256[])", +"01d81a50": "slice(bytes,uint8,uint8)", +"01d8715f": "replaceManager(address,address)", +"01d8ce92": "KpopArena()", +"01d90bbc": "getCurrentUserMaxPurchase()", +"01d92dc8": "unsoldAllocatonScheduled()", +"01d97f08": "setMapping(bytes32,bytes32)", +"01d98d44": "changesDenied()", +"01da31ad": "_setPermission(address,address,bytes4,address,bool)", +"01da73ff": "isValidChannel(bytes)", +"01da7b31": "getBankName(address)", +"01db61e0": "HARD_CAP_EUR()", +"01dbdf44": "priceAt(uint256,uint256)", +"01dd91c0": "force_received()", +"01dda205": "updateSoftCap(uint256)", +"01ddc95e": "getTargetBlockLength()", +"01ddfa9d": "referalFundBalance()", +"01de7a1c": "updateVendorName(uint256,string)", +"01dee025": "getTombDetail(uint256)", +"01df6885": "getTokenDetails(uint64)", +"01df7f30": "validateProposedThroneConfig(uint256,uint256,uint256,uint256)", +"01e0ba3a": "bonusAccountIndex(uint256)", +"01e11c29": "SellToken()", +"01e1bcf7": "rateIcoPreICO()", +"01e1c861": "minWeiValue()", +"01e1d114": "totalAssets()", +"01e1ecb4": "releaseTokensAndEtherForEmergencyFund()", +"01e30a7f": "bigContributionBound()", +"01e33667": "withdrawToken(address,address,uint256)", +"01e343db": "setOffset(uint256)", +"01e3d346": "create(bytes1,bytes32,uint256)", +"01e3d718": "transto(address,uint256)", +"01e40f5b": "getFeeWindowBurnTargetValue()", +"01e4741c": "Ebets()", +"01e4abc1": "setWhiteList(address,address,uint32)", +"01e5691c": "createTransaction(uint256,address,uint256,uint256,address)", +"01e56c77": "stopPayouts()", +"01e57a37": "dth()", +"01e5aa3e": "getIssuerArray(bytes32)", +"01e68cbb": "timestamp_msg()", +"01e6a70e": "EthlanceInvoice(address)", +"01e73b73": "bulkVote(uint256[])", +"01e7fefe": "addParticipant(address,uint256)", +"01e88208": "permissions(address)", +"01e8b608": "TOKEN_SECOND_EXCHANGE_RATE()", +"01e91872": "DECToken(uint256,string,string)", +"01ea6270": "setTeamTokenAddress(address,address)", +"01eb6fdd": "max(uint32,uint32)", +"01ebc88e": "pingReading(uint256)", +"01ebccb9": "activeNameOf(address)", +"01ebd36b": "enable_sale()", +"01ebebf2": "myTulips()", +"01ec0793": "profitsOf(address)", +"01ec16ef": "RulesChangedEvent(uint256,uint256,uint256,uint256)", +"01eca37c": "medalDataContract()", +"01ecaca5": "changeOVCPerEther(uint256)", +"01ed7f8b": "distribute(address,address,address)", +"01edb1ea": "dayIdx()", +"01ef6cad": "addJobContractFeedback(uint256,string,uint8)", +"01ef74f1": "tokens_rewards_available()", +"01efb6c8": "getOrderInfo()", +"01f2a2c5": "buyForBtc(address,uint256,uint256,uint256,uint256)", +"01f40a85": "issuePurchase(address,uint256)", +"01f59d16": "maxFee()", +"01f5af30": "addJobSponsorship(uint256,string,string)", +"01f6dad0": "remaining_for_sale()", +"01f6e6d5": "asignarDni(uint256)", +"01f78f43": "getFreeCHICKEN()", +"01f7e49a": "removeFromPresaleWhitelist(address)", +"01f81649": "claimBrokerFee()", +"01f865c3": "setWinPercent(uint256)", +"01f89de0": "purchaseSharesOfArtwork(uint256)", +"01f99ad7": "left9(uint256)", +"01f9a0aa": "setOraclizeQueryMaxTime(uint256)", +"01fa3e53": "addSocial(address[],uint256[])", +"01fabd75": "addArbitrator(address)", +"01fae3b6": "setTokenState(uint8)", +"01fbaf99": "totalLareSold()", +"01fc59e1": "checkId(bytes32)", +"01fce27e": "getQueue()", +"01fd1b1d": "finalizationFailHook()", +"01fd89a4": "getFlags(bytes20)", +"01fe34e3": "EWCertificationCenter(string,string,string)", +"01feeef4": "getTitleDeeds(bytes32)", +"01ff62ab": "isConcerned(uint256,address)", +"01ff8961": "getPortfolio(uint256,address)", +"01ffc9a7": "supportsInterface(bytes4)", +"0200b10d": "collectedEthers()", +"0201b5d5": "transferOverBalanceFunds(address,address,uint256)", +"0201e253": "WhoHoldsPatentFor(bytes32)", +"0202f3ea": "allowTransfersTo(address)", +"020331dd": "getFact(bytes16)", +"0203596d": "purchaseKingdom(string,string,bool)", +"0204c163": "maxFadeoutPromille()", +"0204d0f8": "unlockOwnerDate()", +"02055186": "Alexa()", +"02063d93": "calcMaxDeposit()", +"0206432d": "FlexionCoin()", +"02064b42": "consul_price()", +"02065fb8": "isLoanFunded()", +"02067e6a": "add(uint8)", +"0206deb5": "unitsLimitForCurrentSaleStage()", +"0206e79d": "decodeParamId(uint256)", +"02072579": "controllerSet()", +"02078166": "unburnedTypeTokens()", +"0207eda6": "NOVA(uint256,string,uint8,string)", +"02083e27": "REET()", +"02093ee2": "finalize2()", +"02096a8e": "amountsByCurrency(uint256)", +"02099186": "totalRise()", +"0209f982": "reminder()", +"020a0ff5": "setClaimLimit(uint256)", +"020acb6a": "round1Bonus()", +"020bdf54": "getFreeStrippers()", +"020d308d": "removeDelegate(address,address)", +"020d4786": "OmmerToken()", +"020de876": "setTakerFeeRate(uint256)", +"020df04b": "createBarCode(bytes32)", +"020df957": "setAirdropReceiver(address)", +"020e2d48": "getArrayHashLibry(bytes32)", +"020eb6e1": "createWorkOrder(address,uint128)", +"020f899a": "hybridizationPrice(uint256)", +"0210d751": "getMyGames()", +"02114111": "allowTimelock()", +"0211c4bb": "MessageToken()", +"0212d0b9": "payByTokens(uint256)", +"0212fd1f": "InternationalRapidAsset()", +"0213443c": "changeZombieCreator(address)", +"02135534": "getNinja(uint256)", +"02138563": "buyOre()", +"02140adf": "CryptoHuntersToken()", +"0214e9cf": "preIcoFinishTimestamp()", +"0216f544": "transferExecutor(address)", +"02171e7c": "largeConstant()", +"02172276": "triggerEvent(string,string)", +"02175beb": "setOzr(address)", +"0218a1c3": "setString(bytes32,bytes32,string,bool)", +"02190a52": "allowRecurringBillingInternal(address,uint256,uint256,uint256,uint256)", +"021979c3": "wlcontract()", +"021991e7": "getBetsLocked()", +"021a11d0": "setContractICO(address,address)", +"021ba8f8": "CLAWBACK_PERIOD()", +"021bb947": "burnAfterIco()", +"021bc974": "checkPoolBalance()", +"021c309a": "solveBet(address,uint8,bool,uint8)", +"021c43b4": "NBY()", +"021c7bd7": "setInspectorId(address)", +"021da58e": "initCrowdsale(uint256,uint256,uint256,address,address)", +"021dc2fc": "tokenExchangeRateInWei()", +"021dd82c": "checkNotLocked(address,uint256)", +"021e7f85": "CONTRACT_ALLOWANCE()", +"021ea45e": "claimTilesForExistingUser(uint16[],uint256,bool)", +"021efe49": "getPawnOwner(uint256)", +"021f0376": "_addAssetTo(address,uint256)", +"021f36a4": "changeResource(bytes32)", +"021fe51f": "VUPRefundedForWei(address,uint256)", +"0220611a": "timeOfLastPublish()", +"022079d9": "ecmulVerify(uint256,uint256,uint256,uint256,uint256)", +"0220a5b4": "terminate(string)", +"0220f662": "addPolicyAttribute(uint8,uint256,uint8)", +"0221038a": "payOut(address,uint256)", +"02218ad6": "desBan(address)", +"0221f2fb": "Beneficial()", +"0222f96e": "Poppy()", +"02238cbd": "_activateDevice(bytes32)", +"02238e43": "launchnewround()", +"0224dc18": "TOKEN_SALE1_PRE()", +"0224e9a7": "devFees()", +"02258730": "nodeRegistration()", +"02259b07": "setPBTTForGas(uint256)", +"02262ced": "setBackendOperator(address)", +"0226401d": "ownerTestValue()", +"02264b63": "private_withdraw(uint256,address)", +"0226a5c9": "petOnLeaderboard(uint64)", +"0226ed48": "changeGlobalAdmin(address)", +"02285548": "FarmHopeProjectToken()", +"0228e05a": "walletFromData(bytes)", +"022914a7": "owners(address)", +"02299496": "updateICOStatus()", +"0229ae31": "CosmoCoin()", +"0229b23e": "pauseSALE()", +"0229c4eb": "TransferMinimumFeeProposalAdded(uint256,address,uint8)", +"0229e448": "founderMulSigAddress()", +"022b7433": "add(bytes32,uint8,uint8)", +"022b8a7f": "getIdProject()", +"022b9735": "GetMyBalance()", +"022bc71f": "getNextCallSibling(bytes32)", +"022bd24c": "hypes(uint256)", +"022c254a": "pendingChanges(address)", +"022cabac": "CoinViewToken()", +"022e1e59": "USBEEF()", +"022e9c95": "getinverstinterval()", +"022ec936": "updatePeriod(uint256,uint256)", +"022edd35": "getActiveContracts()", +"022fc88b": "approveToken(address,uint256)", +"02300cbb": "DepositReleased()", +"0230a07c": "releaseDeed(bytes32)", +"0230d870": "tierThreeRate()", +"02329a29": "pause(bool)", +"02337657": "documentIPFSHash()", +"0233d94d": "getEscrowsByTaker(address)", +"02340ad6": "deleteVisaOffering(uint256,uint256)", +"023569aa": "MoniCoin()", +"02356ec0": "returnCoupon(address,bytes32)", +"02358773": "XFL(uint256,string,string)", +"02359fdd": "OfferingCloses(uint256,uint256)", +"02361dbc": "totalAllStage()", +"0236bb5a": "isAdminAddress(address)", +"0237ef12": "contributionInWei()", +"0238777f": "preCrowdsaleContractAddress()", +"0238b5aa": "testToAddress()", +"0238b770": "endDateICO()", +"02394872": "getLastBlockHeight()", +"02395e9b": "lpc()", +"023a624a": "right11(uint256)", +"023b011e": "getRateEth()", +"023bb74d": "DATE_PRESALE_START()", +"023c19ce": "MyWishChain()", +"023c23db": "getSize(uint256)", +"023c6042": "tokencap()", +"023c61ca": "price_agent()", +"023c8be2": "setWithdrawalAddress(address,address)", +"023d44df": "RNBlock()", +"023d6c03": "REPO_APP_NAME()", +"023e1c34": "communityContributionPercentage()", +"023e36d8": "nVotesCast()", +"023eff9f": "airdrop(uint8,bytes32,bytes32)", +"023f4147": "totalContributed()", +"023f4a66": "issueToReserve(uint256)", +"023fadda": "getRedeemedList()", +"02400845": "publish(bytes12)", +"02404bee": "crowdsaleCount()", +"02404fcb": "buyBanana()", +"0240ab3f": "finishRetrieving()", +"0240db33": "summFounders4()", +"02410cf6": "isFundReleased()", +"0241747f": "ReceivedBTC(address,uint256)", +"024187a5": "window0TotalSupply()", +"0241fb82": "returnChildForParentNew(address)", +"02421ca7": "SaddleFS(uint256)", +"0242622b": "changeMultisigAddress(address)", +"0242a5fc": "testRecovery(bytes32,uint8,bytes32,bytes32)", +"0242ba2a": "FOToken()", +"0242c430": "CreateTokenToTeam(address,uint256)", +"0242deb8": "registerIntermediary(address)", +"0242f1ef": "TonCoin()", +"0242f351": "getVote()", +"0242fc62": "voteNo(string)", +"02431422": "addSuperPlayer(address,bytes32)", +"02433d0f": "num_holders()", +"02437982": "adjustRate(uint256,uint256,uint256)", +"0243aa1b": "getCurrentNbVote()", +"02443111": "oneTrancheAmount()", +"0244ba4a": "Hubble()", +"0244eb3f": "testFundsAreLockedDuringSale()", +"0245c5c8": "importSequence()", +"02460d1e": "_emitHolderRegistered(bytes32,uint256,uint256)", +"02474718": "paydayFrequencyInDays()", +"02474c59": "myPledgeTo(address)", +"0247e02a": "subFromAddressBalancesInfo(address,uint256)", +"024800ff": "presaleWeiSold()", +"024858b1": "createTrade(bytes32,uint256,uint256,address,address)", +"02491bd5": "CryptoLottoCoin()", +"0249e64a": "CodeMailStamp()", +"024a56a4": "testIsData(bytes)", +"024adb25": "LogStateSwitch(uint8)", +"024bb1fd": "changeName(uint256)", +"024c4199": "addListener(address,address)", +"024c6def": "BONUS_ICO_WEEK_TWO()", +"024c764f": "setChallengeCooldownTime(uint256)", +"024cc06d": "updateRecipientInfo(bytes32,string,string,address)", +"024ddebe": "Error(bool)", +"024edd75": "buyHero(uint256)", +"024fcc6c": "enableService()", +"024fd650": "tokenData()", +"024fd912": "GoToken()", +"02500824": "buyDentacoinsAgainstEther()", +"025026d5": "updateEmployee(uint256,uint256)", +"02502787": "FDT(uint256,string,uint8,string)", +"0250bd2d": "unregisterName(string)", +"02521b16": "saveTxt(string)", +"0252607e": "bitcoinPublicKey(uint256)", +"0252b995": "gameStartTime()", +"025313a2": "proxyOwner()", +"0253a95a": "getMaxMerge()", +"0253e935": "setOrderListLengthFactor(uint256)", +"0253fbd1": "momFab()", +"025404d4": "amountRaisedUSD()", +"02543238": "setDiscountValueOff()", +"02548866": "TOTAL_CAP()", +"0254aa41": "CommonEth()", +"0254e687": "GodlyCoin()", +"0254ef0f": "enterMedium()", +"02550e4d": "profit(address)", +"02556de3": "updateMajorTree(bytes32)", +"02565633": "buriedSupply()", +"0256c7f5": "Afin()", +"0256e827": "enablePurchasing(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"02571be3": "owner(bytes32)", +"0257210f": "ForgeCDN()", +"02573fc2": "resetStellarInvestor()", +"0257a0c0": "onLotteryCompleted(uint32)", +"0257c48c": "meta(bytes32,bytes32)", +"02581ab3": "offerIndexedPieceForSaleByAddress(address,uint256,uint256)", +"02581cde": "refundExpiredBet(bytes32)", +"025830ac": "changedBrokerDealer(uint256,address)", +"025845ae": "thinkTankFundAddress()", +"02587586": "companyAddr()", +"025932fd": "bitikzikToken()", +"0259371c": "TTTTokenSell()", +"02593c2b": "_Split()", +"025a6f02": "OsmiumCrowdsale()", +"025abd58": "getTokenBalance(string)", +"025b22bc": "updateImplementation(address)", +"025b97bd": "getProviderAdmin(uint256)", +"025bbbe5": "newSale(bytes16,uint256,uint256)", +"025cce45": "AMULETS()", +"025cf89f": "setMigrationManager(address)", +"025dd017": "OnReceive(uint64)", +"025e029b": "buyStar(uint256,uint8,uint256)", +"025e56d3": "NeuroDAO()", +"025e7c27": "owners(uint256)", +"025e8095": "transferCell(address,uint256)", +"025ec81a": "getBytes32Value(bytes32)", +"025f9bc1": "updateTokenInformation(string,string)", +"025ff12f": "airdrop(address,address[],uint256[])", +"026164ad": "sunset()", +"026189ec": "BitRecord()", +"02618eb2": "AltCurrency(uint256,string,string)", +"0261a403": "issueDID(address,uint256)", +"0261edec": "getContractByID(string)", +"0262dc13": "claimOne(address)", +"0263379b": "bringBackTokens()", +"026345b6": "ledgerContract()", +"0264ba24": "sendValueToJackpot()", +"0265190c": "b66ReserveTokens()", +"026654bf": "PoolManager(address)", +"02667e9b": "killPay()", +"0266ba02": "list(address[])", +"0266f044": "reservePool()", +"02682ab3": "setNewWallets(address,address,address)", +"026858ea": "getRateModifierInPermilles()", +"0268ec43": "MyEtherTeller()", +"02690ef0": "setICOElePrice(uint256)", +"026993e0": "Midas(address,address)", +"026a308a": "_checkWhitelistContract(address)", +"026a9cdd": "getPotato(uint256)", +"026b1d5f": "getPool()", +"026bb254": "upVoteHouse(address)", +"026c0d8f": "RHP()", +"026d0e1c": "grantUserLicense(address,string)", +"026d19d5": "WeTestToken(address,string,string,uint256,uint256)", +"026d6a67": "setStartStopBlocks(uint256,uint256)", +"026e402b": "delegate(address,uint256)", +"026eca12": "createTapPoll(uint8)", +"026f9d56": "SOT()", +"026fcf83": "setSaleFinish()", +"026ff05e": "deleteUser()", +"02704a4d": "COIN_SUPPLY_ICO_PHASE_3()", +"027116f7": "approveNewOwnersCount()", +"027391bf": "sendMoneyBeforeEnd(uint256)", +"02742425": "preFundingtokens()", +"027471b0": "roundActive()", +"0274d5ff": "soulIsOwnedBy(address)", +"0274ea81": "jadd(uint256,uint256,uint256,uint256,uint256,uint256)", +"0276650b": "individualCap()", +"027681ab": "setJackPotInfo(uint256,uint256)", +"02780677": "LN2()", +"0278199e": "StandardToken(uint256)", +"0278bde1": "ask(address,uint256,uint256,uint256)", +"0278fa20": "TeambrellaWallet()", +"027903ef": "setReservedTokens(uint256)", +"02795b3a": "tokenMarket(address)", +"027a4425": "EthereumDiamond()", +"027a5e3f": "getLastVersion(bytes)", +"027a7ccc": "calculateFirstCut(uint256)", +"027aa9f5": "getUnits()", +"027b1fb3": "SimpleStorage()", +"027bb838": "FLTToken()", +"027bd9a8": "changeColorGreen()", +"027bfab4": "discountedIcoTokensSold()", +"027c3e08": "ControllerChanged(address)", +"027cb7c6": "clearing()", +"027e7a0f": "getTotalGamePot()", +"027ec848": "setDurationOfLock(uint256)", +"027efe2b": "makeOperation(uint32,string)", +"0280052d": "setKing()", +"028118a1": "PREBUY_PORTION_MAX()", +"02814b86": "maxETH()", +"0281b752": "admin_set_ExchangeRateInWei(uint256)", +"02825adc": "gvOptionToken30()", +"02836f24": "upgrading()", +"0283f4b4": "addPropertyForUser(bytes32,address)", +"02846858": "removeBurner(address)", +"0285d554": "transferWithEvent(address,address,uint256)", +"028780e4": "ownerWithdrawZth(address)", +"02879f9c": "addProduct(string,uint256,string,string,string)", +"02884909": "authorizedLogicContractAddress()", +"02889f26": "getCustodianChangeReq(bytes32)", +"0288a39c": "withdrawDelay()", +"0288ab5d": "TCC()", +"0288c0a0": "TransferDomain(string,address)", +"0289e966": "newVersionReleased()", +"028a582e": "findEndpointByAddress(address)", +"028a95a0": "lockRemainingTokens()", +"028ab3b1": "__get(address,uint256)", +"028ae3b7": "setAffiliateList(address)", +"028af743": "getServerCurrentMatch(uint256)", +"028b7854": "throwsSaleWalletIncorrectBlock()", +"028e10ac": "BidaCoin(uint256)", +"028e3731": "getUsersByDocHash(bytes)", +"028e6c67": "intOrRevert(uint256,uint256)", +"028ebc44": "setRegistryContract(address)", +"028fb6b8": "deleteRef(bytes32)", +"029043a4": "removeBlacklistSpender(address)", +"02911cfe": "distribute(address,uint256,uint8,uint256)", +"02917f4a": "issuePatrons(address,uint256)", +"0291b9b1": "judgeIsReachDailyLimit(uint256,int256,uint256)", +"02927d20": "setupEventsHistory(address)", +"0292f88a": "setBaseDenominationAddress(address)", +"02931e59": "getUserPower(address)", +"02932f56": "totalCampaigns()", +"0293a772": "get_sale_owner(address,address)", +"0293fafc": "ADBToken()", +"02940dbb": "Decenturuon()", +"02942724": "preservedTokens()", +"02949bff": "CampaignToken()", +"0295d71b": "currentDepositLimit()", +"02965297": "update_height(uint256)", +"0296b3a8": "STARLIGHT()", +"02978be8": "gameHostAddress()", +"0297abe5": "getLimitMaxGame()", +"02981cfe": "transferedToPool()", +"02987db8": "priceInWeiPerSatoshi()", +"02989d9f": "SellOrder(uint256,uint256,address)", +"0298d557": "isValidSignatureAndData(address,address,bytes)", +"029a258a": "claimDonations(address[2],uint256[8],uint8,bytes32[2])", +"029a8bf7": "multiAsset()", +"029ad03e": "get_nb(address)", +"029bca78": "isPremium(uint256)", +"029c19aa": "getCreditBondAddress()", +"029d1ecd": "ownerApprove(address,uint256)", +"029d4b2d": "isTimestampInsideRange(uint256,uint256,uint256)", +"029da1c4": "walletFounder2()", +"029dc6d2": "piggyToWallet()", +"029deeb0": "updateUportInfoFromOracle(string,address,address)", +"029eabcb": "contributions()", +"029f1d0e": "userName(uint256)", +"02a10d87": "getPreSaleEndDate()", +"02a182d1": "setInvestmentCapIcoPhaseTwoPounds(uint32)", +"02a1a7a8": "isReachCapped()", +"02a251a3": "votingPeriod()", +"02a2680c": "getUserWalletByID(uint256)", +"02a2c88f": "kycLevelOf(address)", +"02a2cf02": "NOK_Omnidollar()", +"02a2e105": "RYANTOKEN()", +"02a2f06e": "GetMyBet()", +"02a3036d": "init1_block_height()", +"02a4e488": "decreaseAllowanceProxy(address,address,uint256)", +"02a4e849": "getMiniPoolEdit_9()", +"02a566bd": "Woyager()", +"02a59ea3": "isEntitledForCluster(address)", +"02a5c0be": "CryptoSagaArenaRecord(address,address,uint8,uint8)", +"02a63c28": "consumeMarketOrderAsk(uint256,address,address)", +"02a6f266": "Presale(address,address,address,address)", +"02a72a4c": "tokenGrantsCount(address)", +"02a86781": "authorAddress()", +"02a8a406": "setBurnPolicy(bool,bool)", +"02aa26f6": "buySeatForEvent(uint256)", +"02aa274b": "setForward(bytes4,address)", +"02aa6318": "getDistributions()", +"02aa9be2": "unvote(address,uint256)", +"02ab4781": "reservedCoins(address)", +"02abb4c5": "Miner()", +"02ac8168": "Launch()", +"02acbaa3": "CrowdsaleMinter()", +"02acc6b6": "GNTTokenERC20(uint256,string,string)", +"02acdb44": "setAnyoneCanCall(address,bytes4,bool)", +"02ae832f": "trashTokens(address,uint256)", +"02ae8cdc": "tokenProduct(uint256)", +"02aec20d": "PrintableToken(string,uint256,string,uint256,int256)", +"02af2095": "massTransfer(address[],uint256[])", +"02b04384": "AIRDROP_ADDRESS()", +"02b09ac5": "charityVault()", +"02b32af5": "greenToken()", +"02b33929": "SMTToken(uint256,uint256)", +"02b3b3da": "Divium()", +"02b40d11": "tokenSetMarketMaker(address,address,address,address)", +"02b4b52c": "isLogoInitied()", +"02b518fd": "callback(address,address,uint256,uint256,uint256)", +"02b5ecc8": "rateAngelsDayEnd()", +"02b68bbf": "getPlayersItemTickets(address)", +"02b6ef74": "CRofMakerByIndex(address,uint256)", +"02b6f286": "TokenContract(address,string,string,uint8)", +"02b70b41": "addConfirmation(bytes32,address)", +"02b7144f": "updateCheckpoint(address,address)", +"02b74a7e": "setupStates(uint256,uint256,uint256[])", +"02b857f3": "unlockMintDate1()", +"02b985d3": "arr(uint256,uint256,uint256,uint256)", +"02ba302b": "nextPrice1Of(uint256)", +"02ba6f8d": "getHistoryEntry(uint256,uint256)", +"02ba742b": "extendMembership(address,uint256)", +"02ba8742": "sendCoins(address,uint256)", +"02baaf40": "lastInitTimestamp()", +"02bb2929": "etherToDustPrice()", +"02bb5d6e": "setEOMarketToken(address)", +"02bb8465": "setContent(uint8,string,string)", +"02bc54bf": "companySite()", +"02be8e4e": "changeOwnerShip(address)", +"02beee07": "_getElement(uint8[],uint8)", +"02bf3165": "auctionUnpause()", +"02bf7fe7": "JumpCoin()", +"02bf9e7f": "verifySignature(address,bytes32,uint8,bytes32,bytes32)", +"02bfeeb8": "totalPicoUSD()", +"02c06bcd": "prevTokenAddress()", +"02c1d7cf": "iSportNews()", +"02c1ecbf": "returnStateChange()", +"02c28410": "getPublicAllocation()", +"02c29349": "fixWithdrawalAddress(address)", +"02c2a74d": "episodeManager()", +"02c3d7f6": "end_ICO()", +"02c4897b": "getAutorPicture(bytes32)", +"02c4960e": "InsufficientFee(address,uint256)", +"02c4980c": "BOC()", +"02c63852": "TokenVesting(address,address,uint256,uint256,uint256)", +"02c6d827": "getgamecardpos2(address,address)", +"02c6f427": "PRESALE_LEVEL_4()", +"02c71d92": "newClonedRepo()", +"02c76d45": "mintCoolDown()", +"02c7e7af": "sold()", +"02c85991": "distributeMinting(address[],uint256[])", +"02c90584": "userAddressExists(address)", +"02c95d2d": "setHaltIco(bool)", +"02c9972c": "TICK_TIME()", +"02c9e537": "cresusAddress()", +"02ca5994": "registerToken(address,uint256)", +"02ccee02": "getNoteLine(uint256)", +"02cd0f96": "Deadline(uint256)", +"02cdc1ee": "setSendGodz(uint256)", +"02ce5813": "whitelistActive()", +"02ce5fc4": "generateMintEvents(address,uint256)", +"02ce728f": "updateExchangeRate()", +"02ce8ac9": "withdrawSale(uint256)", +"02d0181c": "HamidToken()", +"02d05531": "getUriCount()", +"02d05d3f": "creator()", +"02d06d05": "bytesToUint(bytes)", +"02d19fe5": "testApproveWillNotModifyAllowance()", +"02d1c1e6": "sendOwnerBalance(address,address,uint256)", +"02d1d5fe": "getDesign()", +"02d23cef": "sendWithFreeze(address,uint256,uint256)", +"02d2f349": "lastPeriodChange()", +"02d3b339": "drawColors(uint256[],uint256[],address)", +"02d3bd16": "circulatingSupply_()", +"02d3fdc9": "burnMin()", +"02d44e57": "_getBetTimestamp(bytes32)", +"02d49d0b": "_createHiveInternal(address)", +"02d52fa4": "createProposal(uint256,string)", +"02d596d8": "getUserFromAddr(address)", +"02d66fc2": "hasSchema(bytes32)", +"02d6e7f4": "tokenXchangeRate()", +"02d6f730": "getFreezing(address,uint256)", +"02d77954": "getVoteOf(uint256)", +"02d7ccef": "UP_winRate()", +"02d800ec": "deactivateKey(string)", +"02d8146e": "tokensWallet()", +"02d947ef": "vote(uint256,address)", +"02d99637": "BlockClaimedEvent(address,address,uint256,uint256)", +"02da667b": "createProject(uint256,uint256)", +"02da6d06": "lastDao()", +"02dadf8e": "registerCitizen(bytes32,address)", +"02db2d8a": "myRefund(address)", +"02dbf3c8": "CGE()", +"02dc2e1d": "queuePayment(bytes)", +"02dcfc8e": "setAssetFees(address,uint256,uint256)", +"02dd6731": "disableApiAccess(bool)", +"02dd92c4": "crowdsaleOn()", +"02de2cf3": "isLatestPreReleaseTree(bytes32,bytes32)", +"02df0b61": "deprecateById(bytes32)", +"02df45a8": "closeActive(uint256)", +"02e0a2ff": "getAvailableBlance()", +"02e0b293": "LogVote(address,uint256,uint256,uint256,uint256)", +"02e0c14a": "get(bytes12)", +"02e0d5a5": "AquaToken()", +"02e1033a": "monsterFleeTime()", +"02e132f6": "recalcInvestorsFee(address,uint256)", +"02e26c38": "richest()", +"02e2c3b7": "setRefererPercent(uint256)", +"02e2f0b6": "Erc20TokenMarket()", +"02e32144": "precentDecimal()", +"02e33d25": "HydroToken()", +"02e4879d": "setProposalDuration(uint64)", +"02e49bd9": "publicityAddress()", +"02e4af01": "generateRandom()", +"02e4ef66": "transferWhiteList(address)", +"02e4f63b": "doExchange(address,address,address,uint256)", +"02e635e6": "AID()", +"02e650b6": "DigitalMoney(uint256,string,string)", +"02e6a5dc": "LIC(uint256,string,string,uint8)", +"02e6a951": "PayableContract()", +"02e7491e": "ERC165ID()", +"02e8243e": "WeiCoin(address,uint256,uint256,uint256)", +"02e8d8c0": "scheduleTransaction(address,uint256,uint256)", +"02e97770": "InfinitiEstate()", +"02e98e0d": "diffMinutes(uint256,uint256)", +"02e99e16": "SplitAmount(address,address,uint256)", +"02e9ad65": "dispatchTo(address,uint256)", +"02e9d5e4": "acceptBid(uint256,uint256)", +"02eb4759": "RightAndRoles(address[])", +"02eba8a7": "auditContract(bytes32,bool)", +"02ec77d2": "joinPot(string)", +"02ed26d1": "startTokensSale(uint256,uint256,uint256)", +"02ed292b": "receiverSpend(bytes32,uint256,bytes32,address,address)", +"02ed4d2d": "Purox(uint256,string,uint8,string)", +"02edcbfb": "proposeAmendment(uint256[],uint256[],bytes32)", +"02ee3275": "setSatoShi()", +"02ee3a52": "getAllProducts()", +"02ee50e0": "EliteToken()", +"02ee6a6b": "RegisterEvent(address,address)", +"02eef456": "UK()", +"02eef7c3": "MassivelyMultiplayerOnlineGame()", +"02ef3844": "getBountiesByCreator(address)", +"02ef43c3": "recordPurchase(address,uint256,uint256,string,uint256)", +"02ef521e": "registerEtherToken(address,bool)", +"02ef6c86": "calculateWithdraw(address)", +"02efbde5": "batchApproveWhitelist(address[])", +"02f050e4": "getWinningDetails(uint256)", +"02f08568": "lockController()", +"02f0c937": "buyItem(uint256,address,string,string)", +"02f1bfad": "setupTimeWindow(uint256)", +"02f1ed99": "putOnInitialSale(uint256)", +"02f2008d": "hintURL(bytes32,string)", +"02f20b9c": "getReport(string,uint256)", +"02f41314": "continueDistribution(uint256)", +"02f48c8b": "transferAvailableBalances(address,address,uint256)", +"02f58015": "claim_bounty()", +"02f65096": "executeBid(uint256,uint256,uint256)", +"02f652a3": "setTransferAgent(address,bool)", +"02f83a56": "withdrawBonusToken()", +"02f9fd84": "HHGTTG()", +"02faabb3": "fetchOrderByIdWithMerchant(string,address)", +"02fac967": "ownerHasCard(address,address)", +"02faf1e2": "revokeAccessFromAddress(address,address)", +"02fb0c5e": "active()", +"02fb4d85": "slash(address,uint256)", +"02fbe0d5": "getKittyGetOrNot(address)", +"02fc1f85": "ownedNumbers(address)", +"02fc28c4": "TAP_POLL_DURATION()", +"02fc2a8a": "_buy(address,uint256)", +"02fc3127": "tokenSaleBalanceOf(address)", +"02fd9dd8": "market_DeclareForSaleToAddress(uint256,uint256,address)", +"02ff1fac": "changeDevevoperAccont(address)", +"02ffc0b0": "getApprovedAddressesOfList(address[])", +"03015ea3": "registerArbiter(uint256,uint256)", +"03021c87": "setMaxInterval(uint256)", +"0302263a": "getPendingManager()", +"0302c688": "prod()", +"03031960": "VestingVault(address,address,uint256)", +"030326ad": "pushAddr(address)", +"0303f694": "_getBonusPercent()", +"0304363a": "fetchAllVoteResult()", +"030481d5": "changePreseller(address)", +"03048590": "ratePresale()", +"03048a42": "createRequest(address,uint256,string,bytes,bytes)", +"0304de3b": "setFeeRecieverValue(uint256,address)", +"03058aad": "getLatestManifest(address)", +"0305bdfe": "Trongold()", +"03060b68": "getCoreSupply()", +"03062183": "getVisaLeft(address,uint256,uint256)", +"03068d57": "setMinimumTextDonation(uint256)", +"0307024f": "getCreatedStatus(uint256)", +"03070ae7": "MANHATTANPROXYRIVDR()", +"03071302": "getCCH_edit_23()", +"030745ec": "_calculatePaymentToOwner(uint256,bool)", +"03075018": "getCosts()", +"03075ded": "emitIssuanceRatioUpdated(uint256)", +"03078416": "requestOfAmount(address,uint256)", +"0307acae": "copy(uint256[],uint256)", +"0307f82a": "SoldToken(address,uint256,string)", +"03083883": "compose(uint256[],uint256)", +"03090958": "_transferAct(address,address,uint256)", +"03096e92": "proposedMilestones()", +"0309922f": "icoMaxAmount()", +"0309c7f8": "payLastSixteenWinner(uint256)", +"030a78aa": "MAX_SITE_TOKEN_ID()", +"030b1776": "ROPE()", +"030ba25d": "withdraw(uint256,bytes)", +"030bccb0": "QLANCE2()", +"030c3631": "dungeonPlayerCount(uint256)", +"030cc118": "depositSuccessful_()", +"030cecc7": "decode(string,bytes32)", +"030d406b": "entryPayout(uint256)", +"030d945c": "PMHToken(uint256,string,uint8,string)", +"030e30df": "super_transferFrom(address,address,uint256)", +"030e6b98": "testFinalizingBeforeCapChangesHardCap()", +"030e9080": "returnAllCoke()", +"030eafa0": "endThisContact()", +"030f5702": "returnAmount(uint256)", +"03101f46": "setDistributionMinimum(address,uint256)", +"03110f23": "returnKitty(uint256)", +"031122ef": "exhaustChibis(uint256,uint256)", +"031126e1": "_approx(uint256)", +"0311904c": "investAmount()", +"0311a8f0": "getUploadNames(uint256)", +"03122043": "setCompte_40(string)", +"031324fa": "_transferDivis(address,uint256)", +"03137d43": "test_insert_findWithHintPrevRemovedUpdateHead(int256)", +"03138b31": "phase_5_remaining_tokens()", +"0313953d": "indexBalance()", +"03141fcd": "listPairForReserve(address,address,address,bool)", +"03145ac2": "WildFurToken()", +"03149252": "everyoneDisabled()", +"0314bcfb": "FUND_SUPPLY()", +"03152429": "newAccount(address)", +"031578af": "bytes32Storage(bytes32)", +"0315a513": "getDigitalAsset()", +"0316bdb0": "CofounditToken(address)", +"03178d05": "getB3()", +"0317c06e": "isAllowedBalance(address,uint256)", +"0317fb71": "asmApprove(address,address,uint256)", +"031a36f1": "EBBToken(address,uint256)", +"031a8161": "convertDecimalBack(uint256)", +"031adff0": "whitelistingAddress()", +"031b3677": "funders(address)", +"031bd4c4": "TOKEN_LIMIT()", +"031d5d01": "readMessage()", +"031d7421": "createRegistry(address,address)", +"031d973e": "closeMarket(bytes32)", +"031e1b65": "sendFounderAndTeamToken(address,uint256)", +"031ee1c8": "contribute(address,bytes32,bytes32,uint8,bytes32,bytes32)", +"031f22e7": "PRICE_STAGE_TWO()", +"031f273c": "getMixerCountByType(bytes32)", +"031f3b1a": "remainderAmount()", +"031f74d4": "bugDiscovered()", +"031f9d7b": "buyCore(address,uint256,uint256)", +"031fce17": "listBackers(uint256)", +"0320fead": "getUsedBySoftware(uint256)", +"03216695": "monthlyWithdrawLimitInWei()", +"0321f836": "namiMultiSigWallet()", +"03228d0f": "changeSendingBanPeriod(uint256)", +"0323aa55": "isValidDeletion(uint8,bytes32,bytes32,string,address,address)", +"0323cc33": "getKnowledgeSinceLastUse(address)", +"0323e576": "INITIAL_CARD_PRICE()", +"0323f64a": "removeSubDivision(uint256)", +"03240775": "getActiveEntryById(bytes32)", +"0324149a": "marketGolds()", +"0324d0d9": "calculatVotePrice()", +"03251a08": "setMin(uint256,uint256)", +"0325be06": "biathlon_transfer(address,address,uint256)", +"03261030": "Time_call()", +"03267c60": "CITY_START_PRICE()", +"0326be45": "Permission()", +"0326c06b": "utfStringLength(string)", +"0327194a": "startPublicsale(uint256,uint256,uint256)", +"03282473": "AcceptedApplication(address,uint256,string)", +"03291893": "issueAndActivateTokenBounty(address,uint256,string,uint256,address,bool,address,uint256,address)", +"03294614": "buyPickaxes(address)", +"032a0af7": "adIds()", +"032a8838": "withdrawOnBehalfOf(address)", +"032aabf0": "has_presale_time_ended()", +"032b0824": "updateLatestRevision(bytes32,bytes32)", +"032b13da": "fourthChainETC()", +"032b3400": "end_Time()", +"032b642d": "changeStartAndEndDate(uint256,uint256)", +"032bc66b": "Locked(uint256)", +"032be08b": "ticketCountMax()", +"032c05aa": "maximalParticipationAmount()", +"032cbc5f": "chainStartBlock()", +"032ccf33": "dayPot()", +"032cfa5c": "comelBabyCoin()", +"032dbae5": "setTiers(uint256,uint256)", +"032e0868": "getAllStaff()", +"032eb997": "CCXTokenERC20(uint256,string,string)", +"032fa796": "SVCoin()", +"032fc13b": "whatRound()", +"03314efa": "shares()", +"0332c6d4": "advertisementPayment()", +"03335d04": "ethGoal()", +"03339af5": "getRobotCountForUser(address)", +"0333d499": "getOwnedPoints(address)", +"0333d4a2": "ZilleriumPresaleToken()", +"03347d75": "findOrderIndexForAddress(uint256,address)", +"0334e725": "FALCON(uint256,uint256)", +"0335d533": "USER_GET_CROWDSALE_TOKEN()", +"0335e18f": "timeComplete()", +"03379e7f": "Initialize(string,string,uint256,uint256)", +"0337aa74": "systemAuctionDuration()", +"0337e379": "releaseTokenOwnership()", +"0338e3a5": "getArrIntField2()", +"03395ba5": "AUCTION_TOKENS()", +"033988a1": "Pollen()", +"0339f300": "revise(uint256,bytes32)", +"033a010b": "adminClaimAirdropMultiple2(address[],uint256)", +"033a38b0": "vehreqexist(uint256,address)", +"033a6cab": "admin_redeem(address)", +"033b8675": "ICOCREED()", +"033ba5d1": "getWillData()", +"033c44c3": "m_totalInvested()", +"033c6ee6": "countHolders()", +"033c8477": "mined()", +"033d62ee": "is2D(bool)", +"033da70b": "setLogicContractAddress(address)", +"033df9cb": "stepOneStartTime()", +"033e7ef4": "registerVoteToken(bytes32,bytes32)", +"033e86d4": "PurchaseLocked()", +"033f7bc9": "testEmergencyStop()", +"0340249e": "HotelloadTokenERC20(uint256,string,string)", +"03402a9a": "ClubTransferContract()", +"03406e76": "getOptionSellOrders(uint256,uint256)", +"034187fd": "setEthToCents(uint256)", +"03427656": "getDefaultSoftResolutionBlocks()", +"03432744": "disputesWithoutJurors()", +"0343d550": "getApprovalCount()", +"0343dfa0": "checkInvariants()", +"03440022": "setAsSeller(address,bool)", +"0344a36f": "draw(address,bytes32,uint256)", +"03460f6c": "airdropAllowed()", +"0346a4ad": "MAXIMAL_PARTICIPATION()", +"034741a8": "patformWithdraw(uint256)", +"03487513": "SIGToken(uint256)", +"034889ff": "unFollow(address)", +"0348946d": "mintedTokensCap()", +"034a7bce": "saosao4()", +"034ac7a3": "ROLE_GRADE_PROVIDER()", +"034cb28e": "addressOf(address,bytes)", +"034cd0b0": "buyTokensGrowthLife()", +"034cf8bc": "transferClub(address,uint256)", +"034d0834": "NoBsCrypto()", +"034d3b0d": "withdrawTipForDeveloper()", +"034de540": "_getEthAmount(uint256)", +"034f55d2": "calculateSum(uint256[])", +"034f9774": "setWhitelistWallet(address)", +"034fcf55": "updCouponConsumed(string,bool)", +"0350bcd9": "toSendLeft()", +"0350d085": "Sign(string,string)", +"035186d6": "increasePrizePool(bytes4)", +"0351947f": "claimFine()", +"0352017b": "getInvestmentRecord(uint256)", +"03520535": "getPI_edit_10()", +"03526ff0": "LFDNetwork()", +"035340f1": "Bitether()", +"03547e53": "ownedBalance(address)", +"0354d6c5": "accountslength()", +"035502f2": "addCategory(string,uint256)", +"03553835": "calculateTokenAmount(uint256,uint256)", +"0355b70a": "getSpaceshipTotalSold()", +"03562dbb": "changeEmissionContractAddress(address)", +"0356948e": "previousstagedata()", +"0356fe3a": "genesisBlockNumber()", +"0357088b": "trancheByIndex(address,uint256)", +"0357371d": "release(address,uint256)", +"03580712": "executeDueToInactivity(bool)", +"03582fc5": "setReferralBonusPercent(uint256)", +"0358395d": "DominionCoin()", +"0358c295": "testInitialBalanceWithNewRGXBonus()", +"0358d965": "addPayout(uint256)", +"035ac814": "lastTimeUpdate()", +"035cf142": "getMinimumDeposit()", +"035d0880": "_requireQuePayment(uint256)", +"035d37a8": "setMinContribAmount(uint256)", +"035e898a": "getStellarInvestor()", +"035e902d": "Set_EmergencyCode(uint256,uint256)", +"035f057d": "multiIncreaseApproval(address[],uint256[])", +"03602e9e": "getPrivAddress()", +"03606b30": "setStopFunding(bool)", +"03611ec7": "Finside()", +"03612cb5": "settle(bytes32[],uint256[],uint256[])", +"03627e70": "countStudent()", +"0362d1f6": "getGamblerBet(address,uint256)", +"03635100": "bizcoin()", +"0363b1e1": "trade(address,uint256,address,address,bool)", +"036478c1": "GlobalAmountCapSoft()", +"0364a254": "getStringValue(bytes3)", +"03652c4e": "ICOStartTime()", +"03656d07": "exchangeMethodIsAllowed(address,bytes4)", +"036648b7": "TokenRateUpdated(uint256)", +"036723a2": "Payout_intern(uint256)", +"0367f96d": "setHardCapValue(uint256)", +"036896ab": "getERC20TokenBalance(address,address)", +"036a131d": "setPI_edit_28(string)", +"036a66eb": "GetProductionPerSecond(address)", +"036ae645": "deleteMessage(uint16)", +"036b3a81": "partnerSupply()", +"036bd387": "totalEthInWeiForFirstIco()", +"036c36eb": "relaySellerRequestCancel(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32)", +"036dd086": "createGame(string,string,uint256,uint256,string,string,string,string,bool)", +"036e05b0": "CreatePHX(address,uint256)", +"036e4220": "changeMinAcceptQuorumPct(uint256)", +"036ecf84": "dDownInsSplit()", +"036ee850": "votingDeadline()", +"036f60ec": "setSupplyAdjuster(address)", +"037051eb": "startRound(address)", +"0370c0d9": "_repayLoan(uint256,uint256)", +"0370ca41": "contractStage()", +"0370e65c": "preSaleEndedAt()", +"037101c4": "remainingPresaleCap()", +"03710668": "callContract(address,bytes)", +"0371193b": "getEmployeeAllInformation(uint256)", +"03714af7": "burnApproveReset(address,address)", +"0373e649": "Withdrawal(address,address,uint256,uint256,uint256)", +"03741040": "get_presale_arbits_total()", +"0374fc6f": "getBestOffer(address,address)", +"03750d94": "serverSeed(address,bytes32)", +"03771327": "HardcapGoalReached(uint256,uint256,uint256,uint256)", +"03771f2f": "numOfInflatableTokens()", +"0377ebe8": "itemKindCount()", +"0378f83f": "destroyFashion(uint256,uint16)", +"03792d52": "lastSubTokenBuyerOf(uint256)", +"037933dd": "calcSTQAmount(uint256,uint256)", +"0379565f": "EIP165Implementer()", +"037a417c": "testFunc()", +"037a9d30": "isDataSource()", +"037ae882": "reLoadKey(uint256,uint256)", +"037b5fdc": "burn_balance(address)", +"037c68b2": "disagreeCount()", +"037c983a": "resumeCrowdSale()", +"037c99b0": "setBonus(uint256,uint256)", +"037ca5fc": "HubCrowdsale(uint256,address,address)", +"037ca6c4": "allAgingTimesAdded()", +"037cf465": "has_token_sale_time_ended()", +"037d4ff8": "get_pre_kyc_bonus_denominator()", +"037e2e91": "Insureum()", +"037ed3e2": "executeClaim(address,address,uint256)", +"037ef916": "CaterToken(address,address)", +"037f8f8f": "_getDefaultTranchesForAmount(address,uint256)", +"037f9cf0": "rewardDistributionStarted()", +"0380e2f3": "getHashOfTheSignedDocument()", +"0380fd03": "newExchange()", +"0381c260": "getYearlyUSDSalary(address,address)", +"0381cb3b": "setRowcol(uint256,uint256[2])", +"03824f76": "hasSoldOut()", +"03828729": "coordinatesToAddresses(uint32)", +"0382c254": "CheckHash(uint8,uint8,uint8,uint8,bytes32)", +"038339ab": "publicGetDeposit(uint256)", +"03833bae": "ValidContributionCheck(uint256,bool)", +"0383966b": "testCanFinalizeOnCap()", +"0383a6f0": "CheckLimTransferDay(address)", +"038424c3": "maxEarningsClaimsRounds()", +"038461ea": "getCertifiedStudentsCount()", +"0384899b": "OwnershipChanged(address,address)", +"03850848": "saleAuctionContract()", +"03856d15": "BalanceOnlyOwner()", +"03866aad": "transferCrc(address)", +"0386a016": "closeProposal(uint256)", +"03872547": "setarg_1_input(uint256)", +"0387b0a2": "saleCounter()", +"03880bab": "deal(uint256[2],bytes32,bytes32,uint8)", +"03894922": "allocateTokens()", +"038b117b": "onlyAdminAndNotFinal()", +"038ccee8": "createNew(uint256,address,address,address,uint256,uint256,uint256,uint256)", +"038d71ee": "switchOff()", +"038e666f": "ethereumSaleRate()", +"038e7577": "setConfigUint(bytes32,uint256)", +"038f1845": "returnFunding()", +"038f21a6": "mapToRange(uint16)", +"038f5ed6": "drawDown(uint256)", +"038f8b64": "batchFillOrdersNoThrow(uint256[],bytes[])", +"038fa9cb": "getRomms()", +"03901913": "DLBToken(uint256,string,uint8,string)", +"03905f10": "scoreKnockouts(bytes32,bytes32,bytes12)", +"03906217": "SaddleNotForSale(uint256)", +"0390d190": "YouDealToken()", +"0392d2b4": "isManagerAllowed(address,string)", +"039314b1": "VotingEnded(address,bool)", +"03941cc5": "onwerName()", +"0394b9ce": "getWeaponList()", +"03959bb7": "setDataContract(address)", +"03960631": "raindropAddress()", +"03969758": "SetDurationOfLock(address)", +"0396dcb0": "purchaseByEMONT(uint16,uint256,address)", +"0396ece5": "SetupReserve(address)", +"0396f60a": "Invested(address,uint256,uint256,uint128)", +"03975d1f": "_validateBetOrRefund(uint8)", +"03976b0e": "setBattleProviderAddress(address,address)", +"03980ac4": "prophetize(string,string,string,bytes32,bytes)", +"03985426": "getMode(bytes32)", +"03991aea": "getReleasableFunds()", +"0399247a": "isVotingProxy(uint32,int256,address)", +"0399321e": "set(bytes)", +"03995b2d": "holdingsOf(address)", +"03999795": "rouletteOwner()", +"0399c357": "assignFreeReadings(address,uint8)", +"0399f881": "ART_DECIMALSFACTOR()", +"039a21b8": "tryExecute(address,bytes,uint256)", +"039af9eb": "tiers(uint256)", +"039b267d": "mdtFoundationAddress()", +"039b6c34": "assign(uint16,address,uint256)", +"039ba6be": "getPriceETH()", +"039bd55a": "constrctor()", +"039c84c1": "Add(uint32)", +"039c9a21": "refundTransactionInternal(uint256)", +"039c9d84": "getOpenNum(bytes32)", +"039d0bfa": "setSelfOn()", +"039d8751": "GOX()", +"039de01d": "unregisterScheme(address,address)", +"039e4e2a": "situation_challenge()", +"039e9e00": "acceptOwnershipAPI()", +"039efdeb": "startMilestone()", +"039f0156": "withdrawNxc(address,uint256)", +"039f0e9c": "_createPuppy(uint256,uint256,uint256,uint256,address,uint16,uint16,uint16,uint16)", +"039f6b28": "QuadrantAssets()", +"039fb41c": "get_description_hash()", +"03a0d68f": "expiry_date()", +"03a168e0": "jackpotLastWinner()", +"03a19a4f": "maxDropsPerTx()", +"03a1b87d": "manageInvestors(address,uint256)", +"03a1bdc3": "walletLockBoth(address,uint256)", +"03a250f9": "startWork(uint256)", +"03a3053b": "reserveFundManager()", +"03a47b58": "tyms(uint256)", +"03a503a4": "addHorseIndex(bytes32)", +"03a5c8e7": "tdeActive()", +"03a68d1d": "REBToken()", +"03a6981b": "StateUpdate(uint128,int128,int256,uint256,address,uint128)", +"03a76fed": "createToken(uint256[],address)", +"03a77c7a": "setRegulator(address,address,bool)", +"03a7b41f": "queryPlotExists(uint8,int256[],int256[])", +"03a7bdd7": "testCloseContract(bytes32,bytes32,uint256,uint256,uint64,uint64,bytes32,bytes32,bytes32,uint64)", +"03ab614d": "testTranferOneToken()", +"03ac58d7": "deathData_f8()", +"03ac7215": "setTotalSupply(uint256,bool)", +"03aca792": "pendingList(uint256)", +"03ad4be3": "updatetoken(uint256,string)", +"03adaee6": "applyForCertification(string,string,string,string,address,uint128)", +"03adcbd2": "walkBook(uint16)", +"03addce2": "payout(address[],uint256,address)", +"03ade532": "ctrtMarketPrice()", +"03ae0357": "DevidendsSnapshot(address,uint256)", +"03ae3ded": "aproveLoan(uint256)", +"03ae4c1f": "buyCoke()", +"03ae8508": "createGladiatorBattle(uint256,uint8[2],bool,uint256,uint16)", +"03aeeba6": "_setClientSupply(address,uint256)", +"03af2cda": "createMultiple(uint256[],uint256[],uint256[],uint256[],uint8[],uint256[],address[])", +"03af73d3": "sendCollectedEther(address)", +"03b05c73": "maxIssuedTokensPerIco()", +"03b0a55c": "icoPvtEnded()", +"03b0e428": "_unpackRarityBonusValue(uint256)", +"03b103ea": "Vote(uint256,string,bytes32[])", +"03b25050": "CGCToken()", +"03b4e20c": "removeAddressFromAccountFor(address,address)", +"03b59255": "withdrawForeignTokensTo(address,address,uint256)", +"03b5af0f": "incomingRandomNumber(address,uint8)", +"03b5d494": "takeBet()", +"03b5ddbe": "_usdMinAmountValidate(uint256)", +"03b62931": "proveInConfirmedGblock(bytes,bytes32,bytes32)", +"03b62e10": "lowestDiff()", +"03b6eb88": "note(address,uint256)", +"03b718ee": "getCityBuildings(uint256,bool)", +"03b753dd": "tokenPurchase(address,uint256)", +"03b8a24e": "ritual(uint256)", +"03b918dc": "allow_contributions()", +"03b98c0e": "pauseable()", +"03b9b4f9": "releaseTokens(bytes32,uint256)", +"03b9f0b2": "referrerBonusRate()", +"03ba27f6": "withdrawToWallet()", +"03ba3a88": "notifyContract(address,address,uint256,bytes)", +"03bad56e": "transferERC223(address,uint256,bytes)", +"03bb5d8a": "openGameResultAndNewGame(uint256,string,bytes32)", +"03bbba93": "incentiveDistributionStarted()", +"03bc1e19": "changeOneBet(uint256)", +"03bc6d0d": "amendFee(uint256)", +"03bcebea": "initOneChance(address)", +"03bcf11d": "abortSale()", +"03bcf514": "finishedCrowdsourcingDisputeBond()", +"03bda14e": "raiseMaxNumBets(uint256)", +"03bdecf5": "right69(uint256)", +"03bec188": "ChangeMinAmount(uint256,uint256)", +"03bf4fb7": "setTradersContract(address)", +"03bf8e70": "birthKitty()", +"03bfee9e": "_getBidId()", +"03c0bfb5": "getOwnUserState()", +"03c13148": "setReceiver1(address)", +"03c175ff": "isRestrictedAddress(address)", +"03c1d1df": "collectERC20(address,uint256)", +"03c2d5b6": "nextGameDeveloperMiningPower()", +"03c327f0": "changingMilestones()", +"03c401e3": "ADDR_TKG_VC()", +"03c411d3": "MOMToken()", +"03c41c04": "NewUpgradedAmount(uint256,uint256,address)", +"03c45305": "foundersSupply()", +"03c49580": "priceOfElement(uint256)", +"03c4d93a": "payWithGold(uint256)", +"03c5b1dc": "setPeriod(uint256,uint256)", +"03c5f26a": "PublicCheckGameStart()", +"03c5faf4": "s12(bytes1)", +"03c63869": "resumePlayer(address)", +"03c6c8f9": "TheExcelToken()", +"03c7bce1": "_addMinter(address)", +"03c7da39": "mintMarketingTokens()", +"03c83302": "distributeDividends()", +"03c94ca6": "tokenSoftCapReached()", +"03ca0a95": "performSetTokenControlInfo()", +"03ca0eed": "requireCustomerId()", +"03ca0f6c": "advisors(address)", +"03ca30e0": "changePreMine(address)", +"03ca558a": "read_i8()", +"03ca71d6": "setSecurityCheck(string)", +"03ca7bcc": "debug_last_approved()", +"03cba01e": "bonusEndTime250()", +"03cbcf57": "getBetAmountAtLayer(uint16)", +"03cc1e32": "addFundingRound(uint256,uint256,uint256,address[])", +"03cc5597": "wrestle()", +"03cc5e4d": "setTechnicalAdmin(address)", +"03cc7b85": "num_tokens_auctioned()", +"03cc8efb": "BethingWorldCup()", +"03cd3e47": "transferRecovery(address,address,uint256)", +"03cddb2c": "capitalAllocated()", +"03ce6c55": "roundUp(uint256,uint256)", +"03ce9c00": "AcceptsTokens(address)", +"03cf0678": "bigBang()", +"03cf4fd6": "expire(uint256,uint256,uint8,bytes32,bytes32,bytes32)", +"03cf678b": "vitToken()", +"03cfe12d": "benefactorsKeys()", +"03d08f3b": "nextLotteryTTWTokenId4()", +"03d0b7d2": "minimumFeePlusDividends()", +"03d0cecd": "getLx()", +"03d2107f": "getSender(bytes32)", +"03d22885": "scheduleCall(address,uint256,bytes4,uint256,uint256,uint8,uint256)", +"03d231b5": "signerFlag(address)", +"03d258c4": "set_prices(uint256)", +"03d285fd": "nameok(string)", +"03d2e963": "zint_now()", +"03d37d78": "showPoolNumber(address)", +"03d38296": "indexSuperInvestor(uint256)", +"03d3a6b7": "shutForETH(uint256)", +"03d41eb6": "reserveSupply()", +"03d499ef": "totalEthereumICOReceived()", +"03d4e98a": "getProposalVote(uint256,uint256,uint256)", +"03d50703": "challengeExit(bytes32[],bytes32[],uint256,uint256)", +"03d51a0c": "transfer_ether_to_owner(uint256)", +"03d5aa0c": "PigChain()", +"03d5f483": "founderTokenVesting()", +"03d699da": "YggdrashCrowd(address,address,address,uint256,uint256,uint256,uint256)", +"03d6b6b4": "EpigenCareCrowdsale(uint256,uint256,uint256,address,address,address)", +"03d6d7b6": "getCallMaxCost(bytes32)", +"03d7244f": "dice_game(uint256)", +"03d756cb": "ethealToken()", +"03d75937": "setUIntValue(string,uint256)", +"03d76547": "addressFin()", +"03d83c4d": "stopTge()", +"03d9d253": "unlock(uint256,address,address,bytes)", +"03da04d7": "BRN()", +"03da8902": "transfearDBOwner(address)", +"03dc0532": "getLableRecords(bytes32)", +"03dc6340": "AdminTokenSent(address,uint256)", +"03dcead2": "directDebitOf(address,address)", +"03dcf6bc": "truToken()", +"03dd5a18": "testSimpleArray()", +"03dd88f8": "getAssTotal()", +"03ddc104": "ownerClaimOverride(uint256)", +"03ddcae9": "checkTradeSignature(bytes32,uint256[],bytes32[])", +"03dec463": "getRentOwed(address)", +"03defdc5": "jobHunterWithdrawal()", +"03df1550": "ECR20HoneycombToken()", +"03df6106": "setNewReleasePeriod(address,uint256,uint256,uint256)", +"03e07b2f": "getMinRefEthPurchase()", +"03e1b3c6": "sellAllAmountBuyEth(address,address,uint256,address,uint256)", +"03e20503": "localManualEntry(bytes32,bytes32,uint256,uint256,address)", +"03e28366": "playerNum()", +"03e2b9f5": "syncDate()", +"03e337d1": "SEPCToken()", +"03e39113": "BeggarToken()", +"03e3b1ed": "applicationApproved(address,address)", +"03e3f677": "setICOStart(uint256)", +"03e3fa51": "editScores(uint256[],uint256[])", +"03e4d9f5": "getDayIndex(uint256)", +"03e55f1c": "lockEscrow(bytes32,address,uint256)", +"03e5affd": "add(string,int256,int256)", +"03e6c117": "getIcoAddrListByIcoRuleId(uint256,uint256)", +"03e7b4e9": "getEmission(uint256)", +"03e83b6a": "MyToken(uint256,string,string)", +"03e864fa": "TestableMarketContractOraclize(string,address,address,uint256[5],string,string)", +"03e8837c": "getUserCount(address)", +"03e9287a": "Tacoin(uint256,string,string)", +"03e93b2e": "changeStarbitWallet(address)", +"03e9598c": "updateClientVersion(bytes32)", +"03e96fe3": "getAllTickets()", +"03e9e609": "getRecord(uint256)", +"03ec1bbe": "tokenIssuedTotal()", +"03ed9d21": "setMaxContribution(uint256)", +"03edae57": "withdrawFounderFunds(uint256)", +"03edf914": "placeBet(uint256,uint8)", +"03ee8f08": "getCoeff(uint16)", +"03eea024": "issueTreasury(address,address)", +"03eeb40e": "AngelsvsRedSox419()", +"03ef03b4": "buyBulkMidGradeCar(address,uint256[],address)", +"03ef2a2c": "tryExecuteProposal(uint256,bytes)", +"03efb5c4": "book(address,uint256)", +"03f0cc64": "affiliateCodes(address)", +"03f10bff": "IDMONEY()", +"03f11878": "casino(uint256,uint256)", +"03f14886": "add_new_hash(string)", +"03f14be9": "updateEmployeeWallet(address,address,address)", +"03f14e96": "currentAirdrop()", +"03f166de": "calculateTransferValue(uint256,uint256)", +"03f17336": "BOPs(uint256)", +"03f187ea": "registerFee()", +"03f21bda": "privateOfferingTokens()", +"03f3b07f": "setUserScore(address,uint32)", +"03f3cea1": "requiresHardCap()", +"03f3e275": "getRatioList()", +"03f3e7c8": "setICOWeek4Bonus(uint256)", +"03f4864d": "XXXXXXXX05()", +"03f499b8": "refundState()", +"03f6477d": "setBonusSetter(address,address)", +"03f67e1b": "changelp2(address)", +"03f73f08": "start_ICO2(uint256)", +"03f744b0": "JessieEducationToken()", +"03f7d4ff": "BitpaintingStorage(uint8)", +"03f8008c": "getUserDAOsCount(address)", +"03f979c8": "saleEndTokenCreationRate()", +"03f9b456": "LockupTokensWithdrawn()", +"03f9c793": "invest(address)", +"03fad66e": "settokenCap(uint256)", +"03fb3f63": "currentMigrationSource()", +"03fba444": "_receiveBuyNextRank(address)", +"03fce7ef": "approveEscrow(uint256)", +"03fd8c65": "withdrawBalanceHashing(address,address,uint256)", +"03ff20a1": "crowdfundEndTime()", +"03ff5e73": "stopTime()", +"03ff8590": "random2(uint256,uint256)", +"03ff90f6": "minApproval()", +"03ffae3b": "FlightDelayDatabase(address)", +"040177b7": "previousDungeonId()", +"0401d897": "setVestingCliffDateTime(uint256)", +"04021ba8": "_increaseBalance(address,uint256)", +"04029f23": "_setBugFixVersion(string,uint32,bytes32,uint32)", +"040425d1": "protectedSupply()", +"040502e4": "EmmiumCoin()", +"04053d21": "checkCourse(uint256)", +"0405440c": "secureMode()", +"040622a9": "UNITPaymentGatewayList()", +"040677f1": "sentFirst()", +"0406870c": "SupplyManagementChainSolutions()", +"04072322": "GetEventData()", +"0407dc78": "medalBalanceOf(address)", +"04089c7d": "ALTnextCoin()", +"040a772e": "getUserDividends(address)", +"040c014b": "_changeName(string)", +"040c3a53": "maxRacers()", +"040cf020": "withdraw(bytes32,uint256)", +"040d54ce": "addFile(bytes32,string,uint256,string,string)", +"040d5e82": "partialFlip(bytes32)", +"040d70bd": "GetSeries0()", +"040da8f4": "jackpotBalance()", +"040e33f0": "SHRToken()", +"040e55f5": "getTransferCount()", +"040ea2f4": "ownerSetPriviledgedAddress(address)", +"040f9a5e": "transferRemainingTokens(address)", +"040fa051": "isPendingRegistration(address)", +"04106c8b": "startGeneration()", +"0410ec85": "randomReward(uint256[])", +"0410fac7": "adminRemoveTrustedCurrencyContract(address)", +"04115187": "initTime()", +"0411bca8": "getChallengeAnswerResult(uint256)", +"041257ef": "setWhitelistControllerAddress(address)", +"04126ce5": "getHashSubmissionEnd()", +"04143865": "dec_multiple()", +"04148f7e": "createGame(uint256,uint256,string,address)", +"04150694": "airdropBSupply()", +"04153ac9": "inflateActiveSupply(uint256)", +"04155727": "dcntrpls(uint256,uint256,uint256,uint256,uint256,bool)", +"04157752": "withdrawRed_(uint256,uint256)", +"0415bd13": "create(uint256,uint256,int256,address)", +"04165443": "gatherAllOldBalanceOf(address[])", +"0416c10c": "_getBytes(address,bytes32)", +"04186c57": "getPermissionsProvider()", +"0418945a": "addStablecoin(address)", +"0418ac09": "unFreezeTransfer()", +"04194636": "bulkTokenSend(address[],uint256[])", +"04198675": "setHitPrice(uint256)", +"0419c814": "isExistedOwner(address)", +"0419eca5": "createChild(uint256)", +"041abd9f": "timestampEnd()", +"041ae880": "funder()", +"041b1406": "checkPoDs(address[])", +"041b8c3e": "group(address,uint256)", +"041c3ade": "punkIndexToAddress()", +"041d0c0b": "MyTokenLoad(uint256,string,uint8,string,address)", +"041d15c9": "getPurchaseTimestamp(uint32)", +"041d40c1": "buyOrders(bytes32)", +"041dad49": "incrementpostId()", +"041dd0f9": "ValueToken()", +"041dd3f6": "testControlCreateWithParentsParentNotInUse()", +"041e3929": "getInvitationCreatedOn(address,uint256)", +"041e6b8b": "rejectUpgrades()", +"041f173f": "blacklist(address[])", +"041fa8aa": "times9()", +"041fe13d": "onEtherandomSeed(bytes32,bytes32)", +"04213a59": "setServiceDuration(uint256)", +"0421a94c": "sendSpecialTasterPackage(address,uint256)", +"042228db": "adminUpdateArrayInvite(uint256,uint256,address,address)", +"0422ddf3": "isGamePaused()", +"04239743": "lastGrantedIndex()", +"0424b6fe": "ContentChanged(bytes32,bytes32)", +"0424d979": "removeDepositCreator(address)", +"0425b5e9": "initialLockAddress(address)", +"0425c357": "submitVote(uint256,bytes32,bytes)", +"0425c4bf": "updateProduct(address,string,string,uint256,string,bool)", +"0425ccba": "DoubleETH()", +"0425e6ff": "SEXNTestToken()", +"04267892": "koth()", +"04269bc2": "ICO_SUPPLY()", +"0426c697": "changePayoutAddress(address)", +"0426dcef": "unlockBalance(address,uint256)", +"04275375": "MCToken()", +"0428c6aa": "earlyBirds(uint256)", +"0428ca27": "WalletAddressUpdated(address)", +"04293236": "m_owner80()", +"0429b880": "confirmationPeriod()", +"0429b9ca": "totalEthAmount()", +"042abdf8": "PRE_ICO_MIN_CAP()", +"042ae62b": "killAborted()", +"042b5fed": "placeBet(bytes32)", +"042c71f5": "DevsmartCoinFour()", +"042cb150": "batchSend(uint256,address[])", +"042d65ab": "getTokenAwarded()", +"042e58c8": "receiveResults(string,uint256)", +"042e9a43": "propose(bytes32,string)", +"042f3b34": "DesafioStone()", +"04304b55": "getUSDEth()", +"04306d69": "MOOSToken()", +"0430e405": "gameStopped()", +"043106c0": "deleteAddressValue(bytes32)", +"043122bb": "minimumParticipation()", +"04318794": "giveTimeToDemoc(bytes32,uint256,bytes32)", +"0431dd86": "TokenNedCoin(uint256,string,uint8,string)", +"0432ff56": "START_WEEK_4()", +"043331ee": "addOnCount()", +"04336615": "hashLoop(uint256,bytes32)", +"04338def": "maxAmountPreICO()", +"04339140": "setCloneFeePercentage(uint256)", +"04339582": "buyAndTransfer(uint256,address,address,bytes,uint8)", +"04343722": "addUsers(address)", +"0434a44d": "codeSize()", +"0434e5a6": "changeWalletForETH(address)", +"0434fe0b": "heal()", +"043531b1": "setFeeDivisor(uint256)", +"0435a745": "stat()", +"04362c2d": "getEsgoTXCount()", +"043728b4": "initBet(bool)", +"043753ba": "makeDecision(uint256,bool)", +"043799e3": "inquire_domain_id(uint16,uint16)", +"0438ebce": "getPlayerBetForPlayRound(address,uint256)", +"043996c2": "setUseAmountBasedBonus(bool)", +"0439f7d4": "getProviderSupply(uint256,uint256,uint256)", +"043aea8b": "CrypthubtTokenTest()", +"043b743f": "investor_getShortInfo(address)", +"043bb5e7": "getIdentities(address[])", +"043c8816": "INM()", +"043cf01a": "addCourse(string,uint256,uint256,uint256,string)", +"043cf343": "CreditIDENTITY(address)", +"043d0258": "changePriceLimits(uint256,uint256)", +"043d5f1a": "ENCSToken(uint256,string,uint8,string)", +"043d9aaa": "verifiersPerShard()", +"043da739": "getNextBid()", +"043eabd0": "RUVI()", +"0440187e": "hostingProfitAddress()", +"04403b30": "TokenSaleSucceed()", +"0440c8e4": "_unpackRarityValue(uint256)", +"044166ec": "PollManagedFund(address,address,address,address,address,address,address,address,address[])", +"044215c6": "token(uint256)", +"044337ca": "setPortfolio(address)", +"04433bbc": "getContractAddress(string)", +"044431f0": "setRefundEnabled(bool)", +"0444c5db": "SSPRegistryReplaced(address,address)", +"0445154c": "PRIVATESALE_USD_PER_MSENC()", +"044553ae": "configureBoard(address)", +"04455e95": "testIsList(bytes)", +"04461f4d": "XaurumAmountMelted()", +"0446e187": "buyDonation(address,uint8)", +"04474181": "JixoCoin(uint256,string,uint8,string)", +"0448e936": "setSite(string)", +"0448f79f": "addOptionChain(uint256,string,uint256,uint256,bytes,address,int256[])", +"0449aa40": "allowedToBeSold()", +"044a3038": "_changeResolverAllowances(string,address[],uint256[])", +"044a5f97": "mgmtDistribute()", +"044aed7c": "removeEmployee(address,uint256)", +"044b1b02": "addProblem(string,string,string,string,string)", +"044bf6c2": "getSpinnerData(address,uint256)", +"044c1d4d": "clientVersion()", +"044c9366": "privateCrowdsale(address,uint256)", +"044c96e4": "startGame(string,string)", +"044ce308": "refundBuyer(uint256,uint256)", +"044d0b06": "oraclize_query(string,string[2])", +"044ec699": "get_mail(uint256)", +"044f19bd": "InfiniteCorridor()", +"044f53ee": "OPC(string,string,address)", +"044f9ac8": "findThroneCalled(bytes)", +"04509918": "scheduleCall(address)", +"04514185": "ShortBlog(string)", +"04517225": "transferlock()", +"04520116": "centsPerEther()", +"045236b4": "getChainyData(string)", +"0452396c": "subtrInvestorBalance(address,uint256)", +"04532035": "settleEth(address,uint32,uint32)", +"0453a7d2": "computeBonus()", +"0453e3b1": "ITIX()", +"04549d6f": "presaleStarted()", +"04550e70": "MyTestToken2()", +"04554443": "lockDuration()", +"045585a4": "priceList(uint256)", +"0456860a": "acceptAtCommunity(address,uint256)", +"04571211": "setTokenReward(address,address,uint256)", +"04578f90": "JTC(uint256,string,string)", +"0457d76b": "Mesa(bytes32[],uint256,address)", +"045820b3": "Player()", +"045894ab": "getCreate()", +"0458996a": "CBTSToken()", +"04590a28": "EtherWithdrawn(uint256)", +"04599012": "balanceToken(address)", +"045a1796": "upgraderSet()", +"045aceb9": "useResolver(string)", +"045b1a0c": "isBreakingInvestorCap(address,uint256)", +"045b7dca": "mintSupply()", +"045b9c72": "START_TIME_PRESALE()", +"045c123a": "sponsorDAI(uint256,uint256)", +"045c6ce0": "voteForProposal(uint256)", +"045cc8ec": "_createZodiacWithTime(uint256,uint256,uint256,uint256,address,uint256,uint256,uint256)", +"045ccf7b": "byte64ToString(bytes1[64])", +"045d0389": "exchange(address,uint256)", +"045d2ad9": "upgrades()", +"045d4503": "TeamDeleted(uint256,uint256[])", +"045d465f": "setDataFactory(address)", +"045d46c2": "getBalances(address,address)", +"045e240f": "getAvailableTokensToWithdraw()", +"045e7dd7": "ContractEdited(string,address)", +"045ea88a": "fishySalmonToken()", +"045eb3b5": "expLimited(int128,int256,int256)", +"045ec563": "rndInc_()", +"045eea7d": "changeSelfName(string)", +"045f2593": "getRoot2(uint256)", +"045f7850": "airDrop(address,uint256)", +"045f8aad": "CONUNToken(uint256,string,uint8,string)", +"045f91ea": "getCurrentWallet()", +"045f955b": "buyPets(uint256,uint256)", +"045ff49a": "TIER2END()", +"0460b206": "Bxcoin()", +"046111e9": "addVip(bytes32,string)", +"04612d20": "minionAdd(address)", +"0461ac58": "dteamVaultAddr3()", +"04638e1a": "getBalanceOf(address,address,address)", +"0463cd73": "getSuperManager()", +"0463e4af": "releaseDividendsRights_(address,uint256)", +"0464f4b2": "InitialPriceEnable()", +"0464f8d0": "getCatsCount()", +"04651a1e": "firstRoundICOEnd()", +"0465832e": "modifyTransFee(uint256)", +"04658ad8": "NonIssueDeposits()", +"04659819": "capUsd()", +"0465a76d": "airdrop_cnt()", +"0466450e": "getUserByAddress(address,address)", +"046672cc": "batchTransfer(bytes32[],uint64)", +"0466c7ab": "executeComputation()", +"04670c9d": "nextStage(uint256,uint256)", +"04673368": "getCurrentPrice(uint256,uint256)", +"04676af4": "getCompte_7()", +"0467c3ff": "ThirdBonus()", +"04684ba3": "convertTokens(address,address,uint256,uint256)", +"0469756a": "MintAuthority(int256,address)", +"04699a72": "tipbot()", +"0469d644": "storeSecretVote(bytes32,uint256)", +"046a3d91": "distributePrizze(uint256)", +"046ae3c2": "YourPyramid()", +"046c472f": "IOU()", +"046c82e4": "GraceFund()", +"046ce030": "isFactoryApproved(address)", +"046d30c7": "_random(uint256)", +"046d5c53": "setMintAmountApproval(address,address,uint256)", +"046dc166": "setSignerAddress(address)", +"046e85f9": "getLastPendingTransaction()", +"046f7da2": "resume()", +"04706fdf": "giveContributionsBackProfitBugged()", +"047087cc": "getTotalTokenSupply()", +"04710a23": "toSgaAmount(uint256)", +"04719030": "manualSendTokens(address,uint256)", +"04729a8d": "tokensToEthereumAtSupply_(uint256,uint256)", +"0472a3bf": "doCrowdsaleMinting(address,uint256,uint256)", +"0472f549": "ran()", +"0472f72c": "_allocation(address,uint256)", +"0473e09c": "setConfigUint(bytes,uint256)", +"047408aa": "getAngelByIndex(address,uint256)", +"0474b484": "AllyICO()", +"0474d4a4": "isInitialAllocated()", +"04751333": "getRevForecast()", +"047564b7": "revokeValidator(address)", +"0477d647": "setSalary(uint256,uint256,uint256,uint256)", +"04780570": "ERC223Token_STB()", +"04787d83": "winBidDekla(address,address,uint256,uint256)", +"047956cf": "assign(address,uint256,bool)", +"0479fcd0": "setPopNameOriginal(uint256,string)", +"047a7ef1": "transferrable()", +"047a8dcb": "JetwingToken(address)", +"047ba641": "LowerStartingPrice(uint256)", +"047c738e": "wdivfloor(uint128,uint128)", +"047cfed9": "hasOwnership(uint256)", +"047d6649": "getUpdateByID(uint256)", +"047da93f": "testInvariantOverflow()", +"047de1f3": "drawerFee()", +"047e2b27": "setDataStorage(address)", +"047f9651": "make(uint256,uint256[4])", +"047f993d": "_vote(bytes32,uint8)", +"047fc9aa": "supply()", +"047fe8b3": "getUnsoldTokensBack()", +"047febbe": "admin_renewLockedAddress(address,address,uint256)", +"04803c2a": "addSales(uint16,uint128,uint16,uint16,uint64,uint64,uint16,uint8)", +"04804ee8": "sell(string,uint256,uint256)", +"0480c975": "setUnicornContract(address)", +"0480e58b": "maximumSupply()", +"04812aaf": "moveAccountData(address[],bytes32[],uint256[])", +"0481559b": "getLockDataFromMerkleTree(bytes,uint256)", +"04819507": "ICO_START4()", +"0481cb1b": "tokensAlreadyClaimed(bytes32,address)", +"048259e6": "UTCToken()", +"0482cfa8": "investorDividends(address)", +"04830ddd": "getVotersAt(uint256,uint256,uint256)", +"0483a7f6": "lockedBalances(address)", +"0484c7cf": "AppSupply(address,uint256)", +"0485066e": "addReading(uint8,uint256,uint256)", +"04858fef": "StartQuiz(string,string)", +"04859ceb": "afterTime(uint256)", +"048641be": "updateUserInvestBalance()", +"0486529b": "boardMemberApply(uint256)", +"04865327": "PlayerBet(address,uint256,uint256)", +"04869083": "auctionCreated(uint256,address,uint128,uint128,uint64)", +"0487b7e9": "Unity3d()", +"0487eed2": "restrictionsAllow(uint64,uint8)", +"0488781a": "teamOwnerOfPlayer(uint256)", +"0488dbfb": "getConfirmRefund(address,address,uint256)", +"048911a6": "createRandomZombie_ZOB_smallpack()", +"048926ac": "updateMaxPhase1(uint256)", +"04892c9f": "BASE_MIN_CONTRIBUTION()", +"048957d8": "sideBetPayToken(bytes32)", +"048986ae": "activityCore()", +"0489882e": "totalAdminsMapping()", +"0489fa70": "removePermittedContracts(address[])", +"048a5fed": "getSelfBalance()", +"048ae1bb": "addAssetPartOwner(bytes32,address)", +"048b0bcc": "addCustomerNReqACC(address,address,address)", +"048b3918": "messageNumber()", +"048bbc72": "CIR_SUPPLY()", +"048c35ca": "debug_is_recipient()", +"048ca698": "trackTotalVolume(address,uint256,uint256)", +"048cb8e0": "CarlosMatos()", +"048cc4a2": "BurnToken(address,address,uint256)", +"048cf8ed": "serviceDecreaseBalance(address,uint256)", +"048de56d": "setName(bytes2)", +"048dec38": "changeMarketingAddress(address)", +"048e2e94": "getAccountSize(address,uint256)", +"048e8c3a": "FidgetSpinner(uint256,uint256)", +"048e927b": "Checked(string,bool,uint256,bool,uint256)", +"048eb854": "_sortTopQuestions()", +"048f06f2": "setRoot(uint256,bytes32)", +"04903592": "withdrawAirdropTokens()", +"04904105": "setMiniPoolEdit_9(string)", +"0490540b": "Parameterizer(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"0490c71c": "unclaimedDividends(address)", +"0491eda0": "isCertainProduct(uint256,address,uint256,uint256,uint256,bool)", +"0492600e": "Issue(address,address,uint256,string)", +"04937cf9": "DoremiXToken()", +"0494630f": "oraclize_query(uint256,string,string[4],uint256)", +"04950f45": "KWHForGas()", +"049540c5": "structurePreIco(uint256)", +"0495cad9": "motionPasses(uint256)", +"0496e9ae": "triggerRequireError()", +"0496ee77": "checkPosition(address,uint256)", +"049766a8": "CleariumToken()", +"049878f3": "join(uint256)", +"04990162": "newChain(address[])", +"04994883": "ustAddress()", +"049948b0": "getMyGrapes()", +"0499ed13": "TOKEN_PRICE_WEI()", +"049a2dd1": "claimPartnerTokens()", +"049abf89": "queryUserContractCount(address)", +"049ae734": "scheduleCall(address,bytes4,uint256,uint256,uint8)", +"049b7852": "getElevations()", +"049c9bf2": "addExchangeAccount(address)", +"049cac16": "tokensUnvested()", +"049cc8b1": "soldForSecond()", +"049e63ee": "defaultClaimPercentage()", +"049eb289": "submitBuyOrder(bytes32,uint256,uint256)", +"049efcc7": "startReleasing()", +"049fb520": "countTickets()", +"04a077a4": "MyPasswordHint()", +"04a0c67e": "EagorNetwork()", +"04a1c63c": "token_a_amount()", +"04a1eb6b": "lastBlock_f16Hash_uint256()", +"04a23be0": "isAddressInWhiteList(string,address)", +"04a2b2c2": "testOwnerCanBreach()", +"04a2eaa5": "getTimeBonusPercent(uint256)", +"04a3693c": "applyFee(address,uint256,uint256)", +"04a373cc": "s20(bytes1)", +"04a3c21f": "maybeNewRound()", +"04a3ddd2": "_addToValueHeld(address,uint256)", +"04a48c27": "setActivityCoreAddress(address,address)", +"04a4a0d4": "getPriceMoney()", +"04a4a0ec": "TOTAL_XB_TOKEN_FOR_PRE_SALE()", +"04a4b776": "updateOpeningTime(uint256)", +"04a5288a": "stepcode()", +"04a6021d": "getByTypeNameVersion(string,string,string)", +"04a7137e": "controlledMint(address,uint256)", +"04a782ee": "addRecordByAdmin(bytes32,address,address,string,string)", +"04a79e9a": "spendDeposit(address,address,uint256)", +"04a7ca0e": "BonusUpdated(uint256)", +"04a7ff18": "totalNum()", +"04a82adf": "privateReservedUFT()", +"04a84938": "avaliableSupply()", +"04ac3b80": "addReceivedTrade(address,bytes32)", +"04ac75b0": "withdrawMulti(uint256,address[])", +"04aca4bc": "getClout(address)", +"04af7a20": "setDividendAndPayOut(uint32,uint32,uint32)", +"04afd2ce": "Multisended(uint256,address)", +"04b02ed6": "times_()", +"04b07a5e": "removeUpdater(address)", +"04b1142c": "getGuessCount(address)", +"04b1af75": "buy20()", +"04b1c6f0": "ICO_CAP()", +"04b2bf99": "stateControl()", +"04b370ab": "icoOver4()", +"04b43c5a": "withdrawZOB(uint256)", +"04b47e21": "isSignedWithEnc(uint16)", +"04b4e7e5": "awardsReservations()", +"04b5723d": "disableNewStakes()", +"04b5b5b6": "pointToToken(uint256,address,uint256)", +"04b64260": "tmpShuffleSeed(uint256,uint256)", +"04b65e74": "checkSTAGE()", +"04b69fa0": "jockeyNotForSale(uint256)", +"04b6ae61": "failedVotingCount()", +"04b6d39e": "_transferCroupier(address)", +"04b70576": "resetAgent(address)", +"04b7dcde": "hashData(string)", +"04b8ca98": "MAYTotalSupply()", +"04b92b7d": "overdraftAllocation()", +"04b94ec5": "MyToken30(uint256,string,string)", +"04badade": "get_hub_addr()", +"04bb1e3d": "updateActive(uint256,bool)", +"04bb754c": "TradeFinancing()", +"04bb89d5": "saveNick(string)", +"04bbc255": "isPricingStrategy()", +"04bd05d5": "getPeriodicalPnL()", +"04bd85f0": "getCapTab(uint256)", +"04be2f50": "isInvalid()", +"04bf1ee2": "JtoA(uint256[3])", +"04bf2a7f": "getScriptExecutor(bytes)", +"04c07569": "getBlock(uint256)", +"04c08fbd": "borrowFunds(uint256)", +"04c181f5": "beneficiars(address)", +"04c2a0ae": "DonateToLosers()", +"04c2a4a0": "computeKeyConstant(uint256)", +"04c313f4": "setAirdropGameInterface(address)", +"04c402f4": "set(int256,int256)", +"04c49f2c": "setFeePeriodDuration(uint256)", +"04c64e25": "revealMyVote(address,bytes32,bytes32,uint256,uint256)", +"04c6a9c5": "startIcoForOptionsHolders()", +"04c6ff7c": "devTeamTokenAddress()", +"04c76899": "sellerApprove(uint256,bytes)", +"04c76af0": "withdrawAdmin()", +"04c80c3c": "TOKEN_HODL_6M()", +"04c8384d": "trivialThreshold()", +"04c97ada": "setThirdRoundPricing(uint256)", +"04c98a2a": "validatePurchase()", +"04c98b2b": "startPresale()", +"04ca2775": "saleActive(uint256)", +"04caa6dd": "pauseReason()", +"04cb17ad": "returnPeriodExpired()", +"04cbc791": "getSellerOption()", +"04cc734b": "VoxelTransferred(address,uint8,uint8,uint8)", +"04ccf60e": "WrapperLockEth(string,string,uint256,address)", +"04cd1819": "disableVoting()", +"04cd5294": "getRefundAmount(uint256)", +"04ce1a61": "tokensWithdrawal(address,uint256)", +"04cf447d": "estimatesellvalue(uint256)", +"04d092c7": "claimPoints()", +"04d0a647": "getWallet(address)", +"04d0ac48": "tokensPending()", +"04d0c98a": "distribute10MTI(address[])", +"04d0fefe": "HoneyPot()", +"04d10f1c": "isValidChainyJson(string)", +"04d1290b": "getAlamat()", +"04d16482": "strConcat4(string,string,string,string)", +"04d1809c": "validateJoinSplit()", +"04d1b108": "_computeOwnerCut(uint128)", +"04d2cdbf": "setAcceptable(address)", +"04d2dec6": "getWalletAddress()", +"04d332a2": "setRefereeRewards(uint256[])", +"04d41474": "totalNormalContributorIdsAllocated()", +"04d58b3f": "MrwToken()", +"04d5c2c5": "toEGR(uint256)", +"04d6878f": "closeMicroWallet(uint256)", +"04d68a2b": "transferMoreThanBalanceTest(address)", +"04d69a11": "SoldToken(address,uint256,bytes32)", +"04d6db05": "startSale(address,uint256,uint256,uint256,uint256)", +"04d742dc": "startSale(uint256,uint256,uint256)", +"04d84108": "SWAP()", +"04d88bce": "DDJETH()", +"04d91c6a": "testFail()", +"04dbd2d3": "LogInvestorProfit(address,uint256)", +"04dcad85": "testDifferentTokenPrice()", +"04dcc44a": "getTip(address,bytes32)", +"04dd2dea": "getCardDivShare(uint256)", +"04dd69fa": "getGenerationIdForCall(address)", +"04de40ea": "AnnoToken()", +"04de76cf": "VisualChain()", +"04deaeb5": "retrieveEth(uint256,address)", +"04dee65f": "contractBatchTransfer(address[],uint256[])", +"04def102": "getRemainReleaseTimeOfStage(address,uint256)", +"04df0a1d": "kudosByMember()", +"04df48ef": "ICO_LEVEL_4()", +"04dfe14e": "LandmarkCoinTestF()", +"04e15de5": "issues(uint256)", +"04e1805a": "setFreezeForAngel(uint256,address,uint256)", +"04e1826c": "getNumTransactions(address,address,uint256)", +"04e262b8": "wlStartBlock()", +"04e5a069": "registerUBetCheck(address,string,string,string,string,string,uint256,string,string,int256,uint256)", +"04e639b6": "fetchSlot(uint256,uint256)", +"04e6a9a1": "teamLock(address,uint256)", +"04e6adf8": "serHoldTime(address,address,uint256)", +"04e75fda": "Contribution(uint256,address)", +"04e78a30": "stakingMintAmount()", +"04e7dfcf": "getAssetRaised(address)", +"04e80e90": "getMasterCopy()", +"04e86e15": "calctime(uint256)", +"04e88f2d": "SayaToken(uint256)", +"04e98568": "withdrawBalanceCut(uint256)", +"04ea23bf": "FLUXBlockToken()", +"04ea4a57": "getDisputedPayoutDistributionHash()", +"04eab1e1": "gvpe_per_Keos()", +"04eb7d83": "setFirstPeriodEndDate(uint256)", +"04ebb1d9": "commonWithdraw(address,address,uint256,uint256)", +"04ebfc52": "userCount_()", +"04ec70a7": "determineAttackingOrDefendingOutcomeForAttributes(uint256,uint256,uint256,uint256,uint256)", +"04ecdaac": "rateSecondRound()", +"04ed02f6": "getCards(uint256)", +"04ed3f6a": "canStartSale2()", +"04ed6fbc": "minCDTToParticipate()", +"04edad4d": "YouLose(address,uint256)", +"04ee54d2": "revokeInitiator(address)", +"04ee9748": "storeWinnerShare()", +"04ef1353": "setTokenWithoutFee(address,bool)", +"04ef161b": "findSeed(address)", +"04efa227": "feeMakeExporter()", +"04f016c9": "transferMulti(address[],uint256)", +"04f03b6a": "getSomeVar()", +"04f041b5": "BtcEthRateChange(uint256)", +"04f05f91": "joltToken()", +"04f08b55": "getPolicy(uint8)", +"04f08eec": "PayEth(address,uint256)", +"04f0aa4e": "setServiceAgent(address)", +"04f13e40": "HashLand()", +"04f14090": "setBlacklist(address,bool,string)", +"04f17b11": "PriceChanged(uint256,address)", +"04f182f4": "icoPhase1End()", +"04f1e4e2": "tradeEtherDelta(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,bool)", +"04f24897": "PlanetagroExchange(address)", +"04f30b37": "getFutureTransIdxByAddress(address)", +"04f31a47": "confirmICOSpec()", +"04f342f6": "_addToAging(address,address,uint256,uint256)", +"04f3bcec": "resolver()", +"04f49a3a": "addressStorage(bytes32)", +"04f4d425": "toEthFunction()", +"04f4f7ab": "KYRO()", +"04f5222c": "setEthMinContribution(uint256)", +"04f53231": "SendEth()", +"04f65288": "AK47Coin()", +"04f65590": "preSaleWeiRaised()", +"04f68d49": "dataSourceGetFinals()", +"04f6aa30": "forwardETHtoSTCcontract(uint256)", +"04f74b59": "make(address[],uint256[],address,bool)", +"04f7a69d": "baseSummonPrice()", +"04f7e87c": "issueBounty(address,uint256)", +"04f80977": "setBattleContract(address,address)", +"04f88d71": "testFailHardLimit()", +"04f8aa9b": "IoTeXNetwork(uint256)", +"04f92405": "icoTokensLeft()", +"04f9d030": "test_interface_call()", +"04fad28d": "instanceId()", +"04fb82cc": "_deliverTokens(address,uint256,uint256,uint256,address)", +"04fb9e81": "closeRequested()", +"04fc11d5": "getActual()", +"04fc7c6d": "updateJoinedCrowdsalesMultiple(address[])", +"04fcadf1": "totalZTHWagered()", +"04fd295c": "WOLF2()", +"04fd9f78": "variationsOfOwner(address)", +"04fda0d8": "_trade(address,uint256,address,uint256,address,uint256,bytes32)", +"04fe947c": "mapToNewRange(uint256,uint256,uint256)", +"04ffb5b9": "registerToken(address,string,string,uint256)", +"05009f0a": "_createBid(address,uint256,address,bytes32,bytes32,uint256,uint256)", +"0500de3e": "interestResolution(uint8,uint8,uint8,bool)", +"0500fe3e": "getRegionCurrentPixelPrice(uint256)", +"05010105": "stakeRequired()", +"05015e79": "coldAdmin()", +"05018d91": "objectPants()", +"0501b79f": "getBlocktime()", +"0501d556": "setEmergency(bool)", +"05021ce9": "_trade(address,uint256,address,uint256,address,uint256)", +"050225ea": "giveaway(address,uint256)", +"05026317": "bitcoinSaleRate()", +"0502ca6b": "addTime(uint256)", +"050394ec": "minGasPriceForDrawing()", +"0503a3bb": "transferCharity(address)", +"050414bb": "addWhitelist(address[],uint256[])", +"0505140c": "totalSupplyWithDecimals()", +"05062247": "blocknumber()", +"050642f2": "exchangeTokenRate()", +"0506689a": "omegaPerEther()", +"050895ff": "backEndOperator()", +"0508ed90": "contribute(uint256,address,address,uint256)", +"050906ea": "_computeDamage(uint256,uint256,uint8)", +"050a2eb4": "diceRollAddress()", +"050a3250": "ArithLib()", +"050b8c66": "drainStrayTokens(address,uint256)", +"050c09ee": "founderWithdraw(uint256)", +"050c0fd6": "AmmbrToken()", +"050c8803": "getAmountFida(uint256)", +"050c931d": "paymentNumber()", +"050d6a15": "setSellPrice()", +"050df9f7": "PoolJoined(uint8,address,uint256,uint256)", +"050e25a0": "getHash(address,uint256,address,uint256,uint256,uint256)", +"050eb8c0": "BuyableCourt(address[],uint256[])", +"050f2f3e": "updateBools(bytes32[],bool[])", +"051064c6": "lighthouseFee()", +"051097ef": "addProposal(uint256,string)", +"0510e186": "getSncTokenAddress()", +"05111c1e": "getItemHolder(uint256)", +"05117619": "endVesting(address,address,address,address)", +"05117e0d": "validateTokenPurchase(address,int256[],int256[])", +"0511a431": "addOns(uint16)", +"05120ba6": "getTokensReleased()", +"05128716": "sale(string)", +"0513fc8b": "onBurn(uint256)", +"0514be3b": "ownedTemplates()", +"0514c275": "REALPlaceHolder(address,address,address)", +"05160860": "initialDayWithdrawCount(uint256)", +"0516af06": "getMonsterId(uint256)", +"0516c9f0": "frozenToken(address,uint256)", +"0517431e": "_teamSupply()", +"05175786": "announceWinnerManually(uint256)", +"051847d5": "childTokenByIndex(address,uint256,uint256)", +"0518afdc": "tokenToReward(uint256)", +"0519adad": "largestLoaner()", +"0519b873": "heroLottery()", +"0519bb83": "getVoteStatus(uint256)", +"0519ce79": "cfoAddress()", +"051a2664": "nameOf(uint256)", +"051a65dd": "deal_cancel_rate()", +"051a86cc": "mintApprove(uint256,int256)", +"051b044f": "_sell(uint256,address)", +"051b4e6c": "getSurveyInfo(bytes32)", +"051ba270": "getLogCancelArguments()", +"051c4ab6": "AddPlayer(uint8,address)", +"051c8a8d": "tradeUserAsset(address,address,address,address,uint256,uint256,uint256)", +"051cb630": "mintRandomCards(address,uint8,uint8)", +"051d9955": "confirmCustodianChangeProxy(bytes32)", +"051e5c45": "fiatPerEth()", +"051f4f6f": "transferAll()", +"05204231": "setPermission(address,address,uint8)", +"0520ed4a": "LYT(uint256,string,string)", +"05215b2f": "createStandardToken(uint256)", +"0522345a": "blackListFreezeTime()", +"052369a6": "submitLocation(uint256,uint8)", +"052424f5": "recordPromoterBonus(address,uint256)", +"052534e7": "VerificationEvent(address,address,uint32)", +"0525ca77": "packParams(address,uint16,uint32)", +"0526179e": "getSoilTempControlLimits(bytes32)", +"05261aea": "finalize(uint256)", +"0527da64": "_openGamePlayNos(uint256[])", +"0528bb57": "isSubscriptionProduct(uint256)", +"05297781": "MintToken(uint256)", +"05298d37": "setWhiteListERC20(address)", +"0529be17": "circulateTokensForSale(uint256)", +"0529de04": "getCertificateExpires()", +"052a076f": "disablePresale(bool)", +"052a6849": "tokenStartPrice()", +"052a829c": "notSoldTokens()", +"052ab49c": "bytesToUint1(bytes)", +"052b2aa7": "getRegistrants()", +"052b81c7": "releaseBadges()", +"052ca699": "end_()", +"052d5707": "JYToken()", +"052d9e7e": "setWhitelistEnabled(bool)", +"052deec5": "investorsIter(uint256)", +"052f1a7a": "BGXToken()", +"052f6557": "setExtraLimit(uint256)", +"052f72d7": "getIsGlobalOperator(address)", +"052f7d11": "freezeAccountSend(address,bool)", +"053011b7": "authenticate(uint256,uint256,uint256)", +"0530abf0": "SwingTradeToken()", +"0533073c": "publishingOwner()", +"0533f57b": "RAISED_AMOUNT()", +"0534ab04": "setCapsMerkleRoot(bytes32)", +"0535020d": "payTokens(uint256)", +"05354bed": "etherPricesAreClose(uint256,uint256)", +"05357c69": "isAssigned(uint256,address)", +"0535ec77": "initialDistributionDone()", +"05365bb0": "presale1()", +"0537665d": "setOutcome()", +"053902f6": "DTCC_ILOW_4()", +"0539272a": "startDay()", +"05398302": "destroyFrom(address)", +"05398d45": "setNewMiner(address)", +"0539c6d6": "num_squares()", +"0539eba9": "setAllowBuying(bool)", +"053abd3c": "createShareToken(uint8)", +"053ae2ca": "getHairColorValue(uint256)", +"053b8d2f": "deleteBackgroundImage(uint256)", +"053c351b": "oraclize_getPrice(string)", +"053c5d59": "e_Purchase(address,uint256)", +"053db3a9": "testSetPresaleTokens()", +"053e3169": "openSaleStartTime()", +"053e3253": "window3EndTime()", +"053e71a6": "getTotalNumberOfTokensForWinningOption(uint256)", +"053f14da": "lastPrice()", +"053f598a": "policyActiveNum()", +"053f7492": "minimumPriceInDailyAuction()", +"05401284": "debundle(uint256,address,address)", +"0541b0f8": "acceptPayment(bytes8)", +"0542b61b": "snt_claimed()", +"05433a26": "GetNumbersFromHash(bytes)", +"054348d6": "icoIsOver()", +"0544587f": "getCRYPTON_CUT()", +"054550f3": "assertEq8(bytes8,bytes8,bytes32)", +"05459f42": "WeeklyLotteryB(address)", +"0545a03b": "getGroupManagement(uint256)", +"0545f8ba": "changeExchangeAdmin(address)", +"054604a2": "miniToken()", +"05468c26": "addToBond(address,uint256)", +"0546a746": "restrictedTokensOf(address)", +"054726cb": "MNTOKEN()", +"0547bf4d": "DEFROST_MONTHLY_PERCENT_OWNER()", +"054909aa": "_addNewOwnerHoldingsToToken(address,uint256,uint256)", +"0549f150": "getAdministrator(address)", +"054a8c02": "getGirl(uint256)", +"054a9f11": "shopGloves()", +"054ba658": "delete_key(uint256,uint256)", +"054baaf2": "jan()", +"054be0b7": "setIssuanceRatio(uint256)", +"054c3c71": "getBetsOnTimestamp(uint256)", +"054d2a7e": "ChuCunLingAIGO(uint256,string,uint8,string)", +"054dcbb5": "AdvisorsTokensHolder(address,address,address)", +"054ded2b": "registrazione_candidato(string)", +"054e9507": "lastEventId()", +"054f268e": "getDCategoriesN(bytes32)", +"054f381b": "entrepreneur()", +"054f7d9c": "frozen()", +"054fce82": "ZipperWithdrawalRight(address)", +"05502a62": "BONUS_PRESALE()", +"0550f92f": "setMintAddress(int256,address)", +"05514a3e": "winBonusArray(uint256)", +"05529d94": "addMultipleParticipants(address[])", +"0552ce3e": "MonthToken()", +"05533ce1": "setSettings(address,uint256)", +"0553b805": "transferStorage(address)", +"0553e156": "finalize(address,uint256)", +"0553fd5b": "incSupply(uint256)", +"05540534": "setMultisigAddress(address)", +"0554bb48": "depositToLock(bytes32)", +"0556369e": "tokenToReserve()", +"055680f0": "purchaseCounter()", +"0556a66f": "deliverPresale(address,uint256)", +"0556fcd0": "setIcoFinish(uint256)", +"0557b2b0": "getApprovedTransfer(uint256)", +"0557df99": "FundingRulesSet(address,uint256,uint256,uint256,uint256)", +"0558171d": "maxCharId()", +"05597d88": "setOwnerCut(uint8)", +"0559c114": "removeSellOrder(uint256)", +"055a7341": "USEAddr()", +"055ad42e": "currentPhase()", +"055bb725": "_approveForSale(address,address,uint256)", +"055c7c96": "sliceBytes32Arr(bytes32[],bytes32,uint256,uint256)", +"055cbb3d": "CalculatePayout(bytes32,uint256,uint256,uint8)", +"055cdee1": "UpdateBetOnTeams(string,address,uint256)", +"055cff88": "AlarmxToken()", +"055e0e07": "Bela()", +"055e6d8b": "playGameCheckBid(uint256)", +"055ee253": "claim_reward()", +"0560ff44": "tokenMetadata(uint256,string)", +"056129a6": "TravelShare()", +"0561d562": "GoldiamToken()", +"0561eff6": "addStoneToBoard(uint256,uint8,uint8)", +"0561fc18": "ICOResumed(uint256,uint256,uint256,uint256)", +"056265d1": "storeData(bytes32[],bytes32[],bytes32[],bytes32[])", +"05626694": "LABEEToken(uint256,string,string)", +"05626f09": "timeFundingStart(uint256)", +"0562b9f7": "withdrawAmount(uint256)", +"0563324c": "executeOrder(bytes32,uint256,address)", +"0563451a": "icoEnd()", +"056362e8": "Crowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"0563bbf6": "USDEtherPrice()", +"0563d55e": "MomaSpace()", +"05645168": "_removeFundkeeper(address)", +"0564a9a7": "getPollResults()", +"0564df4a": "_addBattleSequence(uint8,uint8,uint256)", +"0565ac43": "get_bonus(uint256)", +"0565c3f4": "pushAngelInvestmentData(address,address,uint256)", +"05664cea": "getRevisionTimestamp(bytes32,uint256)", +"0566bc12": "getDebrisPrice(bytes32,uint8)", +"0566c02a": "discountedSaleDuration()", +"0566c979": "iCashToken()", +"05674427": "numToString(uint256)", +"0567e83e": "kill(address,address)", +"05681031": "_sendBack()", +"056841b0": "InsertManifesto(string,string)", +"056a6421": "activateInvoiced(address)", +"056ab62a": "TestPool(address[3])", +"056b01ce": "mint(string,uint256)", +"056b2300": "TxUserWallet()", +"056b8197": "tokensInVault()", +"056ba056": "trade(address)", +"056bcc72": "_getVoteInterface(uint256)", +"056bef9e": "addRequester(address,string)", +"056cf6bf": "Witness()", +"056e1059": "oraclize_query(uint256,string,string,uint256)", +"056e25e3": "returnIcoInvestments(uint256)", +"056e4d88": "TotalInvested()", +"056e81a6": "TokenBooksAirdrop()", +"056ed205": "EstateTransactions(string,string,string,address,int256)", +"057101b1": "Token(uint256,string,string,string,uint8)", +"0571d85f": "Forwarded(address,address,uint256)", +"05733989": "setAttribute(address,string,bytes,uint256)", +"057466ea": "buyToken(uint256,uint256)", +"05748be2": "dropAmount()", +"05763ff7": "pauseProposer()", +"0576cb6f": "verifyTargetWallet()", +"05777d9b": "ReturnToken(uint256)", +"0577f15c": "exchangesStatus()", +"0577f62f": "PRE_MAX_CAP()", +"05785e4c": "minimumBuy()", +"05788701": "Ribble()", +"0578e3e5": "isAtMost(uint256,uint256)", +"0578f356": "addManagedInvestmentProposal(uint32,bytes24,uint256,uint152)", +"0579d25d": "price(uint256[],uint256[])", +"057af1c4": "exist(string)", +"057b0416": "getAccDetails(address,address)", +"057b17c0": "timeMode()", +"057b7105": "calculateTokenAmountICO(uint256)", +"057bd53f": "sameVar()", +"057bfcc7": "amount2()", +"057c3cf5": "get_flag()", +"057c824f": "proveInConfirmedBalances(bytes,bytes32,bytes32)", +"057d2c17": "Jack()", +"057dd42d": "purchaseCompanyCard(uint256)", +"058026d0": "checkTransferToICAPWithReference(bytes32,uint256,string)", +"058029a2": "icoCoinCap()", +"0580d5c7": "massBurnTokens(address[],uint256[])", +"0581345e": "issueClaimOwnership(address)", +"058206d9": "ICBCCoin()", +"05831c62": "donateFor(address)", +"05839b29": "sortTopTen()", +"0583ae52": "IRCToken()", +"05860b6f": "getBidIndex(address,bytes32)", +"058618f8": "setAuthorizeMintToken(uint256,int256)", +"05862435": "testFloatKeyValue()", +"05862611": "CrowdsaleLimit(uint256,uint256)", +"0587c1ba": "requestTokensFromOtherContract(address,address,address,uint256)", +"05888fcd": "tradeBalances(address,uint256,address,uint256,address,uint256)", +"0588dcbc": "updateStatsVars(uint256,uint256)", +"058a628f": "setAuthorizer(address)", +"058aace1": "divest()", +"058ab8c9": "EthVerifyCore()", +"058af982": "nameIsAdvocate(address,address)", +"058b316c": "MANAGEMENT_KEY()", +"058c5103": "safeKill()", +"058ceff7": "borrowBalanceStoredInternal(address)", +"058d4dd0": "setAssetCooldown(uint256,uint256,uint64)", +"058d7433": "setAlliesContract(address)", +"058fa067": "setGasRefundForClaimLootWithConsolationPrize(uint256)", +"058fcde9": "testFailTransferFrom()", +"058fe7d9": "setMiningRate(address,uint256)", +"05910b91": "canBreed(uint40)", +"05915147": "authType()", +"05917369": "populateFromOldContract(uint256[])", +"05917e8d": "updateWhitelistAddresses(address[],uint8)", +"0591eb24": "promoCreated()", +"059275ab": "howManyTokensForEther(uint256)", +"0593813f": "getBuyerTransaction(address)", +"0593d244": "setSaleContract(address)", +"05940728": "setGGCFee(uint8)", +"059417da": "_getAllParentIds(bytes32)", +"05943a15": "TEAM_SHARE()", +"0595ba4c": "getRoundMinAmountByBet(uint256)", +"0596334f": "rewardOne()", +"0596bd84": "_ChallengeFailed(uint256)", +"05976587": "test_expiry_increaseTimeBy30000()", +"05978450": "tokensReleasedAdvisorsTeam()", +"0597f3aa": "setGasRefundForClaimConsolationPrizeLoot(uint256)", +"05989e9d": "getAward(uint256)", +"05991e56": "Freewatch(uint256,string,uint8,string)", +"0599c284": "setAddress(string)", +"059a500c": "makeDeposit(uint256)", +"059a7d93": "cardEmojified(uint8)", +"059b8140": "upgradeAllowance(address,address,uint256)", +"059b8c77": "computeGainsRate(address)", +"059c00be": "STL(uint256,string,string)", +"059c5c4f": "policyFeeCollector()", +"059c5ecd": "WaniaToken()", +"059caad3": "creatorSupply()", +"059ce95d": "getVerifier(address)", +"059d45da": "removeAllPVPContenders()", +"059d92dc": "FeefersToken()", +"059eb515": "crowdsaleSold()", +"059efd9e": "_getShipColor(uint256)", +"059f8b16": "MULTIPLIER()", +"059f9342": "ownerSetLiquidationSpread()", +"05a0c707": "setMintAgent(address,int256)", +"05a10028": "burn(uint256,uint256,uint256)", +"05a10e6d": "withdrawStakeTokens(uint256,address)", +"05a17fc6": "getAccountFeed(address,uint256,uint256,uint256)", +"05a308fa": "setReferralSignupTokens(uint256)", +"05a30a7a": "lastDepositDate()", +"05a3823b": "colorplat()", +"05a3e81a": "ratePerWeiSecondPhase()", +"05a44292": "Train(uint64,uint64,uint64)", +"05a506b0": "seEnableTransfer(bool)", +"05a5b8c6": "verifyTx(bytes,int256,int256[],int256,bytes,int256,int256[],int256)", +"05a5f830": "signedApproveAndCallHash(address,address,uint256,bytes,uint256,uint256)", +"05a873dc": "setMetadataSize(uint256)", +"05a8bf98": "SEXYKITTEN(uint256,string,string)", +"05a955af": "holderList(address)", +"05a95f04": "triggerPayout()", +"05a9cec2": "BetOnMe()", +"05a9f274": "totalLockedAmount()", +"05aaee1f": "unlockTimeStamp()", +"05ab421d": "sendTokens(address,uint256)", +"05ac7908": "TakeBackToken(uint256)", +"05ac9bce": "voteVoting(uint256)", +"05ace573": "commitPhaseMinSeconds()", +"05ae6bcc": "userPublicFundingEthCountMap(address)", +"05aeb1e1": "RDMGameToken()", +"05aebead": "plantationSize()", +"05aecc80": "IAmVeryPoorToken()", +"05af0194": "getUserQuickPromoBonus(address)", +"05af2a81": "AddrDevelopFunds()", +"05af636b": "PunkTransfer(address,address,uint256)", +"05afff5b": "isHandleValid(bytes32)", +"05b0876d": "mgrAddress(uint256)", +"05b09e07": "getGameNumber(address,uint256)", +"05b1137b": "transferEther(address,uint256)", +"05b19fc5": "ZzyToken()", +"05b2b03a": "CertificationCentre(address)", +"05b34410": "creationDate()", +"05b35924": "totalLuxCents()", +"05b3dcb9": "roomFree()", +"05b4655a": "withdrawlWinnings()", +"05b496bb": "penalizeSolutionSubmitter(uint256,uint256)", +"05b4fe5f": "DepositFrozen(address,uint256)", +"05b542d9": "startPortalGun()", +"05b5711d": "level_3_amount()", +"05b575a5": "addWhitelister(address,address)", +"05b5b0dc": "submitSolution(uint8[])", +"05b5da23": "setPlayerTokenAddress(address)", +"05b64993": "setRequestCancellationMinimumTime(uint32)", +"05b67c8e": "BitGuildCrowdsale(uint256,uint256,address,address,address)", +"05b6d298": "assertEq0(string,string)", +"05b6d9e2": "distributeeBitcoinCashLarge(address[])", +"05b74d87": "inPrivatePreSalePeriod()", +"05b765ea": "getCertifierStatus(address)", +"05b8b29e": "profitOwner()", +"05b95822": "enableFundingWallets(address)", +"05b961e6": "PayWinner(address)", +"05b9cb3c": "totalDelegations()", +"05ba2ded": "voteForCashBackInPercentOfWeight(uint256)", +"05bbf5db": "startDocumentPoll(uint8,bytes32)", +"05bc99f8": "eth_sent(address)", +"05bccd09": "EGGCOIN()", +"05bdd57b": "AVMTestSuite()", +"05be478b": "calulateXticket(uint256,uint256,uint256)", +"05bf3bf0": "FtechizTestToken()", +"05bf4ecc": "batchPopularitySetting(uint256[],uint8[])", +"05bf779f": "setFoundation(address,address)", +"05bf9ece": "ICOSuspended()", +"05c06367": "RequestDetachment(uint256)", +"05c06db9": "majorPartnerAddress()", +"05c080be": "getTotalF6()", +"05c091f6": "_setCEO(address)", +"05c0dd91": "DEPOSIT_WINDOW()", +"05c0e497": "CDcurrency()", +"05c1f502": "post()", +"05c1f5ff": "getWhiteListStatus(address,address)", +"05c24481": "reserveSlash(bytes32)", +"05c270e2": "getPreviousBlockNumber(uint256,uint256)", +"05c31491": "test_oneTrueAssertNoMessage()", +"05c35eb6": "MICE(uint256,string,string)", +"05c3cb8d": "changegp(address)", +"05c4af9d": "getProto(uint16)", +"05c4b3dc": "Snydertoken()", +"05c54cd6": "MUNIRAHAMID()", +"05c7603d": "updateGenGuVault(uint256)", +"05c78929": "thirdWeekTokenPrice()", +"05c7cd4b": "confirmAndForwardWithRevert(address,uint256,bytes,bytes32,uint256,uint8,bytes32,bytes32)", +"05c7f589": "BACS()", +"05c85c42": "icoTimeStart()", +"05c8a4e2": "FeuzingToken()", +"05ca11cf": "TIM5(uint256,string,uint8,string)", +"05ca3557": "makeAdoptionOffer(bytes5,uint256)", +"05ca3841": "getOraclizeAddr()", +"05caca6c": "transferOwnershipServer(address)", +"05cb177a": "referralPay(uint256)", +"05cb71d4": "firstLoos()", +"05cc1d8e": "openForceAutoFree(address)", +"05cc49dd": "distributeFee(uint256)", +"05cc72e3": "FilmscoinToken()", +"05ccfddd": "invalidateCombat(uint256)", +"05cd4794": "ExEquity()", +"05ce55fc": "channelDisputeResolver(uint64)", +"05cf5fcd": "mediationExpiry()", +"05d0e91c": "withdrawFromCustodian(address,address[],uint256[],bytes,bytes,bytes32)", +"05d0f15b": "tokenPriceWei()", +"05d1127f": "changeChanceToWinModule(uint256)", +"05d1afec": "ausGroup()", +"05d1fc5d": "AIRDROP_MAX()", +"05d2035b": "mintingFinished()", +"05d258dd": "getMixingResult(uint256,uint256)", +"05d26bc6": "feedme(uint256)", +"05d2f3e2": "ErrorReport(address,uint256,uint256)", +"05d2f92a": "check_depth(address,uint256)", +"05d35816": "ConstitutionalDNA()", +"05d430db": "isNameValid(string)", +"05d4665f": "CROWDSALE_TOKENS()", +"05d473da": "assinaPresenca()", +"05d52eeb": "OMPxContract()", +"05d53802": "setPreSaleTokens(uint256)", +"05d55093": "oraclizeRequests(bytes32)", +"05d56a4e": "GetDChainNumRevokableHashes(bytes32)", +"05d57a59": "destroy_time()", +"05d6671c": "m_txs()", +"05d67464": "getTether(address,uint256)", +"05d74066": "SendPreReserved5()", +"05d7649f": "sendPortion(uint256,address)", +"05d78739": "cratesMigrated(address)", +"05d85eda": "count(address)", +"05d861fa": "CommunityAdVoucher()", +"05d866cd": "MemberChanged(address,address)", +"05d87fe2": "issueLetterOfCredit(uint256,uint256,uint256)", +"05d8bb97": "additionalDebt()", +"05d8c792": "_buyHicsTokens(address,uint256)", +"05d9a5fb": "sgn2sga(uint256,uint256)", +"05da403d": "withdrawBalance(bytes32,address,uint256,address,uint256)", +"05dabbcd": "lockedHasEnd()", +"05dad1c0": "test_userSetup()", +"05dae1f9": "ChargeStation(address,uint256)", +"05db3b82": "minwei()", +"05dc2708": "getCardNumber()", +"05dd071c": "_initialTransfers(address,address[],uint256[])", +"05dd23f7": "_stringGas(string)", +"05dd686f": "MIN_TOTAL_AMOUNT_TO_RECEIVE_ETH()", +"05dd7303": "EthereumStack()", +"05ddd49f": "Rotharium()", +"05de4f07": "getContentParent(uint256)", +"05de6288": "WithdrawalDone(address,uint256,uint256)", +"05df5e86": "XPAToken()", +"05df75db": "foobar()", +"05dfedac": "incrementDate()", +"05e0141d": "getOrders(uint256)", +"05e1bd8c": "calculateInterest(uint256,uint256,uint256)", +"05e1c942": "reclaimTokens(address[])", +"05e206f0": "_registerBid(uint32,uint256)", +"05e24a93": "DISTRIBUTED_STATUS()", +"05e2b66a": "update_eth_ratio(uint256)", +"05e2eee0": "getArrayString(bytes32)", +"05e33b6e": "calculateMask(uint256,uint256)", +"05e33dd0": "allParticipants(uint256)", +"05e43263": "AzwieToken(address)", +"05e437b5": "setAllSteps(uint256,uint256,uint256)", +"05e4438a": "applyHotFix(address)", +"05e4545d": "nextActionIsAuthorised()", +"05e45546": "promoCreatedCount()", +"05e49d1d": "findWinner(uint256)", +"05e4a75c": "setupairdrop(address,address)", +"05e52ea0": "numberOfBasesSold(uint256)", +"05e53535": "operationTokenCreated()", +"05e57cb1": "CommitGoodToken()", +"05e633e2": "bonusEnds3()", +"05e6b4a4": "_emitHolderAddressRemoved(bytes32,address,uint256)", +"05e6ee11": "btcInvestment(address,uint256,uint256,string,uint256)", +"05e7781e": "changeReserveWallet(address)", +"05e87e2a": "tracetoMultiSigContract()", +"05e88b69": "production()", +"05e992ff": "BitcoinDeuce(string,string,uint8,uint256)", +"05eb1877": "projectBuget(address)", +"05ecc085": "snapshotAt(uint256)", +"05ed2cd3": "settleBBDBatch(address[],int256[],uint256)", +"05ed76c4": "resolveTime()", +"05ee27a6": "RavneetToken()", +"05ee72b5": "playerEndGameConflictImpl(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address)", +"05ee8d89": "investorMinimalBalance()", +"05eed946": "waracoin_per_ether()", +"05ef6848": "getTokenPods(address)", +"05f04e46": "writePublicRecord(bytes32,bytes32,string,uint8,bytes32,bytes32)", +"05f0f662": "ComputeMyEggs()", +"05f203d9": "revoke(address[])", +"05f29b89": "smartSpeedEarning()", +"05f36283": "Nitrogen()", +"05f3a852": "tkn()", +"05f43bba": "calculatePreTokenAmount(uint256)", +"05f53b29": "getSkillCount()", +"05f5c0f3": "FrozenFunds(address,uint256,uint256,uint256,uint256,uint256)", +"05f6237f": "canClaimRefund()", +"05f671d9": "UUSD()", +"05f6d329": "limitTokenForSale()", +"05f6ee21": "updateBurnAgent(address,bool)", +"05f70f21": "getTokensWithoutRestrictions(uint256)", +"05f766a4": "Spc(uint256,string,string)", +"05f8002a": "setts01(uint256,address)", +"05f8b0cf": "setERCContract(address)", +"05f8b6f5": "_rewireIdentities(bytes32[],uint256,uint256,uint32)", +"05f8d55d": "addOwnerBalance()", +"05f908e6": "ICOPERIOD()", +"05f9bb6b": "transfersEnabledFlag()", +"05f9bf10": "AuctionCreated(uint256,address,uint256,uint256,uint256)", +"05fa0d5f": "_createTileAt(int32,int32)", +"05fc0586": "buyOptions(address,uint256,string)", +"05fcd234": "batchTransfer(address[],uint256,uint256[])", +"05fd22d0": "isPopulous(address)", +"05fe035f": "right100(uint256)", +"05feb950": "SOVREN()", +"05fec4be": "transferAdvisorToken(address,uint256)", +"05fefda7": "setPrices(uint256,uint256)", +"05ff088c": "getVendingInfo(uint256)", +"05ff711b": "blackList(uint32)", +"05ff792e": "cancelEscape(uint32,int256)", +"06005754": "nameRegAddress()", +"0600a865": "totalWithdrawable()", +"0600b814": "tokenBonusPct(uint256)", +"06011b14": "getUnitInfo(uint256,uint256,uint256)", +"06021e7e": "finalizeWork(address,string,string,string)", +"06024287": "attemptSomeMethod(address,uint256)", +"06026d87": "addAddressesToBonuslist(address[])", +"06027876": "sendBountyProgramBalance(address,uint256)", +"06040618": "currentPeriod()", +"0604c594": "getFreeBalances(address)", +"0605062f": "ownerOf()", +"0605d0cd": "emitSkillSet(uint256,uint256,uint256,bytes32)", +"0607dd94": "submitChoose(uint256)", +"06087e5b": "setColdWallet(address)", +"0608a48a": "reactivate_trading()", +"06090738": "setAdultTime(uint256)", +"06096931": "bountySupplied()", +"0609b433": "amendRetention(uint8)", +"060a02b7": "_hasIcoContributorType(address)", +"060a1051": "isExistInWhiteList(address)", +"060a56dc": "publisherCut()", +"060a7ef1": "getCreator(bytes32)", +"060b2128": "getEndPointOfCampaign(bytes32)", +"060ba7e9": "hackAdept(address)", +"060c265f": "checkMaxCap(address,uint256)", +"060c7f33": "AVAILABLE_FOR_EARLY_INVESTORS()", +"060ca250": "distributionsLength()", +"060cf4e8": "_cap()", +"060d15f9": "getBonusFactor(uint256,uint256,uint256)", +"060d206e": "modifyWhitelist(address,bool)", +"060d4f0d": "canDownload(address,address,bytes32)", +"060dac88": "setTokenBalance(address,address,uint256)", +"060eb520": "snt()", +"060f3102": "UbexToken()", +"060f400b": "removeFromOwnership(address)", +"060f58c3": "getUserFee(address)", +"060f919b": "getHash(address,bytes32)", +"060f99c4": "ZillaGDToken()", +"060ffb99": "getPromiseCount(address,bool)", +"0610e037": "isEnabled(bytes32)", +"0611037c": "QiiToken()", +"06114d36": "testChangeBet()", +"0611ae4a": "allocateBid(bytes32,uint256)", +"06122ea8": "createTokensAnySale()", +"061268d7": "requestFoundationTransfer(address,bytes32)", +"06127a11": "privateEntranceProvideAccessFor(address[])", +"061303a7": "refundIsAvailable()", +"061307b0": "fixPlayerPrename(uint256,string)", +"06130ca6": "getTopicAtIndex(uint256)", +"06132b38": "_create(address,uint16,uint16,uint8)", +"06137c9d": "add_luck(bytes32)", +"0613c265": "getLockBalance(address,uint8)", +"0613d936": "setAttackAddress(address,address)", +"0614117a": "recoverETH()", +"06155e95": "EmployeeSignedToESOP(address)", +"0615b520": "isBurner(address,address)", +"0615f7c3": "setGasForPBTT(uint256)", +"0616558c": "CampaignRules(address)", +"06169f63": "setAirdropAgent(address,bool)", +"0616ae05": "GenerateChips(address,uint256,uint256,uint32[])", +"0616cca0": "currentMood()", +"06171a5d": "OpsAddressUpdated(address)", +"061777ed": "incrementOpenInterestFromMarket(uint256)", +"06177ba8": "getdepositValue()", +"06184a25": "monthlySubscriptionCost()", +"0618c0b0": "INACTIVITY()", +"061931eb": "buySkill(uint256,uint256,uint256,uint32)", +"0619978d": "raiseApprovalEvent(address,address,uint256)", +"061a85c7": "forwardedOracle()", +"061ab664": "receiverTwo()", +"061b3245": "withdrawToExchange(address,uint256)", +"061c8800": "setInt(bytes32,bytes32,int256)", +"061c9040": "getLockInfo(address,address)", +"061d5102": "LivingstonCoin()", +"061d8169": "_addResolvers(string,address[],uint256[])", +"061e494f": "getBet(uint256)", +"061e5844": "withdrawFor(address,uint256,uint256,uint8,bytes32,bytes32)", +"061e7845": "buyTokens(string,string,address,uint256)", +"061ea8cc": "countByOwner(address)", +"061f7650": "supportsToken(address)", +"061f9811": "deleteRecord(uint256)", +"06201ad9": "getPLATPrice()", +"0620b2af": "PenaQuantumLeapToken()", +"0621472c": "approveAll(address)", +"0621afe4": "Virgingold()", +"0621b4f6": "sellAllAmount(address,uint256,address,uint256)", +"06222be3": "buyIcoTokens(uint256)", +"06223dac": "getDRCTotal(uint256)", +"06228e95": "freeTransferItem(uint64,address)", +"0622e74b": "crowdsaleTokenPriceNumerator()", +"06232bb0": "openAgreement(bytes,uint8,bytes32,bytes32)", +"06237111": "_getFilteredBoxes(bool)", +"06237526": "serviceCount()", +"06240d7d": "getWeiInCents(uint256)", +"0624ac2c": "getOutcomeTokens(bytes32,uint8)", +"0625d365": "getRightCoordinate(bytes1)", +"06262f1b": "trust(address,bool)", +"0627586a": "splitterNames(address)", +"06279d72": "priceUnits()", +"06287693": "directDebitAllowance(address)", +"062907d5": "initiateVotingContractUpdateVote(string,address)", +"062af37d": "isVersionContract(address,bytes32)", +"062b01ce": "isPricingSane()", +"062bbe59": "setEditedTrue(address)", +"062bd3e9": "getMarketTokenAddress(uint256)", +"062d0f09": "timestep()", +"062d4a34": "addressAdvisoryBountyTeam()", +"062db578": "createtoken(string,string,string,string,string,string,address)", +"062e43a1": "withdrawalToken(address)", +"062e53f3": "intFunc(int256,int256,int256)", +"062fe08e": "TOKENS_AVAILABLE()", +"062ff957": "fetchVoteNumForVoter(address)", +"06301ce8": "delUnpausedWallet(address)", +"06309aa0": "SistanToken()", +"0630da28": "TokenDeskProxy(address,uint256)", +"0631a171": "DocumentAdded(uint256,string,uint256,string)", +"0632a2f3": "getBlockAddress(uint256,uint256)", +"0632f718": "RedditRegistry(bytes32,uint8,uint16)", +"0633cd32": "requestAddressChange(address)", +"06347def": "getCooldownEndTimeFromIndex(uint16)", +"063575de": "withinPeriod()", +"0635fe90": "playerLockedFunds(address)", +"0636d7ac": "getOrdersForSeller(address)", +"063925c8": "scheduleCall(bytes,uint256,uint256)", +"06394c9b": "changeOperator(address)", +"063a7400": "registerUserOnToken(address,address,uint256,uint256,string)", +"063b1566": "partyTo(address)", +"063b3b29": "getPlayerStatus(uint256,uint256)", +"063bac1f": "giveRightToVoteByBatch(address[])", +"063bde24": "MAX_VALUE()", +"063c67c2": "getMatchInfo()", +"063ca521": "setPossibleMobs(uint32[])", +"063cea26": "prenupAgreement()", +"063cfaf0": "getVestingReleaseRate(address,uint256)", +"063d93d8": "register(address,string,string,string)", +"063db820": "payFee(uint256,uint256,address,bool)", +"063dda8b": "preSaleBonus(uint256)", +"063e1b78": "setTradingTime(uint256[])", +"063e7451": "initialSupplyAddress()", +"063ec2f0": "MEDIA_SUPPORT_PERCENT()", +"063f4540": "LogBet(address,uint256,uint256,uint256)", +"06407746": "Grant(address,bool)", +"0640f885": "PAYCLECOIN()", +"0641d812": "accruedDiv(address)", +"064292a8": "updateDates(uint256,uint256,uint256,uint256,uint256,uint256)", +"06437e4f": "_getCards(uint8,address)", +"0643be3e": "transferFrom(uint256,uint256)", +"06444e91": "register(address,uint32)", +"06459119": "testThrowsTransferNotTransferable()", +"0645b5d5": "getMyShareholderID()", +"06463556": "validateFunction(bytes4)", +"064701c6": "buyChest(uint16)", +"06474d12": "tokenIdOf(uint256)", +"06477332": "getMemberAtIndex(address,uint256)", +"0647b106": "Store(address,uint256,uint256,bytes32)", +"0647f697": "Uint256Oracle(uint256)", +"06490f47": "lockup()", +"064aa0e3": "ATMToken(uint256)", +"064af4ee": "setCoreContractAddress(address,address)", +"064c4ebc": "backDevvoteOwner()", +"064cc7a7": "delegatesByDelegator(address)", +"064cd77f": "changeFreezeDate(uint256)", +"064cfc16": "checkIsOpen()", +"064d4d7c": "_minAmount()", +"064da5e7": "getBAAU(bytes32,address,address)", +"064da642": "TransferSellAgentMulti(address[],uint256)", +"064dcb17": "sellTokens(uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", +"064ddd04": "getItemsForSale()", +"064f4fa7": "rateAge()", +"064f5dcd": "decentralizedEconomy()", +"064f67e7": "LockRemoved(address)", +"064fe208": "IxiniumFundingCoin()", +"06502ac0": "setMemberShip(address,uint256)", +"06504c31": "getNeedCloseBets()", +"0650b590": "bulkAdd(address[])", +"0651844e": "activateBalance(address)", +"06525841": "canCashBack()", +"0652d7f5": "fxFee()", +"065361a6": "buyBkgAtExchg(address,uint256,uint256,uint256)", +"0654cb16": "canInvest(address,uint256)", +"0654fbc4": "giveEther(address,uint256)", +"06552ff3": "init(address,address,address,address)", +"0655c58b": "getIcoTokensAmount(uint256,uint256)", +"06562575": "isTermOver()", +"0656dd02": "existingContract(address)", +"06575c89": "currentWeek()", +"0657a9c5": "registerTopPlayers(uint256,uint256[],uint256[])", +"0657f3a1": "finishIco(address,address)", +"0658a429": "BlockHashStorage()", +"0658b574": "storeImageString(string)", +"0659928c": "weiPerMinToken()", +"065b1061": "ln(uint256,uint256,uint8)", +"065b3133": "getDataColla_AA_02(string)", +"065c6b90": "setLevelRewards(uint256,uint256)", +"065de1f6": "minionRemove(address)", +"065de950": "dropNectar(address[])", +"065df077": "createBondFundToken(string,string,uint256,int256,uint256,uint256,address,string,uint256)", +"065e5360": "currentTick()", +"065ec2e6": "_restriction()", +"065ece90": "StageTwoDisable()", +"065f7a98": "totalNonSaleSupply()", +"065fcdff": "distributionThree(address)", +"065fe24f": "heldTimeline(address)", +"0660b8b2": "updateethFee(uint256)", +"0661b2f4": "setOtherPCK(address)", +"0661f204": "generateOtherNums(uint8[4])", +"066208de": "setInitialDuration(uint256)", +"06621ff6": "AZEEMCOIN(uint256,string,string)", +"0662572f": "activateSale(address)", +"06637876": "customers()", +"06637cd9": "getNewPeriod()", +"06638e92": "GetNumbersFromHash(bytes32)", +"066406ad": "LootEtherCom()", +"0665a06f": "createVesting(address,uint256,uint256,uint256)", +"0665c82b": "doPurchase(address)", +"06661abd": "count()", +"066636da": "getTotalEtherOfCurrentRound()", +"0666a6da": "setUnlceRateAndFees(uint256)", +"0666c071": "getEmployeeInfoByName(string)", +"06673ac7": "OmnesToken(address,address)", +"0668f649": "lambosTuneCount()", +"066aa53b": "updatCokeTotal(uint256,uint16)", +"066aff83": "calc1RealTokenRateFromRealTokens(int128)", +"066b0380": "assertEq30(bytes30,bytes30,bytes32)", +"066b3136": "paymentSuccessful(bytes32)", +"066bdc1b": "Legend_Royale(uint256,string,uint8,string)", +"066bf18c": "checkGoal(address)", +"066c94ba": "minTxSize()", +"066cc231": "YouAreHereAt(uint256)", +"066cd2c6": "createOfferAssets(uint256[],string,uint256,uint256)", +"066cf539": "vaultSecondaryUnlocked()", +"066d4701": "callFirstTarget()", +"066d76fe": "update_ratio(uint256,uint256)", +"066e4748": "calculateIdeaBuy(uint256,uint256)", +"066e4ce3": "CancelSell(address,uint256,uint256)", +"066f8a7d": "_disconnectModule()", +"066fd899": "availableReward(address)", +"067002ce": "removeSellingItem(uint256)", +"06713c3e": "proxy(address)", +"0672859b": "getMonsterCP(uint64)", +"0672cce3": "changeMinBet(uint8[157])", +"0673c8be": "isZero(address)", +"0674763c": "assert(bool)", +"06748fb1": "_random()", +"067497e2": "LogIcoTokenSupplyUpdated(uint256)", +"0674fde4": "aventus()", +"0675cb0b": "mintBool()", +"0675e962": "delegateIsCurrent()", +"0676aade": "GetOtherCustomerInfo(bytes18)", +"0676bde3": "BitGuildToken()", +"06771000": "ownerClawbackCredits()", +"06772bbd": "LogStateTransition(uint8,uint8)", +"06780cf5": "preIcoWallet()", +"06784b81": "MAXWIN_inTHOUSANDTHPERCENTS()", +"06787b98": "setHalfLifeRate(uint256)", +"0678c282": "extendRound(uint16,uint256)", +"067903f9": "withdraw4()", +"067906b1": "profiterole()", +"0679195a": "BerryLakeToken()", +"06791fc8": "enterPool(address,uint256)", +"067969a3": "sale2Accepting()", +"067a1e16": "getLockedValue(address)", +"067a2f3e": "Goochain(uint256,string,uint8,string)", +"067a6b05": "myRole()", +"067a8eb4": "registeredFundToRegistrants(address)", +"067ad784": "defaultBonussRate()", +"067ade9f": "claimSeedOwnership()", +"067c2d78": "thirdStartTime()", +"067cf182": "generateReport(int8[],uint32[])", +"067e06ee": "getServerStatus(string)", +"067ec02e": "Xkcd()", +"067eeeac": "tempTokensBalanceOf(address)", +"067fc6dd": "isTokenHolder(address,address)", +"06802613": "mintForCreatorsPool(uint256)", +"068045c7": "crowdsaleSetup(uint256,uint256)", +"0680d58a": "replaceService(address)", +"0681ae70": "FARTCOIN()", +"0681ca55": "milestoneCount()", +"068365ec": "buyWithCustomerId(uint256)", +"0683751e": "_removeByValue(address)", +"0683d56a": "minimumParticipationAmount()", +"0683dc58": "checkTransferIn(address,address,uint256)", +"0683dfdb": "getIdentifiersCount(address)", +"068417d9": "_registerInterface(bytes4)", +"06845b9f": "setTransferAbility(bool)", +"06845c4a": "LogFreezerRemoval(address,uint256)", +"0684c12b": "distributePresaleTokens(address,uint256)", +"0685224c": "GraspSmartBlockchainLock()", +"0685b410": "submitChooseByFactory(address,uint256)", +"0685b42c": "maascash()", +"06867f7d": "accountA()", +"0686dc8d": "setNEW(address,uint256,uint256,uint256,uint256)", +"06873418": "getcoolduwn(uint32)", +"0687bb4a": "purchaseCarCard(uint256)", +"06880dc0": "takeLoan(uint64)", +"06881fd1": "setBaseTokenGetRate(uint256)", +"068841c6": "getNeedLockFunds()", +"06884fc8": "airdrop2()", +"06886a53": "curOpenBNumber()", +"06886fd0": "logRoyalty(address,uint256)", +"0688b135": "recipient2()", +"0688ec24": "preicoAndAdvisorsAmounts(uint256)", +"06894f59": "TakeBack()", +"0689d0ff": "timeToChallenge()", +"068aafb8": "NepExToken()", +"068ae02b": "DATE_LIMIT()", +"068aebbc": "transfer(uint8[],uint8[],uint32[])", +"068b7310": "maxWei()", +"068bcd8d": "getPool(uint256)", +"068c017b": "calcUnlock(address,address)", +"068c8e61": "GetLandData()", +"068c966b": "DrawDetails(uint256)", +"068d5363": "withdraw_bix()", +"068ea2aa": "getLawyerAtIndex(uint256)", +"06900a40": "coAdmin()", +"06900c41": "ZeroPonzi()", +"06903e3e": "offeringProposals(address,uint256)", +"06903ecc": "GVE()", +"06907e17": "block(address)", +"06909f69": "cancel(string,uint256)", +"0691d0bf": "move(address,int64)", +"069215c9": "icoPhaseAmount4()", +"06921a9c": "PRESALES()", +"06934753": "getLanguageCountry()", +"0693b1ab": "minCount()", +"0693e603": "tokensAmountForPurchase()", +"0693ee6e": "firstStartTime()", +"069476ea": "_dispute(address,uint256,uint256[])", +"069489a2": "init2()", +"0694d1be": "refundsOpen()", +"0694f9d6": "getQtyValidators()", +"06961560": "DAO(address,uint256,uint256,uint256,address)", +"0696647a": "test_insert_findWithHintNextAtPosition()", +"0696ba24": "revokeTickets(address,bool)", +"0696eab6": "RICHCrowdsale(address,address,uint256,uint256)", +"0697dfb1": "tokenSetMintFeeProp(address,address,uint256)", +"0698ac9b": "decreaseWeiRaised(uint256)", +"06991539": "_addTokenToOwnersList(address,uint256)", +"06993c97": "writerAccountSupplyRemaining()", +"069984c9": "SmartVows(string,address,address,string,address,address,string,string,string,string,string,string,string)", +"0699d07d": "updateMaxVal()", +"0699f10a": "LightAirdrop()", +"069a2e73": "registerModuleHandler(address)", +"069a6947": "biddedico()", +"069b559c": "migrateThroughOneFork()", +"069b9232": "ChenXiangToken(uint256,string,string)", +"069bd974": "validateTransfer(uint256)", +"069c97df": "angels_lock_days()", +"069cff34": "getMymorties()", +"069d6d1c": "closeOrder(uint256)", +"069d92e3": "showInvestEther(address,uint256)", +"069e5e53": "createEscrow(address,address,uint256,uint256,uint256,uint256)", +"069e9dba": "activateHandbreak()", +"069f5f72": "getMineableTokens()", +"069f74c7": "zcc()", +"069f7e85": "getGreeksBattlePoints()", +"06a0ab2b": "earningsPerShare()", +"06a24640": "setNextPot()", +"06a248c6": "depositTo()", +"06a33300": "BITOX(address,address,address,address,uint256,uint256,uint256)", +"06a36aee": "getUserRoles(address)", +"06a46703": "pubsaleDeadline()", +"06a493fa": "redeemCards(address,uint8)", +"06a49fce": "getCandidates()", +"06a5312b": "GetNumber()", +"06a585e6": "addInvestor(bytes32[3][],address,uint256,uint256)", +"06a5cb3a": "ecosystemAddress()", +"06a5f087": "signSeller(uint256)", +"06a628d4": "packSize()", +"06a669fc": "createPayment(address,uint256)", +"06a6c28f": "commitDividend(address)", +"06a74947": "getBigWinPot()", +"06a81591": "_price_token_PRE()", +"06a85497": "getGameBonusAdded()", +"06a86539": "PBTTForGas()", +"06a8f8a2": "admin2()", +"06a95b53": "blablabla()", +"06a98f0a": "Mine_Block()", +"06a9ce79": "updateTimer(uint256,uint256)", +"06a9d1a9": "fundraisingDeadline()", +"06aa4083": "icoWeek1Bonus()", +"06aacb14": "Broker(bool,address,address)", +"06ab34cf": "initExit(uint256,bytes32)", +"06ab5923": "setSubnodeOwner(bytes32,bytes32,address)", +"06aba0e1": "getTotalWeight()", +"06ac1527": "capWalletAddress()", +"06ac2303": "EthereumButton()", +"06ac5879": "perReserveListedPairs(address,bytes32)", +"06adb71d": "increaseEmployeeExtraOptions(address,uint32)", +"06ae9483": "contractExists()", +"06aef16a": "getAuthorizationDate(address,address)", +"06aef6fb": "_withdrawToken(address,uint256)", +"06af0650": "initializeCurve(bytes32,bytes32,int256[])", +"06af3c75": "get_next_user_recast_from_item(bytes32,bytes32)", +"06af7414": "ContestAnnouncement(address)", +"06b05238": "safeWithdrawAmount()", +"06b091f9": "withdrawTokens(address,uint256)", +"06b0c76d": "setReferenceHash(bytes32,bytes32)", +"06b16a6c": "petPresell(uint16)", +"06b1b479": "indCommunity()", +"06b1efe5": "pushData(string)", +"06b28cec": "createDividendWithCheckpoint(uint256,uint256,address,uint256,uint256,int256)", +"06b2be05": "payStyle()", +"06b2e607": "GetGamestatus()", +"06b2fe22": "remainingTokensCount()", +"06b2ff47": "canReverse(address)", +"06b3bcd1": "getIpfsAddress(bytes32)", +"06b3efd6": "assetBalanceOf(address)", +"06b4c3e9": "ABCToken(string,string,uint256)", +"06b5338a": "JCoinz()", +"06b5760d": "getCreateShareTokenOutcomeValue()", +"06b5ad18": "recovery(string,address)", +"06b5b21e": "proposeTransfer(address)", +"06b5f02d": "calcWinnings(uint256,uint256)", +"06b6689b": "nextLotteryTTMTokenId5()", +"06b70f62": "MULTISIG_OWNER()", +"06b726d6": "smartBlockAddress(address)", +"06b764ed": "addAddressDataPatternVoteRules(address,address,uint256,uint256,bytes,bytes,uint256[5])", +"06b77972": "getDescriptionInfo(bytes32)", +"06b82a7d": "deregisterSettlement(uint64)", +"06b89153": "BBB()", +"06b8ef4a": "rewardCheckpoint()", +"06b96bb4": "HoloSale(uint256,uint256,uint256,uint256,uint256,address)", +"06ba089a": "updateWebsite(address,address,string)", +"06ba2987": "addSellTokensRequest(address,string,string)", +"06ba8e42": "logDisputeCrowdsourcerRedeemed(address,address,address,uint256,uint256,uint256,uint256[])", +"06bb18c0": "NewCratePreSale()", +"06bbbeff": "getUserBetOf(uint256,address,address)", +"06bc7ef3": "deleteInvestContract()", +"06bced7c": "set_presale_arbits_total(uint256)", +"06bcf02f": "updateStartTime(uint256)", +"06bd7aac": "setSubdivisionEnabled(bool)", +"06be8e04": "_payToInviter(address,uint256)", +"06bee2be": "CartycoinToken(uint256,string,string)", +"06c01551": "setAtomDna(uint256,uint64)", +"06c0e841": "withdrawPayout()", +"06c1032c": "Created(address,address,uint256,uint256,string)", +"06c15206": "GTL()", +"06c17cd7": "sliceLengthThrow()", +"06c18600": "takeOwnership(uint256,uint256)", +"06c18ae0": "CyberVeinToken(address,address,address,uint256)", +"06c1b0ba": "adPriceDay()", +"06c1df7b": "checkBetColumn(uint8)", +"06c265b6": "VICCOToken()", +"06c270be": "HmcDistributor()", +"06c2b53c": "becomeTo()", +"06c2f050": "setSendToSafeWalletPercentage(uint256)", +"06c30e84": "CoVEXTokenERC223()", +"06c3f137": "getLastNReadingsByDeviceId(uint8,uint8)", +"06c45c2a": "addToTradeList(uint256[],uint256[],uint256[],uint256[])", +"06c4811e": "TokenOWLProxy(address)", +"06c5b9d0": "XiaoMuBiaoERC20()", +"06c6c546": "massApprove(address[],uint256[])", +"06c7e165": "SevenStandardToken(uint256,string,uint8,string)", +"06c80102": "releaseAbstractToken_(address,uint256)", +"06c89667": "change(string,string,uint256,uint256,bool)", +"06c8ffed": "removeMultipleAddressesFromWhitelist(address[])", +"06c91ce3": "gx()", +"06ca218f": "doPayout(uint256)", +"06ca66f0": "Indosat(address)", +"06ca9bba": "Start_NewRound(uint256)", +"06caf3e6": "extraDiscount(uint256)", +"06cb0ea4": "updateAd(uint256)", +"06cb4bcd": "sendDeposit()", +"06cc01bc": "setBuyCommissionBps(uint256)", +"06cc2035": "revokeFeeExemption(address)", +"06cc2cd2": "recordSoldPrice(uint256)", +"06cc6373": "UpdateUserExtraData3(address,bytes32)", +"06ccd230": "addToNumber(uint256)", +"06cd4728": "RublixToken(uint256,address)", +"06cf2280": "transferWithFee(address,address,uint256,uint256,uint256,address)", +"06d00b10": "doesOwn(bytes32,address)", +"06d0407e": "getBeneficiaryFinance()", +"06d0db26": "roundMoneyUpToWholeFinneyET(uint256)", +"06d145c9": "getFundingInfoForUser(address)", +"06d1772d": "TWOIoT()", +"06d177c1": "divPoolAmt()", +"06d19d68": "getHashRevealEnd()", +"06d19eb3": "updateSeller(address,uint256,address,uint256)", +"06d37817": "loanToken()", +"06d44278": "_emitError(uint256)", +"06d586bb": "maxPerUser()", +"06d58f2a": "claimAndWithdraw(address,address,address,uint256,uint256)", +"06d65af3": "preSaleStartTime()", +"06d6b095": "ProposalAdded(uint256,address,uint256,bytes)", +"06d6e513": "checkIsKYC(address,address)", +"06d83296": "setData_17(string)", +"06d832a3": "ownerStartContract()", +"06d8619b": "transferKing(address)", +"06d91eea": "getExoplanet(uint256)", +"06d978b2": "setMinDepartureLim(uint256)", +"06da3309": "Deposited(uint256,uint256)", +"06dafac6": "setGreyToken(address)", +"06db33e4": "getVotesByCandidate(uint16)", +"06db8af7": "toAddrString(uint256)", +"06dc5d7f": "total_user_eth()", +"06dc8949": "calculateTokenSellPrice(uint256)", +"06dcd5d0": "CATTOKEN()", +"06dd497f": "cancel(address,uint256,address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)", +"06df6cf0": "icoTokenExchangeRate()", +"06e102a0": "Presale(address,uint256,uint256,uint256,uint256,uint256,address,address)", +"06e16a36": "currentTierId()", +"06e1976c": "lockAccount()", +"06e232c4": "getLuckyblockIds()", +"06e25081": "getFreeToken(uint256,address,uint256,bytes32,bytes32,uint8)", +"06e28346": "redeemPlatformMaintenance()", +"06e2f5c1": "getRoundRate(uint256)", +"06e31056": "FANCrowdsale(uint256,uint256,address,address)", +"06e34150": "filters(uint256)", +"06e3a700": "setStartingSeeds(uint256)", +"06e3d732": "getMyChest()", +"06e42962": "_winnerJackpot(uint256)", +"06e430f6": "getAcceptedOracles()", +"06e48538": "defaultOperators()", +"06e4d36f": "getSoftCapReached()", +"06e53e5c": "getCountHolder()", +"06e53f47": "whichChainIsThis()", +"06e5fe85": "promoPurchase(uint32,uint8,uint8,uint8,string)", +"06e63ff8": "insert(string,string)", +"06e64907": "End()", +"06e795e8": "sendToAddress(address,uint256,uint256)", +"06e7b5ad": "isDisputing(address)", +"06e8337f": "getTotalTickets()", +"06e83e2f": "send(address,address,address,uint256)", +"06e840ea": "incrementStatistics(uint256,uint256)", +"06e91d2e": "ROY()", +"06e99fef": "sendEth()", +"06ea1c02": "setArbitrationFeePerJuror(uint256)", +"06ea29c2": "notEqual(int256[],int256[],string)", +"06eb0c2f": "TokenERC20_test(uint256,string,string)", +"06eb6ac1": "TokenPaymentGateway()", +"06eb815f": "handleETH(address)", +"06ebe49f": "incMemberGoodRep(address,uint256)", +"06ec16f8": "collect(address)", +"06ec6272": "payCustom(address,uint256)", +"06ec8ca6": "setCurrency(bytes32)", +"06ec967b": "deleteHpbNodeBatch(address[])", +"06ec9b9e": "ETH_PRICE_USD()", +"06eca511": "unhaltICO()", +"06eccccb": "_getPersonalAirdrop(address,address)", +"06ed6908": "buyTokensFromContract()", +"06ed69b9": "dDeprecateCategory(bytes32,uint256)", +"06edcd24": "hasOpenedOldCrates(address)", +"06ee3b69": "startCloseSalePhase()", +"06ee4917": "ChainMaster()", +"06eeaba0": "tokensForParnter()", +"06ef53e0": "latestWinner()", +"06ef856b": "ethRelief()", +"06efdecd": "OwnerTransfered(address,address)", +"06f1117d": "REFERRAL_BONUS_LEVEL2()", +"06f13056": "batchCount()", +"06f13b8f": "transferTokensToEarlyEquityInvestor(address,uint256,bool)", +"06f2bf62": "getExchange(address)", +"06f33115": "ClaimedAmount()", +"06f33ae2": "setUnownedLifeRate(uint256,uint8)", +"06f36cc9": "helpBlue()", +"06f3a06a": "zeroInvestments()", +"06f3fc8a": "Mapoc(address)", +"06f470e9": "purchaseEstate(uint256)", +"06f4b12e": "changeTenant(address)", +"06f4f7de": "cancelDigitalArtSellingItem(uint256)", +"06f53cb3": "tryFinalizeProposal(uint256)", +"06f57add": "getWeekNumber()", +"06f639fe": "tier3(address)", +"06f660ef": "getInitialPrice()", +"06f68f12": "updateFirstBuyNum(bytes32,bytes32)", +"06f69881": "crossForkFundDeposit()", +"06f70295": "answer(uint256)", +"06f74bcf": "pauseInternal()", +"06f7ec97": "preICOBonus()", +"06f7f3fe": "getERC20Pawn(uint256)", +"06f84701": "canRedeemUTXO(bytes32,bytes20,uint8,uint256,bytes)", +"06f8ac40": "miniumInvestment()", +"06fa01b1": "MasonCoin()", +"06fa9df9": "hashPositions(uint32,int64[],bytes16)", +"06faebbe": "setPromoToPartner(string)", +"06fbf606": "setBurnFeeProp(uint256)", +"06fd06f8": "Exchanger()", +"06fd537b": "burnMoney()", +"06fdde03": "name()", +"06fdde58": "structure_variant_confirmation(int8)", +"06fde169": "REQUIRED_SHARES_TO_BE_BOARD_MEMBER()", +"06fdf75d": "getRedeemValue(uint256,address)", +"06fe0c29": "finishMilestone(string)", +"06fe1fd7": "getPackageName(bytes32)", +"06fe2212": "changeWaitTime(uint256)", +"06ff8908": "JoyToken()", +"06ffce53": "getTokenValue()", +"07002f02": "canIssue(uint256)", +"07006a55": "createPromoEggs()", +"07016f60": "getPOOL_edit_25()", +"0701da46": "limitAccount(address,uint256)", +"07023a38": "SellerHistory(address,uint256,uint256)", +"07031305": "setExpiration(uint256,uint256)", +"0703ffd1": "getLimitedReporterMarkets()", +"070485a9": "setGlobalPause(address)", +"070494ce": "blockFundsInEscrow(address,uint256,address)", +"0705028c": "addTransaction(uint256,address,address,bool,uint256,uint8)", +"070545d8": "Extend(bytes32)", +"07058808": "WinTokenLock()", +"07062cf2": "vision()", +"070669e6": "Requested(address,bytes32)", +"07073756": "_getTokenAmountForReferral(uint256,bool)", +"0707873c": "getInvestorInfo(address)", +"0707a106": "setRateEthToToken(uint256,uint256)", +"070816f1": "transferTeam1Tokens(address,uint256)", +"07085842": "smartcontracts(uint256)", +"0709544e": "getColor(bytes1,bytes1,bytes1)", +"0709d116": "setBlackListERC223(address)", +"0709df45": "vaultOf(address)", +"070a888f": "updateRewardDuration(uint256)", +"070ae23b": "createContractTokenWithPrice(string,uint256)", +"070b91d1": "voting(uint256,uint256,bool,uint256)", +"070bc415": "_computeUniqueness(uint256,uint256)", +"070bc508": "SupremIOTToken(address)", +"070be532": "BSE()", +"070c04b1": "setFromContractAddr(address)", +"070c3c23": "previousPayoutBlock()", +"070c87f9": "enableERC20()", +"070caf36": "exchangeTokenToEther(address,uint256)", +"070cf0cb": "isAgreementFullySigned(bytes32)", +"070f0e96": "countTokenHolders()", +"070f52f4": "canExchange()", +"070f5c09": "pausePresale()", +"070f723d": "_initializeGame()", +"070f7926": "_sendByDefaultTranches(address,address,address,uint256,bytes,bytes)", +"070fdb96": "getTakerBet(uint256,address,uint256,address)", +"07113965": "setPOOL_edit_3(string)", +"07120872": "createFightAuction(uint256,uint256,uint256,uint256)", +"07121a7a": "_requireBidderBalance(address,uint256)", +"07129e67": "SimpleEthBank()", +"07133caf": "HCToken()", +"07134b8b": "tokensNeededToGetPayment()", +"071357bd": "concludeCampaign(uint256)", +"0713d054": "checkDateExsit(uint256)", +"07142877": "PRE_SALE_MAX_CAP()", +"07144458": "forwardTokens(address[])", +"07146786": "userRankAddress()", +"0714c622": "anotherFunction()", +"07153d3b": "setStates(bytes32[])", +"07156854": "flipSwitchTo(bool)", +"0715b09f": "nouvelleProduction(uint256)", +"0715ec34": "EnchantedShop(address,string,string,uint256,uint32,uint256)", +"071696e0": "transferFAIDS(address[],uint256[])", +"0717f39e": "_isValidPerkToAdd(uint8[32],uint8)", +"0719d365": "TOKENS_CAP_ICO()", +"071a56df": "addOracle(address,string)", +"071a7541": "BETA()", +"071b7e73": "FinishIco(address,address,address,address)", +"071bafb5": "sin()", +"071bd079": "demo(uint256)", +"071bdfbd": "PlayCoin()", +"071c0306": "AvailableTokenPool()", +"071c802b": "saiVox()", +"071da02f": "totalBelaStaked()", +"071e1ddc": "processFunding(address,address,uint256)", +"071e8730": "AqsaJawaid()", +"071e9a76": "distributeFunds(address,uint256)", +"071ecb13": "getCurrencyContrData(uint256,uint256[7])", +"071eeeb3": "setStarNameMessage(uint256,string,string)", +"071fac61": "getAllMediators()", +"071fe9b0": "isBurnInClose()", +"07202460": "getMonsterObj(uint64)", +"07209e2b": "AllowanceCrowdsale(address)", +"0720fc78": "removeOWhitelist(address)", +"07216bda": "getBurnRequestStringMap(uint256,string)", +"072180ff": "buyCoinsAtExchg(address,uint256,uint256)", +"0721c6dd": "setCompte_29(string)", +"07220134": "getBetInfoByReveal(uint256)", +"0722559c": "endRentFlatDaily()", +"072419f4": "changeTeamFee(uint256)", +"072448f7": "midTimeBonusValue()", +"07256175": "SecondLevelCost()", +"07259d06": "limitGasPrice()", +"0725e898": "getTokensForOwner(address)", +"07260a43": "serveTx(address,uint256,bytes,bool,bytes)", +"07266117": "networkDevelopmentSupply()", +"0727adb3": "last_balance()", +"0728d5e3": "getDiscountedItemsForSale(uint256,uint256)", +"072933e9": "OWN_kill()", +"07293b9d": "maxStage2AllocationPerInvestor()", +"07298203": "GetStats()", +"072b3f49": "createContract(address,address,address,uint256,uint256,uint256)", +"072b8277": "VAPEbits()", +"072b9c83": "AxieERC721BaseEnumerable()", +"072b9cf2": "schema(bytes32)", +"072bdbb8": "getScripts(uint256,uint16)", +"072de7f3": "calculateTokenPrice(uint256)", +"072e28c2": "setCRManager(address)", +"072e4308": "detailsOf(string,string)", +"072ea61c": "entryFee()", +"073005f1": "canTransferFrom(address,address)", +"07304435": "getKilled()", +"0730a322": "FoundationTransfer(address,uint256,uint256)", +"073171d8": "LeaseBill(uint256,uint256,string)", +"0732717d": "buy_the_tokens(bytes32)", +"07336e35": "producedCaps()", +"0733b888": "getRoundsActive(address)", +"07342e9f": "MultiSigWalletWithDailyLimit()", +"073455f1": "BitDex(address,address,address,uint256,uint256,uint256)", +"073767fc": "changeRateFee(uint256)", +"073933ed": "isNotZero(int256,string)", +"07394d39": "TeamTokenLock(address,address)", +"0739cd26": "tsSucceeded()", +"073b3bf9": "addressToNumVillages(address)", +"073b423d": "mintTransfer(address,uint256,uint256,uint256)", +"073cc554": "newProposal(address,string,address,uint256,address,uint256,bytes)", +"073d5fd8": "DeadlineExtended(uint256,uint256)", +"073d9a28": "transferactive()", +"073e1fa3": "givecandyfrom()", +"073ede30": "addTeam1(uint64,uint64,uint64,uint16)", +"073f323d": "MamatToken(uint256,string,uint8,string)", +"07414002": "secureApprove(address,uint256)", +"07415ce8": "addressOfTokenUsedAsReward4()", +"0741dc1e": "withdrawToken(bytes8,address,uint256)", +"07420a41": "sendReward(address,uint256)", +"07433ca4": "createVesting(address,uint256,uint256,uint256,uint256,bool)", +"0744c56b": "getFreeHipster()", +"0745c160": "startProICO()", +"07461622": "setMinMax(uint256,string)", +"0746bfd9": "buySharesForProposal(uint256)", +"07471b18": "distributeInvest(uint256,uint256,uint256)", +"0747ab2a": "Winner(uint256,address,uint256,uint256)", +"0747e4eb": "wpr()", +"07489aa6": "totalFinalStage()", +"07489f92": "getUnsoldTokensVal(uint256)", +"074a1594": "addToAging(address,address,uint256,uint256)", +"074a1600": "percent2()", +"074b1e61": "referralsVault_()", +"074b5270": "leadingBid()", +"074bc101": "btcToken()", +"074c0836": "POMoooon()", +"074c09eb": "catalog()", +"074c32c4": "updateRatePlan(uint256,uint256,string,bytes32)", +"074c71e5": "SaleWallet(address,address)", +"074c9647": "updateEtherAmount(uint256)", +"074cac6c": "getFreeMinerForMiniGame(address)", +"074e06ee": "_addLuck(address,uint256)", +"074e0f36": "setMaxRefundableGasPrice(uint256)", +"074e6254": "blendWithYourself()", +"074e8940": "companyWalletAddress()", +"074f0a22": "DataContacts(address,address)", +"074fcfd5": "_blockKey(bytes32,bytes32,uint256)", +"07501073": "migrationGetPlayer(bytes32,uint8)", +"0751076d": "setBetMax(uint256)", +"07518c8e": "blockhashOf(uint256)", +"0752881a": "buyTokens(address,uint256)", +"075360bb": "moveRoundsToHolder(address)", +"07537ad4": "closeCrowdSale()", +"07539074": "LogInvestorRefunded(address,uint256)", +"0753afdf": "registration(string,string,string)", +"0753c30c": "deprecate(address)", +"0754236d": "minContributeETH()", +"07542576": "BayernvsRealMadrid()", +"07546172": "minter()", +"07549893": "SimpleChildToken(address,string,string,uint256,uint8)", +"0754e744": "icofunding()", +"07550f0a": "areAllBalanceNull(bytes32)", +"07560f13": "transferWithMessage(address,uint256,bytes)", +"0756f58f": "getDifficultyAsFixedPointForGameId(uint256)", +"0757114e": "getenddate()", +"07571c99": "getPayoutsCount()", +"075840d0": "bounty_funds()", +"075865c4": "getMiningWarDealine()", +"07587fa3": "KissMe(uint256,string,string)", +"075881d6": "purchasePlayer(uint256)", +"0758a980": "specialBonus(address)", +"0759a351": "getCCH_edit_30()", +"075a3b57": "releasedTo(address,address)", +"075acda7": "gasAmt()", +"075b1a09": "schemaId()", +"075bbcc7": "RESERVED_TOKENS_TIQPIT_SOLUTIONS()", +"075bf772": "teamTotal()", +"075c04ab": "dividendRewards(address,address)", +"075c18f7": "contributeByBitcoin(uint256,uint256,address,uint256)", +"075d4782": "publish()", +"075d7bb3": "setDontIndex(bool)", +"075deb95": "buyGana(address)", +"075e0a7c": "window3TotalSupply()", +"075f8ec2": "CommunityCoin()", +"075fe66a": "EDD()", +"075fe877": "scheduleCall(address,bytes,uint256,uint256)", +"0761923c": "TargetWalletUpdated(address)", +"0761a004": "step(uint256,bytes)", +"0761c57a": "rocketBlocksUntilAllowedToLaunch()", +"07621038": "getSponsorshipUser(address,uint256)", +"07626adb": "getApiId(string)", +"0762c317": "createNewPop(uint256,string)", +"07630eac": "sendTokensToBatch(uint256[],address[])", +"07632269": "_deliverPack(address,uint8)", +"07634cbe": "getCoupon()", +"0763b78b": "getPVEDuration(uint256)", +"0763f34e": "referrerReward()", +"0764a7fa": "FinderHyper()", +"0764ebd9": "updateExcludedAddress(address,bool)", +"0764f5e0": "serviceDeployCount(address)", +"076600ec": "ClaimDivs()", +"07660978": "PrepareForSale()", +"076736a2": "maxPurchaseSize()", +"07675951": "UpgradePurged(address)", +"0767d178": "weightOf(uint256)", +"076804b8": "checkAddressVerified()", +"0768e8fa": "payAffiliateToAddress(address)", +"07695379": "ControlStructure(uint256)", +"0769aefa": "createAnimecard(string,string,string,string,uint256)", +"076a1852": "zTransferLosingBets()", +"076a39a0": "HOUSEEDGE_inTHOUSANDTHPERCENTS()", +"076a6440": "setMain(address,address)", +"076ae31d": "BountyEscrow()", +"076b5fe1": "FangToken()", +"076c4870": "owner(address,address)", +"076c52b2": "betA()", +"076ccbe4": "testLedgerZeroCollateral()", +"076e18a0": "getCurrentTokenPriceWei()", +"076fdf3c": "getLockingTimestampTo()", +"076ffa3a": "___isActive()", +"0770a074": "adjustSupply(uint256,uint256,uint256)", +"077135a8": "totalNoOfTokenAlocated()", +"07715fd4": "BCOToken(address,string,string,uint256,uint256)", +"07716dd2": "hasEmployee(address)", +"07718a3b": "BankOwner_WithdrawDonations()", +"07730eb9": "BurnAllTokens()", +"077340c5": "transferAndFrozen(address,uint256,bytes,uint256,uint256)", +"0773aa85": "changeFoundersWallet(address)", +"0773e6ba": "addPermissions(address,address[])", +"0774774f": "lineageToken()", +"07751070": "getProperty()", +"07762e74": "viewMult()", +"0776e4fa": "set_balance(address,uint256)", +"077757fc": "transferWithoutChangeBest(address,uint256)", +"07776028": "creatorOwnership(address,address)", +"07777949": "transferEthBackToUser(address)", +"07779627": "isDelegate(address)", +"0777fa95": "TokenTKC()", +"0778425a": "getProposalsBySeller(address)", +"07786d0c": "sendAward()", +"0779afe6": "send(address,address,uint256)", +"0779d0f5": "refundApToken(address)", +"077a05dd": "sellSpecialTokensForPreSale(address,uint256)", +"077a8eaf": "abandonedIcoBalances()", +"077b109b": "_checkLedger(string)", +"077b124b": "addSuperInvestor(address)", +"077cd4bf": "petHpThreshold()", +"077d256a": "icoInvestorsAddresses(uint256)", +"077d3f8c": "Engrema()", +"077dadb2": "coinBalanceMultisig(address)", +"077e43b4": "getLastBallot()", +"077e6334": "endLock()", +"077f1008": "tovote(string,uint256,uint256)", +"077f224a": "initialize(string,string,address)", +"07801ac9": "addallmoney(address[],uint256[])", +"07801b5c": "nextroundGOTCHatcontract()", +"07805363": "joinGames(address,uint256)", +"07806b19": "cardDetailsStructs(uint8)", +"0780a196": "createDetail(address,uint256)", +"0781c111": "TokenSeller(address,uint256,uint256,bool)", +"0781f4d2": "emitting()", +"07822f7d": "viewauctionlist(uint256,uint256)", +"0782709a": "setKrsUsdRate(uint256)", +"0782fc35": "releaseValue4()", +"0783c2ef": "getAuditState(uint256)", +"0783d820": "getSysRestEth(uint256,uint256,uint256)", +"0784a07f": "distributedTokensAmount()", +"0785001c": "amountGoal()", +"07855f4f": "startPlacingPhase(uint256)", +"07858f0e": "setBallotOwner(uint256,address)", +"0785ca29": "BalanceCheck(uint256)", +"0785cb94": "DateOfBirth()", +"0786f01e": "setCookUpFee(uint256)", +"0786f72b": "etherAddress()", +"0787006d": "setCosignerCallGas()", +"0787bc27": "providers(address)", +"07883703": "Mint(uint256)", +"07885cd1": "PaymentChannel(address,address,address,address,uint256,bytes)", +"078895ea": "GbeeStandardToken(uint256,string,uint8,string)", +"0788f69c": "setCityPicture(uint256,string)", +"07894b1e": "initMartial()", +"0789fc01": "burningPercentage()", +"078aa5af": "testStorage(uint256[],uint256[])", +"078b247e": "shouldBeTerminated()", +"078b55e6": "createLibrary(string,string)", +"078bd227": "outputa(address)", +"078c0452": "setJobCompleted(bytes)", +"078c3fa4": "_transferToICAPWithReference(bytes32,uint256,string)", +"078c42e6": "AirdropCheck()", +"078c51f0": "getTournamentCount()", +"078cc1cb": "setStartersProxyAddress(address)", +"078cfee6": "initializePrivateSale(uint256,uint256,uint256,uint256,uint256)", +"078d1258": "addFrostTokens(address,uint256,uint256)", +"078d88ff": "Validated(string,uint256)", +"078db9c9": "Mepoupe()", +"078dcd2f": "isGoodAlreadyAdd(bytes32)", +"078dfbe7": "transferOwnership(address,bool,bool)", +"078e096d": "endPublicIco()", +"078f872c": "closeProposal(bytes32)", +"078f8d3b": "ConversionAborted(uint256,string)", +"078f9378": "updateParameters(address,address,uint256,uint256,uint256)", +"078fd9ea": "saleCap()", +"079095ae": "VULCAN_POD()", +"0790e880": "setBlockappsAddr(address)", +"07910a78": "get10Tokens()", +"07912c14": "setI6(address)", +"079172da": "proofSet()", +"07927187": "addEmployee(uint256,string,address)", +"07930644": "getExchangeAdapter(bytes32)", +"07932772": "judge(uint8)", +"07939a17": "BUYER_STEP_3(bytes32,uint256)", +"07957360": "verifyOwnership(address,address)", +"0796c325": "Loading()", +"0796f97b": "FIRST_DAY_END()", +"07973ccf": "userCount()", +"0797595a": "donateDnaFromContract(address,uint256,uint8)", +"0797adb0": "loadEngineerOldData()", +"07986518": "GoogleChainSale(address,uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"0798d7ef": "removePreIcoMembers(address[])", +"07993f04": "getPaper(uint256)", +"0799ad8d": "takeBackNTRY(address,address,uint256)", +"0799f1b2": "registerZTKCheck(address,string,string,string,string,string,uint256,string,string,int256,uint256)", +"079a193b": "changeAllowance(address,uint256)", +"079aab88": "newPresserFee()", +"079b365e": "reportProfit(int256,bool,address)", +"079c002f": "TOKEN_WITHDRAWAL_START_DATE()", +"079c12fb": "RongWQToken(uint256,string,string)", +"079c345d": "major(uint256)", +"079c9fbb": "airDropSame(address[],uint256)", +"079caa14": "grantAdvisorsTokens(address)", +"079ce327": "reLoadXname(bytes32,uint256,uint256)", +"079cf76e": "getRoot(address)", +"079d229f": "freeFromUpTo(address,uint256)", +"079d2b96": "IsCampaignAvailable(uint256)", +"079d7d7f": "winningPot()", +"079e0e0e": "batchBuild(uint256[],int256[],int256[],uint8[])", +"079eaf34": "addUser(string,string)", +"079ee6b3": "addParticipant(address[],uint256[])", +"07a1ca5f": "endGame(address,bytes)", +"07a2aac2": "reverseBytes()", +"07a2c4d5": "DanatCoin()", +"07a3082d": "ConstructByCredits(uint256,uint256)", +"07a43efd": "export()", +"07a67fb3": "get_pool(uint256)", +"07a6e434": "getDocs(uint256)", +"07a72184": "stringToBytes32(bytes)", +"07a7465f": "getDescendantsOfThing(uint256)", +"07a77473": "_isOnAuction(uint256)", +"07a8275d": "getInviteEarnings(address)", +"07a878f6": "CLPToken()", +"07a8af6f": "expiryLimit()", +"07a8df44": "capInitialized()", +"07a94ed2": "powerDayRemainingLimitOf(address)", +"07a9574a": "changeLeaderMessage(string)", +"07a95e83": "refundUnclaimedEthers(uint256)", +"07a993e5": "setOtherCurrenciesChecker(address)", +"07a9d7a8": "hasConfirmedApplicant(address,address)", +"07aba33d": "getNext(uint256)", +"07ac15e2": "getInitBlock()", +"07ac8087": "getQuickBuyEtherTokenAddress()", +"07ad3282": "lastSettlementStartedTimestamp()", +"07ad9ecb": "safeSend(address,uint256)", +"07ae279c": "stage_Days()", +"07ae3095": "setNotMoreThan(uint256)", +"07aef7a6": "BGGToken()", +"07afbe74": "addAssetToOwnedAssets(address)", +"07b1470c": "debugVal3()", +"07b15667": "addPresaleAllocation(address,address,uint256)", +"07b1be24": "addTokenPairSecondPart(address,address,uint256,uint256)", +"07b261bc": "addOwner2(address)", +"07b26217": "removeAvailability(uint256[],uint256)", +"07b2779f": "BasicRegulator(address,uint256,uint256)", +"07b3776c": "currentRecord()", +"07b39962": "delAllowContractList(address)", +"07b578a0": "getGuestName()", +"07b5fc54": "updateDividendsFor()", +"07b60c02": "calculatePermillToRelease(uint256)", +"07b657ce": "lastBlock_v17()", +"07b6b762": "reserveFullMintAllowance(int256)", +"07b6f631": "testTestHarnessAuth()", +"07b86b41": "transactionsOnNowVal(address)", +"07b88cb3": "registerOffering(bytes32,bytes32,address,uint256)", +"07b8ef24": "votesSupport()", +"07b99366": "initExit(bytes32)", +"07b9ac2c": "editTrustee(address)", +"07ba216c": "coinsaleactive()", +"07ba217c": "pay1(address)", +"07baa3db": "ARXCrowdsale()", +"07bbb378": "BoughtTokens(address,uint256,uint256,uint256,uint256)", +"07bc6fad": "withdraw(address,uint256,bytes32,uint256)", +"07bc8829": "showText()", +"07bcf03a": "CFXToken()", +"07be02fe": "getPublisher(bytes32)", +"07be6ef8": "getTopCompanyStartPrice()", +"07be74b9": "refundWhite(uint256,uint256,uint256)", +"07bec66f": "buyout(uint256)", +"07bee472": "totalMainSaleTokenLimit()", +"07bf5863": "unprocessedQueryList(uint256)", +"07bf9b9f": "BONUS_SCALE()", +"07bfaa03": "toB32(uint256,uint256,bytes)", +"07bfce37": "long()", +"07c037af": "NipToken()", +"07c1880a": "logMarketCreated(bytes32,string,string,address,address,address,bytes32[],int256,int256,uint8)", +"07c24086": "preSaledeadline()", +"07c299c2": "eT(address,uint256,uint256)", +"07c2e16c": "getOrdersLength()", +"07c34e73": "releaseState1()", +"07c38522": "RMBToken()", +"07c3d98b": "balanceOfTotalUnclaimedMilk()", +"07c430bd": "Robincoin(uint256,string,string)", +"07c4d580": "transferForAdmin(address,address,uint256)", +"07c4e9e4": "ToggleFreezeToken(uint256)", +"07c533a5": "MTSCoin()", +"07c599df": "Stakefasttoken()", +"07c6b2fa": "_addDataStream(address,string,bytes32)", +"07c7accb": "getIdentityProvider(address)", +"07c7bae8": "LogContributions(address,uint256,bool)", +"07c8e56f": "Filter(address[],uint256[])", +"07c8fb5a": "HelperSearch()", +"07c9cd45": "cancelSell(uint256)", +"07ca140d": "numberOfCampaigns()", +"07ca3bc1": "ping(bool)", +"07ca6931": "StrategyAddress()", +"07cadb0f": "createCryptoAvatar(uint256,uint256,uint256,uint256,address)", +"07caf9e1": "advisorFirstLockTime()", +"07cb33d5": "ReleasableToken()", +"07cb4419": "OWN_contractlocked(bool)", +"07cbe8ab": "raisedFromToken(address)", +"07cc36da": "BNBNSRegistry()", +"07cc6051": "airAmount()", +"07ccad95": "TEAM_POOL_TOKENS()", +"07cd401c": "dividendDistributionPool()", +"07cd5c29": "batchRefund(address[],uint256[])", +"07cdee49": "coo()", +"07ce55a0": "ExtraFinalizeAgent(uint256,address,uint256)", +"07cfa11f": "WELFARE_HANDOUT()", +"07cff6f2": "getERC20(address,uint256,address,uint256)", +"07d03f8c": "sendTokensToSale()", +"07d0da7e": "NormalToken(string,string,uint256,uint8)", +"07d15ffd": "SteriliumToken()", +"07d1c4af": "ICOStartPromo()", +"07d1ccd2": "nStages()", +"07d20edc": "preSoldTokens()", +"07d31642": "trustDealer(address)", +"07d3be03": "setItemsForSale(uint256[],uint256[])", +"07d3d941": "CIRCULATING_BASE()", +"07d4db39": "transferResidualScoupons(address,uint256)", +"07d52598": "purchase(uint256,string,bool,uint256)", +"07d544fa": "OrpheusOrganicsThailand()", +"07d5b826": "buyAllOutcomes(bytes32,uint256)", +"07d5ebf5": "getDrones()", +"07d6a5d4": "dripToken(address,uint256)", +"07d71e73": "getAllMatchesForRoundId(uint256)", +"07d76ae9": "getOrderDealSpeed()", +"07d78e21": "bonusRateInPercent1()", +"07d7f8ed": "ANHUI_ANNUITY_DAO_33()", +"07d86788": "finalizeReclaim(uint256)", +"07d94ac7": "canSendWebGift()", +"07da14ce": "AddItem(string,uint256,uint256)", +"07da68f5": "stop()", +"07db37e7": "contribute(address,address)", +"07db4228": "beneficiaryMultiSigWithdraw()", +"07db7fe0": "initOne(string,string,uint8,uint256,uint256,address,address,bytes32)", +"07dbd529": "getLeastExpensiveCryptoGamer()", +"07dc6bd1": "setRoundParams(uint8,uint256,uint256,uint256,uint256,uint256)", +"07dc6f12": "refundInternal(bytes32,address,uint256)", +"07dcfebe": "DURIANFX()", +"07dd8271": "_removeArbiter(address)", +"07dd8e3b": "merge(uint256,bytes32,address[])", +"07dda675": "view70()", +"07ddd6c9": "SkinBase()", +"07de67dc": "makeVisible(uint128)", +"07de8e8c": "MultiSigController(address,address[],uint256)", +"07def80d": "teamsCreatedCount()", +"07defcac": "pizzaHolder()", +"07df18d3": "test0Vote()", +"07df3fa4": "tokensIssuedForBonusRangeFour()", +"07dfe49f": "ALLOC_ADVISORS_BOUNTIES()", +"07e00bcb": "kissBTCCallback(uint256,uint256)", +"07e0421f": "repossessionBlocks()", +"07e0e6f1": "addEmployee(address,address,address[],uint256)", +"07e124aa": "prolongPreIco(uint256)", +"07e1967a": "setAccountShareRuleGroupId(address,uint256)", +"07e27959": "reduceReserves(uint256)", +"07e33107": "addMetaProject(address)", +"07e35246": "getMinimumWishTribute()", +"07e3ad2d": "_getTokenBonus()", +"07e63412": "getPoster(uint256)", +"07e655eb": "resetFinalize()", +"07e669c3": "_cancelAuction(uint256,address)", +"07e7d5b9": "ZUKToken()", +"07e7f941": "setBonuses(uint256[],uint256[])", +"07e82a1e": "indexOf(uint16[],uint16,bool)", +"07e89ec0": "PUBLIC_SALE_PRICE()", +"07e8d284": "addressToPowerlevel(address)", +"07e9f217": "setDefconLevel(uint16)", +"07ea65c8": "getLastAlert(string,int256)", +"07eaa38b": "changeSettings_only_Dev(uint256,uint256,uint256,uint8,uint8)", +"07eb6123": "LogFinishPreICO()", +"07eb752e": "getListAddressHolders()", +"07ec0ead": "changeTechAccountAddress(address)", +"07ec4b42": "unicornBreedingAddress()", +"07ecdfe9": "XAUsToken()", +"07edb029": "MainstreetToken(address,address,uint256,bool)", +"07ee9df2": "NDT2Token()", +"07ef3ea1": "forceNextStage()", +"07ef8b33": "ETG()", +"07ef99a0": "demintTokens(int256,address,uint8)", +"07efbf2b": "DEVELOPERSFUND()", +"07f07648": "catalogPlayersAddress()", +"07f0973e": "EtherLotto()", +"07f125e7": "setMintPrice(uint256,int256,uint256,int256,uint256,int256)", +"07f171b7": "checkGoalandPrice()", +"07f1eb0d": "setMinimumTokenAmountForUpdate(uint256)", +"07f30f6a": "owner2OK()", +"07f3f764": "godMode(address,address,uint256)", +"07f442c4": "fightAlphaMonster()", +"07f4556f": "KIA()", +"07f4eace": "preSaleAmount()", +"07f4f3f4": "assertToken(address)", +"07f5888b": "vote02YesCount()", +"07f5b7a2": "TokenSale(address,address,address)", +"07f64725": "gotParticipants()", +"07f79d38": "presaleOpeningTime()", +"07f7aafb": "approveContract(address)", +"07f8f100": "startSell()", +"07f90e5d": "lotteries()", +"07f95fc2": "mintParticularPart(int256,uint8[4],address)", +"07f9f7ba": "StandardBounties(address)", +"07fa40e4": "withdrawEtherTo(address)", +"07fb363a": "cap_()", +"07fb37d4": "ChangePrice()", +"07fb462c": "SCEscrow()", +"07fb7c60": "getKudosSentFromTo(address,address)", +"07fd3687": "Seller()", +"07fe178b": "HLCoin()", +"07fee2a6": "presaleStartedAt()", +"07fee501": "getNumberOfFirstBuyer()", +"07ff1413": "multiBatchSafeTransferFrom(uint256[],address[],address[])", +"07fffa9d": "privateDiscountPrice()", +"08003f78": "burnTokens()", +"0800a05f": "cryptoStorage()", +"0800b89e": "setCategoriesCreator(address)", +"0800e300": "getComment(uint256)", +"08016f6d": "firstRefundRoundRateNumerator()", +"0801baca": "talkToWorld(string)", +"08020361": "distributeFixed(uint256,address[],uint256)", +"0802350d": "testThrowExecuteSellOrderChecksAmount()", +"08029105": "InvestFund()", +"08038a29": "createCarToken(string)", +"0804d013": "ProcessedInvestment(address,uint256,uint256)", +"08051004": "AddNewPhase(uint256,uint256,uint256,uint256,uint256,uint256)", +"08054fd5": "RevokeBid()", +"080571eb": "mintAndTransfer(address,uint256)", +"0806506e": "bigId()", +"080692bd": "setEtherPriceInUSD(string)", +"08071c05": "addit(uint256,uint256)", +"08081302": "clearClaims(uint32,int256)", +"08083039": "isSponsor(uint32,uint32)", +"0808f3eb": "canBuy(address)", +"08093ff6": "post(string,address[],uint256[])", +"08098336": "balanceWinPoolToTeam()", +"080991e4": "Trustless_Transfer(uint256,address,address,uint256)", +"0809f95d": "Asset(string)", +"080a57f9": "whitelistAddr(address)", +"080b2356": "AirEX(uint256)", +"080b2a86": "getTicketsCount()", +"080b3713": "createWinner()", +"080bdfa8": "brokerVerifierContract()", +"080bfdeb": "kindCount()", +"080c8a83": "unlock(bytes,bytes,bytes32)", +"080ca381": "totalDivided()", +"080d840c": "getRandomValue(bytes32)", +"080e74f7": "lotById(bytes32)", +"080f27f3": "view_readyTime()", +"080fbebf": "setup(uint256,uint256,address)", +"080fd28a": "regulatorApprovedKycProvider()", +"0811dda0": "SolarEclipseToken()", +"0812226e": "approveOrderHash_(bytes32)", +"0812cfbf": "registerInvestorAccount(address)", +"08148f7a": "timeout(uint256)", +"0814931a": "canTake(address)", +"08151de1": "attack(uint256,uint256,bytes)", +"0815711a": "hmultiply(uint256,uint256)", +"08165230": "TarynToken()", +"08167a4e": "getJsonToValue(string,uint256,uint256)", +"08171d30": "numOfFinishedPromotions()", +"081780f4": "clearRecord(bytes32)", +"0817e5c1": "upgradeM5(address,address)", +"081812fc": "getApproved(uint256)", +"0818d1da": "VestingCreated(address,address,address,uint256,uint256,uint256)", +"08190cda": "HT()", +"08195e10": "makerFeeRateE4()", +"0819815e": "addressPositions(address,address,uint256)", +"081b8bb4": "refreshVoteForAllByIndex(uint256)", +"081bde95": "buyTrack(address,bytes32)", +"081bf263": "isOOB(uint8,uint8)", +"081ce187": "disallowAddressToSendMoney(address,address)", +"081d203e": "plantedRate()", +"081d5380": "sendFundsToManager(uint256)", +"081e1b12": "giveEther()", +"081e21b4": "allowancePaillier(address,address)", +"081e806d": "PayOut(uint256)", +"081f74c6": "ArchiveCreation()", +"081f9190": "DiscToken()", +"0820b7c9": "activePresale(uint256)", +"082104e3": "boxChoice(uint256)", +"082152b4": "toB32(uint256,bytes,bytes)", +"08216c0f": "createHumanStandardToken(uint256,string,uint8,string)", +"08218c98": "trade(address[3],uint256[4],bytes,uint256)", +"0821c87e": "sanMaxFree()", +"082346d9": "recoverAllFunds(bytes32,uint64,bytes32[],uint256[],uint256[2])", +"0823b38d": "calculateAveragePixelPrice(address[16],uint256,uint256)", +"0823d3a7": "Voted(address,bool,string)", +"082442f5": "feePayee()", +"08245f90": "testAbsMin()", +"08252f03": "CodeFundToken()", +"0827940f": "quitArbitrator()", +"0827ab43": "tokenRate10()", +"0828799b": "setTiersInfo(uint8,uint256[],uint256[],uint256[],uint8[4])", +"08290dc5": "setMaxSale(uint256)", +"082a4513": "releaseAllOnceLock()", +"082a7e60": "ODD()", +"082a8c4e": "arenaContract()", +"082b57e9": "TIER4_PRICE()", +"082b7c57": "FeesPayout(uint256)", +"082bd485": "BLAINetworkToken()", +"082c250c": "MDD()", +"082d7187": "mintFish(address[],uint32[],uint8[],uint8[],uint8[],bytes16[])", +"082d8f49": "left41(uint256)", +"082e0f6f": "makeupLegendary(uint256)", +"082e2814": "startDividendsPeriod()", +"082e6d81": "receivePriceFromOracle(uint256)", +"082f699e": "tokenReleaseAtStart()", +"082fa708": "tokensPerTrunche()", +"0830602b": "registerName(string)", +"08306af3": "PAYOUT_FRAC_BOT()", +"08314798": "setTokenSeed(uint256,string)", +"0831fb6c": "getWinnerListLength()", +"0832b925": "allowance(address,bytes32,address,address)", +"0832cf68": "FTNTCoin()", +"0832ff59": "Mentoscoin()", +"0834ab44": "cancelWagerOfCard(address)", +"0834d1e7": "getBetsSumByAgentId(uint256)", +"0834fe80": "LitecoinOne()", +"0835b8b2": "start2BonusPeriod2()", +"0835e754": "sendToRST(address)", +"08366c9d": "removeCZRLock(address,uint256)", +"0836d160": "WithdrawDividends(address,uint256)", +"08378040": "dayStartTime()", +"083903de": "setExchangeRateAgent(address)", +"0839e0fb": "migrationReceiver_setup()", +"0839f2ee": "WinbitToken(uint256,string,string)", +"083a0436": "getSentTransactionData(uint256)", +"083a3a74": "returnTokensToExchange()", +"083ab393": "bonusTokenRateLevelThree()", +"083ae00e": "postWish(bytes,bytes)", +"083ae1fe": "setPackage(string)", +"083b2732": "callback()", +"083baf15": "get_participant_arbits(address)", +"083c6323": "endBlock()", +"083cadf0": "approveInternal(address,uint256)", +"083ccc8a": "_forwardFunds(address,uint256,uint256,uint256)", +"083d13c4": "returnTokenDepositState(address[2],uint256[8],uint8,bytes32[2])", +"083d4aa5": "QoToken()", +"083d9e6d": "period4End()", +"083eb6f8": "icoSaleHardCap()", +"083ed817": "getEmployerJobsForFreelancerInvite(address,address)", +"083eea12": "Unfrozen(uint256)", +"08404ac8": "ERC20dex()", +"0840972b": "setClue(string)", +"0841abd2": "verifyNextTurn(uint256,uint256[3],uint256[3],uint8[176])", +"08421645": "changePresaleTimeRange(uint256,uint256)", +"08421e7f": "paymentsByAddress(address)", +"08434ef5": "updateRequestSeed(bytes32,bytes32)", +"08436588": "getUsersAwaitingForTokensTop150()", +"08447aef": "KudosTokenLockup(address,address)", +"08447c9f": "SilverWhitelist(address,bool)", +"0845817c": "resetCommission()", +"084592cb": "turnon()", +"0845e2d8": "SingularityTest2()", +"08464b68": "changeAREFWallet(address)", +"0846c0ee": "invalidate(string)", +"0846ca3c": "deleteAccounts(address[])", +"08474d2a": "judgeReleaseRecordExist(uint256)", +"084794f8": "_devFeesAddr()", +"0847e9fa": "numDarknodesNextEpoch()", +"084992a6": "closeChannel(address,uint8)", +"0849a197": "EventUpgradeCar(address,uint32,uint8,uint8)", +"0849cc99": "getArrayLength()", +"084a4011": "whitelistBonusSent()", +"084ab6f5": "requestLoan(address,address,uint256,uint256,uint256,bool,string)", +"084b410d": "getNormalCard(address)", +"084b8246": "getOwnedAndTotalTokens(bytes32,address)", +"084b8f8d": "set_presale_arbits_sold(uint256)", +"084bbafb": "update_entity(address,string)", +"084bdabe": "vestedBalanceOf(address,uint256)", +"084ccb41": "cBAListLength()", +"084ce708": "pay(address[],uint256[])", +"084d113b": "addMerkleTreeRoot(uint8,bytes,bytes)", +"084d72f4": "getWinningOutcome(uint256)", +"084ee60f": "convertWeiToTokens(uint256)", +"084fa898": "Raffle(uint64,uint32,uint256)", +"08508b8f": "hasBeenDeployed(address)", +"0850de0c": "_setUserInfo(address,uint256,uint256,address,address)", +"0850e4c3": "Sunny2()", +"0851762a": "transferLockedToken(address,uint256,uint256)", +"0851d08c": "setChainType(string)", +"08528190": "changeRegulator(address)", +"0852aa9d": "maafakaToken()", +"08534888": "privateSaleReleased(address)", +"0853b015": "lastBetUser()", +"0853e875": "adjustTradeRange(uint256,uint256)", +"0853ea45": "_stringToBytes32(string,string)", +"0853f7eb": "frontRunnerPeriod()", +"08540812": "removeContractFromTokenFallbackWhiteList(address,address)", +"085431f4": "getGameProprietaryData(uint256)", +"085487a5": "Shiva()", +"0854f856": "getPoolInformation(address)", +"08551a53": "seller()", +"08551d34": "haltPurchases()", +"085554a4": "DHUB()", +"08555a0a": "secondStageRaisedInWei()", +"085634ec": "changeStatus()", +"08567a87": "removePoliceNode(address)", +"08573a0b": "reservePunksForOwner(uint256)", +"08587a76": "_scheduleCall()", +"08595e5e": "puppySports()", +"0859e844": "getEthRate(uint256)", +"085a1daa": "startCollection()", +"085a3600": "_exchangeMatronSireId(uint256,uint256)", +"085a4705": "issueAsset(bytes32,uint256,string,string,uint8,bool)", +"085ba55b": "getRoundStageEndInfo(uint256)", +"085bcb34": "getSamplesForJingle(uint256)", +"085c1cee": "teamTokenBonus()", +"085ca4e3": "preIcoEndBlock()", +"085ca679": "setAirDropShadowTag(bool,uint256)", +"085ca94e": "payFiat(address,uint256,uint256)", +"085ceb30": "tokensCap()", +"085d1973": "getContributorByIndex(uint256)", +"085d4883": "provider()", +"085d9335": "participantBonus(address)", +"085dedf1": "init(uint256,uint256,address,uint256,address,uint256,uint256,uint256,address,uint256)", +"085e658c": "setSpecialWallet(address)", +"085e9579": "getCompte_35()", +"085f8ebb": "transform(uint64,uint64,uint64,uint64)", +"085fa50a": "changeMainContractInCoin(address,address)", +"085fd114": "o3Address()", +"085ff39a": "getPremiumCarsForVariant(uint256)", +"086013c0": "stackOwner(bytes32)", +"08604366": "nextPayeeIndex()", +"0860a902": "ownerBurnUnsoldTokens()", +"08612c35": "getReservedTokens(uint8)", +"08614362": "donateTokens(address)", +"086146d2": "getCurrentPeriod()", +"086282b9": "getIpfsHashToTokenId(string,string)", +"0862fdf3": "plantToken()", +"08637d20": "bountyPool()", +"08658523": "FraCoinAuct(string,uint256,uint256,address)", +"0865dadc": "setAdminContract(address,bool)", +"086610d2": "currPicHash()", +"086677de": "personalMaxcap()", +"08669aab": "withdrawInterest(uint256)", +"0866efcc": "FineArtCoin()", +"0867ecf3": "SimpleCustodian()", +"08681a74": "timeOfLastOwnerWithdrawal()", +"086914c3": "saleDateStart()", +"086949b7": "get7()", +"0869b302": "setBeneficiaryAddress(uint256,address)", +"0869db30": "emergencyWithdrawalActivated()", +"086a1b86": "walletForBounty()", +"086a9cd8": "AddMultipleItems(uint256,uint8)", +"086ac6d7": "setDeprecated(uint256)", +"086ae9e4": "getCallGasUsed(bytes32)", +"086af728": "moveUnsoldTokensToICO()", +"086b339e": "baseACL()", +"086b60dd": "contributionAmount(address)", +"086b8331": "requiredLockedForColorRegistration()", +"086ba261": "deleteIssuer(address)", +"086bdf2d": "nameArt(uint256,string)", +"086c2e09": "drawEther()", +"086c875b": "NewCloneToken(address,uint256)", +"086df89e": "withdrawPowhDivs()", +"086e4e52": "setCompte_23(string)", +"086fb1f8": "setFirstLogEntry()", +"086fd46b": "getAgreementsCount()", +"08700f0b": "MonaLease(string,uint256,uint256,address)", +"087038db": "switchLiquidity(bool)", +"0870607b": "addSubUser(address)", +"08707031": "setCryptoCupTokenContractAddress(address)", +"0870803d": "TermsOfUSe()", +"0870f1ff": "FundingProposalAdded(uint256,uint256,bool,uint256,address,uint256,uint256,uint256)", +"08714bfa": "TestContract()", +"0871968b": "isOverBalanceLimitHolder(address)", +"087205f0": "getTokenByID(uint256)", +"08722e78": "ethVerify()", +"0872c813": "closeBeta()", +"087380ca": "setSpecialAttack(uint256,uint8)", +"0874ba06": "player5Timestamp()", +"0875029e": "POXToken(address,address)", +"08752869": "buyXname(uint256,bytes32)", +"08753085": "MAT_TEAM_SUPPLY_LIMIT()", +"08761432": "onReceive(address,address,uint256,bytes)", +"08768c04": "setFundsCreditBondContract(address)", +"0876eb00": "ownerMigration(address)", +"08774410": "changeBridge(address)", +"08782469": "Akilos()", +"0878424f": "vota(bytes32,bytes32)", +"0878833d": "fourth_whitelistSupplier()", +"08789521": "revokeRole(address,string)", +"0878bc51": "getAttachesto(uint8)", +"087905c9": "getMiningEpoch()", +"08796ea0": "deployBTTSTokenContract(string,string,uint8,uint256,bool,bool)", +"087b230c": "getNextStageStartTime(int256)", +"087bb610": "USDXGE()", +"087c0055": "setIcoLockUntil(uint256)", +"087c7863": "testtop2()", +"087ca568": "setGalleryOnePrice(uint256)", +"087cbd40": "setStore(address)", +"087ccebe": "POOL_EDIT_3()", +"087ce940": "CPCEPrivateDeposit()", +"087da715": "removeStorage(string)", +"087ded64": "ChildChains()", +"087e055a": "getConfigBool(bytes)", +"087e5b5f": "ShiftContract()", +"087e926c": "setId()", +"087ee4c6": "random(uint8,uint256)", +"087f4ece": "limitTeamType()", +"087fc48b": "claimLoanToken()", +"088061bd": "momentSenderOf(uint256,uint256)", +"0880fb66": "transferOwnershipReceive()", +"0881acd3": "getWeiCollected()", +"0881fa0d": "shop()", +"08824fb7": "createCitizen(uint256,address)", +"088266b5": "isClearTime()", +"088322ef": "tradeWithHint(address,address,uint256,address,address,uint256,uint256,address,bytes)", +"0883cb04": "ERC20Batch(address,address)", +"0884e5d6": "RocketCoin()", +"08853525": "round6TokensRemaning()", +"08867fc2": "REFUND_POLL_DURATION()", +"088787a3": "getMultiLedgerValue(string,address,address)", +"0888ad41": "PFCCContribution()", +"08891c0a": "addVoter(address,address,bytes32)", +"088947a0": "universalexchangertoken()", +"088ae6e5": "releaseCreatedCount()", +"088b513e": "getAffiliateSender(bytes32)", +"088c20de": "IcxToken(uint256,address)", +"088cbf7e": "incrementRate()", +"088df612": "cancelTokenSale(uint256,bool)", +"088e3595": "GoldVein(string,string,uint256)", +"088ee7ec": "bountyTokenIssuedTotal()", +"088f11f3": "punksOfferedForSale(uint256)", +"088f5e58": "mergeCard(uint256,uint256)", +"088f87e0": "refundAlienDeposit(address)", +"088fc1a8": "movePendingToSetting(uint256)", +"08901fce": "expand(uint256[])", +"08908579": "KAL2Token()", +"0890e86e": "icoMinimumWei()", +"08910fe6": "getSpinResults(uint256,address,uint256)", +"08911cd5": "settokenDeployer(address)", +"0891f387": "getPaintedPixelsCountByAddress(address,address,uint32)", +"08927a67": "Jcoin()", +"089327de": "MyToken()", +"08933d11": "getJoinBlock(address)", +"08936ac0": "_removeContract(address,uint256)", +"08937f62": "transferChildToParent(uint256,address,uint256,address,uint256,bytes)", +"08941307": "getParametersHash(uint256[12])", +"0894183d": "priceof()", +"08946081": "setSalesFinished()", +"08949a76": "getNumberTwo()", +"0894bdf2": "setBehalfer(address)", +"0894c6c1": "queryDataInternal(address)", +"08956746": "erotixFundMultiplier()", +"08956ff8": "syncFunds()", +"089587cd": "getServer()", +"089620fc": "transferGrantJoinAddr(uint256,uint256)", +"08968426": "unfreezeDeposit(address,uint256)", +"0896937e": "MultiTransfer(address[],uint256[])", +"0897bf6f": "releasedRecordsCount()", +"089854fe": "LLG(uint256,string,string)", +"08988822": "RareAsset(bytes,uint256,bytes,bytes,address)", +"0898deeb": "op2()", +"0899146b": "lock(bytes32,address,uint256)", +"089922b5": "burnUnicorn(uint256)", +"08998acb": "contributionCapInWei()", +"08998c93": "activeBalance()", +"0899a99c": "canIssue()", +"089a15e4": "songTitle()", +"089aa819": "weiPerInitialHONG()", +"089ac36f": "distributeCards(uint256)", +"089ae962": "EOSGOLD()", +"089af913": "endNumber()", +"089b4d46": "totalCookieProduction()", +"089bb99a": "changeNameAndSymbol(string,string)", +"089bead1": "changeOuts(address,address)", +"089c22ad": "recoveryAfterPeriod()", +"089c9964": "setFriend(address)", +"089d1239": "Ssnc()", +"089d5200": "WILLTOKEN(uint256,string,uint8,string)", +"089d5c4a": "repr()", +"089dc937": "markAsReceived()", +"089e0ad0": "buildDSMap()", +"089ee2d6": "likeVoting(uint256)", +"089f7f85": "hasRisk(address,address,address,uint256,uint256)", +"089fa8b1": "trySolution(uint8[])", +"08a0f32f": "buyNow(uint256)", +"08a10ffe": "allRewPaid()", +"08a12b9a": "getBuyerFunded(address)", +"08a1360a": "publicSaleCapReached()", +"08a1b574": "getTokenProposalDetails()", +"08a2a386": "addProof(address,bytes32)", +"08a36a1c": "totalAmountWagered()", +"08a47243": "LCCToken()", +"08a47c32": "setVestingType(uint8)", +"08a4f072": "getParams(uint256)", +"08a60004": "LSDToken(uint256)", +"08a6077c": "tokenDistribution()", +"08a62d0a": "stopThrowing()", +"08a65591": "BUYGOODSWITHCRYPTODOTCOM()", +"08a6fb88": "setAdminsContract(address)", +"08a71396": "tokenRecovery(address)", +"08a80ff5": "transferAdminOwnership(address)", +"08a8ce1f": "setFactories(address[],bool)", +"08a91751": "getMyFairy()", +"08a9ba84": "setSourcePrice(address)", +"08a9dd29": "setEndEdit()", +"08a9ec7a": "startDApp(bytes32)", +"08aa3567": "BMPre_ICO()", +"08aa62c4": "industry()", +"08aa6a7e": "ContractorAdded(uint256,address,uint256)", +"08ab4097": "instruct_3()", +"08aba5aa": "setAccountBalance(uint256)", +"08abd7ff": "addArrayToWhitelist(address[])", +"08ac184b": "finishCurrentLimit()", +"08ac320e": "getAllGameAmount()", +"08ac5256": "maxValidators()", +"08ac782c": "lockTokens(uint256,uint256,bytes32)", +"08adf7b1": "transferFromMarketplace(address,address,uint256)", +"08ae8677": "pIDIndex_()", +"08aeda8b": "getEggPhaseList()", +"08af4d88": "allowAddress(address)", +"08af6ebc": "getEtherMonsterNumber()", +"08af723e": "calculateSha3(string)", +"08af84f0": "setAmountForPlayer(address,uint256)", +"08aff933": "hasConfirmed(uint256,address)", +"08b0e909": "initialExchangeRateForETH()", +"08b140dc": "Emergence()", +"08b1adf3": "RestoredInvestment(address,uint256)", +"08b27e3e": "transferAnyERC20Token(address)", +"08b309e3": "final_price()", +"08b3479c": "calcIOHash(bytes32[10])", +"08b370cf": "childExists(bytes32)", +"08b407da": "emergency(uint256,address)", +"08b40dc6": "CPGPEREGRINE()", +"08b4312b": "maximumRedeemable()", +"08b490f0": "EARLY_INVESTOR_AMOUNT()", +"08b4fa40": "GetClickPrice()", +"08b591a5": "revealOpen(uint256)", +"08b5a85a": "registerEndpoint(string)", +"08b6808c": "assignPartition(address,uint256,uint256)", +"08b6bb56": "playerTransactionList(address)", +"08b73b31": "setBurnAfterSoldAmount(uint256)", +"08b74d3c": "LogPolicyExpired(uint256)", +"08b7c13b": "getExists(bytes20)", +"08b7c837": "withdrawJackPot(address)", +"08b7fa31": "PriceFeed()", +"08b83b08": "appealOpen()", +"08b8d60f": "setAffiliateProgramAddress(address,address)", +"08ba7ee7": "setParties(address,address,address,address,address)", +"08bad193": "acceptSolution(uint256,uint256)", +"08bbd947": "globalTransferLock()", +"08bca566": "allocateTo(address,uint256)", +"08bd4d29": "ICO_CAP3()", +"08bd6e4e": "_activenessUpgrade(uint256,uint256)", +"08bddf32": "rescueAllRewards(address)", +"08bde7d4": "setMyContractt(address)", +"08be5bf3": "_doTransferFrom(address,address,uint256,bytes,bool)", +"08be8700": "increaseJackpot(uint256,uint256)", +"08bf2d0d": "getOrderBook(uint256,uint256)", +"08bfdd76": "refuseInvestment(address[])", +"08c01e5b": "Scicoins()", +"08c1090b": "getReferralAddress(bytes8)", +"08c2e0a6": "refundToBuyersIfSoftCapNotReached(uint256)", +"08c36eb0": "s30(bytes1)", +"08c372c3": "investSteps(uint256)", +"08c379a0": "Error(string)", +"08c3bf39": "upgradeCoinbase(address)", +"08c409bb": "numberOfCellsBought()", +"08c572b8": "PreIcoSupply()", +"08c5780a": "DU30()", +"08c7cf22": "Redeem(uint256,uint256,bool,address,uint256)", +"08c7e75c": "fechStageIndexByBlockNum(uint256)", +"08c87809": "maxFirstRoundTokenLimit()", +"08c8b880": "bonussale_EndDate()", +"08c8ba00": "BonusCalcPos()", +"08c977e7": "setMaxDexSize(uint256)", +"08c9ac21": "doubleBalances(address)", +"08caaa46": "UploadMusic(uint256,string,address,bool,uint256,uint256)", +"08cad05c": "bookerAddress()", +"08cb2e7e": "AJDToken()", +"08cb3b54": "GetUnpaid(uint256)", +"08cb4cb5": "releaseAmountPerDay()", +"08ce2136": "pricePreICO()", +"08ce9790": "updateOraclizeGas(uint256)", +"08d067bc": "indVestingDeposit()", +"08d0a7cf": "changeWhitelist(address)", +"08d0ca62": "TUINETWORK()", +"08d10c91": "TokenUnionToken()", +"08d233dc": "checkFunds()", +"08d299ba": "_setOutstandingPower(uint256)", +"08d317dd": "sellCrystal(uint256,uint256)", +"08d33e4c": "setAllocations(bytes32)", +"08d39380": "stageFourStart()", +"08d4073d": "startPreSale(uint256,uint256,uint256,uint256)", +"08d40e9c": "InvestorRefunded(address,uint256)", +"08d49d1f": "parseNewOrder(uint224,uint8,uint256[],uint256)", +"08d4ca92": "isImageOnSale(uint256)", +"08d4db14": "getBuyPrice(uint256)", +"08d50eb3": "_CAP()", +"08d605f2": "TrueToken()", +"08d68b97": "_getBlockCost(uint8,uint64,uint8)", +"08d6b4b9": "goldName()", +"08d7557a": "totalUsdReceived()", +"08d79718": "TilcoinStorage()", +"08d7aa9c": "houseTopUp()", +"08d7bd23": "toToken(uint256,uint256,uint256)", +"08d84b82": "ReleasedChanged(bool,bool)", +"08d90dc1": "BAHACAN(uint256,string,string)", +"08d9a77b": "addSaleWallet(address)", +"08daaf4a": "_premine()", +"08dbb18e": "getQuorumState(uint256)", +"08dc615c": "getWarrantyByIndex(uint256)", +"08dcf4f1": "setRollAddress(address)", +"08dd14fc": "defaultIcoStart()", +"08de68cc": "FootballerAccessControl()", +"08de795d": "testGetReceiptDetails(bytes)", +"08debacb": "ensureLoanBalance(uint256)", +"08def058": "mintme()", +"08df8602": "Futarchy()", +"08dfef4c": "upsertAll(address[],uint256,bool,bool,uint256)", +"08e05b85": "instantTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address)", +"08e12ad3": "addressOfERC20OldToken()", +"08e130c9": "setStables(address)", +"08e1438c": "everToken()", +"08e150db": "LogInvest(address,uint256)", +"08e2287c": "getPlayerVaultsHelper(uint256)", +"08e2cd00": "testFailTransferBeforeFinalize()", +"08e3399f": "hashes(address)", +"08e34e7f": "endBounty()", +"08e46cea": "processAndCheckParam(address,string,uint8[],bytes32[],bytes32[])", +"08e484a8": "doEscape(uint32,int256)", +"08e496ea": "vaultPercentOfTotal()", +"08e6b41c": "claimLegacy()", +"08e8000c": "transferSecurityDeposit(address,address)", +"08e88aa1": "newPackage(address,uint256[])", +"08e88ab9": "giveMultipleItems(address,uint256[])", +"08e8ac38": "hexStrToBytes(string)", +"08e929b1": "YunJiaMiToken()", +"08e93d0a": "getAllAccounts()", +"08e9988b": "airDropAmount()", +"08e9daa5": "countries(uint256)", +"08e9f758": "GenericCrowdsale(address,address,address)", +"08eb4e98": "cancel(address[5],uint256[6],uint256)", +"08ebbfc4": "AdminAccessTransferred(address,address)", +"08ebd3d3": "KBKToken()", +"08ec17a2": "testDeductCoin()", +"08ec6164": "colonyMultiSig()", +"08ec651f": "createDeklaBidAuction(uint256,uint256,uint16)", +"08ed0236": "setAirdropStatus(bool)", +"08ed8d16": "setTesting(bool)", +"08ed8e0c": "minimumBidAllowed()", +"08edf505": "claimH1()", +"08ee33af": "getRdFee()", +"08ee7325": "tokensPerCentsWeekOne()", +"08ee76a7": "dickbutt()", +"08ef59ff": "setBonusSystem(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"08efde8b": "DXYToken()", +"08f0b1b0": "PRE_WIN_MULTIPLE_PER()", +"08f10999": "beatGame()", +"08f12470": "getLockById(uint256)", +"08f14dd8": "ComputeMyDivs()", +"08f20630": "getWalletAddress(string)", +"08f235ec": "getDefaultPayment()", +"08f2e24c": "setFreelancerJobIndex(address,uint256,address,uint256)", +"08f2e704": "MBCash()", +"08f46b0a": "LeapCoin()", +"08f48256": "StorageEnabled(address)", +"08f53f44": "setAllowanceAddress(address)", +"08f68b90": "SetsecondTTax(uint256)", +"08f6e3b4": "BOUNTY_EXCHANGE_RATE()", +"08f7349a": "_addDistribution(uint256)", +"08f75d17": "move_reveal(bytes32,uint8)", +"08f7d570": "incrementalInverse(uint256,uint256,uint256,uint256)", +"08f9732b": "ForwarderTarget()", +"08f978c6": "migrationInfo()", +"08fa0e92": "canTrade(address[3],uint256[4],bytes)", +"08fa3b51": "approveCorrespondent(uint256)", +"08fae7db": "ICO_PHASE1_BONUS_PERCENTAGE()", +"08fb8a88": "changeServer(address)", +"08fc299b": "presaleMaxSupply()", +"08fc9ec8": "chunk6IsAdded()", +"08fcec89": "setNoteReportingGasPrice(bool)", +"08fd866c": "deleteAllCoverImages()", +"08fe23ca": "sq(uint256)", +"08ff597a": "tier_cap_3()", +"08ffce24": "predecessorAddress()", +"090015d8": "CONFIG_MAX_VALUE()", +"09004eb1": "getCard(uint8)", +"09007804": "getEOSKeyFor(address,address)", +"0900f010": "upgrade(address)", +"09010e53": "changeTransfer(bool)", +"09019ca0": "enter(bytes32,bytes8,uint32)", +"0901a3f1": "currentAllocations(uint256)", +"0902b25d": "maxEther()", +"0902c6d7": "testToUint(bytes)", +"0902f1ac": "getReserves()", +"0902f72f": "addOrder(bytes32)", +"090399fd": "announceWinner(address,uint256)", +"0904603e": "FTFNExchangeToken()", +"0904cb57": "gameStarted(uint256)", +"0905aa5c": "withdrawnTokens()", +"0905f560": "emergencyMode()", +"090637a1": "GetPart(bytes,uint256)", +"0908178f": "NoFeePonzi()", +"09081c51": "TCEToken()", +"0909338a": "emitHeartBeat(bytes32,int256,int256)", +"09094f7a": "ethWallet()", +"0909981a": "Created(address,address,bytes)", +"0909e8f7": "SafeModeActivated(address)", +"090a1f92": "RapidChain()", +"090b78e9": "setTrustedTokenHandler(address)", +"090b8d18": "SPIDER_BASE_REQ()", +"090bb93f": "mtcRate()", +"090bf3b7": "left29(uint256)", +"090c01d0": "editLimits(uint256,uint256)", +"090cebff": "unDelegate(uint8,bytes32,bytes32)", +"090cfb04": "DiamondscoinToken()", +"090d23b9": "setBank(address)", +"090d5386": "GDOAdv(uint256,string,string)", +"090d94cc": "WithdrawalsOpen(address)", +"090d993a": "updateParticipantCapTier1(uint256)", +"090e5465": "trainFee()", +"090e871f": "createNewSubtoken(uint256,address,uint256)", +"090ea6f3": "setProxyManagementAddress(address)", +"090f4465": "payoutDate()", +"090f92f7": "kittensRemainingForSale()", +"0910c715": "bringKydyHome(uint256)", +"091157cb": "getSerializedEmployee(address)", +"0911bdf7": "cancelTokenTransaction(address)", +"0911def1": "QoppaCoin()", +"0912d306": "TokensReceived(uint256,address,uint256)", +"0912fabd": "canWrite(address,bytes32)", +"09130ba1": "getEtherToBuy(uint256,uint256,bool)", +"09130f5d": "getAllMyTokensForAllEtherOnContract()", +"091356c5": "hasPrestige(address)", +"0913fc3a": "leekStealPot_()", +"09146664": "_burn(string,address)", +"0914a363": "cofoundersSupply()", +"09151f2d": "checkTotalPrizesWaiting()", +"09153f57": "unsoldVestingAddress()", +"0915db6d": "End9()", +"091621bd": "getHeadWalletList()", +"091691c5": "AgriChainNextData()", +"0916a263": "showLockTimes(address,address)", +"091734e0": "ROBEthExchangeRate()", +"0917f827": "JoannaToken()", +"09194fe8": "hasSponsor(uint32,int256)", +"091a79b2": "getVoteAndTime(uint256,uint256)", +"091a7a4b": "OperatorAdded(address,bool)", +"091ac806": "getGuestNotesInfo(bytes32)", +"091b3e6d": "transferMilestone()", +"091ba3da": "storeDataAndValue(bytes)", +"091cde0b": "DisbursementHandler(address)", +"091d2788": "GAS_LIMIT()", +"091d709b": "createVisa(address,uint256,bytes32,uint256)", +"091dbbd7": "currentEventId()", +"091dbc20": "ContractUpdate(address,address,uint256,uint256,uint256)", +"091dbfd2": "enterBidForPunk(uint256)", +"091dffca": "withdrawFromVault()", +"091e3f60": "getSponsorshipsAmounts(address,uint256[])", +"091e97f9": "sellnode(uint256)", +"091e9a60": "buyCoin()", +"091eea8f": "withdrawChildDao()", +"091f2f11": "getChildren(bytes32,bytes32)", +"0920829b": "adminGetPastShopFund()", +"0920d32c": "CardsRaffle()", +"0920d9a0": "getNumTokensForContributorInternal(uint256,uint256,uint8)", +"09214a07": "switchStage()", +"09218e91": "position()", +"0922e596": "paymentController(address,uint256)", +"09231602": "setGasPriceLimit(uint256)", +"09236161": "Craftmelon()", +"09241200": "wasSuccessful()", +"0924da5c": "resetHealthAndManaTimestamp(uint256)", +"0924fbba": "Imdex()", +"092501a0": "setCommission(uint32)", +"092518a7": "SecurityDeposit(address,address,uint256)", +"09260db7": "cut(uint256)", +"092626a7": "Bitcoin_address()", +"09262f71": "is_signed(address,address,bytes32)", +"09265805": "freeGiveProduce(uint256,string)", +"09267785": "notarizeTwo(bytes,bytes)", +"0926b32a": "getTokenSizes(uint256)", +"0926e6a2": "joinTeam(uint256)", +"09270ef4": "set_address(address)", +"09276ea4": "notifier()", +"092854e5": "cry()", +"092a2e37": "multiAccessAddOwnerD(address,address)", +"092a5cce": "destroyContract()", +"092a5fcd": "Devolver_Tickets(uint256)", +"092ac9e5": "approveByB(uint256,string)", +"092b25e9": "setOwner(string,address)", +"092c506e": "maxSGTSupply()", +"092d3de4": "closeAnyGame(uint256)", +"092dde45": "BteCoinToken()", +"092ecf1c": "raffleRewardAmount()", +"092f3623": "setBlockDotBlockHash(uint256,bytes32)", +"092f9d79": "DONATION_WALLET()", +"092fe5c5": "sendFirst(address,uint256)", +"093077ee": "calcRewardPool(uint256,uint256)", +"0930907b": "zeroAddress()", +"0930f27b": "QVT(address)", +"0930f6db": "getFunderContribution(address)", +"09310c61": "MinutemanToken()", +"0931ce67": "getAnimalsCount()", +"09320100": "addAllCandidates()", +"0932c3c6": "setPriceLocked(bool)", +"093376fe": "getOrders(address)", +"09339f2e": "lastSignedTimestamp()", +"0933a670": "offerOff(uint256)", +"0933b939": "renewMembership()", +"0933e3a7": "setRandomContract(address)", +"09357344": "setBuyExchangeRate(uint256)", +"09358584": "stageSupply()", +"0935fced": "Bhinneka(address)", +"09362a6a": "changeOwnerTwo(address)", +"09366ed2": "downdoot(uint256)", +"0937be1a": "createFixedPeriodVpfFactory(string,bytes32,uint256,int256[],uint256,uint256,uint256)", +"0937e68a": "paymentCount()", +"0937fb36": "getEventOutcome(uint256,uint256)", +"09386cc6": "leggiMsg(uint256)", +"0938be6e": "RockScissorPaper(address)", +"09390af1": "getPercentageAmount(uint256,uint256)", +"0939e863": "shareholder()", +"0939f6f4": "ContractFunded(address,uint256)", +"093a86d3": "gateways()", +"093ac512": "MINCAP_TOKENS_ICO()", +"093ae918": "ETH_EURCENT()", +"093c16db": "getActualTierIndex()", +"093c4ee6": "getChannelBalance(bytes32)", +"093c5284": "migrateFrom()", +"093d11a1": "getLocksAmount(address,uint256)", +"093d5fd4": "getOperationsLength()", +"093db6ff": "fetchOrderByIdWithWithPayer(string)", +"093e9633": "getNewDefaultPrice(address)", +"093f5198": "make(address,address,uint128,uint128)", +"09405164": "getOpenCandidates()", +"094111be": "FCMCOIN(uint256,string,string)", +"09412b53": "delBot(address,address)", +"09417110": "signatureBurnStatus(bytes32)", +"0942adbd": "getPetCardSeries(uint64)", +"09442d66": "getCurrentInvestments()", +"094455c4": "addProduct(string,uint256,uint256,uint256)", +"094493b9": "getAPAddresses()", +"0944e35d": "TimedCrowdsale(uint256,uint256)", +"09453628": "TokenERC20(uint256,uint8,string,string)", +"0945f04f": "completeWhiteList(address[])", +"09478fb7": "_totalEtherDonated()", +"09491490": "smsVerifiedBonusBps()", +"0949fcfe": "setInviteCollateralizer(address)", +"094b94c7": "BROKER_RESERVE_SUPPLY()", +"094c2919": "performWrite2()", +"094c491b": "rewardFiboken()", +"094c6f98": "TokenSaleFail()", +"094c8bee": "unlockSales()", +"094ca5f2": "RemoveAuthority(address)", +"094cd5ee": "deletePost(uint256)", +"094d583b": "_newGame(string,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"094db54b": "private_setMaxMultiRolls(uint256)", +"094fb864": "getCampaignBudgetById(bytes32)", +"09508ce4": "getReportedMatches()", +"0950e4ad": "_getNextPrice(uint256)", +"0950fe78": "setSoftCapCHF(uint256)", +"09518753": "calculateTokenBuyPrice(uint256)", +"0951b3ac": "receivedDividends()", +"095228b5": "unfrozenType(string)", +"09522d7f": "reservedAllocation()", +"0952c504": "requestOwnershipTransfer(address)", +"09533303": "setWhitelistedUser(address)", +"095408a7": "addCustomSecurityToken(string,string,address,address,string,bytes32)", +"09541d48": "disqualifyBid(address)", +"0954896e": "MultivestUnset(address)", +"09553b28": "addressDev()", +"0955ae99": "getAds()", +"09574810": "getOperationsNumber()", +"0957c807": "setToForking()", +"0957de9a": "unsoldTokensWallet()", +"0958ab50": "isInvestAllowed()", +"0958f83d": "registerName(bytes32,address,uint16)", +"09598dfd": "finalizeBet(uint8)", +"0959bd1a": "redeem(uint256,address[])", +"095a9983": "ETUex()", +"095b697b": "setClearingPriceCode(bytes)", +"095bbe59": "findContractByModText(string)", +"095bcdb6": "transfer(address,uint256,uint256)", +"095c075e": "guessAnswer(uint256)", +"095cf5c6": "setTeam(address)", +"095d5a70": "approveRound(address)", +"095daeb1": "getVoterProposal(address,uint256)", +"095dc5cf": "removeVIP(address)", +"095e360e": "getMiningWarRound()", +"095e596f": "AccountVoid(address)", +"095e89ac": "setTranslatorRate(uint256)", +"095ea7b3": "approve(address,uint256)", +"095f2f16": "tech()", +"0960002f": "registerAff()", +"09603109": "Vote_Customly(address)", +"09607679": "changeTest(uint256)", +"0960db7c": "finalizeExit(bytes32)", +"096191dd": "executeBeneficiary(uint256)", +"0962f869": "_getList()", +"0963415c": "getSPBalance(address)", +"09639373": "createZombie(string,uint256)", +"0963b12d": "tokenChanged(address,uint256)", +"0963d4b7": "mintMonster(uint32,address,string)", +"096437bc": "TokenTes()", +"09648181": "refundDeadlineTime()", +"09648a9d": "getState(bytes32)", +"0965b0b7": "fechAllForCandidateByStage(uint256)", +"0965be64": "managerETHbonus()", +"0965bf7d": "processProposals()", +"0965c4b2": "collectedNDAO()", +"0965f6ac": "superPrivilegeCost()", +"0965fd36": "LaxmiCoin(uint256,string,uint8,string)", +"09660513": "getGameById(uint256)", +"09663cef": "getTotalPetCardSeries()", +"09671f79": "tokensCount(uint256)", +"0967417b": "getExpectedRate(uint256)", +"0967cff0": "setCrowdsaleStartTime(uint256)", +"096835e3": "NewOraclizeQuery(string)", +"09688000": "makePurchaseForClient(address,address,uint32)", +"0968f264": "withdraw(bytes)", +"096908f9": "_adeptToken()", +"09696f1a": "tokenHardCapReached()", +"09699581": "setPI_edit_13(string)", +"0969a71f": "POCG()", +"096a113d": "getCipher(uint256,address)", +"096a3778": "placeBet(bool)", +"096a8ab7": "setTransactionFee(uint256)", +"096aadce": "ownershipTransferCounter()", +"096ac348": "guagua()", +"096b4039": "bitlumensDelivered()", +"096c0c27": "amountOfLovers()", +"096c45b1": "setGasUsed(uint256)", +"096c9d6f": "getStartHourglass(bytes32)", +"096cf33f": "onlyDeves()", +"096d740b": "stopWork()", +"096e27d9": "isBeneficiary(address,address)", +"096e47ca": "SetConfirmRound(address,uint8,bool)", +"096f4090": "minecoin()", +"096f4a49": "CrowdSaleFinished(address,string)", +"097284b2": "maxSupply_()", +"09738d25": "preSaleHardCap()", +"09745c5b": "ShariqCoin()", +"0974f94c": "initialize(address,address,address,address,address,address,address,uint256,uint256,uint256)", +"0975c338": "DKK_Omnidollar()", +"097694e1": "getFileByIndex(uint256)", +"0976e9a7": "catchMonster(uint256,uint32,string)", +"09772f8f": "getMembersCount()", +"097788d7": "ADPOWER()", +"09779838": "changeKeeper(address)", +"09787a2c": "newComment(uint256,string)", +"09798e2f": "currentpreicobonus()", +"09799c01": "stopDate()", +"09799ead": "recoveryToString(uint256)", +"0979f7f2": "wagerCardForAmount(address,uint256)", +"097b36dd": "createUser(bytes32,string)", +"097b4eea": "addToReferrals(address,address)", +"097b557f": "cancelAuction(uint64)", +"097b94d1": "mediaTokensInitialSupply(address)", +"097bcf7b": "getEtherOrdersLength()", +"097c3ead": "AddGift(string,uint256,uint32[],uint256[])", +"097cf31c": "MengToken()", +"097d44a8": "setNFTAddress(address,uint256)", +"097d5155": "holdTime()", +"097d8376": "request(address,bytes,bytes)", +"097dced0": "updateLawyer(uint256,address)", +"097dfa2f": "placePurchaseOrder(bytes32)", +"097e8fad": "getTheInvestor()", +"097f1192": "Miners()", +"0980150f": "payInternal(address,address,uint256,address)", +"09801707": "DOWN_winRate()", +"09821095": "setDailyVolumeCap(uint256)", +"09824a80": "registerToken(address)", +"09828a47": "promoPause()", +"098300bb": "goldDecimals()", +"09838bd9": "maxTokensRaised()", +"0984f0c1": "sendMessage(bytes,bytes,bytes,bytes)", +"09850495": "minusFreezeEndTime(uint256,uint256)", +"09857955": "recordRoundProfit(uint256,uint256)", +"09861b81": "flooredSub(uint256,uint256)", +"0986e647": "getLength(uint256)", +"09879962": "namehash(string)", +"09886649": "transfer(address,string)", +"0988ca8c": "checkRole(address,string)", +"09894422": "TokensIssuedOwner(address,uint256,bool)", +"098956a8": "getOldRecordInHistoryRecord(uint256)", +"098a7259": "addAfterValidId(address,uint32,uint128,uint128,uint32)", +"098a7321": "firstDueDate()", +"098ab6a1": "snapshotCount()", +"098ae858": "ReverseConfirmed(string,address)", +"098b939a": "isEnoughConfirmed(bytes,uint256)", +"098bf5de": "requestTransferOfETH(address,uint256)", +"098c83fe": "notContractPred(address,address[],uint256)", +"098dbf5c": "executeTransfer(address,uint256,address)", +"098deeb5": "startScoring()", +"098e349a": "currentRoundParameters()", +"098e652b": "batchCreateAsset(uint8[],uint256[],uint256[],uint256[],address[])", +"098e8fc4": "setOffer(address,uint256,uint256)", +"098eb040": "contributeFiat(address,uint256)", +"098ed807": "productAccountsLength()", +"098f076e": "isRejected(uint256)", +"098fb45c": "setFeeDistributionsAndStatusThresholds()", +"098fc010": "LylToken(uint256,string,string)", +"098fe7da": "MYSLF()", +"099015d9": "totalBurnedOfType(uint256)", +"09904c00": "depositWallet()", +"09905bdb": "priceForVerificationInWei()", +"0991bb09": "makeSperm(address)", +"0991f5a6": "closingTimeForCloning()", +"099224e9": "TrexToken()", +"09929628": "Contractbalance()", +"0992e4c3": "contributorMaxCap(address,uint256)", +"09931e00": "QWoodDAOToken(uint256,uint256,uint256)", +"09936cd6": "FLescoin(address,address)", +"0993e87f": "setSellingPrice(uint256)", +"0994257a": "BitcoinSamaritanSupply()", +"0994a0a0": "DSTokenTest()", +"09957e69": "newSale(bytes,uint256,uint256)", +"099583de": "PRESALE_TOKEN_IN_WEI()", +"09959439": "check_rhash(bytes32,bytes32)", +"09959a95": "JCWCToken(uint256,string,string)", +"0995efb5": "isChainCode(uint32)", +"0996a625": "MSPPlaceholderMock(address,address,address,address)", +"0996b4cc": "BitChordCrowdsale(address)", +"0996e0e5": "periodITO_mainCapInWei()", +"09987f3c": "checkAllRewPaid()", +"09989c8b": "getCfiEstimation(address)", +"09990611": "weiPerBtc()", +"09999404": "subLoan(address,uint256)", +"099a019d": "getBid()", +"099a5ab8": "lastBlock_v2Hash_uint256()", +"099ae6bc": "flowerAuction()", +"099aea0a": "isWorking()", +"099b9531": "contractownsthismanyP3D()", +"099ba954": "eSwitchToken()", +"099c00b9": "GWCoin_v3(address,address)", +"099c4c7e": "setCaps(address[],uint256[])", +"099c7ab2": "freePeriodEndTime()", +"099dccc8": "getTeamMemberAddres()", +"099dde07": "maxTarget()", +"099e0a26": "listPairs()", +"099e4133": "backend()", +"099f40a9": "throwsWhenFinalizingNotEndedSale()", +"09a00fb1": "IcoToken()", +"09a02562": "getCensored(address,uint256)", +"09a0307d": "tipLockCheck(bytes32)", +"09a0cfe4": "changeChampsName(uint256,string,address)", +"09a14f2e": "linkSelf()", +"09a2b4ad": "asmSymbol(address)", +"09a38873": "purchaseTokens(uint256,address,uint256)", +"09a38f26": "feed100AndPay(uint256)", +"09a39777": "projectWorkStarted()", +"09a399a7": "personAdd(string,int256,int256,string)", +"09a3beef": "setTokenURI(string,uint256)", +"09a44334": "changeElection(uint256,uint256,uint256)", +"09a547bd": "approveAndCall(address,uint256,bytes,string)", +"09a555c0": "setIcoStart(uint256,uint256)", +"09a55b65": "votePreProposal(uint256)", +"09a69f57": "getRewardAmount()", +"09a71a00": "addTask(bytes,uint256,uint256,address,uint256,uint256,uint256)", +"09a71ffb": "feesProfitDeposit()", +"09a7dbb4": "CollectReturns()", +"09a7dd17": "PRE_ICO_SINCE()", +"09a8d3f5": "oneEth()", +"09a94a3d": "_initiateClaim(string,bytes32)", +"09a97b6f": "_getCategoryIdx(uint256)", +"09aa3dcf": "maxTokenPurchase()", +"09aa69c2": "cancelFlight()", +"09aa7b67": "_mint(address)", +"09ab5008": "ISeeVoiceToken()", +"09ab8a03": "privateEndTime()", +"09ab8bba": "delegateAllowance(address,address)", +"09aba9ab": "ETHWalletCreated(address)", +"09ac3b00": "remainderWallet()", +"09ad1c47": "getUserPayoutBalance(address)", +"09ad8eef": "TBSTK1()", +"09ad8f7e": "getNumChildOperation(bytes32,uint8)", +"09ad9dd3": "BASE_PRICE_IN_WEI()", +"09ae2943": "stage_3_TokensSold()", +"09ae9452": "PreICOProxyBuyer(address,uint256,uint256,uint256,uint256)", +"09aea85f": "getMaxTradeAmount()", +"09af014f": "refillBalance()", +"09af4b1e": "IoexCoin()", +"09af8ffe": "guessAnswer(bytes32)", +"09b0245f": "Long()", +"09b0ce3c": "DCVToken()", +"09b13db0": "fundraisingReservation()", +"09b17085": "___proxyOwner()", +"09b22a4d": "allowAirdrop()", +"09b230cd": "getPriceSpeedTokenBlock()", +"09b258f7": "exchangeRateIco()", +"09b2996a": "originalRate()", +"09b30ed5": "afterExecute(address)", +"09b481b0": "LIABILITIES()", +"09b565f3": "updateTicketSum(address,uint256)", +"09b5e4ad": "ProxyBuy(bytes32,address,uint256)", +"09b637bc": "_founder()", +"09b70ad0": "sellGenes(uint256,uint256)", +"09b7c704": "addIdArrayItem(address,uint256,string,string,address)", +"09b86f84": "getPonziFriend(address)", +"09b8e3cc": "ValidateExec(string)", +"09b8f77a": "proposedRecoveryKey()", +"09ba4a4a": "registerEmail(string)", +"09bb03b4": "isChemistry()", +"09bb317d": "FredToken()", +"09bb7162": "createGateway()", +"09bb9267": "getDev()", +"09bb9b04": "isEtherSpaceBattle()", +"09bc1812": "setVerificationPeriod(uint256)", +"09bc4096": "developersTokensPercent()", +"09bc4933": "freezeof(address)", +"09bc90a4": "PerlToken()", +"09bd1d41": "testF1(uint256)", +"09bd3894": "SendTokens(address,uint256)", +"09bd5a60": "hash()", +"09bd98a4": "getNumAds()", +"09beb01b": "feed50(uint256)", +"09bf284c": "unanchor()", +"09bf6e42": "futureSaleVault()", +"09c0f771": "getScoringMask(bytes8)", +"09c110a1": "gzeFromEth(uint256,uint256)", +"09c12ccb": "getNextPaymentDate()", +"09c1a4b9": "totalIssuanceData()", +"09c25e6c": "FinishedExporting()", +"09c2b7f8": "MINCONTRIBUTION()", +"09c38bc8": "isAuctionManager()", +"09c4a273": "isVetted(address)", +"09c4bb2b": "releaseTime(uint256)", +"09c4f8be": "GetContractStateTerminatedOK()", +"09c51b4e": "assertSaneHTLC(uint256,int256)", +"09c5eabe": "execute(bytes)", +"09c5eb76": "getBalanceOfLogicContract()", +"09c62a1b": "ONECToken()", +"09c62c5c": "vanbexTeamAddress()", +"09c71690": "tokenFallbackBuyer(address,uint256,address)", +"09c72b26": "bonusInPhase6()", +"09c76571": "operationAt(uint256)", +"09c8d173": "claim(bytes32,uint8,bytes32,bytes32)", +"09c922e6": "setOracleGasLimit(uint256)", +"09c95e10": "isPlayer(address)", +"09c975df": "getCallContractAddress(bytes32)", +"09c99d10": "_stalemateTransfer()", +"09ca4b76": "getCurrentPriceAuction(uint32)", +"09ca60c1": "createLambo(uint256,address,uint64)", +"09cb22d5": "betFeePerMil()", +"09cc4f95": "increaseTS(uint256)", +"09cc5551": "topUp(string)", +"09ce4a91": "RLCPerSATOSHI()", +"09ceb7be": "icoAmountBonus2()", +"09cf0329": "StarterKit(address,address,address,address,address)", +"09cf8766": "grantPrivatePurchaserToken()", +"09d02b74": "getRamdomness()", +"09d03d90": "FounderUnlock(address,uint256)", +"09d0b12e": "ViewMyTokens(address)", +"09d0bb66": "NeodiumNetwork()", +"09d11c1d": "ZhangToken()", +"09d2100d": "ADEToken(uint256,uint256)", +"09d256fe": "getPresaleRate()", +"09d2d0b9": "setServiceAccount(address,bool)", +"09d31d8d": "addPerson(bytes32,address)", +"09d33f1d": "addRequest(address,uint256)", +"09d37704": "pushIssuer(address)", +"09d3cbda": "setUpdateDelay(uint256)", +"09d451ab": "calculateEthersAmount(uint256)", +"09d45f1d": "_deleteString(bytes32)", +"09d46057": "IcoStageStarted(uint256)", +"09d54b21": "checkAddressTransfer(address,uint256,address)", +"09d60069": "trade(int256,int256)", +"09d60db1": "claimedTokensWallet()", +"09d64774": "DevForceOpen()", +"09d6796f": "our_transferFrom(address,address,uint256)", +"09d6b0a3": "transfer(address,uint256[],uint256[])", +"09d6d33a": "NewCup(address,bytes32)", +"09d74cc5": "createJockey(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"09d77ad3": "Next(bool)", +"09d78e32": "ETCLocking(address,address)", +"09d78fba": "assertEq4(bytes4,bytes4)", +"09d7ab7a": "convertGene(uint8[7])", +"09d7e9ca": "decodedAsset()", +"09d84fc4": "bindingSmartIdentity(bytes32)", +"09d87ab5": "isAddressAuthorized(address,address)", +"09d89784": "TradeNetCoin()", +"09d8da2e": "isLock()", +"09d929d6": "releaseLockFounders1()", +"09d9f95e": "WinnerTakesAll()", +"09da52a2": "greet(address,string)", +"09da56c1": "getBoardBalance(uint256)", +"09db5d29": "notUsedToken()", +"09dba083": "GC()", +"09dc66af": "GT(uint256,string,string)", +"09dd0e81": "getBlockchainHead()", +"09dd1761": "attachPreOrder(address)", +"09dd7b3e": "paySize()", +"09ddc583": "getPropertyData(uint16)", +"09de4148": "getWinPercent()", +"09de92d0": "RENEE()", +"09df06b7": "TIE()", +"09df3248": "publicGetParticipants(uint256)", +"09df5060": "logoutUser(address)", +"09dfdc71": "currentPyramidBalanceApproximately()", +"09dfe330": "_checkItemId(uint256)", +"09e0a77c": "totalIco()", +"09e0a9eb": "batchBid(uint256[])", +"09e1a1f7": "PresalePurchase(address,address,uint256)", +"09e1c751": "CDPer()", +"09e24516": "ZepCloud()", +"09e25141": "bidInAuction()", +"09e2f193": "addVerificatorAddress(address)", +"09e419d1": "withdrawLongTermFoundationBudget()", +"09e587a5": "homicide()", +"09e6a0ed": "EASTADScredits()", +"09e76161": "getVideoGameDetails(uint256)", +"09e785e1": "payoutInterval()", +"09e7d837": "reachGoal()", +"09e7ec7a": "getInt256Max()", +"09e8046a": "fullfillAdvisors()", +"09e91cfb": "tokenUnits()", +"09e979e6": "getSquarePriceAuction()", +"09e9976d": "MetadataUpdated(address,uint256,string)", +"09e9c325": "createBooking(uint128,uint128,uint32,uint32,uint256,address)", +"09e9d7e2": "removeCandidate(uint256)", +"09e9e85b": "readAllUsers()", +"09ea63e3": "recoverPreSigned(bytes,bytes4,address,uint256,bytes,uint256,uint256)", +"09ebcd64": "getLockedUserInfo(address,address)", +"09ec6b6b": "supplyInterestRate()", +"09ec6cc7": "cancelTrade(uint256)", +"09ece618": "initiatable(bytes32)", +"09ecf413": "updateFoundAddress(address)", +"09ed1782": "withdrawCredits(uint256)", +"09ed4607": "clone()", +"09ed5022": "checkFileNamespace(string,bytes32)", +"09ed5673": "getScouponTransferCost()", +"09edf3ca": "x_Header()", +"09ee3e2a": "Global_Currency_Reserve()", +"09ee75a2": "documentIt(uint128,uint64,bytes32[],string,string,string)", +"09eecdd7": "isValidBet(uint8,uint256,uint256)", +"09eef43e": "hasVoted(address)", +"09ef7085": "is_name_used(bytes32)", +"09efcb8d": "fiatDeposits()", +"09f03da2": "getCurrentTimeRate()", +"09f0fe0d": "lamdenTau()", +"09f14a20": "addBuyerSig(string,string)", +"09f14e7e": "ownerSetExchangeRateInWei(uint256)", +"09f28927": "Crowdsale(address,address,address,address,uint256,uint256,uint256)", +"09f29d1b": "retrieveTokens(uint256)", +"09f2b6a9": "TokenBCC(uint256,string,string)", +"09f30eac": "unitTestSetRewardLevels()", +"09f32957": "lastCreditorPayedOut()", +"09f3ad26": "calcBonus(uint256)", +"09f41822": "batchVoteByIndex(uint256,address[],uint256[])", +"09f4614d": "product1()", +"09f4fc61": "addReferral(address,uint256)", +"09f580b0": "Bolivar()", +"09f5ca99": "GLBToken()", +"09f64d2e": "isIcoPaused()", +"09f68e96": "setPrivateSale(address)", +"09f6c607": "currentEthBlock()", +"09f70d2e": "getRequestHash(bytes,address[],uint256)", +"09f767e0": "deathFactor_iv()", +"09f80dd9": "feerate()", +"09f8477a": "getRandom(uint128,uint256)", +"09f8cc58": "upgradeAgentLocked()", +"09f90127": "fallback(address,bytes)", +"09f92a6a": "wordSize(string)", +"09f9630f": "BETHToken(address)", +"09f9b3c5": "getGrantBalance()", +"09fa6f96": "wpTokensBaskets()", +"09fa90b3": "globalLocked()", +"09fb1668": "changeMaxBetCoinDice(uint256)", +"09fba360": "alreadyHarvestedTokens()", +"09fbb22c": "decreaseGlobalInterestAmount(uint256)", +"09fc1ae0": "getCallTable(uint256)", +"09fc3c53": "burnWarrior(uint256)", +"09fc7046": "bytesToBytes2(bytes)", +"09fc8f6d": "isTokenUpgraded(bytes32)", +"09fc93c1": "getBalanceOfWei(address)", +"09fca951": "accumulated_from()", +"09fcda87": "PayPerView()", +"09fd018e": "setClaimer(uint256,address,uint256)", +"09fd8212": "isInWhitelist(address)", +"09fe5fbd": "CoinPaws()", +"09fe89c8": "privateBuyer()", +"09ff453a": "PFS()", +"09ff4b75": "Redenom()", +"09fffec0": "transferToAdmin(uint256)", +"0a0078bc": "unSet(address,address)", +"0a00840c": "challenge_period()", +"0a0092bf": "LakersvsRockets()", +"0a00ee41": "INNOToken()", +"0a0155e5": "passed(uint256)", +"0a01ad4d": "processWinner()", +"0a01ae41": "Supernova()", +"0a01bc2f": "WhitelistAddressisListed(address)", +"0a02037b": "girlOps()", +"0a0209d0": "soldTokensOnPreIco()", +"0a027825": "currentUnit()", +"0a0279f8": "determineDiscountTranche()", +"0a0313a9": "iterateValid(uint256)", +"0a0352d5": "_getOwnerNFTCount(address)", +"0a04dde8": "ThanosXToken(uint256,string,uint8,string)", +"0a0513da": "IEOEnded()", +"0a06f35e": "setBonusesForAmounts(uint128[],uint32[])", +"0a075a32": "spawnNewZeroCard()", +"0a07eadd": "systemWalletsMint(uint256)", +"0a07f3d8": "contains(uint8,uint8)", +"0a084473": "tokenPerEth()", +"0a08de75": "isContruibuteOpen()", +"0a0900a1": "buyXname(bytes32,uint256,bytes32)", +"0a09284a": "endsAt()", +"0a09815c": "presaleTokens()", +"0a0a2876": "killVesting()", +"0a0a876f": "stopSetPrice()", +"0a0b3139": "testFailOnFailedTransfer()", +"0a0c5e0d": "addSignature(string,string)", +"0a0c75aa": "setEmployeeSalary(uint256,uint256)", +"0a0cd8c8": "setupDone()", +"0a0d5509": "computeTimeBonus(uint256)", +"0a0e3c76": "nextMintFeeProp(uint256)", +"0a0e7883": "nDelegations(bytes32)", +"0a0e78e3": "addNOSPackage(uint256,uint256)", +"0a0f8168": "ceoAddress()", +"0a0fac2b": "isProxyOrSender(address)", +"0a0fb66b": "transferPreSignedHashing(address,address,uint256,uint256,uint256,uint256)", +"0a10376f": "newReplyEvent(uint256,uint256,string,string,uint256)", +"0a107ac3": "setPI_edit_19(string)", +"0a10df7c": "bookingId()", +"0a114a70": "extendExpiration(uint256)", +"0a12a7a0": "LogContribute(address,uint256)", +"0a12c89e": "BTImint(address,uint256)", +"0a12c90f": "AddNewChallenge(uint256,uint256,uint256,uint256,bool,string)", +"0a1432f7": "openResult(uint256,uint8[])", +"0a14504c": "participate(bytes32)", +"0a14849e": "setOpenBetIndex(uint256)", +"0a15299b": "TourCash(uint256,string,string)", +"0a15a07f": "removeUnicorn(address,uint256)", +"0a15d3a8": "ETFT(uint256,string,string)", +"0a16605e": "receiveSpendingDeposit(address,uint256)", +"0a16697a": "targetBlock()", +"0a16916a": "RESERVE_POOL_TOKENS()", +"0a16a53f": "setCitizen(address)", +"0a16e225": "getrestrict(address)", +"0a16efc0": "_addCommittedValidator(uint256,address)", +"0a17d422": "isZero(uint256,string)", +"0a1856db": "Billing(address,address)", +"0a18c334": "Denar()", +"0a18edfa": "returnCouponProportion(address[3],bytes32)", +"0a18f6c1": "playForcibly()", +"0a19283c": "_createCryptsy(uint32,uint32,uint32,address)", +"0a1930b7": "LogDonation(address,uint256,uint256)", +"0a193612": "setCountry(address)", +"0a19b14a": "trade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256)", +"0a1a677e": "searchtickets()", +"0a1a802e": "MatchPay()", +"0a1ab7fc": "arrayOfAccountsThatHaveClaimed(uint256)", +"0a1ceb0e": "usableBalances(address)", +"0a1dfb5a": "nextNextBid()", +"0a1e3a2c": "publishExecution(string,string,string,string,string,string)", +"0a1e71de": "isIco(uint256)", +"0a1e7701": "AtraOwner()", +"0a1e7a89": "getStudentRequest()", +"0a1e9f5e": "TokensOut()", +"0a1f0d9b": "reCap(uint256)", +"0a1f194f": "removeTrader(address)", +"0a1f5862": "minedTokenCap()", +"0a1f868c": "fuint256a(uint256[])", +"0a20aba4": "investOtherCrypto(address,uint256)", +"0a213e5b": "TWIMToken()", +"0a2282ae": "JackPot()", +"0a22ee73": "accountExists(address,uint8)", +"0a24c5bb": "yearlyMintCap()", +"0a2557d5": "wasInvestorWithdrawn(bytes32,address)", +"0a262f48": "setPreActiveTime(uint256)", +"0a26ccb1": "putBool(bytes32,bool)", +"0a276680": "transferOwnership(address,uint256)", +"0a27813d": "finalizedHoldingsAndTeamTokens()", +"0a28c664": "tokensOfWithData(address,uint256)", +"0a298034": "getFreeBulls()", +"0a29f508": "uploadSignedString(string)", +"0a2a9a01": "addWallet(address,uint256)", +"0a2ad0f3": "resetState(address)", +"0a2c0c65": "getAvailableVolume(bytes)", +"0a2cafac": "BPRchain()", +"0a2d31ad": "addToOptionChain(uint256,uint256[],uint256[],bytes32[],address[])", +"0a2d7629": "month12Unlock()", +"0a2d967b": "stopThisIco(bool)", +"0a2df1ed": "callSender(bytes4)", +"0a2eb301": "isAdministrator(address)", +"0a2ebc39": "NVISIONCASH()", +"0a2fd551": "ValidateKey(address,bytes32)", +"0a323fd0": "Boardcoin()", +"0a33cd41": "seIcoAddress(address)", +"0a35a7b1": "saleTierList()", +"0a36645f": "getShopOwnerProductList(string)", +"0a377f3a": "reserveKNCWallet(address)", +"0a384665": "maxTokensAmount()", +"0a38b400": "intermediadorAprovaDevolucao(bool)", +"0a394245": "doesReferralCodeValid(string)", +"0a39e222": "transferFromReserve(uint256,address)", +"0a3a0531": "manualContribution(address,uint256)", +"0a3b0a4f": "add(address)", +"0a3b1cd2": "setHotwallet(address)", +"0a3b7d9b": "TokenMacroansy()", +"0a3c000d": "buyerSymbol()", +"0a3c3088": "ARIZONE()", +"0a3c34fb": "successfulTransactions_()", +"0a3c4dbe": "merculetPrice()", +"0a3cb663": "freezePeriod()", +"0a3d7cce": "assertEq27(bytes27,bytes27,bytes32)", +"0a3dfba7": "giftCharacter(address,uint8)", +"0a3dfd10": "KittenTalked(string)", +"0a3e5712": "revokeWithdrawConfirmation(uint256)", +"0a3ecdfe": "drawNumbers(uint32)", +"0a3f013f": "releaseTimestamp()", +"0a3f5897": "placeBetEth()", +"0a401086": "operational()", +"0a402742": "allocateNormalTimeMints(address,uint256,uint256,uint256,uint256)", +"0a402a32": "LadaToken(uint256,string,string,uint8,address)", +"0a40878a": "EXSCoinSeller()", +"0a40f15f": "fundDeal(string,address)", +"0a40fb8c": "permissionMarker(address,bool)", +"0a412ae4": "aboveMinimumPurchase()", +"0a41442f": "setNewWallet1(address)", +"0a41dfee": "cancel_face_proof_request()", +"0a425a33": "getTreeIds(address)", +"0a42f86f": "getFrequency()", +"0a44b9cf": "amountIAmOwed()", +"0a4543ec": "MonoretoToken(uint256)", +"0a4625af": "totalEthers()", +"0a4655dd": "insert(bytes32,address)", +"0a46706b": "toCom(uint256)", +"0a47185d": "calcNav(uint256,uint256)", +"0a4740ff": "disableSale()", +"0a47a7a6": "mutiTransfer(address,address[],uint256[])", +"0a48dcb3": "appendUint8ToString(string,uint8)", +"0a49646b": "CreationRate()", +"0a49dece": "getDevelopmentFundBalance()", +"0a49e536": "getPoolAmounts(uint256)", +"0a4a3f0a": "GetConfirmRound(uint32,uint8)", +"0a4a57bc": "contain(uint256[],uint256)", +"0a4bb260": "buyItemAndApply(string,uint256)", +"0a4bfa6d": "IMDEXwithdrawToken(address,uint256)", +"0a4c374a": "birthPerTen()", +"0a4c6a45": "TEAM_UNFREEZE()", +"0a4caed0": "getChannelByRank(address,uint256)", +"0a4d564c": "TieUpLooseEnds()", +"0a4d7cd7": "setUserIdentityDocs(string)", +"0a4da2d4": "MyAdvancedTokenV2(uint256,string,string)", +"0a4dea01": "VETRI(uint256,string,string)", +"0a4fa201": "View_TrustlessTransaction_Status(uint256)", +"0a50e361": "generateNumberWinner()", +"0a513bc7": "CMBUpgradeableToken(address)", +"0a516805": "takerArguments(address)", +"0a518754": "periodICOStage4()", +"0a52d194": "payCommission(address,uint256,uint256)", +"0a55fbfe": "getMember(address,address)", +"0a56094d": "AriesToken()", +"0a56293d": "lockTokens()", +"0a564a03": "rateRound2()", +"0a569e8a": "currShares(address)", +"0a56a5f3": "nfsPoolLeft()", +"0a597da7": "impl_additionalRewards()", +"0a5988a8": "Term()", +"0a59b81b": "mesasCreated()", +"0a59bf2d": "setPersonalisationCost(uint256)", +"0a59c66e": "AuctusTokenVesting(address,uint256,uint256,uint256)", +"0a5a00c1": "recovery(address,address,uint256)", +"0a5a1e9a": "withDrawTips()", +"0a5a4e17": "AMBASSADOR_STAKE()", +"0a5a5b11": "releaseSecond()", +"0a5ab11d": "vestingWallet()", +"0a5ccb2a": "reclear(address,uint256,uint256,uint256,uint256,bool)", +"0a5cced2": "bookRoom(string,uint256[],uint256,address,bytes32,uint256,bool)", +"0a5cf9bb": "NeuralControl()", +"0a5dc24d": "getAuthorisationStatus(address)", +"0a5dc5a9": "blockMessagesFrom(address)", +"0a5de7bb": "midOf(uint256)", +"0a5ee9b0": "StakeReleased(uint256,uint256,address,bytes32,uint256)", +"0a5f558e": "mintInitialSupply(uint256[],address,address,address)", +"0a5f80f4": "publicAddDeposit(address,uint256)", +"0a6076b3": "SellableFund(uint256)", +"0a612095": "replaceToken(address[])", +"0a6184ce": "oneHundred()", +"0a623a11": "determineOutcome(uint8[],uint8[],uint8[],bool[],uint256)", +"0a62db33": "YToken(uint256,string,string)", +"0a639726": "oldPriceChangeBlock()", +"0a639ed1": "safeDiv_dec(uint256,uint256)", +"0a63ae38": "NukeContract(address)", +"0a64143a": "totalWithdrawn(address)", +"0a642d00": "retrait_3()", +"0a64bdb1": "_verifyOptionPoolDefray(address)", +"0a66d698": "isSealed(address)", +"0a67d2c7": "withDraw(address)", +"0a67dfbb": "setTeamTokenHolder(address)", +"0a681f7f": "NEXT_POT_FRAC_BOT()", +"0a68f374": "getATitty(uint256)", +"0a692347": "withdrawBack()", +"0a6a3f00": "B3nsToken()", +"0a6aec63": "cloneActiveToPlayed()", +"0a6b378c": "pushTokenId(uint256)", +"0a6be0e7": "BalancedPonzi()", +"0a6bea46": "principle(string)", +"0a6c0642": "frozenPortions(uint256)", +"0a6ee71a": "VISTACrowdSaleP1(address,address)", +"0a6ee947": "lockupContract()", +"0a6f2fbb": "setAllowDrawETH(bool)", +"0a6f5d8e": "_jackpotTax(uint256)", +"0a6fbb05": "SetPass(bytes32)", +"0a703549": "__forward(uint256)", +"0a70c0fd": "getTogglePrice(uint256)", +"0a70cae0": "getBalance2()", +"0a71943f": "PresaleToken(address)", +"0a71d020": "adjustFeaturePrice(uint256)", +"0a720fa9": "MemberSoldToken(address,uint256,uint256,uint256,uint256,uint256)", +"0a7258d8": "setNameWriterId(address,bytes32,bytes32)", +"0a728b85": "MakeSellOrder(bytes32,address,uint256,uint256,address)", +"0a732dac": "getCrowdsaleAddress()", +"0a7354d9": "getOwnedShipsByAddress(address)", +"0a738326": "Whitelist(uint256,address,bool)", +"0a738559": "AitasChain()", +"0a73f7c4": "GNNM(uint256,string,string)", +"0a740f74": "checkDatesPayment(address,uint256)", +"0a7493b4": "Etheropt(uint256,string,uint256,uint256,bytes,address,int256[])", +"0a74a181": "updatefundendtime(uint256)", +"0a751225": "shutDownDAO()", +"0a756f09": "StorageFund()", +"0a762b42": "PROMETHEUS_VOUCHER_PRICE()", +"0a766cfa": "sellCommission()", +"0a77b078": "Exchange()", +"0a77c3ed": "saleDuringRefundPeriod()", +"0a781bf4": "iCASH()", +"0a78e560": "PlayerNeedRefresh(address,uint256)", +"0a790e19": "MAX_ATHENIANS()", +"0a790eb7": "services(bytes32)", +"0a798f24": "openChannel(address,address,uint256)", +"0a799557": "setStartRefund(bool)", +"0a7a0807": "evaluateBet()", +"0a7a1c4d": "action()", +"0a7a2fef": "emitCapabilityRemoved(address,bytes4,uint8)", +"0a7a37bc": "setMonkey(string)", +"0a7a783a": "addOrg(address,address,string,string,string,string,uint8)", +"0a7a8c0a": "ItemMarket()", +"0a7c1922": "bitexlive()", +"0a7c1c35": "mItems(uint256)", +"0a7c1e9f": "NebeusToken()", +"0a7cf2aa": "weiHardCap()", +"0a7d29aa": "checkFunding()", +"0a7ead50": "_processPresalePurchase(address)", +"0a7f4239": "getAccountFundContract(address)", +"0a7f565f": "Intermediary()", +"0a7f734e": "_processTx(address,uint256)", +"0a7fb746": "removeMilestoneFrom(address,uint8)", +"0a7fc3df": "Sentivate()", +"0a80e725": "isReserveSupplyAssigned()", +"0a80ef45": "getIsClosed()", +"0a811fcc": "DigitalPesoCoin()", +"0a82f06b": "deleteCoverImage(uint256)", +"0a82fd1c": "deletePortfolio(uint256)", +"0a834ac0": "START_TGE()", +"0a85107a": "LogTransfer(address,address,uint256)", +"0a857040": "withdrawTrx(uint256)", +"0a85bb25": "isAuthorized(address,address,bytes)", +"0a864240": "TMBCStandardToken(uint256,string,uint8,string)", +"0a866f3a": "addThing(string,bytes32,bytes32,string)", +"0a86f644": "test_0_testBasicTxExecution()", +"0a87391c": "investorsAccounts()", +"0a874df6": "lookup(uint256)", +"0a875313": "createFunded(address,uint256,bytes32,bytes32,bytes1)", +"0a87557c": "ICO_END_TIME()", +"0a883790": "payrollCount()", +"0a888a63": "operation_address(uint256)", +"0a8972f9": "LoveAirCoffee(uint256)", +"0a898428": "nodesVars()", +"0a89e0aa": "switchModeSoOnlyEmergencyStopsAndEscapeHatchesCanBeUsed()", +"0a8a2485": "invite(address,bytes)", +"0a8b88f6": "SECOND_VOLUME_BONUS()", +"0a8bcdb9": "withdrawFromReserve(uint256)", +"0a8c138e": "NAABHAToken()", +"0a8c1551": "EtherAsset()", +"0a8d032d": "QuantumToken()", +"0a8d5fb8": "techProvider()", +"0a8e891f": "Medcash()", +"0a8e8e01": "test3()", +"0a8ed3db": "grantPermission(address,address,bytes32)", +"0a8f8fb9": "advisersReserve()", +"0a8fed89": "setup(uint256,uint256)", +"0a90011f": "setStatus(address,uint256,uint8)", +"0a90b578": "getLenderInterestForOracle(address,address,address)", +"0a90c704": "createCommunity(string,string,string,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)", +"0a9110b2": "NewDataRequest(uint256,bool,string)", +"0a919e3c": "QUEENTEN()", +"0a91cad0": "nextReleaseDate()", +"0a91f2a5": "get_owner_of(address)", +"0a9254e4": "setUp()", +"0a92b264": "getRandom(address,uint256,uint256,uint256)", +"0a934b9d": "mainSaleAllocations(address)", +"0a94031c": "GigaProfitIn(uint256,string,string)", +"0a94ece7": "nextUpgradeAgent()", +"0a95011e": "getCreateMarketNumTicksValue()", +"0a95c49d": "closeOutSweeps()", +"0a95dbfa": "approveUser(address,bytes32)", +"0a9626ba": "setLiqPrice(uint256)", +"0a968d5e": "issueFirstRoundToken()", +"0a979511": "gcExchangeRate()", +"0a9848ac": "setAdminlist(address,bool)", +"0a986540": "chinainc()", +"0a988892": "saveCurrentArbitrationFees(address,bytes32)", +"0a9a70c0": "changeDevFeesAddr(address)", +"0a9a7842": "logAllStop()", +"0a9aa521": "callAMethod1(uint256,uint256,uint256,uint256)", +"0a9ac3d0": "getMarketerAddress(bytes32)", +"0a9ae69d": "bb()", +"0a9d4e95": "_buy(uint8,bytes6,uint32,uint32)", +"0a9de288": "distributeTokens(address,address,address,address,address,address)", +"0a9e24c1": "addBurnWallet(address)", +"0a9ef927": "newTimeLockedWallet(address,uint256)", +"0a9fc06f": "verifyProposal(bytes32,address,address,uint256,bytes32,string)", +"0a9fec36": "sPeriodSoldTokensLimit()", +"0a9ff623": "voteUID()", +"0a9ffbf9": "confirmDividend(uint256)", +"0a9ffdb7": "allocateToken(address,uint256)", +"0aa0903c": "MINIMUM_PRESALE_PURCHASE_AMOUNT_IN_WEI()", +"0aa0bd00": "getPartyB(bytes)", +"0aa0fbe5": "netContractBalance()", +"0aa1ae29": "SMCT()", +"0aa1ee4c": "membersWhiteList()", +"0aa20e73": "multiTransfer(address,address[],uint256)", +"0aa24f50": "adjustInvestorCount(address,address,uint256)", +"0aa28f09": "splitInService()", +"0aa2b673": "cumReqMarbles()", +"0aa2bbaa": "lastWillAccount()", +"0aa2bf7f": "test_26_assertGasUsage2000Boards()", +"0aa34c7c": "updateJMAmount(uint256)", +"0aa3ae7e": "refill(address,uint256)", +"0aa46c12": "testClearBitFailIndexOOB()", +"0aa5418f": "IrfanFr()", +"0aa56368": "claimSocialNetworkIdentity(uint256,uint256,address,uint8,bytes32,bytes32)", +"0aa59fe3": "miningFivePlat()", +"0aa5aa2d": "transferAndNotify(address,uint256,uint256)", +"0aa6d45d": "oraclize_randomDS_proofVerify__main(bytes,bytes32,bytes,string)", +"0aa7881a": "MintableToken(int256,uint256)", +"0aa79fc6": "refundParticipant(address)", +"0aa83f5a": "consume(uint32,uint32)", +"0aa86791": "NujaBattle()", +"0aa93fff": "updateBytes32s(bytes32[],bytes32[])", +"0aa9a4fb": "payPrize(address,uint256,uint8,uint256,uint256,uint256)", +"0aa9c58b": "fillOrKillOrder(uint256,bytes)", +"0aaa9e46": "TNT()", +"0aaba432": "salesVolume()", +"0aac1073": "getSwapOutgoing(uint256)", +"0aac5dfd": "getAssetsCount()", +"0aac8034": "prizeWinners()", +"0aad1f3b": "fechSumNumForCandidateByStage(address,uint256)", +"0aad8ef9": "removeTypeAddressById(uint256,address,address,uint256)", +"0aae7a6b": "info(address)", +"0aaef916": "addManyWhitelist(address[])", +"0aafa40e": "IOVOToken()", +"0aafefb8": "QPay()", +"0ab03e1b": "testControlRegisterContractAgain()", +"0ab0c6c8": "getWinnablePot(uint256)", +"0ab0df87": "timeStamp()", +"0ab174a3": "untrack(uint256)", +"0ab21db7": "sencEthRate()", +"0ab2a9b8": "modifyJurySize(uint256)", +"0ab3bb1b": "totalFundingGoalInIBC()", +"0ab41690": "_forfeitShares(address,uint256)", +"0ab44f74": "AllNewsCash()", +"0ab4846c": "rewardLast7Draw(uint256)", +"0ab4c065": "subdomainOwner(string,string,string)", +"0ab4ca55": "registerNameXaddr(string,address,bool,uint8)", +"0ab4debd": "shortBuy()", +"0ab51bac": "aum()", +"0ab58ead": "SingularDTVFund()", +"0ab5bed4": "platformWithdrawAccount()", +"0ab66be3": "paySubscription(address)", +"0ab68776": "addDiscount(uint256,uint256)", +"0ab6ead5": "Ended(address,uint256)", +"0ab6fb36": "capitalPoolOf(address)", +"0ab6ff19": "addFullFundTX(uint256,uint256)", +"0ab757df": "withdrawEIP777(address,address,uint256)", +"0ab763d0": "polyCustomersAddress()", +"0ab77095": "assignUnitRafflePrize(address)", +"0ab7ec3a": "rejectProject(address)", +"0ab84ed9": "pivx()", +"0ab85a10": "getTotalRewards(uint32)", +"0ab880e5": "resumeBuy()", +"0ab8afac": "auctionContract()", +"0ab9059c": "OrphanToken(address)", +"0ab93971": "GetCount()", +"0ab9419d": "addint256(int256,int256)", +"0ab9db5b": "banker()", +"0aba73d7": "getDealById(uint256)", +"0aba8ec2": "brokerImp()", +"0aba980f": "unblockFundsInEscrow(address,uint256,address)", +"0abb691b": "buynode(uint256)", +"0abb8409": "getPoolETHBalance()", +"0abbf2de": "TeamLocker(address,address[],uint256[],uint256)", +"0abcbbcd": "makeShitClone(address)", +"0abd171b": "setinfo(string,string,string,address)", +"0abd2ba8": "tokenPause()", +"0abe293d": "addRefiller(address)", +"0ac0b31f": "calculateMultiplierAndBonus(uint256)", +"0ac10c0d": "createVesting(address,address,uint256,uint64,uint64,uint64)", +"0ac153ac": "lockMax()", +"0ac168a1": "blockReward()", +"0ac1a281": "CapRevealed(uint256,uint256,address)", +"0ac25e1a": "createPromoClown(uint256,address,bool)", +"0ac28725": "requestTradeDeal(uint256,uint256,string)", +"0ac298dc": "get_owner()", +"0ac2a1c7": "bonusDeliverTime()", +"0ac2ae27": "MarketContractOraclize(string,address,address,uint256[5],string,string)", +"0ac2ffc5": "getMiniByOwner(address)", +"0ac313e0": "setPlatAuction(address)", +"0ac3ccc4": "calcBUYoffer(uint256,uint256)", +"0ac42534": "isCancellable(address)", +"0ac50a6e": "CPCToken(uint256,string,uint8,string)", +"0ac51bd7": "getTimestampsFromPublishers(address[],string[],int256[],int256)", +"0ac5a67f": "paymentGateways()", +"0ac5f441": "paySellerForBuyer(uint256,address)", +"0ac62e02": "emergencyStop(bool)", +"0ac67e2f": "getLowPrice()", +"0ac7366b": "IRONtokenSale(uint256,uint256)", +"0ac799ff": "_transferXToken(address,address,uint256)", +"0ac7c7ba": "getBalanceMessage(address,uint32,uint192)", +"0ac8dc61": "GetLandId(uint256,uint256)", +"0ac924a0": "Minter(uint256,address)", +"0ac94000": "executeRequest(uint32)", +"0ac96103": "getBaseUrl()", +"0ac9bb29": "nextSeedHashed()", +"0ac9d35f": "_getRandomNumber(uint256)", +"0aca08ca": "closeGiveAway()", +"0aca7403": "process_swap(address,address,uint256)", +"0aca9de0": "placeLong(address[2],uint256[7],uint8,bytes32[2])", +"0acaad4c": "getWeiContributed(address)", +"0acae9a7": "publicEnd()", +"0acb4c28": "activateOracle()", +"0acc4382": "getMinDailyWithdrawLimit()", +"0acdc3ef": "_Doihave(uint8)", +"0acdd69f": "TOTAL_SOLD_TOKEN_SUPPLY_LIMIT()", +"0ace8c9a": "addPackage(string)", +"0ace9469": "setmaxContribution(uint256)", +"0acf0b8e": "admin_add_modify(address,uint8)", +"0acf473b": "AdminCloseContract()", +"0acf4b0b": "createPromoToken(address,string,uint256)", +"0ad0a0f3": "setPurchaseValues(uint256,uint256,address,bool)", +"0ad137c4": "Provide(address,address,address,address)", +"0ad182bc": "getTickets(address)", +"0ad1c2fa": "getContract(address)", +"0ad2074c": "logFailedSweep(address,address,uint256)", +"0ad20914": "getRequestByRequesterAddress(address)", +"0ad23aad": "getNumberOfRatingForAddress(address)", +"0ad24528": "end(uint256)", +"0ad27798": "depositPresale(address,uint256)", +"0ad40377": "KYCPresale(address,uint256,uint256,uint256)", +"0ad40df1": "setConfiguration(uint256)", +"0ad43eaa": "enterMessage(string)", +"0ad4b97b": "fibonacciIndex()", +"0ad50c02": "buyPropertyInETH(uint16)", +"0ad54c03": "playerRefundBet(bytes32)", +"0ad59fa2": "CocaCola()", +"0ad63730": "virtuePlayerPoints()", +"0ad65128": "logPresaleResults(uint256,uint256)", +"0ad6aa28": "currentstagedata()", +"0ad6ac85": "pay(uint256,uint256,address)", +"0ad7cf3c": "BitCloud()", +"0ad7f29f": "CampaignManagerContract(address,address)", +"0ad80f41": "WorldTrade(uint256,string,string)", +"0ad95b44": "bribery()", +"0ad98d71": "showTotal()", +"0ad9cf6f": "_resetTransferredCoinFees(address,address,uint256)", +"0ad9d052": "model()", +"0adaa7bf": "expireAssociate(address)", +"0adae972": "detailsOf(address)", +"0adb1354": "RimuoviProfessore(address)", +"0adcaddc": "iterate_valid(uint256)", +"0adcdbaa": "redeemRate()", +"0add0baa": "maxInvestments()", +"0add8140": "pendingProxyOwner()", +"0adde487": "getPurchaseLimit()", +"0ade4942": "tokenPriceProvider()", +"0ade7142": "terminateDirectDebit(address)", +"0ade9429": "getNext(uint256,address,uint256,uint256,uint256)", +"0adeb700": "changeQuarterlyRate(bytes32,uint256)", +"0adf331b": "stateSuccess(uint256)", +"0adf7912": "TokenDestroyed(uint256,address)", +"0adfb4e2": "Elemental()", +"0adfba60": "callSelf()", +"0adfdc4b": "setAwardedInitialWaitSeconds(uint256)", +"0ae08793": "confirmAndCheck(bytes32)", +"0ae100d8": "addOrganFunction(address,string)", +"0ae1b13d": "post(string,string)", +"0ae1fac0": "startICOStage4()", +"0ae25ca3": "withdrawToTeamStep4(uint256)", +"0ae31fbd": "setDistrictAddress(address,address)", +"0ae32e72": "ZhangHongBinToken()", +"0ae41574": "logOrderCreated(uint8,uint256,uint256,address,uint256,uint256,bytes32,bytes32,address,address)", +"0ae50a39": "GetOwner()", +"0ae5e739": "grantAccess(address)", +"0ae66820": "getBuyCost(uint256)", +"0ae75eb8": "amountOfBRAsold()", +"0ae7a310": "tokenMeta(uint256)", +"0ae80c37": "kickStartMiniICO(address)", +"0ae870bd": "Mjolnir()", +"0ae8f28f": "getProposalTextArrayLength()", +"0aea47bc": "getTimer(uint256)", +"0aeacb5e": "getTotalRecords()", +"0aeb0f79": "UserCategorySet(address,uint256)", +"0aeb1552": "insertStrategy(bytes15,address,uint256,string)", +"0aeb4b26": "WorldCupControl()", +"0aeb6b40": "register(address,bytes,uint256)", +"0aebeb4e": "close(uint256)", +"0aeccc9c": "setScribe(address,address,string,string)", +"0aece23c": "getFeeAmount(int256)", +"0aed3c36": "testIsCase()", +"0aed3ca1": "getLoans(uint256)", +"0aed5a21": "NamiExchange(address)", +"0aed80f2": "secondSellPrice()", +"0aed8e72": "rotate(uint256,bool)", +"0aed9c45": "TicketsSoldForThisGame()", +"0aef8500": "amountFundAirdrop()", +"0aef8655": "PXLProperty(address)", +"0aefc573": "KyberHandler(address,address)", +"0aeffa65": "ETH_MIN_GOAL()", +"0af15f6e": "stopSellingGenes(uint256)", +"0af179d7": "setDNSRecords(bytes32,bytes)", +"0af1fe11": "getAllPRS()", +"0af23be2": "ETHERREDSupply()", +"0af39032": "testMintThis()", +"0af3e660": "getHolderId(address)", +"0af4187d": "getAllowance(address,address)", +"0af4626d": "testRetract()", +"0af4cd61": "setHalted(uint256)", +"0af658ca": "personUpdateActivity(uint256,bool)", +"0af6c9ff": "setColdWallet(address,uint256,uint256)", +"0af6f6fe": "changeAgentPermission(address,uint8)", +"0af72ad0": "isStrategy()", +"0af825da": "_transferInternal(address,address,uint256,bytes)", +"0af8bd95": "TIDAChain()", +"0af95750": "deactivateProject(address)", +"0af9d89c": "getPaintingGeneration(uint256)", +"0afa371d": "XMAX()", +"0afa6dde": "getAddressLost(address)", +"0afa9fb9": "contains(int256,address)", +"0afb0409": "refresh(address)", +"0afb9f1f": "getProposalByIdIteration(uint256,uint256)", +"0afc0a59": "computeTokens(uint256,uint256)", +"0afd21d2": "failSale(uint256)", +"0afd2778": "changeFundOwnerWalletAddress(address)", +"0afd548d": "setOperationContracts(address,address,address)", +"0afdca95": "impl_batchTransferMSM(address,address[],uint256[])", +"0aff2076": "getLastAuctionId()", +"0b009517": "YourToken()", +"0b00a111": "WhitelistUpdated(address,address)", +"0b00de8d": "unregisterWorkerAffectation(address,address)", +"0b00fd54": "TEAM_ADDR()", +"0b01517c": "getPlayerBalance()", +"0b01856d": "startPreICOTimestamp()", +"0b02177f": "testnetWithdrawn(uint256)", +"0b03ad11": "unregisterToken(address,string)", +"0b0608db": "LolaCoin()", +"0b070845": "Dagt()", +"0b073865": "share3()", +"0b0740ae": "getItemIndexToOwner(uint256)", +"0b077fe7": "Whales()", +"0b0788dc": "assertEq27(bytes27,bytes27)", +"0b0a4b17": "askHash()", +"0b0b6d5b": "supportImpeachment()", +"0b0bbd65": "addrToAsciiString(address)", +"0b0c2e80": "test_basicWithTwoAssertThrow()", +"0b0c564d": "Enter(uint256,uint256,bool,address)", +"0b0c8f1f": "initSmartToken(address,address,uint256)", +"0b0c92bd": "_isOperatorFor(address,address,bool)", +"0b0d031a": "fetchCreatedOrdersForPayer()", +"0b0d0eb7": "transferToBeneficiaries()", +"0b0e13d6": "closeStageTwo()", +"0b0edad3": "getBooking(address,uint256)", +"0b0f7743": "issuedCount()", +"0b100a5a": "policiesCount()", +"0b107904": "authorizeOne(address)", +"0b10bd1b": "HiroyukiCoinDark()", +"0b11a6e3": "ERGOIN()", +"0b11ed63": "getGenerationForWindow(uint256,uint256)", +"0b1200da": "setWalletContractAddress(address)", +"0b121c04": "createIssue(uint256,uint256,uint256)", +"0b12a148": "_distributeNewSaleInput(address)", +"0b12e7e2": "soowhat()", +"0b1350cf": "assetProxy()", +"0b1414c1": "oneStaIsStb()", +"0b14331f": "getExpiration(uint256,uint256)", +"0b151811": "getBonusByDate(uint256,uint256)", +"0b15650b": "randInt(uint256,uint256)", +"0b1573b8": "setRoundLockAmount(uint256)", +"0b181567": "exceed()", +"0b1851a9": "Billionscoin()", +"0b1a3144": "pushToApproved(address,uint8)", +"0b1a8e1e": "setMasterServer(uint32)", +"0b1a94e7": "validPurchasePresale()", +"0b1aff48": "extendTDE(uint256)", +"0b1b62fa": "transferBackMANAMany(address[],uint256[])", +"0b1b92dd": "FACTOR_11()", +"0b1b9aa5": "getluckyuser()", +"0b1ba852": "changeDepositCell(address,uint256)", +"0b1bf3e2": "Galleass(string)", +"0b1c45c9": "getPhiladelphiaBets(address)", +"0b1c4a75": "subFees(uint256,uint256)", +"0b1c5b76": "fetchVoteMainInfoBySnapshotBlock(uint256)", +"0b1ca49a": "removeMember(address)", +"0b1d366d": "getLastAwardInfo(uint256)", +"0b1dcc88": "buyCountry(uint8)", +"0b1dfa26": "fxpDiv(uint256,uint256,uint256)", +"0b1e400a": "_transferFromToICAPWithReference(address,bytes32,uint256,string)", +"0b1e5acc": "roleHas(string,address,address)", +"0b1e7f83": "posts(uint256)", +"0b1ec92e": "RoundCreated(uint256,uint256,uint256,uint256)", +"0b1f3850": "num_hosts_revealed()", +"0b1fc3c0": "getVendingAmountLeft(uint256)", +"0b210a72": "getDrugInfo(uint256)", +"0b2140ab": "buyUSD(address,uint256)", +"0b214493": "_stageValidation(uint256,uint256,bool)", +"0b21d446": "setValidBwCaller(address)", +"0b225b42": "PHASE4_START_TIME()", +"0b2478b3": "getSaleIsOn()", +"0b247b1b": "CreateACI(address,uint256)", +"0b25cbb2": "Ftechiz()", +"0b261340": "marbleBalance(address)", +"0b269898": "setPricing(uint256[])", +"0b274f2e": "passPhase()", +"0b27fa51": "noOfTokenAlocatedForPresaleRound()", +"0b280a29": "isBatchActive(uint256)", +"0b2909e6": "addOwed(address,uint256)", +"0b294bdf": "GetPlayerDetails(address,address)", +"0b299630": "addItem(string,address,uint256,address,uint128)", +"0b2a6c70": "marketWine()", +"0b2acb3f": "add(address,bytes)", +"0b2accb2": "getPercentage()", +"0b2c588c": "setAdventureHandler(address)", +"0b2d25ca": "calculateCharityFee(uint256)", +"0b2e02c7": "migrateAgent()", +"0b2e7423": "maxSecurityGuardDelay()", +"0b2ee7e9": "create(uint256,uint256,uint256,bool)", +"0b2f6a7e": "_mintPlayer(uint32,uint32,address)", +"0b2f6cef": "m_hodlers()", +"0b2fce74": "addGardener(uint256,uint256)", +"0b305c62": "playerEndGameConflict(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address,bytes,bytes32)", +"0b305ce9": "destFoundation()", +"0b309c93": "Timer()", +"0b30ab4f": "bubbleSort()", +"0b30fc7b": "pastValues(uint256)", +"0b317697": "investorToken(address)", +"0b31fc3a": "DiamondToken()", +"0b341245": "activityAddress()", +"0b3464c3": "activeHeroGenome(address)", +"0b34f78c": "MintProposalAdded(uint256,address,uint256)", +"0b3532b3": "balanceSellingOf(address)", +"0b354090": "SimpleConstructorBool(bool,bool)", +"0b3598c6": "_sealDataStream(address,address,uint256,bytes32,uint256,bytes32)", +"0b35ea61": "stopGuess(uint256,bool)", +"0b35fe44": "VerifyEd25519(bytes32,bytes,bytes)", +"0b368627": "releaseOldData()", +"0b377a8f": "setNumIncorrectDesignatedReportMarkets(uint256)", +"0b38bae2": "_totalSupplyLeft()", +"0b393a9d": "MANHATTANPROXY1STAVE()", +"0b395d1e": "_addUserExperience(address,int32)", +"0b39aaa9": "privateEquityClaimed()", +"0b39c3e1": "requestLoan(address,address,bytes16,uint256,uint128,uint128,uint16,uint64,uint64,string)", +"0b39f18e": "setCardTokenAddress(address)", +"0b3a2ffd": "setRoyaltyInformationContract(address)", +"0b3af901": "proposePlatformWithdrawal(address)", +"0b3b2222": "TokenDistribution(address,address)", +"0b3bb024": "getTenant()", +"0b3bc259": "funderCount()", +"0b3cd070": "multiBet(uint256[],uint256[],uint256[])", +"0b3d7174": "prev_week_ID()", +"0b3e9c7b": "userEndGameConflictImpl(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,uint256,address)", +"0b3ed536": "claimDonations(uint256)", +"0b3f191a": "disableChanging(bool)", +"0b3fe32d": "setHalfTimeAtkBoss(uint256)", +"0b407022": "migrateV1Upgrades(address[],uint256[],uint256[])", +"0b40ab43": "setBankAddress(address,address)", +"0b4130f2": "GenomaToken()", +"0b424b66": "HHDCToken(uint256,string,string)", +"0b42d1de": "BejonesStandardToken(uint256,string,uint8,string)", +"0b43c6e6": "CryptonCoin()", +"0b440f33": "initCrowdsale(uint256,uint256,uint256,address)", +"0b4438e5": "spinAll()", +"0b45e8db": "SALE_CAP()", +"0b464bf6": "blocksSinceLastBid()", +"0b4650a0": "FiatContract()", +"0b467b9b": "revoke(bytes)", +"0b47459b": "LAARToken()", +"0b480095": "teamAddressThreeTokens()", +"0b483f6e": "toAllow()", +"0b48af0b": "interestOf(address,address)", +"0b4964a8": "addDungeonNewFloor(uint256,uint256,uint256)", +"0b4a1ece": "VisibilityDerived()", +"0b4aca45": "__formatDecimals(uint256)", +"0b4b5d5e": "GamityToken()", +"0b4bb61f": "burnPercentage1000m()", +"0b4c72a9": "rejectProvider(address)", +"0b4ca1cd": "doResult(uint256,bytes32,bytes32,uint256)", +"0b4cf825": "getRandomColorType()", +"0b4da628": "IsPlayer()", +"0b4db63a": "Tratok()", +"0b4dfc77": "contractMint(address,string,bytes32,bytes32,uint256)", +"0b4e0513": "reserveTokenFund()", +"0b4efd9a": "RobotBTC(uint256,string,string)", +"0b4f12f6": "updateUser(string)", +"0b4f3f3d": "cancel(string)", +"0b4f79a1": "RejekiKita()", +"0b509e1d": "getCountOfCell()", +"0b513828": "parseChannel(bytes)", +"0b513ce9": "PonziBet()", +"0b51989a": "setData(address,string)", +"0b520ad5": "freePeriodDuration()", +"0b522abf": "closeCrowdsale(address)", +"0b549884": "matingPrice(uint256)", +"0b54cbfb": "setType(uint8)", +"0b5608f2": "PackageCoinPresaleOne(uint256,uint256)", +"0b566f33": "unlockedCollateral(address)", +"0b56d4c6": "airdropNum()", +"0b56f01c": "createAmountFromEXORForAddress(uint256,address)", +"0b573638": "ethToTokenTransferOutput(uint256,uint256,address)", +"0b57adc0": "Transwave()", +"0b57c487": "COVERCOINToken(string,string,uint8,uint256)", +"0b583982": "getUserProductCount(bytes32)", +"0b586f1a": "_emitWorkResumed(uint256,uint256)", +"0b58dc38": "SetNewBlockchainEnabled()", +"0b590c6b": "SingularDTVToken()", +"0b591195": "largestPenis()", +"0b5945ec": "setTokenURL(address,string)", +"0b597135": "onHardCapReached(uint256)", +"0b5982f0": "payOutDividend()", +"0b59a5c4": "purchasedCoins()", +"0b59df68": "withdrawEscrow(uint64)", +"0b5a006b": "currentYear()", +"0b5ab3d5": "destroyDeed()", +"0b5ad1c1": "UpdateSellAgentCreators(address)", +"0b5adfff": "getNumTickets()", +"0b5ba082": "stagesManager()", +"0b5c2307": "globChanceOwner(uint256)", +"0b5c3f87": "addReferral(address,address)", +"0b5ca8db": "issuedBounty()", +"0b5d1c3d": "testLessThanOrEqual()", +"0b5d69ab": "UpdateMaxBalance(uint256)", +"0b5d94f6": "getOrderPrice(address,address,uint256,uint256)", +"0b5e19b0": "getInvestSum()", +"0b5e2232": "HunxuHappyToken()", +"0b5e89f4": "icoStarted()", +"0b5ee006": "setContractName(string)", +"0b5f2efd": "setCurrentRate(uint256)", +"0b5f5ef1": "setAvatar(uint256,bytes)", +"0b5faf97": "claimWin(bytes32)", +"0b5fcf81": "enableAutoDividends(uint256)", +"0b604085": "setBombletAddress(address)", +"0b605fcd": "tokensTo0xbtc_(uint256)", +"0b60ca88": "raisedSale2USD()", +"0b611241": "ieoStorageVault()", +"0b6142fc": "breach()", +"0b620b81": "withdraw(address,address,address,uint256)", +"0b6386d4": "KyberNetworkCrystal(uint256,uint256,uint256,address)", +"0b63b114": "freeTokens(address)", +"0b63fe95": "processPayment(address,uint256)", +"0b642d72": "recoverLostEth(address,uint256)", +"0b65108b": "merge()", +"0b654e7d": "finishedRaceCount()", +"0b663e63": "promoCount()", +"0b66c247": "scoreTeams(uint32,uint32[],int32[],uint32[],uint32,uint32)", +"0b66f3f5": "multisendToken(address,address[],uint256[])", +"0b6700d6": "getLogo()", +"0b6780aa": "extendSaleEndDate(uint256)", +"0b679d2c": "REQUEST_CANCELED_BY_CREATOR()", +"0b6826ca": "payDividend()", +"0b682cb8": "Quhabitat()", +"0b684de6": "CitizenOneCoin(uint256)", +"0b695449": "MiningUpgrade(address,uint256,uint256)", +"0b697362": "withdrawFromSubRound(uint256)", +"0b6b80b2": "sampleRegistry()", +"0b6bd1b0": "GetAcorn(address)", +"0b6bf29f": "partner1_will()", +"0b6c754b": "isSuccess()", +"0b6c9ac7": "airdroppedAmount()", +"0b6d3017": "overflow_upper()", +"0b6d715b": "createGame(string,uint256,uint256)", +"0b6d8d52": "createDAO(address,uint256,uint256)", +"0b6e01db": "total_bet_available()", +"0b6e46fe": "enableController(address)", +"0b6e6511": "convertToELIX(uint256,address)", +"0b6ebf86": "KWHTokenAddress()", +"0b6f0530": "test_twoInvalidEqBytes32Message()", +"0b6f2fad": "HashCoin(uint256,string,string)", +"0b6f46ed": "isPresaled(address)", +"0b6f5b3d": "ShrimpFarmer()", +"0b6f6e0d": "CanYaCoinToken()", +"0b6fc163": "claimSignerAddress()", +"0b6fcdb0": "getEnforceRevisions(bytes32)", +"0b70ce55": "Betfunding()", +"0b714b17": "AddHash()", +"0b71ff6a": "MTDCERC20()", +"0b72396c": "validateContractWithCode(address,string)", +"0b730fae": "ICOadvisor2()", +"0b731652": "Ethbet(address,address,address,uint256,uint256)", +"0b7373d6": "giveAllBack()", +"0b73aad0": "msgsWaitingDone(uint256)", +"0b74074b": "startPayouts()", +"0b743021": "TOKENS_TOTAL()", +"0b745a01": "setLockup(address)", +"0b747d91": "randomSeed()", +"0b74b620": "getChannelsParticipants()", +"0b74edc6": "testFinalHash()", +"0b74f633": "getTradeParameters(uint256,address,address,uint256,uint256,uint256,uint256)", +"0b7507ae": "getTaskAtIndex(uint256)", +"0b7623ba": "abs(int8)", +"0b76619b": "staked()", +"0b779363": "checkVotingForChangeAdminAddress()", +"0b77fa28": "generateThemedSpinners(uint256,uint256,uint256)", +"0b781385": "nextCampaignBalance()", +"0b78f9c0": "setFees(uint256,uint256)", +"0b7abf77": "TOTAL_TOKENS()", +"0b7ad54c": "getContent(uint256)", +"0b7d1de1": "proofOfSMS()", +"0b7d6320": "crowdsaleAgent()", +"0b7d796e": "loop(uint256)", +"0b7ddd25": "setRaisedAmount(uint256)", +"0b7e4e7f": "substractNumber(uint256)", +"0b7e9c44": "payout(address)", +"0b7ef89b": "contributeToCampaign(uint256)", +"0b8021c4": "getPublishedTokens(address)", +"0b803b6b": "transferApprovedBalance(address)", +"0b80b4f9": "QuantaloopToken()", +"0b80f8d3": "invmod(uint256,uint256)", +"0b811cb6": "executeProposal(uint256,bytes32)", +"0b816045": "getRequestInfo(uint256)", +"0b81e216": "setAllowTransfer(bool)", +"0b82a541": "setIcoEndTime()", +"0b82d33d": "withdrawBalanceDifference()", +"0b83284e": "MinterFunction(address,uint256)", +"0b834864": "publicTransfers(address,address,uint256)", +"0b83de20": "ABI(bytes32)", +"0b841433": "agentApproval(address,uint256)", +"0b8440ec": "bonusTokenRateLevelTwo()", +"0b84cc4a": "Committees(uint256)", +"0b8514b9": "exit(bytes32,bytes,bytes32)", +"0b851937": "year4Unlock()", +"0b85877f": "isICAP(address,address)", +"0b85881c": "ceilLog2(uint256,uint256)", +"0b869824": "CeoAddress()", +"0b87572b": "communityDevelopmentSupply()", +"0b8762d1": "Block18Token()", +"0b87cf10": "crowdsaleActive()", +"0b88e06b": "testTokenBalance()", +"0b892e3f": "celebs(uint256)", +"0b897f64": "invert(address,uint256,address)", +"0b8a7bf8": "coinbaseWallet()", +"0b8b709d": "_createDroneInternal(address)", +"0b8ba87d": "UnilotBonusTailEther(address)", +"0b8bbd5b": "webGiftEtherAmount()", +"0b8d0a28": "wallet2()", +"0b8d9d94": "createSportsBet(string,uint256)", +"0b8e845a": "burnFeeFlat()", +"0b8eebde": "gameEnd()", +"0b8f0b61": "sendCoinsToBeneficiary()", +"0b8f0e0a": "LIWUC()", +"0b901c82": "totalRepaidQuantity()", +"0b910f86": "PRESALE_MIN_INVEST()", +"0b91eaf9": "isValidated(address)", +"0b926ecd": "validStoreVal()", +"0b927666": "order(address,uint256,address,uint256,uint256,uint256)", +"0b93381b": "success()", +"0b936a77": "DuanZiToken(address)", +"0b93bf0d": "setRecruitHeroFee(uint256)", +"0b948684": "delegatedTransfer(bytes,address,uint256,uint256,uint256)", +"0b95c8ae": "aggiungiMsg(string)", +"0b962e8f": "AlphaChainConstructor()", +"0b96406a": "vestingMappingSize(address)", +"0b96740c": "changeMinimumContributionForAllPhases(uint256)", +"0b967584": "voteForCandidate(uint256,address)", +"0b967fd2": "remove_master(address)", +"0b967fe7": "assertEq18(bytes18,bytes18)", +"0b96e72e": "setBAS(bytes32,address,string)", +"0b972ff6": "weiPreCollected()", +"0b97bc86": "startDate()", +"0b97fc8d": "WeiPerTicket()", +"0b98107c": "dateFrom()", +"0b9830ba": "tokensIndexOf(address,bool)", +"0b9835cf": "pvpContenderRemoved(uint32)", +"0b9849ab": "WEChainCommunity()", +"0b98f975": "setBonus(uint256)", +"0b9902d0": "WithdrawPerformed(uint256)", +"0b99ccee": "ico2Ended()", +"0b9aa067": "isVerified(address,address)", +"0b9ac851": "getCurveUnset(address,bytes32,int256)", +"0b9adc57": "deleteBytes32(bytes32)", +"0b9b0e7d": "highRate()", +"0b9b8130": "registerMintedToken(address,string)", +"0b9b9602": "SalesWalletUpdated(address,address)", +"0b9bfa6c": "inCommunity(address,address)", +"0b9cae77": "KinetiQ()", +"0b9d5847": "getExchange(uint256)", +"0b9d98e9": "getTotalVolume()", +"0b9e9817": "CanaryV7FastTestnet()", +"0b9ea6c8": "getCurrentSold()", +"0b9ea95d": "configureSaleClockAuction(address,uint256)", +"0b9f1e76": "wphcToken()", +"0b9f2816": "nowwww()", +"0b9f2ca6": "getCountBuildings(uint256,uint256,bool)", +"0b9f6108": "divsm(uint256,uint256)", +"0b9fc8fb": "checkerSign(bool)", +"0ba00420": "bulkPay(address[],uint256)", +"0ba0a3a1": "TakerSoldAsset(address,uint256,uint256,uint256)", +"0ba12c83": "commitUpgrade()", +"0ba1772d": "callDistributed()", +"0ba1f7ad": "getImpactCount(string)", +"0ba234d6": "cancelRecovery()", +"0ba24e4c": "customers(address,address)", +"0ba27775": "fondToken()", +"0ba2e8a8": "allowFunding()", +"0ba3aa55": "setdoctor(string,uint256,string)", +"0ba46624": "setBountyAgent(address,bool)", +"0ba4d242": "s43(bytes1)", +"0ba5890a": "noteBallotDeployed(bytes32)", +"0ba6d271": "updateFunds(address,uint256)", +"0ba7ebe2": "changeAll(address)", +"0ba8916f": "updateMeterKey(address)", +"0ba8d735": "purch(address,uint256)", +"0ba8ebec": "lockance(address)", +"0ba92878": "delOrganizationCertificate(string)", +"0ba95909": "getMaxAmount()", +"0baaaed9": "setConfigBytes(bytes,bytes)", +"0bab4d84": "setClearingPriceSubmissionDeposit(uint256)", +"0bab718f": "updateCurs(uint256)", +"0bab7ff6": "messiCommunity()", +"0bac0312": "TryUnLockBalance(address)", +"0bac15ae": "PUBLICSALE()", +"0bac2850": "setFunctionFourPrice(uint256)", +"0bac3c01": "isDeferred(address)", +"0bac9fe7": "getUsernameByIndex(uint256)", +"0bad342a": "EscrowContract(address,address,address,address,uint256,uint256,uint256,uint256)", +"0bad4481": "setupRegion(address[16],uint256,uint256,uint256[],bool,uint8[128])", +"0bae2129": "affiliateTree()", +"0bae3288": "getSale()", +"0bae461c": "KomicaToken()", +"0baf0bcc": "lockDateTimeOf(address)", +"0bb0482f": "concatBytes(bytes,bytes)", +"0bb0e827": "add_addys(address[],uint256[])", +"0bb15acc": "GoldeaToken(uint256)", +"0bb18da2": "saveRefundJoinId(uint256,uint256)", +"0bb24375": "ITX_Token()", +"0bb25901": "freezeSupply(uint256)", +"0bb2cd6b": "mintAndFreeze(address,uint256,uint64)", +"0bb2cdef": "operatorManager(address,uint8)", +"0bb3a066": "unsetAdministrator(address[])", +"0bb4bbaf": "testInitialNumberOfVoters()", +"0bb4e6f4": "getTotalWei()", +"0bb536a2": "fightMix(uint256,uint256)", +"0bb563d6": "logString(string)", +"0bb5e62b": "EGC()", +"0bb700dc": "getStats(bytes32)", +"0bb7a81a": "ZhuhuaToken()", +"0bb8b9c3": "zint_convert(string)", +"0bb954c9": "WithdrawAndTransferToBankroll()", +"0bb9ee71": "createRepository(bytes32,bytes)", +"0bb9f21e": "SCAMERC20()", +"0bba3065": "AuthorityFilter()", +"0bba662d": "oneCoin()", +"0bbaa27a": "seedSourceB()", +"0bbad618": "setupReclaim()", +"0bbd4e38": "defrostReserveAndTeamTokens()", +"0bbd501e": "NewEtherPrice(uint256)", +"0bbdb469": "getLuckyblockSpend(bytes32)", +"0bbe0ee3": "transferAllFrom(address,address,uint256[])", +"0bbed2b7": "secondsaleopeningTime()", +"0bbf2768": "infrastruct(uint256)", +"0bbf709a": "validHolder(address)", +"0bbf8f38": "setMinBid()", +"0bbfdbec": "setUsdAmount(uint256)", +"0bc09cfe": "buy(uint256[6][])", +"0bc0c61f": "destroyOwner(address,uint256)", +"0bc1236e": "getTokenAmount(uint256,uint256)", +"0bc16f1b": "presell()", +"0bc1734c": "addPermissions(address[])", +"0bc217d9": "setCastleSale(uint256,uint256)", +"0bc23901": "WalletAddressesSet(address,address,address)", +"0bc2a3b7": "Showercoin()", +"0bc30aa0": "getTicketWinnings(uint256,uint256)", +"0bc311ea": "addFound(address)", +"0bc32570": "_sendTokenReward(address,uint64)", +"0bc32ab6": "tokenToPointBySkcContract(uint256,address,uint256)", +"0bc33b22": "addressJenkins()", +"0bc3a268": "KelvinToken()", +"0bc43490": "yesVotes(uint256,address)", +"0bc4ec45": "FirstDropToken()", +"0bc59a8e": "date15Nov2018()", +"0bc5b2c5": "stage_2_tokens_scaled()", +"0bc5e51e": "endTimeSale3()", +"0bc5f216": "kgtToken()", +"0bc69912": "createICO(bytes,bytes)", +"0bc6b708": "placeBetTESTONLY(uint256)", +"0bc6b89c": "dailySpent()", +"0bc6c96e": "failSafe()", +"0bc7760c": "crowdsaleSet()", +"0bc785df": "ACTToken()", +"0bc7fd93": "toTuis(uint256)", +"0bc8982f": "getBQL()", +"0bc8b4c2": "getMintRequestUintMap(uint256,int256,string)", +"0bc954dc": "addEgg(uint64,uint32,address,uint256)", +"0bc9c89c": "removeMessage()", +"0bca1704": "setHardcupTrue()", +"0bca441b": "BETHERTokenSale(uint256,address)", +"0bca5903": "claimMedals(uint16)", +"0bcab28a": "verifyReceiverAddress(address,address,address,uint8,bytes32,bytes32)", +"0bcb8a23": "getBondDivShare(uint256)", +"0bcbad90": "WLMTPrice()", +"0bcbbd21": "r2()", +"0bcbe35b": "lastBlock_f19()", +"0bcbfe1c": "withdraw_Eth(uint256)", +"0bcd0694": "getUserCities(address)", +"0bcd3b33": "getBytes()", +"0bcd87ed": "dashboardAddress()", +"0bce62ea": "isPreICOPublicOpened()", +"0bce8cdf": "getContributorInfo(address)", +"0bcef54c": "Eticket4Sale(address,address,uint256,uint256,uint256)", +"0bcf963b": "getDocumentsCount()", +"0bd089ab": "MyAdvancedToken(uint256,string,uint8,string,address)", +"0bd11894": "addBuilder(uint256,address)", +"0bd12120": "MMCC()", +"0bd18d7a": "investment(address)", +"0bd263ff": "registerPID(address)", +"0bd2ae1c": "ERW()", +"0bd38767": "testCanClone()", +"0bd3ae61": "EARLY_BIRD_SUPPLY()", +"0bd3cf7e": "Timebomb()", +"0bd58493": "sellMyApple(uint256)", +"0bd5b493": "payPostDrawRef(address,address,uint256)", +"0bd601df": "setLockEndTime(uint256)", +"0bd61e79": "_finalRoundLosersFight()", +"0bd62ad5": "FantasySportsCoin()", +"0bd64dbf": "BsToken(string,string,uint256,address)", +"0bd6a40f": "setWorkerAdress(address)", +"0bd6c769": "Load(address,uint256,uint256)", +"0bd7abde": "setMaxWinRate(uint256,uint256)", +"0bd7b6b8": "computed_fundraise()", +"0bd85158": "setUInt8Value(bytes32,uint8)", +"0bd8599e": "countUp()", +"0bd8a1d0": "auctionFinalized()", +"0bd8a3eb": "SaleEnded()", +"0bd934c3": "UPEXCoin()", +"0bd93738": "updateShareTimeGap(uint256)", +"0bd9c534": "right43(uint256)", +"0bda4dbf": "refundCount()", +"0bdaaaf5": "getAllOperations()", +"0bdab855": "distributeHNC(address[],uint256,uint256)", +"0bdc0031": "STARTBLOCKTM()", +"0bdc7953": "multiBuy(address[],bytes32[])", +"0bdc9c35": "CalculateReward(uint256,uint256,uint256)", +"0bddb83b": "bonusPresale()", +"0bdddb73": "stampOut(address,uint256,uint256)", +"0bdde107": "balanceOfme()", +"0bde1d36": "changeAllowanceToMint(address,address,int256)", +"0bdf3dae": "CryptoRoboticsToken()", +"0bdf5300": "TOKEN_ADDRESS()", +"0be0453b": "StringDemo()", +"0be0713d": "gcSupply()", +"0be0f677": "log(bytes32,string)", +"0be21ea9": "MAX_TIME_EXPLORE()", +"0be23ace": "RealMoney()", +"0be2858e": "multipleTransfer(address[],uint256[])", +"0be48491": "personalMax()", +"0be5430f": "DroneTokenSale(address,address)", +"0be560be": "NarniaUSDT()", +"0be5ca05": "privatePresaleTokenReservation(address,uint256,uint256)", +"0be5efa6": "year2LockAddress()", +"0be6ba2b": "addRestricedAccount(address,uint256)", +"0be702bf": "_v4()", +"0be72b6d": "allOfferingQuota()", +"0be76f80": "memberData(uint256)", +"0be77485": "Unlock(address)", +"0be77f56": "log(bytes)", +"0be80f39": "setComission(uint256)", +"0be80fa9": "changeVisitLengths(uint256,uint256,uint256,uint256,uint256,uint256)", +"0be8287e": "getJackpotInfo()", +"0be9189d": "showInvestorVault(address,uint256)", +"0be924ef": "tier_rate_4()", +"0be96fbd": "MAX_TOKENS_SALE()", +"0be9f930": "REL(uint256,string,uint8,string)", +"0beb90d3": "icoLimit()", +"0bebd0f9": "addAddressToGeneration(address,uint256)", +"0bec3231": "GalaxyChain()", +"0bece492": "setPhaseBonusAddress(address,address)", +"0bed63c7": "_isActive(uint256)", +"0bee1c3e": "availableICO_w2()", +"0beeb0af": "getValue(address,bytes32,address)", +"0beedbd4": "AdoptionRequested(bytes5,uint256,address)", +"0befe82b": "AddBankerPrincipal(uint8,uint256)", +"0befeeb0": "lastCreatedGame()", +"0bf05c99": "DraftPlayer(address,uint256)", +"0bf09985": "openRound(uint256,uint256)", +"0bf0e4e4": "myProfit(address)", +"0bf1c747": "destructed()", +"0bf2c50d": "setCFO(address,bytes)", +"0bf2ee8d": "addPerson(string)", +"0bf318a3": "finalizeCrowdsale()", +"0bf34d54": "CVToken()", +"0bf36806": "Bivacoin()", +"0bf474a9": "claimDonations(address[2],uint256[7],uint8,bytes32[2])", +"0bf5035d": "secondYearEnd()", +"0bf51f36": "updateTime(uint64)", +"0bf53613": "getBonusNow(address,uint256)", +"0bf53668": "consumers(address)", +"0bf61fd4": "t_Slava()", +"0bf63c60": "setBasicCentsPricePer30Days(uint256)", +"0bf6898e": "DPSToken(uint256,string,string)", +"0bf6dbfd": "VanityToken(address)", +"0bf75567": "voteSuperQuorum(uint256,bool)", +"0bf757e5": "HopiumToken()", +"0bf77989": "debug_coinbaseTxSha(bytes,uint256)", +"0bf7fb57": "getUserMilestone(address)", +"0bf82810": "removePartnerAddress(address)", +"0bf84797": "RATE_FOR_WEEK1()", +"0bf867c2": "Zemana()", +"0bf9236a": "KillContracts()", +"0bf9c50f": "calcNextNBonuses(uint256)", +"0bf9fd52": "wasPaid(bytes32)", +"0bfa1191": "setPriceStorageInternal(address,uint256)", +"0bfd1271": "confirmErc20TransactionRequest()", +"0bfd7b62": "getBonusesAmountAvailable(bytes32,uint256)", +"0bfefed4": "createUser(address,string,bool,bool,bool)", +"0bff2ac2": "NewBatch()", +"0bffa8b4": "changeMigrationInfoSetter(address)", +"0c0075a3": "getBallotOptions()", +"0c0078e8": "RESERVED_TOKENS_ANGLE()", +"0c012834": "ARS()", +"0c0174a4": "escapeRequest(uint256)", +"0c01b2ae": "setConfiguration(string,string,uint256,address[],uint256)", +"0c02159f": "HavEtherToken(uint256,string,uint8,string)", +"0c022933": "highTimeBonusValue()", +"0c031f45": "TokenBuy(address,uint256)", +"0c03348d": "getIntel(uint256)", +"0c0399a4": "iteration()", +"0c03f24a": "parseDate(string)", +"0c03fbd7": "getNumPassingTokens(address,uint256)", +"0c0615a7": "evaluate(address,string,string)", +"0c0662a8": "getLastWithdrawal()", +"0c06c3ee": "viewHouseFee()", +"0c06fda1": "AVINCOIN()", +"0c07fa56": "ICO_END()", +"0c087782": "PXLProperty()", +"0c087bc5": "stage1Start()", +"0c08bf88": "terminate()", +"0c08ec49": "importTokensToSidechain(address,address,uint256,bytes32)", +"0c099133": "ERC20TokenFactory()", +"0c0a5c55": "cancelAuth(address,address)", +"0c0a7a68": "Stars()", +"0c0ad299": "removeProject(address)", +"0c0b86ca": "currentAuctionId()", +"0c0bea5c": "FinalTokenToken()", +"0c0c13c8": "query2_fnc()", +"0c0cde7c": "ZIBToken(uint256,string,string)", +"0c0d6caa": "newDrawer(address)", +"0c0e5f0d": "calculateGrapeBuy(uint256,uint256)", +"0c0e6dea": "publicAllocationEnabled()", +"0c0ef2b0": "isGameActive()", +"0c103837": "votedHarvest(address)", +"0c112598": "fun(bytes32)", +"0c119354": "rateMain()", +"0c11dedd": "pay(address)", +"0c11f32e": "milestoneShares(uint256)", +"0c12fe41": "redeemResearchAndDevelopmentBal()", +"0c131629": "RDFToken()", +"0c14080b": "bonusSale()", +"0c15b963": "againAttack(address,uint256)", +"0c15f601": "meltTokens(address,uint256)", +"0c16683e": "SCLToken()", +"0c1688f7": "IstriumToken(address,address)", +"0c1754f0": "BitcoinXToken()", +"0c17d023": "dungeonTokenContract()", +"0c17d42c": "setAlpha(uint256)", +"0c1838e9": "importAmountForAddresses(uint256[],address[])", +"0c18e1c9": "balanceInSpecificTranche(uint256)", +"0c1925f3": "stock(string,string,uint256,string)", +"0c192fe5": "RBCToken()", +"0c195d99": "totalAllocatedTokens()", +"0c196a74": "getInterestRate(uint256)", +"0c19f80e": "checkReferral(address)", +"0c1a8b05": "toSPool(uint256)", +"0c1a972e": "newAccount(string,bytes)", +"0c1b33d2": "setRemainingSupply(uint256)", +"0c1be377": "removeSupport(address,address)", +"0c1c0974": "littPoolIDExists(uint256)", +"0c1c3c14": "registerNameXID(string)", +"0c1c972a": "startPublicSale()", +"0c1ca1ba": "withdrawOwnerEth()", +"0c1cd8cd": "endPvtSale()", +"0c1d4af7": "LogTokenAssigned(address,address)", +"0c1db532": "getPI_edit_28()", +"0c1e3fd4": "submitWithdrawTransaction(address,uint256,bytes)", +"0c1e3fea": "previousState()", +"0c1e517f": "bytes16ToStr(bytes16,bytes16,uint8,uint8)", +"0c1f679f": "WithdrawalTokensAfterDeadLine()", +"0c1fad51": "setSeedSourceA(address)", +"0c1fe4b1": "showTransaction()", +"0c204dbc": "getF()", +"0c2073e4": "LemonSelfDrop2()", +"0c21a2f1": "nextGameMinBlock()", +"0c21e754": "setLLV_edit_9(string)", +"0c237dde": "servusTokensAllocated()", +"0c23cf4b": "buyCardXid(uint256,uint256)", +"0c241b2d": "generateSeedA()", +"0c250dcd": "logUnsigned(bytes32)", +"0c255c94": "max256(uint256,uint256)", +"0c25c6c1": "getBonusUsersCount()", +"0c26a816": "pvpMaxIncentiveCut()", +"0c26ac30": "closeEarlyAdopters()", +"0c26e42e": "getReleaseHashForNameHash(bytes32,uint256)", +"0c270f44": "recleared(address)", +"0c2737d2": "incrementCounters(uint256,uint256)", +"0c27677a": "getCRaddress()", +"0c28e291": "Prout()", +"0c294f51": "getAllCounts()", +"0c29e589": "createMyEntity(uint256,bytes32,bool,uint256,uint256)", +"0c2a48e2": "realitycheck()", +"0c2ab324": "SAN()", +"0c2ad9e3": "battle(uint64,uint64)", +"0c2b14fe": "buyCostume(uint256,uint256)", +"0c2b3eda": "TeacherCoin()", +"0c2b4b85": "addGames(bytes32[],bytes32[])", +"0c2b663c": "SDR22(uint256,string,string)", +"0c2bc34d": "indexOf(uint256[],uint256,bool)", +"0c2c5add": "contribute(address,uint256,uint8,bytes32,bytes32)", +"0c2c81ed": "platformFundingSupply()", +"0c2cb820": "setDebug(bool)", +"0c2d71b1": "docStore()", +"0c2e4bf4": "icoStartAt()", +"0c2ec050": "isCurrentRoundFinishing()", +"0c2edc1c": "setExchangeAddresss(address,address)", +"0c2f6f48": "crowdSalePeriodInit()", +"0c31309e": "getPrivatePurchaserStatus(address)", +"0c316d6a": "DTOToken(address)", +"0c319d80": "BidiumToken(address,address,address,address)", +"0c3257d0": "changeUserClass(address,uint256)", +"0c326330": "_isICO()", +"0c3304d1": "mintMAN()", +"0c333556": "Vault(address[],address,address[],address[])", +"0c340a24": "governor()", +"0c345385": "RenaS()", +"0c34644c": "getInstructor(address,address)", +"0c3499ca": "_setSkills(address,uint256,uint256,uint256)", +"0c34f8a5": "addAddressesToWhitelist(bool,address[])", +"0c367f63": "DAEXToken(address)", +"0c36add8": "issue(uint256,uint256,address,address,uint256,address)", +"0c37348d": "buyPreSaleTokens(address,uint256,uint256,string)", +"0c376ee6": "setPvtTokens(uint256)", +"0c38708b": "get_all_project_information(uint256)", +"0c3890b7": "addThing(string,string,string,bytes32)", +"0c3980ef": "NextRewardHalving()", +"0c3a9658": "MTUV1()", +"0c3b3b70": "Unihorns(uint256,string,string)", +"0c3b7b96": "minTokensToCreate()", +"0c3c450e": "icoHashedPass()", +"0c3c92a3": "finishHardcap()", +"0c3cebfa": "issueTo(bytes32,uint256)", +"0c3d5157": "contractStartTime()", +"0c3dbf43": "removeMarket()", +"0c3dfa0e": "SLoader()", +"0c3e2d2d": "getTotalFundsRaised()", +"0c3e3c58": "getAdministerList()", +"0c3e4004": "GraceCoin()", +"0c3e564a": "airDeliverMulti(address[],uint256)", +"0c3f08c6": "newGame(uint8,string,string,bytes32,uint256)", +"0c3f0cac": "getLastPlayer(string)", +"0c3f1f14": "updateSupply()", +"0c3f64bf": "isDev(address)", +"0c3f6acf": "currentState()", +"0c402ed8": "confirmMinting(uint256)", +"0c424284": "setWhitelistStatus(address,bool)", +"0c4326a0": "getMajorMinorPatch(bytes32)", +"0c432c8d": "calcJadeReceived(uint256,uint256)", +"0c432f1f": "handleLastRef(address)", +"0c433edf": "receiptUsed(address,address,uint256)", +"0c437aa7": "setMandateInBlocks(uint256)", +"0c44ba40": "getMyTicketAddresses(address)", +"0c45361f": "creators_count()", +"0c45453c": "_feed(uint256,bytes32)", +"0c45e8d7": "roomsAvailable(string,uint256[])", +"0c4641d3": "BJCToken()", +"0c46fc92": "deliverLastMilestone(bytes32)", +"0c486a96": "requestPayment(uint256,uint256)", +"0c486c00": "CNRToken()", +"0c48ae9e": "createAdSlot(string,uint256,uint256,uint256[])", +"0c48c6bd": "getBonusMultiplierAt(uint256)", +"0c48e582": "updateVendor(address,address)", +"0c497094": "createAngel(uint8)", +"0c49c0a2": "MIN_CONTRIBUTION_AMOUNT()", +"0c49c36c": "sayHi()", +"0c4a3338": "CheckTime(uint256)", +"0c4a5153": "commitStageActive(uint256)", +"0c4a8d94": "STAGE_3_FINISH()", +"0c4a9869": "unregisterContract(bytes32)", +"0c4ada17": "cards_gold(uint256)", +"0c4ae1ca": "cancelBooking(address,address)", +"0c4bfa94": "left13(uint256)", +"0c4c4285": "setHash(bytes32)", +"0c4d6bdf": "EarlyBirdsFinalized(uint256)", +"0c4dd1d9": "totalUsdAmount()", +"0c4ecab4": "confirmations(bytes32,address)", +"0c4f65bd": "getOwnerAddress()", +"0c4f8f6f": "regularTransfer(bytes32,bytes32)", +"0c50b116": "BTHPoint()", +"0c51015d": "adjustTap(uint256)", +"0c51171d": "getTokensSold(address,bytes32)", +"0c516283": "freezeHybridizationsCount(uint256)", +"0c5241fa": "LOL6()", +"0c525571": "arraySum(uint16[])", +"0c52780d": "unCertifyDelegate(address)", +"0c52bb4c": "auditorsList(uint256)", +"0c547097": "goldenTicketOwner()", +"0c549dd9": "getCET6ByAddr(address)", +"0c54ce44": "ProofOfRipple()", +"0c5532bf": "singleValueAirdrop(address,address,address[],uint256)", +"0c55699c": "x()", +"0c5589b8": "DecreaseWithdrawalAmount(uint256)", +"0c559757": "setHouseEdge(uint8)", +"0c55d925": "deleteBytesValue(bytes32)", +"0c55d9a4": "confirmStaking()", +"0c55f818": "CTU_ADDRESS()", +"0c560c64": "USD(uint256)", +"0c58062b": "teamLockPeriodInSec()", +"0c584803": "SGTMock(address)", +"0c58bcb8": "EthLendToken(address,address,address)", +"0c58e23c": "ZClassicGold()", +"0c59b556": "viewCoinsKarmaBySymbol(string)", +"0c59c570": "CashTron()", +"0c5a534e": "allowBuying()", +"0c5a97a6": "getProviderName(uint256)", +"0c5c2ca3": "getIndexName(bytes)", +"0c5ce593": "open(address,bytes32,uint256,uint256)", +"0c5d919d": "totalsuplly()", +"0c5e3f11": "nestedFirstManyToSome(uint256,uint256)", +"0c5ebb1a": "userForceGameEnd(uint8,uint256,uint256,int256,uint256,uint256)", +"0c5ed9d5": "REB()", +"0c5f9a60": "allocationFee(bytes32)", +"0c5fd414": "preOrder(address,address,address,address,bytes32,uint256,uint256,uint256)", +"0c5fd4b2": "minttoken(address,uint256)", +"0c60223e": "withdrawAuctionBalance(address)", +"0c61257e": "WartegToken()", +"0c620494": "changeAllowTransferWallet(address)", +"0c62b816": "minableSupply()", +"0c62bfbb": "_calcNextRate()", +"0c636091": "adoptAxies(uint256,uint256,uint256,address)", +"0c646fbd": "get_entity_count()", +"0c64a739": "price_exponent()", +"0c64a7f2": "remainingTime(uint256)", +"0c657eb0": "bankroll()", +"0c65829b": "_setSkills(address,uint256,uint256[],uint256[])", +"0c65e229": "startICOPhaseThree()", +"0c662943": "_lockup(address,uint256,uint256)", +"0c66adf8": "getCurrentRoundInfo(uint256)", +"0c68194f": "getCourseIdOfStudent(address)", +"0c68a104": "fundingMaxInEth()", +"0c68ba21": "isGuardian(address)", +"0c68f917": "cancelOfferingProposal(address,uint256)", +"0c693110": "getVoted(address,uint256)", +"0c6940ea": "addMeToAllGames()", +"0c69b189": "claimCrystal()", +"0c6a3161": "RESERVE_ADDRESS()", +"0c6a5be4": "Arexium(uint256,string,uint8,string)", +"0c6a62dd": "updateCurator(address)", +"0c6b1324": "Etherboard()", +"0c6bfdd0": "openTheRabbitHole()", +"0c6cbf92": "lastPayOut()", +"0c6cd73a": "issueCard(uint256,uint256,uint256)", +"0c6d1efb": "releaseEachTokens()", +"0c6ddc0d": "getUserAllowance(address)", +"0c6de527": "addToBonusSeed()", +"0c6df351": "doBondBonusTransfer(address,address)", +"0c6e29e3": "subscribeToPool()", +"0c6fc9b2": "processTakerOrder(uint256,uint256,uint256,uint256,bool,address,address,bytes32)", +"0c6fe674": "getPresaleTotal(uint256)", +"0c700183": "listGlobalAuditDocuments(uint256,bool)", +"0c7013c1": "send(address,address[],address,uint256[])", +"0c70f055": "getRandomRarity(uint32,uint256)", +"0c71614c": "divsforall()", +"0c717036": "colourID(uint8,uint8,uint8)", +"0c71b48c": "BTCTransactions(bytes16)", +"0c72bf39": "ArtToujourToken()", +"0c72fe56": "_payBidAllocationFee(bytes32)", +"0c736e04": "refundForValidPartners(uint256)", +"0c73a392": "getLogSize()", +"0c740736": "addPicture(string,uint32,uint32,uint32,uint32,string,string,string)", +"0c7452b8": "viewPetitionSignerWithAddress(address,uint256)", +"0c74be3d": "TIME_TO_MAKE_TOMATOES()", +"0c7516fd": "numPurse()", +"0c754b9f": "BuyOptions(address,uint256,string,uint8)", +"0c75941a": "setContractMessage(string)", +"0c76316d": "withdrawPot()", +"0c763fef": "showContractMsgSender(address)", +"0c77a697": "claimFounders()", +"0c77b44e": "setLedger(address,address)", +"0c790369": "maxMessageChars()", +"0c798c81": "SCCToken(address,address)", +"0c79af3d": "witrhdraw(uint256)", +"0c79e3e6": "setCrydrStorage(address)", +"0c7ac7b6": "arbitratorExtraData()", +"0c7b5616": "Time_Start_Crowdsale()", +"0c7befb2": "_tokenLayersExist(uint256)", +"0c7bf731": "pendingRemain()", +"0c7ca61e": "ArrAccountIsFrozenByDate(uint256)", +"0c7caded": "destroyMe()", +"0c7d8c20": "_register(bytes32,address)", +"0c7de59d": "edit(address,bytes,bool)", +"0c7e30b7": "getUsdCentsFromWei(uint256)", +"0c7eca6e": "setCurs(uint8)", +"0c7ef39b": "HUBTToken()", +"0c7f076e": "advisoryReserveTokensDistributed()", +"0c7f27ba": "COE()", +"0c8004b5": "buyTokens_Address(address,uint256,bytes8)", +"0c80d6dd": "view_last_result(address,address)", +"0c8114d3": "_forwardFunds(address,uint256)", +"0c8135a7": "getTeamOwner(uint256)", +"0c8209b6": "manualWithdrawEtherAll()", +"0c823abe": "importedTokens()", +"0c828c42": "getTxIndex(uint256)", +"0c82b942": "whitelistRemove(address[])", +"0c832ef0": "restoreOwner()", +"0c8367fb": "HALAL()", +"0c83700a": "divCutPool()", +"0c8496cc": "getReturnByPath(address[],uint256)", +"0c857b25": "getLoveLock(uint64)", +"0c85b18c": "SetBuildingData(address,uint256,uint256,uint256,uint256,uint256)", +"0c85feea": "matchOrders(uint64,uint64)", +"0c861d4b": "Aeron()", +"0c87355e": "BANCOR_CONVERTER_UPGRADER()", +"0c875c8d": "Withdrawn(uint256,uint256)", +"0c898482": "getShare(address,address)", +"0c89a0df": "transferTokens(address)", +"0c89b766": "randomSource()", +"0c89ef35": "hasEnoughAllowance(address,address,uint256)", +"0c89ef67": "PXMCCoin(uint256,string,uint8,string)", +"0c8a611f": "getInvestorsETH(address)", +"0c8ac6f7": "transferAnyTokens(address,address,uint256)", +"0c8b29ae": "hodlTillBlock()", +"0c8b494d": "RadarSpeedChain()", +"0c8bae5c": "sellTokensForBtc(string,address,uint256,uint256)", +"0c8bd2c5": "Issue(address,address,address,address)", +"0c8bdcfa": "GetPolicy(address,string,string)", +"0c8c0392": "listAsset(uint256,uint256,uint256,uint256)", +"0c8c085f": "getNumContents()", +"0c8dfeda": "maxLinkedWalletCount()", +"0c8e3166": "assignAtheniansToBattle(uint256)", +"0c8e9977": "whitelist_pool(address,address,uint256)", +"0c8f167e": "TOKENS_SOLD()", +"0c8f78fb": "setGasAmount(uint256)", +"0c9066dd": "getZodiac(uint256)", +"0c90da51": "End2()", +"0c915c74": "releaseWithStage(address,address)", +"0c91af81": "IGTUSD()", +"0c91e624": "Winner(string,address)", +"0c91f2d0": "rewardForWork(address,address,uint256,bool)", +"0c92b17b": "checkBurnTokens()", +"0c932e77": "ritualFee()", +"0c938c3f": "changeSubscriptionFee(uint256)", +"0c939ae1": "KYROInv()", +"0c93c981": "playBatch(uint256[],uint256[])", +"0c96526b": "getRateUsd()", +"0c96c4ea": "triggerRelease()", +"0c97200a": "getLoansCount()", +"0c975447": "lowBonusRate()", +"0c976ace": "existenceApproveTest(address)", +"0c97bb77": "curConfig()", +"0c98048d": "transferFromAdmin(address,uint256)", +"0c981d58": "closeGame(address)", +"0c987501": "EtheraffleFreeLOT(address,uint256)", +"0c990004": "createToken(uint256,address,bytes32,uint256,uint256,bytes32)", +"0c99d807": "_isValidBlock(uint8)", +"0c9a6c24": "getUserCoinMarketValue(uint16,uint256)", +"0c9b016c": "expItemClass()", +"0c9b5777": "Erc20()", +"0c9bb7d2": "denyByPassword(bytes8,bytes)", +"0c9bc2c0": "calculateNonVestedTokens(uint256,uint256,uint256,uint256,uint256)", +"0c9be46d": "setCharityAddress(address)", +"0c9c1c58": "setAltFundAddress(address)", +"0c9cbfee": "moveProduct(address,address,uint256)", +"0c9daf45": "vcxWallet()", +"0c9dc2b8": "checkEthFundDepositAddress()", +"0c9dd381": "RewardTransfered(uint256,address,uint256,uint256,uint256)", +"0c9f6ed8": "ZEXCoin()", +"0c9f88c0": "Zignal()", +"0c9f980f": "isCSO(address)", +"0c9fcec9": "setApproval(address,address,uint256)", +"0c9fd581": "assertTrue(bool)", +"0c9fe5eb": "PIXEL_COUNT()", +"0c9ff620": "listINF()", +"0ca09e1e": "XoudCoin()", +"0ca1988b": "getnum(address)", +"0ca1c5c9": "getTotalMinted()", +"0ca2bda2": "isAllowedTransferDuringICO()", +"0ca2f2fd": "MultiBonusCrowdsaleMock()", +"0ca35682": "recover(uint256)", +"0ca35c22": "setScouponTransferCost(uint256)", +"0ca36263": "exit(bytes32)", +"0ca40865": "capRound2()", +"0ca413a4": "getDateRanges()", +"0ca435a6": "grabBooty()", +"0ca4f838": "BetCommunity()", +"0ca5bdb4": "novaBurn()", +"0ca5f72f": "rewardPercentageDecimals()", +"0ca621a8": "updateSplitandEmit()", +"0ca6afa7": "EtfToken()", +"0ca6d310": "setNamePiture(uint256,string)", +"0ca72e82": "testGetLawyerCount()", +"0ca7395f": "returnFund(address,uint256)", +"0ca78923": "updateConnector(address,uint32,bool,uint256)", +"0ca8fe1e": "burnCoins()", +"0ca9183c": "icoFundingRatePredictionBonusInPercentage()", +"0ca97903": "emergency(address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"0ca9897c": "citePaper(address)", +"0ca99ca8": "hardCapInWei()", +"0ca9c14e": "PryvCn()", +"0caa1d84": "isUserGranted(address,string)", +"0caa5d91": "UserDestroy(address,address)", +"0caa8605": "getStage3End()", +"0caaa284": "PresaleClosed(uint256,uint256)", +"0caab83a": "poolBounty()", +"0cab068c": "isVestingRevoked()", +"0cac54ed": "claimTransfer(address,address)", +"0cacbf21": "getSponsorshipsSortedByAmount(address,uint256)", +"0cadc5b3": "deliverBonus()", +"0cae3cbb": "checkStageCondition()", +"0caeb350": "upgradeValue(uint256)", +"0caee2ca": "calculatePayout(uint256,uint256,uint256)", +"0caf10b2": "GreenEnergy()", +"0caf9d39": "testFailTooManyMembers()", +"0cafabd8": "getTPrice()", +"0cafef9c": "Clen(uint256,string,uint8,string)", +"0cb08716": "airdropDynamic(address[],uint256[])", +"0cb08e3b": "_finalizeICO()", +"0cb09309": "ArysumToken()", +"0cb0a44b": "enableInvestment()", +"0cb0c7f0": "forceOwnerChange(address)", +"0cb1982b": "updateNAV(uint256)", +"0cb1d243": "ICT(uint256,string,string)", +"0cb1d6b4": "fourthWeek()", +"0cb296ae": "Gemstones()", +"0cb335c4": "setMissedVerificationSlashAmount(uint256)", +"0cb5f653": "newUser(address)", +"0cb60443": "minRate()", +"0cb61d7a": "setCurrentBonusPercent(uint256)", +"0cb6aaf1": "keys(uint256)", +"0cb6b577": "TOKEN_DECIMAL()", +"0cb743a5": "buyOld(uint256)", +"0cb749b6": "FutureBlockCall(address,uint256,uint8,address,bytes,bytes,uint256,uint256,uint16,uint256,uint256)", +"0cb795e8": "getDividendInfo(uint256)", +"0cb7eb4c": "getReleaseTime(address)", +"0cb812d3": "openWithoutCounterparty(address[4],uint256[3],uint32[4])", +"0cb9208a": "JorgeCoin()", +"0cb97f57": "advisorsTotal()", +"0cb9da1b": "RedemptionContract(address,uint256)", +"0cb9ec43": "TemperatureMeasurementB(address,uint32,uint64)", +"0cb9ee4b": "getAllPlayerObjectLen()", +"0cba5853": "angelCollection(uint64)", +"0cba6d27": "getSocialAccountsLength()", +"0cbb0f83": "entryCount()", +"0cbc90d8": "makeProposal(address,uint8,uint256,address)", +"0cbc9ce7": "sendToToteLiquidatorWallet()", +"0cbe1eb8": "USDDOWNLOADPRICE()", +"0cbf0601": "numMessagesSigned(bytes32)", +"0cbf54c8": "auctionDuration()", +"0cbf711a": "LogClosed()", +"0cbf7ec0": "startPrivateIco()", +"0cbfe979": "updatePrivateSaleWithMonthlyLockupByIndex(address,uint256,uint256,uint256)", +"0cc00bc9": "MarketPlace(address,uint256)", +"0cc03e7a": "claimShare(uint256)", +"0cc04b55": "adminUnregister(string)", +"0cc06221": "getUserAccountInfo(address)", +"0cc10550": "BIToken()", +"0cc2001c": "TastToken()", +"0cc20a0c": "getHoldEarningsInRound(address,uint256)", +"0cc3ad77": "verdictExecuted(address,bool,uint256)", +"0cc3db97": "_createToken(uint256,uint256,uint256,uint256,address)", +"0cc4330c": "visit()", +"0cc4fb87": "changeGeneralSaleEndDate(uint256)", +"0cc6373f": "tokenExchangeRateMile3()", +"0cc69a27": "Marketplace(address,address)", +"0cc69b5b": "NOKIA()", +"0cc7086b": "canBurnUtility(address,uint256)", +"0cc73b6a": "BLOCKS_PER_ROUND()", +"0cc79a85": "getEnded()", +"0cc8299b": "wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww()", +"0cc87b1c": "soldPreSaleTokens()", +"0cc88021": "hasPlayer(address)", +"0cc8c9af": "getOrCreateNextFeeWindow()", +"0cc91bb9": "setEarlyParicipantWhitelist(address,bool,uint256,uint256)", +"0cc966fa": "buy(address,address,uint256,uint256,uint256,bool)", +"0ccc642e": "emergencyFlagAndHiddenCap()", +"0ccc68bb": "_create_mineral(bytes32,address,uint256,uint256)", +"0ccc88b1": "BurnupGameBase()", +"0cccfc58": "auctionPeriod()", +"0ccde0b1": "initialSupplyPerAddress()", +"0ccec396": "getNumReleases()", +"0ccf30f1": "setRentTime(uint256)", +"0ccf5af4": "_prizeAmount()", +"0ccfdd8b": "potentiallyCirculatingPop()", +"0cd0563b": "broadcast(string)", +"0cd0c3d7": "resetRental()", +"0cd1812f": "sendFundsTo(address,uint256)", +"0cd205bb": "CrowdsaleContract(uint256,uint256,address,uint256,uint256)", +"0cd28e9d": "getRoundPlayerList(uint256)", +"0cd2b327": "approveSponsorableJob(address,uint256,address)", +"0cd30783": "getcompany(uint256)", +"0cd3c7f7": "ransom()", +"0cd3fad2": "_base64decode(bytes)", +"0cd4700a": "NT()", +"0cd522da": "returnStartBlock(uint256)", +"0cd55abf": "nextNonce(address)", +"0cd5ea83": "earlyBirdDuration()", +"0cd641b2": "tokenForComunity()", +"0cd64ad0": "changeEthDailyLimit(uint256)", +"0cd6ceb3": "Boldman()", +"0cd74cd9": "etherWallet()", +"0cd7d0f2": "DestlerDoubloons()", +"0cd865ec": "recover(address)", +"0cd8dd0b": "setXPTokenAddress(address)", +"0cd9aec6": "testFailTrustWhenStopped()", +"0cd9f271": "buy10()", +"0cda88ce": "mul256By256(uint256,uint256)", +"0cdbf3dd": "setReferralsMap(address[],address[])", +"0cdc92ea": "canBeCanceled(uint256)", +"0cdd4234": "mainAddress()", +"0cddb437": "CNDTPrivate()", +"0cde0e7d": "solve(int256,int256,int256,int256)", +"0cde6009": "KinTokenSale(address,uint256)", +"0cded5f0": "migratePool()", +"0ce08a49": "refundAmount(uint256)", +"0ce10cbd": "changeOwnerToZero()", +"0ce11049": "setBCoinContractAddress(address,address)", +"0ce11a77": "registrarAddress()", +"0ce11ded": "updateMthEthRate(uint256)", +"0ce18afc": "TabToken()", +"0ce1f4b7": "toB32(bytes,uint256,bytes)", +"0ce3151c": "personUpdateRelation(uint256,string)", +"0ce38276": "setColorYellow()", +"0ce3d998": "fetchCancelledOrdersForMerchant()", +"0ce46c43": "scheduleCall(address,bytes4,bytes,uint16,uint8,uint256[5])", +"0ce4c990": "minRevenueToDeliver()", +"0ce4e104": "bnbTokenWallet()", +"0ce52e25": "time_on_trademarket()", +"0ce5a098": "getWordCount()", +"0ce64868": "setPendingValue(uint256,string)", +"0ce6bd26": "EtherCarbon()", +"0ce71356": "canPropose(address,uint256)", +"0ce84479": "Wallet10()", +"0ce8544a": "Ethlyte()", +"0ce90ec2": "levelUp(uint256)", +"0ce96e71": "removeAddressFromQueue(uint256)", +"0cea64a0": "callSomeFunctionViaOuter()", +"0cea7534": "withdrawMargin(uint256)", +"0ceaeb5a": "ecosystemSupplyRemaining()", +"0cec1ecd": "getPixelDistributor()", +"0cecf728": "ListingCancelled(bytes5,uint256)", +"0ced5b02": "buyTokens(uint128)", +"0cedd0bd": "_getDestinationPartition(bytes32,bytes)", +"0cee1725": "withdrawFund(uint256)", +"0cee22e9": "testSetBalanceSetsSupply()", +"0cef7d5a": "WBW(uint256,string,uint8,string)", +"0cef9a27": "add2MarketPlace(uint256,uint256,uint256)", +"0cefa4de": "minPersonalCap()", +"0ceff204": "withdrawRevenue(uint256)", +"0cf01051": "startFunding()", +"0cf039e3": "setBuyRequestLimitInterval(uint256)", +"0cf044ee": "enable_exploration()", +"0cf1d050": "withdrawAllToExchange(address,uint256)", +"0cf1dafc": "refreshRate(uint256)", +"0cf1dd6e": "BattleOfThermopylae(uint256,uint256,uint8,address,address,address,address)", +"0cf20cc9": "withdrawBalance(address,uint256)", +"0cf3da77": "ELCToken()", +"0cf45ba5": "updateFirstDuel2(uint256)", +"0cf56f3f": "addBetWithReferrer(uint256,address,address)", +"0cf59cc6": "changeScientistForElement(uint256,uint256)", +"0cf6d879": "getARInvTable()", +"0cf7193d": "Tradex()", +"0cf79e0a": "transfer(uint256,uint256)", +"0cf7f3b5": "changePrice(uint256,uint64)", +"0cf820e0": "lengthOfRecord(uint256)", +"0cf838e1": "Test2(address)", +"0cf85c4c": "stateMask()", +"0cf868bf": "_airdropLimit()", +"0cf8bcab": "setItemTransferable(uint256,bool)", +"0cf935c0": "getDegreeCount()", +"0cf93a60": "ICOweek1End()", +"0cf94990": "checkMD(address)", +"0cf94cda": "calcInvitationAmount(uint256)", +"0cfa0318": "approveBurn(address,uint256)", +"0cfa1d12": "rndExtra_()", +"0cfa8af4": "deleteCandidateByStage(address,uint256)", +"0cfb37a7": "revealProofOfPerfBlock(uint32,bytes32,bytes32,bytes16,bytes32,bytes16,bytes32,bytes32)", +"0cfbf6c6": "lockConfiguration()", +"0cfccc83": "SUPPLY_CAP()", +"0cfd0a0d": "INDI()", +"0cfd2c6a": "RecreationCultureMassMediaCoin()", +"0cfed2a2": "pauseSale(bool)", +"0cff4058": "AacharyaToken()", +"0d009297": "initOwner(address)", +"0d011088": "convert2(string,string,address)", +"0d015e4b": "get_depositLock()", +"0d01c1ae": "set_Area_name(string)", +"0d02369b": "takeSellOrder(address,uint256,uint256,address)", +"0d024f83": "DownStats(uint256,uint256,uint256,uint256)", +"0d02e05c": "setBuyStatus(bool)", +"0d032623": "getRemainingCompanyTokensAllocation()", +"0d043a60": "getRewardsWithdrawn(uint32,address,address)", +"0d047c5b": "NewFounderAddress(address,address)", +"0d047d49": "getFashionsAttrs(uint256[])", +"0d051c52": "clearCrowdsaleCloseTimer()", +"0d052f39": "getBurnAdminApproval(address,address)", +"0d055d1e": "sendBill(uint256)", +"0d0567ae": "latestAddress()", +"0d058fe3": "create(uint256,string,address)", +"0d062959": "FXTOKEN(address,uint256,uint256)", +"0d06a2ee": "setBenefeciar(address)", +"0d0a1901": "secondReserveAllocation()", +"0d0a6bf2": "investor_clearRefBonus(address)", +"0d0abf52": "matureBalanceOf(address)", +"0d0b0c74": "loadN(uint8[],uint256,uint256)", +"0d0b86c6": "CryptaurDepository()", +"0d0b8825": "weiPerRtc()", +"0d0bfb2f": "ba2cbor(bytes[])", +"0d0c0c51": "LogParticipation(address,uint256,uint256)", +"0d0c2008": "TwoAndAHalfPonzi()", +"0d0c2c62": "MOTDiscount()", +"0d0c529a": "getacttslen()", +"0d0cd4f4": "allWalletBalances(address)", +"0d0d0554": "ARMYToken()", +"0d0d7dc9": "raiseEvent2()", +"0d0ed6b9": "fetchAllCandidatesByIndex(uint256)", +"0d1017d6": "EnterRentCrowdsale()", +"0d10e842": "weiAmount()", +"0d1118ce": "burnTokens(address,uint256)", +"0d117d16": "chunk1IsAdded()", +"0d11dd70": "currentRefundInvestorsBallot()", +"0d121337": "transferOperatorRole(address)", +"0d126bc4": "getCurso()", +"0d1352cf": "marketAnts()", +"0d13bec6": "SellAcorns(uint256)", +"0d13d85e": "transferMintTokens(address,uint256)", +"0d13ea7d": "BONUS_2_DAYS()", +"0d145d16": "RegisteredPlayer(address,uint256)", +"0d14ed4f": "midgradeOpen()", +"0d157352": "ForkiToken()", +"0d15fd77": "totalVotes()", +"0d16b6ca": "setBTCRate(uint256)", +"0d16cba5": "addMessage(address,address,address,string)", +"0d172a01": "transferTokenTo(address,address,uint256)", +"0d174c24": "setWithdrawer(address)", +"0d17ace0": "currentDiscountPercentage()", +"0d17bc2e": "_disallow()", +"0d17c576": "_deliverBonusTokens(address)", +"0d18952b": "UpdateReleasePrice(uint32,uint256)", +"0d1946df": "MasterToken()", +"0d1a0c62": "setPackSize(uint256)", +"0d1a0d5e": "TokensPurchased(address,uint256,uint256,uint256)", +"0d1a94de": "SeriesCreated(uint256)", +"0d1ce2d2": "activateToken(address)", +"0d1cf200": "muscFund()", +"0d1d38aa": "info(uint256,bytes32)", +"0d1d6ffd": "checkTransferIn(address,uint256)", +"0d1d8d6d": "listTeams()", +"0d1dcd74": "foundersRewardsMinted()", +"0d1edad1": "Start8()", +"0d1ee029": "add(string,int256)", +"0d1efd7d": "getDistrictCode()", +"0d1f3471": "deleteRecord(address)", +"0d1f9bb6": "isBetLocked()", +"0d1fce42": "getBankroll()", +"0d20a889": "getRegistrantId(address)", +"0d213d31": "migrateTo(address,uint256)", +"0d2218d6": "millRaised()", +"0d229be7": "priceTokenWei()", +"0d24317d": "_getTotalHp(int256,int256,int256,int256)", +"0d244d68": "setNotRetractable(bytes32)", +"0d25320c": "distributedAmount()", +"0d2560ee": "addMe()", +"0d25b6f2": "getMonsterName(uint64)", +"0d260b60": "_sendTranche(bytes32,address,address,uint256,bytes,bytes)", +"0d2646d4": "switchNodes()", +"0d26c879": "getTotalFundationTokens()", +"0d271720": "transferFromAdmin(address,address,uint256)", +"0d274929": "getChannelName(uint256)", +"0d27864f": "TokenSwapOver()", +"0d278a8b": "Technology3GCrowdsale(uint256,address,address)", +"0d2806ad": "TOKEN_PRICE_D()", +"0d285d8c": "ETH_TO_QST_TOKEN_RATE()", +"0d28f8d1": "importIsland(bytes32,address[3],uint256[7],uint256[8])", +"0d290220": "getAllCardsType()", +"0d290deb": "SumToken()", +"0d294629": "splitProfits()", +"0d298318": "heapSort(uint128[])", +"0d2a1fa7": "mintAfterIcoPeriod()", +"0d2a246e": "tokenDividend()", +"0d2a25bb": "tentimes()", +"0d2bd1ac": "changeFact(string)", +"0d2be064": "buyToken(address,uint256,uint256,bool)", +"0d2cbe13": "settleBet(uint256,uint256)", +"0d2cc54a": "rebirthAxie(uint256,uint256)", +"0d2ce376": "submitVote(bytes32,bytes32)", +"0d2e017b": "getGamers()", +"0d2e677a": "getHotels()", +"0d2f2971": "authorized_recordFailedOldOwnerTransfer(address)", +"0d2f99d0": "removeChild(address,bytes32,bytes32)", +"0d2fc226": "createTokenUri(uint8,uint8,uint64,uint64,uint64)", +"0d3016bf": "_getIPFSHash(address,bytes32)", +"0d301c75": "removeFromGoldList(address)", +"0d30afb0": "CONFIG_DICE_SIDES()", +"0d310998": "DataContacts(address,address,address,address)", +"0d3167da": "BarmatzTestToken()", +"0d325b29": "setTokenApproval(uint256,address,bool)", +"0d329d14": "ICOtotalSupply()", +"0d334130": "m_callbackGas()", +"0d33cfa0": "meltAddress(address)", +"0d342cab": "autoTransfer()", +"0d3471f9": "sumHardCapICOStage5()", +"0d349aea": "updatePaid(address,address,uint256)", +"0d35f64c": "teamReservedBalanceOf(address)", +"0d3665b5": "IloveYou()", +"0d368fee": "deverify(address)", +"0d36c02c": "BACKUP_TWO()", +"0d3737b0": "mintAgent()", +"0d37ac7f": "toggleFunding(bool)", +"0d381a28": "tokensByOwner(address)", +"0d381cad": "addJobContract(uint256,string,bool)", +"0d38a077": "affRegister()", +"0d38ea48": "ethreceived()", +"0d38ffcd": "donationRate()", +"0d392cd9": "updateWhitelist(address,bool)", +"0d39820c": "preInvestStart()", +"0d39968c": "funderSmartToken()", +"0d3a557e": "_allowance(uint256,uint256,bytes32)", +"0d3ade73": "adjustNextTranche(uint8,uint8)", +"0d3b7901": "withdrawBonus(address[])", +"0d3c1b45": "addLayer(address,uint256,string,string)", +"0d3c7519": "distribute_NRT()", +"0d3cb409": "getAdjudicatorAddress()", +"0d3e4044": "binary_search(uint256,bytes32)", +"0d3f5cb5": "findCliPendTAndSetPrfm(address,address)", +"0d3fbdf8": "getPI_edit_8()", +"0d40022a": "_buildShip(uint16,uint16,uint8,bytes32)", +"0d40e8d6": "supportHarvestQuorum()", +"0d41117f": "calculateFee(uint256,uint256,uint256,bytes32,bool,bool)", +"0d42240a": "isWhiteListedAddress(address)", +"0d425559": "ownerSetMiningProfit(uint256)", +"0d441f8c": "totalNacInPool()", +"0d44cf79": "lastDelayedSetStake()", +"0d465263": "assessFees()", +"0d469483": "fiatToWei(uint256)", +"0d46f410": "getProposalParent(bytes32,bytes32)", +"0d46f877": "irucoin()", +"0d46f91a": "kycCertifier()", +"0d472f5f": "airdrop_byadmin(address,uint256)", +"0d4766a3": "STARTING_SHITCLONE()", +"0d480993": "getFoundersTokens(uint256)", +"0d483442": "NO()", +"0d4891ad": "signalDoneDistributing(uint256)", +"0d48a771": "claim(address,uint256,uint256,uint8,bytes32,bytes32)", +"0d48e8d0": "doBalance()", +"0d494a05": "isICOUp()", +"0d498b1e": "setTokenSPUsdCentPrice(uint256)", +"0d49a0f0": "addProofOfPerfBlock(uint32,bytes32,bytes32,bytes32,bytes32)", +"0d4a464f": "_newHorseShoe(uint256,uint256,uint256,bool,bool,address)", +"0d4a690a": "KopiToken()", +"0d4a8b3b": "wadmin_freezeAccount(address,bool)", +"0d4b8208": "convertCarbonDollar(address,uint256)", +"0d4c8f62": "setPayouts(uint256,uint256,uint256)", +"0d4d1513": "mint(address,uint256,address)", +"0d4d389f": "POOL_EDIT_4()", +"0d4e03e1": "changeTargetWallet(address)", +"0d4ea316": "buyLandWithTokens(bytes32,int256[],int256[])", +"0d4faa05": "acheter()", +"0d50266c": "TEAM_PERCENT_GZE()", +"0d505d54": "GDX()", +"0d5260e7": "setGasReserve(uint256)", +"0d5269ab": "distributeInviteReward(uint256,uint256,uint256,uint256,uint256)", +"0d5302c4": "DEVCLASS_EXTRACTION_BASE()", +"0d533e99": "UnlockEvent(address)", +"0d53b406": "recordEscrowOnBid(uint64,uint64)", +"0d543862": "sigBountyProgramEDUSupply()", +"0d54c49e": "processEndGame(uint256)", +"0d550b75": "allowance(uint256,address,address)", +"0d55af64": "AFRIHUBcredits()", +"0d5624b3": "preSaleStart()", +"0d567f38": "setStartRound(uint256)", +"0d571742": "setGenesisAddress(address,uint256)", +"0d57a47f": "setTokenCountFromPreIco(uint256)", +"0d582f13": "addOwnerWithThreshold(address,uint256)", +"0d5866e2": "setDeprecated(address)", +"0d59b564": "submitTransaction(address,uint256,bytes,uint256)", +"0d59c736": "Gavsino()", +"0d5a13f4": "BitdealCoin(address)", +"0d5a5c32": "CROWDSALE_OPENING_TIME()", +"0d5a621b": "childContractByIndex(uint256,uint256)", +"0d5be2df": "ballotLog(address,uint256)", +"0d5d6f7a": "BitEyeExchange(address)", +"0d5defa4": "escrowAddress()", +"0d5dfdd8": "debugVal4()", +"0d5e1e82": "redeemReputation(bytes32,address)", +"0d5e4c8d": "initialPrizeWeiValue()", +"0d5e87f4": "calcTokenAmountByZWC(address,address,uint256)", +"0d5f8f17": "setXWinContractAddress(address)", +"0d5fced3": "CHAJING()", +"0d605c4a": "NUM_RESERVED_AXIE()", +"0d60889c": "Thanks(address,address,uint8,uint8)", +"0d609939": "setParameters(uint256,uint256,uint256,uint256,address,address)", +"0d60e231": "migrationRewardTotal()", +"0d6103a1": "unsoldTokensBack()", +"0d616d20": "withdrawContribution()", +"0d61a4ff": "HUT34_VEST_ADDR()", +"0d61b519": "executeProposal(uint256)", +"0d61cd5d": "mintICD(address,uint256)", +"0d623e10": "oracleType()", +"0d63e87d": "setIntervalTime(uint256)", +"0d63fdbe": "parseOutputScript(bytes,uint256,uint256)", +"0d6495ef": "View_MediatedTransaction_Status(uint256)", +"0d649f90": "getVisaIdentifier(address,uint256,uint256)", +"0d65d50b": "TIER3()", +"0d65e3e7": "IS_SIGNATORY(address)", +"0d66343c": "getPaintingOwner(uint256)", +"0d668087": "lockTime()", +"0d668818": "dataContract()", +"0d66a3ec": "ApisCrowdSale(uint256,uint256,uint256,address,address,address,address)", +"0d679531": "soldedSupply()", +"0d6798e2": "userFinalize()", +"0d67d01b": "GradeBook()", +"0d68ddeb": "setBUUU(bytes32,uint256,uint256,uint256)", +"0d694114": "addressPremineBounty()", +"0d6a5c75": "ComputeHarvest()", +"0d6c66a1": "safesub(uint256,uint256)", +"0d6d1437": "changeMemberName(address,string)", +"0d6d1e64": "EricToken(uint256,string,uint8,string)", +"0d6dcab3": "getProofOfStakeReward(address)", +"0d6e548e": "getAgentsNum()", +"0d6ec16f": "isMyDrone(uint256)", +"0d6f6f0b": "summTeam()", +"0d6f72aa": "DLXV()", +"0d6f7ca3": "maxgas()", +"0d6f849b": "minAmountPresale()", +"0d6f8563": "withdrawWei(uint256)", +"0d6fef5f": "MoonBook()", +"0d70e29c": "isAuthorizedToTransfer(address,address)", +"0d70e7e3": "getRate(uint256,uint256)", +"0d71212f": "robotLiabilityLib()", +"0d7128d8": "setGoalETH(uint256)", +"0d7172f4": "canMakeUnrefusableOffer()", +"0d71aba5": "getRace(uint256)", +"0d729abc": "setStopDay(uint256)", +"0d72d57f": "backendAddress()", +"0d730a1a": "updateMerchant(string,string)", +"0d73a44a": "_collectFee(address,uint256)", +"0d73c10e": "totalWeiRaisedDuringICO2()", +"0d7519a9": "initialTokenSupply(address,uint256,bool)", +"0d7548f7": "seeEthPrice()", +"0d75d68e": "_canDownload(bytes32,uint8,bytes32,bytes32)", +"0d75f659": "TemperatureMeasurementA2(address,int8,int8,uint16,string)", +"0d7714e2": "PiedPiperCoin(uint256,string,uint8,string)", +"0d78573e": "releaseManager()", +"0d78bc17": "importCustomer(address,address,uint256)", +"0d7982ad": "lockMinting()", +"0d799734": "setMinSet(uint256)", +"0d7a90c8": "maxSeedStage()", +"0d7af726": "addGame(address,string,string)", +"0d7b4ac4": "setLLV_edit_27(string)", +"0d7b69e2": "fiatCurrency()", +"0d7bca61": "withdrawSuccessful(bytes32)", +"0d7bf53c": "getBlockHash(uint256,uint256)", +"0d7c064f": "setMinStandingBalance(uint256)", +"0d7cffb0": "PrizePool()", +"0d7dc36a": "setManagement(address,address,bool)", +"0d7eaa8b": "FudgeCucks()", +"0d7f7eff": "TokenDestructible()", +"0d8053ca": "getBetLength()", +"0d806df7": "setXaurCoined(uint256)", +"0d80b84b": "crowdSaleTime()", +"0d80bf64": "whitelist(string)", +"0d80fcdb": "distributeBonuses(uint256)", +"0d81057e": "multiplierOnWin()", +"0d81a570": "migrationDone()", +"0d826264": "phaseThreeLimit()", +"0d82cb3a": "setHeir(address,uint8,uint256)", +"0d830190": "getCharacterInfo(uint256)", +"0d831d09": "forwardUpdateFeesTo()", +"0d83304c": "getSales()", +"0d83a371": "unprocessedQueryBytes32s(uint256)", +"0d83dd8a": "recordNewAddress(address)", +"0d854646": "magic()", +"0d85ef17": "ZombiewCreator()", +"0d8693bd": "sBitcoin()", +"0d869ada": "immortals()", +"0d873644": "addToken(uint256,uint256,uint256,uint256,bytes)", +"0d87a7c0": "WLBDrawsDB()", +"0d8814ae": "cardOwnerOf(uint256)", +"0d882848": "BTNSold()", +"0d883bdf": "generateN()", +"0d88fb04": "removePatternUserIndex(address,bytes32)", +"0d895ee1": "setBurner(address,bool)", +"0d8b2708": "functionFour(uint256,uint256,uint256,uint256)", +"0d8b5fa2": "testControllerValidTransferFrom()", +"0d8b70bf": "grantAccessMint(address,address)", +"0d8c1a62": "toogleActive()", +"0d8c1c17": "read_supply()", +"0d8c2f67": "_logSendWebGiftAndSendEther(address,uint256)", +"0d8c3c2f": "calculator(address,uint256,uint256)", +"0d8cba74": "PublicMiningSupply()", +"0d8e6e2c": "getVersion()", +"0d8f9cee": "disableToken(address,address)", +"0d8fbe23": "getDigitFromUint(uint256,uint256,uint8)", +"0d8fd836": "ExeniumToken()", +"0d9019e1": "RECIPIENT()", +"0d9029ea": "Cryptodraw()", +"0d9049f2": "createOffer(uint256,uint256,string,uint256[])", +"0d927924": "XPCoin()", +"0d92b691": "transferDefaultPercentsOfInvested(uint256)", +"0d92d381": "ElectricQueue()", +"0d92ddac": "LockEvent(address,uint256,uint256)", +"0d92e3e8": "claimedTokens()", +"0d9332e2": "setMinContractBalance(uint256)", +"0d93afef": "revokePermissionBatch(address[],string)", +"0d9543c5": "donateAs(address)", +"0d955209": "ARTWORK_STARTING_PRICE()", +"0d95ccc9": "setPreSale(bool)", +"0d963235": "setGrowthBump(uint256)", +"0d973d2e": "getTimestampProposal(bytes32)", +"0d97f395": "redeem(string,bytes32)", +"0d98dcb1": "getTransferPreSignedHash(address,address,uint256,uint256,uint256)", +"0d997dc3": "setdivsforall(bool)", +"0d99bbec": "calculateUSDWithBonus(uint256)", +"0d99edbf": "presaleWeiLimit()", +"0d99f40a": "setInvestors(address)", +"0d9b2730": "FireXToken()", +"0d9b71cc": "setParter(address,uint256)", +"0d9d19b9": "joinMatch(uint256,uint256,string)", +"0d9db3f1": "VertesCoin()", +"0d9e16d1": "Alphonic()", +"0d9e8cab": "winnerLast(uint256,uint256)", +"0d9ec228": "_price_token_ICO3()", +"0d9f2817": "getJobSkillsCategory(uint256)", +"0d9f5aed": "mixGenes(uint256,uint256,uint256)", +"0d9f5faa": "oasisDirect()", +"0d9fcb03": "juegoSillaConsensys01(address)", +"0da03197": "_build(uint256,int256,int256,uint8)", +"0da04fa6": "Smrtoken()", +"0da072a8": "newMediaTokenCreated(string,address,string)", +"0da108ff": "JointICOBonusAmount()", +"0da1eb03": "deleteHiddenPosition(uint32,int64,bytes16)", +"0da24421": "bytesMemoryArray(bytes)", +"0da2c5f0": "setBuyLimits(uint256,uint256)", +"0da2e088": "upgradedContractAddress()", +"0da2ee2f": "init_register_contract(bytes32,address,address)", +"0da30317": "ExchangerPoint(address,address)", +"0da304b0": "AssetToken()", +"0da3bec6": "addToCategorie1(address,address)", +"0da3e613": "EthFactory()", +"0da4f991": "createContinuousSaleContract()", +"0da4fc46": "unMutex()", +"0da590d4": "withdrawDevFees()", +"0da5f845": "unBlacklistAccount(address)", +"0da719ec": "onERC998Removed(address,address,uint256,bytes)", +"0da76f1c": "externalDecline(uint256,bytes32)", +"0da84bc1": "newIntegrityFeeProposal(uint256,string)", +"0da86f7f": "JUSTed()", +"0da877d3": "getWeis(uint256,uint256)", +"0da8ba5d": "checkRecentInvestments(address)", +"0da95761": "upgrade(string)", +"0da97716": "isSignedByAlex()", +"0da9e3d7": "tokenIcoAllocated()", +"0daa431a": "currentstageplayer1()", +"0daa5703": "set(bytes32,bool)", +"0dab6e08": "getallowedContracts(uint256)", +"0dac3d99": "deadlineTwo()", +"0dae2a63": "DTXToken()", +"0daf233b": "agingTimeByStage(uint256)", +"0daf37e6": "Sales(address,uint256,string,uint8,string,uint256,uint256,uint256,uint256,uint256)", +"0daf7a8c": "setBlacklistInternal(address,bool)", +"0daf96f9": "ThaiBahtDigital()", +"0daf999a": "heroContract()", +"0dafc58f": "Compound_now_Accrued_interest()", +"0db02622": "ownerCount()", +"0db03955": "fundingProcessed()", +"0db0624a": "z_Determinations()", +"0db14e95": "getStakedAmount(address,address)", +"0db1b335": "getNextMaximumPlayers()", +"0db293cb": "depositDekla(uint256,uint256,bytes,uint256)", +"0db38253": "DEFAULT_CLIFF()", +"0db38f66": "BetChampion(uint256)", +"0db3be6a": "decrementOpenInterestFromMarket(uint256)", +"0db49c84": "TokensSold(address,uint256,uint256,uint256,uint256,uint256)", +"0db4bad0": "claimDate()", +"0db5db26": "weiToOwner(address,uint256)", +"0db6a786": "SALES_DEADLINE()", +"0db6ba9b": "debugGetNumPendingSubmissions()", +"0db71d53": "createCrowdsale(uint256,uint256,uint256,uint256)", +"0db73c72": "noevent()", +"0db74aaa": "getInvestorBalance(uint256)", +"0db75ab9": "UsingAVirtualStruct()", +"0db79003": "addWineryOperationByRegulator(string,string,string,string,uint256,uint16,string)", +"0db81580": "purchaseAd(uint256,string,string)", +"0db9d891": "icoEndOfStageA()", +"0dba2400": "addToMidnightPrize()", +"0dbb78ce": "showPoolMembers(uint256)", +"0dbbc14c": "endOfROSCARetrieveSurplus()", +"0dbcca89": "computeinterval(uint256,uint256)", +"0dbce4dd": "registerCandidate(string,string)", +"0dbd5270": "numberOfBackers()", +"0dbd5e81": "Send_Data(uint16)", +"0dbda70b": "angelOnLeaderboards(uint64)", +"0dbe671f": "a()", +"0dbea6d0": "robotRefund(address)", +"0dbedee7": "getNFTbyTokenId(uint256)", +"0dbf19cb": "PRICE_RATE_LAST()", +"0dbf23f4": "vehicleregistration(address,string,string,string)", +"0dbf2a3f": "isNewWeek()", +"0dbf527e": "MintedToken(address,uint256)", +"0dc03ec7": "INFLIV(uint256,string,uint8,string)", +"0dc06e50": "postTX(address,uint256,uint256)", +"0dc081c5": "tokenTransferOwnership(address)", +"0dc10a60": "advisorsAddress()", +"0dc115c8": "coinanxtemp()", +"0dc16a56": "getDepotEth(address)", +"0dc174bd": "track(address)", +"0dc1819f": "purchase_tokens()", +"0dc193f5": "getEtherReceived()", +"0dc1d357": "isAfterEnd()", +"0dc224ec": "partnersMintLockEnd()", +"0dc26492": "bankPercent()", +"0dc2e439": "setBZxAddresses(address,address,address,address)", +"0dc30397": "counterAppeal(uint256)", +"0dc3279d": "maxnumber()", +"0dc32b72": "EtherStopLoss()", +"0dc36f2a": "migrationAgentCandidate()", +"0dc5bffb": "crowdsaleTokenAmount()", +"0dc6bae5": "allowFreezeBypass(address)", +"0dc6c392": "Puttu()", +"0dc7bd07": "testBurnAuth()", +"0dc8b5a8": "shortenPreIco(uint256)", +"0dc8f435": "Party(address,uint256)", +"0dc96015": "getVotes()", +"0dc9c838": "changeSaleTimes(uint256,uint256)", +"0dc9ebfe": "FoundationAddr_()", +"0dca59c1": "debt()", +"0dca7ed8": "winningOption(uint256)", +"0dcad340": "getCitizenLocation(address)", +"0dcaf3e2": "test_setupSucceeded()", +"0dcb4627": "_addPendingRequestId(uint32)", +"0dcc59e6": "DEFROST_INITIAL_PERCENT_OWNER()", +"0dccca72": "showFPLocktime()", +"0dccfde4": "WithdrawProfitFunds(uint256,address)", +"0dcd772c": "AmountSent(address,uint256)", +"0dcd7a6c": "sendMultiSigToken(address,uint256,address,uint256,uint256,bytes)", +"0dcd9759": "PPToken(uint256,string,string)", +"0dcdefa8": "playThreeDiceTotal(uint256,uint256)", +"0dce06c1": "goalOfState(uint256)", +"0dcec63d": "updateEtherPrice(uint256)", +"0dcf298b": "pollExists(bytes32)", +"0dcf38a9": "FirstPaySend(uint256,address)", +"0dcf4b8f": "totalContribution()", +"0dd0a042": "lock(bool)", +"0dd0cf9e": "founderAdress()", +"0dd12d38": "moderatorTransferFrom(address,address,uint256)", +"0dd1d147": "ActionCompose(address)", +"0dd27120": "exchangeState()", +"0dd2d96c": "doFinalize()", +"0dd2d9c0": "Rookcont()", +"0dd30c81": "toB32(uint256,bytes,uint256)", +"0dd327fe": "FundsKeeper(address)", +"0dd32910": "welcomeMsg()", +"0dd3e1b1": "CNT_Crowdsale()", +"0dd3fd03": "buySpins(uint256)", +"0dd5db48": "startPreSale1()", +"0dd5e582": "masterTransferFrom(address,address,uint256)", +"0dd5ee1b": "verify(address,bytes32)", +"0dd636ef": "setBuyDividendPercentageFee(uint8)", +"0dd63ba3": "setIntArrayIndex(bytes32,uint256,int256)", +"0dd6a4ad": "addOversight(address)", +"0dd6eae1": "setCourse(uint256)", +"0dd84392": "setAllowance(address,address,uint256,uint256)", +"0dd8cdbb": "initRegistryData(address,address,address)", +"0dd93b56": "restartAuction()", +"0dda20d1": "sellCrystalDemand(uint256,uint256,string,string)", +"0dda350f": "dumpdivs()", +"0dda507e": "manualFinish()", +"0ddc4a94": "WHOLESALE_TOKENS()", +"0ddcc528": "Testable(bool)", +"0ddcfe8e": "checkAddress(address)", +"0ddd0824": "checkHash(bytes32,bytes32,uint256)", +"0ddeb632": "buy(bytes32,uint256)", +"0ddeeb4f": "tokenSaleUpperLimit()", +"0ddef58d": "isUnfrozen(address)", +"0ddf0bfd": "Cryptogs()", +"0ddf0c41": "updateCandidate(address,string,string)", +"0ddf78c2": "divForEthertoteDevelopmentWallet()", +"0de0271e": "paymentReceived(address,uint256)", +"0de04691": "testCreateWithParentForeign()", +"0de0b1bc": "giveBirthByUser()", +"0de1f4c1": "CreateCodeToken(uint256,string,string)", +"0de2b2d8": "openPosition(address[11],uint256[10],uint32[4],bool,bytes,bytes)", +"0de3513a": "test_validRuleChange()", +"0de39733": "activateFlat(address,uint256)", +"0de3b100": "VoteForProposal(uint256)", +"0de41aa4": "checkIfAddressIsWhitelisted(address,address)", +"0de41e45": "lockBegunAtBlock()", +"0de54c08": "setUpgradeController(address)", +"0de607c3": "makeSubscriptionID(address,uint256)", +"0de6aa7f": "getOneTimeCostsPaid()", +"0de78a7f": "removeEggFromSale(uint256)", +"0de94e4a": "HodlEth(address,uint256)", +"0de96dff": "giveBack()", +"0de9b825": "sellShip(uint256,bytes32)", +"0de9cacd": "reCalc()", +"0dea35bf": "playerBet(uint256)", +"0dea38b6": "VESTING_TIME()", +"0deaf3f8": "claimNextReward(address,uint256)", +"0dec1c23": "requestDetachment(uint256)", +"0dec5d85": "initializeCrowdsale()", +"0ded195e": "freezeTokensOfOneUser(address)", +"0ded7f62": "secondBonusEnds()", +"0dedffb8": "feedAndMultiply(uint256,uint256)", +"0dee302e": "transferToRef(address,uint256)", +"0dee34ed": "tokensaleStageAt(uint256)", +"0dee3863": "nameEntriesCount(bytes32,uint16,bytes32)", +"0dee4af0": "doThrow(uint256)", +"0def3866": "updateChamp(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"0df04802": "_7_russkayaRuletka()", +"0df07980": "secondLevelPrice()", +"0df0de11": "ownerChangeBuyerfee(uint256)", +"0df104d7": "EtheeraToken(address)", +"0df12532": "setpricefactor(uint256)", +"0df18942": "hsub(uint128,uint128)", +"0df19d35": "lockup(address)", +"0df22268": "CryptoSanguoToken()", +"0df23e5b": "saleCounterThisPhase()", +"0df2dcd2": "OdinToken()", +"0df3a342": "_coldStorage()", +"0df4135a": "CMCT()", +"0df428f0": "GoldenFleeceToken(uint256)", +"0df62a33": "Lilbank()", +"0df63210": "DOMAIN_SEPERATOR()", +"0df71602": "setWinner(uint256)", +"0df76370": "createInvoicingAddress(string,string)", +"0df8cbfe": "isCluster()", +"0df8e481": "setassetPrice(uint256)", +"0df9178f": "LimeEyes()", +"0df9d568": "CentraWhiteList()", +"0dfa1140": "_RaffleDraw()", +"0dfa71ae": "salesAgent()", +"0dfad849": "TokenSale(address,address,address,address)", +"0dfb0297": "changePriceSelectFight2Death(uint256)", +"0dfb6615": "user(bytes32)", +"0dfbdcc5": "lethalBonusAtHits()", +"0dfc2bcd": "originalFunds()", +"0dfce266": "setCovman(address)", +"0dfd085a": "ICOBeginsAt()", +"0dfd45f9": "removeHelper(address)", +"0dfd799c": "SponsoredLink(string)", +"0dfdcb76": "setAuctionWinnerMessageHash(bytes32)", +"0dff5cb9": "bop()", +"0e001ec0": "balanceOfContractFeeToken()", +"0e011262": "mockWhiteList()", +"0e014cf8": "viewBalance(address,address)", +"0e0280d0": "bookRoom(string,uint256[],uint256,address,bytes32)", +"0e0290a4": "_3_orientation()", +"0e037cc0": "bulkRemove(address[])", +"0e03f276": "setLLV_edit_7(string)", +"0e04a7d8": "isGameOver()", +"0e05a512": "superVoteAgree(address)", +"0e0643ae": "EvTokenAdd(uint256,uint256)", +"0e06e7ef": "NFOCoin(uint256,string,string)", +"0e0701be": "test_oneValidEqStringUint(int256)", +"0e07419c": "ConversionStarted(uint256)", +"0e07658b": "eliminate(uint256)", +"0e07ef81": "registerNameXname(string,bytes32)", +"0e088c98": "cancelChainlinkRequest(bytes32,uint256,bytes4,uint256)", +"0e0a0d74": "getAmount(bytes32)", +"0e0a6f0c": "getHours()", +"0e0ac84c": "QBASE()", +"0e0afb86": "getKYCVerificationContractAddress()", +"0e0b3519": "rateTierHigher()", +"0e0bc104": "computeNextGen0Price()", +"0e0c3f58": "super_transfer(address,uint256)", +"0e0c8241": "MAXIMUM_LOOP_BOUND()", +"0e0d3567": "highestAddressReserving()", +"0e0d946b": "CyberPayToken()", +"0e0dbd72": "updateToSendFromStorage(address)", +"0e0e26da": "getRemainShareAmount()", +"0e0e4acc": "LIANG(uint256,string,string)", +"0e0e73a8": "next_round_players()", +"0e0f05a5": "executeRaiseCapital(uint256)", +"0e0f1f00": "allocationAddressPreICO()", +"0e0f55d0": "RewardOrder(uint256,uint256)", +"0e0fec9f": "Arbitrage()", +"0e1087c3": "getMarketMakerFunds()", +"0e10e99d": "Vault(bytes32)", +"0e10f1ae": "X2()", +"0e114c89": "setBonusAffiliate(uint256,uint256)", +"0e11624b": "crowdsaleBalances(address)", +"0e136b19": "deprecated()", +"0e137368": "getBorrowInfo(uint256)", +"0e13af5d": "lockedTokensWallet()", +"0e13b9af": "getValue(uint8,uint8)", +"0e1456c0": "maxPreSale2Token()", +"0e149b52": "RBRToken()", +"0e14a376": "deleteAddress(bytes32)", +"0e14f955": "readyTobreed(uint256,bool,uint256,bool)", +"0e153d48": "MarketStake(address,address,address,address)", +"0e15561a": "totalRewards()", +"0e1565c2": "getClaims(string)", +"0e15dc89": "sizeOf()", +"0e169119": "grantAccess(bytes32,address,string)", +"0e18d11e": "changeFunder(address,address)", +"0e18ea3c": "fuoco()", +"0e19bac1": "MOBILINK()", +"0e19f74f": "makeDeposit(uint256,address,address,address)", +"0e1a0217": "boolOrRevert(bool,uint256)", +"0e1a0399": "calculateWithdrawalAmount(uint256)", +"0e1a9e3f": "getJobSkillsArea(uint256)", +"0e1ac81f": "natecoin(uint256,string,string)", +"0e1ae0e4": "RateUpdated(uint32)", +"0e1af57b": "getScore(uint256)", +"0e1b39fb": "Wallet()", +"0e1c0188": "errorTickerQueryError(string,bytes32)", +"0e1c2d46": "deliveryVSpayment(bytes32,uint8,bytes32,bytes32)", +"0e1c6491": "getTotalBettersForFighter(address,address)", +"0e1ca8a5": "Oraclize()", +"0e1cdd2d": "getStandardComponent(uint256)", +"0e1cfd97": "tokensub(address,uint256)", +"0e1d2ec8": "isUpdatable()", +"0e1d88fc": "addTender(uint256,uint256,address,uint256)", +"0e1da6c3": "claimTimeout()", +"0e1e1d0f": "removeAuthorized(address,address)", +"0e1e3914": "coreSupply()", +"0e1e56f7": "Tix()", +"0e1f6d3b": "DIGC(address[],uint256[])", +"0e1fa28f": "containMinValueFromOther(uint256,address)", +"0e1fd315": "changeWhitelistStatus(address[],uint256[])", +"0e20ebe2": "right96(uint256)", +"0e213129": "ZestCoin()", +"0e216954": "ReturnEthToEtherhero()", +"0e21750f": "setFund(address)", +"0e219339": "getContractHash(string)", +"0e21a6a6": "ADD_TIERS(bytes32)", +"0e21c886": "OWNERS_TOKENS_AMOUNT()", +"0e21f784": "getCoverImage(address,uint256)", +"0e21fce3": "Suggest(string)", +"0e2286d3": "rdiv(uint256,uint256)", +"0e22dc5b": "getAllCommentIdsByAd(uint256)", +"0e2318cb": "BonumFinancialTokenPreSale(uint256,uint256,address,address,uint256)", +"0e234cd4": "countBonus(uint256)", +"0e2350ba": "TopCoinSaleClosed()", +"0e239679": "SputnikToken(address)", +"0e2451c7": "Lilith()", +"0e24c52c": "register(string,string,string,string)", +"0e24c810": "calcAmountWithBonus(uint256,uint8)", +"0e2562d9": "getAccountAddress()", +"0e25b620": "addFreeze(address)", +"0e263906": "transferToBranch(address,uint256)", +"0e26fb41": "SeniumSupply()", +"0e27324d": "approveKYC(address)", +"0e274eab": "pullTokens()", +"0e275b49": "artworkSaleCount()", +"0e27e3df": "removeConsumer(address)", +"0e2833eb": "random(uint8,uint8)", +"0e288064": "setManyBonusExtra(address[],uint256)", +"0e28bc4a": "CanceledAuctionEvent(address,address,uint256,uint256)", +"0e2916e1": "requestClosingChannel(uint256)", +"0e2984d1": "Cancel(uint64,address,address,uint256,int256)", +"0e29df22": "sendEther()", +"0e2a05c8": "delayOfICO2()", +"0e2a273f": "getCandidateIndexArrayLength()", +"0e2a9237": "r15Backers()", +"0e2ae77c": "addVesterManager(address)", +"0e2b75cc": "setWhitelistedMemberTypes(uint256[])", +"0e2cfe93": "getPercent(uint8,uint256)", +"0e2d1a2a": "vestedBalanceOf(address)", +"0e2d27cd": "claimUnsoldCoins()", +"0e2dc949": "TIER_3_BUYIN()", +"0e2dce69": "Play()", +"0e2df9aa": "Withdraw(address,uint256,int256)", +"0e2e4037": "removeOwnersConfirmations(address)", +"0e2e4ce8": "maximumLockYears()", +"0e2ebe6c": "GetPoolInformation(address)", +"0e2f0a0f": "weiReceive()", +"0e2f5fb3": "getThree()", +"0e2f8058": "setBCFContractAddress(address,address)", +"0e2f94a6": "RegionsToken()", +"0e2fb51f": "addinverst(address,uint256)", +"0e30643f": "MemberChanged(address,uint256)", +"0e30cda7": "getTotalCoinsAvailable()", +"0e316ab7": "removeSigner(address)", +"0e32a720": "sendMarketByOwner(address,uint256)", +"0e336f00": "getSeedsSinceLastHatch(address)", +"0e33e181": "get_modulo_value(bytes32,uint32,uint32)", +"0e3484c1": "DelGift(string)", +"0e34df82": "openTicket()", +"0e351605": "transfer_token(address[],uint256)", +"0e3589d9": "DAILY_FUNDS_RELEASE()", +"0e366cbf": "ourLastJackpotWinner()", +"0e3802e9": "addRewardToken(address,uint256)", +"0e388774": "setContractorImpl(address)", +"0e38901a": "unvault(uint256)", +"0e39b210": "founders_1()", +"0e3a04a7": "digitalcashToken()", +"0e3a23db": "mineMany(address[],uint8[],bytes32[],bytes32[])", +"0e3a997e": "countPartnerPlayers()", +"0e3ab61d": "startSale(uint256)", +"0e3b70fd": "month48Allocated()", +"0e3bc6ca": "BLOCKLAND()", +"0e3be37d": "ToggleTransferAllowanceFor(address,bool)", +"0e3c8068": "BotpyToken(uint256,string,string)", +"0e3c9563": "privateIssue(address,uint256)", +"0e3d2202": "feeFixed()", +"0e3db9f2": "startNow()", +"0e3e9a67": "FundsMigrated(address)", +"0e3f732a": "TheGame()", +"0e3fd8c2": "getSolid(uint256)", +"0e407bdd": "soldTokensMainSale()", +"0e414500": "setClaimingStart(uint256)", +"0e417055": "address5()", +"0e41c63b": "addHistory(uint256,address,uint8)", +"0e420f42": "setEventResult(string,uint64,uint8)", +"0e429ecc": "providerValue()", +"0e4355d4": "validFactories(address)", +"0e43806a": "Rental(address)", +"0e438ee5": "withdrawTeamToken()", +"0e43d7c3": "getUserRoleBitmask(address)", +"0e449cf9": "foundersTokens()", +"0e4649fd": "LogProcessedInterval(uint64,uint64)", +"0e46695e": "sumHardCapICO2()", +"0e468245": "pledgeEth(uint256)", +"0e473722": "volumeType4()", +"0e4739b1": "_refulshFrozenInfo(address)", +"0e476e27": "getten(string)", +"0e479dc7": "getShop(address)", +"0e47c259": "evolveByAtom(uint256)", +"0e47c76f": "rotate(uint64,uint256)", +"0e496d25": "VICETOKEN_ICO_IS_FAKE()", +"0e4983ff": "setSecondsAfter(uint256)", +"0e4a4e8c": "fechVoteNumForCandidateByStage(address,uint256)", +"0e4aed3f": "yearlyRewardPercentage()", +"0e4b0ba8": "account2Address()", +"0e4b10b6": "totalETHLimit()", +"0e4b8389": "getEstKeyBlockNr(uint256)", +"0e4c3aa6": "OrangeCirculateChain()", +"0e4d5919": "PHASE1_START_TIME()", +"0e4debbc": "SHIT()", +"0e4e0054": "isIcoFinshed()", +"0e4e47cb": "claimAfter90days()", +"0e4e5d93": "_bidERC20(address,address,uint256,uint256)", +"0e5004e6": "_calcPhasesPassed()", +"0e501834": "emergencyTransfer(address)", +"0e5112a4": "get_dividend()", +"0e51574f": "endGameRound()", +"0e51c00d": "getPawnStatus(uint256)", +"0e5229b0": "addOwner(address,uint8)", +"0e5263fa": "discountedTokensPerDollar()", +"0e5356ec": "testEvents()", +"0e536ff4": "ratifyMint(uint256,address,uint256)", +"0e5376d6": "vars()", +"0e53aae9": "connectors(address)", +"0e53bf67": "producedDiamondCaps()", +"0e541185": "pauseBet(uint256)", +"0e542f82": "refundOptions(address)", +"0e54316f": "setSantaClaus(address)", +"0e54a883": "setPublicSaleDate(uint256)", +"0e54b872": "registerUser(string,address)", +"0e54d1fc": "pruneShareholders(address,uint256)", +"0e554bd8": "scheduleCall(bytes,uint256,uint256,uint8)", +"0e5689bc": "getBidsNum(address,uint256)", +"0e56f529": "guardarDocumento(string,bytes32,bytes32)", +"0e58369f": "registrator(address)", +"0e583df0": "GEN0_STARTING_PRICE()", +"0e587aee": "set_presale_arbits_per_ether(address,uint256)", +"0e58d08c": "setInvestmentGateway(address)", +"0e597ed9": "PreCrowdsale(address,address)", +"0e5a6c70": "peep()", +"0e5aaace": "initIcoRule()", +"0e5aaffc": "getSellingItemByObjId(uint64)", +"0e5c011e": "harvest(address)", +"0e5c6a3d": "_withdrawTo(address)", +"0e5ceb47": "register(bytes32,bytes32,string)", +"0e5d095d": "codepointsOf(uint256)", +"0e5d4b99": "fechVoteMainInfoForVoter(address)", +"0e5e36fb": "TCH(uint256,string,uint8,string)", +"0e5e4d72": "createAndExecuteTransaction(address[],uint256[],uint256)", +"0e5fc721": "addUserBalance(uint32,uint64)", +"0e5fdad4": "releaseTeamTokenTransfer()", +"0e5ffb3c": "hashVersion(uint32,uint32,uint32,string,string)", +"0e60de7a": "rinkeby3()", +"0e620d70": "MultiSend()", +"0e62fde6": "getAttributeTypeID(uint256)", +"0e6436d2": "TokenChange(address)", +"0e64780d": "distribute(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"0e64ff0e": "tradeWalletTokens(address,uint256)", +"0e655432": "adventureItemContract()", +"0e65e5d9": "ETBSToken(address)", +"0e662cf0": "buyTokens(uint16)", +"0e662ff9": "oddEven(uint8,address)", +"0e666e49": "userExists(address)", +"0e67cf6c": "GetWageredWei(bytes32)", +"0e67f4bb": "ReferrerRegistered(address,address)", +"0e6848cc": "massNotify(address[])", +"0e686170": "changeTotalAirdrop(uint256)", +"0e687501": "OpticalNetwork(address)", +"0e68c2f0": "finishPurse(uint256)", +"0e69782b": "BCTT()", +"0e698493": "transferFounderTokens(address,uint256)", +"0e69890f": "withdrawATN()", +"0e69d16b": "testToSliceB32()", +"0e6ae3fb": "bid(string,string,uint256)", +"0e6b0afc": "adminContractSettings(uint32,address,uint256)", +"0e6b5823": "changeMaxBet(uint8[157])", +"0e6bc36c": "OkeToken()", +"0e6c04db": "icoThreshold1()", +"0e6c5f93": "changeAddr(address)", +"0e6ce30d": "createNew(uint256)", +"0e6d1de9": "getLatestVersion()", +"0e6d3a89": "mintingState()", +"0e6dfcd5": "redeem(address,address,uint256)", +"0e6e1b3e": "addSubject(bytes32)", +"0e6e4f3e": "lockPlayerFunds(address)", +"0e6f21f2": "sendBatches(address[],uint256)", +"0e6f2cf8": "game_withdraw()", +"0e708203": "rewardAccount()", +"0e70ab11": "addEthBonusToBuy(address,uint256,uint256)", +"0e70f147": "immediateRefund()", +"0e713a50": "_preValidatePreICOPurchase(address,uint256)", +"0e714202": "returnContributionsToTheSponsors()", +"0e7238f1": "setNormalRoomMax(uint256)", +"0e741a36": "generateVoteSecret(string,uint256)", +"0e7470cb": "getFullProfit(uint256,uint256,uint256)", +"0e752702": "repayBorrow(uint256)", +"0e757191": "finalizeRound(bytes32,uint8,bytes4)", +"0e757a2e": "testSetAndGet()", +"0e78501f": "ChangeStart(uint256)", +"0e787cce": "predict(bytes32)", +"0e792536": "removeGlobalConstraint(int256,address,int256,address)", +"0e7938ec": "tokenCreateFunction()", +"0e79964c": "getBoolField3()", +"0e7a2d4e": "isInAssetList(address)", +"0e7a967a": "_distributeBountyToken(uint256)", +"0e7b592a": "Halo()", +"0e7b8e07": "Sleipnir()", +"0e7b9f10": "hasBuyerLotteryBonusWon(address)", +"0e7bda18": "addAddressListItem(bool,address,address,uint256,address)", +"0e7c0f80": "masterCopyCountdown()", +"0e7c1cb5": "originalToken()", +"0e7c5d2b": "test_validEmptyEqEmpty256()", +"0e7ce976": "owner_bonusSend()", +"0e7d490d": "numberOfVotes()", +"0e7ebce4": "min_bid()", +"0e7f2be7": "DecreaseAllowance(address,uint256)", +"0e7f756a": "totalAssetUnits()", +"0e801d7a": "ticket(address,bool,uint256)", +"0e80d8b9": "PRICE_SALE()", +"0e8162ba": "totalBurntCoins()", +"0e816f66": "payForYourGladiator(uint256)", +"0e830e49": "setEngine(address)", +"0e8354b9": "CreateOOG(address,uint256)", +"0e83afbb": "approveTokens(bytes32,address,uint256)", +"0e83d92b": "playerPull()", +"0e840284": "LMDA()", +"0e848c1d": "NeoBitToken()", +"0e850239": "scheduleCall(bytes4,bytes)", +"0e856588": "getScheduledTimelockCount(address)", +"0e858b64": "setBridgeValidatorsOwner(address)", +"0e8670e0": "highestPrice()", +"0e86b63e": "calcLevel2Bonus(uint256)", +"0e86ec01": "doConfirmDeath()", +"0e870871": "rateOfZLT()", +"0e87457b": "ZincElement()", +"0e887cda": "getUserMoney(address)", +"0e88aace": "contractErc20Token()", +"0e88c4a4": "RegisterMine(string,uint256,address)", +"0e89341c": "uri(uint256)", +"0e89439b": "stake(uint256,bytes)", +"0e8a4ac7": "getPositionPrincipal(bytes32)", +"0e8b3971": "mintTap()", +"0e8bf00e": "ReleaseOfAccount(address,uint256)", +"0e8c0cdd": "_mineableSupply()", +"0e8ca718": "transferCurationRights(address)", +"0e8da019": "getInitRound(uint256)", +"0e8de473": "getDividendBalance(address,address)", +"0e8ef0c1": "systemOnSaleCount()", +"0e8f0a95": "commonDiscount()", +"0e91f4b3": "removeBadToken(address)", +"0e923d3b": "submitEther(address)", +"0e9279a0": "BountyManager()", +"0e929611": "AdminRemoval(address)", +"0e92eb6d": "sellMyTokens(uint256)", +"0e934447": "createPromoPlayer(address,string,uint256,uint256)", +"0e940fd8": "CELL_ADD_SPACE()", +"0e94869e": "ArJoust(uint256,uint256)", +"0e94a0ee": "proofToken()", +"0e95e127": "readpriceXname(string)", +"0e96127a": "transferEther(address,address,uint256)", +"0e96938c": "matchExistingBids(bool,bytes32)", +"0e972421": "isSpawningAllowed(uint256,address)", +"0e975f73": "FirstPeriodEndDateUpdated(uint256,uint256)", +"0e978e81": "AgriChainDocumentContract()", +"0e97cfdf": "placeOrder(uint256,uint256,uint256)", +"0e97e3d3": "validateAuthentication(address,uint256,uint256)", +"0e97fa7a": "setEarlyParticipantsWhitelist(address[],bool[],uint256[],uint256[])", +"0e98f811": "reservedTotalSupply()", +"0e995ff5": "cd()", +"0e997ce3": "IPMCoin()", +"0e99b380": "getCoinAddress(bytes4)", +"0e99f5e6": "claimBonus(address)", +"0e9a9dbb": "signature(string,address,bytes32)", +"0e9aa208": "getAddressAdmixture()", +"0e9b6281": "setSubsidy(uint256)", +"0e9cbbad": "PurchaseFailed(address,uint8)", +"0e9ccb94": "Boboho()", +"0e9d02cc": "setTokensPerKEther(uint256)", +"0e9d56a2": "getTotalEth()", +"0e9e543a": "collectableTokenOf(address)", +"0e9ecedd": "mEtherInvalid()", +"0e9ef902": "join_voter()", +"0e9f0816": "getContractHash(uint256)", +"0e9f9f86": "isMinimalReached()", +"0e9fb0ed": "getOptionAddress(address,uint256,address,uint256,uint256,bool)", +"0e9fd199": "licenseAffiliate(uint256)", +"0ea008c8": "bonuscalpre()", +"0ea04562": "requestRandom(uint256)", +"0ea12558": "girlIdToOwner(uint256)", +"0ea126f9": "registerUser(address,string)", +"0ea17a76": "safe_mul(uint256,uint256)", +"0ea1f459": "DVCToken()", +"0ea227e7": "StarTravelLane()", +"0ea317a9": "SUNCOIN()", +"0ea37c64": "repost(uint256)", +"0ea412ab": "_setPrice(uint256)", +"0ea49bc1": "changeRental(address)", +"0ea4eef0": "getMaxGroupBalance(uint256)", +"0ea51122": "decreaseMarketCreatorSettlementFeeInAttoethPerEth(uint256)", +"0ea5edea": "payTodayReward(address,uint256)", +"0ea662ea": "hourPot()", +"0ea733bf": "setmyPrice(uint256,uint256)", +"0ea7a110": "getEmployee(address,uint256)", +"0ea7c8cd": "airDeliver(address,uint256)", +"0ea7ee82": "testRegisterAndVerified()", +"0ea81cf9": "initialPokemonInfo()", +"0ea8e5ac": "tokenPriceIncremental_()", +"0ea9e4f1": "doInitialReport(uint256[],bool)", +"0eaac106": "TokensAdded(address,uint256)", +"0eaadd04": "_addBurner(address)", +"0eaaf4c8": "withdrawBid(uint256)", +"0eaaf5ac": "auction_start_time()", +"0eab31b1": "initAuctions(uint256,uint256,uint256,uint256)", +"0eaba26a": "getCurrentValidatorsLength()", +"0eabdab6": "removeOracles(bytes4[],address[])", +"0eabeffe": "sendMessage(string,string,string)", +"0eac6ae7": "getClientAtIndex(uint256)", +"0eac7a0e": "transferToAnotherAddr(address,address,uint256,string)", +"0eacecd2": "getEquipTokens(address)", +"0eacf634": "BKCToken()", +"0ead3ec8": "payeePricePerPart()", +"0eada49f": "standingOrdersByPayee(address,uint256)", +"0eae2f86": "initAccount(address,uint256)", +"0eae73dd": "stringToAddr(string)", +"0eaee52c": "setGrantsUnlock(uint256,bool)", +"0eaf94c3": "secondDueDate()", +"0eaf9fa4": "ownerSetMinBorrowedValue()", +"0eafb6da": "getCapInWei()", +"0eafe473": "balanceOfCoin(address)", +"0eb05d49": "viewGoldList(address)", +"0eb0afa6": "createDebt(address,address,uint256)", +"0eb14edb": "Mondo()", +"0eb15f0f": "claimRewardWithBlockData(uint256,bytes)", +"0eb1947f": "changeGatewayAddr(address)", +"0eb288f1": "executeTransaction()", +"0eb34740": "lockedTokens()", +"0eb3f5a0": "sweepCommission(uint256)", +"0eb3f993": "getAreaQualityByDay(uint32,uint32)", +"0eb40426": "IncPreSupply(uint256)", +"0eb40916": "EthernautsStorage()", +"0eb43fe3": "SaleClockAuctionERC20(address,uint256)", +"0eb495c2": "pushCity()", +"0eb4c7d6": "checkTeamUnlockedTokens(address)", +"0eb4d170": "setLockup_dakehus(address,uint256,uint256)", +"0eb51018": "getProductOperation(string,address,uint256,uint256)", +"0eb523ac": "PRIVATE_STAGE_FINISH()", +"0eb524d4": "block1()", +"0eb5a167": "XCloudRoc()", +"0eb6f543": "hodlerTotalValue6M()", +"0eb82c13": "updateHpbNode(address,bytes32,bytes32,bytes32)", +"0eb8d153": "AICoreCoin()", +"0eb8ed07": "transferEnable(bytes32)", +"0eb8fe7a": "getChannelCount()", +"0eb944d5": "PiperToken()", +"0eba6b06": "getChannelInfo(address,address,uint32)", +"0eba7f2d": "SomeCoin(string,string,uint8,uint256)", +"0ebb0d30": "getSummaryReferralProfit(address)", +"0ebb172a": "WITHDRAWAL_DELAY()", +"0ebbe5d6": "firstPrivateLockTime()", +"0ebbf213": "AddPauser(address)", +"0ebc1568": "viewTokenName(uint8)", +"0ebdc43a": "IsSaleEnabled()", +"0ebe0f32": "HacToken()", +"0ebe31c8": "getCountTrack()", +"0ebe4acb": "EtherModifierMonstro()", +"0ebf0bcb": "FAID(uint256,string,uint8,string)", +"0ebf3886": "CryptoLandmarks()", +"0ebf5f27": "Reservation2(address,uint256)", +"0ec0692a": "prizeEth()", +"0ec0786d": "tb()", +"0ec08b29": "getLoopLimit(uint256,uint256)", +"0ec0fce5": "setPercentage(uint256,uint256,uint256,uint256)", +"0ec1268c": "_freezeFunds(address,address,uint256,uint256)", +"0ec12782": "internet()", +"0ec173d0": "changeTreshold(uint16)", +"0ec1b057": "verify(bytes32,string,string)", +"0ec1ce16": "_getCurrentRate()", +"0ec1e7ac": "claimBalanceByOwner(address)", +"0ec2c379": "_getJYPCBonus(uint256)", +"0ec2c5d7": "loik()", +"0ec3b247": "testControlSetEnforceRevisionsNotOwner()", +"0ec3f62e": "NITRONEUMERC20(uint256,string,string)", +"0ec48a42": "quater4()", +"0ec4fb0a": "WHITELIST_PERIOD()", +"0ec52541": "unshelf(string)", +"0ec55d6d": "SprinkleCoin(uint256,string,string)", +"0ec59606": "addPlayerTxHistory(address,uint256,uint256,uint256,uint256)", +"0ec5c49a": "changeEthToTokenRation(uint8)", +"0ec6688d": "intrepidSoldCount()", +"0ec66924": "getStudentRequestsLength()", +"0ec6b08d": "validIdentifier(uint256)", +"0ec78d9e": "setup(address[],uint256,address,bytes)", +"0ec843d1": "setMinAmount3Round(uint256)", +"0ec852f2": "QuranToken()", +"0ec89f2b": "requiredProgressOfPreviousDungeon()", +"0ec8c387": "getContractRates(bytes32)", +"0ec8e2b4": "Moneyplant()", +"0eca4c92": "CryptoPunksMarket()", +"0ecae7d3": "wager(bool,uint256,uint256,uint8,bytes32,bytes32)", +"0ecaea73": "create(address,uint256)", +"0ecb93c0": "addBlackList(address)", +"0ecba3f8": "BusinessAutomationUnion()", +"0ecd0424": "decompressPoint(uint256,uint8)", +"0ecda113": "freezeEndTime(uint256)", +"0ecdbfd4": "DesingCoin()", +"0ecdd94f": "goldFeeDataUpdatedAtBlock()", +"0ecea92c": "allowInvestor(address)", +"0ecf19e5": "balanceWithoutFreezedBonus(address)", +"0ed0b19f": "resetBonusPool(uint256,uint8)", +"0ed15d23": "dInit(address)", +"0ed21029": "getIssueAssignee(uint256,bytes32)", +"0ed2fc95": "exchange(address,address,uint256,uint256)", +"0ed387c1": "getSpinsContainer(bytes32)", +"0ed3909c": "startBonusCompaign(uint256)", +"0ed3d5b9": "passed(address[])", +"0ed40dff": "resetAppendDecryptedBids(uint256)", +"0ed469b8": "houseFee()", +"0ed5410a": "endOfRewards(bool)", +"0ed59a60": "releaseProof(bytes32,string)", +"0ed5a933": "isCanceled()", +"0ed61407": "makePick(uint8,uint256)", +"0ed659b4": "getLLV_edit_18()", +"0ed68aa5": "getPlanetOwners(uint256,uint256)", +"0ed6b171": "LogStartICO()", +"0ed74c08": "func_0C2C()", +"0ed7a0f2": "Predatex()", +"0ed7c905": "FantomToken()", +"0ed86f04": "withdrawDivis()", +"0ed9b97b": "buy_fromContract()", +"0edaf441": "lockAddressRegistration(address)", +"0edc1923": "changeMaximumHodlDuration(uint256)", +"0edc4737": "SEED()", +"0edc54a8": "holdTokens(address)", +"0edd2ffc": "penalty()", +"0edddd3e": "lstFunc(uint256[])", +"0ede050b": "ico3Max()", +"0edf2134": "deathData_a17()", +"0edfb0f7": "withdrawCollectedInterest()", +"0edfe7ec": "setBackendWallet(address)", +"0ee02d9d": "getHash(address,address,uint256,bytes,address,uint256)", +"0ee07836": "adjustDifficulty(uint256)", +"0ee21ddc": "setEtherPriceUSDWEI(uint256)", +"0ee2b0e6": "commissionToWithdraw()", +"0ee2cb10": "getCreator()", +"0ee2ce58": "VKNToEth()", +"0ee33128": "RequestRefund()", +"0ee33c70": "claimed_blocks()", +"0ee36dbc": "setParamsStopSale(bool)", +"0ee3c31d": "getUserIndexOnEther(address)", +"0ee4229c": "grantReservedToken(address,uint256)", +"0ee454dc": "getBUB(bytes32,uint256)", +"0ee526e0": "enableMintToken()", +"0ee5ca1f": "secondsLeftPublic()", +"0ee62c77": "getStageVolumeBonuses(uint256)", +"0ee75f6b": "TOKEN_THIRD_PRICE_RATE()", +"0ee7968e": "REWARD_NUM()", +"0ee79fb3": "closeReferendums()", +"0ee7c858": "beatMartialOwner()", +"0ee7f045": "TransferSellAgent(address,uint256)", +"0ee85800": "getCFOHashing(address,uint256)", +"0ee8e338": "testFailCreateWithParentsForeignNotInUse0()", +"0ee95ecf": "getNextPrice(bytes32)", +"0eea10b1": "sysPer()", +"0eeb63b9": "getUserAccountTokenBalance(address,address)", +"0eebd59b": "log_recast(address,uint256)", +"0eebdb04": "AprilAirdrop(address,address)", +"0eecae21": "draw()", +"0eecc2a3": "updateRequiredTimeBetweenDraws(uint256)", +"0eeccb84": "removeAdvisor(address)", +"0eed49d0": "_createFighter(uint16,uint256,uint8,uint8,uint8,uint8,address)", +"0eedc7b5": "voteDescription(uint256)", +"0eedc9d9": "payAffiliate1Address(address)", +"0eefdbad": "tokenTransferProxy()", +"0ef12aa9": "getUserID(address)", +"0ef14b98": "viewFirstLotOfClauses()", +"0ef25f8b": "TicTacToeRules(address,address,address,address,uint256)", +"0ef26743": "height()", +"0ef270d5": "CreateNewAccount()", +"0ef2d7af": "bonusDeadline()", +"0ef43cbd": "confirmerNouveauProprio()", +"0ef486d1": "revisions(uint256)", +"0ef504ae": "preSaleHalted()", +"0ef524ff": "setDefaultMint(uint256)", +"0ef5a7e0": "allocateToCrowdsalePurchaser(address,uint256)", +"0ef60e48": "setRubusOrangeAddress(address,address)", +"0ef67887": "Balance()", +"0ef6eb9c": "getCompte_33()", +"0ef71d79": "privatized(bytes32,bytes32)", +"0ef72880": "DADXChainERC20()", +"0ef76243": "withdraw_Arina(uint256)", +"0ef7cc8e": "metadataOf(uint256)", +"0ef845df": "propose(address,string,string,string,string,string,uint256,uint256,uint256,uint256)", +"0ef96356": "stakeFor(address,uint256,bytes)", +"0efafc03": "SaleClockAuction(address,uint256)", +"0efafd01": "getPlayerGainLossOnLastFlip()", +"0efc9d03": "minEthToRaise()", +"0efcf295": "deleteAnyProposal(bytes32)", +"0efd0973": "club()", +"0efd2cca": "postICO()", +"0efd3d5b": "getPrice(string,string,uint256)", +"0efd4989": "numAdmins()", +"0efe5fb7": "addToCart(uint256,string)", +"0efe6a8b": "deposit(address,uint256,uint256)", +"0efe7f62": "objectShoes()", +"0f00dfdb": "NonOperationalWithdrawManager(address)", +"0f027c67": "membersLength()", +"0f0308fb": "upgradeGems()", +"0f03be37": "mimax(uint64,uint64)", +"0f03e4c3": "numberOfAccounts()", +"0f041cef": "KitFutureToken()", +"0f0433c4": "_getDroneAbility(uint256)", +"0f050dce": "getBitcoinAddress(bytes32,int256,bytes32,int256)", +"0f052173": "invest2017()", +"0f059913": "vested(address,uint256)", +"0f06670a": "didWin(bytes32)", +"0f092c44": "MIDGRADE_TYPE3()", +"0f096163": "Chainy()", +"0f0ba766": "removeChild(uint256,address,uint256)", +"0f0c27ad": "HashRegistered(bytes32,address,uint256,uint256)", +"0f0ed39e": "EthealPromoToken(address)", +"0f0f3f24": "addOwnerAddress(address)", +"0f106e0a": "encodePacketCommit(uint256,uint256)", +"0f120fc3": "toggleTrading()", +"0f122a6c": "_setSealableProperty(uint256,bytes32,bytes32)", +"0f12354d": "updateStateBasedOnContributions()", +"0f12b32a": "Garcut()", +"0f12d8f8": "RoundWinner(uint256,uint256,address,uint256)", +"0f12ffac": "weiToFNU(uint256)", +"0f134bee": "payPreviousOwner(address,uint256)", +"0f1354f3": "burnFrom(bytes32,uint256)", +"0f136527": "getShareIndex(address)", +"0f13af83": "setCurrentCoin(address)", +"0f13dbde": "inRankList(address)", +"0f14212b": "transferFromOwner(address,uint256,uint256)", +"0f145dca": "Ethbet(address,address)", +"0f149d0a": "changeBurnPaused(uint256)", +"0f14a7e4": "ModeratorRemoved(address,address,bool)", +"0f14b900": "setTimeStampStatus(uint256,uint256,string)", +"0f15573b": "setLLV_edit_2(string)", +"0f15f4c0": "activate()", +"0f166ad4": "local()", +"0f183119": "vote_for_candidate_D_for_Free()", +"0f188e1d": "studioLevel(address)", +"0f18a530": "chemistry()", +"0f18ac07": "transferFromOwner(address,uint256)", +"0f191524": "fillOrder(uint256,bytes)", +"0f19f92a": "isIcoOver()", +"0f1a6444": "cliffTime()", +"0f1bf454": "getGameStatus(uint256)", +"0f1ca0d9": "sethToken()", +"0f1df574": "WithdrawETH()", +"0f1e3b5b": "getHousePayout()", +"0f1e8c24": "commitTeam(address,uint256,uint256[])", +"0f1ed0c6": "setOwner(address,bytes32,address)", +"0f1fd654": "ELearningCoinERC()", +"0f2004a1": "Bob(address)", +"0f201ca6": "reportConvertTokens(uint256,address)", +"0f20b9df": "crowdsaleContracts(address)", +"0f215afb": "paySeller(uint256,uint256)", +"0f21a046": "WithdrawMonethaBuyerUtility()", +"0f226a31": "getServiceUpdateAddress(address,uint32)", +"0f228087": "transferTokens(address[],address)", +"0f2284cc": "SbuyToken(address,address)", +"0f22a95d": "deleteCountry(uint256)", +"0f23a104": "burnAssetOperator(uint256)", +"0f23b047": "getPlayNumber()", +"0f23cbaa": "recycle()", +"0f246780": "ZJF()", +"0f24f5c8": "doTransfer(address,uint256)", +"0f250780": "AKCToken()", +"0f2636bd": "getStockSellOrderPrices(uint256)", +"0f264e1a": "farmerRequestCertificate(address,uint256,string,string,string,uint256)", +"0f2905f7": "verifyStage()", +"0f29eb73": "revokeStaking(address)", +"0f2bc56d": "fixTokenCalcBug()", +"0f2c9329": "split(address,address)", +"0f2da195": "LimitSet(uint256,uint256,uint256,uint256,uint256)", +"0f2dabca": "punchIn(address,uint64)", +"0f2e5b6c": "Locked()", +"0f2f9bb7": "getNextWhitelistedNode(address)", +"0f2fa473": "test_already_paid()", +"0f3092fb": "EasyHomes()", +"0f30c971": "TheGambler()", +"0f3554ad": "addBoolListItem(bool,address,address,uint256,bool)", +"0f36f691": "getLockStatus(address)", +"0f37e79a": "transferClockmaker(address)", +"0f37fd4a": "HexelErc20Token(string,string)", +"0f391236": "ethRateMax()", +"0f39c6ab": "removeVotersVote(address)", +"0f3a00d5": "CreateCOR(address,uint256)", +"0f3a0533": "extraReceiverAmount(address)", +"0f3a1412": "getArrlist(uint256,uint256)", +"0f3a31d6": "SymbolChange(string)", +"0f3a9f65": "setPeriod(uint256)", +"0f3ae419": "PreferentialRateChange(address,uint256)", +"0f3afeec": "Nodelist()", +"0f3b305e": "getPawnPackageId(uint256)", +"0f3bd3fd": "teamJust()", +"0f3c92f3": "calculateFLCCore(address,uint256)", +"0f3cb8bc": "setCardUpgradeLevels(uint256,uint256,uint256)", +"0f3d7c3e": "release(string,uint32[3],string,string,string)", +"0f3d8803": "getMinPurchase()", +"0f3de489": "newAuction(uint256,uint64)", +"0f3e7027": "clearTransferValueby(address)", +"0f3e9438": "frontRunner()", +"0f3eb785": "add(string,uint256,uint256,uint256)", +"0f3f0e42": "allowTotalMintAmount()", +"0f3f53c1": "dappsBonusCalc(address,uint256)", +"0f3fb52a": "LogSetState(uint256,uint8,uint256,bytes32)", +"0f3fc29e": "setChestProduct(uint16,uint256,uint16,bool,uint32,uint24,uint24,uint8,uint8)", +"0f40593e": "ViewMyBet()", +"0f40988e": "contributorsShare()", +"0f40d645": "demander(uint256)", +"0f4170f2": "BaseICO(address,address,uint256,uint256,uint256,uint256)", +"0f41ba4b": "bid(address,uint256,uint256)", +"0f420113": "_calculateCurrentRate()", +"0f42fdfb": "recoveryModeTriggerTime()", +"0f4391f5": "setPauseMaster(address)", +"0f43a677": "validatorCount()", +"0f43c196": "setTournamentAddress(address,address)", +"0f45368c": "checkTransferHash(address,uint256,address,address,uint256,uint256,bytes)", +"0f45c3e1": "transferFromAny(address,address,uint256)", +"0f45f528": "getTknOfferor(uint256)", +"0f4665aa": "getOrderHash(address,uint256,address,uint256,address,uint256,uint256,address,address,uint256)", +"0f47165e": "managePlayer(address)", +"0f473d72": "_calculateDiscount(uint8,address)", +"0f47435b": "pvt_inv_Pool()", +"0f481bf7": "postTransfer(address,address,address,uint256)", +"0f482da1": "unblockSpending(address)", +"0f482e64": "LikeCoin(uint256,address,address)", +"0f4acfcd": "charToByte(bytes1)", +"0f4b1cfc": "setGovernment(address)", +"0f4bbdf2": "registerBuyer(string,string,string,string,address,string)", +"0f4cf692": "numMessages()", +"0f4d14e9": "depositEth(uint256)", +"0f4df754": "Gladiethers()", +"0f4dfc17": "ICOTokenDelivery(address,uint256)", +"0f4ef8a6": "rewardManager()", +"0f4f8184": "bancorRegistry()", +"0f4fd9cc": "log_event(string)", +"0f4ff474": "_openGameResult(uint256,uint256,uint256,string)", +"0f501d07": "saveInfoAboutInvestors(address,address,uint256,uint256,bool)", +"0f505a01": "sealDataStream(address,uint256,bytes32,uint256,bytes32)", +"0f5127f5": "Ariston()", +"0f5137f9": "sellOrderBalances(bytes32)", +"0f522614": "Shufflix()", +"0f527200": "SimpleCoin()", +"0f529ba2": "D()", +"0f52fb0a": "searchFreelancers(address,uint256,uint256[],uint256[],uint8,uint256,uint256[],uint256[],uint256[],uint256)", +"0f5381f1": "testUserCanIncreaseVersionNumber()", +"0f53a470": "getProfile(address)", +"0f53b7ee": "communityTokensAddress()", +"0f53ba51": "appWasMade(string)", +"0f53e2a8": "NewToken(address)", +"0f555b46": "MicroCoins()", +"0f560cd7": "list()", +"0f56e460": "Shitcoin()", +"0f574ba7": "subscribe(uint256)", +"0f577d97": "getCompte_16()", +"0f57b9d9": "removeFromPrivileged(address)", +"0f57eb79": "minboc()", +"0f581aed": "MinimumBitcoinInvestmentUpdated(uint256,uint256)", +"0f58d28f": "weightOf(string)", +"0f590c36": "emergencyFixGameResult(uint64,uint256)", +"0f59a638": "totalWeiCommitted()", +"0f59eb95": "ownerUpdateOthers(uint256,bool,uint256,uint256,bool)", +"0f59f83a": "go()", +"0f5a5466": "claimWithResolver(address,address)", +"0f5a8d9c": "raiseDollarsFunded(address,uint160,int160)", +"0f5aa9f3": "setAuthorization(address,address)", +"0f5ad969": "node_index(address)", +"0f5b807d": "cuddleData()", +"0f5bab7c": "countManagers()", +"0f5c8c0a": "balancesDB()", +"0f5e41c8": "_getDestinationPartition(bytes)", +"0f5e7348": "getCommunityBallotCentsPrice()", +"0f5ea100": "price(address,uint256,uint8)", +"0f5eacf6": "EndStage()", +"0f5ed9e9": "escrowAllowed(address)", +"0f5ee138": "userSignupCount()", +"0f5f0151": "GxTradersProxy(address)", +"0f5f1dbc": "operationsAccount()", +"0f5f4c53": "unpause2()", +"0f5f8593": "MetaBall(uint256,string,string)", +"0f601679": "balanceOwner(address)", +"0f60e3d9": "resetAddTokenData()", +"0f610c06": "getValidatedLiability()", +"0f61280e": "nutzAddr()", +"0f62562f": "pregnantNinjas()", +"0f62c3e3": "releaseEscrow(bytes32,address,uint256)", +"0f632fd3": "onMint(address,uint256)", +"0f63d864": "addOwners(address[],uint256[],uint256[])", +"0f6413b7": "batchAssignStopped()", +"0f64864d": "transferTokensAndDividends(address,address)", +"0f6521e2": "FROZEN_TOKENS()", +"0f66791c": "setHTML(string)", +"0f66acd1": "EcosystemEthereum()", +"0f66d082": "gauntletTypeOf(address)", +"0f670da6": "destroyLogicContract()", +"0f6798a5": "Mint(address,uint256)", +"0f67f3f7": "distributeToDev(address,uint256)", +"0f683fd1": "Token(string,string,address)", +"0f69cdbe": "approvespender(address,uint256)", +"0f6a1734": "Crowdsale(address,uint256)", +"0f6b6756": "tokenSaleIsPaused()", +"0f6bb3c3": "doSpawn(uint32,int256,address,bool,address)", +"0f6c2a33": "setMaxStage2AllocationPerInvestor(uint256)", +"0f6d37d6": "supportAddress()", +"0f6d6236": "setIssueDividendReward(uint256)", +"0f6d9f00": "ERA_PERIOD()", +"0f6e40c3": "startRound(bytes32,bytes32)", +"0f6ea4fc": "MISCELLANEOUS_TOKENS_SUPPLY()", +"0f6f5f98": "setAndFixTokenPriceInWei(uint256)", +"0f6f72a8": "getClosingTimeValue()", +"0f710616": "TRSToken()", +"0f710e32": "CryptoFinexToken()", +"0f71590c": "setPOLYUSD(uint256)", +"0f732bdc": "getEncryptionAlgorithmCount()", +"0f73b4f4": "setStartingPrice(uint256)", +"0f73d212": "addLog(string,string,bytes32)", +"0f74a5cc": "cancelCenturionSale(uint256)", +"0f74e527": "RenmiCoin()", +"0f74e689": "registerNewPubKeyForHash(bytes28,string)", +"0f7503c9": "baseStartTime()", +"0f75806f": "GraphenePowerCrowdsale()", +"0f75c82e": "getObjClassExp(uint64)", +"0f75e81f": "issue(bytes32)", +"0f762cfe": "emission(address,address,uint256,uint256,uint256)", +"0f76496a": "returnTokens3(address,uint256,uint256)", +"0f76b651": "unlockDate5()", +"0f76c114": "getCurrentValue()", +"0f76de0d": "left45(uint256)", +"0f76f489": "getPoolName(uint256)", +"0f774287": "Burnt(address,uint256,uint256)", +"0f774931": "administrativePayouts(address,uint256)", +"0f776fb2": "PutDiv(address)", +"0f77c1d3": "addUsersWhitelistB(address[])", +"0f784943": "mintable(uint256)", +"0f78628e": "allowedToBurn()", +"0f7875c6": "startblock()", +"0f78d408": "JuvToken()", +"0f78ee7c": "payoutLockedToken()", +"0f79cfa2": "addReferrer(bytes32)", +"0f79e120": "nrFailures()", +"0f79e1c7": "createRandomDeveloper(string,uint256)", +"0f7a4590": "goalAchieved()", +"0f7a8971": "buildBoolMapping()", +"0f7bd1dd": "enterRaffle(uint256[],uint256)", +"0f7bff76": "getHeroDBZHeroAddress(uint256)", +"0f7c9085": "addToAdmin(address,bool)", +"0f7c932a": "getReservedTokensListValInPercentageDecimals(address)", +"0f7d6673": "Channel()", +"0f7e1653": "OpenGame()", +"0f7f97c8": "calcNewSkinAppearance(uint128,uint128,uint128)", +"0f7fa72f": "addOperator(address,uint256)", +"0f809adb": "changeTokenOwner(address)", +"0f80fc58": "exponent(uint256)", +"0f8143f6": "discardRejectedProposal()", +"0f819fe8": "disableTuneOption(uint256)", +"0f81d248": "endPeriodC()", +"0f822b78": "admin_transfer(address,uint256)", +"0f825673": "deleteCoupon(string)", +"0f82b42f": "userAccountTokenBalances(address)", +"0f832bc6": "testIsLawyer()", +"0f832f18": "_nextLoanInterestRate(uint256)", +"0f83f112": "CanTransferChecked(bool,address,bool,bool)", +"0f8410e3": "getPresellToKenAmount()", +"0f85751e": "change_p5(uint256)", +"0f861127": "argl(uint256,uint256)", +"0f861ca3": "ownerUnpause()", +"0f86abc1": "modifyStakerLimit(uint256)", +"0f86e3eb": "denaToken()", +"0f86f702": "compatible223()", +"0f87a044": "withdraw1(uint256)", +"0f88aa81": "emitRecord(bytes32,uint256,uint256,uint256)", +"0f88f1a5": "collectBounty(address,uint256,uint256)", +"0f89c305": "removePendingArray(address)", +"0f89fa28": "OrganizationRegister()", +"0f8a771e": "skr()", +"0f8a8887": "rocketSetResourcePrice(uint256,uint256,uint256)", +"0f8b70c9": "getBotContract()", +"0f8bca8c": "getStage0Start()", +"0f8c04e2": "create(address[],uint256[],uint256[],address,address,bytes)", +"0f8d4030": "totalShareholders()", +"0f8d598a": "decayedPriceOfSocialIdentity(uint256,uint256)", +"0f8dc272": "ComputeAcornPrice()", +"0f8ea4f3": "addSomeOfManyLine(uint256,string,uint256,string)", +"0f8eaa74": "addToPreSaleRefunds(address,uint256)", +"0f8ef9f8": "getBoosterRaiseValue(uint256)", +"0f8f8b83": "spendableBalanceOf(address)", +"0f8fcb74": "_setInt(bytes32,int256)", +"0f8fd363": "getRepPriceInAttoEth()", +"0f900587": "addBonusPerShare()", +"0f902bc2": "delayedTransferFrom(address,address,uint256)", +"0f907ba3": "failCar(string)", +"0f90b83a": "deployTokenContract(uint256)", +"0f917e31": "transferAndDonateTo(address,uint256,address)", +"0f917f9e": "totalSupplyTeamTokens()", +"0f91c8a5": "setCap(string,uint256)", +"0f91cce1": "releaseVanbexTeamTokens()", +"0f92f38f": "changeMartial(uint256)", +"0f9302c8": "LogEvent(string)", +"0f95378f": "MerchantWallet(address,string)", +"0f953b97": "getCmcAddress()", +"0f960644": "addClaim(address,bytes32,string,string,uint256)", +"0f96dd39": "maxTokenCap()", +"0f973874": "MiniMeTokenSimple(address,address,uint256,string,uint8,string,bool)", +"0f974ef2": "PasserBy(address)", +"0f977561": "getUserEvents()", +"0f97f2f1": "managePlayer(uint256,uint256)", +"0f98a9cc": "lockTokens(address,uint256,address,uint256)", +"0f98c91a": "TOKENS_PER_ETHER_EARLYSALE()", +"0f99da4a": "getBoosterAmount(uint256)", +"0f99fab2": "allowWrite(uint256,uint256)", +"0f9ad6b8": "GGPOKoFToken()", +"0f9aea56": "last_release_date()", +"0f9b481a": "TokenFinalized()", +"0f9b5129": "maxSellRateInPrecision()", +"0f9b87be": "transferToDestination(bytes32)", +"0f9bac2d": "ADVISORS_ADDRESS()", +"0f9bb8b3": "getCurrentUserQuickPromoBonus()", +"0f9c95da": "GDCAcc04()", +"0f9ce471": "Ether2Gen()", +"0f9e144d": "changeMaxMin(uint256,uint256)", +"0f9e39bf": "minBidMultiplier()", +"0f9e42da": "drawToken()", +"0f9e5bbd": "createShares(address,uint256)", +"0f9fb983": "lastBetTimeSEC()", +"0fa01949": "yearOfProduction()", +"0fa2b5d4": "Interestv3(address,address)", +"0fa2d864": "block4()", +"0fa45298": "getRoundAhead(uint256,uint256)", +"0fa48688": "calculateItemId(bytes32)", +"0fa53db8": "divideDecimalRound(uint256,uint256)", +"0fa6002e": "sellCharacter(uint32)", +"0fa6e84d": "SouYingToken()", +"0fa7a798": "getOpenRequestPublicKey(uint256,uint256)", +"0fa7b7b3": "totalRefunded(uint256)", +"0fa803e8": "SetCategoryName(string)", +"0fa85ab0": "claimTokensForUser(address)", +"0fa87b15": "closeMyGame(uint256)", +"0fa8beb3": "claimBonus(address,uint256)", +"0fa8f516": "getPosition(address,bytes32)", +"0fa95aee": "etherToTokens(uint256,uint256)", +"0fa9ced4": "emergencyFuneral()", +"0fa9e486": "registerCoin(string,string,address)", +"0faa2aae": "amountOfBSTRequired(address)", +"0faaa357": "nCanOpenRewardMinEth()", +"0fab0f6a": "minimumWitcoins()", +"0fab14e8": "agencyOwner()", +"0fab459c": "transferSoldTokens(address,uint256)", +"0fab7539": "getIssuanceCount(bool,bool,bool,bool)", +"0fac20e1": "dev1Wallet2Pct()", +"0fac8dc5": "update(string,string,bool,string,address,uint256,uint256)", +"0fac960e": "sellTokensForWaves(string,address,uint256,uint256)", +"0fadb5c7": "getWHaddress()", +"0fae42cd": "pricePreSale()", +"0faf0904": "set_creator(address)", +"0faf2775": "newGame(string,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"0fb0a8d3": "manageOperable(address,bool)", +"0fb0cf2d": "changeLockupDuration(uint64)", +"0fb125ac": "transferTokens(uint256,address[])", +"0fb26f0b": "switchTransfers()", +"0fb2e692": "buyMCTTokenProxy(address,uint256,uint256)", +"0fb35574": "SCC()", +"0fb3844c": "_status()", +"0fb411e8": "evc()", +"0fb4b070": "tokensMintedForSale()", +"0fb4ecdf": "complained(address,address)", +"0fb524ce": "castVote()", +"0fb54f3a": "AuthenticationManager()", +"0fb553ba": "FLC()", +"0fb59f95": "buy(uint256,string,uint256,uint16)", +"0fb5a6b4": "duration()", +"0fb65f10": "authorizeMintRequester(address)", +"0fb66557": "trustedTransfer(address,address,uint256)", +"0fb66da3": "getMessageOfVisit(address)", +"0fb7657f": "isAllocationLocked(address)", +"0fb792d0": "ONE_HUNDRED_PERCRENTS()", +"0fb7a5e6": "getCensuredBy(uint16)", +"0fb7cb1d": "addToKycTeam(address)", +"0fb7e602": "startEmergency()", +"0fb9398f": "getProductBuyers(uint256)", +"0fb9d85e": "buyIndex(uint256,address,bool)", +"0fb9dcd5": "getTokensAtCurrentRate(uint256)", +"0fba34a4": "has(bytes12)", +"0fba4ca1": "accept(string)", +"0fba80de": "pickValues(bytes32)", +"0fbad611": "setTimeFrame(uint256)", +"0fbb3b6b": "shittyRandom()", +"0fbbeceb": "PostCompleted(address,address)", +"0fbc0cd1": "bounty_solve(address,bytes32)", +"0fbc0f82": "LotterySymbol()", +"0fbe333a": "getLastBidder()", +"0fbe3e40": "returnLast()", +"0fbed9fe": "EFAFCOIN()", +"0fbf7151": "startsWith()", +"0fc03687": "Booko()", +"0fc0e9a8": "_addWithdrawal(address,address,uint256)", +"0fc10026": "CALLER_EXCHANGE_RATE()", +"0fc12b1a": "isGetWhiteList()", +"0fc1b08b": "setValue(string,string,string)", +"0fc1c83d": "minimumTokenCommission()", +"0fc24c03": "ZarFundsToken()", +"0fc33bb7": "lrcBalance()", +"0fc3866f": "isSoftCapGoalReached()", +"0fc38daa": "CSToken()", +"0fc3c5e8": "shipMedicine(address,string,string,string,string)", +"0fc4af53": "cloneTokens(uint256,uint256)", +"0fc4f262": "updateSubdivsFor(address)", +"0fc55d1e": "ENTS()", +"0fc55fd1": "bid(uint256,string)", +"0fc63d10": "tokenA()", +"0fc66f45": "PO24()", +"0fc69407": "BidPlaced(uint256,uint256)", +"0fc6ed30": "Satum()", +"0fc709e5": "setDistribution(uint256,uint256,uint256,uint256)", +"0fc72f4e": "purchaseCallback(string)", +"0fc783d1": "SacToken(address)", +"0fc7c15e": "getUnapprovedUsersTop150()", +"0fc81bdc": "editEventResult(string,uint64,uint8)", +"0fc85c7f": "INAYCOIN()", +"0fc8a393": "transferUpdater(address)", +"0fc8afbd": "getFreeSnake()", +"0fc92096": "isValid(address,bytes32[])", +"0fc958dd": "tMemberSolId(uint256,address)", +"0fcac452": "addToRakePool()", +"0fcaed94": "restartLottery()", +"0fcb5984": "getprice()", +"0fcb83f2": "SancojTokenContract()", +"0fcbb5b9": "getSubscriberType()", +"0fcbbc8e": "_lookupOwnerIdentityCount(address)", +"0fcc0c28": "deprecate()", +"0fcc1e47": "_grantAccess(bytes32,address,address,string)", +"0fccf22e": "ban_user(address)", +"0fcd1cab": "killInstance(address,address)", +"0fcda174": "getAccountTokenBalance(address,address)", +"0fcddd06": "CreateCRC(address,uint256)", +"0fce00ed": "calculatedPaymentInterval()", +"0fce349e": "popularitySetting(uint256,uint8)", +"0fce887b": "transferLockedFrom(address,address,uint256[],uint256[])", +"0fd02fc1": "isValidUnbondingLock(address,uint256)", +"0fd0aa67": "Parties()", +"0fd0ae10": "insert(address,uint256)", +"0fd0e440": "uniq(uint8[])", +"0fd1ed1f": "setMarginForVictoryPercent(uint8)", +"0fd1ed78": "LOG_EmergencyWithdrawalFailed(address)", +"0fd1f94e": "firstClaimBlock()", +"0fd2ce17": "funcArrayInArguments(address[])", +"0fd3d758": "WWAMPricingStrategy(uint256,uint256,uint256)", +"0fd3ee83": "__redeemTokens(address,uint256)", +"0fd4d286": "BlueSkyDragon()", +"0fd5084a": "validOrigins(uint256)", +"0fd548ef": "myShareToken()", +"0fd56202": "addressToNumCities(address)", +"0fd57f3e": "seatPrice()", +"0fd58d07": "expectedWinnersCount()", +"0fd62f57": "adminCharge_p2()", +"0fd68e3f": "newRaffle()", +"0fd6fc49": "IntelliShareEco()", +"0fd7410c": "in_finalization_phase()", +"0fd7b03d": "HackDivs()", +"0fd8a8fb": "setAnonymousCap(uint256)", +"0fd9d5bf": "Matrexcoin(uint256,string,uint8,string)", +"0fda890e": "changeGenRNGcontractAddress(address)", +"0fdb1c10": "withDraw()", +"0fdb468f": "fee(uint64)", +"0fdc3609": "changeDeposit(address)", +"0fdc7956": "unlockAllTokens(bool)", +"0fde0f8e": "ROLE_VENDOR()", +"0fde5686": "setBUB(bytes32,uint256,bytes)", +"0fdfa5ee": "preBuy3()", +"0fe1dfa8": "lastRoundLengthUpdateRound()", +"0fe1f548": "getTokenSCADARequiresHardCap()", +"0fe234ed": "testSetController()", +"0fe2abcf": "exchange(uint256,address)", +"0fe2c5d1": "BTSMToken()", +"0fe3152e": "airdropEnd()", +"0fe3c10d": "MANHATTANPROXY4THST()", +"0fe41fd5": "acquisitionsTokens()", +"0fe433db": "reallocate(uint256)", +"0fe43e1f": "foundersAdvisorsPartnersTokensVault()", +"0fe4ea72": "killDragonDeathContract(address,uint256,uint256)", +"0fe793aa": "studioHandler(address,uint256)", +"0fe7c250": "DaoRulesProposals()", +"0fe7db9c": "MedSupplyToken()", +"0fe83bb8": "preSaleTokens()", +"0fe8c788": "addCertificate(string,address)", +"0fe961da": "_getCurrentRoundTeamCos()", +"0fea657f": "totalExch()", +"0fea81fe": "setComisionInETH()", +"0fea9be6": "ChinhCoin(uint256,string,uint8,string)", +"0feacc42": "CommonToken(address,address)", +"0feaf627": "_safeStaticCall(address,bytes)", +"0feb10ff": "Register(uint256,string,string)", +"0feb172f": "buyTeam(uint256)", +"0feb376b": "AMOUNT_ICO()", +"0febb8b7": "setSaleInfo(uint8,uint256,uint256,uint256,uint256)", +"0feca6d5": "releaseAdvisorsTokensForPercentage(uint256)", +"0fecef48": "getProductsByOwner(address)", +"0fed240b": "dAdd(bytes32,address,bool)", +"0fed5dc8": "setSendAllow(bool)", +"0fee32bb": "setAuctionIndex(address,address)", +"0fee5a40": "getProviderCurve(address,bytes32,int256)", +"0ff0a4df": "reFund()", +"0ff188c7": "transferPixel(uint16,uint16,address)", +"0ff244b2": "transferByAddress(address,uint256,address)", +"0ff2e4b2": "assignCEO(address)", +"0ff3687b": "remainingGenesisCats()", +"0ff39daa": "generateDepositAddress()", +"0ff3d57e": "addMasterWallet(address)", +"0ff3d5ea": "getCastleSale(uint256)", +"0ff4009c": "getLotteryInfo(address)", +"0ff42eab": "setProofAddr(string)", +"0ff43cfd": "IFCNBToken()", +"0ff4c916": "getValue(uint256)", +"0ff4d239": "HashRushICO()", +"0ff4f160": "oraclize_query(uint256,string,string[1])", +"0ff58f40": "month24Allocated()", +"0ff7bb07": "refundClient(address,uint32)", +"0ff88a8d": "getChar(uint256)", +"0ff88baa": "RoyalTransfer()", +"0ff89c2b": "divide(int256,int256,uint256)", +"0ff8cf9b": "dividend()", +"0ff92e7b": "burnDead(address,uint256)", +"0ff9aafe": "updateMinimumBond(uint256)", +"0ffb1d8b": "whitelistToken(address,bool)", +"0ffbe43b": "initializeOfferChannel(uint128,address,address,uint256)", +"0ffdbd42": "feePoolShare(uint256,bool)", +"0fff6e06": "totalAvailableGames()", +"0fffbb54": "changeRankingSize(uint256)", +"10001fdd": "setPublicSaleParams(uint256,uint256,uint256,bool)", +"10002f39": "WorthlessEthereumTokens()", +"100153b6": "blocksByDay()", +"1001c39c": "tokensReleasedToIco()", +"100278d8": "startPreSale2()", +"100349fa": "Good_Bye_World()", +"10038099": "isPuppySports()", +"1003ac0c": "customFallback(address,uint256,bytes)", +"1003e2d2": "add(uint256)", +"10042e10": "remainingPublicSupply()", +"10055c1d": "role()", +"100565f4": "setTurnover(uint256)", +"10059be0": "do_redemption()", +"1006a41f": "auctionStarts(address,address)", +"10072af7": "SetupRaffle(string,uint256)", +"1007f753": "erase(uint256)", +"10082bff": "getActorBillXdetail(address,uint256,bool)", +"1008737d": "test_oneValidEqBytes32()", +"1008a2a5": "getTotalLendingItem(address)", +"10096c84": "exchangeBalanceOf(address,address)", +"10098ad5": "available(address)", +"100a0ed1": "receiveCreateAuction(address,address,uint256,uint256,uint256)", +"100a1099": "getTransactionIdsOf(address,address)", +"100a5ec5": "mintedCrowdsale()", +"100ab561": "updatePolicy2(bytes32,string,uint256,uint256,string)", +"100ac510": "addRx(address,address,uint256,uint256,bool)", +"100aca47": "totalFund()", +"100acefc": "_storeProof(string)", +"100af203": "reserveETH()", +"100b815d": "loadData()", +"100bce92": "toHex(string)", +"100be094": "setRefundRate(uint256)", +"100c6cfd": "ipoPlatformPercentage()", +"100c8ada": "setCAmodulus(bytes)", +"100c98fe": "SaleFailed()", +"100cdd91": "burnAll(uint256[])", +"100d7e30": "FuckFacebookCoin()", +"100e187a": "transferHolds(address,address,uint256)", +"100e4b94": "every_day_im_shufflin()", +"100ed0fc": "preallocateFirstStage(address,uint256,uint256)", +"100f23fd": "cancelWhitelistAddition(bytes32)", +"100f2e78": "determineSalaryTokens(address)", +"100f759f": "EDU_PER_ETH_SALE()", +"100f7a79": "registerBounty(address,uint256)", +"100fd02f": "isAbove(int256,int256,string)", +"101005bd": "releaseReserve(uint256)", +"10103122": "totalDurationInDays()", +"1010a515": "MONOGRAM()", +"101175e8": "BONUS_DATES(uint256)", +"10119521": "TokenBurnt(address,uint256)", +"1011a635": "changeCommissionFeeRate(uint256)", +"1013ad53": "KairosToken()", +"10142785": "assign(bytes,uint256,bytes1)", +"1014a29e": "firstRefundRoundRateDenominator()", +"1015295c": "ClaimMyBet()", +"10154bad": "addWhitelisted(address)", +"1016774e": "period3End()", +"1016ad94": "Baliv()", +"1016eadb": "Epilepsy()", +"10174967": "God()", +"1017a357": "HeirOwnershipClaimed(address,address)", +"101817ba": "getLastEmissionNum()", +"1018f294": "getRandom16(uint16,uint16)", +"1019635d": "assignReserved(address,uint8,uint256)", +"10196bf7": "pendingRefs(uint256)", +"1019dc59": "setSale(address,bool)", +"101a3fec": "setIsTokenTransactionOpen(bool)", +"101a889b": "LogBeneficiaryPaid(address)", +"101a917e": "makeTradeDetail(address,address,uint256,uint256,address,uint256)", +"101af16b": "countriesTokens()", +"101b6106": "RevokeEntity(bytes32,bytes)", +"101b7e7c": "vbtToken()", +"101b94f1": "setRightOfGroup(string,string,bool)", +"101ca1b9": "YoobaBatchTransfer()", +"101d1135": "ANNA(uint8)", +"101d52d2": "checkStoredFileName(string)", +"101d990c": "hmul(uint128,uint128)", +"101e1f2c": "initLottery(uint256,uint256,uint256,uint256,int256)", +"101e359b": "reviveFee()", +"101e5a32": "setSoftcap(uint256)", +"101e652e": "presaleUnlimitedStartTime()", +"101e8952": "forward(address)", +"101f13e2": "verifyProof(bytes,bytes32,bytes32)", +"102046db": "townPrice()", +"1021688f": "changeAdminAddress(address)", +"1022b30b": "proposalResult(uint256)", +"1023d597": "priceDecraseTime2Action()", +"102455a5": "sanity_check()", +"10253fec": "election(string,string,string,string)", +"10258bfd": "Payment(address,address,uint256,uint256)", +"10271334": "receiveICOcoins(uint256,uint256)", +"1027853f": "withdrawShare(address)", +"10278bc8": "setBytes32Value(string,bytes32)", +"1027e242": "getBoosterStrength(uint256)", +"10282b61": "payoutcount()", +"10286952": "parseKeys(bytes32[])", +"10288c4b": "startIco(uint256,uint256,uint256)", +"1028e4a8": "theCyberMemberUtilities()", +"1028f980": "getAssertDowntimeCost()", +"10290e51": "computeProfit(uint256,uint256,uint256)", +"102accc1": "fireEventLog2()", +"102b5cc5": "check_address_share_and_transfer_bond_token(uint256,uint256,address,address)", +"102b61f7": "setMinimumWeiAmount(uint256)", +"102c920a": "allRefunded()", +"102ce658": "setRule(address,string)", +"102deb9c": "changeMonethaVault(address)", +"102e58d0": "timeoutAt()", +"102e8b94": "sellnow()", +"102ff0b3": "amountToken()", +"10309781": "createdTimestamp()", +"1030adea": "change_king_name(string)", +"1030c539": "setCreditbit(address)", +"1030e227": "TroyToken(address,address)", +"1030f288": "releaseState2()", +"10314b07": "GOX(uint256,string,string)", +"10316eec": "getActionParametersCountByIndex(uint256)", +"10319417": "returnHost(uint256)", +"1031e34e": "raisedFromToken()", +"1031e36e": "pauseTrading()", +"10328e89": "CoinhiToken()", +"103359ce": "sendToIco()", +"10340069": "tokenDistributionPool()", +"10342d02": "endSaleCarProduct(uint32)", +"10347a2c": "lockSymbol()", +"10348938": "setRankDynamic(uint256)", +"10361bf2": "transferLog(address,address)", +"10369540": "icoPhaseAmount2()", +"1036bbe2": "MAX_PERCENT()", +"1036cde8": "allocateCustomer(address,uint256)", +"103728a3": "FundingFueled(uint256,uint256)", +"10375a67": "getRemainingTokens(address)", +"1037706d": "uploadSignedString(string,int256,bytes20,int256,string)", +"1037a5f4": "getPrev(uint256)", +"10388809": "setTransferPrice(uint256)", +"1039cf3c": "isIcoStopped()", +"103aeda7": "isContractAuthorized(address)", +"103b0506": "preter(uint256)", +"103b5dad": "computeIndexId(address,bytes32)", +"103bf0bd": "tSLDToken(address,address,address,address)", +"103cbb7f": "ethpyramid()", +"103cfacf": "CryptovationX(address)", +"103d26ac": "getRareItemsPrice(uint256)", +"103e8154": "sellComissionUnits()", +"103ed140": "_getSkill(uint16)", +"103ef9e1": "authorizeOperatorByPartition(bytes32,address)", +"103f3a83": "getAuraColor(uint64)", +"103f9251": "transferFrom(address,address)", +"10400446": "setMaxAppeals(uint256)", +"10402040": "createSaiCollectorsEdition(uint256,address)", +"1040233f": "LevelUp(address,uint256,uint32)", +"1040762d": "setExchangeRates(uint256)", +"1040dc27": "getSTODetails()", +"1040e5a5": "showBal()", +"10422c24": "releaseAngelVested()", +"1042604f": "isTrue(bool,string)", +"1042876d": "getDisplayName(address)", +"1042ca73": "getWeekIdx()", +"1043dcdf": "LastIsMe(uint256,uint256)", +"10442a1b": "GetMainAddress()", +"10443ab3": "setLotteryTokensWallet(address)", +"10445a16": "_joinGame(address,uint256)", +"1044bbe6": "unLockTokens()", +"1045290e": "Boocoin()", +"10458684": "GBCCoin()", +"1045a889": "buildContract(string,string)", +"1045de72": "isEndOffer()", +"1046bc68": "deleteContact(address)", +"1046d078": "transferItemFrom(uint256,address,uint256,uint256)", +"1046e2ab": "Flood_Standard_Ethereum_Coin(uint256,string,string,uint256)", +"1047456e": "userTransfer(address,address,uint256)", +"10476aa9": "_activateIfUserIsNew(address)", +"1047d79e": "freezTime()", +"10482f57": "getWhitelistedResolvers()", +"1048a25c": "view_random(address,address)", +"1049334f": "tokenBalance(address,address)", +"1049f742": "terminateEscrow(address)", +"104a5963": "targetDiscountValue9()", +"104a5e75": "getRareItemsPLATPrice(uint256)", +"104ace02": "register(string,string,string,string,string,string)", +"104b6704": "currentManager()", +"104b78bd": "amountRaised(bytes32)", +"104bb708": "GetStatusCount(string)", +"104bc708": "LamboCrowdsale(uint256,uint256,address,address,address[])", +"104bf512": "createBATokenContract(address,address,uint256,uint256)", +"104bff92": "HasBooster(address,uint256)", +"104c9cff": "releaseDividendsRights(uint256)", +"104ce199": "Launcher()", +"104d5fdd": "getPriceProxy()", +"104d7bbb": "LuzCoin()", +"104de5a1": "setPromoted(bool)", +"104e81ff": "_approve(address,address,uint256)", +"104e9929": "tokenPool()", +"104f2d8f": "_approve(uint256,uint256,bytes32,uint256)", +"104fea4c": "activeCrowdsalePhase2(uint256)", +"10510ec1": "payToken(address,uint256)", +"10518aeb": "removeOldFirst(address)", +"10519ff4": "WestCoin()", +"1051db34": "implementsERC721()", +"10523af3": "getPokemonCD(uint256)", +"1052506f": "isSignedBy(bytes32,string,address)", +"10525660": "setConsumeToken(address)", +"10549874": "tokenRate1()", +"1054d657": "divestETH()", +"105541ae": "returnPtSafeSmall()", +"10561361": "logDisputeCrowdsourcerTokensBurned(address,address,uint256)", +"105689a0": "doLockdown()", +"10570116": "newGroup(string,uint32,uint256,uint32,uint32,uint32,uint32,uint32,uint8)", +"1057ce8c": "create3DoggiesTokens()", +"10594e19": "JPGProject()", +"1059c492": "CROWDSALE_WALLET()", +"105a6356": "minimalSuccessUSD()", +"105ae3bf": "getRoundIsEnded(uint32)", +"105b2645": "CheToken()", +"105b6f00": "Fructus()", +"105c287b": "lockPeriod1()", +"105d3e0f": "cryptogs()", +"105d9e37": "disputeLength()", +"105e029f": "JSONpath_string(string,string,string)", +"105e68f0": "allBankers()", +"105e87a1": "redeemaAt(bytes32)", +"105ea540": "minimumToRaise()", +"105edd83": "toTheTop()", +"105ee9a7": "endFight(uint256,uint256,bool)", +"105fc4e8": "REQUEST_FOUNDATION_AMOUNT()", +"105ff033": "redeemReward(address,uint256)", +"10609902": "sendFundsToBorrower()", +"1060c965": "ZILLION()", +"106109c9": "RandiveBhToken()", +"10618776": "setETHUSDdemon(address)", +"10619300": "lockAccount(bytes32)", +"106233e8": "addAltOracle(address)", +"106259c8": "getNonEtherController()", +"10639ea0": "cancelMigration()", +"106524a5": "multisendEth(address[],uint256[])", +"106639ba": "getOwnAssets()", +"1066cd3c": "voteFor(uint16,address,bytes32,bytes)", +"1067f077": "setCompte_41(string)", +"1067f361": "totalTokenToSale()", +"10680b84": "getShareTokenAddress()", +"106812c9": "setPI_edit_18(string)", +"106858cb": "getRemainingPreSalesAmount()", +"1068d056": "getaddress0()", +"106a182b": "getLambosCount()", +"106b291f": "ethUsdRateInCent()", +"106bd2da": "initiateEscrow(uint64,uint256,address,address,address,address)", +"106be310": "getNameByNumber(uint256)", +"106c0a45": "collectOriginalBetERC20(address)", +"106c5511": "create(address,string,string,uint8,uint256)", +"106c6441": "removeReinforcedWhitelist(address[])", +"106c9da1": "mine(uint256,uint256,uint256)", +"106d2813": "setCreditGameAddress(address)", +"106e6290": "withdraw(address,uint256,bytes32)", +"106f6a3d": "TOKEN_FIRST_EXCHANGE_RATE()", +"106f6f33": "bountyTokensCount()", +"106f77a7": "multiMint(uint256,uint256[],uint256)", +"106f923f": "RewardClaimed(address,uint256)", +"106fcb7a": "changeAsset(bytes32,string,string,uint8)", +"106fd2d5": "setSaleAddress(address,address)", +"106ffbd3": "withdrawBatchTokenToInvestor()", +"107046bd": "projects(uint256)", +"1070eb4f": "calculateInterestDue()", +"1070f410": "convertToBytes(uint8[],bytes1)", +"10711911": "BONUS_TIER_5_LIMIT()", +"107169c5": "allLinesWrong()", +"10717a2e": "switchCompatible223(bool)", +"10718655": "contributeFor(address)", +"1072cbea": "transferToken(address,uint256)", +"10731a65": "claimTokenOwnership()", +"10735089": "readteamXaddr(address)", +"1073c4a9": "exploreBuilding(uint8,uint8[176])", +"1073d1f8": "releaseTprFund()", +"10745f7e": "getMinAmountToWager(uint256)", +"1074c619": "flushEthers()", +"1075153f": "multiPartySend(address[],uint256[])", +"1075f186": "fundingPoCEndTime()", +"10764268": "salvageOtherTokensFromContract(address,address,address,uint256)", +"10768bdd": "myUsingOracalize()", +"10769e01": "POOL_EDIT_2()", +"1076c2d7": "StreamXOnline()", +"1077135a": "oraclizeSetWinner(uint256)", +"1077666e": "unmined()", +"1077f06c": "makeClaim(uint256)", +"10780cce": "grantsStartTimestamp()", +"107853a9": "Spacoin()", +"10787d58": "checkfriend(address)", +"1078ad80": "makeContractPermanent(string)", +"107925bb": "viewCustomer(string)", +"10793b50": "m_contributionHistory()", +"10796a47": "staticCall(address,bytes,bytes)", +"10797bab": "runtoeth(uint256)", +"1079b859": "finalRewardPeriodPercent()", +"1079ed67": "getChildByAddress(address)", +"107a2c5e": "betEvents(uint256)", +"107a69e8": "WithdrawResult(uint256,bytes32,uint256)", +"107a77d0": "finalizeVestingAllocation(uint256)", +"107a83e2": "prizesAwarded()", +"107b1f8c": "debug_verifyShare(bytes,uint256[],uint256[],bytes,uint256,uint256)", +"107bf304": "withdrawEthToOwner(uint256)", +"107d1d55": "startPeriod(uint256,uint256)", +"107d4b23": "Bitcan()", +"107d8a90": "COBA()", +"107e1a29": "setEndTimeIco(uint256)", +"107e7b1f": "setBroker(address,uint256)", +"107e8b24": "setTimeSale(uint256,uint256)", +"107f3f6a": "setExeStatus(uint64,uint64)", +"107f587c": "deactivateEmergencyProtectedMode()", +"107f76c5": "cancelOrder(bytes32,uint64)", +"10802749": "maxPlayerNum()", +"1080b7b1": "token4DivsOwing(address)", +"1080f251": "ownerOfLand(int256,int256)", +"10814c37": "bot()", +"10816757": "crowdsaleClosingTime()", +"1081dc8a": "contractIndex(uint256)", +"10828bcc": "noOpenGameResult()", +"1082a128": "SaveRickAndMorty()", +"1082cda1": "Register(bytes32,address)", +"1082d51e": "COINESIA()", +"1083d2fe": "technicalAmount()", +"1083f761": "assetToken()", +"10840303": "alterAdmin(address,bool)", +"108456b4": "FIRST_AUCTIONS_MINIMUM_RAISE()", +"10848ddf": "getDaysInMonth(uint256)", +"1084a1fb": "transferToAccount(bytes32,uint256)", +"1084bc90": "farmSingle(address,address,uint256)", +"1084cc51": "canDoubleDown()", +"10855269": "setProxyStorage(address)", +"10861f40": "wasDelegate(address,address,uint256)", +"108623f2": "checkProofOfWork(uint256,uint256,uint256)", +"10867877": "eatUnicornWithoutCorn()", +"1086a9aa": "approve(address,uint64)", +"1087452c": "signatureOwner()", +"10875ac0": "getMembershipExpiryDate(address)", +"10878ea1": "REGISTRY_INTERFACE_REQUIREMENT()", +"10888f2f": "admin_exFeeRate(uint256)", +"1088996b": "_newOutgoingTransaction(address,address,uint256,string)", +"1088f03f": "crowdsaleCompleted()", +"10895087": "DDJXRP()", +"1089843c": "OAKTokenCrowdsale(uint256,uint256,uint256,address)", +"10898a3e": "currentStateStartTime()", +"1089b16e": "setPod(address,uint8)", +"1089f215": "ex(uint256)", +"108a101b": "hasEmptyEditionSlots(uint256)", +"108a936b": "_initGame(uint256,bytes32,bytes32,bytes32,uint256)", +"108afb9f": "getBonusAmount(address,uint256,uint256,uint32)", +"108b77ad": "tokenPresaleSold()", +"108c3708": "paoContactAddress()", +"108c8ae4": "completeTask(uint256,uint256)", +"108caf79": "whitelistTokens()", +"108d0c84": "enableDefinedGame(uint256,bool,bool)", +"108d40f8": "PutGift(address)", +"108d6f94": "ProjectOwner()", +"108d995b": "getContinuityNumber(uint32)", +"108e161b": "isBallotSealed(uint32)", +"108e4bdb": "isKycTeam(address)", +"108eaa4e": "resolver(uint256)", +"108f69f8": "verifyTetherLoss(address,uint256,uint256)", +"108fa161": "newEnglandBets()", +"108fe10c": "advisers(uint256)", +"109050bc": "jackpotLastQualified()", +"1090a638": "presaleGoalReached()", +"10922cc1": "testTransferCost()", +"1092735d": "Created(address,uint256,uint8,uint256,string)", +"10937b5a": "adminAddMoney()", +"1094252e": "reconciliationDate()", +"109447e1": "createHash(uint8[5],bytes32)", +"10947164": "changeCEO(address)", +"1094d009": "LowGasAmount()", +"10950708": "setInvoicePaid(address,address,uint256,uint256)", +"109538ca": "transferAdeptTokenOwnership(address)", +"10953c22": "ChangeChallengeAdditionFee(uint256)", +"1095b6d7": "withdrawFee(address,address,uint256)", +"1095f211": "PushInvestorList(address)", +"10961935": "Bionic()", +"10970fbb": "convertTransferredTokensToMny(uint256,address,address,uint256)", +"10971bee": "bonusDayPercent()", +"10972704": "getCurrentAward()", +"10978594": "depositSoul(uint256)", +"1097b9ee": "sellingPrice(bool)", +"1097c929": "episodePurchase(address,uint256)", +"1097d54a": "addMaster(address)", +"1097e579": "Enter()", +"1099107b": "apSaleIssue(address,uint256)", +"1099d3ec": "scheduleTransaction(uint256,uint256,uint256,bytes)", +"1099f6fa": "disablePOSReward(address,bool)", +"109a9dbc": "bulletAddress(address)", +"109ac462": "safebalance(uint256)", +"109b678a": "immortals(address,uint256)", +"109c2032": "LotteryToken()", +"109d42d3": "addTokenSale(uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)", +"109df68e": "rotateBitsRight(bytes,uint256)", +"109e591a": "SchmecklelToken()", +"109e8b21": "addOldMayors(uint256[],uint256[],address[])", +"109e94cf": "client()", +"109e9de6": "getMaxBuy(uint256)", +"109ef276": "newDutchPriceRate(uint256,uint256)", +"10a03b22": "PHASE1_SUPPLY()", +"10a0d2f1": "startOfCrowdsale()", +"10a101df": "getKeyData(bytes32,bytes32)", +"10a20b4c": "testMintGuy()", +"10a2f7cb": "createOption(uint256,string)", +"10a31091": "createRadar(uint256)", +"10a37c26": "getWinnerAddress()", +"10a3ec4f": "test_fiveAssertTrue()", +"10a4fd08": "Platinum()", +"10a5bbdb": "changeCharPrice(uint256,uint256)", +"10a64976": "ARLCToken(uint256,string,string)", +"10a6fdc2": "updateEtherPrice(uint256,uint256)", +"10a73f5e": "jackpotrate()", +"10a78f4a": "playerTwoReveal(bytes32,bytes32)", +"10a7a5f5": "secondStageWallet()", +"10a80397": "addBudget(uint256,uint256,uint256)", +"10a82579": "lockTokensAddress()", +"10a86088": "getIntField3()", +"10a942b4": "withdrawCoindropsToken()", +"10a9de60": "getOracle(uint256)", +"10aa3d8c": "VirsymCoin(string,string,uint256,address)", +"10ab96e1": "LYNDO()", +"10abda2b": "leaderAddress()", +"10abdb0a": "Dealer_HitOrStand(uint256,bool)", +"10acec5d": "_save(address,uint256,uint256,uint256,string,string,address,uint256,uint256)", +"10adb0ea": "sanMaxLength()", +"10adda0e": "feesAvailable(address,bytes4)", +"10ae4a73": "presaleAllocation(address,uint256,uint8)", +"10ae4ce2": "setReleaseValidator(address)", +"10af92ba": "eachCandy()", +"10b0a4cb": "updateServiceMaxCreditsPerProvision(address,uint32,uint256)", +"10b0b5d5": "add(uint256[])", +"10b1bf2c": "LongPlace(address[2],uint256[8],uint256,uint256)", +"10b23ceb": "isAdjacent(uint8,uint8,uint8,uint8)", +"10b3d502": "ICO_BONUS2_RATE()", +"10b44094": "LogUserRegistered(address,address)", +"10b60e65": "SimpleTrade(address,address,uint256,uint256)", +"10b787d1": "evaluate_model(uint256)", +"10b798d9": "countRef(address)", +"10b7d9ae": "view_get_maintenanceMode()", +"10b8b441": "PrediksiToken()", +"10b9e583": "shutDown()", +"10bc044f": "setUserLanguages(address,address,uint256[])", +"10bc3c75": "getCurrentMiner()", +"10bd0d9e": "LegendsToken(address,address,uint256,bool)", +"10bd6d2b": "__address2__()", +"10bdc6cc": "joingames(uint256)", +"10be0ab0": "getDaoist(address)", +"10be3808": "receivedWei(address,uint256)", +"10beb070": "getRaffleStats()", +"10bebe64": "OneExchangeToken()", +"10bf5068": "setProposalFee(uint256)", +"10c067d2": "setPriceForProtectedCrypton(uint256,uint256)", +"10c0afaa": "balanceForReward()", +"10c1181d": "memberId()", +"10c12917": "calculateWinnings(uint256,uint256)", +"10c193b9": "total_tokenwei()", +"10c19421": "born()", +"10c1952f": "setLocked()", +"10c1b414": "moveTokens(address,uint256)", +"10c1de19": "GeneratedNumber(uint256)", +"10c1ff21": "crowdsaleSuccess()", +"10c2a365": "PreICO()", +"10c2c1c1": "setArbiter(uint256,address)", +"10c36365": "SetExchanger(address,bool)", +"10c3b15f": "calculateAmountToRelease()", +"10c452ef": "deactivate_trading()", +"10c4610b": "exporterBanker()", +"10c49b78": "CarlosCoin()", +"10c4b19a": "minMakerBetFund()", +"10c4e8b0": "all()", +"10c5b269": "orderMatchSell(uint256,uint256,uint256,uint256,uint256)", +"10c5b328": "mintTokens(uint256,address)", +"10c70801": "setMaxAddresses(uint256)", +"10c74fc6": "setGlobal(uint256,uint256)", +"10c7868f": "sessionNumber()", +"10c9135e": "getTime3(address)", +"10c9ab39": "makeTrans(address,uint256)", +"10c9c76d": "updatePokecoinAndPokemarketAddresses(address,address)", +"10cad61f": "combinedGoalReached()", +"10cad69c": "getBrickIds(uint256,uint256,bytes32[],uint256,uint256,uint256)", +"10cb4302": "DstTokensIssued(uint256,uint256,uint256,uint256)", +"10cb4d64": "rejectCurrentPlayerDraw(bytes32)", +"10cb5628": "isPartOf(uint256)", +"10cb954c": "members_push(address,address)", +"10cbe445": "applyMC()", +"10cc6e21": "Dappster()", +"10cc969b": "sumbitForElection()", +"10ccbbdb": "_checkVotes(address)", +"10ccbe66": "setAltCapitalization(uint256)", +"10ce0516": "canSwap()", +"10ce2f3f": "buy3(address[],address[],uint256[],bytes,bytes,bytes)", +"10ce6452": "set_deposit_fee(uint256)", +"10cf5d47": "awaitingPayout()", +"10cfcc19": "left17(uint256)", +"10d0059c": "removeLock(uint256)", +"10d07e27": "_lotteryCard(uint256,address)", +"10d08ef4": "_check_winner()", +"10d0ffdd": "calculateTokensReceived(uint256)", +"10d26354": "greaterThan(bytes32,bytes32)", +"10d2f2e5": "set_whitelist_enabled(bool)", +"10d3bd2a": "transferMoneyMoney(address,uint256)", +"10d426f2": "_remove(address)", +"10d48cd3": "verificationAddressOn(address)", +"10d5105d": "offlineTransfer(address,address[],uint256[],uint8[],bytes32[],bytes32[])", +"10d58506": "transFeeCut()", +"10d5e276": "maxAttempt()", +"10d6a13a": "tokenSaleClosingTime()", +"10d72742": "removeFailedGame()", +"10d7b903": "DIALSSPUN()", +"10d89d37": "isExchangeUser()", +"10d8d74d": "setPrice(bytes32,uint256)", +"10d92060": "requiredGasPrice()", +"10d979f6": "tokenDivsOwing(address)", +"10da9f75": "StayBitContractFactory()", +"10dc0e3c": "decimalOfPrice()", +"10ddaa87": "_setCurve(uint256[],uint256[])", +"10ddd6fc": "_onPromo(address,uint256)", +"10debdf8": "isAuditFinished(uint256)", +"10dff452": "getStatsData(uint256)", +"10e04dcb": "BONUS_500()", +"10e0ebb3": "callStoWithBtc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"10e1c5e5": "getKrsFromApproved(address,uint256)", +"10e1d6db": "payoutEscrow(uint256)", +"10e22d41": "receivedWei()", +"10e2b914": "setTargetDiscountValue6(uint256)", +"10e3a28b": "iEther()", +"10e56973": "keyPrice()", +"10e5bff8": "setSuccessor(address)", +"10e6913e": "upDate()", +"10e6a223": "allocateSurvivorWinnings(address)", +"10e6be35": "getRewarder(int256)", +"10e6d3c9": "teamReservation()", +"10e6d746": "_mint(address,string)", +"10e6e06c": "vote(bool,uint256)", +"10e776ed": "lockBalanceOf(address)", +"10e7a9ce": "countMonths()", +"10e7e89f": "getLockingTimestampfrom()", +"10e80ded": "accumulate_to()", +"10e82384": "airdropAdmins(address)", +"10e89b22": "remove_deal(uint32)", +"10e96b3c": "createMorePaymentChannels(uint256)", +"10e9f2eb": "_getFetchVoteInterface(uint256)", +"10ea13df": "totalInvestment()", +"10ea6b34": "setReadOnly(bool)", +"10eae945": "wdToken(address,address,uint256)", +"10eaf707": "getWarehouseByAddress(address)", +"10eb3a32": "getContinuityNumber(uint32,int256)", +"10eb5a8c": "transferAndCallFST(address,uint256,bytes)", +"10ebb38d": "ASFBToken()", +"10ebf103": "getPokemonBet(uint256)", +"10ec5d2c": "funeralAndBirth(bytes32,int256,bytes32)", +"10eca945": "SetupMultipliers(uint256,uint256,uint256,uint256,uint256)", +"10ece9c6": "correctedHeroContract()", +"10ed5dfe": "_emitActiveChanged(bool)", +"10ee1910": "submitGameResultAndTriggerPayout(uint256)", +"10ee51ca": "GXVCSentByEther(uint256,address,uint256)", +"10eeb69a": "arbitrate(uint256,bool)", +"10ef0ac7": "endTimeICO()", +"10ef1976": "getEpmBalance(address)", +"10f01eba": "pIDxAddr_(address)", +"10f0c4da": "maximalInvestment()", +"10f13a8c": "setText(bytes32,string,string)", +"10f169e8": "disputeStatus(uint256)", +"10f1726d": "isDayTokenActivated()", +"10f1a274": "setMinWei(uint256)", +"10f226df": "addAction(bytes32,int256,int256,bytes32[],bytes32[],bool)", +"10f2bf3e": "closeSale2()", +"10f2e11c": "PrometheusX(address,address)", +"10f32982": "GetQueueLength()", +"10f3ac24": "EmergencyWithdrawNoAccountedTokens()", +"10f40804": "alottMainSaleToken(address[])", +"10f41715": "updateMintingData(uint256,uint256)", +"10f444ac": "ChinaInvestmentToken(uint256,string,uint8,string)", +"10f5f1b3": "get_participant_arbits_kyc_whitelist(address)", +"10f5f6b6": "free_vote_for_candidate_A()", +"10f66c54": "AirdropOne(address,uint256)", +"10f6e2a6": "setCountWinnerByPlace(uint256,uint256,uint256)", +"10f6fd02": "GetAllChallengeIDs()", +"10f74467": "kycRegisteredContributors(address)", +"10f7cf32": "statuses(bytes32)", +"10f85f44": "EAACoin()", +"10f88546": "declareCheater(address)", +"10f91e39": "walesaDawajMojeStoMilionow()", +"10f945c7": "withdrawToPoolOwner(uint256)", +"10fa01e6": "isBattleCreator(string,address)", +"10fa85c6": "HybridToken(string,string,uint8)", +"10fab6c7": "addReceivedMessage(address,address,uint256)", +"10fae6f4": "futureFundingWalletAddress()", +"10fb3c85": "addDelayedBonus(address,uint256,uint256)", +"10fb52bf": "createSaiFoundersEdition(uint256,address)", +"10fc0a6e": "RigCraftPresalePackageManager()", +"10fc0d39": "transferToMultisig()", +"10fc31ce": "balancesForPreICO(address)", +"10fccbf0": "presaleBurnPaused()", +"10fcda55": "DDFToken(uint256,string,uint8,string)", +"10fcdecc": "fechVoteInfoForVoter(address,uint256)", +"10fe42b8": "getBdpControllerHelper(address[16])", +"10fe5a2a": "rateEarlyStage3()", +"10fe7c48": "placeBet(uint256)", +"10fe9ae8": "getTokenAddress()", +"10feb0e5": "setPowerToken(address)", +"10ff4a1b": "lockedTokenBalance()", +"1100482d": "attach()", +"1100a9d8": "endGame(uint256,uint256,address)", +"1101a0fd": "claimWinnings(bytes32,bytes32[],address[],uint256[],bytes32[])", +"1101eaaf": "purchaserCount()", +"1101fa06": "WhaleChain(uint256,string,uint8,string)", +"1102610e": "setMarketplaceContract(address)", +"110466ed": "setOperatingStatus(bool)", +"110496e5": "allow(address,bool)", +"1104e09e": "SaddleShopSaleFee()", +"110506f0": "createCard(uint256,uint256)", +"11056874": "finishDApp(bytes32)", +"1105efe2": "_setExtraReceiverAmount(uint256,address)", +"11063eb1": "updateUnlockDate(uint256)", +"11071cb3": "CratesPurchased(address,uint8)", +"1107c3f7": "orderConfirmer(bytes32)", +"1107e77c": "removeRequester(address)", +"1107fa00": "thirdStageMintingDate()", +"1109a0a8": "blocksProducers(uint256)", +"1109ef92": "transferFromCrowdsale(address,uint256)", +"110ae711": "checkReferral(bytes8)", +"110b5f76": "ApprovalDenied(address,address)", +"110b8a6d": "changePlatformFlag()", +"110c478b": "uintRound(uint256,uint256,uint256)", +"110cee6b": "FlightDelayPayout(address)", +"110d35b8": "buyAsset(uint256)", +"110d9e68": "insert(bytes32,uint256,uint256,address,address)", +"110dc7a6": "doInvest(address[3])", +"110df916": "getChannelID(uint256)", +"110f8874": "withdrawRefund()", +"110fd65f": "toBeRaised()", +"111002aa": "createTask(string)", +"11102d4d": "devRatio()", +"11103599": "Token_Offer(address,address,uint16)", +"1110b13a": "getWinningPosition(uint32)", +"11115e38": "controlTime()", +"1111cd24": "getBuyReturn(uint256)", +"11125497": "setCodename(string)", +"1112b124": "setBuyPrice(address,uint256)", +"11136747": "_init(uint256)", +"1113ed0d": "KERNEL_APP_ID()", +"1113f2e6": "_addEth(uint256,address)", +"1114811a": "FACTOR_9()", +"111485ef": "individual_cap()", +"11149ada": "getProof(uint256)", +"1114fce5": "clearAdmins()", +"1116cba9": "WWNCoin()", +"1116f631": "setFunctionSevenPrice(uint256)", +"111723ed": "getShipDetails(uint256,uint256)", +"1118069c": "enforceKyc(bool,address)", +"111839d5": "rushTimeFloorCount()", +"11184392": "registrationDeadline()", +"111878f6": "addBonus(uint256)", +"11191186": "setReservingPercentage(uint256)", +"11196117": "setGameStateFCF(bool)", +"11196cc2": "tournamentFinished(uint256[])", +"11199872": "setSignatureChecker(address)", +"1119e8a6": "increaseNumber(uint256)", +"111a1fe9": "dividendsBuffer()", +"111a7427": "setNewAttributes(string,string)", +"111b30a7": "setFundariaTokenBuyAddress(address)", +"111b63ab": "CoinparkToken()", +"111b72c3": "accountCreated(address,bytes32,int256)", +"111bc51a": "VibeCoin()", +"111cf909": "setIntegerVaule(uint256)", +"111d7241": "tournaments()", +"111d8171": "getNews()", +"111da3a7": "popFirstFromArray(address[])", +"111e73ff": "SetAlias(uint256,bytes32)", +"111eaba0": "updateOwners(address,address[],uint256,uint8[],bytes32[],bytes32[])", +"111fba02": "NETM()", +"1120ba47": "ApolloSeptemCrowdsaleExtended(address,address)", +"112227ae": "TIER3_BONUS()", +"11223a2f": "phasePublicSale1_From()", +"1123adb1": "currentDividendPeriodNo()", +"1123cdd9": "decideSplit(uint256,uint256,string)", +"1123e608": "LogMigrate(address,uint256)", +"1123efd5": "getNumGamesStarted()", +"1123fcce": "getEmployeeCount(address)", +"11247233": "changeArrangerFeeRecipient(address)", +"1124c05a": "getLogs(uint256)", +"1124e9ea": "setfocuscardid(address,address,uint256)", +"11262105": "getLog(address,uint256,uint256)", +"11269de6": "setFreezeForCoreTeam(uint256,address,uint256)", +"1127be97": "recomputeLastAverageBalance()", +"1128798f": "isCrowdSale()", +"1128b59e": "bonusStage2FirstDay()", +"1128bbfd": "getProposalAddress(uint256)", +"112940f9": "addConsumer(address)", +"1129f644": "STAKE_START_TIME()", +"112a19af": "Enlisted(address)", +"112b3c52": "MuxeToken()", +"112b4495": "_appendTagged(string,string,string)", +"112b466e": "btcraised()", +"112c7075": "ManualDeposit()", +"112cc015": "ROLE_CRO()", +"112d6b34": "getRefBalSended()", +"112d761c": "addAnimal(uint8,address,uint32)", +"112dd4fd": "foundation_coins()", +"112e39a8": "scheduleCall(uint256)", +"112e40b5": "setBalanceOfETH(address,uint256)", +"112ea262": "authorizeProvider(address)", +"112ed3f5": "resetWeiBalance(address)", +"112f5eb8": "airdropCall(address,address,uint256)", +"112fb7c9": "finishGenerating(bool)", +"112fbe9b": "transferMinimumFee(address)", +"11302818": "addRefBonus(address,uint256)", +"11308d66": "freeLandsOf(address)", +"1132fae4": "_utoa(uint8)", +"113353a8": "changeMember(uint256,address,address)", +"1133f89d": "sendToGrowthContract()", +"11340c21": "getEGTTotalSupply()", +"1134269a": "convertForPrioritized(address[],uint256,uint256,address,uint256,uint256,uint8,bytes32,bytes32)", +"11349a6d": "dispute_end()", +"1134b7da": "emptyBody(uint256)", +"11355585": "setBlockLimit(uint256)", +"1135b3ac": "allocateInternalWallets()", +"113642e5": "getConfirmationCount(bytes32)", +"11367b26": "destroyer()", +"1136aa64": "rocketTravelTime(uint256)", +"1138001c": "lenghtenFrozenState(uint256,uint256)", +"11390441": "logic(address)", +"113990b8": "PRICE_MULTIPLIER()", +"1139a355": "releaseForTransfer()", +"113a8ed5": "Film()", +"113b2eff": "_userRefund(address)", +"113b5cf2": "checkBonus(address)", +"113bb8db": "EventTransfer(address,address,uint32)", +"113c589f": "SmartBillions()", +"113ca356": "ticket(address,bool)", +"113ce458": "winnerBidValue()", +"113d1975": "totalTokensForSaleDuringICO4()", +"113d32d0": "TournamentCreated(uint256)", +"113d8938": "addBytesSetting(string,bytes32,address,address,string)", +"113e2088": "votingData()", +"113e5b93": "dayToDate()", +"113e6b66": "fipsAddToLedger(bytes20,address)", +"113e9d4f": "DigitalKeyCoin()", +"113ee583": "aliceClaimsPayment(bytes32,uint256,bytes32,address,address)", +"113ee964": "transferFromByDate(address,address,uint256[],uint256[])", +"11400d8e": "priv_fastGetBlockHash__(int256,int256)", +"1141d7de": "URI()", +"11420f90": "MYINITIALSUPPLY()", +"11424eac": "implementInterface(string)", +"11428ce8": "DTXToken(address)", +"1142d47f": "spentFunds()", +"114385a0": "AddReward(uint256,string,string,string,uint256)", +"1143c026": "disableICOSwapLock()", +"11448a56": "scuttle()", +"11456b47": "addName(string)", +"11459f9c": "viewFinalScore(uint8)", +"1145a20f": "scheduleCall(address,bytes4,bytes32,uint256,uint8)", +"1145a49c": "test_oneTrueAssert()", +"1146015e": "setData_6(uint256)", +"11461614": "pushRatePlan(uint256,string,bytes32,bool)", +"114630e1": "ADVISORS_TOKENS_SUPPLY()", +"11463a01": "getChampion()", +"11466110": "Pretorian(string,string,string)", +"11467d7c": "deactivateUser(address,uint256)", +"1146eedd": "Referrer(address)", +"114719c5": "getLongGap()", +"11471e17": "tokensPerEther2()", +"1147b142": "MercatusDeals()", +"1148d93e": "initializedRatify()", +"1148da2f": "proposeWrittenContract(string)", +"11497c69": "PlayChapToken()", +"1149b5f5": "PendingManager(address)", +"1149f736": "unpackPrice(uint16)", +"114b4f1c": "howManyGuaranteed()", +"114beab3": "availableTokensforPreICO()", +"114d081d": "markHours(bytes32,bytes32,int256)", +"114d38a0": "notExceedingSaleCap(uint256)", +"114d69b2": "setCRLaddr(address)", +"114d8be1": "addNewOwner(address)", +"114da3e3": "mintWithEvent(address,uint256)", +"114de05e": "addMultipleRecords(uint256[])", +"114e4802": "congratulationsText()", +"114e6b37": "setDependencies(address,address,address,address,address,address)", +"114f0e49": "player4()", +"114f9511": "pay(bytes32,uint256,address,bytes)", +"11506970": "freezeTokensAmount()", +"11506d4b": "forgiveThis(address)", +"11513ba5": "setTTWTokenAddress(address)", +"11552212": "Hodl(address,uint256)", +"1155d042": "accumulateFee()", +"1155f60f": "RoundBetStarted(uint256,uint256)", +"11563b04": "ETokenAirdrop()", +"11566dd7": "fundingMax()", +"11567f95": "readnameXaddress(address)", +"115793d4": "newClockmaker()", +"1158183a": "isPreIcoActive()", +"11589260": "_createProxy(address,address)", +"1158f696": "createMarriage(bytes32,bytes32,uint256,bytes32,bytes32)", +"115976c4": "admin1()", +"1159f39b": "transferFromCroupier(address,uint256)", +"1159fd53": "isAContract(address)", +"115a43e9": "getWarriorOwners(uint256[])", +"115b7fa8": "setOverBalanceLimitHolder(address,bool)", +"115bd3f8": "rejectInvestmentWithdrawal()", +"115bdfe7": "currencyMap(address)", +"115ce332": "isAddressMember(address)", +"115d5376": "passPeriod(uint256)", +"115e397e": "getTotalchannels()", +"115e9375": "getUint256Min()", +"115ecc58": "fundStorageVault()", +"115ece4c": "getTokenAmount(address,uint256)", +"115f2be2": "customBuyerLimit(address)", +"115f2f2f": "tokensPerUSD()", +"115f6795": "cratesSold()", +"115fd072": "PowerStandardToken(uint256,string,uint8,string)", +"1160a807": "addWinTickets(uint256,uint256)", +"1160b93b": "calculatePayrollRunwayInMonths()", +"11610c25": "bet()", +"116134ee": "mask()", +"11613fc9": "godBank()", +"116191b6": "gateway()", +"1161a5c8": "registMyHns(string,address)", +"1161d226": "_participateIsAllowed(uint256)", +"1162247e": "lastTwoAmbassadorsAdded()", +"11642134": "produceEmeralds(address,uint256)", +"1164e11e": "getPurchaserAddressCount()", +"1165214d": "NotToRent(uint256,uint256,address)", +"1165dce2": "getTeamList()", +"11667335": "adminRetrieveContractConfig3()", +"1167ecb2": "finishPreICO()", +"116877cc": "changeAuthority(address)", +"116a6f6c": "BONUS_TIER_7_LIMIT()", +"116a8221": "airFropTracker_()", +"116b556b": "founder1()", +"116b7aa9": "setGameGiftOnceAmount(uint256)", +"116c347a": "_withdrawTokensTo(address)", +"116c6eab": "getProfitShare(address)", +"116c92b7": "addAccount(address,uint8,bool,address)", +"116d816b": "assetManagement(address)", +"116e4ca9": "flag_is_Online_Solidity_Decompiler_NB()", +"116e8726": "crowdsaleDasTokensChangeBeneficiary()", +"116ea900": "createETHCardCollectible(uint8,uint8,uint256,address,uint256,uint256,uint256)", +"116fb2a8": "setTokensPerETH(uint256)", +"116fe01b": "ClipperCoin(uint256,string,uint8,string)", +"11704f52": "tradingLive()", +"1170a759": "withdrawalCoolingPeriod()", +"11715316": "CorpCoin(address,uint256)", +"11715c94": "getBonusRateForAmountBased(uint256)", +"11717501": "IEFBR14Contract()", +"11719d7e": "getCrowdsalesForUser(address)", +"11725ac5": "Determine_FiveLinkGame_Result(uint32)", +"11728ecf": "toKey(address,uint256)", +"117328b9": "LogBidReturned(address,uint256,uint256)", +"11737d7b": "getFreeTime()", +"11738735": "bnbWithdrawEnabled()", +"1173ca7d": "CashBackToken()", +"11746e5e": "getSpaceshipProductCount()", +"1174ca26": "totalLossValue()", +"117546c5": "lastParentBlock()", +"1176205e": "setMaxRequestQuota(uint256)", +"1176f5f7": "setDisputeData(uint256[2])", +"1177275e": "ZferToken(address,uint256,uint256)", +"117735f0": "NewQuest(string,bytes32)", +"1177645b": "set_devContract(address)", +"11776737": "CrowdServe(address,uint256,uint256)", +"11777af7": "refundVault()", +"1177892f": "getBalanceByAdress(address)", +"1177dc34": "nullFace(address)", +"117803e3": "OWNER()", +"11780a01": "erc20tk()", +"11789bec": "njbToken()", +"1178f51a": "ubiatarPlayVault()", +"11791368": "removeCurrentIcoRound()", +"1179778b": "setBasePremium(uint256)", +"1179cf71": "lowEtherBonusValue()", +"117a0a22": "CosmoToken()", +"117a4425": "setII_S(uint256)", +"117a5b90": "games(uint256)", +"117b198e": "soldTokensLimit()", +"117b4705": "retract(bytes32)", +"117b652b": "rewardinterval()", +"117cae9a": "editStartlist(uint256[],uint256[])", +"117d4128": "getOrder(uint128)", +"117d82d6": "playCount1()", +"117d94f5": "sendFundsToWallet()", +"117ddaf9": "weiRaisedInPreICO()", +"117de2fd": "payout(address,uint256)", +"117df088": "withdrawDeposit()", +"117e1ebb": "lastRoundWinnerInfo()", +"117e62fd": "getLastAuctionsWinningBid()", +"117f8684": "changeBZxVault(address)", +"1180788e": "searchString()", +"1180d67e": "angelFoundationShareNumerator()", +"1180f83b": "changeFMPcontractAddress(address)", +"1181324b": "updater(address)", +"11815312": "grantTeamAdvisorSupply()", +"1181a459": "freezeAdministrationContract()", +"11822cb7": "UTPL()", +"11823d43": "OCMarket()", +"11823e04": "advisorAllocation()", +"1182c796": "debug_is_dry()", +"11831234": "testFailPullWhenStopped()", +"1183429a": "removeAddressesFromWhitelist(uint256,address[])", +"11844aae": "period2End()", +"11851b5e": "BOARD_3()", +"11857ed7": "spendAdvertising(uint256,uint256)", +"1185a6b9": "getBBFarm(uint8)", +"118644f6": "OxBtcDex(address,address,address,uint256,uint256,uint256)", +"118654f1": "XinXianToken(address,uint256)", +"1186560e": "increaseEthRaised(uint256)", +"11873ee7": "SetGuestName(string)", +"1187497e": "updateContractState(uint256,uint8)", +"1187648b": "testInstant(uint256[3])", +"11878333": "InitialToken(string,address,uint256)", +"1187d66e": "votedNo()", +"1188189e": "storeSomething()", +"1188263c": "MBOTCOIN()", +"1188324b": "soldCWC(address,uint256,bytes32)", +"11883c6d": "make_hash(uint256,uint256,address,address,uint256,uint256)", +"11886bd4": "view36()", +"118934cc": "ownerCommission()", +"118a0aae": "addHero(string,address,address,uint256,uint256)", +"118a9db3": "revenueShare(uint256)", +"118aa5a1": "convertToRate(bytes32)", +"118b0f04": "santToken()", +"118b53ec": "LogTeamTokensTransferred(address,uint256)", +"118cbccb": "etherWeiRate()", +"118ceab6": "lastAdjust()", +"118da6fb": "getGameCompleted(uint256)", +"118dd8fc": "bonusesAfterClose(uint256)", +"118e1f2e": "globalOrderSerial()", +"118e31b7": "getBorrowBalance(address,address)", +"118e4575": "get_branch(uint256)", +"1190516d": "GetByte(uint256,uint256)", +"1190647c": "buyerHistory(address,address,uint256,uint256)", +"11916ce7": "moveIcoTokens(address,address,uint256)", +"11933e4b": "Transmuted(address,address,address,uint256,uint256)", +"11937ccd": "adminUpdateStartEndTime(uint256,uint256)", +"1193e38e": "setPercent3(address,uint256)", +"1194ed46": "payerString()", +"11952369": "onRemove()", +"1196004f": "newCycle()", +"1196245b": "registerDIN()", +"1196493c": "getJobContracts(uint256,uint8)", +"119669cb": "GiveChipGitf()", +"1196deda": "sendTeamTokens(address,uint256)", +"1196fb60": "contributeToPrizePool(string,string,string)", +"119739ff": "privatesaleEnds()", +"11997dc6": "BASE_DURATION()", +"119aa5c8": "checkForward(bytes)", +"119b22b3": "roundNum()", +"119c1c23": "tokenAllowance(address,address)", +"119cb2ff": "tokenPriceDivides(uint256)", +"119cbed6": "rtm_contract()", +"119cc328": "setFoundersWallet(address)", +"119ce91b": "voteInfo(bytes32,address)", +"119d0cb5": "DumbCoin()", +"119d97ee": "team4Address()", +"119d9bfe": "KudosTokenFactory()", +"119dd1b0": "presaleLimitReached()", +"119e045b": "checkMaintenanceTime()", +"119e5cdf": "creationUnit()", +"119ebe89": "getExternalCurrencyProcessor()", +"119ecb35": "tokensaleStageNow()", +"119ee4ab": "batchCancelAuctions(uint256[])", +"119eeb9c": "darx()", +"119f118d": "ethToCash()", +"119f1edb": "claimPlatinum(uint64)", +"119f2546": "distributeEBTC(address[])", +"119f2c9f": "transferCard(address,uint256,uint256)", +"119f32dd": "adminIsDead()", +"119f8747": "support()", +"119fdee2": "sha256ofString(string,string)", +"11a00327": "deleteOrder(uint256)", +"11a09ae7": "airDropTracker_()", +"11a0c16c": "dsquare(uint256,uint256)", +"11a10508": "switchToNextSale(address)", +"11a10698": "ERC223Token(uint256,string,uint8,string)", +"11a153df": "getBlockNumSinceInit()", +"11a1b31e": "commandGetBonusTime()", +"11a4c710": "buyRecipient(address)", +"11a5a793": "percentageToKill()", +"11a5b9bc": "migrateBlock(string,uint256,uint256,uint256,address)", +"11a76729": "transferFromInBatch(address,address,uint256[])", +"11a76f37": "addStakeHolder(address)", +"11a800bc": "addressOf(uint256)", +"11a881e8": "setFee(uint256,uint16,uint256)", +"11a88e05": "preSale2()", +"11a8f413": "latestRoundId()", +"11a98193": "ETHfund()", +"11a9c3c2": "sellDOTCH(uint256)", +"11a9f10a": "noToken()", +"11aa2722": "assignOldUserFunds(address[],uint256[])", +"11aa7e26": "setKevin(uint256)", +"11aaf884": "HCPToken()", +"11ab19f8": "addTokenToTotalSupply(uint256)", +"11ab27d2": "HydroCoinPresale()", +"11ab31ed": "rejectProposal(bytes32)", +"11ac20c0": "cancelLottery(uint32)", +"11adbaad": "getListOfAddresses()", +"11ae40b2": "Presale(uint256,uint256,uint256,uint256)", +"11ae6aee": "_mint(int256,uint256,uint256,uint256)", +"11aee380": "memberCount()", +"11af07e2": "create_event(string)", +"11af3c68": "divest(address)", +"11af6564": "getCurrentGasPrice()", +"11affa5c": "setEggTable(uint16,uint32[])", +"11b059c6": "mintableProperties(uint256,bytes32)", +"11b2b22a": "FRKT()", +"11b35c48": "AGSCoin()", +"11b4bbdb": "mintTokens2(int256,address,uint256,uint256)", +"11b546f6": "firstWeekTokenPrice()", +"11b639d9": "currentTokenCount()", +"11b63a17": "CROWDSALE_TOKENS_NUMS()", +"11b70018": "bookingList(address,uint256)", +"11b7702a": "ImportTestA()", +"11b7d483": "addressGains(address,address)", +"11b8f957": "dayAfterDeadline()", +"11b97324": "participateCrowdsaleSelected(address[])", +"11b98e12": "isMainSaleTokenRaised(uint256)", +"11b9fee8": "ForkChecker(uint256,bytes32)", +"11ba65e5": "_setUpgradeabilityOwner(address)", +"11baae84": "Contribution(address,address,uint256,uint256)", +"11bab044": "getCreditFundAddress()", +"11bb20da": "withdrawBattleValue(address,uint256)", +"11bbb155": "goLong()", +"11bbdf53": "maxOpenAttacks()", +"11bc0a34": "BuyOrder(uint256,address,uint256,uint256,uint256,uint256)", +"11bc5315": "drawer()", +"11bcd573": "SetTest(address)", +"11bcd830": "MinDeposit()", +"11bd85ad": "Owned2()", +"11bdfe19": "revertBet(uint256)", +"11be40e0": "transfer(address,address,address[],uint256[])", +"11bec062": "EVT()", +"11bed352": "eip20Approve(address,address,uint256)", +"11bf68cf": "_issue(bytes32,address,address,uint256,bytes,bytes)", +"11bfe017": "playerWinItems(address)", +"11c07649": "getMainAccount(uint256)", +"11c09100": "calculateNumWeiToIssue(uint256,uint256)", +"11c0b024": "_setDamgeValue22(uint256)", +"11c0f931": "bindSmartIdentity(string,string)", +"11c12715": "LCToken()", +"11c134e1": "sumPreICO()", +"11c15dcc": "purchaseBalances(address)", +"11c19d3c": "SpiderFarm()", +"11c1dc82": "monakojima001()", +"11c1ddd9": "addMedalBurned(uint16)", +"11c28e1a": "initial_tokens()", +"11c33625": "royaltyInformationContract()", +"11c3a62f": "GetLuckyResults()", +"11c3fec5": "CreateLand(uint256,address)", +"11c4d4f4": "communityAddr()", +"11c4dbf4": "auctionReputationReward()", +"11c4e123": "rootHashOf(bytes32)", +"11c52ec0": "setMaxWagerWei(uint256)", +"11c57757": "tixPromoDeposit()", +"11c5a234": "logResult(int8,string)", +"11c60418": "remAdmin(address)", +"11c7d6bd": "issueNewSeries()", +"11c8efac": "lifeA(uint256)", +"11c911d9": "unreserve(address,uint256)", +"11c91914": "isUnderLimit(uint256)", +"11c93d03": "crowdsale_eth_refund()", +"11c94362": "COMMUNITY_RESERVE()", +"11c98718": "getMsgDataBefore()", +"11c99f3b": "FundsWallet()", +"11c9ccf6": "deleteCustomer(address)", +"11ca3c63": "satoshiRaised()", +"11cb0bcf": "getParticipantOriginWithIndex(uint256)", +"11ccf822": "beneficial()", +"11cd98ed": "convertToAllTable(uint256,string)", +"11cda415": "peer()", +"11cdf27a": "addVersion(address)", +"11ce0267": "storageContract()", +"11ce3d24": "postMonForMon(uint64,uint64)", +"11ce3d2c": "GQHToken(uint256,string,uint8,string)", +"11ce4556": "TOKEN_TO_CREATOR()", +"11ceb21c": "ZigZagSupply()", +"11cec8f0": "getTradeByIndex(uint256)", +"11cfb19d": "freezedTokenOf(address)", +"11d12402": "testEasyPropose()", +"11d15e17": "freeReadings(address)", +"11d17e78": "Blocker_destroy()", +"11d295bf": "_getShipName(uint256)", +"11d36bf5": "reservedSaleEther()", +"11d36c4f": "setBoolF1F2F3(bool,bool,bool)", +"11d40001": "EthernautsVendingMachine()", +"11d414af": "changeIcoStatus(uint8)", +"11d4f314": "setBounties(address[],uint256[])", +"11d60664": "ethtoeth(address,uint256,uint256)", +"11d62de9": "ownerShip(address,address)", +"11d634ac": "HamsterMarketplaceToken()", +"11d7b2fe": "unlockAccount()", +"11d817f2": "getUsers(address,bytes32)", +"11d8657a": "finalizeAndPayoutForHopeful(uint256,uint256,uint256,uint256)", +"11d87c4e": "initGame(uint256,bytes32,bytes32,bytes32)", +"11d89f3a": "setResearchAndDevelopment(address)", +"11d8cac7": "view_state()", +"11d986e6": "BlockSigner(uint256)", +"11da60b4": "settle()", +"11da9598": "add2MarketPlace(address,uint256,uint256,uint256)", +"11daa2d0": "jpPercentage()", +"11daa7a0": "gamessage(address,address)", +"11daca81": "joinPot()", +"11daea9c": "removeExchangeTestAccounts(address,address)", +"11daf56a": "MainFabric()", +"11db0176": "unLockFreeze(uint256)", +"11db3be7": "invokeVerification(uint256,uint256,uint256,string,bytes32[2])", +"11db6e0e": "ownsSouls(address)", +"11db8d1b": "burner(uint256)", +"11dbb12e": "removePolicyRule(bytes4,address,bytes32)", +"11dc273d": "currentBalances(address)", +"11dc45c9": "withdrawPrize(address)", +"11dc4703": "removeUser(uint256)", +"11dc6816": "getAllowanceOwnerValue()", +"11dcee2f": "priceCallback(bytes32,uint256,bool)", +"11dd2837": "_updateCurrentStage()", +"11dd39b4": "cancelApprove(bytes32)", +"11dd46b4": "calVoteResult()", +"11dd576d": "userCheck(bytes32)", +"11dd8845": "getRecord(string)", +"11ddf693": "debug_changeOwner(address)", +"11df19f7": "_medalTotalSupply()", +"11df9995": "coin()", +"11e0de8b": "tickets10kprice()", +"11e13c32": "BONUS_ICO_STAGE1_PRE_SALE4()", +"11e14b2e": "employees()", +"11e21245": "weiSoftCap()", +"11e3655f": "updateInstantToken(address)", +"11e38468": "MarketboardListingComplete(address,uint256,uint256,uint256,uint256)", +"11e3d606": "min_investment_eth()", +"11e48cdf": "tokensAllocatedTotal()", +"11e5b955": "Order_sell(address,uint256,uint256)", +"11e5ea57": "teamsWallet()", +"11e67c57": "totalBuyOrders()", +"11e6a0fd": "getProviderDetails(uint256)", +"11e847b6": "HATCHBACK()", +"11e84c71": "claim(bytes32,string)", +"11e956c8": "isMasterNode()", +"11e96ab6": "LockCredits(address,uint256,uint256)", +"11e99c22": "arrival()", +"11eb6d4b": "GxAuth()", +"11ebbf24": "createWallet()", +"11ec76cb": "LogClaimHalvingSubsidy(address,uint256,uint256,uint256)", +"11ec7b4a": "balancePrivateSale()", +"11ed1bf6": "artworkIndex()", +"11ed7b42": "thirdItemWrong()", +"11ee0ec5": "getZone(uint256)", +"11ef8d4b": "delegateBonusTokens(address,uint88)", +"11efbf61": "getFeePercentage()", +"11efec9b": "shareHolderByNumber(uint256)", +"11efff1f": "unlockRecordAdd(uint256,bytes32,string,string,uint256)", +"11f02c87": "createHybridization(uint256,uint256)", +"11f03b83": "GiftCrowdsale(uint256,uint256,uint256,uint256)", +"11f0b806": "getDutchAuctionToCraftAddress()", +"11f11b9c": "editName(string,uint256)", +"11f1507e": "getAssetToken(uint256)", +"11f15380": "clientKeysCount(uint256)", +"11f1fc99": "withdrawTreasury(uint256)", +"11f217c7": "getNodeAddress(address)", +"11f29729": "setsymbol(string)", +"11f2a395": "finalWithdraw()", +"11f2eed1": "convertEthToMet(uint256,int256)", +"11f37ceb": "get_price()", +"11f3eecd": "sellTokens(uint8)", +"11f43157": "openCrates()", +"11f45f23": "buyVIBET()", +"11f48166": "IntroToken()", +"11f4a9ce": "KernelProxy(address)", +"11f4ba60": "importBalanceOf(address)", +"11f54545": "SmatrOCrowdsale(uint256,uint256,uint256,address)", +"11f58e99": "maxTokensSold()", +"11f598cd": "editPersonalNote(string,uint256)", +"11f6649b": "authorizers(uint256)", +"11f6ad2b": "lastWinnerId()", +"11f72496": "testT()", +"11f82a2b": "_getPolishingPrice(uint256)", +"11fa3d14": "LeekCoinCrowdsale(uint256,uint256,address,address)", +"11fa3f4f": "weiUsdExchangeRate()", +"11fa7da2": "getInvestmentsInfo(address)", +"11fa9ea6": "narrowCyclePrize()", +"11facae2": "setValidatorCount(uint256)", +"11fb57e2": "TokenManager(address[],uint256)", +"11fb584a": "BloccaConto(address)", +"11fbad62": "_rejectTransfer(uint256,uint256)", +"11fdff0c": "advisorPool()", +"11fe12b3": "isRecovery(address,address)", +"11fe773d": "memcpy(uint256,uint256,uint256)", +"11ffb1d4": "deleteMember(address)", +"11ffe7c9": "getUserDocCount(address)", +"12005e53": "alexToken()", +"1200617f": "auction(uint256)", +"12007984": "addBalanceToGame(uint256)", +"120149a1": "readCube(bytes32)", +"120184fa": "gvCF()", +"1202be01": "eth2mnt()", +"12032e52": "getSecondaryRecord(string)", +"12035ca6": "setData_3(uint256)", +"12038a01": "totalDevelopmentFundEarned()", +"12039fed": "mintMedal(uint256)", +"12045d3f": "VKTToken(uint256,address)", +"1204bab4": "popcount(uint64)", +"1204ce91": "Debug(bytes32,uint256)", +"1204d27c": "coinIssuedBurn()", +"12055758": "checkOwner(address,uint32[11])", +"12058764": "lockBalanceGroup(address,uint256)", +"12059f68": "LoversAdded(string,string)", +"12065fe0": "getBalance()", +"1206dc5f": "transferMarketplaceOwnership(address)", +"12074a46": "getUserBets()", +"1207bb8e": "crowdsalePrice()", +"1207f0c1": "issueTo(address,uint256)", +"1208a256": "getLock(address,uint256)", +"1209073c": "updateBalances(uint256)", +"120960de": "depositInPot()", +"1209b1f6": "ticketPrice()", +"1209f7ed": "withdrawPledge()", +"120bd501": "approves(address,uint256)", +"120bd8f5": "setMinimumBetValue(uint256)", +"120c5194": "getCollectReporterAddress()", +"120c52ef": "calculateDemurrage(uint256,uint256)", +"120c7efd": "certifier()", +"120cc993": "isEmptyOwner()", +"120cf351": "bitdietecToken()", +"120dae83": "setMinimalContribution(uint256)", +"120e6c16": "_finneyToWei(uint32)", +"120e8f05": "calculateMintAmount()", +"120fe731": "Tropycoin()", +"120fe89b": "getPolls()", +"121114e1": "SuperTicketCoin(uint256,string,string)", +"1211540c": "withdrawPartial(uint256)", +"121166ef": "clearTrade(bytes,address,bytes32,address,uint256,int256,string)", +"1212c12f": "RecordManager()", +"12136918": "setMaxTranferLimit(uint256,uint256,uint256)", +"12136e57": "ERC777ERC20BaseToken(string,string,uint256,address[])", +"12146222": "highSupport(address)", +"1214ab82": "Lightning()", +"121557a3": "Avatarium()", +"121563ae": "Axioms()", +"12156c66": "snowflakeCall(address,string,string,uint256,bytes,bytes)", +"1215f8ef": "releaseValue3()", +"1216e771": "expiration(uint64)", +"12179a2d": "pendingReferals(address)", +"1217b6ff": "TransactionConfirmedByMediator(uint256,uint256)", +"121839f6": "addConfirmationNode(string)", +"1218d6bf": "decree()", +"12192649": "countOfParticipants()", +"12192b00": "getInitialHP(uint64,uint64,uint64)", +"1219bcfc": "MolToken()", +"1219d5c8": "APM_APP_NAME()", +"121a47ac": "nonceForPublicKeyX(uint256)", +"121a496b": "Lupecoin(address,address)", +"121ab65b": "LogChangeSponseeAddress(address)", +"121af083": "DFSCrowdsale(uint256,uint256,uint256)", +"121b5a25": "calculateCompensation()", +"121b68c1": "ERC223Received(address,uint256)", +"121c2b35": "burnPXLRewardPXLx2(address,uint256,address,uint256,address,uint256)", +"121c5e91": "putOnSale(uint256,uint256,uint256)", +"121d6426": "senderWeiBalance()", +"121dbc31": "changeMax(uint256)", +"121e0d4e": "godPause()", +"121e6832": "frozenDaysForPartner()", +"121e8122": "unQuarantineAddress(address)", +"121eb9e2": "createMintRequest(address,uint256,string)", +"121ef243": "createUser(string,uint256)", +"121f0a10": "resolve(uint256,uint256,string,bool)", +"121f2081": "testCreateWithForeignParent()", +"121fb72f": "ownerSetInterestSetter(uint256,address)", +"1220c6ed": "registerOwner(address)", +"12217378": "oldTokenTotalSupply()", +"1221a071": "cmctcybermovie()", +"1222c25a": "redeem(string)", +"1222e789": "isPublicSaleWithBonus()", +"122366fd": "PACCOIN(uint256,string,string)", +"1223716a": "masterHas()", +"1223f208": "withdrawadm(address,uint256,uint256)", +"12243b67": "deletePlayer(address)", +"12247a57": "IncentCoffeeToken()", +"12253a6c": "stopContract()", +"12263017": "setBool82(bool,bool)", +"122636b1": "getRemainingDaysToThirdPhase()", +"12267abc": "PRICE_6()", +"1226afde": "numtickets()", +"1226be3e": "NotifyMe(address,address)", +"1226cd98": "allocate(uint128,uint256)", +"1226f5f8": "wei_per_token()", +"12278825": "Git(uint256)", +"1227d0f4": "gameListOf()", +"122809dc": "deposits_refunded()", +"12285576": "Donated()", +"12286715": "SimpleSavingsWallet(uint256)", +"12287629": "consultantsKey()", +"1229987d": "collectProfitERC20(address)", +"1229af09": "FreshROI(uint256,uint256)", +"122a1949": "Group_1()", +"122a7723": "GetPriceMultiple()", +"122b0e85": "getVerificationLevel()", +"122bdc32": "ThemKhoaHoc(string,uint256,string,string,string,string)", +"122d34d9": "returnToken(string,uint256)", +"122d9a8d": "piEndTime()", +"122e04a8": "WITHDRAW_ADDRESS()", +"122e74f4": "getWeiLeft()", +"122fe685": "presaleAddress()", +"122ff73a": "_getStrengthDexterityVitality(uint256,uint256,uint256)", +"12302932": "reinvestAffiliate()", +"123119cd": "payer()", +"12317402": "betMinAmount()", +"123180a2": "testInitialBalanceWithNew()", +"12333b32": "StartGame(uint256)", +"123398aa": "johnnycoin()", +"1233f543": "distribute55M(address[])", +"12342248": "CreditleetToken()", +"12360151": "dayPotLeader()", +"123702e2": "profitAddress()", +"123731c4": "addressPositions(address,uint256)", +"1237b2a6": "TotalPot()", +"1237dd9a": "decimalMul(uint256,uint256)", +"123802e1": "forceRefundState()", +"123807b2": "markParticipantIdentifiend(address)", +"123841cf": "MintedGreen(address,uint256)", +"12386471": "sumExpOffset(int256,int256[],uint256,uint8)", +"1239ec8c": "batchTransfer(address,address[],uint256[])", +"123b06d5": "currentPendingParticipants()", +"123b1dae": "accountOfP(address)", +"123b5e98": "setAttributeSigned(address,uint8,bytes32,bytes32,bytes32,bytes,uint256)", +"123ba3e2": "changePrizeSplits(uint256,uint256,uint256,uint256,uint256)", +"123c047a": "createShares(uint256)", +"123c3a4f": "maxTokenSupplyICO2()", +"123c3ada": "getMedalInfo(uint256)", +"123cc082": "setJoinedCrowdsales(address)", +"123d997a": "removeAllowCnsContract(address,bytes32,address,bytes32)", +"123e4112": "arrayToCrabPartData(uint256[])", +"123f513c": "testDeadChickenCnt()", +"12407f98": "toSaleWallet()", +"1240adc8": "stoppCrowdsale(uint256)", +"1240b381": "PermarektToken()", +"1240de76": "testUnexpiredBalance()", +"124135c9": "exit(bytes,bytes,uint256,bytes,bytes,uint256,bytes)", +"1241d7a7": "setEnableRecord(bool)", +"1241ee7d": "profit(uint256)", +"1242031a": "ZhaoGuCoin()", +"12424e3f": "approve()", +"124279a7": "activeSignersCount()", +"1242e96d": "updateMarketPhase()", +"12432fee": "canSendWebGifAmount()", +"124442be": "approveIncrease(address,uint256)", +"1244861e": "addTokenData(uint256,string,string)", +"1245c653": "currentDrop()", +"1245e347": "teamWalletAddress()", +"1245f45e": "getRunningAuctions()", +"12460fdd": "confirmCeilingRaise(bytes32)", +"12468cc5": "getWifiPwd(string)", +"12474435": "unfreezeAwardedTokens(address)", +"1247caf4": "ChangeFounderMulSigAddress(address,uint256)", +"1248b101": "claimDay(uint256)", +"12491ad9": "ReverseRemoved(string,address)", +"1249209e": "returnExcess(address)", +"12494160": "isHolder()", +"12495a5d": "ContributionWallet(address,uint256,address)", +"1249c58b": "mint()", +"1249d3b8": "isEcoAllocated3()", +"124abb0a": "_checkAndCallSafeTransfer(address,address,uint256,uint256,bytes)", +"124b0939": "afterCallBack()", +"124c27a9": "addPrize(uint16,address,uint256,uint256,uint256)", +"124c2dde": "executeBet(address,address,uint256)", +"124c32a1": "enter(bytes32,bytes8)", +"124cf830": "isSecondaryOperator(address)", +"124cfc8c": "beneficiaryOf(uint256)", +"124d3396": "releaseICO()", +"124eaee6": "Identity()", +"124f0b31": "rewardDecimalPercentByTime(uint256)", +"124f2418": "deleteBytes32Value(bytes32)", +"124fc7e0": "increaseSupply(uint256,address)", +"124ff29b": "getAyantDroitEconomique_Compte_5()", +"12504109": "getLast24hSendingValue(address)", +"12508ea4": "play(uint256,bool)", +"1250ca3d": "getUserPaybackRate()", +"12511c14": "transferEnable(bytes20)", +"12514bba": "transfer(uint256)", +"12529d22": "getRank10()", +"1252aadb": "EightBitToken()", +"1252cc33": "processTickets()", +"125385f2": "COLOR_GREEN()", +"1253b82f": "travelPrice()", +"1254e64d": "transferEthers(address,uint256)", +"1254f0dc": "startRate()", +"12555df2": "zasxzasxqaqq()", +"12568c24": "blanceOf(address)", +"125716d6": "getContractStatus(address)", +"12571a33": "migrateInternal(address)", +"12582c1a": "setAdminMode(bool)", +"12592381": "incomeAllocation()", +"12599d3f": "GlobalEnergyDigitalChain()", +"1259c00d": "stampIndextodissolved(uint256)", +"125b8f06": "isInNextGeneration()", +"125bfb66": "claimToken(address,address,uint256)", +"125d5d71": "startEpochTimestamp()", +"125e527e": "Ether()", +"125f67e7": "SunriseCoin()", +"126004b8": "deleteRole()", +"12600aa3": "concatStrings(string,string)", +"1260c19a": "showInterval()", +"12610b5b": "pendingEditionsOf(address)", +"1261795d": "withdrawGas()", +"126262a3": "init(address,address,address,address,address,address,address,address,address,address,address,address,address,address)", +"1262d6be": "fortnightsFromLast()", +"1262eb73": "queryPlayer(uint32)", +"12630012": "LEOToken()", +"12635cd8": "I_store_ETH_to_contract()", +"12635d26": "getTotalWeiContributed(uint16)", +"1264299a": "endPresaleTime()", +"126596e7": "ownerSetCallbackGasPrice(uint256)", +"12660306": "getLogos()", +"1266cae2": "setCrowdsale()", +"1266d5f9": "getWitnessesCount()", +"126702a0": "DOW_TUE()", +"12671fb4": "balanceAirDropToken(address,address)", +"12675713": "getTestekTokenIssuance(uint256,uint256)", +"1267961b": "ERC777BaseToken(string,string,uint256,address[])", +"12686aae": "transferLocked()", +"1268cb71": "XBPToken()", +"1269359a": "enableWallet(address)", +"126a04b5": "transferFromSGNToken(address,uint256)", +"126a710e": "dnsrr(bytes32)", +"126af4af": "tokensContractBalance()", +"126b12e7": "initICO()", +"126b6e17": "downX(uint256)", +"126b85e7": "addLevelQuest(address,uint256)", +"126c1232": "addPanelist(address,address)", +"126c13c8": "toldYouSo(bytes32)", +"126c27b5": "setETHAssets(address)", +"126d20f1": "getBestPromouter()", +"126d5b83": "getPoolAmounts()", +"126d9882": "updateLogoFee(uint256)", +"126eac43": "getContribution(address,address)", +"126f992c": "forceOff()", +"126fb2a3": "getCurrentRoundPrizePot()", +"126fbb3a": "removeFunds(uint256,uint256,uint256,uint256)", +"127043c3": "feesRate()", +"12706ccd": "NIGIZ()", +"12709b90": "SuddenDecayingTokenFunction()", +"1270a4d3": "setMinSale(uint256)", +"12711ae3": "wtech2()", +"127157c3": "activateDevice(address)", +"1271bd53": "upgradeContract(string,address)", +"1271f09a": "approve(address,uint256,address)", +"12724689": "addToTokenTransferDisallowedList(address)", +"1273f6e7": "BIGSELL()", +"12746e9f": "changeParam(uint256,uint256,uint256)", +"1274c3f3": "announcementHash()", +"127616f9": "releaseMultiWithStage(address[],address)", +"127714c7": "getBudget()", +"12778e8d": "addDistributionContract(address)", +"1277b0c9": "createBid(bytes32,uint256)", +"1277b4f1": "createCandy(string,uint256)", +"1277e24f": "payOneTimeFee()", +"127810bc": "getCompany()", +"12783f2f": "VESTING_TIMES()", +"12788f97": "B0xPresale(address,address,address)", +"1278cec4": "WinnerPaidEvent(address,string)", +"12795d7f": "putSaveData(string)", +"127a0dd9": "setJypcBonus(uint256)", +"127afec6": "MakerTransferredAsset(address,uint256)", +"127b0901": "delayAutorelease()", +"127b0efd": "gauntletRequirement(address,uint256,uint256)", +"127b4da5": "getAmountForCharger(uint256)", +"127c3d45": "getUserLibrary()", +"127cc6bf": "medalTotalSupply()", +"127cf0b9": "multiInvokeWith3Args(address,string,address[],address[],uint256[])", +"127dd730": "donationNum()", +"127e499c": "firstBonus()", +"127eca3f": "totalDividendPayments()", +"127ecfa9": "getMinReward(string)", +"127effb2": "operatorAddress()", +"127f0b3f": "roundCount()", +"127f1068": "pieceprice()", +"127f2d2c": "shutForDai(uint256)", +"127f3374": "calculateselfOdd()", +"127f902f": "addressFundReserve()", +"12800751": "determineWinner(uint256,uint256)", +"12806653": "setMaxContributionPhase2(uint256)", +"1280db73": "donate(address,string,string)", +"12810fd8": "Lesson_6(address,uint256)", +"1281311d": "buy(uint256,uint256,uint256,uint256)", +"1281619b": "SeeleTokenLock(address,address,address)", +"12818f0c": "withdrawNac(uint256)", +"12819817": "setXauForGasCurrator(address)", +"1281d056": "test_threeValidEqBool()", +"12821b5e": "sellingPrice()", +"1282467d": "checkTip(uint8)", +"12826f30": "isEthereumBased(address)", +"1282cc2a": "getNumContributionsDID(address,address)", +"1283c377": "FixedCapSampleCoin()", +"1283e328": "bonusOf(address)", +"128424a7": "sort(address[])", +"1284c8f5": "transferSafety()", +"1286d9e8": "setRowColors(uint16,uint8,uint256,uint256)", +"1286e393": "removePartOwner(address)", +"12874688": "setMinBid(uint256)", +"12883df0": "lcSold()", +"12889639": "settleFeePub(address,address,uint256,address,uint256)", +"1288c42a": "Prism()", +"12892b7f": "setblnpereth(uint256)", +"128952e4": "addElements(bytes32[])", +"128a0b2c": "approveFund(address,bytes)", +"128a1c74": "createUpdateRisk(bytes32,bytes32,uint256)", +"128a3765": "clearTransferInsToken(address)", +"128b265f": "addBridgeTokenFeeReceivers(uint256)", +"128b3bc0": "_withdrawFunds(address,uint256)", +"128bad8d": "MFL()", +"128bfcae": "startStake(uint256,uint256)", +"128c785f": "ICACOIN()", +"128cf7c5": "SEC_PER_ETHER()", +"128d7215": "addRequest(string)", +"128d9281": "checkTransferFunction(address,address,uint256)", +"128e0423": "getSenders()", +"128e1329": "offerHelpUsingBalance(address,address,uint256)", +"128e1af0": "withdrawFromPot(uint256)", +"128e3761": "firstTeamContributorId()", +"128e87e0": "tokensAfterCrowdsale()", +"128eb401": "expiredCrates(address)", +"128ef181": "ticketMag()", +"128f04e7": "importPresaleBalances(address[],uint256[])", +"128f060a": "perETH(address)", +"128f8e04": "admin_active_payable()", +"12901f26": "purchaseTokens(uint256,address,address,address,address,address)", +"12907e08": "lastBlock_f6Hash_uint256()", +"1290a2b4": "rightSharePriceRateOfIncrease()", +"1290aed9": "AcornPotSplit(uint256)", +"12919d90": "setMoneyManager(address)", +"1291ebdd": "getAllowedTokenAt(uint256)", +"1292de0b": "sendTokensTo(uint256,address)", +"129441cf": "_cMoney(uint256,uint256,uint256,uint256)", +"129484b6": "changeFeeRecipient(int256,int256,int256,int256,int256,int256)", +"1294d4db": "assignReferral(address,address)", +"12950877": "setOrCacheValidityBond(uint256)", +"12958f1c": "getUserName()", +"1296830d": "transferPreSigned(bytes,address,uint256,uint256,uint256)", +"1296aef3": "timeInvestInMinute()", +"1296d47d": "signedApproveHash(address,address,uint256,uint256,uint256)", +"1296ee62": "transferAndCall(address,uint256)", +"12973afd": "isNotDuplicateTreasure(bytes32)", +"12974218": "tokensRemainingForSale()", +"12975687": "mediaTokensDecimalUnits(address)", +"12987c98": "large()", +"129893dc": "ParameterizedToken(string,string,uint256,uint256)", +"129932d5": "_spto(uint256,uint256,uint256,uint256,address)", +"1299c8fe": "GetAccountIsFrozenByDateCount()", +"1299f11e": "updateNextWindowAdjustmentRatio(int256,bool)", +"129a1a37": "Dissolved(address,uint256)", +"129a5b99": "getPropertyStatus(bytes32,address)", +"129a75a7": "viewSecondBatchOfContractState()", +"129a8d25": "LogKYCConfirmation(address)", +"129a9e99": "enterEvent(uint256[12])", +"129b873b": "addVote(uint256,address)", +"129bc044": "unlockAccount(bytes32)", +"129caa18": "haltICO()", +"129cf7cb": "ForeignBridge(uint256,address[],uint256)", +"129ed395": "accountLock(address)", +"129f80fb": "rewardAirdropMany(address[],uint256[])", +"12a00b21": "calculate_base_mining_reward(uint256)", +"12a0421c": "safeWithdrawal2(address)", +"12a06c35": "NFF()", +"12a0b32c": "transferRestrictedStock(address,uint256,uint256)", +"12a0b3ba": "VOLOP(uint256,string,string)", +"12a12106": "setPayoutAmount()", +"12a15b91": "BlocktorialTestToken()", +"12a187f3": "toggleTransfer(bool)", +"12a1c2f2": "Mether()", +"12a203c3": "getFinalAnswerIfMatches(bytes32,bytes32,address,uint32,uint256)", +"12a2716d": "affirmations()", +"12a3234c": "unlockAdvertisement(uint256)", +"12a3bbaf": "_addHorse(bytes32)", +"12a3cda2": "TokenOMG(uint256)", +"12a3ff95": "endPrivatesale()", +"12a49007": "p_setInvestorFundPercent(uint256,uint256)", +"12a4b899": "claimPresaleTokens()", +"12a63964": "Releaseable(address,uint256)", +"12a71ee0": "setBiddingAuctionAddress(address,address)", +"12a77dbd": "getLockedToken(address,uint256)", +"12a7b914": "getBool()", +"12a837b4": "transfer(address,address,uint256,bytes)", +"12a8c1ed": "testAllocatesTokensInSale()", +"12a916f9": "getPlayerWallet()", +"12aa2c0d": "getMinBal()", +"12aa5360": "addAlpha(string,string,bytes32)", +"12aaac70": "getKey(bytes32)", +"12aaafa7": "amount_milestone()", +"12ab7242": "setupStackDepthLib(address)", +"12abbaaf": "WhosItGonnaBe()", +"12ac18ff": "About()", +"12ac4a2e": "bonuscal()", +"12ac5bad": "GetContractStateCancelledByTenant()", +"12ac9b46": "_escrow(address,uint256)", +"12ad8bfc": "registerSecret(bytes32)", +"12ad8d20": "CryptoElections()", +"12addb94": "saleEnd4()", +"12ade015": "oneTokenInFiatWei()", +"12aef8c3": "tokensForSale()", +"12afbc78": "getOwnedPointCount(address)", +"12afef2e": "Reservation(address,address,address,uint256,uint256,uint256,uint256)", +"12b0b3ca": "transferFromToICAPCallGas()", +"12b0b627": "splitStr(string,string)", +"12b0d309": "restrictTokenTransfer(address)", +"12b1cc95": "createHash(uint256)", +"12b1f8a9": "removeLand(address,uint256)", +"12b27e3e": "miningActive()", +"12b2ecc6": "init_bounty_program(address)", +"12b392ee": "admin_profit()", +"12b3a445": "getERC721Nfts(uint256,address)", +"12b48d3c": "CountryCoin()", +"12b495a8": "delta()", +"12b4ba71": "emitTokenStateUpdated(address)", +"12b58349": "getTotalBalance()", +"12b62a07": "playerWinHeroes(address)", +"12b68263": "creditDragon(address,uint256)", +"12b68286": "whitelistMinTok(uint256,address)", +"12b6ef5c": "Decision(uint256,address,address[],uint256[])", +"12b706a7": "buyPreSale(uint256)", +"12b8854b": "redeemNewTalentsAndPartnerships()", +"12b8ca5e": "_isDiamondOutside(string)", +"12b93ec6": "ChallengeContract(uint256,string,uint256,address,address)", +"12b97812": "addOffering(address,bytes32,address,uint256)", +"12bae48d": "StartDate()", +"12bb05ff": "claim1Ply(uint64,uint64,uint64,uint64,uint64)", +"12bb65ca": "MANHATTANPROXY7THAVE()", +"12bb6df7": "LogRewardPicked(uint256,address,uint256,uint256)", +"12bb9d3e": "RefundableCrowdsaleWithCommission(uint256,address)", +"12bc74e2": "withdrawBondReward(address)", +"12bcc858": "claimTokensInBulk(address[],uint256[])", +"12bd2cea": "setImageDataCloud(uint256,uint256,string)", +"12bdc81b": "freedWinPoolForThirdStage()", +"12bddc9c": "changeRules(bool,bool,bool,bool,bool)", +"12be78d1": "freeze_pool(bool)", +"12bea6eb": "kickStartICO(address,uint256,int256)", +"12bff72f": "doTransferOwnership(address)", +"12c0af96": "getVoterOnElection(address,address,uint256,address,address)", +"12c0d1ea": "changeLuck(uint32)", +"12c1083d": "distributing()", +"12c2302e": "DocumentRegistered(uint256,string)", +"12c24128": "FootStarCrowdsale()", +"12c27c64": "contrp3d()", +"12c3ee37": "setStorageControllerContractAddress(address,address)", +"12c3f754": "modificationFee()", +"12c3f757": "soldiersinfo(address)", +"12c45f64": "maximumTokenSupply()", +"12c55a9b": "openDeposit()", +"12c59488": "setAddress(address,address,address,address,address)", +"12c61a20": "initambassadorsbags()", +"12c6651c": "MoralityAI()", +"12c6ac16": "Reconcile(address,uint256,uint256)", +"12c723e1": "createDeposit(uint256,uint256,bytes)", +"12c77207": "getLLV_edit_1()", +"12c7df73": "rewardValue()", +"12c8052f": "won()", +"12c82894": "compute(string,string,uint256,uint256)", +"12c82bcc": "sendRobust(address,uint256)", +"12c85095": "getRestrictedTokens(uint8)", +"12c89869": "getHeroCurrentPrice(uint256)", +"12c96f5f": "ZAYAToken()", +"12c99005": "startPREICO()", +"12cacbb5": "inPresaleMode()", +"12cc08f2": "getPackageReleaseHashes(string,uint256,uint256)", +"12cc1abc": "set_exchange_rate_in_eth(uint256)", +"12cc9dd3": "usdId()", +"12ccb421": "payPlatformIncomingTransactionCommission(address)", +"12cd2101": "transfered(address,uint256,bytes32[])", +"12cd24be": "funder(address)", +"12cd57c9": "inputauction(uint256,address,uint256,string)", +"12cdc37a": "OrderTake(uint256)", +"12ce73dc": "callFor(address,uint256,bytes)", +"12cef27a": "secondWallet()", +"12cf0ec8": "balanceOfAt(address,uint256,int256)", +"12cf85c8": "s26(bytes1)", +"12cf8a10": "getType(uint32)", +"12d00c2e": "soloWithdraw(uint256)", +"12d0e65a": "changeBeneficiaryAddress(address)", +"12d1456f": "requiredExpIncreaseFactor()", +"12d1612a": "closeContest(string)", +"12d1b19a": "poissonData()", +"12d2c9a5": "isWhitelistedInvestor(address)", +"12d43a51": "gov()", +"12d60f86": "fillUpAllowance()", +"12d6468d": "mathTransfer(address[],uint256[])", +"12d67c5f": "getLastDataLength()", +"12d69389": "maxUint32()", +"12d6c704": "getTMul(uint256)", +"12d72e99": "deregisterProduct(uint256)", +"12d96887": "getRollUnder()", +"12da6e2b": "fourthTime()", +"12dc006a": "racer_index()", +"12dc34a0": "disableSetTransferable()", +"12dc5ca0": "CrowdsaleToken(address,string,string,uint8,uint256,bool)", +"12dc6449": "test_remove_head()", +"12dc8c4b": "InitialTokensAllocated(uint256)", +"12dc9a5b": "assert(bool,bytes)", +"12dcb676": "remainPackage()", +"12dd4763": "_transItem(address,address,uint256)", +"12dd8700": "CevacFund()", +"12dd9b94": "addBet(address,address)", +"12de10fd": "setMinimumFundingLimit(uint256)", +"12de8a12": "addReferenceParentWineryOperationByRegulator(string,string,uint256,string,string,int256)", +"12df172d": "setScale(uint256,uint256)", +"12df2f49": "serviceStation()", +"12df9b63": "AddContact(bytes32,address)", +"12e135a0": "setBuyCommission(uint256)", +"12e228fd": "investorAddress()", +"12e26673": "maxMSC()", +"12e36530": "addMerkleTreeRoot(bytes32,bytes)", +"12e382b4": "lockFunds(address,uint256)", +"12e43d92": "AVAILABLE_PRESALE_SUPPLY()", +"12e43da5": "kycConfirmer()", +"12e530aa": "Hacksig(uint256)", +"12e56faf": "activeTransfer()", +"12e57fdc": "MONEYTREETOKEN()", +"12e5b7fa": "GetOwnertName()", +"12e6414e": "getCampaignStartDateById(bytes32)", +"12e753e1": "modifyContact(address,string)", +"12e7b2ba": "vanilAddress()", +"12e8e2c3": "setPlatformFee(uint256)", +"12e8ebdf": "unpauseWithdrawal(address,address)", +"12e905b0": "selfAddress()", +"12e9d888": "removeSkillFromSale(uint256)", +"12e9db2d": "get_deposit_balance(address,uint256)", +"12ea0b0e": "INV()", +"12ea7d20": "BoSToken()", +"12ea965d": "icoStartBlock()", +"12eabe7e": "approuver(address,uint256)", +"12eacf4b": "fundInsurance()", +"12eba773": "isAdvisorsTokensFirstReleased()", +"12ebca9c": "get_admin_list()", +"12ecaa62": "freezeAccountOf(address)", +"12ef900b": "getMaxLoanAmountAllowedByLtd()", +"12ef934b": "nCryptClubShare(address,address,address,address)", +"12efe5ad": "minDonationInWei()", +"12effc32": "rejectTransfer(uint256)", +"12f05418": "campaignCanceled()", +"12f0f9df": "createBountyContract(address)", +"12f11ed3": "getDenyPremium(bytes32)", +"12f17735": "calculateEntryHash(address[],uint256[])", +"12f20e2a": "withdrawFundsToOwner(uint256)", +"12f26140": "setWhitelistContract(address)", +"12f2b838": "updateReservedWei()", +"12f31b5f": "firstTeamWithdrawal()", +"12f3d1e0": "discoverResources(uint256)", +"12f4cbd9": "Vote(uint8)", +"12f53950": "refunded()", +"12f58b43": "RATE_CHANGE_THRESHOLD()", +"12f62bd6": "updateProperties(uint256,bytes)", +"12f63d96": "lockedByUser(address,address)", +"12f6e641": "okamiMaxPurchase_()", +"12f7cf74": "approve(address,uint8,uint8)", +"12f7fb6f": "RocketCoins()", +"12f8ae31": "getRedeemEst(address,uint256)", +"12f8b3db": "createCrowdsale(uint256,uint256,uint256,uint256,address,address,address,address)", +"12f95b16": "GIC()", +"12fa6feb": "ended()", +"12fa769f": "paidAmount()", +"12fb5b67": "purchaseTokensInICO(uint256,address)", +"12fc41a1": "MyScheme()", +"12fc848e": "_randomLucyAddr()", +"12fca967": "contract6function2()", +"12fd67ba": "getValidations()", +"12fdf767": "FuseaNetwork()", +"12ff2ad9": "Consent(address,address)", +"12ff658f": "DmitryCoin()", +"12ffb59b": "checkIcoStatus()", +"12ffe4df": "_decreaseApprovalAllArgs(address,uint256,address)", +"130067ca": "updateCostContract(address)", +"1300a6d1": "timeLeft()", +"1300cc41": "freezeTransferToken()", +"13012a3b": "doMap(address,string)", +"13019a5e": "EtherTool()", +"1301b876": "EmbiggenToken(uint256,uint256,string,string,uint8)", +"1301c4aa": "CryptoniumCoin()", +"1301ee02": "transferringETC(address)", +"1302188c": "getLastDataHash()", +"13028f44": "addUserRewardPayouts(address,address,uint256)", +"1302d03a": "setWhitelist(address,uint256)", +"130346d2": "icostart()", +"13037d22": "xioniCoin()", +"1303a484": "commitment()", +"13040bc1": "tokensFinalized()", +"13045155": "MONTHLY_INTERNAL_VAULT_CAP()", +"130497ac": "getCountryList()", +"1305413e": "BetMade()", +"1305d2de": "changeAllCosigners2(uint256,address[],bytes,bytes,bytes,bytes)", +"13063180": "doEscape(uint32)", +"13065fed": "MoneroClassic()", +"130766c5": "enterLarge()", +"1307d2d7": "EARLY_CONTRIBUTOR_STAKE()", +"1308c324": "setAddrForPrivilege(address)", +"1308d2c2": "gauntletRemovable(address)", +"1308e82d": "L19_PALToken()", +"1308e9e0": "startSweepStake()", +"130985f4": "GetcrowdsaleContract()", +"1309a563": "IsPaused()", +"1309d3bd": "RAVI_ALLOCATION()", +"130a39b1": "removePersonalTokenLock(address)", +"130bcaa2": "removePersonalLockMultiple(address[])", +"130c0e88": "advisoryVUPDestination()", +"130d04d0": "companyHolding2y()", +"130d7906": "register(uint32)", +"130d993d": "lifeFactor_iii()", +"130e54a1": "prizeshow(address)", +"130fbba4": "setPixelToken(uint24,uint256,uint24)", +"13110199": "twentyEndTime()", +"13110874": "preSaleFirstEtherCap()", +"1311457c": "transferToken(address[],address,address,uint256)", +"13114a9d": "totalFees()", +"1311b45e": "setGasForCMT(uint256)", +"1311c860": "KCoin()", +"131284c8": "FUNDING_START_TIMESTAMP()", +"13137731": "testThrowsUpdateLatestRevisionNotUpdatable()", +"1313c739": "getBidForAuctionByIdx(uint256,uint256)", +"1313f631": "Register(bytes4,bytes32,bytes32[8])", +"1314e272": "addAddressesToOperators(address[])", +"13151981": "to()", +"13155455": "legacyToken()", +"13163d53": "CTO_Signature()", +"13169ab7": "rewardManual(address,uint256)", +"131719e1": "testtop()", +"13174093": "bountyAccount()", +"13175b40": "_emitUserCreated(address,address,address,address,uint8[],uint256,uint256[],uint256[])", +"13178704": "ContributeToPool()", +"1317b559": "buyshares()", +"1318b88c": "GetPlayer_FromID(uint32,uint8)", +"1318cd2d": "NameInt()", +"13193936": "GEMERAToken(address[50])", +"13194658": "MossCoin(uint256)", +"1319b880": "borrowToken(uint256,uint256,address,address,bool)", +"131a0680": "store(string)", +"131ad118": "avaliableBets()", +"131ad146": "getWorksStatus(bytes32)", +"131b0563": "EITARD()", +"131b81ad": "transferExecutorOwnership(address)", +"131b9c04": "getEarnings(address)", +"131bb0d6": "ethCostTotal()", +"131be36c": "preICOregulations()", +"131c4305": "SoundcoinsAddress()", +"131d2873": "isContractFrozen()", +"131de517": "getKeyBlockNr(uint256)", +"131e03ba": "withdrawOtherEDEX(address)", +"131e1816": "setRetiro(address)", +"131fa183": "createBoard(address)", +"132002fc": "votingDuration()", +"1320f614": "callServer(string,uint256)", +"1320f838": "modify_ICOStartDate(uint256)", +"1321d291": "enact_liquidation_greater_equal(address,uint256,uint256)", +"1321ea19": "mulTransfer(uint256,address[])", +"13220305": "doTransferOther(address,address,address,uint256)", +"13222d0a": "payoutsETH(address)", +"1322311b": "LoanBit()", +"13224fc5": "missingTokensFallback()", +"1322e9d0": "checkPayoutReadyState()", +"13233cd9": "appointAgent(address)", +"13242733": "getRoundOfSixteenTeams(uint256)", +"1325c502": "debugSetNow(uint256)", +"13270bb8": "authorizedCount()", +"1327290d": "isAddressActivated(address)", +"1327487f": "activation(uint256,address)", +"1327d383": "hybridizations(uint256)", +"1327d3d8": "setValidator(address)", +"1327fbe5": "getPanda(uint256)", +"1328ec9b": "getAvatar(uint256)", +"1328fd8f": "getDetails(string)", +"13299604": "getWallet()", +"132ac1dd": "itemsForSaleCount()", +"132ae5e9": "numInvestors()", +"132c3bea": "setContractPrice(uint256)", +"132c8641": "given()", +"132d05e5": "_distributeJackpot()", +"132d807e": "upgradeTo(address,address)", +"132df661": "isPrePreSale()", +"132e4f3c": "fail(uint256)", +"132e63ba": "PRICE_8()", +"132e8bee": "batchWithdraw(uint16[])", +"132ff514": "SQUAD_SIZE()", +"133086a5": "SphereTokenFactory()", +"1330a21f": "calulateRate()", +"1332143c": "getGoldTransactionsCount(string)", +"133252a6": "grantToken(uint256,address)", +"13326f43": "transferTokenToSender(address,uint256)", +"1332dd07": "_isFreezeList()", +"13331391": "buyPreIco()", +"133323c8": "setLevToken(address)", +"13332c6c": "myVoteFactory()", +"133369c6": "GetRigData(uint256)", +"1334a5e2": "eventCallback(uint8,address,address,uint256)", +"13352334": "payOwners()", +"1335461c": "joinGameWithBalance(uint256,address)", +"13357914": "from(uint256)", +"1335b56b": "GasSell()", +"1335b598": "get_ptc_count(address)", +"1335ff36": "createEventAndMarketMaker(uint256,uint256,uint8,uint32,address,uint256,uint8,uint16,uint256)", +"13368364": "getMarketPriceOracle(uint256)", +"1336a756": "previousPeriodRate()", +"1336cff6": "isAccountFreeze(address)", +"13373786": "powerBalanceOf(address)", +"1337d6ed": "sendFlower(address,bytes32,string,bytes16,uint256)", +"13381fbf": "registrantsPaid(address)", +"1338736f": "lock(uint256,uint256)", +"1338c9e9": "SspStandardToken(uint256,string,uint8,string)", +"1338f493": "isClose()", +"13390cf2": "VASTToken(uint256,string,string)", +"133922ad": "setCompanyURI(string)", +"13392662": "totalTokensOfThisContract()", +"1339305f": "createRandomZombie_FreeZombie()", +"1339870e": "GetOrderBookScreen(address,uint256)", +"13399d10": "INCRYPT(uint256,string,string)", +"1339cba2": "getRemainingDaysToSecondPhase()", +"133a473e": "sleep()", +"133ae30b": "transferFunds(uint256)", +"133af8b3": "getIcoTokenHoldersAddressesCount()", +"133b5ba9": "honestisFort()", +"133c5ff5": "getAdminAccounts()", +"133cbe3a": "setLatestToNow(address)", +"133d10e6": "HPCToken()", +"133d27e1": "partner1_address()", +"133d2afe": "myfast(address,uint256)", +"133d5d4e": "setMultisignWallet(address)", +"133d8555": "withdrawTokenFromElc(address,uint256)", +"133e3f71": "getOld_BalanceOfr(address)", +"133f44dc": "removeVerifiedInvestor(address)", +"133f50f5": "checkUserExists(address)", +"133f6ac0": "earlyExchangeRate()", +"133f8a2f": "getStockReleaseTime(address,uint256)", +"133fe629": "calculateCuts(uint256,uint256)", +"134000c0": "getGrid()", +"134087a2": "gameLogic()", +"1340d09a": "isPoint(uint256,uint256)", +"13413858": "isFreelancerAvailable(address,address)", +"13414a4e": "doDisputeMemoryWrite(uint256,bytes32,uint256)", +"13419be3": "LifeFactor_v()", +"1341b33c": "releasableViewOrSend(address,bool)", +"13424bf0": "unpause_4()", +"13426d87": "addEmitter(bytes4,address)", +"13429e31": "newPrice(uint256,uint256)", +"1342c0e8": "VZT_WALLET()", +"1343a35f": "sendLoan(address,uint256)", +"1343ed05": "isStoreSet(string)", +"134538f3": "testRemoveGains()", +"134562a6": "SimpleToken(uint256)", +"13463751": "ThroneClaimedEvent(uint256)", +"13468929": "signedApproveCheck(address,address,address,uint256,uint256,uint256,bytes,address)", +"1346c20e": "canBuy(address,uint256)", +"134741f7": "SimpleERC20Token(uint256)", +"1347b972": "setICOWeek2Bonus(uint256)", +"1347b9ae": "CommonToken(address)", +"1348ab3a": "setRequiredTotal(uint256)", +"1348fdcc": "changeStarttime(uint256)", +"1349c273": "ClearExpiredFreezingEvent(address)", +"1349f5ec": "_provideChars(address,address,uint32)", +"134a04ea": "breedingDB()", +"134a153a": "buyVirtTokens(address)", +"134a5330": "updateTokenPrice(int128)", +"134abf66": "sendVesting(uint256)", +"134b684f": "SafeGiftTokens(uint256,string,string)", +"134c021b": "divForTransfer()", +"134c1a28": "L2Cash(address,address)", +"134c91be": "setFile(string,string,uint256,string,string)", +"134ccdfb": "IBIZACASH()", +"134dc5ad": "setManagerAddress(address,address)", +"134e3917": "setM2(address)", +"134f1893": "goWiner()", +"134fd7d0": "_convertToWei(uint256)", +"134ff97e": "startGame(uint32,bytes32)", +"1350a997": "AccessGrant(address)", +"1350acbd": "PRESALE_MAX_ETH()", +"135128c2": "CounterPartyDeposit()", +"13517fea": "maxCost()", +"1351cf51": "setAuthorizedAddress(address,bool)", +"135217e7": "requires_depth()", +"1352faec": "setReleaseDate(uint256)", +"1353e7b3": "purchaseMetal(uint256,uint256)", +"1356c5dd": "raceBet(uint8)", +"13574cd2": "calculateKnowledgeBuy(uint256,uint256)", +"1357b862": "contractSolidStamp()", +"1357e1dc": "totalPaidOut()", +"13582b6e": "HIDDEN_CAP()", +"135859c0": "distributeICOTokens(address,uint256)", +"135892bf": "FundUpdated(address)", +"1358937f": "TEAM_HOLDER()", +"13590153": "ManualChangeEndDate(uint256,uint256)", +"1359844a": "winNetworkFeeBasisPoints()", +"13598b71": "LightningEthereum()", +"1359cb2c": "getCommissionWithdrawn(uint32)", +"1359fc91": "setPublicKey(bytes32,bytes32,bytes32,bytes32)", +"135a2474": "joysoWallet()", +"135bada6": "setDungeonStatus(uint256,uint256)", +"135bf431": "gamerun()", +"135c0701": "purgeAccount(address)", +"135da3c2": "getBal(bytes32,address)", +"135da767": "LennartCoin()", +"135e9ad6": "fulFillTX(uint256)", +"135ec4bd": "AddAppraise(address,string)", +"135ed7bd": "priceRound1()", +"135f01df": "addDocument(bytes16,bytes32,uint8,bytes32,bytes32)", +"135fae64": "getOwnerProprietaryData(uint256)", +"135fc676": "loseHandler(address,uint8)", +"13601234": "checkRejectionRatio()", +"136047ab": "ticketTransferers(address,uint256)", +"13612119": "distribToken(address)", +"136125a7": "GoldFiatFee(string)", +"13618756": "readnationnameXteam()", +"1362180e": "setItemName(uint256,bytes32)", +"13622274": "prealocateCoins()", +"1362dd32": "testinx()", +"1364326c": "countVotes(uint256,uint256)", +"13643605": "crowdsaleTarget()", +"136439dd": "pause(uint256)", +"13651124": "WithdrawAmountFromBankAccount(uint256)", +"136512c9": "_checkPixelRight(uint256)", +"13653b24": "RECFToken(uint256)", +"1365e6a3": "REBELCOINSupply()", +"1366b970": "test_transfer_token_to_contract()", +"1367641e": "releaseAdvisorTokens()", +"1367944b": "getIdByName(string)", +"13683532": "getAccountCap(uint256)", +"1369f6fd": "getCurrentOwnerBallence()", +"136aa762": "Remmittance(uint256,uint256)", +"136ac4bf": "WillTestament()", +"136af582": "next(bytes,bytes,bytes,bytes,bytes,bytes,bytes)", +"136b4fea": "getActiveFish(uint256,uint256)", +"136bcbab": "Windlord()", +"136c545c": "transferToProjectWallet()", +"136c8744": "WBSToken()", +"136cf5c1": "deleteVestingFromStorage(address)", +"136d1057": "accountBalanceCount()", +"136d5a59": "giveKudos(bytes32,uint256)", +"136d6a39": "getBalanceByAddress(address)", +"136dbbab": "revenueFraction()", +"136e1949": "buyFunderSmartToken(string,string)", +"136e1c45": "suspendGame()", +"136ede68": "verifyCopieExecutoire(bytes32)", +"136ef18a": "allowTransfers(address[])", +"136f1016": "hasBet(address)", +"136f2bf4": "allowToken(address[])", +"136f5b5a": "ordersCanMatch_(address[14],uint256[14],uint8[6],bytes,bytes,bytes,bytes,bytes,bytes)", +"136fa2d7": "rateSeedStage()", +"1370128e": "free()", +"13711a31": "presale_allocation()", +"13714545": "GATEL()", +"137157c0": "changeBlock(bool)", +"1371dab9": "whitelisters(address)", +"13730838": "getCanvasPainters(uint32)", +"13734a9f": "setClaimDividendPercentage(uint256)", +"13737db2": "TiValueToken()", +"13740cf3": "isTrigger()", +"13748a40": "Withdraw_2()", +"1374b22d": "proposalExists(uint256)", +"1374eb6f": "getLockByIndex(address,uint256)", +"1375111e": "returnrandom()", +"13754f9a": "notUpgradableInStore()", +"13765838": "deposit(uint64)", +"13767204": "AirDropRedeemAFTK()", +"1376f2ce": "setCrowdsaleStartDate(uint32)", +"137759df": "ammendReceivedLand(uint256,uint256)", +"13776ba1": "buyPLATCards(address,uint256,uint256,uint256)", +"1377900b": "PreICODayOneCents()", +"1377ae65": "_getEarnings(address,address,uint256,uint256,uint256)", +"13788651": "test_oneValidEqBytesNoLog()", +"137935d5": "totalGuaranteedCollected()", +"1379c6e0": "getICOEndDate()", +"137a1464": "ifEmergencyStop()", +"137a3fa7": "transferPayment(uint256,address)", +"137b3bcd": "getBounsByAmount(uint256,uint256)", +"137b763d": "SetReferrer(address,address)", +"137b8721": "getTierWhitelist(address,bytes32,uint256)", +"137baa2a": "BigToken()", +"137c1feb": "buyCommonTTMByETH(uint256,address)", +"137c638b": "getExtraGas()", +"137ce088": "TokenReserveMinted(uint256)", +"137ce8e3": "HARD_CAP_USD()", +"137d7026": "abiEncode(bytes,bytes,address[])", +"137db23c": "updateWhitelist(address,address,bool)", +"137e37d9": "accountGet(address)", +"13801995": "getHopefulId(address)", +"13819313": "OTTToken()", +"1381e400": "cancel(uint32)", +"13823365": "setOneTokenInWei(uint256)", +"13827950": "getShareholderDB()", +"1382a652": "isTrustedShop(address)", +"1382e75e": "addUser(uint256,string,string,uint256)", +"13831693": "getLevitatingUnicorns(bytes32,uint64)", +"13844e60": "totalOVCSold()", +"13845d2f": "creation()", +"138495de": "SimpleToken(string,string,uint256,uint256)", +"1384dc12": "endTx(uint256,uint256,uint256)", +"1385053e": "FlyCareTokenSale(address,uint256,uint256,uint256,uint256,uint256,uint256,address,uint64[5])", +"1385625d": "MintTimelocked(address,uint256)", +"13857c1a": "foundersFundMultiplier()", +"13859f46": "_metadata(uint256)", +"1385d24c": "toggleContractActive()", +"138665ff": "testJoin()", +"13869333": "RealityCheck()", +"1386a244": "getSettingAddress(string)", +"1386dc2d": "orgName()", +"138716e8": "root_domain()", +"13872f8d": "test_againstFor()", +"13877deb": "FBLFund()", +"1387c80b": "test_invalidRuleChange()", +"1388483d": "BLING()", +"13887592": "multilocked()", +"13888565": "surplus()", +"13889727": "setHeroName(uint16,string)", +"138a7084": "_4_owner()", +"138a886e": "testGetTransactionDetails(bytes)", +"138acb80": "View_MediatedTransaction_Info(uint256)", +"138b3ab1": "numPlots()", +"138b806c": "addMultipleAddresseseToWhitelist(address[])", +"138bdf1b": "simpleTest(address)", +"138cc941": "testErrorTransferToRejectAuthority()", +"138e2317": "IcoTokenMock(address)", +"138e8da1": "getIncreaseAllowancePreSignedHash(address,address,uint256,uint256,uint256)", +"138efd00": "_createTot(string,address,uint256)", +"139020d1": "deedByIndex(uint256)", +"13902e9f": "initBonusPeriod(uint256,uint256,uint256,uint256)", +"13905905": "addWhiteListedAddressesInBatch(address[])", +"13907d22": "abrirDoacoes()", +"1390b247": "getNbSellOrder()", +"1390df6c": "oldXPAAssets()", +"1391697d": "weiRound1()", +"13916c2e": "bidOnCraftAuction(uint256,uint256)", +"1391c5f8": "EnddateICO()", +"1391fd60": "raised(address)", +"1391ff43": "fetchVoteInfoForVoter(address)", +"1392c495": "updateItemPrice(bytes32,uint256)", +"13930cf6": "setCurrentVersion(string)", +"13932337": "highTimeBonusLimit()", +"13943033": "RBOC()", +"1394f216": "addProjectManager(address)", +"139654e0": "window2StartTime()", +"13966db5": "mintFee()", +"1397d7ae": "setPI_edit_24(string)", +"1397fdbd": "getShares(address,bytes,int256[])", +"139818a1": "setFrozen(address,uint256)", +"1398bbf7": "getRanking()", +"1398e076": "lotteries(uint256)", +"139949fa": "sAssert(bool)", +"1399cc5b": "UWC()", +"139a667a": "_calcNextPrice(uint256)", +"139b3752": "_batch1_rate()", +"139c7048": "generateTokenAmount(uint256)", +"139ccd1e": "stopCollectSignatures()", +"139cd9d3": "drawnTokens(address,uint256,uint256)", +"139ddefe": "ProposeProposal(bytes32,bytes32,uint256,uint256,uint256)", +"139df200": "getAllMarketsInfo()", +"139e23b5": "getDividendInfo()", +"139f1838": "NoBonustimer()", +"13a070b7": "add_admin(address)", +"13a0c990": "BearTrap()", +"13a110b4": "getMin(uint64[])", +"13a19e1b": "initialCoach(uint256,uint256,uint8,uint256)", +"13a1da40": "tgrSettingsMinimalContribution()", +"13a22af9": "latest_buy_time()", +"13a24744": "BurnupGameAccessControl()", +"13a2852d": "setICOEndTime(uint256)", +"13a30010": "refund2(address)", +"13a396d8": "getRequiredDeposit(bytes)", +"13a3d9a1": "registerDocument(string,string,string)", +"13a460b7": "tourisToken()", +"13a46425": "getNumberOfDisputedStepsProDoctor()", +"13a46827": "fund(address,address,uint256,uint256,uint256)", +"13a4b3bc": "OwnershipRequested(address,address)", +"13a4fd37": "soldTokensIco()", +"13a517bf": "eighthTeamWithdrawal()", +"13a5aac7": "paymentRegularTokensPriority(uint256,uint256)", +"13a5d9e4": "remaingNTRY()", +"13a666a6": "hasReachedSoftCap()", +"13a7070f": "withdrawDeveloperCut()", +"13a7f56e": "internalAllocate(address,uint256)", +"13a8a080": "TokenDemo(uint256,address,address,address,address)", +"13a91cc8": "getVlsTokenAddress()", +"13a927c7": "toggleMatchStartEnd(uint256,uint256)", +"13a92f02": "frozenAccountForLogic(address)", +"13a931dc": "gasForOraclizedQuery()", +"13a9589c": "getSalt()", +"13a9cd8d": "lastDETCWC()", +"13aa48bf": "minePepe(uint256,address)", +"13aa7b6f": "viewUnclaimedDepositDividends()", +"13aa8133": "resolveChallenge(uint256,bytes32)", +"13abdd75": "ecosystemSupply()", +"13ac2bdb": "addNetworkMember(address,bool,bool,bool,bytes32)", +"13ac58bb": "increaseCredits(string,uint256,uint8,address)", +"13acb45b": "calcDoubleBindedBlindHash3(string,address,address)", +"13ad41d8": "getSkill(uint32)", +"13ad9ce1": "getRepMarketCapInAttoeth()", +"13adc129": "MIGG()", +"13ae4522": "token3MstepCAP()", +"13ae457d": "mainCapInUSD()", +"13af4035": "setOwner(address)", +"13afa97a": "readMarketplaceConfigs()", +"13b15b24": "setRoundGap(uint256)", +"13b18640": "participate(uint256,address)", +"13b222ba": "getMyPoohs()", +"13b2663b": "cash_received(string)", +"13b2807e": "setCampaignEndPointById(bytes32,string,int256)", +"13b2e657": "unfreezeAccount(uint256)", +"13b37a83": "getRandomUuid()", +"13b39b9c": "approveMint(address,uint256)", +"13b3cd91": "collectForREQBurning(uint256)", +"13b3cdf6": "ownersLUT(uint256)", +"13b3fffc": "updateChannelManagerContract(address,string)", +"13b4312f": "transferCollectedFees(string,address,uint256,bytes)", +"13b499ce": "PRE_ICO_TIER_FIRST()", +"13b53153": "isFunding()", +"13b57686": "self_last_result()", +"13b5a19e": "GBPsToken()", +"13b5d420": "returnWebsiteData()", +"13b63f60": "updateBuildingPrivacy(uint256,bool)", +"13b6c8a8": "setListingFeeInWei(uint256)", +"13b6f213": "ContributionReceived(address,uint256,uint256,uint256)", +"13b7423a": "setFundraiserCallData(string)", +"13b796f4": "getMilestoneTimeAndRate(uint256)", +"13b84004": "gameTokenAmount(address)", +"13b96a9e": "numOfSamples()", +"13ba350a": "Whales_group()", +"13bac8f2": "updateStorage(string,string)", +"13baf1e6": "removeToken(address,uint256)", +"13bb7b0d": "PreICO(address,uint256,address)", +"13bbae9b": "addProxyManager(address)", +"13bc33ca": "CryptonHotels()", +"13bc4bda": "operatorSendTo(address,address,uint256,bytes,bytes)", +"13bd05e4": "silo_addr()", +"13bd4e2c": "_prepareAndSendReward()", +"13bd53e6": "applySettings(uint8,uint256,uint256,uint256,uint256)", +"13bd9e3c": "fundFoundation()", +"13bdbb19": "getCustomer(address,address)", +"13bdfacd": "print()", +"13be31ae": "preSaleDeposit()", +"13bfabf0": "isCurrentOrPastAccountReader(address)", +"13bfcd2c": "growthContract()", +"13c03159": "payPlayers(uint256,uint256)", +"13c04769": "submitBallot(bytes32,bytes32)", +"13c10e44": "attackerExpAdjustment()", +"13c13d6b": "updateMarketContract(address)", +"13c1629c": "_getBlockIndexAtYear(uint256,uint256,uint256)", +"13c1e906": "RentaCoin()", +"13c25ba6": "subtr(uint256,uint256)", +"13c2beff": "processWithdrawalForAccount(address)", +"13c32148": "_computeFee(uint256)", +"13c3922f": "Aborted(address)", +"13c42ca1": "getPrice(bytes1)", +"13c4f953": "getTime(address,address)", +"13c52111": "amountOfTokens()", +"13c58cbb": "countNoClients()", +"13c667d1": "calculateAmountBoughtICO(uint256,uint256)", +"13c68344": "Verto()", +"13c709d4": "transferToGame(address,address)", +"13c7db1a": "limitOfBranch()", +"13c82b0b": "setIsForkingMarketFinalized(bool)", +"13c89a8f": "getAllowedTime(bytes32)", +"13c8a376": "recovered(uint256)", +"13c8e60d": "getCurrentDebt(uint256)", +"13c9134b": "setcoinfee(uint256)", +"13ca1464": "getDHandRank(uint32)", +"13ca18ac": "WatermelonBlockToken(address,address,address)", +"13ca43a0": "teamWallet1()", +"13cc22ea": "createController(address)", +"13ccca96": "limitbreak_RELEASE()", +"13cceb21": "getHolderWithdrawIndex()", +"13cd528a": "miadd(uint64,uint64)", +"13ce15a9": "left67(uint256)", +"13ce401b": "getPlayerRecommond(address)", +"13ceb89b": "getCopaMarketAddress()", +"13cfed7f": "deposits_until_jackpot()", +"13d033c0": "cliff()", +"13d073d0": "Sign(uint256,address,uint256,uint8,uint256,string)", +"13d19950": "stringsEqual(string,string)", +"13d1aa2e": "f(uint256,uint256)", +"13d1bdfb": "priceForMateAdvertisement()", +"13d40e71": "RefundableCrowdsaleImpl(uint256,uint256,uint256,address,uint256)", +"13d4bc24": "buyTokenProxy(address)", +"13d4c63a": "_purchaseWhaleCard()", +"13d53ca9": "check(bytes32,uint256,uint256,uint256)", +"13d5469d": "periodICOStage7()", +"13d557bc": "operatorRedeemByPartition(bytes32,address,uint256,bytes,bytes)", +"13d567ca": "isApprovedTAAddress(address)", +"13d59ca9": "upgradeAddr()", +"13d5d4fe": "test_insert_findWithHintNextRemoved()", +"13d5ee74": "accPartner()", +"13d5f1fe": "durationOfStatusSell()", +"13d65cd9": "test_34_assertGasUsage700Boards()", +"13d73a08": "AMOUNTWAGERED()", +"13d769de": "auctionCreated(uint256,uint256,uint256)", +"13d8867c": "mint(string,uint256,string,uint8,string)", +"13d8c840": "tail()", +"13d9028b": "Remain_burn(uint256)", +"13dc01bb": "BKBK()", +"13dce04f": "updateRoutingPreference(string,string)", +"13dcfa08": "AmountClaimed(address,uint256)", +"13ddb69a": "CROWDSALE_START()", +"13ddd3ae": "getTokePerWei()", +"13ddecd5": "withdrawICOReserve()", +"13de214e": "minimalSuccessUSDWEI()", +"13debf7c": "_getPersonalAirdropAmount(address,address)", +"13defbd9": "getMyCrabs()", +"13df20fd": "createTimeBasedVesting(address,uint256)", +"13df35d1": "publicTGEStartBlockTimeStamp()", +"13df7091": "mintAll(int256)", +"13e003dd": "ASStoken(string,string,uint8,uint256,uint256)", +"13e0e70d": "ownerRegistry(address)", +"13e1d1d2": "multiCancelVoteForCandidate(address[],uint256[])", +"13e1f2b0": "DATToken(address)", +"13e26d58": "minRequired()", +"13e28415": "ownerSetMarginRatio()", +"13e2cae1": "revealBid(bytes32,address,uint256,address,bytes32,bytes32,uint256,uint256)", +"13e2dfc1": "depositDividend(uint256)", +"13e3151b": "MyEPPToken()", +"13e33fb6": "calculateBonus(uint96)", +"13e41971": "setup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"13e468b3": "getVotingToChangeProxy()", +"13e4b51f": "putHash()", +"13e50ca4": "totalFiatValue()", +"13e5a3b1": "SetUp(uint256,address)", +"13e5d8b6": "icoStartsAt()", +"13e5e26e": "recirculateLateFees(uint256)", +"13e60074": "OwnerRetireHodl(uint256)", +"13e7323e": "fundingEnd()", +"13e75206": "getParentOf(uint256)", +"13e7a234": "getAccessor(bytes32,uint256)", +"13e7d076": "STERNIUMHUGEELLIGENCECOIN()", +"13e81119": "purchaseTicketsWithReferral(uint256[],uint256)", +"13e8360d": "commissionerAuctionComplete(uint32,uint128)", +"13e8e5d2": "address2a()", +"13e8e74b": "IexecHub()", +"13e8fdea": "TxExecuted(uint32)", +"13ecfbfa": "lastBuyer()", +"13ed0846": "calculateReward(uint256,uint256)", +"13ed5f31": "getTransactionConfirmerInfo(uint256,address,address)", +"13ee4bc5": "pay(bytes32,address[],uint256[])", +"13f06abc": "balanceFrozenTokens(address)", +"13f07317": "enableStaticLogic(address)", +"13f0790c": "tokensSoldWithBonus()", +"13f07f6f": "Object()", +"13f0ec1f": "withdrawDekla(uint256,bytes)", +"13f20d76": "fundDigitalMarket()", +"13f233c2": "ethReceiveMainSale()", +"13f25eb6": "NinjaToken(address,address)", +"13f29768": "addUnsoldAllocationOrder(bytes32)", +"13f4318e": "SetSubscriptionTo(address,int256)", +"13f44d10": "isAddressWhitelisted(address)", +"13f46d3e": "SponBToken(address,uint256)", +"13f47f24": "lockedDelegatingTokens(address)", +"13f4b42c": "pixelsPerCell()", +"13f4c7a5": "INVESTOR_LOCK_DURATION()", +"13f4e977": "minimumFundingGoal()", +"13f52533": "capitalLedger()", +"13f56f73": "changeMinInvestment(uint256)", +"13f5ef00": "Main(string,bytes)", +"13f652fe": "getText(string)", +"13f6ee53": "cliffAdvisorsTokens()", +"13f73570": "manualyAddReferralPayer(address,address,uint256)", +"13f94a43": "getSiteTokenIds(uint256)", +"13f9cf76": "disableBundlingMultitoken(uint256)", +"13fa095f": "setDestinationWallet(address)", +"13fac256": "xem()", +"13faede6": "cost()", +"13fb2324": "EndEvent()", +"13fc5ace": "depositForMySelf(uint256)", +"13fc6ac2": "getEventData(bytes32)", +"13fcaf54": "getDepositCount(address)", +"13fdcbec": "developer_Coin_Character(string)", +"13fdd2b4": "TilexSupply()", +"13fe2de0": "releaseLockedFund(address,uint256)", +"13ff962a": "privatesaleSupply()", +"13ffdbfc": "gameCountOf(address)", +"13fff718": "doBet()", +"14001f4c": "setSiringAuctionAddress(address)", +"14004ef3": "multimint(address[],uint256[])", +"14007c6d": "nextState()", +"1400d1e4": "checkName(string)", +"14012549": "isMainSaleTime()", +"14025dcd": "cancelFee()", +"14029756": "setaddress(address)", +"1402c310": "NEWSOKUCOIN()", +"1402f031": "triggerAttackManually(uint32)", +"1402f80d": "selectTemplate(uint8)", +"1403041b": "PegasusToken()", +"14036f62": "Vboom()", +"1403835f": "_isExpired(uint256)", +"140420a9": "isRateValid(uint256)", +"140529c2": "YCoin()", +"140575af": "LogTokenPriceChange(uint256,string)", +"140604cc": "getInitialState(uint256)", +"14061862": "setIcoMin(uint256)", +"14069b12": "MXMPDMToken()", +"1406b921": "vent()", +"1406d3be": "lowestGameWithoutQuorum()", +"14074135": "dividendsRightsOf(address)", +"140758a9": "disableServiceProvider(address,bytes)", +"1408073e": "GangnamToken()", +"14081570": "addEpisode(string,uint256)", +"14081e39": "setEscrowFee(uint256)", +"14082cd2": "findProductById(uint256)", +"1409b88f": "getManualByAddress(address)", +"140a681a": "_getVersion()", +"140a7ac6": "getFinalScore(int256[])", +"140ad293": "spitnetwork()", +"140aee46": "_0xDogecoinToken()", +"140b1706": "maxHLPMTMarkup()", +"140b2cdd": "calculateMyRewardDecreased(uint256,uint256)", +"140b4465": "executeSpendingRequests()", +"140cc562": "isCollectSignatureCorrect(address,address,uint256,bytes32,bytes32,uint8)", +"140cd7af": "issueToken(address,address,uint256,uint256,uint256)", +"140d3e95": "changeFiatFeeContract(address)", +"140da6b7": "getAddressField1()", +"140dcec4": "right23(uint256)", +"140f64b4": "GoyanToken()", +"140f7f8d": "Staged()", +"14102159": "presaleLimit(address)", +"14106b49": "JustifyClaim(address)", +"14107f3c": "buy(uint8)", +"14111a43": "isValidService(bytes32)", +"1411539d": "multiSend(address[],uint256[],address[])", +"14116c3c": "SetPeriodPreITO_startTime(uint256)", +"14117228": "getNoteKeyByIndex(uint256)", +"1411d713": "licenseIssuedTime(uint256)", +"1412409a": "whitelistSetterAddress()", +"14127f13": "setOrderFill_(bytes32,uint256)", +"141283f1": "setNewWallets(address,address)", +"14131611": "setChibiForFusion(uint256,uint256)", +"14133a7c": "setSaleAgent(address)", +"14139904": "directorB()", +"14143c91": "TotalSpecialFeeTakes()", +"1414a506": "falangiToken()", +"1414ef78": "createInvoice(uint256)", +"14162e8d": "IouRootsReservationToken(string,string,uint8)", +"14163a83": "setCrowdsaleContractAddress(address)", +"14167bf0": "oraclize_query(string,string[])", +"1416a6eb": "ROMAKELAPA()", +"14174f33": "withDraw(uint256)", +"14177dbf": "setLockTokensAddress(address)", +"14179865": "logos(uint256)", +"1417b946": "adminOwner()", +"1417c845": "Mortal()", +"14189a7e": "outstandingValue()", +"141926fa": "updateAccount(string)", +"14193456": "MainSaleEnd(uint256)", +"141961bc": "campaigns(uint256)", +"1419c3f3": "grand_factory()", +"141a8dd8": "approver()", +"141bd92a": "getBallotInfo(uint256)", +"141c4306": "AbroToken()", +"141c4e60": "challenge(uint256,address)", +"141c9422": "listingDate()", +"141ca2c7": "reservedIcoCrowdsale()", +"141d717b": "OC()", +"141dbe66": "distributeBTCB(uint256,address[])", +"141e26a5": "setEditionMaxSales(uint8,uint256)", +"141edaa1": "manufacture(address,address,address)", +"141f211c": "snapshotStakeAmount(uint256,address,address)", +"141f6800": "fundingMinimumTargetInUsd()", +"141fd3cf": "channelResultTimeout(uint64)", +"14204ca9": "QZG001TOKEN()", +"1420765a": "isBuyLocked(address)", +"14211803": "hasBuyTotal()", +"14219ff9": "sq(uint64)", +"1421c1a4": "vote_for_candidate_C_for_free()", +"14225b9b": "token_ratio1()", +"1423113a": "fluxFeed(uint256,bool,bool)", +"142359f4": "fillOrder(bytes32[],bytes32[])", +"1423649b": "cofounderApproveSwitchRequest(address,bytes32)", +"1423c40e": "setBudgetOfCampaign(bytes32,uint256)", +"1424c182": "recordDeposit(uint256)", +"14253887": "certify(address)", +"1425d2fa": "getBalanceToken()", +"14263f0c": "Dadice()", +"1427407f": "NINECOINTOKEN()", +"142769aa": "requestNumber(address,uint256,uint8)", +"14279086": "getIndividualCount(uint32)", +"1427f168": "log2Bounds(uint256)", +"14280bb8": "getBodyColorValue(uint256)", +"14287a07": "playerPrizeClaim()", +"1429a36b": "getOrCreateFeeWindowByMarketEndTime(uint256)", +"1429e26c": "User()", +"142b353d": "MultiTransferETH(address[],uint256[])", +"142bc2ae": "latestData()", +"142c99d2": "closingSettle(bytes32,address,uint256,address,uint256)", +"142d239a": "canPurchaseAmount(address,uint256)", +"142dc95d": "testAmount(uint256)", +"142e0bdf": "LogAllocate(address,uint256,uint256)", +"142e133f": "totalBalanceDown()", +"142e8e25": "setAdmin(uint256,address)", +"142e9ab8": "setTrade(bool)", +"142e9bc9": "weaponToOwner(uint256)", +"142f328e": "fundDao()", +"142f53c2": "sendInitialTokens(address)", +"14307c48": "addHpbBallotAddress(address)", +"143085c3": "updateRankBoard(uint256,uint256)", +"1430990a": "bidTransfer(uint256,address,uint256)", +"1431b23a": "getData(bytes)", +"143211ec": "newDaoRulesProposal(uint256,uint256,uint256,uint256,uint256,bool,uint256)", +"14325458": "calculateTokensFrom(uint256,uint256)", +"1432621a": "getPeakSupply()", +"14332c93": "SetConfirmRound(uint32,uint8,bool)", +"14350c24": "changeMinimumMakerProtocolFee(uint256)", +"143551e4": "timeExtension()", +"143580d0": "PGDA()", +"14359466": "NBTV()", +"1435e397": "setAllocation(address,uint256,uint8)", +"14361fd1": "singleWithdrawMin()", +"14363e65": "setPeriod(uint256[])", +"14367652": "revealStageActive(uint256)", +"1436fb39": "_isVotingAddress(address)", +"14371c33": "someMethod5(uint256,uint256,uint256)", +"14373817": "rateSoft()", +"1437f9a3": "Set_your_game_number(uint16)", +"14386a74": "saleToggle(bool)", +"143a1a2f": "pilfer(uint256)", +"143bb3e6": "StartRollDice(uint32)", +"143c56cf": "disprove()", +"143c6d4f": "TokenTransferTo(address,uint256)", +"143c7a3f": "OPAY()", +"143e55e0": "era()", +"143e6209": "setImagePartsCount(uint256,uint16)", +"143f68c9": "getRedemptionBalance()", +"143f9d1f": "week4Price()", +"143fb46d": "setRemainingTokensWallet(address)", +"143fcbbe": "cancelBooking(string,uint256[],uint256,bytes32,bool)", +"14404eb2": "roundOver()", +"144052b6": "C4coin()", +"1440f2bf": "PRE_SALE_PERCENT()", +"144136a1": "restartCrowdsale()", +"144138c8": "removeGlobalConstraintPre(address,int256,address)", +"1441a5a9": "referral()", +"1441c288": "showUnpaidInterest(address)", +"14423381": "GameConfig()", +"144267e0": "refundSecurity(address,uint256,uint256)", +"1442b548": "ZTST()", +"14432f6e": "Received(address,address,uint256,uint256)", +"144344b9": "setEth(uint256)", +"14442f54": "VERSION_NAME()", +"14447e11": "checkGamesReadyForSpinning()", +"14449c92": "finishRoundB()", +"14459309": "price_constant2()", +"1445c6da": "increasePosition(bytes32,address[7],uint256[8],uint32[2],bool,bytes,bytes)", +"1445f713": "hexstrToBytes(string)", +"14462b93": "findWhichCTD(address)", +"14468d32": "nextBidExpireBlockLength()", +"1447431e": "setCCH_edit_24(string)", +"1448b3ca": "tokenSaleAddress()", +"1449757d": "annulCertificate(address,address)", +"1449c321": "view_get_gameStates()", +"1449c6dd": "Staked(address,uint256,uint256)", +"144a2752": "getBuyAmount(address,address,uint256)", +"144a3260": "createWithDeposit(address,address,uint256)", +"144a3472": "inMaintenance()", +"144a88a0": "updatePlayerPoint(uint32,uint32,uint32,uint32,int256)", +"144b2a82": "transferICO(address,uint256)", +"144be7eb": "totalNumberOfCards()", +"144c7e40": "CRYPTOKEN(uint256,string,uint8,string)", +"144cbdfd": "NobeToken()", +"144f2f94": "_burn()", +"144fa6d7": "setToken(address)", +"145000ab": "PRICE_2()", +"14525b6b": "auctionFee()", +"14525bce": "INITIAL_BALANCE()", +"14526f8c": "Buy(string,address,uint256,uint256)", +"14534ad0": "LogCertifierAdded(address)", +"14534ba7": "ballotEncryptionPubkey()", +"1453671d": "changeWithdrawAddress(address)", +"1453bfb3": "visitingUnicorns()", +"1453d756": "bytes64ToString(bytes32,bytes32)", +"145538ea": "phase1StartBlock()", +"145671aa": "getValidations(address,bytes32)", +"14567b8b": "setSelfAsContributor(string)", +"1456974f": "setNameReaderId(address,bytes32,bytes32)", +"1456979f": "setNewValidator(address)", +"14572dff": "incrementUniquenessIndex()", +"14576a49": "NewSophonToken(address)", +"14577c55": "accountLevels(address)", +"14584a9d": "getAuctionIndex(address,address)", +"1458ffb3": "VREO_SALE_PHASE_1_END_TIME()", +"1459457a": "initialize(address,address,address,address,address)", +"1459cef4": "balanceOfMine()", +"1459ecc4": "lastrecordindex()", +"145a0adc": "setDataLink(uint256,string)", +"145a7f92": "social(address)", +"145af145": "getAllCardsLowestPrice()", +"145b2ab2": "CocoToken()", +"145ba84c": "_payAwardOwner(uint256)", +"145c03f2": "TransferFromCompanyInventory(address,uint256,bytes32)", +"145ca0b3": "UnLockTokens(address,uint256,string)", +"145cb459": "showCertificate()", +"145ccb0f": "planWithdraw(uint256)", +"145cf0c2": "decrementTokenIdsLength()", +"145d82d6": "setKingdomFactoryRP()", +"145e1944": "buy(bytes,int256)", +"145e6701": "SteemitFund()", +"145e818f": "BALVINDER()", +"145e8f5e": "HVB()", +"145eb4ee": "HuaTuoToken()", +"145ee04c": "pendingFeesWithdrawals()", +"145f3143": "releaseTime1()", +"145f8ba2": "getPainting(uint256)", +"145fa890": "setWhiteListDuration(uint256)", +"145fd87a": "getTotalHashRateOf(address)", +"145ff9cb": "terminateShortPosition()", +"146008e3": "grid(uint256,uint256)", +"14606109": "cap1(address)", +"14607fc2": "dispute(bool,address)", +"146091f1": "removeFromAllocationList(address)", +"1460b505": "setWeights(uint256[])", +"1460e603": "numDarknodes()", +"146124f9": "totalDistributedr()", +"146155bf": "createUserByEmailVerify(bytes32,bytes32,uint256)", +"14619c7f": "setContractAdmin(address,bool,uint256)", +"14627834": "GOVERNANCE()", +"14633039": "VanityToken_v3()", +"146483f9": "setCreateUnicornPrice(uint256,uint256)", +"1464bc45": "walletFacebook()", +"1464f516": "votosTotales()", +"14653f87": "SHIP(uint256,uint256,uint256)", +"14656957": "PeculiumToken()", +"1465aa97": "testingContract()", +"1466724a": "subUserBattleValue(address,uint256,bool)", +"14670850": "test_33_assertGasUsage200Boards()", +"14673d31": "setReserveAddress(address)", +"146740ee": "bulkAddMake(address[],uint256[],uint256[])", +"14679957": "GenesMarket()", +"14686ac2": "puntAmount()", +"1468d9cb": "Latium()", +"1468fc26": "changeSharedExpenseAllocation(uint256)", +"146901db": "setFailed()", +"14690be7": "TransactionSucceededICAP(bytes32,uint256,string,address)", +"14697cc8": "claimHalvingsSubsidies(uint256)", +"14698895": "Certification()", +"146b4955": "RICHERC20(uint256,string,string)", +"146b58df": "getInvestment(address)", +"146bea7b": "nextYear()", +"146c8710": "addressOf(address,uint256)", +"146ca531": "round()", +"146d2148": "setReaderId(address,bytes32,bytes32)", +"146dd227": "BLTToken()", +"146dd8e0": "BestEther()", +"146e3cb5": "getDroidsIds()", +"146e7eea": "soulsForSale()", +"146e91b5": "signContract(bytes32,string,bool)", +"146e9329": "summJenkins()", +"146ee571": "requestFreeDistribution()", +"146ef27d": "balancePreSale2()", +"147035ba": "processPublicPurchase(uint256,address)", +"14704d91": "getCCH_edit_26()", +"14709544": "BetCoin()", +"1470dfa8": "closeWindow(uint8)", +"1470fc6f": "approveRejectOrg(string,string,string,string,string)", +"14712e2f": "proxyApprove(address,uint256,bytes32,address)", +"147180ab": "feesA()", +"147288fb": "test_insert_findWithHint(int256)", +"1472d56a": "assertEq1(bytes1,bytes1)", +"1473248d": "SampleContract()", +"14743e7e": "activateRound(uint256)", +"1474b789": "burnXPTokens(address,uint256)", +"1475e751": "game_token()", +"1476e40f": "multiCall(address[],uint256[])", +"1478b6af": "abortUpdate()", +"1479290e": "removeBouncer(address)", +"14793058": "createPhoenixes()", +"14794702": "withdrawWinnings(uint256)", +"147a5640": "_getAllRevisionIpfsHashes(bytes20)", +"147aaa8d": "giveTokensTo(address,uint256)", +"147bfd66": "GuardedBeercoinICO()", +"147c9f6d": "updateWallets(address,address,address)", +"147d57b0": "send_bounty_token(address,uint256)", +"147d959a": "setUSDPrice(uint256)", +"147da3c9": "newSpaceshipProduct(uint16,bytes2,bytes2,bytes2,bytes2,uint256)", +"147e14a4": "retrieveTokens(address,address,address)", +"147e51f4": "freezeTheMoment()", +"14807045": "flipCapSwitchTo(bool)", +"148105ab": "addBankroll()", +"148174cd": "ownerSetCasino(address)", +"1481c04a": "getTXSValue(uint256)", +"1481d439": "deleteUserClaimInBulk(address[])", +"148222cf": "donateSkin(uint128,address)", +"1482bd40": "bountyBalanceMap(address)", +"148303a7": "SafePower(uint256,uint256)", +"14838617": "DEV_PORTION()", +"1483fc8c": "addBlockData(uint256,bytes)", +"14841164": "extraBalanceWallet()", +"1484abf4": "whitelistApplication(uint256)", +"1484cd32": "getWinners(uint16,uint8)", +"1484e9ad": "startICOStage2()", +"14852606": "setAccompliceBContract(address)", +"1485ffc4": "finalizeTDE()", +"14870a57": "setMonthClose(uint256,bool)", +"14870d2c": "withdrawAllToken()", +"14887c58": "isEntity(address)", +"1488f983": "LogFinalized(address)", +"148ab04e": "balance_in()", +"148ab078": "MEW_RESERVE_FUND()", +"148bea6b": "gamblerlist(uint256)", +"148cd939": "transferBecauseOf(address,uint256,address,uint32,uint256)", +"148ce4a4": "test_claimShare_isTranscoder()", +"148d3e7b": "FQCoin()", +"148da7f6": "disableInvestment()", +"148dd101": "thirdChangeBlock()", +"148f2e5e": "sendWei(address)", +"148fa780": "just10Send()", +"14900396": "changeRaceOwnership(address,address)", +"149148e0": "getCityPlanAddres()", +"1491858e": "calculateSetupAllowedUntil(address[16],uint256)", +"14918f5e": "performInitialWithdrawal()", +"14930d7e": "transferResidualBcoupons(address,uint256)", +"14941e80": "getFreeAmount()", +"14946a97": "CoreToken(uint256,string,string,uint8)", +"1494ecfc": "SentosaX()", +"14950f64": "RevokeAddressChanged(address)", +"14959741": "UserMessage(address,string)", +"149607d3": "EtherollToken()", +"149679b9": "GOE()", +"1496fc4c": "Telcoin()", +"14975cc7": "hardCapPrice()", +"14986f5b": "setCooldowns(uint32[100])", +"1498970a": "getDeployedblockbytesMarriages()", +"149947fd": "finding(address,bytes8,uint8[])", +"1499c592": "setParent(address)", +"149acf9a": "daoCreator()", +"149b8690": "supplyInCirculation()", +"149c5066": "ChanceOfWinning(uint256)", +"149cc1f6": "_finalizeBet(bytes32,address,uint256,uint256)", +"149cd0be": "alterCreatePetitionFee(uint256)", +"149dffc8": "numCancelledRequests()", +"149e6788": "heroClasses(uint32)", +"149e685a": "getFundById(uint256)", +"149eead5": "master_contract()", +"149f2fdb": "sellExchangeRate()", +"149fc918": "_rejectMint(uint256,uint256)", +"14a0069a": "getVoter(string)", +"14a03e7c": "concludedGameIndex()", +"14a06710": "TokenRelease(address,uint256)", +"14a091a9": "createLockTokenHistory(address,uint256)", +"14a1231f": "guardian2Vote()", +"14a26806": "setPreUri1(string)", +"14a2d99f": "Grant(address)", +"14a34ebd": "getMilestones(uint256,uint256)", +"14a3557b": "intrepidVoucherSoldCount()", +"14a3b19a": "transferIndexedByAddress(address,uint256,address)", +"14a47046": "add_blockedAddress(address,address)", +"14a4a273": "penalizationOpen()", +"14a528f2": "HasGift(string)", +"14a54912": "token_a()", +"14a57db7": "LogPreparePreContribution(address,uint256,uint256,uint256)", +"14a59e9d": "getStakeholderConfirmationCount(uint256)", +"14a5cd29": "getAssetEmitter(uint256)", +"14a6a1a5": "REQUESTED_STATUS()", +"14a7945a": "redeemAllOwnedAssets(uint256)", +"14a7c57d": "getData_26()", +"14a89904": "rollDie(address,uint256)", +"14a8bd0d": "EXCHANGE_RATE()", +"14a8ca20": "fromPercentage(uint256,uint256)", +"14aa0eaa": "claimBountyToken()", +"14ab260e": "retrieveCompletedProof(bytes32)", +"14ab9038": "setTTL(bytes32,uint64)", +"14aba0db": "MineAD(address,uint256)", +"14ac1102": "get_total_items_in_state(bytes32)", +"14ad47eb": "SwapToken()", +"14ae1229": "setRightForInterest(uint256,uint256,bool)", +"14aedbee": "TokenFactoryAirdrop()", +"14af0908": "XdacTokenCrowdsale(address,uint256[],uint256[],uint256,uint256)", +"14af1e92": "MinterGaveCWC(address,address,uint256)", +"14af35c3": "MyToken(string,string,uint256)", +"14afd79e": "ownerOf(address)", +"14b0519d": "AltExtraHolderContract(address)", +"14b08b4d": "getAllDepositors(uint256)", +"14b0e266": "addBid(uint256)", +"14b11606": "BONUS_ICO_STAGE2()", +"14b11651": "setPoolAndAmount(address,uint256)", +"14b11875": "verifyProposal(address,address,uint256,string)", +"14b1e1f8": "setRefer50x50(address)", +"14b24209": "multiGuess(int256[])", +"14b2cd55": "LightPool()", +"14b2d6dc": "isValidDate(uint256,uint256,uint256)", +"14b419c9": "getAllUsers(address)", +"14b49c36": "Police_5()", +"14b5202c": "stage_Discount()", +"14b546b4": "FreePublicity()", +"14b577ab": "addIdArrayItem(address,address,string,string,uint256)", +"14b72000": "txFeeCapInWei()", +"14b77798": "unsetMany(address[])", +"14b78abb": "cloneProposal(uint256,string,bytes32,uint256,uint256,uint256,uint256)", +"14b79e21": "_depositTransferCredits(uint256,uint256)", +"14b7c684": "DGD()", +"14b80402": "isStateDestructed()", +"14b85c1b": "removeSalesAgent()", +"14b87862": "getParticipant()", +"14b8e9a4": "checkpointLevel()", +"14b92721": "loveMessage()", +"14b933e1": "getWeiPerSatoshi()", +"14ba5c09": "getDay()", +"14bafeab": "getMessage2()", +"14bb4dd9": "WavesTransfer(address,string,uint256)", +"14bba4b8": "setDiscount(uint256,uint256,uint256,uint256,uint256)", +"14bba8a2": "updateRequestExpired()", +"14bbe21c": "transferBeneficiary(address)", +"14bc3efc": "endBorrowAgreement(string,string,uint256,uint256)", +"14bd0c21": "getServiceAddress(bytes)", +"14bd3d87": "acceptOffer(string)", +"14bd8acd": "massApproval(bool,uint256,uint256)", +"14be4ecc": "setWETHContract(address)", +"14be5169": "releaseLockAgencyLock2()", +"14be7793": "isPrivateSale()", +"14beb3a3": "latestParams()", +"14befc70": "parkingOff(address)", +"14bfd6d0": "admins(uint256)", +"14c01fb4": "_checkPixelAbove(uint256)", +"14c0a37a": "stateBorrowerDefaulted(uint256)", +"14c0bc27": "EtherBalanceOf(address)", +"14c0ffdc": "formula(uint256)", +"14c15569": "getAccountOutputSdcslength()", +"14c16f41": "updateStageWithInvested()", +"14c239a9": "_cappedReward(uint256)", +"14c259eb": "white_duration()", +"14c292ca": "finishITO()", +"14c2d2e0": "handleRef(address,uint256,uint256,uint256)", +"14c33c24": "setSystemEndingPrice(uint256)", +"14c3512d": "adminSetFeeUsdDialNumber(uint256)", +"14c3e29f": "NONEC()", +"14c411c7": "releaseTeamTokens()", +"14c44e09": "registrationFee()", +"14c485c9": "getMartialListInfo()", +"14c588de": "setPromoGen0(uint256)", +"14c5f158": "callModifiedTransfer(address,uint256)", +"14c65687": "_getWeightUntil(uint256,uint256)", +"14c72e9e": "_getFirstIndex(uint256,uint256[])", +"14c74834": "setHeir(address,uint256)", +"14c7763b": "MINTING_LIMIT()", +"14c78333": "batchResolveAquarium(uint256[])", +"14c7bddf": "manualRefund()", +"14c888da": "setFeeParams(uint16,uint256,uint256)", +"14c8e5f4": "requestHangingDividends()", +"14c9035e": "quickConvertPrioritized(address[],uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"14c9b8a5": "closeEarly(uint256)", +"14c9eed0": "onlyadmin()", +"14ca5200": "MiningRewardTransfer(address,address,uint256)", +"14ca5398": "submitFullBlock(bytes,uint256[],uint256[],bytes,bytes,bytes,bytes,bytes,bytes,uint256)", +"14ca6e01": "setBleachPrice(uint256)", +"14ca8e01": "validPlayer2(uint256,address)", +"14cabddb": "joinProof(uint256)", +"14cb1ae4": "ContractOwnable()", +"14cba002": "_forwardTransferFromWithReference(address,address,uint256,string,address)", +"14cbb90d": "yea()", +"14cbd993": "getRegisteredTokens()", +"14cbdb54": "EspCoin()", +"14cc3cf9": "FOUNDERS_LOCK_PERIOD()", +"14cd70bc": "FakeOwner(address)", +"14cddf9e": "whiteListMinAmount()", +"14ce2f61": "MappingDone(address,uint256)", +"14ce4059": "owner_fee()", +"14cf12d5": "softCapTime()", +"14cf19fe": "TIER1_PRICE()", +"14cf588f": "LBA()", +"14cf6983": "getBalanceCell(address)", +"14cfb977": "minFinneyPerSaleMoreThan()", +"14cffda2": "synertreeToken()", +"14d03ea6": "TrivialToken(string,string,uint256,uint256,address,address,uint256,uint256,uint256)", +"14d04e06": "FooozCrowdsale(address,address)", +"14d066d5": "addCertificator(address)", +"14d07a3e": "left28(uint256)", +"14d0f1ba": "moderators(address)", +"14d10920": "BetstreakToken()", +"14d140b0": "communityPool()", +"14d20606": "devTeamPrecent()", +"14d23c8b": "MaliciousSeller()", +"14d296f4": "getPremiums()", +"14d2d59d": "_approve(uint40,address)", +"14d30335": "assignInitialDays(address,uint256,uint256)", +"14d33a30": "addCandidateBatch(address[])", +"14d36f53": "checkVerifyAccess()", +"14d3df67": "getSMPTokensAmountPerEthInternal(uint256)", +"14d47bc9": "registerBeneficiaries(address[])", +"14d4ecd9": "defineCurrentPeriod(uint256,uint256)", +"14d547aa": "returnInvestments(address)", +"14d5d892": "changeMemberAddress(uint256,address)", +"14d67848": "setClass(uint256,uint256)", +"14d6c2b1": "_maint_updateOwner(address)", +"14d72106": "nextNumberOfWagersToFinalTimeout()", +"14d75e9d": "createProduct()", +"14d79e37": "GetRed(address)", +"14d8c981": "getItem(address)", +"14d9d2e5": "getCostForUprade(uint256,uint256,uint256)", +"14dacf5b": "disableWhiteUserList()", +"14db6d58": "hasUserPermission(address,bytes4)", +"14db8c7d": "getGladiatorPower(address)", +"14dba3ba": "PPToken(uint256,uint256)", +"14dbb508": "Project(string)", +"14dcd58f": "derpcoin()", +"14dcfd55": "vendorWallet()", +"14de9cc2": "tokenGenerated()", +"14dea8e7": "onCancel(bytes32,uint256,address)", +"14deb0ac": "addressAt(address,bytes,uint256)", +"14df96ee": "isRoundingError(uint256,uint256,uint256)", +"14dfad27": "_emergencyLoop()", +"14e0246a": "setMintSigner(address,int256)", +"14e2bc2a": "finishMinting(uint256)", +"14e3fad3": "extra_bonus_amount()", +"14e4a723": "SafePromo()", +"14e580ab": "LogIdentityCreated(address,address,address,address)", +"14e604b6": "EXPLOSION_DENOMINATOR()", +"14e6a86d": "doCheckBounds(bytes32)", +"14e8093f": "clientWithdrawAll()", +"14e887e8": "transactionCounter()", +"14e904e8": "LogBidCompleted(uint256,bytes32,bytes32)", +"14eaa43b": "withdrawToken(address,uint256,string)", +"14eb75bb": "assignRoles()", +"14eb76ac": "updateTeamAddress(address)", +"14eba026": "removeTeamMember(address)", +"14eba5d8": "affiliateList()", +"14ec4106": "createAuction(address,uint256,address,uint256,uint256,uint256)", +"14eda32c": "COZE()", +"14eea0dc": "IND()", +"14efaf86": "ChangedPaymentDestination(address,address)", +"14f0ff32": "FUNK()", +"14f1244c": "reclaimDeposit(address[],uint256[],bytes32[],uint256[],bytes,bytes)", +"14f1586a": "objective()", +"14f1dcac": "setFreeCoins(uint256)", +"14f2979f": "getTickets(uint256)", +"14f36e17": "getTokenIssued()", +"14f3f491": "preICOContract()", +"14f52c07": "Blogcoin()", +"14f604b8": "deposit_asset_to_session(uint32,uint32,uint64)", +"14f60881": "getJobClient(uint256)", +"14f64d6c": "PRESALE_START_WEEK1()", +"14f685a8": "Etherumble()", +"14f6c3be": "getETH()", +"14f72e50": "EightStandardToken(uint256,string,uint8,string)", +"14f7731b": "getAllowedAmount(uint256)", +"14f7789d": "GRAChain(uint256,string,string,string)", +"14f796ca": "changeStageAndReleaseETH()", +"14f80083": "setMultisigVault(address)", +"14f8917a": "initialSupplyPreSale()", +"14f8b424": "roundID()", +"14f8f160": "hasIssue(address,bytes32)", +"14f99533": "changeAuthorisedContract(address)", +"14f9e35b": "groom()", +"14fa0b45": "NenasChain()", +"14fa274c": "MigrationInfoSet(string)", +"14fbc22b": "createHero(uint256,address)", +"14fc2812": "setAuthorized(address)", +"14fc7b9d": "AscToken(address)", +"14fcb95c": "ubiatarPlayWallet()", +"14fd0c14": "deadlineVoting()", +"14fd24f0": "updateIndividualCap(uint256)", +"14fddb71": "devTeamBalance()", +"14fdecca": "getPromotion(uint256)", +"14fefca1": "set_hp(uint256)", +"14ff5ea3": "getTokenId(uint256)", +"14ff5f99": "punterAddress()", +"14ff89cd": "getContactByIndex(uint256)", +"14ffbafc": "startEthGet()", +"1500214e": "calcPercent(uint256,uint256)", +"15003368": "withdrawEMONT()", +"1500c257": "startTimePre()", +"1501bf03": "transferFunds(address,address,uint256)", +"15020cb0": "commandTookAway()", +"1502906d": "timeStep()", +"15036fa2": "update_dividend(address,uint256,uint256,uint256)", +"1504460f": "poke(bytes32)", +"150455a4": "HOTCASH()", +"15045c3e": "GenieToken()", +"1504ce95": "payout(string)", +"1504d8f0": "createSnapshot()", +"1504e40b": "RoundEnded(address,uint256)", +"150627bb": "minimumInWei()", +"15067c4e": "p_setRoundDuration(uint256)", +"15070401": "getSymbol()", +"150727ff": "getSecondAddressBalance()", +"15087f7d": "cancelBet(uint256,bool,uint256)", +"15093e03": "minimumAllowedWei()", +"1509c42a": "pr()", +"150a5655": "giveVote(string,uint8)", +"150a6480": "allowMinter(address)", +"150aaf74": "BHB(uint256,string,string,uint8)", +"150ad280": "review(uint256,bool)", +"150ad2a8": "owner_transfer_ownership(address)", +"150b52db": "removeAddressFromPartnerWhiteList(address)", +"150b60e6": "MAYNILAD()", +"150b6885": "genaroDevMultisig()", +"150b7a02": "onERC721Received(address,address,uint256,bytes)", +"150bc419": "unitMythGrowth()", +"150c3e8b": "getIdxArray(uint256)", +"150d6277": "setMinBetPerSpin(uint256)", +"150d7163": "UnfreezeTokensOfOneUser(address)", +"150eb4d9": "releaseTeam(uint32)", +"150f16ac": "stoppedPresale()", +"150fa89f": "FirstUser()", +"15105fa8": "clearCreator(uint256)", +"1510ca79": "MAX_CROWDSALE_TIME()", +"151110b0": "releaseLockedBalance(uint256)", +"1512cfc1": "_preValidateInvest(address,uint256)", +"15136fb5": "ChiTrader()", +"15139f09": "ExaGBP()", +"15142ed4": "shutDownVersion(uint256)", +"15143d6a": "buyOx()", +"1514617e": "vestingDuration()", +"15148649": "getAllowedTokensCount()", +"1514b9cb": "RKCToken()", +"1514bc48": "tokensForPurchase(address,uint256)", +"1514ea54": "getLossesShare(address)", +"15154aff": "ITO()", +"15158a10": "numberOfTokensToAvail25percentDiscount()", +"1515bc2b": "hasClosed()", +"151682a5": "HASH_RATE_MULTIPLIER()", +"1516bbc4": "setTeamVault(address)", +"1516db09": "allOwners(uint256)", +"1516def7": "multiSigAddress()", +"1517d107": "totalNormalCollected()", +"15183e2f": "twitterBotAddress()", +"15191c98": "hibernate(uint256)", +"15194a9f": "init(uint256,string,string,uint8)", +"151b0bed": "getSponsorshipsBalance(address,uint256)", +"151b2342": "getOraclizeCallbackFee()", +"151bc167": "Control()", +"151bcc06": "massAdvertiseTransfer(address[],uint256)", +"151c0d40": "crowdsaleEther()", +"151c3b12": "store(address,bytes)", +"151c61b6": "setUSDExchangeRate(uint256)", +"151d7d32": "flushDividends()", +"151e2a0a": "check_ptc_num(address)", +"151eeb55": "transferAllowed(address)", +"151fa6be": "delegateIsDeleted()", +"15226b54": "getReserveBalance(address)", +"1522f110": "preregvills(address)", +"15248362": "buy_bounty()", +"152583de": "getAttributes()", +"152592b0": "WALLET_ALLOCATION()", +"1525b4f5": "mintLockedTokens(address,uint256,uint256)", +"1525d680": "MainToken(address)", +"1525ff7d": "setTeamWallet(address)", +"15263ef7": "VHW()", +"15270ace": "distribute(address,address[],uint256[])", +"152713b3": "sumAcceptedVirtualContrib()", +"152744ea": "BondInfoById(uint32)", +"1527d657": "returnHowMuchMoreETHNeeded(uint256)", +"152826e9": "cashoutable()", +"15285aa3": "EventBid(uint256,address)", +"1528f43c": "getPOOL_edit_10()", +"152993a8": "addContract(string,bytes)", +"1529a639": "getCollateralBalance()", +"152a3f28": "getSponsorships(address,uint256)", +"152af8f9": "acceptFoundationTransfer()", +"152afab4": "adicionarAssinatura(string,string)", +"152b6f9a": "hasDNN(address)", +"152cf3af": "ethPayment(bytes32,address,bytes20,uint64)", +"152cf9db": "getDataPoint(int256,uint256,uint256)", +"152e84a7": "tokensDistributed()", +"152fb125": "SimpleMixer()", +"152fb5fd": "period_count()", +"15303771": "updateUnsold(string,uint256,uint256)", +"1531076c": "getAgonArray(uint64,uint64)", +"15312b50": "SimpleTokenVesting(address,uint256)", +"153154fd": "getRecommender(address)", +"1531c267": "fipsRegisterMulti(uint256,address,bytes)", +"1531dfdb": "ethtosend()", +"15328109": "parentAddr()", +"153345ce": "changePrice(uint256,uint256,uint256,uint256)", +"15334b77": "setGameStarterDividendPercentage(uint256)", +"15334fa7": "SOCToken(uint256)", +"15336f80": "setProof(string)", +"15338724": "mediaTokens(address)", +"1533ba50": "EMBCToken()", +"1534180f": "_transfer(address,uint256,bytes,string)", +"15347380": "priceInWeiToken(uint256)", +"1534b1fc": "getPlayerDepositData(address)", +"1534b392": "getNumLockers(address)", +"1534e8d2": "multiVesting(address[],uint256[],uint256[],uint256[])", +"1535884e": "notarizeHash(bytes32)", +"153677b7": "deployOtherVesting(address,uint256,uint256)", +"1536a614": "EphesusToken()", +"1536cabf": "addCertAdmin(address)", +"1536fec6": "get_end_time()", +"15370598": "getCurrentMode()", +"153737f5": "OWN_DistributeTokenAdmin_Multi(address[],uint256,bool)", +"15373e3d": "castVote(uint256,bool)", +"1537671c": "qtdePokemonsMapping(address)", +"15382559": "LogDepositReceived(address)", +"153913e3": "ICO_Live()", +"15398afe": "compareNumericStrings(string,string)", +"153a1f3e": "bulkTransfer(address[],uint256[])", +"153a6bd3": "test_sendFundsToContract()", +"153a79c9": "buySaleTokens(address)", +"153aa771": "totalSupplyBonus()", +"153b0d1e": "setBlacklist(address,bool)", +"153b31fd": "sign(string,uint256,uint256)", +"153cc53d": "hasCrowdsaleStarted()", +"153d3572": "deletePawn(uint256)", +"153debee": "FOUNDERS()", +"153e66e6": "buy(address,address,uint256)", +"153e6d70": "setPercentFrozenWhenAwarded(uint256)", +"153faf2c": "FOUNDER_WALLET()", +"153fbb81": "setCAPAddress(address)", +"153fe583": "getAddressFromSig(bytes32,uint8,bytes32,bytes32)", +"153fe6aa": "STATUS_INITIAL()", +"15408734": "addMake(string,address,uint256,uint256,bool)", +"15409c1d": "TradingAccount()", +"1540fe22": "weiMinimumLimit()", +"15413ccf": "logicProxies(address)", +"1541eb12": "JournetToken()", +"15420b71": "transferPreSignedHashing(address,address,uint256,uint256,uint256)", +"1542b365": "phase_4_remaining_tokens()", +"1543136c": "getDeployedLength(address)", +"1543d99f": "bonus_calculation()", +"1544fc67": "delegatorStatus(address)", +"15454cd2": "registerNameCore(uint256,bytes32)", +"15480c63": "createDefaultCobeFriend(uint256,uint256,uint256,address,uint256,uint256)", +"15490ebb": "transferReward(address,uint256)", +"154920b0": "firstEmptyId()", +"15497d2c": "lockStatus(address)", +"1549be43": "getOutstanding(address)", +"1549c1e2": "usePlayerToken()", +"154a7d71": "DATE_31_DEC_2019()", +"154ad3f7": "ChangeMemberName(address,string,string)", +"154af6b1": "sendShares(uint256,uint8,uint256,address)", +"154b3f4c": "executeSigned(address,uint256,uint256,address,bytes)", +"154d56db": "callHotel(address,bytes)", +"154d6e12": "buyPack(uint8,uint128)", +"154d7944": "newCarID()", +"154e3f61": "enroll(address,address,uint256)", +"154e45a4": "privateSold()", +"154e8152": "withdrawnBalance()", +"154e95f1": "changeNamespaceOwner(string,address)", +"154e9bd5": "PumaPayToken()", +"154f78dc": "FREETOKENTEST(uint256,uint256)", +"154faf5d": "getTodayIndex()", +"15502d73": "changeTokenFreezeDate(uint256)", +"15506bf1": "RemoveParticipant(address,address)", +"15519af1": "RANGESTART_PRESALE()", +"1551e636": "tokensReceived(bytes32,address,address,address,uint256,bytes,bytes)", +"15525991": "getMaxAmount(address)", +"15527006": "icoPhaseDiscountPercentage3()", +"1552cb04": "addBaseWhitelist(address[])", +"15544fc2": "Teaeum(uint256,string,string)", +"1554611f": "escapeHatch()", +"1554c243": "_setApp(address)", +"1555e337": "ConferenceCertificate()", +"1555fe7e": "RecordableRefundableCrowdsale(uint256)", +"1556195c": "LowRiskBag()", +"15574634": "requestTransferFundToSupplier()", +"1558687a": "DepositContract()", +"155897cc": "changeDeDeAddress(address)", +"1558ab7e": "sendEthBack(uint256)", +"1558ae4d": "Etheroll()", +"155949ca": "buyStores()", +"15598339": "GetPurchaseInfo(address)", +"155ac95f": "switchname(bytes32)", +"155bdaa0": "SEGFAULTCOIN()", +"155ce432": "Restitution_Historique_Transactions(address)", +"155dcb47": "ZJFTokenDeposit()", +"155dd5ee": "withdrawFunds(uint256)", +"155f0ebc": "dividends(bool)", +"155f1861": "claimBonusCard()", +"156014e8": "addAddressToPartnerWhiteList(address,uint256)", +"15613495": "earlyBackersWallet()", +"15613d9f": "chainIdValue()", +"15616d2b": "getCurrentResult()", +"1563f4ff": "adminOrInitializing()", +"1564d706": "lockIn()", +"15659dde": "getBidCount(bytes32)", +"1565b0b6": "PRICE_ICO4()", +"1565c3c8": "takeEther()", +"1565f12f": "createVote(bytes32,address,address,uint256,bool,string,string,uint256)", +"156773ca": "setAllStopper(address)", +"1567d7a7": "transferPromotionalShares(uint256,address,uint256)", +"1568a1a1": "vinciSold()", +"15691522": "AltSocialAccountPw(bytes32,bytes32,bytes32,bytes32)", +"15698812": "redeemExcluded(bytes32)", +"156a0528": "getBalancesPayer(uint256)", +"156a2f36": "bid(address,uint128)", +"156b1494": "removeExpiredAssignments(address,uint256)", +"156bf4c1": "getKtcAddress()", +"156c0ed4": "Scanetchain()", +"156c2e82": "withdrawGxTokens(address)", +"156c6baf": "isAllowCnsContract(address,bytes32,bytes32)", +"156cacc3": "Etheroneum()", +"156e29f6": "mint(address,uint256,uint256)", +"156e5039": "safeadd(uint256,uint256)", +"156e9507": "mineTotalBalance()", +"156f985c": "getFundsStatus()", +"157003d9": "tierCaps(uint256)", +"157024b3": "producerStatement(string)", +"15728a73": "GoBlockSupply()", +"1574126a": "preSaleEndBlock()", +"15748250": "freeze(address,address)", +"15752ac5": "bonusTokensAllocated()", +"15764334": "Hybrid()", +"15770d99": "disapprove(address)", +"15781c80": "checkPurchaseValid(address,uint256,uint256)", +"15786590": "lotteryTotalEarning()", +"1578a123": "Send_MediatedTransaction(address,uint256)", +"1579e5c5": "getAllCardAddressesOfOwner(address)", +"157a18b4": "ADMOToken()", +"157a68df": "createIssue(uint256,address,uint256[],address[],string)", +"157ad5a1": "canWithdrawBond(address,uint256)", +"157b5167": "fun2()", +"157bbbf5": "winJackPot(address,string,uint256)", +"157cb62c": "getPlayerDnas(address)", +"157d5956": "isGetFreeZombiew(address)", +"157daf2e": "returnChange(uint256)", +"157db359": "airdroper()", +"157ddf8f": "bonusTotalSupply()", +"157e2063": "ASTBToken()", +"157f33f5": "coinIssuedTotal()", +"157f5610": "showGameEnd()", +"157f67e8": "withdraw_my_tokens()", +"157f8f51": "feePaid(int256,int256,int256,int256)", +"157fbd8d": "emitAccessBlocked(address,bytes32)", +"1580391c": "set(bool,string)", +"158048a0": "settlePut(uint256,uint256,address)", +"158059e2": "changeVotingRules(uint256,uint256)", +"1580beb7": "HOPEtoken()", +"158163c8": "setMerculetPrice(uint256)", +"15817881": "saleStageStartDates(uint256)", +"1581b600": "withdrawAddress()", +"15830662": "assignTokens(address[],uint256[])", +"15834aed": "tournamentQueue(uint256)", +"1583deb2": "businessAddress()", +"15843245": "PeoplesToken()", +"158495df": "tokenIds(uint8)", +"15862aff": "lookupIndex(uint256,uint256)", +"158641f5": "getArtistId(bytes32)", +"158686b5": "change_admin(address)", +"15875f54": "getVestingEndTime(address)", +"158859f7": "disableTokenTrade(address)", +"1588ce09": "closeManualyMining()", +"158952da": "tipUser(bytes32)", +"15899670": "todaysBidTotal()", +"158a1184": "operation_amount(uint256)", +"158a4988": "distributeTokens(address,uint256)", +"158b8e54": "LastTokenId()", +"158be5a2": "WTF()", +"158d1fd4": "crowdsaleEndedSuccessfully()", +"158dec25": "maxSubmissions()", +"158e7986": "addBallotAndVoterWithPk(bytes32,bytes32)", +"158e7e53": "maxPreIcoAmount()", +"158ee887": "emergencySetOwner(address)", +"158ef412": "forceUpdateName(string)", +"158ef93e": "initialized()", +"158f7f5c": "reservedFounder()", +"15902a09": "removeOpenOrderFromBook(uint128)", +"159090bd": "take()", +"15910e5c": "logPurchaseViaToken(address,address,uint256,uint256,bytes32)", +"15915ddd": "directMintTokens(address,uint256)", +"15917977": "changeUniqueOwnership(string,uint256,address,address)", +"15919eed": "Arena()", +"1591bf51": "getPubKeyArr50(bytes32,uint256,uint256[])", +"1591dc6a": "BuyLoan(address,uint256,uint256)", +"159218d2": "setStagesManager(address)", +"15927801": "distributePrize(bool)", +"1592aa2e": "registHns(string,address)", +"1592c087": "transferTusdProxyOwnership(address)", +"1593796e": "didReveal(bytes32,address)", +"1593a8c7": "endLottery()", +"1593ecb8": "LOG_IncreaseInvestment(uint256)", +"1594060a": "HalvingInfo()", +"15945790": "_supply()", +"15949ed7": "getPermissionParamsLength(address,address,bytes32)", +"1594afd1": "setExchangeRateShift(uint256)", +"1595f207": "TKT(address)", +"159621d2": "getProfesor()", +"15969c4e": "minimumStageDuration()", +"1596b2bf": "getServiceFeeNumerator()", +"1596facb": "saleTime()", +"15977d45": "ledger(bytes32)", +"1597ee44": "encode(uint8[])", +"15980795": "freezeOf(uint8,uint8)", +"15981650": "setTicketPrice(uint256)", +"15983796": "getNextSnapshotBlock()", +"1598653d": "firstThousandUsers()", +"159887d1": "calculateFactor(uint256,uint256)", +"1598b2e0": "getSeatClaim(uint256)", +"15992cda": "uniq(uint16[])", +"1599a096": "mixStringAddressFunc(string,address)", +"159a3c33": "AWAXToken()", +"159a6475": "getFingerprint(uint256)", +"159ad680": "updateuser()", +"159b4e91": "sendTempTokens(address,uint256,uint256)", +"159bd2f3": "earnedFunds()", +"159c18bc": "removeWhitelistOperator(address)", +"159c2d9f": "BuyKeys(uint256,uint256)", +"159c60e8": "ZDMCoin()", +"159ce057": "getReturn()", +"159d3c24": "sellZone(uint256,uint256)", +"159d526f": "calcStateHash(bytes32[10],uint256[4])", +"159d8562": "ediv(uint256,uint256)", +"159da82d": "getInvitationValidPeriod()", +"159dbef7": "_0xDiaryToken()", +"159de07a": "FundariaBonusFund()", +"159e1e14": "EthereumPrivate()", +"159f82fc": "getEventResult(uint64)", +"159fb416": "transferCreditBotAddress()", +"15a03930": "TossMyCoin()", +"15a090c0": "getMiningWarRoundNumber()", +"15a0df43": "testThrowCreateNewRevisionNotOwner()", +"15a0ea6a": "claimFees(address)", +"15a269f7": "withdrawBalance(address,address)", +"15a29035": "getTask(bytes32)", +"15a2bd76": "allowOrRestrictMethod(bytes4,bool)", +"15a38bda": "isOldVersion()", +"15a3c611": "project_registry(uint256)", +"15a4806c": "EtherButton()", +"15a4d313": "NovaChain()", +"15a50aff": "getInvalidKeys()", +"15a51595": "TeamMembersAddress()", +"15a52302": "getService(address)", +"15a529b6": "getAllSalesByAddress(address)", +"15a55347": "reservedTokens()", +"15a5d9d8": "contractAddr()", +"15a60b76": "_calFrozenAccountCoin(address)", +"15a653a0": "numberOfSupportedTokens()", +"15a686f3": "PixelOperationsContract()", +"15a6a11c": "mintLeftOverZCOToWallet()", +"15a6a38d": "RedeemMTU(bool)", +"15a6f5c1": "setLatestTokenPayday(address,address,address,uint256)", +"15a75f9f": "playFor(address,bytes32)", +"15a9a145": "numRewardsAvailable(address)", +"15aaa09b": "PRECOE()", +"15aaefd5": "_transferPrimordialToken(address,address,uint256)", +"15ab250d": "setCresus(address)", +"15ab8302": "RoundASold()", +"15abc160": "createValidatedRequest(address[3],address,uint256[11],uint256,bytes)", +"15ac4c90": "setDayEthInLimit(uint256)", +"15ac534d": "closeBetting()", +"15aca0c4": "LogError(uint256)", +"15acce5e": "arpDeposited()", +"15ad1be3": "unrestrict(address)", +"15ae0629": "getHash(bytes,uint256)", +"15ae1972": "stageRate()", +"15aec1fb": "airdropadd()", +"15aec7ee": "BlockChainCourse()", +"15aee408": "FinaliseSale(address,address,uint256)", +"15af64e7": "JACToken()", +"15afa98e": "totalEth_()", +"15b02a4c": "totalICOable()", +"15b03fde": "getaddresstotal(uint256)", +"15b07f69": "nextCourse()", +"15b0821f": "mintDRSCoin(address,uint256)", +"15b21082": "requestCustodianChange(address)", +"15b23e47": "OncoToken()", +"15b2b1ae": "SaleStatus(string,uint256)", +"15b3433b": "dexjartoken()", +"15b37899": "setKyberNetworkAddress(address)", +"15b40ec0": "deployed(uint256)", +"15b4bc22": "getMinerHalving()", +"15b53beb": "TournamentOver()", +"15b556df": "getSellPriceAfterTax()", +"15b56b44": "checkReward(uint256[])", +"15b66fef": "calculateClaimableRewardTillRound(address,address,uint64)", +"15b73a1d": "ICOSupply()", +"15b7ab02": "setAgriChainProduction(address)", +"15b8003b": "buyChance(uint32,uint32,bytes32,uint256)", +"15b88b35": "PeaceToken(uint256,string,string)", +"15b9a8b8": "controllerCount()", +"15ba9ea2": "register(address,bytes32[5],address)", +"15bbc15d": "approveMP(address,int256,uint8)", +"15bc9441": "convertToDEF(uint256)", +"15bd73f1": "offerchangeprice(uint256,uint256)", +"15bd8bb2": "getTimestampByHash(string)", +"15bddfbe": "__setParameters(uint32,uint256,address)", +"15be2e7c": "totalSaleLimit()", +"15bef9cd": "changeMembers(address[],bool)", +"15bf2b51": "last10()", +"15bf430d": "Project()", +"15bf7cd7": "deployedPresaleContract()", +"15bf7ed2": "publicFundingPersonalEthLimit()", +"15c0251c": "getCoinWallet(bytes4)", +"15c12d4d": "totalWeiWon()", +"15c1c5b8": "EternaCoinContract()", +"15c2eed8": "RedlineFinancialLabCoin()", +"15c30006": "_payoutReferr(address,address)", +"15c32297": "setCanTrade(address,bool)", +"15c3cd94": "canTransferUST(bool,bool)", +"15c43aaf": "contractInfo()", +"15c4dc29": "MOSToken()", +"15c560c7": "addTotalInvoiced(address,uint256,uint256)", +"15c5c950": "isProcessedTx(bytes32)", +"15c6b117": "CRPA()", +"15c6b40a": "cloneFeePercentage()", +"15c73afd": "resolveEmergency()", +"15c7ff34": "isPaidUntil(address)", +"15c8276d": "_supportsInterface(bytes4)", +"15c83cac": "getNewItemId(address,bytes32)", +"15c8d628": "normalBuyLimit()", +"15c91115": "pbkdf2(bytes,bytes,uint256)", +"15c98193": "getCampaignCreator()", +"15ca41c3": "notarizeHash(uint256,bytes32)", +"15ca65f0": "purchase(uint256,uint256,uint256,address,bytes)", +"15cab9c0": "pre_active_time()", +"15cb75e3": "replaceChiphash(uint256,bytes32)", +"15cbfdc1": "SpendingBlockedEvent(address)", +"15cce224": "setFeeToken(address)", +"15cd8e0b": "SECOND_PHASE_MAX_SPAN()", +"15ce09ad": "winningTimestamp()", +"15cec355": "_escrow(address,uint40)", +"15cedef7": "TFCPTest(uint256,string,string)", +"15cf4a5f": "createElection(string)", +"15cf59b6": "getCreatefeeWindowIdValue()", +"15cf7a35": "fechVoteResultForCandidateBySnapshotBlock(address,uint256)", +"15cff546": "isOperationBlocked()", +"15d10f38": "decreaseICOcap(uint256)", +"15d28e11": "totalLendingAmount()", +"15d2fc8a": "setPreIcoEndsAt(uint256)", +"15d3b5d8": "getTotalAllocation()", +"15d3cfe2": "EtherCashPay()", +"15d3e0a3": "transferToSafe()", +"15d3f614": "Bet4Land()", +"15d42327": "testMulMod(uint256,uint256,uint256,uint256)", +"15d44202": "resultsValidationStep()", +"15d494c4": "test_chain2_1_increaseTimeBy5000()", +"15d4c5d5": "proposeMint(address,uint256)", +"15d4f2df": "_internalTransfer(address,address,uint256,uint256)", +"15d51761": "partner2_will()", +"15d5219f": "calLoanAmount()", +"15d53d7d": "_existPublicKey(address)", +"15d655c9": "claimPrice()", +"15d6af8f": "winnerList()", +"15d707af": "KD0Token()", +"15d7085f": "calcRankFundsFee(uint256)", +"15d7811e": "findYforX(uint256)", +"15d7b2c4": "setVestingManager(address)", +"15d7bf44": "register(bytes32,bytes32,address)", +"15d85401": "QbaseTalk()", +"15d87dc4": "vendorVerify(address)", +"15d887a7": "confirmedTotalToken(bytes32,uint256)", +"15d99a77": "CleanSweap()", +"15d9a9ee": "registerBarcode(bytes32,bytes32,string,bytes32,string,bytes32,bytes32)", +"15d9ad50": "illiquidBalance()", +"15d9aefd": "TeaToken()", +"15da0b02": "setCommunity(address)", +"15da42dc": "airdropSEEDSinWei(address[],uint256)", +"15da63a0": "thirdStagePriceOfTokenInWei()", +"15da65a5": "currentQuestionId()", +"15dacbea": "transferFrom(address,address,address,uint256)", +"15dae03e": "getType()", +"15dbfe28": "fromReal(int128)", +"15dc806e": "getStageBonus()", +"15ddf344": "getWhitelistStatus(address,bytes32,uint256,address)", +"15de4607": "getOwnFashions(address)", +"15de8027": "getAquaTokenAudCentsPrice()", +"15deaa3f": "INTARO()", +"15df1a09": "_fromToken(uint256,uint256,uint256)", +"15dfaccd": "delAdministrator(address)", +"15dff3b3": "RoleLookup()", +"15e04206": "Strings(string,string,uint8,uint256)", +"15e1146b": "deadlinePreIcoTwo()", +"15e1c65c": "added_to_the_bank()", +"15e28700": "addTokenPairWhitelist(address,address)", +"15e3187d": "amIBeneficiary(address)", +"15e33901": "digest(bytes,uint256)", +"15e3ab3a": "nccToken()", +"15e3d37d": "getAllCardsForClaim()", +"15e5ae1e": "Killer()", +"15e5c69e": "_purchase(address,uint256)", +"15e70102": "myTarif()", +"15e812ad": "getBaseFee()", +"15e82e87": "Free_vote_for_candidate_B()", +"15e839c1": "setHeroGenes(uint256,uint256)", +"15e89927": "JAR(uint256,string,uint8,string)", +"15e9c2d4": "PainPoints()", +"15e9fc28": "setBets(uint256,bytes32[])", +"15ea426d": "hasUserWon(uint8,uint256,bytes32,bytes32)", +"15eaef6b": "tokenTransfer(address,address,uint256)", +"15eaf224": "getlastJadeProductionUpdate(address)", +"15ed6d06": "totalBondSupply()", +"15ed97c5": "_preValidateAssign(address,uint256)", +"15ee1255": "overrideCharPrice(uint256,uint256)", +"15ee3726": "createMesa(uint256,address)", +"15eec1b6": "setPayerString(string,string)", +"15ef29c3": "configureTokenParams(string,string,uint256)", +"15efc893": "confirmAdminTx()", +"15eff89b": "DiamondToken(string,string,uint8,uint256)", +"15f063f7": "totalStores()", +"15f06ede": "placeBuyOrders(uint256[],uint256[])", +"15f0c220": "marketingAllocation()", +"15f17902": "updateCeleb(uint256,string,uint256[6],uint256[6])", +"15f2226e": "removeAccessor(address,address,address,string,uint32,string,string,bytes32,bytes32,uint8)", +"15f24053": "getBorrowRate(uint256,uint256,uint256)", +"15f28c5f": "walletB()", +"15f2e1bf": "getFunderCount(bytes32,string)", +"15f2e2f7": "LOCK_START_TIME()", +"15f2eb87": "getNumEndableGames()", +"15f2fe4f": "setDelegadoDeDistrito(bytes32,bytes32,uint8)", +"15f3161f": "issue(address,uint256,uint32,uint32)", +"15f3223c": "assertHash(bytes32,bytes32)", +"15f570dc": "burn(address,uint256,string)", +"15f59033": "setPropertyLastUpdaterLastUpdate(uint16,address,uint256)", +"15f5ea17": "stop_auction()", +"15f647fc": "setLoanProductActiveState(uint32,bool)", +"15f667ca": "phase2TokenSold()", +"15f73331": "invalidateName(string)", +"15f78c0c": "GetBank()", +"15f84d25": "isActiveContributor(address)", +"15f903a3": "setNameValue(uint256)", +"15f92e3b": "getBeat(uint256)", +"15fa168a": "setVerificationRate(uint64)", +"15fb1a65": "slashPower(address,uint256,bytes32)", +"15fb2185": "adminSetAdmin(address)", +"15fbba7a": "delPokemonFromMaster(address,uint256)", +"15fdf660": "mPerSellData()", +"15fe3b6c": "testTransferAfterFinalize()", +"15ff8f3c": "RESERVE_PORTION()", +"16002f4a": "totalAuctions()", +"16011bf1": "addReader(string,address)", +"1602a124": "allowMinting()", +"1602c424": "purchaseRect(uint256,uint256,uint256,uint256,uint256[])", +"160344e2": "startLottery()", +"16035ba0": "getTotalVolumeEth()", +"16038be8": "mintVestedTokens(address,uint256,uint64,uint64,uint64,bool,bool,address)", +"1603c521": "opensourceFundManager()", +"1604901b": "getGameByID(uint32)", +"1604a127": "calculateBetOutcome(uint256,bool,uint256)", +"1604c449": "numTilesClaimed()", +"1604f9ea": "requestPrice()", +"1604fa4d": "checkIfProjectExists(bytes32)", +"1605750d": "addToWhiteList(address,address)", +"1605782b": "sha1(bytes)", +"16059170": "onSubCanceled(uint256,address)", +"1605a889": "DecenterHackathon()", +"1605bc07": "SVDelegationV0101(address)", +"1605dd61": "getAddressBySymbol(string)", +"1606a1c9": "getAuditReportIPFS(address,bytes32)", +"1607dd9d": "distributeSpecial(address,uint256)", +"160849a7": "participateICONow(address,uint256)", +"1608e93f": "dice(uint256,uint16)", +"1608f18f": "disableTransfers(bool)", +"16090250": "getPolicyDetails(bytes4,address)", +"1609a397": "unhaltsTrades()", +"1609b182": "ReputationToken()", +"1609bbbf": "BarimCoin()", +"1609bdf2": "EEMWallet()", +"1609be1d": "sweepTokens(address,address)", +"1609e43b": "levelStartupTimestamp()", +"160a453e": "queryTokens()", +"160a7925": "getPermissions(address)", +"160abc9d": "tier1Rate()", +"160b01a1": "childTokenByIndex(uint256,address,uint256)", +"160b313d": "addAssociatedAddress(uint256,address,address)", +"160c5239": "read_total_global_purchased_today()", +"160d5240": "_toNanoNIL(uint256)", +"160d66ae": "voteToken()", +"160dc0ac": "buyItem(uint256,address,string,string,string)", +"160e3f3d": "grant(uint256)", +"160e915f": "canAcceptPayment()", +"160f202f": "send_ETH_from_contract_to_me()", +"160fc374": "cancelOrder(address[3],uint256[3],uint8,bytes32,bytes32)", +"160fe0e2": "getWtotalEth(uint8)", +"1610b59b": "infoFields(bytes32)", +"1610c734": "bonusLimit5()", +"16114acd": "recoverTokens(address)", +"161181ea": "getUserLengthOnToken(address)", +"1612ec4f": "applyToken(address)", +"1613520f": "priceTLP1()", +"1613ec9d": "getInitFunction()", +"161448df": "BossContract()", +"16145311": "ISAO()", +"161593a3": "landmarkToApproved(uint256)", +"1615d035": "airdropWallet5Pct()", +"1615e11d": "DARK()", +"16163c89": "encodeBool(bool)", +"16164467": "findRequiredSubscriberIndex(address)", +"16164b33": "icoTarget()", +"16164e15": "setInvestorData(address,uint256,uint256,uint256)", +"161666eb": "calculateAddress(uint8)", +"1616f54a": "FOURTH_TIER_SALE_START_TIME()", +"16173f39": "sin(int256)", +"1617adf7": "periodITO_softCapInUSD()", +"16180e8e": "reallocation(uint256)", +"16181a48": "insert(address,string)", +"16181bb7": "shortSellShares(bytes32,uint8,uint256,uint256)", +"16188c79": "isBadToken(address)", +"161895eb": "startBuy()", +"16192d2a": "accountInformation(address)", +"161965d9": "getRN()", +"1619fc14": "initOraclize()", +"161b5e46": "transferOwner(address,address,uint256)", +"161b75b2": "returnRemainingTokens()", +"161b9f5e": "ControllerManager()", +"161c389a": "NewImage(uint256)", +"161c8594": "setKpopArenaContractAddress(address,address)", +"161d2a59": "approveCertificate(bytes32,bytes32,bytes32,bool)", +"161dc300": "mintForSampleRegitry(address,uint32)", +"161fc5b3": "StartNewMiner(address)", +"161ff662": "proxyTransferFromWithReference(address,address,uint256,bytes32,string,address)", +"16201c24": "updateLastActive(address)", +"16205a7c": "RateDelivered(uint256,uint256,uint256)", +"162094c4": "setTokenURI(uint256,string)", +"16210e25": "verificationHoldersVerifierAddressMap(address)", +"16212265": "closeAirdrop()", +"16216f39": "return13()", +"16220188": "AddToWhiteList(address)", +"16222950": "golemFactory()", +"162255e1": "m_frozen()", +"1622dbe4": "buy(address,uint256,uint256,uint256)", +"16233f3f": "withdrawMortgageTokens(address)", +"1624288d": "balanceOfTokens()", +"16243356": "end_time()", +"16244907": "changeAnimal(uint256,uint256,bytes32,uint8)", +"1624f6c6": "initialize(string,string,uint8)", +"16260713": "isFrozenByAddress(address)", +"1626315c": "purchaseNew(uint256,string,string,uint256)", +"16265694": "validRateDurationInBlocks()", +"16265b4e": "isDatasetRegistred(address)", +"16266fbc": "returnPays()", +"1626ba7e": "isValidSignature(bytes32,bytes)", +"1626fe64": "checkApprovalStatus()", +"16270f7d": "ownerIndexBit(address)", +"1627540c": "nominateNewOwner(address)", +"16277952": "userLoveLocks(address)", +"16279055": "isContract(address)", +"1627c3c1": "divForTeamEthContract()", +"1627d3f2": "createToken(string,string,address,address,uint8)", +"16281405": "buyXaddr(address,uint256,bytes32)", +"162856f5": "_emitOracleRemoved(bytes4,address)", +"162897c0": "sendUnsoldTokenToRewardSupply()", +"16291032": "setQualifiedPartner(address,uint256,uint256)", +"162927b6": "approve(uint256,address,uint256,uint256,address)", +"162a8e5f": "distributeTokensAfterIcoByOwner()", +"162bb373": "disableERC721()", +"162bc80c": "WithdrawTokens(uint256)", +"162bf1ee": "getBurnRequestAddressMap(uint256,string)", +"162cbefe": "AVAILABLE_AIRDROP_SUPPLY()", +"162d563d": "withdrawGNO()", +"162d7daf": "buyQST()", +"162dd6da": "takeEtherProfits()", +"162e2f6c": "reservationFromEthereum(address,uint256,uint256)", +"162e4fd0": "getFinalOutcomeByEntity(uint256)", +"16317946": "notifyTestimonial(address)", +"16317e7e": "setLiquidationThresholdPercent(uint256)", +"1631eb07": "unlockReward(address,uint256)", +"1632070c": "setRewardDivisor(uint256)", +"1632612a": "TrustEURO()", +"16328378": "precrowdsale(address)", +"16330c55": "setRafEnd(uint256)", +"163317c6": "fundAdvisor()", +"16339604": "_FIVETHOUSAND()", +"1634ab52": "transferCrt(address)", +"1635717c": "getInstruments()", +"1635e13c": "initBuilding(uint256,uint256,uint256,uint256,uint256,uint256)", +"16367c63": "earlyParticipantWhitelist()", +"163687ab": "defaultOperatorsByTranche(bytes32)", +"1636ed74": "gatewayOpened()", +"163740d1": "HieToken()", +"16381382": "getBetUint(int8,int8)", +"1638e70d": "DIETSweets()", +"1638f628": "calculatePayout(uint256,int256)", +"163935a8": "BlokTokenSale(address,uint256)", +"163aa00d": "lastRewardEthBlockNumber()", +"163aa631": "isIssued(bytes32)", +"163aba3c": "getQueryFee()", +"163c0351": "reserveTeam(uint256)", +"163c17b1": "goldFreeze(address,uint256,uint256)", +"163c4e3c": "CryptoGripInitiative(uint256,uint256,uint256,address)", +"163db71b": "totalDistributions()", +"163dba92": "setBlocks(uint256)", +"163ebd3a": "MainExchangeNM()", +"163eec78": "_addFundkeeper(address)", +"163ef5cb": "tgrSettingsPartProject()", +"163f6691": "getAttribute(address,bytes32)", +"163f7522": "isUserRegistered(address)", +"163f9b4f": "withdrawalOwner()", +"163fa64a": "setSkillPointCost(uint256)", +"163fa8af": "addInvestmentPackage(string,uint256)", +"164116f8": "_getPrice(uint256)", +"16413515": "tokenIdToData(uint256)", +"16419aa7": "slice16(bytes,uint256)", +"1641bced": "jackPotGameLockedToken(address,uint256)", +"1642fcca": "SZ(uint256,string,string,uint8)", +"16431c5b": "CreateANM(address,uint256)", +"16443801": "Zigilua()", +"16448c99": "allocateTokens(address,address,uint256)", +"1644b20b": "Bhinnekamint(address,uint256,uint256)", +"1644ed01": "isVolumeReached()", +"16450092": "totalCap()", +"16458d74": "show_Candidate_Victorious_in_Election()", +"1645f0cb": "_mintIdentityToken(address,address)", +"16468fe2": "mintEndYear()", +"164745c5": "presaleendTime()", +"1648371d": "bboBalance()", +"1648be60": "lockSupplierAndLockPosition(address,address)", +"1648f38e": "createExchange(address)", +"16495308": "setReceiver3()", +"16496a15": "onceAddTime()", +"1649b76d": "maxDexSize()", +"1649cdcd": "testGetItemStore()", +"1649d72b": "proposeNewNotary(address)", +"164a009e": "WHITELISTING_DURATION()", +"164ba24b": "Payments()", +"164c9bf0": "Trust()", +"164ce703": "useless(uint256)", +"164ceb70": "getTradeByReferenceCode(bytes32)", +"164d3f3a": "Redeem(string,string,address)", +"164e68de": "withdrawFees(address)", +"164f81c3": "confirmAddress(address)", +"164fa4ef": "withdraw_token(uint256)", +"1650533f": "distroyIssuerToken(uint256)", +"16511a67": "removeHodler(address)", +"16512624": "setAgonValues(uint256[5])", +"16514052": "setPropertyDAppContract(address,bool)", +"1651f29a": "redeemForAllFeeWindows()", +"16521a2b": "getGameJackpot(uint256)", +"1652a9d3": "StartPeriod(uint256,uint256,uint256)", +"1652b365": "Xenith()", +"1652e7b7": "getAssetData(address)", +"1653441c": "donate(string,string)", +"16534bfc": "SKRToken()", +"16537a85": "makeschoolToken()", +"1654474b": "submitSellOrderWithPosition(bytes32,uint256,uint256,uint64,bool)", +"16552393": "creatorAddr()", +"1655a451": "PotPayout()", +"1656df0a": "_5_avto(uint256)", +"1658d496": "TamasCoin()", +"16597742": "announceWinner(uint8)", +"1659aecc": "timeoutYEnabled()", +"165a0e03": "channelsLimit()", +"165b22c1": "claimNxc()", +"165b2644": "getDepositN(address,address,uint256)", +"165b9ad0": "MOMO_FOUNDATION_WALLET()", +"165c4a16": "multiply(uint256,uint256)", +"165c86df": "rewardsWithdrawalRecipient()", +"165ca484": "USDDigital()", +"165cfea3": "TheImmortals()", +"165d35e1": "getChainlinkToken()", +"165db404": "AdvisorsAndPartnersMinted(address,address,uint256,uint256)", +"165e2eea": "setFund(address,string)", +"165f7d38": "buyIntoSyndicate()", +"165ffd10": "restart(bytes32,bytes32)", +"16603758": "setUserCategory(address,uint256)", +"16618e61": "ICOweek3End()", +"16628014": "setBitcoinRate(uint256)", +"1662da6a": "setWhitelisterAddress(address)", +"1663f4ee": "SplitEqual(uint256)", +"166428c0": "PoolSubmitted(address,uint256)", +"16643430": "setRateEarlyStage4(uint256)", +"1664b9cf": "create(uint8,uint8,uint64,uint64,uint64)", +"16654268": "getName(address,address)", +"1665e6b3": "approveOrder_(address[7],uint256[7],uint8,uint8,uint8,bytes,bytes,bytes,bool)", +"1666b514": "RipeXToken()", +"16670bcd": "resolveDispute(uint256,uint256,uint256,uint256)", +"16671990": "minCapMain()", +"166728cb": "feesend()", +"1667504e": "updateTitleTransfer(string,string,string)", +"1667590d": "GenesisRewardPerBlock(address,address)", +"1667d763": "changeRegulatorStatus(uint8)", +"16685890": "huntingPrice()", +"1668603f": "PFXTestCoin()", +"16687369": "chargeProtocolFee(address,address,uint256)", +"16691869": "addClient(address,address)", +"16694dd9": "isReportingActive()", +"166a3952": "createVoter(address)", +"166bf1b0": "createC1(uint256)", +"166c4b85": "len(bytes32)", +"166d3bbf": "payOutJob(address,bytes32)", +"166d561a": "FatPeople()", +"166d91fd": "FOUNDATION_RESERVE()", +"166dc43e": "setManagementProxy(uint32,int256,address)", +"166e55d9": "computeStablecoinFee(uint256,address)", +"166eb4cb": "Put(bytes32,uint256)", +"166ee1de": "newIdentityL1(address,bytes32,bytes32,bytes32,bytes32,uint256)", +"16706514": "MyDice75()", +"16708bc6": "metadataSize()", +"1670cb6f": "oracleA()", +"1671055d": "etherollBeneficiaryAmount()", +"16713b37": "receivedTotal()", +"1671719d": "MINIMUM_LOCK_AMOUNT()", +"16730131": "addHpbNodeWithString(address,string,string)", +"16735925": "setAllowErc20OwnerClaim(bool)", +"1673f758": "FundTransfer(address,uint256,bool,uint256)", +"1674bade": "setMinDuration(uint256)", +"16754c55": "createArea()", +"1675f455": "tokenUri(uint256)", +"1676503e": "updateParameters(address,uint256,uint256,uint256,uint256,uint256)", +"16772492": "HngCoinSale(uint256,string,string)", +"16772b6a": "SentPrizeToWinner(address,uint256,uint256,uint256,uint256,uint256)", +"1677496d": "withdrawART(uint256)", +"16783ba7": "assertEq18(bytes18,bytes18,bytes32)", +"16786ae2": "createMineral(bytes32,uint256)", +"1679657a": "isTrustedBy(uint256,address)", +"167aee44": "rewardPoolShare(uint256,bool)", +"167d219e": "ROLEX()", +"167d3e9c": "SetOwner(address)", +"167dde94": "affirmationWithinLimits(uint256)", +"167ddf6e": "getArtwork(uint256)", +"167e7921": "setTotumAllocation(address)", +"167f66c0": "startOfDay(uint256)", +"167ff46f": "openSale()", +"16801d17": "getBattle(string)", +"1680a070": "setPlotDataMultiple(uint256[],string,string,string,string)", +"1680f70d": "transferlottery(address,uint256,bytes)", +"168110f3": "Tokens_For_Sale()", +"16812d5b": "retreiveFinalResult()", +"16815137": "Poge(uint256,string,string)", +"168179e2": "ESCBCoin(address)", +"16821349": "ETH_RECEIVED_MIN()", +"16829de5": "changeEthPrice(uint256)", +"1682fa59": "GetMaximumBet_Ether()", +"16831877": "BMICOAffiliateProgramm()", +"16842582": "createLottery(string)", +"1684844b": "registerNameXaddr(string,bool)", +"1684c715": "TaskCompletedEvent(uint256)", +"168656e1": "OwnerWithdrewERC20Token(address,uint256)", +"16868752": "buyTicketWithRef(address)", +"16870257": "getTileDescription(uint8,uint8)", +"16876976": "addrTeam()", +"16878b07": "activeVerifiers()", +"16879344": "commitPeriodActive(bytes32)", +"1687f112": "left54(uint256)", +"168936a0": "Remain()", +"1689eb38": "batchSendTokens(address[],uint256[])", +"168a80d3": "deleteAllTopics()", +"168b3c69": "CertificationDeleted(string,address,uint256)", +"168b4a53": "changeColorBlack()", +"168b6231": "getCoinIds()", +"168b912d": "numOfDeclaredPublicOfferingPlans()", +"168bb279": "insertAllowedTokenInternal(address)", +"168c8120": "COMMISSION_DIV()", +"168cd7ae": "tokenQuota()", +"168d71e5": "mediaTokensSymbol(address)", +"168e41e8": "getHash(bytes32,uint256)", +"168ecec5": "revokeOperatorByPartition(bytes32,address)", +"168f3260": "calculateMinPriceForNextRound(uint256,uint256)", +"168f788e": "reRollMove(uint256,uint256,uint256)", +"168fb79d": "RANGESTART_7()", +"16907c12": "updatePlanetLiason(uint256,uint256,uint256,string)", +"1691473c": "getProducts(address)", +"16915743": "proofLink()", +"1691d6cb": "checkIfFrozen(address,address)", +"16922822": "getWarriorOwners(uint32[])", +"16925ee2": "changeTradingEnabled(bool)", +"1692823d": "getViewDatasCount()", +"16928a44": "updateProjectDescription(string,bytes32)", +"16937d56": "addressMoneyBalance()", +"1693b85d": "allowDelegate()", +"16948e9b": "changeSettings(uint256,uint256,uint256,uint256,uint256)", +"169509b6": "getOraclizedIndices()", +"1695533d": "signLease(string,string)", +"16958c79": "registerBid(int256,int256,int256)", +"1695d97c": "removeRange(uint256)", +"16962849": "changeBalanceReplenishmentStorage(address)", +"16962bc1": "setAllocationClosed(uint256)", +"16962d7f": "_createKittyToken(address,uint256,uint32)", +"16963872": "tokenPriceInitial()", +"16967407": "getAdministrator()", +"1697283a": "getRequesterLock()", +"169742f6": "ebyteBalance()", +"16985349": "standardGrowthRate()", +"1698755f": "claimToken(address,uint256)", +"1698933d": "myStrongHand()", +"1698c7ff": "removeOrc(address)", +"16992af5": "answerCompare(bytes32,bytes32)", +"16993811": "ptxHead()", +"16996713": "WXGToken()", +"169a7c3a": "eventWebsite()", +"169b15fa": "TechZU()", +"169b7012": "userToAccounts(address,uint256)", +"169b9890": "signByGroom()", +"169bd52d": "MyTestToken(uint256,string,uint8,string)", +"169bf233": "reportDoubleSpend(bytes32[],bytes32[])", +"169c13ed": "pendingTransaction(address)", +"169c4733": "feeForOrder(uint256,uint256)", +"169d16f4": "authorizerTwo()", +"169dc72c": "MBEToken(address,address,address)", +"169e18d9": "currentHitTotal()", +"169e2633": "tokenOwnerAdd(address)", +"169ea2f8": "dropCoins(address[],uint256)", +"169f66df": "monetarySupervisor()", +"169fab66": "TIXToken(address)", +"169ff375": "RANGEEND_2()", +"16a0390b": "BountyAmount()", +"16a0ea3c": "totalLockedSupply()", +"16a11ae5": "testFailPullWithoutTrust()", +"16a124e8": "setKeys(uint32,int256,bytes32,bytes32,uint32)", +"16a25cbd": "ttl(bytes32)", +"16a27019": "allowedAddr()", +"16a2a0cc": "setBountyFactory(address)", +"16a398f7": "effectiveBalance(address)", +"16a3feca": "_canOperate(address)", +"16a50228": "minLimitPublicFirstSale()", +"16a5290c": "purchaseWeapons(uint256,uint256,uint256,uint256)", +"16a54085": "setSideBetPercentage(uint256)", +"16a5410c": "Joined(address,uint256,uint256)", +"16a558d0": "_generateRandomhashNumber(uint256)", +"16a69a9a": "getDiscountStage()", +"16a7859b": "listService(uint32,string,uint256,uint256,address,address)", +"16a8e046": "setLuckThreshold(uint256)", +"16a92f39": "getDocByIndex(string,uint256)", +"16aa8508": "_leftSupply()", +"16aab1bf": "fundingEndTimestamp()", +"16aabcbd": "onlyAdvisorsCanDoThis()", +"16ab2b03": "getBid(address,uint256)", +"16ab4b17": "checkPoolsEnd()", +"16abdf7d": "setB(uint8)", +"16ad42ad": "holderList(uint256)", +"16ada547": "time()", +"16ae10f5": "USD_SOFT_CAP()", +"16ae4ec4": "FT_OPERATIONAL_FUND()", +"16ae5607": "KakToken(address,uint256)", +"16ae7944": "UpdateRateAgent(address,address)", +"16aee925": "saleDuringRestrictedPeriod()", +"16af001c": "calcBonusAt(uint256)", +"16af87a9": "getSavedReferral(address)", +"16afdf8e": "release(address,address,uint256,uint256)", +"16afe218": "setarg_1(uint256)", +"16b07323": "winsReported()", +"16b08755": "minorEditsAddr()", +"16b0c11e": "upgradePrefixPreSignedSecond(uint8,bytes)", +"16b0cc2d": "Extend(uint256,uint256)", +"16b0dc06": "getCitizenLevel(address,address)", +"16b0fc55": "removeAdmin(address,string)", +"16b14e19": "SingularityTest34()", +"16b15135": "getEscrowCount()", +"16b1f6b3": "CROWDSALE_PHASE_1_START()", +"16b208eb": "_clearApprovalAndTransfer(address,address,uint256)", +"16b21dfb": "getLockAccount(address)", +"16b2cd34": "airdroptotal()", +"16b3299d": "printListOfBooks()", +"16b33e74": "shuffleNDecks(uint256)", +"16b3d4ae": "_approved(address,uint256)", +"16b40451": "changeRandao(address)", +"16b4e79c": "setCampaignPriceById(bytes32,uint256)", +"16b57509": "killBounty(uint256)", +"16b60f2c": "mintMAYToken(address,uint256)", +"16b64898": "GEN0_TOTAL_COUNT()", +"16b65fac": "BITXOXO()", +"16b66016": "tier1Timestamp()", +"16b6824c": "CryptoWarriorCore()", +"16b6c75b": "changePeriods(uint256,uint256,uint256,uint256,uint256)", +"16b6c7bd": "withdrawUnallocatedRestrictedToken(uint256,bytes32)", +"16b78191": "decrementValue()", +"16b7d8f2": "VIP_MINIMUM()", +"16b86ed8": "amountOfMeatInUnicorn()", +"16b87739": "setCrowdsaleActive(bool)", +"16b8aa6b": "secondStageDatetime()", +"16b96f05": "addTotalDividendPoints(uint256)", +"16ba7197": "WITHDRAW()", +"16baa937": "AddMinter(address)", +"16bac350": "overthrow(string)", +"16bac7e5": "lockBet()", +"16bb1f6a": "isOriginalRoundContributor()", +"16bb6c13": "setBaseToken(address)", +"16bdb7b6": "stage3_price()", +"16bf3537": "SocialMediaIncomeCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"16bf4657": "getNumPayments()", +"16bfe25c": "emergencyRefund()", +"16c05aa2": "depositMoney()", +"16c0acde": "CryptoStars()", +"16c12746": "getAllOwners()", +"16c19739": "getPosition(address)", +"16c1df06": "WorkerPool(address,string,uint256,uint256,uint256,address)", +"16c24739": "uintInArray(uint256,int256,uint256[],uint256)", +"16c27c4a": "UNITSimplePaymentGateway(address)", +"16c3002e": "allowanceForContract(address)", +"16c38b3c": "setPaused(bool)", +"16c393a6": "oraclizeBytes()", +"16c45c7a": "areStringsEqual(bytes32,bytes32)", +"16c4fcbb": "gotransfer(uint256)", +"16c519ee": "hasRecentPrices(address[])", +"16c5792d": "transferCurator(address)", +"16c6ec92": "ChangeTarget(bytes32,address)", +"16c6f470": "addNewRaz(uint256,uint256,uint256,uint256)", +"16c72721": "forked()", +"16c72861": "nextFrontWindowAdjustmentRatio()", +"16c7f79f": "testTransferTokenAllowanceAndReturnFunds()", +"16c85710": "buyMasternode()", +"16c9b08d": "WenWanCoin()", +"16ca3b63": "increaseApproval(address,uint256,bytes)", +"16cac8c7": "Why(string)", +"16cb9100": "ETHER_MIN_CONTRIB()", +"16cb9a01": "assertFalse(bool,bytes)", +"16cba9d3": "checkEtherBalance()", +"16cbf987": "changeMemberGroup(uint256,string)", +"16cc7699": "getHistoryRecord(uint256)", +"16cc9022": "_newWallet(address)", +"16cd84c1": "AltCrowdsalePhaseOne(address,address,address,address)", +"16cdf170": "CoinTransfer(address,address,uint256)", +"16ce8a69": "setBuilding(uint256,uint256)", +"16ce8c98": "changeBiteCost(uint256)", +"16ceaa95": "getStageCount()", +"16cf1651": "setArbiters(address,address[])", +"16cf8f77": "createDroid(uint256)", +"16cff09c": "ETHER_MAX_CONTRIB_PRIVATE()", +"16cff511": "setFunctionFivePrice(uint256)", +"16d05042": "finalLoser()", +"16d061a5": "gettime()", +"16d0ba10": "putOwner(bytes32,uint256,address,bool,string)", +"16d190e3": "maxWin()", +"16d2bc5c": "getPlayerRoundInfoByID(uint256,uint256)", +"16d390bf": "addOwner(address,address)", +"16d3aa92": "removeTransferRate(address[])", +"16d41a5a": "setNFTContractInfo(string,string,string)", +"16d45615": "test_0_ensureDefaultRulesSetToFalse()", +"16d4c77c": "removeBlockeddUser(address)", +"16d4db19": "teamCompanyLock()", +"16d544f1": "resetActive()", +"16d63f17": "simFirstObligation(bytes)", +"16d64127": "_setReserveHolders()", +"16d6be4c": "buyOfferedStakes(address,address)", +"16d873cf": "TransferOddEther(address,uint256)", +"16d8b5a2": "ferromContract(uint256,string)", +"16d8f16c": "updateTentativeWinningPayoutDistributionHash(bytes32)", +"16d9356f": "oraclize_query(string,string[4])", +"16d93f3d": "getAddressAnswerKeccak256(uint256)", +"16d960b5": "createThing(bytes32[],bytes32[],uint88)", +"16d99cb0": "NewContribution(address,uint256,uint256)", +"16da1d50": "transferdissolvedFrom(address,address,uint256)", +"16da7d91": "reorganize(uint256,address)", +"16dabbf6": "getWalletSetting()", +"16db5172": "getStaker(bytes32,address)", +"16dc9704": "numberOfVestedContracts()", +"16dd68b1": "getFirstAuctionsEndDate()", +"16ddcef5": "WillCoin()", +"16de035a": "EtherBB()", +"16dfae3c": "setGenaroDevMultisig(address)", +"16e02e2a": "inventoryLocked()", +"16e10d6a": "ICOInvestorsAmount()", +"16e1286d": "BEXToken()", +"16e17852": "TAO()", +"16e1aed4": "setPartitionControllers(bytes32,address[])", +"16e242ca": "burnTotalSupply(uint256)", +"16e27349": "getFeeRecipient(int256,int256)", +"16e32d82": "_burnPlayerTokensFrom(address,uint256)", +"16e33aa2": "getData_27()", +"16e3cad0": "HAYATO_MAX_CARGO()", +"16e3cfc7": "testStoresUser()", +"16e457f0": "sellAll()", +"16e4822b": "calculateEarning(address,bytes32,uint256,uint256,uint256,uint256,address,address,bool)", +"16e4f677": "UpdateICOAddress(address)", +"16e55626": "getDogName(address)", +"16e58a1b": "detach(uint32,uint32)", +"16e7371f": "LiquidDemocracyController(address,address,address,uint256,uint256,uint256,uint256,uint256)", +"16e74f09": "getWinner(uint256[])", +"16e7c80d": "getTierStartAndEndDates(address,bytes32,uint256)", +"16e807c4": "addBid(address,uint256,uint256)", +"16e82dcf": "MMaker()", +"16e85b2e": "scapeHatch()", +"16e8f2c4": "Rectangle(address,address)", +"16e93702": "addTeam(bytes32,bytes32,address,bytes32)", +"16e9fe81": "resetValue()", +"16ea0728": "totalBuriedValue()", +"16eb6603": "right50(uint256)", +"16ebd6d5": "devResWithdrawal()", +"16ebf77d": "revealConsensus(address,bytes32)", +"16ecc686": "setup(address,address,uint256,uint256)", +"16ece9db": "GetContributionInfo(uint16,uint16)", +"16ed2ae4": "ONE_TOKENS()", +"16ed36fb": "EscapeHatch()", +"16ee94bf": "giveArraywords(string)", +"16eea70f": "RaffleResult(uint256,uint256,address)", +"16eebd1e": "launcher()", +"16ef376b": "getPhase(uint256)", +"16eff85d": "sendRefund(address,uint256,uint256,uint256)", +"16f0115b": "pool()", +"16f0e221": "configTimeMax()", +"16f25d16": "LindaCrowdsale(uint256,uint256,uint256,uint256,uint256,address,address,address,address,uint64,uint64)", +"16f33fc2": "getLockupCell(address)", +"16f36d74": "withdrawEtherHomeLocal(address)", +"16f38b63": "heroAsset()", +"16f3cb5e": "__kill()", +"16f4acf8": "changeHolder(uint256,address)", +"16f4d022": "tier()", +"16f573e6": "addtoblacklist(address)", +"16f60f5f": "SPIKE()", +"16f898fe": "LogCompanyTokensTransferred(address,uint256)", +"16f8e09b": "privateSaleEtherCap()", +"16f9ce49": "_slotCommitNew(address)", +"16fa2f7f": "getUsernameByAddress(address,address)", +"16fa99be": "totalSuplay()", +"16fc1a0b": "FaFengToken()", +"16fc1e64": "resetCreateShareToken()", +"16fc68cb": "PrivateSaleBuy(address)", +"16fcdb84": "minBuyPrice()", +"16fd381a": "settleBet(uint256)", +"16fd48a1": "ThreesigWallet()", +"16fd9869": "DepositProjectProfit()", +"16fed3e2": "receiverAddress()", +"16fef995": "sundown()", +"16ff1c76": "appreciateTokenPrice()", +"16ff5b87": "getNumProjects()", +"16ff83bf": "setLedger(uint256)", +"17011011": "BookERC20EthV1()", +"17019fb4": "givePoint(uint32,int256,address,bool)", +"1701feaa": "GobizToken()", +"1702ef0c": "getProposalOrganization(bytes32)", +"17031f9c": "advisersPeriodLength()", +"170381fe": "setIcoContractAddress(address)", +"17038cb2": "partialForwardFunds(uint256)", +"1703a018": "quorum()", +"1703b7fd": "eth4DivsOwing(address)", +"1703c11a": "setFundManagementContract(address)", +"17040713": "WithdrawRequest(address,uint256)", +"1704c271": "getShipCount()", +"170594c6": "totalTeamSupply()", +"1705a3bd": "migration()", +"17075992": "lastThreads(uint256)", +"1707e05a": "loanRequested(bytes32[8],bytes,bool,uint256)", +"170815ff": "InTokenTest10(uint256,string,uint8,string)", +"17089563": "rand(uint256,int256,int256)", +"1708a723": "setRootAddress(address,address)", +"1708d725": "unregisterFromPool(address)", +"1708f617": "gasPriceForOraclize()", +"170ab405": "setSize(uint256)", +"170ad53c": "totalUnclaimedTokens()", +"170b0782": "setSystemAddress(address,address)", +"170b99d9": "trivial()", +"170bdb36": "inPermissions(address)", +"170c28a2": "burnlvlToken(address,uint256)", +"170e1dcb": "bountyVault()", +"170e2070": "unfreezeAccounts(address[])", +"170e6d4c": "getLuckynumber()", +"170eb245": "secondTeamWithdrawal()", +"170eeb0f": "investmentRefunded(address)", +"170ff3e1": "addExtension(address)", +"171060ec": "setLocker(address)", +"17111edb": "DevvotePrefundClosed()", +"1712193f": "_requireERC721(address)", +"17124ed9": "LogCratePurchase(address,uint256,uint32)", +"1712649b": "rlc_reserve()", +"17126586": "getOwnerPercentage(address)", +"1712a72f": "ProofPresaleToken()", +"1712c489": "setDates(uint256,uint256,uint256)", +"17135b7b": "transferTokents(address,uint256)", +"17140bcf": "isSecond(bytes32,uint8)", +"1714b0c5": "testContract(uint256)", +"17154004": "checkIfRefundAvailable(bytes32)", +"17155659": "createBadge(string,string,string)", +"17158228": "signupUserWhitelist(address[],uint256)", +"1716b7f0": "longTermBudgetAllocation()", +"1716f47e": "getCurrAmount()", +"171755b1": "getQuote()", +"1717bb12": "VoxelPlaced(address,uint8,uint8,uint8,uint8)", +"171827e9": "tokenTransfertoKYC(address,address,uint256)", +"17183ca3": "maxCallFrequency()", +"17186ca3": "GetLastBetUser(address)", +"17191704": "refundToken(uint256)", +"17193854": "SetAngelCardDataContact(address)", +"1719b727": "_getTokenAmount(uint256,uint256)", +"1719d726": "stopBallot()", +"171c0077": "compare(uint8,uint256)", +"171d833c": "test_twoValidEqAddress()", +"171d9243": "TokenOfEightSilver()", +"171da314": "showPendingAdmin()", +"171dde3f": "devsTokens()", +"171dfb4f": "target_hit()", +"171ef0b2": "exchange_rate()", +"171efc3f": "refreshWaitPairBetIDsByCancelBet(uint256)", +"171fc143": "controllerLocked()", +"171fcb5a": "revealNumber(address)", +"17203e1d": "makeProfit()", +"1720684a": "whitelistBonusClosingTime()", +"1720ce1f": "addTxToRegistry(bytes32,uint256,uint256,uint256)", +"172110b4": "getCountTransactions(address)", +"1721117b": "UpgradeabilityProxy()", +"17214a8a": "GenesisInitialSupply(address)", +"17216484": "genericSender()", +"17219f03": "Ehfirst()", +"1721ebba": "mokenNameExists(string)", +"1722a8b0": "rateAngelDayEnd()", +"172325c7": "refundDuration()", +"17235779": "Tutorial()", +"1723934d": "setAvailableSupply(uint256)", +"17241962": "Zerk()", +"172419a8": "getCapByStage(uint256)", +"1724cf8a": "isCARegistered(address)", +"17255086": "blackjack(uint256,uint256)", +"1725b847": "voteAgree()", +"1725d8aa": "getOwnedShipAtIndex(address,uint256)", +"1726cbc8": "releasableAmount(address)", +"1726d2c5": "getRefPercents(uint256)", +"172727c0": "lastCheckBlockNo()", +"17274abd": "setBtcTokenBoughtAddress(address,address)", +"172775ef": "generateOrderWithPayeeByAdmin(address,address,address,uint256,string,string,string)", +"172820de": "KaliToken()", +"1728ac68": "SPTOKEN()", +"1728dd43": "GameFinished(address)", +"1728fb46": "ROLE_LOCKUP()", +"172960d4": "LogWhitelistAdd(address)", +"17299c04": "setDisputeFee(uint256)", +"172a735c": "updateDocumentPoll(bytes32)", +"172a9438": "ArsenalvsManCity()", +"172ab60c": "getPositionFromHolding(uint256)", +"172ac1ea": "isInvoice(bytes32)", +"172b319d": "GOOLA_UNIT()", +"172b95e1": "get_transaction_by_row(uint256)", +"172c453b": "setInventory(address)", +"172c61e6": "totalAdoptedAxies(uint8,bool)", +"172c9a0e": "inspire(address,uint256)", +"172cf717": "left55(uint256)", +"172d8a30": "setDirectorLock(uint256,uint256)", +"172e0456": "set_property_contact(uint256,string,string,string)", +"172e1e52": "priceView()", +"173029d7": "derivePayoutDistributionHash(uint256[])", +"173067a3": "priceStart()", +"1730e216": "setStartLockPeriod(uint256)", +"17324249": "playNumber(uint256[])", +"17324543": "nationalitiesOf(address)", +"1733043f": "getAllChildIds(bytes32)", +"1733cbb5": "ConfirmationNeeded(bytes32,address,uint256,address,bytes)", +"1733fea0": "SKYST()", +"17342859": "batchSetApprovalForAll(address[],bool)", +"17342d36": "init(address,address[],uint256[],address,string)", +"17349ad5": "TokenDecimals(uint256)", +"17356c22": "getVirusLength()", +"17367bc8": "VDN(uint256,string,uint8,string)", +"173817b6": "checkSellerOffer(address)", +"173825d9": "removeOwner(address)", +"1738c3ff": "removeVendorById(uint256)", +"17393f04": "PURCHASE_DIVIDER()", +"173975aa": "SetENGCommunityAddress(address,address)", +"173a0615": "Dealer()", +"173a21f8": "changeWethContract(address)", +"173a2b5c": "proposalAmount()", +"173a48a4": "distributeFUDD(address[],uint256,uint256)", +"173a4b70": "newProposal(address,uint256,bytes32,string)", +"173a705f": "transmitStatus()", +"173c9d27": "batchTransferForDifferentValues(address[],uint256[])", +"173cb7de": "getNumReleasesForNameHash(bytes32)", +"173d2795": "train1(uint256)", +"173d6ca2": "tier1Reached()", +"173dbd4e": "GoCryptobotCoinCore()", +"173dc741": "addBonusToUser(address,uint256,uint256,uint256)", +"173e49b7": "BoomstarterToken(address[],uint256)", +"173ea238": "changeBtcOracle(address)", +"173ea341": "isPrivilegeAddress(address)", +"173f22f0": "rmin(uint128,uint128)", +"173fc012": "preSignedCheck(bytes8,address,address,uint256,uint256,uint256,uint8,bytes)", +"173febeb": "Send69Wei()", +"17409b42": "registrarAlumno(uint256,string,string,string)", +"1740b479": "gameManagerSecondary()", +"1741526f": "getContractPayout()", +"17415d50": "_deleteRequest(address,address)", +"1741c48e": "getNextPoliceNode(address)", +"17421c8c": "withdrawAmountToken(address,uint256)", +"17431634": "LevelUp(uint256,uint32)", +"17436b1e": "RoundOpen(uint256,uint256,uint256)", +"1744215a": "EIP20()", +"1744cfe4": "GetLoansLenght(bool)", +"1744d5a5": "StageBonusUpdated(uint256,uint256)", +"17453358": "date01Oct2018()", +"1745422c": "addTx(address,uint256,string)", +"174609f8": "UNC()", +"17462891": "proofOfShit()", +"1746bd1b": "getGameInfo()", +"17473975": "breakDurationBetweenPresaleAndICO()", +"1747af0d": "AdminOwnershipTransferred(address,address)", +"1747b48b": "Reveal(uint256)", +"1747dfd4": "ContractPlay()", +"17484b0c": "RSOC()", +"17490da8": "modifyTrialDeadline(uint256)", +"1749bdf1": "getClassRank(uint32)", +"1749c16f": "isEnded(uint16)", +"1749e462": "getOwnersTokenList(address)", +"174a363a": "getpro(uint256)", +"174a6277": "getTxDataBlockNumber(address,bytes32)", +"174a84d8": "BetComplete(bool,uint256,uint256,uint256,address)", +"174b0093": "createDefaultGen0Zodiac(uint256,address,uint256,uint256,uint256)", +"174b9fa4": "getCurrentDayDepositLimit()", +"174c2002": "burnAndDist()", +"174cd9b3": "lastBlock_a19()", +"174dcea8": "getBalanceAndHolderByIndex(uint256,address)", +"174e7d55": "isReadyToAction(uint256)", +"174efd12": "minBidValue()", +"174f51eb": "winOdd()", +"174fa48e": "distributeBTCG(uint256,address[])", +"1750f564": "newProposal(bytes32,address,uint256,uint8,uint256,bytes)", +"1751dc90": "createMultiplePhoenixes(uint256[],uint256[],uint256[])", +"175207b7": "_readBlockBeneficiary(uint256,bytes)", +"17528c7f": "ReceiverAddressSet(address)", +"175323a8": "contributeETH()", +"1753a655": "singBy(address)", +"1753d61c": "AirdropToken()", +"175466ee": "proofVerifyFailed()", +"17548962": "SPTI()", +"17549ff0": "lovelock_price_LOV()", +"1754bd8e": "minerState(uint256)", +"1754de57": "sendleftmoney(address,uint256)", +"1755ff21": "poolAddress()", +"1756ffd9": "addMonsterClassBasic(uint32,uint8,uint256,uint256,uint8,uint8,uint8,uint8,uint8,uint8)", +"17570e80": "logReportingParticipantDisavowed(address,address)", +"1758078b": "trader()", +"175892b4": "previligedSubApproval(address,address,uint256)", +"17597b0f": "getLockedAmount_contributors(address)", +"175a0061": "install()", +"175a8bf4": "MigrationAgent(address)", +"175b0284": "closeChannel(uint256)", +"175b859d": "Bitwincoins(uint256,string,string)", +"175baaf1": "accrual(uint256,address)", +"175beead": "advisoryTokens()", +"175c6709": "TransferStatus(address,bool)", +"175c8640": "ZEEX()", +"175c9885": "POSSCOIN()", +"175d27e0": "MONTH_IN_SEC()", +"175ebfc7": "AdoptionOffered(bytes5,uint256,address)", +"175f6d9c": "JustAnIndex1()", +"17602ddf": "isFlowerAuction()", +"1760705f": "setAssetContract(address)", +"1761af6d": "upgrade(address,address,address,address,address)", +"1761eab4": "buyLong(address[2],uint256[5],uint8,bytes32[3])", +"17623c41": "isAllowedToParticipateNow()", +"17623e5b": "unauthorizeManager(address)", +"17634514": "creationBlock()", +"17634ec8": "freezeAccounts(address,bool)", +"176416ed": "getVotesBetween(uint256,uint256,uint256)", +"1764250a": "verifyWithdrawSignatures(uint256,address,address,uint256,bytes,bytes)", +"17645315": "migrate_participant(address)", +"1764dc3d": "GiveTokenPerm(address,address,bytes32)", +"17653b6e": "setChainRoot(address)", +"17655f6c": "transferOtherERC20Assets(address,uint256)", +"17659a1d": "Undelegate(address,uint256)", +"1766f424": "unsoldAllocationDelay()", +"17671962": "calcTotalWinnerKeys(uint256)", +"17674544": "deleteEntry(string)", +"17674e4d": "logMarketMigrated(address,address)", +"17676e4c": "valueSet(string,bytes)", +"1767da08": "addBalanceForOraclize()", +"176854f6": "setLastJadeSaveTime(address)", +"176898c9": "setRefundStatus(bool)", +"1768b436": "ETCSurvey()", +"1768fd6f": "getMaxLockAmountAllowedByLtd()", +"1769511c": "fidaTokenAddress()", +"1769af29": "removeFromOwnerlist(address)", +"1769d552": "indexextend()", +"1769f049": "fee_balance()", +"176b0eac": "gcStartTime()", +"176b63f4": "seedSourceA()", +"176b6742": "EtherFlip()", +"176b866f": "alterBankBalance(address,uint256,bool)", +"176cd40a": "PUBLIC_OFFER_SUPPLY()", +"176d0780": "createMicroWallet(uint256,uint256)", +"176e5f32": "withDrawMoney()", +"17700f01": "disableTrading()", +"17701ee6": "mission()", +"1770616c": "tier3LOT()", +"17711a46": "setTokenTimelockFactory(address)", +"1771b7dc": "bids_burned_count()", +"1771d4d4": "setAliasPrice(uint256)", +"1771ece6": "updateHouseFee(uint8)", +"17727a00": "withdrawCapital()", +"1773234b": "kscBatchBurnWhenUseInSidechain(address[],uint256[],string)", +"17733eac": "yank(address[],address[])", +"177378f0": "testRegularBuy()", +"17738cef": "placeEMONTBid(address,uint8,uint256)", +"177413da": "bet(bytes32)", +"1774218e": "CRAToken(address)", +"17743338": "MakeClaim(address)", +"17749a16": "adminRefund(address,address)", +"1774df3e": "distributeMAGGIE(address[],uint256,uint256)", +"1774e646": "setUint8(uint8)", +"1774f6c6": "confirmPurchase(uint256,address,address)", +"17753c44": "DIGTREX()", +"17759493": "TotalPoSRequests()", +"1776683e": "payDev(address)", +"1776b437": "countInvestorsRefundedInCrowdsale()", +"177766e6": "getOptionChain(uint256)", +"17776b86": "ExhibitToken()", +"1778f1df": "ICOStartDate()", +"177a9e9d": "refundFor(uint256)", +"177b3010": "registerProject(string,string)", +"177b979e": "initiatecontract()", +"177bd86e": "syncSubscriptions(address[],string[],uint256[])", +"177c75ae": "offerIndexedPieceForSale(uint256,uint256)", +"177cf218": "UNIX_DAY()", +"177cfaa2": "teamTwoShares()", +"177d8ee4": "emitSkillsSet(address,uint256,uint256,uint256)", +"177dc9e5": "getCompte_15()", +"177dcde9": "_transferTokens(address,uint256)", +"177e0f71": "setLockedWalletReleased(address,bool)", +"177e6ae4": "ETHERFLEXCrowdsale(address,address)", +"177ea52d": "buyTokensSigned(address,bytes,uint256,uint8,bytes32,bytes32)", +"178003e1": "BCTopCraftCannabis()", +"178021e3": "saleFee()", +"1780eb18": "charityFundations(uint256)", +"17813d37": "BitGCoin(uint256,string,uint8,string)", +"178228f1": "enterGame(address,uint256)", +"1782a789": "removeContact(bytes32)", +"17834d36": "isReachedHardCap(uint256)", +"178394bd": "LockedUnsoldTokens(uint256,address)", +"178407ca": "Board(address)", +"178450bd": "EbocoinToken()", +"1785478c": "_preValidatePurchase(address)", +"1785f53c": "removeAdmin(address)", +"1785f8dd": "PreTgeDisable()", +"1786351b": "AllbesticoContract()", +"1786e362": "orderTokensOf(address)", +"1787119c": "spendlarge(uint256,uint256,uint256)", +"17880b67": "getTotalBorrowingMonsters()", +"17888efc": "projectTokens()", +"1788de80": "enableTokenTransfers()", +"17897fcd": "RedRabbitToken()", +"178a8c8d": "accountsHolding(uint256)", +"178a8f34": "lotIdsByAddress(address)", +"178a9e2e": "tixGenerationContract()", +"178a9ffb": "HarborCrowdsale(uint256,uint256,address,uint256,uint256)", +"178ab6bb": "startICOStage8()", +"178af534": "createTokensWithoutReffer()", +"178afb39": "setSalesState(bool)", +"178b6de6": "getAllTokens(address)", +"178b8baf": "printCoins(uint256)", +"178b9d1a": "closeTicket()", +"178c02e9": "prometheusSoldCount()", +"178c17f0": "_createRandomNumber(bytes32,uint256)", +"178c4e40": "proof_of_public_key1()", +"178cec5c": "setBAU(bytes32,address,uint256)", +"178e6079": "APP_ADDR_NAMESPACE()", +"178ef307": "numberOfTokenHolders()", +"17904743": "bitpaintingStorage()", +"17905b2a": "Taur()", +"1790bd17": "contributorIndexes(uint256)", +"179101a6": "DECoin()", +"17916537": "clearDistributionDetail()", +"179194e1": "Bitnova()", +"1791cf01": "arr(uint256,uint256,uint256,uint256,uint256)", +"1791db21": "tokenMult()", +"1792b0bc": "transferTokens()", +"1792cc61": "tokenDecimalPlaces()", +"1793140a": "setO1(address)", +"179381d8": "setICOController(address)", +"1793b0f2": "addRecord(bytes32,string)", +"1793c314": "lastChance(address,address)", +"1794164b": "killcontract()", +"1794a463": "changeDevFees(address)", +"1794bb3c": "initialize(address,address,uint256)", +"17958e75": "omegaToken()", +"17961d0f": "ord()", +"17968fc9": "doPurchase(address,uint256)", +"1796b2ca": "unspent_supply()", +"17974399": "changeWithRef(address,address,uint256,uint256,address)", +"1797552b": "approveansCall(address,uint256,bytes)", +"1797814e": "IADOWR()", +"1797ec8a": "totalCrabTraded()", +"17986d83": "setRefferalFee(uint256)", +"17993e2f": "IREC()", +"17997878": "totalOwned()", +"179a5480": "masterresellercontract()", +"179ac197": "setOraclizeContract(address,address)", +"179b1b70": "LogFinalize(uint256)", +"179b51b1": "lotteries(int256)", +"179b73da": "killBoardProposal(uint256,address)", +"179c537e": "setSaleContractDepositAddressVerified(address)", +"179d375c": "addToken(uint256)", +"179dd216": "calculateMarketPixelPrice(uint256)", +"179dfbf3": "getBettingStatus()", +"179e91f1": "tokensLockedAtTime(address,bytes32,uint256)", +"179ee8bb": "acceptLoan(address,address)", +"179ef331": "nameRegistered(bytes32,address,uint256)", +"179fc99f": "etherBalanceOf(address)", +"179ffe76": "getMovie(uint256)", +"17a081bf": "queryTimestamp(uint40)", +"17a23ec6": "TOKEN_scaleDown(uint256,uint256)", +"17a2aaa4": "WithdrawalPremature(address,uint256)", +"17a2c026": "setCampaignEndDateById(bytes32,uint256)", +"17a3a329": "GLBX()", +"17a40e92": "updateAsset(address,bytes32,bytes8,uint256,string,string,address[2],uint256[],bytes4[])", +"17a432f5": "getActualPriceOfCardOnCraftAuction(uint256)", +"17a523c1": "useInsurance(uint256)", +"17a5d4df": "minTransactionAmount()", +"17a5f8cc": "createRatePlan(string,bytes32)", +"17a601b5": "MAX_STACK_DEPTH_REQUIREMENT()", +"17a650cc": "enter_square(uint256)", +"17a66006": "stageBaseRate()", +"17a689f3": "SuperSkyNet()", +"17a7cd10": "weeksFromCreation()", +"17a7eb4c": "vote02NoCount()", +"17a7f4cc": "feedOnKitty(uint256,uint256)", +"17a7f53e": "PriceHKGChange(uint256,uint256,uint256)", +"17a7f9b2": "countOfAddresses()", +"17a87b80": "changeInitialPrice(uint256,uint256)", +"17a950ac": "actualBalanceOf(address)", +"17a96982": "pullBounty(uint256)", +"17aa2899": "toB32(address,bytes)", +"17aaaea7": "BaseAltCrowdsale(address,address,address,address,bool,uint256,uint256,uint256,uint256,uint256)", +"17aad447": "FOUNDERS_LOCK_START_TIME()", +"17ab6cbb": "getRedCards()", +"17ac195a": "devTokensWallet()", +"17ac410f": "mintedtokens()", +"17ac896c": "GlobalBusinessSystemToken()", +"17adeb7c": "setClientProviderUID(address,uint256)", +"17adfa08": "confirmOneBuy()", +"17ae1f6c": "commission1()", +"17ae1fc5": "getIsActive(address)", +"17ae5d88": "unPreIco()", +"17af4d8a": "removeRoleAll(string)", +"17afa8a3": "set_refererPercent(uint256)", +"17afd19a": "decrementDID(address,address,uint256)", +"17b2e350": "deletePermissions(address,address[])", +"17b3a34b": "_addIdentities(uint256,bytes32[])", +"17b3c7ea": "getAllProposalVotersAndVotes(uint256)", +"17b4c4d3": "META()", +"17b54069": "setRoundOne(bool)", +"17b591e5": "closeContract(bytes32,bytes8,uint256,uint32,string,uint32,uint32,uint64,uint64,bytes32)", +"17b5f729": "_getAuctionIdArray(uint64,uint64)", +"17b65ae6": "hasEmployerMinRating(address,address,uint256)", +"17b75be6": "setBigICOStopped(bool)", +"17b7c328": "OpenPollCoin()", +"17b83aa6": "getSaleContractDepositEtherMax(address)", +"17b88dd7": "NEC(address,address)", +"17b98723": "isAuraSet(uint256,uint256)", +"17b9a28e": "calcWinner(uint256,uint256,uint256,uint256)", +"17b9e89c": "sumHardCapPreICO3()", +"17ba169a": "HybridEXToken(address,uint256)", +"17ba86af": "OpenContentIndex()", +"17bb0532": "AdminAddressChanged(address)", +"17bbcb6f": "newInvest(address,uint256)", +"17bd1251": "txsThreshold(uint256)", +"17bd5956": "withdraw_token(address,address,uint256,uint256)", +"17bd927c": "testNewCounterValueAfterADecrease()", +"17be3fa5": "lockToken(address,uint256)", +"17be85c3": "getEntries()", +"17be89f0": "createTradeContract(address,uint256,uint256,bool)", +"17bf2671": "PDOne()", +"17bf8f50": "sendTokenFromDex(address,uint256)", +"17bfdfbc": "borrowBalanceCurrent(address)", +"17c0b0f9": "Escrow(address,uint256,address)", +"17c163e9": "ROLE_STATE_LOCK_PROVIDER()", +"17c201a1": "getRemainingMineSupply()", +"17c208a0": "EtherGirls()", +"17c24891": "completeInternal()", +"17c2d98b": "minSizeInvest()", +"17c2f390": "getNumberOfSuccessfulSteps()", +"17c3119b": "TeamAndAdvisors()", +"17c32a58": "latestPhaseNumber()", +"17c35e88": "deedName(uint256)", +"17c3925f": "encodeBillingMetadata(uint256,uint256,uint256,uint256)", +"17c39286": "getCars()", +"17c4c7bb": "getShipPriceById(uint256)", +"17c4f0a0": "autoReleaseTokenSaleJM()", +"17c4fcbf": "getExpectedGameSize()", +"17c51080": "getMyLockedFundsReleaseTime()", +"17c520f9": "CerttifyToken(uint256)", +"17c5838a": "stopMinting(string)", +"17c59204": "determinateWinners(uint256,string,int256,int256[],uint256,string,string)", +"17c5fed8": "emergencyWithdrawalRatio()", +"17c63141": "getCountSenderCities(address)", +"17c65aa7": "getMaxLossAfterTrade(address,uint256,int256,int256)", +"17c6ee4f": "PaidOut(address,address)", +"17c70de4": "initiationTime()", +"17c73612": "ItlyCoin()", +"17c73ff0": "COMMISSION_WALLET()", +"17c83ed4": "getBindAddressAccount(address)", +"17ca1a6d": "getCrystalsSummary(address)", +"17ca2e41": "addBlacklist(address,bool)", +"17ca7f63": "getMintMarketMakerApproval(address,address)", +"17cacc1e": "_beingVIP(address)", +"17cb6426": "totalPaidOut(address)", +"17cbe981": "ChangeShipSellMaster(address)", +"17cc4138": "lastUETCWC()", +"17cc67b9": "firstRoundICOStart()", +"17ccf6a0": "rate5()", +"17cd4d5a": "setEtherPriceInEuroCent(uint256)", +"17cd802d": "repayment()", +"17cdb812": "TEAM_VESTING_AMOUNT()", +"17cdbac0": "usedvalue()", +"17ce42bd": "addEntry(string)", +"17ce9aae": "getIsSecondPhaseByTime()", +"17ce9d68": "getMeshPointByName(string)", +"17cfd0d6": "house_edge()", +"17cfde55": "onSubUnHold(uint256,address,bool)", +"17d01716": "unregisterPair(address,address)", +"17d077af": "NamiPool(address,address,address)", +"17d0aa13": "TXOtoken(address)", +"17d18cd6": "_capOwO()", +"17d28620": "toggleTransferFor(address)", +"17d2e4e4": "realDevRewardWeight()", +"17d35f47": "setLocked(uint256)", +"17d3953f": "tmed()", +"17d48fc7": "getMigrationAccount(address)", +"17d4e24c": "EXT_COMPANY_STAKE_THREE()", +"17d51877": "cancelLine(uint256)", +"17d55d13": "timeLeftToBid(address)", +"17d5e4be": "testDrip(address,address,uint256)", +"17d60394": "Briant2Token()", +"17d6de15": "setSnapshotBalanceBatch(address[],uint256[])", +"17d70f7c": "tokenId()", +"17d7a154": "getShipTotalEarned(uint32)", +"17d7a47d": "sendOtherTokens(uint8,address,uint256)", +"17d7de7c": "getName()", +"17d8405a": "setUserAccount(bytes32,address)", +"17d86154": "setStartPrice(uint256)", +"17d8fd7a": "acceptedBookingfc(uint256)", +"17d928a7": "ClaimNFT(uint256,uint256,uint256)", +"17d94ad3": "isMinterAllowed(address)", +"17d9adb7": "stage_3_tokens_scaled()", +"17d9b4ab": "checkPromo(string)", +"17d9bfcb": "withdrawAndTransfer(uint256,address)", +"17d9c090": "isCharged()", +"17da485f": "getMiningDifficulty()", +"17db59a4": "dEthereumlotteryNet(address,address,address)", +"17dba48c": "GRAC2Coin()", +"17dbaf9b": "unlockFirst()", +"17dbe4f1": "burnPassportToken(address,uint256)", +"17dc86c5": "minWeiContribution()", +"17dc92f5": "cash(uint256)", +"17dd0873": "Winner(address,uint256,uint256,int256,string)", +"17dd4cc1": "getPreviousPrice(bytes32)", +"17de15ad": "GreHackCoin()", +"17de2f1f": "defaultOwner()", +"17dec7af": "distributionFixed()", +"17df1773": "StopIco()", +"17df5696": "finishPreSale4()", +"17df74f9": "availablePercent(uint256)", +"17df9a73": "findBid(address,uint256,bytes32)", +"17e01c95": "isClientBlocked(address)", +"17e04e55": "PoSatoshi()", +"17e0aeb8": "setPropertyEarnUntil(uint16,uint256)", +"17e0dfb2": "backAtIndex(uint256,uint256)", +"17e139a7": "lockedTokenHolder()", +"17e1b09b": "minimumDeposit(uint256)", +"17e1bfb7": "addInstitution(address,string)", +"17e22621": "joinGameWithInviterID(uint256)", +"17e2912f": "Amount_of_AOC_for_One_ETH()", +"17e30f6b": "TimeChainToken(uint256,string,string,address)", +"17e398a5": "seizedTokensWallet()", +"17e3f5fa": "callModifiedContractBalance()", +"17e49dc9": "ETH033()", +"17e50791": "FundsReceived(address,uint256,uint256,uint256,uint256)", +"17e51f21": "CrowdsaleController(address,uint256)", +"17e5259e": "ETH_MAX_LIMIT()", +"17e63b79": "centsPerMonth()", +"17e63bff": "setupICOPeriod(uint256,uint256)", +"17e6a087": "markFunding(address,uint256)", +"17e72721": "VLToken()", +"17e760bb": "votingAllowed()", +"17e7dd22": "getBooleanValue(bytes32)", +"17e875e3": "Transparancy()", +"17e95fbc": "releaseAdvisorsAccount()", +"17e9884d": "OG()", +"17ea0a46": "getalldeatil(uint256,uint256)", +"17ea4a79": "Took(address,uint256,uint256,uint256)", +"17eb85e3": "contractBoost(uint256)", +"17eba34d": "MIN_PRICE_IN_CENTS()", +"17ed31f4": "TIACOIN()", +"17edfb06": "trade(uint256,uint256,string)", +"17ee9c1d": "agreeProposal(address)", +"17eef4cd": "setTotalTokensForPublicSale(uint256)", +"17ef67c6": "setContract1(address)", +"17efa370": "SmartTokenController()", +"17f143e1": "supplyExponent()", +"17f19efb": "ZoarToken()", +"17f1d65b": "hasIcoPhaseOneEnded(uint256)", +"17f1ee05": "paySecurityPool()", +"17f3679f": "testGetMixItemStore()", +"17f46c15": "getVoucher()", +"17f5de95": "MAX_TOKENS_SOLD()", +"17f5f53a": "XYTTEST()", +"17f6252f": "PRESALE_PERCENTAGE_4()", +"17f6c712": "ObjectPurchase(address,address,uint256,uint256)", +"17f708fb": "removeWhitelist()", +"17f7a530": "_computeNextMinerPrice()", +"17f80c13": "releaseJoyToken()", +"17f8252e": "tokenOwnerNumber()", +"17f95eac": "approveCloser(address,bool)", +"17f992ab": "SECOND_VOLUME_EXTRA_BONUS()", +"17fa664f": "callerDel(address)", +"17faa66f": "transferOwnershipWithBalance(address)", +"17fab0a0": "info(string)", +"17face84": "withdrawCommission(uint256)", +"17fad7fc": "batchTransferFrom(address,address,uint256[],uint256[])", +"17fafa3b": "test_sub(uint256,uint256)", +"17fb44c1": "returnAmountPaidBackSoFar(uint256)", +"17fb4d66": "Destroy(address,uint256,address)", +"17fb6c6e": "approveRequest(uint256,bool,string)", +"17fc01bf": "LegendsCrowdfund(address,uint256,uint256)", +"17fc3f55": "angelGoal()", +"17fc91f8": "holdAmount()", +"17fccb47": "erc20TokensContractAddress()", +"17fd9cc5": "tradeWithInputFixed(address,address,address,uint256)", +"17fe375f": "getComments(address)", +"17fe5b79": "apolloSpecialTransfer(address,uint256)", +"17fe6185": "log(address,address,uint256)", +"17fe72bb": "setEnabled(address,bool)", +"17ff0caa": "WeatherBet(uint256,address,address,address)", +"17ffa830": "tixFounders()", +"17ffc320": "reclaimToken(address)", +"17ffd225": "KittyTrained(uint256,uint256,uint256,uint256[5])", +"17ffe171": "lock(address,address)", +"18004bba": "transferArrayBalanceForPreSale(address[],uint256[])", +"18005d93": "JinuToken()", +"1800c0fe": "extraTime()", +"1800e68e": "calculateTokens()", +"1800ed8e": "manager_address()", +"18015191": "transactions()", +"1801db43": "ExaCHF()", +"1801f00f": "newProposal(uint256,uint256)", +"1801f38e": "restart(uint256)", +"1801fbe5": "mint(uint256,bytes32)", +"1801ff10": "getAllContact(bytes32)", +"18024acc": "voteStartTime()", +"1802f969": "PokeCentral(address,address)", +"18037b78": "issuerJurisdiction()", +"18039230": "getPlayerGoodList(address)", +"180489ed": "Withdrawal(address,uint256,bytes)", +"18051c4a": "targetWei()", +"18054275": "executeSpins(bytes32,bytes)", +"180603eb": "registrationFee_()", +"1806874a": "amountLockedInVestings()", +"1806be68": "CompanyReserve(address,address)", +"1806cb4e": "getGiftSoldFromType(uint256)", +"180773de": "MAXIMUM_CONTRIBUTION_WHITELIST_PERIOD_USD()", +"1808c6b6": "setDividendsDistributor(address)", +"1808eeb8": "pending(bytes32)", +"180941f0": "setPredictions(int16,string)", +"1809549f": "updateAllComponents()", +"1809ced7": "sendEther(string)", +"180a3277": "sendDiary(address,bytes)", +"180a351b": "getByteFromByte8(bytes8,uint8)", +"180a42a3": "LifeSet_006()", +"180aadb7": "underLimit(uint256)", +"180afbf6": "DaxtherCrowdsale()", +"180b0d7e": "feeDenominator()", +"180b2607": "lastRelease()", +"180c0da6": "GlobalAssentToken()", +"180c0dfe": "maxBuyTokenAmount()", +"180c9309": "hasOracle(address)", +"180ca180": "CooperativeToken()", +"180cb47f": "GOV()", +"180da450": "addTierRateAndTokens(uint256,uint256,uint256)", +"180db1b4": "getErrno()", +"180dc318": "owners(uint32)", +"180ee30d": "forgivedChars(uint256)", +"180eebba": "accumulatedGasFees()", +"180f4c2c": "submitTotalBuyOrder(bytes32,uint256,uint256)", +"180f8f4f": "nextPrice2Of(uint256)", +"18117abb": "changeOwnerWallet(address)", +"18126325": "getOrganBlog()", +"18128ec7": "buyMorty()", +"1812982c": "fechAllForCandidate(uint256)", +"1812d2aa": "setBonusToken(address,uint256,uint256)", +"1812d996": "signature(bytes32,uint256)", +"1813b684": "preIcoEnded()", +"18158e6b": "BdpController(bytes8)", +"18159bf3": "_addSGCUsers(address)", +"1815ce7d": "setBackendAddress(address)", +"18160ddd": "totalSupply()", +"181670e6": "isApprovedOnceFor(address,address)", +"18167416": "officialGameUrl()", +"1816e794": "getMainsale()", +"18178358": "poke()", +"1817c5a7": "revokeGrant(address)", +"181a916b": "getKeys(address,uint256,uint256)", +"181aa1fd": "takeFee()", +"181b3bb3": "functionOne()", +"181b591a": "phase_4_bonus()", +"181be00d": "getValue(uint8)", +"181c8ef9": "enter(bytes8,address)", +"181d85eb": "internalRedeem(address,uint256)", +"181da773": "EosPizzaSliceDonationraiser(address)", +"181dcbcd": "setMaxConfig(uint256,uint256)", +"181e0124": "getRemainingTime(uint256)", +"181f1437": "permissibleWithdrawal(uint256)", +"181f1965": "fillSellOrderPartially(uint256,uint256,uint256)", +"181f4456": "setAuctionStart(uint256)", +"181f4477": "getLockedStructStartTime(address,address,uint256)", +"181fd85b": "cancelSale(address,bytes32)", +"181ffc5f": "GetGift(bytes)", +"182092a8": "ChangeSymbol(string)", +"1820b575": "Team(uint256,address,uint256)", +"1821cd93": "jackPotFunds()", +"1821e7c6": "acceptOffer(address,address,uint256)", +"1822b886": "createTradeOffer(bytes32,bytes32)", +"1822cbc5": "mintingIsAllowed()", +"1822f8db": "finishSafe(address)", +"18237476": "getAccountTotal(address)", +"18237e0c": "enableBuyback(uint256)", +"182439de": "claim_PreICOTokens(address)", +"1824461d": "administror()", +"18248f2a": "sendToken(address,uint256,address)", +"182493f2": "plantedOf(address)", +"182499fe": "ico_address()", +"1824a46b": "onUpgrade()", +"18253234": "ticketsAvailable()", +"182575f1": "authorizeFloor(uint32,address)", +"1825d0e8": "_mintCUSD(address,uint256)", +"18264f33": "startMigration()", +"1826fb35": "_calculateShards(int256,uint256)", +"1827caf4": "getInfoB(uint256)", +"1827edbc": "Reaper11()", +"18285e6b": "secondPlay(bytes32,uint8,bytes32,bytes32,uint256)", +"18287ef2": "executeOption(address,uint256)", +"18289482": "currentIcoPeriodStartDate()", +"1828983a": "authorizedUsers(address)", +"1828b254": "nextTicketPrice()", +"1828db82": "ownerPayout(address)", +"182930ce": "AddedToWhiteList(address,uint256,uint8,uint8)", +"1829b73f": "buyoutAmount()", +"182a7506": "setMinimumFee(uint256)", +"182ae5f2": "getVotesForItem(uint256)", +"182af96b": "regularEndGame(address,uint32,int256,uint256,address)", +"182b0b00": "checkChangeToReceive()", +"182b144c": "incrementBatch(address[])", +"182b434b": "newRequest(address,uint256,bytes32)", +"182d326e": "getTeamAddress()", +"182d709a": "scaleWeights(uint256)", +"182db370": "getWhatHappened()", +"182df0f5": "exchangeRateStored()", +"182e0c49": "totalUnrestrictedAssignments()", +"182e7533": "getBetResult(bytes32,bytes32,bytes32,uint256)", +"182e8a67": "changeGroupActiveStatus(bytes32,bool)", +"182e9a1e": "getOwnerVehicleDetails(address)", +"182ee07f": "setDistributionMinimum(uint256)", +"182ef78e": "getTMul()", +"182f67a3": "reservedWei()", +"18300c1a": "CappedMintableToken(uint256)", +"1830d69d": "IsGot(uint256[],uint256[])", +"1830f493": "getPermission(bytes4)", +"1832425f": "registerAddress()", +"1833198f": "makeMemChange2(uint256,uint256,uint256,int256)", +"1833a548": "changeGas(uint256)", +"1833b7c6": "changeMyAddress(address)", +"1833fa4c": "update(uint256,string,uint256,uint256,uint256,uint256)", +"18342c9c": "BettingCore()", +"1834906c": "thisContractAddress()", +"1834ef4e": "addMoneyToContract()", +"1835e57d": "VESTING_DURATION_4Y()", +"183651d9": "tokenApprovalWithSignature(bool,address,address,address,uint256,uint256,uint256,bytes32,bytes)", +"18369a2a": "initialBalance()", +"183718d1": "getCheckoutTime()", +"18384df2": "getMetadataOf(uint256)", +"1838daab": "getRealmSale(uint256)", +"1839a417": "_cancelEthOffer(address)", +"1839babf": "zGetGameBalance()", +"183a7947": "pregnantKitties()", +"183abe66": "testRewardSB(string)", +"183b3159": "getAssetBalance()", +"183bfb4f": "AddBankerProfit(uint8,uint256)", +"183c5901": "DigitalGold()", +"183d255e": "SetWhat(uint256)", +"183d4cf7": "CNT_address()", +"183df5ef": "test_invalidSuicide()", +"183f9bcf": "isQuorum(address[3])", +"183ff085": "checkIn()", +"184018c6": "awardHighScore()", +"1840f0ca": "countVotes(uint256)", +"184188f2": "setStopTransfer(address,bool)", +"18423074": "ShowerToken()", +"18433bb7": "DrawPrepare()", +"1844fef1": "roundTotalWinnings(address)", +"18456048": "auctusTokenAddress()", +"18469491": "lastPlayerPaid()", +"18469dfe": "canStartDispute(bytes32)", +"1846d125": "isGroupExists(bytes32)", +"18476db4": "newRandomValue(uint256,address,uint256,uint256)", +"18477799": "Touch()", +"1847c06b": "ids(address)", +"18489f50": "thingExist(bytes32[])", +"18494108": "doPayout()", +"1849bd6a": "ExecuteTrade(address,address,address,uint256,uint256)", +"1849cb5a": "get(uint80)", +"184a9ce1": "Log2_fnc(address,bytes32,uint256,string,string,string,uint256,bytes1,uint256,uint256)", +"184ad5ff": "VjuCoin()", +"184b1912": "minimum_goal()", +"184b9559": "init(address,address,address)", +"184bd394": "changeSaleAddress(address)", +"184c703d": "LogVoteInitiate(uint256,uint256,uint256,uint256,uint256,uint256)", +"184d009b": "teamNameIndex(string)", +"184d1a77": "acceptBid(int256,int256,int256,int256)", +"184d69ab": "isWhitelistEnabled()", +"184db3bf": "initErc20Deal(bytes32,uint256,address,bytes20,bytes20,address)", +"184e8549": "getPI_edit_31()", +"184fb2bd": "signOwnerCount(uint256)", +"184fd65e": "addMomRelation(address)", +"184ffd9d": "RATE_CROWDSALE_S2()", +"18501714": "clearJackpotParticipantsAfterDistribution()", +"185061da": "undoIt()", +"18507210": "templatesOfOwner(address)", +"185190f6": "addCustomerwithETH(address,uint256,uint256)", +"1851e59e": "Omnidollar()", +"18520be5": "EventBid(uint32)", +"18520de3": "sendFrom(address,address,address,uint256,uint256)", +"1852e8d9": "calculateReward(address,uint256)", +"1853d033": "GetAskingTokenBought()", +"1854229a": "REFERRAL_BONUS_LEVEL1()", +"1855e405": "managerOff(address)", +"1856a6df": "coupleImageIPFShash()", +"1856bc0f": "BuyGenesis(address)", +"1856c1dc": "main_sale()", +"1856e01b": "setVotingController(address)", +"18573bf9": "calculeReward(uint256,uint256)", +"18577f8d": "calVote(address)", +"18579ece": "clearances(address)", +"18584a5d": "hasAlreadyPlayed(address)", +"185870f9": "developerWallet()", +"1858cb5b": "verifyProof(bytes,bytes32)", +"185917c5": "distributeToFound(address,uint256)", +"1859b2d7": "getDStructData(address,uint256)", +"1859c8e2": "getUserTicket(uint256)", +"185a5671": "setTransferAddress(address)", +"185a6284": "discountedMiningTarget(address)", +"185a7daf": "FundingRules(uint256)", +"185b9067": "QuadCoin()", +"185c4279": "hardCapCHF()", +"185cc751": "loan(address,uint256)", +"185d1af6": "setUncirculatedSupplyCount(uint256)", +"185d9e79": "AOL(uint256,string,uint8,string)", +"185e00fd": "getDisputeStateText(uint256)", +"185e4a00": "getCurrCanRefund()", +"185e9969": "getContractDetails(bytes32)", +"185f23c4": "_arbitrationPercent()", +"1861355b": "transferMintOwnership(address)", +"1861cb28": "getNowVestingType()", +"1861e523": "testOwnerToken()", +"1862c10b": "withdrawBalancesToLogic()", +"1862caec": "firstStageMinting()", +"186415c0": "releasesollidaTeamTokens()", +"18643d37": "raffleLimit()", +"1864db71": "getCompetitionInfo(uint256)", +"18656a1e": "founderAmount()", +"18659adb": "starbitWallet()", +"1865c57d": "getState()", +"186601ca": "activated()", +"1866191a": "editDiscount(uint256,uint256,uint256)", +"186690b0": "broadcastMessage(string)", +"1866ae7d": "PayRollHistory(address)", +"1866f761": "ConstantaToken()", +"18671d23": "Auditor(address,address,address)", +"1867b937": "_bytesToBytes32(bytes)", +"1868291f": "getIp(string)", +"1868516d": "KMEToken()", +"1868c2a1": "computeSeed(uint64,address)", +"18695c4d": "DSToken(bytes32,uint256)", +"1869a084": "releaseLockedBalance(address,uint256)", +"186b6f05": "updateFallbackDeposit()", +"186b79c9": "isProviderInitiated(address)", +"186ba9de": "lastUnlockMineBalanceTime()", +"186bbb05": "getAppCode(bytes32)", +"186bcaf0": "ontology()", +"186c9b11": "issueTokens(uint256,address,uint256,uint8[],bytes32[],bytes32[])", +"186cd7d2": "card_black_first()", +"186d9ce8": "allowAvatarCreation()", +"186d9d88": "unblockAddress(address)", +"186db237": "ecosystemBuildingTokens()", +"186e378a": "CCH_EDIT_4()", +"186e4297": "charityCut()", +"186e7047": "forceAdvance()", +"186eb86b": "cnt_per_eos()", +"186f0354": "safe()", +"1870082d": "inviteCollateralizer()", +"187047b5": "LogUserAdded(address)", +"1870a73a": "totalNTD()", +"1870ad14": "setAddress(string,address,bool)", +"1870c10f": "donateAndCreateGiver(address,uint64,address,uint256)", +"18714bc8": "purchaseWithFiat(uint256)", +"18718656": "XENCToken()", +"1873355e": "Emoji()", +"18737e07": "Redeemed(uint256,address,address,uint256)", +"18758480": "worldContract()", +"1875aa22": "transferWhiteList()", +"1875ccf3": "setGlobalCompositionFee(uint256)", +"18760eb3": "RequiringAuthorization()", +"18764471": "ANTDToken()", +"1876d0a9": "astutelandToken()", +"1877fc8a": "quickSort(address[21],int256,int256)", +"1878265a": "Rent()", +"1878d1f1": "ETH_TOKEN_ADDRESS()", +"187958ac": "VOCToken()", +"18797499": "ENTERED_MASK()", +"18797c35": "emitAccountFrozen(address,uint256)", +"1879c2da": "NewSale(address,uint256)", +"1879dcf3": "MIN_TOKEN_PRICE()", +"187a62d5": "voteEmergencyWithdrawal(bool)", +"187ac4cb": "migrationManager()", +"187adf2e": "failsafe_subtract(uint256,uint256)", +"187b1f2a": "VOZToken()", +"187cba25": "issueNomins(uint256)", +"187cbdd2": "subWallets()", +"187d2371": "LOG_MaxInvestorsChanged(uint256)", +"187d3954": "getClaimableBalanceFor(address)", +"187d8803": "updateKoCommissionAccount(address)", +"187ecd37": "Open(bytes)", +"187ed86e": "ROE()", +"187f707b": "AdvertisementFinance(address)", +"187fac20": "setStartStage1(uint256)", +"187fd079": "MINI_GAME_TIME_DEFAULT()", +"18804b0d": "setDescriptionHash(bytes32)", +"1880692f": "getPublicKeyCount()", +"1881656b": "canSpend(address,uint256)", +"1881b0f0": "kycVerify(address)", +"1881f980": "read_i64()", +"18821400": "TOKEN_NAME()", +"1882d267": "liquidityFundAddress()", +"18836994": "get_allowance(address,address)", +"1883d2a4": "IUPToken()", +"1884c517": "registerWorkerAffectation(address,address)", +"18856694": "deny(bytes8)", +"1887af2b": "LogicBase(address,address)", +"18886657": "purchaseLimit()", +"1889500c": "marketplaceManager()", +"18896972": "isBuyFull()", +"18898452": "saleMinimum()", +"18899745": "AffiliateMarketing(address,uint256)", +"1889fc0a": "_preValidateReserve(address,uint256,address)", +"188a1d68": "getOuverture_des_droits()", +"188af657": "generateWinner()", +"188b5372": "generateToken(address,uint256)", +"188b81b4": "getGameEnd(uint256)", +"188c668c": "recordDealRefundReason(uint256,address,uint32,uint32,uint256,string)", +"188cad26": "referralTokensAllocated()", +"188d0aae": "buyAndCreateGame(uint256,uint256,address)", +"188dbc1a": "setAccountIsFrozen(address,bool)", +"188ec356": "getTimestamp()", +"188f1fee": "notifyObservers(address,address,int256)", +"188fdbdc": "commission_rate()", +"189048fc": "getAccountLevel(address)", +"189052ac": "_setFreezingPeriod(address,bool,uint256)", +"18911bbe": "ProdFToken()", +"1891381d": "setROI(uint256)", +"1891c701": "AssignOwnerToProject(int256,address)", +"18921de4": "addSignature(string,uint256[],uint256[],uint256[],bool[],uint256[])", +"1892c15a": "fwdPayment(address)", +"18940084": "_getDestinationTranche(bytes)", +"18942a33": "new_record(address,address,uint256)", +"18946e8f": "voteOnParameter(bytes32,int256)", +"18954b3e": "collectEstimation(int256)", +"18955b1e": "willThrow()", +"1895687d": "issueLoan(address,uint256)", +"18958959": "individualClaim()", +"1895e858": "resetWallet()", +"1896367e": "setBlockSze(uint256)", +"18968a03": "finalize(uint256,address,address)", +"1896f70a": "setResolver(bytes32,address)", +"18976fa2": "closeVault()", +"1897bcf3": "sellToken(uint256,uint256)", +"1898a1c7": "addVendor(address,string)", +"189959de": "EXPC()", +"1899f1ad": "setChargerAddress(uint256,address)", +"189a5a17": "nodes(address)", +"189ae13c": "numArbiters()", +"189af42f": "powsm(uint256,uint256)", +"189aff3a": "authorizedSupply()", +"189b11fc": "AddSeed(address[])", +"189b600c": "setNameHashByWriter(bytes32,address,bytes32)", +"189c94ae": "testFallbackStaticSig()", +"189ca316": "setVoteWeight(uint256)", +"189d165e": "setBurnRate(uint256)", +"189e688a": "ClaimDividend(address,address,uint256,uint256,uint256)", +"189eeebe": "isMembershipAllowed(address)", +"189f0197": "getPlayersPick(string)", +"189f4d34": "setMinUCCoinSellingValue(uint256)", +"189f9041": "mintCoreToken(address[])", +"18a08d2d": "TheTokenH()", +"18a0e773": "UnlockGrant(address,uint256)", +"18a17df1": "DataDump()", +"18a24b5b": "unlockToken()", +"18a30d16": "getResponse()", +"18a39c54": "payForward()", +"18a3aad2": "ReserveCoin()", +"18a4155e": "calculatePrice(uint256,uint256,uint256,address,uint256)", +"18a45c41": "_receiveFundsUpTo(uint256)", +"18a51621": "getReadableSupply()", +"18a54ecd": "mintTokenForPrivateInvestors(address,uint256)", +"18a6217d": "comments1()", +"18a66563": "AQI()", +"18a689aa": "getNamePicture(bytes32)", +"18a6bc32": "tokenDistributor()", +"18a6d58b": "addTokenTeller(address,uint256)", +"18a6d765": "BANKROLL_LOCK_PERIOD()", +"18a6dec5": "getCountTokensByGame(uint32)", +"18a727c5": "_withdrawDev(address,uint256)", +"18a7bad6": "setFreezeAdmin(address)", +"18a8fac9": "icoInvestment(address,uint256,uint256)", +"18a94030": "putStoWithBtc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"18a991f7": "setEmeraldPrice(uint256)", +"18a9cc1b": "isUser(uint256)", +"18a9f29f": "setMetadata(uint128,string)", +"18aaaa51": "registerTickets(uint256)", +"18ab8888": "paymentSortId()", +"18ab8c37": "timeToCalm()", +"18abb75c": "createLibraryBounty(string,string,address,uint256)", +"18abfdfc": "totalSupplyFromCrowdsale()", +"18ad052b": "safeTransferByContract(uint256,address)", +"18ad28af": "icoWasSuccessful()", +"18ae15e4": "DBC(uint256,string,uint8,string)", +"18ae19c2": "get(bytes32,uint256)", +"18ae21e8": "NuoYiLian(uint256,string,uint8,string)", +"18af26fe": "setRestrictedWallet(address)", +"18af4099": "PARALLELNETWORK()", +"18af5e74": "addressesDeposited(address)", +"18af7021": "force_refund(address)", +"18b03ceb": "remainderPurchaser()", +"18b0bdf7": "getMensaje(uint256)", +"18b0efb6": "isEmptyName(string)", +"18b123d5": "hasBeenApproved(address,uint256)", +"18b15e2a": "Ongo()", +"18b20071": "setCurrentPrice(uint256)", +"18b2739d": "giveEthJackpotAddress()", +"18b31f94": "registerLengthFunction(string,string,address)", +"18b322a4": "update_instant()", +"18b38777": "fuzexAccount()", +"18b3a119": "getCrowdsaleMaxRaise()", +"18b3b58b": "Hamza__Coin()", +"18b3c724": "forceRecoverCollateralOnBehalfOfRecurse(address,address,bytes32,address)", +"18b3cd45": "qwecoin()", +"18b40adf": "maximumCirculation()", +"18b437aa": "COMMERCIALPOINTCHAINSYSTEM()", +"18b49ba4": "AMPIToken()", +"18b4a702": "EPACOIN()", +"18b4a924": "week_max()", +"18b64d5b": "unmint(int256,uint256)", +"18b749c4": "payEther(uint256)", +"18b7bb11": "EthRoi()", +"18b7fed8": "deliverPresaleTokens(address[],uint256[])", +"18b8275a": "addUser(string)", +"18b919e9": "ROLE_WHITELISTED()", +"18ba4218": "countAssetEvents(bytes32)", +"18ba5cdc": "ownerAddToWhitelist(address,uint256)", +"18ba6973": "setTrainingFormulaContract(address)", +"18bb2edb": "maxRegistrants()", +"18bb7c08": "_setNameToAddress(address,string)", +"18bbedf4": "Bulletin()", +"18bc1558": "Th_stage2(uint256)", +"18bcd3d0": "transferOwnership(address[])", +"18bd21f9": "_purchase(uint256,uint256)", +"18bd387a": "level_referrals_count_by_address(address,uint256)", +"18bd5108": "stopCrowdsaleTime()", +"18bd710b": "NewGirl(address,uint256,uint256,uint256,uint256)", +"18bd8dcb": "ufoodoToken()", +"18bdb1b0": "StartdateICO()", +"18bdc79a": "payOwnerOnly()", +"18bdffbb": "verifierAddress()", +"18bee97e": "Creator()", +"18beeeb4": "redeemInternal(uint256)", +"18bf0225": "etherFundsOf(address,address)", +"18bffce9": "voteToResult(uint256)", +"18c0e04f": "purchaseStake()", +"18c10ad0": "disabled(uint256,uint256)", +"18c1d9b2": "bonusWallet()", +"18c1fc68": "buyOne(address,address,uint256,bytes)", +"18c20f44": "entrarAJuego(uint256)", +"18c26389": "multivestMint(address,address,uint256,uint8,bytes32,bytes32)", +"18c2d4c9": "initialSingleWithdrawMin(uint256)", +"18c306bd": "checkSignatures2(bytes32,bytes,bytes,bytes)", +"18c3cf34": "EthPriceProvider()", +"18c41a80": "mint(bool)", +"18c48e96": "bitRegisters(address)", +"18c53aca": "tokenIsComponent(address)", +"18c5bddc": "PRESALE_THIRD_DAY_START()", +"18c5e3af": "addInvestmentProposal(uint32,bytes24,uint256)", +"18c5e502": "GetTime()", +"18c8bda5": "Procare()", +"18c93884": "_setCrowdsaleStage(uint8)", +"18c9ef97": "mintETHRewards(address,uint256)", +"18caa857": "emitJobBinded(uint256,uint256,bool)", +"18cadf30": "getVATTransactionData(uint256)", +"18cc4c65": "startEngines()", +"18cd55f3": "canCreateGrants(address)", +"18cda1e7": "lockInternalAccount(address,bool)", +"18ce1a23": "BailOutToken()", +"18cee8a4": "setPlatformCommissionRate(uint256)", +"18cf1c25": "lookupDonation(uint256,uint256)", +"18cf85d1": "adminSetCityData(address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"18cfa483": "invalidate(address,uint256)", +"18d0073e": "startNextMilestone()", +"18d0122a": "upgradeAgentStatus()", +"18d0376c": "getFastGap()", +"18d0a7cc": "incentFundAddress()", +"18d0c322": "EtherLambosCore()", +"18d0eb93": "finalizeAndDistributeToken()", +"18d30bfa": "setLastMoveTime(uint16)", +"18d32128": "CLVRCrowdsale()", +"18d43f0d": "userTokensValues(address,address)", +"18d4b4b3": "COCCToken()", +"18d4d326": "SAFethToken()", +"18d4e834": "getPrivilegeState()", +"18d62bc6": "PHXFlip()", +"18d6676c": "entityStructs(uint256)", +"18d69faa": "StopDistrib()", +"18d74c37": "deleteShare(address)", +"18d760be": "LogFinalize(bytes32,bytes32)", +"18d76b78": "CCIToken()", +"18d78358": "ICOCENTRAL()", +"18d80168": "startUnitRaffle(uint256,uint256)", +"18d80d4a": "check_prize()", +"18d84553": "calculatePayout(bytes32)", +"18d8ec5b": "validateWinnersCount(uint32,uint32,uint32)", +"18d8f9c9": "erc677token()", +"18d92a5d": "getRegistryDataCustodian()", +"18d95092": "domainOwner(string)", +"18d97731": "setPriceStep7(uint256)", +"18da0011": "treasuryContract()", +"18da650d": "WithdrawalInterCrypto(uint256)", +"18da754a": "setBuyMinLimit(uint256)", +"18dad1cd": "multiTransferFromValues(address[],address[],uint256[])", +"18db02e1": "etherToLEONRate()", +"18db0750": "contributionReward()", +"18db62fb": "checkValue(uint256)", +"18dcdfbe": "isRetirementAllowed(uint256,bool)", +"18dd97f0": "secondStageTokensForSale()", +"18de0afd": "getEnabled()", +"18deb066": "init(uint8,uint256,uint256,uint256,address[2],address[],uint256)", +"18debd27": "addWalletAddressAndTokens(uint256,address,uint256)", +"18def2a1": "DistributedCreditChain()", +"18df0038": "getSwapType(bytes32)", +"18df02dc": "Migrate(address,address,uint256)", +"18df11ee": "SpendingApproved(address,address,uint256)", +"18df6090": "mintBountytokens(address)", +"18dfcf7b": "_investorCount()", +"18e01199": "burn(uint256,bytes,bytes)", +"18e02bd9": "setTokenOwner(address)", +"18e0d683": "getBAI(bytes32,address)", +"18e124e4": "upgradePackageCountOf(address)", +"18e146f9": "InvestmentPolicyChanged(bool)", +"18e2d679": "describeTile(int32,int32)", +"18e2e4be": "getInvestor(address,address)", +"18e37cdd": "ITGToken()", +"18e3b44c": "setMemory(uint256,uint256)", +"18e3d998": "crowdSaleEndTime()", +"18e45427": "whitelistedContract()", +"18e4ac35": "isConfirmed(address)", +"18e4c3f3": "GMOON()", +"18e4d2db": "_AIExchangeSupply()", +"18e536bc": "comissionList()", +"18e6ab9c": "funding(address,uint256,uint256)", +"18e75a1c": "PresaleEDUSupply()", +"18e7eb4b": "PRE_SALE_1WEEK_BONUS()", +"18e857ab": "queried(uint256)", +"18e9e7ab": "listSimpleService(uint32,string,uint256,address[],address)", +"18eacb96": "GetDivs(address)", +"18ebcc8c": "takeOrder(uint256,uint256[5],uint256[3],bytes32[3])", +"18ecc6f4": "getTotalDividendsRounds()", +"18ece632": "superApprove(address,address,uint256)", +"18edf434": "_revokeConfirmation(uint256,address)", +"18ee00b6": "_changeRate(uint256)", +"18ee1b9f": "WithdrawEther()", +"18ee9d5e": "EtherIncognito()", +"18eeef80": "Wallet1()", +"18ef7adb": "transferAdvisorTokens(address,uint256)", +"18f0db29": "remainingBettingFor(uint256)", +"18f11de2": "BSSCoin()", +"18f2217a": "EPXtokenSupply()", +"18f2a0bb": "ownersConfirmedTransactions(address)", +"18f303a1": "SetInternalValues(uint8,uint256)", +"18f3a50d": "cooAddress2()", +"18f3fae1": "setOversight(address)", +"18f61c0d": "configRunTime()", +"18f729da": "founderLockance(address)", +"18f76a2c": "getCCH_edit_3()", +"18f7d5ad": "lastBlock_f13Hash_uint256()", +"18f80bb9": "createContract(string)", +"18f839bd": "Expensive()", +"18f873df": "chAllowTransfer(bool)", +"18f889c2": "setOracleGasPrice(uint256)", +"18f9266c": "talks(bytes32)", +"18f95486": "openPendingPartCrates()", +"18f96441": "getShipDetails(uint256)", +"18f96857": "Lazadex()", +"18f9b023": "addPayee(address,uint256)", +"18f9bdee": "allocationOpen(uint256)", +"18fa11ab": "revokeRequestorAddress(address)", +"18fa223a": "GGCT()", +"18fb75f4": "callDeposit()", +"18fc6513": "companyCurrentPeriod()", +"18fd3474": "HumaniqICO(address,address)", +"18fd8903": "refund(address,uint256,uint256)", +"18fdcaba": "getSumAmountOfDisputedDealsProDoctor()", +"18fe1a8d": "banToken(address)", +"18fe3df7": "_buildInternalSalt(uint128,address,address,address,uint256,uint64)", +"18fed50a": "getLast4Bytes(bytes32)", +"18ff1361": "manualyMintTokens(uint256,address,uint256,int256)", +"18ff318d": "thorToken()", +"190038dc": "supplyAdjuster()", +"190042b8": "CARA()", +"19006185": "getNumRefundTransactions()", +"1900aabf": "CollectChips(uint256)", +"190108b5": "getAyantDroitEconomique_Compte_3()", +"19013cf2": "detachFromStorage(address)", +"190151c6": "_createNumber(uint256,uint256)", +"19018557": "COCToken()", +"19022f20": "TTT()", +"1902e902": "adjustEntitlement(address,address,uint256)", +"190377a5": "getCategory(string)", +"1903bbe0": "_getQueryStr(uint256,uint256)", +"1903c10e": "setPI_edit_3(string)", +"190406b3": "customExchangeSecure(address,address,uint256)", +"19045a25": "recover(bytes32,bytes)", +"19055df2": "preSaleTokenExchangeRate()", +"19058903": "NewPassProject(address,address,string,string,bytes32)", +"1905fbf6": "setNewWallet(address)", +"19062b8f": "settleTransaction(uint256)", +"190663e4": "setGreeter(string)", +"1906a3d6": "getBonusFund(address)", +"1906ff98": "getVotePrice()", +"19077dca": "resetOwnership()", +"1908c425": "m_leeway()", +"1909773f": "get_milestone_information(uint256)", +"1909787f": "NextMint(uint256)", +"1909d314": "GCPrightToken()", +"190a2688": "changePrices(uint256[3],uint8)", +"190a338f": "_createAccount()", +"190a597b": "restartCrowdsale(address,uint256,uint256,uint256,uint256,string)", +"190a6aa9": "burn(address,uint256,bytes,bytes)", +"190a8613": "getNodeLeftChild(bytes32)", +"190a867e": "testThrowNoPartialTokens()", +"190bc9d4": "w_Advisers()", +"190bfa4d": "singleDVIPQty()", +"190bfcd0": "initialTokenValue()", +"190bfea8": "sellWei()", +"190c23c4": "adminSetTxFeePaidGame(uint256)", +"190c69a2": "unWhitelistUser(address)", +"190d9253": "testInitialContract()", +"190e4c77": "numOfProperties()", +"190e8266": "makeProduct(string,string,uint256,uint256)", +"190eaaba": "getDenominator()", +"190ef61d": "readAnalyticsMap()", +"190f4cfc": "doCalculate(uint256,uint256,uint256,bytes32)", +"190fe712": "payoutETH(uint256)", +"19110d05": "DTCC_ILOW_8()", +"19113b4a": "changeStatement(string)", +"19123c1f": "magnitude()", +"1912f84f": "BONUS2_LIMIT()", +"191313ae": "EndOfPayments(address,uint256)", +"191347df": "setStr(string)", +"1913742f": "appendSchellingSupplyChanges(uint256,uint256,bool)", +"191384d1": "viewMessage()", +"19141100": "bankRollDivest(uint256)", +"1914427f": "MultiSigWalletWithDailyLimit(address[],uint256,uint256)", +"19154616": "FART()", +"1916037d": "withReferrer(address)", +"19162a30": "getYumWithETH(uint256)", +"19165587": "release(address)", +"1916fcb7": "Galaxy100()", +"191723ed": "lockBalance(uint256,uint256)", +"191797df": "isStoped()", +"1917ab5c": "activate(string)", +"1917e6d1": "addDoctor(uint32,string,uint16,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)", +"19190495": "SimulateCurrentDate(uint256,string)", +"1919cf62": "allEthShares()", +"1919fed7": "setSalePrice(uint256)", +"191ad190": "open_free()", +"191af4bc": "thirdroundprice()", +"191b548e": "VIVACrowdsaleRound(bool,uint256,uint256,bool)", +"191b8260": "_createScene(string,uint256[],address,uint256)", +"191be7b7": "getQueryResults(bytes32)", +"191d7a7a": "TVToken()", +"191d8cd7": "passToken(address)", +"191e2fc7": "setTokenizedRegistry(address)", +"191e39b3": "setOwnerCut(uint256,uint256)", +"191e521f": "moken(uint256)", +"191e8daa": "_getRand(uint256)", +"191f06e7": "setEscrowFactoryContractAddress(address)", +"192014f4": "buyKeyWithReff(string)", +"1920b2a6": "BitOnBayToken(uint256,string,string,uint256)", +"1920ed48": "isOwner(uint32,address,address)", +"19213471": "addFRA(address)", +"192159a6": "ListingCreated(uint256,uint256,uint256,uint256,address)", +"19216c4d": "getPreIcoInvestorsCount()", +"19216e8d": "freezeForOwner(uint256,uint256)", +"19218eda": "secondTokenExchangeRate()", +"192193b9": "transferFrom(address,address,int256)", +"1921c454": "priceChangeBlock()", +"19220c69": "TAKLIMAKAN()", +"1922936d": "RegisterTransferBeneficiaryContract(address)", +"1922e9b4": "getJobApprovals(uint256)", +"1922ff39": "payOut(address)", +"1923350f": "ADVISORS_TOKENS()", +"19236b4e": "getSanTimeAlive(uint256)", +"192399d1": "vestingBalance(address)", +"1923a4a3": "issuePercentToReserve(address,uint256)", +"1923e5d4": "noActiveBallotExists()", +"19240661": "setTrusted(address)", +"19245155": "StartedSafeUnlock(uint256)", +"1924f74a": "PVP_INTERVAL()", +"1925259b": "ShroomFarmer()", +"19254e2e": "getInsuranceStatus(address)", +"19261e6f": "setERC20ApproveChecking(bool)", +"1926b63d": "savePost(bytes32)", +"1926de89": "readInt256(bytes32)", +"1927a754": "drainEther()", +"1927a8ea": "listFiles(uint256,uint256)", +"19287f3a": "withdrawBalanceAll()", +"1928b3cb": "getPosition(bytes32)", +"19291c74": "getGoldStatusLastauditid(address)", +"192a4422": "safeWithdrawalAmount(uint256)", +"192b3092": "mintPreAllocatedTokens()", +"192b3608": "Bond(uint256,string,string,string,uint128,uint128,uint128,uint128,uint16,string,string,address)", +"192b663d": "vestSupply()", +"192b7700": "CitrusCrowdsale(address,address)", +"192d65c9": "getRoundByRId(uint256)", +"192e571d": "getPlayerByName(string)", +"192e7a7b": "releaseFunds(address)", +"192ecd68": "getDistrito(uint256)", +"192f1076": "crowdsaleEndDate()", +"193080cb": "getLockedContract(address)", +"1930fc01": "FastmarketNetwork()", +"193115b4": "changeHiddenOwner(address)", +"193118fa": "CPCCrowdsale()", +"193237f5": "_isValidSignature(address,address,bytes)", +"1932bb33": "lastBlock_a12()", +"19337d6c": "setLink(string)", +"193402bb": "PRE_SALE_PRICE()", +"1934d55a": "isPermanentlyApproved(address,address)", +"19350aea": "nameFor(address)", +"19354750": "setRegistryLogic(address)", +"1935f8d2": "Instacocoa(uint256,string,string,address)", +"19362921": "CONTRIBUTORS_SHARE()", +"1936a8cd": "getSeedByWinner(uint256)", +"1936dd8f": "writeMessage(string,string,string,string,string)", +"1936e4be": "advisor()", +"19375602": "challengeOwner()", +"1937714b": "confirmDeployment(uint256,address,bytes32)", +"1937b7fa": "Burnfrom(address,uint256)", +"1938a238": "softcapInTokens()", +"19397ed0": "Transfer(address,address,address,address,uint256,bool)", +"1939805f": "TPPC2018Token(uint256,string,string,uint256)", +"1939c1ff": "transfer(address[],uint256)", +"193a4249": "minFunding()", +"193a824e": "_escrow(uint256)", +"193a8a83": "getCCH_edit_28()", +"193ab829": "addGood(address,string,uint256)", +"193c114b": "transferTokensOut(address,address,uint256)", +"193c8da4": "AkikToken()", +"193c9be1": "getCreateShareToken(uint256)", +"193ccc20": "depositTokenToUser(address,address,uint256)", +"193d5b77": "getGiffBlock(uint32)", +"193df7ea": "addBlacklist(address,address)", +"193e06c4": "CalcPeriod(address,uint256)", +"193e6679": "MarginBanc()", +"193f69a1": "getPhaseBonus()", +"193fc711": "_getBeginIndexKey(uint256)", +"19404c2f": "replayAnserWithReferrer(uint256,uint256[],string)", +"1940a936": "isPregnant(uint256)", +"19424222": "approveAndCall(address,uint256,bytes32)", +"1942c3ce": "_transfer(uint256,address)", +"194307bf": "terminated()", +"19447eb6": "userStructs(address)", +"19449cb2": "changeAuthorizedCaller(address)", +"1944bc3d": "priceThresholds(uint256)", +"1946283a": "CarRegistrationFailed(uint256)", +"19465953": "changeInfo(string)", +"1946fdf4": "logicVersion()", +"19476244": "icoNumeratorPrice()", +"1947bd2f": "getMap(address)", +"194809a6": "finalistTeamFIFAIdsSet()", +"19483cd1": "checkHash()", +"19498426": "BOUNTY_REWARD_SHARE()", +"194a7adc": "CONNECT(uint256,string,string)", +"194b546b": "_addRec(uint256)", +"194b81d0": "TGxToken()", +"194c78d0": "setApp(string,uint256)", +"194c8e15": "Update_START_ICO_TIMESTAMP(uint256)", +"194d0de2": "createOrder(address,uint256,uint256,address,uint256)", +"194d297f": "canSend(bytes32,address,uint256,bytes)", +"194dee32": "setTokenForSale(uint256,address)", +"194e10ce": "run(bytes,uint256)", +"194e4acd": "reqvehreg(address,string,string,string,string)", +"194eb01c": "CimbomCoin()", +"194f4795": "getItemsLength()", +"194f8806": "setMigrationHost(address,address)", +"194f97ba": "setColorGreen()", +"194fe9a4": "transferWithBonuses(address,uint256,uint256)", +"195055f1": "isTransferable(address)", +"19507d2c": "allowedToTransfer()", +"19509649": "ImpactRegistry(address,uint256)", +"1950c218": "checkWhitelist(address)", +"1950ee41": "unlockPresaleTokens(address,uint256)", +"195199f6": "setDeadline(uint256)", +"1951f9ba": "isRequestPending(address)", +"19530f76": "multiTransferFixed(address[],uint256)", +"19547404": "sendTokens(uint256,uint256,address)", +"1954f39e": "EndDate()", +"195629de": "initMETToken(address,address,uint256,uint256)", +"195743fc": "claimSMRforAll(uint256)", +"19583b05": "modifyCollectorAddress(address)", +"1958623f": "BitcoinPluse()", +"1958ccb1": "setParams(address[],uint256)", +"195977a6": "emit(uint256)", +"1959a002": "userInfo(address)", +"195aa377": "SportsChainToken()", +"195ad926": "authenticate(uint256)", +"195b616c": "_unmountSameSocketItem(address,uint256,address,uint256)", +"195d06ff": "addBigPromoBonus()", +"195de8a1": "CapReached(address,uint256)", +"195e38b2": "EnergyModulationProject()", +"195e8688": "Osiris()", +"195ec9ee": "getAllParticipants()", +"195f4807": "getTotalPayouts()", +"195fa903": "ownersNum()", +"195fd221": "issueAmount()", +"19608123": "Vetricoin()", +"1960d761": "AccommodationCoin()", +"19617fe4": "coinBurnIco()", +"19618a9b": "testDivideFractional()", +"196198fa": "getDepositWithdrawCount(address)", +"1962d041": "SayadyToken()", +"1962df71": "_performTransferWithReference(address,uint256,string,address)", +"19638ca5": "CryptolifeToken()", +"1963a0d1": "OWN_freezeAddress(address,bool)", +"1963a693": "IncreaseAllowance(address,uint256)", +"1963df66": "dtGetWorldData()", +"1964569b": "Aktium()", +"19648bed": "batchSend(address,address[],uint256[])", +"1964dcbf": "SCCCOIN()", +"19656b46": "teansferFrom(address,address,uint256)", +"1965e183": "MIN_TOKENS()", +"19663f7f": "TransferAmountFromBankAccountToAddress(uint256,address)", +"196667e4": "start_amount()", +"1966cdbe": "pickWinner(bytes32,uint256)", +"19677635": "TEAM_SALE_MULTIPLIER()", +"19679680": "emptyInactiveToken(uint256)", +"1967d701": "fuToken()", +"19682b09": "DonationDeposited4Doubling(address,uint256)", +"19689e76": "paySemiFinalWinner(uint256)", +"1968bf4f": "getPersonalStakeUnlockedTimestamps(address,address)", +"1968c160": "addPaymentDetail(address,bytes32,uint256)", +"1969c21a": "removePixelsFromMarket(bytes32)", +"196be409": "DLTESTToken(uint256,string,uint8,string)", +"196c16cb": "tokenPriceInEth()", +"196c9909": "_bounty()", +"196cd388": "isRangeInsideRange(uint256,uint256,uint256,uint256)", +"196e5c46": "sellSeeds()", +"196ecd25": "getOwnedCount(address,uint256)", +"196ee9c7": "remainingCats()", +"196f2f61": "njcoinToken()", +"196f5851": "transferAgents()", +"196f9aa5": "getLedger(uint8)", +"196fa707": "GAMEMAGICERC20(uint256,string,string)", +"19711d67": "campaignDurationDays()", +"1972172b": "satLimit()", +"19726b4e": "TheGoDigital()", +"1972b464": "emitJobOfferPosted(uint256,address,uint256,uint256,uint256)", +"1972c8dc": "Eggfrenzy()", +"19739117": "checkSignatures(bytes32,uint256[3],bytes,bytes,bytes)", +"1973c5de": "icoPreEnded()", +"1973cae7": "nextPriceDate()", +"1973e795": "setWorkpointSupportCancel(uint256)", +"197425c4": "testSupplyOf()", +"1974a003": "_startAuction()", +"1974a540": "RoundIndex()", +"1975a9e7": "o_deus(bytes32,bytes32)", +"1976804a": "TTCoin(address)", +"19774b86": "bulkWhitelistInvestor(address[])", +"19774d43": "orderFills(address,bytes32)", +"19775795": "aquariumCost()", +"1977bd68": "pepePremine(uint256)", +"1977f5c6": "Anubis()", +"197828b1": "bucketHolding(bytes32,address)", +"1978658b": "setCaps(uint32[],uint256[])", +"1978a87b": "TokenERC20()", +"197a1976": "setInvested(address)", +"197a2820": "depositarLucro()", +"197a9187": "NodeAction()", +"197b9454": "paintingsCount()", +"197bc336": "holderAt(uint256)", +"197c0f3d": "createPool(address,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"197c3555": "getPlace(uint256)", +"197c418f": "MyAdvancedToken7(uint256,string,uint8,string)", +"197cb5bc": "balanceLockedUp(address)", +"197d24ad": "changeModuleOwner(string,string,address)", +"197ea97e": "mintAsideTokens()", +"197f0f05": "getMarketInterestSetter(uint256)", +"197f3c29": "notLike(address)", +"197f8a82": "claimReveralTokens(address,uint256)", +"197f9508": "_getExchgAddr()", +"19806d8e": "s11(bytes1)", +"19810f3c": "withdrawShares(uint256)", +"19811fc9": "TPOMZ()", +"1981d521": "participate(uint8)", +"19825187": "changeMinToken(uint256)", +"1982640c": "walletOf(address)", +"1982c626": "withdrawOverpay()", +"1982ed58": "ChangeReuseCashInHarware(bool,uint16,uint16)", +"1983111d": "getTotalCompositionPrice(uint256[])", +"1983f4c2": "getDivsBalance()", +"1984a063": "StarbaseEarlyPurchaseAmendment()", +"1984a906": "preallocatedTokenAmount()", +"1984d419": "getProvisionBalance(uint256)", +"1985a440": "ContractRegistry()", +"1985acf0": "checkLimit(address)", +"1985f54a": "getScribe(address,address)", +"19863bb7": "ReDraw()", +"19869555": "evacuateToVault()", +"1986bc55": "stopBatchAssign()", +"1986f704": "setTrigger(address,bool)", +"1986fd4d": "getAccountWhitelist(uint256)", +"1987b887": "setTokenPorter(address)", +"1987da04": "secondPreSaleDate()", +"1987e50c": "getSellerAddressPayment(address,uint256)", +"1988f6fd": "didWithdrawProfit(bytes32,address,uint256,uint256)", +"1989a5ba": "canDoLoop(uint256,uint256,uint256)", +"1989d175": "YEAR_THREE_SUPPLY()", +"198a2085": "isATrustedContract(address)", +"198a5423": "presaleFundingGoalReached()", +"198ae785": "payTrnsTax(address,uint256)", +"198b5d0d": "MinimumPoStokens()", +"198c1f97": "getKeysfromETH(uint256,uint256,uint256)", +"198c548b": "supplyTokensSaved()", +"198df3b9": "LoginCheck(bytes32)", +"198e2b8a": "create(string,string)", +"198fa9a3": "isSigned(address,address,bytes32,uint8,bytes32,bytes32)", +"19901f1d": "TokenSale(uint256,uint256)", +"19901f20": "removeMultipleAllowedAddresses(address[])", +"19902b40": "changeCardAttr(uint256,uint16[5],uint16[5],uint16)", +"199099dc": "updateAccountState(address,uint256,bool)", +"1990ad6b": "private_delPermittedRoll(uint256)", +"1990f521": "fundings()", +"199156e4": "generatePresaleHouse()", +"1991d34a": "getDataColla_AB_02(string)", +"1991d6ac": "moveTokensFromSaleToExchange(uint256)", +"19921ad2": "AuthStart()", +"199317cf": "mining_uncle(bytes,bytes,uint256)", +"199326cb": "lastBlock_a2Hash_uint256()", +"1993584b": "countSecondWinners()", +"1994ad1e": "founderEggSupply()", +"19950c5b": "withdrawUnprotectedFunds(address,address,uint256,bool)", +"1995333b": "burnFunds(uint256)", +"1995b86d": "changeServerState(uint256)", +"199676c7": "TOKEN_RATE_40_PERCENT_BONUS()", +"19973261": "assigner()", +"19978a49": "rejectRequestUnpause()", +"1998524c": "updatePriceBottomInteger(uint256)", +"1998a5c4": "RHC()", +"1998aeef": "bid()", +"1998fb75": "addCar(uint80)", +"19996d50": "DinosaurFarmer()", +"1999cf37": "CHINESE_EXCHANGE_BUYIN()", +"1999eca8": "attack(uint8)", +"199a620a": "acceptNegotiationOwner(address)", +"199ba9e8": "basicFunctionReturn()", +"199c8b74": "SecvaultTest()", +"199cbc54": "totalVested()", +"199d70f4": "forceWithdrawRejected(address)", +"199d743a": "bountyTransfers()", +"199ed01b": "weightOf(uint256,uint256)", +"199f0791": "withdrawCntr(uint256)", +"199f4045": "NewRisk()", +"19a04a33": "SetDraftOrder()", +"19a08058": "setDelay(uint256,uint8,uint256)", +"19a0d492": "getValueOfInitialTokens()", +"19a0e572": "unverifyAddresses(address[])", +"19a17468": "ENS(address)", +"19a1b54f": "WEI_PER_ETHER()", +"19a1c691": "_removeChild(uint256,address,uint256)", +"19a1f592": "BONUS_AMOUNTS(uint256)", +"19a231eb": "getMilestoneDisputes(bytes32)", +"19a278b9": "getBAddress()", +"19a2bfd8": "unreadMessageCount(address)", +"19a32f66": "setHashByProvider(address,bytes32,bytes32)", +"19a3d0bb": "getMyStrippers()", +"19a3e3c0": "getAllRevenue()", +"19a50f49": "numUsers()", +"19a51554": "scheduleNextAuction(address,address)", +"19a523b0": "Violated(string,address)", +"19a5ce51": "oraclizeGasExtraArtwork()", +"19a64104": "Lockup6m(address)", +"19a6b356": "updateStrategyLabel(bytes15,string)", +"19a6fe7d": "setFixedAssets(bytes32,bool)", +"19a72fef": "DroneEmployeeROS(address,int256,address,address)", +"19a7e59d": "assertEq4(bytes4,bytes4,bytes32)", +"19a876c2": "stopPubTrade()", +"19a9119f": "prolongedDuration()", +"19a96e72": "setCarrotsMultiplier(uint8)", +"19a9c2f1": "generateId(string)", +"19aaff86": "claimAllDividends(address)", +"19ab453c": "init(address)", +"19ac2756": "TIER1_RATE()", +"19ac74bd": "userCampaigns(address,uint256)", +"19ac8c0f": "payComission()", +"19adda2c": "fairsaleProtectionOFF()", +"19ae8994": "test1(uint256)", +"19aec48a": "endTimeNumber()", +"19aec6a9": "newThreadEvent(uint256,string,string,uint256)", +"19af1bd9": "WeiRaised()", +"19af6f48": "crowdsaleTokenSold()", +"19afa824": "setFactoryInterface(address)", +"19afdfe1": "showMigrationAmount(address)", +"19b0297d": "info_BalanceOf(address)", +"19b05f49": "accept(uint256)", +"19b09f9b": "payWinner(address)", +"19b1f94b": "getLastAuditPass(address)", +"19b24684": "updateEntity(uint256,address,uint256)", +"19b35f3d": "organisationIndex(address)", +"19b36162": "updateParams(uint256,uint256,uint256,uint256,uint256,uint256)", +"19b3fa4b": "removeEmitter(address)", +"19b4006e": "get45(uint256,uint256)", +"19b500ef": "deposit_internal(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256,uint256)", +"19b5176e": "memberGroupNameHash(address)", +"19b587ad": "putCompanyOnsale(bytes32,uint256)", +"19b61c09": "createSaddle1(uint256,uint256,uint256,address)", +"19b64015": "connectorTokens(uint256)", +"19b667da": "setFinalizeAgent(address)", +"19b6eabe": "setBounty(bytes32)", +"19b7b0b4": "acceptBid(uint256,uint256,bytes32)", +"19b7d7bd": "getBudget(address)", +"19b97530": "setFundariaPoolAddress(address)", +"19b985b3": "fixamt()", +"19ba0b63": "getNumberOfProjects()", +"19ba567c": "cancelAddOwnerRequest()", +"19bad1b2": "Stage1MEI()", +"19bb3c3d": "Reddit(uint256,uint256,bytes,bytes)", +"19bba58b": "_updateInventories(uint256,uint256,uint16)", +"19bdfc7f": "returnTokensFromHoldProjectAddress(uint256)", +"19be28ec": "CurrencySwap()", +"19be65f0": "GetBalance(address,address)", +"19bece1b": "buytoken(uint256)", +"19bee474": "totalFundsDistributed()", +"19bf01c0": "firstLockTime()", +"19c02b27": "allowTransfer(address,uint256)", +"19c039bc": "airDropJoin(bytes32)", +"19c0737f": "WineChainToken()", +"19c2a5b5": "auctionClose()", +"19c2b4c3": "getLastRequestId()", +"19c2f201": "GEN0_AUCTION_DURATION()", +"19c32e0b": "hmacsha256(bytes,bytes)", +"19c35319": "extendCaller(address,address,uint256)", +"19c38c66": "inPermission(address,bytes4)", +"19c46f51": "kscBatchBurnWhenMoveToMainnet(address[],uint256[],string)", +"19c47214": "getBlockVersion(bytes)", +"19c4e40f": "envelopeTypes(uint256)", +"19c54359": "createData(uint256,uint256)", +"19c55a31": "SearchByGit(bytes)", +"19c55cea": "cancelBid(bytes32,uint256,uint256,uint256,uint256,uint8,bytes32,bytes32,uint8)", +"19c5ab4b": "addAccountReader(address,address)", +"19c5b887": "bonusSize()", +"19c5b89c": "DToken()", +"19c5ef1b": "oneStepRate()", +"19c61b6f": "dealEndOffer(bool)", +"19c6c6cd": "THRD()", +"19c6eeb8": "getIPFS(address,string)", +"19c76700": "withdrawBankroll(uint256)", +"19c85a4d": "RakugoCrowdsale(uint256,uint256,address,address,address[])", +"19c87f1f": "toAddress()", +"19c8b591": "ChangeCurrencyAdditionFee(uint256)", +"19c97154": "getLastTicketTime()", +"19c9a4f3": "platformTokensAddress()", +"19ca6feb": "_appendSchellingSupplyChanges(uint256,uint256,bool)", +"19ca964c": "_isOperatorForTranche(bytes32,address,address)", +"19cac495": "isYes(uint256)", +"19cae462": "difficulty()", +"19cb355d": "requiredStake()", +"19cbe072": "contractFallback(address,uint256,uint256,uint256,uint256,uint256,bytes32)", +"19cc02aa": "airdropped()", +"19cc1ec4": "maxContributionAmount()", +"19cddd4b": "hackoin(string,string)", +"19ce4432": "DMPhuongToken()", +"19ceb660": "Ticket_Price()", +"19d0f54d": "allowRecovery()", +"19d152fa": "vestingToken()", +"19d1997a": "supplyLimit()", +"19d1b6c6": "getRegistrationRight(address)", +"19d1d967": "MOAC()", +"19d2993e": "phase1DurationInHours()", +"19d2fe85": "_iD()", +"19d3237c": "setDataColla_001_002(string,string)", +"19d375f1": "isLeagueRosterContract()", +"19d3be48": "_getPartId(string,uint8,uint8,uint8)", +"19d40b08": "approved()", +"19d41c69": "ticket_price()", +"19d45925": "isJobHasFreelancer(bytes)", +"19d45a08": "launchContract()", +"19d46f71": "makeWeeklyInvest(uint256)", +"19d4c380": "setBestGuessSecondPlaceTentativeWinningPayoutDistributionHash(bytes32)", +"19d56f84": "BuyChestSuccess(uint256)", +"19d70e0b": "createSaleAuction(uint256,uint256)", +"19d7943a": "reLoadXid(uint256)", +"19d8ac61": "lastTimestamp()", +"19d9217c": "midTermHolding()", +"19d9c8df": "ScaleObs(address,bytes32)", +"19da8c99": "getICOStatus()", +"19dacbf8": "Deposit(address,bytes32,uint256)", +"19dad16d": "setOwnerCutPerMillion(uint256)", +"19dba3d2": "getBountyToken(uint256)", +"19dc2525": "closeChannelEcrecover(bytes32,uint8,bytes32,bytes32,uint256)", +"19dc831a": "withdrawHavvens(uint256)", +"19dd9455": "getContractTimestamp()", +"19ddd5a3": "_buyXname(bytes32,uint256,bytes32)", +"19de029a": "setBountyDuration(uint256)", +"19dec62a": "approveAgreement()", +"19e044f8": "MockToken(uint256)", +"19e06f20": "mintIssuerToken(address,uint256)", +"19e072ef": "updateStatus(bool)", +"19e0a0cf": "sendTokensWithLock(address,uint256,bool)", +"19e0eb0e": "currentBlockHash()", +"19e13c93": "winningTeamName()", +"19e1568c": "pause_1()", +"19e1d8d4": "Luckblocks()", +"19e1fca4": "allowed()", +"19e3897a": "UpdateUserExtraData2(address,bytes32)", +"19e3a1d8": "BoomstarterICO(address[],address,uint256,bool)", +"19e4540b": "getBankAccount()", +"19e5221a": "getBonusFee(uint256)", +"19e5bf3a": "Register()", +"19e5d0cb": "mintInPeriodCount(uint256)", +"19e66508": "ztToken()", +"19e6ab23": "icoDiscountLevel1()", +"19e6e158": "totalVotes(uint256)", +"19e740c0": "getNextVestingIndex(address)", +"19e743fe": "addICOToken(address,address)", +"19e77c34": "startSlotAt()", +"19e7998c": "votingInfo()", +"19e7fbc2": "totalEthPos()", +"19e82d86": "cfi_whitelist(address)", +"19e82e6f": "BrokerBank(address,uint256,address,address)", +"19e858e5": "processCollateral(address,address,uint256,uint256,uint256,uint256,bool)", +"19e860c1": "secondPrivateLockedAmount()", +"19e9e5de": "getGooProduction(address)", +"19ea61db": "testFailTransferDisabled()", +"19ea809b": "intercrypto_convert(uint256,string,string,address)", +"19ea8a98": "setPackSaleAddress(address,address)", +"19eae36b": "setMaxBlockPurchaseInOneGo(uint256)", +"19eaeccb": "getInfoCellLockup()", +"19eb4a90": "getValues()", +"19eb5dc6": "transferToken(address[])", +"19eb691a": "curUserId()", +"19eb8d48": "canVote(address,uint256)", +"19ecb310": "allocateTicket(address,address)", +"19eced6d": "mCURRENT_STATE()", +"19edc0aa": "minimalInvestment()", +"19ede85a": "Hydron(uint256,string,string)", +"19ee1f1c": "getPrizeFund()", +"19ee5bca": "BountyManagerEntity()", +"19f02ceb": "set(address,address,uint256)", +"19f1cded": "getStakedTeller(address)", +"19f1d7b0": "Kentkoin()", +"19f2b931": "removerAssinatura(string)", +"19f30aaa": "hire(uint64,address[])", +"19f353bb": "protectionPrice()", +"19f37361": "isToken(address)", +"19f3edec": "_released(uint256,uint256)", +"19f4ff2f": "setFeeRatio(uint256)", +"19f577b3": "placeBuyOrder(uint256)", +"19f8dee9": "isEthWithEnc(uint16)", +"19f97a46": "createContractPlace(string,string)", +"19fa55bd": "MinasAlbarit()", +"19fa8f50": "InterfaceId_ERC165()", +"19fa9f72": "DNNToken()", +"19fac8fd": "setCommissionRate(uint256)", +"19fb361f": "transferTo(address,address,uint256,bytes)", +"19fb52db": "mainPoolCutPercentage()", +"19fc36ed": "MIN_TRANSFER_TIMESPAN()", +"19fc3b9d": "getMyHolding()", +"19fc5b88": "minEthAmount()", +"19fc5dfa": "LogBeneficiarySet(address,address)", +"19fc9e54": "cashInvestment(address,uint256)", +"19fce740": "capCommitment()", +"19fd93f1": "unregisterSsp(address)", +"19feda7e": "addEmployee(address,address,uint256,uint256)", +"19ff1d21": "hello()", +"19ff7096": "cost_of_transfers()", +"1a000513": "getLotteryResultTotal(address)", +"1a0058f5": "getBatchInfo(uint256)", +"1a006503": "hasAlreadyClaimed()", +"1a009265": "setArrBoolField1(bool[])", +"1a013939": "gameStarted(string,uint256,uint256,uint256)", +"1a017f3f": "transferPrivileged(address,uint256)", +"1a026c96": "wallet1()", +"1a02af40": "tokensInAuctionsOfOwner(address)", +"1a036357": "removeDeactivatedList(address)", +"1a038873": "FREEZE_TIME()", +"1a041463": "retryOraclizeSetProof(uint256)", +"1a04d5c5": "startingFeeBalance()", +"1a053713": "unblockTokenFunds(address,uint256)", +"1a05619b": "infoTier()", +"1a05ba8d": "setPI_edit_12(string)", +"1a06008a": "dividendFund()", +"1a069c72": "contribute(uint256,uint256,uint8,bytes32,bytes32)", +"1a0725ce": "wagerIndex()", +"1a0726df": "getHatValue(uint256)", +"1a080a7a": "placeBet(uint8,int8,uint256,uint256)", +"1a081330": "isSaleOpen()", +"1a08a7bf": "ConfigAction()", +"1a08b189": "setFounderAddress(address)", +"1a0919dc": "unregister(bytes32)", +"1a092541": "getDescription()", +"1a09510a": "index(address[],address)", +"1a0a617d": "fetchVoteInfoForCandidateByIndex(uint256,address)", +"1a0a8fae": "creditJackpotTokens(address,uint256,uint256)", +"1a0a9ac7": "KNOXV()", +"1a0abd34": "getMyDepositAmount()", +"1a0b1b86": "crowdPrice()", +"1a0b4656": "LiveStarsToken()", +"1a0bc596": "pandora()", +"1a0be73f": "DispatchHub()", +"1a0c3479": "decreaseApproval(address,uint256,bytes,string)", +"1a0c83f8": "buyerLastPaidAt(uint256,address)", +"1a0d77b9": "ClaimAmount()", +"1a0ddce9": "setRewards(address[],uint256[],uint256[])", +"1a0de74c": "selectWinners()", +"1a0e722b": "LogDeliverEVN(address,uint256)", +"1a0f0bf1": "unrestrictedMintToPool(uint128,uint256,uint128)", +"1a0f2f5f": "BroToken()", +"1a0f518d": "updatePlayerBalance(address,int128,int128,uint256)", +"1a0faecf": "addNewMeme(uint32,string,string,string,string)", +"1a0fb847": "disperseRewards(address,uint256)", +"1a10cfc3": "delete_entry(uint256,uint256,uint256)", +"1a11415e": "PRIVATESALE_BASE_PRICE_IN_WEI()", +"1a120481": "enlist()", +"1a12e7a9": "setCreationFee(uint64)", +"1a144940": "codetokenIndexToOwner(uint256)", +"1a145c34": "getNumEthTweets()", +"1a148644": "newDocument(string,string)", +"1a14e94a": "buyAnimal(uint256)", +"1a14f128": "EventCreateAccessory(address,uint256)", +"1a14ff7a": "getD()", +"1a1542e6": "checkGameResult()", +"1a15b206": "holdTokens(address,uint256)", +"1a160fe9": "checkPermission(address,address)", +"1a170aa1": "buyTickets(bytes32)", +"1a1773f4": "otherchainstotalset()", +"1a182801": "createNewCertifier()", +"1a18e707": "setBlockReward(uint256)", +"1a197588": "availableAmount(address[3],uint256[4])", +"1a19b0da": "confirmEngineerQuest(address)", +"1a1a0d65": "distributeSRNT(address[],uint256)", +"1a1a0d76": "updateTopicDescription(bytes15,string)", +"1a1a4ed7": "HALVING_DELAY()", +"1a1a7993": "random(uint64)", +"1a1a8da8": "WebPay()", +"1a1aab46": "unlock_times(uint256)", +"1a1abe3d": "sizes(uint8)", +"1a1b8d08": "CompleteInit()", +"1a1c59e2": "setBidSubmissionProofsAdd(address)", +"1a1ceb11": "cloneProposal(uint256,string,bytes32,uint256,uint256,uint256,bool)", +"1a1d28aa": "ClaimAcornShare()", +"1a1dca07": "setLockFunds(address[],uint256)", +"1a1df394": "Play(bool)", +"1a1e01d5": "pushAllRemainToken(address)", +"1a1eea7d": "ProposalRequestSubmitted(bytes32,uint256,uint256,string,address)", +"1a1feae1": "txGasPriceLimit()", +"1a2084f1": "updateCreator(address)", +"1a209776": "isVerified(address,uint256)", +"1a21bb22": "PREVIPdeadline()", +"1a21c229": "gracePeriodMaxTarget()", +"1a2309f0": "CONTRIBUTION_MAX()", +"1a23bee3": "endOfROSCARetrieveFees()", +"1a24b91a": "setPriceFee()", +"1a24befc": "clearSaleSharesSold(uint256)", +"1a254884": "Coffeecoin(uint256,string,uint8,string)", +"1a256090": "sawan()", +"1a25e513": "upgradeProvider(address,address)", +"1a261fda": "scoreUp(address)", +"1a26ed1c": "validateReservedWindowSize(uint256,uint256)", +"1a2a4ab5": "withdrawDeadFund(address)", +"1a2a627c": "nextroundtotalsupplyGOTCH()", +"1a2ad007": "GetCurRoundInfo()", +"1a2b3431": "completeBooking(uint256)", +"1a2b3adf": "signedTransferFromHash(address,address,address,uint256,uint256,uint256)", +"1a2b4cd8": "airDropPool_()", +"1a2b6250": "canPerform(address,address,bytes32)", +"1a2c4334": "FortuneGodToken(address)", +"1a2c752a": "testLimiting()", +"1a2d3be8": "masterNodable()", +"1a2d72fb": "_api_PlaceBet(bool)", +"1a2d8629": "getinfo()", +"1a2e2b2c": "getHolderIndex()", +"1a2eaaeb": "Unicoin()", +"1a2f1640": "amountSecond()", +"1a300a98": "_setCooldownEndTime(uint256,uint256)", +"1a3057f3": "performAddToken()", +"1a30ec13": "ETHWallet()", +"1a311968": "roundICO()", +"1a3142bd": "depositAndWithdraw(uint256)", +"1a314552": "isUsernameExists(string)", +"1a31752a": "masternodes(uint256)", +"1a31e733": "WinningsClaimed(address,uint256)", +"1a327d97": "bitmask_rm(address,uint256)", +"1a3352c1": "getOrderBookSize()", +"1a3480b5": "rateDecimals()", +"1a34b59d": "OjtToken()", +"1a34fe81": "max_amount()", +"1a3538f3": "closeFailedInstallationAndWithdraw()", +"1a360f5f": "EWM()", +"1a363bf1": "giveMeTokens()", +"1a365f2b": "stampIndexToOwner(uint256)", +"1a3722b2": "grantPermission(uint8,address)", +"1a372eaa": "allPiranhasInfo(uint256)", +"1a3739ec": "getInitialReporter()", +"1a389eb9": "exploreFastenEMONTFee()", +"1a38fa06": "distributeBounty(address[],uint256[])", +"1a399698": "genDailySecondPrizeKey(uint8[4])", +"1a39d8ef": "totalAmount()", +"1a39e1cf": "addAffiliate()", +"1a3a67d8": "zGetGameID()", +"1a3ae67a": "getPlatBalance()", +"1a3b8bad": "CABoxCrowdsale()", +"1a3cb4f5": "getBalanceA(bytes)", +"1a3cd59a": "getInfo(uint256)", +"1a3d069b": "totalEuroUlps()", +"1a3d96ff": "IdentityManager(bytes32)", +"1a3dc39c": "getRewardPotSetting()", +"1a3de5c3": "_pay()", +"1a3e42d0": "setSignUpOnOff(bool)", +"1a3e5457": "validDestination(address)", +"1a3e91b9": "getTitle(bytes32)", +"1a3f9eb5": "getVanillaERC20BalanceSlot(address,uint256)", +"1a421103": "getProperty(address,bytes32)", +"1a426550": "claimBounty(uint256,string)", +"1a429a0e": "SCND_CRWDSALE_RATIO()", +"1a433daf": "withdrawProposedAction()", +"1a437780": "orderOnFightAuction(uint256,uint256,uint256)", +"1a43c338": "compute()", +"1a44731c": "statePhase()", +"1a454ea6": "COMMISSION_RATE()", +"1a45fac7": "removeOwner(address,address,address)", +"1a463a7d": "amountReceived(uint256)", +"1a464fa1": "claimProductOwnership(bytes32)", +"1a470b6a": "SweepBalances()", +"1a476260": "indiFundAndSocialVaultDeposit()", +"1a4813d7": "setBaseRate(address[],uint256[],uint256[],bytes14[],bytes14[],uint256,uint256[])", +"1a488a60": "zpzToken(uint256,string,uint8,string)", +"1a48fb3a": "testDeleteLawyer()", +"1a49803b": "investWithSignedAddress(address,uint128,uint8,bytes32,bytes32)", +"1a4a1a6c": "benefactorsBalance()", +"1a4b4cff": "updateWithdrawalModeByIndex(uint8,uint32)", +"1a4b746f": "CharacterRegistry()", +"1a4bcc4a": "validTokenBalance(address)", +"1a4be5d8": "HITSCoin()", +"1a4be6ff": "ConstantConfig(uint256,bool,bool)", +"1a4c24f9": "purchaseInternal(address,uint256,address)", +"1a4e0afd": "countBit(uint8)", +"1a4e1e78": "tips()", +"1a4e9a6c": "getWithdrawConfirmations(uint256)", +"1a4f5b67": "isFrontRunnerPeriodOver()", +"1a4fb653": "getGDemoc(uint256)", +"1a4fbee1": "committeesArrayIndexCounter()", +"1a514d97": "reActivate()", +"1a51a28c": "contributorsAllocation()", +"1a52691b": "refundForAll(uint256,uint256)", +"1a534fd1": "calcCanAcceptAmount(address,bool,uint256)", +"1a5375e1": "passTurn(uint256)", +"1a53cd90": "presaleBalancesLocked()", +"1a555b0c": "NewClonedToken(address)", +"1a55ad28": "_verifyProof(string,bytes,bytes,uint256)", +"1a55b8f7": "BACKUP_ONE()", +"1a582962": "isMintingFinished()", +"1a58349a": "fetchCreatedOrdersForPayerByAdmin(address)", +"1a5834aa": "start_game(string,string)", +"1a592bc1": "saasPayUser()", +"1a5ab391": "Wallet7()", +"1a5b189d": "NCASHTOKEN()", +"1a5b72c3": "endStage3()", +"1a5b8f96": "MAX_SITE_ID()", +"1a5bd7fc": "getTournament(uint256)", +"1a5d3b75": "getAssetIdOwner(uint256)", +"1a5d60bd": "removeBoard(address,address)", +"1a5dbe98": "iflea()", +"1a5e2110": "tokensPerEthPrice()", +"1a5e6f7d": "getOneBet()", +"1a5e7852": "kaliSupply()", +"1a5eba21": "invest(uint256,string)", +"1a5f9613": "DevMiningRewardPerETHBlock()", +"1a5f9bed": "exploreUsingETH(uint256,uint256)", +"1a620a3e": "AgriChainMasterContract()", +"1a6253ed": "ownerTransferPHX(address,uint256)", +"1a629b00": "AddTokensToMember(address,uint256)", +"1a62c928": "approveAllocation(address,address)", +"1a62f6f7": "escrowReturn(address,uint256,uint256)", +"1a63aa4d": "prolong(uint256)", +"1a64937b": "cleanupAbandonedGame(address)", +"1a64adae": "vestedTokens(address,uint256)", +"1a65569b": "placeBid(uint256,uint256,uint256,uint256,bytes32)", +"1a65d3c2": "SnakeFarmer()", +"1a65e283": "buyCountry(uint256)", +"1a668c42": "finishAirdrop()", +"1a67456e": "getNumberOfItemsByTypeAndOwner(string,address)", +"1a67d6e5": "MainSaleClosed()", +"1a68b1a1": "setRetirementManager(address)", +"1a690752": "UDCC()", +"1a695230": "transfer(address)", +"1a699085": "view64()", +"1a6a3c03": "GetEscrowOwner()", +"1a6a57f4": "getInviters()", +"1a6af7b7": "currTime()", +"1a6b0e73": "addArts(address)", +"1a6b13e2": "changeMinimumTakerProtocolFee(uint256)", +"1a6becd6": "getAllDividends()", +"1a6c0983": "getShipSell(uint32)", +"1a6c6e38": "MagicStore(address)", +"1a6c9c0d": "withdrawStart(uint256[],uint256,uint256,uint256)", +"1a6d7561": "getFundingInfoOfPhase(uint8)", +"1a6dafa6": "getJackpotRoundEndTime()", +"1a6e1315": "pay_salary(uint256)", +"1a6e2445": "changeRelease(uint256)", +"1a6ea411": "MANHATTANPROXY5THAVE()", +"1a6f1974": "disableNodeRegistration()", +"1a6f56a0": "balancesLocked2Y(address)", +"1a6f7be5": "voteNo(uint256)", +"1a6fb342": "getTransferStatus()", +"1a700013": "inWhiteList(address,address)", +"1a700a95": "QWHappy()", +"1a701609": "HEAD()", +"1a70388f": "shareToWei(uint256)", +"1a70d015": "exchangesTokens()", +"1a715bcf": "lauToken(address,address)", +"1a71733c": "determineAllocation(address,address[],uint256[])", +"1a71d3db": "freezingBalanceNumberOf(address)", +"1a7303de": "eddToken()", +"1a73293d": "updateWhitelist(address,uint256)", +"1a74d536": "hasExited(address,address)", +"1a750945": "vote03YesCount()", +"1a751b2c": "makeMonthlyInvest(uint256)", +"1a7626e7": "minimumFee()", +"1a76e30c": "BONUS_DAY2_DURATION()", +"1a776b3c": "reclaimSurplusEth(address)", +"1a7777bb": "getMarketSpreadPremium(uint256)", +"1a787915": "startConditions(bytes32)", +"1a790a2c": "_setPowerPool(uint256)", +"1a79464e": "setFeeBurner(address)", +"1a799617": "revokeRound(uint256)", +"1a79bbef": "addAddressToMaster(address)", +"1a79c5de": "setTimeWindow(uint256,uint256)", +"1a7a98e2": "getDomain(uint256)", +"1a7ae0ba": "updateCostUSD(uint256)", +"1a7aed0e": "_checkMyAging(address)", +"1a7b11f5": "epoch_fund()", +"1a7b9fe7": "setCouponRatio(uint32)", +"1a7c6eb0": "getHalvingBlocks()", +"1a7c7105": "__load128(bytes)", +"1a7cecb2": "recoverAddressFromCooperativeSettleSignature(uint256,address,uint256,address,uint256,bytes)", +"1a7cf619": "round0StartTime()", +"1a7e0c50": "totalBaseLareSoldInPreSale()", +"1a7f8588": "IRE()", +"1a7facff": "rcn()", +"1a7fae47": "pubkeys2(uint256)", +"1a8012e4": "is_active()", +"1a809b02": "unpauseRefund()", +"1a81284b": "CCH_FGRE_1()", +"1a81a01f": "configContract(uint256,address[],uint256[],uint256[],uint256[],uint256[])", +"1a81c3a2": "getUserContract(address,uint256)", +"1a81e7b4": "getExtender()", +"1a82844c": "getERC721AmountPawn(uint256,address)", +"1a82eeb4": "ocpTokenContract()", +"1a833d3f": "trancheNumerator()", +"1a83690d": "Work()", +"1a841b1b": "configureFromStorage()", +"1a8432ea": "isUnLockedAccount(address)", +"1a844205": "SaintCoinWorld()", +"1a859db8": "rewardsAccounts(uint256)", +"1a85bd57": "_find(uint256)", +"1a85c6cb": "RandomNumber(uint8)", +"1a85f4fb": "UrlHint(int256)", +"1a85f7d2": "applySettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"1a860d91": "AddUser(string,address,uint256)", +"1a861d26": "maxLimit()", +"1a86430e": "calcTotalShareRewardFee(uint256)", +"1a86535a": "GetWhoSignedAVersion(string)", +"1a86ac4f": "initialAddressSet()", +"1a86d5b6": "sendToOtherBlockchain1(string,string)", +"1a871a2c": "playerCharacter(uint256,uint8)", +"1a88bc66": "slot()", +"1a88cc31": "getCommissions(uint256)", +"1a88f306": "transferFromContract(address,uint256)", +"1a8932d9": "allocated2Year()", +"1a8943dd": "overflowResistantFraction(uint256,uint256,uint256)", +"1a895266": "unBlacklist(address)", +"1a8a5de1": "citizensAmounts()", +"1a8a85f3": "checksum(address)", +"1a8af7a8": "restartMint()", +"1a8b1874": "endprivate()", +"1a8c7243": "presale_finish()", +"1a8dc392": "checkAddressTeamTwo(address)", +"1a8f8f3e": "MJCCToken()", +"1a8fc985": "INITIAL_TOKENS_PER_ETHER()", +"1a9069cf": "signDate(bytes32)", +"1a90f0c4": "numTurnsToRevolve()", +"1a918bdd": "addTraps(uint256,bytes,uint256[])", +"1a92e6da": "Veegotoken(uint256,uint256)", +"1a9360dd": "checkDate()", +"1a93d1c3": "getGasLimit()", +"1a93fa4b": "reorganizeSubUsers()", +"1a9425c1": "verified(uint256)", +"1a94d49b": "BASE_BET_ETHER()", +"1a955061": "numToWei(uint256,uint256)", +"1a95bc99": "GreatHarmon()", +"1a95f15f": "TICKET_PRICE()", +"1a968069": "multiSig(bytes32)", +"1a974bb5": "KOCMOC()", +"1a97d1fa": "CLASSYToken()", +"1a98d0de": "whitelistedParticipantsLength()", +"1a991f0d": "approveSpenderDecimalAmount(address,uint256)", +"1a9938aa": "activateAddress(address,bool)", +"1a994fd2": "addVideoGame(string,address,uint256)", +"1a99bed2": "VestingSent(address,address,uint256,uint256,uint256)", +"1a9a01fb": "removeGame()", +"1a9a0426": "setDecimal(uint8)", +"1a9aa710": "ownerAuctionCount(address)", +"1a9aea0a": "lockTransfer()", +"1a9b0b7c": "isWinner()", +"1a9b26a2": "decode(bytes,uint256,uint256,uint256)", +"1a9b70f2": "destroyBlockFunds(address)", +"1a9be331": "getFastExtra()", +"1a9bf9cf": "bountyTokens()", +"1a9c4571": "listEggsIds()", +"1a9caab9": "createGen0(uint256)", +"1a9d64c8": "publicsale_address()", +"1a9df17b": "OrderPaid(uint256,address,uint256,uint256)", +"1a9df9d4": "getLowerSend()", +"1a9e3e18": "ownerBuyCut()", +"1a9f170d": "buyIcoToken1()", +"1a9f66c4": "StrimTeam()", +"1a9faa80": "setUpdateAddress(address)", +"1aa022bf": "UacToken()", +"1aa02d59": "set_fee(uint256)", +"1aa05ab6": "testSellTwoTokens()", +"1aa19567": "interruptLastRound()", +"1aa20b68": "verify(address,uint256,uint8,bytes32,bytes32)", +"1aa260c0": "withdrawAsSupporter(uint256)", +"1aa2852f": "DToken(address)", +"1aa359ff": "newTokenContractAddress()", +"1aa37733": "AudCoinToken()", +"1aa3a008": "register()", +"1aa43078": "minTime()", +"1aa44efd": "createNamedDistrict(uint256,string,bool)", +"1aa49291": "Getter()", +"1aa57ec5": "TokenLab(address,uint256,uint256)", +"1aa58bd3": "isAetherClockAuction()", +"1aa5b55c": "stageTwoStart()", +"1aa5c70e": "getDAI(uint256)", +"1aa6e29f": "hasOneYearWithdraw()", +"1aa7655c": "START_TOKENS()", +"1aa7e54c": "dungeonDifficulty()", +"1aa859d0": "remTokenPairWhitelist(address,address)", +"1aa86370": "updateXIPFSPublicKey(string)", +"1aab7bb5": "setParamsPreSale(bool)", +"1aab9a9f": "holderCount()", +"1aabaffe": "WhaleToken()", +"1aac38c8": "addPhase(uint256)", +"1aacd03c": "checkNewPlayer(address)", +"1aad5bc2": "_getRarity(uint256)", +"1aad8b82": "calculatemortiesell(uint256)", +"1aadadaa": "getRegistrantFund(address)", +"1aadcc34": "convertGreyGreen(uint8,uint8)", +"1aadddea": "investorGiven()", +"1aae3460": "investedAmountOf(address)", +"1aaf39ff": "check_dividend(address)", +"1ab06ee5": "set(uint256,uint256)", +"1ab08c61": "albosAddress()", +"1ab1025c": "tokensOutInMarket()", +"1ab12b10": "CurrentDevFee()", +"1ab268d6": "getCompleteSetCostInAttotokens()", +"1ab27060": "Unapproved(address,address)", +"1ab2935c": "VestingScheduleRegistered(address,address,uint256,uint256,uint256,uint256,uint256)", +"1ab30817": "gasLimitForOraclize()", +"1ab3a6c8": "getParentsForTokenId(uint256)", +"1ab3c515": "balanceOfLocked1Y(address)", +"1ab3d055": "removeAdminWhitelist(address[])", +"1ab46d4e": "referralBonusCalculate(uint256,uint256)", +"1ab51aec": "buyEPU()", +"1ab59612": "setAllowPriceLower(bool)", +"1ab5c5b8": "adduser(address,uint256,uint256)", +"1ab5d260": "transferTo()", +"1ab681e8": "withdrawEth(uint256,address,bytes32)", +"1ab733a3": "getTotalProfits(address)", +"1ab7df5f": "addUserTokens(address,uint256)", +"1ab86572": "calculateRoom(uint256,uint256,bool,uint256)", +"1ab8bc44": "_setMilestoneTo(address,uint256,uint8)", +"1ab8ff3b": "_finalization()", +"1ab961a1": "BSDB()", +"1ab971ab": "setFee(uint32)", +"1abb0ba9": "getTotalCurrentSaled()", +"1abb10e8": "chipSpeed()", +"1abb7192": "YCCToken(uint256,string,uint8,string)", +"1abca540": "Toptech()", +"1abd409d": "champsForSaleCount()", +"1abe8385": "InvestmentToken()", +"1abebea8": "LogSetAuthority(address)", +"1ac10d11": "testGreatherThanOrEqual()", +"1ac10f1f": "setPixelRate(uint256)", +"1ac14219": "testEns()", +"1ac25a81": "RegisterDrupal()", +"1ac25e99": "extractBalanceProofSignature(address,uint32,uint192,bytes)", +"1ac33b3d": "createTrack(bytes32)", +"1ac39336": "GelatoCoin()", +"1ac3ddeb": "withdrawFee(address)", +"1ac46290": "setProviderInfo(uint256,string)", +"1ac4754b": "redeemInternal(address,bool)", +"1ac47963": "functionSeven()", +"1ac589b4": "setJoiningFee(uint256)", +"1ac58dd5": "kimsCreated()", +"1ac5c96f": "test_4_someTest()", +"1ac61e8c": "testBlobCreate()", +"1ac68a12": "HavvenGoldSupply()", +"1ac7e1f9": "CollectedAllFees(address,uint256)", +"1ac84690": "powerOf(address)", +"1ac8a9b2": "teamlock()", +"1ac8aa4e": "minimowea()", +"1ac9180e": "tokenReinvest(uint256)", +"1ac96124": "numOfCommon()", +"1ac975ed": "UcCoinPriceChanged(uint256,uint256)", +"1ac9f70d": "multiplicate(address)", +"1aca00fd": "variable(uint256)", +"1aca120b": "updateAnimalSpecial(uint256,bool)", +"1acb2719": "getNextRequest(address,address)", +"1acb7077": "setCentsPerToken(uint256)", +"1acbf6e0": "alfatokenFee()", +"1acc26bc": "disableLimit()", +"1acc478a": "getContentMetrics(address,address,bytes32)", +"1acc57b8": "AGENCY_TOKEN_CAP()", +"1acd8237": "LEK(string,string,uint256,uint8)", +"1ace02a3": "RaptorsvsWizards425()", +"1ace4d05": "bigAmount()", +"1ace88a4": "realWorldPlayerTokenForPlayerTokenId(uint32)", +"1acf6485": "requestWithdrawalFromLimit(uint256,string)", +"1acfd02a": "changeAdmin(address,address)", +"1ad065f1": "prepare(uint256,address,address,uint256)", +"1ad11fd1": "TrieToken()", +"1ad2ad1a": "stopPresale()", +"1ad50586": "safePower(uint256,uint256)", +"1ad509f0": "MUIcoin()", +"1ad6037f": "LEXInContract()", +"1ad607da": "_addUserCity(address,uint256)", +"1ad614c3": "setRequireAuthorisation(bool)", +"1ad66d21": "earlyPurchasesLoaded()", +"1ad781b4": "PennyGrab()", +"1ad7c199": "callVote()", +"1ad874b4": "presaleOn()", +"1ad8f65b": "distribute_for_founders()", +"1ad8fde6": "changeSymbol(bytes32)", +"1ad95744": "START_ICO()", +"1ad9f190": "getUserHotGoldBalance(string)", +"1ada70a8": "lockupDuration()", +"1adadda8": "claimLockedTokens(address)", +"1adb4842": "setLockup_jishis(address,uint256,uint256)", +"1adb631b": "distributePuppyCoinMedium(address[])", +"1adbdfab": "SimpleApproveTransfer(address)", +"1adc36b9": "doesUserOwnCeleb(address,uint256)", +"1add4f5a": "tranferMoneyToName(bytes32)", +"1add5486": "Multiownable()", +"1add6bcf": "getDoubleKeccak256(uint256)", +"1adda83a": "calculateTokens(address,uint256,uint256)", +"1adf2bec": "CancelOrder()", +"1adf2d1a": "Offer(address,address,bytes,uint256,uint256,uint128,uint256)", +"1adf42fb": "setPreICO(bool)", +"1adf692f": "_changeSquarePrice(uint8,uint256)", +"1ae0a693": "SetApplicant(bytes32[])", +"1ae0b4d0": "master5invest()", +"1ae0c787": "getControlInfoMaxTotalImbalanceList()", +"1ae2379c": "excess()", +"1ae32b82": "disallowReceiver(address)", +"1ae3a94a": "devFeeRate()", +"1ae3d8d0": "protectedBalance(address,address)", +"1ae460e5": "isInPool()", +"1ae4dfb7": "getcardPrice(uint256)", +"1ae638f7": "times6()", +"1ae6b6ee": "cancelAuctionWhenPaused(address,uint256)", +"1ae6c09c": "showMyAnimalBalance()", +"1ae6d375": "AirSwapToken(address,address,uint256)", +"1ae7341f": "OneledgerToken()", +"1ae743ad": "withdraw_token_and_eth()", +"1ae7b7fb": "jackpotSmall()", +"1ae7b8e1": "newOffer(address,string)", +"1ae7ef0a": "QISHENG(uint256,string,string)", +"1ae8494e": "purchaseTopCompany(bytes32,bool)", +"1ae879e8": "walletOwner()", +"1ae8ab81": "setNickname(bytes32)", +"1ae8fc87": "addContract(address,address,uint256,string)", +"1ae97bd9": "updateName(bytes32)", +"1ae9fe6a": "cutOffBidID()", +"1aea4d0f": "setMaxSend(uint256)", +"1aea558a": "auditReport(address,uint256,uint256)", +"1aeb10a6": "testApprove()", +"1aebb44e": "firstBlockAllowedToMonitor(uint256,uint256,address,address,address,address)", +"1aebcb89": "getProfitPerShare()", +"1aec2cf9": "Subscribe(address)", +"1aeca515": "getTierIndex()", +"1aece0db": "PRE_SALE_END_TIME()", +"1aed001e": "_miningOneSelf(address)", +"1aed8e1e": "GigERC20(uint256,string,uint8,string,bool,bool)", +"1aedefda": "includes(address)", +"1aedf542": "ercOwnerClaim()", +"1aee3f91": "PRESALE_LIMIT()", +"1aef8058": "DECIMAL_MULTIPLIER()", +"1aefce3b": "ratioVote(bool,uint8)", +"1af11767": "CauldronsMinigamePresale(uint32,address)", +"1af217ab": "maxTokenPurchase(address)", +"1af26fc2": "isJobExpired(bytes)", +"1af2c9fd": "numberOfInvestors()", +"1af31d7b": "GetPoolEntranceFee(string)", +"1af32223": "get_owner(bytes32)", +"1af36a78": "level1(address,bytes32,uint256)", +"1af39907": "_inMoney(uint256,address)", +"1af476a6": "setEggTotal(uint8,uint256)", +"1af47cc7": "addSellTokensRequest(string,uint256,uint256)", +"1af48c85": "checkCertificates(uint256)", +"1af50c5e": "setDisbursementAmount(uint256)", +"1af5163f": "TokenBurned(address,uint256)", +"1af5205c": "period3Numerator()", +"1af526b0": "getSell()", +"1af5dd41": "balanceOfComision(address)", +"1af62808": "getLicensePrice()", +"1af6b60f": "ScamSealToken()", +"1af716ba": "transferFrom(address,address,uint256,string)", +"1af77842": "setE93ContractAddress(address)", +"1af82fbf": "viewDividendCooldown()", +"1af855f8": "Funding(address,uint256)", +"1af88bc1": "GetPatientFromAddress(address)", +"1af8c18a": "InitBalanceFrom961e593b36920a767dad75f9fda07723231d9b77(address,uint256)", +"1af97fb7": "getBabyGen(uint16,uint16)", +"1afa6542": "AirCoin(uint256,string,uint8,string)", +"1afaa8bf": "crowdfundPercentOfTotal()", +"1afc540d": "set_saleAddress(address)", +"1afcc95b": "getCCH_edit_21()", +"1afccfa5": "Proposal(address,address,address,bytes,bool)", +"1afd08a2": "setConfirmationTime(uint256,uint256)", +"1afd96dc": "withdrawForThreeYear()", +"1afe3e10": "getCurrentPhaseDivisor()", +"1afe56aa": "markRead(uint256)", +"1aff30dd": "getGameStats()", +"1affa814": "getProviderPriv(uint256)", +"1affcd7e": "createCollectible(uint256,address,uint256,uint256)", +"1b005a38": "authorizerOne()", +"1b00fe51": "testHypothesis()", +"1b011bd9": "test_insert_findWithHint()", +"1b027b44": "getBuyPosition(bytes32,uint256)", +"1b03316f": "getSecond()", +"1b044be7": "setFundScheme(uint256,uint256)", +"1b04803e": "contractModifierAddress()", +"1b04a435": "durationSecondsIco()", +"1b0569b2": "IPToken()", +"1b059c0a": "JoinRound()", +"1b05aeb5": "WinMatrix()", +"1b05c594": "newGame(uint256,uint256)", +"1b05ea8c": "CheckPrepare()", +"1b06128b": "burnLeftoverTokens(uint8)", +"1b06ec3b": "getAllTransactionIdsByEntityId(address)", +"1b0710b5": "TOZToken()", +"1b073c67": "XGEToken()", +"1b0762bb": "remunerationBalance()", +"1b076edc": "dataSource()", +"1b07fcc1": "linkImpact(string)", +"1b082009": "getCrowdsaleBalance()", +"1b088f70": "computeLeaf(uint256)", +"1b08d96f": "ret()", +"1b0a102c": "getPrediction(uint256,uint256)", +"1b0a5d4e": "totalPartnerSupply()", +"1b0a68f2": "decreaseMintApproval(address,uint256)", +"1b0b906b": "getMyPlayedAmount(address)", +"1b0ba14d": "InvestmentFailed()", +"1b0c72dc": "isRecipientActive(address,address)", +"1b0cb61f": "_whitelistAddress(address)", +"1b0d320f": "FriendsCoin()", +"1b0db7fe": "getAllValuesSum(uint256[])", +"1b0dbdaf": "manualReserve(address,uint256)", +"1b0dc452": "isAnOwner(address)", +"1b0e25e2": "onInitialized()", +"1b0e3061": "BCW(uint256,string,string)", +"1b0eaf78": "stop_or_resume_Contract(bool)", +"1b0f5395": "ChargeNetwork()", +"1b0f7ba9": "proxy(address,uint8,bytes)", +"1b0fa385": "transfeFrom(address,address,uint256)", +"1b0fc106": "acceptChallenge(uint256)", +"1b107f7b": "storeUnlockData(uint256,address,address,uint256,bytes32)", +"1b112541": "getPTicketSumByRound(uint256,address)", +"1b118984": "TOKEN_ICO1_LIMIT()", +"1b12b60f": "canBuyTokens(uint256)", +"1b130063": "sendPrize(address,uint256,string)", +"1b131bbd": "_split(uint256)", +"1b136c6f": "getPlayerRounds(uint256)", +"1b13756a": "getFirstBorrowAgreement(address,address)", +"1b14cd05": "verifyLockSignature(bytes32,uint256,address,address,uint256,uint256,bytes32,bytes)", +"1b1665ca": "updateLimitPerMonth(bytes32,uint256)", +"1b1686b6": "currentEthInvested()", +"1b17595f": "registerTrack(bytes32,uint256,bytes32,bytes32,bytes32)", +"1b181e58": "getOverTokens()", +"1b189efb": "EURsToken()", +"1b18f952": "test01()", +"1b18ffac": "random(uint256,int256,int256)", +"1b195a7c": "buildAddition(uint256)", +"1b19f6a3": "removeReferrer(bytes32)", +"1b1a7a58": "multiSendToken()", +"1b1b6069": "initEachPUST()", +"1b1c15d5": "tokensForInvestors()", +"1b1c6acf": "getUintField3()", +"1b1ccc47": "getDSTName()", +"1b1d6af8": "_PLUTOToken()", +"1b1d95ff": "getPow(uint256)", +"1b1da1af": "updateSharePrice(uint256,uint256)", +"1b1e5d5d": "rejectMany(address[])", +"1b1ef88d": "authorizedByUser(address,address)", +"1b1f2fb8": "preTGE()", +"1b1fe68a": "SOLO_MARGIN()", +"1b203b9d": "checkAndCloseRound(bool)", +"1b2051f6": "tempTokensPeriodOf(address)", +"1b208786": "delegatedTransfer(address,address,uint256,uint256)", +"1b2212f5": "forbidDirectDebit()", +"1b23cfd2": "AceguyToken()", +"1b258d50": "withdraw(bytes32,address)", +"1b25d0e6": "POST_ICO()", +"1b26fa6a": "priceStep1()", +"1b27274b": "testPure()", +"1b27c873": "advisorsTokensFirstReleaseTime()", +"1b27c8f2": "takeBountyTokens()", +"1b27ca21": "MonthsProfit()", +"1b27e705": "_forwardFunds(uint256)", +"1b28591c": "escapeFunds(address,uint256)", +"1b28985e": "MotorToken()", +"1b29d70a": "weiRefund()", +"1b2a8715": "notIn(bytes32[],bytes32)", +"1b2ace9d": "lockedProvider(address)", +"1b2ae899": "removeModule(uint8,uint8)", +"1b2ae964": "BuyPriceChanged(uint256)", +"1b2bd803": "issueAtIco(address,uint256,uint256)", +"1b2be5f8": "transferredAtSupplyValue(address)", +"1b2bf378": "BLM()", +"1b2d26e9": "OwOWorldToken()", +"1b2d515f": "setA(bytes32)", +"1b2d93a0": "load(address,bool,address,address,address,address,address)", +"1b2dba8c": "setCertifierId(address,string)", +"1b2e4002": "LIZAToken(string,string,uint8,uint256)", +"1b2f1109": "sntController()", +"1b302a16": "tokenUnpause()", +"1b31abda": "getGameDetails(uint256)", +"1b31c5c2": "RESERVED_TOKENS_OPERATIONAL_EXPENSES()", +"1b328100": "valueToBeSent()", +"1b33157a": "buyTickets(uint256[],uint256,bytes)", +"1b338905": "getActualDates()", +"1b33a497": "tranferToReserve()", +"1b33d412": "offer(uint256,address,uint256,address,uint256)", +"1b346a63": "testMoveWithTrust()", +"1b34737f": "setSCoinContractAddress(address,address)", +"1b347aae": "retrieveToken()", +"1b354a30": "kscIncreaseApproval(address,uint256,string)", +"1b357750": "setLegacyNFTAddress(address)", +"1b35f56f": "getCurrentlyRunningPhase()", +"1b360912": "transferTokensFromPartnersAddress(address,uint256)", +"1b369fad": "removeBlockListed(address)", +"1b36cbfc": "EtheremonDataEvent(address)", +"1b370abb": "getPreviousNode(bytes)", +"1b37cb3e": "VOCOToken()", +"1b3821e8": "addSentMessage(address,address,uint256)", +"1b385f34": "buyOmegaEgg()", +"1b3878f5": "addToEmployerTotalPaid(address,address,uint256)", +"1b391d09": "benefeciar()", +"1b393b9a": "emergencyRelease()", +"1b394dce": "_chkBuyerLmts(address,uint256)", +"1b397d79": "OurBank(address,address)", +"1b39f3d7": "timeset()", +"1b3a8e6f": "directionCount(int256,int256,int256,int256)", +"1b3a91ac": "addTiers(uint16,uint256[],uint256[])", +"1b3aaf06": "setRspTokenAddress(address)", +"1b3b5742": "PayJackpot()", +"1b3c72aa": "getAddressLevel()", +"1b3ca096": "MarketBase()", +"1b3d36de": "calculateToken(uint256)", +"1b3d803f": "TokenRegulatorService()", +"1b3e100d": "PRE_ICO_PRICE()", +"1b3e2002": "giftRock(uint256,address)", +"1b3e704a": "supplyICO(address)", +"1b3e8cda": "isEthPayable()", +"1b3ed722": "multiplier()", +"1b3efd15": "claimrefund(address)", +"1b3f2fd3": "checkAvailableTokens(address)", +"1b3f8a67": "addToSyncList(address)", +"1b3fddb8": "PRESALE_BONUS()", +"1b3ff96f": "getForecastCount(uint256,uint256,bool)", +"1b4032f5": "lastBlock_f7Hash_uint256()", +"1b40ee88": "sellArtwork(uint32)", +"1b411fc8": "createRound()", +"1b413d27": "getLuck()", +"1b414708": "hasDisclosureAgreement(uint256)", +"1b418207": "toUint64Throw()", +"1b41c096": "setStartsAtUTC(uint256)", +"1b41c134": "UsernameDoesNotMatch(bytes32,bytes32)", +"1b426d8d": "LOG_ProofFailure(bytes32,address)", +"1b42b7ab": "decreaseSalesBalance(address,uint256)", +"1b42f904": "LogFreezerAddition(address,uint256)", +"1b437d0c": "compareLastCalldata(bytes)", +"1b44a5ef": "handleSingleItem(address,uint256,uint256,uint256,uint256)", +"1b44f449": "Chain3()", +"1b45c301": "assetManager(bytes32)", +"1b4646bf": "setReferalsMinInvestLimit(uint256)", +"1b464764": "withdrawAdvisor(address,uint256)", +"1b468ed8": "addHandlerToWhitelist(address)", +"1b476945": "devTokensIco1()", +"1b477633": "determinePlayer(bytes32[],bytes32[],int256[],uint8,bytes32,bytes32)", +"1b47dbbe": "IdentityVerifier(address)", +"1b482452": "getWinnerUrl(uint256)", +"1b49d82b": "joinClub(address)", +"1b4a2001": "minReserve()", +"1b4a93aa": "SetupFuseaNetwork(string,string,uint256,uint256,uint256,address,address)", +"1b4b1cfa": "isICOPeriod()", +"1b4b546f": "ChooseA()", +"1b4c19ac": "startSale(uint256,uint256,uint256,address,uint256,uint256)", +"1b4c5a10": "SupportFund()", +"1b4c84d2": "isTradeable()", +"1b4cd2de": "ICO_START_TIME()", +"1b4cd4ef": "depositPAXTR(uint256)", +"1b4d02c2": "cryptoAgent()", +"1b4d18c1": "rateOfSpecificTranche(uint256)", +"1b4e1c4d": "increaseProductAvailability(uint256,uint256)", +"1b4f4285": "notifyNewAccount(address,address)", +"1b4f6c46": "acceptOwnership(bytes32)", +"1b4fa639": "ownerFinishContract()", +"1b4fa6ab": "getDefaultStackCheck()", +"1b503a09": "LogRmUser(address)", +"1b50ad09": "updateDuration(uint256)", +"1b5171f0": "BountyKilled(uint256,address)", +"1b517663": "mintPriceOffset()", +"1b520b68": "lethalBonusAtHitsLead(uint256)", +"1b52abde": "redeemRestore(address,uint256)", +"1b531d4b": "settings_added()", +"1b538bcc": "getCurrentVotes(uint256)", +"1b542aa7": "Swob()", +"1b55ba3a": "Start()", +"1b55c148": "BidPlaced(bytes32,uint8,address,uint256,bool,int32)", +"1b55ec45": "getTokenToBurn()", +"1b55fe4e": "setFourthAddressBalance(address)", +"1b561fe7": "getSeniorContract()", +"1b5631de": "ManualChangeStartDate(uint256,uint256)", +"1b5710ed": "_deleteAllPackedRevisionTimestamps(bytes32)", +"1b580620": "setOwner1(address)", +"1b58c88f": "restoreOwner(address)", +"1b58c943": "getNBallots()", +"1b5a8da6": "giveEthBankrollAddress()", +"1b5ac4b5": "abs(int256)", +"1b5ae2f7": "day0x1(address,address)", +"1b5c16bf": "setTargetRepMarketCapInAttoeth(uint256)", +"1b5c9ae3": "get_etc_balance(address)", +"1b5df453": "addUserWhoSell(address,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"1b5e42f5": "amountOfUnitsOutsideAdminWallet()", +"1b5e75be": "evalParams(bytes32,address,address,bytes32,uint256[])", +"1b5ee6ae": "mintToken(int256,address,uint256)", +"1b5f03a6": "getRoute(string)", +"1b5f6cea": "P3DtoTokens_(uint256)", +"1b61a179": "mulbonus()", +"1b61f340": "finishADrop()", +"1b6282e3": "issuerDelegate()", +"1b64b172": "core(uint256,address)", +"1b65144d": "burnTokensForSale()", +"1b6527b4": "GetAssignedAddress(uint256)", +"1b655054": "dataAddress()", +"1b660f15": "EthIdentity(bytes32)", +"1b66303d": "request(bytes32,uint256,uint8)", +"1b66cb00": "setTargetToken(address)", +"1b672154": "setMEAAttributes(uint256,uint256)", +"1b677b08": "total_snt_claimed()", +"1b67ab2b": "StreamNetworkToken()", +"1b68039c": "bitcoinblack()", +"1b688565": "PUBLIC_RESERVED_PERSENTAGE()", +"1b697bb2": "setBuyerAddress(address)", +"1b6aa580": "developer_new_address_for_funds(address)", +"1b6ad60a": "transferFromWithReserving(address,address,uint256)", +"1b6aed05": "grant_token_from_offchain(address,uint256,string)", +"1b6b405c": "UnableToAcceptPayment(address,bytes8,uint256)", +"1b6b6d23": "LINK()", +"1b6b8656": "setBureau(address,address,address)", +"1b6bb739": "getThreeLastInvestors()", +"1b6bc433": "addMemberAcct(address)", +"1b6c104e": "marketingAllocationTokenSend(address,uint256)", +"1b6caad9": "setPersonaAttributes(bytes)", +"1b6e37ee": "thirdWeekBonusInWeek()", +"1b6e66aa": "rescueInvestor(address,uint256)", +"1b7035ea": "getAccountStatus()", +"1b709561": "UnlockCredits(address,uint256)", +"1b70a2e1": "TerpCoin()", +"1b72194f": "getUserDivs(address,uint256)", +"1b72410b": "EladCrowdsale()", +"1b728ed4": "getAssetRawMeta(uint256)", +"1b748399": "TeamCoin()", +"1b753dad": "Mithril()", +"1b75738a": "enable(address[])", +"1b760719": "addMember(address,string,uint256)", +"1b7623be": "payInterest(address,uint256)", +"1b76929c": "getActiveGames()", +"1b769e74": "testThrowsRestartNotUpdatable()", +"1b76dd7c": "disapprove(uint256,string)", +"1b773df1": "withdrawAll(string,uint256)", +"1b775638": "ContributionReceived(address,bool,uint8,uint256,uint256)", +"1b776808": "_updatePixelMapping(address,uint256,uint256,uint256,bytes32,bytes32)", +"1b78240f": "Fixie()", +"1b78e3c4": "processHunting(uint256,uint256,uint256[])", +"1b7949e2": "supply_increased()", +"1b79a2f3": "lastStageSubmitted()", +"1b79d406": "getWhoPiad(uint256,address,address,address,address,address,address,address)", +"1b7aad1b": "AMOUNT_TOKENS_FOR_SELL()", +"1b7b7b0d": "latiumBalance()", +"1b7b7c3d": "Partnership(address[],uint256)", +"1b7bbecb": "challengeExists(bytes32)", +"1b7be47e": "STQToken(address[])", +"1b7c058e": "getLicensePrice(address)", +"1b7ccc3d": "_registerLockedDeposits(bytes32,uint256,uint256)", +"1b7ce6f3": "disableTokens(uint256[])", +"1b7cf899": "recentActivity(uint256)", +"1b7d5f8c": "release18m()", +"1b7d83e5": "addDefaultOperator(address)", +"1b7d8aaf": "End8()", +"1b7db340": "sysAdmin()", +"1b7e0902": "getcardOwner(uint256)", +"1b7e78f6": "updateFirstChangeBlock(uint256)", +"1b7f00c1": "purchaseBundle(uint8,string)", +"1b800a3d": "watchPreferersTasks(address,uint256)", +"1b814f02": "splitFunds()", +"1b8202a7": "LegalContractManager()", +"1b825e89": "detachmentTime()", +"1b82f68f": "kingdomFactory()", +"1b83b823": "notifyPlayer(uint256)", +"1b841fea": "nextDerivativeTokenTime()", +"1b848606": "blacklistEscapeToken(address)", +"1b84e72d": "_createEscrow(address,address,uint256,uint256)", +"1b851e10": "LogDeposit(address,uint256)", +"1b855044": "getHash(uint256,uint256)", +"1b85aa49": "MIN_INVEST()", +"1b862027": "save(uint256)", +"1b8689b6": "getInvestorTokensPurchasesLength(address)", +"1b878f71": "setUpgrader(address)", +"1b87945e": "buyPointer(bytes32,bytes1[64])", +"1b87ccae": "getAssetIdItemType(uint256)", +"1b87d58a": "bonusMin()", +"1b88094d": "getRecipient()", +"1b880bcf": "KareToken()", +"1b89ee31": "closeBridge()", +"1b8a0b46": "WowDiaondToken(address)", +"1b8a9031": "BetPlaced(uint256,address,uint256,uint256)", +"1b8ab64d": "testTodo()", +"1b8b13a7": "getRewardPool()", +"1b8b3605": "setInvestorList(address)", +"1b8b4787": "TOKEN_SALE2()", +"1b8b921d": "call(address,bytes)", +"1b8bd57c": "getCardInfo(uint32)", +"1b8beafe": "BLOCK_DURATION()", +"1b8ca217": "getProperties(uint256)", +"1b8d0e60": "getMyBanker()", +"1b8db774": "_deadline()", +"1b8de48c": "distributeTCASH(address[])", +"1b8e61c7": "setEndTimePreIco(uint256)", +"1b8e94a1": "Rate()", +"1b8ef0bb": "getRemainingCapacity(uint256)", +"1b8f2610": "quickCloseChannel(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)", +"1b8f3d23": "krakenTicker()", +"1b8f5d50": "multi()", +"1b8f66a4": "watchedURL(string,string)", +"1b8fc2f0": "setAllowedAddress(address)", +"1b8fc6e4": "marketorsTotalBalance()", +"1b900c27": "anotherOwner1()", +"1b924b7e": "enableInterface(string,address)", +"1b9265b8": "pay()", +"1b929940": "pushIntArray(bytes32,int256)", +"1b92bbbe": "maxDrawingTime()", +"1b92ce6b": "WOCC()", +"1b93aa8d": "getPackage()", +"1b93f66d": "claimedAirdrop(address)", +"1b9414ae": "itemBid(uint256)", +"1b94198d": "sellingAccepted()", +"1b94413f": "transferEth(bytes32,address,uint256)", +"1b949f85": "lockContractOwner()", +"1b953909": "authorizeOperatorTranche(bytes32,address)", +"1b955df4": "changeRefund(uint8,uint256,uint8)", +"1b962c65": "decodeCurrency(bytes32)", +"1b963742": "AwesomeToken()", +"1b968160": "wipeAndFree(address,bytes32,uint256,uint256,address)", +"1b96b2f9": "masterMint(address,uint256)", +"1b97429d": "EthToUsdChanged(address,uint256,uint256)", +"1b981d7f": "packedToSubmissionBits(uint256)", +"1b987c41": "retrieveExternalTokens(address,address)", +"1b98c54f": "getProviderCurveLength(address,bytes32,int256)", +"1b98cd68": "updateAffiliate(address,uint8)", +"1b98f6ac": "setProviders(address[])", +"1b9900b8": "userRollDice(uint256)", +"1b995aa7": "BitCompare(uint256,uint256)", +"1b998dac": "updateMCs()", +"1b9a91a4": "withdrawEth(address,uint256)", +"1b9b0b23": "KruhftsToken()", +"1b9bfa3a": "_oldOwnersOf(uint256)", +"1b9c7f31": "Werbecoin()", +"1b9cbdfb": "priceOfToken()", +"1b9ceef1": "purchaseTokenInPublicSale()", +"1b9d1bed": "setPOOL_edit_18(string)", +"1b9d4c8e": "setBudget(address,address,uint256)", +"1b9db2ef": "getParticipant(uint256)", +"1b9dbcaf": "kittensIssued()", +"1b9e16ad": "getAccountInfo()", +"1b9e9a27": "createComponent(string)", +"1b9f9647": "accessMyWallet(address)", +"1b9fec58": "getBlockToHashForResults(uint256)", +"1ba1648a": "changeTokensOwner()", +"1ba1f10b": "updateTaxPercentages(uint256,uint256)", +"1ba22084": "ecadd(uint256[3],uint256[3])", +"1ba23f1e": "setAllowedMultivest(address,address)", +"1ba326c4": "calcShare(uint256,uint256,uint256)", +"1ba39a4c": "calcMult(uint256,bool)", +"1ba3afd3": "getLocalGame(uint16)", +"1ba46cfd": "assetAddress()", +"1ba527d6": "gkAddress()", +"1ba54100": "distributeEbyteForEBYTE(address[],address,uint256,uint256)", +"1ba5b3e8": "currentTotalAirdrop()", +"1ba5e63f": "tournamentQueueSize()", +"1ba5eec0": "nextTurn()", +"1ba60f9b": "availableDgxNg()", +"1ba6e1bd": "externalPurchase(address,string,string,uint256,uint256,uint256)", +"1ba7013b": "distributedBountyTotal()", +"1ba83c3c": "ChargingGas(uint256)", +"1ba88666": "isBiometricLockedOnlyOwner(address)", +"1ba8ef21": "electrolightTestnet()", +"1ba9146e": "PethToken(uint256,string,string,uint256)", +"1ba91c20": "foundationMultisig()", +"1ba9998b": "advanceRound()", +"1baaeb91": "getSignature(bytes4,uint256)", +"1bab0908": "hasValidParam(address,uint64,uint64,uint64,uint64,uint64,uint64)", +"1bab8148": "fulfillMintRequest(uint256,string)", +"1bacbf4e": "secureTransfer(uint256)", +"1bacfd66": "Vote(address,bytes)", +"1bad1d2e": "monitorWallet(address)", +"1bad3903": "stakeWithCurrentPeriod(uint256)", +"1bad5558": "withdraw3(address)", +"1bad9e8f": "getUserTokenInfos(address,uint256)", +"1bada3c0": "closeKYC()", +"1badbd5c": "increaseAssuranvePayments(address,uint256)", +"1badfbae": "setWhitelistBallot(address,bool)", +"1baf1494": "QToken(address,uint256)", +"1baf7122": "custodyStorage()", +"1baf823f": "NewUsername(address,string)", +"1bafc373": "confirmNewHash(uint256)", +"1baffe38": "withdrawEtherTo(address,uint256)", +"1bb00447": "CryptonomicaVerification()", +"1bb02ffb": "MWAV()", +"1bb0b762": "A2ABToken()", +"1bb0c665": "toHexString(address)", +"1bb1151a": "Error(uint64)", +"1bb1bf2e": "team1Query()", +"1bb2921b": "getProjectedPayout(uint16)", +"1bb3fb67": "operatorSendTranche(bytes32,address,address,uint256,bytes,bytes)", +"1bb4067b": "checkPoolDone(uint256)", +"1bb409c4": "QueryBonus()", +"1bb460cc": "ContributionReceived(address,uint256)", +"1bb47b44": "appendVestingEntry(address,uint256,uint256)", +"1bb534ba": "fundingRecipient()", +"1bb58beb": "RECToken(uint256,string,uint8,string)", +"1bb5f0a2": "registerBarcode(bytes9,string,string,string,string,string,string)", +"1bb63d0c": "Nova()", +"1bb6cb47": "getPlayer2()", +"1bb73a2a": "batchCreateAuthorDrawings()", +"1bb797da": "isIcoStage()", +"1bb7c3c2": "UpdatedDonationAddress(address)", +"1bb7cc99": "WHITELIST()", +"1bb8365f": "calculateGoldBuy(uint256,uint256)", +"1bb96dff": "AuctionStarted(uint256)", +"1bbb4f63": "LogMoneyline(int256,int256)", +"1bbb696a": "swapContracts(address)", +"1bbb9a99": "claimEthers(uint256)", +"1bbc4b83": "ERC20Interface()", +"1bbc7952": "getPropertySalePrice(uint16)", +"1bbc99c6": "UpdateDividendPartners(address[],uint256[])", +"1bbce9a2": "bidState(bytes32)", +"1bbe1813": "getTotalSpecials()", +"1bbe2ff3": "TransferEtherInitiationEvent(uint256,address,address,uint256)", +"1bbe9d8c": "addFunder(address)", +"1bbec4e7": "coldWallet2()", +"1bbef399": "isVoting()", +"1bbfb029": "addTx(address,address,uint256,string)", +"1bbfce0e": "bidOnBreedingAuctionTutorial(uint40)", +"1bbfdaaf": "selectElf(uint8,uint16)", +"1bc0585f": "stopTokenSale()", +"1bc08834": "stsc()", +"1bc125f3": "finishMintingSTO()", +"1bc2b813": "divUInt(uint256,uint256)", +"1bc2dd5a": "doesContractExist(address,address)", +"1bc390dd": "reconfig(string,string)", +"1bc3c855": "setWhiteListERC223(address)", +"1bc41284": "uncleRate()", +"1bc44200": "Dasabi_ioToken()", +"1bc44213": "MAX_BID_FRAC_BOT()", +"1bc4c81b": "QuizQuestion()", +"1bc4cdb9": "ReceiveFund(address,uint256)", +"1bc4d6b2": "XXXXToken()", +"1bc50b05": "canUpdateNextGamePotSplit()", +"1bc59aa6": "bountyAllocated()", +"1bc5ee1a": "transfer_eth_to_contract()", +"1bc84458": "getAddOnSupport(uint16)", +"1bca179b": "RentedBlock(uint256,uint256,uint256,uint256,address)", +"1bca5689": "havvensReceivedForEther(uint256)", +"1bca7d6d": "NigelFundSum()", +"1bca989e": "setTokenInfoMaxPerBlockImbalanceList(uint256[])", +"1bcad37a": "getTotalCost()", +"1bcb6fa2": "snapshotValidators(uint256)", +"1bcbce52": "isEarlyInvestorsTokenRaised(uint256)", +"1bcc9b1a": "TruPreSale(uint256,uint256,address,address)", +"1bcd57c7": "ContributionAmount()", +"1bcdb8e0": "responder(uint256,uint256,uint256,bytes5,bytes14,bytes5,uint256,uint256,uint256,uint256,uint256,uint256)", +"1bcdd57d": "writeNextId(uint256)", +"1bce6ff3": "begin()", +"1bceeaa7": "resell(address,string)", +"1bcf468b": "costOfToken()", +"1bcf5241": "countCliTasks()", +"1bcf5758": "getOccupies(uint8)", +"1bcf659d": "getMinTalent(uint256)", +"1bd0c431": "updateETH()", +"1bd13df1": "GetSummFee(uint256)", +"1bd16dbf": "preSaleDuration()", +"1bd2511a": "addEarlyAccessAddress(address,address)", +"1bd27296": "_fetchCancelledOrdersForMerchant(address)", +"1bd2b37c": "isMasterRecruitment()", +"1bd2c21c": "playBigger(uint256[])", +"1bd2d4cc": "getNextIndex(uint8)", +"1bd3553e": "TheTokenA()", +"1bd5363c": "getBPaddress()", +"1bd5d127": "NaviToken()", +"1bd60ae9": "buyerBalance(address)", +"1bd61eee": "updateHeartBeat()", +"1bd6f596": "right56(uint256)", +"1bd6fb9f": "LockedFunds(address,uint256)", +"1bd72647": "round0Target()", +"1bd8b041": "PRICE_INCREASE_SCALE()", +"1bd8f9ca": "challengeFee()", +"1bd95155": "stringToUint(string)", +"1bd983a4": "PlaceSellOrder(uint256,uint256)", +"1bd9a7e7": "LogNewWhitelistUser(address,uint256)", +"1bd9c46e": "setImporter()", +"1bda6d55": "publicSaleSoldTokens()", +"1bda84b3": "getOfferIdsByToken(address)", +"1bda8781": "Taouaf(uint256,string,uint8,string)", +"1bdb3f65": "ZoomToken()", +"1bdbabdd": "registerProduct(uint256,bytes32,bytes32,uint256,uint256)", +"1bdbce49": "setWhitelist(address,address,bool)", +"1bdc4038": "_updatePurchasingState(address,uint256)", +"1bdd193a": "placeStar(uint8,uint8,uint16,uint256)", +"1bddcf48": "_asyncTransfer(address,uint256)", +"1bde9998": "getWhitelistStatus(address,bytes32,address)", +"1bde9bc1": "rebatelvlEconomy(string,string,string,string,string)", +"1be05289": "DURATION()", +"1be0717f": "_reward()", +"1be0f1ad": "getSpinOutput(uint256,uint256,uint256,address)", +"1be0f793": "USDExchange(address)", +"1be16003": "Answer()", +"1be1bf7f": "TessrX()", +"1be20ca1": "TokenCAP()", +"1be22528": "TechnicalRise()", +"1be3175e": "mortgage(uint256)", +"1be35b0c": "statusOperation()", +"1be4aaa1": "getTokenInfoHeritor(address,address)", +"1be4da5b": "MateriaPrima()", +"1be64997": "BucketCreated(bytes32,uint256,uint64)", +"1be6ce57": "decreaseOwnershipTokenCount(address)", +"1be6dd64": "points()", +"1be70510": "acceptAdoptionOffer(bytes5)", +"1be73e2b": "_fhMoney(uint256,uint256,uint256,uint256,uint256,uint256)", +"1be7c5ef": "fullfillFounder()", +"1be863bf": "PushData()", +"1be88614": "onetimeLaunch(uint256)", +"1be8dbfd": "dsMul(uint256,uint256)", +"1bea4a61": "getObjIndex(uint64)", +"1bea67b7": "BFDToken()", +"1bea69e3": "isAdmin(address,string)", +"1bea8006": "tokenBalanceOf(address,address)", +"1beafada": "PROMETHEUS_PRICE_THRESHOLD()", +"1beb2615": "destruct(address)", +"1beb375d": "proxyManagementAddress()", +"1beb4b5e": "fetchAllVoteResultBySnapshotBlock(uint256)", +"1bebf13c": "sendOrderEvent(address,uint256,uint256,uint256,address,uint256)", +"1bef9059": "ProtocolToken()", +"1befcbaf": "buyRareEgg(uint8,uint256,address)", +"1befd26a": "setDesignatedReporterWasCorrect(bool)", +"1bf028b1": "OddMoney(address,uint256)", +"1bf049b9": "Prediction(uint24,uint24,bool)", +"1bf0635b": "setGoldFeeAddress(address)", +"1bf1de9b": "COMMISSION_PERCENTAGE()", +"1bf20668": "testAdminTransfer()", +"1bf219de": "Faucet(uint256,address)", +"1bf2a90a": "totalPostIcoContributorIdsAllocated()", +"1bf38b28": "addAccessor(address,address,uint8,address,string,uint32,string,string,bytes32,bytes32,uint8)", +"1bf426ba": "Spendelotto()", +"1bf498b6": "registAgent(address)", +"1bf57f41": "salesAddress(address)", +"1bf5b38a": "finalizeDonation(address)", +"1bf5f736": "endOfDay()", +"1bf651ff": "YBHY()", +"1bf678cf": "setOtherNTech3D(address)", +"1bf6ba7e": "_transferFromOwner(address,uint256)", +"1bf6c21b": "USD()", +"1bf6e00d": "frozenOf(address)", +"1bf6e939": "accManager()", +"1bf703b2": "addCategory(string,string)", +"1bf7628b": "firstHolder()", +"1bf7d749": "curves(uint256)", +"1bf831cf": "initialOperatorValue(address)", +"1bf8c094": "setOwnedToken(address,uint256,uint256)", +"1bf983a6": "getTokenInfoMaxTotalImbalanceList()", +"1bf9b325": "deletePublicKey(address)", +"1bf9b387": "setIcoRate(uint256)", +"1bf9def0": "Transferable()", +"1bfa5d8a": "hash_pubkey_to_pubkey(uint256,uint256)", +"1bfa90bf": "getIntField1()", +"1bfaf155": "foundersWallet()", +"1bfb7245": "tToken(address,uint256)", +"1bfba595": "incrementTotalIssuerCount()", +"1bfc596b": "presaleBonusAddressColdStorage()", +"1bfc8bd1": "setRequestIdToMultiRequestId(uint256,uint256)", +"1bfce853": "vestedAmount(uint256)", +"1bfd4858": "hash_db(bytes32)", +"1bfd6814": "TRANSFERABLE()", +"1bfe0308": "removeRole(address,string)", +"1bfe3508": "triggerRecoveryAddressChange(address)", +"1bfe7831": "AllLockAccounts(uint256)", +"1bfe783e": "MaxDropReward()", +"1bfea87f": "by(bytes32)", +"1bff4786": "etherDeltaInfo()", +"1bff4bfa": "beneficiaryTwo()", +"1bff4c07": "LukaCoin()", +"1c0019c4": "getCostForTrait(uint8)", +"1c014c60": "casinoBalance()", +"1c0183e3": "TweedentityRegistry()", +"1c02708d": "killContract()", +"1c02a63d": "SetEcosystemContract()", +"1c0463de": "isUpgradeAllowed()", +"1c05123d": "LicenseIssuer(string,string,string,uint256,uint256,address)", +"1c054b14": "bonusRangeCount()", +"1c057493": "withdrawERC721(uint256,uint256,address,uint256)", +"1c07f0a3": "getAccountKeys(uint256)", +"1c080404": "contributed3(address)", +"1c08366b": "tokenPCT(string,string,uint8)", +"1c084385": "WhitehatWithdraw(address,address,address,address)", +"1c085a21": "totalRaiseWei()", +"1c088897": "MINER_AUCTION_DURATION()", +"1c08c08e": "claimBond(uint256)", +"1c09496a": "transferWithSignature(address,uint256,uint256,bytes,uint256,bytes)", +"1c09c194": "testInsertMultipleProductsIntoCart()", +"1c0acbd5": "bidOnDklSiringAuction(uint256,uint256,uint8,bytes,uint256,uint256,bytes,uint256)", +"1c0ad646": "coreAddress()", +"1c0b6367": "processTransaction(bytes,uint256)", +"1c0bbe26": "createAccountForUser(address)", +"1c0c3d33": "mintAuthorizedBatchWithBalances(address[],uint256[])", +"1c0ce15f": "TUBE()", +"1c0d1274": "setCCH_edit_21(string)", +"1c0de1b3": "LogResult(bytes32,uint8,bytes,bytes)", +"1c0e0225": "minDonation()", +"1c0e7109": "addFreelancer(address,uint256[],address)", +"1c0f12b6": "transferFrom(uint256,address,address,uint256)", +"1c0f96bb": "ManagerProxyTargetMockV1(address)", +"1c0f9a7c": "requestEURPrice(string)", +"1c114b38": "canReadInDataObject(address,bytes32[])", +"1c11fce2": "requestToken(address,uint256)", +"1c135881": "testHardCap()", +"1c1401e7": "OWNER_TRANSFER_TOKENS()", +"1c140bdd": "addCampaign(string,string,string,address,address,address,string)", +"1c14179a": "GavCoin()", +"1c14b340": "passMessage(address,string)", +"1c152982": "addEditwalletContractAddress(bytes8,address)", +"1c15b285": "getAmbientHumidityControlLimits(bytes32)", +"1c1697ae": "get_presale_arbits_per_ether(address)", +"1c169ba5": "closed_()", +"1c16c3ad": "calcAirDropAmount(uint256)", +"1c177502": "LogCollectEth(uint256,uint256)", +"1c1935ce": "getHistoricPrice(uint256)", +"1c196d77": "returnSubscriptionDesposit(uint256)", +"1c1b863b": "updateBetDataFromOracle(uint256)", +"1c1b8772": "update(address)", +"1c1bc850": "changePayee(address)", +"1c1bd814": "TIMEOUT_TIME()", +"1c1c2289": "userKey()", +"1c1d7517": "dedeNetwork()", +"1c1f6a3f": "removeTokenFrom(address,uint256)", +"1c203612": "battle(uint256,uint256,uint8[2])", +"1c20be7e": "getVestingBalance(address,address,address)", +"1c226164": "isAddressVoted(address,address)", +"1c22ac19": "aprovaDevolucao(bool)", +"1c22b196": "TransferTRAC()", +"1c22f765": "zhoudayiToken(uint256,string,uint8,string)", +"1c232194": "refundPreSale()", +"1c23281c": "GZSToken(uint256,string,uint8,string)", +"1c2353e1": "isCertifier(address)", +"1c235f5f": "getHipstermasterReq()", +"1c238e1f": "Signum(address,address)", +"1c23e280": "buyTicketsFor(address,uint256)", +"1c249494": "setStarted()", +"1c24f0bd": "applyForCertification(string,string,string,uint256,uint256,uint256,uint256,uint8,uint8,uint16)", +"1c25331d": "setMaximumNonWhitelistAmount(uint256)", +"1c25f452": "topupSupply(uint256)", +"1c27e291": "refundCoin(address)", +"1c27f30b": "Lover()", +"1c28b99e": "pressFee()", +"1c296b34": "cryptiblesAuctionContract()", +"1c2ac59d": "sosoToken()", +"1c2ac5ac": "IcoStatus()", +"1c2b1e54": "SalesManagerUpgradable()", +"1c2bbd18": "exchangeTemplate()", +"1c2d6356": "getActivityName(uint256)", +"1c2e2796": "ContractCallerProxy(address)", +"1c2e53ef": "promotionRate()", +"1c2f2f9f": "recoverAndSetSecretHash(string,bytes32)", +"1c2f38ff": "paid(uint64)", +"1c30549f": "set_rand_addr(address,uint256)", +"1c3101d3": "addRecipient(address)", +"1c3122ba": "BuyStartingSnails()", +"1c31f710": "setBeneficiary(address)", +"1c321f62": "executeLottery()", +"1c3274ff": "PlayX10()", +"1c338601": "setProviderInfoFields(uint256,string,string,uint256,string,address,uint8)", +"1c338644": "withdrawERC20Balance(address,address)", +"1c350d6b": "TRLToken()", +"1c35b76f": "VOLUME_BONUS_CONDITION()", +"1c35e7ba": "manualFinalizeRound()", +"1c363e14": "DeathFactor_v()", +"1c38f800": "currentIcoSupply()", +"1c398075": "sellClimateCoinsAgainstEther(uint256)", +"1c39b5c4": "Administrated()", +"1c39c375": "buyUninitializedPixelBlocks(uint256[],uint256[],uint256[],bytes32[])", +"1c3a36d0": "addComment(bytes3,string)", +"1c3a5713": "getProposalExternalTokenReward(bytes32,address)", +"1c3a8892": "closeRoom(uint256)", +"1c3ad417": "getBAS(bytes32,address)", +"1c3b093f": "Track(address,bytes,uint256,uint256)", +"1c3b3b9f": "expandPeriod(uint8)", +"1c3bc31f": "firstPreSaleEndDate1()", +"1c3c050c": "genTime()", +"1c3c0ea8": "setExecutor(address)", +"1c3c295e": "registerInstitutionAsset(string,string,address,address)", +"1c3cbf07": "TokenTest123()", +"1c3cf5d0": "setEditionPackPriceIncrease(uint8,uint256)", +"1c3d4f20": "ChangeBalance(address,uint256,address,uint256,uint256)", +"1c3db16d": "currentRuling(uint256)", +"1c3db9a8": "approveFlower(address,uint256)", +"1c3de07a": "calculateCoinSell(uint256)", +"1c3f2f8c": "dealsNumber()", +"1c3f7637": "isAllowedHICAddress(address)", +"1c3fe22d": "GaillardCrowdSale()", +"1c40baf5": "EUROCASH()", +"1c41d143": "KPTLToken()", +"1c41e2db": "getEducation()", +"1c423713": "addPromoCode(string,bytes32,uint256,uint8)", +"1c4261f4": "createGift(bytes32)", +"1c429165": "tryRollRoom(address,uint256,uint256)", +"1c42959c": "maximumCap()", +"1c42daf7": "winMeta(address,bytes32)", +"1c435872": "setInterRefreshLock(bool)", +"1c43814f": "registerAsSlaven(string)", +"1c43b4a6": "initAddressAsMultiOwner(address,string)", +"1c43d8b1": "EndEvent(bool)", +"1c442754": "participated(address,uint256)", +"1c448231": "SDToken()", +"1c44bac7": "tournamentBankCut()", +"1c465538": "DoFee(uint256)", +"1c465e87": "getTopOnce()", +"1c467dec": "HODLrSellWin(uint256)", +"1c47624b": "getUserProductContracts(address)", +"1c480cb6": "remove(int256,int256)", +"1c481767": "sendfrozen()", +"1c484766": "aloha()", +"1c484a34": "enableSuperDragon(bool)", +"1c488825": "MintTokens()", +"1c490883": "MelonBitIndex_Erc223Token()", +"1c49b101": "_preValidatePurchase(address,uint256,uint256,uint256)", +"1c49d19f": "finishRoundC()", +"1c4ad465": "custodyFactory()", +"1c4b0da6": "setMinSalePrice(uint256)", +"1c4b1ff7": "setGood(bytes32,uint256)", +"1c4b774b": "getReward(uint256)", +"1c4b8659": "getBoardSingleSpaceDetails(uint256,uint8,uint8)", +"1c4bcbb0": "distributePowerToAddress(address,uint256)", +"1c4be509": "forkTransfer(address,address,address,uint256)", +"1c4bfcfe": "BoxChange(address,uint256)", +"1c4c2681": "cirusToken()", +"1c4c710b": "getAreaIndex(string)", +"1c4d5608": "getSchemeParameters(address,address)", +"1c4d749b": "GetContractStateActive()", +"1c4e6cd0": "NameReg()", +"1c4ef6c2": "ethPriceInEuroCent()", +"1c4fda10": "tokenSafe()", +"1c50e880": "cancelAuctionHashing(uint256,uint64)", +"1c51a8e0": "setConfigString(string)", +"1c533a09": "Trupee()", +"1c535d96": "getuserdayeths(address)", +"1c53faf8": "backSggCoinOwner()", +"1c5412f7": "_computeCut(uint256)", +"1c54220d": "c_centsPerTokenSecond()", +"1c545049": "maxPresaleEDUSupply()", +"1c548c78": "foreignBridgeProxyOwner()", +"1c54e565": "getNextUserId()", +"1c54fbab": "getShip(uint16,uint16,address,address)", +"1c558b71": "ORIUMCOIN()", +"1c560f68": "CreatePreSale(address,uint256)", +"1c5633d7": "setPeriodLength(uint256)", +"1c566ef2": "setOperationAttributes(string,uint256,string)", +"1c568925": "addPendingUserListArr(address)", +"1c572f8c": "getICOPercentage(uint8)", +"1c5736ee": "add_record(string)", +"1c575f7f": "sendDivsToBankroll()", +"1c57a386": "oraclize_query(string,bytes[1],uint256)", +"1c581205": "targetAmount(address)", +"1c58c3ff": "totalMineSupply()", +"1c58d0d2": "_unsafeDecodeTokenId(uint256)", +"1c5992ff": "Zandar()", +"1c59a667": "disableBlacklist(address[])", +"1c59c177": "FCCContribution()", +"1c5a3942": "BPPOL()", +"1c5a5a58": "getRandomNum(address,uint256)", +"1c5a5bc4": "createShip(uint256,string,uint256,uint256,uint256)", +"1c5a9005": "HashRemoved(address,string)", +"1c5a9d9c": "activate(address)", +"1c5be3d7": "updateTimestamp()", +"1c5ca530": "IprontoToken()", +"1c5caa6b": "Rate9()", +"1c5d3c60": "stateIsWaitingProofs(uint256)", +"1c5d9faa": "setNickname(string)", +"1c5daad7": "_maint_withdrawFromPool(uint256)", +"1c5eaa23": "findByModuleText(string)", +"1c5ef50b": "Rasper()", +"1c5f2810": "setnewowner(address)", +"1c5f3176": "someMethod4(uint256,uint256,uint256)", +"1c5f8675": "getMyTuple()", +"1c5fe1a4": "TeamAmount()", +"1c606dd3": "GetConstructCost(uint256,uint256)", +"1c607f14": "setDynamicArraySize(uint256)", +"1c60a158": "TEAM_TOKEN_AMOUNT()", +"1c60f3bb": "buyEthCards(uint256,uint256)", +"1c61babe": "CelsiusToken(uint256)", +"1c61bd38": "showValue()", +"1c61eeb0": "acceptRelayedCall(address,address,bytes,uint256,uint256,bytes,bytes)", +"1c61f2bc": "fuckingClaim2(bytes,bytes)", +"1c623ddd": "reward(bytes32,uint8,bytes32,bytes32,bytes32,uint256)", +"1c624a60": "qtyInitiators()", +"1c624d19": "mintObizcoinTokens(address,uint256)", +"1c637987": "_setAuctionStatus(bytes32,uint8)", +"1c638376": "setProductAttributesByRegulator(string,string,uint256,uint256,string)", +"1c63c6c3": "setPartData(uint256,uint256,uint256[])", +"1c64065d": "myInfraList(address,uint256)", +"1c6416ad": "pubaddr()", +"1c65706e": "allowInvest(address,address)", +"1c657c63": "setEtherInUSDInternal(string)", +"1c668855": "getGenotype(uint256)", +"1c674fba": "createRandomBox(string,address,uint64,uint256,uint128)", +"1c67a7aa": "TransCompleted()", +"1c67e9a6": "setTokenStatus(bool)", +"1c68571d": "bonusLimit1()", +"1c6868c8": "adjustBonusPrice()", +"1c68fe82": "listProperty()", +"1c69ad00": "balance0()", +"1c6a0cf8": "GuangPengChain()", +"1c6a866c": "Collect_accrued_interest_and_transfer(address,uint256)", +"1c6b69b7": "rateCent()", +"1c6b7c1d": "EtherTransfer(address,address,uint256)", +"1c6ba386": "_claimReward(address,uint256)", +"1c6be97d": "allowanceRewriteTest(address)", +"1c6ce9a3": "executeSendCapital(address,uint256)", +"1c6d31f7": "xxx()", +"1c6d4575": "getTokensAmountAllowedToWithdraw(uint256)", +"1c6d6483": "approveMappingProposal(address)", +"1c6debbb": "UnionChainSupply()", +"1c6e3899": "getTierId(uint256)", +"1c6ef374": "recordingResultsOfBet(bytes32,bytes32[],uint8[])", +"1c6f609b": "cooperativeClose(address,uint32,uint192,bytes,bytes)", +"1c6f634e": "oracleItQuery(string,string)", +"1c70362c": "setSettingValues(uint8,uint8,uint16,uint16,uint16,uint16,uint16,uint8,uint8,uint32,uint32,uint8)", +"1c7040cc": "setProxyCurator(address)", +"1c7106e6": "setOracleAPIAddress(address)", +"1c7276f5": "updateLuck(uint256,uint8)", +"1c72961d": "setRandomSign(address)", +"1c72e225": "transformSeedToFlower(address,uint256)", +"1c7307f4": "get_topl_address(address,address)", +"1c732d83": "centsToWei(uint256)", +"1c73561f": "jobCompleted(bytes16,address,address,uint256,uint256)", +"1c73601e": "getUncorrelatedRN(uint256)", +"1c74d5c8": "Successor(address,address)", +"1c7564cb": "DWMP()", +"1c75b6b2": "setDevFee(uint256)", +"1c75f085": "teamAddress()", +"1c761245": "buyDOTCH(uint256)", +"1c762a27": "show_Balance_of_interest_bearing_deposit(address)", +"1c76e2b2": "getOrderBookKey(uint256)", +"1c77a4ec": "Lemmon()", +"1c77c58c": "collectRoundLength()", +"1c7a08ef": "isActivate(uint256)", +"1c7a39e2": "_distributeRewards(address,address,uint256)", +"1c7a3c9d": "setExchangeContractAddress(address)", +"1c7a3d31": "updateNextOrderUser(address,address,uint256,address,address)", +"1c7b10aa": "merkleTreeRoots(uint256)", +"1c7b530a": "secondTotalSupply()", +"1c7bfdce": "test_votingWhenCertified()", +"1c7cf44c": "claimCommit(bytes32)", +"1c7d5334": "DORCoin(address)", +"1c7f3a96": "getMarketCreatorSettlementFeeDivisor()", +"1c7f578a": "mintC()", +"1c7f6942": "getPlayerSpaceshipModelByIndex(address,uint256)", +"1c7f98ca": "getRunInfo()", +"1c800d64": "insert_helper(uint256,bool,uint256)", +"1c81525c": "NitinToken()", +"1c81bcfb": "dividendPathways()", +"1c81ed15": "raiseSupply(uint256)", +"1c8293c4": "PriceChanged(uint256,uint64)", +"1c82a013": "onOffCrowdSale(bool)", +"1c844171": "bakkaToken()", +"1c8499e5": "greeter()", +"1c857765": "sumElements(uint128[])", +"1c85d890": "productListing(bytes32)", +"1c85ee51": "getBasicIncome()", +"1c8670fc": "endEarlyStage4()", +"1c8685e0": "WXSLToken(uint256,string,string)", +"1c87055f": "Fund(address,address,address,address,address,address,address,address[])", +"1c870eee": "setUserPermission(address,bytes4)", +"1c878c97": "releaseLockAgencyLock1()", +"1c879c47": "getMarketHashes(bytes)", +"1c87deec": "returnTokenDepositState(address,bytes32)", +"1c895915": "getNumberOfPayments(uint256)", +"1c89f174": "calculateUserBid()", +"1c8a1e20": "membershipAddress()", +"1c8a3821": "AllocateFounderTokens(address)", +"1c8a7795": "archiveText(string)", +"1c8c4509": "addSiteSet(uint256,uint256)", +"1c8ca56d": "stopSelling(bool)", +"1c8cba3b": "getSubjectClaimSetSize(address,uint256,uint256)", +"1c8ce890": "disburse(address)", +"1c8d25bc": "proposed_beneficiary()", +"1c8d51e6": "getSentAmount()", +"1c8d5d38": "allowance(address,address,bytes32)", +"1c8dddbd": "editContributors(address[],uint256[])", +"1c8e9a6f": "commitWork(uint256)", +"1c8eac0f": "endFunding()", +"1c8f7570": "depositLogic(address,uint256,uint256,uint256)", +"1c90e9cf": "testwallet8()", +"1c9193c0": "TakeOut(uint256)", +"1c91a6b9": "startExit(uint256,bytes,bytes,bytes)", +"1c921e16": "claimHeirOwnership()", +"1c92b497": "crowdsaleInitialSupply()", +"1c92cab2": "auto_transfect(address[])", +"1c931313": "setDesignatedReportDueTimestamp(uint256)", +"1c931439": "getLockedContractAddress(address)", +"1c933e2f": "multiplyDecimalRoundPrecise(uint256,uint256)", +"1c946642": "intellisys()", +"1c949bdf": "setEtherollAddress(address)", +"1c95b42e": "payBonus()", +"1c95c89d": "authorizeForToken(address,address)", +"1c96b242": "balanceOfReal(address)", +"1c96ef03": "Presale(address,address,address)", +"1c9713bd": "transferTobucketOneContract(address)", +"1c973c57": "getSpecialityValue(uint256)", +"1c982066": "refreshGameTime()", +"1c983347": "maxBidPercent()", +"1c98680f": "_redeemByDefaultTranches(address,address,uint256,bytes,bytes)", +"1c990670": "realDividends(address)", +"1c991783": "mintUniqueTokenTo(address,string,uint256)", +"1c997344": "createBid(bytes32,address,uint256)", +"1c9981f8": "donate(address,address,bytes4)", +"1c99d341": "removeParty(uint256)", +"1c9a5ddf": "returnBox()", +"1c9ab3ad": "getBlockData(uint256)", +"1c9ad79d": "newCampaign(string,address,uint256,uint256,address)", +"1c9b612e": "ledTokensAllocated()", +"1c9c549d": "buyEggPrice()", +"1c9cae74": "removeScore(uint256,uint256)", +"1c9cafd7": "tan(int256)", +"1c9cf54c": "getStockAmount(address,uint256)", +"1c9e9999": "migrateDungeon(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"1c9f289d": "setCCH_edit_6(string)", +"1c9f369e": "purchase_propose(uint256)", +"1c9fbb11": "finishPreSale3()", +"1c9fe5d7": "BRONZE_AMOUNT_TPT()", +"1c9feaa5": "isExecuted()", +"1ca0076c": "multisend2(address,address,address[],uint256[])", +"1ca03b8e": "senderHasRole(string)", +"1ca0a28d": "multiTransfer(address,address[],uint256[])", +"1ca19ece": "IsaDalawa()", +"1ca2d6b7": "WalletChange(address,uint256)", +"1ca2e94a": "setPresalePhase(uint8)", +"1ca3630a": "updateComponent(string)", +"1ca3d4b7": "icoPhase4End()", +"1ca4399b": "DEV_TEAM_HOLDER()", +"1ca43cef": "ADMISSION_TIME()", +"1ca46d61": "bigChicken()", +"1ca5df03": "multiVesting(address[],address,uint256[],uint256[],uint256[])", +"1ca60aeb": "setMeltingContract(address)", +"1ca750f4": "privateSaleTokensSold()", +"1ca7bcc7": "toBytes32(bytes,uint8)", +"1ca84592": "RA(address)", +"1ca84efc": "secondTTaxAmount()", +"1ca89953": "batchFund(uint16[])", +"1ca8b6cb": "totalTokenSupply()", +"1ca9ad47": "createLockingTokenVaults()", +"1ca9fb9d": "updateContract(uint256,uint256,uint256,uint256)", +"1caa0c6d": "saleExchangeRate5()", +"1caa5ccb": "startDapp(address,address)", +"1caaa487": "tokenOwner(uint256)", +"1caba41f": "decimalUnits()", +"1cabc5ed": "userVoteFor(address,uint256,uint256)", +"1cabc785": "getPlayerDefend(uint256)", +"1cabe3ef": "pethPEReth(uint256)", +"1cac31d7": "setAdvisorsTokensWallet(address)", +"1cac7b7f": "MINERTA()", +"1cad5a40": "depositERC20(address,address,uint256)", +"1cadd93e": "initPlayers()", +"1cae7c2f": "TransferCoinsEther()", +"1cae947a": "firstPrivateLockedAmount()", +"1caf1752": "Coinvilla()", +"1cafc144": "distruggi()", +"1cb07902": "mintMore(address)", +"1cb08889": "MERIDIANERC20(string,string)", +"1cb0d481": "transferTokens(address,uint256[],uint256[])", +"1cb120d6": "ENSRegistry()", +"1cb1778a": "setup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256[],uint256[])", +"1cb20fe6": "Devcoin()", +"1cb252fe": "investorsTotal()", +"1cb2dbf6": "Reduction(string,address,uint256,uint256)", +"1cb3bbc0": "updateGlobalUnlockTime(uint256)", +"1cb3d9be": "grantEditorRights(address)", +"1cb5bfc4": "LogBet(bytes32,address,uint256,uint256,uint256,uint256)", +"1cb64196": "ethStore()", +"1cb6adec": "tubFab()", +"1cb6d99a": "buyTokensOthersCoins(address,uint256,string,string)", +"1cb78879": "TitleDelisted(uint256)", +"1cb82d79": "registrarOwner()", +"1cb9a02a": "calculateScore(uint256,uint256)", +"1cb9ce63": "makeCall(address,bytes)", +"1cba6f79": "_isERC721Contract(address,address,uint256,bytes)", +"1cbaaea7": "set_payment_details(uint256,string)", +"1cbaee2d": "saleStartTime()", +"1cbb67c4": "FooUser(address)", +"1cbc5ab1": "Buy(address,uint256,uint256)", +"1cbcb9b9": "BellaBluToken()", +"1cbcc77c": "test_suicide()", +"1cbd0519": "accountLevel(address)", +"1cbda93d": "p_update_mResalePlotDevPercent(uint256)", +"1cbea83d": "proposalReason(uint256)", +"1cbea99b": "getAddress(address[],bool,bool)", +"1cbeae5e": "winner(uint256)", +"1cbfbe47": "assignTokensToMultipleInvestors(address[],uint256[])", +"1cc0eb83": "kickcityWallet()", +"1cc13dff": "totalplayers()", +"1cc1cf46": "paymentInterval()", +"1cc1e7bc": "appendPacket(bytes)", +"1cc2502e": "auctionList()", +"1cc47026": "trans(address,address,uint256,uint256)", +"1cc48f08": "getResolverAllowance(string,address)", +"1cc54204": "totalGenesisAddresses()", +"1cc69ac1": "assignNewParcel(int256,int256,address)", +"1cc6ba74": "testWIP()", +"1cc6ea05": "populateStringMember()", +"1cc6f13d": "setComplianceService(address,address)", +"1cc70934": "getPolicyLockedPercentage(uint8)", +"1cc72c04": "CheckPoolOwnership(string,address)", +"1cc78eb6": "RANGEEND_1()", +"1cc8092f": "FOURTH_TIER_DISCOUNT()", +"1cca13d3": "is_watched(address)", +"1ccb2601": "FoodWithdrawEvent(address,address,bool,uint256,uint256,uint256)", +"1ccc7013": "setPriceAt(uint16,uint16,uint8,uint256)", +"1ccd2706": "CatholicCoin()", +"1cce70d4": "getHowManyWinners()", +"1ccf6955": "getBets(uint256)", +"1ccf8abe": "phiWon()", +"1cd01e3a": "collectPercent()", +"1cd07895": "DmlToken(address,uint256)", +"1cd0b87f": "B33RToken()", +"1cd23711": "nouveauContrat(address,address[],uint256[])", +"1cd30149": "paybackRequired()", +"1cd3072b": "transferSub(address,address,uint256)", +"1cd30a3a": "randomGen(bytes32,uint256)", +"1cd3b754": "preICOcoinsLeft(uint256)", +"1cd421cc": "Show_Product(uint256,uint256)", +"1cd45773": "getruns(address)", +"1cd58891": "requestRedemption(uint256,uint256,bool)", +"1cd60a85": "setFiscal(bytes32,bytes32,bytes32,uint256,uint256,uint256)", +"1cd732c1": "currentEthPrice()", +"1cd73845": "updatePremiumCalculator(address)", +"1cd76498": "crossForkFund()", +"1cd8b96c": "poolDLock()", +"1cd8d8a9": "checkTeam(address)", +"1cd95d2a": "_freeze(address,uint256,uint8)", +"1cda37f2": "eraseRecords(bytes32)", +"1cdadfae": "balanceNotEqual(address,uint256,string)", +"1cdb0989": "getMaxEmpruntable(address)", +"1cdb8571": "left2(uint256)", +"1cdc3f8a": "STQPreICO(address,address)", +"1cdc51e7": "requestRates()", +"1cdce200": "walletOne()", +"1cde0ff0": "withdrawScamEarnings()", +"1cde3cde": "BDIToken()", +"1cdeae52": "setSynopsis(string)", +"1cdef3ed": "agree(uint256,address)", +"1ce00c50": "registerUnlock()", +"1ce10a9d": "get_Sponsored_Amount_in_Job_By_Address(uint256,address)", +"1ce1e1b8": "White(address,uint256)", +"1ce26ecd": "addOwner()", +"1ce26faa": "fundingEndsAt()", +"1ce28e72": "getLimit(address)", +"1ce30927": "getOption(uint256,uint256)", +"1ce477d8": "createTransferEvent(bool,address,address,uint256)", +"1ce48441": "getrm()", +"1ce5e9a6": "getOption(uint256)", +"1ce62383": "expected()", +"1ce624d6": "Crypted_RPS()", +"1ce6717d": "CouponDeposit(address[2],uint256[8],uint256)", +"1ce6a810": "KBKJToken()", +"1ce7d9da": "ico_finish()", +"1ce7eff3": "bytecodeAt(address)", +"1ce817ab": "NoWinner(address,uint256,int256,string)", +"1ceb1b87": "setCanAcceptTokens(address,address)", +"1ceba89b": "getH3Bidder()", +"1cecb935": "isSignedNoEnc(uint16)", +"1ced2c75": "SpritzCoin()", +"1cedf8a3": "getDarknodeOwner(address)", +"1ceea715": "GetMyInvestFee()", +"1cef2b4e": "TokenCreated(address,uint256)", +"1cef3c13": "StandardTokenFreezer(address)", +"1cef92b1": "getRewardStatus(address)", +"1cf081f6": "changeProductionFee(uint256)", +"1cf190b0": "getAvailableInvestmentsBackValue(address)", +"1cf196df": "changeCommissionFee(uint256)", +"1cf19ad7": "Mundo()", +"1cf1bb72": "releasedAmount(address)", +"1cf25dc9": "incentivisingAddress()", +"1cf28a65": "expand()", +"1cf28ae3": "_bonusTime1()", +"1cf2de25": "MinterUpdated(address,address)", +"1cf3d16d": "LogRegularityConfirmation(address,bool,bytes32)", +"1cf41a81": "deployContract(uint256)", +"1cf43b63": "extractExportFeeChargeLength()", +"1cf52f2b": "isActiveRegistrant(address)", +"1cf57f67": "future_round_coins()", +"1cf67724": "getImplChangeReq(bytes32)", +"1cf73c13": "setStake(uint256,uint256)", +"1cf74ece": "left56(uint256)", +"1cf91bf2": "setOwnerAtomsCount(address,uint256)", +"1cf9c88a": "addAction(string)", +"1cfa42d0": "isReleaseRecordExist(uint256)", +"1cfa8e65": "_requireBalance(address)", +"1cfac68e": "BitSelectModerado()", +"1cfb4e1b": "InsureShares()", +"1cfb7c9a": "ifAllowed(string,address)", +"1cfbc7d0": "finalRewardPeriodEndBlock()", +"1cfc832e": "invalidateProposal(bytes32,bytes32)", +"1cfcc5bb": "checkGameSideAmount(uint256,uint256)", +"1cfce386": "calculateTarget()", +"1cfd11d5": "getDungeonDetails(uint256)", +"1cfdf90e": "updateWinnersList()", +"1cfe04a7": "canPay()", +"1cfe699e": "getFreezingSummaryOf(address)", +"1cfef64c": "SEELE_TOTAL_SUPPLY()", +"1cff272e": "show_Accrued_Interest(address)", +"1cff3e09": "testCreateBallotContract()", +"1cff79cd": "execute(address,bytes)", +"1cff87db": "burnMyQUATransferAndSendQUAToSomeone(uint256,address)", +"1d000b61": "BNT_TOKEN()", +"1d007f5f": "changeDAO(address)", +"1d010815": "createSaleAuctionERC20(uint256,address,address,uint256,uint256,uint256)", +"1d012c8e": "gameIsOver()", +"1d017b28": "setUnownedNumOfExoTokensBonus(uint256,uint32)", +"1d0192e1": "editEntity(address,bool,bytes32)", +"1d01ee9d": "BPX_per_ETH()", +"1d0205b8": "months(uint256)", +"1d029641": "rntTokenVault()", +"1d02fb06": "nCryptToken()", +"1d03842f": "onePlus(uint256)", +"1d048136": "setBaseStamina(uint256)", +"1d04c92b": "appendKeyValue(string,int256)", +"1d05bcb3": "dividendsRound()", +"1d05c57e": "_createCobeFriendWithTime(uint256,uint256,uint256,uint256,address,uint256,uint256)", +"1d05d1d8": "refundContributorEnd()", +"1d065dde": "_transferWithReward(address,address,uint256)", +"1d075862": "getUpgradeProposals()", +"1d079c20": "IETToken(address)", +"1d07b797": "destroyTheUniverse()", +"1d0806ae": "initialPrice()", +"1d08837b": "setBaseRate(uint256)", +"1d09ba2c": "right15(uint256)", +"1d0a3cb8": "suspendedPayments()", +"1d0ba36e": "transferToPartner(address)", +"1d0cc1e7": "fullfillTeamAddress()", +"1d0ced55": "IonicCoin()", +"1d0d35f5": "isContributor(address)", +"1d0d5992": "transferBetweenUsers()", +"1d0e8a4d": "isShop(address)", +"1d0f2c99": "setTarget(uint256,uint256)", +"1d103139": "commissionCheck()", +"1d107603": "totalInitialBalance()", +"1d111d13": "withdrawBNB()", +"1d121dfe": "communityGrantsAmount()", +"1d123801": "airDropNum()", +"1d124fe4": "setUtils2(address)", +"1d128687": "myDividendsNo()", +"1d12b52f": "AKBToken()", +"1d130935": "isSuspended()", +"1d143848": "issuer()", +"1d14e5ff": "crowdSaleDonate()", +"1d153624": "CIBNLiveInteractiveToken()", +"1d15f317": "SUFFICIENT_STATUS()", +"1d16d1bb": "setComponent(string,address)", +"1d16d9a0": "sendETH()", +"1d184872": "lastrandom()", +"1d18ee83": "getCurrentHardcap()", +"1d1997a0": "lengthNotEqual(int256[],uint256,string)", +"1d19a56d": "claimFeeRebate(uint256,bytes32,bytes32,bytes32,uint8)", +"1d19a78e": "deactivateHedge(address,uint256)", +"1d19ffc3": "uniqueIds(uint256)", +"1d1a696d": "contains(bytes32)", +"1d1a7c32": "concat(bytes,bytes1,bytes,bytes1)", +"1d1ac66a": "signOut(address)", +"1d1ada90": "manuallyAssignTokens(address,uint256)", +"1d1ca65b": "BROKER_RESERVE_ADDRESS()", +"1d1cc622": "CurrentDistribPublicSupply_()", +"1d1ce884": "VoteCommitted(address,uint256,uint256)", +"1d1eda5e": "setBonusesForTimes(uint32[],uint32[])", +"1d1eff42": "AccessRevoke(address)", +"1d1fe108": "burnInvestorTokens(address,uint256)", +"1d209605": "Controllable()", +"1d20a9c9": "setCardActive(bool)", +"1d211d74": "tokensToSale()", +"1d21f252": "getInvertedPrice(address)", +"1d222b77": "UserUpdate(address)", +"1d231b2c": "_blackListed(address)", +"1d24190c": "GetGiftInfo(string)", +"1d24310d": "setTransferMode(bool)", +"1d2531f3": "is_alive()", +"1d25a5eb": "CGToken()", +"1d25bba2": "addSomeCWCsTo(address,uint256)", +"1d25c1a5": "get_remaining_quantity()", +"1d2627bb": "setEidooWallet(address)", +"1d263b53": "callSecondTarget()", +"1d263f67": "flip(bool)", +"1d27769f": "participate(string)", +"1d289e57": "regulationsFulfilled()", +"1d291990": "getNumberOfBid()", +"1d293500": "gamePayOutWinner(address)", +"1d296e8d": "geneLabAddress()", +"1d29de63": "clearAllCandidates()", +"1d2a6dcf": "getNumArchers()", +"1d2aa5b3": "skip()", +"1d2aabcb": "MicroBitcoinToken()", +"1d2af28b": "pay055loyal(address)", +"1d2b4ae7": "BuyStartingSnail()", +"1d2b63bf": "GetNumber(address,uint256)", +"1d2b7155": "activateImportFeeChargeRecord(address)", +"1d2b8d96": "MintICO(address,address,uint256)", +"1d2bca17": "MyToken(uint256,string,uint8,string)", +"1d2bf543": "fetchCoinAge(address,address)", +"1d2c1b59": "query(uint256,bytes32,string,string,uint256,uint256)", +"1d2d4c34": "test_assert()", +"1d2d8400": "delegateToNewContract(address)", +"1d2d86dc": "setChecksum(bytes32)", +"1d2d9b06": "raiseEvent(string)", +"1d2dbb22": "CancelMyInvest()", +"1d2e18cd": "stageOneStart()", +"1d2e2cc4": "ENS()", +"1d2e5a3a": "setSale(bool)", +"1d2eda60": "DIUToken()", +"1d2ee278": "Angel()", +"1d2fd267": "getCarCurrentPriceAuction(uint32)", +"1d2fed16": "updateRates(bytes4[],uint256[],uint256)", +"1d300421": "NuruToken(uint256,uint256,string,string,uint8)", +"1d30d3db": "Transfer(address,address,string,uint256)", +"1d3231d4": "totalCommitted()", +"1d32a70c": "upgradeMining(uint256,uint256)", +"1d32ab99": "originTransfer(address,uint256)", +"1d32f106": "openZoneTeller(bytes2)", +"1d32f29a": "SetDescript(string)", +"1d33267a": "revokeGrant(uint256)", +"1d333265": "_removeCryptantFragments(address,uint256)", +"1d3390a1": "carefulSendWithFixedGas(address,uint256,uint256)", +"1d34be47": "updateRefund(uint256,uint256,uint256,bytes32)", +"1d34cf60": "getNumSuppliers()", +"1d351f53": "decreaseAllowanceToken(address,uint256)", +"1d356eef": "getDepositEtherForAddressValue()", +"1d3639ec": "preDGZTokensSold()", +"1d365669": "transferDirectoryToken(uint256,address,uint256)", +"1d36e06c": "tokenIndexToOwner(uint256)", +"1d36ee16": "RBC(uint256,string,string)", +"1d376a44": "PriceOracle(uint256)", +"1d3795e8": "startFreeGet()", +"1d37c8a6": "setPurchaseRate(uint256)", +"1d381240": "addKey(bytes32,uint256,uint256)", +"1d38869b": "ShopiBlock()", +"1d38bebd": "isInitialAuctionEnded()", +"1d38e433": "gasForIAD()", +"1d38fcda": "freeze(address[])", +"1d3a5dbe": "requiredPrefix()", +"1d3b9edf": "times(uint256,uint256)", +"1d3ce58d": "currentMintable()", +"1d3d4c0b": "make_contact(bytes32[])", +"1d3d93d4": "activateCurrency(address)", +"1d3e2d1b": "changeFriend(address,address)", +"1d3e43c8": "VCcoin()", +"1d3e904e": "BasicSPIKE()", +"1d3f6f1b": "setFounderMultiSigAddress(address)", +"1d3f864b": "campaignCaptain(uint256)", +"1d3f90c6": "bonusUnlockTime()", +"1d40bbcf": "_addMember(address)", +"1d411612": "EthernetCashAddress()", +"1d4233b9": "flushEth()", +"1d42cf72": "nochange()", +"1d433d52": "_getbonusRate()", +"1d43776e": "rngAddress()", +"1d43b653": "submitTransaction(address,uint256)", +"1d43cc98": "increaseTotalSupply(uint256)", +"1d4494f1": "changeApiUrl(string)", +"1d45e9e1": "notEqual(uint256[],uint256[],string)", +"1d461b83": "airdropMDL(address[],uint256)", +"1d46ef0a": "OxBitcoinExchange(address,address,address,uint256,uint256,uint256)", +"1d47ae34": "YShare()", +"1d47f8c1": "getApprovals(address,uint256)", +"1d480d8b": "addRefBonusWithRefs(address,uint256)", +"1d49e081": "EXECUTE_EXTRA_GAS()", +"1d4a48b7": "Start7()", +"1d4a9209": "initializeTokenSale(uint256,uint256,uint256,uint256,address)", +"1d4ac2b6": "yearteam()", +"1d4b0796": "updateTxStats()", +"1d4b11e4": "ownerOfLandMany(int256[],int256[])", +"1d4be3df": "getFoundAddress()", +"1d4c8e5d": "removeAddressesFromBonuslist(address[])", +"1d4cecaa": "setInfo(uint256,bytes32,string)", +"1d4d691d": "fill(address,uint256,address,address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)", +"1d4d8656": "donateAuthor()", +"1d4d8808": "_getFeeHistory(uint32)", +"1d4eaf06": "StoreFile(uint256,bytes32,string,string,string,string,string,uint256,bytes)", +"1d4f2c6d": "setMythicalGravatar()", +"1d4f3e8b": "getCLottery()", +"1d4f9bbf": "NewTTL(bytes32,uint64)", +"1d50169c": "sendToken(address,uint256,uint256,uint256)", +"1d5023c8": "setReferrerAddress(address)", +"1d511879": "buyTokensPresale()", +"1d523047": "COMMUNITY_TOKENS()", +"1d523107": "SOFT_CAP_IN_TOKEN()", +"1d52573f": "set_address_B(address,address)", +"1d532a97": "increaseAssetsCertified(uint256)", +"1d5407aa": "helpCoinAddress()", +"1d5459f7": "updateFundAddress(address)", +"1d545d09": "crowdsaleEndTime()", +"1d54ab74": "_getRateIndex(uint256)", +"1d54e16e": "reinvestPartial(uint256)", +"1d570166": "previligedAddApproval(address,address,uint256)", +"1d57b474": "updateMAX_BET(uint256,uint256)", +"1d57bcf7": "ProofLibInterface()", +"1d590771": "TeuToken()", +"1d598d10": "BitcoinBlue()", +"1d59cde3": "retrieveEarnings(address)", +"1d5a9f3f": "object_types(uint256)", +"1d5aca61": "ZITRON()", +"1d5b26b1": "presaleMarket()", +"1d5b9efe": "mintAfterSale()", +"1d5c7ef5": "getPaymentToAddRemoveCountry(string,bool)", +"1d5de3fb": "ECOToken()", +"1d5e3350": "transferReservedTokens(uint256)", +"1d5e3f6d": "sumOfN(uint256,uint256,uint256,uint256)", +"1d5ea379": "newUserFrom(address,string,string,string)", +"1d5f624a": "unPaidBurnTokens(uint256)", +"1d5fe710": "finalizeCurrentStage()", +"1d60208a": "TrezorMultiSig2of3(address,address,address)", +"1d608659": "onWhitelist(address)", +"1d60993b": "stakeScale(uint256)", +"1d62a312": "thirdPreSaleDate()", +"1d62a40f": "DungeonChallenged(uint256,address,uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)", +"1d62c5bf": "PublicSold()", +"1d6456c4": "_transfer(address,address,uint256,uint256)", +"1d645b12": "getEventInfo(uint256)", +"1d6477e1": "reclaimableLand()", +"1d64976b": "HBCM()", +"1d65551d": "updateRenExSettlementContract(address)", +"1d659153": "CanObtainChip(uint32)", +"1d65d60e": "PRE_ICO_MAX_TOKENS()", +"1d66105b": "buyDrangon()", +"1d66ff8e": "getInvestorDividends(address)", +"1d68463e": "CreateSWP(address,uint256)", +"1d68b449": "crowdClosed()", +"1d6916ab": "buyTicket(uint256,uint256,string)", +"1d693910": "Piezochain()", +"1d69ccdc": "SuccessfulVote(address,bytes32,bytes32)", +"1d6a8bda": "enableTokenTrade(address)", +"1d6b5d2c": "setDnaMixerAddress(address)", +"1d6b867c": "getGamePlayer(uint256)", +"1d6c0dfa": "setActiveHero(uint256)", +"1d6c263c": "Election()", +"1d6ca15d": "Presale(uint256,address,address,address,uint256,uint256,uint256,uint256)", +"1d6d8d60": "modifyMilestoneTo(address,uint8,uint8)", +"1d6f5e03": "PubkeyChanged(bytes32,bytes32,bytes32)", +"1d6f757d": "withdraw(uint256,uint8,bytes32,bytes32,uint256)", +"1d6fe151": "ROSCtoken(uint256,string,string)", +"1d704684": "setBinanceCoinPrice(uint256)", +"1d706777": "getCertifier(address)", +"1d7099d3": "payFromAllowance(address,address,address,uint256)", +"1d709ab4": "set_transfer_gas(uint256)", +"1d718288": "referralTokensAvailable()", +"1d71929d": "MIAMIcoin()", +"1d71a1cd": "newIncome(string)", +"1d724a7a": "getFounderStatus(address)", +"1d731345": "calculateRoom(uint256,uint256,uint256)", +"1d7315cc": "storedAmount()", +"1d732304": "generateRand(uint256)", +"1d73268a": "PHDToken(uint256,string,string)", +"1d733337": "participantRegistered(address)", +"1d73fb93": "autoTransfer(address,uint256)", +"1d747131": "getTotalApprovers()", +"1d74c1a8": "_addToFund(uint256,bool)", +"1d74f3a5": "DIRT()", +"1d75493a": "setWinnerPlaceDistribution(uint256,uint256)", +"1d755c8d": "recieveVote(address,bytes32)", +"1d759214": "minMinBuyETH()", +"1d75a4b9": "viewAuthorized()", +"1d7630f0": "signedTransferFromCheck(address,address,address,uint256,uint256,uint256,bytes32,address)", +"1d7747d1": "addAuthByCode(string,string)", +"1d777856": "tokensForBurn()", +"1d7786e3": "numToksSwitchedOver()", +"1d77d696": "setMockUint256(bytes4,uint256)", +"1d780960": "pauseGame(uint256,bool)", +"1d786cd0": "widthdrawEtherDelta(uint256)", +"1d7876e7": "transferBack()", +"1d78ca63": "AuctionClosed(address,uint256)", +"1d790c99": "parseData(bytes,uint256)", +"1d7915ad": "setSeed(uint256,uint256)", +"1d793e9a": "batchChangeChannel(address[],uint256[],uint256,uint256)", +"1d7add35": "appendPricePoints(uint64[])", +"1d7b46b2": "tokensPurchasedTotal()", +"1d7b5baf": "setUint(int256,bytes32,string,uint256)", +"1d7b6d58": "forkAndRedeem()", +"1d7bb2db": "CasinoCoin()", +"1d7bc449": "getCeleb(uint256)", +"1d7c194e": "bulkRejectMints(uint256[],uint256[])", +"1d7c5cd1": "userServicesLength(address)", +"1d7c8894": "issueGoldTokens(address,uint256)", +"1d7ca2be": "subAddressToWhiteList(address[])", +"1d7d1f17": "BFX()", +"1d7d8d2e": "EthereumPoint()", +"1d7e1f68": "getContentRank(address,uint256)", +"1d7f2e0c": "SecondNode(address,string,string)", +"1d7f8039": "mineMany(bytes32[])", +"1d7fb62f": "initVote(uint256)", +"1d80009a": "rootHash()", +"1d80e62a": "changeTransfersPaused(uint256)", +"1d814480": "provideInfoCourseBaseOnIdStudent(uint256)", +"1d81564d": "minutesInPeriod()", +"1d819ef0": "testEqualityAddr()", +"1d82e9c7": "EXTRA_GAS()", +"1d833aae": "drop(address,address[],uint256)", +"1d834409": "totalOrders()", +"1d834a1b": "insert(uint256,uint256)", +"1d836ae9": "EQUIEX()", +"1d83e3a9": "withdraw_(address)", +"1d846f5c": "currentCancellationResults()", +"1d849220": "getTokenSaleTime()", +"1d84f303": "ETPC()", +"1d8557d7": "updateState()", +"1d862a81": "getPop(uint256)", +"1d87614a": "OPTION_POOL_PERIOD()", +"1d87a65c": "createBattleboard(uint8)", +"1d88c05b": "successorAddress()", +"1d898f52": "IM()", +"1d89dbc9": "updateExchangeRate(uint8,uint256,uint256)", +"1d8a8db9": "ethRaisedAddress()", +"1d8aa5ec": "currentSettlementPhase()", +"1d8acf1b": "getBoolValues(bytes32)", +"1d8adb7a": "setMaxUserPayment(uint256)", +"1d8ae626": "Security(string,string)", +"1d8b13a6": "setPersonal(address)", +"1d8b4dd1": "createContractExoplanet(string,uint256,uint32,string,uint32,uint8,string)", +"1d8b70da": "order_received(string)", +"1d8bab91": "RDN()", +"1d8c61c0": "setTMEXAddress(address)", +"1d8c7c20": "internalSellTokenFromAdmin(address,uint256,bool,uint256)", +"1d8ceb44": "extractClosingSignature(address,uint32,uint192,bytes)", +"1d902fe9": "currentBonusRate()", +"1d9046ce": "transferShip(uint32,address,bool)", +"1d90824b": "getMinPrivateSaleCompanyBuy()", +"1d90c509": "cardPresale(uint16)", +"1d91bd9f": "transferPaymentAddress(address)", +"1d927f21": "userDraw(uint256)", +"1d93d8d9": "WaboToken()", +"1d9400c2": "ManagerProxyTargetMockV3(address)", +"1d9680a7": "oldWriteMessage(string)", +"1d96d4c9": "VIRES()", +"1d976e05": "transferMultiple(address,uint256[])", +"1d978f9e": "ContributionRegistered(bytes32,address,uint256)", +"1d981758": "__signatureIsValid__(address,bytes32,uint8,bytes32,bytes32)", +"1d98532f": "_computeTournamentCut(uint256)", +"1d98f3c5": "safeTransferChild(uint256,address,address,uint256)", +"1d991ffe": "IsBoilerValid(address,uint256)", +"1d9976e9": "LedgerRandomProofVerifier()", +"1d9b0783": "withdraw(uint128,address)", +"1d9b1d6f": "schedule(uint256,uint256)", +"1d9b1d85": "ReFund()", +"1d9bd2b9": "totalSoldOnICO()", +"1d9becf5": "CatAdopted(bytes5,uint256,address,address)", +"1d9caa69": "sendMessage(address,string,string,uint256)", +"1d9cfd6d": "setSale()", +"1d9d1bdc": "buyTradeConfir()", +"1d9d281d": "add0xbtcnnAddresses(address,address)", +"1d9e6c34": "compose(string,address,uint256[])", +"1d9f3cb5": "changeSaddleShopPrice(uint256,uint256)", +"1d9f4f88": "VetCoin()", +"1d9f68ad": "updateMaxBonusTickets(uint256)", +"1da05199": "hasAvailableCard()", +"1da09dd5": "getUserActionOnStory(bytes12,address)", +"1da0fb1b": "updateSettings(uint256,uint256,uint256,uint256,uint256,bool)", +"1da16e8b": "FirstSaudiToken()", +"1da26a8b": "setToken(address,address)", +"1da2d92b": "IDRT()", +"1da3f151": "presaleVolumeBonus(uint256)", +"1da4eb7a": "_secondUnlockAmmount()", +"1da4ed85": "setRewardPool(uint256)", +"1da55b9f": "YeedToken(uint256,address)", +"1da5f94d": "acceptableAddress()", +"1da6822c": "testThrowsTransferEnableNotTransferable()", +"1da74e77": "wtToken()", +"1da790a1": "showTopWinners()", +"1da83550": "setWinner(address,uint256,uint256,uint256)", +"1da83eab": "canDefrostReserveAndTeam()", +"1da88cbe": "getNew(address,bytes32)", +"1da93873": "baseTokenPrice()", +"1da97544": "ETHtoZWeirate()", +"1da97ea3": "getSenderFromData(address,bytes)", +"1da97f36": "HunterCoin()", +"1da98538": "totalMEATonsClaimed()", +"1da9ea0c": "hardCapInTokens()", +"1daae314": "secondStagePriceOfTokenInWei()", +"1dab2271": "setSuggestedAdPrice(uint256,uint256)", +"1dacad8a": "CentralizedOracle(address,bytes)", +"1dacd8fd": "buyDisciple(uint256,uint256,uint256)", +"1dad202f": "ctz64(uint64)", +"1dad57fa": "notifyCollateralNotReturned(uint256)", +"1dad63e4": "ERC20Standard(uint256,string,bool)", +"1daee82d": "secondLockAmount()", +"1daf779f": "SDpay(uint256,string,uint8,string)", +"1db021c0": "mintedCoins()", +"1db046ad": "OneToken()", +"1db05ab8": "FXNOW()", +"1db087db": "_setAllocation(address,uint256)", +"1db0ad5a": "firstUnlockTime()", +"1db0ffe9": "ECHARGE()", +"1db19959": "RATE_SALESTAGELAST()", +"1db1c805": "setDefaultReputationForManufacturer(bytes32,bytes32)", +"1db256e4": "WCCCOIN()", +"1db29a20": "getPlotInfo(uint256)", +"1db2bbe8": "allocationIndicator()", +"1db2ea77": "_91_MR()", +"1db38da2": "ClaimExecuted(uint256,uint256,address)", +"1db4012d": "newProject(string,string,uint8,address[],address)", +"1db4b07f": "rntToken()", +"1db4d7a2": "returnBalance(address[2],uint256[8],uint8,bytes32[2])", +"1db580fa": "foundersAllocation()", +"1db5ca3b": "becomeAgent(uint256,uint256)", +"1db5f974": "highBonus()", +"1db625c3": "newInvestCommission(uint256)", +"1db71ffb": "doLoops(uint256)", +"1db834f0": "NextDouble(address,uint256)", +"1db87be8": "receivingAddress()", +"1db890a6": "getCassetteSize_()", +"1db894fc": "signToApproveTokenControlInfo()", +"1db93968": "transferProperty(uint16,address)", +"1db9ec2c": "ENDDATE()", +"1dba92ab": "setKeys(address,uint256)", +"1dbb0bff": "buyBlock(uint256,uint256,bytes32,bytes32,bytes32,bytes32)", +"1dbb9867": "buyEggFee()", +"1dbbda4d": "bytesToUint(bytes20)", +"1dbc04ae": "setVestingToken(address)", +"1dbcc5ad": "RiesGraham()", +"1dbd21c3": "Daereum()", +"1dbdd617": "LILITHCOIN()", +"1dbdd792": "MIDGRADE_TYPE_COUNT()", +"1dbde6c7": "maxTokenSupplyICOEND()", +"1dbe342d": "TRND()", +"1dbe6508": "bobClaimsDeposit(bytes32,uint256,uint256,address,address,bytes)", +"1dbf3bc7": "spend(uint256)", +"1dbf79a3": "TicketGlobalChain(uint256,string,string)", +"1dc05f17": "subtract(uint256)", +"1dc0819e": "_isBreedingPermitted(uint40,uint40)", +"1dc1166f": "horseSold(uint256)", +"1dc17cce": "VALUE_DISTRIBUTION_KEY_OWNERS()", +"1dc18c45": "editNode(uint256,address,bool,address,uint8,bool)", +"1dc18f7a": "hashAmount(uint256,uint256)", +"1dc1c5e3": "payMoney()", +"1dc30bdb": "payJackpot5()", +"1dc3ac22": "setOwnerNickName(address,string)", +"1dc436cd": "getIDChildRelationshipCountOperationParentProductPositionReferenceBinding(string,address,uint256,uint256)", +"1dc45248": "getMoveCount()", +"1dc45c6d": "spenderDecreaseApproval(address,uint256)", +"1dc55c2d": "GetDividends(address,uint256)", +"1dc615bc": "checkIfAllARTDistributed()", +"1dc76e78": "buyPlayerDataRecord(uint256,uint256,uint256)", +"1dc7f1b4": "getaddressname()", +"1dc82285": "oldBalance()", +"1dc8a3bb": "B123Token()", +"1dc9186a": "updateWeiAmountShare()", +"1dc9a3b9": "transferDomainOwnership(bytes32,address)", +"1dc9bb48": "hasDividends()", +"1dcb0d36": "goBackToPreSale()", +"1dcb304b": "fipsGenerate()", +"1dcb66ff": "coordinatesOf(uint256)", +"1dcd0305": "toStr(bytes32)", +"1dcd5312": "editMessage(string)", +"1dcd9b55": "substring(string,uint256,uint256)", +"1dcdf215": "getCoursesCount()", +"1dce0b5c": "getNoteKeysCount()", +"1dce77b8": "Linkmanagement()", +"1dce79cf": "blockchainExchange(uint256,int256,bytes32)", +"1dcea427": "erc20token()", +"1dd0c71b": "myPendingPayment()", +"1dd1349d": "getNameHash(bytes32)", +"1dd14317": "setProtocolVersion(address,bytes32)", +"1dd14a96": "totalSupplyPaillier()", +"1dd15fca": "tokenInWhiteList(address)", +"1dd16db6": "customBonus()", +"1dd17e7d": "setPreSaleParameters(uint256,uint256,uint256,uint256,uint256)", +"1dd300ce": "lastWithdrawal()", +"1dd319cb": "burnFor(address,uint256)", +"1dd46c1e": "getTxCount()", +"1dd4914b": "withdrawEtherOrThrow(uint256)", +"1dd49208": "getFeed(uint256,uint256,uint256)", +"1dd49cae": "remWhitelist(address[])", +"1dd5301a": "PRICE_PREBUY()", +"1dd572a0": "fortune_sell(uint256,uint256,uint256)", +"1dd637d8": "emergencyProtectedMode()", +"1dd6f85e": "CreateLOK(address,uint256)", +"1dd72454": "TransferManual(address,address,uint256,string)", +"1dd7335c": "allocateDividendsToWinners(uint256,address[],uint256[])", +"1dd7cf6d": "getHumanInfo(uint256)", +"1dd80586": "getPlayerSpaceshipBattleStakePaidById(uint256)", +"1dd85687": "adminSetEnviroment(uint256)", +"1dd8f053": "minPriceInWeiForIco()", +"1dd95a98": "AIRDROPS_COUNT()", +"1dd9a3cf": "_sendEthereum(uint256)", +"1dda5c7d": "testFailSubBalanceBelowZero()", +"1ddabf7a": "friends(address)", +"1ddb9105": "creditVault(uint256,address,uint256)", +"1ddc0ef0": "audit()", +"1ddd303d": "setV_R3(uint256)", +"1ddd39cc": "addcoinslimit()", +"1dddbf07": "confirmExchange(address,uint256)", +"1ddde716": "advisorsAccount()", +"1ddf147f": "assignedDoublrContract()", +"1ddf9729": "IncomeTaxCalc()", +"1ddfd7db": "supportsTradingPair(address,address,bytes32)", +"1de012cd": "TRUST()", +"1de032a5": "setIsStudio(address,address,bool)", +"1de0e877": "proposedControllerPendingUntil()", +"1de14175": "setDelegadoDeEscuelaVerify(bytes32)", +"1de1441f": "remainingEPXSupply()", +"1de1ee7b": "addPublicKey(bytes32,address)", +"1de21b76": "P1()", +"1de22867": "BeatTokenPurchased(address,address,uint256,uint256)", +"1de250bf": "bless(string,uint256)", +"1de26e16": "deposit(bytes32,uint256)", +"1de271a4": "cap_tmx()", +"1de28857": "getShareBalance()", +"1de38038": "makercoin(uint256)", +"1de3d4b9": "ReleaselockAddress(address)", +"1de4334a": "get_time_locked_contract(uint256)", +"1de46a78": "admin3()", +"1de473ea": "setC4FContractStatus(address,uint8)", +"1de54fcd": "unlockedNowBalanceOf(address)", +"1de7f3e3": "setBankrollpercentage(uint256)", +"1de95d74": "AREFWallet()", +"1de98d93": "deleteUserByEmail(bytes32)", +"1dea0c57": "getRealBet(uint256)", +"1dea157f": "getPaintingArtist(uint256)", +"1dea3f0c": "recordOffchainPurchase(address,uint256,uint256,string)", +"1dead827": "_percentSoldInICO()", +"1deb0a8f": "changeState(bool)", +"1deb112b": "initialSupplyPublicPreICO()", +"1deb9b9e": "EventBid(address,uint32)", +"1debbe2f": "addExp(uint256,uint32)", +"1dec8585": "getCurrentStageByTime()", +"1ded2d87": "Transaction(address[2],bytes,uint256,bytes32[2],uint256[3],bytes32[3],bytes,bytes)", +"1ded319d": "numberOfClaimed(address)", +"1ded587c": "Hotlist()", +"1dedc6f7": "consume()", +"1def4c9d": "TransferToBTCoE(uint256)", +"1def5033": "taskArray()", +"1df0187b": "BONUS_AMOUNTS_VALUES(uint256)", +"1df025d6": "updateGoalCheck()", +"1df0e359": "createForecasting(uint256,uint256,uint256)", +"1df13f28": "ICOBonusPercent2week()", +"1df19259": "Khabayan()", +"1df1ec82": "getProviderOwner(uint256)", +"1df224c1": "privateToken()", +"1df2bcbc": "setPresaleCont(address)", +"1df36e63": "delInvestor(address)", +"1df3e8a9": "GuardaProva(string,string,string,string)", +"1df411a6": "setOfferTime(uint256)", +"1df4241f": "StatEvent(string)", +"1df473bc": "newContract(bytes)", +"1df47aad": "ReplayProtection()", +"1df4ccfc": "totalFee()", +"1df4f144": "multiply(int256)", +"1df5a8f4": "GlobalBTC()", +"1df5e755": "Etherandom()", +"1df68102": "createSellOrder(uint256,uint256)", +"1df6d86e": "_buyLeader(uint256,uint256)", +"1df73f51": "getFreeSperm()", +"1df87cad": "raiseBuyOrderCancelled(address,uint256,uint256,uint256,uint256,uint256,int160)", +"1df8eaa2": "showAuthorizerTwoAmount()", +"1df93558": "fundingStartTime()", +"1df95786": "envelopes(uint256)", +"1dfa0cf6": "ConfirmDispose()", +"1dfa3ca8": "thirdPartyInvestments(address,uint256)", +"1dfa6329": "finishPVE(uint32)", +"1dfbf227": "makeInvestment(address,string,uint256,uint256)", +"1dfc91d4": "TokenPresalePurchase(address,uint256,uint256)", +"1dfd04b9": "buyEmptyPixel(uint256)", +"1dfd1ddd": "ListNotValSince(uint256)", +"1dfde4a5": "test_insert_findWithHintPrevAtPosition()", +"1dffa3dc": "cancelJob(uint256)", +"1dffd012": "getUserManager()", +"1dffdbe6": "trade(string,uint256,uint256)", +"1e0018d6": "investor()", +"1e010439": "getBalance(uint256)", +"1e0197e2": "tournament()", +"1e01a0e6": "doit(address)", +"1e01a172": "issueDescription(uint256)", +"1e021b2b": "getproductstatus()", +"1e02bf62": "checkOutstandingQueries()", +"1e02f805": "newInvestment(address,uint256)", +"1e031a00": "QuickFlip()", +"1e0419d4": "finalWinner()", +"1e04e856": "depositEth(address,address)", +"1e04eee9": "mintChipUnsafely(uint256,bytes32)", +"1e0582e9": "_daysFromDate(uint256,uint256,uint256)", +"1e05e0c8": "bonusesForTimesCount()", +"1e0610f6": "getRealty(address,uint256)", +"1e063d98": "MRDSTSCoinToken()", +"1e06c41f": "saleStartUnixTime()", +"1e06e25e": "Zoo721(address)", +"1e075aba": "batchUnlockVestedTokens(address[])", +"1e08045d": "getOwnedTanks(address)", +"1e084558": "licenseInfo(uint256)", +"1e08d687": "removeSubcontract(address)", +"1e095eb3": "GHPToken()", +"1e0976f3": "receiveVerification(uint256,uint256,uint256,bool)", +"1e09e67b": "Rasthen()", +"1e0a0f60": "info_CanBeClaimed(uint256)", +"1e0a24b1": "revertIfReturnLessThanMin()", +"1e0b760c": "Cancel(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", +"1e0b8c87": "hasSkills(address,uint256,uint256,uint256)", +"1e0c60e2": "SGem()", +"1e0c7ed4": "setConfigBool(bytes32,bool)", +"1e0e17a2": "claimMistake(bytes32)", +"1e0e3925": "numElements()", +"1e0e7c2b": "KODOKv()", +"1e0efae1": "claim_devidend()", +"1e0f6ed8": "TokenSaleFinished(uint256,uint256,uint256,uint256)", +"1e0f9795": "getNewFib(uint256)", +"1e11764e": "GameFinished(uint256,uint256,string,uint256,address)", +"1e120efb": "showEducationDetails(uint256)", +"1e1401f8": "getReturn(address,address,uint256)", +"1e141bb0": "releaseTime4()", +"1e14c48c": "setTokenFeeWithdraw(address,uint256)", +"1e14d823": "addMarketplaceContract(address)", +"1e16521b": "fulfillBurnRequest(uint256,string)", +"1e16980c": "setUnburnableWallet(address)", +"1e171d7c": "hasFunded()", +"1e172e90": "TransferHappened(uint256,bytes32,address,address)", +"1e1781af": "unfreezeAccount(address,bool)", +"1e179ae0": "getToken(bytes32,uint256)", +"1e17f292": "getAPRTx(uint256)", +"1e185b2a": "BTEcoin()", +"1e186e4c": "TestERC20()", +"1e18c404": "huroc()", +"1e191c0f": "goalSale()", +"1e1a48cf": "transferMethodId()", +"1e1a4eef": "setShareTokenAddress(address)", +"1e1a90a6": "onPayout(address,uint256)", +"1e1ad51c": "getFunding_Old(uint256)", +"1e1b13c0": "coinAge()", +"1e1b2e0f": "getLotteryPrizesLength(uint256)", +"1e1c72f4": "requestFreezeAccount(address,string)", +"1e1c86b7": "CCProject()", +"1e1d237e": "getSortedArray(uint256[])", +"1e1d696a": "changeLibAddress(address)", +"1e1ddacc": "saleController()", +"1e1e0a5e": "doHash(string,uint32,string,string)", +"1e1e3e0f": "vaultBalance(string)", +"1e20363a": "setTokenMetadataBaseURI(string)", +"1e204acf": "HODLrSoldWin(address,uint256,uint256,uint256)", +"1e20b4b9": "allocateAllUnsoldTokens(address)", +"1e215f70": "gbtAddress()", +"1e217bf8": "releaseUnclaimedFunds()", +"1e223143": "getFirst()", +"1e22648a": "setSnapshotBalance(address,uint256)", +"1e2273a7": "convert256ToReal(uint256)", +"1e22ffa5": "ClickRUB(uint256,string,string)", +"1e23300b": "createDiamond(string,address,string,string,string,string,string)", +"1e2466c6": "ICOTerminated()", +"1e24e029": "createRequestAsPayer(address[],int256[],address,uint256[],uint256[],string)", +"1e25dc54": "transFee()", +"1e2629e1": "initiateMigration(address,address,address)", +"1e26fd33": "setBool(bool)", +"1e273649": "getCountPartipants()", +"1e275d5f": "mock_getUInt(address,address)", +"1e279a37": "get_balance(address)", +"1e27a965": "JullarCrowdsale()", +"1e27ae4d": "getRecordHolder(uint256)", +"1e28a3a5": "attachCrowdsale(address,address)", +"1e28ba20": "YeojinToken()", +"1e28f29b": "initialTiers()", +"1e2a7105": "FromQueue(address)", +"1e2a9d4c": "topup(address,address,uint256)", +"1e2aebf9": "ETHERCREDIT()", +"1e2b6db2": "getBdpEntryPoint(address[16])", +"1e2bdfdf": "setAdvPrice(uint256)", +"1e2c23b3": "toEth(uint256)", +"1e2c74f6": "kill(bool)", +"1e2ca0f3": "updateLeftLottery(address)", +"1e2d5651": "totalContrib()", +"1e2da3e9": "PawsCoin()", +"1e2def3a": "saleStopTimestamp()", +"1e2e35a4": "sellPoohs()", +"1e2e3a6b": "getExchanges()", +"1e2e7a06": "registrationTime()", +"1e2ed152": "ECO_SYSTEM_BONUS()", +"1e2f48da": "assertOwnersAreConsistent()", +"1e2fc4f7": "test_mint()", +"1e2fee94": "CatDestinity()", +"1e2ff94f": "currentTimestamp()", +"1e2ffcef": "Show_All_Company()", +"1e30397f": "isValidName(string)", +"1e30b599": "Processables()", +"1e31264d": "_premiumPricePer30Days()", +"1e3339f0": "MTT()", +"1e335962": "token_multiplier()", +"1e33a6d5": "setGasUsage(bytes4[5],uint256[5])", +"1e34c585": "setConfig(uint256,uint256)", +"1e35e567": "fetchOrderByIdWithMerchant(string)", +"1e36d755": "sendTokenToOwner()", +"1e372dd3": "Advanced_Anemoi(uint256,string,string)", +"1e375ab9": "claimReferralBonus()", +"1e38046c": "address3()", +"1e38a011": "setRoutePrice(uint256)", +"1e391738": "minimumGoalInWei()", +"1e39499d": "scheduleCall(address,bytes,uint256)", +"1e3a5831": "Claimable(address)", +"1e3b92b4": "getGalaxy(uint256)", +"1e3b9de5": "getClaimant(address)", +"1e3ba116": "_supportsAllInterfaces(address,bytes4[])", +"1e3ba941": "StexTalk()", +"1e3c73bd": "BdpPriceStorage(bytes8)", +"1e3c9352": "grant(address[])", +"1e3d9c04": "removeLink(address,bytes)", +"1e3e6369": "GetMySnail()", +"1e3ea569": "SentTokens(address,uint256,uint256,uint256)", +"1e3f11ee": "getPlayerGeneralAttr(uint64,uint8)", +"1e3faf22": "airdropNum1()", +"1e40375f": "killTo(address,bytes32)", +"1e4092e5": "FOUNDER_AMOUNT()", +"1e4146b0": "generateCombinationKey(uint8[4])", +"1e41583b": "reclaimElement()", +"1e41be58": "deleteApplication(string,bool)", +"1e41f63e": "viewAll(string)", +"1e42698b": "setScrapAuctionDuration(uint256)", +"1e440e02": "TKCDStandardToken(uint256,string,uint8,string)", +"1e442919": "getAccessoryLockStatus(uint64)", +"1e4433c4": "getVar(string)", +"1e44b919": "KAPAYcoin(uint256,string,string)", +"1e44c112": "find_strike(uint64,uint32,uint32)", +"1e44e6af": "setPI_edit_10(string)", +"1e4532f1": "balances_bonus(address)", +"1e45de61": "GetWinningAddress()", +"1e4623e1": "segmentHash(string,uint256,bytes32)", +"1e464460": "AscendGod()", +"1e466eee": "triggerVolcanoEruption()", +"1e49d5ab": "getUserInfoAndConfig(address)", +"1e4a126e": "BeforeChipObtain(uint32)", +"1e4adcf7": "weiDonated(address)", +"1e4b5652": "setKNCRate(uint256)", +"1e4ba4d4": "swap(uint256,address,address,uint256,uint256,uint256,uint256)", +"1e4bb033": "HcoinToken()", +"1e4bd42c": "claimAllTokens()", +"1e4bdf27": "TransferActive()", +"1e4bffde": "_getBegin(int256)", +"1e4c6e7e": "gatito()", +"1e4c6f7c": "base_token_seed_amount()", +"1e4c7736": "updateManyLandData(int256[],int256[],string)", +"1e4ccdc4": "resultDraw()", +"1e4d17c5": "setFundraiserAddress(address)", +"1e4df315": "HRChainERC20()", +"1e4df938": "referralPool()", +"1e4f95c7": "pipeMoney()", +"1e504c9c": "setRegisterPrice(uint256)", +"1e5140dd": "closeTradeProfile(bytes,bytes32)", +"1e516c32": "OMIVIATEST()", +"1e519c4c": "getCurrentModifier()", +"1e51a907": "getServiceNames(bytes32,address[],address)", +"1e51cb10": "_MineId()", +"1e5253a4": "RegisterShareholder(address)", +"1e5296ef": "getMySellOrdersBlackMarketComplete()", +"1e52aa52": "startBetRed()", +"1e52ca35": "ROLE_SUPER()", +"1e52f7b5": "accoutToPayLevel(address)", +"1e5330ca": "checkBetResult(uint8,address,bytes32,bytes32)", +"1e5393cf": "setDividendAndPayOut(uint32,uint32)", +"1e53a3a0": "SetContracts(address,address)", +"1e53efe0": "getBonusAmount(uint256)", +"1e542fd4": "AddLock(address,uint256,uint256,uint256,uint256)", +"1e550ca2": "carTaxiTokenAddress()", +"1e552efc": "MarnieCoin()", +"1e5571bc": "getTankSell(uint32)", +"1e561d5e": "createSellingProposition(address,uint256,uint256,uint256)", +"1e566dae": "_moveToken(address,address,uint256,bytes,address,bool)", +"1e567582": "gxc()", +"1e57e3bb": "EtherReceived(address,uint256)", +"1e580615": "cashIn()", +"1e5890c4": "saveResult(uint256)", +"1e59b53f": "Medallion()", +"1e59c529": "register(string,address)", +"1e5a652b": "MDICOStage1(address,address,uint256,uint256,uint256,uint256)", +"1e5b433b": "testTransferControl()", +"1e5bd14a": "setRegulator(address,bool)", +"1e5c6176": "BitChordCrowdsale(address,address)", +"1e5d1a4c": "End(string)", +"1e5d2e41": "geneCore(uint256,uint256,uint256)", +"1e5d2e78": "_updatePools(uint8,uint256)", +"1e5d629d": "createChannel(bytes32,address,uint256,address,uint256)", +"1e5e668f": "fetchDataMain()", +"1e5e8aa9": "token_rate()", +"1e5f34af": "sub(uint8,uint8)", +"1e5f3569": "createEIP20(uint256,string,uint8,string)", +"1e5f35f3": "Prover()", +"1e5f9149": "getWinner(bytes32)", +"1e5fc8e7": "bonusThirdWeek()", +"1e5ff41a": "tier5()", +"1e6000c2": "AffiliateReceived(address,address,bool)", +"1e6090f4": "isContractDeprecated()", +"1e60ab84": "PalaceResidence()", +"1e625935": "SelfPayPreSale(uint256,uint256,uint256,uint256,uint256,address)", +"1e626456": "tokenFallbackData()", +"1e6288fa": "soldTokenValue()", +"1e629a75": "StartNextStage()", +"1e62a511": "cHWCtoEth()", +"1e62a915": "set_participant_topl_address(address,uint256)", +"1e62be25": "Bytes32Passer()", +"1e639798": "reset(address,address,address,address,address,address)", +"1e63b3d3": "bancorConverterAddress()", +"1e658b74": "_userSignUp(string,address)", +"1e659135": "PVBToken()", +"1e65dc88": "EtherMemes()", +"1e6704bd": "maintenanceSetAccountsList(address[])", +"1e688c14": "fulfillBounty(uint256,string)", +"1e6b0e44": "finderFee()", +"1e6b4c6f": "setStakePeriod(uint256)", +"1e6bd462": "getAllGamesCount()", +"1e6c3d0e": "BLACKCOIS()", +"1e6c593c": "checkClaim(string,string)", +"1e6d4180": "stageBonus()", +"1e6d58ce": "AHA_Token()", +"1e6e5d81": "addContact(bytes32,address)", +"1e6efc83": "setRestartGamePeriod(uint256,string)", +"1e6f01a7": "setPI_edit_23(string)", +"1e6f9c1e": "adjust_Transfer_data(bool)", +"1e701780": "MICRODAO(address,uint256,uint256,uint256,address)", +"1e70a239": "getAllGiftTemplateIds()", +"1e711ec0": "plan_active_time()", +"1e7230c5": "benReady()", +"1e7231b6": "disablePhenomenon(bytes32)", +"1e724447": "icoTill()", +"1e725589": "getAddressesFromUsernames(string[])", +"1e72a7fc": "calculateVariation(uint64,uint64,int64)", +"1e72d642": "BezantToken()", +"1e737709": "getSourceValue(uint256,uint256,uint256)", +"1e73b362": "withdrawContractEther(uint256)", +"1e7401d9": "ArconaToken(uint256,uint256,address,address,address,address,address,address,address)", +"1e7421a2": "changeKYC(address,bool)", +"1e745e61": "createContest(string,uint256)", +"1e74a2d3": "getMinimumEndowment()", +"1e74c414": "WashExchange()", +"1e7527b0": "setOwner(uint32,int256,address)", +"1e75c12d": "ETLTokenPresale(address)", +"1e7769de": "tryForcePublic(uint16)", +"1e77933e": "change(address)", +"1e77b2e0": "updateRate(string,uint256)", +"1e78cfe1": "minimumPayout()", +"1e79933f": "removeTagByModuleType(uint8,bytes32[])", +"1e7a505f": "register(address,bytes32)", +"1e7a5bf7": "testMintAuth()", +"1e7ae71f": "owner1Of(uint256)", +"1e7be210": "whitelists(address)", +"1e7bef65": "setIncubatorContract(address)", +"1e7c20ac": "getCompte_24()", +"1e7c27cb": "ADMIN_CONTRACT()", +"1e7c402b": "test_percOf2()", +"1e7cedb7": "TKTToken()", +"1e7d84cb": "getproduuct(uint256)", +"1e7de8cc": "setChibiGEN0Price(uint256)", +"1e7e2064": "addPeers(address[])", +"1e7e4b5e": "PREISSUED_AMOUNT()", +"1e7ea8d5": "getFreelancerCategories(address,address)", +"1e7fa008": "amountRemaining(address,bytes32[])", +"1e801c8c": "sealForChanges(uint256)", +"1e81086d": "setDirectMintAgent(address,int256)", +"1e815fcd": "isBuyOpen()", +"1e81ccb2": "pings()", +"1e820325": "finalizeRound()", +"1e822140": "transferToLockedBalance(address,uint256)", +"1e829230": "createGrant(bytes32)", +"1e82965e": "DCTR()", +"1e83409a": "claim(address)", +"1e83bab7": "singleInvokeWith2Args(address,string,address,uint256)", +"1e83cdab": "extract()", +"1e83ce17": "houseFeeThreshold()", +"1e83e697": "setTokenOptions(bool,bool,bool)", +"1e841271": "setTestFee(uint256)", +"1e84c725": "emergencyTransfer(address,address,uint256)", +"1e85107c": "bonusPercentages(uint256)", +"1e8551e3": "voteRewardPerUnit(uint256)", +"1e85e8f0": "TLN_TOKEN_SYMBOL()", +"1e860d43": "setNewInvestorsList(address)", +"1e86ccf5": "setOperatorCommission(uint256)", +"1e871309": "rewards_id(uint256)", +"1e872f55": "setPlayerLastUpdateTime(address)", +"1e8784c9": "SabrinaToken()", +"1e87fe1d": "setSmallCapWhitelistParticipant(address,uint256)", +"1e8812f3": "BonusCrowdsale(uint256)", +"1e891c0a": "setTimelock(uint256)", +"1e892c21": "returnForRedemption(uint256,uint256,uint256)", +"1e893437": "stageClose()", +"1e8997ec": "PUNCToken()", +"1e89c83b": "read_where_gadget(uint256)", +"1e89d545": "multiTransfer(address[],uint256[])", +"1e8a98cf": "UP_totalBets()", +"1e8b0d03": "EventBankrupt()", +"1e8b31dc": "batchPay(address[],uint256[],address[])", +"1e8bf006": "getNumbersFromString(string,string,uint16)", +"1e8bf1f9": "readInt256s(bytes32[])", +"1e8c72b4": "incrUserAvailBal(address,uint256,bool)", +"1e8d1510": "KeyFund(uint256,uint256)", +"1e8d15f8": "LasVegas()", +"1e8f11ab": "candleCost()", +"1e8fba36": "fortifyClaim(address,uint16,uint256)", +"1e909841": "getEmployerContracts(address,address)", +"1e912334": "maxDonors()", +"1e923f1b": "myAddr_test()", +"1e924bf8": "tokensReleasedPerPeriod()", +"1e92a65c": "teamAmounts()", +"1e935ab1": "requestPause()", +"1e93c209": "powerPool()", +"1e93d358": "multiStake(uint256,uint256,uint256,uint256,uint256)", +"1e9447f3": "hasDuplicate(string)", +"1e9493d8": "ETH_MAX_GOAL()", +"1e962e62": "F0002Token()", +"1e96bf0e": "separate(address,uint256)", +"1e9824ee": "setExchangeRates(uint8,uint8)", +"1e982b40": "saleOverInTime()", +"1e98d334": "initRace(uint8[4])", +"1e98d54a": "addGlobalConstraint(address,int256,bytes32,address)", +"1e9a04a7": "secondRoundICOStart()", +"1e9a6272": "onDelivery()", +"1e9a6950": "redeem(address,uint256)", +"1e9b1312": "accountAddress()", +"1e9b91db": "VictorieumNewICO2Token()", +"1e9be6a1": "usdEthPrice()", +"1e9bf0da": "disown()", +"1e9cefa3": "updateEmployeeWallet(uint256,address)", +"1e9d2d28": "NewGame(uint256,bytes32,bytes32,bytes32,address,uint256)", +"1e9d3bc9": "LZXToken()", +"1e9d48cf": "checkUser(address)", +"1e9d8232": "TheGame(address)", +"1e9da16a": "n_domains()", +"1e9dd927": "kycVerify(address,bool)", +"1e9e541c": "TEAM_TOKENS2()", +"1e9e6949": "ActiveChanged(address,bool)", +"1e9e928e": "GBPValue()", +"1e9ea66a": "balanceEther10000000(uint256)", +"1e9eb554": "deathData_v14()", +"1e9f3c24": "ETH888CrowdsaleS1(address)", +"1e9f6dcb": "ticketsFaceToFaceSold()", +"1e9fcc77": "activateAllowance(address,address)", +"1ea06b9e": "_allowManualTokensGeneration()", +"1ea0d0de": "endRace()", +"1ea103d0": "Registra()", +"1ea134b9": "PeculiumOld()", +"1ea1380c": "getScores()", +"1ea1e522": "claimF()", +"1ea333ea": "_generateDutchAuction(uint256,uint256)", +"1ea3cae9": "addressToAccountMap()", +"1ea48870": "isFunder(address)", +"1ea5a292": "endorse(uint256,uint256)", +"1ea5efc4": "partner1_voted_update_marriage_status()", +"1ea6af82": "reward9()", +"1ea6b97f": "getTotalTokensOwed(address,uint16[])", +"1ea7b0f9": "Bilibit()", +"1ea82655": "generatePartnerTokens(uint256)", +"1ea8b099": "endMark()", +"1ea906b5": "leftTokens()", +"1ea90acd": "fetchOrdersForPayer()", +"1ea92826": "currentTierIndex()", +"1eaa6c4b": "firstTokenExchangeRate()", +"1eab0a95": "testingContracts()", +"1eabc116": "buy(uint16)", +"1eabef31": "YKToken()", +"1eada765": "getConditions(uint256)", +"1eae5ff9": "getWaitPreselled()", +"1eae85cb": "priceOfDate(uint256,uint256,uint256,uint256)", +"1eaec76f": "FENIX(uint256)", +"1eafe00c": "isAmendedEarlyPurchase(uint256)", +"1eb02078": "getUIntTypesCount(uint8[])", +"1eb21875": "artistManifestoFundAddress()", +"1eb22b45": "sellerDatabase(address,uint256)", +"1eb25d13": "InitialSupply()", +"1eb25e0a": "configure(uint256)", +"1eb3957b": "requestDelegatedFrom(address)", +"1eb42523": "update(address,address,address)", +"1eb4dac6": "endSecondWeekICO()", +"1eb55c51": "CEI()", +"1eb5cb66": "resume(string)", +"1eb5de94": "privateExchangeRate()", +"1eb5ea2e": "returnFunds()", +"1eb726af": "contractAddress(string)", +"1eb79e44": "gasForGR()", +"1eb8befb": "setNewMediator(address)", +"1eb92366": "setRecommenderMulti(address[],address[])", +"1eb96a5c": "cancelOwnershipOffer()", +"1eb96f7c": "MahalaToken()", +"1eb9ef91": "getAccountsForUser(address)", +"1eba7c7a": "setDefaultClaim(string)", +"1ebb24bc": "_postTransferHook(address,address,uint256)", +"1ebbc515": "MakerWithdrewAsset(uint256)", +"1ebbe681": "getWinningById(uint256)", +"1ebcbc93": "transferAdminShip(address)", +"1ebcdba4": "getWactive(uint8)", +"1ebcf2fb": "reclaimParsecCredit()", +"1ebd8263": "setMinimumBuyAmount(uint256)", +"1ebd8e6d": "XEVENUE()", +"1ebdaf8b": "testNewAccountHasZeroBalance()", +"1ebdd39a": "getWithdrawalData(uint256)", +"1ebde78b": "getSecondsTimeLockedByString(string)", +"1ebe1827": "EthLongExercised(address[2],uint256[8],uint8,bytes32[2],uint256,uint256)", +"1ebe5051": "StarzToken()", +"1ebe5c0f": "sendWithAllOurGasExcept(address,uint256,uint256)", +"1ebe8105": "tokenPriceUSDWEI()", +"1ebeb80b": "getBools()", +"1ebebb9b": "_checkAndSub(bytes32,bytes32)", +"1ebedded": "setAllRates(uint256,uint256,uint256)", +"1ebeec82": "_withdrawNAC(address,uint256)", +"1ebf0d11": "sellAllAmount(address,address,uint256,address,uint256)", +"1ebf1f5b": "hasSellerGuarantee()", +"1ebf42e5": "TokenAFL(uint256,string,uint8,string)", +"1ebfa2df": "getDiscountsAmount()", +"1ebfa358": "dateToTimestamp(uint16,uint8,uint8)", +"1ebfdca0": "servicesLength()", +"1ec29a5f": "getPurchasedAmount()", +"1ec32d15": "companyWallet()", +"1ec41163": "lastWinnerAddress()", +"1ec42d50": "_createWarrior(uint256,address,uint256,uint256,uint256,uint256)", +"1ec68b92": "saveMetaData(address,bytes,bytes32,bytes32,bytes32,bytes,uint32,uint256,uint256,bytes,uint256)", +"1ec6b60a": "startVoting()", +"1ec6dba6": "SimpleSaleToken()", +"1ec75025": "developerWithdraw()", +"1ec762a4": "setlvlWebsite(string)", +"1ec7cda4": "addTokenInternal(address,address,uint256)", +"1ec7e345": "tokenValue()", +"1ec87b86": "getTravelPrice(uint256)", +"1ec8a460": "AdifyToken()", +"1ec8bb8c": "distributeReward(address,uint256)", +"1ec8d4ef": "setMinBetForJackpot(uint256)", +"1ec8d5f7": "initialReleaseDone()", +"1ec8f9ba": "purchaseTickets(uint256[])", +"1ec9c2c0": "Sub(uint256,uint256)", +"1ec9f7b5": "longTimeLock()", +"1ec9fc84": "pendingFeesWithdrawals(address)", +"1eca98ce": "transferToAdvisors(address,uint256)", +"1ecb3889": "EurocoinB()", +"1ecb450e": "Devpr()", +"1ecc05f2": "validDelegate(address,string,address)", +"1ecc17c4": "pauseTransfer(bool)", +"1ecc56f2": "initTimeOf(uint256)", +"1ecc644f": "vestStage()", +"1ecca316": "nextFreeTier()", +"1ecd0d03": "PoSPerCent()", +"1ecd3f30": "tokenReserved4()", +"1ecd9f21": "calculateDrugBuy(uint256,uint256)", +"1ecdfd2f": "setIEIAddress(address)", +"1ecfd4c3": "takeToken()", +"1ecfe64d": "_jSub(uint256,uint256,uint256,uint256)", +"1ed01f61": "maxWagerWei()", +"1ed0c2cc": "LifeSet_004()", +"1ed0e01c": "ltdParams()", +"1ed113ae": "getSignature(bytes)", +"1ed1d0f7": "KryptoGiftsMessages()", +"1ed1f196": "pf(address)", +"1ed20347": "cfo()", +"1ed24195": "getPeriod()", +"1ed2730a": "createInvoice(uint256,address,address)", +"1ed27a14": "setPoliceNodesPerReport(uint256)", +"1ed358e6": "recycleAppearance(uint128[5],uint256,uint128)", +"1ed378a1": "getHybridizationPrice(uint256)", +"1ed454a5": "memberLevel(address)", +"1ed5336b": "changeExerciseprice(uint256[],uint256[],uint256[])", +"1ed5da2f": "Controller_Address1()", +"1ed64f7b": "is_king_for_sale()", +"1ed692c0": "finalizeCrowdfunding()", +"1ed6a6ab": "emitFeeAuthorityUpdated(address)", +"1ed6f423": "changeDescription(address,string)", +"1ed77dc8": "presaleWallet()", +"1ed7830e": "partnerWallet()", +"1ed83fd4": "setHash(string)", +"1ed8f023": "BlockableContract()", +"1ed96e32": "disableTransmit()", +"1eda49be": "AheVotingBrainfood2()", +"1eda61d4": "customBonuses(address)", +"1edb0e73": "GILToken()", +"1edc44ed": "GameCoinToken()", +"1edc5ce0": "SUPPLY_FOR_MARKETING()", +"1edc8f03": "withdrawalEth(uint256)", +"1edc8f91": "openAuction(uint256)", +"1edd19e1": "bidExpireBlockLength()", +"1ededc91": "repayBorrowVerify(address,address,address,uint256,uint256)", +"1edf0c1e": "lockAndDraw(address,bytes32,uint256)", +"1edf0c3d": "TESTTOKEN()", +"1edf49ff": "myFirstToken()", +"1edfdb48": "addjoinlist_odd(address,uint256)", +"1ee04a3d": "TLTContract()", +"1ee13d0a": "creditDao()", +"1ee1665d": "WAMToken()", +"1ee17afd": "Thief()", +"1ee185ad": "roleRemove(address,string)", +"1ee284b1": "rockOwners(address,uint256)", +"1ee2e3cf": "unsetBlacklist(address)", +"1ee2fe6a": "defreeze(address,uint256)", +"1ee392c6": "getMaxProfitAsPercentOfHouse()", +"1ee426e1": "Eth2preNSP(uint256)", +"1ee44a5e": "listRequire(string,uint256,uint256,uint256)", +"1ee45da0": "sellEndTime()", +"1ee53e56": "presaleRate(address)", +"1ee55080": "getMotherCount(uint32)", +"1ee5f936": "stopTeamTokenTransfer()", +"1ee7c4bc": "LogNewAllocation(address,uint8,uint256,uint256)", +"1ee7ccc7": "preIcoInvestorsAddresses(uint256)", +"1ee952ad": "getPhysician(address)", +"1ee97dda": "_intervalFor(uint256)", +"1ee9f029": "PREICO_HARDCAP()", +"1eea92c1": "levelExpAdjustment()", +"1eeaa389": "lockSupply(bool)", +"1eeac5d5": "TradelizeToken(uint256)", +"1eebb48c": "___test(address,address)", +"1eeccead": "tokensAlreadyMinted()", +"1eed0347": "applicationNameHashTaken(bytes32,bool)", +"1eed0f27": "setPriceUSD(uint256)", +"1eed1192": "newUser(string)", +"1eed4e09": "getVoteBy(address)", +"1eee993a": "addChild(address)", +"1eef94bd": "setAwardedUnfreezePeriodSeconds(uint256)", +"1eefddb1": "grace()", +"1ef0625b": "player_2(uint256)", +"1ef085db": "price3rdWeek(uint256)", +"1ef09ccf": "executeDelegateCall(address,uint256,bytes)", +"1ef17972": "ChangeOwner(bytes32,address)", +"1ef2c6d1": "closeTurnByHand(uint256)", +"1ef31b0d": "erotixFund()", +"1ef3755d": "restart()", +"1ef410e2": "addAudit(uint256,bool)", +"1ef5b90f": "release_(address,uint256[],uint256[])", +"1ef60485": "returnAccounts()", +"1ef741fd": "interestPeriod_()", +"1ef75084": "getCompoundPlan(uint256)", +"1ef75b1a": "GGToken(address,string,string,uint256,uint256)", +"1ef7b68a": "purchaseReceiptById(bytes32)", +"1ef8766f": "reserveTokens(uint256,uint256,bytes)", +"1ef987c1": "getInvestedAmount(address)", +"1efad671": "isPreSaleReady()", +"1efb06e0": "LogNewWallet(uint256,address)", +"1efb17ee": "changeHouseAddress(address)", +"1efba6c2": "fixedPrice()", +"1efdebb2": "hodlersCount()", +"1efe3abf": "getNumTasks()", +"1eff2b2f": "advisorIssueVesting(address,uint256)", +"1effc0d8": "createPerRound()", +"1f00c55b": "TOKENS_CAP()", +"1f0276fc": "_getKey(bytes32,uint256)", +"1f03bc1b": "setNewUserBonusCardTradable(bool)", +"1f049a49": "tokensBank()", +"1f04b54c": "test_ConsensysReached()", +"1f04becc": "ppFinishTime()", +"1f05ff29": "fromWeiToFp(uint256)", +"1f065f56": "KangGuo()", +"1f06c859": "promises(uint256)", +"1f078962": "setFlowerContract(address)", +"1f078f56": "winTokens(uint256,address)", +"1f0815ce": "togglePromo(bool)", +"1f09b0a2": "getDisplayGenVault(uint256)", +"1f0a21ad": "setAdvisers(address[],uint256[])", +"1f0b2561": "getCurrentBonusPercentage()", +"1f0b5553": "setBalances()", +"1f0ba6c9": "trade()", +"1f0c03f4": "forwardEndTime(uint256)", +"1f0c1e0c": "getEventTokenAddress(bytes32,uint256)", +"1f0c5f26": "CashMove(uint256,bytes32,address,address)", +"1f0da298": "transferTokensAndEtherValue(address,address,uint256,uint256)", +"1f0de21c": "addrunmoney(address,uint256,uint256)", +"1f0f2ce4": "withdrawOrderRefund(uint256)", +"1f0f711f": "discontinue()", +"1f0fd191": "test_threeValidEqUint()", +"1f0fd905": "getAssetIdCargo(uint32)", +"1f101520": "preIcoMin()", +"1f107635": "ownerSetAdmin(address[])", +"1f1144dc": "ViewOffer(address,uint8)", +"1f11d503": "GameSicBo(string,uint256,uint256,uint256)", +"1f124116": "approveSettingUpdate(uint256,bool)", +"1f12da06": "getPropertyPrivateModeLastUpdateEarnUntil(uint16)", +"1f130761": "tokensSent()", +"1f130d1f": "insertAddress(address)", +"1f13b5ae": "NokuMasterToken(uint256,uint256)", +"1f13de92": "inEther(uint256)", +"1f13f165": "NecromeunToken()", +"1f14df69": "balances(address,bytes32)", +"1f150322": "LogUserUnregistered(address,address)", +"1f15bc1b": "disallowTransfersTo(address)", +"1f15e163": "LaunchRocket(uint32,uint32,uint32,uint32,uint32,uint32)", +"1f161533": "distributeXYZ(address[],uint256)", +"1f167829": "nextDraw()", +"1f16c8b9": "getEndDateOfCampaign(bytes32)", +"1f16fda4": "multiTransfer(address[],address,uint256[])", +"1f1836fa": "isPresalePurchase()", +"1f1886e4": "extendSale(uint256)", +"1f18e56e": "removeOwnersWithHowMany(address[],uint256)", +"1f194b9f": "getFreeKilo()", +"1f1953ad": "addPokemonToMaster(address,uint256)", +"1f1aea6e": "initSale3(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"1f1b11cc": "buyMinerFromSale(uint256)", +"1f1bd005": "getRocCoreAddress()", +"1f1bd692": "text()", +"1f1c827f": "StartGame(string,string)", +"1f1c84b7": "decreasePresetTransfer(address,uint256)", +"1f1cb62b": "peg()", +"1f1dc61b": "checkPayLoan()", +"1f1de456": "regName()", +"1f1e1295": "isApprove(uint256)", +"1f1e2cfa": "calcUnMaskedEarnings(address,uint256)", +"1f1e6c4e": "createCollectible(uint256,uint256,address)", +"1f1ea554": "HolahopToken()", +"1f1ec029": "updateKeyPrice(uint256)", +"1f1eef6b": "getContributionHashByIndex(uint256)", +"1f1f5e76": "addValueToContribution(uint256)", +"1f1f8240": "_parseIntScientific(string)", +"1f201d7e": "level_judgment(address,address)", +"1f201e39": "etherandomExecWithGasLimit(bytes32,bytes32,uint256,uint256)", +"1f20f762": "losingAmount(address,uint256)", +"1f212106": "startICOStage7()", +"1f218cf1": "ICO_PERIOD()", +"1f21f9af": "marketMaker()", +"1f220be0": "unlock(string,bytes32,address,address,uint256)", +"1f221d4c": "updatePublicityBalance(address,uint256)", +"1f227fc8": "importTokensFromSourceToken(address)", +"1f23a9bc": "getAcceptedAndRejectedVotes(uint256,uint256)", +"1f23c22b": "getOpenBids(bytes32)", +"1f25cfaf": "changeBot(address)", +"1f261939": "payBid(bytes32,uint256)", +"1f2698ab": "started()", +"1f275713": "prefixed(bytes32)", +"1f278d32": "MyartPoint()", +"1f27a8b5": "set_transferrable(bool)", +"1f28c821": "tokensPreMinted()", +"1f296600": "brickETHPrice()", +"1f299c1a": "updateRegistry(bytes32,address)", +"1f29bdcf": "setAStore(string,address,address)", +"1f2a3e06": "scissors()", +"1f2c6414": "getAddressBatchByUsername(bytes20[])", +"1f2d62bc": "gameStartedAtBlock()", +"1f2d8d66": "getNumberVote(uint256)", +"1f2dc5ef": "divisor()", +"1f2e5461": "LOUDEX()", +"1f2e886c": "testControllerTransferTriggersEvent()", +"1f2e97c8": "slaveWalletPercentInitialized()", +"1f2ea6e0": "dealership(address)", +"1f2ec9c9": "setHoldAmount(address,uint256,uint256)", +"1f2efa83": "allocateIntoHolding(address,uint256,uint256)", +"1f2f7fc3": "dispute(uint256,uint256)", +"1f305ec7": "removeFromKycTeam(address)", +"1f30edc7": "CTOSignature()", +"1f312375": "referralBonusRate()", +"1f32768e": "getSubscription(bytes32)", +"1f32c18f": "getDrink(uint256)", +"1f34556a": "changeMaxReward(uint256)", +"1f34563c": "newUser(string,string)", +"1f34d1d3": "registerAppVersion(bytes32,bytes32,address,bytes4[],address[])", +"1f35bc40": "setCrowdsaleAddress(address)", +"1f3634ed": "ink(bytes32)", +"1f368fa6": "ExtrabitToken()", +"1f378b8a": "refundEther(address)", +"1f38034c": "removeEmailAddress(string)", +"1f38c358": "allocateIds(uint32)", +"1f390975": "MAX_TOTAL_CONTRIBUTIONS()", +"1f3943df": "SURT(uint256)", +"1f39716c": "aggregateBet(uint256,uint256)", +"1f39a141": "getTokenAmount(uint256,address)", +"1f3a3a53": "mint(int256,uint256)", +"1f3a4c14": "addFreezableAddress(address)", +"1f3a7c0b": "FOUR_YEAR_KEEPING()", +"1f3a98d1": "getReferralRates()", +"1f3b3148": "endEpochTimestamp()", +"1f3bec3b": "secondarySaleReserveWallet()", +"1f3c99c3": "logout()", +"1f3ce938": "increasePresaleEndTime(uint256)", +"1f3ceb51": "getGameById(bytes32)", +"1f3d3261": "JustForward(uint256)", +"1f3dcc8d": "maxGasPricePenalty()", +"1f3e1c8d": "LogTokensPurchased(address,uint256,uint256,uint256)", +"1f3e50f6": "withdrawBCEO()", +"1f3e64e6": "getTXwithCode(address)", +"1f3ee21f": "setUsdEthValue(uint256)", +"1f3fd5ca": "PI_EDIT_1()", +"1f3fe8d1": "ICO_BONUS1_SLGN_LESS()", +"1f3fed8f": "tokensForMarketing()", +"1f400477": "inLendingMode()", +"1f402356": "markContractAsInited()", +"1f417317": "WalletSimple(address[])", +"1f42103c": "AworkerToken(uint256)", +"1f4356e4": "emissionFunds()", +"1f43f396": "startICOStage5()", +"1f4425f3": "checkCloseTimer()", +"1f44a40f": "airDropSame(address,address[],uint256)", +"1f44b1de": "ValithToken()", +"1f45006c": "checkEthRaised()", +"1f455922": "removeToken(string)", +"1f45ad5c": "modifyContentAccess(bytes32,bool,uint256)", +"1f461f0d": "withdrawableAmountFor(address)", +"1f468245": "calculateObtainedBUB(uint256)", +"1f46eb98": "agentPermission(address)", +"1f470b14": "lockUpAmountOf(address)", +"1f471ad0": "proxyMint(address,uint256)", +"1f47b50d": "MineablePOWCoin()", +"1f47ba29": "safeToMul(int256,int256)", +"1f4848ef": "setTakeFee(uint256)", +"1f48af0a": "updateWeapon(uint256,string,string,string)", +"1f48ff7c": "mintMarketMakerApproval()", +"1f49aff4": "ACLYDcid()", +"1f49caac": "canUseLock()", +"1f4a5c32": "confirmTransactionAfterExpiry(uint256)", +"1f4a6d32": "removeEth()", +"1f4ab41e": "createUser(bytes32,bytes32,uint256)", +"1f4ae468": "returnETHforNormalBuyers()", +"1f4b8e41": "getLastUpdateId()", +"1f4ca28f": "isAdvisorsTokensSecondReleased()", +"1f4d7ec4": "newParameterizerWithToken(uint256,string,uint8,string,uint256[])", +"1f4dba8e": "OPTinToken()", +"1f4dde9f": "Jade()", +"1f4e01d9": "absoluteEndBlock()", +"1f4e1504": "upgradeContract()", +"1f4e996b": "challenge(bool)", +"1f4f77b2": "timestampFromDate(uint256,uint256,uint256)", +"1f4f9ab1": "supervisorVote(uint256,bool)", +"1f4fc29c": "refShare()", +"1f502a13": "volumeDiscounts(uint256,string)", +"1f513660": "ctoAddress()", +"1f522595": "donationsCount()", +"1f52692b": "vaultOwner()", +"1f52cc35": "removeTrustedContracts(address[])", +"1f532b39": "getRelation(address)", +"1f534715": "ComplexChildToken(address,string,string,uint256,uint8,bool,int256,bool)", +"1f535833": "referralCodeAt(address,uint256)", +"1f53ac02": "setDevWallet(address)", +"1f54d80d": "verifyCustomer(address,bytes32,bytes32,uint8,bool,uint256)", +"1f5623f3": "ZebiToken()", +"1f572504": "JackToken()", +"1f57256f": "transferEth(uint256)", +"1f583087": "ClickGemTokenERC20(uint256,string,string)", +"1f59653c": "setprices(uint256,uint256)", +"1f59d30e": "unlockEarnings(address,uint256)", +"1f5a0bbe": "addExecutor(address)", +"1f5a0dd2": "courts(uint256)", +"1f5a177f": "registerVestingScheduleWithPercentage(address,address,address,uint256,uint256,uint256,uint256,uint256)", +"1f5a2a52": "getDamageValue(uint256)", +"1f5bb9f8": "Refund_TrustlessTransaction(uint256)", +"1f5bdf5d": "isRegisteredUser(address)", +"1f5c3a3c": "approveMultiple(address,uint256[])", +"1f5c6f67": "getOpeningTimeByStage(uint256)", +"1f5d0b4c": "address(address,address,uint256)", +"1f5dddab": "WithdrawContribution(uint256)", +"1f5dfcd5": "lastBlock_a7()", +"1f5e881f": "_buyTokens(address)", +"1f5e8f4c": "isRestricted()", +"1f5e9a2a": "CyberMilesToken()", +"1f5eeb13": "tokenSendFailuresCount()", +"1f6034fd": "getInt8FromByte(bytes14,uint256,bytes1)", +"1f60d9f7": "crowdfunding_allocation()", +"1f617a60": "setReceivable(address,bool)", +"1f6275bb": "issueTokenAndTransfer(uint256,uint256,address)", +"1f63a350": "settle(bytes32,bytes32,uint8,bytes32,bytes32)", +"1f64c1f2": "getInvestorInforValue(uint16)", +"1f66531d": "getEsgoTX(uint256)", +"1f67298d": "Daq()", +"1f677d8d": "ownershipLength()", +"1f68f20a": "baseRate()", +"1f69565f": "getTokenInfo(address)", +"1f69aa51": "left77(uint256)", +"1f69d230": "setMultiLedgerValue(string,address,address,uint256)", +"1f69f929": "teamVestingCounter()", +"1f6a1bf7": "lastDifficultyAdjustmentEthereumBlock()", +"1f6a1eb9": "execute(bytes,bytes)", +"1f6a3943": "icoBackend()", +"1f6b0a9d": "getReleaseLockfileURI(string,uint32,uint32,uint32,string,string)", +"1f6b28bf": "valueOf(string)", +"1f6b5b7d": "setRefundState()", +"1f6b9b97": "placeBet(uint8,int8,uint8,uint256)", +"1f6c0a9b": "ReleaseLockedBalance(address,uint256,uint256)", +"1f6c76f4": "reserveDeveloperTokens(address,uint256)", +"1f6ce1d3": "setDaySellAmount(uint256,uint256)", +"1f6d2086": "setCooldownIndex(uint256)", +"1f6d3d13": "AddrDevelopGroup()", +"1f6dc06c": "SetSaleStep(uint256)", +"1f6de588": "PiedPiperNetworkCoin()", +"1f6e5117": "getCallbackAddress()", +"1f6e6f3a": "DigitalThothToken()", +"1f6eb6e7": "escapeHatchCaller()", +"1f6ee77a": "setInitialData(address)", +"1f6eeb68": "canMintBurn()", +"1f6f3c0f": "getShipProductAmountByModel(uint16)", +"1f706c64": "EndTimeUpdated()", +"1f71f250": "updateTopicAddress(bytes15,address)", +"1f720e71": "testThrowTranferTooManyTokens()", +"1f7266e8": "owner_TransferFromTo(address,address,uint256)", +"1f7299c1": "processSell(address,uint256,uint256)", +"1f72d7d8": "increaseCap(int256)", +"1f7334e2": "TransferFlower(address,address,uint256)", +"1f74de51": "getAuditOutcome(address,bytes32)", +"1f772a34": "token_symbol()", +"1f77aac0": "queryUserContract(address,uint256)", +"1f790a94": "BananaGame()", +"1f794436": "getBlockHeader(int256)", +"1f7a41f1": "rawNameOf(address,address)", +"1f7a72f7": "bobClaimsDeposit(bytes32,uint256,bytes32,address,address)", +"1f7ab15d": "setdecimals(uint256)", +"1f7af1df": "canReceiveMintWhiteList()", +"1f7b4f30": "roll(uint256)", +"1f7b5318": "getBlocklancerToken()", +"1f7b6d32": "length()", +"1f7b8622": "getVotingDeadline()", +"1f7bf1eb": "_mintShares(address,uint64)", +"1f7c4bf3": "AccessControl()", +"1f7ccc09": "initAssetFile(string,string,string,string,string,string)", +"1f7cdd9b": "unicornsGifted()", +"1f7d16f7": "managementWalletAddress()", +"1f7df96f": "registLogo(address,address,string)", +"1f7e3e72": "test_oneValidEqStringUint()", +"1f7e495b": "systemSupply()", +"1f7f3082": "addForwarder(address,address)", +"1f7fe78b": "balanceAtSnapshot()", +"1f800e8e": "releaseVested()", +"1f803ac3": "getUnlockedTokens(address)", +"1f807736": "withdrawFreeAuctionBalances()", +"1f81582c": "returns()", +"1f816c6d": "hodlerReward()", +"1f820f52": "migrateEuroTokenOwner(address,uint256)", +"1f83bcd7": "withdrawlDeadline()", +"1f83d11a": "addMilestonesAndSeal(uint256[],uint256[],uint256[],uint256[])", +"1f83d75e": "updateProfileDetails(string)", +"1f83f440": "getPaymentByAddress(address)", +"1f86ab51": "confirmCollection()", +"1f86ffda": "UpdateBid(address,uint256,uint256)", +"1f8712af": "isValidPurchase(address)", +"1f871726": "getCategoryWorkClockTimeRef(uint256)", +"1f879433": "setSolver(address)", +"1f8814ad": "ElyERC20(uint256,string,uint8,string,bool,bool)", +"1f8864ac": "setStorageOwner(address)", +"1f887d56": "CryptoSagaDungeonVer1(address,address,address,address,address,uint32,uint256,uint256,uint32,uint256,uint32,uint32,uint32[4],bool)", +"1f8947c1": "extractUint(int256,bytes,uint256,uint256)", +"1f89e911": "getCompositionPrice(uint256)", +"1f8ac604": "mul0()", +"1f8ae3f0": "proofFailed(bool)", +"1f8c07b0": "startPhase(uint256,uint256,uint256)", +"1f8d1d50": "setTotal(uint256)", +"1f8d99a9": "assetIsRegistered(address)", +"1f8df2cd": "setGeneScientist(address,bool)", +"1f8e6fb3": "transferSale(address,uint256,uint256,uint256)", +"1f8e728c": "addMilestone(uint8,uint256[],uint8[])", +"1f8e9143": "AcceptsKDI(address)", +"1f8ea5e8": "EternalChainToken()", +"1f8eac47": "spentByTeam()", +"1f8f1d21": "addMember(uint256,address,bytes32)", +"1f8f69e3": "fechAllVoteResultForCurrent()", +"1f8f8100": "Tspace()", +"1f8fcc45": "Vantador(address)", +"1f903037": "getBytes32()", +"1f903b5d": "preSaleSpenderTxDetails(uint256)", +"1f90b2a5": "snapshotBlock()", +"1f90ffc8": "AddSupply(uint256)", +"1f91666d": "newOrganisation(string,string,string,uint8,bool)", +"1f91e309": "getBuyBackPrice(uint256)", +"1f922d06": "duplicate()", +"1f92f6b7": "setBtcUsdRate(uint256)", +"1f934299": "calcConfirmsNeeded(uint256,uint256)", +"1f960571": "picops_balances(address)", +"1f963f80": "getReportingWindowId(uint256)", +"1f96938d": "deliverSale(address,uint256)", +"1f96add4": "ChronoMint(address,address,address)", +"1f974fe4": "NExT()", +"1f979e23": "GetRigData(uint8)", +"1f97a238": "rejectCertificate(uint256)", +"1f97c00e": "tokenCreationMax()", +"1f97ea5d": "EDU_PER_ETH_PRE_SALE()", +"1f97f2ef": "issuedTokensForCommand()", +"1f98394d": "basicReward()", +"1f994137": "booleanStorage(bytes32)", +"1f995ef1": "HDCTestToken()", +"1f9988c9": "transferTokens(bytes32,address,uint256)", +"1f99c458": "listNamesLen()", +"1f99d862": "test_method_increaseTimeBy30000()", +"1f9a08ca": "reelIn(uint16,uint16,bytes32,bytes32)", +"1f9a391c": "setCanCreateGrants(address,bool)", +"1f9ab193": "place(uint8)", +"1f9b1153": "initiateMigration(uint256)", +"1f9c381e": "setTokenMinAmountBuy(address,uint256)", +"1f9c5580": "AMIS(address)", +"1f9c564f": "rubusOrangeAddress()", +"1f9c649f": "HashInvalidated(bytes32,string,uint256,uint256)", +"1f9d7ab8": "addTokens(uint256,string)", +"1f9ea25d": "_setDepositAccount(address)", +"1f9eba17": "bitcoinInvest(address,uint256,uint256)", +"1f9ecab1": "TowerImagesCoin()", +"1f9ef7fa": "getPayoutNumerator(uint8)", +"1f9f168e": "startNewRound(address)", +"1f9fed62": "checkMySellerOffer(address)", +"1fa03a2b": "isApprovedFor(address,address)", +"1fa08755": "upgradeDexterity(uint256)", +"1fa08ad8": "EtchReward(uint256)", +"1fa0914e": "buyStamps()", +"1fa096e6": "isInversor(address)", +"1fa0dc70": "saveReturnSatoshi(address,uint256)", +"1fa13a61": "longTermTokens()", +"1fa224bf": "setOraclizeAddr(address)", +"1fa24aa7": "makePermanantlyTradable(uint8)", +"1fa30523": "doMint(address,uint256)", +"1fa3c372": "redeemTokens(bytes32)", +"1fa3cfaa": "bmc(uint256,uint256,address)", +"1fa4070c": "TestCoinVN()", +"1fa422a2": "earliestNextSettlementTimestamp()", +"1fa45291": "arrayOfClones(address)", +"1fa498ce": "messagetodovie()", +"1fa4c486": "PublicResolver()", +"1fa4d9de": "completedAddingParsels()", +"1fa4ea66": "reservationAddress()", +"1fa59521": "FTBCToken()", +"1fa5e43b": "freezedBalanceOf(address)", +"1fa62fb7": "setCountrySlogan(uint256,string)", +"1fa6f19b": "getAddressForQuery(bytes32)", +"1fa96b96": "currentProposalResults(uint256)", +"1fa98406": "fundType()", +"1fa9d21f": "DASABI_IO_Contract()", +"1faae8b3": "getTypeValue(uint256)", +"1fab0265": "messiDev()", +"1fab3fd4": "setFinishedTx(address)", +"1fabb318": "MAX_ALLOWED_BY_STAGE_1()", +"1fabe6cf": "getActualCompletionDate(bytes16,address,address,uint256,uint256)", +"1fad4d46": "getShipOwner(uint32)", +"1fad4e79": "sevenWinnerWithdraw()", +"1fae75eb": "Xandra()", +"1fae9361": "changeTimes(uint8,uint8)", +"1faec182": "getBet(uint8,uint256)", +"1faf1ed4": "unlockTip()", +"1faf8995": "fillOrder(address,bytes32,uint256,bytes32)", +"1fafc2c8": "updateBusinessReserveAddress(address)", +"1fb00cdc": "investWithId(uint128)", +"1fb150c4": "_batch1_icosaleEndTimestamp()", +"1fb156ef": "ecmul(uint256[3],uint256)", +"1fb168ac": "setStopStatus(bool)", +"1fb1f18b": "getWinnings(address,uint256)", +"1fb25f07": "getCertification(bytes32)", +"1fb291cb": "registerInt(address,int256)", +"1fb2de2c": "sendTokensToTwo(address,address,uint256)", +"1fb2f2a0": "testUpdateLatestRevision()", +"1fb384cb": "RemoveRocketForSaleEvent(address,uint32)", +"1fb47fe8": "CulturePhilosophyFaithChain()", +"1fb4bcf8": "SetSaltPassword(bytes32,bytes32)", +"1fb4d1e7": "TheMutualCurrency()", +"1fb59f9d": "swapProxyTokens()", +"1fb6e99d": "paymentNeeded(uint64)", +"1fb82d26": "storeProof(string)", +"1fb8875d": "referralSent()", +"1fb8c0ed": "releaseEQUIWihtoutKYC()", +"1fb8d5de": "vaultUnlocked()", +"1fb97c34": "updateFirstAmount(bytes32,bytes32,uint256)", +"1fbab493": "checkPrice(address,address,bool,uint256,uint256)", +"1fbb408a": "RacingToken()", +"1fbb4def": "CalculateDividents(uint256)", +"1fbbf4bb": "setKillingGap(uint256)", +"1fbcf2c1": "_lotterySupply()", +"1fbd3564": "getContentsManager()", +"1fbd7771": "didSoftCapReached()", +"1fbd9a0b": "REFUNDSACTIVE()", +"1fbda78f": "LibraryToken()", +"1fbe1979": "rescue()", +"1fbe480e": "shipToMe(string,uint256)", +"1fbe7475": "findEndpointByAddress(address,address)", +"1fbeaa83": "PublicBatchTransfer(address,uint256)", +"1fbee22c": "updateSearchingFee(uint256)", +"1fbee6ed": "CNYTokenPlus(uint256,string,uint8,string)", +"1fbf7c3e": "increaseReserve(uint256)", +"1fbfe6f3": "auditReport(address,bool,bytes32,bytes32)", +"1fc03aa0": "getTypeByNumber(uint256)", +"1fc05f86": "minimalWei()", +"1fc06f0d": "niceGuys(uint256)", +"1fc083cf": "OurBit()", +"1fc0e5e9": "StartPaymens()", +"1fc1e25f": "listToken(address)", +"1fc242b9": "onVote(address,int256)", +"1fc24caa": "changeMaxTransactions(uint256)", +"1fc27ef2": "isIcoActive()", +"1fc2e0fb": "MinedThisYear()", +"1fc3a519": "computeReturn(uint256)", +"1fc5b4ee": "balancesByIndex(uint256,address)", +"1fc5c9b7": "setNextPeriod(uint256,uint256)", +"1fc62fce": "Trillionereum(address,address)", +"1fc6e13a": "getRoundKeyPrice(uint256)", +"1fc75e41": "preSaleWallet()", +"1fc7d658": "purchase(address[16],uint256)", +"1fc82e83": "allocateUnclaimedFees()", +"1fc86532": "endBlockBonus2()", +"1fc87587": "get_CountProfitsToken()", +"1fc928ae": "taxToken()", +"1fc97e34": "Genius()", +"1fc983fb": "ChelseavsArsenal()", +"1fca5278": "highScore()", +"1fca5fda": "IsRazRunning(uint256)", +"1fcafd8f": "FomoMasterCoin()", +"1fcb292d": "getTokenFunction(uint8)", +"1fcbbefa": "sendBooty(address,uint256)", +"1fcc02e8": "EthereumTestToken()", +"1fcc2515": "ChangeCrowner(address)", +"1fccc158": "tCampaignEnd()", +"1fcd08f0": "AaadharDemo()", +"1fcd7ea6": "getPOOL_edit_33()", +"1fcdfe14": "icoTokenAmount()", +"1fcf25be": "getTransactionSuccess(bytes32,uint256)", +"1fcf55ff": "withdrawApplication()", +"1fd01085": "_sellPresale(uint256)", +"1fd01de1": "_checkOnERC721Received(address,address,uint256,bytes)", +"1fd023ab": "FFCryptoCoinToken()", +"1fd22140": "CountCourses()", +"1fd2676f": "jackPotPercents()", +"1fd2e006": "changeClassFee(uint256,uint256)", +"1fd3dd97": "OneEtherEqualsInWei()", +"1fd41949": "setMaxInvestedLimit(uint256)", +"1fd476bd": "AutonomousSoftwareOrg(bytes32,uint8,uint8,bytes32)", +"1fd4b40c": "saleEtherCap()", +"1fd55a8a": "crowdsaleOpened()", +"1fd7b802": "ModifyMine(uint256,bool,string,uint256)", +"1fd7f431": "setCCH_edit_7(string)", +"1fd8088d": "minLimit()", +"1fd8291a": "endpresale()", +"1fd86a6a": "FundICO(uint256)", +"1fd96b69": "ManagedAccount(address,bool)", +"1fd97c12": "CNotesICO()", +"1fd982a5": "releaseForEarlyInvestor(address,uint256)", +"1fd9b2a4": "createValidatedRequest(address[3],address,uint256[12],uint256,bytes)", +"1fd9f187": "catNoLongerForSale(uint256)", +"1fda4271": "MindToken()", +"1fda5b45": "receivePlayerInfo(uint256,address,bytes32)", +"1fda8278": "drawCoach(uint256,address,address)", +"1fdaedf2": "BoomstarterPresale(address[],address,address,bool)", +"1fdaf3f2": "ServiceAgreement(string,string,uint8,uint256,uint256,uint256,address,address,uint256)", +"1fdb5a2b": "addInvestmentPreIco(address,uint256)", +"1fdba848": "BiekensToken()", +"1fdcf5a7": "lockEthBalance(address,uint256)", +"1fdd7695": "getbuyprice(uint256)", +"1fddbba4": "totalVUP()", +"1fde4607": "setCreditDaoFund(address)", +"1fde8469": "setExchangeRate(uint32)", +"1fdf071c": "approveMintAgent(address,bool)", +"1fdf6e0c": "protectKingdom()", +"1fdfa40d": "test_setupBoardRoomAndAssert()", +"1fdfec35": "calculateTotalDue(uint256,uint256)", +"1fe00a15": "individualMaxCapTokens()", +"1fe07274": "SDEToken(uint256,string,string)", +"1fe08e28": "how_many_arbits_do_i_have()", +"1fe0ff58": "finishRound(uint256)", +"1fe1516d": "sendToTeamEthContract()", +"1fe15db5": "MarketboardListingComplete(address,uint256,uint256,uint256)", +"1fe1b208": "totalavl()", +"1fe26e9d": "componentCount()", +"1fe2a6f2": "updateJugada(uint256,bool)", +"1fe2c933": "UpgradeByCredits(uint256,uint256)", +"1fe2d046": "assignRafflePrize(address)", +"1fe2e229": "getTotalTrust(address)", +"1fe3aec7": "CGCGToken()", +"1fe4ee7f": "getVoteItemDetails(uint256)", +"1fe51f82": "persistLimit()", +"1fe55867": "rew()", +"1fe6189e": "PARTNERS_ADDRESS()", +"1fe64f19": "MaximumHodlDurationChanged(uint256,uint256)", +"1fe74895": "Etherchicks()", +"1fe7b624": "resumeMint()", +"1fe7ff2c": "SpriteToken()", +"1fe8149e": "createTokenByHWC(address,uint256)", +"1fe8500e": "setItemRegistry(address)", +"1fe8629a": "giveMultipleItemsAndDestroyMultipleItems(address,uint256[],uint256[])", +"1fe93774": "totaleFrasi()", +"1fe97e45": "whoIsConcerned(address)", +"1fe9eabc": "setMax(uint256)", +"1fea96cd": "removeUserFromBlackList(address[])", +"1feac75b": "setCommissions(uint256,uint256)", +"1feaee17": "getSetupParametersByIndex(uint256)", +"1feb0c4f": "PreICOProxyBuyer(address,uint256,uint256)", +"1feb19d6": "initialize(uint256[],uint256[],uint256,address,uint256,address,address)", +"1feb3569": "transferToken_toBalance(address,uint256)", +"1fec0e96": "LogCampaignAdded(uint256,address,uint32,uint96,uint16,uint16,uint256)", +"1fec5a11": "Coin77()", +"1fec6dce": "createVestingPeriod(address,uint256,uint256,uint256,address,address)", +"1fedbc03": "getSharesPercentForPeriod(bytes32,uint256)", +"1fedd70b": "snipCoinToEtherExchangeRate()", +"1fee37c8": "ADDR_TKG_NODE()", +"1fee5c51": "set_min_max_FinneyPerSale(uint256,uint256)", +"1feef08e": "getTotal(uint256)", +"1ff13086": "size(int256)", +"1ff14311": "totalOutcomeAmounts(int256)", +"1ff1a378": "maxSalesAllowed()", +"1ff2c22b": "setCharityFund(address)", +"1ff2e214": "proposeAmendmentJUR(address,uint256[],uint256[],bytes32)", +"1ff42195": "minimum_cash_proof_amount()", +"1ff517ff": "totalDebt(address)", +"1ff5668c": "depositForDividends()", +"1ff5e17c": "_itemLength(uint256)", +"1ff6536c": "setCrowdSaleStart(uint256)", +"1ff6a54b": "cancelFavor()", +"1ff6ad55": "tokensForPeriod(uint256)", +"1ff6c241": "collectedUSD()", +"1ff75851": "updateICODate(uint256,uint256)", +"1ff76f86": "ROBReserveAllocation()", +"1ff7a278": "ownerNegTokens()", +"1ff858d0": "activateNextStage()", +"1ff8ac8a": "getFinalval()", +"1ff8d507": "toggleSwap()", +"1ff96c74": "getHonour(uint256)", +"1ffa27f9": "hasPermissions(address)", +"1ffa451c": "serviceTransfer(address,address,uint256)", +"1ffb6ca6": "unlockTransfer(address,uint256)", +"1ffbb064": "isAgent(address)", +"1ffbf32b": "MUSPRA()", +"1ffc973a": "HedgeCash()", +"1ffcb18c": "numQuestions()", +"1ffd3aef": "log10Floor(int256)", +"1ffd42ab": "getVotingScriptAction(uint256,uint256)", +"1ffd99f4": "saler()", +"1ffe3c9b": "UECToken(address,uint256)", +"1ffe4cca": "startline()", +"1fff2d8a": "payToPresale(address)", +"1fff5c2f": "bindEthereumAddress(address,bytes32)", +"1fff7a97": "CompositionPart(uint256,address)", +"1fffbe7a": "getJobSponsorships(uint256)", +"200138b9": "CrowdTmoney()", +"20020a3a": "createAsset(bytes,uint256,bytes,bytes,address)", +"20027275": "saleStartBlock()", +"2002c2f6": "slogans(uint64)", +"200308ee": "rewardVoteResultForCandidate(address,uint256)", +"20033848": "MagixRecordsCoin()", +"20035e36": "icoEth()", +"200373c9": "fees_()", +"2004b6a6": "TheWhaleWins()", +"2004dff6": "Basics()", +"2004ffd9": "mintToken()", +"200538c6": "DTE()", +"200576b5": "TchainToken()", +"2005db6d": "preIco(uint256,uint256,uint256,uint256[],uint256[])", +"2007474e": "theRelayer(address)", +"20076659": "Arbitrator()", +"2008c2ca": "destPercent(address)", +"2009a059": "setLandProductionMultiplier(address)", +"200a252a": "PhanToken()", +"200aa519": "addCustomerwithToken(address,uint256,address)", +"200aac9f": "burnAZLTEST(uint256)", +"200b0fa6": "initVote(uint8)", +"200b894d": "assertEq(int256,int256,bytes32)", +"200b8951": "_distribute(address,uint256,uint256,uint256)", +"200c1f19": "premiumPacks()", +"200c7295": "whitelistAddress(address,uint256)", +"200c7770": "bountyDuration()", +"200cdf8e": "becomePickleRick()", +"200d10dc": "OrpheusOrganicsLaos()", +"200d2ed2": "status()", +"200deb8b": "MessageSent(string,string,string,uint256)", +"200ebe34": "addTokensToGive(address)", +"200ef97e": "payNTS()", +"200f29e3": "advisorAccount()", +"200fbcf0": "getFullyVestedAmount(address,address)", +"201035ed": "getGunsIds()", +"20104dca": "engCommunityAddress()", +"2010bdce": "removeSupervisor(address,address)", +"20120dce": "ADMIN_SET_TEST_RANDOM(string)", +"20130753": "testThrowSetNotRetractableNotOwner()", +"20145328": "changeMelonportAddress(address)", +"2014c515": "tgrNextPartInvestor()", +"2014d703": "approveAllArgs(address,uint256,address)", +"2014e1fb": "W0keAFCrowdsale(uint256,uint256,address,address,address[])", +"2014e5d1": "isRunning()", +"20150e21": "sendDividends(uint256)", +"20153d38": "EarlyAdoptersAmount()", +"20154e78": "unpausePVP()", +"20158c44": "fills(bytes32)", +"201745d5": "disown(bytes32,address)", +"2017af61": "initialTokensHolder()", +"2017ee03": "nextDealIndex()", +"20183926": "EngagementToken()", +"20185aa2": "liquidityWithdraw(uint256)", +"20188d4f": "getAdjustedContribution(address)", +"20190ccd": "startCirculation()", +"201bafee": "TroneriumSupply()", +"201dcd7a": "newChallenge(uint256,uint256)", +"201de654": "mnemonicsCount()", +"201e8f0e": "changeWhitelistCornerstoneStatuses(address[],bool)", +"201e908e": "blockDuration()", +"201f1506": "EthereumEra()", +"201f6e02": "oldAppreciationRateWei()", +"201f96e5": "setRepMarketCapInAttoeth(uint256)", +"20202965": "expired(bytes12)", +"20204fb7": "genericCall(address,bytes,address)", +"2020e9ea": "bid(uint16,uint16)", +"2021dfcb": "BONUS_DURATION_3()", +"20226e17": "valueOnContract()", +"2022936f": "BalanceClaim(address)", +"202329cb": "get_all_activityn(uint256)", +"2024617e": "initialize(string,string,uint256,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"20250264": "setData_5(uint256)", +"2025867b": "qualifiesAsCommunityBallot(uint16)", +"2025e52c": "createSaleTokensVault()", +"20260697": "createWallet(uint256,address[],bytes32)", +"20263e87": "incentiveTokenAddress()", +"2026a0a7": "change_sale_address(address,string)", +"20277ed7": "GWGFPLUS(uint256,string,string)", +"2027d2c6": "ETHLottery(address,uint256,uint256,uint256,address)", +"2027d746": "getCustomerCount()", +"2027e1d3": "COCO()", +"20281990": "ProposalAddedEvent(uint256,address,uint256,string)", +"20283da9": "trustedWithdrawETH(address,uint256)", +"202920ef": "FST()", +"2029e599": "addCode(string,string)", +"202a46cf": "limitEther()", +"202a6ce0": "NFXCoin()", +"202ac3bc": "withdraw(bytes,bytes,bytes32)", +"202b876a": "allocateToMarketingSupporter(address,uint256)", +"202bb36d": "JTBlockchain()", +"202bc7e7": "getIntervalCoefficientMultiplier(uint256,uint256,uint256,uint256)", +"202c413d": "setNickname(uint256,bytes32)", +"202ca027": "setPayrollAddress(address)", +"202d5123": "STRTToEth()", +"202d6eaf": "addInvestorsValue(uint256)", +"202e3924": "getOperation(uint256)", +"202ece74": "sendToWinner(uint16)", +"202feb77": "test_2_assertGasUsage100Boards()", +"2030762a": "PoolICO()", +"2030f721": "num_objects()", +"20323763": "addPerformance(string,uint32,uint8,uint8,uint8,uint16,bool)", +"2032677f": "roundOpen()", +"20334668": "verify(uint256,uint256,uint256[],uint256,uint256,uint256[],uint256[])", +"20339891": "addGridMember(address)", +"2033d9ae": "switchToDistributionMode(uint256)", +"2033de43": "setNewRatesCustom(uint256,uint256,uint256,uint256,uint256,uint256)", +"20352a6e": "ChildDeposit()", +"2035d6b4": "addAccountData(string,bytes)", +"20364306": "setMaxLinkedWalletCount(uint8)", +"2036e2f7": "getCurrentExchangeRate(uint256)", +"20375692": "initVesting()", +"2037fcbf": "withdrawInvestment(uint256)", +"2038d1e5": "setTokenMintFeeAbs(address,address,uint256)", +"2038e2e6": "timestampLast()", +"2038e80a": "mixFormula()", +"20392160": "round1Sold()", +"20396553": "safeMul(int256,int256)", +"203967a5": "toDie(bytes32)", +"203985d6": "getWeeklyTickets(address)", +"20398971": "abiOf(uint256)", +"20398b83": "sendPrepaidEthTweet(uint256,string,uint256)", +"2039b386": "isHashSigned(uint256)", +"2039d9fd": "depositERC20Token(address,uint256)", +"203a318f": "ico_startdate()", +"203a79f6": "cutoffTimestamp()", +"203ab888": "collectOriginalBet()", +"203b2352": "_checkOpenings(uint256)", +"203c03fa": "Coinflip()", +"203cbee2": "ownerPetTransfer(address,uint64)", +"203d39ff": "getOrderBook(address,address)", +"203dacb9": "PrivatePreSale()", +"203e0dc9": "SupbToken()", +"203e3204": "goldIfFreeze(address)", +"203faa89": "lastState(address)", +"203fb521": "addTransaction(address,uint256,bytes,uint256)", +"203fec23": "LogTransfer(address,address,uint256,string)", +"204009d2": "transferForMultiAddresses(address[],uint256[])", +"20409b47": "updateContent(string,uint256)", +"2041518d": "calculatePrice(uint256[],address)", +"2041b997": "tokenizeProperty(string,address)", +"20422fd9": "setAutoInvestByAdmin(address,bool)", +"204241cb": "leaveTeam(uint256)", +"2042495b": "changeUsed(address,int256)", +"2042e5c2": "removeWhiteList(address)", +"2043285d": "getMarketMakers()", +"2044b21b": "exceedsSaleCap(uint256)", +"204525e6": "mul256()", +"204605ad": "ngrzicoToken()", +"2047e4af": "updateTokensState(uint256,uint256)", +"2048cba4": "inGroup(address)", +"2048e5f7": "PaytherToken()", +"20495427": "setBreedingAuctionAddress(address,address)", +"204a88c5": "hasAgreement(bytes32)", +"204b21d1": "AVAILABLE_BONUS3_SUPPLY()", +"204b676a": "numVestingEntries(address)", +"204d3d65": "getCountPlayersOfTeam(uint256)", +"204e6749": "rewardToken(address,uint256,uint256)", +"2050c26e": "preSaleFourthCap()", +"205140c7": "totalClaimableTokens()", +"20514abf": "tktotal()", +"20522347": "changeEndDate(uint256,uint256)", +"20523d0d": "closeAgreementWithTimeout(bytes,uint8[2],bytes32[2],bytes32[2])", +"2052de16": "checkContinuousPurchase(uint256)", +"2053480e": "ActionMiningPlat(address,uint16,address)", +"205360e0": "setReward(uint64,uint256)", +"2053e690": "turnOffOraclize()", +"20544010": "getWinningsForRecordId(uint256,bool,bool)", +"20547a42": "increaseDailyTransactionVolumeReceiving(uint256)", +"2054b2c6": "assert(address,address)", +"205525d2": "set_comp(uint256,string)", +"2055c2ff": "SerchUserPurchase(address,address)", +"20566ae8": "initMonsterClassSiteSet()", +"2056ab36": "NewNodePriceTicker(string)", +"20572943": "SignedMessageOracle(bytes32,uint8,bytes32,bytes32)", +"205730fd": "SELL()", +"2057420b": "withdrawVault(uint256,address)", +"2058308d": "_addPropertyValue(bytes32,address)", +"20592076": "HeyToken()", +"2059c548": "exerciseOptionsDeadline()", +"205b1946": "hasContributed(address)", +"205b931e": "addOracles(address[])", +"205ba186": "DSJL()", +"205c2878": "withdrawTo(address,uint256)", +"205c7cf5": "issueCenturion(address)", +"205c9cc7": "w()", +"205d0063": "feeTakeExporter()", +"205d6c86": "purchaseEgg(uint64,uint16)", +"205dc0ee": "poolAddressCapTier1()", +"205e0e26": "advisersCliff()", +"205e921c": "delegatedRefund(address,address)", +"205f3b58": "calculateOwnerCut(uint256)", +"2060a150": "props()", +"20610779": "deathData_a2()", +"20614514": "HHDToken()", +"20620f37": "onAuctionEnd(string)", +"206288d3": "deployBlockNumber()", +"2062e457": "setDirectPaymentThreshold(uint256)", +"2063165d": "union(uint256[],uint256[])", +"206369fa": "AthleteToken()", +"206465f7": "_getPendingOwner()", +"20647eb7": "externalFailure()", +"20651d5d": "batchTransferToken(address,address[],uint256[])", +"20654277": "ArtsCoinV1()", +"206545c2": "DIAMOND()", +"206607f2": "updateCanFetch(bool)", +"20675504": "hyperInterface()", +"2067c85c": "transferTokensFromMarketingAddress(address,uint256)", +"20688582": "saleIsRunning()", +"20689f29": "preSalePeriod()", +"2069381a": "multiPresaleMint(address[],uint256[])", +"20694db0": "addIssuer(address)", +"2069de94": "TonalQuantum()", +"2069f66c": "isPresalesNotEndedInAdvance()", +"2069fc46": "excludeAmbassadors(uint256,address)", +"206a44f3": "getNum(bytes,uint256)", +"206b64b4": "generateName(bytes16,uint256,uint256)", +"206cfd24": "cleanFinishedOperations(uint256)", +"206d0125": "getWithdrawnFromBatch(address,uint8)", +"206d1fde": "setMegaAddress(address)", +"206d468f": "PriceOracleInterface(address,address)", +"206ec7a1": "multisend(address,bytes32,address[],uint256[])", +"20701967": "confirmPlatformWithdrawal()", +"2070748c": "XeroBest()", +"20709b35": "jackpotPaused()", +"2070b6de": "donationPhase()", +"20714f88": "setSelfDestructBeneficiary(address)", +"2072343e": "MeowToken()", +"2072863b": "setCMO(address)", +"20729b83": "DistributeButtonIncome()", +"2072cde2": "NewsCash()", +"207368fc": "startSelling(uint256,uint256)", +"20745669": "ClaimedSignature(address,string)", +"2074cc86": "MikCoinToken()", +"2075281c": "Marko()", +"2075eec6": "tokenQuantities()", +"20768ee8": "getProposalID()", +"20770caf": "GRUCoin()", +"2079405b": "AmountToDistribute()", +"20799608": "convertDecimal(uint256)", +"2079fb9a": "signers(uint256)", +"207a6c33": "calculateCurrentVirus(address)", +"207a6d80": "TukBuk()", +"207aba24": "Migrate()", +"207acb53": "_calculateRequiredTokenBalance(uint256,uint256)", +"207b89e2": "purchaseLand()", +"207bd99d": "ableTransfer()", +"207beb59": "getRateIcoWithBonus()", +"207c64fb": "validate(address)", +"207cb710": "grantInvestorTokens(address)", +"207e6467": "pieBalances(address)", +"207f4f38": "contTransfer(address,uint256)", +"2080d8dc": "EVTCTLToken(address,uint256)", +"20813154": "deregister(bytes32)", +"2081e911": "Set()", +"208318bd": "Total_Amount()", +"20832219": "setOps(address,bool)", +"2083250d": "Atriark(uint256,string,uint8,string)", +"20834ed0": "AddPlayers(address,address)", +"20835e8c": "getBet()", +"2083c730": "_hatchEggs(address)", +"2083cbd8": "execAirDrop(address,address[],uint256[])", +"2083f44f": "lastFell()", +"20857295": "setErc20TokensContract(address)", +"2085f554": "approveAndCall(address,uint8)", +"20867ccd": "addEmployee(uint256,string,string,string,string,string,string,address)", +"2086ad60": "MiewGold()", +"20871322": "ForecastingFactory(address)", +"208838c8": "tokenPerWai()", +"20885d9e": "PGE02CH()", +"208904c7": "startFrom()", +"208972b4": "PartialPayment(uint256,address,address,uint256)", +"2089d0c9": "Swachhcoin(address)", +"208a099c": "createKitty(uint256,uint256,uint256,uint256,address)", +"208a9e37": "tweakRefundStatus()", +"208af09f": "setIsForking(bool)", +"208b080f": "changeExpiryLimit(uint256)", +"208b3116": "next(uint256,uint256)", +"208b7427": "AgriChainContext()", +"208c1019": "BLOCK_BASIC_PRICE()", +"208c8692": "mint(bytes,uint256,bytes,bytes)", +"208ca719": "SellIPG(uint256)", +"208df65f": "getValueByNumber(uint256)", +"208e1cc3": "writeConditions(uint256,string)", +"208e8914": "atFundDeposit()", +"208eba04": "_withdraw(address,uint256,address)", +"208ebf16": "lpBidVolume()", +"20907d9a": "BlockClout()", +"20909455": "triggerAirDrop(address[],uint256)", +"20909fa0": "communityCurrency()", +"2090b0a8": "m_allowPrivileged()", +"2090cf8b": "consultBalance(address)", +"2090d5e9": "lookupByProject(uint256)", +"2090d8a6": "trackOdd(uint256)", +"2090f3e3": "lethalBonusAtHitsLead()", +"209164d5": "_processPurchase(address,uint256,uint256)", +"20917902": "globalether()", +"2091f2d9": "ICOoverTimeStamp()", +"2092970f": "StartDistrib()", +"20940b13": "btcTransactionClaimed(uint256)", +"2094e9d8": "newJob(bytes32,bytes32)", +"20956341": "slice2(bytes,uint256)", +"2095f2d4": "endCrowdsale()", +"20965255": "getValue()", +"20968dc7": "rewardHistoryLengthOf(address)", +"2096b768": "getCoreAddress()", +"2096c958": "GEXAirDrop(address)", +"2096f2ff": "issueTokensMultiple(uint256[],uint256[])", +"2097dd04": "getLatestAuthorizedAddresses(uint256)", +"2097e5f0": "VaultbankToken()", +"209878b9": "lockReleaseTime()", +"20987e64": "addInvestment(address,uint256)", +"2098e37a": "LogBoonReleased(address,uint256,uint256,uint256)", +"2099940e": "freezOne()", +"209a5b8a": "moneySumAtSettlement(address,uint256,int256,uint256)", +"209ab711": "registerReferral(address)", +"209b7067": "CALLGToken(uint256,string,string)", +"209b80ce": "previousstageloser()", +"209bb163": "Ethex(address,address,uint256,uint256)", +"209cccd7": "channelCloseTimestamp(uint64)", +"209ebc08": "isPaid()", +"209f36d0": "registerApiKey(address,address,bytes32)", +"209f3c9c": "MINIMAL_PARTICIPATION()", +"20a0045a": "SALE_END_TIME()", +"20a0128e": "ICOEndDate()", +"20a09dec": "COMM_SUPPLY()", +"20a168b1": "coinsPerEth()", +"20a17b24": "dexWallet()", +"20a2b135": "forkThis()", +"20a3952b": "MyTestGameToken()", +"20a4e8f8": "_clearSnapshotDelegators(uint256,address)", +"20a60ace": "TokenBurner()", +"20a733df": "countPerformers()", +"20a7b2d7": "_setMintFeeProp(uint256)", +"20a7d5c3": "lend(uint256,bytes,address,bytes)", +"20a99bd0": "templates(address)", +"20aac36f": "getstopBlockNumber()", +"20aba08b": "rho()", +"20abf417": "stageFourCap()", +"20acbc83": "withdrawTokensFromWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"20ad3874": "vestingBonusMultiplierPrecision()", +"20ad8a81": "setTeamTokensPercent(uint256)", +"20ae2059": "setMaximumBet(uint256)", +"20af0841": "_payPayee(bytes32,address,uint256)", +"20af2042": "setCountPerStep(uint256)", +"20b023c8": "disavow()", +"20b0554e": "payoutBalance()", +"20b0747f": "start1stRound()", +"20b0961c": "pE(uint256,uint256,uint256,uint256)", +"20b0eafb": "PoWH4D()", +"20b0fe2c": "setGlobalParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint32)", +"20b1b0ab": "getStuckCoin(address,uint256)", +"20b1d054": "TAAS_VAULT()", +"20b27291": "setFinalized(bool)", +"20b28ade": "getIPFSHash()", +"20b2af52": "Author()", +"20b2d97b": "LiquidDemocracyRules(address,address[],uint256)", +"20b3c9c9": "InfinixSupply()", +"20b43094": "mulUInt(uint256,uint256)", +"20b431aa": "dividendDivisor()", +"20b44b29": "lockTransfer(bool)", +"20b4577e": "numBonuses()", +"20b4fc29": "setBbAddress(string)", +"20b519bb": "setBarrierAsOpen(bool)", +"20b652ba": "chainedFunctions()", +"20b748f4": "REGULAR_TYPE3()", +"20b7ceb8": "R2Xtoken()", +"20ba5b60": "insert(bytes,bytes)", +"20bacfbd": "addDoc(string)", +"20bb0ef6": "originalHash(uint256)", +"20bb280b": "buy5(address[],address[],uint256[],bytes,bytes,bytes,bytes,bytes)", +"20bb2adf": "setAllowedTransferFrom(address,bool)", +"20bc4425": "getHost()", +"20bcbee5": "EarlyTokenSale(address,address)", +"20bd0475": "resetLotteryBalance()", +"20bd46b7": "drawTertiaryAWinners(uint256)", +"20bf0c52": "Derived(uint256)", +"20bf2f47": "_setAddresses(address,address,address)", +"20bf92ca": "oldSeeleToken()", +"20bfa95c": "bookAndCalcRemainingPremium()", +"20bfde8b": "s24(bytes1)", +"20bfec70": "WatchFees()", +"20c0b493": "getWarriorChestPrice()", +"20c12f16": "penalizeInactiveJuries(address[],uint256[])", +"20c21ba5": "_setTypeValue3(uint256)", +"20c257f5": "_adjustReserve(uint256)", +"20c28b85": "schelling(address)", +"20c2d5e4": "withdrawAffiliatePot(address)", +"20c2f40b": "doCalculate(uint256,bytes32)", +"20c381af": "cityPoolTotal()", +"20c3be47": "_createZombie(string,uint256)", +"20c427b0": "sumBalance()", +"20c5429b": "revoke(uint256)", +"20c5478f": "RtBCoin()", +"20c55a8a": "AirDropAFTK5May()", +"20c58794": "PHN()", +"20c5b497": "recoverAddressFromBalanceProof(bytes32,bytes32,uint256,bytes32,bytes)", +"20c5e29a": "increaseDailyTransactionVolumeSending(uint256)", +"20c726b4": "view_product(uint256)", +"20c8580f": "getBalanceEthContract()", +"20c8651b": "makeFee()", +"20c90167": "distributeCDD(address[],uint256,uint256)", +"20c93c62": "trackFee(uint256)", +"20c9d73c": "validCountryId(uint256)", +"20c9f377": "OneUpToken(address)", +"20ca0418": "getEscrowById(uint256)", +"20ca292e": "AUFBToken()", +"20cad613": "isVersionLogic(address,bytes32)", +"20caea39": "surprisePanda()", +"20cb27fb": "requireWhitelistingBeforeDeposit()", +"20cb7bce": "takeFee(address,address,uint256)", +"20cc6889": "getAvatarByNickname(string)", +"20cc7b4e": "changeToken(address,address)", +"20cd2141": "advisorLockUp_address()", +"20cd3972": "grab(address,address,address,address,uint256)", +"20ce4c66": "getInteractive()", +"20ceb1bb": "SetCoinManager(address)", +"20ceb536": "grantToSetUnpausedWallet(address,bool)", +"20cf3e1f": "maintenance_mode()", +"20d00018": "jackpotTime()", +"20d01a7f": "ContestClosed(uint256,address[],address[])", +"20d0c13c": "getStatusModerator(address)", +"20d19181": "crowdsaleEndedBlock()", +"20d3a0b4": "unlockPeriod()", +"20d3fc20": "totalSeedStage()", +"20d615c2": "testControlTransferDisableNotEnabled()", +"20d71dad": "_repopTransaction(address,uint256,uint256)", +"20d76113": "admin_tokenBurn(uint256)", +"20d786b5": "withdrawalCounter()", +"20d7d367": "allowRegistryUpdate()", +"20d7d860": "ahmadToken(uint256)", +"20d8741f": "Feed()", +"20d8dad0": "checkWhitelisted(address)", +"20d95f90": "removeInt256(bytes32)", +"20d9822e": "setAnyoneCanCall(address,string,bool)", +"20d9a9e2": "getChallengeType(uint64,uint256)", +"20db0c7e": "B21Token(address,address,address,address,address)", +"20db31d6": "totalFortunes()", +"20db91e2": "createPartner(address,uint256,uint256,uint256)", +"20dc3d06": "bpLockUp(address)", +"20dc407a": "creditOwner()", +"20dc4677": "minPublicContribAmount()", +"20dcce99": "PRE_CROWDSALE_CAP()", +"20dce978": "setExchanger(address,address)", +"20dd60f5": "setEnvelopeType(uint256,uint256[2])", +"20ddf1de": "editEpisode(uint256,string,string,uint32)", +"20df7f35": "DATE_TOKENS_UNLOCKED()", +"20dfcd27": "purchaseCountry(uint256)", +"20dffb08": "testCancelSellOrder()", +"20e07e7f": "changeCardCost(uint256)", +"20e0dc9f": "RTCoin(string,string,uint8)", +"20e1063e": "toekensForBTCandBonus()", +"20e12a43": "createRound(bytes32,bytes32)", +"20e25965": "timestampRelease()", +"20e33b13": "GoodBit()", +"20e3dbd4": "setConfig(address)", +"20e537c7": "isTransactionAlreadySettled(address,bytes32)", +"20e561f3": "BecomePharaoh(uint256)", +"20e57371": "ownerVault()", +"20e59116": "startChampionGame()", +"20e62bbc": "StreamityEscrow()", +"20e647e1": "checkBetColor(uint8,address,bytes32,bytes32)", +"20e65a42": "stakeForAirdrop(address,uint256,bytes)", +"20e6a2cb": "getStrField1()", +"20e6e921": "transfer(address,uint8)", +"20e76d31": "_solveGame(uint256,uint256,uint256)", +"20e87093": "getDSTSymbolBytes()", +"20e89790": "POWR()", +"20e979b1": "assignBank(address)", +"20e98bf4": "setNick(string)", +"20e9aac3": "playerTimestamp(address)", +"20ea2533": "authorizePayment(string,bytes32,address,uint256,uint256)", +"20ea31f8": "giveTo(uint256,address)", +"20ea8d86": "revokeConfirmation(uint256)", +"20eb2a87": "setContract(address,address,address,address,address)", +"20eb6dec": "frozenControl(address,uint256,uint256)", +"20eba3f2": "gamesLength()", +"20ec0f01": "lastBlock_v12Hash_uint256()", +"20ec75c2": "searchStartIndex()", +"20ed1a52": "badge(address,address,uint8)", +"20ed9451": "set_active_contract()", +"20edae5a": "createChallenge(uint256,string,uint256)", +"20ee0c94": "setUrl(bytes32)", +"20ee5445": "addToPrivileged(address)", +"20eea675": "ESOPOffered(address,address,uint32,uint32)", +"20eeba1f": "testConstructorUsingNewContract()", +"20ef57ed": "bumpCounter(uint256)", +"20f067a8": "PRETDESupply()", +"20f06c9b": "start_LOCKUP(uint256)", +"20f06fef": "_createWarrior(uint256,address,uint256)", +"20f0751d": "turnOn(address)", +"20f0c28f": "MainContract(string,address,address,string)", +"20f0db91": "VerifCert(uint32,bool,bytes,bytes)", +"20f10ae7": "_supportsERC165Interface(address,bytes4)", +"20f10fdd": "tokenSupplyLimit()", +"20f1895c": "fechVoteSumNumForCandidate(address)", +"20f1d85b": "removeApprovedAddress(address)", +"20f317fb": "districtContractAddress()", +"20f320d0": "setBonusExtra(address,uint256)", +"20f361b3": "optionExercise(uint256)", +"20f3d413": "getTargetBlockNumber()", +"20f4014a": "ApolTestToken()", +"20f4914a": "changeMyString(string)", +"20f4d7aa": "redeemPayout()", +"20f541fa": "purchaseAsQualifiedPartner()", +"20f5a0b9": "readTeamByIndex(uint256)", +"20f5afdf": "OwnershipTransferInitiated(address)", +"20f5e8dd": "resetBalance()", +"20f65816": "extractToken(address,address)", +"20f71018": "Aqo()", +"20f727e2": "Caller(address)", +"20f756bd": "getArmySoldiersCount(uint256)", +"20f801d4": "payout(address,address,uint256)", +"20f86e9f": "_isBonusAvailable()", +"20fa6fd9": "ethSendSameValue(address[],uint256)", +"20fa70b0": "getAvailableWithdrawableCount(address,uint256)", +"20fb2bc2": "AllowClaimBTC(bool)", +"20fb36af": "Test8J()", +"20fb9bad": "LogSortedOffer(uint256)", +"20fc4881": "getCheckpoint(uint256)", +"20fcf2e5": "Castor()", +"20fd8861": "customerWallet()", +"20fea5cf": "getUserTaskAtIndex(uint256)", +"20fee8f1": "_timePer()", +"2100bf7a": "lolaToken()", +"21015328": "getLLV_edit_28()", +"21027354": "buyerHistory(address,uint256,uint256)", +"21029f47": "chickenHunt()", +"2102df31": "_totalDonations()", +"2104c2bb": "fundTeamInstant()", +"2104cdd2": "totalNumberOfScammers()", +"2104d832": "AddHelenium(address,uint256)", +"2104ebf1": "executeWithdraw(uint256)", +"2104fa0b": "skinIdToOwner(uint256)", +"21059e63": "createProposalAndPublish(bytes32,string)", +"2105c049": "setCSO(address)", +"21065f10": "mintInternal(address,address,uint256)", +"21067b3f": "startRoundWithFirstBet(uint256,uint256,uint256,bytes32)", +"210790c8": "signWholeConfiguration()", +"2107a796": "createGame(string,string,uint256,uint256,string,string,string,string,bool,string)", +"2108292e": "mint_(address,uint256)", +"210846ae": "is_kyced(address)", +"21090b31": "_decrementInventory(uint256,uint256)", +"210970c5": "update_count(uint256)", +"2109b408": "bitsMask()", +"2109cf80": "depositEth(address,uint256,bytes)", +"210a6eec": "sendMultipleAddress(address[],uint256[])", +"210a854b": "preIcoTokenHoldersAddresses(uint256)", +"210a8d0e": "changeGranularity(uint256)", +"210ab6af": "numOfJingles()", +"210ae4d5": "setTransferDisabled(uint256,bool)", +"210b7e0b": "tokenAllocation(address,uint256)", +"210ba961": "demurringFeeOwner()", +"210bc472": "ownerTokensMinted()", +"210bd306": "getCurrentHunterLicencePrice()", +"210c1f29": "closeBoard(uint256)", +"210c5a56": "_removeMinter(address)", +"210c5ff6": "getBlockNumber(bytes)", +"210d14b8": "burnPREICOTokens()", +"210d2bba": "PRICE_MULTIPLIER_PREICO2()", +"210dee2f": "setMigrateOut(bool)", +"210e2484": "icoDiscountPercentageLevel3()", +"210e734c": "isBoxItemId(uint256)", +"210e9a34": "getPendingReferals(address)", +"210f5dda": "createToken(string,string,uint8,uint256)", +"210fcbf6": "createPromoCutie(uint256,address)", +"210fd271": "sizeLimit()", +"210fe93b": "catIndexToAddress(uint256)", +"2110273d": "addToShareHoldersProfit(string,string)", +"21105d35": "addressForNonce(uint8)", +"21106109": "finalRate()", +"2110a57c": "User(address,bytes32)", +"2111006f": "create(address,address,bool)", +"21114904": "balanceOfEther(address)", +"2111871c": "endPreICOStage2()", +"2111c0f9": "freezeDeliverMuti(address[],uint256,uint256,uint256,uint256)", +"2111d1e2": "OnUpdateMessage()", +"21129137": "saleover()", +"2112e7fe": "getListGames()", +"2113342d": "totalDividendPoints()", +"2113aab4": "BTL_IMMORTAL()", +"21141c38": "updateInvestorFunds(uint256,uint256,address,uint128)", +"21141de0": "ReturnEthToEthero()", +"2114fd0f": "AxpireToken()", +"2115d328": "getSemiResult(uint256)", +"2115fd55": "RecievedEther(address,uint256)", +"21166476": "ARC()", +"2116b530": "ChangeOwner2(address)", +"21180138": "isCA(address,address)", +"21180722": "init(int256)", +"21187172": "Gate(address)", +"21188011": "maxIssuedWithAmountBasedBonus()", +"2119249f": "getNumTokens(uint256)", +"21194bc0": "devCutPercentage()", +"211a048a": "getFastestSpaceship()", +"211a04db": "totalToDistribute()", +"211a0f39": "ERC20TokenComplete(uint256)", +"211a1ba8": "changeTokenController()", +"211b2758": "changeBlockedTimeForInvestedTokens(uint256)", +"211b4f54": "startUpdate(uint256)", +"211b72a3": "sub1(uint256,uint256)", +"211db50d": "allowNewStakes()", +"211e28b6": "setLocked(bool)", +"211ed6c1": "freeTransfer()", +"211f0b93": "getCreateReputationTokenUniverse()", +"211f0ef9": "SaleOfChametz()", +"211f390e": "ECO_SYSTEM_HOLDER()", +"211feec5": "executeEtherDeltaSell(uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,bytes32,uint256)", +"211ff90c": "SpiceControlled(address)", +"2120e527": "stakingBonus(uint256,uint256,uint256)", +"21217668": "getDrawBlockNumberByWinner(uint256)", +"2121dc75": "isTransferable()", +"212257de": "changeCap(uint256,uint256,uint256)", +"2123015e": "test_insert_findWithHintNextIncreased()", +"2123476b": "startConstitutionPoll(address)", +"21235083": "cancelSubscription(uint256)", +"21241e44": "addressOfTokenUsedAsReward3()", +"21242279": "MintToKen(address,uint256)", +"2125b65b": "transfer(uint32,address,uint224)", +"2126a923": "reverse(address,uint256)", +"2127c30a": "setBlockHash(bytes32)", +"2127fe90": "addOnStage(address,uint256)", +"21288400": "lastPurchaseTick()", +"21289506": "MichaelCoin()", +"2128a580": "total_claim_codes()", +"212954dc": "setAddBonus(uint256,uint256)", +"2129e25a": "finalBalance()", +"212a6fd3": "CloseEntry()", +"212a850c": "showMyNumber()", +"212ac4b5": "UnicornChain()", +"212ac7d1": "mintNewSpinner(uint256,uint256,uint256)", +"212bf316": "setCaps(uint256,uint256)", +"212c3fce": "returnTokensToAirdropper(address)", +"212c5fea": "close(bool)", +"212c8157": "disallowTransfers()", +"212d6723": "payRoyalty()", +"212e2596": "sellOrderTotal()", +"212ebbd6": "addTokenLock(address,uint256,uint256)", +"212f6066": "enableInvestment(address[])", +"21309ae3": "setTimeBonuses(uint256[],uint256[])", +"2131c68c": "daoAddress()", +"2132626f": "_removeByIndex(uint256)", +"21326768": "finishGame(bytes32)", +"213294cd": "crowdsaleHasEnded()", +"2132ce0a": "BASE_AMO_TO_ETH_RATE()", +"2132eb23": "TreasurerToken()", +"21335ad5": "getDepositAggregate(address,uint256)", +"21338d1b": "rewardsWithdrawalProposed()", +"2133ddeb": "settleBetV1(uint256,uint8)", +"2133e3b9": "calculatePercentage(uint256,uint256)", +"213408da": "sendCreatorReward()", +"2134214b": "getPreorders(bytes32)", +"21346edd": "savedBalanceToken()", +"2134927e": "setAuctionParms(uint256,uint256,uint256)", +"21355869": "getAuctionTimeLimits(bytes32)", +"2135810e": "curRequestId()", +"2135d2e4": "lasttokencount()", +"213671bf": "mainSale_TokenCap()", +"213681cd": "getRecord(bytes32)", +"21370942": "updateEthPrice(uint256)", +"21376d07": "scheduledPayout()", +"2139c2aa": "setwinnerLimit(uint8)", +"213a2622": "offerAsSacrificeFromVault()", +"213a72a7": "LightofGalaxy()", +"213ac932": "addUser(address,uint256,uint8,bytes32,bytes32)", +"213ad495": "TimeWeekTwo()", +"213ae9ec": "newGame(uint256,bytes8,uint256,uint256,string)", +"213aedb8": "getAllGames(bool,uint256,uint256)", +"213b9eb8": "setAddr(string,address)", +"213c3375": "callCustomTokenFallback(address,address,uint256,string,bytes)", +"213d6771": "editionData(uint256)", +"213d8f4a": "setCurrentRewardNum(uint256)", +"213db226": "move(address,address,uint8,uint256)", +"213e609f": "getTknOfferAmount(uint256)", +"213e84d3": "maxIssueTokenLimit()", +"213ea6bb": "donationReceiver()", +"213f44ab": "getUserAddressList()", +"213f9ad4": "generateWinners(uint256)", +"213fe044": "getInstanceAddress(address)", +"213fe2b7": "getContracts(address)", +"21420a3d": "_depositTokens(address,uint256)", +"21424e7d": "ETHcollected()", +"2142adc9": "changeMargin(uint256)", +"21435e07": "setTokensWallet(address)", +"2143da91": "GameOfThrones()", +"214405fc": "addToWhitelist(address,uint256)", +"21446cfe": "unitDefense(uint256)", +"2145465a": "SOUNDBOY()", +"2145a455": "getRebackRate()", +"2145e36c": "testBitSetFailIndexOOB()", +"21462191": "bid3(address,uint8[],uint8[])", +"21464e71": "inOneYear()", +"2147783f": "smitToken()", +"21479265": "addToBlackList(address,address)", +"21484786": "notificationFee()", +"21486833": "maxRewardUnitsAvailable()", +"21491e82": "secondCurrentAmount()", +"214958ba": "BLOCKCURRICO()", +"214962d1": "identifierHash(string)", +"21499737": "setIco2Tokens(uint256)", +"2149c619": "functionThree(uint256,uint256,uint256,uint256)", +"214ab314": "searchDiplomaByID(uint256)", +"214af6b9": "acceptTokensFromUsers(address,uint256)", +"214b146f": "storeName(uint256,string)", +"214bb60f": "finalised()", +"214c2a4b": "getServiceURI(address)", +"214c9d50": "WritedrawStatus()", +"214cdb80": "registerInterface(bytes4)", +"214dda84": "regularPhase()", +"214e52ca": "transferAllowed(address,address)", +"214e5f3a": "setForwardUpdateFeesTo(address)", +"214e8a47": "getSingleLocker(address)", +"214f71fe": "tokenFulfillmentDeposit(address[2],uint256,uint256[7],uint8,bytes32[2])", +"2150097f": "timerInfo()", +"2150c518": "getKeys()", +"2150c75d": "newItem(uint256,string,uint256)", +"2150cd56": "setRateAdmin(address)", +"2151f9a0": "TCT(string)", +"21520c5f": "calculatePayout(uint8,bool,uint256)", +"215213dd": "updateTierTokens(uint256,uint256,uint256)", +"2152b483": "OWN_SmartContract_Allowed(address,bool)", +"2152c649": "LOVEYOUToken()", +"2152ebac": "getContributionAmount(uint256)", +"21537caf": "setRequiredBlockQueueTime(uint256)", +"21538acb": "approveCallGas()", +"2153bade": "ZJZJToken()", +"2153bf23": "x3Token()", +"21542702": "MakeBet(address,uint256)", +"215458b0": "salvageNotAllowedTokensSentToContract(address,uint256)", +"2154dc39": "maxMintable()", +"21554dca": "GetCurrentBonusStageTokenBalance()", +"2155af2f": "execute(address,uint256,bytes1[])", +"2156a96c": "getTotalSales()", +"2157320e": "votedAddress()", +"21575889": "distributionSupply()", +"2157ab24": "GetBankerRound(uint8)", +"21592a2b": "YaoMaoCoin(uint256,string,uint8,string)", +"21594110": "createProductionUnit1Beta()", +"215a3bcc": "setStatus(bytes32)", +"215a4862": "eligibleForBonus(uint256,address)", +"215a6ce4": "createBet(uint64,uint256)", +"215ac4be": "fillContract()", +"215ae66d": "mintForWebsites(address[],uint256[])", +"215afc5f": "totalTokenDistribution()", +"215b3e32": "fromBytes(bytes)", +"215b5411": "purchaseCallbackOnAccept(uint256,address[],uint256[])", +"215bad32": "TPTTransfer()", +"215bd303": "createWorkerPool(string,uint256,uint256,uint256,address)", +"215bf604": "addFreelancerFeedback(address,uint256,address,string,uint8)", +"215cb8df": "createIlliquidToken(address,uint256)", +"215cc031": "getAvatarByAddress(address)", +"215d6b61": "getTierOfMember(address)", +"215d902c": "extractString(bytes,uint8,uint256)", +"215de48a": "getParentCount(bytes32)", +"215de791": "getTankName(uint32)", +"215e25ea": "upgradeReferrer()", +"215f1cd1": "oraclizeSetWinner(uint256,uint256)", +"215f865e": "resetDropAddress(address)", +"215fce93": "changeExchangeRate(uint256)", +"216093aa": "getIsThirdPhase()", +"21614f62": "randomSkinAppearance()", +"2161d0e9": "tokensToP3D_(uint256)", +"21627dad": "getCart()", +"2163d49a": "lockedCore()", +"2163ef1a": "GangnamTokene(address,address)", +"216481d6": "icocontract()", +"21650145": "Revoked(bool)", +"2165e1aa": "withdrawRemainingBalanceForManualRecovery()", +"2165fef9": "allocateStrategicTokens()", +"21667940": "issueTokenAndApprove(uint256,address)", +"21670f22": "reward(address,uint256)", +"216716af": "ExoMiniumToken(address,address)", +"21687444": "newDAO(address)", +"2168c988": "transferToInternalLedger(uint256,bytes32)", +"2168ca06": "numberOfIndex()", +"216903f9": "confirmTx(bytes32)", +"216974cc": "refundNonCompliant(address)", +"216986b0": "entradaJugador(uint256)", +"216a5543": "getAllForSaleStatus()", +"216aa0ba": "proposalBlock()", +"216b8c95": "internalIsApprovedForAll(address,address)", +"216be181": "hodls(uint256)", +"216c1606": "_claimExistingCard(uint256,address)", +"216ced43": "setPenaltyDisbursal(address)", +"216d93d6": "pricers(uint256)", +"216de17a": "priceStage1()", +"216e2a97": "totalOrder()", +"216e3449": "changeToken(string,string)", +"216ea239": "miningResolve(uint256,uint256)", +"216ea5ec": "remainder(uint256,uint256)", +"216ec69b": "getColour()", +"216ecfa7": "Tbaol()", +"216ef940": "proxyUpgrade(address,address,bytes)", +"2170ebf7": "makerWithdrawEther(uint256)", +"2171454a": "bountiesKey(uint256)", +"2171526e": "Chewbaka()", +"21717ebf": "siringAuction()", +"2171dc73": "buyXaddr(address,address,uint256,string)", +"2172ac5a": "_requestExistsReverse(address,address)", +"217311ac": "getWords(uint64)", +"21733f6a": "sendDv(string)", +"2173a10f": "INITIAL_POLL_NONCE()", +"21745c15": "numberOfSales()", +"217477f6": "ICO_PERCENTAGE_3()", +"2174b88f": "transferBanker(address)", +"2174dcec": "ConfigPromoter(uint256)", +"21751df9": "BugBountyOne()", +"21752974": "compromiseContract()", +"21765510": "getLockedAvailable(address,string)", +"21765d23": "addLockedTime(address,uint256,uint256,uint256)", +"217720d7": "getHeldCoin(address,address)", +"21774f4b": "CUSTOMER_PERCENTAGE()", +"2177885d": "isOnAuction(uint40)", +"2177a36f": "getCountProof()", +"2178139d": "acceptAbstractToken_(uint256)", +"21795635": "TOTOAirdrop(address,address)", +"217987ad": "delBlackList(address)", +"2179f0f7": "EtherToken()", +"217aab68": "_updateCommission(uint256)", +"217ad35a": "minimalEther()", +"217af162": "whitelistKyberAddress(address)", +"217b97e4": "hatchMaxTime()", +"217bd046": "computePoolAmount()", +"217cab2b": "GetWhitelist(uint256)", +"217d9bbe": "depositExit(uint256,bytes)", +"217db8e8": "toBase(uint256,uint256,bytes8)", +"217f2d23": "CRVToken()", +"217fe6c6": "hasRole(address,string)", +"21815a1a": "updateHolderShareInfo(uint256)", +"21819e5c": "computeArtistTxFee(bytes32,uint256)", +"2181c11f": "batchNewAuctions(uint128[],uint256[],uint256[])", +"2182e6d8": "buy_lovelock(bytes32,string,string,string,uint256)", +"2182ebbf": "use(address,uint256,uint256,uint256,uint256,uint256,string)", +"2182f7b4": "MINIMUM_PURCHASE()", +"2182ff7e": "sellMNC(uint256)", +"21835af6": "__dig(uint256)", +"2183e390": "setTotle(address)", +"21842be3": "unlockTransfers()", +"218444ab": "Test2()", +"21844b08": "drWinChances(uint256)", +"21848580": "lastBlock_a14()", +"2184f977": "TRANSITION_WINDOW()", +"2184fe2c": "transferTechSupport(address)", +"2185072f": "SerpenSegmentCount()", +"21853009": "participantRoundRewarded(address,address,uint256)", +"21856b36": "interestOwed()", +"2185810b": "allowTransfers()", +"21858521": "tickets()", +"2185ca52": "BITRUS()", +"21860a05": "airdrop(address)", +"21861cce": "AUDITED_AND_APPROVED()", +"2187a833": "setGreenToken()", +"2187bdca": "getAllETH(address)", +"2187e6a6": "createHolder(string,address,uint256)", +"21887c3d": "has(address)", +"21895086": "RL(uint256,string,string,bool)", +"218a51e8": "UnFrozenTokenEvent(address,uint256)", +"218a7667": "addToBalances(address,uint256)", +"218a9640": "setTeamStatus(bool,uint256)", +"218bc5ec": "createBid(uint256,address,bytes32,bytes32,uint256,uint256)", +"218bd577": "enterGame()", +"218cd7a1": "POOPOO()", +"218d5637": "realSupplyWeight()", +"218d6ca2": "calcPurchase(uint256,uint256)", +"218d984b": "registryProxy()", +"218dd3dd": "checkIdentity(bytes32)", +"218e4562": "updateBalanceOf(uint256)", +"218e4a15": "getCooldown()", +"218e6877": "setDelegate(bool)", +"218e767d": "TokenFactory(address,address)", +"218eee82": "addAd(uint32,uint32,string,string,uint256)", +"218fbdec": "callWithdraw(address)", +"218fd1c4": "CompanyName()", +"218fe479": "generateRenown()", +"218ffb4c": "Fund(address,bytes32,address,uint256,uint256,address,address,address,address[],address[])", +"21901fa8": "WithdrawFunds(address,uint256)", +"219047f7": "MasternodeRewardSend(uint256)", +"2191207a": "setTAOFactoryAddress(address)", +"21914e29": "day2Start()", +"2191f4a9": "storjPrice()", +"2191f92a": "isInterestRateModel()", +"219285d2": "presaleClosedManually()", +"2192b99d": "mintContributors(address[])", +"219356bc": "GxConstants()", +"21937192": "finishedSTOMinting()", +"21938610": "set0xExchange(address)", +"2193cdba": "send_all()", +"2194f3a2": "fundsWallet()", +"21956036": "SmartRouletteDividend()", +"2195845f": "withdrawAltcoinTokens(address)", +"21958a50": "AddressSeries(address)", +"2196ae0d": "hint(bytes32,string,bytes20)", +"2196feac": "createMarketItem(bytes16,bytes16[],bytes16[],uint256[])", +"2197021b": "proxyVotingContract()", +"21970c0c": "pay_royalty()", +"21974a74": "EtherNetworkConfig()", +"21978e58": "_removeSale(uint256)", +"2197b236": "Goldjunge()", +"21981514": "totalUnclaimedBidsAmount()", +"219862d0": "marketKebabs()", +"2198e780": "addDollarAmount(address,int160)", +"21998504": "setCompte_7(string)", +"2199d5cd": "registerUser(address)", +"219a6ead": "MICRO_DOLLARS_PER_BNTY_PRESALE()", +"219a6f04": "getFounderMember(uint256)", +"219bc76c": "currentRoundInitialized()", +"219c7ad1": "getwinningaddress10()", +"219caaa9": "reclaimChildOwnership(address)", +"219d0ece": "transferAdminship2(address)", +"219da4ac": "ResumeTokenContract()", +"219dabeb": "registerDeposit(address,uint256)", +"219dc688": "technicalPercent()", +"219df7ee": "ZTHTKN()", +"219f5052": "updatePokeMarketAddress(address)", +"219f5b92": "revokeAuthorization(address,address)", +"219f72c9": "startICOStage3()", +"219fd010": "accredited()", +"21a19b2d": "neverdieSigner()", +"21a2ad3a": "nextSlasher()", +"21a2c72d": "BitcoinDublicate()", +"21a32e5c": "VanityCrowdsale(uint256,uint256,address)", +"21a33743": "DroidEIP20Token(uint256)", +"21a33e00": "gasReq()", +"21a389cc": "PRE_SALE_3WEEK_BONUS()", +"21a3fb85": "addValidator(address,bool)", +"21a49ec2": "LCoin()", +"21a4a5bb": "endDateOfSaleStageLast()", +"21a4c6c3": "openMarket(address)", +"21a4cdaf": "HDCToken()", +"21a4d259": "setMinAuditPriceLowerCap(uint256)", +"21a5065e": "returnableTokens(address)", +"21a5c1c3": "buyItem2()", +"21a5dcfe": "multivestBuy(address,uint256)", +"21a638d8": "addTerminal(address,uint256,address)", +"21a6c649": "privatePresaleWallet()", +"21a6c7aa": "megabossCutPercentage()", +"21a78f68": "ref()", +"21a7d652": "EQUIPMENT_REWARD_TOKENS_NUMS()", +"21a80189": "getBalance(address,address,uint256,bytes,uint8,uint256)", +"21a804fc": "SphereToken()", +"21a83738": "getDragonPriceNo(uint256)", +"21a8a771": "setPort(uint16)", +"21a91d2b": "PrcntRate()", +"21a9cf34": "setTradeAddress(address)", +"21aa1706": "startPresaleTrading()", +"21aace42": "setTokenForSP(uint256)", +"21ab13ab": "maxBet(uint256)", +"21ab3074": "transferOwnershipOfStorage(address)", +"21ab561d": "MIN_BID_FRAC_BOT()", +"21ab7fb4": "marketplace_admin_controller()", +"21ab9177": "fixPlayerGraphic(uint256,string)", +"21abf58b": "feesB()", +"21ac01d8": "ClaimedTokens(address,uint256,uint256,uint256)", +"21ac4982": "issue(bytes32,int256,bytes,uint256)", +"21ac5aba": "cityIndexToOwner(uint256)", +"21ac64af": "declareRCV(string)", +"21ac8967": "setPatentFee(uint256)", +"21b12a4b": "clearTransaction()", +"21b133ed": "icoTotalAmount()", +"21b1e5f8": "sendETH(address)", +"21b288d8": "endSecondBonus()", +"21b36a08": "setFee(uint64,uint256)", +"21b43777": "advisorCount()", +"21b48008": "getInvestorsETH(address,address)", +"21b4b3dc": "proposalsCnt()", +"21b55c42": "testConcat()", +"21b5b8dd": "extraBalance()", +"21b68d2b": "DyginoteToken()", +"21b6ac62": "lockGate()", +"21b6c321": "StoreProduct(bytes32,bytes1)", +"21b6fcbf": "SendFund(uint256,bytes32)", +"21b8092e": "setWithdrawalAddress(address)", +"21b8151e": "Mixer()", +"21b8b11e": "_addToDebtRegister(bytes4,uint256)", +"21b8d973": "returnHash(address[2],uint256[8])", +"21b920eb": "upgradeTank(uint32,uint8)", +"21bacf28": "getDefaultFee()", +"21bb79fe": "luckyDogInfo()", +"21bb86ab": "setExchange(uint256,uint256,uint256,uint256)", +"21bc84fd": "canCompose(string,uint256[],address,uint256)", +"21bc9a55": "buyTokens(address,address)", +"21bcc5e5": "multiBatchTransferFrom(uint256[],address[],address[])", +"21bdb26e": "maxPresaleSupply()", +"21bded12": "capitalPctBips()", +"21be2244": "PrivatePlacement(address,address,address,address,address)", +"21be26ed": "deauthorizeContractById(uint256)", +"21beba94": "lastTxBlockNum()", +"21beedf4": "BlocklancerToken()", +"21c0183e": "centralAdmin()", +"21c02472": "numberOfResolutions()", +"21c03a97": "setTradingOpen(bool)", +"21c0b342": "claim(address,address)", +"21c0e95d": "setBountyPool(address)", +"21c17ab8": "unproposeMilestones()", +"21c24081": "GDC(uint256,string,uint8,string)", +"21c26195": "distAirdrop(address,uint256)", +"21c4d650": "priceForBasePart()", +"21c5fb20": "Deposit_double_sum_paid_from_the_balance(uint256)", +"21c60ac6": "div(uint8,uint8)", +"21c60c74": "createMobster(string,uint256,uint256,uint256,string)", +"21c63a47": "getTicketCount()", +"21c6b951": "BetherCryptocurrency()", +"21c6d7b6": "BitbabeToken()", +"21c87627": "getUnlockedPercentage()", +"21c87ee8": "setMaxLevel(uint8)", +"21c882ef": "testGetCaseAtIndex()", +"21c88358": "anyTokenWithdrawal(address,uint256)", +"21c9a6b1": "localCheck(uint256,string,bytes32,bytes32,string,bytes32)", +"21cb1568": "registerArtwork(address,bytes32,uint256,string,string,uint256,address,bool,bool)", +"21cb18cd": "assignVested(address,uint256,uint64,uint64,uint64,bool)", +"21cbed35": "setOperationAttributesByRegulator(string,string,uint256,string)", +"21cda790": "tokensOwned(address)", +"21cdb03c": "shopShield()", +"21cde824": "fighterIndexToTeam(uint256)", +"21ce14a9": "injectTokens(address,uint256)", +"21cefec0": "tokenBuyRate()", +"21cf3514": "priceStalePeriod()", +"21cf5132": "setManualBonus(uint256,bool)", +"21cf59ac": "mintInternal(uint256,int256)", +"21cf9f22": "updPool(int8,uint256)", +"21d148ab": "weiForXau()", +"21d1a303": "checkRemained(uint256)", +"21d1b7a4": "TJ2()", +"21d269dc": "fastCashBank()", +"21d2daa0": "unFreezeToken(uint256)", +"21d3523c": "voteToHarvestFund()", +"21d36529": "feePercentage(uint256)", +"21d365af": "_processVestingRules(address,address)", +"21d376ce": "tokensOfOwner(bytes32)", +"21d3d2ee": "isMigrationFinished()", +"21d41bc2": "IRobo()", +"21d45bec": "getReverseFee(address,uint256)", +"21d4b08c": "numTicksTillAuctionStart(uint256)", +"21d50273": "createParty()", +"21d53fb9": "withdrawLockupTokens()", +"21d5c0f6": "finalizeAgent()", +"21d5cb51": "verifiedUser(bytes32)", +"21d65d80": "blockPart(uint64,uint64,uint64)", +"21d67daa": "internalFinishMinting()", +"21d6cdb6": "newPeriod(uint256)", +"21d739f1": "TokensIssued(address,uint256)", +"21d7bdff": "startCountDown()", +"21d800ec": "relayedMessages(bytes32)", +"21d80111": "getHero(uint256)", +"21d8ad4c": "getContractName(uint256)", +"21d9d5ba": "testRemoveLocked()", +"21da1719": "impl_unlock4Circulate(address,uint256)", +"21da94e7": "getSEScore()", +"21daae34": "getQuoteToBaseReturn(uint256)", +"21daf0f8": "TransferToReferrer(address,address,uint256,uint256,uint256)", +"21db06bc": "wolf4Balance()", +"21db087e": "getLevelCitizenById(uint256,uint256)", +"21db0f0d": "getImmortalsOnTheBattlefield(address)", +"21db2aa0": "getArtwork(uint32)", +"21dc04f4": "Vibranium()", +"21dc512e": "replaceSSPRegistry(address)", +"21dc74fa": "addWhiteLister(address,address)", +"21dcbbae": "HighJackpotHolder()", +"21de6b01": "setKtcAddress(address,bool)", +"21de861a": "narrowCyclePrizeView()", +"21df0da7": "getToken()", +"21df2ea5": "getNewInstance(address)", +"21df8b9b": "addTotalBondValue(uint256,uint256)", +"21e01596": "logCall(uint256,uint256,uint256)", +"21e0f228": "winningNumbers()", +"21e2933a": "setBasicIncomeLimit(uint256)", +"21e38e81": "ownerCheck()", +"21e3cdd0": "voteDn(uint256)", +"21e5383a": "addBalance(address,uint256)", +"21e53d77": "_buyTokens(address,address)", +"21e5d0e4": "PRESALE_START_WEEK2()", +"21e5e2c4": "shareOf(address)", +"21e69b42": "dataMerkle(bytes32[],uint256,uint256)", +"21e6b53d": "transferTokenOwnership(address)", +"21e76826": "Gamblr()", +"21e866be": "getCompanyCreationCost()", +"21e88888": "setColor8(uint256,uint8)", +"21e92d49": "transferByOwner(address,uint256)", +"21e96b88": "setProxyManagementCurator(address)", +"21e9b296": "ExtractedTokens(address,address,uint256)", +"21ea2b8d": "delayOfICOEND()", +"21ec0129": "HAUZ()", +"21ec5981": "Jekyll_Island_Inc()", +"21ed0f64": "removeEmployee(uint256)", +"21ed46ad": "Dollars()", +"21ed47b3": "annualPos()", +"21edbe24": "pricesAndInventoriesOfDate(uint256,uint256,uint256[],uint256)", +"21ee102b": "removeExtension(address)", +"21ee6457": "set_sale_arbits_total(uint256)", +"21eeb9a7": "LogSaleCapReached(uint256,uint256)", +"21ef10f0": "revokeSelf()", +"21ef8368": "DataSentToAnotherContract(address,address,bytes)", +"21eff7fc": "getContribution(address)", +"21f032d3": "BitDAOToken()", +"21f0a727": "node_right_child(uint256)", +"21f0b382": "unblockClient(address)", +"21f118a6": "createByCOO(string,uint256,uint256)", +"21f1a18c": "battleRemove(uint256)", +"21f1b677": "updateTime(uint256,uint256)", +"21f222dd": "minWeiAmount()", +"21f2a9a9": "_getUnlockedTokensPercentage()", +"21f2ca3b": "unregisterUser(address)", +"21f2ed2e": "dividendDistributionEndTime()", +"21f35609": "CAT_FIRST()", +"21f38c6e": "bundlingEnabled()", +"21f3f338": "proposalCensorshipFee()", +"21f3ff41": "maxMultiRolls()", +"21f408be": "tk()", +"21f4911a": "addFiveParticipants(address,address,address,address,address)", +"21f4d29f": "getPoolHistory(uint256)", +"21f610d3": "endEarlyStage3()", +"21f6b513": "Airdropper(address,uint256)", +"21f72d82": "YODCToken()", +"21f7ac0d": "codeExportCost()", +"21f8a721": "getAddress(bytes32)", +"21f8dab6": "THRESHOLD4()", +"21f9a878": "NewHashnodeTestCoin()", +"21f9caef": "cancelOrder(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32,address)", +"21fa1730": "Ballot(string,string,string,uint256,address[],uint256[],uint256[])", +"21faf403": "getStatusLogCount()", +"21fb39d4": "WithdrawEvent(address,address,bool,uint256,uint256)", +"21fb9869": "getAdminLog(uint256)", +"21fc2cd1": "NounToken()", +"21fda809": "payment(address,address,uint256,address)", +"2200919f": "addVersion(string,address)", +"22009af6": "BASE_REWARD()", +"2200cdec": "finishPVE(uint256)", +"22017c5f": "DSTokenBase(uint256)", +"2202dcad": "FACTOR_7()", +"22039f89": "isServiceContract(address)", +"2203ab56": "ABI(bytes32,uint256)", +"2204ef4b": "getMeTokens(uint256)", +"22054fe0": "updInvestorEnabled(address,bool)", +"22057bc7": "getAllRevisionBlockNumbers(bytes20)", +"2206e837": "undisapprove(uint256)", +"220772a9": "starUpZero(uint256,uint256,uint256)", +"2207a93a": "etherInUSD()", +"22081c12": "processPayment()", +"22082c72": "getDoneSelfDropAmount(address)", +"2208ee1d": "_releaseTime()", +"2209e991": "sendBet(address,uint256)", +"220a0e36": "LoggedERC20(uint256,string,uint8,string,bool,bool)", +"220a2247": "givePermission(address,string)", +"220b4a73": "TCPC()", +"220c166c": "hatchingSpeed()", +"220c773a": "changeMarketingRecipient(address)", +"220d5d8d": "YioCoin()", +"220d7a7f": "NoteToken(uint256)", +"220d8707": "BONUS_DAY3_DURATION()", +"220d9944": "MailHustleCrowdsale()", +"220e44d0": "_buy(uint256,uint256,address)", +"220e5d06": "qshdrop(address[],uint256[])", +"220e693f": "ALLOC_ADVISORS()", +"220eb9b6": "run(uint256,bytes)", +"220ee9ec": "purchase_dates(address)", +"220eeab4": "BonumPreSale(uint256,uint256,address,address,uint256)", +"220f1202": "lowestAskAddress()", +"220f1aee": "createVoting(string,string,uint256,bytes32,address)", +"220f52c5": "whoIsTheOwner()", +"220f9dfd": "getFighterInfo(uint32,uint32)", +"220fde2e": "setSellPrice(uint16,uint256)", +"221067a1": "JULIAN_ALLOCATION()", +"221086af": "buyerBonus()", +"2210d525": "getRareAddress()", +"2210e0f7": "MassPay()", +"2211218a": "ARMtest()", +"2211944a": "ActiveAdmin()", +"2211ae76": "canReceive(address,address,uint256,bytes)", +"2211c3b3": "eraseContribution(address)", +"22122cb3": "blockTokenFunds(address,uint256)", +"2212dbc3": "get_timestamp()", +"22132598": "numArtworks()", +"221353ca": "finalizeByAdmin()", +"22137935": "productsExported()", +"2213c7db": "tokenPreSaleRate()", +"2214f65d": "toWei(address,address,uint256)", +"221538f4": "BurnupHoldingCore(address,address)", +"22156bb2": "WerderCoin(uint256,string,uint8,string)", +"22159d89": "ticketsOwned(uint256)", +"2215fc82": "getONETIMESOLD()", +"2216573d": "internalIncreaseGoldKeyCounter(uint256)", +"22169ab3": "START_PRESALE_TIMESTAMP()", +"22174ebf": "TokenSBT()", +"2217bf78": "getReputationRewards(address,address,bytes32)", +"2219a95b": "DWBTPreICO(address,address,uint256,uint256,uint256,uint256)", +"221a66d9": "presaleFee()", +"221ab8e2": "setBlockResult(uint64,uint64,bytes32)", +"221b1c4a": "_NumOfStudentsPass()", +"221b30df": "btcPurchase(address,uint256)", +"221b5ec2": "setTimeBegin(uint256)", +"221b5fad": "getCardsCount()", +"221b850c": "changeInstallerEscrowAddress(address,string,address)", +"221d4dff": "create(string,uint256,string,string,uint8)", +"221e5da9": "GetContractStateEarlyTerminatedByTenant()", +"221e9370": "recordedCoinSupplyForRound(uint256)", +"221ed3cc": "CONSTELLATION()", +"221ed748": "shareCycle()", +"221ef94d": "userMigration(uint256)", +"222101d1": "vestingMappingSize()", +"222160c0": "isProposalExecutable(bytes32,uint256,address,bytes)", +"2221fb3e": "hasActiveBet()", +"22230fc4": "countFishAtBase()", +"22239e8e": "loanActivation()", +"2223a5da": "reserveCap()", +"2224044c": "calcWeiForTokensAmount(uint256)", +"22242382": "checkPriceAmount(uint256)", +"22245b64": "MAXCAP_TOKENS_ICO()", +"22246200": "deleteElementWithValue(uint256)", +"22250809": "BoardClaimed(uint256,uint256,address)", +"222594c5": "findModuleNameByAddress(address)", +"2226549e": "fixedLog2(uint256)", +"22284872": "Escrow(address)", +"22287914": "icoWallet()", +"2228c895": "getWinningRate(uint256)", +"2229d348": "attackMonster(uint256)", +"222a5343": "BOWTERC20()", +"222a95ee": "LastMsg()", +"222af991": "stringToUint(int256,string)", +"222b0d7d": "massRevoke(address[])", +"222b8947": "depositTokens(bytes32,uint256)", +"222c1390": "maxPublicSaleStage()", +"222cfe94": "myEtherBrosCount(address)", +"222d777a": "createEvent(string,uint256,uint8,uint256,uint256,uint64)", +"222d7e34": "currentRoundStart()", +"222f51e9": "getDailyHash()", +"222f5be0": "transferInternal(address,address,uint256)", +"22305fb7": "ShowSegmentation(address,uint256,uint256)", +"2231454f": "updateCampaignManagerContract(address,string)", +"223162e7": "WithdrawSharedExpense(address,address,uint256,uint256)", +"2231f72c": "setownership(uint16,uint16)", +"223208af": "walletName(address)", +"22326584": "WBE()", +"2233db62": "InvestorRegistry()", +"2233dbf4": "wantNewMinter(address)", +"22347d5b": "confirmTrade(address,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"22351b6b": "VibeToken()", +"22366844": "isRegistered()", +"223699c1": "units30percentExtra()", +"22372795": "HIT()", +"2237d55c": "setTargetDiscountValue1(uint256)", +"22384945": "checkPresaleBalance()", +"22393ef4": "bundleFirstTokens(address,uint256,uint256[])", +"223964bc": "queryAccounts(address)", +"2239c48a": "startUpgrade()", +"2239d43b": "uintMinimalSize(uint256)", +"2239e688": "getUrlFromKey(bytes32)", +"223a6399": "newAssociate(address)", +"223ab941": "transferForProjectTeam(address,uint256)", +"223b01db": "decimalsETHToUSD()", +"223b530e": "antiques()", +"223c217b": "withdrawTokenTo(address,address,uint256)", +"223c5939": "UnilotBonusTailToken(address)", +"223cd20e": "shareHolderByAddress(address)", +"223d0417": "viewUnpaidRewards(address)", +"223dad70": "sendMsgSndr(address,address)", +"223db315": "allow_refunds()", +"223dcc74": "left14(uint256)", +"223e5a9d": "pls()", +"223e8eff": "etherPriceAuditor(address)", +"223e97be": "setParent(uint256,uint256)", +"223e9f17": "_redeemSameClassAdoptedAxies(address,uint8,uint256)", +"223fcbc9": "_locked()", +"223ff4cc": "getShipsIds()", +"224076d4": "pegIsSetup()", +"22408401": "ArtSale(address,address,uint256,uint256,uint256,uint256,uint8,uint256)", +"2240b645": "GetClientCategory(address)", +"22412ded": "MyProducts(address,uint256)", +"2241a733": "GOLD_AMOUNT_XPER()", +"22425fa4": "feePeriodDuration()", +"22427047": "Payout(uint256)", +"22429085": "updateFees(uint256,uint256,uint256)", +"2242cf7f": "getConBal()", +"22434836": "setTimes(uint256,uint256)", +"2243fb15": "getHashratePerDay(address)", +"22446093": "editPerson(address,address,string,uint256)", +"2245675f": "setCustomerSignature(address,uint256)", +"22471e16": "identityApproved(address)", +"2247328c": "vote01YesCount()", +"224846de": "deletePaymentContract(uint8)", +"224854f7": "Trie()", +"224993c2": "setTimeBlock(uint256)", +"224a1775": "transferByOwner(address,uint256,uint256)", +"224a6ac3": "nextPE()", +"224a8174": "TESTER()", +"224a967c": "CTSCoin()", +"224b4bfd": "TYCOONCoin(uint256,string,string)", +"224b5c72": "consume(address,uint256)", +"224bed07": "transferIndexed(address,uint256)", +"224c1a21": "getMyEthBalance(address)", +"224c1c9b": "getNonVestedBalanceOf(address)", +"224c4657": "createOrder(address[3],uint256[3])", +"224ccc49": "chainLastMessageHash(bytes32)", +"224d5d54": "wylouToken()", +"224dc278": "dis()", +"224e5efd": "DNACoin(address,address)", +"224e7462": "removeToken(bytes32)", +"224f127d": "LogNewWhitelistedAddress(address,address,uint8)", +"224f143a": "setme()", +"22500af0": "OwnershipTransfer(address,address)", +"22518a75": "getVotersCandidateVote()", +"2251a8a9": "isSubscribed(address,address,string)", +"22526635": "payOut(uint256,uint8,uint256)", +"22529fff": "getReferral(address,address)", +"2252d5c1": "exemptMeFromFees()", +"225386fe": "SimpleERC20()", +"2253fff1": "initialCongress(address)", +"22542fb6": "collectTokenPhaseStartTime()", +"225435c0": "detach()", +"22547931": "registerOperation(uint256,string)", +"22551da7": "double(address,bytes32,uint8,uint256)", +"22554f34": "getT()", +"22555bea": "UNITv2(address)", +"22556bd7": "createRound(string,bytes32[],uint256)", +"2255ad10": "RefugeCoin()", +"225640ab": "getOrCreatePreviousFeeWindow()", +"225682d1": "test_contractBalance()", +"2257406e": "getMemory(uint256)", +"2257defa": "removeCustomerFromBL(address,address)", +"2259315d": "TokenFactoryCN()", +"22593300": "Small(address)", +"2259d221": "LifeSet_005()", +"225a1d46": "PODH()", +"225a905f": "NewSubscription(address,address,uint256,uint256)", +"225b6574": "hasBase(address,uint64)", +"225c4011": "cyberEntry(address)", +"225c5567": "withdrawLeftTokens()", +"225ce00f": "_createAuction(uint256,string)", +"225cf990": "setAgriChainContext(address)", +"225cfd59": "addPromille(uint256,uint256)", +"225da7e5": "transferManagerFactory()", +"225f406a": "buyInSaturday()", +"225f9d7d": "stopIt()", +"225fce8d": "getGameByPlayer(address)", +"22609373": "calculateEthereumReceived(uint256)", +"2260b98b": "finalizeVoting()", +"226187dc": "maxPreICOTokenAmount()", +"2261b07f": "getConverter()", +"2261c6d9": "AllowedAddressAdded(address)", +"2262cd94": "wroom()", +"22636e65": "setContractValue(address,string,uint256)", +"2263ae04": "POHD31()", +"2263e8b7": "routingCodes(uint256)", +"2263f2c5": "createTokens1()", +"22643a47": "JokerCoin()", +"226454c1": "getGoldDataDocumentation()", +"22657697": "priceForStage(uint256)", +"2265931d": "transferToken(address,uint256,uint8)", +"2265a94b": "ValyutaTestCoin()", +"22665bc9": "setICO(address,uint256)", +"22666da6": "makeGuess(uint256)", +"226685ee": "Visit()", +"22673030": "SALE_START()", +"2267b2e3": "veredictum()", +"2267b30d": "removeFounder(address)", +"22686250": "index(int256,uint256)", +"2268a358": "changeMultisig(address)", +"226942e6": "RollEvent(address,uint256,uint256,uint256,uint256)", +"2269d2ec": "addNewPotatoCoinsForSale(uint256)", +"2269f1c9": "voteA(uint256)", +"226ac321": "updateTokenRate(address,uint256)", +"226bf449": "addPackage(string,address)", +"226d2f86": "keyEmployeeAllocation()", +"226dd769": "howManyEtherInWeiToChangeSymbolName()", +"226e2b91": "setPaycarnita(uint256)", +"226e2d10": "manual()", +"226ee47c": "set_validator(address)", +"227185d6": "Send1Get2()", +"2272b0af": "csoAddress()", +"2272df67": "changeFounderAddress(address)", +"2272f879": "walletThree()", +"227326b1": "proposalPassed()", +"22734c0c": "createRawDeposit(address,uint256,uint256,uint256)", +"22742564": "quickConvertPrioritized(address[],uint256,uint256,uint256,uint8,bytes32,bytes32)", +"2274346b": "vaultContract()", +"22758a4a": "whitelister()", +"22760877": "getCurrentHeroOwners()", +"22763ae1": "stopInEmergency()", +"22766696": "bidEnd(uint256)", +"2276774c": "finalizeRemainders()", +"2277466b": "voteToClose()", +"22776478": "getDistrict(uint256)", +"2279295d": "resetPhoenixes()", +"22798c10": "MANHATTANPROXYACPBLVD()", +"2279fa4c": "numPayments()", +"227a7911": "etherGetBase()", +"227ac0cf": "GetPerSellInfo(uint16)", +"227ada37": "placeBet(uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"227bf6b8": "ethorseOracle(address,bytes32,string,bool)", +"227c74a7": "giveEntity(uint256,address)", +"227cade5": "maximumBet()", +"227d111e": "GetExistsCardList()", +"227d3fb4": "checkTxProof(bytes,uint256,bytes,bytes)", +"227d535f": "Wolk()", +"227dd788": "isFinal(bytes32[])", +"227e14e9": "currentDateTime()", +"227e26c4": "deleteChild(uint256)", +"227f592c": "TIXGeneration(address,address,address,address,address,uint256,uint256)", +"227f9633": "addOption(string,address,uint256)", +"227fb30b": "MosaiCoinContract()", +"227fda27": "BitcoinSamaritan()", +"2281411b": "allocateAndFreeze(address,uint256)", +"22817359": "_transferTokenToOwner()", +"22824bbd": "checkFind(address,address)", +"2282d9f2": "transferIsEnabled()", +"22848a0c": "TCTToken(uint256,string,string)", +"2284a6fa": "interest(uint8,bool,uint8)", +"2284b051": "gameRandon1()", +"2284e8fe": "push_or_update_key(uint256)", +"22855bf0": "CheckBest(uint256,address,address)", +"22855ef9": "registerTransfer(address,address,uint256)", +"22867d78": "repay(address,uint256)", +"2286b46b": "stakePathIDToAccountAndSubcourtID(bytes32)", +"2286b7de": "BONUS_ICO_STAGE1_PRE_SALE2()", +"2287d2ec": "donealready(uint256,address,bool)", +"2287dad2": "getTicketByHolderId(bytes32)", +"2287e96a": "withdrawEnabled()", +"2288193b": "testFundACampaign()", +"22888f35": "depositPremium(address[2],uint256[7],uint8,bytes32[2])", +"2288fad6": "earlyPurchases(uint256)", +"2289115b": "createPlanet(string,uint256)", +"228acf2f": "tokenTeam()", +"228b70d3": "registerNewPubKeyForHash(string,string)", +"228b7bf8": "Vasacoin()", +"228bbf45": "getItemsForSale(uint256,uint256)", +"228bff5a": "secToDays(uint256)", +"228c2df1": "hodl(address,uint256,uint256,uint256)", +"228c790c": "RudysToken()", +"228cb733": "reward()", +"228cc2aa": "maxQuanValues()", +"228ce144": "getKingdomType(string)", +"228d2820": "disableConversions(bool)", +"228d477f": "tokTakers(uint256,address)", +"228dff13": "setPepeName(uint256,bytes32)", +"228e41bd": "getdeptcount(uint256,address)", +"228e554a": "_refundBond(uint256,address)", +"228e892e": "icoStages(uint256)", +"228e92cf": "YuanLianToken()", +"229063fc": "discoveryCooldown(uint256)", +"2290d6e2": "entryFee_()", +"2290db50": "buyEnergy(address,address,uint256)", +"2290e106": "mintBuyerToken(address,uint256)", +"22923160": "updateWithdrawals(address,address,uint256,uint256)", +"229233b6": "FOR_FOUNDER()", +"22928b4d": "isIpoPeriodOver()", +"22928d6b": "removeUser(address,address)", +"22935caa": "setInitialAllocationUnlock(address)", +"22937ea9": "returnInt256(int256)", +"229460e7": "AdminstratorRemoved(address)", +"2294795d": "deuseth()", +"22949fb1": "TicketBought(address)", +"2294c48a": "initUsers()", +"2295115b": "adminWithdraw(address,uint256,address,uint256,uint8,bytes32,bytes32,uint256)", +"2295ee5b": "updateTokenBaseURI(string)", +"22968885": "getBalanceOfContract()", +"22969eac": "changeAuth(address)", +"22978e57": "unlockedAfter()", +"229824c4": "calculateTrade(uint256,uint256,uint256)", +"2298b9ce": "icoOver1()", +"229906b3": "updateStringSetting(uint256,string,address,string,string)", +"2299219d": "unlockTemporary(bytes32,address,bytes)", +"229a336b": "BodyMassIndex()", +"229a4978": "batFund()", +"229b04bf": "pauseMode()", +"229b5223": "weiScale()", +"229b9bc5": "buildingToUnitCount(uint256)", +"229cfc32": "calculateViralRewards(uint256)", +"229ddd9a": "foreignBuy(address,uint256,string)", +"229df5c6": "getSig(bytes)", +"229e0b16": "updateLoanAsLender(bytes32,uint256,uint256,uint256)", +"229eb105": "payaFinished()", +"229f3e29": "presaleEnd()", +"229f4caf": "minBetPrice()", +"22a036dd": "ico2Bonus()", +"22a15848": "btcOracle()", +"22a1ec8f": "setSomething(address[])", +"22a27f3b": "getDeveloperAddress()", +"22a3eab5": "withdrawn_balances(bytes32)", +"22a4381d": "fromTokenDecimals(uint256)", +"22a47143": "Tokensale(address,address)", +"22a4993c": "getReferedCount(address)", +"22a635c4": "Hodl(address)", +"22a7118d": "buyTokensFor(uint256,address,uint256,bool)", +"22a7533b": "deathData_a19()", +"22a7906f": "getOwnedPointAtIndex(address,uint256)", +"22a7ac34": "rake()", +"22a7ba2b": "totalSupplyCrowdsale()", +"22a8fb18": "freezelvlAccount(address,bool)", +"22a90082": "setInterval(uint256)", +"22a92c45": "sendTokensToHold()", +"22a993ca": "getKun()", +"22aa7196": "refund_window_end_block()", +"22aab53a": "temperatureRange()", +"22aacad5": "incCounter()", +"22aaea91": "setCurrentAuctionId(uint256)", +"22ab9433": "getPrecomputedEToTheHalfToThe(uint256)", +"22abb147": "ResolutionAdded(address,uint256,string,string)", +"22ac5f40": "fulfillEscrow()", +"22ad3b76": "fiatFee()", +"22ae634f": "getInvestment(uint256)", +"22aef13c": "requestChangeRequirement(uint256,string)", +"22af00fa": "bets(uint256)", +"22af1b27": "UnpackAccessDChain(bytes)", +"22af47e3": "tokensIssuedAir()", +"22b01343": "initializeAssetsToThisApplication()", +"22b05ed2": "getStatus(string)", +"22b08180": "purchaseVideoGame(uint256)", +"22b0e99a": "EARTHToken()", +"22b0f6ee": "getStatusOfPayout(uint256)", +"22b11169": "setWalletOwnerAddress(address,address)", +"22b152a3": "liquidateLosing()", +"22b19192": "imAlive()", +"22b1a226": "withdrawPaymentsRegistrar(address,uint256)", +"22b1f39c": "currentInvoice()", +"22b263b2": "nextPlayerID()", +"22b2678a": "hasBalance(address)", +"22b28aa4": "resetTimes(uint256,uint256)", +"22b2ea22": "registerHWCDep(string)", +"22b2f178": "minimumDifficultyThresholdWei()", +"22b36d88": "stopTde(bool)", +"22b45ddc": "EarlyBackerDeposit(address,uint256)", +"22b4891d": "capICO()", +"22b524fe": "getFreelancer(address,uint256)", +"22b53192": "arr(bytes32)", +"22b53b4b": "accruedLiq(address)", +"22b6fe9e": "getAgreementSetCount()", +"22b6ffca": "isSignedUp(address)", +"22b79623": "resetEpocum(address)", +"22b87601": "testRemovePending()", +"22b930f7": "VESTING_1_DATE()", +"22b954f8": "poolFeeRate()", +"22b96b63": "getIPFSHash(address,bytes32)", +"22b9b712": "BETTING_OPENS()", +"22b9bd35": "adjustPrizePoolAfterWin(uint256,uint256)", +"22bac568": "grantAdditionalShares(address,uint256)", +"22bae392": "setBenecifiary(address)", +"22bb06d8": "marketting()", +"22bb4f53": "retentionMax()", +"22bbad0b": "instruments(uint256)", +"22bc0d6c": "appendEncryptedBid(bytes32,uint256)", +"22bc3b8e": "getArgument(uint256)", +"22bc98b1": "basicPresaleRate()", +"22bcabcd": "TOKENS_ACCELERATOR()", +"22bd6d3f": "hired()", +"22bdf293": "grantVestedEDEX(address,uint256)", +"22be9342": "resolve(uint256,uint256,bool)", +"22beb9b9": "scheduleDoIt(uint256)", +"22bf1a2a": "addrLockUp()", +"22bf2e24": "ROLE_STAFF()", +"22bf9d7c": "slashTranscoder(address,address,uint256,uint256)", +"22bfba59": "drawRandomUnitWinner()", +"22bfdcbb": "RaffleStrangeLoop(bytes32)", +"22c07ad3": "indFutureDeposit()", +"22c1d0d2": "_withdrawAmount(address,uint256)", +"22c21e6c": "ZHIHUIGUO()", +"22c25c50": "Addr7()", +"22c25d8f": "set_presale_arbits_total(address,uint256)", +"22c2b9eb": "MakeOver(address)", +"22c30931": "calculateStep(uint256)", +"22c4d98f": "hasAllowanceToRecieveTokens(address)", +"22c4f168": "setTransferFeeProp(uint256)", +"22c51659": "getWhitelistedZone(address)", +"22c5b279": "addLayer(address,uint256,bytes32)", +"22c61e73": "createContractPoo(string)", +"22c66ae7": "decimal_precission_difference_factor()", +"22c69b15": "tradeDAI(uint256,uint256)", +"22c6aad9": "pigcoin(uint256,string,string)", +"22c6ae15": "mul(uint64,uint64)", +"22c83245": "clearBlackAccount(address)", +"22c8c2cc": "setEtherPriceAuditor(address,bool)", +"22c9427e": "recycleDividend(uint256)", +"22cacd6b": "setUSDBtc(uint256)", +"22cb1ec8": "teamTokensMinted()", +"22ccd000": "Blocksale(uint256,string,uint8,string)", +"22cd5ea8": "claimBet(bytes32)", +"22ce1f8f": "VixcoreToken2(uint256,string,string)", +"22ce61b2": "globalMetSupply()", +"22ce9bac": "numberOfVotesCast()", +"22ced0bd": "BTrustToken()", +"22cf1745": "USTToken(address,string,string,uint8)", +"22cf5011": "privilegedTransfer(address,uint256,bytes)", +"22cf981d": "proposeMintLocked(address,uint256)", +"22cfadc7": "isFundingNow()", +"22d0d31f": "OD1Coin(uint256)", +"22d122a9": "MyTestWallet7()", +"22d1bd32": "currentlyActive(bool)", +"22d2cfac": "getNextElement(uint256)", +"22d310f9": "setMarket2(address)", +"22d34212": "get_eth()", +"22d40b96": "defcon()", +"22d4e0fd": "pay2(address,uint256,address)", +"22d60d17": "tokensPerWei()", +"22d6eb87": "getInfo2(address,address,uint256)", +"22d7642e": "getScene(uint256)", +"22d85334": "isValidBicoinAddressPrefix(bytes)", +"22d8c8a8": "AddMaterial(address,uint256,uint256)", +"22d8cf5b": "CheckUserVote(uint8,uint8)", +"22d9f13e": "changeCUSD(address)", +"22da10b0": "checkPermissions(address)", +"22da3368": "IoMTToken()", +"22da5d04": "tokenCreationMaxPreICO()", +"22db2f7b": "processOffchainPayment(address,uint256)", +"22db4143": "BONUS_THRESHOLD()", +"22db61ab": "setunitDefenseMultiplier(address,address,uint256,uint256,bool)", +"22dbaf75": "test_oneInvalidEqBytes32()", +"22dbd0e4": "payComisionSponsor(address)", +"22dbf6d2": "reserveFeeToWallet(address,address)", +"22dc36e2": "processed(uint64)", +"22dc5a85": "ERC20address()", +"22dc8e71": "setIV_R1(uint256)", +"22dce86c": "getEscuelas()", +"22dd0d2c": "TEAM_KEEPING()", +"22dd9b8c": "templateSupply()", +"22ddde5b": "getLRCAmount(address)", +"22dde4cd": "secToNextMiningInterval()", +"22de2457": "clientVerifyKeyHash(bytes32,bytes32,bytes32,bytes32)", +"22df1caf": "grantPresaleTokens(address[],uint256[])", +"22e01192": "setPrice(string,uint256)", +"22e02b22": "ClaimEth()", +"22e113a3": "freezeTokens(address,bool,uint256)", +"22e12720": "MAX_HOLDERS()", +"22e256e2": "Addr5()", +"22e2b31f": "unlockAmount(address,uint256)", +"22e37189": "tklosses()", +"22e3989b": "multNumerator()", +"22e412ce": "strikePut()", +"22e465ee": "tolerantSub(uint256,uint256)", +"22e58557": "getFreeEggs()", +"22e5aa3a": "totalProportion()", +"22e5d0fa": "CoCoToken()", +"22e62038": "close_bank()", +"22e63356": "setValueAgent(address)", +"22e67e71": "maxTime()", +"22e6f1d0": "giveGoldenTicket(address)", +"22e77ff3": "plz(address)", +"22e78480": "getGoldDataSku()", +"22e803c2": "transferBounty()", +"22e84682": "isValidContributorAddress(address,address)", +"22e8571d": "legalsAddress()", +"22e8c87d": "getUserData()", +"22e8c8fc": "gamble(uint256,uint256)", +"22e8df23": "ICO_MINIMUM_CONTRIBUTION()", +"22e91248": "getLeaf(uint256)", +"22e95f6c": "payout_normalizer()", +"22e9afca": "cofoundersSupplyVestingTranches()", +"22ea2231": "purchaseTokens(address,uint256)", +"22ea2d96": "getBookInfo()", +"22eb2c02": "viewPreSaleRefunds(address)", +"22ebb3ac": "DieselPricePeg()", +"22ebc4a0": "fpartSigned(int256)", +"22ec1244": "shaBid(bytes32,address,uint256,bytes32)", +"22ed6302": "setCrowdsale(address,uint256)", +"22ed96a0": "getInvestorsFee()", +"22ee1db4": "uint32At(uint32,bytes,uint256)", +"22ee46db": "VapeToken()", +"22ef83ef": "AuthInit(address)", +"22efee2d": "get_participant_num_of_pro_rata_tokens_alloted(address)", +"22f06ae4": "isRecoverer(address)", +"22f0e6ae": "MarketingMethodAddress()", +"22f0f2f9": "unlockContract()", +"22f16c8d": "checkDividends(address)", +"22f256f8": "buyIOD()", +"22f2f89a": "allOperationsCount()", +"22f3e2d4": "isActive()", +"22f43bb5": "seedGame()", +"22f4596f": "_maxSupply()", +"22f48627": "SIACASHCOIN()", +"22f4afb5": "relayKingContract()", +"22f4e916": "GdprCrowdsale(uint256,uint256,address)", +"22f607f6": "Escrow()", +"22f6af6e": "TokensBought(address,uint256,uint256,uint256)", +"22f6fa7a": "contractorTransfer_Bcoupon(address,uint256)", +"22f709dd": "getEther(address,address)", +"22f77d2a": "Refundable()", +"22f7be85": "setFlight(uint16,uint16,uint256,uint256)", +"22f7d1f8": "normalFunc()", +"22f85eaa": "buyOrder(uint256)", +"22f872a7": "allocateBounty()", +"22f8a2b8": "getDayOfWeek(uint256)", +"22f905ec": "GetPartNum(uint8)", +"22f93f16": "updatingViaOracle(string)", +"22fa1ff4": "MAX_PROMO_GIRLS()", +"22fa85ca": "testFailRegisterContractAgain()", +"22faa5db": "removeURL(string,uint256)", +"22faf03a": "setInstructor(string,uint256)", +"22fb5303": "_transferFromWithReference(address,address,uint256,string,address)", +"22fb71f1": "getGoldStatusVendorverify(address)", +"22fb730b": "claimerOfTwitterId(uint256)", +"22fbde38": "qtdePokemons(address)", +"22fbf1e8": "addDeveloper(address)", +"22fc3149": "setWhitelistThresholdBalanceInternal(uint256)", +"22fec5e7": "VEToken()", +"22fefe31": "devuelvePuntuaciones(bytes32)", +"22ff1110": "CancelSellOrder(bytes32,address,uint256,uint256,address)", +"22ff79d8": "USA()", +"23017a3a": "rewardVaultContract()", +"2301e7b7": "isInPreSaleState()", +"23020be5": "SetfirstTTax(uint256)", +"23023aa4": "_doCatchFish(uint16,uint16,bytes32)", +"23024408": "fund(address)", +"2302c948": "EtherDank()", +"2303084b": "hasTransfers(address)", +"23037a85": "setNextPrice(uint256)", +"23040327": "oraclize_query(string,bytes[4])", +"230434d2": "Technology5GCrowdsale(uint256,address,address)", +"2304ede4": "ADSToken(address,address)", +"230614fb": "batchTransferToken(address[])", +"23063da2": "Hellina()", +"230662f8": "changeSaleManager(address,address)", +"23087c04": "_isWinnerOf(address,address,address)", +"230894f8": "transferTileFromOwner(uint16,address)", +"2308a41c": "amountRaisedBy(uint256)", +"23092560": "RecoverAddress(bytes32,uint8,bytes32,bytes32)", +"23098a9a": "burnAssessor(address)", +"230a1074": "getRegionCurrentImageId(uint256)", +"230a14c0": "RISK_LEVEL()", +"230a3c05": "constructWeaponTokenId(uint256,uint256,uint256)", +"230a8020": "getAddressValue(uint256)", +"230b1eb5": "totalReservedTokenAllocation()", +"230b9667": "getProviderInfoFields(uint256)", +"230b9da3": "parentContract()", +"230bd25d": "requestBounty()", +"230c50fe": "AuthorizePayments(bool)", +"230c96b9": "BuyTokensWithAffiliate(address)", +"230cf412": "test(uint256,int256,uint256,uint256,uint256)", +"230d3469": "canExchangeNum()", +"230d6ed8": "addCandidate(bytes32)", +"230dff66": "theclub()", +"230f49d9": "buy_token(address[])", +"230f6e83": "getCrydrViewStandardNameHash()", +"2310b384": "finalizeStake()", +"2311542e": "SSOrgToken(string,string,uint256)", +"2311bdb2": "isForgiven(string)", +"2311d39c": "dot()", +"2311dc0b": "postProduct(bytes32,bytes32,bytes1)", +"2311e345": "SaleFinalized(address,uint256)", +"23133115": "changeIncreaseStep(uint256)", +"23141fd0": "sendP(address,uint256)", +"23145ca0": "forceCheck()", +"23146c20": "getBuyerAddressPayment(address,uint256)", +"2314a5c8": "getReput(address)", +"2314aad6": "setExtensions(address)", +"2315550e": "add(address[],uint256[])", +"23158cae": "addBet(uint256,uint256)", +"23165b75": "acceptBidForPunk(uint256,uint256)", +"23169ec4": "medalName()", +"23169fca": "EDU_PER_ETH_EARLY_PRE_SALE()", +"2316d0cd": "deathData_a16()", +"2317880c": "requestArbitration(bytes32)", +"2317c28e": "mediaTokenIndex(uint256)", +"2317cd54": "_endRound()", +"2317ef67": "removeAsset(address,uint256)", +"2317f9f3": "setSanMaxAmount(uint256)", +"2318ffc7": "setRokBalance(address,uint256)", +"23191bf1": "finalizeByArbitrator(bytes32,bytes32)", +"231944e2": "moveUnits(uint256,uint256,uint256[])", +"23198b98": "setTokenHolderTribunal(address)", +"231a00cc": "changeBonusRate(uint256)", +"231a2be3": "minimumContributionPhase6()", +"231a439e": "setBlacklistDestroyer(address)", +"231ace68": "MiningRewardPerETHBlock()", +"231b0268": "firstBlock()", +"231b48aa": "settingsSetWeiPerMinToken(uint256)", +"231c1ce8": "unusedMethod(address)", +"231c1d43": "generate(uint256,string)", +"231cb6ab": "ENS_SUB_APP_NAME()", +"231d45a4": "addProduct(uint256,uint256,uint8,bytes32)", +"231d87e1": "competitorTeam(uint256)", +"231da56e": "getSenderValue()", +"231e0750": "register(bytes32,bytes32,bytes32,bytes32)", +"231e18a9": "pureFunc()", +"231fa805": "IsControledAddress(address)", +"23210c1a": "StfuToken()", +"23214fab": "maxProfitAsPercentOfHouse()", +"2321e625": "publicSaleSencPerMEth()", +"23221f1e": "getNbVersions(string,string)", +"2322f484": "balancesQuantity()", +"232397e2": "addAccount(uint256,uint16,bytes32,uint256)", +"2323a00e": "WagaToken()", +"23240d81": "getDailyTransactionVolumeReceiving()", +"23245216": "removeWhitelist(address[])", +"2324c67c": "getAllSignatureHashes(bytes4)", +"232523e8": "forceDivestOfAllInvestors()", +"23260a8b": "getPreviousPrice(bytes10)", +"23262615": "claimVaultOwnership()", +"23266dfe": "getOrganizersAddresses()", +"2326df93": "site_url()", +"2326ef22": "CreateDMSContract(address,bytes32,uint32)", +"2326faf9": "getResearchPerDay(address)", +"23285480": "RefundDeposit(address,uint256)", +"23290737": "logMarketTransferred(address,address,address)", +"2329b4f7": "CryptDash()", +"232a2c1d": "executeSignatures(uint8[],bytes32[],bytes32[],bytes)", +"232a3060": "setFundManager(address)", +"232a6b9d": "signed()", +"232c4d24": "sub_fCode(string,uint256)", +"232c6bab": "delIndividualCertificate(string,bytes32)", +"232cae0b": "last_offer_id()", +"232db034": "abortFunding()", +"232e57c1": "optionSupply()", +"232e7e91": "getproduct(uint256,uint256)", +"232e9051": "gunsFund()", +"232fd216": "getPoolDone(uint256)", +"233023de": "setCertifierInfo(address,bool,string)", +"23306ed6": "getMinimumBond()", +"2330f247": "isAuthority(address)", +"233104d6": "setPresidenteDeMesa(bytes32)", +"233120aa": "getChainyURL()", +"2331af61": "transferActive()", +"23338b88": "delMinter(address)", +"23343af3": "setConfigAddress(address,address)", +"2334623f": "totalETM()", +"23350e4a": "regainEther()", +"23355749": "IkokoToken()", +"2335d307": "IFSActive(address,uint256,uint256)", +"2337d9f1": "endOfferingImpl()", +"23385089": "emitApprove(address,address,uint256)", +"23389c5a": "docs(uint256)", +"2338c002": "_applyShare(address,address,uint256)", +"233907a3": "signedApproveAndCallSig()", +"23394e46": "TripAlly()", +"2339dd43": "HcftSale(address,address)", +"233a04ec": "setEditionSales(uint8,uint256)", +"233a74c9": "currentTokenDistribution()", +"233aacf9": "Announce_winner(address,address,uint256)", +"233ab10d": "setBaseEthCapPerAddress(uint256)", +"233b39c9": "_initCardDetails(uint8,uint256)", +"233b7451": "lastStakedFor(address)", +"233bf71e": "FOCToken()", +"233d264a": "startTicker()", +"233de126": "odds()", +"233dedf1": "averageBlockTime()", +"233e0877": "Purchase(address)", +"233e3220": "renounceSuperInvestor()", +"233e5d00": "WorldStage()", +"233ff4b2": "_fund(uint256)", +"23400cf6": "getLOCCount()", +"2340903d": "EEZcoin(address)", +"23412ede": "StorageEnabled(bool)", +"2341a1af": "receivePlayerInfo(uint256,address,bytes32,uint256,uint8)", +"2341d778": "giveTix(uint256,address)", +"2342293d": "collectionFees()", +"23437d50": "discountICO()", +"23447982": "replaceManager(address)", +"2344acdf": "pauseOffset()", +"2344b0e5": "url_white_paper()", +"2344e4ec": "getHint(uint256)", +"23452b9c": "cancelOwnershipTransfer()", +"2345fe81": "xperToken()", +"234638df": "PreICOHardcap()", +"23471d18": "setStakeAddress(address)", +"2348238c": "transferPrimary(address)", +"23483e45": "delRosenCertAdmin(address)", +"2348f1ee": "lockAttemp()", +"234917d4": "getCallTargetBlock(bytes32)", +"2349748d": "MenoroCashSupply()", +"2349e719": "processStepsByStep(uint256,uint256)", +"234a0ee7": "appHub()", +"234a6ed8": "initializeToken(address)", +"234ae1a0": "WallDirectory()", +"234b2cb4": "whitelistApplication(string)", +"234c0ae5": "combine(uint256[],uint256)", +"234c4bd9": "deployStepThree()", +"234e0056": "COIN_SUPPLY_ICO_PHASE_1()", +"234e5273": "tittyContract()", +"234e5f16": "TIMETHRESHOLD()", +"234ea19c": "lockRate()", +"234f1eb6": "JVToken(address,address,address,uint256)", +"234f9db2": "getBalanceIco()", +"235029ee": "SQT()", +"23509e69": "donkeysEligibleForFees()", +"2350e762": "participantWithdrawIfMinimumFundingNotReached(uint256)", +"2351299a": "createTokensToOwner(uint256)", +"2351baca": "fechVoteNum(address)", +"2351c2f8": "get_tokenReward()", +"2352551f": "bbPublicSaleWallet()", +"23525826": "maxNumbPerSubscr()", +"23526a34": "turnOffSale()", +"235304b2": "updateNextGameInitalMinBetSize(uint256)", +"23533138": "seedMarket(uint256,uint256)", +"23537880": "TestSale()", +"23539cd4": "mintResource(uint16,uint256)", +"235422fb": "_medalUnFreeze()", +"23548b8b": "maxCap()", +"2354b3ed": "requestSatsPrice(string)", +"2354bda7": "auditGuess(uint256,string,uint8,uint256,uint8,uint256)", +"2354ecf7": "balanceOfOnUpdate(bool)", +"2355300f": "unspentCreditsWithdrawn()", +"2355c602": "queryToAddress(bytes32)", +"2356f46a": "Kontlo()", +"23571ac9": "seenHereA(uint256)", +"2357cd3b": "invadeAddress()", +"23584a21": "initStats(string,address,uint256)", +"23586685": "recordSale(uint256,uint256)", +"23587733": "DEVELOPER_BONUS()", +"2359116d": "refill(address,uint256,string)", +"23594797": "createContractRegion(string)", +"235977ca": "ParadiseTokenSale(address,uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"2359bd08": "reinvestTokens(address)", +"235b1eb7": "getOverRate(uint8)", +"235bd895": "_getGameInfoPart1(address,uint256)", +"235c002d": "transferOther(address,address,uint256)", +"235c279f": "addEmitter(address)", +"235c9603": "getNextTranscoderInPool(address)", +"235e5d47": "isRoundEnd(uint32)", +"2360f5a1": "openSaleSupply()", +"2362189a": "defaultExchangeRate()", +"23624a10": "tokenFee(uint256)", +"23626067": "thirdCheckpointPrice()", +"23626df7": "setContractAddress(address,address)", +"2362b26d": "Awards(uint256)", +"23637e60": "votePrice(uint256,bool)", +"23647398": "testThrowRetractNotOwner()", +"23655d7b": "Fantom()", +"236571e2": "determineWinnerEven(string)", +"2365ceb3": "SetWagerData(bytes32,bytes15)", +"2367e1ae": "getLengthOfMatches()", +"2367f35d": "crowdsaleEnded()", +"23685b97": "bpToken()", +"2368d215": "multipleAddToWhitelist(address[])", +"236a160e": "isValidIssuance(uint256,uint256,uint256,uint256)", +"236a8d9d": "registerNode(uint256,uint256)", +"236ae025": "distributionThreshold()", +"236be3e2": "BlockcloudToken()", +"236dd0e8": "paidBidAllocationFee(bytes32)", +"236e06f6": "exchange(address,uint256,uint256)", +"236e1a15": "PromotionCoinMintFinished()", +"236ebbae": "setAuditNodePrice(uint256)", +"236ed5a6": "getVoterProposalsCount(address)", +"236ed8f3": "closeAuction(uint256)", +"236eeff7": "compensate_log(uint256,address)", +"236f86a1": "remainingTokens(address)", +"236ffad4": "initOwned(address)", +"237032da": "isBacker()", +"237082bd": "getCertifiedDocCount(address)", +"2371bb4b": "SetNumber(uint64)", +"23724ffd": "TransferManagerApproved(address)", +"237297a4": "claimWinner()", +"2372996a": "CUSTOM_ERC20_CREATE_SERVICE_NAME()", +"23732ad8": "OSTestToken()", +"2373f091": "_setMinter(address)", +"23749f69": "donationsEndedTime()", +"23751e95": "addRedbullQuest(address)", +"237548fa": "seriesFactory()", +"2375766a": "unlatchContract()", +"2375da83": "setIntArr(uint256,address)", +"2376fe70": "approveProxy(address,address,uint256)", +"23773f81": "calcTapAmount()", +"2378fe2d": "FAPFundDeposit2()", +"23797ed9": "getAppByIndex(uint256)", +"237a35b2": "professionalName()", +"237a4a7f": "requestOneUUID(address,uint256)", +"237b5e96": "child()", +"237c2b22": "MCTCrowdsale(uint256,uint256,uint256)", +"237c72ac": "replaceDecoration(uint256,uint256)", +"237d2628": "issueTokens(address,uint256,uint8)", +"237e9492": "executeProposal(uint256,bytes)", +"237f142a": "ownersLen()", +"237f1a21": "hasIdentity(address)", +"23807da8": "getInvoicingAddressCount(string)", +"2380c39d": "backUtcoinOwner()", +"2382534a": "STR()", +"2383b074": "getSurplus()", +"23845e4b": "getPoolSize()", +"2384c058": "account3()", +"23855c18": "updateDeposit(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)", +"23855cd3": "setBalanceForUser(bytes32,uint256)", +"23858314": "sizeOfProviders()", +"238604f0": "SuperContract()", +"23866438": "joinChannel(bytes32,uint256[2])", +"23867979": "getHealBalance()", +"2386d33e": "_tenuousToken()", +"2387c87d": "setTokensSold(uint256)", +"2387e75e": "RequestBitcoinNodesValidation(address,address)", +"23898138": "MoneyCoin()", +"2389a290": "joinGame(address)", +"238a3fe1": "transferDistribution(address,uint256)", +"238ac933": "signer()", +"238bf375": "PROMETHEUS_MAX_PRICE()", +"238bfba2": "getChannelWith(address)", +"238c5b06": "icoDiscountPercentageLevel1()", +"238d3590": "getTotalTheoreticalSupply()", +"238dafe0": "enabled()", +"238e5b14": "burnAmount(address)", +"238e9de7": "StopFuseaNetworkDistribution()", +"238efcbc": "acceptGovernance()", +"238f7743": "unlockSecondTokens()", +"238fcbf8": "DISCOUNT_TOKEN_AMOUNT_T2()", +"2390507b": "COMMUNITY_ADVISERS_STAKE()", +"239131af": "NEXUS()", +"2391ddf3": "handleLuckyPending(uint256)", +"2391f0b3": "isProtect(bytes32,uint8)", +"23924cff": "TeamLockingPeriod6Months()", +"23926732": "ifDestory(address)", +"23949cd1": "setNFTContractAddress(address)", +"2394a797": "makeHybridization(uint256,uint256)", +"2394cc40": "transferInternally(address,address,uint256)", +"2395e9b6": "specialAllowed(address)", +"23967d78": "FOUNDATION_HOLDER()", +"2397e4d7": "sellToken(uint256)", +"2397f92b": "KNDToken()", +"23985742": "STANToken()", +"23987690": "indFuture()", +"2398a6a6": "sendPrize(uint256)", +"2398b8fc": "SCHEMA_HASH()", +"2399a5af": "balanceAdd(address,address,uint256)", +"2399e1f2": "addPromotionalCompany(string,uint256,uint256,uint256)", +"2399f870": "updateFlipAndMDT(address,uint256,address,uint256)", +"239a2545": "totalNights()", +"239ab208": "notifyAssessors(uint256,uint256)", +"239aee06": "execute(address,address,address,uint256)", +"239b6dd1": "QUINToken(uint256,string,string,uint256)", +"239bb5a6": "getConstructorString()", +"239c02ba": "OPSToken()", +"239d339b": "updateStageByTime()", +"239da1a3": "SportStarMaster()", +"239da7de": "getServiceFeeDenominator()", +"239e7881": "GEBEC()", +"239e83df": "guardedArrayReplace(bytes,bytes,bytes)", +"239f26ee": "BethereumERC223()", +"239f29dd": "setConsensusPercent(uint256)", +"239fcf0f": "Balance(address)", +"239fd68f": "setCurrentPricePerWei(uint256)", +"23a08d97": "totalPreICOavailible()", +"23a1b159": "maxTimeBonusPercent()", +"23a1bd8f": "Dancoin()", +"23a1c271": "setPongval(int8)", +"23a1e00e": "openLeaderboard(uint8,string)", +"23a24a33": "setBAA(bytes32,address,address)", +"23a2725a": "LeS3coin()", +"23a27bcd": "checkProofOrdered(bytes,bytes32,bytes32,uint256)", +"23a31463": "setBlockLock(bool)", +"23a3335c": "BuufmanToken()", +"23a36d2b": "mintToken(address,uint256,uint256)", +"23a37c09": "addRNTBContribution(address,uint256)", +"23a3ad72": "checkRole(address,uint8)", +"23a50727": "endStage(uint256,uint256)", +"23a52674": "expandX()", +"23a58576": "zeroBool()", +"23a6b8ca": "currentBeneficiaryCap()", +"23a8792e": "ChangeTokenPrice(uint256)", +"23a8edb5": "LociBackend()", +"23a90e5e": "getCustomerTxTimestampPaymentMCW(address,bytes32)", +"23a9a156": "SNL()", +"23aa6a17": "issueTokenAndApprove(uint256,uint256,address)", +"23aa7e12": "controllerDelegate()", +"23aba14f": "iCapToken()", +"23abea43": "getPlayerKeys(uint256,uint256)", +"23ac3fd4": "getPOOL_edit_32()", +"23ac4b03": "addQuickPromoBonus(uint256)", +"23ac9ae2": "CcStandardToken(uint256,string,uint8,string)", +"23add736": "claim(uint256,uint256,uint8,bytes,bytes)", +"23adeb05": "OneChance(address,address,address)", +"23ae4438": "getLastRoundInfo(uint256)", +"23aea69d": "isNextBudgetPlanMade()", +"23aed228": "selling()", +"23aedc62": "startSale(uint256[],uint256[],uint256,uint256)", +"23afba86": "Lancer()", +"23b06313": "getPoolBonusFirstExpertFactor(uint256)", +"23b0abeb": "showPhaseInfo(uint256)", +"23b0bbea": "getBullsmasterReq()", +"23b0db47": "delegate_2x(address,uint256[],address[],bytes32[])", +"23b1131c": "unlockDate2()", +"23b11bb1": "getPropertyLastUpdate(uint16)", +"23b11d8d": "addProxy(address)", +"23b17715": "AddressDescriptionAdded(address,string)", +"23b1ed54": "getConstantName()", +"23b1f8e4": "lastPriceUpdateTimestamp()", +"23b2b48f": "addressToAccountMap(address)", +"23b364ab": "getAvailableTicketCount()", +"23b37bb6": "sqrt(uint64)", +"23b3af89": "addHolder(address,address)", +"23b3b704": "calculateUntaxedEthereumReceived(uint256)", +"23b3c771": "getFreeShrimp()", +"23b44cfc": "assignNewParcel(int256,int256,address,string)", +"23b493fe": "getUserFiatBalance(string)", +"23b5aa8d": "STAT()", +"23b5b257": "tokenHasFreeTrial(address,address)", +"23b62b75": "mainWallet()", +"23b6ce11": "buyDiscipleItem(uint256,uint256,uint256,uint256)", +"23b6fc8b": "verifyUrl()", +"23b715cb": "updateShare(address[],address,uint256[],uint256)", +"23b7b140": "setFreezTime(uint256)", +"23b7ec3b": "ownerOf(uint32)", +"23b7fc86": "count_token_holders()", +"23b80995": "saleOver()", +"23b872dd": "transferFrom(address,address,uint256)", +"23b8feb0": "safeMul_dec(uint256,uint256)", +"23b98f92": "getPOOL_edit_6()", +"23ba3420": "t_Michail()", +"23ba467a": "isLastRound()", +"23bb1f69": "prepareToScore(uint32)", +"23bb8022": "getCurrentRateByTokenSold()", +"23bb81ae": "transferSoldToken(address,address,uint256)", +"23bba494": "setContribPeriod(uint256,uint256,uint256,uint256,uint256)", +"23bc29a0": "systemEndingPrice()", +"23bcaae9": "newPost(string)", +"23bd4d7a": "organization()", +"23bd9914": "_calcReward()", +"23bda0ee": "MyCurrency()", +"23be45e2": "matchOrders(bytes,bytes)", +"23bef5dd": "storeWelfare(address,string)", +"23bf0425": "fastEnd()", +"23bf2973": "tgeSettingsPartFounders()", +"23bfc777": "changeRoundDelay(uint256)", +"23c0889a": "initMinerData()", +"23c105a2": "eliminateFrom(address,uint256)", +"23c1236a": "burnFromByAddress(address,uint256,address)", +"23c2460d": "rate(uint16,uint256)", +"23c2b4ea": "finishPREICO()", +"23c2de55": "SmartContractCasino()", +"23c32d74": "cstToMicro()", +"23c3dae7": "NewTranch(uint256)", +"23c4841e": "ToggleFreezeBuying()", +"23c4948c": "getDonator(address)", +"23c5a088": "updateCost(uint256)", +"23c5c55a": "buyImagePriv(uint256)", +"23c5e967": "mul2Throw(uint256)", +"23c639fe": "getback(uint256,uint256)", +"23c69d2a": "currentDividend()", +"23c6bc39": "addressThreshold()", +"23c6c98b": "activeShareholdersArray(uint256)", +"23c731f5": "isCanList()", +"23c79ab3": "CoinFuns()", +"23c850db": "registerGold()", +"23c860a8": "INTREPID_SHIP_PRICE()", +"23c89a00": "requestSignature(bytes32[8],bytes)", +"23c94353": "currentTokenBalance()", +"23c99826": "getDictJob(address,uint32)", +"23cadd34": "move(address)", +"23cafc3d": "voteNoLockByAdminBatch(address[],address[],uint256[])", +"23cb7b19": "_influenceAlgorithm(uint8,uint256)", +"23cba56f": "bonusProgramEnded()", +"23cc16be": "burnInvestorTokens(address,address)", +"23cc3496": "_setRunesValue11(uint256)", +"23cc75a8": "finalizeICO()", +"23cc7615": "userIdIndex()", +"23cc9a90": "addParticipant(address,address,address)", +"23cd5090": "registerToProvider(address)", +"23cd7cd5": "Model()", +"23cdd8e8": "log(string,bytes)", +"23ceb6d8": "mintTokenEscrow(address,uint256)", +"23d0601d": "getAccountIdFromSignature(bytes32,bytes)", +"23d17a40": "addrBRXPay()", +"23d1ab35": "donationReceiverLocked()", +"23d1b8eb": "etherPayout()", +"23d1c95e": "addProposal(string,string)", +"23d1fe56": "s22(bytes1)", +"23d24f24": "LogEscrowEth(uint256)", +"23d2691b": "addAuditRequest(address,string,uint256)", +"23d27633": "EtherLite()", +"23d2b3aa": "HaoCoin()", +"23d32d6a": "generatedBytes()", +"23d34f84": "setGuessAnswer(string)", +"23d44dee": "collectedSignatures(address)", +"23d533c8": "EBCBToken()", +"23d5a686": "getSpaceshipUpgradeCount()", +"23d669db": "setValidationClosed(uint256)", +"23d6b008": "assignedAmountToTheFoundation()", +"23d6c92f": "setFreelancerParams(uint256)", +"23d71b26": "mtrTokenFallBack(address,uint256)", +"23d73ca5": "test_invalidEmptyNotOne()", +"23d7caee": "BitMineToken()", +"23d7e089": "getPotCost()", +"23d808da": "getMatch(uint8)", +"23d80d3a": "IfContractRegist(address)", +"23d862ed": "getAddressLockedLength(address,address)", +"23d88efd": "preIcoTokenSupply()", +"23d9ea80": "getOfferPriceCandy(uint256)", +"23da9c4b": "WhiteListAccess()", +"23db3e50": "_checkAreaAndCategory(uint256,uint256,uint256)", +"23dbf825": "distributionComplete()", +"23dc1314": "failSafeLimit()", +"23dc14c0": "AdAgency()", +"23dc210f": "transferToAddress(address,address,uint256)", +"23dc33b9": "reward6()", +"23dc3f72": "_checkGrid(uint256,uint256,uint256)", +"23dc42e7": "query1(uint256,string,string)", +"23dca40f": "Submit(uint256,bytes32,uint16)", +"23dccbd6": "LogFollow(uint256,address,uint256)", +"23dd03c3": "getLLV_edit_23()", +"23dd523d": "unregisterMember(uint256)", +"23dd797b": "setESOP(address,address)", +"23dddaba": "simpleVotingDapp(bytes32[])", +"23de1915": "NewTicket(address,bool)", +"23de6651": "emitTransfer(address,address,uint256)", +"23defc77": "setHeir(address)", +"23df9df5": "_refund(uint256)", +"23dfed97": "emitCategoryEvaluated(address,address,uint8,uint256,uint256)", +"23e1d351": "buyKeyUseBalance(uint256)", +"23e1d8d0": "failedTimestampLength()", +"23e1f881": "PendingOwnershipTransfer(address,address)", +"23e25f7d": "sendReserveBalance(address,uint256)", +"23e26c43": "datestart()", +"23e375dd": "_computePrice(uint256,uint256,uint256,uint256)", +"23e3d7a9": "updateDescriptiveInformation(address,string,string,string,string,bytes20)", +"23e3fbd5": "depositOf(address)", +"23e4172d": "testValidationOfDecrease()", +"23e44848": "DPToken()", +"23e4d669": "getPlayerPortfolio()", +"23e53b2e": "setSiringAuctionAddress(address,address)", +"23e5942a": "initWallets(address,address,address,address)", +"23e5d13c": "declareWinner(address,bool)", +"23e5e822": "mintToken(int256,address,uint256,address)", +"23e5f1c5": "hour()", +"23e798e6": "getDocumentIdWithName(string)", +"23e7a900": "setIcoEnd(uint256)", +"23e7d9b2": "createInvoice(bytes32,address,uint256,string)", +"23e8cefc": "encodeIfElse(uint256,uint256,uint256)", +"23e957b6": "calculateScore(address)", +"23e9637f": "setSoftCapInCents(uint256)", +"23e9c216": "setBounty(address,string,uint256)", +"23eac4bd": "setTokenOwner(uint256,address)", +"23eb0197": "giveMemberAllowance(address,uint256)", +"23eb3831": "PurchaseCapChanged(uint256)", +"23eb861c": "unchainedMultisigVersionMajor()", +"23ec5939": "returnInvestoramount(address,uint256)", +"23ec8f62": "ownerUnlockFund()", +"23ecb66f": "getPreviousDate(bytes32)", +"23ecc4a1": "claimAmountSet()", +"23ecf108": "MartinKoToken()", +"23ed0a2e": "registerWorker(uint256,uint256,bytes32,bytes32)", +"23ed476f": "treasurySent()", +"23edfb89": "cancelSaleWhenPaused(uint256)", +"23ef2e4f": "stopPreIcoMint()", +"23ef2e56": "setBAI(bytes32,address,int256)", +"23ef604f": "removeOwnedNote(address,uint256,uint256)", +"23f02f56": "crowdEther()", +"23f0b2b6": "getProfile(address,string)", +"23f14e86": "setAutoAddress(address,address)", +"23f1dbe0": "minBidPercentage()", +"23f2cbb0": "sponsorGas()", +"23f3ad03": "ParminderToken()", +"23f4c025": "Cherrio()", +"23f5c64f": "get_data_owner(address,address,string)", +"23f614dd": "TinyOracleLookup()", +"23f64051": "setClaimToken(bool)", +"23f64140": "depositAgent(uint256,uint256,uint256[],uint256[],uint256)", +"23f685dd": "getUnclaimedHalvingSubsidy(uint256)", +"23f6e4fb": "Registered(address,address,uint256,uint256,uint256)", +"23f7dc66": "hasReadership(address,uint256)", +"23f806b7": "tokenAdvisoryBountyTeam()", +"23f809f6": "generateAddAddressSchemaHash(address,bytes32)", +"23f907d9": "MAXIMUM_ETHER_SPEND()", +"23f938ee": "isTransferLock(address,address)", +"23fa370d": "suspendedUntil()", +"23fa495a": "setFlatFee(uint256)", +"23fcdb20": "getRequiredSigs()", +"23fd0176": "destroyCredits(uint256)", +"23fd4524": "OMT()", +"23fe073e": "BancorQuickConverter()", +"23fe1da1": "purchaseWithETH(address)", +"23fe5b90": "hardCapFundingGoalInCents()", +"23fe6146": "pushIssuers(address[])", +"23fed09e": "hasEnoughFund()", +"23ff2af0": "setAttrs(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"23ffcc3e": "PenchantICO()", +"24008a62": "repayBorrowAllowed(address,address,address,uint256)", +"2400b582": "_issue(address,address,uint256,bytes,bytes)", +"2401db10": "sendFunding(address,uint256)", +"24021127": "_setOriginationFee(uint256)", +"2402598c": "BNSToken()", +"24026bfb": "getMarketOrderTrust(uint256)", +"2402ae57": "YudizCoin()", +"24032866": "checkExecutionAuthorization(address,uint256)", +"24038339": "updatePriceAndDenominator(uint256,uint256)", +"24038d2e": "purchaseArmy(uint256)", +"2404608f": "getSignatures(string)", +"24052927": "velReduction(int256)", +"240557b8": "cleanTokensAmount(address,uint256)", +"2405b1a3": "SwissBit(uint256)", +"2405d03e": "refundTokensPurchase(address,uint256)", +"2405e3c6": "initial_supply()", +"24064617": "getMom(address)", +"2406cedb": "setPackageOwner(bytes32,address)", +"2406e626": "createPool(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"2406e9fa": "playRandom(address)", +"240705eb": "withdrawWithFee(address,uint256,uint256)", +"24070feb": "_create(address,uint8,uint8)", +"240860f1": "setHasCommissionerAuction(uint32)", +"2408771e": "validateInvestmentGroups(address[])", +"240961db": "showPoolOwner(uint256)", +"2409dfa2": "drawback()", +"240ad8bd": "applyAsProvider(string,string,string,string)", +"240bd9e6": "DcorpProxyCreated(address,address)", +"240c2709": "toReserved(address,uint256)", +"240cf1fa": "changeOwnerSigned(address,uint8,bytes32,bytes32,address)", +"240dfd6e": "stopEnrollment()", +"240e07e0": "impl_apply4Redeem(address,uint256)", +"240e0b2e": "JinKuangLian()", +"240ecad5": "transferViaProxy(address,address,uint256)", +"24108475": "vote(uint256,string)", +"2411ca69": "startPrivatesaleDate()", +"2411e6a3": "NonEmissiveToken(address,string,uint8,string,string,uint256)", +"2412bdb8": "exchange(address)", +"2413372d": "TestETCCoin()", +"24141f14": "CRYPTOHEDGECoin(uint256,string,string)", +"2414b63e": "CasinoBank(uint256,address)", +"2414e134": "NEWCICO(address)", +"24153b73": "Tosh(uint256,string,uint8,string)", +"241673e8": "withdrawTokenToFounders()", +"24167745": "ShamelessUETRipoff()", +"2417f31d": "maxPresaleTokens()", +"2419217e": "teamAddresses(uint256)", +"2419ef4d": "Coverage()", +"241a2305": "MultiTransfer(address,address[],uint256[])", +"241b701f": "openPot()", +"241b88b6": "threeMillionTwoHundredThousand()", +"241d1108": "nextDerivativeToken()", +"241d2c76": "getCount(address,string)", +"241d7aea": "BeautyCoinToken()", +"241de9e9": "proxy(address,address,uint256,uint256)", +"241e0fa0": "updateBytes20inBytes(bytes,uint256,bytes20)", +"241ea03c": "Pregnant(address,uint256,uint256,uint256)", +"241f675d": "CMO_SHARE()", +"24206c2e": "updateTokenAddress(address,address)", +"2420703e": "transfer_tokens_through_proxy_to_contract(address,address,uint256)", +"2421101f": "returnAddress(address)", +"2422224e": "signatures(bytes32)", +"24223a3c": "allowanceItem(uint256,uint256,uint256,address)", +"2422d991": "getADR()", +"2423a088": "UNKNOWN_TYPE()", +"24241ebc": "challengeWithPastCustody(address,uint256,bytes32[],uint256[],bytes32[])", +"2424276c": "freezeMultiAccounts(address[],bool)", +"24248168": "getBracketScore(bytes8,bytes8,uint64)", +"24250852": "mintToPublic(address,string)", +"2425ce3e": "upgradeTank(uint256,uint8)", +"2426169a": "_getSwapType(bytes32)", +"24263f77": "mintICOTokens(address,uint256)", +"24265000": "canCollect(uint16,uint16,uint8)", +"24265408": "FaucetManager(address,address[])", +"242654a2": "transferEnable()", +"242655d4": "prefixedEncode(address)", +"24270d1e": "get_arbits_max_contribution(address)", +"24272479": "_finishBet(uint256)", +"24280cc4": "createPuppySaleAuction(uint256,uint256,uint256,uint256)", +"24285ade": "AlpineMegalith(uint256,string,uint8,string)", +"24294b1f": "startFirstRound()", +"2429b755": "isPrivateSaleRunning()", +"2429d61a": "isOnSale(uint32,uint64)", +"2429ee2a": "isBountyPayStage()", +"242a0087": "getParents(uint256)", +"242a60b5": "withdrawValue(bool)", +"242a7450": "validateTenant(address,bytes32,uint256)", +"242aa460": "presaleInvestors(address)", +"242aeac1": "DiscoverCoin()", +"242b0a73": "rewardPayedOf(address)", +"242be01a": "_setAppIfNew(bytes32,bytes32,address)", +"242c721e": "testSetOrganiserUsingDeployedContract()", +"242c9ce9": "_burnFrom(address,address,uint256)", +"242ce07b": "frozensTotal(address)", +"242d1259": "WeiWeiToken(address,uint256)", +"242d7dba": "totalAmountRaised()", +"242d9f69": "getOraclizeWinnerGasFee()", +"242db433": "getMarketManagerAddress()", +"242ddf37": "NewBook(bytes32,address,uint256)", +"242de145": "TokenCreationContract()", +"242ed69f": "setActiveTranscoders()", +"242fc36e": "cashback()", +"243056d6": "writeMerchandises(uint256,string)", +"2430731f": "cancelRecurringBillingInternal(uint256)", +"2430d881": "getLastAction(address)", +"2431676c": "getTotalWinsCount()", +"24318b5c": "numberOfHosting(address)", +"2431f164": "process_payment()", +"243222c0": "processFailedVerification(bytes32)", +"2432282d": "getLoanCountForAddress(address)", +"24323110": "McFlyCrowd(uint256,uint256,address,address,address,address,address,address,address,address,address,address,address,address,address)", +"2432eb23": "testThrowRetractLatestRevisionNotUpdatable()", +"2433c978": "setupOwners(address[])", +"2433f617": "getIIPTotalSupply()", +"24349551": "deleteContract(uint256,uint8[],bytes32[],bytes32[])", +"2434cf10": "UseBySoftware(address)", +"2434ec3e": "declareLost(address,bytes32)", +"243527a2": "addID(address,bytes32)", +"24355ea6": "isA(address)", +"24359879": "ownerAt(uint256)", +"24361cec": "picops_block()", +"2436219c": "doubleEntryPrice()", +"243669ad": "totalOwners()", +"2436b1d2": "NUM_COUNTRIES()", +"2436d4e3": "TwoStandardToken(uint256,string,uint8,string)", +"2436d5f8": "StorageBase(address)", +"2437160f": "TFTOKEN()", +"24372fa3": "SignCurrentVersion(string)", +"24378482": "bnOf(bytes32,bytes32)", +"2437e1c2": "setPresaleParams(uint256,uint32,uint32,uint256,uint256,uint256)", +"24386b3e": "testMultitransfer3()", +"243870bd": "createChannel(string,bytes,address,address,address[],uint256[],address,uint32[])", +"2438b674": "window2TokenExchangeRate()", +"2438db59": "setServices(address,address)", +"243a28eb": "returnedWei(address,uint256)", +"243af82d": "stageBuys(address)", +"243b22cf": "setGameResult(uint256)", +"243b2a39": "createDispute(bytes32,address,address,bytes32)", +"243c33a1": "testCreateShortId()", +"243d230c": "dateTo()", +"243d3827": "getRewardInfo(uint256)", +"243d51b4": "betD()", +"243dc8da": "getFoo()", +"243e280b": "publish(string)", +"243eb89f": "endIcoMainSale()", +"243f6b58": "removeKYC(address)", +"243f6e0c": "change_active(uint256)", +"243feeb0": "ADDR_TKG_ASSOCIATION()", +"24415953": "lengthEqual(int256[],uint256,string)", +"244159af": "getPriceOneToken()", +"24417f39": "getCostForHealth(uint8)", +"24425cbf": "TEST_CONTRIBUTION()", +"24429e34": "OliveGardensResort()", +"2442cfec": "putBtoWithStc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"2442e1cb": "getMilestone(uint256)", +"24434852": "buyOnBehalfWithCustomerId(address,uint128)", +"2443a30e": "ChangeInsurerOperationEvent(address,uint256)", +"2443f0ae": "derivePayoutDistributionHash(uint256[],bool)", +"24444749": "NUM_POTATOES()", +"2444d352": "setWhitelistOff()", +"24452f44": "tryBuy(uint256,uint256)", +"24453ed6": "getCustomerTxAmountMCW(address,bytes32)", +"24454fc4": "getTranscoderEarningsPoolForRound(address,uint256)", +"24455e7d": "createNetwork(string,string,uint256,uint256,uint256,uint256,uint8)", +"24457036": "LockChainFundDeposit()", +"2445caf1": "ERC20Token(uint256,string,string,uint8)", +"24463cbe": "AddressDailyReward(address)", +"2446e1de": "icoClose()", +"2447fe10": "initBridge()", +"2448fe2f": "redTeamSupply()", +"24496026": "removeQuoter(address)", +"244967b3": "start_game()", +"24497829": "ethFundAddress()", +"2449dd55": "sendCommission()", +"244b252a": "SaturnToken()", +"244b34c5": "Stage2Deadline()", +"244bfa6b": "buyCelebrity(uint256)", +"244c23ee": "Token(uint256,string,uint8,string)", +"244c757a": "getCurrentIcoNumber()", +"244c91d4": "setMaxIssuers(uint256)", +"244c96a1": "compareOrders(uint128,uint128,uint128,uint128)", +"244cb924": "EnableSelling(uint256)", +"244cee6d": "helloWorldWeb()", +"244d04f5": "finalizeTokensale()", +"244dad09": "createdUser(bytes32)", +"244ded7a": "ChangeOwnership(address)", +"244e0c87": "balanceOF(address)", +"244eab9e": "lovelock_price()", +"244eba55": "frozenDaysForBounty()", +"244f4894": "getWithdrawed(address)", +"244f828a": "SetHFee(uint16)", +"244fcd03": "removeRelease(bytes32,string)", +"24500e05": "tokenAdvisorPartners()", +"24503ab0": "setDefaultTransferGas(uint256)", +"24506e2a": "KoalaChain()", +"24516000": "getPOOL_edit_26()", +"24519a6a": "takeFee(address,address,uint256,uint256)", +"2451a899": "isSuccess(uint256)", +"2451b3d8": "accessProvider()", +"24528499": "_getSettingVariables()", +"24534192": "addMutagenFight(uint256,uint256)", +"2453759a": "setNoDataSubcontract(address,uint256,uint256)", +"2453ffa8": "orderCount()", +"24541f78": "getTransferProxy(uint32)", +"24545f82": "LULUToken()", +"2454d1f0": "incFightWin(uint256)", +"24562747": "tokensPerETH()", +"245678d6": "MINBET()", +"24571783": "NESTFAME()", +"2457d765": "CHSC()", +"2458d472": "getCurrentStage(uint256)", +"2458d606": "exchange(address,uint256,string,uint256)", +"2458f2a8": "swarmTree(uint256)", +"2458f679": "instContWallet()", +"245a03ec": "scheduleSetIt(uint256,uint256)", +"245a30ec": "setDataAuction(address)", +"245a367c": "GetParticipant(address,address)", +"245a6f74": "isProxyLegit(address)", +"245a810b": "addMetaData(bytes32,bytes32,bytes32,bytes32[],bytes32[])", +"245ae4a0": "slashUsername(bytes,uint256)", +"245b565d": "ballotEncryptionSeckey()", +"245ba519": "addVerifier(address,address)", +"245ccdb7": "setFeePrice(uint256)", +"245d1314": "signUserChange(address)", +"245d5556": "_deleteEntry(bytes32)", +"245e22de": "transferDirectly(address,address,uint256)", +"245e70f0": "_commitBallot(bytes32,bytes32,bytes32,address,uint64)", +"245f57a9": "asyncSendSilently(address,uint256)", +"245fa2ab": "newBankManager(address)", +"24600157": "CUBES()", +"2460053e": "LegionToken(uint256,string,string)", +"24600fc3": "withdrawFunds()", +"2460f09d": "MarketContract(string,address,address,uint256[5])", +"24612b5d": "GenbbyToken()", +"24619da7": "RechargeMain(address)", +"24627547": "vestingFunc(uint256,uint256,uint256,uint256,uint256,uint256)", +"2462a0d5": "funcFromC1()", +"2462f6f1": "setFadeoutStarts(address,uint32)", +"2463de5a": "getPastWinnerTimestamps()", +"24642510": "rechallengePossible()", +"24645254": "getBalance(uint8,address)", +"24645c5a": "totalTokenSale()", +"24646ce4": "getBuySellSum()", +"2464a69f": "_computePublisherCut(uint128)", +"24652ba2": "PeerBudsToken()", +"24664106": "mintRep(int256,address,uint256)", +"24667568": "ORGANIC(uint256,string,uint8,string)", +"24675116": "PK(uint8,bytes32)", +"24676ae3": "SmzdmToken()", +"246982c4": "getPerson(uint256)", +"2469a846": "terminateCrowdSale()", +"2469c14e": "setState(address,uint256)", +"246a3234": "getEthChfPrice()", +"246a44f8": "isNeedCloseCurrentGame()", +"246c01cd": "tryUpgrade(uint32,uint8)", +"246c02e6": "check_depth(uint16)", +"246cbacc": "test_twoInvalidEqAddress()", +"246d4098": "openToThePublic()", +"246d41a9": "incrementTotalVoters()", +"246eb968": "deleteUri(uint256)", +"246f02bb": "tickets_bought(string,uint256)", +"246f0ca4": "KuaiKanToken(uint256,string,uint8,string)", +"246f1e17": "createGuess(uint256,uint256,string,uint8,uint256,uint256,uint256[],bytes32[],uint8)", +"246f8b96": "removeOwner()", +"247121e3": "MakeAdministrator(address)", +"2471fa1c": "_building(uint256)", +"24724b5b": "changeAmisWallet(address)", +"24743d40": "f1(bytes32)", +"24749b59": "bonus(uint256)", +"2474a21c": "collectedEther()", +"2474e236": "TOKENS_MAXIMUM_SUPPLY()", +"24752467": "getParticipantPublicKey(bytes32)", +"247534cf": "WrapperLock(address,string,string,uint256,address,bool)", +"2475a9b3": "UTXORedeemed(bytes32,uint8,uint256,bytes,bytes,uint8,bytes32,bytes32,address,uint256)", +"24788429": "removeExecutor(address)", +"24788ed9": "ledgerContractAddr()", +"247956f1": "withdrawEtherInBatch(address[],uint256[])", +"24797d1b": "decreaseThreshold(uint256)", +"247ab51f": "markAsProcessed(uint256)", +"247aebbb": "tokensup(uint256)", +"247b127d": "MiIToken(uint256,string,uint8,string)", +"247b188b": "icoTotalSupply()", +"247b3bd6": "BitCronus()", +"247baa3e": "ALH2()", +"247bb39c": "privateOfferingCap()", +"247bb432": "test_addAndRemovePermissions()", +"247bbed7": "borrowTokenFromEscrow(uint256,uint256,address,bool)", +"247c6c70": "priceLC()", +"247cf1aa": "lengthNotEqual(bytes32[],uint256,string)", +"247cff43": "freezingManager()", +"247ecab5": "bonusDrop(address,uint256)", +"24804cef": "Deed()", +"24806d4a": "getBounsInRound(uint256)", +"2480d9e6": "saleAirdrop(address,uint256)", +"2481325a": "ExtremeCoin()", +"2481851a": "finalizeName(address,string)", +"24819384": "btycaddmoney(address,uint256)", +"2481c51c": "includesGblock(bytes32)", +"2481f92c": "setClockAuction(address,uint256)", +"2483761f": "buy1ktickets()", +"24841bbd": "interfaceBurnTokens(address,uint256)", +"24845131": "proclaimDeath()", +"2484a023": "verifyTetherCurrency(address,uint256,string)", +"24850e10": "releaseFunds(bool)", +"24851914": "isTeam(address)", +"2485484d": "clearGenVaultAndMask(address,uint256,uint256,uint256)", +"24854bd8": "updateThirdExhangeRate(uint256)", +"248582b0": "receivePaymentForGoodsSoldEarly()", +"24860443": "toBytes2(bytes,bytes,uint256)", +"24863354": "saleOverReachMaxETH()", +"24876434": "addPriceTier(uint256)", +"24880bcb": "getTierUnsoldTokens(uint256)", +"24884fc2": "startPeTime()", +"24887c04": "SieChain()", +"24888154": "Buy(uint64)", +"24888b4a": "isVoterLocked(address)", +"24889e37": "removeAmountForAddresses(uint256[],address[])", +"2488fd55": "countPlayersInPosition()", +"24896a47": "signPA(uint32)", +"248b0dba": "toBytes16(bytes,bytes,uint256)", +"248baabd": "FUND_ADDR()", +"248c4439": "setFunctionOnePrice(uint256)", +"248c6380": "_tokenBankrollBuyIn(uint8)", +"248d14eb": "allowPriceUpdate()", +"248dd407": "Transfer(uint256)", +"248e150a": "getFirstAuctionsExtendableStartDate()", +"248e1993": "setMinTarget(uint256)", +"248e4dd4": "pank13()", +"248e86e6": "ProjectToken(uint256,string,uint8,string)", +"248ec326": "DAILY_LIMIT()", +"248fcccc": "CRSAccount()", +"24900d7c": "initializeAddresses(address,address,address,address,address)", +"24902e24": "LOG2_E()", +"2490be24": "exchangeEurToEth(uint256)", +"2490e13f": "editPieceData(uint256,string,string)", +"2490e16e": "getDirectBoughtTokens()", +"24924bf7": "maxParticipants()", +"249292b9": "testUnlockedDay()", +"2493097b": "finalizeDestruction()", +"24932186": "enterOrder(uint128)", +"24937124": "fetchPaidOrdersForMerchant()", +"2493a2f2": "setBonusTokenRateLevelOne(uint256)", +"2493d006": "openWeek()", +"2493d669": "AllowanceGranted(address,uint256)", +"24941147": "cancelProject(uint256)", +"24943c7d": "resolveDispute(bytes16,address,address,uint256,uint16,uint8,bytes32,bytes32,uint8)", +"2494aef9": "TOKEN_AMOUNT_ICO_STAGE1_PRE_SALE2()", +"2494e267": "CXLExchangeRate()", +"24953eaa": "removeAddressesFromWhitelist(address[])", +"249559ad": "computeVoteOutcome(uint256)", +"249586f2": "editPayoutSetting(uint8,uint16)", +"2495c0ce": "stopVote()", +"24968a70": "getHomePost(uint256)", +"2496a431": "robPantry(address,uint256)", +"2496b796": "sellMyTokensElixir()", +"249830d8": "setUnclaimedPlotPrice(uint256)", +"24992680": "SelfKeyCrowdsale(uint64,uint64,uint256)", +"24999c9c": "bonusSignalValue()", +"2499a533": "Purchase(address,uint256)", +"249a1120": "licenseTermsMaxCostPerSec(bytes32,bytes32)", +"249a5438": "getInvestorsAndBalances(address)", +"249aa292": "preIcoPrice()", +"249b4d0b": "removeTrustedIssuer(address,bytes)", +"249b4d4f": "transferContractUser(address)", +"249b7c19": "presaleEndTime()", +"249bc291": "transferMintMaster(address)", +"249cb3fa": "canImplementInterfaceForAddress(bytes32,address)", +"249eae4d": "addInvestors(address[],uint256[])", +"249f1f22": "insertNodeSorted(uint256,address)", +"249f77ef": "CancelSimpleOffer(uint256)", +"249f7aa0": "exchangeRateChangesBlock()", +"249ff838": "getAddressByNames(bytes32[])", +"24a039c7": "CBToken(address,uint256)", +"24a084df": "sendValue(address,uint256)", +"24a12edf": "getAuctionIdForUserAndIdx(address,uint256)", +"24a1871e": "LOL2()", +"24a1c1e0": "addCertificateAndBind2Wallet(address,uint256,bytes32,bytes32)", +"24a1cd1e": "currentCoefficient()", +"24a20a25": "feed10(uint256)", +"24a23361": "getTeamAttribute(uint8,uint8,uint8,uint32[11])", +"24a27bd2": "tokensForAdvisory()", +"24a30e46": "m_claimingIsActive()", +"24a38383": "WhitelistedSmallCap(address,uint256)", +"24a3b013": "attachToToken(address)", +"24a434eb": "openCarousel()", +"24a43c51": "releaseMultiple(address[])", +"24a4411d": "DecoderTester(address,address,address,address,uint256)", +"24a47aeb": "merge(uint256)", +"24a4aff6": "adaCoin()", +"24a684e1": "get_perms(bytes32)", +"24a69051": "allowClaim(address)", +"24a6a409": "MINTY()", +"24a6ab0c": "freeSupply()", +"24a73e5f": "decreaseAllowance(address,uint256,bool)", +"24a779ca": "PELOMemberMap(address)", +"24a7d277": "removeAddressFromBlacklist(address,address)", +"24a80b31": "BusinessUnion(uint256,string,uint8,string)", +"24a852c6": "unset(bytes)", +"24a8e11d": "isAuthorized(address,address,bytes32)", +"24a9d3d9": "callAndReward(string,string,uint256)", +"24a9d853": "feeBps()", +"24aa62fe": "setObjectionPercent(uint256)", +"24aa6dd1": "ProxyManagementContract()", +"24aa93b9": "getVestedAdvisorTokens()", +"24abfc02": "getTournamentThresholdFee()", +"24ac4df1": "cancelNewOwnersCountRequest()", +"24ac4e65": "getServerUserNumber(address)", +"24accfa3": "refundMoney(uint256)", +"24acec2b": "PayeeWithdrawInterest(address,uint256,uint256)", +"24ad35e1": "PisangChain()", +"24addfc0": "swapMe()", +"24ae84cc": "participateCrowdsaleInvestor(address)", +"24aee933": "usePower(uint256,uint8,uint8,uint8,uint8[176])", +"24af4cdb": "setNewUserState(string,bytes,string)", +"24aff74d": "Debit(address,address)", +"24b04905": "gift()", +"24b06a96": "getAllElectionsOfOrganiser(address,address)", +"24b07165": "get_property_facility(uint256)", +"24b0ff0f": "approveTokensFromKingWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"24b1905b": "sendFirstBatch(address[],uint256[])", +"24b19da5": "TokenDistribution(address)", +"24b1a2fa": "disableArbiter(address)", +"24b1aa5c": "domain_build(address,uint16,uint8,uint8)", +"24b1babf": "claimEarnings(uint256)", +"24b1bfdf": "resetToken()", +"24b27fc8": "CoquiToken()", +"24b2c2f6": "GYUToken()", +"24b33f5d": "_auction(uint256,address)", +"24b35ef2": "mintTokens(address,uint256,uint8,bytes32)", +"24b3940a": "sayGoodBye()", +"24b492d7": "SetInitData(uint256,uint256,uint256,uint256,uint256)", +"24b4cee0": "openBatch(uint256)", +"24b4ec3d": "buyOwn(address,uint256)", +"24b4fc8e": "closeChannelWithoutReceipt()", +"24b508a3": "listByGroup(string)", +"24b50e43": "getMsgHash(address)", +"24b51369": "tgrSettingsPartFounders()", +"24b570a9": "totalPot()", +"24b5c134": "numCities()", +"24b5efa6": "RewardClaimed(uint256,address,uint256)", +"24b6b8c0": "_safeTransfer(address,address,uint256,bytes)", +"24b6f7d3": "TestBathTx(uint256,uint8,string,string)", +"24b72667": "buyprices()", +"24b77f05": "acceptCounterStack(bytes32,bytes32)", +"24b79a1c": "ICO_PHASE3_BONUS_PERCENTAGE()", +"24b82a76": "voterReward(address,bytes32,uint256)", +"24b89fa7": "unlockStepLong()", +"24b8fbf6": "register(address,bytes)", +"24b94ac6": "atto()", +"24ba1a46": "isSpawnProxy(uint32,address)", +"24ba506d": "getNumberOfTransactions()", +"24baeb12": "initCrowdsaleToken(bytes32,bytes32,uint256)", +"24bb49d6": "balanceMinusFeesOutstanding()", +"24bb7734": "mainSaleDuration()", +"24bb7c26": "pausedPublic()", +"24bbd049": "mintOpen()", +"24bc4e92": "QueenXChain()", +"24bcdfbd": "tradeFee()", +"24bce60c": "freeze(address,uint256)", +"24bdaf95": "about(uint256)", +"24bdf96a": "getUserRefBalance(address)", +"24c034a7": "ERC721Auction(address)", +"24c05c72": "requestLoans(uint256)", +"24c06d7d": "buyBreeding(uint256,uint256,uint256,bool)", +"24c0db84": "ico1receivedTotal()", +"24c12bf6": "code()", +"24c1f9c7": "stage_3_add()", +"24c2362b": "buyCrySolObject(uint256)", +"24c30182": "BleedFomo()", +"24c31975": "increaseJackpot(uint256,uint256,uint256)", +"24c33d33": "round_(uint256)", +"24c37507": "getMinBet()", +"24c4c9e4": "getCurrentPRETDEBonus()", +"24c4e3b9": "getPatientHealthData(address)", +"24c55380": "TicketPurchase(uint256,address,uint256)", +"24c65927": "createNewAuction(string,uint256)", +"24c65f35": "updateRefundGas()", +"24c6ef60": "SafeTokenTransfer()", +"24c74c1d": "LogClaim(address,uint256,uint256,uint256)", +"24c74c78": "certify(bytes32)", +"24c91c1b": "isDataResponseValid(address,address,address,string,bytes)", +"24c93343": "error(string)", +"24c9bf5e": "Prizes()", +"24ca77e5": "teamNum()", +"24ca984e": "addRouter(address)", +"24caf5e1": "sale_address()", +"24cb015a": "_ONE()", +"24cb57dc": "whitelistEntries(uint256,uint256)", +"24cc35a6": "_isTeam()", +"24cd2ae4": "beneficiaryUserIds(uint256)", +"24ce2562": "updateGameSpecifics(uint256,uint256,uint256,uint256)", +"24ce2917": "create(address,uint256,uint256,address,address)", +"24ce9d27": "sellOrder(address,uint256,uint256)", +"24cee3d6": "Change(address,address,address,uint256,uint256)", +"24d0cc0f": "getPayouts(address)", +"24d16a4d": "makeUnderlier(bytes32,address,int256)", +"24d1c28b": "changeVoteRules(uint256)", +"24d29cfb": "_removeSigner(address)", +"24d3048d": "cancelNode(string)", +"24d30d54": "enableMerge(bool)", +"24d3eaf3": "bonusEndTime333()", +"24d427a9": "print(address)", +"24d4e90a": "ln(uint256)", +"24d5336a": "deicmals()", +"24d6169c": "startLockPeriod()", +"24d6d601": "voteFor(address,uint256)", +"24d70dea": "hasEntered(address)", +"24d7378a": "m_totalTokens()", +"24d7806c": "isAdmin(address)", +"24d86f00": "decreaseStake(uint256,uint256)", +"24d89171": "changeNeedFightToAdult(uint256)", +"24d97a4a": "killme()", +"24da48a3": "updateMaxAllocation(uint256)", +"24da569a": "AGToken()", +"24daddc5": "setRestricted(bool)", +"24db1f50": "masFreezedTokens(address[],uint256[],uint256[])", +"24dbb91d": "BusinessCard(string,uint256,string,address)", +"24dc793f": "getKydy(uint256)", +"24dcd0ef": "transferFounders(address,uint256)", +"24dd24ed": "allowingClaimBTC()", +"24ddb58c": "performStepVerification(uint256,bytes,bytes,bytes)", +"24de30f1": "distributeEarlyBackerTokens(address,uint256)", +"24de3c0e": "gwei()", +"24de908d": "wins()", +"24df2d5b": "Filmpass()", +"24df75d9": "withdrawFromTicker(uint256)", +"24dfc9d7": "getBytes32(uint256)", +"24e04871": "horseForSale(uint256,uint256)", +"24e0be2e": "EVenToken()", +"24e1c3f3": "PRCT_ETH_OP()", +"24e1fa3a": "FIRST_WITHDRAW_RATE()", +"24e21cde": "sendTradeOffer(address,uint256[],uint256[])", +"24e2ca92": "withdrawSharedExpense(uint256,address)", +"24e2cda7": "TestOrder2(address)", +"24e2dbd3": "linkRecipientName(bytes32)", +"24e34476": "myStoredDividends()", +"24e5355e": "JerryToken()", +"24e581be": "transferAllToOwner()", +"24e5bdb9": "getEventsCount(string)", +"24e5eeaa": "slogan()", +"24e65e14": "Addr6()", +"24e7a38a": "setGeneScienceAddress(address)", +"24e7c824": "performTransfers(address[],uint256[])", +"24e846c7": "confirmedSaleEther()", +"24e8b3ec": "getClaimableRewards(bytes32)", +"24e998c3": "Ethershift()", +"24e9dad8": "_safeCall(address,uint256)", +"24ea8d1a": "Fortnitecoin()", +"24eaf1ea": "SendBadge(address,address,uint256)", +"24ec6f66": "cancelContest(uint32)", +"24ec7590": "minFee()", +"24ed1486": "getPeriodAliasFor(uint256,address)", +"24ed2d8b": "initOwnership(address,address)", +"24ed3dc0": "PolyAnalytixProjectToken()", +"24ed3e78": "BACKUP_THREE()", +"24eda713": "teamTwoWin()", +"24edc2a1": "WINT()", +"24ee0097": "myMethod(uint256,string)", +"24ee62ee": "secondWavePrice()", +"24ee9be4": "getVirtualBalance(address,address)", +"24eebc47": "SWAPCOINZ()", +"24efe4c3": "_addToClaimList(address,uint256)", +"24f07356": "batchIncreaseApproval(address[],uint256[])", +"24f073ad": "getTimeOfLastBid()", +"24f12f1e": "ProfitSharingMock(address)", +"24f159c2": "extensions()", +"24f1ec37": "multiAccessRecipient()", +"24f2cc02": "preIcoLimit()", +"24f32f82": "changeHardCap(uint256)", +"24f35549": "setup(uint256[])", +"24f3c639": "buyApprenticeChest(uint256)", +"24f481c8": "oracleItQuery(string,string,string,uint256,uint256)", +"24f48bc5": "setWatcher(address)", +"24f5445b": "transferFundToAccount()", +"24f55e29": "hasCompany(string)", +"24f618b6": "GetDOTRevokableHash(bytes32,uint32)", +"24f65ee7": "getTokenDecimals()", +"24f690ac": "cryptowars()", +"24f696fd": "LogFundTransfer(address,address,uint256,uint8)", +"24f731d5": "PlaceBet(uint256,bytes)", +"24f743dc": "freeSpaceOf(address)", +"24f74697": "callbackGasLimit()", +"24f7a980": "WaitStarted(uint256)", +"24f82526": "closeLong()", +"24f8fe9c": "EdgelessCasino(address,address,uint256,uint256)", +"24f91d83": "init(address,address,address,string)", +"24f9702e": "allocateArrayOfTokens(uint256,address[])", +"24f99ba4": "ChiMarket()", +"24fa6f3b": "requiredBlocksElapsedForVictory()", +"24fabb87": "setImageOwner(uint256,address)", +"24fad665": "enableMasterTransfers()", +"24fb563f": "PlayerTickets(address,uint256,uint256)", +"24fc253e": "eraIndex()", +"24fc65ed": "getId(uint256,uint256)", +"24fc70ff": "setBonusOn(bool)", +"24fcb80c": "parseAddress(bytes32)", +"24fcbc1c": "withdrowErc20(address,address,uint256)", +"24fd0a5c": "isAvailableForTransfer(uint64)", +"24fd2be1": "NationalCoin()", +"24fd5585": "fixedExp(uint256,uint8)", +"24fd6ec9": "zeroBonus()", +"24fe722e": "requestUnpause()", +"24fe73fe": "isRegularOrBoardMember(address)", +"24fe8e68": "MyToken(uint256,uint256,string,string,uint256,uint256)", +"24fef683": "OwnershipGranted(address)", +"24ff026b": "getScheduleDetails(bytes32)", +"24ff065a": "addressOk(address)", +"24ffca71": "visitCost(uint8)", +"24ffea1a": "presaleToken()", +"25005498": "updateEntityNew(uint256,bool)", +"2500ec4a": "getDHand(uint32)", +"25010816": "get_length(uint256,uint256)", +"25012699": "KERNEL_APP()", +"25017e10": "transferSubscription(bytes32,address)", +"2501faa5": "triggerRecoveryAddressChangeFor(uint256,address)", +"2502c19c": "setRBInformationStoreAddress(address)", +"250312ce": "bleachAppearance(uint128,uint128)", +"2503dce8": "updatePublisherFee(address,uint16,address)", +"25052d02": "getMyTokensReturns()", +"250537fc": "_createCollectible(bytes32,address)", +"250540cf": "calcMaxWithdraw(address)", +"25059052": "WhitelistedLargeCap(address,uint256)", +"2505c445": "finalizedEthFundAddress()", +"2505f349": "setTokenMinter(uint256,address)", +"25062287": "_ownerDist()", +"25068a28": "freezeAllowance(address)", +"2506bfe7": "validateBySymbol(string)", +"25074d73": "Registered(string,uint256,address,string)", +"25084b04": "manualOverrideEditionHighestBidder(uint256,address)", +"25096f28": "KryptopyTokenMock()", +"2509f1b9": "SLP()", +"250a1c1d": "Validate(string,string,string,bool)", +"250a8dc2": "isAccountAddress(address)", +"250a93cb": "POEXToken(address,address)", +"250ac096": "BuyRoseCoin()", +"250b1154": "tokenRate3()", +"250b35e8": "BidSaved()", +"250bc504": "Ambassador()", +"250c95fe": "setMaxBuy(uint256,uint256)", +"250ccce4": "getOutStreamOf(address)", +"250d5bc8": "LineToken3()", +"250de298": "EthlanceSearchJobs(address)", +"250dea06": "modifyBalance(address,uint256)", +"250e7d61": "CROWDSALE_CLOSING_TIME()", +"250e816b": "getPeriodSealedPurchaseOrderFor(uint256,address)", +"250e87c9": "pyramid()", +"250ef961": "checkCorrectPurchase()", +"250fe144": "setInvoice(uint256,bool,string,string,string,string)", +"25100b4d": "placeBet(bytes32,string)", +"25102f27": "PRESALE_START_TIME()", +"25107a47": "TransactionRefundedAfterEscalation(uint256)", +"25112004": "XCNTToken()", +"25112743": "getSaleContractStartBlock(address)", +"251139f6": "setPrevContract(address)", +"25119b5f": "channelManagerByToken(address)", +"2511b182": "minBuyableAmount()", +"25128b02": "CampaignResumed(uint256)", +"25137f46": "setSalesPipeAllowance(address,uint256)", +"251481c8": "testDecodeTransfer(bytes)", +"2514a6b4": "withdrawDividends(uint256)", +"251506fa": "SendFart(string)", +"25155eef": "JupiterToken()", +"25161e70": "HKDHToken(uint256,string,string)", +"2516a18f": "setMintableToken(address)", +"2516af82": "createLottery(bytes32,uint256,uint256)", +"2516c6c6": "min_tokens()", +"2516d738": "secureAddOrderFunds(address,bool,uint128,uint128)", +"25174f0e": "getOwnerIndex(address)", +"25182e79": "winAmount4()", +"25185d3e": "freeBalance()", +"25192fca": "issuanceDraft(address)", +"2519a378": "finalizeReplaceTrueUSD()", +"251a8096": "total_wins_wei()", +"251aaf67": "dividendsPaidPerShare()", +"251b5f8e": "team_fund()", +"251c1aa3": "unlockTime()", +"251c7182": "seed_multiplier()", +"251d3589": "setUseEIP712(bool)", +"251d8ffb": "setNav(uint256)", +"251e3843": "_preValidation(address,uint256,uint256,uint256,uint256)", +"251e3d7d": "registerMember(address,bytes,uint256)", +"251ed995": "walletSetWallet(address)", +"251fa3b1": "testFailRetractLatestRevisionNotOwner()", +"251fbe37": "get_training_index()", +"25200718": "requestAudit(string,uint256)", +"2520573f": "getProposalMetaHash(bytes32)", +"25209260": "PrepareRoll(uint256)", +"2520bf04": "shuffle()", +"2520d2e1": "readvalidrollsXaddr(address)", +"25221a4f": "addToBlacklistMulti(address[])", +"25223bd4": "donor()", +"25233782": "magicnumsig()", +"252348dc": "ratePerEth()", +"2524380f": "buy_Exchg_BkgChk(address,uint256,uint256,address,uint256)", +"25245b26": "sendEth(address[],uint256[])", +"25248587": "indexview(address)", +"252498a2": "setUrl(string)", +"25250519": "addGlobalAdmin(address,address)", +"2525aa78": "mintStart5()", +"2525f5c1": "cancelBid(address,bytes32)", +"25266f96": "isNewPlayerInBattle(string,address)", +"2526d960": "clawback()", +"2527331b": "transferToSimpleService(address,uint32,uint256,uint256,uint256)", +"252733f0": "registrantsPaid()", +"252786e4": "WatchBlockSizeInEther()", +"25280163": "RedFundCrowdsale(uint256,uint256,uint256,address,uint256)", +"25287c0e": "bonusesGiven()", +"2529b907": "setVaultDeposit(uint256)", +"2529d1a3": "fused()", +"252ba7a0": "userDeployCount(address)", +"252bb9c3": "PHOENIX_CORSAIR_EXTRACTION_BASE()", +"252cb4fe": "registerProposal(uint256,uint256[])", +"252ccac3": "getTotalActiveBets()", +"252cde48": "checkPrizesView(address)", +"252cedc3": "sendERC20Tweet(uint256,string,string)", +"252d1578": "init(address[],uint256,uint256,uint256,uint256)", +"252d7eb3": "getCurrentPayoutIndex()", +"252dbc36": "setTokenPoolReward(uint256)", +"252e40b1": "secondsPerYear()", +"252edb76": "setUInt8(bytes32,bytes32,uint8)", +"252f14ba": "_addArbiter(address)", +"252f34a7": "loserOne()", +"252f4977": "destroyTokensInBntyTokenContract(address,uint256)", +"252fb38d": "bytes32string(bytes32)", +"253089b5": "smxTeamAddress()", +"2530c905": "rand(uint256)", +"25316ff5": "getBetUint(uint8,int8)", +"2531a36a": "getDesignatedReportDisputeDueTimestamp()", +"25327b75": "latestErc20TxRequest()", +"2533bb9d": "dataCentreAddr()", +"2533ff94": "LogPersonUpdate(address,uint256,uint256,string)", +"2534076e": "cancelRemoveOwnerRequest()", +"253459e3": "feesSeperateFromBalanceApproximately()", +"253515d5": "accruedBuyout(address)", +"2535b150": "cryptoJingles()", +"2535dd53": "getAvailableWithdrawInvestmentsForBeneficiary()", +"2535f762": "transferWithData(address,uint256,bytes)", +"25361060": "getReferralStatus(address)", +"2536d7f1": "endOfCrowdsale()", +"25384770": "reserveAllocated()", +"25387eed": "tallyTheVotes()", +"253abf4a": "processSalesForAllBuyers(uint256)", +"253bc579": "companyClaimed()", +"253bd7b7": "check(address,bytes32)", +"253c8bd4": "change_owner(address)", +"253caf94": "setTasksAddress(address)", +"253d8195": "SavingsBank()", +"253e3447": "numberOfSpritesOwnedByUser(address)", +"253e7fdf": "becomePacifistmaster()", +"253ebd92": "isTierJoined(address)", +"253f029c": "performUpdatePC()", +"253f055b": "getStage2End()", +"253f2809": "offerCollectibleForSale(uint256,uint256,int256,uint256)", +"253f5c38": "addtoLeaderboard(uint64,uint64,uint64)", +"253f89b0": "minContributionUSDc()", +"25400abc": "buyPuzzle(uint8)", +"25402e6c": "vcxCount()", +"2540424b": "isDefIndexInRange(uint8)", +"25406480": "extendPeriod(uint256)", +"2540c420": "phaseOneRate()", +"2541edcc": "oferta()", +"25435704": "updateTokenSupply(uint256)", +"254439fe": "addTokenList(address,uint32)", +"25449c54": "ArteumToken()", +"2545686d": "is_slot_in_bid(uint8,uint8,uint8)", +"2545a07a": "MOEToken()", +"25461328": "MSPMock(address)", +"25464902": "AUCC()", +"2546559c": "Demo()", +"2546de10": "vest(address,uint256,uint256)", +"254747a5": "checkAvailableAmount(address,uint256)", +"25476ed8": "settleAndWithdrawCfd(uint128)", +"254800d4": "vestingStart()", +"2548bbbd": "WithdrawalCreatedEvent(uint256,uint256,bytes)", +"25495998": "getMinimumConsumerDeposit()", +"25498152": "setBuyDividendPercentageFee(uint8,uint256,uint256)", +"2549ad8f": "MANHATTANPROXYCNVNTAVE()", +"2549e0b1": "getLockedBalance()", +"254a46f4": "cycleMintSupply()", +"254b302d": "revokeAllMyId()", +"254bd326": "getUserAddr(uint256)", +"254c70ac": "getPlayerData(uint32)", +"254c91b3": "testBitNotSetSuccess()", +"254d2e12": "GetDemolishCost(uint256,uint256)", +"254dacba": "BurnTokens(address,uint256,string)", +"254dcfe2": "lastActiveTransaction(address)", +"254fd745": "transferUCASH(address,uint256)", +"255016c8": "checkIfExploded()", +"255074a9": "addManualContributor(address,uint256)", +"2550c435": "CRYPTO_USD()", +"2551858e": "getFlags(bytes32)", +"2552317c": "lastBlockNumber()", +"25524400": "placeBet(uint256[],bytes32,uint256,uint256,bytes32,bytes32,uint8)", +"25534a1e": "saleEtherReceived()", +"2553795a": "AragonSupply()", +"2553ac0d": "getPlayeds(uint256,address)", +"2553e0cb": "OwnedMortal()", +"2554a358": "queryCurrentTradablePrice()", +"2554b9b3": "kkkTokenSale(uint256,address)", +"2555611a": "AOKPAY()", +"25568fd7": "__setBeneficiaryForDasTokensChange(address)", +"2556befa": "feeBank(address)", +"255706f5": "start_service2(uint256,address)", +"25575a04": "peBalance()", +"25579702": "calculateDrugBuySimple(uint256)", +"25580656": "dataSourceGetRoundOfSixteenResult(uint256)", +"25583590": "_cancelAuction(uint256)", +"25585ee8": "diamondIndexToApproved(uint256)", +"255884ae": "discoveryPrice(uint256)", +"2559e0dd": "rateInSpecificTier(uint256)", +"255bd903": "signByBride()", +"255c8244": "amountRaisedPreSale()", +"255c8fee": "TestyTest()", +"255e2f81": "adjustDollarToEtherRatio(uint256)", +"255e444e": "scientists()", +"255e4685": "mintStart()", +"255eac5c": "newRegistration(address,uint256)", +"255f82e2": "sealed(uint256,bytes32)", +"25605c6a": "balanceOfSC()", +"2560a8c0": "houseedge()", +"2560baeb": "calculatePayrollBurnrate()", +"25616007": "getLandplayerFirstDefenderID(uint8,uint32)", +"25618ca8": "setBattleContractAddress(address,address)", +"2561ee35": "estimateBuyOrder(uint256,bool)", +"25625608": "FoundWinner(address,uint256)", +"2562b427": "declineKyc(address)", +"25630c9f": "fwithdrawal(uint256)", +"25635b68": "updateBaseInventory(uint256,uint256,uint16)", +"2564e1c4": "PaymentAddressFactory()", +"256540cd": "turnover()", +"256688fb": "UseRedEgg(uint256)", +"256697df": "ibcDistributed()", +"25672ee6": "OpenBids(address,uint256,address,address,uint256,uint256)", +"256738d1": "AGT()", +"25686e15": "getMarketsRocId(uint256)", +"25687e28": "tuneLastStageStartAt(uint256)", +"2569100d": "runtoeth(address,uint256)", +"256919c6": "fixSale()", +"25696308": "lastBlock_a10Hash_uint256()", +"25697337": "getLittAdminCount()", +"25698d89": "isLottery()", +"2569cd6c": "assistant()", +"256a9f81": "extendedTime()", +"256b8dfe": "Travelcash()", +"256bcaa0": "addToJackpot()", +"256bdaa4": "setEtherRate(uint16)", +"256c0926": "RocketPoolCrowdsale(address)", +"256c09d4": "_protocolInterestRate(uint256)", +"256c10a1": "market2021TokenCreated()", +"256c3232": "getPreICOBonusAmount(uint256,uint256)", +"256c5fc6": "LooisToken(uint256,string,uint8,string)", +"256df407": "test_spamFreeze()", +"256f992b": "organizers_percent()", +"256fa241": "distributeTokens(address[],uint256)", +"256fec88": "lastSender()", +"2570c13d": "GBCoin()", +"2570e31e": "getTokens(uint256,address)", +"2571a4ab": "MaxBetAmountChanged(uint256)", +"25731e97": "quitBanker()", +"257341a8": "vestingCountOf(address)", +"2573aa7d": "newShare(address)", +"2573ce27": "validateUserByHash(bytes32)", +"25746251": "canVote(uint256)", +"25750995": "updateChfCentsPerEth(uint256)", +"25756d90": "getWeaponRarityFromTokenId(uint256)", +"2575d47e": "EmitAccountChartDetails(address,uint256,uint256,uint256)", +"2576a779": "updateServiceFee(bytes32,uint256)", +"257714db": "getTransferRate(address)", +"257781e7": "deleteIPFSHash(bytes32)", +"2577929b": "settleContract(uint256)", +"257793f9": "getConstructorTouches()", +"2578117b": "getPotAsFixedPointForGameId(uint256)", +"25787747": "icoDuration()", +"2578e943": "RHYNOTE()", +"25799b18": "getUnapprovedArtists()", +"2579dd3c": "registrantToHopefulIds(address)", +"257bcd6a": "placeBet(uint256,bytes32,bytes32)", +"257c360d": "getCurrentBalanceForCampaign(bytes32)", +"257c88b5": "curQuater()", +"257d3db5": "setNumNumbers(uint256)", +"257d4166": "Partner()", +"257d5995": "updateSinglePayout(address,uint256)", +"257d849f": "ZegartToken(uint256,string,string,string)", +"257d9bb8": "MINIMUM_AMOUNT()", +"257e0523": "addLockedTokeD(address)", +"257e1f8f": "endUpgrade()", +"257e5c69": "matchStake()", +"257ef522": "approveBountyTransfer(address)", +"257ef70b": "fillSellOrder(address,address,uint256,uint256)", +"257f9abf": "removeFromList(address)", +"257fc838": "setResolveValueGasLimit(uint256)", +"258072e5": "display_rate()", +"2580ce84": "totalAndRemainOf(uint256,address)", +"2581021c": "depositCollateralOnBehalfOfRecurse(address,address,bytes32,uint256)", +"258108da": "slaveWalletPercent()", +"25818751": "test_oneValidEqUint3()", +"2581c674": "testBitsOrFailIndexOOB()", +"2581f5a4": "distributeAirdrop(uint256,address[],uint256[])", +"2582bf2a": "updateDelegateKey(address)", +"258315b3": "ATC(uint256,string,uint8,string)", +"2583373c": "distributeAndUnlockTokens()", +"2583a1d9": "oraclizeQueryId()", +"2583b2e4": "totalWithdrawTokenAll()", +"2583cfef": "removeFromBothSendAndReceiveAllowed(address)", +"2584295e": "userWhiteListContracts(address,address)", +"2586539e": "batchTtransferEtherToNum(address[],uint256[])", +"2587eb4e": "setRate(int256)", +"2588f9a5": "ReleaseAgentSet(address)", +"25892f92": "ApprovedBy(uint256,address)", +"2589af4a": "getProjectKudosByUsers(bytes32,address[])", +"258a61d6": "coordinateToIdentifier(uint256,uint256)", +"258a6ca6": "getStoryExpiry(bytes12)", +"258ae582": "verify(bytes32,bytes)", +"258b5a35": "challengeSettle(bytes,uint8[2],bytes32[2],bytes32[2])", +"258b5c06": "finalizeCrowdsale(uint256,uint256,uint256)", +"258b5da6": "recoverWETH()", +"258b85d4": "verifyHash(string,string)", +"258c047e": "getStatusEventClosed(bytes16)", +"258c0f1e": "deleteCaller(address)", +"258c2a2d": "Charity()", +"258c4f63": "channelManagerByToken(address,address)", +"258c5ddd": "softWithdraw()", +"258d3d6e": "PlayHallToken()", +"258da4b4": "seedStarted()", +"258dd544": "estimateSellOrder(uint256,bool)", +"258e60b6": "start(string)", +"258f6b8f": "GiveReferralRocket(uint16,address)", +"258fd4f3": "Stage1Allocation()", +"25910753": "addCourse(string,string,bytes32)", +"2591432d": "canary()", +"25925806": "tokensAllocatedForCs(address,address,address)", +"2592e921": "verifyParams()", +"2593ed21": "setICO1Phase()", +"2594b343": "walletTwo()", +"259653b8": "distributionClosed()", +"2596c93b": "manualBonusActive()", +"2596e62c": "test_oneValidEqBytesUint()", +"25973ef7": "CIFRCOINTOKEN()", +"25979983": "sendToAll(uint256)", +"25981559": "bluceTestCoin(uint256,string,string)", +"25982586": "AddressDemo()", +"259852f8": "updateGenVault(uint256)", +"2598ab9d": "createPromoSeedAuction(uint8,uint8,uint256,uint256,uint256,uint256,uint256,uint256)", +"25990d4d": "TokenFulfillment(address[2],uint256[8],uint256)", +"2599c661": "getgamecardsalemoneyuint256(uint256)", +"259a28cf": "UNLOCK_PERIOD()", +"259b2ce0": "whitelistRegistrants(address)", +"259b5181": "_batch2_rate()", +"259b5605": "PTL()", +"259bc6f5": "getWhiteUsers()", +"259c05f5": "DEV_TAX_DIVISOR()", +"259c29e8": "replaceShorter()", +"259c95c4": "_sendWebGiftToken(address,uint256)", +"259ceee5": "contractTokensTotal()", +"259d1cb4": "eth_decimal_num()", +"259d33c1": "roundStats(uint256)", +"259eb959": "privilegedTransfer(address,uint256,bytes,string)", +"259fddaf": "stakeCommunityTokens()", +"259fefcb": "angelAddress()", +"25a02ff6": "setGeneratorAddress(address)", +"25a10a70": "getChild(address)", +"25a190c9": "inicializaStatusPossiveis()", +"25a2219f": "promotionsUsed()", +"25a30145": "preSaleTime()", +"25a31135": "Disable()", +"25a34aca": "returnMargin()", +"25a3ba49": "getCertKey(string)", +"25a42081": "setPriceStep3(uint256)", +"25a43ea5": "setts10(uint256,address)", +"25a50636": "completeBountyAddresses(address[])", +"25a52d9d": "curentWinner()", +"25a583a3": "_reAdjustDifficulty(uint256)", +"25a6c545": "generalInfo()", +"25a7650a": "beginGame(uint256)", +"25a78057": "DeClubToken(uint256,string,string)", +"25a86d56": "ETH_USD_EXCHANGE_CENTS()", +"25a8e6f9": "addNewEditor(address)", +"25a9d450": "getClientBalance()", +"25a9e534": "DataToBlockchainKeeper()", +"25ab2d03": "getReturnSize(uint256)", +"25ab526d": "MITPurchase(address,address,uint256,uint256)", +"25ab9f43": "addDoubleChanceLine(uint256,string,uint256)", +"25abc312": "changeICOPrice(uint256)", +"25ac29da": "generateUrl(string,uint256)", +"25ace2a7": "checkExpired()", +"25ad7f2e": "OneStep()", +"25ad91ce": "createUser()", +"25adfc8f": "SetMaxMinersXblock(uint256)", +"25aeb4a2": "addPayment(uint256,string,int256,bool)", +"25aef744": "ValuePlaced(address,address,uint256)", +"25b05c88": "playerGameId(address)", +"25b10186": "INITIAL_PRICE_INCREMENT()", +"25b16c4a": "getWeis(uint256,uint256,uint256)", +"25b198eb": "inList(address)", +"25b1a072": "setGOPCreator(address)", +"25b29d84": "getEtherValue()", +"25b2ac77": "privateOfferingWallet()", +"25b31a97": "purchase(address)", +"25b3b5a8": "_totalMinedSupply()", +"25b3bfb8": "transferFrom0(address,address,uint256)", +"25b3edd9": "updateTraits(uint256)", +"25b5160c": "setICOPrice(uint256)", +"25b56727": "createProxy(address,address)", +"25b56dd4": "averageScrapPrice()", +"25b634c0": "approveDisbursement()", +"25b64bba": "signerConsumerNonce(address,address)", +"25b6ae80": "incSALESTATE()", +"25b72273": "SGT(address)", +"25b75b7b": "deregistrationDate()", +"25b825ab": "newMediaToken(uint256,uint8,string,string)", +"25b886eb": "constructors()", +"25b89c52": "AirDropToken()", +"25b901c8": "Refundlineinfo()", +"25ba0824": "grantOwners(address)", +"25ba0f51": "initContract(address,address)", +"25ba2d2e": "minimalPrice()", +"25bae118": "earlyPurchaseClosedAt()", +"25bb8e93": "_badgeUnFreeze(uint256)", +"25bccea2": "setFreeze(address)", +"25bd4639": "paymentId()", +"25bd713f": "tokensForPlatform()", +"25bdb2a8": "getSaleState()", +"25bdb73d": "benefitPercents()", +"25bdc110": "Resolve(bool,uint256)", +"25bddc18": "DGXCrowdsale(address,address)", +"25be124e": "token2()", +"25be53e7": "kickStartICO(address,uint256)", +"25c065b1": "minStakingAmount()", +"25c10247": "buyIPC()", +"25c2052f": "last_random()", +"25c24bc3": "folioToken()", +"25c302e4": "totalDonors()", +"25c33e13": "setMaxReward(uint256)", +"25c48f30": "MYDECIMAL()", +"25c50f97": "enablePhenomenon(bytes32)", +"25c54456": "existsContract(address)", +"25c5ce04": "availableOnStage()", +"25c5d4d4": "tileDrop(address[])", +"25c62d5a": "MAX_TOKENS_AIRDROPS_BOUNTIES()", +"25c70a44": "moveToArea(uint16)", +"25c782d7": "addStageCrowdsale(address)", +"25c7cd17": "getCurrentLeaderOwners()", +"25c843b9": "comments()", +"25c9307d": "lastBetBlockNumber()", +"25c93df3": "rewardTokenAmount(uint256)", +"25c95538": "isRepeated(string)", +"25c972ff": "JoinGameAsBanker(uint8,uint256)", +"25ca4c9c": "isAccount(address)", +"25ca5cc6": "candidateTillETHAssets()", +"25ca953d": "resetAirDrop(uint256,uint256)", +"25caa262": "getBal()", +"25caaa37": "getMyChicken()", +"25cb2bc6": "getBrokerAddress(uint256,uint256)", +"25cb366d": "manualMigrate(address)", +"25cb4f2c": "profitContainerAddress()", +"25cb5bc0": "getExpiryTime()", +"25cb6303": "isItIco()", +"25cb98d5": "removeVerifiedUser(address)", +"25cbd68e": "fifthTeamWithdrawal()", +"25cbe702": "tokenSupportLimit()", +"25cbeb0a": "DICIMALS()", +"25cbeb7e": "creatorsAddress()", +"25cc348f": "testDeployedValues()", +"25ccdb4c": "currentspudinfo()", +"25ccf381": "create_forwarder()", +"25ccf688": "KEO()", +"25cdca8d": "CommonWhitelist()", +"25cde42c": "addPayerRefundAddressAction(bytes32,bytes)", +"25ce77a0": "devuelveEncuestados(bytes32)", +"25ceb4b2": "submitBlock()", +"25cf512d": "setBytes32Value(bytes32,bytes32)", +"25cf98e5": "EduCloud()", +"25cfa566": "StartingPrice()", +"25d00041": "registrantIndex()", +"25d04034": "KT07Coin(uint256,string,uint8,string)", +"25d0b4ef": "minFundingGoal()", +"25d104d4": "returnVestingSchedule()", +"25d1da84": "revokeAll(bytes32,address)", +"25d30d8e": "cnt_per_Keos()", +"25d3a09d": "getProposal(string)", +"25d3b2c6": "check_array_add(address)", +"25d3bcd1": "saleHardcap()", +"25d3d0e3": "purchaseTimestamp()", +"25d4bdeb": "LookAtCollectedFees()", +"25d5971f": "withdrawStake(uint256)", +"25d5eafa": "total_points()", +"25d76e6d": "setCompte_27(string)", +"25d78d3b": "IcoPhaseManagement(address)", +"25d83bb3": "authorized_setCardPerkText(uint256,string)", +"25d85e12": "totalPopulation()", +"25d8a4b2": "SpiceToken()", +"25d8dcf2": "betAndFlip()", +"25d8f6a5": "dividendForHistory()", +"25d91125": "earlyWhitelistBeginTime()", +"25d92ee2": "updateFeeWallet(address,address)", +"25d988bb": "buy_token(address[],uint256,uint256)", +"25d998bb": "availableBalanceOf(address)", +"25d9d57d": "highTokensToSellGoal()", +"25d9ec83": "requestBuywithETH(address)", +"25dac5e3": "DocumentStored(uint256,uint256)", +"25db4dd0": "jackpotBlance()", +"25db6699": "tgrSettingsBlocksPerStage()", +"25dbe054": "setDonationUnlockTs(uint32)", +"25dccaf9": "postMessage(address,uint256,string)", +"25dd0ee6": "checkTotalBalance(uint256[])", +"25dd495a": "Recycle()", +"25ddda76": "changeMixEnable(bool)", +"25dfbfba": "addProduct(string,string,string,string,uint256)", +"25dfcf84": "saleAllocated()", +"25e023b3": "unlockOwnerBalance()", +"25e0671f": "areReservedTokensDistributed()", +"25e0c876": "sosTransfer(address,address,uint256)", +"25e11811": "addFunctions(address)", +"25e1350f": "insert_candidate(string,uint8,string,string)", +"25e16063": "withdrawEth(address)", +"25e1b5e4": "pricePerMessage()", +"25e1c6f7": "batchTransferORS(address[],uint256)", +"25e3172b": "AdminClaimAirdropMultiple(address[],uint256)", +"25e330fb": "_increaseRarity(uint256,bytes32)", +"25e37b2b": "delTournament(address)", +"25e3d3ba": "blockResult(uint64,uint64,uint64)", +"25e3d7b4": "assignSharedOwnership(address,uint256)", +"25e41da1": "getRandomValue(uint256)", +"25e524d3": "right8(uint256)", +"25e629f2": "fundraisingDelta()", +"25e65584": "getPlayerBossWannaCryData(address)", +"25e6c304": "totalPrizes()", +"25e6f516": "tokenDescription()", +"25e7514b": "remainAmount()", +"25e7c9ad": "getTotalAmountOfFirstInvestors(uint256)", +"25e7e3cf": "recoverAllEth()", +"25e89283": "mainSaleActive()", +"25e8f38c": "logUI(string,uint256)", +"25ea269e": "Scissors()", +"25eafb45": "AikcoinSupply()", +"25eb64c7": "buildingAddress()", +"25ede147": "depositSecretBid(bytes32,bytes)", +"25ee8abb": "winningTeamSet()", +"25eeecbc": "divisionByZero()", +"25ef9afa": "LOG_newSpinsContainer(bytes32,address,uint256,uint256)", +"25f08fc4": "decayedPriceOfTwitterId(uint256)", +"25f0f467": "updateTransferFeeRate(address,uint256)", +"25f0fd23": "_revoke(bytes32,address)", +"25f262c7": "draw(address[])", +"25f281b4": "changePriceSetter(address)", +"25f2f6db": "awardRoundPrize()", +"25f39a63": "div(int128,int128)", +"25f3da52": "GetBankAccountNumber()", +"25f3f2ef": "joinBuyRequest(uint256)", +"25f43ed5": "setMemsize(uint256)", +"25f4c703": "setFoundersPercent(uint256)", +"25f5cb1e": "getAllowedForTransferTokens(address)", +"25f5ec45": "getCheapestCardWager(address)", +"25f673f5": "Love(address,address,uint256)", +"25f731c8": "transferOwnershipBack()", +"25f885d0": "CashOut(bytes)", +"25f96b73": "ownerSupply()", +"25f9bfef": "CONTRACT_REGISTRY()", +"25f9f1e6": "lockOwnerBalance(uint256,uint256)", +"25fa0131": "isZero(address,string)", +"25fa5ae1": "createShapeShiftTransactionPost(string,string)", +"25fa8a4f": "_firstTokenId(address)", +"25fab539": "removeDragonFromSale(uint256)", +"25fad06a": "clearances()", +"25fb439c": "POW33()", +"25fb66b9": "getHeroItems(uint256)", +"25fc575a": "deregisterToken(uint32)", +"25fc5f02": "HIPHOP()", +"25fc790f": "te()", +"25fcdad8": "complaint(address)", +"25fced01": "sellTokensPreIco()", +"25fd1e29": "REFUND_TIME_FRAME()", +"25fda176": "notify(address,uint256)", +"25fdb725": "MIN_CONTRIBUTION_ETH()", +"25feb519": "fifthTime()", +"25ff68dd": "Initialized(address,uint256)", +"25ffba04": "updateTokenStatus()", +"26000ba2": "updateBalanceOnFunding(uint256)", +"2601d1bc": "checkGameState()", +"2602bc8f": "_transfer(uint256,uint256,uint256,bytes32,string,uint256)", +"26030a34": "report(bytes32)", +"2603ace6": "unRegOwn(address,string,address)", +"2603f70c": "ownerDeclareRefundFinish()", +"26044feb": "fetchdivs()", +"26046743": "assetOwnerRemoved(bytes32,address,address)", +"2604b767": "getEggsSinceLastHatch(address,address)", +"2604f424": "FUTURE_DISTRIBUTE_LIMIT()", +"26052ef6": "getCurrentSolver(address)", +"2605b3c7": "participant(address)", +"26066ad5": "offer(uint256,bytes,uint256,bytes)", +"2606a10b": "report()", +"26070774": "Token(address)", +"26073003": "congratulationFromNoel()", +"26086c70": "triggerVersion(address)", +"2608f818": "repayBorrowBehalf(address,uint256)", +"2609037c": "requestArbitration(address,bytes32)", +"26091cbe": "OwnersBySpinner(uint256,uint256)", +"26093bbc": "safeIncrement(uint256,uint256)", +"26094c60": "setUnsoldTokensWallet(address)", +"260958a5": "getTransfer(bytes32)", +"260993f9": "registerSister(address)", +"260a5227": "buyOnBehalfWithSignedAddress(address,uint128,uint8,bytes32,bytes32)", +"260a54d3": "getCA(address,address)", +"260a818e": "unregister(bytes8)", +"260abfa5": "EnableMember(address)", +"260b0bc8": "payToOracle(uint256,uint256)", +"260b8f6e": "GetEvaluate(address,uint8)", +"260bf85a": "updateAmountToTakeAsRake(uint256)", +"260c2214": "setValid(uint256,bool)", +"260c3af1": "IcapTransfer(bytes32,address,bytes32,uint256)", +"260d387b": "blacklistUserForTransfers(address)", +"260e6885": "BazraCoinToken()", +"260e9640": "lock(uint256,uint256,uint256,uint256)", +"260ea6c9": "myDividendBalance()", +"260edaaa": "surplusTokens()", +"260f836d": "intercrypto_getInterCryptoPrice()", +"26109699": "Withdrew()", +"26111ab2": "addToSet(uint256,uint256)", +"2611341b": "submitApplication(address)", +"26119a0b": "changeFeeETH(uint256)", +"26121ff0": "f()", +"26134334": "getProjectKudos(bytes32)", +"2613ba9a": "PlatformDeposit(address,address)", +"2614195f": "getNameFee()", +"2614d4a4": "spendCredits(address,uint256)", +"2614fff6": "lengthOfCommonPrefix(bytes32,bytes32)", +"26161670": "donkeyRanking(uint256)", +"2616501d": "defaultRate()", +"261669ba": "HeroesToken()", +"26168eed": "getTestimonial(uint256)", +"261775f6": "BlokGrup()", +"2617fc13": "resetcardPrice()", +"26180224": "newChallenge(uint64,uint64)", +"261879ed": "addKitty(uint256,uint256,uint256[5])", +"26188437": "tokenReserved(address,uint256)", +"26188a3f": "increaseAllowed(address,address,uint256)", +"2618a571": "DEVELOPMENT_TEAM_CAP()", +"26195901": "numAnimals()", +"2619ba7f": "ETHFee()", +"261a323e": "exists(string)", +"261aa1c5": "additionalBonusPercent()", +"261ac279": "getApiByIdWithoutDynamics(uint256)", +"261b2c5e": "stepVestingDuration()", +"261b4205": "equalBytesToBytes(bytes,bytes)", +"261bd0f1": "BUY_BACK_BONUS()", +"261c085e": "registerChallenge(bytes32,uint256)", +"261c42dd": "getAllRevisionTimestamps(bytes20)", +"261c70bd": "voteMessage(bytes32,uint256)", +"261cb08a": "burnPausedTime()", +"261de7c4": "right33(uint256)", +"261e9693": "balances4(uint256)", +"261eafc8": "addMasterTo(address,string,string,string,uint8,uint8,uint8,uint8,uint8,uint8,uint32,uint32)", +"261ed1d8": "farmCities(uint256)", +"262006e9": "getFirstDocumentIdBetweenDatesValidFrom(uint256,uint256)", +"262007c0": "getBetter()", +"26207bd1": "indices(int128)", +"26208591": "payDividendsTo(address)", +"2620f61c": "storeClaim(uint16,address,uint256)", +"2620fb2b": "getNextTime(address)", +"2620fd4a": "setupICO(uint256,uint256,uint256,uint256)", +"262199c3": "changeTokenOwner()", +"2621b6e3": "finalStageRefund()", +"2623297e": "zt()", +"26232a2e": "platformFee()", +"2623f687": "getRevenue(uint256)", +"2624597c": "createTokensForEvent(address,uint256,uint256,string)", +"2624b2d9": "EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH()", +"2624c4eb": "EtheremonEnergy(address)", +"2625e2e1": "post(address,address,bytes32)", +"26278f86": "unrestricted()", +"262799f7": "PaquariumTokenTest2(uint256,string,uint8,string)", +"262834da": "_addOperator(address)", +"2628803f": "migrateREP()", +"262933cb": "responseFromWS(address,uint256,bytes32)", +"26295b52": "createGalaxy(uint8,address)", +"262aa9fc": "DOGToken(uint256)", +"262af333": "sponseeAddress()", +"262af3dd": "getClassViewValue(uint256)", +"262b9f8c": "finishRoundA()", +"262bcb68": "mintBooster(address,uint32,uint8,uint8,uint32,uint24)", +"262c0b72": "getPayoutFreezePeriod()", +"262c3666": "forward(bytes32[],uint8,bytes32,bytes32)", +"262da6df": "TransferOwnershipOperationEvent(address,uint256)", +"262f8244": "HGSOCIAL(uint256,string,string)", +"262f8c0e": "addTimelock(address,uint256)", +"262fe547": "testCheckSavecEthBalance()", +"2630271d": "setlockaddress(address,bool)", +"2630c12f": "priceOracle()", +"2630d97d": "setAtomLev(uint256,uint8)", +"2630ee9f": "revealBid(bytes32,address,uint256,address,address,address,uint256,uint256)", +"2630ef36": "setNumOfTimesSteal(uint8)", +"263164b9": "getSalaryTokensTotalCount()", +"26316e58": "setMigrationMaster(address)", +"26324eff": "producers(address)", +"26325bd3": "allowEveryone()", +"2632924d": "left30(uint256)", +"2632bf20": "unblockMe()", +"2632fc3c": "MichiganvsLoyola()", +"2634592a": "logReportsDisputedCalled()", +"26345de2": "VendingMachine()", +"26348325": "smartContactForSale()", +"2634d90d": "ArcherFreeCoin(uint256,string,uint8,string)", +"263570c0": "addStorage(string,address)", +"2635f4de": "registerLibrary(bytes,address)", +"2635f59f": "InterfaceToken()", +"263631b4": "euroCents2wei(uint256)", +"2637bb2e": "isTransferProxy(uint32,int256,address)", +"26381b05": "canReceiveTokens()", +"26387b07": "Fortune()", +"2638b25c": "seedEndTime()", +"263a6d79": "initiateTransaction(address,uint256,bytes)", +"263b694a": "MIMIMUM_CONTRIBUTION_AMOUNT_ICO()", +"263c0a8d": "_setLagParams(string,uint16,uint8)", +"263c493a": "enable_deposits(bool)", +"263c6ec0": "usdToTokens(uint256,uint8)", +"263ce6a0": "getWinningPrediction(address)", +"263d4878": "triggerRefund()", +"263d5ad0": "vaultPercentage()", +"263dffba": "_releaseVouchers(address,uint256,uint16)", +"263e3d5d": "terminateContract(uint256)", +"263e6d0d": "INDOPAY()", +"263e74e6": "computeBonus(uint16)", +"263e79b5": "addCreditScore(uint256,string)", +"263eb5b6": "assertEq8(bytes8,bytes8)", +"263ef0cf": "needRefoundETH(address,uint256)", +"263f6a42": "rateFeesNumerator()", +"263fa1ad": "XYZToken()", +"263fbd45": "getContractUpdatedTimeById(bytes32)", +"263fbef2": "District0xNetworkToken(address,address)", +"263ff8b9": "buildTokenId(uint256,uint256,uint256)", +"26407e36": "calculateSharesInTheRevenue(uint256,uint256)", +"26409047": "BDACoin()", +"2640b401": "SetRate(uint256)", +"2640f62c": "getTokenToEthOutputPrice(uint256)", +"26413760": "reducePlayersGooProduction(address,uint256)", +"2641d381": "totalNumberTokenSold()", +"26423259": "viewCoinSupplyAndFunding(bool)", +"2642567e": "coinData(address)", +"264282f2": "markTokens(address,uint256)", +"26428430": "_deleteInt(bytes32)", +"2643fc13": "spermlordReq()", +"2644f9f8": "getAssetsOwners(uint256)", +"26452036": "InitCountry(uint256,uint256)", +"264534be": "OMC(uint256,string,string)", +"26458beb": "firstPreSaleDate()", +"2646754d": "TestTokenA()", +"2646b176": "getPaimentStatus(address,uint256)", +"2646bce6": "LogWinner(uint8)", +"2646bfcb": "pay(uint256,uint128,address,bytes)", +"26470ae4": "getBonusFactor(uint256)", +"26476204": "stake(address)", +"26483bcd": "tokenMultiTransfer(address)", +"26484a44": "start3XPhase()", +"26487265": "contractExecuted()", +"26488531": "banMember(address,string)", +"2648a7e2": "EtherRedeemAccepted(address,uint256)", +"264934de": "submitTokenForEdit(uint256)", +"26493a6f": "setAllocateAgent(address,bool)", +"26496cab": "Milestone_IcoSuccessful(string)", +"2649cb10": "pNumberOfLockedTokens(address)", +"2649d62e": "multiMint(address,uint256)", +"264a3edc": "setPolls(address,address)", +"264a6d10": "get_next_asset_document_from_document(bytes32,bytes32)", +"264ae918": "withdrawChannel(address,uint256)", +"264b2b8e": "returnBalance(address)", +"264c22bb": "getAmountOfGene(uint256)", +"264c2cdc": "generateRandomNumber(address,uint8)", +"264c8e9a": "whatWasTheVal()", +"264caf14": "addVestor(address,uint256,uint256,uint256)", +"264d26e1": "ICO_CAP1()", +"264d7797": "tokensBought(address)", +"264dac0f": "endBorrowAgreement(string,uint256,uint256)", +"264e3018": "EtherDeltaHandler(address)", +"264f28fe": "getOwnerDeposit()", +"264f5718": "rondaSilla()", +"264f630d": "DonationReceived(address,uint256)", +"264faeb8": "getReportsCounter(uint256)", +"26500c84": "ResolverNode()", +"265028c2": "GetMaxBuyIn()", +"2650a47c": "withdrawEther(uint256,uint256)", +"26529836": "ADVISER_STAKE()", +"2652b4a5": "UDA()", +"2652c0f4": "hasVerifiedAttributeValue(address,uint256)", +"2652c757": "submitBracket(bytes32)", +"26532df8": "subZero(uint256,uint256)", +"2653ab19": "getMC(uint256)", +"2654e624": "ResumePayment()", +"265580f5": "setRegistryExecID(bytes32)", +"2655dd0b": "storeId(address,address,uint256)", +"26563b40": "whitelistManager()", +"2656455f": "claimEthFor(address)", +"2656b77d": "addToBattle(uint64)", +"2656da30": "setFuelContract(address)", +"26571388": "xpaExchange()", +"26591e79": "BONES()", +"2659d8ef": "setExchangeFormula(address)", +"265a3afd": "registerBase(bytes32)", +"265a8636": "_mintFish(address,uint32,uint8,uint8,uint8,bytes16)", +"265af6d1": "withdrawFundsAndPayRoyalties(uint256)", +"265b3e6c": "calculateIssueGoldFee(uint256,uint256,bool)", +"265b5d93": "getMaxLockAmount(uint256,uint256)", +"265c920f": "setBonusParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"265cdd88": "Bet(address,string,uint256)", +"265cfbbc": "Emitter()", +"265d900b": "wtech()", +"265dcbd3": "StandardTokenWrapper(address)", +"265f0393": "KryptopyCrowdsale(uint256,uint256,uint256,uint256,uint256,address)", +"265ffe2b": "ethMin()", +"26602470": "hashEIP712Message(bytes32)", +"2660316e": "plyrNames_(uint256,bytes32)", +"26605772": "renameTulip(uint256,bytes32)", +"2660b56c": "setData_2(string)", +"26617c28": "_setPaused(bool)", +"26625e46": "formatDecimals(uint256)", +"26627d80": "third_whitelistSupplier()", +"266361f5": "getLottoData(uint8)", +"26637579": "_removePlayer(uint256,uint256)", +"26638a38": "spin(int256)", +"2663a4ed": "byteToLower(bytes1)", +"26654d57": "refundParticipant(address,uint256,uint256,uint256,uint256)", +"266578d0": "_isRateActual(uint256)", +"26657c77": "Validate(string,string,string)", +"26663203": "withdrawFromEscrow(address,bytes32)", +"266710ca": "manualUpdateBalances_only_Dev()", +"266716f6": "GTSToken()", +"2667f407": "__proxy(address,bytes)", +"2668748d": "applyAuditorsCheckUpdate(address,address,uint64)", +"2669268b": "FUC(uint256,string,string)", +"266987ef": "p2pLocker(address)", +"26699576": "playSystem(uint256,address)", +"266b059e": "setSendAmount(uint256)", +"266b2eb5": "Conserve()", +"266bd375": "MyPizzaPieToken()", +"266bd901": "check_price(uint256)", +"266c2132": "_prand()", +"266cc170": "Y2J()", +"266ce248": "createPlayer(uint16)", +"266cf109": "record()", +"266d7bda": "lockupEndTime()", +"266d8299": "DriveholicToken()", +"266fc436": "producedSilverCaps()", +"266fc5d5": "totalContributorsProfit()", +"2670bdf0": "setERC777(address)", +"2670cc14": "transfekbolPlutocrat(address)", +"267127ec": "getTokenSettings()", +"267177eb": "sendPayout(bytes32,uint256)", +"2671b61d": "OfferRouting(bytes32,bytes32,uint256,bytes)", +"2671e253": "resetTraps(uint256)", +"26728b14": "rewardPXL(address,uint256)", +"2672b3e2": "SplitterEtcToEth()", +"2672c952": "seed_coins()", +"26735c06": "TOTAL_POOL_COMMISSION()", +"26736363": "APRInflationToken(uint256)", +"26741c88": "IcoMessage()", +"26744071": "WLCoin()", +"26745909": "PRNG_Challenge()", +"26746f5f": "updateGenerationRatio(uint256,address)", +"26748804": "BlockPoints()", +"2674899b": "getSaleHour(uint256)", +"267490aa": "turnOnPresale()", +"26749ad7": "approvedContracts(address)", +"267502c9": "setAquarium(address)", +"2675c123": "CloseContract()", +"26760d1d": "setMaxTms(uint256)", +"26767298": "RimuoviMiner(address)", +"26767cfe": "shareProfits()", +"26768b83": "_emitDestruction()", +"2677ef1b": "_seal(address,address,uint256)", +"26782247": "pendingAdmin()", +"267822c1": "finalizeChangeBurnBounds()", +"267835a4": "_removeBurner(address)", +"26798494": "EusdContract(address,address,address,uint256,uint256,uint256)", +"26798680": "toReal(int216)", +"267acd6c": "getPricesPerInterval(uint8)", +"267b6922": "entries(bytes32)", +"267c4ae4": "exists()", +"267c8507": "authorizeManager(address)", +"267f20a2": "_transferTo(address,uint256)", +"267ff78c": "approveRequestUnpause()", +"26811c09": "NVBToken()", +"26815de3": "updateGoldPrice()", +"2682644f": "PURCHASE(address,uint256)", +"26826bf8": "setImage(bytes)", +"2682a0ac": "CrowdsaleTokenExt(string,string,uint256,uint256,bool,uint256)", +"26834988": "numListed()", +"26839e53": "getUintValues(bytes32)", +"26839f17": "depositEther(uint256)", +"26843251": "presale1_startdate()", +"268451a2": "testFail_set_price_unauth()", +"26848a86": "setPicture(string)", +"26848b68": "checkCrowdsaleBalance()", +"26866160": "secondsBetweenReadings()", +"2687c645": "contributeInternal(address,uint256)", +"26881518": "setupFee(address)", +"2688454a": "U()", +"268855a4": "ParsecCrowdsale(address,address,address)", +"26887303": "TourCashStandardToken(uint256,string,uint8,string)", +"268959e5": "removeAdmin(address,address)", +"268a4559": "competitionStatus()", +"268b0459": "getRecordBalance(address)", +"268b5344": "PlanetOfOwner(address)", +"268b946c": "toUint8Throw()", +"268bb78e": "propose(address,bytes,uint256,uint256)", +"268bc65d": "signatureDropMultipleAmount(address[],uint256[])", +"268c969a": "emergencyDrawingReset()", +"268cb5f7": "queryCost(address[])", +"268d50fe": "ownerSetHouseEdge(uint256)", +"268da061": "CRFtoken()", +"268e7075": "toBytes2(bytes)", +"268ea7f6": "ReInvest(uint256)", +"268eb055": "setDescription(uint64,bytes)", +"268ef7e8": "holdAddress1()", +"268efdaf": "StdInt64(int64)", +"268f1153": "changeState(uint8)", +"268fe426": "dailyReset()", +"2690f0d5": "foundationLock()", +"269106e9": "dayCycle()", +"2692281d": "requestChangeBurnBounds(uint256,uint256)", +"2692de22": "sendAllFunds(address)", +"2693c150": "getPlayersTickets(address)", +"2693eca0": "devSFTDestination()", +"2693ed9b": "calcTokenSold(uint256)", +"2693ee80": "bonusPool()", +"269445db": "phase_6_rate()", +"26949220": "withdrawWonCosFromGame(uint256,uint256,uint256)", +"2694f6bb": "Log1_fnc(address,bytes32,uint256,string,string,uint256,bytes1,uint256,uint256)", +"26961b8c": "Token99chain(uint256,string,uint8,string)", +"26965dad": "deployStepOne()", +"269695fe": "groomVow()", +"269714dd": "maximumTarget()", +"269724ef": "assertEq6(bytes6,bytes6)", +"26976e3f": "upgradedAddress()", +"26987b60": "currentIndex()", +"2698eec9": "logFeeTokenMinted(address,address,uint256)", +"269975d0": "GameDetails(uint256)", +"2699a7e7": "setPOOL_edit_31(string)", +"2699c808": "tradeOption(address[3],uint256[3],uint256[2],bool,uint256,bool)", +"269a7c3f": "buyAndTransfer(address,address)", +"269aacc8": "getDividendPayout(uint256,uint256,uint256)", +"269b0737": "DaoCasinoToken()", +"269c4bca": "viewFoundersTokens()", +"269c6ece": "lockedTwoHasEnd()", +"269cdaac": "withdrawLockedTokens()", +"269db987": "calculateBonusAmount(uint256,uint256)", +"269de5a0": "EpicExchange()", +"269e4f3c": "refundWei()", +"269eb58c": "setFeeFromPayer()", +"269ecc6d": "backersAddresses(uint256)", +"269ecf28": "submitBuyOrderWithPosition(bytes32,uint256,uint256,uint64,bool)", +"269f4663": "approveMintTokens(address,uint256)", +"269f96c9": "presaleSoldTokens()", +"269fe82e": "calcBurnAmountFromFeeBurner(uint256)", +"26a09392": "addSecondaryAddress(address,address)", +"26a1529e": "amountOfStakeReturnedOnCancellation(uint256)", +"26a18375": "setAvailability(bool)", +"26a21575": "tokenRaised()", +"26a26f71": "TgeTeamReleasingScheduleContract()", +"26a3bd4e": "subtractBalance(address,address,uint256)", +"26a3f45d": "initOwner1(address)", +"26a4861c": "CROWDFUNDING_PERIOD()", +"26a49e37": "price(uint256)", +"26a4c847": "maxLendingItem()", +"26a4e8d2": "setTokenAddress(address)", +"26a52019": "agentMakeOrder(address,address,uint256,uint256,address)", +"26a5a554": "removeFromReceiveAllowed(address)", +"26a65c10": "createDigitalArtFee()", +"26a6dfed": "toogleTransfers()", +"26a7985a": "getMaximumCallGas()", +"26a82e8b": "autoPreSaleSuccess(address,uint256)", +"26a8d1e5": "_changeManagerImpl(address)", +"26a934f5": "minResalePercentage()", +"26a9408c": "returnTokensFromHoldBountyAddress(uint256)", +"26a9de53": "verifiedTransferFrom(address,address,uint256)", +"26aa101f": "isTokenRegistered(address)", +"26aa7c58": "addBuyer(address,uint256)", +"26ab378b": "addMood(string)", +"26abc9ab": "CmctSale(address)", +"26abfe09": "burnUndistributed()", +"26ad3abc": "startTimeStage3()", +"26ad7b40": "_doesEveryTokenHaveLockupPeriod()", +"26ad8d1b": "getPositionStartTimestamp(bytes32)", +"26ae27d6": "lonmemay()", +"26aeba91": "FarziTokenSale()", +"26aebfac": "delPack(uint8,uint128)", +"26afe980": "queryOracle()", +"26b238d8": "doom()", +"26b3293f": "deposit(address,uint256,bytes32)", +"26b387bb": "pendingReturns(address)", +"26b3a6f8": "SelfKeyToken(uint256)", +"26b41613": "processFunding(address,address,uint256,uint256)", +"26b45b09": "rateTier4()", +"26b4ce7f": "NP(uint256,string,string)", +"26b51c8c": "finalBlock()", +"26b52faf": "firstWithdrawAmount()", +"26b66cb7": "amendedEarlyPurchases()", +"26b6c0b4": "settingsSwitchTransferAccess()", +"26b7d803": "getTotalBuyCount()", +"26b7fe35": "GainStuff(address,uint32,uint256)", +"26b85ee1": "myAddress()", +"26b85f0d": "mininumContributeUSD()", +"26b916b4": "Set_Interest_Rate(uint256)", +"26b92a0e": "SomniumToken()", +"26b93939": "Jokercoin()", +"26b9ce13": "setTransfersEnabled(bool)", +"26ba1c19": "addBagAndGiftAtTime(uint256,address,uint256)", +"26ba2e47": "paidETH(address)", +"26ba4319": "setDirector(address)", +"26baca1c": "getStats2()", +"26bca0f8": "get_my_info()", +"26bceb59": "mul256(uint256,uint256)", +"26bd4d96": "adPriceMultiple()", +"26bd78b9": "LogEvent(uint256,address,bytes4,bytes,uint256,uint256)", +"26bdd20b": "getNominatedMediator()", +"26bdd814": "refundPresale()", +"26bf02cf": "getBaseLevelUpFee()", +"26bf2051": "KickCommitteeVoteEvent(address,address)", +"26bfcde0": "GMCToken()", +"26bfd35c": "rewardAD()", +"26c009cb": "privateIcoSold()", +"26c0ad3a": "allowRefunding(bool)", +"26c19eba": "readValue(bytes32,uint8)", +"26c1e750": "planets(uint256)", +"26c21722": "getwithdrawEtherToAddressValue()", +"26c2bcb4": "checkBenefit(address)", +"26c30b50": "BITS(uint256,string,uint8,string)", +"26c32ff5": "demi(uint256,string,string)", +"26c387fa": "testFail_mint_without_add_authority_to_controller(int256)", +"26c3d6f8": "get_deposit_term(address,uint256)", +"26c435a9": "totalUsdFunding()", +"26c43d8f": "hodlerTotalCount()", +"26c47909": "SXCToken()", +"26c4b863": "XIOToken()", +"26c4fa3d": "setOfficialGameUrl(string)", +"26c5c154": "employeeAddress()", +"26c6d361": "FanCoin()", +"26c7edaa": "flip4(bytes)", +"26c81320": "lastgamewinner()", +"26c93389": "removeFreezableAddress(address)", +"26c989df": "holdBalance()", +"26c9959f": "LoveToken()", +"26c9bc42": "setTokenInformation(string,string,uint256)", +"26c9e547": "bestow(bytes32,uint256,address)", +"26ca1280": "_addToken(address)", +"26cb2257": "outRate()", +"26cb83b9": "setDescrutionContractAddress(address)", +"26cbb8ff": "inviterRegister()", +"26cbe6f5": "getHeroAvailableAt(uint256)", +"26cc2256": "blockRewardAmount()", +"26ccd77a": "withdrawStuckEther(address)", +"26ce3da0": "collectRefund()", +"26cee3a7": "getPlayerId(bytes32,bytes32,address)", +"26cf53b9": "BTL_PERSIAN()", +"26cf660d": "trustedOrderbook()", +"26cf9165": "pixelgrid()", +"26cfc76f": "TriPinCoin()", +"26d0d75a": "ResolutionProposals(uint256)", +"26d111f5": "note()", +"26d29ce0": "refundBid(uint256)", +"26d2b840": "addDadRelation(address)", +"26d2cba5": "updateMetaData(bytes32,bytes32,bytes32,uint256,bytes32,bytes32)", +"26d2eb11": "stopPostIcoAndBurn()", +"26d312f7": "sendWebGiftToken(address,uint256)", +"26d3325d": "getExpectedPayment(uint256)", +"26d3bde5": "execCUSEOption()", +"26d3df61": "deedsOf(address)", +"26d3e7e8": "inititalSupply()", +"26d3e889": "testCreateWithParentsForeign2()", +"26d3ed0a": "isSpentCustomerTxPaymentForMCW(address,bytes32)", +"26d541b0": "totalPlayerCount()", +"26d64f3b": "readTeam(bytes32)", +"26d6eca3": "retrieveReward(uint256)", +"26d7b3b4": "unRegister()", +"26d83db8": "LoveYToken(uint256,string,uint8,string)", +"26da881f": "setPrivateFundStart(uint16,uint8,uint8,uint8,uint8,uint8)", +"26da8e17": "ownerUpdateCostToCallOraclize(uint256)", +"26db3c0a": "tokenIssue(address,uint256)", +"26db7648": "proposedVersion()", +"26dcbcfc": "catPaymentCollector()", +"26dd1510": "pixelblockPrice(uint24,uint24,uint24,uint24)", +"26dd860a": "mintUniqueTokenTo(address,uint256,string)", +"26ddaebc": "getPriceWithBonus()", +"26dec45e": "getUserUsername(address)", +"26defa73": "addAuthority(address)", +"26df61f6": "permittedContractsCount()", +"26dfb6b4": "advteamPool()", +"26dfe583": "partialDivest(uint256)", +"26e010c8": "minInitialMarginAmount()", +"26e137c2": "getInterfaceImplementationStatus(address,bytes4)", +"26e23485": "renamingCostsPerChar()", +"26e33670": "NewQuiz(string,bytes32)", +"26e41a3e": "airdropTokens(bytes32,address[],uint256)", +"26e43db5": "TransferSell(address,address,uint256,string)", +"26e501a8": "BitonlineStore()", +"26e56c05": "SaleCapReached()", +"26e5ab38": "changeMaxWithdraw(uint256)", +"26e5afdf": "Yinfiniti()", +"26e5b0be": "stopMulti()", +"26e6050d": "setParamsIco(bool)", +"26e6074b": "frozenBalance()", +"26e683fb": "NotitiaToken()", +"26e72d31": "resetCurrentRoundSales()", +"26e770e9": "Information()", +"26e77179": "PaymentRefunding(uint256,address,uint256,string)", +"26e80650": "upPlayerRound(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"26e85250": "viewRequest(uint256)", +"26e89689": "applyForCertifition(address,string,uint256,string,uint256,bool)", +"26e8cd23": "bobMakesEthDeposit(bytes32,address,bytes20,bytes20,uint64)", +"26e90775": "calculatePrize(uint256,uint256,uint256)", +"26e97fce": "allowMint(address,uint256)", +"26e9fd9e": "remove(bytes20)", +"26ea66bf": "Mortal(address)", +"26ea74e2": "approvedDividendsOf(address)", +"26ea7ab8": "changeadmin(address)", +"26ea9268": "FEE_SELECT_MAX_VALUE()", +"26eaee92": "devReward()", +"26ebc8af": "UserAuthorizedForToken(address,address,address)", +"26ebe0bf": "totalCentsGathered()", +"26eca77c": "HelloGoldRound1Point5()", +"26ed274e": "decreaseBurnApproval(address,uint256)", +"26ed794b": "mobilinkTeamAddress()", +"26eda1ac": "putMessage(string)", +"26ef8ba1": "putEth()", +"26f08aec": "setotherchainstotalsupply(uint256)", +"26f09042": "testThrowNoFreeTokens()", +"26f1069f": "approvePresale(address)", +"26f21080": "allowedToTransferOf(address)", +"26f2458a": "RequestP(bytes32,bytes32)", +"26f35ff2": "activenessUpgrade(uint256,uint256)", +"26f3ceaf": "TSToken()", +"26f4739e": "LogBuyTokens(address,uint256,uint256)", +"26f489f6": "_updateCardPerkText(uint256,string)", +"26f4b3de": "userTakeOrder(address,address,uint256,uint256,address)", +"26f590f6": "setAttribute(string,string,bytes)", +"26f59b8b": "ProICOHardcap()", +"26f6ec3b": "getCities(uint256[])", +"26f743d0": "createGuess(uint256,uint256,uint256,uint256)", +"26f78835": "XXXChain()", +"26f86791": "_indexOf(string,string,uint256)", +"26f8abf9": "getRankOnePlayer(address)", +"26fa9082": "Enumivo()", +"26faae42": "addChild(address,bytes32,bytes32)", +"26facdb1": "TeamTokenDistribution(address)", +"26fae0d3": "setMaster(address)", +"26faf1e9": "SVLightIndex()", +"26faf9c2": "EatMeCoin(address)", +"26fc4c7f": "returnTokens(address,uint256)", +"26fc71eb": "isConfirmedGblock(bytes32)", +"26fd8422": "calculateEggBuy(uint256,uint256)", +"26fdb484": "OwnershipRevoked(address,address)", +"26fe18e2": "setMintingOracle(address,address)", +"26fe2024": "newRate(string)", +"26fe7cf2": "createStar(uint8,uint16,string,string)", +"26fe9951": "delegatedFrom()", +"26feba74": "MaorTestCoin()", +"26fed988": "addCancelledOrFilled(bytes32,uint256)", +"26ffa189": "setEnableWhiteList(bool)", +"2700615c": "_getShipInfo(uint256)", +"27018631": "icoBonus()", +"2701d40f": "ForSale()", +"2701ebd8": "NDT3()", +"27028aae": "voteOnBounty(uint128,uint256,bool)", +"27029357": "addToReceiveAllowed(address)", +"27029e83": "BurnToken(address)", +"2703506f": "CouponDeposit(address[2],uint256[8],uint8,bytes32[2],uint256)", +"2703e545": "projectInfoPublic(address)", +"2704355c": "setGenesisCallerAddress(address)", +"2704e8e9": "addRemovableIdArrayItem(address,uint256[],string,string,string,address)", +"2704ead4": "_isValidSkin(address,uint256,uint256)", +"27053417": "_updateSeed()", +"270537c0": "lockReserveTokens(address)", +"2705ce6a": "setAuditorDelegate(address)", +"27066ebb": "getOwnedTokensIds(address)", +"27071f6a": "_tokenOfOwnerByIndex(address,uint256)", +"270835d0": "allocateBid4a(bytes32)", +"2708a710": "MintHelper(address,address,address)", +"2708db73": "requestLeave(uint256,string)", +"270a3856": "startDist()", +"270a5420": "buyFST()", +"270a8ef7": "existingMarketOrder(uint256)", +"270abf36": "getChickenAmount()", +"270ba309": "getRegistryDataInitialized()", +"270bb8ad": "setImmigration(address)", +"270bfc07": "fundingAccount()", +"270cf206": "ENSReverseRegister(address,string)", +"270cfee1": "getTokenAccount()", +"270d13fb": "isCoinIdUnique(uint16)", +"270dc9fd": "changeName(string,uint256)", +"270e4cf0": "buyerAddressTransfer(uint256,address,address)", +"270ef385": "CLAIM_AMOUNT()", +"270f611f": "burnBalances()", +"270f7219": "getJntController()", +"270f9359": "Exploit(address)", +"270fdd1a": "GricCoin()", +"2710ddcb": "setMsg(bytes32)", +"27120de9": "numberOfStarsReserved()", +"27121069": "verify(bytes,uint8,bytes,bytes)", +"27121b76": "claimDailyLoot(uint256)", +"2712d916": "setSanTTTCost(uint256)", +"27132be6": "getCustomBuyerMappingCount(address)", +"27136e46": "changeTransactionService(address)", +"2713a1b4": "getUserWithdrawnBalance(address)", +"27150f01": "devFeeSize()", +"27151526": "nextBid()", +"27158b7b": "MFToken()", +"271619fb": "CreateContract(int256,int256,uint256,uint256,int256,address,string,uint256,int256,string,uint256)", +"27164f15": "getBuyOrdersInfo()", +"2716783d": "distributeERG(address[],uint256,uint256)", +"2716baa6": "startContruibute()", +"271761c0": "EventSuccessfulTraining(uint64,uint64,uint64)", +"271781ad": "getRestSumStageICO()", +"2717cc7c": "ParticipatedInVoting(address,address,bytes32,uint256)", +"27180e42": "wantItMoreThanYou(uint256)", +"27187991": "setEtherPrice(uint256)", +"271a50db": "setAgonFight(address)", +"271af8c1": "tokenCollector()", +"271b3e8a": "snakemasterReq()", +"271b5311": "getValidateSignatureAddress(address,string,uint256,uint8,bytes32,bytes32)", +"271bac4a": "setBonusPhase(bool)", +"271c34d7": "denyProposal(uint256)", +"271cacbf": "batchAddToWhitelist(uint256,address[])", +"271cd760": "getPackageDb()", +"271d9090": "HenryToken()", +"271dd15b": "getWinNumberAddress(uint256,uint256)", +"271dec50": "Invested(uint256,address,uint256,uint256)", +"271df6e5": "canLotteryFree()", +"271f88b4": "setAmount(uint256)", +"271fe8be": "buyNormal(address)", +"2720e4f6": "LC()", +"27213345": "totalSupplyToken()", +"2721a114": "queryWinner(string)", +"2722692c": "lastBlockSet()", +"2722c043": "raiseEventIfMinted(address,uint256)", +"27234ecc": "takeBalance(address,address,uint256,address)", +"2723639b": "getPixelAreaColor(uint256,uint256,uint256,uint256)", +"2724312a": "Micropayment(address)", +"27243160": "bookmark(string)", +"2724e032": "manualEndDay()", +"27258b22": "isRegistered(bytes32)", +"2726403a": "testCanTrade(address,address)", +"2726a530": "getHodlHasBeenWithdrawn(uint256)", +"2726b506": "getDeposit(address,uint256)", +"2726f061": "commitVotes(address[],bytes32[],bytes32[],bytes32[])", +"27270550": "swapAble(bool)", +"27275a35": "SuretlyToken()", +"2727d018": "PlusPayLite()", +"272870ac": "pausable(bool)", +"272894ca": "refundTokenBet(uint256,uint8)", +"27295d7c": "updateMaxPhase2(uint256)", +"272961ff": "depositAgent2(uint256,uint256,bytes,uint256)", +"2729f44e": "addTxToRegistry(bytes32,bytes32,uint256,uint256,uint256)", +"272a33e8": "allocateBid2(bytes32)", +"272a3e16": "PlayerWon(uint256)", +"272a847f": "HAICrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"272ae0b5": "MIMIMUM_CONTRIBUTION_AMOUNT_PREICO()", +"272caf69": "stakeContractAddress()", +"272cda88": "EternalDB()", +"272d20e7": "amount_direct()", +"272e20fa": "__abort__()", +"272edeac": "currentMineTokenAmount()", +"27301964": "withdrawDevTokens(address,uint256)", +"2730e4a2": "_arrangeMasternodeFlow()", +"273123b7": "delBot(address)", +"27315b5f": "Settlement(address,address,uint256,string,string)", +"27329380": "getRecentPlayersCount()", +"27329b05": "enableBot(address)", +"27332624": "_lottery(uint256,address,address)", +"27341c8a": "isEmpty(string)", +"2734242b": "BunnyToken()", +"273696cd": "SetImplementation(address,address)", +"2736a558": "removeBackdoor()", +"2736f6d9": "setTokenAndRate(uint256,uint256)", +"2737033f": "initialize(address,uint256,uint256,uint256,uint256,uint256,address,address)", +"27374015": "functionFive()", +"27378684": "price4()", +"27380c2c": "updateAngelCardSeries(uint8,uint64,uint64)", +"2738154e": "checkRokBounty()", +"2738a112": "triggerSelfDestruction()", +"2738bf4d": "addLeaderboard(string,string,uint256)", +"2738ed25": "Player_Bettings(uint256,uint256)", +"27393390": "setTokensMultiplier(uint256)", +"273a041c": "_self()", +"273a5729": "eligibleTokens()", +"273afe15": "ParisToken()", +"273b1dd3": "RealMadridvsLiverpool()", +"273b1fb3": "betbucketOne()", +"273b465b": "verifiedAgeOver(address,uint256)", +"273ba6bb": "ICO()", +"273bc3c9": "numberOfThrones()", +"273ca81c": "getMegaBalance()", +"273cb593": "isMasterOfCeremonyRemovedPending()", +"273cbaa0": "getTokenList()", +"273cc2a5": "depositOpen()", +"273dd51f": "_distributeHorse()", +"273e2c78": "F2UPay()", +"273ea3e3": "incrementNumber()", +"273f1de7": "paySellerFee(bytes32,address,uint256)", +"273f4940": "set(bytes32,uint256)", +"273f9ace": "getNumbers(bytes32[])", +"273f9bed": "signedTransferFromCheck(address,address,address,address,uint256,uint256,uint256,bytes,address)", +"273fd520": "EthlanceFeedback(address)", +"2740509d": "urbitTeamTokensVault()", +"2740e64b": "getInitializeParentPayoutDistributionHashValue()", +"27411dfd": "getPoliceFee(uint256)", +"27413437": "grantFounderToken()", +"2741876a": "totalPresses()", +"2742d511": "setWhitelistedStatus(address,address,uint256)", +"27436b59": "getCarCount()", +"274465b4": "payForMyself(uint128)", +"27457b3b": "getMyInventory()", +"27458664": "enableTokenMinting()", +"27458cbc": "disallowClaimer(address[])", +"274748e6": "setInactivityReleasePeriodForToken(address,bool,uint256)", +"2748503f": "ChangedOwner(address,address)", +"27486a7c": "combineCards(uint256[])", +"2748d7e4": "claimPlotWithData(uint256,string,string,string,string)", +"2749bd81": "getTimestamp(address,uint256)", +"274a1f29": "setNextLotteryTTMTokenId4(uint64)", +"274a9b1c": "addressToEtherContributed(address)", +"274acb35": "add(uint96,uint96)", +"274b1615": "keyValidations(address)", +"274b3df4": "deposit_eth()", +"274b9bc5": "ETHx2()", +"274bc107": "test_threeValidEqBytes()", +"274c343a": "HTCCToken()", +"274c7922": "privilegedAddress(uint256)", +"274db4d6": "_price_tokn_PRE()", +"274ed288": "debtBalanceOf(address,bytes4)", +"274f97bb": "buyReply(uint256,uint256)", +"274faa9f": "minContributionUnits()", +"274fadf6": "updateServiceDescription(address,uint32,string)", +"274ff7ce": "burnFrom(uint256)", +"27506099": "getCountPlayersOfOwner(uint256,address)", +"27507458": "isLive(uint256)", +"2750fc78": "setIsActive(bool)", +"275103fd": "hault()", +"27521702": "mint(int256,address,uint256,bool)", +"2752808a": "CAPcoin()", +"2752de56": "addMoneyPool(address,address)", +"27538e90": "getCapabilityRoles(address,bytes4)", +"2753d7f2": "artworksFactory()", +"2753f254": "workedTodayInSeconds()", +"2754ff69": "test_2_ensureProposalExecution_increaseBlocksBy100()", +"2755a13b": "forceClose(uint256)", +"2755cd2d": "tip()", +"275601f6": "getAllProviderParams(address)", +"27566b80": "transferCollectedEther(address)", +"275676cf": "ClassicVolkswagen()", +"27567c4c": "setIsPoop(string)", +"2756d38a": "IonChain()", +"27571087": "getBonus(bytes32,uint8)", +"2757a07c": "SSDDTT(uint256,string,string)", +"2757e976": "transferredIndex()", +"2758743c": "LATINOToken()", +"27589224": "minBuyingRequestInterval()", +"275893a9": "updateMaintenanceAddress(address)", +"27593eee": "ChangedName(address,string)", +"27597f0a": "costForProductCycles(uint256,uint256)", +"2759ea4a": "lookupSprite(uint256)", +"275a1334": "buySellPrices()", +"275a329a": "BCASToken(uint256,string,string)", +"275a92cf": "TokenPurchase(uint256,uint256,address,address,uint256,uint256)", +"275acbe3": "ln(uint256,uint256,uint256)", +"275b6eb0": "calculateSeedSell(uint256)", +"275babee": "getRareInfo(uint256)", +"275be02c": "MRBLToken()", +"275beec6": "createItem(uint256,string,address,uint256,string,string,uint256)", +"275bf230": "addAddressToAccount(address,address)", +"275c82ca": "GasUsed(uint256)", +"275cb687": "setNextPoolPercentage(uint256)", +"275ccb13": "computeLeaf(uint256[],uint256)", +"275d60bc": "getReturnAddress(address)", +"275e2d3f": "st4ckCount()", +"275e2f86": "MORCoin(uint256,uint256,uint256,address)", +"275e5da5": "probe(address)", +"275f3d92": "view_readyTime(address,address)", +"27608c24": "unsoldToken()", +"2760c57e": "lastPing()", +"276184ae": "erc20Address()", +"2762484a": "SBIToken()", +"2762cf10": "contract_transfer(uint256)", +"2763d8fb": "FabCoin()", +"2765faae": "MaximalInvestmentTimeTresholdChanged(uint256)", +"276605bc": "updateFundingStartBlock(uint256)", +"27669781": "emitInfo(uint256,uint256,address,uint256,uint256)", +"27678dca": "getHWCAddressCount()", +"27687d34": "advisersTokenTimelock()", +"276920eb": "setOwnerTokenPercentage(uint256)", +"276927c5": "sellSpaceship(uint256,uint256)", +"2769b96b": "updateItemPrice(uint256,uint256)", +"2769c89a": "setGameStartTime(uint256)", +"276a28a3": "isTokenLocked(uint256)", +"276b94e1": "copypaste()", +"276bf637": "isTimedout(uint256,uint256,uint256)", +"276c9d0a": "balanceOfOld(address)", +"276cd2e8": "BTTPERETH()", +"276e3968": "bits(uint256,uint256,uint256)", +"276e6472": "deleteById(string)", +"276ebc6a": "ChargeTest()", +"2770a488": "transferWithIndex(address,uint256,uint256)", +"2771083f": "setSpreadPercent(uint256)", +"27729e93": "openLottery(uint8)", +"2772dffd": "votes(bytes8)", +"27731e77": "setCCH_edit_9(string)", +"27734225": "getCommitteesNumber()", +"2774d052": "mintPresell(address,string)", +"277576ca": "theTurn()", +"27757c49": "isVariation()", +"2776a859": "computeResponseSecondHalf(uint16)", +"2776b163": "setstoredaddress(address)", +"27773ba2": "addrAirDrop()", +"27782e42": "refreshActiveShareholdersArray()", +"27783050": "getEntryHash(address,uint256,bytes32)", +"27793f87": "outcome()", +"277942db": "marriageLicenceImageIPFShash()", +"27796092": "t4tToken()", +"2779ea96": "addPostOnBoard(address,address,address)", +"2779eb52": "setUserRank(address)", +"277a6889": "calculateInterest(uint32,uint256)", +"277ad1f6": "amountSellForOneEth()", +"277ad5d8": "secondRoundMayDiscount()", +"277ad6d4": "PreSaleResumed()", +"277b2db6": "getPlayerVaults()", +"277b6527": "targetCrowdsale()", +"277b8ffc": "getBeneficialAddress()", +"277ccada": "unlistTrophy(uint256)", +"277ccde2": "getHKGPrice()", +"277d4725": "getEthereumToken()", +"277e1b16": "changeMaxDonationLimit(uint256)", +"277e1de7": "transferAccessory(address,address,uint64)", +"277e268e": "testFail_set_label_unauth()", +"277ea83d": "getTrustPlatform()", +"277f6331": "ETVRToken()", +"277fc0e9": "getSignature(address)", +"277fc17d": "daysToSeconds(uint256)", +"277fef99": "transferPoint(uint32,int256,address,bool)", +"27806a16": "DoxCoin()", +"2780d22b": "getMigrateMarketInFromNiblingCalled()", +"27810b6e": "burner()", +"27815883": "_setHairValue6(uint256)", +"27816235": "onSaleEnded()", +"27816932": "AdaptableToken(uint256,uint256)", +"27816ffc": "logMarketFinalized(address)", +"2781c3d1": "ownerSetdiceRollAddress(address)", +"2782ca8d": "MINIMUM_PURCHASE_IN_USD()", +"27836f77": "setImageData(uint256)", +"2784ad48": "computePayment(uint256,uint256)", +"2784d868": "getMiniPoolEdit_2()", +"2784e3f3": "refundVotingTokens(address,address)", +"27854452": "allocateAgents(address)", +"2785ed21": "LogCertificationDocumentAdded(address,bytes32)", +"2785fb98": "getContributionETH(address)", +"27860587": "TXToken()", +"27869c57": "gluon()", +"2786f089": "setUserAllocMin(address,uint256)", +"2787fac2": "LordCoinPreICO(address,address,uint256,uint256,uint256,uint256)", +"27880e1f": "KyberNetwork(address)", +"2788f4f3": "OraclizeCallback(bytes32,string)", +"2789192f": "isConfirmedSettingsRequest(uint256)", +"27895f13": "_advanceClock(bytes32,uint256)", +"27899ce2": "allowNewReceiver(address)", +"27899d9b": "LGOToken()", +"278a3684": "advisorAmount()", +"278a4c4f": "setMasterToReferral(address,address)", +"278a5e7c": "cancelScript(address)", +"278ab692": "startDispute(address)", +"278af72c": "isSaleClockAuctionStorage()", +"278b8c0e": "cancelOrder(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"278bb4a2": "EthealDeposit(address,address)", +"278bee92": "_receiveMakePlant(address,uint256,uint256)", +"278c284c": "CrowdsaleToken(string,string,uint256,uint8)", +"278c2977": "chooseOpponentForGladiatorBattle(uint256,uint256,bytes32)", +"278c3030": "phase_2_Time()", +"278c4d71": "peaceOfTRC20(address,uint256)", +"278c688e": "getBackToken(uint256)", +"278cc714": "getUsablePlayerFibokens(address)", +"278d6e5b": "funcArrayInArguments(address[],address[])", +"278d818c": "setMaxRankingSpots(uint8)", +"278d9637": "limitTransfer()", +"278e07ce": "setStatus(address,uint8)", +"278e72da": "_destroy(uint256)", +"278e9d03": "testMemoryIntegrityCheck33Bytes()", +"278ecde1": "refund(uint256)", +"278f05ba": "SolomexCrowdSale()", +"278f2ab8": "deposit(bytes32,uint256,uint256)", +"278f49b9": "SetupRaffle(string,string)", +"278fcffa": "accountsLastClearTime(address)", +"278ffa13": "confirmTopUpLimit(uint256)", +"279029b3": "remainingARXSupply()", +"27904ee0": "getRabbitMotherSumm(uint32)", +"2791cb17": "setClientLastSupplyID(address,uint256)", +"2792949d": "BTC()", +"2792e765": "transferCroupier(address)", +"27933ffa": "LYToken()", +"27939ea2": "issuerReservedMaximumPercentage()", +"2795348d": "KittenSelfDrop2()", +"279586f3": "AltBuy(address,uint256,string)", +"27960c5f": "validateEndowment(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"279616fe": "TransferDissolved(address,address,uint256)", +"27962fc1": "tokensAmount(uint256)", +"27970ea1": "updatePlayerRecommendFund(address,uint256,uint256)", +"27972584": "MintRestarted()", +"27972b99": "StarterToken()", +"27972e8f": "GRVToken()", +"27979b35": "genLevelExpGain()", +"2797e0c3": "getInitBlockNum()", +"27987533": "defaultResolverChanged(address,address)", +"2798cecd": "requestData(address,uint256,uint256,bytes32,address,bytes4,bytes32,bytes)", +"2798d1b2": "my_token_balance()", +"2799276d": "totalItems()", +"279a34f1": "switchSaleStage()", +"279a475f": "TJToken(uint256,string,uint8,string)", +"279aa01f": "getManualAddress(uint256)", +"279b4e76": "createAuction(uint256,uint256,uint64,uint256)", +"279b9562": "initIntervals()", +"279b9c7b": "HJToken()", +"279bad16": "fuel()", +"279c7425": "getTokensOwed(address,uint16)", +"279c94c0": "admin_add(address)", +"279cea35": "execScript(bytes,bytes,address[])", +"279ddc64": "SetBankerCandidate(uint8,address)", +"279e02a0": "getMemberDividendsAmount(address)", +"279e0912": "getDownloadPrice()", +"279e1c43": "_createCollectible(uint256,uint256)", +"279e79b5": "ZebiCoinCrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"279f5d31": "pop1()", +"279fdf6d": "trustedVault()", +"279fdf96": "setPresaleMarketAddress(address,address)", +"279fe967": "maxEthCapSellInFp()", +"27a030eb": "getRandomLotteryTicket()", +"27a06733": "setKycRequirement(address,bool)", +"27a099d8": "getOperators()", +"27a0d669": "getImplementation(string,string)", +"27a1a414": "allowedLocks(uint256)", +"27a1d948": "doubleDown(uint256)", +"27a1f35a": "setOpenStatusEgg(uint256,bool)", +"27a21061": "to_start_ico()", +"27a2aee2": "Commission()", +"27a3181d": "price2()", +"27a3e16b": "setBlockRewardContract(address)", +"27a3fe41": "getMintLimit(address)", +"27a49cbe": "BankrollLending(address,address)", +"27a5428b": "setLevel(uint256)", +"27a5b3bc": "transitivePath(bytes32,bytes32,bytes32)", +"27a5c7c6": "voteDecline(uint256)", +"27a5e952": "testDecimalsUsingDeployedContract()", +"27a69644": "checkTransferDelegated(address,address,uint256,uint256,uint256,bytes)", +"27a6a7de": "newMinimalEthers(uint256)", +"27a75474": "salvageNotAllowedTokensSentToContract(address,address,uint256)", +"27a7b827": "updateExistingMember(address,uint256)", +"27a7c883": "transferWithExtra(address,uint256,bytes32,bytes32)", +"27a822df": "smart()", +"27a82833": "_supportsInterface(address,bytes4)", +"27a8890e": "withdrawedCoummunityCounter()", +"27a910dc": "ownerWithdrawETH()", +"27a936d7": "BlockchainBattleground()", +"27a93cce": "playerGetPendingTxByAddress(address,address)", +"27a9ec0f": "IDice()", +"27ab6871": "addCandidateByIndex(uint256,address,bytes32)", +"27ab9f20": "botIndexToOwner(uint256)", +"27ac36c4": "reserveTokens()", +"27ac4b70": "getNamespace()", +"27ac7934": "transferPAIReceiptOwnership(address)", +"27ac9e5f": "periodNow()", +"27acfff9": "badgeFreeze(address,uint256,uint256)", +"27add9fb": "VoxelRepainted(uint8,uint8,uint8,uint8)", +"27ae587c": "MAX_TOKEN_REWARDS()", +"27ae949f": "buyFST0(address)", +"27aeafb7": "AuditorUnregistered(address)", +"27aedd10": "Founders()", +"27aeeaa8": "AxiePresaleExtended()", +"27af1d98": "disToken(address)", +"27af7d9c": "assertEqDecimal(uint256,uint256,uint256)", +"27af9e38": "space()", +"27b00b3e": "setUpdateState(bool)", +"27b022af": "MembershipChanged(address,bool)", +"27b075a7": "FlCToken()", +"27b0c674": "updateEtherBalance()", +"27b37367": "parseLoanOffering(address[9],uint256[7],uint32[4],bytes)", +"27b380f3": "withdrawalRequests(address)", +"27b3a83c": "buyAtIndex(uint256)", +"27b3bf11": "claimTime()", +"27b44a6c": "pendingWeiAmount()", +"27b4634e": "transmuteTransfer(address,uint256,address,string,string)", +"27b4e228": "setPoolFeeRate(uint256)", +"27b55475": "review(string,bool)", +"27b57aee": "emissionContractAddress()", +"27b57fcc": "sumValues(uint256,uint256)", +"27b5985b": "addToException(address)", +"27b5aaf8": "RESERVE_TOKEN_AMOUNT()", +"27b5db8a": "addPlayer()", +"27b752b8": "sha3HexAddress(address)", +"27b7a2f5": "nameRegistryAddress()", +"27b7cf85": "log(bytes32)", +"27b7d0a6": "EditDomain(string,string)", +"27b96df7": "pausePayment()", +"27b972f9": "getNameOwner(string)", +"27b9c257": "setRequestProcessed(uint256)", +"27bb020a": "altarCut()", +"27bb1db7": "SOPToken(string,string,uint256)", +"27bb2d82": "_checkPixelIdExists(uint256)", +"27bb3d0f": "eth_price()", +"27bb46f0": "removeActiveArray(address)", +"27bb6d8e": "buyoutCost(uint256)", +"27bbea3a": "setWhiteListAddress(address)", +"27bc39c0": "submitCanonicalCandidate(bytes,bytes,bytes,bytes)", +"27bcc9ca": "finalizeConfig()", +"27bce91b": "betId()", +"27bd56d9": "sendAuctionQuery(uint256,uint256)", +"27be1b35": "promoCode()", +"27bf6568": "authorityBalance()", +"27bfeaf5": "setGemPrice(uint256)", +"27c16605": "getBidByProducerAndDay(address,uint32)", +"27c1f423": "preBuy1()", +"27c2e437": "buyTokensFromBalance(address,uint256)", +"27c36a47": "specialAllowance(address,address)", +"27c39749": "test_oneValidEqBytesUint(int256)", +"27c42050": "buildIdentifier(address,address,address,bytes32,uint128,uint128,uint256,uint32,uint64,uint64,string)", +"27c4a208": "GSCoin()", +"27c4bde8": "Planethereum(address,address)", +"27c5cdea": "test2(address[5],uint256[5])", +"27c5e534": "mixDNK(uint256,uint256,uint256)", +"27c67440": "getWarranty(string,string,address)", +"27c6c720": "privateWallet()", +"27c725e1": "applyforCetification(string,string,string,string,string,string,bool)", +"27c78c42": "request(address)", +"27c7ff61": "noShares()", +"27c81eb8": "TestDRMK()", +"27c830a9": "emergencyPaused()", +"27c8dae5": "getAmountOfLinkerBuy(uint256)", +"27c96207": "WinnerAnnounced(uint8)", +"27c97fa5": "deauthorize(address)", +"27cadd13": "getSides(uint256,uint256)", +"27cc1fd8": "party_b()", +"27cca148": "lastClaimedBlock()", +"27ccdbc5": "setWalletContract(address)", +"27ccdd0a": "changeServiceReceiptAddress(uint32,address)", +"27cd0d96": "getLockedAmount_simus(address)", +"27cd933a": "RequestEvent(address,address,uint32)", +"27cda9d5": "AcceptsEtheropoly(address)", +"27cdab06": "fee(bytes32)", +"27cdbf4a": "existingNames(bytes32)", +"27ce5b8c": "getNumberOfOutcomes()", +"27ce6fa9": "unlockup(address)", +"27cef820": "hasForgivedChar(string)", +"27cfe856": "DAY()", +"27d120fe": "updateTransfer(uint64,uint256,bytes32,bytes32,bytes)", +"27d1913c": "buyerCancel(uint16,address,address)", +"27d1c3a6": "transferChamp(address,address,uint256)", +"27d1f39e": "mastery()", +"27d21602": "buildings_total()", +"27d23b86": "receive(address,uint256,bytes)", +"27d26d6e": "testCannotRedeployANT()", +"27d272c5": "getFirstBuyersFee()", +"27d3a8ad": "LogUpdatedComplianceProof(bytes32,bytes32)", +"27d42fc0": "setReservedWallet(address)", +"27d511ae": "activateCommunityFund()", +"27d51979": "getTokenTransferSetCount()", +"27d6ba21": "getDistributedToken()", +"27d6c032": "unregister(bytes)", +"27d6d6e0": "ownership(address)", +"27d6dfbf": "BITNT()", +"27d741df": "SALE_END_DATE()", +"27d7874c": "setCEO(address)", +"27d795d7": "start_date()", +"27d8455c": "setMainSaleStartAndEndTime(uint256,uint256)", +"27d87924": "registerNameXaddr(string,address)", +"27d8a9e5": "CofounditICO(uint256,uint256,address)", +"27d8fb97": "removeLaureato(string)", +"27d93a70": "addFighter(address,address)", +"27d94182": "MAX_PRIVATE()", +"27d95c8c": "getContaOuvidoria(uint256)", +"27d9ac67": "NewMarketMaker(address,string)", +"27da0078": "SpindleToken()", +"27da5ca5": "batlordReq()", +"27dad426": "init(address,string,string,uint8,uint256,bool,bool)", +"27db9e82": "reevaluateETHPrice(uint256)", +"27dba183": "getProcessablesSize()", +"27dba807": "buyWithBonus(address)", +"27dc297e": "__callback(bytes32,string)", +"27dc7085": "getInvestorInforValue(address)", +"27dd16e5": "paymentAction(bytes32,uint256[],uint256[])", +"27dd3873": "plantedTime()", +"27dd941e": "unlockDates(uint256)", +"27ddbb16": "mnyLeftInCurrent()", +"27de1a4d": "mintToAddressesAndAmounts(address[],uint256[])", +"27de1fc9": "fixPlayerCountryString(uint256,string)", +"27de2459": "HungerCoin()", +"27de2765": "Assert(bool)", +"27de9e32": "unbond(uint256)", +"27defa1f": "onlyAmbassadors()", +"27df664b": "minPrivateContribution()", +"27dffba6": "startRegularPhase()", +"27e056a5": "addMinter(int256,address)", +"27e07647": "setFundingFueled(uint256)", +"27e0feaf": "_allocateTokens()", +"27e10295": "storedProfit(address)", +"27e152bb": "maxCoinSides()", +"27e1f7df": "deleteAdmin(address)", +"27e235e3": "balances(address)", +"27e2dd48": "getRandomSeed(string)", +"27e44059": "VReetUp()", +"27e56719": "ENIGMA()", +"27e584d4": "TOTAL_PARSEC_CREDIT_SUPPLY()", +"27e65007": "min_investment_presale_eth()", +"27e728ec": "enableCodeExport(address)", +"27e72e41": "defaultDelay()", +"27e7c023": "sendTokensToFounders()", +"27e7e21e": "air()", +"27e7fe5a": "ONEPERCENT_TOKENS_PER_ETH()", +"27e8c2d8": "burnUnicornShares()", +"27e90a7e": "offerBorrowingItem(uint256,uint256,uint256)", +"27e95f87": "pubkeys2()", +"27e9a0b6": "files(bytes32,uint256)", +"27e9b1a0": "getArrLength()", +"27e9f294": "addItem(string)", +"27ea06b8": "numberOfTokensLeft()", +"27ea6f2b": "setLimit(uint256)", +"27eac914": "cancelAuction(uint32)", +"27eb95cf": "deathData_v13()", +"27ebcf0e": "sharesTokenAddress()", +"27ebe40a": "createAuction(uint256,uint256,uint256,uint256,address)", +"27ec2c03": "getAvgPps()", +"27ed31ff": "localityCode()", +"27ed810d": "setMaxBlockDrift(uint256)", +"27edf097": "burnPerTransaction()", +"27eea9cd": "CCCCCToken(address)", +"27eeefa6": "paymentOnTime(uint256)", +"27ef89bc": "DEV_TEAM_PORTION()", +"27ef986d": "ExternalToken(address)", +"27efc086": "TOTAL()", +"27f02f74": "core(uint256,uint256,uint256)", +"27f05e06": "distributeTokensPreIco(uint256)", +"27f06a6e": "permitChildContract(address[])", +"27f06fff": "requestFillUp(uint256)", +"27f12c8e": "registerAsImportingAuthority(address)", +"27f1bb7f": "prefixedHash2(address)", +"27f1f521": "Kurecoin()", +"27f2402b": "acceptSacrifice(uint256)", +"27f2db32": "finalizeChangeStaker()", +"27f397a9": "borrowerReturnFiatAmount()", +"27f39abf": "tokenOwnerWallet()", +"27f3a72a": "thisBalance()", +"27f3fb69": "setMachine(bytes32,bytes32,uint256,uint256,uint256,uint256)", +"27f498c9": "changeTokenSender(address)", +"27f4b056": "getDemocInfo(bytes32)", +"27f50a2d": "getDocuments(address)", +"27f576d1": "withdrawFromReserve(address,uint256)", +"27f69c37": "roundInvestorInfoByIndex(uint32,uint32,uint32)", +"27f6e676": "addApprovedGame(address)", +"27f7be99": "boosterContract()", +"27f85c13": "setUsdEth(uint256)", +"27f8ce38": "gamePause()", +"27f8d7ba": "setEndPreICO(uint256)", +"27f93e59": "createContractMeme(uint256,string)", +"27fa35c3": "getMarketsCount()", +"27fb1da7": "ICOState(bool)", +"27fbcac5": "getChannelFeed(address,uint256,uint256)", +"27fc2414": "follow(address,uint8)", +"27fde806": "erc20GST(uint8)", +"27fe0d10": "maximumWEI()", +"27fe75ed": "lockTokenLocker()", +"27ff1374": "TotalDeposited()", +"27ffb7b0": "purchaseRound()", +"28006b31": "makeLiquidPri()", +"28012606": "createAuction(uint256,uint256,uint256,uint256,address,uint256)", +"2801617e": "set(address)", +"2801e43a": "authorizedLoggers(address)", +"28026ace": "depositAndApprove(address,uint256)", +"2802cacc": "cancelOrderByAdminWithPayer(string,address)", +"280376b3": "CinderTokenSale()", +"2803d8e5": "MIN_TOKEN_UNIT()", +"28043306": "migrateTransfer(address,uint256)", +"28044357": "CollectibleIndex1()", +"280464ed": "fundsToTokens(uint256)", +"28046f30": "handleBlockBalanceLedger(address,uint256,uint256)", +"2804b2c0": "customer()", +"2807eece": "purchaseNo()", +"2808241e": "vote(uint8,bool)", +"28086f18": "bidETHMin()", +"2808c8ad": "thisContractBalance()", +"28090abb": "logSweep(address,address,address,uint256)", +"2809c5e1": "isBountyAllocated()", +"2809c7e1": "AuctionCancelled(uint256)", +"2809df16": "MetaUpdated(string,string)", +"280a3382": "fundariaTokenBuyAddress()", +"280af7d3": "setData(string,string,string)", +"280b8846": "Token(string,string,uint8)", +"280c2604": "SCADA_requires_hard_cap()", +"280ca666": "getAllElements()", +"280cd0e6": "getBetSizeAtRound(uint256)", +"280da6fa": "withdrawAllTokens()", +"280dd460": "adjustFeePercentage(uint256)", +"280e0359": "bonusLevel0()", +"280e682c": "mintImpl(address,uint256)", +"280f958e": "transferLockedFrom(address,address,uint256,uint256,uint256[])", +"281027b9": "isPrimaryOperator(address)", +"28102e54": "amountWon()", +"2810dd4a": "ParcelXToken(address[],uint256)", +"2810e1d6": "resolve()", +"28111984": "setIcoState(uint8)", +"281134bc": "noahToken()", +"2811d4e0": "sendSecondBatch(address[],uint256[])", +"2812988f": "object()", +"2812f8b8": "FutureCall(address,uint256,uint16,address,bytes4,bytes,uint256,uint256,uint256)", +"281318c8": "all_unfreeze()", +"281336b4": "terminateEmployee(address,uint32,uint32,uint32,uint8)", +"2813acc9": "indexAccount()", +"2813de17": "toggleTransferablePending()", +"28148d07": "setCategoryVerify(uint256)", +"2814a371": "createOfAthleteCard(string)", +"2814da3c": "transferDeposit(uint256)", +"28155727": "makerWithdrawEther()", +"2815741c": "Sort()", +"28159ef6": "removeIcoContract()", +"2815cc38": "discoverNewPlanet(uint256,uint256,bool)", +"2815f054": "setTCoinContractAddress(address,address)", +"2815f50f": "addManyToBlacklist(address[])", +"28169ec1": "testProvidedValues()", +"2816bd78": "incentiveForHolder()", +"28171882": "customText()", +"28180023": "closingBlock()", +"2819598d": "removeManyFromAllocationList(address[])", +"28195d2c": "GDO(uint256,string,string)", +"281972af": "getExplorerList()", +"281989bf": "ComputeSquare(uint256)", +"28198eab": "RLCSentToBTC()", +"281a0ff7": "revokeDelegate(address,address,string,address)", +"281ae558": "ETH_TOKEN_EXCHANGE_RATIO()", +"281bdaf8": "weightedMultiplierByAddress(address)", +"281c08ad": "totalAuctorCount()", +"281ca73e": "write(uint256,uint64,bytes8)", +"281cee59": "_approveOwner(address,uint256)", +"281dfbb6": "sendPlatformSupplyToken(address)", +"281e1856": "deAuthorize(string)", +"281e399c": "Token(string,string,uint256)", +"281fa792": "givenBonus()", +"281fe829": "addFirstBuyers(address[],uint256[])", +"2820d6a5": "totalPresaleBonus()", +"2820f454": "setNewBeneficiary(address)", +"2821ca71": "nextPrice(uint256)", +"2822f62d": "fixedLoge(uint256)", +"282303b5": "_buy(uint256)", +"2823c24d": "howManyTokens(uint256)", +"2823e871": "canTransfer(bytes32,address,address,uint256,bytes,bytes)", +"2823fbe5": "walletLockBothForever(address)", +"28242dd4": "setLLV_edit_25(string)", +"282440ed": "allowWorking(uint32)", +"28249577": "getContractCode(address)", +"28250d43": "ETH_QCO()", +"28252bc4": "saleIsGoing()", +"28261850": "getProfits(bytes6)", +"28262dd1": "TOKEN_HODL_9M()", +"282651fe": "getWinTokenAmount()", +"28276ed6": "totalT8EXSold_GENERAL()", +"28278d0a": "makerich4(address,uint256)", +"2827d4ca": "TokenSale(uint256)", +"2828fc39": "getAllReporterMarketsCount()", +"2829104b": "ElectricUniverse()", +"28292af2": "chAirDropFadd(uint256)", +"282b065a": "setEmail(string)", +"282b5b19": "IsFreezedAccount(address)", +"282ba1b8": "GetPreSale()", +"282c3c47": "DEFAULT_MAX_LOCK_DURATION()", +"282c3cf7": "MAX_TOTAL_TOKEN_SUPPLY()", +"282c8749": "setParameters(uint256,uint256,uint256,uint256,uint256,uint256)", +"282d3fdf": "lock(address,uint256)", +"282d60bb": "eButton()", +"282de6b8": "priceCents()", +"282e0fe0": "updateIndexOrderToken(uint256,address,uint256,uint256,uint256)", +"282ef05c": "collectorsCount()", +"282f7cdd": "isDispositionDue()", +"28310f10": "percentageRecipient1()", +"2831ed5a": "YOUQIANBI(uint256,string,string)", +"2832b5cc": "setInstantFee(bool)", +"2832e44b": "addPrediction(bytes32,uint256,uint256,uint256,uint8,uint256,address,address)", +"28331152": "getActives(uint256,address,address)", +"28334e64": "subTokens(bytes32,uint256)", +"2833747f": "test_oneTrueFalse()", +"28339175": "getCreateSharesOwner()", +"28339320": "deleteRegion(address[16],uint256)", +"283506fb": "buySqr(uint256)", +"283557ac": "getContributorTokens(address)", +"2835b45c": "getETH(uint256)", +"283654c3": "storjBalance()", +"28368e0f": "OppToken()", +"28376f05": "testCreateAuthority()", +"2837919d": "impl_mining_uncle(address,bytes,bytes,uint256)", +"283890ef": "checkGetFreeQuest(address)", +"28392315": "sellerCancel(uint16,address,address)", +"2839e928": "ackermann(uint256,uint256)", +"2839fc29": "exchanges(uint256)", +"283a4576": "Tomeka()", +"283a6e88": "mgmtBodyWalletAddress()", +"283acbfc": "enableRefund(address)", +"283b19bf": "addReward(uint256,uint256,address)", +"283b31a6": "addWorks(bytes32,bytes32,uint8,uint256,uint256)", +"283b5f95": "getUndistributedBalanceOf_(address,uint256)", +"283ba681": "transferAirdropTokens(address[],uint256[])", +"283bcbed": "ChannelToppedUp(address,address,uint32,uint192)", +"283ced9d": "FOUNDATION_CAPPED_VALUE()", +"283ceee2": "cryptaurToken()", +"283dc942": "ReferralWeToken(address,uint256)", +"283f7820": "_totalFee()", +"2840f290": "addTier1Member(address)", +"28412d70": "KING()", +"284131c7": "buyApple()", +"284180fc": "getSecret(address)", +"284237e4": "bitm(uint256,string,uint8,string)", +"28428a42": "importBalances(uint256,address)", +"2843314e": "getAccountList()", +"28439961": "setTimePeriods(uint256,uint256,uint256,uint256)", +"2844328f": "submitVote(uint256)", +"28444381": "setPeriods(uint256,uint256,uint256,uint256,uint256,uint256)", +"28450159": "_updateSnapshot(address)", +"28459871": "OreOreCoin(uint256,string,string,uint8)", +"2845c8cd": "totalPreSaleStage()", +"28469c36": "littafiAccount()", +"2846a35b": "mainSaleEndTime()", +"28470b40": "_axiesPrice(uint8,uint256)", +"28472c6c": "claimComputation(bytes,bytes)", +"2847a7af": "newDocument(bytes32)", +"28491003": "getAllTurnover()", +"28491b3f": "SetPresaleAmountLimits(uint256,uint256)", +"284b1e8e": "generatedByte()", +"284cb916": "endMintingTime()", +"284cfedb": "m_proofs()", +"284d2fd4": "mintVested(uint256,address,uint256)", +"284d94e1": "lockAssetEscrow(bytes32,uint256,address)", +"284e1567": "addrFWD()", +"284e4175": "changeGBTAddress(address)", +"284e650a": "vanbexTeamVestingPeriod()", +"284f083a": "processJackpot(address,bytes32,uint256)", +"284fb363": "deploy(uint256,uint32,uint256)", +"284fd42f": "gasEpoch()", +"2850c72a": "debug_extendCoinbaseTxOutput(uint256,uint256)", +"2850d4e6": "KNOWToken()", +"285109d1": "getTotalInfo()", +"285137c9": "registerNameXaddrFromDapp(address,bytes32,bool)", +"2851f27b": "PrizePaid(string,uint256)", +"2852b71c": "accept()", +"2852bdf2": "whitelist(uint8[],address[])", +"2852ca81": "getTypeFromEdition(bytes16)", +"2853a0d7": "BRXToken()", +"2853f925": "unfreezeFoundingTeamBalance()", +"28543417": "removeOrderOfOwner(address,uint256)", +"2854ba7d": "getCreatedPayoutDistributionHash()", +"2854bc7e": "setTokenCap(uint256)", +"285669e9": "setRegionNextImageId(uint256,uint256)", +"28579137": "remove(uint80)", +"2857bc60": "triggerStealManually3(string,uint256)", +"28583dcc": "getRoundCounter()", +"2858507f": "IDD()", +"2858c764": "checkStatus(uint256)", +"285a4639": "Rotterdam()", +"285a9b32": "payoutfordividend(address,uint256)", +"285b5dde": "MoreTokensMinted(uint256,string)", +"285bf4c7": "CryptoCopyToken()", +"285c22b1": "addOrigin(bytes32)", +"285c51c3": "getRemainingEthersForCurrentRound()", +"285c7f37": "addUpgrade(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"285d70d4": "setMintable(bool)", +"285da5a9": "ceilTokens(uint256)", +"285dfc1c": "AmigoCoin()", +"285e1406": "changeFeeAddress(address)", +"285e8516": "advisor2Sum()", +"285f2346": "getNotApprovedProposals()", +"285f6a55": "ADDR_BOUNTY_TOKENS_ACCOUNT()", +"285fc97f": "TestChain()", +"285fe426": "bet(uint256[],uint256[])", +"286012b0": "getDealCancelRate()", +"286294b3": "buyByTomo(address,uint256)", +"286362f8": "AllowTransferExternal()", +"28636578": "setMultiRequestRequestor(uint256,address)", +"2863cd7e": "batchMintWithData(address[],uint256[],bytes)", +"2863f9f3": "emergencyStopSale()", +"286401df": "is_claim_period(uint256)", +"28640599": "fetchCreatedOrdersForMerchant()", +"2864ddde": "nextPriceOfElement(uint256)", +"28657aa5": "bankBalance()", +"2865dc2e": "getUserRewardPayouts(address)", +"2866bae1": "HarryCoin()", +"286707a1": "genToExtraStats(uint256,uint256)", +"28675325": "PURCHASER_MIN_TOKEN_CAP()", +"2867586e": "setInvContract(address)", +"286781c7": "suspend(address)", +"2867bc92": "refreshGames()", +"28680c1e": "bonusUnlockAt()", +"28687e61": "checkPriceCalled()", +"2868eda3": "admin_withdraw(uint256,uint256)", +"286a8993": "_clearBridgeNativeFee(uint256)", +"286b583b": "offerCanvasForSale(uint32,uint256)", +"286c1a9b": "confirmJoinAirdropQuest(address)", +"286c241a": "releaseTimeOf(address)", +"286d2e3a": "setContractAddr(address)", +"286dd3f5": "removeAddressFromWhitelist(address)", +"286dd83c": "unPauseCrowdsale()", +"286eab15": "getSnailmasterReq()", +"286ec4d1": "erc20_contract()", +"28707f3d": "addCharacter(uint32,uint16)", +"28713d0c": "SunContractToken(address)", +"2871587d": "MAX_PAYOUT_FRAC_BOT()", +"2871b1b9": "setRate1666()", +"2871f2c0": "getMySquirrel()", +"28720849": "verifyReport(uint16,int8[],uint32[])", +"2872a8e7": "kkk()", +"287301c1": "COMMUNITY_PERCENTAGE()", +"287418e7": "query(uint256,uint16)", +"28753dc2": "ApprovedFunds(address,bool)", +"28761ea5": "calcDividend()", +"28762e3a": "rdDoisToken()", +"28764b44": "rnBlock()", +"2877af10": "STARToken()", +"2877c748": "claimVotingProposal()", +"2878d3a7": "getClue3()", +"287977d6": "updateScore(uint8,bytes32,uint24)", +"287ad39f": "upgradePrice()", +"287ad3e5": "endPeTime()", +"287b020b": "founderMembers()", +"287b7cc1": "setStageLimit(uint256)", +"287b8862": "s35(bytes1)", +"287b895c": "MAX_OBR_CAP()", +"287bd206": "MAX_ALLOCATIONS_COUNT()", +"287cc96b": "getTotalEthBalance()", +"287dd8d2": "HIcToken(uint256,string,string)", +"287e85e9": "getTimeoutBlock(bytes32)", +"287e9fbc": "setGameIdCntr(uint256)", +"287eda92": "setIntervalSize(uint256)", +"287efb57": "setMixFormulaAddress(address)", +"287fcbfc": "PEPEso()", +"28802f19": "stare(uint256,uint256)", +"28805407": "refundToken(bytes32,address,address,uint256)", +"2880ebe7": "underdogPayoutMarkup()", +"28811f59": "F()", +"288169fd": "_changeAddress(address)", +"28828b1e": "claimMultipleAndWithdrawBalance(bytes32[],uint256[],bytes32[],address[],uint256[],bytes32[])", +"2882ab48": "BurnGas()", +"28831187": "setCompanyWallet(address)", +"288343e4": "Start(address,uint256,uint256,uint256,uint256,uint256)", +"288365a7": "foundation_vesting_contract()", +"2884c115": "_finishICO()", +"28852b61": "allOfferingPercentage()", +"2885b593": "extractMasterKeyIndexLength()", +"28861d22": "market(uint256)", +"2886b47a": "PERC_TOKENS_TO_RELEASE()", +"2886d76f": "setColorTeal()", +"288714be": "getPreviousWinner()", +"2887318f": "RATE_ETH_WXW()", +"2887cecd": "QYTestingToken()", +"288811cb": "grantAdvisorToken()", +"28889862": "setRandomPlayerAddress(address,address)", +"2888bb9c": "fixedAssets(bytes32)", +"2888c701": "setClearingPrice(bytes32,uint256)", +"2888f9d0": "updateMaxBet()", +"28896066": "transfer_owner(address)", +"2889e822": "team3Address()", +"288a6535": "_getPurity(uint16,uint16)", +"288aa69b": "VirusGame()", +"288b7ad8": "homeMaxPerTx()", +"288bcfb5": "getIntegerVaule()", +"288bd8fd": "mintReserveTokens(uint256)", +"288c4602": "WRTCCToken(address,uint256)", +"288c6ed2": "getSeedCost(uint256)", +"288cdc91": "filled(bytes32)", +"288dca30": "softCapFundingGoalInCents()", +"288dd331": "getTotalBidded()", +"288ddec7": "reversePercent(uint256,uint256)", +"288fa739": "isValidVote(uint256,address)", +"2890e0d7": "burnNFT(uint256)", +"289120cf": "goToNextState()", +"28916184": "createProduct(string,bool,uint256,address)", +"28918296": "verifyBBODocument(bytes32,bytes)", +"28919b47": "best_gamer()", +"2891da02": "tokensCounter()", +"28929072": "setMaxAssignedRequests(uint256)", +"28931484": "SmartLinkToken(uint256,string,string)", +"2893c5b0": "mint(address,uint64)", +"289471d5": "getOnTokenTransferFromValue()", +"2894ceda": "publisherRegistry()", +"28962b94": "DS1Token()", +"28968872": "minusFreezingTime(uint256)", +"289768b7": "_checkForJoin(uint256,address,uint256)", +"2897768d": "grantJoinAddr(uint256)", +"289799b7": "setUnitTime(uint256)", +"2898410b": "totalMintedToken()", +"289850b7": "FundTree()", +"28985c17": "returnsTwoUnnamed(uint256,uint256)", +"289912cc": "CLXTokenSale(address,address)", +"28997e32": "token(uint256,string,string)", +"2899a870": "claimAllInvestorTokensByOwner(address)", +"289aac50": "teamWithdrawSupply()", +"289ae4c7": "AddressWhitelist(address)", +"289b3aab": "Arith()", +"289b45fb": "subtractAction(bytes32,uint256[])", +"289b5b15": "setTypeName(uint32,string)", +"289cb681": "testSetPresale()", +"289cd94f": "setWhere(address)", +"289cf1e2": "PRESOLD_TOKENS()", +"289de615": "getTokenDetail()", +"289e0f82": "STAGE_1_START()", +"289ea30b": "requireNotZero(uint256)", +"289fd839": "presaleBonusTier3()", +"28a006af": "ethBalance(address,address)", +"28a07025": "liquidate()", +"28a1cab8": "setVicepresidenteDeMesa(bytes32,uint256,uint256,uint256,bytes32)", +"28a20a2f": "transferXPAAssetAndProfit(address[],uint256)", +"28a24f30": "set_base_token_as_seeded()", +"28a3dd2c": "_redeem(uint256)", +"28a42e9d": "getUpgradeInfo(uint256)", +"28a45038": "testTryProxyCall()", +"28a49874": "regPrice()", +"28a52d3e": "maxHistoryRecordID()", +"28a5be59": "getExchangeRateAtTime(uint256)", +"28a5c5e9": "address_to_tokens_prev_week0(address)", +"28a5e6f0": "regularOpen()", +"28a741db": "publicityFunds()", +"28a76045": "setAsMinter(address,bool)", +"28a767b0": "ClaimAirdropMultiple(address[],uint256)", +"28a7f25d": "transferJokerOwnership(address)", +"28a852db": "SOFTCAP_LIMIT()", +"28a8ee68": "minimumTakerProtocolFee()", +"28a92ef7": "requestRemoveAdmin(address,string)", +"28aa1a22": "IlumXXToken()", +"28aa48b4": "heroTypeToHeroSales(uint16)", +"28aa5257": "updateTransfer(bytes)", +"28aa69cf": "end_race()", +"28ab4f76": "changeSupply(uint256,bool)", +"28ab7375": "p_update_tokensRewardsAvailable(uint256)", +"28abda51": "resetUrls(bool,bool)", +"28acb002": "collectFees(uint128)", +"28acb520": "IdentityManager(uint256,uint256,uint256)", +"28ae8ea3": "redeem(uint256,bytes32,bytes)", +"28aea735": "getCreatedDate()", +"28af792c": "fundBTC(address,uint256)", +"28af94c8": "addData(bytes32)", +"28b070e0": "contractIndex()", +"28b0e795": "advance(bytes32,uint32,uint64,uint64,int64,uint64)", +"28b1b051": "external_call(address,uint256)", +"28b2105c": "endCrowdfund()", +"28b2362f": "custodianRegistry()", +"28b2e781": "minprice()", +"28b34ef6": "updateLandData(uint256,uint256,string)", +"28b3f3ae": "getBetAmount(uint8)", +"28b44b4b": "getBalanceOfContract(address)", +"28b4e62a": "numTokenPerEth()", +"28b53247": "_burnCarbonDollar(address,address,uint256)", +"28b59782": "Initiate(address,uint256)", +"28b5a8e6": "fechPreAllForCandidate()", +"28b5dde8": "setPI_edit_9(string)", +"28b5e965": "artDescription()", +"28b60031": "ownerTokens(address,uint256)", +"28b6c658": "maxAgonCount()", +"28b7bede": "getTokenContract()", +"28b7e183": "enableAffiliate()", +"28b8b108": "withdrawStoreBalance()", +"28b8e9cf": "buy_the_tokens()", +"28b94289": "isPreICOPrivateClosed()", +"28ba671f": "_getBonusTokens(uint256)", +"28baf31d": "EscrowVault(address,address)", +"28bb6f24": "webGiftTotalAmount()", +"28bc5dcc": "promotionIndexToHost(uint256)", +"28bc5ee4": "beginVote()", +"28bc8a04": "airdropSpent()", +"28bcd985": "PRIVATE_PHASE()", +"28bdbdca": "productionUnitIdRange()", +"28be67f9": "get_amount_get_sell(uint256)", +"28bf2448": "availableForWithdrawalAt(uint256)", +"28bf4079": "initStage(uint256,uint256)", +"28bf794d": "set_price(uint256)", +"28bfdeee": "distributeInsurance()", +"28c05d32": "shortSell(uint8,uint256,uint256)", +"28c0898b": "ZAR_Omnidollar()", +"28c0b0ef": "_partialPaid(address)", +"28c11fd6": "SetIPR(string,string,address,string,string,uint256,string,string,string)", +"28c23a45": "renounceOwner()", +"28c32be6": "refundPeriodStart()", +"28c3d685": "logPlaying(address)", +"28c4b676": "maxPaysPer()", +"28c4e24c": "retrieve(address,address,uint256)", +"28c4f410": "getShifterByToken(address)", +"28c5cf0a": "finalizeContract()", +"28c69eb2": "hasStake(address,address)", +"28c6cd05": "minBuyTokens()", +"28c6d8e3": "preBuyersDispensedTo()", +"28c743e6": "WelfareTokenFund()", +"28c78227": "openBoxPlayer(uint256,uint256)", +"28c8b217": "approveProject(address,uint256)", +"28c8ed98": "disableAutoDividends()", +"28c8f3ba": "airDropManager()", +"28c9ca90": "ethereumWei()", +"28c9f19a": "exchangeAndPay(uint256[10],address[5],uint256[4],bytes32[4])", +"28ca3062": "testCannotSetPresaleTokensAfterActivation()", +"28ca5a1c": "InvestmentEvent(address,uint256,uint256)", +"28cab0d6": "TokenBought(address,uint256,uint256)", +"28cbe9ac": "useKnowledge(address)", +"28cc413a": "getProof(uint256,uint256,uint256)", +"28cc4150": "tokenSaleRate()", +"28ccffe7": "etherFromAltar()", +"28ce213e": "setBalanceOf(uint256)", +"28ce5cdb": "withdrawMinerFee()", +"28ce8845": "addToTotalSupply(uint256)", +"28cf8b6f": "ERC223Token()", +"28cffcd8": "YFT()", +"28d005e9": "firstTTaxAmount()", +"28d08142": "getCurrentHighscoreUser()", +"28d0d223": "withdraw_amount()", +"28d18745": "getMiningAuthority()", +"28d2a961": "chkBSize(uint256,uint256)", +"28d3ad3f": "getPot(uint256)", +"28d3e3e1": "min_goal_amount()", +"28d42350": "endIco1()", +"28d445f6": "_afind(address)", +"28d4cc24": "window2TokenCreationCap()", +"28d5e117": "numberOfPossibleChoices()", +"28d6ce3d": "startSale(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"28d76403": "dataForSell(address,uint256)", +"28d84c9b": "delAltOracle(address)", +"28d879e4": "depositEtherBalance()", +"28d8f102": "ABOX()", +"28d905e5": "getAssetIdTripCompletedTime(uint256)", +"28d90b63": "ChangeFee(uint8)", +"28d936fe": "numImages()", +"28d969a5": "resetIndex()", +"28d969e2": "initialARXtokenSupply()", +"28d9dcd4": "createErc20Token(string,string,uint256)", +"28da6ba3": "PreSaleComplete(address)", +"28da740f": "firstTimeLine()", +"28da75fa": "addAddressToCaller(address)", +"28da850b": "buyAllOutcomes(uint256)", +"28db5470": "getPrivateName()", +"28db90a4": "BadgeCoin()", +"28dc38e6": "calculateWithdrow()", +"28dcce7c": "addWinner(address,address)", +"28dcfdac": "getSignsCount(uint256)", +"28de15b2": "MajorityList()", +"28de4426": "setLockupPeriodSeconds(uint256)", +"28de78d0": "WandtChaintest(uint256,string,uint8,string)", +"28dee1d2": "transferEtherOut(address,uint256)", +"28df192d": "releaseSbtToken()", +"28df3707": "HawkToken(uint256,uint256)", +"28df7755": "TravellingFreeToken(uint256,string,uint8,string)", +"28e07244": "getTurn()", +"28e08186": "ownerAllocateTokens(address,uint256,uint256)", +"28e0b502": "getDrawStatus(uint256)", +"28e0ba9a": "affsend(uint256,uint256,uint256,uint256,uint256)", +"28e158d0": "TokenVestingContract(address,address,uint256,uint256,uint256,uint256,bool)", +"28e1a604": "BurnFrom(address,uint256)", +"28e36ab8": "_getPrice(uint256,uint256)", +"28e3844c": "Member_AssignTokensToProject(int256,int256)", +"28e3c4f8": "checkLock(address,address)", +"28e454ee": "setDusting()", +"28e47076": "testFailCreateWithParentsParentSameItemId0()", +"28e53bb2": "approveKYCAndDeposit(string,address,uint256,uint256,string)", +"28e5617e": "weeklength()", +"28e5e5d3": "snowflakeCall(address,string,address,uint256,bytes,bytes)", +"28e665ef": "releaseTokenForTransfer()", +"28e68ebe": "getLastFundId()", +"28e69b16": "setBalances(address,uint256)", +"28e70c4e": "getPosition(uint256,uint256,address)", +"28e8776e": "getAyantDroitEconomique_Compte_9()", +"28e8bc61": "endTokensale()", +"28e8ed1b": "resetCrowdSaleaddress(address,address)", +"28e96cb0": "setDefaultAllowedLock(uint256)", +"28e98537": "logicProxiesStatic(address)", +"28e9bff8": "presaleAllocations()", +"28ea0fc3": "transferCollectorship(address)", +"28ea6aab": "addToBlackList(string,address)", +"28ea9203": "___setTarget(address)", +"28eaa326": "_noThrowCall(address,bytes)", +"28ec4173": "UnicornCrowdsale(address,address,address,address)", +"28ecb74e": "Grow()", +"28ed5c0d": "MCC()", +"28ef26cc": "JEXToken()", +"28ef42ce": "preICOSwapRate()", +"28ef6f40": "openCrowdsale()", +"28efa3a6": "processRebond(address,uint256)", +"28effe67": "gasForPBTT()", +"28f03554": "ProcessDividend()", +"28f0d47b": "ticketTransfersAmount()", +"28f22cc1": "getRemovedServicesForApplication(address)", +"28f28529": "fstUnitPriceNumerator()", +"28f2d4da": "identifiers(uint256)", +"28f3402b": "changeRuningState(bool)", +"28f371aa": "isApproved()", +"28f3ebd6": "BitPrize()", +"28f4c7de": "getMaximumReportingFeeDivisor()", +"28f4dbb6": "thresholdAmount()", +"28f5c7b3": "totalETHRaised()", +"28f66b77": "getAllHead()", +"28f68d39": "getVestingPeriodsCompleted(uint256,uint256)", +"28f6a48a": "getBidCount()", +"28f798a8": "toBinary(uint256)", +"28f7f13b": "Acandy(uint256,string,uint8,string)", +"28f833b7": "depositAddress()", +"28f90e4b": "Etheramid2()", +"28f9a563": "maxPreCrowdAllocationPerInvestor()", +"28fa17b6": "estateData(uint256)", +"28fb29d7": "_transferEvent(address,address,uint256)", +"28fbd958": "registerContract(bytes32,address,address,bytes20,bytes32)", +"28fbf28a": "revealPeriodActive(bytes32)", +"28fce8c8": "ZEUSCoin()", +"28fd287c": "_addmoney(address,uint256,uint256)", +"28fd72e2": "updateRndSeed()", +"28fdcdf7": "safeMemoryCleaner()", +"28fe549a": "STATE_BET_ENABLED()", +"28fe9a7f": "founder1Address()", +"28fecd48": "reinstate()", +"28ff498a": "presaleTokenLimit()", +"28ffe6c8": "join(address)", +"28fff8d6": "NokuConsumptionPlan(address,address)", +"2902320a": "totalTokensToSend()", +"2902b093": "addnewOwner(address)", +"2902df61": "remove_helper(uint256)", +"29033133": "clearValueBonuses()", +"290382dd": "DFCToken()", +"29055edd": "createNew(uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256,address,address)", +"2905be9a": "IronHands(uint256,address)", +"29062d76": "startGame(address[],uint256)", +"29079291": "RVRCoin()", +"2907eb16": "finalizeContract(uint256)", +"290842a1": "setPI_edit_1(string)", +"2908fb5a": "Y1_release()", +"29090202": "Resolver(address)", +"29092d0e": "remove(address)", +"2909acef": "isSpawnProxy(uint32,int256,address)", +"2909cc5d": "left16(uint256)", +"2909f638": "setData(uint256,uint256,uint256)", +"290a9fa0": "setRangeGameAttr(uint256,uint256,uint256)", +"290b1e5f": "initTokenBank()", +"290b7dfd": "getTransactionLength(bytes32)", +"290c292d": "preMint(address,uint256)", +"290c398f": "getChipIds(bool)", +"290c8eb1": "doMint(int256,address,uint256)", +"290cb460": "MitkeyCoin()", +"290cba7f": "getLen(string)", +"290cf4fb": "payBonusToAddress(address)", +"290d2494": "startBuffer()", +"290d256e": "ExchangeLinkToken()", +"290e1c20": "AutoFare(uint16,uint16)", +"290ed1be": "RESERVED_MARKETING_GROUP()", +"290fe2df": "getEscrowAddress(uint256)", +"29107555": "soldByChannels()", +"29108d1b": "transferReserveToMain()", +"2910a32b": "setTokenBuyRate(uint256)", +"2910f159": "LogBidMade(address,uint256,uint256)", +"29113bc8": "hotWallet()", +"29114d65": "winnerPoolTotal()", +"291194b2": "NOT_AUDITED()", +"2911982e": "balanceOfPlayer(address)", +"2911c9e7": "dashId()", +"29143bdd": "onwerfee()", +"29147530": "setValidKYC(address)", +"29148c0c": "changeOwnerBook(uint256,address)", +"2914fb3e": "porcodr(uint256)", +"29153250": "withdrawalList(uint256[],address)", +"2915a915": "determineNumber()", +"2915fd3d": "subToZero(uint256,uint256)", +"29161820": "Base(uint256)", +"29163502": "addWhitelistedTransfer(address[])", +"291675f2": "add_another_owner(address)", +"291681b5": "signupUserWhitelist(address[])", +"2916f075": "check_invalidator(uint256)", +"2917f162": "getCooldownIndex(uint40)", +"2917f66b": "distributeAllTokens()", +"2918435f": "fun_sandbox(address)", +"29189c9e": "ATTToken()", +"291948ff": "date_ico_end()", +"29194964": "setUsdCap(uint256)", +"2919fccd": "Gaoguans(address)", +"291bc657": "Predecessor()", +"291bd15c": "confirm(string,int256)", +"291c0dbb": "setEtheremonAddress(address)", +"291cef95": "startSlammerTime(address,uint256[5],address,uint256[5])", +"291d1185": "updateCurrentBonusPeriod()", +"291d4f98": "transfered_total()", +"291d778c": "CancelSellOrder(bytes32,address,uint256,address)", +"291d9549": "removeWhitelisted(address)", +"291e6777": "sendVote(uint256,uint256)", +"291ea526": "constructionEnd()", +"291f028d": "calculateRoom(uint256,uint256,uint256,bytes32)", +"291f3665": "balanceOfFund(address)", +"291f37a4": "CHESSToken()", +"291f5a1f": "ORIGINAL_IPFS_HASH()", +"291fce73": "TmoneyTest2()", +"291fd18f": "issueCertificate(string,string,uint256)", +"292005a2": "TOKEN_SUPPLY_LIMIT()", +"29213a2f": "approveMember(address)", +"2921441e": "mysteriumPricing()", +"29216d20": "setLockTime()", +"2921be51": "ALLOC_SALE_GENERAL_1()", +"2921e6fc": "IfModuleRegist(string,string)", +"29223bdb": "changeServiceUpdateAddress(uint32,address)", +"2923f101": "Set_eth_gift(bytes32)", +"2924416f": "validateAndGetRedeemFee(address,address,uint256)", +"29245dd1": "startCall(uint256)", +"2924e254": "getInterestTimestamp(uint256)", +"2924f0dc": "_lockProjectToken()", +"2925827c": "preallocated()", +"2925ffc2": "modifyCommunityTaxes(uint256,uint256,uint256,uint256)", +"2926050f": "pubEnd()", +"29263630": "initialiseContract(address,uint256,uint256,uint256)", +"29274fe1": "buyBOTx(uint256,string,string,address,uint256)", +"2928859c": "runsOutOfGas()", +"29291054": "setContract(address,address,address)", +"2929abe6": "distribute(address[],uint256[])", +"2929dc09": "WithdrawAllReserves()", +"292a2879": "setFundAccount(address,address)", +"292a7409": "processBuyCard(uint256,address)", +"292a9873": "attackTileForNewUser(uint16,bytes32,bytes,bytes32,bytes32,address)", +"292b79b9": "HashReleased(bytes32,uint256)", +"292c1323": "vestAddress(address)", +"292c8aaa": "getPayOutAmount()", +"292ca2fe": "Jeopardy()", +"292cbbba": "DAYSECONDS()", +"292cdfa5": "getForthRoundReleaseTime()", +"292d64e0": "transferHotel(address,address)", +"292d98cd": "allSet()", +"292eb75d": "openAccount()", +"292f4a6e": "Token(address,address)", +"292fec04": "isClaimable(address)", +"2930cf24": "red()", +"2930fa49": "PLATFORM_FEE_RATE()", +"293100a9": "meleeElementBySubtypeIndex(uint256)", +"293100c1": "tournamentsReserve()", +"2931ebb3": "AdminshipTransferred(address,address)", +"29322e05": "sendTokens(uint256,address)", +"293230b8": "startTrading()", +"29325ebd": "zeroUInt()", +"2932ea90": "creatUserPurchase(string,string)", +"29337bda": "personalisationCost()", +"2933cc47": "getIdeaDate(uint256)", +"2933ee88": "get_account_id(address)", +"293528c9": "GOL()", +"2936981c": "setNumRewardsUsedForAddress(uint256,address)", +"2936c27a": "getFoundersTokens()", +"2936ce62": "crowdSaleOngoing()", +"2936d35c": "millLeconteRate()", +"29372ad0": "getWarrior(uint256)", +"29372d21": "testLog()", +"29377d61": "receiveFunds(uint8)", +"293849f4": "addLimitation(uint256)", +"293877d7": "bthFundDeposit()", +"29388f8d": "setArbitration(address)", +"29390370": "setPricer(address)", +"293a9169": "getSpawnCount(uint32)", +"293b1103": "Bitlike()", +"293b682f": "fSub(uint256,uint256)", +"293be456": "setReward(uint256)", +"293c2958": "getRoundState()", +"293c29de": "swapHotCold()", +"293c33b5": "authorizedFundsAvailable()", +"293c6a3a": "mint(bytes32,address)", +"293d5050": "getPlayerNum()", +"293d7663": "refundErrCombat(uint256)", +"293ee91f": "_fillOrder(uint64,uint64)", +"293f2ad7": "teamTokensIssueDate()", +"293f3fa9": "setBatman(address)", +"293f4825": "fire(uint64,address[])", +"293f5e6a": "get_first_user_recast(bytes32)", +"293f9a9c": "showDemurrageConfigs()", +"293f9f4f": "recordBounty(address,uint128,uint256)", +"293fc820": "setData(string,string,string,string,bytes32)", +"293ffca3": "AddressReg()", +"2940ff1e": "cancelBet(bytes32)", +"29415664": "buy_part_amount_show(bytes32,uint256)", +"294247aa": "BlackjackTipJar()", +"29432e0d": "setaddressname(string)", +"29434e33": "insertUser(address,bytes32,uint256)", +"29435cde": "TadamWhitelistPublicSale()", +"2943fd5e": "TokensIssuedCrowd(address,uint256,uint256)", +"29441674": "DOW_SUN()", +"2944363f": "updateAllDependencies()", +"2944e740": "changeProfitContainerAddress(address)", +"29457483": "register(uint256[2],uint256[4],uint256[2])", +"2945a57d": "findClaim(uint32,string,string)", +"2946ae5d": "changePauseTranfser(bool)", +"29477e03": "exCount(uint256)", +"294914a4": "j2Timeout()", +"294919a1": "rate(address,uint256,uint256,bytes)", +"2949b11d": "mutiSendETHWithDifferentValue(address[],uint256[])", +"294a6511": "checkRefundExistanceByOwner(address)", +"294afbf2": "sendBigPromoBonus()", +"294bbc09": "ggcd(address)", +"294cd2e8": "BACA()", +"294cdf0d": "tokenOfOwner(address)", +"294cedb8": "resolveOffer(uint256,bool,bool)", +"294cf912": "getBoosterPrice(uint256)", +"294e47e3": "FlipToken()", +"294f3d4d": "setUpLimit(uint256)", +"294f4025": "pendingWhitelistRemoval()", +"294fa425": "MIN_BUYIN_VALUE()", +"29501ad6": "changeManagerAddress(address,address)", +"29516a47": "PoWMLottery()", +"29516ba7": "purchasedTokensRaisedDuringPresale()", +"29516c41": "betMatch(uint8,uint8)", +"29519c9c": "LAFINAL7()", +"2952438e": "transfer(string,address,address,uint256)", +"295310bf": "setTransferRate(address[],int16)", +"2953a286": "setGenesisToken(address)", +"2953ee6f": "InvalidPullRequest(uint256)", +"2953f198": "addEntity(string)", +"29546713": "claimableHalvings()", +"2955d4ce": "setRealisation(uint256)", +"29560980": "getCapital(uint256)", +"2956262b": "ownersStakeAdded()", +"29569e80": "accountPubICOSale()", +"29575f6a": "superAdmin()", +"29576c82": "generalExp(uint256,uint8)", +"295777be": "releaseFundsNotification(uint256)", +"295780ea": "RequestInfo(uint64,uint8,address,uint256,address,bytes32,uint256,bytes32[])", +"2957ca33": "BONUSTWO_DATE()", +"2957d848": "batchWhitelistAddresses(address[])", +"2957da23": "ownerDestroy()", +"2957fef4": "redeemBalanceOf(address)", +"2958263a": "lastBucket()", +"29589f61": "tradeWithHint(address,uint256,address,address,uint256,uint256,address,bytes)", +"2959275d": "increaseCompanyCountByOne()", +"29594e4f": "hash(bytes32,address,uint256)", +"295961b1": "checkMinerQuest(address)", +"295a1cc2": "getNowTotal()", +"295a49ca": "Unclosed()", +"295a5212": "mode()", +"295a8b34": "update(uint256,uint256,bytes,bytes)", +"295b3299": "submitTopUpLimit(uint256)", +"295b4e17": "paid()", +"295c219c": "getMarketMakerAddress(address,address)", +"295c25d5": "addAmbassador(address)", +"295c39a5": "getNumMarkets()", +"295c6e4d": "setBytes32Slice(bytes,uint256,bytes32)", +"295d0eb5": "_buyAndCreateToken(uint256,bool,uint256)", +"295d2d69": "BotManageable(address)", +"295d4756": "PARSECS_TOTAL_AMOUNT()", +"295dad5e": "TriedToken()", +"295e0503": "transfreFrom(address,address,uint256)", +"295e1421": "getSaleOrderSeller(uint256)", +"295e3362": "getCutoffTime(uint256)", +"295f6ce7": "launchGame()", +"295fe611": "valueAtAddressLUT(uint256)", +"2960109d": "etherReceivedCrowd()", +"296032f2": "pauseContribution(bool)", +"29605e77": "transferOperator(address)", +"29610252": "payFee()", +"29613086": "payoutRewards()", +"2961320c": "retrieveToken(address,address)", +"29638223": "greet(bytes)", +"29638eee": "GetTheWho()", +"2964a643": "checkPartner(address)", +"2964e4e6": "totalAccounted()", +"2965486a": "safeTokenWithdrawalFromCrowdsale(address,address,uint256)", +"2965558f": "getSignerIndex()", +"2965fa54": "ethers_collected()", +"2966d1b9": "unset(address)", +"2966e97b": "kscApprove(address,uint256,string)", +"29678a53": "playerInDraw()", +"29684907": "numerai()", +"29689a8c": "ergo()", +"2968d629": "YLCToken(uint256,string,uint8,string)", +"2968e640": "playerTakeOff(uint256)", +"29699a88": "viewSentBonuses()", +"2969b226": "batchTransferETHS(address[],uint256[])", +"2969d202": "weiBalance()", +"296b11b2": "getWeightedRandomArbiter(uint128)", +"296b76bb": "drawPhone()", +"296ba4ca": "LogValue(bytes32)", +"296ca48a": "weiLimitPerAddress()", +"296cab55": "setPresaleStartTime(uint256)", +"296cc401": "roundPrice()", +"296d84d5": "teamAdvisorsReserveTokensAddress()", +"296d9009": "calculate_should_return_bix(address[],address,uint256[])", +"296dbf31": "sendGameGift2(address,uint256)", +"296e3661": "removeClaim(uint32,string,string)", +"296ed88f": "testFailControllerInsufficientFundsTransferFrom()", +"296f1ce1": "getHasStartedState()", +"296f4000": "delegateApprove(address,uint256,address)", +"29700653": "fundTransfer()", +"297072a1": "cNiceGuyIdx()", +"2970c9c6": "TEAM_TOKENS_RESERVED()", +"29710388": "isProxy(address)", +"29712ebf": "accountBalancePublish(string,string,uint256,string,string,uint256)", +"29713781": "HumanToken(address,address)", +"29713f86": "cheapredeemvillage()", +"29723ade": "setMediumPrice(uint256)", +"29724d54": "offerOn(uint256)", +"2972b0f0": "isAuthorized(address,uint256)", +"29730ea4": "buyIdeas()", +"29735a89": "getSubmissionsForCommit(bytes32)", +"297398b5": "hourlyProduction()", +"2973e372": "isAlphaUpper(bytes1)", +"29745306": "tgrSetLive()", +"2974a822": "CustodianRegistry(address)", +"29750e85": "depositEndTime(address)", +"2975659d": "determineStatus()", +"2975c690": "SetLimited(address,bool)", +"29760657": "setStarDistance(uint8,uint16)", +"2977b1b1": "testAllowanceStartsAtZero()", +"29780a4e": "eventTransfer(address,address,uint256)", +"29781ec8": "addExemptedAccount(address)", +"29784d90": "shortenTde(uint256)", +"297882d5": "createDistrictOmni(uint8,uint8,uint8,uint8)", +"2978b826": "assignRevenue(uint256)", +"297a1677": "getAllHpbNodesCache()", +"297a1f56": "carCount()", +"297a9dc4": "WalletFunded(address,uint256)", +"297b5dce": "private_setminRoll(uint256)", +"297c4143": "PUBLIC_START_TIME()", +"297c9cd9": "regStopTime()", +"297cb974": "FlightDelayAccessController(address)", +"297d1a34": "returnOwnership()", +"297d7964": "investors_locked(address)", +"297f119d": "transferToAdmin()", +"297f407b": "addWinner(address)", +"297f9af0": "membersCount()", +"29803b21": "join(string,string)", +"2980a7b6": "specialManagerOn(address)", +"2981155e": "weiPerDTH()", +"29816998": "right63(uint256)", +"2981cceb": "_mintFromDeposit(address,uint256)", +"29822734": "Win()", +"2982add7": "notContains(address)", +"29832c0f": "hasSigned(bytes32,address)", +"2983d752": "advisory()", +"29842d15": "TokenClaimed(address,address,uint256,uint256)", +"29846afe": "freezeAccount(address,uint256)", +"2984a077": "setFemaleBonus(address[])", +"2984bc4d": "getAreaInfo(address,uint256)", +"2984f486": "setBU(bytes32,uint256)", +"2984f999": "totalLockTokenAllocation()", +"298503d9": "createCategory(string,string,uint256)", +"298569f0": "SetApplicant(string,uint32,string,int256,string)", +"2985aacf": "getSponsorsN(uint256)", +"29864547": "feeIndex()", +"2986c0e5": "index()", +"2987ace5": "getCapsuleInfo(uint256)", +"2987c8f7": "checkProduct(bytes32)", +"2988e36b": "migrateBalance(address)", +"29893dcf": "checkKhFundDepositAddress()", +"298994c6": "getCET6InfoById(uint32)", +"2989ac22": "rollDie(address)", +"298a49da": "_0xDogecoin()", +"298aa634": "nextContributorToReturn()", +"298ac61c": "AgencyWallet(string)", +"298ad569": "CFOAddress()", +"298c0733": "send(address[])", +"298c154e": "addListing(string,string,uint256)", +"298c1e14": "COIN_PER_ETHER_SUPPORT()", +"298c3dc4": "addStrip(uint256,uint16,uint8,uint8,string,string,string,string,string,string)", +"298c3fc1": "changeFrozenBalance(address,uint256)", +"298c61e3": "TOTAL_TULIP_SUPPLY()", +"298d075f": "tokenPoolAddress()", +"298d3567": "depositBBO()", +"298d5f33": "getPI_edit_1()", +"298e4f79": "depositTokens(address,uint256,address)", +"298e685a": "getFrozen(address)", +"298fb0d2": "setEvenDistThresh(uint256)", +"298fbf1c": "ClaimBTC(string)", +"298febed": "towncrierCallback(uint64,uint64,bytes32)", +"2990194a": "setICOStage(uint256)", +"29913150": "createTicket(address,uint256)", +"29917954": "exitPool()", +"2991835f": "extract(address,address,uint256)", +"2991964c": "GameLoose(address,uint256,uint8,uint8,uint8,uint256,uint256)", +"29928852": "NoteChanged(string)", +"2993ed2d": "cancelSellOrder(address,uint256)", +"299453ca": "cb0f5ef7()", +"299550d9": "LogBetStart(uint256)", +"299599cc": "preICO(address,address,uint256,uint256)", +"29965a1d": "setInterfaceImplementer(address,bytes32,address)", +"2996f972": "tokenBurner()", +"29976934": "ModifyPublicKeySize(uint8)", +"2997ec89": "getStudentIDText(uint32)", +"29981db4": "setAdvocate(address,address)", +"2998dff2": "SuperUltraPowerCoin()", +"29991a5b": "checkMilestones(address[],uint256[])", +"29995f4c": "MoonStone()", +"2999c76b": "initNameSymbol(string,string)", +"299a017c": "getCurrentMilestone()", +"299a7bcc": "setOwner(address,address)", +"299af64b": "setContract(address,bytes32,bool)", +"299b861e": "changeUnitsPerEth(uint256)", +"299c55f7": "TOKEN_BOUNTY()", +"299cc524": "updateEarlyIncome(address,uint256)", +"299cdc9d": "changeEtherCost(uint256)", +"299df3f1": "WithdrawDividendsAndCoupons()", +"299e6b07": "Wallet(address)", +"299e7318": "resolveVoting()", +"299e7abb": "calculateWinners(uint32)", +"299e952f": "buyKeys(address)", +"299ed37a": "emergencyCall()", +"299ee814": "OraclizeBet()", +"299f5f1a": "cumAlienDeposits()", +"299f7200": "burnOwnership(address)", +"299ffcbc": "latestReleaseTime()", +"29a0097c": "internalSend(address,uint256)", +"29a00e7c": "calculatePurchaseReturn(uint256,uint256,uint32,uint256)", +"29a03d8d": "distributionReward(uint256,string,bytes32)", +"29a065bd": "getLOg(uint256)", +"29a19987": "teamVesting4Years()", +"29a2629c": "showRoundNum()", +"29a2aa2d": "thankYou(address)", +"29a2c27b": "finishLastCount()", +"29a2d339": "chknodenumber(uint256)", +"29a36e0a": "addScheduleCall(address,uint256,uint256,uint256,uint256)", +"29a3fab9": "finilize()", +"29a40403": "submitCounterStack(bytes32,uint256,uint256,uint256,uint256,uint256)", +"29a52db6": "getCurrentUserLocalTokenBalance()", +"29a5c0f4": "WithdrawAllETH()", +"29a5dd7c": "refund_bix(address,uint256)", +"29a6344a": "removeSupporter(address)", +"29a64dd1": "startCrowdsalePhase2Date()", +"29a67202": "UHUGIN()", +"29a6f31b": "oraclize_query(uint256,string,string[2],uint256)", +"29a742aa": "HappyLifeCoin()", +"29a7d5c1": "joinAirdrop()", +"29a81222": "getOwnerName(uint8)", +"29a833ee": "getSumData(bytes32)", +"29a86dde": "getGameWin(uint256)", +"29a8cda5": "PolarisToken(address)", +"29a8fcd2": "Proxy(address,address,uint256,uint256,uint256)", +"29a9c91d": "setCurrentPeriod(uint256)", +"29aa1408": "getTotalFlips()", +"29aa7ec5": "removeSignature(string)", +"29aa9cbe": "min(int256,int256)", +"29aab068": "Pen(address)", +"29aacd10": "InitalPos()", +"29ab0ca7": "ownerSetResolverPercentage(uint256)", +"29abdeed": "addCoinBalance(address,uint256)", +"29ad27d7": "maxDays()", +"29ad4a34": "_transferMoneyMother(uint32,uint256)", +"29ae4c70": "isSenderEmergencyMultisig()", +"29aebf05": "initialMoySupply()", +"29aec173": "levelUp(uint256,uint16,uint16,uint16,uint16,uint16,uint16)", +"29b03cfd": "getBid(bytes32,uint256)", +"29b0de1e": "unsetManager(address)", +"29b0ffea": "numberOfPreviousEntries()", +"29b1ce4d": "addWhitelistedUserAddr(address)", +"29b1e640": "claimReporterReward(address)", +"29b20bb6": "numCharactersXType(uint8)", +"29b26bc1": "clearTradePreSignedHashing(address,address,bytes32,address,uint256,int256,string)", +"29b43a68": "createDepositAddressFor(address)", +"29b49825": "ADVISOR_POOL_INIT()", +"29b4d111": "price_start()", +"29b65a2e": "POCY()", +"29b6cdd5": "Alphacoin()", +"29b737ae": "LerToken()", +"29b84c9c": "transferExchange(uint256)", +"29b8caff": "totalInvestors()", +"29b8dab4": "currentBidNumber()", +"29b981bb": "operationAdress()", +"29b9f367": "addressDataProviders()", +"29ba1cb4": "setPrivelegedWallet(address,address)", +"29ba2e07": "TokenPoolExhausting(uint256)", +"29ba725a": "setTransformTarget_miner(address,uint256)", +"29ba7bb2": "initialOwner()", +"29ba8780": "executeTransaction(uint256,address)", +"29ba8d03": "getMigrateMarketInFromSiblingCalled()", +"29bb4bf2": "showCollectorsBalances()", +"29bc3b85": "isAccepted(uint256)", +"29bc5d0f": "finalyzeContract()", +"29bcb186": "transferToContributor(address,uint256)", +"29bd028a": "startIcoPreICO2ndRound()", +"29bd58b4": "revokeToken(address,uint256)", +"29bed3bf": "EthereumRoulette()", +"29bee342": "Get_Last_Value()", +"29bf56c3": "setUnitAttackIncreases(address,address,uint256,uint256,bool)", +"29bf960a": "getResultTable(uint256,uint256)", +"29c08ba2": "payPremium()", +"29c10e37": "filter(string)", +"29c19304": "setInitialVaribles(uint256,uint256,address,address,address)", +"29c1c61e": "modifyPowPrice(uint256,uint256)", +"29c1ee0d": "TOKENS_address()", +"29c2e15d": "_calculateInterest(uint256)", +"29c3340f": "dividends_share()", +"29c36bb5": "feedAddress()", +"29c40d5f": "CheckSoilHumdtyException(bytes32,uint32)", +"29c50df4": "getEIN(address,address)", +"29c510b6": "reveal(bytes32,bytes32,address)", +"29c660a4": "ComputeAcornBuy(uint256)", +"29c6647b": "addCET6(uint32,string,uint32,uint32,uint32,uint32)", +"29c71c1b": "modifyFeeShare(uint256)", +"29c78e0b": "Ethash()", +"29c886bf": "TokenCampaign(address,address,address,address,address,address,address,address,address,address,address)", +"29c8d3ce": "activateTokens(uint256)", +"29c8dae7": "create21PizzasTokens()", +"29c90b63": "onTapPollFinish(bool,uint256)", +"29c924cf": "setFundingGoal(uint256,bool)", +"29ca9dca": "updateRelay(address)", +"29caf0c9": "getStringValueByKey(string,string)", +"29cb924d": "getCurrentTime()", +"29cbdc86": "buyin(address,uint256)", +"29cca3ae": "getYouTubemasterReq()", +"29ccb4df": "getCompte_11()", +"29cd00f7": "approve(address,string)", +"29cd5777": "_tryEraseSingleNode(bytes32)", +"29cd62ea": "setPubkey(bytes32,bytes32,bytes32)", +"29cd7767": "_NT()", +"29cd92cf": "deleteHelper(bytes32)", +"29cdda23": "newVersion()", +"29ce0939": "Timeout(uint256,uint256)", +"29ce1ec5": "addFactory(address)", +"29ce3b69": "increaseApprovalAllArgs(address,uint256,address)", +"29ce7fc1": "getAllRightHand()", +"29cee59e": "finishCrowd()", +"29cf90f3": "sellUnicorn(uint256,uint256,uint256)", +"29d00d64": "ReloadKeys(uint256,uint256)", +"29d017b5": "TestWithConstructor(address,uint256[])", +"29d07c23": "registerForVoting()", +"29d0807b": "addone(uint256,uint256)", +"29d10b6e": "addSupervisor(address)", +"29d11b32": "btycbalanceOf(address)", +"29d24cbe": "TOKEN_SUPPLY_SEED_LIMIT()", +"29d287ec": "isFinishDateReached()", +"29d28aad": "Broker(address)", +"29d368e3": "curMax()", +"29d428ca": "requiredTokenAmount()", +"29d50682": "setupPlotOwnership(uint256,int256[],int256[])", +"29d56381": "balance_factor(uint256)", +"29d592bf": "arconaToken()", +"29d6ec95": "cancelBuy(uint256,uint256,uint256,uint256)", +"29d6f899": "BetOnBlue()", +"29d729ac": "ticket_addresses(uint256)", +"29d77446": "WhitelistSet(address)", +"29d87fbf": "setSeasonal()", +"29d91164": "delWhiteList(address,address)", +"29d98a7b": "change_individual_cap(uint256)", +"29da2fda": "UpdateToken()", +"29da3b4d": "removeBorrowingItem(uint256)", +"29da5738": "actionCount()", +"29daaa5e": "numFactories()", +"29dacb60": "getEthRaised()", +"29daf3ce": "create(bytes32,address,address,uint256)", +"29db191f": "approveForAll(uint256)", +"29db1a4f": "burnForInsurance(uint256)", +"29db3256": "getRandomBox(string)", +"29db8ec4": "getAccountSpendingRemaining(address)", +"29dbdd77": "updateDetails(bytes32)", +"29dcb0cf": "deadline()", +"29dd07eb": "KarlisToken()", +"29dd0b86": "lastSaleDate()", +"29dd0d7d": "requestBlokTokenOwnershipTransfer(address)", +"29dd8b26": "EGTToken()", +"29de3653": "register(uint256,uint256,bytes,bytes)", +"29de91db": "setMsg(address,uint256)", +"29df8972": "Nilometer()", +"29dfdded": "addNewDonkey(address)", +"29e10c13": "getAd(uint256,uint256)", +"29e1ddb8": "freeLottoInfo()", +"29e206bd": "forceDivestAll(bool)", +"29e21cbd": "UIWish(address)", +"29e286c6": "boughtWithoutWhitelist()", +"29e2b478": "addAddressToWhitelist(address,address,uint256)", +"29e30910": "testThrowCreateExistingNonce()", +"29e341f1": "adminAddRole(uint256,address,uint256)", +"29e3ae3d": "virtualTradesSummedCount(bytes32)", +"29e46d3f": "openingTimePeriodOne()", +"29e5dab7": "BytomGoldToken()", +"29e614ee": "addDrop()", +"29e63cd7": "addImmutableContract(string,address)", +"29e67fce": "Rate2()", +"29e6b5be": "VPTToken()", +"29e6f3f8": "setPI_edit_6(string)", +"29e80a80": "_iWantXKeys(uint256)", +"29e81c79": "isJobCancel(address,bytes)", +"29e846df": "dividends(address,uint8)", +"29e8bc0a": "getShareToken(uint8)", +"29e94503": "VersionedBlob()", +"29e94ef6": "getProjectedJackpot()", +"29e99f07": "test(uint256)", +"29e9a3b9": "tokensReceived(address,address,uint256)", +"29e9afc9": "EnterCode(uint32)", +"29ea110c": "maxCapInCents()", +"29eae053": "setService(address,address)", +"29eae264": "EosChain()", +"29eae797": "oldController()", +"29ec09cc": "GetConfirmRound(address,uint8)", +"29ecd1e0": "PriceChanged(string,uint256)", +"29ed0f06": "BitcoinLegendToken()", +"29ed1297": "setItem(address,address,string,string,string,bool)", +"29ed82a1": "getDeflator()", +"29ed9a6a": "depositERC721(address,uint256,address)", +"29edd574": "buyCopper(uint256,uint256,uint8,bytes32,bytes32)", +"29edfbb8": "GetApplicant(address)", +"29ee0480": "FlatPricingExt(uint256)", +"29ee1580": "setMyPrice(uint256,uint256)", +"29ef1919": "discountPercent()", +"29ef5552": "setupZoomLvl(uint8,int256,int256,uint256)", +"29ef56b1": "getAskOrderBookStats()", +"29f0a422": "MakeTransfer(address,uint256)", +"29f11c8d": "edit(uint256,string,string)", +"29f1bff4": "withdrawFromChildDAO(uint256)", +"29f20618": "createLineItem(string,uint256,uint256,uint256,uint256[])", +"29f27577": "InvestorList(uint256)", +"29f321e4": "buy_Vault(uint256,bytes8)", +"29f3533c": "setPriceStalePeriod(uint256)", +"29f4071b": "RegistrationStatusChanged(address,bool,uint256)", +"29f46429": "WIE()", +"29f5fb9c": "icoTokenSales()", +"29f62f70": "logSendEvent()", +"29f69427": "o2Address()", +"29f6d9c3": "clearTokenApproval(address,uint256,bool)", +"29f75dc2": "samePooling()", +"29f799cb": "Studio()", +"29f7bd2f": "transferToContributionPool(uint256)", +"29f958dc": "publish(uint16,uint16,bytes4,string,bytes3)", +"29fa7266": "setSuperOwner(address)", +"29fb598e": "bountyTransfer(address,uint256)", +"29fc550f": "getChallengesForUser(address)", +"29fc7bd8": "PERCENT_DIVIDER()", +"29fcfe2b": "VestingScheduleConfirmed(address,address,uint256,uint256,uint256,uint256,uint256)", +"29fcfeb0": "AUCTION_STARTED()", +"29fd06cf": "Qripplex()", +"29fd50eb": "libAddress()", +"29fd8201": "setReputationAddress(address)", +"29fe6199": "dailyPercent()", +"29fec030": "MAX_DAILY_TOKEN_SOLO_SPEND()", +"29ff42e1": "revealHiddenPosition(uint32,int64[],bytes32,uint64,bytes16,bytes32,bytes32)", +"29ff4f53": "setReleaseAgent(address)", +"29ff7d04": "revertReservation(address,address)", +"2a004bd0": "deleteChannel(address,address,address,address,address)", +"2a00d284": "rewardReferrer(address,address,uint256,uint256)", +"2a00ff6f": "endianConvert256bit(uint256)", +"2a013925": "setFundingCap(uint256)", +"2a0213f6": "FeeOnAllocation(uint256,uint256)", +"2a022f22": "ALLOC_SALE_GENERAL_2()", +"2a035b6c": "endGame(address)", +"2a03b48b": "Campaign(uint256,uint256,uint256,address,address)", +"2a03ffa5": "CryptoGOToken()", +"2a0401f0": "confirmOrder(bytes32,bytes32)", +"2a040c16": "TemboCoin()", +"2a04e88a": "ethRateInUsdCents()", +"2a0763ce": "endGameConflict(uint8,uint256,uint256,int256,uint256,bytes32,bytes32)", +"2a095c14": "getCompte_3()", +"2a095fbe": "unlinkEID(bytes,bytes,address)", +"2a096397": "myDeposit()", +"2a0a3b53": "NewText(string,string)", +"2a0a5f50": "BidCanceled(uint256,uint256)", +"2a0acc6a": "ADMIN()", +"2a0b2617": "getAccountDetails(uint256)", +"2a0b9cb5": "check_authorization(address,address)", +"2a0bb7ea": "mulIsSafe(uint256,uint256)", +"2a0bba0e": "ImperoCoin()", +"2a0c5221": "battle(uint256,uint256)", +"2a0d06ec": "getTotalPctx10()", +"2a0d479f": "TutorialToken()", +"2a0d79ef": "totalSupply(bytes)", +"2a0deab4": "getDataAndOwner3(uint256,uint256,uint256,uint256)", +"2a0f189a": "setCallPtr(uint256)", +"2a0f3c35": "rentableSetup(uint256,uint256,uint256)", +"2a104d8d": "withdrawLoan(uint256)", +"2a10abc3": "CrypteloERC20Address()", +"2a10ff23": "product2()", +"2a11b950": "contractEvents(uint256)", +"2a11ced0": "holders(uint256)", +"2a12b54d": "_transferToLock(address,uint256,uint256)", +"2a139f75": "PLATprice()", +"2a14314f": "satoeLocked()", +"2a143af4": "_calculatePercent(uint256)", +"2a14b80a": "partition()", +"2a151090": "canPerform(address,address,bytes32,uint256[])", +"2a16a9ee": "emitCategorySet(uint256,uint256,bytes32)", +"2a16cca4": "isApproved(address,uint256)", +"2a1727f8": "checkExistAddress(address)", +"2a174710": "getAttackForCost(uint32)", +"2a179054": "setTokenFeeTake(address,uint256)", +"2a17e397": "multiTransferTightlyPacked(bytes32[])", +"2a1828fb": "attController()", +"2a18ca16": "currentSaleLimit()", +"2a19642c": "setSpawnProxy(uint32,address)", +"2a1a3303": "getNumberOfFlips(address)", +"2a1a8d4a": "updateIcoStatus()", +"2a1ab57e": "register(address[],uint256[])", +"2a1bbc34": "generate()", +"2a1be747": "rateFirstWeekEnd()", +"2a1c70e7": "Indemnisation_1()", +"2a1cdf7a": "enableReturnContribution()", +"2a1e37de": "armyCountBattlesLost(uint256)", +"2a1eafd9": "targetSupply()", +"2a1eb7cc": "MintToOwner(uint256)", +"2a1ef0ca": "teamAllocation(address)", +"2a1f63f8": "MiningRewardSent(address,address,uint256)", +"2a1fc45d": "decreaseArrayOfBeneficiariesBalances(address[],uint256[])", +"2a21566f": "grantPositionOwnership(bytes32,address,address)", +"2a21a3af": "isNormalUser(address)", +"2a22196d": "getVoucherDetails(uint256,uint256)", +"2a2235f2": "winAmount0()", +"2a226857": "AlbaritTokenV4(address,string,string,uint256,uint256)", +"2a228fc2": "processWithdrawals()", +"2a23475f": "blockCrowdsale(address)", +"2a23ac02": "eBitcoincash()", +"2a24b8e1": "instruct_4()", +"2a24f46c": "auctionEnd()", +"2a2514a2": "AceFundToken()", +"2a258842": "ETHOS()", +"2a2604dd": "bidRefund(uint256,uint256)", +"2a272974": "tokensIssuedForBonusRangeTwo()", +"2a27fd4a": "forGenesis()", +"2a286a19": "rewardSplitPercent()", +"2a286eda": "productAccounts(uint256)", +"2a2879d3": "createPromoCar(address,string,uint256)", +"2a28822e": "create(address,int256,address)", +"2a288272": "setUpgradesOwned(address,uint256)", +"2a28c610": "uint256_to_bytes(uint256)", +"2a292cce": "openCrowdSale(uint256)", +"2a29312a": "recoverAddressFromSignedMessage(bytes,bytes)", +"2a295c1f": "ChainMonstersCore()", +"2a29700f": "setForceExecuteOfContracts(bool)", +"2a2998a0": "houseFeeVal()", +"2a29c8d9": "getLoansLengthByClient()", +"2a29d109": "rewardController(address)", +"2a2a62f6": "removePrivelegedWallet(address)", +"2a2a6434": "register(bytes32,bytes32,address,bytes32,bytes32,string)", +"2a2acdce": "getMyFrontEndTokens()", +"2a2ad4df": "ExpiringMembership()", +"2a2b48f5": "largestRetro()", +"2a2bb728": "ElephantsPaymentCoin()", +"2a2d78b0": "DeDeContract(address,uint256)", +"2a2dd486": "_computeAura(uint256,uint256)", +"2a2e00be": "MintingClosed(bool)", +"2a2e1320": "isEven(uint256)", +"2a2e2f0c": "convertInternal(address,address,uint256,uint256)", +"2a2e6358": "setMinRecharge(uint256)", +"2a2e6ee6": "countCrowdsalesForUser(address)", +"2a2eddde": "setVesting(address,uint256,uint256,uint256,uint256)", +"2a2f366c": "getPlayer(uint8[176],uint8,uint8)", +"2a2f7bda": "daysRemaining()", +"2a2fbd4b": "min_required_amount()", +"2a2fe110": "isCosignerSet()", +"2a304900": "getHunting(uint256,uint256)", +"2a305613": "transfer(uint152,uint152,uint256)", +"2a308b3a": "transfer(address,address,uint64)", +"2a30b0b8": "addARA(address)", +"2a316353": "JMTOKEN(uint256,string,string)", +"2a31c5b8": "_addBonusOfTop(address,uint256)", +"2a332b2a": "setLotteryAddress(address)", +"2a335c17": "getTotalSalaryBunny(uint32)", +"2a337d30": "submitMatch(bytes32,bytes32)", +"2a3386e5": "covmanagerAddress()", +"2a33fec6": "proceed()", +"2a3520e1": "addDataInstance()", +"2a3590b9": "mimetype()", +"2a35d251": "_move(uint256,address,address)", +"2a3602b2": "DayLimitMock(uint256)", +"2a369647": "getEndpointParams(address,bytes32,int256)", +"2a36b7ac": "TotalRate()", +"2a37d540": "CrowdToken()", +"2a37eaea": "buyWithHash(address,uint256,uint256,bytes32)", +"2a387bdd": "bsx(uint256,string,string)", +"2a388b1f": "cancelDeposit(bytes32,uint256,uint256)", +"2a389fdc": "Pray4Prey(uint128[],uint8[])", +"2a38d484": "getNumEntries(uint256)", +"2a3966ff": "setActiveStatusEgg(uint256,bool)", +"2a396734": "burnPXLRewardPXL(address,uint256,address,uint256)", +"2a39a069": "minInvestmentInWei()", +"2a39c1ea": "officialUrl()", +"2a3a236f": "setMasterContract(address)", +"2a3b1228": "RobotnikToken(address)", +"2a3c2c56": "getConversionFeeAmount(uint256)", +"2a3d05cc": "getSignedIndex()", +"2a3d30c2": "coinValue()", +"2a3dc703": "updateRewardLedger(address,uint256,uint256)", +"2a3de92f": "getCurrentBonusPct()", +"2a3e6ba1": "TOKEN_AMOUNT_ICO_STAGE1_PRE_SALE5()", +"2a3ec4ff": "takeICOInvestmentsEtherCommission(address,address)", +"2a3ef566": "EscapeCalled(uint256)", +"2a410068": "updateShares()", +"2a41360d": "processOfflinePurchase(address,uint256,int256)", +"2a41d1ff": "ArrAccountIsNotFrozen(uint256)", +"2a42e85f": "MiBoodleToken(uint256,uint256,uint256,uint256,uint256)", +"2a437269": "RCCCToken()", +"2a43b847": "TEACHToken()", +"2a43db3a": "Creature()", +"2a45a39a": "Post(address)", +"2a4654ab": "getAnimecard(uint256)", +"2a46d079": "MAT_UNIT()", +"2a472ae8": "checkIfCalled(bytes32)", +"2a4735c1": "EXOTokenSale(address,address,address)", +"2a47e08a": "Potato()", +"2a4802bc": "JINS()", +"2a4843a7": "freezeHeight()", +"2a486a28": "raisedETH()", +"2a48cabb": "testSwapTop()", +"2a491877": "lastTimeOf(address)", +"2a49222b": "isUsernameTaken(bytes32)", +"2a4a1a9b": "addFunds(address)", +"2a4a1b73": "vote(address,uint256,uint256)", +"2a4a8d68": "PRESALE_WEI_WITH_BONUS()", +"2a4a8e02": "stakedAmount(address,address)", +"2a4c7c6d": "initiateClaim(bytes32)", +"2a4caf67": "setDistenseAddress(address)", +"2a4d1a12": "CardExists(uint32)", +"2a4dc687": "callLib2(uint256)", +"2a4e0d55": "getTranscoderPoolSize()", +"2a4e4a84": "forx()", +"2a4ef2a3": "wpxTeamAddress()", +"2a4f1f21": "ACLYDTOKEN()", +"2a4f370f": "forTesting()", +"2a4fe4ef": "ClimateCronToken()", +"2a4ff14a": "Vlogchain(uint256,uint256)", +"2a50097b": "getPlayerBets(uint256,address)", +"2a501a43": "grantBonusDrops(address,uint256)", +"2a50d71d": "transferWithLock(address,uint256,uint256,uint256)", +"2a513dd9": "changeMinimum(uint256)", +"2a515949": "_attack(uint256,uint256,uint256,uint256)", +"2a523e89": "maxReferrerTokens()", +"2a52ee60": "createAuthority()", +"2a548276": "AddStaticProfit(address,uint16,uint256)", +"2a54d313": "pay(address,address,address,uint256,uint256,uint256)", +"2a555650": "HoneySuckleTimes()", +"2a55c47d": "TrumpFarmer()", +"2a55cab6": "UniCoinSize()", +"2a55feec": "isBuyer(address)", +"2a560845": "ownerWithdrawUnsupportedTokens(address,address)", +"2a571b15": "strikersChecklist()", +"2a583b90": "withdrawRake()", +"2a5854d9": "getFreeSquirrel()", +"2a58b330": "nextOrderId()", +"2a59143a": "HIKI()", +"2a595dd2": "GridcubeToken()", +"2a5b204a": "subCoinBalance(address,uint256)", +"2a5b51c3": "TokensIn(uint256)", +"2a5b68fd": "validate(bool)", +"2a5bfc7b": "isFunctionAuthorized(bytes32)", +"2a5c0e7c": "HomeBridge(uint256,address[],uint256,uint256,uint256)", +"2a5c2a64": "ITGCToken()", +"2a5c4675": "reservation()", +"2a5c65e4": "lookupInterest(uint256,uint256)", +"2a5c792a": "getAllTokens()", +"2a5cd45e": "getModuleIDByName(string)", +"2a5da7cd": "AnimatixToken()", +"2a5e695e": "Clean()", +"2a5eb26a": "BITCOINGAME()", +"2a5ed678": "currentContributionLimit()", +"2a5f6239": "_addReferrer(address,address)", +"2a5f6a0f": "setVariationCycle(uint256)", +"2a607962": "minCutValue()", +"2a608c0c": "VicoOwner()", +"2a60cf07": "FUTURE_DEVELOPMENT_FUND()", +"2a61ae19": "LockBalance(address)", +"2a61d47b": "getResourceSetCount()", +"2a62738b": "icoEndDate()", +"2a62b7fa": "IcoContract()", +"2a632eb5": "setUsdTokenPrice(uint256)", +"2a6389dc": "IsTransferFromOldContractDone()", +"2a649d6a": "returnFixed()", +"2a64e635": "simpleToken()", +"2a64fb63": "getSaleDate(bytes)", +"2a663686": "fpartSigned(int128)", +"2a666e01": "_fight(uint32,uint32)", +"2a66ede5": "giveMeETH()", +"2a677fb9": "getTokensForValue(uint256)", +"2a6852bf": "KOKOCoin()", +"2a6865e3": "PibbleToken()", +"2a69d486": "changeCraneStatus(bool)", +"2a69e1c6": "onlyWhitelistedCanDo()", +"2a69e7d9": "transfer(address,uint48)", +"2a6a5394": "TokenCappedCrowdsale(uint256)", +"2a6b157a": "CrowdsaleClosed(address)", +"2a6c703b": "RATING_EXPAND_INTERVAL()", +"2a6c7757": "kjhcoin()", +"2a6cc9bf": "QRReal()", +"2a6d474d": "usdPerEthMin()", +"2a6d6c08": "ReleasableAmount(address,uint256)", +"2a6dd48f": "approvedFor(uint256)", +"2a6dd8c9": "getPercent()", +"2a6dd9cb": "getInfoA(uint256)", +"2a6e3803": "getSoldAreasCount()", +"2a6e3e5e": "correct_check_match(uint256[39])", +"2a6efd76": "additionalRewards()", +"2a6f39ed": "deleteAllParents()", +"2a6f65c7": "getRoundToGroupToInput(address,uint256,uint256)", +"2a70214a": "TWD_Omnidollar()", +"2a707d2c": "personal_withdraw(string,uint256)", +"2a709b14": "tokenManager()", +"2a70d1e7": "registerInit(address)", +"2a711ab4": "voteTeam(bool)", +"2a714078": "triggerAuth()", +"2a71e729": "NAGACOIN()", +"2a724f2a": "reclaimAllAndBurn(address)", +"2a729061": "IDXToken()", +"2a7292d0": "createToken(uint256,address,uint256)", +"2a7318ac": "changePresaleEndDate(uint256)", +"2a73db5c": "GetContributorInformation(address)", +"2a741385": "subTokens(uint256,string)", +"2a745971": "BlockKing()", +"2a745ae6": "flowerAllowed(address,address)", +"2a74833d": "getUserSupportInTournament(uint256)", +"2a7575ee": "availableBalanceOf(address,address)", +"2a75a2ac": "addressFundAdministration()", +"2a75cb71": "removeOwnerRequest2(address)", +"2a764406": "CreateLRP(address,uint256)", +"2a76a169": "freezeMultipleAccounts(address[],bool[])", +"2a76ffae": "depositEtherForRefund()", +"2a774c27": "totAllocation()", +"2a776e3d": "setKYCLimited(address[])", +"2a7781cc": "postData(address,string,bytes32)", +"2a77b4af": "FEE_MUL()", +"2a77f2b7": "minMaxBuyETH()", +"2a7806e4": "noTokenLocked()", +"2a7813a4": "BitcoinBlackPearl()", +"2a781f78": "getKYCPresalePayload(bytes)", +"2a782802": "creatorBalances(address)", +"2a792f57": "buyAKeyWithAmount(uint256,address,uint256)", +"2a795d79": "bounty_allocation()", +"2a79fa0e": "TakePrize(uint256)", +"2a7a3ac7": "claimUnallocated(address)", +"2a7a50a5": "Intro(string,string,string,string)", +"2a7a80a4": "trade(address,address,uint256,address,address,uint256,uint256,address,bytes)", +"2a7b0172": "dontSellRock(uint256)", +"2a7b2c93": "split(string)", +"2a7b3d4d": "resumeWhitelist()", +"2a7c24f1": "power(int256,int256)", +"2a7ca11f": "getMemeData(uint256)", +"2a7caaec": "FOUNDATION_WALLET()", +"2a7e0cc0": "createtoken(string,string,string,string,string,uint256)", +"2a7e5018": "timeVault(address)", +"2a7e60b6": "setRevealClosed(uint256)", +"2a7ef0cc": "IDEA()", +"2a7f26c4": "GetAllCurrencyIDs()", +"2a8014ca": "escrowAmount(address,uint256)", +"2a804835": "setCooldownEndBlock(uint256,uint64)", +"2a805069": "createToken(uint256,uint256)", +"2a808899": "getSkillCount(address)", +"2a8092df": "isMinting()", +"2a812941": "getInitializeDesignatedReporterAddressValue()", +"2a816e65": "factorWeight()", +"2a8219e2": "setFundingBlock(uint256,uint256,uint256)", +"2a827f99": "getTokenOwnerReward()", +"2a82fdbd": "approveAdd(uint256,address,bool)", +"2a835d67": "changePreIcoStartTime(uint256)", +"2a83cd70": "MrReaperToken()", +"2a845b9f": "ADPay()", +"2a8565b4": "GACT()", +"2a856fcf": "debit(bytes32[],uint256[],uint64[],uint8[],bytes32[],bytes32[])", +"2a858126": "tickerRegistry()", +"2a8587f9": "unAuthorized(address,address)", +"2a85a45d": "right38(uint256)", +"2a85b7dd": "getBackEtherFor(address)", +"2a862f1a": "notLessThan()", +"2a86eef3": "countDiscount(uint256)", +"2a874f34": "finishCampaign(bytes32)", +"2a87a86f": "shift(address,uint256,bool)", +"2a882d1d": "TokenHolderSnapshotter(address,address)", +"2a887299": "bid_threshold()", +"2a89d1bc": "TranchorToken(uint256,uint256,address,address)", +"2a89d6fd": "registerForGetTogether(address)", +"2a8a8b19": "bonusList()", +"2a8a8ebb": "unitStake()", +"2a8ab73c": "getProductOrderPayer(uint256)", +"2a8ade3a": "TotalCapacity()", +"2a8d1c61": "maxMask()", +"2a8d26e8": "approveTransfer()", +"2a8d7baa": "claimCompanyReserve()", +"2a8de0ca": "DranMe()", +"2a8e251f": "BitcoinNature()", +"2a8e391d": "OperationsFund()", +"2a8e5eae": "isInGroupOf(uint256,uint256,address)", +"2a8eb9a3": "arpToken()", +"2a8ec8cc": "numberOfPledges()", +"2a8f368b": "RESERVED_COMPANY_GROUP()", +"2a8f6aa8": "TOKENS_FOR_OPERATIONS()", +"2a8faf95": "secondaryGasLimit()", +"2a8fd223": "Flagged(address,bool)", +"2a9043e4": "sellValue()", +"2a9046d8": "disableGeneration()", +"2a905318": "TOKEN_SYMBOL()", +"2a905ccc": "getAdminFee()", +"2a9078d6": "OWNERS()", +"2a909257": "MultiCappedCrowdsale(uint256,bytes32,uint256)", +"2a9121c7": "ethereumToTokens_(uint256)", +"2a91ab16": "doAirDrop(address[],address,uint256[],uint256)", +"2a922d54": "collectedAddresses(uint256)", +"2a92362c": "getPaid(uint256)", +"2a9278c5": "optionPoolLockTotal()", +"2a92bb17": "OPRAH()", +"2a92bffa": "setEditionPackPrice(uint8,uint256)", +"2a93b5bb": "pausePreIco()", +"2a943be1": "LIRAX(string,string,uint256,string)", +"2a952b2d": "process(bytes32)", +"2a952b4b": "setParents(uint256,uint256,uint256)", +"2a970043": "create(string,uint256,uint256,uint256)", +"2a98e802": "setPerformanceBonus(uint256)", +"2a9a86c1": "createBucket(bytes32[])", +"2a9af123": "DOMTOK()", +"2a9b4921": "testManager(address)", +"2a9b6975": "SuperNanoCoin()", +"2a9b6dee": "pastFiveMinutes()", +"2a9ba092": "resizeIssuersArray(uint256)", +"2a9d04f0": "TOKEN_PRIVATE_SALE_CAP()", +"2a9e97f1": "matured_block_number()", +"2a9edf6f": "ownerSetStakeStartTime(uint256)", +"2a9f0fb2": "getPriceWithInterests(uint256)", +"2a9f1a79": "acceptPayment(address)", +"2a9fabd2": "betMatch(uint256,uint256)", +"2a9fb933": "MintExecuted(uint256,address,uint256)", +"2a9fb9b2": "userTransfer()", +"2aa0426c": "getAllBlocksByOwner(address)", +"2aa056cd": "shares_holders_count()", +"2aa073c5": "icoActive()", +"2aa0da47": "paymentSettings(string)", +"2aa1e848": "getPlayerAffT2(uint256)", +"2aa2b7eb": "T8CToken(address,uint256)", +"2aa2c381": "initialize(address,address,uint256,uint256,uint256,uint256,uint256,address)", +"2aa2f7a4": "getOwnOrderByIndex(uint256)", +"2aa3177a": "self_store()", +"2aa37a41": "substractBalance(address,uint256)", +"2aa49dd7": "Pixiu()", +"2aa4c051": "setifoodDevAddress(address)", +"2aa531d9": "getPlayerData(address)", +"2aa5411f": "jadeRec(uint256,uint256)", +"2aa5ed61": "DayLimit(uint256)", +"2aa6f98b": "ledToken()", +"2aa71e24": "init(bytes32,address)", +"2aa852b3": "removeListener(address,address)", +"2aa8be8d": "createPermission(address,address,bytes4,address)", +"2aa9466b": "updateMyWorks(bytes32,address,address,bytes32,uint256,uint256)", +"2aaa308e": "finalize(address,address,address,address)", +"2aaa49f5": "percentageQuarter3()", +"2aaa9de1": "AlicToken()", +"2aab1351": "receiveFromSigned(address,bytes,uint256,uint8,bytes32,bytes32)", +"2aab22ff": "BonusReferrerCrowdsale(uint256)", +"2aab80dd": "optionPool()", +"2aabb48e": "nextContributionCap()", +"2aabffdf": "disableSaleAgent(address)", +"2aac6911": "poolBLock()", +"2aac8ad4": "getFirstAndSecondItem()", +"2aad292e": "setOperatingOfficer(address)", +"2aadafe8": "refundAdvertiser(address,uint256)", +"2aae7f26": "Arcturus()", +"2aae88f6": "removeFromGeneration(uint256,address)", +"2aaee1a5": "Drawer()", +"2aaef20c": "sixth_withdrawal(uint256)", +"2aaefa9f": "centsExchangeRate()", +"2aaf1685": "testControlCreateWithParentSameItemId()", +"2aafbf7c": "Getether()", +"2aafe9e7": "metToken()", +"2ab0252d": "getERC721AddrPawn(uint256)", +"2ab08396": "OwnersDb()", +"2ab0be77": "getTicketCode(uint256)", +"2ab0bf3c": "GetContributorData(address,uint256)", +"2ab13037": "votesNo()", +"2ab19a7e": "GoalMaximumReached(address,uint256,uint256)", +"2ab2174e": "subOnOneStage(address,uint256,uint256)", +"2ab22592": "updateWinnerBid(bool,bytes,uint256,bytes,bytes,bytes)", +"2ab24e3b": "commitVote(address,bytes32,bytes32,bytes32)", +"2ab26831": "getRateIco()", +"2ab28ce4": "buyTree(uint256,address)", +"2ab290fc": "updatejingzhi(uint256,string,uint256)", +"2ab34a91": "claimEnergy()", +"2ab4672a": "BatchCreateSaleAvgPrice(uint256[],uint256,uint256,uint256,uint64,address)", +"2ab4d052": "maxTotalSupply()", +"2ab4ebfa": "AddItem(address,address)", +"2ab6a50e": "payoutBigBonus(address)", +"2ab6f3f0": "BteamBets(uint256)", +"2ab6f8db": "renounceOperator()", +"2ab7173b": "lockup_startdate()", +"2ab72d2f": "assetIdOfToken(uint256)", +"2ab76377": "icoEndTimestampStage3()", +"2ab7961e": "aDeleteMessage(uint256,string,string)", +"2ab7d104": "_getAllRevisionIpfsHashes(bytes32)", +"2ab8de9b": "hash_ripemd160(string,uint256)", +"2ab8fc2d": "reservesPerTokenSrc(address,uint256)", +"2ab90d66": "ownerrestart()", +"2ab924d2": "HRCoin()", +"2abaa0c9": "picosCap()", +"2abaca23": "participate_in_arbits_presale_fiat(address,uint256)", +"2abd7fc8": "withdrawDao()", +"2abdbeb8": "forceOverStage()", +"2abdf1ef": "_update(string,uint256,string,uint256,uint256,uint256)", +"2abe4f60": "getInStake(uint256)", +"2abe5a2d": "getCandidate(uint32)", +"2abf2aae": "payMaxAuctionEther()", +"2abfab4d": "donationCount()", +"2abfaf1f": "setFreeTransfer(bool)", +"2abfbd28": "mintCommunityRewards()", +"2ac016ad": "addBackend(address)", +"2ac025ab": "removeAddressFromRole(address,string)", +"2ac08739": "getCurrentDuke(string)", +"2ac110c5": "icoPhase2Start()", +"2ac12622": "cancelled(bytes32)", +"2ac197c4": "IPMCOIN()", +"2ac1a995": "HiBTCToken()", +"2ac1db5a": "getEthToTokenUpdateOrderHint(uint32,uint128,uint128)", +"2ac20ed4": "createInitialDays(uint256)", +"2ac2af53": "updateParameters(bytes32)", +"2ac306b0": "BitCoin()", +"2ac364b4": "PalavraCoin()", +"2ac394a4": "durationBetweenRewardMints()", +"2ac48524": "getTokensCount(address)", +"2ac4a51d": "OVALExchangeToken()", +"2ac50df1": "tokenPriceOracle()", +"2ac68b78": "acceptPayment(address,uint256)", +"2ac69167": "StockLocation(string)", +"2ac6f15f": "exchangePreDGZTokens()", +"2ac71c16": "maxUSD()", +"2ac7f8ce": "CrowdSaleChanged(address)", +"2ac85e46": "isValidNode(uint256)", +"2ac87112": "ETHRaised()", +"2ac9bf09": "bid(uint256,uint256,uint256)", +"2aca2b16": "setInvestxPlatform(address)", +"2acada4d": "getAllAssets()", +"2acc204c": "killMeshPoint(int256,address,address,string,address)", +"2accf2f7": "splitFunds(address,address)", +"2acd1a95": "sling(string,string,string,string,uint256)", +"2acd2000": "removeFreezer(address)", +"2acd7e41": "transferOwnerToTest()", +"2acefd0f": "setCitySlogan(uint256,string)", +"2acf3908": "StealthGridToken(uint256,string,string)", +"2acf8551": "playMeta(address,address,uint256)", +"2ad02172": "MAX_PREICO_SUPPLY()", +"2ad0a4e9": "pauseNotice()", +"2ad11b9e": "getMinerals()", +"2ad12937": "OwnableToken()", +"2ad1bc09": "steal(int128,string,address)", +"2ad2a9f8": "transfer(bytes32,uint256,address)", +"2ad2ae2e": "collectLocalBounty(uint16,uint256)", +"2ad3274f": "UpgradeScheme()", +"2ad3509b": "ExcreteumToken()", +"2ad389e3": "constructHashRs1Rs2(bytes,bytes)", +"2ad3e8bc": "GreenChain()", +"2ad3ef70": "randContract()", +"2ad45312": "WEI_MINIMUM_PURCHASE()", +"2ad4d818": "userCreate(string,string)", +"2ad64a4d": "MAXCAP_TOKENS_PRE_ICO()", +"2ad8016e": "changeDiscount(uint256,uint256,uint256)", +"2ad8aaa6": "bonusAmmount(uint256)", +"2ad8d875": "getPayeeExpectedAmount(bytes32,uint8)", +"2ad8fbd2": "MerrierToken(string,string,uint256,uint256,bool)", +"2ad92740": "tokensPurchased(address)", +"2ad9527e": "h_pwd()", +"2ad95786": "winner(address)", +"2ad9618c": "startCrowdsale(uint256,uint256,uint256,uint256[],uint256[])", +"2ad99825": "setOwnerCutPercentage(uint256)", +"2ad9efc0": "UbayToken(address,uint256)", +"2ada2596": "getMember(address)", +"2adbb84d": "onFreezing()", +"2adbc396": "BurnableCrowdsaleToken(string,string,uint256,uint256,bool)", +"2adc2cd2": "COIN_PER_ETHER_ACTIVE()", +"2adc7da3": "setCentralBanker(address)", +"2add5a50": "cofounders(uint256)", +"2add78bb": "StartQ(string,string)", +"2addeab6": "getSolver(uint256)", +"2ade6c36": "getNodeAddress(bytes32)", +"2adf68bb": "UTPLToken()", +"2adf7d2f": "tenZero()", +"2ae1158d": "votingWeightOf(address,uint256,uint256,uint256)", +"2ae26d8e": "tenDecimalPlaces()", +"2ae3594a": "hit()", +"2ae418a4": "getPrivatePreSaleTokenBalance(address)", +"2ae4b85f": "MAX_HOST_PERCENT()", +"2ae524c2": "mintRiskTokens(address,uint256)", +"2ae6218d": "getBurnPrice()", +"2ae67563": "GameSicBo(string,uint256,uint256,uint256,address)", +"2ae6f9c2": "Ownerburn(uint256,address)", +"2ae72544": "length(int256)", +"2ae7c2df": "Ethernite()", +"2ae7c313": "Injected(address,uint256,uint256)", +"2ae8284a": "_newGame(uint256)", +"2ae8636d": "withdrawPRSTokens(address)", +"2ae87a70": "getNumContents(address,uint256)", +"2ae8a2d2": "sendFunds(address,uint256,uint256)", +"2ae8a7e3": "checkRole(address,bytes32)", +"2ae8b4a3": "actualGotETH(address)", +"2ae9782c": "MARRON()", +"2ae9c600": "protocolVersion()", +"2aea4d21": "sealer()", +"2aeaa291": "checkRewards()", +"2aeabfbf": "getLiquidityAndPositions(bytes32,address)", +"2aeacd4a": "exchangeTokensFromOtherContract(address,address,uint256)", +"2aebcbb6": "finishVote()", +"2aec3169": "setThirdWinner(address[])", +"2aec3a71": "ProofOfHumanityAddOn()", +"2aec9466": "updateInfo(uint256,uint256,uint256)", +"2aed1390": "kyberContract()", +"2aed1905": "setMatchingEnabled(bool)", +"2aed256e": "inRangeToDisembark(uint16,uint16,address)", +"2aed7f3f": "reclaimContract(address)", +"2aee19c7": "testCreateWithNonce()", +"2aef3898": "ChangeMinSaleAmount(uint256)", +"2aef6ff6": "serviceTrasferFromDist(bytes32,address,uint256)", +"2aefb7c5": "funds_claimed()", +"2af004e7": "setReferralAddress(address,address)", +"2af05c4e": "lastMintingTime()", +"2af05d07": "unlockCurrentAvailableFunds()", +"2af0ac71": "getAmountSoldAfterPowerDay()", +"2af123b8": "diffHours(uint256,uint256)", +"2af1616d": "MissionToken(uint256,string,uint8,string)", +"2af1b5a2": "protectedUnlock(address,uint256,string)", +"2af1c247": "mint(string,uint256,uint8,string)", +"2af22e3b": "getJobs(address,uint256)", +"2af37ba0": "Donate(string)", +"2af38eab": "totalBspAmount()", +"2af39bab": "AssetBackedTokens(string,uint8,address)", +"2af3b7f8": "updateState(bytes32,uint256,bytes,bytes,bytes)", +"2af4c31e": "changeOwnership(address)", +"2af52312": "TRAToken(address)", +"2af5356a": "claimTeamTokens()", +"2af5cfdd": "priceOfEthOnEUR()", +"2af5e6b2": "setPriceEther(uint256)", +"2af6fb10": "ERC20TokenImpl()", +"2af7ac0a": "rtu(uint256)", +"2af7c4d7": "Certifiers()", +"2af7ceff": "testPrice(uint256)", +"2af7ecc7": "addRosenCertAdmin(address)", +"2af8afca": "dgt()", +"2af8b645": "release(bytes32,bytes32)", +"2af8fd94": "ISmartCert()", +"2afaca20": "buy(uint256,address,uint256)", +"2afb21bc": "InvestWithdraw()", +"2afb9fb1": "isCardTradeable(uint64)", +"2afbbacb": "canStake(address,uint256)", +"2afbc38f": "Annexe_SO_DIVA_SAS()", +"2afbe339": "QQQToken()", +"2afcdfbc": "createGen0Auction(uint256,uint256,uint256,uint256,uint256)", +"2afcf433": "PriceTwoEnable()", +"2afcf480": "invest(uint256)", +"2afd1a7d": "getReleasableAmount(address)", +"2afe4c37": "tokensleft()", +"2afe9f1e": "TestTokenContract()", +"2afed67e": "amountFundBounty()", +"2aff101c": "LinearDecayingTokenFunction()", +"2aff2843": "servusMultiSig()", +"2aff49d7": "setSizeAndRate(uint256,uint256)", +"2b000f00": "calculate_next_expected_wei(uint256,uint256,uint256,uint256)", +"2b00c6fd": "createHorseShoe1(uint256,uint256,address)", +"2b019692": "RYNote()", +"2b01bf51": "isValidMember(address)", +"2b028bbb": "LKCExchangeRate()", +"2b02d9af": "NIMBUS()", +"2b03b8d4": "IMDEXdeposit()", +"2b03d70e": "undisputeFavor()", +"2b04451a": "totalExtraOptions()", +"2b048f77": "getMyDeployAt(uint32,uint32)", +"2b04b478": "removeUsersFromGroup(bytes32,address[])", +"2b04d8f7": "takeOffer(uint256,address)", +"2b04e840": "getBalance(address,uint256)", +"2b051b50": "revealVoteOnProposal(bytes32,uint8,bool,bytes32)", +"2b05d346": "CallScheduled(address)", +"2b069816": "getJobValue(uint256)", +"2b071e47": "spread(address[],uint256[])", +"2b07682a": "withdrawFoundersTokens()", +"2b086b92": "convertToTMEX(uint256,address)", +"2b08fef7": "buy_token(address[],uint256)", +"2b093fe9": "TOKEN_MULTIPLIER()", +"2b0999f3": "initialYear()", +"2b09e707": "amountHives()", +"2b0aa1ed": "updateEthFee(uint256)", +"2b0ac7c4": "_createToken(uint256,uint256,uint256,uint256,uint256,address)", +"2b0cb194": "mintRawTokens(address,uint256)", +"2b0d0180": "luckyBuy()", +"2b0d0c6a": "afterFirstRefundRoundFundsReleaseNumerator()", +"2b0e16bf": "PRESALE_BALANCES()", +"2b0e64b3": "determineCommissions()", +"2b0ebfe9": "activatedJuryTokens(address)", +"2b0fbf72": "getMobster(uint256)", +"2b0fd89e": "ARcoin()", +"2b0fdb72": "MINIMUM_MANUAL_SIGN_PERIOD()", +"2b0ff02d": "listCard(uint64,uint128,uint128,uint24)", +"2b100a31": "setStatsSumHours(uint256,uint256)", +"2b1071c9": "testTransferToNullAuthority()", +"2b112e49": "getCirculatingSupply()", +"2b11e7f6": "SILVER_AMOUNT_SKL()", +"2b124245": "selfRegisterDINsWithResolver(address,uint256)", +"2b12553b": "saleExchangeRate()", +"2b13d799": "redeemedList(uint256)", +"2b1453dd": "addSwap(string)", +"2b146407": "PrivateSale()", +"2b14b712": "addClient(address,address,uint256)", +"2b14ca56": "sellFee()", +"2b151096": "placeSaleOrder(bytes8,bytes8,uint256,uint256,uint256)", +"2b15eb9b": "TongTong(string,string,uint256)", +"2b16b56a": "setIndex(uint256,uint256)", +"2b16f1ef": "nextPoolPercentage()", +"2b17355e": "balancesPrivate(address)", +"2b17b6a9": "bnbToken()", +"2b1841d2": "openCdp(uint256,uint256,uint256,address)", +"2b1857a5": "dividendPathways(address,uint256)", +"2b190f18": "getFreeTokens()", +"2b193ac4": "INITIAL_AC_SUPPLY()", +"2b198366": "addCertifier(address)", +"2b198808": "BloccaConto(address,bool)", +"2b1c511f": "getAvailability(address)", +"2b1c6982": "testTemp2()", +"2b1dd8da": "refundFees()", +"2b1e27f1": "migrateDomain(uint256,bytes32)", +"2b1e5016": "releaseTheHodl()", +"2b1ed01a": "warehouses()", +"2b1f7660": "PRZTToken(uint256,string,uint8,string)", +"2b1fcc10": "impl_cancelOrder(address,uint256,bool)", +"2b1fd58a": "acceptBid(uint256)", +"2b20e397": "registrar()", +"2b214618": "listAllBuyBalance(address,uint256,uint256)", +"2b21502f": "totalEthRcvd()", +"2b21d01b": "rateBTCxETH()", +"2b223264": "BitcoinBrand()", +"2b22a18c": "allocate8ProjectToken()", +"2b232741": "pullFromCirculation(uint8)", +"2b2443db": "canRaiseUsing(uint256)", +"2b2449b5": "setMaxCAP(uint256)", +"2b24aa6e": "rateA()", +"2b252d17": "_randomize(uint256,uint256)", +"2b25303b": "USDTUBE()", +"2b25a7e4": "giveKudos(address,uint256)", +"2b28d2d0": "totalFrozenAccountsMapping()", +"2b291eb6": "UserAddTicket(bytes)", +"2b29532b": "distributeLCASH(address[],uint256,uint256)", +"2b297f9e": "registerDao(address)", +"2b29908d": "BGB_address()", +"2b29fbfa": "testFail_voterNotCertified()", +"2b2b2882": "mintIcoTokenMultiple(address[],uint256[])", +"2b2badb3": "getAuditor(address)", +"2b2c71af": "doTradeofCollateral(address,address,uint256,uint256,uint256,uint256)", +"2b2c91b9": "refundApprove(address,uint256)", +"2b2dc12e": "RECEIVER_PAYOUT_THRESHOLD()", +"2b2e7159": "typeB()", +"2b2e76f3": "LA_wallet()", +"2b2f4d84": "setVestingParams(uint256,uint256,uint256)", +"2b2f88a8": "quantidadeDeAutorizacoes(address)", +"2b2fbd68": "minTicketEur()", +"2b302b60": "fairymasterReq()", +"2b30a84e": "rollTwo(address,uint8,uint8)", +"2b30d2b8": "invoke(uint256)", +"2b318568": "AddDynamicProfit(address,uint32,uint256)", +"2b321633": "testCloseChannel()", +"2b3297f9": "swapper()", +"2b337152": "totalissue()", +"2b343100": "newPlayerFee()", +"2b359e6b": "fundingTokens()", +"2b35d08a": "_computePrice(uint256)", +"2b36316e": "updateStageCap(uint256)", +"2b36a657": "profits()", +"2b379218": "globalDailySupply()", +"2b37d313": "tdeIssuer()", +"2b38ee56": "exitFee_()", +"2b3a4ae3": "adjustFeeEntitlement(address,uint256)", +"2b3b885d": "BGJC(uint256,string,string)", +"2b3c7562": "tierThreePurchase()", +"2b3da717": "BOBOTOKEN2()", +"2b3eae40": "MatchmasterTakeover(address,address,uint256)", +"2b3eb76c": "awardAmountPrime()", +"2b3ed526": "setFiatContract(address)", +"2b3ede1c": "WithdrawAll(address)", +"2b3f9f01": "_setSpendAvailable(uint256)", +"2b3fbbbb": "setPixelColor(uint16,uint16,uint24)", +"2b3ff9e9": "DLVO()", +"2b4143bd": "BasketRegistry()", +"2b4158cb": "buyFreePixels(uint256,uint256,uint256,uint256)", +"2b41a901": "grandTotalAllocated()", +"2b423b05": "changeRequiredMinor(uint256,bool,bytes)", +"2b42a89a": "setWhitelistOnlyPermission(bool)", +"2b42f4b2": "TokensCreated(address,uint256,uint256)", +"2b435366": "fund(address,bool)", +"2b4353f2": "payoutRate()", +"2b44d05f": "LISA()", +"2b44e5be": "distributeTokenToAddress(address,address,address,uint256)", +"2b44fd38": "dayLimit_()", +"2b455ac6": "insertMilestone(uint8,uint256,uint256,uint256)", +"2b459e81": "SpermLabsReborn()", +"2b45bcf9": "minimumHydroStakeUser()", +"2b4656c8": "initialize(address,address,address,uint256,uint256,uint256,uint256)", +"2b46e7f8": "SLUTZToken()", +"2b47571a": "resetWithdrawTimer(uint256)", +"2b47cb17": "TopToken()", +"2b49c9c2": "updateBanqueAddress(address)", +"2b49d425": "currentProposal()", +"2b49d9e5": "setFighters(uint32,uint32,uint256[])", +"2b4a27cb": "fechPreAllSumNumForCandidate()", +"2b4a2d0a": "getInfoFromCreateAuction(bytes)", +"2b4a3b31": "doTransferFrom(address,address,uint256)", +"2b4a964b": "networkGrowthAmount()", +"2b4bdf76": "getBdpController(address[16])", +"2b4ca103": "TXQToken(address,uint256)", +"2b4cbcc3": "getCombat(uint256)", +"2b4d0450": "BaseToken(string,string)", +"2b4d7c3e": "getPositionLender(bytes32)", +"2b4e8413": "userNumber()", +"2b4f79b3": "buyMessage(bytes32,uint256,string)", +"2b5129f5": "WaterMeterAcorn(bytes32,uint8,uint256,uint256,uint256)", +"2b513549": "mokenNameBytes32(uint256)", +"2b514749": "getTeamPrice(uint256[])", +"2b5184a6": "addSponsorship(address,address,uint256)", +"2b5187fd": "STCC()", +"2b521416": "features()", +"2b549b82": "createAuction(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"2b54c3ce": "addToken(uint256,string)", +"2b554142": "redeemMany(address[],uint256[])", +"2b556813": "twitterDropMultipleAmount(address[],uint256[])", +"2b5570ad": "PatientFactory()", +"2b5630c2": "displayvehicledetails(address,uint256)", +"2b57298b": "getDate(uint256)", +"2b577ec4": "PREMINE_RELEASE(address,uint256,uint256)", +"2b58072f": "getDatasetsCount(address)", +"2b58150b": "setLotteryDuration(uint256)", +"2b587555": "privateTransfer(address,uint256)", +"2b58e202": "tokensOfOwnerFromIndex(address,uint256,uint256)", +"2b5914fe": "setUserName(string)", +"2b5947e7": "checkDivsRndView(address)", +"2b596a23": "balanceOfShares()", +"2b597e4d": "updateBool(bytes32,bool)", +"2b59d1fc": "borrar()", +"2b5ad2ad": "secondTimer()", +"2b5af004": "appendDecryptedBid(uint256,uint256,uint256,address,address,uint256,uint256,uint256)", +"2b5b6872": "AIRDROP_AMOUNT()", +"2b5da915": "Property(string,string,uint256,uint256)", +"2b5daa86": "newModule(string,address,bool,bool)", +"2b5f227e": "encodeBytes(bytes,uint8)", +"2b5fa90a": "currentselectorchoosegiverandreceiver(address,address,address,address)", +"2b5faebd": "_calcTokens(uint256,uint256)", +"2b5fc4ce": "RSUNToken()", +"2b603c71": "allowances(address)", +"2b6133f5": "checkTierCap(uint8,uint256)", +"2b625874": "distributePeerTokens()", +"2b62ef2a": "CryptoCurrencyToken()", +"2b633f77": "ballotCancelingThreshold()", +"2b644ac8": "_setAvatarIfNoAvatarIsSet(address,uint256)", +"2b65d18a": "wireLimit()", +"2b65e040": "ownerPool()", +"2b664d8a": "getUsersByDocHash(bytes32)", +"2b680932": "ANNOUNCE_WINNER_DEADLINE()", +"2b68b9c6": "destruct()", +"2b68bb2d": "cancelContract()", +"2b68fc21": "guarenteedPaybackTime()", +"2b69f40d": "PaymentServ(address,address,address,address)", +"2b6a8b46": "addSpace(uint256,uint256,bytes,uint256,uint256,uint256,uint256,string,string,uint256)", +"2b6aa69d": "NewFunds(address,uint256)", +"2b6ada6d": "WalletWithDailyLimit(address[],uint256,uint256)", +"2b6b7c69": "airdropIndividual(address[],uint256[],uint256,uint256)", +"2b6bbc31": "testingOnly()", +"2b6bc920": "answerRequest()", +"2b6bd13a": "ChainInfo()", +"2b6c750f": "loseSponsor(uint32,int256)", +"2b6d0ceb": "test(address,address)", +"2b6d7706": "transferTokensManuallyToMany(address[],uint256[],uint256)", +"2b6d7a66": "hasActivePass(address)", +"2b708fc9": "usageFee(bytes32,uint256)", +"2b70faf1": "game_paused()", +"2b711051": "investorsCount()", +"2b713d71": "rankToAddress(uint256)", +"2b71b0e5": "getStat()", +"2b7216e5": "donateToCampaign(uint256,uint256)", +"2b726758": "ETIC()", +"2b72c5fc": "FANCY(uint256,string,string)", +"2b73a83b": "CBS(string,string,uint8,uint256,uint256,uint256,bool,bool)", +"2b741ed6": "claimedFees(uint256,address)", +"2b7423ab": "average(uint256,uint256)", +"2b747a29": "buy_tickey(address)", +"2b750f4f": "DIVISOR_PRICE()", +"2b75289b": "placeBet(uint8,uint8,uint8,int256)", +"2b7568d9": "admin_withdraw_all(address)", +"2b7582c0": "sendEthForReward()", +"2b76823c": "ICOBuyer(address,address,uint256,uint256,uint256)", +"2b770ee9": "Ddjtab(uint256,string,string)", +"2b774d46": "XWALLET()", +"2b78194f": "GAS_REFUND()", +"2b7832b3": "adminCount()", +"2b783bc8": "addCredentials(bytes32,bool)", +"2b785960": "testBitAndSuccess()", +"2b788e33": "MAX_BOUNTYTOKENS_AMOUNT()", +"2b790ee4": "calcProfitFromTotalWon(uint256,uint256)", +"2b791053": "getDailyLimitRemaining()", +"2b791d6e": "storedDividendsOf(address)", +"2b79d7ba": "testFailMoveWithoutTrust()", +"2b7ac3f3": "verifier()", +"2b7b3a6c": "createBuildingAuction(uint32,uint8,uint8,uint8,uint8,uint8,bool)", +"2b7be84b": "AfterSchoolCrowdsaleToken()", +"2b7c3138": "MANETokenPartnerCrowdsale(uint256,uint256,address,address,address,address,address)", +"2b7ce9cd": "updateThresold(uint256)", +"2b7d13cc": "withdrawRemainingToken(uint256,address)", +"2b7d177b": "isvalidOrg(address,address)", +"2b7dd488": "totalLBSold_GENERAL_3()", +"2b7e063e": "GenOutChipsNum(uint256,uint256,uint256)", +"2b7e2169": "getTotalSell(uint256)", +"2b7e4295": "invadePlanets(uint256,uint256[],uint256[])", +"2b7ec7fe": "getLotInvested(uint256,address)", +"2b7fda2f": "mintAllowed(address,address,uint256,int256)", +"2b81b8a4": "alreadyRegisteredMessage()", +"2b82714f": "deliverAngelsREDAccounts(address[],uint256[])", +"2b828e4a": "addTx(bytes32,bytes4,address)", +"2b82aed6": "setPayerAddr(address)", +"2b82cf1f": "unFroze(address,uint256)", +"2b84aabe": "trust(uint8)", +"2b84fe83": "reserveFeeToBurn(address)", +"2b85ed9c": "purchaseCount()", +"2b860e6d": "transferToThroughVariable(address,uint256)", +"2b861629": "storeBlockHeader(bytes)", +"2b865dea": "airdropTokenDistributionMulti(address[],uint256[])", +"2b86d48a": "MDKToken(address)", +"2b876784": "ZHOUToken()", +"2b877dfd": "sendCoin(bytes4,bytes32,bytes32,uint256)", +"2b878c7c": "KYCValid(address)", +"2b88c42d": "buyItem1()", +"2b88cbbf": "getExcludes(uint256)", +"2b8a1c00": "t2tokenExchangeRate()", +"2b8a1c5a": "setGuardian(address,bool)", +"2b8a36e0": "freezeTransferTime()", +"2b8a789b": "ChangeGameHidden(address)", +"2b8af65b": "INTERFACE_SIGNATURE_ERC165()", +"2b8b09d4": "REDGIL()", +"2b8b1bc4": "transferAndFrostTokens(address,uint256,uint256)", +"2b8b6667": "deregister(address[])", +"2b8bbbe8": "add(uint256,address)", +"2b8c8a20": "Sale(address,uint256,uint256,uint256,string,uint256)", +"2b8cc346": "acceptRequest(address)", +"2b8cd2f7": "withdrawUncommittedTokens(uint256)", +"2b8cd5c6": "getComponentSupport(uint16)", +"2b8d0cd7": "setIcostart(bool)", +"2b8e4df1": "vest(bool)", +"2b8f2042": "withdraw_funds()", +"2b8f7a49": "depositMoney(string)", +"2b8f899e": "OzoneToken()", +"2b901a0a": "getOwnerByName(bytes32)", +"2b90557c": "minSet()", +"2b905bf6": "TEAM_WALLET()", +"2b90bb3a": "distributeGoTokens(address,address)", +"2b9122df": "getTimeTillEnd()", +"2b913151": "secondCapEndingBlock()", +"2b919aa6": "validPurchaseSize()", +"2b920a6b": "CampaignAccountFactory(address)", +"2b925b25": "minimumInvestment()", +"2b92b8e5": "hashValue()", +"2b92c776": "cancelBuyOrder(address,uint256,uint256,uint256,uint256)", +"2b9530d8": "transferTokens(address,uint256[])", +"2b956ff7": "getUserId(address)", +"2b968958": "revokeOwnership()", +"2b96a0a1": "getGamesMeta(uint256[])", +"2b96c00e": "abortGame(address,uint256)", +"2b97c6e4": "Cilox()", +"2b98222e": "getInstitutionByAddress(address)", +"2b985942": "LittleStoreERC20Token()", +"2b985f7c": "testNegatives(int256)", +"2b9897fb": "smallCapLimitOf(address)", +"2b991746": "approveFor(address,address,uint256)", +"2b99a087": "getLpIsWorking(int256)", +"2b99db6a": "tokensApproved()", +"2b99f359": "carOfByIndex(address,uint256)", +"2b99f3e1": "setIsTurnDataSaved(bool)", +"2b9a5c34": "_getTileAt(int32,int32)", +"2b9a7fae": "_updatePlayerOverrideId(uint256,uint256)", +"2b9b7573": "MAX_TRANSFERS()", +"2b9be92e": "GanaTokenAirdropper(address)", +"2b9cb4f8": "uniq(uint64[])", +"2b9cd08b": "submitAddOwnerTransaction(address)", +"2b9ce01e": "currentIcoTokenPrice()", +"2b9e05d1": "Betportchain(uint256,uint256)", +"2b9e5088": "filterTransactions(bool)", +"2b9e98b1": "changeFundingPercentages(uint256,uint256,address)", +"2b9edee9": "softCapReached()", +"2b9fd446": "isHatchOnCooldown()", +"2ba00198": "setBaseCap(uint256)", +"2ba0ab78": "EyeToken()", +"2ba0b09f": "AddNewCategory(bytes4,uint8,uint8,address)", +"2ba11f2a": "CONVERSION_DECIMAL_FACTOR()", +"2ba1e439": "createOraclizeCallback(bytes32,uint256,uint8,uint256)", +"2ba25366": "mintInBatches(address[],uint256[])", +"2ba29217": "canExecute(uint256,uint256)", +"2ba2a853": "thelnwaonToken()", +"2ba2d714": "LordXChain()", +"2ba2ed98": "setMagicNumber(uint256)", +"2ba5390f": "isFirstPartReleased()", +"2ba5b90d": "get_number_of_DBs()", +"2ba665e5": "getDoc(uint256)", +"2ba6d8fe": "PRESALE_WEI_CAP()", +"2ba73c15": "setCOO(address)", +"2ba7910a": "provider1()", +"2ba7fc87": "tgeIssuer()", +"2ba8b7e4": "getMinimumAuctionPrice(uint256)", +"2ba8f526": "OfferToGuardian(uint256,uint256)", +"2ba96462": "supportsERC165Interface(address,bytes4)", +"2ba996a5": "getListedTokens()", +"2baa2c58": "disqualifyBid(address,bool)", +"2baab935": "Fuschain(address,uint256)", +"2baabbf7": "finalSupply()", +"2babd014": "sellSecond(uint256)", +"2bac0b3b": "vendingCreateCollectible(uint256,uint256,address)", +"2bac276b": "badgeTransfer(address,uint256)", +"2baeceb7": "decrement()", +"2baf2acb": "mintTo(address,uint256,uint256)", +"2baf4f22": "_safeFalse()", +"2bafc817": "EpietherToken()", +"2bb03ab9": "earlyPresaleEDUSupply()", +"2bb03f6d": "ValidateCitySnapshot(address,uint256)", +"2bb0e10b": "serviceAccount()", +"2bb14104": "myData()", +"2bb20f4a": "soulsSold()", +"2bb22480": "calculateDrugSell(uint256)", +"2bb3dcc8": "totalInvocations()", +"2bb4c7d5": "STribeToken()", +"2bb51a05": "EDEX(address,uint256,uint256,uint256)", +"2bb685bc": "kill2()", +"2bb6ccf1": "delAuditAddress(address,address)", +"2bb70e54": "lockMasterTransfers()", +"2bb768f0": "adminGetCityData(address)", +"2bb77b8e": "setRewardAddr(address,address)", +"2bb81546": "getClaim(string)", +"2bb9cb1d": "buyXid(uint256,uint256,bytes32)", +"2bb9ffef": "startBalance()", +"2bba2d6d": "changeInvitedReward(uint256)", +"2bbb44b8": "adminCreat(address)", +"2bbc50b5": "getTotalInvestedEur()", +"2bbc9396": "periodICOStage2()", +"2bbd3c93": "ART_CONTRACT_ADDRESS()", +"2bbd59ca": "messages(bytes32)", +"2bbd84e8": "totalPurchaseValueInWei()", +"2bbd88f3": "LOBO()", +"2bbd9530": "unregisterAddress(bytes32)", +"2bbdb18a": "hasEnoughApproval(uint256,uint256)", +"2bbe62d6": "createSetup(address,uint256,uint256,bool,address,uint256)", +"2bbeac91": "lockTokenHolder()", +"2bbf532a": "isUnlocked(address)", +"2bbf54e8": "isBuyStopped()", +"2bc06a92": "canSend(address)", +"2bc0fe34": "infoMining(address)", +"2bc24d52": "IXTPaymentContract(address)", +"2bc31ca4": "developers()", +"2bc3217d": "forbid(address,address,bytes32)", +"2bc3656c": "buyTokensPreSale(address,uint256)", +"2bc38531": "setup(string)", +"2bc3a349": "GWTCrowdsale()", +"2bc402fa": "TOTAL_PREALLOCATION()", +"2bc40f9a": "setAddressUInt8(bytes32,bytes32,address,uint8)", +"2bc43fd9": "claim(address,uint256,uint256)", +"2bc46f27": "getQuestionIndex(uint256)", +"2bc4aa1a": "showInvestEther(uint256)", +"2bc53254": "priceFci()", +"2bc542a4": "votePublic(address,bool)", +"2bc57d73": "_doTransferFrom(address,address,uint256,bytes,address,bool)", +"2bc588ee": "release(uint256[],uint256[])", +"2bc5ca7a": "fullCycleSellBonds(uint256)", +"2bc5f9cb": "updateRateInWei()", +"2bc6597c": "depositsTillNow()", +"2bc67bde": "MIN_TASK_VALUE()", +"2bc80f3a": "T()", +"2bc85d5d": "updateTokenPriceProvider(address)", +"2bc86dc0": "AddBankerRound(uint8)", +"2bc89ff6": "REV()", +"2bc8ba53": "solicitaPagamento(uint256)", +"2bcb849c": "updateFeeProvider(address)", +"2bcbdf7f": "s29(bytes1)", +"2bcbe1b5": "getCelebrity(uint256)", +"2bcc79a7": "MockDeed(address)", +"2bccf04e": "createSale1()", +"2bce9e7b": "updateToken(address,uint256)", +"2bcef221": "signOne()", +"2bcf300e": "LC(uint256,string,string)", +"2bcf5760": "addToken(address,address,uint256,uint256,uint256,uint256)", +"2bcf892c": "div32(uint32,uint32)", +"2bcfcd7b": "getBonusAmount()", +"2bcfe0a6": "FitToken()", +"2bd00610": "numberOfCyclePlayers()", +"2bd0bb05": "totalSpentPerDay(uint256)", +"2bd0ce0f": "cancelBuyTokenOrder(uint64)", +"2bd152f0": "_getCollectibleDetails(uint256)", +"2bd15c25": "_doCancel(uint256)", +"2bd185e5": "appendTokenHolders(address)", +"2bd21738": "CAIDCrowdsale(address,address)", +"2bd2523e": "cooAddReviewer(address)", +"2bd2a965": "openNextSale(uint256,bytes24,uint256,bytes24,uint256)", +"2bd30ca3": "costContract()", +"2bd4aa40": "total_amount(string,uint256,uint256)", +"2bd543c7": "calcTimedQuota(uint256,uint256,uint256,uint256)", +"2bd55918": "confirm_token_deposit()", +"2bd57604": "claimPlotMultiple(uint256[],uint256)", +"2bd579fc": "ico(uint256,uint256,uint256,uint256,uint256[],uint256[])", +"2bd5a48d": "finishMintingToken(uint256)", +"2bd5e353": "phase3Duration()", +"2bd71875": "hasMissedCheckpointSubmission()", +"2bd75c3c": "sendMarketingAndRNR()", +"2bd7cd17": "killToken()", +"2bd7e5fc": "getSGNAuthorizationManager()", +"2bd928e4": "commonDeposit(address,uint256)", +"2bd9530a": "editGas(uint256,uint256)", +"2bd97c6d": "getDawexSignature(string)", +"2bda04c5": "autoFreeze()", +"2bda1a55": "frozenReserveTeamRecipient()", +"2bda2a49": "BHIMToken()", +"2bda4eee": "getBridgeValidatorsInterfacesVersion()", +"2bdad637": "tokensSupply()", +"2bdb0d92": "getShareToken()", +"2bdb33c3": "getNumberOfDisputedDealsProPatient()", +"2bdb7097": "setRate(address,uint256)", +"2bdbc0ce": "ContractTokensReclaimed(uint256)", +"2bdc05c5": "assertEq26(bytes26,bytes26,bytes32)", +"2bdcd90d": "claimChip(uint256,string)", +"2bdd2290": "setBlockNum(uint256)", +"2bdd530b": "holderReferalTokens()", +"2bdd5958": "Purchased(address,uint256,uint256,uint256)", +"2bddb9b5": "canTransferIfLocked(address)", +"2bddc31c": "coauthor()", +"2bde41e1": "submitRing(address[3][],address,uint256[7][],uint256,uint8[1][],uint8,bool[],uint8[],bytes32[],bytes32[],uint256,uint16)", +"2bde8e96": "getGPShashRandomValue()", +"2bdf66d5": "SmartToken(string,string,uint8)", +"2bdfbd39": "finaliseCrowdsale()", +"2be09561": "startMint()", +"2be10384": "_removeKey(address)", +"2be29d71": "addressPartnerships()", +"2be2ad3c": "logUniverseForkedCalled()", +"2be2d95e": "amountOfInvestments()", +"2be2f085": "getCostForRace(uint8)", +"2be32dbb": "categoryCount()", +"2be3d1c9": "_getDroneDefaultAbility(uint256)", +"2be3d2df": "CreamCoin()", +"2be4a903": "removeUsers(address[])", +"2be4f3f5": "boardCost()", +"2be4fd9c": "getRemainManus()", +"2be51660": "calcTime()", +"2be521b2": "increaseBalance(address,address,uint256)", +"2be52293": "setExchangeOracle(address)", +"2be596ee": "unpauseInternal()", +"2be5e93a": "TOTAL_SUPPLY_UPPER_BOUND()", +"2be64f51": "RegisteredCampaign(address,uint256,address)", +"2be65e2a": "getFree()", +"2be65e45": "setMarketingRates(uint256,uint256,uint256)", +"2be6d43c": "ARKTagger_1_00()", +"2be6ec1f": "NULL_ENCRYPTION_ALGORITHM_ID()", +"2be79833": "nonFungibleRegistry()", +"2be86e01": "jcrUsdRate()", +"2be8c2a5": "transferTokensTo(address,uint256)", +"2be8f373": "changeWLMWallet(address)", +"2be90846": "enableBonus()", +"2be98d38": "HourglassV2()", +"2be9da97": "getBestAngel()", +"2beaead0": "lastDivideRewardTime()", +"2beaf416": "ShareXERC20()", +"2bec76fd": "maxBetCoinDice()", +"2becb6f7": "STARTING_SPERM()", +"2bed55b0": "buildDSEasyMultisig(uint256,uint256,uint256)", +"2bed69e0": "founderPercent()", +"2beea5c5": "testhash(uint256,uint256)", +"2beeaca4": "whitelist(address,string)", +"2bef4595": "authorize(address,address)", +"2bf04304": "whitelistAddresses(address[])", +"2bf0aeda": "DigiToken()", +"2bf1aa1d": "EthHodler(string,uint8,string)", +"2bf1f9da": "restart(bytes32,bytes)", +"2bf29ddb": "EventRedeemRisk(address,uint128,uint256,uint256)", +"2bf34551": "setRate340()", +"2bf34e60": "getUuid(uint256)", +"2bf37c42": "addFunds(uint256,address)", +"2bf435f9": "myMethod(string)", +"2bf4760b": "getEthPerfit(address)", +"2bf4d812": "AumentaToken(uint256,address)", +"2bf4e53d": "getCurrentShareholders()", +"2bf59135": "addLootbox(address,uint256)", +"2bf5a2ea": "mintForFounders()", +"2bf6e0a5": "setContract(address,address)", +"2bf7299b": "setMaxParticipants(uint256)", +"2bf79c94": "getTokenByOwner(address)", +"2bf7d279": "shouldRevertWithReturn(bool)", +"2bf7f6ba": "privateSell1LockEndTime()", +"2bf81dd3": "NPTToken()", +"2bf82843": "pay(address,uint128,string,uint32)", +"2bf885f0": "addNote(bytes32,bytes20,string)", +"2bf8faba": "AimiToken(address,uint256)", +"2bf9ab0b": "getPresellUpToTime()", +"2bfacd62": "calculateLockedBalance(address)", +"2bfaf3da": "Oracle(bytes32)", +"2bfc33ee": "KDI()", +"2bfc4c69": "getStringValue()", +"2bfd2a13": "calculate_dividend(uint256,uint256)", +"2bfd2e06": "buyBasicUnit(uint256,uint256)", +"2bfd91d4": "getMessageSigner(bytes32,uint8,bytes32,bytes32)", +"2bfda313": "getFile(uint256)", +"2bfe243f": "minStartPriceForCommishAuctions(uint128[])", +"2bfea0e4": "unpauseTransfer()", +"2bfefd5c": "calcMultiStage()", +"2bff4b66": "reapFarm(address,address)", +"2bff5630": "coachTakeOff(uint256)", +"2bff5fc4": "Incomplete()", +"2bffc7ed": "add(string,address)", +"2c011e7b": "winning_month()", +"2c01bb1c": "LogNewOwner(address)", +"2c01d52b": "_createRegion(string,address,uint256)", +"2c027eb9": "getDeployArrayLength(uint256)", +"2c02d622": "precalculate()", +"2c035157": "calculate_minimum_contribution()", +"2c044779": "getPublic()", +"2c04bf0c": "transferIXT(address,address,string)", +"2c052031": "getInsertPointForNumTokens(address,uint256,uint256)", +"2c0657c2": "additionalBonusAmounts(uint256)", +"2c06862b": "setCanBuy(bool)", +"2c07398d": "registerObserver(address)", +"2c0784ce": "send_DividendToAddress(address,uint256)", +"2c089048": "tokenCreationInit()", +"2c08ab0c": "ENJCrowdfund(uint256,address)", +"2c08eb0b": "changeTokensPerEther(uint256)", +"2c0994c1": "getMicroWalletAddress(uint256)", +"2c09bef7": "priceSetter()", +"2c0a036b": "resetICO()", +"2c0a33ef": "BethereumToken()", +"2c0a3f89": "castVote(uint256,uint256)", +"2c0a5c08": "BuyIn()", +"2c0a7e33": "pendingEthWithdrawal()", +"2c0aadc1": "nextGameInitialMinBetSize()", +"2c0b9685": "distributeeBTG(address[])", +"2c0bec2f": "sendCurrentPayment()", +"2c0c6488": "AirTrafficController(string,address[],address,address)", +"2c0c8563": "SetCoin(address,address)", +"2c0d0dbe": "AddProduct(uint256)", +"2c0d4e70": "RYNOTE()", +"2c0e0054": "lockInGuess(uint8)", +"2c0e3850": "storeInContract(address,address)", +"2c0f13a7": "icoStartTimestampStage3()", +"2c0f7b6f": "numCampaigns()", +"2c0fc8cb": "registerHandle(bytes32)", +"2c10e90c": "update(address[],uint256[])", +"2c1169ac": "ELOT()", +"2c12cc79": "HuumanStandardToken(uint256,string,uint8,string)", +"2c1352cf": "contacts(address)", +"2c135b93": "marketCap()", +"2c138236": "reservedTokensWallet()", +"2c142511": "_offlineHash(bytes32,bytes32,bytes32)", +"2c145eef": "DutchAuction(address,address,address,address,uint256,uint256,uint32)", +"2c154345": "getParticipantStake()", +"2c16c6ca": "addPrivilegeAddress(address)", +"2c16cd8a": "record(uint256)", +"2c174073": "PeriodSale(uint256,uint256)", +"2c181929": "getChainWork()", +"2c183fad": "mintTokenWithUnit(address,uint256)", +"2c197985": "VirtualExchange(address,address)", +"2c199889": "request(string)", +"2c19d480": "emitAccessGiven(address,bytes32)", +"2c19fbbb": "getUserTX(address,uint256)", +"2c1b17e4": "BonBonToken(address)", +"2c1b38ee": "isValidTokenId(uint256)", +"2c1bcb4f": "ContractLocked(uint256,string)", +"2c1cf6f6": "updateTradeStatus(bool)", +"2c1cf78b": "ETHinvested()", +"2c1d68d4": "countStakeHolders()", +"2c1e064b": "_translateWSIC(uint256)", +"2c1e6e48": "getADminFromDutchProxy(address)", +"2c1e816d": "setAdminAddress(address)", +"2c1ea461": "nextController()", +"2c1eed5f": "isPlayer(address,address)", +"2c1f1f8f": "getFreeBalances()", +"2c1fecfe": "isRefundable()", +"2c1ff9f8": "mInviteAddr()", +"2c203edd": "getOrderDetails(uint256,uint256)", +"2c2146aa": "verify(address,address)", +"2c215998": "updateStatus(string)", +"2c21ec94": "ethUpdates(uint256)", +"2c2206e4": "setAuditReportHash(uint256,string)", +"2c22af02": "cidTokenSupply()", +"2c22f2e2": "burnSplitPercent()", +"2c232609": "dislikeCelebrity(uint256[],uint256[],uint256)", +"2c237912": "processSellRequestFiat(uint256,uint256)", +"2c23f91a": "ignoreTokenFallback(address,bool)", +"2c244618": "calculateVestedOptions(uint256,uint256,uint256)", +"2c24909c": "getVotedTokensPerc()", +"2c24ecc7": "BecToken()", +"2c2622db": "LOCK_SLOTS()", +"2c2689b5": "getModuleAddress(string,string)", +"2c270617": "TempleDonationTrackingNote()", +"2c270c7e": "tokensFor1EthP2()", +"2c276699": "CheckOut(uint256)", +"2c27e581": "publicEndTime()", +"2c28aa1b": "RATE_FOR_WEEK3()", +"2c28f579": "goLive()", +"2c296656": "changeRequiredDevSignatures(uint256)", +"2c297478": "prolongH(uint256)", +"2c29eedd": "startPrivateSale(address,uint256,uint256)", +"2c2aa66c": "PokeCentral()", +"2c2aecf5": "isProcessNeeds()", +"2c2b4358": "setPercentOfPool(uint256[])", +"2c2bc50b": "LOWIQ()", +"2c2ccdfb": "kittyCoreAddress()", +"2c2da3cf": "expPercentage()", +"2c2de40a": "setMaximumSellableTokens(uint256)", +"2c2e3abe": "allocateFoundersTokens()", +"2c2fdc35": "getBalanceFromRound(address)", +"2c305abf": "updatePlayedNum(address,address,uint256)", +"2c308714": "returnBetAndOffer(uint64)", +"2c321ea1": "abToken()", +"2c327538": "ProofOfDiligenceToken()", +"2c329e99": "Last_block_number_and_bloctime_used()", +"2c344d14": "tokenRewardPreDGZ()", +"2c349627": "pauseToken()", +"2c34ce05": "increasedPrice()", +"2c34e6b9": "addDepositQuest(address)", +"2c354067": "executionBlockOf(uint256)", +"2c3597a1": "testToUint64()", +"2c3599a5": "VINToken()", +"2c3788b1": "registerUserIfNeeded(uint256)", +"2c37a512": "bountyLockEndTime()", +"2c39d855": "confirmAndForward(address,uint256,bytes,bytes32,uint256,uint8,bytes32,bytes32)", +"2c39da94": "batchSend(address,uint160,uint256[])", +"2c3a15a0": "EidosToken(address,address)", +"2c3a1d5d": "Nerotoken()", +"2c3af973": "GStarToken()", +"2c3ba9e1": "addManyRegistered(address[])", +"2c3c42b2": "WLM()", +"2c3ca924": "handleProductionIncrease(address,uint256)", +"2c3ccb98": "levelUpByPenguinId(uint256)", +"2c3d3453": "csale()", +"2c3d38f0": "mintTokens(int256,uint256,address,address)", +"2c3dcdcf": "issueDuringICO(address,uint256)", +"2c3dfca7": "getPhException(bytes32)", +"2c3ee88c": "getRedeemAmount(uint256)", +"2c3f1304": "getSlotLength()", +"2c3f6a4f": "getMineCooldown(uint256)", +"2c3f9b80": "getActiveFlagRate(uint16)", +"2c408059": "getFallbackAddress()", +"2c409871": "MobileTokenAlert()", +"2c416754": "doBurn(address,address,uint256,bytes,bytes)", +"2c420201": "getDataCounterForSubject(uint256)", +"2c421074": "exploreETHFee()", +"2c425687": "EthTeamContract(string,string,address,uint64,uint64,address)", +"2c42f2e8": "toSendFromStorage()", +"2c4449ab": "_rankByNumber(uint256)", +"2c445273": "_payEthereumAndDistribute(uint256)", +"2c4464d4": "Dryad()", +"2c4482c5": "_assignCountry(uint256)", +"2c44a261": "updatePrivateSaleCloseTime(uint256)", +"2c45f068": "transfer(uint128,bytes16,uint32)", +"2c4617d7": "getMethodState(string)", +"2c46b205": "query()", +"2c46d8d5": "EndRound(uint256)", +"2c47413f": "ERC20PGEToken()", +"2c4806d8": "ordersFor()", +"2c4879d1": "AFWBurn(uint256)", +"2c4881ff": "withdrawMoneyByAdmin(uint256)", +"2c48e7db": "confirmTransfer(uint256)", +"2c4a84f7": "StaxToken()", +"2c4ab666": "enact_withdrawal_greater_equal(address,uint256,uint256)", +"2c4ac770": "sendMessage(address,bytes,bytes32)", +"2c4aecc1": "sampleBoolRetFalse()", +"2c4b2334": "setTeamWalletAddress(address)", +"2c4b27ae": "burnAirDrop(address[],address)", +"2c4bca2c": "crowdsaleDeadline()", +"2c4bf8bc": "increasePresetTransfer(address,uint256)", +"2c4c2719": "MAXIMUM_CAP()", +"2c4cb4be": "removeRegistryFromNameIndex(address)", +"2c4d25f5": "DeathFactor_ii()", +"2c4d4d18": "changeMinter(address)", +"2c4e55c5": "killedContract()", +"2c4e591b": "totalGames()", +"2c4e722e": "rate()", +"2c4e8885": "unLinkFromMasterWalletInternal(address,address)", +"2c4e9d2b": "AuctionWon(uint64,uint64,address,uint256)", +"2c4ee4d4": "ObirumTalk()", +"2c4fa8b2": "assignAnotherOwner(address)", +"2c5104f5": "MTC()", +"2c511788": "addToWhitelistAllocation(bool,address,uint8)", +"2c512d6e": "getTokens(address,uint256)", +"2c526196": "_mint(uint256)", +"2c52d930": "feeForArtWorkChangeRequest()", +"2c532a71": "ChangeCrowdSaleDate(uint8,uint256)", +"2c5337dd": "winnerAnnounced(address,uint256)", +"2c53f31b": "bonusWindow2EndTime()", +"2c54357f": "lifeReserveAllocation()", +"2c54de4f": "transferToken(address,address,address,uint256)", +"2c54e6d9": "getCanvasCount()", +"2c560ec0": "queryInfo()", +"2c56462f": "addAllowedContract(address)", +"2c566ae5": "length(address)", +"2c572eb5": "_isFuture(uint256)", +"2c574a94": "next_tower_index()", +"2c577347": "changeMakeFee(uint256)", +"2c57fdf4": "create(uint8,uint8,uint64,uint64)", +"2c580a35": "revokeAndReclaim()", +"2c58139c": "teamRelease(address)", +"2c5a736f": "distributeInitialFunds()", +"2c5af544": "isAllocatedLending()", +"2c5b3b5b": "UniverseChain()", +"2c5c8f7c": "getDailyProfitSumForAllUsers()", +"2c5c9dc5": "BeldenCoin(address)", +"2c5cb666": "setCollectFeeWindowReportingFees(uint256)", +"2c5d0546": "KuaiToken(address,uint256)", +"2c5d690d": "getBlocksUntilReset(address)", +"2c5e52d1": "CandyDropIsOpen()", +"2c5f5234": "collateralisationRatio()", +"2c5fac89": "isIcoSucceeded()", +"2c6009a6": "viewPeerToPeerMarketplaceTransactionFee()", +"2c60a055": "MapTest()", +"2c6105f9": "setElectedMediator()", +"2c6127c7": "availableBets()", +"2c6287b2": "yunosupporttuples(bytes4,int32,bool)", +"2c629299": "allOperations()", +"2c62fa10": "assetsOf(address)", +"2c62ff2d": "deleteBool(bytes32)", +"2c638806": "totalPaymentsHeld()", +"2c63b326": "memoryArray(uint256)", +"2c63e4b9": "removeExpiredAssignments(address,uint256,uint256)", +"2c642950": "createBallot(string,bytes32[],uint256)", +"2c642f51": "sendDividends(address,uint256)", +"2c64b05f": "LockEDUTeam()", +"2c664701": "profit_per_token()", +"2c66a604": "Blizzard()", +"2c678c64": "migrated()", +"2c67a8e5": "getItemsByOwner(address)", +"2c684eb6": "afterVoteNoCashBackTime()", +"2c684f30": "postListed(address,string,string,uint256,string,string,string)", +"2c68fcd4": "determineBonus(uint256,uint256,address)", +"2c69e64e": "refundBet(address)", +"2c69ed89": "BerryLake()", +"2c6a0140": "cutoffBlock()", +"2c6b2c92": "checkProfitLossSinceInvestorChange()", +"2c6b77e1": "admin_isPayable(bool)", +"2c6c1108": "autoTearDownAndDestruct()", +"2c6e38d0": "modifyNextPremiumSale(uint8,uint256)", +"2c6e4aea": "withdrawFundBeneficiary()", +"2c6e7598": "toAsciiString(address)", +"2c6e879f": "settingsSwitchState()", +"2c6ed612": "stringToBytes5(string)", +"2c6f11b8": "listApproval()", +"2c6f39fd": "setLicenseSalesContractAddress(address)", +"2c6fa230": "getServiceInformation(address,uint32)", +"2c6fa84c": "Pausable()", +"2c7077c0": "enableFeatures(uint256,bool)", +"2c70b7ca": "emitEntityResolution(address,address)", +"2c70d64e": "unVote()", +"2c710cc8": "closeInvest(uint256)", +"2c71d524": "IcoBonus(uint256)", +"2c71e60a": "grants(address,uint256)", +"2c71ecb6": "_startBlock()", +"2c72fdfc": "getProposals(uint256)", +"2c735ef8": "tradeStartTime()", +"2c740844": "setStakingRegistry(address)", +"2c757eed": "startPhase3(uint256)", +"2c7622b0": "txorigin()", +"2c767201": "admin_account()", +"2c76d586": "zint_bytes32ToString(bytes32)", +"2c78ba6f": "ArbTokFromHGame(uint256)", +"2c78bfdc": "burnCrown(uint256)", +"2c791826": "moiTestToken()", +"2c792276": "endRound(uint8)", +"2c79aea3": "minedTotalSupply()", +"2c7a64c7": "isOperationActive(bytes32)", +"2c7a8559": "setMaxGift(uint256)", +"2c7b0085": "PocketChain()", +"2c7ba564": "setTransferProxy(uint32,address)", +"2c7c4549": "PurchasableToken(uint256)", +"2c7cc1f0": "emergencyEthDrain(uint256)", +"2c7cce9e": "auctionMinPriceIncrease()", +"2c7e06a4": "rateEarlyStage1()", +"2c7ec2c2": "_fulfillPayment(address,address,uint256,uint256,address)", +"2c7ee894": "B2Lab_TokenPlus(address)", +"2c7ee946": "setting(uint256,uint256)", +"2c8082a6": "PiBetaSupply()", +"2c828e46": "TransferToken(address,uint256,uint256)", +"2c837334": "getPlot(uint256,uint256)", +"2c83d77e": "goforit()", +"2c84bfa6": "generate(address,bytes)", +"2c84d560": "OwnerWithdraw()", +"2c84e31f": "addAccounts(address,address,address[])", +"2c85448d": "isInt256ValidIn64(int256)", +"2c854d13": "AUTH_REMOVEOWNER()", +"2c8595bc": "updatePartnerMap(address,uint256,uint256,uint256)", +"2c85f8e0": "oraclize_query(string,string,string,uint256)", +"2c86033e": "checkAddressTeamOne(address)", +"2c8668d4": "withdrawNoLimit(address,uint256,uint256)", +"2c868287": "withdrawToTeamStep3(uint256)", +"2c86d091": "buyTokens(address,bytes32)", +"2c86d98e": "leverage()", +"2c86e3b4": "setContributor(string)", +"2c873761": "getMyDragons()", +"2c87aecc": "orders_sell_list(uint256)", +"2c87ba12": "getTitulaire_Compte_2()", +"2c882333": "vota_un_candidato(uint256)", +"2c887399": "confirm(bytes32,bytes32,bytes32,uint8,bytes32,bytes32)", +"2c88837e": "VotingRightsWithdrawn(address,uint256)", +"2c88fad9": "addWhitelistedAddr(address)", +"2c890550": "toPower2(uint256)", +"2c899ab6": "CecCoin()", +"2c89a84c": "ChronosAccessControl()", +"2c8ab429": "registerMeDao(address)", +"2c8ace6c": "TokenERC20(uint32,string,uint8,string,address)", +"2c8af2d8": "s_rand(address,uint256)", +"2c8b2ad7": "calculatePaymentGoal(uint256,uint256,uint256)", +"2c8b8b94": "addAccreditedInvestor(address,uint64,uint64,bool,bool,uint256,uint256)", +"2c8bcd1a": "createBid(uint256,address,address,bytes32,uint256,uint256)", +"2c8be60e": "ONO()", +"2c8c047a": "ownerOperationsAt(address,uint256)", +"2c8c28a7": "loadNewTickets(bytes32[])", +"2c8c892b": "allocateSalesTokens(address,uint256)", +"2c8ca0ea": "isFinish()", +"2c8cbe40": "setFreeze()", +"2c8df693": "ServiceProviderEnabled(address,bytes)", +"2c8e3ebb": "secondRefundRoundRateDenominator()", +"2c8ed4c4": "_toToken(uint256,uint256,uint256)", +"2c8ee2ec": "checkWin(uint256,address)", +"2c8f1b71": "socialIdentityOfClaimerAddress(uint256,address)", +"2c906ba2": "finishLottery()", +"2c90ccba": "getNextAuditByPrice(uint256,uint256)", +"2c90d20d": "getWarriorsFromIndex(uint32,uint32)", +"2c91324c": "usersAddress(uint256)", +"2c915aa3": "assetAddresses()", +"2c92a2bc": "minWithdrawalThreshold()", +"2c92c071": "_addPayTable(uint16,uint16,uint16,uint16,uint16,uint16,uint16,uint16,uint16)", +"2c92e5b7": "BlockspacesToken()", +"2c92fb99": "getFilter(uint256)", +"2c948034": "longTermbudgetAllocAddress()", +"2c94a235": "profitTransferTimeSpan()", +"2c95ad52": "addItem(bytes32)", +"2c960569": "updatePriceOraclize()", +"2c9619ce": "FCOIN1036Token(uint256,string,string,uint256)", +"2c96bee2": "MultiSigTokenWallet(address[],uint256)", +"2c9868df": "approveAndCall(address,uint32,bytes)", +"2c98bf4a": "WelcomeMsg(string)", +"2c995e1b": "AllowTransferGlobal()", +"2c9a0a95": "getPricingStartsAt()", +"2c9a86d2": "payCarnita(uint256,uint256)", +"2c9afb18": "addrFabricContract()", +"2c9b1625": "FUTMOTO()", +"2c9c0fb5": "modifyTransferableHash(address,bool)", +"2c9cdfd9": "Provider(string,string)", +"2c9d6989": "withdrawDklBalance()", +"2c9d9e9e": "getCommitByContent(string)", +"2c9e1885": "setBZxVault(address)", +"2c9ea1b7": "nextSkinId()", +"2c9f092f": "refundToOwner(address)", +"2c9f4f62": "isPurchased(uint256)", +"2c9f6792": "emaPeriods()", +"2c9f9fed": "tokenInit()", +"2c9fcd8c": "Donator()", +"2ca0228a": "initialTokenPrice()", +"2ca0c835": "referrerBonusCalculate(uint256)", +"2ca0d7ca": "batchTransfer1(address[],uint256)", +"2ca126f8": "endtime()", +"2ca15122": "sign()", +"2ca16a37": "publish(bytes32,string,uint256)", +"2ca1aa16": "currentSaleLimitPerAddress()", +"2ca1b7da": "CROWDSALE_ETH_WALLET()", +"2ca23c4f": "KapelaToken()", +"2ca2537e": "changeNotSoldTokens(address)", +"2ca26866": "Tccchain(uint256,string,string)", +"2ca33e70": "YoutubersCoin()", +"2ca36da0": "left39(uint256)", +"2ca38363": "priceEth()", +"2ca59abf": "changeCollateralTaker(address)", +"2ca5a623": "change_flag(uint256)", +"2ca5e3f5": "replyAlice(uint256)", +"2ca5e626": "getOrder(uint32[8])", +"2ca60d85": "versionIdent()", +"2ca6d2c0": "getAccountSize(address)", +"2ca76003": "checkWinner(uint32)", +"2ca781f1": "firstPay()", +"2ca8c6d3": "numberOfBets()", +"2ca8cbd0": "minePhx()", +"2ca9cbe8": "distributeToken(address,uint256)", +"2caafb54": "totalFreezeTokens()", +"2cab00de": "buildPrice()", +"2cab6c6a": "editTile(uint16,uint16,uint8,uint16,address)", +"2cacb97c": "GetProfitEarnedByPartner(address)", +"2cacd13a": "takeOrder(uint256,uint256,uint256)", +"2cad9404": "salvageFinished()", +"2cae0c76": "crowdSaleIsOver()", +"2cae249a": "rvDepositAddress()", +"2cae66d8": "encodeRequest(uint128,address,address,address,uint256,uint64,address,bytes)", +"2cae8ae4": "getPayload()", +"2cae9add": "rawTokenSupply()", +"2cae9ca1": "spendWithGas(address,uint256,uint256)", +"2caeb8fc": "checkMyUndistributedBalance(uint256)", +"2caed832": "partOf(uint256,uint256)", +"2caef765": "setBoardController(address)", +"2caf1f15": "set_tickerQuery(string)", +"2cb0d48a": "setEditable(bool)", +"2cb0de18": "setFeeAccountToken(address)", +"2cb15864": "initialBlock()", +"2cb2f52e": "updateTokenMetadata(uint256,string)", +"2cb3ce8c": "TIER3_RATE()", +"2cb44156": "minterGivesCWC(address,uint256)", +"2cb4f63e": "price_target()", +"2cb51970": "_batch4_icosaleStartTimestamp()", +"2cb58378": "getStateRoot(bytes32)", +"2cb676be": "NVBSupply()", +"2cb6a435": "oneTimePrice()", +"2cb71af3": "startBuyback(uint256,uint256)", +"2cb8460c": "PlutusDex()", +"2cb856f3": "dgxContract()", +"2cb86824": "preIcoStartAt()", +"2cb8f2e9": "executeBet(uint256,bool)", +"2cba85c6": "popcontract()", +"2cbb827f": "withdrawToSelf(uint8)", +"2cbbbd2d": "SHIPToken(address,address)", +"2cbbd738": "getPoll(bytes32)", +"2cbcaba9": "SimpleICO()", +"2cbdb5fb": "addChunk3ToWhiteList()", +"2cbe679b": "Travelerscash()", +"2cbef0f3": "getAffiliateCommission()", +"2cbf1b12": "CirclePay()", +"2cbf1f0d": "left62(uint256)", +"2cbf4e27": "removeParticipant(address,address)", +"2cbf9cf6": "MintableToken()", +"2cbfd034": "intCallWithArray(uint8[4])", +"2cc0a28c": "_matchedTags(bytes32[],bytes32[])", +"2cc0b254": "init(address,bytes32)", +"2cc138be": "rewardStartTime()", +"2cc1b92a": "addr_communityBuildingToken()", +"2cc205d9": "totalStakedFor(address,address)", +"2cc27341": "setMinMargin(uint256)", +"2cc361a6": "removeTank(address)", +"2cc53743": "GxEvents(address)", +"2cc5cfd6": "withdrawDevelopersFund(address)", +"2cc5d662": "arawWallet()", +"2cc63332": "returnCoupon(address[2],uint256[8],uint8,bytes32[2])", +"2cc689f9": "markRewardsSet()", +"2cc695de": "addCertification(address)", +"2cc6cf4a": "BABI()", +"2cc6d768": "RecordingRefundVault(address)", +"2cc75331": "getTeamsOnLeaderboard()", +"2cc763e7": "milliPercent()", +"2cc7c475": "TokenSaleCreation(uint256,address)", +"2cc7fc36": "ICOPurchased(uint256)", +"2cc82225": "setPriceCreatingChannel(uint256)", +"2cc82655": "setPhase(uint256)", +"2cc88401": "wirePurchase(address,uint256)", +"2cc8b455": "recoverAddressFromWithdrawMessage(bytes32,address,uint256,bytes)", +"2cc92b2b": "isICOOpened()", +"2cc9636c": "buyerCancel(bytes16,address,address,uint256,uint16)", +"2cc9c151": "verifyOwnership(address)", +"2cca179d": "addPoll(uint256,uint256,bytes,uint8)", +"2cca23f1": "Timeless()", +"2cca5ce3": "setEngine(address,bool)", +"2cca664b": "totalPlayerWinnings()", +"2cca75d3": "StupidCoin()", +"2ccaa3e9": "getPropertyOwner(uint16)", +"2ccb1b30": "transferTo(address,uint256)", +"2ccbd053": "set(uint256,string,string,string,string,string)", +"2ccc452d": "pushByte(bytes32)", +"2ccc9057": "RATE_CROWDSALE_S3()", +"2ccce58a": "cancelGame(string)", +"2ccd0991": "extraData1FromHash(string,string,string,string,string)", +"2ccd9623": "referralManager()", +"2ccdbc25": "prometheusVouchersMinted()", +"2ccde4bd": "withdrawAllUncommittedTokens()", +"2cce0c60": "eth_to_usd()", +"2cce4abe": "_finishNoCallback()", +"2cce753a": "batchAddAddresses(address[])", +"2cce81aa": "getBlockHash(int256)", +"2ccf16f9": "CashPoints()", +"2ccf27bb": "PatrickHuynhToken()", +"2ccf8d40": "HVAL()", +"2ccfc58c": "FeesReceived(address,uint256)", +"2cd046eb": "countMembers()", +"2cd05122": "ZENOSEarlyPurchase()", +"2cd05248": "lastBlock_f3Hash_uint256()", +"2cd11849": "depositAdvisor(address,uint256)", +"2cd19faf": "_getAdminInterface(uint256)", +"2cd1bab2": "partnerID()", +"2cd2338f": "thawAddress(address)", +"2cd23d7a": "createCommit(bytes32,bool,bytes32,string,uint256)", +"2cd33a54": "eth_amount()", +"2cd3fd70": "BurnTokens(uint256)", +"2cd44064": "UNHCToken(uint256,string,string)", +"2cd53cfe": "addEducation(string)", +"2cd6305f": "unsellpause()", +"2cd64f65": "TokenMintGeneral()", +"2cd78450": "activateExportFeeChargeRecord(address)", +"2cd8c9ae": "fillPhase(uint8,uint256,uint256)", +"2cd9e233": "Quarters(address,uint256)", +"2cda1bf7": "titles(uint256)", +"2cdad41c": "isInspector(address)", +"2cdb0213": "dailyHourLimit()", +"2cdb8eec": "updateTokenValue(address,uint256)", +"2cdba70e": "_getMaxPooling()", +"2cdc1c74": "lister()", +"2cdcb1fc": "wrongManagerOrUnsetInClaimer()", +"2cddc488": "transferTaxes(address,bool)", +"2cde15d1": "weiTotalRaised()", +"2cdedd5c": "StateChannel(address,address,address,address,uint256,bytes)", +"2cdf2bfd": "sellPatent(uint16,uint256)", +"2cdf37d4": "_admin(uint256,uint256)", +"2cdf55af": "RC()", +"2ce04b20": "tokenLockoutPeriod()", +"2ce0a6ee": "setBalanceLimit(uint256)", +"2ce0b4f6": "ICO_FINISH()", +"2ce0ca6b": "setChainFees(uint256[10])", +"2ce14d90": "_willFallback()", +"2ce1ec67": "HelloCoin(uint256,string,uint8,string)", +"2ce20579": "mutagen2Face(uint256,uint256)", +"2ce21999": "fees_(uint256)", +"2ce2907b": "CryptoCourt(uint256,string,string)", +"2ce2d7c0": "completeRegionAuction(uint16)", +"2ce37b10": "getListCount()", +"2ce3d440": "updateAccount(address)", +"2ce47de4": "payWinners(uint32,uint32,uint256,bool,uint32,uint32)", +"2ce52d9b": "shareCycleSessionSize()", +"2ce5c284": "processed()", +"2ce5fb75": "getHorseShoe(uint256)", +"2ce68269": "registerByList(address[],bool)", +"2ce78fc0": "getDemande(uint256)", +"2ce7900b": "getTokenTimelockCount(address)", +"2ce82189": "balanceTransferred(address,uint256,bytes)", +"2ce90c11": "killTokens()", +"2ce91d08": "TokensWorld()", +"2ce92dfd": "updateMinGasForDrawing(uint32)", +"2ce946a5": "teame()", +"2cea0654": "setStateClosedIfClosed()", +"2cea53bd": "returnChametz()", +"2cea70e4": "isAds()", +"2cea905a": "IAMEPrivateSale()", +"2cea9442": "totalUsdRaised()", +"2cead42c": "_createIntention(address)", +"2cead658": "Companion()", +"2ceae552": "AVAILABLE_BONUS1_SUPPLY()", +"2ceb1bb3": "addPreEntranceMembers(address[],uint256,uint256)", +"2ced7cef": "log(string,string,string)", +"2cedc5ec": "enableTokenAiTransfers()", +"2ceee12e": "seeBidders()", +"2cef4dac": "updateMasterCopy()", +"2cefc429": "sellCard(uint8,uint256)", +"2cefeb07": "setname(string)", +"2cf003c2": "referrer(address)", +"2cf033a0": "setNewTokenAddress(address)", +"2cf0be44": "transferToService(address,uint32,uint256,uint256,uint256)", +"2cf0d6ca": "PLAT()", +"2cf1a5fb": "airdropStatus()", +"2cf2f1d1": "rndReduceThreshold_()", +"2cf32bc9": "PayoutEarnings(address,uint256,uint8)", +"2cf3f1f3": "setTokenPerEther(uint256)", +"2cf42a6c": "cancelHybridization(uint256)", +"2cf45905": "addHpbNodeBatch(address[],bytes32[],bytes32[],bytes32[])", +"2cf4db51": "amountVote(bool,uint8)", +"2cf4e56f": "withdrawBounty()", +"2cf5346a": "totalSupplyAt(uint256,int256)", +"2cf5702a": "verifyPublic(bytes32,uint256,uint256[],uint256[],bytes32[])", +"2cf5fe89": "maxChildCount()", +"2cf65a06": "logite(string)", +"2cf6b532": "STARL()", +"2cf6e740": "adminSum()", +"2cf75c11": "_generateLog(uint32,uint8,uint32,uint8,uint8,uint8)", +"2cf86006": "calculateDividends(uint256)", +"2cf8a1d6": "CCRToken()", +"2cf91024": "getFlightInfo(uint16,uint16)", +"2cf9185c": "getMyPlayedCount(address)", +"2cf975af": "isPreferredTokensAccount(address)", +"2cf99422": "publish(address)", +"2cfa606d": "tvcEthFund()", +"2cfa74da": "buyKeys(uint256,string)", +"2cfac6ec": "teamSupply()", +"2cfbb031": "claimReward(bytes)", +"2cfbd0b9": "addNewBlock(bytes32,bytes32,bytes32[])", +"2cfc1f4c": "updateGift(uint256,uint256,string,string)", +"2cfc42f5": "blacklistParty(address,address,bool)", +"2cfd10a0": "CrowdsaleMain()", +"2cfd3005": "mint(address,bytes32)", +"2cfd35bb": "employeeMigratesToNewESOP(address)", +"2cfdd7df": "newReward()", +"2cfed9f0": "setSpeaker(address,address)", +"2d0041c5": "setAmbassador(address,bool)", +"2d00b442": "_createBid(bytes32,address,uint256)", +"2d0104a5": "updateFirstDuel1(uint256)", +"2d014833": "e93Contract()", +"2d01564c": "littContentExists(bytes32)", +"2d019a71": "get_asset_info(bytes32)", +"2d021624": "BTBToken()", +"2d02a5b2": "setGoldPrice(uint256)", +"2d0335ab": "getNonce(address)", +"2d03c4eb": "nxcPerBcy()", +"2d040add": "updateRegistrationState(bool,uint256)", +"2d042a7f": "PonziRevolutionBeam()", +"2d045780": "isAllowedToBuyByAddressWithoutVerification(address)", +"2d04d07d": "goTokenCollection()", +"2d04f820": "DEV_WALLET()", +"2d06177a": "addManager(address)", +"2d062140": "SiringClockAuction()", +"2d067d4c": "isBurn()", +"2d06a1fa": "ALFA()", +"2d06fd13": "getTotalDeveloperCut()", +"2d077ad0": "Latch()", +"2d07bf2f": "CryptoHarborExchange()", +"2d087944": "hasBuyNowOffer(uint256)", +"2d08d408": "Send(address[],uint256[])", +"2d09839f": "tokens_push(address)", +"2d0a8809": "testAddVoters()", +"2d0b1451": "DevotteToken()", +"2d0b7d53": "registerVariation(uint256,address)", +"2d0cc13c": "MoonMinerToken(string,string,uint8,uint256)", +"2d0d4827": "startIco1(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"2d0d9c2a": "getCompletedGamesStatistics()", +"2d0d9e0f": "getUserProductsKeys(bytes32)", +"2d0daca8": "assertEq25(bytes25,bytes25,bytes32)", +"2d0e6636": "tokenToEtherAllowed()", +"2d0f5573": "right35(uint256)", +"2d0ff779": "claimEOSclassic()", +"2d103ed4": "addAllowedHICAddress(address)", +"2d10d4d1": "getCityActiveBuildings(uint256,uint256)", +"2d116186": "deityBalance()", +"2d118bbf": "getUserPaybackPool()", +"2d11fa16": "throwsWhenTransferingPresaleTokensBeforeCliff(address)", +"2d123aa4": "useDefaultRegistry()", +"2d126239": "calcAndGet()", +"2d126d2b": "indCommunityDeposit()", +"2d129442": "mountainHeight(uint256)", +"2d132467": "buyPreIcoTokens()", +"2d133eee": "KYC_THRESHOLD()", +"2d136dd6": "TrillionToken()", +"2d139417": "migrateToNewNewControllerContract()", +"2d13c164": "_computePayMoney(uint256,address)", +"2d144e6b": "totalPlayerSupply()", +"2d1608db": "YouLongToken()", +"2d162c70": "distrust(address,uint256,bytes)", +"2d171243": "getUnitsProduction(address,uint256,uint256)", +"2d17d956": "buildRequest(string)", +"2d19413c": "setJackpotToken(address,uint256,uint256,address,uint256,uint256,uint256)", +"2d1a330b": "marketmorties()", +"2d1a6477": "lengthEqual(address[],uint256,string)", +"2d1a67e1": "Ledger(address,uint256,uint256)", +"2d1b42f5": "encryptCounter(uint256)", +"2d1babed": "setRates(uint256)", +"2d1c56a9": "totalTxVolume()", +"2d1ced82": "priceBox1()", +"2d1d744a": "isPass()", +"2d1d9627": "changeAddress(bytes32,address)", +"2d1d9feb": "removeRRA(address)", +"2d1e0516": "setBal(bytes32,address,uint256)", +"2d1f0021": "NextItemID()", +"2d1f0097": "getData_18()", +"2d1fb389": "authorize(address,bool)", +"2d1fdef6": "extendDeadline(uint256,uint256)", +"2d202d24": "setNextOwner(address)", +"2d20fbf3": "ownedBonus(address)", +"2d215518": "pause(uint256,uint256)", +"2d217d43": "AntasCoin()", +"2d21ca88": "ICOTokenHardCap()", +"2d226a10": "allocateServusTokens()", +"2d22a4e3": "isPrivateInvestmentPhase()", +"2d22b464": "createEgg(string,bytes32)", +"2d241248": "getFeeBurnerAddress()", +"2d24447a": "LBCoinJ()", +"2d247cc6": "coinPriceInWei()", +"2d278518": "EtherReceived(uint256,address,uint256)", +"2d278e9e": "picosPerEther()", +"2d27c8cd": "ALLOC_SALE_GENERAL()", +"2d2800f1": "react()", +"2d287e43": "insert(bytes32)", +"2d2899b6": "getIntArray(bytes32)", +"2d28bb02": "setTokenStart(uint256)", +"2d28d4cf": "transferIfTokenAvailable(uint256,uint256,address)", +"2d28e89d": "MINIMUM_DURATION()", +"2d290d8b": "MAX_CROWD_SALE_TOKENS()", +"2d2925c7": "transferInitialTokens()", +"2d296bf1": "buyToken(uint256)", +"2d29842c": "upgradePhoenixStats(uint256)", +"2d29953f": "withdrawByFoundation(address,uint256)", +"2d29a47b": "execute(uint256,uint256,uint256)", +"2d29b29b": "migrateSome(address[])", +"2d29c72d": "stopUpgrading()", +"2d2bb154": "kycWallet()", +"2d2bcd37": "setRelayContractAddress(address)", +"2d2c44f2": "Vault()", +"2d2c5565": "TREASURY()", +"2d2c9ed8": "softcapReachedCallabck()", +"2d2d23f7": "Cordbank()", +"2d2e3bb2": "deleteFincontract(bytes32)", +"2d2f7e4d": "withdrawBidForStar(uint256)", +"2d2f8f9b": "getAddListSize()", +"2d2fa531": "hank()", +"2d2fe9d4": "stakeWaived_Eth()", +"2d30ae45": "distributeCrowdsaleTokens(address,uint256)", +"2d31908f": "PRICE_7()", +"2d31d9c9": "sales(bytes16)", +"2d31f270": "UNTToken()", +"2d328551": "numberOfHalvings()", +"2d345670": "revokeAdmin(address)", +"2d345799": "balanceOfPretty(address)", +"2d349a1f": "icoLtc()", +"2d34ba79": "setup(address,address)", +"2d354cf8": "_isContract(address,address)", +"2d358710": "HARJToken(address,string,uint8,string)", +"2d35a8a2": "candidatesCount()", +"2d364687": "toLucky()", +"2d36ad42": "cleanUp(address)", +"2d370378": "switchSaleAuctionERC20For(address,address,uint256)", +"2d3727bf": "CloseDiv()", +"2d37329a": "lastBlock_v4Hash_uint256()", +"2d37e6dc": "getCrowdsaleInfo()", +"2d381f84": "ATTR_GOLDENGOOSE()", +"2d38bf7a": "rewardEra()", +"2d3a926a": "computeCut(uint256)", +"2d3b3141": "ERC20Standard(uint256,string,string,bool)", +"2d3b4643": "coresale()", +"2d3b634c": "Crowdsale(uint256,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"2d3b9e59": "isFinished(uint8)", +"2d3c5d28": "DonatedEthPayout(address,uint256)", +"2d3cb6bd": "mulX(uint256,uint256)", +"2d3d165d": "parameterizerFactory()", +"2d3d403a": "challengeContract(address,address,address)", +"2d3e2065": "minBetWei()", +"2d3e474a": "marketing()", +"2d3e579a": "hasRole(address,bytes32,address)", +"2d3e9efe": "mint(int256,bytes32,bytes,uint256[],bytes,bytes)", +"2d3ec656": "setMinimumIcoRate(uint256)", +"2d3ed075": "Certificate(bytes32,string)", +"2d3fb0d5": "getCrowdsaleState()", +"2d3fb721": "secondRoundICODiscount()", +"2d3fcc23": "beingVIP()", +"2d405b43": "Win(address,uint8,uint256,bytes32,bytes32,uint256)", +"2d40957f": "TheWinner()", +"2d4147e3": "bountyToken()", +"2d416b4d": "bindCertificate2Wallet(address,bytes32)", +"2d41777f": "SnapshotUpdated(address,uint256,uint256,string)", +"2d4194c7": "getAuditRequestBlockNumber(uint256)", +"2d41bc9b": "store(uint8[],uint256,uint256,uint256,uint256)", +"2d41c7a4": "Nikone()", +"2d434139": "addCustomerNReqAcc(address,address,address)", +"2d43573d": "landmarks(uint256)", +"2d4364ae": "placeTokens(address,uint256)", +"2d448c49": "setO2(address)", +"2d449b5e": "Etokenchain()", +"2d44c049": "modifyCreator(address,bool)", +"2d459dd6": "transfer(address,uint48,bytes)", +"2d45c78d": "requireAuthorisation()", +"2d46253f": "CommunityWithDraw()", +"2d462dbb": "rollLo()", +"2d467358": "LAPTOPTOKEN()", +"2d46a9ce": "getVestingCreatedAt(address,uint256)", +"2d46b54e": "hashMsg(bytes32,address,bytes32,address,uint256,bytes32,string,string)", +"2d46f5df": "registerProduct(address)", +"2d475386": "ownerWithdrawUnclaimedCredits()", +"2d47adcb": "BancorNetworkToken()", +"2d47c29e": "otherchainstotalsupply()", +"2d480a80": "thankYou()", +"2d483bec": "setNewRate(uint256)", +"2d48bcec": "pool_drain(address)", +"2d493910": "_computeNextPrice()", +"2d49f5fc": "verifyERC20(address)", +"2d49ffcd": "getLocked()", +"2d4a170a": "calculateBid(uint256)", +"2d4c4aea": "GOTGCOIN()", +"2d4d671f": "startRevealingPhase()", +"2d4e4472": "LandClaimExecuted(address,uint256,bytes)", +"2d4ede93": "deleteNode(address)", +"2d4f40c6": "setBotAddress(address)", +"2d4fd9dd": "rejectDispute(uint256)", +"2d501611": "PERCENT_BONUS()", +"2d50e2d5": "getSupercedesRegistryInterfaceID()", +"2d5132cd": "getOuvidoriaEnteNome(address)", +"2d5134f7": "setApplication(address,address)", +"2d52164b": "stopsell()", +"2d5216a5": "PHASE_CHALLENGE()", +"2d52d1a2": "rewardDistributionEnded()", +"2d54ab45": "initTokenSale(address,address,address,uint256,uint256,uint256)", +"2d54f04d": "changeVotingBlocks(uint256,uint256,uint256,uint256)", +"2d5505b6": "_setAreas(address,uint256)", +"2d550c0b": "optionality()", +"2d55dd31": "_agreeAmendment(address)", +"2d56acce": "setMinAcceptedInPublicSale(uint256,uint256)", +"2d56af6c": "burnCoin()", +"2d56d572": "releaseMany(address[],uint256[])", +"2d571013": "getFeedBackFeeAward(string)", +"2d571cc4": "createToken(uint256)", +"2d578304": "update(address,uint16,bool)", +"2d57b6c8": "getInvestorDeposit(address)", +"2d57ea40": "FundariaTokenBuy(address)", +"2d580ef6": "add(address,bytes32)", +"2d581e71": "add_user(address)", +"2d5858a3": "publicSoftCapReached()", +"2d58c9a2": "gy()", +"2d58fab1": "pauseCWC()", +"2d592a34": "sellKissBTC(uint256)", +"2d5949a0": "setNumMarkets(uint256)", +"2d596330": "bmcPlatform()", +"2d59680d": "pool_name()", +"2d598d7b": "isAccredited(address)", +"2d599750": "updateUrl(bytes32,string)", +"2d59dc12": "displayMessage()", +"2d59ea6c": "oscarGuindzbergAddress()", +"2d5a5d34": "blacklistAccount(address,bool)", +"2d5a858c": "checkCompanyNameAvailability(bytes32)", +"2d5b2e15": "CLIForGas()", +"2d5b778b": "refundingDeadline()", +"2d5b8d99": "paymentsOf()", +"2d5bbf60": "subscriptions(uint256)", +"2d5c3ed1": "KWHToken(address,uint256)", +"2d5cb5d5": "CryptoKitties()", +"2d5cd1d6": "getPrize(address)", +"2d5ea8e3": "numplayers()", +"2d5f1f61": "getSlashAmount(uint256)", +"2d5fd89f": "getClaimData1(uint256)", +"2d60a72c": "DEPOSITS_KEPT()", +"2d614ad2": "Webpuddg()", +"2d620e1e": "deedsOfOwner(address)", +"2d62ce38": "collectAirdrop(bytes32)", +"2d62f428": "coinIssuedSale()", +"2d63e9f4": "Registration(uint256,uint256,uint256,uint256,uint8,uint8,uint8,uint8,string)", +"2d63f728": "mintWithMetadata(address,uint256,string)", +"2d646742": "executeGameProposal(uint256,bytes)", +"2d658888": "RobotarTestToken(address)", +"2d6653a9": "seed_coins_vault1()", +"2d668da4": "returnAmountOfTmexAddressCanProduce(address)", +"2d66acf1": "fortune_open(uint256)", +"2d67a79e": "verifyAccount(address,string,string)", +"2d67bb91": "World()", +"2d6842b5": "admin_MinimalPayValue(uint256,uint256)", +"2d685f15": "takeSell(address,uint256,uint256,address)", +"2d68bad7": "withdrawForTo(address,address,uint256)", +"2d68bc6e": "saleProceedsEther(uint256)", +"2d68de95": "currentStageTokensCap()", +"2d690f28": "LogSetTokenPrice(uint256)", +"2d6a3482": "TradeListing(bytes32,address,address)", +"2d6acb3a": "RESERVE_POOL_ADDR()", +"2d6afbd0": "unlockWithSpend(uint256,address)", +"2d6b113a": "in_sharing_phase()", +"2d6c17a3": "rewind(uint256)", +"2d6c25fa": "recommendedPrice(uint16)", +"2d6c5a84": "reverter(uint256)", +"2d6d1646": "untokenize()", +"2d6d372d": "getAccountWei(uint256)", +"2d6d4caa": "addtoContributos(address,address,uint256,uint256)", +"2d6ddfda": "closeModifyCountdown()", +"2d6df368": "borrarRegistro(bytes32,bytes32)", +"2d6e2bb0": "regularHold()", +"2d6ef310": "closeGame(uint256)", +"2d6f70f7": "transferViaTokenTransferProxy(address,address,address,uint256)", +"2d6f8049": "setBountyTokensReserve(uint256)", +"2d6fc906": "setBonuses(uint256,uint256,uint256)", +"2d703f88": "getMeeting(uint256)", +"2d706a34": "isName(address)", +"2d710551": "UlleToken()", +"2d7243ef": "payTodayReward(address)", +"2d740722": "close_pre_ico()", +"2d75c39a": "_removeClearingPriceValidator(address)", +"2d762b0d": "changeTokenContractAddress(address)", +"2d76a85a": "PundiXCash()", +"2d76be2d": "player_getPendingTxByAddress(address,address)", +"2d76d7b0": "releaseTokensByAddress(address)", +"2d774da2": "isSetFund()", +"2d776793": "downvoteComment(bytes32,bytes32,bytes32)", +"2d7788db": "rejectRequest(uint256)", +"2d78737b": "CreateUpgradeCards(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"2d78b7fc": "_withdrawInvestorTokens(address)", +"2d7aa82b": "initialize(uint256,uint256,uint256,uint256,uint256,uint256)", +"2d7ae086": "MarkHours(bytes32,bytes32,int256,bool)", +"2d7af0f4": "transferLoan(bytes32,address)", +"2d7b299d": "setNote(string)", +"2d7b8c98": "returnInvestmentsTo(address)", +"2d7bf927": "Migrations2()", +"2d7c597f": "whois(bytes32)", +"2d7c93e9": "register_claim(string)", +"2d7cd4cd": "rand1()", +"2d7cdeb1": "withdraw(string,uint256,address,bytes)", +"2d7da889": "ruleA(uint256)", +"2d7dc81c": "sendAfterIco(uint256)", +"2d7deae2": "testDeployMultiSigWallet()", +"2d7e92a5": "CWCCTokenIssue(address)", +"2d7eba3f": "ganaBalance()", +"2d7ed15c": "BNB_TOKEN_PRICE_DENOM()", +"2d804ca2": "amountFilled(address,uint256,address,uint256,uint256,uint256,address)", +"2d806bfd": "createProduct(bytes32,bytes32,address[],int256,int256,address)", +"2d806cdd": "setRefund(address)", +"2d80bc86": "getNumberOfParticipantsOrigins()", +"2d80f13c": "EthlanceSponsor(address)", +"2d817a91": "withdraw(uint32[])", +"2d81844e": "_createPrecious(address,uint256,string)", +"2d81e877": "Gocc9()", +"2d826eda": "updatetoken(uint256,string,string,string,string,string,uint256,bool)", +"2d829146": "buyshares(address)", +"2d83549c": "escrows(bytes32)", +"2d839989": "clearingPriceCode()", +"2d83f5a3": "divAmt()", +"2d84c3e8": "_getSigner(bytes32,bytes)", +"2d852552": "CreditDAO()", +"2d85db6b": "ChangeEndByManager(uint256)", +"2d873f21": "CrowdDevAllocation(address)", +"2d87cdd6": "DmlContribution(address,uint256)", +"2d883a73": "getByIndex(uint256)", +"2d884a51": "icoOpeningTime()", +"2d888869": "toAddress(bytes)", +"2d88af4a": "setPauser(address)", +"2d88df6f": "lvePay(string,string,uint256)", +"2d89560a": "TOKEN_INFORMATION_ADDRESS()", +"2d897146": "changeBonusIncreasePercentage(uint256)", +"2d8a08b6": "DepositEvent(address,uint256)", +"2d8a4dca": "committeeKickVotes(address)", +"2d8aa855": "playerInput(address)", +"2d8c1c35": "level_up()", +"2d8c4416": "airDropMonster(uint32)", +"2d8d488c": "getProductContractCommissionWei(address)", +"2d8d96fa": "stockSellCertainOrder(uint256,uint256,uint256,uint256)", +"2d8df871": "alimtoken()", +"2d8e3250": "Version(string)", +"2d8e3278": "grantPermission(address)", +"2d8ebff1": "joinAndDeposit(uint256,uint256)", +"2d8ed84a": "getExpiryDate()", +"2d8f0981": "setPI_edit_14(string)", +"2d9029ca": "earlyResolve(bytes32,uint256,bytes32,bytes)", +"2d9068ed": "matchpoolAddress()", +"2d906a19": "Solario()", +"2d90ae94": "transferToOwner()", +"2d910376": "valueFromPercent(uint256,uint256)", +"2d91657b": "giveConsent(string,string)", +"2d91ad22": "Group_5()", +"2d91bf11": "foxcoin(uint256,string,string)", +"2d923561": "sellItem(uint256,uint256)", +"2d9240f3": "pauseCrowdSale(bool)", +"2d92b1c0": "setupPhases(uint256,uint256[],uint256[],uint256[],bool[])", +"2d92b371": "addVal(address,bytes32,address)", +"2d9346ab": "setAgentVerificationByAdmin(address,address,bytes32)", +"2d935d11": "calculateTokenOnlyBuyPrice(uint256)", +"2d936763": "hasTeamKeepingWithdraw()", +"2d937fe8": "isBeginnerQuestContract()", +"2d93a44e": "getEndClaimDate()", +"2d93d3ac": "getFirstStageWallet()", +"2d94d41e": "DEVCLASS_FTL_SPEED()", +"2d9525d6": "YankeesOrioles48()", +"2d957790": "testRemoteWithdraw(uint256,uint256,uint256,uint256,address,address,uint8,bytes32,bytes32,address)", +"2d958dfc": "Payout(address,address,uint256,uint256,bool)", +"2d95fdb5": "_isApprovedForAll(address,address)", +"2d962d0f": "burnLeftTokens()", +"2d969204": "KingJamesToken()", +"2d96a297": "addStore(uint256,uint256)", +"2d976404": "upgrade_token(address,address,string)", +"2d978678": "left23(uint256)", +"2d97fc5d": "rand(uint256,address)", +"2d980646": "allowanceEliminate(address,address)", +"2d985cfb": "testControlRestartNotUpdatable()", +"2d98d251": "ArtaoToken(uint256,string,string)", +"2d992bde": "applyAffiliate(address,uint256,uint256)", +"2d9a37d3": "getMaxPayout()", +"2d9abaed": "Purchase(uint256,address,address)", +"2d9b1530": "Electrocoin(uint256,uint256)", +"2d9b4ab7": "blnpereth()", +"2d9c3052": "createPaper(string,uint256,uint256)", +"2d9c6001": "prometheusVoucherSoldCount()", +"2d9d5ab7": "withdrawByAdmin(address,uint256,address,uint256,uint8,bytes32,bytes32)", +"2d9de472": "setVerified(uint256)", +"2d9e84b4": "userCampaignID(address,uint256)", +"2d9e87c5": "setRefundable(bool)", +"2d9e8ed6": "addEntryInYears(address,uint256,uint256)", +"2d9ec349": "TOKETH_PRESALE_THREE()", +"2d9eceb5": "BETHERcoin()", +"2d9f669d": "sendProportion(address,uint256)", +"2d9fab98": "suscribeTrial(uint256)", +"2d9ff1d0": "m_Owner2()", +"2da03409": "flushForwarderTokens(address,address)", +"2da09fac": "sellBkgAtExchg(uint256,uint256)", +"2da0c25c": "priceChanger()", +"2da0d1ea": "etherSold()", +"2da11b2e": "biddingClosed()", +"2da13d5e": "CONTRIBUTIONS_MIN()", +"2da1670f": "deAuthoriseSale(uint256,uint256)", +"2da2440c": "registerAuditor(address,address)", +"2da39239": "updateUserShares()", +"2da40888": "TaskUpdated(uint256,uint8)", +"2da40ac7": "emitTokens(address,uint256,uint256)", +"2da4dddd": "createSystemSaleAuction(uint32,bytes,uint16)", +"2da5a444": "deleteSire(uint32)", +"2da5b88e": "remoteSetWinner(uint256,uint256,uint256)", +"2da5deb4": "addBuyTokensRequest(string,string)", +"2da64861": "bulkReserveTokensForAddresses(address[],uint256[],bool[])", +"2da6a0d8": "getBomb(uint8)", +"2da6b8f8": "_getMinersAt(uint32,uint32)", +"2da7293e": "isSuperseded(address)", +"2da758b0": "ResearchAndDevelopment()", +"2da80893": "phase_3_rate()", +"2da8b2be": "TokenSubtracted(address,uint256,uint256)", +"2da8d3e6": "woe()", +"2da8f764": "submitVideo(string,string)", +"2da92e05": "setEmissionCap(uint256)", +"2da9a6cc": "collectMilestoneInvestment(bytes32)", +"2da9b51e": "setBuilding(uint8[176],uint8,uint8,uint8)", +"2da9d048": "startQueue(address)", +"2dab0374": "sendFutureFundingBalance(address[],uint256[])", +"2dab3e7a": "setTransferPlan(address,uint256,bool)", +"2dab7ee2": "convertToBytes(uint8[])", +"2dabbeed": "reclaim(uint256)", +"2dac17cd": "getBattleKuns(uint256)", +"2dacdaf7": "_createGirl(string,address,uint256)", +"2dad2f97": "getLeastExpensiveShare(uint256,uint256)", +"2dad5872": "newAttack()", +"2dad6b6a": "_distributeToken(address)", +"2daddb32": "VVToken()", +"2dadf781": "KudosOrganisations(address)", +"2dae35c4": "RGXBonus(string,string,uint256,uint8)", +"2dae9878": "BankOwner_EnableConnectBankAccountToNewOwnerAddress()", +"2daeb49a": "fundPuppets()", +"2daedd52": "stake(bytes32,uint256,uint256)", +"2daf0e1c": "presaleLevel()", +"2db0d129": "VIDALCOIN()", +"2db237bb": "MARGIN_SPLIT_PERCENTAGE_BASE()", +"2db25e05": "getTrade(uint256)", +"2db26de1": "checkBalances(address[])", +"2db2caef": "rmExchangeAccount(address)", +"2db3dc12": "FrozenAccount_event(address,uint256)", +"2db4f279": "createRoom(string,uint256)", +"2db579f2": "ETHPToken()", +"2db59e2b": "MyOwned()", +"2db6ad32": "testEmpty()", +"2db6e0fe": "fixPlayerFlag(uint256,string)", +"2db6fa36": "batchAddToWhitelist(address[])", +"2db78d88": "adminSealBallot(uint32)", +"2db78d93": "indexes(address)", +"2db8069f": "makeMemberOfCommunity(address,uint256)", +"2db89533": "Auth(uint8,address)", +"2db9395a": "availableTo(address)", +"2db93fc7": "buyBag(uint256)", +"2db95aa9": "getTomatoCount()", +"2dba1a44": "stockCancelSellOrder(uint256,uint256,uint256)", +"2dba3614": "app_address()", +"2dba5cfa": "transferCoins(address,uint256)", +"2dba9e63": "EMACToken(uint256)", +"2dbacf5f": "premiumOpen()", +"2dbb9050": "setSecurityTokensPercent(uint256)", +"2dbc62cc": "BlindCroupierTokenDistribution(address[16],uint256[16])", +"2dbcc104": "getAddressFromList(uint256)", +"2dbce390": "setDepositary_function_control(uint256)", +"2dbd606e": "set_sale_address(address,bytes32)", +"2dbe713d": "EOSPlusToken()", +"2dbede89": "next(bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,bytes2)", +"2dbf7b98": "certificate()", +"2dbf8bf0": "getRolled()", +"2dbffa6a": "executeBuyRequest(uint256)", +"2dc03259": "registerUser(bytes32)", +"2dc03b22": "createNTVU()", +"2dc0562d": "taxWallet()", +"2dc09c39": "protectedReclaim(address,uint256)", +"2dc26661": "unlockOutcome(string,uint256)", +"2dc2dbf2": "makeSimpleDeal(address,address,uint256,bytes32)", +"2dc47153": "datafeed()", +"2dc62c4d": "MintProofOfStake()", +"2dc70b2a": "getCorrectedTotalBPOfTokens(uint256[])", +"2dc7a2e5": "testSetupMultisig()", +"2dc88138": "submitCoin(address,string)", +"2dc8b9de": "f1(address)", +"2dc8be64": "buyoutWallet()", +"2dc8d88d": "privatesale_beneficiary()", +"2dc95548": "adjustTokenExchangeRate(uint256)", +"2dc9ad7f": "multisend(address[],uint256)", +"2dc9b8f7": "createGuess(uint256,uint256,uint256,uint256,uint256)", +"2dc9d3e5": "placeSellTokenOrder(uint32,uint256)", +"2dca374f": "FBToken()", +"2dcac811": "TTNCoin(uint256)", +"2dcb4691": "EventBuyTank(address,uint256,uint256,uint256)", +"2dcb5c8d": "xaurumProxyWorking()", +"2dcbac97": "getGen(uint256)", +"2dcbfdfa": "endEarlyBird()", +"2dcca1f9": "TokenRetriever()", +"2dccba89": "MAX_DEPARTURE_LIM()", +"2dcd4e41": "getGain(uint256)", +"2dcdcd0c": "minChild(uint256)", +"2dce6a1f": "KHT(uint256,string,string)", +"2dcebd16": "setWorldTreasuryAddress(address)", +"2dd02e92": "weGotAWinner(address,uint256)", +"2dd0e79e": "getMarket_CommunitUsedTokens()", +"2dd117e0": "RESERVED_TOKENS_BOUNTIES_ADVISORS()", +"2dd1a932": "WE3TOKEN()", +"2dd1cc27": "MichCoin(uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"2dd28736": "view50()", +"2dd2995a": "ETHERCOINSupply()", +"2dd2f86b": "maxTokenSale()", +"2dd306f7": "getTearBalance()", +"2dd31807": "unlistOpenProposals(bytes32)", +"2dd34f0f": "Whitelistable(address)", +"2dd395ae": "SUN()", +"2dd3ed9a": "addWorkRecord(uint256,bytes16)", +"2dd40301": "amountJurors(uint256)", +"2dd407f9": "Vag()", +"2dd4f8d4": "totalSupplyYear()", +"2dd522c6": "ATN()", +"2dd5b58e": "setNewGameLogic(address)", +"2dd608ce": "setPreICOLimit(uint256)", +"2dd694ff": "EntryExistAlready(bytes32,uint256)", +"2dd6ba7e": "release_remain()", +"2dd7030b": "removeAuction(uint256)", +"2dd78759": "affAddr_()", +"2dd7ab99": "BlackSnail(uint256,string,uint8,string)", +"2dd81ed3": "CROWDSALE_REWARD_TOKENS_NUMS()", +"2dd854d4": "addLoanToPortfolio(uint256,uint256)", +"2dd8a25e": "MakeTransaction(address,uint256,uint256)", +"2dd96c84": "presaleGranteesMap(address)", +"2dda04fa": "enterContest(uint32,uint32[])", +"2dda30a7": "transferAndFreeze(address,uint256,uint256,uint256)", +"2ddae32d": "UTCoin()", +"2ddbc04a": "play2(address,uint256)", +"2ddbc97e": "addAuthor(address)", +"2ddbd13a": "total()", +"2ddc36ba": "BRC()", +"2ddcac03": "_checkLimit(uint256)", +"2ddcb21f": "limitSupply()", +"2ddd196f": "bookGuest(string)", +"2ddd6fa5": "incomingRandomNumberError(address)", +"2dddd8e0": "CROWDSALE_HARDCAP()", +"2dddf3e1": "request_withdrawal(uint256,uint256)", +"2dde1911": "balancesImporter2()", +"2dde7241": "priceWithDiscount(uint256,uint256)", +"2dde7dbc": "MAX_DTH()", +"2dde9aca": "deployment()", +"2dde9f81": "getLockWFee()", +"2ddea5fc": "enableEscapeHatch()", +"2ddeac16": "getForeignTokenBalance(address,address)", +"2de02bfa": "allocate(address,address,uint256)", +"2de05136": "unregisterVerifier(address)", +"2de16fdb": "fetchDayTokens()", +"2de1e234": "requestUSDPrice(string)", +"2de22cdb": "currentMintedTokens()", +"2de39dbe": "DifficultyOracle(uint256)", +"2de3ad02": "getUserWalletByUsername(string)", +"2de3cddc": "setCostToCreate(uint256)", +"2de40ce3": "registered()", +"2de4ca59": "Check()", +"2de4fbd8": "DaoRulesProposalAdded(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,address)", +"2de541e0": "updateAvatarInfo(address,uint256,string,uint256)", +"2de5aaf7": "getAgent(uint256)", +"2de61d1f": "changeIcoTimeRange(uint256,uint256)", +"2de6fac6": "delKYC(address)", +"2de86c5b": "transferPlayerBudget(address)", +"2de896f6": "MaxTokensPerAccountUpdated(uint256)", +"2de90801": "hashtagToken()", +"2de954af": "fixedLog2(uint256,uint8)", +"2de9a13a": "ToGoConcert()", +"2dea5f6d": "markCombatStarted(uint256)", +"2dea82b4": "checkActualPrice()", +"2deb65c7": "GetPoolInformation()", +"2deb7571": "queryByAddr(address)", +"2deb79b6": "getStockShares(uint256)", +"2ded516e": "giftIsTo()", +"2dee466d": "getAllActiveAuctions()", +"2def6620": "unstake()", +"2df056bd": "ServiceProvider(string,string,string)", +"2df05a3e": "payoutIndex()", +"2df33eee": "ShareEstateTokenCrowdsale(address,address,uint256,uint256)", +"2df38460": "unFreeze(address,uint256)", +"2df39546": "_generateRandom(bytes32,uint32,uint32)", +"2df3f82a": "setClaim(string,string)", +"2df456d4": "SetAllPaymentsSent(uint256)", +"2df56bb2": "unitBattleEthCost(uint256)", +"2df5a559": "year4LockAddress()", +"2df5ce67": "WorkOrderCompleted(uint128,uint256,string)", +"2df6e80a": "cancelTradeOffer(bytes32)", +"2df7c637": "ensureCurrentStage()", +"2df80280": "lastState()", +"2df80c87": "privilegedMintLock()", +"2df8e00d": "becomeMortal(uint256)", +"2df939cd": "Banglatoken()", +"2df9feaa": "stopElection()", +"2dfaf204": "executeContract(uint128,uint128)", +"2dfd27e8": "fecharDoacoes()", +"2dfdaf59": "CheckSoilTempException(bytes32,uint32)", +"2dfdf0b5": "depositCount()", +"2dff0d0d": "getById(bytes32)", +"2dff3498": "Relay()", +"2dff692d": "orderStatus(bytes32)", +"2dff6941": "content(bytes32)", +"2dff7a2b": "authoriseMaker(address)", +"2e0025c1": "ROLE_BACKEND()", +"2e011136": "deployTokens(address[],uint256[])", +"2e012698": "validate(bytes32)", +"2e01783d": "calcprice()", +"2e0179b5": "increaseApprovalWithSender(address,address,uint256)", +"2e01d229": "Attacker(address)", +"2e02583c": "wordlist()", +"2e028287": "test_oneInvalidAssertFalse()", +"2e029c65": "HARDCAP_TOKENS_ICO()", +"2e02b24c": "PMCToken(address,uint256)", +"2e038aaf": "randaoAddress()", +"2e04d730": "BuyGoods(uint32)", +"2e05177f": "OpenTransferToken()", +"2e055bcc": "preSaleSupply()", +"2e05b37b": "settleFee(address,address,uint256,uint256)", +"2e06c756": "post(string,string,string,uint256,uint256,address)", +"2e071db3": "updateUserAge(address,uint256)", +"2e081f31": "pause_3()", +"2e08c3d1": "checkUserWhiteList(address)", +"2e08eb77": "InitialTreeICO()", +"2e09c32f": "playRound(address,uint256)", +"2e0a020e": "refunduingStartDate()", +"2e0b1834": "periodByDate()", +"2e0bee7b": "createCampaign(string,string,uint256[],uint256,uint256,uint256,uint256)", +"2e0c6c36": "RANGEEND_3()", +"2e0ca1ee": "first_pay()", +"2e0cb498": "hashValue(bytes32)", +"2e0de515": "setTip(uint256)", +"2e0dfafc": "addBlockListed(address)", +"2e0e11b2": "OrderMatchFailure(address,int256,address,int256,uint256,uint256)", +"2e0e5ce8": "getBonusNames()", +"2e0eb6fd": "Lucy()", +"2e0eb943": "doSend(address,address,uint256)", +"2e0ef395": "voteOnNewEntryFees_only_VIP(uint8)", +"2e0f2625": "DECIMALS()", +"2e0fb349": "mainSaleSecondEndDate()", +"2e0fc7a6": "updateContributor(address,uint256,uint256)", +"2e102ee4": "setGasPrice(uint8)", +"2e108133": "qshdrop(address[],uint256)", +"2e10870f": "makeAnotherContractOwnerOfToken(address)", +"2e10feff": "addSigByProvider(bytes32)", +"2e13bd10": "not()", +"2e14ef92": "mutiSendCoinWithSameValue(address,address[],uint256)", +"2e15ba63": "forwardData(bytes32,address)", +"2e16cf54": "retrieveWallet(address)", +"2e16e82e": "BitcoinCityCoin()", +"2e17de78": "unstake(uint256)", +"2e18270f": "receiveBTC(address,string,uint256,string)", +"2e18762c": "LogUpdateInvestorProfitSum(uint256)", +"2e18cead": "PrivateSale(address,uint256,uint256,uint256,uint256)", +"2e18d8a9": "becomeBullsmaster()", +"2e190d03": "IncreasingPriceCrowdsale(uint256,uint256)", +"2e19599c": "getTargetRepMarketCapMultiplier()", +"2e19d31b": "proposalText()", +"2e19ebdc": "pIDxName_(bytes32)", +"2e1a348e": "TicTacToeGame()", +"2e1a37ee": "TCToken()", +"2e1a7d4d": "withdraw(uint256)", +"2e1a9ffe": "getPepe(uint256)", +"2e1b2098": "PlayerCreated(uint8,address,uint256)", +"2e1b7f08": "SetClaimRate(uint256)", +"2e1bbe98": "setLimitEth(uint256)", +"2e1c1d63": "BoardMeetingClosed(uint256,uint256,bool)", +"2e1c49d9": "testInitalBalanceUsingNewContract()", +"2e1d22b6": "getPlayerDividend(address)", +"2e1dc4b8": "setTokenReward(address)", +"2e1dea6b": "updateHours()", +"2e1e786d": "setWhitelist(address[],address[],uint256[])", +"2e1eb7fe": "slice32(bytes,uint256)", +"2e1ef07a": "getAmountOfTokens(uint256,uint256)", +"2e1faf75": "transferToken(address,uint256,uint256)", +"2e1fbfcd": "getProposalObjectionByIndex(uint256)", +"2e20255e": "MasterToken(uint256,string,uint8,string)", +"2e20b66a": "setThings(address[],uint256[],uint256)", +"2e217405": "limitedWallets(address)", +"2e21b085": "lastPriceOf(uint256)", +"2e226c84": "rewardForDrawing()", +"2e23062d": "increaseBase()", +"2e2326d5": "isPrivileged(address)", +"2e247e4f": "SRGToken()", +"2e25aa96": "setCharPrice(uint256)", +"2e25d2a6": "marketPlace()", +"2e26328d": "RaiToken()", +"2e271ff3": "getEmail(address,address)", +"2e276499": "minPayment()", +"2e279344": "getLunckyInfo()", +"2e27c10a": "setPI_edit_25(string)", +"2e283b94": "TokenClaim4BTC(address,address,uint256,uint256,uint256,uint256)", +"2e28b3f5": "SGX_ADDRESS()", +"2e28d084": "setBytes(bytes32,bytes)", +"2e28fd42": "complete(uint256,string)", +"2e293e58": "setClientPaidUpTo(address,uint256)", +"2e297a44": "getSmartContractsLength()", +"2e298f75": "setPositiveGrowth(int256)", +"2e2a51bd": "WitdrawTokenToHolder(address,address,uint256)", +"2e2a6488": "evaluation_stage_block_size()", +"2e2aad44": "NIMFAToken(address,address,address,address,uint256,uint256)", +"2e2b3f61": "TokenCreated(address)", +"2e2b5809": "Insurechain(address,address)", +"2e2bac04": "addControllerContract(address)", +"2e2bec5c": "getMinerLevel(uint256)", +"2e2cce55": "icoRound5()", +"2e2d6ab1": "DelayedPayment(address,uint256,address,uint256)", +"2e2e4149": "minTomoContribution()", +"2e2ed6a7": "PALToken(uint256,address)", +"2e2fe8a9": "ZYL()", +"2e2ff7c6": "transferPreSaleTokens(address,uint256)", +"2e3196a5": "set(string,bytes32)", +"2e323f5d": "Update(uint256,uint256,string)", +"2e325020": "getStage(uint256)", +"2e33178a": "zRefundAllPlayers()", +"2e334452": "getPublicKey()", +"2e336eea": "testDieIfMinReturn0()", +"2e338df5": "transferInner(address,uint256)", +"2e33cd7a": "distructVault(bool)", +"2e340599": "info(uint256)", +"2e340823": "cancel(uint256[])", +"2e35d7a8": "companyTokensCurrent()", +"2e368e03": "beneficiariesPercentage(address[],uint256[])", +"2e36a709": "Error(uint256)", +"2e3712c4": "Bitelectroneum()", +"2e376ada": "whitelistIndexMap(address)", +"2e379264": "AIRDROP_CLAIM_AMMOUNT()", +"2e37fa97": "doneOptions()", +"2e39c2b1": "Prize(string,uint256,string)", +"2e39ff84": "isGeneSynthesis()", +"2e3a0a7c": "destroyMultipleItems(uint256[])", +"2e3a4d12": "handleRSMCUpdateTx(address,bytes32,uint256,address,uint256,address,uint256)", +"2e3a4def": "isTier2(address)", +"2e3a5611": "create(string,string,string,uint256,string,string,uint256,string)", +"2e3a71d5": "futureFundingBalance()", +"2e3acf6b": "contractPreICO()", +"2e3aff3b": "getSpinnerPrice(uint256)", +"2e3b3123": "_multiSet(address[],uint256[])", +"2e3b96bf": "developersTokens()", +"2e3be78d": "setPrecisionDirect(uint8)", +"2e3c2259": "playingNTVU()", +"2e3c9e99": "managerAddr()", +"2e3ca08c": "WALLET_MARKETING()", +"2e3cbb3b": "sellPop(address,uint256,uint256)", +"2e3ced61": "periodPreITO_startTime()", +"2e3db828": "getAddressForUsername(bytes32)", +"2e3edd0f": "ntsDepositAddress()", +"2e3fa349": "isLpStart()", +"2e4040b0": "releaseTeamTokensAfter6Months()", +"2e404c0f": "_setDOwner(bytes32,address)", +"2e4054cf": "vest2advisors(address,address)", +"2e4099bd": "transferAirdrop(address[],uint256,bytes)", +"2e414890": "challenge(uint256,uint256)", +"2e415444": "transferUniqueId(bytes32)", +"2e416162": "tkstest()", +"2e4176cf": "chairperson()", +"2e4216c1": "setMinInvestmentInWei(uint256)", +"2e42b012": "LockAccount(address)", +"2e42f80c": "CDC()", +"2e42f860": "toUint32(bytes)", +"2e430824": "trackable(address,address)", +"2e43bdfd": "approveDecrease(address,uint256)", +"2e440403": "rounding()", +"2e448f4b": "transferAngel(address,address,uint64)", +"2e450881": "PRESALETOKENMAXSALES()", +"2e4644bf": "sellDragon(uint256,uint256,uint256,uint16,bool)", +"2e465465": "provideIndex(string,uint256)", +"2e466373": "resumePlaying()", +"2e46cb09": "AddChipTempTime(uint32,uint256)", +"2e46ed94": "uint8ToString(uint8)", +"2e471d47": "addInvest()", +"2e478dd8": "provideCertificate(uint256,uint256)", +"2e4837ea": "pickUp()", +"2e48f65d": "UpdateMoney()", +"2e49d78b": "setStatus(uint8)", +"2e4a3657": "returnToken()", +"2e4ab29e": "technicalContract()", +"2e4b3d59": "setSecurityPercent(uint256)", +"2e4bd18a": "ApproveFinishMintingRequest()", +"2e4c4a9f": "lunyrPercentOfTotal()", +"2e4c697f": "pow(uint256,uint256)", +"2e4d2a09": "DMC()", +"2e4d3189": "withdrawal(address,uint256,uint256)", +"2e4d59c4": "CheckBalance(address)", +"2e4d8c8f": "exerciseToken()", +"2e4eaa15": "destroyToken()", +"2e4f43bf": "allOf(uint256)", +"2e4fd0ca": "addReferrer(uint256)", +"2e502569": "emitTransferred(address,address,uint256,address)", +"2e504bdb": "distributeTokens(uint256,uint256,uint256)", +"2e50e3ff": "simulateOptions(uint32,uint32,uint32,uint32,uint32,uint8,uint32)", +"2e5113b7": "benefit()", +"2e519ad5": "joinGameReferred(bytes32,address,uint8)", +"2e519dd5": "updateLottoParams(uint256,uint256,uint256)", +"2e51cdf6": "getAddressFromBytes(uint8,bytes)", +"2e52d606": "n()", +"2e532ba2": "getBackgroundImage(address,uint256)", +"2e533630": "sendBatches(address[],uint256[])", +"2e541234": "AllThingsTokens()", +"2e558a2d": "ETTToken()", +"2e56f71e": "deactivateMint()", +"2e56fd7a": "currentDelayOnNewLevel()", +"2e574191": "NEURAL()", +"2e58e65a": "getTokenInitialPrice()", +"2e597ada": "ChenToken()", +"2e599054": "depositETH(address,uint256)", +"2e5a6f17": "releaseAdvisorsTokens()", +"2e5a79fc": "_withdraw(string,address,uint256)", +"2e5ab94f": "BLOCKS_PER_PHASE()", +"2e5ac9b1": "createToken(address,address,address)", +"2e5b02ae": "setCrcWithdrawAccount(address)", +"2e5b2168": "maxBet()", +"2e5b4c43": "allowTrading()", +"2e5b604e": "lockBonus(address,uint256)", +"2e5c4cef": "RRRR_Token()", +"2e5cc103": "createDefaultEtherDog(uint256,uint256,uint256,address,uint256,uint256)", +"2e5d1042": "requestPayout(uint256,uint256,bytes32,uint256,uint256)", +"2e5d89bd": "BlockmoXyz()", +"2e5df0fe": "signUpDelegatedUser(string,address,uint8,bytes32,bytes32)", +"2e5e00e1": "_FIFTY()", +"2e5ec035": "_ApplicationRemoved(bytes32)", +"2e5fe746": "communityTokens()", +"2e609c10": "presaleStartsAt()", +"2e61319d": "getNumberOfAddresses()", +"2e617512": "getAddressFromName(bytes32)", +"2e62190c": "valueWithFee(uint256)", +"2e6245c6": "internalBalance()", +"2e62efbb": "getOpenOrderInfo(address,address)", +"2e63046d": "mybUSDPrice()", +"2e63756f": "PriIcoSale(address,uint256,uint256,address,address)", +"2e639fd5": "GetPlayerInfo()", +"2e63cfe1": "Twoandtwo()", +"2e63dc80": "get_description_url()", +"2e63fa72": "calculateFillHash(address[],uint256[],uint8,uint8)", +"2e64bcf1": "weiWantedOf(address)", +"2e64cec1": "retrieve()", +"2e65280d": "ListNotValidated()", +"2e660475": "PonziTokenV3()", +"2e66ee1b": "currentStateToString()", +"2e69e69b": "getQuantity(address)", +"2e69e8c5": "CarolToken()", +"2e6aa830": "testInitialBalanceWithNewMetaCoin()", +"2e6b2662": "sponsoredBonusMin()", +"2e6b921c": "claimTokensByAdmin(address)", +"2e6bbde5": "_updateCurrentAnswer(bytes32,bytes32,uint32)", +"2e6c4933": "getchilds()", +"2e6ccbf6": "getFactorybyIndex(uint256)", +"2e6d18ec": "getRoomData(uint256)", +"2e6d561b": "sendUnsoldTokensToTreasury(address)", +"2e6e190e": "Play(uint256,uint256)", +"2e6e504a": "trusteeWithdraw()", +"2e6e795c": "shareHoldersOf(uint256)", +"2e6f2136": "emitToken(address,uint256)", +"2e6f3e4a": "PERCENT_RATE()", +"2e6f456c": "updateCrowd(uint256,uint256,uint256,uint8)", +"2e70bd4f": "mintOperationCount()", +"2e712cc1": "getAdminComission()", +"2e71e68f": "IDX()", +"2e72057e": "GetLiasonURL(uint256,uint256,uint256)", +"2e722561": "CrowdsaleController(uint256,address)", +"2e7248bf": "MINIMUM_SELLING_UCCOIN()", +"2e729daf": "totalTRsWagered()", +"2e73dba0": "FeneroToken()", +"2e76a6d4": "allocateMarketingTokens(address,uint256)", +"2e771b17": "Spent(address,uint256,string)", +"2e77b3d0": "annual_circulating_supply()", +"2e788443": "resolve(string,address,uint256)", +"2e788faf": "HOLODECKS()", +"2e78f9a7": "getCardValue(uint256)", +"2e79477f": "SGD()", +"2e799a77": "GainChip(address,uint32,bool)", +"2e79d702": "addPolicyRule(bytes4,address,bytes32,uint256,uint256)", +"2e7a26d6": "Delineto()", +"2e7a9409": "_winJackPot(address,string)", +"2e7bcc55": "put(bytes32,bytes32,bytes32)", +"2e7ceb0f": "THIRD_TIER_RATE()", +"2e7d6253": "Sale(address,address,address)", +"2e7db440": "prepurchase(uint32)", +"2e7dc6af": "src()", +"2e7e33df": "sendFunds(address,uint256,bytes)", +"2e7e9af8": "addDistributee(address,uint256)", +"2e7e9d82": "ModerateBill(uint256,bool)", +"2e7f5107": "_processCredit(address,uint256)", +"2e7f9127": "setSize(uint8,string)", +"2e7fa0bb": "ReyNetMax()", +"2e8057ba": "NucleusVisionToken_ASTER87901()", +"2e80a85d": "last_jack()", +"2e80cc56": "crowdSaleMin()", +"2e80d9b6": "QUORUM()", +"2e80e77c": "minimumWeiAmount()", +"2e817963": "set_sdl(address)", +"2e81cdda": "setItemOptions(address,uint256,uint256,uint8)", +"2e82aaf2": "lock(bytes32,uint256,uint256)", +"2e831cd1": "update_bitcoin_ratio(uint256)", +"2e834576": "tokensForEth(uint256)", +"2e83faee": "CustodianUpgradeable(address)", +"2e84a374": "reclaimEtherTo(address,uint256)", +"2e84bed8": "VESTING_2_AMOUNT()", +"2e84e8ca": "ItsComingHomeToken()", +"2e8511f0": "getReg1()", +"2e85dd54": "getGPSMaxEth()", +"2e860fc2": "setRaiseLimit(uint256)", +"2e867c77": "PRESALE_BONUS_PERCENT()", +"2e86cb13": "publicGetAsset(uint256,uint256)", +"2e875a9f": "RnMmasterReq()", +"2e87b461": "getPlayerFrontDataForMarketPlaceCards(uint256)", +"2e87edd9": "MINIMUM_PARTICIPATION_AMOUNT()", +"2e87f4a5": "_emitRoleAdded(address,uint8)", +"2e881918": "setVariantCount(uint256,uint256)", +"2e894203": "delLitAddress(address)", +"2e898ddc": "validateTemporalUnit(uint256)", +"2e8a34a7": "addTo(bytes32,uint256)", +"2e8ac384": "SmartIdentityRegistry()", +"2e8ac517": "TokensMinted(address,uint256,uint256)", +"2e8b73cd": "getPoolUrlOfAuditReport(uint256)", +"2e8c0ac2": "balancing(int256,int256,uint256)", +"2e8c5793": "BonumPromoToken()", +"2e8cbf7d": "_determineAttack(uint256)", +"2e8e66b9": "newRequest(address)", +"2e8e9bb9": "Venuscoins()", +"2e90610d": "auditActivity(uint256,string,uint256,uint256)", +"2e9066b2": "lastBlock_v6()", +"2e90aae8": "cuck()", +"2e913118": "txTaskMap(uint256)", +"2e91812b": "setSmallCapWhitelistParticipants(address[],uint256)", +"2e92abdd": "withdrawDividends()", +"2e932961": "setTimeEnd(uint256)", +"2e93497e": "ownerRandomHash()", +"2e9392bb": "marketEggs()", +"2e9453c2": "stateOfICO()", +"2e94afe0": "EDN()", +"2e94c0df": "_withdrawTokens(address)", +"2e9501d6": "maxThreshold()", +"2e963adc": "timelocksContracts(address)", +"2e97766d": "getBlock()", +"2e97c5a5": "ethToLoveyRate()", +"2e97f1bb": "setCustomerTxAsSpent(address,bytes32)", +"2e984745": "partnerID(address)", +"2e9868f8": "issuerName()", +"2e986b54": "TransferMinimumFeeConfirmed(uint256,address,uint8)", +"2e98a401": "preCheckAndPay(string,uint256,address)", +"2e993994": "changeUnforked(address)", +"2e995fd7": "setOraclizeAllowance(uint256)", +"2e99df84": "InitiateTeams()", +"2e9a06fd": "isValidIPFSMultihash(bytes)", +"2e9a3869": "MORCO()", +"2e9b4414": "getSpawnLimit(uint32,int256,uint256)", +"2e9b50bd": "addPeer(address)", +"2e9bbbb8": "transferOwnershipUpdateToken(address)", +"2e9be9d5": "signWithdraw(address,address)", +"2e9c135b": "proxydeposit()", +"2e9c5e77": "doStackExtension(uint256)", +"2e9c91a8": "getStartParams(bytes32)", +"2e9efb8e": "commitToWeek(uint256,uint256)", +"2e9f86cd": "create0(uint256,bytes)", +"2ea0dfe1": "transferFrom(address,address,uint64)", +"2ea1f9aa": "getEpisodeLength()", +"2ea23b11": "testTransferFromDoesNotAllowTransferByAddressThatHasNotBeenApproved()", +"2ea38693": "testCreatePrizeUsingNewContract()", +"2ea3ad74": "finishPreIco()", +"2ea3f9fc": "gelerCompte(address,bool)", +"2ea459b8": "claimThrone(bytes)", +"2ea60e35": "fourthWeekBonus()", +"2ea68d4b": "LazyCoderCoin()", +"2ea6d6da": "absMin(int256,int256)", +"2ea7b4d0": "ALPHA_DIVISOR()", +"2ea7e0d2": "Test5(uint256)", +"2eaa7be9": "PoolSegregationCrowdsale(uint256)", +"2eaad0b0": "_getAllChildren(bytes32)", +"2eabb38d": "doTransferIn(address,uint256)", +"2eac3a7d": "divCashCoin()", +"2eac5a77": "Getscoins()", +"2eac5ca2": "deleteUsername(bytes20)", +"2eacfd0f": "admin_withdraw(uint256)", +"2ead28fa": "BBTToken(address)", +"2eadda54": "number_to_hash(uint256)", +"2eae0018": "setMaxChildCount(uint256)", +"2eae0d0a": "SetTimes(uint256,uint256)", +"2eaf7fe0": "buyTokenPostIco(address,uint256)", +"2eaf81f9": "concludeTournament(uint256,uint256)", +"2eafb9fa": "setMintTokenOwner(address,address)", +"2eafc2aa": "installWinner(uint256)", +"2eb0111c": "currentPhaseAddress()", +"2eb0b45a": "setGlobalsSize(uint256)", +"2eb1482a": "isHorseInStud(uint256)", +"2eb1ee9e": "CandyLand(address)", +"2eb255ec": "divpaid()", +"2eb2c2d6": "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)", +"2eb37466": "removeWhitelistedAddress(address,address)", +"2eb3a797": "getBetKey(uint256)", +"2eb44efc": "ICOSaleType()", +"2eb4a7ab": "merkleRoot()", +"2eb51417": "isWithinSaleLimit(uint256)", +"2eb516b8": "setGNR(address,address,address)", +"2eb56ad4": "getUserTokensByGame(address,uint32)", +"2eb5c61f": "testThrowsUpdateLatestRevisionEnforceRevisions()", +"2eb61d15": "getAdvisorStatus(address)", +"2eb67f53": "isERC20()", +"2eb73307": "internalRefund(address,uint256)", +"2eb77b44": "PNNP(uint256,string,uint8,string)", +"2eb9526e": "GetBoilersInfo()", +"2eb95fd4": "doHijack(uint256,uint256,uint256,uint256)", +"2eb96988": "getMetBalance()", +"2eb98d34": "hosp_count()", +"2eb9a518": "ChangeRateOfToken(uint256,uint256)", +"2eb9f831": "markAsFounder()", +"2eba1c40": "deleteName(address)", +"2eba9ca9": "liquidateUser(address,uint256)", +"2ebabea0": "preSaleRaise()", +"2ebba2cf": "unitsPerEthAt(uint256)", +"2ebbac6c": "ico4Cap()", +"2ebbc58c": "getAllRouter()", +"2ebc4293": "getEthereum()", +"2ebc760b": "AvPresale()", +"2ebd1e28": "setTokenAddr(address)", +"2ebd632a": "addSystem(address,address)", +"2ebd9242": "TOTAL_TOKENS_ICO()", +"2ebe14b0": "timeoutBlocks()", +"2ebec916": "withdrawalProfit()", +"2ebeee0f": "increaseMinPurchaseQty(uint256)", +"2ebfa208": "checkFreeze(uint256)", +"2ebfeaac": "setCCH_edit_33(string)", +"2ec0090a": "withdrawEtherBalance()", +"2ec0faad": "createPassport()", +"2ec19f0f": "itemTransfer(address)", +"2ec21efd": "OuCoin()", +"2ec29c59": "ICOSALE_BONUSJOINTTOKENS()", +"2ec2c246": "unregister(address)", +"2ec40ac8": "reached()", +"2ec449d7": "MedexTestToken()", +"2ec47069": "assignFoundationSupply(address)", +"2ec6b4f6": "getUnitCoinProductionMultiplier(address,address,uint256)", +"2ec6ea30": "Hodl()", +"2ec82b8f": "balanceOfInt(address)", +"2ec86103": "booleanToUInt(bool)", +"2ec90e34": "decrementOwnedArea(address,uint256)", +"2ec9322d": "returnStartTime(uint256)", +"2ec9ad44": "removeAccessor(address)", +"2ec9c537": "MyFiChain()", +"2eca51e2": "elements(uint256,uint256,uint256)", +"2ecad13f": "getSaleEndDate()", +"2ecae90a": "getLeverageList()", +"2ecb0d64": "getNumber(bytes32)", +"2ecb20d3": "fromHexChar(uint8)", +"2ecb9279": "yesHash()", +"2ecbd6d8": "allowedForWithdrawn()", +"2ecc8703": "guardInterval()", +"2ecca4e6": "_destroyNinja(uint256)", +"2ecd071e": "Freezed(address,uint64,uint256)", +"2ecd7020": "getTotalTokenSold()", +"2ecde40e": "getRefWallet(address,address)", +"2ece07c3": "setUserAirDropRate(uint32)", +"2ecf307e": "_addrNotNull(address)", +"2ecf66e4": "softCapToken()", +"2ed028da": "addGift(address,uint8)", +"2ed0d097": "_getTotalTokenBalancePerShard(uint256)", +"2ed196bd": "ccLockedUpBalances(address)", +"2ed1a7f6": "setProposalTTL(uint256)", +"2ed1e521": "generateWinMatrix(uint16)", +"2ed1f26e": "unlockBatchOfAddresses(address[])", +"2ed20ec7": "Yiha()", +"2ed23a73": "_releaseTo(address)", +"2ed252cb": "toERC20(uint256,uint256,uint256)", +"2ed42bf7": "_config()", +"2ed44309": "setIcoParameters(uint256,uint256,uint256,uint256)", +"2ed4595a": "participantContributionInEth(address)", +"2ed4a2c7": "changeState(address,uint8)", +"2ed4b68a": "creditFundNIMFAAddress()", +"2ed5016a": "SolidStampRegisterAddress()", +"2ed5ca29": "recordFillOrder(bytes32,uint256,uint256)", +"2ed604c8": "secondsLive()", +"2ed73df6": "starterPackCardLevel()", +"2ed94f6c": "bulkWithdraw(address[])", +"2ed9859f": "hasSongWriterSigned(address)", +"2ed9cf65": "editPerson(address,string,string,string,uint256,uint256)", +"2edb5389": "replenishTokens(address,uint256)", +"2edcc661": "crowdsaleStartDate()", +"2edcedc6": "parkingSwitches(address)", +"2edefc26": "founderMultiSigAddress()", +"2edf8042": "collectProvisions(uint256)", +"2ee01240": "getUnitJadeStealingMultiplier(address,address,uint256)", +"2ee057ca": "deallocateItem(uint256,uint256)", +"2ee07c00": "closeEvent(uint256)", +"2ee07cbf": "AxieClockAuction(uint256)", +"2ee119cb": "demint(address,uint256)", +"2ee1e64c": "toRLPItem(bytes,bool)", +"2ee2a7af": "getContractPartner()", +"2ee3cf83": "cancelOrderByAdminWithMerchant(string,address)", +"2ee40908": "stakeFor(address,uint256)", +"2ee551bf": "RESERVED_BOUNTY_GROUP()", +"2ee56469": "cancelGoldBuyOrder()", +"2ee5d2e3": "last_forwarder_created()", +"2ee6807a": "raiseCoinsDeducted(address,uint32,uint256)", +"2ee6f8b6": "changerType()", +"2ee6fe55": "_addOwnerPlayerToTeam(uint256,address,uint256,uint256)", +"2ee79ded": "change()", +"2ee86973": "resolveHTLC(uint256,uint256,uint256,bytes32,int256,bytes32,uint8,bytes32,bytes32)", +"2ee8dda9": "allocateFoundationToken()", +"2ee92639": "purchaseCancel(address)", +"2ee94319": "RecievedEth(address,uint256)", +"2eea1efe": "getCCH_edit_20()", +"2eebdeb8": "_setStakeHolder(address,uint256)", +"2eebe94f": "weiRaisedAmount()", +"2eecbc7f": "deployMeDao(string)", +"2eecc46c": "sendTokensToInvestor()", +"2eed0079": "createMicroModule(uint256,string,uint256,uint256,uint256,uint256,uint256)", +"2eee5a3e": "totalPresaleTokensYetToAllocate()", +"2eef13cd": "changeArt(bytes32,string,string,string,string,string,address)", +"2eef3d65": "query(bytes32,string)", +"2ef01862": "subscriptionDetails(uint256)", +"2ef0a28d": "seraphims(address)", +"2ef140ef": "send(address,uint256,uint256,uint256)", +"2ef22b34": "setExpRewards(uint256,uint256)", +"2ef2b51d": "OWNER_TAKE_SHARE()", +"2ef2d55e": "channelTimeout()", +"2ef2edb8": "endICOStage1()", +"2ef345e4": "DAppSky()", +"2ef35214": "setVestingRate(uint256)", +"2ef3a7e1": "setBalancePercentageLimit(uint256)", +"2ef3accc": "getPrice(string,uint256)", +"2ef4940f": "withdrawalsVotes()", +"2ef4d922": "revertMe()", +"2ef5c784": "allTimePlayers()", +"2ef6d6c0": "countWebsite(address)", +"2ef70523": "SVDelegation()", +"2ef75ebc": "STAGES_PERCENT_RATE()", +"2ef761d3": "buyTile(uint8,uint8)", +"2ef771ae": "hodlFor(uint256)", +"2ef82db9": "getCandidatePollingResesult(address,uint256)", +"2ef875fb": "div10(uint256,uint8)", +"2ef8c22b": "FunWorldCoinToken()", +"2ef9b4aa": "EngkusTechResearch()", +"2ef9b5a7": "changeBonusMultiplier(uint256)", +"2efa3c87": "TokensSpent(address,uint256)", +"2efa79d3": "tokensFrozen()", +"2efaa460": "testActivateSale()", +"2efad59d": "EmployeeServ(address)", +"2efb3f04": "getNumberOfScams()", +"2efb77c4": "changeDates(uint256,uint256)", +"2efbb80c": "addMeaningToCovfefe(uint256,string)", +"2efc5013": "Ask(uint256,uint256,address)", +"2efcb5e0": "TransferCommissionToken(uint256)", +"2efd08df": "totalPaintingsCount()", +"2efd5632": "candyLandAddress()", +"2efeb4e5": "LogSale(address,uint256,uint256)", +"2effbada": "eligibleTestAndIncrement(address,uint256)", +"2f0019f2": "getFeatureStatus(string)", +"2f002511": "viewTotalPaid()", +"2f004218": "PERCENT_COMMISSION()", +"2f00b84a": "SECToken(uint256,string,string)", +"2f0160e7": "fromOtherCurrencies(uint256,address)", +"2f034f35": "PerformingMonthlyMinting(uint256)", +"2f038fd5": "enable(uint8)", +"2f0573d9": "DSToken(bytes32)", +"2f0579db": "_isBreedingPermitted(uint256,uint256)", +"2f0746bf": "unsetWildCardToken(uint256)", +"2f078b12": "HashGenerator()", +"2f087a28": "getTokenCap()", +"2f08acfa": "Extreme()", +"2f0989ec": "release12m()", +"2f0ae513": "calculateTotalWithdrawableTokenAmount(address,address)", +"2f0b0222": "numberOfRound()", +"2f0b15f6": "testGetUnset()", +"2f0b5cb5": "setTokenTransferPercentage(uint256,uint256)", +"2f0b9dcb": "getArray2()", +"2f0c2c7c": "getReward(uint32)", +"2f0c59e7": "DISTRIBUTION_INVESTORS()", +"2f0c9387": "TestCitySnapshot(address,uint256)", +"2f0cca79": "dataMerkle(uint256[],uint256,uint256)", +"2f0d2079": "getEventBanks(uint256)", +"2f0d8962": "ChangeFeed(bytes32,uint256)", +"2f0dbae1": "MaxICOpublicSupply()", +"2f0ddcb2": "getTechBonus2(uint256)", +"2f0e23fb": "purchaseEndTime()", +"2f0e3a6c": "status(address,address)", +"2f1017cb": "getwinnerloser()", +"2f109d2b": "afterWhtelisted(address)", +"2f113f27": "LOCK_STAKE()", +"2f121ada": "companyBalance()", +"2f12bc02": "LiquexPrivateSale()", +"2f1335cf": "splitFunds(uint256)", +"2f13b60c": "isExpired()", +"2f148f55": "showMoseEvent(uint32)", +"2f156f69": "deployTgeTeamVesting(address,uint256)", +"2f158162": "setHKHcoinAddress(address,address)", +"2f16753c": "ShellToken(uint256,string,uint8,string)", +"2f16c072": "getPeaks(uint256)", +"2f1766c5": "addCA(address,address,string,string,string,string,string,string)", +"2f17a466": "terminateSchedule(address)", +"2f186785": "showProfit(address)", +"2f18a920": "setDeputy(address)", +"2f1927cb": "prepareRoll(uint256,uint256,uint256)", +"2f194e40": "isMintDone()", +"2f1a2e72": "allocate(address,int64)", +"2f1a332a": "OwnerRandomNumber(uint256)", +"2f1a8177": "weiToBnty(uint256)", +"2f1a8b63": "modify_ICOEndDate(uint256)", +"2f1af169": "EscrowMyEther()", +"2f1afbac": "doAirdrop(address,address[],uint256[])", +"2f1c34ef": "buyStar(uint256)", +"2f1c6494": "tgeSettingsAmount()", +"2f1c935e": "setSkinContract(address)", +"2f1cae85": "isIssuable()", +"2f1cc35b": "getRoundBetNumber(uint256,uint256)", +"2f1d29fd": "HarjFarmer()", +"2f1d3e28": "sendAwardToLastWinner()", +"2f1d5a60": "setOperatorAddress(address)", +"2f1ddbe3": "nodalblockShortLink(uint256,string)", +"2f1de784": "getPoolsAllot(bytes32)", +"2f1e4968": "makeNewProposal(string,uint256)", +"2f1ee5e1": "recycleUnreceivedBonus(address,address)", +"2f1f1d43": "getownership2(uint16,uint256,uint256)", +"2f20270a": "addNewUrl(string)", +"2f2035ed": "test_feePoolShare_notTranscoder()", +"2f204237": "setupSaleContract(address)", +"2f212780": "KYCbit4()", +"2f220d7a": "executeEscrow(uint256,address)", +"2f237e82": "create(string,string,bytes)", +"2f24bdc7": "is_transaction(bytes32)", +"2f254d09": "UGVCToken()", +"2f262471": "GetPlayerCards(address)", +"2f265cf7": "totalVotesFor(bytes32)", +"2f26b5d1": "delayIcoEnd(uint256)", +"2f26f6f5": "getIsCompany(address)", +"2f2712f8": "getStat(bytes32,address)", +"2f274d91": "buyVotes(uint8)", +"2f2769d1": "assertEq(address,address,string)", +"2f2770db": "disable()", +"2f278ecb": "reverseBytes(bytes)", +"2f27b556": "card_start_minamount()", +"2f29d8c5": "elapsed()", +"2f2b348d": "setBeneficiary1(address)", +"2f2bd5ac": "testTransferCorrectlySendsTokens()", +"2f2c00f3": "PTMCrowdFund()", +"2f2d783d": "claimReward(address,address,uint256)", +"2f2d783e": "rewardRoto(address,bytes32,uint256)", +"2f2d9109": "changeAirdropTotalQty(uint256)", +"2f2dc6e2": "setCardsCount(uint256)", +"2f2e2d7f": "fstUnitPriceDenominator()", +"2f2e3cea": "userDividendsWei(address,address)", +"2f2ebe41": "setToken4Gas(uint256)", +"2f2f010c": "OCLotteryContract()", +"2f2f20c1": "INCH()", +"2f2f4859": "helloworld()", +"2f2f4a63": "buyWorldCupTeamToken(uint256)", +"2f30283e": "testSomething()", +"2f3085d6": "LEGAL_EXPENSES_TOKENS()", +"2f30c6f6": "set(uint256,address)", +"2f30cd5f": "addLockAddress(address,uint256)", +"2f310bad": "redeemToken()", +"2f318039": "isTransferable(address,address,uint256)", +"2f32013d": "Kolidat()", +"2f330041": "transfers(address,uint256[])", +"2f334131": "lastAddYear()", +"2f334652": "teamClaimed()", +"2f335a6a": "getTitulaire_Compte_9()", +"2f3423b8": "grantTokenStartNow(address,uint256,uint256,uint256)", +"2f347e48": "DigitalTicks()", +"2f34adb4": "airdropNum2()", +"2f34c645": "endBounty(address)", +"2f35a71e": "Blockchain()", +"2f366637": "buyTickets(uint256)", +"2f36cacf": "dispute(uint256,uint256[])", +"2f377902": "CandyDropOpen(bool)", +"2f379fc8": "isInStage2()", +"2f381df0": "London()", +"2f38262a": "GetBankBalance()", +"2f384523": "removeFunds(uint256)", +"2f386a8e": "sellingDisable()", +"2f38b55a": "_checkDetail(uint256,uint8)", +"2f39bf80": "LirkToken()", +"2f39f5cd": "PresaleMarket(address)", +"2f3a212e": "test_oneValidEqUint2()", +"2f3a26ee": "TransferTimeSet(uint256)", +"2f3a77fd": "narrowRoundPrizeView(uint256)", +"2f3b24d2": "GenesisManager(address,address,address,address)", +"2f3b5603": "setPayoutLimit(bool)", +"2f3c8bd1": "returnTokenBalance(address,bytes32)", +"2f3d8035": "grantVestedTokens(address,uint256,uint256,uint256)", +"2f3e5408": "takerFeePercent()", +"2f3e9bc5": "canSelfDestruct()", +"2f3f2092": "ARIONTOKEN()", +"2f3f234a": "RLCSentToETH()", +"2f3fecaa": "startOffering()", +"2f3ff501": "getDynamicElementAt(uint256)", +"2f401300": "EPAchain()", +"2f405bb7": "getCoversForPacks(uint256[])", +"2f408990": "testAccessPermissions()", +"2f430e17": "approveTx(uint8)", +"2f434748": "setMintAndBurnOwner(address)", +"2f443315": "get_liquidity_account(address)", +"2f443785": "ComputeAcornCost()", +"2f455d51": "changeRate(uint8)", +"2f45aa21": "getblockRevenuePerTicket(uint256)", +"2f4675cd": "OranguSale(uint256,uint256,uint256,uint256,uint256,address,address,uint256,uint256)", +"2f46b3cc": "getMyReport(bytes32,bytes32)", +"2f46ba70": "DAOToken(string,string,uint256)", +"2f4736da": "_canTransferBatch(uint256)", +"2f47571f": "isCapabilityPublic(address,bytes4)", +"2f475c32": "withdrawPart(address,uint256)", +"2f482935": "SFTToken()", +"2f48ab7d": "usdt()", +"2f48c4aa": "setFoundersTokensWallet(address)", +"2f48f151": "addFee()", +"2f4a81df": "howManyOwnersDecide()", +"2f4c0b08": "joinGreatHarmon(string,string)", +"2f4c3a84": "transferPlayer(uint256)", +"2f4cf60f": "MultiSigWalletWithTimeLock(address[],uint256,uint256)", +"2f4e32f5": "FlexiERC20Token()", +"2f4e4c27": "ErrorContract()", +"2f4ea4ee": "release_1()", +"2f4ee5d4": "registerThrone(bytes,uint256,address,uint256,uint256)", +"2f4f3316": "isInstantiation(address)", +"2f4fda30": "BIG_NUMBER()", +"2f512b6b": "LomeliMultilpleTokens()", +"2f520081": "setPurchaseTimestamp(uint32,uint64)", +"2f53cc96": "CHINESE_EXCHANGE_3()", +"2f53e929": "emitBurn(address,uint256,string)", +"2f540d94": "BONUS_MID()", +"2f54a61e": "setClaimerForTile(uint16,address)", +"2f54bf6e": "isOwner(address)", +"2f553d31": "isCreated(bytes32)", +"2f554288": "listPrycto2()", +"2f554d53": "agreeFromPod()", +"2f5552f5": "KAL6Token()", +"2f55745b": "getPendingCrateForUserByIndex(address,uint256)", +"2f558ba0": "setFinish(uint256)", +"2f55f125": "decreaseAllowanceOrEmtpy(address,uint256)", +"2f56dc5f": "prepareContinuousPurchase()", +"2f570a23": "test(bytes)", +"2f576f20": "doNothing()", +"2f581480": "CandyCoinBigBang()", +"2f5867b3": "changeRates(uint8,uint256)", +"2f58768f": "contractors()", +"2f591a6a": "setRateForTransaction(uint256,address,uint256)", +"2f593404": "payoutCycleInDays()", +"2f597e71": "testLongInput()", +"2f598404": "getCatDetails(bytes5)", +"2f599242": "getEvaluationByStudentID(uint32,uint64)", +"2f5a5c5b": "timegame()", +"2f5bb661": "getNextVestingEntry(address)", +"2f5c3102": "Make_Deposit()", +"2f5c5a08": "setEthealToken(address,address)", +"2f5d3916": "testControllerApproveTriggersEvent()", +"2f5e80c3": "withdrawToken(address,uint16)", +"2f5e8d29": "setDAIRate(uint256,uint256)", +"2f5ebbaa": "marketState(address,uint256)", +"2f5f3b3c": "pointer()", +"2f605106": "getSponsor(uint256,uint256)", +"2f6113dc": "assignICOState(address,uint256,uint256,uint8)", +"2f6174ef": "getSig(bytes,uint8,bytes32,bytes32)", +"2f62a6ff": "fipsRegister(uint256,address,bytes)", +"2f634a90": "getOwner(address,uint256)", +"2f635c6a": "VolumeImbalanceRecorder(address)", +"2f63e2fa": "_incrementTokenBalance(uint16,uint16,uint8,address,uint256)", +"2f640a09": "setConfirmer(address)", +"2f646bd5": "ArmMoneyliFe()", +"2f65142c": "getTransfers()", +"2f653279": "getReceivedTrade(address,uint256)", +"2f658c3f": "Raffle(uint256)", +"2f65be54": "transferBonusEarnings()", +"2f65e086": "NardoTest1()", +"2f661946": "cliffPeriod()", +"2f668c5c": "etherFeeMin()", +"2f66d5a7": "KPOP_ITEM_CONTRACT_ADDRESS()", +"2f6701b0": "withdrawalList(bytes32[],address)", +"2f674ab9": "maybeUpdate()", +"2f677038": "grantUserRole(bytes32,string,address)", +"2f67cf56": "eth_fallback(address,bytes)", +"2f684b83": "addDecimals(uint256,uint256)", +"2f695053": "getCertifierAtIndex(uint256)", +"2f69ca13": "createCounts(bytes32,address)", +"2f69f161": "getGameResultPrice(uint256)", +"2f6a638b": "GetMaxEther()", +"2f6a6e20": "calculateMaxEggG0(uint64)", +"2f6ae467": "transferDocument(bytes,address)", +"2f6b7bbd": "Gubberment()", +"2f6b8143": "wethBalance()", +"2f6b9099": "completeOrder(address,address,address,address,bytes32,uint256)", +"2f6c493c": "unlock(address)", +"2f6dc6b3": "removeBorrowingOfferItem(uint256)", +"2f6e2711": "Int256Oracle(int256)", +"2f6e931f": "changeBurnPausedTime(uint256)", +"2f6f1c68": "speciesSymbol(uint256)", +"2f700fb6": "autoJudge()", +"2f70197c": "_getBalanceFactor(bytes32)", +"2f7146cc": "setLockingTimestampFromTo(uint256,uint256)", +"2f71d022": "updateTokenInfo(string,string)", +"2f723c7f": "RewardHoDLers()", +"2f72d697": "GCOXOWNToken(string,string,uint8,uint256)", +"2f72ffaf": "getEmployerContractsByStatus(address,address,uint256[],uint256[])", +"2f73010a": "ratePerWeiFirstPhase()", +"2f7359a3": "TOKEN_STANDARD_ERC223()", +"2f73ef91": "getFundsWalletBalance()", +"2f743591": "burnFinished()", +"2f7442bb": "transferBounty(address,uint256)", +"2f745c59": "tokenOfOwnerByIndex(address,uint256)", +"2f75a929": "extractRepository(string)", +"2f76c31d": "roundTwoLimit()", +"2f77428e": "collectdustatcontract()", +"2f774e44": "getMsgSigner(bytes32,bytes)", +"2f77688b": "TestingUseCoin(uint256,string,string)", +"2f77dba4": "tokenPerEther()", +"2f781228": "IjasCoin()", +"2f781393": "setDiscountStep(uint256)", +"2f782b32": "weiContributed()", +"2f78bab1": "LockDiv(address,uint256)", +"2f78dc14": "ErrMsg(address,string)", +"2f7907e4": "calculateBestPrecision(uint256,uint256,uint256,uint256)", +"2f7981c2": "getWealthOfUser(address,address)", +"2f798500": "clockAuctionStorage()", +"2f7a163b": "nearestKnownBlockHash()", +"2f7a407b": "exchangeFormula()", +"2f7a7192": "capFiat()", +"2f7b3677": "getMetadataUrl(uint256)", +"2f7cdb0e": "DEV_DECIMALS()", +"2f7dbc9b": "fromInt256(int256)", +"2f7f3ecf": "findNextHour(uint256,bytes)", +"2f7f7f55": "approveFee()", +"2f80324c": "EURO()", +"2f8061d4": "repayment(address,uint256,address)", +"2f815ed1": "transferToContractCustom(address,address,uint256,bytes,string)", +"2f81bc71": "multiMint(address[],uint256[])", +"2f83e16d": "_allocateTokens(address)", +"2f83f781": "fetchSuccessfulSaleProceed()", +"2f851184": "H4DAddress()", +"2f85577f": "changeACAddress(address)", +"2f85f092": "destTokensAdvisors()", +"2f86282e": "CheckGameStart(bool)", +"2f865568": "liquidate(address)", +"2f869d26": "getAssetPoolAddress(address)", +"2f86f2ee": "MAX_OPEN_SOLD()", +"2f8803bb": "addressCOO()", +"2f885f79": "trakToken()", +"2f88ae5f": "setIco3Tokens(uint256)", +"2f899fec": "Pharmatron(uint256)", +"2f8a12fe": "setMsg2(string)", +"2f8abfbe": "roundIt(uint256)", +"2f8b023d": "allowedTransferFrom(address)", +"2f8b0250": "setEndTimeIcoStage1(uint256)", +"2f8bd891": "directMint(address,uint256)", +"2f8c239f": "giveAdvisers(address,uint256)", +"2f8c98c2": "flipMovingSwitchTo(bool)", +"2f8cfe0e": "deleteResources(address[],bytes4[])", +"2f8d2d19": "BurnAssignedFees(address,address,uint256)", +"2f8de810": "tokenPriceInWei()", +"2f8e7133": "lockBBK(uint256)", +"2f8eed98": "adminTransfer(address,uint32)", +"2f8f0c92": "canDeposit(bytes32,address)", +"2f8f175c": "seal(address,address,uint256)", +"2f8f8c0b": "approveCertificate(address)", +"2f8ffce8": "allItemsWrong()", +"2f9021fd": "withdrawToCooperate(address,uint256)", +"2f90daf4": "raisedForEther()", +"2f91822c": "ETHCollector()", +"2f91b591": "RemoveMinter(address)", +"2f923c59": "tokenCapForFirstMainStage()", +"2f926732": "register(bytes32,bytes32)", +"2f92acc5": "test_4_accessRestriction_execute_shouldThrow()", +"2f92b151": "HotLove()", +"2f92f5a0": "query1_fnc(uint256,string,string,uint256)", +"2f94afba": "cao()", +"2f94e335": "_createLambo(uint256,address,uint64)", +"2f95055e": "deleteHiddenPosition(uint32,int64[2],bytes16)", +"2f95b833": "requiredStackDepth()", +"2f969d43": "MAX_UNSOLD_RATIO()", +"2f977b3f": "newTask(string,string,uint256,uint256)", +"2f978ec0": "getProviderInfo(address,uint256)", +"2f98511c": "createHistory(bytes32,address,address)", +"2f991b5a": "hasMemberAccess(address)", +"2f99c6cc": "BENEFICIARY()", +"2f9a7c22": "TransferToWaves(uint256,string)", +"2f9a8bf2": "StreamerContractChanged(address,uint256)", +"2f9b3126": "founderShare()", +"2f9b4096": "removeExternalController(address)", +"2f9c1df6": "createDeposit(address,uint256,uint256)", +"2f9cb9aa": "getClosingTime()", +"2f9ffab9": "Airstayz()", +"2fa00e58": "fipsTransfer(bytes20,address)", +"2fa05208": "minimalGoalReached()", +"2fa06ff1": "exchangesLockEndingAt()", +"2fa07bfc": "_increaseApproval(address,uint256,address)", +"2fa146d8": "officialEmail()", +"2fa1df4f": "RIG()", +"2fa241fc": "playerBook()", +"2fa267fc": "ReadBible(uint16,uint16,uint16,uint16)", +"2fa26aaa": "minimalEthers()", +"2fa30d33": "calcResolve(address,uint256,uint256)", +"2fa3a41e": "testLowestTranch()", +"2fa3e006": "CreatedToken()", +"2fa49c06": "SetTxFee(uint256,uint256)", +"2fa4f694": "setAssessorPool(uint256,address,uint256)", +"2fa553d3": "sendMinerByOwner(address,uint256)", +"2fa5620a": "Mpay(uint256,string,string)", +"2fa61cd8": "generate(address)", +"2fa6512f": "clearWalletPending()", +"2fa69585": "strikeCall()", +"2fa78393": "returnUserBalance(address,address[2],uint256[7],uint8,bytes32[2])", +"2fa7cbfb": "getExecCost(uint256)", +"2fa80164": "AgruCoin()", +"2fa8591e": "TACTICALCRUISER()", +"2fa92dde": "jackpotConditionPercent()", +"2fa94fb3": "teamTrustAccount()", +"2fa975c5": "seatsList(address,uint256)", +"2fa99791": "completeOrderBySafePeriod()", +"2faa2998": "startICO_20_December()", +"2faa3014": "uintFunc(uint256,uint256)", +"2faa5e3c": "changeMerchantAccount(uint256,address)", +"2faa9bbb": "LockClaimed(address,uint256)", +"2faad46f": "addAllowedTransactor(address)", +"2fab662a": "_decreaseMintApprovalAfterMint(address,uint256)", +"2fabc174": "multFracCeiling(uint256,uint256,uint256)", +"2fac1a54": "newOrder(bool,uint256,uint256,uint256,uint256)", +"2fac1d36": "isReadyFor(address)", +"2facc4e8": "depositGovernance(uint256,address)", +"2faccbeb": "changerProprio(address)", +"2fad380d": "burnWithDecimals(uint256,uint256)", +"2fae43dc": "m_ETHPriceLowerBound()", +"2faebb20": "getBettersArrayLength()", +"2faef47a": "AbcToken()", +"2faef4e5": "getGranteesSize()", +"2faf1895": "saveContractEvent(string,string)", +"2faf9a93": "checkUnsold()", +"2fafb11d": "get_profit_by_roll_under(uint256,uint256)", +"2fb07482": "restoreWebGift(address)", +"2fb131d4": "preicoClosed()", +"2fb1746d": "turnOnTradable()", +"2fb1b25f": "sign(uint256)", +"2fb22cfa": "ECO_SYSTEM_STAKE()", +"2fb260f6": "EthertokenDelta(address,address,address,uint256,uint256,uint256)", +"2fb27669": "preSaleComplete()", +"2fb2a061": "rateForDays(uint256)", +"2fb2bcf4": "postTwit(string)", +"2fb2f3dd": "updateFrozenToken(address)", +"2fb556f7": "tokenNeedForBonusLevel0()", +"2fb565e8": "update(uint256,uint256)", +"2fb5b5f6": "setNextSnapshotBalance(address,uint256)", +"2fb61f7d": "dispute(address,bool,uint256)", +"2fb767c5": "failSubtractWhenALessThanB()", +"2fb840f5": "transferFrom(bytes32,bytes32,uint256)", +"2fb88284": "parseRLPHeader(bytes)", +"2fb9d203": "VoteSubmitted(address,bytes8)", +"2fbaba26": "setHash(uint256,string)", +"2fbac05c": "transferManagment1(address)", +"2fbbc9c9": "calcCoinsReceived(uint256)", +"2fbbde2d": "buyDrago()", +"2fbc0bf1": "getSalePrice()", +"2fbc2449": "COLETOKEN()", +"2fbc8353": "ownerCanBurn(bool)", +"2fbcf568": "getCurrentCryptantFragmentPrice()", +"2fbd2134": "_migrateExpiredCrates()", +"2fbd2432": "transferExternalToken(address,address,uint256)", +"2fbebd38": "foo(uint256)", +"2fbf6f73": "TRNDToken()", +"2fbfbc85": "PETTCOIN()", +"2fbfc252": "changeTeamETHAddress(address)", +"2fbfc376": "HRY(uint256,string,string)", +"2fbfe951": "change_min_amount(uint256)", +"2fbfeba9": "getTokenAddressByName(string)", +"2fc0aad3": "isNumericString(string)", +"2fc15517": "kelly()", +"2fc17e40": "TdeStopped(uint256)", +"2fc17f8b": "setCompte_3(string)", +"2fc35948": "SCWhitelist()", +"2fc3f13f": "WindowPeriodClosed(address,uint256)", +"2fc4eea0": "removeName(bytes32)", +"2fc516e3": "COMMON_BUDGET_AMOUNT()", +"2fc52220": "setPOOL_edit_19(string)", +"2fc5a8ec": "Joules()", +"2fc60405": "TANK_TYPE()", +"2fc64ff7": "organizer8()", +"2fc6e8b7": "isEnd()", +"2fc71565": "setMarketplaceAddress(address,address)", +"2fc761a6": "createItem(uint256,string,address,uint256,uint256,uint256,uint256)", +"2fc77d85": "TotalETHGivenToNorthPole()", +"2fc8124d": "setSecondWallet(address)", +"2fc84de8": "XCTToken()", +"2fc8c39d": "TADPOLE_BASE_REQ()", +"2fc94ba6": "getAddressArrayLength(bytes32)", +"2fc9a415": "_emitAccessGiven(address,bytes32)", +"2fca3b0d": "TBECrowdsale()", +"2fca5414": "isTAO(address)", +"2fcaa8fa": "removePresaleHolder(address)", +"2fcb20e9": "changeReserveTeamRecipient(address)", +"2fcb6628": "_stringGas(string,string)", +"2fcd410a": "MiniPoolEdit_2()", +"2fcd6075": "BlocktekUniversity(address)", +"2fcdeba1": "fund_owner()", +"2fce1291": "EcroContract(uint256,uint256,uint256,uint256,uint256)", +"2fce1b7a": "GetSocioFromCuenta(address,address)", +"2fcf84bf": "getEthereumFromPreIco()", +"2fd0f37e": "claimConsolationPrizeLoot(uint256,address)", +"2fd1b320": "myMostRecentAssignedAudit()", +"2fd23817": "MFTU()", +"2fd3bd2e": "passFoundation()", +"2fd3dee8": "testDisputedValidMemoryAccessSequence()", +"2fd3fc9d": "bthFoundationWallet()", +"2fd463e1": "STARTMETADOLLAR()", +"2fd47643": "getRoundIssued()", +"2fd4ec28": "terminateIco()", +"2fd4f2f9": "changePreICODates(uint256,uint256)", +"2fd55265": "depositToken(address)", +"2fd5a13d": "GetClientCategory()", +"2fd5ecda": "b66AdvisorFundDepositAmt()", +"2fd61f92": "unstakeEther(uint256)", +"2fd6d40b": "getBetValueByGamble(uint8)", +"2fd949ca": "terminateContract()", +"2fd95a6f": "createGen0(uint256,uint256,uint16,bool)", +"2fd97c7d": "AllotAward()", +"2fda7166": "stopReceiveTicket()", +"2fdadc21": "sendtoA(uint256)", +"2fdae3c5": "addProposal(string)", +"2fdaf6af": "claim_tokens(address,uint256)", +"2fdb3e6c": "getBalanceETH(address)", +"2fdbb3d4": "cumAcceptedDeposits()", +"2fdc505e": "mine(bytes32)", +"2fdcfbd2": "sendToken(address,address,uint256)", +"2fdd653e": "getFortune(uint256)", +"2fdde1d4": "setUseTimeBasedBonus(bool)", +"2fddf859": "getLockedTokens_(address)", +"2fdeca37": "DEFAULT_TEXT()", +"2fdf15d5": "usernameToAddress(bytes32)", +"2fdf795a": "BOUNTY_TOKENS_PERCENT()", +"2fdfd2ae": "checkSecret()", +"2fe045fa": "initiateClaimDelegated(string,bytes32,uint8,bytes32,bytes32)", +"2fe1c0f8": "tokenTransfer(address,uint256,address[])", +"2fe20e94": "totalRestrictedTokens()", +"2fe29c78": "auctionIdToSeller(uint256)", +"2fe45a8d": "RetailSale(address,address,address,uint256,uint256,uint256,uint256)", +"2fe4b2d9": "submitSteak(address,address,bytes32)", +"2fe55632": "NexxusToken()", +"2fe69430": "TokenERC20(uint256,string,uint8,string)", +"2fe6a47c": "largestPro()", +"2fe6ecb2": "PHASE3_SUPPLY()", +"2fe71915": "request(uint256,address,address,bool)", +"2fe7a0bd": "burritoData(uint256)", +"2fe8ace3": "changeSuperOwnership(address)", +"2fe9541f": "addIssueBounty(string,uint256)", +"2fe97e3a": "approveAndCall(address,uint256,string)", +"2fe9950e": "adminSetDuel(uint256,uint256)", +"2fe99bdc": "insert(string,string,string)", +"2fe9e1a9": "change_address(uint256,address,address)", +"2fe9f821": "startRefunds()", +"2fea0c40": "revealBid(bytes32,uint256,address,address,bytes32,uint256,uint256)", +"2fea6915": "weiReqFund()", +"2fea7b22": "GetIndex(uint256,uint256,uint256)", +"2fea7b81": "getIdentity(address)", +"2fea9624": "DepositorsQty()", +"2feceb46": "extend_end_block(uint256)", +"2fed3c9e": "VoteCast(address,uint16)", +"2fed7da0": "getNextBackUserId()", +"2feda2fa": "POI()", +"2fee26ce": "addApp(address,uint32,uint32,string)", +"2feee782": "YWBToken()", +"2feef2ec": "expectedAmount()", +"2ff077be": "updateBettingOpensTime(bytes32,uint256)", +"2ff284c2": "computeFee(uint256,uint256)", +"2ff2e9dc": "INITIAL_SUPPLY()", +"2ff36e9b": "BTHBCoin()", +"2ff420ef": "CHF_CENT_PER_TOKEN()", +"2ff42757": "approveAndCall(address,address,address,uint256,bytes)", +"2ff4f24e": "createLoveStory(bytes16,bytes32,bytes32,uint256)", +"2ff50b51": "modifyEscrowPrice(uint256,uint256)", +"2ff59dec": "getEthartRevenueReward()", +"2ff59ee7": "miningIncentiveWallet()", +"2ff5e00c": "setAttaccContract(address)", +"2ff5ec3f": "armyTanksCount(uint256)", +"2ff6c55f": "DEVELOPMENT_FUND_LOCK_TIMESPAN()", +"2ff6fe76": "priceToken()", +"2ff76163": "getAdres(uint16)", +"2ff7a81f": "getAvgReportingGasPrice()", +"2ff92323": "oraclize_query(uint256,string,string[4])", +"2ff98d53": "getStageClosingTime(uint256)", +"2ff9b03a": "hackDecisive(address,uint256)", +"2ff9f017": "exchangeNominsForHavvensAtRate(uint256,uint256)", +"2ffa815b": "changeHouse_and_Owner_Addresses(address,address)", +"2ffb054e": "setMarketplaceManager(address)", +"2ffb8631": "getReleaseLockfileURI(bytes32)", +"2ffb9e64": "updateGasForXaurData(uint256,uint256)", +"2ffbf988": "packedBytes(uint256)", +"2ffc7b7e": "firstDiscountPrice()", +"2ffda1e0": "setBlackflag(uint256,bool)", +"2ffda952": "walletWithdrawTokens(uint256)", +"2ffdaa44": "BDToken()", +"2fff7bb3": "assignMultirequest(uint256)", +"2fffaa00": "Kingdom()", +"2fffb3f9": "getLockFundsReleaseTime(address)", +"2fffe0dd": "rocketArrivalTime(uint256)", +"2fffee92": "setContingencyFunds(address)", +"30007ed3": "tgeStartBlock()", +"30008b48": "pullDividendPayment(uint256)", +"30012940": "checkTeamFreezePeriodOver(address,address)", +"300182b8": "sale1(address,uint256)", +"30021bae": "SubDiv(uint256)", +"300240d6": "MAX_REGULAR()", +"300309f0": "setUserPaybackRate(uint256)", +"30043d4e": "AddedToHolder(address,uint256,uint256)", +"3004ea88": "EOSDRAM()", +"30067bc8": "setRegistrationOpen(bool)", +"3006f513": "coinSendDifferentValue(address[],uint256[])", +"30073514": "_allocation(address,address,address,address,address)", +"30074c6c": "publicSaleRaised()", +"30092ded": "changeVoteWeight(address,int256)", +"30093319": "_setRevealsCount(uint256,uint256)", +"3009a265": "isReg(address)", +"3009bc01": "claimFreeDragon()", +"300a1a7f": "mixWithStringFunc(int256,string,bool,string)", +"300a246f": "can_get(address,bytes12)", +"300a411e": "getRecording(address,uint256)", +"300abd61": "m_numMembers()", +"300ac0e9": "priceTimeToExpiration()", +"300b59da": "initTokens(address[],uint256[],bool,bool)", +"300ba0ec": "prevTweetTime()", +"300ba8ab": "_decode()", +"300c229f": "changeMaxDepositAmount(uint256)", +"300c3091": "setMigrationContractAddress(address)", +"300c7063": "SbToken()", +"300cc37a": "paySomeRewards(uint32,uint32)", +"300d55a5": "transferAdvisor1Tokens(address,uint256)", +"300d9e90": "icoOver3()", +"300e4b3c": "setminprice(uint256)", +"300e7b2d": "firstAuctionsExtendedDuration()", +"301058c9": "DURATION_PRESALE()", +"30106b17": "calckeys(uint256)", +"3010b5cd": "clearWizzType(uint256[2])", +"3010f39d": "playersToBetIndices(address,uint256)", +"3011b4c2": "CreateARTL(address,uint256)", +"30124349": "balanceLoc(address)", +"301249eb": "setPercentWeiMC(uint256)", +"3013ad89": "RangeToken()", +"3013ce29": "paymentToken()", +"30140053": "burnIcoTokens()", +"3015394c": "cancelRequest(uint256)", +"30155f5e": "setzAddress(address)", +"3015a521": "totalSignatures()", +"3016a439": "getImageBlurredAt(uint256)", +"3016e108": "removeGameMachine(address)", +"3017fe24": "callAPIVersion()", +"3018205f": "getController()", +"30183a2c": "GemstoneToken()", +"30184635": "getMinCap(address)", +"3018579e": "TokenSampleG()", +"30188fdf": "BFreeContract()", +"3018c90a": "getSubOrderStatus(uint256,address)", +"301997ae": "fundEscrow(address,uint256,uint256,uint256)", +"301a9b09": "startPhase(uint256,uint256,uint256,uint256)", +"301b7a86": "inquire_totdomains_amount()", +"301b9307": "getABsort()", +"301c42d7": "issueRateDecDuringICO()", +"301cbcb3": "STARTING_RICE()", +"301cf6e7": "payoutsPaused()", +"301d5209": "delegatecall_selfdestruct(address)", +"301d5eda": "change_start_block(uint256)", +"301dd027": "TIER_2_CAP()", +"301df7ab": "_create(address,uint256)", +"301ea971": "lockReleaseDate1Year()", +"301ecf82": "_createEtherBro(uint16,address)", +"301f0464": "ratePerEthPhase3()", +"301f2dac": "getRegionPrice(uint16)", +"301f93e0": "calculateEthereum(uint256)", +"301fbdef": "totalWeiToBeDistributed()", +"301fdb54": "getPayouts(int32,int32)", +"30203994": "stage2_price()", +"3020a18e": "setSaleEnabled(bool)", +"3020ea8a": "retrieveEarnings()", +"3020fc3b": "sendIPFS(address,address,string)", +"302155e5": "CHAToken()", +"30223c12": "del_product(uint256)", +"30226121": "CCXCrowdsale(address,address)", +"30228a12": "YouAreRichToken()", +"30230796": "setTradeABIHash(bytes32)", +"30231ea4": "canRenounce()", +"30232cb0": "buySeele(address)", +"3023641d": "removeTokenGrant(address)", +"30238687": "ALLOC_NEW_USERS()", +"3023d0c4": "Ethstick()", +"302579c6": "getWarlordChestPrice()", +"30257bf7": "getByAddress(address)", +"3026a128": "LOG_InvestorExit(address,uint256)", +"3026aedf": "getTopBidders()", +"30288f03": "setFile(string,string,uint256,string)", +"30289c61": "getDetails(address)", +"3029300f": "nextSellTime(address)", +"3029948a": "phase_2_bonus()", +"3029ba69": "withdrawBountyTokens(address,uint256)", +"302a4100": "decayedTransferFrom(address,address,uint256,address)", +"302a7ff3": "getDAdmin(bytes32)", +"302bcc57": "playerCount()", +"302bda24": "getSell(uint256,address,address)", +"302c46ba": "ReleaseTokenForTeamAdvisersPartners()", +"302cc9c3": "setroommoney(uint256)", +"302d350e": "firstChainedCallback(uint256)", +"302dfe97": "commissionPer()", +"302eb389": "transferFund()", +"302f3915": "LockFunds(address,uint256)", +"302f4303": "setRandomGenerateMethod(uint8)", +"30311898": "Account(address)", +"3032236f": "depositAndVest(address,uint256,uint256,uint256,uint256)", +"30322b12": "weiForMcr()", +"30323542": "_delOwner(address)", +"30324370": "fetchOrderByIdWithPayer(string)", +"30324f55": "DutchAuctionToBuy(address,address,address)", +"30326c17": "proposal(uint256)", +"3032f951": "advisorsBalanceMap(address)", +"30332aea": "P2()", +"3033f4d3": "pastOneHour()", +"30347537": "STARTING_CAT()", +"30366d5f": "getEventsCount()", +"3036d769": "minGasPriceGwei()", +"3037408d": "balanceOfAtTime(address,uint256)", +"3037801e": "recordNum()", +"3037cea3": "knownRoleNames(bytes32,bytes32)", +"3037e694": "disburseDividends(uint256)", +"30381f5f": "getHistoricalDelegation(uint64)", +"30389c45": "round1BonusSteps()", +"3038e357": "returnTokensToContractFrom(address)", +"3039b1ce": "changeETHLockingAddr(address)", +"3039e6f9": "CHARITY()", +"303a2372": "getDSP(address)", +"303a36e2": "getRow(uint256)", +"303a88b4": "convertRate(address,bytes32,bytes,uint256)", +"303b069f": "enableEmergencyWithdrawals()", +"303b5d3b": "toInt(string)", +"303b8144": "MobilinkToken()", +"303b9379": "SetLogFile(address)", +"303bef74": "deleteAllMessages(address)", +"303c2569": "payRakeInternal(address,uint256)", +"303c7d69": "allocatePrivateSaleTokens(uint256,uint256,uint256,address[],uint256[])", +"303d0870": "limitForChecklistId(uint8)", +"303e74df": "descriptor()", +"303ed73a": "setSkills(address,uint256,uint256[])", +"303ee989": "isPendingDeregistration(address)", +"303f5f51": "LEGEND()", +"303ff1d8": "YDTC()", +"30406423": "payJackpot()", +"30411a27": "testAddGains()", +"3041ba2a": "setForecasting(address)", +"3042b17d": "setUmkaAddress(string)", +"304318d3": "editDuration(uint256)", +"3043cbc5": "newTankType(uint256,uint256,uint32,uint32,uint32,uint32)", +"30443062": "penultimateFeePeriodStartTime()", +"3045a299": "Society(string,address)", +"3045aaf3": "Symbol()", +"3046868d": "AccountStructs(address)", +"3046fe26": "XulToken()", +"30473c2f": "getSelectedName()", +"30490e91": "processProposal(bytes32)", +"304a45c2": "getvalues()", +"304a87b7": "setOpenGroup(uint256)", +"304ab76a": "DebtTokenCreated(address,address,uint256)", +"304bac6f": "func_0A6E()", +"304c69ed": "_packItemData(address,uint256)", +"304cb3d8": "setTrusted(address,address,bool)", +"304d50b2": "addStar(address,uint8,uint8,uint16,uint8,uint8,uint8,uint256)", +"304d95a6": "RefundPoll(address,address,uint256,uint256,uint256,bool)", +"304dd754": "IsActive()", +"304ddebe": "eventSetWinner(uint256,address,uint256)", +"304de747": "MARKET_CAP_PER_ROUND()", +"304dfd33": "_onRandomFailed(bytes32)", +"304e48bb": "LogFundingReceived(address,uint256,uint256)", +"304e6ade": "setContenthash(bytes32,bytes)", +"304f34a0": "splitBid(uint256)", +"304f5027": "myUserWallet(address)", +"304f8af4": "sendBountyTokens()", +"30500684": "addEarlyBird(address,uint256)", +"3050226a": "addTransferableAddresses(address[])", +"30507451": "receiveBonus()", +"305075db": "NormalizeRanks()", +"305094ab": "ispackagesaleClosed()", +"30509bca": "claimBalance()", +"3050caa4": "calculateStake(bytes8,bytes5)", +"3050f769": "transactionsClaimed(uint256)", +"3052b75e": "changeEndTime(uint256)", +"3053aedc": "capDoublingTimestamp()", +"3054c79a": "transform()", +"3055e5e8": "JEMBUT()", +"30573dfa": "auditGuess(uint256,string,uint8,bytes,uint256)", +"305788fa": "newTransferProposal(address,string)", +"3057d5e0": "residualAmountPromille()", +"305876a7": "isRoundOver()", +"305939b0": "setReceiptAsset(address,address)", +"305997c8": "addIsSafe(uint256,uint256)", +"30599ba7": "SOSBOTTOM()", +"30599fc5": "recoverTokens(uint256)", +"3059ac30": "Escrow(address,address)", +"305a67a8": "cancelListing(uint256)", +"305a762a": "getTicketsCountByBuyer(uint256,address)", +"305a99c1": "Kemonocoin()", +"305b73d9": "configure(address,address,uint256,uint8,bytes32,bytes32)", +"305bcfab": "TrustlessTransaction_Protection_Seconds()", +"305d6d31": "stopFundRaising()", +"305e3552": "eggPrice()", +"305eae79": "updateBusinessWallet(address,address)", +"305ec69e": "finish(address)", +"305ed015": "giveReward(address)", +"305f17d5": "setCrydrController(address)", +"305fcef3": "decide()", +"306023a3": "allocateTeamTokens()", +"3061d568": "GOC()", +"3061e0ef": "changeRecovery(address,address,address)", +"3062cd8a": "purchaseETH()", +"30630699": "testDisputedWriteDifferentValueInState()", +"306387a4": "dealStatus(uint256)", +"3064061b": "checkNotSmartContract(address)", +"3064448e": "ASCCToken()", +"30659e74": "moneyBack()", +"3065a575": "setAElfDevMultisig(address)", +"3065d22c": "setVariationProbably(uint256)", +"30677b83": "multiplierFactor()", +"306781c1": "getCurrentPayoutBlock()", +"3068bffd": "grantIssuer(address)", +"30690468": "atleastZero(int256)", +"306a2ea8": "disapproveUser(address,bytes32)", +"306a401d": "delMarketMakerAddress(address,address)", +"306a8589": "p_update_mNewPlotTaxPercent(uint256)", +"306ab1ba": "forwardFundsAmount(uint256)", +"306ae57b": "standAndRebet(uint256,uint8[],bytes32,uint8,uint8,bytes32,bytes32,uint256,bytes32,bytes32,bytes32)", +"306b031d": "getGenerationEndAt(uint256)", +"306b0d84": "SetSharedStorage(address,address)", +"306b4dea": "addQuantityListItem(bool,address,address,uint256,uint256)", +"306c4ebe": "getCurrentTrancheVolume(uint256)", +"306c7290": "eth_balance()", +"306d4ed9": "userHasWithdrawn(address)", +"306df22d": "GPSDestination(int256,int256,uint256)", +"306e3e99": "COMPANY_SHARE()", +"3070352b": "buyAMI(string)", +"3070c38b": "checkTermination()", +"30710f01": "Crack(address,uint256,uint256)", +"30725c46": "_ownerOfPopInAnyPlatform(uint256)", +"3072cf60": "_initialized()", +"3073530b": "release_2()", +"3073c916": "cancelEscrowByProvider(uint256)", +"3073ef42": "calculateOperationFee(uint32)", +"307482cf": "POINT_ROOTNODE_ROLE()", +"3074cca7": "change_data(bytes32)", +"3074f556": "Compra_Ticket(uint256,uint256)", +"307540f6": "keys()", +"30756ab6": "MyTestToken()", +"3075f552": "getMax()", +"30762e2e": "allowManuallyBurnTokens()", +"30765517": "fechAllSumNumForCandidateByStage(uint256)", +"3076dc42": "intervalDuration()", +"3076e56a": "tankOut()", +"3077fdf1": "startNewICORound(uint256,uint256)", +"3078db6c": "transferAuthority(address)", +"307970b2": "addEntry(uint8)", +"3079ddc3": "isCanBuy()", +"307a1f46": "paramsValid()", +"307c6f8e": "job(string,string,uint256,uint256)", +"307c7a0d": "withdrawExcessBalance(address,address)", +"307ca045": "get_amount_minus_fee(uint256)", +"307d2a90": "priceEUR()", +"307e38ca": "isICAP(address)", +"307e8614": "returnUserBalance(address[2],bytes32)", +"307edff8": "endTokenSale()", +"307f35e6": "AobcToken()", +"307f6244": "changeMedia(address)", +"307f6b12": "findWinners(uint256)", +"30807e8e": "updateCSV(string,uint256)", +"3080b9c7": "SocialBlock()", +"30818189": "bonus1()", +"3082538f": "decimalMultiplier()", +"30835cc5": "BDCC()", +"3083a4f9": "withdraw_2()", +"3083ab1f": "closeContest(uint32)", +"30840c31": "testControlCreateWithParentForeignNotInUse()", +"3084e3ac": "nDEX(address,address,address,address,uint256,uint256,uint256)", +"30852db8": "newGame(uint256,uint256,uint256)", +"30859963": "getAttrVal(uint64,uint8)", +"3085c91d": "SellOrderCanceled(uint32,address)", +"30865362": "withdrawRemainingRewards()", +"308655b1": "A2AToken()", +"3086719a": "_setTokenUri(uint256,string)", +"3087110a": "donors()", +"30880441": "borrowFor(address,address,uint256)", +"308879bf": "setVoteCost(uint256)", +"308a9717": "_distribute(address)", +"308af165": "lastProcessedDay()", +"308b2fdc": "getProposalValueByIndex(uint256)", +"308b7fea": "rakeToken()", +"308c0065": "currentPrice(uint32)", +"308d6613": "getSignData(uint256,uint8)", +"308dc720": "DissolveBusiness()", +"308dccac": "EtherMinerals()", +"308e1b2f": "ltcId()", +"308e25ac": "InvestorsToken()", +"308e63f4": "TigerToken(uint256,string,string)", +"308f505b": "sellSupply()", +"308fb3ee": "GrapeToken()", +"3090bef7": "releaseLockedBalance(address)", +"3091bc8b": "acceptAndPay(bytes32,uint256[],uint256[],uint256)", +"30920505": "createInvestContract(address,uint256,uint256)", +"3092afd5": "removeMinter(address)", +"3092e73f": "getNoOfTokensTransfer(uint32,uint256)", +"30935e4b": "LogOrderCancel(address,uint256,uint256)", +"309424fe": "get_all_names()", +"30943fcf": "ownerCounter()", +"30945443": "update(address,string,string)", +"309593ee": "emergencyThaw()", +"30962d4d": "KyberContirbutorWhitelist()", +"309652ec": "getPoolMoney()", +"3097324c": "saleShare()", +"30977ab8": "recordMove(address,address)", +"3097f94c": "blok()", +"30982855": "setPublisherStake(bytes32,uint256)", +"30986dea": "timeToFinishPresale()", +"3098d33a": "payoutPartners()", +"309945ba": "collectedFees(uint256)", +"30996897": "placeBet(address)", +"309ab7e1": "getIsParticipate(address,uint256)", +"309b40b2": "liquidityStatus()", +"309b7ed3": "deleteParent(uint256)", +"309ba120": "upgradeClass(uint256)", +"309bdcf7": "createContract(uint256,string,string)", +"309c1769": "ProspectorsObligationToken()", +"309c315d": "calcTokenPriceFactor()", +"309c3ee2": "_grandPVPWinnerReward(uint256)", +"309d094b": "RELEASE_DATE()", +"309d6669": "addVerification(address,string,string)", +"309d8210": "ICOPart()", +"309d9358": "XENTToken()", +"309e078a": "destTokensBounties()", +"309e21a9": "rewardPromille()", +"309e36ef": "getNumberOfAccounts()", +"309e6005": "batchTransferEther(address[],uint256)", +"309e63e5": "SimpleConstructorInt(uint256,uint256)", +"309f7421": "buildTeamMapping(string,string,string)", +"309f955a": "updateTopicDescription(bytes15,bytes32)", +"309fcbdd": "MakeTradable(bool)", +"30a0b231": "oraclize_query(uint256,string,bytes[])", +"30a1d746": "shareholdersWalletAddress()", +"30a24abd": "create(bytes4,bytes)", +"30a3160d": "approveInternal()", +"30a35ce2": "getPOOL_edit_20()", +"30a39d5d": "preCoinSentToEther()", +"30a3ce81": "getNumChips()", +"30a55316": "smsCertifier()", +"30a65fdf": "set_buyPriceEth(uint256)", +"30a69955": "setFeeInfo(string)", +"30a69b53": "PlutocracyAchieved(string,string)", +"30a7351c": "removeFromApprovedAddress(address)", +"30a7a11c": "setRateEarlyStage1(uint256)", +"30a8b2c9": "NUM_TEAMS()", +"30a95aa7": "payService(address,uint256,uint32,string,uint64,uint64,uint64,uint64,uint64,uint64)", +"30a95e67": "withdraw_eth(uint256)", +"30a9ef5b": "checkTokBalance(address)", +"30aa311a": "QMQCoin()", +"30aa81c6": "getPayer()", +"30aacc0a": "setProjectAgent(address)", +"30ab0a16": "setInstructor(address,address,string,string)", +"30abac7b": "randomNext(uint256,uint256)", +"30abf433": "signBBODocument(bytes32,bytes)", +"30ac3052": "sendText(string,string)", +"30ac324b": "apply(uint256,uint256)", +"30acd249": "oneEtherInKicks()", +"30aceb89": "validateRequestParams(address[3],address,uint256[11],uint256,bytes,uint256)", +"30acedf1": "ownerFreezeTokens()", +"30ad12a6": "initializeFundraiserToken(address)", +"30adce0e": "etherReceived()", +"30ae8d0c": "Xinfin()", +"30af41b3": "getValidatorByIndex(uint256)", +"30b0e001": "airdropTokenDistribution(address,uint256)", +"30b0faab": "changeSettings(uint256,address,uint256)", +"30b2b8aa": "mintPresaleTokens(address,uint256)", +"30b3409e": "getInitialDeposit()", +"30b39a62": "withdraw(string,uint256)", +"30b3a90c": "_setCurrentPassportLogic(string)", +"30b4429e": "submitBlock(uint256,bytes)", +"30b5198f": "blockNumberUpdated()", +"30b57b1e": "player(bytes32)", +"30b66475": "VerifSignature(bytes,bytes)", +"30b66cee": "claimProxy()", +"30b69426": "calculate_eligible_token_balance(address,uint256)", +"30b7222f": "mintcoin()", +"30b751d9": "rivetzRelease(uint256)", +"30b823f7": "userGrowthAddress()", +"30b8f85d": "HSB()", +"30b9af98": "withdrawFunding()", +"30ba040a": "TOKENOMICX()", +"30ba2d4d": "eidooSigner()", +"30bb7499": "_batchActivenessUpgrade(uint256[],uint256[])", +"30bbb55e": "instructions()", +"30bd2ba9": "MassivelyMultiPlayerOnlineVideoGames()", +"30bd3eeb": "tokenRewards(address)", +"30bd60ef": "marginCall(bytes32,uint256)", +"30bdd344": "getPossibleWinAmount(uint256,uint256)", +"30bdf202": "RobinHood()", +"30be5990": "updateThirdChangeBlock(uint256)", +"30bf00cd": "mintFresh(address,uint256,int256)", +"30bf2d3e": "whaleBalance()", +"30bfeded": "EffectAdded(uint256,uint256[])", +"30c0f8d6": "scheduleTransaction(address,bytes)", +"30c2927d": "concludeUFT()", +"30c2fb04": "UserAuthManager(address)", +"30c308d8": "testInsertCase()", +"30c30a50": "authorizeMintFulfiller(address)", +"30c33da7": "_addPresale(uint256,uint256)", +"30c3eaa8": "grant()", +"30c47f77": "getEtherCoinPrice()", +"30c5375e": "ConstructHuntStart()", +"30c5a614": "ethereumToTokens_(uint256,uint256)", +"30c74e04": "tokenWithdraw()", +"30c8a488": "ERCToken()", +"30c8f372": "getTrustedShopCount()", +"30c93307": "GetPermissionIdx(uint256)", +"30c97068": "plockFlag()", +"30ca0a53": "DELEGATION_HASH_EIP712()", +"30cb14d2": "pop(bool)", +"30cc1d18": "airDropShadowTag()", +"30cc248e": "increaseProfit()", +"30ccc891": "testTransferHandlesNegativeAmountRequest()", +"30ccebb5": "getStatus(address)", +"30cd90b8": "transferToAddress(address,address,uint256,bytes)", +"30cd9ac6": "TokenAuctionCompleted(uint256,address,address,uint256)", +"30cdc195": "xclusivecoinSupply()", +"30cdcc63": "MAX_ISSUED_FROM_OTHER_CURRENCIES()", +"30cddc83": "checkIfCustodiesServedETH(address[])", +"30ce7b5d": "generateWinNumber()", +"30ce8bd5": "_rightChild(uint8)", +"30ced655": "EventRandomLedgerRevealed(address,uint256,uint256,uint256,address)", +"30cf7af6": "FreeZombieCount()", +"30cfac6c": "assignTo(uint256,address,uint256)", +"30d02d83": "batchWithdraw(uint256,uint256)", +"30d07d61": "getParticipantName(uint256,uint256)", +"30d12640": "disableWithdrawal()", +"30d15b0a": "lockInQuarterFinalPrize()", +"30d1c191": "MetaPoc(address)", +"30d2219b": "add(string,string,string,string,string,bytes32)", +"30d2474f": "buy1ticket()", +"30d281e0": "getChannelInfo()", +"30d323ae": "NHC()", +"30d4b967": "Octogram()", +"30d4d8d0": "_verifyHistoryInputOrRevert(bytes32,bytes32,bytes32,uint256,address)", +"30d500bf": "CFO()", +"30d636a0": "SmartVerifying()", +"30d65b72": "getPaymentsFor(address)", +"30d68214": "transactionReplay(address,uint256)", +"30d86516": "verifyTransferSignature(bytes32,address,uint8,bytes32,bytes32)", +"30d88a9e": "DISPLAY_VIDEO()", +"30d9161d": "cancelCreatorAuction(uint40)", +"30da4684": "buyPriceFinal()", +"30db7654": "activeBuy()", +"30dbb4e4": "isUnlocked(address,uint256)", +"30dce923": "getDeactivatedList(address)", +"30dcf0e8": "calculatedTokens(address,uint256)", +"30dd6a42": "totalSoldToken()", +"30dd9ee4": "confirmMinerQuest(address)", +"30de7e88": "FINXToken()", +"30df2c47": "currentSeller()", +"30df7727": "canRemove()", +"30dfc62f": "fundValueCount()", +"30dfe1da": "getTransactionCount(bool)", +"30e0789e": "_transfer(address,address,uint256)", +"30e07be0": "getMaxAmountToWager(uint256)", +"30e08a6e": "adjustMinter(address,bool,int256)", +"30e0f7e9": "setToppingUpBankroll(bool)", +"30e1e4e5": "freeze(address,uint256,uint256)", +"30e1f16f": "claimDividendAll()", +"30e26cb8": "disableBundling()", +"30e290e4": "Twitter()", +"30e34360": "setValue(bytes32,bytes15)", +"30e44278": "howVotesHasDispute(uint256)", +"30e45c14": "preSaleHasEnded()", +"30e4f9aa": "contractbalance()", +"30e57b67": "getNumberOfCrySolObjects()", +"30e5be52": "Prototype()", +"30e656d8": "addAnimal(uint256,bytes32,uint8)", +"30e6570b": "BucketSell(bytes32,uint256,address,uint256)", +"30e664f6": "getBuy()", +"30e6c333": "producedGoldCaps()", +"30e6d8d3": "addInitialInvestor(address)", +"30e7002c": "POCN()", +"30e76dae": "getContractEtherBalance()", +"30e77c75": "EthTranchePricing(uint256[])", +"30e804d1": "withdrawFromProject(address,address,uint256)", +"30e80864": "setTrustedAddr(address)", +"30e82803": "balanceOfByPartition(bytes32,address)", +"30e8b963": "reserveMember()", +"30e9c341": "updateTimeLock(uint256)", +"30e9f6ed": "STATUS_NO_DEAL()", +"30ea55a0": "updateEventStartsTime(bytes32,uint256)", +"30eaa9b5": "priceIncrease_20_February()", +"30eb4934": "_validateRefundTimestamp(uint256)", +"30eb4ba8": "setHoldDuration(uint256)", +"30ebf88c": "createGuess(uint256,uint256,string,uint8,uint256,uint256,uint256[],bytes32[],uint256)", +"30ec0e2b": "setHolder(address,address,address)", +"30ec98a1": "OKFToken()", +"30ece116": "setOpeningTime()", +"30ed54ed": "setVestingToken(address,address)", +"30ee776c": "StopTransferToken()", +"30ef3d56": "takeNumber(uint256)", +"30efac4e": "changeCardPrice(uint256)", +"30efb8d3": "doUnpause()", +"30f1154f": "updateNodeIPFSHash(bytes)", +"30f12642": "createContractPreciousForEdition(address,uint256,string)", +"30f1fe82": "checkLength(string)", +"30f20847": "CandyBox()", +"30f24455": "_getProductShopInfo(uint256)", +"30f3f0db": "increase(uint256)", +"30f46b70": "power(uint8,uint8,uint8,uint8[176])", +"30f4babb": "Fetch_User_Profile(uint32)", +"30f4f396": "UTBTokenTest(uint256,string,string)", +"30f4f4bb": "getMarketData(bytes32)", +"30f56d21": "RoundEndTime()", +"30f59c1b": "lastTicketBought(uint256)", +"30f6716f": "HFCoin()", +"30f6eb16": "mintedForAccountInBlock(address,uint256)", +"30f75890": "MilestonesEntity()", +"30f7cf80": "stox()", +"30f7f148": "ONEPAY()", +"30f857f3": "addPrivateSaleWithMonthlyLockup(address,uint256[],uint256)", +"30fa27cc": "_BTC()", +"30fa9ef3": "SantimentWhiteList()", +"30faa3e9": "compareHands(uint8,uint8)", +"30fb641b": "PurchaseFailed(address,uint256,uint8)", +"30fb6bfb": "setMessage(uint16,string)", +"30fb7541": "_createSkull(uint256,uint256,uint256,uint256,address)", +"30fba22f": "changeManipulatorAddress(address,bool)", +"30fbe411": "endIco3()", +"30fd300f": "registerBytes32(address,bytes32)", +"30fd7696": "createLoveStoryWithData(bytes16,bytes32,bytes32,uint256,string)", +"30fe86b7": "declarePulicOfferingPlan(uint256,uint256)", +"30fee9b1": "setICOtime(uint256,uint256)", +"30ff2ad5": "needVerifiedAccount(bool)", +"31002556": "getAmountToGive(bytes,uint256)", +"310092b9": "REFUND_TIME()", +"3100ef7b": "Fulcrum()", +"3101170b": "addPixelPayable(uint256,uint256,uint256,uint256,uint256)", +"31014853": "buySWL()", +"3101ab7f": "confirmEjectment()", +"3102b21a": "setAllocation(address[],uint256[])", +"3102be4c": "ownerHistoryOf(uint256)", +"3102deb7": "SetPlayerBetInfo(uint8,address,uint256,uint8)", +"3103fa26": "firePaidProposalEvent(address,uint256)", +"310441fa": "payees(address)", +"31047973": "lightpool()", +"3104b21a": "unApprove(address,uint256)", +"3106aa80": "getLLV_edit_21()", +"3106e50e": "joinBet()", +"3106fea0": "voteOnProposal(uint256,bool,uint256)", +"31076417": "setTokenUSDRate(uint256)", +"310774a3": "setContractPreICO(address,address)", +"310781e7": "LogCertificationDbRegistered(address)", +"310815ee": "setDesignatedReporterShowed(bool)", +"31085c5f": "getAddressByNickname(string)", +"31088032": "MTOKEN()", +"310883a8": "player2Timestamp()", +"3108bd87": "voteNoLockBatch(address[],uint256[])", +"3108f0d7": "isNotZero(uint256,string)", +"310b065b": "cerotest()", +"310bc5fc": "newAsset(uint256,uint256,uint256,bytes32,bytes32,uint256,bytes32)", +"310bd74b": "reset(uint256)", +"310c0c1e": "minRollUnder()", +"310c87cc": "NFTAddress()", +"310ce4e2": "execute(bytes32,address,int256)", +"310d3f69": "token_description()", +"310e5ce7": "isBreedingMarket()", +"310ec4a7": "setAllowance(address,uint256)", +"310efb48": "setResult(uint256,uint256)", +"310eff5d": "pageByGroup(string,uint256)", +"310f4cdd": "mint(uint256,string,uint256,uint256,address)", +"3110235a": "maxInvest()", +"311028af": "initialTotalSupply()", +"311104f3": "getMintRequestsLength()", +"31119b4d": "changeDeveloper(address)", +"3111dcfd": "_nextAmount(uint8,uint256,uint256,uint256,uint256,uint256)", +"311277c1": "PHASE3_RATE()", +"3112fb6e": "BackToLife()", +"311325bd": "totalPledgedFees()", +"31134651": "donateToLovers(bytes32)", +"311385f4": "oraclize_query(string,bytes[3],uint256)", +"3113b8fa": "initDebris(bytes32,uint256,uint8)", +"311515a3": "disableInterface(string)", +"311551ad": "_getCalculationStartDate(bytes32)", +"311551d7": "MasternodeMinedTokens(address,uint256)", +"31159923": "isAllocatedICO()", +"3115b4c4": "bulkStoreHeader(bytes,uint256)", +"3115c3ee": "exploreEMONTFee()", +"3115d2ce": "ZitKOIN()", +"31170c0e": "Joyso(address,address)", +"3117d6bb": "request(bytes32,string,string)", +"31184dc3": "get2(uint256)", +"3118879a": "removeSurvey(bytes32)", +"3118dc71": "aSites(uint256)", +"3119255c": "setMinBetPerTx(uint256)", +"31198d19": "transferEthFromContract(address,uint256)", +"311a6c56": "rule(uint256,uint256)", +"311a985f": "testNotEnoughMemory()", +"311b2e98": "totalBetsMade()", +"311bcda6": "stage1Sale()", +"311c2644": "ironTokensaleRunning()", +"311d5a2a": "recordBalance(address)", +"311fb64f": "countInvestorsRefunded()", +"3120cefa": "NickoinToken()", +"31212a6b": "unicornRanchAddress()", +"3121369d": "validateRequiredStackDepth(uint256)", +"3121c7c0": "buyMultiplier()", +"3121db1c": "setName(address,string)", +"312212c1": "stoptransfer()", +"312220bc": "payoutQuickBonus(address)", +"312253ae": "newOption(uint256,uint256,bytes32,bytes32)", +"31225ad1": "icoThreshold3()", +"31226f71": "writeMerchandises(uint8,string)", +"3123016d": "calcCostLevel(int256,int256[],uint256)", +"31230e23": "createWithParent(bytes32,bytes32,bytes32)", +"31232cd3": "pre_amount_stages(uint256)", +"312386b7": "techDevelopmentEthWallet()", +"3123bd9d": "memberProfitShare()", +"3124167b": "_getTokenAmount(uint256,bool,address,address)", +"312452b3": "mLoadAndReturn(uint256)", +"3125443d": "secondChangeBlock()", +"31277306": "buyByEth(address,uint256)", +"3128012a": "logEthDeposit(address,address,uint256)", +"31288397": "payWithoutChecksum(uint128,address)", +"3128d1be": "buyName(string)", +"312975a6": "setReservedHolder(address,address,address)", +"312983dc": "LogForkAnnounced(string,string,uint256)", +"3129be35": "calculateCoinsPerWeiAndUpdateAvailableIcoCoins(uint256)", +"3129e6d4": "RATE_SALESTAGE3()", +"3129e773": "getItem(uint256)", +"312ad4b9": "banThreshold()", +"312c0684": "Organicco()", +"312cba69": "EternalStorageProxyForPayinMultisender(address)", +"312dae8a": "changeCrowdsaleClosingTime(uint256)", +"312defb4": "INITIAL_ENDTIME()", +"312df321": "p_update_mRefPercent(uint256)", +"312f8b19": "blockedTime(uint256)", +"31302244": "approveAsInvestor(address,int256)", +"3130e89d": "EtherShot()", +"313138e1": "tuneLambo(uint256,uint256)", +"313186e7": "_calculateTotalLockedBalance(address)", +"3131d8de": "etherflipContract()", +"31324b0a": "IOXOwned()", +"3132605d": "DinoToken(uint256)", +"313354dc": "maxSellable()", +"3133f2a7": "outstandingBalance()", +"31347482": "CSELToken(uint256,string,string)", +"3134e2e1": "_setCollectRoundLength(uint256)", +"3134e9be": "verifyLinkPrivateKey(address,address,address,address,uint8,bytes32,bytes32)", +"3134f4f1": "SpecialRatedCrowdsale()", +"3135471d": "privateEtherFunded()", +"3135ed16": "race_start_block()", +"313602d4": "claimRemainingTokens()", +"31361399": "setICODate(uint256)", +"31363c86": "esteem(bytes32,string,address)", +"3136fa86": "NeuroProtect()", +"3136fbb8": "totalBaseLareSoldInMainSale()", +"31375242": "ownerSetTreasury(address)", +"31378811": "updateUserDetailsInBulk(address[],uint256[],uint256[],uint256[])", +"3137f3d4": "FhnwToken()", +"31380c89": "TokenSale()", +"3138d328": "gameMining(address,uint256)", +"3138d8d5": "Bid(uint256,address,uint256,uint256)", +"3138ee5c": "getPermittedContracts()", +"31391828": "_computeTournamentIncentiveReward(uint256,uint256)", +"31399b4d": "indexOfOperator(address)", +"3139c691": "_isInWhiteAddresses(address)", +"313a9204": "addPurchased(address,address,uint256)", +"313aaf96": "Double(bytes32,uint8)", +"313b7b19": "finance()", +"313c4093": "newExit(address,uint256)", +"313ce567": "decimals()", +"313d98f3": "getTokensTo(uint256,address)", +"313dab20": "treasuryBalance()", +"313f5a57": "tradeAirswap(address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)", +"313f944f": "externalPurchase(address,uint256)", +"313fc3fc": "getMyRevenue(uint256)", +"314094c2": "devfee()", +"3140b09e": "distributeBonusTokens()", +"314312d3": "setEtherDeltaExecutor(address)", +"31434041": "burnSTCDR(uint256,uint256)", +"3143d97c": "setTimeLock(uint256,uint256)", +"3143fd60": "dev_allocation()", +"314475b2": "TokenEntity()", +"31447a32": "KeplerTokenCrowdsale(uint256,address,address)", +"3144c859": "executeCode(bytes)", +"31462b96": "the_nominal_annual_interest_rate()", +"3146a6bb": "transferTeam(address,uint256)", +"3146d282": "HyperTestToken()", +"31477b9b": "getString(bytes32,bytes32)", +"31483bdc": "PushToken()", +"314848fa": "CICoin()", +"3148ac62": "InitialRateChange(uint256)", +"3148f14f": "modExp(uint256,uint256,uint256)", +"3149694a": "burnHackingAmount(address,string)", +"314989b2": "SimplePHXSalesContract()", +"3149c440": "transferDomain(bytes8,string,address)", +"314a05db": "ownerRetrieveContractConfig2()", +"314a522e": "getTermsContractParameters(bytes32)", +"314aabb5": "EthDice50()", +"314cd12c": "createPromoToken(uint256,address)", +"314dd783": "GoldiamICO()", +"314e0fb6": "scheduleTransaction(address,bytes,uint256[3],uint256)", +"314e39c3": "trustContract(address)", +"314e99a2": "abdicate()", +"314ec2e5": "set_sale_owner(address,bool)", +"314ef8cb": "Besiktas()", +"31503ec4": "setFeeWalletAddress(address)", +"3150456e": "GenChipIndex(uint256,uint8,uint256[],uint256[],uint256[])", +"3150a7da": "HarvestedBabyBrain()", +"3150efbd": "beneficiaryMultisig()", +"31511e61": "getAffiliateCount()", +"31513039": "transferTokensFromAnyWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"3151609e": "setMetadata(uint256,bytes32)", +"3151ecfc": "myDividends()", +"3152dd00": "fundingActive()", +"31543cf4": "getTemplate(uint256)", +"3154d790": "rentByAtom(uint256,uint256)", +"3155625c": "setCleide(uint256)", +"3155c856": "getTotalF5()", +"31561b0d": "isGauntletExpired(address)", +"3156560e": "setApprover(address)", +"31577cc0": "getModuleIDByAddress(address)", +"3157be49": "imageVerified()", +"3157d347": "nonVestedTokens(uint64)", +"31580446": "acceptDividends(uint256)", +"3158923d": "setReferralshipAddr(address)", +"3158c52b": "isSoftCapAchieved(uint256)", +"3158f643": "ico1Ended()", +"315a095d": "withdrawTokens(uint256)", +"315a0a09": "BasicForecasting(address,uint256,address,address,address)", +"315a6001": "purchaseUniqueSpinner(string)", +"315a6d65": "withdrawTeamToken(address)", +"315ad5ce": "resetGroupInfo(uint256)", +"315b86da": "MNPYToken()", +"315ccd21": "MAX_ETHER()", +"315d142d": "GayCoin()", +"315d758f": "_setERC20compatibility(bool)", +"315e2f1b": "setTestString(string)", +"315e3124": "pack(bytes4,address)", +"315e6c0a": "UpgradedContract(uint256,address,address)", +"315ebe81": "LockedOutTokens(address,address,uint256,uint8,uint256,uint256)", +"315f81c5": "useVaults(uint256,uint256)", +"315fd022": "MyToken(uint256,uint256,string,string)", +"315fdea3": "TreasureChest()", +"315fe684": "getMyPrize()", +"31601d09": "AuctionCreated(uint256,uint256,uint256,address)", +"31606828": "registrationDeposit()", +"3160d63b": "removeSupport(address)", +"31616395": "crowdsaleContract()", +"3162360d": "_emitBoardRatingGiven(address,uint256,uint8)", +"31629388": "setPendingValue(uint256,bytes32)", +"31638ced": "getDatasetByIndex(uint256)", +"3163b41a": "AdjustableRoundsManager(address)", +"31641629": "releaseSomeKims(uint256)", +"31649233": "allocatedTotal()", +"316524e5": "setGene(uint256,bytes)", +"31657926": "ticketsOf(address)", +"3165a051": "revealHiddenPosition(uint32,int64[],bytes32,uint64,bytes16,bytes32)", +"3165b26e": "transferOnBehalf(address,uint256,uint256,uint8,bytes32,bytes32)", +"31666144": "BTCproxy()", +"31666156": "latestReferenceBlockNumber()", +"3166e133": "Metropolis()", +"3166f49f": "balances_for_refund(address)", +"31670619": "GROWCHAIN()", +"31670ea7": "resetWithdrawEtherToValues()", +"31671a02": "TokenClaim(address,address,uint256,uint256)", +"31671f57": "Litecoinprivate()", +"31677980": "migrationCompleted()", +"3167e9d2": "infoUrl()", +"316866bf": "getRatingsForAddress(address)", +"3168e98a": "getExtensionFor(bytes4)", +"316943cc": "transferExtOwnership(address)", +"31694d6f": "TEAM_TOKENS_SUPPLY()", +"3169ff3e": "LooneyLottery()", +"316a0131": "viewWinningOption()", +"316b08a0": "scheduleTransaction(address,bytes,uint256[7],uint256)", +"316b13b4": "setMemberContract(address)", +"316b8cab": "Oogroll()", +"316bc682": "setKYCLockupIgnoring(bool)", +"316cb1b4": "withdrawKittenCoins()", +"316db7f2": "updateInfo(uint256)", +"316e539e": "currentStanding()", +"316f2f06": "requestUnclaimed()", +"316fb7c4": "updateGoal(uint256)", +"316fda0f": "cycleCount()", +"317053f8": "setStringMember(string)", +"31707a05": "initOwner(address,address)", +"31711884": "tokenRate()", +"31711abe": "bookkeep(address,uint256,uint256)", +"31719c69": "lastPriceSetDate()", +"31723abd": "DMTokenC()", +"31729a45": "setCommission(address,uint256)", +"31748401": "_investorAddresses(uint256)", +"3174cc87": "refundToBuyersIfSoftCapNotReached()", +"31757f2e": "collisionCount()", +"3176bd18": "MyTestingToken()", +"3176d373": "updatePriceFci(uint256,uint256)", +"3176e734": "addHiddenPosition(uint32,bytes32)", +"3176f912": "getPlayersBattlePower(address,address)", +"3177029f": "approveAndCall(address,uint256)", +"3177b83a": "isCustomerHasACC(address)", +"317830b4": "crowdsalePaused()", +"31787b91": "maxIcoDuration()", +"31798893": "DistributedSoFar()", +"317a71ea": "_removePendingRequestId(uint32)", +"317ab6dc": "getChampsCount()", +"317b0b77": "_setCloseFactor(uint256)", +"317b4b76": "setPreIcoMin(uint256)", +"317c00be": "maxTokensPerArticle()", +"317c0ae9": "tokensByZecTx(string)", +"317c1291": "isCrowdFundActive()", +"317cd9fb": "setethtoken(address)", +"317d5d9b": "rand(uint32)", +"317d7a2b": "depositInfo(uint256)", +"317d9453": "getContractTokenBalance()", +"317ebc79": "scoreTeams(uint32[],int32[],uint32[])", +"317ec08b": "removeMaliciousValidator(address)", +"317ed7dc": "rebateTwoFenzi_()", +"317ffcf2": "getCreateUnicornPrice()", +"31806aaf": "unlockBalanceByKey(uint256,uint256)", +"318077a1": "Logo(address,address,string)", +"31809eac": "dayAfterInMinutes()", +"3182c3aa": "createSale(uint256,uint256,uint256,string,uint256)", +"31836cb9": "testMiddleTranch()", +"31839753": "getVolumeBonusAmount(uint256,uint256)", +"3183a55c": "Alchemy(uint256,uint256)", +"3183ef3d": "_release(address)", +"31845f7d": "setPublic(uint256)", +"31852177": "ConsToken()", +"31852a02": "allocate6ProjectToken()", +"31859556": "startPreico()", +"3185a61e": "getSellOrder(uint80)", +"31861423": "_deleteAllPackedRevisionTimestamps(bytes20)", +"3186f390": "tokensToPartner()", +"3187878b": "Follor()", +"31885119": "mintSelf()", +"3188949a": "DIT()", +"3188c5b1": "updateTotalChild(address,address)", +"3188da5f": "meltCoin(address,uint256)", +"3188ed13": "UNSOLD_ALLOCATION_SIZE()", +"3189418f": "connect_to_nodelist()", +"318992d0": "RewireToken()", +"318a3fee": "relayTx(bytes,int256,int256[],int256,int256)", +"318b526c": "AIGInvestment()", +"318cbe20": "BountyBG()", +"318dbcae": "releaseFundsBuyer()", +"318e6c78": "getAdminAddress(address,address)", +"318f0fe9": "acceptRequest(address,address)", +"318fd7e4": "HomeChainToken(address)", +"318fd93d": "registerSeller(string,string)", +"31906ebd": "airdropTotal(address)", +"3190abc0": "addCustomer(string,string)", +"3192164f": "idle()", +"31921cad": "headerColor()", +"319288d8": "setNVTface(address)", +"3192b995": "developer_crowdsale_text(string)", +"3192cccb": "queryTokenGrant(address)", +"31933916": "getMessageCount()", +"3193c749": "placeBet(uint256,uint256,uint256,int256)", +"31950032": "createContract(bytes32,uint16,bytes8,uint256,uint32,string,uint32,uint64[],bytes8[],uint32,bytes32)", +"319609fa": "EtherPiggyBank()", +"31970bd8": "nextRangeID()", +"31978b99": "changeBoardMetadata(bytes32,bytes32,string)", +"3197cbb6": "endTime()", +"31985b51": "sendGiftCard(address,address)", +"3198a38f": "findAllCliWithPendingTask(address)", +"3198acad": "Billionsgame()", +"319983f8": "FoundationSupply()", +"31999749": "getTimePeriodsUsed(uint256)", +"319a2494": "getBlockOf(address)", +"319a30d4": "setConfiguration(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"319a9395": "setGlobalLock(bool)", +"319ae4b2": "spaceCount()", +"319af333": "log(string,address)", +"319b0cd2": "calculateRate(uint256)", +"319b0e75": "getTotalInvested(address)", +"319c068c": "current_round()", +"319c33cc": "setOrganization(string)", +"319c7748": "_KiwiToken()", +"319dac48": "polishRoughStone(uint256)", +"319db3be": "advisorWallet()", +"319df3bf": "icoManager()", +"319f0852": "MSCTToken(uint256,string,string)", +"319f21b6": "placeGame(uint8,uint256,uint256,uint8,bytes32,bytes32)", +"319f3930": "mintFraCoins(uint256)", +"319f7700": "SealCrowdsale()", +"319f9887": "SnowdenAffect()", +"31a02bce": "requestMint(address,uint256)", +"31a06772": "scrap(uint256)", +"31a079ca": "ArtexToken()", +"31a14db3": "getParticipantName(bytes32)", +"31a2aba8": "create(address,uint256,uint256,address,address,address)", +"31a360b4": "LUVITOKEN()", +"31a36424": "getAllAdmin()", +"31a38c89": "executed()", +"31a3a506": "closeFunding()", +"31a3b36f": "blockDotTimestamp()", +"31a3b873": "ICO_MIN_CAP()", +"31a40b62": "delAuthorized(address)", +"31a51f46": "getTransactionConfirms(bytes32,uint256)", +"31a642db": "getTransferInfoValue(address,uint256)", +"31a73991": "GetUserIdByAddress(address)", +"31a76bca": "FOUNDERS_VESTING_CLIFF()", +"31a7d4c2": "LogPause(uint256,bool)", +"31a83ca2": "oraclize_randomDS_setCommitment(bytes32,bytes32)", +"31a8aeb3": "stakeFrom(address,uint256)", +"31a95c7a": "redeemTokens(address,address,uint256)", +"31a97ff0": "noteInitialReportingGasPrice()", +"31a9b2f2": "maximumPurchase()", +"31aa01c4": "contributed2(address)", +"31aa91fc": "completeContribution(address)", +"31aaa74a": "accountParent(address)", +"31ab4066": "testAuthorityTryAuth()", +"31ab6055": "TMCoin()", +"31abdd2a": "calculateEthValueFromTokens(uint256,uint256)", +"31ac7253": "releaseState3()", +"31ac76c7": "getSiteTokenLength(uint256)", +"31ad6b62": "sendToEthertoteDevelopmentWallet()", +"31ad836e": "Flabba()", +"31adba2f": "victimsCount()", +"31ae0019": "KissBTC()", +"31ae450b": "getAdmins()", +"31ae6b6e": "isFactProviderInWhitelist(address,address)", +"31af56ed": "transTo(address,address,uint256)", +"31afa55f": "decreaseMonsterExp(uint64,uint32)", +"31b0795c": "registerAddress(address,address)", +"31b259cf": "setUser(address,address,string,string,string,bytes32)", +"31b27c44": "DeusMarketplace(address,address)", +"31b28664": "PAGE_SIZE()", +"31b29629": "ownerAddBankroll()", +"31b2d49c": "cancelOrder(address,address[5],uint256[8],bytes32,uint8,bytes32,bytes32)", +"31b31b88": "setTokenFee(uint256)", +"31b36c45": "CHECKgamberTwo()", +"31b39a56": "addWalletConfig(uint256,uint256,uint256,uint256)", +"31b3eb94": "withdrawPayments(address)", +"31b4784e": "lastUpdateOverall()", +"31b48f86": "setPeriods(uint32,uint256)", +"31b57b46": "initialize(address,address,bytes32,address,int256,bytes32,address,int256,bytes32,uint256)", +"31b59508": "LDIT()", +"31b5da2a": "numMC()", +"31b61ece": "getAllLeftHand()", +"31b62fae": "GetCardInfo(uint32)", +"31b6421e": "Approve(uint256,bool)", +"31b77da4": "getEmptyIndex()", +"31b7a196": "emitGenericLog(string,string)", +"31b7c458": "claimedAirdropTokens()", +"31b8b100": "Static()", +"31b93ae6": "MIN_PRESALE2()", +"31b97e45": "addGame(bytes32,bytes32)", +"31b9d81d": "kscBatchTransferToEcosystem(address,address[],uint256[],uint256,uint256[],string)", +"31ba7ede": "create(address,bytes32,address,bytes32,bytes32,address,bytes32)", +"31baa8ae": "getCitizenCharacteristics(uint256)", +"31bab608": "getVersionSelectors(bytes32,bytes32,bytes32)", +"31bac434": "unpauseMint(uint256)", +"31bae156": "getPartialAmountRoundedUp(uint256,uint256,uint256)", +"31bbb695": "takeCapital()", +"31bcce1c": "CryptoAtoms()", +"31bcd2b7": "sendTokens(uint256,uint256)", +"31bd1fa5": "levAddress()", +"31be23e4": "getLotteriesLength()", +"31be6985": "testBitXorSuccess()", +"31be6a17": "addNewGroup(bytes32,uint256,uint256)", +"31beedd9": "setOWhitelist(address[])", +"31bf0667": "tokensaleWallet()", +"31bf0b42": "setSB(uint256,uint16)", +"31c0018b": "listApi(uint256,bytes32,bytes32,string,string)", +"31c05b8f": "getWalletAddress(bytes8)", +"31c15301": "maxRandom(uint256,address,uint8)", +"31c1eea4": "delCEx(address)", +"31c29c25": "newContribution(address,uint256)", +"31c2b6e6": "animator()", +"31c2bd0b": "propose(address,bytes,uint256)", +"31c33669": "GetChequeInfo(string)", +"31c359fa": "getReferralAddress()", +"31c3e2c9": "VotingProxy(address,address)", +"31c3e456": "update(string,string,string)", +"31c420d4": "unfreezeTransfers()", +"31c42ca6": "testSell()", +"31c571f5": "setLastStellar(address,uint256,uint256,uint256)", +"31c5e407": "PaymentSubmitted(address,bytes8,uint256)", +"31c5e56b": "init(address,uint256,uint256,uint256,uint256,uint256,uint8)", +"31c6c4cf": "transferFromWithReference(address,address,uint256,bytes32,string)", +"31c78498": "Metadollar()", +"31c89d3e": "FromQueue(address,address)", +"31c91117": "withdrawAllEther()", +"31c9472a": "constantname()", +"31ca0bae": "DAO(address,uint256)", +"31ca208c": "greylist(address)", +"31ca4340": "GetTokenData(uint256)", +"31ca6b67": "setWinnerManually(uint256)", +"31cb27d7": "processHandEndSplit(uint256,uint256)", +"31cba838": "BOUNTY_ADDRESS()", +"31cbf288": "createContract(string,address,address,string)", +"31cbf5e3": "pay(uint256,address)", +"31ce6b47": "getTicketCounter()", +"31cfcf84": "IDAGToken()", +"31d03594": "getOfferPrice(uint256)", +"31d0e3f5": "setChainlinkToken(address)", +"31d1c995": "_batch1_icosaleStartTimestamp()", +"31d29af1": "getMyWallet(address)", +"31d2f891": "crowdsaleAddress()", +"31d31647": "hasSenderVoted(uint256)", +"31d3518a": "IvoryToken()", +"31d35cb2": "getDayEthIn(uint256)", +"31d36cf0": "relaySellerCancel(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32)", +"31d397ef": "initialWallet()", +"31d4116f": "nextsize()", +"31d41325": "isMonethaAddress(address)", +"31d42bf2": "addBlackAccount(address)", +"31d4ac45": "bookWithLif(uint256,uint256,bytes,string,uint256[],bytes32)", +"31d4ed2e": "_isUnderLimit()", +"31d4fad4": "refundPayment(uint256,address,string)", +"31d6183b": "tokensToEth(uint256,uint256)", +"31d67353": "transfer_data(address,uint256,string)", +"31d694a0": "NEBC()", +"31d78a50": "signedApproveAndCall(address,address,address,uint256,bytes,uint256,uint256,bytes,address)", +"31d87de2": "setRBACAddress(address)", +"31d90e04": "canClaimPayout()", +"31d98b3f": "getPrice(bytes32)", +"31d9931f": "setOwnedTokensIndex(uint256,uint256)", +"31daabb7": "updateOwner(uint256)", +"31db4b95": "doTriggerAuth()", +"31db6c48": "TYPE_EXPLORER()", +"31db9efd": "right88(uint256)", +"31dbd8a5": "feeAuthority()", +"31de13e8": "tBonusStageEnd()", +"31de7e72": "iceFund()", +"31deb7e1": "nodeCost()", +"31e12c20": "setowner()", +"31e19cfa": "getStrategyCount()", +"31e396c8": "calculateYourValue1(uint256)", +"31e3e2fe": "WithDraw()", +"31e41fba": "_localFight(uint32,uint32)", +"31e5144c": "isAvailable(uint32)", +"31e574a5": "addProduct(address,uint256,string,string)", +"31e59772": "deletenullarr()", +"31e5f055": "one_card()", +"31e63199": "codename()", +"31e6a707": "getWalletInfoByIndex(uint256)", +"31e7b060": "constructProof(bytes32,bytes32[],bytes1[])", +"31e7bf9d": "Multivest(address)", +"31e88fee": "claimedPartnerPreICO(address)", +"31e8c7ba": "CertID()", +"31e8ebbb": "DenToken()", +"31e92f32": "blocksPerMonth()", +"31e99e2b": "getCurrentSmartSpeedPrice()", +"31e9e9c0": "unlockToken(address,uint256)", +"31e9ea8a": "PlaceBet(address,uint256,uint256,bool)", +"31e9ee7c": "currentIcoWallet()", +"31ea1a39": "cancelDeal(uint256)", +"31eaa5c9": "erc20CTH()", +"31ebd13f": "logAllStart()", +"31ee080d": "setComisionInvesorInTokens(address,bool)", +"31ee6c2e": "dividePerfectlyBy(uint256,uint256)", +"31ee8277": "_createship(uint256,address)", +"31ef107f": "SetProfitAddr(address)", +"31ef916a": "approve_timed(address,uint256,uint256)", +"31f01140": "getUserInfoById(uint256)", +"31f0528e": "updateNextGameMinAndMaxBlockUntilGameEnd(uint256,uint256)", +"31f070d9": "getSet()", +"31f09265": "withdraw(address,uint256,bytes)", +"31f0fca1": "_addTokenToTranche(address,bytes32,uint256)", +"31f170c2": "coinSupply()", +"31f1fd2b": "setCriterionTime(uint256)", +"31f25330": "initialRound()", +"31f27c96": "isWarriorChest(uint256)", +"31f2c8a5": "whitelistedSenderAddresses()", +"31f2d72d": "TelegaSend(address)", +"31f3af90": "removeAuditorFromMultiRequestAssignment(uint256,address)", +"31f4a23f": "EtherDeltaWithdrawToken(address,uint256)", +"31f4f682": "investmentMin()", +"31f53447": "operatorProductCommissionInPerc()", +"31f607a5": "Coin_Character()", +"31f6eac8": "availableVolumeEtherDelta(address,uint256,address,uint256,uint256,uint256,address,uint256)", +"31f72b44": "NewPhase(uint8)", +"31f76043": "resetSymbol(string)", +"31f850e6": "create(address,uint256,uint256,uint256,bool,string)", +"31f9a211": "getOrderState(uint128)", +"31f9a8f2": "accessToken(address,uint256)", +"31f9c919": "mintingActive()", +"31fa0a45": "withdrawAdamcoins()", +"31fa76db": "short_tokens(uint256)", +"31fa7c84": "cancelRent(uint256,uint256)", +"31fa8e73": "payrolls()", +"31fa90d8": "stopIssuingIndividualTokens()", +"31fb4c1d": "preIcoFinishTime()", +"31fb67c2": "withdraw(string)", +"31fc5b18": "MIN_BID_FRAC_TOP()", +"31fd725a": "PassHasBeenSet(bytes32)", +"31fdb712": "getFlight()", +"31fea236": "testFailTransferFromWhenStopped()", +"31ff1ed9": "linkDirectly(string,uint256,uint256)", +"31ffc9fa": "DentacoinTimeLock()", +"3200aa7a": "startRoundB()", +"32013ac3": "preallocate(address,uint256,uint256)", +"320228ca": "minimunEth()", +"32033229": "writeAddr()", +"32035ca6": "madeOperatorForTokens(address,address,address,uint256,bytes,bytes)", +"3203fe4b": "softcap1Reached()", +"3204dbc5": "distributeELTC(address[])", +"3205c5c1": "intunderflow(uint256)", +"3205f5fc": "division()", +"3206163f": "Drawcolor(uint256,address,uint256,uint256)", +"32064946": "start_buyer(address,address,uint32)", +"32064db7": "left20(uint256)", +"320665a6": "BCCB()", +"3206b2c6": "getLog(uint256)", +"3207230d": "purchaseVehicleSpace(address,uint256,uint256)", +"3207408f": "PrivateSaleCents()", +"32075c49": "buySCTK(address,uint256)", +"3207b544": "BRI()", +"32083c44": "payoutForWagerAndOutcome(uint256,uint8)", +"320878d5": "BFYToken()", +"32089b74": "LEGLToken(uint256)", +"32098d4c": "setCalculateFloatingValue(uint256)", +"3209943e": "proceedsAddress()", +"3209c6de": "iterate_start()", +"3209e9e6": "setMinimum(uint256)", +"320a352a": "ExposureCollected(bytes32,address,uint256)", +"320a3c5e": "AJinToken()", +"320a5018": "MilestoneInput()", +"320a6c73": "transferFor_(address,address,uint256)", +"320a8ef8": "transferTokensToTeamMany(address[],uint256[],uint256)", +"320a98fd": "lock(string)", +"320b2ad9": "_pause()", +"320bebaa": "setPromoMinPurchaseEth(uint256)", +"320cffcd": "getCostForCards(uint256,uint256,uint256)", +"320d2800": "finalizeSale(address,uint256)", +"320d2fa0": "liquidationThresholdPercent()", +"320d4534": "setMinSwapAmount(uint256)", +"320d46d4": "canRegister(address)", +"320dc63a": "TotalSTC(uint256,uint256)", +"320e028d": "setCountryToken(address)", +"320e6c01": "set_default_approval_duration(uint256)", +"320ea024": "isVerificator(address)", +"320fdc75": "one(uint256,uint256)", +"321022a5": "updateSettlementInstitution(address)", +"3210318e": "PotaosBucks()", +"3210bb1d": "moneybuy(uint256)", +"3211bb90": "OwnerAddFunds()", +"32121896": "GDK()", +"32139a0e": "platformOperatorNeumarkRewardShare()", +"32145dd2": "gamePlayerNumber()", +"321489d4": "getDataByIndex(uint256)", +"3214e6ba": "cpow2(address,uint256)", +"3215b483": "getTokensByMerkleProof(bytes32[],address,uint256)", +"3216255b": "setCertificate(string,string,string,string,string,string,string)", +"3217e44e": "RGHTC()", +"3218b99d": "gameStart()", +"3218ebcc": "SUBMISSIONREWARD()", +"32191017": "updateFeeForCurrentStakingInterval()", +"3219ac2a": "showMyVote()", +"3219e73f": "addScore(string)", +"321a7c8c": "createVestingByDurationAndSplits(address,uint256,uint256,uint256,uint256)", +"321b3157": "firstPartOfTeamTokensClaimed()", +"321bbc1c": "test_insert_findWithHintNextUpdateHead(int256)", +"321c48f2": "getTemplate()", +"321cb98a": "creationMaxCap()", +"321d43cd": "approve_sell_proposal()", +"321db4d4": "getQueryAddress()", +"321de1d4": "BuyToken(address,uint256,string)", +"321f0013": "do_nothing()", +"321f4584": "DataRegistered(bytes32)", +"321f63a2": "HMToken()", +"322062b8": "FixBet31()", +"3220ad89": "refundSuccessful(address,bytes32)", +"3220b95a": "getEscrowOrder_seller(uint256)", +"32214874": "verifyAmount(address,uint256,uint256,bool)", +"3221e125": "addBag(uint256)", +"32227425": "stopReceiveTicket(uint256)", +"3222ae71": "airdropFinished()", +"322370ff": "BetexStorage()", +"32246e9f": "auctionEnd(uint256)", +"322471cf": "createAffiliate(uint256,uint64,uint64,address,address)", +"3224ba23": "submitPoliceReport(uint256,bytes,bool)", +"32254992": "getPrevHash(int256)", +"32255d90": "confirmShipping(uint256)", +"32258794": "removeAddressesFromBlacklist(address[])", +"322671cd": "_checkLockUp(address)", +"32268c01": "artistsArtworks(address,uint256)", +"3226a94e": "TRNCoin()", +"3227563a": "logPriceAfter()", +"3227bd8b": "DragonCoin()", +"3228556f": "setPOOL_edit_8(string)", +"3228afcb": "HyperIslandCoin()", +"32293954": "LogTokenPreissued(address,uint256)", +"322a5e5f": "balanceContract()", +"322a7050": "addHospital(uint256,string)", +"322a8957": "teamTokenTimelock()", +"322b1bc0": "getarray_length()", +"322b8c7e": "dKERNEL_PANIC()", +"322e5021": "Penalty(address,uint256)", +"322eccdc": "withdraw_all_admin(address)", +"323046b1": "date()", +"32307c67": "LCASH()", +"323082d7": "Vote(string)", +"3230d486": "getHeroRequiredExpForLevelUp(uint256)", +"323162a9": "getDisputeParticipants(uint256)", +"3231a2b9": "voteSnapshotBalanceAutoBatch(address[],uint256[])", +"32326b44": "Invested(address,uint256,uint128)", +"3232f204": "SPAMed()", +"32331418": "ExchangeTokenToZWC(address,address,uint256)", +"3233b455": "appFundDeposit()", +"3233c686": "claimerDeposit()", +"3233c791": "nextlotnumber()", +"32347487": "forwardFundsToWallet()", +"32353fbd": "resumeAuction()", +"323560b5": "ZebraToken(uint256,string,uint8,string)", +"32363b47": "period1End()", +"32363e0a": "calculateMultiplierAfterBurn(uint256,uint256,uint256)", +"323661f6": "releaseLockedBalance()", +"32366ea5": "isOMITokenContract()", +"32366fb9": "makeTomatoes(address)", +"32369e38": "GetPlayerDynamicRatio(address,uint256)", +"32373e25": "CREATED_STAR4()", +"323772ee": "unlocktime()", +"3237d63c": "tgeLive()", +"32383a69": "WashCrowdsale()", +"3238c832": "updateDBZHeroDetails(uint256,string,address,address,uint256)", +"32395c2b": "addPayee(address,address,uint256)", +"3239825c": "edCoreContract()", +"3239d232": "weekProcessed(uint256)", +"323a5e0b": "deposits()", +"323a73d9": "generateId(uint256,uint256,uint256)", +"323a7acb": "Joyreum()", +"323aca70": "InterCryptoNode()", +"323b1b87": "FreezeTokenTransfers(address,bool)", +"323b2c26": "MAX_RELEASE_DATE()", +"323bc818": "_createTeam(string,string,uint256,address)", +"323be1c5": "canPause()", +"323bf0b8": "icoPhase2EndTime()", +"323c20fa": "tokenPtx()", +"323c59c4": "Common()", +"323cb59b": "uncooperativeClose(address,uint32,uint192)", +"323d5c68": "sendPer()", +"323dc51a": "MomoToken(address,uint256)", +"323ded4d": "_getLegendaryPlusRarity(uint32)", +"323df879": "MILLION_TOKENS()", +"323e71fd": "turnOffCanUpdateFrontWindowAdjustmentRatio()", +"323ea3f9": "photoText()", +"323efacd": "checkAndCallSafeTransfer(address,address,uint256,bytes)", +"323f6fe0": "VESTING_OFFSET()", +"323fe92c": "setPriceAttr(uint8,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"32414926": "CarTaxiToken(address)", +"32418558": "stakeTokensManually(address,uint256,uint256)", +"32424aa3": "_decimals()", +"324298ff": "ArrayDemo()", +"32434a2e": "register(address,string)", +"324365b1": "createCollectible(uint256,uint256,address,address)", +"3243c791": "distributeDividends(uint256)", +"32443d7d": "developmentFundUnlockTime()", +"324536eb": "totalSupply_()", +"3245a55f": "mintFull(address,uint256)", +"3246887d": "setLedger(address)", +"3246bac5": "getGameIpfs(uint256)", +"3247dd8b": "ySignToken()", +"32484dab": "totalContributedUnits()", +"3248687a": "getLockSize(address)", +"32492f96": "getStellarBalance()", +"32495c58": "requiredEntries()", +"3249759c": "TAToken()", +"324a5562": "setMaxNumber(uint8)", +"324ab080": "MIN_BONUS()", +"324b0085": "createBlogger()", +"324b8ad2": "totalBurnLotsByAddress(address)", +"324b8d6e": "oracleConfig()", +"324c6add": "KBV01()", +"324cb3cb": "contractLocked()", +"324cf51a": "setPurchaseParamCount(uint256)", +"324da66f": "removePromoCode(bytes32)", +"324dd3b0": "getFighterArray(uint256[])", +"324ecd96": "power10(uint256)", +"3250e151": "PakEKO()", +"32513ce5": "newContractAddr()", +"32519e0e": "roundEth()", +"32525f09": "testTransferFromDoesNotAllowTransferOfMoreThanAllowedByDelegate()", +"325294e5": "calculateEthers(uint256)", +"3252b8fb": "returnGrantedToken(uint256)", +"3253277c": "badge(address,uint256)", +"3253ccdf": "burnNomins(uint256)", +"32546f7e": "HammerChain()", +"3254de48": "ITSEndTime()", +"32555f06": "dissBlock(uint256)", +"325586dc": "checkStateProof(bytes,uint256,bytes,bytes)", +"32564d82": "identifierToIndex(bytes32)", +"325654ae": "secondPrivateLockTime()", +"3257bd32": "getDepositorMultiplier(address)", +"3257d818": "hasResponded(bytes32)", +"32581fb0": "getArtefactById(uint256)", +"3258e255": "setWithdrawBeforeTime(uint256)", +"325a19f1": "created()", +"325ab9ac": "buildCharging()", +"325ad39b": "UltraNote()", +"325add98": "sellDaiForEth(uint256,uint256)", +"325c25a2": "auctionLength()", +"325c35c5": "setFightsAddress(address)", +"325cf9e6": "splitPayment()", +"325da1c0": "LogAllocateTicket(uint256,address,string)", +"325dfddf": "waittokens()", +"325ecf99": "addMarketingToken(uint256,uint128)", +"325f33e0": "checkUserByWallet()", +"325f9f41": "processShares(uint256)", +"32606387": "_draw3()", +"32608243": "Iou()", +"3260db59": "UnityToken(address,uint256)", +"32611e2b": "stage2_start()", +"32615457": "FullAssetRegistry()", +"32617353": "GoldBlockTickets()", +"32619375": "ChangeMiningReward(uint256)", +"3262207c": "isTransferProxy(uint32,address)", +"32624053": "blocksToWaitShort()", +"32624114": "isValidAccessMessage(address,uint8,bytes32,bytes32)", +"3262fd9a": "getMoney(uint256)", +"326360fe": "uncommittedTokenBalance()", +"32643513": "_computeContendersTotalHp(uint256,uint256,uint256,uint256,uint256,uint256)", +"32644829": "removePlayerFromBoard(bytes32,bytes32)", +"3264a34b": "getBoard()", +"3264a844": "hundredtimes()", +"3265bf5b": "registerPlayerToBoard(uint256)", +"3265c436": "btcsAddress()", +"32665ffb": "getProperty(uint256)", +"32666a31": "setMonsterObj(uint64,string,uint32,uint32,uint32)", +"326687b9": "onSale()", +"3266c856": "WanToken(address,uint256,uint256)", +"3266fb05": "lockedTime(address)", +"32670d10": "contributors_locked(address)", +"3267a2c5": "returnedToOwners()", +"3267db34": "setCurrentBadge(bytes32)", +"3268215c": "getPuppyAttributes(uint256)", +"3268419f": "PreSale(uint256,uint256,address,address,uint256)", +"32691d18": "updateLastTransactionTime(address)", +"326959cc": "MMMToken()", +"32696a92": "totalpatient()", +"326a794d": "safeMathSub(uint256,uint256)", +"326a7d77": "LEVEL_MAX_VALUE()", +"326abfce": "curent_mul()", +"326b0c7e": "BuyPresalePackage(uint8,address)", +"326b1001": "crowdSaleHardCap()", +"326b7a14": "WthdrawTo(address,uint256)", +"326cf61c": "toBytes(bytes32)", +"326dd62d": "migrationStartedTime()", +"326e8d60": "getTurnover(bytes32)", +"326fac6e": "getCurrentGames()", +"326fd584": "maxEtherCap()", +"32708966": "setMonsterIndexToApproved(uint256,address)", +"3270f753": "depositHouseTakeout()", +"327107f7": "targetToken()", +"32715bf2": "userContentByIndex(uint256)", +"32716063": "calcTotalFee(uint256,bool)", +"3272b28c": "allowedSenders()", +"32733a08": "balanceB()", +"32736fb0": "RoundsManager(address)", +"3273b110": "setMinDuration(uint32)", +"327419b7": "NeedsCoin()", +"327428b1": "Lockable(uint256)", +"32750350": "setcardaddress(address,address,uint256)", +"3276249f": "vrcWallet()", +"327683bb": "setIII_R3(uint256)", +"3276eaa9": "incrementContinuityNumber(uint32,int256)", +"32773ba3": "challengeExit(uint256,uint256,bytes,bytes,bytes,bytes)", +"3277bbda": "setUintF1IntF3AddressF3(uint256,int256,address)", +"32780d05": "closeChannel(bytes32,uint256,address,uint256,address,uint256,bytes32,bytes32,bytes,bytes)", +"3278ba2f": "getNumBounties()", +"3278c960": "terminateSelfDestruct()", +"3278dc67": "Founder()", +"327942a2": "move(bytes32,uint256)", +"32794823": "withdrawToOwnerCheck()", +"32797f44": "failedTimestampSecondsAt(uint16)", +"327a765a": "_getString(address,bytes32)", +"327a943a": "getUserAmount(address)", +"327b95b5": "USDXCoin()", +"327c0dd9": "resetLotteryManually()", +"327cc732": "registrantIndex(address)", +"327e36dc": "RefundVault(address,address[])", +"327efb0c": "supplylimitset()", +"327f0b6b": "pollTitle(uint256)", +"327fc33c": "isUpcoin()", +"32807be0": "PrymexPreICOCrowdsale(uint256,uint256,uint256,address)", +"3280922b": "TOKENS_SALE()", +"3280a836": "getPayment(uint256)", +"328175cd": "editorSignUp(address)", +"3281c4e1": "salesAllocation()", +"3281c4fa": "upRound(uint256,address,uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256)", +"3281d576": "isContractMiniGame()", +"32820d5f": "setupWeiCaps(uint256,uint256)", +"328243d5": "changeSale(uint256,uint256,uint256,uint256)", +"32828d9e": "BbbToken(uint256,string,uint8,string)", +"32829a23": "OpenBankAccount()", +"3282aa8a": "individualMaxCapWei()", +"32833d51": "power(uint256,uint256,uint32,uint32)", +"3283f641": "task()", +"32842c39": "picture(address)", +"32846270": "goldSaleLimit()", +"3284d75c": "sendRefTVs(address)", +"3284fd79": "issue(address,uint32)", +"32859392": "dividendDecreaseFactor()", +"3285ecde": "tokensMintedDuringPreICO()", +"3285f406": "GetWithdrawalFunds(address)", +"3286b611": "Generate(address,address,uint256,uint256)", +"3286fb75": "addressNotSet(address,address)", +"3287c399": "isSignedBy(bytes32,address,bytes)", +"3287d0dc": "ownerLocked()", +"3287d0f6": "switchReserve(address)", +"3287db4b": "lockFunds(uint256,uint256)", +"3288eb0b": "ChineseCookies()", +"32892177": "TOKEN_VERSION()", +"328929e0": "Offer(address,address,bytes32,uint256,uint256,uint128)", +"32895c2a": "ERH()", +"3289e004": "redeemPackage(uint256,address,uint256,bytes32[])", +"3289fba6": "getSanPrevOwner(uint256)", +"328a2c2d": "updateStartDate(uint256,uint256)", +"328a7e97": "setKyber(address)", +"328a8cc4": "addRestaurant(address)", +"328b10d7": "vestingStarts()", +"328c0ec0": "endPreICOTime()", +"328d15f4": "_getCurrentWeek()", +"328d8f72": "setEnabled(bool)", +"328db985": "getPotCnt(string)", +"328ede54": "DAFZOToken(address,address,address,address)", +"32902924": "signSendDiamond(bytes32,string,string,address,string,bytes16,uint256)", +"3290bd90": "getInfoFromBidding(bytes,bytes32)", +"3290ce29": "purchaseTokens()", +"3290f515": "addInterest(uint256)", +"32911111": "getroundinfo(uint32)", +"3291b39a": "addReserve(address,uint32,bool)", +"32921690": "checkDepth(address,uint256)", +"3292b71f": "transferCrowdSale(bool)", +"3292cd37": "payWithDailyFreePoint()", +"32931fbb": "left1(uint256)", +"329350ea": "storeOwnership(address,address)", +"3293d007": "isValidDateTime(uint256,uint256,uint256,uint256,uint256,uint256)", +"329430ca": "teamAllocated()", +"32947122": "updAirDropTokenDestroy(bool)", +"32948515": "QLinkToken()", +"3294ab00": "withdrawBtc(bytes,uint256)", +"3294c2d7": "updateDocument(uint256,uint256)", +"32958fcb": "boolToBytes32(bool)", +"3295feb3": "numAuthorities()", +"32967ea0": "isOlderOwner(address,address)", +"3296a373": "createPromoPerson(uint256,address,uint256)", +"3297ef5b": "voting_started()", +"32985244": "joyTokenContract()", +"3298caa3": "getDoneRegistrationAmount(address)", +"3298e6c8": "GanaPublicSale(address,address,address)", +"32990ad2": "rewardTokensForClient(address,uint256)", +"3299ad23": "PapushaToken()", +"329a23b8": "Wallet(address[])", +"329a27e7": "getWalletBalance()", +"329a88d5": "UBIATARPLAY_CAP()", +"329b1c92": "getReferral()", +"329b59d1": "fallback(uint256)", +"329b8f38": "yesCount(uint256)", +"329bfc33": "getCurrentWinner()", +"329c095b": "getLatestReading(string)", +"329ccce1": "vmaxEtherPerPurchase()", +"329cd958": "get_next_item_in_state_from_item(bytes32,bytes32)", +"329ce1b7": "delOwner(address,address)", +"329ce29e": "buyTile(uint256)", +"329d1a35": "testReentracyGuard()", +"329d1a8b": "depositIndex(uint256)", +"329d3346": "closeVote()", +"329d5f0f": "setApprovedUser(address)", +"329da011": "addNewToken(string,address,address)", +"329daf90": "onlyPauserMock()", +"329eac15": "phase2Price()", +"329f36b5": "BONUS_TIER_2_LIMIT()", +"329f5b21": "DiatomAirdrop(address,address)", +"32a16f4e": "isLocked(bytes32)", +"32a21a28": "registerInvitor(address,address)", +"32a2c5d0": "getContractAddress()", +"32a2fda7": "isPermissionGranted(address,string)", +"32a36e53": "enterRound(bool)", +"32a3869a": "getBonusPercentage(uint256)", +"32a3abbb": "LALATokenAddress()", +"32a42882": "buyPropertyInPXL(uint16,uint256)", +"32a45ac5": "addMessage(address,uint256,uint256)", +"32a521c1": "disallowToLock(address,address)", +"32a52fcd": "FOR_ICO()", +"32a54712": "DecalinxCoin()", +"32a55bb4": "swapActivity()", +"32a58dc2": "change_client_manager(address)", +"32a6baf6": "isTimePassed()", +"32a71b36": "AleaCoin()", +"32a7ae95": "deleteClaim(address)", +"32a7d7c2": "AddressOwnershipVerification()", +"32a7dbda": "getMintManager()", +"32a7e45a": "eosBlanceOf()", +"32a80329": "getTokenTransferable()", +"32a8589a": "FercCoin()", +"32a89e50": "NextBabyIs(address,uint256)", +"32a8bb33": "getParticipantIds(string,uint256,uint256)", +"32a8d49e": "ADV_TEAM_TOKENS()", +"32a8e74c": "participateBuyback()", +"32a92229": "creditBalanceOf(address)", +"32a9a43b": "removeLeverage(uint256)", +"32a9df46": "setSecondBonus(uint256)", +"32aa952f": "UpdateSellAgentCreators(address,address)", +"32aae34d": "LogVoteToFreeze(address,uint256,uint8,bool)", +"32aaf9d7": "addCommissionAmount(uint256,address)", +"32ab6af0": "newRepoWithVersion(string,address,uint16[3],address,bytes)", +"32aba656": "stillAvailable()", +"32abff8e": "lastBlock_v5Hash_uint256()", +"32ac752b": "matches(string)", +"32ace499": "getNextOrderPrice(address,address,uint256)", +"32aeaddf": "lockingPeriodInMonths()", +"32af5858": "behalfBet(address,uint256,uint256)", +"32afa2f9": "claimEtherOwner(uint256)", +"32b12eac": "setFallback(address)", +"32b182c3": "eligible(address,uint256)", +"32b1ad5a": "checkContructIsLocked()", +"32b28b95": "edoPerWeiDecimals_()", +"32b30b64": "calculateUnsoldTokens()", +"32b3c323": "anyoneEndICO()", +"32b431da": "setPlanetAuctionAddress(address)", +"32b45055": "EREEBERRY()", +"32b4623a": "shareCertificate(string,string,string,address,address,string)", +"32b4b5ed": "openProvider(bool,string,string,uint256,string,uint8,bool,address)", +"32b4d74c": "getNumRemainingSeats()", +"32b525bb": "beginMotion(address)", +"32b5b2d1": "missedVerificationSlashAmount()", +"32b65a95": "getSplitCount(string)", +"32b680d6": "payReceiver(address)", +"32b693b0": "PetCoin()", +"32b6f97a": "UXDToken()", +"32b7214e": "setNextSnapshotTime(uint256)", +"32b734b7": "awardsEnd()", +"32b85a44": "currentWeight()", +"32b8c086": "testSuperUser(address)", +"32b98616": "updateCardDetail(uint256,uint256,bytes32)", +"32ba36d6": "EtherShare()", +"32ba4b8b": "RANGEEND_5()", +"32ba65aa": "clearBalance(address)", +"32baa8d9": "existingCategory(uint256)", +"32bace54": "invest_cin(address,uint256)", +"32bafb2c": "withdrawMln(address,uint256)", +"32bb2c0d": "calc(uint256,uint256)", +"32bbb8cc": "mgrVotes(uint256)", +"32bbc1c8": "WEI_PER_USD()", +"32bc873d": "AZExchange(address,address,address,uint256,uint256,uint256)", +"32bc934c": "MILLION()", +"32bd8644": "MPYRefund(address,uint256)", +"32be9502": "getOwnerInAnyPlatformById(uint256)", +"32bf1def": "FACTOR_2()", +"32bf775d": "testControlTransferDisabled()", +"32bf9e5b": "AfricacoinToken()", +"32bfaa23": "initializeRefundableFundraiser(uint256)", +"32bfdc38": "ROC()", +"32c0c583": "setDenyPremium(bytes32,bool)", +"32c0f801": "tokenFacebook()", +"32c0fba5": "airDrop(address,address,uint256)", +"32c1eb82": "getActualRate()", +"32c22154": "livepeerToken()", +"32c26957": "isTimeout()", +"32c2ed9a": "inquire(uint256,uint256)", +"32c35352": "marketSale(uint256,string,address,address)", +"32c3de5d": "listCreatedTokens()", +"32c442d6": "Super87Coin()", +"32c468fa": "setPreFundingStartTime(uint256)", +"32c4903d": "getAllParents(bytes32)", +"32c514d5": "getJobDetailsIPFSHash(uint256)", +"32c66a9d": "Nome_vincitore()", +"32c6f294": "deadline120()", +"32c6f315": "exchangeIsRunning()", +"32c716b6": "dividendsAcc(address)", +"32c7de60": "_RamenCoin()", +"32c862ed": "inSalePeriod()", +"32c896d4": "REFERRAL_BONUS_LEVEL4()", +"32c9635b": "_getEthUsdPrice()", +"32c990b4": "getUserKeys(address)", +"32ca5587": "isWoidRegistred(address)", +"32ca966e": "toTileId(int32,int32)", +"32cae0a8": "userPoolFund()", +"32cb46e0": "totalContributedWei()", +"32cb6b0c": "MAX_SUPPLY()", +"32cb93d9": "getPaintingName(uint256)", +"32cba128": "_deleteShareholder(address)", +"32cc0105": "setAmountForDeal(uint256)", +"32cc6a9f": "modifyNextCap(uint256,uint256)", +"32cce1e4": "_unlockTokenByIndex(uint256)", +"32cd0487": "delist(address[])", +"32cd0b3d": "totalRemainSupply()", +"32cd3148": "CashmoneyToken()", +"32cd724a": "getStateStartTime(bytes32)", +"32ce92cb": "setFIRST_STEP_MULTIPLIER(uint16)", +"32cea83e": "birth(bytes)", +"32cee2eb": "getMinableSupply()", +"32cfbe90": "initialBalance(address)", +"32d05a53": "IdToAdress(uint256)", +"32d05c6d": "withdrawXPA(uint256,address)", +"32d0cf68": "setOutOfLimitAmount(uint256)", +"32d17917": "SPECIALIST_THREE()", +"32d1ae2e": "RepairCenter(address,address)", +"32d2e55c": "subSafe(uint256,uint256)", +"32d2fb9f": "getRefRemainingTime(uint256)", +"32d33cd0": "isRedeemed(uint256)", +"32d3725b": "burnStage(uint256)", +"32d3b711": "getPI_edit_29()", +"32d540af": "_clearExtraReceivers()", +"32d5fe98": "revealCampaign(uint256,uint256)", +"32d68fd5": "transferFeeNum()", +"32d69342": "terminateServer(uint256,uint8)", +"32d6eeb5": "changeQueryDelay(uint256)", +"32d72694": "updateGameTimes(uint256,uint8)", +"32d79689": "currentNiceGuyIdx()", +"32d80490": "Dandy()", +"32d8a3bd": "initCommunityReputation(address)", +"32d8eee5": "testFailSetNotUpdatableNotOwner()", +"32da1329": "setStartEndTime(uint256,uint256)", +"32da3fe3": "upgradeComponent(uint256,address,address)", +"32da57cf": "getTheStocksTokens()", +"32da7448": "amout()", +"32da7840": "isWhitelistAgent(address)", +"32dae2a5": "maxAmountICO()", +"32db8e2b": "MAX_RECEIVED_PER_PERIOD()", +"32dbc7d4": "NECPToken()", +"32dbeb21": "GoalMinimumReached(address,uint256,uint256)", +"32dc04aa": "changeBlockTimeAverage(uint256)", +"32dc2a01": "setmsgprcnt(uint256)", +"32dc9e81": "functionFive(uint256,uint256,uint256,uint256)", +"32dcb01c": "createBytes32s(bytes32[],bytes32[])", +"32dea130": "finishCrowdsaleMinting()", +"32deac1b": "setThirdBonusPercent(uint256)", +"32dee40b": "withdrawAllFunds(address)", +"32df3068": "clearKeys(uint256)", +"32df52aa": "LigmaToken()", +"32e07a20": "howManyEthersToKillContract()", +"32e12734": "addSpecialOffer(address,uint8)", +"32e1ed24": "updateAccountOwner(bytes32)", +"32e26d24": "CROWD_WAVE1_BONUS()", +"32e30e84": "INTERFACE()", +"32e43a11": "dummy()", +"32e43b5b": "PlayerTransported(uint256,address,uint256,uint256)", +"32e459b4": "LogFinalized(uint256)", +"32e45b8b": "guessTotalBeanOf(uint256)", +"32e54f72": "proxyPayable(address,string,string)", +"32e5535a": "ticketString(uint256)", +"32e5645d": "_computeNextArtworkPrice()", +"32e5905b": "film()", +"32e5d676": "c_priceRiseTokenAmount()", +"32e5e595": "getTimestamp(string)", +"32e62358": "_platformSupply()", +"32e70029": "MGCGameToken()", +"32e7179a": "MintedLocked(address,uint256)", +"32e7c5bf": "B()", +"32e7ecd8": "tierMin(uint256)", +"32e7f81f": "allocateLiquid(address,uint256)", +"32e94e81": "setPlayerEngineersCount(address,uint256,uint256)", +"32e991cf": "sellScale()", +"32e99708": "getMiningTarget()", +"32eb2314": "OraclizeQueryTest()", +"32eb2564": "initGame()", +"32eb5e44": "getaddtime(address)", +"32ec39a4": "mntpMigrationsCount()", +"32ec7a4e": "_emitDayLimitChanged(bytes32,uint256,uint256)", +"32ec991c": "ballotOf(uint256,address)", +"32ed3d60": "startPoll(uint256,uint256,uint256)", +"32ef78c4": "remove_scribe(address)", +"32ef8dfa": "previousDistribution()", +"32f04209": "evReleaseFund(address,uint256)", +"32f05fd1": "releaseAndUnlock(address,uint256)", +"32f07d01": "LogRedeemNET(address,uint256,bytes32)", +"32f16c74": "claimPepe()", +"32f2129a": "getBetArr()", +"32f23601": "setSubTourFreezingPrice(uint256)", +"32f289cf": "claimToken(address)", +"32f2bb50": "HouseInfoListing(address)", +"32f402c5": "createGrant(address,uint256,uint256,bool,bool)", +"32f46374": "create(string,address[],address,address)", +"32f58fc8": "retrieveRemainingCoinsPostSale()", +"32f5ea27": "UbiRewardToken()", +"32f637db": "createVesting(address,address,uint256,uint256,uint256,uint256)", +"32f6438b": "setCFO(address,bool)", +"32f72c27": "remove(int256)", +"32f72e39": "setSubmissionDeposit(uint256)", +"32f7470b": "DATE_31_DEC_2018()", +"32f76167": "isLockedWalletEntity(address)", +"32f76c11": "didTradePosition(bytes32,address,address,uint256,uint256)", +"32f7b41b": "setCCH_edit_29(string)", +"32f8290c": "returnMachine()", +"32f896af": "getSettingIdByTAOName(address,string)", +"32f8d1e4": "RockCoin()", +"32f8db38": "mainSaleMinEth()", +"32f8e034": "finalizeIcoDate()", +"32fac3a3": "listAddresses(bool,bool,bool,bool,address[])", +"32fb082f": "hasOrderedRobotParts(uint256[])", +"32fb5833": "AutomatedExchange()", +"32fb9860": "getSettledScoreAmount()", +"32fbe8d3": "setSavedBalance(uint256)", +"32fd8478": "artistCommission(uint256)", +"32fe334b": "totalEtherPaid()", +"32fe5afc": "setICOEthPrice(uint256)", +"32fefb4c": "add_account(address,address)", +"32ff6e21": "setAirDropToken(address)", +"32ffe442": "getExpectedPrice(address,address,uint256)", +"33007cdf": "deposit(address,uint152)", +"33012507": "addMemberInternal(address)", +"33016c6a": "FOUNDER_FUND_3()", +"3302363b": "_nextMonth1stDayTimestamp(uint256,uint256)", +"33026bb6": "addDeposit(address,uint256)", +"330278e0": "betPlaced(address,address,uint256,uint256)", +"3302ece0": "setStopDate(uint256)", +"33039d3d": "MAX_TOTAL_SUPPLY()", +"3305cf85": "weiToCap()", +"33065ac5": "firstTokenId(address)", +"330696c8": "PREMINER_CHANGED(address,address,address)", +"330738a3": "KetherHomepage(address,address)", +"3308ecf1": "coinanx()", +"3308f42d": "getPlayer()", +"33091bd2": "returnTokenBalance(address[2],uint256[7],uint8,bytes32[2])", +"33099beb": "theCyber()", +"330a4822": "_createOrder(address,uint256,uint256,uint256)", +"330aa207": "frozenAccountCoinByTime(address,uint256,uint256)", +"330ae38f": "disableAmbassadorPhase()", +"330ae7b3": "addUserBattleValue(address,uint256)", +"330c3fe5": "finalise(address)", +"330c4ce0": "burnedToken()", +"330ca427": "removeValidationPreSigned(address,bytes32,uint8,bytes32,bytes32,uint256)", +"330cbc75": "createEdition(uint256)", +"330d57f9": "maxbuyinQuantity()", +"330f412b": "MorphToken()", +"330f9588": "xrt()", +"330fb148": "setETHRateAgent(address,bool)", +"330fb4a3": "putEther()", +"330fd319": "MMTOKEN()", +"33102ff9": "openRoom(uint256,uint256)", +"33105218": "isVerifier(address)", +"331172f3": "getDisputeRoundDurationInSeconds()", +"33132860": "EcRecover(bytes32,bytes)", +"331350ee": "finishAllocation()", +"3313d27e": "verifyAllSigned(uint256,uint256[3],uint256[3],uint8[176])", +"3313d9bf": "bytesToString(bytes,bytes1)", +"3313e95d": "strcpy(string,uint256,string)", +"33140016": "feesByPeriod(address)", +"331450dc": "minerPreTime()", +"3314b33a": "BoardMeetings(uint256)", +"3314b62d": "AuPetitCoinToken()", +"3314c351": "Trade(address,uint256,address,uint256,address,address,uint256)", +"33158ba4": "openNetfRevenueRound(uint256)", +"331670c5": "getIsEnabled(uint256)", +"3316d122": "log(uint32,address,address,uint256,uint256,uint256)", +"331725b5": "callAndReward_0(string,string,uint256)", +"3317bbcc": "getLockedTokens()", +"3318d4a5": "incomeFees()", +"33195fca": "getApprobation(uint256,address,address)", +"3319bf1a": "upgradeGalleass(address)", +"331a6bf5": "setOwnerAddress(address)", +"331a72bb": "s7(bytes1)", +"331a72d1": "getRetractable(bytes32)", +"331a9d73": "availableSTCTokens()", +"331b6f66": "sizeOfAddress()", +"331c4594": "TalentICO()", +"331c55b4": "addTeamTimeMints(address,uint256,uint256,bool)", +"331c5d60": "LogSetName(string)", +"331d03d1": "BubToken(address)", +"331d8e5d": "unlock(address,address,bytes)", +"331e58a1": "adjustedRaised()", +"331e6b78": "setToNotForking()", +"331eac01": "SendPreReserved1()", +"331fbc1d": "tokensCreationMin()", +"331fef86": "bonusStrategy()", +"33210356": "setDelegadoDeDistrito(bytes32,uint256)", +"332129a7": "getJYPCBonus(uint256)", +"3321c76c": "RITUAL_COMPENSATION()", +"33223f1b": "materializeBalanceIfNeeded(address,uint256)", +"33228b9b": "E_AuctionFinished(address,uint256,address,uint256,uint256)", +"33232609": "blake2b(uint64[],uint64[],uint64)", +"33242b60": "getODEMClaim(address,bytes32)", +"332514d8": "totalT8EXSold_PRIVATE()", +"332559d3": "getcanuse(address)", +"33260fe7": "getInteractionPrice(address)", +"332659e0": "getBountyAddres()", +"33267961": "run2(uint256,bytes32[],uint256[],uint256,uint256,uint256,uint256)", +"3327057c": "Arina_judgment()", +"33271a3b": "getTokensPerWave(uint256)", +"33278aae": "setUntradeable()", +"3327f4fa": "setInstrumentRegistry(address)", +"33281815": "getRate(address,uint256,uint256)", +"33283e59": "usedReveralSupply()", +"33285fb4": "confirmAtkPlayerQuest(address)", +"33287446": "setMinTokensRequiredForMessage(uint256)", +"33289a46": "withdrawDeposit(uint256)", +"3328bd24": "lockAddress(address,uint256)", +"3328d3f0": "numberOfDates()", +"3328f396": "totalLevBlocks()", +"33291126": "_tavern(uint256)", +"332954c0": "YumeriumTeamWallet()", +"3329578b": "SpectrumNetwork()", +"33298e25": "invoke(uint256,uint256)", +"332a2219": "_goodAddress(address)", +"332ad859": "buyTokensBonus(uint256,uint256)", +"332ae26c": "test_insert_findNoHintUpdateHead()", +"332b0b34": "oraclize_randomDS_getSessionPubKeyHash()", +"332b3177": "totalTimelockedBeneficiaries()", +"332b9f06": "consumeNextOrderId()", +"332bb4c1": "approvalCallback(address,uint256,bytes)", +"332c26d6": "getSecretAtLevel(uint256)", +"332db078": "setTicketsPerPlayerLimit(uint256)", +"332e1a81": "getContributors(bool,bool)", +"332e25be": "getCCH_edit_19()", +"332ea814": "amIAgent()", +"332ea9ed": "VRCoinCrowdsale(address)", +"332eb83e": "steal_reveal(address,uint256)", +"332ec5f9": "unblockMember(address)", +"332efa80": "clearNewOwnerBid(address,uint256)", +"332f7acf": "amountCollected()", +"332f7d6e": "Lpktransfer()", +"332f93a9": "nextPayoutGoal()", +"332fa285": "nextGameMaxBlock()", +"332fa5bb": "ownerCountInt()", +"332ff6f9": "Buyin(address,uint256,uint256,uint256)", +"3330a6bd": "set_min_max_CWCsPerReturn(uint256,uint256)", +"3331f391": "giftAsset(address,uint256)", +"33324445": "changeClientCategory(address,uint256)", +"3332baa3": "PreSaleDeadline()", +"3332f720": "transfer_remaining_funds_to_project()", +"333432fe": "_withdrawBonuses(bytes32,uint256)", +"3334f1f8": "getAmountWithBonus(uint256)", +"3335aa78": "eRefund(address,uint256,string)", +"33360632": "getNumParameters()", +"33360978": "EndTime()", +"3336d5e5": "addABaddress(address,address)", +"33377f32": "turnOnFurnace(bytes32,bytes32,bytes32,bytes32)", +"33379137": "transferCoinToUser(address,address,uint256)", +"333885a0": "createBill(address)", +"3339451b": "fireDeliveryProposalEvent(address,uint256)", +"33397816": "withdrawAccountBalance(address)", +"3339f96d": "floaksAddress()", +"333a653e": "PeakAssetCoin()", +"333ab570": "WeiSent(address,uint256)", +"333abd90": "acceptKinTokenOwnership()", +"333aed82": "nextGameSettings()", +"333bfec5": "delegatedSignedEscrow(bytes,address,address,address,uint256,uint256,uint256)", +"333cfa14": "checkBlockMature(uint256,uint256)", +"333cffe5": "withdrawWithholding(uint256)", +"333dbda8": "paymentsInOtherCurrency(uint256,uint256)", +"333e1a72": "investorsLoses()", +"333e5180": "setOperatorPrivileges(uint256,address,bool)", +"333e99db": "isBlacklist(address)", +"333f55ed": "managerSelfRemove()", +"333f57b3": "contractStarted()", +"333f7f70": "changeFrozenStatus(address,address,bool)", +"33403a81": "_calculateWinner(uint256)", +"334191f7": "donatorReward()", +"3341b445": "proposals(address)", +"334249a7": "getProviderCountry(uint256)", +"334340d2": "EthCoin(address)", +"3343c18c": "AddBTCTransaction(address,uint256,uint256,bytes4)", +"334460a4": "createMetadata(bytes32,bytes32,bytes32,string,bytes32,bytes32,uint256)", +"3344e0b3": "WWW()", +"33455dd0": "PRICE_5()", +"3345854d": "NewGame(bytes32,bytes32,bytes32,address,uint256)", +"3345b65f": "listNextFourCards(uint128)", +"3345b784": "tokenSaleWeiMin()", +"33465c5f": "auctionStartTime(uint256)", +"3347d025": "teamUnlock3()", +"3348904b": "amountOfBets()", +"3348cad7": "_breedWith(uint40,uint40)", +"3348f537": "massClaimLimited(uint256,uint256)", +"33492138": "joinFraction(uint256,uint256,int16)", +"3349bc19": "nonActivationWithdrawal(address[2],uint256[7],uint8,bytes32[2])", +"334b8771": "AIRDROPBounce()", +"334b9f14": "initializeArray(uint256)", +"334c5997": "JavaSwapTest(uint256,string,string)", +"334cc3e5": "TimeDecayingTokenFactory(bool,address)", +"334d86bf": "getPI_edit_7()", +"334dc700": "CanaryV7Testnet()", +"334df120": "getBeneficiaryById(address,uint256)", +"334ef224": "testThrowsUpdateLatestRevisionNotOwner()", +"334ef43d": "tokensToCounter(uint256)", +"334f0611": "cnd()", +"334f22c7": "getUrl(bytes32)", +"334f45ec": "currentStepIndex()", +"334f5224": "bettorMap(address)", +"334fe638": "getProvisionCreditsRemaining(address,uint32,uint256)", +"33500e26": "bid(uint8)", +"33506115": "setPauseSave()", +"335094c2": "setPreICOEnd(uint256)", +"3350ae36": "fitCollectedValueIntoRange(uint256)", +"3350b915": "setDungeonPreparationTime(uint256)", +"3350c3ba": "BlockEstateToken()", +"33512aa9": "getUserReward(address,bool,bool)", +"33513739": "lowerCeiling(uint256)", +"335154ed": "setRateSteps(uint256[],uint256[])", +"3351886e": "getFilm(uint256)", +"3351ee19": "donatePurchase(uint32)", +"33533e84": "NeterContract()", +"33545d48": "setIdentity(address,address,string)", +"3354741a": "eveFromEth(uint256,uint256)", +"335494a4": "getMintingPowerById(uint256)", +"3354d682": "destroyVoxel(uint8,uint8,uint8)", +"335611d9": "makeOrder(uint256,address,address,uint256,uint256)", +"3356294b": "setAyantDroitEconomique_Compte_3(uint256)", +"335665c4": "canBuyCompany(bytes32)", +"3357162b": "initialize(string,string,string,uint8,address,address,address,address)", +"335721b0": "NewResolver(bytes32,address)", +"33575f64": "buyRank(uint256)", +"3357db75": "SALE_ENDED()", +"33580959": "poolFees()", +"33588dfa": "doCalculateRoom(uint256,bytes32)", +"3358d2d3": "buildDSTokenFrontend()", +"33592a1f": "getProviderById(uint256)", +"335a6b7d": "Wicflight()", +"335aa61a": "setMaxPrizeOneDay(uint256)", +"335ae0cb": "GetEscrowBalance()", +"335b496e": "totalTransfersInSchedule()", +"335b52f2": "initGameAt()", +"335b61e8": "enableArea(string)", +"335b7c13": "phase5EndBlock()", +"335b942a": "arbitrateC4FContract(address,uint8)", +"335c8b63": "packPrice()", +"335d43a3": "Kubera()", +"335e8067": "tricklingSum()", +"335eb60f": "getCoursesLength()", +"335f463d": "DVChain(uint256,string,string)", +"335f5642": "getinfowin(address,uint256)", +"335f9303": "PunchToken()", +"335fba7e": "calculateRedeemReturn(uint256,uint256,uint32,uint256)", +"336077c3": "getApprovedBuyer(address,address)", +"3360ac90": "transferByOwner(uint256)", +"3360caa0": "publicSaleStart()", +"336120fe": "removeTokenList(address,uint32)", +"336137c8": "updateMember(address,uint256)", +"33613cbe": "getBondBalance(address)", +"33637d5a": "getPendingBlock(uint256)", +"33641775": "change_sale_address(address)", +"336481d4": "dSetCommunityBallotsEnabled(bytes32,bool)", +"3365aa3b": "description2()", +"3365d358": "addContractAddress(address,address)", +"336634bb": "MASIKIToken()", +"3366eeb2": "getLockedToken()", +"33670c1c": "SupportsInterfaceWithLookup()", +"33677c30": "recycling(address,uint256)", +"3367aeb2": "maxPVB()", +"33683ec6": "safeHolderOf(uint256)", +"3368a120": "dividendBalance()", +"3368db4f": "DCE_Coin()", +"3368e968": "init(bytes32[])", +"336989ae": "customers(address)", +"3369c33d": "pregnantDogs()", +"3369c3b6": "ReturnEthersFor(address,uint256)", +"3369dace": "flipTheCoinAndWin()", +"336abddc": "allocateCash()", +"336b739a": "setCovmanager(address)", +"336b9f80": "updatePublisherFee(address,uint16)", +"336c6d39": "setPrizePool(address)", +"336c9b97": "_updateEditionTypeLookupData(uint256,uint256)", +"336ce69e": "CyberyTokenSale()", +"336da059": "MAX_TOTAL_TOKEN_AMOUNT_OFFERED_TO_PUBLIC()", +"336e24aa": "getQuestionAnswerCount(uint256)", +"336fa72c": "addTransferableAddress(address)", +"3370204e": "enter(bytes8)", +"33705526": "p5()", +"337176cd": "getVideoGameItemOwner(uint256)", +"337188d9": "secSaleSpenderTxDetails(uint256)", +"33722c47": "testGetLawyerAtIndex()", +"33731c04": "plxToken()", +"3373739b": "usedTokens()", +"33739483": "etlContract()", +"33751fec": "WeatherToken()", +"33756534": "LogVote(address,bool,uint256)", +"33759ee1": "CrowdSaleTokenPurchase(address,address,uint256,uint256)", +"3375e38a": "CreatedBlock(uint256,uint256,uint256,address,bytes32,bytes32,bytes32,bytes32)", +"3376887a": "test_oneValidEqInt2()", +"3376e2dc": "callDividendAndUserRefund()", +"33771860": "setGoldContract(address)", +"337748b8": "StartFuseaNetworkDistribution()", +"3377f212": "set4RoundTime(uint256)", +"33783b9e": "PapaToken()", +"3378eb29": "ElectricQueue(address)", +"33791c36": "Fundraiser(address,address)", +"3379d7a3": "greedyowner()", +"337a693c": "AkiCoin(address)", +"337a8cdb": "allowMoveTokens()", +"337b1cf9": "setIpfsHash(bytes)", +"337b5988": "testSimpleNameRegister()", +"337b68ba": "takenProfit()", +"337bd656": "HashSolved(address,string,bytes32)", +"337c1e28": "getIndexRoot(bytes)", +"337c445d": "increaseWordSize(string)", +"337cc706": "transferContract(string,string,string,string,string)", +"337d2aea": "PHASE3_START_TIME()", +"337f4c46": "gameDeveloper()", +"3380104a": "Streamity()", +"3380c0d8": "cancelTransaction(uint256)", +"338116b0": "checkContract()", +"3381ffe0": "transferTrusteeOwnership(address)", +"338246e2": "minSwapAmount()", +"3382ac57": "customCreateTokens(address,uint256)", +"3382ddab": "tokenBurnAddress()", +"33833037": "allBalance()", +"33835161": "setConfig(uint256,uint256,uint256,uint256,uint256,uint256)", +"3383e335": "LogTake(bytes32,bytes32,address,address,address,address,uint128,uint128,uint64)", +"33840712": "checkImageInput(address[16],uint256,uint256,uint256[],bool,bool)", +"338410f2": "setUnicornBreeding(address)", +"33848008": "newDepositWallet(address)", +"33849e55": "voteOnSolution(uint256,uint256,bool)", +"3384d2af": "PARKToken()", +"3384e128": "soldSS()", +"33862708": "changeServiceAddress(address)", +"33862914": "SOYA()", +"33863ed9": "order(uint256,uint256)", +"3387e52f": "LLV_311_EDIT_3()", +"33882479": "multiplyDecimalRound(uint256,uint256)", +"3388e429": "ecrecoverDecode(bytes32,uint8,bytes32,bytes32)", +"3388fa72": "Duranium()", +"33893071": "checkMyWithdraw(address)", +"3389f273": "setManyAllocations(address[],uint256)", +"338a0261": "rhi()", +"338a1379": "_setPackedBlockNumber(bytes20,uint256)", +"338a63a4": "_createKitty(uint256,uint256,uint256,uint256,address)", +"338b5dea": "depositToken(address,uint256)", +"338bfcd6": "refundTokensPresale(address[])", +"338cdca1": "request()", +"338d43f6": "_decrementTokenBalance(uint16,uint16,uint8,address,uint256)", +"338dbf59": "startPrivateSale()", +"338dfafa": "HVNToken()", +"338e22ff": "ProcessablesMock()", +"338e4fd6": "setTokenForSale(uint256,uint256,bool)", +"338e579e": "tryFinalize()", +"338e93d1": "active_dividend(address)", +"338ed326": "createCustomCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address,uint256,address)", +"338ef191": "GetBetGamblers(uint256)", +"338f3039": "amountAvailableToWithdraw()", +"338f43a0": "getReservedTokensListValInTokens(address)", +"338f4ad6": "withdrawMineralTo(address,uint256)", +"338f4dd9": "limitTier2()", +"338ff5e3": "updateInvested(uint256)", +"33902973": "createReserveTokensVault()", +"33904cb1": "MasterNet(uint256,string,string)", +"33905d41": "highFunding()", +"3390e6c7": "getIsSecondPhaseBySoldedTokens()", +"33911763": "greenshoeActive()", +"3391c265": "transferManagment2(address)", +"33920f65": "getEarliestPosition(address)", +"33921b2c": "DEXHIGH_V1()", +"339282b7": "isRegisteredAuthority(address)", +"3392f927": "hasConverted(address)", +"3392ffc8": "testExp(int256,int256,uint256)", +"3393385f": "disableUpdates()", +"3393780f": "DdosMitigation()", +"3393b069": "nothingLib2()", +"339594f9": "logMarketMailboxTransferred(address,address,address,address)", +"3395dc70": "acceptTransfer(address,address,uint256)", +"33966cb6": "_bid(uint256,address,uint256)", +"33967c74": "isZero(bytes32,string)", +"3396c405": "tokensAreLiquid()", +"3396c780": "b21TeamTokensAddress()", +"3397c60a": "getpubprize()", +"3397ca17": "numBalanceRecords(address)", +"3397d5d5": "setTokenPrice(uint8)", +"33985caf": "Exera()", +"33989396": "requestNewEtherRealID(string,string,string)", +"339a7670": "mineToken(uint256)", +"339a95f6": "secondCrowdSaleEndDate()", +"339ab6f2": "getPurchaseAmount(address)", +"339ac174": "playerSurrender()", +"339b6b39": "isRevokedBefore(bytes32,uint256)", +"339cfb9a": "isHolderAddress(address,address)", +"339e23d1": "ownerVote(bytes32,uint256,address)", +"339e2604": "setPayBackRate(uint256)", +"339e2c45": "isRegisteredToFirm(string,address)", +"339e9550": "_sendReward(uint256)", +"339f890d": "setMinBlockPurchase(uint256)", +"339fd959": "getLockAmount(address,address)", +"339ff96d": "transferCommitment(address)", +"33a02a6d": "openLandEthSale()", +"33a02c22": "betAdded(uint256,uint256,address,uint256)", +"33a263e6": "peggedSymbol()", +"33a27f75": "estimateNextPotSeedAmount()", +"33a3b654": "managementAmount()", +"33a3d023": "finalizationCrowdsale()", +"33a3e669": "setClientLastPaidRate(address,uint8)", +"33a4ec8d": "NCMToken(uint256,string,string)", +"33a581cd": "createPeerWallet(address,address[],address[],uint256[])", +"33a581d2": "MAX_UINT256()", +"33a5bae4": "verifyTx(uint256[2],uint256[2][2],uint256[2],uint256[5])", +"33a5ec7e": "changeTokenAmount(uint256)", +"33a738c9": "_executeTransfer(address,address,uint256)", +"33a7d2e3": "BONUS_DURATION_2()", +"33a8319e": "EtherJob()", +"33a87ade": "gasInTokens()", +"33a8c45a": "contact()", +"33a8dc1d": "nextPack(uint256)", +"33a9824a": "PopulStayToken()", +"33a99e04": "selectWinner()", +"33aac4aa": "BaseModule()", +"33ab0541": "setBaseLevelUpFee(uint256)", +"33ac2009": "countValidations()", +"33ac67c3": "ShowChargeCount(address)", +"33ac7256": "getParent(bytes32,uint256)", +"33ad846d": "getStringValue(string)", +"33ad9495": "WithdrawPotShare()", +"33adb264": "invokeTop()", +"33ae6e19": "distributeTimelockedTokens(address,uint256)", +"33ae7166": "tier4()", +"33ae88ad": "numberOfKingdoms()", +"33af060f": "accountInGoodStanding(bytes32)", +"33b0f7f7": "paidCreateWikiPage(string,string,string,uint256)", +"33b1503d": "PostWish(address,uint256,bytes,bytes,uint256,uint256)", +"33b16d93": "determineWinner()", +"33b186c1": "AdvisorsPartnersAmount()", +"33b19417": "NodeManager(address[])", +"33b1f812": "totalPromotions()", +"33b37915": "setOrderEnd()", +"33b3dc04": "castVote(string,uint8)", +"33b416db": "BaseICOToken(uint256)", +"33b56638": "testGetAllLawyers()", +"33b58484": "WEEKS_104()", +"33b5b62e": "minPurchase()", +"33b5fa75": "buyTokensWithRef(address)", +"33b6baf5": "developerAddr()", +"33b7d187": "getDCategory(bytes32,uint256)", +"33b85b73": "modifyCommunityRates(uint256,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)", +"33b8b1c1": "transferInt(address,address,uint256,bool)", +"33b8c29d": "updatePriceOfEth(uint256)", +"33b91db5": "GetTocPrice()", +"33b9d3f4": "_buyCoins(address,uint256)", +"33ba2ef9": "hipstermasterReq()", +"33bb70ee": "getCoinAge()", +"33bbae93": "end_date()", +"33bc1c5c": "publicSale()", +"33bc6283": "TruReputationToken()", +"33bd8036": "addressPayableFunc(address)", +"33bd943e": "abandonListingService(uint256)", +"33bebb77": "forceTransfer(address,address,uint256)", +"33bfaf4e": "MickeyToken()", +"33bffccc": "openPreSale()", +"33c023ef": "doInvestment(uint256,address,string,uint256,bool)", +"33c1420a": "raffle()", +"33c24bd3": "accountIds(uint256)", +"33c4a1d6": "SetScndOwner(address)", +"33c5da42": "setGaspriceMax(uint256)", +"33c6c1af": "setCentralAccount(address)", +"33c6cdd3": "modifyRatePlan(uint256,string,bytes32)", +"33c724ee": "setLosers()", +"33c74e79": "participantContribution(address)", +"33c77a6d": "pauseICO()", +"33c7b38f": "withdraw_to_eti()", +"33c7c026": "feePayment()", +"33c7d1cc": "restart(bool)", +"33c84990": "setNewClaimer(address,address)", +"33c8adce": "enterLeague(uint256[],uint256,bytes)", +"33c90632": "createTransferAuction(uint256,uint256,uint256,uint256)", +"33c91611": "safePay(uint256,uint256,address,bytes)", +"33c9b83c": "preIcoSoldTokens()", +"33c9ccf5": "isKeyOwner(bytes32,address)", +"33c9f271": "get_project_information(uint256,address)", +"33ca4773": "getBrandData(address)", +"33ca55d7": "requestTransferChildrenOwnership(address)", +"33caaa43": "tokenRewardContract()", +"33cbee23": "teamTwoDivsTotal()", +"33cc4f9f": "FIDAToken()", +"33cc9c3e": "getLuckyPendingSize()", +"33cd3383": "investmentsOf(address)", +"33cd7ede": "totalJackpotOdd()", +"33cdfc76": "accountOf()", +"33ce1cda": "JSJC()", +"33ce724a": "sendSoldTokens(address,uint256)", +"33ce7787": "transferInvestorAccount(address,address)", +"33ced321": "genLevelExp()", +"33cf3ca0": "icoDeadline()", +"33cf58f9": "Accepted()", +"33cfc5e3": "DEFToken()", +"33d020ae": "getManifestId(address,bytes32,bytes32)", +"33d072e2": "processFunds(address,uint256,uint256,bool)", +"33d0a56b": "Melt(address)", +"33d14097": "DoRollEvent(address,uint256,uint256,bool,bool,bool,bool,uint256,uint256,uint256)", +"33d1e5b9": "lockupAccount(address,address,uint256)", +"33d24dc4": "setTypeAdvantages()", +"33d2cea2": "getDiceWinAmount(uint256,uint256,uint256)", +"33d34bad": "nextlotnr()", +"33d52c71": "ico3Cap()", +"33d58ca6": "F2UToken()", +"33d59f0a": "setJobStatus(uint256,uint8)", +"33d5d29b": "containsOperator(address)", +"33d5e4ca": "LogErrorMsg(string)", +"33d634df": "getSpinResults(uint256,uint256,uint256,address)", +"33d63869": "icoReserveSupply()", +"33d64a6f": "Start_Resume_ICO()", +"33d6c065": "PenCrowdsale(uint256,address,address)", +"33d764a2": "transferPreSigned(bytes,address,uint256,uint256)", +"33d9529a": "Totalbalance(address[])", +"33d97457": "GRAPE_SECS_TO_GROW_VINE()", +"33da67a0": "setForceNsfw(uint16[],bool)", +"33daaa5e": "setMakerFeeRate(uint256)", +"33db82fd": "outToken()", +"33dd1b8a": "setAllowed(address,address,uint256)", +"33dd5fb8": "TransferAntique(bytes32,address,address)", +"33dddc3a": "openLootbox(address)", +"33de06d5": "changeEscapeHatchCaller(address)", +"33de61fb": "Marvin()", +"33de96c6": "cancelTransaction(address)", +"33decdc6": "returnVolAdjuster(uint256)", +"33df4155": "setSPARCAddress(address)", +"33dfc93c": "untokenizePosition(bytes32,address)", +"33dfe91d": "isDefValueInRange(uint8)", +"33e06ee7": "buyTokensAtRate(address,uint256)", +"33e11ec4": "getBcouponTransferCost()", +"33e13ecb": "Execution(uint256)", +"33e2df5c": "newTeamCreated(bytes32,bytes3,bytes3,bytes3,bytes3,bytes3,bytes3)", +"33e2df5d": "isTokenValid(string)", +"33e335a0": "fromPaymentGateway(address)", +"33e364cb": "resumeSale()", +"33e36c50": "FundsLoaded(uint256,address)", +"33e3e86a": "isValidSan(string)", +"33e5bce1": "allow_spend(address)", +"33e663a4": "BonusEarned(address,uint256)", +"33e665eb": "setMonsterAuctionAddress(address,address)", +"33e67012": "disableChain(uint256)", +"33e712fe": "functionEight()", +"33e747b3": "setCapAtWei(uint256)", +"33e7ed61": "submitPool(uint256)", +"33e7fb97": "modifyExecutorAddr(address)", +"33e85eac": "get_king_price()", +"33e8b084": "dePesoToken()", +"33e8b8ac": "setFounderAllocation(address,uint256)", +"33e8df7e": "get_property_address(uint256)", +"33e90f98": "migrateMntp(string)", +"33e9698c": "tokenIssueDeadline()", +"33ea3dc8": "getTransaction(uint256)", +"33ea7a2b": "setBundinha(string)", +"33ea80cb": "getProposalUint(int256,uint256)", +"33eb5564": "mid(uint256,uint256,uint256)", +"33eb647f": "ECNcoin()", +"33ee2297": "MintedGrey(address,uint256)", +"33eeb147": "isFrozen()", +"33ef5698": "setShareTradingEnabled(uint256,bool)", +"33f0779d": "sendWhitelistReferralRewards(uint256)", +"33f08327": "generate_paymentID(uint256)", +"33f1da25": "BiQToken(address,address,address,address)", +"33f1dfb5": "withdrawTokenByAdmin(address,uint256)", +"33f2da95": "test_insert_findWithHintNextUpdateTail(int256)", +"33f2e7f8": "takeOffer(uint256)", +"33f30a43": "getNarco(uint256)", +"33f3197e": "Bet(uint256,string)", +"33f327be": "FeemCoin()", +"33f3344c": "readQuantity(address,uint256)", +"33f35c40": "webdToken()", +"33f37304": "tTokens()", +"33f44026": "mintFoundingTeamTokens(address,uint256)", +"33f4406a": "addressCommunity()", +"33f472b9": "MPO()", +"33f50b1c": "extendICO()", +"33f707d1": "ownerWithdraw(uint256)", +"33f7c9fe": "UsersList()", +"33f8845d": "GetTotalRigCount()", +"33f88d22": "mintOwner(uint256)", +"33f8e8c7": "getUserTokenInfosLength()", +"33f9942b": "awardPoint(bytes32)", +"33f9b36f": "getIcoStartDate()", +"33fa59f0": "creationProfit()", +"33fb1e05": "withdrawChamp(uint256)", +"33fb9e35": "killSelf(uint256)", +"33fba1ed": "_getFightData(uint32)", +"33fbff32": "setSaler(address)", +"33fc56d9": "withdrawUnclaimed()", +"33fc5f47": "proposePurge(address,bytes32)", +"33fc6367": "updateRefundState()", +"33fcffa8": "Option(uint256,uint256,string,string,string,string,string,string,bytes32,address,string,address,uint256)", +"33fd066d": "doBalanceFor(address)", +"33fd40ec": "oraclize_query(string,bytes[4],uint256)", +"33fd9397": "buyBackPriceWei()", +"33fdb097": "BTSC()", +"33fdbbe5": "DECIMAL_FACTOR()", +"33ff588d": "ownerChangeRunning(bool)", +"3400a6dd": "crowdsale(uint256,uint256,uint256)", +"3400d00d": "PayTokens(address,uint256,uint256)", +"3401c277": "subtractAmount(address,uint256,uint256,uint256)", +"3402b841": "closeVoteCommitPhaseIfAllowed(address,bytes32,bytes32)", +"34032f4f": "teamSupply12Months()", +"3404ab6a": "calcEthersToTokens(uint256,uint8)", +"3405321d": "_setPrice(uint256,uint256)", +"34057a45": "rollAddress()", +"3405ae40": "setMaxSubscribers(uint256)", +"3405deed": "alwaysReverts(uint256)", +"34065b66": "getSmallBonus()", +"3406784d": "arbitrateC4FContract(uint8)", +"3406956a": "bountyTokenFund()", +"340695c0": "PRESALE_RATE()", +"3406e3fb": "singleTransGasCost()", +"340700e5": "Satochi4()", +"34075cbd": "proposalStatuses(uint256)", +"34083a28": "HoneyToken()", +"34085549": "buildAt(uint256,uint256,uint256)", +"340867a0": "setMiniPoolEdit_1(string)", +"3408f73a": "getStorage()", +"340955fc": "isNotDuplicateMembers(bytes32)", +"3409952b": "setStorageInterface(address)", +"340a247c": "getQueryCost(string)", +"340a773a": "LockedToken(uint256,string,string)", +"340adb29": "getExportingParty()", +"340dc485": "addEmailHash(uint256,address)", +"340ddda6": "MeatConversionCalculator(uint256,uint256)", +"340df28f": "finishUpgrade()", +"340e47f8": "activateStore(string,bool)", +"340e4fd5": "totalRequestsAmount()", +"340ea558": "isFavorEscrow(uint256,address)", +"340f4fea": "setBetExpirationBlocks(uint256)", +"340f5920": "winningTicketNumber(uint256)", +"340f5e4e": "get_all_num_levels()", +"340fef94": "MMMbCoinCrowdsale(uint256,uint256,uint256,address,address,address,address)", +"34100027": "withdrawLegalContingencyFunds()", +"34103ee4": "setCrowdsaleAgent(address)", +"3410452a": "getRequestsCount()", +"34106c89": "updateRenExTokens(address)", +"34107282": "signer1()", +"3410cbd5": "layersRec(uint256,uint256)", +"3410eb5b": "userRefundTo(address)", +"3410fe6e": "DIVISOR()", +"3411231c": "ANXToken()", +"341176d6": "crowdsaleManager()", +"34119d15": "setSellFeeBps(uint256)", +"3411c81c": "confirmations(uint256,address)", +"3411cb08": "getFreelanceAgent(address)", +"34122952": "build(uint256,int256,int256,uint8)", +"34127649": "JvaToken(address)", +"3412a15c": "testConnection()", +"3412a4ac": "setFundingEndTime(uint256)", +"34133df9": "TR()", +"341367ec": "getMaxCAP()", +"34140748": "_upgradeTo(address)", +"34145808": "totalRewardToken()", +"3415650e": "buyStatus()", +"3415bdd4": "buyAKeyWithDeposit(uint256,address,uint256)", +"3416f9d4": "subtractSafely(uint256,uint256)", +"34174331": "selfHybridization(uint256,uint256)", +"3417f8d3": "addHolder(address,uint256,uint256)", +"341855bf": "HappyBirthdayToken()", +"341881e6": "endPreIco()", +"34190567": "DebugInt(int256)", +"341912ad": "SOCIALXBOUNTY()", +"341b96c2": "WalletAddressChanged(address)", +"341b9cc2": "ValueToken(uint256,string,string)", +"341bae0e": "refBonusPercentAtNow()", +"341bcbc1": "endIco2()", +"341c3304": "presaleTokensSold()", +"341cc817": "preicobrandingWallet1Pct()", +"341ceb42": "updateAmountOfEachChoice(uint256,uint256)", +"341f13f2": "authorizeDeploy(address)", +"341f5ee2": "omsairam18()", +"341f6623": "toAddress(bytes32)", +"3422e048": "getFirstTokens()", +"3422ede1": "Vault(address,address,uint256,uint256,address,uint256)", +"3422f709": "totalSencCollected()", +"34231e72": "getMyTransferredWine()", +"342368e4": "SubFromDividends(uint256)", +"3423a768": "finalizePreICO(uint256)", +"342442bd": "lockTeamAndReserve()", +"342454c7": "isDigit(bytes1)", +"34247b9b": "changeDBAddress(address)", +"34253af5": "isICORunning()", +"34256ab2": "createQuote(uint256,bytes32,bytes32)", +"34265c48": "releaseTime(address)", +"34273351": "withdraw2(uint256)", +"34289460": "cleanupTo(address)", +"3428e7ba": "checkForNewDay()", +"342930aa": "peekHatch()", +"342b7e71": "setTokenList(address[])", +"342b88ba": "setIcoTier(uint256)", +"342ba8de": "getGen0IVs()", +"342bd327": "GenesisRewardPerBlock(address)", +"342c17cd": "finalReserveAllocation()", +"342ca5d6": "pricePointsLength()", +"342d9185": "pricePerTokenAtCurrentTier()", +"342d9a04": "challengeClearing(bytes32)", +"342e0260": "gettruelevel(address)", +"342e515c": "Electrium(uint256,string,uint8,string)", +"34302882": "ETY(address)", +"34302d82": "midTimeBonusLimit()", +"34306cb8": "placeMessage(string,bool)", +"34309e97": "tokensOwner()", +"3430f7b1": "TitleAdded(uint256,address,uint256,string,string,string,uint256)", +"3431024f": "disApproveUsers(address[])", +"3431a0be": "RegisterSeller(address,string,string,string,string)", +"3432000c": "kittiesContract()", +"343214ae": "isFundFreezePeriodEnded()", +"34334e9e": "removeBlacklistedUser(address)", +"34335c01": "getPresale2()", +"343458e2": "withdraw(uint256,bytes32,address,uint256)", +"34354f93": "ABC()", +"3435dea2": "PoolJoined(uint8,uint8,uint256,uint256)", +"3435e5f3": "newChief(address,uint256)", +"3435ea80": "adduser(address,uint256)", +"34364afa": "modifyICOStartDate(uint256)", +"34376542": "OwnerUpdate(address,address)", +"34376ca0": "authorizeBurner(address)", +"3438c758": "DelayedPayments(uint256,uint256,uint256)", +"34399ea8": "considerCurrentInterest()", +"3439b433": "RSPLT_E()", +"343a875d": "getUint8()", +"343a8d56": "Lucky888Token()", +"343aad82": "flow()", +"343ab4cd": "getMiningPoolAddres()", +"343ab68b": "getFreelancerContractsCount(address,address)", +"343bd7eb": "insertOwner(address)", +"343c018b": "GarudaToken()", +"343d5048": "FighterCore()", +"343dbeb6": "isServiceRemoved(address,uint32)", +"343dfb7e": "referralPercent()", +"343efc6c": "WorthlessToken()", +"343f3acb": "GetAllBetIDs()", +"343f40a0": "testFailCreateSameItemId()", +"343ff8c7": "deductshares(uint256,address)", +"3440465e": "addElement(bytes32)", +"34406f33": "sha3Docs(bytes32)", +"344090f2": "Ownable1()", +"34409e38": "_generateNewSaddle(uint256,uint256,uint256,address)", +"3441ecf2": "Calculator()", +"34428440": "tokenExchangeRateMile1()", +"3442a868": "getBtcForkCoins()", +"3443c64a": "changeEEMWallet(address)", +"3444189b": "newKudosPoll(string,string,uint8,uint256,uint256,uint256)", +"34452f38": "disableMint()", +"3445679a": "USDto1ETH()", +"34457cbe": "ExponentialDecayingTokenFunction()", +"344605f4": "ETFloorPresale(address)", +"344615ab": "unSell()", +"3446bac4": "retirarDividendos()", +"34475d8d": "getERC721Addrs(uint256)", +"3447a7ef": "addInWhiteList(address)", +"3448348d": "getEventSize()", +"34484b47": "functionSix()", +"34486434": "ConsentFactory()", +"3448c7d6": "createHistory(bytes,address,address)", +"3448ec4a": "checkMatchBatch(address,uint256[16])", +"344929e4": "CTS(uint256,string,string)", +"3449387b": "GetFileLocation(bytes32)", +"3449f61c": "_getBonus(uint256,uint256)", +"344b8386": "firstYearPeriods()", +"344bcc7d": "signedTransferFrom(address,address,address,uint256,uint256,uint256,bytes,address)", +"344bcd7d": "allCrowdSaleTokens()", +"344c0dd5": "newChamp(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,address)", +"344c5ea1": "Mino()", +"344c5fd6": "firstPeriodOfICO()", +"344cc2b8": "getAllBidsByAdunit(uint256)", +"344d1ef2": "getCarSelling(uint32)", +"344d9576": "ReinvestWallet()", +"344e23cf": "previligedBalanceOf(address)", +"344eca75": "amountRaisedICO()", +"345006b6": "getGenerationForCall(address)", +"34501134": "get_pre_kyc_bonus_denominator(address)", +"34516038": "getSellCount()", +"34523cbc": "numberOfWhitelists()", +"3452f51d": "push(address,uint128)", +"345393f0": "getOuLianPublicAddress()", +"34552a0a": "RegisteredContract(string,address)", +"34553a44": "getRequiredSubscribers()", +"34556035": "icoCompleteB()", +"345591ec": "inDistributionMode()", +"345607ab": "StoreProofOfUplinePaid(address,address,address,address,address,address,address,uint256)", +"34574ff3": "XFMSold()", +"345899fe": "addRoles(bytes32[],address,address)", +"34592491": "infoWithdraw2()", +"345942c8": "revealBet(address,string)", +"3459b1af": "SaleNew()", +"3459d2ba": "getTilePriceAuction()", +"3459fb6f": "unpack_data_groups(int256[],bool)", +"345a1ae4": "LASTTRIAL123()", +"345a3899": "Insurence()", +"345a4423": "win(uint8)", +"345a5fe4": "addRecoveryAddress(address,uint8)", +"345a8e5b": "uint2bytes(uint256)", +"345ac602": "fixAmount()", +"345b256a": "projectStorageVault()", +"345b3d3a": "newOrder(address,address,string,string,uint256,uint256,uint256)", +"345bc544": "maxAllowedBetInTokens()", +"345c8fca": "setFreezeTx(address)", +"345cad7e": "useItem(address,uint256,uint256)", +"345d116f": "LotteryRoundWinner(address,bytes4)", +"345da007": "setClassName(uint8,string)", +"345e2f91": "transferEarningsToOwner()", +"345e3416": "adminRetrieveDonations()", +"345efa4e": "CurrenseeCrowdsale(uint256,address,address)", +"345f342e": "concludeVoting(uint256)", +"345f58b2": "AcceessoryWrapper721()", +"34610182": "getFuelsIds()", +"34615bef": "_discipleVendPrice(uint256,uint256)", +"3461a5e8": "ARCO()", +"346223f5": "Cocoon(address[],address,address)", +"3462f32d": "execWithGasLimit(bytes32,bytes32,uint256,uint256)", +"3463934b": "Bqt_Token()", +"3463c5c7": "patentValidTime()", +"3463d76d": "databaseDownloadUrl()", +"34646163": "getDataset(address,uint256)", +"3464af6a": "testCopyAddress(address)", +"3464e4da": "grantTokensCommonPool(address,uint256)", +"3465d6d5": "record(address)", +"346692b7": "tokenKeys(uint256)", +"3466f07f": "DRAKE()", +"34686b73": "numberOfAddress()", +"346896c0": "getMinerLv1(address)", +"3468b4a8": "OxTokenInitialized(address)", +"3469a55b": "getDepositID(address)", +"3469acbb": "initCard2()", +"3469f6e2": "finalizeRound(uint256)", +"346a2f9e": "percentBank()", +"346a37d2": "markComplete(bytes32)", +"346b306a": "oraclize_query(string,string,string)", +"346b783c": "refundToPlayer(address)", +"346b7939": "icoReservedSupply()", +"346bfd9f": "eventBurn(address,uint256)", +"346c1aac": "getNextAvailableBond()", +"346c95df": "SuNFT()", +"346c96e9": "addFund(uint256)", +"346cabbc": "scheduleCall(address,bytes4,uint256,bytes,uint256)", +"346cf356": "tradeCards(address,uint256)", +"346e8cea": "allCarsInfo()", +"346e9a26": "getCanWithdraw(address,uint256)", +"346f2eb7": "set_bonus_received(bool)", +"346f5991": "sendTokensToTeamLock(address)", +"346f8827": "addWineryOperation(bytes32,address,string,string,string,uint256,uint16,string)", +"346f9f95": "collectAddr()", +"346fc0dd": "maxCrowdsaleSupplyInWholeTokens()", +"346ff6b3": "getNumRounds()", +"346ffa4b": "changeValues1(bool,bool,bool,bool,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"34701db8": "totalTicketsSold()", +"34705c2f": "validateTransferAmount(address,uint256)", +"3470b833": "blackListERC223(address)", +"34716f67": "post(string,bytes20[])", +"3471728a": "masterContractAddress()", +"3471aef0": "handbreak()", +"3471b034": "Submission(uint256,string,address,address,uint256,string)", +"34721e08": "test0Alice()", +"3473bf30": "setEndingTime(uint256)", +"3473f5e4": "HashOfDB()", +"34746d86": "killTokensForGPower()", +"347518c7": "validPurchaseTime(uint256)", +"34757fa9": "correctPreICOPeriod(uint256)", +"34758cb3": "currentEggPrice(uint256)", +"3475c1e7": "attemptPublishOfArticle(uint256)", +"34762a94": "ethHandleIsRegistered(bytes32)", +"347632e8": "getShareholderAdressByID(uint256)", +"34763586": "FoundersAndPartnersTokensIssued(address,uint256,address,uint256)", +"347637b3": "setBDApprove(address,uint256,bytes32)", +"34766ecc": "PauseOff(uint8)", +"3476aeb0": "signer2_proposal()", +"34771f81": "setData_5(string)", +"34776c6e": "DEAToken()", +"347820eb": "previousUpdateTime()", +"34785e79": "setEthRelief(address)", +"34786d1d": "totalTokensToTransfer()", +"3478ab86": "HYToken()", +"3478ac2b": "createShow(uint256)", +"3478dc44": "getRecordOffers(bytes32)", +"3479101f": "setProviderSupply(uint256,uint256,uint256)", +"34791ae5": "POPPToken()", +"3479f017": "ServiceContract(uint256,uint256[],uint256[],string,uint256,uint256,uint256[],uint256[],address,address,address,address,address)", +"347aa903": "SDOGE(uint256,string,uint8,string)", +"347aba23": "evePerEth()", +"347acf2f": "mintingFactories(uint256)", +"347b3923": "putProfit()", +"347b5193": "LiquexPrivateInvestment(address)", +"347caeb4": "PhxHell(address)", +"347cda88": "needsBlockFinalization()", +"347d5bc2": "setPayoutOdds(uint256)", +"347e26c0": "icoEtherContributed(address)", +"347f5f00": "TokenPurchase(address,uint256,uint256,uint256)", +"347f8f54": "_setDiscount(uint256,uint256)", +"347ff187": "changeAirAmount(uint256)", +"34805e7c": "targetBlockNumber(uint256)", +"34809ee7": "doge()", +"34810336": "discountEndTime()", +"34814e58": "transferBalanceWithFee(address,address,address,uint256,uint256,address)", +"34825a23": "playGame(uint256,uint256)", +"3482e0c9": "cancelAuthorization(address,address)", +"34831b79": "VENSale()", +"34833a6d": "icoBalanceOf(address,address)", +"34835560": "innerlockStartTime()", +"348378d0": "Whitelisted(address,uint256,uint256,uint32)", +"348508cf": "thirdDueDate()", +"34854101": "ETH_TO_WEI()", +"3486645f": "forkReceive(address,uint256)", +"3486fb30": "mintLockPeriodBatch(address[],uint256[],uint256)", +"3487d97c": "setPriceCredentialItemId(bytes32,bytes32)", +"348a653a": "CONFIG_DURATION()", +"348b1b7d": "temperatureMin()", +"348be311": "LogBidOpened(uint256,address,uint256,bytes32,uint256,uint256,uint256,bytes32)", +"348c5b20": "basicApproveTest(address)", +"348e9779": "Restart(uint256)", +"349136af": "BonusScheme()", +"3491a19d": "TokenDemo(string,string,uint8,uint256)", +"3491d0f1": "processTransactionFee(address,uint256)", +"349221be": "ColorCoin(address,address)", +"349296a5": "SaleAuction()", +"3493075e": "getLevelCitizenLength(uint256)", +"3494ab3d": "validEAContract(uint32,address)", +"3494f222": "issueSuperMetal(address,uint256)", +"3495015a": "UnlimitedIPToken()", +"349501b7": "checkDepth(uint256)", +"34950dcf": "approvedSubmissions(uint256)", +"34954a99": "updateBalance(address,address,uint256)", +"34955a2b": "setTavernContract(address)", +"3495b21e": "setNewReleaseEndTime(address,uint256,uint256)", +"349718ed": "MarketCoin()", +"34971dd6": "totalEtherCap()", +"34984add": "signedTransferFrom(address,address,address,uint256,uint256,uint256,bytes32,address)", +"34988b95": "ExToke()", +"3498aaaf": "LogAllowedFromAddress(address,bool)", +"3498b00f": "getSectionIndexFromIdentifier(uint256,uint256)", +"3498c518": "StageClosed(uint256)", +"349a1f03": "getNumSums()", +"349a373b": "batchcreatevillage(uint256)", +"349a6edb": "_purchaseTokens(uint256,address)", +"349aa97e": "ethereumToTokens2_(uint256)", +"349ab992": "divCutAdmin()", +"349ae23b": "collectFor(address)", +"349b586c": "isCrowdsaleFinalized()", +"349b6486": "revokeGrant(address,uint256)", +"349c1ee3": "enableCrowdsale()", +"349c3d75": "changeSaleBonusRate(uint256,uint8)", +"349c870c": "initChainLedger(address,address)", +"349ca600": "Tags()", +"349cdcac": "reLoadXid(uint256,uint256,uint256)", +"349d1661": "BuyToken(address,uint256,bytes32)", +"349d3dc5": "breedTimeout()", +"349d8b4e": "communityMultisig()", +"349dc329": "miner()", +"349eb329": "jsonCat(string,string)", +"349f7173": "lastOraclePrice()", +"349f939a": "SaleEnded(address,uint256)", +"349fcf85": "UpdateAddressPayForService(address,address)", +"349fdb09": "setUnPaused()", +"34a014dc": "lastWithdrawalTime()", +"34a042d8": "bountyPoolAddress()", +"34a2b766": "getMarketData(address,address)", +"34a3312e": "setStore(string,address,address)", +"34a3b820": "getNewFallbackDepositPeriod()", +"34a4a527": "getCountHolders()", +"34a4b10b": "allocatetokensAndWL(address,uint256,uint256)", +"34a503e8": "_utfStringLength(string)", +"34a5eaa9": "_createPerson(string,address,uint256)", +"34a6074e": "buyWithBalance()", +"34a6301e": "setmessager(string)", +"34a6d832": "canPurchase()", +"34a6e514": "updateTaskState(string,string)", +"34a7ed17": "wikiAddTokenTo(address,uint256)", +"34a814a3": "setMyEthBalance(address,uint256)", +"34a8c392": "webSite()", +"34a8eb53": "getarg_1_input()", +"34a8f866": "setMatured(uint32)", +"34a90d02": "lockAddress(address)", +"34a9918e": "DEWCOIN()", +"34a991db": "enableManager(address,bool)", +"34a9a1ae": "getTokenDefaultPartitions()", +"34a9bb34": "getCurrentPublicBracket()", +"34aa0e7f": "dividendRegistration()", +"34aa982a": "getInfoForDisputeAndValidate(bytes32,address,address,address)", +"34ab32e1": "minerTotalYears()", +"34ab8256": "RUDAWORLD()", +"34abd1b1": "updateMaxPhase3(uint256)", +"34ac6f5e": "AVAILABLE_FOUNDER_SUPPLY()", +"34acc716": "projectDone()", +"34ad1e53": "giveBalance(uint256,uint256,uint256)", +"34ad324c": "sendToOwners(uint256)", +"34ad6f00": "TimePassBy(string,uint256)", +"34ae6984": "view66()", +"34aeefd5": "RemovePlayer(address)", +"34af370f": "lockTime(address,uint256)", +"34b0e5ed": "icoPrice()", +"34b122cb": "addTokensToReturn(address,address,uint256,bool)", +"34b20591": "createERC20Token(uint256,string,uint8,string)", +"34b3ae71": "_distribute()", +"34b3b014": "resolveSupply()", +"34b4eef2": "setStartIcoPreICO2ndRound(uint256)", +"34b55235": "registerAffiliate(address,string)", +"34b63592": "addre(address)", +"34b73591": "DevMiningRewardTransfer(address,address,uint256)", +"34b768c7": "summonHero(address,uint8,int256)", +"34b7ac9b": "END_MINTING()", +"34b88e04": "claimCoreTokens(address,uint256)", +"34b8b690": "Yuri()", +"34b98747": "onlyOwnerGetTeamWallet()", +"34bafed3": "date_string(int8,int8,int16)", +"34bb1a9e": "founderTimeLock()", +"34bb3ee1": "updateEthICOVariables(uint256,uint256)", +"34bb447f": "getDiceWinAmount(uint256,uint256,bool)", +"34bbabbd": "RaffleTshirt(string,uint256)", +"34bc5156": "Crowdsale(uint256,address)", +"34bc98b7": "latestPing(uint256)", +"34bd08c4": "getLargeAmountBonus(uint256)", +"34bdcd0a": "getLedgerValue(string,address,address)", +"34bdea85": "setICO2Phase()", +"34bdf2c4": "setReference(address)", +"34be5fab": "mintParcelTokens(address,uint256)", +"34be9ffb": "confirmApplication(uint256,bool)", +"34beb204": "ZZC(uint256,string,string)", +"34bed16c": "bountyRefund(address,uint256)", +"34bf97ea": "setBonuses(uint256[])", +"34c05ca8": "modifyMetadataHashes(uint256,bytes32,bytes32,bytes32[],bytes)", +"34c0c9c6": "RemoveApprovedAddress(address,address)", +"34c0d654": "setPackageDb(address)", +"34c19b93": "getCallGracePeriod(bytes32)", +"34c1b4ba": "sha(bytes)", +"34c1ef77": "publicSaleTokensAvailable()", +"34c2904b": "giveDividend(uint64)", +"34c2b620": "getNickname(uint256)", +"34c31392": "breakParentsHaveGreaterPriority(uint256,address)", +"34c3236a": "signatureDropSingleAmount(address[],uint256)", +"34c39d1c": "ThreeDLTokenDeposit()", +"34c42106": "BOXT()", +"34c5c059": "addEtherToSphere()", +"34c6766f": "getImportingAuthority()", +"34c6a9ae": "getTokenTimelockDetails(address,uint256)", +"34c721a9": "getExploreResult(uint256,uint256)", +"34c73884": "Mint()", +"34c757cf": "NBAT102(address,address,address,address,address)", +"34c7b8e8": "getReadMessages(address)", +"34c7dcf8": "proposedUserKey()", +"34c8e114": "reservedDestinations()", +"34c8ea26": "SetupiBird(string,string,uint256,uint256,uint256,address,address,uint256)", +"34caa999": "setMinimumFundingAmount(uint256)", +"34cac67e": "investorsArray(uint256)", +"34cad6b8": "retreiveTokens()", +"34cad836": "coinsaleDeadline()", +"34cbbef9": "EndRateChange(uint256)", +"34cc0a12": "_addWhitelister(address)", +"34cc182b": "updateDiamond(string,string,uint256)", +"34cc4b8f": "ratePerWeiInPrivateSale()", +"34cdb15f": "addressToTimestamps(address,uint256)", +"34cdf78d": "blockHashes(uint256)", +"34cec84d": "maxCapCompanyInventory()", +"34d05b1f": "freezeDeliver(address,uint256,uint256,uint256,uint256)", +"34d09ff1": "DemoraCash()", +"34d0cb6d": "CNYToken()", +"34d1c0e6": "transfer_bond_token(address,address,uint256)", +"34d2485c": "tribeTokens(address)", +"34d24bff": "no(uint256,string,uint256)", +"34d2c4cb": "mintProxyWithoutCap(address,uint256)", +"34d31de3": "length(uint8)", +"34d33f9f": "kycRefuse(address)", +"34d40382": "nextSection(bytes32)", +"34d4776b": "removeApprovalStatus(address)", +"34d4cd82": "getTokenForTeam(address,uint256)", +"34d55cd9": "SerpentCountDown()", +"34d56b0a": "Currentproposal()", +"34d5751a": "approveContractCall(address)", +"34d5f37b": "round(uint256)", +"34d5fc4b": "transferInitialAllocationWithTimedLock(address,uint256,uint256)", +"34d609ac": "auditorHasStaked(uint256,address)", +"34d64e50": "getDoneAirdropAmount(address)", +"34d71238": "sencBalance()", +"34d722c9": "minterAddress()", +"34d83dab": "PhaseICO()", +"34d8521b": "quarterlyWithdrawable()", +"34d8c24d": "init(uint256,uint256,address,address,address,address,uint256,uint256,address,uint256,uint256,bool,bool)", +"34d92490": "changeFuckyou()", +"34d95bf0": "ShitCloneslordAddress()", +"34d9aee3": "assertEq7(bytes7,bytes7)", +"34dbe44d": "getLastBlockNumberUsed()", +"34dc2176": "inventoryProduct(bytes32)", +"34dc3c32": "pricePerWei()", +"34dc864c": "YYYToken()", +"34dcfec4": "minimalETH()", +"34df4222": "hasBeenLinked(uint32,int256)", +"34df8b63": "PER_USER_MAX_AVATAR_COUNT()", +"34df9b60": "getCow(uint256)", +"34e19907": "setSwapFee(uint256)", +"34e1ad21": "EmontFrenzyTool(address)", +"34e22921": "Call()", +"34e23416": "lastcombo()", +"34e24640": "distr(address,uint256)", +"34e24853": "encode(address)", +"34e255a4": "WTechTestCoin()", +"34e415db": "growWeed(uint256)", +"34e41bbf": "RATE_DAY_1()", +"34e4c06d": "maxSupplyGenerable()", +"34e5a5f8": "getPlayerInfoWithRoundID(uint256)", +"34e5a692": "distribute(uint128)", +"34e5e97a": "assignProduct(uint256,uint256,uint256,uint256)", +"34e70cc2": "tub()", +"34e73122": "calculateFee(uint256,uint256)", +"34e73f6c": "getAuctionCost(bytes32,uint256)", +"34e7a57a": "nonWLBalanceOf(address)", +"34e80c34": "getKeys(address)", +"34e8980f": "bootUpHangouts()", +"34e8c679": "retrieveTokens(address,uint256)", +"34e8ecea": "FindTheCureCoin()", +"34e8f247": "setStartTimeIcoStage3(uint256)", +"34e98037": "batchAssignment(address[],uint256[])", +"34e9d146": "EstateToken(uint256)", +"34ea5fe5": "setNumeratorDenominator(uint256,uint256)", +"34eaa923": "moveEther(address,uint256)", +"34eac76f": "withdrawalDeployed()", +"34eaf154": "investorAmount(address)", +"34eafb11": "totalCount()", +"34eb0cf5": "isUserBlacklisted()", +"34eb3200": "setRequiredProgressOfPreviousDungeon(uint32)", +"34ebb615": "maxTokenToBuy()", +"34ec514b": "setInitialPrize()", +"34ec96bf": "dAddCategory(bytes32,bytes32,bool,uint256)", +"34ed557f": "setTokenIpfsHash(address,bytes32)", +"34eea4a2": "executeRoom(uint256)", +"34ef39f1": "owner_withdraw()", +"34ef801e": "wcOnCrowdsaleSuccess()", +"34efcb8e": "getPlanet(uint256)", +"34f00e83": "setCrowdsaleStart()", +"34f03321": "PCM(uint256)", +"34f0e39e": "addCurator(address)", +"34f10c39": "chkcan(address,uint256,uint256)", +"34f110e5": "getPoolMaxPayoutQspWei(uint256)", +"34f1f9b1": "lbToken()", +"34f20f31": "setExchangeRateAuth(address)", +"34f245c2": "hasSecondUnionIds(bytes32,bytes32)", +"34f25146": "numOfReleased()", +"34f2d1ec": "scheduleUnsoldAllocation()", +"34f361a4": "bonusSecondWeek()", +"34f42df8": "testerc20()", +"34f50813": "PreICOToken(address)", +"34f64dfd": "bobMakesErc20Payment(bytes32,uint256,address,bytes20,address)", +"34f682e2": "GetPriceOfRigs(uint256,uint256,uint256)", +"34f6bef3": "allTokensDecimalsBalances()", +"34f6d0b3": "Congress(address)", +"34f71c5d": "InDetailToken()", +"34f732e8": "withdrawalLockTime()", +"34f8cc6d": "DrAgentToken()", +"34f9445e": "consumeEnergy(address,uint256)", +"34f96971": "lockedBalanceCount()", +"34fa0606": "getControlInfoTokenlist()", +"34fa17cb": "getTeamBet(string)", +"34fa37da": "grantTokens()", +"34fb032e": "getAddr(string,string)", +"34fb11ed": "setMintingFeeEnabled(bool)", +"34fc2591": "toggleFreeze()", +"34fc62ff": "_badgeOwnerChange(uint256,address)", +"34fcc3e7": "getBetting(uint256,address)", +"34fcf437": "setRate(uint256)", +"34fe00b1": "getDocumentMajorities()", +"34fe0cf5": "payFee(address,address,address,bytes32,address,address,bool)", +"34fe5473": "largestDonation()", +"34fec467": "transferAllowed()", +"34fee3e4": "AuctionSuccessful(uint256,uint256,address,uint256)", +"34ff37f3": "returnLongCouponAmount(address[3],bytes32,uint256)", +"34ffea2c": "token_iso_price()", +"35001a1a": "internalMint(address,uint256)", +"350078b8": "staticblock()", +"3500a48d": "transferCommunityCommune(uint256,address)", +"35013592": "getStageCap(uint256)", +"35020cb9": "getReferenceType(bytes32)", +"35021991": "PresaleStarted(uint256)", +"350279c6": "getStage3Cap()", +"3502be27": "TaxTillNow(uint256,uint256)", +"35039525": "isBarCode(bytes32)", +"350460f8": "basicTokensPerEth()", +"35046722": "getAddressBalance(address)", +"350486da": "AgiCrowdsaleMock(address,address,uint256,uint256,uint256,uint256,uint256)", +"35058a2a": "approveOperatorTo(address,address,bool)", +"3505e844": "userExists(address,address)", +"350604f1": "rakesOwing(address)", +"3506b32c": "FailedTransfer(address,uint256)", +"35082933": "setAdminWallet(address)", +"350845f5": "maxStage3AllocationPerInvestor()", +"35085b58": "weekThreeStart()", +"350896f7": "setEtherPriceManually(uint256)", +"3508eddb": "AnkitToken()", +"3508f2e8": "Monday(uint256,string,string)", +"350a6429": "minAmountETH()", +"350b4c6f": "setWLMTBounce(uint256)", +"350b4cb6": "BaseAirdrop(address,address)", +"350bb144": "createContractGirl(string)", +"350c0acf": "checkWithrawStock(address)", +"350c35e9": "withdrawCollateral(address,uint256)", +"350cf91c": "createManufacturer(address,address,string,string)", +"350d141e": "getWasApprovedBeforeDeadline()", +"350d9b96": "walletWithdraw(uint256)", +"350dbcc5": "get_Sponsors_list_by_Job(uint256)", +"350dd4a4": "Nettekcoin()", +"350ee628": "addVerifiedInfo(address,address,string,uint8,string,string)", +"350f4270": "specificTransfer(address,uint256)", +"350f9e01": "swypes()", +"350fbe2e": "calcNextDrawTime()", +"35100acc": "credit_token(address[],uint256)", +"35101d8e": "balancesForOutcome(uint8,address)", +"35105e3b": "executeChildDaoProposal()", +"35109cc6": "PRE_SALE_TOTAL_TOKENS()", +"3510b66c": "reduceTotalSupply(uint256)", +"3511c1af": "getMySnake()", +"3511ca9c": "Freezing(address,uint256,uint256)", +"351210b3": "BpxToken()", +"35126330": "GanaTokenLocker(address,address)", +"35130678": "additionalPreMine(uint256)", +"351314a5": "oIDIndex_()", +"3513651c": "Spin(address,int256,uint256)", +"35139014": "preICOstart()", +"3513cab2": "getWeeklyBuyVolume()", +"3513d339": "ForceSendTokens(address)", +"351509a8": "TEAM_ADDRESS()", +"3515519c": "getInitialval()", +"3516df21": "supplyBurn(uint256)", +"3517a740": "getNodeParent(bytes)", +"35181711": "SetStartTimeIco(uint256)", +"3519786f": "setAvailableFlat()", +"35197d6b": "sendData(address,uint256,uint256,bytes)", +"3519932e": "authorized_recordStashedPayout(uint256)", +"3519a2f8": "fundContract(uint256)", +"351a97f8": "accountKind(address)", +"351abe61": "getBusinessVATStatus(uint256,uint8,address)", +"351adcb0": "SocialPay()", +"351b68db": "SWAP_LENGTH()", +"351be6ad": "releaseProduct(address)", +"351bf518": "transferFeeRate()", +"351c2576": "completeFavor()", +"351c9133": "userkeys_push(address,uint64,uint64,uint64)", +"351dadf4": "support_ban_of(address)", +"351df92a": "setBattleAddress(address,address)", +"351e46de": "setBLInterface(address)", +"351f42c3": "msgs(address,uint256)", +"351f98d9": "icnq()", +"35209715": "burritoPoolTotal()", +"35209821": "metadataContract()", +"35213a69": "abandonedFundWithdrawal()", +"35216bba": "enableTokenTransfer(bool)", +"3521d7da": "prvd()", +"3522e868": "changeLogicContractAddress(address)", +"35259f1a": "ThriveToken()", +"3525d66d": "CanvasFrag()", +"35269662": "importerBanker()", +"3527cae0": "_deleteUint(bytes32)", +"3528351d": "bouleDevMultisig()", +"3528a0c8": "GlobalTransfersLocked(bool)", +"3528c022": "days_interval()", +"3528f564": "allowancePerYear()", +"352a482f": "havedDistFoundCoin()", +"352a950c": "updateCnyBtcRate(uint256)", +"352bbdff": "referralContracts(address)", +"352c93b7": "getFess()", +"352d2790": "UUID4()", +"352d5cd0": "setPhaseSupply(uint256,uint256)", +"352e0891": "_isValidSignatureAndMethod(address,bytes)", +"352e1dff": "getWorkflowActivity(uint256,uint256)", +"352f43a8": "RongWQToken(uint256,string,uint8,string)", +"352f64f9": "getOwnerFee(uint256)", +"352fd696": "PERCENTAGE_OF_TOKENS_SOLD_IN_SALE()", +"352ff2bd": "setPreSaleRate(uint256)", +"352ffb9a": "Trident()", +"35300990": "propExists(bytes32)", +"353086e2": "MAX_BET_VALUE()", +"3530e895": "getClaimEst(address)", +"3531f0de": "LogWeiWithdrawn(address,uint256)", +"35347560": "getLamboAttributes(uint256)", +"35353b03": "parseAndRound(string,uint8)", +"353559cb": "Controller_Address3()", +"35359a3f": "tokenHolderAddress()", +"3535ab2a": "btcUsdRate()", +"3535cd52": "setDailyCosts(uint256)", +"3536046a": "getUInt(string)", +"35361909": "withdrawStart()", +"35371218": "closePositionDirectly(bytes32,uint256,address)", +"3538b13a": "MAX_TOKENS_FOUNDERS()", +"3538b9db": "test_twoValidEqBytes32()", +"3538e747": "rePayLoan(uint64)", +"35390714": "maximumFee()", +"353928d8": "helpRed()", +"35393197": "setReferer(address)", +"35396c1c": "createItem(uint256,uint256,uint256,uint256,uint256,uint256)", +"3539c468": "remainingTokenAmount()", +"353a3475": "setTargetAddress(address,address)", +"353ba8e9": "vvc(uint256,string,string)", +"353be218": "ToorToken()", +"353c0573": "burnInternal(address,uint256)", +"353d90ec": "numTickets()", +"353db436": "setCosts(uint128[])", +"353e65e9": "wallets(address,uint256)", +"353edf58": "presaleEndtime()", +"353f0e40": "getCurrGameInfoPart1()", +"353f1bc7": "setIsAllocatingInterest(bool)", +"353fe553": "BNDToken()", +"35400daf": "setTier2Participants(address[])", +"3540233b": "set_status_user(address,address,bool)", +"3540b529": "readIncUpdatedOn(string)", +"3540e96c": "tokenOWL()", +"35410f85": "KPCoin()", +"3541d365": "GPUMining()", +"3541fd53": "setStake(bytes32,uint256)", +"3541fe94": "teamVestingAddress()", +"354211c9": "TriwerToken()", +"35423643": "totalmoneyearned()", +"354271b4": "test_7_accessRestriction_UnderscoreRemoveMember_shouldThrow()", +"3542758f": "addOwner(address,string)", +"354284f2": "party()", +"3542aee2": "mintByOwner(address,uint256)", +"3542d0f6": "msgQPut(string)", +"35436725": "CoinMovement(address,address,int64)", +"3543b23c": "assign(address,string)", +"35446c78": "setAirDropPayableTag(bool,uint256)", +"3544a864": "whiteList()", +"354537da": "safeCloseSale()", +"3545acb0": "after_test_1_method()", +"354685fb": "setSellDividendPercent(uint256)", +"35468963": "rentModified(address,uint256,uint256)", +"354709dd": "trade(address,address,uint256,uint256,uint256,address,uint256)", +"3547800a": "lockTokens(address[],uint256[])", +"354836b9": "setIsReportingActive(bool)", +"3548fcd7": "getCardAttrs(uint256[])", +"35490ee9": "setPublicOfferPrice(uint256,uint256)", +"3549345e": "setPresalePrice(uint256)", +"35493e98": "icoEtherReceivedPreSecondSale()", +"35496d82": "POWHclone()", +"354a5137": "setWinnerTimeStatus(bool)", +"354b2735": "testDeploy()", +"354b7b1d": "updateVerified(address,bytes32)", +"354d68f2": "validate(address,address,bytes32,address,uint256,bytes32,address,uint256,bytes32,uint256,uint256)", +"354d7e40": "Payout()", +"354d89ee": "setTokenSaleContract(address)", +"354e1063": "setExtraConfig(uint256,uint256)", +"354e6ca7": "HippieCoinv2()", +"354eb40b": "emojisan()", +"354f1651": "completeBountyDistribution()", +"354f6398": "insert_candidate(string,uint8,string,string,string,string)", +"35509937": "changeWithdrawal(address,address)", +"3550b6d9": "getTokenAddressBySymbol(string)", +"3550e2e2": "changeBlockedTimeForBountyTokens(uint256)", +"3551a6ca": "nullifyFrom(address)", +"3551c8b9": "tokenesia()", +"355255f5": "totalSyndicateShares()", +"35527354": "submitNewHash(bytes32,uint256,uint256)", +"355274ea": "cap()", +"3552f552": "_random(uint256,uint256,uint256)", +"3552f9f6": "GetBetReadyTime()", +"3553f60d": "getPoolAdmin(uint256)", +"355421a8": "create(uint256,uint256,uint256,address,address)", +"355473d0": "setuped()", +"355474d2": "commitReading(address)", +"35548c02": "WINNERTAX_PRECENT()", +"35552dbc": "transferDSPRecord(address,address)", +"35554e58": "SearchUserPurchase(address,string)", +"3555fa90": "contractSpend(address,uint256)", +"35566ff0": "rewardSources(uint256)", +"3556afd8": "m_exchangeRate()", +"355784cb": "settleToken(bytes32,address,uint256,uint256)", +"35579f0c": "withdraw_token(address,address,uint256)", +"3557c1f6": "labAddress()", +"3557c70a": "removeMintingFactory(address)", +"3557d0e9": "testThrowIfNotExist()", +"35593bcf": "vestedAmountAvailable()", +"35595c95": "getSkillName(uint256)", +"355ae09c": "Fluzcoin()", +"355ba211": "emergencyOverwrite(bytes32,uint8,uint8)", +"355c6457": "tryToRecord(address,uint256)", +"355d59aa": "publicTokensAvailable()", +"355d7d03": "batchAllocate(address[],uint256[],uint256[])", +"355d7e05": "withdrawByMint(address,uint256)", +"355d8c64": "Uptrennd()", +"355dd1b3": "Donate_LuGoddess()", +"355df00b": "getTicketNumber(address)", +"355e0c5d": "tokenUri()", +"355e1b84": "Mstcoin()", +"355e56b9": "Assembly(address)", +"355e6b43": "setCommission(uint256)", +"355eb2c0": "canWrite(string,address)", +"355f41a9": "pay(uint256,uint256,address,bytes)", +"355f51a0": "right49(uint256)", +"355f7ea7": "canUpdateNextGameMinAndMaxBlockUntilGameEnd()", +"355fd8db": "thirdTimeLine()", +"35603440": "sections(uint256)", +"3560f05e": "AsX()", +"356282db": "changeMinBidMultiplier(uint256)", +"3562a1db": "CoderForge()", +"3562fd20": "setUIntValue(bytes32,uint256)", +"35639e11": "updateMinGasPriceForDrawing(uint32)", +"356442b9": "lockPercentage()", +"356594ab": "EtherTransfer()", +"35671214": "prev(uint256)", +"3567950c": "blockchainExchange(uint256,uint256,bytes32)", +"3567d5ef": "BuyGoods(address,uint32)", +"3567d637": "getTransactionListLength()", +"3568bd39": "mintStart2()", +"3568fb04": "createUint256(bytes32,uint256)", +"356b00af": "tranferMoneyToAddress(address)", +"356c22ec": "teamOne()", +"356ca551": "ZhkCoin(uint256,string,uint8,string)", +"356d414c": "transferFrom(address,address,address,uint256,uint256,bool,bool)", +"356d4a3a": "createJaroSleep(address,uint256)", +"356d6b24": "fifthBonusSalesEnds()", +"356e2927": "icoFinished()", +"356e7e9d": "mintToAccount(address,uint256)", +"356eeaab": "payAndReset()", +"356f056f": "releaseTime3()", +"356f083e": "_bytes32ToString(bytes32,bytes32)", +"356f55b7": "adminDropETH()", +"356f8964": "transferMed(address,uint256)", +"356f9865": "tokenPerWei()", +"356fefb3": "developer_edit_text_crowdsale(string,string)", +"357006c4": "Propellerhead()", +"3570c2ee": "PosRewards()", +"3570f217": "CarbonTOKEN()", +"3571e567": "PausableCappedDividendToken(uint256)", +"3572a28e": "EPT()", +"35734ba5": "ExternalSale(uint8,string,address,uint256,uint256)", +"35735226": "returnBonus()", +"3573df50": "CreateMND(address,uint256)", +"357401f5": "cancelBet(uint256)", +"35743ac9": "proposalActive(uint256)", +"3574da8c": "deployShop(address)", +"35759333": "checkList(uint256,address)", +"3575ecc6": "BreakbitsToken()", +"35765828": "addSystemUserEarnings(uint256)", +"3576a32f": "setBackupOwner(address)", +"3577d94e": "loanTerm()", +"35785e09": "sweepsState()", +"3578abf4": "QuintessenceToken()", +"3578b7b3": "setBuyPrice(uint256,string)", +"3578bb7f": "calculateScore(uint8[])", +"35796635": "numEndedGames()", +"3579c0df": "newAward()", +"357a0333": "initWithdrawal(address,uint256)", +"357a05cd": "cram(address,uint256,string)", +"357a05f1": "Crowdsale(address,address,address,address)", +"357a0ba2": "sgt()", +"357af806": "Restart()", +"357bd7d6": "ROHH()", +"357be177": "DemSoKhoaHoc()", +"357d0173": "removeArbiter(address,uint256)", +"357d4d1a": "ICloudSecAddress()", +"357e2e57": "addRequiredBlockHash(uint256)", +"357ee486": "createDonationsBank()", +"357fe12a": "createPromoMonsterWithTokenId(uint32,bytes,address,uint256)", +"3580031a": "consumesGas()", +"358049ea": "setDiscountTime(uint64)", +"35804a88": "returnBook(uint256,address,address)", +"35815b95": "FACTOR()", +"35817773": "getContract(string)", +"3581b257": "_addDividendsForAddress(address,address)", +"35828c8d": "TransactionInitiated(uint256,address,address,address,address,address,uint256,bytes32)", +"3583727f": "tokenSetSpeedBump(address,address,bool)", +"358373bd": "withdrawalInterCrypto(string,string)", +"35842f74": "depositDai(uint256)", +"358455b4": "testDefaultWallet()", +"3584fa38": "setDelegate(uint8,address)", +"358507d7": "claimRefundOnUnsuccessfulEvent()", +"3585609b": "getJobCanCancelAfter(bytes16,address,address,uint256,uint256)", +"358564ee": "allocateLoyaltySpend(uint256)", +"358592ce": "_freeze(address,bool)", +"3585e500": "nTransfers()", +"35862824": "isIcoOpen()", +"35866368": "transferFromWithCustomReservingNet(address,address,uint256,uint256)", +"35875623": "get_list_deposit_key(address)", +"35876476": "initialize(address,address,address,address,address,address,address)", +"3587904b": "limitOfTeam()", +"3587b26c": "setAutoBuy(uint256)", +"3588aa0b": "BMV()", +"358a074c": "admin_isRequireData(bool)", +"358a08cb": "activate(address,uint256,address,uint256,uint256,uint256,bool,bool)", +"358a11b4": "change_data(string)", +"358a18b2": "ThePatriotCoin()", +"358a2a84": "toHorse(uint256)", +"358c24b1": "CONFIG_MIN_PLAYERS()", +"358cc6f6": "acceptKyc(address)", +"358cfa25": "setTotalEtherPool(uint256,uint8,bool)", +"358d1e26": "HitToken(string,string,uint8,uint256,address,address)", +"358d5dc2": "getIsCashed(uint256,uint256)", +"358dff07": "minEthPerTransaction()", +"358f7f3a": "numberRange()", +"358fa6c6": "calcBuyout(uint256)", +"358fcee9": "fetchdivs(address)", +"358ffd79": "Controller(address,address,uint256)", +"3590699d": "_newSchellingRoundEvent(uint256,uint256)", +"359170e6": "setTransfersEnabled()", +"3591a1a9": "canDrip(address,address)", +"3591f5bd": "removeSomeDETsFrom(address,uint256)", +"3591fadc": "STAGE_2_FINISH()", +"3592336c": "getRetailerStatus(address,address)", +"3592c3b5": "uintToString(uint256,uint256)", +"3592dfea": "updatePackage(uint256,string,address)", +"3592f369": "disableTokenSwapLock()", +"35930e13": "setMinimalRewardedBalance(uint256)", +"359320de": "getCurrentVelocity()", +"35953108": "removeAddressesFromWhitelist(address[],string)", +"359531f4": "allowCnsContracts(bytes32,address,bytes32)", +"35956083": "Parabola()", +"35956c42": "ABCPresale(uint256,uint256,address,address)", +"35958196": "getGamesPool(uint256[])", +"359582ca": "downstream()", +"3595b570": "copyBalance(address)", +"35960028": "payMeFor(uint16)", +"359627e5": "canPay(address,uint256)", +"35967501": "setManualOverride(bool)", +"35972f46": "techAccount()", +"35975a37": "setStart()", +"3597727c": "EtherDLT()", +"359803cd": "pauseMinting(bool)", +"359819cc": "Group(address,bytes32,address[])", +"359829db": "numOfBackers()", +"3598ac34": "Cider()", +"35995022": "getPhaseCount(uint256)", +"359976a7": "getCheckSum(bytes20)", +"359ae0f3": "set_Shops(address[],address[])", +"359bc19e": "finalize(uint64)", +"359c1912": "setUintF1(uint256)", +"359c1f72": "getGravatar(address)", +"359c8a93": "claimD()", +"359cc28e": "changeIcoDeadLine(uint256)", +"359cf2b7": "requestTokens()", +"359d04a2": "voteRuling(uint256,bool)", +"359d393d": "votes_against()", +"359d9277": "XXXXXXXX01(address,uint256)", +"359db8c8": "partialDistributeDivident(uint256,address[],address)", +"359dbafe": "validatorWrotePart(uint256,address)", +"359ef75b": "init(address,address,address,address,address)", +"359f517e": "confirmWithdrawal()", +"359fe132": "getSharesByShareOwner(address)", +"359fe780": "increaseMintApproval(address,uint256)", +"35a063b4": "abort()", +"35a07291": "makeAssessment(uint256,uint256,uint256,uint256)", +"35a1529b": "dripAmount()", +"35a1bf6e": "test_insert_findWithHintNextRemovedUpdateTail(int256)", +"35a1d95d": "requestSnapshots(uint256)", +"35a21728": "multiERC20Transfer(address,address[],uint256[])", +"35a23659": "miningTimePerTrip()", +"35a26787": "AuthAddr(address,address,address)", +"35a374dc": "issueLottery(uint8)", +"35a3a96f": "marketingRecipient()", +"35a3cfa0": "transferMarketallocationTokens(address,uint256)", +"35a3e83c": "getCurrencyDecimals(uint256)", +"35a3fbb0": "_triggerStashedPayoutTransfer(uint256)", +"35a4015d": "numberOfBudgetPlan()", +"35a49063": "personalityTypes()", +"35a4fa30": "createPromoWhale(address,string,uint256)", +"35a53379": "_increaseWinPotChance()", +"35a568b9": "setLockPostion(address,uint256,uint256,uint256)", +"35a5c43a": "get_FTVTOKEN_EURCENT(uint256)", +"35a5e06d": "getRoots()", +"35a5e8bf": "SectorUpdated(uint16,address,string,string,string,bool)", +"35a66ef8": "arrayOfAccountsThatHaveClaimed()", +"35a6861a": "login(address)", +"35a6c1e0": "totalPausedSeconds()", +"35a6ed92": "calculateBonusAmount(address,uint256,bytes32)", +"35a8076b": "Accounts(address,address)", +"35a951b8": "endTime(bytes32)", +"35a9731b": "approveRefund()", +"35a9a5c7": "setWithdrawAccount(address)", +"35a9c82f": "setSecret(bytes32)", +"35a9d051": "ETH_address()", +"35aa6bec": "checkExpectedTokens(uint256[],uint256)", +"35aa6c31": "getMoney(address,uint256)", +"35acac4e": "abort(string)", +"35acbcab": "makeStudentID(bytes)", +"35ad84f9": "buyFromValue(uint8)", +"35ad9581": "saleRateSecondDay()", +"35adc0c5": "sellerCancel(bytes16,address,address,uint256,uint16)", +"35ae20bb": "AddEthBalance(address,uint256)", +"35ae41c9": "godAutomaticCollectFee()", +"35aec024": "findTwoPercent(uint256)", +"35aed70f": "getNumAnimalsXPlayerXType(address,uint8)", +"35af1986": "div27(uint256,uint256)", +"35af2c4f": "unsetIdentity(uint256,address,address)", +"35af5a9c": "MOTCToken(uint256,string,string)", +"35b05d1e": "purchaseRequest(uint256,uint256)", +"35b09a6e": "someFunction()", +"35b1097e": "communityTokensHolder()", +"35b1114a": "REQUEST_CANCELED_BY_BORROWER_STATUS()", +"35b11b72": "setColors(uint16,uint256[5],uint256)", +"35b21ceb": "totalChildTokens(uint256,address)", +"35b28153": "addAuthorization(address)", +"35b2b51b": "getAllInvestmentsWithdrawnByOwner()", +"35b3caf0": "cancelOrderWithPayerByAdmin(string,address)", +"35b3ee0e": "NGA()", +"35b46459": "distribute(uint256,address[],uint256[],uint256)", +"35b4a6d9": "updateBTCPrice()", +"35b4a93e": "HSDJCoin()", +"35b55d98": "SUBSCRIPTION_MODULE()", +"35b643d4": "getBalanceTimestamp(uint256)", +"35b6a6c6": "tokensForAdvisors()", +"35b6cc03": "RankingBallGoldCrowdsale(bytes32[5])", +"35b6df5d": "BurnableCrowdsaleToken(string,string,uint256,uint256)", +"35b6eaea": "isPayed(address)", +"35b75391": "test_validProposalExecution()", +"35b7588f": "allowedMinting()", +"35b8e820": "getCandidate(uint256)", +"35b94b5d": "MIOTToken(uint256,string,string)", +"35ba1d0a": "closeOnBehalfOf(address,address,bytes32,uint256)", +"35ba66de": "ACATokenSale(address,address,uint256,uint256,uint256)", +"35ba9af8": "availableForWithdrawal()", +"35bb0398": "didSign(address,bytes32,uint8,bytes32,bytes32,uint8)", +"35bb3e16": "grantAdmin(address)", +"35bb5fd2": "isToonInterface()", +"35bbe70e": "getAllVoters()", +"35bce6e4": "transferMulti(address[],uint256[])", +"35bd8b94": "Noblebit(uint256,uint256)", +"35bdac34": "withdrawToAddress(address,uint256)", +"35be7bf3": "getSecondRoundReleaseTime()", +"35bf82f6": "setChallengeFee(uint256)", +"35bf90ca": "getContributorByNumber(uint256)", +"35bfe158": "changeGoldIssueBurnFeeContract(address)", +"35c019e2": "LogFundTransfer(address,uint256)", +"35c05ab0": "hodlFor3y()", +"35c0cbaf": "upgradeDragonGenes(uint256,uint16[10])", +"35c1d349": "participants(uint256)", +"35c23200": "computeNextPrice(uint256)", +"35c2d49d": "minInvestETH()", +"35c40fe3": "testParamOutOfBoundsFail()", +"35c42d7f": "getPetByIndex(address,uint256)", +"35c4de7a": "OracleRequest(address)", +"35c5b475": "getExpectedReturn()", +"35c648c5": "POMDA()", +"35c6511b": "endMiniGame()", +"35c699c4": "getUnclaimedEtherIfAny(uint256)", +"35c72df0": "bryan()", +"35c7421b": "testMinReturn32WithReturn()", +"35c77e6f": "configurer()", +"35c80c8c": "isCustodian(address)", +"35c8518b": "setCloseBlock(uint256)", +"35c914c2": "finishPayaning()", +"35c969ea": "Presale(address,address,address,uint256,uint256,uint256,uint256)", +"35c990d4": "getGameCalculationProgress(uint256)", +"35ca8ce1": "setPriceToRegSale()", +"35caecc3": "getPeriod(uint256,uint256)", +"35caf648": "DonationMatched(address,uint256)", +"35cb1f07": "wethDeposit()", +"35cb27b5": "minedToken(uint16)", +"35cbdc25": "AcceptsProofofHumanity(address)", +"35cbe716": "getRemainingAirdropSurplusAddressesLength()", +"35cc2d80": "isInState()", +"35cc59a9": "createSchema(bytes)", +"35cd2358": "setAffiliation(address,uint256)", +"35cd4cc4": "getLastKicker()", +"35cd78b3": "saveMetaData(address,bytes32,bytes32,bytes32,bytes,uint32,uint256,uint256,bytes,uint256)", +"35cf60df": "enableFreezePriceRateRecalc(uint256)", +"35d0b444": "LogRedeemToken(address,uint256)", +"35d129f6": "untag(string)", +"35d13969": "SendAllMoney()", +"35d1f606": "destroyCard(uint256)", +"35d1f869": "setAtomOwner(uint256,address)", +"35d357ac": "logCeiling(int256,uint8)", +"35d37dbb": "mgmtFeePercentage()", +"35d4a49a": "setSubFreezingPrice(uint256)", +"35d65132": "canClaimPayout(address)", +"35d6d214": "getBids(uint256[])", +"35d6d611": "DAY_LENGTH()", +"35d79fad": "CertificationDb(address,uint256,address)", +"35d7a052": "freeze(uint256,uint256)", +"35d7d09a": "next_diary_id()", +"35d7f149": "takeBuyOrder(address[3],uint256[3],uint256,uint8,bytes32,bytes32)", +"35d82d16": "setGeneralInfo(bool)", +"35d91b85": "cancelOrder_(address[7],uint256[7],uint8,uint8,uint8,bytes,bytes,bytes,uint8,bytes32,bytes32)", +"35d94797": "verifyBetMask(uint256)", +"35d97405": "dividends()", +"35d99f35": "masterMinter()", +"35d9ba1f": "getTill()", +"35d9ceee": "uintMax()", +"35da3c1a": "createNewGalaxy(string,uint256)", +"35daa731": "ordersCount()", +"35db2829": "sendStableReward(address,address,uint256,uint256)", +"35db2b72": "Winchain()", +"35de5e89": "setPixelBlockPrices(uint256[],uint256[],uint256[])", +"35de74b8": "PBC()", +"35decc5f": "updateTargetToken(address,uint256)", +"35dfcc92": "totalCastle()", +"35dffde5": "updateReleaseAmount(uint256)", +"35e04fab": "prePayment()", +"35e09095": "decTotalSupply(uint256)", +"35e0f450": "stageMaxBonusPercentage()", +"35e24a6b": "preICOstate()", +"35e49e5f": "sellBlocks(uint8,uint8,uint8,uint8,uint256)", +"35e4d30f": "nonzeroAddressesElementForApi(uint256,uint256)", +"35e5f617": "transfer_erc20(address,address,address,uint256)", +"35e608be": "addUpgrade(address,address,bytes)", +"35e60bd4": "setTransferLocked(bool)", +"35e64aaa": "transferLand(int256,int256,address)", +"35e6a7af": "addab()", +"35e6e5b6": "removedSalesAgent()", +"35e82f3a": "removeAddressFromBlacklist(address)", +"35e83446": "testInitialBalanceWithNewMySale()", +"35e9d83b": "transferToAddress(address,uint256,bytes)", +"35ea6821": "masternodeTransferOwnership(address)", +"35ea94ad": "TokenSold(address,uint256,uint256)", +"35eb5208": "registerAgent()", +"35eb702f": "getPlayerWinning(address,uint256)", +"35eb8479": "showBidder()", +"35ebbfd1": "weekTwoStart()", +"35ec6dab": "earlyWallet()", +"35ed3fd6": "BONUS_PERCENTAGE()", +"35ed548f": "getPositionRequiredDeposit(bytes32)", +"35ed64c3": "CZToken(string,string,uint8,uint256)", +"35ed663d": "ENJToken(address,address,address,address)", +"35ee2783": "Alarm()", +"35ee2f8a": "initCanOffsetTime()", +"35ee72c7": "ISSToken()", +"35eead41": "addNote(bytes32,string,string)", +"35eec76a": "privatePreSaleSoldTokens()", +"35f067cf": "updateTokenURIPrefix(string)", +"35f097f3": "isOnBattle(uint64)", +"35f0d665": "reloadStoreByName(uint256)", +"35f10cc3": "sendWinnings(address[],uint256[])", +"35f1bd11": "EcoCrypto()", +"35f21f0a": "GladiethersOraclize()", +"35f2507f": "recoverUser(address)", +"35f27b20": "collectAirDropTokenBack()", +"35f2fbaf": "_bid(address,uint256,uint256)", +"35f3cf85": "setSaleManagerAddress(address)", +"35f4581b": "pwn(uint256)", +"35f46994": "die()", +"35f4de27": "HumaniqICO(address)", +"35f64a30": "albosWallet()", +"35f6806b": "addNewAccount(string,address,uint256,uint256,uint256)", +"35f68424": "getTokensByBTC(uint256)", +"35f6c161": "createWallet(uint8)", +"35f79b83": "LordCoin()", +"35f7ff63": "stringStorage(bytes32)", +"35f80a1b": "UbiatarPlayVault(address,address,uint256)", +"35f82876": "fillOrderNoThrow(uint256,bytes)", +"35f84393": "contructor(string,string)", +"35f88860": "listScam(uint256,string,uint256)", +"35f8a2c6": "RefundableCrowdsale(uint32,uint32,uint256,address,uint256)", +"35f931cb": "AmberToken(uint256)", +"35f96a7d": "goldBought(uint256,address,bytes32,string,string,string,string,string)", +"35fa3128": "BTTSToken(address,string,string,uint8,uint256,bool,bool)", +"35fa3843": "setend()", +"35faa416": "sweep()", +"35facf78": "createProposal(string,uint256)", +"35fb2125": "onlyBouncerTransferOwnership(address)", +"35fb337c": "finalCap()", +"35fb8e36": "triggerTestEvent()", +"35fc3e90": "claimRefundEther(address)", +"35fc7506": "StatsSold()", +"35fd8877": "isCashBack(address)", +"35fe3660": "MID_GRADE_CATEGORY()", +"35ff058a": "pushArray(bytes32,uint256)", +"35ff217d": "CrowdfundFinalized(uint256)", +"35ff3a51": "getRaisedEther()", +"35ffa20d": "handleWithdraw(address,bytes32,address,address,uint256,uint256,bytes32,bytes32)", +"35ffbe74": "verifyClaim(bytes,uint256,uint256,uint256[],uint256[],uint256[],uint256[])", +"35ffd687": "getStageLimit(uint8)", +"360035c6": "RepoToken()", +"360038b5": "CheckOver()", +"3600af8b": "updateProfileImgurl(string)", +"3600e1e2": "controlLimits(address)", +"36013189": "randomness()", +"360184e9": "Fouracoin()", +"3601dd87": "TNTToken(uint256,string,uint8,string)", +"36025bf8": "licenseTermsHasMaxCost(bytes32,bytes32)", +"3602627d": "BdpImageStorage(bytes8)", +"3603b0b0": "MULTISIG_WALLET_ADDRESS()", +"36044ecc": "changeTokenReward(address)", +"36046916": "generatePresciptionCode(int256)", +"3604caa1": "lockAddress(address[])", +"36054f51": "affiliatThreshold4()", +"360583c6": "getUsersGunsIds()", +"36066f71": "Token(address,string,uint8,string,address,address)", +"36067543": "FirstEtherLimit()", +"3606c983": "createClaimMsg(bytes32,string,string,address)", +"36080694": "deleteRate(bytes4)", +"360821e8": "setMinimumBitcoinToInvest(uint256)", +"3608672c": "liveBetexICO()", +"3608c9eb": "MULT_FACTOR()", +"360998e6": "Cryptex(address,address,address,uint256,uint256,uint256)", +"3609ac8f": "START_PRICE()", +"3609bf09": "updateBusiness(uint256,uint256)", +"360aa28b": "isVersionContract()", +"360aac67": "accountGameResult(address,uint256)", +"360b3b31": "setAirdropEnabled(bool)", +"360b8115": "VipMigration(address,uint256)", +"360c97dd": "frozenAnnually()", +"360c9ed0": "deprecateBodySubtype(uint8)", +"360cdf5e": "AsOyToken()", +"360e5f54": "TokenGift(address,uint256)", +"360ec1b8": "processPurchase(bytes32,int256[],int256[])", +"360ed9c2": "receiversCount()", +"360f1d07": "bonusRatePrivateSale()", +"360f6b21": "chargingSwitches(address)", +"360ff695": "timeTier3()", +"3610724e": "buyTokens(uint256)", +"361228ea": "weiForToken()", +"36127d7e": "updateEMA(uint256)", +"36134a4b": "shouldBeStarted()", +"3613b781": "revokeVesting(address,address)", +"36144c9a": "getUserReferrer(address)", +"3614ac6f": "test4_searchSameNode()", +"36157f5a": "totalDivSupply()", +"361698ff": "adminSetWorldSnapshot(uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"36169d90": "sweep(address,uint256,uint8[],bytes32[],bytes32[])", +"36170ae5": "startingDateFunding()", +"36173764": "frozen(address,uint256)", +"3617653e": "powerContract()", +"3617d5c6": "viewIndexNumber()", +"36181026": "tryToFinalize()", +"361819e8": "RANGEEND_4()", +"36186868": "icoWeek2Bonus()", +"361893f7": "getBrand(address)", +"3618b290": "hodlFor2y()", +"3618c2a2": "removeAddressesSet(address)", +"36199817": "setFinalTimestampOfBonusPeriod(uint256)", +"3619cd99": "myHalfDividends()", +"361a4eb8": "Party()", +"361a5468": "testFailMoveWhenStopped()", +"361ae621": "LifMarketValidationMechanism(address,uint256,uint256,uint8,address)", +"361b5eaa": "token(bytes12)", +"361b94be": "contributorMinCap(address)", +"361bb340": "left48(uint256)", +"361bfc5b": "ETH_per_BRA()", +"361c14b0": "teamUnlock4()", +"361cac82": "marketStores()", +"361cc3ab": "getUserTotalPromoBonus(address,address)", +"361d004f": "changeBank(address)", +"361d292e": "getCarAuctionID(uint32)", +"361d4e53": "usedTokenBalance(address)", +"361d55be": "callback_ForUnderwriting(uint256,string,bytes)", +"361f10e5": "setSiteAccountAddress(address,address)", +"361fab25": "setSupplyLimit(uint256)", +"361fd603": "First_pay_clientmanager()", +"3620f56d": "addQuest(address)", +"3622b5ef": "PIGGY_BANK(address)", +"36234138": "registerPair(address,address)", +"362344b8": "MAX_YAYS()", +"3623c225": "bid(uint16,uint256)", +"3623f548": "getAllWinner()", +"36249140": "third_withdrawal(uint256)", +"36261907": "setting(address,address)", +"36262665": "getOwnershipTokenCount(address,address)", +"362698a2": "Unlocked(string,bytes32,address)", +"3626aae7": "getMedalType(uint256)", +"36274669": "Poll()", +"3627d195": "FuckToken()", +"3627d3a1": "mintPrivate(address,uint256)", +"36281b38": "uppercaseOf(string)", +"36285df7": "bonusWindow1EndTime()", +"3628731c": "addAddresses(address[])", +"3628ca60": "getEpisodeList()", +"3628e6f3": "BMTToken()", +"3629c8de": "activation()", +"362a0c27": "_withdrawWonCosFromGame(uint256,uint256,uint256)", +"362a198d": "nextBurnFeeAbs(uint256)", +"362a36b4": "bidFeePercents()", +"362af076": "createRequest(address[3],address,uint256[11],uint256,bytes)", +"362bd679": "updateFreeStorage(address,uint256)", +"362c160e": "changeWithdrawalDate(address,uint256)", +"362c78b9": "invitedReward()", +"362cb8ff": "icoSucceeded()", +"362cba6f": "PlotSale(uint256,uint256,address,address,uint256,bool)", +"362e1c76": "updateparentdynamicprofis(address)", +"362e2565": "returnDeposits()", +"362e4945": "lengthAddresses()", +"362e669a": "BarrosTest()", +"362ec5e2": "createProductionUnit5()", +"362f04c0": "participantCount()", +"362f5fb2": "getDogInfo(uint256)", +"362f74e7": "updateBatchSupport(bool)", +"362f8833": "stakeRoto(address,bytes32,uint256)", +"362fe943": "MainBridge(address,uint256,address[])", +"36304e91": "allFactories()", +"3631826a": "multiline(uint256,uint256)", +"3631ecd9": "privateStart()", +"36321001": "will()", +"363210c9": "_delegatecall(bytes32,uint256)", +"363221fe": "advisorTokens()", +"3632803f": "calculateGrapeSell(uint256)", +"3632b4d9": "withdrawCoin(bytes32,uint256)", +"36330b0c": "updateInitialZero(uint256)", +"363349be": "fillOrdersUpTo(address[5][],uint256[6][],uint256,bool,uint8[],bytes32[],bytes32[])", +"36335e19": "contributePublic()", +"3633b1ad": "createRealmSale(uint256,uint256,uint256)", +"3633c522": "GiftPoolContribution(address,uint256)", +"36344022": "testAuthorizedTransfer()", +"363487bc": "currentInterval()", +"3634a1b7": "createSeries(bytes32,string,bytes32,uint256)", +"3634b376": "GATcoin(uint256,string,string,uint8)", +"3634dcd8": "sub0(uint256,uint256)", +"36351c7c": "recharge(address,uint256)", +"36354b2f": "updateEtherAndtokenAmount(address,uint256,uint256)", +"3635e329": "getCurrentPeriodByEntity(uint256)", +"363626ad": "addressesToTotalWeiPlaced(address)", +"36371722": "chunk4IsAdded()", +"36382941": "changeTokenOwnerWalletAddress(address)", +"3638ae05": "transferETHtoProviders(address,address,uint256,address,uint256)", +"3638fb00": "transferOwnership(address,bytes32[3],bytes32[3],uint8[3])", +"3639dda5": "monthly_token_growth()", +"3639e955": "addToBothSendAndReceiveAllowed(address)", +"363a0903": "Creatable()", +"363a4708": "setMintFeeReceiver(address,address)", +"363ad06f": "getFrozenAmData(address,uint256)", +"363bc3a2": "alreadyAutoAirdropAmount()", +"363bf964": "setAddresses(address,address,address)", +"363c3747": "TestBalance(address)", +"363c51dc": "set_savings_goal(uint256)", +"363c6b81": "MAX_PENDING_REQUESTS()", +"363c76f3": "HLChain()", +"363c9bca": "runTimeAfterSoftCapReached()", +"363db35d": "IcoTotalSupply()", +"363dc725": "_unpackProtectionParams(uint256)", +"363dd19e": "summon()", +"363df59a": "UNGTToken(uint256,string,string)", +"363ef9dc": "APB()", +"363f7746": "validSignature(uint8,bytes32,bytes32)", +"363fa6b2": "renameChibi(uint256,string)", +"36400cd2": "ALM()", +"3640599c": "getPI_edit_6()", +"364083f4": "makeSale(uint256)", +"3640ca5b": "SupermarketKontrak()", +"3640e413": "YunPengToken(uint256,string,uint8,string)", +"3640f613": "cancelMatch(uint8)", +"3640f910": "LogEndSale(bool,uint256,uint256)", +"36422e49": "_createEtherDogWithTime(uint256,uint256,uint256,uint256,address,uint256,uint256)", +"3643d14b": "withdraw_to(address,uint256,uint256,uint256)", +"3645ebfb": "indFundDeposit()", +"36470665": "battleboardDataContract()", +"36471908": "ownerPerThousandShareForMating()", +"36475668": "getCommunityData(string)", +"3647b084": "setAmountBonuses(uint256[],uint256[])", +"3647b87a": "buildFactory()", +"364832cd": "isStrongHand()", +"36484ea0": "PHASE2_START_TIME()", +"36489775": "USDZAR(uint256)", +"364aa98d": "createDate(uint256,uint256,uint256,uint256)", +"364c7815": "addCredit(uint256,address)", +"364cc73e": "isEatingAndDrinking(address)", +"364d0b53": "getAddress(bytes32,uint8,bytes32,bytes32)", +"364d279a": "phase2Duration()", +"364d2a06": "queryCreatureOwner()", +"364ddb0e": "left52(uint256)", +"364ddc2d": "getmemberposition(uint256,address)", +"364deeef": "Sceatt()", +"364e022f": "buyProduct(string)", +"364e0af3": "_createEdition(string,uint256,uint256)", +"364e1c59": "publicsalesendTime()", +"364e69b7": "canBet(uint256)", +"364e74eb": "releaseTokenTime()", +"364ea9e7": "set(uint256,uint256,bool[],uint256[])", +"364ee75d": "getRoundEnd()", +"364f4896": "emission(address,address,uint256,uint16,uint16)", +"364f6695": "earlybird_coins()", +"365044a8": "priceDivider()", +"36516a8a": "publisherAddress()", +"3651b401": "commissionGetter()", +"3651b5df": "setTargetWallet(address,address)", +"36525c4e": "resetStorage()", +"36527357": "getUint(int256,address,string)", +"3653cf9f": "getOldESOP()", +"36540b3b": "amountFundPlatform()", +"36548b58": "arrayIndexOutOfBounds(uint256)", +"36555b85": "add(string,uint256)", +"36566f06": "togglePaused()", +"3656de21": "getProposalById(uint256)", +"3656eec2": "balanceOf(uint256,address)", +"36579ff6": "Burnable()", +"3657ba36": "getSharedAccountPw(bytes32,bytes32,bytes32)", +"36585cd3": "getBatchStartTimesLength()", +"3658964c": "totalBal(address)", +"3659078c": "DailyDivs()", +"3659467b": "registerName(uint256,bytes32)", +"3659887c": "isAlreadyUser(address,address)", +"3659a8b2": "bonusEnds1()", +"3659cfe6": "upgradeTo(address)", +"3659d90f": "month12Allocated()", +"365a5306": "loan(uint256)", +"365a86fc": "hub()", +"365af466": "failedWhitelist(address)", +"365b1b15": "upgradeKiOS()", +"365b29e8": "WEBPOUND()", +"365b5055": "isAccountFreezed(address,address)", +"365b94ad": "saleFinished()", +"365b98b2": "users(uint256)", +"365c2e95": "hasEnough(address,uint256)", +"365c81fb": "pubsaleRate()", +"365ccbef": "didTakeOrder(bytes32,address,uint256)", +"365ce233": "removeAccountReader(address,address)", +"365db060": "acquireExternalGauntlet(uint256,address)", +"365e304d": "DATE_31_DEC_2021()", +"365e808d": "transferFromHyperstakingdisbursementfund(address,uint256)", +"365ede48": "setReport(string,uint256,string)", +"365f6e9f": "getCellsSinceLastEvent(address)", +"365fe9fd": "isDistributionTransferred()", +"36600999": "fundRepository()", +"366077ee": "addToPot(uint256)", +"3660943d": "checkState(bytes)", +"3660a084": "transferSigner(address)", +"3660bef0": "setDemandCurve(uint256,uint256)", +"3660fcd0": "setGuestName(string)", +"36610cb9": "storeOptions(address,uint256)", +"36645e01": "Election(uint256,uint256,uint256,address)", +"3664a0ea": "getLastCallKey()", +"3664b12d": "erc223Activated()", +"36651d2a": "setDestoryAddress(address)", +"3665708e": "nextMinPlay()", +"3666750e": "fillHeldData(address[],uint256[])", +"3667551c": "Partial8Send()", +"36682d5d": "Transtoken()", +"366859c4": "job(address,address[],uint256)", +"3669acad": "_newChallenge(uint64,uint64,address,uint256)", +"366a4120": "release(uint256,uint256)", +"366a68dc": "setBlockLock(uint256)", +"366ac8e0": "LGCCoin()", +"366b6e9e": "secureUnapprove(bytes32)", +"366ba691": "CBX()", +"366bb03c": "totaTeamRemaining()", +"366bc343": "AssignFeeToWallet(address,address,uint256)", +"366bc401": "collectedUSDWEI()", +"366d2b4e": "CancelledBySeller(bytes32)", +"366df51d": "initializeMintableTokenFundraiser(string,string,uint8)", +"366dff9c": "walletAllowances(address,address,address[])", +"366e81d6": "TokenSold(uint256,uint256,uint256,address,address)", +"366e881a": "commitScores(uint256[],uint256[])", +"366f2d86": "paymentDue(address)", +"366f77b7": "checkChoice(uint8)", +"3670e072": "gettoday()", +"3672404e": "getServiceCount()", +"367265fb": "transferTokensManual(address,uint256)", +"36730467": "split(uint256,uint8,uint256,address[],address,uint256[])", +"36733fa0": "addRange(address,uint256)", +"36738b41": "Crowdsale(address,address,address,uint256,uint256,uint256,uint256,address,uint256)", +"36746413": "PrivateInvestment()", +"367488ce": "roulette(uint256)", +"36751a6b": "uploadCode(string,bytes)", +"36756935": "FinalConfirmation(address,bytes32)", +"36756a23": "constructor(address[],uint256)", +"3676049b": "setFundFeeAddress(address)", +"367605ca": "setApprovalForAll(address,address,bool)", +"36760fd2": "HULKtoken()", +"36767205": "increaseTokenLock(address,uint256)", +"3676b342": "createAddOn(string,uint256)", +"3677b5f2": "LATokenMinter(address,address)", +"3677c333": "authorizeBurnRequester(address)", +"3678933c": "isEpochDataSet()", +"3678f179": "crosairShipMinted()", +"367a0f97": "getReputationProblems(address,string)", +"367ad6ea": "redeemPack(uint256)", +"367afa7a": "_nextPrice(uint256)", +"367ba52c": "submitOrder(uint8,uint8,uint64,uint64,uint16,uint16,uint16,uint16,uint16,uint16,uint256)", +"367bbd78": "strlen(string)", +"367bc8d3": "TransmutedTransfer(address,address,uint256,address,string,string)", +"367bf2f9": "currentBlockHeight()", +"367c574f": "DIP_Pool()", +"367cad89": "alternative_Exchanges_links()", +"367ebb99": "deathData_a12()", +"367edd32": "enableContract()", +"367f0708": "ico1Raise()", +"367f20f6": "_unpackBaseDamageValue(uint256)", +"367f34de": "performALU()", +"36805961": "setStr(string,string)", +"368186ef": "DigiberyToken()", +"3682905e": "RICOStandardPoD()", +"36829419": "AddrInvestor()", +"3683b44a": "checkPrizeAlreadyReceived(address,uint256,uint256)", +"3683ec67": "CavsvsPacers425()", +"3683ef8e": "preSign(bytes32,address,bytes)", +"36840423": "AddAdrJullarTeam(address,address)", +"36842110": "wasCrowdsaleStoped()", +"36851957": "CustodianInterface(address)", +"36865384": "BuyShare(uint32,uint32,address,address)", +"368691fc": "comprarTicket(uint256,uint256)", +"3686ca3e": "beneficiaryWithdrawal()", +"3686d52a": "ppsBase()", +"3686edc7": "_getBmcDaysAmountForUser(bytes32,uint256,uint256)", +"368701b9": "firsttestnetico()", +"3687e257": "TenantTerminate(string)", +"3687e921": "readInfo(address,uint256)", +"3687f24a": "setFee(uint128)", +"36880b82": "recordOwnerOf(bytes32)", +"368818aa": "FrozenMediaTokenFunds(address,address,bool)", +"3688632e": "setAvgSalesCount(uint256)", +"3688c272": "getTokenPriceListByIds(uint256[])", +"3688fa2c": "issue(address,uint64)", +"3689a651": "paymentFrom(uint256,bytes,address,address)", +"368a5773": "SpermLab()", +"368a5e34": "AIRDROPPER()", +"368aa9ca": "p_update_priceUpdateAmount(uint256)", +"368af7f3": "availablePonzi()", +"368b069d": "deployEscrowClone(address)", +"368b2842": "safeBatchTransfer(address,uint256[],uint256[],bytes)", +"368b3c81": "PTTYC(uint256,string,string)", +"368b8772": "setMessage(string)", +"368bf74e": "TEAM_LIMIT()", +"368d09d8": "requestOracleValue()", +"368d6b25": "setRushTimeChallengeRewardsPercent(uint256)", +"368daf8f": "goldMigrationsCount()", +"368dde4b": "currentCost()", +"368e5d4e": "BTC_SUISSE_TIER_4()", +"368e85ff": "IICO(uint256,uint256,uint256,uint256,uint256,address)", +"368f3492": "AnemoiSaleContract()", +"368f76a9": "bossCutPercentage()", +"36909ddd": "isATMHolder(address)", +"3690fd03": "CPLPrivate()", +"3691125a": "LianPaiToken()", +"36917dfa": "getPony(uint256)", +"3691dd11": "userApprove(address,uint256,uint256)", +"3692d61a": "log(string,bytes32)", +"3693396a": "getLastSignedTime()", +"36937781": "initialize_proposal()", +"369388cc": "EMISSION_FOR_BOUNTY()", +"3693db0a": "FOUNDER_ONE()", +"36944e49": "secondRefundRoundRateNumerator()", +"36945328": "setAddrContractCaller(address)", +"3694566e": "getRate(uint256,bytes32)", +"3694569e": "IHateEos(string)", +"3694629a": "getQuestionFinalizable(uint256)", +"3695507b": "IRC_PER_ETH_PRE_SALE()", +"3695672b": "newBurnableOpenPayment(address,uint256,bool,uint256,string)", +"36958413": "weaponEntities(uint256)", +"36965e3a": "SetAElfDevMultisig(address,address)", +"3697d0a7": "renderLandingHash()", +"3697efb2": "MinerEdgeCommunity()", +"3697f055": "withdrawFunding(uint256)", +"36988bc4": "currentLoanPerson()", +"3698de0a": "soliditySha3(bytes32)", +"369ac28f": "deltaTime()", +"369b1ce5": "initialBuy(address[])", +"369badf1": "getCreditsAtIndex(uint256)", +"369bcd64": "_checkPixelUnder(uint256)", +"369cbbb4": "checkMonthlyLimit(address)", +"369cd460": "totalPilfered()", +"369d32f1": "Items()", +"369d8138": "createAsset(string,string,string,uint256)", +"369de07d": "PDTX()", +"369e2422": "updateTokenPricePerUSD(uint256)", +"369e8c1d": "commit(address)", +"369f927f": "initBlockEpoch()", +"369fe962": "getDisputeMemorySize(uint256)", +"36a013c8": "LogInvestment(address,address,uint256)", +"36a09eae": "SetPriceMultiple(uint256)", +"36a0f511": "getPeriodMinting(uint256)", +"36a128c2": "MyJioCoin()", +"36a1bbfd": "baseTargetReached()", +"36a1c184": "IsArt()", +"36a1fb5f": "changeUserStatus(address,bool)", +"36a23dbf": "freezing(bool)", +"36a26b99": "END_TIME_PRESALE()", +"36a26fd9": "TokenDeactivated()", +"36a2f0f1": "changeLocked()", +"36a31de5": "getRequestOwner(uint256,uint256)", +"36a33f99": "isLimitMint()", +"36a3668a": "teamTokensPerPeriod()", +"36a36f7c": "betexStorage()", +"36a39882": "_proceedStage()", +"36a42675": "combineInterest(uint8,uint8)", +"36a4f2ba": "createBtcAddress(uint256,int256,uint256,int256)", +"36a60891": "setTrainingFeeMultiplier(uint256)", +"36a6412b": "buyMicroKeysWithHandle(string,bytes32)", +"36a6ad58": "mintPartnershipTokens()", +"36a716da": "createOrderHash(address,address[3],uint256[5],int256)", +"36a7cf1f": "setBallotFactory(address)", +"36a9f2f7": "xactionFeeNumerator()", +"36aa972e": "FullPayChain()", +"36ab0f15": "getNewAllowancesEffectuation()", +"36ab753e": "startRefunding()", +"36abffd4": "_receiveFunds()", +"36ac732e": "updateSecondChangeBlock(uint256)", +"36ad6e46": "SendTokensToFounders(uint256,uint256,uint256)", +"36add1df": "interestDistribution()", +"36ae22f0": "emitFeePeriodRollover(uint256)", +"36ae31ec": "getCatOwners()", +"36ae5040": "isMinted()", +"36aec5a3": "amountContributed(address)", +"36af1954": "withdrawnReadable()", +"36af50fd": "setSale(address)", +"36af8151": "setSpareRecommAddr(address)", +"36b024ab": "setTransferableDate(uint64)", +"36b09474": "winningNumbersPicked()", +"36b1315c": "min64(uint64,uint64)", +"36b19cd7": "adminWallet()", +"36b1f6a3": "getDApp(uint256)", +"36b222b3": "fillOptionOrder(address[3],uint256[3],uint256[2],bool,uint8,bytes32[2])", +"36b2e0f9": "acceptBidForCollectible(uint256,uint256,uint256)", +"36b2fe94": "setPurchaseAdmin(address)", +"36b324ff": "unMap(address)", +"36b33415": "modifyMemberInfo(string,string,string,string)", +"36b3da05": "chargeBalance()", +"36b40bb6": "leftOnLastMint()", +"36b61e3c": "otc()", +"36b641c2": "MakeMyToken(string,string,uint256)", +"36b69367": "parentFees(address)", +"36b77107": "lastDeposit()", +"36b81feb": "Deed(address)", +"36b97fd5": "TestToken5(address,address,address,address,address,address,address,address)", +"36b9856d": "newOraclizeSetProof(string)", +"36bacc7c": "getTentativeWinningPayoutDistributionHash()", +"36bb9ffa": "MANHATTANPROXYPARKAVE()", +"36bc32a2": "expectedPayout(address)", +"36bcb4c9": "changeAge(uint8)", +"36bcb4cd": "ViteToken()", +"36bdee74": "totalETH()", +"36be2a73": "setLedger(uint8,int256)", +"36bee178": "add_to_withdraw_bounty()", +"36bf094b": "BonusPeriodsCount()", +"36bf2e15": "ERC20ImplUpgradeable(address)", +"36bf392b": "distributeInvestorsFee(uint256,uint256)", +"36bffe1e": "nextCommonTTMTokenId7()", +"36c0aada": "setValueAll(uint256)", +"36c0c834": "buySignature(bytes16)", +"36c1a50f": "notZeroNotSender(address)", +"36c28466": "Panel()", +"36c2a922": "KryptopyToken()", +"36c2d72d": "getTotalSlaves(address)", +"36c35f94": "finalize1()", +"36c4a520": "Volks()", +"36c4ad0c": "getEthFromKeys(uint256,uint256)", +"36c4db09": "setCOO(address,bytes)", +"36c4ff7a": "payoutAddr()", +"36c5787e": "setTokensWave(uint256,uint256[10])", +"36c5bf8c": "_ownerReleaseLimit()", +"36c5d724": "removeToken(uint256)", +"36c5ff5d": "addToTransactionDisallowedList(address)", +"36c61b60": "_buyToken(uint256,uint256,uint256)", +"36c63b8d": "AbstractVirtualToken()", +"36c6a410": "BatanCoin()", +"36c7d4bd": "processReinvest(uint256,uint256,uint256)", +"36c802a0": "priceStage2()", +"36c84de5": "getPlayerDataByAddress(address)", +"36c8af5d": "_getId()", +"36c8c0e9": "addBonusBatch(uint256[],address[])", +"36c8c5ee": "voteForCandidate(uint256)", +"36c8e831": "PhillionToken()", +"36c92c3f": "setRoundDuration(uint256)", +"36c9c62d": "transfer_opt(address,address,uint256)", +"36ca97d6": "tokenFeePercent()", +"36cb4c48": "log256(uint256)", +"36cb8098": "BouCrowdsale(uint256,address,address)", +"36cb8740": "test_3_accessRestriction_vote_shouldThrow()", +"36cbee23": "bountyFunds()", +"36cc17a7": "clientClaim(uint256,uint64)", +"36cc18b5": "setPriceIdv(bytes32,address)", +"36cc1ebb": "setCCH_edit_13(string)", +"36cc6a10": "modifyTokenFee()", +"36cd24aa": "prepareVote(bytes32,uint256)", +"36ce94bf": "bytesToAddress1(bytes)", +"36cf7c87": "dead()", +"36cfe3eb": "starbaseEarlyPurchase()", +"36d0288c": "CL()", +"36d02c94": "changeSettings(uint256,uint256)", +"36d03356": "setAdvisorsTeamAddress(address)", +"36d10e45": "LemonsRemainingToDrop()", +"36d1535d": "getEbola()", +"36d15f2a": "_validateSettleSignatures(bytes32,bytes,bytes,bytes,bytes)", +"36d18b67": "RED()", +"36d1f54b": "UnitedfansTokenCrowdsale(address)", +"36d213ec": "TRToken(uint256)", +"36d22de7": "pokerbox(uint256,uint256)", +"36d26647": "getReportHash(uint256)", +"36d300b3": "addAction(uint256,uint256,uint256)", +"36d373c0": "writeDefinitions(uint8,string)", +"36d38bd4": "scs()", +"36d43c24": "withdrawId()", +"36d505cf": "_breedWith(uint256,uint256,uint256)", +"36d61112": "getVendingStepQty(uint256)", +"36d647cf": "bonusLine()", +"36d81f07": "getUser1()", +"36d90c2d": "Dillionworldcoin()", +"36d9377e": "GetAllNode()", +"36d938d8": "Transaction(uint256,uint256,address,uint256,uint8,uint256,uint256,bytes)", +"36d95f56": "MIN_FUNDING_GOAL()", +"36da1471": "crowdSaleCheck()", +"36da4468": "supplier()", +"36da5cd8": "atomToken()", +"36da9ec9": "roundTwoRate()", +"36dac2cc": "getMeta(uint256)", +"36dc1dd2": "createBSMHash(string)", +"36dc58f6": "total_SDCC_supply()", +"36dd20a7": "getJobWorker(uint256)", +"36dd58f2": "dispatch(address,uint256,string)", +"36de44e0": "GFC(uint256,string,string,uint8,address)", +"36df05bc": "wholesaleLeft()", +"36df99b6": "blackswanToken()", +"36dfe260": "payOneTimeReward()", +"36e0004a": "multiSig()", +"36e05d94": "fundariaShare()", +"36e0e824": "asset(uint256,bytes)", +"36e0f6cc": "allowSell()", +"36e4e8fd": "tulipToOwner(uint256)", +"36e4f915": "claimToken(bytes32,string,address)", +"36e520bc": "verifyAddresses(address[])", +"36e61cf7": "decTap(uint256)", +"36e685f5": "setCLevelAddresses(address,address,address,address)", +"36e6b92e": "taskProcessedWithCosting(uint256,uint256)", +"36e73918": "getRegionNextImageId(uint256)", +"36e9f43f": "SMRDistributionVault()", +"36ea1938": "executeTrade(address,address,uint256,uint256,address)", +"36ea76e2": "Hyperion()", +"36ea8189": "DetailsUpdated(bytes32,bytes32,uint256)", +"36ea8702": "makeMetaPublic(uint256,bool)", +"36eb3aa9": "LGBT()", +"36eb5b47": "getResoSCParams()", +"36ebc4dc": "__allocateTokens(address)", +"36eda23f": "setRST(address)", +"36edbe17": "createPlayer(address,uint256)", +"36ee1f2b": "SDTToken()", +"36ee46f5": "killAnimal(uint8,uint16)", +"36ee7773": "getBallotsStorage()", +"36ee83f9": "getOrderPriceTotal(uint256)", +"36ee8812": "updateReleasedBalance()", +"36eec28e": "allocated4Year()", +"36eed01f": "getScoreWithCustomerAddr(address)", +"36ef0cea": "createStartingColors()", +"36ef1abb": "disburseDividends()", +"36ef6c82": "addEmbassyOfCountry(address,uint256)", +"36ef80db": "getId(address,address)", +"36f00e8a": "setFeeFlat(uint256)", +"36f19b77": "getPurchasedBlockhash(uint256)", +"36f2393e": "changeTokenURIPrefix(string)", +"36f26095": "minimalCap()", +"36f2b803": "Oceans8RT()", +"36f3dc2d": "STAGE_FOUR_ETHRaised()", +"36f54767": "VitaminToken(uint256,string,string)", +"36f656d8": "assertEq(string,string,string)", +"36f66528": "EtherDelta(address,uint256,uint256)", +"36f78d77": "newGroup(address[],uint256,uint256)", +"36f7992b": "putOnSale(uint256,uint256)", +"36f7ab5e": "contactInformation()", +"36f7cd70": "setPricePerStake(uint256)", +"36f8edc2": "getPlayerShipBattleLossesById(uint64)", +"36f93a99": "cofoundersSupplyVestingStartDate()", +"36f9825f": "accountIndex(uint256)", +"36f9f49c": "etherandomSeed()", +"36faa509": "ssps(uint64)", +"36fbedd3": "existsAuditorFromMultiRequestAssignment(uint256,address)", +"36fc75ee": "setRegsitrarAddress(address)", +"36ff37f4": "UpdateEvent()", +"36ffa905": "getMyProposals()", +"370014f2": "sendFundHome()", +"370097ac": "donotUSBDappToken()", +"370099d4": "airSwap()", +"370158ea": "info()", +"37016a5f": "getAuctionStartedAt(uint256)", +"3701fada": "PFC()", +"370292eb": "clearApproval(address[16],address,uint256)", +"3702ab03": "buyBasicCards(uint256,uint256)", +"37033be6": "processReservationFundContribution(address,uint256,uint256)", +"37034853": "ownerHistoryCount()", +"3703d911": "createItem(string,uint256,uint256,address,uint32,string,uint32)", +"370419e5": "arm()", +"37048f8f": "_newValidatorSetCallable()", +"37049b06": "getTier(uint32,uint256)", +"3705f69e": "canRelease()", +"37072ec7": "getHealthCitizens(uint256)", +"37074dae": "receivedEther(address)", +"37077409": "_updatePurchasingState(address)", +"3707a967": "putForExchange(uint256)", +"3707cfc1": "update(uint256,uint256,address)", +"3707ed7e": "gettops(address)", +"37086c8e": "airdropWithLockup(address,address,uint256,bytes)", +"3708c99e": "openWhitelistEndTime()", +"370943e3": "ZionToken()", +"370b6939": "AdminSetDrawer(address)", +"370b8c90": "info(bytes)", +"370c6001": "abortTransaction()", +"370d4c6e": "setGameOn(bool)", +"370d62ad": "anyRateIsStale(bytes4[])", +"370e052b": "addPreSaleTokensMulti(address[],uint256[])", +"370e9161": "rollDice(uint256,uint256)", +"370ec1c5": "_fillOrder(address,uint256)", +"370f2827": "finishJackpot(uint256,uint256)", +"370f388e": "MegaCandy(address)", +"370fb47b": "triggerTime()", +"370fc812": "set_stopsell(bool)", +"370fed6e": "setProfile(string,string,string,uint32)", +"37110967": "eTokensToSend(address,uint256)", +"371115d1": "LamboToken(uint256,string,uint8,string)", +"3711d9fb": "saleDuration()", +"3711e829": "withdrawnAmountForSalePromotion()", +"37126b38": "getTime5(address)", +"3712880c": "changeTokenExchangeRate(uint256)", +"37128a12": "initBoostData()", +"371303c0": "inc()", +"3713513a": "TOKENO()", +"3713ab41": "WPXSold()", +"37142391": "GetPartManager(uint8,uint256)", +"3714ae13": "newTokenPrice()", +"3714e274": "mintAllBonuses()", +"3715ae53": "sendApprovedTokensToInvestor(address,uint256)", +"37164433": "withdrawConfirm(uint256,address)", +"3716b8b4": "DonatorSetBanner(string)", +"3716bd22": "showCertificationDetails(uint256)", +"3716ca33": "updateGenerationRatio(uint256)", +"3716f65d": "withdrawDthShop(address)", +"3717798b": "auctionStarted(string)", +"3717a7a7": "Omnic(string,string,uint256,uint256)", +"3717f34c": "divRemain(uint256,uint256)", +"37180750": "getTaskKeyAtIndex(uint256)", +"3718766b": "EventQuitBattle(address,uint256)", +"37189157": "checkWithdrawalAvailability(address,address)", +"3718a923": "canShelf(string)", +"3719427e": "acceptDividends(uint256,uint32)", +"371a4ea8": "getProposalById(uint32)", +"371aa158": "init(address[],uint256[])", +"371ab702": "getMicroModuleByIdPart2(uint256)", +"371be589": "getconfig()", +"371c7dba": "setAllowPriceUpdate(bool)", +"371db7af": "BlockPaymentSystem()", +"371dd5ed": "initRound()", +"371e8e27": "gameResultsLogged()", +"371ecfde": "_directTransfer(address,uint256)", +"371f468c": "GlobalSuperGameToken(uint256,string,string)", +"371fe247": "_checkHashAndTransferExecutorFee(bytes32,bytes,address,uint256,uint256)", +"37205d76": "isCrowdSaleSetup()", +"3720e5b6": "E_AuctionStarted(address,uint256,uint256)", +"3721a634": "requestSpectatorRewardForGladiatorBattle(uint256)", +"3721ee15": "ownerAccessoryCollection(address,uint256)", +"372210d1": "addGenesis(address,bool)", +"37227c07": "logFeeTokenTransferred(address,address,address,uint256)", +"3723100d": "mutiEthTransfer(address[],uint256[])", +"37235758": "currentEndsAt()", +"3723bc0e": "shareholders()", +"3723f149": "FOUNDATION_SHARE()", +"37246f43": "getVoteRulesOfTransaction(address,uint256,bytes)", +"37247af5": "_recalculateAvailable(address)", +"3724fb24": "tradeSpreadInvert()", +"372500ab": "claimRewards()", +"37253e35": "defrostTokens(uint256,uint256)", +"37254184": "jvCoin()", +"3725814a": "getMaxAddresses()", +"37258302": "SubwooferToken()", +"37268dbb": "_internalExchange(address,bytes4,uint256,bytes4,address,bool)", +"37270069": "maxWeiRaised()", +"37270936": "commander()", +"37271cc7": "withdrawBid()", +"37273b86": "PRICE_STAGE_PRESALE()", +"3727ae2d": "AthTokenBase()", +"3728aa4c": "saleCapReached()", +"3728bec2": "getCharacter(uint32)", +"3728f1f7": "EthereumOne()", +"37292eeb": "AVAILABLE_COMPANY_SUPPLY()", +"3729847b": "processSalesForSingleBuyer(uint256,address)", +"372a2a36": "DigitalArtChain()", +"372a49bd": "mspController()", +"372c1aff": "getPublicKeys(uint256)", +"372c6533": "START_DATE()", +"372c66e3": "updateAsset(uint256,string,string,string,uint256,address)", +"372cb1d9": "CallCount()", +"372cd183": "addAdmin(address,bytes32,bool)", +"372cd7ad": "clearAuthOfPermission(address)", +"372cfcc3": "noteSaleLocked(address,uint256,uint256,uint256)", +"372d6b27": "getStatistics()", +"372e80c3": "FLIPPINESS()", +"372ea717": "test_oneInvalidEmptyAddress()", +"372ed8cc": "setOraclizeDelay(uint256)", +"372f6bfe": "_refererUpdate(address,address)", +"372f88b6": "ICC()", +"372fc8d3": "HTSupply()", +"372ff945": "isInPhase(uint256)", +"37305e2a": "withdrawFromCustody(uint256,address,address)", +"37306299": "BurnableToken()", +"3730bb40": "yxkTOKEN()", +"37321bd7": "callstoredaddress(address)", +"37323d19": "LuckyETH()", +"3732c86b": "doubleTransferWithBurn(address,address,uint256,uint256)", +"3732e153": "ETHPrice()", +"37334878": "SHORTADDRTOKEN()", +"37338b05": "requireDing(uint256)", +"37339506": "restrictedPercent()", +"3733b378": "transferStackAndCall(address,uint256,uint256,uint256,uint256,uint256,bytes32)", +"3733faba": "forceStopCycle()", +"3733ffca": "convertTo(uint256,string,string)", +"37354a68": "luckyNumberOfAddress(address)", +"3735ab75": "buyCastle(address)", +"3735d57d": "PRESALE_BONUS_LIMIT()", +"3736d853": "setAverageBlockTime(uint256)", +"37371bc5": "getRandomRouter()", +"37375a43": "createContractEditionForCollection(string,uint256,uint256)", +"37376ca8": "cancelProposal(bytes32)", +"37383c2d": "getEventStart()", +"3738aa19": "ReleaseFundsToInvestor()", +"3738eb8a": "GolfCoin()", +"37391ce2": "testUnescapedQuoteInString()", +"373a1bc3": "scheduleCall(address,bytes4)", +"373a3af8": "intersect(uint256[],uint256[])", +"373a7c01": "fundTotalSupply()", +"373ae230": "checkLimit(address,address,uint256)", +"373c1df9": "test_3_destoryTokensAccrossBlocks_increaseBlocksBy1000()", +"373c98a2": "authCall(address,bytes32)", +"373d46b0": "IPOI(uint256)", +"373dde4f": "countPurchasedPixels()", +"373e0c80": "setFreezeAccount(address,bool)", +"373e441c": "addUserRole(string)", +"373eef4b": "ABsCoins(address,uint256)", +"373f5ff0": "COLOR_GREY()", +"3740eee9": "SetFund(address)", +"37411dc3": "createRandomZombie_Ether()", +"3741b92b": "jrecover_y(uint256,uint256)", +"3741c90b": "setAuthorizedWithdrawalAmount(uint256)", +"3743f0bf": "teamReserveAllocation()", +"3746010d": "createPrizeFighter(uint16,uint256,uint8,uint8,uint8,uint8,address)", +"3746b446": "Predictor()", +"37472c4b": "setDepository(address)", +"3749ea8e": "contribute(address,address,uint256,uint256)", +"374abace": "contractstarttime()", +"374aed97": "getCells()", +"374b8cda": "getTrade(uint256,address,address)", +"374b94c8": "MEC()", +"374ba203": "get_hosp1(uint256,uint256,uint256)", +"374bb090": "isAddressSet(address,address)", +"374bfba7": "claimFreeReferralPack()", +"374e164c": "addVirusDef(address,uint256)", +"374e9aa1": "stageForBlock(uint256)", +"374f7b7e": "checkLoanStatus(address,uint256)", +"375023f2": "total0xbtcReceived()", +"3750e05a": "TOKENS_BOUGHT()", +"37516ead": "microTip()", +"375188dc": "nextTask()", +"3751e6bc": "get_last_global_audit_document()", +"37525ff0": "listItemFromRegistry(uint256)", +"37528882": "calculateIntervalEarning(uint256,uint256)", +"37531b45": "StudentCoin()", +"37542d10": "addReferrer()", +"37548549": "setRecipientString(string,string)", +"37567d49": "maintenanceDeactivateUser(address)", +"3756b62b": "toB32(uint256,address)", +"3756bb45": "noOfTicketsOwned(address)", +"3756e207": "ExtremiumToken()", +"37574b3d": "TOKEN_FOR_TEAM()", +"37593f46": "queryN_fnc(uint256,string,bytes,uint256)", +"375a8131": "addStudent(string,bytes32,string)", +"375b3c0a": "minStake()", +"375b74c3": "custodian()", +"375c0117": "BurnTokens(address,uint256,bool)", +"375c21b0": "random(bytes32,uint32)", +"375c405d": "canIssueIndividual()", +"375c4627": "supplyPICO(address)", +"375c86dd": "m_pools()", +"375d6d90": "received_ethers(address)", +"375d9dc6": "isLimited(address,address,uint256)", +"375dce69": "getIssuable()", +"375e3ea8": "payoutForBudget(uint256,uint256)", +"375e88bd": "increaseBTCRaised(uint256)", +"375f2b96": "getCost(uint8)", +"375f3a9d": "PERC_TOKENS_TO_INVESTOR()", +"375f4498": "SetEditMode()", +"3760153c": "ETHero()", +"37603132": "RollLottery(uint64)", +"3760ceb0": "WAITTIMEUNTILWITHDRAWORTRANSFER()", +"37612672": "producer()", +"3761a3d6": "buyUcCoins()", +"3761d23f": "setFeeDistributionAndStatusThreshold(uint8,uint8,uint256)", +"3761dea8": "MarketPlace(address,address,uint256,uint256,address)", +"37621da0": "setMinChildCount(uint256)", +"3762346b": "externalPurchaseTokens(address,uint256,uint256)", +"37624204": "endPreIcoDate()", +"37629dda": "getArticleItem(uint256,uint256)", +"3762f0fe": "initMembers()", +"37632065": "claimUnderlying(address[2],uint256[7],uint8,bytes32[2])", +"37633f29": "TokensGate(uint256,uint256,uint256,address)", +"37638119": "getHouseEdgeAmount(uint256,uint256)", +"3763965f": "private_profits()", +"3763d4b4": "generalSaleEndDate()", +"3764cf3f": "NUMUS()", +"3764e2be": "setup(string,string,uint256,uint256)", +"37664643": "retractLatestRevision(bytes32)", +"376678e3": "BABYT()", +"37668a8b": "create(bytes32,address,bytes32,address,bytes32)", +"3766baba": "transferAllFromForcibly(address,address)", +"3767aec6": "handleTimedTransitions()", +"3767ea7e": "setTotalCapacity(uint256)", +"37680f18": "ERC20Standard(uint256,string,string)", +"37681083": "incrementReputation(uint256)", +"3768304c": "autoMint()", +"37689317": "generateLockedTokens(uint256)", +"3768bd09": "mulToFraction(uint256,uint256,uint256)", +"3769862f": "isAllowedUser(address,uint256,address)", +"376a4ce0": "setstring(uint256,string)", +"376b9c25": "depositProvider()", +"376c7374": "w_Bounty()", +"376d1555": "sendAuto(address)", +"376d567c": "setMod(address)", +"376db394": "setFreeze(address,uint256)", +"376ed9c6": "totalHedgelyWinnings()", +"376edf93": "getBidsByAdslot(uint256,uint256)", +"376ef9b8": "fromContractAddr()", +"376fc790": "fullTransfer(address)", +"376fc952": "setMaxReferrerBonusRequirement(uint256)", +"376fe102": "userId(address)", +"376ff7f0": "isRefundAllowed()", +"377002fb": "beArbitrator()", +"37714274": "FrancevsArgentina()", +"37717342": "breedOwn(uint256,uint256)", +"3771ab97": "payDividents()", +"37721ab7": "getDougName(string)", +"377272b3": "createValue(address,uint256)", +"3772c371": "getprize()", +"3773930e": "ConfigureFunction(address,uint256,uint16,uint16,uint16)", +"377481ca": "unlockedAddress()", +"3774e6f5": "starbaseMarketingCampaign()", +"37751b35": "doTransfer(address,address,uint256)", +"3777261d": "approvedFactories(address)", +"37775807": "buyerBalances(address,address,uint256,address)", +"3777f5d0": "tokensPerWeiBonus333()", +"3778e5b2": "groupInfo(uint32)", +"37790454": "PrintWinningInfo(bytes32,uint256,uint256)", +"3779a3b6": "saleRunning()", +"377a0f53": "bankAccount()", +"377ab651": "nextTurn(uint256,uint256[3],uint8[176])", +"377b2009": "isCanSell()", +"377b47a3": "logIn()", +"377c6a3e": "eth(uint256,uint256)", +"377d54ce": "assertOnlyParticipants(uint256)", +"377d78ce": "defineProjectWallet(address)", +"377dda1a": "NamiCrowdSale(address,address,address)", +"37800bde": "calculateTransferFee(uint256)", +"37806f07": "galleryOne()", +"3781afbc": "_isCorrectFullBuyin(uint256)", +"3781d882": "setRate347()", +"3781e576": "isOperatorForTranche(bytes32,address,address)", +"37820c57": "bulkMint(address,string,uint256)", +"378252f2": "closeAuction()", +"37828c52": "OTHER_STAKE()", +"3782cae2": "set_max_contribution(uint256)", +"37831b97": "payReward(address,address,uint256,uint256)", +"37848b6b": "getOwnedShipCount(address)", +"3784f000": "setEndDate(uint256)", +"378525bd": "bestAngel()", +"378544df": "timeAfterSoftCap()", +"378652d2": "MultiTransper(address[],uint256)", +"3787a30a": "ownerWithdrawEth(address)", +"3787b748": "WalletChange(address)", +"3788036f": "isAgreementSigned(bytes32)", +"37881299": "getCompare()", +"37881810": "setCallbackAddress(address)", +"3788e371": "BaldcoinCore(string,string,uint8,uint64,uint64,uint16,uint256,address[])", +"37890f94": "maliceReported(address)", +"378a2178": "tallyVotes()", +"378aa701": "getCurrentState()", +"378afddb": "withdrawMYB()", +"378b6a89": "canContribute(address,uint256)", +"378bc89d": "findAddress(bytes32,bytes32)", +"378c0605": "buyTickets(address)", +"378c4c1c": "computeMerkleRoot(bytes,bytes)", +"378c7cd9": "logCheck(uint256,string,uint256)", +"378c93ad": "setClaimable(bool)", +"378ca888": "setMaxFinalizationTime(uint256)", +"378cdb62": "proxyList(uint256)", +"378dc3dc": "initialSupply()", +"378e061e": "inactive_payable()", +"378e0fc1": "checkKwhDeployerAddress()", +"378e25f2": "withdraw_2Completed()", +"378ebf93": "setTokenToEtherAllowed(bool)", +"378efa37": "divider()", +"37900d5a": "issuedFromOtherCurrencies()", +"3790613f": "minChildCount()", +"379080da": "PRICE_MULTIPLIER_PREICO1()", +"379119af": "SJT()", +"3791759c": "migrateFeesDueToFork()", +"3791792a": "mintPack(uint256,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"37918bcb": "declareMvpLaunched(uint256)", +"3792a018": "left8(uint256)", +"3792a865": "MacroTokenContract()", +"3792e117": "GaiaToken()", +"37930615": "extend(bytes16[],uint64)", +"3793c1e8": "get_num_of_uses(address,address)", +"3793ccb3": "isPlayerOnBoard(uint256,address)", +"37941589": "test123token(uint256,string,string)", +"3795ad25": "lockStartDate()", +"379607f5": "claim(uint256)", +"37960cd5": "publicKeySize()", +"379698c1": "calculatePie()", +"37970dbe": "shouldAirdrop()", +"379725ee": "queryName()", +"3797528e": "IllusionDust()", +"3797b4de": "forwardRemaining()", +"37981c32": "pre_maxGoal()", +"37983aed": "getMyCards(address)", +"37986d2b": "freezeAndConfiscate(address)", +"37989eb6": "setOwnerBurner(address)", +"379930f7": "WHEEL_SIZE()", +"379986d9": "executeBurnProposal(uint256)", +"379995c3": "getDealerAndLuckyInfo(uint256)", +"3799bbd3": "privatePresaleAllocatingToken()", +"3799c5eb": "test_insert_findWithHintPrevRemovedUpdateHead()", +"379abed8": "ANPlaceholder(address,address)", +"379b7589": "signedTransfer(address,address,uint256,uint256,uint256,bytes32,address)", +"379ba1d9": "setTradingStatus(bool)", +"379ba2ab": "exchangeForQIU()", +"379ba3b7": "currSaleActive()", +"379bad0b": "addProofOfPerfBlock(uint32,string,bytes32,bytes32,bytes32)", +"379c1bd9": "createHorseShoe4(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"379c5131": "getByOwner(address)", +"379c5d3f": "ModuleToken(uint256)", +"379c8f6c": "_keepLastTransaction()", +"379ca09e": "priceStep5()", +"379dbdeb": "accessAllowance(address,address)", +"379e00d4": "maxTextLength()", +"379e2919": "setDevFeePercent(uint256)", +"379e9957": "fiveMatchPayoutInPercent()", +"379f946a": "initGeneralAttr(uint32,uint64)", +"379fed9a": "isMasterOfCeremonyRemoved()", +"37a0b958": "DATAToken()", +"37a14b52": "changeICODates(uint256,uint256,uint256)", +"37a1c540": "founder1Wallet()", +"37a1c84f": "registerNameResolver(string,address)", +"37a2890d": "eraByIndex(uint256)", +"37a28979": "setSettings(uint256,uint256)", +"37a30d3b": "current_price_atto_tokens_per_wei()", +"37a31079": "pointsLimit()", +"37a31895": "withdrawSelect(address)", +"37a366d8": "loggedBalances(address,uint256)", +"37a38bb1": "StateChanged(uint8,uint256,string)", +"37a3931f": "invalidate(address)", +"37a47106": "create(uint256,bytes32,uint256,uint256,uint256)", +"37a58bb4": "KudosPollFactory()", +"37a59139": "estimate(string)", +"37a5ae1f": "withdrawSingleBucket(address,uint256,uint256,uint256)", +"37a5fbab": "SaleStart()", +"37a66d85": "setPaused()", +"37a6b9f8": "recordCallback(address,uint256,bytes,bytes)", +"37a6d42b": "participant()", +"37a7095b": "LeviathanToken()", +"37a74f7e": "p_update_currentPlotEmpireScore(uint256)", +"37a7983b": "changeminContribAmount(uint256)", +"37a7b7d8": "feed()", +"37a7f2b7": "MIN()", +"37a87dfa": "updateList(address,address,bool)", +"37a91776": "OSATOKEN()", +"37a920f1": "Universe()", +"37aa1689": "getIcoDiscount()", +"37aa7f91": "isAuthorisedMaker(address)", +"37ab8f20": "notifyPlayer(uint256,uint256,uint256,uint256)", +"37ab9dcf": "getCPFee()", +"37ac8236": "getPunchCardsOf(address)", +"37ac9153": "Retrieve(string,address)", +"37adf3a3": "hasRefBonus()", +"37ae31c7": "DemSinhVienRequests()", +"37ae43a3": "BetOnHashV81()", +"37af5c32": "ANYtoken()", +"37aff76d": "getSystemAvaliableState()", +"37b0574a": "isClassic()", +"37b0786a": "icoInvestmentWei(address,uint256)", +"37b0ac71": "confirmTeamWithdrawal()", +"37b0f257": "setConfirmAddr(address)", +"37b34974": "reverse(bytes32)", +"37b475d4": "SOFT_CAPACITY()", +"37b4d863": "maxbet()", +"37b4f299": "IMTERC20()", +"37b54140": "buyTokensForAddress(address)", +"37b5dce4": "PDP()", +"37b6efeb": "engraveDefault(bytes32,string,string)", +"37b7bf11": "Tile(int256,int256)", +"37b89705": "getAgilityValue(uint256)", +"37b8cade": "raisedEthAmt()", +"37b8db1a": "executeVerdict(uint256,bool)", +"37b9756b": "totalIssuanceDebt_limitedSum()", +"37ba1b4d": "Fpgcchain(uint256,string,string)", +"37ba682d": "END_TIME()", +"37bb223e": "CUC()", +"37bb25bc": "withdrawalLimit(address)", +"37bd0d28": "howManyFucksGiven(uint256,bool)", +"37bd1868": "setHatchedEgg(uint64,uint64)", +"37bd78a0": "secondsTimeLocked()", +"37bdc146": "weiFounded()", +"37bdc99b": "release(uint256)", +"37be04b4": "EZStandardToken(uint256,string,uint8,string)", +"37be827d": "Sum()", +"37c08923": "totalContributions()", +"37c0a5ef": "Finished(uint256,uint8,uint8,uint8,uint8,uint8)", +"37c2afda": "signJUR(address)", +"37c30a98": "round_()", +"37c345cd": "specialManagerAddressMap(address)", +"37c35157": "updateTerm(uint256)", +"37c390e3": "allow_move(uint16)", +"37c3d50d": "buyAlt(address,uint256,string)", +"37c3ee6e": "doDistro(address[],uint256)", +"37c43088": "hashesSize()", +"37c44802": "initMonsterClassConfig()", +"37c57718": "ListingBought(bytes32,address,uint256,uint256,uint256,address)", +"37c62ed6": "createUnicornPriceInCandy()", +"37c6fcba": "LandlordTerminate(uint256,string)", +"37c74948": "getPropertyPrivateMode(uint16)", +"37c75992": "mintingIsFinished()", +"37c8d21f": "echo(string,string)", +"37c8f1d1": "AIgathaToken(address,uint256,uint256,uint256,uint256,uint256)", +"37caa8b6": "getTop(uint256)", +"37cb3c86": "distributeSlotBuy(address,uint256,uint256)", +"37cc7761": "contractReservedBalance()", +"37cc7cc0": "bannedCycles(uint256)", +"37ceb05b": "getFixtures()", +"37cef791": "getRate(address)", +"37d004b3": "bulkRelayCMCT(address[],uint256[],bytes32)", +"37d0208c": "bribe()", +"37d044cd": "tokenCreationPreSaleCap()", +"37d05434": "getCurrentRoundIssued()", +"37d1eb35": "setOffChainManagerAddress(address)", +"37d2649a": "Ownedfunction()", +"37d2d350": "setBOPSAddress(address)", +"37d33438": "totalHedgelyInvested()", +"37d3433f": "calculateAmountBoughtPreICO(uint256)", +"37d35507": "tokenCreationMinConversion()", +"37d365de": "admin_set_shopStoreRegister(address,address)", +"37d3ec7a": "ZBillionaire()", +"37d45088": "transferAllowed_(uint256,address,address,uint256)", +"37d48628": "totalSaleCapUnits()", +"37d4fc84": "Alpha()", +"37d76636": "item(uint256,uint256,bytes)", +"37d876b6": "GVTTeamAllocator()", +"37d9d7fc": "getBytes32(bytes32,bytes32)", +"37d9ffd1": "registerClient(address,uint32,uint256)", +"37da8058": "in_top_n(uint256,uint256)", +"37daa09e": "getUpCount()", +"37dac676": "getPOOL_edit_8()", +"37daf0ed": "getETHBalanceInfo()", +"37db0703": "isClean(string)", +"37db12c4": "PausePayment()", +"37dbbac4": "deleteMyEntity(uint256)", +"37dc414b": "balanceOfTarget(address)", +"37dc4b14": "setSpeedBump(bool)", +"37dd186b": "removePermission(address,string)", +"37dd5dd6": "poicoin()", +"37dda1ae": "setTktPrice(uint256)", +"37de1334": "rand16(uint256,uint16,uint16)", +"37de84d0": "createGame(string,string,bytes32[],string,uint256,uint256,uint256,uint256,uint256)", +"37df00c9": "receiveToken(uint256)", +"37df4828": "buy_planet()", +"37df6c03": "setAccountC(address)", +"37dfc70c": "getInvitationMultiple()", +"37e05590": "setKYCManager(address)", +"37e0e290": "numTokensSold()", +"37e12ab7": "checkGoalReach(uint256)", +"37e15240": "addRecord(uint256)", +"37e16f40": "currentAfterIcoPeriod()", +"37e246ad": "isOnAuction(uint256)", +"37e29e93": "BlueHillMining()", +"37e50f39": "awardPrizes()", +"37e531c0": "fechVoteNumForCandidate(address,uint256)", +"37e582b9": "LogRefundsEnabled(address)", +"37e58bd8": "GlowEther()", +"37e6b280": "verifyCommit(uint256,uint256,uint8,bytes32,bytes32)", +"37e6e03b": "setMultisigPre(address)", +"37e7a739": "Token3G()", +"37e822b8": "addRank(uint256,uint256,uint256,string)", +"37e87c7d": "OwnerManage(uint256,uint256,uint256,uint256)", +"37e8c09e": "getBet(bytes32)", +"37e922d7": "TERMS_AND_CONDITION()", +"37e94529": "setHardCapDividends(uint256)", +"37e94853": "TakerBoughtAsset(address,uint256,uint256,uint256)", +"37e9af0c": "IsAdmin(address,address)", +"37e9ebb5": "getExists(bytes32[])", +"37ea010a": "transferWithRef(address,uint256,uint256)", +"37ea1f63": "getWithdrawalCounter()", +"37eb6f91": "LiquidSwapToken()", +"37ebd0e0": "whitelist(address,uint256,uint32)", +"37ec33b7": "startDateOfUseTeamTokens()", +"37ec757f": "getStrFromId(uint256)", +"37ed2bef": "tokensToLock()", +"37ed89b2": "BitcoinPro()", +"37ede426": "WhaleWater()", +"37ee1837": "isCrowdSaleRunning()", +"37ee3edb": "buyTokensWithReferrer(address)", +"37efa397": "cryptoRomeWallet()", +"37f03888": "panicButton(bool)", +"37f0fa43": "PricingDay(uint256)", +"37f1353f": "PayPoolEntranceFee(string)", +"37f13fd6": "prova2()", +"37f1a470": "appoint(address)", +"37f1e7f2": "getPrice(uint8)", +"37f265e6": "get_session(address,uint32)", +"37f26746": "Remainder(uint256)", +"37f2beed": "getProposalVoterList(uint256)", +"37f2eaf6": "addTransaction(address,uint256,bytes,bytes)", +"37f33bd5": "EvenCoin()", +"37f344ff": "WhitelistedEarlyParticipant(address,bool)", +"37f3cb24": "testInitialBalanceUsingDeployedContract()", +"37f42841": "queryBalance(address)", +"37f4494b": "castLine(uint16,uint16,bytes32)", +"37f46e7e": "mintTokensByETH(address,uint256)", +"37f4c00e": "anchorGasPrice()", +"37f4dfea": "unsafeWriteBytes(uint256,bytes)", +"37f50f57": "wishes()", +"37f50f5b": "leggiFrase(uint256)", +"37f531ea": "_addHolding(bytes12)", +"37f534b6": "Blocform(address)", +"37f57d05": "StarterTokenBase()", +"37f7151b": "MTPToken()", +"37f7c4d4": "pow2()", +"37f80a58": "INVESTMENT_CAP_ICO_PHASE_ONE_POUNDS()", +"37f83291": "monuments(uint256)", +"37f86dce": "giveupBid(uint256)", +"37f9034d": "getAnimal(uint32)", +"37f944cc": "raiseBy()", +"37fa33fe": "EVATOKEN()", +"37fb217a": "valueForTranches(uint256)", +"37fb7e21": "distributionAddress()", +"37fbd30f": "etherHolder()", +"37fbec96": "totalTaxed()", +"37fc55bf": "give(string,uint256,string)", +"37fc91e3": "balanceWosPoolToTeam()", +"37fcb747": "TestERC20Token()", +"37fcb779": "sendAllFeesToAddress(address)", +"37fd25c7": "balanceOf(address[],address)", +"37fd6128": "tokenRate15()", +"37fd686f": "balanceOf(string,address,address)", +"37ff2506": "PRESALE_CONTRACT()", +"37ff65da": "Bugis_Crowdsale()", +"3800a119": "closeGateway()", +"3800d0a3": "get_proposal_count()", +"38014395": "originalAuction()", +"3801cde7": "Foodiecoin()", +"3801e6b6": "Cloud(uint256,uint256,string,string,address)", +"3802a4a2": "getEthDealRange()", +"3802d3ef": "totalTokensEmitted()", +"38039479": "setCandidate(uint256,string,string)", +"3803b7d3": "readAddressList(address,uint256,uint256)", +"3803f80e": "cancelCall(bytes32,address)", +"3804482a": "setMaxDistributions(uint256)", +"3804ab8d": "getTokensOnAuction()", +"3804c73d": "gameStartBlock()", +"380547c0": "addCompany(string,address,uint256,bool)", +"3806153e": "tier2()", +"3806422a": "stagesCount()", +"38075446": "shouldStopCoinSelling()", +"3807aabd": "generate(address,uint256)", +"3807ba1b": "poi()", +"380862b2": "getSynthesizeApproved(uint256)", +"3808ac11": "DXN()", +"38095a4a": "fccController()", +"3809b240": "settlementContract(uint64)", +"3809c0bf": "doInfinite()", +"380b5450": "getPrecomputedEToThe(uint256)", +"380ba30c": "confirmPrint(bytes32)", +"380bbf78": "getTokenIdOfAddressAndIndex(address,address,uint256)", +"380be68e": "open_new_node()", +"380bf002": "mintCountByTemplate(uint256)", +"380c686d": "setTokenPriceByOwner(uint256,uint256)", +"380c7a67": "authenticate()", +"380d831b": "endSale()", +"380e5e44": "makeProposal(string,string,uint256)", +"380e809e": "batchTransferFromMany(address[],address,uint256[])", +"380f3087": "addHashes(uint256)", +"380f3771": "viewRand()", +"3811264a": "ErrorLog(address,string)", +"38116187": "buySpike()", +"38118614": "sigTeamAndAdvisersEDUSupply()", +"3812783e": "getDeployedEvents()", +"38131bc5": "redeemOrSellCoinsToICO(uint256,uint256)", +"38132838": "setProviderSupply(uint256,uint256)", +"3813a7f2": "getWineIdentifierAt(address,uint256)", +"3813be76": "currentGameBalance()", +"3814253f": "grantFoundersTokens(address)", +"3814a7a3": "CardsBase()", +"3814b764": "setBridgeWidth(uint256)", +"381501e6": "SwapManager()", +"38151862": "SHSToken()", +"38151930": "isTokensPreIcoDistributed()", +"38158549": "NENCToken(uint256)", +"3815c742": "Koyo()", +"38164d41": "SGDsToken()", +"381656e2": "declineAll()", +"3816a292": "setToken(address,bool)", +"3816d4ee": "iICO()", +"381731be": "approveAndCall(address,uint256,uint256,bytes)", +"38178fbe": "addString(string,string)", +"3817ffda": "_limitedTotalIssuingCollateral(uint256)", +"3818657b": "isActiveFreelancer(address,address)", +"3818d907": "addPrecommitment(address,uint256)", +"38194aab": "_addNewCompanyTraders(uint256)", +"38198c65": "totalEtherGooResearchPool()", +"3819986e": "createNewPoll(string,uint256,uint256,uint256)", +"3819ea68": "SimpleMarket()", +"381a0161": "TRONIXGOLD()", +"381a730e": "withdraw_3()", +"381abeb5": "RonaldoChain()", +"381ae69a": "createReferee(address,address)", +"381c215f": "SEXYCOIN()", +"381cec91": "isVestingStarted()", +"381d5441": "roger()", +"381db641": "distributeTokenAndLock(address,uint256,uint256)", +"381ee645": "lastBlock_v0()", +"381f4b9e": "RRROToken()", +"381fe9ca": "DgxDemurrageCalculator(address,address,address,address)", +"38200801": "getExtensionPublication(string)", +"3820a686": "canBurn(address)", +"3821891e": "requestRegistration(string,address)", +"38218aa1": "getBettorInfo(uint256,uint256,address)", +"38219832": "spendEther(address,uint256)", +"38222858": "setThrowOnIncompatibleContract(bool)", +"3822de0f": "kvtToken()", +"38235781": "checkICO()", +"382396ee": "getGameStatus()", +"3823d66c": "withdrawn(bytes32)", +"3823df95": "testPop()", +"38241c16": "setKYC(address[],address[])", +"3824d8ee": "buy100DaoFor1Eth()", +"3824ea31": "getHighScore()", +"38266b22": "getData(address)", +"3827d0bf": "_createDank(string,address,uint256)", +"38280e6b": "setTokenDistributor(address)", +"38284f36": "release(uint256,uint256,uint256,uint8[],uint256,uint256,uint256,string,string)", +"38285534": "gameDeveloperSupply()", +"3828b522": "serviceApprovedBy(address,address)", +"3828becc": "setBountyAmount(uint256)", +"3829111f": "BuyNowEvent(address,address,uint256,uint256)", +"382964a5": "withdrawForTeam(address)", +"38299afd": "recommendPaused()", +"3829dd22": "tokensForOneEth()", +"382b6f69": "test_oneInvalidEqBytes()", +"382c52cd": "transferableTokens(address,uint256,uint256)", +"382cbc79": "userDelete(address)", +"382cf0a6": "gamesPlayed(uint256)", +"382d39bb": "planCount()", +"382d606b": "CROSAIR_VOUCHER_PRICE()", +"382db937": "finishContributionPeriod(uint256)", +"382df05d": "getInvestmentByAddress(address)", +"382e5272": "addGameRecord(address,uint256,uint256,uint256,uint256)", +"382ef945": "Contributed(address,uint256,uint256,uint256,uint256,uint256)", +"382f431b": "open(bytes)", +"382f8411": "_createPassport(address)", +"382faa6a": "cancelToken(uint256)", +"382fc09f": "CoinVilaStart()", +"382fd819": "kyc(address,address)", +"38300f19": "setCAORatio(uint256[])", +"38302989": "getUsernameForAddress(address)", +"38304483": "pauseAllTransactions()", +"3830901a": "assignImmortalsToBattle(uint256)", +"3830ceeb": "totalriskcoinsSupplys()", +"38310f49": "weiMinimumAmount()", +"3831a8d5": "BurgerKapija()", +"3832677d": "partsMinted()", +"38331353": "MoreAI()", +"38350541": "_ownerOf(uint256)", +"38353104": "setBlockDotTimestamp(uint256)", +"38360ed8": "balance(bytes32,string)", +"3836a6d2": "setKYCLevelsBulk(address[],uint8[])", +"3836d3f4": "JapanvsPoland()", +"3836fe6e": "addPermittedContract(address)", +"38376154": "setGasForOraclize(uint256)", +"3837e9bd": "getGooCostForUnit(uint256,uint256,uint256)", +"3838a099": "aboutItem(uint256)", +"383a194c": "buyUnicornWithEth(uint256)", +"383bb22a": "setMinorEditsAddr(address)", +"383cf18f": "getGovtApplicationsCount(string)", +"383e3a5d": "buyPriceAt(uint256)", +"383e4b27": "submitRing(address[4][],address,uint256[6][],uint256,uint8[1][],uint8,bool[],uint8[],bytes32[],bytes32[],address,uint16)", +"383e9a3a": "claimTokensFromTokenDistrict0xNetworkToken(address)", +"383eea0e": "transferDevship(address)", +"383f61b3": "refundPlayersInRoom(uint256)", +"383fcd3a": "getLastPlayDateTime(address,address)", +"383fe467": "transferTokenOwnership(address,address)", +"383fe6d3": "setCentsPerMonth(uint256)", +"3840369b": "triggerEvent(int256)", +"3840d63d": "unknownReserved()", +"38416341": "getbetData(uint8,int8,address)", +"38419800": "taylorToken()", +"38421476": "changePaused(bool)", +"3842c57c": "petCollection(uint256)", +"38436c60": "transferEgg(uint256,address)", +"38439bb6": "update_tree()", +"3844426c": "EST(uint256,string,string)", +"3844e1c4": "getClientBalance(address)", +"38453f29": "registerCat(uint256,uint256,uint256,uint256,uint256,uint256)", +"384711cc": "vestedAmount(address)", +"38471dd6": "athenians()", +"3847807a": "stopGamGetToken()", +"38478ae7": "setMinterContract(address)", +"38495d66": "updateVault(uint256)", +"3849794f": "setDataSourceAddress(address,address)", +"384a6494": "setStartPreSale(uint256)", +"384af0de": "setMinimumprice(uint256)", +"384b1393": "follow(uint256)", +"384b93f2": "pullTheLever()", +"384baa8a": "round1StartTime()", +"384bb70b": "getData_17()", +"384bfacb": "cofounderIndices(address)", +"384c3335": "requiredToAddress()", +"384c440b": "DISTRIBUTION_TEAM()", +"384c4d2f": "reserveFeesInBps(address)", +"384d0b12": "claimByProof(bytes32[],bytes32[],uint256)", +"384d2e0c": "getNumberByWalletUser(address)", +"384db9fc": "WithdrawEther(uint256)", +"384ddc32": "JM_ETH_ExchangeRate()", +"384e04c9": "setarg_2(uint256)", +"384e2bf5": "MNLTOKEN()", +"384e5018": "etherandomCallbackAddress()", +"384f58eb": "contract_owner()", +"384fae3b": "hashDataStream(address,string,bytes32)", +"38503f55": "AdjustDifficulty(uint256)", +"3850f804": "castVote(uint256,uint256[],uint256,uint256)", +"38516064": "getFeePool()", +"3852c53f": "battlesTillBattleCooldown()", +"3853682c": "Try(string)", +"38536878": "getOwed(address,address)", +"3854bc2e": "setUSD(uint256)", +"3855323f": "updateKey(address,uint256,address,address)", +"38556c3a": "contract8function2()", +"38557648": "executeSellOrder(address)", +"3855b3dc": "GetEscrowNotifierAddress()", +"3855cf0e": "Proxyable(address)", +"3855dcd6": "getContrarians_by_index(uint256)", +"3855f32e": "keysRec(uint256)", +"385794c4": "MAGENDAVID()", +"38597911": "appendKeyValue(string,uint256)", +"3859d609": "raccoltaMessaggi()", +"385ab2d7": "allowSelling()", +"385ae665": "getNumberOfAnnotations(address)", +"385af1c3": "setChainPrev(address)", +"385c0ecf": "whitelistMaxWei(uint256,address)", +"385cd083": "tgeActive()", +"385d8590": "Committed(address)", +"385df389": "tokenURIEdition(uint256)", +"385e27ed": "testSubtract()", +"385e9e2e": "MintNFT(address)", +"385fae43": "setBetclose(uint256)", +"385fb8a6": "STAGE_3_MAXCAP()", +"385fbe24": "ListingContractEntity()", +"385fea5c": "countCliManagers()", +"38613690": "agentAddress()", +"38616105": "LogDestroy(uint256)", +"3861ee08": "EventBuyCar(address,uint32,uint32)", +"3862822d": "buyHo(uint256)", +"3862e6ee": "getEvaluationCountByRecorderID(uint32)", +"3862ea9d": "lockedBitmask()", +"386304e4": "receiveFromGame()", +"38634337": "CrowdsaleToken(uint256,uint8,address,address)", +"386381db": "fundariaTokenAddress()", +"38644538": "setAdditionPrice(uint256)", +"38649b2a": "isConstructedOwned()", +"3865bf3a": "joinNetwork(address[6])", +"3866ecdd": "forceWithdrawToken(address)", +"38670cb4": "founders_address()", +"386741fa": "onSubNew(uint256,uint256)", +"386762fb": "withdrawSnowflakeBalanceFromVia(string,address,address,uint256,bytes,bytes)", +"386892d8": "endICOStage3()", +"38689772": "FixBet16()", +"38692ca6": "setRegistrationPeriod(uint8)", +"3869416b": "getDisputeStartTime()", +"3869eaff": "USEaddress()", +"3869ffd0": "newIteration()", +"386a646e": "QDToken()", +"386b5fe7": "aelfDevMultisig()", +"386c5a74": "LogFeeTopUp(uint256)", +"386c69f2": "setCanBurn(bool)", +"386ca47e": "minCompanyValue()", +"386dd46e": "BTK()", +"386e0d75": "setPopName(uint256,string)", +"386e2b29": "registHnsBatch(bytes32[],address[])", +"386e3441": "tokensIssuedPrivate()", +"386e69dc": "nextRoundStartsAt()", +"386ee512": "Crowdsale(uint256,uint256,uint256)", +"386f36f3": "Deployed(uint256,uint256,uint32)", +"386fcda8": "testCreateCostToken()", +"387008c2": "updateStatus(uint256,bool)", +"3871b694": "LogSell(address,uint256,uint256,uint256)", +"3871bdd7": "depositPresaleWithBonus(address,uint256,uint256,uint256)", +"38721fa4": "getOperationCost(uint256)", +"3872b3ec": "setCoolDungeon(uint32)", +"387349fc": "numberOfTokensToAvail50PercentDiscount()", +"38734c33": "OnContribution(address,bool,uint256,uint256,uint256)", +"3873eeb8": "approveForBurn(address,uint256)", +"38742685": "pegglebot()", +"38743904": "moderator()", +"38752e58": "batchApprove(uint256[],address)", +"38756a89": "getLevelsCount()", +"38759ce9": "getFhMoney(uint256,uint256,uint256,uint256)", +"38760f13": "NewAccreditedInvestor(address,address)", +"387621fb": "cleanupDelay()", +"3876c137": "FRAC_TOP()", +"3876df0e": "ProjectWithBonds(string,uint256,uint256)", +"3876e05e": "appWallet()", +"3876e6d3": "securityTokenVersion()", +"3876f81d": "getPeriodBounus()", +"38771242": "completedAt()", +"387787ed": "setProperty(address,bytes32,bytes32)", +"38785014": "lastBlock_f4Hash_uint256()", +"3878f423": "remainingInvocations()", +"3879aa23": "firstCheckpoint()", +"3879c9f3": "teamCliff()", +"387a54d9": "callInternalTransfer(address,address,uint256)", +"387a76ce": "tokenChanger()", +"387b6c2f": "OwnedResolver()", +"387be94f": "minimumAmountRequired()", +"387bef56": "nodeAllocation()", +"387c0cb4": "hashRegistrar()", +"387d3821": "increaseMarketValue(uint256,uint256)", +"387d49d4": "setBountyBeneficiariesCount(uint256)", +"387da66c": "MCoinToken()", +"387dd9e9": "slots(uint256)", +"387e01fd": "ITO_TOKENS_PERCENT()", +"387e7bb4": "SingularityTest4()", +"387eaedb": "jypcBonus()", +"387ed59b": "hardCapTxWei()", +"387f4172": "GorillaSale(uint256,uint256,uint256,address)", +"388085be": "module(address)", +"38811792": "disallowWrite(uint256,uint256)", +"38812e58": "setStartTime(uint64)", +"38813ee0": "allEther()", +"3882f333": "partnerSaleTokenValue()", +"3882f742": "exitStake()", +"3883aee2": "checkGoalsReached()", +"388415e5": "Exchange(address,uint256,address,uint256,uint256,address)", +"38848911": "AmountRaised(address,uint256)", +"3884d635": "airdrop()", +"3884f307": "withdrawTo(address,uint256,address,bytes)", +"38856ecb": "assertEq5(bytes5,bytes5,bytes32)", +"38857786": "presaledeadline()", +"3885ce81": "avgEtherBetValue()", +"3885fd3d": "sendEther(address,address,uint256)", +"3886b116": "chkConsul(address,uint256,bytes32)", +"3886c957": "tokenLedger()", +"38874945": "developersWallet()", +"388777f1": "setlimits(bytes32,uint32[],uint32[],uint8[])", +"38879da8": "Transfer(address,address,uint256,uint256,uint256,uint256)", +"3887abb7": "checkPeriod()", +"3888188d": "releaseLockFoundation()", +"3888624b": "trueOrFalse()", +"3888dca0": "q_test(string)", +"388911dc": "sudoEnabled()", +"3889c8dc": "Payiza()", +"388a1526": "defaultTreesPower()", +"388a74ab": "validPurchaseSize(address)", +"388aef5c": "WAIT_TIME()", +"388b5786": "econReserveTimeLock()", +"388b9f37": "LogTokenDistribution(address,uint256)", +"388ba4b5": "COIN_SUPPLY_MKT_TOTAL()", +"388e28f9": "stop_all()", +"388f2c39": "recover(bytes32,bytes32,bytes32,uint8)", +"388f3cd3": "cashin(address,uint256)", +"388f58cd": "addMarket(bytes6)", +"388fb0af": "reservedTokensPercent()", +"388fe911": "new_tablet_created(address,bytes32,address)", +"38905bea": "lulaToken()", +"38906dbd": "Token(uint8,uint256,string,string)", +"38909b68": "getBonusUnlockAt()", +"3890d77f": "esopState()", +"3891c320": "vote(int256)", +"3892be14": "payoutPreviousRoll()", +"3893966d": "distribute(address[],uint256[],uint8)", +"389435e8": "calculateTotalWithdrawableAmount(address)", +"389439bb": "OwnerSigneture(address[])", +"389441b2": "getvaluejoinlist_even(uint256)", +"38948c53": "finalizeable()", +"3894ca57": "catOwners(bytes5)", +"3894e516": "generateToken(string,uint256)", +"38953534": "BTCEX()", +"3895f466": "buyoutWithData(uint256,string,string,string,string)", +"38960027": "aliveSince()", +"38969d64": "changeZipper(address)", +"389755a7": "setDefaultTransferRate(uint16)", +"3898ee61": "generateTicketData(uint256,uint8,uint8)", +"3899ad41": "unlockSecondary()", +"389aa67c": "addOrder(string,address,uint256,uint256,string,address)", +"389ab31c": "networkDevelopmentWallet()", +"389ae4d1": "foundersKey()", +"389b5bd2": "CryptobullsCoin()", +"389b7533": "extendDeadline(uint256)", +"389b75d6": "resetPool(uint32)", +"389cabee": "ceoWallet()", +"389cd1ae": "setGasPrice(uint256,uint256,uint256)", +"389d9636": "buyDiamond(uint256)", +"389db4f1": "_adjustDifficulty()", +"389e40d2": "PACOIN(uint256,string,string)", +"389e4839": "setState(bytes32,bytes32)", +"389eb9f9": "withdrawalTime()", +"389ece2f": "changeTelephoneOwner(address)", +"389f0846": "balanceUpdate(address,address,int256)", +"38a003e0": "getOrderAddressesForDay(uint256)", +"38a0615f": "TabooToken()", +"38a0fc9a": "registerPool(string,uint256,uint256,uint256,uint256)", +"38a0fdde": "setSnapshot()", +"38a1187d": "calculateEthAmount(address,uint256,uint256,uint256)", +"38a18cbe": "createTradeContract(address,uint256,uint256,uint256)", +"38a211b7": "lockTopLevelDomainOwnershipTransfers()", +"38a21db8": "create(bytes32,bytes32[3],bytes32,bytes32)", +"38a2cd0f": "setData_3(string)", +"38a2fb4f": "TransferBaseContract(address)", +"38a326e4": "activatedSalesTotalCount()", +"38a332eb": "EndGame(address,uint8,uint256)", +"38a4045e": "despoit(uint256)", +"38a4ba0b": "getAdPriceHalfDay()", +"38a52fb1": "setEthPlan(address,uint256,uint256,bool)", +"38a57d0c": "buildShip(uint16,uint16,uint8,bytes32)", +"38a5e016": "acceptTokenOwnership()", +"38a699a4": "exists(bytes32)", +"38a6e813": "updateAllowedAddressesList(address,bool)", +"38a74bbf": "endGameInternal()", +"38a7543e": "issuers(address)", +"38a8a0ca": "DeadCow(address,uint256)", +"38a964d6": "getFeeValue(address)", +"38a9a6f8": "bonusPreset()", +"38a9f25a": "PlayerLab()", +"38aa156c": "getKeccak256Address(address,address)", +"38ab0287": "nextMintPossibleTime()", +"38ab8ef4": "RelentlessConscienceToken()", +"38abdf41": "CraigGrantShrimper()", +"38af3eed": "beneficiary()", +"38af4eff": "tokenCents()", +"38b025b2": "parseInt16Char(string)", +"38b09889": "VictorieumNewToken()", +"38b0ea85": "startRedemption(uint256)", +"38b15dab": "setMyTokenBalance(address,uint256)", +"38b3e983": "Better(uint256,uint256,uint256)", +"38b52627": "supportsInterfaces(address,bytes4[])", +"38b5491b": "getInvestmentProposal(uint256)", +"38b56ead": "setURIToken(string)", +"38b59359": "ChangeEthPrice(uint256)", +"38b59be6": "addPercents(uint256,uint256)", +"38b5e0fe": "numElementsEven()", +"38b6e407": "endGrantAuthentication(address)", +"38b7a530": "addToAvgRating(address,address,string,string,uint8)", +"38b88052": "staleTime()", +"38b90333": "CONTRACT_VERSION()", +"38b93440": "replaceModule(string,address,bool)", +"38b9499b": "circulationStartTime()", +"38b9d61e": "bonusLimit4()", +"38b9ef9c": "betWithRound(uint256,bytes32)", +"38bb3977": "JuventusvsRealMadrid()", +"38bbbceb": "test_failed_payment_nonthrowing_token()", +"38bbfa50": "__callback(bytes32,string,bytes)", +"38bbfc51": "FCOIN1050Token(uint256,string,string,uint256)", +"38bc01b5": "getAddresses(bytes32[])", +"38bc1b96": "_airdrop(address,uint256)", +"38bcdc1c": "getURL()", +"38bd44f3": "createSDCC(address,address,uint256)", +"38bd8357": "next_week_timestamp()", +"38bde636": "GoodBoyPoints()", +"38be706d": "__callback(uint256)", +"38beb446": "PlayerToken()", +"38beb67f": "getCertificateHash(address,address,uint256)", +"38bef35c": "CFCdistrubution()", +"38bf77c3": "setFeesPerTenThousand(uint256)", +"38c0ac5f": "signer2()", +"38c1b824": "transferBookKeeping(address,address)", +"38c20499": "accMinterTwo()", +"38c33862": "wineries(bytes32,uint256)", +"38c3d4ed": "PORNCASH()", +"38c4090b": "getMarketOrderValue(uint256)", +"38c4d4a6": "pairTransfer(address,uint256)", +"38c59de9": "getNumberInvestors()", +"38c5a3dc": "changeRealUnicornAddress(address)", +"38c67b73": "setCurrentStage(uint256)", +"38c68f8f": "right84(uint256)", +"38c72883": "DealFullyFunded(uint256)", +"38c73f9f": "by(bytes32,uint256)", +"38c7db75": "getUnredeemedBalance(address,address)", +"38c80857": "unlock1Y()", +"38c80fc3": "getWhitelistStatus(uint256,address)", +"38c8e611": "getPreorderInfo()", +"38c8ec85": "convert1(string,string)", +"38c9027a": "calc(uint256)", +"38c92ef0": "propose(bytes,address,string)", +"38c97949": "StandardGame()", +"38c9dbf3": "TEAM_STAKE()", +"38ca59cf": "createTargetedValentineRequest(string,string,string,address)", +"38ca60a2": "IBST()", +"38ca683b": "MARKTY()", +"38ca830c": "updateWhiteList(bool)", +"38caa2c6": "MaxCapReached(uint256)", +"38cb252f": "getBonusPercent()", +"38cb583d": "checkAndUpdateTokenForManual(uint256)", +"38cc17ee": "setGameState(bool)", +"38cc4831": "getAddress()", +"38cc639d": "_setUserAttribution(bytes32,address,uint256)", +"38cd2c1a": "TransferSellAgentSiteRegMulti(address[],uint256)", +"38cdaab1": "changeICOState(bool,bool)", +"38cde380": "changeWeight(uint256)", +"38ce1df8": "sideServicesCount()", +"38ce4d51": "canRedeemUTXO(bytes20,uint256,bytes32[])", +"38ce61b2": "transferAndFreeze(address,string,address,address,uint256,uint256,uint256)", +"38ceaf1b": "LicenseManager(address,string)", +"38cef1ab": "ESCBCoinPlaceholder(address,address)", +"38cf2087": "parametersAreSet()", +"38cf22e3": "getHoldingsSupply()", +"38d084b5": "address4a()", +"38d0ae6c": "stakeFunds(uint256,uint256)", +"38d0e36f": "SBSEducationToken()", +"38d16011": "verifyKYC(address)", +"38d1ed57": "getTotalFeesDistributedCount()", +"38d28d4c": "setTicketCountMax(uint256)", +"38d28de3": "getGoldInfoWeight(address)", +"38d2b172": "lowCapTxWei()", +"38d33337": "RoundAHardCap()", +"38d335ef": "ShowTestB(bool)", +"38d40ced": "changelp15(address)", +"38d44ad5": "recall(uint256,string)", +"38d480a6": "bulletAddress()", +"38d4d73e": "isVotedGood(uint256)", +"38d52e0f": "asset()", +"38d560b6": "gmtAddress()", +"38d65020": "JackpotAccessControl()", +"38d67d88": "changeContractName(string,string)", +"38d762ef": "LogBurn(address,uint256)", +"38d7be3c": "WXBET()", +"38d888a6": "impToken()", +"38d93280": "ProfitContainer(address)", +"38da5b07": "verifyIncludedAtIndex(bytes,bytes32,bytes32,uint256)", +"38dacaab": "teamTimeLock()", +"38db6dd3": "registerVoter(address)", +"38dbb74a": "initialize(uint256[],uint256[],uint256,address,uint256,address)", +"38dbdae1": "player3()", +"38dc25d1": "KMCToken()", +"38dc92bc": "NCP()", +"38dca34a": "AddStudent()", +"38dd22f0": "isOwnerOrAdmin(address,address)", +"38dea895": "auction(address)", +"38dec0fa": "RefundAdded(address,uint256)", +"38df6fb2": "CollateralPosted(address,uint64,uint256)", +"38dfe2f5": "getString2()", +"38e078b4": "FixBet76()", +"38e11779": "OriginalAddress(address,address)", +"38e1294c": "updateBuyStatus(bool)", +"38e288f1": "airdrop(address[],uint256,uint16)", +"38e29ef0": "ICO_BONUS_TIME_1()", +"38e2c296": "processJackpotDeposit(uint256,uint256,address)", +"38e3aaf1": "Error(uint256,uint256)", +"38e43840": "collected(address)", +"38e45c65": "endCall()", +"38e47639": "getHighWater()", +"38e48f06": "save(string)", +"38e48f70": "getDonation(address,uint256)", +"38e4b06b": "releasedTeam()", +"38e55e89": "SigmaToken()", +"38e586fd": "right5(uint256)", +"38e64f9e": "milestoneReached()", +"38e771ab": "refundAll()", +"38e7920a": "setTokenRate(uint256,uint256)", +"38e7a375": "textaaaToken(address,uint256)", +"38e8feed": "TokensTransfer(address,address,uint256)", +"38e91e41": "devHolder()", +"38e95d55": "amountToRaiseInUsdCents()", +"38e998a7": "buyLand(int32,int32)", +"38e9e6b5": "setClaimingCosts(uint256)", +"38ea1c4d": "setTransferCreditBot(address)", +"38eada1c": "addAddress(address)", +"38eaf913": "setDirectorNode(string)", +"38ec18c3": "changeAccountModifiers(address)", +"38ec6ba8": "getAddressOfName(string)", +"38ec8672": "newAvto(string)", +"38ec8736": "assertEq11(bytes11,bytes11)", +"38ecadac": "bountymanagerShare()", +"38ecdca9": "claimProduct(address,uint256)", +"38ed85b0": "_claim(address)", +"38eda0e5": "createCalcFunc()", +"38ededc9": "getNoteOwner(uint256,uint256)", +"38ee95ab": "_emitCapabilityRemoved(address,bytes4,uint8)", +"38eee93e": "scheduleCall(address,bytes,bytes,uint16,uint8,uint256[5])", +"38ef2dc0": "testSign2of3()", +"38eff6c6": "backETH(uint256)", +"38f0de1f": "_fFinish()", +"38f14845": "deleteUser(uint256)", +"38f196b2": "COR()", +"38f22b42": "viewSpecific(string,uint256)", +"38f23e18": "recoverContractBalance()", +"38f41711": "updateCapAndExchangeRate()", +"38f42d41": "GameWin(address,uint256,uint8,uint8,uint8,uint256,uint256)", +"38f46240": "StartRefund()", +"38f4b734": "getShit()", +"38f4cc7a": "QtumToken()", +"38f50b6f": "modifyAuth(bytes8,bytes8,bool)", +"38f55e59": "doVote(bytes32)", +"38f736c5": "step(uint256,bool)", +"38f77d69": "getDistributeProfitsInfo()", +"38f817c5": "getUsersEnginesIds()", +"38f84614": "useGoldenTicket(string)", +"38f88ee0": "tokenOwnerRemove(address)", +"38f8f3cc": "quarter1()", +"38f98d09": "getWeaponValue(uint256)", +"38fa1570": "showDevCut()", +"38fa4029": "currentStageIndex()", +"38fa8ef9": "isFundkeeper(address)", +"38fab8c5": "lifToken()", +"38fbf0b9": "destroyShares(uint256)", +"38fdba18": "doSplit()", +"38fe48b8": "batchReturnUNT(uint256)", +"38fff2d0": "getPoolId()", +"390063f0": "fundsToMSF(uint256)", +"39009094": "Cooperium()", +"39009482": "returnTuple()", +"3900f8f6": "minusFreezingTime(uint256,uint256)", +"390209c1": "getMetadata(uint128)", +"390246b2": "bid(bytes32,uint8,bool,int32)", +"3902b9fc": "getBbAddress(address)", +"3902bf72": "donate(bytes32,bytes32,bytes)", +"3902cb92": "TERATO()", +"3902d417": "resumeAirdrop()", +"39035d56": "record(address,address)", +"39048f02": "setSchellingRoundReward(uint256)", +"3904c5c1": "sweepFunds(address,uint256)", +"3904e1bf": "userBuys(uint256,address)", +"39055172": "UpgradeTokens()", +"390576d9": "Sogan()", +"3905910e": "MultiEventsHistory(address)", +"3905cab8": "drpsToken()", +"39069d8c": "setRegistryAdmin(address)", +"3906f560": "SUPPLY_LIMIT()", +"39074f59": "getDelayedBonusAmount(address)", +"390a05a8": "getParticipantBalances()", +"390b4f0c": "NaGeBi()", +"390b8482": "fillWithHashes()", +"390c0ddd": "purchaseCollectible(uint256)", +"390c3434": "nextrafflenr()", +"390c5874": "getCashbackRate(address)", +"390ce0d3": "getSellOrder(uint256)", +"390d70f5": "getTransformTarget_miner(address)", +"390e16c1": "EXTENDED_SLACK_PERIOD()", +"390e4855": "MilestoneTracker(address,address,address)", +"390eca6b": "finish(string)", +"390ff134": "isApprovedFor(address,uint256)", +"39106821": "memberId(address)", +"3910814b": "diamondAuction()", +"391193ae": "getTotalF2()", +"3911e1e1": "totalEthxCollected()", +"3912253e": "betConditions()", +"39125215": "sendMultiSig(address,uint256,bytes,uint256,uint256,bytes)", +"3912572d": "TokenCLC(uint256,string,string)", +"3912657a": "lastBlock_f11Hash_uint256()", +"3912b99f": "FOUNDERS_SHARE()", +"391363b5": "reducetime()", +"3913848e": "changeMerchantChargingAccount(uint256,address,bool)", +"3913a0fe": "getPlayerAward(address)", +"3913d6e0": "burnEnergyAttributionToken(address,uint256)", +"3913f487": "RIPAC(uint256,string,uint8,string)", +"3914010a": "getPartnerCash(uint8,bool,address,bool,uint256)", +"3915111e": "getRoundPrize(uint256)", +"39166ee9": "holding(address)", +"391687e3": "raiseTraderRegistered(address)", +"3916a402": "ShowInfoStr(string)", +"391714f8": "closeSale(bool)", +"39179ef9": "BitcoinFast()", +"3917b761": "product2_sell()", +"39181e6c": "Monthprofitstart()", +"39192fd7": "mintReserveTokens(address,uint256)", +"391b11ce": "updatePartner2_vows(string)", +"391c44b2": "addToWhiteList(address,uint256,uint256)", +"391c918e": "transferFromOwner(address,address,uint256,uint256)", +"391d2eb4": "MottoCoin()", +"391ecc2c": "_setOwners(address[])", +"391efaf2": "getEscrowFullInfo(address)", +"391f2e96": "InvestCancel()", +"391f3b2d": "_nextPotJackpot(uint256)", +"39203874": "ALpay(uint256,string,string)", +"392087fd": "changeSoftCap(uint256)", +"392114b7": "sellingAccept(bool)", +"392212c8": "EvaCash()", +"39221913": "_forwardT4T(uint256)", +"392327b5": "owner_set_fraction(uint256)", +"392338f5": "createPost(string,string)", +"39236bef": "claimGame(uint256)", +"3923afee": "allocateToEarlyContributor(address,uint256)", +"39246290": "getB2()", +"39246d75": "VersionModel()", +"3924b718": "m_tokenPrice()", +"3924f089": "getRunning()", +"392542fb": "unFreeze(bytes32)", +"39255494": "setAdminAccounts(address[3])", +"3925ad8a": "getRank07()", +"392603d3": "_getCsAddr()", +"3926384d": "setMaxWithdrawal(uint256)", +"392664e5": "GenesisAddressSale(address,address,uint256,uint256)", +"39269596": "endPrivateIco()", +"3927010d": "ownerPauseGame()", +"392752b9": "lifeFactor_iv()", +"3928bc8b": "setBoostData(uint256,address,uint256,uint256)", +"39293113": "earlyBirdCap()", +"39298633": "forceTransferFrom(address,address,uint256)", +"39298f4a": "listAssets(uint256,uint256,bool)", +"3929e43f": "proposalExpireAt(bytes32,uint256)", +"392a2cb6": "withdrawFromFailedLottery(uint32)", +"392aa4d5": "openRefund()", +"392c00a2": "mint(int256,address,uint256,bytes)", +"392c6238": "currentNiceGuyIndex()", +"392c623e": "docIndex()", +"392cb9ed": "DhaCoin(uint256,string,string)", +"392d42ae": "left38(uint256)", +"392da9b4": "fetchCancelledOrdersForMerchant(address)", +"392db91e": "genuine(address)", +"392e53cd": "isInitialized()", +"392e6678": "validCandidate(bytes32)", +"392eaafa": "HackDao()", +"392ec230": "PaymentForwarder(address,address)", +"392ec66b": "bobClaimsPayment(bytes32,uint256,address,address,bytes20,bytes)", +"392ecfa6": "buyWithTokens(bytes32)", +"392ee145": "jackPotA()", +"392f37e9": "metadata()", +"392f5f64": "roles()", +"392ffcfb": "test_twoValidAndInvalidEqAddress()", +"39300836": "fundCrowdfund()", +"3930d3dd": "minBuyETH()", +"3931845d": "registraAluno(address)", +"3931c9a8": "purchaseWithToken(uint256)", +"39332b05": "foreignBridgeErcToErcImplementation()", +"39333bbe": "tokenBankrollBuyIn()", +"39341dde": "unseatKing(address,uint256)", +"39347d52": "setMarketers(address)", +"39354244": "percentAllocationFeeNumerator()", +"3935ae8f": "POKERCOIN()", +"39363923": "invalidationBounty()", +"3936dbe4": "decimals(address,bytes32)", +"3936e99a": "releaseAssets(uint256)", +"39384126": "getCampaignValidById(bytes32)", +"3938bd78": "updatePayment(uint256,address)", +"3938faa1": "_emitErrorCode(uint256)", +"393a1955": "crowdfundingTarget()", +"393a4d34": "getStorageAddress()", +"393b011c": "setOwnerPercentage(uint256)", +"393b9b0f": "TransferPreAllocatedFunds(uint256,address,uint256)", +"393bb56e": "setApprovalStatus(address)", +"393bbbf8": "mokenName(uint256)", +"393cb7e3": "feesPerMillion()", +"393e0c63": "maxPreICOandICOSupply()", +"393e77c9": "minMonsterHit()", +"393ebbf8": "setSlashPercentage(uint256)", +"393eec7b": "setSafeToken(address)", +"393eefb8": "withdrawMyDividend()", +"393f4605": "getProviderWebsite(uint256)", +"393f7cd4": "init_dev_and_presale_allocation(address,address)", +"393fb37b": "gettruelevel(uint256,uint256)", +"39408c83": "icoFinishedDate()", +"3940e9ee": "total_supply()", +"3941456c": "frontendAddress()", +"39419d60": "grandConsolationRewards()", +"394218b1": "electNewMayor(address)", +"3942a979": "s6(bytes1)", +"39431308": "commissionPercentForCreator()", +"3943380c": "key()", +"3943807b": "insert(bytes,bytes,int256)", +"3943909e": "ScamStamp()", +"39443b8e": "canDeposit(uint256)", +"3944615c": "getCompanyAddress()", +"3944750d": "ACCEPT_EXCHANGE()", +"394479c5": "TestKeiosToken()", +"39451a88": "tokenBurn(uint256)", +"394580d2": "distributeManyTokens(address[])", +"394610cf": "tokensTotal()", +"39464884": "entryInfo(uint256)", +"3947050f": "randomTicket()", +"39478568": "isFounder()", +"39495f8e": "RealTract(uint256,string,string)", +"3949630e": "before_test_method()", +"3949b636": "doDaysFollowEachOther(uint256[])", +"394a0926": "addUnicorn(address,uint256)", +"394a3f61": "updateFollower(uint256,bool)", +"394a8698": "getTotalBondValue()", +"394b0ba9": "RetengoToken()", +"394bcb49": "updateClient(address)", +"394c21e7": "cancelOrder(address[5],uint256[6],uint256)", +"394cd121": "qryModuleDetail(string,string)", +"394d57a2": "EtherPriceUpdate(uint256)", +"394da86b": "WEECoin()", +"394dfffb": "GFCI(uint256,string,uint8,string)", +"394e0cdd": "standingOrdersByOwner(address,uint256)", +"394f4ec6": "User(bytes32,bytes32,bytes32,bytes32,bytes32)", +"394fc3a6": "MaecenasToken()", +"39500019": "voteWithSpecifiedAmounts(bytes32,uint256,uint256,uint256,address)", +"39500105": "egcd(int256,int256)", +"39509351": "increaseAllowance(address,uint256)", +"3950d1b2": "p1_duration()", +"3950f3a2": "disavowTokens()", +"39515e3c": "bonusOver30ETH()", +"39518b5e": "startingTime()", +"39527ed6": "withdrawTatAmount(uint256)", +"395382ee": "squareWins(uint256,uint256)", +"3953ca8b": "setPropertyRowColor(uint16,uint8,uint256)", +"3953f4a1": "setLastEditionOf(uint256,uint256)", +"3954a389": "c_MaximumFunds()", +"3954b4ee": "pricePerEther()", +"3955b070": "unhold(uint256)", +"3955b6af": "_createToken(uint256,address)", +"3955c147": "MatchmasterPrevails(address,address,uint256,uint256,uint256)", +"3955f0fe": "sellEggs()", +"3955f12e": "crowdSaleOn()", +"39564561": "isCapper(address)", +"3956e963": "Mydo()", +"39575795": "getBalances1()", +"395764ff": "OilToken(string,string,uint256)", +"3957f093": "calculateTokensAmountToSale(uint256,uint256)", +"39580054": "getOpponent()", +"3958884b": "unblock(bytes32)", +"3959b945": "getSolver(bytes32,string)", +"395a9ab3": "Success()", +"395acdeb": "lockedCounts()", +"395b6f71": "getOrderBookInfo(address)", +"395b9467": "totalSUM()", +"395c22c9": "submitNewPolicy(string,string,string,string,string,string,string,string)", +"395deefa": "RefreshDayBonus()", +"395ea0c9": "Medikia()", +"395eda08": "MINIPOOLS_LLV_FIFA_1()", +"395ede4d": "collectToken(address)", +"395eec79": "studInfo(uint256)", +"3960c001": "buy(uint32,uint16,uint32,bytes16,bytes32)", +"3960eddf": "SupeciesToken(uint256,string,uint8,string)", +"3960f787": "decrypt(uint256[])", +"39612b0e": "refundingIndex()", +"39614759": "toBase58Checked(uint256,bytes1)", +"39614e4f": "bytesToString(bytes)", +"39624847": "getNumWinners()", +"39625faf": "pokerbox()", +"3962c4ff": "TimeStart()", +"3962d9f1": "User(bytes32,bytes32,uint256)", +"3962f82d": "getTokensCount()", +"39631849": "transferOutBalance()", +"39633cee": "getCompte_39()", +"39635d13": "withdrawToTeamStep1(uint256)", +"39636504": "teamPool()", +"39637616": "setTimedCrowdsale(uint256,uint256)", +"39639fbd": "trackToken(address)", +"3963d0c1": "MonthlyPaySend(uint256,address)", +"39658245": "ChannelTimeout()", +"3965e75d": "cancelEnter(address)", +"3966291e": "StaticEthAvailables(address[])", +"396724c3": "getCCH_edit_1()", +"39673345": "EPCToken(string,string,string)", +"396773b7": "getHeader(uint256)", +"3967d46a": "updateDeposit(bytes32,address,uint256,address,uint256)", +"39681333": "get_last_global_audit_time()", +"396876bd": "mintAllowance()", +"39688256": "tokenHardCap()", +"39694f47": "totalUnClaimed()", +"396ad86f": "setpatient(uint256,uint256,string,string)", +"396bf78a": "WalchainToken()", +"396c8228": "purchase(uint16,address)", +"396d1ddf": "totalAdvisor()", +"396e70e0": "reducePlayersJadeProduction(address,uint256)", +"396ed0ab": "Burn()", +"396ff799": "setFoundersTokensWalletMaster(address)", +"3970f698": "tokenForSale()", +"39714adb": "trackHolder(address)", +"397182ef": "buyInSharePrice()", +"3971ee42": "promo(address[])", +"3971eea1": "bidReferral(uint256,uint256)", +"3972323a": "lockedBalances(uint256)", +"39737ea4": "proposalData(string,address,uint256,bytes)", +"397388af": "getAllRegisteredUsers()", +"3973e87e": "betSizeFINNEY()", +"397412cb": "setMinPrivateSaleBuy(uint256)", +"39745791": "removeWhiteList(address[])", +"3974874b": "drop(address[],uint256)", +"39754b9a": "internalContribution(address,uint256)", +"3975e32b": "RequestTest(bytes32,bytes32)", +"3976304e": "topupEnergy(uint256)", +"397656c6": "enableTuneOption(uint256)", +"3976b022": "LOG_SuccessfulSend(address,uint256,uint256)", +"3976be0b": "DCToken(uint256,string,uint8,string)", +"39774576": "isMiBoodleToken()", +"39785281": "winAmount3()", +"39785550": "withdrawAnyERC20(address,address,uint256)", +"39787fbd": "payeeArray(uint256)", +"39788bc8": "approval()", +"397895f3": "HoldChanged(address,uint256,uint256)", +"397986a1": "setUpAllowance()", +"39799e5d": "test_updateKey_missingId()", +"397a6b3d": "PrizeResultCalculated(uint256,uint256[])", +"397ab649": "Bet(address,uint256,address,uint256,uint256,uint256,address,uint256)", +"397b3378": "rewardPoolSupply()", +"397b8b17": "buyTokensForFiat(address,uint256)", +"397b90a5": "issueReserveToken(uint256)", +"397de27f": "changeServicePercent(uint256)", +"397e0287": "setIdentityExtended(bool,bool,bool)", +"397e8091": "betFeeMin()", +"397e953f": "ERC721Contract()", +"397eb91b": "closeLoanOnBehalfOf(address,address,bytes32,uint256)", +"397edab9": "ChangeOperatorAccount(address)", +"397efdbc": "CodeMailStampSale()", +"397f2a71": "getNbNamespaces()", +"397fa015": "updateCrowdsaleInfo(address,string)", +"397fe617": "CROSAIR_PRICE_THRESHOLD()", +"3980b680": "isHolidayToday()", +"3982316c": "getAllStorages()", +"3982b10d": "read_collectors_addresses()", +"3982b55d": "XCareToken(uint256,string,string)", +"3983af00": "setYearTwoMultiplier(uint256)", +"3983d5c4": "calcBaseFee(uint256)", +"398427e6": "sendByCheque(address,uint256,bytes,uint256,uint8,bytes32,bytes32)", +"39846a67": "sol_clean(uint256,uint256)", +"39849771": "maxBetDivisor()", +"39849a67": "isSpaceExist(uint256)", +"3984a89b": "updateFamedStarOwner(uint256,address)", +"3984ae12": "bountiesMinted()", +"3985a4ab": "crowdsaleEndDeclarationTime()", +"398712b5": "clearTheSeason(uint32)", +"3987fcb4": "setGasForFLKD(uint256)", +"39882a2d": "setUseWhitelistFlag(bool)", +"39885b23": "finishPreSale()", +"3988bad8": "pendingRewardsOf(address)", +"39895801": "allowPublicTransfer()", +"3989c666": "setRate(uint256,uint256,uint256)", +"398ab9a7": "totalPrizePool()", +"398af892": "Jimtoken()", +"398b35b1": "setShouldBlockPublicTrade(bool)", +"398bd6b2": "Cancelled(address)", +"398c1a89": "migrateOutByPayout(uint256[],bool,uint256)", +"398c7424": "getBalanceTokenContract()", +"398d07f0": "LightLemonUnicorn()", +"398d3c37": "getAyantDroitEconomique_Compte_1()", +"398d92bb": "withdrawTokens(uint256,address)", +"398e92a5": "updatePlotPrice(uint256,uint256)", +"398eb93c": "NardoT2()", +"398f0970": "secondsInBlock()", +"398f2648": "change_max_amount(uint256)", +"39900857": "closeTournament()", +"39900dcc": "totalBuriedCapsules()", +"39901be8": "getBoosterData(uint256)", +"39903398": "test_twoFalseAsserts()", +"399075da": "RES(address,uint256,string,string,uint8)", +"39907af1": "getSecurityValue()", +"39909f0b": "withdrawFundToOwner()", +"3990b7c7": "registerGold(address,address,bytes32)", +"39918c4f": "crowdsaleAllocation()", +"3991c09d": "addMatch(uint256,uint256)", +"3992503d": "TRIPAGO()", +"39927ebe": "registerGame(address,bool)", +"3992b494": "energyContract()", +"3994789d": "onICO(address,uint256)", +"3994b883": "SoccerBet(address,address)", +"3994bce4": "SALE_CAP_USD()", +"3995943b": "FUND_FRAC_TOP()", +"39960940": "registryRequestWeight()", +"39965233": "awardPrizes(uint256)", +"3998e2a9": "EBCoin()", +"39995511": "freezeAllTransactions()", +"3999968c": "mintRefCredits(address,uint256)", +"3999bbce": "SmartBitcoin()", +"399a24b1": "invokeFallback()", +"399ae724": "init(address,uint256)", +"399c0425": "buyingPrice()", +"399c6f55": "NewStage(uint256,string,string,uint256)", +"399cd55f": "ReferralRewarded(address,address,address,uint256,uint256,uint256)", +"399d6465": "getLockAmount(address)", +"399d7bf5": "against_ban_of(address)", +"399e3ca8": "PrivateSaleFinished()", +"399e7195": "CentraAsiaWhiteList()", +"399f6248": "ContractOwnershipBurn()", +"399fa840": "removeItem(address)", +"399fd8d9": "getDiaryLength()", +"399fdb86": "testFailNormalWhitelistReset()", +"39a12c3b": "Trade(uint256,uint256,bytes32,address,address)", +"39a13fb3": "enableTokenSale()", +"39a1e9ff": "SmallProject()", +"39a1ec37": "getInvestorDatePayout(address)", +"39a248f3": "feecounter()", +"39a26069": "housePercent()", +"39a2616c": "_removeDefaultOperator(address)", +"39a2a7bd": "confirmDeposit(uint64)", +"39a2b580": "_initialDistribution()", +"39a2bc8d": "SynchroCoin(uint256,uint256,uint256,address)", +"39a2eb2a": "selectWinners(uint256)", +"39a3f168": "secondPeriodWindows()", +"39a45a5c": "createGun(uint256,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"39a5a400": "TOKEN_SOFT_CAP()", +"39a5fdda": "earlyBackerSupply()", +"39a6ea72": "getEndICO()", +"39a73978": "unpackInvestment(bytes32)", +"39a7919f": "changeSupply(uint256)", +"39a7c3d9": "onMint(address,address,uint256)", +"39a7cb16": "retrieveCurrentTokensToOwner()", +"39a87bd9": "left31(uint256)", +"39a897fc": "Builded(address,address)", +"39a89c1a": "getNumberOfCapsules()", +"39a90f7a": "IS_MAINNET()", +"39a9144b": "_isTokenDiscounted(uint256)", +"39a9e6c5": "clearRequests()", +"39aa7599": "ITDollar(uint256,string,uint8,string)", +"39aaba25": "get_status()", +"39ac2d9b": "SuperTroopersRTscore()", +"39ac3300": "EtalonTokenPresale(address,address)", +"39ac7a08": "isMember(address,address)", +"39ad0212": "purchasers(address)", +"39ad8847": "fifth_withdrawal(uint256)", +"39ade9aa": "dDeployBallot(bytes32,bytes32,bytes32,uint256)", +"39ae662c": "setFactors(uint256,uint256,uint256,string)", +"39aee3b1": "CCCoin()", +"39af0513": "backlog()", +"39af0a81": "OPENCUKUR()", +"39b09ed8": "is_owned(uint256)", +"39b0b6c2": "updatePosition(address,int256,uint256)", +"39b0bc59": "getNonce(address,uint256,bytes)", +"39b0bde9": "Constrctor()", +"39b21937": "issue(address,bytes32)", +"39b22120": "contractBurn(address,uint256)", +"39b2447e": "addCutie(uint40,uint256)", +"39b25269": "makeOrder(address,address,uint256,uint256,address,uint256)", +"39b25ad1": "XcelToken(address)", +"39b26735": "TicTokenERC20()", +"39b333d9": "Play(uint8,uint8,uint8,uint8)", +"39b35753": "authCancel(address)", +"39b37ab0": "fee(uint256)", +"39b3fba8": "setRabbitData(uint256,uint32,uint32,uint32,uint256,uint8,bytes32,bytes32)", +"39b50688": "cancelSellOrder()", +"39b55e74": "developReserveAllocation()", +"39b57835": "multWee(uint256,uint256)", +"39b5ca6d": "MintFinished(address)", +"39b61914": "DescriptionPublished(string,address)", +"39b651c6": "paymentContractAddress()", +"39b6b1e5": "cancelBid(address,uint256)", +"39b73122": "createDataset(string,uint256,string)", +"39b73771": "_b3(string,uint256)", +"39b7e62f": "GENPCoin()", +"39b80e1b": "recoverAddressFromCommonSignature(bytes32,uint256,address,address,uint256,address,address,uint256,bytes)", +"39b83b68": "allowBank(string,address,bool)", +"39b860d9": "findPlayerIndex(address,uint256)", +"39b8ce98": "weiCollected()", +"39b8dc40": "sunsetWithdrawalPeriod()", +"39b8e0ff": "proposeAllocation(address,address,uint256)", +"39b8e63c": "getPI_edit_9()", +"39ba645b": "revokeKYC(address)", +"39bbaed2": "SNOOP()", +"39bc91fa": "OwnerICOsupply()", +"39bea1f0": "coindropsWallet()", +"39bef274": "setRegionCoordinates(uint256,uint256,uint256,uint256,uint256)", +"39bf03b4": "NBAOnlineLaunchPromotion()", +"39bf5462": "MANHATTANPROXYWSHWY()", +"39c09753": "setBombAddress(address)", +"39c0c415": "toB32(uint256,uint256)", +"39c0ea6e": "rateProperty(uint256)", +"39c0f29d": "laxToken()", +"39c1852d": "withdrawal_party_b_gets()", +"39c2697c": "DELIVERED_FEE_FLAG()", +"39c27bd4": "substr(string,uint256,uint256)", +"39c28e82": "SSPParametersChanged(address)", +"39c294be": "minMargin()", +"39c2f6a0": "setConfiguration(uint256,uint256,uint256,int256)", +"39c38266": "manualBuy(address,uint256)", +"39c480c9": "endDate2()", +"39c5a13e": "secondVestAmount()", +"39c5dde6": "setInitialOwners(address[],uint256[])", +"39c5f3fc": "getNetworkId()", +"39c64f1b": "setPOOL_edit_5(string)", +"39c65ca6": "updateDates(uint256,uint256,uint256,uint256)", +"39c670f0": "claimedAirdropTokens(address)", +"39c73169": "totalSupplySale1()", +"39c7967d": "vote(address,uint256,uint256,string)", +"39c79cfc": "HJHToken(uint256,uint256)", +"39c79e0c": "close(bytes32)", +"39c7a376": "LogCreate(address,uint256,uint256)", +"39c7b6fc": "getMaxSend()", +"39c98a1b": "getCarOwner(uint32)", +"39c9ffe3": "deleteTeam(bytes32)", +"39ca6e86": "registryBase()", +"39cace6d": "PradxToken()", +"39caf7bb": "makeSwap(address,uint256,bytes32)", +"39cc8a8e": "GorToken()", +"39ccdd49": "createRef(bytes32,string)", +"39cd9dba": "KiwiCoin()", +"39cdde32": "ecverify(bytes32,bytes,address)", +"39ce3983": "debatingPeriod()", +"39ce743e": "replaceCharacter(uint16,uint16)", +"39cef0b7": "issueTokensForAssets(uint256)", +"39cfc56a": "ETHERanate()", +"39d00f12": "transferTokens(uint256,address[],address)", +"39d05fdd": "cetokToken()", +"39d08c2a": "saleOngoing()", +"39d1f908": "actualBalance()", +"39d2036d": "_validateMaxSellAmount(uint256)", +"39d20a5f": "read_user(address)", +"39d216f2": "chefOwner()", +"39d26051": "getOrCacheTargetReporterGasCosts()", +"39d2be30": "setDistributedAutonomousExchange(address,address)", +"39d319e5": "unblockUser(address)", +"39d31e14": "CoroToken()", +"39d34323": "product3_sell()", +"39d396b5": "amountRemaining(bytes32[])", +"39d428ea": "AddToken(address,address,uint256,bool,uint256)", +"39d4e21a": "addToSellList(uint256,uint256,uint256)", +"39d51cc0": "get_testing_index()", +"39d66fc0": "effectiveValue(bytes4,uint256,bytes4)", +"39d8db86": "setICOPhase()", +"39d8dc9b": "BEST()", +"39dad8f5": "minusTourFreezingTime(uint256,uint256)", +"39dba209": "keysRec(uint256,uint256,uint256)", +"39dc5ef2": "depositTokens(address,address,uint256)", +"39dd134c": "advisoryPool()", +"39dd437b": "isWithinICOLimit(uint256)", +"39dea537": "registerNickname(string)", +"39df1608": "setPongAddress(address)", +"39e028ba": "AdviserTimeLock(address,address)", +"39e0c751": "setDiscountStage(uint256,uint256,uint256,uint256)", +"39e1038f": "getaddressfocuscardid()", +"39e1e859": "exchangeRateFUTX()", +"39e20523": "setWriter(address)", +"39e22509": "isCustomerHasKYC(address)", +"39e2637f": "TokenERC20(uint256,string,string,address)", +"39e301ff": "numWinnersToPay(uint32)", +"39e31ceb": "addressNotUpgradable()", +"39e33636": "EKK()", +"39e3407b": "isInFinalState()", +"39e395e2": "bidOnSynthesizingAuction(uint256,uint256)", +"39e3af9b": "isCanceled(uint256)", +"39e3ea83": "checkNotConfirmed(bytes32,uint256)", +"39e44ca4": "oraclize_network_name()", +"39e46ebe": "Quotation(uint256,string)", +"39e4dc18": "sendETH(bytes32,bytes32)", +"39e525f9": "resolveCallback(uint256)", +"39e53ca3": "updateUsersIndex(bytes32,uint256)", +"39e54c34": "_takeOffItem(uint256,uint8)", +"39e5a487": "BETSQUARE()", +"39e613d9": "mintVested(address,uint256,uint256,uint256)", +"39e65b46": "setIsRentByAtom(uint256,uint128)", +"39e7fddc": "feeAddr()", +"39e84cef": "EXT_COMPANY_STAKE_TWO()", +"39e851a3": "_isApproved(address,uint256)", +"39e899ee": "setWhiteList(address)", +"39e8bd48": "killMeshPoint(address,address,string,address)", +"39e8d1a4": "round1EndTime()", +"39e9eda1": "BackupChanged(address,address)", +"39ea68ba": "transferEntityOwnerPush(address,address)", +"39eabf7f": "bar(string,string)", +"39eb3491": "getMaximumPlayers()", +"39eb54d2": "bookExtendedVisit(uint256)", +"39eba5f9": "XXXXXXXX02(address[],uint256)", +"39ec68a3": "getRound(uint256,uint256)", +"39ecacac": "addContribution(address,uint256)", +"39ecc94f": "scamStampTokenAddress()", +"39eda73b": "jsonUpdate(string,string,string)", +"39edb660": "priceForDate(uint256)", +"39ede2b1": "SubmitNote(string)", +"39ef16f2": "Test2J()", +"39ef9105": "PhenixToken(uint256,string,uint8,string)", +"39efa270": "setClout(address)", +"39f05521": "withdrawVestedTokens()", +"39f165c6": "ParticipantAdded(address,uint256,uint256)", +"39f36220": "addThing(string,bytes32,string,string)", +"39f47875": "totalAmountOfWeiPaidToUsers()", +"39f4da78": "setSucessor(address)", +"39f4debc": "fillOrderAuto()", +"39f5b6b6": "fundsTreasury()", +"39f636ab": "changeRequiredSignatures(uint256)", +"39f64289": "quarter2()", +"39f64b52": "calcTokenPrice()", +"39f663ec": "isFundingFailState()", +"39f73a48": "fee2()", +"39f8e560": "setRewardAddress(address,address)", +"39f931b2": "placesSold()", +"39f95e63": "finaliseICO()", +"39fb1043": "_callRecipient(address,address,address,uint256,bytes,bytes,bool)", +"39fb435d": "initSiteSet(uint256)", +"39fc04f4": "setGftFundWallet(address,address,uint256)", +"39fc978d": "createCeleb(string,uint256,uint256[6],uint256[6])", +"39fd2003": "QPSEToken()", +"39fd615c": "complexityForBtcAddressPrefixWithLength(bytes,uint256)", +"39fdc5b7": "setExpectedStart(uint256)", +"39fded47": "Swap(address)", +"39fdf2fd": "OVERALLSOLD()", +"39ff8ff9": "CreatedBallot(address,uint256,uint256,bytes32)", +"39ffb234": "createContractScientist(string)", +"39ffd774": "getNamelessTouches()", +"39ffe67c": "withdrawOld(address)", +"3a000f23": "preallocate()", +"3a0046a3": "preIcoTokenHolders(address)", +"3a015ef9": "transferpoints(address,uint256)", +"3a01e53a": "getActivity(uint16)", +"3a02263c": "newController()", +"3a024d1c": "withdrawRewardedTokens(address,uint256)", +"3a027b26": "countDownToEndCrowdsale()", +"3a02a2cc": "addValidated(address)", +"3a03171c": "HARD_CAP()", +"3a031bf0": "getIsLocalOperator(address,address)", +"3a035edf": "sendWinnerPriceToAll(uint256,uint8)", +"3a03ce87": "lockBatch(address[],uint256[],uint256[],uint256[])", +"3a051334": "adjustMOTFeeDiscount(uint256)", +"3a05369f": "getMax(uint32[])", +"3a060bc9": "isOnLent(uint256)", +"3a062acd": "LogEscrow(uint256)", +"3a067e64": "transferJackpot(address)", +"3a079bda": "AmethystCoin()", +"3a07e78a": "icoIsFinishedDate()", +"3a080e93": "rebondFromUnbonded(address,uint256)", +"3a089d17": "addressLength(address)", +"3a0936ce": "contributeMsgValue(uint256[])", +"3a0a377b": "new_id()", +"3a0aec6c": "distributeDEXT(address[],uint256,uint256)", +"3a0d6350": "batchTransfer()", +"3a0d649a": "fundsToBank()", +"3a0e0418": "Prepare()", +"3a0e2475": "etherDonation(bool)", +"3a0f12dc": "grantTokensByShare(address,uint256,uint256)", +"3a0f5500": "lastBlock_a6Hash_uint256()", +"3a1053a1": "TokenBlockPay()", +"3a10a614": "get_hidden_layers(uint256[])", +"3a11aa20": "mutiSendETHWithSameValue(address[],uint256)", +"3a11b6cf": "AnotherParticipant(address,uint256,uint256)", +"3a122e65": "SPECTRUM()", +"3a12e933": "startPublicSale(uint256,uint256)", +"3a134c00": "isFreeTransferAllowed()", +"3a1460ac": "mint(address[16],address,uint256)", +"3a14bf4c": "binomial(uint256,uint256)", +"3a15021a": "confirmAndForwardOnBehalf(address,uint256,bytes,bytes32,uint256[2],uint8[2],bytes32[2],bytes32[2])", +"3a157860": "freezeBlock()", +"3a15bbee": "changeInvestmentFee(uint16)", +"3a15e7ca": "migrateFromLegacyRepContract()", +"3a16c51e": "readyOracles()", +"3a16e81e": "determinePID(address)", +"3a16f2ef": "crowdsaleStop(bool)", +"3a1767e5": "callerAdd(address,address)", +"3a178d99": "isAvailable(uint256)", +"3a180fee": "sellQuantity()", +"3a190e60": "LeeroyPoints()", +"3a1a635e": "createNewRevision(bytes20,bytes32)", +"3a1ca19e": "get_property_layout(uint256)", +"3a1d9a7d": "secondPriceTime()", +"3a1e08e0": "setAllowedTokens(address,uint256,address[])", +"3a1e7130": "teamBonuses(uint256)", +"3a1e7430": "TestTokenERC20(uint256,string,string)", +"3a20bade": "registerIncome(address,uint256)", +"3a20e9df": "getProduct(bytes32)", +"3a21cb9d": "vestingAgent()", +"3a21ec8d": "bleachPrice()", +"3a22a593": "advisorAllocatedTime()", +"3a22a94d": "lockedTokensOf(address)", +"3a232c2d": "getCurrentBonusInPercent()", +"3a23399c": "getBidCountByToken(address)", +"3a237322": "superchain()", +"3a23a483": "approveTransferManager(address)", +"3a24d701": "doSuicide()", +"3a2524c1": "enableAllowBuy()", +"3a253cee": "removeOwnerRequest(address)", +"3a256daa": "getProposalExecutionTime(bytes32,address)", +"3a257fdc": "checkFwdAddressUpgrade()", +"3a2647cf": "addMessageToQueue(string,string,uint256)", +"3a283d7d": "templates()", +"3a289d1b": "updateEscrowGoalReached()", +"3a2960e1": "numAllocations()", +"3a29c32e": "MCBA(uint256,string,string,address)", +"3a29ff34": "tokenClaims(bytes32,address)", +"3a2a0af2": "MCSToken()", +"3a2b4cdf": "addAgree(bytes32)", +"3a2b9c37": "GxCallableByDeploymentAdmin(address)", +"3a2bc42b": "fundPrize()", +"3a2c7a37": "ICOstate()", +"3a2d8784": "getDepositMultiplier()", +"3a2f1289": "BitQuickpay()", +"3a2f6e57": "transferAnyERC20Token(address,int256)", +"3a300490": "MarkRead()", +"3a300d6b": "updateAccountAmount(uint256,uint256)", +"3a30452a": "withdrawOverflow(address)", +"3a306682": "GSContract(uint256)", +"3a30cdec": "postWalletPayment(uint256)", +"3a311b84": "SimpleNameService()", +"3a31427b": "AcceptTxTaskEvent(address,uint256)", +"3a314b24": "SendETH(address)", +"3a319eff": "NZToken()", +"3a323bdf": "internalBurn(address,uint256)", +"3a32a387": "lockAmount(bytes32,bytes32,bytes32)", +"3a333d30": "TelewaveCoin()", +"3a338256": "getarg_1()", +"3a344ab8": "DragonToken(address)", +"3a349d20": "getOpenBidsByLine(bytes32)", +"3a34f09a": "getRandom(uint8,uint8,address)", +"3a357b1d": "isCrowdSaleStateICO()", +"3a36399e": "address1()", +"3a3650cf": "eurRaised()", +"3a365403": "maxWeis()", +"3a373db7": "batchTransferToken(address,address,uint8,bytes32[])", +"3a375a92": "allowsAllowance()", +"3a377c82": "_magic(uint256)", +"3a37a917": "KHCToken()", +"3a38a08c": "verifyOperation(address,uint32)", +"3a38b90f": "fusionChibis(uint256,uint256,uint256,string,string,uint8)", +"3a393ed3": "claimReward(uint256,address,address,address,address)", +"3a3ab672": "isOnWhitelist(address)", +"3a3af53f": "getMasterNodes(address,uint256)", +"3a3b0382": "PLATFORM_FUNDING_SUPPLY()", +"3a3b955b": "enableExchange(uint256)", +"3a3bc0cb": "feeCoownerAddress()", +"3a3bdf56": "claimOwnerFee(address)", +"3a3cd062": "clientWithdraw(uint256)", +"3a3d12d4": "numberOfItemsForSale()", +"3a3d523f": "setTokenLogic(address)", +"3a3e49fe": "referalAirdropsTokensAddress()", +"3a3e8e84": "getAuthorizer(uint256)", +"3a3eaeef": "repayBorrowFresh(address,address,uint256)", +"3a3eda84": "blockNumberForVictory()", +"3a3f7279": "getProductRetailer(uint256)", +"3a3f8239": "claimOrder(uint256)", +"3a3fdf05": "remainAirdrop()", +"3a4027bb": "createWithReward(string,bool,uint256,address)", +"3a40c544": "exchangeERC20(address,address,uint256)", +"3a4148de": "setPreSalesSpecialUser(address,uint256)", +"3a4268e7": "doCall(bytes32,address)", +"3a42f7de": "changeShop(address)", +"3a447341": "SplendSale(uint128,uint128,uint128,uint128,uint256,uint256,uint128,uint128,uint128,uint128,address,address,address,address,address,address)", +"3a45268b": "LocklistAddressenable(address)", +"3a45af86": "modifyProductLimit(bytes32,uint256)", +"3a45d3ef": "setAllowanceBeforeWithdrawal(address,address,uint256)", +"3a4634e4": "changeCrytiblesAddress(address)", +"3a470b9e": "removeAccountMinter(address)", +"3a47de24": "Match()", +"3a47e629": "nCurves()", +"3a48f8c1": "removeFreelancer(address,uint256[],address)", +"3a49b95a": "getMyInvestment()", +"3a4a4233": "how()", +"3a4a921e": "revokeVested()", +"3a4ac6c7": "calculateCardHolderDividend(uint256)", +"3a4ac98a": "tokensToEth(uint256,bool)", +"3a4b3664": "ownerBurn(uint256)", +"3a4b4532": "comission()", +"3a4b5e6d": "disallowOwner()", +"3a4b66f1": "stake()", +"3a4b948f": "hardBurnSMS(address,uint256)", +"3a4bece2": "CollectFromTransaction(address,uint256)", +"3a4c11b0": "setHydroStakingMinimum(uint256)", +"3a4cb854": "BrehonContractFactory()", +"3a4cba05": "SetCustomerInfo(uint64,bytes18,bytes32,bytes11)", +"3a4dcc88": "TronToken(address,address,uint256,string,uint8,string)", +"3a4de190": "repost(bytes32)", +"3a4e3342": "rate_BTCUSD()", +"3a4f6999": "maxNumber()", +"3a4faf7f": "max64(uint64,uint64)", +"3a50083d": "getRealXaurCoined()", +"3a500ae7": "JOYToken()", +"3a501155": "crowdSaleBalance()", +"3a50ccb7": "getMilestoneBonus()", +"3a5167e9": "forwardCollectedEther()", +"3a518b95": "functionName4(bytes32)", +"3a51d246": "getBalance(string)", +"3a525983": "TotalICOSupply()", +"3a531998": "getDisputeRoundDurationSeconds()", +"3a537b0c": "deliver(address,uint256)", +"3a5381b5": "validator()", +"3a551c6d": "HarborPresale(address,uint256,uint256,uint256,address,uint256,uint256,uint256)", +"3a559de6": "iGniter()", +"3a55f1f1": "BitcoinBravado()", +"3a562b78": "getOwnTokens(address)", +"3a573e02": "_badgeTotalSupply()", +"3a579abc": "withdrawTokensForEtheeraTeam(uint256,address[])", +"3a57e698": "registerGuide(address)", +"3a5860c4": "ETHERCExchange()", +"3a5b2080": "updateEducation(uint256,string,uint16)", +"3a5b5bde": "encrypt(string)", +"3a5d73d1": "airdrppReward()", +"3a5dd603": "chunk2IsAdded()", +"3a5e2576": "updateOwnerPercentage(uint256)", +"3a5ec2f8": "lemonsDroppedToTheWorld()", +"3a5eefc0": "EOSpace()", +"3a5f32cd": "updatePriceFreq()", +"3a600ce7": "sendToken(address,address)", +"3a60703b": "_transfer(uint256,address,address,uint256)", +"3a6120c5": "stopThinking(uint256)", +"3a6128db": "setLLV_edit_5(string)", +"3a6157cf": "richDatabase(uint256)", +"3a61738d": "calcReward(address)", +"3a618d26": "triggerRsclearRefund()", +"3a61dbfe": "ownerAddWorkRecord(address,uint256,bytes16)", +"3a621018": "unFreezeAccounts(address[])", +"3a62244f": "activateTransfers()", +"3a629ab3": "issueToken(address,string,string,uint8,uint256)", +"3a62a9d7": "AddressRegistered(address,string)", +"3a62cd2e": "currentCapEther()", +"3a62f663": "getAllPelvic()", +"3a63d886": "resource()", +"3a645c6d": "getLastTranche()", +"3a6514c8": "OddCoin()", +"3a669dd9": "TokenVesting(address,uint256,uint256,uint256,bool)", +"3a66caef": "ColuLocalCurrency(string,string,uint8,uint256,string)", +"3a672722": "ccSupply()", +"3a674500": "finalizeApprovedContracts()", +"3a677696": "setMigrateFrom(address)", +"3a67a0f6": "disableTransfers()", +"3a689082": "withrawFee()", +"3a693759": "changeRescueAccount(address)", +"3a6991ce": "luckVegas(uint256)", +"3a699294": "Schmeckle()", +"3a69ab39": "getItemId(bytes4)", +"3a69db94": "multiDynamic(uint256[2][])", +"3a6a0474": "VisualTechnologyToken()", +"3a6a2a69": "lockAssetHolder()", +"3a6a43f4": "marketingTokenAllocation()", +"3a6a4d2e": "distributeFunds()", +"3a6ab569": "setMemberInfo(address,bytes32)", +"3a6ddf70": "sendit(address,uint256)", +"3a6e3d98": "calcCommission(uint256)", +"3a6eb318": "getMiningReward(uint256)", +"3a6f85b1": "TIER2_BONUS()", +"3a6fbacb": "currentAmountReceivedDeposit1Ether18Decimals()", +"3a6ffc92": "GetBetResult()", +"3a70491e": "incrementBattles(uint256,bool)", +"3a70eabd": "GetMinerUnclaimedICOShare(address)", +"3a7104d1": "updateFlag()", +"3a71386f": "functionName2(bytes32)", +"3a7221e0": "bestInvestorInfo()", +"3a72cd49": "preSaleFinishedProcess(uint256)", +"3a7327a3": "setAccessLevel(address,uint256)", +"3a7343ba": "setBeneficiary(address,uint256,uint256,uint256)", +"3a73b0ad": "HypeToken()", +"3a740a63": "getBonus(address)", +"3a74a767": "_setAdmin(address)", +"3a74b05b": "changeDesigner(address)", +"3a74c05b": "updateMasternode(uint256)", +"3a750183": "_commitHash(bytes32)", +"3a752c31": "HARDCAP_TOKENS_PRE_ICO()", +"3a7562ee": "addLegitRaceAddress(address)", +"3a762f73": "getRunningRazInstance(uint256)", +"3a764462": "enableTokenTransfer()", +"3a76a282": "getBlocksTillMatthew()", +"3a76abff": "_eraseNode(uint256,bytes32[],bytes32)", +"3a7749c0": "bonusRatePeriodTwo()", +"3a774b48": "register(address,uint256,uint256,uint256)", +"3a777ce0": "_C_sendToToteLiquidatorWallet()", +"3a77c91a": "setNotes(string)", +"3a789ffb": "setMinAndMaxEthersForPublicSale(uint256,uint256)", +"3a78e324": "updateIsAttached(uint256,uint256)", +"3a79311f": "Ploutos()", +"3a79a55c": "needsLotteryFinalization()", +"3a7a1ba9": "EscapeHatchCalled(uint256)", +"3a7a302c": "LogCrowdsaleStarted()", +"3a7a52d2": "HasCard(address,uint32)", +"3a7bd7b5": "isMixGen()", +"3a7befc6": "checkUserTokenBalance(address)", +"3a7c92af": "LogWeekRate(uint32,uint256)", +"3a7d22bc": "getElement(uint256)", +"3a7d280c": "login(string)", +"3a7d8df3": "ClubToken()", +"3a7e6854": "setnewPlayerFee(uint256)", +"3a7f5e2c": "LogFundsUnlocked(address,uint256,uint256)", +"3a7fb796": "mintGreen(int256,address,uint256)", +"3a80bd25": "CoinVillaTalk()", +"3a830a96": "Leimen()", +"3a8343ee": "confirmCustodianChange(bytes32)", +"3a838636": "withdrawTeam(address)", +"3a842044": "getDeviceById(uint8)", +"3a8468f7": "isToOffChainAddress(address)", +"3a84f002": "commitDispute(uint256)", +"3a8504b5": "NewSale(address,uint256,uint256,bool)", +"3a876e88": "setMDAPPSale(address)", +"3a878528": "setlvlNominalValue(string)", +"3a88594d": "isOptionPairRegistered(address,uint256,address,uint256,uint256)", +"3a8a0a5c": "prizeMoneyAsset()", +"3a8a7907": "getbetData(int8,int8,address)", +"3a8ac516": "toKiwi(uint256)", +"3a8b069e": "depositCreator()", +"3a8ba4f6": "removeResolvers(address[],bool)", +"3a8bcc91": "startPrice(uint256)", +"3a8c5065": "developer_add_Exchanges(string)", +"3a8d1eb1": "creditWinner()", +"3a8d6e5e": "viewKYCAccepted(address)", +"3a8ed5c4": "deathFactor_v()", +"3a8f1585": "createChannel(uint256,address,address)", +"3a8fdd7d": "getExchangeCost(address,address,uint256,bytes)", +"3a903dfa": "LEYBAERT()", +"3a911d30": "getAppsCount(address)", +"3a9143e6": "CCHToken(uint256,string,string)", +"3a91db97": "onNewCampaign(uint256,address)", +"3a920766": "WALLET_TEAM()", +"3a9214d2": "AsiaPropertyCoin()", +"3a9253a3": "BurnMe(address)", +"3a92a590": "YuanTaiToken(uint256,string,uint8,string)", +"3a9407ec": "abstractFunc()", +"3a94ab31": "_upgradeTo(uint256,address)", +"3a95152d": "getEvaluationCountByStudentID(uint32)", +"3a9588ba": "changeOwnerWithTokens(address)", +"3a95a332": "left57(uint256)", +"3a95a3c8": "init(uint8,uint256)", +"3a963033": "_addIndexGame(address)", +"3a96d16d": "setInitialAllocationTimelock(address,uint32)", +"3a96df81": "bbwallet()", +"3a96fdd7": "compare(string,string)", +"3a98c533": "getElementOwners(uint256[])", +"3a98ef39": "totalShares()", +"3a9c0ae7": "issueDividendReward()", +"3a9c7d3d": "maxMultiplierByAddress(address)", +"3a9c9ffc": "historyCount()", +"3a9d8be8": "moveAccountOut()", +"3a9db5a7": "_withdrawBonus(address)", +"3a9de0b8": "settleDevFund(uint256)", +"3a9e7433": "scheduleCall(bytes4,uint256,uint256,uint8)", +"3a9e9d0d": "prizeCooldowns(uint256)", +"3a9ebefd": "decrement(uint256)", +"3a9eea12": "Impressio()", +"3a9f967e": "TOKENS_SOFT_CAP()", +"3aa0145a": "getFinalAmount(uint256,uint8)", +"3aa0396a": "mintFromICO(address,uint256)", +"3aa0eafb": "registrarUsuario(bytes32,bytes32,bytes32,bytes32)", +"3aa2ad63": "_setPlayerId(uint256,uint256)", +"3aa36dd4": "GetSaleInfo_Presale(uint8)", +"3aa3f154": "TokenSale(address,address,uint256,uint256)", +"3aa3f75a": "isOpenForSale()", +"3aa435a5": "DST_TEAM()", +"3aa4868a": "computeCacheRoot(uint256,uint256,uint256[],uint256[],uint256)", +"3aa49656": "phase2MaxEtherCap()", +"3aa51e41": "vaultFunds()", +"3aa5f4f7": "changeTokenSettings(uint16,uint256,uint256)", +"3aa5fe59": "hashAddress(address)", +"3aa612b9": "FT_TEAM_FUND()", +"3aa6608e": "processOrder(uint128,uint256)", +"3aa6c4f9": "withdrawableBalanceOf(address)", +"3aa6f0ee": "getRedemptionRequest(uint256)", +"3aa718d5": "changeDeveloperCATDestinationAddress(address)", +"3aa7429c": "TestX()", +"3aa89e83": "preICOActive()", +"3aa90889": "frozenPauseTime()", +"3aa935cb": "setDonationProportion(uint256,uint256)", +"3aa9376c": "releaseTokenSaleJM(address,uint256)", +"3aa94b1d": "getCoinStats(uint256)", +"3aaa36e6": "Fees()", +"3aaa3f24": "setPhaseSold(uint256,uint256)", +"3aaa74b2": "withdrawTips()", +"3aab3306": "SmartController(address)", +"3aab47b2": "UnpackDOT(bytes)", +"3aac430c": "TAKE()", +"3aac7661": "changeMonsterNickname(uint256,string)", +"3aaec03d": "kingGladiator()", +"3aaec5c5": "addToWhiteList(address[],uint256)", +"3aaf1898": "supplement(uint256)", +"3aaf3232": "maxRoundDelay()", +"3ab1a494": "setWithdrawAddress(address)", +"3ab1b765": "MainstreetCrowdfund(uint256,uint256,uint256,uint256,uint256,address,address,address,address)", +"3ab1e703": "roundMoneyDown3SF(uint256)", +"3ab207a3": "Flash()", +"3ab2dcec": "countCows()", +"3ab337b9": "addData(uint8,string,string,string)", +"3ab3bfc1": "splitFunds(string)", +"3ab4c395": "STARTING_SQUIRREL()", +"3ab50a9c": "getVersion(string)", +"3ab55c44": "getCurrentTokenPriceICO(uint256)", +"3ab562f2": "nextTarget()", +"3ab5657d": "getSourceConstraint(uint256,uint256,uint256)", +"3ab58703": "coldStorageYears()", +"3ab64c33": "beneficiaryMultiSig()", +"3ab71189": "_detailsLength()", +"3ab81062": "GOGO()", +"3ab89b78": "testFailHitPresaleCapPreDistribute()", +"3ab8e61a": "querybalance2()", +"3ab8ee2f": "HonestisnetworkICOregulations()", +"3ab966f4": "lastTokenPriceWei()", +"3aba9e9b": "WiredToken()", +"3abbf56a": "_setHourlyValueDecayRate(uint128)", +"3abc2106": "suicideContract()", +"3abcf3e7": "checkAssetListLength()", +"3abd0136": "totalBuyers()", +"3abd3a68": "summPartnershipsAndExchanges()", +"3abd8e4e": "getother()", +"3abdad4e": "totalCascadingPercentage()", +"3abdf792": "BATTLE_POINT_DECIMALS()", +"3abe2280": "updateTemperature(uint8)", +"3abee034": "emitRLC(uint256)", +"3abf30fc": "hash(bytes32,uint256)", +"3ac07183": "setDeprecated(bytes32)", +"3ac0feac": "getApprovedProposals()", +"3ac14078": "SEEDWhitelist()", +"3ac140e8": "distributorCount()", +"3ac163a7": "RepToken(address,uint256,address)", +"3ac19acf": "GenChipLevel_General(uint256,uint256,uint256)", +"3ac256d8": "getCurrentMilestonePostponingProposalDuration()", +"3ac2f3cc": "YinchengToken(address,address)", +"3ac31e02": "icoBalance()", +"3ac39d4b": "updateDarknodeDeregisteredAt(address,uint256)", +"3ac3a2fe": "teamPrizeClaim(uint256)", +"3ac4217c": "setJackpot(address,uint256)", +"3ac46b25": "getWithdrawableAmountPES(address)", +"3ac46e6b": "Irb()", +"3ac4aeeb": "amountFunded(bytes32,string,address,address)", +"3ac5cb73": "GeometricPonzi()", +"3ac6dd9d": "createPromotionalPurchase(uint256,uint256,address,uint256)", +"3ac70266": "setType(uint256,uint256)", +"3ac7d6fe": "pendingAddress()", +"3ac7fe84": "TestUtils()", +"3ac87121": "currentWorkStagePercent()", +"3ac8858b": "setMinimalBet(uint256)", +"3ac8b026": "storeShip(uint16,uint16,uint8,uint256,bytes32)", +"3ac8ca63": "beginContrib()", +"3ac9a77a": "createGen0Auction(uint256,uint16,uint16,uint16,uint16,uint16)", +"3ac9dfa3": "AgrolotToken()", +"3aca3788": "UCCoinSaleIsOn(uint256)", +"3aca9ffd": "createNewMsgAwaitingAudit(string,uint256)", +"3acab680": "SafeMath()", +"3acacfbe": "capitalFundable()", +"3acbd9eb": "doesOwnBase(bytes32,address)", +"3acbe450": "sow(uint256)", +"3acc2712": "partialUnlockAngelsAccounts(address[])", +"3accb428": "distributionMinter()", +"3acce2b2": "addRecord(string,address,string,address)", +"3acd8b80": "initExAlice(address,uint256)", +"3acddfc1": "marker()", +"3acde419": "addSellOrder(uint256,uint256)", +"3ace049e": "allowedSenders(uint256)", +"3acf4f9f": "ownershipUnits(bytes32,address)", +"3acf597c": "globalParams()", +"3acfad2b": "toB32(uint256,address,bytes)", +"3acfc185": "moduleAddress(string)", +"3acfd909": "getOption(string)", +"3ad0486b": "Token_1()", +"3ad04d8f": "setupFundingTime(uint256,uint256)", +"3ad06d16": "upgradeTo(uint256,address)", +"3ad075ea": "maximumSellableTokens()", +"3ad0d840": "setAvailableSeats(uint256)", +"3ad10beb": "cup()", +"3ad10ef6": "devAddress()", +"3ad14af3": "add(uint32,uint32)", +"3ad15258": "getProfits()", +"3ad17019": "changeDepositStopTimeFromNow(uint256)", +"3ad17f6d": "getWinnerAndBestMinorty()", +"3ad213e0": "connectOrderUser(address,address,uint256,address)", +"3ad359cf": "setDelegateWallet(address)", +"3ad389f2": "SanJaviercoinforwe()", +"3ad49222": "getMinimumAmount(address)", +"3ad520d8": "interestArray(uint256)", +"3ad55b83": "Tyzon()", +"3ad5b3a2": "createFunding(address,uint256,uint256,uint256)", +"3ad6f8ac": "getMaxClaimableWeiAmount()", +"3ad77392": "getTiersData(uint256)", +"3ad7c15c": "setDefaultClaimPercentage(uint256)", +"3ad84c89": "TXOsaleTwo()", +"3ad9248c": "fillInvestorAccountWithBonus(address)", +"3ad9801d": "importReward(address,uint256)", +"3ad9a928": "setFeePercent(uint256,address)", +"3ad9f722": "sendPoolMoney(uint256)", +"3ada121c": "Ballot(address)", +"3adb2de7": "bet_this_spin()", +"3adb3ad5": "querySeed(uint256)", +"3adbb3a4": "mint(uint32,uint32,uint32)", +"3add5a99": "getContractCreationGas()", +"3adda69a": "doBuy()", +"3addedd3": "getCostForAttack(uint8)", +"3adf7280": "getTotalHashRate()", +"3adf96d7": "_createProxy(address)", +"3ae01f84": "USDOracle()", +"3ae033a0": "payBounties(address[],uint256[])", +"3ae0e63f": "BtradeWhiteList()", +"3ae15692": "EEFcoin(address)", +"3ae1786f": "returnTokens(uint256)", +"3ae192bd": "changeFactorySubscriptionFee(uint256)", +"3ae2119b": "selfKill()", +"3ae24412": "addAddWhitelist(address)", +"3ae25075": "_getBonusAmount(uint256,uint256)", +"3ae26afa": "getRate(bytes32,bytes)", +"3ae34403": "stage1Bonus()", +"3ae46aed": "UruguayvsPortugal()", +"3ae49204": "setWaracoinPerEther(uint256)", +"3ae4b008": "createBounty(string,address[],uint256)", +"3ae50ce7": "createPresaleUnicorns(uint256,address)", +"3ae69708": "cryptaurBackend()", +"3ae7cdfa": "fipsLegacyRegister(bytes20[],address)", +"3ae7f938": "hash(uint256,uint256,uint256,uint256)", +"3ae83bd4": "transferFreeze()", +"3ae9133d": "coupon(uint256,uint16,uint8,bytes32,bytes32)", +"3ae983a8": "OriginalMyAccessControl()", +"3ae9b510": "getLatestMajorTree(bytes32)", +"3ae9de9b": "StatusSecurity()", +"3aeac4e1": "withdrawToken(address,address)", +"3aeaccf5": "Address()", +"3aeb512c": "updateTranscoderWithFees(address,uint256,uint256)", +"3aeb6c71": "vestingPercent()", +"3aeb850a": "DaysTillUnlock()", +"3aebe2a3": "GluuTokenCrowdSale(uint256,uint256,uint256,uint256,uint256,uint256,address,address,uint256,address,address,address)", +"3aec4439": "NSCBurnToken()", +"3aec5458": "callEmitter(uint256)", +"3aecca37": "newManuscript(bytes32,string,address[])", +"3aecd0e3": "getTokenBalance(address)", +"3aedded5": "PUBLIC_SALES_3_RATE()", +"3aedf90a": "wei_raised()", +"3aedfb8b": "withdrawl()", +"3aee0254": "addWinner(uint256)", +"3aee69bb": "changeTeamAddress(address)", +"3aef157b": "wingsTokensReward()", +"3aef3900": "proposalContract()", +"3aefaa75": "computeHash(string)", +"3aefaeb8": "setTransferRate(uint256)", +"3af05903": "deleteApprovedWalletAddress(address)", +"3af0dbc1": "contributionsOf(address)", +"3af1e17e": "createCelebrity(string,address,address,uint256,uint256,bool,uint256[])", +"3af242fd": "_createTrainer(string,uint16,address)", +"3af2b770": "BOBOTOKEN3()", +"3af32abf": "isWhitelisted(address)", +"3af34254": "LogChangeAccountAddressForSponseeAddress(address)", +"3af39c21": "undefined()", +"3af3c72d": "changeBonusUntilDate(uint32)", +"3af3db55": "channelValidator(uint64,uint64)", +"3af3f24f": "totalCalls()", +"3af41dc2": "adminDeleteRegistry()", +"3af5b3aa": "month48Unlock()", +"3af5dbb6": "mandateInBlocks()", +"3af6486e": "testStartNewCampaign()", +"3af690c2": "claimId(bytes32,uint256)", +"3af74940": "setRemainingTokenHolder(address)", +"3af75ee1": "storeBlockWithFee(bytes,int256,bytes,int256)", +"3af76638": "deployAndSetANT(address)", +"3af7d71c": "LogN(address,bytes32,uint256,string,bytes,uint256,bytes1,uint256)", +"3af826a4": "auctionCancel(uint256)", +"3af8286f": "ContractFPC()", +"3af8470d": "Rate6()", +"3af88261": "deleteTokens(address,uint256)", +"3af8e4ab": "backupOwner()", +"3af90f35": "requiresAuction(bytes32)", +"3af91491": "convertMinimalToSignal(uint256)", +"3af923ff": "CreateRCN(address,uint256)", +"3af946d2": "testnetWithdrawn(address,uint256)", +"3af94817": "getPongvalRemote()", +"3af9e169": "setStartIcoMainICO(uint256)", +"3af9e669": "balanceOfUnderlying(address)", +"3af9f8ac": "ArrowCOin()", +"3afa476c": "unstash(uint256)", +"3afa895f": "deleteSecondaryAddress(address,address)", +"3afb01d4": "testGetProgress()", +"3afbf039": "pastTenMinutes()", +"3afc7282": "getVoting(uint256)", +"3afd4b5e": "coef()", +"3afd716f": "setVIPLibraryAddress(address)", +"3afdbd83": "Activate(bytes32,string,string)", +"3afdce53": "newCrowdSale(string,string,string,uint256)", +"3afe3a8a": "GetEntityDelegatedRevoker(bytes32,uint8)", +"3b0007eb": "MinterChanged(address,address)", +"3b0107fc": "calculatePerformanceBonus(uint256)", +"3b011b30": "getSeedForTokenId(uint256)", +"3b016d83": "getAllBonus(uint256,uint256)", +"3b01788a": "throwIfSetPresaleTokensAfterActivation()", +"3b0363fa": "summFutureInvest()", +"3b039176": "CreateEvidence(bytes32,string)", +"3b040fb8": "failedKycCount()", +"3b048123": "onlyInEmergency()", +"3b048284": "totalCoinCap()", +"3b0506f7": "getVoteByAddress(address,uint256)", +"3b05a861": "setEthDepositAddress(address,address)", +"3b05c869": "StoreTest()", +"3b066dd7": "BunkToken()", +"3b06903e": "reassignModerator(address)", +"3b06a6fc": "toggleAuthorization(address,bytes32)", +"3b0732a4": "interaddtoken(address,uint256,uint256)", +"3b078de3": "changeIsPayableEnabledForAll()", +"3b079e10": "manualTransferToken()", +"3b0819b8": "create(uint256,uint256,address,address,uint256,uint256,address,uint256,bool)", +"3b08d35e": "setAuditReportBlockNumber(uint256,uint256)", +"3b098c8c": "assertEq13(bytes13,bytes13,bytes32)", +"3b0a895d": "setUsdEthRate(uint256)", +"3b0a9555": "_callReturn(address,bytes,uint256)", +"3b0ad68a": "InitializedToken(address)", +"3b0b037a": "getPriceChange(uint256)", +"3b0c197e": "getBook()", +"3b0d2764": "SNT(address)", +"3b0da260": "revokeVesting(address)", +"3b0da3b8": "updatePolicy2(bytes32,string,uint256,uint32,string)", +"3b0f0f2f": "getReferral(address)", +"3b0f343b": "getDividendAmount(address,address)", +"3b0f3ed3": "attend(uint32,string)", +"3b1019ef": "getAdvisersConsultantsTokens()", +"3b102248": "withdrawFromBalance(address,uint256)", +"3b107682": "DualIndex()", +"3b111bf3": "EtherTwitter()", +"3b116370": "GalacticX(uint256,string,string)", +"3b11b577": "CampaignOpen(uint256)", +"3b130649": "div256_128By256(uint256,uint256,uint256)", +"3b13873c": "addValidationPreSigned(address,bytes32,uint8,bytes32,bytes32,uint256)", +"3b13f8a6": "setDealerCut(uint8)", +"3b143184": "Congress(uint256,uint256,int256,address)", +"3b143b51": "untrustedProposals(uint256)", +"3b14ab12": "GetAquiredAssetBalance()", +"3b15a398": "rewardContributor(address,uint256)", +"3b161361": "VoidAccount(address,address,uint256)", +"3b1663be": "changeAdvisor(address)", +"3b16c27a": "ta()", +"3b16f5f6": "releaseMultiWithStage(address[])", +"3b172a32": "bancorToken()", +"3b172fb9": "AuctusToken()", +"3b17ebb1": "adminAddWinner()", +"3b186bfc": "logFeeWindowRedeemed(address,address,uint256,uint256)", +"3b192105": "_getLastDate()", +"3b19a17d": "resetOrderIdTo(uint256)", +"3b19c868": "BookingUpdate(address,uint256,uint8,uint256)", +"3b19d67a": "dateICO()", +"3b19e84a": "getTreasury()", +"3b1a4170": "cmulpow2(uint256)", +"3b1a520d": "testSimpleBurning()", +"3b1b69f9": "Upgradable(string)", +"3b1b8ca0": "trustedClients(address)", +"3b1bebd1": "referee()", +"3b1cbad8": "getArraySize()", +"3b1cda49": "GetBaseN(uint256)", +"3b1d21a2": "getCash()", +"3b1e2542": "updateToken(uint256,address,uint8)", +"3b1ecef0": "private_getGameState()", +"3b1ede9a": "LOOMIA2_ADDR()", +"3b1ef91c": "NeyrosNetwork()", +"3b1fe51b": "changeTimestamp(address,uint256,uint256)", +"3b20c3f3": "rocketLaunch(uint256)", +"3b215823": "taxFeeBps()", +"3b22263c": "move(uint16,uint8,uint8)", +"3b2269cf": "systemAcc()", +"3b22c8e3": "resolveGameByHand(uint32,uint32)", +"3b23a5ca": "switchStatus(bool)", +"3b242439": "ratioDenominator()", +"3b24b547": "getTransactionData(uint256)", +"3b25a6b9": "processDeposits(address,uint256)", +"3b25cf37": "PintOd()", +"3b265d35": "MatchingEngine()", +"3b270710": "ico1stPrice()", +"3b278f2a": "icoPaused()", +"3b2812ad": "newWindow(uint8,uint256)", +"3b283ff9": "TransferAllowanceFor(address,bool)", +"3b29c470": "calcTokensAvailableToBuyback()", +"3b29fe55": "isSecondLockTimeEnd()", +"3b2aa8cd": "getWeaponEntity(uint256)", +"3b2b7fec": "setCompte_21(string)", +"3b2b8ce9": "setAirdropped(address)", +"3b2dbb7f": "token2Player(address,uint256)", +"3b2e5f94": "getDepositValue(address)", +"3b2f3d4d": "BitCoin(address,uint256,uint256,uint256,address,address)", +"3b2fd34d": "backProjectXOwner()", +"3b2fe781": "sendEth(address[])", +"3b304147": "draw(uint256)", +"3b305964": "accBonusTokens()", +"3b30ba59": "ZRX_TOKEN_CONTRACT()", +"3b31cbad": "ContractFunded(address,uint256,uint256)", +"3b33175b": "setWhitelistIn(address,bool)", +"3b338da0": "getActionsCount(bytes)", +"3b33fe73": "setAuctionPrice(uint256)", +"3b340ceb": "DWEToken()", +"3b343a13": "getNodeAddress(bytes)", +"3b3493d3": "lost()", +"3b355af6": "baseData()", +"3b3561ea": "PresaleCapUpdated(uint256)", +"3b356d71": "playerKiller()", +"3b3571f1": "setMinHouseClassic(uint256)", +"3b357f4e": "determineInviter(uint256,bytes32)", +"3b35cde5": "Genesis(address)", +"3b360c7f": "getInvestorsAndTheirBalances()", +"3b3672bd": "getAddressLength()", +"3b37044d": "WWWToken(uint256,string,string)", +"3b3783e7": "ETHLotteryManager()", +"3b38e7d1": "totalSupplyByAsset(bytes32,int256)", +"3b393b03": "Zorro02Token()", +"3b39becd": "isMainSaleRunning()", +"3b3a1a7a": "tokenIdPointer()", +"3b3ae670": "getBaseRandom()", +"3b3b57de": "addr(bytes32)", +"3b3c0717": "switchRecycleAllowed(bool)", +"3b3c594b": "updateOldToken(address)", +"3b3c5aed": "addSpecialRateConditions(address,uint256)", +"3b3d5b88": "completeUnlock(bytes32,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"3b3d9485": "calcRandomNumber()", +"3b3dca76": "rand()", +"3b3df3d5": "tradeIn(address,uint256)", +"3b3e672f": "transferBatch(address[],uint256[])", +"3b3fa917": "setStartTimePreIco(uint256)", +"3b3fb38b": "rebuySum(address)", +"3b404266": "getDeployAt(uint32,uint32)", +"3b4159da": "voteProposal(address,address,uint256,string,bytes)", +"3b41b5f2": "setTotalProjectEscrow(uint256)", +"3b421f9e": "greeter(bytes32)", +"3b424f09": "setPermission(address,bytes32,bool)", +"3b427b20": "changeWhitelistCornerstoneStatus(address,bool)", +"3b428c9b": "tokenForWei(uint256)", +"3b42dfad": "saleWeiLimitWithoutKYC()", +"3b434169": "setUsdPerHundredEth(uint256)", +"3b43fa0a": "DSAuth()", +"3b441344": "setOtherRich3D(address)", +"3b442edf": "deathData_a14()", +"3b44383f": "TokenERC20(uint256,string,string,uint8)", +"3b45afed": "internalTransferFrom(address,address,uint256,uint256)", +"3b462d5b": "bounty(address[],uint256[])", +"3b46321f": "setMultisendLimit(uint256)", +"3b4656a1": "removeAssociatedAddress()", +"3b4664f0": "addToResult(int256)", +"3b46a7df": "ivote(bool)", +"3b46aca3": "fetchSnapshotBlockByIndex(uint256)", +"3b4700fa": "releaseLockToken()", +"3b470582": "getOverall()", +"3b4719d0": "getJockey(uint256)", +"3b47513b": "onlyWhitelisted(bytes,address,uint256,uint256,uint256)", +"3b478fc5": "ethUsdRate()", +"3b4793fc": "sendGift(address,uint256,string)", +"3b47d37a": "RealTimeRayTracing()", +"3b47dab6": "setSaleMinter(address,uint256)", +"3b4920b8": "batchMintPresaleTokens(address[],uint256[])", +"3b495d6b": "Petcoin()", +"3b496f53": "IssueAccepted(uint256)", +"3b49a77b": "hasConfirmed(bytes,address)", +"3b49c216": "_createSchedule(address,uint256,uint256,uint256,uint256,uint256)", +"3b49f84b": "TokenD(uint256,string,uint8,string)", +"3b4a00b4": "unPauseBuy()", +"3b4a20f2": "getExternalFundsRaised(string)", +"3b4a40cc": "ManagerAdded(address)", +"3b4b7808": "returnEthReceived()", +"3b4c4b25": "setSupply(uint256)", +"3b4cb5e5": "GoldFees()", +"3b4cc7a3": "totalCompanies()", +"3b4d75d8": "withdrawRemainPrivateCoin(uint256)", +"3b4d900a": "NANO()", +"3b4dbf8b": "setSecret(uint256)", +"3b4e06e6": "getTokenAmounts(uint256)", +"3b4e8dbf": "tokenDev()", +"3b4fb68f": "LXKToken()", +"3b52147f": "LogFundsCommitted(address,address,uint256,uint256,uint256,address)", +"3b5251b7": "getPlayerVoteRewards(address,uint256)", +"3b52f2be": "winnersLength()", +"3b53f274": "LogInt(string,uint256)", +"3b540814": "transferFundWallet(address)", +"3b545d2f": "etherToSendCharity()", +"3b5535b9": "getLastWeekStake(address)", +"3b55d26f": "workDone(address)", +"3b561709": "initTransferArr(address[],uint256[],uint256[])", +"3b563137": "transferBeer(address,uint256)", +"3b574beb": "minTokensToBuy()", +"3b57aa90": "setHash(address,uint16,bytes32)", +"3b57fdff": "emitMint(address,uint256)", +"3b58524d": "setAddress(address,address)", +"3b58d5d7": "getPremiumCarSupply(uint256)", +"3b58f49a": "setMinBounty(uint256)", +"3b591ea7": "AmountToForgeTheNextBlock()", +"3b594cd0": "_delegateAssetOwnerRemoved(bytes32,address)", +"3b599b18": "ChainclubToken()", +"3b59cb24": "bulkApproveMints(uint256[])", +"3b5a3357": "transferForFinanceTeam(address,uint256)", +"3b5a938a": "kick(uint32)", +"3b5adcef": "reservedFundsCharging(address)", +"3b5ae589": "Bitcash()", +"3b5b64f4": "conversionsCount()", +"3b5c020d": "BOT_ELEMENT_4()", +"3b5dd70b": "bigBonusPercent()", +"3b5e295c": "maxmoneypercent()", +"3b5e5376": "baseComparable()", +"3b5f24eb": "percentile(uint256)", +"3b5f30db": "EKKChain()", +"3b5fdb83": "buyP3D()", +"3b615624": "getEndorsements(bytes32)", +"3b61db4c": "stopIco(address)", +"3b61f5f5": "ChangeAuctionMaster(address)", +"3b623c19": "StripperToken()", +"3b62545b": "getNBAIWallet(address)", +"3b626b83": "getWidthrawStatFor(string)", +"3b630493": "DAPPToken()", +"3b632a74": "getInterMixed()", +"3b64e77e": "enableCrowdsaleRefund()", +"3b653755": "seedMarket(uint256)", +"3b663195": "init(bytes32)", +"3b664dc7": "addRoleForUser(address,string)", +"3b666e48": "getCurHash()", +"3b668059": "ContractBalance()", +"3b66c415": "EmergencyWithdrawalFailed(address)", +"3b66d02b": "tokenFallback(address,uint256)", +"3b68f8aa": "deleteDonator(address)", +"3b69eed4": "updatePlanetName(uint256,uint256,uint256,string)", +"3b6b639c": "luckyStoneEarning()", +"3b6b9a5e": "fuckingkill()", +"3b6c35c3": "MubsToken()", +"3b6c6c72": "SALE_MIN_CAP()", +"3b6cbaeb": "OverseasReturneesToken()", +"3b6ccee7": "switchMinting()", +"3b6d05c7": "mdtTeamAddress()", +"3b6d2544": "Found(uint8)", +"3b6dde13": "getRandomNumber(address)", +"3b6e2970": "ContractStakeToken(address)", +"3b6e31bb": "isAllowedToUpdateProxy(address)", +"3b6e750f": "isAcceptedToken(address)", +"3b6e8ec3": "doProvideMemoryAccesses(uint256,bytes32,uint256[],uint256[])", +"3b6ea083": "startTimeIco()", +"3b6ed0a7": "processSteps(uint256,uint256)", +"3b6ed992": "STBToken()", +"3b6eeb23": "HighestBidChanged(address,uint256)", +"3b704588": "BCT()", +"3b709e8d": "WeiN()", +"3b70b171": "saveBlock(string)", +"3b70cf44": "firstRoundCosmosEnd()", +"3b7104f2": "checkStatus()", +"3b7169fb": "setopVaultAddr(address)", +"3b72a1b6": "approveDeliverable(bytes32)", +"3b7404bc": "createDepositProxy(address)", +"3b746963": "minLimitPrivateSale()", +"3b750f86": "DDJDTCoin()", +"3b751f7f": "claimThroneRP(string)", +"3b7616ff": "fwdToResolver(bytes)", +"3b76594d": "depositFunds(uint256)", +"3b768433": "getByReferenceCode(bytes32)", +"3b77227c": "_addIndex(address)", +"3b7773cd": "WanchainContribution(address,uint256)", +"3b784e9e": "SafeOwnable()", +"3b789750": "transferAllFunds(address)", +"3b7a3b7f": "thisVotersName()", +"3b7a8ff5": "addInvestors(address[],uint256[],bool[])", +"3b7b9d83": "marketToken2021()", +"3b7bfda0": "boolStorage(bytes32)", +"3b7cbfcf": "depositPercents()", +"3b7d0946": "removePool(address)", +"3b7da659": "changeLocalCryptoContract(address,string)", +"3b7dc55e": "onMintCalled()", +"3b7e9825": "appendArray(uint8[],uint8)", +"3b7f7cfa": "getValidity()", +"3b7f9649": "localsTruth(address,uint256)", +"3b7ff404": "getVotersPartyVote()", +"3b809273": "unlockedReserveAndTeamFunds()", +"3b80938e": "setDeposit(address)", +"3b80fac0": "updateVisa(address,uint256,uint256,bytes32,uint256,uint256,uint256,uint256)", +"3b80fc5f": "elc()", +"3b81a5a4": "assertEq23(bytes23,bytes23,bytes32)", +"3b81b785": "showVotes(address)", +"3b81caf7": "TransferAdminPending(address)", +"3b825302": "deleteTokenGrant(address)", +"3b82fe0e": "sellItem(string,string,uint256,string)", +"3b84333e": "FaucetToken()", +"3b84bec7": "setTIME_TO_MAKE_TOMATOES(uint256)", +"3b84edbd": "setRNG(address)", +"3b85746f": "existsCountsByName(bytes32)", +"3b86758a": "window3TokenCreationCap()", +"3b8678de": "setDefenceBoss(uint256)", +"3b871b4a": "awards(uint256,uint256)", +"3b874521": "withdrow()", +"3b87ec2d": "ecoSystemFund()", +"3b882832": "updateIsReverted(bool)", +"3b8908f2": "investmentsCount()", +"3b8918df": "submitMilestone(bytes32)", +"3b89332e": "verify_signature(uint256[4],bytes32,uint256[2])", +"3b893c2d": "icoTotalBalance()", +"3b895f28": "stageTwo()", +"3b89a83a": "adminRefund()", +"3b89be73": "registerUser(address,string,uint256,uint256)", +"3b8a3d5e": "setPI_edit_4(string)", +"3b8b44d0": "getUnissuedBP(uint256,uint256,uint256)", +"3b8b4a61": "createRefund()", +"3b8dbf6d": "operatorSendByTranche(bytes32,address,address,uint256,bytes,bytes)", +"3b8e2a26": "weiCapReached()", +"3b8e603c": "outputb(bytes32)", +"3b8e6f2e": "balanceAt(address,uint256)", +"3b8ea9e7": "getValuePayment(address,uint256)", +"3b8ecdf9": "right3(uint256)", +"3b8eee6d": "checkDistance(uint256,uint256)", +"3b8f0ef4": "counterRequest(uint256)", +"3b8ff7be": "getBB0()", +"3b8ffa5e": "addVoters(address[],bytes32[])", +"3b90176f": "getTotalNormalTokensByAddress(address)", +"3b903521": "setModel(address,uint256)", +"3b9056bf": "userWithdraw(uint256)", +"3b9178f7": "transferEntireStake(address)", +"3b91c253": "getSkillNames(uint256,uint256)", +"3b91ceef": "setMax(uint256,uint256)", +"3b91ee26": "agency()", +"3b92015e": "setTokenDiscountThreshold(uint256)", +"3b92d384": "barrierStrength()", +"3b92f3df": "payment(address)", +"3b930294": "voteTokenBalance(address)", +"3b932584": "buyTokens(address,string,string)", +"3b9341f4": "setTransactionFeeRefundSettings(bool,uint256,uint256)", +"3b936961": "HuatUSD03()", +"3b942742": "totalCoinSupply()", +"3b947d2b": "removeStablecoin(address)", +"3b949785": "raiseDollarsWithdrawalCancelled(address,uint160,int160)", +"3b94b012": "restartMinting(string)", +"3b957b67": "getSumAmountOfDisputedStepsProDoctor()", +"3b95f23e": "deactivatePackage(uint256)", +"3b968963": "shortAirdropTime()", +"3b971f9f": "_tokenPrice()", +"3b97e856": "tokenDecimals()", +"3b9855ea": "experienceToLevel(uint256)", +"3b9901cc": "getChannelsByRanks(address,uint256,uint256)", +"3b9927df": "HVZSupply()", +"3b996f40": "quarter(uint32,uint32,uint32,uint32)", +"3b99915d": "getMarketWallet()", +"3b9aa6f8": "getRare(string)", +"3b9aaae4": "avt()", +"3b9bbb2f": "withdrawTotalBalanceCommissionWei(address)", +"3b9bd54d": "ClientsHandler()", +"3b9c0fdc": "deleteRound(uint256)", +"3b9c67e1": "Press(uint256,uint256)", +"3b9c7ac2": "claimLockedTokens()", +"3b9ca2d0": "migrate(address,uint256,address)", +"3b9e1497": "updateVirus(address)", +"3b9e9c91": "testSettle()", +"3b9ed710": "caculateFill(uint256,uint256,uint256,uint256)", +"3b9f7d6b": "m_unclaimedHolderIdx()", +"3b9f87a5": "setNeedToReserve(uint256)", +"3b9ff58e": "Academicon(uint256,uint256)", +"3ba04463": "p_setInvestorsPercent(uint256,uint256)", +"3ba0b9a9": "exchangeRate()", +"3ba1356c": "earnedOf(address)", +"3ba15036": "getWei()", +"3ba2a67e": "lockFund(uint256)", +"3ba2aaf2": "setOwnerToken(address)", +"3ba2cfc1": "createBitcoinAddressPrefixTask(bytes,uint256,uint256,int256,uint256,int256)", +"3ba308dd": "preSaleTokenBalances()", +"3ba72b88": "checkAvailability(address,address)", +"3ba7ecc0": "BuzFinancialStrategy()", +"3ba86465": "oraclizeQueryCost()", +"3ba87e3e": "setMultiRequestFirstRequestId(uint256,uint256)", +"3ba8b0a8": "setPendingSignatureStatus(address,uint256)", +"3ba8c9a7": "mintingFinish()", +"3ba8f108": "SetOwner(string,address)", +"3ba93114": "getEtherMonsterInfo(uint256)", +"3baa8170": "setName(string,uint256)", +"3baad248": "delWhitelist(address,address[])", +"3bab3088": "DOCTokenSale()", +"3baba4d7": "milestonesLength()", +"3bac2837": "SSAToken()", +"3bacf5ed": "changeTokenHolder(address,address)", +"3badca25": "batchTransfers(address[],uint256[])", +"3bae15df": "deleteOwner()", +"3bae795e": "ActionAuction(address)", +"3baf35fb": "nPayments()", +"3baf4e1e": "newPayment(uint256,uint256)", +"3baf6e3f": "setReferral(address,address,uint256)", +"3baf77aa": "increaseClaimsBalance(address,uint256)", +"3bafc5c0": "removeBankroll(uint256)", +"3bb0cc55": "tokensReceived()", +"3bb168a1": "isPresaleFull(uint256)", +"3bb197cf": "icoPhaseAmount3()", +"3bb1a882": "TradeListing(address,address,address,uint256,uint256,uint256)", +"3bb28957": "p2_start()", +"3bb2dead": "resolveAddressLight(address)", +"3bb33d56": "checkAtkPlayerQuest(address)", +"3bb3a24d": "getTokenURI(uint256)", +"3bb4218a": "requireContractExists(uint256,bool)", +"3bb4497c": "getAllProviders()", +"3bb54b4c": "LOG_ContractStopped()", +"3bb5a02c": "unsetAllowedMultivest(address)", +"3bb5d604": "ExchangeWhitelist(address,address)", +"3bb66a7b": "getETHBalance(address)", +"3bb735e7": "Arrholders(uint256)", +"3bb81b60": "total_bet_purchased()", +"3bb8a87f": "getConsideredTokens()", +"3bb8bd85": "TICDist(uint256)", +"3bb8da29": "GetWorldData()", +"3bb91c77": "calculatePayout(uint256)", +"3bb9f133": "listSimpleService(uint32,string,uint256,address,address)", +"3bba16da": "ifClaimedNow(address)", +"3bba21dc": "swapTokenToEther(address,uint256,uint256)", +"3bba340c": "dateMainEnd()", +"3bba72c3": "TzTToken()", +"3bbac579": "isBot(address)", +"3bbacb55": "STVCOIN(uint256,string,string)", +"3bbb0025": "ownerOfRobot(uint256)", +"3bbb11a1": "getImageMetadata(uint256)", +"3bbb44ca": "eth_is_seeded()", +"3bbbce82": "computeCurrentPrice(uint32)", +"3bbca7b4": "ImpToken(string,string,uint256,uint256)", +"3bbe0b5c": "OKFCrowdsale()", +"3bbed4a0": "setRecipient(address)", +"3bbf41d9": "GameState()", +"3bc0461a": "devFee(uint256)", +"3bc058c7": "setBS(bytes32,string)", +"3bc17b28": "round3TokensRemaning()", +"3bc17fc3": "CreateNewPool(address,address,uint256,uint256,uint256,bool,address[],uint256,uint256)", +"3bc19bba": "webGiftSentAmount()", +"3bc1e0f1": "depositCoin(bytes32,uint256)", +"3bc261bb": "balanceTokenContract()", +"3bc273b0": "changeWelcome(string)", +"3bc2859e": "blockOffset(uint256)", +"3bc2b866": "getBla()", +"3bc2bc42": "AddSubscriber(address,string,string)", +"3bc325ee": "withdrawTokenToInvestor()", +"3bc3c7f9": "ERC20Token(string,string,uint256,uint256)", +"3bc45598": "update_SRNT_price(uint256)", +"3bc47fbe": "campaignEnded()", +"3bc4be52": "ownersTokenIndex(address,uint256)", +"3bc518ea": "getTokenBySelf()", +"3bc578fe": "getClosingTimeByStage(uint256)", +"3bc58532": "hodler()", +"3bc5a0b7": "updateBytesSetting(uint256,bytes32,address,string,string)", +"3bc5b73e": "_saleSupply()", +"3bc5de30": "getData()", +"3bc5f48a": "addBook(string)", +"3bc6db30": "settleAndClose()", +"3bc70184": "getPurchase(uint256,uint256)", +"3bc756d0": "NACToken(uint256,string,uint8,string)", +"3bc764f7": "depositCPT(address,uint256,bytes32)", +"3bc7ebac": "pinnedCode()", +"3bc834fc": "usersAddress(address)", +"3bc867f5": "getLockedEth()", +"3bc91e28": "setCurrentRound(uint256)", +"3bc983d3": "decreaseAssuranvePayments(address,uint256)", +"3bca915f": "NickSterBate()", +"3bcb1edb": "_payoutDividends(address,address,uint256)", +"3bcbb6d8": "Zarina()", +"3bccbbbc": "phase3TokenSold()", +"3bcd6624": "approveTokensAndCall(address,uint256,uint256,bytes)", +"3bcdbd22": "TweedentityClaimer()", +"3bce14c8": "numberOfRecentPlayers()", +"3bceb170": "raisedByAddress(address)", +"3bced141": "transcodeReceiptHash(string,uint256,bytes32,bytes32,bytes)", +"3bcf7d22": "newBribedCitizen(address)", +"3bcff3b0": "getProjectCount()", +"3bd04d69": "addWhiteList(bytes32)", +"3bd099d3": "ICO_RATE()", +"3bd0a6e5": "clickButton()", +"3bd0aa47": "modifyItem(string,address,uint256,address,uint128)", +"3bd0dd47": "getBackEther()", +"3bd0f412": "changeMin(uint256)", +"3bd10bf1": "_seekOdd(uint256,uint256)", +"3bd137e0": "makerDAOMedianizer()", +"3bd13b4a": "completeBounty(address)", +"3bd3593f": "_PurchaseInsurance()", +"3bd4aab7": "_thirdLevelEth()", +"3bd575fa": "acceptTrustSC(address)", +"3bd5aceb": "nProposals()", +"3bd5c209": "getContractCreationData()", +"3bd6695e": "testCoin()", +"3bd74880": "HARDCAP()", +"3bd756b6": "addPrivateFund(address,uint256)", +"3bd794d0": "solveDispute(address,bytes32,address,bool)", +"3bd797b0": "Tasks(address,address)", +"3bd7a51a": "IfContractRegist(string,string,string,string)", +"3bd87ebd": "hardCapTime()", +"3bd89deb": "DAX()", +"3bdc5173": "disallowNorthPoleMinting()", +"3bdcaab9": "getEndpointBroker(address,bytes32,int256)", +"3bdd504a": "rateOfZNT()", +"3bde045f": "numberOfRounds()", +"3bde3072": "onAssetReceived(uint256,address,address,bytes,address,bytes)", +"3bde5ba8": "targetReached()", +"3bdebbe1": "withdrawERC20Token(address)", +"3bdf157a": "setoraclegasprice(uint256)", +"3bdf2c0c": "setBaseValue(uint256,uint256)", +"3bdfafac": "randomJackpot()", +"3bdff827": "StaticArbiter(address[])", +"3be08dab": "setAddress(address,address,address)", +"3be1212b": "approveValidDurationData(uint256)", +"3be1c410": "dev2Wallet2Pct()", +"3be1e952": "freezeTo(address,uint256,uint64)", +"3be258bb": "getBuyPriceDecimals()", +"3be272aa": "createRoom()", +"3be2b60c": "joinwithreferral(address)", +"3be31d63": "updateVerificationStatuses(address[],bool)", +"3be32f7d": "deleteAccount()", +"3be3a3f5": "setCloseTime(uint256)", +"3be3bdd9": "offTimeLock()", +"3be46378": "getAffiliate(uint256)", +"3be4ee30": "getUserTokenLocalBalance(address,address)", +"3be52c2c": "setStatusBurn(bool,bool)", +"3be546a2": "raiseDollarsAdded(address,uint160,int160)", +"3be554d4": "setCostPerDay(uint256)", +"3be59443": "_setOracle(address)", +"3be64ed7": "addPeriod(uint256,uint256,uint256)", +"3be6ccd9": "freezeWithdraw(address,uint256,uint256,bool)", +"3be746b6": "lockState(string)", +"3be75aa3": "shareLimit()", +"3be86ba1": "setIcoAgent(address,bool)", +"3be8fd6a": "setContent(string)", +"3be924fa": "hasAuth(string)", +"3be92863": "burnLotById(bytes32)", +"3be93b98": "createCountry(string,string,string,uint256)", +"3be94219": "purchaseAttack()", +"3be9cfb7": "changeDropper(address)", +"3bea92a3": "addToTipperQueue(uint256,address)", +"3bead271": "sale3(address,uint256)", +"3beb0044": "hminus(uint256,uint256)", +"3beb26c4": "setTime(uint256)", +"3beb4db1": "setIcoStage(uint256)", +"3bed33ce": "withdrawEther(uint256)", +"3bed93f2": "MAX_COLLECTORS()", +"3bee0613": "updateExchangeStatus(bool)", +"3bee8726": "getMaxContenders()", +"3beea695": "corruptElite()", +"3beedf6d": "lotteryAddress()", +"3befedea": "getPersonParents(uint256,bool)", +"3bf03e9e": "HelloWorldContract()", +"3bf11a6c": "initToken(address,address,uint256,uint256)", +"3bf12c88": "Rate1()", +"3bf13ded": "changERC20(address)", +"3bf17f75": "initializeCompanyTokens(uint256)", +"3bf2313d": "__transferToICAPWithReference(bytes32,uint256,string)", +"3bf2a861": "cancelOrder(bool,uint32)", +"3bf2b4cd": "approveDisband()", +"3bf2cade": "justPureFunction(int256)", +"3bf30f85": "execute(address[],bytes)", +"3bf329bf": "fraction(int216,int216)", +"3bf3d531": "miningThreePlat()", +"3bf47720": "totalTransfers()", +"3bf48672": "BattleToken(address)", +"3bf4ac5c": "day3Start()", +"3bf53a89": "unVoteAll()", +"3bf5b9c0": "getNumberByChoice(uint256)", +"3bf5f781": "Trendercoin()", +"3bf6de96": "max(uint256[])", +"3bf81b91": "testAddVoter()", +"3bf8f34a": "designatedReporterShowed()", +"3bf99b3f": "buyTokensByBTC(address,uint256)", +"3bf9b801": "_Hit()", +"3bfa0de9": "changeFundWallet2(address)", +"3bfa4449": "createFreeToken(string,address)", +"3bfb3246": "_detectInvestorGroup(uint256,address)", +"3bfb3c35": "fourthBonusEnds()", +"3bfca20f": "TokenToken(address)", +"3bfd7fd3": "incrementValue()", +"3bfdd7de": "transferManagment(address)", +"3bfecbf0": "setNeverdieSignerAddress(address)", +"3bfed5dc": "DolyToken2()", +"3bffb839": "Cryptolotto1Hour(address,address,address,address)", +"3bffd31e": "depositaPagamento()", +"3bfffc49": "getSumOfValues(uint256[])", +"3c0093a6": "MithrilToken()", +"3c01a9fa": "getEscapeRequests(uint32)", +"3c027d4f": "isTokenSelling(uint256)", +"3c0359a4": "certifications(uint256)", +"3c03d8be": "judgeAddress()", +"3c0471a2": "pregnantLinglongCats()", +"3c05187b": "execute(uint8,bytes32,bytes32,address,address,uint256,bytes,address,uint256)", +"3c067945": "fundBalance()", +"3c06ae68": "raiseBuyOrderMatched(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int160)", +"3c070b60": "dataSourceCallbackFinals(uint256,uint8[4])", +"3c077a48": "getAll(uint256)", +"3c0870ae": "challenge(uint256,uint256,uint256,bool)", +"3c096005": "managerAmount()", +"3c09ee26": "Token(address[],uint256)", +"3c0ab650": "buyAllAmount(address,address,uint256,address,uint256)", +"3c0afb59": "changeStartDate(uint256,uint256)", +"3c0b0279": "KhawCoin(uint256,string,string)", +"3c0b1c41": "AFTBToken()", +"3c0b8577": "getUserApproval(address)", +"3c0b9db2": "PolyDistribution(uint256)", +"3c0ba651": "getDutchAuctionToBuyAddress()", +"3c0cd36b": "manualPurchaseTokens(address,uint256)", +"3c0ce567": "fetchConfirm(address,bytes32)", +"3c0cfb3d": "mintMigrationTokens(address,uint256)", +"3c0dabdb": "getMidgradeCarSupply(uint256)", +"3c0dde1c": "_addPools(address,address)", +"3c0de47c": "probabilities()", +"3c0e1cc2": "revealPhaseMinSecondsWaitForClearMajority()", +"3c0e5d74": "frozenCheck(address,address)", +"3c0e6adc": "reset_individual_shares(address)", +"3c0f60ad": "setSecondaryStorage(address)", +"3c0f92e3": "supportAddOn(uint16,uint256)", +"3c0fc6ea": "kill(address[])", +"3c0fcdd1": "depositEgereg(uint256)", +"3c1008bb": "internal_transferFrom(address,address,uint256)", +"3c107402": "LongPlace(address[2],uint256[7],uint8,bytes32[2],uint256)", +"3c10d7cd": "bonusInPhase2()", +"3c11845e": "ContractConstructor(string)", +"3c11f969": "sentSecond()", +"3c121ef5": "is_empty()", +"3c126795": "OMIVIA()", +"3c130d90": "tokenURI()", +"3c133818": "winningVote(bytes32)", +"3c13ec32": "team1LockEndTime()", +"3c13fc33": "transferBase(uint256)", +"3c1593ab": "endFirstWeek()", +"3c15d28f": "createQuestion(string,address,uint128,uint256)", +"3c1650ff": "getData_23()", +"3c16761f": "SUM()", +"3c168093": "addOrder(uint256,uint256,address,address,uint256)", +"3c173bf0": "ZarfundsToken()", +"3c17494d": "set(uint16[],string,string,string,bool)", +"3c17622a": "setFreelancerSkills(address,address,uint256[])", +"3c17b656": "investmentGateway()", +"3c1800cd": "isPresaleEnd()", +"3c1853e7": "etherBack()", +"3c18d318": "sweeperOf(address)", +"3c198047": "RollToken()", +"3c19df06": "stakeCreativeCommonsContent(uint256,uint256,bytes8,uint256,string,string,string,string,uint256)", +"3c19fc06": "Holder()", +"3c1a7c6f": "getCountApplyForCertification()", +"3c1a7e2d": "adminWithdrawBCEO(uint8)", +"3c1a7eda": "certificate(bytes32,bytes32)", +"3c1a88d7": "blockTokens(address,uint256)", +"3c1ab2a3": "URL()", +"3c1b81a5": "getInstructor()", +"3c1b87f9": "setSettings(uint256,uint64,uint64,uint256)", +"3c1c423c": "getInfoLibra(bytes32)", +"3c1c5931": "promoCodeToContractAddress(bytes16)", +"3c1cc14e": "stopTokenSwap()", +"3c1ce6a5": "mintDigm(uint256)", +"3c1d28a3": "redeemLevAndFee(address)", +"3c1d7078": "BookCreated(address)", +"3c1e60a6": "tokenParametersSet()", +"3c1f1cb7": "ethSaver()", +"3c20307b": "CTWtoken()", +"3c203d44": "PreCrowdAllocation()", +"3c2040c1": "setInviteAdmin(address)", +"3c20485e": "limitIcoTokens()", +"3c205b05": "currAdminEpoch()", +"3c206900": "disableEmergencyBlock()", +"3c2087c9": "Withdrawal(address,uint16,uint256)", +"3c20d1a5": "getStageCap(uint8)", +"3c20ee6e": "_end()", +"3c21001d": "getMySentTradeOfferId()", +"3c21acc6": "extraMintArrayPending(address[])", +"3c21b968": "loadBalances(uint256[])", +"3c21db0a": "theGames(uint256)", +"3c21f0a1": "GHIToken(address)", +"3c21fa2e": "setELHeroTokenAddr(address)", +"3c226cd9": "ChangeDeadLine(uint256,bool,uint256)", +"3c22c935": "processMilestoneFinished()", +"3c232bb6": "set_traded_token_as_seeded()", +"3c237167": "getProductivityCitizens(uint256)", +"3c240a63": "updateFourthExhangeRate(uint256)", +"3c24550c": "isRefundTime()", +"3c263cf4": "savingPoints()", +"3c264820": "getWinningPayoutNumerator(uint256)", +"3c26777b": "StartedGame(address,uint256,uint256,uint256)", +"3c2698d5": "YUNLAI()", +"3c269b96": "setExchange(bool)", +"3c26cfe3": "drawLottery(string)", +"3c275e24": "getInfo(address,uint256,uint256)", +"3c276d86": "saleStartTimestamp()", +"3c278bd5": "lift(address)", +"3c279f1f": "submitWithdrawTokenTransaction(uint256,address,uint256)", +"3c28308a": "rndNo()", +"3c287a3f": "BitcoinDiamondToken()", +"3c28b9c0": "expirationInSeconds()", +"3c28ee5b": "addDeactivatedList(address)", +"3c2aba9f": "manageApprovedTransferModule(address,bool)", +"3c2b0725": "delegateContract()", +"3c2b2508": "PREMINER_ADDED(address,address,uint256)", +"3c2c21a0": "scheduleCall(address,uint256,bytes4)", +"3c2c4b5e": "MASTER_WALLET()", +"3c2cf368": "BIGTTokenDeposit()", +"3c2d55e6": "GetSubscribers()", +"3c2d6447": "setIcoPercent(uint256)", +"3c2d70e9": "start(address,uint256)", +"3c2dba23": "stakedForPollID(address,bytes32)", +"3c2e2624": "transferManyDirect(address[],uint256)", +"3c2e2a75": "depositTokenForUser(address,uint256,address)", +"3c2e671e": "founder3Wallet()", +"3c2e6b32": "AquaSale(address,uint256,uint256,uint256,uint256,address,address,address,address,address,address,uint256)", +"3c2e7d54": "priv_inMainChain__(int256,int256)", +"3c2efb22": "isContributionRegistered(bytes32)", +"3c2f24af": "loopFor(uint256,uint256,uint256)", +"3c2f7df5": "incGen0Limit()", +"3c306250": "mybalance(address)", +"3c311f3c": "previous(uint256)", +"3c314a91": "playerGetPendingTxByAddress(address)", +"3c31762c": "setMinPurchaseValue(uint256)", +"3c31fa62": "setFeeRates(uint16,uint16,uint16)", +"3c324c2e": "totalCollectableToken()", +"3c32673f": "BTTSTokenUpdated(address,address)", +"3c329dc4": "delModule(string)", +"3c32d8ef": "getOffChainIdentity(address,address)", +"3c3313a8": "registerLoan(address)", +"3c335b0e": "getRetractable(bytes20)", +"3c33808d": "preallocateSecondStage(address,uint256,uint256)", +"3c33863c": "computeGroupPhasePoints(uint8,uint8)", +"3c33d473": "setLargeCapDelay(uint256)", +"3c345335": "addSignature(uint256)", +"3c347cbd": "_0xTestToken()", +"3c358483": "setData_10(string)", +"3c35a858": "processProcessableAllocations()", +"3c35c88a": "sendFundHome2()", +"3c37a88b": "stage4_start()", +"3c37b640": "commitHash(bytes32)", +"3c3861b6": "getRace(uint32)", +"3c389cc4": "erc20Impl()", +"3c391c95": "preSaleBonus2Time()", +"3c3a8c39": "UpcToken()", +"3c3ad016": "forceUpgrade(address[])", +"3c3b4b31": "getHouseTraits(uint256)", +"3c3b7995": "privateLimit()", +"3c3bdb7a": "changeExchange(address)", +"3c3be494": "dtCreateCityData(address,uint256,uint256)", +"3c3c22b3": "oldest()", +"3c3c88b1": "initializeOnTransfer()", +"3c3c9c23": "totalEth()", +"3c3ccc44": "startNextRound()", +"3c3ce17d": "insure()", +"3c3d1385": "tinhtong(uint256,uint256)", +"3c3d3af6": "amountInvested(address)", +"3c3d9ada": "_bctc(uint256,uint256,uint256,uint256,address)", +"3c3deb54": "contractCreatedTimestamp()", +"3c3e1662": "ctf_challenge_add_authorized_sender(address)", +"3c3e2447": "MINIMUM_BUY_AMOUNT()", +"3c3e6af4": "QTX()", +"3c3efdc9": "calculateEarnings(uint256)", +"3c3f4c63": "maxSpend()", +"3c3ff394": "IRECToken()", +"3c40066d": "investByLegalTender(address,uint256,uint256)", +"3c402bd1": "AMTBToken()", +"3c41c816": "EthlanceUser(address)", +"3c4293d8": "refund_my_ether()", +"3c42f95a": "setMetadata(string,uint256,bytes)", +"3c43b91d": "setStage2Ends(uint256)", +"3c444637": "setSaleBonus(uint256)", +"3c454d7f": "getper()", +"3c45b373": "addVoting(address,uint256)", +"3c46f604": "testDeleteCase()", +"3c473336": "isEndedTrack(bytes32)", +"3c4857a7": "_approve(uint256,address,address)", +"3c489238": "HappyFutureToken()", +"3c48d7de": "shapeshiftTransfer(uint256,string,string)", +"3c490a70": "getGlobal(uint256)", +"3c4961ff": "_processAirdrop(address,uint256)", +"3c49dde4": "registerDonation(address,uint256)", +"3c49ec88": "getMyKebabs()", +"3c49ff0c": "StarCoinPreSale(uint256,uint256,address,address,address,uint256,uint256,uint256)", +"3c4a2989": "POPCHAINCASH()", +"3c4a4b1e": "createTokenTimelock(address,uint256)", +"3c4b07de": "extUnlockBot(uint256,uint16)", +"3c4b303d": "token_decimals()", +"3c4b40b8": "fundingWallet()", +"3c4b5e2b": "setInviteeAccumulator(address,uint256)", +"3c4c51c9": "getClue()", +"3c4dbb17": "PriceWeekOne()", +"3c4e7d9f": "setESCBDevMultisig(address)", +"3c4ec769": "VCT()", +"3c4f3c12": "issueTokensSale(address,uint256)", +"3c4f5a66": "getActivePlayers()", +"3c4f5be3": "registrantOfToken(uint256)", +"3c50afe1": "_icoSupply()", +"3c50edbd": "getSidesById(uint256,uint256)", +"3c5192b7": "EscrowEscalation(uint256,uint256)", +"3c520944": "getPromoCodeForFish(bytes16)", +"3c526ef1": "_divideDecimalRound(uint256,uint256,uint256)", +"3c530ace": "registerProducer(address)", +"3c536938": "executeTransaction(uint256,uint256)", +"3c5395b2": "revokeAdmin(address,address)", +"3c53cb96": "lastBlock_v0Hash_uint256()", +"3c53dabe": "BeggarBetting()", +"3c540687": "txCount()", +"3c54ca8c": "trade(address,address)", +"3c54caa5": "reclaimTokens()", +"3c5524d8": "listContractByModuleName(string,string)", +"3c552556": "verify_signature(bytes32,uint8,bytes32,bytes32,address,address)", +"3c55563e": "cards_metal_total()", +"3c560064": "mintPartner(address,uint256)", +"3c566f0f": "shopStoreAddress(uint256)", +"3c56d236": "HashLotto()", +"3c56e2ae": "register(address,uint8,bytes32,bytes32)", +"3c56eae3": "setForceReadyTime(uint256)", +"3c5746dd": "recipientExtraMIT(address)", +"3c580e92": "setLocalGame(uint16,address)", +"3c584d86": "convertWT(uint256)", +"3c58795d": "hasFetchedProfit(address)", +"3c58d378": "lockChanges()", +"3c58ef44": "getWishIdxesAt(address)", +"3c594844": "leftToday()", +"3c5972ff": "multiSetWhiteList(uint256[])", +"3c59c17a": "AgentWallet()", +"3c5a12cb": "getVal(string)", +"3c5ad147": "Debug(string,uint256)", +"3c5b7d3f": "buyTkn(uint256)", +"3c5bd949": "mine_jade()", +"3c5bdcc4": "FCOIN0939Token(uint256,string,string,uint256)", +"3c5c6331": "addAddressToUniqueMap(address)", +"3c5d1812": "totalPhases()", +"3c5e270f": "teamSupplyAddress()", +"3c5e28d6": "setClientIdentRejectList(address[],uint8)", +"3c5e417e": "_mintApproveClear(address,address)", +"3c5e57e4": "_getRarity(uint8)", +"3c5e94dd": "bulkRegisterPoA(bytes32,bytes32,bytes32,uint256)", +"3c5f10a3": "winning_ticket()", +"3c5f2bf2": "getFullRace(uint256)", +"3c5fc608": "preDGZtoDGZExchangeRate()", +"3c612c11": "authorize(address,address,address,uint256)", +"3c617685": "SocialMediaPay()", +"3c61d003": "advertisingDeposit(uint256)", +"3c6251bd": "test_oneValidEqUint1()", +"3c627c9b": "releaseAndDistribute()", +"3c630356": "AirCrash()", +"3c63d000": "setBurnRequestStringMap(uint256,string,string)", +"3c6403b4": "GetAccountIsNotFrozenCount()", +"3c647fbd": "angelMaxAmount()", +"3c648ddd": "voteSvp01(bool)", +"3c64f9aa": "ClusterToken()", +"3c65c506": "adjust_difficulty()", +"3c6677d6": "promoBun(address,address)", +"3c667b13": "rentalsContract()", +"3c671e53": "collectPayout(address)", +"3c673470": "createGroup(address,bytes32,address[])", +"3c673c19": "deleteTopic(uint256)", +"3c67b6b7": "getClaimLeft(address)", +"3c67c51e": "testLogs()", +"3c67dad5": "revertLuckyCoin(address)", +"3c6806b8": "getDiary(uint256)", +"3c681da0": "getCandy(string)", +"3c6867c3": "CallBack(string,bytes32)", +"3c68eb81": "transferFunds()", +"3c695d4e": "authorityAddress()", +"3c69a5e6": "mintPresaleBonuses()", +"3c6a2929": "setArrIntF2ArrUintF3ArrBoolF1(int256[],uint256[],bool[])", +"3c6a71f7": "exchangeRatePreIco()", +"3c6aa9f1": "decimalsValue()", +"3c6b97c9": "TokenContribution()", +"3c6b9d8c": "captains()", +"3c6bb436": "val()", +"3c6bc24b": "getBrickDetail(uint256)", +"3c6bf582": "ElementBought(uint256,uint256,uint256,address,uint256,uint256,uint256)", +"3c6c67e2": "etherAllowance()", +"3c6d2610": "TalentToken(address)", +"3c6d2e19": "contributionsETH(address)", +"3c6d736d": "ZZZCoinERC20Token()", +"3c6d7b47": "setDebugNumber(uint256)", +"3c6dfba1": "buy(uint8,bytes6,uint32,uint32)", +"3c6e03d7": "thewhalegame()", +"3c6e5927": "getMonsterCurrentStats(uint64)", +"3c6ea2a5": "HooyToken()", +"3c6eab08": "KICKICOCrowdsale(address,address,address,address,address,address,address)", +"3c6ee392": "createTokens(uint256,uint256)", +"3c6f2cc4": "sendICOTokens(address,uint256)", +"3c704089": "DigitalCash()", +"3c7045fe": "takeEtherBack()", +"3c7066d1": "feeCMT(uint256)", +"3c7097a3": "setMaxCharId(uint32)", +"3c70bd42": "sell_(uint256)", +"3c716e08": "updateAuthority(address)", +"3c71b186": "ElementeumToken(uint256,address[],address[])", +"3c71b7b6": "validDelegateSignature(address,string,uint8,bytes32,bytes32,bytes32)", +"3c71faf2": "BMToken()", +"3c72751e": "lerp(uint256,uint256,uint256,uint256,uint256)", +"3c72a83e": "getKyberNetworkAddress()", +"3c72e9bf": "IMDEXadminWithdraw(address,uint256,address,uint256)", +"3c72f070": "initialTokensBalance()", +"3c73db77": "RecycleToken()", +"3c745371": "finalAddress()", +"3c745ad5": "nextProfile()", +"3c74db0f": "expirations(address)", +"3c76aa19": "CWCreturnQueryData()", +"3c771309": "setSiringRate(uint256,uint256)", +"3c774dbb": "buyChickenParkCoin(address)", +"3c775b08": "airdropLimit()", +"3c77b95c": "testExpUnroll16(int256,int256,uint256)", +"3c77e474": "_updateKeyPrice(uint256)", +"3c7818a1": "startRoundD()", +"3c78929e": "lockUntil()", +"3c78fe07": "getReceiver(uint32)", +"3c796430": "getOneTimePayment()", +"3c799547": "amountAvailable()", +"3c7a337a": "InDeepToken()", +"3c7a3aff": "commit()", +"3c7b3d90": "rewardAirdrop(address,uint256)", +"3c7b682d": "PunkOffered(uint256,uint256,address)", +"3c7b6869": "finishPresale(uint256)", +"3c7c2563": "createtoken(string,string,string,string)", +"3c7cc806": "validateOrderAuthorization_(bytes32,address,uint8,bytes32,bytes32)", +"3c7d6f30": "publicStartRegularPhase()", +"3c7e03c1": "getRelayingKing()", +"3c7e31f0": "addCutie(uint32,uint128,uint128,uint128,uint128)", +"3c7fdc70": "fibonacciNotify(uint256)", +"3c807878": "stageOne()", +"3c811ee0": "putSellOrder(address,uint256,uint256,uint256)", +"3c8161c5": "KVC(uint256,string,uint8,string)", +"3c816217": "killBoard(uint16)", +"3c81df21": "getMultisig()", +"3c8259b4": "SACoin()", +"3c837b7d": "changeSettings_only_Dev(uint256,uint256,uint8,uint8,uint256)", +"3c8394ac": "ICORaised()", +"3c83f7aa": "rateForPhase2()", +"3c842a26": "_Test_Oraclize()", +"3c847e52": "withdrawVested(address)", +"3c84f868": "set(int256,address,uint256)", +"3c8515b1": "_createCrypton(string,address,uint256,uint256,bool,uint8)", +"3c86063c": "insertInfo(string,uint256,uint256)", +"3c875a35": "buyFuel(uint256,uint256,uint256,uint256,address)", +"3c8766c6": "sendProfitsReward(address)", +"3c876c6f": "newIdShipProduct()", +"3c87b8ef": "get_player_state()", +"3c889e6f": "getBid(uint256)", +"3c889fe1": "masterCalculator(uint256)", +"3c890e4c": "getVoteStake(uint256,uint256,uint256,bool)", +"3c893718": "transferCity(address,address,uint256)", +"3c894475": "scheduleTransaction(address,bytes,uint8,uint256[6],uint256)", +"3c89f9d4": "accept(uint256,address[],uint256[])", +"3c8a072e": "temporalUnit()", +"3c8a321c": "setPaymentGatewayList(address)", +"3c8ac88e": "createIdentityWithCall(address,address,address,bytes)", +"3c8b0c55": "set_arbits_min_contribution(address,uint256)", +"3c8b6597": "addPrivateSaleTokensMulti(address[],uint256[])", +"3c8bb3e6": "wmultiply(uint256,uint256)", +"3c8bccd9": "getCommission(uint256)", +"3c8c681a": "RoundCSold()", +"3c8c6a1e": "sendToken(address,address,address,uint256)", +"3c8ca83d": "gameBeginTime()", +"3c8cd434": "getCabCoinsAmount()", +"3c8d284b": "receiveBtcPrice(uint256)", +"3c8da588": "priceInWei()", +"3c8e3b52": "getTotalPercent()", +"3c8e66fb": "calculateTotalDirectDebitAmount(uint256,uint256,uint256)", +"3c8eac87": "getTransactionState(uint256)", +"3c8f202e": "Dashicoin(uint256,string,uint8,string)", +"3c8f3278": "hmax(uint128,uint128)", +"3c8f96f1": "bonusTokens(uint256)", +"3c9046c9": "yearTwoClaimed()", +"3c9070b5": "ConsultaProva(address)", +"3c90861c": "Enigma()", +"3c90ee6a": "DNARtoGoldXchgRate()", +"3c918bae": "wallet3()", +"3c920d0d": "liquidityPoolTotal()", +"3c925f16": "getAccountHolder()", +"3c9266e0": "sendSalary(address)", +"3c9340ae": "orderForDays(bool[])", +"3c936e97": "lockBonusTokens(address,uint256,bytes1)", +"3c93d8be": "uint2hexstr(uint256)", +"3c941423": "getDesignatedCaller(bytes32,uint256)", +"3c959aca": "CheckTickets()", +"3c960be9": "transferFromSenderPaysFee(address,address,uint256,bytes)", +"3c961202": "getHighscore()", +"3c96a7a8": "withdrawOwnerFee()", +"3c96d048": "setnow(uint256)", +"3c9719a7": "getReleasableFunds(address)", +"3c984f4a": "sellTokensForEur(string,address,uint256,uint256)", +"3c993482": "_payfee()", +"3c9a4baa": "requestOutput(bytes)", +"3c9a5d59": "getAuditAuditor(uint256)", +"3c9ad41b": "tokenIssuedToday()", +"3c9af31c": "getSponsor(uint32,int256)", +"3c9c4001": "whitehat()", +"3c9c97f0": "setBlocksPerRound(uint64)", +"3c9d377d": "f5()", +"3c9d93b8": "removeAllowedAddress(address)", +"3c9ee04c": "previousstageplayer2()", +"3c9f861d": "totalBurn()", +"3c9ff012": "timeRangeCreateGen0()", +"3ca1595a": "addNewRaz(uint256,uint256,uint256,uint256,string)", +"3ca19952": "getBookingCount(address)", +"3ca22916": "dollarPerEtherRatio()", +"3ca520f5": "LaunchPartnersAmount()", +"3ca5c69c": "AllMake()", +"3ca5c8b8": "createFilmToken(string,uint256)", +"3ca6268e": "log(string,int256)", +"3ca63675": "getNumberOfVotes(uint128)", +"3ca65e77": "JMJToken()", +"3ca6a437": "assignedGameContract()", +"3ca6b228": "getEmployee(address,address)", +"3ca6c07a": "setTokenAdd(address)", +"3ca6d100": "create(string,string,uint256)", +"3ca6d5a9": "initialBuyPrice()", +"3ca7aad7": "xorReduce(uint8[],uint256)", +"3ca805ba": "pwrFloat(uint256,uint256,uint256,uint256)", +"3ca84001": "transferFromContractTo(address,uint256)", +"3ca88a2f": "canBuy(uint256)", +"3ca8b002": "isDeploymentAdmin(address)", +"3ca95c89": "getCompte_26()", +"3ca967f3": "getCurrentExchangeRate()", +"3ca96e0e": "teamBonusAllocatedTokens()", +"3cab648a": "getModuleAddressByName(string)", +"3cac14c8": "returnArray()", +"3cac2387": "trustedTokens(address)", +"3cac38e4": "advanceStep()", +"3cacf895": "doPayments()", +"3cad71cf": "RetStatic(uint128)", +"3cad7c4e": "setLockQtyToAllowTrading(uint256)", +"3cae09ac": "silencePeriod()", +"3caebce4": "BRFToken()", +"3caed876": "submitTransaction()", +"3cb00fd2": "get_presale_iconiq_arbits_per_ether(address)", +"3cb025e2": "SimpleSafeToken()", +"3cb0b51b": "Redeem200AFTK16SeptSandbox()", +"3cb21103": "isAllowedFactProvider(address,address)", +"3cb260b2": "set_dimensions(uint256,uint256)", +"3cb27169": "receiverVestings(address,address)", +"3cb32f77": "currentHolders()", +"3cb3d027": "getTokenBankrollAddressFromTier(uint8)", +"3cb3ea68": "LAMBO_TYPE()", +"3cb40e16": "withdrawToOwner()", +"3cb4986a": "ZeusToken()", +"3cb4ff3c": "getActiveCards()", +"3cb579c1": "setValueParam(uint256)", +"3cb5bc74": "setMintLimits(uint256,uint256,uint256)", +"3cb5d100": "contributors(uint256)", +"3cb5d170": "sendTokenReleasedToBalanceInternal(address,address,address)", +"3cb5d1df": "TicTacPotato()", +"3cb6465e": "numOfWinner()", +"3cb6e20c": "LeadcoinSmartToken()", +"3cb802b9": "unclaimedDividends()", +"3cb83751": "getCofounderCount()", +"3cb8cfc8": "acceptTokens(address,uint256)", +"3cb8cfcd": "totalEthInWeiForPreIco()", +"3cb9032e": "getInvoicesCount(address,uint256)", +"3cb94596": "addressOf(bytes)", +"3cb960a6": "calcCORtoETC(uint256)", +"3cba3c77": "OperationalSplit(uint256)", +"3cba41bf": "store(bytes,address)", +"3cbcf9a4": "RatingToken(address,uint256)", +"3cbd4285": "addWinnigs(address[],uint256[])", +"3cbd6429": "playerId(address)", +"3cbdfcd9": "bountyTokensToAddress(address)", +"3cbe7309": "AgriChainDistribution()", +"3cbeb49a": "setColorBlue()", +"3cbec314": "FRUT()", +"3cbf41d2": "completeCrowdsale()", +"3cbfed74": "getBondBalance()", +"3cc0be9a": "setCompte_37(string)", +"3cc0fb45": "testFailRetractNotOwner()", +"3cc12603": "ABCToken(uint256)", +"3cc136e0": "destroyRoto(address,bytes32)", +"3cc1429c": "createEthAuction(uint256,address,uint256)", +"3cc15011": "_calculateExcessTokens(uint256,uint256)", +"3cc1635c": "deleteBooleanValue(bytes32)", +"3cc228fd": "minVotes()", +"3cc26b71": "admin_active_dividend(address)", +"3cc3c3b5": "terraformReserve()", +"3cc45596": "updateCar(uint256,bytes32,uint256,uint256,uint256,uint16,uint8,uint8,uint8,uint8,uint8)", +"3cc4c6ce": "resumeGame()", +"3cc54aae": "updateGenGuVault(uint256,uint256)", +"3cc626b6": "PotoToken()", +"3cc6441d": "Smile()", +"3cc71c3f": "COMMUNITY_ALLOWANCE_LIST()", +"3cc7508f": "uncooperativeClose(address,uint8,uint256)", +"3cc75749": "volumeType2()", +"3cc7790a": "GSI()", +"3cc7fd84": "infoTokenSilverRatio()", +"3cc8626d": "set_sellPriceEth(uint256)", +"3cc86b80": "GetMoney(uint256,address)", +"3cc86b9a": "takeAllNotClaimedForRefundMoney()", +"3cc8daf7": "setNameOwner(bytes,address)", +"3cca2420": "contractData()", +"3cca779b": "gameOpen()", +"3ccad6fc": "getNamedAddresses()", +"3ccaf593": "createReport(string,string,string,string,uint8)", +"3ccb25a2": "setRequiredBlocksElapsedForVictory(uint256)", +"3ccb47cb": "roundPot()", +"3ccb4ae4": "initLocalNodeReputation(address)", +"3ccb6c31": "setWallet2(address)", +"3ccb7dc9": "CrowdFund(uint256,uint256)", +"3ccbad50": "initialize(address,address,address,address,address,bytes32,uint256,uint256,uint256,uint256,uint256)", +"3ccc5e2c": "icoSale()", +"3ccc8193": "lastWiningTicketNumber()", +"3cccfc1b": "promotionCommisionPercent()", +"3ccd1c7f": "getFactoryProfit(uint256,address)", +"3ccdbb28": "withdrawToken(address,uint256,address)", +"3ccf127e": "raisePreSale()", +"3ccf5861": "TOSInstitutionsIncentiveContract()", +"3ccf5c8f": "setDelegadoDeEscuelaVerify(bytes32,bytes32,uint256,uint256)", +"3ccfd60b": "withdraw()", +"3cd02acd": "airdropTokens(bytes32,address[],uint256,uint256)", +"3cd109cb": "addAuthorizedOwners(address)", +"3cd17060": "getProposalHash(string)", +"3cd1b6b1": "isSponsorable(address,uint256)", +"3cd1e213": "GetRecordID(address,address)", +"3cd21d88": "ClosePeriodEvent(uint256,uint256,uint256,uint256)", +"3cd260e6": "doWorkAndPayEBT()", +"3cd2df82": "calculateTokensWithoutBonus(uint256)", +"3cd35429": "DQCoin()", +"3cd36358": "_getApproved(address,uint256)", +"3cd510ee": "getWinNumbers(string,uint256,uint256)", +"3cd5d5fc": "Sacar_BlackList(address)", +"3cd5f8ea": "addCourse(address)", +"3cd78a2b": "addToSpecialRatesMapping(address,address,uint256)", +"3cd8045e": "splitter()", +"3cd99b70": "setMaxDepartureLim(uint256)", +"3cd9a0fa": "stage_2_maxcap()", +"3cda0103": "supplyOf(string)", +"3cda0b45": "contribute(bytes8)", +"3cda6524": "addUnlockedAddress(address,address)", +"3cdb01ae": "atxChangeAddrCount()", +"3cdb3aa6": "activateRefund()", +"3cdb9762": "getTokenBalance(string,address)", +"3cdb982b": "getNumeroDeOuvidorias()", +"3cdbd414": "multivestBuy(bytes32,uint8,bytes32,bytes32)", +"3cdd37e1": "WatchedWallet(address,address)", +"3cdd9262": "peMaxPerPerson()", +"3cde5627": "SendEtherToDex(uint256)", +"3cdf60e2": "TurkCoin()", +"3cdf6783": "withdrawDeferred()", +"3ce0a093": "getHash(bytes8)", +"3ce0c432": "TokenPurchased(address,address,uint256,uint256,bytes)", +"3ce123dc": "highBidder()", +"3ce1314f": "setUnlockStart(uint256)", +"3ce17f24": "_createPlayer(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"3ce1f4e7": "testFailUpdateLatestRevisionNotUpdatable()", +"3ce24239": "AddSharedAccount(bytes32,address,bytes32,bytes32,bytes32)", +"3ce276f5": "setFreezeTransfer(bool)", +"3ce32c0a": "AWAToken()", +"3ce3480a": "closeStageOne()", +"3ce39a3d": "proposeTx(address,uint256)", +"3ce54ac3": "testFailCreateWithParentParentSameItemId()", +"3ce5facd": "HeyfanToken()", +"3ce6d89b": "approveTaxData(uint256)", +"3ce70aac": "getDocumentSequence(bytes16,bytes32)", +"3ce716f9": "WalletChanged(address)", +"3ce7da3d": "setTokenSymbolName(string)", +"3ce819e2": "captcha()", +"3ce948c8": "Token_3()", +"3ce97eb9": "GetManifestoById(uint256)", +"3ce9d22e": "setupFinal(uint256)", +"3cea6965": "gasMin()", +"3ceb7783": "rankNumbers_()", +"3cebb4d7": "setOpGas(uint256,uint256,uint256)", +"3cebb823": "changeController(address)", +"3cebff9c": "airdropPool()", +"3cec21c8": "register_(uint256)", +"3cec475a": "connectTest()", +"3cec9309": "segmentSize()", +"3cecd719": "cleanup()", +"3cece78b": "__getEthPrice(uint256)", +"3cecf2e6": "exchangeRateArray(uint256)", +"3ced516c": "descriptionHashes(bytes32)", +"3ced842b": "make_offer()", +"3cedd004": "setMinimumInitialBudgetForAudits(uint256)", +"3cee32e3": "set_allow_withdraw_amount(uint256)", +"3ceeafa7": "amountOfTokensPoolA()", +"3cef162a": "allocatetokensAndWL(address,uint256)", +"3cef51c5": "maxWeiTier3()", +"3cefc1e0": "hasTokens(address)", +"3ceffd41": "TokenPurchased(address,uint256,uint256)", +"3cf0659a": "right25(uint256)", +"3cf26a33": "transferAssetOwner(address)", +"3cf274a5": "bighype()", +"3cf2eb85": "dispossess(address,uint256)", +"3cf39ed3": "ini_supply()", +"3cf3a338": "WithdrawTithes()", +"3cf3d6d8": "getAllCellInfo()", +"3cf3ecd7": "StartGuess_tw(string,string)", +"3cf3f105": "checkInvarience()", +"3cf43e08": "revertTokens(address,address)", +"3cf43e2c": "btcId()", +"3cf46fee": "RoundClose(uint256,uint256,uint8)", +"3cf5040a": "getHash(bytes32)", +"3cf5161c": "Th_stage0(uint256)", +"3cf52ffb": "proposedTimestamp()", +"3cf572a7": "setNotice(string)", +"3cf5da75": "getTokenInvocations()", +"3cf679a5": "lastBlock_v19Hash_uint256()", +"3cf682b8": "CikkaCoin()", +"3cf6ed95": "stageForDate(uint256)", +"3cf7cbdb": "showTimeLockValue(address)", +"3cf7d47b": "IncreaseInvestedWeiAmount(uint256,uint256)", +"3cf885c4": "isBitSet(uint256,uint8)", +"3cf8acec": "allocateBid5(bytes32)", +"3cf9db41": "drawWinner(uint256,uint8)", +"3cfa92de": "BAToken(address,address,uint256,uint256)", +"3cfaa9ed": "mintedWallets()", +"3cfaaca0": "DMRToken()", +"3cfac38e": "validatePrediction(bytes32,uint256,uint8)", +"3cfb35aa": "ensSubdomainRegistrarBase()", +"3cfba0e3": "ethBalances(address)", +"3cfc47ea": "getPostPoster(uint256)", +"3cfc83f5": "addGame(string,address)", +"3cfd1f80": "VirginToken()", +"3cfd78f3": "onlyBouncerAddExtension(address)", +"3cfd86f1": "CashPokerProToken()", +"3cfe25cf": "cap_ACE()", +"3cfe6731": "claimfordividend()", +"3cff5b66": "getIsAuth(address)", +"3d00b8e3": "buyTokens(uint256,uint256,bytes)", +"3d0141f6": "whatProposal(bytes32)", +"3d01bdec": "CTO()", +"3d02c85b": "rejectTokens(address,uint256)", +"3d03582f": "collectBack()", +"3d0383c2": "getthismuchethforyourspud(uint256)", +"3d03886a": "setRobotAddr(address)", +"3d03a284": "getMyBat()", +"3d03ec29": "createCoin()", +"3d05d0e6": "MintFToken()", +"3d06242a": "setVIPFee(uint256)", +"3d062adf": "deleteMember(address,address)", +"3d0673d4": "getTotalToken()", +"3d080bd9": "dateRelease3()", +"3d089bf6": "GlobalBusinessSystem(uint256,uint256,uint256,uint256,address)", +"3d092b3d": "getMatch(uint256)", +"3d0977e1": "CROWD_WEEK2_PERIOD()", +"3d0a8dab": "endExclusive()", +"3d0ab170": "feePerUnitOfCoin(uint256)", +"3d0ab7e8": "PresaleContribution(address,uint256)", +"3d0acdaa": "getReservedPercentageUnit(address)", +"3d0c3836": "emergencyERC20Drain(uint256)", +"3d0c46d0": "getMessagesCount()", +"3d0c4924": "MAXIMUM_SUPPLY()", +"3d0c7eb6": "purchaseTicket(uint256,address)", +"3d0c9cc4": "PACK_SIZE()", +"3d0e6afc": "crownFreeze(address,uint256,uint256)", +"3d0ed048": "delBlacklist(address)", +"3d0ef823": "DepositReturn(address,uint256)", +"3d0f963e": "updateWhitelist(address)", +"3d11fa43": "delUnicornContract(address)", +"3d124c9d": "PointGameParticipate(address,uint256,uint256)", +"3d125f03": "buyTokens(address,address,address,uint256)", +"3d126a45": "devTokensPercent()", +"3d126e57": "SparkChainToken()", +"3d13341c": "_bytes32(string)", +"3d13aec8": "save(address,uint256,uint256,uint256,string,string,uint256)", +"3d140d21": "approve(address,bool)", +"3d14263a": "FailedSend(address,uint256)", +"3d147789": "UpgradeCommited(address)", +"3d160de9": "pricesAreStale()", +"3d160e0b": "UNLOCK_PHASES()", +"3d1657ff": "getIncreaseBalance(uint256,uint256)", +"3d1678f4": "redeemEnableTime()", +"3d16991a": "getStep(bytes16)", +"3d17a2d8": "merchantHistory()", +"3d182c42": "private_SetPause(bool)", +"3d1843c3": "callAndFail()", +"3d18678e": "setFees(uint256)", +"3d18b912": "getReward()", +"3d18bb7f": "HP()", +"3d18c615": "LastProposalID()", +"3d18e7b5": "amIH1()", +"3d1930ac": "mintBounties(address)", +"3d19481f": "balancePreSale5()", +"3d1a653f": "Ticket_Ganador(uint256,uint256)", +"3d1aa963": "chargeFee(address,address,uint256)", +"3d1aac95": "setWalletToClientAccount(bytes32,address,bytes32)", +"3d1b9d00": "TRCToken()", +"3d1bd1bf": "totalLockedHavvens_byAvailableHavvens_limitedSum()", +"3d1ced2b": "candyuser(address,address,uint256)", +"3d1cefc4": "SurveyToken(uint256)", +"3d1d2202": "getMinersOnSale()", +"3d1d4703": "newTribe(string,string)", +"3d1e215d": "redistributeTokens(address,address)", +"3d1e40a7": "changeTimeWithoutUpdate(uint256)", +"3d1ea04a": "getUnitCoinProductionIncreases(address,address,uint256)", +"3d201fcf": "MatchEnd(uint256,string)", +"3d20d9b0": "BONUS_ICO_ROUND2()", +"3d20e09e": "lpBidPrice()", +"3d20e3d7": "SetMemberLevel(address,address,uint8)", +"3d21aa42": "sendApproval(address,uint256,address)", +"3d226146": "createEvent(bytes32,bytes32[],bytes16[],uint256[])", +"3d2271fd": "setBytesRaw(string)", +"3d228ce8": "presaleTokenCreationRate()", +"3d22d571": "userBanning(address)", +"3d235d88": "KPRToken()", +"3d23af26": "newRegistryWithToken(uint256,string,uint8,string,uint256[],string)", +"3d24081c": "randomSkinAppearance(uint256)", +"3d249031": "Multicoin()", +"3d26851a": "_transferFrom_byProxy(address,address,address,uint256)", +"3d2796f5": "Forwarder(address)", +"3d289a76": "irbg(address,uint256)", +"3d28bab2": "SetGasBuy(uint256)", +"3d28ce75": "ChooChooCoin()", +"3d28e2ac": "totalDividendPayOuts()", +"3d2a9b9b": "getPartIndexes(uint256)", +"3d2c8d18": "lastEvidenceCheck()", +"3d2ce522": "setdaily(uint256)", +"3d2d812f": "MultiTransferValues(address[],uint256[])", +"3d2d8263": "tokenFund()", +"3d2dea63": "transferAny(address,address,uint256)", +"3d2e7538": "IPv6Token()", +"3d2f5bda": "startVoting(uint256)", +"3d2fbd0a": "usdEstimateInContract()", +"3d30276b": "Presale(uint256,address)", +"3d30dbe9": "updateBonusEligibity(address)", +"3d316134": "maxTokensToSale()", +"3d31e97b": "appendDebtLedgerValue(uint256)", +"3d32cb63": "updateReputationScore(bytes32,bytes32)", +"3d330c49": "findElevenPmUtc(uint256)", +"3d34a3e7": "setStage2()", +"3d34f921": "HexelErc20Token(string,string,uint256,address)", +"3d35d7ba": "getBuyRate()", +"3d36f7dd": "assertCorrectAllocations()", +"3d37542b": "launchOutcome()", +"3d37ef8c": "RESERVED_PARTNERS_LOCKED_SIDE()", +"3d380ff3": "releaseBatch()", +"3d389faf": "buyEnable()", +"3d38abd9": "MercadoMoeda()", +"3d3984bf": "ironProcessed(address)", +"3d39c260": "managers(uint256)", +"3d3b1c02": "SendEtherToBoard(uint256)", +"3d3b1fdf": "STRAToken()", +"3d3b2056": "getReadableTime(uint256)", +"3d3b26a6": "inflate(address,uint256)", +"3d3b4738": "GXVCReplay(uint256,address)", +"3d3bc43e": "getMessageRequestHashUsingProviderAddress(address,uint256,address)", +"3d3c3f2d": "snapshotUpdate(address,uint256,string)", +"3d3c5c9f": "trustedFillOrderTransfer(address,address,uint256)", +"3d3cba10": "decrementIncome(address,uint256)", +"3d3da831": "valueAfterAddingPremium(uint256)", +"3d3db8eb": "getOutcomes()", +"3d3eb22a": "desapprove(address)", +"3d3f5114": "MEW_CROWDSALE_FUND()", +"3d405342": "fechAllCandidatesBySnapshotBlock(uint256)", +"3d40c266": "takeSellTokenOrder(address[3],uint256[3],uint256,uint8,bytes32,bytes32)", +"3d412396": "JBXPERETH()", +"3d4197f0": "setVal(uint256)", +"3d424dc0": "ViewtBet(address)", +"3d4311e2": "getRoundCasteValues(uint256)", +"3d432808": "destroyTokens(uint256,address,uint256,uint8[],bytes32[],bytes32[])", +"3d436ea1": "getEthBullet()", +"3d438c1e": "TheHumanFund(uint256,string,uint8,string)", +"3d43bd1e": "replaceDSPRegistry(address)", +"3d44c476": "getLinkDigest(bytes32,address)", +"3d456aa5": "extendFreezeBy(uint256)", +"3d45b9ef": "TokenCLCC(uint256,string,string)", +"3d46b819": "getNonce(uint256)", +"3d472d4d": "devGiveBlockReward()", +"3d488c52": "getPackageNameOfCampaign(bytes32)", +"3d48c067": "testSmartContract(string)", +"3d48f3af": "costOfOrder(uint256,uint256)", +"3d493572": "setSoftCapReached()", +"3d49ba0f": "updateMemeUrl(uint256,string)", +"3d4a7c1e": "setStage1Ends(uint256)", +"3d4a8b4e": "ScholarToken()", +"3d4af864": "CatToken()", +"3d4b2c2c": "totalTokenBalance()", +"3d4ba37a": "setMajorityThreshold(uint256)", +"3d4d3600": "itemList(uint256)", +"3d4d8d4f": "withdrawEarnings(address)", +"3d4ee7a0": "FundariaToken()", +"3d4ef007": "vestingCount(address)", +"3d509c97": "removeRewardToken(address)", +"3d532ac5": "SWEET(uint256,string,string)", +"3d532bde": "removeSchedules(uint256,uint256[])", +"3d536a2e": "joinGame(string)", +"3d54b48a": "CreaEther()", +"3d561f73": "getBattleboard(uint16)", +"3d565121": "lockup_enddate()", +"3d568185": "createSpecialCards(uint32,uint16,uint16)", +"3d56dca3": "getBecomeHostSignatureAddress(address,string,uint8,bytes32,bytes32)", +"3d582391": "setEndsAtUTC(uint256)", +"3d584063": "getManager(address)", +"3d58650a": "BreakCoinToken()", +"3d58d0c3": "DROP()", +"3d5905a9": "setHolderAddress(address,uint256)", +"3d595134": "changeDubiAddress(address)", +"3d59995c": "remoteSetWinner(uint256,string,uint256,uint256)", +"3d59cd60": "changeRoot(bytes32)", +"3d5a3016": "canGotoState(uint8)", +"3d5aed1d": "_subGene(uint256,uint256,uint256)", +"3d5b0124": "RCR()", +"3d5b2b4e": "GxDeploymentAdmins()", +"3d5bb7f4": "setDaVinci(address)", +"3d5d0720": "totalContributedETH()", +"3d5db1c2": "incrUserOnholdBal(address,uint256,bool)", +"3d5dfb63": "_Approval(address,address)", +"3d5dff53": "tokensOwed(address)", +"3d5ef471": "nfcIdOf(uint256)", +"3d608572": "testControlCreateWithParentsSameItemId()", +"3d614def": "deployWillWallet(uint256)", +"3d619212": "basePublicPlacement()", +"3d62fa80": "getByFromAndTo(uint256,uint256,uint256)", +"3d637ebe": "tokensCreationVIPsCap()", +"3d639d84": "_getItemPrice(uint256)", +"3d64125b": "balanceof(address)", +"3d6571e5": "blub()", +"3d65a59d": "ICG()", +"3d65cf9c": "initParams(address)", +"3d65ecdf": "payToProvider(address)", +"3d662cff": "tokenDestroy()", +"3d66da8e": "claimRefund(address,address)", +"3d6759ec": "_createAsset(address,uint256,uint256,uint256,address)", +"3d677067": "buyProp(uint256,uint256,uint256)", +"3d68011a": "PRCT_TEAM()", +"3d6839c6": "REAL(address)", +"3d6859f2": "investorInfo(address,uint256)", +"3d68d33f": "BTCP()", +"3d694f30": "approveSettingCreation(uint256,bool)", +"3d695002": "_addressNotNull(address)", +"3d69b403": "isOutcomeSet(bytes)", +"3d69f4d6": "outsourceDelivery(uint256,uint256,int256,int256,int256,int256)", +"3d6a2231": "DrepToken()", +"3d6a32bd": "createTradeContract(address,uint256,uint256,uint256,bool,bool)", +"3d6a3664": "setNewOracle(address)", +"3d6a58ea": "convertSgnToSga(uint256)", +"3d6a71e4": "endedAt()", +"3d6a9750": "ShowTickets(uint256,uint256,uint256)", +"3d6ab68f": "CREATE_PERMISSIONS_ROLE()", +"3d6ad962": "claimPrizes()", +"3d6b0cb7": "testFailCreateWithParentForeignNotInUse()", +"3d6b6c70": "increaseJackpot(uint256,bytes32,address,address,uint256)", +"3d6b7301": "readAddresses(bytes32[])", +"3d6bc807": "cancelEtherBroAuction(uint256)", +"3d6bcaef": "GetWagerData(bytes32)", +"3d6c4df7": "updateWallet(address,string)", +"3d6df0d5": "docHash()", +"3d6e38b8": "changedp1(address)", +"3d6e87c1": "cancelSaleByAddress(address)", +"3d6ea8b2": "confirmMany(bytes32[],address[],uint256[],uint8[],bytes32[],bytes32[])", +"3d6eec6b": "RootNo3(uint256,string,uint8,string)", +"3d6f3366": "TokenCrowdsale()", +"3d6fc91d": "SetDestination(address,address)", +"3d6fda19": "stopIssue()", +"3d709ff1": "getRemixCount(uint256)", +"3d724027": "setLock(address[],uint256[])", +"3d725831": "getFundedTokensByIndex(bytes32,string,uint256)", +"3d72c71b": "SimpleToken()", +"3d72f40f": "getUserP3DInfo()", +"3d73c2de": "reserveCATDestination()", +"3d73ddfc": "SGNL()", +"3d7403a3": "update(string)", +"3d7417a1": "removePrMemberById(uint256,address,address)", +"3d741994": "preIcoStart()", +"3d747f67": "invalidateToken(address)", +"3d74e856": "setMinJackpotBet(uint256)", +"3d750b28": "found()", +"3d756973": "getWrapperData()", +"3d75c49e": "OEBCBank()", +"3d75e106": "ImportTestC()", +"3d7646f7": "getRok()", +"3d769e3d": "EXT_COMPANY_ONE()", +"3d76b7a3": "checkHash(uint256)", +"3d79c332": "ALU()", +"3d79d1c8": "bal()", +"3d7a8baf": "setQuoteKey(uint256)", +"3d7a8c0e": "POPKOIN()", +"3d7bed99": "addProxyForSender(address,address)", +"3d7c9f8c": "THB_Omnidollar()", +"3d7d20a4": "mintFungibles(uint256,address[],uint256[])", +"3d7d3f5a": "createSaleAuction(uint256,uint256,uint256,uint256)", +"3d7daab3": "_isValidSignatureAndData(address,bytes)", +"3d7e1048": "TransferredUnlockedTokens(address,uint256,bytes32)", +"3d7f09a3": "editEtherLimit(uint256)", +"3d7f6536": "getGraffiti(uint256)", +"3d80b532": "balance(string)", +"3d80ea28": "claimUSInvestorTokens()", +"3d813d8b": "setBountyAmounts()", +"3d814377": "window3StartTime()", +"3d820a90": "TOKEN_RATE_PRESALE()", +"3d8270f5": "getContributor(address)", +"3d82cf5a": "maxBattleRounds()", +"3d82e1b1": "assertEq3(bytes3,bytes3,bytes32)", +"3d82f71e": "distributeEGOX(address[])", +"3d832080": "ownerSetJackpotOfHouseEdge(uint16)", +"3d83230f": "auctionSuccessful(uint256,uint128,address,address)", +"3d83ed36": "increaseQuota(uint256,uint256,address)", +"3d84b8c1": "mintedForAccount(address)", +"3d856c9b": "getCmasByOwner(address)", +"3d8731ac": "LOCK_MAX()", +"3d8807f8": "cardsOfOwner(address)", +"3d888aa5": "PerformAirDrop()", +"3d88eb3f": "replOne(address,address)", +"3d8a03af": "getMatch()", +"3d8a63e4": "scam()", +"3d8b41f3": "createBurnRequest()", +"3d8c3dc9": "addTotalSupply()", +"3d8c5af4": "oddsSingle(uint256)", +"3d8c9b8c": "purchaseWolk(address)", +"3d8d020a": "withdraw(address,address,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"3d8d0db4": "totalBuyPrice(uint256,uint256)", +"3d8e0f4e": "checkRevert2(uint256)", +"3d8e1b7c": "sumICOStage6()", +"3d8e2947": "getFileAddress(bytes)", +"3d8f89d7": "setBooleanValue(string,bool)", +"3d908c82": "distributeTokensToAllUsers()", +"3d90d44d": "addPowerSource(address,uint256,uint256)", +"3d90eeb9": "getCartSubtotal(address)", +"3d91eec0": "NebbexToken(uint256,address)", +"3d922f90": "depositar()", +"3d9277f0": "unlockTip(bytes32)", +"3d9287fa": "whitelisted()", +"3d937410": "CokecoinTokenTest()", +"3d937824": "setCompte_35(string)", +"3d93a355": "InTokenTest12(uint256,string,uint8,string)", +"3d944953": "withdrawCollectedResources()", +"3d946410": "isPreSalePeriod()", +"3d946c53": "restartElection()", +"3d94e23b": "viewXCAT(address,address,bytes32)", +"3d955aa3": "poll(uint256)", +"3d956691": "tokensToSell()", +"3d957b0b": "third_bonus_amount()", +"3d960ec3": "round2Sold()", +"3d96c758": "TreeLim()", +"3d96fa3c": "getAllDelegatorAddress()", +"3d972839": "withdraw(uint16)", +"3d9aa932": "oraclize()", +"3d9ad7ce": "SENIUM()", +"3d9aeef0": "isBetStorage()", +"3d9af4d1": "setMigrateDueToNoReports(bool)", +"3d9ce89b": "scheduleCall(bytes4,bytes,uint256)", +"3d9dcb07": "getFamedStarByID(uint256)", +"3d9e23ca": "PartnersFund()", +"3d9e4233": "registerAlbum(bytes32[],bytes32[],bytes32[],bytes32[],bytes32,bytes32)", +"3d9f01fb": "renterOf(uint256)", +"3d9f923b": "updateDenomination(bytes8,address)", +"3da01325": "blockUser(address)", +"3da04e4a": "getUserGroups(address)", +"3da06d6c": "getTemporaryWinningFaction()", +"3da09d40": "Ripple()", +"3da0ac79": "compare()", +"3da1c0c3": "isVerifiedUser(address)", +"3da1eff5": "claimOwnerSupply()", +"3da1f79a": "revokeSignature(uint256)", +"3da216da": "LuckyMoneyToken(uint256,string,uint8,string)", +"3da32dc5": "FcsCoin()", +"3da368c0": "ETHcomeback820()", +"3da4ba4a": "AiboCoin(address,uint256)", +"3da55aba": "setZlotsAddress(address)", +"3da5c3ce": "puzzle(address,bytes32)", +"3da5d173": "ZeroExExchange(address,address)", +"3da611cd": "ContractEthLimitChanged(uint256,uint256)", +"3da64a06": "issueTokenToGuaranteedAddress(address,uint256,bytes)", +"3da69ff4": "Salome()", +"3da76788": "getDataLength()", +"3da79946": "allEthOUT()", +"3da80d66": "contains(address[],address)", +"3da98498": "Crowdtes()", +"3daa33d5": "buyAndSellPrice()", +"3daad222": "asmTransferFrom(address,address,address,uint256)", +"3dab45b6": "setMtdPreAmount(uint256)", +"3dabb0f6": "verifySignature(address,address,uint8,bytes32,bytes32)", +"3dac68b7": "setAddressAdv(address)", +"3daceda1": "createSyndicate(address,uint256,uint256,uint256,uint256)", +"3dad1583": "getAyes(uint256)", +"3dae94f0": "cumulativeIndexOf(uint256[],uint256)", +"3daee1b8": "weekThreeRate()", +"3daefe4b": "Election1()", +"3daf099f": "transferEthereum(uint256,address)", +"3daf31b5": "withDecimals(uint256,uint256)", +"3dafbf92": "SNPToken()", +"3db05068": "toForecastData(uint8,uint8,bool,uint8,uint8)", +"3db08826": "isProofValid(bytes32[],bytes32)", +"3db13fec": "PalletOneToken()", +"3db1c253": "projectFailed()", +"3db1f00a": "TOSMidHoldingContract()", +"3db2254b": "deleteAllReports()", +"3db2a12a": "Empty()", +"3db36b5f": "transferTokensFromTeamAddress(address,uint256)", +"3db3f2cf": "submitBid(address,bytes32)", +"3db62953": "currentExchangeSystem()", +"3db7a118": "blockDotDifficulty()", +"3db7c149": "SmartCityCrowdsale(address,address,address,uint256,uint256,uint256)", +"3db7e347": "contributorAt(uint256,uint256)", +"3db80346": "closeGroup(uint32)", +"3db8352d": "setEvaluator(uint256)", +"3db8433c": "setLeagueRosterAndCoreAndContestContractAddress(address,address,address)", +"3db8493a": "put(uint256,string,string)", +"3db9c4aa": "createIntention(address)", +"3dba0b57": "MCTTokenAddress()", +"3dba6197": "etherAccumulator()", +"3dbad089": "Contribute(address,address,uint256)", +"3dbae017": "EasyToken()", +"3dbae9f9": "startIcoTwo()", +"3dbb07ac": "s28(bytes1)", +"3dbb270d": "AshCashToken()", +"3dbb7f46": "setPrizeFundFactor(uint256)", +"3dbb874e": "getPetClaims(uint64)", +"3dbba05c": "callDefaultRelease()", +"3dbc7c69": "totalApproval(address)", +"3dbe56f0": "getUnfreezedTokens(address)", +"3dbe6469": "ChangeBuyer(address)", +"3dbedbd4": "StopICO()", +"3dc02266": "fipsRegister(uint256)", +"3dc09a70": "OwOToken()", +"3dc0d600": "nome_vincitore()", +"3dc11dd1": "ethSwapRate()", +"3dc1579a": "RELEASE_TIME()", +"3dc19db8": "addAdministator(address)", +"3dc1a6bc": "getSkillLength()", +"3dc1d46b": "auditGuess(uint256,string,uint8,uint256,uint256,uint256)", +"3dc1ef34": "limitMaxSupply()", +"3dc23486": "_addBalance(address,uint256,address)", +"3dc268a6": "oraclize_query(uint256,string,bytes[2],uint256)", +"3dc286ae": "getEncSeckey()", +"3dc37539": "reveal_test_data(int256[],int256)", +"3dc38fc1": "addCourse(uint256,uint256)", +"3dc4cac9": "Mycryptonline()", +"3dc58149": "getDepositRecord(address)", +"3dc5bf97": "acceptRegistrarTransfer(bytes32,uint256)", +"3dc60e52": "getKittyCount(address)", +"3dc6e9b0": "changeMaxLockDuration(uint256)", +"3dc7426e": "setMaximumMintableQuantity(address,uint256)", +"3dc7c549": "sumHardCapICO()", +"3dc7ea7f": "recently_added_address()", +"3dc9124e": "numOfLoadedCrowdsalePurchases()", +"3dcb0b81": "PollManagedFund(address,address,address,address,address,address,address,address[])", +"3dcb66db": "Storer()", +"3dcbab40": "UnFrozenFunds(address,uint256)", +"3dcbf7eb": "addAddressToAccountFor(address,bytes,bytes,address,bytes32)", +"3dcd351f": "getAllReceipt()", +"3dcd6176": "returnTokenBalance(address[2],bytes32)", +"3dce1ea9": "curPayoutId()", +"3dced193": "getPI_edit_33()", +"3dcf59ca": "initiateMigration(address,address)", +"3dcfbdd0": "getBrickAddress()", +"3dd00c42": "getMyMinersAt(uint32,uint32)", +"3dd02f06": "setCoinStorage(address,address)", +"3dd16673": "teamETHAddress()", +"3dd287d4": "monsterNFTContract()", +"3dd297da": "safeMultiply(uint256,uint256)", +"3dd2b811": "CSNO()", +"3dd2e0f0": "optionTotalTimes()", +"3dd35279": "memberIndex(address)", +"3dd49939": "ext(address)", +"3dd5b2da": "withdrawContractETH()", +"3dd5e0ec": "NewSouth21Token()", +"3dd7609a": "ETHER_AMOUNT()", +"3dd7b14b": "optionPoolBalance()", +"3dd7c1b9": "newProduct(string,string,uint256,uint256)", +"3dd82637": "Transformers()", +"3dd83fe1": "newPlayer(address,uint256,uint256)", +"3dd86478": "isFromState(address,address,uint256)", +"3dd93a8a": "getUsersGeneratorsIds()", +"3dd95d1b": "setExecutionDailyLimit(uint256)", +"3dda1aff": "Football()", +"3dda37dc": "flags(address,address)", +"3dda7b1d": "fuddToken()", +"3ddac459": "changeminpresale(uint256)", +"3ddb77bd": "_distDay()", +"3ddc3277": "charityFoundationIdx()", +"3ddc8e9c": "fixedLoge(uint256,uint8)", +"3ddcbace": "Escrow(address,address,address)", +"3ddd4698": "registerNameXaddr(string,address,bool)", +"3ddd5313": "acceptPayments()", +"3dde1598": "redeemBattleCrates()", +"3dde3918": "removeAdministrators(address)", +"3de035bf": "endWork(uint256)", +"3de1a4bc": "getDepositPool()", +"3de24c17": "refundInvoice(address,address)", +"3de33a32": "doIssueTokens(address,uint256)", +"3de377ec": "mock(uint256)", +"3de39c11": "maxGasPrice()", +"3de3ebf8": "getPlayerEnergy(address)", +"3de3fbd9": "totalTokenRewards()", +"3de46340": "getBlockVoterBalance(uint256,address)", +"3de478cc": "validateSignatures(bytes32,bytes,bytes)", +"3de4ca9e": "Karma(address,address)", +"3de4eb17": "getAdopters()", +"3de696d3": "percentFeeTimes5()", +"3de6a03f": "checkStatusICAP(bytes32,uint256,string,address)", +"3de7dfb1": "Amount_of_Chi_for_One_ETH()", +"3de8c792": "BUYER_STEP_4(bytes32,uint256,bytes1,address)", +"3de8d340": "dividendsBlocks()", +"3de9c8e6": "haltFundraising()", +"3de9e4c6": "__transferFromWithReference(address,address,uint256,string)", +"3dea6b9a": "getMeme(uint256)", +"3deaa297": "transferAllDividends()", +"3deaa323": "minPurchaseLimit()", +"3dead9e8": "Mythereum()", +"3deaf6d4": "MAXIMUM_FIRST_DAY_CONTRIBUTION()", +"3deb23d2": "STANDARD_RATE()", +"3deb91c7": "setMinReserve(uint256)", +"3debd2d8": "sendToAddress(address,uint256)", +"3dec4cb3": "pre_ico_start()", +"3dedc36e": "getGunByIdPart2(uint256)", +"3dee7237": "amountOfBPs(address)", +"3def449b": "FipsNotary()", +"3defb962": "heartbeat()", +"3df08c6a": "privateSalesTokensSold()", +"3df16377": "make_move_and_claim_victory(uint256,uint8,uint8,uint8,uint8,uint8,uint8,uint8)", +"3df18d2a": "model(address)", +"3df18e0a": "bytes32ToHex(bytes32)", +"3df19507": "intToDec(uint256)", +"3df2b29d": "powerDown(address,address,uint256)", +"3df2b723": "adminClaimAirdropMultiple(address[],uint256[])", +"3df2d6fd": "FIGHTMONEY()", +"3df40c7a": "startPreIcoDate()", +"3df4a282": "setCurrentSaleDayAndBonus(uint8)", +"3df4ddf4": "first()", +"3df5140c": "setIsTokenCanBeSell(bool)", +"3df5958f": "VillanovavsRadford()", +"3df6b23c": "angelRound()", +"3df76482": "fipsPublishData(bytes20,bytes)", +"3df77c0e": "testBalanceOf()", +"3df7c86d": "mom()", +"3df86f79": "split32_20_12(bytes32)", +"3df91162": "getUpdatable(bytes20)", +"3df95fc9": "HAYATO()", +"3df96853": "carIdToRenter(uint256)", +"3dfa0384": "messageSenderAddress()", +"3dfa1c46": "LLV_v31_5()", +"3dfb4843": "renewDeed(bytes32)", +"3dfc42c8": "TdeFinalized(uint256)", +"3dfc6980": "set_verifiedUsersOnlyMode(bool)", +"3dfca2ad": "finishVoting(address,uint256)", +"3dfcdf2b": "CoinVila(address)", +"3dfd288a": "checkVotingForTransferWeiFromExchangeToPayment()", +"3dfd83c6": "SPARCToken()", +"3dfeac48": "MaximalInvestmentChanged(uint256)", +"3e00b910": "buyTokenPreIco(address,uint256)", +"3e011b11": "getTokensBackAFterCorwdsale()", +"3e032a3b": "slippage()", +"3e03c84f": "tokenIsLocked(address)", +"3e03d50f": "isTeam(uint256)", +"3e0448c2": "ChangedId(address,string)", +"3e045845": "issueSecurityTokens(address,uint256,uint256)", +"3e04bf23": "upgradeShip(uint32,uint8)", +"3e058664": "getBonusPercentRate()", +"3e05c964": "withdrawnByBeneficiary()", +"3e05ca7c": "get_PendingGains(address,address,uint256,bool)", +"3e05e01b": "ethReward()", +"3e0663e0": "AdminDrawProcess()", +"3e06be20": "downgradeToBasic(bytes32)", +"3e0764ba": "set_payment_details(uint256,string,address)", +"3e07905e": "endBuffer()", +"3e0807ca": "numberBtcUpdates()", +"3e0831e2": "putStoWithBto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"3e083f7d": "deals(uint256,uint256)", +"3e085c3d": "airDropToOldTokenHolders(address[])", +"3e085d0e": "transfer(address,uint48,bytes,string)", +"3e087d01": "addEligibleBurner(address)", +"3e0912ec": "KangEOS()", +"3e093f38": "testPullWithTrust()", +"3e09876a": "vehicleFound(address,uint256)", +"3e0a322d": "setStartTime(uint256)", +"3e0a51b4": "TweetAccount()", +"3e0a7ab5": "addONG_AUDIT(bytes32,string,string)", +"3e0aba92": "fourth_release(uint256)", +"3e0ad2d4": "TPC(uint256,string,string)", +"3e0aedaf": "TreePlusToken()", +"3e0b7eb2": "updateTranscoderWithRewards(address,uint256,uint256)", +"3e0bd52e": "setAccountMaster(address)", +"3e0c1f2a": "fetchNextSnapshotBlock()", +"3e0c5d2c": "earlySafeWithdrawal(uint256)", +"3e0d4f4a": "ApproveContractorProposal()", +"3e0dfbdf": "getInvestorByAddress(address)", +"3e0efe67": "putBtcWithSto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"3e0fddbd": "ClaimHodlToken(address,uint256,uint256)", +"3e1092f2": "changeModuleRegisterOwner(string,string,address)", +"3e109a19": "minBid()", +"3e112bf3": "calcResult(uint256,uint256,uint256)", +"3e112ed7": "reserveCoins(address,uint256)", +"3e11456f": "PRIVATE_SALE_ACCOUNT()", +"3e11741f": "sellToken(address,uint256,uint256)", +"3e118dbe": "_version()", +"3e118f1f": "weiMinSaleIco()", +"3e11b765": "batchApprove(address[],uint256[])", +"3e11e378": "changeController(address,address)", +"3e127ab7": "maxPoly()", +"3e127e76": "safe_add(uint256)", +"3e129967": "SpaceWar()", +"3e1457a1": "initRates(uint256[],uint256[])", +"3e152d8e": "maxBonusTickets()", +"3e15346d": "removeGlobalConstraintPost(address,int256,address)", +"3e156601": "p_setMinInvestment(uint256)", +"3e15ef90": "GetDataPoint(uint256,uint256,bool,string)", +"3e165810": "initBMC(address,uint256,uint256,uint256,uint256)", +"3e175c0b": "goldUnFreeze()", +"3e17b882": "mutateCrabPart(uint256,uint256,uint256)", +"3e18117a": "AhooleeToken()", +"3e182d3f": "addSelctFight2Death(address,uint256,uint256,uint256,uint256)", +"3e184adf": "BucksTecToken()", +"3e18e78e": "endTimeinMinutes()", +"3e1a3376": "updateInvestorsComission(uint256)", +"3e1a420f": "publishRewardlessTaskListing(string,address,uint256,uint256)", +"3e1a9300": "getLastIndex()", +"3e1b0d29": "fechAllVotersBySnapshotBlock(uint256)", +"3e1b4645": "qualifiedAddress(address)", +"3e1b5b3e": "rateEarlyStage4()", +"3e1ba676": "subBountySupply(uint256)", +"3e1c01b5": "capitalAllocation()", +"3e1c2d5a": "RegisterKey(address,string)", +"3e1cc152": "fundWallet2()", +"3e1d09be": "changeSubcourtMinStake(uint96,uint256)", +"3e1d8156": "Issue(uint256,address,uint256)", +"3e1da046": "isDelegateOf(address,bytes8)", +"3e1e292a": "testCopy(bytes)", +"3e1eab35": "VUTEST2()", +"3e1fd0da": "checkAccess(bytes32,address)", +"3e20f7fb": "HashnodeTestCoin()", +"3e214e96": "changeAirDroper(address)", +"3e2153bf": "viewBeneficiaryDetails(address)", +"3e21b00f": "C40Coin()", +"3e239e1a": "getHour(uint256)", +"3e23ee7e": "executeTrade(address,address,uint256,uint256,uint256)", +"3e23ee9c": "BlackHorseWallet()", +"3e24fcbf": "capHicsToken()", +"3e254a0c": "YTCOMMUNITY()", +"3e2557c5": "_price_tokn_ICO_second()", +"3e25e837": "withdrawCommission()", +"3e25fdd4": "getLastStellar()", +"3e260a2c": "allocateReserveTokens()", +"3e262e46": "getTradeOfferSender(uint256)", +"3e2640d6": "extendClosingTime(uint256)", +"3e2729bf": "isRevocated(bytes)", +"3e275f06": "crowdSaleStart(uint16,uint16[5])", +"3e27e1be": "validateResetDeadTokens(uint256)", +"3e28912f": "getStrField3()", +"3e2cd68b": "get_share_by_address(address,address)", +"3e2d6cf6": "_emitWithdrawn(address,uint256,address)", +"3e2d7004": "getTokenRate()", +"3e2d7de1": "mintTokensWithIncludingInJackpot(address,uint256)", +"3e2ddb60": "changeMajorThreshold(address,uint256,bool,bytes)", +"3e2e806d": "rewardTokensFloor(address,uint256,uint32)", +"3e2ee39e": "debug_resetuser()", +"3e2fce37": "updAutoFreeze(bool)", +"3e2fe149": "getNewOwner()", +"3e30046a": "maxSale()", +"3e30838d": "delOperator(address)", +"3e313f28": "_changeColour(uint256,uint8,uint8,uint8)", +"3e31c77f": "setZoPrice(uint256)", +"3e321249": "PdexToken(address)", +"3e32224a": "BF1Token()", +"3e325589": "init(address,address,uint256,int8)", +"3e326048": "initWallet()", +"3e32bea2": "priceIncreasePerPurchase()", +"3e33c37b": "gameContext(uint256)", +"3e345bd8": "FatherToken()", +"3e34f34e": "isUserHasPermissonToModify(address,string)", +"3e351a45": "lotteryWinner()", +"3e352d49": "updateTokensForEtheeraTeam(uint256)", +"3e361281": "betsWon()", +"3e362c96": "bountyCount()", +"3e363696": "BuyWithPathwayFromBeneficiary(address,uint256)", +"3e3657a5": "addConfigEntryInt(bytes32,uint256)", +"3e3756db": "PauseOn(uint8)", +"3e379d64": "setBonus()", +"3e38a2b7": "delegateCount()", +"3e38dab8": "refundFlip(bytes32)", +"3e3926e4": "whitelist(address,uint256,uint256,uint32)", +"3e3b429a": "canPurchase(address)", +"3e3bc743": "AmazingDex(address)", +"3e3c9eae": "qsize()", +"3e3cba8f": "changeBalancesDB(address)", +"3e3ce4f3": "GSEN()", +"3e3d64e2": "hatchingsNeeded()", +"3e3dae41": "maximumSaleLimitUnits()", +"3e3deb8b": "MyMonsterCount(address)", +"3e3dff65": "GainsCalculated(address,uint256,uint256,uint256,uint256)", +"3e3e0b12": "stopMinting()", +"3e3ee859": "NewQuestion(string,bytes32)", +"3e3f4e24": "RealEstateCryptoFundAirdrop(address)", +"3e40aab4": "returnActions(uint256[8],uint256)", +"3e412533": "Easy()", +"3e415358": "transfer(address,uint256,address,address,uint256,uint8,bytes32,bytes32,uint256)", +"3e41d5eb": "addOwnersWithHowMany(address[],uint256)", +"3e427e89": "returnHostAndCreatorCut(uint256)", +"3e42ad79": "Instantium()", +"3e42ed80": "ProgressiveToken(string,uint8,string,uint256,uint256,uint256,address)", +"3e43b652": "betValueOf(address)", +"3e43e8b4": "AnimeToken(address,uint256)", +"3e441ef4": "SetItem(address,uint256,address)", +"3e445446": "STARTING_KILOS()", +"3e445506": "successfulPreSale()", +"3e44694f": "DID()", +"3e4476a3": "addAddressToJackpotParticipants(address,uint256)", +"3e450fff": "adminDeleteAccount()", +"3e4565d2": "testErrorUnauthorizedNameRegister2()", +"3e4604b3": "robotAddr()", +"3e460a84": "distributeBooking(uint256)", +"3e46eb60": "fortune_endauction(uint256)", +"3e476053": "moveFunds(address,uint256)", +"3e4852bd": "getGroupData(uint256)", +"3e4882fc": "AddressChangeConfirmed(address,address)", +"3e49077a": "createSaflokKey(bytes32,bytes32,bytes32,bytes32)", +"3e49776b": "VOLUME_5()", +"3e49820d": "changeTicketCap(uint256)", +"3e499dff": "addKYC(address)", +"3e49bed0": "setInt(bytes32,int256)", +"3e4a9263": "enforceSecondLock(address,address)", +"3e4b20cf": "updateGameSpecifics(uint256,uint256)", +"3e4b2570": "investorsAllocation()", +"3e4bdce4": "hasAccountPendingOrders(address)", +"3e4bee38": "GOLD()", +"3e4c0c82": "player_1(uint256)", +"3e4c9534": "getInvestmentMin()", +"3e4d914e": "lastBlock_f12Hash_uint256()", +"3e4e0432": "notifyOfArbitrationRequest(bytes32,address)", +"3e4f49e6": "state(uint256)", +"3e4ffa9b": "getImage(uint256,bytes32[],uint256,uint256)", +"3e5087cc": "testBasicThing()", +"3e50b0b8": "sendOwnerEther(address)", +"3e50de30": "calculateRewards()", +"3e510870": "transferOPSPool()", +"3e52d5c6": "openBoxes(uint256[])", +"3e530e5b": "find(uint256)", +"3e531e0d": "queryGameStatus(uint256)", +"3e53ccee": "actualPriceDivisor(uint256)", +"3e5442bd": "getBitsoAddress()", +"3e546675": "DelegateDualOwnable(address,address)", +"3e55eab0": "parcipateCrowdsaleInvestor(address)", +"3e5615bc": "FourToken()", +"3e568fe7": "GetDaysInOffice()", +"3e56f9f9": "getPayout(uint256)", +"3e57324e": "EmergencyPause()", +"3e586a81": "BeatTokenEthPriceChanged(uint256)", +"3e589050": "changeKeys(string,bytes1[])", +"3e58a465": "getShareList()", +"3e58c58c": "send(address)", +"3e592d50": "ResourcesOwner(uint8,address)", +"3e5933fe": "removeAll(address[])", +"3e5a2024": "MyActive()", +"3e5a907f": "addSrNOfBallotPapper(uint256,uint256,uint256,uint256,uint256)", +"3e5ac28f": "toggleTransfers()", +"3e5b15e1": "addCoin(bytes4,address)", +"3e5b5e39": "addPrecommitment(address,uint256,bool)", +"3e5b7fec": "TwoPhaseAuction()", +"3e5beab9": "allowance(address)", +"3e5cee05": "issueIOU(string,uint256,address)", +"3e5d5cee": "sellPriceAtIndex(uint256)", +"3e5d901e": "autoTokenSent()", +"3e5daf02": "startRoundC()", +"3e5edb1d": "REFUND_LOCK_DURATION()", +"3e5efd92": "clearProcessedBet(uint256)", +"3e5fbedd": "NOTNCoin()", +"3e5fd9b5": "dEthereumlotteryNet(address,address,bool,address)", +"3e604f48": "registerAadharDetails(string,string,string)", +"3e6075a4": "battleCountOf()", +"3e60c83a": "acceptMediation(uint256)", +"3e62d835": "setNumberOfOutcomes(uint256)", +"3e6357a9": "UserFund(address)", +"3e650c15": "withdrawalUser()", +"3e65a153": "longMul(uint256,uint256)", +"3e675cb0": "changeMaxValueBetForEmission(uint256)", +"3e6784b8": "ATLToken()", +"3e68119b": "setDebugNumber2(uint256,uint256)", +"3e681375": "totalDropAmount()", +"3e68680a": "create(address,address)", +"3e68aa3a": "getTopWinners(uint256)", +"3e68dea3": "BaseAccountService(address,address)", +"3e693ffd": "AppSet(address)", +"3e6968b6": "getCurrentDay()", +"3e6a569a": "claimReward(address,string)", +"3e6a6a31": "beneficiarySend()", +"3e6b16d9": "setShowInterval(uint256)", +"3e6c0637": "getFirstStartableIndex()", +"3e6d4e12": "getOptional(uint40)", +"3e6d6a6b": "setAdvisorAddress(address)", +"3e6d6d0b": "removeMastercardUser(address)", +"3e6d6d26": "withdrawAllTokens(uint256)", +"3e6d9770": "investments(address,uint256)", +"3e6e0adf": "whiteListPeriod()", +"3e6e2a73": "_mintEstate(address,string)", +"3e6eaa03": "mint(uint32,address)", +"3e6f118a": "blastOff(address)", +"3e6f4160": "roundParameters(uint256)", +"3e709982": "isDefValid(uint8,uint8,uint8,uint8,uint8)", +"3e715da2": "logPromiseFulfilled(uint256)", +"3e721015": "getFunds(uint256)", +"3e72b2bb": "addMembers(address[],uint256[])", +"3e72df41": "ff(string)", +"3e76018b": "getNextMinimumBet()", +"3e7614cd": "TIER3_PRICE()", +"3e764fdb": "_getNewFloorGene(uint256)", +"3e774409": "_mint(address,address,uint256,bytes,bytes)", +"3e77dcfb": "setPercentages(uint8,uint8,uint8,uint8,uint8,uint8)", +"3e786d80": "DickheadCash()", +"3e788ba3": "getRequestState(address,address)", +"3e78afd8": "ReferrerBonusTokensTaken(address,uint256)", +"3e78cf7a": "transactionFeeMin()", +"3e798e83": "calculateUserCommission(uint256)", +"3e799335": "RefundManager()", +"3e79e4c2": "customerPolicies(address,uint256)", +"3e7b5e80": "getUserRemainingAlloc(address)", +"3e7b684d": "NBAT(address,address,address,address,address)", +"3e7bb43c": "transferKycOwnerShip(address,address)", +"3e7cb0d3": "verify(uint256,bool)", +"3e7d081a": "emitBoardClosed(uint256,bool)", +"3e7d1acc": "currentAllocationLength()", +"3e7e250e": "GetDynamicCardAmount(uint32,uint256)", +"3e7e30ba": "poolPercentage()", +"3e7e42fa": "initialCreatorAccount(uint8)", +"3e7e70a4": "tokenBuyerWallet()", +"3e7e730d": "addressToReceiverToAmountAllowed(address,address)", +"3e7f26a5": "heroIdToBuyer(uint256)", +"3e7f54a9": "updateAppInstance()", +"3e803343": "subIsSafe(uint256,uint256)", +"3e80cbc6": "adminUpdateWallet(address)", +"3e81ba66": "preBountyAdded()", +"3e81d56e": "calculateProviderFee(uint256)", +"3e82055a": "addSignature(uint256,bytes16,bytes)", +"3e82eca7": "getAddressOne(address)", +"3e83f6cd": "Nickelcoin()", +"3e83fe36": "getMyShares()", +"3e84b266": "priorityPassContractAddress()", +"3e853128": "getGasForXau(address)", +"3e85713d": "marketingReserve()", +"3e85755a": "bonusInPreSalePhase2()", +"3e859fcb": "updateCap(uint256,uint256)", +"3e8616c8": "setBullAmount(uint256)", +"3e867089": "setDelegadoDeEscuela(bytes32,bytes32,uint256)", +"3e8686cc": "getSubmission(uint256)", +"3e86a2e5": "transferToAddress(address,uint256,bool,bytes)", +"3e870d63": "subHashrate(address,uint256)", +"3e8786a1": "reclaimFund(address)", +"3e87d301": "tokenPriceInEuroCents()", +"3e8817aa": "getPaymentAmount()", +"3e88d93b": "getRecorderID(address)", +"3e89340f": "lockStatus()", +"3e8a0585": "Bidding()", +"3e8a0bc9": "lockdown()", +"3e8a76e4": "CommerceBlockToken(address)", +"3e8a9439": "proposalDestination()", +"3e8b1dd7": "claim(bytes32,uint256,uint256,uint8,bytes32,bytes32)", +"3e8be2e1": "reTweetRewardPool()", +"3e8c34e5": "cardboardUnicornTokenAddress()", +"3e8cc273": "doBlockContract()", +"3e8ce607": "successfully_closed()", +"3e8cee07": "getPOOL_edit_5()", +"3e8cfa26": "Nut(uint256,string,uint8,string)", +"3e8d6e9f": "multyTx(address[100],uint256[100])", +"3e8d97e7": "underwriteToken()", +"3e8eca23": "plusFreezingTime(uint256)", +"3e8f5b90": "setConfig(string,uint256)", +"3e8f682f": "setETHFee(uint256)", +"3e8ff43f": "converterType()", +"3e904876": "devexit()", +"3e9196b4": "NokuTokenBurner(address)", +"3e91a622": "LOCToken()", +"3e92128c": "gettruelevel(address,uint256)", +"3e92fa26": "claimComputation(bytes,bytes,uint256)", +"3e9439cf": "removeLockedWalletEntity(address,address)", +"3e9491a2": "revenue()", +"3e94c904": "collectionOf(address)", +"3e955225": "getN()", +"3e95c9b6": "MOONTRAIL()", +"3e95f06d": "_handleProductionDecrease(address,uint256)", +"3e96c107": "People(uint256,string,uint8,string)", +"3e96d28e": "setReleaseAgent()", +"3e96e868": "addRole(string)", +"3e9744da": "walletBountyAndAdvisors()", +"3e9761b4": "projectIndex(uint256)", +"3e97db0d": "changeMainWallet(address)", +"3e97ee6c": "isOwnerOfAllPlayerCards(uint256[],address)", +"3e98039a": "multiOwnerSides()", +"3e9836c6": "oraclizeGas()", +"3e98b93a": "getAvatarCount(address)", +"3e99633f": "haltIEO()", +"3e997e71": "isPeronalLock(address)", +"3e99a35e": "BitMantas()", +"3e99c395": "isValidPublicKey(uint256,uint256)", +"3e99d2c9": "Foo(string,string)", +"3e99e26a": "SellableToken(address,address,address,uint256,uint256,uint256,uint256)", +"3e9b4c24": "CNToken()", +"3e9bee1b": "getBalanceDivis(address)", +"3e9c77f9": "ListingRegistry(uint8,uint8,uint8,uint8)", +"3e9e9f26": "distributeCallback(uint256,uint256,address[])", +"3e9eb6c1": "recursive_read(uint256)", +"3e9ed7e4": "burnSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"3e9f0d52": "userOddsRound(address)", +"3e9f9664": "withdrawItem(address,uint256)", +"3ea053eb": "deactivate(address)", +"3ea0fb3e": "getCurrentPrice(uint32)", +"3ea11222": "createGame(uint256,address)", +"3ea14a4f": "escFund()", +"3ea252eb": "finalOptions()", +"3ea2cde5": "addFiatCurrencyRaised(uint256)", +"3ea376fc": "changeAdmin(address,address,bytes32[3],bytes32[3],uint8[3])", +"3ea3c2bb": "_updateFundingGoal()", +"3ea3e42f": "AgriChainRootData()", +"3ea3f6c5": "activateRegistrar()", +"3ea51dc2": "ZIRC()", +"3ea556da": "getEtherForTokens(uint256,uint8)", +"3ea5cdba": "MIN_INVESTMENT_ICO_PHASE_ONE_POUNDS()", +"3ea69d76": "setEmployee(address,bytes32,bool)", +"3ea6c986": "ltcRaised()", +"3ea75e3d": "addJobContractMessage(address,address,address,string,uint256)", +"3ea79cb1": "MSCToken()", +"3ea89fd1": "popQueue()", +"3ea97009": "initialToken()", +"3eaa7643": "eligibilityRate()", +"3eaa8128": "buyCovfefe(uint256)", +"3eaab2dc": "FabotCoin()", +"3eaaf86b": "_totalSupply()", +"3eac48a0": "getTotalVoter(address,address)", +"3eac5cac": "PayingBackContract()", +"3ead67b5": "changeContractOwner(address)", +"3eadb6db": "nextPhase()", +"3eae396f": "GodzSwapGodzEtherCompliance()", +"3eae8ac8": "SkillChainPresale(uint256,uint256,uint256,address,uint256,address,address)", +"3eaf5d9f": "tick()", +"3eaf7591": "makeVote(uint256)", +"3eaf9923": "right68(uint256)", +"3eafec21": "sellTokens(address,address,uint256)", +"3eb10ab3": "FundAccount()", +"3eb1d777": "setStage(uint256)", +"3eb1eb1a": "issuingBody()", +"3eb2a37d": "priceCreatingChannelChanged(uint256,uint256)", +"3eb2b5ad": "addTeamMember(address)", +"3eb2cb02": "totalSquareStakesByUser(address,uint256,uint256)", +"3eb34e09": "AlterContactName(bytes32,address,bytes32)", +"3eb3aaad": "_getClosingObligation(bytes32)", +"3eb51dc4": "releaseForTeamAndAdvisor(address,uint256)", +"3eb54d80": "Pele()", +"3eb578bf": "ADVISER_STAKE2()", +"3eb5caca": "setProductType(uint8,string)", +"3eb610f5": "_requestContractApprove(bytes32,address)", +"3eb76b9c": "castVote(uint256)", +"3eb78420": "mainFundAccount()", +"3eb7dbc0": "FoxTradingToken()", +"3eb96aed": "DrunkCoin()", +"3eba223c": "CopyTokens()", +"3eba9ed2": "setBooleanValue(bytes32,bool)", +"3ebb047f": "allowanceTransfer()", +"3ebb2a17": "CreateTokenToMarket(address,uint256)", +"3ebb2d6b": "instructOracleToDistribute(uint256)", +"3ebbf394": "BergCoin()", +"3ebc2ab3": "isCompromised(address)", +"3ebc457a": "closeCurrentFeePeriod()", +"3ebd6092": "checkPermission(uint8,address)", +"3ebdc754": "setDiscipleSale(uint256,uint256)", +"3ebfc934": "transferFrom(address,address,string)", +"3ebfdaaf": "Swap()", +"3ebfde04": "proceedPreIcoTransactions(address[],uint256[])", +"3ec045a6": "auditor()", +"3ec16194": "calculateShares(uint256)", +"3ec1d668": "Vendor(bytes,uint256)", +"3ec27341": "getConfigAddress()", +"3ec27c4a": "setTimeRangeGen0(uint256)", +"3ec36b99": "commitVotes(uint256[],bytes32[],uint256[],uint256[])", +"3ec3aedc": "executeSell(address,uint256,uint256)", +"3ec414c8": "editMeta(string,uint256)", +"3ec48a2e": "move()", +"3ec548b6": "initLottery(uint16,uint256,uint8,bytes32)", +"3ec6a4c4": "getContributorsCount(address)", +"3ec6dac2": "getSize(bytes32)", +"3ec862a8": "hatchEggs(address)", +"3ec8d571": "TronToken(address,address)", +"3ec8ec5a": "getFinish()", +"3eca264e": "getWithdraw(address)", +"3eca443b": "generatedTokensSale()", +"3eca48db": "BonusesAllMinted(address)", +"3ecaabca": "ownerSetEarningsRate()", +"3ecae564": "canSend(address,address,bytes32,uint256,bytes)", +"3ecafef5": "isIcoStart()", +"3ecb9884": "frozensDetail(address)", +"3ecbbf39": "list(address,address)", +"3ecbf72a": "_find(address)", +"3eccca1e": "transferAllTokens(address,address)", +"3eccd456": "initializeSale(address[5],uint256[6],uint8,bytes32,bytes32,uint256,uint256)", +"3ece9c61": "teamHoldAmount()", +"3ecf965f": "rateETH_BCDT()", +"3ed01e02": "takerDispute(uint256,uint256,uint256)", +"3ed03798": "addToStat(uint256,uint256)", +"3ed0619b": "stabilityBoardProxy()", +"3ed08dc9": "balanceOfEthFee()", +"3ed0a373": "getDepositAtIndex(uint256)", +"3ed0f52c": "setCustomBonus(address,bool,bool,address)", +"3ed10b92": "allowances()", +"3ed23f91": "BlockPayeeToken(uint256,string,string)", +"3ed28f39": "getUniCoinSize()", +"3ed2d908": "buyerTokenName()", +"3ed35855": "removePayee(address)", +"3ed38181": "setInvalid()", +"3ed3d6a6": "getthird(uint256[])", +"3ed4006b": "OwnerCashout()", +"3ed4c4c8": "phaseAddtlInfo(uint256)", +"3ed58536": "record_human_readable_blockhash()", +"3ed5d456": "finishReplayPhase(uint256)", +"3ed620a4": "updatePrices(uint256,uint256,uint256)", +"3ed66d3d": "sellMintingAddress(uint256,uint256)", +"3ed70628": "SCPSToken(uint256,string,string)", +"3ed72caf": "icoTokenAddress()", +"3ed731bc": "makeCollectibleUnavailableToSale(address,uint256,uint256,uint256)", +"3ed7530d": "amountOfPerRelease()", +"3ed8ff25": "TotalFeesReceived()", +"3ed9bc86": "initializeToken()", +"3eda009b": "rewardRound(uint256)", +"3eda062c": "updateTap(uint256)", +"3eda7b88": "contractorTransferFrom_Scoupon(address,address,uint256)", +"3edab9d0": "AuctionCanceled()", +"3edaf264": "stopBounty()", +"3edbd76e": "GetChallengeCreator(uint256)", +"3edc65d3": "recordWithdraw(address)", +"3edc69b8": "maxAbsKindness()", +"3edcd61f": "times8()", +"3edd1128": "deposit(address,uint256,bool)", +"3edd90e7": "NewOwner(address)", +"3edddc0a": "incrementWrite()", +"3edef04b": "limitPreIcoTokens()", +"3edfd954": "mint(address,uint256,uint256,uint256,string)", +"3edfe35e": "ethPriceInCents()", +"3ee066e5": "sspRegistry()", +"3ee0c627": "currentBadge()", +"3ee2dd16": "FunGame()", +"3ee39cee": "testCannotActivateBeforeDeployingANT()", +"3ee3f499": "validateHash(bytes32)", +"3ee5313f": "SetState(uint256)", +"3ee58d13": "testBurnGuyAuth()", +"3ee5f2e4": "BreakToken()", +"3ee6d933": "rndInit_()", +"3ee6de34": "work(bytes32[])", +"3ee71e85": "NortontokenERC20(uint256,string,string)", +"3ee788e1": "_updateLoveStory(bytes16,bytes32,bytes32,uint256,string)", +"3ee7ab85": "airdropUpdateToken(address[],uint256[])", +"3ee822f4": "setAllLocations(uint256[])", +"3ee8747a": "isOrganisationExits(address)", +"3ee89a63": "withcom()", +"3ee90a29": "FOUNDER_STAKE()", +"3ee9d648": "lastGameId()", +"3eea5150": "milkTotalSupply()", +"3eeafccc": "getCountryStats(uint256)", +"3eeb3235": "geCompoundTimestampsFor24Months(uint256)", +"3eebc589": "isMarketManager()", +"3eed3822": "bigPrice()", +"3eed5d17": "Cipher()", +"3eeda7d3": "deliverTokens(address,uint256,string,bool)", +"3eedabcf": "getMelonAsset()", +"3eedf7d8": "getCurrentAuctionPrices(uint128[])", +"3eee36c6": "_split(uint256,uint256,uint256)", +"3eee83f1": "addAcceptedToken(address)", +"3eeeb1c3": "fastEscape()", +"3eefe239": "mintReservedTokens()", +"3eefef7b": "testFailTransferFromSelfNonArbitrarySize()", +"3ef06b6b": "previousprice()", +"3ef0784e": "configurationGenericCrowdsale(address,uint256,uint256)", +"3ef13367": "flushTokens(address)", +"3ef14cc8": "getTotalAuctions()", +"3ef37e30": "REFUND_PERCENT()", +"3ef39571": "isRequireData()", +"3ef4691f": "MyFreeCoin(uint256,string,uint8,string)", +"3ef4c16b": "withdrawVPC0xTokens(address)", +"3ef4f4ca": "world(uint256)", +"3ef530da": "_reduceReservesFresh(uint256)", +"3ef5aee9": "maxProportion()", +"3ef5d325": "getBaseValue(uint256)", +"3ef5e445": "subtract(uint256,uint256)", +"3ef5f368": "payMultiple(uint256)", +"3ef7c687": "getExpiringUnitList()", +"3ef84fcb": "withdrawCommonCoin(uint256)", +"3ef87414": "getRevisionCount(bytes20)", +"3ef8e872": "numberOfTokensOfOwner(address)", +"3ef8ec78": "announce_numbers(uint8,uint8,uint8,uint8,uint32,bytes32)", +"3ef92150": "ICO(uint256)", +"3efa31b0": "initialAddress(address)", +"3efa8d51": "feesD()", +"3efab21b": "icoTokensIssued()", +"3efb537e": "getPastGameResults(uint256)", +"3efb760d": "nextLevel()", +"3efcad6d": "EMPR()", +"3efcd2e0": "transferPreSigned(address,uint256,uint256,uint256,uint8,bytes)", +"3efd1403": "createGame(uint8,bytes32)", +"3efe54d4": "percentWeiDividend()", +"3efe6441": "getRemainingToken()", +"3efea4d1": "buy(uint256,uint256,uint256,uint256,string,string,string)", +"3eff1ef3": "DYBToken()", +"3f001dd7": "MIC(uint256,string,string)", +"3f003d59": "removeAddressFromGrantAccess(address)", +"3f00f5aa": "HAOToken()", +"3f01dc99": "ETHFINEX_FEE()", +"3f01e642": "roundCount(uint256,uint256)", +"3f0218ac": "startThirdPhase()", +"3f021e2e": "oracalize_gaslimit()", +"3f02e4f0": "getTotalValidTk()", +"3f03aab4": "communityAddr_()", +"3f045e61": "inArray(address[],address)", +"3f047053": "songTokenExchange()", +"3f04b06d": "shareLove(address,address,uint256)", +"3f050f02": "subdomainSale()", +"3f0547bb": "changeAllowAllTransfers(bool)", +"3f056d2a": "StrongHoldTEST()", +"3f06e17c": "changeDonation(address)", +"3f073031": "addCredits()", +"3f07618d": "createDragon(address,uint256,uint256,uint256,uint256,uint240)", +"3f08882f": "assertIsWhitelisted(address)", +"3f089de9": "GameRefunded(uint256)", +"3f09ba9c": "TupleDemo()", +"3f0a0797": "exchangeContract()", +"3f0a9f65": "requiredBlockConfirmations()", +"3f0adce9": "setSmallWalletAddress(address)", +"3f0b67e9": "_addIndex(address,address)", +"3f0b70b6": "itgTokenTransfer(uint256,bool)", +"3f0cea3f": "withdrawOwner(address)", +"3f0cf183": "MockSale(uint256,uint256,address,address)", +"3f0d9ad5": "contractBalance_()", +"3f0ec70b": "RequestFactory(address)", +"3f0ed0df": "setContract(string,address)", +"3f0f42e2": "addWalletToWhitelist(address)", +"3f0f7248": "SpaCoin()", +"3f109205": "setFoundationInterface(address)", +"3f10dea6": "canUse(address,uint256)", +"3f10f08a": "nextCommonTTMTokenId3()", +"3f117b85": "setPaymentContractAddress(address)", +"3f1199e6": "buried(address)", +"3f11e43d": "newEtherdelta(address)", +"3f124f1d": "totalMintContracts()", +"3f13d339": "getTxnNum(address,uint256)", +"3f14710d": "GameEnded(address,address,uint256,uint256,uint8)", +"3f14e2db": "withdrawfund()", +"3f152d11": "Coin(address)", +"3f15457f": "ens()", +"3f174064": "crowdsalePause()", +"3f181ef2": "getTotalUniqueCards()", +"3f18400e": "owlmasterReq()", +"3f1887e9": "Gamblers_Until_Jackpot()", +"3f18acb4": "CarRoute(string)", +"3f19bfbf": "allocateLedTokens()", +"3f19d043": "getContributions(address)", +"3f1a1cac": "useSingleItem(uint256,uint256,uint256)", +"3f1a3d9e": "dropEnabled()", +"3f1ae30f": "ReverseConfirmTransaction(uint256)", +"3f1b1267": "icoSince()", +"3f1bfdee": "testFailCreateShortIdAlreadyExists()", +"3f1da980": "lastBlock_v11Hash_uint256()", +"3f1e600a": "PHASE_3_PRICE()", +"3f1f59a4": "ICO_START2()", +"3f1f8f68": "seventh_withdrawal(uint256)", +"3f202951": "SampleCrowdsale(uint256,uint256,uint256,uint256,address)", +"3f20fa9e": "requestDispute(bytes16,address,address,uint256,uint256)", +"3f2266c2": "ownerAngelCollection(address,uint256)", +"3f22b0fb": "last50plushacker()", +"3f23503d": "minBtcValue()", +"3f23a566": "mintingCap()", +"3f242990": "tokenHardcap()", +"3f24ef7c": "setGidMax(uint8)", +"3f250493": "Crowdsaled()", +"3f257776": "getN2ControlLimits(bytes32)", +"3f265ddd": "FructusToken()", +"3f266242": "getSubjectCountByAddress(address)", +"3f26c5ee": "addMilestone(uint256,uint256,uint256,uint256,string,string)", +"3f26fa01": "InvestmentPolicyChanged(bool,bool,bool,address,address)", +"3f27e9e1": "recoverAddressFromBalanceProofUpdateMessage(bytes32,bytes32,uint256,bytes32,bytes,bytes)", +"3f27f105": "batchTransferSame(address[],uint256)", +"3f2885cb": "publish(string,string,address,bytes32)", +"3f288f05": "addPubKeyHash(bytes20,uint8,bytes,bytes)", +"3f28b20e": "Bemo()", +"3f28e9fb": "createBounty(uint256)", +"3f28f24c": "claim_rest_of_tokens_and_selfdestruct()", +"3f2965f0": "registerSeller(address)", +"3f29cd27": "set(bytes12,bytes32,uint40)", +"3f2b1040": "enableTokenWithdrawals()", +"3f2c0e35": "getNumberOfRequest()", +"3f2c736a": "tokenSetBurnFeeAbs(address,address,uint256)", +"3f2cb5d4": "popEducation()", +"3f2cba2b": "airdropMVP(address[],uint256)", +"3f2cdb53": "setETHPriceLowerBound(uint256)", +"3f2e0564": "setIcoWallet(address)", +"3f2e907c": "resumeTransferToken()", +"3f2e917c": "changeLimits(uint256)", +"3f2eed3b": "publicPresale()", +"3f2f1596": "setupTreasury(address,uint256)", +"3f2f46b4": "revealRock(string)", +"3f31281a": "changeUserKey(address)", +"3f3173f3": "MyTokenyy()", +"3f31b3ac": "extCustomerPolicies(bytes32,uint256)", +"3f3246a0": "getLastBuyer()", +"3f32aa70": "removeFromWhiteList(bytes32,address)", +"3f32af65": "calculateFare(string,string)", +"3f33252d": "changeDisown(uint256)", +"3f332792": "getGiftsCounter()", +"3f34dd5c": "setVestingAmoundAndApproveCrowdsale(address,address,address)", +"3f35d033": "transferToContract(address,uint256,bytes)", +"3f36d33d": "getpotReward()", +"3f37c9d4": "servicePercentage()", +"3f384026": "setStatusBuySell(bool,bool)", +"3f392b42": "trade(address[5],uint256[11],uint8[3],bytes32[6])", +"3f3935d1": "confirmReverse(string)", +"3f395781": "Capsule(uint256,address)", +"3f3a1ed2": "alottTokensExchange(address,uint256)", +"3f3a279d": "getBetResult()", +"3f3a4966": "getVotingPower(uint256,uint256,address)", +"3f3a78d5": "rateAngelDay()", +"3f3bdc6c": "upgradeAllowance(address,address)", +"3f3c212d": "kittenTalk()", +"3f3c51c3": "Setmyadress(address)", +"3f3c594c": "TestingToken()", +"3f3cde05": "whitelistFilteringSwitch()", +"3f3d83c3": "purchasable()", +"3f3e4c11": "setMaxTotalSupply(uint256)", +"3f3edfa4": "RootCoin()", +"3f3f43a8": "setPreDGZtoDgzRate(uint256)", +"3f402dfc": "CreateGameIco(address,uint256)", +"3f40adb8": "createPetition(string,string,uint256,bool,string)", +"3f415772": "releaseExists(bytes32)", +"3f419c40": "getMessageMaxCharacters()", +"3f423afe": "DIVISOR_STAKE()", +"3f4263ef": "x(uint256)", +"3f430616": "getThirdRoundReleaseTime()", +"3f43c7cf": "open(uint256,uint256,uint256,string)", +"3f444db1": "internalDoRoll(bytes32,bytes32,uint256,uint256,uint256)", +"3f44d89f": "NigerianNairaToken()", +"3f450915": "_mateWith(uint256,uint256,uint8)", +"3f454406": "tokenEscape(address)", +"3f4628c1": "disputeLimitedReporters()", +"3f46a2ea": "DucLongToken()", +"3f478372": "newDeposit(uint256)", +"3f479562": "kingGladiatorFounder()", +"3f47e662": "decimals(uint256)", +"3f487b8b": "securityGuardLastCheckin()", +"3f48ae1a": "initInsecure(address)", +"3f493a1d": "Playforfreetoken()", +"3f497d52": "batchAirDrop(address,address,address[],uint256)", +"3f4a6484": "removeCapper(address)", +"3f4acbe8": "_teamTax(uint256,bool)", +"3f4ad13d": "LOTE(uint256,string,string)", +"3f4b1401": "releaseDragonTokens()", +"3f4ba83a": "unpause()", +"3f4be889": "callContractAddress()", +"3f4c0733": "batchTransferEtherWithSameAmount(address[],uint256)", +"3f4c89ca": "show_minimum_amount()", +"3f4d2fc2": "addConnector(address,uint32,bool)", +"3f4d97f0": "TOTAL_TEAM_TOKENS()", +"3f4dd268": "releaseTokens(uint256,uint256)", +"3f4e5ab9": "getB1()", +"3f4e6d66": "CryptoFamous(address)", +"3f4e95d7": "investorsAccounts(address)", +"3f4eb701": "updateUnderlying(string,uint256)", +"3f4f057f": "candidateBlockNumberHash()", +"3f4f070c": "newSpaceshipUpgrade(bytes1,uint8,uint256)", +"3f4f3075": "setRenewable(uint256,bool)", +"3f4f50c8": "EvtUnlock(address,uint256)", +"3f50331d": "batchTransferPaidTokens(address[],uint256[])", +"3f516018": "setCreator(address)", +"3f5174df": "numberOfEarlyPurchases()", +"3f5228c7": "fifishICO()", +"3f52c660": "TokenPerETH()", +"3f52e589": "setStartingTime(uint256)", +"3f541d08": "burnTokens(address,address)", +"3f541ffc": "exchangeEtherForHavvens()", +"3f549d87": "contributeByOracle(address,uint256)", +"3f55b895": "delegate(uint8,bytes32,bytes32)", +"3f572432": "investment(uint256,address,string,uint256)", +"3f5750c6": "distributeCoins()", +"3f576af0": "GoodDayTokens()", +"3f579f42": "executeTransaction(address,uint256,bytes)", +"3f58774b": "ecbuy(uint256)", +"3f58a043": "ceoEtherBalance()", +"3f58f8c0": "voteRuling(uint256,uint256,uint256[])", +"3f590062": "getTokenCreationTime(string)", +"3f59b1ab": "TokenImpl(string,string,uint256)", +"3f59e45a": "bincentiveLogger()", +"3f5a0bdd": "selfDestruct(address)", +"3f5a9e22": "getAmountOfTitties()", +"3f5ab2fe": "seed_eth()", +"3f5adb8e": "LIRAX()", +"3f5b7675": "periodTwo()", +"3f5bc9b6": "makeACall(address,uint256)", +"3f5c6a50": "MinimumDonation()", +"3f5cbdb6": "returnWei()", +"3f5cd055": "advisorsVesting()", +"3f5d0203": "getCreationWeiCost()", +"3f5d2b79": "CrowdsaleFinished(uint256,uint256)", +"3f5d8056": "currRound()", +"3f5e268f": "convictInitial(uint256,uint256)", +"3f5e3ec1": "changeTransactionStorage(address)", +"3f5ea068": "addLockAccount(address,uint256)", +"3f5f5217": "sellAth(uint256)", +"3f601972": "TotalToken()", +"3f606cfc": "enableAutoSeller()", +"3f60efa2": "HANDLE()", +"3f615272": "sendICO(address,uint256,address)", +"3f61dcf6": "enableTransfering()", +"3f62c084": "collectMessage(address,address,uint256)", +"3f635e30": "ethTransfer(uint256,address,uint256)", +"3f64a7ab": "devFeePercent()", +"3f64b318": "initSale(address,address,address,address)", +"3f651bab": "TOURNAMENT_ENDS()", +"3f65d97f": "removeEndorsement(bytes32,bytes32)", +"3f67364a": "PayValsToList(address[],uint256[])", +"3f67a94e": "getOffChainAddresses()", +"3f683b6a": "isStopped()", +"3f6849eb": "listedMonForMon(uint64)", +"3f686170": "freezeAll(bool)", +"3f68fde4": "removeVote(uint256)", +"3f69034f": "enableGeneration()", +"3f697ce9": "startBlock(address)", +"3f69babd": "cancelEvent(uint256)", +"3f6a2c97": "calculatePoints()", +"3f6a6792": "Bribed(uint256,uint256)", +"3f6b33c4": "ping(address,uint256,uint256)", +"3f6b5fde": "generate(address,string)", +"3f6b6f2e": "Airdrop()", +"3f6c0696": "superMint(address,uint256,uint256)", +"3f6c0c60": "isTransferNotExpired(uint256,uint256)", +"3f6c3567": "listSales(uint256)", +"3f6c4a1b": "getTeamA(uint256)", +"3f6c4cfd": "withdrawBountyAndAdvisory()", +"3f6c71c5": "edgePigmentR()", +"3f6c95fe": "increaseLotteryBalance(uint256)", +"3f6d8256": "validatorFee()", +"3f6dd911": "multisig_owner()", +"3f6ddb75": "Allocated(address,uint256,bool)", +"3f6ea2a8": "MIN_LEADER_FRAC_TOP()", +"3f6ec73a": "itemVoteUp(address,uint256)", +"3f6f7ed6": "updateEthRate(uint256)", +"3f6fa655": "resolved()", +"3f6fff4e": "closeCycle(uint256)", +"3f70c2b4": "getProductById(uint256)", +"3f720922": "setConfig(uint256,uint256,uint256,uint256,uint256)", +"3f723c62": "addRecord(string,string,string)", +"3f73365f": "getOneFree(address)", +"3f738402": "goalIncrement()", +"3f74a3b7": "MINIMUM_VESTING_PERIOD()", +"3f74a8be": "totalEthJackpotCollected()", +"3f74fecb": "DSTrueFallbackTest()", +"3f751ad0": "addTxToCustomerRegistry(address,uint256,uint256)", +"3f7525bf": "getAddressesSet()", +"3f76fbd3": "dhopakcoin()", +"3f77b560": "newDocument(bytes)", +"3f77e1e9": "testFee()", +"3f79a0a9": "NewGame(bytes32,bytes32,bytes32,bytes32,address,uint256)", +"3f7a0270": "setN(uint256)", +"3f7aea39": "getCET4ById(uint32)", +"3f7b2ea9": "testMintInvalid()", +"3f7b54f9": "DevChangeMiningReward(uint256)", +"3f7b6be8": "createProductionUnit2()", +"3f7c42a7": "setJob(address,uint256,address,string,string,uint256[],uint256,uint256,uint8[],uint8,bool,address[])", +"3f7ca612": "FMWL()", +"3f7d3969": "fetchAllCandidates()", +"3f7d5361": "changeSafetyLimit(uint256)", +"3f7d72d8": "rSetE(address)", +"3f7da39a": "whitelisterAddress()", +"3f7e2120": "CloseGift()", +"3f7eabc9": "setRobot(address)", +"3f7eb0fe": "func_1()", +"3f7f2eda": "Order(address,uint256,address,uint256,uint256,uint256,address)", +"3f7f4f17": "getUserAccountBalance(address)", +"3f7f6d23": "BuyWithBonus(address,address,uint256,uint256,uint256)", +"3f7f8b24": "getAllocationProposal(uint256)", +"3f7f9faf": "attachTicker(address)", +"3f80135f": "test_threeInvalidEqAddress()", +"3f801f91": "proxyAssert(address,uint8,bytes)", +"3f802220": "ProposalAdded(uint256)", +"3f802ca0": "singleValueBatchTransfer(address[],uint256)", +"3f806783": "potSizeChanged(uint256)", +"3f807199": "changeParticipants(address[])", +"3f80a82b": "getbuyPrice()", +"3f80db69": "_totalTokenSold()", +"3f811b80": "createContract(bytes32)", +"3f8126d5": "GetStatus(uint256)", +"3f817449": "tokenSmartcontract()", +"3f81e4be": "lastBlock_a9Hash_uint256()", +"3f82065b": "setDiscipleVend(uint256,uint256)", +"3f82e2c6": "PUBLIC_RESOLVER_NODE()", +"3f836dcf": "addAsAddress(bytes32,address)", +"3f83acff": "get_contract(bytes32)", +"3f8416fb": "doUpgrade(address)", +"3f85be9c": "calcChanges(uint256,uint256,uint256)", +"3f85f916": "founderContract()", +"3f862a19": "remainUserTokenBalance(address)", +"3f87f870": "checkRequest(string,string,string)", +"3f883dfb": "transferExternalValue(bytes32[])", +"3f887fad": "buyShares(uint256,uint8,uint256,uint256)", +"3f89b09c": "update_fee(uint256,uint256)", +"3f8a04aa": "getCurrentUserPromoBonus()", +"3f8a4c13": "previousSnailPot()", +"3f8a92b3": "setmangeruser(address,bool)", +"3f8ae6d9": "GetUserExpire(address)", +"3f8af40c": "amendedEarlyPurchases(uint256)", +"3f8b0a1d": "getIssuedBy()", +"3f8c2582": "ethSale(address)", +"3f8c75a6": "_createLicense(uint256,uint256,address,uint256,address)", +"3f8cfba6": "lifeVestingStages()", +"3f8d9568": "buyins(address)", +"3f8d95bd": "_delete(address)", +"3f8df98d": "calculateMyReward(uint256)", +"3f8e0298": "parseTicket(uint256)", +"3f8f0714": "SimpleLife()", +"3f900962": "manualRaffle()", +"3f914aef": "setWhitelistAddress(address,bool)", +"3f923f9d": "NIZIGEN()", +"3f92edaf": "getMaxDropsPerTx()", +"3f935379": "_isSingleFlag(uint256)", +"3f94904a": "bankValReserve()", +"3f95c0c2": "timeboundTest(address,uint256,uint256)", +"3f9628e8": "addOldWithdrawals(address[],uint256[])", +"3f966082": "exchangesOwner()", +"3f96f3a3": "toInt()", +"3f97b106": "GetSuspend()", +"3f97d995": "VALIDITY()", +"3f982b74": "createInitialAllotment(string,uint256)", +"3f9942ff": "canceled()", +"3f9945d2": "ByThePeople(address)", +"3f99a12b": "saleEndBlock()", +"3f99fa54": "addInitialMember(address,uint256)", +"3f9a3886": "OWNERS_ALLOCATED_TOKENS()", +"3f9af464": "AK4Token()", +"3f9b250a": "getDocument(uint256)", +"3f9b8fdc": "updateAllowedTransfers(address,address,bool)", +"3f9c7822": "print(int256,uint256)", +"3f9cbd65": "mainSaleTokenWallet()", +"3f9ce517": "getRefAddress()", +"3f9d0954": "FarChainToken()", +"3f9d95ed": "addAcceptedToken(address,uint256,uint256)", +"3f9da856": "_addFreezer(address)", +"3f9e0eb7": "_getDaysInMonth(uint256,uint256)", +"3f9e23e5": "migrationFinished()", +"3f9e3494": "ReleaseSupply(address,uint256,uint256)", +"3f9e50fd": "LitToken()", +"3f9e9a37": "getBonusesAmount(uint256)", +"3f9e9df2": "removeInWhiteList(address)", +"3f9f5b68": "setPreviousID(uint256,int256)", +"3f9f7779": "BitCronus1()", +"3fa10e0a": "CountryJackpot()", +"3fa1436e": "updateTokenSaleState()", +"3fa1930d": "getPlayerBet(uint256)", +"3fa19804": "updateTeller(int8,bytes16,int8,int16,bool)", +"3fa21806": "lastHash()", +"3fa2dd2a": "getStage2Cap()", +"3fa2fe7a": "getActiveUserCount()", +"3fa40f94": "mintTokens(address[])", +"3fa4687b": "bytesToAddres(bytes)", +"3fa4ed06": "updateValue(bytes32,uint256)", +"3fa4f245": "value()", +"3fa54ed8": "setTileTypeAt(uint16,uint16,uint8,uint16)", +"3fa58b61": "Whitelistable()", +"3fa6010f": "setGallerySixPrice(uint256)", +"3fa615b0": "minCap()", +"3fa6497f": "AdminAddFunds()", +"3fa68836": "removeParticipant(uint8)", +"3fa69faa": "testtoken()", +"3fa6c7ca": "findLaptopUsage(address,address)", +"3fa8543a": "IMEXToken()", +"3fa8a7b8": "releaseTokenOwnership(address)", +"3fa911ae": "refundAllowed()", +"3fa9fcf8": "createPlayer()", +"3faaef28": "BurnFSATokens(uint256)", +"3faaffdb": "SCToken()", +"3fab8fb0": "EatToken()", +"3fabf8c0": "developmentAuditPromotionTokensPercent()", +"3fac68d5": "payOff()", +"3facd57c": "registerBill(uint256,address,address,uint256,uint256,uint256)", +"3facdfb6": "gatFund()", +"3fad1834": "getRequestCount()", +"3fad9ae0": "question()", +"3fadbd3e": "minTokenPurchase()", +"3fadc388": "current_plot_price()", +"3fae1928": "timenow()", +"3faed436": "setXTVTokenAirdropStatus(bool)", +"3faf511f": "vouch(bytes32)", +"3faff9d5": "purchaseTokens(uint256,address,bool)", +"3fb0b2c9": "CancelRoundAndRefundAll()", +"3fb18aec": "contains(string,string)", +"3fb1ab52": "_getUserSupportForTeamInTournament(uint256,uint256)", +"3fb1fed4": "startingExchangePrice()", +"3fb23166": "TeamVesting()", +"3fb23865": "fundingStatus()", +"3fb27b85": "seal()", +"3fb326ba": "MAX_ETHER_CONTR()", +"3fb39b8b": "rewardBeneficiary(address,uint256)", +"3fb3bec2": "deactivateTime()", +"3fb3ec28": "delegatedAmountsByDelegate(address)", +"3fb48c4c": "AAACoin()", +"3fb51a76": "frozenDaysforTestExchange()", +"3fb58819": "getMinGasPrice()", +"3fb5c1cb": "setNumber(uint256)", +"3fb64e75": "gameInProgress()", +"3fb655a3": "CPLTokenDeposit()", +"3fb8b692": "affiliateAddresses(uint256)", +"3fb92b10": "gameNbr()", +"3fb97857": "getCouponMulFactor()", +"3fbb539d": "scheduleCall(address,bytes,uint256,bytes)", +"3fbb8f98": "drawTertiaryDWinners(uint256)", +"3fbc2a1e": "preSaleTLYperETH()", +"3fbc6345": "Token_Remaining()", +"3fbd40fd": "ProcessDraw()", +"3fbda23f": "CharityToken()", +"3fbfdefc": "checkMyAging(address)", +"3fbffca6": "getTeamB(uint256)", +"3fbffcef": "bidsCount()", +"3fc0234d": "train1(uint256,uint256)", +"3fc15f15": "mainToken()", +"3fc22c51": "buyPreSaleTokens(address)", +"3fc3e53f": "Funding()", +"3fc44ab3": "setCustomEvent(uint256,uint256,bool,string,uint256)", +"3fc499b2": "ihomekey()", +"3fc4caa1": "levelThreeBonus(uint256)", +"3fc4e866": "RudiantoToken()", +"3fc50b92": "agingTime()", +"3fc523c7": "test_fourInvalidEqUint()", +"3fc5b69b": "set_sale_arbits_per_ether(uint256)", +"3fc5ed50": "_openGameResult(uint256,string)", +"3fc6a97a": "sellNow()", +"3fc6bc94": "payDAO()", +"3fc6d75a": "crowdsaleTokenPrice()", +"3fc7e3d5": "volumeType3()", +"3fc821ee": "getStackholderConfirmationCount(uint256)", +"3fc86d32": "newInvestor(uint16,address,uint256,uint256)", +"3fc8b029": "testSaleHasOwnerOnCreation()", +"3fc8ca58": "JetherToken()", +"3fc8cef3": "weth()", +"3fc90f7c": "addresses1(uint256)", +"3fc98bd5": "robotInfo(uint256)", +"3fcb21d3": "ecoFundingSupply()", +"3fcce626": "setDeprecated(address,string,string)", +"3fcd06fa": "checkMinimalGoal()", +"3fcdd2d3": "transfertoken(uint256,address)", +"3fce1b82": "addAnimal(uint8)", +"3fcead58": "TKRPToken()", +"3fd01a77": "is_purchase_allowed()", +"3fd0f727": "isIcoTrue()", +"3fd1f232": "LookAtAllTheseTastyFees()", +"3fd2300d": "curveIntegral(uint256)", +"3fd2799d": "newShortPosition(address[7],uint256[4],uint32[3])", +"3fd29369": "offer(string,string,string,uint256)", +"3fd3370a": "FooTime()", +"3fd3a371": "stageThreeEnd()", +"3fd3c997": "assetProxies(bytes4)", +"3fd68ca7": "lastCheckedToken()", +"3fd6b1db": "InoCoin(uint256,string,string)", +"3fd76a98": "MANAGEMENT_LOCKED_ALLOC()", +"3fd8b02f": "lockPeriod()", +"3fd8cc4e": "isPermitted(address)", +"3fd8cd9b": "ETHReturn(address,uint256)", +"3fd94686": "changeEligibleDonkeys(uint256)", +"3fd97621": "testTransferHandlesTooLargeRequest()", +"3fd9c56d": "checkDoubledProfit(uint256,uint256)", +"3fda1281": "get_keys()", +"3fda417a": "LADCoin(uint256,string,string)", +"3fda5389": "fill(uint256)", +"3fda926e": "addGame(address,string)", +"3fdb03ca": "getselfaddress()", +"3fdb3628": "aggregateCDPValues(bytes32)", +"3fdb372a": "buildWinery()", +"3fdb571f": "reGround(uint256)", +"3fdb705b": "platformTokenSupply()", +"3fdb8cbd": "dt()", +"3fdbb6c7": "RATE_THRESHOLD_PERCENTAGE()", +"3fdccd8d": "setDCNForGas(uint256)", +"3fdcef0d": "PRICE_BEFORE_SOFTCAP()", +"3fdcefe0": "doSelfdestruct()", +"3fddd97d": "XCoin(uint256,string,string)", +"3fdddf01": "EGGS_TO_HATCH_1PACIFIST()", +"3fdde728": "MTP_PER_ETH_SALE()", +"3fddee64": "isAgency(address)", +"3fded490": "referralDiscountPercentage(address)", +"3fdeef90": "fstSold()", +"3fe0522c": "setTravelCore(address)", +"3fe14e03": "setAuthor(string)", +"3fe3347a": "assetType()", +"3fe3df76": "leaf_from_address_and_num_tokens(address,uint256)", +"3fe3f427": "depositTokens(address,address,uint256,uint256,bytes32)", +"3fe43020": "decreaseRepAvailableForExtraBondPayouts(uint256)", +"3fe43822": "Collect(uint256)", +"3fe75b8d": "Unity()", +"3fe80d6e": "begin(uint256)", +"3fe97ead": "left49(uint256)", +"3fe9bf0e": "createContract(bytes,uint256)", +"3fe9f2a4": "EventCentsPerEtherChanged(uint256,uint256)", +"3fe9f2b2": "totalPublicFundingSupply()", +"3fea1c2b": "getIHand(uint32)", +"3fea2313": "ProposalAdded(address,address,uint256)", +"3feab517": "DreamCoin(uint256,string,uint8,string)", +"3feafa87": "NucleusVisionToken_ASTER8793()", +"3feb1bd8": "transfer(bytes32,address,uint256)", +"3feb4f83": "BankeraToken(uint256,uint64)", +"3feb5f2b": "investors(uint256)", +"3febb070": "backlogAmount()", +"3febe823": "ClapClapToken()", +"3fec0561": "addclip(address)", +"3fec156b": "timeLockTeam(address)", +"3fec1a75": "setIcoDiscount(uint256)", +"3fec4a4c": "queryjingzhi(uint256,string)", +"3fec91a4": "addProposal(uint256)", +"3fecde21": "setTilePrice(uint8,uint256,address)", +"3feced03": "minAmountWei()", +"3fed491f": "testStoreBalanceAfterCheckout()", +"3fedcc31": "transfer(uint256,address,address,address,uint256,bytes,bytes)", +"3fee28b1": "logEthTx(bytes32)", +"3fefc25d": "getFundByManager(address)", +"3fefdb01": "setStageGenomes(uint8,string,string,string,string,string)", +"3feff510": "showMainERC20()", +"3feff76d": "tokenaddress()", +"3ff00ba5": "airdropMinting(address[],uint256[])", +"3ff0a1e5": "FoundToken()", +"3ff0ab0b": "updateUserDetails(bytes32)", +"3ff11c8b": "right85(uint256)", +"3ff1a578": "IsCheckNeeded(uint256,uint256)", +"3ff1d68f": "_totalXT()", +"3ff1dcf6": "PermianICO()", +"3ff1e05b": "viewBalance()", +"3ff20c8a": "setPause(uint8)", +"3ff26c01": "catches(address)", +"3ff33185": "newCaller(address)", +"3ff42b92": "marketingAddr()", +"3ff4d491": "checkFile(bytes32)", +"3ff5481d": "cancelSellBlock(uint256,uint256)", +"3ff54c71": "issueTokens(address)", +"3ff66381": "ACCC()", +"3ff69113": "myEntityCount()", +"3ff7f21c": "mulFactor()", +"3ff8c954": "addAnimals(uint8)", +"3ff8da5f": "recipient3()", +"3ff98455": "set_participant(address,address,uint256,uint256,uint256,bool,uint8)", +"3ff9a877": "makeXID(uint256)", +"3ffa274a": "transfersAllowedTo(address)", +"3ffb8f27": "changeMinter(address,int256,address)", +"3ffbd47f": "register(string,string)", +"3ffc2832": "_buyIcsTokens(address,uint256)", +"3ffc813f": "toCompare(uint256,uint256)", +"3ffd2798": "distributeAdviserBounty(address,uint256,bool)", +"3ffdabda": "poi_token()", +"3ffe5eb7": "claimWork(uint256,uint256[2],bytes32)", +"3fffebbd": "setBonusUser(address)", +"400002c4": "modifyOpenStatus(bool)", +"4000164d": "getClaimData2(uint256)", +"4000601f": "sellStakes(address,address,uint256,uint256)", +"4000aea0": "transferAndCall(address,uint256,bytes)", +"4000d5c3": "BACTest1Token(uint256,string,uint8,string)", +"4001261e": "activeTier()", +"40015d99": "getProviderInfo(uint256)", +"4001cee6": "getPeerOwnership(address)", +"4001e364": "SendEthOff()", +"40026c87": "getSubcourt(uint96)", +"4002d3fd": "LargeFunction()", +"4002eda6": "nextRoundId()", +"4002f0b0": "CheckCourse(uint256)", +"40032d8d": "checking(string,uint8,bytes32,bytes32)", +"400351cb": "applyForCandidate(string,uint256,string,string,string,uint256,bool)", +"4004b6da": "getAmbassador(address)", +"40058f61": "TIER2()", +"40066733": "getTotalVotersCount()", +"40067c91": "VoteFactory()", +"4006ccc5": "exchangeRatio()", +"400718ea": "expressBuyNumSec(uint256,uint256[],uint256[])", +"40079df0": "getDividendIndex(uint256,int256)", +"40086158": "calculateHash()", +"40086aa0": "directDebit(address,address)", +"400a44b2": "EE(uint256,string,uint8,string)", +"400a4deb": "sendPresaleTokens()", +"400aaab7": "CTOC()", +"400aae08": "isInCurrentGeneration(address)", +"400adee3": "releaseByCount(address,uint256)", +"400b56e5": "setReg2(uint256)", +"400b8bf8": "releaseMintTokens()", +"400ba069": "calculateFee(uint256,address)", +"400bb308": "SimpleTGE(address,uint256,uint256,uint256,uint256)", +"400bbbd8": "rebalanceGetTokensToSellAndBuy()", +"400d1f45": "dtGetEthBalance(address)", +"400e3949": "numProposals()", +"400eb4f5": "ParaType()", +"400ee783": "TOKENS_LOCKED_1Y_TOTAL()", +"400f7a1e": "getPairInfo(address,address)", +"400ff9a4": "BuyGold()", +"4010a018": "fundAvailable(address)", +"40111f6d": "RESERVED_TOKENS_BACE_TEAM()", +"40117f50": "CanalToken()", +"4011baf9": "MARKETING_POOL_TOKENS()", +"401214a7": "updateParams(uint256,uint256,uint256,uint256,uint256)", +"40128db3": "registerAsDelegate(bytes32)", +"40129a40": "updateAddress(bytes32,address)", +"4012e02e": "Info()", +"401356f1": "Salt()", +"40135913": "releaseImpl(uint256)", +"4014c1c7": "changeMutagen2FaceContract(address)", +"4015e83b": "renExTokensContract()", +"401611ed": "acceptEndorsement(bytes32,bytes32)", +"4016535a": "parseBlock(bytes,uint256)", +"4016e969": "allowOwner()", +"4018e263": "stageTwoCap()", +"40193883": "goal()", +"40193d17": "getPongvalConstant()", +"40194596": "RealBloq()", +"4019fc54": "masterTokenBalanceHolder()", +"401b57b5": "transferLockedToken(uint256)", +"401bd3fe": "distributeEth(address[],uint256[])", +"401c3ba1": "LogClaimRefund(address,uint256)", +"401d7175": "_buyShip(uint256,address)", +"401dc09f": "setGeneSynthesisAddress(address,address)", +"401e3367": "transferFrom(address,address,uint256,bytes32)", +"401e77de": "GameCreated(bytes32,address,string,string,uint16,uint64)", +"401f2be5": "collectRemainingFunds()", +"40202f9d": "LogTransaction(address,uint256)", +"4021581a": "dollarBalance(address)", +"40217452": "ProdBToken()", +"40217786": "setRatePerOneEther(uint256)", +"4021d93c": "Alibabacoin()", +"40220b03": "previousVersion(bytes32,bytes32)", +"40222b64": "allocationsIndex(uint256)", +"40229e14": "B_Com()", +"4023da38": "Bacini(uint256,string,uint8,string)", +"40243ecd": "SimplePaymentChannel(address,uint256)", +"402456c0": "bank1Val()", +"4024a33e": "stageBonusPercentage(uint256)", +"4024db80": "license(bytes32)", +"4024eb2a": "approveAndCallN(address,uint256,uint256)", +"4025005a": "SmartIdentity()", +"4025b22d": "getShip(uint256)", +"4025b293": "redeemAllOutcomes(bytes32,uint256)", +"4025b5a8": "ownerUpdateContractBalance(uint256)", +"40267e53": "updateWhitelistBatch(address[],uint8)", +"4026b261": "PlatoToken()", +"4026c101": "deathFactor_iii()", +"4026eb92": "endround()", +"4027522c": "DanetonToken()", +"40275f73": "addMapping(string)", +"40275f85": "getPersonalDepositAddress(address)", +"40277604": "collectedFeesInTwei()", +"40278124": "setListedTime(uint256)", +"4027b475": "MasterCardEscrow()", +"4027d4d8": "spendFromSwap(bytes32,uint256,address)", +"4028354b": "PlaceADiceBet(uint8)", +"40285ad5": "setfees(uint256)", +"4028db79": "isFrozenAccount(address)", +"402914f5": "claimable(address)", +"402962bc": "deleteAddressesFromWhitelist(address[])", +"4029a3ce": "mintMany(address[],uint256[])", +"402a1533": "angelAmountRemaining()", +"402b2bca": "IcoStartDate()", +"402bf0ab": "_delHolder(address)", +"402c5644": "XNON()", +"402c569c": "unlockBonusTokensClaim()", +"402caccd": "RANGESTART_6()", +"402d1c9c": "CONFIG_MAX_EXPOSURE_MUL()", +"402d5f2e": "unlockTokenPriceChange()", +"402d8883": "repay()", +"402e46b9": "finito()", +"402e6230": "getTotalGambles()", +"402e912f": "issuedInsurance()", +"402eb694": "reliabilityPercentage()", +"40307cdd": "setCOMMUNITY_POOL_ADDR(address)", +"4030bc19": "sendRTB(address,uint256)", +"4030ddc0": "blockVContractAddr()", +"4031f60d": "INMCOIN()", +"40326686": "paymentsFinished(uint256)", +"4032b72b": "addKeeper(address)", +"4033236e": "getProofOfStakeReward(address,address)", +"4033c268": "isFullInvest(address,bytes5)", +"4033cd77": "applyForCertification(string,string,string,uint256,bool)", +"403446bd": "getPlayersFibokens()", +"4034af00": "setWhitelistInternal(address,bool)", +"4034b817": "loadVersion(address)", +"4034cfed": "fundWallet1()", +"403575f7": "setMaxMessagesTop(int32)", +"4035d16a": "createPromoCovfefe(address,string,string,uint16,uint256)", +"403639d5": "StartSale(address,uint256,uint256,address,address,uint256,uint256,uint256)", +"40365852": "roundStart()", +"4036778f": "reveal(uint256,bytes32)", +"4036ab78": "getType(uint256)", +"4036ff30": "changeHouseCutPercentage(uint256)", +"403911a6": "tokenSaleStart()", +"40394dcc": "freezeAccountByTime(address,uint256)", +"403988c6": "setCustodianName(address,bytes32)", +"403a0a78": "placeBet(uint256,uint256,uint256,uint256,bytes32,bytes32,uint256)", +"403a734a": "MMMbCoin(uint256)", +"403a8f53": "registerForRaffle2()", +"403abbc7": "updateFirstActiveGamble()", +"403b0cfd": "LogErr(uint256)", +"403b3757": "getValueTip(uint256)", +"403b7d9b": "secondRoundICOEnd()", +"403bb94e": "StatsEthereumRaised()", +"403c617e": "Hydrogen()", +"403c9fa8": "getPot()", +"403d8a6a": "initialMartialTimes()", +"403dca55": "totalIssuedSynths(bytes4)", +"403de107": "executeDecision(uint256)", +"403e73ea": "_DemSinhVienDat()", +"403f6cff": "putInWinnerPool(uint256)", +"403fbf54": "initiateEthUsdOracleUpdate(address)", +"40400fa7": "getBurnedItemCount()", +"404239f6": "validateLegalRate(uint256,uint256,bool)", +"40426fb0": "stopIssuing(uint256)", +"40429946": "oracleRequest(address,uint256,bytes32,address,bytes4,uint256,uint256,bytes)", +"4042b66f": "weiRaised()", +"40440891": "Donate_some_amount_and_save_your_stake_rewards(uint256)", +"40441eec": "balance2()", +"40445a4f": "numTiers()", +"4044856a": "preIcoEthers()", +"4044e8ec": "cancelOrderWithPayer(string,address)", +"4045c846": "setAccreditationActive(bytes32,bytes32,bool)", +"404635db": "_canBreedViaAuction(uint256,uint256)", +"404704b9": "sendBounty(address,uint256)", +"40477126": "exchangeTokens(uint256)", +"404823d1": "wagerPool()", +"40482475": "startTokenSwap()", +"4048c449": "getParent(bytes32)", +"40490a90": "getMultiplier()", +"40496aef": "SecuredWithRoles(string,address)", +"404983fb": "addsm(uint256,uint256)", +"40499ae8": "approvedTill()", +"404a9272": "promoEndTime()", +"404ae80c": "_randomCardSetIndex(uint256,uint256)", +"404cbffb": "entityList(uint256)", +"404cf932": "mintStart3()", +"404d0e3e": "gen0CreationLimit()", +"404ed1fa": "_founder_two()", +"404ef602": "disapproveToSell(uint256)", +"404efc53": "left26(uint256)", +"404f7d66": "challengeExit(uint256,uint256,uint256,bytes,bytes)", +"404f8dc8": "KRW_Omnidollar()", +"404fdfdf": "_setTempHeroPower()", +"4050a394": "getWishName(uint256)", +"40510399": "miningKing()", +"40512dcc": "TotalDividendsPerShare()", +"405136fa": "multiSendEth()", +"40517083": "dig(uint256)", +"4051ddac": "getSummary()", +"4051ed26": "BONUS_SLAB()", +"40520f85": "tokenToEtherRate()", +"40523946": "spectreTeam()", +"40528f98": "ownerUnlock(address,uint256)", +"4052c02a": "ProToken(uint256,string,uint8,string)", +"405353b5": "NPToken()", +"4053873c": "_safeTransferTkn(address,address,uint256)", +"4053c797": "save(bytes32)", +"40543538": "get_asset_events_count(bytes32)", +"4054834a": "refferedBy()", +"4054f5de": "EthVentures3()", +"40556191": "getCrowdsaleWhitelist()", +"40557cf1": "saleRate()", +"40557e87": "totalBondSupply_BEAR()", +"405665fb": "isMeInWhiteList()", +"4056675e": "transferTokenOwnership()", +"4056f8a8": "minimumTokens()", +"4056fe06": "MAX_GOAL_EBC()", +"405710a8": "sentTokensToCompany()", +"40582f13": "getWeiRaised()", +"405871e5": "SealPrivateCrowdsale()", +"4059240c": "intervalNow()", +"405a66da": "claimOtherTokens(address)", +"405abb41": "updateRate(uint256,uint256)", +"405b8816": "testIsContractZero()", +"405bd7bb": "getCurrentNumberOfVoters()", +"405c649c": "timeLeft(address)", +"405c6f6e": "addDelegate(string)", +"405cae3b": "LOG_SpinExecuted(bytes32,address,uint256,uint256,uint256)", +"405cb7f6": "KimJCoin()", +"405d1c32": "_getVATToPay(uint256,uint256,address)", +"405d3adf": "exchange(bytes4,uint256,bytes4,address)", +"405dd87c": "EAT()", +"405df338": "start_PREICO()", +"405f63e7": "MANHATTANPROXY9THCOLAVE()", +"405f8006": "BlocToken()", +"405fea2f": "setTokenAudit(address,address,address,address)", +"4060d9f5": "isCarSpecial(uint256)", +"40621412": "BetexICO(uint256,uint256,uint256,address,address,address)", +"4063d563": "advertise(address)", +"406499d2": "Redhorse()", +"40650c91": "MIN_CONTRIBUTION()", +"40652435": "BURENCY()", +"40654e14": "balanceOfEth(address)", +"40656963": "contribute(bool)", +"40664496": "getTransferFee(address,address,uint256)", +"4066fdea": "feeProvider()", +"4067ffda": "transactionsOnForHolder(address)", +"406838b3": "etoken2()", +"40684172": "getICORaisedAmount()", +"406843ee": "recommendProportion()", +"4068665d": "TokenVesting(address,uint256,uint256,uint256,bool,address)", +"40695363": "floor()", +"40695625": "testRetractLatestRevision()", +"40698729": "withdrawERC20s(address,uint256)", +"4069925a": "releaseVested(address)", +"4069de8b": "MultiSender(address,address)", +"406a0e61": "VOLUME_50()", +"406a1180": "FATRANSOM()", +"406a318e": "getCitationRecordsLength(bytes32)", +"406a6f60": "attachToken(address)", +"406af848": "ArenplayToken()", +"406b0593": "tokenHoldersByIndex()", +"406b9394": "level0(address,bytes32,uint256)", +"406c22d3": "getLocalNodeReputation(address)", +"406c52d5": "changeElectorate(address)", +"406c5590": "FILO()", +"406c6633": "moveToNextCeiling()", +"406c92b5": "PRIVATE_SALE_MAX_ETHER()", +"406d7e98": "isAllowingTransfers()", +"406d81c7": "safeSendFunds(address,uint256)", +"406f1d22": "crowdSaleApprove(address,uint256)", +"406f390c": "_unsafeCall(address,uint256)", +"407001c6": "TruSale(uint256,uint256,address,address)", +"4070372d": "earlyInvestorsMintedTokens()", +"40710587": "usersCanSell(bool)", +"407167b6": "cantEntidades()", +"40716fc7": "DunderBet()", +"4071f89b": "payCharity()", +"40722e3e": "getNameReaderId(bytes32)", +"407235ba": "LogStop()", +"407255b5": "getWhitelistByIndex(uint256,address)", +"407299ba": "getWarriors(uint32[])", +"4072eee2": "getTopic(address,uint256)", +"4073002e": "AssetCollectionNum()", +"40731c24": "getPost(uint256)", +"40732c89": "makeDeposit()", +"40734387": "termination()", +"407456d1": "fundsOf()", +"407489ff": "concat_nodes(address[])", +"4074c648": "createPromoCollectibleWithMining(uint256,address,uint256,uint256,uint256,uint256)", +"407532bb": "presaleFundingTargetInEther()", +"40753a76": "addSupply(uint256)", +"40754714": "blockClient(address)", +"407617e5": "updateAmountIncrease(uint256)", +"4076a248": "BetPower()", +"40773279": "pay_Bounty(address,uint256)", +"407787e6": "Division(uint256,uint256)", +"4077aa14": "coreStaffAmount()", +"4077aaf8": "totalBountyTokens()", +"4077ef5d": "getMiniPoolEdit_4()", +"40784ebd": "slashInvalidUsername(string,uint256,uint256)", +"40786dec": "mint(bytes32,uint256,bytes32)", +"4078fca8": "feeETH()", +"40799f4c": "currentDayRate10000()", +"407a5c92": "getAdminLogN()", +"407a6727": "totalVIP()", +"407b899b": "returnInt64(int64)", +"407c554a": "getTSTTokenAddress()", +"407ca6f8": "BsktToken(address[],uint256[],uint256,string,string)", +"407cba67": "buyKNOW()", +"407cfe5e": "get_all_players()", +"407d0cd0": "addGame(string,uint256,bytes32[])", +"407d1a0c": "unstoreHorsey(uint256)", +"407d2a67": "_figthCommander(address)", +"407d552a": "jackpotTokenWinRewardRate()", +"407e5e5d": "newVoting(bytes,string)", +"407e9588": "rejectMintRequest(uint256,string)", +"407e9e2c": "setcommissionCompany(uint256)", +"407ea214": "getPortion(uint256,address)", +"407ed2e2": "ComputeSell(uint256)", +"407f56e5": "HEAL()", +"407f8001": "secondsPerPeriod()", +"407fb687": "exchangeEtherForNomins()", +"407fc2e8": "eggsSold()", +"407fcc31": "tokenPriceUSD()", +"407fce7b": "left12(uint256)", +"4080277f": "guhb(address)", +"408056e4": "weiMinInvestment()", +"408057c4": "getStockCount(address)", +"40806f7c": "getAvailableFees()", +"40807049": "transferManyLands(uint256,uint256[],address)", +"40809acd": "stake(uint256,uint256,address,address)", +"40809f9d": "calcEma(uint256,uint256,uint32,uint256)", +"4080c884": "XstarToken()", +"40811e90": "transferDataAuthority(address)", +"4081c065": "massGrant(address[])", +"4081d916": "checkPlayerExists(address)", +"408275bb": "transferToVault(bytes32,address,address,uint256)", +"40828698": "s(address,address,uint256)", +"4082b499": "totalNumberOfPurchases()", +"4082defb": "isBasicAccount(address)", +"408318ae": "addAllowCnsContract(bytes32,address,bytes32)", +"4083c555": "Oasis(uint256,string,uint8,string)", +"4083cdbb": "changeTokensLimit(uint256)", +"4083e2af": "getFinalRoundPoints(uint160)", +"4083e935": "transferEthersInternal()", +"40844a8d": "safeDeduct(uint256,uint256)", +"40848af5": "markMyWord(bytes32,uint32)", +"4084c3ab": "finalizedBlock()", +"40857e02": "create(address,address,uint256,bytes32,int256)", +"4086b620": "sweepsCreationTime()", +"408760b8": "setAngelLastVsBattleTime(uint64)", +"40876f6e": "getMaxMakerAmount(address,address,bytes)", +"4087908f": "RicoToken()", +"40884c52": "getOracles()", +"40890bc2": "getCurrentProvider()", +"408938d0": "testUpdatePackageDb()", +"4089462d": "registerPackage(bytes32,string)", +"40896550": "bountyTotal()", +"4089b170": "totalPayouts()", +"4089d22a": "buyDepo(address)", +"408a2ac9": "addNewSupplier(address,address,uint256)", +"408a8094": "releaseTeamTokensAfter24Months()", +"408aee81": "removeVendorByAddress(address)", +"408b9945": "getBuyerNumber()", +"408bcbda": "getBalancesLength()", +"408bf4c3": "getAllCompanies()", +"408c1932": "distributeDisputeFunds(address,address,address,address,uint8,bool,address,uint256,uint256,uint8)", +"408cfe24": "iToken()", +"408d407d": "getClaimData(uint256,uint256,uint256)", +"408d5773": "createContractCovfefe(string,string,uint16)", +"408d947e": "SmartToken(string,string)", +"408d9e35": "ExecutorChanged(address)", +"408e097c": "createDestructibleCloneToken(address,uint256,string,uint8,string,bool)", +"408e2727": "votingActive()", +"408e2eb4": "ico2Tokens()", +"408ee7fe": "addAlerter(address)", +"408fef2e": "requiredMessageLength()", +"40901b08": "p_setLimitedReferralsMode(bool)", +"40908298": "allowedAddress(address)", +"4090cb64": "getWToken()", +"4090e696": "GetMinCost(uint256,uint256,uint256)", +"4091adf5": "onlyOwnerGetCompanyWallet()", +"4091ca4c": "gettopuser(address)", +"4091f4c6": "refreshMonarchyGames()", +"409242fc": "citation(uint256)", +"4092a611": "upVote(bytes12,bytes12)", +"4092acdd": "tokenFulfillmentDeposit(address[2],uint256[8],uint8,bytes32[2])", +"4092e2c2": "addMember(bytes32,address)", +"409315ce": "executePure()", +"4093b49c": "votes_for()", +"4094ac75": "ProofOfWeakHandsClassic()", +"4094ef5e": "addDataRequest(string)", +"40953102": "scheduleCall(address,uint256,bytes,uint256,uint256,uint8,uint256)", +"40954254": "addPublicSalesSpecialUser(address)", +"4095fbba": "SubmitTransaction(bytes32)", +"40966a97": "CMCEthereumTicker(address,uint256)", +"40976b60": "setNewAgent(address)", +"4097d865": "increaseRound()", +"40980953": "setWhitelistOff(bool)", +"409817b1": "FOTToken(address)", +"40992e9d": "getTotalAirDroppedAmount()", +"40998845": "_recordName(address)", +"409a3d8f": "ALLANCOIN()", +"409b479c": "GetTotalPlayers()", +"409bc43c": "changePersonalMaxcap(uint256)", +"409bd95b": "getProductionTimeBusiness(uint256)", +"409c7baf": "BONUS_MIN_DURATION()", +"409c962e": "view34()", +"409dba83": "calcKeysReceived(uint256)", +"409e81a4": "Create(uint256,uint256,uint256,uint256,bool)", +"409ed1db": "setCCH_edit_5(string)", +"409f2607": "ESCOToken()", +"409f33c1": "sumPublicSale()", +"409fb4c0": "configMaxKeys()", +"409fc358": "canGiveMoneyBack()", +"40a0dd4b": "updateStateBasedOnTime()", +"40a141ff": "removeValidator(address)", +"40a19a71": "BLOCKSUNTILCLEANUPSTACK()", +"40a1b96e": "getTickets(uint8)", +"40a1f4d5": "invalidateStage(uint256)", +"40a1f87d": "getTotalLockedTokensPerUser(address)", +"40a203c4": "CoinVillaIssued()", +"40a2bfc1": "setXPAAssets(address)", +"40a3a9c7": "createTokenLocker(address,address)", +"40a3d246": "toggle()", +"40a401d0": "setMonsterIndexToOwner(uint256,address)", +"40a4437e": "setBattleProviderAddress(address)", +"40a45440": "getPlayerBetNumbers(address)", +"40a49a96": "searchSmallestInvestor()", +"40a4c3cc": "loanCreator()", +"40a4c580": "validateTransfer(address,address,uint256,bytes,bytes)", +"40a50a5e": "setNormalBuyLimit(uint256)", +"40a51199": "PubPresale(address,address,address)", +"40a53017": "FeedEgg()", +"40a53ab9": "replaceAuditorRegistry(address)", +"40a5737f": "setIndex(uint256)", +"40a57cb8": "makeAdmin(address,bool)", +"40a5bfc5": "PentacoreToken()", +"40a72363": "sigTeamAndAdvisersAddress()", +"40a7ed8b": "uintFunc(uint256,uint256,uint256)", +"40a806ed": "_borrowTokenFinal(address,bytes32,uint256,uint256,address,address,bool)", +"40a8a96c": "KingdomCreatedEvent(uint256)", +"40a915a5": "setTokensLocked(bool)", +"40a92f0f": "setMinSign(uint40)", +"40aab81b": "UpdatedBlock(uint256,uint256,bytes32,bytes32,bytes32,bytes32,address)", +"40aad0fe": "getUserPair(address)", +"40ab2634": "lastBlock_f8()", +"40ab4879": "pePrice()", +"40ab7b8c": "bnt()", +"40ac40b2": "setInvitationMultiple(uint256)", +"40ac89a2": "returnInvestment()", +"40acbee3": "TokenFactoryAirdropToken()", +"40acf805": "setCompanyInfo(bytes32,string)", +"40ad654c": "transferForVote(address,uint256)", +"40adf94e": "setOraclizeGasPrice(uint256,uint256)", +"40ae0851": "withdrawEtc(address,uint256)", +"40aec640": "bonusState()", +"40aee1a9": "numHashTypes()", +"40af1a45": "PrivateSaleDays()", +"40b00033": "deposit(string,uint256,bytes,uint8,bytes32,bytes32)", +"40b0a77f": "updateInstantTrade(address)", +"40b0c3d1": "DiligenceToken()", +"40b12b40": "testIsTrue()", +"40b14606": "getOverPLayer()", +"40b1ad52": "slashReservedUsername(string,bytes32[],uint256)", +"40b31937": "pledgeDecline(uint256)", +"40b359f5": "markTaskCompleted(address,bytes32)", +"40b43701": "getSetting(uint256)", +"40b5336d": "_updateDepositCountry(uint256,uint256,uint256)", +"40b5886b": "getHotWalletAddress()", +"40b5ce01": "fightStartTime()", +"40b60b85": "forceBuyback(address)", +"40b61fe9": "removeOperator(address,address)", +"40b6290f": "acceptSale()", +"40b6c71f": "EthLyteToken()", +"40b73897": "getFeeWindow(uint256)", +"40b74c91": "dislikeArtist(address)", +"40b7802d": "GiveUpTheDough(address)", +"40b7b240": "calculateAmount(address)", +"40b80684": "TOKEN_AMOUNT_ICO_STAGE1_PRE_SALE4()", +"40b8783d": "raiseSlammer(bytes32,bytes32,bytes32)", +"40b8d53a": "startFeeExit(address,uint256)", +"40b98253": "canContribute()", +"40ba0e94": "getRegion(uint256)", +"40bb28e8": "watchVideoB(address)", +"40bb8474": "RENEETOKEN()", +"40bbf5b9": "ChunksToken()", +"40bc9308": "startTimeRound1()", +"40bcff15": "bet1000_01eth()", +"40bd8720": "_changeOslikiFoundation(address)", +"40bdd3e9": "bytesEqual(bytes,bytes)", +"40bea8d2": "lockedEndTimeOf(address)", +"40beafc9": "depositToTWI(uint256)", +"40beee2b": "setPermanentPlatinumLevel(address,string)", +"40bf6424": "removalPrice()", +"40bff23d": "_createCard(uint256,address)", +"40c00acf": "invest_mined()", +"40c05401": "getWithdrawableAmountFIIT(address)", +"40c0bcb9": "checkBetNumber(uint8,address,bytes32,bytes32)", +"40c0c5ff": "PityToken()", +"40c0ece3": "updateMyReturns(uint256)", +"40c10f19": "mint(address,uint256)", +"40c243c9": "totalEthRefunded()", +"40c2dc4a": "getCCH_edit_6()", +"40c3198e": "getBenzByOwner(address)", +"40c3418c": "sendCrowdsaleBalance(address,uint256)", +"40c36524": "getFreeHatchCnt()", +"40c37ed2": "sellGameLockedToken(uint256)", +"40c3a6db": "MaxNumberOfBetsChanged(uint256)", +"40c3b187": "left37(uint256)", +"40c3b18e": "approveTransferableToggle()", +"40c44c5b": "DivisibleFirstCommonsForumToken()", +"40c44f6a": "setNewCFO(address)", +"40c48c8d": "setNewPriceInFinney(uint256)", +"40c48dfa": "Entropy()", +"40c558b2": "releaseCatIndexUpperBound(uint256)", +"40c58b2b": "get_foreign_balance(address)", +"40c5b34e": "currentPhaseId()", +"40c65003": "bonusEnds()", +"40c657c7": "buyTokens(address,uint256,uint256,uint256,uint256)", +"40c73d17": "changeAnimator(address)", +"40c7535b": "TangToken()", +"40c7e279": "requiredPlayers()", +"40c7e707": "contributeBTC(address,uint256)", +"40c85a59": "getLestCommonMulArray(uint256)", +"40c87214": "_startNewMiningEpoch()", +"40c8a90a": "GetLastMsg()", +"40c91c05": "submod(uint256,uint256,uint256)", +"40c92ae6": "multisigwallet(address[],uint256)", +"40c97617": "getReferralAddressShare()", +"40c9adcf": "_cancelOffer(uint256)", +"40c9e804": "SanityRates(address)", +"40ca0f05": "W0keAFPresale(uint256,uint256,uint256,address)", +"40ca925d": "ChannelManagerContract(address,address)", +"40caae06": "setOwner()", +"40cc1239": "TokenEmission(string,string,uint8,uint256)", +"40cc35ce": "teamWithdrawalProposed()", +"40cc8854": "bite(bytes32)", +"40cd988d": "refundBroadcaster(uint256)", +"40cde403": "exchangeBalanceOf(address)", +"40ce1d43": "EWWCOIN()", +"40ce5062": "isPublicSaleNoBonus()", +"40ceb451": "increasePromoCreatedCount()", +"40d0a103": "MarketOrderEvent(uint256,uint128,uint8,uint16,uint256,uint256)", +"40d113da": "sqrtAsm(uint256)", +"40d1d255": "claimEndTime()", +"40d1df53": "etStringValue(bytes32)", +"40d21e6a": "getRelations(uint256)", +"40d22cf8": "completedTasks(uint256)", +"40d2e73c": "VanHardwareResourcesChain()", +"40d32df9": "MetaIdentityManager(uint256,uint256,uint256,address)", +"40d3d25a": "playersStorage(address)", +"40d40a72": "MANAGE_CAP()", +"40d48958": "_endTime()", +"40d67116": "setTokensPerOneETH(uint256)", +"40d681cb": "setupPresaleClaim()", +"40d699b7": "deathData_a4()", +"40d75432": "provideExchangeRate(uint256,uint256,uint256)", +"40d7b7b8": "dollarPrice()", +"40d7f7e8": "Staked(address,bytes32,uint256,uint256,uint256,uint256)", +"40d815cf": "Cyberium()", +"40d84b52": "updateCase(address,uint256)", +"40d8c74f": "checkForPayout()", +"40d96e6c": "finalizeSale3()", +"40da948f": "updateUnit(uint256)", +"40db4b09": "tokensOwedByInterval(uint256,uint256,uint256)", +"40dca307": "buyCoinsUpdateState(uint256)", +"40dda9af": "USER_LOCK_BLOCKS()", +"40de2784": "buildICOStageTwo()", +"40debefd": "SomeCoin(string,string,uint8)", +"40dee0c5": "LogRedeem(address,uint256,bytes32)", +"40df280e": "alliesContract()", +"40df78b6": "bankBurnFrom(address,uint256)", +"40e0653c": "_getLevel(uint256)", +"40e099ac": "makePromise(uint256)", +"40e15134": "presaleDist()", +"40e1e62b": "RedSoxYankees412()", +"40e2ad58": "buyOwnedPixels(bytes32)", +"40e31490": "killAnimal(uint16)", +"40e40765": "setTokenSaleHardCap(uint256)", +"40e424ee": "chooseWinner(bytes32)", +"40e4ebf4": "GenDayRatio(uint256)", +"40e50d00": "gcsc(uint256)", +"40e58ee5": "cancel(uint256)", +"40e5f3cb": "getEtherBalanceOnCrowdsale()", +"40e63ef3": "getPubKeyByHash(string)", +"40e687a9": "blockno()", +"40e6b00a": "createRefundPoll()", +"40e7261d": "Golem()", +"40e87f13": "dropTokenV2(address[])", +"40ebe5bc": "SHARD()", +"40ec0b6a": "isCurioAuction()", +"40ecb7f2": "isTransferValid(address,address,uint256)", +"40ed79f4": "hashimoto(bytes32,bytes8,uint256[],uint256[],uint256)", +"40eddc4e": "getCollectedEther()", +"40ee2485": "CryptoCovfefes()", +"40eedabb": "leader()", +"40ef4704": "getState(bytes10)", +"40ef78a7": "getExploreData(uint256)", +"40f03605": "existingContribution(address,address)", +"40f04616": "_buyDiscountTTW(uint256,uint256,address,address)", +"40f0a21f": "ceil(uint256)", +"40f10af2": "revokeAttribute(address,address,string,bytes)", +"40f12a02": "getPureWeaponDamageFromTokenId(uint256)", +"40f13c0f": "mintingFoundersFinish()", +"40f13db5": "addWhitelisted(address,address)", +"40f19da7": "isFinish(bytes32,bytes32)", +"40f29da3": "testReturnsProductInformation()", +"40f2a50b": "findDsp(address)", +"40f313b9": "ImportRemappingTestA()", +"40f354f3": "insertTopic(bytes15,address,string,string)", +"40f3633e": "icoMin()", +"40f3b6f1": "yourShares(address)", +"40f3c364": "ProjectTag()", +"40f47d41": "registerNameByCOO(string,address)", +"40f523f9": "TourMEToken()", +"40f54c08": "TrumpCoins()", +"40f56cfb": "PYPToken()", +"40f5c954": "sumICOStage8USD()", +"40f5ed88": "XPS()", +"40f702b4": "userInfo(string,uint256)", +"40f81cb5": "providerAllowance(address,bool)", +"40f828a2": "setLiquid(bool)", +"40f9b34c": "BetrTokenPurchase(address,address,uint256,uint256)", +"40f9c62c": "setLargeWalletAddress(address)", +"40f9cdf9": "get_tokens_count(uint256)", +"40fa368c": "getOrderHash(bytes32,uint256[2],address,bool,uint96)", +"40fa61f7": "upgradeFee()", +"40fc5e7a": "upgradeableTarget()", +"40fdef80": "administration(uint256,string,uint256,uint256,address)", +"40fdf515": "issuetender(address,uint256,uint256)", +"40fe90d0": "setFreezeOut(address[],bool)", +"40ff26ba": "adminAdd(address,string)", +"40ff38b2": "rootDomain()", +"40fff80c": "setCommissionAddress(address)", +"41002439": "amIReady(address,address)", +"410085df": "refund(address,uint256)", +"410090db": "ChangeEmissionGrowthCoefficient(uint8)", +"410158cd": "Winsshar(address)", +"4102bf5c": "getAvailableAmount(address[8],uint256[6],uint256,uint8,bytes32,bytes32)", +"4102f4e8": "mToken(address,uint256)", +"41031b1d": "NutzEnabled(address,address)", +"4103257e": "ReceivedETH(address,uint256)", +"410366c1": "settleDispute(bytes32,uint256,uint256)", +"4103c4c4": "OwnedHelper()", +"410453ae": "serverEndGame(uint32,int256,bytes32,bytes32,uint256,address,address,bytes)", +"4104df21": "cardsMinted()", +"4105048d": "Revealed(uint256,uint8)", +"410520f7": "PrivateReserveCoin()", +"4105e02f": "remark1()", +"41061c04": "addVestingMember(address,address,uint256,uint256,uint256)", +"410646e0": "getUnclaimedAmount(address,uint16)", +"41068ae2": "LicenseCore()", +"41080cfa": "getLLV_edit_7()", +"41095b60": "voteForUltimateOutcome(bytes,uint16)", +"410968d8": "MajLastNotVal()", +"41097886": "LogAirDrop(address,uint256)", +"4109a71a": "CerttifyCrowdsale(address,address,address)", +"410a1d32": "getDonation(address)", +"410a1db1": "setCommunityPool(address)", +"410a6734": "setAllBlockHashes()", +"410a68b5": "setOraclizeCallbackGasPrice(uint256)", +"410ace1f": "EOSBetSlots()", +"410af6b6": "allowAddressDelegate(address,address)", +"410b1da8": "currentTotalSupply()", +"410bf4bf": "CloudMoolah()", +"410c2601": "testGetAccountBalance()", +"410c47a0": "bb(uint256)", +"410c8005": "SetReciver(address)", +"410c83a3": "get_amount_get_buy(uint256)", +"410cbcc6": "YaoToken(uint256)", +"410da27d": "surveyEndAt()", +"410dbad6": "setaddress(address,address,address,address)", +"410dcc42": "setSeedHash(uint256,bytes32)", +"410e05b3": "bdevIssue(address,uint256)", +"410e7b42": "TestCoin()", +"410e8340": "checkAndConfirm(address,bytes32)", +"41104ef9": "GlobalOperatorChanged(address,address)", +"41107bee": "parseSums(bytes)", +"4110a489": "validatorsState(address)", +"4110b2c9": "addCapital()", +"411273d8": "getTokenToEthAddOrderHint(uint128,uint128)", +"4112987c": "strConcat(string,string,string)", +"4112b7f1": "tryGetNameOwner(bytes)", +"4112ea75": "SongTokenExchangeContractSet(address,address,bool)", +"41130267": "fxxkicotestToken()", +"4113d05b": "createGen0TokenWithDna(uint256)", +"4115f883": "requestAuditWithPriceHint(string,uint256,uint256)", +"411615fd": "investorWithdrew(address,address)", +"41161aac": "X(uint256,string,string)", +"41163f7c": "deedCount()", +"4116dfc3": "getMetaDataCount(address,bytes32)", +"411735ee": "getAddressGains(address)", +"41179685": "finalizeContruibute()", +"4118cbc9": "setTokenExchangeRate(address,uint256)", +"41192788": "refund(address,address[],uint256[])", +"41193c18": "blockPlaylist(string)", +"411a1714": "setOperational(address[],bool)", +"411a1ac1": "BitcoinEye()", +"411a3dcf": "forward(address,uint256,uint256)", +"411a42ea": "ConeTest()", +"411a492e": "getNumOfLotteryTickets()", +"411ae567": "setSlogan(uint256,bytes)", +"411b007e": "founders()", +"411b65ef": "setPropertyLastUpdate(uint16,uint256)", +"411c4e72": "ModifyFeeFraction(uint256)", +"411cc791": "transferWithParams(address,uint256,uint256,uint256,uint256)", +"411d3021": "MahalaCoin()", +"411d6e19": "USDETH()", +"411dddb2": "TrueVeganCoinPresale()", +"411e6832": "tokenObj()", +"411f93d1": "transferTicket(address,address)", +"411fcce5": "BitcoinSoft()", +"41203243": "dateOfBonusRelease()", +"4120a236": "FreeNapkins()", +"4120a800": "PrepareRollEvent(address,uint256)", +"4120bcec": "forceRecoverCollateralOnBehalfOf(address,bytes32,address)", +"41215aff": "NewUpgradeMaster(address)", +"4121b9f8": "SBECoin()", +"41224405": "get_planet_price()", +"41225b0e": "broadcastSchellingRound(uint256,uint256)", +"412282cd": "addOwnerAccount(address)", +"41228803": "updateBalance(address,uint256,bool)", +"4123057e": "update_oraclize()", +"41237fd5": "levBlocks(address)", +"4123a0ac": "deleteToken()", +"4123a482": "transferTx(address,uint256)", +"4123cb6b": "m_numOwners()", +"41240314": "teamTwoSharePrice()", +"4124a6a7": "getLockedFunds()", +"41252b55": "FreezeTransfers(address,bool)", +"41264107": "TEChain()", +"412648bf": "setAvatarIndex(uint256)", +"412661c4": "_setAuth(address,address)", +"412664ae": "sendToken(address,uint256)", +"41266ae8": "Composed(uint256,address,uint32[5],uint32[5],string,string,uint8[20])", +"4126d29e": "justFailRequire()", +"412740c5": "balanceWithInterest(address)", +"41275358": "feeAddress()", +"4127d54a": "tokensForPresale1()", +"41282fe0": "usersCanUnfreeze()", +"41288e76": "sendEtherToMultisig()", +"412956ce": "goBackToPrivateSale()", +"412988e7": "subSupply(uint256)", +"4129912c": "misub(uint64,uint64)", +"4129a9d5": "newIcoRound(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"4129b2c9": "getWinner(uint256)", +"4129b8ed": "remainingTokenHolder()", +"4129d7d1": "MessageSent(address,address,uint256,string,string,uint256)", +"412a5a6d": "createContract()", +"412a7be0": "athlete()", +"412b2ee0": "forkMe()", +"412c0b58": "initiate(bytes32,address,bytes32,uint256)", +"412c0c2d": "getWin(uint256)", +"412c7dfb": "FOUNDER_WALET()", +"412cbc06": "assetsCount(address)", +"412e829f": "LoveTracker()", +"412ec94f": "updateTokenPoolAddress(address)", +"412edecd": "setDAOAndMultiSig(address,address)", +"412eee05": "enactProp(uint256)", +"412f83b6": "getDelegatorUnbondingLock(address,uint256)", +"41300d03": "secondBonusRate()", +"41304fac": "log(string)", +"413100e0": "getLeftoverWei(address)", +"4131775e": "_removeUserCity(address,uint256)", +"4131f609": "verifyWining(uint256,uint256,uint256,bytes,bytes,bool,bytes32,bytes32)", +"41326679": "inVaults()", +"4132bae8": "calculateRAUS()", +"4133e7a1": "GxCancelOrders(address)", +"41348053": "ratePlanOfVendor(uint256,uint256)", +"413499f1": "deleteVoters()", +"4134a92a": "registerResource(bytes32,uint256,bytes32,string)", +"41354590": "setAtomIsBuy(uint256,uint128)", +"413699de": "setOwnerName(address,string)", +"4136aa35": "isAlive()", +"41388aed": "TokenHash(string,string,uint8,uint256)", +"41388c71": "DolyToken()", +"41395efa": "dgxBalance()", +"41398b15": "ethAddress()", +"413992b3": "createWarranty(string,string,address,uint256,uint256,uint256)", +"413a7f9a": "MethNSupply()", +"413ab4a8": "_reserve()", +"413abc3d": "min_share_price()", +"413bac7a": "jackpotinfo()", +"413bba97": "withdraw(uint256,bytes,address[])", +"413bc8eb": "TableDeRapprochement_322()", +"413c6d13": "setAddressValue(string,address)", +"413d18cb": "currentMessage(uint256)", +"413d7b08": "mainSaleTLYperETH()", +"413d9c3a": "LOCK_TIME()", +"413dc451": "countPerfClients(address)", +"413e31a8": "Testita()", +"413e4aaf": "calculateOwnerFee(uint256)", +"413e90e7": "putHashes(uint256)", +"413e920d": "oneMillion()", +"413ed292": "logState(string,uint8)", +"413f50da": "addAddressToWhitelist(uint256,address)", +"413f7d4c": "SECONDS_BETWEEN_ROUNDS()", +"414053be": "best_adjustment_for(bool,uint128)", +"41409437": "publishMetaData(bytes32,bytes1)", +"4141a121": "ETHERlemon()", +"4142f460": "segundos()", +"4143125f": "dusttorafflepot()", +"41431908": "setManagerAddress(address)", +"41434351": "oneday()", +"41445fd2": "c4c()", +"41446e0a": "bankersAcceptanceOfDeal()", +"4145aa9d": "grantMythexTokens(address,uint256)", +"41461bad": "gracePeriodStartBlock()", +"414689ff": "unlockAmount()", +"4146e099": "getCurRoundInfo()", +"4147060a": "LogRequirementChange(uint256)", +"41470877": "returnVesting()", +"4147e15e": "verifyOptionPoolMembers(address)", +"4147ffe5": "bitfwdToken()", +"41481372": "Fight(uint256,uint256,bool,bool)", +"41488cc9": "depositData(bytes32,address,uint256,address,uint256)", +"4149953d": "transferRestore(address,address,uint256)", +"414b49a2": "setFreeLOT(address)", +"414b7ad6": "updateAff(uint256,uint256,uint256,uint256)", +"414b85e4": "isPreIco(uint256)", +"414bbda2": "declineCoins(address,uint256)", +"414c2aab": "MemberHandler(string,address)", +"414c377b": "updateSaleLimit(uint256)", +"414c4a8d": "maxAmountToSell()", +"414ceac0": "investorAddFee(uint256)", +"414d784e": "DECIMAL_ZEROS()", +"414db054": "Loss(address,uint8,uint256,bytes32,bytes32,uint256,uint256)", +"414db89e": "tokenForSale(uint256)", +"414e2e9e": "walkTowardsBlock(uint256)", +"414e5738": "panicOn()", +"414ee145": "lastBlock_f18Hash_uint256()", +"415016f4": "getBalance(uint16)", +"4150f4cd": "setSysAcc(address)", +"415194fb": "referral_ledger(address)", +"41522e41": "setHighWater(uint256)", +"41524433": "sellKissBTCWithCallback(uint256,address,uint256)", +"4153090e": "startFavorEscrow(uint256,uint256,uint256)", +"41533ba7": "getRateByTime()", +"4153d65b": "securePay(uint256)", +"4153d751": "onTransferOwnership(address,address)", +"41541318": "createPromoNinja(uint256,address)", +"4154aede": "refund(address,uint256,address)", +"415510df": "addressPreSale()", +"41554a2e": "issua(uint256)", +"41555acd": "storeOwner(address)", +"41562e69": "insertNodeBatch(bytes32,bytes32[2][5])", +"41566585": "whitelistAddress(address)", +"4156fdb7": "createSwap(uint256)", +"41583c4b": "_updateCardClaimerAddress(uint256,address)", +"4158506a": "participantsLength()", +"41585a0c": "increaseCount(bytes32)", +"41587b08": "addWeapon(uint8[176],uint8,uint8)", +"4158d848": "fundChecking()", +"41595f04": "ALLOC_RESERVED()", +"4159712a": "LogOwnerEthWithdrawn(address,uint256,string)", +"415a0d46": "_preValidateTokenTransfer(address,uint256)", +"415bc701": "HCPTToken()", +"415bd3fa": "_report(bool,string)", +"415c7593": "autoRentByAtom(uint256,uint256)", +"415dd7d8": "newRandomValue(bytes,address,uint256)", +"415eea1b": "vaultNum()", +"415ef37c": "weiSold()", +"415efb15": "setup(string,string,string,uint256,string,string,uint256)", +"415f1240": "liquidate(uint256)", +"415f47ea": "decodeOrderUserId(uint256)", +"415f9498": "commission2()", +"415fad10": "test_threeInvalidEqInt()", +"415ffba7": "close(uint256,bytes)", +"416108e2": "ERRLCoin()", +"4162169f": "dao()", +"416232af": "CampaignContract(address,address,address,address,uint256,string)", +"4163afb6": "MANHATTANPROXY8THAVE()", +"4163b5a4": "weiUsdRate()", +"4163d75d": "delPokemonFromSellingList(address,uint256)", +"4165295a": "getMixParticipantIdByAddress(bytes32,uint256,address,address)", +"416608a9": "updateTemplate(uint256,uint256,uint256,string,string)", +"4166c1fd": "getElevation(uint8,uint8)", +"4166eab4": "zeastadscredits()", +"41676f15": "isOrganizer(address)", +"4167c2fd": "setVaults(address,address,address,address,address)", +"416851a0": "testOracleQuery(string,string)", +"4168614a": "volumeBonus(uint256)", +"4168de57": "teamIssueVesting(address,uint256)", +"41696fa8": "updateMyEntity(uint256,bytes32,bytes32,bool,address,uint256,uint256)", +"416a1b62": "Liquet()", +"416ae768": "getUserState(address)", +"416bc7f6": "createSplitter(address[],string)", +"416c0d38": "adminRetrieveContractConfig()", +"416c334d": "withdrawDistributedToPoolOwners()", +"416c3f16": "eligibleAmount(address,uint256)", +"416c6383": "testConcatMemory31Bytes()", +"416c8701": "beyond()", +"416c9627": "updatePresaleBonus(uint256)", +"416ccd02": "limitVIP()", +"416cf34e": "ULCToken(address,uint256)", +"416da702": "TOKEN_USDCENT_PRICE()", +"416dc762": "endThirdPeriodTimestamp()", +"416dffb0": "cleanupURLs()", +"416e517e": "setOutcome(uint256)", +"416e6d5e": "balanceManager()", +"416e70f6": "linkToMasterWallet(address,address)", +"416f222a": "submitBid(uint256,uint256,uint256)", +"416f5483": "changeEthAddress(address)", +"41709748": "getTotalDrone()", +"4170a419": "setCCH_edit_34(string)", +"4170e191": "MiniMeBaseCrowdsale(address)", +"4170ee08": "reVote(uint256)", +"41713a37": "directTradeAllowed()", +"41718066": "hitFoundationPrecent()", +"417297a0": "issueTokensSale(address[])", +"4172d080": "tokenExchangeRate()", +"41733f7a": "fooToken()", +"4173b181": "setWeiPrice(uint256)", +"4173c27a": "REEFToken()", +"4173ffbc": "getRand(uint256,uint256)", +"41744dd4": "feeRatio()", +"4174a943": "Deposited(address,address,address,uint256)", +"4174f1a5": "TOKEN_RATE()", +"4175b307": "addAddresses(address[],string)", +"41760afc": "_setEventsHistory(address)", +"41763225": "createRewardCollectible(uint8,uint8,uint256,address,uint256,uint256,uint256)", +"4176368f": "paymentSizeE()", +"4176ce68": "IsAuthority(address)", +"41771b62": "changeFees(uint8)", +"4177340d": "openGamePlayNo(uint256)", +"4177afa6": "TIER_2_BUYIN()", +"4178617f": "addAllowedToken(address)", +"41796bea": "OfferCreated(uint256,bytes,address)", +"41799883": "decreaseSoldSaleSupply(uint256)", +"417a2909": "getUpdateTimes()", +"417a767e": "getBetsBlock()", +"417a7d60": "checkMessageData(address)", +"417b3409": "DownloadMusic(uint256,address,uint256)", +"417b86fb": "getPolicyDetailsByHash(bytes32)", +"417ba840": "checkMemberLevel(address)", +"417c73a7": "addToBlackList(address)", +"417c8d40": "SEK_Omnidollar()", +"417cb353": "totalDecimals()", +"417d5fb4": "advisersPeriodsNumber()", +"417de5b5": "mintAirdropToken(uint256)", +"417e8e67": "getCompoundedInterest(uint256,uint256,uint256)", +"417ea2dc": "platformSupplyRemaining()", +"417f204e": "GATC(uint256,string,string)", +"417fd6b6": "setMinBidAmount(uint256)", +"41808d4a": "test_remove_tail()", +"4180b70d": "KKday()", +"4180c2d5": "payout(address[])", +"4180f6ec": "RESERVED_TOKENS_FOUNDERS_TEAM()", +"4181641b": "engrave(string,bytes32)", +"41829445": "createNewCE(bytes32)", +"4182e5eb": "deleteContract(uint256,address,uint8[],bytes32[],bytes32[])", +"4182fa46": "getHouseAddressShare()", +"41831218": "maxPerPersion()", +"41832bed": "generateOrderHashes(address[4],uint256[8])", +"4183689f": "initSignetures()", +"4183f0b3": "startCardSale()", +"41843aa5": "subusermoney(address,uint256)", +"4184907e": "ESPlatts()", +"41852eb2": "BuyToken()", +"418599cb": "SerenityTeamAllocator()", +"4185f8eb": "receiveEth()", +"4185fdc5": "decreaseFrozen(address,uint256)", +"41863a7d": "victorieumICO1Token()", +"41867384": "new_bonus_for_next_period()", +"41868769": "CallAborted(address,bytes)", +"4187a193": "stageThreeStart()", +"41883b78": "withdrawHouseEarnings()", +"4188d79c": "releaseExists(string,uint32,uint32,uint32,string,string)", +"418939c0": "fillBid()", +"4189a68e": "sell(uint256,address)", +"418ae602": "verificationAddressHoldersListCountMap(address)", +"418bc2ee": "updateHatchingRange(uint16,uint16)", +"418bc76c": "gasForKWH()", +"418c7de1": "currentFulfillment(string)", +"418ca0c7": "subOnStage(address,uint256,uint256)", +"418cb077": "CustomToken()", +"418cf199": "setEstimateCost(uint256,uint256)", +"418d4dcc": "collectPayoutForAddress(address,address)", +"418d75b6": "getBuyerOption()", +"418f1487": "confirmDividendsFromPot()", +"418f3a9b": "Invest(address,uint32,uint32,uint256)", +"4190af2e": "walletTokenReservation()", +"4190cfc1": "getAllQuestionAddresses()", +"4190f365": "PUBLIC_MAX_CONTRIBUTION()", +"41910104": "returnSuspendedPayments(address)", +"41910112": "DecentBetToken(address,address,address,uint256,uint256,uint256)", +"41910f90": "BASE_RATE()", +"41923c0c": "PRICE_ICO1()", +"419259ef": "reissueCert(bytes32,bytes,bytes32,uint256,bytes32,bytes,uint256)", +"4192610e": "callThisToStop()", +"419308f7": "getPreviousNode(bytes32)", +"4193b8b7": "bytesToUint(int256,bytes)", +"4193e15f": "OrbusToken()", +"419469fe": "calculateCellSell(uint256)", +"41953e90": "CoinTel()", +"4196cd4a": "stateIndexToApproved(uint256)", +"4196fad9": "mop()", +"419759f5": "depositAmount()", +"41976e09": "getPrice(address)", +"4198d24a": "mintAllocations()", +"4198e94d": "setbounty(uint256)", +"419905e5": "pray()", +"419945f8": "ExpiringMarket(uint256)", +"4199dbe6": "avvia_votazioni()", +"419a3de6": "allotItem(uint256,uint256)", +"419a88b6": "XPA()", +"419ab31e": "USERS_address()", +"419b96fa": "removeBusiness(address)", +"419bd6c0": "Nairotex()", +"419ce264": "ercToNativeBridgesAllowed()", +"419db07b": "generousFee()", +"419e6e5c": "getTotalNamesCount()", +"419e7589": "setProviderDetails(uint256,string,string,uint256,string,uint8,address)", +"419eafdc": "winPercent(uint256)", +"419ef898": "IBRToken()", +"419f6a3a": "isAirdropOver()", +"419ffa03": "fipsRegister(address)", +"41a0894d": "getReferrals(address)", +"41a08aaf": "judge(uint256,bool)", +"41a0be7b": "renameHorsey(uint256,string)", +"41a1053f": "strRemoveLastCharacter(string)", +"41a1a582": "getOwnerPayout(uint256)", +"41a1d66c": "sendTokensToExchange(uint256)", +"41a2625f": "endPreico()", +"41a28df6": "setAdminAddr(address)", +"41a292be": "calcPriceAt(uint256)", +"41a41523": "TIMEDEX()", +"41a42ba2": "updateNetworkConnection(string,string,address)", +"41a461fb": "SDAToken()", +"41a49409": "setWhitelistManager(address)", +"41a494c5": "award()", +"41a4c309": "_burnApproveClear(address,address)", +"41a4c5bf": "changeBonus(uint256,uint256,uint256,uint256,uint256)", +"41a51d00": "total0xbtcBalance()", +"41a5518f": "getMineInfoInDay(address,uint256,uint256)", +"41a59cef": "SDGT(uint256,string,uint8,string)", +"41a5b33d": "withdrawFromToken(address,address,uint256)", +"41a6cfda": "ROSCcoin(uint256,string,string)", +"41a6f46e": "FIESTA()", +"41a70b4c": "addArgumentToRequestString(uint256,bytes32,bytes32)", +"41a76287": "updateUintSetting(uint256,uint256,address,string,string)", +"41a7726a": "subscribe(address)", +"41a806ca": "addFamily(address)", +"41a82cc1": "ruleB(uint256)", +"41a84a0d": "getTokensForContribution(address,uint16)", +"41a928fe": "downTick(uint256,uint256)", +"41a943e2": "addAdmin(address,address,bool,bool,bytes32)", +"41aaccb0": "claim_eth_by_address()", +"41abe705": "doCount(address)", +"41ac59b7": "massTransfer(address[])", +"41ac5dd0": "updateFulfillment(uint256,uint256,string)", +"41ad3f57": "chickenToAltar(uint256)", +"41ad5c72": "createGroup(bytes32,uint256)", +"41ad785e": "payAndDonate(address,address)", +"41adb3f5": "saveInfo(string)", +"41ade6b7": "setRegisteredFirm(string,bool)", +"41aeaea7": "restWei()", +"41aed7cb": "isActiveEmployer(address,address)", +"41af1524": "verificationCodeHash()", +"41affe19": "publicSaleWallets(uint256)", +"41b0b4cd": "distributedTeamStakes()", +"41b2121c": "newInvestor(address,uint256,uint256)", +"41b2485b": "fiatContract()", +"41b280d2": "getTXwithCode(bytes32)", +"41b3203c": "PlaySimpleGame(uint8,bool)", +"41b3a0d9": "contractEnabled()", +"41b3d185": "minDeposit()", +"41b44392": "removeDarknode(address)", +"41b4a626": "cashSale(address,uint256)", +"41b4be87": "getPoolbyGtype(uint8)", +"41b5467a": "getUnpaidPerfit(uint32,uint32,uint256)", +"41b6f6ce": "getStatusDeal(bytes32)", +"41b6fcf7": "paymentDigest(bytes32,uint256)", +"41b80184": "lastProfitTransferTimestamp()", +"41b8547c": "Dev_Supply()", +"41b94f10": "_toTaxed(uint256)", +"41b989d0": "CashDeposit(address,uint256)", +"41b9c14c": "getShipsByOwner()", +"41b9dc2b": "has(bytes32,bytes32)", +"41ba4738": "GOLD_AMOUNT_NDC()", +"41ba9a17": "removeMilestones(uint8)", +"41bb0559": "symbol(string)", +"41bb26d3": "handlePayment(address)", +"41bb50f7": "eachIssuedAmount()", +"41bc0b6a": "LivepeerVerifier(address,address,string)", +"41bc2bea": "setProviderOwner(uint256,address)", +"41bc7b1f": "getOracleDetails()", +"41bcd712": "RTPToken()", +"41bd84aa": "_removeAffiliate(uint256)", +"41be0a14": "SPOT9()", +"41be44d5": "XAUDToken()", +"41be84cf": "getWingsValue(uint256)", +"41beb00c": "getResult(bytes32,uint256)", +"41bec0d2": "setERC20Address(address)", +"41becaef": "tokenIssueIndex()", +"41beef9d": "getSpareRecommAddr()", +"41c06b2a": "_reached(uint256)", +"41c0aa0e": "lockUnsoldTokens(address)", +"41c0dc59": "PAYOUT_FRAC_TOP()", +"41c0e1b5": "kill()", +"41c12a70": "voteNo()", +"41c14eb4": "BrokerImp(address,address,uint256,address)", +"41c173e2": "preICO(address,uint256)", +"41c1f017": "CONFIG_MAX_EXPOSURE_DIV()", +"41c1f5b4": "dreamToken()", +"41c1f60e": "instruct_5()", +"41c2c8f6": "FutaToken()", +"41c3e7c7": "report(address,bytes32,uint256[],bool)", +"41c41025": "updateFunders(address,bytes32,string,uint256)", +"41c41923": "freeze_contract()", +"41c46ff7": "PALToken8(uint256,address)", +"41c4c7eb": "sellBreeding(uint256,uint256,uint256,uint16,bool)", +"41c5cf5c": "ICOend()", +"41c61383": "totalClaims()", +"41c6f609": "registerNewMember(address,uint256)", +"41c7eb41": "populateTrancheRates()", +"41c8146c": "changeTimeBonuses(uint256,uint256,uint256,uint256,uint256,uint256)", +"41c838cb": "getSANitized(string)", +"41c8b1de": "lendingInterestRatePercentage()", +"41c8ba1e": "MIN_CONTRIBUTION_CHF()", +"41c9692b": "phase1Duration()", +"41c96964": "getInvestorInfo(uint256)", +"41c9c72d": "updateDelegatorRewards(address[],uint256[])", +"41ca641e": "getShareholders()", +"41ca7242": "maxCapPre()", +"41caea7d": "EventWithdraw(address,uint256)", +"41cbd6ea": "getTrustedPartner(address)", +"41cbfc7b": "getKeysByType(uint256)", +"41cc0aa5": "RET_MUL()", +"41cc8912": "renameToken(string,string)", +"41ccf987": "ownedPool()", +"41cd47bf": "FEE_NUMERATOR()", +"41cdd253": "TestFMA(uint256,string,string)", +"41ce7f23": "BACToken(uint256,string,uint8,string)", +"41ce909f": "Bitroneum()", +"41ce979d": "VanityReleased(string)", +"41ce9f0e": "setBZRxTokenContractAddress(address)", +"41cfbb96": "test_someOtherFalseTest()", +"41d003cb": "setBonusCreationRate(uint256)", +"41d00774": "CoefRew()", +"41d00b1d": "EBIToken()", +"41d03085": "NEWONE()", +"41d09fbe": "sendWinnings()", +"41d0fcb6": "setSanctuaryAddress(address,address)", +"41d15b54": "createProductionUnitTokenContract(uint8,uint8,uint8,uint256,uint256,uint256,uint256)", +"41d1a4d6": "getStrategyAtIndex(uint256)", +"41d1da19": "Cloudeb()", +"41d20767": "ethMinContribution()", +"41d2c748": "applyCoeff(uint256,address)", +"41d31feb": "get_read_only_keys()", +"41d45f4a": "UNEK()", +"41d4a1ab": "bonusToken()", +"41d4a39e": "setCrowdsaleClosed(bool,bool)", +"41d5da6b": "getMyStatus(bytes32,bytes32)", +"41d5e10c": "BittwattToken(uint256)", +"41d5f7ac": "eligibleAmountCheck(address,uint256)", +"41d76a9c": "firstTime()", +"41d80050": "FundsGot(address,uint256)", +"41d875dc": "setStr(uint256,string)", +"41d8bc5f": "setExchangeRateOracle(address)", +"41d966a3": "sendFyle(address,address,string,string)", +"41d9cc43": "forgeItems(uint256,uint256)", +"41da7538": "getJadeProduction(address)", +"41da7555": "ownerPercentage()", +"41db1875": "makeBuyOrder(address,uint256)", +"41db61e1": "toGMT(uint256)", +"41db7e16": "RGN()", +"41db8c93": "_startCrowdsale(address,uint256)", +"41dbb51e": "IsFrozen()", +"41dbbb61": "SmartexFundsManager()", +"41dbe546": "HedeCoin()", +"41dc02cf": "changePatentSale(uint16,uint256)", +"41dcf454": "tokenURI(uint256,string)", +"41de2164": "getPhaseStartTime(uint256)", +"41de4181": "fireDepositToChildEvent(uint256)", +"41de4f16": "queenchUSBToken()", +"41dedc58": "gradeinfo()", +"41defd82": "cancelJobByAdmin(bytes32,uint256,address,uint256)", +"41df696e": "start_play_quiz(string,string)", +"41dfed3a": "viewCurrentPrice()", +"41e0b5d4": "Fenerbahce()", +"41e0c407": "getStudentCount()", +"41e1234e": "presaleFemaleStart()", +"41e14251": "devuelveUsers()", +"41e18398": "batchTransferFromManyToMany(address[],address[],uint256[])", +"41e2cdf4": "myGauntletType()", +"41e34be9": "unitSellable(uint256)", +"41e3a6b5": "updateSplitBalances()", +"41e50814": "DEVCoin(uint256,uint256)", +"41e51e89": "approveZeroTokensTest(address)", +"41e60c86": "unsign()", +"41e62be6": "VRToken()", +"41e6fd4b": "hasSecret(uint256)", +"41e7a787": "ERC223StandardToken(string,string,uint8,address,uint256)", +"41e7c47e": "FBR2()", +"41e831b0": "Oboc(uint256,string,string)", +"41e884d4": "viewLastClaimedDividend(address,address)", +"41e8b94c": "isThereABlockAtCoordinates(uint16,uint16)", +"41e8da52": "makeBet(uint256,uint256,address,uint256,uint256)", +"41e8fe9f": "EventRandomLedgerRevealed(address,uint256,uint256,address)", +"41e906e5": "getExercised(address)", +"41ea5127": "BaseAuction()", +"41ea59a9": "isFoundationSupplyAssigned()", +"41eb1a4a": "setUintCoinProduction(address,address,uint256,uint256,bool)", +"41eb24bb": "renouncePauser(address)", +"41ebb063": "KRHCoin(uint256,string,uint8,string)", +"41ebe9c6": "ScarcecoinStart()", +"41ecd1cd": "withdrawOwnerUnrevealed(uint256,address)", +"41ece976": "updateMinInvestmentForPreIco(uint256)", +"41ecf95b": "ParticipantJoined(uint8,uint16,uint32,address)", +"41ed2c12": "marketManager()", +"41eddf00": "checkIfCurrentlyActive(uint256)", +"41ee903e": "clear(uint256,uint256)", +"41eeb105": "doRelease(bytes16,address,address,uint256,uint16,uint128)", +"41ef3879": "stage1_price()", +"41ef6bb7": "uncirculatedSupplyCount()", +"41ef858f": "whitelistAddress(address,address,uint256)", +"41ef9184": "Pretorian()", +"41f18b43": "claimEarlyIncomebyAddress(address)", +"41f1d4dd": "whitelistControl()", +"41f1e76c": "minFundingGoalReached()", +"41f1f3e5": "getPayeeIndex(bytes32,address,address)", +"41f2ce14": "setABalance(address,uint256)", +"41f31724": "Tzedakah()", +"41f36984": "collectGamePayout(uint256,uint256)", +"41f4793a": "getCurrentImpeachmentVotesSupporting()", +"41f48ebf": "currentIco()", +"41f4ab98": "addManyToPresaleWhitelist(address[])", +"41f4fcaf": "isDrop(uint256,address)", +"41f51941": "doActivateSale(address)", +"41f59e81": "initBonuses()", +"41f64b85": "deleteBag(uint256)", +"41f65507": "pendingOracleA()", +"41f6e77e": "FindTheCureCoin2()", +"41f70465": "startCoinOffering(uint256,uint256,uint256,uint256)", +"41f77260": "withdrawSyndicateTokens()", +"41f8a524": "Verificator()", +"41f99b69": "setWithdrawalCoolingPeriod(uint256)", +"41f99e2f": "getPostDonationAmount(address,uint256)", +"41fa4876": "multiBlockRandomGen(uint256,uint256)", +"41fade8f": "getconfig(address)", +"41fb55c6": "mMaxAppCode()", +"41fbb050": "foundation()", +"41fcb0f7": "buyNapkins(address)", +"41fd32cf": "SafecontractsTREXCrowdfunding()", +"41fe0a24": "buyCrystalDemand(uint256,uint256,string,string)", +"41fee898": "refundPercent()", +"41ff4275": "_calculateUnlockedTokens(uint256,uint256,uint256,uint256,uint8)", +"41ffbc1f": "ringIndex()", +"42007fd3": "MarkRazAsComplete(uint256)", +"4202d214": "isActiveUser(address)", +"4203ea57": "minInvestmentPreICO()", +"4204f7d5": "deployMinersTest(uint32,address,uint32[],uint32[],uint32[])", +"4205875f": "ROUND_6_PRESALE_BONUS()", +"4205e5af": "pauseClosingTime()", +"4206311b": "TimeLockSend(address,address,uint256)", +"420714bd": "requestIndex()", +"42071a73": "bltRetained()", +"4207d648": "directorJurisdication()", +"42091137": "addStringSetting(string,string,address,address,string)", +"42091e76": "saltoken(address,address)", +"42095679": "lindyhanCoin()", +"420977d8": "viewStudent(uint256)", +"4209a1ef": "registerPlayer(string,uint256)", +"4209fff1": "isUser(address)", +"420a83e7": "tokenHolder()", +"420a8ac8": "NanoPyramid()", +"420a8b76": "Dancer()", +"420aa07d": "serviceTrasferToDist(bytes32,uint256)", +"420aadb8": "_execute()", +"420ae446": "allocatetokensAndWLExp(address,uint256,uint256)", +"420b5fe0": "initializeVestingFor(address)", +"420b81f6": "peekData()", +"420b9921": "ecsubtract(uint256,uint256,uint256,uint256,uint256,uint256)", +"420c96ea": "newArtwork(bytes32,uint256,string,string,string,uint256)", +"420d0ba4": "nobodyCanDoThis()", +"420d23fd": "POOL_EDIT_1()", +"420d4a02": "getUnlockedAmount(address)", +"420d4bdd": "CRYPTAU()", +"420dd15a": "getLast(string)", +"420ddaa6": "encodeKYCFlag(bool)", +"420e1f51": "tokenExchanges()", +"420e7ea6": "tokenAmountRasied()", +"420ef2b3": "TargetHash()", +"4210ad0e": "newBurnableOpenPayment(address,uint256)", +"42111339": "contributeLocal()", +"42118f51": "manualLCs()", +"4212616b": "localsUser()", +"4214352d": "write_what_where_gadget(uint256,uint256)", +"4214d52f": "updateIndex(address,address)", +"421521b1": "finalizeOpenSale()", +"42154e9c": "countAddress()", +"42159ca3": "getMaxDelayDays()", +"4215a39b": "getCreateMarketNumOutcomesValue()", +"4215da7d": "investorsStorage()", +"4216503c": "setFunStr(string)", +"42170736": "secondPhaseStartTime()", +"421715c2": "canBorrow()", +"42172a6a": "_emitERC20DividendDepositedEvent(uint256,int256,uint256,uint256,address,uint256,uint256,uint256,bytes32)", +"42173c98": "purchaseCompany(bytes32,bool)", +"42193473": "DUST_LIMIT()", +"421983d7": "confiscate(address,address)", +"421a5727": "stealPot()", +"421ae949": "thawTokenTransfers()", +"421aeba2": "setEditedFalse(address)", +"421aeda6": "Set_your_game_number(string)", +"421b2395": "UltiCoinICO()", +"421b2d8b": "addUser(address)", +"421c0d9c": "unregisterDsp(address)", +"421d72e2": "isPaymentForked(uint256)", +"421db384": "leftICOTokens()", +"421e2dc2": "getPartnerAmount(address)", +"421e52e3": "card_gold_minamount()", +"421ed7dd": "balancesInitialized()", +"4220324b": "mainSaleStart()", +"42207083": "getGameRoundOpen(uint256,uint256)", +"4221115c": "SfomoToken(uint256,string,string)", +"42226e02": "setMaxEth(uint256)", +"4222e211": "getPhaseState(uint256)", +"42235da6": "minimumTarget()", +"4223ac0f": "ABCToken()", +"4223ad89": "NewRefundTransaction(uint256,uint88)", +"4224f2ca": "HzxhcToken(address,address)", +"42261ea4": "cancelSale(address[])", +"422624d2": "destroycontract(address)", +"422627c3": "getDna(uint256)", +"42263aa2": "set_token_address(address)", +"422752bf": "getPartialAmountFloor(uint256,uint256,uint256)", +"42279e82": "removeFromPreSaleRefunds(address,uint256)", +"422810ea": "transData(address,uint256,bytes)", +"42285bc5": "_ensureRef(address)", +"42287b66": "createPromoPerson(address,string,uint256)", +"4228974c": "Videos()", +"4229616d": "collectPercentOfFees(uint256)", +"4229c35e": "setItemPrice(uint256,uint256)", +"422b00bb": "dataentryclerk()", +"422b1c70": "setMinweiAmount(uint256)", +"422b423e": "getCheatWarrant()", +"422b7964": "_approve(uint256,address)", +"422c29a4": "getWallets(address)", +"422c3ad9": "changeEndTime(address,uint256,uint256)", +"422cbb48": "MarkosToken()", +"422d3374": "tbitfwdToken()", +"422d37c4": "mintWithEvent(int256,address,uint256)", +"422d4cd6": "increasePayout(uint256,uint256,uint256)", +"422dabac": "allocateEther(uint256,address)", +"422e33f3": "migrationNewAddress(address)", +"422e82a7": "EthToCoins1()", +"422f1043": "addLiquidity(uint256,uint256,uint256)", +"422f3a2c": "nestedFirstAnyToSome(uint256,uint256)", +"422fcbd5": "MCST()", +"4230bb10": "badgeLedger()", +"42317bbc": "flipRefundSwitchTo(bool)", +"42318e3d": "percent(uint256,uint256)", +"4231a2c3": "getLastRound()", +"4231e2d7": "transferFreezership(address)", +"4231ee16": "addInBountyProgramMap(address)", +"42320732": "allSupply()", +"423252f9": "buscarDocumentoPorTitulo(bytes32)", +"4232a399": "XC()", +"42340458": "disable(uint8)", +"42346c5e": "parseInt(string)", +"423592ce": "startTde()", +"4235e336": "BetDirectory()", +"4235e98e": "Buy(uint8,string,string)", +"42367389": "test_twoValidEqInt2()", +"4236b312": "dealContract(uint256,string,uint256,uint256,string)", +"4236da98": "INTREPID_PRICE_INCREMENT()", +"42382353": "restartTheQueue()", +"4238b84c": "DMBToken()", +"423948fd": "changeCollateralAmount(uint256)", +"42399220": "setCampaignOwnerById(bytes32,address)", +"423a7954": "developerfee()", +"423a968d": "_setRSPScienceAddress(address)", +"423b1ca3": "battleContract()", +"423c3a48": "burnTokens(address,address,uint256)", +"423c485a": "depositFee(uint256)", +"423d4ef2": "createChannel()", +"423da88e": "Unix_Timestamp_Binary_Trading(uint256)", +"423dcf29": "dustToEtherPrice()", +"423e1298": "setDoNotAutoRefundTo(bool)", +"423e7e79": "_dispatchEarnings()", +"423f0b6e": "replaceModule(address)", +"423f6cef": "safeTransfer(address,uint256)", +"423fb140": "CrowdsaleToken(string,string,uint256,uint256)", +"423fcd5e": "_promo()", +"42402c2c": "fipsTransferMulti(bytes20[],address)", +"4240a978": "ICO_TILL()", +"42419336": "ICO_BONUS_RATE()", +"42427bf8": "upgradeController(address,address)", +"4243cb36": "payConversionFromTransaction(uint256,address,uint256)", +"4244e09f": "getBetterBettingInfo(address)", +"4245508a": "getRoundMaxNumberOfBets(uint256)", +"424592ca": "calculateDistributedIntervalEarning(uint256,uint256)", +"424599c4": "seedSaleTokenLeft(address)", +"4245b0f7": "Lottery()", +"4245d48e": "getHashes()", +"4245f3da": "tokenOfOwnerByIndex(uint256)", +"42465a1e": "getTokenUnits(address)", +"42469e97": "_setBonusRate(uint256)", +"4246ad24": "calculateMinedCoinsForTX(uint256,uint256)", +"4247f52d": "DoRoll()", +"4248083b": "approveUser(address,uint256)", +"4248aefe": "awardMiniGamePrize()", +"4248afe8": "addCrowdSaleTokensMulti(address[],uint256[])", +"424976f9": "registryRead(bytes32,bytes32)", +"42498389": "transferLimitedFundToAccount(address,uint256)", +"424a8993": "selectOfferingProposal(uint8)", +"424a8c0d": "constructorReconToken(address,string,string,uint8,uint256,bool,bool)", +"424aa0e5": "StockusToken()", +"424b828f": "CharityReservesWallet()", +"424bc2e9": "newGame(string,string)", +"424d6bb1": "changeApi(address,address)", +"424ddaac": "get_available_interest_amount()", +"424e418f": "setMinSecondaryAmount(uint256)", +"424e94da": "VoteHub(address)", +"424ea3b2": "refund_deposits(string)", +"424ea872": "startTimestampIco()", +"424eb9fe": "getInitBalance(address)", +"424f4fef": "vendingMachine()", +"424f9947": "privateIcoBonus()", +"424fa9ec": "Prismacoin()", +"424fed48": "EBPtandardToken(uint256,string,uint8,string)", +"424fffda": "updateContact(string)", +"4251447a": "WhiteListSet(address,uint256)", +"42516f1d": "startAirdropBy0Eth()", +"425189e0": "getFashion(uint256)", +"4251a7a4": "totalNihilum()", +"4251ecb4": "nMsg()", +"42526e4e": "bytesToAddress(bytes)", +"425432b1": "tokensPerAddress(address)", +"42545825": "hasVoted(address,uint256)", +"4254704f": "TOKEN_CLAIM_WAIT_PERIOD()", +"4254b155": "register(bytes32,string,address,address,address)", +"425543f1": "CreateDummyPlayer(bytes32,uint8,uint256,address)", +"4255e808": "jackpotContract()", +"42565405": "setNeuroChainAddress(string)", +"42569ff3": "limitedPrinter()", +"4256dbe3": "setReserve(uint256)", +"4256fa5a": "timeToBorn()", +"4256fa9f": "exchangeTokens(address,uint256)", +"4257347e": "freezeAccountToken(address,uint256,uint256)", +"42577935": "createPanda(uint256,uint256)", +"4257d3e0": "currentGameBlockNumber()", +"42585b34": "getSnap(uint256)", +"42587795": "deploySimpleContract(string,string,uint256)", +"4258cb76": "Ultracash()", +"4258d771": "funding_ended()", +"425946e3": "setCurrentMember(address)", +"4259701b": "getSocialAccountPw(bytes32,bytes32)", +"4259b52e": "configurationCrowdsale(address,uint256,uint256,address,uint256[],uint256,uint256,uint8)", +"425adae7": "isBonusEnabled()", +"425d4980": "mintAddress()", +"425d512a": "setDAOContract(address)", +"425e0d3c": "BasicToken(uint256,string,uint256,string)", +"425ef4b5": "modify_str(string)", +"425f7857": "taxTokenCreated()", +"4260c779": "start_ico()", +"42616d21": "goldTotalSupply()", +"42618b91": "buyRoundKey(uint256)", +"426201ef": "lastBlock_v19()", +"42623360": "stakeOf(address)", +"426365ad": "setForceOffsetAmount(uint256,uint256)", +"42636c09": "existIdAfterVersion(bytes32)", +"4263ed83": "hasNextSeedHashA()", +"4264b4e0": "ownerPayout()", +"4266806b": "cf1Wallet2Pct()", +"4266873f": "setAicPrice(uint256)", +"426695c6": "getDeedId(bytes32,uint256)", +"4267e19c": "getOwnedTokensIndex(uint256)", +"42686bbe": "GetPartLimit(uint8,uint256)", +"4268a257": "updateRoundInformation()", +"4268db7d": "cite(string,string)", +"4269d8ef": "_safeSend(address,uint256)", +"426a0af3": "updateManyLandData(uint256,uint256[],string)", +"426a8493": "approve(address,uint256,uint256)", +"426aa87f": "deleteRecording(uint256)", +"426ad3f5": "getChainName(uint32)", +"426b7113": "tokensSoldPre()", +"426bc60c": "Educoin(uint256,string,uint8,string)", +"426d4f22": "expandNegative128BitCast(uint256)", +"426d5ef1": "oraclizeCallbacks(bytes32)", +"426d70fa": "isPrivateIcoActive()", +"426dd27c": "getGroup(uint256,uint256)", +"426e0b20": "daoStakeClaimed()", +"426e5ae6": "senderTokenBalance()", +"426e6f8e": "updateValueAndMint(uint256,uint256)", +"426eae45": "bondingManager()", +"426eb017": "uri(address)", +"426f5531": "maxAllProfit()", +"426f8f6b": "viewNumberOfRequests()", +"426fa499": "isIcoStarted()", +"426fe411": "contributorDeposit()", +"4270d48a": "nextmarketoffer()", +"42714978": "removeInvestor(address)", +"427163dc": "refundBid(bytes32)", +"4272f2d5": "heroTokenContract()", +"4273601c": "factoryOwner()", +"4273bc59": "bids_sorted_refunded()", +"42740286": "maxMintPoS()", +"42750020": "tokensCreated()", +"42753e7e": "isInSale()", +"4276016f": "oversightAddress()", +"427654da": "getDailyLimitUsed()", +"42767018": "smallRate()", +"4276d082": "FrozenEther()", +"42772947": "callEndRoundControl()", +"4277b5b1": "check(address,address,address,uint256)", +"4277e497": "PaymentRejected(address,bytes8,uint256)", +"4277e823": "TravelHelperToken(address,address,address,address,address,address)", +"42787798": "grantedContracts(address)", +"4278ff31": "setTangibleAssetAddress(address)", +"427913f2": "getClaimedFinancialData()", +"4279523e": "serviceChangeOwner(address)", +"427982f2": "tokenSaleMax()", +"427a2fc2": "getClaim(uint256,uint256)", +"427ac5e4": "checkForUpdates()", +"427b59d3": "HiPrecious()", +"427b72fc": "proofFailed(address,uint256)", +"427c854d": "_createSkull(uint256,uint256,uint256,address)", +"427c9aca": "LogPayoutFailed(address,uint256,uint256)", +"427d5f2e": "tierAmountCaps(uint256)", +"427da275": "redeemUTXO(uint256,bytes32[],bytes,bool,uint8,bytes32,bytes32)", +"427e024a": "AdministratorRemoved(address,address)", +"427e332f": "lastBlock_a8()", +"427eebfc": "returnOwnershipOfToken()", +"427f0b00": "roundInfo(uint256)", +"427f56ff": "bonusAllocAddress()", +"427f9614": "getReference(bytes32)", +"427fa1d2": "getLastNode(address)", +"427fc2df": "preIcoPeriod()", +"4280606b": "addCondition(bytes32,bytes32,address,int256,bytes32,address,int256,bytes32)", +"4281267b": "buyLCARS()", +"4281a651": "SponsoredItemGooRaffle()", +"4281b13f": "getAllbetByNum(uint8,int8)", +"4281b34b": "play(uint256,uint256[])", +"42836c2e": "hasAddress(address,address)", +"4283fbe5": "dummyGasBurner()", +"42842e0e": "safeTransferFrom(address,address,uint256)", +"42846c09": "Bonus(address)", +"42849570": "myReward()", +"4285d477": "teamTokensFreeze(address)", +"428657f7": "storeNewVesting(address,string,uint256)", +"4286ed3e": "callBtoWithStc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"4287eef9": "fechStageBlockByIndex(uint256)", +"4287f14a": "teamReserve()", +"428840f6": "fadd()", +"4288d759": "betOf(address)", +"4289c781": "setSellPrice(uint256,string)", +"428a2ece": "createTokenVault(uint256)", +"428a8120": "tier0Total()", +"428afcd1": "setUpgraded(uint256)", +"428be33f": "ReleaseFundsAndTokens()", +"428c91ae": "genAddressFromGTIN13date(string,string)", +"428d189c": "takeTokens(uint256)", +"428d475a": "beConstant()", +"428d5630": "mintOnDemand(address,uint256)", +"428d64bd": "getShares(address,bytes32[])", +"428e2d64": "getMsg(address)", +"428e357b": "getUInt8(bytes32,bytes32)", +"428e5aaa": "addToPrize()", +"428eb006": "batchAirdropWithLock(address[],uint256,bool)", +"428eb5cf": "getRandomNumber(int256,int256)", +"428f180c": "minimumSpend()", +"428f4146": "SimplePHXExchange()", +"42906029": "newManager()", +"42909a9e": "create_game()", +"4290a5b9": "uninject(address)", +"4290bd4d": "isTokenOfferedToken(address)", +"4290db52": "burnFromAnotherAccount(address,uint256)", +"4290e6b6": "setTokenName(address,uint256,string)", +"42915914": "test_dispersal()", +"4292327c": "_isMyLeague(uint8)", +"42923409": "ArinToken()", +"4292a797": "ZAZA()", +"4293253c": "tokenSaleLowerLimit()", +"429374f3": "ScorpioCoin(address)", +"42946d88": "getIGOAccoountByAddr(address)", +"4294857f": "isRevoked(bytes32)", +"42948e18": "getSenderAddress()", +"4294bea0": "BarcelonavsRoma()", +"4294cdb2": "BixcPro(uint256,string,uint8,string)", +"42958b54": "issue(address[],uint256)", +"42966c68": "burn(uint256)", +"4296a9cb": "getNodeRightChild(bytes)", +"4296b4a7": "freezePlayer(address)", +"42974b1e": "freeReferralPacksClaimed()", +"42980e20": "LifeToken()", +"429838e0": "Allow_Entries()", +"42992dd5": "icoStartTimestampStage2()", +"4299431e": "REALMock(address)", +"42995e12": "canReceiveMintWhitelist()", +"4299c213": "lastReading(address)", +"4299f706": "PonziScheme(uint256)", +"429a2591": "convertAmountToTokens(uint256)", +"429aa0a4": "DAILYC()", +"429adcb9": "minSumICOStage7USD()", +"429b62e5": "admins(address)", +"429b92bf": "getProposalName(uint256)", +"429c1561": "setReputationProblems(address,string)", +"429c6e5b": "getClaimedAmount(uint256)", +"429cddca": "selectOwnerAddressForTransactionFee(address)", +"429d15ba": "testCorrectFunctionIsCalledOnTransfer()", +"429d6a69": "walletBeneficiary()", +"429f3b48": "blockAccount(uint256)", +"42a04fea": "getBadges()", +"42a173a5": "transferByCasino(address,address,uint256)", +"42a1928b": "initSale(uint256,uint256,uint256)", +"42a19c71": "giveProjectTokens(address,uint256)", +"42a1f3eb": "ProvToken()", +"42a37176": "showMyEtherBalance()", +"42a38a00": "mediatorWallet()", +"42a4af66": "updateCatReleasePrice(uint32,uint256)", +"42a5000d": "startPRESALE()", +"42a63361": "updateTribeProducts(address)", +"42a657fd": "primaryListing()", +"42a6617d": "stepTwoRate()", +"42a66f68": "totalRate()", +"42a6739b": "acceptRandom(bytes32,bytes)", +"42a6b21a": "getContributionLimit(address)", +"42a6c4dd": "getBidByToken(address,uint256,uint256)", +"42a745cb": "testBitEqualSuccess()", +"42a787fa": "determinePlayer(int128,uint128,uint8,bytes32,bytes32)", +"42a7a8e0": "SmartzToken()", +"42a7c40e": "ThiccCoin()", +"42a7cfd5": "naturalUnit()", +"42a8f2f4": "internalTransfer()", +"42abfde8": "getLunckyIndex(uint256)", +"42ad2c6f": "maxPreIcoDuration()", +"42ae07c0": "RateRemove(address)", +"42ae0a16": "crowdsaleBalance()", +"42aeba30": "Shipment(address,address,string,string,int256,int256,uint256,uint256)", +"42af2478": "PartialFundsTransfer(uint256)", +"42af4821": "TUDOR()", +"42af8f0c": "buy(uint256,uint256,address,address,address)", +"42b053ce": "SyedaMahaAliTestCoin()", +"42b07d6d": "cashBackFromProject(address)", +"42b1295a": "addMultipleAllowedAddresses(address[])", +"42b2106c": "FoundationTransferred(address,address)", +"42b222bd": "showTokenValue(address)", +"42b31b1f": "Elythrium()", +"42b38674": "isValidValidatorSignature(address,bytes32,address,bytes)", +"42b41aa4": "sendCoin(address,address,address,uint256)", +"42b4632e": "canPropose(address)", +"42b4807a": "getRegionCoordinates(uint256)", +"42b4ef95": "Helper()", +"42b50a7a": "getOrderById(uint256)", +"42b594cb": "buyTicketByEth(uint256,bytes32,bytes32,bytes32)", +"42b5a2a9": "maxTxGasPrice()", +"42b614a9": "round_after()", +"42b64a59": "VisionX()", +"42b8c415": "balanceTotal()", +"42bb5709": "FundsTransfer()", +"42bb66c4": "setInvest(uint256,uint256)", +"42bd0959": "setIsBuyByAtom(uint256,uint128)", +"42be5eea": "thing(string,string,uint8,string)", +"42be9307": "changeSale(bool)", +"42beb58b": "setPreSaleOff()", +"42bf1270": "cslToken()", +"42bf41ae": "drainStrayEther(uint256)", +"42bf4431": "orderMatchTest(uint256,uint256,uint256,int256,uint256,uint256,address,address,int256)", +"42bf5347": "getUserFreezeInfo(address,uint256)", +"42bf8db3": "getRate(string,uint64)", +"42bff0d0": "setExchangeAdapterManager(address)", +"42c01f66": "setRateEarlyStage3(uint256)", +"42c102a5": "GetSnail(address)", +"42c1867b": "mintAgents(address)", +"42c1ea29": "evidenceInterval()", +"42c23db5": "AddToDividends(uint256)", +"42c2d31a": "EtheremonToken(address,address,address,address)", +"42c304be": "accountsListLength()", +"42c3301a": "showJackpotThisRd()", +"42c469e0": "GameSpiritCoin()", +"42c501a1": "LogOwnerTransfer(address,uint256)", +"42c50f75": "TeamMembersAmount()", +"42c549c0": "getMilestones(uint256)", +"42c5d7ad": "sendAdvisorsBalance(address,uint256)", +"42c62865": "withdrawsCount()", +"42c62882": "getMyDividends(bool)", +"42c6498a": "genesisTime()", +"42c65ae5": "eUSD()", +"42c69566": "get_address(address,string)", +"42c71f1d": "getApp(bytes32)", +"42c74c73": "EPVToken()", +"42c7551e": "tokenRemain()", +"42c7ea5f": "totalNumberAvailable()", +"42c80fc9": "isUpgraded()", +"42c81f45": "MLB_Legal()", +"42c8705b": "Mine()", +"42c87205": "VirgoContract()", +"42c96767": "EtherHiLo()", +"42ca08cf": "applyFadeoutToOptions(uint32,uint32,uint32,uint256,uint256)", +"42ca2fe3": "FCOIN1110Token(uint256,string,string,uint256)", +"42cb1fbc": "ETHER()", +"42cbb15c": "getBlockNumber()", +"42cc6b04": "addAuthorizedEditAgent(address)", +"42cde4e8": "threshold()", +"42cdfe37": "tokenWithdrawEther(address)", +"42ce0555": "DisableSuicide()", +"42ce0aff": "registerAndValidateToken(address,string,string,uint256,uint256)", +"42ce0f30": "testThrowUpdateLatestRevisionNotOwner()", +"42ce1488": "upload(string)", +"42cf0a4b": "increaseEthBalance(address,uint256)", +"42cf0e72": "searchByOwner(address)", +"42cf2f81": "getSequence(bytes)", +"42cfd792": "postJob(uint256,uint256,uint256,bytes32)", +"42cffda9": "TREETOKEN()", +"42d01878": "keyRequired()", +"42d02b30": "HARD_CAP_IN_TOKENS()", +"42d16748": "getMinDailyWithdrawalLimit()", +"42d1b202": "_adoptSameClassAxies(address,uint8,uint256,address)", +"42d1f17f": "bankrollerTable()", +"42d2c127": "getStagesBeginEnd()", +"42d46a9a": "castVote(uint256,uint256,bytes32,string,bytes32)", +"42d544fb": "disallowSale()", +"42d596e0": "isPoint(int256,uint256,uint256)", +"42d64601": "pacifistmasterReq()", +"42d7cc8e": "Tx(address,uint256,string)", +"42d8f5be": "customPayment(address,uint256)", +"42d928fc": "SWIFTSCO(address)", +"42d9643c": "KYCLimitValue()", +"42da3b6b": "getAmount(uint256,address)", +"42daedea": "win_by_timeout()", +"42daf6ee": "icoStartP6()", +"42db2fba": "renounceRecoverer()", +"42dbad44": "makerOf(string)", +"42dbcdba": "weiRaised(address)", +"42dca9ea": "getManifestIdsByRegistrant(address)", +"42dd519c": "getClients(uint256)", +"42dd96f7": "killswitch()", +"42df7085": "ROLE_EXCHANGER()", +"42dfb036": "calcRateFromQty(uint256,uint256,uint256,uint256)", +"42e06ee7": "HotCold()", +"42e11316": "claimReadership(uint256,string)", +"42e1452a": "PolarisUniversalToken()", +"42e15c74": "managedTokenLedger()", +"42e16015": "AddedBlackList(address)", +"42e296d3": "soundEffects(uint256,uint256)", +"42e2d18c": "presaleIsRunning()", +"42e2da09": "QuantorPreSale(uint256,uint256,address,address,address,uint256,uint256,uint256)", +"42e2f54c": "shutDownFund(address)", +"42e35f63": "addGoal(string)", +"42e3b919": "NMFToken()", +"42e49d5a": "FUNDING_GOAL()", +"42e4d72b": "oxen()", +"42e5033e": "mainSaleEndDate()", +"42e59afa": "reloadRound(address,uint256)", +"42e5b9f1": "totalDistributedDividends()", +"42e5d5c8": "getPI_edit_17()", +"42e5da0d": "UpdatePlatformContract(string,address)", +"42e6377f": "LabtorumToken()", +"42e6c88a": "approveObjectReception(uint256)", +"42e7ba7b": "hasManagerAccess(address)", +"42e8051c": "testExternal()", +"42e81b0c": "dislikeCelebrity(uint256,uint256)", +"42e86d27": "callData(address,bytes)", +"42e90c33": "Store()", +"42e94c90": "contributions(address)", +"42e9555e": "getProviderLastSupplyID(uint256)", +"42e956f6": "addtoMarketingBusinessDev(address,address,uint256,uint256)", +"42e9c6ce": "pullTokens(address)", +"42ea74c0": "getTokenPriceInWEI()", +"42eabc29": "posibleRedemptionOf(address)", +"42ead91f": "getMegabox(uint256)", +"42eafaf5": "showFPInfoAll()", +"42ec38e2": "tokenOf(address)", +"42ed00da": "getSenderArmyDetails()", +"42ed567c": "tmpQuerySeed(uint256,uint256)", +"42ed5816": "ethDailyLimit()", +"42ed6072": "publicBattlepm2()", +"42ee4e0b": "ICO_PRICE5()", +"42ef4c1a": "hodlerTime6M()", +"42ef8c76": "alsToken()", +"42efdebf": "exchangeAdmin()", +"42f030e4": "minusTourFreezingTime(uint256)", +"42f0b07e": "BountyFund()", +"42f0ca0d": "setPreSaleEndDate(uint256)", +"42f1181e": "addAuthorizedAddress(address)", +"42f362aa": "registerNameCore(uint256,address,uint256,bytes32,bool,bool)", +"42f39381": "presaleRate()", +"42f39a6f": "ARXPackageSale()", +"42f3f7e0": "activate_reserve()", +"42f45790": "testAddress(address)", +"42f57e4c": "enableUser(address,bool)", +"42f5b7e0": "setGenome(uint256,uint256[4])", +"42f5d95d": "AllUnLock()", +"42f6208e": "lock(address[])", +"42f6487a": "payment()", +"42f6e389": "isModule(address)", +"42f81580": "CLAIM_DEADLINE()", +"42f85ce5": "pay(address,uint256,uint256[])", +"42f88548": "updateRegionPixelPrice(address[16],uint256,uint256)", +"42f88699": "ExShellToken()", +"42f9192a": "nameFilter(string)", +"42f91e9e": "BcxssToken()", +"42f989e2": "setUnlockTimeStamp(uint256)", +"42f98b14": "buyIssuerTokens()", +"42f9b306": "teamLockTransfer(address,uint256)", +"42fa3967": "toSlice(bytes,uint32)", +"42fa98e0": "Orange()", +"42fba0f5": "grantedTokensHardCap()", +"42fbbc9c": "managerPercentage(bytes32)", +"42fc63be": "DebugHash(bytes)", +"42fd6acc": "checkProof(bytes32[],bytes32)", +"42fd7d4c": "_buy(address)", +"42fdbed7": "isDeDeContract(address)", +"42fea02b": "confirmPayer(uint256,uint256)", +"42feba84": "arbiterResponseRate(address)", +"42ff1c1a": "getMetadataURL()", +"42ffb76b": "getWorkflowName()", +"4300705d": "withdrawGTO()", +"4300e8ef": "addContract(address,string)", +"4301b55b": "MintOpened()", +"4301cbe5": "getAllNames(string)", +"43021054": "BTestToken(address,string,string,uint256,uint256)", +"43021202": "fundValuePublish(uint256,uint256,uint256)", +"4302b3c8": "myTotalSupply()", +"43031e9b": "getSumOfPlayers()", +"4303707e": "generateRandomNumber(uint256)", +"43039433": "handleReturnData()", +"43046844": "placeBet(uint8)", +"4304a43f": "updatedBalance()", +"4304a6b9": "setUnfreezeStartTime(uint256)", +"430558c2": "buyGifto()", +"43062beb": "getAvailableTokensToSellTillPhaseIdxValue(uint256)", +"43062ea7": "changePurchaseCap(uint256)", +"430694cf": "getProposal(bytes32)", +"4306cc3f": "queryEarnings(address)", +"4307d081": "jazzxToken()", +"4308a36b": "getIcoPrice()", +"43090357": "readUserPurchasedToday(address)", +"4309b4b2": "getPollIdentifier(address,bytes32,bytes32)", +"430a74b7": "CrypcenToken()", +"430ab56a": "sendAllLocalEthers(address)", +"430ae7a2": "AvtcToken()", +"430bf08a": "vaultAddress()", +"430c2081": "isApprovedOrOwner(address,uint256)", +"430c2a69": "crdjetToken()", +"430c73c5": "setMarketAddress(address,address)", +"430c9247": "changeDebt(address,uint256)", +"430ca46f": "finishAuction()", +"430d2803": "getTotalPossibleTokens()", +"430d6eb2": "ParadiseToken(address)", +"430de98a": "GetCardNumber(uint8,uint8)", +"430e484a": "setupNetwork()", +"430ecff8": "blksze()", +"430fe5f0": "changeWorkerPrice(uint256)", +"430fe9c1": "getDate()", +"4310033d": "Gotoken()", +"43102eab": "isItConstantinopleYet()", +"43104d92": "addMultipleRecordsStrict(uint256[])", +"43107290": "createRequest(address,address[],int256[],address,string)", +"43114842": "acceptChallenge(uint256,uint256,uint256)", +"4311de8f": "ownerWithdraw()", +"43128a4c": "feeUSD()", +"4312f19c": "setTransferEmittables(address,bool,bool)", +"4312fece": "addAddressToIndex(address,address)", +"43133b07": "gameBeginPlayNo()", +"4313b9e5": "setup(uint256)", +"4313de82": "closeBidOrder()", +"4314162d": "untsqm()", +"431454fb": "totalMintedBountyTokens()", +"43146f36": "resetBet()", +"431562b9": "countWithdraws()", +"43156db6": "withdrawOldToken(address,uint256)", +"4315f545": "proofType_NONE()", +"43160e3d": "rootOfTrust()", +"4316abbb": "newJester(address)", +"4316fae5": "NABC()", +"43171485": "tokensHasSoldOut()", +"4317f04a": "Transfer(address,string,address)", +"431851ad": "NenoToken()", +"431993b9": "endPrivate()", +"4319dfd9": "defence(address,uint256,uint16,bytes,uint256[])", +"431a4d46": "getContractSample(string)", +"431ab1f2": "xmasFundWallet()", +"431ab233": "allOperations(uint256)", +"431adcb1": "isSellOpen()", +"431bff74": "MINING_POOL_AMOUNT()", +"431cc3dd": "batchWithdraw(address[])", +"431d6256": "Conversion(address,address,address,uint256,uint256,uint256,uint256)", +"431dac16": "registerUser(address,string,uint256,uint256,uint256,string,bool)", +"431dbd9e": "getLatestRaffleInfo()", +"431dc4b6": "current_period()", +"431dc892": "OwnedProxy(address)", +"431e0a48": "AnteilToken()", +"431e83ce": "absMaxFee()", +"431ec601": "get_exchange_count()", +"431ef9b5": "OptionsConversionOffered(address,address,uint32,uint32)", +"431f188c": "set_presale_arbits_per_ether(uint256)", +"431f21da": "createAuction(uint256,uint256,uint256,uint256)", +"431f63c9": "setTokenPrice(address,uint256)", +"4320ea1c": "CrowdsaleBase(uint256,uint256,uint256,address,address[])", +"43212413": "Addr2()", +"43212c3c": "getHighestMilesAt(uint256)", +"43214675": "setMintAgent(address,bool)", +"43216a11": "MAX_NUM_AVAIL()", +"43226631": "CURRENTLY_ISSUED()", +"4322b73b": "getAdd(uint256)", +"43235a24": "_transferProperty(uint16,address,uint256,uint256,uint8,address)", +"43243797": "fundsOf(address)", +"43245816": "tokensToEther_(uint256)", +"43245953": "CoinToken(uint256,string,uint8,string)", +"4324aa21": "classOf(uint256)", +"4324ae4f": "PhoenixExchangeDeposit()", +"4325f6bb": "OfferToCastle(uint256,uint256)", +"432607fc": "cancel(address,address,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"4326e22b": "getMerkleTreeRoot(bytes20,uint8)", +"4326f3f6": "setMinimumPriceCount(uint256)", +"4327115b": "_AddedToGeneration(address,uint256)", +"4327979a": "getPaymentParams(uint8)", +"4327acda": "addDeal(address,address,address,uint256,uint256,uint256,uint256,string,uint256)", +"4328894f": "showReportForMonth(uint16,uint8)", +"4329db46": "transferETH(uint256)", +"432a042b": "makeRegistration(bytes32)", +"432a3dfb": "roundState(uint256,uint256)", +"432a805b": "changeDailyRate(bytes32,uint256)", +"432a84d9": "ownerDepositInterest()", +"432a89aa": "GetBuildingParam(uint256)", +"432af6e9": "calculateTokensForMonth(address)", +"432b3f85": "fetchVoteResultForCandidateBySnapshotBlock(address,uint256)", +"432ba8be": "voterToBallotID(address)", +"432c4209": "IQT_DECIMALSFACTOR()", +"432c685f": "trustClient(address)", +"432ce549": "sendToUser(address,address,uint256)", +"432ced04": "reserve(bytes32)", +"432d7a1e": "_dividendsOutstanding(address)", +"432e83c5": "resetReferedCount(address)", +"432e8946": "disableTransfer(address)", +"432f0d20": "EVA(uint256)", +"432f3223": "AceFund()", +"432f3c22": "request_until()", +"43302ff3": "getMaintainFee()", +"4330301f": "_ratio()", +"4331576f": "BITVM()", +"4331e00f": "pay_claimed(address)", +"4331e8dd": "setLeader(address)", +"433288a2": "setCurrency(string,address,address,uint8,bool)", +"4334614a": "isBurner(address)", +"4334a8a5": "CHAD()", +"433503f6": "ChangeEmissionSumm(uint256)", +"4335b046": "CRAWDSALE_EARLYBIRD_END_DAY()", +"4335dfc0": "getPurchaseTimestamp()", +"43361a6e": "MineralBase()", +"4336a5a8": "EtherGold()", +"433740f8": "Purchase(address,uint256,uint32)", +"4337b391": "PriceDiscovery(address,address)", +"433836dc": "scheduleTransaction(address,bytes,uint8,uint256[3],uint256)", +"43386ea9": "getUniqueValue(uint256)", +"433900db": "presaleTokensLimit()", +"433914c9": "VeChainX()", +"43398685": "BancorFormula()", +"4339bc30": "changePool(address)", +"433a8323": "UnityCoin()", +"433adb05": "tokensReserved()", +"433b409f": "BTTSTokenListing(address,address,string,string,uint8,uint256,bool,bool)", +"433b64b1": "eventId(uint256)", +"433b77c7": "getCampaignOwnerById(bytes32)", +"433bb0e4": "fillOrder(address,address,address,bytes32,address,address,uint256)", +"433bd924": "getBreed(uint32)", +"433c39ff": "transferVoteController(address)", +"433cdc26": "PriceAdjusted(uint256,uint256)", +"433d0f33": "canUserCancelArtwork(address,address)", +"433d4aab": "resolve(uint8,uint8)", +"433d7110": "provas(address)", +"433e852d": "flushDividends(uint256)", +"433fc1da": "Bandit()", +"43406182": "enableLotteryGiveHunt()", +"43409bc5": "linkData(bytes)", +"4341274f": "_sameClassAxiesPrice(uint8,uint256)", +"4341aebc": "distributeTokensToRank(uint256[],uint256)", +"434253ff": "createItem(string,address,uint256,uint256,uint256,uint256)", +"43428e45": "minimumNumberOfBlocksToEndGame()", +"4342e966": "approve(address,uint8)", +"4342ffe5": "changeMinimumContributionForPrivatePhase(uint256)", +"4343ede6": "currentStageNumber()", +"43441a2c": "totalGivenBountyTokens()", +"4344f73d": "AssToken()", +"4345c7c9": "_upgradeTo(string,address)", +"434622fe": "additionalMint()", +"43463b98": "getconf()", +"43463c3a": "UnityToken(uint256)", +"4346aa58": "ITTM()", +"4346ea77": "PrimasToken()", +"43471101": "getSenderFunds(address)", +"434786f4": "getBalacne()", +"434847e0": "withDrawFees()", +"4349168e": "GenesisSalesPriceCount()", +"43496568": "timeLock(address)", +"434a55eb": "bonusFirstTwoDaysPeriod()", +"434afdfc": "totalObol()", +"434b1208": "rescueOrder(uint256)", +"434b14e7": "randomGen(uint256)", +"434b349c": "LCEToken()", +"434b635e": "getMaxBetAmount(uint256)", +"434c4498": "EthperPoe()", +"434cb64c": "startNextGeneration()", +"434d16f5": "rotate_left(uint32,uint32)", +"434d185c": "getKingdomOwner(string)", +"434df07e": "NewSerpent(uint256)", +"434e0618": "addMedicalProviderReply(address,string,string)", +"434e6a55": "addWebsite(address,string)", +"434ea7d3": "_lottery5(uint256,address,address)", +"434ec416": "EXT_COMPANY_STAKE_ONE()", +"434f5f27": "checked_in(address)", +"434f811b": "partIndexToApproved(uint256)", +"434fb2ae": "PRICE_MULTIPLIER_ICO3()", +"435010d8": "SrcToken()", +"43503fac": "getWord(uint256)", +"43509138": "div(int256,int256)", +"43516832": "getSuppliers()", +"43525d73": "MAX_FUNDING_SUPPLY()", +"435263ef": "ecosystemWallet()", +"4352e407": "RozetkaCoins()", +"4352fa9f": "setPrices(address[],uint256[])", +"4353401f": "NetkillerAdvancedTokenAirDrop(uint256,string,string,uint256)", +"43543242": "isSignatureOkay(address,bytes32,uint256[3])", +"4355644d": "addMonths(uint256,uint256)", +"43558826": "exchangequeue(address)", +"43559743": "edgePigment(uint8)", +"4355b9d2": "approveTransfer(address)", +"43562bd0": "NextRewardBonus()", +"4356f35b": "addIntermediary(address)", +"43574d9e": "owner2Of(uint256)", +"4357855e": "fulfill(bytes32,uint256)", +"43579fe8": "deleteShop()", +"4357b3de": "getCrowdsaleTier(address,bytes32,uint256)", +"4357da58": "pausePreSale()", +"4357e20f": "MinSlippageFactorSet(uint256,uint256,address)", +"4357e289": "Multiplexer(address,address[])", +"43581c80": "tdeFundsRaisedInWei()", +"4358630f": "Certificate(address,address,address,address,address)", +"4358c156": "isBonus()", +"43596b8b": "getLLV_edit_25()", +"435a0803": "testNowClock()", +"435a1220": "createERC20TokenNetwork(address,address)", +"435ad5c1": "getMixedStack(bytes32)", +"435adacc": "EtherrateUpd(uint256,uint256)", +"435ae547": "ResumeTokenAllOperation()", +"435afa54": "changeRepoSettings(uint256,uint8,uint8)", +"435bb6b9": "nextJackpotTime()", +"435c35b6": "startGeneralSale()", +"435ce40a": "isAccount(address,address)", +"435cebda": "createMember(address,address,bool,bool)", +"435cf753": "winCount(bytes32,address,address)", +"435dc3fb": "setGenesisAddress(address,address,uint256)", +"435e119e": "SetupRaffle(uint256)", +"435e33a5": "TokenRewardsAdded(address,uint256)", +"435f02f9": "ACIFToken()", +"435ffe94": "setHello(string)", +"4360617b": "Sell(bytes32,address,uint256,uint256,address,address)", +"4360f90f": "getOfferState(bytes)", +"436108ce": "changePasswd(bytes32,address,uint8,bytes32,bytes32)", +"4361443f": "getClaim(address,bytes32)", +"43614f8b": "endFinalStage1()", +"4361b3f9": "TokensCreated(address,uint256)", +"43620f24": "startWork(uint256,bytes32,bytes32)", +"43626c52": "AllInvestorsRefunded(uint256)", +"4362c088": "affiliateLevel()", +"4362c116": "transfert(address,uint256)", +"43634c39": "useSuperPowers()", +"436393ab": "AlrzshTest()", +"4363e888": "withdrawERC20Tokens(address,address,address,uint256)", +"43655fd3": "votesItem(address,uint8)", +"436577ae": "createIssuance(uint256,uint256,uint256,uint256,string,string,uint8,uint256)", +"4365e11e": "BingoLight()", +"43668efa": "ProposalAdd(uint256,address,string)", +"4366af55": "RTC(uint256,string,string)", +"43677ca7": "checkInternalBalance()", +"4367aa3c": "_isReserveUnlocked()", +"4368600c": "initDeposit()", +"436962b4": "_setTarget(address)", +"4369a2c2": "charityAmtToCharity(address)", +"4369c250": "rewardsFactor()", +"436a66e7": "length(string)", +"436a88c1": "DEV_FEE()", +"436b6158": "card2PowerConverter(uint256[])", +"436b8fa5": "Salman_nomaniTestCoin()", +"436d4ff5": "hash(string,address)", +"436d796c": "startPreIco(uint256)", +"436d8fd6": "setGameBanker(address)", +"436da5fe": "transferLog(uint256)", +"436e1e2e": "computeAirdrop(address)", +"436e388d": "enterWallet()", +"436ee4af": "SEEDS_TO_HATCH_1RICE()", +"436f64ac": "rInFp()", +"436fdc0e": "getBattleCardsInfo(uint256)", +"436fedc3": "getRegionUpdatedAt(uint256)", +"43700afe": "strConcat(string,string,string,string,string,string)", +"43703b0e": "getEventData(bytes)", +"437159de": "SYCPrivateEarlyPurchase()", +"4371c465": "isWeekEnd(uint256)", +"4371e46e": "blockCount(uint64)", +"43722993": "NPSTToken(address)", +"43722b09": "extOwner()", +"437257bd": "handlePointer(uint256,int256,uint256)", +"4372df99": "getNotaryForSeller(address)", +"4373f3b4": "setFunding(uint256,uint256,uint256,uint256,uint256,bool,uint256)", +"4374356b": "DRUGS_TO_PRODUCE_1KILO()", +"437583a9": "updateReserveToken()", +"4376890e": "egcToken()", +"437764df": "getBridgeMode()", +"43777117": "getMarketOptions()", +"4377cf65": "numberOfContributors()", +"4377d12c": "ChooseWHGReturnAddress(uint256)", +"437852b6": "getRefererAddress(bytes)", +"4378a6e3": "getAttributes(uint256)", +"437933cc": "setDataFeedHash(string)", +"437a8ae6": "multiple()", +"437b1a1d": "KITTY_BURN_LIMIT()", +"437c58a8": "YourtekToken()", +"437c9162": "pre_mined_supply()", +"437cfa4a": "setContractICOAddress(address)", +"437d07d5": "mktCoinCap()", +"437dbf49": "_isAuctionAble(uint256)", +"437f5b65": "isLUNVault()", +"437f6a4b": "userMakeOrder(address,address,uint256,uint256,address)", +"437fa667": "appAccountsLength()", +"4380ab6d": "clock(bytes32)", +"438195f9": "MAX_WHITELISTED_COUNT()", +"4381a07b": "setCustomDisputeFee(bytes32,uint256)", +"4381e1c5": "verificationAddressHoldersListNumberMap(address,uint256)", +"4383603b": "setAllowHalfLife(bool)", +"43846074": "getPreviousDarknodes(address,uint256)", +"43846fc8": "shortLock()", +"4384d53a": "BunnyCoin()", +"43859632": "hasVoted(uint256,address)", +"43863045": "addUintSetting(string,uint256,address,address,string)", +"438652e0": "addTransferWhiteList(address)", +"4386fe0d": "changeMinTokenSale(uint256)", +"43876776": "setPubKey(uint256,uint256)", +"4387d35a": "lockedWallet()", +"43886946": "getPlayerTeam(uint256)", +"43894ac3": "setMintMarketMakerApproval(address,address,address)", +"438af924": "buy(uint256,bool,uint256)", +"438b2aed": "setSettings(uint256,uint256,uint256)", +"438b7b99": "setProfitRatio(uint256)", +"438b9ff2": "payForUrl(address,string)", +"438c3585": "releaseTokensBlock()", +"438c3aff": "contractIds(uint256)", +"438c9068": "ownersProductCommissionInPerc()", +"438c9509": "test_invalidTokenFreeze()", +"438cd2d3": "UnPause()", +"438d1bd7": "storeBubbleSort(uint256[])", +"438d359e": "buyXname(bytes32)", +"438e1316": "next(uint80)", +"438e15fc": "contains(uint256,uint256)", +"438f1eee": "PowZoneToken()", +"4390921e": "distributeOne(address,uint256)", +"43909d76": "EthCannabis(address)", +"4390a4f8": "batchTransferToken(address,address,address,uint8,bytes32[])", +"439198af": "timeLeftToContestStart()", +"4392281e": "SCTX()", +"43923258": "addAddressToAccessControl(address,uint8)", +"43925cc3": "getRoomPlayers(uint256)", +"43927707": "NehalCoin()", +"43928cfd": "addClient(address)", +"439370b1": "depositEth()", +"4394aaad": "getNextAvailableReward(address,uint256)", +"4394cc96": "versionBase(bytes32,bytes32)", +"43951999": "getReportingWindowForForkEndTime()", +"4395dc06": "getTokenInfoTokenList()", +"43973140": "check_lock_period(address,address)", +"439766ce": "pauseContract()", +"43977911": "addFreezeList(address)", +"4398da85": "tokensPercentageForKeyHolder()", +"4398fbd6": "treeWater(uint256,uint256)", +"439abc5b": "getLockByIdx(address,address,uint32)", +"439b91c4": "addBlockeddUser(address)", +"439be05c": "getLoanFilledAmount(bytes32)", +"439d4265": "recordToTransfer(address,uint256,uint256)", +"439d7275": "issuerSymbol()", +"439e10e5": "createUniqueSpinner(string,address,uint256)", +"439e97c4": "alertCreators(uint256)", +"439f5ac2": "getEndTime()", +"439f7d3c": "getSponsor(uint32)", +"439fab91": "initialize(bytes)", +"43a085c2": "ProsperPresaleToken(address,string,string,uint256,uint8)", +"43a335d6": "CreditCarToken()", +"43a4344f": "calcNetworkFee(uint256)", +"43a44f1e": "bonusTimes(address)", +"43a468c8": "delegateBalanceOf(address)", +"43a47345": "floatHolder()", +"43a47ae2": "EthTermDeposits()", +"43a61a8e": "rootOwnerOf(uint256)", +"43a68f3a": "NegToken(uint256,string,uint8,string)", +"43a6e680": "DonationSentButNotDoubled(address,uint256)", +"43a77530": "serviceAgent()", +"43a78b50": "MyAddress()", +"43a7f749": "getInitialPriceOfToken(uint256)", +"43a8775a": "amountOfBagTypes()", +"43a886ea": "filterBrick(uint256,bytes32[],uint256,uint256,uint256)", +"43a88da6": "buyOpen()", +"43a8d9d5": "authorizeWithdrawal()", +"43a92f24": "getAvatarInfo(uint256)", +"43a98caf": "reinvest(bool)", +"43aa8784": "endedGameCount()", +"43ab599f": "EPSCoin()", +"43ab850b": "setDividends(uint32)", +"43abab26": "whitelist_addys(address[])", +"43acb067": "ChefICO()", +"43acd7bc": "Bailout()", +"43ae2695": "propertyToken()", +"43aefca0": "withdrawThetokens(address)", +"43af755a": "blockedDeadLine()", +"43b03d37": "i(address,address,uint256)", +"43b0e8df": "set(uint256,uint256,uint256)", +"43b114fd": "getMyCoins()", +"43b12e95": "BCEToken()", +"43b1938d": "getPhaseSale(uint256,uint256)", +"43b1c529": "getSig(string,bytes4)", +"43b25452": "createPortfolio(uint256)", +"43b3181c": "AIOS()", +"43b3769e": "checkStatus(address,uint256,string,address)", +"43b37dd3": "executionDailyLimit()", +"43b3aa46": "getTokenAmountOf(address)", +"43b50d8e": "evKickoff(address,uint256,uint256)", +"43b5126d": "getVendingPrice(uint256)", +"43b6c7d0": "setClaimedFlag(bool)", +"43b6caf3": "setMintPerBlock(uint256)", +"43b7d9c8": "ITToken()", +"43b7fd58": "RoomRoundAdd(uint8)", +"43b812ef": "r2VaultAddr()", +"43b89c62": "getTransactionAtIndex(address,uint256)", +"43b8aedf": "gimmeTendies(address,uint256)", +"43b978b3": "playerNames(address)", +"43ba2cf5": "transferPreSaleTokens(uint256,address)", +"43bb6a63": "getmemreqscount(uint256)", +"43bc1612": "artist()", +"43bc867e": "claimStupidFluffyPink(uint64)", +"43bcf52a": "bbdToken()", +"43bd262e": "injectAvatarService(address)", +"43bd6e6f": "changeColorYellow()", +"43bdaacb": "getPlayerInternalWallet()", +"43bddf40": "horses()", +"43bdfb72": "updatedTime()", +"43bf63e8": "priceInWeiEdition(uint256)", +"43bf6756": "getMixItemStore(bytes32)", +"43bf718e": "getHashOfTheProposalDocument()", +"43bf74ef": "setKYC(address,uint256,uint8,uint256)", +"43bff765": "tokensPerMicroEther()", +"43c09e77": "updateNote(uint64,uint16,bytes12,bytes)", +"43c0d38c": "getSlotId(address,uint256)", +"43c14b22": "revokeVote()", +"43c1598d": "maxProfitDivisor()", +"43c1f0ed": "timeBeforeJackpot()", +"43c238db": "POMCOIN()", +"43c273c7": "DevSupply_Released()", +"43c29522": "PUBLICSALE_USD_PER_MSENC()", +"43c33ac9": "submitShares(uint256,uint256)", +"43c35651": "completeCrowdSale()", +"43c3658e": "EmporeumToken()", +"43c37393": "solveTask(uint256,uint256)", +"43c569f4": "TotalWin()", +"43c5d889": "locationOf(bytes,uint256)", +"43c639e7": "ownerResetLockedShares()", +"43c6b1f2": "_transferAsset(address,address,uint256)", +"43c6d558": "SportsBet(string,uint256)", +"43c6e10d": "getAffiliateCommision()", +"43c6eff1": "submitClaim(uint256,uint256,uint256,uint256,bool)", +"43c8124d": "PoolAdvisors()", +"43c885ba": "inited()", +"43c8c30e": "removeModeratorship()", +"43c9a189": "allocate1ProjectToken()", +"43ca46dd": "_ownsToken(address,uint256)", +"43ca57bc": "getRetailerStatus(address)", +"43ca78a2": "getNotaryInfo(address)", +"43ca86c6": "nukeApps()", +"43ca9d26": "onNewCampaign(uint256,address,uint256)", +"43cade1c": "reStartPreIco()", +"43caf0dc": "distroyToken(address)", +"43cb0af7": "getBytesArrayLength(bytes32)", +"43cb2b03": "getCurrentTokenCost()", +"43cb3189": "ETHZToken()", +"43cbbce6": "icoRound2()", +"43cc113b": "holdersBonus(address)", +"43cd1638": "deposit3()", +"43cd2c40": "UpdateForecast(bytes32,bytes32,bytes32,bytes12)", +"43cd5ea1": "sendBussinessByOwner(address,uint256)", +"43cd9655": "XBTexToken()", +"43cdaad2": "modelId()", +"43cdc49e": "unlockTokens(address,uint64)", +"43ce179e": "issueOwnerMore(uint256)", +"43ce7422": "getMyEggs()", +"43cf5f0c": "PunaniSupply()", +"43cfbd65": "getCompanyName()", +"43cfd44c": "recover_unclaimed_bets()", +"43cffefe": "challenge(bytes32,string)", +"43d018a0": "whitelistMaxTok(address)", +"43d0ee54": "userRounds(address)", +"43d111ae": "binScan(uint256,address)", +"43d1498b": "setCoAuthor(address)", +"43d1be7b": "setPresalePhase()", +"43d24a5e": "addUpdater(address)", +"43d2b618": "_removeToken(address)", +"43d32e9c": "getSellPrice()", +"43d3a4c1": "getTotalVoters(uint256)", +"43d42780": "icoSoldTokens()", +"43d4759f": "HuuuumanStandardToken(uint256,string,uint8,string)", +"43d47f82": "ProjectFund()", +"43d4b78b": "stateIsWaitingReplay(uint256)", +"43d5773b": "SpaceCraftCore()", +"43d64976": "OwnershipDeleted(address,address)", +"43d6add1": "accessoryOnLeaderboards(uint64)", +"43d6cac5": "removeTokenMetadata(uint256)", +"43d6ec16": "LIFEFORM()", +"43d6fab6": "RegularContract()", +"43d726d6": "close()", +"43d77c7b": "platContract()", +"43d7bfcb": "mintBountyTokens(address[],uint256)", +"43d7cce6": "getToken(address,uint256)", +"43d84d49": "updateCrowdsaleInfo(string)", +"43d8b570": "isTeamVestingInitiated()", +"43d9e070": "sencSold()", +"43db053e": "withdrawDevShare()", +"43db24ad": "EthereumWings()", +"43db5324": "ownerSetCanMining(bool)", +"43db7821": "BINKEY()", +"43dbb2de": "MAX_ETH_FUND()", +"43dc3ab2": "register(address[])", +"43dc7233": "getTokenCreationRate()", +"43dcbc86": "hasNotaryBeenAdded(address)", +"43dd8b30": "updateWhitelistMapping(address[],address,bool)", +"43ddc1b0": "callETH(address)", +"43de34dc": "impl_cancelRedeem(address,uint256)", +"43de6f90": "createHero(string,uint16,uint16)", +"43de82f3": "revealVote(uint256,uint8,bytes32,bytes32,uint32,bytes32)", +"43deb064": "LemonSelfDrop()", +"43deb8e5": "START_SKO1_UNITS()", +"43ded8e3": "MyGlobeToken(uint256,string,string)", +"43defc10": "getVendorByAddress(address)", +"43defdac": "AudtStandardToken(uint256,string,uint8,string)", +"43e08ad1": "addHash(bytes32)", +"43e09695": "deactivatePass(bytes32)", +"43e0c65a": "allowToBurn(address)", +"43e0dfdd": "Leverage()", +"43e1b94f": "AnyName()", +"43e1eb82": "setSiftContractAddress(address)", +"43e204b3": "isTokenLock(address,address)", +"43e20f97": "getPoolbyGtype(int8)", +"43e271ad": "woodworksCities(uint256)", +"43e2e504": "GetBalance(address)", +"43e332c5": "Last_block_number_and_blockhash_used()", +"43e3e527": "Weko()", +"43e41c44": "Kotlind()", +"43e4cef1": "processPrivatePurchase(uint256,address)", +"43e57976": "EthMsig(address[])", +"43e6125d": "Badge(address)", +"43e6cc40": "issueTokens(uint256[])", +"43e6cc64": "StopToken()", +"43e72c5a": "totalPotHomeTeam()", +"43e74f46": "sendPrepaidEthTweet(uint256,string,string,string)", +"43e76a26": "SellerRequestedCancel(bytes32)", +"43e7aa1d": "commitPhaseLength()", +"43e91384": "setICOEndDate(uint256)", +"43e92866": "reservingPercentage()", +"43ea0313": "setRitualFee(uint256)", +"43ea8d7b": "newWithdraWallet(address)", +"43eb37e2": "initChargeJNT(address,string)", +"43eb5ac7": "getData_21()", +"43ec31e2": "TdToken(address)", +"43ec3f38": "toSliceB32(bytes32)", +"43ed2863": "StandardToken(string,string,uint8)", +"43edcb07": "_itransfer(address,address,uint256)", +"43ee67cf": "_transferFallback(address,uint256,bytes)", +"43f0179b": "takerFee()", +"43f29372": "redeemWinningTokens()", +"43f294a6": "setCrowdsaleStop()", +"43f3d27c": "setPrPercent(uint256)", +"43f415d0": "executeDecayFunction(uint256,int256,int256,uint256,uint256)", +"43f46a5c": "getPolicyState(uint256)", +"43f48fbd": "rates()", +"43f4cb4b": "GetCurrentTypeDuration(uint256)", +"43f58f9f": "createNetwork(string,uint256,uint256,uint256,uint256)", +"43f6c643": "purchaseRequest(uint256)", +"43f6c741": "HGToken()", +"43f70917": "create(address,address,address,address,address,address)", +"43f70f60": "dna5(uint256)", +"43f73a3d": "UpdateCurrency(uint256,string,string,string,string)", +"43f76b98": "generateLuckyNumbers(uint256)", +"43f8c639": "tickets100kprice()", +"43f97628": "EcosystemFund()", +"43f98345": "calculateAllReclaimedNow()", +"43f98a56": "tradingDate()", +"43f99e68": "refundExternalPurchase(address,uint256,uint256)", +"43fb86d2": "getGameLength()", +"43fce818": "createAngelCardSeries(uint8,uint256,uint64,uint8,uint16,uint64)", +"43fd377a": "ChannelNew(address,address,address,address,uint256,uint256,uint256)", +"43fd6b21": "revokeStackholderConfirmation(uint256)", +"43fe32fc": "activateProvider(address)", +"43fedd01": "setDisputeData(uint256[3])", +"44004cc1": "withdrawERC20(address,address,uint256)", +"44013585": "setPaymentTime(address,uint256)", +"44017cd6": "test_BondPostedButNoMajority()", +"44019db3": "testCreateWithParents()", +"4401a6e4": "safeSend(address)", +"4401c905": "INTREPID_PRICE_THRESHOLD()", +"4401ff5c": "sellShares(bytes,uint8,uint256,uint256)", +"440208c3": "right12(uint256)", +"440235c0": "changeTrade(address,address)", +"44030e71": "getIsBlockRevenueCalculated(uint256)", +"44036b6f": "setFeePercentTenths(uint256)", +"44036c41": "getTrustedTransferDestinationValue()", +"4403e2ab": "nextLotteryTTWTokenId3()", +"4403ee2b": "setIFS(address,uint256)", +"44048aa5": "getContributorUSD(address)", +"440574eb": "adminUpdatePayout(uint256,uint256,uint256,bool)", +"4405a339": "logReputationTokenBurned(address,address,uint256)", +"4406bc60": "guessHash(bytes)", +"4406face": "lock(string,string)", +"4406fbab": "NectarCrowdsale(uint256,uint256,uint256,address,address)", +"44074cc7": "MaxCoin()", +"4407a75d": "BasicCrowdsale(address,address,address,string,string,address,uint256,uint256)", +"440878c4": "store(bytes,address,uint256,uint8)", +"4408c38a": "HIKEN(uint256,string,uint8,string)", +"4408f3f9": "place_bet(uint8)", +"44090448": "to(bytes32,uint256)", +"440961c3": "adjustPointsDecayFactor(uint256)", +"44097d70": "costWei()", +"440991bd": "freezeDuration()", +"440a16c4": "SEC(uint256,string,string)", +"440a7a0c": "unblockFirstStake()", +"440a926a": "home(uint256)", +"440adb38": "BullsFundToken()", +"440d2437": "designatedReport()", +"440d2ad0": "PRICELESS()", +"440f19ba": "draw(bytes32,uint256)", +"440f807e": "loadMesa(bytes32,bytes32[],uint8[])", +"4410121f": "test_voteSpammingFor()", +"441156cf": "Plutaneum()", +"4411b8f8": "disputeFavor()", +"4411c36f": "avgTokenlossValue()", +"441230e4": "registerHandle(bytes32,bytes32,address)", +"4412e104": "getZombiesByOwner(address)", +"4413a688": "setPreallocations()", +"4414356b": "sale3Accepting()", +"44146c26": "setExpectedTimes(uint256,uint256)", +"441478c3": "prepareToRewardProcess()", +"4414a5c8": "totalLose()", +"4414d940": "napkinPrice()", +"4415516b": "getType(uint16)", +"4415a0bf": "preSaleDiscountPrice()", +"441628f1": "sendTokensToBountyWallet(address)", +"441666c5": "SimpleContract()", +"441691f2": "LexitToken()", +"44169752": "WALLET_ADDR()", +"4417bc66": "VESTED_TEAM_ADVISORS_SHARE()", +"4417f4db": "burnOWL(address,uint256)", +"44187d45": "HerdiusToken()", +"44188b72": "openPreICOPublic()", +"44191d9d": "TokensCreated(address,address,uint256)", +"44195fd2": "ApolloSeptemFinalized()", +"4419cd81": "isContractNodeOwner()", +"4419da33": "changeInvestorAddress(address,address)", +"4419f969": "QuaLed()", +"441a174c": "multiCallTightlyPacked(bytes32[],address)", +"441a2ee3": "Mangocoin()", +"441a3e70": "withdraw(uint256,uint256)", +"441b09d9": "allShares()", +"441b1b44": "getPartialValue(uint256,uint256,uint256)", +"441b4f01": "investContractDeposited()", +"441c3499": "getRefers()", +"441c77c0": "revealPeriodActive(uint256)", +"441d6a61": "timeWait()", +"441deede": "getSafeContract(address)", +"441e354c": "_checkoutCost()", +"441ea478": "GetLandId(uint256)", +"442085b2": "contributorCap(address)", +"4420e486": "register(address)", +"44210bbd": "claimPlotWithData(uint256,uint256,string,string,string,string)", +"44219b05": "getGamePlayingStatus()", +"442484ff": "ExtTokenPurchase(address,address,uint256)", +"44249f04": "tokensForCharity()", +"4425c0eb": "claimWhitelistPack(bool)", +"4425d66d": "backup_exchangeEthStb(uint256,uint256)", +"44261964": "claimFullPrize(address)", +"44268655": "addCroupier(address)", +"4426cdc9": "changeEtherContract(address)", +"44276733": "getRole(address)", +"442890d5": "getContractOwner()", +"4428b072": "getReply(bytes32,uint256,uint256)", +"44292e88": "setZRXToken(address)", +"442a494f": "NewRegistrar(address)", +"442b7ffb": "pow2(uint256)", +"442b8c79": "addYears(uint256,uint256)", +"442bc74f": "placeQuestion(uint256,uint8,uint256,string)", +"442cbcb3": "addParticipant(address,uint8)", +"442cf0ee": "sellTokensForLtc(string,address,uint256,uint256)", +"442d0927": "isSellPossible()", +"442d1759": "GIRLToken()", +"442d27dc": "getLoanTuple(uint256)", +"442d31ca": "ChefToken()", +"442dfae2": "mktSupply()", +"442e1079": "MIN_ICO_GOAL()", +"442e501d": "createDeposit(address,uint256)", +"442eb683": "YouthToken()", +"442edd03": "listItem(uint256,uint256,address)", +"442efdc1": "MigrateController(address)", +"442f52ab": "bilateralCancel(address,address,address,address,bytes32)", +"44304edf": "TGCTokenBase(uint256,string,string,uint8)", +"44314116": "totalRollsByUser()", +"44326354": "pauseITO()", +"4432ce5f": "setTradersProxyContract(address)", +"44337ea1": "addToBlacklist(address)", +"4433a440": "ADXSold()", +"44346e3b": "cancelOngoingTxByAdmin(bytes32)", +"44348a78": "referralIndex(uint256)", +"44350d5f": "neo()", +"4435947c": "CoinyMcCoinface(uint256,string,uint8,string)", +"4435f1c3": "SlashToken()", +"4437152a": "setPool(address)", +"44377ebb": "getTokenAmount(uint256,uint8)", +"4437e7a0": "FlogmallAirdropper(address,uint256)", +"4438744b": "unlockGrant()", +"44389678": "isAcceptedExportingAuthority(address)", +"4438c8ab": "ExchangeRate()", +"4438cf6f": "burnRestTokens()", +"4438d222": "userHasKYC(address)", +"4439ab32": "addRecordEntry(address)", +"4439defa": "getNonce(bytes32[])", +"443ace5b": "InitiateWhaleCard()", +"443af072": "percentToPresalersFromICO()", +"443afe2b": "bssTotalSuply()", +"443b22e6": "ActiveSalesPhase()", +"443bd56f": "getHandleOwner(bytes32)", +"443bdc43": "setStepOneRate(uint256)", +"443d4c9c": "sendPayout()", +"443d8967": "batchWithdraw(uint128[],address[],uint256[],uint128[])", +"443de10c": "getCurrentStaked(address)", +"443e1cf7": "isFightClockAuction()", +"443f19f4": "numberOfTokens(uint256,uint256)", +"443f41d5": "tokenDeposit(address,uint256)", +"443f45a4": "awardprize(uint256)", +"443f577e": "getTotalBalance(bytes4)", +"443f95dc": "allStart()", +"444115f6": "acceptOffer(uint256,string)", +"444195a3": "partnersFundAddress()", +"4441bbd9": "schemaRegistry()", +"44420311": "setInt(uint256)", +"444257a3": "_includes(string[3],string)", +"4442bf02": "closeArea(uint256)", +"444316e8": "MiniMeToken(address,uint256,string,uint8,string)", +"44431e52": "minOVC()", +"44440a59": "isDistributionReady()", +"44447f47": "lockTokenSupply()", +"4444c51f": "_recalculateTopQuestionsOnVote(uint256,uint256,uint256)", +"4444e3cd": "totalSupply(address,bytes32)", +"444581da": "createCloneToken(string,uint8,string,uint256,bool,address)", +"4445b569": "voteWeightOf(uint256,uint256)", +"4446bb11": "verify_signature(bytes32,uint8,bytes32,bytes32,address)", +"4446c98c": "foundersFundTimelock1Address()", +"4447e48c": "configureKeys(uint32,bytes32,bytes32,uint32,bool)", +"44482ab8": "w0keAFPresaleAddress()", +"4448604b": "testFailPreDistribute()", +"4448f5fb": "getEscapeRequestsCount(uint32)", +"4449307b": "addKycAddress(address,bool)", +"44495d7e": "migrateGold(string)", +"444b0c90": "bonusThirdWeekPeriod()", +"444b6048": "setMerchantDealsHistory(address)", +"444bb28d": "TownCrier()", +"444c3d9a": "isCompetitionActive()", +"444c8daf": "tipoCongelamento()", +"444cef88": "sentToken()", +"444d95b0": "proofs(bytes32)", +"444da733": "isRoundEnd()", +"444da951": "extractWei(uint256)", +"444dd6f3": "Elcoin()", +"444e8b43": "pubkeys1(uint256)", +"444e984b": "triggerAttack(uint32)", +"444fda82": "subYears(uint256,uint256)", +"44501404": "goldPrice()", +"445045cc": "_bid(uint256,uint256,address)", +"4451967c": "FOUNDATION_POOL_ADDR()", +"4451cfd9": "DeductFees(address,uint256)", +"4451d89f": "claimToken()", +"44525ace": "roundLatLng(uint8,int256)", +"445264db": "adventurePresale()", +"44536d27": "Create_AutoGame(uint256)", +"44539c72": "setManyWhitelist(address[],bool)", +"44540e57": "ownerBurnOccurred()", +"44554cef": "getRedbulls()", +"44558192": "FMT_Crowdsale()", +"44559f80": "start_token_time()", +"44566fe0": "HumanStandardToken()", +"4456eda2": "isOperator()", +"44578558": "addPlayerMapping(string,string,uint256,uint256,uint256)", +"4457ce5b": "CCH_LLV_303()", +"4457d5f0": "createProject(string,string,uint256,address)", +"44587e3e": "_setNumber(uint256)", +"4458ddca": "ChristCoin()", +"44598c11": "hasOfferingStarted()", +"445a7a23": "isOracleProxy()", +"445b8477": "transferAuditor(address)", +"445cb2df": "getVoting(bytes32)", +"445d1397": "maxTransfers()", +"445d1eff": "_getMyDividents(bool)", +"445d46e1": "onlyInvestor(address)", +"445d60d3": "placeBuyRequest(uint256,uint256,uint256)", +"445d688b": "COTTToken()", +"445d9936": "setTempHeroPower()", +"445df0ac": "last_completed_migration()", +"445df9d6": "getAllPrices()", +"445e4979": "_rejectCertificate(uint256,bool)", +"445f153a": "showBlockmaticsCertificate()", +"44602a7d": "testFallbackReturn()", +"44605ea0": "phase_1_remaining_tokens()", +"4460a2ca": "initializeVesting(address,uint256,uint256,uint8)", +"4460fb6d": "burn(address,bytes32,uint256)", +"4461550b": "devETHDestination()", +"44621145": "goodsOK(uint256)", +"446294ad": "multiAccessGetOwners()", +"446298e2": "Rubid()", +"446303f3": "preSaleCap()", +"4464aec7": "testTryGet()", +"4464c35e": "GNTAllocation(address)", +"4465e38c": "EligmaTokenContract()", +"4466862a": "randomtest()", +"44669e40": "purgeVoter(address,uint256)", +"44673b2d": "NextOwner()", +"44691f2b": "Dispute()", +"44691f7e": "hasStarted()", +"4469981f": "arrayInfoForDeposit(uint256)", +"446a45b7": "fun1()", +"446a7974": "Fokitol()", +"446b512e": "orderedTokens(address)", +"446bffba": "add(bytes32)", +"446c0955": "addWifi(string,string)", +"446d5aa4": "getAttributes(address)", +"446d750b": "setMonthly()", +"446da9c2": "xper()", +"446dba8f": "getBonus(uint256,address)", +"446dde9b": "MilestoneCashBackTime()", +"446e0b40": "onSubExecuted(uint256)", +"446e5079": "SendDividend(address,uint256,uint256)", +"446f608c": "EscrowEscalation(uint256,uint256,address)", +"446f6c1f": "sellStorj(uint256)", +"446fbcd1": "CredSign()", +"446fcf22": "refundPlayer(address)", +"44708f7d": "change_time_stamp_status(uint256,uint256,string)", +"4470da90": "register(bytes32,bytes32,address,bytes32,bytes32)", +"44710181": "parseChannelCompatible(bytes)", +"44720ed5": "TigerCash()", +"4472287e": "numDistributions()", +"4472d3bc": "getShopOwnerAllProductList(string)", +"447400bf": "mutate(uint256,uint256)", +"4474809f": "tournamentEndBlock()", +"4474e057": "ICOSwapRate()", +"44751760": "read(bytes,uint256)", +"44751e3c": "starCoinAddress()", +"447615df": "Whitelist(address,uint256)", +"44767548": "rectangle(uint256,uint256)", +"4476d23b": "destructor()", +"4476d66a": "mintedInBlock(uint256)", +"4476e9a9": "epcwallet(address)", +"44772899": "round6StartTime()", +"44773a6c": "sendToMultipleAccount(address[],uint256[])", +"4477c5da": "stopFunding()", +"44781a00": "notEqual(bool,bool,string)", +"447843cf": "approveChild(address,address)", +"447885f0": "get(bytes32,address,address)", +"4478fbb2": "chOwner(address,bool)", +"44795c13": "RecoverySha256(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"447a64c4": "usdContribution(address,uint256)", +"447cd682": "scheduleTransaction(address,uint256)", +"447d7a1d": "_toLower(string)", +"447e2dc6": "c(address,address)", +"447e52a0": "answerQuestion(uint256,string)", +"447e6967": "endPublicSaleStage()", +"447ee48f": "maxUserCreatedPerformance()", +"447fa561": "CAST()", +"447fa8b7": "setDex(address)", +"447fbbe3": "manualSendEther(address,address,uint256)", +"447ffa91": "MineCooldown(uint256)", +"44804664": "OriginSportToken(address)", +"44816e2d": "readhistoricalrounds()", +"4481a486": "transferECOMTokenToContract(uint256)", +"448246c3": "updateReferralMasks(uint256)", +"44830788": "estimateTokensWithActualPayment(uint256)", +"44831edf": "developmentTeamTokensMinted()", +"44834aca": "buyerAddress()", +"44845c28": "MediaCash()", +"4484780b": "checkRecentInvestment(address)", +"4484a2a6": "forceBuyback(address,uint256)", +"4484d92b": "getTotalCommission(uint32)", +"4485cece": "EndTimeChanged(uint256)", +"4485d32c": "storePortfolio(uint256,uint256[],uint256[],uint256[])", +"4486598e": "zeeshanabbc()", +"44866955": "champion()", +"448735e7": "BTN4()", +"4487b392": "removeVerified(address)", +"448883d7": "claimTax()", +"4488ca9b": "hasApproval(address,address)", +"4488cc43": "_addExcluded(address)", +"44890014": "setFxBpsRate(string,uint256,string)", +"4489b2ec": "getABaddressByIndex(uint256)", +"448a064f": "YunMint(address)", +"448a0ceb": "setRoughSupply(uint256)", +"448a5e11": "mintForDisputeCrowdsourcer(int256,uint256)", +"448a5f0b": "getTestimonialCount()", +"448a627c": "SetConfirmRound(bytes32,uint8,bool)", +"448a9915": "oneBillion()", +"448b1f29": "tokensForTrivial()", +"448c0341": "FXRATE()", +"448c6656": "nodePhases()", +"448d76a3": "grantReserveSupply()", +"448d8910": "solve(int8)", +"448f1ec1": "tranferPresaleTokens(address,uint256)", +"448f30a3": "nothing()", +"448f8c86": "Acentiex()", +"44909c99": "Doftcoin()", +"4490efe3": "EthernetCashWebsite()", +"449106ac": "stageCap()", +"4491fe8f": "onlyPay()", +"44938e94": "checkPartner(address,address)", +"4493b8a4": "addrDevTeam()", +"4493ff1c": "vestedBalanceOf(address,address)", +"44947b9d": "getOutcomeOfSecondPeriodByEntity(uint256)", +"4494fd9f": "getGame()", +"4495147b": "RtcCoin(uint256)", +"4495bbf7": "DOXYCOIN()", +"44964dcb": "theList()", +"4496a7ea": "_getCurrentRoundInfo()", +"4497ce22": "getLicenseReimbursement(address)", +"4498acba": "provenAddress(address,bool)", +"44997a58": "MinusToken()", +"4499af81": "setChainLedger(address)", +"4499e043": "UNSOLD_ALLOCATION_EXPONENT()", +"449a058d": "getParentsLength()", +"449a09a4": "interfaceAddr(address,string)", +"449a52f8": "mintTo(address,uint256)", +"449c198d": "setSealed()", +"449c7ad3": "withdrawHouseCutFromGame(uint256)", +"449d0eb1": "checkAccountSchedule(address)", +"449d0f29": "disavowCrowdsourcers()", +"449d1ba4": "fundBountyAndTeam()", +"449d2712": "LEF()", +"449daa9a": "setCostPerEnergy(uint256)", +"449de356": "isIncluded(uint256)", +"449e815d": "getPrice(address,uint256)", +"449ed7e0": "callback(bytes32,string)", +"44a040f5": "getRewardAmount(address)", +"44a08b36": "checkAccess(string,address)", +"44a0d68a": "setCost(uint256)", +"44a17516": "Configurable()", +"44a2542a": "initiateRefund(bytes32)", +"44a2d0d2": "contributorsKeys(uint256)", +"44a3982d": "getTokenPriceForPeriod(uint256)", +"44a3bb82": "getGameIndex()", +"44a5450f": "PRESALE_WALLET()", +"44a5b69c": "Reederem(uint256)", +"44a60878": "DCXToken(string,string,uint256,string)", +"44a6a8f0": "getDonationLength()", +"44a71bc6": "fundingMaxCapInWei()", +"44a7a992": "ParametersChanged(uint256,uint256,uint256)", +"44a7f501": "getOwnersGeneration()", +"44a926f9": "assigned_shares()", +"44a9ff76": "getLastHatchPrice(address)", +"44aa1826": "_minChild(uint256)", +"44aa470a": "addressVerified(address,string)", +"44aa5782": "LagToken()", +"44aa768f": "getLLV_edit_26()", +"44aa8b0e": "createAgreement(string,string,uint8,uint256,uint256,uint256,address,address,uint256)", +"44ab1c2f": "calcHouseEdge(uint256)", +"44ab6970": "redeemBool()", +"44ab6efa": "comB_()", +"44ab7e6f": "setParamsUnOrdered(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"44abc212": "adminWithdrawEIP777(address,uint256,address,address,bool,uint256,uint8,bytes32,bytes32,uint256)", +"44abd790": "makePlant(uint256,uint256)", +"44ac423a": "Collect(uint256,uint256)", +"44ac9d81": "resumePreSale()", +"44acb8da": "crowdsaleTokenSupply()", +"44ace7c3": "Tribe(address,string,string,address)", +"44ad5535": "ProofOfContractSnipers()", +"44ae0567": "advisorsReleased()", +"44ae2c03": "getAppNickname()", +"44ae58f6": "Bittrees(uint256,string,string)", +"44af11a3": "startBuyBackOne()", +"44af18c2": "goolaTeamAddress()", +"44af1f4b": "replaceOfficials(address[])", +"44af24d6": "getCurrentPercentage(address)", +"44af946f": "calculateEndTime()", +"44afda9c": "_isValidBaseLayersOnly(uint256[],uint256)", +"44b0245d": "addPurchased(uint256,uint256,uint256)", +"44b07838": "setPaidPackage(uint256,uint256,uint256,uint256)", +"44b07a3e": "newProposal(uint256,string,bytes32)", +"44b11f26": "Registry(bytes32,uint16)", +"44b1231f": "vestedAmount()", +"44b1d6e3": "DEXLITE()", +"44b1e09d": "checkTargetReached()", +"44b1e61a": "isFirstInit()", +"44b20e7a": "drawNum_()", +"44b28d59": "enableMint()", +"44b2a172": "cards_metal(uint256)", +"44b49958": "presaleEtherRaised()", +"44b4d279": "payoutDividends()", +"44b55187": "DollarToken()", +"44b55c3a": "setParking(uint32)", +"44b70d79": "LiquidityNetwork()", +"44b76b9e": "ICOTimer()", +"44b77680": "init(address,address,uint256[])", +"44b786a1": "setRate_BTCUSD(uint256)", +"44b7a3b7": "_createScrapPartAuction(uint256)", +"44b8074c": "changeTotalAmount()", +"44b81854": "STSTEST1()", +"44b81a77": "BitcoinToken()", +"44b88a6d": "scannedBronzeCaps()", +"44b8ccda": "EthLongExercised(address[2],uint256[8],uint256)", +"44b9cab5": "roundBlockCount_()", +"44b9efb2": "setInputData(uint256,uint256,uint256)", +"44ba16a2": "COLOR_PINK()", +"44bb3b2f": "stopBlock()", +"44bb60cf": "sigDestinationApprove()", +"44bc3e27": "BetWEA(address,uint256)", +"44bd7186": "GestiToken()", +"44bd7b71": "setBountyPercent(uint256)", +"44bec848": "thirdRoundPercent()", +"44bee639": "distributeSupply(address,uint256)", +"44bfa56e": "getBytesValue(bytes32)", +"44c010c6": "_getReferralBonus(uint256)", +"44c040a6": "MyAdvancedToken(uint256,string,string,address)", +"44c11fe4": "currentTransferableTokens(address)", +"44c18aa7": "setPayout(uint256)", +"44c20957": "setPhase(uint8,uint256,uint256,uint256)", +"44c20e6f": "retrieveExcessEther()", +"44c2dd52": "RDPMoney()", +"44c2dd71": "HSCToken(uint256,string,string,address)", +"44c3cb29": "validPlayer(uint256,address)", +"44c3cc68": "BasePoll(address,address,uint256,uint256,bool)", +"44c47561": "whiteListed()", +"44c4bf10": "setBlacklist(bool)", +"44c4dc31": "totalContributedAmount()", +"44c4dcc1": "purchasedAmount(address)", +"44c526c1": "devRewardClaimed()", +"44c55801": "setVaribles(string,string,uint256)", +"44c5bbf8": "updateStatus(address,uint8)", +"44c5e758": "getCustomerPolicyCount(address)", +"44c63eec": "vesting()", +"44c71ef2": "changeSaleSettings(address,address,uint256,uint256,uint256)", +"44c73459": "weiPerBlock()", +"44c7d6ef": "claimStake(uint256)", +"44c9716a": "BVA()", +"44c9af28": "getState(uint256)", +"44c9e83d": "purchaseAuthorizer()", +"44ca361f": "Log1(string,uint256)", +"44caa8d6": "isArrAccountIsFrozen(address)", +"44cb1c33": "lastTokens(address)", +"44cc129e": "count_bytes(uint256)", +"44cc5f7e": "m_externalMintingEnabled()", +"44cc7f5e": "validWithdrawToken(address,address,uint256)", +"44ccbed0": "getAssetCollectedOreBallances(uint256)", +"44cef69b": "CreateTokenToOperation(address,uint256)", +"44cf262a": "addressChangeBlock(address)", +"44cff104": "setMarketManagerAddress(address,address)", +"44d02c2a": "infoICO()", +"44d03ac6": "BlockhashFetch(address)", +"44d0afbc": "signingLogic()", +"44d15446": "setDevelopmentAuditPromotionTokensPercent(uint256)", +"44d19d2b": "reservedSupply()", +"44d1a074": "marketsubscribers()", +"44d1a9ae": "setCardDrawPrice(uint256)", +"44d1ef3b": "setTCRHelper(address)", +"44d345f9": "UnclaimedRewardTransfer(uint256,uint256)", +"44d4fd19": "Now()", +"44d60e67": "TransferAssets(address,uint256,address)", +"44d6d259": "AdminAdded(address)", +"44d75fa9": "updateMinorTree(bytes32)", +"44d7e4ed": "stopIssuing()", +"44d9bc5f": "gameEndTime()", +"44daf94a": "showEthBalance()", +"44dbb571": "SALE_START_TIME()", +"44dbc282": "processCallback(bool,address,address,uint256)", +"44dc028d": "lockedtokensOf(address)", +"44dc4dec": "registerForRace(uint256)", +"44dd4b3b": "lookupGeneration(uint256)", +"44dd4b5e": "scheduleTransaction(address,uint256,bytes)", +"44dedf4d": "returnFundsForUsers(address[])", +"44defdfd": "paidInstallments()", +"44df8e70": "burn()", +"44dfdce0": "getNameOwner(bytes)", +"44e02dbc": "returnCollateral(uint256)", +"44e14e59": "lockReferralTokens(uint256,address,uint256)", +"44e191fa": "increaseApproveAndCall(address,uint256,bytes)", +"44e2024f": "createNewFreelanceContract(string)", +"44e20fd2": "EasyPocketCoin(uint256,string,uint8,string)", +"44e2651c": "whiteListOf(address)", +"44e2adeb": "claimedFlag()", +"44e2cc24": "JackpotTimer()", +"44e2f9ad": "buyerInfoOf(address)", +"44e43cb8": "depositRevenue()", +"44e44e0d": "Profeee()", +"44e4c366": "rmTrusted(address)", +"44e4d226": "alreadyVoted(string)", +"44e52420": "TRADERSCOIN()", +"44e5d154": "GenesisGlobalTestToken()", +"44e63717": "LaboToken()", +"44e66ee2": "updateMeterValue(uint256,uint8,uint256)", +"44e780b7": "PrepareRollEvent(address,uint256,uint256,uint256)", +"44e78d93": "wipeDAI(uint256,uint256)", +"44e796de": "doubleBonusArray(address[])", +"44e7faa4": "limitedWalletsManager()", +"44e86b2f": "left71(uint256)", +"44e880c1": "gasAfter_()", +"44ea1c71": "addNFBTNY(address,uint256)", +"44ea4a7c": "TokenCreated(uint8,uint8)", +"44ea54fe": "changeSoundcoinsContract(address)", +"44ec1a0d": "getContestStatusForDateAdmin(uint32)", +"44ec2c03": "addTransaction(uint256,uint256,uint256,uint16,bytes32,uint256)", +"44eccf16": "PSTBCoin()", +"44ed9039": "FLTTToken()", +"44edf6b2": "preIcoEndDate()", +"44ee398b": "secondThawDate()", +"44ee3a1c": "extendLock(uint256)", +"44eef96c": "sellShip(uint32,uint256,uint256,uint256)", +"44ef231b": "argumentCount()", +"44f04404": "forging(uint256,uint256)", +"44f06bc7": "getChampStats(uint256)", +"44f09d2a": "createDungeon(uint256,uint256,address)", +"44f0a4a8": "tdeStartTime()", +"44f0c3ce": "totalLost(address)", +"44f11e7e": "tokenBoughtPerTime(uint256)", +"44f1bbad": "giftRatioOf(address)", +"44f1beed": "Marble()", +"44f1ee5b": "Proof(address)", +"44f2428a": "adjustL(uint256)", +"44f252a0": "confiscate(address)", +"44f26d89": "forceUnstake(address)", +"44f27e30": "getAuctionData(uint256)", +"44f34576": "setTokensBought(uint256)", +"44f38756": "icoState()", +"44f396fa": "startStage2()", +"44f39803": "setBubbled(address)", +"44f5e447": "operatorFeeAcct()", +"44f6d70c": "giftOwnerByIndex(address,uint256)", +"44f7335b": "_verifyAvailability(uint256)", +"44f75cbd": "isAffiliate()", +"44f7636c": "publicOfferingWallet()", +"44f7787f": "ln(uint256,uint256)", +"44f7d03d": "valueOf(uint8,bool)", +"44f84579": "JP_winner()", +"44f96b36": "getRemainingPartnerTokensAllocation()", +"44f96bc6": "matured_timestamp()", +"44f977de": "setStore(string,address,uint256)", +"44f9ac5c": "getPendingWithdrawals(uint256)", +"44f9d060": "_getMinimum(bytes32)", +"44fa961d": "deleteLawyer(address)", +"44fa9ca6": "oracleIsUpdating()", +"44faa139": "Withdraw(uint32)", +"44fb5a1a": "Category(string)", +"44fbaf08": "bountyAmountLeft()", +"44fbc1ef": "Dollar()", +"44fbd125": "increasToken(uint256)", +"44fbe5f5": "NewBiggestDick(string,string,uint256)", +"44fc2a9b": "NOLLYCOINCrowdFund()", +"44fc364c": "setMarket3(address)", +"44fc709e": "set_property_facility(uint256,bool,bool,string)", +"44fc83dd": "LogTokenReward(address,uint256)", +"44fc9361": "maximumInvestmentInWei()", +"44fcbd79": "getLocksForAddress(address,uint256)", +"44fd1557": "ERC20Token(string)", +"44fd584d": "cancelLeaseOffer(uint8)", +"44fdbf5b": "releaseAllTokens()", +"44fddeb7": "BLOCKAPPS()", +"44fe2eb0": "totalPaidDividends()", +"44fe7cd5": "Eliminated(address)", +"44ff5a3e": "CWC_Address()", +"44fff35c": "openCrowdfund()", +"4500054f": "isCancellable()", +"45004310": "signUpUser(string)", +"4500e64f": "showLockValues(address,address)", +"4504169a": "_createFlower(uint256,uint256,uint256,uint256,address)", +"45044611": "TimeCapsule()", +"45048ced": "Presale(uint256,uint256,uint256,uint256,address)", +"450531e7": "aidPoolTokens()", +"4505d53f": "unclaimedPoolsPresent()", +"45061bf8": "tsc()", +"4506e64d": "putOn(uint256,uint256)", +"45078531": "PRESALE_LEVEL_5()", +"4507a545": "shouldBeTrusted(address,address)", +"4507fccf": "addDeal(uint256,bytes32,bytes32,uint256,bytes32,bytes32)", +"45083f73": "appendTranch(uint256,uint256)", +"4509052f": "scannedCaps()", +"4509fd81": "partnersPercent()", +"450a03dd": "getKunsNum()", +"450a9105": "setYctContractAddress(address)", +"450b6079": "RetRisk(uint128)", +"450c4b7b": "LogTokensBought(address,uint256,uint256,uint256,uint256)", +"450c99d3": "etherRealID(address,address,string,string,bool)", +"450cabcb": "publicGetExchangeRate()", +"450d94ef": "TransactionConfirmedAfterEscalation(uint256)", +"450db8da": "ContractUpgrade(address)", +"450dccf6": "cancelOrderWithMerchantByAdmin(string,address)", +"450e2ed3": "startNextCycle()", +"450eefae": "execute(address,uint256,string)", +"450efe21": "getTokens(address)", +"45102ca7": "generateCarId(uint256)", +"451048e2": "isALCDistributed()", +"45104b16": "EXECUTION_GAS_OVERHEAD()", +"45115a17": "PUBG()", +"4511cc7d": "Transfer_nodata_enabled()", +"45126711": "createRandomNumber(string)", +"4512b39b": "sendAndFreeze(address,uint256,uint64)", +"4513a44e": "Saturn()", +"4513a7f4": "IsTransferTempFromOldContractDone()", +"451450ec": "upgrade(uint256,uint256)", +"45145281": "CurrencyFactory(address,address)", +"451512ed": "forceDispute(uint256)", +"451515db": "addProduct(uint256,uint256,bytes32,address)", +"45152b14": "makeUnicTaskHashId(address)", +"45164b3e": "TRANSFER_PROXY_VEFX()", +"451659d9": "exchange(uint256,bytes8,bytes8)", +"45166351": "FRB()", +"4516b707": "DCOIN()", +"45176f8d": "CloutToken(uint256,address)", +"4517a273": "releasePremine()", +"4517bd42": "RetractRoutingDR(bytes32,bytes32,uint256,bytes)", +"4518982c": "firstBonusTokensLimit()", +"45190584": "remainPantry()", +"45196535": "calculateOrderHash(address[],uint256[],uint8,uint8)", +"45199e0a": "getPendingList()", +"4519a069": "toUint32(bytes,bytes,uint256)", +"4519c454": "tokenFallbackExpanded(address,uint256,bytes,address)", +"4519ef8e": "getMinutes(address,address)", +"451a308f": "buyProperty()", +"451b5f47": "preMaxContribution()", +"451bd752": "currentUniqueSpinnerPrice()", +"451bedb3": "getSettingsChangeConfirmationCount(uint256)", +"451beefc": "addressToSplittersCreated(address,uint256)", +"451c3d80": "acceptedToken()", +"451cd22d": "clnAddress()", +"451d65d3": "Debug(uint256,address,string)", +"451df00f": "SongTokenRemoved(address,bool)", +"451e3ec5": "_createName(bytes32,address)", +"451e422e": "windowPeriod()", +"451f0601": "advisersPartners()", +"451f7763": "admin_set_payable(bool)", +"451febcc": "equal(bytes32[],bytes32[],string)", +"452030c4": "end_PRIVATESALE()", +"4520d416": "getReserveminted()", +"45232370": "fechVoteMainInfo()", +"45239b90": "setBeneficiary()", +"4523be0d": "Daily()", +"45243120": "setFiatContractAddress(address)", +"4524c0cd": "defineReleases(uint256[],uint256[],uint256[])", +"4524c70b": "addEmployee(address,bytes32,bytes32,uint256,uint256)", +"4525f804": "constructor(address,address)", +"45261106": "maxBetsPerBlock()", +"4526196e": "addressB()", +"45262b05": "setDefaultExecuteTime(uint256)", +"45266d7e": "BrandAdded(address,address,string,bool)", +"452757f6": "changeContainer(address)", +"452766a5": "EGGS_TO_HATCH_1Cat()", +"45278394": "updateDemurrageReporter()", +"45279c81": "effectiveMaxBet()", +"4527b4b6": "HGUATToken()", +"4528f3ec": "lastPurchase()", +"45293f0e": "Luckybuy()", +"4529cae7": "getTotalPlayers()", +"4529cd71": "SOFT_CAP_IN_ETHER()", +"4529cd8a": "AdvertisementStorage()", +"452a33f0": "grantTrophy(address,bytes32)", +"452a344f": "MintStarted()", +"452ae331": "attack(address,uint256,uint256)", +"452af6c6": "ForegroundPaymentResult(bool,uint256,address,uint256)", +"452b7757": "AirDropPayBitsR3(address[])", +"452ccadb": "changeBountyFulfillmentAmount(uint256,uint256)", +"452d3c59": "transferPreSignedPayloadHash(address,address,uint256,uint256,uint256)", +"452d44dc": "checkBothNotNull()", +"452ddecc": "startBallot()", +"452e0d25": "sURL()", +"452e880b": "readArticle(string)", +"452e9802": "getDetails(address,address)", +"452e9acb": "setMsgHash(bytes32)", +"452fa483": "TOXToken()", +"452fbc41": "USN(address,address,bytes,uint256,uint256,uint128)", +"45301024": "ownerDispute(uint256,uint256,uint256)", +"4530a6c6": "getWishTribute(uint256)", +"4531aaa3": "EverydayTokenStandardToken(uint256,string,uint8,string)", +"45327fef": "calcSharePriceAndAllocateFees()", +"45334894": "setTeleportPrice(uint256)", +"4533f779": "determineWinnerOdd(string)", +"45350759": "addTier(uint256,uint256)", +"45350b6b": "readFromStorageView()", +"45362978": "query1(string,string)", +"4536be70": "periodITO_hardCapInWei()", +"4537544c": "makeAccountIterable(address)", +"4537b7de": "developingFund()", +"45385448": "BEERS()", +"45387d2c": "_getTournamentSupportAmount(uint256)", +"4538b7ec": "CallExecuted(address,uint256,uint256,uint256,bool)", +"453920cb": "changeTokenName(string,string)", +"45395b03": "tokensIssuedOwner()", +"4539bf18": "date01Feb2019()", +"453a6e0d": "getAmountConverted()", +"453aa450": "vote_proposed_address(string,string)", +"453b7eab": "totalControlledBalance()", +"453c2310": "maxPerWallet()", +"453ca7ee": "RewAddr()", +"453cbb11": "canConvertTokens()", +"453cddaf": "performPhase()", +"453dc243": "setWoodAddress(address)", +"453dd97f": "getDevWallet()", +"453dfcae": "payExtraTokens(uint256)", +"453e5a2c": "registerMarket(bytes32,address,address)", +"453e6fa0": "schedulableAmount()", +"453eca78": "getRealmNum()", +"453fe8cb": "calcUnMaskedEarnings(address)", +"453fef69": "setPrepaid(address,uint256,uint256,string,uint256)", +"454052ea": "relent()", +"45406101": "TTCToken(address)", +"45408a8a": "minCashout()", +"4540a396": "importBalancesOf(address[])", +"45411c8d": "checkAllowedTier(address,address,uint8)", +"45414df1": "b2s(bytes)", +"4541c39c": "to_end_ico()", +"4541e154": "sumICOStage4()", +"45421d9b": "reembolsar(uint256,uint256)", +"45426082": "countdownDecrement()", +"454274f9": "BroFistCoin(uint256,uint256)", +"4543754f": "totalUserStakes(address)", +"4543f79e": "withdrawERC20ToOwner(address)", +"454431c1": "RangeGameWithITG(address,uint256)", +"454481dd": "nextLotteryTTMTokenId4()", +"45448a28": "approveAddOwnerRequest()", +"4544ad22": "allByAuthor(address,uint256)", +"4544c48c": "distributeWinnings(uint256)", +"454584e6": "_setProviderInvitedUser(uint256,address,bool)", +"45458643": "setPI_edit_16(string)", +"45461e78": "MToken()", +"4546ad06": "sendProposal(string)", +"4548821c": "ExBatallionCoin()", +"45488ac1": "buyStake()", +"45493057": "validateClaimTokens(address)", +"454a2266": "dhopakexchange(address,address,address,uint256,uint256,uint256)", +"454a2958": "foundersTokenTimelock()", +"454a2ab3": "bid(uint256)", +"454aa6cf": "getPhoenix(uint256)", +"454b0172": "Created(address,address,address)", +"454b0608": "migrate(uint256)", +"454bccd0": "mininumContributeWei()", +"454bf426": "sysFeePermillage()", +"454c57ee": "getStockBuyOrderPrices(uint256)", +"454c5d34": "allocateBalance(uint256,address)", +"454c87b3": "matured()", +"454ca9fd": "get_my_tokens()", +"454ccc2f": "totalAngels()", +"454d3e24": "investorsBalance()", +"454d9bb4": "MerkleMine(address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256)", +"454dd6d2": "GetMinimumBet_Ether()", +"454dfaaf": "claimSale()", +"454f7b8f": "totalPayout()", +"455052b9": "getInstanceMetadata(uint256)", +"4550fa72": "isConsensusObtained(uint256)", +"4551b1d7": "ProxyPayment(address,address)", +"4551dd59": "isCrowdsale()", +"455259cb": "getGasPrice()", +"45528aa8": "addItemToInternal(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"4553c343": "getEarningMetrics(address,bytes32)", +"4553fd4d": "token_ratio2()", +"455501d3": "Submission(address,uint8[])", +"45550a51": "recoverAddressFromSignature(bytes32,bytes)", +"455530a6": "TestRandomNumber()", +"45556969": "DealerSocketCoin()", +"4555d5c9": "proxyType()", +"4555db10": "tokenRecovery(address,address,uint256)", +"4556611e": "weiToShare(uint256)", +"45576f94": "createToken(string)", +"455770a4": "setIcoPhase1(uint256,uint256)", +"455778ed": "advisorsTokensSecondReleaseTime()", +"45579b1f": "transferShares(uint256,address)", +"4557a579": "addWeapon(uint256,string,string,string,address)", +"4557b4bb": "init(uint256,address,address)", +"4557c70d": "CrowdWallet(address,address,uint256)", +"45585afe": "manageInvitations(uint256,address[],address[])", +"4558850c": "apps(bytes32,bytes32)", +"4558d717": "changePaymentToken(address)", +"45590ec8": "addTag(uint256,string)", +"45596e2e": "setFeeRate(uint256)", +"45598b4a": "cancelCampaign(uint256)", +"45599136": "tokenFee()", +"4559b2e8": "holderAdvisorsTokens()", +"455a2a37": "MyAdvancedToken(uint256,string,uint8,string)", +"455a380d": "getTotalAmoutStageAddress(address)", +"455b33ab": "gambler2()", +"455bf142": "refundeesListLength()", +"455c06e4": "mintTokens(address,int256,uint256)", +"455c7050": "EscrowManager()", +"455ca9bd": "refundTokens(address)", +"455d4077": "_startLockup()", +"455d86b8": "revenueShareOwnerAddress()", +"455dc46d": "nextMinimumEpochInterval()", +"455df579": "left84(uint256)", +"455ea98c": "getInUse(bytes32)", +"455eb777": "canStake(address,uint256,uint256,bytes8,uint256,string,string,string,string,uint256,uint256)", +"455ef8f9": "coinsCount()", +"455f1725": "getTotalAmountOfBlocks()", +"455f6f31": "totalTokensBurnt()", +"455fd623": "totalWithdraw()", +"455fea46": "getTankDetails(uint32)", +"455ff9a4": "lastBlock_v16Hash_uint256()", +"456176eb": "PCDStartTime()", +"45622c31": "setContractAllowance(address,uint256)", +"45624260": "getNumPositionOperation(string,address,string)", +"45626ecb": "removeStages()", +"45629402": "changeDefaultWithdraw(address,address)", +"45639e37": "distributeEtherToAllShareholders(uint256)", +"4563b743": "getPAAttributes(uint32)", +"4563f30a": "transfersPaused()", +"45644fd6": "removeOracles(address[])", +"45645572": "presale(address,uint256,uint256)", +"4564ea36": "forceVoidExternal()", +"45653a6d": "creater()", +"45656757": "p1_start()", +"45668923": "Aikcoin()", +"45668f2b": "ORACLIZE_GAS()", +"45669c8d": "protectedTransferToMint(uint256,bytes32)", +"4567a6a7": "getXCPlugin()", +"4567c5f7": "buySharePriv(uint256)", +"45680e09": "createPixels(uint256)", +"4568fb50": "finishRoundAndStartNew()", +"4569db8a": "getCustomerTxAmountKWh(address,bytes32)", +"456a09c8": "withdraw(uint256[],uint256[],address)", +"456c2892": "finalizeLottery()", +"456c64e0": "getGamesOdds(uint256[])", +"456c8cac": "saleStopped()", +"456cb7c6": "authorized()", +"456cbafc": "AddressWarsBeta()", +"456cee82": "setAmountPerEther(uint256)", +"456f3c3b": "internalIcoFinished(uint256)", +"456fe579": "notate(address,uint256,uint256,uint256[])", +"4570160e": "MotionToken()", +"45705906": "isLeading4FF(address)", +"45705d93": "BwinToken()", +"457094cc": "fire()", +"45710074": "sell()", +"45714c7b": "TOKEN_CLAIM_WAITING_PERIOD()", +"4571a7f1": "maxStage()", +"4571d4c4": "FutureCall(address,uint256,uint16,address,bytes,bytes,uint256,uint256,uint256)", +"45734d2b": "sizeOfInt(uint16)", +"45737b1e": "changeEndDate(uint256)", +"457391e5": "createGame(bytes32)", +"4573a421": "ico4Sold()", +"4574dea5": "setBreedingFee(uint256)", +"45751137": "newDeposit(address,uint256,uint256)", +"457556c2": "getUBetChecks()", +"45755dd6": "returnFunds(uint256)", +"457610e5": "cancelTransaction(bytes32,string,bytes32,bytes32,uint256,uint256,uint256,uint256,uint256)", +"4576a635": "setCategoryCap(uint256,uint256)", +"45773e4e": "sayHelloWorld()", +"457750a4": "marketIncentivesAllocation()", +"457770d8": "PreICO(address,address,uint256,uint256)", +"4577942c": "lastTransactionTime()", +"45787fed": "WolframExchangeTimes()", +"45788ce2": "prev(address)", +"4579268a": "getOffer(uint256)", +"45798593": "Certification(string,string,string,string,string,string,string)", +"4579c805": "createDistritoVerify(uint256)", +"457a21bc": "GullitCoin()", +"457a893f": "upPlayer(address,bytes32,uint256,uint256,uint256,uint256)", +"457b4e1b": "_setMoreDetails(uint256,uint256,uint256,uint256,uint256,address)", +"457bb613": "initializeUsers()", +"457c600c": "getItemAllowanceAmount(uint256,address,address)", +"457ce032": "getTokensFromExchange(address,uint256)", +"457cf77a": "couponToken()", +"457d13ca": "getPlayerBet(string,address)", +"457dd8b3": "setMasterKey(address)", +"457e5521": "getAllPolicies()", +"457e8fc7": "calculateReward(uint32,address,address)", +"457eff2f": "GetMySnails()", +"457f4d41": "hammer()", +"457f55fb": "updateRightLottery()", +"4580a950": "setDecreaseRepAvailableForExtraBondPayouts(bool)", +"4580cc5e": "setFinished(uint256,uint256)", +"458284fb": "setACLRole7123909213907581092(address)", +"45837e5f": "updateLandData(uint256,string)", +"4584117e": "mintParts(uint16,address)", +"45848dfc": "GetAllAdmin()", +"4584afe5": "buyLambo()", +"45850658": "closeAssignmentsIfOpen()", +"4585ad02": "delayDefaultAction()", +"4586a517": "addTotalSponsored(address,address,uint256)", +"4586e4ab": "balanceInPlay()", +"45871918": "raceToBaseStats(uint256)", +"4587327a": "doAirdrop(address[],uint256)", +"45874c93": "PersonaIdentity()", +"4587501e": "baseIcoPrice()", +"4588c1ef": "setPI_edit_2(string)", +"45895620": "getAvatar(address,uint256)", +"458a645d": "resolveDeposit()", +"458b1471": "mintingFinishedTime()", +"458c9ca4": "year3Unlock()", +"458d5968": "getMyTokensEmits()", +"458d96bb": "transferLockedMultiply(address[],uint256[],uint256[],uint256[])", +"458da775": "_makePlant(address,uint256,uint256)", +"458e18d7": "AMLOveCoinVoting(address)", +"458e78d5": "getSchellingRound(uint256)", +"458efde3": "vest()", +"458f837f": "minSumICOStage1USD()", +"458fa428": "summDividendReserve()", +"458ff74f": "authorizeBurnFulfiller(address)", +"45906baf": "Restrictable()", +"45909a6f": "getBalanceOfUser(address)", +"4591a980": "verifyStep(uint256,bytes,bytes,bytes)", +"4591b7c6": "fillBonds(address)", +"4591c060": "fork()", +"4592282e": "LBC()", +"4592cd1d": "claimContractOwnership()", +"4592fec8": "returnBids(uint256,address)", +"459348dc": "BISTEXToken()", +"45934d0b": "getIdentityName()", +"45941a38": "lastTimeOfNewCredit()", +"45945a45": "isRoundActive()", +"459469e0": "FundsRegistry(address[],uint256,address)", +"4594762a": "getSkill(uint256,uint256,uint256)", +"459497fc": "ownerAddressInLUT(uint256)", +"4594d06a": "delMinter(int256,address)", +"45950cd4": "selfairdrop()", +"4595343f": "dividendsRightsOf_(address)", +"459659a4": "Exchange(address)", +"45967555": "deployedContracts(address,uint256)", +"45977d03": "upgrade(uint256)", +"45977ebb": "LINCToken()", +"4597dc8e": "CooldownThreshold()", +"45983b24": "isReferralSupported()", +"4599308f": "buyCow()", +"459a2192": "cardDetailsList(uint256)", +"459a585a": "testCreateToken()", +"459a6589": "transferInGame(address,address,uint256)", +"459ae9b3": "addMembers(address,bytes32,address[])", +"459b0d97": "SimpleConstructorBytes(bytes32,bytes32)", +"459b2cd6": "OwnableWithRecovery(address[],uint8)", +"459b3926": "Airdrop_Limit()", +"459c7d0b": "tokenIcoUsdCentPrice()", +"459cb2be": "agreedTermination(uint256)", +"459ccde6": "modifyRandomNumber2(uint256)", +"459ebb8c": "BCMtest()", +"459ec508": "betOnColumn(uint8)", +"459f93f7": "getBuyers(uint256,address)", +"45a058c1": "flag_is_Ethereum_Function_Signature_Database_Is_Big()", +"45a132d4": "LemonSelfDrop1()", +"45a15388": "marketPrice()", +"45a1b92c": "onBurn(address,uint256)", +"45a1d72a": "_tobuy(uint256,address,uint256,uint256)", +"45a1f1b9": "getInitials()", +"45a2556c": "getBucketOwedAmount(uint256)", +"45a2a3df": "withdrawTeamPerfit()", +"45a37bd6": "kycManagerWallet()", +"45a3816c": "forfietCollat()", +"45a3b0bf": "resolveFailPledge()", +"45a3c7c6": "_createReleaseAuction(uint256,uint256,uint256,uint256,uint256)", +"45a40478": "downs(address)", +"45a45695": "baseTargetInWei()", +"45a48de6": "getBigPromoRemainingBlocks()", +"45a4a39c": "completePost(address,address)", +"45a727de": "checkForUpdaterUpdate()", +"45a743d1": "TOTAL_AIRDROPPED_TOKENS()", +"45a7b991": "getContributionHashes()", +"45a88ff6": "claimPlotMultiple(uint256[])", +"45a8d80e": "PiPiCoin()", +"45aa257a": "VICCoin()", +"45aa324c": "start_service(address,uint32)", +"45aa6e98": "tokensCreated(uint256,uint256)", +"45aa7f69": "OffMenuMorselToken()", +"45aa83d8": "blockoptions()", +"45ab17bf": "setRefunding()", +"45ab63b9": "walletFeesInBps(address)", +"45ab8e07": "CoinsdomCoin(uint256)", +"45abc063": "totalLoadedRefund()", +"45abe20a": "investorsIndex(uint256)", +"45acc490": "executeAmendmentMandate(uint256)", +"45ad35bc": "lastCallAddress()", +"45ad55cc": "PRE_ICO_DURATION()", +"45ade051": "getUtilizationRate(uint256,uint256)", +"45ae47fd": "CardFactory()", +"45aeff61": "getStockKey(bytes6,bytes6)", +"45af4bc2": "JJToken()", +"45af7ceb": "invalidateHash(bytes32)", +"45b0f6d2": "sealBurner(bytes32)", +"45b17abb": "distribute_private_sale_fund(address,uint256,uint256)", +"45b1c336": "icoWeek3Bonus()", +"45b21736": "getCBAStatusMessageLength(address)", +"45b26383": "contributeFund(string)", +"45b30e7a": "GTBToken()", +"45b35f56": "getAllRewards()", +"45b3fe42": "Y()", +"45b426f2": "option30symbol()", +"45b50255": "getBooking(string,uint256,uint256)", +"45b5143b": "TUMITOKEN(uint256,string,uint8,string)", +"45b581a2": "getPotentialProfit(address,string)", +"45b5a47a": "GetEther()", +"45b64133": "HHRLocker()", +"45b660bd": "IssueTokensToInvestors(address,uint256)", +"45b6ccfd": "MAX_MIDGRADE()", +"45b727f3": "getShop(uint256)", +"45b748ab": "SSPUnregistered(address)", +"45b7d5da": "setFrozenAccount(address,bool)", +"45b7fdd4": "TheGreatWishOfChina()", +"45b8bafc": "floorLog2(uint256)", +"45b8c0c2": "parcelGzeWithBonusOffList()", +"45b8fa03": "TokenLongExercised(address[2],uint256[8],uint256,uint256)", +"45b9ca21": "getEther(uint128)", +"45bae1eb": "carAccts(uint256)", +"45bae539": "getContributeParticipant()", +"45bbee71": "rmAsset(address)", +"45bbf9b5": "TotalPayment(uint256)", +"45bcd68f": "BitVideoCoin()", +"45bd3752": "intMemoryArray(int256)", +"45bd7f03": "addBountyAddresses(address[])", +"45bda564": "SPECIALIST_STAKE_THREE()", +"45bddbb8": "thanksAllGenesisUsers()", +"45bdfedb": "getAdrByIndex(uint256)", +"45be66eb": "SportsBet()", +"45beb6e0": "matchAgainstBook(uint128,uint256,uint256,uint256)", +"45bf5cb2": "testInitialBoardUsingDeployedContract()", +"45bfdca6": "addWalletAddresses(uint256,address)", +"45c08718": "updateCredit(address)", +"45c1234c": "Sent(address,uint256,string,string)", +"45c12560": "LogMoneyToPreICO(address,uint256,string)", +"45c1523a": "OzsToken()", +"45c16a22": "getSaleStage()", +"45c1c9fc": "setBuyEnable(bool)", +"45c35fd5": "publicOfferingTokens()", +"45c38053": "tankAllowance()", +"45c41132": "_emitPaymentReleased(uint256)", +"45c41478": "getMarkets(bytes,address)", +"45c46619": "addWhitelistedBurn(address)", +"45c531f3": "secondDiscountPrice()", +"45c5904f": "malangtoken()", +"45c5b8ac": "set_game(address)", +"45c5de81": "listTeamTokens(uint256)", +"45c654eb": "TravelToken()", +"45c6a874": "adminMultiSig()", +"45c7a092": "isValidSignature(address,uint40,uint40,uint128,uint256,uint8,bytes32,bytes32)", +"45c8b1a6": "unfreeze(address)", +"45c8e118": "view44()", +"45c917ec": "closeDeposit()", +"45c9a11a": "maxProfitPercentage()", +"45c9a558": "getPeriods()", +"45ca25ed": "changeName(address,string)", +"45cb3dde": "withdrawTime()", +"45cb3f4d": "highestBidPrice()", +"45cb4559": "gameGiftUserTotalTimes()", +"45cb9994": "Lookup()", +"45cbf879": "getStageByBlockNumber(uint256)", +"45cc13c3": "tokenize()", +"45cc50ce": "endTimeIco()", +"45ccd426": "ObokContract()", +"45cd4820": "participate(address,uint256,bytes32,address)", +"45cdb714": "changeColorWhite()", +"45ce0dc1": "addLambo(string,uint256,bool)", +"45ce691a": "buy(uint256,uint256,uint256,uint256,uint256,uint256)", +"45ce86eb": "whitelistApplication(bytes32)", +"45cf093a": "sumDividend()", +"45cf8467": "getSqr(uint256)", +"45cfad3e": "TOKEN_PRICE_N()", +"45cfcc42": "getKeyVotes(string,string)", +"45d0695f": "arr(uint256,uint256)", +"45d1b657": "PRE_SALE_3000_ETH()", +"45d27edf": "forward_method(bytes,address,uint256,bytes)", +"45d30a17": "releasedAmount()", +"45d3292b": "receiveDonation()", +"45d3b8db": "superAddress()", +"45d3cc81": "getAnimal(uint256)", +"45d4cf2b": "createPrivilege(string,address,address)", +"45d5149f": "minContributionAmount()", +"45d53788": "numOrders()", +"45d58a4e": "getWalletOut()", +"45d607fe": "referralFee_()", +"45d63b07": "BrokerNekoNetwork()", +"45d63b66": "recommit(uint256)", +"45d6c9db": "PVP_BATTLE()", +"45d78d08": "getTokenAllocations()", +"45d7fd3e": "setCreationAddress(address)", +"45d8a232": "targetTime()", +"45d8a6df": "tablePrices(uint256)", +"45d9a1ce": "withdrawBalance(address,address,uint256)", +"45d9bd15": "getBookmarks()", +"45da75d3": "setPresidenteDeMesaVerify(bytes32,uint256,uint256,uint256)", +"45dafed2": "Marcellocoin()", +"45db72ff": "lastLoveLetter()", +"45dc16ca": "trade(uint256[12],address[4],uint8[2],bytes32[4])", +"45dc3dd8": "setMin(uint256)", +"45dcb788": "dataSourceGetRoundOfSixteen(uint256)", +"45ddc85d": "voteOf(uint256,address)", +"45ddcf99": "unlockUntradeableCards(address)", +"45de2567": "transferTokens(uint256,uint256)", +"45df30d2": "transferPlusFee(uint256)", +"45df925f": "ratingList()", +"45dfe7f3": "restrictedWallet()", +"45e05f43": "affiliate()", +"45e09e54": "getBoard(uint256)", +"45e0e324": "FoodStore()", +"45e0e412": "forwardTokens(address,uint256)", +"45e231a6": "XCONToken()", +"45e26105": "updateMaintenanceMode(bool)", +"45e29057": "_myLuckyNumber()", +"45e3553e": "setMaxProtoId(uint16)", +"45e373ed": "getCertificateById(string)", +"45e381a9": "set_minFinneyPerHedgeTransfer(uint256)", +"45e39705": "addMember(string,address)", +"45e3b8c0": "SHOP()", +"45e41468": "placeSell(address,uint256,uint256)", +"45e479f6": "GetDiv()", +"45e4c361": "rteamVaultAddr()", +"45e4db40": "addTxInBuffer(address,uint256,uint256,uint256,uint256)", +"45e4fd6e": "listItem(uint256,address,string)", +"45e5da07": "ETHAssets()", +"45e5fd8b": "nonActivationShortWithdrawal(address[2],uint256[7],uint8,bytes32[2])", +"45e63f22": "getNumberOfMessages()", +"45e7e140": "getReservedPercentageDecimals(address)", +"45e7e14b": "ReputationUpdated(string,uint256,uint256,string,string,address)", +"45e82175": "level_5_percent()", +"45e8baa7": "checkSignatures(bytes,bytes,bytes,address)", +"45e93903": "SpooksterCoin()", +"45e965cd": "strConcat(string,string,string,string)", +"45e971bf": "updateStatus(uint256,bytes32)", +"45ea375f": "viewPot()", +"45eada10": "setProvider2(address)", +"45eb4b28": "destinationAddress20()", +"45eb7c8e": "CompleteAddOn(uint256,address)", +"45ebc145": "publish(uint256,string,string,string,bool)", +"45ebe153": "moveIcoEndDateByOneMonth(uint256)", +"45ec26ac": "distributedCount()", +"45ec7670": "WallStreetCoin()", +"45ec9e87": "Eurovision()", +"45ecd02f": "isActiveMember(address)", +"45ed68e8": "defaultSalePrice()", +"45ede900": "setPropertyOwnerSalePrice(uint16,address,uint256)", +"45ee49b9": "getUltimateOutcomes(bytes)", +"45ee9151": "BountyTransfer(address,address,uint256)", +"45ef8217": "clear_market()", +"45f00b06": "setNewTalentsAndPartnerships(address)", +"45f03f31": "EthereumLottery(address,address,address)", +"45f09140": "chargebackCoins(uint256,address)", +"45f0db24": "get_coin(uint256)", +"45f11fc8": "trancheAmountPct()", +"45f23f10": "crowdsaleFundsWallet()", +"45f28864": "Appitoken()", +"45f28e77": "genToStartPrice(uint256)", +"45f32b02": "currentModifier()", +"45f32b6d": "totalCirculating()", +"45f32e77": "currBlock()", +"45f412b0": "removeStakeHolder(address)", +"45f45449": "EtherCash()", +"45f472fc": "saltNHash()", +"45f4c1ba": "pay(uint128,address)", +"45f536f7": "sendPer2()", +"45f63927": "increaseGame()", +"45f67eb4": "setTolerance(bytes32,uint256)", +"45f6ee41": "setPrice(uint16,uint16,uint8,uint256)", +"45f7f249": "totalAllocated()", +"45f826da": "setMinimumInvestment(uint256)", +"45f8567c": "paySmartContract(bytes32,address[],uint256[])", +"45f8f1e8": "RajTestICO(address)", +"45f9072b": "setColorOrange()", +"45f988a4": "priceT2()", +"45f99d51": "claimFailed()", +"45fa4045": "getVestingPeriodNumber()", +"45fa53e7": "pieAccounts(uint256)", +"45fb0cd6": "addMultipleAddressesToCappedAddresses(address[])", +"45fbe9cb": "spawnChild(string)", +"45fbfbca": "investment()", +"45fc916c": "setPricingPlan(address)", +"45fcceb4": "foundersTokensReserve()", +"45fd2478": "_getShipType(uint256)", +"45fd3666": "isTurnDataSaved()", +"45fd4040": "addAllowCnsContract(address,bytes32,address,bytes32)", +"45fd865a": "HazzaToken()", +"45fd9e23": "claimOwnership1()", +"45fdab4c": "sellSkill(uint256,uint256)", +"45fdef65": "addCandidate(address,bytes32,bytes32)", +"45fe5850": "OrganFunction(string,string)", +"45fe5a83": "deliveryTime()", +"45fe5aea": "useKey(address,uint256)", +"45fe6e2a": "Scheduler()", +"45febc32": "BugisNet()", +"45ff59b2": "createTokensForCrypton()", +"45ff8b75": "get_HoldersProfit(uint256,address)", +"45ff8fde": "request(bytes32,uint256,uint8,uint256)", +"460123cf": "findAddressByEndpoint(string)", +"4601cded": "getNumSides()", +"46021deb": "getLastAuctionedShipId()", +"4603032a": "withdrawByTeam(address,uint256)", +"46032178": "MigrateAgentSet(address)", +"460485e0": "fundsWithdrawnByOwners()", +"46051eb7": "getProductHistoryUser(bytes32)", +"46054144": "ASIEX()", +"46055acd": "Decline(address)", +"46057b70": "timeOver()", +"46061579": "check1(uint256)", +"4606ccd1": "spinAllTokens()", +"4607c26e": "periodsPassed()", +"4607ef57": "preICOTokenRewardRemaining()", +"46080a94": "subResearch(address,uint256)", +"46082aaf": "approveDeprecation(uint256,address,bool)", +"460885ab": "_createNewLottery()", +"46091499": "transferFrom(address,address[],uint256[])", +"46093b0e": "setOracleAddress(address,address)", +"460a6507": "giveReward(address,address,uint256)", +"460ab47b": "proposeChangeOwner(address,address)", +"460ad570": "newOraclizeResult(bytes32,string)", +"460b4a45": "getTotalBonusesAmountAvailable(bytes32)", +"460c1a7a": "cancelOrders()", +"460c3be5": "owner_LockUpdateTokenAccount(address,bool)", +"460d674b": "keyFromIndex(uint256)", +"460e2049": "getPlayers(uint256)", +"460f740e": "createData(string,string,string)", +"460fce3b": "milestoneStarted(uint256)", +"4610a448": "vestingBeneficiaryForIndex(uint256)", +"461105c7": "withdrawBoth(uint256,uint256)", +"4611636e": "erc20VGC(uint8)", +"46116e6f": "sireAllowedToAddress(uint256)", +"4611a5e3": "calcRefund(address,address)", +"4611efde": "changeTBrate(uint256)", +"4611fb0e": "RSC()", +"4612b88d": "deleteDiniRequest(uint256)", +"46134e33": "getPrivateSaleEndDate()", +"46141657": "SetdivForTank(uint256)", +"4614185a": "IkuraTransfer(address,address,uint256)", +"46143a39": "setMessageSpan(uint16)", +"4614689c": "showWinners(uint256)", +"4614874e": "createEscrow(address,uint256)", +"46156ea0": "odds(uint256)", +"461645bf": "window()", +"4616caa9": "pushCoin(uint256,address,string)", +"4616fc3f": "setSystemSaleAddress(address)", +"46172c04": "calculateRewardForAddressAt(address,address,uint256)", +"461751e6": "resetMistCallLoad()", +"46183d06": "getTktPrice()", +"46190e16": "getSpecId(bytes)", +"46190ec4": "nextId(address)", +"461998fc": "cancelRecurringPayment(address)", +"4619aa19": "pvpOwnerCut()", +"4619c0ca": "insertBeneficiaries(address,address,uint256,uint256,uint256)", +"461a2df9": "PretherICO()", +"461a4478": "resolve(string)", +"461ac019": "deployedTime()", +"461ad9e9": "saveGenCode(address,uint256,string)", +"461c89b3": "massMint(uint8[],address[],uint256[])", +"461db9ad": "GoCryptoCoin()", +"461df016": "getQuantities(address)", +"461e0be5": "ElphToken()", +"461efbf8": "testEtherFundMeCrowdfunding()", +"461f48cb": "setUsersBounty(address[],uint256[])", +"461fd83b": "myEtherBros(address)", +"46203efe": "frozenAccountCoinByHour(address,uint256,uint256)", +"46205ac3": "hodlFor1y()", +"4620adbb": "tokenPricePerUSD()", +"4621a5d9": "activateRevenueShareReference(uint256)", +"4621e552": "decreaseRemainLockedOf(address,uint256,uint256)", +"462219f8": "batchTransfer(bytes32,address[],address,uint256[])", +"46226514": "isPresidenteDeMesa()", +"4622ab03": "names(uint256)", +"46238c69": "nextRedemptionRequest(uint256)", +"4623beb6": "InterestTest(address,address)", +"4623c81e": "TIMELOCK_DURATION()", +"4623c91d": "setValidator(address,bool)", +"4624321e": "decreaseApprovalWithData(address,uint256,bytes)", +"46256be7": "getAgentAdressById(uint256)", +"46272a6d": "mySavings()", +"4627de42": "getIncrease()", +"46280a80": "sell(uint8,uint256,uint256)", +"46285e45": "checkBalanceAt(address,uint256)", +"46286c18": "_validateUserActive(address)", +"46287ddb": "rateLastWeekEnd()", +"4628b375": "TokenLeft()", +"4628bc22": "teamTokensVesting()", +"4628e45e": "ABAToken()", +"4629e619": "raceNum()", +"4629ffea": "newToken(string,string)", +"462a8e05": "setRabbitSirePrice(uint32,uint256)", +"462aa19e": "setToken(address,bytes)", +"462b2fca": "isRedeemLocked(address)", +"462c1bff": "H4D()", +"462c6070": "getLockedAmount_jishis(address)", +"462c6edb": "highBonusRate()", +"462dcfa0": "newMaster(address)", +"462e91ec": "addCandidate(string)", +"462f9a28": "get(bytes32,bytes32,uint256)", +"463079b5": "resetFactories()", +"4630a0ee": "changeTicketPrice(uint256)", +"4630d82e": "upgradeTokens(uint256)", +"4630f1d5": "toggleKillSwitch()", +"463107d4": "buyerfeeDivide()", +"46315237": "fiveHours()", +"46317712": "lastDebtLedgerEntry()", +"463193c7": "startselfdrop()", +"4631db54": "_burnTokens(uint256)", +"4631e15b": "assertEq15(bytes15,bytes15)", +"46325b48": "CTCoin()", +"46336cd3": "read(uint256,uint64)", +"4634009a": "getIdx(string,string,uint256)", +"46340b37": "RakugoPresale(uint256,uint256,uint256,address)", +"46348e0b": "calculateArea(uint256)", +"4634d81c": "getDividends(address)", +"4634ea79": "countCurrentPayment()", +"46352ad9": "transferToGrowthReserve()", +"4635b449": "raisedUSD()", +"4635ecd5": "lastTicketNumber()", +"4636a159": "newPhoneToAddr(address,uint256)", +"4636db04": "changeBid(bytes32,uint8,uint8)", +"4636e095": "acceptBet(uint32)", +"4637c85d": "wildcardTokenId()", +"4637d827": "trust(address)", +"4637de3c": "removeMod(address)", +"4637fd1a": "_transferEther(address,uint256)", +"463959fa": "minJackpotBet()", +"4639888b": "jockeyForSale(uint256,uint256)", +"463ac31b": "buyStore()", +"463c3347": "getMyLandMultiplier()", +"463c75b3": "GreenworldFarmToken()", +"463cde9e": "PUBGtoken(uint256,string,string)", +"463cf730": "maxEthCapBuyInFp()", +"463d3cda": "acceptExternalTransfer(string,uint256,string,uint256)", +"463d50b8": "transferFromVault(address,address,uint256)", +"463d5ce1": "isUserWithdrawalTime()", +"463dcf0a": "merge(address,uint256,uint256)", +"463dfae6": "setTrg(address)", +"463ee88a": "createBusiness(uint256,uint256,uint256)", +"463f2c21": "giveCredits(address,uint256)", +"463f7a7d": "_updateDependencies()", +"463f7a89": "getProperty(bytes32)", +"463fb5f1": "Bogotcoin()", +"463fbb76": "setTransportationFeeMultiplier(uint256)", +"46405ffc": "OhNoToken()", +"464066f5": "vote03NoCount()", +"4640f28d": "createPlayerToken()", +"4641257d": "harvest()", +"464299f9": "getReturnFromMonster(uint64)", +"46435fa1": "createPiranhaToken(string,address,uint256,uint8,uint8)", +"4643db5b": "DonationClaimed(address[2],uint256[8],uint256,uint256)", +"4644d17e": "getAirDropTokens()", +"46463941": "calcBonusReferrers(address,uint256)", +"4646939e": "updateWhitelistMapping(address[],bool)", +"464695b3": "tokensSoldTo(address)", +"4646f62a": "setAvatarFrom(address,string)", +"46478e91": "increaseGlobalInterestAmount(uint256)", +"46479541": "setWalletId(address)", +"4647d0c6": "CUNCoin()", +"464858c6": "NVT()", +"46488459": "getTopMigrationDestination()", +"4649bfee": "setCCH_edit_25(string)", +"464ae89f": "SponsoredLink()", +"464bb7a3": "findAccess(address)", +"464cccc8": "round4Cap()", +"464cecb8": "getHyper(address)", +"464d1208": "claimReward(address,address,uint256,address,uint256)", +"464da87e": "cofoundersSupplyVestingTranchesIssued()", +"464deba6": "TridentToken(uint256,string,uint8,string)", +"464e1d46": "setBalanceOfAddr(address,uint256)", +"464e47b4": "wasSoftCapMet()", +"464f37c9": "trustedChildRefund()", +"46503676": "_useCitizenAsLumberjack(address,uint16,uint16,uint8,uint256)", +"46503c01": "KansasvsClemson()", +"4650c308": "genericCall(address,bytes)", +"465105f0": "releaseAllETH()", +"46517145": "createNewCardType(uint256,uint256,uint256,uint256)", +"4651f716": "assertEq14(bytes14,bytes14)", +"4651ff39": "setopen()", +"4652e9fe": "getStartDateOfPlan()", +"46530c34": "activityExist(uint256)", +"46533d60": "setNewReleasePeriod(address,uint256,uint256)", +"46534649": "referralBalanceOf(address)", +"46538e07": "checkExistsOwnedMedal(uint64)", +"4653a1fa": "setAttackBoostCap(uint256)", +"4654b6e2": "addMonsterObj(uint64,uint256,uint32,address,string,string)", +"46567a07": "getTotal(address[],uint256[],uint256)", +"46570653": "_share(uint256)", +"4657681b": "set_num_of_uses(address,address,uint8)", +"4657ad8e": "payTxFees(bytes32,uint256)", +"4657d848": "getVendorIds(uint256,uint256)", +"46581235": "unlockToken(address,uint16)", +"465941e5": "ATMHolders(uint256)", +"4659f42a": "withdrawAfter(address)", +"465a092d": "PRESALE_ETH_CAP()", +"465aaeb7": "windowBonusMax()", +"465af554": "setLockJackpots(address)", +"465b43d0": "joy()", +"465c2cec": "SmartBonds()", +"465c8ce0": "getRobot(uint256,uint256,uint256)", +"465ce877": "HashnodeTenaraCoin()", +"465d1cbe": "getDepositsAmountLeft(uint256)", +"465d5c27": "_tokenIsApproved(address,uint256)", +"465d6e1a": "CAUSE()", +"465e759b": "testRestart()", +"465e920e": "getLineData(uint256)", +"465f1d07": "CrowdTmoney5()", +"465f41b1": "multiOwner(address[])", +"465fa408": "calculatePriceForTokens(uint256)", +"465fe311": "KEP()", +"46601278": "TotalTOkenSupply()", +"46602ce7": "FOUNDERS_POOL_ADDR()", +"4661bb98": "setClassWhitelist(uint32,bool)", +"46621234": "tmpAddr2contractAddr(address)", +"4662299a": "issuanceFinished()", +"4662fbdf": "promotorSale()", +"466339fb": "_rewards(uint256,uint256)", +"46642921": "changeModerator(address)", +"4664611e": "winningNumber()", +"4664b235": "bytes32_to_bytes(bytes,bytes,bytes)", +"4664fe1b": "changeMinFunds(uint256)", +"4665096d": "expiration()", +"46653287": "createInitialTokens(address,uint256)", +"466551f1": "LinqToken()", +"466559e2": "S26ICO()", +"46656c46": "OxToken()", +"4665975d": "registerCustodian(address,address)", +"46682cab": "canFinishTournament()", +"46683308": "freezeAccountForLogic(address,bool)", +"46689c64": "startPlaceOrder(uint256,address)", +"4668b43b": "updateTelegram(uint256,string)", +"4668f372": "MaxMiningReward()", +"466916ca": "pauseStatus()", +"466985f3": "escape(uint256)", +"4669e680": "getPreEntranceMemberCount()", +"466a3443": "getIndividualPercent()", +"466ae314": "forwardedOutcomeSetTimestamp()", +"466bb312": "getDeposited(address)", +"466bc3bd": "GOXX(uint256,string,string)", +"466bf275": "getFreeToad()", +"466c35fc": "MINT_ADDRESS()", +"466c3a2b": "getChecksumAlgorithmCount()", +"466ccac0": "forSale()", +"466cf98f": "giftBalance(address)", +"466d3d38": "setDragonTactics(uint256,uint8,uint8)", +"466df592": "votingPeriodBlockNumber()", +"466e37e7": "newTapProposalFromTokenHolders(uint256)", +"466e561f": "updateReserve(address,uint8,bool,uint256)", +"466ebdf6": "setAddressOut(address)", +"466f0004": "getData_10()", +"466f8870": "Solar()", +"4671e65e": "proposeEmergencyWithdrawal(address)", +"4672f555": "pow(int128,int128)", +"46743691": "transferPublisherRecord(address,address)", +"467523fa": "setBuyerRate(address,uint256)", +"46755c68": "setEndingBlock(uint256)", +"46758d0b": "setAgentRate(address,uint256)", +"4676b897": "balanceOfUnclaimed(address)", +"467730fb": "toFound()", +"4677b540": "ATOToken()", +"4677fe53": "validUnitId(uint256)", +"467abbbd": "addPlayerHistory(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"467aeec9": "addShareholderAddress(address)", +"467d7289": "clearRound(uint256,uint256,bytes32,bool,uint256,uint256,uint256,uint256)", +"467de087": "withdrawAdvisorsTokens(address,uint256)", +"467eb43f": "verifyIdentity(address,bytes32,uint256)", +"467ed261": "getDSTNameBytes()", +"467f0b7b": "del_rank(uint256)", +"467f85e4": "DividendPayment(uint256,uint256)", +"468014e1": "startTimeSale1()", +"46804137": "bonusStep()", +"46807803": "_payoutMining(uint256,address)", +"4681067d": "incAdminEpoch()", +"468129a5": "setUnit(uint256,uint256,uint256)", +"46817362": "importersBanksDraftMaturityDate()", +"46822869": "BTFM()", +"4682ff71": "redeemMarketingToken(string)", +"4683ef63": "delayedOwner()", +"46848114": "startOffering(uint256,uint256,uint256,uint256,bool)", +"4686030f": "promethExecute()", +"468628e1": "getActivityById(uint256,uint256)", +"46862c8f": "mintOnce(string,address,uint256)", +"4686753d": "Crowdfunding()", +"46875458": "ARM()", +"4688a372": "withdraw(address,bytes8)", +"4689ab4d": "right21(uint256)", +"468a0413": "parseResult(bytes32,string,address)", +"468ae69d": "multiMint(address[],uint256[],string)", +"468b0c1d": "AllPay()", +"468b0fcd": "preSaleGoalReached()", +"468b0fe2": "setBridgeNode(address,address,bool)", +"468b3b33": "unlockedBalanceOf(address,uint256)", +"468c17d7": "_sendMsgSndr(address,address)", +"468e1b53": "DEC15Contract()", +"468e4509": "setAutoridadElectoral(bytes32)", +"468ed002": "INITIAL_VUP_TOKEN_SUPPLY()", +"468eeece": "revertGame(address)", +"468f02d2": "getUnderlyingPrice()", +"468f3dcd": "getTokenHoldersCount()", +"46904840": "feeRecipient()", +"46906982": "amountRaisedEth()", +"46911b64": "testDisputedWriteValid()", +"46912a4d": "PERC_TOKENS_TO_BIZDEV()", +"46915fc4": "getAllShareholders()", +"4691a998": "addVesting(address,uint256,uint256)", +"4692a481": "WilliamCoin()", +"4692d7e3": "BitQ()", +"4693667a": "changeMdtFoundationAddress(address)", +"469450cc": "disableLockDown()", +"4694fe85": "isUseContractFreeze()", +"469506bf": "getFinalSeed(uint256,uint256)", +"469507c6": "transferReward(uint256,address)", +"4695cf7a": "getSteakPrize()", +"4696890e": "ethworld()", +"469737d5": "forceRejectVotes(bytes32,address)", +"46975b9a": "swypeCode()", +"4697f05d": "setAllowed(address,bool)", +"4698ad05": "transferWhileLocked(address,uint256)", +"4698d110": "numMembers()", +"4698d920": "setMintAuditApproval(address,address,address)", +"4698da9d": "releaseVestedTokens(address,address)", +"469912d7": "Crowdsale(uint256,address,address)", +"46999ee5": "addNamespaceMember(string,address)", +"469a6947": "unlockTimeOf(address)", +"469aaa98": "BitSTDLogic(address)", +"469ab1e3": "contractNameHash()", +"469bb426": "failedDonations(address)", +"469c62a6": "buy_tokens()", +"469c7f4d": "transferOwner2(address)", +"469c8110": "sendMessage(string)", +"469c8dbb": "ExternalSale(uint8,bytes32,address,uint256,uint256)", +"469e2d5c": "submitPresetTransferes()", +"469e9067": "records(address)", +"469ef000": "hasValue(address[],address)", +"469f4c41": "setPreIcoStatus(uint256)", +"46a06ddb": "getPreviligedallowed(address,address)", +"46a06eb9": "LogTimedTransition(uint256,uint8)", +"46a1749a": "AgingTransfer(address,address,uint256,uint256)", +"46a1cd08": "getAvailableReward(address)", +"46a1d95f": "closeMarket(bytes)", +"46a1fabf": "Withdraw(address,uint256,uint256,bool,bool,string)", +"46a2679a": "getSubpotsCount(uint256)", +"46a2b53e": "GAS_REQUIREMENT()", +"46a3e290": "Defreeze(address,address,uint256)", +"46a3ec67": "TheAnswerIs(string)", +"46a54e15": "privatesale_start_time()", +"46a5b318": "DutchAuction(address,uint256)", +"46a5bf0c": "airDropStage()", +"46a60e99": "buyRoseGRLC(bytes32,string,uint256)", +"46a672bd": "createCard(string)", +"46a6c499": "freezeMyFunds(uint256,uint256)", +"46a7551d": "isOnBattle(address,uint64)", +"46a79a4e": "changeGameSettings(uint256,uint256,uint256,uint256,uint256,uint8,bool,uint256)", +"46a9d680": "EthereumGold()", +"46aa6644": "sendAllFeeToAddress(address)", +"46aaf139": "getSignersCount(bytes32)", +"46ab3d5e": "evaluateProposalMarket(uint256)", +"46abf8a8": "setVariables(uint8,uint16,uint16,uint16)", +"46ace8fd": "removeServer(string)", +"46ad5859": "getTokensRemaining()", +"46ade2de": "RESERVED_TOKENS_FOR_PRE_ICO()", +"46ae38a8": "getHexSymbol(string)", +"46aee903": "changeminBuy(uint256)", +"46af23f5": "InstantLottery(address,address,bool,address)", +"46afb963": "CrowdsaleState()", +"46b04e53": "PlayerInfoPerZone(uint256,uint256)", +"46b1d3be": "endTimePreICO()", +"46b207b8": "checkExpiry()", +"46b249b9": "tokenSaleOnHold()", +"46b305d6": "lockBetsForWithdraw()", +"46b33bc2": "getDonebountyAmount(address)", +"46b33e05": "getFreeTurtle()", +"46b4320c": "showUserBalance(address)", +"46b45af7": "isMintable()", +"46b55416": "subBuy(bytes32,bytes32,bytes32,address)", +"46b56bf6": "contract_sha256()", +"46b5d107": "testFailMintGuyNoAuth(int256)", +"46b5e202": "set_num_levels(uint256,uint256)", +"46b61083": "GoDigit(uint256,string,string)", +"46b65ffd": "getModule(uint8,uint256)", +"46b7068c": "returneth(bytes32)", +"46b753a2": "setChargeFeePool(address)", +"46b77d9f": "areFundsReleasedToBudget()", +"46b84cad": "getPackageById(uint256)", +"46b8c49e": "setReserveData(address,uint256,address)", +"46b98d0c": "startContract(bytes32,uint64)", +"46ba6f61": "setSuppressedGame(uint256,bool)", +"46ba7783": "setDistributionMinter(address)", +"46bb2833": "founderAddress()", +"46bbb6cf": "removeSshKey(string)", +"46bc29bf": "getGoldMigration(uint256)", +"46bd7067": "requestCoinMarketCapPrice(address,bytes32,string,string)", +"46bdca9a": "equal(string,string)", +"46be2310": "export(bytes8,address,address,uint256,uint256,bytes)", +"46be2e0c": "left32(uint256)", +"46be6f87": "newGame(uint8,string,string,bytes32)", +"46be96c3": "amountFilled(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", +"46be9c48": "lockState()", +"46bf3df3": "_setWallets(address,address,address,address)", +"46bf5864": "ERC223Token_STA()", +"46c017b5": "zhuchu(uint256)", +"46c068c3": "testEndsWith()", +"46c092b2": "presaleGuaranteedLimit(address)", +"46c13d28": "changeAccessTokenFee(address,string,uint256,uint256)", +"46c2997a": "notMoreThan()", +"46c3166f": "testThrowRetractLatestRevisionNotOwner()", +"46c34832": "WinnerProvidedHash()", +"46c49c58": "CustomToken(string,string,uint8,uint256)", +"46c4e533": "withdrawUpdate(bytes32,uint256,address,address,uint256,uint256,bytes32,bytes,bytes)", +"46c52b1a": "blockHexCoordsValid(int8,int8)", +"46c59373": "ethManagementPropagate()", +"46c66b27": "_transferAll(address,uint256)", +"46c6f325": "TEACHTokenToken()", +"46c715fa": "original()", +"46c797e2": "updateMarriageLicenceImageIPFShash(bytes)", +"46c7c126": "getChallenges()", +"46c968db": "blocktubeClip(string,uint256,uint256,uint256)", +"46c9b457": "privatePreSalePrice()", +"46ca48a2": "freeAmount(address)", +"46caf5e8": "BTB()", +"46cc3179": "getComponent(string,string)", +"46cc43fb": "decodedSecret()", +"46cd9b23": "_triggerNewPVPContender(address,uint256,uint256)", +"46cdb099": "shareholderID(address)", +"46ce33d4": "clearLockBalance(address)", +"46cee8f7": "TemporaryPyramid()", +"46cf1bb5": "lockState(address,uint256)", +"46cf6d2e": "_validate(uint256,uint256,uint256,uint256,uint256)", +"46cffffd": "NewAreaStatus(uint256,uint8,uint8,uint8,uint8,uint256)", +"46d0a022": "transfer(address,address,address,address[],uint256[])", +"46d0e892": "makeOptions(uint256,address,uint256)", +"46d0eb60": "addAlias(address,string)", +"46d0fb60": "isUserLicenseValid(address,string)", +"46d1501a": "PoP()", +"46d17bfd": "LongBought(address[2],uint256[2],uint8,bytes32[3],uint256)", +"46d17c3a": "Unregister(address,uint256)", +"46d1c605": "balanceOfButter(address)", +"46d22c70": "canBreedWith(uint256,uint256)", +"46d24cbb": "refundedWei()", +"46d36fa0": "ChristopherRobinRT()", +"46d46a6a": "CashTelex()", +"46d47cdf": "testFailCreateWithParentsParentNotInUse0()", +"46d5688e": "RATE_CROWDSALE_S1()", +"46d64aa2": "Kuberand()", +"46d667db": "setBytes32(bytes)", +"46d6b1e8": "getChampsForSale()", +"46d6c93b": "addFeed()", +"46d7195d": "vote_until()", +"46d73def": "hasHalted()", +"46d7df42": "setTokenContactInformation(string)", +"46d89444": "getCrowdsaleTierList()", +"46d95146": "anvlTechToken()", +"46db63d7": "rewardUser(uint256,address,uint256)", +"46dbf9b0": "pickupProduct(uint256)", +"46ddb7db": "setAccountBalance(address,uint256)", +"46de0fb1": "isFrozen(address,address)", +"46deb279": "ElementUpgraded(uint256,uint256,uint256,address,uint256,uint256,uint256)", +"46df1578": "refferBonus()", +"46df2ccb": "setRate(uint256,uint256)", +"46e04a2f": "claimTokens(uint256)", +"46e06634": "approveKYC(address,bool,uint256,string)", +"46e0c223": "_createOfAthlete(address,string,address,uint256,uint256,uint256)", +"46e184da": "Olife()", +"46e1bfbb": "acceptAtGroup(address,uint256)", +"46e1f732": "investorsProcessed()", +"46e1fa55": "_removeDefaultOperatorByTranche(bytes32,address)", +"46e2577a": "addProvider(address)", +"46e2a174": "preIcoTokensSold()", +"46e33afc": "getFACTOR()", +"46e34823": "tan(uint256,string,string)", +"46e36060": "subBalances(address[],uint256[])", +"46e3cb1a": "sellTradeConfir()", +"46e44f63": "getCheckRecordTS(bytes)", +"46e4959d": "mintMulti(address[],uint256[])", +"46e4d35d": "numOfLoadedEarlyPurchases()", +"46e5500f": "LogFinalized(address,uint256)", +"46e5c323": "largestHODLERBalance()", +"46e6ffdd": "OwnableStorage()", +"46e767bc": "Log2(address,bytes32,uint256,string,string,string,uint256,bytes1,uint256,uint256)", +"46e780b0": "getLinkHash(address)", +"46e7ccac": "isAuthorizer(address)", +"46e7f38e": "BayCoin()", +"46e87b1e": "RgiftTokenSale()", +"46e93dbc": "maturityProcess(string,bool,uint256,uint256)", +"46e9ab22": "Gateway()", +"46e9e3c2": "reclaimPeriod()", +"46ea2552": "transferManager()", +"46eac50e": "superTransfer(address,uint256)", +"46eba0c1": "fundWithdraw(address,uint256)", +"46ebb5e2": "TimedPresaleCrowdsale(uint256,uint256,uint256,uint256)", +"46ec56c5": "getNumInvestments()", +"46ed24a3": "setAirdropToken(uint256)", +"46ed3199": "ATCToken()", +"46edef6c": "accICO()", +"46eea9a1": "secondStageRaised()", +"46eeed5f": "rolloverFee(address,uint256,uint256)", +"46ef6660": "createTokenContract(address,bytes32)", +"46f02832": "queryPermissions()", +"46f04694": "periodICOStage8()", +"46f0975a": "signers()", +"46f19888": "get_total_info()", +"46f24c6a": "functionSix(uint256,uint256,uint256,uint256)", +"46f25cad": "setAuthor(string,string,address)", +"46f2e880": "payForMyselfWithChecksum(uint128,bytes1)", +"46f42dff": "Win(uint256,uint256,uint256,address,uint256)", +"46f43f15": "StierBitToken()", +"46f74c6d": "setArbitrationPercentage(uint8)", +"46f76648": "getTotalEthSended()", +"46f7a883": "BuyTicket(uint8,uint8,uint8)", +"46f7cf87": "insert(address,uint256,address,address)", +"46f84dc4": "grantPermission(address,address,bytes4,address)", +"46f8e5ec": "getBlocksUntilStart()", +"46f92818": "setCreditDaoAddress(address)", +"46f99063": "totalSent()", +"46f9bedf": "costPerTicket()", +"46fa14e5": "MyFeed2Token()", +"46fa2574": "preIcoMembers(address)", +"46fae630": "getAllCardsAttack()", +"46fbf68e": "isPauser(address)", +"46fc0294": "senderRefund(bytes32,uint256,bytes20,address,address)", +"46fc9037": "__beneficiaryTransfer(uint256)", +"46fcafe2": "etherContributions(address)", +"46fcff4c": "availableFunds()", +"46fd9446": "setUsdEtherPrice(uint256)", +"46fde171": "closeCdp(address,uint256,uint256,address)", +"46fe2edb": "reserveIAMDestination()", +"46fec37b": "LogBounty256(address,uint256,string)", +"46ff099d": "cancelOrderByPayer(string)", +"46ff43dc": "totalInCents()", +"46ff4ce6": "betRedCoin()", +"46ff64f3": "setOraclizeRoundGasFee(uint256)", +"46ff7eac": "depositContrac(uint256)", +"46ffb216": "m_startTimestamp()", +"46ffdfbc": "getMax(uint16[])", +"47002c6d": "TOTAL_RECEIVED_ETH()", +"47006460": "maximumInitialBuyoutPrice(uint256)", +"4700d305": "panic()", +"4700dc57": "setFirstBonusTokensLimit(uint256)", +"4700fada": "GVToken(address,address)", +"47021780": "QSBH()", +"47026d90": "Volkstest3()", +"47028fcf": "getSponsorshipAmount(address,uint256)", +"4702d115": "dataCalc(uint256,uint256)", +"4702fa12": "_getCurrentRound()", +"47040cb4": "getStateProofAndHash(bytes,uint256)", +"47048c7b": "getMemberBoss(address)", +"47055321": "deduct(address,uint256)", +"4705b55b": "XCOIN()", +"4705d888": "getlastmoney()", +"47062402": "buyFee()", +"47064d6a": "setData(string)", +"4706840e": "destroykill()", +"4706c375": "_withdrawEquity(address,uint256)", +"4707f44f": "tokensOfOwnerByIndex(address,uint256)", +"47085958": "SetIndustry(string)", +"47089f62": "addVerified(address,bytes32)", +"470905b1": "Founder3()", +"470a5f4e": "reinvest(uint256,bytes32)", +"470b1984": "investedBTC()", +"470b1f7c": "AnetCoin()", +"470b2867": "tablet_owner()", +"470b6e0e": "addStackholderTransaction(address,bool)", +"470bb62b": "record(string,string)", +"470ca291": "referrerLevel3Ether()", +"470d7722": "batchAddAddresses(address[],uint256[])", +"470e872c": "transferBill(address)", +"47102a5d": "ETC(address,uint256)", +"4710411d": "twenty_percent_of_amount()", +"4710c5bf": "preSale3()", +"4710c63c": "excavation()", +"4710cfd7": "nContract()", +"47115192": "voteCut()", +"4711748d": "setNDCContractAddress(address)", +"4711dbe1": "registrationBounty()", +"4713f29b": "setBuyingCostumeRate(uint256)", +"47146b28": "setFiscal(uint256,uint256,bytes32)", +"4714c0aa": "proxyAccountingCreation(address,uint256,uint256)", +"47156810": "scheduleNewDerivativeToken(address,address,uint256)", +"4715b308": "decreaseApprovalPreSignedCheck(address,address,uint256,uint256,uint256,uint8,bytes)", +"47166f62": "Quarkchain(uint256,uint256)", +"47170eb8": "LogEtherTransfer(address,uint256,uint256)", +"4717dea9": "getTicket(address)", +"4717f25a": "charonsBoat()", +"4717f97c": "getResults()", +"4718d108": "_transfer(address,address,string)", +"4718dc4d": "payOutVoterById(uint256)", +"47198cd1": "get_baseAmount(uint256)", +"471a20e7": "getResponses(uint256,uint256)", +"471a2270": "Lottery(uint8)", +"471a23c8": "burnMe(uint256)", +"471ab294": "handleTokensFromOtherContracts(address,address,uint256)", +"471ad963": "redeemProposalFunds(bytes32)", +"471b37cf": "VESTING_ADVISOR_DURATION()", +"471c95db": "TransferFees(address,uint256)", +"471d0481": "randomB()", +"471d4118": "releaseTimeFund()", +"471d66cb": "exceedsMaxInvocations()", +"471eab5c": "removeAllowedSender(address)", +"471efce5": "tokensForPreICO()", +"471efe66": "set_addresses(address,address)", +"471f11ec": "purchaseTown(uint256)", +"471f4722": "setOnSaleAmount(uint256)", +"471f7cdf": "favoriteNumber()", +"471fabfd": "eexploitOwnn()", +"472016da": "playersAddresses(uint256)", +"47202819": "unregisterInit(address)", +"4721ed6f": "enableRedemption()", +"47220f25": "maxPremiumDragonsCount()", +"4722361c": "canStartSettling(bytes32,address)", +"4722b4a5": "getFeeParameters()", +"47237f47": "freeStorage(uint256)", +"47241a27": "setAdditionalBonusPercent(uint8)", +"47244212": "Product(string)", +"472457cb": "addDragonName(uint256,string)", +"47249b1a": "GetEventInfo()", +"4725211b": "recordNameCount()", +"47255591": "setOuverture_des_droits(uint256)", +"4725d544": "_utoa(uint256,uint8)", +"47274dbe": "disableUser(address,address)", +"4727925a": "KEKEcon()", +"4728537c": "lockupBalanceOf(address)", +"4728d3ae": "CreatedEDU(address,uint256)", +"472905ca": "makeAdmin(address)", +"47293d15": "getAddressesCount()", +"472aa7df": "createProduct(bytes32,uint128,uint256)", +"472ad331": "InvestmentsCount()", +"472b6492": "AddEth()", +"472b6efa": "getWinRate(uint8)", +"472c681f": "addPack(address[],uint24[],uint24[],uint16)", +"472ca5e4": "allocateBid3(bytes32)", +"472d35b9": "setFeeManager(address)", +"472e1910": "verifyOpenSignature(address,bytes,bytes32)", +"472eb03d": "payLoan()", +"472f36e2": "Allocated(address,uint256)", +"472fdb67": "totalTokensReserve()", +"4730725d": "addToTimeLockedList(address)", +"4730bf06": "STAGE_1()", +"4732a7dc": "setMigrationAddress(address)", +"47337aab": "Btencoin()", +"4733a341": "SubmitClaim(address,string,string)", +"4733dc8f": "transferProxy(address,address,uint256)", +"4733ec90": "preparePayment()", +"4734922a": "generateOrderByAdmin(address,address,uint256,string,string,string)", +"473528b2": "_updatePurchasingState(address,uint256,uint256)", +"473533e6": "estimatedWeight()", +"47355ba5": "PiplToken()", +"47356bd9": "show_automated_Buy_price()", +"47356dd8": "getServiceUpdateAddresses(address,uint32)", +"4735b35f": "createDiamondAuction(uint256,uint256,uint256,uint256)", +"4735c747": "CrowdsaleToken(string,string,uint256,uint8,address,bool)", +"4735e00a": "CollectibleBought(uint256,uint256,uint256,address,address)", +"4736786b": "EthereumUnionToken()", +"47369a7c": "getPositionDeedHolder(bytes32)", +"4736b531": "TdeStarted(uint256)", +"47372325": "getChannelSize(address)", +"47373033": "enableStartBattle(string)", +"473753cb": "batchCancel()", +"47378145": "getBlockNumber(bytes32)", +"4737e852": "viewContractHoldingToken()", +"47387404": "_getGameStartAuctionMoney()", +"47395ced": "append(string,string,string)", +"473a223d": "getClosingTime(bytes32)", +"473aa2a5": "getFile(bytes32)", +"473ae9fe": "testCreateWithParent()", +"473b0d46": "setMinContribution(uint256)", +"473b4c53": "BrehonContract(address,address,uint256,bytes32,address,uint256,uint256,address,uint256,uint256,address,uint256,uint256)", +"473bc223": "gameName()", +"473bca32": "secondAllocation()", +"473ca96c": "win()", +"473e9408": "_getAttributesOfToken(uint256)", +"473edf73": "Award(address,uint256)", +"473f0117": "contributionID(uint256,address,uint256)", +"473f1803": "claimRewardForUser(uint256,address)", +"4740a08b": "getEggData(uint256)", +"474154bc": "divIsSafe(uint256,uint256)", +"47416aec": "setTokenContract()", +"4741b95c": "setPercentFrozenWhenBought(uint256)", +"47428855": "assertEq32(bytes32,bytes32)", +"47430b36": "parnter()", +"474448c4": "finishResolveFund(bytes32,string)", +"47448e8a": "set(bytes32,string,bytes32)", +"4746041f": "burnIndexedFrom(address,uint256)", +"4746cef8": "_confirmAndCheck(address,bytes32)", +"47471183": "freeOf(uint256)", +"474740b1": "batchLimit()", +"4748f7c2": "icoPhase1TimeBonusInPercentage()", +"47492352": "ROLE_PAUSE_ADMIN()", +"474a5a09": "AssetBackedToken(uint256,string,uint8,string)", +"474a88cb": "failsafe()", +"474a898b": "miniGameInfo()", +"474b2541": "setRevision(address)", +"474bbab2": "calculateTokensToSend(uint256,uint256)", +"474c0868": "getActiveBuySize(bytes32)", +"474cdca2": "countTotalInvestors()", +"474ce368": "Computer()", +"474ce872": "promisee()", +"474ceb4d": "setCrowdsaleDate(uint256,uint256,uint256,uint256)", +"474d904b": "totalTokensWithoutBonuses(address)", +"474da79a": "contracts(uint256)", +"474e9e74": "MaxICOSellSupply()", +"474ea7e9": "Cyrus()", +"474f067f": "setType(bytes32,string)", +"474fa131": "extraMintArrayPendingProcess(uint256)", +"47516910": "FileHash()", +"4751757a": "Metronome()", +"475289da": "numberOfMoods()", +"475297bc": "closeBets(bytes16,bytes16,uint256,uint256)", +"4752a3ce": "StdUInt32(uint32)", +"47535d7b": "isOpen()", +"47540b31": "setTeamAddress(address,address,address)", +"4754a311": "StatusContract()", +"4754d136": "rerollFee()", +"47556b73": "isSuperInvestor(address)", +"4757ace4": "milestoneCompleted(uint256)", +"4757f1d2": "redeemAllOutcomes(uint256,uint256)", +"47582291": "totalstakeamount()", +"4758871d": "FOUNDER_EXCHANGE_RATE()", +"4758b9cd": "checkNumber()", +"47593ae7": "oldPrice()", +"47598b62": "marketplaceController()", +"475a2ac6": "mainSale(address,uint256)", +"475a9fa9": "issueTokens(address,uint256)", +"475abbb7": "PLATAMOUNT()", +"475b54c9": "AdvancedOwnable()", +"475b723a": "setRate362()", +"475c051d": "grantPermissionBatch(address[],string)", +"475c3001": "FinishTokenSale()", +"475c420c": "setHelpMeTokenParts(address[])", +"475c578c": "walletPercentage()", +"475c5ed1": "contributedToSTO(address)", +"475c7605": "ImpeachmentSupport(address,uint256)", +"475ca435": "get_record_by_row(uint256)", +"475d41f9": "SISKCoin()", +"475d599b": "wolf2Balance()", +"475e0062": "RoundEnd()", +"475e4c0f": "buscarDocumentoPorHash(bytes32)", +"475ec95a": "PRESALE_MINIMUM_FUNDING()", +"475fd055": "supplyLeftAtOrigin()", +"4760eee3": "getStartersProxyAddress()", +"47615fa1": "RankScore(address)", +"47625694": "getPerformance(uint256)", +"476343ee": "withdrawFees()", +"47635dac": "transferContract(address)", +"4763e3fe": "LOG_ZeroSend()", +"4765fb39": "userstaticprofis()", +"4766551d": "getExCoins()", +"47665ae8": "setMaxEthPerAddress(uint256)", +"4766ae68": "RareToken()", +"476711cb": "currentPeriodEtherCollected()", +"4767aeec": "_getaward(uint256)", +"4767d305": "EventCreateRisk(address,uint128,uint256,uint256)", +"476810b5": "ico1Min()", +"4768136e": "MelonWallet()", +"47683f00": "isInTier2(address)", +"47688c74": "userAmount()", +"47695e60": "MENTORS()", +"4769ed8f": "buyFromRC(address,uint256,uint256)", +"476a29e2": "pauseStateSwithcer()", +"476a4558": "DigitalMaterai(uint256)", +"476a73ec": "transferEthToMultisig()", +"476aa607": "saleHardCapReached()", +"476b7e3b": "readyToFulfill()", +"476c089a": "finalyze()", +"476c494c": "newAnswer(uint256,uint256)", +"476c9f41": "SecurityToken(string,string)", +"476d7c13": "userToNumCities(bytes32)", +"476e04c7": "NewMessage(string)", +"476e4aa4": "Remove(uint256)", +"476e6172": "getCurrentPlayer()", +"476fe919": "setReleaseTime(address,uint256)", +"4770ca3c": "AddBTCTransactionFromArray(address[],uint256[],uint256[],bytes4[])", +"47722218": "setKycAdmin(address)", +"477269c0": "setHpbNodeAddress(address)", +"4772eb77": "callDisableCallback(string)", +"47734892": "getUserBalance(address)", +"4773e0be": "didCloseLoan(bytes32,address,bool,uint256)", +"4774027c": "changeOffchainUploaderAddress(address)", +"477492dc": "MAIN_COIN_PER_ETHER_ICO()", +"4774ef06": "forwardGas(address,uint256)", +"47751b98": "validUpgradeId(uint256)", +"477523c2": "flushERC20(address)", +"47767c5d": "CRYPTOZOLToken()", +"4776ed69": "AngelTokensHolder(address,address,address)", +"477721e9": "FrozenContract(bool)", +"4777338c": "lastPricePaid()", +"4777c1f4": "setUnownedPriceInEth(uint256,uint256)", +"4777dbcf": "EternalStorageProxyForStormMultisender(address)", +"477801b1": "getLastRoundResults_by_index(uint256)", +"47786d37": "setCap(uint256)", +"47786f51": "HODL()", +"4778a5be": "orderSubmitted(bytes32)", +"4778dfb8": "balanceById(uint256)", +"47799da8": "last()", +"4779fad9": "setMentorsTokensPercent(uint256)", +"477a0eb3": "removeAtIndex(bytes32[],uint256)", +"477a7042": "getCanvasState(uint32)", +"477adb83": "eggtracker()", +"477af741": "firstMaxAmount()", +"477bda31": "qnt10k()", +"477bddaa": "setContractAddress(address)", +"477cdbb5": "create(uint256,uint256,uint256,address)", +"477ce277": "cost(address,uint256,bytes,bytes)", +"477d47b5": "viewPreSaleRefundsInMainSale(address)", +"477d6c6c": "_emitBoardCreated(uint256,bytes32,bytes32,address,uint256,uint256,uint256,bool)", +"477e5d24": "pvpQueue(uint256)", +"477eab0a": "taxman()", +"477fe4e6": "payForTask(uint256)", +"477ff120": "addTokenAddress(address,address)", +"47803e97": "tokensOnHold()", +"4780eac1": "wethContract()", +"47810b3e": "LTY()", +"47816131": "EphronTestCoin(uint256,uint256,uint256,string,string,uint256)", +"4782f6fc": "removeOwners()", +"4783c35b": "multisig()", +"478573ca": "getMainWallets()", +"47858c79": "finalizedUpgrade()", +"478609f7": "mintTokens(int256,address,uint256,uint256)", +"4786cfea": "_estimateSupply(uint256,uint256,uint256,uint256)", +"47872b42": "unsealBid(bytes32,uint256,bytes32)", +"4787513a": "tokenHoldersCount()", +"4787e261": "calcQuickPromoBonus(uint256)", +"47883fd9": "product4_luckybuyTracker()", +"4788cabf": "getContractId()", +"4789aaef": "EthereumDice()", +"478aa69e": "unauthorizeUser(address)", +"478ae93c": "playToWin(uint256)", +"478b2f8b": "trieValue(bytes,bytes,bytes,bytes32)", +"478bdce2": "WinningNumbersEvent(uint256,string)", +"478c4238": "p_update_mResalePlotOwnerPercent(uint256)", +"478c4e0e": "resetData()", +"478cd032": "getLevelAmount(uint256)", +"478d2136": "proposalsByShareholder()", +"478db7e7": "getDataTrackingParameters(uint256)", +"478e25bf": "resetAction(bytes32)", +"478e7d7f": "getSponsorableJobs()", +"478f0735": "Jamatoken()", +"478f796a": "ownersWallet()", +"478f7b52": "mainSaleMinPaymentWei()", +"478f7eca": "CnytCoin()", +"47913dfe": "staticArrayChangeValue(int8,uint256)", +"47923d6f": "_addDividendsForAddress(address)", +"479245bb": "_transferOwnership(address,address)", +"4793017d": "stageLending()", +"47930567": "hashPosition(uint32,int64[2],bytes16)", +"4793504e": "Divider(uint256)", +"4793cebe": "allocateRemainingTokens()", +"479487e3": "getCar(string)", +"4794db02": "existenceDecimals(address)", +"479564d5": "getAssociatedTAOSettingDeprecation(bytes32)", +"4795ac60": "collectPayment(uint256)", +"47963cf8": "COINEIUM()", +"47966bc2": "spam()", +"4797debe": "approveAmountAndSetFirstUseTime(uint256,address,uint256,uint256)", +"4797f21b": "setLog(address)", +"479834ca": "generateRandomMonster(uint8[14],uint32)", +"4798a2e3": "limorico()", +"47992b25": "DST_RESERVE()", +"479a4ae9": "isSHA256HashRegistered(bytes32)", +"479a5d53": "setOtherMigrationSources(address[])", +"479ad4c3": "removeListing(uint256)", +"479b321e": "CyberCash()", +"479ba3a5": "_resetPlayRound()", +"479ba7ae": "rewardsOf(address)", +"479d29f4": "BiyuleCoin(uint256,string,string)", +"479e24e6": "setNewInvestCommission(uint256)", +"479e393c": "getBettingStastics()", +"479e840f": "playValue()", +"479ed225": "getMyGameCompleted(address,uint256)", +"479f8d33": "threeHotHoursDuration()", +"479fb784": "approveBalancesWaitingKYC(address[])", +"47a08955": "_Deposit(address,address,uint256)", +"47a0fd7e": "shieldsUp()", +"47a11f26": "lIKETOKEN(uint256,string,string)", +"47a1a2d6": "usdCollected()", +"47a21679": "sellKeys(uint256,uint256,bytes32)", +"47a21eda": "buySharesFor(address)", +"47a22ca4": "devChangeMiningReward(uint256)", +"47a34bcb": "getBlockMaxVotes(uint256,uint256)", +"47a36afd": "totalFeeFlows()", +"47a42ff7": "buy_sale()", +"47a5046a": "isKYCRequiredToReceiveFunds()", +"47a5b1b3": "addApprovedContractAddress(address)", +"47a64f44": "lockAccount(address)", +"47a66b57": "addUserEndorsement(address,bool,string,string)", +"47a68cd4": "EOSBetDice()", +"47a69105": "NewSmartSharingContract(string,uint256,uint256,string,string,string,string)", +"47a69dfd": "Vegetoken(uint256,string,uint8,string)", +"47a6e601": "getATMHoldersNumber()", +"47a7aad5": "_vest(address,uint256,uint256,bool)", +"47a8205f": "privateWeiRaised()", +"47a90325": "maxCapEcosystem()", +"47a98ed2": "WithdrawFailed(address,uint256,bool)", +"47a99264": "setBwServiceValidCaller(address)", +"47a9fd81": "rob(address)", +"47aa7cd4": "setPoolStatus()", +"47aaf4eb": "resetOldAndSetNewDiscounts(uint256[],uint256[])", +"47ab58ec": "valuationAndCutOff()", +"47ac704f": "oldTokenSale()", +"47ad396b": "setFundingRules(address,uint256,uint256,uint256,uint256,uint256)", +"47aee603": "DIW(address,uint256)", +"47aef0a9": "battles()", +"47af954d": "creationAddress()", +"47af9957": "pauseTransfers()", +"47afa4e4": "change_pre_ico_start(uint256)", +"47b24f15": "LavaWallet(address)", +"47b272c0": "startMining(uint256)", +"47b27b8b": "unblockTokens(address,address,uint256)", +"47b27fd0": "testIsComplete()", +"47b3aff8": "bundles(uint8)", +"47b40ba2": "betFreeGame(uint256,uint8)", +"47b47102": "bakeCookie(string)", +"47b4e272": "depositBTC(address,uint256,uint256,bytes32)", +"47b4f943": "canmint()", +"47b55a9d": "pendingWhitelistAddition()", +"47b5acfd": "getProposalPublishedAt(bytes32,bytes32)", +"47b5dd54": "burnedTokens()", +"47b60ec0": "investorsGrantsAmount()", +"47b64eb0": "setServerAddress(address)", +"47b6ab59": "Token(address,uint256,string,string,uint8)", +"47b7142b": "safeSubtrZJF(uint256,uint256)", +"47b72b89": "getdeptmembershipstatus(uint256,address)", +"47b79a31": "remainingTransfered()", +"47b79a40": "manVault(uint256)", +"47b82bec": "FUTURAX()", +"47b84579": "getCompte_30()", +"47b87e48": "GetSaleInfo(uint8)", +"47b8b30b": "toCancel()", +"47b950b6": "setWorkerDtPort(uint256)", +"47b989af": "MyReferrer()", +"47b98c2e": "RDWToken()", +"47ba65d2": "get(bytes8)", +"47bafa82": "refundingComplete()", +"47bb0613": "deactivateContract(address,address)", +"47bb159d": "getByFromAndToCount(uint256,uint256)", +"47bb1883": "computeReward(uint256)", +"47bb89f0": "balance(uint256)", +"47bba01d": "inactivateSelf()", +"47bbe867": "purchaseMembership()", +"47bc1f94": "tokenSaleSupplyRemaining()", +"47bc3e51": "mintBounty(address[],uint256[])", +"47bc7093": "removeIssuer(address)", +"47bda66d": "createAMIS(address)", +"47bdb7f4": "transferDisable(bytes20)", +"47bdc8b4": "oraclize_query(string,bytes[5],uint256)", +"47bdeedf": "getPlayerUsableTokensCount()", +"47be11ae": "addArrayItem(address,string,string,uint256)", +"47be7bce": "formulaPrecision()", +"47bf7924": "ClaimSHIT(address,uint256)", +"47c05c22": "massSending(address[])", +"47c0ea6b": "_invest(address,uint256)", +"47c1303a": "MeetsOne()", +"47c14648": "claimTokenReserveLife()", +"47c17bac": "getMonsterDexSize(address)", +"47c1b5cf": "setGGEFee(uint8)", +"47c1caff": "getDividendsOf_(address,bool)", +"47c23bff": "setproduct(string,string,uint256,uint256)", +"47c3114e": "OpenContract()", +"47c35910": "authorize(address,address,uint256)", +"47c3ebf3": "is_presale_open()", +"47c421b5": "changeOracle(address)", +"47c51f73": "VisibilityDemo()", +"47c55045": "transferTokensFromTeamAddress1(address,uint256)", +"47c66140": "getProposalVotes(uint256)", +"47c6ecc0": "TokenFrozen(bool,string)", +"47c705b9": "Update(uint256,address,address,string)", +"47c7b6e2": "initEthDeal(bytes32,address,bytes20,bytes20)", +"47c7e6a8": "getAssetPackName(uint256)", +"47c81699": "set(string,string,uint256)", +"47c81f22": "TTT(uint256,string,uint8,string)", +"47c848e4": "_toPct(uint256,uint256)", +"47c85634": "setEmergencyWithdrawAddress(address)", +"47c8771c": "rsVerifyPoint(uint256,uint256)", +"47c8cc69": "getCurrentTDEBonus()", +"47c8efa7": "name1()", +"47c9301f": "erc20MRL(uint8)", +"47c98521": "rewardTheWinner(uint8)", +"47c9f9e8": "getNextTimeAirdropJoin(address)", +"47ca16a2": "setMaximumClaimPriceWeiRP(uint256)", +"47ca78d7": "paymentFallBack(address,uint256)", +"47cade2b": "unlockPublic()", +"47cb1b35": "getDailyJackpot(uint32)", +"47cb7a68": "timeLeft(uint256)", +"47cbc4f1": "HasNoElement()", +"47ccca02": "nft()", +"47cd3fda": "removeTransferRate(address)", +"47cda525": "TribeProducts()", +"47ce07d7": "NewPassManager(address,address,address,address)", +"47cf6f76": "isVotingActive()", +"47cf7e1d": "calcDoubleBindedBlindHash256(string,address,address)", +"47cfbaf4": "DMDPangea()", +"47d01637": "ProofOfCommunity()", +"47d04c71": "getWithdrawCount()", +"47d0dd3c": "COPIthereum(uint256,string,string)", +"47d1045f": "setNextSeedHash(uint256)", +"47d137c5": "unFrozen()", +"47d1d135": "setPixelColor(uint256,uint32)", +"47d20373": "stages()", +"47d289a9": "setDapCarToken(address)", +"47d3523c": "_sumThem(uint256,uint256)", +"47d3856a": "awardPot(string,uint256)", +"47d38af4": "NaNoDigitalToken()", +"47d3def9": "listAddress(address,uint256)", +"47d3ed10": "newDepositContract(address,address)", +"47d4106f": "CryptoSagaArenaRecord(address,uint8,uint8)", +"47d42c73": "PaymentStatusBlockNum(address,address)", +"47d52d86": "getMessageValue()", +"47d54bff": "finishedAt()", +"47d5d5b5": "ERC721TokenMock(string,string)", +"47d690b4": "limitDateCrowdWave1()", +"47d6cd6b": "_airdropAmount()", +"47d70f74": "icoEndBlock()", +"47d8167d": "buyBack(uint256,uint256)", +"47d83127": "sendFrom(bytes32,address,uint256)", +"47d84bab": "MultiSigStub(address[],uint256)", +"47d8fcb3": "emergencySetABackend(bytes32,address)", +"47d98eb4": "QUASI()", +"47d9b0aa": "FXTOKEN()", +"47da115a": "changeETH2Token(uint256)", +"47daf09c": "SmthToken()", +"47db0a24": "buyCreditsAndSpend(string,uint256,uint8,address,uint256)", +"47dd33fb": "VerumToken()", +"47dd5138": "EPSBets()", +"47dd5172": "perAddressCap()", +"47ddb165": "HODLIT()", +"47ddf87e": "allTimeJackpot()", +"47de074f": "getNodes(uint256)", +"47de3b76": "addSubmittal(bytes,address)", +"47df1cff": "callTokenTransferFrom(address,uint256)", +"47e0d54a": "winningTickets()", +"47e122dc": "earlyBirdTokenRate()", +"47e17101": "PRIZE_TOKENS()", +"47e17349": "addBonuses(uint256)", +"47e1d550": "getGameInfo(uint256)", +"47e20183": "point(address)", +"47e2688d": "getFinalSupply()", +"47e271b8": "getWeeklyLotteryParticipants(uint256)", +"47e2a6f9": "GetSellingTokenSymbol()", +"47e2b978": "RESERVED_COMPANY_UNLOCK_AT()", +"47e2d3f5": "zeroInt()", +"47e40553": "nextRound()", +"47e46806": "toString()", +"47e4ddf2": "createFreeze(uint256,uint256)", +"47e4e65e": "INFLIV()", +"47e51d38": "getConfigs(bytes32[])", +"47e57351": "withdrawTokensFromKingWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"47e5912a": "decreaseTokens(address,uint256)", +"47e5bec3": "closeTransaction(uint256)", +"47e60236": "setICOaddr(address,bool)", +"47e621b7": "backingToken()", +"47e6924f": "sanityRatesContract()", +"47e74409": "leadingGang()", +"47e7bce6": "roundStartedTimestamp()", +"47e7ef24": "deposit(address,uint256)", +"47e81c5f": "setBuildingContract(address)", +"47e87fcd": "maxSaleBalance()", +"47e9633c": "PaymentAuthorized(uint256,address,uint256)", +"47e99232": "doRebuy()", +"47ea13df": "setCurrentOwnerFeePercent(uint256)", +"47eacc78": "rateAngel()", +"47eafefc": "mainStartTime()", +"47eb86f1": "changeTokenPrice(uint256,uint256,uint256)", +"47ec8138": "transferWithLock(address,uint256,uint32)", +"47ec8d82": "AltSocialAccountPw(bytes32,bytes32,bytes32)", +"47ec8e21": "be()", +"47ecb665": "telegram()", +"47ed0112": "setAddressFundReferal(address)", +"47ee0394": "addToWhiteList(address)", +"47ee0a69": "decreaseApprovalInternal(address,uint256)", +"47ee2992": "COINS_PER_ETH()", +"47eeb75f": "claimMethodABI()", +"47eed11e": "test_fourInvalidFalseEqLog()", +"47eef00a": "issueUnsoldToken()", +"47ef01a1": "deleteRegion(uint256)", +"47ef3b3b": "liquidateBorrowVerify(address,address,address,address,uint256,uint256)", +"47ef55fe": "buyCore(uint256,uint256,uint256)", +"47f03d0b": "getFallbackDeposit()", +"47f07880": "ChatLinkToken()", +"47f1d8d7": "minBalanceForAccounts()", +"47f2748a": "getMixerTypes()", +"47f280aa": "DefaultToken(string,string,uint256,address)", +"47f3d794": "configure(uint256,uint8,uint256,uint256,uint256,uint256)", +"47f3dde5": "rewards(address,address,uint256,uint256)", +"47f4034a": "getUnitJadeStealingIncreases(address,address,uint256)", +"47f5666f": "getSanIdFromName(string)", +"47f57b32": "retract()", +"47f61a47": "Habits()", +"47f66790": "addThing(string,string,bytes32,bytes32)", +"47f66d15": "bestPromouterInfo()", +"47f67eab": "setActionPrice(string,uint256)", +"47f710a7": "free_transfer()", +"47f7af67": "sealdate()", +"47f7b304": "ownerApproves(uint256)", +"47f7d412": "withdrawFrozen()", +"47f8b863": "getNextCutoffTime()", +"47f95923": "alterPeerToPeerMarketplaceTransactionFee(uint256)", +"47f980e5": "claimTokenAddress(address)", +"47f9aa9f": "auditors(address)", +"47f9c371": "Proof_of_Stake()", +"47fa061e": "deposited(uint8,address)", +"47fa15e2": "ICOSuccess()", +"47fa1cbd": "evIssueManagementFee(address,uint256,uint256,bool)", +"47fa5648": "Minewar()", +"47fafe7d": "setAccountProvider(uint8,address)", +"47fb0bed": "checkSender()", +"47fc216e": "getEventsLength()", +"47fc4306": "contractWithdraw()", +"47fc822f": "setTargetContract(address)", +"47fdbfb7": "StageChanged(string)", +"47fee755": "getGeneralAttr(uint32,uint8)", +"47ff6d7b": "buildId(address,uint256)", +"48006daf": "removeBreedingFromSale(uint256)", +"480111b0": "potShare(address)", +"4801206e": "OodlebitToken()", +"480140ca": "checkSidePledge(uint256)", +"48016c04": "assertEqDecimal(int256,int256,uint256)", +"480184a9": "getNewToken(uint256)", +"48025070": "setGivenReadings(bytes32,bool,bool)", +"48027610": "transferPaidOut(address,address,uint256)", +"4803724e": "removeLock()", +"4803b482": "UpdatedBlockingState(address,uint256,uint256,uint256)", +"48042e0b": "makerArguments(address)", +"480443b7": "validateBSM(string,address,uint8,bytes32,bytes32)", +"4804a623": "getflag()", +"4804e06f": "firstStageMintingDate()", +"4804e1a2": "transferBlocked()", +"4804e2a5": "WalletConnector(uint256,address)", +"4805b069": "NCRToken()", +"4806249e": "badgerWallet()", +"4806a0bd": "declineTradeOffer(uint256)", +"4806b2d2": "getPoolPrices()", +"4807270b": "cancelOffer(uint16)", +"480744e0": "setOwnerAsAdmin()", +"4808bf1c": "paymentsByCustomer()", +"480a434d": "baseprice()", +"480b1f21": "rateWin()", +"480b70bd": "scheduleCall(address,bytes4,uint256,uint256)", +"480b890d": "setPercentRate(uint256)", +"480b9122": "DebugClock(uint256)", +"480b9707": "updateSecondWallet(address)", +"480bc31f": "getTotalPot()", +"480c6ca5": "getTokensIssued()", +"480d3b2f": "manualCheckInvestmentRequired(uint256,uint256)", +"480d7504": "getMineTokenAmount()", +"480e2f8e": "LastContributorChanged(address)", +"4810034a": "AirDropper(address[],uint256[])", +"48103077": "set_tokens_received()", +"48107843": "getNextCallSibling(address)", +"4811647c": "withdrawTip(uint256)", +"4811af4a": "preIcoMax()", +"4811c070": "team1Address()", +"4812663f": "nAuditorsRequired()", +"4813d8a6": "isAllowedToMint(address)", +"4813e3e5": "halvingCycle()", +"48144ef6": "BillHenryTestCoin()", +"481456f9": "probability()", +"48146113": "userDeposit()", +"48146341": "updateMaxGasPrice(uint256)", +"4814bee8": "useDragonSpecialPeacefulSkill(uint256,uint256)", +"481531e9": "FeeToken()", +"48156d9c": "Loss(address,uint8,uint256,bytes32,bytes32,uint256)", +"4815ccea": "confirmAndForwardOnBehalfWithRevert(address,uint256,bytes,bytes32,uint256[2],uint8[2],bytes32[2],bytes32[2])", +"4815d4a9": "SECOND_SUPPLY()", +"4815d83f": "setBountyTeamUnfreezeTime(uint256)", +"4817c3e2": "_modifyTopUpLimit(uint256)", +"4817db70": "approveAndCall1(address,uint256,bytes)", +"4819d270": "approveRobot(address,uint256)", +"481a3fc4": "close(address,uint256,uint256)", +"481a4f2a": "fundLockTransferFrom(address,address,uint256)", +"481ae5d0": "setColdLedger(address)", +"481af3d3": "kittyIndexToApproved(uint256)", +"481b3dbb": "CentsToken()", +"481b659d": "permitPermanentApproval(address)", +"481c6a75": "manager()", +"481d3bd5": "setRegionUpdatedAt(uint256,uint256)", +"481dbaa4": "amountWithTip(uint256)", +"481ed14c": "YetAnotherUselessToken()", +"481ef4fd": "getAdPriceDay()", +"481f9555": "ALLOC_SC()", +"481fb72a": "numRentStatuses()", +"481fcbf4": "ApolloCoinTokenSale(uint256,uint256,uint256)", +"4820059f": "setDisallowedForMinting(address,address)", +"482076b6": "preICOHolders(address)", +"4820946a": "getContributorRemainingSaleAmount(address)", +"48224f67": "SUPPLY_FOR_SALE()", +"4822d008": "hexControllerAddr()", +"4825fc0d": "_ownerWallet()", +"48261921": "getLotteryPrizeInfo(uint256,uint256)", +"4826a425": "sub_codicefiscale(string,uint256)", +"4826e9c5": "UTC2MYT()", +"482717a4": "GetAddrCallQty(address)", +"482769f3": "distributeFunds(uint256,uint256)", +"482871ed": "_transferSigner(address)", +"4828a833": "MultiTransfer()", +"4828f4a2": "recover(uint256,uint8,uint256,uint256)", +"48293aae": "showKeys(uint256)", +"482961e1": "updateReading(uint256,uint256)", +"4829b393": "Tombola()", +"482a0bc9": "computeTokenAmountAll(uint256)", +"482ae8a2": "lastBlock_v8Hash_uint256()", +"482b27c9": "GetAdminAddress()", +"482ccedd": "_payFees(address,uint256,bytes4)", +"482d3af0": "allOwnerOperations(address)", +"482d51e0": "startNewGame()", +"482d7d5a": "_mine(uint256)", +"482da403": "buyme()", +"482f63b0": "postMessage(bytes32,bytes)", +"482fbae2": "_resultToRoll(string)", +"4830868b": "setPrWallet(address)", +"4830d5d9": "removeRestriction()", +"4830e266": "buyReferral(address)", +"4830e636": "setFreeClaimAllowance(address,uint256)", +"4830fd5f": "TotalLose()", +"48318cbc": "newIdTankProduct()", +"48330262": "priceIncrease_20_January()", +"48330cf6": "updateAvailability(uint256)", +"48335238": "FrozenFunds(address,bool)", +"48338323": "getRanomSecret()", +"48338756": "withdrawArbFunds()", +"4833c47c": "getTokenByBid(uint32)", +"48351617": "consultarSerie(string)", +"483699f4": "tokensFor1EthP6()", +"4836f823": "salesRates(uint256)", +"48370565": "tradeValue(address)", +"4837715a": "___initialize(address,address,address)", +"48378eea": "getBool2()", +"4837e2fa": "amountOfLegs()", +"48389870": "cutToInvestorsDividendPool(uint256)", +"4838d165": "blackList(address)", +"483a15ed": "getManagerFor(address)", +"483a20b2": "setCrowdsale(address)", +"483a6cf9": "transferForExchange(address,uint256,string)", +"483a83df": "setKYC(address)", +"483b04e3": "angelExchangeRate()", +"483b1a76": "isInPassFilter(address)", +"483ba09e": "setBitcoinBridge(address)", +"483c8400": "MIN_FUNDING()", +"483c8abd": "UpSuccess(string,address)", +"483d31e9": "sfc(uint256,string,string)", +"483d45bd": "getProvider()", +"483d8b77": "onehour()", +"483e3956": "killPoll()", +"483e7872": "changeRealZipper(address)", +"483ea316": "bindOrderStakes(address,int256)", +"483eef18": "comminglerSellsProductSKUWithProRataIngred(address,uint256,string,uint256,string,string)", +"483f1b18": "MigratedTokens(address,uint256)", +"483f31ab": "consume(uint256)", +"483f5082": "getPriceTicket()", +"483f69c0": "HPToken()", +"483fa94b": "placeorder(uint256,uint256)", +"48401f1a": "joinBytes(bytes,bytes,bytes)", +"48403ad4": "preICOtokensSold()", +"4840d354": "XNGToken()", +"48410f80": "hexToString(bytes32)", +"48419aed": "tokensRemainingStage1()", +"484293a7": "VertexCoin()", +"4842f639": "setBreedingAddr(address,address)", +"4843b358": "withdrawalsAllowed()", +"484412e5": "A5DToken()", +"48447983": "QiMingCoinToken(uint256,string,uint8,string)", +"4844f367": "placeBet(string,string)", +"484595fa": "encode(uint256,uint256,uint256)", +"4845d3f8": "closingTimeExtensionPeriod()", +"4845d40c": "withdrawATokens(address)", +"4846f559": "getIsWinnerSelected()", +"4847a79c": "_transfer(address,uint256)", +"48481979": "getHorsey(uint256)", +"48481b8a": "ElepigCrowdsale(uint256,uint256,uint256,address,uint256,uint256,address,address,address)", +"4848b1a5": "setData(uint256,uint256)", +"484916a3": "NewInvestor(address,uint32,uint256)", +"48498729": "_fetchOrdersForPayer(address)", +"484b8d33": "setWalletAmount(address,uint256)", +"484b973c": "ownerMint(address,uint256)", +"484c4056": "Redeemed(address,uint256,uint256,uint256)", +"484c8675": "allocateTokens(address[])", +"484c98af": "supplyAtIndex(uint256)", +"484cb173": "MiddleClass()", +"484db63f": "firstRate()", +"484dd086": "preFundingStart()", +"484dd472": "shobozilToken()", +"484ec26c": "onPayout(uint256,uint256)", +"484eccb4": "lastGen0SalePrices(uint256)", +"484f4bc0": "noStoresSet()", +"484f5a61": "GetChallengeInformation(uint256)", +"48509d2c": "updateCapsAndRate(uint256,uint256,uint256,uint256)", +"48519189": "MonedaAlcala(string,string)", +"4852a273": "setWhitelistStatus(address,address,bool)", +"4852e54b": "SolarNA(address[],uint256[])", +"48538112": "totalRaisedAmountInCny()", +"485458a1": "GetContractStageTermination()", +"48546971": "closeIco()", +"4854bde0": "pvt_plmt_set()", +"485587a2": "employeePoolTokens()", +"48558be7": "getOnTokenTransferValueValue()", +"48560630": "bonus3Ends()", +"4857d52d": "setLiquidityParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"48582a2a": "units40percentExtra()", +"48593bae": "getEnumValue()", +"48594f43": "powerAddr()", +"4859f430": "registerVehicle(string,string,uint8,address)", +"485ac9fd": "_canSetGameOver()", +"485c5e96": "generateTokensAll(address[],uint256[])", +"485cc955": "initialize(address,address)", +"485d5d7b": "TSTORZCv1()", +"485d5dd2": "DayInSecs()", +"485d7d94": "removeAuthorized(address)", +"485d992c": "getDoc(address)", +"485dc6cf": "create21KittiesTokens()", +"485e16a5": "summReserve()", +"485e35d3": "updateWhiteList(address,address,bool)", +"485e82d7": "tokenIdsForTeam(uint32)", +"485f2ce3": "AccendiCassaAutomatica()", +"485f7a7e": "preSaleAllotment()", +"4860165c": "destroyIdentifier(bytes32)", +"48601a7d": "getTxnNum()", +"486083fe": "itemLottery()", +"48612fc0": "IAHCToken()", +"4861b2cc": "Create(string)", +"4861f39b": "getDepositedOrderDetails(uint256,address)", +"486201ab": "deapprove()", +"48624e44": "ATTPlaceHolder(address,address,address)", +"4862e650": "setVerificationCodeHash(string)", +"48636254": "setWhiteBacker(address,bool)", +"4863ba17": "setLibraryAddress(address)", +"4863ed97": "setCoins(address,address)", +"48640aba": "phase1WeiRaised()", +"48642e21": "bleachDailyLimit()", +"4864d140": "baseAmount()", +"4864d8d9": "activeStage()", +"48650338": "withdrawDividends(address)", +"48655faa": "setMintingOracle(address)", +"486575a5": "reducePledgedFees(uint256)", +"4865a24a": "strToBytes(string)", +"4865c7bf": "timeInfo()", +"4866352b": "scrapCounter()", +"48663e7d": "modifyHoldings(address,uint256[],uint256[],bool)", +"48664c16": "transferPreSignedHashing(address,address,address,uint256,uint256,uint256)", +"4867ec4f": "decodeParamOp(uint256)", +"4868204b": "FundTransfer(address,uint256,uint256)", +"48686205": "DevConSchoolReward()", +"48688367": "fundMintingAgent()", +"4868ab47": "Yumerium()", +"4869687b": "getAgreedMediators()", +"4869854a": "StfuTokenCrowdsale()", +"486a03e0": "approveMappingProposal(address,address)", +"486a7e6b": "burnAmount()", +"486b7217": "getnumber()", +"486c182c": "minAcceptEther()", +"486c363d": "_transfer_token(address,address,uint256)", +"486c50f3": "getDiscountHourglass(bytes32,uint8)", +"486d6aa8": "factorReward()", +"486de794": "_pay(address,uint256)", +"486e60f5": "createGoldBuyOrder(uint256,uint256)", +"486e66da": "hungry(uint256)", +"486e97ad": "VLUToken()", +"486ea48d": "Nodes()", +"486fc7e8": "tokenOwnership(address)", +"48700c7c": "EVEN()", +"48709183": "bountyBeneficiariesCount()", +"4870b81d": "transferToWallet()", +"4870dd9a": "PERCENT_DIVISOR()", +"4871052b": "LogSignature(address,bytes)", +"48719120": "renewFarmerCertificate(address,uint256)", +"4871c4c1": "ownerWithdrawTo()", +"48724227": "KickOwned()", +"487260bb": "startBlockBonus()", +"487269fb": "VLCToken()", +"48727dca": "TradeBitToken()", +"4873c721": "_remainingBlocks(address)", +"48749616": "getPoolInformation()", +"4874a41f": "Tfarm()", +"4874e62d": "concat(string,string,string)", +"48758697": "getRarity(uint256)", +"487621cc": "addNewbond(uint256)", +"4876a339": "accept1(uint256,uint256)", +"4876f3e5": "comfirmRedeem(uint256)", +"48794149": "credosReserveAllocation()", +"4879e07c": "happyNewYear()", +"487a5057": "getGameStart(address,uint256)", +"487a6e32": "deliver(uint64,bytes32,uint64,bytes32)", +"487a8043": "receiveApproval(address,uint256,address,bytes,bytes)", +"487a9e27": "USD_CAP()", +"487cd86f": "right34(uint256)", +"487e1d1f": "getNameOfAddress(address,address)", +"487f3f06": "team_address_count()", +"487ff8b6": "winningaddr()", +"48803406": "removeFundAccount(address)", +"48807db1": "getPI_edit_12()", +"4881148e": "safeGetPartialAmountFloor(uint256,uint256,uint256)", +"4881ae73": "add(uint16,uint16)", +"48823786": "allstocksFund()", +"4882419d": "isEpocum()", +"48839789": "ProofOfAIDS()", +"4883b6ce": "CryptoTorch()", +"4883c9dc": "prevHodlers()", +"48849c5a": "blockTransferFrom(address)", +"4884f459": "buyListing(uint256)", +"4885b254": "batchTransferFrom(address,address[],uint256[])", +"4885d732": "TokensAllocated(address,uint256,uint256)", +"488683f3": "_Token(string,string)", +"48868ac8": "sanityCheck(bytes32,bytes32)", +"4886d2d5": "setIsOver(bool)", +"48870630": "abi()", +"488725a0": "versions(address)", +"48887c8b": "setFreeAlien(uint16)", +"48889813": "mintedPercentOfTokens()", +"4888bc11": "getCompensation(uint256,uint8,address)", +"4888c619": "cryptocompareBtcOracleUrl(bytes32)", +"48894ad6": "FiveBalance()", +"488981cd": "countCourse()", +"4889ca88": "receiveApproval(address,uint256,address)", +"488a24c6": "isWalletContract()", +"488a6705": "AddConsentData(uint256)", +"488ab2c0": "TOKEN_EXCHANGE_RATE()", +"488b3538": "shares(address,bytes32,int256)", +"488b380b": "setLpIsStart(bool)", +"488bfa0b": "claimPaymentTokens(address,uint256)", +"488c1709": "setRefundAgent(address)", +"488c65fc": "stakeWithSignature(bytes32,uint256,uint256,uint256,uint256,bytes)", +"488c7951": "abstractFn(uint256)", +"488cec69": "tokensAreAvailable()", +"488dc208": "updateUrl(address,bytes32[5],address)", +"488ede8b": "getUserRating(address,address)", +"488f1e43": "getSellingInfoByIndex(uint256)", +"488f231f": "createAssociation(uint256,uint256)", +"488f3b6a": "tryCloseRoom(address,uint256,uint256)", +"488fdb81": "buyFrom(string,address)", +"48900438": "getAllowedAmountAndPendingPeriods(address,address,bytes32)", +"48906c27": "evaluateMany(address,uint256,uint256[],uint256[],uint8[])", +"48916211": "checkSigs(bytes32,bytes32,uint256,bytes)", +"48917d5d": "lastDrawTs()", +"4891c06a": "contributionPool()", +"4891f401": "PRICE_1()", +"4892f0af": "tokenPorter()", +"489306eb": "oraclize_query(string,string)", +"48931352": "TOTAL_SUPPLY_CAP()", +"4893de2a": "rewardUnicornAmount()", +"4893ed5b": "proposedUserKeyPendingUntil()", +"48940815": "doTriggerJackpot()", +"48941312": "CoinAdvisorCrowdSale(address,address,uint256,uint256)", +"4894e37f": "__callback(bytes,string,bytes)", +"48957fb8": "getAyantDroitEconomique_Compte_4()", +"4896672e": "updateSalePrice(uint256,uint256)", +"489667e6": "_isSynthesizingAllowed(uint256,uint256)", +"489807a5": "Donate(uint256,uint256)", +"4898556e": "SaleStopped(address,uint256)", +"4898722d": "setSink(address[],uint256[])", +"48989182": "ethMax()", +"489979a3": "allocateTopupToken(address,uint256,uint256)", +"4899e4c6": "addrDistribution()", +"489acecc": "requireMultiple(uint256)", +"489b1636": "icoPhaseCountdown()", +"489b5046": "GetBankerCandidate(uint8)", +"489ba092": "setNameLink(string,string)", +"489c1202": "isGuard(address)", +"489c14fd": "pathAdvisorVault()", +"489c18b0": "getLocksLength()", +"489d2104": "changePaymentContract(address)", +"489d2844": "notifyBuyToken(address,uint256,uint256)", +"489d426e": "ratePreSale()", +"489da639": "COIN_SUPPLY_COMPANY_TOTAL()", +"489e5656": "MAX_CANVAS_NAME_LENGTH()", +"489f3c88": "ping(address,uint256,uint256,uint256)", +"489fde35": "setEnforce(bool)", +"48a0c8dd": "isDepositable()", +"48a0d754": "available()", +"48a0fa29": "toggleTokenExchange()", +"48a15250": "setBurnRequestUintMap(uint256,string,uint256)", +"48a16b8c": "_itoa(int256,uint8)", +"48a1befb": "UserFactory(address)", +"48a3cbdf": "fundTeam()", +"48a46bd3": "isRejected(address)", +"48a490fb": "transferFromTreasury(address,uint256)", +"48a50a54": "saleClosedTimestamp()", +"48a54fc5": "checkContract(bytes32)", +"48a5d7bb": "AssetPool(address,uint256,uint256,uint256,uint256)", +"48a60b6c": "getPlayerBets()", +"48a73e96": "getFreeNapkins()", +"48a76740": "TokenData(uint256,uint256)", +"48a7f1f9": "proposeOfferingContract(address,address)", +"48a860dd": "confirmTransactionAfterExpiryFee(uint256)", +"48a87fa8": "emptyTTT()", +"48a8b427": "calculateShareCrystal(uint256)", +"48a935e2": "setIndividualCaps(address[],uint256[])", +"48a9866b": "kill(address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"48aa71f4": "isInCrowdsale()", +"48aac336": "getNumberOfParticipantsPerLevel()", +"48ab41d3": "getPOOL_edit_3()", +"48ac0f3c": "CORPORATE_SUPPLY()", +"48acce46": "ponziAddress()", +"48acd9b1": "changeFeeAccount2(address)", +"48ad5cd0": "product3()", +"48adfbdb": "getModerator()", +"48afc0fe": "FOMO3DLite()", +"48afd1b3": "hasReturns(address,uint256)", +"48afe4f5": "currentPersonalLimit(address)", +"48b15166": "blockTime()", +"48b17b64": "currSaleComplete()", +"48b24b88": "IAM_PER_ETH_BASE_RATE()", +"48b43020": "_setDistrictAddresss(address,address)", +"48b45d92": "isRequestApprove(bytes32)", +"48b49fa7": "buyGem(uint256)", +"48b4d3a4": "EmitTransactionIds(uint256[])", +"48b52c7d": "_transferFrom(address,address,uint256,string)", +"48b537ce": "MaggieToken()", +"48b5677f": "delegatedSignedRemittance(bytes,address,address,address,uint256,uint256,uint256)", +"48b59dd6": "changeCourse(uint256,uint256)", +"48b5b15c": "testHasCorrectPriceForMultistage()", +"48b5de18": "setEscapeHatch(address)", +"48b741de": "greaterPriceMsgComparator(uint256,uint256)", +"48b75044": "release(address,address)", +"48b84cde": "testCreateElectionOptions()", +"48b8ff83": "tokensForArtist()", +"48b9ed30": "getdisdone()", +"48b9f88f": "blockDiff()", +"48ba2d51": "LogBidRewardClaimed(uint256,address,uint256)", +"48bafd0e": "newGame(string)", +"48bb4067": "teamIssuedTimestamp(address)", +"48bb4347": "_checkOpenings()", +"48bc2a21": "bonusSecondIco()", +"48bc3e2a": "twoStepRate()", +"48bc4edf": "startAndSetParams(uint256,uint256)", +"48bd64c0": "getArrayHashLibry(bytes16)", +"48bdaaff": "TradeStatus(address,address,uint256,uint256)", +"48be4030": "INDToken()", +"48beae6a": "kkTestCoin1()", +"48bf51f5": "setInterestRatePunitory(uint256)", +"48bf9179": "Extradecoin(address,address)", +"48bf9cea": "serialNumberIsUsed(string)", +"48c0b782": "intermediariesCount()", +"48c0dc5b": "Inonit(uint256,string,string,string)", +"48c1ee9b": "wadmin_transferOr(address)", +"48c20a24": "getChildsAmount(address)", +"48c22f3f": "RateClient(uint256)", +"48c26e22": "purchaseRate()", +"48c2f845": "purchased_tokens()", +"48c40dbd": "transferTokensThroughProxyToContract(address,address,uint256)", +"48c44712": "refundERC20(address,address,uint256)", +"48c4cae9": "setNameReaderId(bytes32,bytes32)", +"48c4d7ce": "descendingCount()", +"48c54b9d": "claimTokens()", +"48c5be67": "numDistributionsRemaining()", +"48c6af04": "test_oneInvalidEqString()", +"48c6e2f7": "BaoFengCheng(uint256,string,uint8,string)", +"48c7a0bf": "SharePrice()", +"48c7f438": "setOldest()", +"48c81c16": "GamersToken()", +"48c834c0": "tier4Rate()", +"48c875cf": "resetRequest(string)", +"48c8cd41": "dateTime()", +"48c91284": "setM1(address)", +"48c981e2": "sendEther(address)", +"48c9ecf8": "allowTokenOperations(address)", +"48cb5aeb": "Easticoin(uint256,string,string)", +"48cc38e1": "nestedFirstAllToAll2(uint256)", +"48cc7b6e": "startForge()", +"48cd4cb1": "startBlock()", +"48cd65d9": "getInPlayGames()", +"48cdb451": "initializeVesting(address,uint256,uint256)", +"48ce382d": "addActivityAccount(address,uint256,string)", +"48cebd67": "presaleSold()", +"48cf9e5c": "getGroupIndex(uint256)", +"48cfa939": "minContribution_mBTC()", +"48cfc6c6": "crowdSaleEnabled()", +"48d0aff3": "drainexcess()", +"48d21789": "burnFunction(address,uint256)", +"48d24f35": "transferMintingAddress(address,address)", +"48d26dd1": "finalizeType()", +"48d2df48": "userBuys(address)", +"48d317ce": "stepTwo(int256)", +"48d3297c": "stageStatus(uint16)", +"48d34bc6": "getHashInternal(address,uint256,uint256,uint256,uint256)", +"48d37a58": "withdrawPrize()", +"48d453ee": "gcEndTime()", +"48d47e7e": "clc()", +"48d4eaf7": "storeData(bool,uint256,address,bytes32,string)", +"48d51a0d": "submitProposal(bytes32,uint32,uint32)", +"48d597e5": "addFromMapping(uint256,uint256)", +"48d5a5c0": "consensusAddress(address)", +"48d6002a": "otherPlayer(address,address[])", +"48d6047c": "WhitelistWalletUpdated(address)", +"48d64fd5": "changeTradeTracker(address)", +"48d6ca55": "getChangeFeeAmount(uint256)", +"48d7de63": "setTenant(bytes32,address,uint256,string)", +"48d82608": "InvestmentPolicyChanged(bool,bool,address)", +"48d848d0": "returnBoolean(bool)", +"48d8bb3f": "setIco(address,address)", +"48d9614d": "GetFee()", +"48d9a374": "blockTransfer(address,uint256)", +"48da08e6": "SilverCoin()", +"48da1532": "node_side(uint256)", +"48da60af": "limitClosedSale()", +"48da95b8": "VirtualExchange(address)", +"48db409a": "createContract(bytes32,uint16,bytes32,uint256,uint64,bytes32,uint64,bytes32,uint64)", +"48db5f89": "player()", +"48ddc01f": "changeFisherMansFeeCalculator(address)", +"48dddca8": "minSpend()", +"48de0cdc": "withdrawInBatch(address[],address[],uint256[])", +"48dfe175": "tier3Total()", +"48e021e9": "weiCostOfToken()", +"48e06300": "isEquipedAny2(address,uint256,uint256)", +"48e071d4": "denyUser(address)", +"48e0f410": "fundRaising()", +"48e11f70": "OMGCatCoin()", +"48e12ae3": "getAllowancePeriod()", +"48e1a760": "getttttttt(uint256)", +"48e1c18b": "itemsOwned(address)", +"48e252ab": "CryptoMilitary()", +"48e25bd2": "WinToken()", +"48e278f9": "NauticusToken()", +"48e37220": "presaleDateStart()", +"48e3a033": "mulPay(address[],uint256[])", +"48e3a064": "StandardCampaign(string,uint256,uint256,address,address)", +"48e4e297": "allowedToPurchase()", +"48e591ac": "getVote(address,address,uint32)", +"48e5c71f": "whoIS(string,bool)", +"48e61782": "left4(uint256)", +"48e624eb": "holderAdvPercent(address)", +"48e66722": "getRedeemRequestsLength()", +"48e68e30": "synthesizeWithAuto(uint256,uint256)", +"48e6b393": "test_logs()", +"48e7575d": "ecrecoverFromSig(bytes32,bytes32)", +"48e76563": "oraclize_setNetworkName(string)", +"48e7a100": "reparametrizeMultisig(bytes32,uint256)", +"48e837b9": "createGame(uint256)", +"48e9657d": "getSignatureAtIndex(string,uint256)", +"48e9f1ea": "EPXCrowdsale()", +"48ea97be": "tokenSalePausedDuration()", +"48eaa435": "safeExp(uint256,uint256)", +"48eab053": "fourthTeamWithdrawal()", +"48eaeb72": "BPCC(uint256,string,string)", +"48eb4ac1": "getAllMilestonesHashes()", +"48eb76ee": "attacker()", +"48ec8a0c": "getSecurityLimits()", +"48ed190a": "lastBlock_f11()", +"48ed1e3b": "LookUpAvailableDivInt(address)", +"48ed3e00": "date610()", +"48ed994c": "newLottery(uint256)", +"48edbf1d": "SKS()", +"48ef245b": "createFaucet(string)", +"48ef5aa8": "UpdateMaintaining(bool)", +"48ef670e": "UportRegistry(address)", +"48f001e6": "decreaseFreezeValue(address,uint256)", +"48f05187": "scheduleCall(address,bytes4,bytes,uint256)", +"48f082e8": "dayToMinusToken()", +"48f0b8e3": "getNumberOfGamesCompleted()", +"48f134f6": "closeSetup()", +"48f1e9c2": "getCertificationDocument(address,uint256)", +"48f2090b": "distributionPercent()", +"48f213e0": "PER_USER_AMOUNT()", +"48f221b6": "changePartner1(address)", +"48f36144": "claimOracle()", +"48f3e6f4": "getFourthAddressBalance()", +"48f549a4": "CreateToken(address,uint8,uint16)", +"48f6647b": "matchWithTheirs(uint256,uint128,uint16)", +"48f69212": "YELLQASH()", +"48f6cc0a": "_removeManager(address)", +"48f7f2a3": "daoFactory()", +"48f83e86": "authorizeAccess(address,address)", +"48f8fe69": "fnv(uint256,uint256)", +"48f918e0": "reclaimLeftoverEth()", +"48f95a7d": "depositsCountForUser(address)", +"48f9e246": "requestImplChange(address)", +"48fab2b0": "emitOracleUpdated(address)", +"48fb7332": "INTREPID_MAX_PRICE()", +"48fc66e9": "NzmLToken()", +"48fcb4e8": "getFrozenAccountCoinCount(address)", +"48fdb8c1": "partnernames()", +"48fee60f": "Criptohubcoin()", +"48fefd9b": "supportsToken(string,address,address)", +"48fefed2": "setNewGreeting(string)", +"48ff05b8": "removeUint256(bytes32)", +"48ff0c47": "testF4(uint256)", +"48ff1387": "rebuy(uint256)", +"48ff15b3": "acceptManager()", +"48ff30ff": "Breakup(uint256)", +"48ff6525": "applyRedenomination()", +"490052a8": "playerRoll(uint8,uint8)", +"49007329": "CCCRSale(address)", +"4900b48c": "checkOracle(address,address,address,bytes32,uint256[])", +"4901a205": "canShelf(string,address)", +"490203a7": "getMiningReward()", +"4902d163": "pendingOwnedOwner()", +"4902e4aa": "removeSuperAdmin(address)", +"490377a7": "setParameters(address)", +"4903c401": "Admins(address,address,address)", +"49041903": "getGame(uint64)", +"49044cc5": "premiumValue()", +"49051c1d": "threshold2()", +"49055da2": "getCurrGameInfoPart2()", +"4905c5b0": "_isUserInGame(address)", +"4905c769": "newLoan(bytes32,bytes32,bytes32,address,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"490618d1": "deregisterBroker(address)", +"49063d37": "checkDivs(address)", +"4906da1e": "getMaxEther()", +"4907cd0f": "subscribe(address,uint256,uint256,uint256)", +"490825a9": "testControlTransferEnableNotTransferable()", +"49082bef": "TWO_YEAR_KEEPING()", +"4908d1de": "allUnsoldTokensAllocated()", +"490a32c6": "message(bytes32)", +"490a65c8": "PlutonDistribution()", +"490a6dac": "setWinner(uint256,bytes32,uint256,uint256,bytes32)", +"490b4f92": "coinAgeForAddressAt(address,address,uint256)", +"490bf04f": "rateToEther()", +"490c58f0": "addTokenTo(address,uint256)", +"490cce74": "FincontractMarketplace()", +"490d6d11": "Resume()", +"490e25c1": "C4FEscrow(address,uint256,address,uint256,uint8)", +"490e2bd1": "Autolen()", +"490f027a": "setPrizes(uint256[28])", +"490f611e": "Or(bytes32,bytes32)", +"490fc399": "votedKickoff(uint256,address)", +"490fdbd7": "transferTile(uint16,uint16,uint8,address)", +"490fea4d": "addBounty(address,address,uint256)", +"491045af": "LifeSet_002()", +"491274a8": "presaleContributorCount()", +"49128cdb": "updateRoundState()", +"49135b0f": "getAllAlgos()", +"4913732e": "buyTokenFromModerator(uint256,address,uint256,bool)", +"49137bca": "reading_cards()", +"4913ec88": "EnergisToken()", +"49144618": "Wasted(address,uint256,uint256)", +"4914fb27": "approveWithdrawal(address)", +"4915020f": "verifyLinkPrivateKey(address,address,address,uint256,uint8,bytes32,bytes32)", +"4915ef4a": "refund_contract_eth_value()", +"49164b41": "CryptoDivert()", +"491737f2": "ico3cap()", +"491759aa": "sendEthTweet(string,string,string)", +"4917c302": "ACCEPTED_AMOUNT()", +"4918d588": "test_BondPostedAndOverMajority()", +"491a6155": "REFERRAL_BONUS_PERMILLE()", +"491a7904": "transferTokenTo(uint256,address)", +"491abe0c": "servicePayment(uint256)", +"491b0712": "snpb(uint256)", +"491b8c45": "setWARTokenAddress(address)", +"491c8e08": "lastBlock_a6()", +"491cfc1c": "setNextRoundDuration(uint256)", +"491d525a": "pMintTokens(uint256,int256,address,uint256,uint256)", +"491d75f4": "configurationTokenTranchePricing(uint256[])", +"491dcfe9": "batchActive()", +"491e0df0": "totalContributorsContribution()", +"491e55db": "GAME_COST()", +"491e74f3": "YICHAINCoin()", +"491eeb3a": "resumeInvest()", +"491fd263": "updateMessage(uint256,bytes32)", +"49200d77": "numberOfOutcomes()", +"4920781b": "GATcoin(uint256,string,string)", +"4920adcc": "MysteriumCrowdsale(address,address,uint256,uint256)", +"4920ff15": "SetHome(string)", +"49212c92": "preValidateChecks(address,uint256,uint256)", +"4921a91a": "giveMe()", +"4921cea6": "transferFeeOwner()", +"4921e147": "setMinWeiToPurchase(uint256)", +"4921f9e9": "AnonReport(uint256)", +"4922d481": "recovery(address)", +"49231598": "fetchAllVotersBySnapshotBlock(uint256)", +"49231b28": "changeRates(uint256,uint256)", +"49239e10": "refundStageStartTime()", +"492430f6": "DissolutionRoom(uint8,bool)", +"4924d397": "Respond(address,uint256)", +"49251b18": "FrozenFunds(address,address,string)", +"4925480e": "fireAdmin(address)", +"49260304": "nDEX()", +"4926248f": "setListener(address,address)", +"49264032": "Spendcoin()", +"49266f2f": "maxBidEth()", +"4927f408": "Vertex_Token(uint256,address,uint256)", +"49285b58": "getVotingToChangeKeys()", +"492abc67": "signerIsApproved(bytes32,bytes)", +"492b3bf7": "baseTokenCapPerAddress()", +"492b67ea": "Etherdoc()", +"492b8d45": "POWToken()", +"492bd276": "getIntervals()", +"492c0325": "calculateNewRate(uint256,uint256)", +"492c70fb": "swipeToken()", +"492c981b": "entryInformation(address,bytes32)", +"492cc769": "buy(string)", +"492d06cf": "unFreeze(uint8)", +"492dda05": "reTweetReward()", +"492e333f": "allocate5ProjectToken()", +"492e672e": "DCETToken()", +"492eec25": "bountyOfflineTokens()", +"492f190d": "availableCommission()", +"492f8724": "subscriptionStatus(uint256)", +"492fb343": "feeBeneficiary()", +"492fea53": "_createPet(uint256,uint256,address,uint256,uint256,uint256,uint256)", +"4931b3b4": "setData_30(string)", +"4932a80b": "unownedPlanet(uint256)", +"4932ce32": "changeGame(address,uint256)", +"4932f35e": "NomToken()", +"49330cb8": "getVote(uint256,uint256)", +"493322c0": "calculateRewardInternal(address,address,uint256)", +"49336245": "getEntry(bytes)", +"49337227": "testCanCloneAfterTransfer()", +"49339f0f": "Delegate(address)", +"4934453a": "TPIToken()", +"4935b3b6": "PDTC()", +"4935e740": "withdrawMyFunds()", +"49361cfe": "lastInvestmentTime()", +"493770cc": "setTransferStatus(bool)", +"4938649a": "stopEverything()", +"49386f26": "getlistedItems()", +"493953de": "addOwnToken()", +"49399729": "minimumBidAmount()", +"4939bfde": "requestedBy()", +"4939ce85": "CLASS_BEAST()", +"493a64e4": "SetParticipantRole(address,address,uint8)", +"493a7209": "stopBuy()", +"493a8d0c": "tokenActive()", +"493b284e": "exchangeNominsForHavvens(uint256)", +"493bccc8": "awardMissedBlockBonus(address,bytes32)", +"493ca31a": "EPAYCLUB()", +"493caeea": "removeMemberWithAddress(address)", +"493dbd02": "forceEndGame(address)", +"493f8d30": "read_demurrage_config_underlying()", +"493fcf1c": "taxRateNumerator()", +"49403183": "isPassed(uint256)", +"49404d25": "lastBlock_v13()", +"494054f4": "createNota(string,string)", +"49407a44": "claimEther(uint256)", +"4940c807": "sumElements(uint8[])", +"49416e45": "RCD()", +"4941d059": "editRestrictedAddress(address,bool)", +"4941d296": "periodITO_startTime()", +"49420759": "changeWithdrawable(uint256)", +"494278e3": "getgamecardaddress(uint256)", +"4942a71f": "getFromBank(uint256)", +"49432923": "participationHistory(address)", +"49433942": "PointerChanged(uint8)", +"49435c0d": "whitelistSupplier()", +"49437210": "getUpdatable(bytes32)", +"49440b91": "lockMntpTransfers(bool)", +"49441fc3": "MIN_ETHER_CONTR()", +"4945a575": "childApproved(address,uint256)", +"494630cd": "PullRequestAlreadyClaimed(uint256,uint256,bool)", +"49463b8e": "SeeleToken()", +"49465a50": "changeTakerDeadline(uint256)", +"49465d33": "lastPriceFeed()", +"4946c574": "getTransformMineInDay(address,uint256,uint256)", +"4946e206": "rescueCat(bytes32)", +"4947c8d0": "setFinishTime(uint256)", +"49480bc1": "releasePrivilege()", +"49484450": "ProofOfNoSnipers()", +"4948c2db": "stage4_price()", +"4948d91d": "SicBo(address)", +"4948e51a": "freezeToken(address,uint256)", +"49499e14": "setCompte_15(string)", +"4949d9fa": "bankrolledBy(address)", +"494ac14c": "LOTTERY()", +"494b46f9": "_changeAdmin(address,address)", +"494b5e0f": "setUserFactoryContract(address)", +"494b90e8": "teamPoolAddress()", +"494bf608": "distributeEther()", +"494c2a0f": "STQCrowdsale(address[],address,address)", +"494cf333": "getAddressUIntMapping(address)", +"494cfc6c": "getTokens(uint256,uint256)", +"494d93cc": "result_block()", +"494e49a4": "createAccountWithBalance(string,uint16)", +"494e4bc3": "fundtransfer(address,uint256)", +"494fb622": "SetData(uint256,string,string,string,string)", +"494fee7d": "estimateDistribution(address)", +"4950b392": "exerciseCall(uint256,uint256,uint256)", +"49517b41": "addSolution(uint256,string,string,string,string,string)", +"4951a18f": "crowdsaleCap()", +"495289be": "setIssuer(address,bool)", +"4952d2dd": "logPromiseUnfulfillable(uint256,address,uint256)", +"4953b57d": "isAdminOwnersValid()", +"49550d66": "tryTakeBack(uint256,uint256)", +"49556aff": "fulfillEthereumLastMarket(bytes32,bytes32)", +"4955a79e": "transferOwnershipOperation()", +"4955f280": "createContractPerson(string)", +"4956cf1c": "migrating()", +"4956eaf0": "deploy(address,uint256)", +"49570293": "_addPurchasedTo(address,uint256)", +"49573edd": "tgeSettingsChange(uint256,uint256)", +"495816b4": "BOUNTY_TOKENS_AMOUNT()", +"49582509": "ICO_ON()", +"49582a20": "initializeSupply(uint256,uint256,uint256)", +"4958abb7": "switchFeePolicy(bool)", +"4958ace2": "restartSale(address)", +"49593f53": "submit(string,uint64,uint32,uint32,bytes32)", +"4959642c": "isUserKyced(address)", +"49596a65": "initProject(string,string,string)", +"495b3bcc": "LSEscrowContract()", +"495bbcae": "testNeededBalanceForContractCreation()", +"495bf26b": "lengthOf(string)", +"495c167f": "sumPayments()", +"495c5891": "getTotalAuthorizedForPayment()", +"495c9588": "minEligibility()", +"495ccca3": "WEEFundWallet()", +"495d32cb": "par()", +"495d7b26": "processScore(bytes32,string)", +"495df195": "CollectEarning()", +"495e1b3d": "etherEscrowAddress()", +"495f9bae": "getProposalVoterVotesCount(uint256,address)", +"495fe25b": "transferTo(address,uint256,bytes)", +"49602f5c": "OpusToken()", +"49606455": "take(bytes32,uint128)", +"49606d51": "Nihilum()", +"4960ae42": "numberOfVerifiers()", +"4960d2bc": "getLandTaxRate(uint256)", +"496128ec": "prosperaToken()", +"49614e91": "isRegisteredAddress(address,address)", +"4961b40c": "getReleaseValidator()", +"4962aa66": "discountedRates(uint256)", +"4962ab01": "removeMembers(address,bytes32,address[])", +"4962ad08": "approveAlgo()", +"4962b964": "getPuppetCount()", +"49630dda": "removeQuestion(address)", +"4963513e": "Reserved(bytes32,address)", +"49649fbf": "withdrawAllFunds()", +"4965fc89": "getForfeited(address)", +"49661fcf": "stage2Tokens()", +"49671d28": "setAmountSoldPerPeriod(uint256)", +"4968694a": "setCoolness(uint256,uint32)", +"496a698d": "currentAuction()", +"496bd844": "round_up_division(int256,int256)", +"496be2cf": "atxControllerAddr()", +"496c4fad": "setPriceAgent(address)", +"496c5ad8": "throwsWhenGettingTokensWithStoppedSale()", +"496e41d2": "quotaUsed(address)", +"496fbeb3": "transportationFeeMultiplier()", +"496fc976": "setC4FContractProvider(address,address)", +"496fd2c5": "ICOStartToken(uint256)", +"4970fb36": "armagedeon(address[])", +"4971129d": "CatTransfer(address,address,uint256)", +"49713811": "winnersCount()", +"49714815": "ownerKillContract()", +"49716f5a": "originalTotalWeight()", +"4973219d": "outputi(uint256)", +"497347b2": "_storeContent(address,string,uint256,bytes32,address)", +"4973dbf6": "RATE_ETH_CUE()", +"4973dd25": "unBlockExternalTransfer()", +"49741098": "admin_set_min_pay(uint256)", +"497484f6": "applyBonus(uint256,uint8)", +"4974af1f": "testPublic(uint256[20])", +"4974bc27": "download()", +"4974da81": "addWord(string)", +"49752baf": "chronoBankPlatform()", +"49755b9e": "issueSynths(bytes4,uint256)", +"4975d202": "balanceOfOwner()", +"4975e893": "getProposalCreatedAt(bytes32,bytes32)", +"49776581": "getDocumentUpdatedVersionId(uint256)", +"497777d5": "collect(bytes32)", +"4977d6a4": "DreamToken()", +"49786571": "Economeme()", +"4978ddcc": "transferAPIOwnership(address)", +"4979440a": "getHighestBid()", +"4979c012": "ClosingTimeForCloning()", +"4979d6ec": "setUserManagerContract(address)", +"497a7b48": "taskRewardVote(bytes32,uint256)", +"497aed49": "PRIMARY_START_PRICE()", +"497b383e": "buyReferTokens(address,uint8)", +"497b8018": "getBallotOptNumber()", +"497cc504": "claimE()", +"497cd327": "TMONEY272708()", +"497cd426": "updateRewardDistributor(address)", +"497d709d": "icoNumberBalanceOf(address,uint256)", +"497dbce9": "_assertAmount(uint8,uint256,uint256,uint256,uint256,uint256,uint256,uint8,uint256)", +"497dd0cb": "migrateContributors(address[])", +"497f3132": "getLastRegistration(string,int256)", +"497fb5b9": "tokensWithdrawn()", +"498022ea": "evalTransitionState()", +"49813e26": "MenovaToken()", +"4981b3ca": "performSell(address[8],uint256[6],uint256,uint256,uint8,bytes32,bytes32)", +"49843982": "Coin(uint256)", +"4985acee": "getTransferFromToValue()", +"4985b325": "addSurplus()", +"49866ec0": "finishTokensSale(uint256)", +"4988ef98": "LOCK_TOKENS_DURATION()", +"4989ae8e": "RESERVED_TOKENS_FOUNDERS()", +"4989b0b6": "setCustomBuyerLimit(address,address,uint256)", +"498a37f0": "setSmallInvestor(address,uint256,uint256)", +"498a3944": "setNameWriterId(bytes32,bytes32)", +"498a4c2d": "startBlockNumber()", +"498a690f": "issuingRecordAdd(uint256,bytes32,uint256,uint256,uint256,string,uint256)", +"498a6de7": "setRevenueContract(address)", +"498b7718": "J8T_DECIMALS_FACTOR()", +"498be109": "FAPFounderFund()", +"498c07f3": "startCrowdsale1(address)", +"498cb7cb": "setDelegadoDeEscuelaVerify(bytes32,uint256,uint256)", +"498cc70d": "getResult(string)", +"498d2ae0": "getMintRequestAddressMap(uint256,int256,string)", +"498e78b1": "unregisterManager(address,address)", +"498e87a9": "setPI_edit_21(string)", +"498eecb2": "getLimitedReportersDisputeBondToken()", +"498f27ae": "countCampaigns(address)", +"498f6fbe": "NewSubscription(address,uint256,uint256)", +"498fd833": "priceDT()", +"498ff49a": "repayImmediately(uint256)", +"49911610": "getDay(uint16)", +"49912f88": "appeal(uint256,bytes)", +"49917511": "buyCoinsCrowdSale(address,uint256,address)", +"49926028": "typeHash()", +"499260d6": "get_activity_by_id(uint256,uint256,address)", +"49937e25": "buyPrimordialToken()", +"49942483": "ICO_PHASE2_BONUS_PERCENTAGE()", +"49942ccb": "scheduleCall(bytes,bytes,uint256,uint256)", +"49943a13": "PARTICIPATION_FEE()", +"49955431": "cupi()", +"4995b458": "week()", +"4995e9fb": "FOUNDER_ADDRESS2()", +"4996e899": "getGuaranteedContributorsLenght()", +"49970e16": "forwardPlay(address,address,bytes,bytes32,bytes)", +"499831f2": "pauseGame()", +"4998ce40": "setbonusTokens(uint256)", +"49996698": "trustedAddressSize()", +"499a1bcd": "setAQL(address,uint256)", +"499a8fea": "setClue3(string)", +"499ac979": "redistributeTokensForAddresses(uint256,address[])", +"499af77c": "current_spin_number()", +"499caf09": "secondTime()", +"499cd176": "endAttack(address,address,bool,uint256,uint256,uint256,uint256)", +"499cf7ce": "BOXEX()", +"499d1081": "mint(address,uint256,uint128)", +"499dae56": "getMultiRequestRequestor(uint256)", +"499e2c81": "getOrCreateWaitingBoard(uint256)", +"499e6c10": "isTheContract()", +"499fa529": "ALLOC_SALE()", +"499fd141": "getDrupeCoin()", +"499ff236": "maxAnonymousContribution()", +"49a0a3b3": "resetTokens(address[],uint256[])", +"49a0c976": "unlockEmission()", +"49a0e681": "rst()", +"49a24a7d": "DolyToken4()", +"49a3d2bb": "updateAllowed(address,address,uint256)", +"49a51839": "EGGS_TO_HATCH_1LOBSTER()", +"49a634f0": "LTS()", +"49a67b55": "commitStart(bytes32)", +"49a69078": "lastBlock_f5()", +"49a6a4de": "showAssetInfo(bytes32)", +"49a742eb": "validRate(uint256)", +"49a76444": "Hygen()", +"49a7a26d": "solver()", +"49a86c9e": "addToAccesslist(address)", +"49a8d337": "lockedTeamAllocationTokens()", +"49a92910": "setPlayer(address,uint64,uint64,uint64,uint64,uint64,uint64)", +"49a9d5ad": "CGENToken(uint256)", +"49aa480a": "VixCoin()", +"49aa4ee2": "removeVote()", +"49aafad7": "allowedToBurn(uint256)", +"49ab1d86": "setGeneLab(address)", +"49abee50": "phaseStart()", +"49abf2d6": "staticoins(uint256)", +"49acce72": "AnkitVictoContractToken()", +"49ad12a5": "getItemRarity(uint256)", +"49adf14f": "Claim_TRAC_1850()", +"49adf314": "_updateDividends(address)", +"49ae1f17": "KWHToken(address,address,address)", +"49ae8dc3": "getChildren(uint256)", +"49ae9b31": "canReadName(address,bytes32)", +"49af0af1": "baseEthCap()", +"49af63a9": "setWaitTime(uint8)", +"49afc6e5": "tokenBalance(uint256)", +"49afcc0e": "dataSourceGetSemiResult(uint256)", +"49b11f24": "dailyAuctionStartTime()", +"49b1b2d9": "newBonus_and_newPeriod()", +"49b2f5ff": "technicalCommunitySupply()", +"49b3b29f": "costs(uint256)", +"49b40402": "exchangeThreshold()", +"49b48e66": "setCheckOwner(bool)", +"49b54685": "updateDps(uint256)", +"49b5b541": "compute(address,uint256)", +"49b6313c": "getCurrentSellOffer(uint32)", +"49b71e47": "distributeWinnerPool(string,uint256)", +"49b76501": "getStorageRate()", +"49b7a9c2": "dividendManagerAddress()", +"49b7ef6c": "lockedSell()", +"49b85a16": "kycAddress()", +"49b88203": "declareProjectDefault()", +"49b88919": "setImageDescriptor(uint256,uint16)", +"49b8f5d9": "tokensDuringPhaseOne()", +"49b90557": "isAuditor(address)", +"49b9734d": "changeMainEndTime(uint256)", +"49b9a2d0": "address_to_tickets(address)", +"49b9a7af": "lastPriceUpdateTime()", +"49ba5a48": "checkSavedEthBalance(address)", +"49babd2a": "initiate(address,uint256,bytes32,address)", +"49bac542": "E4RowEscrowU()", +"49bedf42": "setLookup(address)", +"49beee4f": "adjust_Transfer_nodata(bool)", +"49bf2caf": "disputeTransaction(uint256)", +"49bf66d3": "addRegistryIntoNameIndex(address)", +"49bfb061": "txFeeDenominator()", +"49bff0d7": "setPI_edit_29(string)", +"49c03373": "changeGTOAddress(address)", +"49c04f27": "WorldBitEvent(address,bytes2,bytes2,uint256,uint256,string,string,string,string)", +"49c15bd9": "Purchase()", +"49c16cc3": "CMCLToken(uint256,string,string)", +"49c16e15": "toUint()", +"49c1ad0f": "gotoNextState()", +"49c1d54d": "trusteeAddress()", +"49c2a1a6": "createProposal(string)", +"49c3567c": "ArbaCoin(uint256,string,string)", +"49c37f8c": "main(address,address)", +"49c3a91e": "getSponsorshipsTotal(address,uint256)", +"49c462d7": "createInvite(bytes)", +"49c53b2d": "doMidnightRun()", +"49c60cc9": "MICROMINESx()", +"49c6353c": "getInvId()", +"49c71fa8": "unholdTeamTokens()", +"49c7634f": "WorldwideGiftCode()", +"49c83e86": "unlist(address,uint256)", +"49c91267": "getSeedByWinner(address)", +"49c9d17a": "updateReceivers(address[])", +"49c9dcf5": "awardRafflePrize(address,uint256)", +"49ca30ab": "receiveIndex(uint256,uint256,uint256,uint256,bool)", +"49ca7656": "changeOwnerOfMonethaUserClaimStorage(address)", +"49ca8cc9": "getEventId(address,bytes32)", +"49cacb12": "dropOwner(address)", +"49cbe338": "tryRead(uint64)", +"49cc2eb1": "Fairsale(uint256,uint256)", +"49cc635d": "receivePlayerInfo(uint256,address,bytes32,uint256)", +"49cc8513": "_geneOfCrab(uint256)", +"49cc954b": "twoYearsPassed()", +"49cd4554": "afterIco(uint256)", +"49ce0a11": "hexToken()", +"49ce5804": "setSectorOwnerCut(uint256)", +"49cf211e": "storenumber()", +"49cf2eae": "certifierAddress()", +"49cf5f1b": "DSProxy(address)", +"49d0cd85": "functionSignatures()", +"49d10b64": "updateRegistry()", +"49d246e5": "getBetBasic()", +"49d24ae8": "withdrawAdmin(uint40)", +"49d2ca11": "Election(address,address,address,address,address)", +"49d3060f": "selectWinner50()", +"49d45693": "changeminprivatesale(uint256)", +"49d463e6": "sendBoard(bytes10,uint256,uint8,bytes32,bytes32)", +"49d4a344": "right99(uint256)", +"49d55d9d": "receiveTransfer(uint256)", +"49d596fe": "FSM()", +"49d689f4": "setJackpotAddress(address,address)", +"49d7e0b3": "mutiTransferFrom(address,address[],uint256[])", +"49d800a1": "ReleaseableToken(uint256,uint256,uint256)", +"49d834cd": "TSTEST()", +"49d8ef13": "ETHERFUNDME_ONLINE_FEE()", +"49d94871": "bonusRates(address)", +"49d94c83": "CappedCrowdsale(uint256)", +"49da847b": "iPay()", +"49daca7a": "tradeAddress()", +"49dbdf30": "initializeRefund()", +"49dc2b83": "miningFinished()", +"49dc5376": "getTokensBack(uint256)", +"49dc8fab": "Menu06(address,address,uint256)", +"49dcbc5e": "sendEth(address,uint256)", +"49dcd756": "getCurrentEthCapPerAddress()", +"49dd0fe3": "minechain()", +"49dd1262": "updatePrices()", +"49dd2880": "Gold(address,uint256)", +"49de0485": "addContributorManually(address,uint256,uint256)", +"49de3995": "EthlanceMessage(address)", +"49df7208": "addMember(address,bytes32)", +"49df728c": "withdrawTokens(address)", +"49e09da6": "genesisTransfer(address,uint256)", +"49e0cf2a": "createComunity(bytes32,bytes32)", +"49e0dada": "level_4_percent()", +"49e123c8": "monsterHealth()", +"49e1432c": "donateToPot()", +"49e1c2b7": "ATMToken()", +"49e284d1": "ZoologicalGarden()", +"49e347ae": "getContents(uint256[],uint256)", +"49e3ec5e": "setMediator(address)", +"49e4347b": "completeICO()", +"49e44f44": "ManagerProxy(address,bytes32)", +"49e4b3e5": "setPermissionManager(address)", +"49e51970": "CostilNetworkToken()", +"49e588df": "refundSubmission(address,uint256)", +"49e627d2": "getPreIcoTokenHoldersAddressesCount()", +"49e65440": "setSymbol(bytes32)", +"49e67544": "TeamFund()", +"49e6c454": "getMyEntityOwner(uint256)", +"49e77c8b": "hasEnoughTokensToPurchase(address,uint8)", +"49e9449a": "presalesCap()", +"49e9cee9": "GetMaxPrestigeLevel()", +"49ea33df": "icoEndDatetime()", +"49ead9b4": "createAsset(string,uint256,uint256)", +"49eb6d6f": "NumberAddresses()", +"49ec1ff0": "setSoftwareTokensWallet(address)", +"49ec7c3f": "giveBirth(uint256,uint256,uint256,bytes)", +"49edfb94": "FEE_OWNER()", +"49edfed9": "getEtherForStakes(uint256)", +"49ee161b": "getLockPosition1(address)", +"49ee2ae1": "getAllJingles(address)", +"49ee39ba": "nullBonusMessage()", +"49ee6c50": "getNewItemId(bytes32)", +"49ee72fc": "addCountryCities(uint256,uint256[],uint256,uint256)", +"49eee1a4": "setRoundRate(uint256,uint256,uint256)", +"49ef026f": "raisedFunding()", +"49efdbbf": "purchaseShow(uint256)", +"49f00964": "founders_2()", +"49f02baf": "YondToken()", +"49f0726d": "Centhereum()", +"49f0c90d": "adminSetAccountAdministrator(address)", +"49f12aa7": "hashState(address,uint256,uint256)", +"49f16ad1": "setTransferEnabled()", +"49f194a1": "setIco(address)", +"49f1fa67": "GetLiasonName(uint256,uint256,uint256)", +"49f202ff": "getTokenIdByIndex(uint256)", +"49f209af": "testThrow_3_invalidOwner_accessRestrictionThrow()", +"49f22b4a": "biddingComponent()", +"49f27c25": "ProdEToken()", +"49f298c6": "wallock()", +"49f2a049": "registerInternal(string)", +"49f30178": "nextFinalTimeout()", +"49f307a6": "setNewPriceToItem(string,uint256,uint256)", +"49f41a42": "updateAgent(address)", +"49f4cc17": "transferAssets(address,address,uint256)", +"49f4f5da": "XLifeCoin()", +"49f6444e": "buyLuckyStone()", +"49f65ce4": "handleDividends()", +"49f73d3d": "calculateCountryCut(uint256)", +"49f7825b": "lockAddressByKYC(address)", +"49f856ea": "setERC820compatibility(bool)", +"49f9231d": "LightCoinToken()", +"49f97939": "notEqual(string,string,string)", +"49f9b0f7": "calculateSaleReturn(uint256,uint256,uint32,uint256)", +"49f9c0e4": "transferEth(uint256,address)", +"49f9e95e": "withdraw_arbitrary_token(address,uint256)", +"49f9f4d0": "burnOwnerTokens(uint256)", +"49fa84ef": "hon1ninja()", +"49fa991f": "removeAttestation(address)", +"49fb2dc5": "add_to_association(uint256,uint256,uint256)", +"49fcea4a": "Lyfecoin()", +"49fcfce7": "saleInited()", +"49fd5791": "_removeLastOwnerHoldingsFromToken(address,uint256,uint256)", +"49fd5f64": "getAllAssembly(address)", +"49fdaea6": "isBrickOwner(uint256,address,address)", +"49fe5261": "CROSAIR_PRICE_INCREMENT()", +"49ffeb8f": "recursiveCalculation()", +"4a0023cd": "findAuraComposite(uint64,uint64)", +"4a00a522": "homebase(int256,int256)", +"4a00dc38": "getAreaPrice(uint8,uint8,uint8,uint8)", +"4a013296": "canEscapeTo(uint32,uint32)", +"4a024928": "D00KIE()", +"4a03707c": "draw(address,uint256)", +"4a03e7e3": "TrinityContract(address,address,uint256)", +"4a042f0d": "joinBattle(uint256)", +"4a046d82": "usdPerEther()", +"4a0473fe": "votings_(address)", +"4a0483c5": "trustedAddressLUT(uint256)", +"4a0767cc": "setIsPreventedAddr(address,bool,bool)", +"4a084736": "updateTokenToEthOrderWHint(uint32,uint128,uint128,uint32,int256)", +"4a09d3cf": "withdrawAdvisersTokens(address,uint256)", +"4a0a7f2d": "doDistributionRange(uint256,address[],uint256[])", +"4a0af245": "startPreSale(address,uint256,uint256,uint256)", +"4a0b132a": "TIME_TO_MAKE_1_SHITCLONE()", +"4a0ba49d": "pay(address,address,address,uint256)", +"4a0bb6a4": "WeQuest()", +"4a0cd926": "addBankerAddress(address)", +"4a0d89ba": "getSwap(uint256)", +"4a0d8b53": "setHasMaxPurchaseLimit(bool)", +"4a0f0bfe": "ServiceRegistry(address)", +"4a0f3134": "FundTransfered(address,uint256)", +"4a0f5974": "left27(uint256)", +"4a122266": "getForwardPurchaseFeesTo()", +"4a12389a": "MyToken(string,string,uint8,address)", +"4a123e1d": "setLev2(uint256)", +"4a1281c6": "numTokensIssued()", +"4a1311f9": "openingManualyMining()", +"4a14e3b2": "SentAmountToOwner(uint256,address)", +"4a150e2c": "getDonationsCount(address)", +"4a15ebce": "addCbAddress(address,bytes1,address)", +"4a16673b": "shouldSelectWinner()", +"4a168859": "getAvaIcoAmount()", +"4a169e4b": "setCoinInfo(address)", +"4a173383": "determineWinner(address,uint256,bytes32)", +"4a1753a6": "setCurrentGame(address)", +"4a176017": "finalizeAdd(uint256,address)", +"4a176ba5": "getaddr(uint256)", +"4a17bbde": "getEventId()", +"4a180cb3": "removeSpecialFeeTake(uint256)", +"4a184f51": "startCrowdsale(address,address)", +"4a186d69": "buyTokenFor(address)", +"4a187785": "aaandItBurnsBurnsBurns(address,uint256)", +"4a18c25e": "EUEBToken()", +"4a197057": "GameEnded(uint256,address,uint256,uint256,uint256,uint8,uint8)", +"4a1993e4": "firstDepositDate()", +"4a1a27a8": "qtAccount()", +"4a1a342b": "getOrderMoneyEscrowed(bytes32)", +"4a1a3ded": "createNewTask(uint256,uint256)", +"4a1a650d": "RecordNum()", +"4a1a89f1": "PHXTKNADDR()", +"4a1aa767": "claim_victory(uint256,uint8,uint8,uint8)", +"4a1ad538": "checkTransferMultipleDelegated(address,address[],uint256[],uint256,uint256,bytes)", +"4a1b13f0": "setPoliceTimeoutInBlocks(uint256)", +"4a1b504f": "distributeBonus(address[])", +"4a1b98b2": "exchangeUnderwrite(address,uint256)", +"4a1ba4ba": "Multibot()", +"4a1c13cd": "setIcoStartDate(uint256)", +"4a1c6549": "ETHBITA()", +"4a1d08af": "drawRandomItemWinner()", +"4a1df335": "addressCEO()", +"4a1e004c": "blockedTimeForInvestedTokens()", +"4a1f05f0": "setSaleImg(uint256,bool,address,uint256)", +"4a1f0bf6": "inheritToNextGeneration(address)", +"4a1f11a7": "MT()", +"4a1fb241": "fttIssued()", +"4a1fe393": "withdrawEther(uint32)", +"4a208c38": "setIV_R2(uint256)", +"4a21f8f7": "joinToPool(uint256,uint256)", +"4a2228f7": "_reducemoney(address,uint256)", +"4a222b74": "ecoLock23()", +"4a22c7fb": "tokens_rewards_allocated()", +"4a23418a": "foundersTokensWallet()", +"4a2388ff": "setAllowedForMinting(address,address)", +"4a23dc52": "FileStore()", +"4a2479c0": "initialOwnersShares()", +"4a24edd6": "startSale(uint256,uint256,uint256,uint256)", +"4a24f6d9": "getVendorApplicationScoringTrackCount(string)", +"4a254431": "MappingProposalIssued(address,address,uint256)", +"4a25780b": "RedRibbonCoin()", +"4a25b2fd": "deductCoin(address,uint256)", +"4a26410b": "SetGenesisBuyPrice(uint256)", +"4a268f52": "ExchBtcToken()", +"4a26920b": "sendTokens(address,address,address[],uint256[])", +"4a2697fc": "balanceOfIssuer()", +"4a272bff": "GetHoga(address,uint32,bool)", +"4a275a1e": "Blockdrop(address)", +"4a280a55": "transferFrom(address,address,address,uint256,bytes)", +"4a2929ee": "betLockTime()", +"4a2951d2": "AsianCapitalChain(uint256,string,uint8,string)", +"4a2a197e": "addBonus(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"4a2a4ebc": "countries(uint8)", +"4a2b0c38": "DividendProfit()", +"4a2b22f9": "GameBase()", +"4a2b5235": "_addWhitelistAdmin(address)", +"4a2c3204": "getUserFLCEarned(address,address)", +"4a2cd48f": "getPreviousDate(bytes10)", +"4a2d5b6b": "getReleaseRatios(address)", +"4a2db4d8": "GetWinCards()", +"4a2dfbb4": "artWorkChangeRequest(uint256,string,uint8,bytes32,bytes32)", +"4a2e7752": "hashBid(address,uint256,address,address,address,uint256,uint256)", +"4a2ee75f": "addArticle(bytes,bool)", +"4a2f2333": "BitcoinMobile()", +"4a2f37a6": "updateItemTraits(uint256,uint256)", +"4a2fb1e4": "_mentors()", +"4a2fed3d": "test_SixtyPercentRules()", +"4a2ff078": "getRateFor(string)", +"4a303d30": "optAddressIntoHolding(address,uint256)", +"4a30f976": "censorship(uint256,bool,bool)", +"4a31259f": "totalNtsSoldWithBonus()", +"4a31dee2": "setTokenIdByIndex(uint256,uint256)", +"4a3270d7": "bytesStorage(bytes32)", +"4a330319": "tokensaleEndTime()", +"4a3310b8": "hasConfirmed(bytes32,address,address)", +"4a334c1c": "closePlacingPhase()", +"4a348da9": "getProductCount()", +"4a35035a": "dropNumber()", +"4a3573f1": "assignReservedTokens(address,uint8,uint256)", +"4a35d3ba": "SetBuildingSale(uint256,uint256,uint256,uint256)", +"4a35db7c": "restartValidation()", +"4a363fbc": "testNetworkDeployment()", +"4a366c46": "Th0m4z()", +"4a367140": "FoundersContract(address)", +"4a367827": "mintingStopDate()", +"4a367c68": "PrivateSaleStartTime()", +"4a367d73": "UpgradeMaster()", +"4a36870a": "firstRewardPeriodPercent()", +"4a36df25": "setMigrateContract(address)", +"4a375bc4": "FlagUint(uint256)", +"4a376c97": "OpenToThePublic()", +"4a37b5f7": "MyWill(address,string,string,string,address)", +"4a382c36": "freezeAccount(address,bool,uint256)", +"4a387bef": "removeLock(address)", +"4a393149": "onTransfer(address,address,uint256)", +"4a398c11": "SWIFTStandardToken(uint256,string,uint8,string)", +"4a39a5f4": "ALC_DECIMALSFACTOR()", +"4a3a835c": "withdrawAfterEnd()", +"4a3a87e2": "CreateProxyWithControllerAndRecoveryKey(address,address,uint256,uint256)", +"4a3a92f6": "minusFreezingTime(uint256,uint64)", +"4a3b0eec": "authorizeOpen(uint256,bool,string)", +"4a3b68cc": "referrers(address)", +"4a3bd672": "time1()", +"4a3bf377": "totalVotesFor(string)", +"4a3c4375": "getAllConsentTemplates()", +"4a3cdf21": "m_ETHPriceLastUpdate()", +"4a3d239c": "weiWithdrawed()", +"4a3d3510": "updateVotesOnTransfer(address,address)", +"4a3d3c09": "castleMinBrick()", +"4a3d5ec9": "ProofImpl(address)", +"4a3d72a1": "balancesContract()", +"4a3db7e7": "_generate(uint256,address)", +"4a3e2b21": "unpaid(bytes12)", +"4a3e4f90": "scamFlags(address)", +"4a3e8078": "emissionAddressUpdate(address)", +"4a3f17e7": "hodlers(address)", +"4a40e85b": "setMAYExchangeRate(uint256)", +"4a411f5a": "EventLuckyNumberRequested(address,uint256,uint256,uint8,address)", +"4a418b95": "logFlush(address,address,address,uint256)", +"4a418fb7": "numOfTransferableCompanysTokens()", +"4a41d1ac": "verify(address,bytes)", +"4a41d6f5": "_clearAllApproval()", +"4a41e045": "getUint8(int8)", +"4a420138": "scheduleHeartbeat()", +"4a4226a5": "TeamHeadsChoice(address)", +"4a42a397": "TakeSellOrder(bytes32,address,uint256,uint256,uint256,address,address)", +"4a42d99b": "donGameGiftLineTime()", +"4a432a46": "updatePrice(string,uint256)", +"4a443471": "_money()", +"4a44664b": "withdrawVPCxTokens(address)", +"4a44bdb8": "getBlock(uint256,uint256)", +"4a4507ff": "testInitialBalance()", +"4a45b60b": "unregister(address,address)", +"4a45beed": "Accept(bytes32,string)", +"4a45d2e6": "setParam(uint256)", +"4a4666c1": "addAuthorizer(address)", +"4a4753bc": "BonusesDistributed()", +"4a48314f": "hodlerTime3M()", +"4a49ac4c": "removeFromBlackList(address)", +"4a4a2569": "getAudCentWeiPrice()", +"4a4a26d7": "EnChangToken()", +"4a4a2a97": "performReentrancyAttack()", +"4a4a2b52": "unfreezeAdministrationContract()", +"4a4b4eb0": "WISDOMCOIN()", +"4a4b674a": "setPenalty(uint256)", +"4a4b7202": "PPBC_API()", +"4a4b7de6": "deedContract()", +"4a4baed7": "setTokenControlInfos()", +"4a4c1bcd": "LeviusDAO()", +"4a4c560d": "whitelistUser(address)", +"4a4c5e59": "proceedTokenDeals(uint256)", +"4a4c82c6": "_resetSpentToday()", +"4a4e3bd5": "emergencyUnpause()", +"4a4e5776": "stepDuration()", +"4a4e6f95": "addFeedOut(address,address,int256,uint256,uint256)", +"4a4e8884": "getUserAddress(bytes32)", +"4a4ede50": "transferSalesAgentPermissions(address)", +"4a4ef738": "addAddressToPrivateWhiteList(address,uint256)", +"4a4f76d5": "getInitializeEndTime()", +"4a4fbeec": "isLocked(address)", +"4a4fd24d": "addMileagePoint(address,uint256,int256)", +"4a5033eb": "Reverted()", +"4a504a94": "Confirmation(address,uint256)", +"4a50c3a7": "EtherToWei(uint256)", +"4a5163b5": "numDefinedGames()", +"4a51dcea": "TIER3_CAP()", +"4a522e4e": "winCosFromGame(uint256,uint256,string)", +"4a52a5f8": "TerraFirma()", +"4a52e506": "enableLostAndFound(address,uint256,address)", +"4a53c127": "setTargetDiscountValue7(uint256)", +"4a54315c": "registerUser(bytes32,string)", +"4a54c00d": "sendRemainingTokensBool(address)", +"4a54fb0a": "updateProduct(bytes32,string,address,uint256,uint8,uint256)", +"4a55308c": "firstSellPrice()", +"4a562d81": "returnDeed(address)", +"4a574d18": "bonusMode()", +"4a5791e0": "UnFreezeProduct(uint256)", +"4a57c032": "IcoDiscountLevelsChanged(address,uint256,uint256)", +"4a57e1c9": "finalizeTransaction(uint256)", +"4a583ec5": "confirmSettlement(uint256,uint256)", +"4a588d87": "CYB(uint256,string,string)", +"4a5891ac": "changeEternalStorageContractAddress(address)", +"4a58c409": "changeStartSale(uint256)", +"4a58cf22": "totalSupplyInWei()", +"4a58db19": "addDeposit()", +"4a5a3d76": "setETHPriceManually(uint256)", +"4a5a831b": "EthlanceConfig(address)", +"4a5baa1b": "VULCAN_POD_EXTRACTION_BASE()", +"4a5c2d6e": "Change(address,uint256,address,uint256,address)", +"4a5c8f1a": "getEarnEachBlock()", +"4a5db3b5": "authorizeAddress(address)", +"4a5dcb5b": "Candy(address,address)", +"4a5dcdc9": "RANGEEND_9()", +"4a5dddd2": "proxyPurchase(address)", +"4a5df250": "nextContributionCaps(uint256)", +"4a5e1cf3": "initLottery(uint16,uint256,uint8)", +"4a5e4fa8": "setExpReward(uint32)", +"4a5e70c0": "ObitanChainToken()", +"4a5ecc66": "Sale(address,address)", +"4a5f41b6": "checkCanInvestInternal(address,uint256)", +"4a5fca4f": "offChainTokens()", +"4a5ff749": "teamAddr()", +"4a601994": "WesTechToken()", +"4a606c53": "_db()", +"4a60751f": "refundingEndtime()", +"4a61179b": "MANHATTANPROXY11THWEAVE()", +"4a617faa": "shaBid(bytes32,uint256,bytes32)", +"4a617fba": "gooDepositDivPercent()", +"4a61f347": "resetEditionLimits(uint256)", +"4a61fc1e": "getWinners(bytes32)", +"4a6213a1": "MAKERDAO_FEED_MULTIPLIER()", +"4a624310": "getAngelInfoByTile(uint16,uint8)", +"4a627e61": "someValue()", +"4a62cc73": "auditQueueExists()", +"4a62f5eb": "_isTokenActive()", +"4a63464d": "adminClaimAirdrop(address,uint256)", +"4a635d05": "testCampaignGoalReached()", +"4a63864b": "RATE_RATIO_SCALE()", +"4a63b3d3": "lockBlock()", +"4a63f8a4": "presellTimer()", +"4a6458ae": "Rescued(address,uint256,uint256)", +"4a64c23f": "removeCbAddress(address)", +"4a661152": "get_exchange_wei()", +"4a66ddff": "twin_contract()", +"4a67fa7d": "setLotteryFee(uint256)", +"4a681b1b": "EXPECTED()", +"4a683a65": "addBTCTransaction(uint256,bytes16,address)", +"4a68492c": "setTransferAgentStatus(address,bool)", +"4a6a225e": "proxyPayment(address,bytes4,bytes)", +"4a6aac33": "DATE_31_DEC_2020()", +"4a6b0b05": "NewArtwork(address,bytes32,uint256,string,string,uint256,address,bool,bool)", +"4a6b8cf6": "setPretgeAddress(address)", +"4a6b9473": "registerActionEvent(bytes32)", +"4a6bb4a5": "updateWallet(address,address)", +"4a6bfa2d": "salesActive()", +"4a6c121d": "uintToBytes32(uint256,uint256)", +"4a6cfca7": "getAccessory(uint256,uint256)", +"4a6d0292": "addSale(address)", +"4a6de5c3": "_getAvailableBalance()", +"4a6e2ffe": "calculateReferral(uint8)", +"4a6f2691": "setBoolF1(bool)", +"4a7004b9": "getTotalTokenDepositByAddress(address)", +"4a700545": "PrivateSaleAddress()", +"4a701fc3": "setownerInfo(address,bytes32,bytes32,bytes32)", +"4a7084bb": "setPublicOfferDate(uint256,uint256,uint256)", +"4a714378": "toggleVending(uint256,uint256)", +"4a714c24": "payers(address)", +"4a7160a2": "addSet(bytes32)", +"4a716adf": "transferVotes(uint256,address)", +"4a719a27": "getTargetRepMarketCapInAttoeth()", +"4a71a768": "setWeiCapPerAddress(uint256)", +"4a71d469": "collectRev()", +"4a720287": "setEarlyEndTime(uint256)", +"4a729fe1": "pay(address,bytes12)", +"4a733ded": "paybackContribution(uint256)", +"4a738bea": "withdrawWithFee(address,uint256,bytes32,address,uint256,bool)", +"4a74ca99": "disconnectOrderPrice(address,address,uint256,uint256)", +"4a751072": "rateBoundaries(uint256)", +"4a7510fc": "StealResources(uint256)", +"4a75c0ff": "StoreDocument(bytes32,string,string)", +"4a75e6c3": "servicePayment(address,uint256)", +"4a75e741": "add_owner(address)", +"4a765625": "AliParsafar()", +"4a76564e": "tokenReleased()", +"4a76869f": "commitOrder(string)", +"4a768eaa": "buytoken(address,uint256)", +"4a7759f8": "BALL()", +"4a776104": "canFinishPVP()", +"4a77f870": "migrateAll()", +"4a78a594": "getClaim(string,string,address,uint256)", +"4a78cdba": "jackPot()", +"4a7902d2": "changeRoot(address)", +"4a790540": "getPastWinnerPrizes()", +"4a793c0c": "cidTotalTokenSupply()", +"4a797494": "priceRound3()", +"4a7987a2": "setProvider(bytes32,address)", +"4a79d50c": "title()", +"4a7b1acc": "MapDemo()", +"4a7b26ec": "join_game(uint256)", +"4a7b7ec3": "mintMarketMakerCancel(address,address)", +"4a7b8f21": "addHarvestOperationEndorsement(string,bool,string,string)", +"4a7bb697": "AssignGGCPoolOwner(address)", +"4a7c7e46": "uintToAscii(uint256)", +"4a7cb0f5": "FoundationRequested(address,address,bytes32)", +"4a7d505c": "initBetType()", +"4a7d5899": "payOut(address[])", +"4a7d8bcc": "getCurrentTokenPricepreICO(uint256)", +"4a7d9f0f": "getSettlementPeriodEnd()", +"4a7dd523": "generate(uint256)", +"4a7de068": "finalizeSetDelegatedFrom()", +"4a7e00de": "rejectCompanyAllocation(address)", +"4a7e049e": "getFullCompany(address,uint256)", +"4a7e130e": "remainTime()", +"4a7ffcbc": "daoContract()", +"4a800b98": "cancelChampSale(uint256)", +"4a803387": "insert(uint256,uint256,uint256)", +"4a8075ac": "SaleAuction(address)", +"4a80dcab": "getProjectMilestonesCount(bytes32)", +"4a80f2ba": "registerKey(string)", +"4a812023": "logUniverseForked()", +"4a81db9a": "moneybackaddr()", +"4a81dc0f": "forceUpdatePrizes(uint256[])", +"4a82534b": "create(address,address,address,uint256,uint8,uint8,uint256)", +"4a825c68": "checkRoundEnd()", +"4a826823": "setCastle(uint64,uint64,uint64,uint64,uint64,uint64)", +"4a82804e": "setNewMessage(string)", +"4a8302a2": "SynixToken(uint256,string,uint8,string)", +"4a8305b4": "newCoinOwner(address)", +"4a838caf": "ethfortnite()", +"4a83cfa9": "burnMedal(uint256)", +"4a84fa81": "checkRokSold()", +"4a85223b": "addUser(address,string,string,int256,string)", +"4a85280e": "isAuthorizedAddress(address)", +"4a85512f": "awardInvation(bytes32)", +"4a85d0d5": "HeliumNetwork()", +"4a85dbcd": "setVal(string,uint256)", +"4a8646c3": "HomeLoansToken(uint256,string,uint256,string)", +"4a8671f1": "newWallet()", +"4a867488": "setVestingPercent(uint256)", +"4a87b419": "cancelApproveFee()", +"4a87e08a": "BUY_CITY_FEE()", +"4a881ac6": "addAddressDescription(string,address)", +"4a88eb89": "altDeposits()", +"4a88f9c7": "exFees(uint256)", +"4a891e7f": "FinalizeMove(address,string,string)", +"4a896384": "ask()", +"4a8967a6": "_today()", +"4a8a6eac": "CarRegistered(uint256)", +"4a8a83db": "calculateVestedTokensTime(uint256,uint256,uint256,uint256,uint256)", +"4a8b2b27": "testOne()", +"4a8b5389": "allocateBountyAndEcosystemTokens()", +"4a8beaf4": "decline(string)", +"4a8c1fb4": "isActivated()", +"4a8c2d64": "TopsXToken(uint256,string,uint8,string)", +"4a8c3129": "MultiOwners()", +"4a8cbae1": "charityPercent()", +"4a8e4d78": "getDuesIn(uint256)", +"4a8e5651": "resultAccept()", +"4a8ef4bd": "setOrderBookAcount(address)", +"4a8ef851": "pushTicketSetToAccount(uint256,uint256)", +"4a909d5f": "transferWithLockup(address,uint256,uint256)", +"4a910046": "getLastHash()", +"4a914e8c": "calculateTotalExpenseWithdrawableAmount()", +"4a915ea2": "votedHarvest()", +"4a91e536": "getWinnerDetails(uint256)", +"4a91ec80": "prospectors_dev_allocation()", +"4a91ee2a": "allowByPassword(bytes8,bytes)", +"4a91f195": "totalBought()", +"4a923199": "maximumTNB()", +"4a92fa06": "createPromoRide(address,string,bytes7,uint256)", +"4a92fb3a": "proxyTransfer(address,address,uint256)", +"4a943eb3": "numsuccesses()", +"4a945f8d": "setAddresses(address,address,address,address)", +"4a947bdb": "putMatingRequest(uint256,uint256)", +"4a950db6": "tradetxToken()", +"4a950f00": "TurkeyBurgerToken(uint256)", +"4a955659": "_getNewLotteryCreatedAt()", +"4a96712e": "confirm(bytes32,address,uint256,uint8,bytes32,bytes32)", +"4a96d129": "OfferTime()", +"4a975d6b": "allocateRestrictedTokenTo(bytes32,bytes32,bytes32,uint256)", +"4a980b49": "IRideToken()", +"4a98146a": "VILLAGE_START_PRICE()", +"4a994d22": "_getReleaseDate(uint256)", +"4a994eef": "setDelegate(address,bool)", +"4a9952c7": "setMintTokenOwner(int256,address,address)", +"4a9a6f15": "getFromFaucet(string)", +"4a9b3f95": "personUpdateName(uint256,string)", +"4a9b5c2e": "CREATOR_TOKEN_END()", +"4a9bdb65": "byuoutCount()", +"4a9cdfad": "setPlayerLAff(uint256,uint256)", +"4a9d367b": "RecipientChanged(address,address)", +"4a9d9172": "test_testableStandardCampaignAbsolvementAfterPayout()", +"4a9f0110": "setSellDailyLimit(uint256,bytes2,uint256)", +"4a9f6d4a": "setMaxPreCrowdAllocationPerInvestor(uint256)", +"4a9fefc7": "getReferrer(address)", +"4aa16737": "enter(uint8)", +"4aa1acb3": "withdrawEth(uint256,bytes)", +"4aa1d21b": "transferDryRun(address,address,uint256,uint256)", +"4aa1dde4": "isDisclosureFullySigned(uint256)", +"4aa2f0f5": "HKD_Omnidollar()", +"4aa3fcd3": "_getSkillConfigs()", +"4aa41e53": "minFinneyPerHedgeTransfer()", +"4aa47a50": "isIntermediateVault()", +"4aa4ba9b": "storeBatch(string)", +"4aa5a05d": "maxP1Cap()", +"4aa5b398": "voteCurrentResult()", +"4aa669d8": "Buy_Wall_level_in_wei()", +"4aa66b28": "getBonus(uint256)", +"4aa678c3": "getMyUnlockValue()", +"4aa6c09a": "setTargetDiscountValue3(uint256)", +"4aa735c0": "BST()", +"4aa74c27": "_emitFuture(bytes32,uint256,uint256,uint256)", +"4aa77c71": "Visualrocktoken()", +"4aa83079": "setSaleContractFinalised(address)", +"4aa880c1": "SetFactoryParams(bool,bool,uint256)", +"4aa8e57e": "buyBox1()", +"4aa8e773": "Cancel()", +"4aab421d": "tgrAmountCollected()", +"4aab8c14": "setPonzi(uint8,uint256)", +"4aabcec7": "SimpleWallet()", +"4aac390a": "hasLanguage(address,address,uint256)", +"4aac75a7": "setMainSaleDates(uint256,uint256)", +"4aaca86d": "saleStage()", +"4aacd437": "freezeAccountPartialy(address,uint256)", +"4aaceed3": "icoBonus2()", +"4aada45f": "KittensDroped(uint256,uint256)", +"4aae385f": "preSaleFirstStartDate()", +"4aaf4a12": "getOwner(string)", +"4aaf6b86": "contract_state()", +"4ab0c0ee": "testConcatMemory32Bytes()", +"4ab0fc08": "setDefaultURIEnd(string)", +"4ab1c98f": "requestControllerContractMigration(address)", +"4ab24cf3": "pornToken()", +"4ab273f0": "SellEggs()", +"4ab320b4": "viewSettingsChange(uint256)", +"4ab358c7": "recoverFunds(uint256)", +"4ab3bbdc": "_brokerFeeDistribute(uint256,uint256,uint256,uint256)", +"4ab3bc23": "getSelfCardDatas()", +"4ab3d487": "newEntry(uint256)", +"4ab40ac6": "allOpenTradesAmounts()", +"4ab5439b": "TEAM_POOL_ADDR()", +"4ab54530": "inPreSale1Period()", +"4ab5cc82": "latestValue()", +"4ab6d337": "getContributorsLength()", +"4ab74a1e": "tok()", +"4ab7508a": "multiWallet()", +"4ab788cb": "prebridge()", +"4ab798f1": "toggleTransfer()", +"4ab7cbfe": "getMinerHalvingHashRateOf(address)", +"4ab89400": "cancelRefund(address)", +"4ab9792d": "setTokenFrom(address)", +"4aba5f34": "getCandidatesList()", +"4aba76a3": "ESlotsToken()", +"4aba7f96": "setMixGenAddress(address,address)", +"4abad407": "startCrowdfund(uint256)", +"4abb525a": "moonIncContract()", +"4abb9d39": "depletable()", +"4abc8652": "inPrivateSalePeriod()", +"4abd89bd": "MDICOStage2(address,address,uint256,uint256,uint256,uint256)", +"4abd8e01": "putStcWithBtc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"4abd8f65": "updateEnabled()", +"4abdf2e0": "setWithdrawLimit(uint256)", +"4abe1a62": "settleEtherPolicy(address[],uint256[],uint256[],uint256[])", +"4abe34f2": "TecToken(string,string,uint8,uint256)", +"4abefa36": "getEmployees()", +"4abfacfd": "createTeam(string,string,uint32,uint32,uint256)", +"4abfbbe3": "getBlockInfo(uint8,uint8)", +"4ac0b6b0": "preparePaymentReferrer(address,uint256)", +"4ac0d66e": "newGreeting(string)", +"4ac1ad78": "getWeekday(uint256)", +"4ac1b5ff": "GoldmintUnsold(address,address)", +"4ac25224": "isChannelOpen()", +"4ac2d103": "miningReward()", +"4ac36201": "Yachtco()", +"4ac365c2": "DividendTransfered(uint256,address,uint256,uint256,uint256)", +"4ac38f13": "BlupassToken()", +"4ac39f37": "unsafeIsSigned(uint16)", +"4ac429f2": "ConstantinopleCheckFunction()", +"4ac54245": "_fulfill(bytes32)", +"4ac5aae5": "getTotalBonus()", +"4ac5dea9": "getRoundPointer(uint256,uint256)", +"4ac6b2be": "getCheckRecordCreator(bytes)", +"4ac6d5f4": "frostTokens()", +"4ac79795": "removeLogic(address)", +"4ac7becf": "SimpleSign()", +"4ac84218": "RequiredFeeNotMet(uint256,uint256)", +"4ac84242": "CWT(uint256,string,string)", +"4ac87af7": "frozenToken(uint256,string)", +"4ac87e47": "Bittwatt(uint256)", +"4ac8a529": "createDispute(uint256)", +"4ac9f0d7": "behalfer()", +"4ac9f881": "takeSellOrder(address[3],uint256[3],uint256,uint8,bytes32,bytes32)", +"4ac9fc37": "updateConvertionRate(uint256)", +"4acb17c8": "getPeggedTokenAddress(address,address,uint256)", +"4acb232b": "percentWeiMC()", +"4acb3e59": "QCOToken(address,address,address,address,address)", +"4acc50eb": "Invoked(address,address,bool,uint256)", +"4acceeea": "togglePrebrdige()", +"4acd058e": "auctionBonus(uint256)", +"4acd44db": "offChainManager()", +"4acd4d5c": "mintLockCashout(address,uint256)", +"4acdc150": "setupCrowdsale(uint256)", +"4acdd29a": "statusPred(address,uint256[],uint256)", +"4acddfa0": "register(address,string,uint256,string,string,string,bytes20)", +"4ace9ccc": "ratePlansOfVendor(uint256,uint256,uint256)", +"4acea254": "inviteAmountLimit()", +"4acefeb1": "ethartArtAwarded()", +"4acf071c": "setStepTwoTime(uint256,uint256)", +"4acf4a27": "withdraw(uint128,address,uint256,uint128)", +"4acf8867": "PillarToken(address,address)", +"4ad07b0e": "oracleOutcomes(bytes32,address)", +"4ad0a529": "currentMigrationTarget()", +"4ad1cbad": "withdrawTeamTokens(address,uint256)", +"4ad25557": "getMonsterNum(uint256)", +"4ad27ae1": "claimInternal(address,address)", +"4ad32970": "setUserAllocs(address[],uint256,uint256)", +"4ad37241": "destroyCard(uint256,uint16)", +"4ad37538": "DJPToken()", +"4ad42500": "ico26()", +"4ad447ba": "PutinCoin()", +"4ad4fa5d": "ERC223()", +"4ad59c54": "overpays(address)", +"4ad5a68c": "returnIdImage(uint32)", +"4ad5f440": "totalIcoTokensSold()", +"4ad6e648": "fightFactor()", +"4ad6f9f3": "checkTx(string)", +"4ad7799f": "VestingReleased(address,uint256)", +"4ad857a1": "etherSent(uint256)", +"4ad88363": "reset_application(address)", +"4ad8c869": "reCommentReward()", +"4ad8c938": "createSiringAuction(uint256,uint256,uint256,uint256)", +"4ad9b1c3": "addWallets(address[])", +"4ad9d7ab": "getGoldStatusRegistered(address)", +"4ada218b": "tradingEnabled()", +"4ada3b32": "approvedAccount(address,bool)", +"4adaedef": "send_allowed()", +"4adaf5f6": "changeFundOwner(address)", +"4adaf748": "eBlockPower()", +"4adbe551": "whitelistAdmin()", +"4adc0b09": "setMembershipPrice(uint8,uint256)", +"4adcbd19": "isThisHardforkedVersion()", +"4adf6591": "setReportTimestamp(uint256)", +"4ae00041": "call(address,bytes,uint256)", +"4ae0ac60": "FobsCoin()", +"4ae0f543": "publicAllocation()", +"4ae12e9f": "FHFToken()", +"4ae184f2": "createStandingOrder(address,uint256,uint256,uint256,string)", +"4ae2b849": "PHASE_DURATION()", +"4ae2c351": "createCrowdsaleTiers(bytes32[],uint256[],uint256[],uint256[],uint256[],bool[],bool[])", +"4ae3164d": "getNewGens(address,uint256)", +"4ae34a96": "changelp16(address)", +"4ae34bb1": "EfectiveToken()", +"4ae3643f": "phase_4_token_price()", +"4ae4dd6b": "KeyRewardPool(uint256,address,address)", +"4ae4e9ea": "m_currentTokensSold()", +"4ae51a9a": "transferDevTokens(address)", +"4ae55dd0": "amendedEarlyPurchaseIndexes()", +"4ae5d478": "setNodesVars(address)", +"4ae5eecb": "getUserP3DDivEarnings(address)", +"4ae6ab70": "_getRevisionTimestamp(bytes20,uint256)", +"4ae85627": "grindUnicorns(uint256)", +"4ae86038": "MultiBonusCrowdsale()", +"4ae8c55f": "getWwLength()", +"4ae8ef06": "setLastTier(uint16)", +"4ae8f9fb": "FSCP()", +"4ae90a40": "isNotaryAdditionValid(address,address,uint256,uint256,string,bytes)", +"4ae931cc": "setPresellUpToTime(uint256)", +"4ae96e77": "setTransformTarget(uint256)", +"4ae9af61": "getBotStats(uint256,uint256)", +"4aea0aec": "lendFee()", +"4aea5f0f": "Artcoin(address,uint256,uint256)", +"4aea7aa9": "SetIDChain(address,address)", +"4aeb0241": "LisaToken()", +"4aeba1a5": "removeCustomerService(address)", +"4aec4677": "migrateLosingTokens()", +"4aec6416": "removeTransferAndCallWhitelist(address)", +"4aecf91d": "_emitContractRemoved(address,address)", +"4aed8a76": "inPreSalePeriod()", +"4aeda70d": "changeAuctionContract(address)", +"4aeddad0": "ConvertBkp(uint256)", +"4aef05a5": "addSongWriter(string,uint256,address)", +"4aef8b7c": "_isOddFlag(uint256)", +"4aefc3c4": "ContributionStateChanged(address,uint8)", +"4af0700b": "isUniqueBlindedProposal(uint256,bytes32)", +"4af153a9": "_message(uint256)", +"4af165cb": "EPause(address,string)", +"4af1b8a7": "pullAddr()", +"4af1f96a": "getActiveSellSize(bytes32)", +"4af27ba2": "_redeem(address,address,uint256,bytes,bytes)", +"4af3182a": "move_x(uint8,uint8)", +"4af350eb": "transferTokens(address,uint256,address)", +"4af4a127": "bonusPeriod()", +"4af4c191": "TIER4_RATE()", +"4af54311": "burnSomeTokens(uint256)", +"4af56cb0": "getUseRegistry()", +"4af69189": "sponsoredJackpotToken()", +"4af6ffc2": "attest(uint256)", +"4af79ba2": "getChallengesForMentor(address)", +"4af7eedf": "VID(uint256,string,uint8,string)", +"4af80f0e": "setConversionWhitelist(address)", +"4af98f1b": "setFeeDivider(uint256)", +"4afb07c4": "getAccountActivity(address)", +"4afb09c2": "listDTH()", +"4afbac9c": "removeFromTokenList(address,uint256)", +"4afbb7d7": "getDepositary_function()", +"4afc0476": "RedPillCoin()", +"4afc7774": "_is()", +"4afce471": "test_requires_depth(uint16)", +"4afd74ff": "getRefunded(address)", +"4afd8a19": "getLendingInfo(address,uint256)", +"4afd8a98": "testEthIcoToken()", +"4afdcbde": "pauseOperator()", +"4afe2f80": "setRate(uint8)", +"4afe62b5": "placeBet(uint256,uint256)", +"4affb863": "isPartner(address,address)", +"4b00ebfb": "CheckExecution(string)", +"4b013f85": "_addVestor(address,uint256,uint256,uint256,bool)", +"4b023cf8": "setFeeAccount(address)", +"4b02e328": "IncorrectFee(address,uint256)", +"4b0304ab": "DonationReceived(address,uint256,uint256)", +"4b031397": "killAdminOnly()", +"4b031d0f": "shortSellShares(bytes,uint8,uint256,uint256)", +"4b03a15e": "_terminateSchedule(address)", +"4b042c0b": "specialsInfo(uint256)", +"4b05de75": "seventhTeamWithdrawal()", +"4b0697e4": "Manager(address)", +"4b06e1c7": "declareWininingFighter(address)", +"4b06fb28": "eatUnicornsAlive()", +"4b0720a7": "customGasPrice()", +"4b079fa6": "ownerof()", +"4b084d49": "checkEnd()", +"4b089b12": "withdrawManagerBonus()", +"4b09b72a": "reserveAmount()", +"4b09ebb2": "e_exp(uint256)", +"4b0a0d04": "checkRequestSignature(bytes,address[],uint256,bytes)", +"4b0ad8fa": "getStakedShop(address)", +"4b0adf6c": "MintingAgentChanged(address,bool)", +"4b0babdd": "releaseTokens(uint256)", +"4b0bbf84": "addEntropy()", +"4b0bddd2": "setAdmin(address,bool)", +"4b0c79aa": "turnOnOraclize()", +"4b0d5417": "disableSellToken()", +"4b0daadb": "getStaticArray()", +"4b0df486": "assertEq23(bytes23,bytes23)", +"4b0e2c90": "enableInternalLock()", +"4b0e5044": "HoldToken(address)", +"4b0e7216": "setBurnAddress(address)", +"4b0ee02a": "totalBalanceOf(address)", +"4b0f43fd": "canExecute(address,uint256)", +"4b106893": "inactive_withdraw(address)", +"4b11281e": "returnCreatorAddress(bytes32,uint8,bytes32[2])", +"4b11452c": "changeFoundationAddress(address)", +"4b114691": "playerInfo(address)", +"4b1146ca": "TOKEN_SUPPLY_BOUNTY_LIMIT()", +"4b11982e": "setCooldown(uint64)", +"4b11e7a0": "getVotingStart()", +"4b12416c": "setHeroTokenContract(address)", +"4b12dd39": "BTSCoin()", +"4b1325ea": "setNewOwnersCountToApprove(uint256)", +"4b143bb5": "harapan()", +"4b14e003": "transferAll(address,address)", +"4b16304f": "setTokenAddress(address,bytes)", +"4b1700df": "TokenListingManager()", +"4b1740ad": "tier3()", +"4b17bdd8": "transferTokensFrom(address,address,address,uint256)", +"4b18be1d": "moveLeftOvertokensToartistPool()", +"4b19eb09": "isStatePublic()", +"4b1a5773": "createSwapTarget(bytes20,address,address,uint256,address)", +"4b1be424": "getVotesBetweenFor(uint256,uint256,uint256,address)", +"4b1c5597": "dissolveFund()", +"4b1c8506": "bonusesList(uint256)", +"4b1cab4e": "calculateEthToToken(uint256,uint256)", +"4b1cdc2d": "token6DivsOwing(address)", +"4b1cff0b": "pot_()", +"4b1d00ee": "releasedCount()", +"4b1d29b4": "maxLockPeriod()", +"4b1dc225": "founderWithdrawablePhase3()", +"4b1dd21a": "getWhitelistLimit(address)", +"4b1dd591": "firstDiscountCap()", +"4b1ebc5a": "perpetuum()", +"4b1ec20c": "setPropertyPrivateMode(uint16,bool)", +"4b1ef6e1": "getMyRecord(address,uint256)", +"4b1f15d1": "updateDragonPrice(uint256)", +"4b1fb6d4": "removeNacFromNetf(uint256)", +"4b1fe17e": "ENSResolver(address)", +"4b200fac": "ClearCoin()", +"4b20ae39": "create(address,address,address,uint256,uint256,uint256,uint256)", +"4b21433a": "CoolICOToken()", +"4b21a587": "sellerfeeDivide()", +"4b21aaae": "getBondPrice(uint256)", +"4b2233df": "buyTokenSub(uint256,address)", +"4b227176": "pID_()", +"4b236401": "claimPlot(uint256,uint256)", +"4b242252": "levelByToken(uint256)", +"4b24ea47": "controllerAddress()", +"4b24f3a6": "setJackpotFee(uint256)", +"4b24f7aa": "CSpacesToken()", +"4b24fd0d": "getKeyType(address)", +"4b256137": "lockingContract()", +"4b259b5c": "getCumulativeAllowance()", +"4b25bfce": "whitelist(uint256,address)", +"4b269a00": "withdraw(int256[])", +"4b2702b3": "TokenSwitch(address,address,bool)", +"4b272c4a": "Greenbit()", +"4b274458": "getUncleAmount(uint256)", +"4b27a2ca": "fechVoteMainInfoForVoterBySnapshotBlock(address,uint256)", +"4b28a674": "organizer2()", +"4b28bdc2": "allRevealed()", +"4b2930d0": "IsICOrunning()", +"4b29c448": "setGoal(uint256)", +"4b2a12da": "changeMinDeposit(uint256)", +"4b2a4e18": "TradersWallet()", +"4b2a649c": "ECRecoverWrapper(string,uint8,bytes32,bytes32)", +"4b2ac3fa": "swapID(bytes32,uint256)", +"4b2acaa0": "openGateway()", +"4b2ba0dd": "originalSupply()", +"4b2be022": "BinaxToken()", +"4b2c0706": "getPeriod(uint256)", +"4b2c2596": "MerchantDealsHistory(string)", +"4b2c89d5": "redeemDeposits()", +"4b2cbc9d": "etherCollected()", +"4b2d5164": "transfer_tokens_after_ICO(address[],uint256)", +"4b2f249a": "isTileLive(uint16,uint8)", +"4b2f9eb7": "declareNewMaster(address)", +"4b313043": "preIcoMaxLasts()", +"4b314b34": "LogPause()", +"4b319713": "totalWithdrawn()", +"4b321502": "addHours(uint256,uint256)", +"4b331ca0": "getCitation(uint256)", +"4b33eac2": "updateTicketStructure(uint256,bytes32[],uint256[],uint256[],uint256[],uint256[],uint256[])", +"4b341aed": "totalStakedFor(address)", +"4b3544d5": "Jakov()", +"4b35ae33": "setTimeLimited(uint256)", +"4b369820": "setEntry(string)", +"4b36bca9": "WagerGames()", +"4b3727fb": "SshKey()", +"4b374fbe": "BTEN()", +"4b376513": "lastBlock_v13Hash_uint256()", +"4b376e45": "BoodooToken()", +"4b37c73f": "removeFactory(address)", +"4b37cf47": "littIsCapsule(bytes32)", +"4b3881ff": "StakeDestroyed(uint256,uint256,address,bytes32)", +"4b3955a5": "tier0LOT()", +"4b396ade": "TicketMultiTear(string,string[],uint256[])", +"4b3985a4": "shareTime()", +"4b398a5c": "mainnetLocked()", +"4b3a5fa6": "saleStartFirstDayEnd()", +"4b3ab5bf": "paySubscriptionFee()", +"4b3ab9c5": "getShare(address)", +"4b3afdd2": "setEthernautsStorageContract(address)", +"4b3b1d69": "notZero(uint256)", +"4b3b548f": "preMine()", +"4b3b6168": "SetNewBigContract(address)", +"4b3c45db": "getDealDataByNumber(uint256)", +"4b3ce14d": "set_minUETsPerReturnMoreThan(uint256)", +"4b3d81b6": "initialBlockTimestamp()", +"4b3ec03a": "TEAM_ACCOUNT()", +"4b3f3987": "_updateLock(uint256,address)", +"4b419b5f": "setcardPrice(uint256,uint256)", +"4b41c74a": "Ticker()", +"4b41cb60": "withdrawPreSigned(address,uint256,address,uint256,uint256,address,uint8,bytes32,bytes32)", +"4b41eb4a": "ZyryanovKubSU2018()", +"4b41f4df": "transferableTime()", +"4b42d208": "getUint8FromByte32(bytes32,uint8)", +"4b432966": "max_fortunes()", +"4b43b582": "changeAdminWallet(address)", +"4b43dc51": "testTokensAreLockedDuringSale()", +"4b449cba": "auctionEndTime()", +"4b452958": "_setStakingEpochStartBlock(uint256)", +"4b467105": "walletCommunityReserve()", +"4b467157": "stopEmergencyWithdrawal()", +"4b468b0e": "JDAnteil()", +"4b469490": "RichToken(address)", +"4b471dd0": "setWithdrawalAndReinvestmentContracts(address,address)", +"4b496444": "azatipToken()", +"4b4a456a": "ChargeFix(uint256)", +"4b4a5088": "switchCompatible20(bool)", +"4b4af4db": "allocateTeam(address,uint256)", +"4b4b6338": "MECoin(uint256)", +"4b4b87c0": "PowerCoin()", +"4b4bb75b": "DSToken(string,string)", +"4b4c01f4": "RobincoinERC20(uint256,string,string)", +"4b4c0d7c": "BONUS2()", +"4b4c2039": "_B_sendToEthertoteDevelopmentWallet()", +"4b4e23e1": "TIMESTAMP_BUCKET_SIZE()", +"4b4e38df": "GetCurrentPoolAmount()", +"4b4f8e36": "addCZRLock(address,uint256,uint256,uint256)", +"4b4f90ef": "saleIsOn()", +"4b504ecd": "logNewPlayer(address)", +"4b50c9f0": "getGameStartTime()", +"4b513e82": "RegistrantApproval(address)", +"4b5243b5": "ETGTestCoin()", +"4b52f48f": "withdrawLeft()", +"4b52f89b": "setGiftToken(address)", +"4b530090": "nextDiscountTTWTokenId1()", +"4b534c48": "unlockProjectToken()", +"4b54d131": "wipeProposedActions()", +"4b54f1fb": "S1Coin()", +"4b561a16": "getMatchInfo(uint256)", +"4b563657": "setMessages(bytes32,bytes)", +"4b56b10d": "preIco()", +"4b56cd27": "depositBoth(address,uint256)", +"4b56dcf4": "LogChangeIsPayableEnabled()", +"4b57b0be": "wethToken()", +"4b57ed55": "EnonRToken()", +"4b57fbaf": "SetMinChequeValue(uint256)", +"4b5830b4": "SENC_CONTRACT_ADDRESS()", +"4b58484d": "_createPlayer(address,address)", +"4b58bb40": "timeUntilNextRound()", +"4b58d0bb": "reserveFundAddress()", +"4b59e880": "puzzle(address,bytes32,bytes32)", +"4b5a0e65": "getWinningStageInfo()", +"4b5a726d": "getProgramInfo(uint256)", +"4b5c0234": "throwsWhenHittingHardCap()", +"4b5c4277": "log(string,string)", +"4b5c8bdf": "stakeTotal()", +"4b5dc8cb": "roundMoneyDown3SFExt(uint256)", +"4b5dcad7": "ServiceStation(address)", +"4b5e8d63": "registerInvestor()", +"4b5f297a": "hasAttribute(address,uint256)", +"4b5f2fa4": "TravelZediToken(uint256,string,uint8,string)", +"4b5f3e0a": "getDate(bytes32)", +"4b5fd350": "withdrawHeldToken(uint256,uint256,uint256,uint256)", +"4b5fea8a": "milestoneRecipients(uint256)", +"4b602673": "artworks(uint256)", +"4b603a83": "mintTokens_(address,uint256,address)", +"4b61cf17": "SWLPerEther()", +"4b623178": "removeFromPublicWhitelist(address)", +"4b627107": "setValidatorDescription(address,string)", +"4b62e0d9": "buyIns(uint256)", +"4b63036d": "holderContract()", +"4b63189c": "softcapPreSale()", +"4b63e601": "scheduleCall(address,uint256,bytes)", +"4b641f52": "coinbaseInit()", +"4b64a00f": "DiscountApplied(uint256,uint256,uint256)", +"4b64e492": "execute(address)", +"4b650d0b": "getPlayerClickCount(uint256,address)", +"4b656b41": "totalWeiRaisedDuringPhase1()", +"4b66cb7e": "teamHolder()", +"4b6753bc": "closingTime()", +"4b67f6af": "name2()", +"4b689cf0": "setCommunityAccountOwner(address)", +"4b69c3d4": "getRegistryDataVendor()", +"4b6a3334": "setEtherPrices(uint256,uint256)", +"4b6a8604": "setBiddingRate(uint256,uint256)", +"4b6a9f1d": "STORES_TO_UPGRADE_1CENTER()", +"4b6acafb": "totalDividend()", +"4b6ad918": "isCurrentUserRefAvailable()", +"4b6b2300": "updateTopicAssetClass(bytes15,string)", +"4b6bc655": "isFreeze(address,address)", +"4b6bdf1d": "poker()", +"4b6c144a": "getClaimById(string)", +"4b6dfe4e": "initialFundBalance()", +"4b6e7d78": "Data()", +"4b6ea677": "oracleURL()", +"4b6ede29": "Users()", +"4b702afa": "accountS()", +"4b70cec4": "getTime(address)", +"4b71bff3": "airdropReward()", +"4b726f61": "checkCustomer(string,string)", +"4b729aff": "buyNumber(uint256)", +"4b72bbaf": "getSirePrice(uint32)", +"4b739b61": "payByEth(uint256)", +"4b73ca04": "flipsCompleted()", +"4b741395": "requestNewMint(address,uint256)", +"4b749535": "hardCapTokens()", +"4b750334": "sellPrice()", +"4b75f046": "tokensIssuedCrowd()", +"4b75f54f": "formula()", +"4b760612": "localsCointoken(uint256,string,uint8,uint256,string,string)", +"4b763fe7": "PersistLimitChanged(uint256)", +"4b766b95": "markRewardsSet(string)", +"4b76cb13": "get_status_user(address,address)", +"4b76fe19": "EtherPredict()", +"4b778445": "addRound(uint256,uint256,uint256)", +"4b77b8d3": "stopCrowdfunding()", +"4b77c468": "invite(address)", +"4b77d17d": "is_king_found()", +"4b7829f1": "token_claim_waiting_period()", +"4b7863fe": "setIBalance(uint256,uint256)", +"4b78ab61": "notarizationList(uint256)", +"4b798b82": "setFixes(string,string)", +"4b79e8ef": "getVariablesForDapp()", +"4b7a5cc6": "PLATINUM_AMOUNT_NDC()", +"4b7a7a14": "PresaleFirst(uint256,uint256,address,address)", +"4b7ae9f6": "returnMe()", +"4b7b2ed1": "confirmTransaction(address)", +"4b7b45b4": "DreamMaker()", +"4b7bb8e3": "CfoAddress()", +"4b7c1d2c": "TransactionConfirmed(uint256,uint256)", +"4b7e23b3": "ShapeshiftBotLookup()", +"4b7fa6db": "viewFn(uint256)", +"4b7fcee7": "ownerPausePayouts(bool)", +"4b802dde": "rentals()", +"4b803095": "processReferralSystem(address,address)", +"4b813478": "FinishBallot(uint256)", +"4b81780e": "ADDR_MAYA_ASSOCIATION()", +"4b82d416": "preSaleSecondEndDate()", +"4b82ee28": "frozenDaysForEarlyInvestor()", +"4b82f437": "setFirstReporterCompensationCheck(uint256)", +"4b836181": "BuyTicket(address)", +"4b8399f4": "setEnum()", +"4b841fa9": "redeem(string,uint256,uint256,uint8,bytes32,bytes32)", +"4b84ee81": "LogAddTokenPairWhitelist(address,address)", +"4b851b23": "hasDefaultRelease()", +"4b852c03": "setDuration(uint64)", +"4b855c62": "purchaseKingdom(string,string,bool,address)", +"4b8574ad": "AttestationManager()", +"4b85fd55": "setAutoBirthFee(uint256)", +"4b8624c4": "BONUS()", +"4b865846": "suspend(uint256)", +"4b866981": "LP(uint256,string,string)", +"4b869e15": "investeth2017()", +"4b86c225": "lock(address,address,uint256,uint256)", +"4b86faba": "claimHodlReward()", +"4b86fc5b": "isEligible(address,string,string)", +"4b8772c1": "buyUnit(uint256,uint256)", +"4b886f09": "VantageCoin(uint256,string,uint8,string)", +"4b891518": "_grantAccess(uint256,address)", +"4b89c41d": "setClosingTime(uint256)", +"4b8a3529": "borrow(address,uint256)", +"4b8adcf7": "pauseContribution()", +"4b8b4cee": "postExternalPayment(address,uint256,uint256,uint8,uint256)", +"4b8b704e": "icoTokensCount()", +"4b8b7a2a": "addCourse(string,uint256,string,string,string,string)", +"4b8ca215": "Ornament()", +"4b8d12f0": "migrateAddress()", +"4b8dbd1a": "VRFtoken()", +"4b8dc588": "closeRefundVault(bool)", +"4b8e1ba8": "isMinter(int256,address)", +"4b8e31a2": "_erc20token()", +"4b8e38db": "test(uint32[26],uint32[4])", +"4b8f4b5e": "MordernToken()", +"4b8f9f87": "ownerSetMinJackpoBet(uint256)", +"4b8fe5eb": "setPendingUserListLength(uint256)", +"4b8feb4f": "multiSigWallet()", +"4b901b72": "balanceOfByTranche(bytes32,address)", +"4b9081bf": "getBonusSale(uint256,uint256)", +"4b90ac86": "isBountySent()", +"4b9143f7": "setSold(uint256)", +"4b915a68": "aliceClaimsDeposit(bytes32,uint256,address,address,bytes20)", +"4b91ab35": "unfollow(bytes32)", +"4b922b12": "getDataColla_AB_01(string)", +"4b92738e": "migrateBalances(address[])", +"4b92f39e": "tradingClass(address)", +"4b930503": "registerName(address,string)", +"4b931600": "evaluateCategory(address,uint8,uint256,uint256)", +"4b932327": "novaluetoken(uint256,string,string)", +"4b93fec0": "BetContract()", +"4b944b9b": "post(bytes32,bytes32)", +"4b94f50e": "getTokenPrice()", +"4b95dcc0": "ViberateCrowdsale()", +"4b960794": "spotsLeft()", +"4b963025": "addUniqueSaleTokensMulti(address[],uint256[])", +"4b96b0ee": "registerZone(bytes8)", +"4b96f855": "burnPercentageDefault()", +"4b97aed9": "numOptions()", +"4b97e6cc": "withdrawEthBalanceSave()", +"4b991bde": "challenge(uint64,uint256,bytes,bytes,bytes)", +"4b997d9a": "sendTokens(uint256,address,bool)", +"4b99f0c5": "setTradingPairCutoffs(bytes20,uint256)", +"4b9a22af": "teamWon()", +"4b9b808d": "setResetVoteKindnessEvery(uint256)", +"4b9c4358": "betPlaced(address,uint256,uint256)", +"4b9c78e5": "buyEngineer(uint256[])", +"4b9cdbe7": "addCurrencyInternal(uint256)", +"4b9ce83c": "recordAssetPrice(uint128,uint128,uint128)", +"4b9d5047": "PlutoToken()", +"4b9d8624": "getLinks(address)", +"4b9de7a2": "dataIdentifiers(uint256)", +"4b9de81e": "endTimeRound2()", +"4b9e7ecd": "test_1_restrictDoubleVote_shouldThrow()", +"4b9eb771": "CAT_PER_ETH_FIRST_EARLY_BIRD_RATE()", +"4b9ed302": "setEarlyInvestorsBonus(uint256)", +"4b9ee106": "setMetaBetWeight(uint256)", +"4b9eea9b": "decodeKYCFlag(uint128)", +"4b9f5c98": "vote(bool)", +"4b9faf4c": "setTokenBalance(uint256,bool)", +"4ba034dc": "unlockGrowthPoolTokenSupply()", +"4ba0dd3c": "BotFarmer()", +"4ba1f098": "acceptRequest(uint256)", +"4ba20050": "getProduct()", +"4ba2363a": "pot()", +"4ba26466": "TPP2018TOKEN()", +"4ba2ab8a": "RockPaperScissorsAdvanced()", +"4ba2d5ff": "setThreePowerAges(uint256,uint256,uint256,uint256,uint256,uint256)", +"4ba336e5": "calculatePoolCut(uint256)", +"4ba4079a": "enableSwitch(bytes32)", +"4ba4c16b": "guess(uint8)", +"4ba4d784": "getMinutes(uint256)", +"4ba5b7b3": "crowdsaleRefund()", +"4ba6e72e": "advisoryTotalSupply()", +"4ba71f3c": "OxToken(address)", +"4ba79dfe": "removeAddress(address)", +"4ba8fde0": "_computeIncentiveCut(uint256,uint256)", +"4ba90201": "setFinishPreICO(uint256)", +"4ba9bb67": "arr(address,address,uint256)", +"4ba9fb71": "closeAskOrder()", +"4baa39be": "editBet(uint256,uint256,uint256)", +"4baa8160": "triggerAttack(uint32,uint128)", +"4baa9dc7": "addCashback(string,address,uint256[],uint256[])", +"4baaab80": "MyToken(string,string,uint256,uint256,address,address)", +"4bab0236": "wercoin()", +"4bad0881": "P4WDToken()", +"4bad294d": "asFunc(uint256)", +"4bad3327": "_mul(uint256,uint256)", +"4bae2ef1": "referrerBonus()", +"4bae6659": "fixedDeposit(uint256)", +"4baf4a76": "addToWhiteListMultiple(address[],address[])", +"4baf7a30": "TypesToBytes()", +"4bafa2a4": "totalMIT()", +"4bafa437": "setSECOND_STEP_MULTIPLIER(uint16)", +"4baffdc6": "_withdrawHoldVault(uint256)", +"4bb017a1": "destroySalesManager(address)", +"4bb07665": "whitelistUser(address,uint128)", +"4bb13055": "returnAllAvailableFunds()", +"4bb13e63": "setTripleRoomMin(uint256)", +"4bb22b5a": "execReturnValue(uint256)", +"4bb24399": "survive(address,address,uint256)", +"4bb278f3": "finalize()", +"4bb2e417": "SokToken()", +"4bb32e8c": "setDNoEditors(bytes32)", +"4bb37790": "restrictionExpiraton()", +"4bb4b260": "cashAllOut()", +"4bb593b2": "updateUser(address,string,uint256,uint256,uint256,string,bool)", +"4bb6e766": "checkTransferAllowed(address,address)", +"4bb72dea": "setPriceStep4(uint256)", +"4bb77d9d": "updateRates(uint256[])", +"4bb8596e": "managerSet()", +"4bb89c4d": "sendBounty()", +"4bb9962f": "HexelErc20Token(string,string,uint256)", +"4bba32fb": "round3StartTime()", +"4bba38b8": "getRef(address,address)", +"4bba863e": "getEthOfferor(uint256)", +"4bba8a58": "RepostiX(address,address)", +"4bbaa946": "getAllArea()", +"4bbb216c": "_target(address)", +"4bbb58b2": "setVirusInfo(uint256,uint256)", +"4bbbe0cc": "exporter()", +"4bbc142c": "allowOwnership(address)", +"4bbc2a4a": "changebank(address)", +"4bbcc1bc": "payoutSelf(address)", +"4bbcd6e8": "buyPresaleTokens(address)", +"4bbd3061": "DateCreateToken()", +"4bbf2c69": "excludeInvestor(address)", +"4bbf3a7a": "swapToken(uint256)", +"4bc091a3": "getCrowdsaleStartAndEndTimes()", +"4bc18a64": "deleteLock(address,uint8)", +"4bc1aa42": "VESTING_ADVISOR_CLIFF()", +"4bc24ec5": "right61(uint256)", +"4bc2a657": "setVoter(address)", +"4bc32ea2": "getBidCountForAuction(uint256)", +"4bc36600": "reorganizeMembers()", +"4bc3b153": "REWARD_FORWARD_POSITION()", +"4bc3df81": "BuyBooster(uint256)", +"4bc4549c": "todaySold()", +"4bc4d2ba": "KIN_PER_WEI()", +"4bc4e892": "startNextEra(bytes32)", +"4bc53249": "toB32(uint256,bytes,uint256,address)", +"4bc57a7c": "Medis()", +"4bc5d101": "CreatorWithdraw(uint256)", +"4bc70b1e": "withdrawFunds(uint16)", +"4bc8c477": "VirtualRealEstate()", +"4bc935d7": "verifyProof(bytes32[],bytes32,bytes32)", +"4bc9fdc2": "calcMaxWithdraw()", +"4bca4626": "ethWeiRaised()", +"4bca5cc0": "_setAdmin(address,bool)", +"4bca7f95": "NigeriaNairaToken()", +"4bca893d": "Count(uint256,uint256)", +"4bcb776f": "sliceIndexThrow()", +"4bcbcd89": "getEngineerLv1(address)", +"4bcd245d": "gameStatusSet(bool)", +"4bce2e9b": "totalEnjSold()", +"4bce79a1": "getAllSocialAccounts(bytes32)", +"4bcf244b": "ECRecoverWrapperF(bytes32,uint8,bytes32,bytes32)", +"4bcf74b2": "AccountMinterAdded(address,address)", +"4bcf8645": "returnFundsToClient()", +"4bd09c2a": "distributeTokens(address[],uint256[])", +"4bd1c253": "ChipExists(uint32)", +"4bd21127": "setAdminLevel(address,uint8)", +"4bd22521": "Electricity(string,string)", +"4bd22766": "refundETH(address,uint256)", +"4bd3a225": "setMultiplePreSalesSpecialUsers(address[],uint256)", +"4bd3af72": "sellGolds()", +"4bd3b4c6": "allowAuditor(address)", +"4bd4d93a": "transferFromWithMsg(address,address,uint256,string)", +"4bd4ddb9": "testThrow_invalidZeroValue1()", +"4bd4e770": "CheckSign(string,string)", +"4bd50dcf": "sendFromContract(address,uint256)", +"4bd544e8": "isEligibleToPlay(address)", +"4bd54f04": "dynamic()", +"4bd5610d": "jsonCat(string,string,int256)", +"4bd58c92": "LogBuyForFiat(address,uint256)", +"4bd67ced": "get_last_asset_document(bytes32)", +"4bd70ea3": "testFailGetUnset()", +"4bd7730b": "Senpona(uint256,string,uint8,string)", +"4bd79ac1": "lastCalculationRewardTime()", +"4bd889b4": "removePersonalLock(address)", +"4bd8ae6f": "endCoinFlip(bytes32,bytes32,bytes32)", +"4bd9d10e": "backOut()", +"4bd9d76c": "payUnderwriter()", +"4bda2ad0": "addNote(bytes20,string)", +"4bda3f2b": "test_insert_findWithHintPrevUpdateTail()", +"4bda87b5": "GCHToken(string,string,uint8,uint256)", +"4bdb7369": "hasBoughtEgg(address)", +"4bdbb944": "GodviewChain(uint256,string,uint8,string)", +"4bdbea2f": "latestBalanceCheck(address)", +"4bdc44ae": "setNote(uint256,bytes20,string)", +"4bdc4ffe": "ProposalTallied(uint256,uint256,uint256,bool)", +"4bdd6a8e": "KPOPIO_CONTRACT_ADDRESS()", +"4bde38c8": "platform()", +"4bdec44a": "VotingRightsGranted(address,uint256)", +"4bdf1b0e": "receiveApproval(address,uint256)", +"4bdf6667": "IsGenesisAddress(address)", +"4bdf7e8b": "_updateExperience(address)", +"4bdfa061": "postGenesisSales(bytes32,uint256,uint256)", +"4bdfa999": "Given(uint256,address)", +"4bdfbb75": "isCanvasFinished(uint32)", +"4be02f32": "getPlayerWithdrawal(uint256,uint256)", +"4be04fd9": "getMyLastScore()", +"4be185f0": "editionOf(uint256)", +"4be36323": "bonusRoundId_()", +"4be366d5": "purch(address,address,uint256)", +"4be39f2f": "FEED2()", +"4be422ae": "logOut()", +"4be42c08": "updateRewardAmount(bytes32,bytes32,uint256)", +"4be4343d": "InterfaceApp(address,address)", +"4be5739e": "PUBLIC_SALE_LIMIT()", +"4be62668": "MainSaleDistributed()", +"4be6c20a": "Error(uint8,address,address)", +"4be7183a": "init(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"4be7ced7": "withdraw_team_fund(address)", +"4be860eb": "getMinGas()", +"4be9b992": "THRESHOLD3()", +"4be9d332": "jsonCat(string,string,string)", +"4bea4df7": "addLeaderboard(string,uint256)", +"4beb031b": "numBallots()", +"4beb536e": "allWagered()", +"4beb9e32": "approveByAddress(address)", +"4bebbf14": "setother(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"4bebdab7": "uintArrayToString(uint256[])", +"4bec70a8": "setAffirmationsSigned(bytes32,bool)", +"4bec8335": "changeSafeguardStatus()", +"4becfd56": "getCurrentGameInitialMinBetSize()", +"4bed33b8": "SHARE_PURCHASERS()", +"4bed6c23": "donationAmount()", +"4bed81c8": "getWalletUser(uint152)", +"4beda18b": "BILLION()", +"4bee09e1": "changeTicket(address)", +"4bef5e51": "assetRegistrant(bytes32,int256)", +"4bef6de9": "determinePrize(uint256)", +"4bef71ac": "changeColorTeal()", +"4befc326": "temperatureMax()", +"4bf003fa": "After(uint256,bytes32)", +"4bf02421": "calculateAttributeTotals(uint256)", +"4bf0d331": "canDeposit(address)", +"4bf1b68d": "setTokenSupplier(address)", +"4bf1e60a": "newDev(address)", +"4bf2c7c9": "setBurnFee(uint256)", +"4bf2d314": "setAdvisoryPool(address)", +"4bf365df": "mintable()", +"4bf49313": "requestPayment(uint256,uint256,string,address)", +"4bf4e421": "client_address()", +"4bf5ac36": "saleAgent2()", +"4bf69206": "stakeFor(address)", +"4bf79cd9": "OutCloud(address,address)", +"4bf80d39": "giveConsent()", +"4bf899a3": "buyPosition(address,uint256)", +"4bf8e7a2": "getPriceInPastAuction(address,address,uint256)", +"4bf9407f": "changeRecipientAddress(address)", +"4bf96e60": "nextPurchasableBlocknumber()", +"4bfa0d11": "TDEEndDate()", +"4bfa798a": "getWarlordChestAvailable()", +"4bfad14d": "WinnerPicked(uint8,address,uint16)", +"4bfaf2e8": "getPendingVersionTimestamp()", +"4bfbe5df": "eventDate()", +"4bfc4782": "change_a(address)", +"4bfde393": "myWinShare()", +"4bfe2779": "setETHRate(uint256)", +"4bfe642d": "proWallet()", +"4bff1b95": "STARTING_KEBAB()", +"4bff5009": "getUserByName(string)", +"4bff8e51": "_runAdvanceClock(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"4bffc5e4": "allowance(address,uint256,uint256)", +"4c0019c3": "logDisputeCrowdsourcerCompleted(address,address,address)", +"4c007b35": "BigerToken()", +"4c0348ee": "nInvalidatedHashes()", +"4c04f7f2": "addTranslatorContent(address)", +"4c05a636": "Registrar(bytes32,uint256)", +"4c05b40e": "createShortId(bytes32,bytes32)", +"4c05df98": "startEarlyBird()", +"4c062c81": "moveNapkinsTo(uint256,address)", +"4c07fb4f": "editAddressDescription(address,string)", +"4c081138": "assign(uint256)", +"4c097cb4": "trigger(bytes32)", +"4c0999c7": "bytes32ToBytes(bytes32)", +"4c0a6532": "lrcTokenAddress()", +"4c0aac9a": "WithdrawFunds()", +"4c0b1c90": "getMarketer()", +"4c0b2973": "mfrOf(bytes32)", +"4c0bcfe5": "getTransferableBalance(address)", +"4c0bd3ef": "getLLV_edit_16()", +"4c0c0ac2": "rewardsAllocation()", +"4c0ddea8": "decodeTokenImbalanceData(uint256)", +"4c0e207a": "__outputCallback(uint256)", +"4c0e9e6a": "acquisitionsWallet()", +"4c0eceb5": "plusOnePonzi()", +"4c0ee2e1": "unPausePriceRaise()", +"4c0eed51": "addMarketMaker(address,address)", +"4c10d0a5": "addFrostTokensMulti(address[],uint256[],uint256[])", +"4c123019": "tokenFallback(address,address,uint256,bytes)", +"4c125e79": "cancel(uint64)", +"4c12b33f": "burning()", +"4c12d8b9": "recipientETH(address)", +"4c12f8bb": "creditCEO()", +"4c13017e": "Transfer(bytes32,address,uint256)", +"4c1334a8": "GoodTo(uint256,string,string)", +"4c1344b7": "isGuilty(address)", +"4c136ea8": "totalEDUSAllocated()", +"4c13fbb2": "ImageToken()", +"4c146f38": "getFrontEndTokenBalanceOf(address)", +"4c14743b": "UnlockedBalanceOf(address)", +"4c148efb": "CollectPayment(address,address,uint256)", +"4c14f334": "getCouponBonus(string)", +"4c15469c": "tresholds()", +"4c1674e5": "descOf(uint256)", +"4c167a6e": "approvePreSigned(bytes,address,uint256,uint256)", +"4c1736a0": "subFrozen(address,uint256,uint256,bool)", +"4c174ef0": "isWitness(address,address)", +"4c176b21": "WALLET_SALE()", +"4c17b322": "performRead2()", +"4c182a95": "doDeveloperGrant()", +"4c18e57e": "PositiveWhuffiesSent(address,address,uint256,string)", +"4c18e960": "allowRecurringBilling(uint256,uint256,uint256,uint256)", +"4c19a199": "openGameResult(uint256,uint256,uint256,string)", +"4c19dd1c": "VicDemToken()", +"4c1b2446": "transmitInteger(address,bytes,bytes,uint256,uint16)", +"4c1b64cb": "deleteAccount(address)", +"4c1b8ffd": "voteCost()", +"4c1bbef8": "claimerKey()", +"4c1ccadf": "SmartexInvoice(address,address)", +"4c1d1fde": "withdrawTokens(address,uint256,uint256)", +"4c1d79ee": "setSalePeriod(string)", +"4c1d9d48": "tokenIndexById(uint256)", +"4c1e4169": "BIZDEV_WALLET()", +"4c1f20ec": "CEO_TEAM()", +"4c1f524f": "convertToMiniTtc(uint256)", +"4c1f7635": "getAccountRest(address)", +"4c1f85ae": "updateHydroMap(address,uint256,uint256)", +"4c1fbde8": "getPlayerColor(uint256,address)", +"4c20179e": "devAllocation()", +"4c2067c7": "expired()", +"4c207ac8": "setTraps(uint256,uint16,bytes)", +"4c21eb07": "put(string)", +"4c21fa45": "getNoteByIndex(uint256)", +"4c2233a5": "withdrawAll(uint256,address)", +"4c228656": "advisorsAllocationTokenSend(address,uint256)", +"4c22a8d1": "kvcAdd(uint256,uint256)", +"4c22b792": "calc_wei_rewards(uint256,uint256,uint256)", +"4c22c119": "isUser()", +"4c2324bb": "toBytes(uint256[])", +"4c23ba50": "removePeer(address)", +"4c24d4dd": "isPoliceNode()", +"4c25162a": "Babatoken()", +"4c2516de": "swapToken(uint256,address)", +"4c25727b": "viewPollData(uint8)", +"4c258eb1": "getQtyFilledOrCancelledFromOrder(bytes32)", +"4c25deb5": "USER_GROWTH_TOKENS_RESERVED()", +"4c26064b": "MVGcoin(uint256,string,string)", +"4c266e11": "setExchangeGroup(address,uint256)", +"4c26aaa2": "TokenExchange()", +"4c26b6eb": "total_buy()", +"4c281603": "getPlayerMax(uint256)", +"4c28a043": "adminGetFeeDial()", +"4c294188": "customer_tickets(address,uint256)", +"4c2a664b": "purchaseNotes(uint256)", +"4c2a799f": "checkFileProof(bytes32,bytes32[10],uint256[4],bytes32[],uint256)", +"4c2bc9a9": "assertEq26(bytes26,bytes26)", +"4c2bd226": "getDescriptionHash(address)", +"4c2d0378": "getAllTransactionIds()", +"4c2d71b3": "setConfigAddress(bytes32,address)", +"4c2d8649": "transferComplete(address,uint256,bytes)", +"4c2db6d8": "buyCoin(uint16)", +"4c2f04a4": "AddMessage(address,uint256,string)", +"4c2fac53": "requireFunction()", +"4c2fc8b2": "acceptProposedMilestones(bytes32)", +"4c2fe456": "right94(uint256)", +"4c2ff0ae": "getLLV_edit_31()", +"4c3052de": "submissionGasPriceLimit()", +"4c316f70": "mineCoins(uint256)", +"4c31a0ca": "mintFoundersRewards(address,int256)", +"4c31df50": "nextroundsolsforhire()", +"4c3221e1": "complexityForBtcAddressPrefix(bytes)", +"4c32a444": "_onCanvasCreated(uint256)", +"4c330471": "getReferralBalance()", +"4c33fe94": "cancel(address)", +"4c34c8de": "USDCToken()", +"4c34d7e9": "UNITED_NATIONS_FUND()", +"4c352323": "getNewVoting(uint256,bytes32[],address[],uint256[])", +"4c364ceb": "createAccessory(uint8)", +"4c36c36e": "resolveBet(uint256)", +"4c36cf16": "addRoundPrice(uint256,uint256,uint256,address[])", +"4c37077f": "chargeBuyer(uint256,address,uint256,uint256)", +"4c381350": "meteredPrice(uint256)", +"4c382d99": "terminateEmployee(address,uint32,uint8)", +"4c38661d": "lastPing(address)", +"4c387d82": "NSCToken()", +"4c38c366": "reLoadXaddr(uint256)", +"4c3997d4": "cancelBuyAuction(uint256,address)", +"4c3a00cb": "totalTradeRecords()", +"4c3a1a1a": "returnUserGrowthPoolTokens(address,uint256)", +"4c3a6ae0": "isMultiSigWallet()", +"4c3a9675": "ManagerProxyTargetMockV2(address)", +"4c3acb86": "debug(string,string)", +"4c3b67b4": "withdraw_for(address)", +"4c3ba268": "getBySemanticVersion(uint16[3])", +"4c3bf0b5": "changeInitialCost(uint256)", +"4c3d1f00": "EthDailyLimitChange(uint256)", +"4c3dff01": "InitialBasicBalance()", +"4c3ec50b": "FarziToken()", +"4c3eea9e": "generalLog(uint256)", +"4c3ef6dc": "minimumTokenThreshold()", +"4c3f333f": "Kalypso()", +"4c3f8ec0": "Tier_Wildcat_Registration()", +"4c409b80": "ChangeWallet(address,address)", +"4c413139": "minutesToPost()", +"4c418879": "getMyDino()", +"4c41a6c7": "blockThreshold()", +"4c41bf9d": "getOnBurnTargetValue()", +"4c4316c7": "donate(uint64,uint64,address,uint256)", +"4c433843": "parityOwner()", +"4c439436": "getTicketsAtAdress(address,address)", +"4c44d53f": "test_fourInvalidEqBytes32Message()", +"4c45c7ec": "setPhase(uint8,uint256,uint256,uint256,uint256,uint256)", +"4c466d37": "signer(bytes)", +"4c46e52c": "trancheOneBalanceOf(address)", +"4c46fb73": "stageCaps(uint256)", +"4c471cde": "scheduleCall(address,bytes4,bytes,uint256,uint256,uint8,uint256)", +"4c4766e8": "KittenRegistry()", +"4c478b62": "ERC827TokenMock(address,uint256)", +"4c47e9ee": "setLockedConfig(address[],uint256[],uint256[])", +"4c480c2a": "ownerCandidat()", +"4c4870c6": "checkGoal()", +"4c488dac": "getChannelValidUntil(bytes)", +"4c49515d": "presaleTokensIssued()", +"4c4a386f": "refundEnabled()", +"4c4a4c67": "assertEq2(bytes2,bytes2)", +"4c4a9761": "tokenRate4()", +"4c4aea87": "getReleaseData(bytes32)", +"4c4bf936": "landData(int256,int256)", +"4c4c23dd": "upgradeGreatCoin(address)", +"4c4c447e": "cancelBattle(uint256)", +"4c4cb69e": "INVEST_AMOUNT()", +"4c4cea5a": "completeAt()", +"4c4cfc3b": "tokensForEcosystem()", +"4c4d07e7": "isBouncer(address)", +"4c4d460e": "LogCampaignCreated(address)", +"4c4dc6e0": "docCount()", +"4c4deecb": "__callback(uint256,string)", +"4c4e03f2": "_getExtraParam(bytes)", +"4c4e829c": "TransactionRevoked(uint256)", +"4c4efef7": "totalCLNcustodian()", +"4c4f1386": "WartecToken()", +"4c4fa89a": "getChildBranch(bytes32)", +"4c50ea27": "RHOC(uint256,address)", +"4c515fb5": "TEAM_VESTING_CLIFF()", +"4c51b021": "substract_individual_shares(uint256)", +"4c524be4": "selectWinner(uint256)", +"4c53adb0": "blackFridayEndBlock()", +"4c54cc1d": "managerETHaddress()", +"4c56e992": "refillContract()", +"4c574afe": "unblockSecondStake()", +"4c575fcc": "numberOfRawEarlyPurchases()", +"4c57fc28": "setTokenMintFeeReceiver(address,address,address,address)", +"4c5802c1": "getPhaseAddress()", +"4c585ce4": "approveMultipleUsers(address[])", +"4c5879cf": "WidinShares()", +"4c58994c": "TrypCrowdsale()", +"4c594c1e": "limitDateCrowdWave3()", +"4c59b47c": "EthereumLottery(address,address)", +"4c59f021": "CakCrowdsale(uint256,uint256,uint256,address)", +"4c5a2044": "licenseCostDenominator()", +"4c5a628c": "renounceWhitelistAdmin()", +"4c5a82cb": "reportTemperature(int8[],uint32[])", +"4c5a94fe": "_removeToken(address,uint256)", +"4c5b632a": "addcoin(string,string)", +"4c5be574": "getOdds()", +"4c5cbe9a": "getBalancesForTeam(address)", +"4c5d6d93": "totalCrowdSale()", +"4c5df57a": "createLoan(address,address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,string)", +"4c5df737": "addCar(string,string,string,uint16,string,address)", +"4c5f338b": "CheckStudentofCourse(uint256)", +"4c5f97b6": "PayThrone()", +"4c610ba4": "totalRewardThisYear()", +"4c611268": "balanceOfUnclaimedCookie(address)", +"4c6226fc": "oraclizeFee()", +"4c62a644": "withdrawComission()", +"4c64384c": "maxPrivateSale()", +"4c64cf92": "mint_time_locked_token(address,uint256)", +"4c65b2b3": "ethOwner()", +"4c65c62e": "AgentContracteGalaxy(address,address,address,uint256,uint256)", +"4c661a2c": "DaoOwnershipTransferred(address,address)", +"4c66326d": "deregisterCallback(address)", +"4c6686d8": "CONFIG_FEES()", +"4c66bcc1": "WorldWideLoveToken()", +"4c67567a": "firstLockAmount()", +"4c676725": "fundTeamCompany()", +"4c68df67": "totalReserve()", +"4c69c00f": "setOracleAddress(address)", +"4c69ec93": "changeReceiver(address,address)", +"4c6a3334": "buyEthLootbox(address)", +"4c6adb31": "firstReporterCompensationCheck(address)", +"4c6b25b1": "results(bytes32)", +"4c6b6cad": "newProposal(string,bytes)", +"4c6c27a1": "judgeCustom(bytes32,bytes32,bytes32,uint256,bytes32,uint256[4],bytes32[10],uint256[4],bytes32[])", +"4c6c6a5c": "upgradeFrom(address,address,uint256)", +"4c6c8bc3": "distribute(address[],uint256[],bytes32[])", +"4c6d1d9e": "checkOutTag(string)", +"4c6d350b": "approveShutdown(uint256)", +"4c6d8aac": "hasParameters()", +"4c6e4453": "EcoLend()", +"4c6e5926": "send_to_side_chain(uint256,address,uint256)", +"4c6ebbbe": "maxIcoTokenLimit()", +"4c6fc20f": "setDisbursingAddr(address)", +"4c703ccd": "FirstERC20TestToken()", +"4c70b6b2": "deList(address)", +"4c714ed4": "DescriptionChanged(string,string)", +"4c7241f8": "Potentl()", +"4c738909": "getMyBalance()", +"4c73eef6": "card_black_minamount()", +"4c743c45": "FCTOKEN()", +"4c750bca": "bountyFunds(address,uint256)", +"4c75dc8f": "EFOcallBack(string)", +"4c75fbca": "getThirdAddressBalance()", +"4c76318e": "award(bytes32)", +"4c77a28d": "AppleCoin()", +"4c77c0e2": "period2Numerator()", +"4c77e5ba": "getAddressValue(bytes32)", +"4c780596": "UpgradeSpace(uint8,uint16)", +"4c783bf5": "isControllable()", +"4c78529e": "setOfficialUrl(string)", +"4c78b276": "getShare(address,uint256)", +"4c7940c5": "getWithFrozenStockBalance(address,address,uint256)", +"4c79afe0": "EventBuyShip(address,uint32,uint32)", +"4c7a0271": "buyMiner(uint256[8])", +"4c7a2254": "checkMyWithdraw()", +"4c7a5c0f": "ArtifactCoin(address)", +"4c7ab28d": "setMaxToSell(uint256)", +"4c7ae3ac": "getNameFromKoikeToken()", +"4c7b18fd": "ratioUpdateTime()", +"4c7b8fba": "contributionHashes(uint256)", +"4c7c3ca1": "KryptopyCrowdsaleMock(uint256,uint256,uint256,uint256,uint256,address)", +"4c7c71fe": "startTimes()", +"4c7ce18a": "withdrawReturns()", +"4c7cfd9b": "MarketboardListingPriceChanged(uint256,uint256)", +"4c7d3e3f": "icoIsClosed()", +"4c7d7d3f": "standardToken()", +"4c7e6bab": "tokensPerCentsDayOne()", +"4c7f0bdd": "isBackend(address)", +"4c7f74df": "EtherDelta(address,address,address,uint256,uint256,uint256)", +"4c7fa728": "getPlayerLeftDividend(address)", +"4c803feb": "fib1(uint256)", +"4c808da8": "StageUpdated(string,string)", +"4c80b03b": "minTransAmount()", +"4c80c937": "getEpochData(uint256,uint256)", +"4c80f5c1": "minimumAmountToParticipate()", +"4c813d6d": "sendItDv(string)", +"4c81a1db": "addressPayableFunc(address,address)", +"4c81c4d7": "startStage2Time()", +"4c81e13a": "incentiveDistributionRoundDenominator()", +"4c81e48b": "testToUint()", +"4c8316a6": "showTokensStaked()", +"4c833532": "resumeTransfer()", +"4c839beb": "getContributionTokens(address)", +"4c840214": "getBackToken(address,address,uint256)", +"4c841e5d": "_setBlacklistedUser(address)", +"4c85a8f3": "isAllowedToMint(address,address)", +"4c85b425": "buyShares(address)", +"4c85d2e6": "addImmigrationOfCountry(address,uint256)", +"4c86c2e5": "setPortUpdate(uint16)", +"4c86e97b": "bonusTokensLeft()", +"4c873c48": "tokenSetup(address,address,address)", +"4c87effd": "delete(bytes32)", +"4c88bc26": "YEAR_TWO_SUPPLY()", +"4c899118": "getProposalFromID(bytes32,uint256)", +"4c89c4c7": "getHash(bytes10,uint8)", +"4c8b16f4": "setTimeStep(uint256)", +"4c8b8ca7": "distroyBuyerToken(uint256)", +"4c8bae93": "_isTradeable(uint256)", +"4c8c121e": "getGameHash(address,uint256)", +"4c8cab79": "largestStake()", +"4c8cc20b": "toContentID(address,string,string,address,uint256)", +"4c8d1e42": "DockCrowdsale(uint256,address,address)", +"4c8f3562": "computeCooldownSeconds(uint16,uint16)", +"4c8f4810": "buyMCT(address,uint256)", +"4c8fe526": "next()", +"4c8fea7d": "_convertSgnToSga(uint256)", +"4c90aaeb": "randomize(bytes32)", +"4c9151e6": "TransferStarted(address,address,uint256[],uint256)", +"4c922a9f": "changeColorPurple()", +"4c9297fa": "scheduleStart(uint256)", +"4c93505f": "setRevoke(bool)", +"4c9362aa": "addActiveUserListArr(address)", +"4c93c1a6": "GetUpTickPrice(uint256)", +"4c9478ce": "_yearThreeClaimed()", +"4c947c86": "getInitInputDataBytes(address,address,address,address)", +"4c94ac6a": "clearMilestones()", +"4c9599f2": "validityDate()", +"4c95baf3": "compoundingFreq()", +"4c95ca9c": "setRatePreICO(uint256)", +"4c95cb98": "OracleBase()", +"4c966822": "winnerWithdrawal()", +"4c96a389": "deploy(address)", +"4c96f0cc": "transferAllTokens()", +"4c96f281": "getAllPublishers()", +"4c97057a": "LogWinner(string)", +"4c970b2f": "foo(int256)", +"4c977972": "Soft_Cap()", +"4c97c836": "upgradeConstitution(uint256)", +"4c982872": "ElextroCoin()", +"4c985dfb": "newTokens(address,uint256)", +"4c98aec9": "CASHX()", +"4c990cc7": "startAirdrop(address[],uint256[])", +"4c9b30b4": "allow(bytes8)", +"4c9b60dc": "changeUserEthAddress(address,address)", +"4c9b760d": "changeMaxContribution(address,uint256)", +"4c9e2779": "balancesLocked2Y()", +"4c9e502e": "totalLoanAmount()", +"4c9ed763": "requestTokensBack()", +"4c9f166d": "bettingAllowed()", +"4c9f2bfc": "SOBU()", +"4c9f45eb": "repossessionBountyPerHundred()", +"4c9f66c7": "feePot()", +"4ca0a305": "GlobalIdolCoinToken()", +"4ca14270": "AddressChanged(string,address,address)", +"4ca15352": "airDropCount_()", +"4ca168cf": "register(bytes,uint256,address,string,uint256)", +"4ca18ebd": "reject(uint256,string,uint256)", +"4ca1c417": "isValidNameLength(string)", +"4ca1fad8": "addRequest(uint256)", +"4ca3a111": "getWeiPriceMicroKeys()", +"4ca3e9b8": "getProjectAddress(uint256)", +"4ca40518": "ReBornEnergyCoin(uint256,string,uint8,string)", +"4ca43f41": "transferAny(address[],uint256)", +"4ca50f59": "sellsTokens()", +"4ca5558c": "AllCaptcha()", +"4ca63a84": "TimeLimitedStoppable()", +"4ca64b3a": "bulkTransfer(address[],uint256)", +"4ca6ba2f": "AporooToken(uint256,string,uint8,string)", +"4ca6d7e6": "tier2Time()", +"4ca6fcfc": "registerVIP(address,address,uint256)", +"4ca7fbd0": "updateTokenPriceWeekTwo()", +"4ca82b52": "finalLoos()", +"4ca8b0d0": "registerExistingThrone(bytes,address,uint256,uint256)", +"4ca8c1e8": "isInMaintainance()", +"4ca92e08": "deductExtraBalance(address,uint256)", +"4ca98997": "getAmount(uint256,uint256)", +"4ca9b258": "contributorRefund()", +"4caa1a09": "_calculatePaymentToOwner(uint256)", +"4caa7f37": "withdrawSnowflakeBalanceFromVia(string,address,string,uint256,bytes,bytes)", +"4caaf45f": "changeSigningAddress(address)", +"4cad12e0": "orders_sell_price(address)", +"4cad3438": "setRateFinalStage1(uint256)", +"4cad42d3": "testWager()", +"4cae5f99": "loanRepaymentNotification(uint256)", +"4caeebd0": "STAGE_FOUR_TIME_END()", +"4caf6231": "COLOR_WHITE()", +"4cb0c7a1": "getOrdersOfVendor(address,uint256,uint256,bool)", +"4cb10ed3": "hasStartTimePassed(bytes32)", +"4cb44f8d": "getConfigEntryAddr(bytes32)", +"4cb532db": "socWarefareAddr()", +"4cb5465f": "transferWithLock(address,bytes32,uint256,uint256)", +"4cb5a45d": "GSUMedal()", +"4cb5ef77": "closeVoteRevealPhaseIfAllowed(address,bytes32,bytes32)", +"4cb5f1c6": "totalsum()", +"4cb6bf73": "FZTToken(address)", +"4cb6d6af": "finalizeCrowdsale(address)", +"4cb6f4a5": "voteRequest(uint256)", +"4cb71b9b": "getAllReleaseHashes()", +"4cb79536": "presaleStartBlock()", +"4cb7da65": "abortMatch(uint256)", +"4cb7dd6f": "popLeader(address)", +"4cb84b9a": "getIcoCap()", +"4cb85312": "_addInvestor(address)", +"4cb85356": "BranchSender(uint256,bytes32)", +"4cb88ad8": "ABEToken()", +"4cb93ff8": "capTokenAmount()", +"4cba4ca4": "updateGene(uint256,bytes)", +"4cba5c6a": "setResults(uint256[4])", +"4cba67ce": "addAddressToAccountForUser(address,bytes,bytes,address,bytes32)", +"4cbabcdc": "invest(bool)", +"4cbac3d2": "calculatePurchasedTokens(uint256,uint256)", +"4cbb4a0a": "_removeTokenFromAllTokensEnumeration(uint256)", +"4cbb7532": "setBorrowAgreement(uint256,uint256,string,string)", +"4cbbb987": "DOSXToken()", +"4cbc07f2": "weisPerBigToken()", +"4cbc49ad": "claimRewardManually(address)", +"4cbc82cd": "getTrackByArtist(address,uint256)", +"4cbd2b74": "allowanceByLegacy(address,address)", +"4cbd7a26": "withdraw(address[],uint256[],bytes,bytes,bytes32)", +"4cbe02a5": "createAuthorDrawings(bytes32,bytes32,address,string)", +"4cbe552c": "myEntityStructs(uint256)", +"4cbee813": "logout(string)", +"4cbf3d4c": "getNumbersOfPick(uint256,uint8)", +"4cbf6ba4": "hasDNSRecords(bytes32,bytes32)", +"4cbf867d": "intervalSecs()", +"4cbfafd9": "DefaultReleaseDelayed()", +"4cbfbf47": "REAPER_INTREPID_MAX_CARGO()", +"4cc05a71": "withdrawCount()", +"4cc09eac": "tokenRatePre()", +"4cc0a885": "maxRevealSeconds()", +"4cc0ee3c": "modifyDescription(address,string)", +"4cc22528": "setRateForOrder(bytes32,uint256)", +"4cc22f9d": "getSaleEnd()", +"4cc2a4bb": "_preValidateTransfer(address,address,uint256)", +"4cc2b5d0": "addPolicy(bytes32,uint256,uint256,uint256,string)", +"4cc2c0fe": "getTotalFor(uint256,uint256)", +"4cc3a6b0": "ConvertQuote(uint256)", +"4cc45f50": "changeAddressQueen(address)", +"4cc47910": "oraclizeQueryIdsToBetIndices(bytes32)", +"4cc53838": "getSaleContractTargetEtherMin(address)", +"4cc60757": "getOperator(address,address)", +"4cc6083a": "totalTrading()", +"4cc62409": "EOSOwned()", +"4cc653c8": "calculateDividends_(uint256)", +"4cc682ee": "getPubKeyHash(bytes20,uint8)", +"4cc747c8": "unlistAllOpenProposals()", +"4cc78983": "setPreviousDungeoonId(uint32)", +"4cc7a88d": "sendLoveToken(uint64,string,string,string)", +"4cc82215": "remove(uint256)", +"4cc87328": "adminWithdrawMiscTokens(address,uint256)", +"4cc885d4": "right65(uint256)", +"4cc9f4e1": "lockTokenController()", +"4ccb5a33": "canClosePot(string)", +"4ccb908f": "auctionSuccessBonus()", +"4ccbd06b": "MIN_DEPARTURE_LIM()", +"4ccbe888": "getLongExtra()", +"4ccbf17b": "presaleAddressAmountHolder()", +"4ccc4c36": "getPendingOracleFor(address)", +"4ccc5da0": "sold(bytes32)", +"4cccb7ba": "unrestrictedWithdraw(uint128,address,uint256,uint128)", +"4ccd0e1e": "Flippitt(string,string,uint8,uint256,string)", +"4cce4d63": "addNewCompany(string,uint256,uint256,uint256,uint256)", +"4ccee9b6": "getAddr(bytes32)", +"4cceeccd": "setFee(uint32,address)", +"4ccef7e0": "averageSoldPrice()", +"4ccf05cd": "CompanyTokenPushed(address,uint256)", +"4ccf8a35": "TokenSupplied(address,uint256,uint256)", +"4cd06a5f": "iterateNext(uint256)", +"4cd08d03": "register(string,string,string)", +"4cd11943": "NewManualInvestor(address,uint256)", +"4cd18a83": "gimmeEtherr()", +"4cd217b7": "getPreEntranceTo()", +"4cd273d1": "tilePrice()", +"4cd280bc": "popClient()", +"4cd28aa6": "_queue(address,address)", +"4cd2b343": "RedBlueToken()", +"4cd36fb7": "Mine(address,uint256,uint256)", +"4cd3745d": "getRandomClassId(uint256)", +"4cd412d5": "transferEnabled()", +"4cd44519": "stageTokensBought(uint8)", +"4cd52207": "_claim(address,uint256,bool)", +"4cd5af91": "CrowdFundClosed(uint256)", +"4cd5d776": "FundingWithdrawn(address,uint256)", +"4cd6bd32": "withdraw(address,uint256,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"4cd7699a": "eventCardRangeMax()", +"4cd85837": "mintICOTokens(address,uint256,uint256)", +"4cd88b76": "initialize(string,string)", +"4cd995da": "registerCompany(address,string)", +"4cd9c3e4": "crowdsaleEndsAt()", +"4cdabb16": "MAX_PREMIUM()", +"4cdb48e4": "isValidNym(address)", +"4cdc6a73": "Marriage()", +"4cdc9549": "_isApprovedOrOwner(address,uint256)", +"4cdc9c63": "genesisBlock()", +"4cdcb334": "transferrers(address)", +"4cdd3002": "setNote(uint256,bytes32,bytes20,string,string)", +"4cdd3b43": "getScoreForName(string)", +"4cddae28": "recharge()", +"4cdfc605": "Refund_user()", +"4ce0032f": "TutorialToken(address)", +"4ce01d86": "totalBetValue()", +"4ce02a33": "overdraftCliff()", +"4ce053ab": "approveAndPayout(uint16)", +"4ce0ef95": "getStatus(address,uint256)", +"4ce11c52": "children(bytes32)", +"4ce149d7": "setCandyLandSale(address)", +"4ce14f8c": "FOMOCoin()", +"4ce18d6b": "getAmount(bytes)", +"4ce18ec3": "addInterval(uint256,uint256,uint256,bytes32)", +"4ce197f3": "GetTempStuffExpire(address,uint32)", +"4ce1e317": "TeamAndAdvisorsAllocation(address,uint256)", +"4ce309f8": "getElection(address,address,uint256)", +"4ce37426": "EtherOlympics()", +"4ce4f927": "getJackpot(uint256)", +"4ce51b92": "WithdrawSpecialEth(address,uint256)", +"4ce56c5d": "ethAvailable()", +"4ce61604": "InitializedTier(uint256,address)", +"4ce63074": "test_increaseBlockBy5000()", +"4ce6962c": "numPurchasers()", +"4ce6a521": "emitAdditionalTokens()", +"4ce6a74e": "testerNonReentrant()", +"4ce7033d": "LogWithdraw(address,uint256)", +"4ce71fac": "getRegionPurchasePixelPrice(uint256)", +"4ce75274": "setEnableSell(bool)", +"4ce99591": "Vegan()", +"4cea7af0": "MembershipChanged(address)", +"4ceab75e": "newIdTank()", +"4ceab858": "multiplex_add(address)", +"4ceaeb35": "PleasePayMe(uint256,uint256)", +"4ceb0173": "to(bytes32,bool)", +"4ceba015": "LogCollect(uint256)", +"4cec73b1": "checkClaimTokenByAddress(address)", +"4cecac6d": "requestReward()", +"4ced0a26": "SetData(string,string)", +"4ced4734": "isPreSale()", +"4cedf74e": "get_party1()", +"4cedfc02": "TornadoChain()", +"4cedfc0c": "activateWhitelist(bool)", +"4cee81cb": "Marriage(address,address,string,string)", +"4cef0cb9": "usdPerEthMax()", +"4cef0ff6": "approveMore(address,uint256)", +"4cef2221": "ZazToken()", +"4cef5a5c": "negligibleRateDiff()", +"4cf00716": "getCreateFeeTokenFeeWindowValue()", +"4cf045d5": "addSoftwareExecRecord(bytes32,bytes32,uint256,uint256)", +"4cf088d9": "staking()", +"4cf0afca": "changeWallet(address,uint8)", +"4cf1115d": "ethFee()", +"4cf125de": "Ledger()", +"4cf127bf": "modelSupply()", +"4cf178c6": "POWEROFTHREE()", +"4cf2010e": "addCar(uint256)", +"4cf21f5f": "CFNDToken()", +"4cf2c2a2": "Dexter()", +"4cf2e2dc": "GameStart()", +"4cf32de3": "getNumTransactions()", +"4cf33010": "purchaseShare(uint256)", +"4cf373e6": "addFortune(string)", +"4cf37429": "AMOCoinSale(address,address)", +"4cf43440": "Megaloh()", +"4cf439d8": "_addToPools(address)", +"4cf4a292": "getHouseEdge()", +"4cf50009": "genesisCreation()", +"4cf52fa2": "buyBulkPremiumCar(address,uint256[],address)", +"4cf5b6c7": "millWeiRate()", +"4cf61aba": "_canTransfer(bytes32,address,address,address,uint256,bytes,bytes)", +"4cf6475d": "getPlayerShipCount(address)", +"4cf76cca": "thirdDiscountPrice()", +"4cf78170": "allowedAddress()", +"4cf812ea": "rateRoundSeed()", +"4cf8b0f5": "BlipToken(string,string)", +"4cf8dce7": "balanceOfOre(address)", +"4cf91026": "isAirdropping()", +"4cf93599": "getPaidInfo(string)", +"4cf95c21": "shareholderIsToken()", +"4cf96509": "safeWithdrawalAll()", +"4cfb4c28": "roundProfit(address,uint256)", +"4cfc4d30": "VESTING_DURATION()", +"4cfd5a82": "phaseOneLimit()", +"4cfddcfb": "getMarketOrderCategory(uint256)", +"4cfe3e7f": "debitAccount(address,uint256)", +"4cfe4c69": "getProviderRateHistory(uint256,uint256,uint8)", +"4cfe50cb": "BAFCToken()", +"4cfe59a7": "simulateWithdrawalAmount(address,address)", +"4cfe62c7": "transferRole(string,address)", +"4cfea68a": "blocksPerDay()", +"4cfef220": "getSpankPoints(address,uint256)", +"4cff5d75": "setTokenAllocator(address)", +"4cff6ae5": "AltToken(address)", +"4cff7a82": "createDefaultGames()", +"4d003070": "timestamp(bytes32)", +"4d015fcc": "Pong()", +"4d0217b7": "firstSaleComplete()", +"4d023404": "removeIntermediary(address)", +"4d02438b": "getMaximumBetHome()", +"4d02a8fb": "judgeFakeToken(uint256)", +"4d047055": "monsterIdToNickname(uint256)", +"4d053af6": "removeAds(address)", +"4d056f6d": "coolDown()", +"4d057803": "TEAM_LOCK_TIME()", +"4d05a822": "JusticeTokenV2()", +"4d06068a": "airdropToken()", +"4d0633f6": "assignedAmountToCornerstoneInvestment()", +"4d07b23d": "buyPrice(uint8)", +"4d08e0b4": "mediaTokensName(address)", +"4d0a32db": "minAmount(address)", +"4d0a391c": "addPayment(uint256,uint256)", +"4d0a5dbd": "addPermission(address)", +"4d0ad141": "CAP_USD()", +"4d0b2a29": "NUM_TILES()", +"4d0c381a": "Token99(uint256,address)", +"4d0c5be4": "redemptionLocked(address)", +"4d0c69d9": "EnterSwap(uint256,uint256,bool,address)", +"4d0cac9d": "sendCancelValue(address,uint256,bool)", +"4d0d1cb9": "processTransfer(address,address,uint256,bytes)", +"4d0d35ff": "getPlayerAddr(uint256)", +"4d0d80a2": "_getRandom(uint32)", +"4d0de225": "getWorkerBalance(address)", +"4d0e8a5f": "MYEX()", +"4d126774": "validateWhitelisted(address)", +"4d1271e3": "VersionedToken(address)", +"4d129486": "max_shares_to_sell()", +"4d129fb5": "startPre()", +"4d12b695": "unbanUser(address)", +"4d12fca4": "exchanger()", +"4d130369": "interestPaid(address)", +"4d130e64": "_collectFee(address,address,uint256)", +"4d134f2f": "createAddresses(bytes32[],address[])", +"4d13507d": "releaseFund(address)", +"4d1387b4": "changeRatio(uint256,uint256)", +"4d13a583": "PrepaidTokensClaimedEvent(address,uint256,uint256,uint256)", +"4d13c565": "bVideoCost()", +"4d13d134": "publicAllocatingToken()", +"4d140467": "EARLY_CONTRIBUTOR_VESTING_CLIFF()", +"4d14c57e": "claimBasicResources()", +"4d14e344": "numberOfChoices()", +"4d15642a": "startMEAMission(uint256,uint256,uint8,uint256)", +"4d15d797": "_exists(int256,int256)", +"4d1636c3": "onSold(address,uint256,uint256)", +"4d16dd41": "communityUnvested()", +"4d17ed11": "LUVIToken()", +"4d17f7fc": "sta()", +"4d182bfc": "getEpisodeDataRandom(uint256,uint256,uint256)", +"4d1975b4": "gameCount()", +"4d199766": "WEI_CAP()", +"4d19cdf8": "DME()", +"4d1a08cd": "MIN_LIMIT()", +"4d1a9763": "T8CToken(address)", +"4d1b93b3": "allowedTransferWallet()", +"4d1bc2df": "expertThreshold()", +"4d1bd1fa": "product2_luckybuyTracker()", +"4d1bfe99": "BenefitGameToken()", +"4d1c43b2": "ETHUSDPRICE()", +"4d1c5f83": "EditMode()", +"4d1ed74b": "maxGuaranteedLimit()", +"4d1f8c31": "owner(uint64)", +"4d1f97ba": "LastResult(address,uint8,uint256)", +"4d1ff181": "setPaymentEnabled(bool)", +"4d207d9a": "identify(address)", +"4d20b992": "setLargeCapWhitelistParticipants(address[],uint256[])", +"4d20d4bc": "BET_TYPEHASH()", +"4d21a24c": "generateLockId()", +"4d22b9c8": "DMSContract()", +"4d22d1d1": "vestTime()", +"4d2301cc": "getEthBalance(address)", +"4d238c8e": "addValidator(address)", +"4d23aaa8": "foreignBuy(address,uint256,uint256)", +"4d242bbc": "adjustTotalSupplyCheckpoints()", +"4d253629": "updateChangeAttemptCount(address)", +"4d25cc91": "transfer_token(address,uint256)", +"4d268ddd": "payImporterBankForGoodsBought()", +"4d269617": "XENIACOIN()", +"4d27a548": "rICO(address,address)", +"4d28ca02": "addMultipleContracts(bytes32,bytes32,bytes32,bytes32,address[],bytes32)", +"4d298265": "isWhitelistedPresale(address)", +"4d2a16e6": "myTradeValue()", +"4d2a30c1": "customerDepositedEther()", +"4d2a99a5": "GVOptionProgram(address,address,address)", +"4d2b1444": "WAITING_TIME()", +"4d2c29a0": "tokenOfferingAddr()", +"4d2d0a3d": "token_totalSupply()", +"4d2d35bc": "TokenPartners(address,address,uint256)", +"4d2d3dfc": "_generateHash(bytes32,uint256,address,uint256)", +"4d2db81f": "alreadySold()", +"4d2e9d04": "ShowDepositInfo(address)", +"4d2ee8e7": "GetLoanInfo(uint256,bool)", +"4d2efe4e": "collectOwedDividends()", +"4d305073": "uintRound(uint256,uint256)", +"4d307e3f": "getCurrentReward(address)", +"4d30b6be": "balanceOf(address,bytes32)", +"4d314b5a": "ERC20MIST(uint256,string,string)", +"4d318b0e": "tallyVotes(uint256)", +"4d32a117": "documentsIds(uint256)", +"4d32ef8c": "hurifymint(address,uint256,uint256)", +"4d3314f4": "TotalFee()", +"4d33e6d7": "hasDisputeSolved(uint256)", +"4d341bbc": "findSubscriberIndex(address)", +"4d3465fd": "weicap()", +"4d34dce1": "AHS(uint256,bytes32,bytes32)", +"4d358a00": "PreSale(address,address)", +"4d366398": "runPeerBalance()", +"4d36dd87": "finalizeTransferChild(uint256)", +"4d37ec46": "__generateOrderHashes__(address[4],uint256[8])", +"4d380a0d": "revealBid(uint256,uint256,bytes32)", +"4d3820eb": "registerUser()", +"4d3830e5": "releaseFunds(uint16,address,address)", +"4d387d35": "lockAccount(address,address,uint256)", +"4d38f6c5": "signTruelove(bytes32,string,string)", +"4d3915e9": "testF3(uint256)", +"4d392341": "ICO_BONUS1_RATE()", +"4d392e49": "getSubjectById(uint256)", +"4d395384": "configString()", +"4d399cb3": "updateWhitelist(address,uint8)", +"4d39ed06": "initialFoundersAmount()", +"4d39f535": "transferFrom(uint40)", +"4d39fa7d": "getMultiplierAtTime(uint256)", +"4d3a01b1": "setLongAirdropPicker(address)", +"4d3a2f10": "lastReceivedMessage(address)", +"4d3b915e": "minTokenSale()", +"4d3bdb82": "KickcityToken()", +"4d3cd84e": "setCanAnyMint(bool,int256)", +"4d3ceef1": "freezeCheck(address,uint256)", +"4d3cf035": "tokens2ether(uint256)", +"4d3cfbcd": "NextStep(uint8)", +"4d3d096b": "isExist(string)", +"4d3d14f2": "calculateTransferFee(address,address,uint256)", +"4d3e7682": "DataSellToken()", +"4d3ec092": "LogReplaceToken(address,uint256)", +"4d3eff3c": "setICOSpec(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"4d3f0a6e": "becomeRenown()", +"4d3fac53": "getRatingRange(uint256,uint256,uint256)", +"4d40ed9c": "setSanMaxFree(uint256)", +"4d40f03c": "SovietCoin()", +"4d414c18": "Victim()", +"4d41fee4": "logit()", +"4d425812": "getCountryCount()", +"4d428204": "getTransferTime()", +"4d4282e9": "bytes32IsEmpty(bytes32)", +"4d42b0e5": "getUserLogin(address)", +"4d42c7e4": "getTotalIndividualWeiAmount(address)", +"4d42c952": "destroyedToken()", +"4d42fc66": "gen0Profit()", +"4d437034": "getInvestedTokenBalance(address)", +"4d437a62": "TPCToken()", +"4d43bec9": "emitEvent(uint256)", +"4d4439fa": "ZipperMultisigFactory(address)", +"4d444fac": "isDepositAllowed()", +"4d4479a8": "FLC_address()", +"4d44f108": "checkProof(bytes32)", +"4d4549fb": "GDCNumber1()", +"4d4582a1": "submitChallenge(bytes32,bytes32)", +"4d461ed1": "completeSale()", +"4d46474a": "option10symbol()", +"4d474898": "mine(uint256)", +"4d474d63": "MAPT()", +"4d4765dc": "complete_buy_exchange()", +"4d47ae8c": "setPartyB(address)", +"4d47ce56": "seek(uint256,uint256,bool)", +"4d47feaa": "ShareholderDB(uint256)", +"4d480faa": "setMaxDelay(uint256,uint256)", +"4d486406": "addEmbassy(address)", +"4d492b50": "transferMulti(address[])", +"4d493f24": "maximumTokenIssue()", +"4d49451c": "candidateExchange()", +"4d4a919f": "bailout()", +"4d4aa77f": "getTicketDetails(int256,uint256,uint256,address)", +"4d4af36f": "setMins(uint256,uint256)", +"4d4b1a88": "addTokenTrust(address)", +"4d4b298e": "creditAccount(address)", +"4d4b3202": "getTrustedTransferSourceValue()", +"4d4ba1d7": "changeDivestFee(uint256)", +"4d4c277d": "MAINTENANCE_FEE_PERCENT()", +"4d4d2b1c": "hasVoted(address,address)", +"4d4eeaa8": "logoPng()", +"4d50169e": "distributionThresholds(uint256)", +"4d50d5f2": "firstPreSaleEndDate2()", +"4d51fad6": "Bittoq(uint256,string,uint8,string)", +"4d52a512": "getSoftCap()", +"4d536c03": "buySaleNonReferral(uint8)", +"4d536f9f": "validateNameExt(bytes)", +"4d536fe3": "doit()", +"4d53c30f": "t4tRaised()", +"4d547ada": "worker()", +"4d54dc96": "isNonlistedUser(address)", +"4d55a924": "KudosRouter()", +"4d561721": "etherandomSetNetwork()", +"4d562c82": "freezeProhibited()", +"4d563540": "HUN(uint256,string,uint8,string)", +"4d56a130": "BitfuryToken()", +"4d586512": "_rand(uint256,uint256)", +"4d589c5b": "curatorIDOf(address)", +"4d58e413": "pushDividendPaymentToAddresses(uint256,address[])", +"4d597b2d": "totalTokensCompany()", +"4d5a1173": "calculateMaximumBurnAmount(uint256,uint256,uint256)", +"4d5a225c": "ethCoin()", +"4d5ad11e": "getAnnualGrantsLength()", +"4d5b0081": "reward(address,address)", +"4d5b080c": "scheduleTransaction(uint256,address,uint256)", +"4d5b335d": "mintHeroAsset(address,uint256)", +"4d5b608b": "testTransfer(address)", +"4d5b85f1": "createLighthouse(uint256,uint256,string)", +"4d5c07aa": "CryptoSim()", +"4d5d528a": "FeibeiContract()", +"4d5de6ba": "stageThreeSupply()", +"4d5e58a4": "purchasedTokensRaised()", +"4d5e9a2a": "getInterestRatePunitory(uint256)", +"4d5eceac": "nextAssigneeIndex()", +"4d5f327c": "supportsToken()", +"4d5fc38a": "amountOfGames()", +"4d610837": "indPreSale()", +"4d61537f": "secretSigner()", +"4d620299": "postSale(address,bytes32,uint256)", +"4d622831": "getLast()", +"4d624906": "PriceChanged(address,uint256,uint256)", +"4d628c44": "setWagerWinner(uint256,address)", +"4d62a9da": "MindCoin()", +"4d62f83c": "_distributeAuctionTax(uint256,address)", +"4d655aff": "db()", +"4d65beb1": "getVipInfo(uint256)", +"4d66a3ab": "testtxorigin()", +"4d66d44d": "ArtToujourICO(uint256,uint256,uint256,uint256,uint256,address)", +"4d677d32": "Manager(address,address,address)", +"4d6804c2": "transferTokensFromVault(address,address,uint256)", +"4d68282f": "releaseFunds(uint256)", +"4d689543": "mmLibAddress()", +"4d6a26be": "tryOpenRoom(address,uint256,uint256,uint256)", +"4d6a304c": "GetLatestCheckpoint()", +"4d6a7d33": "collect(address,uint32[])", +"4d6a813a": "isCutieCore()", +"4d6aa2e5": "generateReferralAddress(address)", +"4d6aed53": "getIssued()", +"4d6b3d83": "Brave()", +"4d6bc04e": "totalPerTokenPayout()", +"4d6c3427": "REGULAR_TYPE_COUNT()", +"4d6c3b6b": "setCompte_4(string)", +"4d6f49b3": "updateChainlinkOracleWithENS()", +"4d6f58d5": "proveOwnership(bytes,int256)", +"4d70d1d7": "generateId(uint256)", +"4d712228": "Storesumdata(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,uint64)", +"4d71d6be": "finalizeDelegation()", +"4d720209": "withdrawDistributionCRL()", +"4d722c4c": "checkWinner(address)", +"4d729be4": "calculateFishermansFee()", +"4d730d51": "numOfPurchasedTokensOnEpBy(address)", +"4d73452e": "START_WEEK_3()", +"4d7439cb": "getBusiness(uint256)", +"4d7480ea": "_allowPublishSecret()", +"4d74d3b4": "setMetadataContractAddress(address)", +"4d754715": "burningEnabled()", +"4d7559a8": "totalGoldSupply()", +"4d7569ac": "TOKEN_SUPPLY_CROWD()", +"4d77551a": "eleventhTime()", +"4d782655": "confirmCertificate(uint256)", +"4d782cbc": "executeSellOrder()", +"4d78fdc6": "unblockAccount(address)", +"4d794cfc": "START_ETH_TO_CENTS()", +"4d79874e": "validateLandTakeover(address,uint256,uint256)", +"4d79ddb2": "getVotesForItemFromVoterIndex(uint256,uint256,uint256)", +"4d7a2052": "getTicketPrizeFromIndex(uint256)", +"4d7a7577": "DURATION_VIPPLACEMENT()", +"4d7ad1dd": "deleteProposal(bytes32,string)", +"4d7ad205": "gasRewardPercent()", +"4d7b8d2f": "DWBTICO(address,address,uint256,uint256,uint256,uint256)", +"4d7b9bd5": "checkBalance(address,uint256)", +"4d7ba587": "setDecider(address)", +"4d7bc8c9": "removeCompanion(address)", +"4d7c0192": "changeCanUpgrade(bool)", +"4d7c7485": "getActiveFlag(uint16)", +"4d7d003f": "dropCoinsSingle(address[],uint256)", +"4d7d13e1": "getUniqueIdOfPlayerByPlayerAndCountryID(uint256)", +"4d7d87b2": "prodTokens(address,uint256)", +"4d7d8a60": "marriageDate()", +"4d7d9a91": "transferCoadminship(address)", +"4d7dcfbd": "parseVarInt(bytes,uint256)", +"4d7e2a6a": "Token_Unlocked()", +"4d7e897f": "rollOne(address,uint8)", +"4d7ec628": "requestToken()", +"4d7ece70": "advisorVesting(address[],uint256[])", +"4d7edc15": "assignTokens(address,uint256)", +"4d7ee4ee": "changeGlobalOperator(address)", +"4d804e60": "WITHDRAWAL_TRIGGER_AMOUNT()", +"4d80bf14": "NewManager()", +"4d82f25c": "VestingTrustee(address)", +"4d831535": "allocatePVT_InvTokens(address[],uint256[])", +"4d83ffdd": "createUser(address,uint256,bytes32)", +"4d840bcc": "isWithdrawable()", +"4d843acd": "getSalaryTokensTotalAddress(uint256)", +"4d846a99": "getMin(uint128[])", +"4d846c8e": "getCurrentCandyAmount()", +"4d84ba37": "depositsAddress()", +"4d85006d": "Incredibles2RT()", +"4d853ee5": "founder()", +"4d8589c5": "getProofOfStakeRewardUpdateToken(address,address)", +"4d85b8d0": "checkEndOfChallenge()", +"4d86b498": "BucoTestCoin()", +"4d87a49b": "updateInvVault(uint256,uint256)", +"4d882c97": "EthPenis()", +"4d88a639": "getOrder(uint80)", +"4d88a8cf": "getExitBySlotId(uint64)", +"4d894d24": "getLevelByIndex(uint256)", +"4d8a666b": "EnterEntidadesdonaciones(address)", +"4d8a9310": "isCrowdsaleStopped()", +"4d8b7056": "Dd(address,address)", +"4d8bd784": "getGuestToken()", +"4d8c10a6": "AJCMToken()", +"4d8c3ea6": "getTxVoteDetails(bytes32)", +"4d8c61c1": "LogChangeTimestamp(address,uint256,uint256)", +"4d8caa7e": "setTokensPerWei(uint256)", +"4d8d9e92": "tokensPerSecond()", +"4d8dcc7a": "initDeposit(uint256)", +"4d8de4fc": "unbond(bytes32,uint256)", +"4d8e15f2": "KockToken()", +"4d8f00f4": "RatingsContract(address,address)", +"4d8fef1c": "produceWiner()", +"4d908a55": "InitiateCars()", +"4d909110": "EtherBank()", +"4d912393": "mintReservation(address[],uint256[])", +"4d918282": "addmoney(address,uint256,uint256)", +"4d91c096": "stakeCommence()", +"4d91d4f1": "incrementBasketsMinted(uint256,address)", +"4d9250c4": "TakeMyEther()", +"4d936889": "ConsentTemplate(string,uint256,string,string,string)", +"4d93d1db": "EventCreateAngel(address,uint64)", +"4d94994c": "lucky_number()", +"4d94cee7": "opetWallet()", +"4d9577af": "getFirstMilestoneStartsAt()", +"4d95a7a2": "tokensToRecieve(uint256)", +"4d95c76c": "activeCanvasCount()", +"4d964da6": "GBBCOIN(uint256,string,string)", +"4d96e062": "whenStakeCanBeReturned()", +"4d986c8f": "icoSalesSupply()", +"4d98a6ff": "createGroup(string,string,string,uint256,uint256,uint256,uint256,uint256,bool)", +"4d99055c": "getBonus(uint256,address,uint256)", +"4d9994e8": "setAccountNickname(string)", +"4d999756": "tokensPreICO()", +"4d9a3136": "findByName(string)", +"4d9a81d4": "IsDistribStarted()", +"4d9aa424": "crowdsaleEnd()", +"4d9b3735": "getFunds()", +"4d9b3d5d": "getbalance()", +"4d9b8fcf": "allowTransfer(address,bool)", +"4d9bcac4": "getProviderParameter(address,bytes32)", +"4d9c1bf3": "payTokenBatch(bytes32[],uint256[],address,address,bytes)", +"4d9e40af": "TOKEN_CREATORS_SUPPLY()", +"4d9e4e22": "Etheria()", +"4d9fb121": "Trade()", +"4d9fcee9": "getExportingAuthority()", +"4da07fe5": "getCardType(uint32)", +"4da0a4fc": "promoToken()", +"4da1397c": "durationOfLock()", +"4da1668d": "giftNFT(address,uint256,uint256)", +"4da1b25d": "weiFundingCap()", +"4da1e0b7": "cancelTokenSale(uint256,address,bool)", +"4da2317f": "payoutAll()", +"4da25c74": "triCmp(uint256,uint256)", +"4da2906b": "updateUser(bytes32,bytes32,bytes32,bytes32,bytes32)", +"4da2b48e": "getCat(uint256)", +"4da36913": "migrationIndex()", +"4da3b6db": "otherF3D_()", +"4da47ba0": "TokenSale(address,uint256)", +"4da51208": "OKMcoin(uint256,string,uint8,string)", +"4da5160f": "getFirstDocumentIdStartingAtValidFrom(uint256)", +"4da5598a": "syndicatePrecision()", +"4da5d4c0": "isEthernautsExplore()", +"4da5ed85": "disableContinuousDelivery()", +"4da74ee6": "setVoteIntention(uint256,bool,bool,string)", +"4da7c5d6": "LendingBlockTokenEvent(address)", +"4da837e3": "transferDevelopment(address)", +"4da845b3": "swapWinner()", +"4da86598": "getFileMd5(uint256)", +"4da8a771": "INHERITANCECrowdsale(uint256,uint256,uint256)", +"4da946d9": "TakeOffWorldwide()", +"4da9cb07": "LilithToken(uint256,string,string,uint8)", +"4daa1208": "SetPoolCreationFee(uint256)", +"4daaa98f": "doReward()", +"4daade18": "TravelCoinToken()", +"4daadff9": "extractCLNfromMarketMaker()", +"4dab54fd": "removeFromInxWhitelist(address)", +"4dab63ff": "_unpackItemData(uint256)", +"4dabb674": "changePhaseToNormalLife()", +"4dac7d6f": "renewableOf(uint256)", +"4dad66f5": "divForTank()", +"4dad9003": "transferManyLand(int256[],int256[],address)", +"4dadac8f": "STAKING_UNIT()", +"4daea42a": "TOWN_INCREASE_RATE()", +"4daf490c": "getFarm()", +"4daf890a": "invokeLottery()", +"4dafdc50": "exchangeId()", +"4db0040e": "createWonderNotAuction(string)", +"4db08aea": "SALE()", +"4db08e5b": "getSaleContractTokensMinted(address)", +"4db19e7e": "assertEq(bool,bool,string)", +"4db1ba5a": "repossessionBountyPerTen()", +"4db1c7b2": "changeId(uint256,uint256)", +"4db208ba": "Titanization()", +"4db2beef": "distroyToken(uint256)", +"4db347a3": "acceptChallenge(address)", +"4db3c6d7": "buyTokensWithReferal(address)", +"4db3da83": "scheduleCall(bytes4)", +"4db3eef8": "delegateFromBonus(uint88)", +"4db4eae6": "_topBonus()", +"4db4eff0": "hatchCoins(address)", +"4db52924": "setNumMessagesSigned(bytes32,uint256)", +"4db53a70": "VTest()", +"4db59565": "getHistoryRoundInfo(uint256)", +"4db5d52b": "getWagerOwner(address)", +"4db61d21": "compareNoCase(string,string)", +"4db6397f": "calculatePlayerValue(address)", +"4db77d9d": "getMaxJump(uint256)", +"4db8349e": "buyerToSentWeiOf(address)", +"4db8cbc9": "wordCounter()", +"4db94441": "limitAgentBets()", +"4db9bfe6": "getPostVoteCount(uint256)", +"4dbaa16b": "recoverLeftoversPreICO()", +"4dbac733": "INITIAL_RATE()", +"4dbb1964": "setSalesAgent(address)", +"4dbb37eb": "checkLeftToken()", +"4dbb4da5": "increaseMaxContribTime()", +"4dbb51f6": "Hashfex()", +"4dbbddff": "BOBTokenVesting(address,uint256,uint256,uint256,bool)", +"4dbbfcc6": "stageLength()", +"4dbc355a": "releaseTeam()", +"4dbdb0fd": "signUpForPVP(uint256)", +"4dbddc18": "getPoolID()", +"4dbe5889": "ownerClaim()", +"4dbf27cc": "follow(address)", +"4dbfb6fb": "PredictionMarket(uint256)", +"4dc0884f": "playerCards(uint256)", +"4dc08ce2": "GameWon(uint256,address)", +"4dc133a5": "stopTge(bool)", +"4dc13951": "vendingAttachedState()", +"4dc189ef": "createContractWhale(string)", +"4dc18c02": "finalSendTokens()", +"4dc1dbec": "priceToMint()", +"4dc266b4": "submitAnswerReveal(bytes32,bytes32,uint256,uint256)", +"4dc2c67a": "veriPass(string)", +"4dc3141b": "CalcAll()", +"4dc3ba8f": "assignVoterMoreVotes(address,uint256)", +"4dc3f289": "changeCommonDiscount(uint256)", +"4dc41210": "preStartTime()", +"4dc415de": "reject()", +"4dc43eaf": "setTreasury(uint256,uint256)", +"4dc49b25": "InitialPointUnit()", +"4dc59196": "icoAllocation()", +"4dc5c69f": "getTotalDiscount(address)", +"4dc5c771": "dividendsAccount()", +"4dc5fa4e": "MEDIA_SUPPORT_WALLET()", +"4dc65411": "GEM()", +"4dc666b3": "sendTokensManually(address,uint256,uint256)", +"4dc6b523": "divestFee()", +"4dc73428": "transferFromByModule(address,address,uint256,bool)", +"4dc7cc55": "terminateAlt()", +"4dc7d31b": "transferRwrd(uint256)", +"4dc8ed02": "ICObonusStages(uint256)", +"4dc936c0": "mintItem(uint256,address)", +"4dc958e1": "addToBounty(uint256)", +"4dc996d5": "updatetoken(string,string,string,string)", +"4dca2770": "BecomeMemberCandidate(bytes32)", +"4dcad927": "tokensSoldTotal()", +"4dcb05f9": "depositBond(uint256)", +"4dcbb8ee": "getAllAuditors()", +"4dcc889d": "Conference(string,uint256,uint256,uint256,string)", +"4dcd4fb1": "MetaChanged(bytes32,bytes32,bytes32)", +"4dcd85d8": "setPriceOfApis(uint256)", +"4dce4142": "opVaultAddr()", +"4dcee2e0": "hashes(uint16)", +"4dcf2917": "allowUpgrades()", +"4dcf7430": "receiveTokenLoot(uint256[],uint256,uint8,bytes32,bytes32)", +"4dd0f157": "getWinnerType(uint256)", +"4dd12329": "rightSharePrice()", +"4dd19434": "getLeaf2(uint256)", +"4dd1e81c": "tokenBuyable(uint256,uint256)", +"4dd33832": "tokensSoldAtIco()", +"4dd36a0e": "buyTokens(uint8,address)", +"4dd37f19": "getHashRateOfCurrentHalving(address)", +"4dd3e575": "endMinting(bool)", +"4dd4547d": "fireOnChanged(bytes32,uint256[])", +"4dd49680": "SetEvaluate(uint32,uint8,uint8)", +"4dd49ab4": "get(bytes,uint256)", +"4dd49e08": "deliverTokens(address,uint256)", +"4dd5df8c": "setPOOL_edit_16(string)", +"4dd60ff9": "buyNDC(uint256,uint256,uint8,bytes32,bytes32)", +"4dd7f293": "Kayako()", +"4dd83243": "hasNextKey(uint256)", +"4dd83cb1": "refreshPublicFundingTime(uint256,uint256)", +"4dd850fb": "UfoPonzi()", +"4dd8aefd": "DTT()", +"4dd93bd3": "getInvestmentValue()", +"4dd9e437": "transferUserToUser(address,address,address,uint256)", +"4dda1764": "CafeMaker()", +"4dda71a8": "newAuction(uint128,uint256,uint256)", +"4ddad616": "genesMarket()", +"4ddb5f01": "ROPCOIN()", +"4ddbf2b3": "teamTokenFund()", +"4ddc36df": "renounceClearingPriceValidator()", +"4ddc8f74": "SPEX()", +"4ddd108a": "money()", +"4ddd648b": "buyer_profit_pool_amount()", +"4ddddd4c": "SearchIPR(string)", +"4dde3fe1": "redemptionAddress()", +"4dde88ad": "getGroupMembers(uint256,uint256,uint256)", +"4dde8de6": "registerUBetCheck(address,string,string,string,uint256,string,int256)", +"4ddf6795": "getVoteRulesOfProposal(uint256)", +"4ddfd20f": "offer_id()", +"4de0089a": "becomeHipstermaster()", +"4de037c7": "getTitulaire_Compte_8()", +"4de0cdf2": "setICOParams(uint256,uint256,uint256)", +"4de1454f": "targetReached(uint256)", +"4de16053": "getLockProductCount()", +"4de162e4": "extractAccountLength()", +"4de1fc55": "submitAnswer(uint256[],uint256[])", +"4de2578c": "reproduce(uint8,address,uint256)", +"4de260a2": "hack()", +"4de261ef": "presalecap()", +"4de2d5d5": "checkPrize()", +"4de2eee9": "zapVillain(uint256,uint256)", +"4de2f146": "SentAmountToNeighbours(uint256,address)", +"4de315ea": "unlockAddressToken(address)", +"4de4145f": "_transferSenderPaysFee_byProxy(address,address,uint256)", +"4de4f479": "RiskPrice()", +"4de504cd": "setTransferLockFree()", +"4de5120e": "lastWithdrawalTime(address)", +"4de62cd6": "removeGemmyMusicLock(address)", +"4de799c2": "cancelTeamWithdrawal()", +"4de85639": "failDivideFractionalByZero()", +"4de8a799": "addPrivateSaleBuyer(address,uint256)", +"4de90f34": "minForNewTopic()", +"4de94320": "logic_contract()", +"4de946bf": "ideaProofDocument(bytes,uint256)", +"4de952c7": "cmulpow2(address,uint256)", +"4de970fd": "RATE4()", +"4de9e482": "ENDHarvest()", +"4dea208b": "upgradeKingdomType(string,uint256)", +"4dea4d15": "setConfig(uint64,string,uint256,uint256,address,string)", +"4deaad5f": "reverseBytes(uint256)", +"4deb68a3": "auctionStart(bytes32,uint256,uint256)", +"4deb9f47": "UnlockRig(uint8)", +"4deba2e0": "LogCreateToken(address,uint256)", +"4dec1014": "stageFokenCap(uint16)", +"4dec5dc4": "employeeExerciseOptions(bool)", +"4dec9b57": "testView()", +"4ded452e": "InviteCreated(address)", +"4ded6e89": "airdropParticipants()", +"4ded9bfe": "releaseMultiAccounts(address[])", +"4dee529a": "Muggelo()", +"4def0453": "setContentURI(uint256,string)", +"4defd1bf": "setCrowdsaleManager(address)", +"4df0b78a": "withdrewThisYear()", +"4df0ca7e": "EarlyAdoptersAddress()", +"4df17cdc": "maxEtherInvestment()", +"4df28ae4": "capTime()", +"4df34124": "RyxEx(address,address,address,uint256,uint256,uint256)", +"4df3ad68": "setTokenPriceInCent(uint256)", +"4df498b2": "getPreSaleEnd()", +"4df53a0f": "testSetApprovalDb()", +"4df62441": "percentOfPresaleSold()", +"4df65873": "getDefaultRgb(address)", +"4df679e3": "BonusAllocation(address,string,string,uint256)", +"4df68ada": "enable(bool)", +"4df6b45d": "delegateTransferFrom(address,address,uint256,address)", +"4df6ca2a": "setQuestionFee(uint256)", +"4df6d6cc": "allowedRecipients(address)", +"4df7e3d0": "b()", +"4df86126": "SECONDS_PER_HOUR()", +"4df93196": "Joe223()", +"4dfa2722": "CryptoWuxiaVoting()", +"4dfa3f18": "createNewUser(string,string)", +"4dfad511": "_redeem(address,uint256)", +"4dfb10bc": "realVotedSupply()", +"4dfb4807": "etherTotal()", +"4dfc7aa1": "existsDistrito(uint256)", +"4dfc97c5": "policyTokenBalance()", +"4dfcf67a": "NeroSupply()", +"4dfd14b2": "EMACCrowdsale(uint256,uint256,uint256,address,address)", +"4dfd1b02": "setUint8(int8,uint8)", +"4dfd964f": "TSTCallAPI()", +"4dfdc21f": "maxNum()", +"4dfdebe9": "ClientQty()", +"4dfe13e7": "distributeTokensToWallets(address[])", +"4dfe28e7": "releasedTokenOf(address)", +"4dfe950d": "purgeUpgrade()", +"4dfff04f": "approveSiring(address,uint256)", +"4e010942": "LogOraclizeCallback(uint256,bytes32,string,bytes)", +"4e0128fb": "watchPrice()", +"4e012918": "whitelister_address()", +"4e017994": "capEth()", +"4e01bb60": "RefundPeriodOver()", +"4e01bd10": "emergencyTokenWithdrawal(uint256)", +"4e02107a": "getWeddingData()", +"4e022f11": "setSpark(address)", +"4e023fc9": "FakeXUC()", +"4e028c67": "SAC()", +"4e02ed40": "CESCoin(uint256,string,string)", +"4e039d26": "setPreallocationWhitelist(address,bool)", +"4e0416a6": "DaoRulesProposalAdded(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,address,uint256)", +"4e054a67": "setBlacklist(address)", +"4e05ded6": "ClassicCheck()", +"4e06369c": "getPurchasableAmount()", +"4e077f2a": "addGasEther()", +"4e07a7a5": "thirdStageMinted()", +"4e088eb7": "stopPrivateSale()", +"4e0896a1": "teamIndexToExist(uint256)", +"4e0a0f21": "preICOstartTime()", +"4e0a3379": "setCFO(address)", +"4e0ade00": "SmartWallet(address,address,address)", +"4e0b7888": "_updateStage()", +"4e0ba39d": "reserveAdd(uint256,uint256,uint256,uint256)", +"4e0be991": "removeChild(address,address)", +"4e0c4a9c": "setCommissioner(address)", +"4e0ce969": "moduleToken(uint256,uint8)", +"4e0d93a3": "increasePriceForNeighbours(uint256)", +"4e0e9675": "isIdentity(address)", +"4e0f1064": "getMonthlyTransactionVolumeReceiving()", +"4e102951": "can_claim(address,address,address)", +"4e1053cc": "RobinHoodPonzi()", +"4e10c212": "TxAttackWallet()", +"4e10c3ee": "transferWithoutReward(address,uint256)", +"4e116eb8": "unRegisterCertificationDb(address)", +"4e1243b6": "AddClaim(uint32,string,bytes32,bytes32,address,uint32)", +"4e1273f4": "balanceOfBatch(address[],uint256[])", +"4e12e51a": "getBonusList()", +"4e1339fe": "HALT()", +"4e13f066": "RedSoxRays48()", +"4e140274": "isDiscount()", +"4e1415ab": "testThrowExecuteSellOrderDaoChallengeRefusesZeroFunds()", +"4e14e4c8": "CyberCapitalInvestToken()", +"4e153418": "CreateLottery(uint32)", +"4e159a05": "clacCooperateNeedLockAmount(uint256)", +"4e15dfe9": "wholeTokensPerEth()", +"4e16bef5": "jack_max()", +"4e16e0c7": "participantCanParticipate(address)", +"4e18405d": "TOTAL_ARK()", +"4e18c1a7": "IcoPhaseAmountsChanged(uint256,uint256,uint256,uint256)", +"4e191701": "lamboPresaleAddress()", +"4e194cc0": "getCreateFeeToken()", +"4e195faf": "totalEthereumRaised()", +"4e19c112": "deleteOwner(address,uint8)", +"4e1a150b": "netherToken()", +"4e1a1853": "ParentCoinAddress(address)", +"4e1a50b7": "setBonuses(uint256,uint256,uint256,uint256)", +"4e1bdfdf": "withdrawOlder()", +"4e1cfa8c": "batchAddCandidateByIndex(uint256,address[],bytes32[],bytes32[])", +"4e1dc0d7": "LAYA()", +"4e1f6c14": "FUTURE_WALLET()", +"4e1fa837": "TestERC721()", +"4e205cee": "signedApproveAndCallHash(address,address,uint256,bytes32,uint256,uint256)", +"4e209678": "testFailBreach()", +"4e2133ba": "addExchangePartnerAddressAndRate(address,uint256)", +"4e21f25e": "soldPresale()", +"4e22102b": "LIMITS_END_DATE()", +"4e2280c4": "clearQuickBuyPath()", +"4e228d8f": "ExchangeableToken(address)", +"4e23176c": "buyRBCTokens()", +"4e232730": "ownerOn(address)", +"4e233065": "delKeyValue(uint256,bytes32)", +"4e23a144": "fundUser(address,uint256)", +"4e25658e": "setSegment(string,uint32,uint32,string,string,string,string)", +"4e2567d0": "addToAccountList(address)", +"4e25c92e": "ttlSply()", +"4e2611ae": "vnetToken()", +"4e2659a8": "createTeam(bytes32,bytes3,bytes3,bytes3,bytes3,bytes3,bytes3)", +"4e26c95e": "EASYLIFE(uint256,string,string)", +"4e272768": "remove_bounty()", +"4e2743b3": "setStack(uint256,uint256)", +"4e275295": "tokensSell()", +"4e2786fb": "roundNumber()", +"4e27e916": "voteLock(address)", +"4e2808da": "cancelOwnership()", +"4e280fd6": "SolarioToken()", +"4e284af1": "INCENT_FUND_NON_VESTING()", +"4e285acb": "setsendgoods(uint256)", +"4e29cba6": "disbursements(uint256)", +"4e2a953a": "gameStartedAt()", +"4e2aae36": "setzUint256(uint256,int256)", +"4e2ab933": "transferFrom(address,address,uint256,bytes,string)", +"4e2ad943": "mainSaleBonusEndTime()", +"4e2b57fe": "mincap()", +"4e2ba115": "DFVToken()", +"4e2bd9ce": "rescind(address)", +"4e2bdfd4": "getBetMutableData()", +"4e2c9524": "upgradeDuties()", +"4e2de9e1": "setGzeBonusOffList(uint256)", +"4e2e8a10": "setTime3(address,uint256)", +"4e2e94f7": "MAX_PRE_SALE_AMOUNT()", +"4e2f220c": "createCentralizedOracle(bytes)", +"4e2f2af4": "PayoutRedemption(uint256,uint256,uint256)", +"4e2fa68f": "crowdsaleStarts()", +"4e2fd44e": "setPriv(address)", +"4e304bfb": "CRAIC()", +"4e30506f": "dropLast()", +"4e30a66c": "safeToAdd(uint256,uint256)", +"4e317ead": "cancelTemplateProposal(address,uint256)", +"4e31aea3": "firstThawDate()", +"4e329bd3": "HealthCoin(uint256)", +"4e358ce7": "DITCOIN()", +"4e35aacf": "createCompany(string,uint256)", +"4e360eaf": "EmergencyStopActivated()", +"4e3673a6": "connectCrowdsaleContract(address)", +"4e36fddf": "XdacTokenCrowdsale(address,uint256[],uint256[],uint256)", +"4e37af4e": "offlineCallback(bytes32)", +"4e38413f": "setBytes32(bytes32,bytes32,bytes32,bool)", +"4e385512": "setCampaignValidity(bytes32,bool)", +"4e38f205": "generateWithdrawalHash(string,uint256,address)", +"4e390f2a": "initLottery(uint256,uint256,uint256,uint256)", +"4e395e2a": "isExecutable(uint256)", +"4e3acafe": "Cr1tikalIsShort()", +"4e3b33d4": "prepareRefund()", +"4e3b52fe": "metaCoin()", +"4e3c2f47": "getCardDivs(uint256,uint256)", +"4e3c50a0": "addBuyTokensRequest(address,string,string)", +"4e3d2745": "ManoloToken()", +"4e3d539a": "newChainlinkWithENS(address,bytes32)", +"4e3dc2f1": "STAT_MAX()", +"4e3df857": "removeEA(uint32)", +"4e3e4035": "notEqual(int256,int256,string)", +"4e400bda": "getSenderStatus(address,uint256)", +"4e406167": "setContractICO(address)", +"4e4081ef": "pregnantBots()", +"4e41108d": "Bank()", +"4e417a98": "callData()", +"4e41a1fb": "symbol(uint256)", +"4e41ebf6": "createCommissionerAuction(uint32,uint256,uint256,uint256)", +"4e42b632": "WEBcoin()", +"4e43502a": "BDSMTOKEN(uint256,string,uint8,string)", +"4e43603a": "getUserStats(address)", +"4e448ffa": "winnerLuckyNumber()", +"4e44b5cc": "Kiwi(address,uint256,string,string,uint8,uint8)", +"4e44c855": "setGameStatus()", +"4e44d956": "configureMinter(address,uint256)", +"4e458cc2": "setNewEndTime(uint256)", +"4e458eb6": "posstoken()", +"4e45fba9": "getProviderDetails(address,uint256)", +"4e46869c": "accountAndSubcourtIDToStakePathID(address,uint96)", +"4e46fc2c": "finalizePreICO()", +"4e47d99a": "WubCoin(address)", +"4e4831d8": "removeDelegatorById(uint256,address,address)", +"4e485c52": "closeTransfer()", +"4e48a495": "checkTransfer(address,address,uint256,uint256)", +"4e4965ff": "AIPAY()", +"4e49954e": "createReceipt(address,string)", +"4e49acac": "setParams(address)", +"4e4a8c0d": "sendMessage(address,uint256,uint256,bytes)", +"4e4ab830": "amIOwner()", +"4e4ac577": "claimFeesForRound(address,uint256)", +"4e4afa1b": "minimumTickets()", +"4e4cf65c": "forwardMoney()", +"4e4d02db": "DeathFactor_iii()", +"4e4d3e56": "get_funds_left_for_reinvestment()", +"4e4e2d6d": "PaymentForwarded(address,uint256,uint128,address)", +"4e4e7862": "addWithdrawal(address,address,uint256)", +"4e4f776c": "TCT(uint256,string,uint8,string)", +"4e4fbee1": "renounceProxyManager()", +"4e4fe306": "getData(uint256,uint256)", +"4e500760": "CreditUnits()", +"4e504313": "Addr3()", +"4e505367": "initialTokenAmount()", +"4e51193b": "sealTimestamp()", +"4e5141eb": "buyTokens(uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"4e5146a9": "hexToAscii(uint8)", +"4e520a94": "getNumRecords(address)", +"4e521a2a": "INCUToken()", +"4e523b91": "MonethaToken(address,uint256)", +"4e52622b": "eth6DivsOwing(address)", +"4e52678e": "digix()", +"4e53a0b9": "update(address[],uint256[],uint256[],uint256[])", +"4e53b564": "adminTransferContractBalance(uint256)", +"4e542bff": "_triggerPVPSignUp(uint256,uint256)", +"4e542c5f": "deleteById(uint256)", +"4e543b26": "setResolver(address)", +"4e5497de": "BuyoutDividend(address,address,uint256,uint256,uint256)", +"4e55936d": "NorthPoleMintingEnabled()", +"4e56925f": "updateMasternodeAsTeamMember(address)", +"4e57d27d": "_getAllRevisionTimestamps(bytes20)", +"4e58e920": "officialFacebook()", +"4e599551": "getPreviousWinners()", +"4e59f947": "SucToken()", +"4e5a33c5": "executeTokenRepartition(uint256)", +"4e5aabe6": "resetStellarBalance()", +"4e5ac744": "PDPCoin()", +"4e5acb1a": "changeAutherOwner(address)", +"4e5b0d29": "getVisaEntered(address,uint256,uint256)", +"4e5b3cb8": "EtherusPreSale(address,address,address,address)", +"4e5b5f54": "purchasePresale(address,uint256)", +"4e5bec6e": "addTypeAddressById(uint256,address,address,uint256)", +"4e5c0595": "tokenAdvisorsAllocated()", +"4e5d49a0": "DariumToken(address)", +"4e5d7186": "LogAccountRegistered(address,address,bytes32,bytes32,bytes32,bytes32)", +"4e5d793f": "setAsset(address,uint256,uint256,uint256)", +"4e5d8edd": "VOLUME_70()", +"4e5ed65b": "_indexAccount(address)", +"4e5f13bc": "landPriceCurrent()", +"4e5f8751": "newInvestWallet(address)", +"4e60321d": "userOddsMiniGame(address)", +"4e605688": "setBtcBuyer(address)", +"4e6093f8": "HeirChanged(address,address)", +"4e6106c5": "getRealisation()", +"4e61c362": "transferMul(address,uint256)", +"4e61df06": "DigixbotEthereum(address)", +"4e61efc5": "getWizzTypeOf(uint256)", +"4e637fab": "DepositsTransferred(address,uint256)", +"4e659145": "levPerUser()", +"4e6630b0": "ethBalance()", +"4e68354e": "LogLockStateTransition(uint8,uint8)", +"4e6885f3": "depositPresale(address)", +"4e6944cf": "totalStaticoinSupplys()", +"4e696d3c": "startCoinSale(uint256,address)", +"4e69d560": "getStatus()", +"4e6ab570": "insert_order(address,bool,uint32,uint128)", +"4e6b29ee": "returnIsParentAddress(address)", +"4e6b558a": "removeVerifiedAddress(address)", +"4e6b97f3": "transferMultiSameVaule(address[],uint256)", +"4e6ba0a9": "testCreateCostMultisig()", +"4e6c61aa": "testFailAddForeignChildNotChild()", +"4e6d1405": "invoices(uint256)", +"4e6d35ea": "currentlyReleased()", +"4e6d739d": "getSupernovaBalance()", +"4e6d73da": "LogUserUserRemovedFromWhiteList(address)", +"4e6e5d69": "unMint(address)", +"4e6e6928": "latestFriend()", +"4e6ec247": "_mint(address,uint256)", +"4e6f42ba": "changeSeizedTokensWallet(address)", +"4e6fedb7": "remainOfStage(address,uint256)", +"4e705549": "setDefinition(uint8,uint8,uint8,uint8,uint8)", +"4e7073f1": "setMinETH(uint256)", +"4e70a604": "Withdrawal(uint256)", +"4e70b1dc": "num()", +"4e7196c7": "setReg1(uint256)", +"4e71d92d": "claim()", +"4e71e0c8": "claimOwnership()", +"4e724f0f": "numBlocksLocked()", +"4e725b7a": "test_hasClaimableShares_nonZeroClaimableStake()", +"4e72ec91": "setPointer(uint8)", +"4e72f19e": "SendFundsToReceiver(uint256)", +"4e730025": "register(uint256,uint256,uint8,uint8,uint8,uint8,string)", +"4e7343ea": "verifyOrder(address,uint256,uint256,address)", +"4e7344d5": "ABitcoin()", +"4e7355d6": "RegistrantRemoval(address)", +"4e7445c8": "drainRemainingToken(address)", +"4e7455d0": "createMilestones(uint256,bool,uint256)", +"4e7602d3": "setRecipients(address[])", +"4e761a91": "STEP_SIZE()", +"4e7654fe": "buyTokens(uint256,uint256,bytes16,uint256,uint8,bytes32,bytes32)", +"4e76a725": "test_withAssertTrue()", +"4e76a846": "numParticipants()", +"4e76f5d2": "GetMinimumBet_ether()", +"4e77a38e": "releaseTrickleDownBonuses()", +"4e78e0c2": "setVerificationSlashingPeriod(uint256)", +"4e79909c": "WithdrawalApproved(uint256,uint256,bool,uint256,bytes)", +"4e79fd7c": "stepLockedToken()", +"4e7a540b": "doUpgradeInternal(address)", +"4e7a6978": "PersianTokenICO(uint256,uint256)", +"4e7ad367": "fireEventLog1Anonym()", +"4e7b1ce1": "PayNihilumToContract()", +"4e7ceacb": "getFeeAddress()", +"4e7cff38": "toBytes20(bytes,uint256)", +"4e7d656a": "EtherSpermBank()", +"4e7dbb29": "TTARD()", +"4e7e96f1": "buyBackInvestedValue()", +"4e7ec0e4": "setGlobalTimeVault(uint256)", +"4e7ec7e3": "RANGEEND_6()", +"4e7f1264": "leaveMessage(string)", +"4e7f9b19": "getReport(uint256)", +"4e80f241": "YCStandardToken(uint256,string,uint8,string)", +"4e8127f6": "icoSupply()", +"4e815698": "removeBlacklistAddress(address,address)", +"4e8182c8": "addJugada(uint256,string,string,uint256,uint256)", +"4e81b17d": "createMonthlyBill(uint8,uint256,uint256)", +"4e81eec9": "EventProductEndSale(uint32)", +"4e8204a4": "NewRoundStarted(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"4e82844d": "countWishes()", +"4e82c134": "getAddressFromUsername(string)", +"4e83977a": "validationWallet()", +"4e840bea": "IGTToken()", +"4e84c614": "getWaitingState()", +"4e85a0e1": "cancelVoteForCandidateByIndex(uint256,address,uint256)", +"4e860ebb": "disableTokenIssuance()", +"4e876ecc": "directSellRate()", +"4e87c715": "DEFAULT_INITIAL_COST()", +"4e880082": "distributeTheSameAmountOfTokens(address[],uint256)", +"4e89eb98": "bonusDicrement()", +"4e8a411b": "deallocate(address,address,uint256)", +"4e8afc5f": "getRegister(string,bytes32)", +"4e8b759c": "BuyOrdersOf(address,uint256)", +"4e8b75d0": "IRtokenChain(uint256,string,string)", +"4e8be64d": "TokenToken(uint256,string,string)", +"4e8c185b": "setFeePropMaxGlobal(uint256)", +"4e8c2927": "FreeToken()", +"4e8eaa13": "cancelAuction(uint256,address)", +"4e8ec73e": "jockeyPr(uint256)", +"4e8f05d1": "setGrowthTokensWallet(address)", +"4e8f7fdf": "allocateTokenForTeam(address)", +"4e8fb35c": "referralBountyTokensAddress()", +"4e91025e": "Liquidate(address,uint256,uint256,uint256,uint256)", +"4e91ca3a": "updateModuleStatus(address,bool)", +"4e91db08": "setBytes32(bytes32,bytes32)", +"4e91f906": "getNewPetCard(uint8,uint8)", +"4e922731": "calcRefBonus(uint256)", +"4e926eab": "getInviteePIDs()", +"4e9282af": "setBDApprove(uint256,bytes)", +"4e930483": "addbtycmoney(address,uint256)", +"4e9384da": "addSecondPreferences(bytes32[],bool)", +"4e938539": "preSaleSecondBonus()", +"4e93bf32": "maximumBuyBackAmountInWEI()", +"4e9466f7": "withdrawToMany(address[])", +"4e94917a": "Claim_TRAC_20000()", +"4e94c829": "getAugur()", +"4e94fbcf": "setIntervalCoefficient(bytes2,uint256,uint256,uint256)", +"4e954f87": "IsEthereum()", +"4e961921": "getCurrentTokenRate()", +"4e96ea53": "addContract(address,address,address,string)", +"4e97bcfc": "EmergencyStop()", +"4e98323c": "setReturnAgent(address)", +"4e9833ac": "changeHoldingTaxInterval(uint256)", +"4e989a5b": "importPlayers(address,address[])", +"4e98a5b3": "receiveAssets(uint256)", +"4e99b800": "tokenBaseURI()", +"4e9b5db0": "BASEPRICE()", +"4e9c6b1f": "million()", +"4e9cc134": "JPG1Token()", +"4e9cf5b1": "changeOperational(bytes32,bool)", +"4e9de828": "registerAuthContract(address)", +"4e9e456b": "oraclize_query(uint256,string,bytes[1])", +"4e9ec8a6": "transferETHtoContract(uint256)", +"4e9ee738": "test_8_basicTransfersBetweenAccounts_increaseBlocksBy300()", +"4e9f0f06": "GimmerTokenSale(address,address,uint256,uint256)", +"4e9f9d37": "startTimeTwo()", +"4e9faaba": "_sell(address,uint256)", +"4e9feee6": "changeFrozenTime(uint256)", +"4ea05686": "countSet()", +"4ea0db6c": "HardCapReached(address,uint256)", +"4ea10c74": "FounderAllocationTokens()", +"4ea14479": "setProjectToVerify(address,uint256)", +"4ea1fcb6": "getWithdrawAmount(address)", +"4ea201cc": "betInfo()", +"4ea28ee6": "MyToken(uint256,uint256)", +"4ea2ea9f": "allocLastTxRewardByHand()", +"4ea2f66a": "_claimIfNeededThenSteal(uint256,uint256,address,uint8,bytes32,bytes32,uint256,uint256)", +"4ea34cdb": "getActionContract(address)", +"4ea37fec": "presaleStartTimestamp()", +"4ea412f4": "setPrice3(uint256)", +"4ea44358": "setGen0Step(uint256)", +"4ea5195a": "participantRoundCalced(address,address,uint256)", +"4ea5a6ac": "getRocIndexToOwner(uint256)", +"4ea611cd": "setPartnerDurance(uint256,uint256)", +"4ea640da": "ManoAntrasToken()", +"4ea66c38": "buyinInternal(address,uint256)", +"4ea6c89e": "isPreviousStageFinalized()", +"4ea73b07": "APOTokenCrowdsale()", +"4ea7d483": "priceStar5Now()", +"4ea801c5": "writeRate(string,uint256)", +"4ea8b6d0": "changeProfilePicture(bytes32)", +"4ea9560e": "FoshaAirdrop()", +"4ea9a27a": "registerHolder(bytes32,address,uint256)", +"4ea9ea71": "_submitTransaction(address,uint256,bytes,bytes,address)", +"4eaaad7b": "left72(uint256)", +"4eab38f4": "depositReclaim(uint256,uint256)", +"4eab3998": "Allocations()", +"4ead4771": "getBIDList()", +"4eae51f4": "getHeirs()", +"4eae8e30": "isSenderApprovedFor(uint256)", +"4eaef8a2": "getCEOHashing(address,uint256)", +"4eb03f6e": "updateMinter(address)", +"4eb054e6": "createPinMoTrade(bool,uint256,uint256)", +"4eb06f61": "manualLockFunds()", +"4eb09bf4": "getParametersHash(uint256,uint256,uint256,uint256,address,address)", +"4eb1483d": "IcoAddress()", +"4eb166af": "right73(uint256)", +"4eb1e71c": "HashTestCoin()", +"4eb1f578": "saleValve(bool)", +"4eb21301": "currentSaleCap()", +"4eb259aa": "burnAndReturnAfterEnded(address)", +"4eb2a8fb": "Banear_Oraculo(address)", +"4eb3148e": "feesTakenFromPrize(uint256,uint256)", +"4eb333c7": "setSynthesizingAuctionAddress(address,address)", +"4eb37fe7": "Tournament(uint256,uint256,uint256,uint256,uint256)", +"4eb396cd": "mintByMintable(address,uint256)", +"4eb421e5": "MockFailUpgradeableToken()", +"4eb4fe80": "getBackLendingItem(uint64)", +"4eb5162e": "collectSellFee()", +"4eb56999": "claimRefundVaultOwnership()", +"4eb665af": "setLockDuration(uint256)", +"4eb7221a": "nameRegistry()", +"4eb7d857": "getSite(uint256)", +"4eb81ba4": "getSchellingRoundDetails()", +"4eb8ffb4": "ORACLIZE_GAS_LIMIT()", +"4eb933bf": "withdraw(bytes32[],address[],uint256[],uint64[],uint8[],bytes32[],bytes32[])", +"4eb94102": "setAuctionManagerAddress(address,address)", +"4eb94872": "Err(string)", +"4eb95b97": "DropNotice(uint256,string,string,string)", +"4ebab5cf": "specificApprove(address,uint256)", +"4ebc31f3": "managerETHcandidatAddress()", +"4ebc7a9c": "processReinvest(address,bool)", +"4ebcdc2b": "SwapStarted(uint256)", +"4ebd7741": "extraMint(address)", +"4ebe2d46": "createMultisig()", +"4ebfa8bc": "getUserBettingInfo(address,uint256)", +"4ebfd6e8": "freeForAll()", +"4ebfff02": "setAddressAPI(address,address)", +"4ec06982": "paybackToDepositer(address,uint256)", +"4ec0744d": "UtrustToken()", +"4ec109f4": "receiveToken(address,address,uint256)", +"4ec1646d": "claimFreeAnimalFromAnimalFactory(string,string)", +"4ec18db9": "poolSize()", +"4ec19512": "calculateRunway()", +"4ec1adf1": "callAMethod2(uint256)", +"4ec24fa0": "getManagementProxy(uint32,int256)", +"4ec2b417": "getBankKYC(address)", +"4ec2cde6": "totalSupplyForCrowdsaleAndMint()", +"4ec2d0b6": "buyMiner(uint256[])", +"4ec32507": "parentBlockInterval()", +"4ec42e8e": "antToken()", +"4ec4878b": "donateJackpot()", +"4ec6396d": "TransChain()", +"4ec6a61a": "InitializeCoinToUser(address)", +"4ec70fde": "publicMin()", +"4ec7344e": "MetaFoxToken()", +"4ec735ae": "revokePermission(address,address,bytes4)", +"4ec79937": "approve(bytes32,bool)", +"4ec7a6e7": "externalSale(address,uint256,uint256,uint256)", +"4ec7b58b": "delSaleOwner(address)", +"4ec7ddc0": "addCommitteeVote(address)", +"4ec883d1": "editRestrictedAddress(address)", +"4ec8a8ff": "unpausecontract()", +"4ec9ef9c": "calculateTokenPurchase(uint256,uint256)", +"4eca4b19": "sendCoins(address,address,uint256)", +"4ecb02aa": "firstTierDiscountUpperLimitEther()", +"4ecb1390": "saleTokens(address,uint256)", +"4ecb35c4": "confirmations(address)", +"4ecb5e79": "IamGROOT()", +"4ecb8d0f": "transferOwnershipSend(address)", +"4ecc6eab": "setDefaultBuyerLastPaidAt(uint256)", +"4ecc7f59": "assignPreicoTokens()", +"4ecd4aa9": "createRequestAsPayeeAction(address[],bytes,int256[],address,bytes,string)", +"4ecd73e2": "DistributeDividends(uint256)", +"4ecd81b3": "redeemUTXO(uint256,bytes32[],bytes,bool,uint8,bytes32,bytes32,address)", +"4ecdf165": "rareIdRange()", +"4ece90a8": "getERC20()", +"4ecf77d3": "getUnfinishedGames()", +"4ed0694f": "kkICOTest77()", +"4ed0efd1": "selfdestructs()", +"4ed250bf": "freezeTime(uint256,uint256)", +"4ed3881e": "setTokenTransferIdentifier(string,bytes4)", +"4ed3885e": "set(string)", +"4ed4831a": "all(bool[7])", +"4ed4d42a": "transferTokenAddress(address)", +"4ed577bb": "IssuedToken(string,string,uint256,uint256)", +"4ed600d1": "confirmVestingSchedule(uint256,uint256,uint256,uint256)", +"4ed767a1": "totalFinalised()", +"4ed7cb10": "XXXXXXXX10(address)", +"4ed8579e": "setGPSMaxEth(uint256)", +"4ed87713": "ADVISORS()", +"4edac8ac": "num_claimed()", +"4edba7bf": "adapterEnabled()", +"4edbca6e": "getCategory(uint256,uint256)", +"4edbe9f7": "MintCommandBonus()", +"4edc689d": "allowAddress(address,bool)", +"4edc8ccf": "registerEIP777Interface()", +"4edccd31": "replace_square(uint256,bool,uint256,address)", +"4edce4e1": "push(int256,bool)", +"4edd0d07": "setConsumeTokenAddress(address)", +"4edd74e8": "reservesBalance()", +"4eddbd8d": "getCurrentPrice(uint128,uint128,uint24,uint64)", +"4eddcf5b": "setReleaseBlockNumber(uint256,uint256)", +"4ede23c8": "addressNotNull(address)", +"4edefd31": "setExpireDelay(uint256)", +"4edefe83": "doBroadcast()", +"4ee0ab0d": "forceEnd()", +"4ee0b9a9": "DaoHubVerify()", +"4ee0cb8a": "CutieBit()", +"4ee0cd98": "setFundMintingAgent(address)", +"4ee0d066": "setTotalsContract(address)", +"4ee16aba": "contributeToPurse(uint256)", +"4ee1d045": "secPerBlock()", +"4ee29ec5": "getNumberOfAssertions(uint128)", +"4ee2a3df": "setTargetDiscountValue2(uint256)", +"4ee2cd7e": "balanceOfAt(address,uint256)", +"4ee3659d": "AGC()", +"4ee3ad07": "HareemCoin()", +"4ee3c579": "DurioToken(string,string,uint8,uint256)", +"4ee3dc91": "publicToken()", +"4ee4d731": "enableMETTransfers()", +"4ee4d8fa": "isGlobalConstraintRegistered(address,int256,address)", +"4ee51a27": "airdropTokens(address[])", +"4ee67d33": "Etheradium()", +"4ee7ca3a": "erc20FOBS(string,uint8,string)", +"4ee9eb70": "InformRebuyTo(uint256,address)", +"4eea636f": "GROWCHAIN(uint256,string,string)", +"4eea9a8d": "withdraw2(address)", +"4eec0185": "aomracoin()", +"4eec44b4": "beforeBalanceChanges(address)", +"4eeca076": "Counter()", +"4eecafdb": "ifEndGetting()", +"4eed8a45": "LogTokenAllocation(address,uint256,uint256)", +"4eed965e": "_createGame(string,address,uint256)", +"4eee121f": "setOrCacheTargetReporterGasCosts(uint256)", +"4eee424a": "removeClaim(bytes32)", +"4eee59b3": "guess(string)", +"4eee8c25": "tokenBuyCost()", +"4eee966f": "setTokenInformation(string,string)", +"4eeea29d": "transferPreSaleBalance(address,uint256)", +"4eeedef1": "BCALAttToken()", +"4eeee8ac": "updateFighterBattleStats(uint256,uint64,uint16,uint64,uint16,uint16)", +"4eef440c": "bonusLevel0PercentModifier()", +"4eef683d": "PALAIR()", +"4ef02cf3": "preicoEndDate()", +"4ef05de3": "evacuate()", +"4ef1a23a": "manualInsuranceResolution(bytes32,uint8,bytes32)", +"4ef20030": "_setTokenMeta(uint256,bytes)", +"4ef37628": "getChallengeNumber()", +"4ef39b75": "finalize(address)", +"4ef3f235": "changeMaintenanceTime(uint256,uint256)", +"4ef45cac": "Announcements()", +"4ef50711": "apply4Redeem(uint256)", +"4ef5710a": "WatchNumberOfPlayerInCurrentRound()", +"4ef65c3b": "setUint(uint256)", +"4ef6b8ce": "Certificate()", +"4ef8086a": "switchManagerAndRemoveOldOne()", +"4ef83a70": "withDrawEth(uint256)", +"4ef85140": "CAOsale(uint256,uint256,string,string)", +"4ef8885f": "getSocialAccountPw(bytes32,bytes32,bytes32)", +"4ef8ff33": "MIN_INVESTMENT()", +"4ef94e34": "setMilestones(uint32[],uint8[],uint32[])", +"4ef98616": "CelebsPartyGate()", +"4efa45a1": "addAddressSetting(string,address,address,address,string)", +"4efb023e": "totalModerators()", +"4efb04ff": "created_contracts(address)", +"4efb7296": "updatePlotData(uint256,string,string)", +"4efbb734": "PublisherRegistryReplaced(address,address)", +"4efbe933": "buyForHackerGold(uint256)", +"4efc067f": "getAuraValue(uint256)", +"4efcc69e": "ExMoneyToken(uint256,string,string,address)", +"4efd0848": "_refreshVoteForVoter(address)", +"4efd1551": "add(address,address,uint256,uint256)", +"4efd9e2c": "updateMinContribution(uint256)", +"4efdd4f9": "viewUnclaimedResearchDividends()", +"4efddcd9": "artWorkChangeByAdmin(uint256,string,uint256)", +"4efeb2cf": "crowdDistribution()", +"4eff13dc": "OFFER_SIZE()", +"4eff86e7": "RBFToken(uint256,string,string)", +"4f0016d0": "endContract(uint256,uint256,uint8,bytes32,bytes32)", +"4f002522": "set_creature_builder(address)", +"4f011d9d": "getIntermediary(uint256)", +"4f013184": "investInTheSystem()", +"4f013ea6": "_THOUSAND()", +"4f01541e": "setReceiverAddress(address,address)", +"4f01d77e": "manual_lottery(bytes32)", +"4f02c420": "minted()", +"4f03c340": "proposeTx(address)", +"4f046439": "updatePurchaseSize(uint256)", +"4f04a36e": "setDesignatedReportPayoutHash(bytes32)", +"4f04af35": "CORReserveAllocation()", +"4f052648": "XaurumDataContract()", +"4f052b82": "UNLOCK_OUTINGRESERVE()", +"4f057506": "Limit()", +"4f059a43": "getClaimAmountForBlock()", +"4f062c5a": "getTier(uint256)", +"4f065672": "Start(string,bytes32)", +"4f0693a1": "BONUS_LATCH()", +"4f069517": "removePublicSalesSpecialUser(address)", +"4f07307b": "setLoanCreator(address)", +"4f073130": "takeOrder(bool,uint256,uint256)", +"4f07a663": "close(address,uint32,uint192,bytes,bytes)", +"4f07b5f0": "startSale(uint256,uint256,uint256,uint256,uint256,address)", +"4f07cc4f": "ETH_MIN_LIMIT()", +"4f082843": "enableChain(uint256)", +"4f084c0c": "payLast(uint256)", +"4f089298": "Etch(bytes32)", +"4f089898": "updateBlackListTrader(address,bool)", +"4f090ab4": "burnPrimordialToken(uint256)", +"4f0913ef": "MANHATTANPROXY6THST()", +"4f092510": "allowIgnoreTokenFallback()", +"4f09cfc5": "changeDiviRate(uint256)", +"4f09eba7": "proxyApprove(address,uint256,bytes32)", +"4f0a195e": "totalBasicIncome()", +"4f0a746f": "blacklistAddress(address,address)", +"4f0a97b9": "test_basicThrow()", +"4f0b0deb": "gameCreate()", +"4f0b584e": "getCCH_edit_18()", +"4f0b8374": "addToPrivilegedList(address)", +"4f0b9a2b": "KarTokenERC20(uint256,string,string)", +"4f0c563f": "depositBonus()", +"4f0ca055": "getMiniPoolEdit_5()", +"4f0cae88": "balanceThis(address)", +"4f0cc59d": "swapID(address,bytes32,uint256)", +"4f0cd27b": "getCount(address)", +"4f0cdd29": "getAddressByUserName(string)", +"4f0cf7e1": "fillTradesInfo(bytes32,uint256,uint256[])", +"4f0d8533": "addNewStreetType(string)", +"4f0ddd27": "getTemplate(string,string)", +"4f0e3333": "wedaddress()", +"4f0e3dad": "USD_GOAL()", +"4f0e760a": "_takeOwnershipOfTokenFrom(uint256,address)", +"4f0e8656": "showAdmin()", +"4f0eaf96": "oraclizeCallbackGas()", +"4f0f4aa9": "getNode(uint256)", +"4f0f539e": "getActiveMessage()", +"4f0f97ab": "TokenForSale()", +"4f1069ad": "serchIndexByAddress(address)", +"4f10a0bd": "_createAvatar(string,address,uint256)", +"4f10acc1": "updateGoldFeeData(uint256)", +"4f1157aa": "EtheriumWall(string)", +"4f118ad7": "GenericToken(string,uint8,string,uint256)", +"4f11ca65": "distributeTeamTokens()", +"4f11e07d": "getProof(address,uint8,bytes32)", +"4f1243d7": "pepsToken()", +"4f139314": "compensateLatestMonarch(uint256)", +"4f13e130": "fightAsuriMonster()", +"4f13fc0a": "setCompte_30(string)", +"4f150787": "batchFillOrKillOrders(address[5][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[])", +"4f161245": "getUIntValue(string)", +"4f162f8f": "icoEndTimestampStage4()", +"4f18d6fb": "BITAD()", +"4f190ed2": "changeDekzAddress(address)", +"4f192fa3": "MajestyAssetsJunction()", +"4f197ee7": "transferPackageOwner(string,address)", +"4f19e977": "INVALID_ORDER_SIGNATURE(bytes32)", +"4f1a5b86": "tokenReserved1()", +"4f1a7678": "getInsuranceDataByID(uint64)", +"4f1a892b": "setSectionForSale(uint256,uint256)", +"4f1ae61a": "releaseFeesAndBountyJM(address,uint256)", +"4f1afb63": "ownerforce()", +"4f1b2d4f": "toBool()", +"4f1bbc4d": "SuccessAuctionEvent(address,address,uint256,uint256)", +"4f1c3417": "getSpawnProxy(uint32,int256)", +"4f1c3b66": "setAccountData(address,uint8,bytes32)", +"4f1c8d0f": "milkBalanceOf(address)", +"4f1d38c0": "activeCrowdsalePhase3(uint256)", +"4f1d76ef": "buyabletoken()", +"4f1e0d0b": "getGoldInfoCustodian(address)", +"4f1e4334": "setMinBalanceForContractCreation(uint256)", +"4f1ea770": "bc(uint256,address)", +"4f1eb4b2": "proposalInProgress()", +"4f1ef286": "upgradeToAndCall(address,bytes)", +"4f1f421b": "SuMain()", +"4f1f99aa": "changeOzreal(address)", +"4f1fa7ef": "streamityContractAddress()", +"4f20f35a": "payExpenses(address,uint256)", +"4f219ceb": "getPlayRate(uint256,uint256)", +"4f223fe3": "StatefulFactory(string,string,string)", +"4f224baa": "setMetaBaseUrl(string)", +"4f2253d4": "addStudent(string,string,string,bytes32)", +"4f22bcf8": "allocationAddressList(uint256)", +"4f232f77": "transferFromRoot(address,address,uint256)", +"4f238029": "getSaleAuctionAddress()", +"4f23cce0": "ownerBetsCount(address)", +"4f23e50a": "defineReward(string,address,uint256,uint256)", +"4f24186a": "newProposal(string)", +"4f242cde": "startICO(uint256,address)", +"4f245ef7": "auctionStart()", +"4f248409": "endICO()", +"4f24e471": "numRewardsAvailableSetForChildAddress(address)", +"4f255b80": "getCharacterIndex(uint32)", +"4f256693": "addFile(bytes32,bytes32)", +"4f2578ba": "getVestedFounderTokens()", +"4f25a319": "PUBLICSALE_STARTTIMESTAMP()", +"4f25d6dd": "solveTime()", +"4f25ec6e": "_transferFee(address,uint256,address)", +"4f25eced": "distributeAmount()", +"4f26ef80": "buyAd(uint256,string,string)", +"4f271740": "UNFREEZE_DATE()", +"4f27869e": "defaultExit(uint256,bytes,bytes32,bytes,bytes,bytes32,bytes,bytes)", +"4f27ce68": "setSlogan(uint64,string)", +"4f27de64": "ByteExtractor()", +"4f28216a": "lowContributionAward(address)", +"4f284594": "info_TotalSupply()", +"4f28af6a": "handleBet(uint256)", +"4f28c443": "AIRDROP_TOKENS_PERCENT()", +"4f297b2b": "TokensGiven(address,uint256)", +"4f2989af": "indexExists(bytes32)", +"4f2996ab": "getBalanceByEscrowId(uint256)", +"4f2af869": "lastCalculatedToken()", +"4f2b0e41": "preSaleFund()", +"4f2be91f": "add()", +"4f2c9196": "getUsedBySoftwareLength()", +"4f2cc469": "transferZeroTokensTest(address)", +"4f2cd9cc": "auditConfirm()", +"4f2d7ab5": "contributionMinimum()", +"4f2eebc3": "PreSaleStartTime()", +"4f318dd8": "confirmVestingSchedule(uint256,uint256,uint256,uint256,uint256)", +"4f31cc51": "frozenTokenTransfer(address,uint256,uint8)", +"4f31e3ec": "minRoundSize()", +"4f32c65b": "emitFuture(bytes32,uint256,uint256,uint256)", +"4f32de0a": "request_payout_holder()", +"4f33428a": "setConsolationRewardsRequiredFaith(uint256)", +"4f33a013": "artHash()", +"4f346a7d": "emit(address,uint256,uint256)", +"4f348b46": "getTokenAmountOnAdd(uint256)", +"4f3655a8": "verifyBet(uint256,uint256)", +"4f36fbdc": "setMinMaxPriceInWei(uint256,uint256)", +"4f36fec8": "hardCapSale()", +"4f3741b5": "RateChanged(address,uint256,uint256,uint256)", +"4f37edfd": "burnAndRetrieve(uint256)", +"4f383934": "setMyTokenList(address[])", +"4f39ca59": "drop(bytes32)", +"4f3b1fb6": "unlock(string,address,bytes32,string)", +"4f3b8938": "mythexTokenAddress()", +"4f3bb920": "lockDownPeriod()", +"4f3c1542": "getMarginRatio()", +"4f3d057a": "push(string)", +"4f3d1416": "SetOriginator(string,string,string,string,string,string,string,string,string,address,string)", +"4f3d1c27": "setLpMaxVolume(uint256)", +"4f3d3003": "participantRoundValue(address,address,uint256)", +"4f3d520c": "getClearance(address)", +"4f3ded8a": "getFinalPaymentAmount()", +"4f3df0a8": "getRemainingTimeOf(uint256)", +"4f3f2cbc": "changeFeeModifiers(address)", +"4f3f4211": "awardDailyLottery(address,uint256)", +"4f3f5746": "participatingIn(address)", +"4f3fc162": "removeOriginByIndex(uint256)", +"4f3fd173": "get10Animals(uint16)", +"4f3fed94": "tokenIncrease()", +"4f4027d0": "SHAREHOLDERS_SHARE()", +"4f4200e5": "setAddressOfERC20Token(address,address)", +"4f424da3": "Bounties_Wallet()", +"4f438a12": "provideTransactionFeedback(uint256,uint8,bytes32)", +"4f438ddb": "changePercent(uint256,uint8)", +"4f44728d": "ownerChangeOwner(address)", +"4f4522b0": "getIntelligenceValue(uint256)", +"4f452b9a": "isStormBirdContract()", +"4f4548f9": "registerAudit(bytes32,bytes,bool)", +"4f45779f": "mintTokensWithinTime(address,uint256)", +"4f45c308": "DocumentSigned(uint256,address)", +"4f466ce6": "TOTAL_T8EXTOKEN_SUPPLY()", +"4f4821e1": "createGiftTemplate(uint256,uint256,string,string)", +"4f48e46d": "get_all_payment(uint256)", +"4f494cad": "createAuction(uint256,uint128,uint128)", +"4f495513": "privateSaleTokens(address,uint256)", +"4f4a69c8": "TestTokkSale()", +"4f4a6a66": "GovernanceDelOwner(address,address)", +"4f4b30ba": "dropManualState()", +"4f4b890a": "getCET6ById(uint32)", +"4f4cd650": "getAllTellers()", +"4f4d022b": "upgradeQualificationByTokens()", +"4f4d4728": "offeringEnded()", +"4f4df442": "approve(address,uint256,uint256,uint256)", +"4f4e1b74": "founderSwitchRequest(bytes32,bytes32)", +"4f4e47f1": "stopAirdrop()", +"4f4ec991": "PubToken(uint256)", +"4f4ef121": "firstBonusSalesEnds()", +"4f4f23ef": "SundayFundayToken()", +"4f4fa5a6": "removeReferral(address)", +"4f501f27": "changeOuts(address,address,address)", +"4f504d72": "getBalanceInPlay()", +"4f50ef53": "allBids()", +"4f511102": "setDeveloper(address,address)", +"4f51bf46": "getBidIdList()", +"4f52b2bc": "findLockupIfCTD(address)", +"4f52ccfa": "beneficiary1()", +"4f53126a": "pauseGame(bool)", +"4f538ae1": "rain(address[],uint256)", +"4f53e83e": "smartProperty(uint256,string,uint8,string,address,uint256,uint256,uint256)", +"4f54f4d8": "getMatchDetails(bytes32)", +"4f5539c0": "SetPrice(uint256)", +"4f556b23": "onceoutTimePer()", +"4f558e79": "exists(uint256)", +"4f55f292": "convertIntoHtlc(bytes32,address,uint256,uint256,uint256,bytes32)", +"4f573cb2": "withdrawRevenue()", +"4f57641c": "getHorse(uint256)", +"4f58704c": "ARI()", +"4f58d5c9": "getTokenUSDRate()", +"4f5963fb": "calculateYourValueEven(uint256)", +"4f5a4eb9": "setAssetOwner(uint256,address)", +"4f5af739": "getBirthTime(uint256)", +"4f5b3318": "dateEndIco()", +"4f5b9f23": "power2(uint256,uint256,uint32,uint32)", +"4f5ba601": "airdropOn()", +"4f5c6e0a": "bonusOne(uint256)", +"4f5d06c2": "getPurchasePrice(uint256,uint256)", +"4f5d5295": "chairBalance()", +"4f5e6a8d": "whitelistedTransfer(address)", +"4f5f560a": "founderOf(uint256)", +"4f5fca97": "LimitEther()", +"4f5fcb34": "authorize(string)", +"4f6065e0": "get_presale_arbits_total(address)", +"4f60ae2e": "DividendReceived(address,uint256)", +"4f60f334": "multiAccessAddOwner(address)", +"4f610e74": "getDeclaration()", +"4f617b81": "unsetSectionForSale(uint256)", +"4f61db15": "VEGAS()", +"4f61ff8b": "kyberNetworkContract()", +"4f6247f8": "setThirdAddressBalance(address)", +"4f645993": "lastMiningBlock()", +"4f64808d": "createCustody(address)", +"4f64aa09": "advisorsLock()", +"4f64b2be": "tokens(uint256)", +"4f653f09": "_scheduleTournament()", +"4f655a61": "setMinimum(uint256,bool)", +"4f65cc3c": "ethToTokens(uint256,bool)", +"4f66a8ec": "getVotingData(uint256)", +"4f6716d3": "whitelistAddressArray(address[])", +"4f674164": "addBookSigner(bytes16,address)", +"4f67498e": "updateUSeqIndex()", +"4f6754d7": "tenEndTime()", +"4f67bd9e": "numberFor(uint256)", +"4f67fe22": "LOG_OwnerAddressChanged(address,address)", +"4f69dd3d": "triggerWithdraw(address)", +"4f6a441c": "getRandom8(uint8,uint8)", +"4f6a461a": "CatalogPlayers()", +"4f6acaa1": "getLedgerCount(string)", +"4f6adf48": "setPayOuts(uint256,string)", +"4f6b1a70": "vuePayETHDestination()", +"4f6b472d": "tokenSupplies()", +"4f6c3372": "CrowdSale_Halt()", +"4f6c63ea": "TeamRegistered(string,address,string,bool)", +"4f6c87fb": "STARTToken()", +"4f6cb43f": "advisers()", +"4f6ccce7": "tokenByIndex(uint256)", +"4f6d04e7": "createSeedCollectible(uint8,uint8,uint256,address,uint256,uint256,uint256)", +"4f6d150d": "LuvCoin(uint256)", +"4f6d20a9": "getRewardForAddress(address,address)", +"4f6d3aed": "refundGas()", +"4f6d97ed": "MakeTransaction(address,uint256,uint256,string,string,uint8)", +"4f6d9e16": "_settleAndRestart()", +"4f6dcf74": "PoS()", +"4f6de652": "_getDepositedOrderDetails(uint256,address)", +"4f6de831": "testComplexCombination()", +"4f6fcc46": "getAirdropList()", +"4f7035b4": "DeleteAllRequests()", +"4f7132c0": "TokenDemo(uint256,string,uint8,string)", +"4f71473e": "withdrawAll(address,address[])", +"4f71ef81": "parse(bytes32)", +"4f72e1c3": "buyChamp(uint256)", +"4f731087": "checkTokenBalance()", +"4f734965": "setBBDPrice(uint256)", +"4f73928a": "setComment(bytes3,string)", +"4f739ff0": "addHouseStake()", +"4f73b7fa": "EthernityFinancialOracle()", +"4f73b8e6": "STAKE_BONUS_MIN_THRESHOLD()", +"4f73f1f8": "withdrawToAdress(address,uint256)", +"4f73f71d": "getOwlmasterReq()", +"4f7474cb": "closeAnnouncement(uint256)", +"4f74acfe": "buyEggs()", +"4f74d4f6": "ftechiz()", +"4f755fe7": "financialAccount()", +"4f75af3a": "tokensSuppliedFromReferral()", +"4f75c464": "startExit(bytes32[],uint256)", +"4f75e930": "UNLOCKINTERVAL()", +"4f7666a9": "VisionG8()", +"4f76a077": "addInvestorToWhiteList(address)", +"4f76c87c": "createSportEvent(string,uint8,uint256)", +"4f76cb02": "testGetBitFailIndexOOB()", +"4f772420": "changeFundContract(address)", +"4f779753": "DimaCoin()", +"4f77feec": "getPositionInterestRate(bytes32)", +"4f79409f": "LogBuy(address,uint256)", +"4f7ac7ab": "toteLiquidatorWallet()", +"4f7aede9": "add(uint8,address,uint256)", +"4f7baec0": "test_mint(int256)", +"4f7c6552": "calcDividends(address)", +"4f7cd683": "setReportRegistrationFee(uint256)", +"4f7d4951": "addVIP(address)", +"4f7d5de9": "setTimeRC(uint256,uint256)", +"4f7d87ac": "PoiseToken()", +"4f7dad6a": "buyToken(uint256,string,string)", +"4f7e7086": "iconiqToken()", +"4f7eb571": "getHowMuchUntilHardCap_(uint256)", +"4f7fc13f": "CLIENT_TIME_TO_DECIDE()", +"4f801270": "releasableBalanceOf(address)", +"4f802f8a": "unagreeAmendment()", +"4f803516": "getOrCreatePreviousPreviousFeeWindow()", +"4f8115a2": "tokensAddress(uint256)", +"4f817a2a": "tInstance()", +"4f81b930": "_sendFunds(address,uint256)", +"4f829ee8": "set2(uint256,uint256)", +"4f82ff41": "isCertified(uint256)", +"4f83fe64": "timeLocked(address)", +"4f840761": "demandTrial(uint256)", +"4f840c2b": "setMigrateToAddress(address)", +"4f8411e5": "_approvedFor(address,uint256)", +"4f851d73": "BineuroToken()", +"4f85769a": "closingTimePeriodOne()", +"4f8632ba": "user()", +"4f868b94": "etherSince20()", +"4f86bde2": "BuyFromFollower(address)", +"4f879ff0": "StackLottery()", +"4f883783": "CheckProofOfOwnership(bytes32)", +"4f88cc3c": "returnAllPollStakes(bytes32)", +"4f895031": "finalizeSale(uint256,uint256,uint128)", +"4f896d4f": "resolve(uint256)", +"4f8b9e64": "getBuyersList()", +"4f8c2a8a": "block02w()", +"4f8d40e1": "closeTournament(bytes32)", +"4f8da1fe": "RewardWallet(address,address,address,uint256)", +"4f8dd40a": "getOpinion(uint256)", +"4f8e2fdf": "LinkToken()", +"4f8e624e": "Greeter(string)", +"4f8fb544": "erc223Received(address,uint256,address,uint256)", +"4f8fc8ef": "setNonceForPublicKeyX(uint256,uint256)", +"4f8fe6a4": "THREE_YEAR_KEEPING()", +"4f8ffd1f": "set_contrib_arbits_min(uint256)", +"4f9000a0": "nextPrizePoolPercent()", +"4f932d44": "_generateIdentity(uint256,uint256,uint256,uint256)", +"4f935945": "capReached()", +"4f93995d": "saleNotEnd()", +"4f93b9e8": "setCommunityLock(address)", +"4f945a8a": "transferOwnCoins(address,uint256)", +"4f9559b1": "cancelOrdersUpTo(uint256)", +"4f958146": "LongLegs()", +"4f95a04b": "ethTransfer(address,uint256)", +"4f95ddec": "shopStorePrice()", +"4f95e960": "getTotalDropsOf(address)", +"4f961a6b": "RATE_TIER3()", +"4f962b72": "setPriceRate(uint256,uint256)", +"4f9660ed": "sendToTeam()", +"4f968868": "PauseTokenContract()", +"4f96ab8e": "retrieveUportInfo()", +"4f96baf1": "createNewAccount(address)", +"4f96bc00": "records(bytes32,uint16,bytes32,uint16)", +"4f96cddd": "calculatePreBonus(uint256)", +"4f96decf": "migratePlayerData1(uint256,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"4f96e039": "waitingOracles()", +"4f96f446": "tier1LOT()", +"4f96fba7": "setAuditAssignBlockNumber(uint256,uint256)", +"4f97f97f": "lastCrowdsale()", +"4f9899c3": "PythonCoin()", +"4f990ef0": "card2PowerConverterSingle(uint256)", +"4f995d08": "getPeople()", +"4f996a07": "callerDel(address,address)", +"4f99a96e": "getBorrowingItemByObjId(uint64)", +"4f99b7c5": "currentDate()", +"4f99b82d": "setBurntWalletAddress(address,address)", +"4f9b7bc8": "totalTokensSale()", +"4f9bf601": "totalTxFeePercent()", +"4f9bfdac": "OVISBOOKED_BONUSTOKENS()", +"4f9c5253": "Store(string)", +"4f9c5bf3": "airdrop_percent()", +"4f9d482a": "HALF_TIME()", +"4f9d719e": "testEvent()", +"4f9da09f": "getAddressByIdSorteo(int256)", +"4f9de158": "_sendTokens(address)", +"4f9e01c3": "OCCT()", +"4f9ea1c3": "flightDone(uint32)", +"4f9ebe09": "getDonationPrice()", +"4fa037c4": "setTokenMintFeeProp(address,address,uint256)", +"4fa07325": "adddraw(uint256)", +"4fa0a4b7": "_getCanvas(uint32)", +"4fa10cfc": "getdata()", +"4fa11dd2": "setAirdorpList(address[],bool)", +"4fa20a52": "isDelayed()", +"4fa232fe": "getIcoDeflator()", +"4fa2cb50": "solved(string,string)", +"4fa3d029": "setSTFactory(address)", +"4fa3eeff": "withdraw3()", +"4fa406ee": "BeforeChipCost(uint32)", +"4fa43991": "getArtistTrack(bytes32,address)", +"4fa48a88": "isSameDay(uint256,uint256)", +"4fa4a531": "getbackTB(uint256)", +"4fa4d01a": "_averageSalePrice(uint256,uint256)", +"4fa519fa": "setValue()", +"4fa65d58": "WRLToken()", +"4fa679d8": "forward(uint256)", +"4fa6a6d5": "crowdSaleStartTimestamp()", +"4fa6caf6": "getSigner(bytes32,uint256)", +"4fa6cde4": "requestEthUsd(uint256)", +"4fa7e353": "pledgeFees(uint256)", +"4fa87fd3": "frozenFunds(address,uint256)", +"4fa88720": "setBypassStatus(address,bool)", +"4fa972e1": "maxSupplyForEra()", +"4fa99402": "spinnerCountsByType(uint256)", +"4fa99dd0": "Matching_Ethers()", +"4fa9b5d5": "seed_base_token()", +"4fa9e4dc": "getArticlesOwn()", +"4faa2d54": "getTimeElapsed()", +"4faa8a26": "depositEtherFor(address)", +"4fab2035": "newSchellingRound(uint256,uint256)", +"4fab2ca4": "testGetFrontend()", +"4fac7e41": "getOwnedTokenIds(address)", +"4fac9c65": "bonussale_WeiRaised()", +"4faca8f4": "sendTokenTeamAdvisor(address,address)", +"4fad404a": "confirmProposal(string,uint256)", +"4fad5c8a": "depositAgent(uint256,uint256,string,string)", +"4fad96dd": "DST_ICO()", +"4fae3254": "setMaxAuditDuration(uint256)", +"4faea4d6": "FrankTestToken1()", +"4faed396": "checkVotingForSendWeiFromExchange()", +"4faf9420": "airdropFor(address)", +"4fafee40": "lottoPrice()", +"4fb057ad": "ContractInstantiation(address,address)", +"4fb0a3cd": "claimTeamReserve()", +"4fb0d95e": "getLocalBountyBalance(uint16)", +"4fb19db5": "dollarCost()", +"4fb2e45d": "transferOwner(address)", +"4fb30d8b": "txs()", +"4fb31a6a": "replaceProto(uint16,uint8,uint8,uint8,uint8,uint8,uint8)", +"4fb320b2": "setClaimRate(uint256)", +"4fb34523": "deployStepFour()", +"4fb3d3b1": "getUserHistory(address)", +"4fb3fef7": "totalExecutedPerDay(uint256)", +"4fb46d5c": "getRoundStatuses(uint16)", +"4fb4bcec": "step5()", +"4fb4e833": "entryStorage(bytes32)", +"4fb4f5a3": "ETHMCoin()", +"4fb55858": "setTargetDiscountValue4(uint256)", +"4fb67111": "utfStringLength(bytes4)", +"4fb764c9": "orders()", +"4fb7f1d7": "getPastWinnerAddresses()", +"4fb8843c": "getAllBonus()", +"4fba68c5": "pWhitelist(address)", +"4fbc7e11": "enableTokenWithdrawals(address,bool)", +"4fbcd6d5": "DepositFunds()", +"4fbd051d": "verifyCertification(address,uint256)", +"4fbda01f": "LogPenaltyDisbursed(address,uint256,address,address)", +"4fbe30d4": "changeTokenRate(uint256)", +"4fbea8ea": "approveKyber(address[])", +"4fbf6e9f": "getFish(uint32)", +"4fbf6fbb": "getMultiRequestLastRequestId(uint256)", +"4fc09275": "tokenOfCreatorByIndex(address,uint256)", +"4fc0ee17": "setCreditMCCurator(address)", +"4fc28f68": "getUndistributedBalanceOf(address,uint256)", +"4fc2d3be": "setBaseExchangeRate(uint256)", +"4fc3f41a": "setCooldown(uint256)", +"4fc4b5a0": "highEtherBonusValue()", +"4fc573c7": "addrDevelopment()", +"4fc59e6b": "set_Rate(uint256)", +"4fc5a549": "StartAuction(string,uint256)", +"4fc63e02": "ExToke(address,address,address,uint256,uint256,uint256)", +"4fc78cf1": "add_reward()", +"4fc7a47d": "extra_time_bought()", +"4fc84791": "senderAddress()", +"4fc91633": "setNotLessThan(uint256)", +"4fc9584a": "messageSpanStep()", +"4fc9c91a": "identityOf(bytes32)", +"4fca3159": "rawBuy(bytes32)", +"4fca329a": "drawBookLotto()", +"4fcaadae": "_createDivCard(string,address,uint256,uint256)", +"4fcb2968": "kingSpirit()", +"4fcb9e2f": "getLastPayoutDate()", +"4fcc30d9": "AuctionSuccessful(uint256,uint256,address)", +"4fcc9e07": "getDynamicArraySize()", +"4fced032": "OneKeyToken(uint256,string,string)", +"4fcf1f39": "revealWinner(string)", +"4fcf8210": "eraseRecord(bytes32)", +"4fd0fcb6": "partnerAmountLimit(address)", +"4fd1519c": "getValidDurationBlocksData()", +"4fd23dd4": "transferMulti(address,address,address,address,address,address,address,address,address,address,uint256)", +"4fd2ee52": "getTargetContactPubKey(bytes32,address)", +"4fd394ba": "getMax(uint128[])", +"4fd3d125": "onlyAdminsCanDoThis()", +"4fd42e17": "_setLiquidationIncentive(uint256)", +"4fd4dbaa": "_emitError(bytes32)", +"4fd61333": "DataChanged(bytes32,address,string,string)", +"4fd6194d": "setup(string,address[])", +"4fd64591": "tokenClient()", +"4fd6b325": "test_5_generateSecondAccountBalance_increaseBlocksBy1000()", +"4fd6e8ac": "andTheWinnerIs()", +"4fd6ff6e": "CROSAIR_SHIP_PRICE()", +"4fd7718b": "firstStageDuration()", +"4fd798b1": "TsingDaToken()", +"4fd81926": "setMaxDividendDepth(uint256)", +"4fd839c6": "getRabbitDNK(uint32)", +"4fd8411c": "AddressChangeRequested(address,address)", +"4fd88a1c": "spendFunds(address,uint256,string)", +"4fd9c9ac": "ExposureClosed(bytes32,address,uint256,uint256)", +"4fdb7c47": "RtbRpay(address,uint256)", +"4fdb91ab": "TOKEN_AMOUNT_ICO_STAGE1_PRE_SALE1()", +"4fdbe2c3": "changeFoundationAddress(address,string,address)", +"4fdc1a70": "icoCore(uint256)", +"4fdc4295": "_offerCanvasForSaleInternal(uint32,uint256,address)", +"4fdc53f6": "setTokenOwner(address,uint256)", +"4fdc5f65": "LiverpoolvsManCity()", +"4fdcd18d": "setHistory(address,uint256,uint256,uint256,uint256,uint256,string,string)", +"4fdd228d": "ownerOfPosition(bytes32)", +"4fde7cd9": "tokenToFounder()", +"4fdf4c9a": "Icebox(uint256)", +"4fdf64ce": "totalBorrowingItem()", +"4fdf8a03": "VLTMultisig()", +"4fdfcd42": "removeBytes32s(bytes32[])", +"4fe01d38": "setTokenReward(uint256)", +"4fe06988": "toTimestamp(uint256,uint256,uint256)", +"4fe0bd1e": "fundsAvailable()", +"4fe0ff1a": "submitInitialMerkleState(bytes32,uint64,bytes32[],uint256[],uint256,uint256,bytes32,uint256[2],bytes32,bytes32,uint8)", +"4fe2e15a": "checkTicket(uint256,uint256)", +"4fe2f085": "INVESTORS_TOKENS_RESERVED()", +"4fe47cb4": "emitStoreAndPay()", +"4fe47f70": "setMaxAmount(uint256)", +"4fe4a909": "returnToken(address,address,uint256,uint256)", +"4fe50bc6": "baseTokenGetRate()", +"4fe51ee6": "ValkyrieNetwork()", +"4fe5c2b4": "Vidnix()", +"4fe5f587": "CCXToken()", +"4fe61b9e": "disableBonus()", +"4fe6adb4": "NewToken(string,string,string,address)", +"4fe71e95": "withdrawUserReward()", +"4fe72439": "DEVELOPER_SUPPLY()", +"4fe7940b": "show_Balance_available_for_Sale_in_ETH_equivalent()", +"4fe81ffd": "artistsArtworks()", +"4fe82444": "addEthContribution(address,address,uint256)", +"4fe85563": "RAGTOKEN()", +"4fe87fe0": "FundsWithdrawnEvent(address,address,uint256)", +"4fe8b1a8": "changesoldierreplenishrate(uint256)", +"4fe8b4c1": "deleteData(uint256)", +"4fe8d03f": "bountyTokensTransferred()", +"4fe917fe": "reduceallmoney(address[],uint256[])", +"4fe9cc63": "InitHostBalance(address,uint256)", +"4fea572e": "ERC20Token(string,string,uint8)", +"4febb4f9": "WorldCupTeam(address,string)", +"4febe793": "NewText(string,string,address,uint256)", +"4fecf22d": "delegateManagement(address)", +"4fecf9cf": "Helex()", +"4fed1c94": "isTokenForSale(uint256)", +"4fed6a10": "teamTimelock()", +"4fed9a60": "Bonus(uint256,uint256)", +"4fedebf6": "numOfTeam()", +"4fee13fc": "startAuction(uint256,uint256)", +"4fee2437": "tokensaleStartTime()", +"4fee5360": "transferLike(address,uint256)", +"4fee63da": "securitiesOf(address)", +"4feeb18a": "priceQuerySent()", +"4ff0b071": "SILENT_Token()", +"4ff13571": "x2()", +"4ff1ddec": "TransactionConfirmedAfterExpiry(uint256,uint256)", +"4ff2bcb7": "getStageBonus(uint256,uint256)", +"4ff30c5f": "nextMintPossibleDate()", +"4ff3a989": "BLOCK()", +"4ff44fda": "_holding()", +"4ff45d73": "unapproveDisbursement()", +"4ff4ab6c": "ticketsOwners(address,uint256)", +"4ff57e9f": "airdropAndBurn()", +"4ff62627": "convertCore(address,uint256,uint256)", +"4ff6aa46": "deactivateTeam()", +"4ff6e86e": "getProviderPublicKey(address)", +"4ff7ff32": "withdrawERC20Tokens(address)", +"4ff92d6f": "getAssignedSupply()", +"4ffb01ce": "RemoveEvidence(bytes32)", +"4ffb32d3": "BlackSnailE()", +"4ffb861e": "_addAuthorization(address,address)", +"4ffc9204": "centralBankAddress()", +"4ffcd9df": "exchangeRates()", +"4ffcfefe": "m_weiBalances(address)", +"4ffd23a7": "sell(uint32)", +"50003ca6": "calculate(address)", +"5000a443": "jingZhiManager()", +"50010427": "bet(address,uint256,uint256,uint256)", +"50013a53": "LICERIOToken()", +"5001780b": "maxFundingGoal()", +"5001f3b5": "base()", +"50020560": "Accessible()", +"5002b2b9": "FusoraToken()", +"50035eb8": "getInUse(bytes20)", +"5003c2cc": "setPriceProgression(uint16)", +"5003c81d": "ERC223StandardTokenFactory(address)", +"5003d58f": "returnTokenBalance(address[2],uint256[8],uint8,bytes32[2])", +"5003e4d1": "Token(uint256,string,uint8,string,address)", +"5003efca": "extendedTokenCap()", +"50048174": "addItemLendingList(address,uint256)", +"5004e7a6": "CoinFast()", +"50050769": "changeRegistrationFee(uint256)", +"50051c20": "CELToken()", +"50058508": "getPubkey(address,address)", +"5005ba47": "setDestroyEnabled(bool)", +"50060f34": "getBatch(address,uint8)", +"5006bf0b": "internalExecuteDelegatecall(address,uint256,bytes)", +"5006e60a": "ownershipToCreator()", +"5007364f": "getLeaderboard(uint16)", +"50077f00": "jsonCat(string,string,uint256)", +"5007e47e": "getIntrospectionRegistry()", +"5007ec95": "IbzCoin()", +"5007ff15": "GridcubePlatformToken()", +"500844dd": "setTotalStakingHistory()", +"5008b7dd": "buyProduct(address,address,uint256)", +"5008cfcc": "votePerETH()", +"5008f699": "setRollover(uint256)", +"5009432d": "MAX_PRIVATE_FUNDING_SUPPLY()", +"500b6b3e": "calculationTotalSupply()", +"500b9426": "accountLocked(address)", +"500c6755": "DepositAmount(uint256,uint16)", +"500c6f21": "setManagementFeeChargePercentage(uint256,uint256)", +"500d22db": "setData_14(string)", +"500e73a4": "SSChainToken()", +"500e9eaa": "finishZeroDistribution()", +"500ec41b": "setAirState(bool)", +"50107c77": "addThing(string,bytes32,string,bytes32)", +"501146b4": "_updateNextPeriodPoints(address,uint256)", +"50114925": "transferDelegated(address,address,uint256,uint256,uint256,uint256,bytes)", +"50116afb": "decreaseAssetsCertified(uint256)", +"5011e399": "replaceSigner(address,uint256,uint8,bytes32,bytes32)", +"5012416f": "processAndCheckParam(string,address,uint8[],bytes32[],bytes32[])", +"50125546": "cancelRequest(bytes32)", +"50127418": "Question(address,string,uint256,uint256,string)", +"5012adca": "packInfo(address,bytes)", +"5012b772": "call_addr(address)", +"5012eb67": "trFee()", +"50133d50": "MinimumViableToken(uint256)", +"5013bb79": "TheTokenB()", +"50140fe5": "distributeBountyTokens(address,uint256)", +"50148ed2": "initEpochBalance()", +"5014a18e": "node_parent(uint256)", +"501578ca": "EntryAdded(bytes32,uint256,uint256)", +"50159de6": "ownerRemoveCeo(address)", +"5016128e": "isLock(address)", +"5016b9b1": "buyFromBlackMarket(uint256,uint256)", +"5016d29f": "refundedAmount(address)", +"5017f1f1": "constructor_()", +"50180944": "NEST()", +"50188301": "withdrawable()", +"5018a0fd": "withdrawAddr(address)", +"50192ae6": "test_31_assertGasUsage50Boards()", +"501957b8": "getManifest(address,bytes32,bytes32)", +"50197646": "rId()", +"501a4d68": "changeNameSymbol(string,string)", +"501a7a74": "uint256Min(uint256,uint256)", +"501b0b18": "receiveLoanOwnership(address,bytes32)", +"501bae76": "setr2VaultAddr(address)", +"501bfb60": "transferStampsToOwner(uint256)", +"501c5205": "_updateLandData(uint256,uint256,string)", +"501e3a2c": "_icoPercent()", +"501e8428": "getPart(bytes,uint256)", +"501fdd5d": "setSpecID(bytes32)", +"5020dcf4": "convertToEach(uint256,string,uint256)", +"5021051e": "setInflation()", +"50213c9f": "EXPERTS_POOL_ADDR()", +"502146db": "modify_addr(address)", +"5021783a": "addPerformer(address,string,uint8,string)", +"5021e534": "_dividendsSum(uint256[])", +"5022238f": "AVAILABLE_IN_PRE_SALE()", +"50228201": "getCollector()", +"5022d232": "CelebrityBreederToken()", +"5022e940": "experty()", +"50234173": "addNotary(address,uint256,uint256,string)", +"5023d124": "TestFactory()", +"50240158": "rejectContribution(address)", +"50240a34": "onLotteryInsurance(address)", +"502414e4": "marketMaker(string)", +"50248cd1": "ownerYHT()", +"50259cd3": "privatePreICOFreeBonusPercent()", +"5025b9ae": "expire(uint256,uint256,uint8,bytes,bytes,bytes)", +"5028594a": "setBlockDotGasLimit(uint256)", +"502a86bf": "gameGiftUserDayTimes()", +"502aa3b5": "usersList(uint256)", +"502b31d2": "splitEther()", +"502b8bda": "synths(bytes4)", +"502be15e": "unregisterByList(address[],bool)", +"502c9bd5": "userAddresses(uint256)", +"502cc114": "KittyToken()", +"502d7599": "IssueTokens(address,uint256,uint256)", +"502dadb0": "disableWhitelist(address[])", +"502e3b46": "EffectAdded(uint256,uint8[])", +"502f2dee": "sendFromTeamWallet(address,uint256)", +"502fe251": "getUidLastUpdate(string)", +"5030c325": "signBuyer(uint256)", +"503129c3": "ISC()", +"50312c9e": "checkContractBalance()", +"503248fe": "minPriceForMiningUpgrade()", +"5032f33b": "TokenLocker(address,address)", +"50357beb": "buyCard(uint256,address)", +"5036258b": "disableAddress(address)", +"50364825": "InsertImage(string)", +"503667bd": "_burnFor(address,uint256)", +"503687bc": "getTokenReleasePercentage()", +"5036d610": "Presale()", +"50372085": "isTokenContract()", +"503765c6": "LOCKTokenCOINLock(address,uint256,uint256,uint256)", +"50379b5b": "IPFSHashStore(uint256)", +"5037ec62": "changeDelay(uint256)", +"5038c9c5": "getListingAtPosition(uint64)", +"50391932": "findContractVersionByAddress(address)", +"503919b1": "unblockTokens(address)", +"50392bcc": "CleanFoodCrypto()", +"50395188": "tan_lian()", +"5039c62c": "inviteHandler(bytes32)", +"503a0ef8": "requestLoans(address,uint256)", +"503a3609": "mainSaleSecondStartDate()", +"503adbf6": "changeableToken(uint16)", +"503b64c0": "setRequestProcessed(uint256,uint256)", +"503c449f": "decreasePregnantCounter()", +"503c849e": "cashOutRate()", +"503caa1b": "performPayout()", +"503caa53": "phase2TokenPriceInEth()", +"503de95b": "newCash()", +"503e11de": "getAssetIdCargoArray(uint32)", +"503e9d33": "changeWeTrustSigner(address)", +"503eb429": "destEthFoundation()", +"503ef9fe": "changeFeeAmt(uint8)", +"50400128": "RiskPrice(uint128)", +"5040307c": "amountOfOrderQueue()", +"50405fdf": "setMemberLevel(address,uint8)", +"50409041": "_computeSalesCut(uint256)", +"5040c6e7": "HardCap()", +"50411552": "challengeWinnerReward(uint256)", +"50416b93": "batchClaim(uint256,uint256)", +"5041742a": "bidOnEthSiringAuction(uint256,uint256,uint8,bytes)", +"50428f84": "insertLastPlys(uint256)", +"504291f0": "maxToSell()", +"5042ffbe": "contributeInIco()", +"504321e0": "toTeamEthContract()", +"504334c2": "setNameSymbol(string,string)", +"50449d9d": "whiteListPreSaleDuration()", +"5044b112": "getChecksumCount()", +"50473c82": "deathData_f15()", +"50479065": "cancelCreation()", +"5047b337": "changeName(bytes16)", +"5047f867": "setAirdropParams(bool,uint256)", +"5049b238": "potentialWinner()", +"5049f497": "nominate(address,address)", +"504ac982": "transfer(string,string)", +"504b0ae8": "LOG_ValueIsTooBig()", +"504b122f": "readMulti(bytes32,bytes32[])", +"504b91b5": "GeishaCoin()", +"504b97ae": "getcertifieddata(uint256)", +"504bcde7": "getAuctionTokenIDsOfOwner(address)", +"504c9582": "PARTNERS_SHARE()", +"504cceac": "purchaseTokens(uint256,address)", +"504d080b": "getActions()", +"504d27fd": "transferAmount()", +"504e6827": "setWhiteListInvestor(address)", +"504f1671": "getSize(address)", +"504f5e56": "floor(uint256)", +"504f6085": "serviceTransfer(address,uint256)", +"504fac70": "getGiftTemplateById(uint256)", +"504fbb19": "LifeChain(uint256,string,string)", +"50500934": "right28(uint256)", +"50500fac": "LaunchPartnersAddress()", +"50512420": "getPlayerDiscount(address)", +"505158bb": "getRecordsCount()", +"50515d5a": "resolveDispute(bytes16,bool)", +"50520b1f": "contribution()", +"5052587f": "Show_automated_Sell_price()", +"5052abad": "viewContribution(address)", +"50548d85": "LogMakeDeposit(address,uint256,string)", +"5054e8bf": "collectDevFees()", +"5055225f": "preSaleStartDate()", +"5055557a": "perform_selfdestruct(uint256)", +"50558dd5": "setPropheth(address)", +"5055d7c3": "withdrawnMelon()", +"50560a1a": "_oraclizeQueueWinner(bool)", +"5056a36a": "AuthorizationSet(address,bool)", +"5056b309": "getSetting()", +"50584827": "getInvestorBalances(address)", +"5058c460": "safeWithdraw(address,uint256)", +"5058f013": "periodWeek()", +"505903ba": "GetEthBalance()", +"50591478": "getChainDrawingsByChainID(bytes32)", +"5059d25a": "setContributor(address,bool)", +"5059fad1": "transferIssuer(uint256,address,address)", +"505a202b": "priceChangeName()", +"505a7bce": "pullEther(uint256,address)", +"505ba497": "processInvestment(address,uint256,address)", +"505c3c58": "MasAnu()", +"505c3d5e": "piecesOwned()", +"505d394d": "GetSeries2()", +"505da5c7": "_bonusToFighters(uint32,uint8,uint256)", +"505e71d0": "test_twoInvalidFalseEqLog()", +"505ed108": "createPetCardSeries(uint8,uint32)", +"505f2697": "rejectCertification()", +"505f5a8c": "freezeByValue(address,uint256)", +"505fb46c": "add(uint256,uint256,uint256)", +"505ff574": "register(address,uint256,bool)", +"506092f7": "getAmbientLightException(bytes32)", +"50609cea": "onTokenTransferCalled()", +"5061029d": "MINE()", +"50613afe": "getDropNotice()", +"5062ef16": "readOpentasks()", +"50635394": "claimBonus()", +"50635e2f": "CYPHERX()", +"50636a68": "ERC223Token(uint256)", +"50637dd2": "stageName()", +"5063f361": "addMembers(bytes32,address[])", +"50648403": "registerWithInviterID(uint256)", +"506535f3": "verify(address,bytes32,uint8,bytes32,bytes32)", +"50655d8c": "maker()", +"5065cbab": "geteth(address)", +"50669508": "DatasetHub()", +"50669a03": "unpauseToken()", +"5066a9ac": "setLPTargetPostion(uint256)", +"5066e2bd": "teamKeepingWithdraw(uint256)", +"5067f32d": "KALToken()", +"50685c81": "SwarmRedistribution()", +"50692d9a": "toContentID(address,string,string,address,bytes32)", +"50699e89": "requestBuywithFX(uint256)", +"5069a6a6": "calculateKebabSell(uint256)", +"506a0aaa": "reverseSplitTokensBeforeDistribution(uint256)", +"506a6a10": "tokenBonusForThird()", +"506aaede": "issueDividend()", +"506b56da": "centralBanker()", +"506bd3a6": "removeExchanger(address)", +"506bff11": "left7(uint256)", +"506cb188": "NewOrder(uint256,address,address,address,uint256,uint256,uint256,uint256)", +"506cf560": "blackil()", +"506d54c7": "getBigWinner()", +"506d9ebd": "getData_8()", +"506dc7e1": "getUsageDetails()", +"506e106c": "setToS(string)", +"506ec095": "periodEnd()", +"506ee1ef": "traderNonces(address)", +"50710ef5": "_finalRoundWinnersFight()", +"50713dc0": "transferOwnershipManualMinter(address)", +"5071fcf0": "recoverSouls(address[],uint256[],uint256[])", +"5072a21b": "_createPotato(uint256,uint256,uint256,uint256,address)", +"5073eda3": "setPOOL_edit_25(string)", +"5074449d": "isTradable()", +"50750497": "VestingTransfer(address,address,uint256,uint256)", +"50754fac": "totalNetworkCollateralisation()", +"5076d445": "AdminClaimAirdrop(address,uint256)", +"5077ac0e": "registerImage(uint256,bytes,uint256)", +"507843f8": "assemblyShamir(uint256,uint256,uint256,uint256)", +"50787341": "normalizedEarlyPurchases()", +"507959e1": "newBeneficiary(address)", +"507a83ea": "arand(address,uint256)", +"507a8e40": "AssetToken(uint256,string,uint8,string,address)", +"507afbec": "processBuyAmount(uint256)", +"507b3450": "getKNCRateRangeSignatures()", +"507bbc7e": "isRunUpStage()", +"507d17bb": "MultiplyContract(address,address,uint256,uint256,uint256,uint256)", +"507d5954": "stopCrowdsale()", +"507d8887": "setCompte_19(string)", +"507e7888": "subscribe(string)", +"507e97a9": "setBUA(bytes32,uint256,address)", +"507eeff9": "trade(address[2],address,bytes,bytes)", +"50807ecc": "getSellerfee()", +"50818fbb": "internalGetHowMuchUntilHardCap(uint256)", +"50833515": "RestartReceivingContributions()", +"508335e6": "maxRentPeriod()", +"508343d6": "initiateEscrow(uint64,uint256,uint256,address,address,address,address)", +"5083b29f": "changeBookingFee(uint256)", +"508493bc": "tokens(address,address)", +"50849c3b": "placeoffer(uint256,uint256)", +"5084b2a3": "MintAuthority(address)", +"5084da18": "fipsOwner(bytes20)", +"5085c9f1": "numTokensInCurrentCompactData()", +"50867236": "debug_token_balanceof_faucet()", +"50872d1e": "onTransferFrom(address,address,address,uint256)", +"50872e32": "EUROQUINNToken(uint256,string,string,uint256)", +"50875b6c": "remainingLockDate()", +"508762c1": "right10(uint256)", +"5087abc7": "joinOutBattle(string)", +"50894456": "manuallyMakeOraclizeCall(uint256,uint256,bool,bool,bool)", +"508a0a9e": "NitrToken()", +"508a8976": "saleSuspended()", +"508ab47a": "showPoolContract(uint256)", +"508b0955": "testNoTokensTwoCalls()", +"508bb866": "getMyBet(uint256)", +"508cde13": "getMappingID(string,address)", +"508d0f57": "getNumberOfPeriods(uint256,uint256)", +"508d60aa": "teamETHUnlock2()", +"508df5df": "numResponseOptions()", +"508e3718": "setValidKYC(bool)", +"508f352d": "heapSort(uint16[])", +"508f46a0": "getGameSettings()", +"50904081": "purchasesCount()", +"509065b8": "mintTokensForFirstStage()", +"50909851": "ownerEmit()", +"5091c49e": "bonusSeed()", +"5091e7c4": "selfdestroy()", +"5091f881": "updateArtistCommission(uint256,uint256)", +"50921b6c": "EGGS_TO_HATCH_1CROCS()", +"509239c0": "amountContributedBy(address)", +"50928ba4": "canCreateGames()", +"5092f97e": "Company()", +"50930ca5": "doFailingTransferFrom()", +"50933a0f": "Bitnusu()", +"5093cb38": "setEtherDelta(address)", +"5093dc7d": "setValue(int256)", +"50944a8f": "setMembership(address)", +"509484d5": "setStakeContract(address)", +"509515b5": "getWinnerAccount()", +"50963bc4": "returnTokensTo(address)", +"50965f57": "currentWulinMasterPrice()", +"509720a6": "putUint(bytes32,uint256)", +"50977faf": "fetchTokenBalance()", +"5097e51f": "Public()", +"509a13dd": "RoundId()", +"509a7e54": "getRoot(bytes32,uint64,bytes)", +"509bf2bf": "axe()", +"509c3fc8": "createTestNetContract(address,address,address,uint256,uint256,uint256)", +"509c5df6": "reservedFunds()", +"509c5eee": "ASGToken()", +"509c90b3": "callTokenFallback(address,address,uint256,bytes)", +"509cd360": "Board()", +"509d6d72": "mediumPrice()", +"509d8c72": "VALUE()", +"509f0fe4": "setupFundingTime(uint256,uint256,uint256)", +"509f6ff8": "AquaToken(uint256,string,string,uint8,uint8,address)", +"509f7cf2": "testingForFun(uint256[])", +"509f8633": "create_account()", +"50a09c7a": "refBonusPercent()", +"50a09d60": "SaleIsLive()", +"50a0f733": "final_shares_sold()", +"50a107cc": "setVotingPhase()", +"50a13702": "denyChangesMultitoken(uint256)", +"50a14ea4": "returnPreSaleTokens(address,uint256)", +"50a1676e": "createdAt(uint256)", +"50a1debd": "robAll()", +"50a22ee1": "BancorGasPriceLimit(uint256)", +"50a2f067": "getfromid(address)", +"50a3bd39": "enterPool()", +"50a49f5f": "getBurnDelegates()", +"50a58b3f": "exist(address,address[])", +"50a5c872": "host_reveal(uint256)", +"50a5ebd9": "updateSpaceshipStatus()", +"50a675fe": "QQBToken(address)", +"50a6887c": "UpgradedNodelist()", +"50a6b423": "settlementPayOut(bytes32,uint256)", +"50a7755e": "newDad()", +"50a82265": "EventEmergencyStop()", +"50a8246f": "testRIPEMD160()", +"50a85d36": "DeathNode()", +"50a8d2b9": "getNumSigsOwned(bytes32)", +"50a9b541": "bootyToken()", +"50a9cbd1": "partyCoincieded(address,uint256,address)", +"50a9e127": "backup()", +"50a9eddb": "testControlSetNotUpdatableNotOwner()", +"50ab6f7f": "getMsgs()", +"50ac9828": "FileData()", +"50ad2f76": "vendGuardian(uint256)", +"50ad7321": "GPSDecayingTokenEnvironment(uint256,uint256)", +"50adc70a": "winning_country_string()", +"50adcdb7": "fundToken()", +"50ae28ea": "StandardCertificate(string,string,string,string,uint256)", +"50ae85d8": "reservedAddr()", +"50aeddcf": "censorChatMessage(uint256)", +"50b0021c": "currentRandom()", +"50b04a4e": "getCountryById(uint8)", +"50b066b2": "changelp13(address)", +"50b149a9": "setPriceStep1(uint256)", +"50b1a697": "toReferrer(uint256)", +"50b1ab69": "PET(uint256,string,string)", +"50b1f058": "fetchPaidOrdersForPayer(address)", +"50b2ae66": "transferChips(address,address,uint256)", +"50b44712": "tickets(uint256)", +"50b48c5e": "autonomousConverter()", +"50b58c06": "JuggernautToken()", +"50b5bc93": "unlockFirstTokens()", +"50b62939": "getAddressBalance(address,address)", +"50b6ba0b": "getWtoken(uint8)", +"50b79722": "setSanLength(uint256,uint256)", +"50b7b7a2": "setRating(bytes32,uint256)", +"50b7e942": "acquireTokens(uint256,uint256,address,uint256)", +"50b82a48": "objectSack()", +"50b91881": "setKycWhitelist(address,address,bool)", +"50b926fd": "UnityToken()", +"50b93b3b": "sendBuzzCafe()", +"50b9963f": "_continueTokenPurchase(address,uint256)", +"50b9c428": "oraclizeGasLimit()", +"50baa622": "withdrawToken(uint256)", +"50bacea9": "icoPhaseAmount1()", +"50bb117a": "defrostDate(address)", +"50bb4e7f": "mintWithTokenURI(address,uint256,string)", +"50bc051e": "lockedForAsset(bytes32)", +"50bc373d": "regionAvailable(uint256,uint256)", +"50bc4ae6": "_joinToProvider(uint256,address)", +"50bc6bba": "createSaleAuction(uint40,uint128,uint128,uint40)", +"50bd1933": "UberDelta()", +"50bd5cb9": "logDisputeCrowdsourcerTokensTransferred(address,address,address,uint256)", +"50bda35a": "setCharge(bool)", +"50bda77e": "updateJobRate(bytes32,uint256)", +"50be7503": "giveToken(address,uint256,address,bool)", +"50beb835": "getDeploy(uint256,uint256)", +"50beca78": "isTrainer(address)", +"50bed043": "sendFunds(address,uint8,uint256)", +"50bfeadc": "initialTokens()", +"50c007c6": "verifyTx(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[5])", +"50c0f2b9": "licenseTermsRegistry()", +"50c0fbe4": "getBlockNumber(uint256)", +"50c15c93": "depositChecking(address,uint32)", +"50c2e4f6": "ADVISOR_SUPPLY()", +"50c34878": "priceOfAUnicornInFinney()", +"50c35227": "central_account()", +"50c38479": "resetCurrentTokenOfferingRaised()", +"50c3e676": "resolveErrorReport(uint256,bool)", +"50c40877": "Nai()", +"50c42921": "replicate()", +"50c4b64c": "_unpackAuraValue(uint256)", +"50c4ebc4": "finalTimestampOfBonusPeriod()", +"50c5c99a": "setScrapyard(address)", +"50c67734": "setPricingStrategy(address)", +"50c6784d": "ShareableMock(address[],uint256)", +"50c6a4e0": "_buyPixelBlock(uint256,uint256,uint256,uint256,bytes32)", +"50c6ef88": "setChampsName(uint256,string)", +"50c7ac75": "addint8(int8,int8)", +"50c8512b": "CollectibleNoLongerForSale(uint256,uint256)", +"50c88103": "setEruptionThreshold(uint256)", +"50c8dbd2": "totalBlocksMined()", +"50c90136": "fixedLog(uint256)", +"50c90af0": "unLockAddr()", +"50c946fe": "getNode(bytes32)", +"50ca6227": "getTokenInfoData()", +"50ca73c8": "aSetLaunch(uint256)", +"50cc5d4b": "totalWeiVolume()", +"50cca1e1": "rejectMail(uint256)", +"50ccf36b": "getWeiPriceOneUsd()", +"50cd4df2": "o()", +"50cd4f3f": "ScratchTickets(string,uint256,uint256,address)", +"50cdbb6b": "setEarlyParticipantWhitelist(address,uint256)", +"50ce761d": "NumberCreated(address)", +"50cee5a0": "addToWallet(address,uint256)", +"50cf20dd": "richtestff(uint256,string,uint8,string)", +"50cf569c": "getUserAttribution(bytes32,address)", +"50d00b95": "authorizeProcessor(address,address,string,string)", +"50d0b060": "createVestingForFounder(address)", +"50d12a72": "payReferrer(address,uint256)", +"50d15fbe": "skills(uint256)", +"50d17749": "BuyLimits(uint256,uint256)", +"50d279bd": "changeRewardMintingAmount(uint256,int256)", +"50d2bfab": "set_exchange_rate(uint256[])", +"50d491ab": "userGetPendingTxByAddress(address,address)", +"50d4a2b9": "crowdsaleGoalReached()", +"50d4bf15": "buy100ktickets()", +"50d50324": "stopSaleDepo()", +"50d5914a": "TOKENS_PER_ETHER_PRESALE()", +"50d6d893": "_rejectTransaction(uint256,address)", +"50d78f7d": "QueryFrozenCoins(address)", +"50d7bf09": "record(string,string,string,address,bool,string,string,string)", +"50d7d290": "withdraw_refund()", +"50d7da00": "GSH(uint256,string,string)", +"50d808d4": "StartTradable()", +"50d80fef": "addOffChainAddress(address,address)", +"50d8bcf3": "SMLToken(address)", +"50d925fb": "REBELCOIN()", +"50d9b932": "PatronOneWithdrawal()", +"50d9d472": "numberOfAuctions()", +"50da9f6d": "SellENS()", +"50dad350": "Hodling(bool)", +"50db7247": "maxCapPreSale()", +"50dc26ec": "TokenUser(address)", +"50dc43a1": "addGameMachine(address)", +"50dc4bfe": "addUserFeedback(address,uint256,address,string,string,string,string,string,string,uint8)", +"50dcce5a": "upPrice()", +"50ddd6f7": "addToEmployerAvgRating(address,address,uint8)", +"50de84c1": "CesiraeToken()", +"50deda1c": "addtoken(address,uint256,uint256)", +"50dede35": "marketDrugs()", +"50df10c3": "lockTill(address,uint256)", +"50df7eb4": "unsoldTokensAmount()", +"50df8f71": "isReady(uint256)", +"50e01e16": "Registered(address,bytes4,string)", +"50e036ff": "allowedContractsCount()", +"50e06b57": "Etherization()", +"50e08ddb": "devidendsOf(address)", +"50e14731": "BKEXComToken()", +"50e17308": "maxMineSize()", +"50e17975": "_badgeFreeze(uint256)", +"50e1b95a": "getShipProductClassByModel(uint16)", +"50e26c23": "getAssetBaseInfo()", +"50e27f2d": "TicTacToeLockedState(address,address,address,address,address)", +"50e28cb3": "SECOND_USER_CUT()", +"50e2ccad": "CoreTeamAndFoundersSupply()", +"50e343d0": "prWallet()", +"50e37961": "setWhitelisting(address,uint128)", +"50e38e63": "groupMemberInfo(uint32,address)", +"50e3b157": "sharesValue(uint256)", +"50e43c9c": "c(address,int256,int256)", +"50e4b069": "set0xExchangeWrapper(address)", +"50e513ac": "destroyUser()", +"50e59eb3": "isMinter()", +"50e706fb": "getProposalFunds(uint256)", +"50e72f61": "Break()", +"50e78690": "getHomeGasPrice(bytes)", +"50e7dde2": "setParetoToken(address)", +"50e81a3b": "setProviderCompleted(bool)", +"50e81e08": "_releaseToken(address)", +"50e84925": "saleEnd3()", +"50e8587e": "multiApprove(address[],uint256[])", +"50e862db": "mint(bytes32,string,uint256)", +"50e86e1e": "setOwnerValidateAddress(address)", +"50e878df": "updateOrderAmount(address,address,uint256,address,uint256,bool)", +"50e9f948": "initialFiatPerEthRate()", +"50ea1932": "lookupISO3116_1_alpha_2(bytes)", +"50ea1c95": "MyIdolCoinToken()", +"50ea53db": "transferIncorrectDisputeBondsToWinningReportingToken()", +"50ea9274": "TokenRefund(address,uint256)", +"50eb2d02": "BBNToken()", +"50eb7ec4": "SupercarToken()", +"50eba4eb": "voteSnapshotBalanceBatch(address[],uint256[])", +"50ec2a6a": "batchCancel(address[5][],uint256[6][],uint256[])", +"50ec5903": "blackListSwithcer(address)", +"50ec6b1b": "getNamelistLength()", +"50ed2a2c": "poke(uint128,uint32)", +"50ed6264": "lastStakings(address)", +"50edd8c2": "nestedFirstAnyToAny(uint256)", +"50ee6de2": "candyLand()", +"50eebaf7": "mininumPurchaseTokenQuantity()", +"50ef3bae": "getQuestionVote(string,uint256)", +"50efc7c0": "districtToBuildingsCount(uint256)", +"50f07cf9": "setReadingDelay(uint256)", +"50f0880e": "sendLimitTokensToCompany(uint256)", +"50f0f83d": "getTransferFromFromValue()", +"50f1179a": "setPriceOfAss(uint256,uint256)", +"50f1c695": "authorizedLoggers()", +"50f2fb7f": "getCalls()", +"50f3dd7a": "assembleUnicorn()", +"50f4556b": "WhiteRhino()", +"50f462a4": "validationFailed(address)", +"50f46eef": "calcToken(uint256)", +"50f49db1": "getSlideEndTime(uint256)", +"50f4f9f8": "addShare(address,uint256)", +"50f503c1": "isSspRegistered(address)", +"50f5ef78": "getWork(address,address,uint256)", +"50f71526": "necashToken()", +"50f7c204": "maxTokenSupply()", +"50f8fc97": "LogCertificationDocumentRemoved(address,bytes32)", +"50f91ee3": "withdrawTokensRemaining()", +"50f93381": "logDisputeCrowdsourcerContribution(address,address,address,address,uint256)", +"50f956db": "nextAmount()", +"50f96b5d": "minEthPerNotification()", +"50f9b39e": "getReward(address,uint256,uint256)", +"50fa5d13": "stage4BeginTime()", +"50fb5a92": "buyWithReferral(uint128)", +"50fcff5c": "extCheckHalfLife()", +"50fdb01a": "setNewWinner(address,uint256)", +"50fe533b": "getLevitatingBirds(bytes32,uint64)", +"50feacc5": "PriceManual()", +"50fed3b4": "buy(address,uint256,uint256,uint256,bool)", +"50fef2e4": "tokenAirdropLeft()", +"50ff0761": "R_N_D_WALLET()", +"50ff2015": "endAtBlock()", +"50ff722b": "getChannelsGuids()", +"50ffbe81": "checkBan(address)", +"51003cab": "minimumIcoRate()", +"510040cb": "releaseLocked()", +"5100602a": "preallocate(address,uint256)", +"5100beab": "luxuriumGold()", +"5100db6f": "SYCC()", +"51017702": "isOutcomeSet(bytes32)", +"5101880f": "CPXWallet()", +"510219cd": "defaultAuctionDuration()", +"51027320": "EUNOMIA()", +"5102ad69": "setImpactRegistry(address)", +"5102bc9d": "setTitle(uint256,string)", +"5102e238": "test_oneInvalidEqAddress()", +"5103a5a3": "certify(address,bytes32)", +"5104a3a7": "burnedTokensCount()", +"5104cb5c": "refundOnBehalf(address)", +"5105df3b": "buyTicketByEth(uint256,bytes32,bytes32,bytes32,bytes32)", +"5106b8fe": "transfer(address,address[],uint256)", +"510792c8": "hydroPartnerMap(uint256,address)", +"5107c0a8": "FBEE()", +"5107fde8": "lockedTeam()", +"510a3e2a": "round2Bonus()", +"510ae121": "Yangshuai(uint256,string,uint8,string)", +"510b1529": "issueTranche(uint256)", +"510b5158": "creator(uint256)", +"510bf040": "launchVesting()", +"510c27ad": "getOracleList()", +"510c58c9": "Gig9()", +"510c8243": "CategoryDeleted(uint256)", +"510ccb43": "getRewards(address[])", +"510de15a": "ICOSaleExtended(uint256)", +"510e23eb": "invalidEarlyPurchaseIndexes(uint256)", +"510e4235": "_createForecast(uint256,uint256,uint256)", +"510ea296": "_createDiamond(string,address,string,string,string,string)", +"510ec598": "computeCurrentReward(address,address)", +"510ef1ce": "changeQuarterSeason(int8)", +"510ef1de": "setTokenMetadata(uint256,string)", +"510f44cb": "TestFactoryUser()", +"510fbf8d": "setValue(address,string)", +"511075a9": "getIpfsForAssets(uint256[])", +"5110d31c": "TradeEthShop(address,uint256)", +"5111249e": "checkMultOverflow(uint256,uint256)", +"51114b24": "interSendWithOtherEvent(address,uint256)", +"51118f1d": "transferFromSystem(address,address,uint256)", +"5112f02c": "getCard()", +"51131017": "setUpdateGasCost(uint256)", +"511354a1": "phase2MaxTokenForSale()", +"5113d5f7": "BTCETC(uint256)", +"51142cc3": "secondStageCap()", +"5114a9aa": "TheBestICO()", +"5114cb52": "makePayment(uint256)", +"51172285": "TwoAfrica(uint256,string,string)", +"51175e01": "setNumRewardsAvailableForAddresses(uint256[],address[])", +"51180c63": "removeValue(bytes32)", +"51192814": "GenesisBuyPrice(address,address)", +"51193bad": "LUVTOKEN()", +"5119a342": "GetUserInfo()", +"511aae8b": "addFreelancerContract(address,address,uint256)", +"511acd53": "TOKEN_RATE_30_PERCENT_BONUS()", +"511b1df9": "addr(string)", +"511b445b": "nowperiod()", +"511bb41c": "rebateTwoFenmu_()", +"511bc0f6": "_addOwner(address)", +"511c5d66": "SetAddressForReturn(address)", +"511d2299": "processBNBContribution()", +"511e2613": "getoddAndEvenBets(uint256,uint256)", +"511e5639": "KamuToken()", +"511e84ce": "setIsAutoRestart(bool)", +"511eb8da": "confirmOrder(address,address,address,address,bytes32)", +"511fa487": "getMinSell(address)", +"5120429c": "TokenSold(uint256,uint256)", +"51206d81": "getRefWallet()", +"5120bb20": "transactionsOn()", +"5120f028": "sendAmount(uint256,address)", +"512202d7": "getOuvidoriaEndpoint(int256,address)", +"51223fdc": "LogClaim(uint256,address,uint256)", +"512267b0": "rewardScarcityFactor()", +"51228c4e": "addReferralProfit(address,address,uint256)", +"5122c6d1": "onSell(bytes32,uint256,address,uint256,address,uint256,address,address,uint256,uint256,uint256)", +"512392cc": "BITCOIMINIG()", +"51239fde": "multiDistribute(address[])", +"5123e1fa": "etch(address[])", +"51243676": "LogBookTicket(uint256,address,string)", +"5124ae95": "getNonces(address)", +"51252412": "crowdsaleTargetBRA()", +"51254729": "CynkciarzToken()", +"512570d6": "updateBrand(address,string,bool)", +"5125796a": "changeOraclizeProofType(bytes1)", +"51259770": "GetEthShop(address)", +"51274842": "logEvent(uint256,string,uint256,uint16,address,uint256,uint256)", +"5127a94a": "getRaisedAmount(string)", +"5127ad4c": "getTokens(address,uint256,uint256,uint256,uint256)", +"5127cab5": "rateFirstRound()", +"5128ab7b": "GetSaleInfo_Airdrop(uint8)", +"5129096c": "INGCL()", +"51290d06": "cofounderB()", +"51297cc6": "airDropTokenEnabled()", +"512a9c33": "startCrowdsale(string,string,uint8,uint256,uint256,uint256,uint256,uint256,uint256,address,string)", +"512b64c6": "_productDoesNotExist(uint256)", +"512b658d": "mintToAddress(uint256,address)", +"512c0b9c": "randomDS_updateSessionPubKeysHash(bytes32[])", +"512d62df": "getClass(uint256)", +"512d8a87": "EdwanzToken()", +"512dd020": "getItemsCount()", +"512f1e64": "orderBookLength()", +"512f8f92": "changeLottery(address)", +"512f9890": "airDropFinished()", +"512fcd60": "changeOwner3(address)", +"512ff2c9": "CHEXToken(address,address,uint256,uint256)", +"51306a80": "_isVotable(bytes32)", +"5130b405": "setMinimumBidAmount(uint256)", +"5130c857": "forking()", +"5131d3e9": "setUseFreeze(bool)", +"5131f01d": "available_shares()", +"51327a6a": "emptyToWallet()", +"513284c6": "createShop(address)", +"5132faca": "stakeTokenContract()", +"51331732": "ICO_start()", +"51331ad7": "getRoleManager()", +"513419e3": "updateStartTimeManually(uint256,uint256)", +"513485fc": "CallRejected(address,bytes32)", +"51349d5f": "scheduleTier(uint256,uint256)", +"5135077b": "setContentName(string)", +"51355362": "transferWithFee(address,uint256,uint256)", +"51355cfb": "getTier(uint256,uint256)", +"51356817": "doPull(address,uint256)", +"5135d28d": "getScore(uint256,uint256,uint256[])", +"5135dffa": "NonActivationWithdrawal(address[2],uint256[8],uint256)", +"5135f714": "Basic(address)", +"5136099c": "premium(bool,address,address,address,address[],uint256[])", +"513611e5": "setStatusTransferFrom(bool)", +"5136260d": "getLockedFundsReleaseTime()", +"51379adb": "Crowdsale(address[],uint256,uint256)", +"5137aa7b": "reveal(bytes32,uint256,bytes32)", +"5137dd99": "only666()", +"5137de7a": "privateReleaseTime()", +"5138574b": "setNextCommonTTMTokenId3(uint64)", +"51392041": "getDividendTokenBalanceOf(address)", +"513a0149": "setRocCoreAddress(address)", +"513a976e": "YaqootToken()", +"513ad9cb": "EvTokenRm(uint256,uint256,uint256)", +"513cb145": "convertToUSD(uint256,uint256)", +"513d085b": "Pandemica()", +"513d16a7": "setFundingStartTime(uint256)", +"513de1d3": "changeDivisor(uint256)", +"513f7d1e": "tokenValue(address)", +"513f99e7": "tokenFrozen(uint256)", +"513fdce9": "addClearingPriceValidator(address)", +"51401d4d": "gameMaxBetAmount()", +"51404cbe": "forceDivestOfOneInvestor(address)", +"51409f51": "currentTradingSystem()", +"5142ba74": "rolloverFeePeriod()", +"5142bc1e": "getAllowedRangeOfChoices()", +"5142c3ec": "assertEq13(bytes13,bytes13)", +"51430cb3": "claimMaxAmount()", +"51431800": "getSendableEther()", +"5143284d": "start4NormalPeriod()", +"5143659d": "claimCooldowns()", +"51436641": "convertToMiniCQS(uint256)", +"5143821e": "_moveToArea(uint16,address)", +"514385be": "disableConnectorPurchases(address,bool)", +"5143a9fe": "deposit(address,uint256,address,bytes)", +"5143e246": "mintLocked(address,uint256)", +"5143eea2": "addOwnerFromRecovery(address,address)", +"514403b3": "setnodemoney(address,uint256)", +"5144417c": "news()", +"51446e85": "CITRUX()", +"51464905": "updateGoldInvestor(address)", +"5146585a": "calcInterestRateNumerator(uint256)", +"5146690e": "reservesWallet()", +"5147af92": "buyGasLimit()", +"51489551": "getToken(bool)", +"5148ccb9": "DynamicCeiling(address,address)", +"5148de8d": "minimumTimeBeforeUpdate()", +"5149ffcb": "calculateSubmissionIndex(uint256)", +"514a48ae": "_changeApproveDate(uint256)", +"514a88ae": "revokeSchedule(address,address,address,address)", +"514ae8a6": "MagneticsToken(uint256)", +"514b13f2": "presaleConversionRate()", +"514d6e07": "horseShoeFS(uint256)", +"514d7067": "workOrderCallback(address,string,string,string)", +"514d717c": "developReserveWallet()", +"514dcfe3": "seller_accept()", +"514ec8ae": "TOKEN_CENTS()", +"514f0330": "changeProtocolFeeRecipient(address)", +"514f310f": "_NewChallenge(address,bytes32,uint256)", +"514f4711": "In(address,uint256)", +"514fcac7": "cancelOrder(uint256)", +"515053c6": "depositBond(address,uint256)", +"5150e8ce": "CPPGToken()", +"515134b3": "TianZhuCoin()", +"5151e2cc": "GREENBIT()", +"5152249c": "Paladin(uint256,string,string)", +"51524e5b": "AirDrop(address[],uint256[])", +"5152abf9": "OrderCancelled(bytes32)", +"515361f6": "assertEq(address,address)", +"515371a3": "getWinnerAddress(uint256)", +"5154865a": "crowdFundAddress()", +"51548a2d": "TOKEN_AMOUNT_ICO_STAGE2()", +"5155287a": "whitelistedMin(address)", +"51553205": "PreSale(address)", +"5155bafa": "maxPeriods()", +"5155d9c6": "getPetCardSeries(uint8)", +"51560da9": "topDogInfo()", +"51563527": "passDao()", +"51576510": "bountiesWallet()", +"51582ef3": "sendProxyTransaction(address,uint256,uint256,bytes)", +"51584916": "allowexternalContract(address,uint256,bool)", +"5158c829": "RECFCO(address,address)", +"5158ea5e": "disallowUsers(address,address[])", +"51593759": "carCountOf(address)", +"515a20ba": "setExpiration(uint256)", +"515b1e41": "zss()", +"515b3557": "STARTING_CROCS()", +"515c1457": "emitTransfer(address,address,bytes32,uint256,string)", +"515cbcb4": "dropCoinsMulti(address[],uint256[])", +"515ced53": "best_submission_index()", +"515d4503": "getBarCodeDataAtIndex(bytes32,uint256)", +"515d4d52": "totalAmountsBet(uint256)", +"515da4b9": "transactionList()", +"515f128b": "COMMUNITY_POOL_TOKENS()", +"515f25ae": "launchShipOnMEA(uint256,uint8)", +"515fdde3": "migrateFunds(address,address[])", +"51602590": "threeHotHoursPriceOfTokenInWei()", +"51605d80": "imageHash()", +"5160a21e": "AddDomainInfoDocument(string,string)", +"51613683": "crowdSaleStart()", +"5162b2b2": "isAddressWhitelist(address,address)", +"5163311e": "getLastWinnerTicket()", +"51640fee": "getCertificate(uint256)", +"5164bb4d": "getCurrentStinkyLinkys()", +"51651003": "redenom_dao_fund()", +"516517ab": "make(uint256)", +"51656af5": "GuigsTokenSale(uint256,uint256,uint256,uint256,address,address,address,uint256)", +"51656f08": "AgesToken()", +"5165749e": "createToken(string,string,uint8,uint256,address)", +"516583fe": "depositFrom(uint256)", +"5165a03d": "payout(uint256,bytes32,bytes32,uint8)", +"5166b68f": "unfreezeTransfersUntil(string)", +"5166cf3d": "canAttack(address,address)", +"5168afa4": "getPackageHash(bytes,uint8,uint8,uint8)", +"5169ed0e": "getCCH_edit_29()", +"516a6b22": "PingoToken()", +"516ae993": "setChargeFee(uint256)", +"516af259": "setCurrentStage()", +"516b48fb": "insertList1(uint256,string,string,string,string,string)", +"516c731c": "setOwner(address,bool)", +"516cbe1a": "efwtest()", +"516cd39b": "revokePermissionFrom(address)", +"516d70c3": "lockAllocationAddress(address)", +"516dde43": "expiryDate()", +"516de876": "go(bytes16)", +"516dea30": "post_relayed_call(address,address,bytes,bool,uint256,uint256)", +"516e7be7": "contractFailed()", +"516e9aec": "lockAndDraw(address,uint256)", +"516ed622": "registerDINs(uint256)", +"516edc99": "UNITYCOIN()", +"516f279e": "location()", +"516f6afd": "Project_Enable(uint256)", +"516f8986": "TOKENADDRESS()", +"5170a9d0": "returnSender()", +"517125fa": "minTokensForSale()", +"51714d2d": "CIRCLECOIN()", +"517186f3": "ownerModOperator(address,bool,uint256)", +"5171bdec": "AllocationProcessed(address,address,uint256)", +"51720b41": "targetContractId()", +"51731f21": "changeFreezeTrading(bool)", +"51751612": "EtchToken()", +"51758666": "getMesa(uint256)", +"5175f65c": "_ownerApproved(address,uint256)", +"51764a94": "Lesson_3(address,uint256)", +"51768e4d": "updateItem(uint256,string,uint256,uint256,uint256)", +"51777183": "private_setRandomAPI_extract(string)", +"5177942a": "setFeeRate(uint8)", +"51780fdb": "w(address,address,uint256)", +"51784a75": "withdrawPlat()", +"517880df": "secondaryICO(bool)", +"51788439": "hashRequest(address,address,uint256,uint256,address)", +"517a626f": "getUserLengthOnEther()", +"517a70d4": "mintAmount3()", +"517a9d64": "share(address,address)", +"517afbcf": "votingController()", +"517b1d8f": "setRegionCurrentPixelPrice(uint256,uint256)", +"517b2fa8": "depositDaiFor(uint256,address)", +"517c48c3": "LATPToken()", +"517c8b12": "GetTicketOwner()", +"517cf73e": "getSupplyRate(address,uint256,uint256)", +"517d95fa": "addusermoney(address,uint256)", +"517e62ab": "getTxTimestampPaymentKWh(bytes32)", +"517ebace": "eosOf(address)", +"517ee2e8": "CSLottery()", +"517ee30d": "CreateHOLY(address,uint256)", +"517f4a23": "SalesManager()", +"517f6c51": "HardcodedCrowdsale(uint256,uint256,uint256,uint256,address)", +"517fe4de": "showUser(address)", +"51804743": "LandAccessControl(address)", +"5180629d": "transferByOwnerContract(address,uint256)", +"5181500d": "ExoplanetToken()", +"51819edb": "emergencyWithdrawParsecs(uint256)", +"5181aa01": "RELEASE_END()", +"51838717": "addSmartContract(address)", +"5183f10b": "getDataOfIdentity(bool)", +"51843b06": "supporterBalances(address)", +"51846028": "setColorsX8(uint16[8],uint256[40],uint256)", +"518496b2": "proposedWithdrawal()", +"5184c96d": "escrowList()", +"5184cc43": "getFactor()", +"5184ffc9": "setAmbiAddress(address,bytes)", +"51858e27": "emergencyPause()", +"5185b724": "allocateReservedTokens(address,uint256)", +"51867b19": "withdrawnFrom(address)", +"5187527f": "reversePurchase(address)", +"5187a7d7": "GetSign(string,address)", +"51883f6e": "RecievedAnonDonation(address,uint256)", +"5188875b": "withdrawalToken()", +"51888969": "weiRaisedPreIco()", +"5188f996": "addContract(bytes32,address)", +"51892c0f": "BIGER(address)", +"51892f07": "changeMintingAddress(address)", +"518995cd": "addClip(string)", +"518999f2": "TSTORZCo()", +"518a5b7a": "implementsMethod(address,bytes4)", +"518ab2a8": "tokensSold()", +"518ada3b": "GetUserBets(address)", +"518adacd": "notifyAuthority(string,string)", +"518b1a33": "ALLOC_LIQUID_TEAM()", +"518b4372": "getInvoices(address,uint256)", +"518b7a29": "totalDETsSold()", +"518bddd9": "getCustomer(string)", +"518bed3f": "calculateTokensAmount(uint256)", +"518c0f17": "tokensOnThisChain()", +"518d3b64": "getTotalSent()", +"518d6c2d": "_preApprove(address)", +"518d7981": "adjustBalance(address,address,int256)", +"518e62db": "createOrder(address,address,uint256,uint256,uint256)", +"518f2f10": "setAddressAuthorization(address,address,bool)", +"518fd40e": "cdtTokenAddress()", +"5190674b": "resignAsCurator(address)", +"51906bb0": "endTimeStamp()", +"51913124": "batchTransferMSM(address[],uint256[])", +"5191e37f": "listMultipleItems(uint256[],uint256,uint8)", +"51922341": "transferICOFundingToWallet(uint256)", +"5192f3c0": "boolToInt(bool)", +"519559ed": "contractMax()", +"5195e8c5": "mintData()", +"51965e75": "getRocrocId(uint256)", +"51971109": "UntungWaluyo()", +"51973391": "sentBonus()", +"51973ec9": "log()", +"5197c7aa": "getX()", +"519903f1": "unionBalance()", +"51992fcb": "addTokenAddress(address)", +"519936db": "StartAuction(string,uint256,uint256)", +"5199f1de": "lastYearTotalSupply()", +"519a078f": "getCommunitybyIndex(uint256)", +"519a1a41": "getSetup(address,bytes32)", +"519a73c3": "stopAcceptingDonation()", +"519af30e": "withdrawAllEth()", +"519be2f5": "resetDemo()", +"519bf602": "reward8()", +"519c6377": "signup(string)", +"519d1059": "setPurchased(address,address,uint256,uint256)", +"519e55da": "getStorage(string)", +"519e9a92": "Log2(address,bytes32,uint256,string,string,string,uint256,bytes1)", +"519ee19e": "tokenSold()", +"519f9590": "appointNewCFO(address)", +"51a073fb": "removeFromSpecialRatesMapping(address,address)", +"51a0aff0": "stockBuyOrder(uint256,uint256,uint256)", +"51a0c395": "myUsingOraclize()", +"51a11e94": "tokenIssued()", +"51a14c9f": "GetPartWeight(uint8,uint256)", +"51a1ad6b": "VikkyTokenAirdrop(address,address)", +"51a1c192": "get_solution()", +"51a282ae": "bidEMONTIncrement()", +"51a28572": "SALE0_RATE()", +"51a36e34": "changeCrowdfundContract(address)", +"51a3aed5": "getCompanyPreferences(string)", +"51a4cd73": "sellCoins(uint256)", +"51a4f7f2": "Har(address,address,address,uint256,uint256,uint256)", +"51a5f2f2": "ConsultingHalf(address,address)", +"51a6b851": "actual_feedout()", +"51a76924": "getSpeed(uint64,uint64)", +"51a784e3": "currentCirculating()", +"51a88a38": "PictureLibraryCoin(uint256)", +"51a8a8a4": "clearDividends(address)", +"51a8c3d7": "PausableCrowdsale(bool)", +"51a9111a": "BONUS_PRE_ICO()", +"51aa0199": "ethereumPrice()", +"51aa0a30": "modifyPMTAccount(address)", +"51aadcdf": "crowdSaleContract()", +"51ab351c": "BONUSONE_DATE()", +"51ab720d": "numOfTimesSteal()", +"51ac0d10": "getTimeBasedBonusRate()", +"51ad0299": "Ship(string,uint256)", +"51ae7f95": "COMPANY_TOKENS_LOCK_PERIOD()", +"51ae8754": "calcSectionTickets(uint256[],uint256[])", +"51af083b": "MONTH_IN_MINUTES()", +"51afc4af": "_getMinAuctionSeconds()", +"51b07a96": "getUSDT(uint256)", +"51b0b931": "updataLockPercent()", +"51b2270f": "getICOLength()", +"51b30900": "generateMemoryProof(uint256[],uint256)", +"51b3666f": "applyBooster(uint256,uint256)", +"51b3d7b9": "_transferWithReference(address,uint256,string)", +"51b41b62": "getAllOwnersOfCard(address)", +"51b42b00": "deactivate()", +"51b46399": "triggerUnpauseEvent()", +"51b488d4": "throwsWhenGettingTokensInNotInitiatedSale()", +"51b546af": "EDCoreVersion1(address,address,address,address)", +"51b59341": "MoncryptToken()", +"51b644c0": "roundedDiv(uint256,uint256)", +"51b6914a": "Lara(uint256)", +"51b699cd": "isAuthorised(address)", +"51b6fe96": "distributeTokens(address,address[],uint256[])", +"51b72a9a": "removeActivator(address)", +"51b79495": "performFeelessTransaction(address,address,bytes,uint256,bytes)", +"51b79d55": "maxPremium()", +"51b95400": "SophosToken()", +"51b98927": "_withdrawProfit()", +"51b9a2f8": "ballotVoters(uint32,address)", +"51b9c785": "step_level()", +"51ba24c7": "Token_ExchangeValue()", +"51ba5f04": "registerImpact(string,uint256,uint256)", +"51ba7534": "LastExec()", +"51babf0c": "sellToken(address,uint256,uint256,bool)", +"51bba1cc": "itemTransferred(bytes32,uint256,address,address)", +"51bcc53e": "checkFloatingOwnSupply(address,uint256,bool,uint256)", +"51bdd585": "currentChallenge()", +"51bdf229": "DummyContract(uint256,uint256,uint256[10])", +"51be2361": "InterCrypto_Wallet()", +"51c03b85": "makeBid(uint16)", +"51c08f4d": "gameTimeOut()", +"51c13af3": "MAX_ALLOWED_BOUNTY()", +"51c15991": "endGamblingParty(uint256,int256,int256)", +"51c1ae00": "DGClubCoin()", +"51c1bba1": "offlineGame(address)", +"51c221ec": "holderReserveTokens()", +"51c3934f": "getContractsByStatus(address,uint256,uint8)", +"51c3a2c6": "CPCEFundDeposit()", +"51c3a5d3": "getPollsSize()", +"51c3b8a6": "setFreezing(address,uint256,uint256,uint8)", +"51c40c6f": "setIntrospectionRegistry(address)", +"51c4e395": "logMarketCreatedCalled()", +"51c54c68": "buySprite(uint256)", +"51c54ec6": "transferAllBalance(address)", +"51c5d54d": "rateSecondWeekEnd()", +"51c65298": "exportFund()", +"51c69b12": "twoMonthsLater()", +"51c72c87": "ProofTeamVote(address)", +"51c74a9e": "addCertificate(bytes,bytes,bytes,address)", +"51c81f01": "setBursar(address)", +"51c85565": "nextTournamentBank()", +"51c875d2": "DB()", +"51c8d4d0": "get_arbits_whitelist(address,address)", +"51c8e02a": "setStore(int256)", +"51c9b233": "changepublicbonus(uint256)", +"51ca0eb8": "FACTOR_PRESALE()", +"51ca6966": "RefundableCrowdsale()", +"51ca7a94": "addNodes(string,address)", +"51cb21ff": "getgamecardname(uint256)", +"51cb6ecd": "addRandomFight2Death(uint256)", +"51cb860a": "setAccountNote(string)", +"51cb9712": "newExpertise(uint256,uint256)", +"51cbb299": "getClosingObligation(uint256)", +"51cc391d": "MULTI_SIG()", +"51cc4d1d": "payDemurrage(address,address)", +"51cc508d": "Zeinun()", +"51cc7cbe": "PawCoin()", +"51cd7c0f": "MatchPayoff(uint256,uint256,uint256,uint256)", +"51cdac6b": "find(address)", +"51ce3207": "getStockOwnerInfo(address,address)", +"51cf6b22": "burnInvestorTokens(address,address,uint256)", +"51cfa44b": "getStarTotalSupply(uint8)", +"51cfc731": "transferFromContract(address[],uint256[])", +"51cfdd58": "Dewcoin()", +"51cff8d9": "withdraw(address)", +"51d10161": "boughtToday(address)", +"51d20c7c": "Exchange_ETH2LuToken(uint256)", +"51d24a33": "addNewBoard(bytes32,string)", +"51d28a7e": "saleTokenPrice()", +"51d2a1e4": "getDepositRoot(bytes)", +"51d2a8fe": "BIKSPRO(uint256,string,uint8,string)", +"51d2cc8f": "grid(uint256)", +"51d31822": "setMarketAddr(address)", +"51d34040": "returnBet(bytes32)", +"51d38d5f": "addDeveloper(address,string)", +"51d467f5": "getLogFillArguments()", +"51d53bee": "HRHToken(uint256,string,uint8,string)", +"51d550d2": "getPendingBalance(address)", +"51d59a20": "impl_incomeOf10k()", +"51d5d98d": "hasEnoughTokensLeft(uint256)", +"51d5f44f": "saleHero(uint256)", +"51d6e547": "getNonce(bytes)", +"51d74ce5": "SetWageredWei(bytes32,uint256)", +"51d75dc6": "BUYER_STEP_2(bytes32)", +"51d962e1": "endRelease()", +"51d977a6": "TEST()", +"51d997b2": "isAbstainAllow()", +"51da463a": "_revokeAccess(bytes32,address,address)", +"51dabd45": "disapproveAll(address)", +"51dbc419": "_drainGame(bytes32,address,uint256[10])", +"51dc7659": "winNum()", +"51dc7f7d": "setPreferredCurrency(address,bytes4)", +"51dd3164": "getCurrentMinimum()", +"51dd8119": "announceFork(string,string,uint256)", +"51de097f": "e_Withdraw(uint256,uint256,uint256)", +"51de5541": "castUpgradeVote(uint8,address,bool)", +"51dea0ae": "updateOwnerShares(address[],uint256[])", +"51ded741": "rateThirdWeekEnd()", +"51df6d27": "GlobalLotteryToken()", +"51df9db9": "newPrice()", +"51dfc14d": "tokensOfferedOf(address)", +"51dff989": "redeemVerify(address,address,uint256,uint256)", +"51e00935": "Arrays()", +"51e09631": "totalVestedTokens()", +"51e0e26b": "allowedContracts(address)", +"51e10aa6": "calculateToFund()", +"51e16546": "_payFee(uint128,address)", +"51e1d427": "boolMemoryArray()", +"51e1ee12": "ContractorProposalClosed(uint256,uint256,address,uint256)", +"51e22125": "addPresaleWhitelist(address,uint256)", +"51e4eb07": "setContributionLockPeriod(uint256)", +"51e51b55": "startPreSalePhase()", +"51e55767": "getWeiPerContributor(address)", +"51e699a8": "setMainSaleDates(uint256)", +"51e6ba1d": "toggleContractFreeze()", +"51e6edee": "RETZO()", +"51e7f12e": "_doDestroyTokens(address,uint256)", +"51e82eec": "totalSetCredit()", +"51e94406": "weiRaisedPreSale()", +"51e946d5": "freezeAddress(address)", +"51ea468b": "getSupportersAddress()", +"51eace10": "unfreezeStartTime()", +"51eb5e93": "overdraftPeriodLength()", +"51ebe2f1": "bursarAddress()", +"51ec4285": "unvote(uint256)", +"51ec4525": "first_player()", +"51ec4fc7": "limitAddress(address)", +"51ec8433": "STTadmin2()", +"51ecabd6": "toPayable(address)", +"51ecfd16": "getCatPrice(uint256)", +"51ed17a4": "reservedTokensList(address)", +"51ed8288": "buyNFT(uint256)", +"51ed96b9": "enableContribPeriod()", +"51edbdbb": "setForeignBridgeErcToErcImplementation(address)", +"51edffed": "identifierIsOriginal(uint256)", +"51ee387d": "dividendsAvailable(address)", +"51ee43e5": "lottery(int8)", +"51eec810": "setCapitalization(uint256)", +"51eecc23": "setupBounty(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"51f1333e": "relievePool(uint256)", +"51f1fa97": "POHStartTime()", +"51f2f1d1": "timeTransferbleUntil()", +"51f364d5": "currentCostToPress()", +"51f3a7bd": "CoinFlip()", +"51f3b4bd": "collectFees(uint256,address)", +"51f468c0": "setClaimPrice(uint256)", +"51f4ec50": "setWriterId(bytes32,bytes32)", +"51f514d3": "computePayeeBalance(address,address,uint256)", +"51f550be": "IcoSupply()", +"51f59db2": "test_claimShares_emptyFeePool_notTranscoder()", +"51f68d80": "calculateLRCUnlockAmount(uint256,uint256)", +"51f6d8c6": "setBalances(address[],address,uint256[])", +"51f6f870": "createMicroModule(uint256)", +"51f80746": "DXBToken()", +"51f91066": "tag()", +"51f93215": "bond(bytes32,uint256)", +"51f96d33": "verifySignature(address,address,address,uint8,bytes32,bytes32)", +"51f9ff35": "lastDividendIncreaseDate()", +"51fa5810": "getEnginesIds()", +"51fa7efd": "returnAmountToMainAccount(uint256)", +"51fab7ff": "transferRemaining()", +"51fae45d": "astroIDPool()", +"51fafb72": "setSubscribe()", +"51fafd95": "cashierAddr()", +"51fb012d": "whitelistEnabled()", +"51fb3043": "tokensForPresale2()", +"51fb4001": "rateIcoMainSale()", +"51fba575": "NRB_Users()", +"51fbd91e": "donationsReceiver_()", +"51fbfe9d": "migrationCountComplete()", +"51fc6f59": "TokenManagerEntity()", +"51fd2c69": "quantityHeldInCustodyOfExchange(address)", +"51fdaf92": "checkExpiredfunds()", +"51ff1a06": "PaparazzoToken()", +"51ff4847": "signature()", +"51ffcab3": "bid(uint32)", +"51ffd9e7": "getRatePerTimeUnits(uint256,uint256)", +"52006050": "setBurnBounds(uint256,uint256)", +"5200d643": "OPENING_TIME()", +"52013484": "CalcWinnersAndReward(uint256[],uint256)", +"52019dc3": "payTokens()", +"5201effb": "setCompletionTime(uint256)", +"520282d0": "getBcouponAllocationFactor()", +"5202b615": "numberOfClosedGames()", +"52030899": "preSaleBlockNumber()", +"5204cfe1": "OpenRedEnvelope(string)", +"520543ab": "endStage2()", +"52058d8a": "tokenSupplyCap()", +"5205b80f": "getLeftToken()", +"52063985": "unlockAddr()", +"5206fea3": "_transfer(string,string,uint256)", +"5207c391": "setWhitelistedBatch(address[],uint256)", +"5208a157": "getCardsFromHash(uint256,uint256,uint256)", +"5208ce36": "STQPreICOTestHelper(address,address)", +"52091047": "changeVotingRules(address,uint256,uint256)", +"520929b6": "AlgeriaToken()", +"520aea97": "setNote(uint256,bytes32,bytes20,string)", +"520b1b65": "testGetAllCases()", +"520ba154": "changeAcct2(address)", +"520bbba3": "generateRequestAttestationSchemaHash(address,address,address,bytes32,uint256[],bytes32)", +"520bf4d8": "SmallInts()", +"520c37b7": "setOCGFee(address)", +"520c3db7": "relayRelease(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32)", +"520c5828": "whitelisting()", +"520c7c8c": "bountiesAllocation()", +"520c7d6f": "PAYOUT_ATTEMPT_INTERVAL()", +"520ce36a": "Permian()", +"520ce39e": "DamnRocks()", +"520d3f0d": "getrate()", +"520e12d7": "getCertAddressByID(string)", +"520e7b0e": "offer_energy(uint32,uint32,uint64,uint64)", +"520e8143": "returnTokenToWallet()", +"520eb620": "getTemplateByProposal(address,uint8)", +"520ee757": "NewSandwichTicket(string,address,string,string)", +"520fa2c1": "BetleyToken()", +"520fd799": "Nplay()", +"52108d4c": "setCCH_edit_30(string)", +"5210eb56": "targetAddress()", +"5211ac2e": "withdrawWei()", +"5211e91e": "CSTToken()", +"5211f843": "bbNetworkGrowthWallet()", +"52122abf": "JackpotHits()", +"52125b86": "eventcount()", +"5212e6ea": "firstExtendedBonusSalesEnds()", +"5213cca8": "AdvisorPoolAddress()", +"52146744": "AteamBets(uint256)", +"52159bcf": "CreateCityData(address,uint256,uint256)", +"5215ad0b": "batchTransfer(address,address[],uint256)", +"5215cb88": "onPresaleComplete()", +"5216509a": "numCandidates()", +"5216aeec": "totalInvested()", +"5217b774": "redeem_withdraw(address,address,uint256)", +"5217cdff": "greyToken()", +"52180208": "take(address,uint256)", +"5218402d": "claim_bix_with_not_start()", +"52185f0e": "isWithinAllocation(address,uint256)", +"5218bfbb": "getOffer(bytes32,address)", +"5218c37d": "bulkRejectTransfers(uint256[],uint256[])", +"5218f3b3": "CoinStocker()", +"52194acf": "addBank(address,address,uint256)", +"52196812": "getLoanCount()", +"5219823a": "hashMessage(bytes)", +"52199094": "setBurningPercentage(uint256)", +"5219a566": "hashForSignature(bytes32,uint256,address,bytes32)", +"5219a72a": "mcgregortoken()", +"5219ffb8": "withdraw_tokens_for(address)", +"521af962": "DataBrokerDaoToken(address)", +"521b20ec": "highestBidAddress()", +"521b601a": "setData_26(string)", +"521b7499": "setStageVolumeBonuses(uint256,uint256[],uint8[])", +"521be69c": "applyTokens(address,uint256)", +"521c82be": "getCCH_edit_17()", +"521cd656": "playersAmounts(address)", +"521ceba7": "pusherTracker_()", +"521d56c6": "regeneration()", +"521d80f8": "fundsTransfered()", +"521e5770": "fechCurrentSnapshotBlockIndex()", +"521eb273": "wallet()", +"521ec3af": "MGLTToken()", +"521ee1ae": "purchaseFor(address,address)", +"521f4195": "isOwn(address,uint64)", +"521fba45": "setTokenInfo(string,address,address)", +"521fba71": "getRandom256()", +"521fbd3a": "deploytime()", +"521fd5be": "getSingleBet(uint32,uint32)", +"52200a13": "getNumHolders(uint256)", +"522103fa": "changeUnicorn(uint256,address)", +"5222cd8a": "Deal(bool,uint8)", +"5223478a": "setIsPoop(bool)", +"52238fdd": "calculateFees(uint256)", +"522471fc": "setTotalWithdraw(uint256,address,uint256,address,bytes,bytes)", +"5224dfbe": "mainTokensPerDollar()", +"52251884": "setForwardPurchaseFeesTo(address)", +"52253542": "playSingleDiceBet(uint256,uint256)", +"5225528e": "getBadAddresses()", +"522567c8": "transferedTokenOf(address)", +"52256d44": "MuratCoin()", +"522577e9": "totalIncome()", +"522637e7": "CMCLToken(uint256,string,string,address)", +"52279295": "interestRatePerCycle()", +"52288195": "Sell(uint256)", +"5229c56f": "getDecreaseAllowancePreSignedHash(address,address,uint256,uint256,uint256)", +"522a6cf3": "computeMilkSellPrice()", +"522afaec": "increase(address,uint256)", +"522bb704": "run(address)", +"522c8401": "bidOnSiring(uint256,uint256,uint256)", +"522dba5b": "GoldTokenMinter()", +"522dc0b1": "walletsFromUser()", +"522dd549": "advisor3Sum()", +"522de7d3": "verifySubmissionIndex(uint256,uint256,uint256)", +"522dff9a": "setMocount(uint256)", +"522e1177": "complete()", +"522e2d3c": "BiathlonToken(address,address,string,string,uint256,address)", +"522e35fb": "changeIssueManager(address)", +"522e4c8a": "addStaff(address)", +"522f6815": "withdrawEther(address,uint256)", +"522f9585": "setNewWallet2(address)", +"52306f4a": "isCBE(address)", +"52314508": "registerOutcome(string,uint256)", +"5232d457": "PayoutEvent(uint256,address,uint256)", +"52337ab0": "interact()", +"52346412": "transfers(address[],uint256[])", +"52353e5b": "assetsOnDeposit()", +"52357779": "currentRId_()", +"523615aa": "AddApprovedAddress(address,address)", +"52374af1": "bitPremiumToken()", +"52375093": "m_lastDay()", +"5237d235": "getRightToken()", +"5237e325": "getAdIdByCat(uint256,uint256)", +"52380eba": "entitled()", +"52380f65": "MoneyAddedForRefund(address,uint256,uint256)", +"52388c1b": "AndreisToken()", +"523898f4": "cooperativeClose(address,uint8,uint256,bytes,bytes)", +"523934bb": "registerExport(bytes8,bytes8,uint256)", +"52393d45": "SGDT()", +"523a0b0d": "privateMaxEtherCap()", +"523a3f08": "withdrawReward(uint256)", +"523ad959": "bullAmount()", +"523aee69": "changeTokenContract(address)", +"523afb0d": "bet(bool)", +"523b6ae3": "MycoinToken(address,address)", +"523c02f5": "getRateForExternal(string)", +"523ccfa8": "isKnownCall(address)", +"523d897e": "wsub(uint128,uint128)", +"523da442": "getCurrentBonusTier()", +"523deadb": "getOwner(address,address)", +"523e27d4": "currentInvestor()", +"523e57be": "mintForHolders(address[],uint256[])", +"523e9551": "increaseCap(uint256)", +"523f110e": "updateRegion(address[16],uint256,uint256,uint256[],bool,bool,uint8[128],bool,address)", +"523f52c6": "setTgeIssuer(address)", +"523f53a6": "IntigoTest()", +"523f891c": "totalEligibleVotes()", +"523fba7f": "tokenBalances(address)", +"5240346d": "TV()", +"52405f56": "getMilestoneInformation(uint256)", +"52411891": "add(uint256[2])", +"52415840": "testMe()", +"5241590d": "addToAddressBalancesInfo(address,uint256)", +"52416347": "ParameterSet(string,string)", +"5241b39d": "renewal()", +"52437187": "callLib(uint256)", +"5244128a": "_claimableTokens(address)", +"52441d7d": "getCurrentUserShareBonus()", +"52447ad2": "doMint(int256,uint256)", +"52447d92": "burn_from(address,address,uint256)", +"5244d9a8": "removeIdentifier(bytes32)", +"5244ed87": "joinToTrack(uint256)", +"524559a3": "periodPreICO()", +"5245849e": "allowedAmountToTransferToPool()", +"5246a8df": "verifySig(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,uint256,address,bytes,address,address)", +"524705ef": "getsysdayeths()", +"52476ceb": "shareTimeGap()", +"524773ce": "burnCount()", +"5247b9e9": "firstMintRound0For(address[],uint256[],bool[])", +"5248f2c8": "removeBankroll()", +"52494a14": "_isOwner()", +"5249be25": "tokenPriceUsd()", +"524a2ed9": "setBAUU(bytes32,address,uint256,uint256)", +"524a8131": "STARTING_ASSET_BASE()", +"524aa413": "ValidateWorldSnapshot(uint256)", +"524aae98": "getPromoLOTEarnt(uint256)", +"524b5cb9": "approveMintDelegate(address,int256)", +"524bd747": "getNbDemandes()", +"524d5ddb": "wagerPool5()", +"524d7daf": "verifyGame(uint256)", +"524d81d3": "numContracts()", +"524dcda3": "MINT_LOCK_DURATION_IN_WEEKS()", +"524e1149": "joinCreateGame()", +"524e2444": "setPI_edit_32(string)", +"524e4e61": "testDistribution()", +"524e65b9": "_getWinnerBetted(uint32,uint32)", +"524e915d": "player4Timestamp()", +"524eb29c": "setRequestBurnerContract(address)", +"524ee639": "setSpaceImpulse(address)", +"524f3889": "getPrice(string)", +"524fa7b9": "whitelistAdd(address)", +"52507790": "transferAfterDeadline()", +"52512599": "latpToken()", +"5251a343": "stopPurchaseTokens()", +"52529852": "W0kiT0ken()", +"5252cb2f": "generateUnsoldTokens(uint256)", +"525417f1": "getNextKeyTime()", +"52541b68": "takeAGuess(uint8)", +"525426fd": "increaseUSDRaised(uint256)", +"52545021": "AkshayToken(uint256,string,string)", +"52548946": "isSimple()", +"5254a38c": "onERC721Received(uint256,address,bytes)", +"5254b595": "TransferIndex()", +"5254b660": "canDeCompose(string)", +"5254c846": "getAction(uint8)", +"525550ea": "rescueAddress()", +"52556421": "getIssuer()", +"52556a46": "State(address[])", +"52558c2b": "CSPTToken()", +"5255a07b": "HeroTokenAuction(uint256)", +"5256a36e": "MAX_ICO_GOAL()", +"5256fcaf": "_giveRNG(uint256,uint256)", +"52573529": "setupPeg(address,address)", +"52578012": "createService(string)", +"5257c2b3": "soldTokenInPresale()", +"5257c508": "ico1Cap()", +"5257c825": "registerNameXIDFromDapp(address,bytes32,uint256,bool,uint8)", +"5257cd90": "randomNumbers(uint256)", +"5258d9f4": "unequipSingle(uint256)", +"5259347d": "default_helper()", +"52595c0d": "getOraFee()", +"5259fcb4": "centsRaised()", +"525a0ac8": "Claim(address,uint256,bool,string)", +"525a8cf0": "add_product(uint256,uint256,string,string,string,string,string)", +"525b25b1": "getDeploymentReward()", +"525b3fe3": "presaleLimit()", +"525c3966": "GMCB()", +"525cedae": "TeamTokensAllocation()", +"525d0537": "getWinnerFunds(uint256[])", +"525f8a5c": "setSaleStartTime(uint256)", +"525ffb7c": "ownersPayed()", +"52608d85": "rateEth()", +"5260de57": "numberOfTokensPerUser()", +"52613423": "OLOVE(uint256,string,string)", +"52617234": "changeSalePeriod(uint256,uint256)", +"5261ee83": "amountOfOwners()", +"5262c873": "calcGain()", +"52631ab4": "lastNonce()", +"52638d75": "create(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"5263ba87": "getLatestPatchTree(bytes32,uint32,uint32)", +"5263dbf3": "RooToken()", +"52642070": "DinarETHCrypto()", +"526441bb": "ExecutionFailure(uint256)", +"5264ff53": "test_forAgainst()", +"5265440c": "checkIsAttached(uint256)", +"5265565e": "_ecosysSupply()", +"5265a078": "getMemoryWordsLog2()", +"5265db80": "setPriceRatePhase1(uint256)", +"526606c9": "addFreezer(address)", +"52666403": "lockRewardToken(address)", +"5266cc7b": "init(address,uint256[],uint256,uint256,uint256,uint256,uint8,string,string,uint8,bool)", +"52675be3": "getElectionName(uint256)", +"5267bd0c": "allowedRefund()", +"5267e681": "Tokens_Per_Dollar_Numerator()", +"526825af": "updateFcontracts(uint256)", +"526938f8": "left35(uint256)", +"5269660c": "createInvestment(uint8[])", +"526a6b48": "transferTo(address,uint256,bytes,bytes)", +"526a99c8": "getJackpotLoseSide(address,address)", +"526aadc2": "mintBaseLockedTokens(address,uint256,uint256,uint256)", +"526b71f4": "InvestboxToken()", +"526b8462": "getPersiansOnTheBattlefield(address)", +"526b91d1": "transferSysAdmin(address)", +"526ba9fa": "TSB()", +"526bc7fa": "getGenCode()", +"526cb803": "getAllOfferingProposals(address)", +"526de5ea": "addChunk2ToWhiteList()", +"526e4d79": "requestRemainingTokens()", +"526e7f3a": "AWD()", +"526f652d": "propertyIdToOwner(uint256)", +"526ff1f0": "TLB()", +"52700ef0": "_changeClosingTime()", +"52704644": "transferFromInternalstaffdisbursementfund(address,uint256)", +"52709725": "owner2()", +"5270aa7d": "EtherGoToken()", +"5270d70d": "readBytes32s(bytes32[])", +"5271027b": "rentFlatDaily(uint256)", +"5271309f": "migrationInfoSetter()", +"5271500b": "batchAddCandidate(address[],bytes32[],bytes32[])", +"52736814": "dutchAuctionToBuy()", +"52748cfe": "addDataResponseToOrder(address,address,address,string,bytes)", +"52753640": "registerXRateProvider(address)", +"52757292": "getEventSecond(uint256)", +"527596bf": "getDeployedChildContracts()", +"5276b91c": "BlackHToken()", +"52772264": "Contract(bytes32)", +"52774565": "getMyLockedFunds()", +"527749a4": "add_bounty(uint256,bytes32)", +"5277fda5": "bookWithEth(uint256,uint256,bytes,string,uint256[],bytes32)", +"52782648": "emitSkillAreasSet(address,uint256)", +"527942ac": "secondWeekPreICOBonusEstimate()", +"52798dae": "buyTicketByEarnings(uint256,uint256,string)", +"5279a5f8": "levelThreeTokenNum()", +"527aea0a": "getWeiBalance(address,address)", +"527ba1e1": "setIV_S(uint256)", +"527c08ec": "Max_CAP()", +"527cc85a": "Zxcvbnm()", +"527d8f12": "ping(uint256,bool)", +"527f0900": "IncPrivateSupply(uint256)", +"527f4ff1": "setTransferAddressUser(address,address)", +"52802121": "depositEther(address)", +"528050a9": "salePreiodChanged(uint256)", +"5280b8ad": "getAmountBounus(uint256)", +"5280c3ee": "dealToken()", +"52810d5e": "UnitToken(uint256,string,string)", +"52812053": "outstandingQuarters()", +"5281947d": "cancelAdoptionOffer(bytes5)", +"5281bbe9": "contractExpirationTime()", +"5282f649": "risedUSD()", +"5283f339": "getAddress(address,string)", +"5283fd87": "giveReward(uint256[4],bool,uint32[4])", +"52848d8d": "kcck256strstr(string,string)", +"5284a4c7": "allocateReferalBonus(address)", +"5284b044": "Products()", +"5284e3d8": "RobotTradingIco(address)", +"5284e660": "_getEndOfLastMiningDay()", +"52855882": "confirmAddress(bytes16)", +"52860ea2": "ADDITIONAL_BONUS_DENOM()", +"528626fc": "updateNextStealTimeByOperator(uint32)", +"52879334": "requireNotZero(address)", +"52879ba6": "roleCheck(string,address,address)", +"5287ce12": "getDepositInfo(address)", +"52883fc6": "addTokenBalance(address,address,uint256)", +"52892478": "disburseAuthorizedPayment(uint256)", +"52892baf": "localConst()", +"52894449": "lastBlock_f17Hash_uint256()", +"528976de": "issueRefunds(address[])", +"528a683c": "keyExists(string,string)", +"528b5176": "zgetOtherContract()", +"528b8ed8": "MaxBusiness()", +"528ce7de": "withdrawByRndNo(uint256)", +"528d4156": "authorizedCreateTokens(address,uint256)", +"528d8797": "ModiTokenERC20(uint256,string,string)", +"528d9479": "FeeUpdated(uint256,uint256)", +"528eb417": "Demome()", +"528ebdd5": "noSales()", +"528eedcb": "sendSafe(address,address,uint256)", +"528ef5a1": "UNINAcoin()", +"528fa135": "changeStartTime(uint64)", +"528fd7b0": "manualPayExpiredDuel()", +"52909fc2": "dynamicExchangeChecks(bytes,uint256)", +"5290d773": "amountBurned()", +"52911bd8": "doesOwnEthHandle(bytes32,address)", +"52916687": "setAuditRegistrar(uint256,address)", +"52929a0c": "disable_throwing()", +"5292af1f": "sendBalance(address)", +"5292c1a9": "testThrowsRestartEnforceRevisions()", +"5292c8f1": "validContribution(address,address,uint256)", +"5293a436": "EscapeHatchCallerChanged(address)", +"5293f22f": "EOSRegistration(string)", +"5294157f": "sendWithAllOurGasExceptExt(address,uint256,uint256)", +"5294188b": "randomizerLottery(bytes32,address)", +"5294409f": "Mineable()", +"5294924d": "getMyLastFreeLotteryTimestamp()", +"5294bb2b": "unpayPooling()", +"5294d0e8": "tokensUnlockable(address,bytes32)", +"52954e5a": "makerTransferAsset(address,uint256)", +"52959d16": "ambiC()", +"5296085e": "callServer(address,uint256)", +"529865c9": "preBuy2()", +"5299ccc6": "isSubjectApproved()", +"529a7d6c": "BurnProposalAdded(uint256,address,uint256)", +"529ae0bf": "maxEthPerAddress()", +"529af369": "createAndSellAllAmountPayEth(address,address,address,address,uint256)", +"529b8e60": "ergebnis()", +"529d15cc": "sequence()", +"529d4800": "getLockedWalletGroup(address)", +"529db099": "viewAllControls(bool)", +"529dbdb5": "getMs(uint256)", +"529e65e1": "removeShopModerator(address)", +"529e6713": "setCustodyFactory(address)", +"529f0fb8": "setFee2(uint256)", +"52a00779": "bountyDelivered()", +"52a08c29": "jackpotPersent()", +"52a0b5ac": "registerBasket(address,address,string,string,address[],uint256[])", +"52a0cf38": "p2pUnlocker(address)", +"52a16bb0": "amountSold()", +"52a23bbb": "approveTokenTransfer(address,address,uint256)", +"52a2695c": "isReachedGoal()", +"52a2720c": "extraTokensTransferred()", +"52a27baf": "read_user_daily_limit(address)", +"52a36938": "initDisabled()", +"52a554a1": "voteBoardProposal(uint256,address,bool)", +"52a5b002": "lastInterestCycle()", +"52a6f970": "ZHEY()", +"52a74b82": "getDebugNumber()", +"52a7cae5": "BitAlphaAirdrop(address[])", +"52a80129": "unlistQualifiedPartner(address)", +"52a82b65": "digest()", +"52a8aeab": "controller1()", +"52a8fe93": "kscBurnWhenUseInSidechain(address,uint256,string)", +"52a9039c": "allocations(address)", +"52a94adb": "TRMCrowdsale()", +"52a982d3": "distributeTokensRange(uint256,uint256)", +"52a9a35e": "retireAdmin(address)", +"52a9cd2d": "changeOwnerVault(address)", +"52aa2ae9": "enterPreSale()", +"52aadf3b": "generateLuckFactor(uint128)", +"52aaead8": "priceLastUpdated()", +"52ac3235": "amountOfQuotations()", +"52ac882c": "retirementManager()", +"52ad2aa8": "__getStore(uint256)", +"52ad4116": "getCrowdsaleStartAndEndTimes(address,bytes32)", +"52ad6468": "SHARE_FOUNDATION()", +"52ae68f6": "getRoundBonusPot(uint256)", +"52af1c04": "parseMessage(bytes)", +"52af719f": "initialize(uint256,address[],address)", +"52af89af": "getsum(uint256[])", +"52afbc33": "scheduleCall(address,bytes4,bytes32,uint256,uint8,uint256)", +"52b1e14a": "insertUser(address,string,uint256)", +"52b33d64": "clientmanagerShare()", +"52b4643c": "Fallback()", +"52b4be89": "totalBuyCardNumber()", +"52b566e4": "CitiDynamicsCoin()", +"52b5e85c": "firstPhaseEndTime()", +"52b5ff39": "RBAC()", +"52b75219": "freezeToken(address,uint256,uint256)", +"52b7fddb": "createMechVRC(uint256,address)", +"52b860eb": "tokenBonusForFifth()", +"52baee20": "getAllHpbNodesByStageNum(uint256)", +"52bafbfa": "vestingBeneficiaryForIndex(address,uint256)", +"52bafde9": "playersSignedUp()", +"52bbde34": "BiddingRing(address,uint256)", +"52bca4c3": "phaseOneCap()", +"52bd6945": "sellReply(uint256,uint256,uint256)", +"52bd9914": "TimeEnd()", +"52bddee6": "uintCeil(uint256,uint256)", +"52bf74b3": "airDropCoin(uint256)", +"52c01fab": "isEntrant(address)", +"52c05ca5": "setWeiPerBlock(uint256)", +"52c0b9f7": "ICO_START3()", +"52c1c03a": "removeUnlockedAddress(address,address)", +"52c1d3d5": "ZenomeCrowdsale()", +"52c204d0": "ICOMeetupToken()", +"52c22a72": "cancelContract(address,address,uint256,string)", +"52c28fab": "add(address,address)", +"52c34e68": "getStandardRobot()", +"52c53cb7": "checkPoint(int256,uint8,int256,uint16)", +"52c5785b": "purchaseTokensPreSale(address)", +"52c5b4cc": "setAuthorizations(address,address[])", +"52c5d892": "withdrawOwnersFunds()", +"52c700ea": "crowdsaleStop()", +"52c743d2": "callDestination()", +"52c76b8e": "TokenGame(uint256)", +"52c76de9": "addDiscountPhase(string,uint8,uint256,uint256)", +"52c790ee": "confirmTokens(address)", +"52c7c9e4": "isSubmission(bytes32)", +"52c8df64": "getFund(uint256)", +"52c91d43": "getLinkedWETHAddress()", +"52c944b2": "removeFromTokenLocked(address[])", +"52c98e33": "checkClaim(address,uint256,uint256)", +"52c9b906": "founderTokenWithdrawnPhase1()", +"52cb2a7b": "calcTransfer(uint256)", +"52cb36cd": "_getUtTotal()", +"52cb7688": "suspendSale(bool)", +"52cbfe09": "summAirdrop()", +"52cc5fdc": "retrieveMyEth(string)", +"52cd972d": "PreSaleCloseTime()", +"52ceac34": "bytesToUint(bytes,int256,bytes)", +"52cf4078": "transfertWDiscount(address,uint256)", +"52cf46d4": "transferAllowed(address,uint256)", +"52cfd41f": "advisorFee()", +"52d005d6": "findNewExchangeContract()", +"52d08730": "DogeCoin()", +"52d0bf14": "setDataColla_AA_02(string,string)", +"52d214a7": "removeUnitMultipliers(address,uint256,uint256,uint256)", +"52d23633": "getNumDividends()", +"52d28a17": "muscFundDeposit()", +"52d2d83d": "setBoolValue(bytes32,bool)", +"52d35197": "JLL()", +"52d3592a": "VoteExecuted(uint256)", +"52d3642d": "sellToContract()", +"52d3a9dd": "rentAuctionContract()", +"52d472eb": "rewardPercentage()", +"52d4747f": "BurnTokensFrom(address,uint256)", +"52d48a95": "getXPub(address)", +"52d4e76c": "ControllerRetiredForever(address)", +"52d50408": "statusContribution()", +"52d5ad25": "currentRecords()", +"52d63b7e": "setNextSale(address)", +"52d6804d": "minimum()", +"52d714e8": "approveMintingManager(address)", +"52d7d861": "AddrChanged(bytes32,address)", +"52d850d1": "tstinx()", +"52d8bfc2": "recoverEther()", +"52dbb027": "newModelShipProduct()", +"52dc09a5": "test_4_assertGasUsage700Boards()", +"52dca247": "ttlInvestCount()", +"52dd336a": "_tokenAllocate(uint8)", +"52e021c2": "securityReg(address)", +"52e0d025": "maxUserPayment()", +"52e0d0fa": "BIPOOH_DAO_32_a()", +"52e11d12": "DanCoin()", +"52e1ea89": "setDonator(address)", +"52e2525f": "ownerSetFee(uint256)", +"52e2f9ea": "MerculetToken(uint256,uint8,string,string)", +"52e32a55": "bounty0xToken()", +"52e34245": "disputeTX(uint256)", +"52e3d369": "saleConversionRate()", +"52e40d96": "PPKToken()", +"52e43613": "approveToMint(uint256)", +"52e536ad": "icoLeftSupply()", +"52e578ad": "LOG_EmergencyAutoStop()", +"52e57d1f": "makeLogError(uint8,uint256,uint256)", +"52e60b90": "setTalentCardAddress(address)", +"52e686a0": "EnableReturnFunds()", +"52e68c46": "list_token_ask(address)", +"52e8f2c3": "deleteRecord(uint256,string,string,bytes32)", +"52e94beb": "setPrice(uint256,bool)", +"52e97326": "changeTotalSupply(uint256)", +"52ea5667": "getMPbyIndex(uint256)", +"52ea8a71": "setRandomApiKey(string)", +"52eae80b": "doProvideStateRoots(uint256,bytes32,bytes32[])", +"52eb2580": "Tethered(address,string,string,uint256,uint32,uint256,uint256,string)", +"52eb5751": "MedicoHealthContract()", +"52ec8a58": "mint_and_transfer(address,uint256)", +"52ece9be": "freezeAllowance(uint256)", +"52ecf7c4": "pickWinner(uint256,bool,bool,bool,bool,bool,bool)", +"52efd35f": "INCENT_FUND_VESTING()", +"52efea6e": "clear()", +"52effe11": "transferOwnershipTo(address)", +"52f17ce9": "pomda()", +"52f18042": "addAdditionalBonusMember(address)", +"52f1e07b": "ethRefundAmount(uint256)", +"52f1f48c": "setInv3(address)", +"52f29a25": "nextPunkIndexToAssign()", +"52f37c40": "isHodler(address)", +"52f445ca": "setAssociatedContract(address)", +"52f46769": "InitializedTier(uint256,uint256,uint256,uint256,uint256)", +"52f50db7": "initiate(uint256,bytes20,address,address,uint256)", +"52f59e0e": "AICH()", +"52f62195": "picops_enabled()", +"52f662bb": "sendTokensToInvestors(address)", +"52f6747a": "rules()", +"52f6ca76": "deadDragons()", +"52f6ee58": "exponent()", +"52f775c8": "ViewSecretBet(address)", +"52f7c988": "setFee(uint256,uint256)", +"52f804a8": "burnPollStake(address,bytes32)", +"52f84b1b": "BlangsakToken()", +"52f8a766": "TimeStampSubstructOneDay()", +"52f9058b": "getFreeRickAndMorty()", +"52f91acf": "triggerDispute()", +"52f97117": "createContract(bool,string)", +"52fa1ac2": "createUnicornForCandy()", +"52fa2650": "withdrawPercents(uint64)", +"52fa3712": "makeBet(address,uint256,bytes32)", +"52fb0561": "setWhitelistedTransferer(address,bool)", +"52fba25c": "attack(address,uint256)", +"52fbeb57": "transferToContractWithCustomFallback(address,uint256,bytes,string)", +"52fc01f9": "func_1(uint256,uint256)", +"52fd2c15": "ServiceStation()", +"52fdcc65": "GAME_SUPPLY()", +"52fdeef5": "_addToFundHWC(uint256)", +"52fe8163": "randomDS_sessionPubKeysHash()", +"52fea23c": "teamAllocator()", +"52fedceb": "getMarketComissionRatio()", +"52fedefa": "decrementBalance(address,address,uint256)", +"52ffeb30": "highestBidTime()", +"52ffff99": "addAllowContractList(address)", +"5300a306": "changeTransactionFee(uint256)", +"5301fa52": "setPromoCode(address)", +"5302470a": "submitPlaintext(uint32,uint32,uint256,uint256)", +"530266c7": "getSellOrderInfo(address,address)", +"5302a136": "fourthPriceTime()", +"53030d91": "investmentAddress()", +"5303a5d7": "RESEARCH_DEVELOPMENT()", +"53043490": "ownerTransferFrom(address,address,uint256)", +"53047154": "createPromoMovie(address,string,uint256)", +"53055262": "awardMarble(uint256,address)", +"53055481": "totalDeposited(address)", +"53056351": "DIGIPLACEDS()", +"53067968": "GetSellingTokenContractAddress()", +"53069df6": "getRepaidAmount()", +"5306a5af": "LogRollbackTransfer(address,address,uint256)", +"530795fb": "initNormal()", +"5308db4b": "finalizeBundleIPFS(bytes32,string,bytes32)", +"5309ce38": "PrintLimiter(address,address,address,uint256)", +"530abf0f": "distributeTokensToContributor(uint256,uint256)", +"530b1e1a": "recording(address,uint256)", +"530c435f": "whaleWantMyEther()", +"530c4ca6": "setGames(address)", +"530c515e": "stake(uint256,address,uint256,uint256,uint256)", +"530c6868": "getContributorETH(address)", +"530d26b0": "MattewWon(string,address,uint256,uint256)", +"530d44f4": "normalRate()", +"530dfad3": "addItemToUserDebt(address,bytes32)", +"530e3543": "addMemberToGroup(address,uint256)", +"530e784f": "setPriceOracle(address)", +"53105fbc": "tokenConversionFactor()", +"5310f0f4": "priceInUsd()", +"531163c1": "TOKEN_MAIN_CAP()", +"53127b88": "encrypt(uint32[26],uint32[4])", +"5312918b": "VestingEndedByOwner(address,uint256,uint256)", +"5312aa24": "Bigchaintoken()", +"5312ab19": "HoviiExchange()", +"5312b4bb": "pyrBalanceOf(address)", +"53135ca0": "presaleActive()", +"5313d890": "_markCredit(address,uint256)", +"53147d4f": "TokenCrowdsale(uint256,uint256,address,uint256,address,address)", +"531571a9": "connectTokens(address,address)", +"5315810e": "isSponsor(uint32,int256,uint32)", +"53176195": "witnesses()", +"53179413": "transfersBlocked()", +"5317e444": "removeUserPermission(address,bytes4)", +"5319418a": "transferLockedBalance(address)", +"5319ae10": "generateInstance(address[2],bytes,bytes32[2],uint256[3],bytes32[3],bytes,bytes)", +"531a7f29": "dateProductCompleted()", +"531b6d98": "LogHodlSetStake(address,address,uint256)", +"531b97d7": "oneCentOfWei()", +"531c1b33": "getOperatingBudget()", +"531c267e": "getGameResolverData(uint256)", +"531c8628": "amount_referral_invest()", +"531c9a56": "iPayStar()", +"531ca478": "VantageCrowdsale(uint256,uint256,uint256,uint256,uint256,address)", +"531ce262": "bankWithdraw(address,uint256)", +"531d1974": "testThrowRetractLatestRevisionEnforceRevisions()", +"531e1ee0": "EarlyPurchaseInvalidated(uint256)", +"531e4827": "poolTimeLastMinted()", +"531ebce5": "getReceiverAddress()", +"531ef079": "setBvToBpFee(uint256)", +"531efbee": "_score(bytes32)", +"531f0ade": "_adjustValue(uint256,uint256,uint256)", +"531f4c40": "accept(bytes32,bytes32)", +"531ff93b": "setMrkContract(address)", +"53214e5a": "kilo()", +"53216223": "TravelCoin()", +"5321fe04": "subFromBalance(address,address,uint256)", +"5322f0c5": "getChannelOwner(bytes)", +"5322f9d1": "switchSale()", +"532399d9": "setTransContractLocked(bool)", +"5323c6cf": "calcCostsBuying(bytes,uint256,uint256[],uint8,uint256)", +"5323df9e": "getShipDetails(uint32)", +"53240172": "midiv(uint64,uint64)", +"53251389": "addBridgeNativeFeeReceivers(uint256)", +"5325dc16": "test_validShouldBe3()", +"53269475": "loveToken()", +"5326ba37": "setSaleAuctionERC20Address(address,address)", +"53270910": "deedOfOwnerByIndex(address,uint256)", +"5327f96e": "OwnerTransfer(address,address)", +"53286957": "CuboToken(uint256)", +"53290b3a": "setStateLoading()", +"53290b44": "getBalanceOf(address,address)", +"53290d1c": "founderGrant(address,uint256,uint256,uint256,uint8)", +"53295e44": "OtcgateToken(uint256,uint8,string,string,address)", +"53297b71": "completeReleaseAuction(uint256)", +"5329c681": "checkTimeout(uint256)", +"532af7d2": "calculateResult(uint256,uint256)", +"532b581c": "round2()", +"532b5f86": "createBytes32(bytes32,bytes32)", +"532c3dc5": "nAuditors()", +"532da8f9": "getDelayDays(uint256)", +"532e4849": "setTokenUriPrefix(string)", +"532e7e6a": "calcEarningsSelling(bytes,uint256,uint256[],uint8,uint256)", +"532e87e4": "setTimeForCrowdsalePeriods()", +"532eb619": "_sellTokens(uint8,address)", +"532f1041": "setFormat(bool)", +"532f1179": "refundsEnabled()", +"532fb092": "isApproveConfirm(uint256)", +"532ff308": "setBonusRates(uint256[],uint256[])", +"532ff568": "Tutancoin()", +"533019cb": "kyberReserve()", +"5330a4c6": "buyMicroKeys(string)", +"5330bc61": "disallowTransfer(address,bool)", +"533178e5": "get_rate()", +"53322527": "EthlanceViews(address)", +"5332510b": "EthernautsLogic()", +"533265e6": "Database()", +"53329856": "secondBuyPrice()", +"5333c507": "allowTransferFor(address,bool)", +"5333ee4d": "buyEgg(uint256,uint256)", +"533425a5": "icoPeriod()", +"5334398f": "addRecordwithReward(bytes32,string,string,address)", +"53344481": "isInTier1(address)", +"5334c231": "currentSwapRate()", +"533574ca": "getLastDividends(uint256)", +"53358fc4": "castVote(address)", +"5336cd16": "_getEndIndexKey(uint256)", +"5337421a": "TrumpBingo()", +"5337448e": "payWinners()", +"53376d1f": "revokeAuthentication(address)", +"5337fa10": "awardPoint(int256,bytes32)", +"53384da7": "updateTier(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"5338b3e4": "miningTokenLeftInCurrent()", +"533945df": "editMemeTemplate(uint256,string,string,string,string)", +"53397be3": "lastConsolationPrize(uint256)", +"53398119": "emergency(bool)", +"533a645c": "minTx()", +"533ae8e5": "inTipperQueue(uint256,address)", +"533b180e": "LAcoin()", +"533c023b": "getGroupRight(string,string)", +"533d4270": "ClipperCoin(uint256,uint8,string,string)", +"533da8df": "getAreaOwner(string)", +"533de9e5": "addSmartContractByAddress(address)", +"533e00ec": "approveAndDo(address,uint256,address,bytes32,string)", +"533f6730": "clearInventory(uint256)", +"53400e7f": "debugNow()", +"534104df": "UnilotTailEther(uint256,address)", +"5341903b": "upgradeMe(address)", +"5341d618": "setDataColla_AB_02(string,string)", +"53423e50": "MaengDevToken()", +"5342da41": "testBeyond()", +"5343e6a4": "rateFinalStage1()", +"5343f1a0": "cancelOrderWithMerchant(string,address)", +"534439a3": "mintingDec()", +"53448316": "MIN_SALE_AMOUNT()", +"53449d26": "TourPool()", +"534514ee": "adminCharge_p3()", +"53458f5e": "defaultTreesOwner()", +"5345c415": "LogOwnerAdded(address)", +"534607fb": "info_OwnerOfContract()", +"53462d6b": "getReleaseTime()", +"53462fd8": "NCPTokenDeposit()", +"5346dcc5": "calculateTokensEnabledforAirdrop(address[],uint256)", +"5347d58c": "Paradime01()", +"534844a2": "withdrawAmount()", +"534878fb": "reply(address,address,bytes32,bytes32)", +"53488f0a": "activateAuction(uint256)", +"5348ac95": "makeTokensTransferable()", +"53490c67": "earlySuccessBlock()", +"53490fbb": "EPR()", +"53497794": "RepublicKey(address[])", +"534992c8": "showTokenBalance(address)", +"5349a335": "setThirdAdmin(address)", +"5349cdb6": "Testcoin()", +"5349efdc": "generatetoken(uint256)", +"534a2f7c": "WTechCoin()", +"534b0391": "getVerifiedInfo(address,address,string)", +"534c2609": "checkBtcRequestSignature(bytes,bytes,uint256,bytes)", +"534d5acb": "initialBSTSupply()", +"534d5ce3": "RobaToken()", +"534ddf19": "reclaimContributionDefault(address)", +"534e05c1": "_goldFreeze(uint256)", +"534e2645": "getLucy()", +"534e3f81": "finishPVP()", +"534eb1d4": "offerBonus(uint256)", +"534eec2c": "Yacksoncoin(uint256,uint256)", +"534f6a2d": "LogGrantClaimed(bytes32,uint256)", +"53501052": "extraTokensPercent()", +"53511819": "triggerAssertError()", +"53515226": "getEtherProceedsAccount()", +"5351ad81": "FrellyToken()", +"5352aadb": "allowedBetAmount()", +"5352b889": "isNewRound()", +"53535db9": "deployWallet()", +"53537303": "bonusRatePeriodOne()", +"5353a2d8": "changeName(string)", +"5353e168": "rlc_team()", +"53547d3f": "mintBooty()", +"53554015": "newZeusPriceTicker(string)", +"53556559": "exchange(uint256)", +"5355ee2f": "CryptoSneakersCoin()", +"535779ef": "removeFromAddresses(address)", +"5357b989": "calculateFee(uint256,uint256,uint256)", +"53584939": "bytesToBytes32(bytes,uint256)", +"5358677c": "BACKUP_FOUR()", +"5358c119": "getFaucetByCreator()", +"535999aa": "getarg_3_input()", +"535a920c": "setLANDRegistry(address)", +"535b27dd": "BitImageTokenSale()", +"535b4e58": "adminResetLottery()", +"535bf003": "appVersionList(bytes32)", +"535c69b6": "setEthAuction(address)", +"535d1ab3": "claimWork(uint256,uint256,uint256)", +"535d3f22": "RankingBallGoldToken(address)", +"535d4156": "killWithBenefits()", +"535d9289": "RDPTicks()", +"535dc2b0": "_b1(string,uint256,string)", +"535e401c": "check(bytes32,bytes32,bytes)", +"535f23ad": "mainSaleStartDate()", +"53601ec5": "_transferFees(uint256,uint256[],uint256)", +"5360cd82": "GetContractInfo(string)", +"53613273": "setTymTokensWallet(address)", +"53613769": "setDistributorAmount(address,bool,uint256)", +"53613dd3": "creatorFeePercent()", +"536253a9": "getRandomForContractClanwar(uint256,uint256)", +"53636220": "depositToExchange(uint256,uint256)", +"53645caa": "rewardDays()", +"5364e45d": "setStartBalance(uint256)", +"5364f721": "getArbInfo(uint256)", +"536529dd": "WarpSpeed()", +"5365939c": "unlockedTokensInternal(address)", +"5365ccf7": "CCH_MENA_1()", +"53661f87": "initStorageOwner(address)", +"53663c0b": "distributeAIC(address[],uint256)", +"53667f10": "getContracts(address,address[],uint256)", +"5366d0fd": "operationalExpensesWallet()", +"5366f338": "publishFor(bytes12,address)", +"53677154": "placeAnswer(uint256,string)", +"5368cc55": "getBack2()", +"536942b6": "finalizeAndRestart()", +"536a3ddc": "currentGameId()", +"536aace8": "setUserSignupTokens(uint256)", +"536ab151": "onFailedAffirmation(address,uint256,bytes32)", +"536bd93a": "SetAccessoryDataContact(address)", +"536c1ddd": "SampleERC23Token(address,uint256)", +"536c26e5": "MiniMeIrrevocableVestedToken(address,address,uint256,string,uint8,string,bool)", +"536c2e4a": "sendEmail(address,string,bytes32,string)", +"536c8c15": "jurySize()", +"536c9a7f": "dividendFundAddress()", +"536cb736": "setPreUri2(string)", +"536cfceb": "todaysSupply()", +"536d888b": "isServiceOwner(bytes32,address)", +"536d97c2": "setDividendsPercent(uint256,uint256)", +"536db4a8": "getParametersHash(uint256[14])", +"536dd8f9": "maxTokensToSold()", +"536e08bc": "getTokensBalance(uint256)", +"536e2800": "buyForWorkOrder(uint256,address,address,address,string,address,address)", +"536e2c75": "challengeCanBeResolved(uint256,bytes32)", +"536e3f6a": "getOracleData(uint256)", +"537038c3": "BOUNTY_PERCENT()", +"5370a049": "thebank()", +"5370e3d4": "Ozreal()", +"53718569": "generateRandomStats(string)", +"537187a3": "transferWithMsg(address,uint256,string)", +"53719b6e": "lockedTokens(address,uint256)", +"5371e490": "Presalezillion()", +"53729273": "getLLV_edit_9()", +"5372a9ce": "addService(address)", +"5372c1db": "PeriodicTokenVesting(address,uint256,uint256,uint256,uint256,bool)", +"53734dc5": "refundContribution()", +"53738a4c": "distributeOwnedTokensFromOtherContracts(address,address,uint256)", +"53749313": "PortToken()", +"5374eec3": "hijack(uint256,uint256)", +"5375a828": "createLibraryWithFounder(string,string,address)", +"5375f182": "IronHandsCoin()", +"5376a03d": "getProfitOrLoss(address,address,uint256,uint256)", +"53770f9a": "isStateless()", +"53775572": "_claimOreAndClear(uint32,uint8)", +"53779c11": "claimDividendByIndex(address,uint256)", +"5377f047": "allowedMultivests(address)", +"53790097": "Exhibition()", +"53799e7d": "frozenType(string)", +"537a082c": "withdrawSaleRequest(uint256)", +"537a924c": "Pay()", +"537afe94": "eastadscreditsx()", +"537b9c93": "NotFomo3D()", +"537bf9a3": "updatePermissionName(address,bytes32)", +"537ca660": "_setPetValue13(uint256)", +"537dbb80": "claimUserToken(address)", +"537df3b6": "removeFromBlacklist(address)", +"537f5312": "updateSymbol(string)", +"537f74fc": "_transferFrom_byProxy(address,address,address,uint256,bytes)", +"537fcd6b": "_computeAndSetBaseParameters16_18_22(uint256)", +"537fdf59": "user_redeem()", +"538082af": "UKG_FUND()", +"53811553": "getCertificate(bytes32,bytes32,bytes32)", +"53813af8": "getmy(address)", +"5381464c": "PRE_SALE_START_TIME()", +"53819e85": "getTotalComission(address)", +"53822cda": "createShortId(bytes32)", +"53844552": "addPayees(address[],uint256[])", +"5384527a": "tokenResend()", +"5384602d": "craetePartnerBytes(address,address)", +"5384734e": "isConfirmedStackholder(uint256)", +"53850db3": "getParticipantById(uint256)", +"538548c5": "recevedEthFromEvabot(address,uint256)", +"538564de": "assegna_diritto_di_voto(address)", +"5385726e": "maxTIPSupply()", +"53865562": "CLOSING_TIME()", +"5386b7ad": "dtTestWorldSnapshot(uint256)", +"538739fa": "operatorManager(address[],uint8)", +"538741c5": "getAllowedContracts()", +"5387a233": "feeLottery()", +"538811cf": "hasAllocated()", +"5388842c": "mintTicket(address,string)", +"53892496": "finney2LemoRate()", +"538a289a": "getSandwichInfo(uint256)", +"538a3f0e": "initializeFactory(address)", +"538a849c": "newRound(uint256,uint256,uint256,uint256,uint256,bytes32,uint256)", +"538a8c21": "giveawayReserve()", +"538b9618": "createElectionVerify(bytes32,bytes32[])", +"538c91b2": "validCandidate(string)", +"538d1267": "Announcement()", +"538df6f2": "claimedPrepaidUnits()", +"538dfcac": "contributionRejected()", +"538e0759": "refill()", +"538e0ff4": "totUsers()", +"538e8ae0": "assertEq19(bytes19,bytes19,bytes32)", +"538eae06": "ZuperToken()", +"538f5997": "getBalanceSize()", +"538fb98c": "getCarProductCurrentPrice(uint32)", +"53900bdd": "incirculation()", +"5392279d": "CryptoWCRC(uint256,uint256,bool,address,address)", +"539407f6": "committeesNumber()", +"53941a74": "addInviteId(uint256)", +"5394772a": "MIN_BET_VALUE()", +"5394e49e": "getRandomPosition(uint8,uint8)", +"53954574": "withDrawBack()", +"5395dbb1": "createSchedule(address,uint256,uint256,uint256,uint256,uint256)", +"5397c83c": "distr0(address,uint256)", +"53994d51": "ThreeDJSToken(uint256)", +"53999040": "buyLandForCandy(uint256)", +"53999339": "prepareLiquidityReserve()", +"539af982": "changeStartDate(string)", +"539b9648": "icoSmartcontract()", +"539c0f14": "deposit2()", +"539e2bfb": "secondChainedCallback(uint256)", +"539f70d8": "setOperationState(uint8)", +"539ff41a": "ADVISORS_WALLET()", +"539ffb77": "cancelRedeem(uint256)", +"539fffc9": "WithdrawPrize()", +"53a01f68": "createWizzPanda(uint256[2],uint256,address)", +"53a023d1": "EUSBToken()", +"53a04b05": "play(uint8)", +"53a06609": "_incrementInventory(uint256,uint256)", +"53a1c51e": "getInitializeMarketValue()", +"53a3b71e": "tossIntoTheFire()", +"53a40850": "userHasPattern(address)", +"53a454e0": "SubtractAmount(uint256)", +"53a47bb7": "nominatedOwner()", +"53a4c8a3": "TriggminePresale()", +"53a4caee": "getMajorThreshold(address)", +"53a50f0f": "addDeal(uint256,uint256,string,string,uint256,bytes32)", +"53a5e2d9": "teamGrantsAmount()", +"53a5e68f": "CircusToken(address)", +"53a636dd": "updatePrice(uint256,uint256,string)", +"53a6e2c9": "Mantapjar()", +"53a73f6e": "setTotum(address)", +"53a8b307": "getObjective()", +"53a94aa6": "_computeNextSeedPrice(uint256,uint256)", +"53a9698a": "isProviderFor(uint256,address)", +"53a97873": "getPrice(bytes10)", +"53a9fc9c": "ELVToken()", +"53aa3f5e": "getUInt(bytes32,bytes32)", +"53aa7dcd": "setCallerFee(uint256)", +"53aaa63f": "collectBack2()", +"53aab098": "addPriceFeed(uint256,uint256,uint256,uint256,bytes)", +"53aab434": "buyIn()", +"53aaef7d": "weiToTokens(uint256)", +"53aaf7c7": "OperatorProductCommissionChanged(uint256)", +"53abf7f4": "parseTrade(bytes)", +"53ac36f4": "DropReward()", +"53acae4a": "RANGESTART_4()", +"53acb23f": "unlockPriceChange()", +"53adce21": "getGroup(address)", +"53ae8de6": "modify_Presale1StartDate(uint256)", +"53af5d10": "closingAddress()", +"53afda90": "initDiscounts(uint256[],uint256[])", +"53b0b620": "allocateBid1(address,bytes32)", +"53b15f31": "get_asset_details(bytes32)", +"53b1b49b": "Human()", +"53b239c7": "setPoWtfContract(address)", +"53b2dd41": "WGCToken()", +"53b382ea": "manuallyEnded()", +"53b5015c": "getClientSupply(address)", +"53b5306b": "getUnfreezingPrice(uint256)", +"53b54f5e": "transferWithoutDecimals(address,uint256)", +"53b5b427": "team4LockEndTime()", +"53b5b50a": "publish(bytes32,string,bytes32)", +"53b64b0b": "setNumDepositsSigned(bytes32,uint256)", +"53b6f766": "addTotalIndividualWeiAmount(address,uint256)", +"53b7a59b": "destinationWallet()", +"53b7b2e9": "cEthereumlotteryNet(bytes)", +"53b86342": "withdrawOwnersMoney()", +"53b8e278": "upgradedContract()", +"53b90b5b": "addWalletEmail(address,string)", +"53b93358": "_getPoS(address)", +"53ba11d0": "icoWalletAddress()", +"53babaf9": "processStellarReward()", +"53bad0b9": "boschcoin()", +"53bb2eb6": "buyOffer(uint256,uint256,address,bytes32)", +"53bc147e": "lastKickoffDateBuffer()", +"53bc1c12": "getJobState(uint256)", +"53bc1d9b": "ONTOPToken(uint256,string,string)", +"53bc373d": "SIT(address)", +"53bc7399": "play_stone()", +"53bc7d62": "setInvalidWithReturn()", +"53bd353b": "EarlyTokenSale(uint256,uint256,address,address)", +"53bd755a": "__setTokenPrice(uint256)", +"53bd8bdb": "isRequestExecutable(uint32)", +"53beb1f8": "checkHalfLife()", +"53bfd3d0": "getUserTearAward(address,uint256,uint256)", +"53c048ce": "TICToken()", +"53c06966": "startMining(address)", +"53c194af": "createIco(uint256,uint256,uint256,uint256,uint256,address)", +"53c1b31f": "MooToken(uint256,string,string)", +"53c24064": "EasyMineTokenWallet()", +"53c2828f": "rentalBalanceRemaining()", +"53c2e8ab": "FacebookCoin()", +"53c3419b": "bet(uint256,uint256,uint256,uint256,uint256,uint256)", +"53c37276": "frozenDaysForPreICO()", +"53c3a57d": "recalcFlags()", +"53c3cc1f": "ResumeEmergencyStop()", +"53c3fe8a": "hasICOClosed()", +"53c4aeac": "crowsaleSlots(uint256)", +"53c549da": "LemonContract()", +"53c64fbc": "peekQueue()", +"53c66d90": "YEEToken()", +"53c7186c": "test_token_creation()", +"53c7801c": "second_round_start()", +"53c8388e": "updateMetadata(uint256,string)", +"53c84526": "setSmartAffiliateContract(address)", +"53c86cfc": "UvoCash()", +"53c9843f": "preIcoCashedOut()", +"53ca1aa8": "GOLD_TO_COLLECT_1SWORD()", +"53cae7b8": "distributeAirdropMultiPresale(address[],uint256[],uint256[])", +"53caf582": "testThrowSetNotUpdatableNotOwner()", +"53cb26c6": "preciseDecimalToDecimal(uint256)", +"53cb430f": "setoldtoken(address)", +"53cc2fae": "unFreezeAccount(address)", +"53cc3e7a": "sysPrice()", +"53ce0a71": "USACoin()", +"53ce7de9": "participantIndex()", +"53ce910e": "getSafeKey(uint256)", +"53cea153": "claimableOwnerEth(uint256)", +"53ceee6c": "icoBuy()", +"53cf4d2b": "indexshow(address)", +"53cf51bc": "rewardSent()", +"53cfdda3": "setMonthlyPrice(uint256)", +"53d0f255": "STEP()", +"53d142a7": "setTokenInfo(uint16,string,address,uint64,uint256)", +"53d2822d": "isVesterManager(address)", +"53d3e848": "abortICO()", +"53d3ed60": "isBotAt(address,uint64)", +"53d3eeee": "profitsRatePercent()", +"53d413c5": "removeKey(bytes32,uint256)", +"53d590bc": "softUndelete(bytes32)", +"53d69b07": "setPreSaleStartAndEndTime(uint256,uint256)", +"53d6fd59": "setWhitelist(address,bool)", +"53d70700": "setVotingParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"53d736ed": "CreateCard(uint256,string,string,string,string)", +"53d73718": "voting_info()", +"53d74fdf": "totalHolders()", +"53d797c9": "GetGoodsInfo(uint32)", +"53d7edbc": "_crowdsalePaused()", +"53d838b6": "getMatchAwayPlayers(uint256)", +"53d97e65": "setPrizes(uint32[])", +"53d99c2a": "tokenToEthRate()", +"53d9d910": "create(address[],uint256,uint256)", +"53da0c7e": "bonusesForAmountsCount()", +"53da4859": "ACT()", +"53dad947": "oraclizeContract()", +"53db1deb": "DredgrSwap()", +"53db5fdb": "getCreatorTAOSettingDeprecation(bytes32)", +"53db6b21": "AUMToken()", +"53dba812": "Horizon0x()", +"53dc4cf1": "Greedy()", +"53dd1902": "strcat(bytes,string,bytes,string)", +"53dd8881": "tweakDailyDividends(uint256,uint256)", +"53de63e3": "isMasterWallet(address)", +"53e0b78f": "LandClaimContractSet(address)", +"53e0c46d": "nuoyilian(uint256,string,uint8,string)", +"53e1509c": "addExchangePartnerTargetAddress(address)", +"53e1a169": "doPayment(address)", +"53e1ead9": "companyAddress()", +"53e215f4": "getNodeInfo(uint256)", +"53e3926c": "compareNums()", +"53e4d8ef": "admin_set_withdrawable(bool)", +"53e4e607": "get_parameters()", +"53e551ff": "createContractItem(string,bytes32,address,address)", +"53e68147": "emissionInternal(uint256)", +"53e68720": "sendToBeneficiary()", +"53e7168b": "setUInt(bytes32,bytes32,uint256)", +"53e7d39c": "batchTtransferEther(address[],uint256[])", +"53e7daf2": "NewStandardToken(uint256,string,uint8,string)", +"53e86a88": "contributorsTotal()", +"53e8c040": "Winn()", +"53e9574a": "FOUNDERS_TOKENS_PERCENT()", +"53e9dcae": "attributeType(uint256)", +"53ea04fe": "AgencyLock2()", +"53ebf6bd": "setContractLock(bool)", +"53ecbdd2": "getTankType(uint256)", +"53ed5143": "getAll()", +"53ed589b": "LogNewProvider(address,string,bytes32)", +"53ee9114": "PassDao()", +"53eeb430": "allPurchasedSprites(uint256)", +"53ef5e03": "amount5()", +"53ef6781": "_start()", +"53efb13f": "setContractDurationInDays(uint16)", +"53f072e3": "numApis()", +"53f11cb3": "asm_clean(uint256,uint256)", +"53f24e33": "isUpgradeInterface()", +"53f25ca6": "isNameEmpty()", +"53f3807c": "STATE_PLAYING()", +"53f4a519": "queryResource()", +"53f4b36f": "calcFin()", +"53f4db01": "totalWeiRaised()", +"53f63bb3": "setPreSaleFinishDate(uint256)", +"53f65cf7": "forceRecoverCollateral(bytes32,address)", +"53f6740d": "setKpopItemContractAddress(address,address)", +"53f6ef28": "EUFBToken()", +"53f6f01f": "ADVISOR_STAKE_TWO()", +"53f754e0": "tokensDue(uint256)", +"53f818d6": "checkBetValue()", +"53f81ef8": "getSubscriptionTo(bytes32)", +"53f8e415": "SetDonateStep(uint256)", +"53f92e49": "UnableToRejectPayment(address,bytes8,uint256)", +"53f95cc6": "THIRD_TIER_DISCOUNT()", +"53f9ca96": "CCC(uint256,string,string)", +"53f9ec67": "setIsInvalid(bool)", +"53faa9a9": "changeRecovery(address,address)", +"53fafd15": "makeTransfer(uint256)", +"53fb9233": "checkDocument(string)", +"53fc3923": "safeAdd40(uint40,uint40)", +"53fc79d1": "setTargetDiscountValue5(uint256)", +"53fd0670": "sellArtworks(uint32[])", +"53fe12b0": "setusertoken(address)", +"53fe189c": "setAElfMultisig(address)", +"53fe7a59": "PURCHASER_MAX_TOKEN_CAP_DAY1()", +"53fefd7d": "changeMaxDeposit(uint256)", +"53ff7766": "_escrowTheAOPaymentEarning(bytes32,uint256,uint256,uint256)", +"53ffab1d": "disableconstruction()", +"53ffe1f9": "setRentalPricePerSecond(uint256)", +"5400a93e": "payoutMatch(uint256,uint8,bool)", +"54019949": "getShopOwnerCategorizedProducts(string,string)", +"540273bb": "changejp1(address)", +"54032862": "ZapCloud()", +"5403a0e5": "getTeamToken()", +"5404bbf7": "getEntropy()", +"54057aa6": "setPriceClaim(uint256)", +"5405e4f4": "SMILE()", +"54063f4e": "sendETHfromContract()", +"54070f83": "getTournamentAdmissionBlock()", +"54091a20": "removeFromTransactionDisallowedList(address)", +"540a5e4e": "cs()", +"540a9db3": "getVestingAccount(address)", +"540ae26f": "MassERC20Sender(address)", +"540b2255": "_invest(address,address)", +"540b34a0": "listMOC()", +"540c755f": "ethWithdraw()", +"540c97c8": "getAllRevisionIpfsHashes(bytes20)", +"540cafe0": "storeHeaderWithFee(bytes,int256,address)", +"540cc484": "getPreSaleTokensSold()", +"540cf75e": "getPendingPresaleTokens(address)", +"540d888e": "SendTaxFee(address,address,address,uint256)", +"540d915e": "serviceGroupChange(address,uint8)", +"540e2f5b": "customTokenDefrosting(address[])", +"540ea6db": "getuseraddress(uint256)", +"540f3d6d": "feeProcess()", +"540f5631": "isUnderwriter()", +"540fd4df": "addressFundFoundation()", +"54105974": "AdHiveToken(address,string,string,uint256,uint256)", +"54107401": "declareLove(string,string)", +"5410ac50": "raiseCap(uint256)", +"5411029d": "_validSignature(address,uint256,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"54114dee": "Caps()", +"5412af17": "Watsondog()", +"541334f6": "isUnicornContract(address)", +"5413d6f4": "ImmlaToken(address)", +"54147ecb": "withdrawForTokens(address)", +"54149777": "getAirDropedToday()", +"54149975": "DeleteToken()", +"54151bc3": "createPostboyAccount(uint256,uint256,bytes16)", +"54153f91": "getArrIntField1()", +"5415b8f8": "setAssetFeesList(address[],uint256[],uint256[])", +"5415c86e": "chngReNo(uint256)", +"5415f3a7": "buyStudioStake(address,uint256)", +"5416707c": "getEthOfferAmount(uint256)", +"541694cf": "get_exchange(uint32)", +"5416995e": "TGCToken()", +"5416a724": "isUserKYCed(address)", +"54186bab": "SolarDaoToken()", +"5418796c": "pubKeyToEthereumAddress(bytes)", +"5418bea9": "getCountReadyPlayerByTrackId(uint256)", +"5418ecdd": "setTokenHash(uint256,uint256)", +"54192046": "setAuctionStart(address,address,uint256)", +"541a01ed": "presaleTokenVault()", +"541a3656": "optionOrderCancelled(bytes32)", +"541ac2b3": "locked_since()", +"541aea0f": "put(uint256,uint256)", +"541afaf6": "getWarriorDistributedRandom(uint256)", +"541b2173": "IKT(uint256,string,uint8,string)", +"541bb358": "setRarityTargetValue(uint8,uint256)", +"541c15eb": "changeLock(address,uint256,uint256)", +"541d920c": "commit(bytes,string)", +"541dc9ba": "redeemPreSale(address,address)", +"541e22ea": "sendRefBonuses()", +"541e34a7": "QuantumPay()", +"541ee050": "bonusEnd10()", +"541f631a": "transferInternal(address,uint256)", +"54203101": "CTWorld()", +"54204ad4": "triple()", +"54215767": "upgradeTradeProfileImplementation(address)", +"54217c21": "Q2(address)", +"5421b037": "getDepositTransaction(address,uint256)", +"542241d0": "fifthExtendedBonusSalesEnds()", +"5422cf34": "sellPop(uint256,uint256)", +"54238645": "closeICO()", +"5423a05d": "GoToken(address,address,address,address,uint256)", +"54244518": "coinIssuedRewardPool()", +"54260cb6": "getBuyLandInfo(address,uint256)", +"5427789c": "MINT_AMOUNT()", +"54279bdd": "createAuction(uint256,uint256,address)", +"5427e4e1": "APS(string,string,uint256)", +"5427e8fa": "getTicketIsPaid(uint256)", +"54280260": "balancesLocked()", +"54290065": "getAsksCount()", +"54292c53": "rewardAvailableCurrentDistribution()", +"5429a417": "getBasicBallotsPer30Days()", +"5429d4b5": "mitfwdToken()", +"542a3368": "randomly_select_index(uint256[])", +"542a90bd": "remove_quote(bytes32,bytes32)", +"542aa99f": "stopSetup()", +"542aee37": "getTotalTonsClaimed()", +"542b5111": "MANXERC20()", +"542b9a40": "ProjectOwner_DisableProject(int256)", +"542bdb4d": "testMathOverloaded()", +"542bee82": "addGlobalBlockValueBalance(uint256)", +"542c8f37": "isOnSell(uint256)", +"542cad3d": "setCopaCoreAddress(address)", +"542cae98": "checkGameOverByUser()", +"542ccddb": "claimRoundReward(uint16,address)", +"542ceaad": "countRequest()", +"542cfdf0": "extendItem(address,uint256)", +"542d397c": "tokensBlocked()", +"542d3e34": "NewImage(uint256,uint8,uint8,uint8,uint8,string,string,string)", +"542d8dc0": "Mag50()", +"542de573": "BITHALALToken()", +"542df7c7": "getGameConstants()", +"542e8618": "dynamic_profits(address)", +"542e898e": "STC()", +"542e9b18": "logFeeWindowBurned(address,address,uint256)", +"542fce21": "KergToken(uint256,string,uint8,string)", +"542fd556": "getMakerProjects(address)", +"542fe6c2": "withdrawFromAbandoned()", +"54311422": "giveTokens(uint256)", +"54313b22": "tonextround()", +"5431dfb8": "stage3Sale()", +"5432202a": "isServiceAccount()", +"54353f2f": "example()", +"543577f3": "LandManagement(address)", +"543594b8": "verifySignature(uint8,bytes32,bytes32,address,bytes32)", +"5435a774": "Permissioned()", +"5435bac8": "itemsForSaleLimit(uint256,uint256)", +"5435dbd4": "CPF()", +"54361699": "registerContributorPool(address,uint256,int256)", +"54367179": "updateRealWorldPlayer(uint32,uint128,uint64,uint32,bool,bool)", +"5436c163": "createVillain(string,uint256,uint256,uint256)", +"5436e5a0": "getValueByHash(bytes32)", +"54370a8d": "QueryMyBonus(address)", +"5437988d": "setVerifier(address)", +"5437b39b": "hasUnprocessedDividends(address)", +"5437e401": "withdraw(address,bool)", +"5437f098": "changeStartBlock(uint256)", +"54385526": "setStatus(uint8,uint8,string)", +"5438a64e": "getContractSigners(bytes32)", +"5438c5d2": "hasListener()", +"54392a96": "simTotalObligation(bytes)", +"5439af13": "getIdeaDescription(uint256)", +"5439c6a1": "nonFungibleByIndex(uint256,uint128)", +"5439e185": "buyTreeTokens(address,uint256)", +"5439f5d2": "TimeToken(uint256,string,uint8,string)", +"543a3d62": "token_call()", +"543a86f6": "dblShaFlip(bytes)", +"543a9ce4": "setAStore(string,address)", +"543ad1df": "MIN_TIMEOUT()", +"543b4f6f": "endTimeTwo()", +"543ba50a": "FundsDeposited(address,uint256)", +"543e0a7b": "stringsEqual(string)", +"543e10b4": "contributeTo(address,uint256)", +"543e4dcd": "testFailUntrustedTransferFrom()", +"543e9954": "freeBalanceOf(address)", +"543e9c10": "containsAdmin(address)", +"543f8101": "activateOversightAddress(address)", +"54400c60": "right19(uint256)", +"544082e5": "authorShare()", +"54409599": "SHIVToken()", +"54413d29": "withdrawAllForAccount(address,address[])", +"544447bb": "unicornToken()", +"5445cbf3": "assetsCertified()", +"5445e38c": "_isCycleValid(uint256)", +"5446b604": "unlockMintDate2()", +"5446d669": "ShitToken()", +"544736e6": "isStarted()", +"544743d6": "getCharAt(uint256)", +"5447ad71": "newGame(bytes32)", +"5447b86f": "ipart(int256)", +"5447c05d": "updateTemplateReputation(address,uint8)", +"5447fab0": "serviceController()", +"5448c674": "IBCA()", +"544a026b": "protectCharacter(uint32,uint8)", +"544aa2cf": "LOG_BetLost(address,uint256,uint256)", +"544b1b24": "onlyHarvest(uint256)", +"544b9606": "ICO_BONUS2_SLGN_LESS()", +"544be427": "finalizeBurnUtility(address,uint256)", +"544c465c": "calcReward(uint256)", +"544cdbda": "send_to_owner(address,uint256,uint32)", +"544cfead": "reignBlocks()", +"544d6544": "transferPrivateSale(address,uint256)", +"544d8ca2": "registerLog(string,string,uint256)", +"544d9723": "itemAt(uint256)", +"544f113b": "startingAmount()", +"544f43e3": "getRatePlansOfVendor(uint256,uint256,uint256,bool)", +"544ffc9c": "proposalVotes(uint256)", +"5451436d": "EthLyte()", +"54517ddf": "transferFromByCrowdsale(address,address,uint256)", +"5451a1e1": "addressFounders()", +"5451cbcc": "ZEToken()", +"5451fb26": "increaseLoanOnBehalfOf(address,bytes32,uint256,uint256)", +"5452644d": "createNewDynamicPaymentAddress(uint256,address)", +"5452b7d4": "getReservedTokens(uint256)", +"545305fb": "finalizeCrowdsaleAndToken()", +"5453095b": "buyMNC(string)", +"545342a0": "ZaiZaiCoin()", +"5453f4e7": "createTokenUri(address,address,address,address,address,address,address,uint256)", +"545464ff": "ConsentFactory(string,address)", +"5454d6e0": "isMilestonesSetted()", +"5454fb7c": "ico1Sold()", +"54557250": "getAgentIdByPositionBet(uint256)", +"545599ff": "END_DATE()", +"5455e1b8": "setAddressesThatCanList(bool,address[])", +"54567923": "addServiceReward(uint256)", +"54569a86": "Needit()", +"5456d8d2": "removeSpecialBonusConditions(address)", +"54573835": "withdrawEtherInternal(address,address,uint256)", +"54573cfc": "setRule(uint256,uint256,uint256,uint256)", +"545842ff": "redeemLevAndFeeToStakers(address[])", +"545921d9": "providerRegistry()", +"545a153a": "getId(uint256)", +"545a5896": "changeSolidStampContract(address)", +"545ae0f6": "TokenFundTransfer(uint256)", +"545b2f0d": "getUpgradeAmt(uint256)", +"545c50f0": "pointRootNode(int256,address)", +"545c5a02": "setStepTwoLockEndTime(uint256)", +"545c5d54": "deliveryService(uint256,uint256,uint256)", +"545d2e29": "invalidateAdvertiserRefund(uint256)", +"545d5988": "claimCheckPriceReward()", +"545d8b55": "minCapFail()", +"545e6362": "PRE_ICO_BONUS_TIME_1()", +"545e7c61": "deploy(address,address)", +"545f6837": "returnSenderBalance()", +"54604eec": "stopAssign()", +"54605549": "setCoinBalance(address,uint256,uint8,bool)", +"5460687c": "test_chain2_3()", +"5460ef10": "sendWithExtraGas(address,uint256,uint256)", +"54610cea": "setProvider(address,uint256,uint256)", +"54612e27": "freeze(bytes32,bytes32,uint256,bytes)", +"54616911": "burnICOTokens()", +"54619b69": "eAccessTOKEN()", +"546216f1": "winningScore()", +"54622cef": "multiMintPreIco(address[],uint256[])", +"5462870d": "multisigAddress()", +"5463a2e4": "reasonableDiffInBps(address)", +"546434e3": "TwoStageSale(bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address,uint256,uint256,uint256)", +"546455b5": "assert3(uint256)", +"54653352": "beView()", +"54657f0a": "setHiddenCurves(bytes32[])", +"54659685": "getTicketsCount(address)", +"54659d99": "SPINFund()", +"546639cf": "JacksToken(uint256)", +"546668bb": "conquesting()", +"54672768": "Instrument()", +"54674ebc": "HackableToken()", +"54675320": "EventProduct(uint32,string,uint32,uint32,uint256,uint256,uint256,uint256)", +"5467e0a7": "redemption()", +"5467f508": "indPresaleDeposit()", +"5468e4e1": "setGameStateFusion(bool)", +"5469a173": "getFifthRoundReleaseTime()", +"5469aabb": "_diviSplit(uint256,address,address,uint256)", +"546b270d": "getServer(uint256)", +"546b48b1": "makeSimpleBundle(uint256,address,bytes32,bytes32)", +"546c2b93": "paid(uint256,uint256,bytes32)", +"546d08fe": "dividendAddress()", +"546dc0ac": "collectAsset(address,uint256)", +"546dc71c": "approveWithdrawAddress(address,address,bool)", +"546dd883": "privateAmount()", +"546e1959": "changeOwnerStart(address)", +"546e428c": "modifySender(address,bool)", +"546ea281": "currentAction()", +"546efd98": "indiFundAndSocialVault()", +"547069bf": "crowdsaleWeiRaised()", +"5470b13b": "getWallet(uint256)", +"5470f6db": "setMaxSet(uint256)", +"547173da": "endPresaleDate()", +"54717ea9": "getValueBonusTokens(uint256,uint256)", +"54718917": "determineWinner(string)", +"5471d5d8": "VetLite(uint256,uint256)", +"5471dd4c": "FourthAddressBalance()", +"54722412": "OfferZone()", +"54734f7d": "setBoardAdd(address)", +"54738157": "OwnerCloseContract()", +"5473b4e9": "getTransactionConfirmCount(bytes32,uint256)", +"5473c701": "test_oneInvalidFalseEqLog()", +"54741525": "getTransactionCount(bool,bool)", +"54741f8d": "getMemBestPromouter()", +"5474d4d7": "_transferBag(address,address,uint256)", +"5474fbd3": "isDayThirtyChecked()", +"547505e3": "tokenAdministrator()", +"5475c22e": "bindOrderFunds(address,bool,int256)", +"5476bd72": "addToken(address,address)", +"5476ea9e": "auctionAddress()", +"5476f49d": "m_totalAppCount()", +"5477d33f": "price_constant1()", +"5477e571": "handleMultipleItems(address,uint256,uint256,uint256,uint256,uint256)", +"54786b4e": "getDSTSymbol()", +"5478786c": "IDLE()", +"5478dbb7": "play(uint256[3])", +"5478f06f": "updateMDTRewardAmount(uint256)", +"5478f468": "getHistoryLength()", +"54790b7d": "isOvertime()", +"547916ea": "finishRound()", +"54791f36": "_transferWithReference(address,uint256,string,address)", +"5479d940": "isUpgradable()", +"547a5168": "TomocoinTokens()", +"547a5eee": "setWhitelistSetter(address)", +"547ac053": "saveInitialParametersToStorage(uint256,uint256,uint256,address)", +"547c165f": "getApprenticeChestAvailable()", +"547c1b6a": "SALE_START_DATE()", +"547c4137": "setLLV_edit_32(string)", +"547c8011": "DemocraticPalette()", +"547cae29": "uintToString(uint16)", +"547cbaa5": "addFrozen(address,uint256,uint256,bool)", +"547dd162": "_newAgon(uint64,uint64,address,uint256)", +"547dfaf5": "WthdrawAllToCreator()", +"547e3f06": "changeReceiver(address)", +"547e6a5b": "simulate(uint256,uint8,uint8,uint8,uint8,uint8,uint8[176])", +"547eeac1": "acceptTransfer()", +"547fd950": "getTotalFrozenBalance()", +"54812d17": "initialize(address,address,uint256,uint256,address,uint256)", +"54817301": "setFreezeEnd(uint256)", +"5481c1ff": "referBenefitRate()", +"5481f43e": "getProviderTitle(address)", +"54823e66": "getStateHash(uint256)", +"54828eb7": "placeBetEven(uint256)", +"54829cad": "dubi()", +"5482d73c": "getDocument(bytes16,uint256)", +"5482d88e": "telcoin()", +"54830df7": "getApprovedTokenCount()", +"54840c6e": "tradable()", +"5484b5bf": "thelocation()", +"5485868a": "roundFactory()", +"5485bb82": "w_Team()", +"5486dfb3": "distributeSupply()", +"548707cd": "_bid(uint40,uint128)", +"54876921": "withdrawMoney(uint256)", +"5487e055": "PRICE_MID()", +"5488cc80": "currentCheckpointId()", +"548942e1": "UbecoinICO()", +"548ad42e": "chfScale()", +"548b273a": "outstandingEther()", +"548b5e6b": "contractStartDate_()", +"548c0ef4": "getRank(address)", +"548c20be": "getMyName(bytes32)", +"548d4a54": "updateTransferFeeRate(uint256)", +"548d91b1": "getPage(uint256[],uint256,uint256,bool)", +"548db174": "removeFromWhitelist(address[])", +"548dd51e": "newContract(address,address,uint256)", +"548e0846": "lastCallBlock(address)", +"548f896c": "setHouseEdgeMinimumAmount(uint256)", +"548fe136": "doWorkAndPayTOT()", +"549060bb": "Competition(address,address,address,uint256,uint256,uint256,uint256,uint256)", +"54919a6c": "sendTokensSingleValue(address[],uint256)", +"549215a3": "amendEpoch(uint256)", +"54924aec": "adminsDisabledForever()", +"549262ba": "put()", +"5493a7f4": "importAmountForAddress(uint256,address,address)", +"549400bd": "valuee(uint256)", +"549503e5": "executeSell(address,uint256)", +"5495699f": "teamFund()", +"5495794b": "initialWei()", +"5495ca36": "MDC9Token(uint256,string,uint8,string)", +"5496b217": "createMintableBurnableToken(string,string,uint256,string)", +"549737e3": "setIBalance3(uint256,uint256,uint256)", +"549767c7": "balanceSpot(address)", +"5498e9e5": "AmericanAirlinesCoin()", +"5498eae4": "PAYA()", +"54990b15": "sendTranche(bytes32,address,uint256,bytes)", +"54999f6d": "initAmount()", +"5499c84e": "changeBonus(uint256,uint256,uint8)", +"5499dca5": "getMyStake()", +"549a9ffd": "changePiranhaName(uint256,string)", +"549aa194": "unreleasedAmount()", +"549bc193": "changeSwitchTime(uint256)", +"549bf4bf": "Liberty()", +"549bf9b9": "SFCapitalToken(string,string,uint8,uint256)", +"549c4627": "depositsOpen()", +"549c6bbb": "refundTokens(address,uint256)", +"549c7b58": "getAgon(uint256)", +"549caf35": "oxced()", +"549cbc7a": "startSale(uint256,uint256,uint256,address)", +"549d5e3b": "claimByAddress(address,address)", +"549d776a": "upgradeContract(uint256,address)", +"549ddcbd": "setFreezeHybridizationsCount(uint256,uint256)", +"549df19f": "resetAllWallets()", +"549eca74": "fpDiv(uint256,uint256)", +"54a019e2": "FOUNDER_FUND_2()", +"54a035aa": "_evaluateCategory(address,uint8,uint256,uint256)", +"54a04d2f": "setMigrateAgent(address)", +"54a0ebf5": "updateEntityName(uint256,bytes32)", +"54a1b431": "getVoteDetails(uint256)", +"54a1e232": "setSellOrdersContract(address)", +"54a28ded": "bhCheck()", +"54a2b2b8": "initialize(address,uint256,uint256,uint256,uint256,uint256,address,uint256,uint256,address)", +"54a325a6": "setKyberNetwork(address)", +"54a46211": "_removeInvestor(address)", +"54a598b0": "globalTokenTransferLock()", +"54a6c8c4": "toSmallrtc(uint256)", +"54a6ff68": "isVersionLogic()", +"54a874b4": "isSolved(address)", +"54a8b217": "qryModules()", +"54a8ca69": "transferAnyMEPToken(address,uint256)", +"54a8ed7b": "USD_CENT_PER_GZE()", +"54a9409e": "charge(address,uint256,uint256)", +"54a9de1c": "referrerBonus(address)", +"54aa0546": "MCNC()", +"54aa4e44": "setDisableBuyingTime(uint256)", +"54aac764": "SALE2_CAP()", +"54ab5561": "setOwnerTwo(address)", +"54ac2119": "EMJACTestToken()", +"54aca207": "iwithdrawal(uint256)", +"54acbe7b": "setSaleShare(uint256,bool,address,uint256)", +"54accc88": "OOREDOOCHAIN()", +"54ad2d22": "BitcoinCrown()", +"54ad7e1c": "setDividendDistributionPool(address)", +"54ad9718": "feePrice()", +"54adb7b1": "doNotAllocateBid(bytes32)", +"54adc686": "claimRewards(bytes32[],uint256[])", +"54ae8492": "CustodialForward()", +"54aee843": "MANHATTANPROXYMANAVE()", +"54af0d4c": "validAfter(address)", +"54af3548": "getSigner(address,uint256,address,uint256,bytes32,bytes32,uint8)", +"54afc9a9": "MyFirstToken()", +"54b025c5": "deleteRole(address)", +"54b02ba4": "cutoff()", +"54b0a26a": "getCPModel(uint256)", +"54b16510": "CreateProduct(string,string,string,string)", +"54b2a080": "valueAtIndexHasNext(uint256)", +"54b302c5": "maximumDeposit()", +"54b3fa58": "ServiceTask(string)", +"54b48428": "endTGE()", +"54b49859": "fmpContractAddress()", +"54b51fcc": "testNumberOfElements()", +"54b5aeac": "deleteDataPatternVoteRules(uint256)", +"54b61723": "round3Cap()", +"54b67057": "setTranformed(uint64,uint64)", +"54b6a520": "ICOFinished()", +"54b6ba95": "durationInDays()", +"54b6d871": "TempusToken()", +"54b6ed85": "AddNewCurrency(string,string,string,string)", +"54b7636e": "isKYCVerified(address)", +"54b84910": "needToReserve()", +"54b8c024": "fieldOrder()", +"54b8d5e3": "getName(bytes32)", +"54b8dd66": "countryItems(uint256,uint256,uint256)", +"54b8dfcb": "settleBuyer(address,uint256)", +"54b9b4fa": "UNLOCK_TEAM_1()", +"54ba34b5": "available_slots()", +"54ba7daa": "enter(bytes,bytes)", +"54bbd376": "getNextDate(uint32)", +"54bc16f2": "Exchanges()", +"54bdbd4d": "changeMinPeriod(uint32)", +"54be44f0": "updateMinimumStakingTokenPercentageEnabled()", +"54be50a5": "lastHoldingTax()", +"54beb2f4": "ProfitSharing(address)", +"54bec662": "removeValidation(address,bytes32)", +"54bef3b4": "getPlayerVaultsHelper(uint256,uint256,uint256,uint256,uint256)", +"54bf3a73": "playerToDungeonID(address)", +"54c0775f": "GetItems(address)", +"54c15020": "awardReferalBonus()", +"54c15b82": "isGeneScience()", +"54c29ce6": "assertOperationIsConsistent(bytes32)", +"54c35a3c": "setup(address,address,address,address)", +"54c3b0c4": "icoPhase3EndTime()", +"54c41fb9": "viewMerkleHash(uint16,uint8,uint8)", +"54c51813": "setFreelancer(bool,string,uint256,uint8,uint256[],uint256[],string)", +"54c552db": "setNumber(bytes32,uint256)", +"54c58dc9": "_getAllStorages()", +"54c5aee1": "collectReward()", +"54c5b696": "maxBonus()", +"54c5f850": "withdrawTokensFromAnyWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"54c72ead": "_getHardCap()", +"54c86628": "etsContract()", +"54c91295": "getEloScore(address)", +"54c916a1": "setOCPTokenContract(address)", +"54c93a4e": "lockTeamTokens()", +"54c990cf": "periodTimeFrame(uint256)", +"54c9cc44": "changePlayersName(string)", +"54ca435f": "PRESS_MARKETING()", +"54ca9095": "newEntity(bytes32,bytes32,uint256,uint256)", +"54cacaba": "QuarkChain()", +"54caf101": "bonus(uint256,uint8)", +"54cb5081": "getPromoMinPurchaseEth()", +"54cbe1e6": "gamePayoutResolver(address,uint256)", +"54cbffc4": "LimitOfMinutes()", +"54cc463b": "PreICOPrice()", +"54cc61bc": "Krown(uint256,string,uint8,string,address)", +"54ccdb0d": "seriesCSupply()", +"54cdac25": "usd2weiTopSales(uint256)", +"54ce0851": "round5TokensRemaning()", +"54ce7616": "TestTalk()", +"54cecb21": "AuthPending(address)", +"54cf2aeb": "swapFee()", +"54cf6668": "setEarlyInvestorExchangeRate(uint256)", +"54cfcd1b": "DEAWCOIN()", +"54cfe7d0": "nextForkName()", +"54d03b5c": "changeFeeMake(uint256)", +"54d05ad2": "changelp10(address)", +"54d06009": "whiteListAddress()", +"54d15005": "isDestroyed(string)", +"54d15347": "adminSuspendDeposit(bool)", +"54d18864": "totalProjectToken()", +"54d1b356": "GetBankerProfit(uint8)", +"54d1f77c": "UnpaidDivInt()", +"54d24f33": "TOKEN_PRESALE_LIMIT()", +"54d271fb": "unpause_1()", +"54d29b9a": "bidderWhitelist(uint256)", +"54d2a34a": "getHouseFee()", +"54d30c87": "release(uint256,bool)", +"54d3f3e4": "getTopInfoDetail(address)", +"54d41bbd": "unregisterAdmin(address)", +"54d4b7b2": "DateOfDeath()", +"54d4da57": "extractInvoicedLength()", +"54d50378": "winner_pool_amount()", +"54d5e127": "withdrawSettle(bytes32,bytes32)", +"54d68405": "LogFundAnswerBounty(bytes32,uint256,uint256,address)", +"54d6a2b7": "cancelSwap(uint256)", +"54d734e2": "createSubscriptionOffer(uint256,uint16,uint256,uint256,uint256,uint256,uint256,bytes)", +"54d79868": "getPositionBalance(bytes32)", +"54d7c34d": "transferAidrop()", +"54d87002": "showContributed()", +"54d89c92": "numberParticipants()", +"54d92ba9": "getCurrAuctionPriceTankID(uint256)", +"54d9d6f8": "findNextDay(uint256,bytes)", +"54da44db": "GetUserBetsInRaz(address,uint256)", +"54da5393": "Utils()", +"54da80c9": "Patney()", +"54dacb96": "numWhitelisted()", +"54daedc3": "transferCoins(address)", +"54db4547": "ethbuy(uint256)", +"54dcc49b": "_withdraw(address,uint256,bool,uint256)", +"54dcfb9b": "LinkToken(uint256,string,string,address)", +"54dd1da4": "releaseVestedTokens()", +"54ddd5d6": "retrieveRefund()", +"54dea00a": "getTokenRate(address)", +"54dfbca8": "setExtra(uint256,address)", +"54dfefb4": "DEEPPAYMENT()", +"54e030b7": "bonusDistributionAddress()", +"54e031cb": "setLockAccInfo(address,string)", +"54e08f76": "theInvestor()", +"54e0b451": "claimReward(bytes32,uint256)", +"54e0b464": "ICO_ADDR()", +"54e16753": "BLUECoin()", +"54e2cf2d": "_getPartLevel(bytes,uint256)", +"54e2dc8d": "getAdditionalTime(uint256)", +"54e30c37": "earlyBirdPrice()", +"54e33cf0": "getRewardsIndex()", +"54e35054": "getRoundResultInfoWithRoundID(uint256)", +"54e35ba2": "issueTokens(uint256,uint256)", +"54e4df26": "test_0_testGenerateTokens()", +"54e707a0": "START_WEEK_2()", +"54e76d74": "minimumPoolPurchase()", +"54e7aed8": "Frozenable(address)", +"54e7e98c": "PiexT(uint256,string,uint8,string)", +"54e8561b": "RDOCrowdsale(address,address)", +"54e8e4e4": "Test_SignedInteger_AdditionOverflow(int256)", +"54e921cb": "setFreezeMustCalculate(uint256,bool)", +"54e9244e": "orderFills()", +"54e9d5e1": "refundDonation(address)", +"54ea1538": "sellDrago(uint256)", +"54ea1af9": "flyDrop(address[],uint256[])", +"54ea4000": "identify(address[])", +"54eae3e6": "streamEnd()", +"54eb3f74": "getOptionState(address[2],uint256[7])", +"54eb9e88": "_preValidateICOPurchase(address,uint256)", +"54ec5d9b": "weiRaisedRound()", +"54ec6a43": "taxPaid()", +"54ecaba4": "COMPETITION_VERSION()", +"54ecd994": "ALLOC_BOUNTIES()", +"54ed08c8": "getPurchasedTokens(address)", +"54ed44f7": "generateCostFromAttributes(uint8[14])", +"54ed7b6e": "addHash(bytes)", +"54ee4d4b": "addCommunityGrant(address,uint256)", +"54eea796": "setEpochLength(uint256)", +"54ef356f": "isUserAdmitted(address)", +"54ef9c3c": "getEpisodeBranchData(uint256,uint256)", +"54f10ed0": "IknewToken()", +"54f11256": "retrieveCadvsLeftInRefunding()", +"54f12a2c": "isAllowed(string,string)", +"54f1469c": "shuffle(uint256[])", +"54f1bb4b": "Etheraffle(address,address,address,address)", +"54f363a3": "addition(uint256,uint256)", +"54f47346": "lastBlock_f12()", +"54f47be7": "transformSettingContract()", +"54f4824d": "myLastRef(address)", +"54f50f1b": "nicknameOf(uint256)", +"54f5164b": "isLocked(bytes32,uint256)", +"54f51d32": "SetCitySnapshot(address,uint256,bool,uint256,uint256,uint256,uint256)", +"54f5675c": "OfferedForSale(uint256)", +"54f56df1": "Shop(address)", +"54f60aea": "ONE_EMONT()", +"54f6127f": "getData(bytes32)", +"54f63105": "maxMintingPower()", +"54f63ee5": "resumePresale()", +"54f703f8": "factor()", +"54f78dad": "setBalanceSheet(address)", +"54f7b493": "getMinimumFundsInEuroCents()", +"54f7dd8c": "lotOfOwnerByIndex(address,uint256)", +"54f81786": "startTokenVotes(address[10])", +"54f83483": "needsTick()", +"54f8c2df": "getShipName(uint32)", +"54f9962a": "getAffiliateLevel()", +"54f9cbb3": "newVote(uint256,string)", +"54fa8044": "sendKrs(address,uint256)", +"54fac919": "decay()", +"54fbde65": "USDWEI()", +"54fbed37": "tokenIsBeingTransferred(address,address,uint256)", +"54fc85ac": "maxEth()", +"54fd4d50": "version()", +"54fead44": "_removeRecoverer(address)", +"54fef819": "throwsWhenRedeployingANT()", +"54ffb323": "MaxOffer()", +"54ffe626": "_getBonusTokenAmount(uint256,uint256)", +"550052b5": "iaOnInvested(address,uint256,bool)", +"5502109e": "actualCap()", +"550271c9": "Candle()", +"5502be83": "getBountiesByParticipant(address)", +"55036214": "priceRound2()", +"5503a659": "smallponzi()", +"5503d9ba": "numberOfPledgeAdmins()", +"55042668": "jobStarted(bytes16,address,address,uint256,uint256)", +"55044042": "CreateGUNS(address,uint256)", +"5504bf71": "attackerPrizeByToken(bytes32,address,address)", +"5504f45e": "getFrontEndTokenSupply(address)", +"5505075b": "validArb(address,uint256)", +"550538f6": "getOneTimeCosts()", +"550563ba": "Iscm(uint256,string,string)", +"55061ccc": "setImageBlurredAt(uint256,uint256)", +"55064d85": "exists(uint256,uint256,uint256)", +"5506aa6c": "weiMaximumGoal()", +"55072fef": "PRIVATE()", +"5507a82e": "setCalculatorAddress(address)", +"5507e9c0": "lockForAll(bool)", +"5509b160": "weightLostPartLimit()", +"5509f0f3": "minPurchasePreICO()", +"550b1f48": "eighthTime()", +"550b47b8": "setCoinPrice(uint256)", +"550bcd8d": "testThrowUpdateLatestRevisionEnforceRevisions()", +"550c99c6": "_createCutie(uint40,uint40,uint16,uint16,uint256,address,uint40)", +"550d8dca": "secondPeriodSupply()", +"550dd006": "calcCostsBuying(uint256,uint8,uint8,uint256)", +"550e4f2b": "withdrawRemainingIPCToken()", +"550ed1f0": "getMaxBetAmount()", +"550ed61b": "jpyc()", +"55107916": "distributeMarketingShares()", +"5510f804": "acceptToken()", +"5510f8d7": "forkApprove(address,address,address,uint256)", +"55119b1a": "addBeneficiary(address,uint256,uint256,uint256,uint256)", +"55121498": "getLenderBalance(uint256)", +"55126d30": "LogEvent(address,uint256,uint256,string)", +"5512a353": "BONUSROLL()", +"5512a8d8": "myohoTest()", +"551336c5": "prophecise(bytes32,bytes32)", +"55138534": "Transaction()", +"55138d97": "addCar(address[4],uint256,uint256)", +"55139163": "refereesRateBonus()", +"5513a2ac": "claimByProof(address,bytes32[],bytes32[],uint256)", +"5513a34e": "getProductHistoryPrice(bytes32)", +"5514738f": "_packWarriorPvpData(uint256,uint256,uint256,uint256,uint256)", +"55152b9d": "DxChainToken()", +"55161913": "charge()", +"5516b6c5": "SECCoinSold()", +"55171365": "bitshmToken()", +"55173bb1": "ColaTokenToken()", +"55176f51": "FOUNDATION_POOL_TOKENS_VESTED()", +"55177ef1": "addressCoreSupply()", +"55181fba": "TEXBToken()", +"55186c99": "auditorCanWithdrawStake(uint256,address)", +"55189100": "payRewards(address,uint256)", +"551a450a": "tokenIdToListing(bytes5)", +"551a5376": "haltTokenTransferFromAddress(address)", +"551cacfd": "extractEther(address)", +"551dc401": "StateChanged(uint8)", +"551e2e39": "changeDefaults(uint256,uint256,uint256,uint256,bool)", +"551e44ca": "withdrawTokenForUser(uint256)", +"551e4c27": "setPeggleBot(string)", +"551e6ba6": "BoardRoom(address)", +"551ef860": "newRole(bytes32,address[])", +"551f3108": "versionSelectors(bytes32,bytes32,address)", +"551f8e2a": "add(address,address,uint256)", +"5520002a": "viewSharesSold()", +"552033c4": "RAY()", +"552079dc": "fallback()", +"55207a07": "changeMood(string)", +"55212c89": "seeleToken()", +"55219d5a": "tokenAllowed(address)", +"5521d17b": "betOnColor(bool)", +"552200f5": "check_part_location(uint256)", +"55234ec0": "remaining()", +"5523ec91": "fghcoin()", +"552405b0": "createCommunity(string,string,string,string,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)", +"55241077": "setValue(uint256)", +"55247a52": "wantToBeWhale()", +"5524defd": "onPayoutFailure(address,uint256)", +"5524e97a": "placeBet(uint256,uint256,uint256,bytes32,bytes32)", +"552548b5": "setMaxDiscountPermille(uint256)", +"55258a11": "updateAllScores()", +"5525d87f": "setOracleQueryType(string)", +"55265669": "showSupply()", +"55274378": "updateInterCrypto()", +"55291dbd": "claimEther()", +"552984b3": "stabilize()", +"552a41a3": "getRemainingBountyTokens()", +"552a6915": "getGood(uint256)", +"552ac31e": "prod(address,bytes32,uint128)", +"552b71aa": "executeDistributeCapital(uint256)", +"552c190e": "_DoubleDown()", +"552d2d5c": "getPerson(address)", +"552e387d": "XBVHandler(address,uint256)", +"552eb9e2": "ETStarPresale(address,uint256,uint256)", +"552f1270": "startWeek(address,uint8)", +"552f27f5": "setupEventsAdmin(address)", +"552f8224": "fechAllForCandidate()", +"552fee9d": "airdropTokens(address,uint256,uint256)", +"55302ebd": "hasUnionId(bytes32)", +"5530c519": "validate_pko(address,bytes32,bytes)", +"5531680c": "transferableBlock()", +"55325d87": "prizeWinners(uint256)", +"55326893": "setPOOL_edit_24(string)", +"5532edf2": "autorizadoraNuncaAutorizouCandidata(address,address)", +"5533639e": "toB32(bytes,uint256,bytes32,bytes)", +"5533ffad": "setUserNotifications(bool[],bool,uint8[],uint8)", +"5534236e": "AirDropPromo(string,string)", +"55347cce": "Setuppackagesale(uint256,uint256)", +"55348d9b": "addBeneficiaryVestor(address,uint256,uint256,uint256,uint256)", +"55352638": "updatePresaleMaxWei(uint256)", +"553543c5": "tokenSoldPreSale()", +"553594e4": "getActionHistorySize()", +"5535cd2f": "setPOOL_edit_1(string)", +"5535e7a8": "GameCreated(address,address,uint256,uint256,bytes32)", +"55367ba9": "pauseSale()", +"55368442": "removeMetadataObject(string)", +"5536deb6": "finalizePhase()", +"5536e2d6": "OCTACrypto()", +"5537f0ef": "betFinalize(uint256,uint8)", +"55380ed8": "GOOGToken()", +"5538210e": "tokenSweep(address,address)", +"5538689c": "changePartner3(address)", +"5538c964": "getPartnerInfo(uint256)", +"55390b0d": "PrestoToken()", +"5539a9c2": "refreshPublicFundingPersonalEthLimit(uint256)", +"5539d400": "authorizedAddress()", +"553a48fd": "isFunctionRemoveAuthorizedAddress(bytes)", +"553a5c85": "mintedTotally()", +"553a90b8": "updateStopGameOnNextRound(bool)", +"553aaafe": "MSPPlaceHolder(address,address,address,address)", +"553b196f": "setPurchasingPaused(bool)", +"553b6975": "setAmbassador(address)", +"553b6f83": "lastOracleFee()", +"553b74aa": "getNumberWallets()", +"553bf56d": "accept(uint256,string,uint256)", +"553c02ec": "getCountryBet(uint256)", +"553c6de9": "getPreIcoInvestor(uint256)", +"553cc48d": "Player(string)", +"553cd9c6": "MLC()", +"553d0d12": "transferTokensThroughProxy(address,address,uint256)", +"553df021": "deal()", +"553eb4db": "registerRewards(address[],uint256[],uint256)", +"553ec6be": "batchCancelSale(uint256[])", +"553f4fb3": "requestRand()", +"553f9157": "completeSale(uint256,uint256)", +"553fd043": "setMoneyRange(uint256)", +"553fd8ee": "ALLOC_FOUNDATION()", +"5540e6c1": "iMMCoinsellPrice()", +"55416e06": "voteA()", +"5541b817": "_leftChild(uint8)", +"554249b3": "delegateIncreaseApproval(address,uint256,address)", +"55426bad": "processPresaleOrEarlyContributors(address[],uint256[])", +"55427b42": "getBalanceofModifiedWeth()", +"5542f680": "retrieveToken(uint256)", +"55434bc9": "ToggleFreezeSelling()", +"55456f58": "maxcap()", +"554571db": "updateNarco(uint256,string,string)", +"5545f12b": "OnChainOrderBookV013bFactory()", +"5545f584": "soldForForth()", +"554600fa": "setOraclizeTimeTolerance(uint256)", +"554644d5": "_removeHolding(bytes12)", +"554652ce": "airdropToken(address[],uint256[])", +"554680f2": "updateActivation()", +"5546a12c": "setInformation(string,string)", +"5546e1ab": "getMyRefund()", +"5547d2d9": "setHtlcSettlePeriod(uint256)", +"554803c7": "RTCCOINTOKEN(uint256,string,string)", +"55485779": "minGas4Accts()", +"5548c837": "Deposit(address,address,uint256)", +"554917f5": "processMyRefund()", +"55491da8": "distributeJST(address[],uint256,uint256)", +"55494d1e": "fillBuyOrder(address,address,uint256,uint256,uint256)", +"5549563c": "claimManyTokenFor(address[])", +"5549ce5e": "WarriorSanctuary(address,uint32[])", +"5549ce6d": "ticketTransfersPerAmount(uint256)", +"5549f46c": "CustomerInsert(string,address,string,int256)", +"554a854e": "TransferCryptibles(address,uint256)", +"554ad7ff": "queryNTVUs(uint256,uint256)", +"554bab3c": "updatePauser(address)", +"554d0429": "getArrBoolField2()", +"554d184b": "getPrices(address,address[],address[])", +"554d27ca": "createOffer(address,uint256,uint256,bool,uint256)", +"554d578d": "getCap()", +"554d758e": "houseStatsOf(address)", +"554dbfc2": "EMISSION_FOR_SALESTAGE6()", +"554e00b4": "miniGameStart()", +"554e6c61": "getTargetBNumber()", +"554ed8b6": "escrowTransferList(uint256)", +"5550e4f3": "blackBoxAddress()", +"5551b6b6": "isDelegateEnable()", +"5551d1b7": "isAllowToIssue()", +"5552a483": "newOffer(address,uint256,string,uint256,uint256)", +"5552d1cb": "prizeIncr()", +"55532953": "LOCKED_ADDRESS()", +"5553dc1e": "THToken()", +"55540004": "createCampaign(address,uint256,string)", +"5555d6d6": "exist(uint256,address)", +"55560fd5": "mLoadAndReturn(address)", +"55566036": "getGamePool(uint256)", +"5556db65": "totalMined()", +"5556f3f6": "RareCards()", +"55575ddb": "setRevokeAddress(address)", +"55589cdd": "addressOf(address,string)", +"5558e1c3": "setMinToken(uint256)", +"555984fd": "cancelMintRequest(uint256,string)", +"5559d8d9": "getClamTax()", +"555aaff6": "calculate_range_attempt(uint256,uint256)", +"555ab116": "AhooleeTokenSale(uint256,uint256,uint256,address,address,uint256,uint256,uint256)", +"555ae2c6": "STQPreICOBase(address)", +"555af8f4": "addressFundHolder()", +"555b6162": "allBalances()", +"555be5bd": "assignNewPlanet(address,uint256,uint256,uint256,string,string,string)", +"555befa8": "set1RoundTime(uint256)", +"555c4758": "distributeTimelockedTokens(address[],uint256[],uint256[],uint256[])", +"555d8e3c": "_printACourse(uint256)", +"555db767": "test_2_accessRestriction_newProposal_shouldThrow()", +"555e6582": "executeMintProposal(uint256)", +"555ea48c": "becomeHost(bytes32,uint8,bytes32,bytes32,string,string,string)", +"555f323a": "totalBurnedTokens()", +"555f498a": "getInvestorsTokens(address,uint256)", +"555fe48a": "batchTransferFrom(address,address,uint32[])", +"55605eee": "claimTokenReserveEcon()", +"5560ada8": "rateAddress(address,uint256)", +"5560d365": "horseShoeForSale(uint256,uint256)", +"5560ede2": "LYToken(uint256,string,uint8,string)", +"55616107": "setCOOAddress(address,address)", +"55619911": "emergencyTransfer(uint256,address)", +"5561c0e2": "registerChain(bytes8,uint256)", +"5563d919": "cancelCraftingAuction(uint256)", +"55642be7": "getRoundBets(uint16)", +"55642cf9": "CappedBonusSale(uint256)", +"55642e53": "blacklist(bytes32)", +"5564a08e": "setGame()", +"5565ca9d": "buyShip(uint16,uint16,uint8,bytes32)", +"5565ee7a": "exchangePointToCoin(address,uint256,string)", +"556665db": "expireTimeLimit()", +"55674064": "totalSupplyWithoutDecimals()", +"55674efe": "BondkickToken(string,string,uint8,uint256,int256)", +"55684aa6": "originBurn(uint256)", +"55688000": "burnIndexedFromByAddress(address,address,uint256)", +"5568fd5d": "icoPhase2End()", +"5569e58c": "EthereumPocket()", +"5569f5d0": "preSaleFinished()", +"5569fc0b": "CreateSale(uint256,uint256,uint256,uint64,address)", +"556a3689": "mint_Crowdsale(address)", +"556ae598": "depositBomb(uint256)", +"556b22c1": "get_record_count()", +"556b6384": "removeBlacklistDestroyer(address)", +"556bcece": "reinvest_color(address,uint256,uint256,uint256)", +"556cbc03": "setDefaultWhitelistVestingParameters(uint256,uint256,uint256,uint256,uint256)", +"556d5139": "getAverageTokenPrice(address)", +"556db16a": "validatePurchase(address,uint256)", +"556e2eb9": "TBL4TokenSale()", +"556e56d1": "BurnupGameFinance(address)", +"556e6edc": "indice()", +"556ed30e": "deactivated()", +"556f0dc7": "granularity()", +"556fe562": "notEqual(bytes32,bytes32,string)", +"55710346": "createTokensFromOther(address,uint256,address)", +"557119db": "withdrawForCharity(address)", +"5571954d": "_distributeRegistrationBonus(address)", +"55728d04": "setIssuer(address,uint256)", +"5572f9c6": "exchangeEther(uint256)", +"55737391": "LBRSMultitransfer(address,address)", +"5573a34c": "FP_SCALE()", +"5573c582": "walletTransfer(address,address,uint256)", +"5574cff5": "LOVEYOUFOREVER()", +"55764c81": "updatedTokensPerEth(uint256)", +"55765e9a": "createMeme(string,uint256)", +"5576af7d": "TransactionConfirmedAfterDispute(uint256,uint256)", +"5576b791": "transferWithVesting(address,uint256)", +"5577e89f": "testEqualityUint()", +"5578b51e": "CorelliCoin(uint256,string,string)", +"5578d24e": "addOldPresidents(uint256[],address[])", +"5579996d": "CHW()", +"5579ac74": "dna3(uint256)", +"5579ff8e": "walletBlogs()", +"557b0dc9": "addCar(string,string,string,uint16,string)", +"557bed40": "SocialMediaPayToken()", +"557d0195": "SuomenMarkka()", +"557d0479": "aidrop(address[],uint256)", +"557d0999": "userreinverst()", +"557dc796": "endRoundSeed()", +"557ed1ba": "getTime()", +"557f4bc9": "changeContractOwnership(address)", +"557f9ea6": "aDeposit(uint256,uint256)", +"557feee1": "setRegionCurrentImageId(uint256,uint256)", +"5581004d": "createThrone(bytes,uint256,uint256,uint256,uint256)", +"55810d11": "appFund()", +"5581800c": "isCappedInEther()", +"5581be8d": "privatePresaleSupply()", +"558225fc": "setAtomSons(uint256,uint32)", +"558234f0": "USD_PURCHASE_AMOUNT_REQUIRING_ID()", +"55827137": "refreshVault(address,uint256)", +"5582c08d": "startMonarchyGameReward()", +"5582df33": "performInitialAllocations()", +"558305f9": "isFreezeEnabled()", +"55832ffc": "purchaseStartTime()", +"5583318a": "TOL()", +"55838881": "STAGE_ONE_BET_LIMIT()", +"5584002b": "_isSimulation()", +"55843fda": "getAdOwner(uint256)", +"5584c4f9": "getActiveProposals()", +"558599ea": "SQR_TOKEN_DECIMALS()", +"55866c8d": "isRefunded(uint256)", +"55869af1": "fromVersion()", +"558790d8": "testInitialTokenBalanceShouldBeZero()", +"5588227e": "restCrowdSaleAddress(address)", +"55889d01": "setMaxLockPeriod(uint256)", +"5588b929": "streamerContract()", +"558a7297": "setOperator(address,bool)", +"558a8f47": "sendFutureSupplyToken(address,uint256)", +"558b5aab": "setSellingToken(address,uint256,uint256)", +"558da2e3": "preSaleprice()", +"558e223f": "_buyPutToOpen(uint256,uint256,uint256,uint256,address)", +"558e44d3": "MAX_FEE_PERCENTAGE()", +"558f285f": "unsetMyIdentity(uint256)", +"558f46c8": "getZTKChecks()", +"55909da3": "spreadTokens()", +"5590e4d2": "toBytes32(bool)", +"55915b97": "initialSuppy()", +"55923471": "fiveHourCap()", +"55923cc5": "ElementToken(string,string,uint256,uint8)", +"5592d687": "settleBounty(uint128)", +"5592fc71": "getLotteryWinners()", +"55947d16": "XJJ()", +"5594e88c": "delegateToken(address,address)", +"559510d8": "left53(uint256)", +"55951e15": "dollarToLoveyRate()", +"55954b49": "initVesting(address,uint256)", +"559659fa": "getTotalRefund()", +"55976b05": "depositNotification(uint256)", +"5597801a": "addwhitelistedBatch(address[],address)", +"5597e9dd": "setCompte_36(string)", +"5597f3a5": "createRecord(string,uint256,address,string,string,string)", +"5598c576": "reveal_move(bytes32,uint8,bytes32,bytes32)", +"5598f8cc": "getCampaign(uint256)", +"559ac092": "getAirdropIdsByContractAddress(address)", +"559b0432": "yearCap()", +"559b0ed5": "giveBackOwnership(address)", +"559b1df4": "TokenStoreUpdated(address,address)", +"559b678c": "IsLimitPart(uint8,uint256)", +"559e5e06": "updateTokenAge()", +"559ec80d": "settleDeposit()", +"559ed339": "setTokens()", +"559f05dc": "canTrade(address)", +"559fb6f5": "assertAvailable(uint256)", +"559fd7ee": "setYearOneMultiplier(uint256)", +"55a01845": "forceFinished()", +"55a05335": "totalDragonLotteryNumber()", +"55a0b387": "getFreeToken(bytes32,bytes32,uint8)", +"55a129bd": "Tier(uint256,uint256,uint256,uint256,uint256,uint256)", +"55a36746": "newDigitalContract(string,address[])", +"55a373d6": "tokenContract()", +"55a392ac": "ExerciseEndTime()", +"55a3f425": "getBalanaceOf(address)", +"55a53ed0": "EtherSteem()", +"55a5a8d4": "DHUBTest02()", +"55a5dc3c": "SpegniCassaAutomatica()", +"55a5f702": "right45(uint256)", +"55a6b827": "setPrices(uint32,uint32)", +"55a85240": "random(bytes32,uint32,uint256)", +"55a964a7": "distributeALLY(address[],uint256,uint256)", +"55a9794a": "extract(uint256,uint256[])", +"55a9a87c": "fightMonster(uint16,uint8,uint8)", +"55aa8ad4": "Filesystem()", +"55ab314e": "setOrders(uint224,uint32,uint8,uint8,uint64,uint64,uint64)", +"55ad798f": "removeRobot(address)", +"55ae603e": "sell(uint16,uint16,uint8,address,uint256)", +"55aea767": "batchClaim(uint256)", +"55aed629": "SpinnersByAddress(address,uint256)", +"55af5c59": "editBalanceOf(address,uint256)", +"55afb12d": "isStbMintedForStaEx()", +"55afee43": "validateKYC(address,bool)", +"55aff5ba": "minTokParticipate()", +"55aff703": "updatedBet(uint256)", +"55b09c58": "myuseOf(address)", +"55b1182c": "stakeholdersPoolAddress()", +"55b12570": "TransferError(address,uint256)", +"55b1aa23": "DEEPPASA()", +"55b23f4c": "econVestingStages()", +"55b2bb0f": "MIN_FUND()", +"55b32c83": "sendFoundation()", +"55b37685": "balancePreSale3()", +"55b4bb4b": "HeavyLitecoin()", +"55b4f231": "vestTokensDetail(address,uint256,uint256,uint256,bool,uint256)", +"55b5ec64": "proceeds()", +"55b62dcf": "getThresold(uint256)", +"55b6ec79": "endCall(bytes32,uint256,uint8,bytes32,bytes32)", +"55b6ed5c": "allowances(address,address)", +"55b700af": "PRESALERATE()", +"55b71344": "FlexibleToken(string,string,uint8,uint256)", +"55b726bc": "adjustRate(uint256)", +"55b72f38": "getLongitude()", +"55b775ea": "setFeed(address)", +"55b8415e": "processReward()", +"55b860e1": "_updateDiscount(uint256,uint256)", +"55b8ef5e": "UserInfo()", +"55b93031": "minNumber()", +"55b954ad": "getRestTokenBalance()", +"55b9b9cf": "PXLToken(uint256,uint256,uint256,address,address)", +"55b9ca40": "withdrawCell(uint256)", +"55ba13da": "VaN(address)", +"55ba343f": "getMarket(bytes)", +"55bb34e5": "enableEmission(bool)", +"55bc0f07": "returnLongTokenAmount(address[3],bytes32)", +"55bc8725": "bannedAddresses(address)", +"55bcaf06": "halfMultiplier()", +"55bdd4ac": "offerCatForSaleToAddress(uint256,uint256,address)", +"55be1168": "view42()", +"55bf3dbb": "OrangeToken()", +"55bf5656": "crowdfundStartDate()", +"55bfe5b1": "chfRate()", +"55c01345": "coupon()", +"55c081d4": "setTier(address)", +"55c08200": "setSpecialPeacefulSkill(uint256,uint8)", +"55c0a5f4": "appendSource(address[],uint256[])", +"55c1743d": "SEOS(uint256)", +"55c1e611": "cancelBets()", +"55c208ad": "TimeDecayingTokenBoundaryRange(uint256,uint256,uint256,uint256,address)", +"55c28ed0": "zeuscoin()", +"55c2a0ac": "addQuantity(address,address,uint256,uint256)", +"55c33624": "mock_set(address,address,uint256,uint256)", +"55c39193": "removeBoardOnUser(address,address)", +"55c47867": "withdrawTokensForCloudexchangeTeam(uint256,address[])", +"55c4a8bf": "vig()", +"55c4b226": "pushUpdate()", +"55c4c5b3": "Cartycoin(uint256,string,string)", +"55c4e704": "enableAgency(address)", +"55c60500": "setRemainAirdrop(uint256)", +"55c623c6": "bidEth(uint256)", +"55c64ce1": "resetReward()", +"55c797ce": "setBonusWallet(address)", +"55c79f49": "payToEvaluator(uint256,uint256)", +"55c81595": "raffleState()", +"55c81ae9": "recipientContainer()", +"55c8c6fd": "tokensSupplied()", +"55c94f04": "closePosition(bytes32,uint256,address,address,bytes)", +"55c9e290": "DOI()", +"55c9e926": "getNumPlayers()", +"55ca92f8": "createBallot(uint256,uint256,address,string)", +"55cacda5": "minimumEpochInterval()", +"55cb155a": "WebcoinToken(uint256,address[])", +"55cb61ca": "EthTransferContract(address)", +"55cc4e57": "setIssuer(address)", +"55cd1915": "GA_chain()", +"55ce15f4": "transferAmount(address,uint256,uint256)", +"55ce3b9a": "setFundWallet(address)", +"55ce596b": "flowingHairAddress()", +"55ce76e6": "feeAmountThreshold()", +"55cf1008": "numberOfValidPartners(uint256,uint256)", +"55cf4e30": "setAccesser(address)", +"55cf969d": "transferReverseProxy(address,address,uint256,uint256,uint8,bytes32,bytes32)", +"55cfa833": "clientmanager()", +"55d0012d": "signupUserWhitelist(address[],uint256[])", +"55d04877": "_payRefund(bytes32)", +"55d13efe": "sha_data_group(int256[],int256)", +"55d17201": "OHC_Crowdsale(uint256,uint256,uint256,address)", +"55d17251": "CROWDSALE_CAP()", +"55d1b4d3": "softCapPrice()", +"55d1c5c7": "getEuroCollected()", +"55d1f799": "triggerSkill(uint32[11][32],uint8[32],uint8[4][31],uint8[3][3][31],uint8[5][11][32],uint16[11][32],uint32[3][11][32])", +"55d28f20": "configure(address,address,address)", +"55d374e9": "setPrices(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"55d39bc0": "setETHPriceUpperBound(uint256)", +"55d4956f": "setEndSaleDate(uint256)", +"55d55a76": "isActionAccount(address)", +"55d56ddd": "_adoptAxies(address,uint8,uint256,address)", +"55d595d1": "rollbackContract(uint256,address)", +"55d66c3e": "getMarketOrderWorkerpoolOwner(uint256)", +"55d67ba0": "Begin(string)", +"55d6d06e": "XIDToken()", +"55d6f3c0": "Telephone()", +"55d72a7d": "ActionStarUp(address)", +"55d7592d": "emergencyETHDrain()", +"55d79248": "miningTenPlat()", +"55d7fe2b": "RATE_SALESTAGE5()", +"55d8bbd5": "beginSell()", +"55d9275e": "payMoneytoAuthor(address)", +"55dac078": "SecuredNotes()", +"55daf6e6": "setInitialOwners(address[],uint256[],uint256[])", +"55db4092": "setTOS(address,bool)", +"55dc3b65": "DAVCoin()", +"55dd16cd": "CrowdsalePhase1(uint256)", +"55dd574c": "startPreSale()", +"55dd8171": "bbFounderCoreStaffWallet()", +"55ddc9f0": "mainSaleFirstStartDate()", +"55de28ae": "burnBadge(uint256)", +"55de5a93": "getCurrentEdition()", +"55de97ac": "OBR_Duration()", +"55deb8fc": "tell(uint256)", +"55df34f2": "leftOverTokens()", +"55dfb430": "Test1(int256)", +"55dfc97c": "limitSupplyPerYear()", +"55e0aece": "getListingService(uint8)", +"55e1726c": "LogSetStageStartTime(bytes32,uint256)", +"55e17544": "Tardis()", +"55e21474": "firstRoundCosmosTokensLimit()", +"55e2305e": "preauthorize(address)", +"55e37cec": "discountRatePreIco()", +"55e38f9b": "canAddNewClient(address)", +"55e3f086": "startRound()", +"55e40d98": "updateItem(uint256,string,uint256[6])", +"55e447aa": "queryBalanceOf(address)", +"55e46476": "createA()", +"55e61dcd": "operationsInQueue(uint256)", +"55e6b18e": "victorieumStaticToken()", +"55e6fc50": "deposit_fee()", +"55e79d29": "regex()", +"55e7a663": "setLowerPricePercentage(uint256)", +"55e7db94": "GBCToken()", +"55e97e93": "closeGenesis()", +"55e9c358": "weekLength()", +"55e9caa1": "log_move_fees(address,address,uint256)", +"55ea14f2": "atomicxSupply()", +"55ea2cf3": "GameBit()", +"55eb27c8": "getActualUserTokenBalance(address)", +"55ebcc83": "Market(bytes,uint256)", +"55ec4da9": "VaultMint(address)", +"55ec671a": "canBet()", +"55ee684d": "initLogo()", +"55ee6afb": "Wallet(address,address)", +"55eed9de": "developerFunds()", +"55ef2913": "isOperatorAuthorizedFor(address,address)", +"55efe565": "Caligula()", +"55f03816": "orderOnSaleAuction(uint256,uint256)", +"55f0690d": "transferAndLockMulti(address[],uint256[],uint256[])", +"55f0d02c": "ResidualValue(uint256,string,string)", +"55f13278": "presaleTokenCreationCap()", +"55f14c30": "minter2()", +"55f150f1": "desc()", +"55f1a3c8": "disableTokenSale()", +"55f21eb7": "getProvider(address)", +"55f25e3f": "getLavaTypedDataHash(bytes,address,address,address,uint256,uint256,uint256,uint256)", +"55f28260": "getOwnerAt(uint256)", +"55f29166": "cancelUpgrade()", +"55f2dcb2": "GouBi()", +"55f2de40": "abioSold()", +"55f39677": "phase2WeiRaised()", +"55f3c49c": "bookrequest(uint256)", +"55f413c9": "presale3_startdate()", +"55f48a46": "CUSTOM_ERC20_BURN_SERVICE_NAME()", +"55f54552": "setPaySize(uint256)", +"55f57510": "positions(address)", +"55f5856f": "transferToLimited(address,address,uint256,uint8)", +"55f6a412": "modify_NovumAddress(address)", +"55f78af8": "getLockBalance(address)", +"55f804b3": "setBaseURI(string)", +"55f82589": "tryExec(address,uint256)", +"55f86501": "exec(bytes)", +"55f92d23": "privateSaleContribution(address,uint256)", +"55f953e6": "getTokensCountOfUser(address)", +"55fa1348": "minimum_donation()", +"55fb8cee": "userCountsInAccount(uint256)", +"55fb9765": "UniversalGamingCoin()", +"55fbc8c2": "UpdateEthBalance(uint256,uint256)", +"55fbf10e": "PanterX(uint256,string,uint8,string)", +"55fe13ea": "setBuyingEscrowAddress(address)", +"55fecb0b": "payTheWinner()", +"55ff440a": "castStringToUInt(string)", +"55ff85c3": "returnBet(uint32)", +"56000acf": "processPayment(address,uint256,bool)", +"56003f0f": "createTemporary(bytes32)", +"5600e827": "elapsedMonthsFromICOStart()", +"5600f04f": "url()", +"5601477b": "addMilestone(uint256,uint256)", +"5601da3d": "innerTransfer(address,address,uint256,uint256)", +"5601eaea": "execute(uint256,uint256)", +"56025c9e": "DatareumCrowdsale(address)", +"5602a812": "sumICOStage5USD()", +"5602c05f": "AREF()", +"560334c6": "angelPool()", +"5603a50d": "checkVesting(uint256,uint256)", +"5603ac35": "NewBudget(address,uint256)", +"5603b9f9": "registerReferral(address,address)", +"56048edc": "getThresold()", +"56049a86": "riddle()", +"5604af49": "battleProvider()", +"560667f1": "setDocToAddress(address,bytes)", +"56075a98": "becomePlayer()", +"56078480": "GoneTrippinToken()", +"560791a9": "returnHolder(uint256)", +"5607a548": "m_ownerIndex()", +"5607f324": "checkLicense(address,address)", +"5607f408": "freezeTokens(address)", +"56084329": "SAATCoin()", +"5608b6d9": "changeprivatebonus(uint256)", +"5609825e": "partyOwnsAsset(address,address,string)", +"56098295": "getCandidateVotesByIndex(uint256)", +"560a665a": "buyTokensByReferrer(address,address)", +"560bb612": "SignatureValidator(address)", +"560bd3ec": "addCollaborate(uint256,address,bytes32,uint256)", +"560cb0a5": "SikobaContinuousSale(uint256)", +"560d3ca5": "toEXTwei(uint256)", +"560ecab5": "setSellCeiling(uint256)", +"560ed6a1": "refundEther()", +"560ef1bf": "getLockedToken(address)", +"560f5d4b": "currentStateSales()", +"561015e2": "notEqual(uint256,uint256,string)", +"56104861": "addEjariRule(string,string,uint256,uint256)", +"56105a08": "DgxSwap()", +"56111751": "respond(uint256,uint256,bytes32)", +"561187ae": "russianBounty()", +"5611bf3e": "AlerterAdded(address,bool)", +"56129134": "createPromoKitty(uint256,address)", +"561296e4": "GetReferralDataOfAddress(address)", +"5612acd3": "getScenariosInfo(bytes32)", +"5612e139": "getWebsite(address,uint256)", +"56131736": "wcf(address,uint256)", +"561337eb": "contractMessage()", +"5613680a": "whitelistInvestors(address[])", +"561387b1": "setPrice(string,string,string,uint256)", +"5614678c": "calculateDayOwnerCut_(uint256)", +"5615f415": "q2()", +"56161605": "TestGOATToken()", +"5616cafd": "setGasForCLI(uint256)", +"5616f7df": "getHatchCooldown(uint256)", +"5617fb0d": "TKDToken()", +"56189cb4": "approveInternal(address,address,uint256)", +"561960b5": "activateStartBlockOf(address)", +"56196d87": "pickReward(uint256)", +"56196dc9": "getTagByModuleType(uint8)", +"561a0d65": "serviceClaimOwnership()", +"561a28df": "market2018TokenCreated()", +"561a4873": "buyAd(string,string,string,uint256,uint8,address)", +"561b1d72": "iDeal()", +"561bbe1e": "getluckyprize()", +"561cce0a": "LONG()", +"561cd462": "balanceOfETH(address)", +"561e91a1": "makeBet()", +"561ef5b6": "for_sale()", +"561f1ba1": "sendToken(address,address,uint256,uint256)", +"561f39c0": "getGameMaker()", +"561fe29c": "createDeposit(address)", +"56200819": "updatePayoutAddress(address)", +"56206581": "MyInvestments()", +"5620d1d7": "lastCompleteEpoch()", +"56216916": "changeFinishSale(uint256)", +"5621df99": "ESMBCoin()", +"5622d195": "SvEnsRegistry()", +"562328ec": "LogBidConfirmed(bytes32,address,bytes32)", +"5623715b": "updateUpgradePoll(address)", +"56238b02": "setTokensPerEth(uint256)", +"56240b38": "PalestinePound()", +"56242e07": "customerDeposit()", +"56247e6d": "createKingdom(address,string,string,uint256,bool)", +"5624e064": "makePurchase(address,uint32)", +"562557f7": "accountsUsed(uint256,uint256)", +"56257ae1": "getFUTTotalSupply()", +"562605f1": "refundOn()", +"56264d6c": "setMaxTickets(uint256)", +"5626e246": "Stage2Allocation()", +"56277619": "setFiatRaisedConvertedToWei(uint256)", +"5628d443": "BTYCT(uint256,string,string)", +"5628fc09": "initialize(address,address,uint256,uint256,uint256,uint256,uint256,address,address,address,address,address)", +"5629365b": "playerWithdraw(uint256)", +"5629c69e": "ArtBC(uint256,string,uint8,string)", +"5629c6d9": "doExecution(address)", +"5629e70b": "NobarToken(uint256,string,string)", +"562b2ebc": "orderCalldataCanMatch(bytes,bytes,bytes,bytes)", +"562bde28": "transferMyName(address)", +"562bfb9f": "getAllCardsModifier()", +"562c45da": "withdrawDragonsPrime()", +"562c4784": "targets(address)", +"562c82ec": "aboveSevenBets()", +"562c9dfa": "test2_verlappingIntervalNewNode()", +"562cad23": "startCycle()", +"562cb622": "setAffiliateLevel(uint256)", +"562cc70c": "minWeiWhitelistInvestment()", +"562d4570": "refundStart(address,uint256,address)", +"562df3d5": "COMMISSION()", +"562e9df9": "addressTeam()", +"562ea884": "Explain()", +"562fa0df": "deposit(address,address[],uint256[])", +"56304e33": "addBalanceBlocks(address)", +"563183fc": "maskerOf(address)", +"56318820": "setTokenSwarmHash(address,bytes)", +"56323b5d": "BenderCoin()", +"5632b1fa": "payrolls(uint256)", +"56330403": "getDocsCount(string)", +"5633af60": "HeliumNetworkAddress()", +"5633c442": "lockedUpCount(address)", +"563433d7": "setStock(address)", +"5634653d": "verificationCountInt()", +"5634c88c": "sumOfNGeom(uint256,uint256,uint256)", +"563540a2": "startQueueing()", +"5636548f": "enableWithdrawal(bool)", +"56378983": "validTokenAmount(uint256)", +"56387fa3": "toogleMinting()", +"56394455": "getStageStartDate()", +"56397c35": "ledger()", +"5639bb3c": "buyPriceEth()", +"5639d152": "NewRC(address)", +"5639eb64": "IngridIsAHorribleHumanCoin(uint256,string,uint8,string)", +"563ad62b": "ConfToken()", +"563b1358": "approvePack(address)", +"563b54b9": "getQueuesLength()", +"563baca1": "fundForBounty()", +"563bd001": "tokenPriceForPreICO()", +"563bef94": "ShipSellMaster()", +"563bf264": "slash(address,address,address)", +"563c23a0": "timePaused()", +"563c78b0": "SendPreReserved4()", +"563e8233": "envio_dinero(uint256)", +"563ed6d0": "delAdminAddress(address,address)", +"563fce0b": "mappings()", +"56410637": "ethernautsStorage()", +"56411a0f": "ChrizzxToken()", +"56412d85": "getVote(uint256,uint32)", +"56416147": "getopenDdaListAssets()", +"5641ec03": "emergencyExit()", +"56423986": "DecreaseTheAllowance(address,uint256)", +"56430201": "InvestmentMade(address,uint256,uint256,string,bytes)", +"5643a711": "increaseMonsterExp(uint64,uint32)", +"56442869": "destroyCrowdsale()", +"56447520": "dteamVaultAddr4()", +"56451bc2": "removeBalances(address[],uint256[])", +"564566a8": "isSaleActive()", +"5646435b": "burnTokens(address,address,address,uint256)", +"564952d5": "trickleSum()", +"5649efbc": "superFeed()", +"564a187f": "getPopRemainingAsFixedPointForGameId(uint256)", +"564a565d": "disputes(uint256)", +"564a6b94": "cos(uint16)", +"564ad142": "testSubItem(bytes,uint256)", +"564ca533": "setRelayedMessages(bytes32,bool)", +"564e406f": "changeAgencyOwner(address)", +"564ef91d": "PRNG()", +"564f8d23": "rightmost_leaf(uint256)", +"564f9728": "get_row(uint256,uint256)", +"5650152b": "getNextAvailableReward(uint256)", +"5650e5e0": "Couchain(uint256,string,string)", +"565118f7": "lockReleaseDate2year()", +"565135ce": "removeUsersWhitelistB(address[])", +"56514d83": "distributeReserveFunds()", +"5651ce38": "priceStepDuration()", +"5652077c": "finalizeProposal(uint256)", +"56522390": "addEditTokenFee(bytes8,uint256,uint256)", +"565287c9": "votar(uint256,bytes32)", +"5652ced0": "OpnMind()", +"5652ec7e": "GnosisIssued()", +"5653de64": "tokenSold(uint256)", +"56544af0": "taxTillNow()", +"5654a341": "gameIndex()", +"5654b526": "sumHardCapICOStage8()", +"5654edb8": "btcUpdates(uint256)", +"56553a95": "transferIssue(address,uint256)", +"5655c490": "setProviderCurrentRate(uint256,uint8)", +"5655e37b": "CONTRIBUTION_MAX_NO_WHITELIST()", +"56570671": "GetContractStageLiving()", +"565707a8": "getDErc20(bytes32)", +"56575bd7": "setParticipateDailyLootContribution(uint256)", +"5658d212": "getFactoryForCountry(string)", +"565974d3": "details()", +"56597e65": "circulationCap()", +"5659856c": "addApprovedAddresses(address[],uint8)", +"565a2e2c": "getBeneficiary()", +"565a2ecf": "classicTransfer(address)", +"565a7c4c": "epm_system()", +"565af6a8": "referralRegistration(address,address)", +"565b3324": "intMin()", +"565cee48": "ALLOC_ILLIQUID_TEAM()", +"565e2220": "view24()", +"565e4fa1": "subtractScalar(int256[],int256)", +"565eab8e": "TransferMyGGTokens()", +"565ed5a2": "LogMigrationFinalized(address,address,address)", +"565f2da9": "lockTokensForTeamAndReserve(address)", +"565f3297": "bindkey(uint256)", +"565f3624": "testArgOutOfBoundsFail()", +"565fd2a7": "registerCoinData(address,uint256,uint256)", +"5660000a": "tokenRewardRate()", +"566038fb": "cancelTransferRight(address)", +"56605326": "DTFCToken()", +"56610400": "Proposals()", +"566150a3": "GenerateTokenContract()", +"5661ba15": "setDungeonTokenContract(address)", +"5661bcd8": "saosao3()", +"56624ce6": "minVoteWeightK()", +"56630bce": "KycVerified(address,bool)", +"56632637": "node_dupes(uint256)", +"5663896e": "setSecondsPerBlock(uint256)", +"56639a8e": "fixUSDPriceTime()", +"56639ef6": "PikewoodFund()", +"56640afe": "getCampaignLength(uint256)", +"5664a5a3": "MonsterCreatorInterface()", +"5666496a": "_applyForCertifation(string,uint256,bool,string,string,uint256)", +"5666da53": "RYXEX(address,address,address,uint256,uint256,uint256)", +"566735d8": "PreVNK(uint256,string,string,uint8)", +"5669c94f": "issueToken(address,string)", +"566a3cb5": "getTokensHolder()", +"566b28f0": "m_tokenDiscountThreshold()", +"566bbee7": "EventCentsPerTokenChanged(uint256,uint256)", +"566bd6c3": "offerSigner()", +"566c20fc": "writeMessage(string,string,string,string)", +"566c23ad": "setLock(bytes32,string)", +"566c37de": "teamTokenHolder()", +"566c8ed2": "TCI_client(bytes32,address,address)", +"566da66c": "OwnableContract()", +"566dccf4": "enableSaleAgent(address)", +"566dd702": "chargeAdvertiser(address,uint256,uint256,address)", +"566e638e": "createCard(address,uint16[5],uint16)", +"566e78fe": "TokenDistributionMock(uint256)", +"566eebd8": "test_claimShares_emptyRewardPool_notTranscoder()", +"566f4ac5": "payMasters()", +"566fc6de": "getProfitPercent()", +"566fca87": "GazpromCoin()", +"5670d6f1": "stopAirdrop(bool)", +"5670ef72": "setConfigs(bytes32[],uint256[])", +"56715761": "minDuration()", +"567188da": "getTotalBuyBySkull(uint256)", +"5671ec30": "totalCardCount()", +"5672f548": "physicalString()", +"5674a3ed": "runLottery()", +"5675527f": "EtherIco(address,uint256,uint256)", +"567556a4": "fundsTransfer()", +"5675db9c": "setShouldGenerateDna(bool)", +"5675ef9d": "BetPlaced(bytes32,uint8,address,bool,uint256,int32)", +"56765c51": "WITHDRAWAL_WINDOW()", +"56768538": "registerForeignAddress(address)", +"5676d075": "hardCapETHInWeiValue()", +"56780085": "TOKEN_DECIMAL_MULTIPLIER()", +"56782e5b": "hplus(uint256,uint256)", +"5678494f": "ProvePrivKey(bytes32,uint8,bytes32,bytes32,bytes32,bytes32,address,uint256)", +"5678524f": "nextBuyoutPrice(uint256)", +"5679623b": "initializationDelay()", +"567990ae": "LogNoticeMsg(address,uint256,string)", +"5679f636": "toggleBankrollReachedCap(bool)", +"567a03a7": "grantBurner(address,bool)", +"567a0f35": "testHitSoftCapPreDistribute()", +"567a9c79": "claimedBountyTokens(address)", +"567c08e2": "set_minFinneyToKeep(uint256)", +"567c31f7": "taxEarningsAvailable()", +"567c5b70": "getTicketParticipant(uint256)", +"567cc2b6": "setProduction(uint256)", +"567dbf18": "__forward(address,uint256,uint256,bytes)", +"567e75c4": "getLoanState(uint256)", +"5680a3ad": "childExists(address,uint256)", +"56813535": "const_contract_eth_value()", +"56814312": "NekoToken()", +"5681e00b": "getContractMetrics()", +"56820930": "purchaseMakeCard(uint256)", +"56826ee6": "receiveApproval(address,address,uint256,bytes)", +"568287ee": "ShopperlyGlobalToken()", +"5682d43d": "checkWithdrawAddress(address,bytes32,address)", +"56833b16": "AYA()", +"5683a9e0": "LASTTRIAL456()", +"56841b36": "payToReferer(address,uint256,string)", +"56845ca0": "updateProposalOwner(uint256,address)", +"56848c05": "awardMILsTo(address,uint256)", +"5684c219": "getReportingPeriodDurationInSeconds()", +"568531cc": "accountRegistryLogic()", +"5685f6bd": "DELTA_Token()", +"56860ddc": "GTDNToken()", +"56861322": "RecievedTip(address,uint256)", +"56861450": "isAtLeast(int256,int256,string)", +"5686b54b": "cancelAgreement(uint256)", +"5687f2b8": "emitApproval(address,address,uint256)", +"56885cd8": "crowdfunding()", +"56891412": "totalLocked()", +"568a2c55": "setNewStart(uint256)", +"568a8077": "gameResult(uint256,address)", +"568ab21e": "enter(bytes32)", +"568b5915": "votesMaskByOperation(bytes32)", +"568c2163": "END_OF_MINT_DATE()", +"568d13eb": "calculateRegionInitialSalePixelPrice(uint256)", +"568d3900": "getAgentIdByAddress(address)", +"568f57e1": "removeFromApproveList(address)", +"568f7830": "SECoin(uint256,string,string)", +"568f910d": "createPost(address,address,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"568f9ce1": "activateDevice(bytes32)", +"5690d326": "initialize(address,address,uint256,address[],address,address,address,uint256,uint256,address)", +"5692b273": "finalTier()", +"5692e367": "decodedExpiration()", +"5692e54e": "test_0_ensureRegistryFunctions()", +"5693077a": "registerCampaign(uint256,address)", +"56930b55": "tokenOperationsFinished()", +"56939048": "disqualified(address,uint256)", +"5695dd8c": "FindX()", +"5695fa58": "getTotalDistributed()", +"56963c31": "setDistributeAgent(address,bool)", +"56979da7": "assignmentsClosed()", +"5698176a": "getPlayersPoints(address)", +"56982986": "lastBlock_a11()", +"5698fb44": "getTokenBonus()", +"56990301": "FoundersVesting(address,address)", +"56996f6b": "TDESupplyRemaining()", +"56997fb4": "potReserve()", +"5699c7b1": "getPendingWithdrawal(address,address)", +"569a7aab": "isLowercase(bytes32)", +"569aa0d8": "getPlayerSubmissionFromCompetition(string,uint8,address)", +"569bf836": "GYTToken(uint256,string,uint8,string)", +"569c5f6d": "getSum()", +"569ca935": "_setRolePermissions(address,address)", +"569d617b": "postRelayedCall(address,address,bytes,bool,uint256,uint256,bytes32)", +"569d623f": "setEstimatedWeight(uint256)", +"569e9c82": "burnByAgent(address,uint256)", +"569eaf61": "isPaidOut(uint256)", +"569f76e1": "teamOneDivsTotal()", +"569fa9f9": "releaseRecordsCount()", +"56a041fc": "exception(address,address)", +"56a060a2": "isTradingOpen()", +"56a24be0": "getPositionCallTimestamp(bytes32)", +"56a3015c": "Generation()", +"56a3f4ef": "collectMyReturn()", +"56a49b7a": "getStakeLockedStatus(address)", +"56a4e7f9": "GetGlobalProduction()", +"56a61fc4": "_trainPart2(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"56a620aa": "decreaseAfterBurn(address,address,uint256)", +"56a6d9ef": "transferBalance(address,uint256)", +"56a70646": "giveBackEthers()", +"56a7564e": "undistributedTokens()", +"56a765c4": "whitelistBonusAmount()", +"56a7b0bf": "Burner(address,address)", +"56a807d9": "mintvestedTokens(address,uint256)", +"56a8a270": "competitionAddress()", +"56a9399d": "YUNXIN3Token(uint256,string,uint8,string)", +"56a9a68b": "updateAllowances()", +"56aa3892": "FooContract(address)", +"56aa772f": "Use_EmergencyCode(uint256)", +"56aa7cef": "PaymentFinished()", +"56ab4b5d": "TokenPurchased(address,uint256,uint256,uint256,uint256,uint256)", +"56abf07c": "giftStar(uint256,address)", +"56ac1efa": "AcceptsProof(address)", +"56ad2931": "_moveToken(address,address,uint256,bytes,bool)", +"56ad41c8": "XandraSupply()", +"56ad609e": "Addr1()", +"56ad9f57": "CROWDSALE_SUPPLY()", +"56ae89a3": "UpdateUserBitFlag(address,uint256)", +"56af3f2b": "PredatexTiga()", +"56af4d4e": "AanshuToken()", +"56afad92": "TSTORZContract()", +"56afd6e3": "howMuchCanIContributeNow()", +"56afeed6": "SQUIRREL_BOOST()", +"56b00cb5": "Horizon0x(uint256,string,string)", +"56b0443f": "getMarketPrice(uint8)", +"56b09382": "creditDaoAddress()", +"56b15308": "deleteProvider(address)", +"56b1ddbb": "HDT()", +"56b2c5bb": "doSucceedingTransfer()", +"56b30aec": "getPendingWithdrawlListCount()", +"56b30f33": "minAmountForDeal()", +"56b32da1": "gameStarter()", +"56b49ef0": "AuctusWhitelist(uint256,uint256)", +"56b4d760": "getHeroOwner(uint256)", +"56b54bae": "blockRewardContract()", +"56b558d3": "kingContract()", +"56b5d0eb": "_replaceModuleHandler(address)", +"56b6274b": "verifyEmail(address,string)", +"56b62e2d": "JetCoin()", +"56b63df7": "tokenLocks(address)", +"56b644b0": "changeRake(uint256)", +"56b6cb70": "foundersTokensWalletSlave()", +"56b6dbe9": "AustraliavsPeru()", +"56b7538b": "nextRoundDonation()", +"56b760f2": "numFabrics()", +"56b83dc5": "info_Symbol()", +"56b86bc2": "EtherDogCore()", +"56b8c164": "getCreatorTAOSetting(bytes32)", +"56b8c724": "transfer(address,uint256,string)", +"56b8edf0": "TransferEther(uint256)", +"56b9a8ab": "tokenSales()", +"56b9e9de": "getBrehonContract(bytes32)", +"56bb4d4a": "ICO4Period()", +"56bb9b43": "getAppCode(address)", +"56bc0c5e": "UserManager()", +"56bccf91": "depositTokens(address)", +"56bd182d": "privateSupply()", +"56bd928a": "platformLaunchDate()", +"56bdb5c4": "isMainSaleBonusTime()", +"56bdc4ae": "TokenLoot(address,address,address,address,address,address,address,address,address,address)", +"56c11ba3": "priceSelectFight2Death()", +"56c190ec": "processRefundEther(address,uint256)", +"56c21897": "PowerCoin(uint256,string,string)", +"56c23836": "transferDirect(address,uint256)", +"56c26f25": "getPlayerOwner(uint256)", +"56c290b8": "t_wallet()", +"56c2c1f6": "VESTING_TEAM_CLIFF()", +"56c38b2e": "vestingGrant(address,address,uint256,uint256)", +"56c3e31a": "mintContract(address,uint256)", +"56c4339f": "isMainBridgeContract()", +"56c46ac2": "getLockedContract(address,address)", +"56c49c2a": "contractFeeMinAmount()", +"56c4b246": "WrapperLock(address,string,string,uint256,address)", +"56c4e05a": "_balance()", +"56c51ea2": "getRestrictionStatus(uint256)", +"56c5df29": "PCFF()", +"56c686b1": "getPendingWithdrawl()", +"56c6a608": "WeBuyAnyHouse()", +"56c7627e": "tokenLimit()", +"56c7eb7c": "_destroyTokens(address,uint256)", +"56c7f461": "refundContributors()", +"56c82ae5": "sendBalanceForDevelop(uint256)", +"56c88f5f": "mintAll(address)", +"56c8c30c": "maxPossibleWithdrawal()", +"56c8e12e": "refundBalance(address)", +"56c8eaba": "KRE8()", +"56ca528f": "right18(uint256)", +"56ca623e": "toString(address)", +"56ca7143": "INITIAL_FUND_BALANCE()", +"56ca8d75": "setBuyingAmountRanges(uint256[])", +"56cac2e0": "letItRain(uint8,uint256)", +"56cb6655": "stopTokenMinting()", +"56cba008": "stopSales()", +"56ccdadb": "last_roll()", +"56ccf300": "ToptalToken()", +"56cd26eb": "Digiblock()", +"56ce0e6c": "updateMetadata(string,string)", +"56ce3f5c": "dCoinswapToken()", +"56ce4bc5": "receiveEtherFromForegroundAddress(address,address,uint256,address)", +"56ce6377": "WaveVoteContractRegistery()", +"56cea4b2": "addressFounders1()", +"56cff99f": "calcGav()", +"56d0adac": "freeToExtraMinting()", +"56d0bc9a": "updateProfileEmail(string)", +"56d13e6e": "setMaxReferrerBonus(uint256)", +"56d1c866": "getMsg(string)", +"56d1d4a2": "setExchangeThreshold(uint256)", +"56d26468": "appBase(bytes32,address)", +"56d27150": "TheMMORPGToken()", +"56d2ec1b": "internalBurn(uint256)", +"56d399e8": "stakingRequirement()", +"56d3e57d": "_generateRandomNumber()", +"56d400a1": "approveDispute(uint256)", +"56d40468": "lockBountyTokens(uint256,address,uint256)", +"56d44694": "PRICE_4()", +"56d58452": "containsSender()", +"56d59777": "setAdministrator(address[])", +"56d5f541": "_getApprovedAddress(uint256)", +"56d6cad0": "iFx()", +"56d73ad1": "getCertifierDb()", +"56d7bc54": "altCreateTokens(address,uint256)", +"56d7c0da": "ChooseAwea()", +"56d7c2c8": "transferERC20Token(address)", +"56d88e27": "len()", +"56d89b1f": "AuctusBonusDistribution()", +"56d906c7": "setBounty(address[],uint256[])", +"56d95932": "getActualTokensPerEther()", +"56d9bb9a": "viewAllCertificate(address)", +"56d9c0e3": "requestReading(address)", +"56da7743": "getBetsNums(address,uint256)", +"56da934e": "addTowardsTarget(uint256,uint256)", +"56daf2c1": "paymentWeiOwed(uint256)", +"56daf906": "THAW_CYCLE_LENGTH()", +"56db3df0": "weiForToken(uint256)", +"56db6353": "buildChainlinkRequest(bytes32,address,bytes4)", +"56dbc007": "isChild(address,address)", +"56dcd2fa": "ICO_LEVEL_3()", +"56ddbe7a": "setVRC(address,address,uint256)", +"56ddeea2": "getIcoDiscountPercentage()", +"56ddf404": "Executed(string)", +"56de9219": "Arina_amount()", +"56de96db": "setState(uint8)", +"56dfe628": "viewa2(address)", +"56e19e6e": "DDNToken(uint256,string,uint8,string)", +"56e1c40d": "burnFeeNumerator()", +"56e27ce6": "LuxToken()", +"56e2eab8": "listAddress(address,uint256,uint256)", +"56e379c1": "setICOLimit(uint256,address)", +"56e39c58": "ProtectedTransfer(address,address,uint256,bytes32)", +"56e3df97": "getGeneration(uint256)", +"56e40a32": "auctionEthEnd(address,uint256,uint256,bytes)", +"56e428fc": "LogAccessChanged(address,address,bytes32,address,uint8,uint8)", +"56e44954": "setExchangeRates(address)", +"56e49287": "auctionsEndTime()", +"56e4b68b": "supervisor()", +"56e4bc1f": "payed()", +"56e4e073": "TestETHToken()", +"56e523e2": "OpenSourceChainToken(address)", +"56e52cbb": "getMinWeiForDInit()", +"56e567e5": "balanceOfa(address)", +"56e5cf2e": "setBytesArray(bytes32,bytes32[])", +"56e5e12b": "fundariaPoolAddress()", +"56e60a31": "TokenExchangeFailed(address,uint256)", +"56e62326": "createMultiple(uint256[],uint256[],uint256[],address)", +"56e721b3": "_getRefBonus(uint256)", +"56e789eb": "checkTotalSold()", +"56e7bcd1": "putUsername(string)", +"56e7f6c7": "layerCount()", +"56e83e81": "randao()", +"56e8596f": "grantContributorTokens(address)", +"56e8b3ac": "PabloPlusToken()", +"56e8efd4": "EventNotarise(address,bytes,bytes)", +"56e8f53e": "_crownTotalSupply()", +"56e97617": "bullcrapToken()", +"56e9ae71": "OCTCOIN()", +"56e9d1f3": "deList(bytes32)", +"56e9ec88": "equipmentItem(uint256[],uint256[],uint256)", +"56ea84b2": "getMarketCurrentIndex(uint256)", +"56eaf1c0": "commissionPoints()", +"56eb5a79": "Bags()", +"56ebb303": "rewardContributors(address[],uint256[])", +"56ebd52d": "STRAAToken()", +"56ed8636": "membershipStatus(address)", +"56eeb3b0": "startAtBlockNumber()", +"56ef9296": "getMultiRequestFirstRequestId(uint256)", +"56f09125": "getConverters()", +"56f10988": "GDCNumber4()", +"56f14cf6": "_burn(address,uint256,uint256,uint256)", +"56f1594e": "UpdateMoneyAt(address)", +"56f19703": "rejectedBookingfc(uint256)", +"56f1d2dc": "increaseSystemCreatedCount()", +"56f1dd6b": "ifoodDev()", +"56f2b308": "GDCNumber2()", +"56f2eb90": "pendingRewardsToMint()", +"56f2fc89": "deployIdeas(address)", +"56f399a7": "getContractInvoices(uint256,uint8)", +"56f43352": "tradingFee()", +"56f464ea": "releaseFundsWhenBothSigned()", +"56f50473": "downPayment()", +"56f66f4c": "reportResult(uint32[],int8[],uint32,uint32,uint32,uint32,bytes32)", +"56f6e184": "addToWhitelist(uint8,address)", +"56f7cafe": "registry_exec_id()", +"56f91399": "trCut()", +"56f99fcb": "freezeLottery(uint32,bool)", +"56fa47f0": "split(address)", +"56fa9f6b": "allowRating(address,address,uint256)", +"56fadf8e": "createItem(string,uint256,uint256,address,uint256[6])", +"56fb46d7": "COOPERATE_REWARD()", +"56fb8a34": "getPivot(uint256,uint256,uint256)", +"56fbd029": "Saflok(bytes32,bytes32,bytes32,bytes32)", +"56fbdca3": "whitelistInvestor(uint256)", +"56fbf488": "setPrix(uint256,uint256)", +"56fc35d3": "BunzolaToken()", +"56fc6dae": "getUpline()", +"56fcb29f": "selfPayout()", +"56ff2318": "usersWithdrew(address)", +"56ff55d1": "_isSchemeRegistered(address,address)", +"56ff83c8": "crowdsaleWallet()", +"56ff918d": "getNextKillingAfter()", +"57006864": "checkBetParity(uint8)", +"5700cb10": "getMainRemainCoins()", +"570136ad": "liuToken(address,address)", +"57014fee": "domainOwner(string,string)", +"57016ded": "transfer_to_reserves(address,uint256,uint256)", +"57019b37": "setControllerAddress(address,address)", +"5701ac59": "calculateReferralFee(uint256,uint256)", +"5701e9c0": "TrustlessTransaction_Refunded(uint256,uint256)", +"570200c0": "setStarterPack(uint256,uint16)", +"5702b530": "byteToString(bytes1)", +"57035b60": "SWIZERStandardToken(uint256,string,uint8,string)", +"570468f0": "SupportRemoved(address)", +"5704b927": "ASXC(uint256,string,string)", +"57056261": "insert(uint256,bytes32[])", +"5705b612": "getUserId(address,address)", +"5706d99a": "STAGES()", +"5707812e": "addToLists(address,bool,bool,bool,bool)", +"5709013e": "changeToStage(uint8)", +"570919a6": "retrunError()", +"5709d7bd": "DevPromotionsMarketingWallet()", +"570a2a16": "right53(uint256)", +"570a8496": "uploadData(bytes32[])", +"570b615a": "tournamentDataIPFSHash()", +"570bc25f": "makeOrder(address,address[5],uint256[8],bytes32,uint8,bytes32,bytes32)", +"570ca735": "operator()", +"570d2f8f": "trustedWallet()", +"570d31b7": "ConsultaRegistro(bytes32)", +"570e0db5": "addDestination(bytes32)", +"570e6729": "getOptionHash(address[3],uint256[3])", +"570e997d": "gettnode(address)", +"570f65c4": "getProjectArbitrationFees(bytes32)", +"570fceb0": "updateHashrate(address,uint256)", +"570fe8c3": "cancel_payment(uint256)", +"571080ae": "getMyLobster()", +"5710ac73": "unlock(address,address[],uint256[])", +"5710de14": "newProof()", +"5710ed95": "contractBlock()", +"5711b311": "executeRemoveAuthorizedAddress(uint256)", +"571218fa": "priceModel()", +"57128ec1": "userGrowPoolAddress()", +"57135859": "BBBToken(uint256,string,string)", +"57138106": "verifyKyc(address)", +"5713fcb7": "compatible20()", +"5714db23": "AdvisoryPool(address,address)", +"5714e01f": "ownsAddress(string,address,address)", +"5714f6a1": "getTotalAvailableRelays()", +"57157189": "getListMarkets(address,uint256)", +"5715b530": "claimReservedTokens(string,address,uint256,string)", +"5715c5b7": "getTokenAddressByIndex(uint256)", +"57163cc3": "initAtx(address,address,address,uint256)", +"571694cd": "getHashOfSecret(bytes32)", +"57183698": "addProject(uint256)", +"57183c82": "instantiations(address,uint256)", +"5718b760": "withdrawSize(address)", +"5718b994": "checkEvent(address,bytes,bytes,uint256)", +"571959e0": "getServiceProvider()", +"57199334": "insertUser(address,bytes32,bytes32,bytes32,uint256)", +"5719a565": "SignerChanged(address)", +"5719dd22": "getTokenListLength()", +"571a045d": "change_game_stic(string)", +"571a0830": "withdrawAndKill()", +"571a1f66": "erc165UpdateCache(address,bytes4)", +"571a26a0": "auctions(uint256)", +"571af13b": "unlock10PercentTokensInBatch()", +"571b0227": "createUserLottery(uint32,uint32)", +"571b3d52": "createCitizen(address,uint16,uint16,uint8,bytes32,bytes32,bytes32)", +"571c4539": "askQuestion(address,uint256,string,address[])", +"571e4a6d": "addEngineer(address,uint256,uint256)", +"571ebd3c": "addCandidate(address,bytes32)", +"571ec8d9": "addBoardScore(bytes32,bytes32,uint256)", +"571f4d9a": "getOffsets()", +"571fe016": "MAX_SALE_SUPPLY()", +"57204a1d": "unlockat()", +"57207703": "initBank(uint256)", +"5720988b": "QLANCE()", +"57211ac0": "getPaidOut(address)", +"5721b89a": "withdrawNoMoney(bytes32,address)", +"5721e419": "getBuyer(address)", +"5722e24a": "setLogger(address)", +"57230ff8": "createCity(uint256)", +"57240913": "vouched(bytes32,uint256)", +"57241f8e": "tokensOnSale()", +"5724630c": "Disbursed(address,uint256)", +"57246c1c": "getPartnerCash(uint8,bool)", +"57246d23": "jackpotSize()", +"57257a67": "startPrivateSales()", +"5725b8c5": "_initRandom()", +"57260364": "changeSubcourtTimesPerPeriod(uint96,uint256[4])", +"57263ce1": "_isProviderValid(uint256)", +"57266803": "casinoWithdraw(uint256)", +"57271a93": "bountyP()", +"57277b92": "storeEth()", +"5727dc5c": "BB()", +"5727e25d": "getCurrentRoundId()", +"5727e30b": "makeOraclizeQuery(uint256,string,string,uint256)", +"5727eec0": "speed_limit()", +"572816ef": "audit(uint8,uint8,uint256)", +"57282b96": "bobMakesErc20Deposit(bytes32,uint256,address,bytes20,bytes20,address,uint64)", +"5728ab6c": "kyberTrade(uint256,address,address,bytes32)", +"57292af8": "bonusRateOneEth()", +"572b130f": "addItem(uint256,uint256,uint256,uint256)", +"572b7a03": "minimumFeePlusDividendsPercentage()", +"572bcb3e": "setLockByPass(address[],bool)", +"572bcfe1": "deliverRewardedTokens(address,uint256,string)", +"572c1517": "transfer(uint256,string,bytes)", +"572c62ca": "poolSale()", +"572d5298": "setProduct(string)", +"572e85ec": "getCurrentPhase(uint256)", +"572f37b4": "notePrepurchase(address,uint256,uint256)", +"57315881": "getdoctor(uint256)", +"5731d433": "balanceInLottery(uint32,address)", +"5731d9cb": "seriesInfo(bytes32)", +"5731d9e3": "onefive()", +"5731f357": "oraclize_query(uint256,string,string,string)", +"5732788a": "validateCompanyName(bytes32)", +"57329424": "getPorscheByOwner(address)", +"5732a273": "backup_drawdown_amount(uint256)", +"573328ef": "advertising()", +"57332f08": "Lexcoin()", +"57337044": "randomByWeight()", +"57344e6f": "getCredit(address)", +"57347f24": "playerWithDraw(uint256)", +"573618f3": "eXchangeQualityCoin()", +"5736c9d4": "getStageBuyers(uint8,uint16,uint8)", +"57381228": "betInStageAndReturnExcess(uint256,uint256)", +"57381ee4": "sendTokens(address,uint256,uint256,bytes32)", +"57386c2a": "smallId()", +"5738fa56": "hasDataStream(bytes32)", +"57393674": "exhaustFusion(uint256)", +"573939de": "_resetFrozenInfo(address)", +"573c0bd3": "updateValue(uint256)", +"573d2411": "VeraCoinPreSale(uint256,uint256,address,address,uint256,uint256,uint256,uint256)", +"573d3a23": "makeTransfer(uint256,uint256,uint256,bytes32)", +"573d559f": "_handleCoolDown(uint256)", +"573d72b7": "PERIOD_AFTERSALE_NOT_TRANSFERABLE_IN_SEC()", +"573dea96": "toWei()", +"573f642d": "_productDigest()", +"573f7af5": "mintNFTsForSale(uint256[],bytes32[],uint256[])", +"57400cf3": "currentJackPot()", +"57405301": "creatorad()", +"57408a98": "getNode(int256)", +"5740a4be": "CertifyDelegate(address,uint256)", +"5740d43c": "setDeprecated(address,bool)", +"57411a67": "getAddressDigit(address,uint8)", +"57417e78": "insetMoney()", +"5741fbce": "isPresellOpen()", +"574356b4": "VULCAN_PROMETHEUS()", +"5743cee0": "BwwToken()", +"57446636": "createContractOfAthlete(string,address,uint256,uint256,uint256)", +"574479e6": "currentPot()", +"574490cd": "ERC721Address()", +"57451104": "bonus_for_add_stage()", +"57478e38": "Free_Ether_A_Day_Funds_Return()", +"5747baf5": "Roles()", +"57481222": "get_all_project_information(uint256,address)", +"574844f4": "BLMFund()", +"574a5e31": "weiPerAtom()", +"574a89e9": "GOOGLE()", +"574bea92": "bonusPhaseOneDeadline()", +"574c339a": "HackerSpaceBarneysToken()", +"574c8776": "addAddressesToRole(address[],string)", +"574cc0fe": "addManyToWhitelist(address[],uint16,uint256)", +"574d6554": "setIPFSHash(string,string)", +"574e9063": "crowdfundPercentOfTokens()", +"574edd28": "updatePropertyData(uint256,string)", +"574f9a81": "setAttr0(uint256)", +"5750644a": "setProviderParameter(bytes32,bytes)", +"5750abfa": "BONUS_TIMES(uint256)", +"5750daa0": "GameToken()", +"57518243": "addToWhitelist(address,address)", +"575185ed": "createGroup()", +"5751892f": "increaseProjectCompleteLevel()", +"57530017": "setReservedTokensWallet(address)", +"57536e64": "GuessTheRandomNumberChallenge()", +"5753a6b2": "construct(bytes32,string,bytes32,address,uint128,uint256,uint64,uint64,uint256)", +"57548f32": "_tokenPurchased(address,address,uint256)", +"5754a042": "attempts()", +"5754aadc": "getEntryByName(bytes32)", +"57553101": "updateDetails(string,string,string)", +"5756572e": "Show_the_name_of_Option_B()", +"5757a66a": "_deployBallotChecks(bytes32,uint64)", +"5757dcdf": "getCooldownIndexFromGeneration(uint16)", +"5758537b": "payBonusAffiliate(address,uint256)", +"57593c23": "TokensDelegated(address,uint256,address)", +"57595e2a": "get_previous_global_audit_document(bytes32)", +"57597321": "_findpos(uint256,uint256)", +"57599dff": "curatorAddressOf(uint256)", +"5759e7af": "getMilestonesLength()", +"575a4187": "getClaimableStake()", +"575a7722": "setPOOL_edit_29(string)", +"575ab848": "MatCashToken()", +"575b4071": "currentPeriodEndTimestamp()", +"575b6efe": "EARLY_INVESTORS_SUPPLY_LIMIT()", +"575b8cc8": "kcck256str(string)", +"575cb0f6": "block()", +"575cea6b": "getUserReferrals(address)", +"575d462a": "phase1EndBlock()", +"575dfc4a": "Sale(uint256,uint256,uint256,uint256,address,address,uint256,uint256,uint256,uint256,string,string,uint8)", +"575eaf98": "fractionalize(address)", +"575ed3de": "ViewGold()", +"575f7832": "InterestFinal(address,address)", +"5760168b": "ElearningCoin(uint256,string,uint8,string)", +"576077e2": "realtransfer(address[],uint256[])", +"57607ddd": "PUBLIC_SALE_END()", +"57611ba3": "offerCollectibleForSaleToAddress(uint256,uint256,uint256,address)", +"57614c2a": "resetLockReleaseTime(address,uint256)", +"576168fc": "partnerAddress()", +"57623d59": "AttachAsset(uint256)", +"5762a880": "standFeeBefore500()", +"5762f25f": "test_1_validShouldBe5()", +"57635dc1": "validate(address[5],address,uint256[12],uint256,bytes,uint256)", +"5763e103": "powercontract()", +"57646d5d": "OkkamiToken()", +"57650592": "getPlayerBackDataForMarketPlaceCards(uint256)", +"57651be6": "replaceUser(address)", +"57652f13": "assingAdminship(address,uint8)", +"5765a796": "addRegistered(address)", +"5765cc2a": "setmessiDevAddress(address)", +"5765dd1a": "MTC(address,address,address,address,address,address,address)", +"57670366": "getTargetReportsPerReporter()", +"576709a2": "finishingWithdrawing()", +"5767b9ab": "retrieveV(uint256)", +"5768bc4a": "_createArmy(string,string,uint256,uint256,uint256)", +"5768fca3": "paymentDestination()", +"57693e9a": "NBB()", +"576b8bba": "SeedMemberCanDraw()", +"576bc138": "NKCToken()", +"576c3de7": "getTier(uint16)", +"576c51bc": "countOfPublicKey()", +"576cecdc": "checkStubs(bytes32,bytes32,address)", +"576cfdd7": "window2EndTime()", +"576d067b": "StageOneDisable()", +"576d1ce1": "internalVerifyCert(bytes32,bytes32,address)", +"576d4e13": "_createLinglongCat(uint256,uint256,uint256,uint256,address)", +"576e6d4e": "_buyXaddr(address,uint256,bytes32)", +"576eac66": "setFundingGoal(uint256)", +"576f35e3": "setBatchSize(uint256)", +"576f7e31": "getApprovedBuyerMappingCount(address)", +"576f9cba": "isInDirectory(address)", +"577000a3": "onlyPartnersOrAdmin(address)", +"57712f37": "CappedBurnToken(uint256)", +"577131ac": "bankrupt(address[])", +"57717090": "transferWinnings(uint256,address)", +"5771d6e4": "readMessage(string)", +"5772437f": "unfreezeOf(address)", +"57727a04": "ZZCoinToken()", +"5772ae70": "setLoanManager(address)", +"5773faf9": "modifyVariable(address,uint256,uint256,uint256,uint256)", +"5774ce4d": "sendBonus(address,address,uint256)", +"5775b57e": "totalBuyOrdersOf(address)", +"57764094": "getRate(uint256)", +"5776af28": "shardAward(address,uint256,uint256)", +"57771a23": "del(uint256)", +"5778472a": "getOrder(bytes32)", +"57786394": "feeMake()", +"57788716": "doKeccak256(uint256)", +"577890f6": "presaleFallBackCalled()", +"5778bec2": "Deal()", +"57796e1c": "setVote(uint256,uint256)", +"577a75a0": "CRAWDSALE_END_DAY()", +"577bd336": "progress()", +"577c78f1": "SitcomToken()", +"577ccfe0": "tokenFrozenUntilNotice()", +"577ec5ae": "cookieProductionMultiplier()", +"577ef53d": "SetA(uint256)", +"577f7133": "PHOENIX_CORSAIR()", +"57806705": "addpatient(uint256,uint256,string)", +"5781d9e7": "isRegisteredRetailer(address,address)", +"57820829": "UP_etherWin()", +"578242c3": "CompositeCoinCrowdsale(uint256)", +"57831809": "payoutCount()", +"57835720": "setSetupCompleted()", +"578436a7": "CoinDisplayNetwork()", +"57850fc7": "getPotentialAmount(address)", +"578551aa": "goods(uint32)", +"5785b3f9": "VIRALTOKEN()", +"57861e65": "VVDBCrowdsale(address,address)", +"5786a552": "registerEmployee(address)", +"5786cbdc": "sendBackSurplusEth()", +"5786f28c": "regionsIsPurchased(uint256)", +"5786fd40": "getProductsCount()", +"57875631": "setAccessPolicy(address,address)", +"578799b3": "QRTok()", +"57880042": "bulkPurchageEgg()", +"57880c04": "releaseForce(address,uint256[],uint256[])", +"57885380": "ChannelAudited(uint256)", +"5788a081": "ownerAddressMap(address)", +"57894c1b": "createClone(address)", +"57895ca2": "setManagerContract(address)", +"5789a722": "LocusToken()", +"5789b1cd": "transferAdminMessage(address,address)", +"5789baa5": "isUnlockedBoth(address)", +"578a791d": "setExchangeFeeRate(uint256)", +"578aa665": "_createToken(string,address,uint256)", +"578affb4": "Logger(string,bool)", +"578b08e2": "GPUxToken()", +"578b2dab": "euroTeams(uint256)", +"578b3a56": "normaliseCardIndices(uint256[])", +"578bbdc1": "isSaleContract(address)", +"578bcc20": "reduceDebt(address,address,uint256)", +"578bcf35": "distributed(address)", +"578bcfca": "AddedToHolder(address,uint256,uint8,uint256)", +"578c3485": "iWantToKillMyself()", +"578c6642": "BONUS_BATCH()", +"578cf4a9": "testTemp1()", +"578d52b6": "GetDidPayOut(bytes32)", +"578de482": "OCE()", +"578de8aa": "addressToAsciiString(address,address)", +"578e2f7d": "verifiPost(uint256,bool)", +"578e9825": "burnEscrow(uint256)", +"578ee866": "getCurrentTimeBonusRate()", +"578f9658": "shopTome()", +"578ff67a": "new_hash(bytes32)", +"57901b19": "genRandomArray(uint256,uint256,uint256)", +"57902a75": "rateTier2()", +"579078cf": "TestAnyChain()", +"5790de2c": "ProposalAdded(uint256,address,uint256,bool,string)", +"579140e8": "BITSEACoinERC20Token(uint256,string,string,uint256)", +"579140f4": "tokenInitialized()", +"57915897": "faucet(uint256)", +"57918052": "setPriceIncreasingRatio(uint16)", +"5792b512": "Bettereum()", +"5792e1de": "CheckCarToken()", +"5792e262": "registration_fee()", +"579327fd": "TOTAL_ETHER_HARD_CAP()", +"5793511f": "playersList()", +"57938b2a": "requestCancellationMinimumTime()", +"5793bfdc": "createSDC(address,address,uint256,uint256)", +"579424e7": "HOWLToken()", +"579425b7": "feeBurnerContract()", +"57945e3e": "anyAssetHasChanges()", +"57945ed1": "FindMyFish_EnterBarcode(bytes9)", +"57946897": "Test11()", +"57946a86": "SPEKToken()", +"57950697": "testState()", +"57955f3b": "ExampleIntervalTree()", +"579599bd": "canCreateEdition(uint256,uint8)", +"57978a75": "updateInviteInfo(address,uint8)", +"5797cd52": "Settle(uint32,uint32)", +"57987d38": "PSCN()", +"57988a55": "card_gold_first()", +"57989b4c": "IsCityNameExist(bytes32)", +"5798d5bc": "rSetA(address)", +"579952fc": "transferFromTo(address,address,uint256)", +"579b9499": "estimatePurchasePayment(uint256,uint256)", +"579badf6": "UniversalFunction(uint8,bytes32,bytes32,bytes32,bytes32,bytes32)", +"579cd3ca": "conversionFee()", +"579cdf17": "getAdminName(address)", +"579d4f7a": "changeHouseFeePercent(uint256)", +"579d5fba": "debug_hash3Int(uint256)", +"579da090": "needUpdate()", +"579db769": "getIudex(address)", +"579e0b87": "assignAnotherOwner2(address)", +"579f0789": "BNN_ALLOCATION()", +"579f20d8": "submitProxyVote(bytes32[5],bytes)", +"579f61d8": "valueDelete(string)", +"579fc25e": "contractFallback(address,uint256,bytes)", +"579fe761": "vote(uint80,uint80)", +"579fea7d": "setDolRate(uint256)", +"57a0685b": "privateSaleMinEth()", +"57a15c4f": "createOffspring(address,string,uint256,uint256)", +"57a1a58e": "setCycleResetTime(uint256)", +"57a218e6": "WeSource(bytes32)", +"57a27a76": "checkCompletedCrowdsale()", +"57a2e60c": "VoiceCoin()", +"57a373a1": "uintInArray(uint256,uint256,int256,uint256[],uint256)", +"57a533e9": "logPromiseCreated(uint256,address,uint256,uint256)", +"57a756d3": "walletC()", +"57a83f25": "TKRToken()", +"57a858fc": "shares(uint256)", +"57a8c01f": "registerUser(address,uint256,uint256,uint256,uint256)", +"57a967ca": "waitingForClaimTokens()", +"57a96dd0": "proxyTransferWithReference(address,uint256,bytes32,string,address)", +"57a9838a": "Tronerium()", +"57aaafe2": "toggleArtworkVisibility(uint256)", +"57aaf08b": "getAlgosByCreator(address)", +"57abd75d": "_weiToMth(uint256)", +"57acc118": "setForward(address)", +"57ad693b": "MIN_UPDATE(bytes32,uint256)", +"57adc83a": "angelTime()", +"57aeb5c8": "convertToMiniCFT(uint256)", +"57aee888": "_eraseNodeHierarchy(uint256,bytes32[],bytes32)", +"57aeeb25": "becomeSquirrelmaster()", +"57af3eec": "STARTING_HIPSTER()", +"57afb890": "collectRemaining()", +"57b001f9": "unpause(address)", +"57b021f3": "dynamic_profits2(address,address,uint256)", +"57b07cd9": "getReleaseHash(uint256)", +"57b16811": "totalsInfo()", +"57b34be7": "_moveStage()", +"57b394bf": "walletWithdrawal(address,uint256,uint256)", +"57b45386": "removeCode(string)", +"57b473e2": "okamiMinPurchase_()", +"57b543e2": "getOwnersLength()", +"57b69e72": "_kittenContract()", +"57b70510": "parseResult(bytes)", +"57b7247e": "UserWallet(address,address)", +"57b7a0b6": "Paye()", +"57b8e8c3": "devcon2Token()", +"57ba8652": "getRank02()", +"57babe2e": "collectedBcy()", +"57bbf921": "salesaccount()", +"57bcccb6": "revokePermanentApproval(address)", +"57bce8b0": "sendWei()", +"57bcfc09": "HomeChain()", +"57bd2a65": "allocated3Year()", +"57bd4f7b": "getTime1(address)", +"57bf04be": "changeOwnedOwnershipto(address)", +"57bf66d4": "accountForIncrease(uint256,uint256)", +"57bfab93": "getAllABaddress()", +"57c07055": "scheduleCall(address,address,bytes4,bytes32,uint256,uint8,uint256)", +"57c19b4f": "postFreezeDestination()", +"57c1a709": "travelUnitFee()", +"57c1f9e2": "removeDistributor(address)", +"57c1feca": "BonusChanged(uint256,uint256,uint8)", +"57c393fa": "transferSuperuser(address)", +"57c3b376": "updateRandContract(address)", +"57c3f997": "isReserved(address)", +"57c508d3": "IsThisExternal()", +"57c60982": "calcProfit(address)", +"57c67ad1": "RobotTradingIco()", +"57c6c642": "MultiTranser()", +"57c85787": "batchMint(address[],uint256[],uint128[])", +"57c8b724": "addPresetTransfer(address,uint256)", +"57ca94fa": "_addUser(address)", +"57cb2fc4": "getInt8()", +"57cb48c9": "issuerTokenName()", +"57cb4947": "mintRequest(address,uint256,uint256)", +"57cc2d52": "testStoresParentChallenge()", +"57cc5941": "getTileClaimerAndBlockValue(uint16)", +"57ccbe28": "isPreICOPrivateOpened()", +"57ccc80e": "putSmartContractOnSale(bool)", +"57cd23a6": "TeamLockingPeriod24Months()", +"57cd650d": "sealDataStream(address,address,uint256,bytes32,uint256,bytes32)", +"57cdd078": "isIcoInProgress()", +"57cdf799": "createContractItem(string,bytes32)", +"57ce0ec0": "MIN_PRE_ICO_SLOGN_COLLECTED()", +"57cea5c0": "weaponTokenIdToDamageForEncounter(uint256,uint256)", +"57cf9add": "showOwnerContract()", +"57cfd296": "getFurnace(address)", +"57cfeeee": "transfer(address,uint256,bytes32)", +"57cff409": "tpt()", +"57cff437": "getKunsByOwner(address)", +"57d0354b": "NothingToCancel(address)", +"57d083b5": "_evaluateSkill(address,uint8,uint256,uint256,uint256)", +"57d13917": "getCompany(uint256)", +"57d15c6a": "_time()", +"57d17805": "getTokensSold(uint256)", +"57d1c582": "TokenData(address,uint256,address)", +"57d25a0f": "retrieveAssets(address)", +"57d4021b": "nextPayoutWhenPyramidBalanceTotalsApproximately()", +"57d444fd": "detachController()", +"57d4617b": "getAllocatedTokenAddress(address,address,uint256)", +"57d4f398": "unfreezeBalance(address)", +"57d55116": "_safeApprove(address,uint256)", +"57d55367": "publishResult(uint32,string)", +"57d56267": "getModuleCount()", +"57d5927f": "LogOraclizeCall(uint256,bytes32,string,uint256)", +"57d5939c": "IsValidated(string)", +"57d61f3c": "TokensSold(address,uint256)", +"57d62a30": "accountFeeModifiers(address)", +"57d6f5f2": "canLogIn(address)", +"57d70c0b": "getIcoRuleList()", +"57d713d5": "getPendingUserCount()", +"57d775f8": "epochLength()", +"57d786da": "_checkPolicyEnabled(uint8)", +"57d93329": "endCrowdsalePhase3Date()", +"57d9fd41": "orderLastDate()", +"57da1fb2": "isMonsterChampionship()", +"57da9166": "Dodol()", +"57db8024": "adminDeposit(address)", +"57dbefdd": "addExcluded(address,address)", +"57dc2658": "setLastCrowdsale(address)", +"57dc561f": "assignTokenIJK(address,uint256)", +"57dc5d9d": "adminer()", +"57dc9760": "DaoChallenge()", +"57dd2f26": "AntriexToken(uint256,string,string)", +"57dd8366": "jackpotGuaranteed()", +"57ddf217": "gameoverGetYUM(uint256)", +"57de26a4": "read()", +"57df844b": "getTokenTotalSupply()", +"57e07140": "testTransferFromCorrectlyAllowsDelegationOfTokenOwnership()", +"57e0b222": "ERC20Store(address)", +"57e18886": "reserveTokens(address,uint256,uint256,uint256)", +"57e1fae2": "transferChild(address,address,uint256)", +"57e233e2": "hardcapUSD()", +"57e25a79": "PullPaymentCapable()", +"57e2880d": "scheduleTransaction(uint256,uint256)", +"57e49ca8": "safeTransferChild(address,address,uint256)", +"57e4e95d": "burnerChangeable()", +"57e53d4e": "currentStageETHContributions()", +"57e5be05": "current_mul()", +"57e5eea5": "getCurrentBonus()", +"57e60c27": "removeAccountReader(address)", +"57e6a64c": "AddrRewardPlan()", +"57e6a6af": "METS6()", +"57e6c2f4": "isAuthorized()", +"57e71cd7": "setPreIcoHardCap(uint256)", +"57e7afd0": "addIPFSFile(string,uint256,string,bytes32,uint256)", +"57e871e7": "blockNumber()", +"57e8f401": "getUserLandLimit(address)", +"57e984cf": "changeMonthlyRate(bytes32,uint256)", +"57ea563a": "tokensByLtcTx(string)", +"57ea89b6": "Withdraw()", +"57eabab4": "defaultMintingAddress()", +"57eaeddf": "_isContract()", +"57eb3431": "recordPresalePurchase(address,uint256)", +"57eb95a7": "trainSpecial(uint256,uint256,uint256[2])", +"57ebc286": "approve_fixed(address,uint256,uint256)", +"57ebc7a8": "logLargeContribution(address,address,uint256)", +"57ee24af": "getNum(bytes32,uint256)", +"57ef58c1": "canDefrostAdvisors()", +"57f011b6": "destTokensEarlyInvestors()", +"57f032e7": "changeAgent(address)", +"57f04d2b": "updateLedger(uint256,address[],address,uint256[],uint256[])", +"57f1935f": "refundTokens(address,address)", +"57f196fa": "lastBidID()", +"57f1f6ca": "rareStartPrice(uint256)", +"57f232e1": "buyFucks()", +"57f2c6b7": "withdrawOfferForCollectible(uint256,uint256,int256)", +"57f2d763": "LongTerm()", +"57f32591": "changePriceChangeName(uint256)", +"57f46cbe": "collect(uint256[])", +"57f47bf9": "sh_doAgree()", +"57f4d5ec": "processDividends(address,uint256)", +"57f5abe5": "setERC20TotalPromo(uint256,uint256)", +"57f6280e": "FundManager()", +"57f65e24": "setArray(bytes32,string[])", +"57f664ed": "TOKENS_ALLOCATED_TO_PROOF()", +"57f70b21": "WorldToken(uint256,string,uint8,string)", +"57f7b905": "balanceBonusOf(address)", +"57f86b6a": "theRiver()", +"57f91458": "sacredToken()", +"57f94c82": "airDropTokenIssuedTotal()", +"57f9fb11": "internalRefund(address)", +"57fa7044": "_changeCycleValue(uint256,uint256)", +"57faa161": "TokenBonusGiven(address,uint256)", +"57fb25cc": "initialize(address,address,uint256,uint256,address)", +"57fbac06": "setAllowTransferExternal(bool)", +"57fbb9df": "withdrawContractBalance(address)", +"57fc3991": "returnTokens(address,address,uint256)", +"57fc8a20": "custom(address,bytes)", +"57fc990f": "_createAuction(uint256,uint256,uint256,uint256,address)", +"57fdf2b2": "transferrableBalance(address,uint256)", +"57fe5a5f": "FREEREWARDPPOINT()", +"57ffd7cc": "createNewContract(uint256,address,address,address)", +"57ffd863": "deleteHiddenPosition(bytes32)", +"5800827c": "mintExtraTokens(int256,uint256)", +"580101c8": "startingSnailAmount()", +"580215fc": "transferFinal()", +"580225d5": "HomeBridge(uint256,address[])", +"58022de4": "recoverSigner(bytes32,bytes32,bytes32,uint8)", +"58022e3f": "AkbulutTokenICO()", +"5802c695": "setPendingValue(uint256,bool)", +"5802f02d": "SavingsAccount()", +"58047913": "getWrappedContract()", +"58056392": "setLockBalance(address)", +"58057468": "confirmTransferOwner()", +"58057d81": "transferDomainToBuyer(uint64)", +"58058304": "clearFund(uint256)", +"580588a1": "havedAirDrop()", +"58062e66": "VIRTVEN()", +"5806ba15": "InbotToken(string,string,uint8)", +"580709cb": "downTheDrainImmediate()", +"58074d8b": "keyIndex()", +"5807630f": "transferEthToOnwer()", +"5807703d": "getMainGasPrice(bytes)", +"580786cf": "getRoundOpen(uint256)", +"58078a5a": "_checkAndAdd(bytes32,bytes32)", +"58079e7b": "setStartOfPresale(uint256)", +"580822da": "CoinLordToken(address)", +"5808e1c2": "betOnNumber(uint256)", +"5808ee15": "setDefroster(address)", +"5809ea99": "hitPrice()", +"580b72e1": "approveTokens(address,uint256,uint256)", +"580bd977": "distributeFunds(uint8)", +"580bdf3c": "disableBetting_only_Dev()", +"580c0fd8": "COMIKETCOIN()", +"580c2ae9": "numberOfPurchasers()", +"580c5072": "IsPremature(uint256)", +"580cf318": "tokenRemainCap()", +"580e77d4": "startMainSale()", +"580ea491": "PatronageRegistry(address)", +"580efd6b": "totalWageredForAddress(address,address)", +"580f2427": "LeeSungCoin()", +"580f3904": "requestTokens(address)", +"5810291a": "getplayerpool()", +"581191f7": "DNATIXToken()", +"58128969": "cycleStart()", +"5812f78a": "A2UToken()", +"58144fbd": "covmanAddress()", +"58150c8b": "GameRegistry()", +"581515fd": "howManyEtherInWeiToBecomeOwner()", +"5815528c": "setInviterEdge(uint256)", +"581627bc": "ownerWithdrawl(uint256)", +"58163c23": "calcBonus(uint256,bool)", +"5816ba9d": "unFrozen(address)", +"58172da1": "payBankroll()", +"581732dc": "setLev1(uint256)", +"5817465c": "RidgeToken()", +"58178168": "punkIndexToAddress(uint256)", +"581847d6": "changeDeveloperSFTDestinationAddress(address)", +"58189259": "CerradoToken()", +"58189e03": "processExits()", +"5819dde2": "getNumbersFromBytes(bytes3)", +"581a3aea": "ActiveSCO(bool,uint256)", +"581a81c1": "setMinHouse(uint256)", +"581aa8a3": "SRVSKCOIN()", +"581bdd23": "createCampaignAndChannels(address,uint256,string,address[],address[],address[],uint256[],address,string,bytes,uint32[])", +"581c1f47": "isFreeze(address,uint256)", +"581c281c": "getVotingStatus()", +"581c5ae6": "invest(address,uint8)", +"581c71d0": "ifClaimedNowPublic()", +"581ca8bb": "adjustCash(address,int160,string)", +"581d1015": "publicsalesTokenPriceInWei()", +"581d1d04": "devTokensIco3()", +"581d416a": "Paid(uint256)", +"581e69de": "pauseRoundD()", +"581f1125": "returnUnsoldSafeSmall()", +"581f3c50": "createAndOpen(address,address)", +"581fc2ad": "getNextReleaseTimeOf(address,address)", +"581ff6e2": "VerifyPublishedResults(uint16)", +"5820c9ae": "round4()", +"5820dce5": "abbuchen(uint256)", +"5821c831": "AcceleratorStart()", +"58226a76": "isInTime()", +"58229d91": "MasToken()", +"58240d5f": "listPrycto4()", +"582420bb": "calculateMatchPrice_(address[14],uint256[14],uint8[6],bytes,bytes,bytes,bytes,bytes,bytes)", +"582518ac": "updateclaimableTokens(address,uint16)", +"582527f8": "setNewData(uint256)", +"5825884f": "setOwner2(address)", +"5826344b": "frozenAccount()", +"582681d2": "compareDateTimesForContract(uint256,uint256)", +"582747ba": "PLCCToken()", +"58275869": "ETHReceived()", +"5827834a": "DecenturionToken(uint256)", +"5827b250": "completeInitialization()", +"5827c0c8": "SSE()", +"5828fa47": "ThawTokenTransfers(address,bool)", +"58292a3d": "emission(uint256)", +"58294575": "updateComplianceAddress(address)", +"5829d310": "entries(int256)", +"582a466a": "burnGasAndFree(address,uint256,address,address[],bytes)", +"582a5c83": "HWGCToken()", +"582ab0b4": "setup(uint256,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"582b4019": "updateCheckHourly(bool)", +"582b6add": "isDataSourceCallback()", +"582b6fe4": "crowdsaleUncappedTime()", +"582bd287": "snapshotDelegators(uint256,address)", +"582ca57b": "get_associations()", +"582cca06": "SafeCoin()", +"582d14f8": "updateHpbNodeWithString(address,string,string)", +"582d2d32": "removeFreeRoom()", +"582d6033": "listDda(address,uint256,uint256)", +"582d9008": "willyWantTalkToken()", +"582ee26e": "PendingFees(address)", +"582f5009": "calculateBonusToken(uint256)", +"58306772": "getAmountOfEtherSell(uint256)", +"5830da9c": "Escrow(address,uint256,uint256,bool,address)", +"5830f2ea": "subPrivateSale(uint256)", +"58317685": "getBuy(uint256,address,address)", +"5831e95d": "_burn(address,address,uint256,bytes,bytes)", +"58339a40": "CryptoScalper()", +"58341922": "totalSupplyLocked()", +"5835ac93": "extract(uint256,uint256,uint256)", +"5836746d": "deployStep()", +"58371ccd": "endSaleTime()", +"5837bb11": "ALLOC_FOUNDER()", +"5837e083": "move_history(uint256)", +"58392aaa": "setSibling(address)", +"583ae991": "BitCharityToken()", +"583b4715": "createTitty(uint256,string,uint256,address,string)", +"583ba757": "getrestrictTime(address)", +"583be14e": "isCampaignRegistered(uint256)", +"583c4be9": "PurchaseUnlocked()", +"583d175f": "clientClaim(address,uint64)", +"583d5435": "queryTokensOf(address)", +"583dbacc": "specialKitties(uint256)", +"583dbc09": "updateBonuses(address,bool)", +"583ed080": "End7()", +"583f0ae6": "purchaseMembership(address,address)", +"583f18ff": "totalRemainingTokens()", +"583fe287": "ReussitexCoin()", +"584084d9": "_setString(bytes32,string)", +"5840b0f8": "getPixelData(uint256)", +"5840f4ec": "applyRate(uint256,uint256)", +"58410259": "onBuy(bytes32,uint256,address,uint256,uint256,address,uint256,uint256,address,address,uint256,uint256)", +"58413194": "lmda()", +"5841b9bf": "kingCost()", +"58428322": "grantAccessDeploy(address)", +"58439b9f": "EtheraffleLOTPromo(address,address)", +"5843b811": "_setPendingUpgradeabilityOwner(address)", +"58441a58": "minimumBid(string)", +"58451f97": "totalAccounts()", +"58453569": "initializeSpendLimit(uint256)", +"58453fef": "updateBalance(uint256,uint256)", +"5845d13c": "NamdoToken()", +"58462b36": "contBuy(address,uint256)", +"58463e11": "FeedBackedCall()", +"58469cd1": "generateStakeForDelegationSchemaHash(address,uint256,bytes32,bytes32,uint256[],bytes32,uint256)", +"58476a7a": "mintForSale(address,uint256)", +"58480d41": "setVotesPerProposal(uint256)", +"584855f0": "shopShoes()", +"58487bee": "request(uint8,address,bytes4,uint256,bytes32[])", +"5848a7fa": "getOwnerPotatoes(address)", +"58491ad9": "ICNQCrowdsale(uint256,uint256,uint256,address,uint256,address)", +"58491ecb": "companyPeriodsElapsed()", +"5849cf77": "registerDINWithResolver(address,address)", +"5849f66b": "claim_ico()", +"584af2c3": "approveOwnerTransfer(bytes32)", +"584df977": "LimitPerUserEBC()", +"584e492a": "arr(address,uint256)", +"584e86ad": "suggestUrl(bytes32,bytes32)", +"584ed064": "getBattleCardList(address)", +"5851166c": "endOfRound()", +"58516661": "agents()", +"5851bc4f": "FJH()", +"5851f1e2": "trexdevshop()", +"58525fda": "tokenAllocation()", +"5852f5c1": "buildingToUnits(uint256,uint256)", +"58541aba": "jackpotLastPayout()", +"58543fbd": "getRoomIdxByNameElseLargest(string)", +"5855279e": "whitelistAccounts(address[])", +"58553baa": "cycleInfo()", +"5855da3d": "extractAddress(bytes,uint256)", +"5856db43": "isIcoClosed()", +"585789cd": "startPreDistribution(uint256,uint256,address,address,address)", +"5857b86f": "getAuctionByAuctionId(uint64)", +"5858e7d0": "bigBearCoin()", +"5858ef10": "testErrorNonOwnerCantBreach()", +"58593578": "toss(bool)", +"585a8aba": "getCredit(address,address)", +"585a9385": "icoProceeding()", +"585aa91e": "setSpecialDefense(uint256,uint8)", +"585ac3e8": "icoEnded()", +"585b0f05": "BitcoinMax()", +"585b143a": "getVariableReleasableAmount(address)", +"585b7752": "setOraclizeString(string,string,string,string)", +"585bc25b": "weiRaisedDuringRound(uint8)", +"585bc523": "cooAddManager(address)", +"585bf3e4": "totalLux()", +"585c6fc9": "EtherHealth()", +"585ce259": "VitToken()", +"585d2133": "newDeliverable(uint256)", +"585da351": "setUnitAttackMultiplier(address,address,uint256,uint256,bool)", +"585e1af6": "hard_cap()", +"585eb90c": "withDrawAmount(uint256)", +"585f9b7a": "addVoteOption(uint256,string)", +"58613568": "estimateNeumarkReward(uint256)", +"58619076": "OwnerRemoved(address)", +"58620daf": "RegistryAddress()", +"58623642": "minStartDelay()", +"5862fd31": "ethCrowdsale()", +"5863115e": "parseId(uint256)", +"586360ce": "distributedTokens()", +"5864c56c": "numberOfSuccessfulPings()", +"5865c60c": "getOperator(address)", +"58669d6d": "updateMinimal(uint256)", +"586a2d02": "Anastomos()", +"586a2d79": "_decreaseBalance(address,uint256)", +"586a4be5": "Bitsurge()", +"586a52e0": "GenerationSupply()", +"586a69fa": "getMaximumStackCheck()", +"586a94ba": "MassivelyMultiplayerOnlineGameToken()", +"586ab7a9": "MYSYMBOL()", +"586ac27d": "ProofOfPassiveDividends()", +"586b1c8f": "DetherCore()", +"586ccfa7": "deathData_f11()", +"586cf767": "MintedEthCappedCrowdsale(address,address,uint256,uint256,uint256,uint256)", +"586cf845": "setTierEndTime()", +"586dd1d5": "CCXTokenERC20()", +"586e416e": "updateMaxWei(uint256)", +"586e8283": "deliveredEth()", +"586facb4": "adminSetMarket(address,uint8,uint256)", +"586fc5b5": "lastMint()", +"58708479": "setWinningChance(uint256)", +"587097ab": "test_FiftySixPercent()", +"58712633": "GetCommission()", +"587181d1": "getVaultLock(address)", +"5872282d": "icoReferralBonusInPercentage()", +"5872fe45": "getAccountAddress(address)", +"5873533d": "playGame(uint256)", +"587378a4": "updateQualifiedPartnerCapAmount(address,uint256)", +"5873cbe6": "setFile(string,string,uint256,address)", +"587419d5": "depositStartTime()", +"58750784": "getUniqueKey(string,string,uint32)", +"5875caaf": "objectKnife()", +"587631eb": "PlayX5()", +"587695cd": "tokenGiveAway()", +"58769981": "transferAdminship1(address)", +"5876d2ef": "rwGas()", +"58793050": "Setup()", +"58793ad4": "submitHKGProposal(uint256,string)", +"5879f7ad": "myDroneList(address,uint256)", +"587ac47c": "sendFromAdvisorWallet(address,uint256)", +"587af98d": "GetConfirmRound(bytes32,uint8)", +"587b060e": "_setUpgradeContract(address,address)", +"587c2b8e": "setContributionDates(uint64,uint64)", +"587cde1e": "delegates(address)", +"587d044f": "saveHistory(address,address,uint256,uint32)", +"587d6a20": "ICOactive()", +"587ed791": "getPoolPayPeriodInBlocks(uint256)", +"587f2e50": "putInStud(uint256,uint256,uint256)", +"587fa8dc": "closeHouse()", +"587fae93": "release(uint8,address)", +"58802e24": "BancarCrowdsale()", +"5880b7da": "CAAction(address)", +"588100d4": "DIP_TGE()", +"588198c4": "getBonusByETH(uint256)", +"5882128d": "tradeActive()", +"588268a8": "tokensForCreators()", +"588378c8": "fillGoldSellOrder(address,uint256,uint256)", +"58838594": "anacoContract()", +"5884afe1": "setBetLimit(uint256,uint256)", +"5884f2f5": "GeneralUpdate(uint256,uint256,uint256)", +"5885c626": "allocateTokensToMany(address[],uint256[])", +"58864d04": "Clost(uint256,string,string,uint256)", +"588666e2": "updatePriceManualy(uint256)", +"5886c51e": "setnotice(string,string)", +"58883688": "setAvailableToken()", +"58888b40": "_calculateUnlockedTokens(uint256,uint256,uint256,uint8,uint256)", +"58892f63": "setCrowdsaleStartDate(uint256)", +"588a9db5": "CoreBuyShare(address,address,uint32,uint256,uint32,address,address)", +"588b1578": "contractEth()", +"588b5c7b": "approveExchange(address,address)", +"588bf28b": "addBonusForOneHolder(address,uint256)", +"588bf923": "removeEmailHash(uint256)", +"588c2a6d": "WithdrawReserve(address)", +"588cbbea": "changeSettings(uint64,uint8,uint8,uint8,uint8)", +"588cff4c": "emitPublicCapabilityRemoved(address,bytes4)", +"588d376f": "BoleroToken()", +"588d6a17": "findSemiRandomWinner(uint16)", +"588dadc6": "contestChampion(uint256)", +"588e6b83": "giveTurnToPlay(address)", +"588e730c": "numOfMythical()", +"588ec17f": "minContributionInUsdCents()", +"588ee29b": "debug()", +"588f27e6": "CloudCredit()", +"588f7e12": "lotteryRatio()", +"588f85b3": "IHPM()", +"588f9acc": "toggle(address)", +"58902cc6": "sendFromGftWallet(address,uint256)", +"5891215c": "getAllGas()", +"58919155": "DOGE()", +"5891c8aa": "removeExceptAddress(address,address)", +"58924b81": "getClaim(address,string)", +"589316f6": "level_2_amount()", +"58931f7a": "buyWhiteByName(bytes32)", +"58932f50": "btcTokenBoughtAddress()", +"58933dbc": "totalTokensRemind()", +"5893d481": "rndTmEth_(uint256,uint256)", +"58950108": "BucksCoin()", +"58958be3": "_getTxDataBlockNumber(address,bytes32)", +"58963c85": "setBilateral(bytes32,bool,bool)", +"5896521b": "getCurrentTotalFunders()", +"5896749a": "getAssetRate(address)", +"5896f37f": "getDistritos()", +"5897164a": "ADDR_MAYA_ORG()", +"589737fb": "getOwnPartnerMessage(uint256)", +"5897a1c6": "getValueToInvest()", +"5897a5a0": "setupInitialState()", +"5897e3e4": "splitTheBet(address)", +"5898f402": "compaundIntrest(uint256,bytes5,uint256,uint256)", +"58990372": "changeColorBlue()", +"589a1743": "creatorOf(uint256)", +"589b88bd": "pauseRoundC()", +"589c6beb": "_deleteDefender(uint32,uint8)", +"589d7a3c": "setupViaAuthority(string,string,string,string,address,uint8,bytes32,bytes32,uint256)", +"589dca45": "_emitEmission(bytes32,address,uint256)", +"589e5edd": "InvestorsQty()", +"589e74be": "giveSticker(address,uint256)", +"589f30c7": "FAPFundDeposit5()", +"589fd72a": "vehicleDates()", +"58a0bcdd": "checkPayout(address,uint32)", +"58a122a2": "cancelRequestUnpause()", +"58a191c3": "changeFactorySetupFee(uint256)", +"58a1cabf": "lastPayoutTime()", +"58a2982a": "_deleteSmallestBidder()", +"58a356d0": "sendMoney(uint32)", +"58a383fd": "jsonArrayLength(string,string)", +"58a3d1a1": "getUnclaimedTokenAmount(address,address)", +"58a4903f": "cards()", +"58a50ce8": "setEtherAddress(address)", +"58a53130": "getABaddress(uint256)", +"58a5b0f6": "tournamentStartTime()", +"58a687ec": "finalizeSale()", +"58a70a15": "acceptReturning(uint256)", +"58a74333": "singularDTVFund()", +"58a79319": "GetWildCardOwner(uint256)", +"58a87b69": "withdrawTokenFromCrowdsale(address)", +"58a94e73": "DigitalValleyToken()", +"58aa0f1b": "numOfRare()", +"58aabdf8": "MaxMinersXblock()", +"58aaf48a": "gasForShuffle()", +"58ab010d": "buyParticipationTokens(uint256)", +"58aba00f": "updateManager(address)", +"58acf31b": "findJob(uint256)", +"58ad4673": "LEXTokensContract()", +"58adc9ae": "transferToWalletAfterHalt()", +"58ae6242": "AOIS()", +"58ae8bcf": "voteInMasterKey(address)", +"58af7794": "create_payment(uint256,uint256,bytes32,bytes32,uint256,address,bytes32)", +"58b092d7": "addRaiseTapProposal(string,uint256)", +"58b0a2aa": "setPriorityPassContract(address)", +"58b1effb": "bidOfBidder(address,uint256)", +"58b1f29c": "refundBounty(uint256)", +"58b255ea": "fechVoteNumForCandidate(address)", +"58b435fb": "MeritICO()", +"58b4370b": "round(int256)", +"58b4a3c4": "testInitalBalance()", +"58b4c035": "createNewGoBoard(uint256)", +"58b5525d": "depositCharge()", +"58b5e775": "batchAllocateExp(address[],uint256[],uint256[])", +"58b8dc61": "promoCreationPlayerCount()", +"58b92d57": "UserAuthorized(address,address)", +"58b9dcef": "registerVotingPrepareFailure()", +"58bad3eb": "setEarlyParticipantWhitelist(address,bool)", +"58bafdbc": "contribute(address,uint256,uint256,bytes)", +"58bb7d70": "checkEthSold()", +"58bc3456": "addtokensWL(address,uint256,uint256)", +"58bcdb5e": "collectCredits(address)", +"58be0830": "_refSystem(address)", +"58be98dd": "migrateBlockjack()", +"58beec9f": "summBounty()", +"58bf7067": "setBlockedAccount(address,bool)", +"58c0bde0": "feeNewThread()", +"58c16557": "disableTypeById(uint256,uint256)", +"58c1c328": "_validateId(bytes32)", +"58c23767": "setCXLExchangeRate(uint256)", +"58c264f6": "preico_holdersAmountInvestWithBonus()", +"58c31603": "loanCollectionNotification(uint256)", +"58c3b0eb": "updateTokensApproved()", +"58c3b870": "memo()", +"58c3c193": "newBatch(bytes32)", +"58c56f1e": "C20Token()", +"58c60d5e": "gracePeriodCap()", +"58c62b12": "SingularDTVWorkshopFee()", +"58c6bce8": "getCustomBuyerForIndex(address,uint256)", +"58c6f08b": "takeTokensBack()", +"58c721ce": "majorEvents(uint256)", +"58c75136": "currentPremiumSale()", +"58c757ba": "associateWithSig(bytes32,bytes32,address,uint256,uint256,bytes32,bytes32,uint8)", +"58c8c0a7": "getVoteNumberList()", +"58c8ca0c": "_clearInventory(uint256)", +"58c9e484": "buyPoints(uint256)", +"58ca5419": "CheckBest(uint256,address)", +"58cb7323": "MainnetETCSurvey()", +"58cc13f3": "asserts(bool)", +"58cda0ab": "requestData(address,address,uint256)", +"58cdddf9": "getRoundDifficultyBlock(uint32)", +"58ce4b48": "setFundingStartTime(uint256,uint256)", +"58cea888": "getWinOutcome(bytes16)", +"58cf7c71": "unfreezePrice()", +"58cf9570": "transferFeeRate(address)", +"58d0390b": "getCurrentICORoundInfo()", +"58d10aae": "BlackJack()", +"58d162da": "potSplit_()", +"58d168b7": "generatePermutationKey(uint8[4])", +"58d1aebd": "claim(string,string,string,bytes32,bytes)", +"58d213ae": "InToken()", +"58d25b93": "LogSendFunds(address,uint8,uint256)", +"58d2ab45": "numberOfPixels()", +"58d37dc5": "lastMintingAmount()", +"58d38231": "broughtSprites(uint256)", +"58d3b2c8": "babyBornEndVoting(string,uint256)", +"58d3b617": "Notifier(string)", +"58d3ce8a": "thirdExchangeRate()", +"58d40f7e": "existsUserByEmail(bytes32)", +"58d4e051": "YSS(uint256,string,string,uint8,address)", +"58d63255": "GandhiJi()", +"58d6a99e": "CTChinaCoin()", +"58d75180": "ECToken()", +"58d782be": "getLotteryDetails(uint16)", +"58d7bf80": "reserveRate()", +"58d80a8c": "doSetSettings(uint64,uint64,uint256)", +"58d8652e": "addIssue(string)", +"58d8f76f": "getPlayerBet(uint256,uint256,address)", +"58d90108": "COLOR_RED()", +"58d9e758": "DeleteUserByID(uint32)", +"58d9f95d": "VIETNAMTOKENTEST()", +"58d9fa04": "addUser(uint256,address)", +"58da3ca9": "jdecompose(uint256,uint256,uint256)", +"58da9bbc": "getAssetPackData(uint256)", +"58db3258": "removeFromPrivateWhitelist(address)", +"58dc03f9": "TigerCashToken()", +"58dc2a8b": "RESEARCH_AND_DEVELOPMENT_WALLET()", +"58dc8807": "updateMintAuthority(address,int256)", +"58dd0eb1": "propose(address,string,string,string,string,uint256,uint256,uint256,uint256)", +"58dd6f23": "setTokenTransfer(bool)", +"58df0383": "burnFinish()", +"58df8ed8": "adminGetEnabled()", +"58dfb058": "LNCH()", +"58e039bd": "listContractByModTextAndCttName(string,string,uint256,uint256)", +"58e0a9d7": "YanToken()", +"58e1c174": "RTI()", +"58e29e17": "initiateProof()", +"58e2cd76": "watch(address)", +"58e3815c": "BASalesPrice()", +"58e3e914": "devuelveNombreApp(address)", +"58e46275": "calculateTheEndPrice(uint256)", +"58e55365": "marketingBalance()", +"58e59c32": "get_entry(uint256,uint256,uint256)", +"58e5d5a5": "PunkBought(uint256,uint256,address,address)", +"58e61e12": "contribute(uint256[],bool,uint256)", +"58e66522": "CoolTourToken()", +"58e69c5a": "hashimoto(bytes32,bytes8,uint256,uint256[],uint256[],uint256,uint256)", +"58e71b15": "Organization()", +"58e756b6": "NewQ(string,bytes32)", +"58e77a92": "setSelfPretorian(address,address,address)", +"58e85e03": "LogTokensBought(address,uint256)", +"58e868c9": "DisableMember(address)", +"58e879f3": "nextThaw()", +"58e8922b": "payImportTax(address,uint256)", +"58e92fb0": "setFreezeForPEInvestors(uint256,address,uint256)", +"58e9a706": "checkLargeContributionsLock(address,address,uint256)", +"58e9b208": "Controlled()", +"58ea80e5": "setThroneCreationPrice(uint256)", +"58eae004": "awardBuyers()", +"58eafc37": "addVirusDefence(uint256)", +"58ebde43": "generic_holder()", +"58ec63bc": "setAccountMilestone(address,uint8)", +"58ecaa45": "StgThreebonusEnds()", +"58ed766d": "priceETHUSD()", +"58eda67a": "get_Holders(uint256)", +"58edaa9c": "getController(uint256)", +"58edbc84": "mkDelegation(bytes32,bytes32,uint256)", +"58ef82a0": "setMilFold(address)", +"58efa06f": "bytesToBytes5(bytes)", +"58efe3cd": "changeLink(bytes,address)", +"58f0cbc7": "changeTiming(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"58f10528": "eggExists(uint256)", +"58f11566": "ReserveAccount()", +"58f1490f": "addTransaction(address,uint256,bytes,bytes,uint256)", +"58f24f3d": "transferFromGate()", +"58f33e98": "isTaker(address)", +"58f35f10": "createT513(uint256,address)", +"58f3a115": "tokenDistribution(address[])", +"58f3da21": "adminGetContractBalance()", +"58f4996f": "verifyIncluded(bytes,bytes32,bytes32)", +"58f4be1e": "getIntention(uint256)", +"58f4f160": "Halo3D()", +"58f5382e": "challenge(string)", +"58f65330": "_checkPixelUnderLeft(uint256)", +"58f693de": "tokenForSP()", +"58f7f6d2": "BNB()", +"58f816bf": "redeployProduct(bytes32)", +"58f8e99e": "Jackypot()", +"58f94f13": "CarParkCoin()", +"58fa67f9": "calculateMintTotal(uint256,uint256,int256)", +"58fa812b": "TRANSFERS_PER_TRANSACTION()", +"58fb9f36": "_addBonus(uint256)", +"58fc0151": "getRequired(address,uint256,bool,uint256)", +"58fd6aec": "register(bytes32,string,string)", +"58fd6fe2": "getBonusMultiplier(uint256)", +"58fd955c": "rateETHUSD()", +"58fd989b": "getLockedStructPulseLockHash(address,address,uint256)", +"58fe54a1": "GetBoilerInfo(address,uint256)", +"58fe8847": "BIRC()", +"58feb4a3": "earlyCommunityAddress()", +"58ff5111": "buyTokenForAddress(address)", +"58ff7613": "RxEALSaleContractExtended()", +"5900477a": "settleCancel(bytes,bytes)", +"59004b28": "checkIfExists(uint256,uint256[],uint256)", +"5900a09c": "addFunder(address,address,uint256,uint256)", +"59011400": "RewardDAO(address,address,address)", +"59015ed5": "getAccountModifiers()", +"59016c79": "getContent()", +"59032232": "setPatch(uint256,uint8,uint8)", +"59032614": "FipsTransfer(bytes20,address,address)", +"5903eff2": "root_10(uint256)", +"5903f01b": "giveEthBankRollAddress()", +"5904941b": "CoinealToken()", +"590528a9": "sellShares(uint256,uint8,uint256,uint256)", +"590589fd": "WithdrawToMember(address,uint256)", +"5905b171": "getNextAssignedRequest(uint256)", +"5905d314": "Added(bytes32)", +"5905e1c5": "askPrice(address)", +"590731b7": "secondarySaleCut()", +"590791f2": "getOwnerBalance()", +"59084ea9": "setWhitelistedWallet(address,bool)", +"5908984b": "foreignPurchase(address,uint256)", +"59092c29": "XtremCoin()", +"5909e897": "buyRate(uint256,uint256)", +"590a1c78": "LogBidFailed(address,uint256,uint256)", +"590a4595": "createNewChain(bytes)", +"590ba734": "getUint(int256)", +"590d431a": "wavesId()", +"590d5a67": "multipleTokenDistribute(uint256)", +"590daaec": "setTokenDeskProxy(address)", +"590def78": "IndonesiaRupiah()", +"590e1ae3": "refund()", +"590efa59": "setContrAddr(address,address)", +"590efee1": "isExec()", +"590f9ece": "getShow(uint256)", +"590fcc5b": "debugVal2()", +"591016bc": "generateId(bytes32,address)", +"591090ee": "ELIXAddressSet()", +"5910a18b": "addEntry(bytes32)", +"5910ce39": "_mint(string,string,uint8,uint256,bool,uint256)", +"591108a5": "setIcoStart(uint256)", +"59111d83": "add32(uint32,uint32)", +"59112e79": "payCow()", +"59117bae": "getRoomID(uint256)", +"59118221": "setTokenData(uint256,bytes32[])", +"59118ff2": "amount4()", +"5911fb9a": "setRate(address,address,uint256)", +"59125397": "indexedDocs(uint256)", +"59137533": "PillowCoin()", +"5913cacc": "unlockBonusDrop(address,uint256)", +"59144baa": "setFundContract(address)", +"591451fe": "setHostingProfitAddress(address)", +"5914589c": "RLC()", +"59151701": "VerifiedUser(bytes32,address)", +"591552da": "currentFee(address)", +"5915589e": "Dataset(address,string,uint256,string)", +"59161e57": "releseToken(address)", +"59167b9d": "setTokenContract(uint256,address,uint8[],bytes32[],bytes32[])", +"59167fcc": "getUserAccountInfo()", +"59169d06": "setBountyTokensPercent(uint256)", +"5916c2c9": "NeuroWire()", +"5916c5fa": "sellEgg(uint256,uint256,uint256,uint16,bool)", +"59179dbd": "createSaleAuction(uint256,uint256,uint256,uint256,uint256,uint256)", +"59187cec": "getEarningAmount()", +"5918bc7f": "addTerms(string,string)", +"5918f00c": "fillOrder(address,address,uint256,address,uint256)", +"5918f348": "hmcAddress()", +"59193981": "token_sale_end_block()", +"59194d0c": "totalEthBalance()", +"59197f51": "ethEt4Rate()", +"59198827": "initiateDocumentVote(string,bytes32)", +"5919896f": "Taracoin()", +"5919978b": "create_safe(address,string,string)", +"591a0d87": "foundersWallet2()", +"591a6ec4": "toBeDistributedFree()", +"591a89b2": "Voted(address,bool,uint256)", +"591b05b1": "domainHtml(bytes32)", +"591b41c6": "Multisend()", +"591beea8": "guardIntervalFinished()", +"591c515f": "append(string,string)", +"591d5236": "getDifference(int256,int256)", +"591d8bd0": "constantFn(uint256)", +"591ead36": "SplitTransfer(address,uint256,uint256)", +"591f36a6": "updatePreICOMaxTokenSupply(uint256)", +"5920375c": "thaw()", +"59208b8a": "userRefundWithoutGuaranteeEther()", +"59214765": "sendBonus(address,uint256)", +"5922b831": "refundPlayers(uint256)", +"592311ed": "freeze(address,address,bool)", +"592341df": "whatsMyJuryNumber(uint256,address)", +"5923c7f9": "maxSaleToken()", +"59242d11": "SmartIndustrialToken()", +"59245ff3": "fundAnswerBounty(bytes32)", +"59249c46": "duper()", +"5924f811": "tier2Reached()", +"592572e2": "getLoanCanceledAmount(bytes32)", +"5925cfe3": "getCCH_edit_7()", +"5926651d": "addBeneficiary(address)", +"592685d5": "getWindowStart(address,address)", +"5926b55a": "setArray(bytes1[],bytes8[],bytes32[],int256[],uint256[],bool[])", +"5926c826": "Mitronex()", +"5926cf13": "setGameId(uint256)", +"59275c84": "minerAddress()", +"59276653": "getTicketCount(address,string)", +"59287ce9": "setPbulicOfferingPrice(uint256,uint256)", +"5928aedc": "setEndStage2(uint256)", +"5928bdc4": "LatiumLocker()", +"5928c7db": "changeDividendWallet(address)", +"5928e80c": "updateNoteTitle(uint64,bytes12)", +"59291e2f": "MinedBlocks()", +"59292ef3": "gasLimitDepositRelay()", +"59296490": "CharityCommonweal(uint256,string,uint8,string)", +"59296e7b": "getCredit()", +"5929b837": "_setRate()", +"592a5f9b": "ValidToken()", +"592a97de": "encodeUInt(uint8,uint256)", +"592af188": "GaonToken()", +"592b5d17": "haltFX()", +"592b700a": "updateRegistrar(address)", +"592b71ab": "isRequestingEscapeTo(uint32,int256,uint32)", +"592bd705": "setowner(address)", +"592c0f09": "onLotteryFinalized(uint32)", +"592c518f": "ADDR_TKG_CHARITY()", +"592d4c7e": "CAD_Omnidollar()", +"592dc0a6": "setAyantDroitEconomique_Compte_2(uint256)", +"592e6f59": "initialise()", +"592ea64f": "LLV_v30_12()", +"592eef5a": "postIdToDonationAmount(address,uint256)", +"592efdab": "presaleWhitelistTokensLimit()", +"59301cb2": "_callRecipient(bytes32,address,address,address,uint256,bytes,bytes,bool)", +"5930a295": "changeBetLimits(uint256,uint256)", +"5931228b": "endTimeDay()", +"59317ea2": "buyImplementation(address,uint64,uint256,uint8,bytes32,bytes32)", +"59318b2c": "unFrozenBalanceByIndex(uint256)", +"59328401": "getPlayerInfo(address)", +"5932c02c": "tradesCount()", +"59330b8e": "hashDetails(uint256,address,uint256,uint8)", +"59354c77": "changeSubcourtJurorFee(uint96,uint256)", +"59355736": "lockedBalanceOf(address)", +"59357045": "getDueTime(uint256)", +"5935fba5": "addContractor(address,uint256)", +"5936259c": "BullsFarmer()", +"59362835": "JPCoin()", +"5936387c": "checkOpposited(uint256,bool)", +"59366245": "bonusInPhase5()", +"5936812b": "changeLockedBalanceManually(address,uint256)", +"5937de14": "STATUS_DEAL_RELEASE()", +"5937e534": "appealSkip()", +"5937e86a": "setTokensQuantity(uint256[],uint248[])", +"5938748e": "changeVotingRules(address,address,uint256,uint256,uint256)", +"59388d78": "decreaseApprovalPreSignedHashing(address,address,uint256,uint256,uint256)", +"59391a67": "earlyResolve(bytes32,uint256,bytes)", +"5939a84e": "isLawyer(address)", +"5939dd31": "setEthartRevenueReward(uint256)", +"5939ee04": "registrationPeriod()", +"593a5bff": "KUISToken()", +"593a6297": "getPlayerLaff(uint256)", +"593aa283": "setMetadata(uint256,string)", +"593af09f": "assertEq20(bytes20,bytes20)", +"593af4f1": "_fYou(address,uint256,string,string)", +"593af56a": "editionType(uint256)", +"593b4530": "proxyMergeMint(uint256,bytes32,address[])", +"593b79fe": "toBytes(address)", +"593be1f8": "_removeAuctionManager(address)", +"593c993c": "presaleWeiContributed()", +"593cca56": "checkExplore(uint256,uint256)", +"593d280d": "KToken()", +"593ea3e7": "VERDICT()", +"593efdf1": "setCurrentPassportLogic(string)", +"593f3a6c": "AllMarkingsProcessed(address,uint256,uint256,uint256)", +"5940f55c": "setEncryptionPublicKey(string)", +"594151e0": "Dice()", +"5941bb80": "transferFromBatch(address[],uint256[])", +"5941d8d4": "RtbSettlementContract(address,address,address,uint256)", +"5941ff52": "impl_yield7Day()", +"59423a7f": "BuySnail(address)", +"59424b78": "approveArtist(address)", +"594337a9": "investorsLength()", +"5944427b": "getRequestResult(uint256)", +"5944b7d9": "setCCH_edit_1(string)", +"594548d5": "newStakesAllowed()", +"5945793d": "getCorrectedTotalBPOfAddress(address,address)", +"5945841b": "ELIXAddress()", +"5945bdc5": "token2GT()", +"59462295": "WhiteWallToken()", +"5946e7eb": "Tier_Rainmaker_Registration()", +"594733c6": "getInvestorId(address,address)", +"594742da": "forecastOfToken(uint256)", +"59475891": "TransferHash(bytes32,bytes32,uint256)", +"59478411": "modifyProductPrice(bytes32,uint256,uint256)", +"5947cc6a": "level_2_percent()", +"5947d616": "updateAskingPrice(uint256,string)", +"59485790": "_emitPricesUpdated(uint256,uint256)", +"5948f733": "getAddressArray(bytes32)", +"5949a8f7": "notifyDeposit(uint256)", +"5949e525": "fundingUnlockFractionInvert()", +"594aa668": "getCourseList(string)", +"594afcff": "tgrContributedAmount()", +"594b18b5": "_transferToLock(address,uint256,string)", +"594bbe8f": "Corolexcoin()", +"594de857": "getDealsCount()", +"594eda64": "getBackend()", +"594ffb4e": "setReferralFee(uint8)", +"5950cb8c": "setCasinoName(uint16,string,string)", +"5950cee4": "checkProviderSupported(address,address)", +"5950d395": "recallPercent()", +"5951317a": "doFinalizeSale()", +"59514593": "addFreezableAddresses(address[])", +"595210ad": "openDispute(string)", +"5952176e": "removeBusinessOwner(address)", +"5953c806": "setSendCost(uint256)", +"5954c8c5": "manualWithdrawEther()", +"5954ee54": "actualPriceInCents()", +"595539cd": "modexp_naive(bytes,uint256,bytes)", +"5956b853": "soldAddresses(address)", +"5957eb17": "PeterToken()", +"5957ee49": "getProjectUsedTokens()", +"5958188d": "MultiSigWalletWithTimeLockExceptRemoveAuthorizedAddress(address[],uint256,uint256,address)", +"5958611e": "finishTime()", +"5958621e": "setRewardWallet(address)", +"595882b3": "mintAll()", +"5958978c": "day_blocks()", +"595a161b": "amountOfZeros(uint256,uint256)", +"595a30f1": "RateChanged(uint256)", +"595a4fc2": "recomputeAccountLastAverageBalance(address)", +"595a69e8": "add_address(address,address)", +"595a7273": "QbaseIssued()", +"595aed65": "_getChild(address,uint256,address,uint256)", +"595b1a3e": "getUsersLength()", +"595b35d1": "NUMBER_OF_COUNTRIES()", +"595c3f61": "FactomTalk()", +"595cb7a3": "changePrice(address,bytes32,uint256)", +"595d0392": "transferHoldFrom(address,address,uint256)", +"595d71a5": "MintFinished(uint256)", +"595da94d": "has_owners(uint256)", +"595dcb68": "BIFAToken()", +"595e1e20": "placeToken()", +"595e615f": "betPool(address)", +"595ecbb3": "Int256(uint256)", +"595ee7a4": "MajListVal()", +"595f0e5e": "test_CuratorRules()", +"595f40d6": "getDevelopersFee()", +"5960b74f": "advisorTimelock()", +"59622aa6": "maxAmountForSalePromotion()", +"5962581e": "isInRoundOneState()", +"59626877": "AiToken(uint256)", +"59627b84": "getReduce(uint256,uint256)", +"5962a941": "totalPurchases()", +"5962ad30": "dkSB(string)", +"59633a1c": "removeBeneficiary(address)", +"59647984": "isValid(address,uint256)", +"5965e7c3": "SimpleCrowdsaleBase(address)", +"59667c24": "withdrawRound(uint256)", +"59679b0f": "_implementation()", +"5967dee8": "transferLOT()", +"5968c2a4": "getOrderTokenAllocationStatus(uint256)", +"596925d6": "expByTable(uint8)", +"596939f5": "addAgent(address,uint256)", +"5969549e": "modifyBeneficiary(bytes32,address)", +"59695754": "setMinimumPayout(uint256)", +"5969c0e1": "resetSignature(bytes32)", +"596a072c": "setOraGasLimit(uint32)", +"596a2735": "DICE_RANGE()", +"596aadaf": "transferFromCrowdsaleToUserAdoptionPool()", +"596b975a": "maxFunding()", +"596bda14": "_set9()", +"596c02fb": "assertEq22(bytes22,bytes22,bytes32)", +"596c0531": "bch()", +"596c49bd": "TimeControlled()", +"596c8976": "close(uint256,uint256)", +"596d6f08": "Blizzard(uint256,string,string)", +"596ea3db": "allowTransferTime()", +"596f3473": "applyToBeAReviewer()", +"596fab6c": "calculateLockAmount(uint256)", +"59704013": "setVar(string,string)", +"5970c40a": "addForecast(bytes32,uint256,uint8)", +"59716eed": "lockedEthBalanceOf(address)", +"59724977": "getwin011050(address,uint256)", +"59727e83": "registryTransfer(address,address,bytes32,uint256)", +"5972e062": "deleteNodeGroup(uint256,uint16)", +"5973016b": "Multiven()", +"59748c98": "plain()", +"5974ec50": "founderTokenUnlockPhase3()", +"59756526": "getJobHash(bytes16,address,address,uint256,uint256)", +"59758ebe": "repayLoan(address,uint256,string)", +"5975ce80": "mintApproveReset(address,address)", +"59761fcb": "test(address[5],uint256[5])", +"59764714": "MyDFSToken()", +"59769073": "totalBalancingTokens()", +"5976ddd0": "getScenarioNamesAndEventStatus(bytes32)", +"59770438": "getToken(address)", +"59780224": "joinGameWithInviterIDForAddress(uint256,address,address)", +"59790701": "updateFeeSchedule(uint256,uint256,uint256)", +"59793b3a": "derivativeTokens(uint256)", +"597c255f": "receiveChild(address,uint256,address,uint256)", +"597c69cc": "saveToColdWallet(uint256)", +"597cae8d": "getFeeWindowBurnAmountValue()", +"597d4601": "crowdsaleFinalized()", +"597d5c6e": "BiSaiToken(address,uint256)", +"597d6640": "getFreeFairy()", +"597df768": "buyPixelBlocks(uint256[],uint256[],uint256[],bytes32[])", +"597dfbaf": "confirmNode(uint256)", +"597e1fb5": "closed()", +"597ea5cc": "getUint8FromByte32(int8,bytes32,uint8)", +"597efd85": "UblastiToken(uint256,string,string)", +"597f7c35": "transferTechSupport(address,address)", +"597fef79": "funderBalance_()", +"59802e15": "makeBonus(address[],uint256[])", +"598052a3": "winPooling()", +"598077b9": "ownerPart()", +"5980d0d7": "_crowdSaleSupply()", +"5980e72d": "getSeedPercentageForGameId(uint256)", +"59810024": "VICETOKEN_ICO_IS_A_SCAM()", +"59813a0e": "allowToken(address,address,uint256,bool)", +"5981f187": "bookingBalanceOf(address,address)", +"5982688f": "revenueShareList(address)", +"59828c99": "FLIPPINESSROUNDBONUS()", +"5982a30f": "setFriendsFingersRateForCrowdsale(address,uint256)", +"5982a6bb": "DiipCoin()", +"59830bf4": "LogBidCompleted(bytes32,bytes32,bytes32)", +"5983ae4e": "hasher(address,bytes32,uint256)", +"59841fe9": "newRun(bytes32,address,string)", +"59849d30": "maxCreatorWithdraw()", +"5984d7ad": "buyHeart(address)", +"59852686": "transferEth()", +"5985ac40": "affiliateNetwork()", +"598647f8": "bid(uint256,uint256)", +"59869576": "TestERC20Token(string,string,uint8)", +"5986ce23": "setdteamVaultAddr1(address)", +"5986dbe4": "ccUserCount()", +"5987e370": "canJoin(uint256)", +"5987f859": "setInputs(string,string,string)", +"5988899c": "estimateDaiSaleProceeds(uint256)", +"59890fd2": "mod_product(uint256,uint256,string,string,string,string,string)", +"5989c283": "createChannelERC20(address,uint192)", +"598aa1fc": "checkEndorsement(address,uint256,address)", +"598ab2c9": "supplyRest()", +"598abc9c": "getListTeam(uint256)", +"598ac8f2": "permille(uint256)", +"598adef6": "addDepositor()", +"598af9e7": "allowance(address,address,uint256)", +"598b771d": "IOVContract()", +"598d34b7": "distributeBTR(address[])", +"598d772a": "changeEtherVault(address)", +"598db132": "setProviderIsForRent(uint256,bool)", +"598e3183": "newToken(string,string,uint256,address,uint256)", +"598e728a": "TIXIToken()", +"598e9eeb": "transferir(uint256,address)", +"598f512b": "Token(uint256,string,uint8,string,bool)", +"598f6dec": "reserveTimeLock()", +"5990e665": "NetworkSocietyToken()", +"59912df1": "totalTokensDestroyed()", +"59915fd3": "CheckRefundIsFair()", +"5991c0dd": "TSTEST3()", +"5991db0f": "contains(uint8[],uint8)", +"5991faf5": "contributors_countdownDate(address)", +"59923274": "sendFromBountyWallet(address,uint256)", +"59927044": "teamWallet()", +"5992f2a1": "_createVoter(string)", +"599312ec": "rescueCatHashCheck(bytes32)", +"599362d0": "_setBackgroundValue15(uint256)", +"59939e21": "getApprove(uint8)", +"599466fe": "abortCrowdfund()", +"5994d984": "TRUE()", +"59953744": "createVestingContract()", +"5996228e": "upgradeResistance(uint256)", +"599651f3": "setStartAuctionFee(uint256)", +"59966ae1": "allowClaimer(address[])", +"5996769e": "_getDefaultOperators(bool)", +"59970a08": "OneKeyToken(uint256,string,uint8,string)", +"59974e38": "distributeRewards(uint256)", +"5997ed4c": "DevFee()", +"59988dce": "newQuestioner(address)", +"5998e641": "getStrategyTokenByIndex(uint256,uint256)", +"5999917c": "get_cross_chain_nonce()", +"5999d385": "walletICO()", +"599b3e21": "buytokens2()", +"599b6808": "balanceList(uint256)", +"599c8761": "decodeParamsList(uint256)", +"599db6bd": "unsowed(address)", +"599dc6be": "setItemStoppedStatus(bool)", +"599e2364": "tokenItems(uint256)", +"599efa6b": "refundEscrow(address,uint256)", +"59a02589": "ico_PRICE()", +"59a02652": "miningWarContractAddress()", +"59a0b995": "AiraEtherFunds(address,string,string)", +"59a0e583": "lastBlock_v9()", +"59a131e2": "CrankysLottery()", +"59a23200": "authorizeTransaction(uint256,address)", +"59a29c6f": "no_of_tokens()", +"59a2c86f": "requestPayout(uint256,address,address)", +"59a3e577": "createClaim(address[],uint256,address)", +"59a4669f": "increaseJackpot(string)", +"59a536b0": "presaleWei()", +"59a547b0": "recordCommission(uint256)", +"59a58647": "setMaxCards(uint256)", +"59a591be": "setCrowdsaleTimes(uint256,uint256,uint256)", +"59a5f12d": "player2()", +"59a69426": "setStatuses(address)", +"59a765f9": "sendInvoice(string,string,string,string)", +"59a78c1a": "deathData_v8()", +"59a7b3fe": "hourlyRate()", +"59a7f754": "acquireWildcard(uint16)", +"59a80f0f": "setCurs(uint256)", +"59a83074": "set_participant_num_of_pro_rata_tokens_alloted(address,uint256)", +"59a87bc1": "buy(uint256,uint256,address)", +"59a8b6a3": "OptaToken()", +"59a941a6": "setApp(string,string,string,uint256)", +"59a9a63f": "isVulnerable(uint64,int8)", +"59a9a980": "isCosd(string)", +"59aa80b8": "getTransfer(string,uint256)", +"59aaa456": "tryAltOracles(bytes32,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"59aaaf86": "changeBlocPerEth(uint256)", +"59ab0306": "BuyTickets(uint256)", +"59ab0dd1": "JACKPOT_TOKENS_PERCENT()", +"59ac5b32": "createProject2()", +"59ac5c6d": "_shift(uint8)", +"59ac70ae": "totalTimeRange()", +"59acb42c": "createdAtBlock()", +"59acbcb1": "crownTransfer(address,uint256)", +"59adb2df": "returnUint256(uint256)", +"59adda9b": "checkOwnerFailedToSetTimeOnMeeting()", +"59ae2073": "GameNeedsTick(uint256,address,uint256)", +"59ae340e": "resumeMinting()", +"59ae6e34": "placeImage(uint8,uint8,uint8,uint8,string,string,string)", +"59aef196": "pauseCutoffTime()", +"59af143d": "beBanker()", +"59b09b25": "makeCount()", +"59b0a174": "transferLockUntil(address)", +"59b0d931": "removeBlockList(address)", +"59b112d8": "getServicesForApplication(address)", +"59b119dc": "ComeCoin()", +"59b11d6c": "setBetclose(bool)", +"59b17b43": "getTellerBalance(address)", +"59b25720": "fillUpTo(address[5][],uint256[6][],uint256,bool,uint8[],bytes32[],bytes32[])", +"59b2da20": "Raffled(uint256,address,uint256)", +"59b350fb": "time_of_token_swap_start()", +"59b36e3e": "partnerSaleWei(address)", +"59b373f2": "getExistsStatus(uint256)", +"59b4993c": "userAddressCheck(bytes32)", +"59b4ee89": "addVpf(bytes32,uint256,uint256,uint256,string,uint256,uint256[])", +"59b51bd1": "approveCertification()", +"59b563b5": "addRobot(address)", +"59b56a59": "HYIPToken(address,string,string,uint256,uint256)", +"59b58dba": "createCloneToken(address,uint256,string,string)", +"59b62658": "AddFishByToken(address,uint256)", +"59b6a0c9": "maxCapacity()", +"59b6f377": "transferFromContract(address,uint256,uint256)", +"59b79610": "sendUnsoldTDETokensToPlatform()", +"59b8d74e": "ACasadiAmiciToken()", +"59b910d6": "setStorageAddress(address)", +"59b9510a": "isAddressAllowedInPresale(address)", +"59b95f5a": "buyBlocks(uint8,uint8,uint8,uint8)", +"59b9a192": "buildToken(uint192,uint192,uint160,uint32)", +"59ba1dd5": "_fulfillPreapprovedPayment(address,address,uint256,address)", +"59ba2628": "transferCampaignCreator(address)", +"59ba59f1": "ETHFundDeposit()", +"59badbec": "CheckPhException(bytes32,uint32)", +"59baef40": "setNewController(address)", +"59bb6b5f": "TretanToken()", +"59bb7867": "setTournamentEntranceFeeCut(uint256)", +"59bc3d47": "Agreement()", +"59be5e45": "getTotalSoldTokens()", +"59be7e99": "getDonationAmount()", +"59be9cc0": "devTokensHolder()", +"59bed9ab": "Transacted(address,address,bytes32,address,uint256,bytes)", +"59befd58": "releaseTime2()", +"59bf1abe": "getBlackListStatus(address)", +"59bf5d39": "getReserve()", +"59bf77df": "confirmationCount(bytes32)", +"59bfd388": "setupPeriodForSecondStep(uint256,uint256)", +"59c13403": "FEE_MIN()", +"59c140be": "insertBonus(uint8,uint256,uint256)", +"59c14cf1": "mastery(address)", +"59c19cee": "batchWithdraw(bytes32[])", +"59c21fd8": "initDepth()", +"59c27917": "GenChipLevel_Extra(uint256,uint256,uint256)", +"59c281da": "openFirstRound(uint256,bytes32)", +"59c2aad0": "unitsToSell()", +"59c2af55": "StagedCrowdsale()", +"59c2b584": "reserve_fund()", +"59c2e1ef": "changeEthDefaultBackRate(uint8)", +"59c2edee": "CrowdsaleContribution(address,uint256,uint256)", +"59c33f94": "PriceUpdate(uint256,address)", +"59c39094": "withdrawDate()", +"59c3f3e0": "setPoolContract(address)", +"59c3f7f0": "createWallets(uint256)", +"59c42f75": "unreleasedCount()", +"59c44539": "GotecoinToken()", +"59c4e612": "icoSoftcap()", +"59c55429": "refundBond(uint256)", +"59c634b0": "getContributorAmount()", +"59c656df": "allowRefunds()", +"59c77133": "createNewHodl(uint256)", +"59c7a893": "participantsOf(uint32)", +"59c87d70": "request(bytes32)", +"59c88347": "isEmitting()", +"59c8969e": "withdraw(address,uint256,bytes32[],uint256[],bytes32[],uint256)", +"59c8bf9c": "OrpheusMarinaBangkok()", +"59c8d647": "buy(bytes32,bytes32)", +"59c9e118": "buyAndTransfer(address,address,uint8)", +"59cbf125": "GetETH(address,uint256)", +"59cc334a": "getItem(uint256,uint256)", +"59cc721c": "BONUS_TIER1()", +"59ce0a8f": "RuletkaIo()", +"59ce0bb8": "_saveParams(uint256[])", +"59ceb36f": "last_demurrageable_balance()", +"59cf3173": "Reclaim(uint256)", +"59cf901a": "preIcoTokensDistributed()", +"59cfaf6e": "gameWithdraw(uint256)", +"59d1d43c": "text(bytes32,string)", +"59d20b55": "committedValidators(uint256)", +"59d213fe": "contributePreSale()", +"59d27be8": "endEthGetToken()", +"59d2af39": "testFooSend()", +"59d313de": "MatchResetDeadline(uint256,uint256)", +"59d33d73": "bountyReserveTokens()", +"59d3ce47": "Activate()", +"59d3d57e": "totalUserLost()", +"59d3d632": "verifierAllocation()", +"59d3dad9": "miscNotLocked()", +"59d4447a": "MingToken()", +"59d52e2b": "XmonetaSale()", +"59d5335b": "refPercent()", +"59d55194": "getPet(uint256)", +"59d5d02a": "transferFee(address,address,uint256)", +"59d5dc11": "PhardusNetwork()", +"59d667a5": "bid(address,uint256)", +"59d6b35b": "lastProof()", +"59d7d46f": "doInvest(address,uint256,address)", +"59d89175": "setSellCommissionBps(uint256)", +"59d90c19": "addLockedAmount(uint256)", +"59d96db5": "terminate(uint256,string)", +"59d998e4": "transferHashOwnership(uint256,address)", +"59d9b2b7": "getTokenOwnership()", +"59dac714": "hashTo256(bytes)", +"59db5bac": "VisitCount()", +"59db9eb0": "deallocate(address,uint256)", +"59dc6d5c": "setDollarBalance(address,int160)", +"59dc735c": "getClient()", +"59dd35da": "ICOPrice()", +"59dd7ad4": "batchTransferFroms(address,address[],uint256[])", +"59dd8f34": "NRB_Tokens()", +"59dfdec8": "totalPlayCount()", +"59e026f7": "internalTransfer(address,address,uint256)", +"59e02dd7": "peek()", +"59e05c5f": "delay_pool_drain_block(uint256)", +"59e08fe1": "isSaleOver()", +"59e09fec": "getLockedAmount_dakehus(address)", +"59e0b91a": "LMOSupply()", +"59e0cf23": "setOraclize(address)", +"59e148fc": "getLastOfferId()", +"59e1667d": "testControlCreateWithForeignParentNotInUse()", +"59e20f69": "addJobInvitation(uint256,address,string)", +"59e239af": "donateAsset(address)", +"59e23ccf": "computeBlockPrice(uint256,uint256,uint256)", +"59e2d30e": "testThrowBlobStoreNotRegistered()", +"59e30226": "getTradeOfferSenderItems(uint256)", +"59e33e35": "indexdate()", +"59e3e1ea": "testDivAdd(uint256,uint256,uint256,uint256)", +"59e415d3": "crowdETHTotal()", +"59e4c4ca": "createLover(string,string,string)", +"59e4eec9": "startMarket(uint32,uint256)", +"59e529cc": "extra_bonus()", +"59e54095": "getRefundValue()", +"59e541af": "getTokenInfoMaxPerBlockImbalanceList()", +"59e5d4b5": "hicsToken()", +"59e6800c": "depositToken(address,uint8,uint256)", +"59e777f6": "newHeir(address,uint256)", +"59e86488": "hasteamadjacency(uint16,uint16)", +"59e94862": "getEthToTokenOutputPrice(uint256)", +"59e994ca": "endTimeOfBids()", +"59e99db2": "_mint(bytes32,uint256,bytes32,address)", +"59e9fb1b": "IPFShash(string)", +"59ea2647": "yearTwoMultiplier()", +"59ea287d": "pre()", +"59ea6d80": "setNegativeArray(int256,int256)", +"59eb8224": "trancheCount()", +"59ebb321": "isManagementProxy(uint32,int256,address)", +"59ebbe35": "cancelFinishMintingRequest()", +"59ebeb90": "Open()", +"59ec29fe": "successICO()", +"59eca3e2": "manipulateSecret()", +"59eddf34": "getSchool(uint256,address)", +"59eecbf9": "assert1(bool)", +"59eee5c7": "hosting(uint256)", +"59efcb15": "execute(uint256,bytes)", +"59f02c4d": "getOraclizePolicyId(bytes32)", +"59f121a8": "setCreator()", +"59f1286d": "queryCredit(address)", +"59f47523": "newUserBonusCardTradable()", +"59f4bbd2": "indexPaidAffiliate()", +"59f568b9": "setDefaultNumberJuror(uint16)", +"59f5e0ce": "purchase(string)", +"59f61c74": "nextKey(uint256)", +"59f62cdc": "buyCalcAndPayout(address,uint256,uint256,uint256,uint256)", +"59f69ab6": "enforceWhitelist(bool)", +"59f769a9": "activeBalanceOf(address)", +"59f8714b": "changeableTokenCount()", +"59f96737": "convertMetToEth(uint256,uint256,int256)", +"59f96ae5": "postSellOrder(address,address,uint256,uint256)", +"59f974ce": "checkFundingGoalReached()", +"59f9a58f": "_vouchersInSharedPool(uint16)", +"59f9edd0": "sultantoken()", +"59fa0663": "setWhitelistOut(address,bool)", +"59fa34df": "findCurrentIndex(address)", +"59faf062": "bidPrice(bytes32)", +"59fb34bd": "_createRide(string,bytes7,address,uint256)", +"59fc2ba4": "DRONEXTOKEN()", +"59fd510a": "extraBalanceNeeded(uint256)", +"59fd95ae": "BTCCToken()", +"59fde1e0": "distributeRevenue(uint256)", +"59fe2720": "updatePollDescription(uint256,bytes,uint8)", +"59fe7279": "ADMINISTRATOR()", +"59ff5b55": "getMagicNumber()", +"59ff6473": "redistributeFees(uint256)", +"5a0024ae": "VerifyCheque(string,string)", +"5a0089d3": "getChildContractAddress(uint8)", +"5a012b17": "landsSold()", +"5a0178af": "update(uint256,uint256,bytes32)", +"5a018e01": "RESERVES_STAKE()", +"5a02dcde": "budgetWallet()", +"5a02ec19": "depositVault(uint256)", +"5a0391f2": "BuyForEtherTransaction(address,uint256,uint256,uint256,uint256)", +"5a044e91": "get_difficulty_list()", +"5a04ce5b": "setMinBalance(uint32)", +"5a051c47": "_purchaseLoopFifo(uint256,uint256)", +"5a052dff": "buyPixel(address,uint16,uint24,string)", +"5a055a33": "Enterprise()", +"5a059a44": "composeJingle(address,uint256[5],uint256[5],string,string)", +"5a05fff0": "bountyRewards(address)", +"5a061a7a": "TradexOne(address,address)", +"5a0646e2": "InitAssignCTC()", +"5a06f1e3": "TMEXAddressSet()", +"5a071517": "existPublicKey(address)", +"5a0718d0": "ICOadvisor1()", +"5a0753ac": "devFeeBalance()", +"5a079207": "Hydro()", +"5a083f54": "transferFromCheck(address,address,uint256)", +"5a09f2f4": "setHouseFee(uint256)", +"5a0ae8d5": "emitSkillRatingGiven(address,address,uint8,uint256,uint256,uint256,uint256)", +"5a0b7663": "getMaxResponseStates(uint256)", +"5a0ce676": "setParams(uint256,uint256,uint256)", +"5a0d9627": "updatePlayerMask(uint256,uint256,uint256,uint256,uint256)", +"5a0db89e": "test_mul(uint256,uint256)", +"5a0ebf94": "TokensReceived(address,uint256)", +"5a0f385a": "reverseTransfer(address,uint256)", +"5a0f3c40": "_foundationSupply()", +"5a1024d5": "setSinistre(uint256)", +"5a10d868": "Diyflex()", +"5a119ef2": "addIcoAddress(address)", +"5a1230bf": "computeCallKey(address,address,bytes4,bytes32,uint256,uint8,uint256)", +"5a129164": "vestingBeneficiary()", +"5a129e97": "byte32ToString(bytes1[32])", +"5a12b581": "GetUser(string)", +"5a13340f": "GetApplicant(bytes32)", +"5a140df0": "_remove(uint256)", +"5a142887": "grantAccessDeposit(address)", +"5a149f08": "finalizeNextUpgrade()", +"5a15656c": "developerCommissionFee(uint256)", +"5a15c373": "transferByOwner(address,address,uint256)", +"5a17877a": "LCDToken(address,address,address,address,address,address)", +"5a17aa41": "getContentTip(bytes32,address)", +"5a181478": "setPayoutCumulativeInterval(uint256)", +"5a182b8b": "SellLoan(uint256,uint256)", +"5a186c77": "init(address,uint256,uint256,uint256,uint256[],uint256,uint256,uint8)", +"5a18ae3d": "apply(string)", +"5a18f9ff": "isFundingNeeded(address,address)", +"5a1a1b67": "zTransferWinningBets()", +"5a1a8593": "bidBatch(uint256[],address)", +"5a1b0c0b": "LogBidCanceled(uint256)", +"5a1b472c": "getmykeyid(address)", +"5a1b96a2": "FiduxaCoinCrowdsale(uint256,uint256,uint256,uint256,uint256,address)", +"5a1bdaa1": "deusETH()", +"5a1cc358": "getChannelRank(address,uint256)", +"5a1e0a46": "cancelVote(uint8)", +"5a1e6ca1": "endRound(uint256)", +"5a1e6fc6": "setEmployeeAddress(uint256,address,address)", +"5a1e921b": "isTradeSupported(address,address,uint256)", +"5a1e9c79": "ProofOfKennyCoin()", +"5a1f3c28": "getCollection(uint256)", +"5a1f892c": "addPresaleContributors(address[])", +"5a2056ba": "rejectPayments()", +"5a212e99": "stringandbytes(bytes)", +"5a22d81a": "buyCEO()", +"5a236389": "getFileLoc(uint256)", +"5a237491": "nextWithdrawDayTeam()", +"5a23932b": "cryptaurus()", +"5a2450c3": "EventHub(address)", +"5a24c6a9": "chart_call()", +"5a272403": "SetAdmin(address)", +"5a275879": "toHex(address)", +"5a2791ed": "block24h()", +"5a28340a": "accessOperatingBudget(uint256)", +"5a297cae": "claimApis(address)", +"5a29ee7b": "sendRemaningBalanceToOwner(address)", +"5a2a3039": "setTopWinnerPrizes()", +"5a2a4452": "_addRole(address,string)", +"5a2a553f": "isCollateralWithinMargin(uint256,uint256,uint32)", +"5a2a75a9": "getTranscoderPoolMaxSize()", +"5a2b043c": "updateNextRound()", +"5a2b31d9": "B24Token()", +"5a2b488e": "calculateRefundedEth(uint256,uint256)", +"5a2bcc18": "mintAmount()", +"5a2bf25a": "setAddressValue(bytes32,address)", +"5a2c0f78": "mintMarketMakerApproval(address,address,uint256)", +"5a2de12f": "ChipTreasury()", +"5a2e311b": "capDefault()", +"5a2e4a11": "raisedWithdrawal()", +"5a2e73a2": "usd2Foken(uint256)", +"5a2ee019": "m()", +"5a2f71d4": "setEquipmentTrainingFeeMultiplier(uint256)", +"5a2fe63a": "isInMainSale()", +"5a30b194": "__address0__()", +"5a317cb3": "SHA256HashRegister()", +"5a31ab2f": "PresaleClosed(bool)", +"5a325fb3": "_setPlatformFeeRate(uint128)", +"5a32d070": "trickleDownBonusesReleased()", +"5a3320ff": "isCrowdsaleOpen()", +"5a338506": "airdropToAddresses(address[],uint256)", +"5a34508b": "delistAddress(address)", +"5a34ced1": "disableFundingWallets(address,address)", +"5a353193": "KrakenPriceTicker()", +"5a353f98": "T20coin()", +"5a354e04": "ProxyUser(address)", +"5a35eb7c": "isWinSlot(uint256,uint256)", +"5a36c394": "executeOrder(uint256,address,address,uint256,uint256,uint256,uint256)", +"5a36e0da": "getProjectCreator(uint256)", +"5a36f4f3": "setMintableProperty(uint256,bytes32,bytes32)", +"5a37ae58": "Show_the_name_of_Option_A()", +"5a388a43": "MVM()", +"5a390a5f": "breedingMarket()", +"5a3a05bd": "subRegistrar(bytes32)", +"5a3a6ef8": "TXL()", +"5a3b7e42": "standard()", +"5a3c0287": "claimTokensFromTokenAiNetworkToken(address)", +"5a3c8826": "dynamicCeiling()", +"5a3dd13f": "getScoreTotal()", +"5a3e251f": "halvingPeriod()", +"5a3f2672": "tokensOf(address)", +"5a3f88f0": "changeGeneration(uint40,uint16)", +"5a4071fe": "lockInternalAccount(address,bool,uint256)", +"5a40bb8f": "setAllergies(bool)", +"5a40ec7e": "verify(uint256,uint256,uint256,string,bytes32[2],bytes,bytes)", +"5a41217e": "underMaintenance()", +"5a414ff6": "getAuthorizedOwners()", +"5a416920": "swapFor(address,uint256,address,address,uint256,uint256,uint8,bytes32,bytes32)", +"5a41d508": "setFlightPrice(uint256)", +"5a42e85f": "SICX()", +"5a4362e5": "closeDown()", +"5a43fa90": "getTokenProposalDetails(uint256)", +"5a4426bc": "proposeLOC(string,address,uint256,string,uint256)", +"5a444139": "canBurnWhiteList()", +"5a446215": "setNameAndSymbol(string,string)", +"5a4528c2": "distributionContract()", +"5a4537b0": "TransferableMultsig(uint256,address[])", +"5a46bb2b": "initChain(bytes,uint32)", +"5a46d3b5": "lockOf(address)", +"5a46f06c": "BANCOR_CONVERTER_FACTORY()", +"5a470aff": "setNthByte(uint256,uint256,uint8)", +"5a470b65": "gamePlayedStatus()", +"5a476e5a": "buyOrderBalances(bytes32)", +"5a481a7e": "ARBITRAGEToken(address)", +"5a4877c0": "timeLockedBeneficiariesDisbursedTo()", +"5a4a04a7": "OWNER_CLAWBACK_DATE()", +"5a4bffb8": "tokenPurchaseAmount(address)", +"5a4c07a0": "fillBlank()", +"5a4c822d": "setAdminPercent(uint256,uint256)", +"5a4cc5da": "Dunhil()", +"5a4d8e59": "getBAU2Length(bytes32,address)", +"5a4ded51": "tokenBuyCalc(uint256)", +"5a4e69f0": "KyberContirbutorWhitelistOptimized()", +"5a4fc9c5": "lookup(int256)", +"5a500066": "WSXToken()", +"5a5132be": "ambix()", +"5a51d1df": "sendReward(uint256[])", +"5a520f8b": "buyDragon(uint256,uint256,bool)", +"5a525491": "safeIndexOfTaskId(uint256)", +"5a527afb": "testFooApprove(uint256)", +"5a52da30": "didVoteForName(address,string)", +"5a52ecf6": "getSignedConfiguration()", +"5a531015": "getLotteryAtIndex(uint256)", +"5a5383ac": "canExitPool()", +"5a53fe20": "multiApprove(uint256[])", +"5a543683": "BuyerLotteryTimes(address)", +"5a54cd46": "proceedEtherDeals(uint256)", +"5a54e755": "hashMachine()", +"5a55c1f0": "getVote(uint256)", +"5a5638dc": "policyTokenBalanceFromEther()", +"5a56a31c": "FeeApplied(string,address,uint256)", +"5a57a901": "VIPSToken()", +"5a5804b3": "getAllocation(uint256)", +"5a589fc9": "authUser(string)", +"5a58cd4c": "deleteContract()", +"5a591a4e": "promotionDataRecord(address,uint256)", +"5a592380": "vestingPlans(uint256)", +"5a593a6e": "totalreleaseblances()", +"5a596aa4": "CheckBalance(address,address)", +"5a5a433b": "checkHash(uint256,uint256,uint256)", +"5a5b32b7": "_setHatValue10(uint256)", +"5a5c8068": "oraclize_setNetworkAuto()", +"5a5d096c": "isOwner(uint256,address)", +"5a5d3350": "KKToken()", +"5a5ddcf6": "startStopICO(bool)", +"5a5e0024": "SecondEtherLimit()", +"5a5e0074": "etherForOwner()", +"5a5e861e": "currentPayment()", +"5a5ebebf": "withdrawRent(address)", +"5a5ec54a": "neglectOwner()", +"5a609b96": "investorsIter()", +"5a61c40a": "setwithtoken(address)", +"5a625393": "ValueTokenBase(uint256,string,string,uint8)", +"5a628525": "reveal(address,bytes32)", +"5a628e17": "getWishIdxAt(address,uint256)", +"5a63cba0": "checkSaleLimit(uint256)", +"5a63feb8": "__targetExchangeAndSpendCallback(address,uint256)", +"5a648bc5": "WithdrawAll()", +"5a64ad95": "mintingFee()", +"5a64b786": "deposit_dividends()", +"5a650f45": "numBountyCredits()", +"5a6535fc": "call(bytes)", +"5a657452": "COD()", +"5a658f6b": "directorNode()", +"5a65f004": "isSynthesizeAllowed()", +"5a67a20d": "endingPrice()", +"5a67f389": "timeGone(uint256)", +"5a6814ec": "thisisfine()", +"5a686699": "post(uint128,uint32,address)", +"5a69fe0e": "TokenERC20(address)", +"5a6ad1e1": "multivestBuy(address,uint8,bytes32,bytes32)", +"5a6af33b": "subtrBalance(address,uint256)", +"5a6b26ba": "withdrawal(address,uint256)", +"5a6b3a79": "assignBounty(address,uint256)", +"5a6c6408": "updatePolicy(bytes32,address,uint32,uint32,uint256,uint256,bool)", +"5a6c787e": "updateWithMPO()", +"5a6cd237": "latestTokenBalance()", +"5a6d663c": "notifyTransfer(address,address,uint256)", +"5a6dad3c": "setFreelancerParams(uint256,uint256)", +"5a6e8980": "editusetaddress(uint256,string)", +"5a6f7aef": "tweakUpgrading()", +"5a703223": "GetToken(address,uint256)", +"5a70686a": "mintChip(bytes32)", +"5a70fe72": "GetInvestedAmount()", +"5a71be21": "ethEur()", +"5a732dd5": "CCPayoutArb()", +"5a74a715": "setWeiForMcr(uint256)", +"5a74dee5": "multiAccessRemoveOwnerD(address,address)", +"5a7511d0": "put(uint256,string)", +"5a753c6e": "getWarlordDistributedRandom(uint256)", +"5a75aa1c": "ChangeRate(uint256)", +"5a75b8d5": "currentHodlerId()", +"5a764631": "setSkillName(uint256,bytes32)", +"5a766620": "neglectGuess(int256)", +"5a768e4a": "ECONOMY_BOOST_TRADE()", +"5a769366": "sadf(address)", +"5a76e73e": "getNoOfTokens(uint256,uint256)", +"5a778cf9": "batchPresale(address[],uint256[])", +"5a78897b": "setFunctionSixPrice(uint256)", +"5a7a4c1e": "_applyPct(uint256,uint256)", +"5a7a8850": "rollWithSeed(bytes32)", +"5a7adf7f": "preSale()", +"5a7b4097": "fundBalanceOf(address,address)", +"5a7b57f2": "MadoffCoin()", +"5a7cb38f": "tokenTransferAddress()", +"5a7da6b5": "burnUpdateTokenFrom(address,uint256)", +"5a7db533": "getRef(address)", +"5a803611": "addDealerForSender(string)", +"5a81018a": "getClientCount()", +"5a811766": "replaceAdmin(address,address)", +"5a813fd5": "test_insert_findWithHintPrevAtPosition(int256)", +"5a8194d2": "getVersionIndex(bytes32,bytes32,bytes32)", +"5a81b5b9": "collectMegaJackpot(uint256)", +"5a825cbb": "getPayment(uint256,uint256)", +"5a851ffb": "calculateDiceWinner(bytes32,bytes32,uint256)", +"5a857565": "buyTokensInternal(address,uint256)", +"5a85d2fa": "playerSignUp(address)", +"5a861838": "addHpbNodeBatch(address[],bytes32[],bytes32[])", +"5a8654ad": "End6()", +"5a86c914": "getRateIcoWithBonusByDate(uint256)", +"5a87053e": "privateBonus()", +"5a87c380": "getRewardListLength()", +"5a8830e2": "partial_refund_my_ether()", +"5a88b15f": "Halo3DShrimpFarmer(address)", +"5a89b376": "contractDecimalsUpdate(uint256,bool)", +"5a8ac02d": "second()", +"5a8b1a9f": "upgradeTo(string,address)", +"5a8b55e2": "IsWildCardCreatedForCategory(string)", +"5a8bbba9": "createNewSecret(string,bytes32,bool)", +"5a8bbee1": "Group_4()", +"5a8cadb1": "migrateAll(address)", +"5a8cf571": "changeControlWallet(address)", +"5a8d580e": "forceNSFW(uint256)", +"5a8d6cea": "transferUnsoldIcoTokens()", +"5a8dd79f": "getDesignatedCaller(address,uint256)", +"5a8e9d66": "settle(address,uint32)", +"5a8ef28a": "GBP(uint256)", +"5a90a49e": "exemptFromFees(address)", +"5a9156f0": "LogAddUser(address)", +"5a91e5e9": "removeFabric(address,address)", +"5a93bf71": "delReferral(address,address)", +"5a93cc8f": "addBonus(address,uint256)", +"5a93f1a1": "_deleteCompany(bytes32)", +"5a9448e2": "multisigFunds()", +"5a94cd0c": "requestChangeStakingFees(uint80,uint80,uint80,int256,uint80,int256,uint256,int256,uint80,uint80,uint256)", +"5a95edd9": "OTHERCRUISER_FTL_SPEED()", +"5a960216": "ethUsd()", +"5a969f94": "InternationalModelChain()", +"5a975128": "minGamble()", +"5a979a5c": "LockContractOwner(address)", +"5a97b84a": "finishUserDistribution()", +"5a983451": "totalTokenMintedAngel()", +"5a992188": "getUserBet(uint256,uint256)", +"5a99719e": "getMaster()", +"5a998a09": "totalRoyalty()", +"5a99b525": "payoutRoyalties()", +"5a99d123": "unsetNotaio(address)", +"5a9a49c7": "verify(bytes32[],bytes32,bytes32)", +"5a9aa592": "currentWallet()", +"5a9b0b89": "getInfo()", +"5a9bb087": "claimContractTokens(address)", +"5a9c0a49": "setBasePrice(uint256[20],uint256,uint256,uint256,uint256)", +"5a9c2724": "create(string,string,address)", +"5a9c3ee4": "mainSaleDeadline()", +"5a9c84f3": "maximumTokensForSecond()", +"5a9cfac8": "hasPosts()", +"5a9d27dc": "createReleaseTokenAuction(string,uint256,uint256,uint256)", +"5a9d5c3c": "PCPP()", +"5a9e03ca": "isIssuedBefore(bytes32,uint256)", +"5a9e426b": "refundMe()", +"5a9e75a2": "maxBorrowAmount(address)", +"5a9e91df": "zlotsJackpot()", +"5a9f2def": "scheduleCall(bytes4,bytes,uint256,uint256)", +"5a9f97d1": "currentSaleDay()", +"5a9ffc35": "circulatingFame()", +"5aa00cc4": "_emitJobCanceled(uint256)", +"5aa037dc": "purchasedTokenBalanceOf(address)", +"5aa1eb4c": "createAdjudicator()", +"5aa23a52": "sendRewardBILL(address,uint256)", +"5aa3952a": "GERCoinCrowdsale(uint256,uint256,uint256,address)", +"5aa3d2b0": "purchasedAmountBy(address)", +"5aa4470f": "setLogicContract(address)", +"5aa451e9": "updateOfferingReputation(address,uint8)", +"5aa4c8a9": "addToMap(uint256,uint256)", +"5aa5b9d1": "LogPersonNew(address,uint256,uint256)", +"5aa61ec6": "getExchangeRatesLength()", +"5aa63592": "DeadMansSwitch(address,address,uint256)", +"5aa68ac0": "getParticipants()", +"5aa6b1f0": "reduceFiatCurrencyRaised(uint256)", +"5aa6cf97": "payout(uint256,uint256)", +"5aa720c3": "linkTaskToUser(address,address)", +"5aa77d3c": "pendingContractOwner()", +"5aa83129": "store(bytes,uint256,uint256,address)", +"5aa86386": "getMinNextBet(string)", +"5aa8a42c": "updateOwners(uint256,address[])", +"5aa8e281": "freezeAccountCoin(address,uint256)", +"5aa94a68": "computeResultVoteExtraInvestFeesRate()", +"5aa97a3b": "agreeNeg(string,uint256)", +"5aa97e16": "BBCPrimeEx()", +"5aa97eeb": "getMarkets(bytes32[],address)", +"5aaa250a": "TokensCappedCrowdsaleImpl(uint256,uint256,uint256,address,uint256)", +"5aaac1d1": "fundingMaxCapUSD()", +"5aab1822": "stateEndDate()", +"5aab25b6": "isRedenominated()", +"5aab4ac8": "motd()", +"5aac8aad": "ICO_TokenValue()", +"5aad0450": "addVestingAllocation(address,uint256)", +"5aad507b": "userTotalCredit(address)", +"5aad7c56": "calculatePMAFromFiat(uint256,string)", +"5aae456a": "potatoTotalSupply()", +"5aae843e": "doPreAllocations()", +"5aaec2b1": "isdelegatinglisted(address)", +"5ab01088": "joinPreSale(address,uint256)", +"5ab027b0": "masterAddress2()", +"5ab0e470": "getShortPositionState()", +"5ab14385": "doProxyAccounting(address,uint256,uint256)", +"5ab1a0e2": "JungleScratch()", +"5ab1bd53": "getRegistry()", +"5ab2ff61": "read_u64_array()", +"5ab30d95": "bobMakesEthPayment(bytes32,address,bytes20,uint64)", +"5ab31a60": "drawNumber(uint256,string)", +"5ab35302": "ProofofHumanity()", +"5ab3ae21": "privatesaleTokens()", +"5ab3ded3": "changeDonationWallet(address)", +"5ab3fbc9": "BGB_Token()", +"5ab47550": "firstDayCap()", +"5ab4f162": "getVote(address,address)", +"5ab50913": "_recalculateAirdrop(address)", +"5ab58d64": "totalLockedHavvens_limitedSum()", +"5ab5956e": "startICOStage6()", +"5ab5d07d": "CROWDSALE_MAX_ACES()", +"5ab68072": "carTaxiCrowdsale()", +"5ab6eb7a": "Tabbo()", +"5ab7603a": "multivestBuy(address,address,string)", +"5ab7f1a8": "donatedAmount()", +"5ab81246": "newItem(uint256,string,string)", +"5ab827f6": "claimableRefund()", +"5ab89248": "AAcontributors()", +"5ab92022": "frozenTransfer(address,uint256,uint256,bool)", +"5ab98b8d": "DragonReleaseableToken(address)", +"5ab9bb26": "changeBonus(uint8)", +"5abaaa01": "unicornTokenAddress()", +"5abacc89": "RANGESTART_9()", +"5abb37d6": "cancelGame(address)", +"5abc3339": "create(bytes32,bytes32,bytes32)", +"5abc52d4": "SALE2_RATE()", +"5abcc417": "createCastle(address,uint256,string,uint64,uint64,uint64,uint64,uint64,uint64)", +"5abd7728": "setMinTaskValue(uint256)", +"5abedab2": "getAllTheFunds()", +"5abfafe2": "holdAddress3()", +"5abfc588": "CreatedDebt(uint256,address)", +"5ac04bed": "CreateMUSC(address,uint256)", +"5ac0dc11": "doTimeoutForComplainant(uint256)", +"5ac14935": "test_0_createOpenController_test_methods()", +"5ac1caa0": "_getCurrentRound(uint256)", +"5ac207ff": "totalLossAmount()", +"5ac2523a": "minimalTokens()", +"5ac26ebd": "devuelveTodasEncuestas()", +"5ac31e68": "getOrdersForNotary(address)", +"5ac36d70": "setTeams(address[],uint256[])", +"5ac3835d": "verifyTransferSignature(address,address,uint8,bytes32,bytes32)", +"5ac44089": "setHardCapInCents(uint256)", +"5ac48043": "slice(uint256[],uint256,uint256)", +"5ac49ba1": "CORE_TEAM_TOKENS()", +"5ac5c4f7": "Out(uint256)", +"5ac5ec65": "UsableToken(uint256,string,uint8,string)", +"5ac5f82c": "computeBonus(uint256)", +"5ac72734": "tkt()", +"5ac77ad1": "isLockedOpen()", +"5ac7a8d0": "UTBToken(uint256,string,string)", +"5ac7b9f3": "reapFarm()", +"5ac7d17c": "getMarketIsClosing(uint256)", +"5ac801fe": "setName(bytes32)", +"5ac849d2": "liveBlocksNumber()", +"5ac87d76": "addToWhiteList(address,uint256)", +"5ac942a7": "getIdentifierByIndex(address,uint256)", +"5ac9e90f": "readLib()", +"5aca6153": "setJackpot(uint8[4])", +"5acb053b": "toggleDead()", +"5acb6787": "createRegion(uint256,uint256,uint256,uint256)", +"5acba201": "canOverride(address,address,address,uint256)", +"5acbd8e1": "ProxyStorage(address)", +"5acce36b": "getEndowmentBalance()", +"5ace5128": "_emitBoardClosed(uint256,bool)", +"5ace83d7": "approveWinner()", +"5acee3d6": "getFutureTransLength()", +"5acf061a": "validateContract(address)", +"5acf34df": "check_data(bytes32)", +"5acf36ca": "fwithdrawal(uint256,uint256)", +"5acfefee": "sendProfits()", +"5ad1854b": "advisersPeriodAmount()", +"5ad22eb3": "canonizedPLCR()", +"5ad35ac0": "numberOfTokensAllocated()", +"5ad4997e": "getResult(uint8,uint8)", +"5ad550bc": "testAbsMax()", +"5ad55aa5": "setCurrentSchellingRound(uint256)", +"5ad5ca74": "createXMLYTrade(bool,uint256,uint256)", +"5ad64dc5": "deletePick(uint256)", +"5ad6ba47": "getChronus()", +"5ad701c2": "getTier()", +"5ad74742": "ICO_Contract()", +"5ad7c05c": "getUserRequests()", +"5ad82148": "getUserid(address)", +"5ad871d5": "CrowdWithUs(uint256,string,address,uint256)", +"5ad8803d": "mintAndCall(address,uint256,bytes,bytes)", +"5ad95948": "wmin(uint128,uint128)", +"5ad9ca10": "changeBonus(uint8,uint256,uint256)", +"5ada0f51": "setTkContractAddress(address,address)", +"5ada7bee": "updateVerifier(uint256)", +"5adada87": "getPaymentsHeld(address)", +"5adb5813": "_setTokenURIBase(string)", +"5adb6ddb": "unfreeze(address,address)", +"5adbe6fb": "ComputeMyEgg(address)", +"5adc02ab": "confirmWhitelistAddition(bytes32)", +"5adc0c68": "getAddTokenParameters()", +"5adcba0e": "getEntryStatus(address,uint32)", +"5adcf475": "loikikdidad()", +"5addc540": "forceToken()", +"5addcc8f": "finishFromDutchAuction()", +"5ade3f8f": "NectarChina()", +"5ade7c8a": "getMyChest(address)", +"5ade9c3a": "removePass(bytes32,address)", +"5adf292f": "updateKittenCoinsRemainingToDrop()", +"5adfafdf": "updateRewardPercentageByIndex(uint256,uint256)", +"5adfff91": "_hashTheSecret(bytes32)", +"5ae11d5d": "order(address,uint256,address,uint256,uint256)", +"5ae17907": "getLossCount(address)", +"5ae23da2": "host_claim_earnings(address)", +"5ae23f84": "getTimeRangeInfo()", +"5ae270aa": "GToken()", +"5ae28fc9": "setMaxAge(uint256)", +"5ae46e93": "RaffleDappBook(string,uint256)", +"5ae4c04a": "viewprice()", +"5ae59132": "havvensReceivedForNomins(uint256)", +"5ae5b24f": "eosPizzaSliceSafe()", +"5ae5df8f": "deleteRef(string)", +"5ae61377": "getMaxBusinessesPerCity(uint256)", +"5ae63989": "WaraCoin()", +"5ae7ab32": "revokeKey(address)", +"5ae81492": "canceloffer()", +"5ae82dfd": "ariseWarrior(uint256,address,uint256)", +"5ae8a1e0": "updateUserPolicy(bool,bool,bool,bool)", +"5ae8daea": "getRoundJackPot(uint256)", +"5ae9c4d8": "getLineData2(uint256)", +"5aea5955": "ltc()", +"5aea92f5": "LingYanToken()", +"5aea9905": "BitrustToken(address,address,address,uint256)", +"5aeb45dc": "TetherToken()", +"5aebd1cb": "isRefundable(address)", +"5aebf21a": "getProviderAdmin(address)", +"5aebfd14": "createFile(bytes)", +"5aec11d4": "canUnshelf(string)", +"5aec2247": "balanceOfPreSale(address)", +"5aec57d8": "NewRound(uint256,uint256,uint256)", +"5aec6259": "getUInt(bytes32)", +"5aed37ef": "manualWithdrawEtherAdditionalOnly()", +"5aed4fa0": "safetyCheck(uint256)", +"5aee1bc0": "AirdropBeggarsCommunity()", +"5aee42bc": "createICOToken()", +"5aee9431": "method1()", +"5aeee9f9": "incFightLose(uint256)", +"5aef2447": "getClaim(uint256)", +"5aef447c": "presaleBonusTokens()", +"5aef7de6": "avatar()", +"5aefd89d": "Freezing()", +"5af0649e": "confirmNewNotary(address)", +"5af0dc98": "blockSkills(address,uint256[])", +"5af0e1ae": "MyWillCrowdsale(uint32,uint32,uint256,uint256)", +"5af0f053": "approveMove(address,bool)", +"5af123f4": "bonusRate()", +"5af14603": "GetSetting(uint8,uint8)", +"5af1cf27": "foundersWallet1()", +"5af1e55d": "op1()", +"5af25671": "HugMathou()", +"5af2f821": "getCounterProposals()", +"5af36e3e": "refund(uint256,uint256)", +"5af3741b": "getAddressAnserKeccak256(uint256)", +"5af3d5bf": "CWCfallback(address,uint256,bytes)", +"5af3e9d7": "bonusLOT()", +"5af40b77": "buildPreICOStage()", +"5af4cd99": "canBurnAddress()", +"5af5f7ba": "setWhitelisting(bool)", +"5af6333d": "getGoldInfoSerial(address)", +"5af73f3f": "getMinimalBalance(uint256,address)", +"5af77fff": "Contract()", +"5af82abf": "director()", +"5af86018": "VPE_Token()", +"5af89094": "getPMul()", +"5af95010": "Lenders(address)", +"5af9f68f": "getTxPaymentMCW(bytes32)", +"5af9f9d5": "TheSchmeckle()", +"5afa5036": "isCertified(address)", +"5afa5bb6": "minValue2()", +"5afb408a": "Penchant()", +"5afb540c": "getTokenCount(bytes32,string)", +"5afbfd4f": "getPublicBattlePokemon2()", +"5afc190d": "DrawHouse()", +"5afc250f": "getDad(address)", +"5afc7e59": "issueFrts(address,address,uint256,uint256,uint256,address)", +"5afd7627": "setCrowdsaleCompleted()", +"5afdc02c": "_9_dataSmerti()", +"5afe16ca": "GetProfile(uint256)", +"5afe5207": "setTokenSaleAddress(address)", +"5afe9ee1": "verifySignedBy(bytes32,bytes,address)", +"5afeb106": "Sqrt()", +"5afecaaa": "getAllArtworksByOwner()", +"5aff457f": "createAuctionFromArray(address,uint256[],uint256,uint256)", +"5aff59e3": "addrCanPurchase(address)", +"5aff7e54": "returnBalance(address,bytes32)", +"5affcbb0": "cancelIndexedSaleByAddress(address)", +"5b00763e": "ProofOfTrevonJames2()", +"5b0088fb": "setPlotData(uint256,string,string,string,string)", +"5b01b5b3": "teamEmail()", +"5b01e233": "getyestodayget()", +"5b02b729": "setLockUpPeriod(uint256)", +"5b04cbb5": "current_state()", +"5b04e512": "defaultLockin(address,uint256)", +"5b050e77": "isInGame()", +"5b053c04": "maxPreSale1Token()", +"5b054f9b": "chainStartTime()", +"5b060530": "createToken(string,string,uint256)", +"5b064754": "LogChiSale(address,uint256)", +"5b067cce": "testCreateCostMain()", +"5b06fc49": "HASHPERETH()", +"5b07371e": "getAttackRanking()", +"5b0783f3": "setCapRec(uint256[],uint256[],uint256)", +"5b07d7d6": "_generateGene()", +"5b091f92": "updateID(address,uint256)", +"5b09a518": "process(bytes32,bytes[])", +"5b0a3843": "emergencyWithdrawal()", +"5b0a6c58": "EasyMineIco(address)", +"5b0ad787": "getBonusSetter()", +"5b0b02ec": "deathData_f4()", +"5b0b7cc8": "payday(uint256)", +"5b0c12a1": "DeploymentInfo()", +"5b0cfcd8": "KillContract()", +"5b0d4eff": "mineral()", +"5b0d5b55": "getTankEarning(uint32)", +"5b0d823a": "referalFundBalanceMap(address)", +"5b0dad8e": "bcdcMultisig()", +"5b0e1a2f": "releaseMyTokens()", +"5b0e52b0": "unlockExternalTransfer()", +"5b0e70ff": "RetireHodl(uint256)", +"5b0e8b82": "admin_list()", +"5b0ec73e": "MNCToken()", +"5b0ef4a4": "getEtherTicket()", +"5b0efb03": "MintAndTransfer(address,uint256,bytes32)", +"5b0fc9c3": "setOwner(bytes32,address)", +"5b1052f1": "getCoinBySlotId(uint64)", +"5b10b796": "_removeCapper(address)", +"5b10d05d": "donotDKKDappToken()", +"5b113414": "mul(uint32,uint32)", +"5b11380d": "ExTokeB()", +"5b1214c6": "setCrowdsale(uint256,uint256,uint256)", +"5b1295d2": "LNDToken()", +"5b12f1b6": "getAuthorizeContractIds(uint256,uint256)", +"5b135806": "test_basicWithTwoAssertAfterThrow()", +"5b14f183": "isPaused(address)", +"5b151fd2": "fifty_fifty()", +"5b154394": "GANA()", +"5b15afb6": "isOuvidoriaCadastrada(address)", +"5b16ebb7": "isPool(address)", +"5b174f0b": "EtheremonTransform(address,address,address,address,address)", +"5b17b190": "onLEXpaContract()", +"5b18056b": "contributionCount()", +"5b195526": "getMyCenter()", +"5b195c86": "transfer(address,uint24)", +"5b196dae": "getOuvidoriaNome(address)", +"5b19a8f3": "prossWinOrLoss(uint256)", +"5b1a77fe": "sentTokensToBountyOwner()", +"5b1aa9b1": "eugToken()", +"5b1b5d90": "getTransfer(bytes32,uint256)", +"5b1b9316": "firstRoundCosmosStart()", +"5b1c1625": "prepareClaim(bytes32)", +"5b1c893a": "UBC()", +"5b1cba31": "freezeAddress(address,address,bool)", +"5b1d0d1e": "getOwnerAccessoryCount(address)", +"5b1dac60": "getSharePrice()", +"5b1dadc7": "PRICE_PRESALE_WEEK2()", +"5b1ea858": "signedTransferSig()", +"5b1eca38": "getTotalDevs()", +"5b1fe0cb": "sendGift(uint256,address)", +"5b1fef12": "GetPVPData(address)", +"5b206edb": "initAmount_()", +"5b208f76": "PlayX2()", +"5b209615": "ecrecover1(bytes32,uint8,bytes32,bytes32)", +"5b21a8b0": "NILEX()", +"5b21ba6f": "calculateProfit(uint256)", +"5b21e539": "decline(uint256,bytes32,bytes)", +"5b225526": "permissions(address,bytes32)", +"5b225d25": "getLatestManifestByName(address,bytes32)", +"5b228f88": "CLCToken()", +"5b229869": "getSenderArmyCount()", +"5b2298c8": "getSumAmountOfDisputedDealsProPatient()", +"5b229ae4": "dungeonRequirements(uint256)", +"5b22bbd2": "maxRaiseAmount()", +"5b2329d4": "checkGoalReached(uint256)", +"5b23bf8a": "forcePayout()", +"5b24f87d": "addManyToAllocationList(address[],uint256[])", +"5b250462": "join_private_room(bytes32)", +"5b251342": "KAnsariCoin()", +"5b25c137": "kycVerifiedBonusBps()", +"5b25ed6a": "tokensLimit()", +"5b284ecd": "InsertRank(uint256,uint256,uint256)", +"5b28919c": "getShipType(uint256)", +"5b28ad15": "dna6(uint256)", +"5b290c1d": "continueRedeeming(uint256)", +"5b29f2e4": "icoSold()", +"5b2a0e96": "multiSend(address,address[],uint256)", +"5b2a372d": "setTxDataBlockNumber(bytes32,bytes)", +"5b2aa4ae": "getMatchInfoList01()", +"5b2b0168": "_refundTokensPurchase(address,uint256)", +"5b2b2194": "addRange(address)", +"5b2b345c": "TOKENS_ACCOUNT_MAX()", +"5b2c44e1": "updateWhitelistInternal(address,address,uint8)", +"5b2ccdec": "hirerCancel(bytes16,address,address,uint256,uint256)", +"5b2cdda3": "returnWalletAddress()", +"5b2d2bcf": "set_car_dealer(address)", +"5b2d7ad1": "calculate_shares_and_return(uint256,uint256,uint256,uint256,uint256,uint256)", +"5b2e1eb1": "ETHPonzi()", +"5b2e299c": "Hypercoin()", +"5b2e39e0": "releaseEcosystemJM(address)", +"5b2e9a81": "UpdateSellAgentSiteReg(address)", +"5b2ec3a5": "createInternalAuction(bytes32,bytes32,uint256,uint256,uint256,string)", +"5b2f515b": "artistName()", +"5b2f8752": "claimLoss()", +"5b303e16": "eatUnicorns(uint256)", +"5b30535d": "updateFactorReward()", +"5b30a647": "checkapproval(uint256,address,bool)", +"5b31035d": "getReward(uint64)", +"5b325e94": "AddTransactionAgainstExistingEntity(address,uint256,uint256,string,string)", +"5b329058": "DSGroup(address[],uint256,uint256)", +"5b33233b": "increaseOwnershipTokenCount(address,address)", +"5b34b966": "incrementCounter()", +"5b34f4e2": "newUserAccount(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"5b353cfa": "PMC()", +"5b35f9c9": "rewardsWallet()", +"5b364f3b": "chkend(uint256)", +"5b366096": "changeHDXcontract(address)", +"5b36fea6": "transferToICAPWithReferenceCallGas()", +"5b372532": "press()", +"5b378d39": "ContractorCreated(address,address,address,address)", +"5b379044": "dateTier3()", +"5b37e150": "create(bytes32,bytes)", +"5b387273": "allowWhiteList()", +"5b38863a": "btcRateMax()", +"5b389666": "USDCryptoToken()", +"5b389dbb": "powerUpContract()", +"5b38a8e6": "updateAssets(address,int256)", +"5b3a4895": "totalInvestedWithBonuses()", +"5b3a6f9e": "DomusToken()", +"5b3b136a": "getMyTokens()", +"5b3b20e1": "CLN_PER_ETH()", +"5b3b449f": "incentiveTokensLimit()", +"5b3bab74": "NeCashTokenSale()", +"5b3be4d7": "mintAirDropTokens(uint256,address[])", +"5b3bf07a": "getPrizeNumbers()", +"5b3d386b": "transferAnyCaerusToken(address,uint256)", +"5b3d4b16": "SCUDO()", +"5b3ddbf2": "firstAuctionConcluded()", +"5b3de1c8": "getBankEth(string)", +"5b3ea961": "ChangeSharedExpense(uint256,uint256,uint256)", +"5b3f4d24": "PrelievoProprietario(uint256,uint256)", +"5b405418": "CallSpread()", +"5b4078de": "decodePriceFeed(uint256)", +"5b40a584": "curId()", +"5b40d5dd": "unlockInBatches(address[])", +"5b419a65": "join(bytes32,bytes32)", +"5b42109d": "getNarcoLocation(uint256)", +"5b4246d4": "proportion()", +"5b440596": "getWithdrawValue(address)", +"5b453810": "changeEtherBonuses(uint256,uint256,uint256,uint256,uint256,uint256)", +"5b454832": "declareDefaultAsBorrower(uint256)", +"5b45b999": "setMiniMeToken(address)", +"5b46016e": "KickTheCoinFactory()", +"5b467404": "getCounts(address)", +"5b472771": "level_8_amount()", +"5b475e22": "STARTING_ANTHILL()", +"5b477c53": "updoot(uint256)", +"5b4786ea": "getValusTokenIssuance(uint256,uint256)", +"5b48165f": "lastBlock_v17Hash_uint256()", +"5b482ec1": "disconnectModule()", +"5b485314": "IEFBR14()", +"5b48684e": "optIn()", +"5b48c11b": "regRefcode(bytes32)", +"5b48e66a": "changeCroStatus(address,uint8)", +"5b49ebdf": "GiantWeedKiller()", +"5b4a54a9": "isCrowdsaleOver()", +"5b4b1c0e": "orientation()", +"5b4b73a9": "setData(uint256)", +"5b4be32b": "setSellStatus(bool)", +"5b4c084a": "updateHpbNode(address,bytes32,bytes32)", +"5b4c3543": "options(bytes32)", +"5b4c6994": "setArbitratorI(address)", +"5b4cc249": "newSale(address,uint256,uint256)", +"5b4cc320": "onOwnershipTransfer(address,uint256,bytes)", +"5b4ccc9d": "addParticipants(address[])", +"5b4d20d2": "requireWhitelistedAddress()", +"5b4df1ca": "ROLE_CONTROLLER()", +"5b4ef70b": "eth(uint256)", +"5b4ef819": "increaseNumber()", +"5b4f472a": "tradingStarted()", +"5b4f5feb": "assignCardOwner(address,uint64)", +"5b500996": "bringuPort(address)", +"5b508cf0": "createRegulatorProxy(address)", +"5b511030": "activateSecondPreIco()", +"5b519132": "getInitHash(bytes32)", +"5b51a6d8": "getMintDelegates()", +"5b51acff": "migrationTarget()", +"5b525b2c": "changeItemName(uint256,string)", +"5b528aaf": "KaiKuangChain(uint256,string,string)", +"5b528ba1": "bonusPer(uint256)", +"5b52b9db": "WLMTfinney()", +"5b52c7fb": "GROWTH_SUPPLY()", +"5b530196": "tokensOfkitty(uint32)", +"5b53d291": "advisersTotal()", +"5b5416ca": "unfreezeTimestamp()", +"5b548ab4": "mixAuto(uint256,uint256)", +"5b54f077": "promissoryUnits()", +"5b55169c": "minContribAmount()", +"5b556bf0": "ZeroExHandler(address,address)", +"5b56af1e": "freezeAccountTimeAndValue(address,uint256[],uint256[])", +"5b56be8b": "prevEndTime()", +"5b56d57f": "getGameStartBlock(uint256)", +"5b588f26": "cfoWithdraw(uint256)", +"5b59af9c": "OwnershipAdded(address,address)", +"5b5a9160": "JackCoin()", +"5b5ae956": "Bytes4ToByteArrayWithLength4()", +"5b5aed3a": "identityExists(uint256)", +"5b5b45ef": "privateOfferingExchangeRate()", +"5b5bbb31": "changeSettings(uint64,uint64,uint8,uint8,uint16)", +"5b5c7705": "withdrawPlayer()", +"5b5cf8cf": "PacersvsCavaliers420()", +"5b5d1d88": "TMRToken()", +"5b5d2c8f": "updateValue(bytes32,uint256,uint256)", +"5b5ddb94": "read(bytes,uint256,uint256)", +"5b5e450b": "masterKeyIndex(uint256)", +"5b5e760c": "getTokenWinValue(uint256)", +"5b5e7bbe": "setAssetsOnDeposit(uint256)", +"5b5ecf19": "CryptoSagaArenaRecord(address,uint32,uint8,uint8)", +"5b5f8b88": "transerFrom(address,address,uint256)", +"5b5fa6ba": "ownerTemp()", +"5b60fa6b": "createTeam(uint256,uint256)", +"5b61291c": "aekS()", +"5b621b2c": "_setMintableProperty(uint256,bytes32,bytes32)", +"5b624b6e": "setinfo(string,string,string)", +"5b630d59": "EFH(uint256,string,uint8,string)", +"5b633cf2": "getItemsIdsByTypeAndOwner(string,address)", +"5b63831a": "getMinimumPurchaseVZTLimit()", +"5b6427fc": "nextNumberOfWagersToMinimumTimeout()", +"5b65b9ab": "setFee(uint256,uint256,uint256)", +"5b65da64": "getPhaseSupply(uint256)", +"5b6682aa": "Tom(uint256,string,uint8,string)", +"5b66cc84": "transferLog(address,uint256,string)", +"5b680aa6": "spentAllowance()", +"5b68a49d": "cancelVoteForCandidate(address,uint256)", +"5b68e09b": "appAccounts(uint256)", +"5b68f3a6": "Loggable()", +"5b6a42b8": "setNewMonster(uint256,uint32,address,string,string)", +"5b6a54bc": "adjustTransactionFee(uint256)", +"5b6a9eb4": "minCost()", +"5b6aa3c2": "isMinTokensReached()", +"5b6accb2": "manualBatchTransferToken(uint256[],address[])", +"5b6b431d": "Withdraw(uint256)", +"5b6beeb9": "getHash(string)", +"5b6c508c": "exitAll()", +"5b6ca99a": "setHint(string)", +"5b6e2492": "getDesignatedReporter()", +"5b6e7be2": "updateTokenBalance()", +"5b6edf78": "DISCOUNT_TOKEN_AMOUNT_T1()", +"5b7121f8": "getMinter(uint256)", +"5b714690": "valueBeforeFeesWereReduced(uint256)", +"5b715ae0": "referralProgrammeWallet()", +"5b7214b6": "m_ETHPriceUpperBound()", +"5b72b9fe": "pushId(bytes32)", +"5b72c3b7": "eraFromMokenData(uint256)", +"5b72cdd0": "estimateBalanceOf(address)", +"5b73024a": "opAddr()", +"5b73b332": "extendTge(uint256)", +"5b7450fc": "isOperable(address)", +"5b752d5d": "getjackpot()", +"5b754491": "transferFromTx(address,address,address,uint256)", +"5b75dd8d": "getSubscription(address,address)", +"5b7633d0": "signerAddress()", +"5b764811": "_jMul(uint256,uint256,uint256,uint256)", +"5b766089": "isCreditor()", +"5b766196": "hasWon(address,uint256)", +"5b767e86": "getArbiter(address)", +"5b791420": "isProxyForSender(address,address)", +"5b7991cd": "extensionsCount()", +"5b79b275": "_currencyToToken(address,uint256,bytes)", +"5b79dbe5": "reserveForTeam(address,address,uint256,uint256)", +"5b7a50f7": "setOldToken(address)", +"5b7a78c8": "test1_overlappingIntervalSameNode()", +"5b7ab891": "BAT()", +"5b7b716c": "tgrSettingsMaxStages()", +"5b7b72c1": "createCloneToken(address,uint256,string,uint8,string,bool)", +"5b7baf64": "claimRefund(uint256)", +"5b7c2dad": "getUserPosition(address)", +"5b7c38ad": "getLLV_edit_22()", +"5b7c569a": "trustedServer()", +"5b7ca9c6": "addPrizePool(uint256)", +"5b7d47a9": "betOnColor(bool,bool)", +"5b7d9043": "creditAccount(address,uint256)", +"5b7da338": "_balanceOf(uint256,bytes32)", +"5b7db24d": "addRemoveCountry(string,string,bool)", +"5b7dc56a": "updateLuckyblockSpend(bytes32,address[],uint256[],uint256)", +"5b7eed81": "T1898Token()", +"5b7f415c": "TOKEN_DECIMALS()", +"5b7fc27f": "getInitializParentUniverseValue()", +"5b7fd9b5": "brands(address)", +"5b806645": "badgeCount()", +"5b80f497": "getAvailableIds()", +"5b814e16": "freezing()", +"5b824208": "changeMinimumTimeBeforeUpdate(uint256)", +"5b82d694": "SetClaimFee(uint256,uint256)", +"5b8315e4": "TokenSCADAEntity()", +"5b833f1e": "nextTokenOwner()", +"5b839dd2": "initBonusSystem()", +"5b83b7f1": "investorExists(address)", +"5b84bb27": "MYTOKENNAME()", +"5b850d92": "PollCreated(address,address)", +"5b859394": "PunkBidEntered(uint256,uint256,address)", +"5b859500": "hardcapInEther()", +"5b863b5a": "ZenomeSale(address,address,uint256)", +"5b86914d": "bet_value()", +"5b869e68": "DeviceAddr()", +"5b86ce97": "buyEggWithToken(address)", +"5b86f599": "increaseBalance(address,uint256)", +"5b8710e5": "checkTransferRequirements(address,address,uint256)", +"5b87a2f2": "confirmreward()", +"5b8807d9": "claimReserveTokens()", +"5b88349d": "claimAirdrop()", +"5b889ab8": "ammount()", +"5b8943ff": "addAffiliate(address,address)", +"5b89a48a": "lockEpochsMap(address,uint256)", +"5b8aa811": "setRequiredParticipation(uint256)", +"5b8ad515": "isUtilityHolder(address)", +"5b8b4f91": "refererAllowed(address,address,address)", +"5b8bcb53": "CappedSale(uint256)", +"5b8be30c": "TheCoinSale()", +"5b8c6b58": "RoundBHardCap()", +"5b8d02d7": "payoutAddress()", +"5b8d8807": "setTokenMinAmountSell(address,uint256)", +"5b8e48df": "swypes(address)", +"5b8fa846": "payDividends(string)", +"5b8fb4ae": "EthKing()", +"5b905b6c": "newProposal(string,bytes32,bytes32,bytes32,string,uint256,uint256)", +"5b90ed39": "emitEscrowUpdated(address)", +"5b91aa6b": "underNumber()", +"5b91fd60": "performTheMagicTrick()", +"5b9248aa": "correctResult(int8)", +"5b9283e7": "isInvalidEarlyPurchase(uint256)", +"5b92cdee": "bountyAffiliateWallet()", +"5b92e548": "CreateCBT(address,uint256)", +"5b93c2bc": "getWinnerAddressList()", +"5b940081": "releasableAmount()", +"5b945c0e": "getLableList()", +"5b947f36": "ItasToken()", +"5b94db27": "nominateOwner(address)", +"5b95f65e": "getAddressesByDocHash(bytes)", +"5b9632ca": "minValue1()", +"5b96c1e7": "oracleMasterCopy()", +"5b980628": "collectFunds()", +"5b984ff6": "enableWithdraw()", +"5b9900ce": "getWeiforTokens(uint256,uint256,uint256,uint32)", +"5b99cb2b": "joinGame(uint256,uint256,bytes32)", +"5b99df7f": "transferWithFee(address,address,uint256,address,address,uint256)", +"5b9a4690": "convertToMiniRYC(uint256)", +"5b9af12b": "addValue(uint256)", +"5b9b0609": "maxContribAmount()", +"5b9b44bf": "startDefinedGame(uint256)", +"5b9eb8ab": "CONVERSION_NUMINATOR()", +"5b9f0016": "stakedBalance()", +"5b9f7cbe": "createNode(bytes32,bytes32,bytes32,address)", +"5b9fdc30": "getSecret()", +"5ba05024": "getInsuranceByAddress(address)", +"5ba0cd78": "BitcoinZ()", +"5ba13abf": "createMulti(uint256,address[])", +"5ba17b2d": "NewtonTree()", +"5ba1a1d4": "viewKarmaVotesBySymbol(string,address)", +"5ba2dd22": "conflictRes()", +"5ba32008": "FDKToken()", +"5ba39782": "getCommentAccounts()", +"5ba3e63e": "MultiSigRules(address[])", +"5ba58955": "beneficiaryBalance(address)", +"5ba5b1b2": "setSoldPreSaleTokens(uint256)", +"5ba67330": "SendDivs()", +"5ba6c017": "setTotalSpentPerDay(uint256,uint256)", +"5ba83c0d": "getMEATime()", +"5ba87a4d": "getWithdrawedToken()", +"5ba88490": "privlocatumICO()", +"5ba88c28": "debug2()", +"5ba8c608": "activePoll()", +"5ba8eb42": "getClearance(address,address)", +"5ba91006": "Sports3D()", +"5ba92d7d": "_freeze(address,uint8)", +"5ba9e48e": "nextPriceOf(uint256)", +"5bab1a63": "totalEthxRecieved()", +"5babb758": "testSetUp()", +"5babe01b": "distributedBountyStakes()", +"5bac1e11": "ReclaimBegun()", +"5bad05bd": "hardCancelOrder(uint224)", +"5bad9fa7": "walletOut2()", +"5badbe4c": "requestCount()", +"5badcd08": "TokenFulfillment(address[2],uint256[7],uint8,bytes32[2],uint256)", +"5badf100": "fireOnChanged(bytes32)", +"5bae2120": "test_doubleVotingFor()", +"5bae3f75": "CategoryAdded(uint256,string)", +"5bae4e98": "getOwnerRating()", +"5bae510d": "deposits(uint32)", +"5bae8c36": "isNewParent(address)", +"5bae9ce9": "blacklisted()", +"5baef4f3": "INCREMENT_RATE()", +"5baf039f": "add(address,address,address,address)", +"5baf4a09": "ausgroupTransfer(address,uint256)", +"5bafecf5": "calculateFloatingValue(uint256,uint256,uint256,uint256,uint256,uint256)", +"5bb0fa46": "RESERVE_EXCHANGE_SHARE()", +"5bb18362": "isReadyToBear(uint256)", +"5bb2b102": "registerNameCore(uint256,address,uint256,bytes32,bool,bool,uint8)", +"5bb31436": "transferKnightOwnership(address)", +"5bb3e5f6": "fixNoCallback(bytes32)", +"5bb41203": "test_oneAssert()", +"5bb447a8": "NOTtoken()", +"5bb47808": "setFactory(address)", +"5bb4df3c": "assignFrom(address,address)", +"5bb59815": "claimWarranty(string,uint256,string)", +"5bb5b917": "insureClient(address,address,uint64)", +"5bb5bb86": "dtGetBuildingData(address,uint256)", +"5bb7cf11": "ERC20(address,uint256,string,uint8,string)", +"5bba11bd": "bonusTicketsPercentage()", +"5bba3307": "splTransferFrom(address,address,uint256,uint256)", +"5bba6a7c": "propagateRequest(address,uint256,bytes32,bytes32)", +"5bba7aa5": "_assignBlocks(bytes16,bytes16,uint8,uint8)", +"5bbb7c42": "CPCEFund()", +"5bbdc7c5": "accrueTeamTokens()", +"5bbe66a7": "lastBlock_a15Hash_uint256()", +"5bbe6790": "Electronero()", +"5bbe8a33": "EGYPTTEST()", +"5bbee518": "investmentETH()", +"5bbf9c94": "arbLocked(address)", +"5bbfd0d7": "mintedGBT()", +"5bbfe9b6": "_myGroupHelper()", +"5bc008a0": "getAccessLevel(address)", +"5bc02d5c": "GooGameConfig()", +"5bc07110": "numArticlesPublished()", +"5bc0b4db": "ONESATOSHIToken()", +"5bc22d1b": "getStart(uint256)", +"5bc24dd3": "changeSubcourtAlpha(uint96,uint256)", +"5bc34f71": "currentStep()", +"5bc4e163": "drainRemainingToken(address,uint256)", +"5bc550fe": "mining(bytes)", +"5bc5c1a8": "getRoundDividendPerBBTHelper(uint256)", +"5bc5cf42": "mocatoken()", +"5bc60cfc": "win(uint256)", +"5bc6d41d": "doDisableSellerCancel(bytes16,address,address,uint256,uint16,uint128)", +"5bc6e107": "GetEscrowCreationDate()", +"5bc72460": "alterBannedStatus(address,bool)", +"5bc7285f": "sumICOStage3USD()", +"5bc789d9": "tokenVault()", +"5bc7e259": "updateRelease(uint32,uint32,uint32,bytes,bool)", +"5bc8a672": "setDetachmentTime(uint256)", +"5bc91b2f": "createRound(uint256,uint256,uint256,uint256)", +"5bc97d73": "Purchase(address,uint256,uint256,uint256)", +"5bca7f38": "set_pre_kyc_iconiq_bonus_numerator(address,uint256)", +"5bcabf04": "baseUrl()", +"5bcafcf3": "ProfitByCard(address,uint32)", +"5bcb2fc6": "submit()", +"5bcbc0f9": "PRICE_DIVIDER()", +"5bcc1072": "addressesToChatMessagesLeft(address)", +"5bcc209d": "getTokenAmountForEther(uint256)", +"5bcc29d7": "setDefaultURIStart(string)", +"5bcc437c": "revokePastDelegations()", +"5bcc7928": "saleType()", +"5bcc8198": "tokenCommissionReceiver()", +"5bcd3dba": "ACAToken(uint256,address,address)", +"5bcf6674": "setMinimumAllowedWei(uint256)", +"5bd1b8c5": "countCars()", +"5bd1f067": "OONE()", +"5bd26361": "sentTokensToPartner()", +"5bd2cc9f": "Notified(address,uint256)", +"5bd4349b": "getTotalGames()", +"5bd475fd": "destTokensDevs()", +"5bd479ac": "SoccerBet(string)", +"5bd489e1": "HelperPortion()", +"5bd54fa3": "setCryptoSagaCardSwapContract(address)", +"5bd5e89c": "decreaseArrivalTime(uint256,uint256)", +"5bd674dd": "gallerySeven()", +"5bd74490": "regProxy(address,address)", +"5bd7b9fd": "Rbank()", +"5bd7c609": "getEtherDiceProfit(uint256)", +"5bd7ebc5": "changeMinInvest(uint256)", +"5bd91213": "TransferKO(address,address,uint256)", +"5bd9279c": "placeBuyNowOffer(uint256,uint256)", +"5bd948b1": "useEIP712()", +"5bd9749c": "initialValidators()", +"5bd9abfb": "CreateTestCoin()", +"5bd9e637": "buyLC()", +"5bd9ea2e": "out5Done()", +"5bda1af0": "startCrowd(uint256,uint256,uint256,uint8,uint8)", +"5bda8fa4": "setSecondTime(uint256)", +"5bdaa6dd": "Token_Price()", +"5bdaeba2": "PausableTokenMock(address,uint256)", +"5bdb280f": "RESERVES_SHARE()", +"5bdb9ddf": "changeStepPricesLimits(uint256,uint256,uint256)", +"5bdc3c53": "setImmigrationCtrl(address)", +"5bdcc165": "batchTrasferByValue(address[],uint256[])", +"5bdcd0b0": "lifetimePayouts()", +"5bdf7b4f": "initilSupply()", +"5bdfaaff": "ASIABITSToken(string,uint8,string)", +"5bdff855": "gettotalCardDivs(uint256)", +"5be0497e": "getAdjacentCells(uint8)", +"5be1d5c3": "buyBlueStarEgg(address,uint256,uint16)", +"5be2aca0": "tokenRegistryAddress()", +"5be4d442": "setTrustedContract(address,bool)", +"5be53284": "GlobaleCash()", +"5be54515": "assignBountryToReferals(address,uint256)", +"5be5d9e3": "XdacToken(uint256)", +"5be5e3ec": "castVote(uint256,uint256,uint256)", +"5be60644": "sendcdd(address,uint256,address)", +"5be62401": "createUserWithProxyAndRecovery(address,address,uint8[],uint256,uint256[],uint256[])", +"5be6affc": "CloverCoin(address)", +"5be6d2eb": "exitPot()", +"5be782d1": "WORLDMOBILITY()", +"5be7cc16": "transferAdminship(address)", +"5be7fde8": "releaseAll()", +"5be80e85": "markCompromised()", +"5be89fac": "dAlterPull(uint96)", +"5be989d1": "CRYPTOBITECOIN(uint256,string,string)", +"5bea05b1": "getUSDBtc()", +"5bea0e1c": "calculateDividend(uint256,address)", +"5bea2941": "LYBT3Token(uint256,string,uint8,string)", +"5bea641a": "change_admin_commission(uint256)", +"5beb1d8f": "currentIcoPhaseMinimum()", +"5beb3f61": "WhitelistedStatusUpdated(address,uint256)", +"5bebe2c6": "getData_32()", +"5bebefdc": "checkForInterest(uint256,bool)", +"5bec1496": "ChangeQuota(uint256)", +"5bec9e67": "infinite()", +"5becf24c": "confirmChannel(uint256)", +"5bee29b7": "retrieveData(uint256)", +"5bee29be": "setSalary(uint256,uint256,uint256)", +"5bef1208": "getModuleIDByHash(bytes32)", +"5bef95a2": "setFiscalVerify(uint256,uint256,bytes32)", +"5befbb9b": "calceth(uint256)", +"5bf042e5": "setTradeAddress(address,address)", +"5bf0cb1f": "isTransferAllowedadv()", +"5bf1f2f8": "numberOfAbilitiesSold(uint256)", +"5bf2a4e9": "contains(bytes32,bytes32)", +"5bf339b1": "DogCore()", +"5bf3a315": "isTrustedContract(address)", +"5bf4063d": "minEthValue()", +"5bf47d40": "bntyController()", +"5bf5c29c": "_createHero(uint256,address)", +"5bf5d54c": "currentStage()", +"5bf608b8": "getBuyer(uint256)", +"5bf6e582": "getAllHpbNodesExtByStageNum(uint256)", +"5bf72bb1": "use_test_data()", +"5bf85c28": "CryptomniumChain()", +"5bf8633a": "nftAddress()", +"5bf95e43": "strategicAllocated()", +"5bf9755e": "setUint256(uint256,uint256)", +"5bfb1dab": "EIP20Token(uint256,string,uint8,string)", +"5bfb8ff2": "getRegistration()", +"5bfbbe39": "_transfer_internal(address,address,uint256,bool,bytes)", +"5bfc61c0": "claimPlot(uint256)", +"5bfd1ab8": "unBlockAddress(address)", +"5bfd8efe": "blockSettlementHash(uint64,uint64)", +"5bfdab26": "queryWithdrawed(uint256)", +"5bfdb8b2": "crowdsaleStartingBlock()", +"5bfdc700": "registerData(address,int256,bytes,address)", +"5bff1aa8": "EOSCToken()", +"5bfface4": "setBuyComission(uint256)", +"5c003af9": "TOKEN_WITHDRAWAL_END_DATE()", +"5c004bcc": "sendFrom(address,address,uint256)", +"5c006f75": "changeHoldByAddressIndex(address,uint256,uint256,uint256)", +"5c00ad5e": "ShowPercent(address)", +"5c0133d9": "filled()", +"5c016b91": "ownerDisablePayee(address,address)", +"5c01943a": "bountiesBalance()", +"5c0252fe": "setOnlineTime()", +"5c025e03": "authorizeOperatorByTranche(bytes32,address)", +"5c0286c0": "changeLOT(uint256)", +"5c0305ec": "EUTBToken()", +"5c042d0f": "BiQCrowdFund(address,address,address)", +"5c044b86": "roundThreeTime()", +"5c04e9f8": "firstXRChangeBlock()", +"5c062d6c": "currentDifficulty()", +"5c06d880": "getRateWithoutBonus()", +"5c071492": "hardCapLow()", +"5c073ac4": "basicTransferTest(address)", +"5c0796fd": "emitUserCreated(address,address,address,address,uint8[],uint256,uint256[],uint256[])", +"5c07993b": "investorInterest()", +"5c07ac94": "changeCrowdsaleRate(uint256)", +"5c084a25": "get_pvn_token_balance(address)", +"5c0a8177": "claimOCDividend()", +"5c0a9b8d": "transferToContractAddr(address,uint256)", +"5c0b51fb": "theList(address)", +"5c0ba18e": "BitBoscoin()", +"5c0c3dce": "setUserList(address)", +"5c0cc07a": "TAXChain()", +"5c0e6166": "Bill(address,string,uint8,string,uint256,uint256,uint256,uint256,uint256)", +"5c0e6bc4": "icoTokenPrice()", +"5c0f82b7": "GetIdByAddr(address)", +"5c0f9a3e": "getStrandGenesisBlockHash(uint256)", +"5c0fc34c": "freedomcryptotoken(uint256,string,string)", +"5c0fed8e": "EOBIToken()", +"5c100cc2": "setPreIcoDiscount(uint256)", +"5c1020f9": "addPhenomenon(string,string,string,string,uint8)", +"5c102782": "reward(address,uint256,string)", +"5c10286a": "auctionsEnabled()", +"5c1098c3": "crowdSaleOverTimestamp()", +"5c109a59": "updateStatus(address,address,uint256)", +"5c10b2e8": "contributionsAddress()", +"5c10cab8": "collected_crowd_wei()", +"5c10ec87": "preSaleDurance()", +"5c10fe08": "proofOfWork(uint256)", +"5c12a0e8": "DroneShop()", +"5c12cd4b": "getPlayer(address)", +"5c12f040": "emergencyWithdraw(bool)", +"5c131d70": "burnMax()", +"5c135535": "gooBalanceOf(address)", +"5c1397de": "signup(bytes32)", +"5c13a439": "checkAccount()", +"5c13d06f": "checkLockedToken()", +"5c13e2b5": "end_ICOs()", +"5c142f2b": "freezeAccountWithToken(address,uint256)", +"5c146b80": "_existCaller(address)", +"5c148b47": "calcClaimableTokens()", +"5c1548fb": "getCollateral()", +"5c164624": "decisionOf(bytes32)", +"5c1671a6": "hasSameArrayLength(address[],uint256[])", +"5c16e323": "__executeOrderInputIsValid__(address[4],uint256[8],address,address)", +"5c1796ef": "sponsored(address)", +"5c17f9f4": "approve(address,uint256,bytes)", +"5c19a95c": "delegate(address)", +"5c1b3a68": "setPrvdWallet(address)", +"5c1b3ca1": "getConfigUint(int256,bytes32)", +"5c1b9377": "TestBNB(uint256,string,uint8,string)", +"5c1b94d1": "publicGetRound()", +"5c1bc695": "addSubDivision(address)", +"5c1d2215": "mintTokensLocked(address,uint256)", +"5c1f71af": "setAllowBurns(bool)", +"5c206c6b": "FreeTokensIssued(address,address,uint256)", +"5c206f41": "finalValue()", +"5c207547": "wantsBusiness(bytes32,bytes32,address)", +"5c20ad9e": "multiValueBatchTransfer(address[],uint256[])", +"5c20c1dc": "distributePuppyCoinSmall(address[])", +"5c20eec6": "twentyThirtyTokens()", +"5c221385": "preciowea()", +"5c221816": "burnAccountMoeny(address,uint256)", +"5c222bad": "getAsset()", +"5c22aaae": "setGameTransferFlag(address,bool)", +"5c2323e7": "authorizedToTransfer(address)", +"5c239e58": "createItemSaleMarkets(uint256,uint256)", +"5c23bdf5": "resolve(bytes32)", +"5c23d56f": "checkInbox()", +"5c242c59": "query1(uint256,string,string,uint256)", +"5c243f03": "GetLengthofList()", +"5c251cbf": "releaseStake(address,bytes32,uint256,uint256,uint256,bool)", +"5c253f52": "o_novo_problema(uint256)", +"5c25e903": "_lockNinja(uint256,uint16)", +"5c261556": "initFrozenTokenMap()", +"5c26a007": "IsEnable()", +"5c272fb2": "Unblocked(address)", +"5c27bbf6": "CryptoCompare()", +"5c27cdc3": "mintTeamTokens(uint256)", +"5c28c7e0": "privateSaleList()", +"5c2930ad": "shareholders(address)", +"5c2a8763": "percentageToReinvest(address)", +"5c2b0287": "BOXSToken()", +"5c2b1119": "getTop()", +"5c2b18e9": "VestingFund(address,uint256,uint256,address)", +"5c2bdc9f": "GainCard2(address,uint32)", +"5c2c2005": "issuePrice()", +"5c2c8db7": "withdrawToAddress(address,address)", +"5c2cc46d": "findResNameByAddress(address)", +"5c2ccaba": "GslStandardToken(uint256,string,uint8,string)", +"5c2d0e53": "KUNAsToken()", +"5c2e7a00": "setTokenBurnFeeProp(address,address,uint256)", +"5c2e7a13": "QuestionStore(address)", +"5c2e891c": "ECAP()", +"5c2eb1ef": "honestisFortbackup()", +"5c2ee908": "updateWinners(address[])", +"5c3004da": "getPpls(uint32)", +"5c30be8e": "callOracle(address,uint256)", +"5c314df0": "MINER_STAKE()", +"5c31f93b": "unpublish()", +"5c320516": "changeAmount(uint256)", +"5c32460b": "isAddress(address)", +"5c328e3d": "getMyAcceptance(address,uint256)", +"5c35b4e1": "exchangers(address)", +"5c35f464": "_modAccountBalance(bytes32,uint256)", +"5c361091": "PeerBetting()", +"5c36901c": "isActive(bytes32)", +"5c36a0bb": "collect(int32,int32)", +"5c36b186": "ping()", +"5c36e11c": "identified(address,address,bytes32)", +"5c37a17c": "saySomething(bytes)", +"5c390f82": "tokenEquivalent(uint256,uint256)", +"5c398d86": "_getHash(address,uint256,uint256,uint256,uint256,uint256)", +"5c39b671": "sendOwnerCommission()", +"5c39c1ab": "collectedAddressesCount()", +"5c39ec58": "addClaim(address,uint256,uint256,bytes,bytes,string)", +"5c3a4c3d": "startRick()", +"5c3c8c87": "putHere()", +"5c3cd827": "allOfferingSupply()", +"5c3cdec8": "getTotalFeeStake()", +"5c3d005d": "demote(address)", +"5c3d6a7d": "setSaleAuction(address,address)", +"5c3dcfde": "listedTokensAsBytes(uint256,uint256)", +"5c3e38ee": "updateMinSpend(uint256)", +"5c3e426c": "adminRetrieveDonations(address)", +"5c3f9765": "endDateClose()", +"5c3ffada": "getPlayerCardIdsForTeam(uint256)", +"5c40329e": "setPresaleTime(uint256,uint256)", +"5c40839f": "GenevExch(address,address,address,uint256,uint256,uint256)", +"5c40f6f4": "setStatus(bool)", +"5c416306": "extractApprovedIndexLength()", +"5c417695": "burnMana(uint256)", +"5c4271c9": "issueDividendRewardBips()", +"5c42d079": "getProvider(uint256)", +"5c4301f2": "multiExecute(address[],uint256)", +"5c435396": "show_the_name_of_Option_D()", +"5c43fce3": "showteam(address)", +"5c44a837": "RemainingTokenStockForSale()", +"5c44c3e5": "addAdv(address,string)", +"5c45079a": "dropToken(address,address[],uint256[])", +"5c45872e": "_addCategory(address,uint256,uint256)", +"5c4633a4": "_revealNumber(address)", +"5c469570": "ReiDoCoinToken()", +"5c473764": "RESERVE_FUND()", +"5c474f9e": "saleStarted()", +"5c475676": "getProposal(uint256,bytes32)", +"5c47e306": "advisorsTokensPercent()", +"5c47ead7": "getParticipantData(address)", +"5c481d8b": "convertToWei(bytes32,uint256)", +"5c492129": "totalGamesPlayed()", +"5c49660a": "privateIcoTokensForEther()", +"5c4978e0": "getCurrentYearGameMiningTokenCap(uint256)", +"5c49d96c": "nTickets()", +"5c4a627f": "totalPreICOAmount()", +"5c4b4c12": "transferPreSignedHashing(address,address,uint256,uint256)", +"5c4bade1": "transferEtherTo(address)", +"5c4bfa10": "buyout()", +"5c4c9f6f": "WithdrawToken(address)", +"5c4d3609": "getTargetDesignatedReportNoShowsDivisor()", +"5c4e10e8": "sendLimitTokensToFounder(uint256,uint256)", +"5c4f4024": "tryRoundEnd(uint256)", +"5c4fb1c5": "comisionGetter()", +"5c5020e7": "setValidatorStake(bytes32,uint256)", +"5c50c356": "getTotalBonded()", +"5c50c63a": "isTokenTransferLocked()", +"5c511a2a": "OrphanWalefareToken()", +"5c5204d6": "changeOwnerTo(address)", +"5c52b434": "Boxicoin()", +"5c52bba7": "countParticipants()", +"5c52c2f5": "resetSpentToday()", +"5c52e51e": "processPayout()", +"5c53ec59": "setReasonableDiff(address[],uint256[])", +"5c54305e": "InsufficientFunds(address,uint256,uint256)", +"5c552879": "bytesToBytes8(bytes)", +"5c552fab": "getMetadataUser(address)", +"5c5557e7": "setKWHForGas(uint256)", +"5c561fff": "removeAllowedTransactor(address)", +"5c56afa3": "priorTokensSent()", +"5c58ad8e": "processDiceBet(uint256,uint256,int256,bytes32,bytes32)", +"5c590683": "SomeRegister()", +"5c5991d4": "token_ratio()", +"5c5a8ad5": "LogBid(address,address,uint256,uint256,uint256)", +"5c5b9f8f": "depositTokens(address,uint256,uint256)", +"5c5ce16e": "NXTokenCoin()", +"5c5d625e": "getProof()", +"5c5dc9a0": "embark(uint16,uint16,uint256)", +"5c5df66a": "setRequiredExpIncreaseFactor(uint32)", +"5c5e0aca": "setGrowingMaxPerDay(uint256)", +"5c5e20b6": "revertAuction(uint256)", +"5c5e274e": "mMaxChainCode()", +"5c5e54c9": "hasBothAttributes(address,bytes32,bytes32)", +"5c5f786e": "s4(bytes1)", +"5c5f7c5b": "setAdvisorsTokensPercent(uint256)", +"5c60da1b": "implementation()", +"5c60f226": "deleteUser(address)", +"5c612167": "newMultiService(address[])", +"5c613a03": "bountyReservedBalanceOf(address)", +"5c617279": "registeredApps()", +"5c61c853": "getProposalIndex(uint256)", +"5c61d628": "changeFundingLimit(uint256,uint256)", +"5c61f9b4": "getBlockResult(uint256)", +"5c6224c9": "Operational(address)", +"5c622a0e": "getStatus(uint256)", +"5c622c09": "getIsSendingLocked(address)", +"5c629788": "totalLevel(uint256[])", +"5c634241": "CanaryV6()", +"5c64bb72": "getCurrentSale()", +"5c658165": "allowed(address,address)", +"5c659bdb": "declareHanged(address,uint256[])", +"5c665f89": "getFunds(address,bool)", +"5c66bd58": "addWeapon(address)", +"5c679f7b": "batchVote(address[],uint256[])", +"5c67a5db": "approvalRatio()", +"5c67ae76": "PRE_COIN_PER_ETHER_ICO()", +"5c67dd1e": "getBlockRoot(uint256,uint256)", +"5c67f7b0": "transferFromTgefund(address,uint256)", +"5c68908b": "CategoryCatalog()", +"5c693657": "setMaxPower(uint256)", +"5c69d5d6": "completeOrder(bytes32,uint256)", +"5c6a0246": "fundsClaimed()", +"5c6a6edd": "bloquear_contrato()", +"5c6ae355": "removeAuthorizeduser(address)", +"5c6baf3d": "createProxyAddressFor(address)", +"5c6bcad4": "transferFromOrigin(address,uint256)", +"5c6bd930": "calculateBonusToken(uint8,uint256)", +"5c6c8903": "Buy(address)", +"5c6cad31": "storeCryptoNames(string)", +"5c6ce321": "RDT()", +"5c6e0ebf": "getScenariosInfo(bytes32,string,string)", +"5c6eb2d2": "atl()", +"5c6eb7ae": "withdrawStock()", +"5c707f07": "setName(string,string)", +"5c714e90": "starterPackPrice()", +"5c71ae10": "EEZOToken()", +"5c71dec8": "FreezeAdmin()", +"5c72b160": "invalidatePendingWithdrawl(uint256)", +"5c72de09": "BONUS_ICO_ROUND3()", +"5c7460d6": "userRegistry()", +"5c752f6b": "incGen0Count()", +"5c7584b9": "isEarlyInvestors()", +"5c75df30": "churn()", +"5c76ca2d": "paidOut()", +"5c770267": "RefundVault()", +"5c7713d4": "CountCow(address)", +"5c77582f": "changeTeamCosts(uint256[])", +"5c778605": "borrowVerify(address,address,uint256)", +"5c78f9e2": "getDepositorsTokens()", +"5c796720": "CurrentIceDelta()", +"5c7a281d": "HugsByMathou()", +"5c7ae6e3": "ethDivsOwing(address)", +"5c7b0288": "gemAttackConversion()", +"5c7b35f8": "resetTokenOfAddress(address,uint256)", +"5c7b79f5": "cashOut(uint256)", +"5c7b9ccf": "BASE_POS()", +"5c7c43fa": "maximumBuyBack()", +"5c7c49c9": "validateKey(bytes32)", +"5c7c9aa4": "checkAccountState(address)", +"5c7cbb0f": "_decode(bytes32,bytes32)", +"5c7d6425": "setPVPEntranceFee(uint256)", +"5c7f3d9a": "hatchMorties(address)", +"5c7f7f63": "getGrantees()", +"5c7fe08e": "PURCHASE_AMOUNT_CAP()", +"5c803f19": "alarmRaised(uint256)", +"5c803f36": "empties(address)", +"5c80461e": "isInStage1()", +"5c80b448": "setMatingSeason(bool)", +"5c810f09": "disableSellerCancel(bytes16,address,address,uint256,uint16)", +"5c812737": "payoutMultiplier()", +"5c8136c2": "retrievedTokens()", +"5c81662e": "internalMint(uint8,address,uint256)", +"5c81b8f9": "MIRCOOToken()", +"5c838081": "getNota(address,uint256)", +"5c852231": "updateSizeBonus(uint256)", +"5c85267b": "PaymentChannel(address,uint256)", +"5c85974f": "setTxLimit(uint256)", +"5c8747cd": "getSoftwareVersionRecords(uint32)", +"5c87e40f": "SignatureCheckerChanged(address)", +"5c88da6f": "getUSD()", +"5c894469": "getPlayersByTrackId(bytes32)", +"5c89c10d": "setBannedCycles(uint256[])", +"5c8a1053": "extend(string)", +"5c8a694e": "FundableToken()", +"5c8a733a": "b32toString(bytes32)", +"5c8b94e7": "applyWithdraw(address,uint256,uint256)", +"5c8c02b3": "getWinnerById(uint256)", +"5c8cb8c0": "DBIPToken(uint256)", +"5c8cf750": "cancelTransaction()", +"5c8d1a6b": "setAtomMoth(uint256,uint64)", +"5c8e7376": "stageEco()", +"5c8f66f3": "getMinAuditPriceLowerCap()", +"5c8fe438": "books()", +"5c908ee5": "DawnX()", +"5c90b9a8": "createRequest(address[3],address,uint256[12],uint256,bytes)", +"5c919aa3": "getDemurrageableBalance()", +"5c91cdfa": "createPenguin(string,uint256,uint256)", +"5c91fa67": "test_3_assertGasUsage200Boards()", +"5c92abfd": "GameVerified(bytes32)", +"5c92e2f6": "castCommit(uint256,uint256[],bytes32)", +"5c9302c9": "currentDay()", +"5c9442a1": "addAdminList(address[])", +"5c97404a": "domainPrice()", +"5c975abb": "paused()", +"5c978499": "checkValidityOfBalance()", +"5c979fe4": "setRegistrar(uint256,address)", +"5c97efd6": "updateIcoStartTime(uint256)", +"5c97f464": "WNTOToken()", +"5c9920fc": "vaultClosed()", +"5c9a7a8b": "getCarType(uint256)", +"5c9b62b4": "comprarSala()", +"5c9c5a6f": "checkGameIndex()", +"5c9cc81f": "getFundDetails(address)", +"5c9d0fb1": "CROWDSALE_ALLOWANCE()", +"5c9d4528": "mainCapInWei()", +"5c9fa6ad": "bidSpread(bytes32,bool,int32)", +"5ca11c34": "minSalePrice()", +"5ca177cb": "LINK(uint256)", +"5ca1bad5": "CallScheduled(bytes32)", +"5ca1c5a0": "getNodeValue(bytes)", +"5ca1cacc": "changeMinEth(uint256)", +"5ca1e165": "getRoot()", +"5ca20102": "_checkPixelUnderRight(uint256)", +"5ca21490": "BitMilleCrowdsale()", +"5ca26ff9": "updateGuPhrase()", +"5ca3400c": "WithBeneficiary(address)", +"5ca3bf76": "setSendErrorValue(address,uint256)", +"5ca48d8c": "tokensLocked(address,bytes32)", +"5ca4d4bb": "disableScriptExecutor(uint256)", +"5ca5b054": "metherToken()", +"5ca5b334": "enableManager(address)", +"5ca6fa4a": "Nostradamus()", +"5ca7f2f0": "LivepeerVerifier(address,address[],string)", +"5ca81139": "createOnDay(uint256)", +"5ca86447": "put(address,uint256,uint256,uint256,uint256)", +"5ca8bc52": "returnIt()", +"5ca8e2ad": "ModultradeStorage()", +"5ca91d7f": "faddress(address)", +"5caa0dec": "currentSeries()", +"5caaa536": "confirmReference(address,uint256,uint256)", +"5caabecf": "transferFromWithReservingNet(address,address,uint256)", +"5cac0176": "MJT()", +"5cac79b2": "LockedCrowdSale(address)", +"5cac8b27": "amazing()", +"5cacd319": "nfcDetails(bytes32)", +"5cacdf29": "testChickenCnt()", +"5cad249c": "getLastWinNumber()", +"5cad7cfb": "getCrowdsaleStatus()", +"5cade372": "payAllOut()", +"5cae7767": "removeTrustedPartner(address)", +"5caed029": "tokenDecimal()", +"5cafbafb": "newMember(address)", +"5caff1a7": "Criptolira()", +"5cb047e8": "toInt(bytes,uint8,uint8)", +"5cb0887c": "contractExists(address,address)", +"5cb0c16f": "totalInCirculation()", +"5cb10016": "offchainSale(address,uint256)", +"5cb1470e": "_createRabbitInGrade(uint256,address,uint8)", +"5cb18a6d": "fipsLegacyRegisterMulti(bytes20[],address,bytes)", +"5cb24756": "unitEthWei()", +"5cb2d86e": "totalBlockContribution(uint256)", +"5cb2ffb5": "updateMinCapEthOnce(uint256)", +"5cb318bf": "unregisterUser(address,address)", +"5cb3ce15": "calculateMemoryState(uint256)", +"5cb4502c": "SCORE_TO_WIN()", +"5cb4f548": "partnerInfo(address)", +"5cb5de63": "recReward(uint256,uint256)", +"5cb603dd": "_getYearIndex(uint256,uint256,uint256)", +"5cb7226d": "prePreIcoStartAt()", +"5cb732be": "refundToken()", +"5cb7dd98": "BlueChipGame()", +"5cb85cd2": "changeCost(uint256)", +"5cb8dd09": "isAllowed(address,bytes32)", +"5cb92dc7": "_enableRefunds()", +"5cb9ceaa": "okAddress(address,address)", +"5cba658f": "setState(address[],uint256[],address,uint256)", +"5cba6caa": "notarizeHash(uint256,string,string,bytes32,string,string,string)", +"5cbaa74b": "canAttack(address)", +"5cbad0b5": "sumHardCapICOStage1()", +"5cbb122c": "transferBctToken(address,uint256)", +"5cbb2ac3": "purchaseTokenPointer()", +"5cbb7caa": "getFriends(address)", +"5cbbdfc9": "currentApplicationEntityAddress()", +"5cbc65b2": "getplayersurplus()", +"5cbc85d0": "returnBounty(uint256)", +"5cbcb302": "pre_ico_allocation()", +"5cbdf177": "emailVerified()", +"5cbe5f8f": "DIV_DIST()", +"5cbee9ba": "releaseLockedTokens(address)", +"5cbf0850": "BTN()", +"5cbfdd8d": "preBuy(address,uint256,bool)", +"5cc15001": "getContent(bytes32)", +"5cc18780": "StabilizationFund()", +"5cc1ad7f": "toTileId(uint8,uint8)", +"5cc2e6aa": "getFirstAuctionsRemainingDuration()", +"5cc2f6d8": "_processPurchaseInWei(address,uint256)", +"5cc3623a": "currentSection()", +"5cc373c7": "TestJ()", +"5cc39659": "preSaleBonus2Amount()", +"5cc3c951": "purchase_with_dai(uint256,address,uint256,uint256,uint256,address,bytes)", +"5cc3f5d7": "Deauthorization(address,address)", +"5cc41dad": "initiateCertificate(bool,string,uint256,uint256,uint256,uint256)", +"5cc422a1": "sumofsquares(uint256,uint256)", +"5cc501ce": "testFailSetNotTransferableNotOwner()", +"5cc52fba": "claimTokensBC(uint8)", +"5cc53bc7": "matchOpponents(uint256)", +"5cc57501": "_computeHeight(uint256,uint256,uint256)", +"5cc5c5cf": "jackpotDifficulty()", +"5cc5ca50": "formulaContract()", +"5cc8a6ed": "PRE_SALE_4WEEK_BONUS()", +"5cc8ce33": "dev_settledBalance()", +"5cc95422": "getVestingReleasedAmount(address,address)", +"5cca3905": "getDeveloperMiningPowerForGameId(uint256)", +"5ccb4f8f": "UmbrellaCoin()", +"5ccb5460": "ethInvestedDuringICO()", +"5ccb54c4": "BGD()", +"5ccbddeb": "IcelandvsCroatia()", +"5ccc3eaa": "roundMoneyUpToWholeFinney(uint256)", +"5ccd2f9b": "_deleteAllPackedRevisionBlockNumbers(bytes20)", +"5cce7dbb": "removeHolderAddress(bytes32,address,address)", +"5ccee1de": "newValidatorSet()", +"5ccf49ed": "isGenome()", +"5ccf9f43": "BonusCrowdsaleMock()", +"5ccfe157": "getDataById(uint8)", +"5cd03621": "periodRound()", +"5cd03a3f": "removeIdArrayItem(address,uint256[],string,address)", +"5cd137b4": "LogDonation(address,string)", +"5cd27e8d": "init3(int256[],int256)", +"5cd2f4d3": "approve(address,bytes32)", +"5cd31795": "HavenToken()", +"5cd31e83": "LastWillContract(address,address[],uint8[])", +"5cd3b917": "numberOfDeployedTokens()", +"5cd3f3a1": "decompress(bytes)", +"5cd42150": "KY8000Token()", +"5cd45e61": "getUuidsSize()", +"5cd48caa": "bet(uint256[],address)", +"5cd50b3f": "quater2()", +"5cd60dad": "add(address,int256)", +"5cd689e6": "sell_label(address,uint256)", +"5cd6bd0e": "getPlayerDividendByStage(uint256,uint256,address)", +"5cd72340": "SetEpochData(address,uint256,uint256)", +"5cd72b15": "setAllowedMultivest(address)", +"5cd7815b": "testInternalCall()", +"5cd7c8bc": "createLastDay()", +"5cd7d478": "isYesWinning()", +"5cd82ee5": "Act()", +"5cd85187": "MIN_ETHER()", +"5cd87c71": "supportsTradingPair(address,address)", +"5cd8d2ad": "buyAndTransfer(uint256,address,address)", +"5cd925cd": "assetSize()", +"5cd96091": "enable_refunds()", +"5cd9814f": "Mybalance()", +"5cda31dd": "GTN()", +"5cda4b41": "checkApproval(address,address)", +"5cdaab48": "previousEpoch()", +"5cdb0798": "burnMemberToken(address)", +"5cdb1bd7": "setRefundPercent(uint256)", +"5cdb88bc": "addClaim(string,string,uint256,string)", +"5cdbd2d1": "Constructor(string)", +"5cdc9eda": "peggedETHUSD()", +"5cdcf33d": "milieurs_per_eth()", +"5cdd7560": "STEToken()", +"5cdd95e3": "MintableToken(uint256,address,bool)", +"5cddb74b": "becomeShitClonelord()", +"5cddd93d": "referalsMinInvestLimit()", +"5cde15b9": "_Application(bytes32,uint256,string)", +"5cde871e": "_depositOrderBalance(uint256,address,address,uint256)", +"5cdf3450": "changeParticipationLimits(uint256,uint256)", +"5cdf76f8": "setServiceFee(uint256)", +"5cdfcd69": "car_expense(uint256)", +"5cdfd08c": "managementFees()", +"5cdfe733": "fastBuyBonus()", +"5ce1d810": "SmartN()", +"5ce22019": "getEtherInContract()", +"5ce2fea1": "CleosContract()", +"5ce308a7": "addEntry(string,string)", +"5ce32aca": "getAirdrop(bytes32)", +"5ce398c4": "Riddle()", +"5ce3dec1": "self_destruct()", +"5ce49fbf": "amountBets()", +"5ce4f8dc": "PoWHrGlass()", +"5ce57b50": "setPenalizedStatus(uint256,address,bool)", +"5ce5ba9b": "queryParent()", +"5ce62aa4": "checkStoredFile(address)", +"5ce7514e": "allowPublicWithdraw()", +"5ce75c7c": "PRESALE_SECOND_DAY_START()", +"5ce7c7e0": "tokenSetCrowdsaleManager(address,address)", +"5ce800ac": "user_off_freeze()", +"5ce8050f": "BuildCoinUtilityToken()", +"5ce83f70": "updateEndsAt(uint256)", +"5ce885ee": "initial_withdrawal(uint256)", +"5ce94328": "balanceOf(uint152)", +"5ce97dbb": "totalAirdrop()", +"5ceaa0bf": "modifyCurrentHardCap(uint256)", +"5ceb8bc8": "isPromoPause()", +"5cebcbf0": "setMaxGamePerBlock(uint256)", +"5cec2054": "dteamVaultAddr1()", +"5cec4cb9": "fundsTokensHaveBeenMinted()", +"5cec5ded": "balanceComisionOf(address)", +"5cecd728": "setWillContents(address,bytes)", +"5cedff32": "takeTokensForBacking(address,uint256)", +"5cee9ea7": "buyNew(uint256,uint256,uint256)", +"5cef51a6": "BdpDataStorage(bytes8)", +"5cf00394": "getResoPeriod()", +"5cf054f8": "SetRewAddr(address)", +"5cf0769c": "ETHERCOIN()", +"5cf1469d": "addPayout(uint256,string)", +"5cf28fa4": "minDai()", +"5cf29ecf": "forOwner()", +"5cf2befc": "getEthAddressesLength()", +"5cf2f261": "ProofOfBitconnect()", +"5cf3125c": "NASDAQ()", +"5cf34bcf": "getMinFee()", +"5cf3508a": "whiteListControllerAddress()", +"5cf38f24": "togglePlotBlockedTag(uint256,bool)", +"5cf3cd96": "payNode(bytes32,bytes32)", +"5cf3d346": "names(address)", +"5cf469ca": "tokenPreSaleCap()", +"5cf4ee91": "getPrice(uint256,uint256)", +"5cf5ad2e": "registerNameCore(uint256,address,uint256,bytes32,bool)", +"5cf5e386": "guardian2()", +"5cf6040b": "ERC20Token(uint256,uint8,string,string)", +"5cf6208a": "oraclizeTimeTolerance()", +"5cf625f0": "OffChainManagerImpl(address,address)", +"5cf6a536": "InternetWall()", +"5cf6a763": "receiveApproval(address,int256,address,bytes)", +"5cf858aa": "TOKEN_ESCALE()", +"5cf89f1e": "setDateRelease(uint256)", +"5cf8ca60": "isCase(uint256)", +"5cfa353a": "updateTotalGasCost(uint256)", +"5cfae3ba": "UNPC()", +"5cfaf2ef": "setNameTAOPositionAddress(address)", +"5cfb4aa4": "getMessageTimestamp(uint256)", +"5cfbcdbb": "committedEther()", +"5cfc1a51": "capacity()", +"5cfc53c1": "calculateForValue(uint256)", +"5cfc6432": "EcosystemPart()", +"5cfd5f89": "product4_pot()", +"5cfd8c24": "ResetPonzi()", +"5cfe237a": "TCGC(address)", +"5cfe585a": "calcDisputeEnds()", +"5cfea6fb": "TokensPerWei()", +"5cff876b": "carrotsCaught()", +"5d000c07": "getFreeFuck()", +"5d004e85": "getCommentsCountByAd(uint256)", +"5d01615f": "queryFusionData(uint256)", +"5d01b261": "_placeBet(uint256,address)", +"5d0213f7": "transferTokenOwnerShip(string,address)", +"5d029d1e": "indexedByTag(bytes32,uint256)", +"5d02b2f7": "hasPresaleEnded()", +"5d03147a": "ownership()", +"5d0341ba": "approvals(address)", +"5d036c8b": "payEther(address[],uint256[])", +"5d0413d1": "calculatePlotPrice()", +"5d04af9c": "iMMCoinbuyPrice()", +"5d064bab": "MoreGainCoin(uint256,string,string)", +"5d068051": "sendFees(address)", +"5d06a05c": "lockupAccounts(address[],uint256,uint256)", +"5d0792b7": "minimumInvest(uint256)", +"5d0808f2": "listedMartialsLength()", +"5d08225e": "getGidOfId(uint64)", +"5d088fc6": "changeRandomFight2DeathContract(address)", +"5d08c1ae": "salePaused()", +"5d09e625": "setMustSkipFee(address,address,bool)", +"5d0a740a": "GetSeries()", +"5d0a7628": "lockPresaleBalances()", +"5d0ad8d0": "testFail_set_owner_unauth()", +"5d0b4e5c": "isTradeFeasible(address,address,uint256)", +"5d0b6774": "counterFor(address)", +"5d0be9de": "softWithdrawRevenueFor(address)", +"5d0c0161": "IXCASHToken()", +"5d0cb15d": "TOKEN_SALE_SUPPLY()", +"5d0dd712": "bet_amount()", +"5d0e550a": "safetyModeOn()", +"5d0ef098": "burnUnsoldCoins()", +"5d0f4ee0": "isChampionAccount(address)", +"5d108ca2": "TokenChanged(address)", +"5d109aea": "maxResult()", +"5d10a60d": "createPost(string,string,bytes32)", +"5d113b03": "PayWinners(uint256,address)", +"5d121289": "addPreSaleEndDate(uint256)", +"5d123014": "setGameTax(uint8)", +"5d12ace4": "playGame(uint256,uint256,uint256)", +"5d12fc0c": "ONE_BILLION()", +"5d14076c": "lowercaseString(string)", +"5d145c5b": "setIcoTimeStartEnd(uint256,uint256)", +"5d14f925": "Invested(address,uint256,uint256,string)", +"5d15001e": "SupplyOp(uint256,uint256,uint256)", +"5d15b46a": "emitSkillCategoriesSet(address,uint256,uint256)", +"5d161310": "DataMining()", +"5d161c3f": "useAbility(uint256)", +"5d16a6f9": "lockedBalances(address,uint256)", +"5d16b8de": "take_back_money()", +"5d183b60": "supplyRound2()", +"5d184107": "AddCategory(string)", +"5d19212e": "markUserAsFounder(address)", +"5d19606e": "transferIssuer(uint256,address)", +"5d19a99f": "isLimitReached()", +"5d1a3b82": "getOutcome(bytes32)", +"5d1b45b5": "getEntityCount()", +"5d1b56c4": "TestUser(address,address,address,bytes32)", +"5d1bd962": "getArrayValue(uint256)", +"5d1be4e5": "deathData_f14()", +"5d1be58e": "pecunioToken()", +"5d1c01e0": "signedApproveAndCallCheck(address,address,uint256,bytes32,uint256,uint256,bytes32,address)", +"5d1c3171": "luck()", +"5d1c985b": "setReceivers(address,address,address)", +"5d1ca631": "getId()", +"5d1ce03f": "tokensRaisedDuringRound(uint8)", +"5d1e2d1b": "split(address,uint256)", +"5d1edfa0": "checkContributedETH(address)", +"5d1f8098": "RoshaanCoin()", +"5d200f84": "GetPlayer(uint256)", +"5d201596": "getCategoryInfo(address,uint256,uint256)", +"5d202249": "totalCollectedETH()", +"5d204869": "slice(bytes,bytes,uint256,uint256)", +"5d208872": "setTimesEnabled(uint8,bool)", +"5d216562": "changeLockTransfer(bool)", +"5d2195dc": "getToBalance(uint256)", +"5d2230d7": "numfails()", +"5d2247a5": "stakeAirdrop(uint256,bytes)", +"5d228eb0": "getProviderDetailFields(uint256)", +"5d22a352": "manualWithdrawToken(uint256)", +"5d22e222": "BTCAir()", +"5d2392d6": "latchContract()", +"5d239d3e": "getSlice(uint256,uint256)", +"5d240c58": "addExperience(uint256,uint256)", +"5d2434ec": "transferFromTangibleassetdisbursementfund(address,uint256)", +"5d25cccc": "createVesting(address,uint256,uint256,uint256,uint256,bool,address,uint256)", +"5d25d021": "withdrawForeignTokensMultiple(address,address[],uint256)", +"5d267042": "PointlessToken()", +"5d268629": "Refund()", +"5d2694da": "BlackPearlETH()", +"5d270cdc": "setExpectedRate(address)", +"5d272468": "isLiquid()", +"5d27976a": "Final(string,string,uint8)", +"5d27bff3": "registerWithEncryption(string,string)", +"5d27e9a6": "SEPARATOR()", +"5d281384": "_isValidSignatureAndMethod(address,address,bytes)", +"5d285eca": "preICOspecial()", +"5d29206b": "createTokenEscrow(address,uint256,address)", +"5d293581": "ApplyForCertification(string,string,string,string,uint256)", +"5d2946f5": "futDevAddr()", +"5d295f67": "maxDGAME()", +"5d2973cd": "applyVIPLevel(address,uint256)", +"5d29bd40": "rollThree(address,uint8,uint8,uint8)", +"5d2a5d3d": "sentPreSaleTokens()", +"5d2a70a8": "getActualFee()", +"5d2a9b6a": "_randomIndex(uint256,uint8,uint8,uint8)", +"5d2aa757": "getSides(string,uint256)", +"5d2b811d": "getLastRegisterDate()", +"5d2bafed": "gee()", +"5d2c0af2": "Invest(address,bool,uint256,uint256,uint256)", +"5d2c53a7": "withdraw_funds(uint256)", +"5d2cce82": "LemonsDroppedToTheWorld()", +"5d2d5c37": "registered(string)", +"5d2dc5fa": "FraCoinAuct(string,uint256,address)", +"5d2dec87": "PRNG(address)", +"5d2fea9d": "reissuedTransactions(uint256)", +"5d302ba1": "UpgradeAgentEnabledToken(address)", +"5d306f34": "getRefundAmount(address)", +"5d307c6f": "giveToVoter(uint256,uint256)", +"5d3171d9": "transferFromPrivileged(address,address,uint256)", +"5d31c3bc": "deliveryApprove(address)", +"5d3235bd": "NutrioCoin()", +"5d3278f0": "LooneyFifty()", +"5d337b01": "largeSize()", +"5d3458ea": "DolToken()", +"5d346bd6": "addSaleOwner(address)", +"5d34b70c": "LavaDeposit(address)", +"5d354b4d": "foundingTime()", +"5d355804": "endPtopDeposit(address,address,bytes32)", +"5d359fbd": "transfer(address,uint64)", +"5d35a3d9": "approve(uint256,uint256)", +"5d3601d2": "_isRegularAddress(address)", +"5d36a791": "PartyToken()", +"5d36d182": "recycle(address,uint256)", +"5d37c840": "level_4_amount()", +"5d383eaa": "registerTokenPayment(address,uint256)", +"5d385031": "getCustomerTxOrigMcwTransfer(address,bytes32)", +"5d3899af": "place_to_push(uint256,bytes32)", +"5d397767": "publicBattlepm1()", +"5d3a08d7": "setNodePhases(address)", +"5d3a1f9d": "setText(string)", +"5d3a5e3b": "teamTokenAddress()", +"5d3a70f9": "YayyyToken()", +"5d3aac49": "PublishInterfaces()", +"5d3afb19": "CNYB()", +"5d3b2f37": "getNextGameId(address)", +"5d3bb19e": "XXXXXXXX09()", +"5d3c1d4c": "_getRequest(uint256)", +"5d3c7c9b": "AGASCrowdsale()", +"5d3c81a5": "feeWithdrawTokenAmount(address,uint256)", +"5d3ca4ab": "lotteryReinvest(string,uint256)", +"5d3cd79f": "endPrivateICO()", +"5d3d08a8": "cancelExchange(uint256)", +"5d3e64bf": "ttlPlayers()", +"5d3f4fe4": "withdrawMyTokens()", +"5d3fdd19": "updateDiscount(uint256)", +"5d40124e": "YunJiaMi(address,address,address,uint256,uint256,uint256)", +"5d40533f": "AnemoiToken()", +"5d40c0ae": "createAccessorySeries(uint8,uint32,uint256)", +"5d41363f": "rateRound1()", +"5d416cc2": "setIsTokenCanBeBuy(bool)", +"5d41dd6f": "ExampleToken(address[])", +"5d42513b": "test_withdraw()", +"5d428e08": "addTrader(address)", +"5d4293a0": "hatchPoohs(address)", +"5d439cf3": "transferEvent(address,address,uint256)", +"5d43e769": "batchTransfer(uint256,uint256[])", +"5d444ffb": "minMintingPower()", +"5d4453ba": "getGuess(address,uint8)", +"5d449d7d": "refererFeePercent()", +"5d44b508": "calculateRewardToWithdraw(uint32,address,address)", +"5d450bab": "setJobRating(address,uint8,uint256)", +"5d451a9a": "Wallet8()", +"5d4521dd": "updateWeedTotal(uint256,uint16)", +"5d452201": "ico()", +"5d4559ca": "get_coins_count()", +"5d45b4a7": "increaseMonthlyTransactionVolumeSending(uint256)", +"5d461de5": "sendAmount(address,uint256)", +"5d4626f6": "getInvoiceStatus(bytes32)", +"5d468d38": "releaseAuctionEnded(uint256)", +"5d469b74": "redeemUnderlyingInternal(uint256)", +"5d47762d": "Member_AssingTokensToProject(uint256,uint256)", +"5d47f4f2": "CanHandleAuth(address)", +"5d484e17": "StaticEthAvailables()", +"5d485e5d": "_hostContent(address,bytes32,string,string,string)", +"5d495aea": "pickWinner()", +"5d49705b": "getEmployer(address,uint256)", +"5d49719d": "SHA3_512()", +"5d49c199": "finishPreSale2()", +"5d4a8f74": "ATTRToken()", +"5d4aaf1c": "registerWithUserAgreement(address,bytes32)", +"5d4befc0": "emitSynthAdded(bytes4,address)", +"5d4c5cca": "participantsForPreSale(address)", +"5d4d061e": "keyValueStorage()", +"5d4dda72": "DirectInput()", +"5d4e1e5c": "substract(uint256,uint256)", +"5d4f012b": "tgeCurrentStage()", +"5d4f30e7": "get_address(address)", +"5d50601b": "getsumdata1(bytes32)", +"5d506a2e": "minPotSum()", +"5d51b550": "haltCrowdsale()", +"5d52fe64": "buyRemaining(address)", +"5d54322d": "canPurchase(address,uint256)", +"5d5483b3": "WatchAppliedFeePercentage()", +"5d54cb1f": "is_transfer_allowed()", +"5d54e612": "whitelistAll()", +"5d552c72": "BasicToken()", +"5d5576f8": "renounceCapper()", +"5d56550a": "buyCore(address,uint256,string)", +"5d5655dd": "BOOKIE()", +"5d567259": "bobMakesErc20Deposit(bytes32,uint256,address,bytes20,address,uint64)", +"5d56e0a4": "developerMiningPower()", +"5d57135a": "KEBABER_TO_MAKE_1KEBAB()", +"5d582870": "requestInvestment(uint256,uint256,address)", +"5d585176": "GolemSupply()", +"5d586bfd": "deposit(string,address,uint256,string)", +"5d59072a": "OFFICAL_VOTING_DAY_OF_MONTH()", +"5d593462": "init(address,address,string,string,uint256,uint256)", +"5d5a1614": "STQCrowdsaleTestHelper(address[],address,address,address)", +"5d5aa277": "tokenSaleContract()", +"5d5b35f3": "dividendsTotal()", +"5d5b82fd": "Blockjack(address,address)", +"5d5b9021": "acceptTradeOffer(uint256)", +"5d5b92b1": "teamOneSharePrice()", +"5d5bc4cb": "BetOnRed()", +"5d5c3011": "ctyCoin()", +"5d5c606f": "DAOPolskaTokenICOregulations()", +"5d5d4fab": "TACTICALCRUISER_EXTRACTION_BASE()", +"5d5e22cd": "transferFromWithSender(address,address,address,uint256)", +"5d5e507b": "create_price()", +"5d61dd5a": "removeSingleAddressFromWhitelist(address)", +"5d62917b": "pickWinners(uint8,address,address,address,uint8,uint8,uint8)", +"5d63b758": "minAcceptedETH()", +"5d63b77c": "divideSafely(uint256,uint256)", +"5d644069": "request_face_proof(string,address)", +"5d6470a4": "STAGE_1_TIME()", +"5d64aa68": "dragonIndexToOwner(uint256)", +"5d651b62": "TimeLockSendCreated(address,address,uint256,address)", +"5d6542af": "way()", +"5d65432d": "IndorsePreSale()", +"5d65c37b": "Assessment(address,uint256,uint256,uint256,uint256)", +"5d666d3c": "getRurus(string)", +"5d667464": "usePrecompiledContracts(bytes32,uint8,bytes32,bytes32)", +"5d66ccf0": "updatePerSell(uint16,uint256,bool)", +"5d66d73f": "notarizeHash(uint256,string,string,uint256,bytes32)", +"5d671fc0": "switch_period()", +"5d6720b4": "getFreeMineral(address)", +"5d67830a": "doLogFighter(uint32,uint256,uint256)", +"5d685185": "periodITO_softCapInWei()", +"5d68564e": "ZontoToken()", +"5d6952d7": "changeSaleStartBlock(uint256)", +"5d69864e": "Bitscors()", +"5d69d600": "presold()", +"5d69f16f": "offerAsSacrifice()", +"5d69f68c": "getVotersName()", +"5d6af2af": "getOffChainRootAddress()", +"5d6b2f26": "destroyAllTokens()", +"5d6b70ae": "getSignedTable()", +"5d6b7798": "BCQ()", +"5d6c3ea7": "mined_coin_supply()", +"5d6c8e10": "getDHash(bytes13)", +"5d6cb67e": "ecosystemTokenSupply()", +"5d6cdfae": "EthereumPot()", +"5d6ceeb5": "returnMoneyToBuyers()", +"5d6d2992": "ownFiles(address,string,string)", +"5d705fe2": "MBCashSupply()", +"5d711db1": "get_candidates()", +"5d718818": "getHolderCountryCode(bytes32)", +"5d71cf46": "spendableAllowance(address,address)", +"5d723298": "PartialPayment(address,address,uint256)", +"5d728582": "hasAuthoritySignedSideToMain(address,bytes)", +"5d72b30d": "changePlayerName(uint256,string)", +"5d73e2bf": "startPlay(bytes32,uint8,bytes32,bytes32)", +"5d740d62": "YFJToken()", +"5d751443": "updateWebappMinBalance(uint256)", +"5d760b45": "forceWithdrawPayments(address)", +"5d766d35": "INITIAL_GLOBAL_DAILY_SUPPLY()", +"5d76a039": "PresaleReStarted()", +"5d771933": "BOUNTY_SUPPLY()", +"5d777893": "GetPlayers(uint8)", +"5d77aec8": "receiver3()", +"5d77d8d0": "getBlacklist(address)", +"5d78650e": "getAccountData(address)", +"5d796c05": "mintAuditCancel(address,address)", +"5d79eda7": "Digixbot(address)", +"5d7a6b10": "nextDerivativeTokenScheduled()", +"5d7b0758": "controllerMint(address,uint256)", +"5d7c3ad2": "ICO(address,address,uint256,uint256,uint256)", +"5d7c3b78": "costructor()", +"5d7c829d": "_messageToRecover(address,uint256)", +"5d7cf3e2": "Meltdown(uint256)", +"5d7e6b8d": "Schengencoin()", +"5d7e7219": "setFeeFor(address,uint128[2])", +"5d7e8c15": "ethToCents()", +"5d7e994a": "RewardStart()", +"5d801ec4": "SetmaxTokens(uint256)", +"5d80effc": "TimeBonusPricing(uint256[])", +"5d80f643": "Kujira()", +"5d818e6b": "recordDeal(uint256,address,uint32,uint32,bool,uint256)", +"5d81b206": "P3NGCT_v1(uint256,string,string)", +"5d8214db": "lastFactChangeValue()", +"5d8227e6": "FactoryBase(string,string,string)", +"5d82ddc8": "freezeEnabled()", +"5d8302f2": "CrypTollBoothToken(uint256,string,uint8,string)", +"5d831ca1": "FUT5()", +"5d8749ed": "workStages(uint256)", +"5d878b4f": "isInWhitelist(uint256,address)", +"5d88383e": "retrieveEth(address,uint256)", +"5d891d12": "foundersTokensWalletMaster()", +"5d895dac": "parse(string,uint256)", +"5d89c01a": "getCatIds()", +"5d8a776e": "award(address,uint256)", +"5d8aef9f": "_calculateLockedBalance(address,uint8)", +"5d8bc2a8": "assertEq12(bytes12,bytes12,bytes32)", +"5d8c5b87": "orderPlace(address,bool,uint256,uint256)", +"5d8ca2ac": "getApprovalsFor(address)", +"5d8d1585": "getUserInfo()", +"5d8d2904": "setKeyPermissions(bytes32,bool,bool,bool)", +"5d8d4415": "rawUseName(bytes32)", +"5d8dd304": "founderTokensAvailable()", +"5d8e0c2c": "isManualTradingAllowed()", +"5d8e7376": "DAOBalanceSnapShot()", +"5d8e772f": "gameCore(uint256,uint256,uint256,bytes32)", +"5d8f2640": "store(bytes32,bytes32,bytes32)", +"5d8f3b76": "createPercentageRequest(uint256)", +"5d90df32": "TRONIX()", +"5d9169f0": "ICO(address,address,address,address)", +"5d91e27b": "MVM24PeriodsCapUSD()", +"5d92e5d2": "ipyh()", +"5d946afa": "trashed(address)", +"5d94e35c": "contractRefundStarted()", +"5d94f108": "platformLogout(address,uint256)", +"5d956b3e": "changeGroveAddress(address)", +"5d95738b": "vHasVoted(uint256,address)", +"5d95a08b": "MizuCoin()", +"5d969f8f": "updateCustomerACC(address,address,address)", +"5d96ec65": "setAdministrator(address,string,bool)", +"5d975d70": "mx(bytes32)", +"5d977c02": "withdrawalFor(uint256,uint256)", +"5d9796eb": "WELTCOIN()", +"5d989a0c": "NyronChain_Crowdsale()", +"5d98d9ee": "ChannelCreated(string,address)", +"5d98fd9f": "Presale(address,address)", +"5d990791": "getDenominationByIndex(uint256)", +"5d99e02f": "myPinerTokenTest1()", +"5d9adc94": "withdrawPendingTransactions()", +"5d9c4f0f": "getFeeRecipient(address)", +"5d9d595c": "sendWingsRewardsOnce()", +"5d9d5b9a": "CreatedCAT(address,uint256)", +"5d9d8dd9": "makeupShiny(uint256)", +"5d9dacb5": "OPEN_VOTE_PERIOD()", +"5d9ec210": "signTransaction(uint256)", +"5d9fa6fc": "getContractBal()", +"5d9fd8b0": "listPersons()", +"5da01a5b": "configure(bytes32,bytes32,uint256,uint256,uint256,address)", +"5da03ff8": "EthergotchiOwnershipV2(address)", +"5da05e2e": "setCoinLimit(uint32)", +"5da08c42": "createSeedTeam(uint8,uint256[9],uint256[9])", +"5da0a987": "Run()", +"5da12d50": "Oduwacoin()", +"5da24f90": "closeTimer()", +"5da34093": "bonusRemain()", +"5da3d3d2": "minHEXCap()", +"5da47721": "getVIPLevel(address)", +"5da4a1d3": "setPercentage(uint256)", +"5da54cee": "DragonCrowdsale()", +"5da5a9b1": "ownerUpdateMinMaxNumber(uint256,uint256)", +"5da5f5ab": "Distribution()", +"5da6628a": "transferExt(address,uint256)", +"5da6bf67": "movePlayer(uint8[176],uint8,uint8,uint8)", +"5da6c04d": "getFeesOwedToOperator()", +"5da6c418": "burnMintFrom(address,uint256)", +"5da6e035": "_openAndJoinCDPWETH(uint256)", +"5da6ec5b": "t8exToken()", +"5da85a16": "setCEx(address)", +"5da888aa": "ChainKeyToken()", +"5da89ac0": "weiRefunded()", +"5da96520": "transferTeam2Tokens(address,uint256)", +"5da9781b": "readUint256s(bytes32[])", +"5da99f5e": "upgradeCardDamage(uint256)", +"5daa0c37": "referrerLinkedSales(bytes32)", +"5daa87a0": "Initialized()", +"5daab236": "runIco()", +"5dab2e0f": "left82(uint256)", +"5dac1601": "SimpleStablecoin()", +"5dac48bb": "approvePreSignedHashing(address,address,uint256,uint256)", +"5dac5682": "removeAuthorization(address,address)", +"5dac7044": "checkHardCap(uint256)", +"5dacf084": "THACO2()", +"5dada964": "expectedRateContract()", +"5dadf485": "takePosition(uint256)", +"5dae4e50": "makeItRain()", +"5daf08ca": "members(uint256)", +"5daf7514": "redeemTokens(uint256,uint256,bytes32[])", +"5daf8a71": "DestroyToken(uint256)", +"5db07aee": "mintFeeDenominator()", +"5db09db5": "getSplitPotAsFixedPointForGameId(uint256,bool)", +"5db17dab": "CDTToken(uint256)", +"5db2a233": "awailableDividends(address)", +"5db30bb1": "getMaxTotalSupply()", +"5db38c63": "nDemocs()", +"5db39a1e": "totalFails()", +"5db39d74": "HayaCoin()", +"5db3f963": "registerSimple()", +"5db3ffa5": "getUBetCheck(address,address)", +"5db42841": "createContractGameItem(string,uint256)", +"5db46961": "proxyExchange(address,uint256,string,bytes32)", +"5db4cd21": "ir()", +"5db524ad": "finishDividends()", +"5db5301f": "unsubcribe(address)", +"5db5d1fb": "startTimeTLP2()", +"5db5fc24": "alterInitialPricePerShare(uint256)", +"5db62dab": "getBalanceForUser(bytes32)", +"5db6687b": "Dev_TokenReleased()", +"5db6a31f": "transferBroker(address,uint256,uint256)", +"5db7ef3d": "intoverflow_mul(uint256)", +"5db8e202": "evaluateProposalAction(uint256)", +"5db8f084": "getNeighbourReward()", +"5dbb0ef8": "TuZaiCoin(uint256,string,uint8,string)", +"5dbbd139": "CentraSale()", +"5dbbfc47": "getMaxLoss(address)", +"5dbc374f": "UBCoin()", +"5dbe47e8": "contains(address)", +"5dc10a45": "whitelistMultiForTier(uint256,address[],uint256[],uint256[])", +"5dc11a89": "setNumTicks(uint256)", +"5dc1ba1b": "closeLotteryAndPickWinner()", +"5dc1bb52": "removeLocked(address,uint256)", +"5dc1c79d": "KANYE()", +"5dc2157d": "getBalancesOfAddress(address)", +"5dc22cce": "attackPlayer(address)", +"5dc2944a": "ratesForCurrencies(bytes4[])", +"5dc3d02d": "rc5()", +"5dc43f6e": "AddAuthority()", +"5dc49bf8": "SellENSCreated(address)", +"5dc4d8a6": "proposalTarget(uint256)", +"5dc4dcd1": "TicketPurchased(address,uint256,uint256,uint256,uint256)", +"5dc54308": "KickSportsManager()", +"5dc5aefe": "startIncentiveDistribution()", +"5dc6bfe4": "distributeLRN(address[],uint256)", +"5dc6f3df": "registerNameCore(uint256,address,bytes32,bool,bool)", +"5dc70cda": "_shareToPreviousOwner(address,uint256,uint256)", +"5dc774d7": "DrawingPrintToAddress(uint256)", +"5dc77e26": "andThen(string,address)", +"5dc824b9": "voteNoLock(address,uint256)", +"5dc86b85": "adminGetAmountAddressDial(address,address)", +"5dc94af6": "getTokensTotal()", +"5dc96d16": "burnEnabled()", +"5dca53d3": "right30(uint256)", +"5dcb6774": "_createBid(address,uint256,address,address,address,uint256,uint256)", +"5dcb71f2": "yoshicoin()", +"5dcb98c4": "CPO()", +"5dcbac7a": "registerBytes(address,bytes)", +"5dcbc01e": "addSellTokensRequest(string,string)", +"5dcbd8bb": "setLimit(uint16,uint64)", +"5dcc6dbc": "spawnAxie(uint256,address)", +"5dcd967d": "ndc()", +"5dcdddd1": "testSafeToAddFix()", +"5dce431b": "addGame(address,uint256)", +"5dce9948": "getTranscoder(address)", +"5dcf1b77": "fileMerkle(bytes32[],uint256,uint256)", +"5dcf451b": "CoinDogToken()", +"5dcf7c8c": "proxies(address,uint256)", +"5dd18a22": "setItemsNotForSale(uint256[])", +"5dd19463": "angelFoundationAddress()", +"5dd283cb": "pickSmallWinner()", +"5dd284e3": "getAllGoldTransactionsCount()", +"5dd39c12": "SOD()", +"5dd4599a": "usersCanTrade()", +"5dd48b04": "PURCHASE_PREMIUM_RATE()", +"5dd4a65f": "lookup(address,bytes32)", +"5dd588df": "isAuthorizedToTransferFrom(address,address,address)", +"5dd672ec": "latestBid()", +"5dd68acd": "setAddresses(address,address,address,address,address)", +"5dd68f36": "getTotalInvest()", +"5dd871a3": "canMint(uint256)", +"5dd8e1d5": "kek()", +"5dd8eb50": "rate4()", +"5dda837f": "mineBalance()", +"5ddae283": "transferRegistrars(bytes32)", +"5ddaf07f": "StarbaseToken(address,address,address)", +"5ddb2585": "icoStartTimestampStage4()", +"5ddb8a2e": "sendBonusTokens(address[],uint256[])", +"5ddbc632": "setHardCapToken(uint256)", +"5ddc98ba": "updateKYCWallet(address)", +"5ddd81b0": "firstPeriodCap()", +"5ddd8248": "setBurnerOwner(address,address)", +"5dddea66": "updateState(uint256,uint8,uint256)", +"5dde2066": "addBlocks(uint256,bytes,uint256[])", +"5ddf2998": "setOwnerValidatorAddress(address)", +"5de01497": "ownerWithdrawERC20Token(address,uint256)", +"5de047d3": "existPlatform(bytes32)", +"5de0e689": "startPromotion()", +"5de270c5": "adminFixCurve(uint32)", +"5de28ae0": "getStatus(bytes32)", +"5de2a21b": "onIncreaseApproval(address,address,uint256)", +"5de3ba97": "getAllIdentifiers()", +"5de40f30": "innerContract()", +"5de4381b": "_addItemToParent(bytes32,bytes32)", +"5de4c6fc": "lock(address,bool,uint256[],uint256[])", +"5de4ccb0": "upgradeAgent()", +"5de52fb7": "TakeMyEtherTeamAddress()", +"5de6dc55": "getTokensOfOwner(address)", +"5de6f040": "unlockFundrBal(bool)", +"5de7e350": "getTokensFromAddressEmits(address,address)", +"5de81534": "getEditionsCount(uint256)", +"5de910bc": "subSegmentation(address,uint256,uint256,uint256)", +"5de924bf": "DeepCoinToken()", +"5de97c8d": "setIntervalTimeAdjust(uint8)", +"5dea186c": "accept_relayed_call(address,address,bytes,uint256,uint256)", +"5dea19f5": "getHolderExternalIdByAddress(address,address)", +"5deab0ec": "grantLoanOwnership(bytes32,address,address)", +"5deb2cec": "fundsRecord(address,uint256)", +"5debb827": "SCFToken()", +"5debc7af": "get_tokenTime()", +"5dec18d4": "motto()", +"5dec74f8": "_finishTheBattle(uint256,uint256,uint256,uint8)", +"5dec7d49": "Transaction(bytes32,bytes32,address,bytes,bytes32,bytes32,address,bytes,bytes32,uint256,uint256,bytes)", +"5ded0235": "iRide()", +"5ded1865": "getCategoryProducts(address,uint256,uint256,uint256,uint256,uint256,bool)", +"5dedd9cc": "resetWinners(uint256)", +"5dee2492": "AIR_2_SUPPLY()", +"5deeab39": "freeTokensIssued()", +"5deeffb2": "getSoftcapReached()", +"5def5814": "getByDistrict(uint256)", +"5defaec6": "createVirtualAddress()", +"5defe3d9": "grantAccessDeposit(address,address)", +"5deff965": "getEtherum()", +"5df285c8": "getBonusTokens(uint256,uint256,uint256)", +"5df29b4f": "settleBetUncleMerkleProof(bytes20,bytes20,uint40)", +"5df2df2f": "multiSendTokenComplete()", +"5df34ff2": "buyMintingAddress(uint256,uint256)", +"5df350ee": "setStableCoinAddress(address,address)", +"5df3bdb9": "ABRATOKEN()", +"5df3d87e": "bet1()", +"5df58352": "calculateScoresIfCellIsBought(address,address,uint256)", +"5df5f96f": "initialize(address,uint256,uint256,uint256,uint256,address)", +"5df607f0": "getMyEntry()", +"5df60977": "updateFrozenAddress(address)", +"5df6461d": "LOTTERY_FUND_SHARE()", +"5df6a6bc": "unbond()", +"5df70904": "giveToken(address,uint256,bool)", +"5df73398": "loadMesaVerify(bytes32,bytes32[],uint8[])", +"5df75bdf": "totalTokensICO2()", +"5df8122f": "setManager(address,address)", +"5df86d29": "etherInContract()", +"5df8d74e": "bytesCallWithArray(bytes,bytes32[4])", +"5df8f17b": "createVote(uint256,address[])", +"5df93f99": "MICL()", +"5df95255": "Rating(address,address,int256)", +"5dfb94cf": "nextBurnFeeProp(uint256)", +"5dfc09a4": "getCurrencySymbol()", +"5dfc273c": "Cloudbric(address)", +"5dfc2e4a": "noop()", +"5dfc3459": "maxIncrease()", +"5dfd1bff": "MeetingTimeSetFailure()", +"5dfd3278": "VOTE_AGAINST()", +"5dfde910": "STELLARGOLD()", +"5dfed2bb": "setCompte_14(string)", +"5dfee9bb": "refundTokens(uint256)", +"5dffe6dc": "contrEntrance(address)", +"5e0055e7": "ThreeStarToken()", +"5e007742": "Propethy()", +"5e00a177": "revokeVesting(address,string)", +"5e00b9a9": "incompletePercent(uint256[3])", +"5e00bd96": "DoNotBloodyDeployThisGetTheRightOne()", +"5e00e7b2": "getNoContributors()", +"5e01b2e6": "Gobi()", +"5e01d395": "getCapAtTime(uint32)", +"5e01eb5a": "getSender()", +"5e01ed34": "associatedAddresses(uint256)", +"5e02b84d": "Voiptoken()", +"5e031606": "round2TokensRemaning()", +"5e03d0c6": "getCreationDateOfHistoricalMetadata(string,uint256)", +"5e03d393": "setAccountFrozenStatus(address,bool)", +"5e04672b": "approveSynthesizing(address,address,uint256)", +"5e047822": "fundOf(address)", +"5e047975": "recoverSigner(bytes,address,uint256,uint256,uint256)", +"5e05bd6d": "timestampFromDateTime(uint256,uint256,uint256,uint256,uint256,uint256)", +"5e05e84d": "buyCells()", +"5e068da5": "proxyVersion()", +"5e06911e": "SpecialTrained(uint256,uint256,uint256,uint256[2])", +"5e079aa5": "giveEthFundAddress()", +"5e07c354": "vestingTokens()", +"5e07f240": "shiftBitsLeft(bytes,uint256)", +"5e0842d7": "VEToken(uint256,string,string)", +"5e08f5fa": "setCGO(address)", +"5e0a6049": "LOG_newGasLimit(uint256)", +"5e0b1259": "end_block()", +"5e0b1597": "_unpackRatingValue(uint256)", +"5e0b4cb6": "setData_2(uint256)", +"5e0b5d9b": "changeStartAndEndTime(uint256,uint256)", +"5e0be607": "unlockAllTokens()", +"5e0be75c": "setDividendPayout(uint256,uint256)", +"5e0c8c8c": "getCountSales(uint256,uint256)", +"5e0c923a": "RinneganToken()", +"5e0d0f30": "krsUsd()", +"5e0e2118": "removeSignature(string,int256)", +"5e0e2957": "dumpOut()", +"5e0fac2e": "unlockedBalance(address)", +"5e0fec6a": "knownReserved()", +"5e0ff394": "setCompetitionAdmin(address)", +"5e10177b": "confirmDelivery()", +"5e101e51": "editionController(uint256)", +"5e1045ec": "addWhiteList(address[])", +"5e11544b": "newPeriod()", +"5e11dc0b": "openDistribution()", +"5e123ce4": "gameStarted()", +"5e131fa2": "removeLocker(address,address)", +"5e1372f4": "lockup(address,uint256,uint256)", +"5e159cd4": "LogOwnerRemoved(address,address,address)", +"5e15d642": "totalNumberOfTokensForSale()", +"5e1665f3": "SmartParkApp()", +"5e172fa3": "allowtransferaddress(address)", +"5e17580a": "setTime5(address,uint256)", +"5e1758fa": "addPermission(address,bytes32)", +"5e17b694": "promisedTokens()", +"5e17d423": "getBountyRate(address,address)", +"5e191293": "emitBoardRatingGiven(address,uint256,uint8)", +"5e1936d4": "testThrowSetNotTransferableNotOwner()", +"5e199157": "setWalletOut1(address)", +"5e199892": "forwardFee(uint256,address)", +"5e19b305": "isActive(uint32)", +"5e19d316": "clearICObyAddress(address)", +"5e19deda": "preCap()", +"5e1a01c3": "createAndJoinCDPAllDai()", +"5e1a6c17": "requesters(uint256)", +"5e1bd33e": "getBuildCost(int32,int32,bytes16)", +"5e1c8f89": "scoreOf(address,address)", +"5e1ce5b0": "phasePresale_To()", +"5e1d5482": "about()", +"5e1d7ae4": "changeFeeRebate(uint256)", +"5e1d832d": "giveChamp(address,uint256)", +"5e1d8cb7": "TextChanged(string)", +"5e1d9aba": "sanCurrentTotal()", +"5e1dca04": "shareholder1()", +"5e1e1004": "setPaymentAddress(address)", +"5e1e547d": "unsign(uint256)", +"5e1e5c88": "betByte()", +"5e1eabd2": "soldPerCurrentRound()", +"5e1f3fa8": "CREATE_REPO_ROLE()", +"5e1f56d9": "changeWalletOwner(address)", +"5e1f8b59": "_totalAssetSupply(uint256)", +"5e1fc56e": "close(uint64,uint256,bytes32,bytes32,bytes)", +"5e217162": "availableSTCDRTokensOF(address)", +"5e21f687": "getMarketID()", +"5e22a2fb": "getTokenIdByHash(string)", +"5e22b760": "buyDEV()", +"5e23464e": "TOTAL_REQUEST_TOKEN_SUPPLY()", +"5e24de11": "ownerSetCrowdsaleClosed(bool)", +"5e25495e": "getProviderSupply(uint256)", +"5e25f96d": "setYccContractAddress(address)", +"5e2642c9": "isInitialSupplied()", +"5e280e4e": "validateTransaction()", +"5e280f11": "endpoint()", +"5e29c47c": "walletCreatedTimestamp(address)", +"5e2a725c": "enableEmergencyBlock()", +"5e2bd421": "enableLogic(address)", +"5e2cb4f1": "BluToken()", +"5e2d13af": "addONG_AUDIT(bytes32,string,string,bool)", +"5e2d1f0d": "withdrawAfterTime()", +"5e2d285a": "GICTLock(address,uint256,uint256,uint256)", +"5e2d3798": "ETHERberry()", +"5e2dff7a": "foundersTokensLockedPeriod()", +"5e2e555f": "RogisterToVoteOnTransfer(address)", +"5e2ea5bd": "FIRST_PHASE_MAX_SPAN()", +"5e2ea799": "currentFlowerPrice()", +"5e2fe372": "getLastOrderIndex()", +"5e3013f1": "PlayX30()", +"5e3045c8": "getImpactTotalValue(string)", +"5e30b8a6": "refund(address,address)", +"5e30c961": "premium(address,address)", +"5e31005d": "scoreThresholdParams(address)", +"5e310670": "cancelTokenToEthOrder(uint32)", +"5e311cd7": "largestDonor()", +"5e318e07": "withdrawFees(uint256)", +"5e326b92": "setPreSaleStatus(bool)", +"5e331e62": "iterate_get(uint256)", +"5e33f94d": "ApolloSeptemCappedCrowdsale()", +"5e35359e": "withdrawTokens(address,address,uint256)", +"5e355dcc": "PJRToken()", +"5e3568b8": "session()", +"5e377b51": "Jackpot()", +"5e383d21": "values(uint256)", +"5e38ab4c": "BabyCoin(uint256,string,string)", +"5e38c77d": "getProductHistoryDate(bytes32)", +"5e393973": "get_contrib_arbits_max()", +"5e3b456c": "creatTokens()", +"5e3ba8ac": "usersGetter()", +"5e3bb4cc": "minimalSuccessTokens()", +"5e3bcaf7": "Fee(address[],string,uint8,string)", +"5e3cb7b0": "setTotalUsdAmount(uint256)", +"5e3cbb7c": "dayWithdraw()", +"5e3ced74": "callSurplus()", +"5e3d3b8a": "isPREICO()", +"5e3dbedb": "getTokenDescriptions(address,uint256[])", +"5e3df83f": "setFundingtokens(uint256)", +"5e3e2687": "transferFromParent(address,uint256,address,uint256,bytes)", +"5e3e37d1": "XfiniteAsset()", +"5e3e6092": "newService()", +"5e3e9158": "createWine(string,string,string,string,string,string,bytes32)", +"5e3fa843": "registerContract(string,bytes)", +"5e3fcbd1": "mintNewTokens(address,uint256)", +"5e402ae2": "getCurrentTokensPerEther()", +"5e402bb5": "setInfoTokenSilverRatio(string)", +"5e403a9c": "phase7Price()", +"5e404de3": "setMaximumCredit(uint256)", +"5e4293ba": "i_am_generous()", +"5e431709": "sealedBids(address,bytes32)", +"5e431a6f": "phasePublicSale1_To()", +"5e439f66": "changeAge(uint256)", +"5e43f719": "enablePublicTransfers()", +"5e44423c": "ChangePreSaleDates(uint256,uint256)", +"5e44daf3": "vote(uint256,int256)", +"5e44e0a4": "modifyHorseyTier(uint256,uint8)", +"5e46f419": "leed()", +"5e475bb6": "createKT(string)", +"5e48379a": "changePriceContract(address)", +"5e488540": "claimRefund(address,bytes32)", +"5e4887bd": "initializeTime()", +"5e48ce0f": "dequeue(bytes32)", +"5e48f58f": "PRESALE_PERCENTAGE_2()", +"5e49db8c": "getUsersFuelsIds()", +"5e49fbfc": "WOS()", +"5e4a1d36": "getSavingsBalance(address)", +"5e4a627d": "RN()", +"5e4a8a20": "setAppCode(bytes32,address)", +"5e4b587b": "_BLOCK_REWARD()", +"5e4b5f7d": "setColdAddress(address)", +"5e4ba17c": "remove(address[])", +"5e4e7cbc": "record(string,string,string,address,bool)", +"5e4f63ec": "extendLockPeriods(uint256,bool)", +"5e5098c2": "setmangerallow(address,uint256)", +"5e50f037": "reward(address,address,uint256,uint256,uint256)", +"5e511afa": "sendTokensBackToWallet()", +"5e5144eb": "change(address,address,uint256,uint256)", +"5e520c29": "tokensPerWei10()", +"5e5294b7": "endingTimestamp()", +"5e52a00b": "getReferrer()", +"5e53e2f9": "EXACOIN(uint256,string,string)", +"5e556a4a": "faucetTo(address,uint256)", +"5e5571ac": "pay(address,uint256,bytes32)", +"5e5650ef": "admin_set_Apply_Store_Id_Fee(address,address)", +"5e571440": "presalesTokenPriceInWei()", +"5e57966d": "addressToString(address)", +"5e58217d": "hardCapIco()", +"5e58331c": "SAGA()", +"5e585889": "claimDeposit(bytes32)", +"5e58f141": "shares(address,bytes,int256)", +"5e593cd3": "Funding_Setting_cashback_duration()", +"5e5a77e6": "getQuestionAnswer(uint256,uint256)", +"5e5a7eb0": "createCase(uint256,address,address,uint256)", +"5e5ae1fe": "invalidateAllPendingMints()", +"5e5b1e61": "closeTokensale()", +"5e5ca8d4": "BuyerSeller()", +"5e5d2adb": "HUBUToken()", +"5e5d4320": "deleteUser(bytes32)", +"5e5d73b5": "CloseSaleFund()", +"5e5d926c": "makeDai(uint256,address,address)", +"5e5de297": "getUidAsInteger(address,address)", +"5e5e305e": "bbAirdropWallet()", +"5e5e4cc5": "ownerToArmy(address)", +"5e5f2e26": "allowedTokens(uint256)", +"5e5f2e37": "startedNewVote(address,uint256,string,uint256)", +"5e5ff24b": "addUsersToGroup(bytes32,address[])", +"5e601fed": "changePaymentAddress(address,uint256)", +"5e604b60": "addWhiteListedContracts(address)", +"5e6096c5": "setMinimumTokenSell(uint256)", +"5e60d438": "LicerioToken()", +"5e615a6b": "getParams()", +"5e62463a": "TransferLimitedToken(uint256,address,address[],address)", +"5e62af4d": "grandJackpot(uint256,uint256)", +"5e645680": "getRegulatoryAuthorities(address)", +"5e64f392": "_completeTask(uint256)", +"5e6558e5": "addAtkPlayerQuest(address)", +"5e65db7f": "deleteThis(uint256)", +"5e66dfee": "regularPayment()", +"5e66eb1b": "phaseClaim()", +"5e675098": "addFoundation(address,uint256,uint256,uint256)", +"5e68ac2c": "Kingdom(string,address,address,address,uint256,uint256,uint256,uint256,uint256)", +"5e68d459": "_getRNGValue(uint256)", +"5e6911af": "hardcapReached()", +"5e6936ac": "HitToken(uint256,string,uint8,string)", +"5e6992e3": "rcnFundDeposit()", +"5e6a7777": "setCompte_39(string)", +"5e6ad49d": "_setCosignerAddress(address)", +"5e6b4ee5": "increaseRate(uint256,address)", +"5e6b7a5c": "getUnitsDefense(address,uint256,uint256)", +"5e6c5d77": "number_of_deals()", +"5e6cbd6d": "_getRandom(uint256,address)", +"5e6db193": "Bithenet()", +"5e6e91ac": "Mint(uint256,address,string)", +"5e6eb33a": "CampaignClosed(uint256)", +"5e6f6045": "vestingContract()", +"5e6fa5ea": "inclusionEnExchange()", +"5e6fc129": "isRecord(string)", +"5e6fc8b4": "getChildrenCount()", +"5e7037d0": "removeSpriteFromSale(uint256)", +"5e7051cd": "setQuickPromoInterval(uint128)", +"5e70a6dc": "increaseLock(uint256,uint256)", +"5e715c16": "ICO_CONTRACT()", +"5e717e2d": "readDeal(string,address)", +"5e71823b": "numPositions()", +"5e71c7fa": "testCheckRokSold()", +"5e733baa": "openEgg(uint64,uint16)", +"5e734f5c": "revealBid(bytes32,uint256,address,bytes32,bytes32,uint256,uint256)", +"5e73dd37": "tokenCapPhaseOne()", +"5e7591e2": "register(bytes32,address,address,bytes32,bytes32)", +"5e763377": "ModifyMarking(bytes32,uint256,uint256)", +"5e763946": "setTaxationPeriod(uint256)", +"5e76a101": "onlyOwnerSetTeamWallet(address)", +"5e77eec0": "setAdminsAddress(uint256,address)", +"5e7893e2": "showprize()", +"5e78998e": "BatLimitAsk()", +"5e79f1cb": "approvedByAdmin(address,uint256)", +"5e7aa842": "createEvent(bytes32,bytes32[],address,uint256)", +"5e7b9832": "updateItem(uint256,uint8,uint8,uint256,uint256,uint256,uint256,uint256,bool,bool)", +"5e7be40d": "getBeneficiaries(address,address)", +"5e7c85b1": "totalContrib(address)", +"5e7cafa4": "startPayments(uint256,uint256)", +"5e7d6fd0": "airdropHasExpired(address,uint256)", +"5e7f092c": "_createNFTCollectible(uint8,uint256,address,uint256,uint256[5])", +"5e7f22c2": "postBuyOrder(address,address,uint256,uint256)", +"5e7f322b": "exchangeEthToEur(uint256)", +"5e8023d1": "cascades(uint256)", +"5e80377b": "buySaleReferred(uint8,address)", +"5e815320": "forward_pass2(uint256[],int256[],int256[],int256[],int256[],int256[])", +"5e816740": "rollDice(uint256,address)", +"5e81b958": "isNonFungibleItem(uint256)", +"5e81ba96": "DestroyedBy(uint256,address)", +"5e8254ea": "commitVoteOnProposal(bytes32,uint8,bytes32)", +"5e825564": "setFactory(address,address)", +"5e83b463": "placeBet(uint256,uint256,uint256,uint256,bytes32,bytes32)", +"5e84d723": "publicSupply()", +"5e850225": "closePeriod(uint256,uint256,uint256)", +"5e8507f8": "destTokensAngel()", +"5e855f14": "Dice(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"5e85db0a": "getMinSkills(uint256)", +"5e8714d5": "changeSaleAgent(address)", +"5e871f0c": "dividendDistributionDuration()", +"5e885c63": "getPack(uint8,uint128)", +"5e89d92a": "Credentials(bytes32,bool)", +"5e8a6044": "foundersFundTimelock3Address()", +"5e8a79e1": "setRef()", +"5e8a8b00": "setDocHash(string,bytes32)", +"5e8aedce": "SubajToken()", +"5e8af735": "placeBet(uint256,string)", +"5e8be190": "getCar(uint256)", +"5e8c63bb": "vehicle_assembled(uint256)", +"5e8e9589": "_createPenguin(string,uint256,uint256)", +"5e8f5022": "issueTokensWithReferral(address,uint256)", +"5e8f6597": "distributeInvestorsTokens(address,uint256)", +"5e90852d": "proposeTransaction(address,uint256,bytes)", +"5e90a9ff": "_getLotteryNum(uint256,uint256)", +"5e916b46": "rinkeby2()", +"5e91ba21": "checkSecret(address,string,bytes32)", +"5e91c37d": "tokensSoldInPresale()", +"5e91c5ed": "specialTransfer(address,uint256)", +"5e91d8ec": "updateEmployee(address,uint256)", +"5e943a30": "calculateReferralBonus(uint256)", +"5e949fa0": "changeDestination(address)", +"5e956abf": "createMeshPoint(string)", +"5e959287": "getSignature(string)", +"5e95ff98": "updateFreeze(address)", +"5e968a49": "ownerSetMaxProfitAsPercentOfHouse(uint256)", +"5e97894a": "TNPC()", +"5e983156": "getJudgeVoted(uint256,address)", +"5e983d08": "setPrices()", +"5e986ec7": "PoezenVoting(uint256,uint256)", +"5e987d32": "last_slot()", +"5e98e4c7": "abstain()", +"5e9a1849": "numDonations()", +"5e9a31fb": "MINBET_perSPIN()", +"5e9a523c": "assetPrices(address)", +"5e9a8c42": "get_deal_state(uint256)", +"5e9afc0e": "ERC223TestToken(string,string,uint8,uint256,address)", +"5e9bcab0": "getReferrerRates(address)", +"5e9d2b1f": "roundSize()", +"5e9d2e7b": "exchangesWallet()", +"5e9dbcb7": "_tag(string,string)", +"5e9e2226": "setOraclizeWinnerGasFee(uint256)", +"5e9f9613": "availableReserve()", +"5ea050ec": "InitiateCompanies()", +"5ea102b0": "Base()", +"5ea187c9": "BuildByteArray(bytes)", +"5ea194a3": "createScalarEvent(address,address,int256,int256)", +"5ea1bb17": "winInternal(address,bytes32)", +"5ea1d6f8": "commissionRate()", +"5ea1fc6a": "NAME_SATOSHI()", +"5ea27e40": "PRESALE_END_TIME()", +"5ea36bd6": "MultiHolderVault(address,uint256)", +"5ea39624": "ATTR_SEEDED()", +"5ea3ad0a": "doWithdrawal(uint256)", +"5ea40983": "addMember(address,uint256,bool,string)", +"5ea4cf50": "AMPTToken()", +"5ea56918": "BIAToken()", +"5ea63913": "getInvestorBalance(address)", +"5ea6474d": "getPVPBattleResult(uint256,uint256,uint256)", +"5ea67956": "CrowdtesICO()", +"5ea81231": "ownerAddRole(address,string)", +"5ea81e07": "editAccountData(address,string,bytes)", +"5ea82efb": "MariaToken()", +"5ea8cd12": "setMinPrice(uint256)", +"5ea8cf00": "PardiICO()", +"5ea94bcf": "updateUserTrustRankForMultipleChannels(address,bytes12[],int256[])", +"5ea95215": "SpaceXToken()", +"5ea98520": "changeNewExchange(address)", +"5ea9caff": "FrozenFund(address,bool)", +"5eaa6ca4": "_cancelMarkets(uint256)", +"5eaaa699": "SALES_SUPPLY()", +"5eaad235": "getDataByDeviceId(uint8,uint8)", +"5eab15e4": "devuelveApps(bytes32)", +"5eabc684": "updateIssuanceData(address,uint256,uint256)", +"5eabe01e": "saleSuccessful()", +"5eac1414": "UNIQ(uint256,string,string)", +"5eac6239": "claimRewards(uint256[])", +"5eac85d5": "burnGasAndFreeFrom(address,uint256,address,address[],bytes)", +"5ead330c": "getDungeonFloorDetails(uint256)", +"5ead8846": "updateFundsOwner(bytes32,bytes32)", +"5eadd607": "debugResetSubmissions()", +"5eae177c": "isTransferAllowed(address,uint256)", +"5eaefac1": "reservePricing()", +"5eaefb31": "CARD_TAKE_SHARE()", +"5eafe515": "newDeveloper(address,string)", +"5eb08d8a": "setBurnRate(uint8)", +"5eb101c3": "capped()", +"5eb17cdb": "setBeginTime(uint256)", +"5eb19ad1": "recalcAmountWithFees(uint256,bool)", +"5eb19eda": "InitiatePlanets()", +"5eb1f936": "JBToken()", +"5eb28fb2": "Robot()", +"5eb332da": "updateAward(uint256)", +"5eb38bef": "setcommissionPer(uint256)", +"5eb3f639": "assertTrue(bool,bytes)", +"5eb456c1": "goldIssueBurnFee()", +"5eb51d3c": "setTrancheMinTx(uint256)", +"5eb53bfa": "test_standardCampaignConstructionValuesFailsDueToNoParameterValidation()", +"5eb604bc": "GongChuangToken()", +"5eb61aa9": "executeSignedCall(address,uint256,uint256,bytes,bytes)", +"5eb62178": "getMinAmount(address)", +"5eb62d75": "sendPrivateSaleTokens(address,uint256)", +"5eb6a78f": "gamesCounter()", +"5eb7413a": "lockedTokens(address)", +"5eb7556f": "currentRoundIsActive()", +"5eb9bbf7": "founderTokenUnlockPhase4()", +"5eba2472": "Migrations3()", +"5ebad2ab": "GrowthPool_Supply()", +"5ebaf1db": "staker()", +"5ebb7077": "mkDomain(bytes32,address)", +"5ebc1db8": "positionScount1(address,address)", +"5ebc7826": "CasCoin()", +"5ebca187": "testFailTransferWhenStopped()", +"5ebcaf7e": "sendBuyAgent(int256,int256,int256,int256)", +"5ebcc621": "endFundraising()", +"5ebcfe50": "taxTransfer(address,address,uint256)", +"5ebd2196": "getMyBalanceDNT()", +"5ebd9a83": "add(bytes32,address,address)", +"5ebdd159": "tokenAvailable()", +"5ebe4746": "CCPLUS(uint256,string,string)", +"5ebe7c72": "reply(string)", +"5ebfed78": "buyRegion(uint256,uint256,uint256,string)", +"5ec01e4d": "random()", +"5ec0c707": "winnerFromGas(uint256)", +"5ec112a2": "setPreSaleOpened(bool)", +"5ec1b499": "AnythingAppTokenPreSale(address,address,address,uint256,uint256,uint256,uint256,uint256)", +"5ec1fc19": "convertMint(address,uint256)", +"5ec211a1": "accountOfN(address)", +"5ec2c7bf": "auctioneer()", +"5ec2dc8d": "depositReward()", +"5ec30be2": "assignListingDB(address)", +"5ec38bec": "updateFundWallet(address)", +"5ec3f160": "secondsInDay()", +"5ec4eb95": "GoldWhitelist(address,bool)", +"5ec5bc8e": "pushOrderOfOwner(address,uint256,bool)", +"5ec5bed6": "coupon(uint256,uint8,uint8,bytes32,bytes32)", +"5ec70cd2": "_getProviderPriv(uint256)", +"5ec72a90": "maxCumAcceptedDeposits()", +"5ec81130": "calcBonusRate()", +"5ec88c79": "getAccountLiquidity(address)", +"5ec93cb2": "withdrawal_gas()", +"5ec94770": "RhinexFundCoin()", +"5eca2aeb": "getBytesArrayIndex(bytes32,uint256)", +"5ecb16cd": "withdrawTokens(address[])", +"5ecb6594": "isCoreContract()", +"5ecb7d20": "testGetCaseCount()", +"5ecc33ac": "testPrivacy()", +"5ecc7975": "YUPVesting(address,uint256,uint256,uint256)", +"5ecd62b9": "divCut()", +"5ecef65f": "setTactics(uint256,uint8,uint8)", +"5ecf36f7": "Print(string,uint256)", +"5ecf71c5": "decreasePower(uint256)", +"5ecfdcfc": "KnownTokens(address,address,address)", +"5ecff851": "p_setDevAddress(address)", +"5ed0f3fd": "changeVariables(address[],uint256[],address,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"5ed16294": "nacBalance()", +"5ed188c9": "MNTToken(address)", +"5ed18d95": "CollatLending()", +"5ed31991": "lastLockingTime()", +"5ed411e5": "setNewToken(address)", +"5ed4382f": "fourthStageMinting()", +"5ed49e9b": "ADVISERS_AND_FRIENDS_WALLET()", +"5ed4d7ae": "_getTokenAmount()", +"5ed50033": "myetherpay(uint256,string,string)", +"5ed5684c": "HCHToken(uint256,string,string)", +"5ed570f3": "toggleCanCreateGames()", +"5ed5ea28": "whiteListContract()", +"5ed65228": "sponsoredJackpotMin()", +"5ed66172": "getCertificateForWallet(address,address,address)", +"5ed66998": "usingOwnership()", +"5ed6a8e7": "setData_13(string)", +"5ed73bc7": "distribute(address,uint256,address[],uint256[],uint256)", +"5ed75366": "DEVELOPER_FEE_FRAC_TOP()", +"5ed7ca5b": "halt()", +"5ed81ebe": "getInspireTokens(address,address,uint256)", +"5ed84aa6": "getNymCenterAPIURL()", +"5ed85753": "ergoam(uint256,string,string)", +"5ed9ebfc": "soldTokens()", +"5eda17bc": "_tuneLambo(uint256,uint256)", +"5eda232d": "getTokenStakeByIndex(uint256)", +"5eda5b9a": "interestCollected()", +"5edabc99": "getPresaleEndTime()", +"5edb2fb3": "uint256ToBytes32(uint256)", +"5edc1ac8": "discountDecimal()", +"5edc9bff": "upgradeUnitMultipliers(address,uint256,uint256,uint256)", +"5edca2b4": "unsuccessfulWithdrawal()", +"5edd4436": "newOffer(bytes32,string)", +"5eddd157": "claim(uint256,uint256,bytes)", +"5edf34d4": "Transfer(address,address,address,address)", +"5edf413e": "burn(bytes32,address,uint256,bytes)", +"5edf8d3c": "SetAdOwner(uint256,address,address)", +"5edfa1f8": "calculateFees()", +"5edfd788": "completedGames()", +"5ee0f535": "_mint(address,bytes32,string,uint256)", +"5ee10f3b": "instruct_2()", +"5ee2a018": "deployMultiToken()", +"5ee2cec2": "issuerDateMinutes()", +"5ee345e4": "computeEndowment(uint256,uint256,uint256,uint256,uint256,uint256)", +"5ee4e3f8": "LocklistAddressisListed(address)", +"5ee58efc": "distribution()", +"5ee5a409": "transfer_token1_toContract(address,address,uint256)", +"5ee5e9ee": "SaleStarted(uint256,uint256,uint256)", +"5ee679f9": "removePolicyFrom(address)", +"5ee6cc38": "buyToken(address,address)", +"5ee7144c": "_removeTopic(string)", +"5ee759e8": "encodeCurrency(string)", +"5ee760a5": "hashHardCap(uint256,uint256)", +"5ee7b392": "sendToken_internal(address,uint256)", +"5ee7cd23": "isBCFBuyMarket()", +"5ee7e96d": "grant(address,uint256,uint256,uint256,uint256,bool)", +"5ee857d1": "test_insert_findWithHintPrevUpdateTail(int256)", +"5eeb9ff9": "get_transferLock()", +"5eebc031": "newReadAddr()", +"5eebea20": "pending(address)", +"5eec743b": "minContributionMainSale()", +"5eec9df0": "softCapWei()", +"5eecbad8": "getFunderByIndex(bytes32,string,uint256)", +"5eecdec0": "unLockup()", +"5eed1f1a": "setTotalIndividualWeiAmount(address,uint256)", +"5eed3dcb": "donorList(uint256)", +"5eed886b": "minimumPerTransaction()", +"5eedbceb": "emitTransferFeeUpdated(uint256)", +"5eee006a": "secondStageStartsAt()", +"5eee7078": "sendETH(uint256)", +"5eeeee22": "setMaxWin(uint8)", +"5ef013d0": "Ico()", +"5ef17eff": "getSettingValuesById(uint256)", +"5ef1bfdb": "landPriceWei()", +"5ef27d1a": "hasRazCompleted(uint256)", +"5ef2a3f4": "giveAwayInProgress()", +"5ef2c79a": "getMyNmBet(uint256,uint256)", +"5ef3f3d1": "voteRelease()", +"5ef3f9e1": "BETS_CLOSING_TIME()", +"5ef4d2af": "_calculateTokenAmount(uint256)", +"5ef4ed42": "setBattleTokenAddress(address,address)", +"5ef505c0": "discoveryBlocksUntilAllowed(uint256)", +"5ef572ad": "stageMgmtSystem()", +"5ef5cdb2": "doFailedOffer(uint256)", +"5ef6228c": "bytesToAddr(bytes)", +"5ef652ad": "EtherFarmDevSim()", +"5ef6543c": "YDMediaToken()", +"5ef680df": "flushTokens(address,address)", +"5ef6ad57": "Delivery()", +"5ef74958": "Epam()", +"5ef78561": "cashWallet(address)", +"5ef79434": "DATE_PRESALE_END()", +"5ef7ac4d": "startRedeem(uint256,bool)", +"5ef7b303": "getPI_edit_14()", +"5ef80c87": "create20ContractToy()", +"5ef82429": "tixPromo()", +"5ef8ce5d": "setPollType(uint256,address)", +"5ef8da77": "Altruism()", +"5ef97145": "BokkyPooBahsAutonomousRefundathonFacility()", +"5ef9dde8": "removeApprovedGame(address)", +"5eface14": "numStakersForPoll(bytes32)", +"5efb4dc5": "deathData_a7()", +"5efb8266": "setGoldContractAddress(address)", +"5efbb728": "transferold(address,uint256)", +"5efbcfba": "minWeiToBuy()", +"5efbdc47": "setLastBidId(bytes32)", +"5efc156f": "Roles2LibraryAdapter(address)", +"5efd1682": "transferPreSigned(address,address,uint256,uint256,uint256,bytes,bytes32,bytes32,uint8)", +"5efd3c41": "whiteListEndBlock()", +"5efdb1e4": "percentToTakeAsSeed()", +"5efe2fcf": "releasedLockedAmount()", +"5eff7d8f": "getAccountLiquidityInternal(address)", +"5eff7dae": "getInstructors()", +"5eff8b48": "Prakashcoin()", +"5effd20d": "withdrawForAddress(address,uint256)", +"5f01b42f": "alloweRefund()", +"5f02116f": "claimRewards(uint256[],uint256[])", +"5f024e91": "testCheckEthBalance()", +"5f0379f5": "firstPriceChange()", +"5f038b6d": "refillFunds()", +"5f05b3e4": "HappyToken(uint256,string,uint8,string)", +"5f05b9df": "removeTWhitelist(address)", +"5f065346": "pay(address,uint256,uint256)", +"5f06541d": "resetOwner()", +"5f065b4a": "checkItem(bytes32)", +"5f06900b": "changeBattleFee(uint256)", +"5f073f49": "gatherDetails(uint64[])", +"5f07a3e5": "addAllNewTicket(uint256,bytes32[],uint256[],uint256[],uint256[])", +"5f07bd15": "take_fees_eth_owner()", +"5f09952e": "voteAllowTransactions(bool)", +"5f0b37e4": "VeritokenToken()", +"5f0d5296": "reserveAllowance()", +"5f0d995b": "developer_string_contract_verified(string,string)", +"5f0da25b": "sendDeposit(uint256,address,uint256,bytes32)", +"5f0da5c9": "create(string,address,address,address,address,bool)", +"5f0e3855": "ownerRefundUser(bytes32,address,uint256,uint256)", +"5f0edfb8": "create(bytes,bytes32,bytes1)", +"5f0f1f85": "transferProposalEnd()", +"5f0f7786": "IssuedToken(address[],uint256[],uint256,uint256,address,string,uint8,string)", +"5f0fc2e8": "RealMoneyToken()", +"5f104c5f": "SalesAgentPermissionsTransferred(address,address)", +"5f111074": "picopsCertifier()", +"5f112c68": "renounceMinter(address)", +"5f11301b": "setServiceURI(string)", +"5f1231ea": "getMemberInfo(address)", +"5f141a0f": "confirmWrite(bytes32,address)", +"5f14af16": "Subscribe(address,address,uint256,uint256,uint256)", +"5f14e108": "openTokensale(address)", +"5f159e60": "TimeBoundaryChanged(string,uint256)", +"5f167276": "getNumElements()", +"5f17114e": "TimeDeposit()", +"5f1768c1": "buyerHistory()", +"5f1845f6": "transferDecimalAmountFrom(address,address,uint256)", +"5f184eda": "withdrawFactoryResourceBalance(uint16)", +"5f185329": "submitOrder(bytes)", +"5f1877a8": "productPrice(string)", +"5f18aa0c": "decimals(bytes32)", +"5f196876": "allPromotions(uint256)", +"5f19c7b2": "doSetSettings(uint256)", +"5f1a6f4b": "BARL()", +"5f1b3ee6": "getAPAddressSize()", +"5f1b46ab": "inflateToken(address,uint256)", +"5f1ca2fc": "ReferralRegistered(address,address)", +"5f1d146e": "eeeeeeeeeeeee()", +"5f1d7037": "KEDToken()", +"5f1d804f": "checkTxProof(bytes32,bytes,uint256[],bytes,bytes)", +"5f1d90ae": "getCurrentOpinion()", +"5f1e1c28": "__transfer(address,address,uint256,bytes)", +"5f1e580d": "ETUToken()", +"5f1e8c1b": "MAX_MODULES()", +"5f1f6c5e": "delFromList(uint256,address[])", +"5f1fc571": "set_prices(uint256,uint256,uint256)", +"5f1ff549": "issued()", +"5f222da1": "latestMomentOf(uint256,address)", +"5f227bfc": "totalPlayerTokenContracts()", +"5f22c42f": "getBuyerReceipt(address)", +"5f238402": "lastAllowancePaymentTimestamp()", +"5f241c8e": "AnythingToken(uint256)", +"5f24f6fe": "setUpgradedAddress(address)", +"5f2536f7": "calculateMaxContribution(address)", +"5f27e47d": "GetWinnerAt(uint256)", +"5f27f6e3": "getPlayerGeneralAll(uint32)", +"5f27f946": "handleTokens(address,address,uint256)", +"5f28213b": "SCTC(uint256,string,string)", +"5f28b383": "minPerUser()", +"5f28cb74": "getSubscription(bytes32,address)", +"5f2961e1": "walletFounder1()", +"5f2a9f41": "MAX_GAS()", +"5f2aeae9": "executeCreator(uint256)", +"5f2af8d9": "Logocoin()", +"5f2b9ac0": "startPhase3()", +"5f2bb66e": "BatchTransfer(address)", +"5f2befb9": "hasTerminated()", +"5f2bf49a": "BitcoinRateUpdated(uint256,uint256)", +"5f2da7ec": "todayDays()", +"5f2e0c20": "giveConsent(uint8,bytes32,bytes32)", +"5f2e2b45": "freeFrom(address,uint256)", +"5f2e4b31": "testDisputedInvalidSequenceWrongWriteAddress()", +"5f2e686d": "Ethereum_eight_bagger()", +"5f2e8493": "addmoney(address,uint256)", +"5f2ebcf2": "GMRToken()", +"5f2ef12d": "tokenFactory(uint256)", +"5f2f83ba": "getMul(uint256)", +"5f2fb08e": "removeElement(address)", +"5f3040bf": "getMIRABALANCE()", +"5f304615": "earlyAllocation()", +"5f309123": "sale2(address,uint256)", +"5f30ed2a": "withdrawAmountFromToken(uint256,uint256)", +"5f31ea82": "holdTokenInvestors(uint256)", +"5f32714d": "ChannelSettled(address,address,uint32,uint192,uint192)", +"5f3292d7": "DMCTCoin()", +"5f330669": "dateMove(uint256)", +"5f33afdb": "preallocCoins()", +"5f33c5e1": "Payout(bytes32,address,address)", +"5f34165d": "isRightBranch()", +"5f3616eb": "getNextOnce(address,uint256,uint256,uint256)", +"5f3619b1": "getProfitFromSender()", +"5f373c22": "setHydroContractAddress(address)", +"5f37b43f": "_getType(uint256,uint256)", +"5f3893ef": "getReward(address,uint256,address)", +"5f399d28": "TokenIceBox(address)", +"5f39fd73": "approveUpdate(uint256,address,bool)", +"5f3aa2bb": "checkIfRewarded(bytes,uint256,bytes,bytes)", +"5f3bc04c": "addressFundInvestment()", +"5f3c15ed": "radtokenSupply()", +"5f3c23be": "isProposalNotExpired(bytes32,uint256)", +"5f3c6686": "challengeBook(address,address)", +"5f3c91ad": "accrueEther()", +"5f3ca167": "crowdSaleInitialized()", +"5f3cebcd": "incrementalInverse(uint256,uint256)", +"5f3d634f": "freezeMulti(address[],uint256[],uint256[],uint256[])", +"5f3d7fa1": "maxAttendees()", +"5f3e3db0": "increaseWeeklyTransactionVolumeSending(uint256)", +"5f3f703c": "gifter()", +"5f403edc": "addThenSub(uint256,uint256,uint256)", +"5f40fc27": "withdrawGoldMoney()", +"5f412d4f": "releaseTokenTransfer()", +"5f412ff1": "ownerEnablePayee(address,address)", +"5f41ccef": "multMint(address[],uint256[])", +"5f421776": "switchONfreeForAll()", +"5f429ba5": "Risk()", +"5f437e48": "settingsState()", +"5f43e49c": "isDataYes(bytes)", +"5f4402c5": "distributeTokenToAddressesAndAmounts(address,address,address[],uint256[])", +"5f45161f": "payToInviter(uint256)", +"5f45221d": "retrieveIncompleteProof(bytes32)", +"5f452df1": "approveCrowdsale(address)", +"5f456c1f": "assignedAmountToEcoReward()", +"5f45c179": "ABYSS(address,address[],address)", +"5f46d750": "amountOfDividendsPayouts()", +"5f4784a5": "allOf(address)", +"5f478f74": "Milestone(string,uint8)", +"5f47ba42": "Plendito()", +"5f4821ab": "ContractFactory()", +"5f4874e4": "multiTransfer(address[],address[],uint256[],string)", +"5f48f393": "maxAmount()", +"5f493f63": "convertToMini(uint256)", +"5f495491": "claimsCreated()", +"5f4964e0": "setMarketComissionRatio(uint256)", +"5f497a09": "adminCharge_p1()", +"5f49c5ac": "_addRecoverer(address)", +"5f49d562": "QSTPerEth()", +"5f4a47c3": "updateUpdater(address,string)", +"5f4b125b": "get_pre_kyc_bonus_numerator()", +"5f4b2873": "getDepositedValue(address)", +"5f4b9b4f": "getPolicyCount(address)", +"5f4c71f1": "getTotalETH()", +"5f4dd2d8": "mintPreico(address,uint256)", +"5f4eab65": "hasEditionInProgress(uint256)", +"5f4ed0b1": "rebalanceBucketsInternal()", +"5f4f35d5": "setFullName(string)", +"5f504a82": "ownerCandidate()", +"5f5082dd": "setLast(uint256,address)", +"5f51028d": "checkIsReleaseRecordExist(uint256)", +"5f515226": "checkBalance(address)", +"5f516131": "ReserveUnknown(bool,uint32,uint256,uint256)", +"5f51d526": "balanceMapPos(address)", +"5f51db02": "Memes()", +"5f52583b": "processStorageRoot(address,uint256,bytes,bytes)", +"5f52e9fd": "WithdrawCashForHardwareReturn(uint256)", +"5f538fd4": "openMigrationPhase()", +"5f539d69": "addContract(address)", +"5f53e077": "setPausedTransfers(bool)", +"5f5404af": "PriceProvider(string)", +"5f542c94": "emitAreaEvaluated(address,address,uint8,uint256)", +"5f54a1c7": "requestEndCall()", +"5f54ae17": "buy50Price()", +"5f54fa98": "conventionId()", +"5f561763": "rolloverPosition(address,uint256,uint256,address)", +"5f56315b": "enableSell()", +"5f56b6fe": "safeWithdrawal(uint256)", +"5f56e134": "averageArtworkSalePrice()", +"5f5810ea": "UBIT2018069()", +"5f5868db": "freezedValue()", +"5f589599": "resultsPublished()", +"5f58ed2a": "disableBot(address,uint64)", +"5f596681": "setShpExchangeRate(uint256)", +"5f598510": "KVMToken()", +"5f59940c": "addressToSpentEther(address)", +"5f5a98ee": "dragonGirlLotteryPrice()", +"5f5bb161": "set(bytes20,uint256)", +"5f5d867b": "CryptoPoosToken()", +"5f5db5dc": "setVariables(string,address,uint256,int256,bool,bytes32,address[2],uint256[2],int256)", +"5f5df710": "updateCertifier(address)", +"5f5e38b6": "setBuyPrice(uint16,uint16,uint8,address,uint256)", +"5f5f23a0": "charityFactor()", +"5f5f2aef": "amendRetention(uint8,uint8)", +"5f5f62f9": "setControler(address)", +"5f5fa782": "getCurrencyByte(uint256,uint256)", +"5f5fca9a": "setEnforceAddressMatch(bool)", +"5f6076bf": "Access()", +"5f60a5d4": "CompleteWildcard(uint256,address)", +"5f60ef47": "get_heaps(uint256)", +"5f60f485": "updateStatus()", +"5f61a26e": "PRESALE_ETHER_MIN_CONTRIB()", +"5f61bf99": "claimG()", +"5f623e15": "divisible_units()", +"5f645f16": "setInputFile(uint256,bytes32)", +"5f647d5a": "ethSignedMessagePrefix()", +"5f64b55b": "tokenB()", +"5f65545d": "Raffle_Prize()", +"5f65d621": "setSkill(uint256,uint256,uint256,bytes32)", +"5f65d703": "setInfo(bytes32,uint256)", +"5f65faf1": "isProduct(bytes32)", +"5f677404": "INITIAL_VALUE()", +"5f68688f": "endFirstBonus()", +"5f68804e": "SimpleLotto()", +"5f689fed": "startPVE(uint256)", +"5f6a1301": "clearPending()", +"5f6a4546": "ROLE_REVIEWER()", +"5f6acfe9": "_updateRate(uint256,uint256)", +"5f6d0ded": "ReservationFund(address)", +"5f6dd297": "getProjectEndDate(bytes32)", +"5f6e388a": "ProofOfCloneWars()", +"5f6ea340": "revokeAccess(address,address)", +"5f6ecea0": "vestedTransfer(address,uint256,uint256)", +"5f6edff8": "assureDAppIsReady()", +"5f6f8b5f": "setExclude(address)", +"5f7033e5": "getCurrentStartTime()", +"5f704f3e": "updatePrice(bytes32,uint256)", +"5f70d9ac": "getBot(uint256)", +"5f7118c7": "setRevealOpen(uint256)", +"5f71249c": "changeOrganisationName(string)", +"5f722859": "updateHashValue(bytes32,bytes32)", +"5f723b50": "getInitialReportMinValue()", +"5f72a508": "playerPopMining(uint256,bool)", +"5f72f450": "check(uint256)", +"5f73d6c0": "promisedTokenBalance()", +"5f746233": "dispense(address)", +"5f74a5ec": "pecunioWallet()", +"5f74bbde": "vote(address,uint256)", +"5f74c16c": "getPrizePot()", +"5f75b5ef": "whitelistAddress(address,address)", +"5f75cb6b": "getCountTransferInsToken(address,address)", +"5f75d62d": "addCard(uint256,string,bool)", +"5f7619a4": "takeFee(uint256)", +"5f766118": "salutaAndonio()", +"5f76e49a": "addPerson(bytes32,bytes32,bytes32,bytes32,uint256,bytes32,address)", +"5f770d47": "HyperSale()", +"5f77ace0": "stop_token_time()", +"5f7807a4": "transferToUser(address,uint256)", +"5f788531": "buy5Price()", +"5f791c7c": "ZRSToken()", +"5f7a7bb5": "returnRegDate(address)", +"5f7b68be": "addKey(address)", +"5f7b73b2": "getInvestorCredit()", +"5f7b764f": "_getLuckySpaceshipMoney(uint256,uint256)", +"5f7bb7f1": "setMaxProfit(uint128)", +"5f7c944f": "mintAccount(uint256,uint256,uint16,bytes32,uint256)", +"5f7cbc39": "addressOfTokenUsedAsReward2()", +"5f7cfe49": "internalSalt(bytes32)", +"5f7d897e": "checkVendor()", +"5f7dfd3f": "totalPaidToFunders(bytes32)", +"5f7e61fa": "SendTo(address)", +"5f7e7138": "setDth(address)", +"5f7ee166": "setupOpenDistribution(uint256,uint256,address,address)", +"5f7eed5d": "LeajoeToken()", +"5f7f9482": "statusQuery()", +"5f800348": "balancesImporter1()", +"5f802448": "specialAttacks(uint256)", +"5f8162bb": "transferTokenContractOwnership(address)", +"5f824297": "SellOrderPlaced(uint32,address)", +"5f84d0f9": "tokenR0()", +"5f84e343": "Artemine()", +"5f84f302": "setInterestRate(uint256)", +"5f852975": "randomtests()", +"5f8534ae": "claimDeposit(uint256)", +"5f856dbf": "Token_AllowTransfer()", +"5f85abdc": "contains(int256,int256)", +"5f865912": "addContract(address,address,uint256,string,bool)", +"5f877108": "sendToCharger(uint256)", +"5f88bff0": "presaleFundingGoal()", +"5f88e83d": "checkAndCallTransfer(address,address,uint256,bytes)", +"5f88eade": "opened()", +"5f88ffed": "wallet10()", +"5f8909bd": "biddingPeriod()", +"5f8a3029": "Standard_4()", +"5f8a7eab": "getReleaseAmount()", +"5f8aaa69": "sourceToken()", +"5f8aaef7": "contractStakeToken()", +"5f8af054": "getMessageLength(string)", +"5f8b93d2": "SingularityTest13()", +"5f8bad42": "getCommunityBallotWeiPrice()", +"5f8c1fce": "nextBracket()", +"5f8c494f": "IntIDQuery(address)", +"5f8cb3f6": "bounty_paid()", +"5f8cf6c4": "SMILO_SALES_AMOUNT()", +"5f8cf7c5": "PermissionGroups()", +"5f8d96de": "getDeadline()", +"5f8e38e1": "depositERC20Compatible(address,uint256,uint256,uint256)", +"5f8eb4c7": "jsub(uint256,uint256,uint256,uint256,uint256,uint256)", +"5f8f0483": "buyBankerAgreementFromImporterBank()", +"5f9094f5": "GetCreditsPerEth()", +"5f9145ef": "RefundReceived(uint256)", +"5f918b05": "ServiceProviderDisabled(address,bytes)", +"5f91af39": "_increasePlayerDivis(address,uint256)", +"5f9209ad": "getPositioninterestPeriod(bytes32)", +"5f92dee8": "adminGetWorldSnapshot(uint256)", +"5f932d71": "walletSetSigner(address)", +"5f945733": "getTotalInvested()", +"5f94e3de": "setSecondaryOperator(address)", +"5f94e82c": "setBridgeValidatorsProxyOwner(address)", +"5f956244": "TribePlatform()", +"5f9590fc": "_isValidDataHash(bytes32,bytes)", +"5f95ad43": "HasNoEtherTest()", +"5f9602e8": "perClaim()", +"5f96d9fa": "gemSpeedConversion()", +"5f972df8": "_jDiv(uint256,uint256,uint256,uint256)", +"5f984bf6": "changeFounder(address,string)", +"5f9973b9": "WeiToken()", +"5f99c1b2": "_landholderJackpot(uint256)", +"5f99e8f5": "GetSeries1()", +"5f9a2c23": "endFourthWeek()", +"5f9aa94f": "SpiceRates(address,uint256)", +"5f9ac1a5": "distributeLeaderboardRewards()", +"5f9adf84": "getUserSentTradeOfferId(address,address)", +"5f9b71ce": "bet(uint256,address)", +"5f9bad28": "saleBonus()", +"5f9c84b5": "transferirSala(address,uint256)", +"5f9cb50d": "updateMasks(uint256,uint256,uint256,uint256,uint256)", +"5f9dfc79": "minBuyTokenAmount()", +"5f9e1080": "settleBet(uint256,address,uint256)", +"5f9e3c98": "canSetNewOwnerPercentage(uint256)", +"5f9f3f46": "MakeSharesFromAmount(uint256)", +"5f9f4734": "birthday()", +"5fa13b49": "shweta()", +"5fa21f1f": "enableBetting()", +"5fa27af0": "GITC()", +"5fa382ea": "getPixelsOwned(address)", +"5fa3df98": "changeKYCStatus(address,bool)", +"5fa413b0": "ownerShareInPercent()", +"5fa44602": "tokenCreationDate()", +"5fa458b7": "buysoldiers(uint256)", +"5fa51277": "emergencyExtract()", +"5fa513d5": "findPtr(uint256,uint256,uint256,uint256)", +"5fa58268": "approveRequestPause()", +"5fa60fc8": "DCAsset(address)", +"5fa67c00": "Credit(address,address)", +"5fa77dac": "all(bool[6])", +"5fa7b584": "removeToken(address)", +"5fa7dc56": "getCurrentRateWithBonus()", +"5fa7df6b": "setDelegateAndLockTokens(uint256,address)", +"5fa87163": "viewlisting(uint256,uint256)", +"5fa8c869": "_getRandomPartSubtype(uint256,uint8[])", +"5fab11a5": "startICO(uint256,uint256,uint256)", +"5fac4996": "findSignedSubscriberIndex(address)", +"5fad18e4": "Visualrockcoin()", +"5fad3b1a": "initialiseContract(address,uint256)", +"5fad663e": "expectedDividends(address)", +"5fae0576": "isWhitelistedAddress(address)", +"5faeb944": "setData_22(string)", +"5faeced2": "removeFromUserCounter(uint256)", +"5faf2880": "changeDna(uint256,uint256)", +"5faf6675": "forecastInfo(uint256)", +"5fb02f4d": "startContract()", +"5fb07a62": "getDrugs()", +"5fb0ac18": "birthDragon(uint256)", +"5fb130af": "retry(address)", +"5fb135f9": "distributeAff(uint256,uint256,uint256,uint256)", +"5fb1552c": "GanaLocker(address,address)", +"5fb1ef8e": "checkOrder(address)", +"5fb1f1d7": "getSketchesOnOffer()", +"5fb3b944": "privateSaleSoldTokens()", +"5fb3e119": "Auction()", +"5fb42c59": "goldListPeriod()", +"5fb437f2": "setWithdrowRate(uint256,uint256)", +"5fb4f78c": "finishConfiguration()", +"5fb500a5": "ETT(uint256,string,uint8,string)", +"5fb64fd6": "checkMembership(address)", +"5fb6bca2": "fighterCore()", +"5fb77b9c": "revealBracket(bytes8,bytes16)", +"5fb7a643": "enableServiceProvider(address,bytes)", +"5fb80f20": "weiPerAnimal()", +"5fb8dc8b": "MasternodeTransferred(address,address)", +"5fb8fed6": "PJR()", +"5fb93bb7": "transferDataEntryClerk(address)", +"5fba26a6": "getBorrowedBooksCount(uint256)", +"5fbaa390": "haltSale()", +"5fbabc49": "setSkill(uint32,uint8,uint32,uint32,uint32,uint32,uint32)", +"5fbddcf3": "isLivingMonarch()", +"5fbe4d1d": "tokenAddr()", +"5fbf0577": "sayYes(uint256)", +"5fbf17ac": "totalUBetCheckAmounts()", +"5fbf79a2": "EmergencyStopSell(bool)", +"5fbfd9f6": "crowdsaleController()", +"5fbff3e2": "preferentialRate()", +"5fbff3fc": "KuangJinLian()", +"5fc02dcd": "freezeAccountForOwner(address,bool)", +"5fc13e0f": "initTransaction(address,uint256,bytes)", +"5fc1a4b8": "treasurySupply()", +"5fc1afac": "forwarders_count()", +"5fc2b479": "unlock(address,uint256,uint8)", +"5fc2cb39": "buyTokensWithProperEvent(address,uint8)", +"5fc31aeb": "_rawGetTokenDelegation(address,address)", +"5fc378df": "sawcoin()", +"5fc3ea0b": "withdrawERC20(address,uint256,address)", +"5fc42ebf": "KTZ()", +"5fc483c5": "OnlyOwner()", +"5fc4a6f3": "getCurrentBonusSystem()", +"5fc5d48b": "burnUnsoldCoins(address)", +"5fc5e727": "investedSumOnIco()", +"5fc6bd17": "pendingParsecs()", +"5fc71288": "GOTPAY()", +"5fc75bf2": "viewCreatePetitionFee()", +"5fc7e71e": "liquidateBorrowAllowed(address,address,address,address,uint256)", +"5fc8cc16": "returnAmountOfELIXAddressCanProduce(address)", +"5fc9309c": "transferFrom(address,address,uint256,address)", +"5fc93ed7": "BirthdayBoyClickHere()", +"5fc9d392": "setMessageStatus(bool)", +"5fc9e75e": "historyCountOf()", +"5fca5a92": "set_arbits_max_contribution(address,uint256)", +"5fcb568c": "release(string,uint32,uint32,uint32,string,string,string)", +"5fcba9ae": "DURIANX()", +"5fcbd5b6": "countDown()", +"5fcc2edb": "IndividualityTokenRoot(address)", +"5fcc6277": "changeModuleBudget(uint8,uint8,uint256)", +"5fcc7ea1": "nextScheduledQuery()", +"5fcc9d0f": "hardCapPreIco()", +"5fcce279": "announcementType()", +"5fccf40a": "redeemBonusLot()", +"5fccfda4": "postICOSale()", +"5fcd7fe6": "OWNER_TOKENS()", +"5fce627e": "hasArea(address,uint256)", +"5fceab11": "incomingTransaction(uint256)", +"5fcee7a0": "CEOAddress()", +"5fcf0455": "interestEarnedAccount()", +"5fcf92ef": "received_tokens()", +"5fd030c0": "setLicenseNFT(address)", +"5fd0526e": "getReleasableBonusAmount(uint256,address)", +"5fd0f8b2": "smartContractSaleEnded()", +"5fd1bbc4": "publicStartTime()", +"5fd23730": "LogSwapToken(address,uint256)", +"5fd33b1b": "freezeTrading()", +"5fd357fc": "PortfolioContent(uint256,uint256,uint256)", +"5fd4b08a": "getName(address)", +"5fd56dfc": "AllInOne()", +"5fd56e98": "whoHadTheBiggestDick(uint256)", +"5fd5e3b4": "newEvent(uint256,address[],uint256,uint256)", +"5fd65f0f": "swapStorage()", +"5fd72d16": "addAllowance(address,address,uint256)", +"5fd7793a": "setStreamerContract(address,uint256)", +"5fd8c710": "withdrawBalance()", +"5fd8d3d1": "maxInvestorCap()", +"5fd9d610": "verifyGameResult(bytes32)", +"5fd9dff6": "allowance(address,address,bytes)", +"5fd9e124": "pStopBlock()", +"5fd9e693": "Crear_rifa(uint256,address)", +"5fda0dc1": "isOnExchange(uint256)", +"5fda83f6": "TokenTransferDisallowed(uint256,address)", +"5fdba1de": "setIBalance5(uint256,uint256,uint256)", +"5fdbba04": "debatePeriodOf(uint256)", +"5fdc1a97": "AllSportsCoin()", +"5fdc9e0a": "dropSupply()", +"5fdcd306": "check_status()", +"5fdd59f8": "messages(address)", +"5fde0ed5": "getCountBySeller(address)", +"5fde731c": "wdiv(uint256,uint256)", +"5fdf05d7": "two()", +"5fdf5357": "sortDescBy(uint256[],uint256[])", +"5fdf60fb": "circulation()", +"5fe07013": "revokePermission(address,bytes32)", +"5fe0e081": "changePeriod(uint256,uint256)", +"5fe16454": "Fragment()", +"5fe22c8b": "testFailTransferWithoutApproval()", +"5fe27ab0": "createHKG(address)", +"5fe2d689": "getInterest(uint256)", +"5fe36964": "TEAMS_TOTAL()", +"5fe3854e": "calculatePrice(uint256,bool)", +"5fe3b567": "comptroller()", +"5fe44141": "getRegistryDataRegistered()", +"5fe4c0f3": "validationTime()", +"5fe59b9d": "setMotd(string)", +"5fe5b825": "AuthComplete(address,address)", +"5fe6fb19": "ConsultaProva(string)", +"5fe736e9": "createContractPlayer(string,uint256)", +"5fe745ea": "unlockOwnFunds()", +"5fe75764": "specialAccounts(address)", +"5fe772c6": "buyStakes(address,address)", +"5fe78b9b": "_getCurrentBonus()", +"5fe825f8": "getHodlOwner(uint256)", +"5fe8e7cc": "getHolders()", +"5fe9219a": "transferToMainViaRelay(address,uint256,uint256)", +"5fe98f99": "_getPayOut()", +"5fea13f8": "distributeToken(address,uint256,uint256)", +"5fea3de9": "getDuration(uint256,uint256)", +"5fec4be9": "issue(address[],uint256[],uint16[])", +"5fec5d0b": "isDelegate(address,address)", +"5fed2091": "addLovers(bytes32,string,string)", +"5fed22a4": "payOffClientDebt(uint256,uint256)", +"5fed2edd": "pushArray(bytes32,bytes32)", +"5fee0aac": "giveBattleBonus(address,uint256)", +"5fee63c3": "calculatedTo()", +"5fee8a4b": "getCommitThreshold()", +"5fef2094": "qryModuleDetail(string)", +"5fef4d34": "setOwner(address,address,bool)", +"5ff149ba": "UpdateEthBalance(uint256,uint256,uint256,uint256)", +"5ff1569e": "developmentPercent()", +"5ff19392": "strToUnderlierType(bytes32)", +"5ff1a9c0": "setPlAAdress(address)", +"5ff3b980": "getCooloffPeriod()", +"5ff456cb": "refundToOwner(uint256,uint256)", +"5ff46857": "getEthToTokenMakerOrderIds(address)", +"5ff4909b": "setAbel(address)", +"5ff4ae32": "setGasForDCN(uint256)", +"5ff4f876": "NFTBalanceOf(address)", +"5ff63abc": "ETimesChain()", +"5ff65026": "addNodeToStakedList(address)", +"5ff65efe": "MaxPoSXblock()", +"5ff6b342": "getValidDurationNonce()", +"5ff6cbf3": "getMessages()", +"5ff6e9d0": "investtokens()", +"5ff77b22": "checkTeamToAdd(uint64,uint64,uint64)", +"5ff79c07": "DenmarkvsFrance()", +"5ff7ec2f": "SoldTokensFromCroupier(address,uint256,uint256)", +"5ff7f947": "setSinistre_effectif(uint256)", +"5ff85cc0": "feeUnit()", +"5ff8b778": "findWinners()", +"5ff97818": "setMetadata0(string)", +"5ffabbce": "teamReserveTimeLock()", +"5ffb1578": "pushArrayValue(uint256)", +"5ffbba3f": "relativeDateSave()", +"5ffc7cc7": "transferProfit(uint256,uint256)", +"5ffcb734": "setTokensControlInfo()", +"5ffcbe30": "voteForCandidateViaProxy(uint256,address)", +"5ffce121": "getTopCompanyCount()", +"5ffd59bd": "GetBalanceOwnerForTransfer(uint256)", +"5ffde7be": "priceUpdateInterval()", +"5fffad5a": "setselfdropvalue(uint256)", +"5fffb7c7": "changeTokenAddress(address,int256,address)", +"600005b3": "Delegation(address)", +"60003918": "AllWorksToken()", +"6000eb9f": "getTeamInvest(uint256,uint256)", +"6001279f": "decreaseApprovalByLegacy(address,address,uint256)", +"600160a3": "bet_luse()", +"6001b23e": "getCustomerTxAtIndex(address,uint256)", +"60027c25": "bankrollLockedUntil()", +"60035c3f": "swipeHoney()", +"600440cb": "upgradeMaster()", +"60048290": "Kanzhang()", +"60063887": "transferDebt(address,address,address,uint256)", +"6006eb9b": "Demor(uint256,string,string)", +"6006f178": "WitdrawLenderProfit()", +"600720c2": "sponsoredJackpotAmount()", +"6007c4f8": "isTokenSaleOngoing()", +"6007c836": "setIndividualMaxCap(uint256)", +"60084004": "getRectangleArea(uint256,uint256)", +"6008fb07": "EtherGit(address)", +"60095dcb": "stopCharging()", +"60098088": "deleteCar(uint256)", +"6009eed3": "crowdSaleOpen()", +"600a686e": "setResponse(address,string)", +"600b1ff2": "setBlackBox(address)", +"600c200e": "ANIToken(uint256,string,string)", +"600c523b": "LogIssue(address,uint256)", +"600cf0d9": "getOrdersOfOwner(address,uint256,uint256,bool)", +"600d05ac": "XZARToken()", +"600d0beb": "isInRaffle(address,address)", +"600d7003": "retrieveTokens()", +"600da23a": "checkTimeBonusPercentage()", +"600de26a": "getDigitFromUint(int256,uint256,uint256,uint8)", +"600e0ee7": "getMySeeds()", +"600e85b7": "tokenGrant(address,uint256)", +"600f8cfc": "registerByList(address[])", +"60104cef": "createGame(uint256,uint256)", +"6010d60c": "lockomio()", +"60116397": "Registrar(address,bytes32,uint256)", +"6012042e": "verifyPayment(bytes32,uint256,uint256,uint8,bytes32,bytes32)", +"60136123": "NTToken()", +"6013aa44": "testControlCreateSameNonce()", +"6013d092": "tokenSaleLimit()", +"6014e37c": "getLLV_edit_15()", +"60154e85": "payComision()", +"60155673": "TEC_TEAM_WALLET()", +"601570ea": "getResponseString(uint256,bytes32)", +"6016db70": "getAssetMinAmount(address)", +"6016dd4a": "credentials(address)", +"60173ede": "FondoNetwork()", +"60175bcb": "ActivityCore(address,address)", +"6017bb61": "Death()", +"6017d51d": "testInt(int256)", +"6019061b": "createSale(uint256,uint256)", +"60192799": "steps()", +"60196008": "replaceLevel(uint256,uint256,uint256)", +"601a0bf1": "_reduceReserves(uint256)", +"601a0e77": "pseudoRandomUint8(uint8)", +"601ab918": "CashBetCoin(uint256)", +"601b349c": "removeCollaborator(uint256,address)", +"601ba73a": "setMainSale(uint256)", +"601cd624": "transfersAreLocked()", +"601d3910": "reconcile(address[],int256[],uint8[],bytes32[],bytes32[])", +"601d54eb": "ZTCrowdsale(address,address,address,uint256)", +"601ee75e": "SPINToken(address,address,uint256,uint256)", +"601fba02": "activateBuyback(uint256,uint256)", +"601fc832": "getObserverAtIndex(uint256)", +"6020b90a": "_internalTransfer(address,address,uint256,bytes)", +"6020d2c5": "_newSaddle(uint256,uint256,uint256,bool,address)", +"60213b88": "getInitialWithdrawal()", +"60214c6f": "test_method()", +"60217267": "stakedBalance(address)", +"60219c7b": "totalTokensForSale()", +"6022e6f8": "createProposal(address,uint256,string,bytes)", +"602451ea": "showAuthorizerOneAmount()", +"60246c88": "getPoolInfo()", +"60249827": "Puzzle()", +"602501a1": "SGD_Omnidollar()", +"602512e1": "setDifficulty(uint256)", +"6025d3e5": "finalizeAll()", +"60261ce6": "deadlinePreIcoOne()", +"6026bb86": "battleUnitIdRange()", +"6026c151": "offerGanTokenForSale(uint256,uint256)", +"60274396": "createDutchAuctionToBuy(uint256,uint256,uint256,uint256)", +"60281080": "HBVToken()", +"6029755e": "_generatePersonalNumber(string,uint256)", +"60299843": "minWeightDeduct()", +"6029b13f": "collect(address,address,uint256,bytes32,bytes32,uint8)", +"6029bf9f": "distributeFees(uint256)", +"6029d66f": "setRecoveryContract(address)", +"6029f53f": "getOrderTakerTokenAmount()", +"602a3fee": "sendMiningProfit(address[],uint256)", +"602acca1": "InchainICO(address[],uint256)", +"602b7001": "updateRefundApplications(address,uint256,bool)", +"602bc62b": "getUnlockTime()", +"602cd226": "DelayedPayment(address,uint256,address)", +"602cf359": "IOXToken()", +"602d7d62": "stateFail(uint256)", +"602e2533": "_fee(uint256)", +"602e496c": "fundcruVaultLockTime()", +"602e6623": "minePool()", +"602ea880": "AlphoTestTokenCoin()", +"602fbd79": "afterCrowdSale()", +"603066a4": "foundationReserve()", +"60312cdd": "LazyToken()", +"60316801": "getTokenMetadata(uint256)", +"6031749c": "updatePassport(address,uint256,bytes32,bool)", +"60319f71": "EOEToken()", +"6032f4a6": "fulfill()", +"603318ad": "getContributions(uint256,address,address)", +"60339c7b": "resetUserPromoBonus(address,address)", +"6033abd5": "CafePayed()", +"6033cdc6": "voteToUpdateMaritalStatus()", +"60344938": "changeCongress(address)", +"603510cb": "USDYToken()", +"60351748": "genericAction(bytes32[],address)", +"603546b9": "UnMint(address,uint256)", +"603553df": "ReederemEvent(address,uint256,uint256,uint256)", +"603601d5": "esercita_potere_pubblico()", +"60368a33": "totalBribery()", +"60368f30": "XLedger()", +"603709e3": "get10Characters(uint16)", +"60393a55": "addPeriod(uint256,uint256)", +"6039c60c": "fiveTimes(address,uint256)", +"6039fbdb": "addTokens(address,uint256)", +"603a552e": "engineer()", +"603c1370": "onNewLoan(uint256,address,uint256)", +"603c5e52": "SetCreditsPerEth(uint256)", +"603ccf5e": "AMBASSADOR_SEVEN()", +"603d1b98": "guardian1()", +"603d1d1c": "setSellOpen(bool)", +"603d1ed9": "createdOn(uint256)", +"603daf9a": "getBuyer()", +"603e3a40": "bulkBuy(uint8[],bytes6[],uint32[],uint32[])", +"603f4d52": "saleState()", +"60425c48": "TokenSellPercentage()", +"604269d1": "isMain()", +"6042a760": "icapTransfer(bytes32,address,bytes32,uint256)", +"6042fbe1": "maxPower_()", +"60434dcf": "getGitHub()", +"60445142": "depositCntr()", +"604497a2": "_transferFrom(address,address,uint256,bytes,bool)", +"6044ce6e": "cancelAgonForce(uint64)", +"60456068": "appreciationStep()", +"60457034": "setVerificationStatus(bytes32,bool)", +"6045804f": "delManager()", +"60464627": "totalWithdrawals()", +"6046c37f": "activateEmergencyProtectedMode()", +"6046d718": "loggedTransfer(uint256,bytes32,address,address)", +"6046f71d": "getProposalEthReward(bytes32,address)", +"6047a00e": "bonusTokensPool()", +"6047f7f5": "getTotalBmcDaysAmount(uint256)", +"60483a3f": "submitEtherProposal(uint256,string)", +"6048e89e": "setEthToBeClaimed()", +"60493ea4": "ico4Raise()", +"604a4bc8": "createTrackFromBack(bytes32,uint256)", +"604a4f9d": "regularTicketPrice()", +"604a6fa9": "Random()", +"604aa2cb": "backResiliumOwner()", +"604b2399": "_hasFlag(uint256,uint256)", +"604bf292": "safeSubtrNCP(uint256,uint256)", +"604c0b60": "transferBuyer(address,uint256)", +"604c7ef4": "BCBtuCoin()", +"604ca461": "addStory(bytes12,bytes12,uint256,uint256)", +"604cc1a5": "startGiveaway(uint32,uint256)", +"604ce56c": "MAX_ACTIVE_CANVAS()", +"604d3943": "poolCut()", +"604e3588": "SmartDollar()", +"604e4732": "tryFinializeLastProposal()", +"604e5fb8": "structureIco(uint256)", +"604e7af6": "totalDropTransactions()", +"604f87d8": "transferFromCallGas()", +"604f90a8": "getGladiatorChestAvailable()", +"604fc446": "getAddOnNeeded(uint16)", +"60500245": "registerName(string,bool)", +"60506aff": "initialDeposit(address)", +"6050eeb4": "_createLibrary(string,string,address,address,uint256,uint256)", +"6051c7cd": "acquireTokens(uint256,uint256,address,uint256,address)", +"6051fa2c": "logTradingProceedsClaimed(address,address,address,address,uint256,uint256,uint256)", +"60521116": "showPoolInfo(uint256)", +"60528e7b": "proxyWithdraw(address)", +"6052a22b": "toTimestamp(uint256,uint256,uint256,uint256,uint256)", +"6052a849": "getEtherToBuy(uint256,bool)", +"60536172": "takeOwnership()", +"60542557": "SmartExchange(string,string,uint8,uint256)", +"60546602": "isAbsent(bytes32)", +"6054da0b": "setNextCommonTTMTokenId8(uint64)", +"60566675": "LeoCoin()", +"6056969b": "announce(bytes32)", +"6057361d": "store(uint256)", +"60577043": "tixFund()", +"6057f2ca": "addDealer(string,address,uint256)", +"60583488": "get_info()", +"60585358": "getByte()", +"60589137": "ListingCancelled(bytes32,uint256)", +"60595433": "Pass()", +"6059838b": "tierTwoPurchase()", +"605a18c2": "setTokenTransferFeeProp(address,address,uint256)", +"605a42db": "superDragon(uint256)", +"605a8ea3": "AvailableCommission()", +"605ae1d0": "BIDTToken(address)", +"605b24be": "gcard(uint256,address)", +"605c0209": "ZorffToken()", +"605c2dbf": "ManagerChanged(address,address)", +"605c43de": "getBetById(uint256)", +"605cee71": "delWallet(uint256)", +"605de51d": "getTotalSponsorship(uint256)", +"605e5ee1": "delWhiteList(address)", +"605f2ca4": "distributeTokensToContributorByIndex(uint256)", +"605ff295": "CelebrityToken()", +"60608438": "setCurrentAndNextSnapshotBalance(address,uint256,uint256)", +"60616ae2": "BllotPro(bytes32[])", +"6061d692": "month30Unlock()", +"60621984": "Mining24(uint256,uint256)", +"606224f8": "sendPendingAmounts(uint256,uint256,address)", +"60643652": "maxEntrants()", +"6064d863": "revealedCeilings()", +"6065140b": "setKYCVerificationContract(address)", +"60654e47": "getLotteryBalance()", +"60659a92": "tokensAvailable()", +"6065fb33": "genesisAddress()", +"60662fe2": "TOKENS_TOTAL_SUPPLY()", +"60668e58": "getData_5()", +"6066b066": "isSaleMarket()", +"6066ed11": "getCombatsCount()", +"6067be79": "getInvestedSumToRound(uint256)", +"60689557": "Rock()", +"6069272c": "getAllEntityIds()", +"60694549": "withdrawUserPrize()", +"60699026": "mulSafe(uint256,uint256)", +"60699d92": "createPersonalTime(address,uint256)", +"606a1f7a": "EtheremonTrade(address,address,address,address)", +"606a405e": "getAddressPlayNumber(uint256,uint256,uint256)", +"606a7f01": "Addr4()", +"606a9584": "_forwardPoly(address,address,uint256)", +"606aed30": "withdrawOwedToken(uint256,uint256,uint256)", +"606baff8": "minCrowdsaleAllocation()", +"606bc9a5": "setOwnerHoverText(address,uint256[2])", +"606ce3bf": "set(uint256,uint256,uint256,uint256)", +"606d0d14": "executeOffer(uint256,bytes)", +"606d2e96": "battles(uint256)", +"606d55b1": "getY(uint256,bool)", +"606da54e": "XBLContract_addr()", +"606dc104": "openRaceCount()", +"606deecd": "requestData()", +"606ec65d": "TransferUpdated(address,uint256)", +"60702417": "MakeERC20(uint256,uint256,string,string)", +"60704108": "getAssetProxy(bytes4)", +"60708ae3": "issueAndCommit(address,address,uint256,uint256)", +"6070f1be": "NodeMCU_Endpoint()", +"60711058": "getUserDeposit(address,uint256)", +"6071eb5c": "ecosystemReserve()", +"60721b7c": "debitAmountToRefund()", +"607267d3": "getPlayerRoundDividend(address,uint256)", +"60726abb": "copy()", +"60727416": "newUserFrom(address,string,string)", +"6072ec64": "auditData()", +"60733572": "setUnicornToken(address)", +"60734859": "changeSaleTokenLimit(uint256,uint256)", +"6073660a": "findNextDay(uint256,bytes2)", +"60737a7c": "FaucetToken(string,string,uint8)", +"6073d045": "userDepositedWei(address,address)", +"6074123c": "AthlierToken()", +"607485fe": "firstYearMinedTokenCap()", +"6074b806": "updateOrderbook(address)", +"607531b6": "bitownToken()", +"6075eb7d": "openChest(uint256)", +"6076a3d5": "setEarlyParams(bool,uint256,uint256)", +"60771261": "scalarBaseMult(uint256)", +"6077759c": "bubbleSortAllMatches()", +"6078268b": "advisorsTokens()", +"60785bd1": "easyUpdateMatriarch(address)", +"6078b87e": "communityPeriodLength()", +"60795d80": "requestAllowance()", +"607a124f": "setAttrs(address,address,address,uint8,uint256,uint256)", +"607af216": "getRepresentedDTH(address)", +"607afbb5": "mySum(uint256,uint256)", +"607b463a": "getCash(address)", +"607b9169": "toOwner()", +"607b9f97": "safetyWallet()", +"607cbaff": "viewPetitionShareholder(uint256)", +"607d35c4": "uint5ToStr(uint256[5])", +"607db616": "tokenAllocate()", +"607dbae5": "ProofOfIdleness()", +"607dc1d6": "createNewCSCResource(string,string,uint256)", +"607eaf70": "investorBankroll()", +"607ecd96": "checkAccBalance()", +"607fa5a4": "updateRequired(uint256)", +"60805e5a": "unlockAddress(address,bool)", +"60808037": "numTokensForContributor(uint256)", +"6080af05": "setVoterStakesContract(address)", +"6081f5cb": "calculateBonus(uint256)", +"60820d80": "getOwnedTokens()", +"60827be8": "IDChain()", +"60829f8a": "unstake(address,address,uint256)", +"6082a02c": "getPriceIdv(bytes32)", +"6082a6ad": "Punani()", +"60834493": "Veetune(uint256)", +"60836aa4": "changeDevCut(uint256)", +"6083e59a": "maxDeposit()", +"608427e6": "ApolloSeptemTokenPurchase(address,address,uint256,uint256)", +"608458eb": "TOKEN_FOR_SALE()", +"6084747f": "mostRecentBlock()", +"60851f28": "viewThirdLotOfClauses()", +"6085e6af": "tokenSellData()", +"6086e22f": "calculateInitialPayerDeposit(uint256)", +"608716ad": "CryptoMoviesToken()", +"60874b27": "SpankICO()", +"60887081": "IEOStarted()", +"6088a917": "artworkRegister()", +"6088caf3": "tier4Time()", +"608980eb": "intervalsAt(uint256,uint256,int256)", +"6089e3c4": "BitCashPlatform()", +"608a0ff0": "transferBet(address,address,uint256)", +"608bc08c": "airDrop(address,address,address[],uint256,bool,address)", +"608bd7f4": "setLong(address)", +"608be57f": "_startNextAccountingPeriod()", +"608cadb8": "Goldmint(address,address,address,address,address)", +"608cb457": "SLACK_PERIOD()", +"608cc40a": "createRules(address,address[])", +"608d031a": "checkMiningActive()", +"608d576b": "getMultiRequestRegistrar(uint256)", +"608d670a": "XfStandardToken(uint256,string,uint8,string)", +"608e7fa6": "addAlias(bytes32,address)", +"608e9122": "InbestToken()", +"608eaa6a": "setFiscalVerify(bytes32,uint256,uint256,uint256)", +"608eba96": "_createCard(uint256,uint256,address,address)", +"608f102e": "District0xContribution(address,address,address,address,address[])", +"608f1f7e": "DGDTalk()", +"608fc07a": "updateSalesWallet(address)", +"60900c88": "coinprice()", +"60909c51": "closeDataResponse(address,address,bool,bool,bytes)", +"6090befe": "setCompanyWalletAddress(address)", +"60913244": "botOnSale(uint256,uint256)", +"6092019a": "MAX_FUNDING()", +"6092e55b": "createCDPLeveragedDai(uint256)", +"60938601": "approveOnly()", +"6094fae8": "finishTransfer(uint256)", +"609526c2": "generateRandomNumber(uint256,uint256)", +"60953744": "Mul(uint256,uint256)", +"60958192": "getProposalTTL()", +"6095c2d5": "setExchangeCommissionAddress(address)", +"60961955": "addFakeVisitors()", +"609619b4": "SecurityDepositRegistryReplaced(address,address)", +"60965dc0": "firstRoundWMStart()", +"609669eb": "StopIcoManually()", +"6096bbde": "_getGameAuctionGap()", +"60970da4": "updateCustomer(address,string)", +"609725ef": "getCurrentPassportLogic()", +"60972a84": "reissuedTransactions()", +"60975988": "PING_ORACLE_INTERVAL()", +"60979759": "p_setOwner(address)", +"6097bca9": "atnSent()", +"60994bb0": "_createRoc(uint256,string,uint256,address)", +"6099af40": "setConfigBool(bytes,bool)", +"6099ecb2": "pendingRewards(address,uint256)", +"609a54b0": "get_all_sellable_token()", +"609ab538": "newSchellingRoundEvent(uint256,uint256)", +"609ada00": "logEntropyTxDetails(string,uint256)", +"609b5785": "_mainsaleSupply()", +"609b8394": "setAnimator(address)", +"609ba988": "approveAdvertiserCharges()", +"609bdc71": "MintableMultiownedTokenTestHelper(address[],uint256,address)", +"609bec67": "period3Denominator()", +"609bf323": "VestedTokenMock(address,uint256)", +"609bf6ba": "GetGuestCount()", +"609d2bc5": "oraclize_setConfig(bytes)", +"609da897": "setupCompleted()", +"609df32f": "listNode()", +"609e5ca4": "getTournamentAmt()", +"609ec605": "toBytes(bytes4)", +"609f8fe2": "verify(string,uint8,bytes32,bytes32)", +"609f9a8e": "betFromGame(uint32,bytes32)", +"609ff0fb": "developersRecipient()", +"609ff1bd": "winningProposal()", +"60a10fa7": "setBridgeHeight(uint256)", +"60a11672": "safeTransferFromWithData(address,address,uint256,bytes)", +"60a1623f": "_withdraw(string,string,bool)", +"60a1f397": "_evaluateArea(address,uint8,uint256)", +"60a22932": "totalSaledToken()", +"60a22fe4": "nextMinimumBond()", +"60a31921": "dividendsOf(address,address)", +"60a4a929": "Assigned(address,uint256,uint256)", +"60a4d104": "dteamVaultAddr2()", +"60a4d1a5": "AddNewCard(uint32,uint32,uint8,uint16,uint16,uint16,uint16,uint32[])", +"60a4d599": "getPreICOLength()", +"60a59bdb": "random_number()", +"60a60fd8": "testProxyCallWithValue()", +"60a64947": "getAdv(address)", +"60a703ea": "ReceivedOwnership(address)", +"60a72c29": "getAppData(address)", +"60aa0e1c": "ICO_token_supplyCap()", +"60aa6b9e": "changeDueDate(uint256)", +"60ab5852": "issueTokens()", +"60acf888": "token_transfer(address,address,uint256)", +"60ad2391": "settlement(uint256)", +"60ad5bd0": "getCountrySpots(uint16)", +"60ad970d": "getLoansForAddress(address,uint256)", +"60ad9d7b": "burnByAddress(address,uint256)", +"60ae1eb5": "buySaleCardFromSys()", +"60aeac18": "neverPayBack()", +"60aef331": "buyTokensBonus(address)", +"60af9f91": "masterRecruitment()", +"60b0b0f0": "contribute(uint256,address)", +"60b1e057": "EVMSCRIPT_REGISTRY_APP_ID()", +"60b1e173": "getProof(uint256,address,address)", +"60b2a56a": "drawWinner(uint256)", +"60b35739": "_multiMint(address[])", +"60b38880": "TemperatureMeasurementA(address,int8,int8,uint16,string)", +"60b431a4": "testGetSig()", +"60b4a8fd": "getLastBidId()", +"60b6aa92": "privateIcoEndTime()", +"60b6ff5c": "ioucoin()", +"60b73223": "refundMoney(address,address)", +"60b7b3f6": "getCurLotIndex()", +"60b82e2e": "getRandomNumberList()", +"60b831e5": "cancelCall(bytes32)", +"60b95da5": "YclDoCoins(uint256,string,uint8,string)", +"60b99afb": "getIconiqMaxInvestment(address)", +"60baabf3": "nizk_setup()", +"60bba03d": "setTeamMember(address,bool)", +"60bc59b7": "__addressToString(address,address)", +"60bc5a06": "airdropManually(address,uint256)", +"60bce2f4": "usdPerEth()", +"60bd409e": "setAllowSellLands(uint16)", +"60bd7a9d": "statuses()", +"60bddc04": "getRateScore(uint256)", +"60be3547": "newLottery(uint256,uint256)", +"60be5f70": "newUser(address,bytes20,uint64)", +"60bea672": "createPorscheTicket(address,uint256)", +"60bebe98": "translateTileToWidth(uint16)", +"60bf1d2f": "ownsHive(address)", +"60bf46ea": "setQuotePriority(address,uint256)", +"60bf4dd5": "PGO_INTERNAL_RESERVE_CAP()", +"60bf9a84": "getbetData(uint256,uint256,address)", +"60bfe04e": "setRewardOpen(uint256)", +"60bff45c": "_addHolder(address)", +"60c1461f": "setNewICOTime(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"60c17d1d": "freedWosPoolForSecondStage()", +"60c17eec": "eventPaid(address,uint256,uint256,uint256)", +"60c1e433": "getSellerTransaction(address,uint256,uint256)", +"60c20c16": "addOffer(string,uint256,address)", +"60c2db45": "walletTwitter()", +"60c2f663": "toUINT128(uint256)", +"60c311fd": "doBurnFromContract(address,uint256)", +"60c31544": "exporterReceivedPayment()", +"60c326ea": "setModel(address)", +"60c46821": "fundContractForRefund()", +"60c5cc3a": "acceptProposal(uint256)", +"60c6171c": "calculateGoldBuySimple(uint256)", +"60c66c5c": "maxNumOfPayoutCycles()", +"60c677ff": "commanderAlive()", +"60c6b3a5": "claim(bytes,address,uint256,uint8,bytes,bytes)", +"60c6ccb2": "removeMonsterIdMapping(address,uint64)", +"60c6ec6f": "validState()", +"60c71546": "enableTransferEarlier()", +"60c72285": "submitRemoveOwnerTransaction(address)", +"60c79d00": "setNumTranscoders(uint256)", +"60c7bb5a": "host_lottery(bytes32)", +"60c7d295": "cache()", +"60c82d6f": "addAddressToWhiteList(address,address)", +"60ca46cd": "toTokens(uint256)", +"60ca6890": "_submitTransaction(address,uint256,bytes,bytes,address,uint256)", +"60cb5fac": "deleteChannel(bytes32)", +"60cb66d0": "sum(int256[])", +"60cb8884": "TokenBank()", +"60cb96be": "CollectibleIndex0()", +"60cc2e8c": "maxGoalReached(uint256)", +"60cce8a5": "getValuableTokenAmount()", +"60ccf311": "getPlayerMerits(address,uint256)", +"60cd4ba4": "getTimeBasedBonus(uint256)", +"60ce03d5": "totalTokenIssued()", +"60cf7133": "testSetPermissions()", +"60cfc624": "setLLV_edit_26(string)", +"60cfd359": "mainSale()", +"60d12fa0": "getExecutive()", +"60d1c056": "usedPaymentSupply()", +"60d1ce36": "collectibleIndexToApproved(uint256)", +"60d26f01": "ownerTransferWei(address,uint256)", +"60d2bee9": "addArtistSignature(uint256,bytes)", +"60d3b4b0": "frwd()", +"60d3e4c5": "isDistributionInProgress()", +"60d4c79b": "burnOneBroGlobal(uint256)", +"60d50130": "FineArtsToken(uint256,string,string)", +"60d586f8": "getValue1()", +"60d60d2e": "countcomp()", +"60d60dad": "mainSaleFirstEndDate()", +"60d63425": "StakePool(string,string,uint8,uint256,uint256)", +"60d704db": "getBank()", +"60d8c2d2": "oneTokenWei()", +"60d938dc": "isPresaleActive()", +"60d975c9": "GG()", +"60d9c823": "removeClientAuthority(address)", +"60d9f0a8": "setNotarius(address)", +"60da4bd7": "batchCancelVoteForCandidate(address,address[],uint256[])", +"60dab6be": "ActionAgon()", +"60dccd89": "getContentAccount(uint256)", +"60dd5f90": "getPolicy(string)", +"60ddd8e8": "sumICOStage2USD()", +"60dddfb1": "votingWeightOf(address,uint256)", +"60dde4c2": "queueFront()", +"60de94d0": "setCCH_edit_11(string)", +"60e036a0": "EtheremonAdventurePresale(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"60e092c6": "cancelOrder(address,address)", +"60e11e16": "Lira()", +"60e232a9": "changeVault(address)", +"60e2f6e8": "createProxyAndCall(bytes)", +"60e30a02": "ChinaInvestmentExchangeToken(uint256,string,uint8,string)", +"60e393c6": "DEVELOPER2()", +"60e39f73": "PotatoToken()", +"60e45f04": "UBSexToken()", +"60e474e3": "_issue(address,uint256)", +"60e4c1ac": "LogReceived(address,uint256)", +"60e519c0": "computeMarginAmount()", +"60e587f9": "goldReward()", +"60e5ef3a": "getPrice(uint8,uint8)", +"60e65bb8": "startTrading(bool)", +"60e68a25": "dash()", +"60e6cfd8": "addKey(bytes32)", +"60e6fb26": "resumePurchases()", +"60e708b3": "balanceOfUnlockTokens(address)", +"60e794de": "stageDataStore(uint256)", +"60e7a381": "o_aprendiz(uint256)", +"60e805c5": "LogMigrationCanceled(address,address,address)", +"60e85674": "checkLogin(address)", +"60e99b77": "getProposalState(bytes32,bytes32)", +"60e9c78b": "isNeedCheckTickets()", +"60e9f17e": "CRDToken()", +"60ea110b": "fromToken(uint256,uint256,uint256)", +"60eabebd": "CreateAPP(address,uint256)", +"60eb2826": "Badge()", +"60ebb498": "adminCancelWithdrawal(address,uint160,string)", +"60ec4f73": "starVoting(uint256,uint8)", +"60edc4c4": "timeOf(uint256)", +"60ee66c9": "setSubcontinentDiscoveryVotingContract(address)", +"60ef6037": "buySaddleShop(uint256)", +"60f01452": "updateEggs()", +"60f14509": "hodl()", +"60f17941": "tokensGranted()", +"60f1d148": "getMaximumBetAway()", +"60f247b5": "confirmTransaction(uint256,address)", +"60f2b9af": "setDocumentData(string,string,string,string,string)", +"60f2e1c0": "buyAndCrave(string)", +"60f2f673": "setcoe(uint256)", +"60f38d91": "endEarlyStage1()", +"60f5ac86": "campaignOpen()", +"60f5d0d8": "ReloadKeys(uint256,uint256,uint256)", +"60f61a4c": "buyUnitRaffleTicket(uint256)", +"60f66701": "useCoupon(string)", +"60f69dc0": "partnerReservedSum()", +"60f6e71d": "KuendeToken()", +"60f6fb2e": "chunkedWeiMultiple()", +"60f75530": "countRemaining()", +"60f75f3b": "closeMarketOrder(uint256)", +"60f8af90": "refundRound()", +"60f8bbb8": "setPuppySports(address,address)", +"60f8dab7": "userRefund()", +"60f8e036": "manageStatus()", +"60f96a8f": "parent()", +"60fb4aa0": "founder4Wallet()", +"60fd0668": "WAVcoin()", +"60fd0e91": "mintlist(address[],uint256[])", +"60fd1e66": "_movePendingToSetting(uint256,uint8)", +"60fd902c": "gnosisToken()", +"60fdd1c9": "setStakeRate(bytes32,uint256)", +"60fdf8ff": "GameEnded(uint256,uint256,uint256)", +"60fe103e": "logFeeWindowMinted(address,address,uint256)", +"60fe136e": "BogdanoffCoin()", +"60fe47b1": "set(uint256)", +"60fece43": "percentForTeam()", +"60ff77cc": "ledgerRecordAdd(uint256,bytes32,uint256,string,uint256,bytes32,uint256)", +"61001cd3": "testIsStarted()", +"61004364": "depositTokenTo(address,address,uint256,uint256)", +"6100b1e1": "resetDiscounts()", +"610103d9": "changeTxFee(uint256)", +"61012e15": "phaseLength()", +"6101a1f7": "unitStealingCapacity(uint256)", +"6101d16b": "getNumberOfSharesForAddress(uint256,address)", +"6101d4f5": "payTheMan(uint256)", +"6101f748": "FundsRegistryWalletConnector(address[],uint256)", +"61025532": "permitBurning(bool)", +"61027f78": "paying()", +"610285d2": "testControlRetractLatestRevisionDoesntHaveAdditionalRevisions()", +"6102c049": "getBatchNumber(address)", +"6102d419": "getEthForMetResult(uint256)", +"6102e4e4": "verifyProof(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[11])", +"610358ae": "removePrivelegedWallet(address,address)", +"61039bef": "releaseLocked(address)", +"6103ae75": "AGENCY_ADDR()", +"6103d70b": "withdrawPayments()", +"6103d915": "Winners(uint256)", +"6103dda6": "mutate(bytes32,bytes32)", +"6104464f": "previousPublishedVersion()", +"61046d8b": "setRLCPerETH(uint256)", +"61047ff4": "fibonacci(uint256)", +"6104d75a": "deathData_f13()", +"61050bb7": "_fetchPaidOrdersForPayer(address)", +"61053cd3": "tokensByUsdTx(string)", +"6105b499": "artCopyright()", +"6105c8af": "stubFunction(address,uint256)", +"61064b48": "GetInvestorAddress()", +"61064b5a": "processMarkings(address,uint256)", +"61066dc3": "enableServiceMode()", +"610757e4": "_wallet()", +"6108b5ff": "channel_deposit_bugbounty_limit()", +"6108bd0e": "sowCorn(address,uint8)", +"61096820": "CETH()", +"6109e255": "EtherSent(address,uint256)", +"6109ff33": "BihuaToken()", +"610af570": "voteOnDraft(bytes32,bool)", +"610b16ab": "onTransferStack(address,uint256,uint256,uint256,uint256,uint256,bytes32)", +"610b1abd": "lottery(uint256,uint256)", +"610bafaa": "getTotalBPOfAddress(address)", +"610bbebd": "Sensor()", +"610be654": "closeContract()", +"610c1d68": "addNtf(bytes32,uint256,address)", +"610c3009": "badgeName()", +"610cbcc7": "logHash(uint256)", +"610d006c": "getSourceConstraint(int256,uint256,uint256,uint256)", +"610d5de8": "validateEndowment(uint256,uint256,uint256,uint256,uint256)", +"610da891": "debug3()", +"610e9ed0": "postDisputeEth()", +"610efc86": "RegisterMine(string,uint256)", +"61101bed": "getTAmount(uint256,uint256)", +"611067a1": "Rate7()", +"6110e614": "duringSale(uint16)", +"61116d1d": "masternodeDeregister()", +"6111bd91": "cyberEntry2(address,bytes32)", +"6111ca21": "enroll(address,uint256)", +"6111dd02": "calcCostsSelling(uint256,uint8,uint8,uint256)", +"61129a80": "getEarlyIncomeMul(uint256)", +"6112c2ab": "summPartnerships()", +"6112c7c9": "RedirectChanged(address,uint256)", +"6112e8ac": "mint(address,uint256,uint8)", +"6113611f": "stakeVoted_Eth()", +"611408ff": "latestReleaseUrl()", +"6114dc0f": "lastFlight(address)", +"61150aae": "ethusd()", +"61161aae": "bury()", +"61162182": "storeDoc(string)", +"6116ec49": "VotingFinished(address,bool)", +"6117525b": "initialClaesOffering()", +"6117b80c": "getFixedAndShareFees()", +"6117c9db": "retainedTokensVault()", +"61186e23": "getCountdownDate()", +"611a20ae": "IotcToken(uint256,string,uint8,string)", +"611b4095": "isWhitelisted()", +"611c4662": "getPriceByDayIndex(uint16)", +"611c7f50": "Core()", +"611cb25f": "failStage()", +"611cb6aa": "Vault(address,uint256,uint256,uint256)", +"611daa7e": "EmergencyBalanceReset(uint256)", +"611eb470": "maximumICOCap()", +"611ef452": "cancelDelivery(string)", +"611efc09": "sale(address,uint256)", +"611f1fbe": "itsLikeChicago()", +"611f64f9": "setTokenPrice(uint128)", +"611f69de": "__proxy_motion(address,uint256,uint256,bytes)", +"611fd026": "showApproveToken(address)", +"61203265": "organizer()", +"6120ada7": "setAuto(uint256)", +"6120e125": "TUMIYUNTOKEN(uint256,string,uint8,string)", +"6120ffbc": "accountsPayableHeld()", +"61211087": "firstAuctionsHighestBidder()", +"6121e522": "teleportPrice()", +"612249fb": "communityContributionSupply()", +"6123218b": "registerPurchase(bytes32,address,uint256)", +"61235639": "AcreToken(address,address)", +"6123c63f": "removeEmbassy(address)", +"6123dfc3": "NoWinner(string)", +"6123f7ba": "onlyWithValidSignatureAndMethod(bytes)", +"61241c28": "setTokenRate(uint256)", +"612472fe": "toZT(uint256)", +"6124a577": "whitelistController()", +"6124e4e7": "dividendContract()", +"612544b3": "getReservedTokens(address)", +"6125fd20": "voteForRefund(bool)", +"6126cb99": "registerAsset(address,bytes32,bytes8,uint256,string,string,address[2],uint256[],bytes4[])", +"6127421d": "tokenPayments(address)", +"6127a1ad": "_setRarityValue1(uint256)", +"6127cfd9": "verify_withdraw()", +"6127f246": "getActiveTasks()", +"61282631": "tokenMintedSupply()", +"612845fc": "claimQueen(uint8)", +"612867c2": "calcRefund(bytes32)", +"6128a4f3": "investorsLosses()", +"61296540": "rewarded_refresh()", +"6129f25f": "setReferralPercent(uint256)", +"612a711f": "SimpleERC20Token(uint256,address)", +"612a7562": "setBountyRegistry(address)", +"612ab238": "balanceOfOnForHolder(address)", +"612acecc": "frozenForever()", +"612bfae2": "description4()", +"612c0968": "privateSaleRate()", +"612c56fa": "submitVote(uint256,bool)", +"612c9dea": "unreserveFor(address)", +"612d6061": "getExpectedMinReturn(address,address,uint256)", +"612d669e": "setMinStakingAmount(uint256)", +"612e45a3": "newProposal(address,uint256,string,bytes,uint256,bool)", +"612e731d": "TheGreatEtherRace(string)", +"612eb5e7": "revokePermission(uint8,address)", +"612ecc48": "MINIMUMCONTIB()", +"612ed785": "winningTeamIndex()", +"612ee726": "isOnAuctionToBuy(uint256)", +"612ef473": "betRevealed(uint256)", +"612ef6e9": "isRefundApplied(uint256)", +"612ef80b": "marketLiquidity()", +"612f2f37": "setMaintenance(bool)", +"612ff19e": "PolicyPool(address)", +"61301409": "minereum()", +"61309e2a": "tryFinalizeProposal(uint256,address[],bool,int256)", +"6130ced2": "UniCoin(uint256,string,string)", +"6130d537": "createPartnerPlayer(uint256,uint256,uint256,address)", +"61314ee3": "managerAddressMap(address)", +"6132ca1a": "getResult(uint32,int8)", +"6133a0eb": "PRE_SALE_300_ETH()", +"61347782": "getStakingRegistry()", +"6135a0ad": "getCallback(bytes32)", +"6135e084": "myDividendTokens()", +"6135f602": "contractPartTwo(uint256)", +"61362b68": "reInitialize(address,address)", +"613696eb": "burnCadvsLeftInRefunding()", +"6137412c": "monethaGateway()", +"6137d670": "submitWhitelistRemoval(address[])", +"6138889b": "distribute(address[])", +"61389e8b": "getTokensManual(address)", +"6139a008": "numTokensLimit()", +"6139faa6": "getAllTimes()", +"613a626b": "SnipCoin()", +"613aa6e7": "ResetCardPriceAdmin()", +"613bc081": "ExternalAccountWalletConnector(address)", +"613c36ae": "sendToStocks()", +"613d8fcc": "oracleCount()", +"613de7cb": "subWizard()", +"613e0fb8": "reservationWallet()", +"613e2de2": "getContractInfo(bytes32)", +"613f4594": "totalBetAmount()", +"613f5b9f": "TokenContractAddress(address,address)", +"613f5fe8": "MAX_USER_TOKENS_BALANCE()", +"613f7665": "getClosedSaleWallet()", +"613f8dac": "sellShitClones()", +"613fd87a": "calcBigPromoBonus(uint256)", +"613fd998": "messageSpecial()", +"613ff46f": "rewardPerNode()", +"6140128f": "getTupleDetails()", +"61402596": "setInitialSupply(uint256)", +"6140af43": "preICOcollected()", +"6140c54c": "createProxy(address)", +"6140ca78": "setIsMiningOpen(bool)", +"6141b54b": "FundsWithdrawn(uint256,address)", +"6141d5d0": "CoffeeToken(address)", +"6142101a": "last_buyer()", +"61425d79": "numRequesters()", +"61426df4": "STCListing()", +"6142e78f": "allowedAmountTransferedToPoolTotal()", +"6142ff70": "createShipment(address,string,string,int256,int256,uint256,uint256)", +"61432e81": "ConsumeGas(uint256)", +"6143a80a": "isGameEnded(bytes32)", +"6143abba": "totalCreatedOfType(uint256)", +"6144a8a1": "ZJFPrivate()", +"61461954": "execute()", +"61463838": "getMyPlumbers()", +"61463b64": "_hashToAscii(bytes32)", +"61465a32": "distribute(uint256,uint256,uint256,uint256)", +"61472fd4": "CSGOBets()", +"61476d55": "GetTotalAmountForMultiplicator()", +"614781f9": "atkBoss(uint256)", +"6147a55c": "SwapPaused(uint256)", +"6147bcb9": "getPVPState()", +"6148fed5": "pollMap(uint256)", +"614939b2": "allocateTokensForTeam()", +"61493b97": "set_minimum_payment(uint256)", +"61494714": "_createNewGame(uint64)", +"61496b83": "endSplitAgreement()", +"614984d1": "getUnicornGenByte(uint256,uint256)", +"614a31bf": "setII_R2(uint256)", +"614af914": "_updateMargins()", +"614b3e7f": "BCSToken()", +"614baf5c": "withdrawAffiliateRewards()", +"614bbc33": "privateContribution(address,uint256)", +"614be0c4": "getRemainShareAmountInternal(address)", +"614cb904": "isFinalizeAgent()", +"614d08f8": "CONTRACT_NAME()", +"614d5f07": "stepForPrice()", +"614d85e1": "timeOut()", +"614f2b3a": "_diff(uint256,uint256)", +"614f3994": "SpeedyNetwork()", +"61515334": "returnUserAccountAddress()", +"615155dd": "getVesting(uint256)", +"61523f2e": "changeEthReward(uint256)", +"61537010": "Whitelisted(address,uint256,uint32)", +"6153b827": "BancorHandler(address)", +"6154274d": "deleteProposal(string)", +"61543801": "currentPeriodIndex()", +"6154c16f": "MineOwner(uint256)", +"6154db6e": "UroToken()", +"61558349": "BitTeamToken()", +"615664ba": "Market()", +"6156e892": "checkOnlyContractOwner()", +"61571ddd": "distributionFinishing()", +"6157c5ec": "getGoldInfoSku(address)", +"615815f5": "releaseSecondUnlock()", +"61584936": "sealedBids(bytes32)", +"615878c8": "SkrumbleCandyToken()", +"61591a7c": "personUpdateDOB(uint256,int256)", +"61592b85": "getOrderDetails(uint32)", +"615a4e0f": "ChangeMainAccount(address)", +"615a604f": "setMarketer(address)", +"615acbae": "Freeze()", +"615af5fb": "areTokensSended()", +"615c2971": "Gametest()", +"615dbebb": "setContract(address,address,address,address)", +"615df83a": "remainderHolder()", +"615dfa5c": "defaultParams()", +"615ea899": "changeHello(string)", +"615ef639": "tokensClaimedAirdrop()", +"615f9f1f": "testFailTransferNotEnabled()", +"615fa416": "totalAtom()", +"61616292": "STCBonus(uint256,uint256)", +"6161eb18": "_burn(address,uint256)", +"61625c3a": "setLockByPass(address,bool)", +"61632d4d": "institutionStageSetting()", +"616361a7": "getArrUintField3()", +"61638ed5": "depositFunds(uint256,uint256)", +"61641bdc": "add(bytes32,address)", +"61649472": "getPoolFreezePeriod()", +"6165234c": "setPermissions(address,bool)", +"61665e40": "_premoveByValue(address)", +"61669dfa": "setSpecialBonus(address,uint256)", +"61679629": "UniversalRewardProtocolToken()", +"616852e9": "GoldBought(uint256,address,bytes32,string,string,bytes32,string,string,bool)", +"61688a85": "Lwcoin()", +"6168ba3c": "getWeiAggregateMayInvest()", +"6168c9c3": "tosell(address,uint256,address,uint256,address,uint256,uint256)", +"6169a7ed": "CashForHardwareReturn()", +"616a0997": "TokenPurchase(address,address,uint8,uint256,uint256,uint256,uint256)", +"616a3420": "verifySig(bytes32,bytes,bytes)", +"616a6371": "SingleAccountRules(address)", +"616b40e3": "totalInvest()", +"616b59f6": "deleteBytes(bytes32)", +"616b829d": "SwappedTokens(address,uint256,uint256)", +"616c9469": "Finalized(address,uint256,uint256)", +"616ceda7": "setJOYTokenAddress(address,address)", +"616d1fab": "distributeToAlternateAddress(address,address)", +"616d5058": "userAccounts(uint256)", +"616d50c3": "GCToken()", +"616dcf0c": "calculateTotalSupply(uint256)", +"616e2fd0": "FortaToken()", +"616e9f8f": "getInterval(uint256)", +"616eba4a": "getLocksrootIdentifier(address,address,bytes32)", +"616f7bc9": "addAddressesSet(address)", +"616fbee7": "changeMinimumBet(uint256)", +"616fca9b": "adopt(address)", +"616fe92a": "emitFeePoolUpdated(address)", +"616ffe83": "read(string)", +"61708908": "prepareDisputeValid()", +"6170a23e": "transferTech(address)", +"6170b162": "join(bytes)", +"6170feec": "getWinIndex(address,uint256)", +"61711115": "RegistrationStatusChanged(address,bool)", +"61718141": "totalSupplyIsLocked()", +"61719785": "clockmaker()", +"6171d7fc": "adjustTotalCoins(int32)", +"61725795": "setAquaman(address)", +"6172c0df": "updateDeposit(address,uint256,uint256)", +"6172f071": "setIsAllTransfersLocked(bool)", +"6173a70c": "initRandom(address)", +"6173e456": "setAMLWhitelistedBulk(address[],bool[])", +"617421c9": "calTripleRoom(uint256,uint256,uint256,bytes32)", +"61751577": "addCET6(uint32,uint64,uint64,uint64,uint16,uint16,uint8,uint8,uint8)", +"6175adee": "icoStandardPrice()", +"6175bc9c": "preStartBlock()", +"6175f9e2": "dragonHandler(uint256)", +"617605a1": "Zillion()", +"61764f59": "BitDATAToken()", +"6176caed": "HeroTrained(uint256,address,uint256,uint256,uint256,uint256,bool,uint256)", +"617708dd": "getEscapeRequest(uint32,int256)", +"61774704": "verifyBid(bytes32,bytes32)", +"61775ee1": "onlyBouncerRemoveExtension(address)", +"6177a197": "GoGoPay()", +"6177fa04": "setGenerateAddr(address)", +"6178a8b1": "splitStarFunds()", +"6178ac90": "_createCompanies(bytes32[],bytes32[])", +"6178efee": "returnToken(uint256)", +"617914be": "AUTH_CHANGEOWNEDOWNER()", +"61794267": "oldExecuteDecayFunction(uint256,int256,int256,uint256,uint256)", +"61798287": "safeToNextIdx()", +"6179ed72": "ProofOfSecret()", +"617a0951": "feeModifiers()", +"617a2a15": "icoStartP2()", +"617ac9a1": "SOSRcoinToken()", +"617b293e": "getInvestStatus(uint256)", +"617b390b": "approvePreSigned(bytes,address,uint256,uint256,uint256)", +"617bb8f5": "reject(uint32,uint32)", +"617c2fb8": "sell_Exchg_Reg(uint256,uint256,address)", +"617d2c84": "PRIMEx()", +"617d3c47": "RemovalPriceSet(uint256)", +"617d6bb4": "distributeEarningsBasedOnNumberOfCells(address,address)", +"617e80b4": "getPlayerShipModelByIndex(address,uint256)", +"617ee3a7": "MoonInc()", +"617f171f": "reopenDO()", +"617f4e3e": "set_got_refunded()", +"617f8666": "testFailRestartNotOwner()", +"617fba04": "getRecord(address)", +"617fc592": "priceStages()", +"61806891": "idVerification(address,address,uint256)", +"6180e4ac": "getAvailableNumbersForRaz(uint256)", +"6181d565": "getExpectAmount(uint256,uint256,uint256)", +"6181fb0a": "ERC20(uint256)", +"618293ba": "_updateState(uint256,uint256)", +"61829677": "claimdivs()", +"61836b0e": "lastUpdateEtherPrice()", +"61837e41": "get_stats()", +"6183c5d6": "EthereumAI(address)", +"618407e5": "tokenDrain()", +"61840c69": "getSaleSold(uint256)", +"61851416": "modifyCurrentVideoGamePrice(uint256,uint256)", +"61851679": "Protecthor()", +"6185bb50": "AOC_available()", +"6186b3e3": "showMoneyTransfer(uint256)", +"6186fe71": "CloseForecasting(uint16)", +"6187ce34": "gameRandon2()", +"61886014": "combineDice(uint8,uint8)", +"61888b40": "_percentSoldInPreICO()", +"618943c3": "WhitelistItemChanged(address,bool,uint256,uint256)", +"6189be15": "columnround(uint256,uint256)", +"618a057a": "_bidFirstShip(uint256,address,address)", +"618a1ec2": "getGoldDepositOfAddress(address,address)", +"618b870f": "setAmount2Claim(uint256)", +"618c5772": "removeTransferableAddresses(address[])", +"618cb85b": "GitCoinCrowdsale(uint256,uint256,address,address)", +"618ce6d7": "setWhitelistedAddressMain(address[],bool)", +"618de286": "addWhiteListMulti(address[])", +"618ea1c4": "terra()", +"618fa9ce": "getBotBillingIndex(uint256,uint256)", +"618fb1a6": "unsoldContract()", +"61903971": "MajListAll()", +"6190c931": "unclaimedCreditsWithdrawn()", +"6190c9d5": "cycle()", +"6190e9ca": "authorizedTokenUsers(address,address)", +"61919a08": "getWorks(bytes32)", +"6191fe9d": "FFC()", +"61927adb": "setDelegatedFrom(address)", +"61930630": "tokenStore()", +"61931f39": "zGetBothContractBalances()", +"61936d0a": "Wings(address,address,address,address)", +"619385bd": "newShare(address,uint256)", +"619419d8": "setTopic(uint256,string)", +"6194416b": "getProof(string,string,string)", +"6194acb6": "_validateOrder(uint256,uint256,bytes32,address,uint256,uint256,uint256,uint256)", +"6195c713": "against_proposal()", +"61962265": "PRESALE_MAXIMUM_FUNDING()", +"6196ac5b": "RubidSupply()", +"619792ba": "OwnershipGranted(address,address)", +"6197aadd": "JANDA()", +"6197bbab": "createRareAuction(uint256,string)", +"61983863": "MintedTokenCappedCrowdsale(address,address,uint256,uint256,uint256,uint256)", +"6198e339": "unlock(uint256)", +"61990759": "maxRandom(uint256,address)", +"6199ca26": "AmbrosusSale()", +"619a794d": "setAtomIsReady(uint256,uint32)", +"619c83ed": "completeTransfer(uint256)", +"619c89fe": "changeForeignBridge(address)", +"619caafa": "Reward(address,uint256)", +"619cba1a": "requestEthereumChange(address,string)", +"619cec73": "DSHAckCoin()", +"619cf5f9": "batchtransfer(address[],uint256[])", +"619d2671": "acceptContract()", +"619d3063": "getNftId(uint256,address,uint256)", +"619d36ef": "DRAW()", +"619d5194": "setLock(bool)", +"619e6e7c": "userWalletTokenBalances(address)", +"619ebc4f": "GetTimeWeightedBet(uint256,uint256)", +"619f5e72": "takeExcess()", +"619fabfd": "addMultiplePublicSalesSpecialUser(address[])", +"619fc641": "backup_exchangeStaStb(uint256,uint256)", +"61a00f6d": "Ballot(bytes32[])", +"61a07bc9": "AhihiToken(address,address)", +"61a12160": "getPendingAddReserveData()", +"61a1d8fa": "SchmeckleToken()", +"61a215e4": "Controller(address,address,address,address)", +"61a227b6": "mtdAmount()", +"61a23f42": "loadReferredInvestors(bytes32[],address[])", +"61a2493a": "Jancok()", +"61a255b5": "vote(string,string,uint256,bool)", +"61a25f07": "lotteryFinished()", +"61a2d076": "isWhitelistOnlyPermissionSet()", +"61a39946": "depositAgent(uint256,uint256,address[],uint256[],uint256)", +"61a3a281": "deployDefaultVestingContract(address,uint256)", +"61a5c4bd": "updateTokenAmount(uint256)", +"61a65433": "pot_total()", +"61a65e2a": "discountSaleEnd()", +"61a71303": "setMainSaleTLYperETH(uint256)", +"61a76900": "decode(uint256)", +"61a7b2f5": "transferFromIco(address,uint256)", +"61a99c4b": "ethDeposits()", +"61aa19d3": "icoAmountBonus1()", +"61aa8d93": "processFee()", +"61ab8904": "updateStats(uint256,uint256,uint256)", +"61ad08b5": "setSupervisor(address,address)", +"61ad487c": "PRESALE_PERCENTAGE_3()", +"61adeef4": "setUUID4Bytes(bytes16)", +"61aebe59": "stopSell()", +"61af1abd": "increasePriceAndDifficulty()", +"61afc1d5": "IsActiveUser(address)", +"61afd5ac": "denyAccess(address)", +"61b121f5": "OneCoinOneBeerToken()", +"61b1bd04": "HumanEvent(address,uint256,address,address)", +"61b20d8c": "retrieveFunds()", +"61b2bb37": "setHalfLifeTime(uint256)", +"61b3516e": "MyCoins()", +"61b3b8e3": "p_setInvestorFundPercent_out(uint256,uint256)", +"61b46d61": "buyHunterLicence()", +"61b65fbe": "UpdateRank(address,uint256,uint256)", +"61b6683c": "destroyedBots()", +"61b69abd": "createProxy(address,bytes)", +"61b6f889": "handleOffchainWhitelisted(address,bytes)", +"61b7542d": "absMax(int256,int256)", +"61b79ea4": "incentiveDistributionRound()", +"61b7d7f4": "FiveBalanceToken()", +"61b87f0d": "getTokenAddressIndex(address)", +"61b8ce8c": "nextId()", +"61b930ae": "ICOfundsReceiverAddress()", +"61b94bc7": "LiverpoolvsRoma()", +"61b9739a": "setPayTo(address)", +"61b97435": "Register(address,bytes4,bytes18)", +"61b98cb3": "buyShips(uint256,uint256,bool)", +"61b9c6a3": "useBottle(address,uint256)", +"61b9c9f4": "buySeat(string,string,string)", +"61b9e2bb": "proveInUnconfirmedBalances(bytes,bytes32,bytes32)", +"61ba228b": "LukSevenToken()", +"61ba3377": "WatchLastTime()", +"61ba89d4": "NSCDistributionContract()", +"61bb246c": "secondBonus()", +"61bb9c52": "baseValue()", +"61bc1a49": "depositBalance()", +"61bc221a": "counter()", +"61bc6c57": "unauthoriseAddress(address)", +"61bcbe6f": "goodluck(uint256)", +"61bd12e0": "FAILED_STATUS()", +"61bdc978": "unfreezeFrom(address,uint256)", +"61be8456": "updateMarketData(address,address,uint256,uint256,uint256)", +"61beb1d7": "createAuction(address,uint256,uint256,uint256)", +"61bec256": "setContractActive(bool,bool)", +"61bec4fd": "QLANCEGO()", +"61bedcdc": "registerEmployee(address,address)", +"61bf2829": "RegistrationStatusChanged(address,bool,uint256,uint256,uint256,uint256)", +"61bf49ee": "plots(uint256)", +"61bf7692": "withdrawFoundationFunds()", +"61bf9c2a": "updatePoolContract()", +"61bfdc5d": "PatentCoinPreICO(address,address)", +"61bfe61b": "testAddUser(address,uint256)", +"61bffe01": "addIdentities(bytes32[],bytes32[])", +"61c003a7": "buyerNumDeals()", +"61c028e7": "getTokenURI(address)", +"61c083b9": "updateInflationRate()", +"61c1f224": "Q8ECOIN()", +"61c2c9c0": "getHowMuchUntilHardCap()", +"61c2e349": "create_a_new_market(address,address,uint256,uint256,uint256)", +"61c3b7f1": "setCharityBeneficiary(address)", +"61c52660": "Said(address,bytes)", +"61c5623d": "Vanadium()", +"61c61309": "setTokenController(address,address)", +"61c651b9": "oneQuarterInSeconds()", +"61c6a8e4": "addMutagenFace(uint256,uint256)", +"61c6bc82": "create(string,string,uint8,address)", +"61c748c7": "TressexToken()", +"61c76231": "resetBeneficiaryList()", +"61c7eb81": "Millionaire()", +"61c91c69": "webGiftLineTime()", +"61c9559b": "get_arbits_presale_open()", +"61c99b92": "msgsender()", +"61cac1fb": "partnersReward()", +"61cb5a01": "testString(string)", +"61cc576d": "evaluateOdds()", +"61cd5683": "testToByte(bytes)", +"61cd756e": "prevRegistry()", +"61cd90b0": "revealY(uint256,uint256)", +"61cdb1d7": "getByMesa(uint256,uint256,uint256)", +"61cdd2dc": "rightAndRoles()", +"61cec717": "changeCurrentCirculating(uint256)", +"61cf6d1c": "investeth2018()", +"61d027b3": "treasury()", +"61d0ad9e": "TransferFunds(uint256,uint256)", +"61d11318": "RedEnvelope()", +"61d161ea": "unitsPerTransaction()", +"61d3ba8a": "addWhitelistAddresArray(address[])", +"61d3d7a6": "isUpgradeAgent()", +"61d3d902": "getPlayerReferrerID(uint256)", +"61d43971": "updateGasCost()", +"61d49ea8": "reveal(uint256,uint256,bytes32)", +"61d51df8": "SKYSWAP()", +"61d5593c": "calculatePoohSell(uint256)", +"61d585da": "state(bytes32)", +"61d5f225": "minBetSize()", +"61d60021": "getCourseID(address,address)", +"61d61998": "implementsERC721YC()", +"61d689fa": "register(uint8)", +"61d68b54": "requestConsent(address,address,uint256)", +"61d6d385": "withdrawUnsold()", +"61d7c713": "validPayDest()", +"61d81aed": "exitBuyRequest(uint256)", +"61d942f3": "_removeLicenseTerms(bytes32,bytes32)", +"61d97c41": "GetPartyRole(address,address)", +"61da1439": "read(bytes32)", +"61da46c4": "joinDraw(uint256)", +"61db17ab": "_validatePurchase(uint256)", +"61dbbc80": "LARGE_PURCHASE()", +"61dbfc3f": "changeConfig(uint32,uint256,uint8)", +"61dc648f": "LogExternal(uint256,address,bytes32)", +"61dcd7ab": "createTime()", +"61dd8d13": "DexAlpha()", +"61ddf923": "_getTokenAmount(address,uint256)", +"61df46f6": "DatCoin()", +"61df5c4d": "getEncounterResults(uint256,address)", +"61dfacf2": "removeBuildingFromServer(uint256,uint8[10],uint8[10],uint8)", +"61dfdae6": "setData(address)", +"61e01356": "randNonce()", +"61e062a4": "_emitHardcapFinishedManually()", +"61e0f7a8": "swypeCode(address)", +"61e1077d": "decreaseApprovalWithSender(address,address,uint256)", +"61e1fe91": "setFreeDino(uint16)", +"61e214d8": "isValidPurchase(uint256)", +"61e25d23": "numActiveTranscoders()", +"61e3564f": "approveAccount(address,bool)", +"61e360b7": "maximumIndividualCap()", +"61e3c944": "setUint(uint256,uint256)", +"61e3f0a4": "setTimeBasedBonus(uint256[],uint256[],uint256[])", +"61e42039": "priceString()", +"61e49344": "buyinReturn(address)", +"61e4a23a": "expireGame(uint256)", +"61e4fd2b": "approveEscrow(address,uint256)", +"61e539da": "testFailWrongAccountTransfers()", +"61e5f5f2": "balEth()", +"61e60550": "TransactionDisputed(uint256)", +"61e6e66b": "DestroyedBlackFunds(address,uint256)", +"61e76056": "denyByDelegate(bytes8,bytes8)", +"61e7662b": "getAccountSpendingLimit(address)", +"61e88f9a": "test_0_validOwner_construction()", +"61e8ee04": "TOXTToken()", +"61e91ea1": "getDataContractAddress()", +"61ea6ed7": "transferFromBase()", +"61eb2e1a": "UNITStagesManager(bool,address)", +"61eb3836": "getProjectStatus(address)", +"61eb71c1": "setSellable(bool)", +"61eba552": "getMetaData(uint256)", +"61ecc8b5": "isLogo(address)", +"61ed2094": "demicals()", +"61ed373b": "comment(uint256,bytes32,bytes32)", +"61ed8097": "SEOToken()", +"61eda968": "cancelAssessment()", +"61edfe6e": "p_setBankOfEthProfitPercent(uint256,uint256)", +"61ef265b": "spaceAfterReturns()", +"61ef669b": "dateTier2()", +"61ef8d91": "setErc20Rate(string,uint256)", +"61efc7db": "resolveDelegation(address,address)", +"61efc807": "transferbatch(address[],uint256[])", +"61f00da2": "OMIVIAToken()", +"61f127dd": "_price_tokn()", +"61f134fa": "OZRealestatesToken()", +"61f15236": "addHolder(address,uint256)", +"61f17532": "tune(uint256,uint256)", +"61f188de": "createTree(string,string)", +"61f1c5ba": "vaultWallet()", +"61f1d889": "setFlag(uint256,uint256)", +"61f2c8b0": "_addShareToNewOwner(address,uint256,uint256)", +"61f2de50": "spawn(uint256,address)", +"61f30408": "emitTimeAdded(uint256,uint256)", +"61f37dff": "calculateIcoTokenAmount(uint256)", +"61f3c006": "setRoundMaxPerUser(uint256,uint256)", +"61f3c62e": "remain()", +"61f3cfb1": "updateExistingRaz(uint256,uint256,uint256,uint256,uint256,string)", +"61f43285": "gubberment()", +"61f529af": "initEthMultiplicator(address)", +"61f54a79": "getNextUnsortedOffer(uint256)", +"61f61867": "addSettingDeprecation(uint256,uint256,address,address,address)", +"61f66dc4": "updateUserClaim(address,uint256)", +"61f6b429": "myAvailableFunds()", +"61f70161": "placeOrder(bytes16,address,address,uint256)", +"61f7025f": "fetchBalanceByAddress(address[])", +"61f721e8": "HGFCToken()", +"61f76d67": "withdrawEtherToOwner()", +"61f82156": "receiveCashback(uint256,address)", +"61f8cdd6": "transferETHToContract()", +"61f8e91a": "unitTestModifyStaker(uint256,uint256)", +"61f9ca4d": "modifyGroup(uint256,string,string,string,uint256,uint256,uint256,uint256,uint256,bool,uint256)", +"61f9e04d": "getWithdrawn(uint256)", +"61faee9e": "noTransfer(address)", +"61fba37d": "investorBalanceOf(address)", +"61fbdf4e": "gameIsCalculated(uint256)", +"61fc3790": "Monthprofitend()", +"61fc65a0": "checkBirth(uint256)", +"61fc703c": "Danku_demo()", +"61fd718f": "getOrderAllocatedToFundPool(uint256)", +"61fd8f1b": "sendTokensToCompany()", +"61fda640": "ownerUpdateContractBalance(uint256,uint256)", +"61fdfa9b": "returnDeed()", +"61fe51a1": "rootAuthority()", +"61fec3a4": "clearSponsorableJobApprovals(address,uint256,address[])", +"61ff715f": "deploy(uint256,bytes)", +"61ff8191": "CirculationEnabled()", +"6200979e": "AngelInvestmentAddr()", +"6201124f": "employeeDenyExerciseOptions()", +"6201510a": "getPreSaleRank(address,uint256)", +"62016083": "removeDestinationChain(bytes8)", +"62017ebc": "left46(uint256)", +"6201d683": "createTokenUri(string)", +"62024dce": "forceCrowdsaleRefund()", +"62026229": "validateLand(address,int256[],int256[])", +"6202745f": "specialPeacefulSkills(uint256)", +"62027c1e": "changeCJTeamWallet(address)", +"620346c6": "setStopReceive(bool)", +"6203f09f": "MAX_INVESTMENTS_BEFORE_MULTISIG_CHANGE()", +"62040de3": "numberOfBoardMeetings()", +"62040e50": "Bitscreen(bytes32,uint8,uint8,uint8,uint8,string)", +"62043bd8": "DIVIDER()", +"62059839": "_setOwner(uint256,address)", +"62066eb3": "getMinimumAmount()", +"6206880b": "contributorsLockdown()", +"62074c31": "getProjectMaker(bytes32)", +"62075af4": "giff(uint32,address)", +"6207c802": "getSubjectIdentById(uint256)", +"6207d239": "privSaled()", +"620892bd": "NRB_address()", +"620a9c95": "BITSToken(uint256,string,uint8,string)", +"620b0f23": "getMyAnthill()", +"620b2731": "_getClientProviderUID(address)", +"620b5cd2": "Crypto()", +"620b75df": "portfolioManager()", +"620d025c": "roundFunds()", +"620db609": "rubyToken()", +"620eb8ee": "setDisbursementEndTime(uint256)", +"620edb32": "allocatePrivateToken(address[],uint256[])", +"620ffe99": "testFooUdate(uint256)", +"6211db22": "querybalance1()", +"621277cb": "hardCaps(uint256)", +"62133a6c": "getPlanetName(uint256)", +"62135491": "distributeTokensToMembers(uint256,uint256)", +"62150b3f": "KaoPuToken(address,uint256)", +"6215be77": "depositToken(uint256)", +"6215f292": "updateBasePrice(uint256,uint256[],uint256[],uint16)", +"62161235": "getRandomNumber(uint16,uint8,address)", +"6216bde5": "TokensRewarded(address,address,uint256,address,uint256,uint256)", +"6217229b": "sellRate()", +"62173282": "updateMVNRate(uint256)", +"6217903f": "BNB_TOKEN_PRICE_NUM()", +"62182636": "setParams(uint256[],uint256[])", +"6218e5cd": "setGuardianVend(uint256,uint256)", +"6218fd8b": "icoEndsAt()", +"6219004d": "setPosttgeAddress(address)", +"621a25f8": "right66(uint256)", +"621a61ac": "STATE_NOT_FINISHED()", +"621ab11a": "bonustokn()", +"621b23e2": "getOwner(uint32)", +"621bc379": "setReverseRate(address,int16)", +"621bd8d7": "getPreviousReportingWindow()", +"621c3275": "disembark(uint16,uint16,uint256)", +"621d388c": "senderIsAdmin()", +"621de5ac": "AUSBToken()", +"621ded8b": "FinishCompetitionEvent(uint32)", +"621df4be": "getCurrentElectionCycleBlock()", +"621e9a45": "BAQToken()", +"621f7e45": "setPeriodRound(uint256)", +"621fb946": "getLLV_edit_27()", +"62205bd8": "privatesaleFinalized()", +"622104d9": "integration()", +"62219866": "getPercent(uint256,uint256)", +"6221c805": "supplyRound3()", +"6221dc20": "HackableETH()", +"6221e77b": "Logs(address,uint256,uint256)", +"622235e6": "getPage(address[],uint256,uint256,bool)", +"62228c17": "CTADevilleToken()", +"62246c41": "setNickName(bytes32)", +"62251182": "_withdrawOwnerTokens()", +"6225924e": "_mint(bytes32)", +"6225a8ad": "GetResult(uint256)", +"6225b759": "setForceExecuteOfUsers(bool)", +"6226bddb": "getProductStructById(uint256)", +"6226d4b2": "addAddressToAdmin(address)", +"6227ed6e": "createPerson(string,string,uint256,uint256,uint256)", +"6227fd3a": "firstItemWrong()", +"622a0a19": "playerBudget()", +"622a10fd": "CORECoin()", +"622a2d31": "setDistanceAndPrice(uint16,uint16)", +"622ac8ed": "countWishesAt(address)", +"622ae7aa": "getDeployedTokens()", +"622af809": "setMintContactAddress(address)", +"622b0b29": "StakeEvent(address,uint256,uint256,uint256)", +"622b2a3c": "validDelegate(address,bytes32,address)", +"622b6659": "doBigDrop(uint256,uint256,uint256,uint256)", +"622c77fe": "totalSupplyLocked2Y()", +"622d6c97": "ExecutionError(string)", +"622d82df": "Buddha()", +"622dda96": "chooseRandomNumber()", +"622ddaba": "getGenesForSaleBySeller(address)", +"622e5026": "Insurance()", +"622e88cb": "testBitsXorSuccess()", +"622f9730": "forward(bytes,address,address,uint256,bytes,address,uint256)", +"622fe39f": "getLoanData(uint256)", +"6230ebda": "defrostFrozenTokens()", +"6231775b": "miniGameId()", +"623195b0": "setABI(bytes32,uint256,bytes)", +"623406d2": "setRecordContract(address,address)", +"6235e3a2": "getAddressCreatorById(bytes32)", +"6235eef3": "getCurrentReportingWindow()", +"62362cc2": "COIN_SUPPLY_TOTAL()", +"623659b4": "doTransfer(address,address,uint256,uint256)", +"623670b2": "sendTokensToPartner()", +"62373537": "current_start_divholder()", +"6237564c": "isDopeRaiderDistrictsCore()", +"6239f13d": "triggerSoftCap()", +"623ba5c9": "callBackGasAmount()", +"623d2295": "Minado(address,address)", +"623d2b62": "getRequiredBetAmount(uint256)", +"623d5652": "projectExists(address)", +"623d5e56": "devolverBici()", +"623d96ed": "preDuration()", +"623decaa": "unlockedTokensOf(address)", +"623e4fb8": "BBCToken()", +"623eff55": "tokensTransferred()", +"62400e4c": "supplyOf(address)", +"6240282c": "LiquidDemocracyControllerFactory(address)", +"6240c7aa": "COENXToken()", +"6241bfd1": "Token(uint256)", +"6244326d": "humanityFund()", +"6244b7ed": "unWhiteListInvestor(address)", +"624522f9": "accountFrozen(address)", +"6245adff": "DirectlyDeposited(address,uint256)", +"6245eb07": "setProvenance(address,uint256)", +"62463079": "tier2End()", +"62464576": "stage_2_add()", +"62465f0a": "GenesisManager(address,address,address,address,uint256)", +"62469353": "firstDepositTimestamp()", +"6247c38f": "updateChargingRate(uint256)", +"6247cfd9": "priceForKeys(uint256,uint256)", +"6247f6f2": "whitelistToken(address)", +"62486d42": "getTokensAmount()", +"6248cf49": "_donationSupply()", +"6248d6bf": "getOracleMetaData(address)", +"6248fd10": "SLC()", +"62491332": "lockPurchase()", +"62492e9d": "preIcoBonus()", +"624964c3": "getBancorContractAddress()", +"6249a5c7": "UnpauseEvent()", +"624a8bc3": "MyTotalWithdrew()", +"624aba21": "_getWinCountWeight(uint256)", +"624adc4c": "OwnershipTransferCompleted(address)", +"624ae5c0": "rID_()", +"624ba0a4": "maxImports()", +"624bb58f": "marketingSupply()", +"624bb8b3": "setCBaddress(address,address,address)", +"624bd6c4": "depositToken(address,uint16,uint256)", +"624c3dbd": "imageUploadComplete(uint256)", +"624c5673": "USDollars()", +"624cc0a5": "teamMemberAtIndex(uint256)", +"624d4309": "USBcoin()", +"624dd6a9": "getInvestmentsByCountry(uint16)", +"624de3d9": "InterfaceSignature_ERC721Optional()", +"624dee7c": "_release(address,address,uint256)", +"624e3b36": "totalearners()", +"624ecda9": "Sleep()", +"624f011d": "doStop()", +"62502169": "sendCollateral(address,uint256)", +"62502fe7": "getNameDigest(string)", +"6250bfa3": "createOrder(bytes32,bytes32,address)", +"625101d5": "getOwnerMoney()", +"625126ed": "shift_left(uint32,uint32)", +"6251aee6": "icoPhase3End()", +"625295fd": "distributeCollectiblesTo(address)", +"6252c127": "onCrowdsaleEnd()", +"6252d651": "setForegroundColors(bytes3[])", +"62531721": "getStack(uint256)", +"6253367a": "queryChallenge(bytes32)", +"6254add1": "PRIVATE_SALE_POOL()", +"6254cf80": "setGameHostAddress(address)", +"62564c48": "getProposals()", +"62568d83": "min_buy_block()", +"62571cac": "getTodayOwnerName()", +"625785bb": "productionCardIdRange()", +"62581b79": "CubaazCoin()", +"6258683e": "devMiningRewardTransfer(address,uint256)", +"6258d524": "saveEther()", +"62598ae6": "PaymentExpected(bytes8)", +"62599964": "usesThem()", +"625a6726": "fixClock(bytes32,uint64)", +"625adaf2": "setTokens(address[])", +"625b666c": "Luxury()", +"625b8e60": "_redeemByPartition(bytes32,address,address,uint256,bytes,bytes)", +"625bc37b": "releaseTeamTokensAfter12Months()", +"625becbc": "showLockState(address)", +"625cbb23": "setWhiteListAddresses(address)", +"625cc465": "baseDonation()", +"625cfc46": "sellRateZeroQuantity(uint256)", +"625d1fe2": "viewSecondBatchOfClauses()", +"625fcce7": "dealer_cut()", +"625fe9ec": "updateCrowdsale(uint256,uint256,uint256,uint256,uint256)", +"6260f55b": "ETH_USD()", +"62612c6d": "PatronTwoWithdrawal()", +"62614ae6": "BNT_CONVERTER()", +"6261c662": "bonusStart()", +"626263c5": "calculateEthToChargcoin(uint256)", +"626340b2": "block0()", +"626452df": "test_feePoolShare_noClaimableStake()", +"6266e135": "Gmt()", +"62674e93": "getStepFunctionData(address,uint256,uint256)", +"62676d78": "RANGEEND_8()", +"6267967b": "batchReservedTokenAllocation(address[],uint256[])", +"6267c456": "organizer7()", +"6268a0cd": "stakeSDC(address,address,uint256)", +"6268e921": "acceptGame()", +"6269420e": "seedAndPresaleTokenIssuedTotal()", +"62694b68": "lastSignedBlockNumber()", +"62695eae": "allowedTransfer(address)", +"62697f69": "getLLV_edit_17()", +"6269ae48": "tokenToContributor()", +"6269f9fc": "getGameId(string,string,uint16,uint64)", +"626a0e1c": "addSoundEffect(uint256,uint256[])", +"626a413a": "activateBounty(uint256,uint256)", +"626b1070": "beneficiaryDeposit(uint256)", +"626be567": "totalToken()", +"626c0a45": "stock(uint16,uint16,address,uint256)", +"626c6bc6": "ETO()", +"626d0358": "setTokenDefaultPartitions(bytes32[])", +"626d4a36": "right55(uint256)", +"626d666c": "theDao()", +"626e4675": "directorLockDays()", +"626e8fd3": "setBonusDate1(uint256)", +"626ebe39": "toggleReceiveEth()", +"626f9e20": "calculateMaxEthIssued()", +"626fc458": "finalizeTrade(address,uint256,address,uint256,uint256)", +"626fd353": "getSelection(uint256)", +"627045bf": "changeActiveNameIndexTo(uint256)", +"6270b780": "DebitClient(address)", +"62714a14": "getPhone(address)", +"62715547": "castVote(bytes32[])", +"62721129": "getMultiSigWallet()", +"6273106a": "payoutPool()", +"62731ff1": "onDeposit(address,address,uint256,uint256)", +"62735618": "finalizedCapital()", +"62738998": "getInt()", +"62744fee": "PallyCoin()", +"6274a35c": "team_total_lock_days()", +"6274ca4b": "setWeiPerUSDinTGE(uint256)", +"62751a06": "SFT_PER_ETH_FIRST_EARLY_BIRD_RATE()", +"6275448e": "batchApprove(address,uint32[])", +"62754563": "CelebsParty()", +"62765eb7": "receiveApproval(address,uint256,address,string)", +"6276b368": "rateOfCharging(address)", +"62770252": "needsFuneral(uint256)", +"62773951": "TrustReso(uint256[3],address,address,address[])", +"627749e6": "closeTime()", +"62779e15": "payFees()", +"62797ef5": "dayPotHighscore()", +"627992c7": "VULCAN_POD_MAX_CARGO()", +"627a326b": "getBytes32Slice(bytes,uint256)", +"627a3311": "QvoltaToken(address)", +"627aa6d2": "buyAndTransfer(address,address,bytes,uint8)", +"627adaa6": "revealMulti(uint256[],uint256[],uint256[],bool[],bytes32[])", +"627b3d9a": "BTCAUC()", +"627c2516": "WizardsvsCeltics()", +"627c2d1e": "getTX()", +"627c34ad": "removeSubscriber(address)", +"627c81ff": "erc20ContractByIndex(uint256,uint256)", +"627d6f9f": "get_multiple(uint256,uint256)", +"627e64d2": "getQuote(address,uint64)", +"627e667b": "StandardToken(address,uint256)", +"627eb56c": "setMaxContributionPhase1(uint256)", +"627f09c3": "setConfiguration(address)", +"627f22fe": "GiftMetadata(uint256)", +"627f47c6": "transferWithLock(address,uint256,uint256[])", +"627fd3bb": "addCbAddress(address,bytes1)", +"6280382a": "cancelTrade(address,uint256,address,uint256,uint256)", +"62806296": "transfer_coins(address,uint256)", +"6280b0bb": "batchRegularTransfer(bytes32[],bytes32[])", +"6283051f": "setOraclizeQuery(string)", +"6283440b": "wingsTokensReserv()", +"62838d8b": "getLastAddress(bytes32)", +"628392bd": "bonusPhase1()", +"62848f36": "tokenRate30()", +"6284ae41": "exitFee()", +"6284fd22": "getMyPubKey(bytes32)", +"62850233": "transferWithDividends(address,uint256)", +"6285a259": "calculateTokensEnabledOne(address,uint256)", +"6285d703": "NERO()", +"6288020f": "endThirdWeekICO()", +"6288a63c": "NotaryChain(uint256)", +"6288a9a3": "maxUserContribution()", +"62890063": "WhitePrivilegeToken()", +"62891b5d": "multiAccessChangeRequirement(uint256)", +"6289fdbe": "VenomToken()", +"628a01ce": "stakingMintRate()", +"628b75bf": "slashDownRequest(uint256,address,uint256,bytes32)", +"628c225c": "roomNight(uint256)", +"628c2778": "DEXToken()", +"628c866e": "setCurrentActiveGameID(uint256)", +"628d5ef1": "setWeiUsdRate(uint256)", +"628da35e": "get_termAmount(uint256)", +"628dda8d": "VDGToken()", +"628e50b5": "brokerFee()", +"628e7a38": "_initializeVesting(address,uint256,bool)", +"628eaa88": "GeocashToken(uint256,uint256,uint256,address)", +"628ee84f": "in_dispute_phase()", +"6290a009": "bids_sorted_count()", +"62932301": "importer()", +"62935a98": "getContractDataSK()", +"6293a989": "TRONVSupply()", +"6293b5bb": "presaleMaxEtherCap()", +"6293fd1e": "payBack(address)", +"6294f858": "distributeFinancialAward(address[],uint256[])", +"6295c61a": "transferItem(address,address,uint256)", +"6297c16c": "deleteToken(uint256)", +"6297dbf4": "existsMesa(uint256)", +"62981b18": "deployBallot(bytes32,bytes32,bytes32,uint64[2],bool[2])", +"62985882": "VSTA(string,string,uint8,uint256)", +"62985b87": "NebuliToken()", +"62986e27": "Canary(address,uint16)", +"629873b2": "createRequestAsPayeeAction(address[],address[],int256[],address,address,string)", +"6298c93a": "usdCap()", +"6299a6ef": "update(int256)", +"6299f8cf": "stop(uint256)", +"629a9ce7": "coreTeamUnlockedAt()", +"629ad124": "chancesBought()", +"629aef56": "QuintToken(address)", +"629b656e": "PryzeToken()", +"629b9cb1": "takeProjectBonus(address,uint256)", +"629bc0b4": "getPlayerPayout(uint256)", +"629bf9a8": "updateMinMaxBetPrice(uint256,uint256)", +"629c1b67": "SoftCapReached()", +"629c37c2": "HSShopSaleFee()", +"629cefee": "adjustTiming(uint256,uint256)", +"629d0f2f": "teamd()", +"629d93db": "removePromo(bytes32)", +"629e89a0": "setMinDai(uint256)", +"629f1486": "YoonContract()", +"629f4028": "getVoteNum(address)", +"629f4b3b": "StatsTotal()", +"629fb53d": "getOrderbookLength()", +"62a09477": "changeOwner()", +"62a0b56b": "testUnset()", +"62a1029c": "YUPIE_PER_ETH_PRE_SALE()", +"62a144d9": "safeMod(uint256,uint256)", +"62a17a46": "AXPCoin()", +"62a31c4a": "dynamicLength(bytes4,bytes)", +"62a36a54": "Application()", +"62a39ff7": "setShareHolder(address)", +"62a44fe9": "has_voted()", +"62a49ae3": "depositTokensFor(address,uint256,address)", +"62a4b230": "setLockedRatio(uint256)", +"62a4be31": "buyTokensByProxy(address)", +"62a4cd14": "endFunding(uint256)", +"62a51eee": "move(uint80,uint80)", +"62a52ed6": "set_price(bytes12,uint256)", +"62a59ade": "distributePuppyCoinCLarge(address[])", +"62a5af3b": "freeze()", +"62a76ce1": "accrueAdvisorsTokens(address,address,uint256)", +"62a7c5a6": "nextWithdrawDayFoundation()", +"62a80b42": "newToken(string,address)", +"62a87466": "STATE_DONATION_ROUND_1()", +"62a974b6": "vote01NoCount()", +"62aa9a00": "enehtoken()", +"62aabb9e": "SafeToken()", +"62aac84d": "setHaltSale(bool)", +"62aaf089": "getExchangeRate(uint256)", +"62ab1216": "updateWithOracle()", +"62ab8cc1": "howMany()", +"62abb560": "transferSuperOwnership(address)", +"62abda69": "totalIssuanceDebt()", +"62ac6115": "updateRequireKYC(bool)", +"62aca822": "setNation(address)", +"62ad1b83": "operatorSend(address,address,uint256,bytes,bytes)", +"62ad9bda": "newProvider(address,string,bytes32,uint256)", +"62addeed": "HumanX()", +"62ae4d29": "OBIMOLOGIA()", +"62aecc47": "totalBondSupply_BULL()", +"62aee544": "ADVISOR_SHARE()", +"62afd64a": "unpaidPercentage(bytes32)", +"62aff4d5": "commitPeriodStartedTimestamp(bytes32)", +"62b08e70": "setVotingContractAddress(address)", +"62b0ae87": "pack(bytes)", +"62b24189": "DepositToBankAccountFromDifferentAddress(uint32)", +"62b26f95": "totalFish()", +"62b3b833": "createCoupon(string)", +"62b40489": "businessPlannedPeriodEndTimestamp()", +"62b40918": "addPersonalCaps(address[],uint256)", +"62b40f9f": "destroy(address,address)", +"62b45318": "exchangeEtherForNominsAtRate(uint256)", +"62b4faa7": "Edujano(uint256,string,uint8,string)", +"62b52b49": "LADCToken()", +"62b6a282": "left42(uint256)", +"62b6a963": "_batch2_icosaleEndTimestamp()", +"62b6dc8e": "RektToken()", +"62b78bc4": "team_coins()", +"62b83c6b": "balanceAsCreator()", +"62b96a18": "teamUnvested()", +"62ba1649": "stopLottery(bool)", +"62ba4aef": "payInvoice(bytes32,uint256)", +"62ba9687": "toTimestamp(uint16,uint8,uint8,uint8,uint8)", +"62bb7533": "getTokenToEthOrderList()", +"62bb758f": "userSecurity(address)", +"62bc56e6": "getCompany(address)", +"62bc63c4": "getCozyAgain(uint256)", +"62bca778": "withdrawalFX(uint256)", +"62bd689c": "setBonusPercent(uint256)", +"62be3172": "Message(address,address,address,string)", +"62beaa82": "toData()", +"62bf6fa7": "medalDecimals()", +"62c01b2d": "apply_compensation(uint80)", +"62c06767": "sweep(address,address,uint256)", +"62c0e3b7": "SpoutMintableToken()", +"62c0ffa8": "getDCountedBasicBallotID(bytes32,uint256)", +"62c13ff3": "initSale(uint256,uint256)", +"62c19061": "getYearDay(uint256)", +"62c1adb0": "KittenCoin()", +"62c1f389": "swap(bytes32,address[5],uint256[6],uint8,bytes32,bytes32)", +"62c24067": "blockFunds(uint256)", +"62c2b7c8": "getTTTAddress(string)", +"62c335c1": "checkCallback(address,uint256,bytes,bytes)", +"62c375a7": "library15function()", +"62c3dd5a": "prepareForRefund()", +"62c3fdb2": "getFundsOwner(bytes32)", +"62c47064": "setArbitrator1and2(address,address)", +"62c48e20": "capFiatAndETH()", +"62c49256": "whitelistBasketFactory(address)", +"62c4c89e": "getMixParticipantByPubKey(uint256)", +"62c509c3": "XYTgas()", +"62c5aecc": "getEthToTokenAddOrderHint(uint128,uint128)", +"62c5c03a": "getbalance(uint256)", +"62c5c254": "changeFounderMultiSigAddress(address)", +"62c63e31": "NotFinalized(bytes32,bytes32)", +"62c655f5": "removeVoters(uint256[])", +"62c6beea": "_buy(uint256,address,uint256)", +"62c7855b": "getConfigBytes(bytes32)", +"62c7e96c": "deathData_f16()", +"62c7fa76": "lockStartTime()", +"62c95aa1": "getMaxTickets()", +"62c99e84": "_Approval(address,address,bytes32)", +"62c9da62": "setCompte_1(string)", +"62caf484": "GDCAcc03()", +"62cb1ac2": "validateOrderHash(bytes32,address,uint8,bytes32,bytes32)", +"62cdd872": "verifySignatures(uint8[],bytes32[],bytes32[],bytes32)", +"62ce071c": "publicTokenCap()", +"62ce7043": "reloadEarnings(uint256,uint256)", +"62cee7ad": "staffInfo()", +"62cf0197": "getVIATokens()", +"62cf54c8": "setDeposits(uint64,address,uint16,uint64)", +"62d020d9": "addVersion(address,string,string)", +"62d027bf": "GXVCSentByToken(uint256,address,uint256)", +"62d05c78": "cancelOffer()", +"62d0af7a": "set_BCDB_contract()", +"62d0ce45": "TOKEN_RATE_05_PERCENT_BONUS()", +"62d176cb": "buyTokens(bytes32,address)", +"62d1dac2": "setUnofficialApplicationSignUpFee(uint256)", +"62d1fee3": "addLegitDevAddress(address)", +"62d21602": "bkaddress()", +"62d246a4": "getBetsMas(uint32)", +"62d2c393": "GenkiProject()", +"62d2ecb9": "setMaxSpend(uint256)", +"62d3755b": "fullTokenWallet()", +"62d3b5c5": "maxAmmount()", +"62d55b6d": "VOTING_TIMESPAN()", +"62d576bd": "periodITO_mainCapInUSD()", +"62d590ac": "GrantToken(address,uint256,string)", +"62d5acb1": "rebateOneFenzi_()", +"62d6b7fb": "percentageOfRaisedAmountThatRemainsInContract()", +"62d7216c": "unregister(uint256,bytes)", +"62d72c08": "RozowkaCoin(uint256,string,string)", +"62d73eb8": "startElection()", +"62d91855": "delAdmin(address)", +"62d93527": "setBrokerFee(uint256)", +"62d966c9": "changeEmployee(address)", +"62d9c267": "ICOEnded()", +"62dbc55c": "DevTokensHolder(address,address,address)", +"62dbdfef": "CompanyToken()", +"62dbf261": "getTokensForEther(uint256)", +"62dc0133": "HIGHER_PRICE_RESET_PERCENTAGE()", +"62dc6e21": "PRESALE_PRICE()", +"62dc9ced": "Roulette(uint256)", +"62dd748c": "toUpper(string)", +"62dd9c71": "checkWinNobody(uint32)", +"62de871e": "startBattle(string)", +"62df5b7d": "BD0Token()", +"62e05175": "setMotionDB(address)", +"62e1de00": "test_polarBoardInstance()", +"62e23e9e": "NAME_NOT_AVAILABLE()", +"62e26e45": "loanCompleted(uint256,uint256)", +"62e28f7d": "channelModule(uint64)", +"62e2aa00": "burn(uint256,string,uint256)", +"62e2d0de": "get_foo()", +"62e4aeb8": "customExchange(address,address,uint256)", +"62e534d2": "setBlocklancerToken(address)", +"62e5b1f2": "_owns(address,address,uint256)", +"62e69886": "RecipientUpdated(address,address)", +"62e6e7c7": "disTrustDealer(address)", +"62e76013": "management(uint256)", +"62e7707e": "whitelistAddresses(address[],bool)", +"62e7ba3f": "consumptionPointer()", +"62e838ef": "returnBet()", +"62e881a4": "nextTournamentRound()", +"62e888bb": "STRIKE_PRICE()", +"62e8b948": "stepOneLockEndTime()", +"62e8e8ac": "changeTokenPrice(uint256,uint256)", +"62ea82db": "bids(address)", +"62eb0068": "redeemByPartition(bytes32,uint256,bytes)", +"62eb33e3": "cr()", +"62eb4c89": "is_started_payouts()", +"62eb5789": "setLLV_edit_33(string)", +"62eb6da1": "registeredToken()", +"62eba54c": "doesUserOwnItem(address,uint256)", +"62ebcdcf": "setRtmContract(address)", +"62ec8e53": "adminAddBallot(string,uint256,uint256)", +"62ed4f04": "SSBToken()", +"62ee0082": "setTokenContractsAddress(address)", +"62ee37aa": "InfluToken()", +"62ee4b26": "AUORANEX()", +"62ee6d29": "changeHashtoLowOrHigh(uint256)", +"62ee7b03": "startTakeToken()", +"62ee922b": "unofficialApplicationSignUpFee()", +"62ef0e65": "withdrawPresale(address[])", +"62ef1f81": "confirmPayment()", +"62ef7738": "total_money_back()", +"62f03290": "payRefund(bytes32,uint256)", +"62f2296e": "_transfer(address,address,uint256,string)", +"62f3ed92": "PowerQuantumCoin()", +"62f3febf": "isUserBlockedByContract(address)", +"62f44d8a": "Dadyys()", +"62f4ed90": "isAuthorized(bytes32)", +"62f54c18": "removeAllowedTokenInternal(address)", +"62f57ff6": "GudTesteContratoF()", +"62f5a23f": "transferToToken(address[])", +"62f5aa4c": "getAirdropIds()", +"62f5c2e3": "maxContributionPhase1()", +"62f5ed61": "add_to_bounty()", +"62f60954": "_reAdjustDifficulty()", +"62f63c6e": "EarthMedz()", +"62f69039": "unlockVault()", +"62f6cf7f": "getRegisteredModuleAt(uint256)", +"62f91eff": "AnythingAppToken()", +"62f927d4": "getDefaultReportingFeeDivisor()", +"62f96fc1": "splitBalanceAccordingToRatings(int256,int256,int256)", +"62fb09b2": "getRefDescr(uint256)", +"62fb0ff8": "morties_TO_HATCH_1RickAndMorty()", +"62fb6fe1": "getMonster(uint256)", +"62fb9697": "diffSeconds(uint256,uint256)", +"62fc178b": "gasPriceOraclize()", +"62fca3fa": "mintTokenBulk(address[],uint256[])", +"62fdaf1d": "removeFromBattle(uint64)", +"62fde48a": "LogDeposited(address,uint256)", +"62fe3b4d": "setEndOfPresale(uint256)", +"62fec51b": "icoEndTimestampStage2()", +"62feff3a": "developerAllocation()", +"62ffb195": "REFERRAL_REWARD_PERCENTAGE()", +"62ffb3bf": "trueUSD()", +"630061f3": "getTokensDistributeds()", +"6300c768": "takeEther(address,uint256)", +"63018e1a": "minTokensToSale()", +"63036f86": "totalIssuedEarlySale()", +"63037b0c": "payees(uint256)", +"6304335b": "betsCloseAt()", +"6304fa3a": "Test(uint256,string,uint8,string)", +"63052d82": "getOwnersIndex(address)", +"63055d79": "fetchRate()", +"6305d010": "registerTeam(string,address,string,bool)", +"63066434": "getPlayerVaults(uint256)", +"63069a35": "assign2(address,uint256)", +"63079315": "lengthOfCommonPrefix(bytes,bytes)", +"63086b5e": "afterSoftCapDuration()", +"6308769e": "LogFinishICO(address)", +"6308a76f": "_approveMint(uint256)", +"6308ae65": "managersCount()", +"6309242c": "setUserHatchRate()", +"630a9f94": "viewMemory(uint256)", +"630babac": "WhitelistParticipant(address)", +"630bae99": "payoutWithFee(uint256)", +"630bcd99": "drawRandomItem(string,uint256)", +"630c010e": "getElements(uint256[])", +"630cd1e9": "ratePrivateSaleStage()", +"630cea8e": "submitSignature(bytes,bytes)", +"630d0552": "ColorPurchased(address,address,uint256,uint256)", +"630d43cc": "DoroDiamond()", +"630db9ee": "getRemoveMarketCalled()", +"630dbe79": "StandardERC20Token(string,string,uint8)", +"630dc19d": "_payoutJackpot()", +"630dd52f": "TOKEN_TREASURY()", +"630e07f1": "RESERVED_TOKENS_FOR_ICO()", +"630e0ae6": "createPersonGen0(string,string,uint64,bool)", +"630e1d5f": "hasEnoughStake()", +"630eb125": "getAuditAssignBlockNumber(uint256)", +"630f1e6c": "withdrawAsset(bytes,uint256)", +"630f479e": "perStageNxc()", +"630f6f47": "betWithAff(address)", +"630fd0ac": "totalSupplied()", +"6310c722": "convert(address,uint256,uint256)", +"6310d902": "getAddressBoughtCount(uint16,address)", +"631121ca": "ISCToken()", +"63121665": "countPeriod(address,bytes5)", +"6313bd30": "DEP()", +"631407a2": "setTokenSupplierAddress(address)", +"6315592b": "orderModify(uint256,uint256,uint256)", +"63155d2b": "craft(uint16[16],uint16[16],uint16[16],uint16[16])", +"63157e2b": "issue(uint32,uint8,uint256,bool)", +"6316f6d1": "getNotConstant()", +"63175913": "StandardSale(bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"63176ad9": "changeDealDate(uint256,uint256)", +"6317cc5b": "tokenCapForThirdMainStage()", +"631859d0": "calculatePotentialPayout(uint256)", +"6319d32f": "DOJI()", +"631a4231": "createContract(string,string)", +"631a925c": "Weekycoin()", +"631b0520": "getPaimentTime(address,uint256)", +"631b3672": "roundSetUp()", +"631b7e83": "LogResult(bytes32,address,uint256,uint256,uint256,int256,bytes)", +"631bdb63": "playerCurrentlyRegistered(address)", +"631c07f0": "getBonusByDate()", +"631c42ae": "ethExchangeWallet()", +"631c56ef": "depth()", +"631ccb1d": "getInfoMarketItem(bytes16)", +"631d3f3b": "liveDragons()", +"631d551b": "FAMEToken()", +"631d9b1f": "LuxProject()", +"631dc853": "EquitySharingSystem()", +"631dd1a2": "transferFreeze(address,uint256)", +"631de4d6": "replace(address,address)", +"631e0c69": "addMessage(string,string)", +"631f0d66": "upgradeAddress()", +"631f637f": "preSaleMaxCapInWei()", +"631f9852": "isSealed()", +"63200443": "FindLettuce()", +"6320212b": "refreshReputation(bytes32,address[])", +"63204648": "setMultiWallet(address)", +"6321f298": "MeraToken()", +"632261c3": "removeVendor(uint256)", +"63228b57": "KarmaToken(uint256,string,uint8,string)", +"6322961d": "getAddressByUsername(string)", +"6322bb39": "tradeEtherDelta(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,uint256)", +"6323b526": "transferFromTokenSell(address,address,uint256)", +"6323dc26": "GCRTokenERC20()", +"632447c9": "updateReward(address)", +"632473da": "CNC()", +"632488ff": "POOH()", +"6324af1f": "advisorsBalance()", +"6324e70b": "offerToLend(uint256,uint256,uint256)", +"63258462": "setHomeMaxPerTx(uint256)", +"63263858": "ethartArtReward()", +"6326cb5b": "_purchaseCompany(uint256)", +"6328af59": "YeedToken(uint256)", +"63299226": "teamOneId()", +"6329cfa5": "settleLend(bytes32[8],bytes,address,uint256,bytes,bytes,bytes,bytes)", +"632a3e52": "vestTokens(address,uint256)", +"632a8144": "midasFounderAddress()", +"632a9a52": "vote()", +"632ca5c9": "getArts()", +"632ccecd": "IkuraAssociation()", +"632ce0f8": "whoIsAdmin()", +"632e082a": "isMainFirstDay()", +"632e1dfe": "OWNER_ADDR()", +"632e2b95": "addWire(address,uint256,uint256)", +"632e44af": "distributeBonusTokensByList(address[])", +"632ebd6b": "changeIsOpenFlag(bool)", +"632f0ba6": "descriptionHashes(bytes)", +"632f83eb": "realWorldPlayerFromIndex(uint128)", +"632fbda4": "replaceController(address)", +"63301198": "AetherCore()", +"63302789": "TOKEN_FOUNDERS()", +"63304bc3": "m_lastFundsAmount()", +"6330ac09": "get_price(string)", +"6331e7d4": "beforeEach()", +"6331eae0": "saveTokenValues()", +"63334c58": "transferETC(address)", +"63340338": "fuint32(uint32)", +"633423be": "paymentAddress()", +"6335010d": "getVestingRevokeDate(address,address)", +"63365651": "InterfaceId_ERC721Enumerable()", +"63367f4d": "tagline()", +"6336ac19": "setTTGCoin(address)", +"63385ad1": "addNewAccount(address,uint256,uint256)", +"63385b64": "BerryToken()", +"633891c4": "getPlayerAff(uint256)", +"6338977e": "setMetadataUser(string)", +"6338f693": "Airdropped(address,address,uint256)", +"63391689": "withdrawForFourStep()", +"63392843": "decrease(bytes32)", +"63396109": "createGen0Token(address)", +"63397825": "changeMerchantAccount(address)", +"633982c5": "viewLatestEthTransactionRequest()", +"6339b5f6": "SUSIToken(uint256,string,string)", +"6339be39": "totalStarSupplyRemaining(uint8)", +"6339fbcb": "finishGame(uint32,bytes32)", +"633a6dde": "deathData_a9()", +"633a7574": "CowToken(address,address,uint256)", +"633ab5e0": "callchecked()", +"633b1954": "finalizeMigration(address)", +"633b4c04": "o_velho_problema(uint256,uint256)", +"633b5b1f": "presaleTotalWei()", +"633c78b5": "create(uint256[],uint256[])", +"633ce1d2": "premiumDomainK()", +"633d17eb": "toAscii()", +"633de6aa": "setTime2Rest(uint256,uint256)", +"633dfc70": "vote(bool,address)", +"633f7a82": "queryType()", +"6341b3fe": "subBrokerNum()", +"6341ca0b": "retrieveTokens(address,address)", +"634363f3": "amountOf()", +"63443679": "rateUpgrade(uint256)", +"6344a898": "setWeiRaiseLimit(uint256)", +"63453ae1": "distribute(address)", +"63456fa9": "getTokenById(uint8)", +"634663a5": "setPriceRatePhase2(uint256)", +"634667b2": "claimAndTransfer(address)", +"634710ae": "BYTC()", +"63472fad": "setVote(address,string,uint256,address,bool)", +"634758e5": "TodaNetwork()", +"6347a377": "nextAuction()", +"6347bb42": "SGACoin()", +"63482cf0": "eachUnlockCounts()", +"63488772": "WanersiLinkToken(uint256,string,string)", +"6348c4cf": "Money(address)", +"6348eae6": "neverPauseAgain()", +"634965da": "sendEther(uint256,address,address)", +"634993c6": "refill(bytes32)", +"6349cafa": "changePrice(uint16,uint256)", +"634b3df9": "minPriceInWeiForPre()", +"634b4a8f": "setOperater(address)", +"634b5043": "collectWinnings()", +"634b8dc3": "Altn()", +"634bc7db": "create(bytes32,bytes32)", +"634c5c51": "authorized_triggerStashedPayoutTransfer(uint256)", +"634c688a": "burnAllowed()", +"634d27c3": "getProviderIsForRent(uint256)", +"634d6e57": "investorFullInfo(address)", +"634df88e": "ENTA()", +"634e66ac": "admin_isWithdrawable(bool)", +"634eaff1": "ETERNAL_APPROVAL_VALUE()", +"634ec9f9": "buyKnowledge()", +"634ef3ce": "Mqthereum(uint256,string,string)", +"634ef8da": "_setSetting(string,uint256)", +"634f752b": "optionLibrary()", +"634fcb8e": "setupCrowdsale(address,bool)", +"634fe2a6": "others_prize()", +"63505ae8": "getBidsCount()", +"63506c16": "transferfromOwner(address,uint256)", +"6350b2c2": "mints(uint256)", +"6350ec6f": "changeYumAddress(address,address)", +"6351546d": "settleTransactionByMediatorFee(uint256,uint256)", +"635179ca": "setHiddenCeilings(bytes32[])", +"6352211e": "ownerOf(uint256)", +"6352585c": "ENCToken(uint256,string,uint8,string)", +"6352c538": "TokensWithdrawn(address,uint256)", +"63534dd8": "seedContract()", +"6353586b": "reward(address)", +"63542c26": "approvedToken(address,uint256,bytes)", +"635439ac": "updateCurrentGameCardId(uint256,uint256)", +"635550a6": "blockchainExchangeFrom(address,uint256,uint256,bytes32)", +"63558f5c": "transferEscrowship(address)", +"6355bf2f": "optionsSet()", +"635639b4": "_unpackPlayerData(uint256)", +"6356443e": "TokenPreSaleTransfer(address,address,uint256)", +"6356739d": "Sent(address,uint256,uint256)", +"63567673": "createBet(address,address,uint256,uint256,bytes32[])", +"63569ca8": "rewardProjectCompletion(uint256)", +"6356cdac": "Bonus(uint256)", +"6357cc12": "startpublicBattle(uint256,uint256)", +"6357ddaa": "getRandomTime(uint256)", +"63581c04": "setFactoryAsset(uint256,uint16)", +"63586d6a": "claimBondReward()", +"635875d9": "changeMinimumCommission(uint256,uint256)", +"6358aac0": "isInterestStatusUpdated()", +"6359036b": "redeemDaoBounty(bytes32,address)", +"63591d09": "poolMaxAmount()", +"635994fd": "create(address,bytes32,address,bytes32,address,bytes32)", +"6359a656": "EUnpause(address,string)", +"6359a974": "TOTAL_TOKENS_TO_DISTRIBUTE()", +"6359b5b1": "totalIssuingCollateral_limitedSum()", +"635a5d7b": "setHeartbeatTimeout(uint256)", +"635b9047": "ExpandCoin()", +"635ba8a1": "ApexTalk()", +"635ca669": "addBoardOnUser(address,address)", +"635cfda2": "Incrementer()", +"635d0239": "toUint(bytes,uint8,uint8)", +"635da243": "autorizar(address)", +"635e2abf": "_btcToken(address)", +"635eecea": "privateEventTokens()", +"635f6a79": "method3(string)", +"6360edc1": "getAllForPubKeyBetween(bytes32,uint256,uint256)", +"6360fc3f": "bought_tokens()", +"63615149": "withdraw(bytes32,bytes32)", +"63617328": "setJackpotCompleted()", +"6361d3e0": "unpauseActivity(uint16)", +"6361d9e9": "testConstructorUsingDeployedContract()", +"6362102d": "rebalanceEtherDelta(address,uint256)", +"63621532": "setGasUpperBound(uint256)", +"6362ffd3": "rebuyInformTime(address)", +"63637c87": "createNewPlayer(string)", +"636544be": "changeVeredictum(address)", +"63655ebb": "DiaryLog(uint256,bytes)", +"63657855": "_removeFromDebtRegister(bytes4,uint256)", +"6365dfd9": "RaisrToken()", +"63665f2e": "addAirdrop(address,uint256)", +"63669424": "EthBird()", +"6366b936": "freeUpTo(uint256)", +"63670e42": "UpdateSellAgentSiteReg(address,address)", +"636760a2": "Cyncrohnis()", +"636822fa": "FearOfMissingOut()", +"63689b4a": "moveTokens(address)", +"6369313d": "isHouse()", +"636a36e3": "ThingsbookChain()", +"636ae15d": "BROYALCOIN()", +"636b2ac3": "createDefaultGen0LinglongCat(uint256,address,uint256,uint256)", +"636b7e56": "pendingFunding()", +"636bb5ae": "CalculateStageValue()", +"636bd9dc": "cooAddress3()", +"636c6524": "Superpack()", +"636ca6c2": "EAAS()", +"636ce4d7": "BTL_SPARTAN()", +"636d37b1": "precrowdsalepricing(address,uint256)", +"636d98b1": "referrerPercent()", +"636f12fe": "b2sother(bytes32,bytes32)", +"636f6159": "tokenExchange()", +"636fa3c6": "preIcoToken()", +"636ff44e": "BAGToken()", +"63704e93": "getDocCount()", +"6370920e": "grant(address,uint256)", +"6370ef19": "updateDomainPrice(bytes32,uint256)", +"63722de4": "AllowSomeoneToViewMyKeys(address,string)", +"63723373": "checkSignature(address,uint8,bytes32,bytes32,bytes32)", +"63727449": "getMfgDetails(string)", +"6372ba1a": "dateEndICO()", +"63732cf0": "RCN()", +"63735598": "getPriceOfCampaign(bytes32)", +"6373786a": "SaturnPresale(address,address,uint256)", +"637431ae": "testCreatePricelevelUsingNewContract()", +"63746113": "resetCrowdSaleAddress(address)", +"63746b03": "createContractRide(string,bytes7)", +"63749225": "getPVPEntranceFee(uint256)", +"63750dfb": "changeLedger(address)", +"63755c16": "withdrawStandardTokens(address)", +"637666ce": "removeFromBlackList(string,address)", +"6376c910": "StageThreeEnable()", +"63772f33": "growthTokensPercent()", +"6377aaa6": "setAdsContractAddress(address)", +"6377ebca": "close_time()", +"6377ff20": "totalInactive()", +"6378378a": "NxahCoin()", +"63784191": "frozenForTeam()", +"63791e3c": "setPriceSetter(address)", +"63798661": "payPlace(uint256)", +"6379a852": "multiOperatorSend(address,address[],uint256[],bytes,bytes)", +"6379ed9d": "distributeFUD(address[],uint256,uint256)", +"637af51c": "updateUpdater(address)", +"637b2541": "_allocateTokens(address,uint256)", +"637b55eb": "exchangeEtherToToken()", +"637b93ed": "getInsuranceBalance(address)", +"637bcd2a": "userIsWhitelisted(address)", +"637c39d8": "systemAddresses(address,address)", +"637cc5c6": "XBlockToken()", +"637d3e00": "ProjectOwner_EnableProject(int256)", +"637dda3f": "getBalanceByIndex(uint256,address)", +"637e12f7": "getBlocksDesc(uint256,uint256)", +"637e86eb": "totBOTs()", +"637ea3e5": "setlogaddr(address)", +"637ec389": "activated_time_()", +"637fcf95": "getBoardMember(address)", +"63808773": "acceptContribution(bytes32)", +"63809953": "secondsPerDay()", +"6381ca26": "refundTransactionByMediator(uint256)", +"63820550": "OwnerEvents(address,uint8)", +"63822fdc": "addConsentTemplate(string,uint256,string,string,string)", +"6382789d": "currentLowestCount()", +"63839777": "getReturns(address,address)", +"63844a57": "mul32(uint32,uint32)", +"638560cf": "registerBool(address,bool)", +"6385cbbe": "minimalGoal()", +"6385f2fb": "DAZ()", +"63860139": "nextPrizePool()", +"63862fd5": "isSenderOriginalOwner()", +"6386c1c7": "getUserInfo(address)", +"63875261": "paladinAddress()", +"6388fafa": "niceguy1()", +"63891019": "testFailStartTooEarly()", +"63892068": "create(string,string,bool)", +"6389654e": "changeDailyWithdrawalLimit(uint256)", +"63897c7e": "changeSettings(string,string,uint256,uint256,address,address,address,address,uint256)", +"6389e019": "graceTransfer(address,uint256)", +"638a9ce9": "setProxy(address,bytes32)", +"638b1b14": "developmentAddress()", +"638b4463": "completeClosed()", +"638b9119": "soldCards()", +"638bcce3": "multilevel(uint256)", +"638c5ddc": "BonusListUpdated(address,address)", +"638d4788": "draw(uint8,uint8)", +"638dd56a": "getNumberOfEligibleMembers()", +"638e1e5d": "payTip()", +"638e3724": "Locker(address,uint256,address[],uint256[])", +"638eea8d": "PLATFORM_MONTHLY()", +"638f6575": "timeStarted()", +"638f8da4": "castleMaxLevelGap()", +"638fade2": "getMerchantPublicKey()", +"63905232": "balanceAll(address[])", +"63907180": "getDebrisNum(bytes32)", +"6390f519": "getNumTeams(uint16,uint8)", +"6391c315": "FundsWithdrawnAndTokenStareted(address)", +"6391d3b2": "getCountSenderLands(address)", +"63921a74": "canReceiveListing(bytes32,uint256,bool,address,uint256,uint256)", +"63929d3e": "getPendingKNCRateRange()", +"6392a51f": "balancesOf(address)", +"63937651": "batchTransferDiff(address[],uint256[])", +"6393b4eb": "expect(address,uint256,bytes,bytes32)", +"6394536d": "cosign(uint256,uint256)", +"639475ca": "TRIANGLE()", +"63958b5f": "sellSpecialTokensForPublicSale(address,uint256)", +"63981b33": "changedeposito(address)", +"63981bbc": "TotalSpenders()", +"63991a36": "getGenomeChildren(uint32,uint32)", +"639937d7": "maxSpinners()", +"639a9a67": "saleOpened()", +"639ab80b": "YTTD()", +"639bbb37": "donated()", +"639bd0bf": "proposeBountyTransfer(address,uint256)", +"639bef41": "setRecommender(address,address)", +"639cba6e": "getDetailsBattles(uint256)", +"639cd59c": "totalFeesAvailable(bytes4)", +"639d3e69": "listSubName(bytes32,bytes32,uint256,uint256,uint256)", +"639d57f2": "testGetBitSuccess()", +"639d71eb": "mixAmt()", +"639e01dd": "Team()", +"639ec4d2": "checkTokDev()", +"63a0557b": "teamAvailable(address)", +"63a0607b": "buyRock(uint256)", +"63a10042": "approveComponents()", +"63a1512e": "setOPM(address)", +"63a167f2": "collectorWeiCap()", +"63a24174": "GxCoinTotals(address)", +"63a2c393": "safeMulPercentage(uint256,uint256)", +"63a2de29": "crearJuegos()", +"63a2fdbf": "claimZeronium(uint64,uint64,uint64,uint64,uint64,uint64)", +"63a37503": "test_rewardPoolShare_noClaimableStake()", +"63a3c452": "getUnsold()", +"63a3cc80": "currentTotalTokenOffering()", +"63a3d383": "edoToken_()", +"63a411c0": "addDriver(address)", +"63a4b67b": "setArray(bytes32,uint256[])", +"63a599a4": "emergencyStop()", +"63a5bc71": "eitherAdminOrAdvisorCanDoThis()", +"63a6568f": "getPropertyLastUpdaterBecomePublic(uint16)", +"63a66d59": "bountyDeposit()", +"63a6cc7d": "getBuyers(uint16,uint8)", +"63a846f8": "admin(address)", +"63a8b945": "removeCounter(address,uint32)", +"63a8dac2": "changeSettings(uint256,uint256,uint256,uint8,uint256,uint256,uint8,uint8)", +"63a97d3f": "decreaseAllowed(address,address,uint256)", +"63a999cc": "uddr()", +"63a9c3d7": "verify(address)", +"63aa109c": "summFounders3()", +"63aa289b": "ownerTreesIds(address,uint256)", +"63aa56b1": "amend(address[],address[])", +"63ab7a25": "clearWaitPairBets()", +"63aba603": "AlphaToken(string,string)", +"63abc381": "alreadyParticipated(address)", +"63abfbaa": "tokensToFunds(uint256)", +"63abfd86": "CCChainToken()", +"63ac0f99": "depositBonus(address,uint256)", +"63ad0bbe": "templateProposals(address,uint256)", +"63ad803f": "EditTile(uint256,uint256,string,string,string,uint256)", +"63ae10fe": "getClientProviderUID(address)", +"63ae2bae": "updateUserCertification(string,string,string,string,uint16)", +"63ae71ca": "affiliateProgramWalletAddress()", +"63ae8d6c": "setBuyPrice(uint256)", +"63aea3e0": "PlayerInfo(uint256)", +"63aec5ce": "getActiveUserLists()", +"63af8570": "tokensToGenerate(uint256)", +"63b03896": "gcd(int256,int256)", +"63b0545f": "transferfrom(address,address,uint256)", +"63b0a5c3": "IdentityRegistry()", +"63b0e66a": "helper()", +"63b1152a": "releaseVault()", +"63b1806f": "NewReferralTransfer(address,address,uint256)", +"63b20117": "totalTokensSold()", +"63b2c2a9": "unlockTeamBBT(uint256,string)", +"63b3c007": "canDefrost()", +"63b3f4e6": "WinnerPayedTicketBought(address,address)", +"63b452fb": "ICO_RATE4()", +"63b45bd9": "socoreCheck()", +"63b4f786": "about(address,uint256)", +"63b56431": "PRCT100_ETH_OP()", +"63b57e34": "remainCap()", +"63b6240d": "computeEndowment(uint256,uint256,uint256,uint256,uint256)", +"63b68040": "lastBlock_v14Hash_uint256()", +"63b6b31f": "transferBalance(address)", +"63b700ff": "getStoryExpiryTime(bytes12)", +"63b75b59": "setAssetValue(uint64)", +"63b7f00a": "calculatePercentsFor(address)", +"63b80379": "AcceptDiscipleOffer(uint256)", +"63b82524": "ethReceivedPresaleTwo()", +"63b851b9": "updateMinimumEpochInterval(uint256)", +"63b87bb8": "openSale(uint256,uint256,uint256,uint256)", +"63b8bd44": "getBalanceofEthAgent()", +"63b8f7f7": "W4T()", +"63ba26fa": "QwasderToken()", +"63ba2c76": "toUintThrow()", +"63ba5e44": "fundem()", +"63ba7319": "BUILDING_PRICE()", +"63bafb96": "Log1(address,bytes32,uint256,string,string,uint256,bytes1,uint256,uint256)", +"63bb51a9": "setHash(address,bytes32,address,bytes32,uint256,uint256)", +"63bbe1b5": "transferAuthorizations()", +"63bce4e7": "softCapUsd()", +"63bd1d4a": "payout()", +"63be8fc8": "createNew(address)", +"63beeab1": "executeConstant()", +"63bf15c2": "_buildTimberCamp(address,uint256,bytes)", +"63bf8194": "mineFor(address,address,uint8,bytes32,bytes32)", +"63bf81cf": "createDiscipleSale(uint256,uint256,uint256,uint256,uint256)", +"63bf8d6a": "removeToken(uint8)", +"63bfe3d8": "SkillBeatsLuck()", +"63bfe52a": "addAddressToCraneList(address[])", +"63c05650": "addAddress(address,uint256)", +"63c06fe9": "mintForwarder(uint256,bytes32,address[],int256)", +"63c194f1": "NTFoundationAddr_()", +"63c1b753": "getAddressIndex(uint256)", +"63c281a1": "hitFoundationBalance()", +"63c3600b": "__stringToUint(string)", +"63c36549": "QueueIsEmpty()", +"63c37984": "thirdExchangeRatePeriod()", +"63c3e2e3": "clearTransferValue(uint256)", +"63c43415": "view60()", +"63c439a6": "secondCrowdSaleDate()", +"63c454ca": "ifFreeze(address)", +"63c4f031": "stop(bytes32)", +"63c6082f": "buyWithCustomerIdWithChecksum(uint128,bytes1)", +"63c65056": "TradeEthShop(uint256)", +"63c69f08": "getUserOrders(address)", +"63c6fe04": "addCities(bytes32[],uint256[],uint256[])", +"63c78e87": "withdrawEtherFromTrade(uint256)", +"63c7d473": "GoldAmountMelted()", +"63c988f9": "isAlive(uint8[176],uint8)", +"63ca7aaf": "FeeUpdated(address,address,uint256,uint256)", +"63cb2afb": "reserve1Address()", +"63cb344e": "setNctEthExchangeRate(uint256)", +"63cbab8c": "SELLER_STEP_1_OPEN()", +"63cc23ae": "Lesson_4(address,uint256)", +"63cc4aa2": "transferRemainingTokens()", +"63ccedfe": "MensariiCoin()", +"63cd1c51": "_createLottery()", +"63cd1da7": "dspcoin()", +"63cd44c9": "GetType(bytes32)", +"63cd99cb": "moo()", +"63cdcc57": "motionConfirming(uint256)", +"63cea450": "closePresale()", +"63ceb60d": "sponsor(uint256,address)", +"63cf1442": "JACK_DIST()", +"63cf2ef3": "limitLessThan(uint256,uint256)", +"63cf6ffa": "sellFish(uint16,uint16,uint8,address,uint256)", +"63d06dd4": "createContractPow(string,uint256,uint256)", +"63d08ae5": "Timebankc(uint256,string,string)", +"63d1055c": "proposeGame(string,string,uint256,bytes)", +"63d177e6": "unpauseICO()", +"63d17806": "operatingFund()", +"63d1e70e": "PHXroll()", +"63d256ce": "revoked()", +"63d29135": "SetEventData(uint256,string,string)", +"63d292d7": "STQCrowdsale(address[],address,address,address)", +"63d2be9d": "ratingOf(uint16)", +"63d36c0b": "calculateFinalPrice(uint8,uint8,uint256,uint256,uint256,uint256)", +"63d494ea": "becomeVoter()", +"63d4d4a9": "bonusRateInPercent0()", +"63d5243a": "getDaysPassedSinceLastTeamFundsBallot()", +"63d5502f": "presaleCap()", +"63d578c5": "ApolloSeptemTokenSpecialPurchase(address,address,uint256)", +"63d60745": "transferCreditsInternally(string,uint256,uint8,string)", +"63d64159": "max(uint8,uint8)", +"63d6519a": "CPCEPrivate()", +"63d6727a": "setStartStage3(uint256)", +"63d74226": "add_bounty()", +"63d7edb9": "VRCOIN_DECIMALS()", +"63d8c5b7": "RefundVaultWithCommission(address,address)", +"63d91851": "PUBLIC_CROWDSALE_CAP()", +"63d93f88": "transferFromWithoutAllowanceTest(address)", +"63d9b4b1": "sendGift(address,uint256)", +"63d9b770": "exploit()", +"63d9df85": "presaleContract()", +"63da5531": "tokenPerUsdNumerator()", +"63da9cf8": "signAttribute(uint256,uint256)", +"63db30e8": "minInvestedAmount()", +"63db3e63": "IPST()", +"63dc5400": "queryCurrentContractFunds()", +"63dcf376": "offChainPurchase(address,uint256,uint256)", +"63dcfa9e": "athleteAlreadyClaimed()", +"63ddbb99": "WBToken()", +"63ddc54d": "mmLib()", +"63de5323": "applicants(uint256)", +"63de6ad6": "purchaseCard(uint64)", +"63de882b": "wlStopBlock()", +"63deb2c5": "changeMemberAddress(address)", +"63def590": "untrustClient(address)", +"63df9769": "setReached(bool)", +"63e0c2f8": "whitelistAccount(address)", +"63e0f8c3": "StanleyNickels()", +"63e0f8c7": "referalBonus()", +"63e12cdc": "addCCUser(bytes32)", +"63e16fff": "nextGen()", +"63e1d57c": "getMaxSize()", +"63e27a63": "unlockTeamTokens(address)", +"63e2c349": "transferTokenAndLock(address,uint256)", +"63e321fe": "setDefaultHashes(uint8,uint8)", +"63e33e96": "totalSupplyUnits()", +"63e38ff3": "id_for_nym(uint256)", +"63e3eab3": "batchDeleteCandidateCache(address[])", +"63e3fbbd": "StopQuiz()", +"63e49fcd": "startPtopDeposit(address,address,bytes32,uint256,uint256)", +"63e4bff4": "giveTo(address)", +"63e4e5cc": "bountyPercentage()", +"63e561b6": "checkOrder(uint32[])", +"63e60df5": "GolemNetworkToken(address,address,uint256,uint256)", +"63e79315": "TokenERC20(uint256,string,string,uint256)", +"63e8dd96": "getCurrentOwners()", +"63e94cee": "getStage0End()", +"63e95a3c": "isNegligable(uint256,uint256)", +"63ea0143": "setTotalDeposit(uint256,address,uint256,address)", +"63ea6e44": "NewKing(address,uint256)", +"63eaa14d": "relock(address,uint256,uint256,int256)", +"63eac2d4": "getMyFalcon()", +"63eb963a": "dat()", +"63ebb3cf": "isValidSubmitter(address,bytes32)", +"63ebd4ff": "getFunctionAuthorized(address,address,string,bytes32)", +"63ebf801": "ChelleToken()", +"63ec3eb5": "WHENToken(string,string,address,address,address)", +"63ec96b7": "LogVictory(uint256,uint8)", +"63ed6d5d": "LogWhitelistRemove(address)", +"63eda29d": "prevSeriesSelloutHours()", +"63ee7c8d": "totalEscrows()", +"63ee8b88": "ico2Sold()", +"63eeb79a": "setMinEsteemAmount(uint256)", +"63eed1d7": "Alice(address)", +"63ef8d9e": "resetLotto()", +"63f019f6": "canBurnSecurity(address,uint256)", +"63f07aa4": "preSaleTokens(uint256,uint256)", +"63f0ae2e": "ProfitDelivered(address,uint256)", +"63f0ca5a": "BOUNTY_TOKENS()", +"63f114f2": "checkWithdrawValueForAddress(address,uint256)", +"63f160e6": "sentReveal(uint256,address)", +"63f1a089": "_mint(uint256,uint256,uint256)", +"63f1a9dc": "LogInvestorMigrated(address,uint256,uint256,uint256)", +"63f1de17": "ICONSORT()", +"63f225a7": "addLOCtoLHT(address,address)", +"63f22c24": "checkDelegation(address)", +"63f2493f": "settleETHBatch(address[],int256[],uint256,uint256)", +"63f32f63": "Price(uint256)", +"63f3dbe5": "VESTING_CLIFF()", +"63f55fc0": "setHolderGroup(address,uint256)", +"63f5679e": "changeDragonsStatsContract(address)", +"63f6100d": "buySome(uint256,uint256,uint256,uint256)", +"63f6271f": "LEGLToken()", +"63f75343": "setF2mAddress(address,address)", +"63f80de3": "issueCoin(address,uint256,uint256)", +"63f8a211": "sellOneStep(uint256,uint256,address)", +"63f9cb0e": "HLWCOIN()", +"63fa32f1": "newWinner(uint256,uint256,address,uint256)", +"63fa5716": "changeSoulReward(uint256,uint256,uint256)", +"63fa9888": "PredatexDua()", +"63fb5a1a": "putBuyOrder(address,uint256,uint256,uint256)", +"63fbc7bc": "expectPayment(bytes8,bytes32)", +"63fc98e3": "judgeEnableForTransfer(address,uint256)", +"63fcabcb": "BilancioMinimoAccount(uint256)", +"63fcf5de": "addtoContributos2(address,address,uint256,uint256)", +"63fd420c": "payoutMining(uint256)", +"63fd7552": "owedAt(uint256)", +"63fd7eb0": "chickenOf(address)", +"63fd91dc": "signUpForTournament(uint256[])", +"63fd9e38": "minInvest()", +"63fdca37": "HitCash()", +"63feeaaf": "smartContractStartDate()", +"63ff195d": "stakeOnBehalf(address,uint256,bytes32,uint256,uint256,uint256)", +"63ff6125": "donateToFeePool(uint256)", +"64004ea5": "getUserTotalPromoBonus(address)", +"640075f3": "isPositionClosed(bytes32)", +"64009184": "threeHotHoursEnd()", +"64017ea7": "submitExit(uint64,address,uint256,address,uint256)", +"640191e2": "channelManagerAddresses()", +"64020842": "isDisavowed()", +"640241b8": "acceptOnwership()", +"64027fbb": "minbet()", +"6402aca9": "getAllCardAddressesPriceOfOwner(address)", +"6402efd3": "tier2Rate()", +"64030441": "addCardsHash(uint256,string)", +"6403a9ed": "getVoteCountForOption(uint8)", +"6404865e": "OneOhana()", +"6406605b": "MetadataUpdated(uint256,address,string)", +"640708d6": "PRIORITY_SALE_START()", +"64070b6f": "p_setNextRoundSeedPercent(uint256,uint256)", +"6407e432": "mintTokens(uint256,address,address)", +"640853bb": "amountSoldPerPeriod()", +"640959bc": "getQuoters()", +"6409a4e3": "giveTokens(address,uint256,string)", +"640a404a": "getgamecardpos(uint256)", +"640a4d0c": "_deposited(address,address,uint256)", +"640bdd70": "setDividendFee(uint256)", +"640c3dbd": "isChipPassword(uint256,string)", +"640d3017": "SetMinSum(uint256)", +"640d84b5": "SetApplicant(uint32[],uint64[],uint32[],uint64[],int256,uint64[])", +"640ec47a": "assertTrue(bool,bytes32)", +"640efb0d": "setTravelPrice(uint256)", +"640f244b": "findSuitableGen()", +"640fe1e9": "availableForWithdraw(address)", +"64100038": "deleteUserClaim(address)", +"64109848": "tokemon20()", +"64109ae0": "MAINT_PRICE()", +"6410c41a": "priviledgedAddressBurnUnsoldCoins()", +"6411273f": "tapFab()", +"6412aeb1": "setBountyTokens(uint256)", +"641446eb": "splitPayment(uint256)", +"641579a6": "setMultiplier(uint256)", +"641620a2": "createMulti(uint256,uint256)", +"6416ec30": "Geet()", +"64179c1b": "ActivatedContract(uint256)", +"6417c08b": "implementsERC721d()", +"6417dec3": "setHSShopSaleFee(uint256)", +"6418345e": "updateMinimumInvestment(uint256)", +"6418b903": "transferRewardPool()", +"6418f643": "ClaimBlessings()", +"641a5f66": "getSendCoin()", +"641a8cb3": "MANHATTANPROXYBRDWY()", +"641ad8a9": "poolState()", +"641b58c2": "checkBet(uint256[],uint256[],uint256[],uint256,uint256)", +"641bbdfe": "claim(uint256,uint8,bytes32,bytes32,uint8)", +"641ca23f": "availableICO()", +"641d55e0": "buyClixToken()", +"641d6075": "getDailyWinners()", +"641e3f15": "notifyTokenIssued(uint256,uint256,uint256)", +"641e6b9d": "TestingEnabled()", +"641e8cca": "updateGameProprietaryData(uint256,string)", +"641e90de": "price5()", +"641f3b46": "isTokenExchange()", +"641f83a1": "calcEnvHash(bytes32)", +"6420e71c": "rateForPhase1()", +"64217bdf": "requestInterest(uint256,uint256)", +"6421fc04": "LockedMANA(uint256)", +"642231a6": "legendsCrowdfund()", +"6422816b": "betBLenght()", +"64228857": "getRevisionCount(bytes32)", +"642289f2": "MarketEnabled(address,address,address)", +"6423690f": "SmartDice()", +"64239cce": "purchaseUpAndSpend(uint256,uint256,bytes32)", +"6423b5f0": "miniMeToken()", +"6423db34": "Reset()", +"6423dbad": "getGreeter()", +"64245502": "STRegistrar()", +"6424bd8c": "Remove()", +"6424d686": "getEngineerCurrentVirus(address)", +"64253d2f": "HashnodeTest()", +"64256611": "collectedFunds()", +"6425fbed": "getJobStatus(bytes16,address,address,uint256,uint256)", +"64265b1a": "share_transfered(string)", +"6428366a": "payToGorgona()", +"6428925d": "toSTAR(uint256)", +"6428a652": "setPornstarsContractAddress(address,address)", +"6428fed4": "pendingJackpotForWinner()", +"6429161b": "createSaiLimitedEdition(uint256,address)", +"642ab4b1": "lastBidTime()", +"642b1759": "getMerkleLeave(uint256)", +"642b4a4d": "mainNetLaunchIncentiveReserveWallet()", +"642bdd15": "calculateNewPrice()", +"642c53e2": "GetData(bytes32,string,bytes32)", +"642c7aa2": "snatchHero(uint256)", +"642d345c": "byMaximum(bytes32,uint256)", +"642d63a3": "buyLottery(uint8)", +"642dfe55": "Bitmos(uint256,string,uint8,string)", +"642e8271": "NigeriavsArgentina()", +"642f1ddc": "nome_candidato_da_indice(uint256)", +"642f2eaf": "transactions(bytes32)", +"642f722c": "createRecord()", +"642f825a": "randomPetAuraBoost(uint64,uint8)", +"642fd0f6": "getPixelColour(uint256)", +"64308a6a": "_getPartSkillColor(bytes,uint256,uint256)", +"643124cf": "INZEI()", +"64319ae6": "updateUserEmail(address,string)", +"64322c9c": "drawingIdToCollectibles(uint256)", +"64325ddb": "currentClaimPrice()", +"6432679f": "getUserCapInWei(address)", +"64326c71": "getTotalGas()", +"64329400": "setHardParticipationCap(uint256)", +"6432dc4e": "sell_ppc()", +"6432e3cd": "CaDataContract()", +"6432e9e0": "calculatePayrollRunway()", +"6433ef42": "adjustWithdrawRate(uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32)", +"64341c0c": "getIPFSCode(bytes32)", +"643537aa": "getBFEX(address)", +"64362587": "SetRevealBlock(bytes32,uint32)", +"6436434e": "getAddressDnaIds(address)", +"6436b1b9": "getSpawningForCount(address)", +"64370755": "removeDistributionSources(address[])", +"64371977": "set(uint256,string)", +"64377452": "getUserHash(address)", +"64379150": "setNumberClaimToken(uint256)", +"6437ab0b": "checkCommitPeriod(bytes32)", +"64385828": "setDataColla_AB_01(string,string)", +"6438c43e": "getCurrentSchellingRound()", +"6438f449": "noviceDungeonId()", +"64392a80": "balanceOfOwnerInVault(address,address)", +"6439437e": "cloneIt()", +"643a7695": "verifyParticipant(address)", +"643ac0bd": "_unregisterAttack(bytes32)", +"643aff0f": "investorWallet()", +"643b18b6": "teamWallet_1()", +"643c6d1f": "PureChainToken()", +"643ce525": "teamLimit()", +"643d1be5": "setMainSaleStart(uint256)", +"643d6dc0": "getInfos()", +"643d71a2": "KODB(address)", +"643e1aa5": "SetStartTimeTLP2(uint256)", +"643e7365": "initialSaleContract()", +"643e77d8": "calculateProfit(uint8,uint256,uint256)", +"643f7cdd": "DAOpaidOut(address)", +"643f9b72": "SherolexToken()", +"643fcd27": "addieren(uint256,uint256)", +"64422ede": "createPoolsIfNeeded()", +"64422f3c": "multiDeltaBalances(address[],address,address[])", +"64425055": "returnedDataDecoded()", +"644280e2": "tokensForBounty()", +"6442af8d": "_totalRemaining()", +"644443ed": "addContractRole(bytes32,string)", +"64445d9e": "adminEditBallotOption(uint32,uint32,string)", +"6444a288": "setMinTokenForSP(uint256)", +"6446169b": "sellStar(uint256,uint256)", +"64461a55": "Synergy(address)", +"6446a339": "addAddressToPublicBuyerList(address)", +"6446afde": "getMappingElement(uint256)", +"6446ebd8": "deleteResources(address,address[],bytes4[])", +"644843f3": "LogNote(bytes4,address,bytes32,bytes32,uint256,bytes)", +"6448adc6": "tierLevel()", +"6448b46f": "pushCap(uint256)", +"6448b6cb": "closeVaultAccess()", +"644998ae": "maintain(int256,uint256,uint256)", +"644a3d42": "ANKR()", +"644a803d": "BlockTogether(address,uint256,uint256,uint256)", +"644a9db8": "sign(uint256,address,uint256)", +"644b1d1a": "CompetitionCompliance(address)", +"644b7a43": "getTokenByIndex(uint256)", +"644b7dc6": "_isOperatorFor(address,address)", +"644cf307": "preSaleBonus2Percent()", +"644d8164": "getDesc()", +"644d8cce": "burnMas(address[],uint256[],uint256)", +"644e4e4e": "LogVotes(uint8,uint256)", +"644e8b24": "getPrices(uint256,uint256,uint256[],uint256)", +"644fab74": "setTimeLock(address,uint256)", +"64506302": "okamiCurrentPurchase_()", +"6451447d": "buyoutFeePercentage()", +"6451ab58": "activeuser()", +"6452a10f": "emergencybeneficiary()", +"6452f344": "sayGoodbye()", +"6453558e": "founderTokenWithdrawnPhase3()", +"6455058e": "getStakedAudits(address)", +"6455780c": "getImportingParty()", +"6455cb97": "EPTest()", +"64561370": "oraclize_query(uint256,string,bytes[5],uint256)", +"6456d071": "addPatientReply(address,string,string,address)", +"64571245": "withdrawATN(address)", +"6457237b": "indexOf(uint256[],uint256)", +"64584b14": "executeOrders(address[],bool[],uint256[],uint256[],address[],address[],address[8][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[],uint256)", +"64584d16": "CardFootballers()", +"6458de1e": "ensOwnerPx()", +"6459361d": "setDetail(string)", +"6459a8dc": "PerseiToken()", +"645a8570": "teamAndAdvisorsAllocation()", +"645ac00b": "transferSignership(address)", +"645b8b1b": "status(address)", +"645bcd3a": "checkBasketExists(address)", +"645bd436": "clearDelegateAndUnlockTokens()", +"645c4625": "get_orderAddress(address,address,uint256,uint256,uint256)", +"645c6fae": "registerContract(bytes32,address)", +"645c9931": "SHPToken()", +"645c9ac8": "returnMixType()", +"645cd046": "bundleToken(uint256)", +"645d95d4": "LogBidAccepted(uint256,address,uint256,bytes32,uint256,bytes32)", +"645dbfd4": "updateRandom()", +"645dce72": "updateRelease(uint32,uint32,uint32,bytes20,bool)", +"645dfad7": "sellATR(uint256)", +"645e175c": "publicGetNote(uint64,bytes2)", +"645e6ddc": "bookingBalanceOf(address)", +"645f0d11": "toggleFactoryPower()", +"645f754a": "OZTToken()", +"6460c353": "PoWMiB()", +"64610c73": "ADA(uint256,string,string)", +"646156aa": "cancelTournament()", +"6461ed00": "TOTAL_TOKENS_SUPPLY()", +"6461fe39": "transferFromWithReference(address,address,uint256,string)", +"64631be6": "signatureOf(uint256,uint256)", +"6463d6bc": "getMaxBidder(uint256)", +"646439a3": "tradeStream()", +"64648589": "fundICO()", +"6464b107": "TRIUM(uint256,string,string)", +"6465d25a": "Aliencoin()", +"64663ea6": "withdrawAndSend(address,uint256)", +"646668b6": "getMaxBet()", +"64669d1b": "BadBitchCoin()", +"6466cfa1": "changeSellFee(uint256)", +"64679356": "Controller()", +"64679806": "last_number()", +"6468328e": "executeTransfer(address,uint256,bytes)", +"6468c099": "addAnimalType(uint128)", +"6469c348": "maintain()", +"6469c89b": "getNiceBets(uint256)", +"6469e87f": "isKickoffEnabled()", +"646cd69b": "postponeDueDate(uint256,uint256)", +"646cf24d": "assignTokenContract(address)", +"646d4f53": "PlayX100()", +"646d525a": "NetCents()", +"646d978b": "getKudosById(uint256)", +"646e90e7": "getAddBal()", +"646eba48": "releaseTokens(bool)", +"646f22c5": "getTicketsLeft()", +"646f2942": "CryptoJade()", +"646f7834": "lockCountingFromTime()", +"646fe5ee": "OwnershipTransferConfirmed(address,address)", +"646fec02": "ProposalAdded(uint256,address,uint256,string)", +"6470db2f": "removeAllowed(address)", +"647151b5": "sellUnicorn(uint256,uint256)", +"647308ee": "verifyWithdrawSignatures(bytes32,address,address,uint256,bytes,bytes)", +"64738c23": "makeOrder(address,address,address,uint256,uint256)", +"6473b34a": "batchAllocate(address[],uint256[])", +"64744d22": "getPoolDepositQspWei(uint256)", +"6474dd4c": "LuckyWorldCupToken()", +"6475e3d3": "MIN_BET_AMOUNT()", +"6475e47d": "DGT_contract()", +"647734b2": "setValidationAddress(address)", +"64779ad7": "pausedOwnerAdmin()", +"647846a5": "feeToken()", +"64794403": "setAddressOfERC20Tocken(address,address)", +"647aac0c": "race(uint32)", +"647b5ced": "pubsaleCap()", +"647b6065": "tokenIdToOwnerArrayIndex(uint256)", +"647d02d2": "closeFail()", +"647d5f14": "dividendinfo()", +"647dd08c": "callSender(address,address,address,uint256,bytes,bytes)", +"647e61f1": "setLargeInvestorApproval(address,uint256)", +"647f7058": "Commitment()", +"64801da1": "reliefRatio()", +"64802918": "div(uint16,uint16)", +"6480d014": "preicostarted()", +"64812751": "finaliseState()", +"6481f081": "sellVouchers(uint256)", +"64821338": "hasVoted()", +"648236e3": "acceptBidForSketch(uint256,uint256)", +"64826b7a": "publicSaleCap()", +"6482c535": "rateOfParking(address)", +"64832c4c": "heatUp(address,uint256)", +"648345c8": "setMessage(uint256,string)", +"648351b9": "MarbellaCoin(uint256,string,uint8,string)", +"64836227": "notifyWatcher()", +"64838603": "skinColor(string)", +"6483a330": "getPeriodInDispute(uint256)", +"6483ec25": "append(bytes32)", +"64847739": "isProposePhase()", +"6484ae80": "_addCharacters(address,uint8)", +"648583b4": "updateCandidate(address,bytes32,string)", +"6485cc52": "GBP_Omnidollar()", +"6485d678": "setActive(bytes32,bool)", +"6485e2e5": "_removeController(address)", +"64861329": "DiamondProjectToken()", +"648619dc": "serviceUnpause()", +"648621ec": "xnotify(string)", +"64864ca6": "Expand(address)", +"64868f97": "roundTokenLeft(uint256)", +"6486aa51": "isConfirmed(bytes32)", +"64887334": "setCompactData(bytes14[],bytes14[],uint256,uint256[])", +"6488c20e": "TransferableChanged(bool)", +"64893fcb": "totalVestedAmount()", +"648a0c91": "updateExchange(address)", +"648a5903": "isShortPositionExpired()", +"648aa3b1": "getComponentByName(string)", +"648ad97f": "setMain(uint256,uint256,uint256,uint256,uint256)", +"648b3514": "CheckpointToken(string,string,uint256)", +"648b45f6": "unequipMultipleUnits(uint256[])", +"648b7ce8": "Increment()", +"648bf774": "recover(address,address)", +"648c51eb": "isMyPlanet(uint256)", +"648c925e": "backToAll(uint32)", +"648d6367": "DocumentaryContract()", +"648d7219": "setOCG(address)", +"648d9e26": "startPublicIco(address)", +"648e3006": "getPurchasedTokens()", +"648e49e6": "dSET_XBL_ADDRESS(address)", +"648e625a": "confirmTransaction(uint256,address,uint256)", +"648f0bde": "Play(string)", +"648f4f0f": "tokenStoreAddress()", +"648fb06f": "mintMultiple(address[],uint256)", +"648fd473": "EBRK()", +"6490c7a8": "getArea(uint256)", +"64913477": "setMultisigWallet(address)", +"64916fcf": "WhitelistedCounterUpdated(uint256,uint256)", +"6491f0b7": "setLLV_edit_6(string)", +"64921844": "getTimePassed()", +"64928d24": "wasSaleEnded()", +"649371e0": "oracleCurrentInt()", +"649375da": "addEarned(uint256)", +"6493d7fc": "CircuitBreaker(address,address,uint256,uint256)", +"6493e64c": "upgradeTo(string)", +"6494b55b": "ceoAddCoo(address)", +"6494cde1": "endTransfer()", +"6494d477": "saltHash()", +"649564b3": "getOtherContractParticipant(address,uint256,address)", +"649677e1": "entranceFee()", +"64968f58": "set_presale_iconiq_arbits_per_ether(uint256)", +"6497129c": "getRoundNumber(uint256)", +"64976b4d": "setNplay(address)", +"64978c7f": "jembex()", +"6497b400": "_getFashionParam(uint256)", +"6497bd3a": "newPriceTicker(string)", +"6497d32e": "setCCH_edit_18(string)", +"6498156e": "preICOBuy()", +"64994978": "setFounder()", +"64996a43": "_computeCycleSkip()", +"6499e2d9": "ERC777DemoToken(string,string,uint256)", +"649ae9c6": "lockDate()", +"649c07d5": "is_contract(address)", +"649c0b21": "addressOfMSF()", +"649d56db": "getContractProps()", +"649e3c46": "createDoc(string,string,string,string)", +"649eea7f": "_transferCar(address,uint256,bool)", +"649efd6e": "mintForEverybody()", +"649f0153": "fiatBalance()", +"64a04d07": "ReconOwned()", +"64a08260": "adminRemoveRole(uint256,address,uint256)", +"64a20e2d": "getImpactDonor(string,uint256)", +"64a237f4": "VEGANToken()", +"64a31b80": "getRequiredReportsPerReporterForlimitedReporterMarkets()", +"64a41399": "contributeInCreditsToken()", +"64a48499": "getIntegerValue()", +"64a4a5d7": "testBitsEqualSuccess()", +"64a5a632": "getCompanyByName(bytes32)", +"64a640ef": "Bosscoin()", +"64a666f2": "getAuthorizedInsertAgents()", +"64a68943": "dividentSent(uint256,address,uint256)", +"64a7cc4b": "purchase(uint128)", +"64a7d7c7": "bidAuction(uint256)", +"64a80c0c": "openStream(address,uint256)", +"64a83d8b": "_removeTokenFromTranche(address,bytes32,uint256)", +"64a8a11f": "voteJUR(address,address,uint256)", +"64aabe92": "tryExec(address,bytes,uint256)", +"64ab23c9": "finalizeChangeStakingFees()", +"64ab374b": "getUnreadMessagesArrayContent(uint256)", +"64ab4702": "voteWeightUnit(uint256)", +"64aba263": "setInternalInfo(address,uint256,uint256,uint256,uint256)", +"64ac12b1": "multisig(address[],uint256)", +"64ac2c4a": "WavesPresale()", +"64acdb77": "disablePurchasing()", +"64acef7d": "newBP(bool,address,uint256,uint256,string,string)", +"64ad6027": "updateOrderNumber3(uint256)", +"64adc403": "getUserRewardPayouts(address,address)", +"64ae4451": "stateIs(uint8)", +"64aea551": "randnum()", +"64afab72": "remove(address,bytes32)", +"64afcf2e": "minSecondsBetweenPublishing()", +"64b09402": "setMetadataProvider(address)", +"64b13270": "registerDeed(string,string)", +"64b2eb2c": "publicOfferingExchangeRate()", +"64b3302d": "safeMult(uint256,uint256)", +"64b3b844": "getSaleInfo(uint256)", +"64b494d9": "setValInt(uint256)", +"64b4e6eb": "payRef(address,uint256)", +"64b55e8b": "SULTANT()", +"64b7571f": "distributeDividends(address,uint256)", +"64b7f1d3": "Rules()", +"64b837ab": "stopBlockjack()", +"64b9ca08": "noAdvert()", +"64bc6a74": "AllPartnersSet(uint256)", +"64bc82c3": "delegateAddresses(uint256)", +"64bd3066": "dispute(address,bool)", +"64bd7013": "wait()", +"64bd87d6": "scheduleCall(address,bytes,bytes,uint256,uint256)", +"64be8453": "NewUserAdded(address,address)", +"64beb745": "lockOwnership(uint256)", +"64bebead": "_FreeDom()", +"64bfc9a5": "stopBountyMint()", +"64c176eb": "setSmartToken(address)", +"64c2555d": "buyDay(uint16,uint256,string)", +"64c27f2a": "isOwnerOrOps(address,address)", +"64c2b768": "powered_up()", +"64c33c33": "setPrice(uint16,uint16,uint8,address,uint256)", +"64c34364": "hodl(uint256,uint256,uint256)", +"64c37043": "buyRareItem(address,uint256,uint256)", +"64c403d4": "getETHx2(uint256)", +"64c40bbc": "DCoin()", +"64c422d0": "participantToUBObought(address)", +"64c487ef": "isStoppingIcoOnHardCap()", +"64c638d5": "withdrawTokenToClientAccount(bytes32,bytes32,address,uint256)", +"64c66395": "getUIntValue(uint256)", +"64c76117": "endDistribution()", +"64c79bf3": "AddresstoString(address)", +"64c7b3bf": "Journal(uint256)", +"64c7b78c": "addOrg(string,string,string,string,string,string)", +"64c877f1": "depositLiquidateThePool(uint256)", +"64c88d62": "calcDemurrage(uint256)", +"64c8cd8c": "unlockMinedBalances(uint256)", +"64c8e825": "PooCoin()", +"64c96322": "setAllocationOpen(uint256)", +"64c96572": "TokenLMTC(uint256,string,uint8,string)", +"64ca55d0": "checkUserDivsAvailable(address)", +"64ca6478": "createImage(uint256[],uint256,uint256,bytes32[],string,string,string)", +"64cab0e3": "setCurrentPrizePool(bytes4)", +"64caf214": "setPlayerDetectGroup(address,address,uint8,uint32)", +"64cb5338": "FundedAmount(uint256)", +"64cbbd34": "WalletChanged(address,address)", +"64cbbdc7": "addDividendsForAddress(address,address)", +"64cbfdd6": "p_update_planetCryptoUtilsAddress(address)", +"64cc7327": "retrieve(string)", +"64cc7719": "getUserDataOnEther(uint256)", +"64ccd7a0": "getAutomatedReporterDisputeBondToken()", +"64cd1f69": "requestInvestment(uint256,uint256,bool)", +"64cd4a1a": "round4TokensRemaning()", +"64ce1068": "lockExpiration()", +"64ceed99": "foundersTimelock()", +"64cefc90": "fliqToken()", +"64cf6d71": "toBytes1(bytes,bytes,uint256)", +"64cf9167": "Numisma()", +"64d03095": "getSpecificTransaction(address,uint256,uint256)", +"64d03144": "Plaak(uint256)", +"64d05519": "createLastWill(address,string,string,string)", +"64d0bbc4": "increaseGenerationCount(uint256,uint8)", +"64d0d64c": "testControlCreateWithParentNotInUse()", +"64d0e83b": "jackpotWinCount()", +"64d12ec6": "getRevisionIpfsHash(bytes20,uint256)", +"64d17c08": "setServiceTokenAddress(address)", +"64d188eb": "fixAssetsAboveLimits(bytes32,bool)", +"64d34045": "setCCH_edit_20(string)", +"64d3e7c9": "ReserveToken(string,string)", +"64d40354": "limitAmount(uint256,uint256)", +"64d414bf": "getTokens(uint256,uint256,uint256)", +"64d4702f": "getNextKeyPrice(uint256)", +"64d4c819": "TYPE_HASH()", +"64d538d3": "StartIco()", +"64d563f1": "doubleClaimSegmentSlash(uint256,uint256,uint256,uint256)", +"64d57a03": "GainTempStuff(address,uint32,uint256)", +"64d582c0": "incentiveDistributionInterval()", +"64d5922f": "pingBlock()", +"64d5d024": "isValidBox(uint8,uint8,uint16)", +"64d6a95f": "changeGameParameters(uint256,uint256)", +"64d75891": "XXXXXXXX03(uint256)", +"64d79f20": "internalRegisterCertWithID(bytes32,bytes,bytes32,uint256,bytes32)", +"64d85348": "deleteOffer(address,address)", +"64d905c0": "awaitingParticipants()", +"64d98bd3": "ownerTransferJackpotToken(address,uint256)", +"64d98f6e": "isSolved()", +"64d9a9e9": "AirDropToken(string,string,uint8,bytes32,uint256)", +"64da8ad3": "settleSeller(address,uint256)", +"64dab033": "landmarkPriceStepDenominator()", +"64dab283": "getWHGDonationAddress()", +"64dad32f": "isTokenUser(address)", +"64db3a8a": "buyAura()", +"64db5aa8": "ARDBatchTransfer()", +"64dc68b8": "ILove0xBTC(string)", +"64dc807a": "burnUndistributedTokens(uint256)", +"64dd891a": "attack(uint256)", +"64ddc605": "lockupAccounts(address[],uint256[])", +"64dde40f": "isTournament()", +"64ddedc6": "Triangle(uint256)", +"64ddfa29": "getAdminAddresses()", +"64de4c1d": "setTatAddress(address,address)", +"64df049e": "protocolFeeRecipient()", +"64df19da": "removeCustomTimeLock(string)", +"64dfe85e": "Dsteem()", +"64e08644": "stakeRemainingToVote_Eth()", +"64e0bbc5": "checkMyTransactions()", +"64e19bdd": "ownerAirdrop(address,uint256)", +"64e1f38b": "howManyKeysCanBuy(uint256)", +"64e21c9e": "DirectFundingProcessed()", +"64e24f4b": "UpdateClientTokenAccount(address)", +"64e28148": "clear(address,uint256,uint256)", +"64e28636": "getLateFee(address)", +"64e2ec50": "collectOtherTokens(address)", +"64e2fdfa": "ToukenToken()", +"64e31d74": "RaffleLedger(string,uint256)", +"64e36d04": "hardCapInEther()", +"64e39b87": "setFundsWallet(address)", +"64e40eb9": "withdrawTokens(address,address,address,address)", +"64e4596e": "_getPVPContendersCut(uint256)", +"64e48fcd": "testResetBet()", +"64e48fde": "findPossibleDelegatorsOfRaw(bytes32)", +"64e4a8fb": "xaurCoined()", +"64e50fb9": "setIco()", +"64e593c0": "setStartTimeIco(uint256)", +"64e5c8be": "getRoundPrizeShare()", +"64e62afc": "setSegmentOwner(string,uint32,uint32,string,string)", +"64e749ff": "getPosition(bytes12)", +"64e779b1": "unmint(uint256)", +"64e7e4a4": "transferNotification(address,uint256,uint256)", +"64e8687f": "withdrawTalao(uint256)", +"64e8d682": "pre_startdate()", +"64eaa454": "crowdsaleAmountLeft()", +"64eaff54": "getSquirrelmasterReq()", +"64eb7327": "_getContent(bytes32)", +"64ebd70d": "the365address()", +"64ec8bdb": "creatorWithdraw()", +"64ed31fe": "authVotes(address)", +"64eda74b": "setIsFrozen(bool)", +"64eded20": "_getTokenAmountWithBonus(uint256)", +"64edfbf0": "purchase()", +"64ee49fe": "scheduleCall(address,uint256,bytes4,uint256,uint256,uint8)", +"64ef212e": "proxyTransferWithReference(address,uint256,bytes32,string)", +"64ef563c": "reveal_registration(uint256,address,address)", +"64f018d8": "issue(address,uint256,string,string)", +"64f05fd7": "calculateWithdrawableAmount()", +"64f06b39": "setPC(uint256)", +"64f101f0": "closeMint()", +"64f15430": "fundVesting(address,uint256)", +"64f1873b": "ICOstarttime()", +"64f39b47": "return_funds()", +"64f40a3c": "RESERVED_TOKENS_FUTURE_OPERATIONS()", +"64f42a99": "addUser(address,bytes32)", +"64f4b094": "getLowestBid(uint8)", +"64f54a17": "getLatestItemRaffleInfo()", +"64f65cc0": "setFinished()", +"64f67f33": "DIPToken()", +"64f6f7b9": "setup(address,uint256,uint256)", +"64f8ad1f": "get_default_approval_duration()", +"64f951e9": "sessionBlockSize()", +"64fa3070": "getEscrowFee(address)", +"64faf22c": "left18(uint256)", +"64fb7d68": "coinMinter(uint256,uint256)", +"64fc2d9d": "_tryCreateEtherMonster(uint256,uint256)", +"64fe5cde": "MAX_UINT48()", +"64ffb47b": "getTotalMicroKeys()", +"65011760": "DOCToken()", +"650271d2": "makeMove(uint8)", +"65030adb": "RESERVED_TOKENS_ICO()", +"65030e75": "setSecretContract(address,uint256)", +"6503178a": "setMinVeriAmount(uint32)", +"65033845": "XiaoshiToken()", +"65036ca9": "zethrBuyIn()", +"6503a701": "InitiatePayout(address,string,string)", +"6503e5ff": "mFUNDING_BONUS()", +"65045a2b": "bottomName()", +"650462ab": "tokensMasterNodes()", +"650500c1": "whatIsTheMeaningOfLife()", +"65050e27": "checkCandy(address)", +"65054e55": "claimSellerFunds(address,address,address,uint256)", +"65058f4c": "requestPayout()", +"65061957": "EMPTY_RESOURCE_SET_ID()", +"65066810": "WHITELIST_SALE_LIMIT()", +"650669d2": "getCompte_1()", +"6506b0d6": "setData(string,string,string,string,string,string)", +"6506b623": "rotateBitsLeft(bytes,uint256)", +"65084b76": "OpenRegistryRules(address)", +"6508978b": "updateLatestSaleState()", +"65089dd8": "freezeStatsSumHours(uint256)", +"65093661": "newCommunity(address)", +"650944a6": "beneficiaryStash(address)", +"650955d4": "HashToken()", +"65098bb3": "calculateCrossConnectorReturn(uint256,uint32,uint256,uint32,uint256)", +"6509c195": "setPartnerPool(uint256,uint256)", +"6509e776": "CC()", +"650b147d": "paidToPartners()", +"650c2b28": "tokensPerDollar()", +"650c4226": "changeFees(uint256,uint256,uint256,uint256)", +"650ce14c": "registerPublisher(address,bytes32[5])", +"650d0aa3": "ChangeFee(uint16)", +"650d22e8": "countryTimeLock()", +"650d5d6b": "get_status(uint256)", +"650d993b": "getCustomer()", +"650dd4fb": "_createCountry(string,uint256)", +"650e1505": "createLock(address,uint256,uint256)", +"650e85af": "setUserRoles(address,uint256)", +"650ee1ee": "NewSale(uint256,address,uint256)", +"650f1dd3": "isSupplier(bytes16)", +"651006c0": "getCreateMarketDenominationTokenValue()", +"6510076f": "giveTokensOne(address,uint256)", +"65103f6e": "hasFees()", +"651044a2": "BitcoinpalletToken()", +"6510cc17": "INITIAL_mulFactor()", +"6510ef4d": "oraclize_query(uint256,string,string[5])", +"65113528": "getBoosterType(uint256)", +"65114459": "getOpenPackageId()", +"6511a98b": "testRegisterProduct()", +"6511eadb": "marketingProfitAddress()", +"65121205": "calculateDevCut(uint256)", +"65121f68": "add1Y(address,uint256)", +"6512c9b5": "OwnersProductCommissionChanged(uint256)", +"65131f63": "getMembersOfTier(uint256)", +"65132ad3": "Police_3()", +"651398e6": "allocateTokenForAdvisor(address,uint256)", +"6513fafe": "resistWhiteList(address)", +"65141c20": "setRemixCount(uint256,uint256)", +"65147784": "Pasband()", +"65149a76": "calculateWinnings(bytes32,address)", +"6514aaca": "minimumCommission()", +"65153632": "assertEq11(bytes11,bytes11,bytes32)", +"65158b3b": "contributor(uint256)", +"6515c1fa": "defineMecenas(address)", +"6515c6a9": "paused2()", +"6515d28c": "getLockingTypeCount()", +"6516395a": "lockCustomer(address)", +"651680af": "stage5Deadline()", +"65170435": "FASDF(uint256)", +"651738a3": "setMinScaled(int8)", +"6517ef33": "getNumberOfOrders(uint256)", +"65181ad3": "GET_METADATA()", +"6518361e": "SCT(uint256,string,uint8,string)", +"651883c1": "batchSpawnAssetWithCreator(address[],uint256[],uint256[],uint256[],address[])", +"6518ad22": "placeETHBid(uint8)", +"65195bc7": "DPNPlusToken()", +"6519fac2": "userExisted(address)", +"651bb617": "tokenlength()", +"651bc2fb": "reserveNIMFAAddress()", +"651bfd2d": "itemPrice(address,uint256,uint256)", +"651c2ff9": "preTge()", +"651c45d2": "addTicket(address,uint256)", +"651c5c84": "TokenWalletHolder()", +"651c5d2d": "getGiver()", +"651c9e99": "GOGRN()", +"651cd08d": "validateStart(address,address)", +"651dd0de": "values(bytes12)", +"651ed944": "startPreICOStage()", +"651f066a": "playerBalance()", +"6520715a": "approveClaim(bytes32,string)", +"6520768d": "modName(string)", +"652084c0": "storeKey()", +"6520ca0d": "levelUpMining(uint256)", +"6520fde5": "auctionPaused()", +"652106d8": "tokenTribe(uint256)", +"65213840": "prizeMoney()", +"652139e2": "setAngelFinishDate(uint256)", +"65216a41": "airDrop(address[],uint256[])", +"6521c03c": "createContribution(address,uint256)", +"65225665": "getPlayerAddress(uint256)", +"65227c7d": "RenCap()", +"65228934": "setOperationsCallGas(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"6522bff1": "update(uint256,string,string,string)", +"65243f87": "findNextWeekday(uint256,bytes2)", +"6524f107": "BlobStore()", +"6525a233": "ORACLIZE_COMMISSION()", +"6525c29d": "rejectAdvertiserCharges()", +"6526db7a": "remove(uint256,uint256)", +"6526ecee": "KingOfTheEthill()", +"652740a7": "TransparencyRelayer(address)", +"6528ef46": "BBY(uint256,string,string)", +"6528f4cb": "getDivRate(uint256)", +"652918bc": "updateProfit(uint256)", +"6529abba": "setSellComission(uint256)", +"6529d1c9": "pricesOfDate(uint256,uint256,uint256[],uint256)", +"652b51eb": "RefundEnabled(uint256)", +"652b810c": "setInternalStakingAddress(address)", +"652c00c9": "maintainPlayer(address,uint256)", +"652ca8f4": "cofoundersSupplyDistributed()", +"652d38fc": "getTotalIn(address)", +"652da5ff": "b(bool)", +"652dad7b": "batchDecreaseApproval(address[],uint256[])", +"652db9ab": "_distribute(address,uint256)", +"652de5ad": "countPerfManagers()", +"652ebb4c": "tokenPriceInETH()", +"652edd41": "purchaseDatesEdition(uint256)", +"652f1f16": "addSignature(string)", +"652f6494": "treasuryOfficials(uint256)", +"652f78cc": "allocateCommunityToken(address[],uint256[])", +"6530b7f9": "_createDrink(string,address,uint256)", +"6530e008": "STAGE2_TIME_END()", +"6531041b": "updateMIN_CONTRIBUTION(uint256)", +"6531a708": "getHolderEditions(address)", +"6531dbff": "totalFundedEther()", +"65325871": "transferableTokensOf(address)", +"6532b646": "SFI()", +"65343fcb": "TrustEth()", +"6534b4e2": "IsPayoutReady__InfoFunction(bytes32)", +"6534ccd2": "addHouse(address)", +"6534eb76": "recycling(uint256)", +"653704b1": "_changeName(string,uint256)", +"65372147": "result()", +"65375f38": "updateCustomerKYC(address,address,address)", +"6537e401": "setIII_S(uint256)", +"653853c0": "AMLToken()", +"6539335a": "toTipoEnte(uint8)", +"65395242": "MathisTestToken()", +"65397d5e": "refundOIDIndex_()", +"653a8f14": "getNumTilesFromBoard(uint16)", +"653abf37": "setDecision(bytes32,address,address)", +"653ac422": "invest(address,address,uint256)", +"653c3174": "investorsNumber()", +"653c95b8": "getContribution(address,uint256)", +"653c968a": "Bethopia(address,address)", +"653c9eea": "isBS(address)", +"653cfd2f": "testTemp4()", +"653d1ca4": "getPI_edit_21()", +"653e0f7f": "participants(bytes32)", +"653e2e0d": "setLastPositions()", +"653f23f8": "registerJuryMember(string,address)", +"653f7219": "AddVerifiedInfo(bytes32)", +"653fbca1": "payableEtherReceived()", +"653fcf4c": "pewdiepie()", +"65401882": "setDB(address)", +"6540742f": "MIN_BET()", +"6540dc07": "_destroyImpl()", +"6540fcc2": "PRICE_PRESALE_WEEK1()", +"654142c7": "getBoolField2()", +"65419516": "bettingStart()", +"654259dd": "availableAmount(address)", +"654286d1": "changeFrozenBalanceAll(uint8)", +"6542fed7": "evaluateShareholders(address,address)", +"65433e7f": "AntFundRobotToken()", +"654470fc": "getTotalSellingItem()", +"65449436": "CryptoConseilSuisse()", +"65450a90": "ACEBlock()", +"6545bed3": "Dice(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"65472731": "lastBlock_a5()", +"6547c080": "Renmin(uint256,string,uint8,string)", +"65483f69": "getBNTBalance(address)", +"65488541": "Harimid(uint256)", +"6548b40d": "depositErc20(address,uint256)", +"6548e9bc": "setRelayer(address)", +"65497caf": "limitDateSale()", +"654a1855": "CentToken(uint256,string,uint8,string)", +"654a95f2": "calculateEggSell(uint256,address)", +"654a9f69": "CappedCrowdsale(uint256,uint256,uint256,uint256,address)", +"654af496": "callDividend(address)", +"654b3110": "allowIssua()", +"654b6105": "DestiNeedToken()", +"654c2111": "Cash311()", +"654c6daf": "totalTeams()", +"654c7381": "listItem(uint256,uint256,address,bytes32)", +"654c8748": "setBitSTD(address,address)", +"654cf88c": "store(bytes32)", +"654d146a": "costAndBuyTokens(uint256,uint256)", +"654e27f9": "callBtoWithSto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"654e51e7": "setRewards(uint256,uint256)", +"654f18b1": "DragonPriceUpdated()", +"654f1ccb": "getGamesLength()", +"654f4575": "getTopN(uint256)", +"654f4b61": "bidHash()", +"654f7d40": "ETHERRED()", +"654f97a3": "setClaimStatus(bool)", +"655012a9": "sumPrice()", +"655042ee": "OSCoinToken()", +"655059db": "create(bytes32,bytes32[])", +"655187b2": "Aragon()", +"6551fb11": "localsStore(address,address)", +"65521111": "isAble(address,uint8)", +"6552a562": "updModule(string)", +"6552d8b4": "removeReceiver(address)", +"655330f4": "NLog(uint256)", +"65536ab3": "BFEXToken()", +"655388be": "walkTowardsBlock()", +"65538c73": "fireEventLog0()", +"65538da0": "preSaleOpened()", +"655391c9": "updateBaseTokenURI(string)", +"6553b03c": "cloneContractor(address,uint256)", +"65540940": "partnerAllocateRestrictedTokenTo(bytes32,bytes32,uint256)", +"6554d179": "attachedSystemActive()", +"65550e70": "getNextAvailableCard()", +"6555394b": "updatePrice(address,bytes32[],uint256[],uint256)", +"655584d6": "ChangeDate(uint32)", +"6556f767": "getBytes(address,bytes32)", +"6557a47c": "Tier_Wildcat()", +"6557b677": "lowTokensToSellGoal()", +"6557dfc8": "AnimeToken()", +"65581793": "S2()", +"6558488a": "scheduleSetBool(address,uint256,bool)", +"6559aeb2": "transferTimelocked(address,uint256)", +"6559c08d": "checkProblemsSolved()", +"655a4ebf": "revokeAttribute(address,address,bytes32,bytes)", +"655b08eb": "getRandom(uint256,uint256)", +"655b3667": "TOKEN_SUPPLY_AIRDROP_LIMIT()", +"655b97db": "ownershipLookup(address,uint256)", +"655bb0e8": "transferSubcontractsOwnership(address)", +"655bb565": "changeGasPrice(uint256)", +"655c737c": "getPositionOwedToken(bytes32)", +"655cc366": "LogGoalReached(address,uint256)", +"655d0862": "createSignedMessageOracle(bytes32,uint8,bytes32,bytes32)", +"655d225f": "myTime()", +"655d65c4": "limitSell(uint256)", +"655dc4c2": "getLawyerCount()", +"655e0d38": "changeBroker(address)", +"655e4224": "addEntryInSecondsPeriods(address,uint256,bool,uint256,uint256)", +"655e51f2": "MIN_GOAL_EBC()", +"655ec3e4": "transferSoul(address,address)", +"655f8294": "PreviousTime()", +"655fc4db": "vault_releaseDeposit()", +"655fcaf5": "feeReceiverWallet()", +"65604a11": "VESTING_WALLET()", +"6560a307": "suggestedGas()", +"656104f5": "_setOrganiser(address)", +"6561e6ba": "feeWithdraw()", +"6561e921": "becomeRenown(bytes32)", +"6561ffb9": "LOTTECHAIN()", +"65620283": "transferTokens(address[],uint256[])", +"65622cfd": "transferFor(address)", +"65630493": "ERC20Impl(address,address,address,address)", +"656362b5": "regFactory()", +"6563b2fc": "tokensLeftInPhase(int8)", +"6564a7af": "DeployENS()", +"6564ad28": "IFNToken(address,address,uint256,string,uint8,string)", +"65651b6e": "addSkillName(address,bytes32,address)", +"65670adc": "teamSupply18Months()", +"65675074": "getAllTokensOfUser(address)", +"65676c9e": "baseExchangeRate()", +"65679536": "month24Unlock()", +"65687008": "fundraiserAddress()", +"65688182": "recomputeLastAverageBalance(address)", +"65688cc9": "newGuard()", +"6568a279": "withdrawAll(address[])", +"656afdee": "register(string,bytes32)", +"656b275c": "expandY()", +"656b9952": "produce()", +"656ca11d": "CONFIG_FEES_MUL()", +"656d2f63": "ManagedAccount(address)", +"656d3091": "createEthSaleAuction(uint256,uint256)", +"656d677e": "releaseTotal()", +"656e8d6f": "getTutorialBabyGen(uint16)", +"656ea1f6": "snikerts()", +"656f416d": "uponTransferFrom(address,address,address,uint256)", +"656f64f5": "pendingGDPOracle()", +"656f6873": "ActualizePriceBeforeStart(uint256,uint256,uint256,uint256)", +"65704506": "currentGame(address)", +"657128a2": "altTokenOf(address,address)", +"657157e5": "canTrade(address,address)", +"657206ef": "getSignedAddresses()", +"6572ab5b": "shareCycleIndex()", +"6572ae13": "calculateWinner(uint256,uint256)", +"6573ee1e": "doFailingApprove()", +"6574bdd2": "newDream(address,string,string)", +"65757eeb": "removeDiscounts(uint256[])", +"65766b64": "stageBegin()", +"6577ab77": "_checkSeal(address,address,address,uint256)", +"65781994": "SESAPACToken()", +"65783c66": "checkTicket(uint32)", +"6578d920": "_canSendGameGift()", +"65791e46": "setTimeTransferAllowance(uint256)", +"65794de3": "secondStageDuration()", +"657a2ffa": "Register(uint8,string)", +"657a37ad": "depositAndSell(address,address,uint256)", +"657ad078": "moveOwner(uint256[3],uint256[4],uint8[176],bytes32,bytes32,uint8)", +"657ad479": "presalePerEth()", +"657ba57b": "show_The_name_of_option_C()", +"657c5dae": "ApproveTitle(uint256)", +"657d38b8": "endICOp3()", +"657db38d": "ten_wallet()", +"657edc11": "removeLootbox(address)", +"657f3ab0": "getPricePoint(uint256)", +"657f4783": "getRealGoldBought()", +"658030b3": "tokenInstance()", +"65826666": "executePullPayment(address,string)", +"658268c1": "StableCurrencyToken(uint256,string,string,uint256)", +"658311ab": "jackpotLevel()", +"658389cb": "isFromCountry(address,address,uint256)", +"6583e239": "STATUS_DEAL_APPROVE()", +"6584a5b5": "removeLock(address[])", +"6584ceb0": "StartNewEpoch()", +"6584fcce": "ATCReserveLocker()", +"658523d9": "StrategicToken()", +"65855010": "rateSale()", +"658577e9": "buyXid()", +"65857a5e": "parkingOn(address,uint256)", +"65859862": "add_arbits(address,address,uint256)", +"6585c27c": "getrandoms()", +"6585dc12": "enableRefundPeriod()", +"658612e9": "gasFee()", +"65862330": "TestableStandardCampaign(string,uint256,uint256,address,address)", +"65863b24": "getTotalCollectedPromoBonus()", +"6586bb25": "MAXIMUM_PARTICIPATION_AMOUNT()", +"6586bd51": "getNodalblockSender(string)", +"65879e72": "JED()", +"6587ab3d": "toggleSafetyMode()", +"6588875e": "ShutterToken()", +"6588c11c": "_startSwap()", +"658a5692": "_totalEthCollected()", +"658b98a9": "pointMultiplier()", +"658bc083": "initDistribution(address,address,uint256)", +"658bf147": "setArea(uint256,bytes32)", +"658c55ed": "saleProceedsFiat(uint256)", +"658cc376": "getCensuringCount(uint16)", +"658d3423": "getGameMinAmountByBet(uint256)", +"658dc76f": "addChunk4ToWhiteList()", +"658df3f7": "approveCompletedMilestone(uint256)", +"658e587f": "getWithdrawConfirmationCount(uint256)", +"658eefd1": "notifyRefundToken(uint256,address)", +"658f2ad6": "CrowdSale_Resume()", +"658fbfbc": "transferOnError(address,uint256)", +"659010e7": "m_spentToday()", +"65909081": "Brothel(address)", +"6590f0ed": "DUKCoin()", +"65921f02": "paladinEquity()", +"65926a20": "changeSaleOn(uint256)", +"6593643c": "CreateIND(address,uint256)", +"65937ab9": "isUpdateAuthorized(address,uint256)", +"659382fb": "payoutETH()", +"6594479f": "LTYP()", +"6594d99b": "isDataNo(bytes)", +"6594ea6c": "EGGS_TO_HATCH_1SQUIRREL()", +"65957bf5": "getShareToken(uint256)", +"6595c94e": "calculateTierBonus()", +"6596217b": "HAYATO_FTL_SPEED()", +"659621b5": "r0()", +"65968727": "innocoinToken()", +"6596cff3": "setCrowdsaleContract(address)", +"65975691": "getDividends(uint256,uint256)", +"6597a076": "getBonuses()", +"6598afb9": "yearlyBlockCount()", +"65995733": "getSalaryTokenValue(address,address,address)", +"65995cc8": "uploadAdvertisement(uint256,string,address,uint256)", +"659a46e8": "coinLockRmoveMultiple(address[])", +"659a7486": "inTradingTime()", +"659a9cbc": "coinsUnit(uint256)", +"659ae215": "saleDateFinish()", +"659b586e": "readQuantityList(address,uint256,uint256)", +"659b9c72": "UsersNumber()", +"659bd174": "TransferredTimelockedTokens(address,address,uint256)", +"659d1185": "angelTimeLock()", +"659d20eb": "getFoundersGames(address)", +"659d6bd1": "readPower()", +"659d7aaa": "sendEtherManually(address,uint256)", +"659de63b": "distributeToken(address[],uint256[])", +"659e0729": "getFirstAmount(bytes32,bytes32)", +"659e27b0": "setWhitelistingAddress(address,address)", +"659e69e9": "setDelegateAdmin(address,address,string,bool)", +"659eeabc": "tokensWithAmount()", +"659eeef1": "increasePaymentsBalance(address,uint256)", +"659f9e3c": "lastEpochBlockHeight()", +"659fb968": "getOracleOutcomes(bytes32[],address[])", +"65a096dc": "changeWithdrawableRound(uint256)", +"65a114f1": "resetTime()", +"65a178c0": "getTlength01()", +"65a20ef9": "hasRole(uint256,address,uint256)", +"65a26185": "updateGranted(address,address)", +"65a31545": "doDeposit(address,uint256)", +"65a3d8f0": "setEtherCentPrice(uint256)", +"65a4c957": "resultsDelay()", +"65a4dfb3": "oraclize_query(uint256,string,string,string,uint256)", +"65a572dc": "EGREngravedToken()", +"65a5e708": "Upgraded(uint256)", +"65a5f1cd": "changeFoundation(address)", +"65a61ab4": "RWSC()", +"65a6bb29": "getAllOracles()", +"65a707bf": "DrugDealer()", +"65a7dcec": "addWinners()", +"65a8a483": "setColdWallet2(address)", +"65a91d4a": "createAmountFromTmedForAddress(uint256,address)", +"65aa96bd": "postJobOffer(uint256,address,uint256,uint256,uint256)", +"65aade1a": "getEmployeeId(address)", +"65ababe9": "createERC20Token(string,uint8,string,uint256)", +"65abb3f2": "_doAddPollOption(uint256,bytes)", +"65ac0d8b": "Withdrawl(address,uint256)", +"65ac2320": "ownerName()", +"65ac4341": "getTotalAmount()", +"65ac8c2a": "getSellOrdersInfo()", +"65ad9f34": "setHardCap(uint256,uint256)", +"65ae247e": "issueLockedTokensCustom(uint256,uint64)", +"65aebe7b": "ind(address,address)", +"65aec658": "_createCitizen(uint16,uint16,uint8,bytes32,bytes32,bytes32)", +"65af2a7d": "investedDDT(address)", +"65afa594": "Member_GetMyTokens()", +"65b040c8": "setPriceWithBonus(uint256)", +"65b051b8": "MEWSToken()", +"65b06136": "makePayouts()", +"65b0bc85": "createNameAndPoint(bytes32,address)", +"65b0d711": "updateApprovalOfToken(address[],bool)", +"65b0e5b3": "setethrate(uint256)", +"65b1b92d": "unLinkNewHouse()", +"65b1c987": "resetBurntTokens()", +"65b1fdf4": "scheduleIssuePOIs()", +"65b27205": "testFailMintWhenStopped()", +"65b2a863": "revoke(string)", +"65b36bbb": "countpat(uint256)", +"65b37d70": "HotManChain(uint256,string,uint8,string)", +"65b3a7ca": "isGameExpired(uint256)", +"65b686b0": "burnRemainTokenOffering()", +"65b6cd66": "setUserTransactions(string)", +"65b6d9e2": "a(uint256,string)", +"65b70e45": "UpMineLVL(uint256)", +"65b7a89d": "DeDeContract(address,address,address,uint256,uint256,address,address,uint256)", +"65b7b357": "getVotersAnswer()", +"65b892a1": "withdrawForOneStep()", +"65b980ab": "performTransaction(address,bytes32)", +"65b9e37d": "hardParticipationCap()", +"65ba12b8": "percentWeiJackpot()", +"65ba331b": "IcoStagePeriod(uint256)", +"65ba36c1": "interfaceHash(string)", +"65baf5db": "tier2Start()", +"65bb193e": "createInsurance(string,address)", +"65bbb26a": "Linamyd()", +"65bc35fa": "Streem(uint256,string,string,uint8)", +"65bcaf4a": "Ubiou(uint256,string,string)", +"65bcfbe7": "payouts(address)", +"65bdadf6": "ninthTime()", +"65bf1ffc": "authorizedStartTrading()", +"65bfdb0b": "_receiveChild(address,uint256,address,uint256)", +"65c04faf": "random(uint32,uint256)", +"65c09830": "changeStatusGame(uint8)", +"65c0eecf": "BitcoinLiza()", +"65c13fdb": "changeGasPriceLimit(uint256)", +"65c19af0": "getStringLength(string)", +"65c24799": "getYayNum(uint256)", +"65c2c60f": "checkName(bytes32)", +"65c2d3a0": "romper()", +"65c2e8a1": "bossAdmin()", +"65c2fab2": "NewIssue(address,uint256,uint256)", +"65c301ab": "getDriver(address)", +"65c40b07": "bonusesDates(uint256)", +"65c4a861": "cordY(uint256)", +"65c4b463": "_tag(bool,string)", +"65c5826f": "ENC()", +"65c5e683": "mine(address,uint8,bytes32,bytes32)", +"65c683cf": "metadataOfToken(uint256)", +"65c724cd": "dividendsCollected()", +"65c72840": "getDay(uint256)", +"65c7b711": "MockToken()", +"65c91b0b": "testFailTransferOnlyTrustedCaller()", +"65c95a6b": "setUFee(uint256)", +"65c9e51e": "setDepositPeriod(uint256,uint256)", +"65cacaa4": "getVaultAddress()", +"65ccb687": "PULSToken()", +"65cd048b": "setDividendFee(uint8)", +"65cd1bea": "PayToken(address,address,uint256)", +"65cd3686": "setIsSendingLocked(address,bool)", +"65ce47fb": "_myDecimal()", +"65ce5222": "specificTransferFrom(address,address,uint256)", +"65ce7395": "setMinVote(uint256)", +"65cf3a48": "bonusPrice()", +"65d0a890": "Daio(uint256)", +"65d0e4a7": "addBot(address,address)", +"65d1926d": "dropAddress()", +"65d1df24": "s2s()", +"65d27248": "setSellPrice(uint16,uint16,uint8,address,uint256)", +"65d300ea": "CreateAds(address,uint256)", +"65d43868": "allowedOracleChangePercent()", +"65d48d0b": "freezeBalancesOf(address)", +"65d4bdab": "targetEth()", +"65d51dd5": "_phase2Supply()", +"65d5b48d": "PRECOMMITMENT_VESTING_SECONDS()", +"65d61ad6": "PwdHasBeenSet(bytes32)", +"65d6759a": "getGenome(uint256)", +"65d68308": "receiveTokenLoot(uint256,uint256,uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"65d6dbbd": "unPromisedPop()", +"65d6e6a4": "jackpotMaxTime()", +"65d73851": "calculatePrizeCut(uint256)", +"65d7d3d0": "LegacyReputationToken()", +"65d80117": "getResource(string)", +"65d8a20a": "updateTransactionFeePercentage(uint8)", +"65d8e32e": "setProfileHash(string)", +"65d967b0": "ETH_HARD_CAP()", +"65d9d8e2": "depositEtherForUser(address)", +"65d9df9c": "totally_decrease_the_supply(uint256)", +"65d9f31e": "addressFounders3()", +"65d9f55a": "removeValidationPreSigned(address,bytes32,uint8,bytes32,bytes32,bytes32)", +"65da1cfc": "AdminClaimed(address,address)", +"65da5603": "produce(uint256)", +"65db63d0": "kittensDroppedToTheWorld()", +"65db6c8c": "OPTIONAL_POOL()", +"65dba2b3": "removeTeamMember(address,bytes32)", +"65dbcc0f": "addThenSubUInt(uint256,uint256,uint256)", +"65dc128e": "p_setAirdropPercent(uint256,uint256)", +"65dc4e3a": "addCollateralMarket(address)", +"65ddf33b": "productsShipped()", +"65de1eb3": "getVendor(uint256)", +"65df517e": "CTHToken()", +"65df7933": "totalDevelopers()", +"65dfc20f": "setWalletFees(address,uint256)", +"65e00beb": "createFlowerAuction(uint256,uint256,uint256,uint256)", +"65e0c718": "DisputeResolved(bytes32)", +"65e0e117": "getSendersCalcTokens(address)", +"65e0e9a2": "preIcoState()", +"65e14731": "_kittenOwner()", +"65e16933": "buyPRETDETokensWithoutETH(address,uint256,uint256)", +"65e16a09": "transferadmin(address,address,uint256)", +"65e17c9d": "feeAccount()", +"65e1cc85": "foundersPercent()", +"65e21cb0": "transferNewBunny(address,uint32,uint256,uint256,uint32,uint32)", +"65e23ce3": "minimumEther()", +"65e2406a": "takeEthForExchange(uint256)", +"65e2409b": "getPlayerEnergyByAddress(address)", +"65e4349c": "NewStage(uint256,uint256)", +"65e44d06": "BITOToken()", +"65e47208": "lcBalance()", +"65e49444": "claim_bix_with_maturity()", +"65e4ad9e": "isAuthorized(address,address)", +"65e60ef2": "read(bytes32,bytes32)", +"65e62ee6": "getInvestorKycLimit(bytes32,uint8)", +"65e7096d": "allMaskGu_()", +"65e7ee50": "RCCContractTest()", +"65e807ab": "getTokenLossValue(uint256)", +"65e83ae1": "getCrowdsaleTokens()", +"65e8faf6": "isValidIndex(uint256,uint256)", +"65e93b3f": "getUserVotes()", +"65e9cc4e": "contributionPending()", +"65ea19a8": "set_notary(address)", +"65ea2b77": "ethaddrc()", +"65ea62ff": "initTransfer(address,uint256,uint256)", +"65eb0dec": "changeAllowedTakerBetsPerMakerBet(uint256,uint256)", +"65ec4c2e": "retirarDinero(uint256)", +"65ed16af": "_addBridgeNativeFee(uint256,uint256)", +"65ed4a45": "getVerifiedNumOrganizers()", +"65ed6e23": "getAllocations()", +"65ed8a4a": "proposedTotal()", +"65eec589": "_markWithdraw(address,uint256)", +"65ef1a3f": "setHotWalletAddress(address,address)", +"65ef617d": "AdminWalletUpdated(address)", +"65ef7b95": "getStoreAddressById(uint256)", +"65efd3a3": "addCertAdmin(address,bytes32)", +"65f0a00b": "ONETIDC()", +"65f17913": "monarchsByNumber(uint256)", +"65f27bea": "testSubBalanceFailsBelowZero()", +"65f2bc2e": "unitsOneEthCanBuy()", +"65f3c31a": "Put(uint256)", +"65f41211": "validStoreDest()", +"65f42e7a": "APTV()", +"65f4d9f6": "failInvestPercents()", +"65f520a7": "kittyData()", +"65f5463e": "CLIP()", +"65f594a7": "revealCurve(uint256,uint256,uint256,bool,bytes32)", +"65f63c1b": "queryToken(uint256)", +"65f68c89": "getId(address)", +"65f6a049": "sellGrimReapersAgainstEther(uint256)", +"65f6c15e": "ordersOf(uint256,uint256)", +"65f6d6a2": "FOUNDERS_TOKENS()", +"65f77c63": "getCertAddressByID(string,bytes32)", +"65f7aaff": "endRoundDecision()", +"65f84cbe": "_createWeightedMultiplierLot(address,uint256,uint256)", +"65f88c0d": "getNumUsers()", +"65f926ff": "getIdArrayItemsCount(address,address,string)", +"65f937ed": "sumOfAvailableIcoCoins()", +"65f97082": "startIco2(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"65fa2b97": "calculate_with_fees(uint256)", +"65fa2f7f": "getLastPrice(uint256)", +"65facff0": "_isMember()", +"65fae654": "Mychatcoin()", +"65fb99ba": "findUnConference(string)", +"65fba60d": "crowdsaleAllowance()", +"65fbc99f": "distributedSaleStakes()", +"65fc1253": "setExternalDependencies(address[])", +"65fc535b": "withdrawBenefit(address,uint256)", +"65fc783c": "getNumOfVoters()", +"65fcb49e": "maxContractBalance()", +"65fcf1b5": "releaseFirstUnlock()", +"65fddc81": "reducer()", +"65ff0f5a": "TradeListing(address,address,address,uint256,uint256,uint256,bool,bool)", +"65ff8220": "sampleContract()", +"65ffe43d": "lastFund()", +"66003666": "bountyTokens(address,uint256,string)", +"66005ede": "vc1Wallet4Pct()", +"6600811c": "tokenSaleHalted()", +"6600d282": "releaseAngelFirstVested()", +"6601345c": "changeTierController(address)", +"66013bdd": "withdrawToken(address,address,uint256,address,uint256,uint256,address)", +"6601cd77": "getExchangeDetails()", +"66025047": "isCategory(uint256,uint8)", +"660357f2": "removeWhiteListedContracts(address)", +"66035cc0": "adPriceHalfDay()", +"66040458": "signedApproveAndCall(address,address,uint256,bytes32,uint256,uint256,bytes32,address)", +"66042e7a": "etherToSendFund()", +"6604ca6b": "STO_KEY()", +"66056e8b": "destructSale()", +"6605bfda": "setTreasuryAddress(address)", +"6605ff66": "totalSales()", +"660686de": "cutBAU2Length(bytes32,address,uint256)", +"6606873b": "setMem(uint256)", +"6606b7d4": "democFee()", +"6606fe1e": "CABCrowdsale()", +"66081ec1": "JACKPOT_WALLET()", +"66092ea8": "ignited()", +"66098d4f": "plus(uint256,uint256)", +"66099706": "getChannelCred(address,uint256)", +"660a333e": "assetOwnerAdded(bytes32,address,address)", +"660aab8e": "profileOf(address,bytes32)", +"660b24b4": "emergencyTokenDrain(uint256)", +"660b7ad5": "rentDue(bytes32,string)", +"660ba74e": "_availableBetting(uint256,uint8,uint256)", +"660c325e": "evPayOut(address,uint256,address,uint256)", +"660c6813": "crowdsaleStopDate()", +"660d0d67": "dataStore()", +"660d5887": "registeredUsers()", +"660dee82": "addTask(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"660ef82d": "advisersAllocation()", +"660f77aa": "CVDToken()", +"6610a38a": "mountCitadel(address,address)", +"6610f7a8": "previousBurners(address)", +"6611611c": "MIN_INVESTEMENT()", +"661195bc": "transferFromLowFunds(address)", +"6611f5f2": "ZTR_ETH_extra_price()", +"6612283d": "subdivisionEnabled()", +"66125b25": "boolFunc(bool,bool)", +"661309ac": "allowedTransfers(address)", +"6613221f": "burnLand(uint256)", +"66134794": "exploreCount()", +"6613ee9c": "_isSigned(address,address,bytes32,uint8,bytes32,bytes32)", +"66154885": "getIncomingValueAsEth()", +"6615827b": "LogEscrowEthReq(uint256)", +"6615dd83": "setSeedSourceB(address)", +"6615e357": "setPortfolio(bytes32,bytes32[],uint256[])", +"66161ed4": "setStopContract(bool)", +"66167617": "bet_various()", +"66167663": "subdomainTarget(string,string,string)", +"66168bd7": "depositTokens(address,uint256)", +"6616c886": "canSetBanker()", +"6617e11a": "NiceGuyTax()", +"66180bc7": "testTransferTwoTokensAndReturnFunds()", +"66188463": "decreaseApproval(address,uint256)", +"66188a26": "forwardable(address)", +"6618b008": "cancelSellOrder(address)", +"66194d72": "childToken(address,uint256)", +"661956fb": "depositInvestment()", +"661990bc": "earlyInvestorWallet()", +"661aba0d": "setMntpMigrated(address,bool,string)", +"661ad427": "setOraclizeUrl(string)", +"661b6dae": "eth2qiuRate()", +"661b9065": "getRelationWith(address)", +"661be157": "account_address()", +"661c866c": "requestNewEtherRealID(string,string,string,bool)", +"661d3470": "LUXREUM()", +"661e3605": "ConstructorContract(uint256)", +"661e5ec2": "getPlayerValues(uint8[],uint8[],uint8[])", +"661edfee": "rewardFor(address)", +"6620a935": "sendToOwner()", +"6620cc3c": "GanNFT()", +"6620ffd3": "getNumAnimalsXType(uint8)", +"66210532": "setVestingMasterAddress(address)", +"6621b7be": "fiatValueMultiplier()", +"66234c4a": "ReleaseManagerSet(address)", +"6623fc46": "unfreeze(uint256)", +"662457c6": "nextProposalID()", +"6625123b": "COINBIG()", +"662512f1": "testThrowTranferZeroTokens()", +"6625b349": "RESERVE_ALLOWANCE()", +"6626b26d": "off()", +"66272374": "setWithdrawRate(uint256)", +"662723bb": "bulkTransfer(uint32[],address[],uint256[])", +"66273fc6": "bountyTokenSupply()", +"6627ace5": "getDCommBallotsEnabled(bytes32)", +"662959cc": "southadvisor()", +"662a3b81": "getHouseAddressTwo()", +"662a6137": "developmentTokensWallet()", +"662a719b": "RewardHalvingTimePeriod()", +"662ad59b": "pixels()", +"662bca97": "SetInRate(uint256)", +"662c6230": "LogResultNoWinner(uint256,uint256,bytes)", +"662d2ec8": "freeze(address,uint256[],uint8[])", +"662d5aa9": "EduMetrix()", +"662da459": "newCostToken(uint256)", +"662dbe96": "getNodeHeight(bytes)", +"662de379": "registerAddress(bytes32,address)", +"662e2536": "cordZ(uint256)", +"662e3470": "getSectionIndexFromRaw(uint256,uint256)", +"662e4db0": "c_preICOBonusPercent()", +"662e4ee4": "changeowner(address)", +"662f0763": "sendTokenReward(address,uint256)", +"662f94c0": "approveBlacklistedAddressSpender(address)", +"662fa2fb": "ProofOfRarePepe()", +"662fac39": "mining()", +"662feffc": "addStore(string)", +"663083f6": "moneyTotal()", +"663152d1": "phaseOneEnd()", +"6631ff1d": "grantToken(address,uint256,uint256,uint256,uint256)", +"6632a507": "testSetupPrecondition()", +"66331bba": "isPriceOracle()", +"6633a2bb": "_newPresserFee(uint256)", +"66341c97": "changelp14(address)", +"6634cec6": "findProductAndIndexById(uint256)", +"6634d917": "startEarlyStage2()", +"66357f57": "descriptionUpdate(string)", +"6635da25": "Voting(bool)", +"6635e0ea": "BlocklabTokenV1()", +"6635e511": "availableForInvestment()", +"66365082": "dealRevert(uint256)", +"6636fca8": "retainers(address)", +"6637324a": "Deploy(address,uint256,uint32,uint256)", +"6637b882": "setDao(address)", +"66383d32": "getCurrentRoundIndex()", +"663890b1": "FinalizableCrowdsaleImpl(uint256,uint256,uint256,address)", +"66389f1f": "OwnerProclaimedDead(address,address,uint256)", +"6638c087": "createCloneToken(string,uint8,string,uint256,bool)", +"6638d82f": "freezeTo(address,uint256)", +"6639016b": "releaseETH()", +"663960cd": "NewWinner(address,uint8)", +"6639dc8e": "emissionLimit()", +"663a0ebb": "tokensAmount()", +"663a339d": "IsSetReferrer()", +"663b0534": "disablePayable()", +"663b3f62": "balancesImporter6()", +"663b8c5a": "_newTuneOption(uint32,uint32,uint256,bool,bool,uint128,uint64)", +"663bc990": "test_1()", +"663c01af": "getAllProductIds()", +"663c2e30": "claimPrize(bytes4)", +"663c920a": "redenomiValue()", +"663cebfc": "VeiagCrowdsale(uint256,uint256,uint256,uint256,address,address,address,address)", +"663d1e84": "createVotacion(bytes32,bytes32[],uint256[])", +"663d6612": "defaultOperatorsTranche(bytes32)", +"663e0f88": "getSpecifiedDecimal()", +"663e90d9": "setBuyNowListing(bytes32,uint256,bool)", +"663f2670": "AccountLinked(address,address)", +"663f70c3": "calculateBounty(uint256)", +"663f8549": "mintReserved(address,uint256,uint256)", +"663f9c0d": "loginState(address)", +"663fc7e0": "highRoller()", +"663ff5a9": "create(bytes32,address)", +"6640ca84": "AgreementPen(address)", +"6641179e": "artistsEditions(address)", +"66417115": "positionOfJingle(uint256)", +"6641cc27": "eliminarVotacion(bytes32)", +"6641cc64": "kycApproved(address)", +"6641ea08": "ROUND_DURATION()", +"6642c0bc": "executeExploit(address,address)", +"66435abf": "getWeight(bytes32)", +"6643caba": "generousDonation()", +"6645167d": "YourCrowdSale()", +"664519bd": "wwamICOcontractAddress()", +"6645c0dc": "transferVotes(address,uint256)", +"66476fcc": "flipTokenReward()", +"66479c08": "payOraclize(uint256)", +"6648cb52": "setPurchasePeriod(uint256)", +"66494ab6": "THAW_CYCLE_FUNDER()", +"6649dfd5": "preCrowdsaleOn()", +"664a1ad6": "fundWallet()", +"664abc0f": "packedToEndTime(uint256)", +"664b3350": "createTransfer(address,uint256,bytes)", +"664b885e": "AddNewPrestige(uint256,uint256,uint256)", +"664c7bf7": "ethEurFraction()", +"664d8629": "withdrawAuctionDklBalance()", +"664dcb93": "getMHTTotalSupply()", +"664dd24f": "getUserTransactionIndexes(address)", +"664e9704": "RATE()", +"664eb12e": "updateCompanyPrice(uint256,uint256)", +"664f4904": "sealMinter(bytes32)", +"66505d1d": "BitcoinisDumb()", +"665289d2": "adjustPriceAndOwnerOfPlayerDuringPresale(uint256,address,uint256)", +"66533014": "supportMessage(uint256)", +"6653be1a": "getGameCardId(uint256)", +"665502ec": "ContractToken(address,string,string,uint256)", +"66550624": "CityLifePlusToken()", +"66552e15": "addVestingForBeneficiaries(address[],uint256[])", +"6655d7dd": "RedeemTokens(uint256)", +"6655ff3d": "WebsiteHostingToken()", +"66566947": "associateWithTeam(bytes32)", +"66566abd": "multSender(address[],uint256[])", +"66576514": "mintDRSCoin()", +"665788f8": "firstCrowdSaleDate()", +"6657b2c0": "reloadTickets(uint256,uint256)", +"665814d8": "_presaleStartTimestamp()", +"6658238c": "Peculium()", +"6658357e": "setCINTokenAddress(address,address)", +"665851bb": "wangxihaoToken(address,address)", +"66587cf6": "MIRT()", +"665905c6": "manuallyResetGame()", +"665939cc": "setupFundingRate(uint256)", +"6659889d": "setPromoWallet(address)", +"66599a40": "setEtherPriceInPoundPences(uint32)", +"665a11ca": "liquidityPool()", +"665a6ab0": "calcBurntFees()", +"665b0d5b": "_taskError(string)", +"665b1bc0": "_mint(string,uint256)", +"665b51ce": "getusedAPI()", +"665bcc32": "ProcessGames(uint256[],bool)", +"665beae7": "ExecutableBase(bytes)", +"665c0b8e": "purchaseMembership(address)", +"665ca475": "VUToken()", +"665d8a53": "MAIN_SALE_END_TIME()", +"665de19b": "mutiSendCoinWithDifferentValue(address,address[],uint256[])", +"665df460": "sqrt(int256)", +"665e06ac": "OATToken(address,uint256)", +"665eba29": "playerForceGameEnd(uint256)", +"665f09fa": "addCoinAmount(address,uint32)", +"665f5149": "JOZ()", +"665f9719": "investInfo()", +"665fb66a": "YBToken(uint256,string,uint8,string)", +"66605ba4": "rename(string)", +"66605c47": "GetBuildingData(uint256)", +"6660b210": "kMinStake()", +"6660da77": "addDiscountStruct(bytes32,uint256,uint256[2],uint256[],uint256[],uint256[])", +"6660ead1": "RANGEEND_11()", +"66612f66": "MAX_DAILY_COSIGN_SEND()", +"666192b9": "___upgradeToAndCall(address,bytes)", +"66625bbd": "revokeContract()", +"6662e4be": "isWinningBet(uint256)", +"66634a16": "getAnimalCount()", +"666375e5": "set_allow_contributions(bool)", +"6663bbec": "orderMatch(uint256,uint256,int256,uint256,uint256,address,uint8,bytes,bytes,int256)", +"66648dd3": "setRateIco(uint256)", +"6665e0fd": "tradeActive(address)", +"66663d78": "XPAAssets(uint256,address,address,address)", +"6666490c": "getPlayerSpaceshipBattleLossesById(uint256)", +"66666aa9": "rewardPool()", +"6666d22c": "timeBetweenRounds()", +"66671c30": "FBLFounderFund()", +"66671c71": "BaseScheduler(address,address)", +"66675c57": "updateDecimals(uint256)", +"66679ac7": "interfaceTransfer(address,address,uint256)", +"6668df7f": "subCoinAllowance(address,address,uint256)", +"6668ffc6": "isAuditor(address,address)", +"666923ea": "lastBlock_v15Hash_uint256()", +"6669749f": "HamzaCoin()", +"666a3427": "removeOwnership(address)", +"666afadc": "preparePreContribution(uint256,uint256,uint256)", +"666b7d32": "disableICO()", +"666b9132": "PartialCoin()", +"666be68a": "setIcoTokenSupply(uint256)", +"666c11fa": "getuserdayruns(address)", +"666c7ed0": "WIZE()", +"666cd4bd": "calcId(uint128,address,address,address,address,uint256,uint64,bytes)", +"666cdaa0": "getAnime(uint256)", +"666da64f": "claimShare()", +"666de8d5": "setSecretBonusFactor(uint256)", +"666e1b39": "owner(address)", +"666e587d": "fundICO(uint256,uint8)", +"666efa0a": "walletFees()", +"666f0354": "getMonthRefferals(address)", +"666f4cad": "totalWeiWagered()", +"666f6843": "reservedAddress()", +"666fc4d4": "minimunEthereumToInvest()", +"6670bdd8": "getDOwner(bytes32)", +"66731e95": "LogNewWhitelistUser(address,uint256,uint256)", +"667336d8": "available_without_bonus()", +"66734eb0": "MainController(address,address)", +"66735f4e": "_pickWinner()", +"667390c7": "SendmoneyTransfer(uint256)", +"6673ce2b": "Results_of_the_last_round()", +"6673d5c6": "totalSoldTokenCount()", +"6674bfaf": "closeOption(address[3],uint256[3])", +"6676871d": "reserved_funds()", +"6676aaa2": "MplusCrowdsaleB(address,address)", +"66772438": "computeResponse(uint16)", +"6677cef1": "getCrowdsaleManager()", +"6677febe": "get_all_accepted()", +"667815a2": "getCanSellBalance()", +"6678887f": "replacesOldContract()", +"66792ba1": "send(string)", +"667a2f58": "createDepositAddress()", +"667b39b9": "nameOfToken(uint256)", +"667cb72d": "soldIdeaWeiPreIco()", +"667d5d22": "wager()", +"667ec46c": "getCurrentTierStats()", +"667f1656": "preSaleBotReserve()", +"667f9510": "getBundinha()", +"667fc6b9": "IchigoToken()", +"66801384": "STAGE_2()", +"6680285a": "AuthorizedCreateToPrivate(address,uint256)", +"66802a92": "tokenGenerationState()", +"668038e0": "claimDividends()", +"66805de5": "closePool()", +"6680624e": "gasPriceMaximum()", +"66816e2a": "setBaseStrength(uint256)", +"6681b9fd": "fundsRaised()", +"66829b16": "changeToken(address)", +"6682eaf1": "setsecure(uint256)", +"6683381b": "setDiscountToken(address,uint256,uint256)", +"66836acf": "updateBlock(uint256,uint256,bytes32,bytes32,bytes32,bytes32)", +"6683ee49": "BlockPlanet()", +"6683f9ae": "isSettling(bytes32)", +"6684ffcd": "burnerSet()", +"66855dcc": "removeInt256s(bytes32[])", +"6686e174": "tokensReleasedAmount()", +"66874cc5": "brokers(address)", +"66875554": "resumeTokenSale()", +"66875a31": "FOUNDER_TWO()", +"668767bd": "transferFromForExchange(address,address,uint256,string)", +"6687aa35": "onExecuteAffirmation(address,uint256)", +"6688e305": "EIP20(uint256,string,uint8,string)", +"66894d76": "releaseThreeHotHourTokens(address)", +"6689e28b": "distribution(uint8,address[],uint256[],uint256[])", +"668a0f02": "latestRound()", +"668a2001": "removeParticipant(address)", +"668a2f67": "boom(address)", +"668aa824": "oraclePrice()", +"668abff7": "lastRoundLengthUpdateStartBlock()", +"668ad45f": "MyToken(uint256,string,uint8,string,string)", +"668b1b7e": "AOCTrader()", +"668bd511": "BithelloToken()", +"668c1a46": "refundBNBContributor()", +"668c8573": "DATING()", +"668cc7d8": "registerContest()", +"668cf93d": "LOSER_LOCK_TIME()", +"668d5f48": "addBrick(uint256,string,string,uint32,string,bytes32[],uint256)", +"668e0f6a": "addEntry(string,string,string,string,address)", +"668e157f": "StandardQuickConverter()", +"668eef5b": "test_2_method()", +"668faae8": "CollectibleIndex3()", +"668fde45": "advSend(address,uint256,bytes)", +"66901c5b": "clearTimeMap()", +"66901efb": "getOwnerInfoByIndex(uint256)", +"66905ba0": "overwrite(string,string)", +"66907d13": "setNextOrderId(uint80)", +"6690864e": "setTeamAddress(address)", +"6690f30b": "set_Name(string)", +"66914614": "getJackpotTotalValue()", +"6691461a": "updateTokenAddress(address)", +"6693b694": "unfreezeSupply()", +"669459a7": "removeRegistryFromOwnerIndex(address)", +"66949b56": "endMatch(uint256,int256,int256)", +"6694e845": "numRewardedAxies(address,bool)", +"669529df": "removeFromWhitelistMultiple(address[])", +"669541d6": "setGasCost(uint128)", +"66957377": "batman()", +"669585a4": "_figthExecutor(address)", +"6695b592": "stemPriceInWei()", +"6695f930": "calculateAndSetRate(uint256)", +"6696ca51": "forceBurnFrom(address,uint256)", +"66971c8a": "setCurrentFundingRound(uint256)", +"66973129": "PHEPToken()", +"6697aa84": "getRequiredMinor()", +"6698baaa": "STAGE_TWO_TIME_END()", +"6698f141": "releaseTeamTokensAfter18Months()", +"6699d9cd": "Securities_2()", +"6699e4c7": "isReadyForClose(uint256)", +"669a55ec": "initialPrizeBov()", +"669a828b": "getProgramsValue()", +"669b7e69": "getBlockAddressCount(uint256)", +"669cab39": "cancelBetByOwner(uint256)", +"669d8dff": "AddorModifyRig(uint256,uint256,uint256,uint256)", +"669dafe8": "toWei(uint256)", +"669e48aa": "get(uint256,uint256)", +"669e6684": "_rebalanceTree(bytes32)", +"669eb768": "registerDonation(uint32)", +"669ee827": "RegisterDevice()", +"669ef86d": "getPriceByDayIndex(uint256)", +"669f6d80": "bountyRewardPercent()", +"66a03098": "receivedFrom(address)", +"66a0b81e": "safeMode(bytes4,bytes1,address)", +"66a11615": "revokeMintingManager(address)", +"66a192c6": "CurrentRate()", +"66a200ba": "TokenDemo(uint256,string,uint8,string,address,address,address,address)", +"66a23c01": "ETOKEN2()", +"66a26419": "cancel(address,uint256,address,address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)", +"66a39350": "FAIL_FLAG()", +"66a3de2a": "_safeTransferFrom(address,address,uint256,bytes)", +"66a4b6c0": "usdDecimals()", +"66a51d1d": "UcCoinMinimumSellingChanged(uint256,uint256)", +"66a659b3": "readcolorXteam()", +"66a65c99": "getLegacyCount()", +"66a6cf1a": "mateWithAuto(uint256,uint256,uint8,bytes)", +"66a78b40": "depositAgent(uint256,uint256,string,string,uint256)", +"66a78e6c": "maxReward()", +"66a857f4": "ChangeTokenSymbol(address)", +"66a8c45b": "StarmidFunc()", +"66a908a5": "foundersTokensUnlockTime()", +"66a9234c": "addPhase(uint256,uint256,uint256)", +"66a92cda": "releaseOnce()", +"66a9bc0d": "teamTokenVesting()", +"66aa01ca": "permittedAddresses(address)", +"66aa56c5": "initiate()", +"66aa6f26": "payFee(bytes)", +"66aa9aff": "adminDeposit()", +"66aac9e4": "TPLusToken()", +"66ab4e5f": "Grid(uint256,uint256,uint256)", +"66ab5290": "transferSgaToSgnHolder(address,uint256)", +"66ac1c36": "stageFokenUsdPrice(uint16)", +"66ac777e": "rotate_right(uint32,uint32)", +"66ac8075": "payoutPrizes(address[])", +"66ad3ffc": "building(uint256)", +"66ad484c": "newfirst_player(address)", +"66adeb3a": "SmartToken()", +"66adeb8c": "transferBalance()", +"66adf835": "_setup(address,address,uint256,bool)", +"66adfbbd": "sgc(uint256)", +"66ae924b": "toUint16Throw()", +"66ae935f": "balanceEqual(address,uint256,string)", +"66aecfa7": "bankToCharm(string,uint256)", +"66aee0fc": "investorsProfit()", +"66aef95b": "increaseTimeIfBidBeforeEnd()", +"66af3914": "getTradeIsOpen()", +"66af77ca": "totalMarks()", +"66b005ee": "QueryUnlockTime(address)", +"66b0a536": "MomaCoin()", +"66b10f70": "learnMove(uint256,uint256)", +"66b3e4b9": "stageMarketing()", +"66b3f6bf": "invested(address)", +"66b3fe66": "setTimeScale(uint256)", +"66b42dcb": "register(address,string,uint256,string)", +"66b43da5": "computeSha3(uint256[8])", +"66b46149": "fstring(string)", +"66b464de": "goldBoxPrice()", +"66b4ad74": "KudanilToken()", +"66b52b93": "addMeByRC()", +"66b567da": "getNumMyHatchingUnits()", +"66b5e2d8": "getCountMembers()", +"66b625d4": "bountiesAllocAddress()", +"66b62bde": "isSetTeamWallet()", +"66b668de": "RFUDToken()", +"66b68516": "Finalized(address,uint256)", +"66b728d5": "getVoteOptionId(uint256,string)", +"66b7afbf": "init_level()", +"66b7d5c6": "receivedWais()", +"66b847e5": "assertQuantity(uint256)", +"66ba2670": "setOriginalPriceGen0()", +"66ba707f": "ConsultaRegistro(string)", +"66bab099": "getCurrentSupplyVote()", +"66badf4b": "BITCOINGAM()", +"66bb28be": "_transferMultiple(address,address[],uint256[])", +"66bb83b6": "batchlimits()", +"66bc0d6d": "withdrawFundsAndStartToken()", +"66bcc860": "TransferSiteReg(address,uint256)", +"66bd6ff6": "DecentralizedExchangeHotPotato()", +"66bd78fd": "getBalanceContract()", +"66be24ba": "blockUntil()", +"66bea821": "sendSupplyTokens(address,uint256)", +"66c0276e": "CryptonewsIndonesia(uint256,uint256)", +"66c0e5e0": "revealPhaseMinSecondsWaitForReveals()", +"66c14e0a": "dropCount()", +"66c2355c": "requestNameChange(string,string)", +"66c2aa0e": "getStackholderTransactionCount(bool,bool)", +"66c2ae95": "setHgtRates(uint256,uint256,uint256,uint256,uint256,uint256)", +"66c2d620": "getTot(uint256)", +"66c2d6a0": "BettingToken()", +"66c313c6": "ETHER_THRESHOLD()", +"66c31f12": "emitUserBinded(uint256,address,bool)", +"66c376a1": "setResult(uint32,int8,int8)", +"66c42517": "refundToken(bytes8,address,uint256)", +"66c49da5": "viewThirdBatchOfClauses()", +"66c5c4a0": "unfreezeAll()", +"66c5cdf8": "updateTotal(uint256)", +"66c618d4": "sameWhiteList(address,address)", +"66c630bc": "honourWhitelistEnd()", +"66c71952": "setDiscountPercent(uint256,uint256)", +"66c76592": "_raffleDraw()", +"66c7d1ed": "RozelCoin(uint256,string,string)", +"66c7fb77": "generateDeed(string,bytes)", +"66c82de8": "ContributorPool(address,uint256,int256,uint256,int256)", +"66c89a13": "getAssetEmmiter(uint256)", +"66c91053": "doubleTransfer(address,address,address,uint256,uint256)", +"66c99139": "trans(uint256)", +"66c9bc38": "etherExchangeLikeCoin()", +"66c9d697": "executeVerdict(bool)", +"66ca2bc0": "sendSignal(bytes32)", +"66cab1f3": "isSponsorshipRefunded(address,uint256)", +"66cab95c": "isDeployer()", +"66cc6064": "getPayout(uint256,uint256,uint256)", +"66cd0663": "setCrowdsaleFinished()", +"66ce10b7": "publicKeyVerify(uint256,uint256,uint256)", +"66ce3bd2": "walletBalanceOf(address)", +"66ce5c52": "minWeiToPurchase()", +"66cf058a": "endIcoSaleRound2()", +"66d003ac": "recipient()", +"66d0c603": "addExternalContributor(address)", +"66d10688": "getBoughtTicketCount()", +"66d11c1a": "ContractAddress()", +"66d12fad": "getStakeInOutcome(bytes32)", +"66d16cc3": "profit()", +"66d1cac9": "updatePost(uint256,string,string)", +"66d29324": "defrosting()", +"66d2da12": "setUser(address,address,string,string,bytes32,uint256,uint256,uint256[],string,string)", +"66d38203": "setup(address)", +"66d39035": "getContribution(bytes32,bytes32)", +"66d42b3f": "Betting(uint256,uint256)", +"66d49bab": "updateTotalSupply(uint256)", +"66d598f0": "E18()", +"66d5c8ed": "node_left_child(uint256)", +"66d5eb9b": "openZoneShop(bytes2)", +"66d76bb2": "rateETH_ROK()", +"66d7ffde": "left24(uint256)", +"66d8c463": "reveal(bytes32,string)", +"66d8d040": "dividendsRightsFixUpdate_(address,address,uint256)", +"66dacc48": "afterFirstRefundRoundFundsReleaseDenominator()", +"66db11e7": "nodeExists(bytes32,bytes32)", +"66db2a59": "competitorPAY(uint256)", +"66dc860a": "getBreedingFee(uint40,uint40)", +"66dd3bc0": "terminateAccount()", +"66de5a4f": "createWorkerPool(string,uint256,uint256,uint256)", +"66de6fa4": "isReachedLimit()", +"66de84ec": "withdrawBonus()", +"66df8fe6": "secondStageTotalSupply()", +"66e13d36": "stakeForWithLockup(address,address,uint256,bytes)", +"66e144f9": "Futurescoin()", +"66e159b8": "CreatedNIMFA(address,uint256)", +"66e16aff": "mdbToken()", +"66e1aa99": "assignCertificate(address,string,string,string,string)", +"66e1cebd": "getStakingGains(uint256)", +"66e20b51": "crowdsourcers()", +"66e20e77": "priceNumerator()", +"66e23276": "ADVISERS_SUPPLY()", +"66e264be": "p2Of(uint256)", +"66e305fd": "isEligible(address)", +"66e34dc6": "registerUsername(bytes32)", +"66e3c230": "callLibSet2(uint256)", +"66e3cb68": "upgradedFrom(address)", +"66e3e5e4": "contractTokenBalance(address)", +"66e41cb7": "test2()", +"66e41cd7": "GetTime(uint8)", +"66e4f8c8": "getLastSpinOutput(address)", +"66e5cb50": "stopTransfer(uint256)", +"66e61a31": "outProjectBinding(uint256,address,address)", +"66e65eb1": "checkLocked(address,uint256)", +"66e6c8af": "authorise(address)", +"66e7107e": "SCARABToken()", +"66e722b0": "SecurityToken(string,string,uint256,uint8,address,uint256,uint256,uint8,address,address,address)", +"66e72baa": "transferWithLock(address,uint256,uint256,uint32)", +"66e7ea0f": "incBalance(address,uint256)", +"66e84652": "resetContribution()", +"66e8a4d7": "testGetBonus()", +"66e8cd81": "allBalances(address,address[])", +"66e98c31": "createCoin(string,uint256,uint256,string,string,address)", +"66e99a11": "lxhcoin4()", +"66e9b336": "removeReturnableToken(address)", +"66eb463f": "changeRootAdmin(address)", +"66eb50b2": "startLeaderboard(uint64,uint64,uint64)", +"66eba165": "PlaceBuy(address,address,uint256,uint256,uint256)", +"66ec60c7": "getFineLevelOfUsername(string)", +"66ecc9e2": "require_limited_change(uint256)", +"66eccfbf": "token_batchTransfer(address,address[],uint256[])", +"66ecded4": "setRelativeAddress(address)", +"66eec532": "getSellerFullInfo(address)", +"66f0a3f6": "getTokenRemain()", +"66f1e438": "getMiniPoolEdit_7()", +"66f2d859": "setSellRatio(uint256)", +"66f36b34": "Birth(uint256,string,address,bytes32)", +"66f3882f": "setIcoPhase(uint256,uint256)", +"66f3a2b8": "totalPreBuyers()", +"66f4e1c7": "MAX_GRANTEE_TOKENS_ALLOWED()", +"66f516fe": "changeTimeAndMax(uint256,uint256)", +"66f5f332": "Log1_fnc(address,bytes32,uint256,string,string,uint256,bytes1,uint256)", +"66f7d730": "WithdrawalEnabled()", +"66f7d9da": "accumulatedHours()", +"66f83e91": "getRandom(address)", +"66f84d30": "setParent(uint256,string)", +"66f8bbe0": "DMarketToken(address,uint256,uint256,uint256,uint256)", +"66f8e86f": "MLQD()", +"66f928d3": "updateShareRuleGroup(uint256,uint256,uint256,uint256,uint256)", +"66f9785a": "EtherShuffle(address[])", +"66f99a11": "setOpenValueGasLimit(uint256)", +"66f9c99e": "setUpgradeAddress(address)", +"66fa2be9": "tickets(bytes4,uint256)", +"66fa6efb": "unverify(address,address)", +"66fb3831": "VALUEBACK()", +"66fbc154": "earlier()", +"66fc0dd7": "walletTeamAdvisors()", +"66fc6937": "lastCharge(address)", +"66fcf285": "distributeMulti(address[],uint256[])", +"66fd3cd8": "commit(bytes)", +"66fd555f": "Comission(address,bytes32,uint256)", +"66fda50b": "removeOracles(uint256,address[])", +"66fe16e9": "emitIssued(address,uint256)", +"66fe25a0": "IcoEndDate()", +"66fe513a": "free_supply()", +"66fe825a": "Gruptecoin()", +"66fea1d4": "setRandomSeed(uint256)", +"66ff8201": "GetChipNum(address,uint32)", +"66ffebb8": "changeHolderPercentage(uint256)", +"67013719": "enableControl(bool)", +"67016c14": "issueTokensToBuyer(uint256)", +"6702416e": "addDoctorTo(address,string,string,string,uint8,uint8,uint8,uint8,uint8,uint8,uint32,uint32)", +"67025dcf": "transferAll(address,uint256[])", +"670396e7": "CashToken()", +"6703c429": "ETCReturn(address,uint256)", +"67043001": "isEIP20Token()", +"67043cae": "registerOffChainDonation(address,uint256,uint256,string,bytes32)", +"67061a55": "teamSharePercent()", +"67069544": "issueAssetToAddress(bytes32,uint256,string,string,uint8,bool,address)", +"67069916": "OwnershipTransferCanceled()", +"670733b5": "setBitwordsWithdrawlAddress(address)", +"670744cf": "_createCobeFriend(uint256,uint256,uint256,uint256,address)", +"6707b8aa": "BestEtherSupply()", +"67080f6e": "testThrowsSetEnforceRevisionsNotOwner()", +"67084eb3": "houseBalance()", +"67085633": "getMyGenes()", +"67085dab": "bnCheck()", +"6708cc63": "becomeKing()", +"6708f91d": "Rurchase(address,uint256,uint256)", +"6709b337": "Token(string,string,uint256,bool,bool,string,string,uint256,uint256,uint256,bool)", +"670a1e6f": "getEligibleAmount(address,uint256)", +"670be445": "initialEPXSupply()", +"670c00d0": "getMotPrice(bytes32)", +"670c1500": "CoinCool()", +"670c314e": "TimeFinish()", +"670c3ac2": "priceUpdateTimeline()", +"670c5370": "addCandidateByIndex(uint256,address,string,string)", +"670c884e": "setup(address,uint256,uint256,uint256,address)", +"670ca672": "NTVToken()", +"670d14b2": "keys(address)", +"670da6f8": "getOwnerPetCount(address)", +"670e2e7f": "DatumGenesisToken()", +"670e64c8": "setWhitelistingAgent(address,address,bool)", +"670eedba": "strConcat(string,string,string,string,string,string,string)", +"670f4bd4": "releaseDivTokens()", +"670f8755": "_0xZibitToken()", +"670fe0ff": "TootrTokenSale()", +"6710e801": "_createRabbit(uint256,uint256,uint256,uint256,uint256,address,uint8)", +"6712a67f": "addNodesCache(address[],bytes32[],bytes32[],bytes32[])", +"6712e0be": "tokenGenerationMin()", +"67130e8c": "getWeiOwed(address)", +"6713263d": "crowdsaleTokens()", +"6713640d": "TierStarterDividendAddress(address)", +"6713e230": "isTrusted(address,address)", +"67141690": "getEnabledTokensInformation()", +"67141732": "createContractCity(string)", +"6714cfe2": "GetLuckyGamblers(uint256)", +"6714e027": "deal(uint256[3],uint256,bytes32,bytes32,uint8)", +"671528d4": "isCapped()", +"6716a692": "setDVIP(address)", +"6718484f": "create(uint256,address,string,string)", +"67194bee": "AirdropClaim()", +"67198207": "EARLY_CONTRIBUTION_DURATION()", +"671baae3": "Sepp(uint256,string,uint8,string)", +"671bd594": "setBigPrice(uint256)", +"671bdc3d": "PrimebankCoin(uint256,address)", +"671c7d68": "test02()", +"671d3315": "bookAfternoonVisit(uint256)", +"671d6429": "setTreasurer(address)", +"671dacdc": "CalculateSqrt(uint256)", +"671de554": "mintPreICO(address,address,uint256,uint256,uint256)", +"671e4405": "isFinalize()", +"671ec66c": "setDomainOwner(bytes32,address)", +"671fa0a0": "Inscription(string)", +"67202d40": "fetchAllVotersByIndex(uint256)", +"6720ceb1": "sendPayment()", +"6721ebe2": "airdropThroughput()", +"67220fd7": "adminClaimAirdropMultiple(address[],uint256)", +"67221df0": "isPendingA(address)", +"672324ac": "cashInRate()", +"672350bd": "getFreeExtension(bytes32)", +"6723c20d": "testTrip(uint256[3])", +"6723eab5": "batchCreateETHCardAsset(uint8[],uint256[],uint256[],uint256[],address[])", +"67243482": "airdrop(address[],uint256[])", +"67249254": "mintWithLock(address,uint256,uint256,uint256)", +"672566a0": "Upgradeable()", +"6725bed6": "CCH_RE_2()", +"67268bbc": "removeTransfer(uint256)", +"67272999": "claimETH()", +"672781ed": "priceClaim()", +"6727cc2d": "removeWhiteListAddress(address[])", +"67286a83": "getGoldStatusAuditcount(address)", +"6728b711": "RealAssetToken()", +"672acef0": "participantCapTier2()", +"672c8dca": "ownerTakesAllNotClaimedFunds()", +"672ce152": "HodlBox(uint256)", +"672d2921": "zasxzasxqaq()", +"672e06d0": "withdrawForOneYear()", +"672e20fe": "allocateRemainingTokens(address)", +"672f412c": "setAllowDisbursePaymentWhenPaused(bool)", +"672fcd82": "createBet(uint256,bool)", +"67301dde": "IWWEE()", +"67316b3f": "addWhiteListAddress(address[])", +"67337d1a": "ReporterTokenSale()", +"673441db": "TokenAltPurchase(address,address,uint256,uint256,uint256,string,string)", +"673448dd": "isApproved(address)", +"673478c3": "getAssetIdOwnerIndex(uint256)", +"6735a1cc": "previousStage()", +"67374f3a": "setTargetWallet(address)", +"673756d8": "SOFT_CAP_EUR()", +"6737c877": "setAttributes(bytes)", +"6738426c": "enablesTransfers()", +"67387d6b": "testThrowCreateWithNonceExistingNonce()", +"67389944": "voteB(uint256)", +"67389d17": "SuppliedTo(address,uint256)", +"6739afca": "network()", +"6739f3a4": "getAuctionDuration(uint256)", +"6739fc52": "testOrd()", +"673a2a1f": "getPools()", +"673a456b": "setNumActiveTranscoders(uint256)", +"673a5ae3": "Sale(address,address,uint256,string,uint8,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"673a7e28": "updatePrice()", +"673b57e9": "deauthorizeProvider(address)", +"673c0e53": "readAllFrzAcc()", +"673cd98e": "total_amount()", +"673df0e0": "horseMaster()", +"673f3807": "sell(uint256,uint8)", +"673fa8c9": "APaymentToken(uint256)", +"674106d8": "checkDragon(uint256)", +"67412045": "balanceOf(address,uint8)", +"6741629c": "wasEmergencyCancelled()", +"6741953e": "getPOOL_edit_15()", +"674197f8": "getBuyRequestCount()", +"67426ba4": "callgDistributed()", +"67441f52": "LOOMIA1()", +"6744ea49": "GetEscrowTokenSymbol()", +"67457022": "rmul(uint256,uint256)", +"67460c25": "createWikiPage(string,string,string,uint256)", +"67460d58": "setGate(uint256,uint16)", +"67465daf": "StorageExample()", +"6747830d": "calculateRequiredFillingAmount(uint256)", +"6747a33f": "accrualDeposits()", +"6747f09e": "cashOutFallbackAmount()", +"6748a0c6": "releaseFinalizationDate()", +"6748a106": "powLimit()", +"674942eb": "VOTING_PREPARE_TIMESPAN()", +"6749ec48": "issueLicenseNFT(bytes32)", +"674a1574": "claimedIdeas(address)", +"674a62d0": "coinIssuedMkt()", +"674aaa44": "transferToAnotherAddr(address,address,uint256,bytes32)", +"674b3bd5": "originalArtwork(bytes32,address)", +"674c20a1": "test0_firstInterval()", +"674c5eaf": "setReceiver3(address)", +"674c85a7": "mdiv(uint128,uint128)", +"674cc1f5": "getMarketHashes(bytes32[])", +"674d13c8": "totalReservedSupply()", +"674d4691": "_getWeiValueOfTokens(uint256,bool)", +"674e4e0e": "extendUnlockDate(uint256)", +"674ea3cb": "closeAgreement(bytes,uint8[2],bytes32[2],bytes32[2])", +"674ebb3e": "cancelKimAuction(uint256)", +"674ed066": "minQuorumDivisor()", +"674ef6c3": "initializeTier(uint256,address)", +"674f220f": "previousOwner()", +"6751676f": "recentBuyers(uint256)", +"6751ad3d": "_insertAttackLog(uint256,uint256,uint16,uint32,uint8,uint32,bool)", +"67524d62": "setJackpotThreshold(uint256)", +"67532c8e": "sendPurchase()", +"67535a42": "setEthmainAddress(address,address)", +"6753a3c1": "setMajorEvent(string,string,string)", +"6753fc59": "PurchaseAdmin()", +"67541efa": "AlfaCoin()", +"67546967": "EthBtcEscrow()", +"6754ff3a": "addcrontime(address)", +"67550a35": "vox()", +"67551857": "clearAllRequest()", +"675518b8": "mintAndCreatePreIcoBitex(address,address)", +"67558b3a": "AzlanToken()", +"67561d93": "authorizeContract(address)", +"675629fe": "appendOnly()", +"6756b1ae": "GameTable()", +"67571f68": "handlePayouts_(uint256,uint256,uint256,address,address,address)", +"67578f65": "users(bytes20,uint8)", +"67579ad4": "currentwealth()", +"675879d5": "GrantedOrganization(bool)", +"6758aa3f": "requestApproval(string,string)", +"6759fac0": "CatsToken(address)", +"675a1f0f": "batchAddCandidate(address[],bytes32[])", +"675a4633": "dnaMixer()", +"675a54b9": "getHalvingOf(address)", +"675a690c": "setBleachDailyLimit(uint256)", +"675abc96": "corporateSupply()", +"675ac67a": "escrowCount()", +"675b09cd": "Niobium()", +"675c3048": "getTxTimestampPaymentMCW(bytes32)", +"675c9fcd": "setSecretSignerList(address[])", +"675cc788": "getDiplomaOrganizerById(uint256)", +"675cef14": "etherMinimum()", +"675d43cf": "buyPixel(uint16,uint16,uint24)", +"675d9c35": "XRT()", +"675df16f": "updateSubmissionGasPriceLimit(uint256)", +"675ec1cf": "minimalUSD()", +"675f6537": "settleBet(bytes32)", +"675f6d1e": "callBackVariations()", +"675f818e": "disapproveInvestor(address)", +"675f9ad9": "initStages()", +"6760115a": "BuyerFund()", +"67602c59": "burnSequence()", +"67608d38": "ICO_TOKEN_SOFT_CAP()", +"676095b2": "profit2eggs()", +"67630f43": "buyNapkins()", +"6763150e": "setKyberAddress(address)", +"67636574": "consumed()", +"676391d3": "_removeWhitelister(address)", +"6763da56": "dish(string,address)", +"67642794": "_withdraw(address,uint256,bool)", +"676452f4": "t3tokenExchangeRate()", +"6764765d": "burnMyTokens(uint256)", +"67653f3b": "test_threeInvalidEqUint()", +"6765b49b": "getPunishXPA(address)", +"67669e29": "rocketIsLaunched(uint256)", +"6766d1ba": "getTimeUntilStart()", +"6766fafe": "disableTransferWhitelist()", +"676796b6": "releaseFounderCoins()", +"6767e368": "ValueTrader()", +"67682441": "UserUpdate(address,address)", +"6768893c": "AppHub()", +"6769c20b": "setPicture(address,bytes)", +"6769d1f9": "soldToken()", +"6769eb46": "createMasker()", +"676a38d7": "get_current_price()", +"676a675a": "changeJohanNygrensAddress(address)", +"676aa496": "IbnzEtc20TestToken()", +"676b064e": "allForPopulate(uint256)", +"676b57ad": "getNays(uint256)", +"676c0d77": "updateTokenPrice(uint256)", +"676c902f": "drawNumbers()", +"676cb63d": "getMintingFinished()", +"676cdcd6": "BurnExecuted(uint256,address,uint256)", +"676cfec6": "rocks(uint256)", +"676d1d9c": "WEI_TO_COGS()", +"676d20ba": "WorkerToken(uint256,string,uint8,string)", +"676d23a5": "isChangePriceLocked()", +"676d2e62": "migrationMaster()", +"676d7769": "test_curatorDoesNotVeto()", +"676e2eb1": "_addDemoc(bytes32,address,address,bool)", +"676fc32b": "maximumTokensForThird()", +"67701187": "updateFighter(uint256,uint8,uint8,uint8,uint8,uint32,uint64,uint16,uint64,uint16,uint16)", +"6770260e": "ContributionMade(address,uint256)", +"67707337": "CryptocarToken()", +"6770da62": "_stealCardWithSocialIdentity(uint256,uint256)", +"67716abc": "learnFee()", +"677170e1": "_span(address,address)", +"677342ce": "sqrt(uint256)", +"6773b75f": "propertyIndexToApproved(uint256)", +"6774f8e1": "getMonarchyController()", +"67756fe9": "depositPayment(address)", +"6776ddd0": "currentHodler()", +"6776e56a": "validateProposedKingdomName(string)", +"6777d177": "icostarted()", +"6777e4eb": "dollarMultiplier()", +"677885d3": "BITIFEX()", +"677913e9": "setAmount(int32)", +"677978ec": "increaseTokenCap(uint256)", +"6779da43": "setAwardTokens(bool)", +"677a7444": "Votaciones(bytes32)", +"677a7735": "Shares(bytes32,bytes8,uint256,uint256)", +"677a8870": "TeamWallet()", +"677ab197": "processContribution()", +"677ab667": "INITIAL_STARTTIME()", +"677b1f0d": "_buyTokensFromSystem(uint256)", +"677ba3d3": "onTokenTransfer(address,address,uint256)", +"677bcb89": "regularMinPerPerson()", +"677c102d": "getHostOrders(address,address)", +"677cee54": "SafeConditionalHFTransfer()", +"677e2dc4": "setDailyPrice(uint256)", +"677e2ef2": "getReplyFee(uint256)", +"677e6fa4": "betOnColumn(uint256)", +"677ebf2c": "InvestmentAsset(address,address,address,string,string,uint256,uint256,uint256,address)", +"677f768d": "isOnTrading(uint256)", +"677ffb0d": "exerciseLong(address[2],uint256[8],uint8,bytes32[2])", +"6780a311": "transferStop()", +"6780b32e": "moveAccount(bytes32)", +"67814109": "_mintTimelocked(address,uint256,uint256)", +"6781cc04": "addPolicy(uint8,uint256[],uint8[])", +"678212d9": "tokensAuctioned()", +"67821686": "setETHUSDRate(uint256)", +"67823a4a": "limitDateCrowdWeek2()", +"678365ca": "RHEMA()", +"678377d2": "core(address,uint256,address)", +"67845835": "Irapid()", +"67845daf": "claimTokensERC777(address,address,address,uint256,uint256,bytes,uint8,bytes32,bytes32)", +"67848d9c": "PayEther(address,uint256,uint256)", +"6784b075": "removeValidContract(address)", +"6784ccb7": "Deceum()", +"67854643": "getGenerationMemberLength(uint256)", +"6785744d": "phase1Price()", +"6785a8f6": "getCandidateIndexArray()", +"6785b500": "getChannelsAddresses()", +"67863c07": "earlybird()", +"6786ed0e": "setPriceRate(uint256)", +"6787416d": "NRM()", +"6788317a": "UnitySale(address,bool,uint256,uint256,uint256,uint256,uint256,uint256[])", +"678886b4": "updateTokens2PerEth(uint256)", +"678892c0": "rand_num()", +"67899248": "processKick()", +"678a1013": "monsterNFT()", +"678a6baf": "ROUND_3_PRESALE_BONUS()", +"678a7dca": "setShareFee(uint8)", +"678ae6a1": "updatePools(bytes32,uint256)", +"678bbf24": "getEarningsAmountByGoodsIndex(uint256)", +"678d2204": "shouldFail()", +"678d6eff": "createFuel(uint256)", +"678d9758": "setTile(uint256,string,string,uint256)", +"678dd961": "getProviderClosed(uint256)", +"678ee795": "ComputationService()", +"678f4467": "allocateTokenForTeam(address,uint256)", +"678f7033": "set_percent_reduction(uint256)", +"679019ba": "freezeDeliverMultiStandalone(address[],uint256[],uint256[],uint256,uint256)", +"67907404": "recruitNarco(uint256,string,string)", +"6790d2b5": "getRoomInfo(uint256)", +"6790f3fe": "getAccumulatedDistributionPercentage()", +"67923240": "hatchsubscribers(address)", +"6793c8e1": "currentMilestone(uint256)", +"6793d383": "registryContractAddress()", +"67946ea4": "getIdMax()", +"67955ffa": "maxGIRL()", +"679577a5": "getEmployerFeedbackOn(address,uint256)", +"6795dbcd": "getAddress(bytes32,string)", +"67975213": "AddSWAndClaim(string,string,bytes32,bytes32,bytes32,string,bytes32,bytes32,address,uint32)", +"6797b106": "strikePricePctX10()", +"6799c0e0": "vpe_per_Keos()", +"6799d737": "releaseForEcosystem()", +"679a7a46": "WhoisOwner()", +"679aefce": "getRate()", +"679b4567": "preicoStartDate()", +"679b948b": "switchSplitBonusValue(address,bool)", +"679b9935": "setLeagueRosterContractAddress(address,address)", +"679c0d40": "invariantBroken()", +"679d0ecb": "getMetForEthResult(uint256)", +"679d38e0": "selfdestruct()", +"679dffb4": "getProfit()", +"679e1149": "AcoraidaMonicaWantsToKnowTheNewAnswerHash(bytes32)", +"679e5977": "EventRemoveAdmin(address,address)", +"679ebf1a": "transferTicket(uint256,address)", +"679f4d63": "CEEDCOIN()", +"679f699e": "EOSERC20(uint256,string,string)", +"679fecd6": "refillArray(address[],uint256[])", +"67a09c23": "payment(address,uint256)", +"67a0a550": "_cancelOrderWithMerchant(string,address)", +"67a19b20": "withdrawEthMaker(uint256,address)", +"67a1b7dd": "addTicket(uint256,uint256,uint256)", +"67a1bd55": "withdrawStuck()", +"67a1d653": "YOO_UNIT()", +"67a1f526": "curatorWrite(uint256,bytes32[])", +"67a2072c": "setEtherHolder(address)", +"67a2534b": "test(address[5])", +"67a26cbc": "DuqueBrewingCompany()", +"67a27811": "BonusGranted(address,uint256)", +"67a3eb65": "totalHardCap()", +"67a449b8": "getLastRoundData()", +"67a4e7c4": "isDecentBetToken()", +"67a52fdb": "purchaseGold()", +"67a59d91": "scheduleCall(address,bytes,bytes,uint256,uint256,uint8)", +"67a5cd06": "drip(address)", +"67a6ae62": "TOKEN_RATE_25_PERCENT_BONUS()", +"67a7390d": "fundTransferred()", +"67a7804b": "influenceByToken(uint256)", +"67a884e5": "latestBidder()", +"67a88f78": "createBitcoinAddressPrefixTask(bytes,uint256,int256,uint256,int256,address)", +"67a9c971": "tgrSettingsAmount()", +"67aa23e2": "getTicketsByOwner(address)", +"67aa50ae": "updateBrokerVerifierContract(address)", +"67aa863f": "setXto2()", +"67ab263a": "thisIsTheEnd(address)", +"67ab4381": "UnConf(string,address)", +"67ab5486": "GET_MAX_UINT256()", +"67aba225": "sellableToken()", +"67acd805": "lowerMinWager(uint256)", +"67ae9e8f": "hybridizationList(uint256)", +"67aea7d5": "buffs(uint256,uint8)", +"67af1c81": "getRoundIndex()", +"67af1cff": "ethRec(uint256,uint256)", +"67af26fb": "transferOtherFrom(address,address,address,uint256)", +"67aff484": "setUserRole(address,uint8,bool)", +"67aff919": "autoreleaseInterval()", +"67b07d48": "entangleQuanticCloudIOTData(uint256)", +"67b0e070": "FaceTech()", +"67b14a21": "getProposal(uint16,uint16)", +"67b16407": "buyCup()", +"67b16cd6": "getRealRndMaxTime(uint256)", +"67b172c9": "Bloxxor(address,address,address,uint256,uint256,uint256)", +"67b1f5df": "setExchange(address)", +"67b21506": "claimTokenReserveDevelop()", +"67b220a5": "unblock(address)", +"67b26cab": "getLastMaxInvestments()", +"67b327fa": "proposeMilestones(bytes)", +"67b40639": "Dain()", +"67b50af9": "gasAmount()", +"67b5496a": "loseWager(uint256)", +"67b55bf9": "getClickMetadata(uint256)", +"67b65656": "setStateStartTime(bytes32,uint256)", +"67b78d00": "fromHexChar(bytes1)", +"67b7a4aa": "START_PRICE_IN_CENTS()", +"67b7c034": "on()", +"67b7d525": "getBlockPointer()", +"67b830ad": "fillOrder(uint256)", +"67b886e8": "left97(uint256)", +"67bb474f": "allowBundling()", +"67bb6d63": "maxWiteList()", +"67bc480e": "MYSTERYCLASSICCOIN()", +"67bd15e3": "contractInitializationTime()", +"67bd69a6": "getLastDuel2()", +"67be0854": "partyHash(address,address,address,address)", +"67be5eac": "claimLeftTokens()", +"67be97a5": "BYToken()", +"67bea493": "whitelistedPools(address)", +"67beaccb": "scheduleCall(bytes)", +"67bfc445": "AddNewChallenge(uint256,uint256,uint256,uint256,uint256,bool,string)", +"67c1fb11": "christmasStocking()", +"67c21fe5": "setFiscalVerify(uint256,bytes32)", +"67c25a14": "TeamCreated(uint256,uint256[])", +"67c281a9": "validateContentHash(address,uint256,bytes32)", +"67c2a360": "authorizeUser(address)", +"67c33c80": "getInt8FromByte(bytes14,uint256)", +"67c353b3": "LKCTotalSupply()", +"67c36757": "IranToken()", +"67c3a6d9": "Khatamor()", +"67c3ad8e": "burnStake(uint256,address)", +"67c3e25e": "revokeAccessDeploy(address,address)", +"67c45872": "ZzStandardToken(uint256,string,uint8,string)", +"67c51be7": "viewTokensSold()", +"67c5d6b1": "multihash(bytes32,string)", +"67c623cf": "getTokenMetaData(uint256)", +"67c6389e": "refreshlockedBalances(address,bool)", +"67c6e39c": "convert(address,uint256)", +"67c7f3a8": "setBwValidCaller(address)", +"67c84919": "issueByPartition(bytes32,address,uint256,bytes)", +"67c9b017": "getEthPrice()", +"67c9d266": "freezeUntil(address,bool)", +"67ca1fdf": "market_communityStorageVault()", +"67ca2298": "updateTokenName(uint256,string)", +"67cab29d": "testGetAbiVersion()", +"67cb103a": "PartnerUrl()", +"67cb61b6": "getChoice()", +"67cb9316": "get_header(uint256)", +"67cc4882": "TokenHolder()", +"67cd3f64": "UNLOCKSTART()", +"67cd5323": "PUBLIC_SALES_SPECIAL_USERS_RATE()", +"67cd64dc": "LENDXCOIN()", +"67cdbe8f": "newShip(uint16,uint256,uint256)", +"67cdc1c2": "percentageToTeamEthContract()", +"67ce38fb": "Vertex_Token(uint256,address)", +"67ce940d": "getOverhead()", +"67cf17c2": "transferPrimordialTokenFrom(address,address,uint256)", +"67cf7d9c": "createTeamTokens()", +"67cf91c9": "lastKickoffDate()", +"67cfdfc9": "getBrokerIncoming(address)", +"67d0661d": "doPause()", +"67d13f27": "receiveFromVendor(address,bytes32)", +"67d15775": "PromToken()", +"67d198cc": "getVaultsRoot()", +"67d22967": "set_iconiq_pre_kyc_bonus_numerator(uint256)", +"67d326ef": "finalizeFundAddress(address)", +"67d3d0ec": "changeEthBalance(address,uint256)", +"67d3eff4": "setTeamWallet(address,address)", +"67d41253": "secondCheckpoint()", +"67d42a8b": "release(bytes32)", +"67d49909": "secondWinnerTimestamp()", +"67d4e98c": "RemoveShare(address,uint256,uint256)", +"67d4f541": "window1TotalSupply()", +"67d520bb": "deployWill(uint256)", +"67d5fae1": "getPremiumCount()", +"67d6bcbf": "distributeBonusTokens(address)", +"67d6d142": "getPI_edit_19()", +"67d96c24": "compensatePreSaleInvestors(address[])", +"67da2831": "revealHiddenPosition(uint32,int64,bytes16)", +"67da299b": "mcrAmmountForGas()", +"67da7b7a": "LabCoin(uint256)", +"67dbaf93": "updateValueAndBurn(uint256,uint256)", +"67dbf587": "Bridge(uint256,uint256,address,address)", +"67dcec06": "WealthInternet(uint256)", +"67dd1730": "destPrecision(address)", +"67dd74ca": "buyTicket(uint256)", +"67dd7bb4": "tradingLocked()", +"67de698d": "adjustCap()", +"67de80db": "createMultiple(uint256[],uint256[],uint256[],address[],uint8[])", +"67de81e8": "fundSucceeded()", +"67deced2": "checkIn(uint256,string)", +"67df1187": "buysubscribers()", +"67df5189": "archiveCrowdsale(uint256)", +"67dfe2d3": "addEthForSell()", +"67e04a22": "initInviteAddr(address,uint256)", +"67e06858": "Add()", +"67e0badb": "getNum()", +"67e0d78f": "sendFundHomeAmt(uint256)", +"67e13ee0": "getDeveloper(address)", +"67e1aee9": "setStage1()", +"67e1c253": "getMyInviteCode()", +"67e22888": "bigMoney()", +"67e2a647": "createAwardTokens()", +"67e2d2ad": "wireInvestment(address,uint256,uint256)", +"67e33df5": "SwftCoin(uint256,string,uint8,string)", +"67e404ce": "sender()", +"67e4373f": "CARIToken()", +"67e43e43": "gsf()", +"67e445d9": "FOMO()", +"67e476d7": "getPublicSaleInfo(address)", +"67e4ac2c": "getAssets()", +"67e4d41d": "ProdAToken()", +"67e523bb": "iPeso()", +"67e53196": "getAuthByCode(string)", +"67e54367": "battleContractAddress()", +"67e5f18c": "getCurrentTierRatePercentage()", +"67e6869d": "Withdraw_4()", +"67e6bc2e": "hash(string,uint256,uint256,uint256)", +"67e6bf06": "testPresaleRefund()", +"67e70e99": "setselfrdroplist(address[])", +"67e7646f": "removeDelegate(address)", +"67e817f4": "XOV()", +"67e828bf": "source()", +"67e874c0": "testMeta(uint256)", +"67e8cd0f": "bidOf(bytes32,uint256)", +"67e8d3d2": "bonus2()", +"67e8f6e1": "_multipleTransfer(address,address[],uint256[])", +"67e8f90c": "heightAt(uint256)", +"67e902c7": "right92(uint256)", +"67e902d9": "ListingBought(uint256,uint256,uint256,address)", +"67e933f6": "checkCustomer(address,address)", +"67e94ae0": "listingFeeInWei()", +"67e988e7": "bountyAvailabilityTime()", +"67e9b860": "CreateSwap(uint256,uint256,bool,address)", +"67ea2fa0": "tasksSize()", +"67ea43bd": "producedBronzeCaps()", +"67eae672": "sendCoinFrom(address,uint256,address)", +"67eb5fbe": "_train(uint256,uint256,uint256,uint256)", +"67eb9bab": "createIssuerContract(string,string,string,uint256,uint256)", +"67ec00c0": "depositFrom(string,address,uint256)", +"67ec68c4": "winningNumbersFor(uint256)", +"67ecb82d": "transferAndLock(address,uint256,uint256,uint256,uint256)", +"67eccc12": "founderTokenWithdrawnPhase2()", +"67ed583f": "addPresaleHolder(address)", +"67edad0a": "preSaleSecondEtherCap()", +"67ee5f09": "getTotalDividends()", +"67eeba0c": "dailyLimit()", +"67ef5a37": "debugStuff()", +"67ef5cb9": "setPrice(uint32,uint32)", +"67efbab1": "changeAssignedAdmin(address,uint256,string)", +"67f01c04": "ETH(uint256)", +"67f04688": "LIMIT_TRANSFERS_PERIOD()", +"67f06f78": "_checkPixelAboveRight(uint256)", +"67f12ecf": "validate(address,uint256,uint256[101][])", +"67f17405": "majorEvent(bytes32,bytes,uint256)", +"67f239dd": "entry()", +"67f4224f": "eventPause(bool)", +"67f690b5": "hasRequestedForMigration()", +"67f6a258": "verifyCert(bytes32,bytes32,address)", +"67f718a9": "getTokenIds()", +"67f76863": "EnishiCoin(address[])", +"67f809e9": "DynamicPyramid()", +"67f83481": "isFounderUser()", +"67f8a8b8": "emergencyRefund(address,uint256)", +"67f8ca42": "usingCanvasBoundaries()", +"67f8df84": "playerId(uint256)", +"67fad28d": "RCLTOKEN(uint256,string,string)", +"67fbb7ba": "ownerAddSanSlotBatch(address[],uint256[])", +"67fbd289": "destroyTokens(uint256)", +"67fc1c6a": "validateProposedMonarchName(string)", +"67fd9da3": "multicastTransfer(address[],uint256[],uint256[])", +"67fdc2fe": "CricketToken()", +"67fdd509": "setIdRange(uint256,uint256)", +"67fdff26": "REQUIRED()", +"67fe5a0c": "accepted()", +"67fe6b47": "contractIsCompleted(string)", +"67fe6f0e": "checkOverExceed(address)", +"68014cec": "participantExists(address)", +"68019d75": "COCTokenBase(uint256,string,string,uint8)", +"6801db98": "devoteToCar(string)", +"6802c8a1": "FreeCoin()", +"6802ff77": "seedSupply_()", +"6803641c": "claimAllTokensForInvestor(address)", +"680478b1": "offerAsSacrifice(address)", +"68049361": "teamWallet_4()", +"6805b84b": "getPaused()", +"680660d4": "bulkAddCompany(address[],uint256[])", +"6806fdce": "assignGenesisAddresses(address[])", +"6807b84d": "Timebound(uint256,uint256,bytes32)", +"6807f752": "deleteBuyRequestInternal(uint256)", +"680819eb": "setRate(bytes32,uint256)", +"680a50cb": "shortenDeadline(uint256)", +"680add7b": "preSoldSharesDistributed()", +"680b0c5c": "tresholds(uint256)", +"680b3bdf": "migrateAll(address[])", +"680b5eba": "setHouseAddressTwo(address)", +"680b9d49": "getStakedAddresses()", +"680bd2f4": "RiseCoinToken()", +"680c26bc": "ATP(address,address)", +"680caed2": "Contract(address)", +"680def61": "market2019TokenCreated()", +"680e354a": "setSaleWindow(uint256,uint256)", +"680e6c9b": "receiveTokens()", +"680eba27": "GEN0_CREATION_LIMIT()", +"680f07b4": "getinitializeFeeWindowIdValue()", +"680f0938": "pay_dividend(string)", +"680f0eda": "set_harvest_amount(uint256)", +"680fb685": "OpenClose(bool)", +"6810e139": "shopSack()", +"68111cce": "getProduct(string)", +"6811444a": "getLastComment(address)", +"68116177": "getbalance(address)", +"681185ab": "_extractRawResource(address,uint256,bytes)", +"68118e95": "numberOfBlocksToEndLimitationPeriod()", +"6811c332": "distributeTeamTokens(address,uint256)", +"681232ad": "cosigner()", +"68125a1b": "isFriend(address)", +"681312f5": "setRoundLength(uint256)", +"6813947f": "contributionOf(uint256,address)", +"681478ab": "LegacyRepToken(address,uint256,address)", +"68155ec1": "transferTokens(address,address,address,uint256)", +"6815c19c": "DropdCoin()", +"6815c992": "grantPermissionP(address,address,bytes32,uint256[])", +"681617c7": "changeEscapeCaller(address)", +"68163034": "defaultTimeoutLength()", +"6816521a": "teamAllocation()", +"6816d920": "guaranteedBuyersLimit()", +"6816fcd6": "evMgmtDistributed(address,uint256,uint256,bool)", +"6817031b": "setVault(address)", +"68171516": "assetMethodIsAllowed(address,bytes4)", +"68173bcf": "deactivateToken(address)", +"68177733": "MixinToken()", +"6817c76c": "mintPrice()", +"681833d9": "bindAddr(address,bytes)", +"6818da44": "setPlatformManager(address)", +"68197360": "getVotes(uint256,address)", +"681b23dd": "senderETH()", +"681b3314": "get_pre_kyc_iconiq_bonus_numerator()", +"681b5651": "setEthToUSDRate(uint256)", +"681b742f": "changeFund(address)", +"681c2ad0": "getTknOfferPrice(uint256)", +"681c3251": "addTotalSuply(uint256)", +"681c7808": "setMinTime(uint40)", +"681c7e2b": "VAAToken()", +"681cb449": "VIcoin()", +"681ce98a": "getNextPrice()", +"681d52de": "tokenImporter()", +"681d8345": "getATMTotalSupply()", +"681e237d": "CommonToken()", +"681e3356": "transferBankOwnership(address)", +"681f01f2": "IsICOOver()", +"681f3e6d": "getUsername()", +"681f6486": "SimpleBid(address,uint256,uint256)", +"681f8116": "makeTradeable(uint8)", +"681fd129": "addInvestContract(address)", +"681fe70c": "isEmpty()", +"68203417": "thirdStage()", +"6820f8d2": "setOneContract(uint256)", +"68213256": "crr()", +"68216ca7": "addNewBranchInEpisode(uint256,uint256)", +"6821928b": "AddAuthority(address)", +"6822abae": "getMinimumCallCost(uint256)", +"68234a27": "getTransactionDescription(uint256)", +"68240412": "calculateWeiForStage(int256)", +"68250963": "preICODeadline()", +"682594db": "totalAllowedFreeze()", +"68259880": "ChangeOfRules(uint256,uint256,address)", +"6825c843": "_address(uint256)", +"682677e8": "TunDrMahathirMohammad()", +"6826ebf8": "r(bytes)", +"6827b9db": "getMonsterGender()", +"6827e764": "devFee()", +"682806a0": "ICOContract()", +"68281708": "restrict(address)", +"68283f4d": "claimBets()", +"6828d549": "rejectContribution(bytes32)", +"68296073": "setSnowflakeAddress(address,address)", +"682a5e89": "returnDuration(uint256)", +"682a90d2": "Store(bool,uint256)", +"682a9449": "setCustomerService(address,address,bool)", +"682ab756": "LogItemRegistered(address,uint256,uint256,bytes32,bytes32,bytes32)", +"682b6706": "___Kill()", +"682b7100": "deleteRoom(uint256)", +"682baa3a": "HATCH_COOLDOWN()", +"682bc77e": "setStarterPackOnSale(bool)", +"682bea5c": "setCallTable(uint256,uint256)", +"682d1138": "failExecute()", +"682d3bb0": "pdfCertificateProof(bytes)", +"682e1bb0": "isSTOProposed()", +"682e60a9": "presses()", +"682ed9ea": "sanMaxAmount()", +"682f3d36": "OrderMatch(address,int256,address,int256,uint256,uint256)", +"68302467": "paySeller(uint256)", +"68306e43": "dividends(address)", +"6830cdc4": "getJobCount(address)", +"6831c169": "totalPayedOut()", +"6831e272": "mintTokens(address,uint256,uint256)", +"683328bf": "takePet(uint64)", +"6833716f": "ProofShrimpFarmer(address)", +"6833d54f": "contains(string)", +"6833f60d": "triggerPause()", +"68342b33": "ownerInfoOf(uint256)", +"683431e2": "SelfDesctruction()", +"68347fdf": "ICO_MIN_DEPOSIT()", +"68348dfe": "_newGame(bytes32)", +"6835df3e": "SFT_PER_ETH_BASE_RATE()", +"6835f32c": "build(bytes)", +"68365eb7": "NewProject(address)", +"683674dc": "disconnectOrderUser(address,address,uint256,address)", +"683799e6": "setMaximumPurchaseFraction(uint256)", +"6837ff1e": "newContract(address)", +"68381874": "Trade(address,uint256,address,uint256,address,address,bytes32)", +"68381b96": "getHighestUnitPriceIdxFromSell()", +"68388b80": "banAccounts(address[])", +"6838e7c5": "PrinzeToken()", +"68393a4c": "getBonusByTime(uint256)", +"683a6858": "Recoverable()", +"683ad727": "getDeed(uint256)", +"683b4184": "inflation_complete()", +"683cde49": "upgradeBalanceOf(address)", +"683cecc2": "addressFunc(address)", +"683d4a4b": "minWithdrawalCoolingPeriod()", +"683d69e4": "checkEligibility(bytes32,address,address)", +"683de015": "switchUpgradable(bool)", +"683e0bcd": "ethPriceInUsd()", +"683e2929": "getPSlotLength(address)", +"683e3451": "CioCoinERC20Token(uint256,string,string,uint256)", +"683e70b6": "createWhaleTokens(address,uint256)", +"683f7f27": "removeParticipant(uint256)", +"68402460": "scheduleCall(address,bytes4,uint256,uint256,uint8,uint256)", +"68404cd9": "setValueSome(uint256,uint256)", +"6840721d": "searchReport(string)", +"6840c67d": "vestPartnerEquityReserve()", +"6840f8e8": "returnEth(address,uint256)", +"68412058": "getRank06()", +"68412063": "distributeTokens(address,uint256,uint64,uint64,bool,bool)", +"6841f253": "currentRoundLocked()", +"6841fd27": "remining(uint256)", +"68428a1b": "saleActive()", +"68437b58": "bet_purchased(address)", +"6843aef9": "increaseLockReward(uint256)", +"68445ce1": "insertNodeBefore(uint256,uint256,address)", +"68447a55": "fetchFunds()", +"68447c93": "referrer()", +"6844ab43": "testControlCreateSameItemId()", +"68458fcf": "assignInitialAddresses(address[],address)", +"6845950f": "getScriptActionsCount(bytes)", +"6846187f": "farmItems(address[],uint256[])", +"684641b4": "cumulativeInverse(uint256,uint256,uint256)", +"684649a6": "createProxy()", +"6846fe64": "_sellCallToClose(uint256,uint256,uint256,uint256,address)", +"684876a1": "migratePlayerRoundsData(uint256,uint256,uint256,uint256,uint256)", +"6849cb9d": "transferIssuer(address)", +"684b369e": "everisumToken()", +"684b49f5": "PriIcoSale2(address,uint256,uint256,address,address)", +"684bd9d6": "getRemainCount(address)", +"684d63bf": "mintAuditApproval()", +"684d9a04": "quarterSecond()", +"684e2345": "AishaCoin()", +"684ecd59": "getData_9()", +"684edea8": "ponziPriceInWei()", +"684efc40": "TravelNationCoin(uint256,string,uint8,string)", +"684f19c9": "WorldCupFactory(uint256)", +"684fa447": "AppAdded(address,string,address,uint256,bool)", +"684fbfdb": "sinLimited(int256,int216)", +"68503cdf": "getAvailableBalanceByAddress(address,address)", +"68504158": "toggleTransfers(bool)", +"68507757": "faucetBB0()", +"6850fa6d": "onoff()", +"6853367f": "withdrawDevelopersCut()", +"68533a1d": "closeUndercollaterizedPosition()", +"68536341": "ratePerOneEther()", +"6853920e": "removeRole(address,bytes32)", +"6853e3a4": "setToKnown(address)", +"685485fb": "eth_sent()", +"6854df55": "scannedDiamondCaps()", +"6854f668": "buyDragoOnBehalf(address)", +"6855ded3": "WHITELIST_END_DATE()", +"685705ae": "getWeiValue()", +"68573107": "batchMint(address[],uint256[])", +"6857ab40": "seq()", +"6857cb06": "manualTransfer(address,uint256)", +"68581ebd": "getJobs()", +"68583bc0": "FC1Token()", +"68586e57": "setPet(uint8,address,string,uint8,uint16,uint16,uint16)", +"6859274b": "checkMembership(bytes32,uint64,bytes)", +"6859d08f": "addToActiveGroup(address)", +"6859dc10": "rejectRequest(address,uint256)", +"685a73e0": "claimHodlRewardsFor(address[])", +"685adf5e": "ALDEToken(uint256,string,uint8,string)", +"685ae2a9": "itoEndTime()", +"685b2d8f": "transferPermissions(address)", +"685b47c7": "updatePresaleNumbers()", +"685c234a": "checkAuthorization(address,address)", +"685c60de": "transferERC23(address,uint256,bytes)", +"685ca194": "withdrawalAllowed(address)", +"685d1135": "recyclingRemainToken()", +"685e2486": "migration(address)", +"685e78fb": "SecondPriceAuction(address,address,address,address,address,uint256,uint256)", +"685ffd83": "registerNameXname(string,bytes32,bool)", +"6860dc1f": "isRefAvailable()", +"6860fd58": "Fees(uint256)", +"686174ec": "QQQTokenBase()", +"6861d3b8": "firstStageStartsAt()", +"68621711": "assetMeta()", +"68624bd7": "lockedValueOf(address)", +"68639a29": "setActivation(address)", +"6863d3c7": "CreatedIRC(address,uint256)", +"68649c8a": "setTiersInfo(uint8,uint256[],uint256[],uint256[],uint8[3][4])", +"68654ef8": "bonusBalanceOf(address)", +"68660b93": "updateDonateTokenAddress(address,uint256)", +"68664430": "supplyDAICO()", +"6866537d": "getCardPrice(uint256)", +"6866566a": "Priced(uint256)", +"6866d144": "_tokenPrice(uint256)", +"6866da59": "_lockOrUnlockAmount(uint24,uint256,uint256,uint256,uint256,uint256,uint8)", +"686790e5": "freezeSignatureChecker()", +"6867edeb": "getBuyOrderPrices()", +"68690dd0": "NeedRefresh(uint256)", +"68699224": "offlineAdjust(uint256,uint256)", +"6869b20e": "saveToken(uint256)", +"6869fb30": "maxWeiTier0()", +"686b2812": "addWhitelistUsers(address[])", +"686b88cd": "calculateWinnerGameType1(uint256,uint256)", +"686caf04": "lastBlock_a1()", +"686d2d5c": "getCurrentBonusPct(uint256)", +"686d5e00": "unRegisterCampaign(uint256)", +"686da8ab": "UpdateRecord(uint256,address,uint256,bool)", +"686e2284": "isCosmosSale()", +"686e8aaa": "GetMoney()", +"686f21ba": "gainKarma(int256)", +"686f2c90": "collectAllFees()", +"686f4564": "redeemedCards()", +"686fa3f7": "getGameId(address,string,string,uint16,uint64)", +"68700891": "RLPReaderTest()", +"6870c65a": "InitialRateChange(uint256,uint256,uint256)", +"6870ef86": "getCurrentTokenFee()", +"68715a75": "GCCHToken()", +"68716e7a": "EutinMokoToken()", +"6871819b": "getUserCollegeEducationDetails(string)", +"6871d26b": "addMeterPoint(int256,address,int256)", +"6872e300": "COPPER_AMOUNT_SKL()", +"68742da6": "withdrawFunds(address)", +"68750bbc": "sendReserveTokens()", +"6875b6eb": "changeRestrictions()", +"6875b746": "updateRelease(uint256)", +"6875c319": "escalateDisputeToMediator(uint256)", +"687711ec": "s25(bytes1)", +"6877dca7": "Token1_Transfer(address,address,uint256)", +"68784493": "votesUser(address,uint256)", +"68788868": "decodedAmount()", +"6878ac7d": "applicableRate()", +"68794b87": "setState(string)", +"687981ac": "getValidatorIndex(uint64,address)", +"687a46c4": "upgradeQualificationByEther(uint256)", +"687a48a1": "getBurnedCarCount()", +"687bf382": "_useName(address,bytes32)", +"687c317c": "setTokensUsedForReinvestment(uint256)", +"687cc2fd": "preSaleTokensAvailable()", +"687cde1a": "tokenSelled()", +"687d493c": "EverOwnedTokens(address)", +"687d5aa9": "setBuyAllowed(bool)", +"687db864": "END_ICO_TIMESTAMP()", +"687e6b5f": "MavenCoin()", +"687e6f44": "withdrawEthers()", +"687f8427": "devCATDestination()", +"68802712": "get_hedge()", +"688057fc": "registerWalletForFeeSharing(address)", +"68808769": "backers(address,uint256)", +"6880ff5b": "secondReserveWallet()", +"6881385b": "payday()", +"6881f6f1": "minTradingStartTime()", +"688225d6": "onemonth()", +"688257e0": "SmartContractWorkshop(string)", +"688263d7": "largestPenisOwner()", +"6882d481": "priceStar4()", +"68832d14": "___proxyTarget()", +"6883477f": "canBePurchasedByEMONT(uint16)", +"688507e1": "SellEgg()", +"688511bb": "timeoutBlock()", +"688521b4": "coinsIssuedTotal()", +"6885c572": "allowByDelegate(bytes8,bytes8)", +"6885edcd": "desiredPrice(uint256)", +"6885f63b": "TrustToken()", +"6886bf1c": "mostSent()", +"6886ce25": "ForkEthereum()", +"68873375": "CBRToken(uint256,string,string)", +"6887398d": "getContestTeamCount(uint32)", +"68879e5f": "RecoverySha3(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"68882b30": "buyCrab(uint256)", +"68888300": "updateAngelCardSeries(uint8)", +"68889db8": "setFreezingPeriod(address,bool,uint256)", +"68894a16": "changeMaxContribution(uint256)", +"68895979": "getUint256()", +"6889cf86": "icoOver5()", +"6889d646": "transferMoneyToOwner()", +"688a54dc": "ATxAsset()", +"688a7044": "CryptoRoulette()", +"688abbf7": "myDividends(bool)", +"688af37f": "QRL_Token()", +"688b410f": "sendTokenUpdate(address,uint256)", +"688b5c2b": "isMiningWarContract()", +"688ba636": "walletTeam()", +"688bf035": "calculateUSDcValue(uint256)", +"688cdba8": "ownerRate()", +"688cf404": "setAyantDroitEconomique_Compte_4(uint256)", +"688d3922": "isHardCapReached()", +"688d54b7": "getLLV_edit_34()", +"688dcfd7": "setProofType(bytes1)", +"688def07": "MMOToken()", +"688e69d8": "ownerPowerUpContract()", +"688f5ed2": "gracePeriodAfterRound1Target()", +"688fad5d": "updateIdentitySocialURL(address,bytes32)", +"68907360": "setRewardsContractHash(address,bytes32)", +"68915c14": "seedInvestors()", +"6891656e": "buyWithCustomerId(address,uint256,uint256,uint128,uint256,bool)", +"68927cd2": "isValidBNBContribution()", +"68931b21": "getTotalBooks()", +"68934e54": "approveBurnDelegate(address)", +"6893cc22": "toUint(bytes32)", +"6893e8d2": "_setLimits(uint256,uint256)", +"6893f63f": "getTokensPerEth()", +"689490a0": "whitelistedAddresses()", +"6895179d": "testToken()", +"68955fb1": "icoPhase()", +"6895adbb": "_addModule(address,bytes,uint256,uint256)", +"68963dee": "ICOMinTresholdReached(uint256)", +"68968564": "SaveYouAndMeToken()", +"6896a342": "ADVISOR_STAKE_ONE()", +"6896b999": "xConvertPrioritized(address[],uint256,uint256,bytes32,bytes32,uint256,uint256,uint8,bytes32,bytes32)", +"6896ef4b": "currentRoundIndex()", +"6896fabf": "getAccountBalance()", +"68970ab4": "Created(address,address,uint256,bool,uint256,string)", +"689786d0": "test_oneValidEqBytes32Message()", +"6897a1a2": "startingCostToPress()", +"6897c1b6": "PrepareToStart(string,uint256,uint256,uint256,address,address)", +"6897e974": "removeWhitelistAdmin(address)", +"689827b0": "modInverse(int256,int256)", +"6898730f": "eip20Transfer(address,address,uint256)", +"6898f148": "beforeSale()", +"6898f82b": "play(uint256)", +"68999d76": "exportTank(address,uint32)", +"6899d8c2": "recoverAll()", +"6899dac5": "finishVotingTeam(uint256)", +"689a4608": "Test20()", +"689a521d": "changeContractState(bool)", +"689b2d24": "AcceptsElyxr(address)", +"689b3e2d": "Moonraker(address,address)", +"689b732c": "FundValue(uint256,uint256,uint256,uint256)", +"689da08e": "dad()", +"689dcb02": "Buyin(address,uint256,uint256)", +"689e87c1": "GIRLBUFFERSIZE()", +"689effad": "BookingTimeUtils(address)", +"689f2456": "partial_refund()", +"689f3f99": "unclaimedPlotPrice()", +"689ffd82": "addressSalesSupply()", +"68a1e07f": "_currencyToToken(bytes,bytes)", +"68a287d8": "getTeamVault(address)", +"68a29a31": "balanceEthPrivate(address)", +"68a52509": "getLastOrderId()", +"68a52851": "setTokensContract(address)", +"68a596c7": "ownerToTokenIds(address,uint256)", +"68a59805": "setPayoutDistributionHash(bytes32)", +"68a67030": "finalizeSale1()", +"68a6b26b": "setWeiRaisedInPresale(uint256)", +"68a6e74b": "preICO()", +"68a72fba": "crowdTarget()", +"68a7d7ea": "setAgriChainData(address)", +"68a7e1c4": "setDelegadoDeEscuela(bytes32)", +"68a7effc": "getOrCreateCurrentFeeWindow()", +"68a7f6d6": "playerFastFlight(uint256,uint16)", +"68a8659d": "SellOrdersOf(address,uint256)", +"68a8c5eb": "WyvernDAOProxy()", +"68a958bc": "payrollSystem()", +"68a9674d": "depositFrom(address,address,uint256)", +"68a9de13": "changeEndtime(uint256)", +"68a9f31c": "secondOwner()", +"68aafcd9": "setUsageReportingAddress(address)", +"68ab3db2": "createDefaultGen0EtherDog(uint256,address,uint256,uint256)", +"68ab56ca": "get_bounty_count(uint256)", +"68abf22b": "BAC(uint256)", +"68acb7b7": "TOTAL_COMMUNITY_ALLOCATION()", +"68acfcbb": "changeLinkedAddress(address,address)", +"68ad1412": "registerUser(address,bytes32,address,bytes32,bytes32)", +"68ad6719": "valueChanged(string,string)", +"68aee9e8": "wed()", +"68af1378": "playerGuess(int8)", +"68af37df": "letter()", +"68af4971": "registerListening()", +"68afc7c4": "test_rewardPoolShare_isTranscoder()", +"68b017ec": "sarahtoken()", +"68b07ebb": "_getMaxAuctionSeconds()", +"68b0d82e": "TransferredGNS(address,address,uint256)", +"68b1a6d0": "GetBestWalletAddress(uint8)", +"68b2cee0": "removeAssetsOwner(address)", +"68b35396": "gemPerMiner()", +"68b43f38": "privateLockTime()", +"68b47d87": "SSOTHEALTH_FUNDS_ADDRESS()", +"68b49b78": "changeKey(address,address)", +"68b51ac7": "checkValidSignature(address,bytes)", +"68b5c351": "tokenTrueUSD()", +"68b670af": "wmulfloor(uint128,uint128)", +"68b6d55d": "potSize()", +"68b85aa5": "maxTimeout()", +"68b8c5a1": "numberOfAuthorizedPayments()", +"68b91201": "createInvestorTokenTimeLock(address,uint256,uint256,address)", +"68ba170c": "isRegisteredTranscoder(address)", +"68ba745c": "releaseTeamVested()", +"68bae934": "getAuctionItem(uint256)", +"68bba4d0": "HARD_CAP_T()", +"68bd6efa": "getContract(address,address)", +"68be7887": "getOrganisationByAddress(address)", +"68be8007": "_updateRegionOwner(address[16],uint256,address)", +"68be948d": "setRegisteringContractAddress(address)", +"68bee793": "LevelWhitelistedIICO(uint256,uint256,uint256,uint256,uint256,address,uint256)", +"68c14a61": "AirdropCentral()", +"68c197dd": "isWorkerPoolRegistered(address)", +"68c31649": "checkWithdrawAmount(address,uint256,uint256)", +"68c35c4b": "setEmail(address,string)", +"68c49cc9": "collectOtherTokens(address,address)", +"68c4cac6": "tokensPerEther1()", +"68c4eb74": "changeInvestorsAddress(address)", +"68c51f8e": "lhkjTNB()", +"68c64670": "RapidProfit(address)", +"68c646f3": "LifeFactor_i()", +"68c6b11a": "subtract(address,uint256)", +"68c6f45e": "issuedByStabilityBoard()", +"68c84260": "addEmployee(address,address[],uint256)", +"68c92b51": "doCall(address,uint256,bytes4,bytes32[])", +"68cbce31": "setWinner(uint256,uint256)", +"68cdafe6": "tokenTransfer(address,uint256)", +"68cdf759": "getReffAdd(string)", +"68ce77d0": "grant(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"68ce90ac": "handlePayment(address,uint256)", +"68cf5cf8": "setAdvisor(address)", +"68cff8a9": "notEmpty()", +"68d06724": "weisSoftCap()", +"68d12938": "setDonatorReward(uint8,uint256[],uint8)", +"68d155a0": "remove_participant()", +"68d317f1": "buildGame(address,string,string,uint256,uint256,uint8,uint8,uint8)", +"68d324e7": "changeCrowdSale(address)", +"68d32aed": "getVerifiedHashID(address,bytes32)", +"68d3d433": "specialDefenses(uint256)", +"68d3fb7b": "initRegister()", +"68d5a014": "reveal(uint256,uint8[5],bytes32)", +"68d5cb1a": "purchaseBuilding(uint256,uint256,uint256)", +"68d64514": "getRemovableIdArrayItems(address,uint256,string,string,string)", +"68d6a790": "timeOfreservations(address)", +"68d77366": "Coinlancer()", +"68d7e4b5": "addDeal(uint256,string,string,uint256,string,bytes32,string)", +"68d7f8d6": "nextPrice(uint256,uint256)", +"68d830ae": "get_unlock_time()", +"68d85d3e": "CloudexchangeCrowdsale(uint256,address)", +"68d88c25": "serviceRedirect(address,address,uint256)", +"68d89792": "setCatAttributeValue(uint256,uint256,string)", +"68d967dd": "changeDoublr(address)", +"68d9e8c4": "DKoin()", +"68da480b": "maxWeightBonus()", +"68da5ee5": "guess(uint256[])", +"68dae6bb": "RoundClose(uint256,uint8,uint256,bytes32)", +"68db96a6": "whitelistBonusRate()", +"68dbc6c1": "fortune_bid(uint256)", +"68dc3926": "unchanged(address)", +"68dc9528": "giveTokens(address,uint256)", +"68dd43f6": "maxNumInterests()", +"68df0d53": "_removeTokenFromOwnerEnumeration(address,uint256)", +"68df4dda": "removeWhitelistedTokenAddr(address)", +"68df5ca4": "testMinReturn0WithoutReturn()", +"68e03bf9": "setEthEurRate(uint256)", +"68e09ab5": "tokenEscape(address,uint256)", +"68e114db": "PFG(uint256,string,string,bool)", +"68e12fa8": "addressCallWithArray(address,address[3])", +"68e1569a": "parking()", +"68e1bba4": "eth_ratio()", +"68e1f526": "WeMediaChainToken()", +"68e2076a": "Hub()", +"68e39aac": "proxyWorking()", +"68e453ed": "totalSaled()", +"68e47f59": "accept(address,bool)", +"68e4bd99": "testSetBitSuccess()", +"68e5a07e": "getExcludes(uint256,uint256)", +"68e5e22f": "buyAnalysis(address)", +"68e67402": "RoomPlayersAdd(uint8,address,uint256,uint8)", +"68e757a0": "create_public_sale_token(address,uint256)", +"68e76403": "getTotalFeesCollectedCount()", +"68e7bdba": "disableApi(address)", +"68e7e309": "_saveVerification(address,address,uint32)", +"68eb59b0": "startGladiatorWithCoin(uint8,uint8,address)", +"68ebd450": "bioLock()", +"68ec0d99": "refundable(address)", +"68ec8446": "RentartoICO()", +"68ec9dba": "emptyPendingUserList()", +"68eca613": "numShareholders()", +"68ecabcf": "ankcwdsleToken()", +"68ee137e": "bonusClaimedTokens()", +"68ef7946": "zazSupply()", +"68ef8661": "isValidParticipant(bytes32)", +"68efa030": "Dao1901()", +"68efb367": "exile(uint8,uint8,uint8,bytes4)", +"68f04bbb": "openAirDrop()", +"68f06b29": "redeemable(bytes32)", +"68f0bcaa": "atomicize(address[],uint256[],uint256[],bytes)", +"68f15aac": "DMChainToken(string,string,uint8,uint256)", +"68f16293": "transferCooldown()", +"68f169e1": "sellCut()", +"68f269b4": "RATE_ETH_TXK()", +"68f2ab8e": "Currency(string,string)", +"68f2c86a": "changeUserPerms(address,bool,bool,bool)", +"68f2d6e2": "GEN0_MINIMAL_PRICE()", +"68f319b1": "placeBet(uint8,bool,uint256,uint256,bytes32,uint8,bytes32,bytes32)", +"68f399f4": "BetSetAnswer(uint256)", +"68f5aa0f": "setShareholderDB(address)", +"68f5ccdf": "devFeePaid()", +"68f5d173": "addAdminister(address)", +"68f65f02": "ChangeShownDenomination(bool,bool,bool,bool)", +"68f67330": "finalizedCrowdfunding()", +"68f6e75f": "percent1()", +"68f7ef1b": "BLKToken(address)", +"68f88a26": "getMatchSummarizeInfo(uint256)", +"68f8957a": "setAyantDroitEconomique_Compte_1(uint256)", +"68f8fc10": "buyToken(address,uint256)", +"68f91814": "mainMultisigEther()", +"68f9dab2": "hash(bytes,bytes,uint256)", +"68fa8134": "removeAdministrator(address)", +"68faaa6f": "getTotalSellCount()", +"68fad504": "burnExtraTokens()", +"68faecdb": "depositedMYB(address)", +"68fb81b7": "iCoTokensSold()", +"68fbbab8": "giveMultipleItemsToMultipleRecipients(address[],uint256[])", +"68fbd0a8": "TPTSchedules()", +"68fcb6ee": "purchaseCard(uint256,uint256)", +"68fd0455": "contractorCancel(bytes16,address,address,uint256,uint256)", +"68fd22d3": "_addToList(address[],address)", +"68fe4405": "getBondHolder()", +"68ff8c4c": "UserList()", +"68fff456": "blackMask()", +"69008fb6": "buyTileAuction(uint8,uint256,address)", +"6900a3ae": "toString(uint256)", +"6901f668": "validate()", +"690252c8": "addSshKey(string)", +"69025b5f": "_addTokenToOwnerEnumeration(address,uint256)", +"6902a416": "AUMXToken()", +"69030397": "addLocker(address,address)", +"69032f15": "cantSetReferrer(address)", +"69043895": "exOwner(address)", +"6904c104": "getCampaignValidity(bytes32)", +"6904c94d": "company()", +"6904efc5": "BeatTokenIcoPhase3Started()", +"6904f583": "econVestingStage()", +"6905877a": "totalOwedForApi(uint256)", +"69061355": "claimOwnership(uint8,bytes32,bytes32)", +"6906679b": "getHistory(uint256,uint256)", +"6906a137": "checkCharger(uint256)", +"69070772": "MyFreeCoins(uint256,string,uint8,string)", +"69071418": "poolCLock()", +"6907baa9": "Campaign(address,address,address)", +"69081199": "WithdrawFunds(address)", +"69086c21": "a(bool,bool,bool)", +"6908d99c": "Extract(address,uint256)", +"6908ea00": "_checkVotes(uint256,bytes32,bytes32)", +"690973b6": "placeSpectatorBetOnGladiatorBattle(uint256,bool,uint256)", +"6909f5bf": "generateTokenWithAttributes(string,string,string)", +"6909fd44": "isWhitelisted(uint256,bytes32)", +"690a946b": "getProjectEndDate(uint256)", +"690b1897": "AragonTokenSale(uint256,uint256,address,address,uint256,uint256,uint8,bytes32)", +"690c11d5": "getcoursesLenght()", +"690c5de8": "phase4Cap()", +"690cf0d1": "preSaleStarted()", +"690d0b1d": "STARCrowdsale()", +"690d23be": "getItemAmountOf(uint256,address)", +"690d3750": "lockBalances()", +"690d8320": "withdrawETH(address)", +"690e1d22": "showLockNum(address,address)", +"690e7c09": "open(uint256)", +"690eb3f8": "getTicketSumToRound(uint256)", +"690f2f8e": "_addTokenAddress(address)", +"690f411b": "VividoTokenTMP()", +"690f4559": "createPersonalDepositAddressFor(address)", +"690fa5df": "getPlayerRefById(uint256)", +"69102190": "checkCount(address)", +"69111865": "LINDOToken()", +"69115768": "hasItBeenReleased(uint256)", +"69129b4f": "StandardToken(uint256,string,string)", +"6912c8ba": "thirtyPercentWithBonus()", +"69132d43": "useBalanceOf(address)", +"69132f72": "SALE2_END()", +"6913a63c": "addGuard(address)", +"6913d82d": "adminSetBlock(uint256,uint256)", +"6914db60": "tokenMetadata(uint256)", +"6914f40f": "getPI_edit_27()", +"69161b9e": "addAddressToGrantAccess(address,uint256)", +"6917fd5e": "BONUS_ICO_PERIOD_ONE()", +"6919d09a": "Y(uint256,uint256)", +"6919ff17": "test_insert_findNoHintAtPosition(int256)", +"691a38ab": "canBeWhitelisted(bytes32)", +"691a3f64": "buyFrom(address)", +"691a5842": "totalEtherRaised()", +"691ae7c9": "setCandyPowerToken(address)", +"691b7ce0": "transferCMO(address)", +"691ba73a": "race()", +"691bf023": "LockTokens(address,uint256,string)", +"691bfc89": "goods(uint16,uint256)", +"691c65d4": "mintItem(address)", +"691c71bd": "endTime2()", +"691c9484": "registerInvestor(address)", +"691cdb51": "CoinoorCrowdsale(address,address,address,address,address,uint256)", +"691d58e7": "_applyRefund(uint256)", +"691d933a": "getDeedByAddress(string,uint256)", +"691de4a4": "add(string,bytes32)", +"691e9961": "we_test_token()", +"691ed382": "THIRD_TIER_SALE_START_TIME()", +"691edfda": "devAccount()", +"691f2216": "User_1()", +"691f3431": "name(bytes32)", +"691fb8ea": "jumpIn()", +"692058c2": "dex()", +"69205dfc": "TUNEZ()", +"6921278a": "rateFee()", +"69215eb3": "ethMined()", +"692193cc": "MarketplaceAccessor(address)", +"6921af97": "payOutBounty(address,address)", +"69229b43": "ChangeOwnerContract(address)", +"6922eb06": "sellPackToAddress(uint16,uint16,address)", +"692345ee": "elapsedPeriods()", +"692397a4": "testIssueTokens()", +"69244c55": "getIcoReward(uint256)", +"69245009": "cage()", +"6925ad77": "multiplex_target(address)", +"6925b015": "contributionBy(address)", +"6925ebb9": "fluxFeed(uint256,bool)", +"6926890b": "createSale3()", +"69269371": "newAmendment(string,uint256,uint256)", +"6926cc7b": "_canSetReferrer(address,address)", +"692740b6": "_areStakeAndWithdrawAllowed()", +"6927bc38": "_isValidSignature(address,bytes)", +"6927cac5": "trustedSender()", +"6927e45a": "TOKEN_SHARE_OF_ADVISORS()", +"6927f800": "Tango1Token()", +"69288540": "setDEV(address)", +"6929dd0b": "confirmOrderCompletionByDoctor(bytes16,bool)", +"692aa97e": "isOpened()", +"692ad3a9": "round(uint256,uint256,uint256,uint256)", +"692b3712": "DMINT()", +"692bf818": "isIntermediary(address)", +"692cd610": "nextRewardPlayNo()", +"692d9ee5": "SALE_TOKENS()", +"692dfe8e": "maxStakeHolders()", +"692f74aa": "getvehreqdetails(uint256,address)", +"69306f24": "numberOfCommittees()", +"69307c80": "rotateBits(bytes,int256)", +"6930a020": "bruler(uint256)", +"6930a7e9": "adminMode(bool)", +"6930c5da": "depositSavings(address,uint32)", +"6930fd2a": "claimAll(uint256)", +"693103a0": "addAffiliates(address[],uint256[])", +"69318a79": "makeComment(string)", +"6931b550": "claimEthers()", +"6931e19f": "productPrices(bytes32)", +"69328dec": "withdraw(address,uint256,address)", +"6932af36": "proxies(bytes32)", +"6932c9c5": "getSaleContractDepositAddress(address)", +"6932cf81": "getName(string)", +"69335938": "vestedDate()", +"693382a9": "addToWhiteList(bytes32,address)", +"693391fe": "createNewUser(address,address,string)", +"69347990": "ownerWithdrawl()", +"69358e2e": "getCompanyList()", +"6935a0d0": "addNewEventToBusiness(uint256,address,string,string,uint256,uint256,uint256,uint256)", +"6935a290": "OriginsTraceChainToken(address)", +"69361de3": "I21Token()", +"69361fe2": "FeeCalculated(uint256,uint256,uint256,uint256,uint256)", +"693649aa": "mintRewardCore(address,uint256,uint256,uint256,uint256,uint256)", +"6936c1cf": "XoloChain()", +"69389cac": "setPlayerForm(uint256,uint8)", +"6938d9b0": "allocatePresaleTokens(address,uint256,uint256)", +"6939864b": "lotteryState()", +"693ac4fb": "getProof(bytes)", +"693b2b3f": "ticketTransferersAmount(address)", +"693bd2d0": "cardContract()", +"693cf8ce": "amountToSeedNextRound(uint256)", +"693d0141": "retireWildEasy(uint64,uint64,uint64,uint64,uint64,uint64)", +"693d0df2": "claimFunds(address)", +"693dde5c": "getAppId()", +"693e2279": "burntFounder()", +"693e26dd": "createVirtualEntity()", +"693ec85e": "get(string)", +"6940030f": "disableTrade()", +"69401027": "acceptClockmaker()", +"694094fd": "M5Token()", +"69414e7b": "SaveCryptoNetwork()", +"6941a061": "IdxCoin()", +"69422924": "hasVotedOnDocumentPoll(uint8,bytes32)", +"69423429": "getMyDividendAmount()", +"694244f8": "PreSaleStart()", +"694278da": "publicKeyYForX(uint256)", +"69428d97": "OwnableSimple()", +"6942dc03": "EnvironToken()", +"6942eac7": "Currency()", +"6942eff7": "_unverifyAddress(address)", +"69431ab6": "TokenCreation(uint256,uint256,address,string,string,uint8)", +"69433e12": "setExchange(uint256)", +"6943935e": "DPOS()", +"69443bf4": "CTAuction(address,address)", +"694463a2": "totalEntrants()", +"69454b86": "pairs(address,address)", +"6945c5ea": "setPlatform(address)", +"6946e33b": "GXVCNoToken(uint256,address)", +"694702ec": "CommonTokensale(address,address,address,address,uint256,uint256)", +"694719d8": "MIN_REFUND_RATE_DELIMITER()", +"69488271": "AllocatePresale(address,uint256)", +"6949a058": "sendOwnerEther()", +"6949e1d4": "AngleToken()", +"6949ed67": "omec(uint256,string,string)", +"694a813f": "bet1deltaOf(uint256)", +"694b1727": "addServer(string,uint8,uint256,uint256)", +"694c00d1": "reclaimBySender(address,address,bytes32)", +"694c11eb": "buyCore(address,address)", +"694d3757": "isAuthDisabled(uint256)", +"694dcecc": "preCrowdsaleStartTime()", +"694df50a": "freezeAddress(address,bool)", +"694e0d5b": "StringPasser(uint8[])", +"694e4277": "payment(uint256,address,uint256,bool)", +"694e80c3": "changeThreshold(uint256)", +"694ebe05": "createEscrow(address,uint256,address,uint256)", +"694f5a08": "_clearTotalNormalTokensByAddress(address)", +"694f6276": "_approvedFor(address,uint40)", +"6951b995": "grantCompanyCoins(address,uint256)", +"695338b9": "ChillIssued()", +"6953ace4": "finalTokenExchangeRate()", +"6953ba9a": "nextStarIndexToAssign()", +"69541be8": "DefaultReverseResolver()", +"6954abee": "owner_supplied_eth()", +"69557669": "changeContracts(address,address,address,address,address)", +"6955c8fc": "getBuyPriceAndPreviousRecord(bytes32)", +"69569a51": "setFrontend(address)", +"6956f3d5": "_totalTokens()", +"69573648": "remove(bytes,bytes)", +"695741f8": "waitTimeBlocks()", +"69580f63": "setVendorName(address,bytes32)", +"6958420b": "arbYes(uint256,address,uint256,string,uint256)", +"69594cfa": "transactionLog(uint256)", +"69598efe": "totalPartitions()", +"69599168": "onEmergencyChanged(bool)", +"6959d5c7": "getCitationRecord(string,uint256)", +"695a4cad": "finishTransferFeePayment()", +"695a7e9d": "CheckAmbientLightException(bytes32,uint32)", +"695addc9": "newProposal(bytes32,address,uint256,bytes)", +"695b4700": "transfer_token_from(address,address,uint256)", +"695c5a26": "getCurrentPhaseCloseTime()", +"695ca8c8": "Rhodium()", +"695d027b": "EMoney(uint256,string,string)", +"695d7297": "updateRewardForDrawing(uint256)", +"695d7797": "makeWallet(uint256)", +"695dcfa4": "createContract(bytes32,uint16,bytes32,uint256,uint64,bytes32,uint64,bytes32,uint64,uint64)", +"695e1341": "UNGT()", +"695e2a30": "METAXCrowdSale()", +"695e54c3": "setCountWinnerPlace(uint256)", +"695ec793": "secondRelease()", +"695f9db3": "createRocSaleMarkets(uint256,uint256)", +"69606c61": "CompalTestCoin1(string,string,uint256,uint256)", +"6960947d": "stockSize()", +"6960a0ed": "getArtWorkChangeFee(uint256)", +"69615c0c": "TransferSalPay(address,address,uint256)", +"69623ae2": "addPlugin(address,address)", +"6962b010": "freezeEndsAt()", +"69632f56": "unitAttack(uint256)", +"69639749": "getMemberRole(address)", +"696495f9": "GetLettuce(address)", +"6965193f": "_processTransactionFee(address,uint256)", +"69652fcf": "resign()", +"69658cf3": "checkMyTokens()", +"69666811": "collectAllReturnBalance(address)", +"69671622": "depositToken(address,uint8,uint256,uint256)", +"69683080": "totalRestrictedAssignments()", +"6968ce29": "refundNonKYCInvestor()", +"6969d216": "topLevelDomainOwner(string)", +"6969d5d8": "appointAdministrator(address)", +"696a7253": "setConstraint(bytes32,bool,bool)", +"696b1030": "enableLimit()", +"696b5fb7": "getAssetID()", +"696bda86": "submitProposal(uint256,bytes)", +"696c58c4": "getRefund(address)", +"696c9c0a": "create(address,uint256,bytes)", +"696cd82c": "_register()", +"696d25fb": "calcVestableToken(address)", +"696d7ee9": "airdropPrize(address)", +"696d816a": "endSell()", +"696df08e": "FULL_TOKEN_WALLET()", +"696e6a6a": "Octiron()", +"696e7a85": "listPrycto3()", +"696ecc55": "trade(uint256,uint16[],uint8,bytes32,bytes32)", +"696f541c": "getOrg(string)", +"696f8a95": "CrowdCoinICO(address,address,address)", +"696fcc7c": "abortTime()", +"696fd28a": "SBSToken()", +"696fd68c": "makeTransferable()", +"697025b6": "transferEnablingDate()", +"6970402c": "areAllTokensRegistered(address[],address)", +"69706d9d": "unlockAmounts(uint256)", +"69708616": "push(address,uint16,uint256[4],uint256[2],uint8[11])", +"6970f46b": "BitFwdToken()", +"69712ffa": "removeTokenLock()", +"69719706": "Huangdashi(uint256,string,uint8,string)", +"6971d64c": "func_0AB9()", +"69732d4b": "ProjectX()", +"6973a4f8": "backTransfer(address,uint256)", +"6973cf58": "createEthSiringAuction(uint256,uint256)", +"6973e6db": "extraDataToNbJurors(bytes)", +"6974c632": "getItemPriceById(string,uint256)", +"6975846a": "getCurrentBidAmount(uint256)", +"6975aa9f": "minGoalReached()", +"69766079": "buyin()", +"6977083e": "updateStrategyAddress(bytes15,address)", +"69774c2d": "topup()", +"69776b1b": "tranchePeriodInDays()", +"6977aa62": "mintUnreleasedCard(uint8,address)", +"6977d9de": "addEmployerTotalInvoiced(address,address,uint256)", +"6977edc6": "dataControlAddOwner(address,address)", +"69793570": "_deleteOperation(bytes32,bool)", +"69794795": "getRiskParams()", +"697952af": "updateHolder(uint256,bytes32,bytes32,bytes32,bytes32)", +"697a2902": "HDhundun()", +"697a3083": "destroyforsecurities(uint256)", +"697a60b3": "updateContract(string,address)", +"697aefe2": "certificato(string)", +"697b139e": "changeGift(uint256)", +"697c37c5": "cd1(address)", +"697ca8bf": "getContributorInfo(address,string)", +"697cca66": "safeRelease()", +"697d1eaf": "getGroupTeamInvest(uint256,uint256)", +"697d2e19": "getDisputeTimeoutState(uint256)", +"697ee181": "DemeterCrowdsaleInstance()", +"697fa3e6": "forCommand()", +"697fa43d": "isBatchCeateDrawings()", +"697fb220": "addLockAddressInternal(address,uint256)", +"697fc672": "creatorClaimFundTransfer(uint256)", +"697fd39e": "randomNumberIncome()", +"6980f4fb": "heroTypeIds(uint16,uint256)", +"69810d0c": "TOTAL_SHIP()", +"69815435": "isAbove(uint256,uint256,string)", +"69817410": "investHappened(address,uint256)", +"69817dd4": "ProspectorsDevAllocation(address)", +"6981b5f4": "getLength(string)", +"6981c879": "updateDate(address)", +"69820a80": "birthBlock_()", +"698232fe": "balances1(uint256)", +"6982c6f4": "tickets100price()", +"6982f45a": "AutomobileCyberchainToken()", +"69833668": "allocateEndBlock()", +"69837721": "accForBounty()", +"6983f908": "isAllowedToBuyByAddress(address)", +"69843940": "getValue(bytes32)", +"6984d4a8": "getBigPromoPercent()", +"6985a022": "Pause()", +"6985a1b0": "endInstance(address,address)", +"6985c57e": "createRare(string,uint256)", +"6985e46e": "getConflictResolver()", +"69863520": "getOrganizerName(uint256)", +"6986ab82": "getNeedLockFundsFromPeriod(uint256,uint256)", +"6986d405": "elapsedDays()", +"6988e9cc": "tokenTotalSupply(address)", +"69898d64": "removeGift(uint256)", +"698a92fe": "CNKTToken(uint256,string,string)", +"698afd98": "withdrawFrom(string,address,uint256)", +"698bdd6f": "ViewtMyBets()", +"698c1d17": "CoinBX(address)", +"698d67aa": "registerBarcode(bytes9,bytes3,string,string,bytes19)", +"698d8a1e": "completeProvision(address,uint32,uint256,uint256)", +"698edc76": "getLawyer(address)", +"698f16aa": "pauseTrueUSD()", +"698f2e84": "setVirtualExchange(address)", +"698fbe92": "setWhitelisted(address,uint8)", +"69902ffb": "buyPerUnit(address,uint256)", +"699084f4": "CNBCoin(uint256,string,uint8,string)", +"69919447": "sclToken()", +"6991bad0": "number_of_token()", +"6991cb13": "EthlanceSponsorWallet()", +"69921c26": "checkAccount(address)", +"6993176a": "setMtdAmount(uint256)", +"69934ee7": "becomeRichest()", +"6993b507": "getDoublePeriod()", +"69940d79": "getRewardToken()", +"6994436e": "Shefo()", +"699450e8": "student()", +"699487c2": "getRecordNameToken(bytes32)", +"69949c77": "getRestricted()", +"6994a62b": "getRedemptionStatus(bytes32)", +"6994a7a0": "getPlayerAmount(uint256,uint256,address)", +"69950bd6": "addNewVendor(address)", +"69953501": "setUtils(address)", +"69958ab9": "cancelGame(uint256)", +"69972e07": "unvouch(bytes32,uint256)", +"6997545f": "SetParticipantStatus(address)", +"6997bcab": "totalSpending()", +"6997d166": "USER_VOTE(uint256,uint256)", +"6997f429": "MacroProxyContract()", +"69986073": "mainSaleSuccessfull()", +"6998a85b": "setTimeToBorn(uint256)", +"69995128": "updateAccount()", +"6999579f": "consolationRewardsClaimPercent()", +"69997696": "updateLoveStoryWithData(bytes16,bytes32,bytes32,string)", +"69997987": "distributeIQTToken()", +"6999d38f": "cancelBetByB(uint256)", +"699a195d": "addEA(string,string,string,uint32,address,address,string)", +"699a3a7f": "etherSince100()", +"699abb3c": "setTaxPercentage(uint256)", +"699ac46f": "mintTransfer(bytes32,uint256,bytes32,address)", +"699b328a": "randomize()", +"699be1bb": "lastBlock_v9Hash_uint256()", +"699c1687": "getProductBuyer(uint256)", +"699c181e": "currentTokenPerETH()", +"699c267a": "Jii()", +"699dc8ff": "proxyMintTokens(address,uint256,bytes32)", +"699dde66": "SiniCoin(string,uint256,uint8,string)", +"699e2bc6": "getTradeInfo(uint256,address,address)", +"699ef40c": "updateProfileAboutMe(string)", +"699f0c72": "getOfferPriceEth(uint256)", +"699f1fa9": "thisIsFork()", +"699f200f": "addresses(bytes32)", +"699ffd88": "get_database_id()", +"69a0188a": "setHashToFalse(bytes32)", +"69a046f2": "wadd(uint128,uint128)", +"69a0b5c0": "isSolved(uint8[9][6])", +"69a1aa95": "bulkPurchageLand()", +"69a1b0e2": "claimB1()", +"69a1bca9": "refundSale()", +"69a26fb8": "BuyStatus(uint256)", +"69a300f6": "getRangeID(uint256)", +"69a3a65a": "HBXToken(address)", +"69a44176": "aTransfer(address,address[],uint256[])", +"69a479e2": "IPETToken()", +"69a4c408": "AdminSupply()", +"69a4eda5": "calculatePositionProfit(uint256)", +"69a56df4": "testNewCounterValueAfterAIncrease()", +"69a5e902": "multiAccessCall(address,uint256,bytes)", +"69a683f1": "pollCompleted()", +"69a68f5f": "setPhase1AccountTokensMax(uint256)", +"69a69658": "createCoreRequestInternal(address,address[],int256[],string)", +"69a75868": "firstYearGameMiningTokenCap()", +"69a8c3bf": "CurrentGameId()", +"69a9e6b8": "togglePayment(uint256,string)", +"69aa2c9f": "burnMultNom()", +"69aaa388": "changeMultiSignatureWallet(address)", +"69aab7e3": "withdrawNAC(uint256)", +"69aad305": "getFromBalance(uint256)", +"69ab0005": "setThreshold(uint256,uint256,uint256)", +"69ab3404": "withdrawPartialDevelopersCut(uint256)", +"69ab7895": "get_payment_by_id(uint256,uint256)", +"69ab8c76": "ADVISORS_MONTHLY()", +"69ab8e52": "IsICONotStarted()", +"69ab98dd": "worldCupResultPart4()", +"69abed8f": "updateReferralBonus(uint256)", +"69ac5721": "unlockDate()", +"69ad56de": "_nextFifoStorageKey(uint256)", +"69add113": "tradeBancor(address[],uint256,uint256,address)", +"69addb6e": "IssueToken(uint256,address,uint256,uint256)", +"69ae7757": "registerAntique(bytes32)", +"69af0634": "cancelAllBuyOrders(address,uint256,uint256)", +"69afa869": "setRoundTwo(bool)", +"69b041bb": "swarmFundAddress()", +"69b0abea": "remainingPurchaseAmount()", +"69b144eb": "testThrowsCreateNewRevisionNotOwner()", +"69b29b51": "saleLimitReachedForCurrentStage()", +"69b31548": "ForwarderDeposited(address,uint256,bytes)", +"69b41170": "DELAY()", +"69b492f9": "weisMinInvestment()", +"69b4a1ef": "NUM_STAGES()", +"69b59e75": "collectFee(address)", +"69b5fb58": "setAuthorName(string)", +"69b6438e": "FUNDS_WALLET()", +"69b71e06": "unblockFunds(uint256)", +"69b7215d": "doesProofExist(bytes32)", +"69b7ca85": "getCaptainInfo(uint256)", +"69b8f38d": "ICO_PERCENTAGE_2()", +"69b94cf0": "_transferWithData(bytes32,address,address,address,uint256,bytes,bytes,bool)", +"69b9b787": "deposit2(address,address)", +"69b9e96b": "setBuyoutDividendPercentage(uint256)", +"69ba0fe9": "getStringValues(bytes32)", +"69ba3c06": "rejectErx20TransactionRequest()", +"69ba820e": "retrieveWalletForVanity(string)", +"69baa4ba": "TransferredToken(address,uint256)", +"69bb4dc2": "availableTokens()", +"69bba72f": "getAirdropStats(address)", +"69bbe5c7": "checkRound()", +"69bc1a55": "testFail_doubleVoting()", +"69bc513a": "setGGEAddress(address)", +"69bcdb7d": "getCommitment(uint256)", +"69bd01c4": "getvalue()", +"69bd28f0": "_buyToken(address)", +"69bd3436": "debatingPeriodInMinutes()", +"69bd4ec5": "processSellRequest(string,address,uint256,uint256)", +"69bdd5dd": "appSet()", +"69bdfd3a": "toContractDie(bytes,bytes,uint256)", +"69be51bb": "TOKENS_EARLY_BACKERS()", +"69bee8a1": "getWorkerPoolsCount(address)", +"69bef517": "balanceOfOnForHolderUpdate(address,uint256)", +"69c0ad93": "setInternalDependencies(address[])", +"69c19d4c": "getOutcomeTokenDistribution(address)", +"69c1a712": "lastHeartbeat()", +"69c1da7c": "GetManifestoByCategory(string)", +"69c212f6": "getUserByAddress(address)", +"69c254b9": "getSSPRegistry()", +"69c261ed": "setFreelancerCategories(address,address,uint256[])", +"69c338ff": "SomeContract()", +"69c4113d": "setNewBudget(uint256,uint256,uint256,uint256)", +"69c46821": "checkReferrer(address)", +"69c5c229": "testControlUpdateLatestRevisionNotUpdatable()", +"69c5f36e": "getTokensForContribution(uint256)", +"69c63434": "RaffleInternetBook(string,uint256)", +"69c6a5d2": "derive_sha256(string,uint256)", +"69c6f18d": "_transferItem(address,address,uint256)", +"69c74033": "withdrawSnowflakeBalanceFrom(string,address,uint256)", +"69c7c180": "m_orderCount()", +"69c7e386": "decreaseICOStartTime(uint256)", +"69c87817": "minimumWithdraw()", +"69c89774": "removeWhitelistedTransfer(address[])", +"69c8b344": "ownedToken(address)", +"69c8c7ef": "subtrReferralDeposit(address,uint256)", +"69c92c5a": "removeAddressFromBackend(address)", +"69ca02dd": "Transfer(address,uint256)", +"69ca16fa": "eventLogHand()", +"69cb418a": "RTeamCoin()", +"69cbb042": "getEncPubkey()", +"69cbd0fe": "MintableBaseCrowdsale(address)", +"69ccacd4": "setPercent4(address,uint256)", +"69cd5df1": "icoTokens(uint256,uint256,uint256)", +"69cd61be": "lockOwner()", +"69cdba9a": "approveChangeOwner(uint256)", +"69cef46c": "uploadData(bytes)", +"69cf7ac3": "miningToken()", +"69d01268": "concatUInt(uint256)", +"69d0292d": "addPresale(address,uint256,uint256)", +"69d03738": "setNFTAddress(address)", +"69d0b5e2": "buyInMarket(uint256,uint256)", +"69d0e33c": "getPlayerPlayedTimes(uint256)", +"69d0ef84": "callAndFailWithDivisionByZero()", +"69d196e1": "canAcceptPayment(uint256)", +"69d19c19": "BDSM()", +"69d1d1ca": "postGoods(string,uint32,string,uint256)", +"69d20762": "MassivelymultiplayeronlineVideoGames()", +"69d24f63": "lifetime()", +"69d25ff2": "updateCustomFee(uint256,address,address,address,address)", +"69d29832": "startBonuses()", +"69d2ce29": "countGames()", +"69d38ed2": "FINAL_AML_DATE()", +"69d3b252": "newVox()", +"69d3e20e": "mint(uint128)", +"69d4e250": "_safeSubtract(uint256,uint256)", +"69d4f28e": "officialSold()", +"69d516b3": "acceptExecutorOwnership()", +"69d565a9": "closeWithoutCounterparty(bytes32,uint256,address)", +"69d58d41": "minimumContributionPhase5()", +"69d5f38a": "setMembershipPrice(uint256)", +"69d62bf4": "revertTransfer(uint256,uint256,uint256,uint256,uint256,uint256)", +"69d6b880": "mintAmount1()", +"69d714c3": "getLargeInvestorApproval(address)", +"69d77740": "left92(uint256)", +"69d79ad5": "moneySumAtSettlement(address,uint256,uint256,int256,uint256,uint256)", +"69d87ab1": "setETHUSDPrice(uint256)", +"69d89575": "releaseFunds()", +"69da1b43": "NonceTick(uint256)", +"69da66ea": "referralPromille()", +"69dae8b0": "callAndReward_3(string,string,uint256)", +"69db054c": "userComment(uint256)", +"69dbe3e1": "StepFunction(uint256,uint256,uint256)", +"69dcafe9": "createGovernance()", +"69dceb6a": "getCoinAge(address,address,uint256)", +"69dd312f": "mintForContributorPool(uint256)", +"69dd3b2e": "transfer(address,bytes32,bytes32)", +"69dd4524": "crowdsaleTransfer(address,uint256)", +"69ddaad1": "resetQuote()", +"69dded0e": "validateSet(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"69de374d": "getProposalUint(uint256)", +"69de4e84": "NimCoin()", +"69ded293": "reserveBountyRecipient()", +"69df3671": "friendsWith(address)", +"69dfae6e": "productTokens(string)", +"69dfc66e": "TestableStandardSale(bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"69e01731": "setDesignatedReportDisputeDueTimestamp(uint256)", +"69e01e8d": "dividendsOwing()", +"69e0e346": "inWhiteList(address)", +"69e111ba": "needRelease()", +"69e15404": "feeAmount()", +"69e1b5ce": "NewStage()", +"69e22b20": "addRequest(address,string,string,address)", +"69e24b48": "getCrabStats(uint256)", +"69e255c9": "removeHorseOWN(uint256)", +"69e2c927": "canRecvEthDirect()", +"69e6bcdf": "smartUnBlockAddress(address)", +"69e6e6c9": "amountOfPopDeveloperShouldMine(uint256)", +"69e78499": "removeKey(address)", +"69e795be": "teamTokensCap()", +"69e7ae85": "ipfsAttributeLookup()", +"69e82500": "SoundbitToken()", +"69e8d80f": "ednation()", +"69e91994": "getReturnValue(uint256)", +"69e936f0": "isMultiply()", +"69e9ca8a": "calculatePayoutForAddress(address)", +"69e9f8a8": "activateCurrentRound()", +"69ea1771": "updateRate(uint256)", +"69ea80d5": "HEIGHT()", +"69eac83a": "_emitOracleAdded(bytes4,address)", +"69eadd76": "canAcceptTokens_()", +"69eb6d32": "Annihilated(address,uint256,uint256)", +"69ebb7e9": "getCurrentRound(uint128)", +"69ecc3cf": "invalidate(bytes32)", +"69ed1b83": "callSomeFunctionViaInner2()", +"69ed87b0": "FeesCalculated(uint256,uint256)", +"69ed8a42": "LRKToken(uint256,uint256)", +"69edd4fe": "callElection(uint256)", +"69efe2bf": "stageAdmin()", +"69efe471": "transferLimits(address)", +"69f08449": "m_sale()", +"69f0a549": "mintOther(address,uint256)", +"69f10ce1": "issueRIU(address,uint256)", +"69f1256f": "createTokensFromEther()", +"69f173dc": "waveCap4()", +"69f18967": "testSetBitFailIndexOOB()", +"69f18b8c": "ROB()", +"69f30401": "bid(address,uint256[],uint256[])", +"69f3331d": "nextOwner()", +"69f35883": "updateBloomFilter(bytes,address,bytes32[])", +"69f3c66e": "Movieum()", +"69f40ebc": "forwardInvestorTransaction(address,bytes)", +"69f467c1": "unicorns(uint256)", +"69f4aefc": "LATPTransaction(uint256,uint256,uint256)", +"69f66950": "holderBountyTokens()", +"69f6b766": "getSumInByLottery(uint32)", +"69f80b4a": "addAddress(address,address,uint256,address)", +"69f80c7a": "additionPrice()", +"69f8408a": "MigratableToken()", +"69f8ef0c": "flushETH()", +"69f94209": "NewDrawReadyToPlay(uint256,bytes32,uint256,uint256)", +"69f95967": "vminEtherPerPurchase()", +"69f99001": "hashDataBlock(string)", +"69f9ad2f": "char(bytes1)", +"69fa2cae": "createMintableSale(uint256,uint256,uint256)", +"69fbad65": "_depositOldTokens(address,uint256,address)", +"69fbae6c": "_sendToTeam(uint256)", +"69fbfcc4": "upgradeStructure(uint256)", +"69fc3481": "fundsRaisedFinalized()", +"69fc551a": "create(address,uint256,string)", +"69fcbf70": "setPreSaleAmounts()", +"69fd75b1": "GUPToken(address,uint256)", +"69fe0e2d": "setFee(uint256)", +"69ff2d11": "TOT()", +"69ff5277": "set_activity_details(uint256,string,address)", +"69ffa08a": "claimTokens(address,address)", +"69ffadc9": "TDz(uint256,string,uint8,string)", +"6a00da87": "sellBuyerTokens(uint256)", +"6a011ae5": "minRandomPrivilegeValue()", +"6a018302": "mul2Revert(uint256)", +"6a01b6e6": "createToken(uint256,uint256,uint256,uint256,uint8,uint256,address)", +"6a01f09c": "swapLimit()", +"6a02209c": "getMaxParticipants()", +"6a028692": "totalAvailableEdition(uint256)", +"6a0323b2": "MusiconomiToken()", +"6a0324b0": "_getBool(address,bytes32)", +"6a032a3b": "isTimelocked(address,address)", +"6a032a73": "generateTokensManually(uint256,address)", +"6a03eaf9": "finalizeTime()", +"6a048ddb": "createContractChar(string,uint256)", +"6a049b62": "_buyMulti(address,bytes32)", +"6a054250": "update(uint256,uint256,uint256)", +"6a0665a4": "calculateGoldSell(uint256)", +"6a06bf92": "enjinTeamAllocation()", +"6a07089f": "Contents()", +"6a08b403": "setFine(uint16)", +"6a092e79": "transferTokens(address,address)", +"6a0a1f8e": "claimGrant(uint256)", +"6a0ac115": "libpow2(address,uint256)", +"6a0b50e4": "pickFood(uint256,string,string,uint256)", +"6a0b96b7": "IkuraTransferFee(address,address,address,uint256)", +"6a0c3809": "likeArtist(address)", +"6a0c5068": "getParticipantesA()", +"6a0c5723": "getHasVoted(uint256,address)", +"6a0c8730": "getTransactionPrice()", +"6a0cd52e": "admin_commission_activated()", +"6a0d017c": "inviteReferee(address,address)", +"6a0d3450": "sentTokensToFounders()", +"6a0d783c": "Crowdsale(string,uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"6a0e605f": "MyToken(uint256,string,uint8,string,address)", +"6a0e7c24": "teamVesting(address[],uint256[])", +"6a0f7b7c": "getProductContractClients(address)", +"6a0fd45c": "getMeter(string)", +"6a100f37": "startAuctionFee()", +"6a10ad64": "tokenAllocToCrowdsale()", +"6a10c71c": "secondsLeft(address)", +"6a10d4d6": "createToken(address,uint256)", +"6a11138c": "doRandom(uint64)", +"6a12209c": "setRequestLimit(uint256)", +"6a12b86c": "continueGeneration()", +"6a1353c9": "setMintPayoutThreshold(uint256)", +"6a13af72": "giveRiskToken(address,uint256)", +"6a140b27": "_transferToContract(address,address,uint256,bytes)", +"6a142015": "assignGenesisCallerAddress(address)", +"6a146024": "WAD()", +"6a14d131": "creatorsCreatedCount()", +"6a15a080": "distribute_NRT(uint256)", +"6a16ae40": "wct2()", +"6a172536": "firstPreSaleDate1()", +"6a1729aa": "paymentAffiliate(address)", +"6a19b647": "addSuperPlayer(address,bytes32,uint8)", +"6a1af8b8": "setHeroData(uint256,uint16,uint16,uint32,uint32,uint32,uint64,uint64)", +"6a1b52e1": "expirationCheck()", +"6a1be7c6": "approveCollateral(address,uint256)", +"6a1bf209": "setCCH_edit_8(string)", +"6a1c3a4c": "getLastAPPeriod()", +"6a1c6fc0": "costs(string,uint256)", +"6a1cd82c": "crowdsaleRaised()", +"6a1cdefb": "incBlockCount(uint256,uint256,bytes32,uint256)", +"6a1cf721": "voteYes(uint256)", +"6a1d8713": "setMaxReferrals(uint256)", +"6a1db1bf": "changeFee(uint256)", +"6a1dbf03": "getTokenMinted()", +"6a1eb83f": "MeDao(address,address,address,address,address,uint256)", +"6a1ecbbf": "maxHopefulsNumber()", +"6a1f9e19": "breakIt()", +"6a206137": "cancelOrder(address,uint256)", +"6a2129d6": "delegateRecordExists()", +"6a21857f": "manualSend(address,bytes5)", +"6a221688": "TokenSaleQueue(address,address,address,address,uint256,uint256,uint256)", +"6a226077": "bidOnBreedingAuction(uint256,uint256)", +"6a226a49": "addMessage(string)", +"6a22b09a": "lastAssigned()", +"6a23b9df": "sumICOStage2()", +"6a23e308": "getIncubatorHashing(address,uint8,uint256)", +"6a23e7cf": "setFeeDistributionAndStatusThreshold(uint8,uint8[5],uint256)", +"6a24d595": "ModifyVigencia(uint256)", +"6a25000c": "token_per_wei()", +"6a254198": "ClaimTokensEvent(address,uint256,uint256,uint256,uint256)", +"6a256b29": "settle(address)", +"6a261353": "Lesson_5(address,uint256)", +"6a263f02": "_sqrt(uint256)", +"6a26b7fe": "setClaimableToken(address)", +"6a272462": "sell(address,uint256,uint256)", +"6a27c41d": "revealVote(address,bytes32,bytes32,address,uint256,uint256)", +"6a280317": "isAuctionManager(address)", +"6a2875c1": "incrementDIDFromContributions(address,uint256)", +"6a28db13": "getQrLength()", +"6a28f000": "unfreeze()", +"6a28f828": "issueIndex()", +"6a29150e": "totalFundsWithdrawn()", +"6a293d04": "setAlias(string)", +"6a294a80": "maxActivatedSalesTotalCount()", +"6a29605f": "BOHUpgradeableToken(address)", +"6a2a4c06": "get_released_by_manager()", +"6a2a6657": "validateToken(address,uint256,uint256,uint256)", +"6a2aac2b": "flowerBalances(address)", +"6a2ab790": "PRIVATE_STAGE_MAX_CAP()", +"6a2b171a": "applyDiscount(address,uint256)", +"6a2b5656": "changeTransactionFeeRecipient(address)", +"6a2b9e9d": "ERC20WithMetadata(string)", +"6a2c1ace": "getStateHash(bytes,uint256)", +"6a2d1cb8": "MIN_INVEST_ETHER()", +"6a2d5028": "getRaisedAmountOnToken(address)", +"6a2dda87": "SettingAutoGame_BettingRankRange(uint256,uint256,uint256)", +"6a2ddfce": "dragonsStatsContract()", +"6a2e882b": "getBlockLimit()", +"6a2f78a6": "submitStakeholderTransaction(address,bool)", +"6a2f9536": "calculateFraction(uint256,uint256,uint256)", +"6a30eb24": "hogsmashToken()", +"6a310bac": "bizp()", +"6a31c6df": "getAdjustedAccountValues()", +"6a327b7d": "getSupportManager()", +"6a333e51": "removeAvailablePack(uint256,bytes4)", +"6a33440a": "MANHATTANPROXY12THAVE()", +"6a3350c8": "invalidAirDrop(address)", +"6a33803b": "mintSaleTokens(uint256)", +"6a343df3": "allowPrice()", +"6a34480b": "MAX_INVESTORS()", +"6a357465": "payHours(address,uint256)", +"6a368486": "Ethraffle()", +"6a369137": "AfterSaleTransferableTime()", +"6a3845fe": "artTokenoken()", +"6a385043": "approveTokenTo(uint256,address)", +"6a385ae9": "getBalances(address,address[])", +"6a38c0fa": "DragonLock()", +"6a3a2119": "injectEther()", +"6a3b5aea": "setC4FContractProviderLock(address,bool)", +"6a3baaea": "newForge(bytes32,bytes32,address)", +"6a3bb8cc": "setFiscal(uint256,bytes32)", +"6a3c1198": "_projectCancelNew()", +"6a3c167b": "setInitialize(bool)", +"6a3c62a7": "beginReclaim()", +"6a3c7945": "RequestUpdated(uint256)", +"6a3d2a15": "AdvisorsAmount()", +"6a3d42ef": "ANT(address)", +"6a3d5a07": "AuctionCancelled(uint256,address,uint256)", +"6a3f3b97": "HolderBase(uint256)", +"6a3f5146": "auctionExpired()", +"6a3f79f4": "RaffleIssued(uint256,uint256,uint256)", +"6a3f89f4": "setProofImpl(address)", +"6a40515a": "enhancer()", +"6a40dbd6": "mintInvestor(address,uint256)", +"6a4113c7": "releaseLockFounders2()", +"6a41ade3": "walletCoreTeam()", +"6a420614": "setFreeCount(uint256)", +"6a420bbc": "setHaltPurchase(bool)", +"6a42b8f8": "delay()", +"6a4349a9": "getMicroModulesIds()", +"6a43aae7": "removeName(string)", +"6a43dc9a": "totalSupplyByLegacy()", +"6a4509f0": "paymentMax()", +"6a457ee9": "allocatedBonus()", +"6a470988": "getkEthPhiRate()", +"6a474002": "withdrawDividend()", +"6a47aa06": "halvingInterval()", +"6a48c04d": "GenExtWeightList(uint256,uint256,uint256)", +"6a4967d6": "addToWhitelist(address,uint256,uint8,uint8)", +"6a4987dc": "MARKETING_POOL_ADDR()", +"6a4a39e9": "presaleEndsAt()", +"6a4a6b6e": "_myAddressHelper()", +"6a4ad948": "setConvertionFee(uint256)", +"6a4aef9d": "fromReal(int256)", +"6a4b1b10": "setPresidenteDeMesaVerify(bytes32)", +"6a4b22da": "changeFallbackAccount(address)", +"6a4b27f4": "getRenter(address)", +"6a4b3eca": "checkBankBalance()", +"6a4b6aa5": "untrustedChildWithdraw()", +"6a4b8a3d": "BoxxToken()", +"6a4b96d5": "PledgePayed(uint256)", +"6a4c62ef": "getSecondUnionIds(bytes32)", +"6a4d4bb8": "getInvestorPosition(uint256)", +"6a4f5495": "test_0_ensureServiceRegistryFunctions()", +"6a4f8f39": "RNGenerator()", +"6a4fcddb": "Remyt()", +"6a502578": "totalSoldOnPresale()", +"6a50e3df": "PayWinners(address,address,address)", +"6a514db7": "REOToken()", +"6a51b918": "cities(uint256)", +"6a523c5e": "depositForUser(address)", +"6a5371b8": "nextTier()", +"6a537e40": "getCollectiblePrice(uint256,uint256)", +"6a5392d7": "generatedGze()", +"6a53ab64": "undestroyable()", +"6a53f98a": "pendingTxs(uint256)", +"6a54293a": "internalOwnerOf(uint256)", +"6a54932c": "processTransaction(address,uint256)", +"6a561c11": "ownerResumeGame()", +"6a561cb8": "testSender()", +"6a5690f6": "ICO_GOAL()", +"6a56947e": "transferVerify(address,address,address,uint256)", +"6a56a48b": "_getRandomMineralId()", +"6a570b98": "InGRedientToken()", +"6a585fa3": "tokensPerWei20()", +"6a596455": "getBatlordReq()", +"6a59d0a4": "transferAndLockForever(address,uint256)", +"6a59dc8c": "_unpackAgilityValue(uint256)", +"6a5a3625": "getTotalReqAmt(uint256[],uint256[])", +"6a5b0151": "setGasForKWH(uint256)", +"6a5b459c": "receivedWeiMin()", +"6a5bbc1d": "withdrawToOwner(uint256)", +"6a5c2cf2": "getTotalDividendsByAddress(address)", +"6a5c44a9": "STTadmin1()", +"6a5cf2d0": "WifiBonusCoin()", +"6a5d7206": "doSafeSendWData(address,bytes,uint256)", +"6a5da6e5": "followCampaign(uint256)", +"6a5e2650": "unlocked()", +"6a5e4628": "externalFundDAO()", +"6a5fd362": "shitFund()", +"6a61e5fc": "setTokenPrice(uint256)", +"6a625bc8": "issueToMany(address[],uint256[])", +"6a627842": "mint(address)", +"6a62936b": "PLUTUSTOKEN()", +"6a630559": "tokenLocked()", +"6a630ee7": "__transferWithReference(address,uint256,string,address)", +"6a63606c": "set_tokens_total(uint256)", +"6a63d2f9": "getLastestRequestFundID()", +"6a643ce6": "setBB(bytes32,bytes)", +"6a64790c": "toWholeShareUnit(uint256)", +"6a666c86": "addressToPunkIndex()", +"6a66a693": "beneficiaryContract()", +"6a67acc5": "getAuctionData()", +"6a67ec63": "minimum_buy_value()", +"6a68d2d5": "nextGamePotSplit()", +"6a69424b": "PaymentTimer()", +"6a6ae271": "assertPause()", +"6a6b8077": "StartICO()", +"6a6ba5d7": "addressIsCrowdsale(address,address)", +"6a6c526e": "AcceptsLYNIA(address)", +"6a6d31db": "externalEnter()", +"6a6e79bb": "WithdrawPaymentForTest(address,uint256)", +"6a6e88ba": "getBuyerInfoAt(uint256)", +"6a6f03a0": "returntrueifcurrentplayerwinsround()", +"6a704d7b": "AddedToGeneration(address,uint256)", +"6a7149f6": "changeAgency(address)", +"6a71a584": "getFreeAllowance()", +"6a71df43": "amountOfTokensPoolB()", +"6a7245ef": "changeBurnBoundsOperation()", +"6a7254a3": "specUWallet()", +"6a7283ac": "buyTokenFromGame(address,address,address)", +"6a7301b8": "setDestroyer(address)", +"6a7360d8": "updateNav(uint256)", +"6a7381bd": "TokensBought(address,uint256,uint256,uint256,uint256,uint256)", +"6a739a9b": "getTokensUnlockedPercentage()", +"6a739c44": "checkRegistrationStatus(address)", +"6a73de2c": "ZZZToken(uint256,string,uint8,string)", +"6a745ce9": "PRESALE_ETH_RAISE()", +"6a748ecf": "upLimit()", +"6a749986": "issuePreferedTokens(uint256,uint256)", +"6a749f6d": "indexshow2(address)", +"6a751710": "transferTraderBalance(address,address)", +"6a75f03d": "partnersAddress()", +"6a75fac0": "pullBack(address)", +"6a7625ca": "setRegionForSale(uint256,uint256,uint256)", +"6a76c522": "totalContractMiniGame()", +"6a7798ee": "EndAuction()", +"6a77e17a": "initialSeedFarmingAdress()", +"6a785191": "referralTokens(address,uint256)", +"6a7882f2": "requiredGoldIncreaseFactor()", +"6a7a88aa": "isValidSignature(address,address,bytes)", +"6a7b28a2": "show_the_minimum__reward_period()", +"6a7b988c": "votePopularity(bytes32)", +"6a7bf76a": "create_game(bytes32,uint32,uint32,uint8,uint16,uint8,address,uint256,bool)", +"6a7c09a0": "rewardPrivate()", +"6a7c0bae": "OWN_burnAddress(address,uint256)", +"6a7c0e81": "setBatchLimit(uint32)", +"6a7c4cdf": "H2G2()", +"6a7c594e": "CTVToken(uint256,string,uint8,string)", +"6a7d1a7e": "getPlayersUnitTickets(address)", +"6a7d3c1c": "FishbankChests(address)", +"6a7d6b52": "updateOldOwnerProfit(uint256)", +"6a7dabb9": "DEVCLASS_MAX_CARGO()", +"6a7eaf8f": "vestingRules()", +"6a7f0c69": "toTimestamp(uint256,uint256,uint256,uint256)", +"6a7f42e4": "closeBetByCanceling(uint256)", +"6a7fc8b7": "setDailyWithdrawLimit(uint128)", +"6a8141a1": "ParrotCoin()", +"6a816548": "cancelOrder()", +"6a81af17": "setConfigClass(uint32,uint8,uint8,uint8,uint32)", +"6a822760": "betB()", +"6a8269b4": "frozenList(address)", +"6a8296d7": "_setPrizePoolAddress(address)", +"6a833a6c": "addDelegateSigned(address,uint8,bytes32,bytes32,string,address,uint256)", +"6a83662e": "getYESVotesByEntity(uint256)", +"6a83b924": "btycownerof()", +"6a84e143": "destroyUnsoldTokens()", +"6a85ac88": "answerCompare(uint256,bytes32)", +"6a85d12e": "changeOuts(address)", +"6a85e252": "ElementTransferred(uint256,uint256,uint256,address,uint256,uint256,uint256)", +"6a868363": "CreatedVUP(address,uint256)", +"6a86a0f0": "DCCAdvancedToken(uint256,string,string)", +"6a871e27": "airDropHeight()", +"6a87f66d": "specialManagerOff(address)", +"6a8896b6": "getPots()", +"6a893a8c": "stopWorkInternal()", +"6a897999": "drainStack(bytes32,bytes32)", +"6a89a51e": "_delete_()", +"6a8aa343": "m_maxTotalSupply()", +"6a8ae136": "getContractBalance(address,address)", +"6a8b9f7b": "BecomeSpiderQueen()", +"6a8ba0fa": "createPromoPet(uint256,address,uint256,uint256,uint256,uint256)", +"6a8be019": "cancelEscrow(uint256,uint256,address,uint256)", +"6a8c2437": "totalRescues()", +"6a8c55b8": "_getSaleRound()", +"6a8c9cce": "BITMUZE()", +"6a8cdb52": "setBondAddress(address)", +"6a8d0bf4": "ReceiverChanged(uint256,address,address)", +"6a8d3575": "UniversalToken(uint256,uint256,uint256)", +"6a8d7eb3": "isLSNFT()", +"6a8d86db": "rawTransfer(address,address,uint256)", +"6a8e8711": "max_bet()", +"6a8ef2d3": "getMyShitClone()", +"6a8f91ff": "createAccount(bytes32,bytes32,address,address)", +"6a907a78": "UserAddTicket(bytes5[])", +"6a90ac63": "unlockWithdrawals(uint256)", +"6a91205a": "rentLand(uint256,bool,uint256)", +"6a91431e": "RefundableCrowdsale(uint256,uint256)", +"6a914911": "getPlayerByBoard(bytes32,uint8)", +"6a92a8b8": "UserAddressLoaded(bytes32,string)", +"6a92fcf6": "paymentEnable()", +"6a931aa8": "tokenVendor2()", +"6a93316c": "getInvestorStatus(address)", +"6a938567": "isValid(bytes32)", +"6a9412bd": "refundAvailable(address)", +"6a95dff4": "NOBSToken()", +"6a96c63e": "getCreateUnicornFullPrice()", +"6a98085a": "totalAmountToWhale()", +"6a9812f9": "getPolicyByTaxCode(string,uint256)", +"6a993130": "Ownables()", +"6a9b4daf": "Etros()", +"6a9b515d": "TokenAuctionCreated(uint256,address,uint256)", +"6a9ba3ce": "maxCapNotReached()", +"6a9c97d6": "refundSender(address,uint256)", +"6a9cd450": "upgradeKernel(address)", +"6a9d02e9": "tokenFrozenSinceNotice()", +"6a9d2afd": "playToWinTest(uint256)", +"6a9d69a7": "rentalTotalTime()", +"6a9d7629": "getOpenInterestInAttoEth()", +"6a9db57a": "playerAmountOfBets(address)", +"6a9dc9a8": "enrollUser(address)", +"6a9e8480": "FinalLottery(address)", +"6a9e8f27": "stockTransfer(address,uint256,uint256)", +"6a9ecd21": "BidFailedEvent(address,uint256,string)", +"6a9f9ff9": "isVisible(uint256)", +"6aa084d7": "getBoardStatus(uint256)", +"6aa0fd32": "performRebalance(bool,address,uint256,bool,uint256,uint256,address,bytes)", +"6aa179d9": "_secondRoundLosersFight()", +"6aa3141f": "removeCustody(address,uint256)", +"6aa31b1f": "starSell()", +"6aa3bf8b": "finishBetFrom(address)", +"6aa3e64d": "emptyTo(address)", +"6aa4b3cc": "calculateId(address,bytes32)", +"6aa52288": "FisrtSupply(address,uint256)", +"6aa5b37f": "maxBuyLimit()", +"6aa5cdfa": "setLatestEdition(uint8)", +"6aa633b6": "isEnabled()", +"6aa66cd4": "targetDiscountValue10()", +"6aa68a15": "phase2EndBlock()", +"6aa737e0": "enableSellToken()", +"6aa8e220": "WeaponRegistry()", +"6aa96d7c": "Storychain()", +"6aa9c59b": "_addMinions(uint32,uint8,uint64)", +"6aa9c82b": "withdrawControl()", +"6aaaae68": "tokensForFoundersAndTeam()", +"6aaab6f2": "updateTreasury(address,uint256)", +"6aaacb3f": "CreateCaptainToken(address,uint256,uint32,uint32,uint32,uint32,uint32,uint256)", +"6aab223d": "bonusMatchPayoutInPercent()", +"6aaba012": "ErrorGenerator()", +"6aabd369": "verifyGame(uint256,bool)", +"6aabe577": "getPuntos(uint256)", +"6aad1a6b": "adminSetGasLimit(uint256)", +"6aad70b6": "getAddTokenSignatures()", +"6aaee3f7": "biAdvance(uint32,uint64[2],uint64[2],int64[2],uint64)", +"6aaf0a0d": "endRegisterTime()", +"6aafb887": "getNewMaxProfit(uint256,uint256)", +"6aafd194": "Fosha(uint256,uint256,uint256,uint256,uint256)", +"6ab03a7f": "OGPToken()", +"6ab09a5e": "listUsersBets()", +"6ab15436": "price(bool)", +"6ab22536": "SMEToken(uint256,uint256,uint256,uint256)", +"6ab28bc8": "lockedAmount()", +"6ab368f8": "Burned(address,address,uint256)", +"6ab3846b": "updateEndTime(uint256)", +"6ab3c5bd": "KING_WIN_MULTIPLE_PER()", +"6ab4936d": "presaleFail()", +"6ab5bcd0": "withdrawedTokens()", +"6ab71276": "getOwners(address,uint256)", +"6ab76510": "bulkTransferFrom(uint32[],address,address[],uint256[])", +"6ab872f0": "setMaxBetThresholdPct(uint256)", +"6ab8bd2b": "POOH_TO_CALL_1PLUMBER()", +"6ab92ba7": "PEPL()", +"6ab9aa21": "MAX_REVENUE()", +"6ab9eb45": "getItemAllowancePrice(uint256,address,address)", +"6aba2a0d": "donatorBonus(uint256)", +"6aba899b": "refundStartTime()", +"6abac115": "getActiveState()", +"6abacfa4": "etherMasterWallet()", +"6abb4a50": "getPartner()", +"6abb51a5": "_completeTask(uint256,uint256)", +"6abc3fe4": "directMintAgent()", +"6abd3b88": "getWins(uint256,uint256,uint256)", +"6abf31eb": "confirmTransaction(address,uint256,uint256)", +"6abfbf6f": "allowTokenContract(address)", +"6ac084fe": "OrderFilled(address,uint256)", +"6ac0bf9c": "transferableSynthetix(address)", +"6ac0fe25": "BUYER_STEP_5_CANCEL(bytes32)", +"6ac26d3d": "executeAddMemberProposal(uint256)", +"6ac290e7": "getFirstReferrer()", +"6ac29bcc": "FBR()", +"6ac36029": "get_invester_length()", +"6ac3a100": "HLCN()", +"6ac47db5": "CloudbricSale(address,address)", +"6ac4d582": "registrants(uint256)", +"6ac4d97c": "createInitialCards(uint32,uint16,uint16)", +"6ac4e08b": "dynArrayFunc(int256[])", +"6ac4f8e4": "StocksAddress()", +"6ac50065": "getBidsByAdunit(uint256,uint256)", +"6ac50f2f": "sizeOfUserAddresses()", +"6ac54d62": "stopPreIcoAndBurn()", +"6ac54eb0": "posMint()", +"6ac59dd5": "setIcoParametersSet(bool)", +"6ac5db19": "max()", +"6ac6016f": "pepFarm(address,address,address,address,uint256)", +"6ac6205c": "addDataPoint(int256,uint256,bool,string)", +"6ac68f7f": "getBestBidder(uint256)", +"6ac777d3": "EEFucksToken()", +"6ac878f3": "multiTransferDecimals(address[],uint256[])", +"6ac96df8": "removeAddressesFromRole(address[],string)", +"6ac98840": "SGCC()", +"6acd58d4": "arrayIndexOf(address[],address,address)", +"6acd89f6": "Testerr()", +"6acd8e4a": "getAddedTime(uint256,uint256)", +"6acdf42b": "arrayOfNonTrivialAccounts(uint256)", +"6ace6dc8": "setApprovedBuyer(address,address,bool)", +"6ace7d87": "getLastCandidates()", +"6acf5cb3": "isUserKYCVerified(address)", +"6acfb852": "ZiggleToken()", +"6ad001a5": "metalworksCities(uint256)", +"6ad03feb": "GBTAddress()", +"6ad0d6ce": "_startNewRound(address)", +"6ad1246e": "content(string,uint256,uint256,address,uint256,uint256)", +"6ad1a6d5": "PauseTradable()", +"6ad1fe02": "sale()", +"6ad26611": "removeFee(address)", +"6ad2a0b3": "buildContract(address)", +"6ad34a7a": "BAILSToken(uint256)", +"6ad34dab": "getstartBlockNumber()", +"6ad35d1a": "CMO()", +"6ad38e61": "transmit(address,address,uint256)", +"6ad3f723": "getContentAddress()", +"6ad43a54": "setRateICO(uint256)", +"6ad44174": "getVolumebasedBonusRate(uint256)", +"6ad49245": "FundingManagerEntity()", +"6ad50ed4": "investmentEntryInfos()", +"6ad5b3ea": "walletAddress()", +"6ad60e3d": "BubbleToneToken(address)", +"6ad6d45b": "setLister(address)", +"6ad7541c": "Kokos()", +"6ad7aeb5": "BitsumCash()", +"6ad80326": "walletFounder3()", +"6ad95317": "batchInvests(address[],uint256[])", +"6ad95843": "icoUnitPrice()", +"6ada94e0": "setDataInt(string,string)", +"6adacb48": "priceStep4()", +"6adc674e": "WaltixToken()", +"6adcef6b": "payDividends(uint256)", +"6addb663": "tokenInfo()", +"6addc649": "weekBonuses(uint8)", +"6addf029": "setReferralRequirement(uint256)", +"6ade6cea": "currentstageplayer2()", +"6ade8aa2": "emptyWallet(address)", +"6ade9bd1": "tokensFortorch()", +"6adf3279": "leekStealOn_()", +"6ae00c4f": "ShareRoomDATA(address,string)", +"6ae0646a": "_computeRollFee(uint256)", +"6ae17283": "MinterAdded(address)", +"6ae1a976": "numAffirmationsSigned(bytes32)", +"6ae22740": "reward7()", +"6ae38577": "accPreICO()", +"6ae413ab": "updateWebappAddress(address,address)", +"6ae459bd": "bulkMint(address[],uint256[])", +"6ae4feed": "subtract(address,address,uint256)", +"6ae6151e": "acceptOffer(bytes32,address,uint256)", +"6ae6921f": "_addPayee(address,uint256)", +"6ae6b459": "setLockup(uint256)", +"6ae76777": "addressBounty()", +"6ae81ae1": "icoPhase3TimeBonusInPercentage()", +"6ae85216": "countAssets(uint256)", +"6ae85e0d": "isAddressNotVoted(address,address)", +"6ae8f49a": "WebCoin()", +"6ae8fefa": "NetareumToken()", +"6ae9eea8": "s39(bytes1)", +"6aea5f1b": "current_supply()", +"6aea6cce": "breakCompleteness(uint256,uint256,address)", +"6aeaef97": "inheritedView()", +"6aeb1ce7": "m_paymentChannels(uint256)", +"6aebbbd9": "subUIntValue(bytes32,uint256)", +"6aebc603": "Villj()", +"6aebff5d": "lccxTeamAddress()", +"6aec47b4": "getBalancesAgent(uint256)", +"6aec82b3": "setSalesPipe(address)", +"6aec95cc": "registerBalanceForReference(address)", +"6aedc282": "MarriageContract(address,address,uint256,string)", +"6aede5cd": "globalTimeVault()", +"6aedf1d1": "SupportAdded(address)", +"6aeeec7f": "_setStakingEpochDuration(uint256)", +"6aefef17": "test01CrowdsaleInit()", +"6af04a57": "newContractAddress()", +"6af1898a": "refundErc20(address,address)", +"6af1fdf7": "delegateTokens(address,uint96)", +"6af2da2f": "testKeyedHash()", +"6af41534": "withholdToken()", +"6af422fc": "RSPLT_H()", +"6af53f2f": "MaPToken2()", +"6af58d83": "getMin(uint256)", +"6af630d1": "DARKNODE_FEES_DENOMINATOR()", +"6af6b06f": "setNextLotteryTTMTokenId9(uint64)", +"6af6e64a": "VendorRegistry(address)", +"6af78ab1": "startWeekFour()", +"6af79112": "priceInWei(uint256)", +"6af7dbbe": "sendPriceRequestToOracle(bytes16,uint256)", +"6af81d6f": "_mintCategory(string)", +"6af91799": "totalTokenSaled()", +"6afa0381": "minInvestmentLimit()", +"6afa7b80": "toETH()", +"6afb434f": "getPreIcoInvestment(address)", +"6afb92a1": "MeepCoin()", +"6afbd04f": "Mintable()", +"6afc3474": "saleRoundsSet()", +"6afd767f": "addParticipant(address,bool)", +"6afe74c9": "test_oneValidEmptyAddress()", +"6afeada3": "finishBountyAt()", +"6afef23f": "submitPoliceReport(address,address,uint256,bytes,bool)", +"6aff1a64": "TIER2_PRICE()", +"6affdc39": "saleEndDate()", +"6affe07b": "CirclesTokenOffering(address,uint256,uint256,uint256,uint256,uint256,address)", +"6b0028b9": "initialSupplyInFrac()", +"6b007e4f": "logMarketFinalizedCalled()", +"6b015897": "minimumRewardWithdrawalLimit()", +"6b01acf5": "counterToTokens(uint256)", +"6b0235a0": "tla()", +"6b038742": "Archetypal()", +"6b03ed5f": "clearClaim()", +"6b041da2": "SEVENTNET()", +"6b04f110": "mint_for(address,uint256)", +"6b061d7a": "changeRestarTime(uint32)", +"6b06548c": "EarlyInvestorsTokensHolder(address,address,address)", +"6b068e01": "collectWorks(bytes32,bytes32)", +"6b069710": "scheduleCall(address,bytes,uint256,uint256,uint8)", +"6b06afe7": "getEcoSystemWallet()", +"6b06c3d4": "ActivateEscrow(uint256,uint256,uint256,uint256,address)", +"6b06ea88": "ElementToken(uint256,string,string)", +"6b06f908": "buyToken(string,address,uint256)", +"6b074a07": "isProvider(address)", +"6b08a833": "EDUTURN()", +"6b08f2ef": "convertForPrioritized2(address[],uint256,uint256,address,uint256,uint8,bytes32,bytes32)", +"6b091695": "getReward(address,address)", +"6b095ca1": "apply(uint256,uint256,bytes32,bytes)", +"6b097cd0": "KKOGToken()", +"6b0bfc80": "feedAndMultiply(uint256,uint256,string)", +"6b0c537b": "generateRequestId()", +"6b0c932d": "lastDay()", +"6b0c9d6a": "distributeA()", +"6b0cba9c": "getUniqHash()", +"6b0cc513": "_DifficultyCalulate(uint16,uint16)", +"6b0d0329": "getTicketInfo(uint256,uint256)", +"6b0dd90f": "getVote(address,uint256)", +"6b0dfb76": "getLandDefender(uint8,uint32)", +"6b0ead6a": "iudexIdToString(bytes32)", +"6b0f02e6": "firstExchangeRate()", +"6b0f182e": "changeCofounderA(address)", +"6b0f65d7": "indSeedDeposit()", +"6b1092f2": "ADV_BTY_SUPPLY()", +"6b11c87a": "RealEstateCryptoFundBounty(address)", +"6b11dabd": "MTYToken()", +"6b128b2f": "upgradeFinance(address)", +"6b12a7bf": "buyRealm(uint256,uint256,uint256)", +"6b13fabf": "SampleToken()", +"6b140854": "totalWinValue()", +"6b1426a4": "getWinners(uint256)", +"6b149aac": "Cryptassist()", +"6b14dfe1": "SPEED_STAT_MAX()", +"6b14ea36": "ASK_STAKE_RATIO()", +"6b153322": "activateCampaign(string,uint256)", +"6b15c47c": "tokenCalculate(uint256,uint256)", +"6b1781b6": "Emergency()", +"6b17864f": "CommunityPool(address,address)", +"6b1786bb": "cVideoCost()", +"6b178b90": "NBACoin()", +"6b178f47": "poolIssue()", +"6b190ee1": "MemeNetworkToken(address,uint256)", +"6b194a4a": "ALLOCATION_LOCK_END_TIMESTAMP()", +"6b1970ab": "TheCoin()", +"6b199471": "updateMasks(uint256,uint256,uint256)", +"6b19e692": "getPaymentSupply()", +"6b1ac900": "setPXLPropertyContract(address)", +"6b1af75e": "sendReward(address,address,uint256)", +"6b1b3997": "ChronoDragonPowerCoin()", +"6b1b68ad": "URMBToken(uint256,string,string,address)", +"6b1bfd33": "setFundAccount(address)", +"6b1c86fe": "sendBreakup(address)", +"6b1cb549": "orderMatch(uint256,uint256,uint256,int256,uint256,uint256,address,uint8,bytes32,bytes32,int256)", +"6b1d4db7": "ethToTokenSwapOutput(uint256,uint256)", +"6b1da364": "getWinnerInfo(uint256)", +"6b1e0420": "blockPendingTx(uint256)", +"6b1e564a": "challengeWinningOutcome(bytes32,uint16)", +"6b1f513b": "makeDailyInvest(uint256)", +"6b1f78c8": "joinSqr(uint256)", +"6b1fbfdb": "sendWithSignature(address,uint256,uint256,bytes,uint256,bytes)", +"6b1feeeb": "get_my_sig()", +"6b212960": "offer(address,uint256)", +"6b2148c2": "Deluxo()", +"6b21a636": "startDisbursement()", +"6b227a8f": "OrderApprovedPartTwo(bytes32,bytes,address,bytes,address,uint256,uint256,uint256,uint256,uint256,bool)", +"6b2327d2": "previewStageEndTime()", +"6b2351aa": "lockWithAfter(address,uint256,uint256)", +"6b235bdc": "ChangeBeneficiary(address)", +"6b236730": "solveChallenge(bytes32)", +"6b24d827": "WalletHolder()", +"6b252b47": "advisorsWallet()", +"6b256f57": "DAOSecurity(address,address,bytes,uint256,uint256,uint128)", +"6b259690": "feesPool()", +"6b263efa": "multiOwnableCreator()", +"6b270056": "Corporation()", +"6b27909d": "getStopLockTime()", +"6b27be9f": "mayorcoin()", +"6b281b64": "totalBalanceUp()", +"6b28d7a2": "blockTransfer()", +"6b28f834": "getPeggedTokenCount(address,address)", +"6b298df0": "disbursements(address)", +"6b2a2691": "winBrickReturn()", +"6b2a77ed": "End5()", +"6b2a86be": "dropToken(address[])", +"6b2accac": "toDRP(uint256)", +"6b2ae2ab": "Notify_String(string,string)", +"6b2bb92a": "finishTournament()", +"6b2c0f55": "removePauser(address)", +"6b2c116c": "AmateurPlatinumToken()", +"6b2cd752": "getGpgKey()", +"6b2ce4ce": "stakeForDuration(address,uint256,uint256,bytes)", +"6b2ce7f1": "togglePresale(bool)", +"6b2d95d4": "getLockedTokens(address)", +"6b2e36b0": "canUpdateAmountToTakeAsRake()", +"6b2ec90f": "_vestedDown(uint256,uint256,uint256,uint256)", +"6b2ed1c0": "sellFci(address,uint256)", +"6b2f4632": "totalEthereumBalance()", +"6b2f65b0": "isArtist(address)", +"6b2f68f5": "assertEq22(bytes22,bytes22)", +"6b2f73c2": "preICOLedger()", +"6b2fa6cc": "lastBlock_v7Hash_uint256()", +"6b2fafa9": "getHash(uint256)", +"6b2fd0e7": "catGenes(uint256)", +"6b3032c6": "getSingleGuessInfo(uint256)", +"6b308ee7": "subTourFreezingPrice()", +"6b30f243": "VCChainToken()", +"6b318270": "addFile(bytes32)", +"6b319f36": "tokenUnfreezeTime()", +"6b31ee01": "jackpot()", +"6b32bb25": "containsValue(address,uint256,string,uint8[])", +"6b32c591": "userClaimAmt()", +"6b334e49": "senderCheck(address,address)", +"6b335b8c": "buyXname(uint256,string)", +"6b33aeb8": "YSH()", +"6b33e45d": "setWithdrawTo(address)", +"6b3416b5": "transfer(uint256,uint256,uint256,uint256,uint256,uint256)", +"6b342eb8": "_minimumBuy()", +"6b3559e1": "mintAndSetData(address,uint256)", +"6b3578f2": "paymentEnabled()", +"6b35bed2": "addAirdropParticipants(address[])", +"6b35f7c1": "deleted()", +"6b36028e": "setReferenceType(bytes32,string)", +"6b361c80": "TokenPriceUpdated(uint256)", +"6b36a76e": "MIPCoin()", +"6b3868db": "getMemberByIdx(uint256)", +"6b3905c4": "getNextVestingTime(address)", +"6b392680": "setFeeAmount(uint256)", +"6b3a87d2": "WatchWinningPot()", +"6b3a8e90": "tournamentJackpot()", +"6b3ac430": "crowdsaleLive()", +"6b3ad4f8": "setColorWhite()", +"6b3b1d17": "tHasBeenPenalized(uint256,address)", +"6b3b261c": "addSpaceshipMoney(uint256)", +"6b3bc4b6": "ovcPerEther()", +"6b3c9757": "advisorSecondLockTime()", +"6b3ce49b": "getRoomBalance(uint256,uint256)", +"6b3cedd6": "mintTokensForCrowdsaleParticipants(address[],uint256[])", +"6b3d998c": "Apputoken()", +"6b3e2f97": "updateDiamond(string,string,string,string,string,uint256,uint256,string)", +"6b3e8ca0": "setPrePresaleTokens(uint256)", +"6b3ec0ac": "vestingExists(address)", +"6b3f5f84": "OwnerReclaim(address,uint256)", +"6b3f94ab": "GoldMintToken()", +"6b3fb674": "noHash()", +"6b3fdc5a": "oraclize_setNetwork(uint8)", +"6b3fdf16": "EXT_COMPANY_THREE()", +"6b3ffb91": "changevanity(string,address)", +"6b404955": "depositDelta()", +"6b407837": "sellerRequestCancel(bytes16,address,address,uint256,uint16)", +"6b4097b2": "_runAdvanceClock(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"6b40bba1": "requiredPeriodSeconds()", +"6b424d47": "h2g2()", +"6b425093": "sortTopPosts()", +"6b433ccf": "_totalLandholderTax(uint256)", +"6b440e9a": "finalAllocation()", +"6b441abc": "VIRTUALTALK()", +"6b453fac": "hardWeiCap()", +"6b454d4c": "next_item_index()", +"6b45adf3": "cellsOf(address)", +"6b45c9f2": "getPiece(uint256)", +"6b462936": "transferQueue(address[],uint256[])", +"6b4660f8": "getStockLength()", +"6b46c8c3": "payoutAmount()", +"6b475df7": "release6m()", +"6b486818": "hashFirst()", +"6b489028": "DEVCLASS()", +"6b4a6ded": "TOKENS_PER_ETHER()", +"6b4a8b78": "token_allowance(address,address)", +"6b4b1f3a": "stringToAddress(string,address)", +"6b4b63fa": "Bank_With_Interest()", +"6b4bfeae": "checkClaimExpiry()", +"6b4c0789": "freezeContract(bool)", +"6b4c5856": "WyeContract()", +"6b4ca2a8": "getMatchData()", +"6b4dd158": "getPrice(bytes)", +"6b4dff1f": "validateGasPrice(uint256)", +"6b4e243d": "callOperator(address,address,address,uint256,bytes,bytes,bool)", +"6b4e8bb0": "lastInflationUpdate()", +"6b4ed21b": "holdersCount()", +"6b4f518a": "preICOTokenReward()", +"6b4f6865": "unlockForWork(address,address,uint256)", +"6b50b6b3": "_multiSigWallet()", +"6b512327": "_deleteIPFSHash(bytes32)", +"6b516ef0": "_handleDeposit(address)", +"6b523b68": "periodCrowdsale()", +"6b52a071": "SALE_FUNDS_ADDR()", +"6b52a86f": "DesTokenSale(address,address)", +"6b5396dc": "batchPresaleVesting(address[],uint256[],uint256[],uint256[],uint256[],uint256[])", +"6b5424b3": "HACHIKO()", +"6b54821f": "setupAuthentication(address,bool)", +"6b550dd3": "setAgriChainDocuments(address)", +"6b55264d": "setRegionName(uint16,string)", +"6b55ddd0": "getJobEmployerName(uint256)", +"6b55e991": "transferEther(address)", +"6b56476b": "removePost(address,address)", +"6b5648f5": "enabledMint()", +"6b565345": "CANAToken()", +"6b57825c": "getCurrentUserTotalPromoBonus()", +"6b57cb34": "lockedStagesNum(address)", +"6b584b10": "testFreeSpace()", +"6b588775": "rateOfSpecificTier(uint256)", +"6b58b2bc": "calculateInternalTokensAmount(uint256,uint256,uint256)", +"6b590248": "getDigit()", +"6b59084d": "test1()", +"6b59f495": "tokenized()", +"6b5a61ac": "changeTeamNIMFAAddress(address)", +"6b5ae41c": "execute0(address,uint256,bytes)", +"6b5aed93": "executeTransfer(string,string,uint256,uint256)", +"6b5b6285": "PBKtoken()", +"6b5bbf5f": "setCommunityMultisig(address)", +"6b5c4b16": "dateRelease12()", +"6b5c5f39": "croupier()", +"6b5c8fba": "confirmParties()", +"6b5ca27d": "finalizeCampaign(uint256)", +"6b5caec4": "setBot(address)", +"6b5cd8d0": "getWeaponDamageFromTokenId(uint256,uint256)", +"6b5d18fd": "getProposedIpfs(bytes32)", +"6b5d3287": "sellTokensForUsd(string,address,uint256,uint256)", +"6b5de05a": "tokensForTournament()", +"6b5e1a18": "payoutThreshold()", +"6b5e3ca4": "StaffWallet()", +"6b5e7b06": "getPenndingBalances()", +"6b60386d": "init(uint256,uint256,address,address,address,uint256,uint256,address,uint256,bool)", +"6b6093c2": "FreezeBalances(address)", +"6b61c3c7": "acceptBet(bytes32,bytes32,bytes32,bool)", +"6b628816": "getYumerium(address)", +"6b6292d9": "securityTokensPercent()", +"6b62cb1b": "createName(bytes32,address)", +"6b62cd65": "bankerAllDeposit()", +"6b634440": "tokensForPartners()", +"6b63d145": "OWNER_TOKENS_PERCENT()", +"6b6438cc": "payoutCursor_Id_()", +"6b64c769": "startAuction()", +"6b655e45": "getJuryMembers(uint256)", +"6b6566f0": "DiceOffline()", +"6b65a834": "ratePlanIsExist(uint256,uint256)", +"6b65be60": "usedPositions()", +"6b668601": "preSaleConversionRate()", +"6b676966": "tokenNeedForBonusLevel1()", +"6b683896": "getImplementation(string)", +"6b6872c7": "OeTestCoin()", +"6b68db6a": "FipsData(bytes20,address,bytes)", +"6b68dd4b": "tokensOfOwnerWithinRange(address,uint256,uint256)", +"6b693027": "collateralizations(address,uint256)", +"6b698377": "DogecoinPrivate()", +"6b69ac58": "upgradeHealth(uint256,uint256)", +"6b6a08dc": "hashRevealedPositions(uint32,int64[])", +"6b6a53fa": "testThrowsRestartNotOwner()", +"6b6b2740": "RetailLoyaltySystemBase(uint256,string,string,uint8)", +"6b6c5a7e": "getBracketData()", +"6b6cc239": "isMaintenanceMode()", +"6b6d294e": "worldCupResultPart3()", +"6b6d5c82": "encryptedBallots(uint256)", +"6b6e71b9": "makeTransaction(address,uint256,uint256)", +"6b6ece26": "ban(uint256)", +"6b6ee875": "tokenSealer(uint256)", +"6b6ef0ed": "transfer0(address,uint256)", +"6b6f4826": "minInvestmentICO()", +"6b6f4a9d": "discount()", +"6b7006d7": "lockMana(address,uint256)", +"6b709a36": "lockWorker(address,address)", +"6b7128ec": "getBetCount(uint256)", +"6b71d93b": "VerifiedProxy(uint256)", +"6b722a32": "christmasTree()", +"6b727312": "easyCommit(uint256,uint256,uint256)", +"6b7285d7": "transferP2P(uint256,address)", +"6b74401a": "BuyTokensDirect(address,uint72,uint88,uint88)", +"6b74c3d8": "getTxn(address,uint256,uint256)", +"6b755aa2": "reCommentRewardPool()", +"6b764632": "KongToken()", +"6b76484e": "swap(address,address)", +"6b76bd94": "CreateUser(string)", +"6b78aa08": "MarketHub(uint256)", +"6b790be4": "getWeightMinusFees()", +"6b792c4b": "emergencyWithdrawETH(uint256)", +"6b7976c8": "calculateObtainedINA(uint256)", +"6b7a247e": "setlvlSign(string)", +"6b7ae8dc": "foundationWallet()", +"6b7ae8e6": "left74(uint256)", +"6b7b0472": "getLastHash(bytes10)", +"6b7c0379": "HOPPToken()", +"6b7cc44f": "detail()", +"6b7d5205": "Diamond()", +"6b7d5dfd": "setTangibleAssetDisbursementAddress(address)", +"6b7d90ff": "unVerifyKyc(address)", +"6b7d9a5c": "createPromoPuppy(uint256,address,uint16,uint16,uint16,uint16)", +"6b7db8fc": "sendDividend(address,uint256)", +"6b7e4175": "EphronIndiaCoinICO(address,address,address)", +"6b7eba7d": "instantTransfer()", +"6b7f3a32": "Jojo(uint256,string,uint8,string)", +"6b7fad1b": "ethToDividendsNeeds()", +"6b7ffb92": "revote()", +"6b802108": "checkValidSignatureAndMethod(address,bytes)", +"6b8184e2": "ImpeachmentAccepted(address)", +"6b8263ed": "resumeOffering()", +"6b8287a6": "getetherpriceinUSD(address,uint256)", +"6b8393dd": "getSold(address,uint256)", +"6b845d7e": "updateWithdrawalMode(uint32[])", +"6b847dc0": "setDayWithdraw(uint256)", +"6b8487be": "GigToken(bool)", +"6b84dfcd": "setTransferRight(address[],address[])", +"6b863578": "noVoteSum()", +"6b872309": "x(address,uint256,address,uint256,bytes32,bytes32)", +"6b87d9f7": "BUBBLEToken()", +"6b881724": "assetWallet()", +"6b886888": "isTemporary(bytes8)", +"6b88719a": "PHOENIX_CORSAIR_FTL_SPEED()", +"6b889cce": "call_test()", +"6b88f4ae": "resetIndex(uint256)", +"6b89be03": "getActiveShareholdersArrayLength()", +"6b89bfc7": "getStatusOf(address)", +"6b8ab97d": "reset(address)", +"6b8b3268": "mintCrown(uint256)", +"6b8c261e": "prizeByNow()", +"6b8c4c48": "setDaxInBtcSatoshi(uint256)", +"6b8c7180": "setupPeriodForPreSale(uint256,uint256)", +"6b8cc89d": "INVESTMENT_USER2()", +"6b8ce30e": "partnerInfo_for_Owner(address,bytes32,uint8,bytes32,bytes32)", +"6b8da9a2": "tgrLive()", +"6b8f155a": "numberWhitelisted()", +"6b8f9c43": "setPayoutWallet(address)", +"6b8fd600": "priceOfElements(uint256[])", +"6b8fe0f0": "NewPlayer(address,uint256)", +"6b8ff574": "getName(uint256)", +"6b90ce93": "simulated_snt()", +"6b915d43": "melonToken()", +"6b9168e6": "clearAngelsFromBoard(uint16)", +"6b919488": "removeOwner(uint256)", +"6b930927": "preTgeTokenSupply()", +"6b931cad": "replaceAdministrator(address,address)", +"6b944bd6": "GoBlock()", +"6b946680": "parentKidsLink(uint256,string,string)", +"6b94692a": "isPresaleBuyer(address)", +"6b95767d": "giftSpaceship(uint16,address)", +"6b962c27": "transaction_internal(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[4])", +"6b963f20": "changeOVISReservedToken(uint256,int256)", +"6b96668f": "setRateContract(address)", +"6b97be1f": "transferPayable(uint256)", +"6b97c6d7": "_transferOwnershipOfItemsStorage(address)", +"6b97e5eb": "UnicronToken()", +"6b9808a1": "buyWine()", +"6b98419a": "_approveFor(address,uint256)", +"6b9896ba": "AddAccountsInfo(address,uint256)", +"6b98c85c": "bltMasterToSale()", +"6b98d78c": "setLandSlogan(uint256,string)", +"6b99a13e": "editNumber(uint256)", +"6b9a1db9": "wanUnit()", +"6b9b1006": "TransactionRecorder()", +"6b9b2679": "setReserveForFoundersFirst(address)", +"6b9c1d22": "managementFeeWallet()", +"6b9c6116": "PULSCrowdsale()", +"6b9c9b9c": "TerraByte()", +"6b9cadc1": "isValidMsgValue(uint256)", +"6b9cf534": "_minimumBuyAmount()", +"6b9da657": "sendNewEntry(string)", +"6b9db4e6": "getLock(address)", +"6b9f96ea": "flush()", +"6ba0b4f2": "isKnownSelector(bytes4)", +"6ba0b8bc": "getBonusPercent(uint256,uint256)", +"6ba0f114": "EtherChain()", +"6ba15807": "evntCreateContract(address,address,address,address,uint256,string)", +"6ba20015": "maxplayers()", +"6ba2482d": "GetUserNickName(address)", +"6ba2aefc": "transferMultisig(address,address,uint256)", +"6ba42aaa": "isKeeper(address)", +"6ba44d3c": "get_address(string)", +"6ba47299": "buyDiscountTTWByETH(uint256,address)", +"6ba4c290": "modifyEscrowPrice(uint256,uint256,uint256)", +"6ba4f143": "_setAuraValue23(uint256)", +"6ba4fadb": "changePhaseToPreICO2()", +"6ba55c6d": "coinIssuedFoundation()", +"6ba5ef0d": "setMin(uint96)", +"6ba6984c": "setHBT(uint256)", +"6ba6e2e0": "TGCToken(address)", +"6ba75608": "claimAssetPack(uint256)", +"6ba7d28a": "checkVestingWithFrozen(address)", +"6ba7e31c": "PriceSet(string,uint64,uint8)", +"6ba7ffd5": "requestCnt()", +"6ba8d421": "transferHackoinTokenOwnership(address)", +"6ba951c4": "EtherModifierTigro()", +"6ba9a40b": "withDrawBalance(uint256)", +"6ba9fd38": "openMinting()", +"6baa0f8e": "createSystemAuction(uint256)", +"6baa2ff7": "preSale(address,uint256)", +"6baae8e5": "_prand(uint256)", +"6bacc0fa": "hasSaleEnded()", +"6bacdc87": "InterestFreeLending(address,address,uint256,uint256)", +"6bacfe43": "getCCH_edit_16()", +"6bad77e1": "getNumProducts()", +"6bad8ed8": "freezingPercentage()", +"6bae05cf": "preRegister(address)", +"6bae116f": "getBonusMultipierInPercents(uint256)", +"6bb0ae10": "print(uint256)", +"6bb15940": "getCurrentSaleRate()", +"6bb1605b": "filehash()", +"6bb164c9": "isCantonEmployee(address)", +"6bb20f9b": "searchWhitelist(address,address)", +"6bb27584": "capRound1()", +"6bb2c12f": "createRequest(address[4],address,uint256[12],uint256,bytes)", +"6bb3130e": "disbursementWei()", +"6bb35840": "PowerGiggs()", +"6bb3c065": "round4Sold()", +"6bb4cf76": "createToken(string,string,uint8,address[],uint256[],uint256[])", +"6bb4d573": "evMinTokensReached(address,uint256,uint256)", +"6bb50f4c": "_openGamePlayNo(uint256)", +"6bb53c90": "ticket(uint256,uint256,uint256,uint256,uint256)", +"6bb56e8b": "crowdsaleEth()", +"6bb60475": "_insertSortMemory(uint32[11])", +"6bb6126e": "exec(address)", +"6bb6ea30": "createInterceptor()", +"6bb72c97": "numTokensInLottery()", +"6bb7b7a4": "rare()", +"6bb7f336": "updateUnsoldTokens()", +"6bb7f98e": "getHighestMilesOwnerAt(uint256)", +"6bb80acc": "_createCovfefe(string,string,uint16,address,uint256)", +"6bb80d51": "dividendPercentage()", +"6bb82e82": "addToWhitelist(address,uint256,bool)", +"6bb9b9ab": "getTodayDividendsByAddress(address)", +"6bba3f2f": "kappa()", +"6bba5c15": "changeParameters(uint256,uint8,uint256,uint256,uint256)", +"6bbadf09": "addPokemonDetails(string,uint256,uint256)", +"6bbae823": "LIMIT_STAR4()", +"6bbbc182": "addVerified(address[])", +"6bbbec85": "updateGameMeta(uint256,string,string)", +"6bbc5748": "FeeChanged(uint256)", +"6bbe0410": "NewTransaction(string,uint64,string,uint64,uint8)", +"6bbe24d4": "dataSourceGetQuarterResult(uint256)", +"6bbe6f7f": "buyCoinsPreview(uint256)", +"6bbea781": "getApproveValueFor(address)", +"6bbeb9de": "loginUser(address)", +"6bbeba8a": "setService(bytes,address)", +"6bbf54a4": "PCF()", +"6bbf592d": "bytesCallWithArray(bytes32[4])", +"6bc02730": "approveBreeding(address,uint256)", +"6bc0b3ba": "jackpotAddress()", +"6bc0f7fb": "isProxyLegit(address,address)", +"6bc138f6": "getNumberOfIds()", +"6bc1f1e4": "updatePriceAndInventories(uint256,uint256,uint256,uint256,uint256,uint16)", +"6bc21808": "CategoryAuction(address)", +"6bc2805d": "cancelAllEnter()", +"6bc31311": "EFFCoin(address)", +"6bc32c7b": "get_train_data_length()", +"6bc344bc": "payforflag(string)", +"6bc388b2": "canFreeze(address)", +"6bc3b437": "newService(string,string)", +"6bc3e0f0": "verifySecondHalf(uint256[4],uint256[4],uint256[4])", +"6bc3e4a8": "claimMultiple(address,uint256)", +"6bc46fb2": "totalHatcheryShrimp()", +"6bc5063c": "VestedTokensReleased(address,uint256)", +"6bc507b1": "getBlackflag(uint256,address)", +"6bc59f13": "transferFromChangeAllowanceTest(address)", +"6bc5b964": "getMemberWhisper(address)", +"6bc5c0cd": "releaseBonus()", +"6bc6147e": "unlockMainSaleToken()", +"6bc64e0f": "preSaleEnd()", +"6bc65778": "getAllProductList()", +"6bc789cd": "getONG_AUDIT(bytes32)", +"6bc85107": "isMemberInDescendant(address,bytes32)", +"6bc8a260": "getUserWinInTournament(uint256)", +"6bc99824": "VoltToken()", +"6bc9b0d7": "getPromiseIds(uint256,uint256,address,bool)", +"6bca81d4": "revealBid(bytes32,address,uint256,address,address,bytes32,uint256,uint256)", +"6bcaaed9": "PetmancoinToken()", +"6bcab76c": "setDApp(address)", +"6bcc035a": "getStatusAndOutcome()", +"6bcc28a9": "kittensRemainingToDrop()", +"6bcc311c": "tokensForBonus()", +"6bcc7241": "getPriceWei(uint256)", +"6bce23be": "setupTokenRate(uint256)", +"6bce6569": "reservedPercentTotal()", +"6bce8a96": "whitelistedAddressCount()", +"6bceead7": "setSquareWins(uint256,uint256,uint256)", +"6bd0021c": "bonusPhase()", +"6bd31a56": "hardCapLowUsd()", +"6bd37274": "Pixiu_Beta()", +"6bd3a1c3": "PresiamDrop()", +"6bd3d406": "totalPresale()", +"6bd46bd2": "setTokenBurnFeeReceiver(address,address,address,address)", +"6bd484c4": "oracleCallbackGasLimit()", +"6bd4dfce": "setStarterClass(uint256,uint32)", +"6bd5084a": "number_of_claims()", +"6bd50cef": "getConfiguration()", +"6bd58db5": "Total_Patient(uint256)", +"6bd5e26a": "lockTo(address,string)", +"6bd61a66": "nonHighestBidderRefund()", +"6bd6775f": "Presale(address,address,address,address,uint256,uint256)", +"6bd68a8f": "referralAmount()", +"6bd70a1f": "MIN_IVESTMENT()", +"6bd7e7dd": "CatBought(uint256,uint256,address,address)", +"6bd7eeeb": "maximumTokensForFirst()", +"6bd87c86": "Try2222()", +"6bd8fd12": "currentMinBid()", +"6bd92f7c": "activateAllowanceRecord(address,address)", +"6bd9b4da": "setMinETHin(uint256)", +"6bda3422": "Token(uint256,string,string)", +"6bdaa520": "forciblyRequest_callback()", +"6bdbc918": "BaseTransactionService(address,address)", +"6bdbf8e6": "concat()", +"6bdc06f5": "cancelRegistration(address)", +"6bdc1d2a": "GoldRex()", +"6bdc62b9": "composeJingle(string,uint256[5])", +"6bdc9546": "setCommunicationUri(bytes32)", +"6bdcdb2d": "getAutomatedReportDueTimestamp()", +"6bdcdeaa": "setMagicStore(address,address)", +"6bdd44aa": "createCard(string,uint256)", +"6bde2e7f": "_setBodyColorValue3(uint256)", +"6bdea7eb": "AddBonus(uint256)", +"6bdebcc9": "destory()", +"6bdee200": "enableTicker()", +"6bdee235": "Zeroexchange()", +"6bdfd723": "getNewEnglandBets(address)", +"6be00229": "exitAddress()", +"6be03bd2": "configTimeInc()", +"6be050d2": "FibokenUsed(uint8,address,uint256)", +"6be0c670": "chipSize()", +"6be13c92": "coldWallet()", +"6be202cf": "addSomeDETsTo(address,uint256)", +"6be24a47": "create(address,address,address,address,address,address,address,string,string,string)", +"6be2f28e": "totalAmountOfWeiCollected()", +"6be32e73": "tokenCallback(address,uint256,bytes)", +"6be343cc": "setFoundAcc(address)", +"6be39bda": "getTerms(bytes32)", +"6be4097c": "currentLotteryId()", +"6be422b2": "determinReferrer(address)", +"6be47418": "latchFciUserController(uint256,address)", +"6be47618": "deleteContract(uint8[],bytes32[],bytes32[])", +"6be4cf1f": "buyTokensFor(address)", +"6be4d9b0": "changeResolverAllowances(address[],uint256[])", +"6be505f5": "selectWinner(bytes32)", +"6be598b4": "SIGTToken()", +"6be5f4a6": "checkVictoryByScore(uint256)", +"6be60f8b": "underwrite(uint256)", +"6be67db3": "contractNameUpdate(string,bool)", +"6be6fa14": "getTransferFromValueValue()", +"6be7eeba": "Vtoken(uint256,string,uint8,string)", +"6be80de7": "investorIDs(address)", +"6be82168": "NeycoinToken()", +"6be86f21": "bonussale_TokesSold()", +"6be9564a": "ListingBought(bytes5,uint256,uint256,address)", +"6be99794": "getTransferToValue()", +"6be9a8df": "GetGuestQueueNumber()", +"6be9f7a0": "emitDeposited(address,uint256,address)", +"6bea0b79": "getAccountData(address,string)", +"6bea8215": "createGenerator(uint256,string,uint256,uint256,uint256)", +"6bea989d": "AUTH_FREEZEACCOUNT()", +"6bea9d81": "BLOCKPIX_Coin()", +"6beace8f": "AllocateFounderTokens(address,uint256)", +"6beadfc7": "approveandcall(address,uint256)", +"6beb509d": "updateCanRefund(bool)", +"6bec32da": "mintToken(address,address,uint256)", +"6bec454a": "buyCity(uint256)", +"6bec51cc": "generate(address,address,uint256)", +"6bece548": "preSaleBonus1Time()", +"6bed09be": "buyTokensUpdateState()", +"6bed6de5": "sendObjectWithApproval(uint256,address)", +"6bedb845": "MultiSig()", +"6bee2cc3": "registerLottery(uint256)", +"6bee5131": "FW(uint256,string,uint8,string)", +"6bee73db": "testAllowance()", +"6bee76ea": "withdrawBond(address,uint256,uint256)", +"6bee9cfa": "offsetFeeRate()", +"6bef2a94": "earlyPurchaseTokenAmount()", +"6bef90f8": "VUP_PER_ETH_BASE_RATE()", +"6befa297": "WCT1(address)", +"6bf006c8": "capReached(uint256)", +"6bf06fde": "transferToNewContract(address,uint8,bytes32,bytes32,bool)", +"6bf0873a": "birth(uint256,uint64[])", +"6bf0a3bf": "LIQUID_ALLOCATION_PPM()", +"6bf0c7fd": "getBracket(address)", +"6bf0f4a1": "roll(uint8)", +"6bf13959": "endAtCheck(uint256)", +"6bf20a77": "unfrozenATAccount(address,address)", +"6bf2606a": "PATCH_VERSION()", +"6bf30259": "checkIncentivisingBalance()", +"6bf32504": "markAsFailed(string)", +"6bf341e7": "_fundowner()", +"6bf4223b": "getRoundEnd(uint256)", +"6bf42646": "holdTokenInvestorsCount()", +"6bf42ea5": "TokensBought(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"6bf4398d": "saniwallet()", +"6bf51a18": "stepLockCheck()", +"6bf52ffa": "Vote()", +"6bf5595d": "CrowdSale(uint256,uint256,uint256,address)", +"6bf6dd6f": "associate(bytes32,bytes32[],address[])", +"6bf807fc": "unlockTimes(address)", +"6bf82d74": "ethFundMain()", +"6bf84e51": "BECEXTEAMTOKENS()", +"6bf8b92d": "changeSeed(uint32)", +"6bf8bfab": "DutchAuction(address,uint256,uint256)", +"6bf8f85a": "forceFinish()", +"6bf91c63": "configOf(uint64)", +"6bf99bbf": "ICOResumed(uint256,uint256,uint256,uint256,uint256)", +"6bf9b3e7": "approveWithdraw(address,address,uint256)", +"6bf9b731": "claimFor(address,address,address)", +"6bf9e633": "winnerIsA()", +"6bfa379e": "readyTokens(address)", +"6bfa5edc": "operatingOfficerAddress()", +"6bfaa903": "increaseOwnershipTokenCount(address)", +"6bfae928": "calcReserve(uint256,uint256,uint256)", +"6bfb0d01": "itemCount()", +"6bfbbdf5": "DutchAuctionToCraft(address,address,address)", +"6bfbc9f7": "HongToken(uint256,string,uint8,string)", +"6bfbf5e6": "levelChanger()", +"6bfc8bb5": "setIPFSHash(bytes32,string)", +"6bfc9561": "sellStake()", +"6bfd9716": "SaleTracker(bool)", +"6bfdb7eb": "getBeneficiary(address,address)", +"6bfdd3dd": "_sanMint(uint256,address,string,string)", +"6bfe6bc0": "setEthPricies(uint8)", +"6bfee863": "CipherToken(uint256,string,string)", +"6bff1901": "coreTeamSupply()", +"6bff6575": "DaysToNextDestroy()", +"6c00161a": "distributeWithMilestone(address,uint256,uint8)", +"6c00bb44": "AuctionSuccessful(address,uint256,uint256,address)", +"6c012923": "feeForSplitterCreation()", +"6c021968": "RefundTransfer(uint256,uint256,uint256,address)", +"6c026f59": "ii()", +"6c02a931": "tokenName()", +"6c0360eb": "baseURI()", +"6c03cd49": "getInviteRate()", +"6c04066f": "BlockLockSet(uint256)", +"6c042689": "endStage1()", +"6c043773": "sendPacket(address,bytes)", +"6c047c36": "evaluateProposalMetricStart(uint256)", +"6c049b89": "toggleCrossForking()", +"6c04c1c9": "LuckyEthereumLotteryToken()", +"6c050eae": "look()", +"6c052cd8": "getGroupMembers(bytes32)", +"6c054113": "setPhaseSale(uint256,uint256,uint256)", +"6c054ad0": "createContractor(address,address,bool,address,string,string,bool)", +"6c055ce2": "withdrawToPartner(address,uint256)", +"6c060a7a": "_batchPopularitySetting(uint256[],uint8[])", +"6c062806": "addAdminAddress(address,address)", +"6c062cc7": "Forge()", +"6c064d63": "_setCompositionPrice(uint256,uint256)", +"6c08729e": "TransferToSAToE(address,uint256)", +"6c08faf7": "getCaseCount()", +"6c096192": "fetchCreatedOrdersForPayer(address)", +"6c0a1117": "doCancelAll()", +"6c0a1605": "EthTurnWCG(uint256)", +"6c0b1e8c": "VESTING_START_TIME()", +"6c0b66b9": "PGO_UNLOCKED_LIQUIDITY_CAP()", +"6c0c27e1": "acceptBet(uint256)", +"6c0d2c8b": "getHeroPower(uint256,uint256)", +"6c0daed8": "getRate(string)", +"6c0db60e": "CatexToken()", +"6c0e1ccd": "getAllCitizens()", +"6c0eb56f": "LOG_EmergencyWithdrawalProposed()", +"6c0ebc6c": "perform_withdrawal(address)", +"6c0f7ee7": "multiAddDSource(bytes32[],uint256[])", +"6c10dcdf": "ProvidenceCasinoToken()", +"6c118f46": "TimeWindowUpdated(uint256,uint256)", +"6c11bcd3": "sellTokens(uint256)", +"6c1247e5": "databaseContract()", +"6c131dbe": "multiMint(int256,uint256[])", +"6c1334bf": "SetDescript(string,string)", +"6c13b5f2": "totalReceive()", +"6c1475ad": "tryAdvance()", +"6c14bb42": "buyAutos(uint256)", +"6c14f2d1": "m_ETHPriceLastUpdateRequest()", +"6c150f42": "initLeftICOTokens()", +"6c15e8e6": "GlobalConstraintRegistrar(int256)", +"6c169818": "isFreezeAccount(address)", +"6c16c740": "Start9()", +"6c172095": "gameCenter()", +"6c17729b": "JoygoEOS(string,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"6c17b018": "airDrop(uint32,uint64)", +"6c182e99": "lastTokenIsTransferableDate(address)", +"6c188593": "setMinBetAmount(uint256)", +"6c189c46": "releaseAmisToken()", +"6c18cc1e": "firstSellHSShop(uint256,uint256,uint256)", +"6c194b59": "lastTransactionRec()", +"6c197ff5": "sell(address,uint256)", +"6c19e783": "setSigner(address)", +"6c1a5b8c": "TOKEN_TARGET()", +"6c1c6d93": "setVipAddress(address,address)", +"6c1c86f7": "PlanEX()", +"6c1d0157": "distributeMoney(address,address,uint256)", +"6c1d4fd9": "advisorsTokensThirdReleaseTime()", +"6c1e039a": "playerRoll(uint8,uint8,address)", +"6c1f05d2": "breakIdMaintenance(int128,address)", +"6c1f27fe": "icoBonus5()", +"6c1f2fb3": "ico3Sold()", +"6c1ff101": "Crowd()", +"6c204fd7": "certifyMany(bytes32[])", +"6c2066bf": "MAX_TOKENS_ADVISORS_PARTNERS()", +"6c20ceb4": "DeltaChainToken()", +"6c20d755": "getItemRafflePlayers(uint256)", +"6c20fcdd": "MerkleTreeRootAdded(uint8,bytes)", +"6c2187e7": "GameEnded(uint256,address,uint256,uint256,uint8,uint8)", +"6c224487": "DEHT()", +"6c226eef": "_processGameEnd()", +"6c231060": "buyCar(uint256)", +"6c237c1c": "admin_token_burn(uint256)", +"6c23c7b0": "canOperatorTransferByPartition(bytes32,address,address,uint256,bytes,bytes)", +"6c2412ae": "GetChipInfo(uint32)", +"6c241bb1": "getCityData(uint256)", +"6c24a76f": "getAvailableBalance(address)", +"6c24c87d": "latestSenderOf(uint256)", +"6c24d0e6": "toTimestamp(uint256,uint256,uint256,uint256,uint256,uint256)", +"6c24e2db": "maskpot()", +"6c26493c": "MyTestToken1()", +"6c265dc3": "calcFeeE8(uint64,uint256,address)", +"6c26df09": "addFootballMatch(uint256)", +"6c27149f": "testInt(uint256)", +"6c27b211": "registerBalanceForReference(address,uint256)", +"6c286ff1": "removeCrowdsales(address,address)", +"6c28faee": "migration(address,uint256,bool)", +"6c295936": "changeOptional(uint40,uint64)", +"6c295e34": "Add_Doctor(uint256,uint256,string,string,string)", +"6c29d714": "totalMarketplaces()", +"6c2af4e5": "MithrilAxe()", +"6c2b04fd": "isGovernment(address)", +"6c2bcfdd": "MAXSALESCAP()", +"6c2c5a19": "addCarSigned(string,string,string,uint16,string,address,bytes32,bytes32,uint8)", +"6c2d5d26": "symbol(address,bytes32)", +"6c2ec9ef": "guess_tx(bytes32)", +"6c2f64fe": "removeContractAddress(address,address)", +"6c303e1b": "Bitescia()", +"6c3051c9": "setWonTeam(uint256)", +"6c30ba53": "setTitulaire_Compte_4(uint256)", +"6c30d170": "renounceIssuance()", +"6c30f765": "testing(uint256)", +"6c326a46": "prizeFundHWC()", +"6c32c0a6": "gap()", +"6c32e01c": "sendJackpot(address,uint256)", +"6c33e7eb": "setMockAddress(bytes4,address)", +"6c341889": "toUint(bytes,bytes,uint256)", +"6c343afc": "destTokens(address)", +"6c343ffe": "withdrawfunds()", +"6c349e57": "addrunmoney(address,uint256,uint256,uint256)", +"6c34c97a": "setFIRST_STEP_LIMIT(uint256)", +"6c376cc5": "maintenance()", +"6c3772fd": "totalpaidout()", +"6c3824ef": "removeTokens(address[])", +"6c38d4e4": "pauseMint(uint256)", +"6c3919fc": "getProviderCurrentRate(uint256)", +"6c39b7ee": "gamesPlayed()", +"6c3a208d": "VistaToken()", +"6c3a4b80": "canBePurchasedByETH(uint32)", +"6c3aaab7": "snailPot()", +"6c3aacf9": "getTokenToEthOrder(uint32)", +"6c3b6591": "right83(uint256)", +"6c3c221b": "setFunctionTwoPrice(uint256)", +"6c3e6a75": "forceBonds(address)", +"6c3e6e0c": "iconomiTokenSupply()", +"6c3e8e19": "_vestedAmount(address)", +"6c3ea721": "memberHasRight(address,string)", +"6c4019f4": "createContest(string,address,uint32,uint64,uint64,uint128,uint128,uint32,uint32,uint8,uint32[])", +"6c4040c5": "firstSaleSpenderTxDetails(uint256)", +"6c419326": "STC(address,uint256,uint256,uint256)", +"6c43a2ca": "increaseAllowance(address,address,uint256)", +"6c4470fb": "participants()", +"6c456d0f": "getERCContractAddress()", +"6c457528": "createUsername(string)", +"6c463635": "getDistValues(string)", +"6c464c3d": "recieveRelocation(address,uint256)", +"6c46a2c5": "addOwners(address[])", +"6c46ae22": "phasePublicSale3_To()", +"6c4820bb": "callModifiedWithdraw(uint256)", +"6c48a097": "amount_investments()", +"6c494843": "multiAccessChangeOwnerD(address,address,address)", +"6c4b3197": "getSecureFees()", +"6c4be791": "hasAirdrop(address)", +"6c4bf16b": "icoOwner()", +"6c4c174f": "hack(address)", +"6c4ceaff": "getSourceHash(uint256,uint256,uint256)", +"6c4d032e": "SOFTCAP_TIME()", +"6c4d0c00": "wasGoalReached()", +"6c4d4f21": "setVotingProxy(address)", +"6c4d7c59": "getBetProps(bytes32)", +"6c4db7cc": "sendFoundersBalance(address[],uint256[])", +"6c4dfffe": "BIKS(uint256,string,uint8,string)", +"6c4e5c86": "decreaseLockBalance(address,uint256)", +"6c4e838a": "wantNewTokens(uint256[])", +"6c4e86af": "dailyGrowth_ppm()", +"6c4eca27": "tokenTransfer()", +"6c4ef21e": "canUnstakePartial(address,uint256,uint256,bytes8,uint256,uint256,uint256,uint256)", +"6c4f5e51": "testingContracts2(string)", +"6c4f8c65": "DeviceIsActivated(address)", +"6c4fbaa4": "requestCore()", +"6c4fe255": "p_setMaxInvestment(uint256)", +"6c5077b1": "MintPaused(bool)", +"6c5091e3": "getERC721AddrPawn(uint256,address)", +"6c50bc2e": "getGeneralLength()", +"6c510377": "transferOutAllEthers()", +"6c51af67": "setPOOL_edit_17(string)", +"6c525b13": "unregisterSelf(address)", +"6c525d04": "endMigration()", +"6c526503": "AmountRaised()", +"6c52660d": "checkIfNameValid(string)", +"6c530ee3": "weiPerEth()", +"6c5376c9": "addPassword(string,string,string)", +"6c543c08": "_emitSkillCategoriesSet(address,uint256,uint256)", +"6c54d1c1": "KRYPSTRONG()", +"6c54df52": "getCurrentPrice(address,uint256)", +"6c5541b5": "changeSpender(address)", +"6c556859": "createGame(string,string,uint256,uint256,string,string,string,string)", +"6c55e385": "minimalFreeze()", +"6c5649d8": "setCommunityBallotCentsPrice(uint256)", +"6c56a3f1": "startRelease()", +"6c56bf3e": "CreateARCD(address,uint256)", +"6c56bfc0": "InitiateGame()", +"6c572104": "TotalSantaCoinsGivenByNorthPole()", +"6c57c01f": "MAXIMUM_CONTRIBUTION()", +"6c57dbaa": "_max(uint256,uint8,uint256)", +"6c57f5a9": "isDisabled()", +"6c587491": "playGame(address,uint256)", +"6c595451": "addApp(string,address,uint256)", +"6c597e41": "getCreditBitAddress()", +"6c59fb29": "allocateToken()", +"6c5a7d1e": "setDisabled(bool)", +"6c5aad6e": "fetchOrderByIdWithMerchantByAdmin(string,address)", +"6c5aaf50": "getDelegateDetails(address)", +"6c5af719": "getHoldEarnings(address)", +"6c5b685f": "icoPart()", +"6c5bde2a": "CoInsureBlockToken()", +"6c5c671f": "cancelIntl()", +"6c5ca1fa": "exchangeRateRoundOne()", +"6c5ccfe8": "distributeFundsInEscrow(address,address,uint256,address)", +"6c5d2787": "setTymTokensPercent(uint256)", +"6c5d6156": "burn(address[])", +"6c5dc78b": "setPublicSaleFinishDate(uint256)", +"6c5dee17": "getFileAt(uint256)", +"6c5e9ac1": "cmpEq(uint256,uint256,bool)", +"6c5e9e18": "_phase1Supply()", +"6c5f71c7": "numberOfPingsReceived()", +"6c5f8394": "DeneumToken()", +"6c609906": "getTotalTokensAgainstAddress(address)", +"6c6101fd": "ContractManagementUpdate(string,address,address,bool)", +"6c610f53": "getMinUnitPrice(uint8)", +"6c617048": "reinvestFor(address)", +"6c61d60f": "directTransfer(address,uint256)", +"6c626ec6": "removeWinner(address,address,address)", +"6c6288e4": "Thechampcoin()", +"6c6295b8": "setValidRateDurationInBlocks(uint256)", +"6c64a678": "unfreezeToken()", +"6c658a2c": "UpdateICOPhase(address,uint256,uint256)", +"6c65c455": "swapETHMKR(uint256,uint256)", +"6c65fd6a": "isFreezer(address)", +"6c675ae6": "tokens_buy()", +"6c677d82": "SpentTokens(address,address,uint256)", +"6c68b5d5": "TicketOwner(uint256,uint256)", +"6c68c837": "verifyBalanceProof(address,uint32,uint192,bytes)", +"6c690142": "redeemAllowedInternal(address,address,uint256)", +"6c698882": "getActualNum(uint256)", +"6c699905": "revealWinner()", +"6c69ab24": "multitokensCount()", +"6c6b23d2": "updateBalances(address,address)", +"6c6b298a": "getMigrateInBonusIfInForkWindowValue()", +"6c6b9870": "updAirDropTokenEnabled(bool)", +"6c6c21af": "CappedCrowdsale(uint256,uint256,uint256)", +"6c6c39fb": "votersLength()", +"6c6c7e05": "amountLocked()", +"6c6ce21a": "setInvoice(bytes32,uint256,bool,string,string,string,string)", +"6c6d2653": "CrowdsaleChanged(address,address)", +"6c6e5108": "StoriqaCash()", +"6c6eb9d1": "base(uint256)", +"6c6f1d93": "getContractCreationValue()", +"6c6f31f2": "allow(address,uint256)", +"6c6f360e": "userRegister()", +"6c6fbd70": "EnergiToken()", +"6c7018cf": "single_card()", +"6c706093": "logUniverseCreatedCalled()", +"6c70abda": "use(uint8,uint8,uint8,uint8[176])", +"6c70ad0d": "PublicMineCallsCount()", +"6c7113e4": "getFundManager()", +"6c712471": "testControlRetractLatestRevisionEnforceRevisions()", +"6c71b1aa": "setGasReq(uint256)", +"6c71d01d": "ratings(bytes32)", +"6c720446": "isVotingPrepare()", +"6c7272ce": "registerVendor(address,address)", +"6c73d230": "logResult(string)", +"6c741950": "setTTL(uint256)", +"6c749c26": "EXA()", +"6c74e341": "setFoundingTeam(uint256[],address[])", +"6c751622": "MacQueenToken()", +"6c7521cb": "updateReputationScoreInBulk(address[],uint256[])", +"6c767f20": "playerOneReveal(bytes32,bytes32)", +"6c768200": "burnByOwner(address)", +"6c76b8f4": "_changeReward(uint256)", +"6c779d57": "levelSplits(uint256)", +"6c77f989": "joinLottery()", +"6c780868": "getBurnLine()", +"6c784995": "getBeneficiaryMarket()", +"6c786b65": "bonusAccountCount()", +"6c787229": "availableOwnerWithdraw()", +"6c788a0d": "bookingFee()", +"6c789092": "Resource(bytes32,bytes32,bytes32,address)", +"6c78cb81": "ETCToken(address)", +"6c78da22": "getPrefixPrice(string)", +"6c79e379": "setGallerySevenPrice(uint256)", +"6c7afaba": "regSpots(uint16,uint16,bytes32)", +"6c7bc902": "tgrCurrentPartInvestor()", +"6c7c7c73": "bePure(uint256,uint256)", +"6c7c909f": "FreshWaterFlow()", +"6c7ca99f": "RequestBankrollPayment(address,uint256,uint256)", +"6c7cc6d8": "sell(uint256,address,bool)", +"6c7d4c4c": "unwhitelistAddress(address,address)", +"6c7dde15": "validPayBuff()", +"6c7de422": "investmoretokens()", +"6c7e0236": "isNotaryVeredictValid(address,address,address,bool,bool,bytes)", +"6c7e7082": "overflowAmount()", +"6c7f1542": "balanceOf(bytes32)", +"6c7f3f17": "totalBuys()", +"6c811247": "showPlayerSafeByAddress(address,uint256)", +"6c814509": "setAdAccount(address)", +"6c81fd6d": "AddModerator(address)", +"6c82337e": "payJackpot4()", +"6c825035": "withdrawLRC()", +"6c830f4b": "getCompletedTasks()", +"6c83444d": "FLOQI()", +"6c8381f8": "candidate()", +"6c8429fd": "jpMinBet()", +"6c843605": "BrownieCoin()", +"6c84a4bf": "tokenContributionCap()", +"6c84ae04": "setFirstYearAllowancePercentage(uint8)", +"6c85acec": "RNCTokenERC20(uint256,string,string)", +"6c85c727": "removeBankroll(uint256,string)", +"6c85cf67": "canTransfer(address,address)", +"6c86888b": "testTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address)", +"6c86ac5a": "getPublicData(uint256)", +"6c8716d8": "etherLowLimit()", +"6c876e5d": "s2(bytes1)", +"6c8830c5": "_maxtotalSupply()", +"6c8a59f2": "addresses6(uint256)", +"6c8ae38c": "r()", +"6c8b052a": "numStakers()", +"6c8b37eb": "MTRCToken(address,string,string,uint256,uint256)", +"6c8b4e60": "communityLock()", +"6c8d0b1e": "getSubscriberStatus()", +"6c8d0bcf": "getUserDAOsId(address,uint256)", +"6c8d65dc": "phepsToken()", +"6c8dea3b": "claim_ENS_name()", +"6c8e44c3": "ProductionUnitToken(address,uint8,uint8,uint8,uint256,uint256,uint256,uint256)", +"6c8e53e0": "PreSale()", +"6c8f093d": "PayForServiceCHLEvent(address,uint256)", +"6c8f455c": "checkMembership(bytes32,uint256,bytes32,bytes)", +"6c90c3df": "setCanClaim(bool,bool)", +"6c90fe09": "CcoindDigital()", +"6c912080": "minListingSeconds()", +"6c922038": "CMAPToken()", +"6c9230db": "getCurrentTimestamp()", +"6c94d0e4": "INBETToken()", +"6c953719": "CCASH(uint256,string,string)", +"6c958f74": "tokensOfferedOf()", +"6c963fc7": "PoWAdvCoinToken()", +"6c965a81": "claim(address,bytes32,string,bool,uint256,bytes32,uint256,bytes)", +"6c973248": "getVoteCount(uint256,uint256,uint256)", +"6c9740c1": "transferOwnership(address,uint8)", +"6c9784b1": "_getTokenRaised(uint256)", +"6c9789b0": "finalize(bool)", +"6c97a812": "UTExchangeRate()", +"6c97b731": "TimeEndChanged(string,uint256)", +"6c97c237": "firstSellSaddleShop(uint256,uint256,uint256)", +"6c981488": "paymentPeriods()", +"6c996bbd": "disputeOpened(address)", +"6c99b0da": "setFWDaddrETH(address)", +"6c9a1e2a": "setPOOL_edit_12(string)", +"6c9a5c61": "resolveExpiredBets(uint256)", +"6c9c1d41": "checkServiceFee(address)", +"6c9c2faf": "getSupply()", +"6c9c5944": "freeze(address,uint256,uint256,uint256)", +"6c9c97d8": "refundByToken(uint256)", +"6c9cb82f": "freeCash()", +"6c9d99da": "teamTokensWallet()", +"6c9e27d6": "ALLOC_WINGS()", +"6c9e89b6": "addVesting(address[],uint256[],uint256[])", +"6c9eafe7": "stillAllowed()", +"6c9f65c5": "getBidInfo(uint32)", +"6c9fa59e": "shareToken()", +"6c9fca89": "updateAppInstance(bytes32)", +"6ca0101e": "unopened_bid()", +"6ca06072": "getAttributeAdminAddr(address,bytes32)", +"6ca0a099": "getInitialBlockHeight(uint256)", +"6ca0f321": "setValue1(uint256)", +"6ca100fb": "firstWeekMainICOBonusEstimate()", +"6ca13df1": "decreaseOwnershipTokenCount(address,address)", +"6ca1f933": "setTest(uint256)", +"6ca32280": "percentageBuyBackFund()", +"6ca34ea2": "balances_(address)", +"6ca35ae4": "addDoctor(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)", +"6ca3b5f6": "set_maxgasprice(uint256)", +"6ca3daf2": "_vouchersDistributed(uint16)", +"6ca3fc3b": "distributePrizes(uint256)", +"6ca562d6": "switchCompatible223ex(bool)", +"6ca596fa": "isPreICOClosed()", +"6ca5b5b0": "r1()", +"6ca5bdf2": "testIntDynArray(int256[])", +"6ca621bd": "setEmbassy(address)", +"6ca78a1c": "anyRequestAvailable()", +"6ca78a1e": "setBorrowerReturnEthPerFiatRate(uint256)", +"6ca7b99b": "getDirection(uint256,uint256)", +"6ca7c216": "gas()", +"6caa2bda": "OxyToken()", +"6caa736b": "fundDeposit()", +"6caabc6f": "addCompany(string,address,uint256)", +"6caca63a": "WhiteTigerToken()", +"6cad3fb0": "updateFeePercentage(uint256)", +"6cadd040": "EtherAuction()", +"6caddb04": "orders(uint256,address)", +"6cae8f67": "setSellableToken(address)", +"6caed305": "changeBonus(uint256,uint256)", +"6caf25ce": "price1()", +"6caf3673": "getPlayerSpaceshipBattleStakeById(uint256)", +"6cb04993": "forceNeuroChainAddress(address,string)", +"6cb0e9f0": "TXToken(address)", +"6cb136ba": "isActive(uint16)", +"6cb1630f": "withdrowTokens()", +"6cb24199": "withdraw(bytes32,uint256,address,uint256,address)", +"6cb30fee": "nettingContractsByAddress(address)", +"6cb31171": "_currentHalfYear()", +"6cb39448": "getMarketerKey()", +"6cb3c94e": "Filler()", +"6cb3d30a": "triggerTryAuth()", +"6cb3e8ef": "getApprovers()", +"6cb45694": "LogDisbursement(address,uint256)", +"6cb520c6": "_play(string,uint256)", +"6cb5291e": "ICO_PRICE1()", +"6cb5714c": "_sendByTranche(bytes32,address,address,address,uint256,bytes,bytes)", +"6cb5d070": "getCoinsSinceLastHatch(address)", +"6cb69c2c": "setDevTokensWallet(address)", +"6cb69f42": "getSystemInfo()", +"6cb6ea82": "CBITokenCrowdsale(uint256,uint256,uint256,uint256,uint256,address)", +"6cb7223c": "maxPurchaseOnce()", +"6cb76408": "returned()", +"6cb78983": "purchaseMIT(address)", +"6cb90a2c": "pre_ico()", +"6cb942ab": "GameItemNew()", +"6cba45b8": "setDayFirst()", +"6cbad471": "Rappo()", +"6cbae51b": "firstPreSaleDate2()", +"6cbaecbd": "normalRoomMin()", +"6cbb1afa": "setTokenBag(address)", +"6cbb9d19": "releaseEscrow(bytes20,address)", +"6cbc2ded": "endGame()", +"6cbc9ca0": "ADDR_OWNER()", +"6cbceeec": "theAddress()", +"6cbdb7d0": "takers(uint256)", +"6cbec01c": "Steel()", +"6cbef5a7": "sumVote()", +"6cbf3c8c": "ICO_POOL()", +"6cbf9c5e": "commitVote(uint256,bytes32,uint256,uint256)", +"6cc03315": "getPaymentLogN()", +"6cc09081": "getActualPrice()", +"6cc23437": "setIsContainerForFeeWindow(bool)", +"6cc25db7": "ticket()", +"6cc2c668": "_presaleEndTimestamp()", +"6cc301e3": "permitted(address)", +"6cc341f1": "getIndexOrder1(uint256)", +"6cc37048": "EFFToken(address)", +"6cc48d81": "_emitHeartBeat(bytes32,int256,int256)", +"6cc5ab24": "digithothToken()", +"6cc5f3ad": "getGames(uint256[])", +"6cc5fdaa": "setBytes32(bytes,bytes)", +"6cc61d86": "setSingleWithdrawMin(uint256)", +"6cc67aa5": "resetExplicitState(uint32,int64[2],int256,uint64,int8)", +"6cc6971b": "setNewStartDate(uint256)", +"6cc6cde1": "arbitrator()", +"6cc70ee1": "GovernanceChangeMinApproval(uint8)", +"6cc762d8": "lastWeiPricePerCWC()", +"6cc7d828": "investBalanceGot()", +"6cc919c8": "updateConfig(address)", +"6cc95f8d": "ALAX()", +"6cca5065": "QripplexToken()", +"6cca60ba": "gripWallet()", +"6cca7023": "DoubleSend(address,address,uint256)", +"6cca940a": "RusgasCrowdsale()", +"6ccab1f3": "wwasCoin()", +"6ccb5d02": "getShareholder(uint256)", +"6ccbb0ab": "withdrawBalances()", +"6ccbdbf9": "getHodlAmount(uint256)", +"6ccc3bdd": "whitelistBonusPercentage()", +"6ccce7a8": "getCapOfWei()", +"6ccd563d": "queueAuditRequest(uint256,uint256)", +"6ccd5cbe": "getClassInfo(uint32)", +"6ccd993b": "getDestroySharesFxpValueValue()", +"6ccde640": "getGoodPreset(bytes32)", +"6cce15d8": "ICOFails()", +"6ccf93d3": "HeyueToken(address,uint256)", +"6cd02297": "processOfflinePurchase(address,uint256)", +"6cd05e41": "takeAllTheMoney(address)", +"6cd0f102": "setHouseEdge(uint256)", +"6cd186ce": "setUncleSafeNr(uint256)", +"6cd1b26c": "setQueue(uint256)", +"6cd22eaf": "updateAuthority(address,bool)", +"6cd2ad56": "distributeTo(address)", +"6cd2b458": "splitsTotal(uint256,uint256)", +"6cd2f731": "setTimePerPeriod(uint256[5])", +"6cd38ea0": "NebulasToken(address,uint256)", +"6cd3d326": "getTotalChild(address,address)", +"6cd40993": "setNeironixProfitAddress(address)", +"6cd44d55": "pushOrderOfVendor(address,uint256,bool)", +"6cd49925": "currentLocation()", +"6cd51833": "initiateWithdraw(uint176,uint64)", +"6cd522f2": "getContributionRNTB(address)", +"6cd56641": "EYrickCoin()", +"6cd56878": "setDeveloperWallet(address)", +"6cd5c39b": "deployContract()", +"6cd6043a": "emitAndStore()", +"6cd61739": "getbuyprice()", +"6cd69864": "Total_Companies()", +"6cd7d86e": "setClaimRepository(address)", +"6cd8015d": "setVestingWithDefaultSchedule(address,uint256)", +"6cd8c204": "BuyEgg()", +"6cd8f433": "canExport()", +"6cd8f772": "fights()", +"6cd8fa85": "burnTrusted(address,uint256)", +"6cd902d0": "Casa()", +"6cd9786a": "setCapETH(uint256)", +"6cd98f30": "getResponseQueryType(uint256)", +"6cd9db29": "sub_matricola(string,uint256)", +"6cdacfc4": "startStage(uint256,uint256,uint256)", +"6cdae459": "YuanBaoCoin()", +"6cdb3389": "getEntriesCountForCompetition(uint256)", +"6cdb711e": "ProposalAdded(uint256,address,uint256,uint256,address,uint256,uint256)", +"6cdc644d": "CMTC()", +"6cdcb1ca": "DEVELOPER_supply()", +"6cde3c75": "frozenAccountICO()", +"6cde6380": "setHash(uint256,bytes32)", +"6cde71ee": "enteredTotalAmount()", +"6cde95ee": "getAccountAllowance(address)", +"6cdf4c90": "ownerSetMinBet(uint256)", +"6cdf7cdf": "FRO()", +"6cdfcc6e": "getTokenList(address,uint8,uint256,uint256)", +"6cdffb3c": "fetchJugadas()", +"6ce066af": "Give(bytes32)", +"6ce079fe": "getNumGames()", +"6ce07efa": "AddSale(uint256,string,string,string,uint256)", +"6ce0a6a4": "SafeBoxCoin()", +"6ce12737": "OX_TOKEN()", +"6ce1417e": "Fund()", +"6ce15a54": "genericAction(address,bytes32[])", +"6ce27c7b": "DECIMAL_INDEX()", +"6ce37387": "KindAdsToken()", +"6ce3fc06": "sendPrize()", +"6ce41ab4": "Garuda()", +"6ce4499c": "adjustCoins(address,int32,string)", +"6ce4a9a8": "RAMTOKEN()", +"6ce5b3cf": "releaseHeldCoins()", +"6ce62c61": "changeAllowances(address[],uint256[])", +"6ce6833d": "test_updateKey_increaseNoHint()", +"6ce768dd": "GetMainInvestor()", +"6ce76ae3": "openOldCrates()", +"6ce7e739": "getBonusRate(uint256,uint256)", +"6ce912ab": "LongevityToken()", +"6cea50a1": "crowdSaleStarted()", +"6ceac6e1": "TankDeposit()", +"6ceba55e": "change_fee(uint256)", +"6cebad98": "newUser()", +"6cebd885": "waraCoinTransfer(address,uint256)", +"6cec0ceb": "setDenominator(uint256)", +"6cec7f92": "canManage(uint32,int256,address)", +"6ceccc82": "changeICOAddress(address)", +"6cecdad9": "UpdateAttribute(uint256,address,bytes32,bytes32)", +"6cedc6ea": "tHasSubmitted(uint256,address)", +"6cee0d8b": "checkIfAllIQTDistributed()", +"6cee2d45": "STTR(uint256,string,uint8,string,address,address)", +"6ceec70d": "whitelistAdd()", +"6cef5ff4": "FundingAssetAddress()", +"6cf124c6": "toJackPotfromEveryTicket()", +"6cf1a452": "chgExchangeRate(uint256)", +"6cf1cb29": "setGen0SellerAddress(address)", +"6cf27311": "randomNumbers(address)", +"6cf32dde": "getMyGolds()", +"6cf339f8": "CardiumToken()", +"6cf35782": "m_funds()", +"6cf3b9e9": "checkBalance(uint256[])", +"6cf3c25e": "small()", +"6cf3d099": "dropEnd()", +"6cf43347": "returnString()", +"6cf49694": "tweakDailyDividends(uint256)", +"6cf4c88f": "removeApprover(address)", +"6cf69811": "trade(address,uint256,address,address,uint256,bool)", +"6cf6d675": "unbondingPeriod()", +"6cf70679": "removeFees(uint256)", +"6cf72694": "OAToken()", +"6cf75170": "cancelVote(address,uint256,uint256)", +"6cf761d4": "getMinConfirmationsByAddr(address)", +"6cf7cff6": "icoETHContributionLimit()", +"6cf7da53": "setMinerPrice(uint256)", +"6cf843ac": "LuckyToken()", +"6cf9bbf8": "setJackpotFactor(uint256)", +"6cf9cc58": "registerResource(bytes,uint256,bytes,string)", +"6cf9ea99": "Rhinex()", +"6cfab740": "RequiredBondRules(address)", +"6cfb0a4a": "test_oneValidEqBytes()", +"6cfb2c9c": "payoutToAddress(address[])", +"6cfb7101": "_emitMonthLimitChanged(bytes32,uint256,uint256)", +"6cfb782f": "TestWithdraw()", +"6cfc4512": "authorSignUp(address)", +"6cfc4ac5": "getGameEnd()", +"6cfc82ed": "trancheSize()", +"6cfdc242": "isSalesManager()", +"6cfe5947": "getCurrentICOPhaseBonus()", +"6cfedade": "refundTeamTokens()", +"6cff6f9d": "payoutOrder()", +"6cff8244": "controllerSucceeded()", +"6cffa0cd": "_transter(uint256)", +"6cffd817": "burnByAmount(uint256)", +"6cfff605": "releaseThreeHotHourTokens()", +"6d011a12": "scribes_hisory(uint256)", +"6d013618": "mint(address,uint256,uint256,string,string)", +"6d01d12b": "XeToken()", +"6d022003": "ALLOC_SALE_PRIVATE()", +"6d029f6a": "totalYUPIESAllocated()", +"6d02a595": "_setMintFeeAbs(uint256)", +"6d03d3ec": "HolderAdded(address,uint256,uint256,uint256)", +"6d03fa87": "getReferer(address)", +"6d04f50d": "mtronix()", +"6d0501f6": "mediator()", +"6d052b37": "getRequestByIndex(uint256)", +"6d052f56": "testBitsSetSuccess()", +"6d05c24d": "calcWidthraw(string,uint256)", +"6d05cef4": "getStageSupplyLimit()", +"6d05da7e": "tranchesCount()", +"6d061b69": "deathData_a3()", +"6d064875": "transferEducatedTokenOwnership(address)", +"6d064962": "getOwnerByShipId(uint256)", +"6d069c10": "_updateRaceWinner(uint256,uint256)", +"6d06bf0d": "celebOf(uint256)", +"6d06de2d": "haveAttributes(address,bytes32,address,bytes32)", +"6d076966": "VESTING_1_AMOUNT()", +"6d0797fc": "_isMatingPermitted(uint256,uint256)", +"6d07e3de": "sexToken()", +"6d07f295": "minEatable()", +"6d081d83": "zero_fee_transaction(address,address,uint256)", +"6d082bbb": "startSpreadingBlock()", +"6d0831f0": "BNNToken()", +"6d08bad2": "currencyToHash(string)", +"6d08e8f9": "initiateChallengeWithPastCustody(address,uint256,bytes32[],uint256[],bytes32[])", +"6d09e2ec": "commitCurrency(address,uint256,uint256)", +"6d0a98cc": "blockResolveDispute(uint64,uint64,bytes)", +"6d0b5ee2": "TeamFundsTokens()", +"6d0ca12a": "tokensBack()", +"6d0cc895": "getVersions()", +"6d0def6c": "SimpleDividendToken()", +"6d0e5c03": "stampToken(uint256,uint256,uint256)", +"6d0ecb88": "SohaibCoin()", +"6d0f131a": "DrawEvent(uint256,uint8,uint8,uint8,uint256,uint256,uint256,uint256)", +"6d0f157d": "setAllFreeze(uint256,uint256)", +"6d0f2a84": "changeDefendFee(uint256)", +"6d0f8806": "refundAdveriser(uint256)", +"6d102f71": "acceptOrder(bytes16)", +"6d106885": "unitUserBalanceLimit()", +"6d1150de": "endCurrentPhaseIn(uint256)", +"6d11cf72": "berrycoin()", +"6d11fe82": "_initAwardInfo()", +"6d121b91": "getMaxCap10X()", +"6d12301c": "getBetValue(bytes32,uint8)", +"6d12fb5b": "setSellable(uint32,bool)", +"6d1478e9": "_addToDebtRegister(address,uint256)", +"6d14b2a8": "JackpotAmount()", +"6d156add": "finalizePRETDE()", +"6d15a659": "Distribution(address,address,uint256,uint256)", +"6d15cecd": "getTokenRaised()", +"6d15dc5a": "BetPayout()", +"6d15f208": "reject(string,uint256,uint16,address,uint256)", +"6d160f31": "confirmReservedTokens(address,uint256)", +"6d161bc1": "setdot(address)", +"6d1669e1": "approveAndCall(address,address,uint256,bytes)", +"6d16f79c": "__transferWithReference(address,uint256,string)", +"6d16fa41": "transferControl(address)", +"6d171f0e": "changeRemainingSupply(uint256)", +"6d17af94": "ContributionMinted(address,uint256,uint256)", +"6d181a42": "FTV(address,address,address,address,address)", +"6d1821aa": "OrenCoin()", +"6d1884e0": "getEvent(uint256)", +"6d189422": "EtherFlipRaffleToken()", +"6d18c778": "PSIToken()", +"6d18dc63": "ATTR_TRADABLE()", +"6d1909fc": "transferIDCContractOwnership(address)", +"6d1917b5": "maxPurchaseNonWhiteListed()", +"6d19ce04": "STARTING_Dragon()", +"6d1a0d34": "ShowTime()", +"6d1af018": "getAmountRaised()", +"6d1b229d": "burnTokens(uint256)", +"6d1d71c5": "Note(address,string)", +"6d1da953": "createWithNonce(bytes32,bytes)", +"6d1e1f8d": "updateSale(uint256,uint256,uint256)", +"6d1e2194": "SALES_ALLOCATION_PPM()", +"6d1e8095": "transferGameOwnership(address)", +"6d1e839c": "changeMaxCap(uint256)", +"6d1ea3fa": "approvedTokens(address)", +"6d1eab7d": "getRegistryVersion()", +"6d1f00a6": "ThroneMaker(uint256)", +"6d1f451b": "multiSigWalletAddress()", +"6d201095": "PRICE_PRESALE_START()", +"6d214c66": "MBSibalCoin()", +"6d21f638": "SmartshareStandardToken(uint256,string,uint8,string)", +"6d224b7b": "weiPerABIO()", +"6d236703": "createMemoryArray(uint256)", +"6d2381b3": "addressAndBalance()", +"6d23bf0b": "ingresarFondos()", +"6d23c516": "s8(bytes1)", +"6d23cda3": "sub(uint16,uint16)", +"6d245bda": "lockUnlockGamblingPartyForBetting(uint256,bool)", +"6d2570fe": "Before(uint256,bytes32)", +"6d25924d": "setn(uint256,uint256,uint256)", +"6d25ba1d": "setTechBonus1(uint256,string)", +"6d2666b9": "lockInLastSixteenPrize()", +"6d275e9e": "distributeEbyte(address[],address,uint256,uint256,uint256)", +"6d277279": "getAuctionsCreated(address)", +"6d278b29": "setHoldMax(uint256)", +"6d27a326": "turnOnFurnace(uint16[5],uint128)", +"6d28e805": "getInsurance(bytes32,uint256)", +"6d290d34": "setAllocation(address,uint256,uint256,uint256,uint256)", +"6d295e24": "callDefaultAction()", +"6d2980f6": "TEAM_LOCK_DURATION_PART1()", +"6d2a7c8b": "createAuction(uint256,uint256,uint256,uint256,address,uint64)", +"6d2ab982": "presaleFemaleDiscount()", +"6d2bf99c": "updatePercentBase(uint256,uint256,uint256)", +"6d2c51a7": "countrySupply(uint256)", +"6d2cb794": "airaTransfer(address,address,uint256)", +"6d2d4e52": "lockSupplierAndLockPosition1(address,address)", +"6d2d525d": "FFUELCoinTokenCrowdSale(uint256,uint256,uint256,uint256,uint256,address,address,address,address,address,uint256)", +"6d2dd1a9": "getDividendsForOnePeriod(uint256,uint256,uint256,uint256)", +"6d2ff3d3": "Geniota(uint256,string,uint8,string)", +"6d301f38": "MIDO()", +"6d3036a7": "MAGNITUDE()", +"6d308c40": "changehiddenOwner(address)", +"6d30921c": "proceedDividends(uint256)", +"6d30d07f": "getMiniPoolEdit_6()", +"6d312683": "feeInCirculation()", +"6d32028d": "bigAward(address,uint256,uint256)", +"6d320b17": "minimumEntryThreshold()", +"6d32a4a6": "finishRoundD()", +"6d32dc4b": "startElection(uint256)", +"6d338bd0": "setCCH_edit_22(string)", +"6d339f02": "_oldConfig()", +"6d33b42b": "changeLimit(uint256)", +"6d33f5a6": "updateNoteContent(uint64,bytes)", +"6d34a775": "getDatas()", +"6d35b1dc": "getExtraDays()", +"6d35bf91": "seizeVerify(address,address,address,address,uint256)", +"6d361694": "getModel(uint256)", +"6d36ebf8": "addPlayer(address,bytes32)", +"6d37a9dc": "LCT()", +"6d38156f": "getCountOfIntegerTypes(uint8[])", +"6d399eb7": "MAX_AIRDROP_VOLUME()", +"6d3b5f18": "getUserByID(uint256)", +"6d3c7ec5": "setDefaultPrice(uint256)", +"6d3d0a8f": "disagree()", +"6d3de7ea": "beManagerInsurance()", +"6d3e141e": "functional(address,uint256)", +"6d3e1a74": "PiBetaToken()", +"6d3e4502": "DatToDtrcDenominator()", +"6d3f008a": "FinalizedTier(uint256,uint256)", +"6d3f1277": "flagAndFinalize(uint256)", +"6d4045a8": "EXOSO()", +"6d40ee41": "CloseDonation()", +"6d40f3b0": "PHASE_OPEN()", +"6d417064": "expirationBlock()", +"6d41a3fb": "firstAuctionsExtendedChunkDuration()", +"6d425249": "minerNum()", +"6d435421": "transferOwnership(address,address)", +"6d43b489": "freeTokens(address,address,uint256)", +"6d4419e5": "listTopics()", +"6d44a9cf": "KudosPresaleTokenLockup(address,address)", +"6d4546a2": "changeTsaLink(string)", +"6d46398b": "newChannel(bytes32,address,address,bytes,uint256,bytes,bytes)", +"6d467f04": "ContractTransfer(address,address,uint256,bytes)", +"6d46c6f5": "referrer1Percent()", +"6d4717fe": "noFeesList()", +"6d47ab72": "sellers(address)", +"6d47fb71": "changeICO(address)", +"6d47fc60": "Changepro()", +"6d489314": "terminateLastMilestone(bytes32,address)", +"6d48ae25": "best_submission_accuracy()", +"6d492f54": "sendFyle(address,address,string)", +"6d493bf9": "SOLARCHAINToken(string,string,uint8,uint256)", +"6d498093": "presaleFinalized()", +"6d49817b": "refundPayment(address)", +"6d4a37ef": "cancelEscrow(bytes16,address,address,uint256)", +"6d4b38a2": "infraIndexToOwner(uint256)", +"6d4bae72": "_register2(address,bytes32)", +"6d4be70f": "ethereumSHA3(bytes20,uint24,uint32)", +"6d4c80ea": "removeNamespaceMember(string,address)", +"6d4ce63c": "get()", +"6d4d907c": "maxNumVotesPerAccount()", +"6d4ee68f": "SendBobsCoin()", +"6d4fd0ad": "isNull(address[])", +"6d4fd338": "PPToken()", +"6d4fe435": "counter_in()", +"6d505b49": "randgenNewHand()", +"6d50a2b5": "deleteAllBackgroundImages()", +"6d50ef2a": "timelockedTokensDisbursed()", +"6d510a64": "ourTEAM()", +"6d510f6c": "updatePartners(address)", +"6d5210d9": "showprize(address)", +"6d522b19": "multiAccessChangeRequirementD(uint256,address)", +"6d52f9d5": "mapToNewRange(uint256,uint256)", +"6d53393b": "getInitializeCreatorValue()", +"6d538264": "setMigrateAddress(address)", +"6d53aa4e": "GetProd(address)", +"6d540318": "revokeOracle(address,uint256)", +"6d5433e6": "max(uint256,uint256)", +"6d54340a": "Blockbin()", +"6d544e6e": "setStackSize(uint256)", +"6d54ec91": "registerAndActivateDevice(bytes32,bytes32,bytes32)", +"6d568c43": "weiToCents(uint256)", +"6d56d9f4": "setAuction(uint256,uint256,uint256)", +"6d578781": "changeStageBlcok(uint256)", +"6d57b2b1": "tokenInitialDetails()", +"6d57dee4": "sendTokenAw(address,address,uint256)", +"6d57e2a9": "getAgonIdArray(address)", +"6d580320": "G2UFundDeposit()", +"6d580bcb": "FOUNDERS_CAP()", +"6d584266": "ALLOC_SALE_GENERAL_3()", +"6d5860d4": "revert(string)", +"6d58c88f": "changeDepositAddress(address)", +"6d599136": "personal_withdraw(uint256)", +"6d59c3be": "buyUFT(address)", +"6d5b0f6f": "transferCustodian(address,address)", +"6d5b9427": "onlyWithValidSignature(bytes)", +"6d5c1621": "LogInsert(address,uint256)", +"6d5cae52": "QiongB(uint256,string,uint8,string)", +"6d5d21a9": "setStubFund(address,address)", +"6d5d7612": "MAX_WITHDRAW_PCT_DAILY()", +"6d5da09a": "LockChain()", +"6d5e136d": "_getApproved(uint256)", +"6d5e3587": "needsEther(string)", +"6d5e53f6": "createInt256(bytes32,int256)", +"6d5e78f9": "depositorLimit()", +"6d5f3e15": "settleBet(address)", +"6d5f6639": "objectProposal(bytes32)", +"6d608402": "sendBPESOToken(address,uint256)", +"6d60bf39": "getPreEntranceFrom()", +"6d60e6b4": "trustAddress()", +"6d619daa": "storedValue()", +"6d624e86": "SideJobCoin()", +"6d62a4fe": "canTransfer(address,address,address,uint256)", +"6d63fa32": "getPixelNumber(bytes1,bytes1)", +"6d640637": "testBetId()", +"6d643308": "icoDeadLine()", +"6d64694f": "etherdelta()", +"6d64a472": "claimSalesAgent()", +"6d64abd6": "takeEther(address)", +"6d650b2d": "level_7_percent()", +"6d66264f": "specifyController(address)", +"6d6712d8": "hasPermission(address,address,bytes32)", +"6d6755a6": "gvpe_per_eos()", +"6d6908bd": "mintTokensBatch(uint256,address[])", +"6d69fcaf": "addSupportedToken(address)", +"6d6a01f6": "second_partner_address()", +"6d6a2859": "assetID()", +"6d6a4889": "nextReleaseTime()", +"6d6a6a4d": "decimalFactor()", +"6d6a761e": "setCouponToken(address)", +"6d6bc5f5": "identifierToCoordinate(uint256)", +"6d6c0ec4": "mintProxy(address,uint256)", +"6d6c2074": "totalTokensForSaleDuringICO3()", +"6d6caeb2": "poolCapUSD()", +"6d6d69b6": "allowedToSell()", +"6d6d70d9": "connectModule()", +"6d6dcbe7": "deleteResponse(uint256)", +"6d6e2710": "clearCrowdsaleOpenTimer()", +"6d6e8312": "addProviderAdmin(address)", +"6d6ead75": "reject(uint256,address,uint256,uint256,address)", +"6d6ebb01": "thawSomeTokens(address,uint256)", +"6d6f385c": "isSaleFinished()", +"6d6fa6b1": "FNKOSToken()", +"6d6fb665": "CUSTOM_ERC20_MINT_SERVICE_NAME()", +"6d701f0a": "Eos()", +"6d704159": "wdBefore()", +"6d705ebb": "register(address,uint256)", +"6d70f7ae": "isOperator(address)", +"6d717daf": "Albarit()", +"6d71be4c": "increaseReserve(uint256,uint256)", +"6d7221d5": "doubleClaimSegmentSlashAmount()", +"6d72da47": "addElection(address,uint256)", +"6d72dc38": "getSwapLifetimeLimits()", +"6d730453": "TokensTransferedToOwner(address,uint256)", +"6d736fac": "feeAccount2()", +"6d763a6e": "getLeaderboard()", +"6d771f77": "one_month()", +"6d773cd0": "balance_out()", +"6d77cad6": "isOperatorForPartition(bytes32,address,address)", +"6d77e144": "removeBlacklistItem(address)", +"6d786740": "billingPeriod()", +"6d788933": "_distribution(address[],uint256[])", +"6d78a434": "IntegrativeWalletToken(uint256,uint256,uint256,address)", +"6d78e48a": "candidateTillXPAAssets()", +"6d79207c": "SALE_DURATION()", +"6d796253": "configRoundKey()", +"6d7a0f89": "EmptiedToWallet(address)", +"6d7a2609": "setSpenderAddress(address)", +"6d7a37b6": "OCPresale(address,address,uint256)", +"6d7ab187": "AcceptsGMOON(address)", +"6d7b3706": "setfees(uint256,uint256,uint256,uint256)", +"6d7bc487": "RESERVED_TOKENS_FOR_FOUNDERS_AND_FOUNDATION()", +"6d7bd3fc": "BANCOR_FORMULA()", +"6d7cb00c": "CoinMarks(uint256,address)", +"6d7d083f": "handleFunds()", +"6d7da0b1": "MyContract()", +"6d7fa14e": "CQC(uint256,string,uint8,string)", +"6d7fd1bf": "getIpfs(uint256)", +"6d7fd8a3": "pauseRefund()", +"6d80244d": "createUnitOmni(uint32,address)", +"6d805b2d": "withdrawMana(uint256)", +"6d813e63": "owner_viewOnFlight()", +"6d81779b": "teamCap()", +"6d836cde": "updCouponBonusEnabled(bool)", +"6d8370e9": "upgradeTusdProxyImplTo(address)", +"6d842ad5": "NewBOP(address,address,uint256,uint256,string,string)", +"6d843c2f": "participatedInAirdrop(address)", +"6d84dbb0": "BeijingCoin()", +"6d853ab6": "isSubUser(address)", +"6d863fd7": "airDropSingleAmount(address[],uint256)", +"6d86ac59": "DUMPSACK()", +"6d871c44": "set_a(uint256)", +"6d8758c7": "editCuts(uint256[6])", +"6d877f91": "Bob()", +"6d87b65c": "setPropertySalePrice(uint16,uint256)", +"6d88885e": "schoolOrdering()", +"6d892f7e": "deauthorize(address,address)", +"6d893a5a": "deathData_a8()", +"6d8941cb": "smallBonusPercent()", +"6d8a3650": "dedex(address,address,address,uint256,uint256,uint256)", +"6d8a5f8f": "CAP_ICO()", +"6d8a74cb": "getRoom(uint256)", +"6d8a9f92": "setSavedEthBalance(address,uint256)", +"6d8ab124": "containsPosition(bytes32)", +"6d8b529a": "OwnerBase()", +"6d8c3912": "AicToken()", +"6d8ccf2a": "sellToEther(uint256)", +"6d8d151b": "determineBonus(uint256)", +"6d8d16b9": "StandardToken(string,string,uint8,uint256)", +"6d8f01d1": "CEOSignature()", +"6d8f4221": "masternode()", +"6d8f83cf": "_getBonusAmount(uint256)", +"6d90164e": "GetPrice()", +"6d916598": "stakingUnits(address)", +"6d91acba": "proposalText(uint256)", +"6d9218e5": "Notes(address,address)", +"6d927db0": "withdrawBalanceMaxSteps(uint256)", +"6d94425c": "_maxPeriodSalesLimit()", +"6d94dce1": "createAndBookCanvas(address)", +"6d952117": "maxBuyPrice()", +"6d9634b7": "releaseTokens(address[])", +"6d963a81": "buyp3d(uint256)", +"6d96a2aa": "delegateAddress()", +"6d96b537": "_computeIncentiveReward(uint256,uint256)", +"6d974ee2": "AcceptRealmOffer(uint256)", +"6d97537a": "TestRushCoin()", +"6d97786e": "sell(address,uint256,string)", +"6d97c665": "tokenBonusForSecond()", +"6d9814e1": "BToken()", +"6d98571a": "generalTokens()", +"6d9860d0": "makeFinality(uint256,address,address,bytes32,bytes32,uint256,uint256)", +"6d98c5e7": "AppleToken(uint256,string,string,bool)", +"6d98e9fc": "totalWei()", +"6d98ee4e": "getInitialState()", +"6d991cce": "openGroupNumber()", +"6d99aafd": "Collected_Ether()", +"6d99f652": "resetRaffle()", +"6d9aa034": "setNamePublicKeyAddress(address)", +"6d9af813": "updateprice(uint256,uint256)", +"6d9b06e8": "setProposalDeposit(uint256)", +"6d9b501a": "returnWalletTxCount()", +"6d9c2bda": "ADV_TEAM_LOCK_TIME()", +"6d9c8e86": "getCurrentSaddlePrice(uint256)", +"6d9cb37d": "govtAccount()", +"6d9cdbc6": "WALLET()", +"6d9cebb2": "setDiscount(uint8)", +"6d9d39b6": "isItOpen()", +"6d9d495f": "minMktTokens(address,uint256)", +"6d9dcdb9": "tgrNextPartContributor()", +"6d9f4eeb": "artistTrackCount(address)", +"6d9fed84": "getJackPotInfo()", +"6da05cc7": "sectionAvailable(uint256)", +"6da05f0f": "_requestRandom(uint256)", +"6da1339c": "_deposit(address,uint256)", +"6da1833c": "getInstitutionByName(string)", +"6da1d37a": "sumWei()", +"6da246ac": "approvePartnerAllocation(address)", +"6da28481": "balanceOfLockup(address)", +"6da36c06": "contract_admin()", +"6da3cd1a": "verifiedUsersOnlyMode()", +"6da44d61": "SportX()", +"6da49b83": "nodeCount()", +"6da4edff": "getPriceSpeedPercent()", +"6da4fd5c": "TheBeardToken()", +"6da4fe26": "nextReward()", +"6da50777": "FreddieToken(address)", +"6da61d1e": "payoutOf(address)", +"6da66355": "pause(string)", +"6da705f5": "isOwnerOfJob(address,bytes)", +"6da72e7a": "reclaimByReceiver(uint256,address,bytes32)", +"6da78903": "SwapCreated(address,uint256)", +"6da79a93": "bid(uint256,uint256,uint256,address)", +"6da84ec0": "calcMarketFee(bytes32,uint256)", +"6da9a969": "toBRFWEI(uint256)", +"6daa212f": "applyPayback(address,uint256)", +"6daa2d44": "raiseDispute()", +"6daa9f56": "setExhaustionTime(uint256)", +"6daaf67b": "REFERRAL_PROGRAMS()", +"6dabccc9": "setmsg(address)", +"6dabd069": "emission(address,uint256,bytes32,uint256)", +"6dac8bea": "PREMIUM_CATEGORY()", +"6dacda85": "LOCKPERIOD()", +"6dad2a91": "getWinningAmount()", +"6dae014c": "test_basic_sanity()", +"6dae022f": "verifyTx()", +"6daf0866": "Hungrify()", +"6dafc6b7": "destructOne(bytes32)", +"6db1218d": "getAPSchedule()", +"6db14a1c": "PaulSportsCoin()", +"6db17f8d": "KriptoNeed(uint256,string,uint8,string)", +"6db19eb8": "specialGym()", +"6db31c25": "pay(string,address,uint256,bool,bytes)", +"6db3a788": "createHero(string,uint256,uint256,uint256,uint256)", +"6db4ba51": "requireNotEmptyAddress(address)", +"6db4bbf0": "donotYYYDappToken()", +"6db5c8fd": "maxDuration()", +"6db5d3b7": "modifyCommission(uint256,uint256)", +"6db66268": "remainingTokensPerPeriod()", +"6db736df": "Writers(address)", +"6db75799": "set_amount(uint256,uint256)", +"6db76efd": "decreaseFrozenBalances(address,uint256)", +"6db7f77c": "requestEarlySettlement()", +"6db90900": "returnAllRoomsBalance()", +"6db9ec44": "IWTfund()", +"6db9ee4d": "MixenCoin()", +"6dba46ac": "aprMintAdjustment()", +"6dbb7bcd": "getExecutorRegistry()", +"6dbd6689": "gupSold()", +"6dbe060d": "hashTest(string)", +"6dbe21b8": "setBounty()", +"6dbe2ebc": "calcUserDivsTotal(address)", +"6dbe31eb": "testSubBalance()", +"6dbe4bee": "MoonToken(uint256,string,string)", +"6dbf8108": "withdrawBounty(address)", +"6dc043d7": "draw_number()", +"6dc0a997": "pushAllocation(address,uint256)", +"6dc12f1c": "EvMigration(address,uint256,uint256)", +"6dc1a075": "setMaxOpenAttacks(uint256)", +"6dc1f360": "VersionControl()", +"6dc214af": "bitCrystalEscrow()", +"6dc34462": "Timed(uint256,uint256,uint8)", +"6dc37dee": "changeReviewRules(uint256)", +"6dc3e97e": "addGame(bytes32,address,address,uint256)", +"6dc3edcf": "executeExecutable(uint256,uint256)", +"6dc455a4": "WinnerWithdrew(address,uint256,uint256)", +"6dc4faea": "withdrawnTeam()", +"6dc51f1e": "advisoryBoardFundManager()", +"6dc55f7e": "RANGEEND_7()", +"6dc56397": "career_path()", +"6dc57da6": "getTimestampOfDayStart(uint256)", +"6dc585b6": "toRICH(uint256)", +"6dc7a627": "canClaim()", +"6dc7d164": "addSignature(uint256,uint256,address)", +"6dc88e1f": "addAngelIdMapping(address,uint64)", +"6dc8dbd4": "calculateMaxTokensIssued()", +"6dc92426": "makeSellOrder(address,uint256,uint256)", +"6dc944f6": "withdrawTotalDevEarned()", +"6dc9ab89": "get_orderAddress(address,address,uint256,uint256,uint256,uint256)", +"6dca35da": "newCampaign(uint256,address,uint256)", +"6dcb0cf8": "typeOf(address)", +"6dcb672b": "EBanker()", +"6dcba059": "goToNextStep()", +"6dcd16d7": "computeBids(uint256)", +"6dcd6eb9": "withdrawPendingAmounts()", +"6dcdd00f": "Allowance(address,address)", +"6dce14cd": "LBTokenSale(uint256,uint256,uint256)", +"6dcea85f": "setMarket(address)", +"6dd01116": "getWishContent(uint256)", +"6dd0c3d8": "setENGDevAddress(address)", +"6dd0c51e": "RESERVED_STAFF_GROUP()", +"6dd0d091": "retaliate()", +"6dd13a29": "ICOStarted(uint256,uint256,uint256,uint256)", +"6dd186c4": "YeYingOil()", +"6dd1f71c": "RTokenMain(uint256,string,string,uint8,address)", +"6dd22ccd": "getMixParticipant(bytes32,uint256,uint256)", +"6dd23b5b": "constructor(address,address,address)", +"6dd28241": "deprecatedSince()", +"6dd2bfca": "setDevfee(uint256)", +"6dd35c7b": "topBalance(address,uint256)", +"6dd3a823": "Neptun()", +"6dd40168": "preSaleMinimumWei()", +"6dd40905": "getQuestionVotesAllCount(string)", +"6dd43d1f": "attachSubscriptionModule(address)", +"6dd4927b": "reName(string,string)", +"6dd4c13c": "allowsSignup()", +"6dd5b69d": "getConfig(bytes32)", +"6dd5bb11": "oraclize_query(string)", +"6dd6e673": "buySanSlot(address,uint256)", +"6dd6e87b": "checkOut(int256)", +"6dd749ba": "getSpaceById(uint256)", +"6dd77c5d": "etherToUSDRate()", +"6dd7d8ea": "vote(address)", +"6dd8d3bf": "buy_energy(address,uint32,uint32,uint64,uint32,uint64)", +"6dd9fde9": "transferTokensToNonEthBuyer(address,uint256)", +"6dda1291": "hotPotatoPrize()", +"6dda9b24": "bva(address,uint256,address)", +"6ddc7e65": "gracePeriodAfterRound0Target()", +"6ddcb442": "getPhaseStatus(uint256)", +"6ddd07f8": "getEngineById(uint256)", +"6ddd707f": "TDTToken()", +"6dde33ea": "deathData_a13()", +"6dde8b18": "removeWhitelistedTransfer(address,address)", +"6ddeaae0": "investorReferrals(address,address)", +"6ddf09c4": "ICToken()", +"6ddf12ae": "ecdouble(uint256[3])", +"6de00927": "GetUserRank(uint8,address)", +"6de09e28": "affiliatesAllocAddress()", +"6de0b375": "openBet(uint256)", +"6de12905": "updateMeta(string,string)", +"6de343cd": "SNTPlaceHolder(address,address,address,address)", +"6de3afc9": "EduCoin()", +"6de53001": "clearApproval(address,uint256)", +"6de5897c": "ECOMCASH()", +"6de60a07": "ContinueSuspendedEmployee(address,uint32,uint32)", +"6de6220b": "OwnerO()", +"6de65097": "OwnerRemoved(address,bytes32)", +"6de685f6": "START_TIME_SALE()", +"6de725a3": "callTx(bytes,address,uint256,bytes)", +"6de74bbe": "setratePreSale(uint256)", +"6de758a1": "PWGLToken(address,address)", +"6de79d17": "TIANYECoin()", +"6de7a31d": "getEvotTokenAddress()", +"6de84a4f": "bankMultisig()", +"6de996b4": "getPlayerSpaceshipAuctionPriceById(uint256)", +"6de9ebb1": "setBlogRegistry(address)", +"6de9f32b": "tokensMinted()", +"6dea2088": "MAX_FUNDS_RAISED_DURING_PRESALE()", +"6deaf623": "calculateEthToVibe(uint256,uint256)", +"6deb515d": "disapproveInvestorsInBulk(address[])", +"6dec665e": "motionWaiting(uint256)", +"6dec7a93": "setInfo(string,string,string)", +"6ded82f8": "isPaid(address)", +"6dee2032": "getOpenOrdersOf(address)", +"6dee275a": "c_STQperETH()", +"6deebae3": "subtract()", +"6deefc7a": "sellable()", +"6def1efc": "getPreviousFeeWindow()", +"6defbf80": "ready()", +"6defd595": "getCovfefe(uint256)", +"6defe0b9": "isTimeOver()", +"6defe888": "Criptomedicina()", +"6df006f3": "frozenToken()", +"6df03165": "setTimeOutAuthentication(uint256)", +"6df088bf": "winnerDecided(uint256,address,uint256)", +"6df0a7e7": "setContract(string,string)", +"6df0b557": "getPlayerSpaceshipAuctionById(uint256)", +"6df15719": "STWY()", +"6df1667c": "same(string,string)", +"6df26327": "additionalEmission()", +"6df26d14": "startEarlyStage1()", +"6df3edef": "getSavedBytes()", +"6df55024": "LogBuyTokens(address,uint256,string)", +"6df5ee2b": "withdrawPresale()", +"6df6ca7a": "getDivsBalance(address,address)", +"6df7f38f": "sellForBitcoin(address,uint256)", +"6df83012": "startLockUpSec()", +"6df8359f": "WorkOrderStarted(uint128)", +"6df86816": "ActionAgonPlat(address)", +"6df99d81": "CCH_TEL_AVIV_01()", +"6dfa8d99": "totalEarned()", +"6dfada86": "mintToken(address,uint256,address)", +"6dfc15a4": "changelp6(address)", +"6dfc2fa8": "isInProgress()", +"6dfd3c5a": "interestReceived()", +"6dfe512e": "initPGOMonthlyInternalVault(address[],uint256[])", +"6dfe869b": "Preallocation(address,uint256)", +"6dfe8a34": "setSkillName(address,uint256,bytes32)", +"6dff8216": "cbAddresses()", +"6e008b35": "calculateResult()", +"6e034f4d": "tokensaleBuyTokens()", +"6e038c4f": "firstTotalSupply()", +"6e051dba": "ReserveTokensHolderMock(address,address,address)", +"6e0550e5": "stepOneEndTime()", +"6e0560c3": "doNotAutoRefund(address)", +"6e05d3ca": "Z1CoinGenesis(address)", +"6e064f6a": "HedglyStakingToken()", +"6e06a9ce": "changeTimeOneSession(uint256)", +"6e06ac9d": "UNSPAM(string,string,uint256,uint256,bool)", +"6e0712b1": "setIcoParams(uint256,uint256,uint256,uint256,bool,bool,uint32,uint32,uint256)", +"6e075e30": "reinvestAmount(uint256)", +"6e0763f3": "RPNCoin()", +"6e07979d": "tokenBlogs()", +"6e080d86": "register(string,string,bool,string,address,uint256,uint256)", +"6e083bc7": "credoEthExchangeRate()", +"6e094b67": "TPS()", +"6e09a4ab": "diff(uint256[],uint256[])", +"6e0b0c80": "MIToken()", +"6e0bd282": "destroy(bytes32)", +"6e0c7867": "createDataObject(bytes32,address,bytes32,address,bytes32)", +"6e0cd415": "isPositionCalled(bytes32)", +"6e0d98fe": "setProbabilities(uint32[])", +"6e0da3ee": "WoodToken(uint256,string,string)", +"6e0da971": "tokensSoldIco()", +"6e0dd984": "setCapUsd(uint256)", +"6e0e7e85": "withdrawERC20Compatible(bytes32,uint256,uint256,uint256[])", +"6e0f8d68": "stage_1_price()", +"6e0fb1c5": "FOUNDER2_STAKE()", +"6e101967": "set_iconiq_pre_kyc_bonus_denominator(uint256)", +"6e106628": "getWinningReportingParticipant()", +"6e114511": "decreaseTotalSupply(uint256)", +"6e1180f8": "setOversightAddress(address,bool)", +"6e120023": "TimestampScheduler(address,address,address)", +"6e125009": "contractTokensAvailable()", +"6e1286fc": "getReward(uint256[])", +"6e12b46e": "requiredPoints()", +"6e13cdfe": "claimH2()", +"6e13d418": "stakeAddress(uint256)", +"6e140e6c": "TetherToken(uint256,string,string,uint8)", +"6e1479c0": "testControlCreateNewRevisionNotOwner()", +"6e14b71b": "PetsCoin()", +"6e15266a": "fifty_two_weeks()", +"6e1636bb": "logOrderCanceled(address,address,address,bytes32,uint8,uint256,uint256)", +"6e164e23": "claimTokens(uint256,address)", +"6e16f9ed": "iBird()", +"6e173a7f": "storeBlockHeader(bytes,bytes)", +"6e17e7c2": "nextFieldIndex()", +"6e18980a": "transferByLegacy(address,address,uint256)", +"6e18eba5": "ethUSDPrice()", +"6e18ff05": "getRefInfo(address,address)", +"6e1907cc": "test21(uint256)", +"6e1a1336": "setString(string,string)", +"6e1b6bcc": "checkMyBet(address)", +"6e1bd323": "MAX_TOKEN()", +"6e1cf038": "getNumNiceBets(uint256)", +"6e1d3c0d": "sudoku()", +"6e1d7d5e": "EtherIbe()", +"6e1e063f": "claimableRefund(address)", +"6e1e34c7": "TokensBoughts(uint256)", +"6e1ece25": "totalFeesValue()", +"6e1f777d": "createTokenToTeam()", +"6e2117f7": "forFunction()", +"6e217d30": "setBuyCourse(uint256)", +"6e219667": "p3()", +"6e21fc87": "_airdrop(address)", +"6e223710": "getRockInfo(uint256)", +"6e224034": "totalCrowdCoin()", +"6e22aea0": "AIW(uint256,string,string)", +"6e22d33e": "getBytesValue(string)", +"6e22e32b": "setMonethaAddress(address,address,bool)", +"6e233918": "buyTank(uint32)", +"6e241c5c": "_createExoplanet(string,address,uint256,uint32,string,uint32,uint8,string)", +"6e247f29": "Transfer_of_authority_logic(address)", +"6e2653ca": "AirSwapHandler(address,address,address)", +"6e275bd2": "transferFrom(address,address,address,address,uint256)", +"6e27d889": "lockTokens(uint256)", +"6e2857f2": "setEscrow(address,address)", +"6e287154": "setLocalRevenuPercent(uint256)", +"6e293817": "transferWithReference(address,uint256,bytes32,string)", +"6e2940eb": "NhCoin()", +"6e2a2d0a": "result_amount()", +"6e2adeee": "SweetToken(string,string,address)", +"6e2bf348": "getDiscountByAmount(uint256)", +"6e2c10a1": "unitedNations()", +"6e2c732d": "add(uint64,uint64)", +"6e2cde85": "drawPot(string,string)", +"6e2d53a6": "TreasureCoin()", +"6e2d604a": "thrash()", +"6e2da4b3": "proposeAction(address)", +"6e2db8d7": "addWhiteList(address,uint256)", +"6e2e2e4d": "showMessage(bytes32,uint256,string)", +"6e2e9c3b": "contributedUsd()", +"6e2e9ee1": "setKYCRequiredToReceiveFunds(bool)", +"6e2ede03": "getCollateralMarketsLength()", +"6e2edf30": "ETCSurvey(address)", +"6e2f0bb8": "newSaddleryCon(address)", +"6e2f10bd": "changeMerchantBeneficiaryAddress(uint256,address)", +"6e2f5f12": "sendToFaucet(uint256)", +"6e2fd470": "sharedExpenseWithdrawn()", +"6e30418b": "totalPlayerBalance()", +"6e30d411": "showDevBalance()", +"6e317da7": "changeRedeemer(address)", +"6e31f704": "DARIC()", +"6e321105": "losePercent()", +"6e32295e": "mDestroyTokens(address,uint256)", +"6e329aa9": "getPotato()", +"6e32cf8e": "admin_transfer_tempLockAddress(address,uint256,uint256)", +"6e33bc13": "COINS_TO_HATCH_1STRIPPERS()", +"6e349188": "MAXSOLD_SUPPLY()", +"6e34b4e4": "getPoolOwner(uint256)", +"6e3532fa": "getSubscriptionFee()", +"6e353435": "inputauction(uint256,uint256,string)", +"6e353a1d": "emergencyWithdrawal(address)", +"6e359afa": "changeTrueUSDOperation()", +"6e36893a": "ICOInvestment(address,uint256,uint256,uint8)", +"6e3706c8": "PRE_DURATION()", +"6e377202": "isAuthed(address,address)", +"6e3825d2": "checkMyTicket(uint32)", +"6e39891c": "currentDividendAmount()", +"6e39eb85": "resetNumberOfCandidates()", +"6e3a1e5c": "requestEthereumChange(string,string)", +"6e3ae353": "changeOrigDev(address)", +"6e3aff90": "getOrderString()", +"6e3bbebd": "ZJLTToken()", +"6e3c5759": "claim_partnerPreICOTokens(address)", +"6e3d5a9d": "getTopCompanyBlocksInBetween()", +"6e3de78a": "UNFOMO(string,string,uint256,uint256,bool)", +"6e3e1318": "takeFee(uint32)", +"6e3e82f9": "_computeCut(uint256,uint256)", +"6e3f3f1a": "proposal(address,uint256,address)", +"6e3f7ba0": "TokenFrozen(uint256,string)", +"6e3f8550": "walletReserve()", +"6e403cd7": "sendBread(address,uint256)", +"6e40975d": "ICOToken()", +"6e415d37": "farewellTo(address)", +"6e417c69": "executeRequest(uint256)", +"6e41a78f": "DRC()", +"6e41b1ad": "nameTaken(uint256)", +"6e41efb2": "ThawTransfers(address,bool)", +"6e4264ce": "initiateDeposit()", +"6e4324a3": "Cryptopus()", +"6e439078": "makeLogCancel(address,address,address,address,uint256,uint256,uint256)", +"6e441752": "teamToken2019()", +"6e44fcea": "isHoldTokens()", +"6e459cf1": "CrowdSale(address,uint256)", +"6e4602c8": "TimereumX()", +"6e46408d": "indexOfOwners(address,address)", +"6e4647d6": "vendingCreateCollectible(uint256,address)", +"6e468a8a": "CelticsCoin()", +"6e48670f": "zeroSub(uint256,uint256)", +"6e48a035": "closeVote(uint256)", +"6e49b1e1": "AnythingAppTokenPreSale(address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"6e4a6874": "setReceiver4()", +"6e4a7b26": "initializeCoins()", +"6e4a9f4d": "Nguen()", +"6e4ac25f": "TokenData(address,address)", +"6e4b0222": "setactivelevel(uint256)", +"6e4bfb37": "GenaroTokenSale(uint256,uint256,address,uint256,bytes32)", +"6e4c42a0": "getGameSides()", +"6e4c9829": "amountsOf(address)", +"6e4ca716": "totalEthRecieved()", +"6e4dd931": "GetPotInfo()", +"6e4df96e": "produceWine()", +"6e4e5c1d": "revealedCurves()", +"6e4e87e0": "sendQuickPromoBonus()", +"6e4eb9cb": "getSeedsSinceLastEvent(address)", +"6e4ed796": "blocksPerRound()", +"6e4f33b0": "change_delay(uint256)", +"6e4f68b5": "PONO()", +"6e4f749e": "freezeMethod(address,bool)", +"6e500306": "Bst()", +"6e50640c": "WinikToken()", +"6e506ee4": "managementTokenAllocation()", +"6e50c39c": "serializeState(uint256,int256[2],uint256[2],int256,bytes32,address,uint256,uint256)", +"6e50eb3f": "setEndsAt(uint256)", +"6e51be3d": "UmmahDinar()", +"6e52dcd6": "pauseChannels()", +"6e5320d1": "changeTokenInformation(string,string)", +"6e53909a": "setLockAdmin(address,bool)", +"6e5390d2": "woodAddress()", +"6e5406e3": "_0xLitecoinToken()", +"6e54181e": "right75(uint256)", +"6e5452fe": "OUTCOME_RANGE()", +"6e553f65": "deposit(uint256,address)", +"6e555a18": "testCreateContract(bytes32,uint16,bytes32,uint256,uint64,bytes32,uint64,bytes32,uint64,uint64)", +"6e556725": "initialEndPrice()", +"6e56dce5": "collectEtherBack()", +"6e56e5eb": "_emitUserBinded(uint256,address,bool)", +"6e56e895": "test_defaultPermissions()", +"6e575537": "MAX_OWNER_PERS_SITE()", +"6e57e7e0": "payOut(address,uint128,int256)", +"6e581673": "buyPackWithERC20Tokens(uint8,address)", +"6e593210": "getActiveSellOrders(uint256)", +"6e596aef": "moveCeiling(uint256)", +"6e59e570": "sendToOtherBlockchain2(string,string,address)", +"6e59f3f3": "createChannel(address)", +"6e5ac882": "root(address)", +"6e5aef4d": "getInitTime(uint256)", +"6e5b064c": "basicPricePerEth()", +"6e5deca4": "YaoDun()", +"6e5ecdff": "updateDependencies()", +"6e5f375e": "setGameStartedDividendPercentage(uint256)", +"6e5fd38d": "registerMultiple(address[],bool)", +"6e609af2": "FulfillmentUpdated(uint256,uint256)", +"6e60cf61": "freedWinPoolToTeam()", +"6e6260fa": "thresholdNewTokenPair()", +"6e62825a": "SCDCToken1()", +"6e62cdab": "nextRoundWinner()", +"6e62de19": "fundFailed()", +"6e63015c": "getCertifiersCount()", +"6e630649": "changeState(uint256,uint8)", +"6e635673": "deletePullPayment(uint8,bytes32,bytes32,string,address,address)", +"6e638d3b": "claimIFSReward(address)", +"6e640f4c": "candidat()", +"6e658fbe": "myFundsExpireIn(uint256)", +"6e6656d8": "setCallStackSize(uint256)", +"6e66644d": "changeStakingFeesOperation()", +"6e667c35": "contentURI(uint256)", +"6e66cc38": "TraceToToken(address,uint256,uint256,address)", +"6e66f6e9": "tokenReward()", +"6e676b69": "changeVotingRules(uint256,uint256,uint256)", +"6e67b803": "bid3(address,uint256[],uint256[])", +"6e680ee7": "CREATORS_WALLET_ADDRESS()", +"6e68751c": "revokeVestedTokensFor(address)", +"6e68ec59": "getSoilHumdtyException(bytes32)", +"6e69e7d7": "maximumNumberOfLoops(uint256,uint256)", +"6e6a1dc3": "weightedVoteCountsOf(uint256,uint256)", +"6e6a42ec": "retraitStandard_1()", +"6e6b4bed": "getArt(string)", +"6e6b8004": "upgradeGemsSpecial()", +"6e6beb07": "PreSaleBuy()", +"6e6bfca0": "cancelJobByProvider(bytes32)", +"6e6c4c58": "CrowdTmoney2()", +"6e6ca42f": "RefundError(address,uint256)", +"6e6ca6f5": "getLastTransferred(address)", +"6e6d83d2": "cancelLoanRequestAtIndexByLender(uint256)", +"6e6d9a6c": "Token(address[],uint256[])", +"6e6e8a02": "addWhitelist(address,address[])", +"6e6ed399": "priceValidSeconds()", +"6e6f2fe5": "DentacoinToken()", +"6e6fe3d6": "ClaimMTU(bool)", +"6e6ff8a9": "lockDays()", +"6e70096e": "withdrawEarnings(uint256)", +"6e70cb07": "getAssetHolders()", +"6e70de82": "transitionState()", +"6e720693": "RevokeEvent(address,address,uint32)", +"6e722fcb": "getIsBonusClaimed(uint256,address)", +"6e725302": "getRatio(uint256,uint256,uint256)", +"6e730a67": "setSecondStageEndsAt(uint256)", +"6e733f50": "getCap(string)", +"6e743fa9": "punkBids(uint256)", +"6e74774a": "MHCTokenIssue(address)", +"6e752548": "finalizeStartTime()", +"6e754efb": "daysnumber()", +"6e761a73": "claimDevReward(address)", +"6e76a89f": "validateReserves()", +"6e76fb4c": "MemberRemoved(address)", +"6e779481": "ADVISORS_CAP()", +"6e77d4bb": "CryptoMountainsToken()", +"6e787a48": "correctOriginalSupply()", +"6e78e95f": "CryptoLeaders()", +"6e79ae56": "deleteOpenAction(string,string,string,string,string)", +"6e7a824f": "TestCoin(uint256,string,string)", +"6e7b698f": "drops(address[],uint256)", +"6e7bc3e5": "addContractOwner(address)", +"6e7c1700": "getJobName(uint256)", +"6e7c1c2b": "getWithdrawDigest(bytes32,address,uint256,uint64)", +"6e7c77b6": "testClaimTokens()", +"6e7d9dc6": "transferCreatureOwnership(address)", +"6e7e3b2b": "contributors()", +"6e7f26ab": "distributeToken(uint256,address[])", +"6e80a869": "minimalInvestmentInWei()", +"6e823b47": "controlledBurn(address,uint256)", +"6e82e86a": "getHash(uint256[])", +"6e843a74": "AgreementUrlRu()", +"6e8480e0": "TokenMetadata(string,uint8,string,string)", +"6e8595f5": "CheckAddressVerified(address)", +"6e861c0e": "deauthorizeContract(address)", +"6e8755af": "updateRewardsFor(address)", +"6e880e4d": "PreminedAsset()", +"6e88147e": "tradeReport()", +"6e88274b": "GetBetBalance()", +"6e883095": "checkPrizes(address)", +"6e8851a9": "initSale2()", +"6e885bd7": "workerPoolHub()", +"6e88865a": "teamAddressFreezeTime()", +"6e88a7bd": "referrerFee()", +"6e88b4ef": "tgeStageBlockLeft()", +"6e88d5fa": "judgeFakeTokenAndTransfer(uint256,address)", +"6e899550": "setString(bytes32,string)", +"6e89d517": "Deposited(address,uint256,bytes)", +"6e8a3438": "TransferStatusChanged(bool)", +"6e8a3d4b": "SerpentIsRunning()", +"6e8a6d12": "updatePriceAddress(address)", +"6e8ab641": "Arbitragebit()", +"6e8ac0c8": "developersAllocation()", +"6e8add02": "setMainsale(address)", +"6e8b7c23": "numcalls()", +"6e8c2caf": "gameRunning()", +"6e8c57e6": "minBalanceToAllowContractCreation()", +"6e8d3007": "CapitalTechCrowdsale(address,address,address)", +"6e8d82af": "swapToken(address)", +"6e8dad74": "retrieveAccountBalance(bytes,bytes)", +"6e8dba91": "getInitialData()", +"6e8dc135": "WinnerSelected(address,uint256,uint256,uint256)", +"6e8ddc7a": "LuxArbitrageToken()", +"6e8de595": "setBoardMember(uint256,uint256,uint256)", +"6e8e39d1": "QRG(uint256,string,string)", +"6e8f7142": "put(address,string,string)", +"6e8f8d69": "getInvestorsCount(uint256)", +"6e900256": "addData(bytes32,bytes32,bytes32,bytes32[],uint256[],uint256[],uint256[],uint256[])", +"6e9067fb": "getRole(string)", +"6e90a590": "expectedTotalSupply()", +"6e914d97": "requestAdminTokenTransfer(address,address,uint256,string)", +"6e929838": "PAXToken(address,address,address,bool)", +"6e929d4c": "sendIBTCTokenToMultiAddr(address[],uint256[])", +"6e932270": "dewhitelist(address)", +"6e939d05": "moveFromState(bytes32,int8[128],uint256,uint256,bytes)", +"6e93dbdc": "koCommissionAccount()", +"6e940a29": "changeHost(address)", +"6e942390": "howMany(uint256,uint256)", +"6e942f82": "buildingCostWei()", +"6e947298": "getETHBalance()", +"6e94d278": "burnReputation(uint256,address,address)", +"6e95a066": "IouRootsPresaleToken(string,string,uint8)", +"6e96433f": "multiPartyTransferFrom(address,address[],uint256[])", +"6e96463f": "BonusesUpdated(address,bool)", +"6e965a89": "calculateWeeklyTokensSupply()", +"6e968bca": "getSidesArray(uint256)", +"6e96bbeb": "crowdsalePurchasesLoaded()", +"6e96dfd7": "_setPendingOwner(address)", +"6e97041e": "SCPS1Token()", +"6e970dfd": "retireMaster(address)", +"6e974fd6": "approveWalletFeeData(uint256)", +"6e977865": "dadFab()", +"6e978d91": "right90(uint256)", +"6e98a92b": "fundManagementAddress()", +"6e995bd9": "updateChannelState(uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"6e9960c3": "getAdmin()", +"6e997972": "modSymbol(string)", +"6e99d52f": "COOLDOWN_PERIOD()", +"6e9a41c3": "DraftCrowdsale(uint256,uint256,uint256)", +"6e9af3f7": "giveForce(address)", +"6e9b134e": "LogCancelDelivery(address,string)", +"6e9b41d4": "releaseForGoolaTeam()", +"6e9c3683": "getIndexByProposalId(bytes32)", +"6e9c4650": "prepaidUnits()", +"6e9c4d0a": "rateTenant(uint256)", +"6e9c931c": "stake(uint256,address,uint256)", +"6e9cfb79": "itemReturn()", +"6e9d3b9d": "AtoOneCoin(uint256,string,uint8,string)", +"6e9e48ef": "tokenIdToOwner(uint256)", +"6e9ffe2b": "updateTransferRestrictionVerifier(address)", +"6ea007b3": "dailyLimitLeft()", +"6ea056a9": "sweep(address,uint256)", +"6ea07a36": "recoverSimple(bytes32,uint8,uint256,uint256)", +"6ea11f65": "togglePublicMatches()", +"6ea141cb": "AddBonusToList(bytes32,uint256,uint256)", +"6ea150e2": "changeWithdrawTimeRange(uint256,uint256)", +"6ea16f3a": "tryRefund()", +"6ea16f81": "houseTraits(uint256,uint256)", +"6ea34ce4": "getPartById(uint256)", +"6ea38199": "getMoreAuctionDetails(uint256)", +"6ea3b6d1": "ICO_Finished()", +"6ea3f1cb": "GetFreebie()", +"6ea405d3": "Tax()", +"6ea412b1": "Exchanged(address,uint256)", +"6ea42555": "pack(uint256)", +"6ea451e4": "setSaleLimit(uint8)", +"6ea51811": "icoStartP4()", +"6ea521d9": "_voteAs(address,uint256,uint256,uint256,string)", +"6ea68360": "newMasterCopy()", +"6ea69c91": "closePositionOnBehalfOfRecurse(address,address,address,bytes32,uint256)", +"6ea6b71b": "tokensRaised()", +"6ea6d76d": "initGame(string,bool,uint256)", +"6ea6db3c": "token(uint256,string,uint8,string,address,uint256)", +"6ea6f0c3": "initializeTopUpLimit(uint256)", +"6ea7064b": "contractorProposal(uint256,address,uint256,string,bytes32,address,uint256,uint256,uint256)", +"6ea79583": "team_wallet()", +"6ea798bc": "MyMiniToken(uint256)", +"6ea8efea": "getGameNum()", +"6ea928d9": "getSymbolHash()", +"6ea96bcd": "defaultBuyerLastPaidAt()", +"6eaa0f16": "CCTOKEN()", +"6eabb2f6": "getWineryOperation(string,address,uint256)", +"6eabcd69": "__abortFuse()", +"6eac86d4": "settleTransaction(bytes32)", +"6eaccf4c": "privilegedTransfer(address,address,uint256)", +"6eacd48a": "ownerPauseGame(bool)", +"6eadcc87": "tokenSetup(address,address,address,address,address)", +"6eaddad2": "setDevPercent(uint256)", +"6eadeba0": "resolve_block_hash(uint256)", +"6eae0843": "getTeam(uint16,uint8)", +"6eae555d": "amendDisputeDispersal(uint256[])", +"6eaefc87": "tokenExchangeRateBase()", +"6eafbe88": "ChangeTeamHolder(address,address)", +"6eb060ea": "setMinBuyPublic()", +"6eb09ce2": "ethbalance(address)", +"6eb1546d": "_removeBid(uint256)", +"6eb1e09a": "fechVoteMainInfoByStage(uint256)", +"6eb21929": "softcapReached()", +"6eb227ce": "getCurrentWeek()", +"6eb25ed8": "distributionOne(address)", +"6eb267ab": "CxNtoken(address)", +"6eb2a749": "isMaySale()", +"6eb2f0cc": "payShareholders(uint256)", +"6eb305aa": "getTimestampInSeconds()", +"6eb47ea7": "linkTeamToUser(address,bytes32)", +"6eb5197d": "getFirstAdmin()", +"6eb58224": "castDocumentVote(uint8,bytes32,bool)", +"6eb5ad4f": "lockPriceChange()", +"6eb5bef0": "addressSupporters()", +"6eb5ebae": "FidgETHSpinner()", +"6eb6c8fb": "MoneyToken()", +"6eb6ffa7": "initialQuorumPercent()", +"6eb769d2": "tokenTotalSold()", +"6eb7b4c2": "underdogInfo(uint256)", +"6eb7c67b": "_getEthPrice()", +"6eb85627": "Stalincoin()", +"6eb86537": "getAllPackage()", +"6eb91683": "donateForContractHealth()", +"6eba2b13": "getOrder(address)", +"6eba68f9": "ICOFactoryVersion()", +"6ebb6d80": "attack(address,uint8)", +"6ebbe863": "updatePublishContract(address)", +"6ebbfd5a": "addItemTo(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"6ebc0af1": "tranche()", +"6ebc6200": "CURRENSEE(address,address,address)", +"6ebc8c86": "getContract(uint256)", +"6ebcf607": "_balances(address)", +"6ebd9d7f": "setApiRegistryContractAddress(address)", +"6ebdac12": "removeProductFromCart(uint256)", +"6ebe299f": "adventureDataContract()", +"6ebf10fe": "storeHeader(bytes,address)", +"6ebf5223": "ProofOfSheepM()", +"6ec012e7": "saleIndex()", +"6ec03f7a": "removeCrydrView(string)", +"6ec05f13": "EURWEI()", +"6ec069f8": "teamOneDivsUnclaimed()", +"6ec0ce6e": "_isController(address)", +"6ec232d3": "gasprice()", +"6ec236ed": "calculateTaskDeposit(uint256)", +"6ec23e53": "OPTIToken()", +"6ec25a06": "tokenCreated(address,uint256,string)", +"6ec2e979": "bothHaveAttribute(address,address,bytes32)", +"6ec2f223": "createVestingInternal(address,uint256,uint256,uint256,uint256,bool,address,uint256)", +"6ec32f9c": "getRepayAmount(uint256)", +"6ec386d3": "AutoChainTokenCandy()", +"6ec3af26": "addTrustedIssuer(address,bytes)", +"6ec40f9e": "GAME_POOL_INIT()", +"6ec4c951": "claimWithdraw(address,uint256)", +"6ec4e5b8": "callERC165SupportsInterface(address,bytes4)", +"6ec5239f": "setAvatar(string)", +"6ec62f29": "assertEq28(bytes28,bytes28)", +"6ec6d4a6": "setMinLimit(uint256)", +"6ec7743d": "getSubjectClaimSetEntryAt(address,uint256,uint256,uint256)", +"6ec782d9": "changeWaitTime(uint32)", +"6ec84711": "organizer6()", +"6ec99dd0": "testGetBlobStore()", +"6ec9b125": "EtherSphere()", +"6eca017e": "releaseForYoobaTeam()", +"6eca4a50": "UKTTokenController(bytes32,bytes32)", +"6eca6a9e": "updateRecordName(uint256,string)", +"6ecaa195": "coolness(uint256)", +"6ecb97cd": "getInitializeNumOutcomesValue()", +"6ecbb556": "UAPCrowdsale(uint256,uint256,uint256,address,address)", +"6ecc7bcf": "CeezetTokin()", +"6ecc9ad9": "getInstallments(uint256)", +"6ecd1129": "nextAvailableLevel()", +"6ecd7b70": "CancelSale(uint256)", +"6ece5937": "endGame(uint256,string,address)", +"6ece7d88": "doVote(uint256,uint256)", +"6eced029": "getMsgGasAfter()", +"6ecf9f7b": "hype()", +"6ed0b9d7": "changeStage(uint8,uint256,uint256)", +"6ed28ed0": "store(uint256,uint256)", +"6ed2d8c6": "giantFYou(address,uint256)", +"6ed2fc5c": "PRESALE_WEI()", +"6ed33343": "dsp()", +"6ed33b98": "addSupportedToken(address,address,uint256,uint256,uint256)", +"6ed34394": "totalLockPrincipal()", +"6ed3f468": "sendsignature()", +"6ed40f9d": "isValid(string,string,uint256,uint256)", +"6ed43eb0": "getInvestorList(uint256)", +"6ed4d0c7": "dataCenterGetResult(bytes32)", +"6ed51d94": "isValidBuyOrder(address,address)", +"6ed55eb5": "setUserRating(address,uint8)", +"6ed5777e": "BuyHORSEtokens()", +"6ed5f880": "withdrawGTA(uint256)", +"6ed65dae": "sendCount()", +"6ed6da9e": "getUserById(uint256)", +"6ed6e17a": "updateCurGamePrizeInfoWithDraw(uint256,address,uint256)", +"6ed776b2": "createToken(address,address)", +"6ed7c013": "move_monsters()", +"6ed7e058": "rememberAllRequiredBlockHashes()", +"6ed84231": "TOURNAMENT_BATTLE()", +"6ed89fbc": "_transport(uint256,uint256)", +"6ed963b7": "EthereumTravelCrowdsale(uint256,address,address)", +"6ed9c19f": "calculateMasked(address,uint256)", +"6ed9fd89": "avgGas(address)", +"6edb2e8a": "sellPropertyAndChangeOwnership(address)", +"6edb4cf6": "testThrowRetractLatestRevisionDoesntHaveAdditionalRevisions()", +"6edb9ab0": "batchDepositTo(address,address[],uint256[])", +"6edbba2e": "numFree()", +"6edbd134": "hasHash()", +"6edbeb1c": "verificationHoldersTimestampMap(address)", +"6edc7ba7": "getExchangeFunctionSignatures(address)", +"6ede2106": "EtherIn(address,uint256)", +"6ede696b": "PaymentProcessor(address)", +"6edf1cc4": "getWithdrawalForAddress(address,address,uint256)", +"6ee0400d": "ICOBonusPercent1week()", +"6ee1844e": "KnownOriginDigitalAsset(address)", +"6ee18573": "addWhitelistOperator(address)", +"6ee2627b": "maxFundLimit()", +"6ee2e362": "CleanCurrentRoomAndRound(address)", +"6ee2ed5d": "totalSpinners()", +"6ee31a18": "upgradeToken(address)", +"6ee3d453": "modifyGameItemPrice(uint256,uint256)", +"6ee3e896": "setDefeats(uint256,uint16)", +"6ee4b475": "InitialBlockCount()", +"6ee4d553": "cancelOracleRequest(bytes32,uint256,bytes4,uint256)", +"6ee5d676": "getSumCourse()", +"6ee61483": "changeBuyin(uint256)", +"6ee63f1f": "MineableToken()", +"6ee64345": "endMainSale()", +"6ee678ae": "_burn(address,address,uint256)", +"6ee74b3c": "Test5()", +"6ee7826f": "_getRoundedPrice(uint256)", +"6ee78aea": "isMultiple(uint256)", +"6ee7a063": "createInstance(address,bytes32,address,bytes32,bytes)", +"6ee8067f": "whitelistManagerAddr()", +"6ee84bb7": "SDD_Erc223Token()", +"6ee88301": "getRoomOwner(uint256)", +"6eea4820": "QBT()", +"6eeb553f": "pollBurnCompleted()", +"6eeb7a36": "setCreator(address,bool)", +"6eeba5c6": "short_party()", +"6eebad9e": "Jitech(uint256,string,uint8,string)", +"6eebb73f": "activateZone(int32[],int32[],uint8[],uint8[])", +"6eec21d6": "vault_deposit(address,uint256)", +"6eec2dd2": "Released(bytes32)", +"6eec3db6": "allocateAdvisorTokens()", +"6eecb7c2": "getDomainTypehash()", +"6eecf81a": "SetPrcntRate(uint256)", +"6eedc46d": "tokenWalletChange(address)", +"6eee2dad": "mintRewardTokens(address,uint256)", +"6eeeca03": "finalizeSale2()", +"6eef0326": "placeBetOdd(uint256)", +"6eef2cb7": "functionTwo()", +"6eef7a05": "bytesToString(bytes32)", +"6eef908f": "startReceiveTicket()", +"6ef0a5cf": "singleTransferToken(address,uint256)", +"6ef0c864": "SetDataAddress(address)", +"6ef0f37f": "setHome(address)", +"6ef181a8": "setRarityMultiplier(uint8)", +"6ef1a114": "transfersRemaining()", +"6ef1f3a6": "luckyOne(uint256)", +"6ef27042": "CentraToken()", +"6ef33b8f": "getInfo3(address,address)", +"6ef3732d": "fixDividendBalances(address,bool)", +"6ef3ef7e": "approveData(address,uint256,bytes)", +"6ef4e8db": "getCalcToken()", +"6ef61092": "withdrawn(address)", +"6ef72aaa": "BattleResult(address,address,uint256[],uint256[],bool,uint16,uint256,uint32,uint32)", +"6ef791bb": "WylSistContract()", +"6ef8c661": "addInfoListItem(bool,address,address,uint256,string)", +"6ef8d66d": "renouncePauser()", +"6ef958df": "changeSource(string,string,uint256)", +"6ef98b21": "withdrawOwner(uint256)", +"6ef9bc29": "phase3EndingAt()", +"6ef9e145": "weiBalances(address)", +"6efa0621": "SPPSeriesB(uint256,string,uint8,string)", +"6efa629d": "releaseFees()", +"6efa6a67": "PAYOUT_PCT()", +"6efab8f2": "overloadedMethod(address)", +"6efaf16c": "disableAutoSeller()", +"6efbb60a": "addONG(bytes32,string,string)", +"6efbd610": "coownerPrice()", +"6efd1adf": "RATE_EXPONENT()", +"6efd5974": "signedApproveHash(address,address,address,uint256,uint256,uint256)", +"6efe39a3": "getEncryptedKeyFromRequest(uint256,uint256)", +"6efef04d": "setLevelEndDate(uint256,uint256)", +"6eff2044": "onlyOwnerOrManager()", +"6eff8071": "addFuelFree(uint256,uint256,uint256,uint256)", +"6eff96f2": "rafflepot()", +"6effb219": "changeCreditFundNIMFAAddress(address)", +"6effb579": "stop_sell(uint256)", +"6effdda7": "Trade(address,uint256,address,uint256,address,address)", +"6effe1c7": "startSale2Phase()", +"6effec50": "forwardCall(address,uint256,bytes)", +"6f00a3cf": "DumpDivs()", +"6f00ad8a": "lastmoney()", +"6f00fd97": "createTokenTransaction(address,uint256,uint256,uint256,uint256,address,uint256)", +"6f015889": "Activate(address,uint256,string)", +"6f0166c4": "GeoGems(address)", +"6f01d915": "addHedge(address,uint256,uint256,bytes3,bytes3,uint64,bytes32,bytes32)", +"6f020775": "totalCoinLock()", +"6f022ac4": "cancelMigration(address)", +"6f02483f": "EtherGang()", +"6f024899": "Destructible()", +"6f025aec": "MolikToken()", +"6f025c84": "MithrilDemo()", +"6f03e307": "setTiersInfo(uint8,uint256[],uint256[],uint256[],uint256[],uint8[])", +"6f03e4f9": "getClientBalances(address)", +"6f0470aa": "candidates()", +"6f04ff33": "increaseSalesBalance(address,uint256)", +"6f0503ad": "setDerivePayoutDistributionHash(bytes32)", +"6f05994e": "addBalanceFor(address,uint256)", +"6f0663f0": "RadioCoin()", +"6f069cfe": "technik()", +"6f06fdb3": "hasAgreement(uint256)", +"6f079f90": "getPricingEndsAt()", +"6f086122": "preSignedHashing(bytes8,address,address,uint256,uint256,uint256,uint8)", +"6f08effa": "manualBonus()", +"6f09240f": "runScript(bytes,bytes,address[])", +"6f0963b0": "isMemberBlocked(address)", +"6f096f75": "investorPayment(address,uint256)", +"6f0a150f": "restartRound(bool,bool)", +"6f0a74d5": "_8_poluchaetLesha()", +"6f0ac394": "getCP(address)", +"6f0b5180": "buyFor(address)", +"6f0cd3a6": "m_active()", +"6f0cfab6": "DNSResolver()", +"6f0d0a38": "CrocsFarmer()", +"6f0f45d2": "OPERATIONS_ADDRESS()", +"6f0fccab": "getTokenName(address)", +"6f0fdce8": "Task(address)", +"6f1003c4": "minEsteemAmount()", +"6f109879": "impl_transferMSM(address,address,uint256)", +"6f10d1a0": "addNewToken(bytes32,address,address)", +"6f10fdbd": "totalPlay()", +"6f117190": "getInitialTerrain(uint256,uint256)", +"6f11a859": "availableAirdrop(address)", +"6f1236e1": "ETHPriceProvider(string)", +"6f1296d2": "wrapEther()", +"6f13b95d": "editTokensForHour(uint256)", +"6f13e01b": "EthVenturePlugin()", +"6f13eb09": "BlockChainZB(uint256,string,string)", +"6f1427b2": "icoInProgress()", +"6f147f5c": "addWhiteListed(address[],uint256[],uint256[])", +"6f14dc62": "storehouse(bytes32)", +"6f152670": "max_fundingGoal()", +"6f15847f": "recordInfo(bytes32,uint256,string)", +"6f159c4f": "founder_token()", +"6f16a595": "PRICE_MIN()", +"6f17a516": "ln_fixed3_lnr(uint256,uint256)", +"6f181303": "ScriptCallable()", +"6f18337d": "IHF(address,uint256)", +"6f18d3f5": "traded_token_is_seeded()", +"6f1a5b72": "updateTokenHolder(address)", +"6f1a78cc": "deleteWebsite(address)", +"6f1aa1f5": "requestTokenIssue(address,uint256,string)", +"6f1ae5de": "_itemRemoveMarkets(uint256)", +"6f1c8a51": "_getHash(address,bytes32)", +"6f1ca0c2": "preicoSupply()", +"6f1cecd8": "unreadMessages(address,uint256)", +"6f1db0b7": "createNewBid(string,uint256)", +"6f1e54c3": "sellMyTokensAmount(uint8,uint256)", +"6f1e6419": "MANHATTANPROXYYORKAVE()", +"6f1e738c": "updateISIN(string)", +"6f1fb766": "sealedBids()", +"6f200ce3": "transferBlock(address,address,uint256)", +"6f204f20": "getChannelInfo(address,address,uint8)", +"6f2130d3": "amountOfCRs(address)", +"6f2223c5": "getRefereeAddress(address)", +"6f227851": "USDValue()", +"6f2293ab": "transferFrom(address,address,uint256,bool)", +"6f22993c": "moveTokens(address,address,uint256)", +"6f22d6a5": "losses()", +"6f24fe30": "notifyPledgeNotPayed(uint256)", +"6f253319": "CurrentGoldPrice()", +"6f259077": "STAGE_ONE_TIME_END()", +"6f2594a0": "moduleMultiOwner(address)", +"6f264776": "buy10tickets()", +"6f264b2e": "requiredTokenAddress()", +"6f26d566": "dailyLottery()", +"6f28a853": "assertNotSpent(uint256,int256,bytes32,bytes32)", +"6f28ee09": "storeHash(string,string)", +"6f290893": "Refund(address,uint256,uint256,int256)", +"6f29c88a": "exchangedNum()", +"6f2b1226": "upgradeBank(address)", +"6f2f098b": "Cite(bytes32)", +"6f2f7a57": "getWinNumber()", +"6f2fc06b": "proxyPayments(address)", +"6f2feb0a": "approveAndSell(uint256,uint256)", +"6f307dc3": "underlying()", +"6f30e1ee": "PunkBidWithdrawn(uint256,uint256,address)", +"6f3165d3": "UpgradeRig(uint8,uint256)", +"6f320970": "vernamCrowdSale()", +"6f322fef": "Atra()", +"6f326ac6": "checkStorageProof(bytes32[],address)", +"6f32a937": "min256(uint256,uint256,uint256)", +"6f32b2ac": "setRSPScienceAddress(address)", +"6f32b4cb": "mainICOSecondWeekEndTime()", +"6f3355af": "isBreakingCap(uint256,uint256)", +"6f335870": "sections()", +"6f3395b2": "_tradeEtherDelta(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256)", +"6f33ae68": "HouseFeeUpdate(uint256)", +"6f341804": "activeteICO(uint256)", +"6f34a7ff": "sanctuary()", +"6f35c749": "SECONDS_OF_DAY()", +"6f362c2b": "latestSpender()", +"6f3640f7": "getRealUsdAmount()", +"6f36ce79": "insert_deal(address,address,uint64,uint128,uint32)", +"6f370b20": "Austriachain()", +"6f373cb7": "PullRequestClaimed(uint256,uint256)", +"6f374a12": "setBool()", +"6f37f48b": "firstToken(address)", +"6f38e410": "maxLevels()", +"6f3921ee": "extended()", +"6f3a7561": "SimpleAuction(address)", +"6f3ad341": "ICO_ONE()", +"6f3b2819": "secondChainHNw2()", +"6f3b4759": "lockMultiple(address[])", +"6f3b60d6": "latestOrderId()", +"6f3b6d00": "RESERVED_TEAM_SIDE()", +"6f3b8ce2": "getArrayAddress(bytes32)", +"6f3b97a4": "DeactivatedContract(uint256)", +"6f3bb97f": "unsetVipAddress(address,address)", +"6f3be1da": "lift_ban()", +"6f3be6b7": "ELEXTROCOIN()", +"6f3bf6ea": "GMC()", +"6f3c8566": "redeemWarriors()", +"6f3d8043": "valueAfterReducingFee(uint256)", +"6f3f6870": "CertAdmins(address)", +"6f3fe404": "updateBalances()", +"6f414fbb": "sale1Started()", +"6f4215b1": "setEthRate(uint256)", +"6f42879f": "wantsToFight(uint256,uint256)", +"6f42934d": "getTimePurchase()", +"6f42c901": "teamAddresses(address)", +"6f43233a": "getAnyAddressTokenBalance(address,address)", +"6f44c4d7": "recipientVIP()", +"6f4618d8": "firstReserveAllocation()", +"6f468289": "CONTRIB_PERIOD2_STAKE()", +"6f475e7f": "validateTransfer(address,address)", +"6f476cbc": "opMinted()", +"6f479f57": "changeSellingPrice(uint256,uint128)", +"6f47b075": "test_set_get_Policy()", +"6f47e218": "sharesRaised()", +"6f4812e2": "testFailControllerInsufficientFundsTransfer()", +"6f48455e": "checkMinMaxInvestment(uint256)", +"6f488063": "getPOOL_edit_7()", +"6f494049": "registerPublicKey(uint256,uint256)", +"6f49a3c0": "openChest()", +"6f4a2cd0": "distributeRewards()", +"6f4b31cc": "Bastonet()", +"6f4bda17": "numberOfPlayers()", +"6f4be234": "EMJAC()", +"6f4c6443": "invite(address,address)", +"6f4ca36e": "Tracto()", +"6f4ce56a": "indexOf(bytes32)", +"6f4d469b": "addMembers(address[])", +"6f4d6f5d": "ShitToken(address)", +"6f4d80e5": "m_state()", +"6f4db6a7": "hasRepeat(uint8[4])", +"6f4dd69c": "testSetBalanceUpdatesSupply()", +"6f4dfede": "GetExpireTime()", +"6f4eb87e": "test_removeFromRegistry()", +"6f4ebb70": "calculate_reward(uint256,address,uint256)", +"6f4efd53": "POTJ()", +"6f4f2ec3": "ERC20Template(string,string,uint8,uint256,address)", +"6f500df5": "claimCofounditTokens(address)", +"6f503750": "LogPermit(bytes32,bytes32,bytes32)", +"6f503e67": "vestingOf(address,uint256)", +"6f512e61": "setSgdToEthRate(uint256)", +"6f51d01f": "getUserBlockNumber(bytes32)", +"6f52167d": "payDuel(address,string,address,string)", +"6f53a48a": "Bitprize()", +"6f53da8f": "benefitFunds()", +"6f53df6c": "EtheraffleLOTPromo()", +"6f540fe0": "setCampaign(address)", +"6f54e4df": "candyper()", +"6f54e89e": "getMaximumFunds()", +"6f5736c6": "getFreeFalcon()", +"6f5831cb": "startTokensSale(address,uint256,uint256,uint256,uint256)", +"6f584bd8": "View_TrustlessTransaction_Info(uint256)", +"6f58659b": "totalRewardIssuedOut(address)", +"6f59a5cc": "curBubbleNumber()", +"6f5b286d": "tokenUnsold()", +"6f5cca83": "withdrawForCompany()", +"6f5d616b": "execPermissions(address)", +"6f5d64fa": "FSNASAddress()", +"6f5d712e": "TOTAL_TOKEN_CAP()", +"6f5da839": "Token(uint256,string,string,uint8)", +"6f5da961": "transferEntityOwnerPull(address)", +"6f5e7398": "dasToken()", +"6f5eb4b5": "publicSell(uint16)", +"6f5f20ce": "INITIAL()", +"6f5f7ba2": "CreatedYUPIE(address,uint256)", +"6f5f8f74": "Cryptoloans()", +"6f5f9498": "InitializedManager(address)", +"6f6007bb": "StartdatePresale()", +"6f609714": "FrameworkToken()", +"6f625567": "roleAdd(address,string)", +"6f62cba3": "resetUserRefBalance(address)", +"6f62e755": "changeGatewayAddr(uint32,address,string)", +"6f63d2ec": "left66(uint256)", +"6f64234e": "sendFunds(address,uint256)", +"6f64824b": "setErc677token(address)", +"6f64ccf5": "checkVestingTimestamp(address)", +"6f652e1a": "createOrder(address,uint256,uint256,uint256)", +"6f6541e0": "SetLot(uint256)", +"6f656c2d": "getPhaseEmissionType(uint256)", +"6f6640c1": "AnthillFarmer()", +"6f66d23b": "adminGetWorldData()", +"6f6781d3": "getPosition(uint8)", +"6f68d634": "acceptTrusteeOwnership()", +"6f68fffd": "setEndSaleTime(uint256)", +"6f691500": "getMySecondAmount()", +"6f698fb5": "setMinimumQuorum(uint256)", +"6f6aadfb": "SnovPresale()", +"6f6b32ad": "PVXToken()", +"6f6b6963": "VestingCreated(address,address,address,uint256,uint256,uint256,uint256,uint256)", +"6f6bdbe3": "specialUsers()", +"6f6c0244": "generateShortLink()", +"6f6c0759": "onlyPayForFuel()", +"6f6c7234": "setApoderadoVerify(bytes32,bytes32,bytes32)", +"6f6cd9f5": "isElectionPeriodProposal(uint256)", +"6f6d3694": "removeRound(uint256,uint256)", +"6f6eacee": "availbleToken()", +"6f6f828e": "removeAllTournamentContenders()", +"6f6f9bef": "getLandInfo(uint256)", +"6f6ff3bc": "setVesting(address)", +"6f7030f6": "calculateCuts(uint256)", +"6f704aa6": "TreasureToken(address,address)", +"6f70a22f": "deadlineThree()", +"6f70b9cb": "getWinningChildUniverse()", +"6f7154c8": "getIsStopFunding()", +"6f71f407": "freeze(address,uint8)", +"6f72fd20": "calculateBonus(uint256,uint256)", +"6f74174d": "finalizeIt(address)", +"6f741cff": "getPauserList()", +"6f7429ab": "modifyDescriptionManual(uint256,address,string)", +"6f7495cb": "unproducedCaps()", +"6f74dafe": "getGodAddress()", +"6f752f09": "backendContract()", +"6f75b00c": "removeBuyer(address)", +"6f75cd14": "DappToken()", +"6f766f20": "refundTRA()", +"6f7705c2": "becomeRichest(string)", +"6f77926b": "getUser(address)", +"6f784c5b": "totalAmountOnICO()", +"6f78ee0d": "rap(bytes32)", +"6f7920fd": "tokenCreationCap()", +"6f79301d": "getCreationTime(bytes32)", +"6f796d86": "JACK(string,string,uint8,uint256)", +"6f799cf9": "_amountRaised()", +"6f7b5a56": "getDEditorArbitraryData(bytes32,bytes)", +"6f7d9acf": "setupInitialSupply()", +"6f7f461d": "manager1()", +"6f7fc989": "teamIssue(address,uint256)", +"6f80602b": "NewOrleansCoin()", +"6f80dc23": "obfuscatedHashDataBlock(string,string)", +"6f8177f4": "MentalhealthToken()", +"6f81adf6": "Resilium()", +"6f81bdd8": "setRate(uint256,bool)", +"6f826a7d": "testIsEmpty(bytes)", +"6f82e068": "initialSupplyPerChildAddress()", +"6f838a8e": "TESTCOIN1()", +"6f8489af": "CreateGMT(address,uint256)", +"6f84eb6c": "setPatronReward(uint256)", +"6f853964": "setPriceCoeff(uint256)", +"6f8543a6": "CoWithdraw()", +"6f85c7e4": "WAITING_PERIOD()", +"6f85e62c": "buyTokens(string)", +"6f863c21": "inviteIter_()", +"6f872022": "setSectionForSaleToAddress(uint256,uint256,address)", +"6f874abb": "setgasUsed(uint256)", +"6f87dddd": "getPlayerStageKeys()", +"6f882086": "KNCBalance()", +"6f893e0d": "LeeroyPremiumToken()", +"6f8b44b0": "setMaxSupply(uint256)", +"6f8b7574": "createTransaction(address,address,uint256,string,uint256,uint256)", +"6f8c33a6": "getGoldDepositOfAddress(address)", +"6f8c3c0e": "MIToken(uint256,string,uint8,string)", +"6f8c3e4c": "SaraAndMauroToken()", +"6f8c9575": "yearFor(uint256)", +"6f8d3eb0": "withdrawPAXTR(uint256)", +"6f8d998c": "dist(uint256,uint256)", +"6f8dca87": "GetCost(uint256,uint256,uint256)", +"6f8e0a08": "getreward()", +"6f8e1fb6": "testOverflowResistantFraction()", +"6f8ee91c": "level_6_amount()", +"6f8f1de5": "mock_resetLatestPayday(address,address)", +"6f8fb2c3": "CROWDSALE_WEI_GOAL()", +"6f8fccd7": "BioChainCoin()", +"6f9090db": "setwinPercent(uint32)", +"6f90be06": "playFromBalance()", +"6f910c4b": "checkProviderOwnerSupply(uint256,bool)", +"6f9125a5": "pylonSelled()", +"6f9170f6": "isWhiteListed(address)", +"6f919068": "LogUnPause(bytes32)", +"6f91cec0": "ProvideWorkOrder(address,address,address,uint128)", +"6f92096b": "setGasForward(address)", +"6f923a7c": "LockSAToE()", +"6f925535": "revokeAccess(address,uint8)", +"6f92f186": "multiply(address)", +"6f93638e": "isSolvent(uint256,uint256)", +"6f941290": "SelfDropTokens(address,uint256)", +"6f9477c0": "BanAccount(address,bool)", +"6f947d6d": "_emitPublicCapabilityAdded(address,bytes4)", +"6f94e260": "buybackPriceOf(uint256)", +"6f94e502": "getVoter(uint256,uint256)", +"6f954161": "changePreJackpotBidLimit(uint256)", +"6f95dd0b": "RATE_DAY_21()", +"6f9607e5": "countYears()", +"6f964659": "depositMint(address,uint256,uint256)", +"6f969c2d": "getNonFungibleBaseType(uint256)", +"6f96f269": "Mehrancoin()", +"6f977413": "Property(string,string)", +"6f993a74": "rollFour(address,uint8,uint8,uint8,uint8)", +"6f9a023c": "theultimatepyramid()", +"6f9a5eab": "createTx(uint256,address,uint256)", +"6f9b0b7d": "getCurrentGameState(bytes32)", +"6f9b4c1d": "createCastleSale(uint256,uint256,uint256,uint256,uint256)", +"6f9ba978": "_reward(address)", +"6f9c3c8f": "fundReserve()", +"6f9c6194": "P2E()", +"6f9cd7b2": "mirtestToken()", +"6f9cdccd": "setMarketMaker(address,address)", +"6f9d257d": "CONFLICT_END_FINE()", +"6f9d73db": "BuyRocketForSaleEvent(address,address,uint32)", +"6f9f51c7": "RefundsDisabled()", +"6f9fb98a": "getContractBalance()", +"6f9fbd7c": "generateCrabHeart()", +"6f9fdd66": "trust()", +"6f9ff0fa": "GetDynamicCardNum(uint32,uint256)", +"6fa00f07": "agreementSignedAtBlock(address)", +"6fa01c8e": "init(bool,address,uint128,uint128,address,uint64,address,uint256)", +"6fa07d0d": "oraclize_query(uint256,string,bytes[5])", +"6fa0bf39": "getRankDynamic(uint256)", +"6fa1532e": "UpdateBalance(address,uint256,bool,address)", +"6fa15c21": "setPreIcoEndDate(uint256)", +"6fa1d6da": "totalAwardCalculation()", +"6fa23eac": "ShouWangXingAIGO(uint256,string,uint8,string)", +"6fa23f73": "setSupplyLimit(uint16,uint16)", +"6fa25d9a": "Log2_fnc(address,bytes32,uint256,string,string,string,uint256,bytes1,uint256)", +"6fa28249": "getClaimsIdByType(uint256)", +"6fa4095e": "emitHavvenUpdated(address)", +"6fa42742": "arbitrator_question_fees(address)", +"6fa4c766": "revertFunds(address,address,uint256)", +"6fa4f5f7": "setRefPercent(uint256)", +"6fa58335": "tgeDuration()", +"6fa64cd6": "miningIncentiveTokens()", +"6fa65c4f": "MICRODOLLARS_PER_DOLLAR()", +"6fa668f3": "weiForPayment()", +"6fa6ad21": "getDeprecated(bytes32)", +"6fa6c360": "validateTranscriptHash(address,uint256,bytes32)", +"6fa81a3a": "IcoTimeRangeChanged(address,uint256,uint256)", +"6fa87f66": "Moongang(uint256,uint256,uint256)", +"6fa88aa3": "BrazilvsCostaRica()", +"6fa8de90": "changeMeatParameters(uint256,uint256)", +"6fa9ba07": "ShowMsg(bytes)", +"6fa9e255": "LiftUpVets(string,string,uint8,uint256)", +"6faa22a5": "polyToken()", +"6faa52b3": "getOwnerHistoryAt(bytes32,uint256)", +"6faaeca2": "finishBallot(bytes32)", +"6fab5ddf": "Fal1out()", +"6fab94c1": "BitplusToken()", +"6fac46e5": "numberOfRazzes()", +"6fad0a4d": "KPOP_CELEB_CONTRACT_ADDRESS()", +"6fae3d76": "access(address)", +"6faed0e5": "set_master_exchange_rate(uint256)", +"6faf4803": "BitcoinDiamondTest()", +"6faf9323": "TokensPurchased(address,address,uint256,uint256)", +"6fb1eb0c": "commissionFee()", +"6fb1edcd": "sellAllOutcomes(uint256)", +"6fb2d01e": "calculateBonusForHours(uint256)", +"6fb37c18": "TChainToken()", +"6fb3ba9e": "setWorking(bool)", +"6fb438dc": "getTotal(uint256[])", +"6fb487fc": "getListener(address)", +"6fb4adff": "changeFundWallet(address)", +"6fb642de": "setActionContract(address,bool)", +"6fb65c7f": "grantReserveToken()", +"6fb66278": "ratePreICO()", +"6fb6fde6": "AuthAdmin(address,bool,uint256)", +"6fb7110f": "BuckySalary()", +"6fb7b52e": "addCheck(address,address,uint256,bool)", +"6fb7e588": "encodeTokenId(int256,int256)", +"6fb7f147": "getPendingExplore(address)", +"6fb7fc8b": "deltaBalances(address,address,address[])", +"6fb84e84": "fetchVoteInfoForVoterByIndex(uint256,address)", +"6fb8a70d": "responseCounts(uint256)", +"6fb8b885": "RESERVED_TOKENS_FOR_ROI_ON_CAPITAL()", +"6fb93e15": "BuyARXtokens()", +"6fb99dfb": "EventRemoveManager(address,address)", +"6fb9a2b4": "newCrowdsale()", +"6fba4aa9": "GUOcoin()", +"6fba7544": "setMinStartingPrice(uint256)", +"6fbaaa1e": "currentMultiplier()", +"6fbb222a": "setExtendedPlayerAttributesForPlayer(uint256,uint8[])", +"6fbb439e": "assign(string)", +"6fbc15e9": "upgradeTo(address,bytes)", +"6fbc8456": "setUID(uint256,uint32)", +"6fbcbd4f": "WarriorGenerator(address,uint32[])", +"6fbcd0f6": "AnitiToken(address,uint256,uint256)", +"6fbcd1fb": "_getAltarRecord(uint256)", +"6fbd6f6b": "acceptContactRequest(address)", +"6fbdae47": "getArrayInfoForDepositCount()", +"6fbde40d": "setSaleAuctionAddress(address)", +"6fbe769d": "cards_black_total()", +"6fbf466c": "unscannedCaps()", +"6fc141da": "lastPaydayTS()", +"6fc14837": "setMaxStake(uint256)", +"6fc1cbbd": "RexToken()", +"6fc21429": "setgamecardintro(uint256,string)", +"6fc351c2": "Elsevier(uint256,uint256)", +"6fc3911c": "checkVerificationStatus(address)", +"6fc39a38": "changeAgencyReceiver(address)", +"6fc3b0b6": "getTime4(address)", +"6fc3c817": "confirmer()", +"6fc4f2c2": "isOnPreAuction(uint256)", +"6fc559bb": "tokenGrants(uint256)", +"6fc651f3": "TokenAGC(uint256,string,string)", +"6fc65924": "getDisputeEndTime()", +"6fc6df36": "fYou(address,string,string)", +"6fc8e920": "icoBonus4EndDate()", +"6fc90a2f": "submitSolution(uint256,string,bytes)", +"6fc98ee1": "mintTokens(address,address,uint256)", +"6fc9958a": "initBundle(uint8,uint256)", +"6fc9d5e4": "changeCompareTo(uint256)", +"6fca2023": "getSharedAccountsLength()", +"6fcac869": "BONUS_4_DAYS()", +"6fcaea0c": "set_iconiq_presale_open(bool)", +"6fcb0153": "issuanceLastAverageBalance(address)", +"6fcb1500": "defaultSweeper()", +"6fcb4463": "signUpOn()", +"6fcbb546": "extractOre(string)", +"6fcc52e7": "gujarat()", +"6fcdcb3e": "setOwnerLink(address,uint256[2])", +"6fce2d65": "updateAccount(uint256,uint16,bytes32,uint16,bytes32)", +"6fceaea2": "convertToMiniGGC(uint256)", +"6fcebff8": "ConversionSentToShapeShift(uint256,address,address,uint256)", +"6fceecf8": "withdrawRestriction(address)", +"6fcfbe85": "FAFA(address)", +"6fd075fc": "addPlayer(address,uint256)", +"6fd09735": "createDistrito(uint256,address)", +"6fd1bdea": "setProduct(uint256)", +"6fd2e6d0": "TFFC()", +"6fd37039": "WebPaisa()", +"6fd396d6": "lastRewardTo()", +"6fd3a2bc": "createTokensManually(address,uint256)", +"6fd3db86": "withdraw(uint256,bytes32,uint256)", +"6fd42b32": "safeWithdrawal(address)", +"6fd44086": "adviserSupply()", +"6fd463ed": "addressOfTokenUsedAsReward1()", +"6fd5036d": "userChannelsCount(address)", +"6fd507f2": "Tube()", +"6fd5790d": "getCuota(uint256)", +"6fd59b01": "foundationFundMultisig()", +"6fd5ab58": "getTextBytes96()", +"6fd5ae15": "level()", +"6fd63728": "feeFunds()", +"6fd7c035": "EventRedeemStatic(address,uint128,uint256,uint256)", +"6fd7c34c": "setMemberRegistry(address)", +"6fd8282f": "priceLastUpdateRequest()", +"6fd86d44": "emitAccountUnfrozen(address)", +"6fd902e1": "getCurrentBlockNumber()", +"6fd9101f": "ACAToken(uint256,address)", +"6fd9227e": "TokenSold(address,uint256,uint256,bool)", +"6fd98bee": "updateTimes(uint256,uint256)", +"6fda5534": "rockOwningHistory(address)", +"6fdada81": "proofOfRich(string,string)", +"6fdb4f42": "revokeUsers(address[])", +"6fdbc590": "CreateDil(string)", +"6fdc202f": "ownerTransfership(address)", +"6fdc45a3": "BangdiToken(address)", +"6fdca5e0": "setOpen(bool)", +"6fdcc8a9": "listRecords()", +"6fdd2ab4": "createStage(uint8,uint256,uint256,uint256,uint256)", +"6fdd5f58": "ShopKeeper(address)", +"6fde3dc0": "getRunesValue(uint256)", +"6fde8202": "upgradeabilityOwner()", +"6fde90bc": "setCCH_edit_2(string)", +"6fdf9a3f": "sendToRstForAddress(address)", +"6fdf9f28": "setBDError(uint256,bytes)", +"6fe00356": "investorIDs()", +"6fe02e98": "tier3Rate()", +"6fe0e395": "initialize(string,string,uint256,uint256)", +"6fe11695": "isMajority(uint256)", +"6fe12f07": "proverka6()", +"6fe1dbec": "sendSupportETH(address,uint256)", +"6fe1f6b4": "BAD_ERC20()", +"6fe33720": "YOTOKEN()", +"6fe356ea": "moduleIsExist(string)", +"6fe3a567": "tokenMigrated()", +"6fe3ef7c": "resolveEntityAddress(address)", +"6fe497f0": "lockStatus(address,bool)", +"6fe4c195": "lockAddress(address,address,uint256)", +"6fe5091e": "collectPayout(uint256)", +"6fe5b536": "testFailSetEnforceRevisionsNotOwner()", +"6fe64289": "RepuToken()", +"6fe665e9": "SlotMachine()", +"6fe691dc": "getUserTransactions()", +"6fe69dee": "RealtyCashToken()", +"6fe7567b": "_subPurchasedFrom(address,uint256)", +"6fe7f51c": "saleWasSet()", +"6fe83236": "getAllCardAddressesCountOfOwner(address)", +"6fe8c29e": "JEY()", +"6fe8f9c5": "freeTokens()", +"6fe9e7d7": "freezeUserFunds(address,address,uint256,uint256)", +"6fe9f632": "preICOrates(uint256)", +"6febfd02": "getSiteRewards(uint256)", +"6fee558c": "getHookOperatorContractAddress()", +"6fee8458": "burnExcess()", +"6feef2bf": "cancelTknOffer()", +"6fef4fa9": "setAllowedToSell(bool)", +"6ff026e7": "purchased_snt()", +"6ff03fc2": "_removeMaster(address)", +"6ff08dd6": "calcWhiteBase(uint256)", +"6ff10dd7": "TrioPeriodicTransfer(address)", +"6ff1c9bc": "emergencyWithdraw(address)", +"6ff1ed71": "pickUp(uint256)", +"6ff1f2b8": "refererPercent()", +"6ff26ebb": "longBuy()", +"6ff2817c": "batchDetachAssets(uint256[])", +"6ff28657": "Josephtoken()", +"6ff2c12a": "setMiniPoolEdit_6(string)", +"6ff36340": "eTimesChain()", +"6ff46ba7": "deathData_a10()", +"6ff5a670": "PortalToken()", +"6ff6c4b8": "setCreatorFeePercent(uint256)", +"6ff73201": "setCooldownTime(uint256)", +"6ff79410": "numberOfComponents(address)", +"6ff89159": "revokePermission(address,string)", +"6ff8a27e": "buyTokens(address,uint16,address)", +"6ff8e332": "allowedAirDropTokens()", +"6ff93476": "tokensAllocatedForFs(address,address)", +"6ff968c3": "successor()", +"6ff97f1d": "allTokens()", +"6ff9db5b": "msgHash(bytes)", +"6ffa1257": "etherSoftCap()", +"6ffa1caa": "double(int256)", +"6ffa1d48": "LogCreateICO(address,address,uint256)", +"6ffa1ea7": "getRegulatorProxy(uint256)", +"6ffa714d": "extractDepositCommitmentRecord(address[],uint256[])", +"6ffb341e": "calculateKebabBuy(uint256,uint256)", +"6ffbff9c": "importMET(bytes8,bytes8,address[],bytes,bytes32[],uint256[],uint256[],bytes)", +"6ffc0896": "checkIfSuccess(bytes32)", +"6ffc13ab": "POMPAMCOIN()", +"6ffc22b8": "finalizeReservedAddress(address)", +"6ffcc719": "bet(uint256,uint256)", +"6ffd673d": "getcomp()", +"6ffe67f2": "autoDestruct()", +"6ffea7bd": "preToken()", +"6fff0652": "changePlayerTeam(uint256,uint256)", +"6fff15ee": "percPoints(uint256,uint256)", +"6fffffff": "HDK_Crowdsale()", +"70011870": "credexx(address,address,address,uint256,uint256,uint256)", +"7001a2a2": "elcoin()", +"7001fcc2": "closeImports()", +"700215d0": "SellFinishedAutos()", +"70021705": "watchVideoC(address)", +"7002a4e0": "setPartIndex(uint256,uint256[])", +"7003433a": "setRealityCheck(address)", +"70037a71": "setPresaleWhitelist(address,bool)", +"7003a1a3": "EosBlock()", +"7003ce6f": "UController()", +"70049c1c": "forwardEherToOwner()", +"7004a914": "ArbitraryLocker(address,uint256,uint256,uint256,uint256)", +"7006d538": "verificaCertificato(string,bytes32)", +"7007adc9": "finalBlockNumber()", +"7008a4a3": "firstWavePrice()", +"70090164": "PRIVATE_ADDRESS()", +"70097106": "addContent(string,string,uint256)", +"700a7db1": "setCriterionTime(address,uint256)", +"700b7025": "EthereumHotCoin()", +"700c9474": "addUsers(address[])", +"700d3230": "isPiSale()", +"700dd5eb": "AuthorityNotified(string,string)", +"700df1f6": "setMigrationStabitcoinAddress(string)", +"700e17b5": "setData(uint256,uint256,uint256,uint8[])", +"700e8660": "Marriage(string,address)", +"700ef803": "SafeBox()", +"700f1a77": "clampMax(uint256,uint256)", +"700f3a1d": "addToken(string,int256,bytes)", +"700f4e40": "test_invalidProxyOwnershipTransfer()", +"700f55b2": "addTx(address,address,uint256,uint256)", +"700f9d03": "logEndBal()", +"7010129a": "tokenTransferVIP(address,uint256)", +"70101735": "releaseReservedTokens()", +"70103ea7": "setPaperFee(uint128)", +"70107c43": "_zthToken(address)", +"70119d06": "incBy(uint256)", +"70133e4f": "Xerium()", +"70144f8f": "activate_kill_switch()", +"70150282": "FMWorld(address,address,address)", +"701513c0": "addBooking(uint8,uint256)", +"70152dcf": "getPrivacyCoins()", +"7015913c": "end(bytes32)", +"70165470": "ICOFailed(uint256,uint256)", +"70183a4d": "stakingExpiration(bytes32)", +"70185b7e": "updateSafeBalance(uint256)", +"7018665b": "transferMS(address,uint256)", +"7018dcb9": "getCastleNum()", +"7018e950": "affiliatesAllocation()", +"701969e5": "Penny()", +"701ab8e2": "exitOnHaltFromCustodian(address,address[],uint256[],bytes,bytes,bytes32)", +"701adee0": "setRequireWhitelistedAddress(bool,address)", +"701b4063": "balanceOfAtBlock(address,uint256)", +"701b4631": "hasPayroll(address)", +"701b8826": "forwardTo(address,address,address,uint256,bytes)", +"701c3c28": "setApprovalRequirement(bytes4,uint8)", +"701d9ced": "setTransferOCE(bool,bool)", +"701dfb92": "HTL()", +"701e1dfc": "lastInvestorsProfit()", +"701e5729": "canInvest(address,uint256,uint256)", +"701e5e71": "_purchaseCar(uint256)", +"701fd0f1": "reveal(bytes32)", +"702056de": "REKTtoken()", +"70206b05": "RepoHandler(address)", +"7020940a": "NewHope()", +"7020b511": "chainlinkTokenAddress()", +"702123ae": "unitCoinProduction(uint256)", +"70212761": "saleFinalize()", +"7021fad7": "CheckoutLimDay(address,uint256)", +"70220023": "participantsFor3rdSale(address)", +"70228400": "isDonatedEthTransferred()", +"7022b58e": "confirm()", +"70232f00": "ClaimESC(address,uint256)", +"70239222": "testSHA256()", +"70239f0b": "serverEndGameConflictImpl(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,bytes32,bytes32,uint256,address)", +"70243248": "PeggleCoin()", +"70245bdc": "adoptCat()", +"7024ce7b": "BONUS_ICO_ROUND1()", +"702510be": "payoutSelf()", +"7025b3ac": "ROLE_KYC_VERIFIED_INVESTOR()", +"70260363": "setSignatures(bytes32,bytes)", +"702617e7": "ERC20(string,string,uint8)", +"70267867": "_addBridgeTokenFee(uint256,uint256)", +"70269774": "changeOwnerOfMonethaUsersClaimStorage(address)", +"7026aa04": "getProveHash(address,bytes32,string,bool,uint256,bytes32,uint256)", +"70279554": "budgetAllocation()", +"7028439e": "bonusPreIco()", +"70284d19": "grant(address)", +"7028875e": "changeStrikePrice(uint256)", +"7028b3b9": "GetConsentDataCount()", +"7029144c": "init(string,string)", +"702921f5": "month()", +"70296790": "clever()", +"702a3eff": "advisorsCliff()", +"702a5f4f": "setLLV_edit_31(string)", +"702b5f0b": "calcHash(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address)", +"702b7bc3": "insertValueBonus(uint8,uint256,uint256)", +"702c25ee": "nextMinimumPodSize()", +"702c728e": "changeCloudsPerEth(uint256)", +"702c789e": "select_bua_position(uint256)", +"702c9535": "distributeBalances(address[],uint256[])", +"702cbbae": "isTokenAvailable(uint256)", +"702d58d8": "JiJieHao(uint256,uint8,string,string)", +"702efdf3": "suspended()", +"702f23a6": "transferAndFreezeMulti(address[],bytes32[],address,address,uint256[],uint256[],uint256[])", +"702f9019": "Start_qui_qz(string,string)", +"702fc7da": "ReviewModel()", +"70316f00": "getUserPayedInCurrentRound(address)", +"70320126": "newWitness(address)", +"70320234": "calcBonusTokens(uint256)", +"70324b77": "darknodeBalances(address,address)", +"70327ea1": "disableSelfDestruction()", +"70328770": "logBalance(uint256)", +"7032d758": "SevillavsBayern()", +"7033e4a6": "supportsHistory()", +"7033f1ac": "TNTCoin()", +"7034c939": "test_2_destroyTokens()", +"7034d190": "MainSaleBuy()", +"70354053": "UCCoinSaleIsOff(uint256)", +"70357e79": "func_08D3()", +"70359b36": "makeSuperVisor(address)", +"7036f9d9": "force_partial_refund(address)", +"7037602a": "setAccountData(address,uint256,uint256)", +"7037ec6f": "payEntryFee()", +"70385f0d": "LogPolicyAccepted(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"70387c59": "hashVerification(bytes32)", +"70393686": "getCOOHashing(address,uint256)", +"703950ff": "viewKarmaVotes(uint256)", +"7039dcdc": "setBEY(address)", +"703a6beb": "getUnitsPerPeriod()", +"703aca29": "competitorExists()", +"703add31": "animatorAddress()", +"703b1411": "requestSellforFX(uint256)", +"703bf4a5": "disableGame(address)", +"703bf91f": "betSingle(uint256)", +"703c8a99": "_openProvider(bool,string,string,uint256,string,uint8,bool,address)", +"703dbd81": "setPI_edit_8(string)", +"703df793": "updateHardCap(uint256)", +"703e905b": "getIndexByHash(string)", +"703eb724": "addShare(address)", +"703ee574": "CoinvillaSupply()", +"703f5e8a": "CaDataAddress()", +"703fa81c": "DOSTToken()", +"7040bcc9": "createPlayer(uint256,uint256,string,string,string,string,string,string,address,uint256)", +"7040f3e5": "Allowance()", +"70416f7e": "getCurrentEthFee()", +"7041d925": "outsize(bytes4,bytes)", +"704248ec": "tokensale()", +"7043ca8e": "getOwnerNickName(address)", +"7044ce75": "setTKC(address)", +"70459be2": "transferLeftover()", +"7045b469": "TotlePrimary(address)", +"704691e1": "LuckToken()", +"70477e2b": "Rozium()", +"70480275": "addAdmin(address)", +"7049a425": "MarketboardListingDestroyed()", +"7049cd98": "LinglongCatCore()", +"704a60f1": "failUserRefund(uint256)", +"704b164d": "setTradeIsOpen(bool)", +"704b6c02": "setAdmin(address)", +"704d4051": "periodSalesLimit()", +"704d4ab1": "getLostAndFoundMaster()", +"704d4db0": "poolTotal()", +"704dcedd": "LSC(uint256,string,string,uint8)", +"704dd019": "changeFeeCut(uint8,uint8)", +"704e3dda": "TokenSalePaused(bool)", +"704e7437": "bountyPart()", +"704f1b94": "registerUser(string)", +"704f236c": "freezeAccount(address,address,bool)", +"70502c5a": "testDeleteItem()", +"70505653": "arbitrationAddress()", +"705099b9": "refundTicket(address,uint256)", +"7050a1ea": "TimetechToken()", +"705145c4": "quickCloseChannel(bytes32,address,uint256,address,uint256)", +"7051a831": "setIsContainerForReportingParticipant(bool)", +"7051b075": "TransferToBuyer(address,address,uint256,address)", +"705211f4": "approveAccess(address)", +"7052dad9": "withdrawRemainingTokens(uint256)", +"7053fe8d": "finalize_contract()", +"70544b74": "emergencyDrain(uint256)", +"70544eb9": "hijackPrice()", +"7055011b": "escrowHistory(address,address,uint256,uint256)", +"7055060f": "bulkStoreHeader(bytes)", +"7055410b": "retrait_5()", +"70557298": "testTransferFrom()", +"7055d368": "vote(uint256,uint256[])", +"7056b50f": "blockstillcontracthackable()", +"7056d1f4": "burnLotIdsByAddress(address)", +"70578bda": "SPMTToken(address,uint256)", +"705791f2": "TOKEN_STARTED()", +"7057c20d": "CFD(address)", +"705882f2": "setPOOL_edit_22(string)", +"7058901e": "mtcDailyLimit()", +"70590ca2": "batch(uint256[],address[])", +"7059194e": "deletePlayer(uint256)", +"70597cb1": "startCompanySell()", +"70598a8e": "subTokenBalance(address,uint256)", +"705a3644": "block3()", +"705a940a": "disableBondingCurve()", +"705b164f": "acquireFreeEgg()", +"705b37f4": "getTotalF1()", +"705b5c27": "transferVestingMonthlyAmount(address)", +"705b7efd": "preSaleContributions()", +"705b8845": "askQuestion(string,string)", +"705bbf6b": "updatePrenup(string)", +"705bbfe6": "eastadscredits()", +"705bd32a": "fundDevelopment(string)", +"705ca5cd": "getMultiRequestIdGivenRequestId(uint256)", +"705d528d": "_addMoney(address,uint256)", +"705dae11": "cancelCraftAuction(uint256,address)", +"705e798e": "getLastRoundInfo()", +"705eeb90": "MultipleConstructorTest(bool)", +"705f4630": "chfCentsPerEth()", +"705f911d": "FareBase(uint16,uint16)", +"705fbf3d": "burnTokensAndRefund(address,address)", +"705fe7c6": "testEqualityBytes()", +"7060054d": "dynasty()", +"70606cda": "supportFreezeQuorum()", +"7060bfe4": "busyWork(address,uint256)", +"706194b9": "elenctraToken()", +"7061e777": "Etats_financiers_10111011()", +"70620168": "createBroker()", +"706247a1": "SetVotingDescripion(string)", +"7062640a": "newDeal(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"706332d1": "right46(uint256)", +"70634626": "getBTCAddr(bytes32,int256,bytes32,int256)", +"70646896": "DOWN_etherWin()", +"70646de9": "canSend(uint32,uint32)", +"7064aa96": "APPROVE_CONTRACT()", +"7064b5aa": "getPendingExploreItem(address)", +"7064d509": "tokenBonus()", +"7064e50c": "tokenIssuedMainSaleIco()", +"7064f0af": "COMPANY_ALLOCATION()", +"7065bedc": "getSettingValuesByTAOName(address,string)", +"7065cb48": "addOwner(address)", +"706605b9": "withdraw_arbitrary_token(address)", +"70660f7c": "stakeExistingContent(bytes32,uint256,uint256,bytes8,uint256)", +"70670a20": "Ethash(address[3])", +"7067e881": "RATE_FACTOR()", +"7067f915": "Constructed(address,uint256)", +"706910ff": "buy(uint256,address,uint256,uint256)", +"7069e746": "stakingEpochStartBlock()", +"706a3604": "sethardcap(uint256)", +"706a99fb": "codeExportEnabled()", +"706aba4a": "RNDInvestor()", +"706b5759": "RegisterDomain(string,string)", +"706bfed4": "accessCheck()", +"706df8d6": "getDonationInfo(uint256)", +"706dfe54": "getIssueState(uint256,bytes32)", +"706e11bc": "StartRebuy()", +"706e5b6e": "getOTCTotalSupply()", +"706eb3ab": "ethUSDOracle()", +"706ed71b": "Bomx()", +"706f6496": "goldRate()", +"706f6937": "airdropTokens(address[],uint256[])", +"706f8856": "jiGouTotalBalance()", +"706ff617": "mint(uint256,uint256,address,uint256)", +"70708a3c": "LocalToken()", +"70712939": "removeAuthorizedAddress(address)", +"70713209": "TJCoin()", +"7071688a": "getValidatorCount()", +"707188c1": "changeTime(uint256,uint256)", +"70720fe4": "_maxTokenSoldICO()", +"7072a977": "gasForOraclize()", +"7072aaa3": "newSubdomain(bytes32,bytes32,bytes32,address,address)", +"7072c6b1": "restricted()", +"70732188": "getUserTaskAtIndex(address,uint256)", +"7073c072": "getRegisteredUsers()", +"70740aab": "purpose()", +"70740ac9": "claimPrize()", +"707424fe": "contributorsIndex()", +"70743768": "voteStake(bytes32,uint256)", +"70747544": "currentCapLevel()", +"7074c091": "preSaleBonus1Percent()", +"7075b1d8": "latestMonarchInternal()", +"7076738b": "_emitWorkPaused(uint256,uint256)", +"70767f6c": "fillBidByAddress(address)", +"7076e27f": "riskcoins(uint256)", +"70775a59": "_generic(bytes,uint256,address)", +"707789c5": "setOpsAddress(address)", +"7077c11f": "SubOnHold(uint256,bool,address)", +"70780a7a": "shareholder2()", +"70788340": "Marcelo()", +"7078f424": "getHint(int256,uint256)", +"707913f0": "Add_totalLotteryValue()", +"707a4e96": "start(uint256,uint256,uint256,uint256)", +"707a7ab3": "acceptOwnerTransfer()", +"707a92b8": "FoodCoinToken(uint256,string,uint8,string)", +"707afb1d": "closest(uint256,uint256,address)", +"707b543d": "createNumber(uint256)", +"707ba39e": "VilzToken()", +"707bd28b": "endAirDrop()", +"707bda7a": "GetLastRoomAndRound(address)", +"707bdf58": "MaxTokens()", +"707c4f05": "sendAllFunds()", +"707c6b4d": "blocksInSecondCapPeriod()", +"707c750e": "sixthTime()", +"707d4349": "createPromoCity(address,string,uint256)", +"707d5fe1": "payoutBonuses()", +"707dd840": "TAGCASH()", +"707e8128": "all_referrals_count_by_address(address)", +"707f4ecd": "crowdTokensTLP2()", +"707fe454": "MODXCOIN()", +"70809757": "dispute(uint256,uint256,bytes32)", +"7081150a": "iconToken()", +"7081d5da": "getPoolAvgHatchPrice()", +"708238a0": "mainSaleFirstBonus()", +"708260b4": "teamToken2018()", +"7082b421": "parseBlockHeader()", +"7082d203": "lend(address,uint256,uint256)", +"70835d98": "CoinAllocation(address,int64,int64)", +"70835f6b": "approveAddTokenData(uint256)", +"70844f7a": "sendBadge(address,uint256)", +"708484db": "blikedUntil(address)", +"708547f3": "testUpdateLawyer()", +"70858679": "YDHTOKEN_M(string,string,uint256)", +"70859da8": "TokenReturn(address,address,uint256)", +"7085b579": "b2s(bytes32)", +"70862562": "distributeTokens(address,address,uint256)", +"7086528e": "DemocracyVote()", +"70876c98": "purchase(uint256,uint256)", +"7087b272": "Coneus()", +"7087ed2c": "getClaimSeed(address)", +"70887eb9": "totalSoldTokensWithBonus()", +"7088abf0": "WhiteListCrowdsale(uint256)", +"7089e4f0": "LogBuyEnabled(bool)", +"708a4947": "getOptionState(address[3],uint256[3])", +"708b2097": "TKCC(uint256,string,string)", +"708b34fe": "submitMessage(string)", +"708b9d01": "lockThreshold()", +"708bf79a": "updateMember(address,address,uint256,uint256,string,uint256)", +"708c2956": "YouGive(uint256,uint256,string,string,address,address)", +"708cfb25": "setTeamTokensHolder(address)", +"708d0c57": "updateResolver()", +"708d9fd3": "group_key_confirmed()", +"708da969": "verifyAddress(address,string)", +"708ddf7b": "submitted()", +"708e03d9": "distributionOfTokens()", +"708eef42": "transferOwnershipWithHowMany(address[],address,uint256)", +"708f29a6": "getTotalPayments()", +"708f8940": "getEXECUTION_GAS_OVERHEAD()", +"70905dce": "emergencyAdmin()", +"7091e0c5": "setNewOwner(address,uint256)", +"70926370": "EGGS_TO_HATCH_1BANKER()", +"70936880": "defaultWaitTime()", +"70936a6e": "freezeOf()", +"7093ab11": "privateSell2LockEndTime()", +"70948956": "PolicyPalNetworkToken(uint256,address)", +"7094d21e": "isSuccessOver()", +"70961774": "getBlockCreatedOn()", +"70964be7": "startSellingPhase()", +"7096b6cb": "receiverContractAddress()", +"7097048a": "claimDerivativeTokens()", +"70983e91": "startBoardProposal(uint256,address)", +"70984e97": "bigBlind()", +"70985eb6": "setCrowdsaleContract(address,address)", +"7098ad13": "PropertyCoin()", +"7098e670": "getFincontractInfo(bytes32)", +"70994b31": "getCollectibleDetails(uint256)", +"709a36e6": "getMiningMeta(uint256)", +"709a5359": "updatepresaleRate(uint256)", +"709bc0ff": "AntitiredToken(uint256,string,uint8,string)", +"709be206": "registerCreatorsPools(address[],uint256,int256)", +"709cc16e": "NewCup(address,uint256)", +"709cf8c0": "saleTokensVault()", +"709d8c4e": "DSPLT_A()", +"709e6ed4": "upgradeIdRange()", +"709eaa93": "minerCreatedCount()", +"709ecb39": "findPublisher(address)", +"709ef231": "sellTokens(uint256,uint256,uint256)", +"709f5ccc": "setDivisor(uint256)", +"709f6f25": "setData_19(string)", +"709f84a4": "PriceStrategy()", +"70a0014e": "projectFundingFail()", +"70a01b3d": "addInvestor(address,bool)", +"70a0246a": "toPony(uint256)", +"70a06777": "getTankAuctionEntity(uint32)", +"70a08231": "balanceOf(address)", +"70a0c458": "getBindAccountAddress(string)", +"70a0f1fe": "numChametzForSale()", +"70a14c21": "LogBump(bytes32,bytes32,address,address,address,uint128,uint128,uint64)", +"70a2b84a": "toggleAvailability()", +"70a4fc11": "toggleDataViewWindow(uint256)", +"70a6c4bb": "receiverWithdraw()", +"70a7b3e8": "_validEstimate(uint256,uint256,uint256)", +"70a7e2dd": "getBunny(uint32)", +"70a8609e": "test_someOtherTest()", +"70a89986": "addContribution(address,uint256,uint256)", +"70a951ce": "TripCash()", +"70aac052": "getRequestedProductsBy(address)", +"70ab2359": "MAX_CROWDSALE_CAP()", +"70ab2822": "assertEq21(bytes21,bytes21,bytes32)", +"70ab8ba8": "creditUpdate()", +"70ac4bb9": "right32(uint256)", +"70ac62ec": "getTranslationLanguageList()", +"70ac970b": "test_24_assertGasUsage700Boards()", +"70aca69a": "lockUpEnd()", +"70acbe0e": "rate_change(uint256)", +"70aceae8": "upX(uint256)", +"70ad0cc6": "delAddr(uint256)", +"70ad858b": "infoWithdraw13()", +"70ae882f": "finishNextGame()", +"70ae92d2": "nonce(address)", +"70ae992a": "pubKeyToAddress(bytes)", +"70aecf61": "getContractReceiver(address)", +"70b0d4ac": "GetAccountIsNotFrozenForReturnCount()", +"70b1d9d4": "requestCanonicalFormat(bytes)", +"70b257a4": "pushClient(address,bytes32)", +"70b2a30f": "tokenToEth(uint256)", +"70b2ef56": "EntropyTestToken()", +"70b2fb05": "bettingEnd()", +"70b3b0e5": "countriesWallet()", +"70b3c7de": "CrypteloPublicSale(address,address,address,address)", +"70b3d68c": "signHash(uint256)", +"70b3db6f": "getCoinAge(address,uint256)", +"70b45ca0": "_rateFromDay(uint256)", +"70b57415": "product2_pot()", +"70b581ad": "finalize(string)", +"70b60760": "getNodeIdsLength()", +"70b7596b": "getWinnings()", +"70b7f9f3": "setTradingAllowed(address,bool)", +"70b80d77": "WCME()", +"70b8206c": "getRoundRefIncome(address,address,uint256)", +"70b84e50": "joinToGame(uint256,uint8)", +"70b8d29a": "saveMsgByAdmin(string,string)", +"70ba1113": "percent()", +"70ba3339": "cancelTransaction(bytes32)", +"70bab35d": "systemStartingPriceMin()", +"70bad87e": "revokeFarmerCertificate(address)", +"70bb478f": "makeTrade(address,address,uint256,uint256,uint256,uint256)", +"70bc52fb": "protectAddress(address,bool)", +"70bdd155": "oracle_price_decimals_factor()", +"70be4ffa": "testErrorUnauthorizedSetPackage()", +"70be564b": "Trump()", +"70be61d1": "ApplicationInFundingOrDevelopment()", +"70be89c1": "addAddressesToWhitelist(address[],uint256)", +"70be8a86": "ownedCoin(address,uint256)", +"70bf7b96": "_collect_fee(address,address,uint256)", +"70c0b647": "getOwed(address)", +"70c0c516": "directMintLimit()", +"70c0f689": "getApplicationState()", +"70c10578": "takeProfit()", +"70c18199": "getResponse(uint256)", +"70c1854e": "FLOCK()", +"70c31afc": "tokenImprint(uint256)", +"70c33b31": "changeGasRequired(uint256)", +"70c35951": "referralPercentOfTotal()", +"70c40842": "_setTokenOwner(address,uint256)", +"70c4488d": "validNick(string)", +"70c494fc": "ATC()", +"70c4ce24": "newListing(string,uint256,string)", +"70c4f2e1": "MIN_SHARE_OF_POWER()", +"70c55e1f": "getTradingPairCutoffs(address,address,address)", +"70c5f786": "TEAM_CAN_CLAIM_AFTER()", +"70c5fc9d": "clearTickets()", +"70c690f4": "MultiOwnable(address[],uint256)", +"70c6abf5": "resetAllData()", +"70c6b20c": "newEntity(uint256,uint256)", +"70c7e230": "change_status(string)", +"70c80630": "isOwner(uint32,int256,address,address)", +"70c8251d": "AttributesSet(address,uint256)", +"70c83314": "airDropToken(address,uint256)", +"70c8405b": "GiftGenerated(address,address,address,uint256,uint256,string)", +"70c8658a": "getNewRegistry()", +"70c8f8ad": "createFirstRound()", +"70c9edb7": "BTCRelayTools(address)", +"70ca4c26": "getLinkedAddress(address,address)", +"70ca6446": "AnotherMethod(uint256,uint256,uint256)", +"70cbed78": "oracleCallbackGasPrice()", +"70cc5e45": "kgtHolderCategory()", +"70ccd928": "hashesLength()", +"70cd89eb": "CRLperMicroEther()", +"70cd9bfd": "GPRDSQToken()", +"70cda533": "updateCoeff(address,uint8,uint128,uint256)", +"70cddf74": "addApproval(address,address,uint256,uint256)", +"70ce0765": "createPromoListing(uint256,uint256,uint256)", +"70ce90d5": "ConfirmManager()", +"70cef2b8": "getVisaPrice(address,uint256,uint256)", +"70cf7508": "isValidAirDropForIndividual()", +"70cfaa8d": "calledUpdate(address,address)", +"70cfab63": "chargeFeeAndLockEthBalance(address,uint256)", +"70d01861": "adminSetCity(address)", +"70d02691": "getAssetBalances(address)", +"70d07575": "awardTokens()", +"70d084c0": "SingularDTVCrowdfunding()", +"70d0c5d8": "EOUNCE()", +"70d0cc86": "getElementView(uint256)", +"70d12c31": "resetPeerWallet()", +"70d1383d": "createEditionMeta(uint256)", +"70d17adb": "isDrawn(uint256,address,uint256)", +"70d19a43": "itemCancelMarketsWhenPaused(uint256)", +"70d1cde4": "randomCount()", +"70d1e6b4": "minimalWeiTLP2()", +"70d22f14": "addHash(address)", +"70d25a9f": "lockUpAmountStrOf(address)", +"70d271ab": "StartCampaign()", +"70d290b5": "getDoneAddresses()", +"70d37810": "makersCount()", +"70d383dc": "createManyProxies(uint256,address,address)", +"70d4d119": "giftEth(address,uint256,string)", +"70d4d7b4": "promoGen0()", +"70d53be5": "find()", +"70d54287": "VantageToken()", +"70d5ae05": "burnAddress()", +"70d60adf": "acceptBid(string,uint64)", +"70d66693": "drainToken()", +"70d695f7": "VerifyEd25519Packed(bytes)", +"70d70e9b": "getCofounders()", +"70d72d63": "getAllPixels()", +"70d762c2": "basicDayPercent()", +"70d7a0e7": "authorizeKyc(address[])", +"70d81666": "LogS(string)", +"70d8915a": "getApplicationAddress()", +"70d94ed0": "getHoldAmount(address,uint256)", +"70d9f7dc": "awardItemRafflePrize(address,uint256)", +"70db69d6": "maxBuy()", +"70dbb783": "AMBASSADOR_TWO()", +"70dc4de5": "withdrawKRI(uint256)", +"70dc8259": "totalDistributedi()", +"70dc86cd": "EARLY_FOUNDERS_CAP()", +"70dd2e06": "setMinActivatedToken(uint256)", +"70ddeb03": "CRMTToken()", +"70de1e30": "getItemItemId(uint256)", +"70de8c6e": "start(string,uint64,uint8,uint32)", +"70dea79a": "timeout()", +"70df42e1": "changeBurnBounds(uint256,uint256)", +"70e0abb1": "returnInvestmentRecursive(uint256)", +"70e0bd61": "setTrustedMinterAddr(address)", +"70e18692": "cancelIncompleteOrders()", +"70e32ae7": "firstBonusLimitPercent()", +"70e3ccf7": "initMiaoMiaoAddress(address)", +"70e44c6a": "Withdrawal()", +"70e4b809": "_setBuyTime(uint256,uint32)", +"70e5bf4d": "queryVote(uint256)", +"70e6b2b9": "makePayableRegistration(bytes32)", +"70e6d387": "evolveCryptoAvatar(uint256,uint256,uint256,uint256,uint256)", +"70e71ea3": "etherandomSeedWithGasLimit(uint256)", +"70e7732d": "getSpecificSellerTransaction(address,address,uint256)", +"70e87aaf": "move(uint8)", +"70e8c1b3": "test_complexNewProposalAndVoting()", +"70e8dffa": "TokenHold(address,uint256)", +"70e9a612": "BariCoin()", +"70e9ff60": "cancelBuyOrder(address,uint256)", +"70eaa1b4": "Error(uint32)", +"70eae6c0": "travelTotalEarning()", +"70eb6424": "setSmsCertificationRequired(bool)", +"70ebf814": "addUntrustedSelfDelegation(bytes32,bytes32,bytes32[2])", +"70ed00e2": "repayBorrowBehalfInternal(address,uint256)", +"70ed0ada": "getEthBalance()", +"70ed1664": "organizer3()", +"70ed2726": "updateUtilizedFundsByUser(address,address,uint256)", +"70ee555c": "returnTickets(uint256)", +"70ee9edd": "PublicMiningReward()", +"70ef14de": "Drops(uint256)", +"70f0c351": "purge()", +"70f0dfee": "MultisigWalletZeppelin(address[],uint256,uint256)", +"70f18295": "TokenPETER()", +"70f18bcd": "UnlockToken()", +"70f199d2": "indAddress()", +"70f37d27": "fundPool()", +"70f4a7b2": "Th_stage3(uint256)", +"70f4c18c": "oracleQueryType()", +"70f5b71c": "createController(address,address)", +"70f5d3de": "WthdrawToCreator(uint256)", +"70f6489e": "WHOIS(address)", +"70f65977": "_migrateToken(address,address)", +"70f6ac15": "RegistrationDeposits(address,address)", +"70f6c906": "_refundWEICustomer(uint256,uint256)", +"70f705ba": "ChargersCount()", +"70f74228": "TokenATC(uint256,string,uint8,string)", +"70f79b84": "SEO()", +"70f80828": "reactions(uint256)", +"70f85731": "setPhaseEndingCriteria(uint256,uint256,uint256,uint256)", +"70f8de1f": "changeGasFee(uint256)", +"70f9c021": "forcePay(uint256,uint256)", +"70fa66db": "deauthorizeCasino(address,address,uint8,bytes32,bytes32)", +"70fbf6e5": "openGamePlayNos(uint256[])", +"70fd37cf": "totalInvestments()", +"70fde32c": "mul(uint96,uint96)", +"70fe19a3": "blocktubeFarming()", +"70ff6325": "withdrawTuneBalances()", +"70ffe53d": "mood()", +"71007509": "refundTokens()", +"7100a4e6": "addAccessory(uint256,string,uint256,uint256)", +"710164e7": "getVATCompensations(uint256,uint8,uint256,uint8)", +"71026acc": "EXPECTED_START()", +"7102b728": "vested(address)", +"7102c138": "Standard_Token(uint256)", +"7102f74d": "recalcTokenPrice()", +"71037b1e": "flagUSInvestor(address)", +"71039256": "BUCToken()", +"7104a142": "getNumberOfVerifiers()", +"71056a78": "ChangeEtherGasProvider(address)", +"71061398": "getRoles()", +"7106312c": "emergencyAddr()", +"7106bd46": "mintContractByIndex(uint256)", +"7106cdb6": "CloudexchangeCrowdsale(uint256,uint256,uint256,address)", +"7107283f": "create_tablet(bytes32)", +"7107d7a6": "minBuy()", +"710908c9": "levelThreeBonus()", +"71098a35": "startStop()", +"71098e15": "totalSTC(uint256,uint256)", +"710ad128": "getHatchingEggData(address)", +"710b2d8c": "getAddressRatio(address)", +"710bf322": "proposeOwnership(address)", +"710c6705": "updateCapFlex(uint32)", +"710cba8b": "isAllowedOverrideAddress(address)", +"710d6a61": "unPauseTransfers()", +"710dff42": "isdrawadm(address)", +"710e5d2f": "setMaxFee(uint256)", +"710ed77a": "revokeAccessbyDelegate(bytes32,address,address)", +"710edb10": "multisignWallet()", +"710ee68e": "DOGEToken()", +"710f3953": "add_entity(string)", +"710fe6f8": "getWithdrawBalance()", +"710ffc72": "changeTribeOwner()", +"71101891": "DharmCoin()", +"711085b2": "arr(address,address,uint256,uint256,uint256)", +"7110ce25": "MyRefReward()", +"7110eed7": "createRegistryInstance(address,address)", +"7111abf2": "SessionOpen(uint256,uint256)", +"7111ed97": "TopPayCoin()", +"71135f8b": "setStopped()", +"7113d35d": "pickFood(uint256,string,string,uint256,uint256)", +"7113e5e2": "findKey(address,uint256,uint256,uint256)", +"71140942": "MIN_ETH_FUND()", +"71145486": "rebuildManagerList()", +"71147d32": "STRC_ADDR()", +"7114a96e": "transferReferral(address)", +"7114c13a": "sendTaster(address)", +"71156c73": "TheFund()", +"7115c8bd": "xdao(uint256,string,string)", +"7115c988": "Batch(address)", +"711619de": "setPubEnd(uint256)", +"711748a3": "removeModuleAtIndex(uint256)", +"71175249": "INEXToken()", +"7118f854": "icoSuccess()", +"711953ef": "setGameAddress(address)", +"7119a490": "setBtcPriceProvider(address)", +"7119c873": "transferSSPRecord(address,address)", +"711b4871": "getOptionBuyOrders(uint256,uint256)", +"711bf9b2": "setAuthorized(address,bool)", +"711bfa89": "month12companyUnlock()", +"711c2b94": "setTestMarket(bytes32,bool)", +"711caf40": "transferStep3(address)", +"711cbc26": "PartyRegistry()", +"711d11bf": "ev(string,address,uint256)", +"711d4407": "updateBonuses(address,address,bool)", +"711d649b": "getCatNames()", +"711f63bf": "toBytes32(bytes,bytes,uint256)", +"7120d381": "getUpdateTokenAge(address,address,uint256)", +"7120fab4": "discountCollect()", +"71215af6": "DAYS_28()", +"712173de": "CrowdsaleStarted(uint256)", +"71221e38": "RareCoinAuction(uint256)", +"7122e857": "setParticipantWhitelist(address,bool,uint256)", +"7123691e": "removeSERAPHIM(address)", +"71236b92": "Owner(address,uint256)", +"712394b6": "nexumToken()", +"71245f6e": "BTCValue()", +"7124abf3": "getLastPayouts()", +"7124c683": "setUpdateInterval(uint256)", +"7124d613": "changePaymentAddress(address)", +"71254d9b": "setFeesDistributionPercentages(uint256,uint256,uint256)", +"7126a855": "configure(uint256,uint256,uint256,uint256,uint256)", +"7126b6ff": "_grantAdmin(address)", +"71270b46": "initCards(uint256)", +"7128ad73": "PaymentReceived()", +"7128defb": "removeSupervisor(address)", +"712980a2": "banUser()", +"712a10bf": "COIN_SUPPLY_ICO_PHASE_2()", +"712a5094": "balanceOfTheContract()", +"712aa191": "isValidCustomerTxPaymentForKWh(address,bytes32)", +"712ac60e": "onRemoval(string)", +"712b1ed0": "triggerInput()", +"712bb1b8": "getDataColla_AA_01(string)", +"712c0c5a": "withdrawDirectDebit(address[],bool)", +"712c3f7a": "addressPartnershipsAndExchanges()", +"712ca0f8": "getOrder(string)", +"712dd575": "raiseSellOrderCancelled(address,uint256,uint256,uint256,uint256,uint256,int160)", +"712f22a0": "getVolumeBonus(uint256)", +"712f4d70": "_generateShortLink()", +"712f5e72": "SetRoundTime(uint256)", +"712f7790": "publicGetStatus()", +"713081d0": "setPromoter(address)", +"7130d7ce": "get_asset_event_details(bytes32,uint256)", +"71313365": "ICO076()", +"7132d337": "citadelTransfer(address,uint256)", +"7132ebcd": "switchPaused(bool)", +"7133c0c0": "calcAmount(uint256,uint256)", +"713494d7": "setReferralFee(uint256)", +"7136982b": "getHolderCount()", +"7136d509": "playCEELO(bytes32,uint256[6])", +"7137047a": "setDealCancelRate(uint256)", +"7137b024": "Banliang()", +"7137e072": "getAllTemplateProposals(address)", +"7137ed47": "setProxyContract(address)", +"7138364b": "adventureItem()", +"7138bc92": "transfer(address,address,address)", +"7138e0c9": "divForSellBack()", +"7138ef52": "right9(uint256)", +"71393c60": "storeLedgersInIpfs()", +"713942f7": "getUserVerified(address)", +"713955e8": "ico2endTime()", +"71395818": "ItemsMarket()", +"71398637": "batchToApplyMilestone(uint8,address[])", +"7139b1ca": "balanceOfRoutingCode(bytes32)", +"7139b595": "withdrawDthShopAdmin(address,address)", +"713a7eef": "Xingqiub()", +"713b563f": "database()", +"713be000": "checkoutCart()", +"713be126": "changeRateSetter(address)", +"713d30c6": "updateState(int128,uint128,uint8,bytes32,bytes32)", +"713eba52": "OwnershipRequested(address,address,bytes32)", +"713ec905": "recordAddress()", +"713f5e4d": "sendEthToContract()", +"713fd253": "Limit_Amount()", +"713ffc3b": "setNextGameSettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"714064f3": "BreakableBond(address,address,uint256)", +"7140bdf3": "get_all_best_offers()", +"7141856d": "getNumProps()", +"7141aa8b": "getTitulaire_Compte_3()", +"7142087c": "allowTransferGlobal()", +"71427ac1": "SuperLitecoin()", +"7142b17d": "dataForOwner(address)", +"7142b191": "MultiplesaleAirdrop(address[],uint256[])", +"7143059f": "getParticipant(address)", +"714383ad": "HYPEToken()", +"71443c4d": "soldDragons()", +"714490ab": "WithdrawToBankroll()", +"7144e81e": "Cremit()", +"71450e30": "tierIndexByWeiAmount(uint256)", +"7145644c": "calculateBTS()", +"71461be9": "getCurrentMilestoneProcessed()", +"7146bd08": "MAX_PURCHASE()", +"71476f35": "clear(address,address,int256)", +"71478fae": "_getTokenIdFromBytes(bytes)", +"714897df": "MAX_VALIDATORS()", +"71489835": "isRed()", +"7148ba36": "_createCard(string,uint256)", +"71492685": "getTo()", +"714a2f13": "assertEq(int256,int256,string)", +"714b1443": "CancelBuyOrder(bytes32,address,uint256,address)", +"714b4465": "MakerTransferredEther(address,uint256)", +"714c5d9d": "BMT(uint256,string,uint8,uint256,string)", +"714ca446": "adopt(uint32,int256)", +"714ccf7b": "setVault(address,address)", +"714d497a": "maxPerExchangeBP()", +"714d582e": "sdc(address)", +"714d5fae": "cancelRemoveOwnerRequest2()", +"714d9537": "cancelEvent(bytes16)", +"714dc20d": "ownerChanged(address,address,address)", +"714e2ec9": "vanilCoin()", +"714e42a1": "getSaleRate(uint256)", +"715018a6": "renounceOwnership()", +"71506977": "EXCHANGE_RATE_DECIMALS()", +"7150773d": "donateFunds()", +"7150d8ae": "buyer()", +"71513e9d": "reSet()", +"71515a36": "SXSYCoin()", +"7152f800": "gameResult()", +"71535f0d": "tenthTime()", +"71543cfc": "unWhitelistUsers(address[])", +"71543f39": "Eetgccoin(uint256,string,string)", +"715469d0": "logoX()", +"7154ae61": "CheckNumbers(uint8[5])", +"7154b798": "addExploreData(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"7154b8b5": "setPercent(uint256)", +"71551178": "testDisputedInvalidSequenceWrongReadAddress()", +"71560f80": "emulatePurchase(address,address,uint256,uint256)", +"71582f54": "IsSetReferrer(address)", +"715851a0": "getCheckingBalance(address)", +"71586383": "totalTokensReceived()", +"71587988": "setNewAddress(address)", +"71589d6b": "newponzi()", +"7158e346": "NatCoinCrowdsale(uint256,uint256,uint256,address)", +"7159271d": "publicsalestartTime()", +"71599987": "increasePendingTokenBalance(address,uint256)", +"7159a618": "operate()", +"7159db81": "lastTier()", +"715b208b": "getAllAddress()", +"715b99f8": "_isSignedPrefixed(address,address,bytes32,uint8,bytes32,bytes32)", +"715d4a64": "sellsubscribers()", +"715d574e": "CarboneumToken()", +"715db6ea": "TheMark()", +"715e0e4e": "repurchase(address,uint256)", +"715ed24b": "setVIPThreshold(uint256)", +"715eddda": "starbaseEpAmendment()", +"715ede94": "auction(bytes32)", +"715ef43d": "newPurchase(address,uint8,uint8)", +"715ef4ff": "resendFailedPayment(uint256)", +"715f8975": "JOINT_PER_ETH()", +"7160138c": "unlockedTeamStorageVault()", +"71608d05": "getBalanceModificationRounds(address,address)", +"71612620": "transferFST(address,uint256)", +"71616b84": "calculateTokenCrowsale(uint256,uint256)", +"7161c5df": "setBracketPrice(uint256,uint256)", +"7161c66d": "RunManager(bool)", +"716210d8": "addHodler(address,uint64)", +"7162f182": "resetRip()", +"716344f0": "preIcoEndTime()", +"716437b5": "testApproveTransfer()", +"71645971": "toList()", +"71658552": "getUint(address,bytes32)", +"71658896": "getTopic(uint256)", +"71674ee5": "maximumIcoRate()", +"7168e5d3": "ownerSetAdmin(address)", +"71697efa": "getSumWithdrawals()", +"7169a63e": "IcoCancelled()", +"7169afa6": "getOldFrozenAccount(address)", +"7169dd5d": "intial_supply()", +"716adc36": "setMyOracle2(address)", +"716af639": "minePoP(address,uint256)", +"716c0a31": "computingCharge(uint256)", +"716d3c6c": "adjustReward(uint256)", +"716e5604": "startItemRaffle(uint256,uint256)", +"716f10bf": "isWhitelistOn()", +"71716992": "ThankYouToken(uint256)", +"71726f69": "HOWEOToken()", +"7172a1f2": "testLedgerCreation()", +"7172d9f0": "OtomatizToken()", +"71740d16": "numDarknodesPreviousEpoch()", +"7174164b": "XPTToken()", +"71748a8b": "WSR(address)", +"7174ac9e": "setEscrowedTaskBalances(uint256,uint256)", +"71752d06": "getOwnerByItemTypeAndId(string,uint256)", +"7175d709": "SPARCAddress()", +"71765e74": "VendMultiSigWallet(address[],uint256)", +"71766ae3": "disableManuallyBurnTokens(bool)", +"71773fc2": "lasttimereduce()", +"7177a7dd": "canTransferTokens()", +"71781a79": "subToken(address,uint256)", +"71784312": "distributeVariable(uint256,address[],uint256[])", +"71793195": "__isFeatureEnabled(uint256)", +"7179d079": "mainFundBalance()", +"7179ed22": "autoPrice()", +"717a195a": "setOutcome(int256)", +"717a945a": "USD_Omnidollar()", +"717b3726": "transferFromBank(address,uint256)", +"717cb858": "ZUE()", +"717cee7d": "updatePeriodDuration(uint256)", +"717d5527": "getMoney(address)", +"717de52e": "creditCommons()", +"717e1418": "VebionX()", +"717e9745": "setNewControllerAddress(address)", +"717f24c6": "emergencyWithdraw(address,uint64)", +"717f6f7f": "MYCCToken(uint256)", +"717fecea": "vesting2Withdrawn()", +"717fedf0": "getFirstActiveDuel1()", +"717ffe91": "buyTokensAsset(address,address,uint256)", +"7180dd8a": "_giveToken(uint256,uint256)", +"718167c4": "AddValues(uint256,uint256)", +"718228fa": "totalTeamContributorIdsAllocated()", +"7182774d": "exchanged()", +"71827791": "nextContributorIndexToBeGivenTokens()", +"718350a9": "_removeMaliciousValidatorAuRa(address)", +"7183616c": "notarize(string)", +"7185354b": "changePerEthToBlocNumber(uint256)", +"7185393c": "updateAppExec(address)", +"7185637b": "DailyDivsSavings()", +"71857000": "setLogic(address)", +"7185acb8": "viewMyComponent(uint256)", +"7185f163": "stopTrading()", +"71863031": "isPublicIcoActive()", +"71868032": "addOffChainAddresses(address[])", +"71873971": "PROOF_TOKEN_WALLET()", +"71882ab0": "distributeContest()", +"7188c8a4": "reFunding()", +"71892e3f": "getMyKnowledge()", +"718aa629": "NEX()", +"718b0a32": "withdrawBuyDemand(uint256)", +"718bd6dd": "setRequestUntil(uint8)", +"718c025a": "ethPreAmount()", +"718c6569": "TimeSecondToken(uint256,string,string)", +"718cc769": "makeBet(uint256)", +"718d763a": "playerCost()", +"718da639": "addNewSecretHash(bytes32)", +"718da7ee": "setReceiver(address)", +"718df9d7": "getPlayerSpaceshipUpgradesById(uint256)", +"718dfb7e": "hasPreICOClosed()", +"718e6302": "play(string)", +"718e6c44": "isManageable(address)", +"718eaa50": "setLayerParent(address)", +"718ec079": "setMarketCreationCost(uint256)", +"718f81c2": "getCCH_edit_11()", +"71906087": "airdropToAdresses(address[],uint256)", +"719102d7": "createItem(uint256,uint256,uint256,uint32)", +"7191474b": "pendingUFT()", +"71929547": "OceanScapeCoinAdv(uint256,string,string)", +"7193ab70": "balanceUnlocked(address,address)", +"7193b1e4": "refundCfd(uint128)", +"7193f2f0": "supported(bytes32)", +"719591c7": "requestComputation(string,string,uint256,uint256)", +"7195d944": "dataOfPart(uint256,uint256,uint256)", +"7195eed2": "EtalonGlobalToken()", +"71974cbe": "lastBidBlock()", +"7197c6d2": "firstTTax()", +"719874da": "profitFromCrash()", +"7198801d": "getWorkTime(uint256,uint256)", +"7198e08c": "createLoveBlock(string,bool)", +"7199139f": "TheAbyssDAICO(address,address,address,address,address,address,address,address,address,address,address,address)", +"7199f6d4": "safedrawal(uint256)", +"719a0f8c": "removeOfficer(address)", +"719b2e07": "setDisputeRoundDurationInSeconds(uint256)", +"719c78ac": "setCodedate(uint256)", +"719c86e3": "team_lock_count()", +"719ce353": "Brokenwood()", +"719ce73e": "prizePool()", +"719f2fb7": "_calTeamAttribute(uint8,uint8,uint8,uint32[11])", +"719f3089": "getLocks(address)", +"719f8d3a": "checkIfWhiteListed(address)", +"71a009ad": "BRLTOKEN()", +"71a03078": "TMCToken(uint256,string,string)", +"71a04009": "newIssuer()", +"71a18bfb": "emergencyDrain(address)", +"71a2e46d": "OWN_transferOwnership(address)", +"71a2f964": "newPaymentAddress(address)", +"71a4dc5e": "getLuckyblockEarn(bytes32)", +"71a5367f": "setAllowPaymentsWhenPaused(bool)", +"71a66e7c": "addOrUpdateHolder(address)", +"71a67aa9": "getFunctionAuthorizationHash(address,address,string,bytes32)", +"71a7462e": "balance_(address,address)", +"71a7c439": "distribute21ST(address[],uint256)", +"71a80ba3": "setBurnFeeReceiver(address,address)", +"71a8270a": "buyObizcoinTokens(address)", +"71a8ba25": "getEtherBoxes(address)", +"71aa60fd": "calculateTokens(uint256)", +"71aad2dd": "preICOamountBonusLimits(uint256)", +"71ab0e3c": "sellDai(uint256,uint256,uint256,uint256)", +"71ac5c60": "WeToken(address,string,string,uint256,uint256)", +"71ad3e73": "isMakePermitted(uint256,uint256,address,address,uint256,uint256)", +"71ada3fb": "getCash(uint256,address)", +"71ae8f02": "fundingMinimumTargetInWei()", +"71ae973e": "createGen0Auction(string,string)", +"71aeae44": "hasBallotEnded(uint32)", +"71aed703": "addCandidateCache(address[],bytes32[])", +"71af5d0e": "setFailedVerificationSlashAmount(uint256)", +"71af8630": "_suicide()", +"71afc713": "marketingTokenAmount()", +"71b1d2d3": "RANGEEND_PRESALE()", +"71b22e61": "EnableRefund()", +"71b2354d": "MINC()", +"71b3659e": "currentTokenPrice()", +"71b397cf": "getCurrentRoundIsFinished()", +"71b3e7f4": "payOffLoan(address)", +"71b45696": "StcToken()", +"71b475d0": "STQPreICO3(address,address)", +"71b4f4ef": "setDEXContractAddress(address)", +"71b505ad": "setLargeCapWhitelistParticipant(address,uint256)", +"71b5ee71": "allowTokenTransfer()", +"71b6663e": "play1(address,uint256)", +"71b6a376": "setNumberOfPlayers(uint256)", +"71b6d36d": "isNotaio(address)", +"71b6d6ea": "getAttributeTimestamp(address,bytes32)", +"71b7d5c4": "priceUpdateWaitingTime()", +"71b804ee": "getBettingPrice()", +"71b80b8f": "upgradeCardConfig(address)", +"71b9b646": "saleEnabled()", +"71ba3612": "Plasma()", +"71bad4d8": "jackpotMinimumAmount()", +"71bb263d": "contractPartThree(uint256)", +"71bb3cc8": "GivethCampaign(uint256,uint256,uint256,address,address)", +"71bbefc7": "payPlatformOutgoingTransactionCommission()", +"71bc9d62": "_generateDetail(uint256)", +"71bd1f47": "MinCapReached(uint256)", +"71bdb914": "softCapLimit()", +"71bdbc9a": "SetCityData(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"71bde852": "_startNextCompetition(string,uint32,uint88,uint8,uint8,uint16,uint64,uint32,bytes32,uint32[])", +"71be0c27": "preSale5()", +"71be1851": "ShopDeployed(address,uint256,uint256,uint32)", +"71be8766": "Contribution(address,address,uint256)", +"71beae97": "currentCoinsCreatedPercentage()", +"71bf35b6": "minMinutesPeriods()", +"71bf439e": "CANVAS_WIDTH()", +"71bf5a95": "setENS(address)", +"71bfa03f": "getRedemptionBlockNumber()", +"71bfabca": "resultOf(uint256)", +"71bfd48b": "content(string,uint256,string,string,uint256)", +"71c02b7b": "BSAFE()", +"71c03d76": "get_rest(uint256)", +"71c10778": "weiToPresalersFromICO()", +"71c147fb": "addAccount(string,uint256,string,string,uint256)", +"71c157d1": "addInsuranceProduct(uint256,string)", +"71c1d196": "numContributors(uint256)", +"71c1dde5": "get_presale_arbits_per_ether()", +"71c24e37": "narrowRoundPrize(uint256)", +"71c2835e": "operater()", +"71c396cc": "migrationAddress()", +"71c4275a": "setWeight(bytes32,uint256)", +"71c4980b": "getBlanace()", +"71c57772": "eucDist2D(uint256,uint256,uint256,uint256)", +"71c58b25": "internalTransfer(uint256,uint256,uint256)", +"71c59097": "MainnetSurvey(uint256,string,bytes32[])", +"71c66459": "LogPaymentReceived(address,uint256)", +"71c6d4dc": "pearlContract()", +"71c6dc50": "ProofOfCraigGrant()", +"71c6e049": "addUsers(address,uint256)", +"71c78ce7": "totalAirDropped()", +"71c79588": "releaseName(bytes32)", +"71c7e923": "dDisableErc20OwnerClaim(bytes32)", +"71c80c67": "COOPET(uint256,string,uint8,string)", +"71c82c14": "setOraclizeGasPrice(uint256)", +"71c847b2": "detailsOfEdition(uint256)", +"71c85da2": "LogN(address,bytes32,uint256,string,bytes,uint256,bytes1,uint256,uint256)", +"71c8e333": "getSundownGraceTargetBlock()", +"71c93fc7": "processDiceRoll(address,uint8)", +"71c95040": "EFF(address)", +"71c9572b": "maxBidInCentsPerAddress()", +"71c9a754": "topiToken()", +"71c9e177": "SpudToDivs(uint256)", +"71ca2117": "isAuditorRegistered(address)", +"71ca337d": "ratio()", +"71cabfb8": "getYumerium(uint256,address)", +"71cacc9e": "addLotteryPrize(uint256,string,uint256,uint256)", +"71cb9769": "addIdentity(bytes32,bytes32)", +"71cbb22a": "fixed_value()", +"71cbef8a": "sendTokensAfterCrowdsale(uint256,uint256)", +"71cc4f35": "Alecrypto()", +"71cc805a": "refund(string,address)", +"71cce314": "Kolak()", +"71ce52ed": "senderIsAdvocate(address,address)", +"71ce9a4a": "forwardCallGas()", +"71cea5ae": "transferAccessOff(address)", +"71ced69d": "mintNewDNC(address,uint256)", +"71cf586f": "CanISuscribeTrial(uint256)", +"71cf5979": "market_AcceptBid(uint256,uint256)", +"71cf866e": "_redeemIsAllowed(uint256)", +"71d06675": "getInteres(address)", +"71d0cf01": "setCustomerSignature(address,uint256,bytes)", +"71d0ed05": "betsKeys(uint256)", +"71d141f9": "doOraclize(bool)", +"71d1995e": "changeEmployee1(address)", +"71d30a17": "Match(address,address,bytes32,bytes32,uint256,uint256)", +"71d31a13": "withdrawTokens5(uint256)", +"71d3de1b": "setStates(uint256,uint256,uint256,uint256)", +"71d3de2b": "JincorToken()", +"71d49910": "_emitAreaSet(uint256,bytes32)", +"71d4aa3a": "fomo3D4eva()", +"71d4edaf": "setSaleLot4StartTime(uint256)", +"71d50cc8": "payBets(bytes32)", +"71d5af66": "Upfinex()", +"71d5afb5": "extendCrowdsale(uint256)", +"71d5b5dd": "getBonusPoolTotal()", +"71d5d1c2": "updatePrincipal(uint256,uint256,bool)", +"71d5ffbe": "totalETHWagered()", +"71d6dbe1": "isClaimSegmentVerified(uint256,uint256,uint256)", +"71d6e229": "queryRole()", +"71d76096": "ICOcollected()", +"71d7c621": "createDownRequest(address,uint256)", +"71d7e4a9": "transferTokens(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"71d87948": "FixedSupplyToken(string,string,uint256,uint8)", +"71d8d421": "_isValidLicense(uint256)", +"71d8d7af": "setMaxRate(uint256,uint256)", +"71d93cb0": "interuser(address)", +"71d9ffce": "priceChange()", +"71da0e63": "_getValidRandomGenes()", +"71daca00": "grantBackerToken()", +"71dc761e": "enableERC721()", +"71dd46a9": "left19(uint256)", +"71dd8862": "IndexOf()", +"71dd99fe": "BigRisk()", +"71ddd3ad": "multifunctioncoin()", +"71de2ffc": "claimRefund(bytes32)", +"71de6362": "certificateSigners(address)", +"71df8d09": "bigInt(uint256)", +"71dfc116": "Cryptolotto10Minutes(address,address,address,address)", +"71e030d3": "TokensTransferedToHold(address,uint256)", +"71e07813": "issueDevsTokens()", +"71e11354": "updateRegistration(string,string)", +"71e12726": "getBlockStats()", +"71e1fa95": "getHtlcTimeoutBlock(bytes32,bytes32)", +"71e28126": "canFinalize()", +"71e2a657": "addMinters(address[])", +"71e2d919": "lol()", +"71e30719": "ZEC()", +"71e365a0": "AICQ()", +"71e3c76e": "claimGrant(bytes32)", +"71e3c819": "DSToken(string)", +"71e3fdc4": "moveMintTokens(address,address,uint256)", +"71e4cfd7": "ROF()", +"71e5b9ec": "scanAddresses(address)", +"71e5ee5f": "arr(uint256)", +"71e60fe6": "testFailTransferEnableNotTransferable()", +"71e68cad": "claimUsername(bytes32)", +"71e70133": "TotalTokens()", +"71e777ae": "getMemBestInvestor()", +"71e928af": "issue(address)", +"71e9f016": "CompetitionChainContract(uint256,string,string)", +"71ea29df": "blockedContract()", +"71ea3aad": "CollectERC20(address,uint256)", +"71ea6c73": "VIBEXToken()", +"71ea87ee": "getPeriodRange(uint256)", +"71ea980c": "rewardPoolWallet()", +"71eb125e": "oracleAddresses(address)", +"71eb9710": "getDebitDigest(bytes32,uint256,uint64)", +"71ec4cc1": "depositPayout(uint256,uint256)", +"71ec98dd": "issueTokensFromOtherCurrency(address,uint256)", +"71ed4664": "refundTo(address)", +"71edfe35": "hashOfTheDocument()", +"71ee2ce1": "getResponses(uint256)", +"71ee329f": "useCaptainAbility(uint256)", +"71ee872f": "TransactionSettledByMediator(uint256,uint256,uint256,uint256,uint256)", +"71eedb88": "refund(uint256,bytes32)", +"71eee1f4": "IssueStateLoaded(bytes32,string)", +"71ef0d0f": "phxCoin()", +"71ef7862": "seventhTime()", +"71efb7f7": "SimpleSafeToken(uint256,uint8,string,string)", +"71efdc21": "usedTickets(uint256)", +"71efeff1": "transferCommunityBank(uint256,address)", +"71f027fa": "updateOwnerOfWeapon(uint256,address)", +"71f098c8": "LecBatchTransfer()", +"71f0ad64": "TestCrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"71f11552": "changeDNNHoldingMultisig(address)", +"71f124c5": "getDropsOf(address)", +"71f16739": "_createContract(address,uint64)", +"71f297cc": "XaurumToken(address)", +"71f4c9ae": "GameClosed(uint256)", +"71f4f65e": "yearlyOwnerTokenWithdrawal()", +"71f52bf3": "connectorTokenCount()", +"71f5584f": "sponsoredLeaderboardDataContract()", +"71f64a68": "executeTopic()", +"71f6ec3c": "get_car_propse(uint256)", +"71f6fb88": "transferWithReservingNet(address,uint256)", +"71f7aaca": "dragonIndexToApproved(uint256)", +"71f7ebf4": "_doTrade(address,address,uint256,uint256)", +"71f805bf": "numFpBits()", +"71f84164": "_sendTo(address,uint256)", +"71f8746f": "registerBuy()", +"71f90109": "hideDonations(address)", +"71f90fe6": "initializeABIHashForMod(uint256,bytes)", +"71f96211": "assetOf(address)", +"71f9b7f3": "addMultipleAddressesToPublicBuyerList(address[])", +"71f9ff89": "preICOcap()", +"71fa632f": "newVoterAllocation()", +"71fa7f37": "createNewProject(uint256,uint256,address)", +"71fcc672": "setCryptaurRewards(address)", +"71fdd6d3": "_canBreedWithViaAuction(uint256,uint256)", +"71feaac5": "greatgreatcoinERC20Token()", +"71ff01b0": "maxSupplyReached()", +"71ffcb16": "changeFeeAccount(address)", +"72004a65": "getPremiumStatus(bytes32)", +"72012ef6": "test_oneInvalidEqString2()", +"72016f75": "getNodeLength()", +"7202997e": "LogAccepted(uint256)", +"72030d03": "addresses2(uint256)", +"72052773": "deleteChallenge(bytes32)", +"72054df4": "compatible223ex()", +"72067d49": "getBountyBalance()", +"72076c57": "ColorBayToken()", +"72078e3b": "CORNERSTONEAMOUNT()", +"7207c19f": "MyToken(uint256)", +"7207d711": "RewardHalved()", +"7207f9ce": "transactionFeeMax()", +"7208b8f7": "setSkills(uint256,uint32,uint32,uint32,uint32,uint32)", +"7209036a": "fundReservCompany()", +"720b43e8": "intercrypto_cancelConversion(uint256)", +"720b7ee4": "getCardId(string)", +"720be6c7": "CrapToken1A()", +"720c142d": "setRNGCallbackGasPrice(uint256)", +"720c4798": "workshop()", +"720c5732": "TextMessage()", +"720de551": "deleteVoterForCandidate(uint256)", +"720e2a06": "GadielToken()", +"720ed642": "getModuleById(uint256)", +"720edd13": "theanswer()", +"720ee37c": "decrementBalance(address,uint256)", +"72104205": "rewardMint(address,uint256)", +"72108714": "updateHash(bytes32,bytes32,uint256)", +"7211138c": "FreedomCoin()", +"72112286": "closeChannel(address,uint256,uint256,bytes32,bytes32,bytes1)", +"72112ebc": "set_Total(uint256)", +"72117821": "GetTokenAddress(address)", +"72121dac": "FooToken()", +"7212b67e": "add_potion(uint16)", +"7212eadd": "trigger_game_end(uint256)", +"7213cff1": "hasLockedUp(address)", +"7213e335": "guthabenAnzeigen(address)", +"72142c67": "MSECStandardToken(uint256,string,uint8,string)", +"7214d6c3": "isUIntPublic()", +"721547eb": "maintainExternalContractTokenBalance(address,uint256)", +"7215513f": "addTokenClaim(uint256,uint256,uint256)", +"72159335": "voteInitiate(uint256,uint256,uint256,uint256,uint256,uint256)", +"7215b96d": "CheckAllowance(address)", +"7216ab38": "getByteFromBytes14(bytes14,uint256,bytes1)", +"7216b95c": "checkLicense(bytes32,uint8,bytes32,bytes32)", +"7216e02d": "getOracleByName(string)", +"7216ee00": "totalTrainer()", +"7217523c": "addDays(uint256,uint256)", +"721868f8": "queryTinyOracle(bytes)", +"72198ead": "setDSTMultiSig(address)", +"7219d7f7": "OrigamiTokenPurchase(address,uint256,uint256,uint256,uint256)", +"7219dd7f": "allocateTokenETHConvert(address,uint256)", +"7219fa11": "EIP20(uint256,string,string)", +"721a1f57": "endorseCredit(address,uint256,uint256)", +"721a37d2": "revokeTokens(address,uint256)", +"721b67ab": "CNYTokenPlus()", +"721bba59": "getTokenBasicData(address)", +"721c555e": "queryEscrow(address,address)", +"721d7d8e": "currentContract()", +"721dd850": "getOwnedAvatars()", +"721e117b": "getPurchaseRequirements(uint8)", +"721e9969": "getPressCount()", +"721ed9ec": "tokensICO()", +"721fa630": "pubs(uint256)", +"721fefac": "startNewDraw(uint256)", +"721ff138": "tokenMintCap()", +"7220426f": "verifyTokens(uint64,uint64)", +"7221a26a": "storeValue(uint256)", +"7221c3c0": "withdrawJackpotBalance(uint256)", +"72229abf": "setBetFee(uint256)", +"7222e9e3": "sampleToken()", +"7222fe1e": "MNY()", +"72237d97": "setTargetDiscountValue10(uint256)", +"72239313": "addAccountMinter(address)", +"7223cd19": "set(address,int256,uint256)", +"7224267c": "addDeposit(address,uint256,uint256,uint256)", +"72258f96": "allergy(string)", +"72259875": "addCourse(string,uint256,uint256,uint256,string,string)", +"72262699": "forwardOnBehalf(address,uint256,bytes,uint256,uint8,bytes32,bytes32)", +"7226d055": "create(address,address,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"722713f7": "balanceOf()", +"7227bff2": "setTransferOwnership(address,address)", +"7227c5dd": "fundMark(uint256)", +"7227c7ce": "hashNext()", +"7228057f": "ibcFunded()", +"7228b9db": "etherCap()", +"7228becb": "crowdsaleDuration()", +"72298b82": "setEndTime(uint32)", +"722bb4a8": "getSuperManagerContractAddress()", +"722bd85a": "bonusForDate(uint256)", +"722c885a": "endSeedStage()", +"722d1267": "forceWithdrawTokensToAnAddress(address)", +"722d1d13": "setProductCompletionDate()", +"722ded24": "exeSequence(uint256,uint256[])", +"722e1677": "getTotalPublicKeysCount(address)", +"722e9c6d": "Luck()", +"722f0835": "startPrivatePreICO()", +"722fe823": "getActionHistoryItem(uint256)", +"72309714": "setPresellOpen(bool)", +"7230bce8": "add(uint256,string)", +"7230eb42": "AllocatedCrowdsaleMixin(address)", +"7230ef7f": "totalGen0()", +"72317e7b": "totalWeiRaisedDuringICO1()", +"7231a876": "itemsOf(address)", +"7231af39": "getTotalGamesStarted()", +"72325c5b": "initSiriusFund()", +"72337396": "unholdFunds()", +"7233d860": "BitcoinRich()", +"7234ba0c": "MIN_CROWDSALE_TIME()", +"7235c8dd": "PeerReview(address,bytes)", +"7235d2b1": "maintenanceMode(bool)", +"7236f851": "exchangeByAdmin(uint256,address)", +"72378554": "sendToken(uint256,address)", +"7237e031": "tokenToEthTransferInput(uint256,uint256,uint256,address)", +"72388610": "paybackAll()", +"72388f7c": "mintSpecificCards(address,uint8,uint256[])", +"7238ccdb": "getLockInfo(address)", +"72397287": "createOfAthleteCard(string,string)", +"723b2b58": "getMemberListCount()", +"723c308f": "ahs()", +"723c37f7": "TokensTransferrable()", +"723e357a": "pushRound(uint256,uint256,uint256,uint256,bool)", +"723e435f": "setTokenRateInGwei(uint256)", +"723eb2cc": "hurmint(address,uint256)", +"723f291d": "cancelOpenBids(bytes32)", +"723fdfe5": "PaoTestToken()", +"724020be": "GSCT()", +"72405ab0": "approve(uint256,string)", +"7240976c": "trades(address,address)", +"7240eccf": "approveLess(address,uint256)", +"7240f67b": "countActiveType(uint256)", +"72411849": "ChangeTankSellMaster(address)", +"724121ae": "contentExists(uint256)", +"72413a3b": "VOLUME_BONUS()", +"72414501": "SMILO_FOUNDERS_AMOUNT()", +"7241450c": "deliver(address,uint256,string)", +"7241eb8c": "_bpto(uint256,uint256,uint256,uint256,address)", +"72422024": "lockMoneyOnCompoundCreation(address,uint256)", +"72432965": "AdvisorsAddress()", +"7243cfbb": "releasableAmount(address,address)", +"72440c31": "finalizeEndTime()", +"72453422": "directSellSupply()", +"7245f6e7": "stageEnd(uint256)", +"72460869": "test_threeFalseAssert()", +"72468368": "setBlockTargetDelay(uint256)", +"724693ce": "TokenSale(uint256,uint256,address,uint256)", +"7246de3d": "sanityCheck()", +"72470a14": "ShopManager(address)", +"7247390b": "vote_beneficiary(string)", +"72479140": "CreateTicket(address,uint8,uint8,uint8)", +"7247959a": "referral(address)", +"7247a50d": "virtualInvest(address,uint256)", +"7247aafd": "Callous()", +"72490c69": "GREENECO()", +"7249733c": "businessPercentage()", +"7249fbb6": "refund(bytes32)", +"724a5144": "MuneebCoin()", +"724a6246": "claimSeasonPrize(address,int8)", +"724a8487": "getTargetBlocks()", +"724ae9d0": "getMinInvestment()", +"724bc3de": "getAirdropAmount(address)", +"724bdbaf": "externalTxs(uint8,bytes32)", +"724c8393": "changeCrown(address)", +"724dbf36": "isNewBattle(string)", +"724df10a": "alreadyWithdrawn()", +"724edf00": "startTokenDistribution()", +"724fcd4c": "buyAndSetDivPercentage(address,uint8,string)", +"7250dc36": "getMemberName(uint256,address)", +"7250e224": "addDistributor(address)", +"72511fb4": "EventAddressChange(address,address,uint256)", +"72519531": "BagholderAddr()", +"7252518c": "setLockend2(uint256)", +"7252bbf2": "ethBalanceOf(address)", +"7253160b": "convertByteToStr(bytes1)", +"725326dc": "setAllowedForTransfer(address,address)", +"7254895a": "readCards()", +"7254e1ba": "afterGeneratorHook()", +"72558b73": "destroyValue(address,uint256)", +"7255d729": "createGame()", +"7255f7ad": "getLastImageId()", +"72561235": "getCreditbitAddress()", +"72565e3f": "offChainMint(address,uint256)", +"7257dac1": "removeSomeUETsFrom(address,uint256)", +"7258b901": "masterCut()", +"72593831": "withdrow(address)", +"72593b4c": "ordersCanMatch_(address[14],uint256[18],uint8[8],bytes,bytes,bytes,bytes,bytes,bytes)", +"7259ac60": "Rethen()", +"7259bce3": "preSaleTokenPrice()", +"725a731d": "setPendingKNCRateRange(uint256,uint256)", +"725a7eea": "MEGA_HERO_MULTIPLIER()", +"725ad47f": "TransferERCXTokenInitiationEvent(uint256,address,string,address,address,uint256)", +"725c8bdd": "LMITOKEN()", +"725cedd3": "calculateReward()", +"725d8524": "getOption(bool,address,uint128,uint128,address,uint64)", +"725da7b4": "withdrawMicroDivs()", +"725e70a3": "getnumDeposits()", +"725ef390": "mod(uint16,uint16)", +"72601e77": "setOracleFee(uint256,uint256)", +"72601faa": "ROUND_DATA_COUNT()", +"726199b5": "notarizeHash(uint256,string,string,string,bytes32)", +"7261e469": "burn(address,uint128)", +"7261ffad": "spendGameLockedToken(address,uint256)", +"7262561c": "unsubscribe(address)", +"7262eb66": "PRE_ICO_POOL()", +"726300c7": "releaseEscrow(uint256,uint256)", +"72630a6d": "UpdateIndividualContributorCap(address,uint256)", +"7264727d": "STCToken()", +"7265d040": "startAtBlock()", +"72664744": "setDelegadoDeDistritoVerify(bytes32,uint256)", +"726678e7": "level2Bonus(uint256)", +"7266f4a4": "X3()", +"72670119": "payBonus1Address(address)", +"72675562": "extraTokensWallet()", +"7267a25b": "mainSaleMinimumWei()", +"7267f24a": "lrcReceived()", +"726802a4": "addAddressToAccount(address,bytes,bytes,bytes32)", +"7268475b": "ITSMToken()", +"7269a327": "isNonFungibleBaseType(uint256)", +"7269daa5": "requestChangeStaker(address)", +"726a3ad1": "removeReservedTokens(address)", +"726a431a": "TARGET_USER()", +"726ab4ef": "getParentHash(bytes)", +"726aeb20": "costToCreateGame()", +"726b23bf": "changeMinNac(uint256)", +"726b5bad": "endAirdrop()", +"726bd6bf": "oraclizePrice()", +"726c12c8": "FileDataInt()", +"726c6382": "Error()", +"726d0a28": "getRequest(address,uint256)", +"726d50ee": "totalCampaignsBy(address)", +"726d82a0": "SEN()", +"726df9cc": "grantService(address,address)", +"726ea051": "calculateCoinBuySimple(uint256)", +"726ee493": "withdrawStakeTokens(uint256)", +"726ef3da": "getCurrentWinnerMoveCount()", +"726f63f6": "setTokenOffering(address,uint256)", +"727089f1": "extractAllowanceLength()", +"72712bb8": "trophyAddress()", +"72729ff2": "amountRaisedInWei()", +"7272ad49": "decreaseApproval(address,uint256,bytes)", +"7274f35b": "getCoinIndex(bytes32,address)", +"72750dc1": "PANICPERIOD()", +"7275c8cb": "getRecord(bytes32,string)", +"72761e96": "execute_transfer(uint256,uint256)", +"727648a3": "submitWork(address,address,uint256,string)", +"7276509c": "purchaseBuilding()", +"72771d40": "sendList(address)", +"7277236b": "icoInvestment(address,uint256)", +"7278d080": "BTCEarth()", +"7278d623": "CurrentEntityState()", +"7278ef8e": "createExchange(uint256,string,string,uint256,uint256,uint256)", +"727a00a5": "LetsFunds()", +"727a666a": "totalLevelValue()", +"727a899a": "setHashes(uint8,string,string,string,string)", +"727b1cd6": "next_draw(bytes32,uint256,uint256,uint256,uint256,uint256)", +"727b4094": "transferStep()", +"727b4276": "setBitGuildToken(address)", +"727c2ff0": "purchaseWithGze(uint256)", +"727cdf87": "setCut(uint256)", +"727d508a": "isOpenForPublic()", +"727da487": "TTGOracle()", +"727e2422": "StudioToken()", +"727f0067": "nextHash()", +"727fc9fc": "SCAM()", +"72801b53": "isInTimeRange(uint256,uint256)", +"728064cd": "GetTotal()", +"7280850e": "getHandRank(uint32)", +"728171ba": "addressRegister(address,address)", +"7281854d": "GetCategoryValue(uint8)", +"7282c5b1": "WithdrawFeeBalance(uint256,address,uint256)", +"72840e32": "rentPeriod()", +"72841e0c": "isMaxCapReached()", +"728435a0": "ReverseProposed(string,address)", +"7284e416": "description()", +"72850e7a": "priceNeedsUpdate()", +"728516c2": "getProjectedPayout(bool,uint256,uint256)", +"72852fe5": "attackTile(address,uint16,uint256,bool)", +"72855080": "demurringFeeDenum()", +"72879610": "sencHardCap()", +"728880c2": "payOutVoterByAddress(address)", +"7288b0a9": "numberOfPingsAttempted()", +"7288b50c": "engraveNamespace(string,string,bytes32)", +"72892f4f": "newPlay(uint256,uint256,address,uint256,uint256,uint256,uint256,uint256)", +"7289f28e": "setLastRound(uint256)", +"7289f9aa": "setDiscountedInvestor(address,bool)", +"728a6755": "buyBookLotto()", +"728addbc": "token_balanceOf(address)", +"728af7ec": "getInterest(uint256,uint256)", +"728b763c": "extendTde(uint256)", +"728c3ea2": "getBorrower(bytes32)", +"728c97ca": "returnEther(address)", +"728cbc44": "userHeldTill(address)", +"728cd741": "SnapshotAndDistributePot()", +"728cf508": "bookingMetadataForKey()", +"728d0e2b": "accrueDividendandCoupons(uint256,uint256)", +"728d3dd2": "newRaceDistCon(address)", +"728d5e94": "baseTokensPerEther()", +"728de91c": "preSale(address,address,uint256)", +"728ec9f1": "YourCustomToken()", +"728f31e7": "setTransferEnablingDate(uint256)", +"728f3a21": "isApprovedWallet(address)", +"72909e28": "calculateIdeaSell(uint256)", +"7290c21d": "auctionCancelled(uint256,address)", +"7290f691": "horseShoePr(uint256)", +"72910be0": "setTitle(string)", +"7291acdf": "SaleWindowUpdated(uint256,uint256)", +"72923378": "RockPaperScissors(address,address,uint256)", +"72927b1e": "deleteEntryByName(bytes32)", +"72929b56": "getKudosPerProject(address)", +"7294789b": "getWhaleCard()", +"7296359a": "fog()", +"729680c3": "epsAddress()", +"7296dae6": "jsonCat(string,string,address)", +"7297be7f": "changeFixedCommissionFee(uint256)", +"72987457": "blocktrade()", +"7298b261": "_calcEditorKey(bytes)", +"7299054c": "random(uint256,uint256,uint256)", +"72998d8e": "LotteryGameLogic(address,address)", +"72998ee1": "addPreSalePurchaseTokens(address,uint256)", +"729ad39e": "airdrop(address[])", +"729aeea6": "isSetupRunning()", +"729b3881": "setNewRound(uint256)", +"729c04fd": "_yearTwoClaimed()", +"729cc83e": "getPlayerKeyCount()", +"729e3ef8": "YOPT(uint256,string,uint8,string)", +"729e6f2b": "getGameChance()", +"729ee75b": "updateUSDXGE(uint256)", +"729ef530": "additionalBonus()", +"729f0e8e": "cmct()", +"729f2439": "addK(uint256)", +"72a02f1d": "finalizeInit()", +"72a06b4d": "returnInt8(int8)", +"72a0c16e": "tulipToApproved(uint256)", +"72a1a8ae": "CanSignIn()", +"72a1b73f": "createSale(uint256,uint256,uint256,uint256,address)", +"72a1e258": "updateUser(address,string,uint256,uint256,uint256)", +"72a20c78": "powers()", +"72a22014": "firstAuctionsHighestBid()", +"72a22d51": "unlockValueOf(address)", +"72a2d90c": "quickWithdraw()", +"72a4a02f": "runPreMint()", +"72a4d94b": "release(bool)", +"72a503be": "transfer(address,address[],uint256[])", +"72a52851": "checkProof(bytes32[],bytes32,bytes32)", +"72a56d2c": "ICO_RATE1()", +"72a66507": "_isNewUser()", +"72a6a480": "_validRating(uint8)", +"72a7019c": "saleHardCapEther()", +"72a74d5b": "confirmOffer(uint256)", +"72a7655e": "timestampMint()", +"72a7b8ba": "multiDecreaseApproval(address[],uint256[])", +"72a7c229": "right41(uint256)", +"72a7d8c9": "lengthEqual(bytes32[],uint256,string)", +"72a7ff87": "isKYCRequiredToSendTokens()", +"72a85604": "min_amount()", +"72a86693": "ambassadorsNumber()", +"72a88673": "nthRoot(int256,int8)", +"72a984b2": "blockMinedAt()", +"72a9e232": "reserveFunds()", +"72aa18d7": "WALLET_ECOSYSTEM()", +"72aa343a": "removeProof(address,bytes32)", +"72aa9349": "maxTickets(uint256)", +"72aab7d7": "setGPSEndTime(uint16,uint8,uint8,uint8,uint8,uint8)", +"72abee88": "PreIco(uint256,uint256,address,uint256)", +"72acad56": "check_reward()", +"72ad21c7": "protection(uint32)", +"72ad3c9f": "OTCChain()", +"72ad5bbe": "_isErcToNativeBridge(address)", +"72adc407": "getGuardianVend(uint256)", +"72adcadd": "TOTAL_CONTRIBUTOR_COUNT()", +"72ae74dd": "getCoinRemains()", +"72ae9e54": "blocksCoordinates(uint256,uint256)", +"72af7b43": "SkyeCryptoPrivate(uint256,string,string)", +"72af805e": "sendPreIcoTokens(address,uint256)", +"72b0d90c": "withdrawTo(address)", +"72b28d27": "getNext(address,uint256,uint256,uint256)", +"72b2ee75": "investorsNum()", +"72b30d39": "setLLV_edit_30(string)", +"72b38ab9": "refundUser(address)", +"72b3936d": "EWBToken()", +"72b3f570": "endBuy()", +"72b44b2c": "getSaleReturn(address,uint256)", +"72b4e98f": "Aecium()", +"72b4f111": "COOPToken()", +"72b50845": "eliminateSDCC(address,address,uint256)", +"72b556c7": "emissionReleaseTime()", +"72b59c68": "createNote(uint16,bytes2,bytes12,bytes)", +"72b5e050": "LOCKED_ALLOCATION_PPM()", +"72b60682": "lockEndDate()", +"72b614af": "itemsPerPage()", +"72b7094a": "tokensPerEthPresale()", +"72b75585": "getOriginalClient()", +"72b7f893": "metaIncreaseApproval(address,uint256,bytes,uint256,uint256)", +"72b81b1c": "resolveLotteryByHand(uint32,uint32)", +"72b8a5cf": "bonusPersent()", +"72b8de14": "isChallengePeriodOver()", +"72b902a7": "setvolumebounus(uint256,uint256,uint256)", +"72b91e61": "seen(address)", +"72ba8259": "testMinting()", +"72baa12e": "withdrawQR(address)", +"72baa779": "setItoEndTime(uint256)", +"72bc56fe": "IsMultiFreeze(address,address[],bool)", +"72bc8fc6": "ether2tokens(uint256)", +"72bc8ff2": "isOMITokenLockContract()", +"72bc9240": "etherPerSale()", +"72be346c": "ZTR_ETH_initial_price()", +"72becdee": "_generic(bytes,address)", +"72bedcee": "operationState()", +"72bf079e": "adjustPrice(uint256)", +"72bff5ad": "freezeMintingFor(uint256)", +"72c03508": "contributorClaim()", +"72c0e7a4": "setThreshold(bytes32,uint256,uint256,address)", +"72c1591c": "testFail_basic_sanity()", +"72c174db": "mintTokensForAdvisors()", +"72c1df4c": "transferDirectorB(address)", +"72c27b62": "setFeeBps(uint256)", +"72c3015c": "mint(int256,address,string)", +"72c4639e": "SummRew()", +"72c4ae6b": "walletForCommunity()", +"72c537e6": "FirstCryptoBank(uint256,string,string)", +"72c5c349": "NinjaCore()", +"72c5cb63": "getAmountTransferred()", +"72c60b1d": "tokenAddressToAssetData(address)", +"72c691b2": "setWarTokenAddr(address)", +"72c70758": "setBountyFundWallet(address,address,uint256)", +"72c7c85a": "minority()", +"72c7e48d": "addAddressesToWhitelist(address[],string)", +"72c87075": "testBlockHeaderFetch()", +"72c87e37": "MahamHasanTestCoin()", +"72c91cdd": "maxTokenForPreSale()", +"72c9a5e3": "approveFST(address,uint256)", +"72c9e9e0": "placeBid(uint64)", +"72ca7fce": "TrueVeganCoin()", +"72cb8942": "everyCoin(address,uint256)", +"72cb8a89": "TokenWithdraw(address,uint256,address)", +"72cc1f5a": "knightAddress()", +"72ccd03a": "delWord(string)", +"72cd5576": "getImpactLinked(string)", +"72cd700b": "totalSupplyExpansionTokens()", +"72cd7b89": "foundationTarget()", +"72cde347": "setMiniPoolEdit_5(string)", +"72cee8ea": "getReferralProfit(address,address)", +"72cef34b": "getRevisionIpfsHash(bytes32,uint256)", +"72cf3b40": "recharge(bytes32,uint256,address)", +"72cfea69": "presaleClosingTime()", +"72d00e9f": "activeContracts(uint256)", +"72d0774a": "presaleFinishTime()", +"72d0979a": "AddBonusToListFromArray(bytes32[],uint256[],uint256[])", +"72d16358": "Oratium()", +"72d209f5": "processRequest(bytes32[],bytes5,address)", +"72d29f64": "setValidatorName(address,string)", +"72d2f8b8": "createHodler(address,bytes16,uint64)", +"72d32586": "STOREDIG()", +"72d32968": "withdrawBonus(uint256)", +"72d376b6": "proofTokensAllocated()", +"72d3880e": "mainICO()", +"72d39ee4": "Credo(address,address,uint256,uint256)", +"72d475db": "getTotalHeartsByDappId(uint256)", +"72d4b93c": "VitManToken()", +"72d5637f": "AxieCore()", +"72d5fe21": "changeProposer(address)", +"72d744e0": "feeFromTotalCost(uint256,uint256)", +"72d8c1c7": "ForestCoin()", +"72d8e442": "hasBeenRevealed(address,uint256)", +"72d9733e": "add_AUTO_MANU()", +"72d99675": "getCollectible(uint256)", +"72d9b86f": "unpauseCrowdsale()", +"72d9f13d": "setMaxEarningsClaimsRounds(uint256)", +"72dad9f9": "SuperCoinViewToken()", +"72db2339": "ERC677Transfer(address,address,uint256,bytes)", +"72dd236a": "setTokenOffering()", +"72dd529b": "totalsupply()", +"72dd52e3": "coinContract()", +"72dee32b": "getEndGameStatus()", +"72df02a7": "setMintThresholds(uint256,uint256,uint256)", +"72dff527": "drawTertiaryBWinners(uint256)", +"72e05569": "_sendRefund()", +"72e09d48": "mokenId(string)", +"72e0e984": "prime(uint256)", +"72e18c12": "placeSellOrder(uint256,uint256,uint256,uint256)", +"72e208eb": "targetAddr()", +"72e2cac8": "BONUS_WINDOW_4_END_TIME()", +"72e2f8f5": "checkFreeze(address)", +"72e38003": "treefs()", +"72e3c5c2": "toggleEmployeeSuspension(address,uint32)", +"72e3f040": "richestRoundId()", +"72e4030d": "_freezeTransfer(address,uint256)", +"72e496f3": "setRestrictedState(bool)", +"72e4dc06": "changeProductAvailability(uint256,uint256)", +"72e4f262": "annotationLength()", +"72e4f5cc": "CreateOffer_internal(uint8,bool)", +"72e5186c": "depositTo(uint256,address,uint256)", +"72e5c84f": "_getTokenBonus(uint256)", +"72e67d06": "setPendingManager(address)", +"72e6aca3": "isWithinICOTimeLimit()", +"72e6e21a": "exchangeableTokens()", +"72e7a69c": "isHardCapAchieved(uint256)", +"72e861ee": "private_setRandomAPIKey(string)", +"72e87c35": "giveProduce(uint256,string)", +"72e8e6a4": "PublicMined(address,uint256)", +"72e91fee": "initialPartnerAccount(uint8)", +"72e98a79": "transferBZxOwnership(address)", +"72ea1eb0": "addressBytesFrom(address,uint256)", +"72ea2e6d": "finishInitialExchangingPeriod(uint256)", +"72ea4b3d": "TestToken(uint256,string,uint8,string)", +"72ea4b8c": "getNumInvestors()", +"72ea61e8": "dist_developer(address,uint256)", +"72ea7243": "generateLand()", +"72ea8bfe": "executeBet(address,address,bool,uint256)", +"72eab193": "COMPLIANCE()", +"72ead941": "getDelegate(address,uint8)", +"72eae629": "multiMintBounty(address[],uint256[])", +"72ebe2aa": "verifyYourBalance(address)", +"72ec1993": "enablerefund(address,address)", +"72ece81c": "_create_island(bytes32,address,uint256,uint256,uint256,uint256)", +"72ed2c7f": "setQualifiedInvestor(address,bool)", +"72eda05f": "tokensAllocatedToCrowdFund()", +"72ee91c2": "configSignOrganizers()", +"72eec3a7": "refundToken(bytes32,string,address,address)", +"72eefb8a": "getRareItemsOwner(uint256)", +"72ef149e": "whiteListRegistrationEndTime()", +"72ef5458": "transferTokenOPSPlatformTokens()", +"72ef6a08": "rgbLimit(uint256)", +"72ef90e4": "Shop(address,string,string,uint256,uint32)", +"72efa4ef": "Showcoin()", +"72f0424f": "getPriceToken()", +"72f12814": "_setIDLE(uint256)", +"72f1301a": "USCCToken()", +"72f159b7": "migratePlayerData2(uint256,address,uint256,uint256,uint256,uint256)", +"72f3b3c4": "ownerAbandonOverride(uint256)", +"72f41f11": "approvedRatio(uint256)", +"72f443be": "ChangeLicense(address,bool)", +"72f4ecab": "Balances()", +"72f4f5f9": "TOKEN_REFERRAL()", +"72f52a3e": "getAttoTokensAmountPerWeiInternal(uint256)", +"72f57f1f": "withdrawUnsoldTokens(address)", +"72f5ae5f": "setCertificationManager()", +"72f5bb30": "UKToken()", +"72f5fccd": "releaseToMgmtTeam(address,uint256)", +"72f65dea": "BitstartiToken(uint256,string,string)", +"72f69a72": "getBurnRequestsLength()", +"72f6c3b5": "coinPercentage()", +"72f702f3": "stakingToken()", +"72f71894": "backTTCOwner()", +"72f74af8": "crowdfundAddress()", +"72f79b56": "btcEthRate()", +"72f83d3a": "poolSub(uint256)", +"72faebdb": "addCustomerFromACC(address)", +"72faf84a": "tokenSTCDRforBurnInControlWallett()", +"72fb54e5": "PHASE_2_PRICE()", +"72fb6f75": "MIN_INVEST_SUPPORT()", +"72fb9703": "challenge(address)", +"72fc493d": "decFeeDeposit(uint256)", +"72fc75d7": "_changeTrancheIfNeeded()", +"72fd1a7c": "changeRateSale(uint256)", +"72fd8772": "toekensForOthers()", +"72fdbf25": "increaseDividendPayments(address,uint256)", +"72fecf84": "upgradeUnitId(uint256)", +"72ff1773": "bonus_percentage()", +"72ff285e": "_calculatePayout(bytes32,uint256)", +"72ff3d87": "signedBySystem(bytes32,bytes)", +"73032446": "censorAndCover(address,uint256,string)", +"730369a7": "tokensBounty()", +"7303a559": "getCreatorMetadata(string)", +"7303ed18": "trustedUniverseBuy(address,uint256)", +"73047e93": "timeslucky()", +"73053410": "newVersion(uint16[3],address,bytes)", +"73053f70": "tokenDeposit(address)", +"7305c695": "_orderTokens(address,uint256,uint256,address)", +"7305dce1": "createPromoCollectiblesWithMining(uint256[],address[],uint256[],uint256[],uint256[],uint256[])", +"73069f94": "_claimTokens(address)", +"730720b8": "testControllerValidTransfers()", +"730736c9": "DelSocialAccount(bytes32,bytes32,bytes32)", +"730740f8": "_resumeWork(uint256)", +"7307b805": "dismissTokenOperator(address)", +"73086e58": "isFreezeTimeout()", +"730a04fd": "ArnoldCoin()", +"730a0d80": "unhold(address)", +"730a1a16": "_medalUnFreeze(uint256)", +"730a3127": "RECORDICO(address,address,uint256,uint256,uint256,uint256)", +"730a9f1c": "UncleToken()", +"730ad454": "vote(bytes32,address,bool)", +"730afd06": "_proposeAmendment(address,uint256[],uint256[],bytes32)", +"730b1952": "test_insert_updateHead()", +"730bdc96": "getHeroDetails(uint256)", +"730c1faa": "LogUnpause()", +"730c635a": "_checkToiletFlush(bool,uint256)", +"730d2221": "CWS(uint256,string,string)", +"730db1f8": "setNum(uint256,int256)", +"730e90b7": "addTipBalance(uint256,address,uint256)", +"730ef269": "getNumberOfItems()", +"730f2a96": "_transfer(address,address)", +"73107c99": "ICDStartTime()", +"7310c2e0": "Daisee()", +"73124ced": "transferLock()", +"73124ee9": "ContractDetector()", +"7312aaae": "singleWithdrawMax()", +"7312c065": "Receiver()", +"7312d625": "paySuperprize()", +"73137bd0": "buildInternalSalt(uint128,address,address,uint256,uint64)", +"73138e4f": "PRESALE_SUPPLY()", +"73139c0d": "getTokensForStage(uint256,uint256)", +"7313b3b1": "Drawing()", +"7313ee5a": "vestingPeriod()", +"7314221e": "_createDeveloper(string,uint256,uint256)", +"7315acc8": "getAllShareholdersOfArtwork(uint256)", +"7315af6f": "LandmarkCoin()", +"7315f446": "votedKickoff()", +"7316453e": "setPrice1(uint256)", +"7317a88d": "transferSingle(address,address,uint256)", +"7317c4f3": "replaceAnimal(uint8,uint16,bool)", +"731859bc": "batchLockArray(address[],uint256[])", +"7318b453": "setVotetUntil(uint8)", +"7319b43e": "playersList(uint256)", +"7319e5aa": "calculateBonus(address)", +"731a00f5": "calculateVestedTokens(uint256)", +"731a3b06": "unstakeFrom(address,uint256)", +"731ac7ed": "choosePerk(uint8)", +"731b185e": "LogSetPreICO(address,string)", +"731b3284": "Lockable()", +"731bed8b": "WithdrawalStarted(address,uint256)", +"731c2f81": "feeRebate()", +"731c7c62": "setServiceRegistryEntry(uint256,address)", +"731e1c94": "setLastPrice(uint256,uint256)", +"731e1ecd": "preMarketingSharesDistributed()", +"731f03fc": "setMinimumBuy(uint256)", +"731f49b7": "lastIdGen0()", +"731f93c5": "updateCertification(uint256,string,string,string,uint16)", +"731fb32e": "PRE_SALE_GMR_TOKEN_CAP()", +"73201667": "tokenUnlock(address,uint256,address,uint256)", +"73206348": "raiseDollarsWithdrew(address,uint160,int160)", +"7320753b": "approveConnection(address,address,uint256)", +"7321a17b": "getTotalBonusTokensByAddress(address)", +"7321ffa6": "distributeFunds(address,uint256,address,address,address)", +"73221a55": "unblock(address,bytes32)", +"732264b4": "getCommitmentsOf(address)", +"73228786": "setTokenAddresses(address[6])", +"7322dccd": "lastBlock_a16()", +"7323febe": "aa(uint256)", +"73247269": "getPoolContractPolicy(uint256)", +"73251628": "doAirdrop(address)", +"732519d5": "getSellable(uint32)", +"73252322": "RandomProofFailed(bytes32,uint256,uint256)", +"73256a8d": "SharesChainTokenCrowdFunding(address,address,uint256,address,address,address)", +"7325b084": "GdprCash()", +"732606fc": "getCooldownIndexCount()", +"732617bb": "switchAdmin(address)", +"7326b901": "getPropertyCount()", +"7326cac8": "ethIn_()", +"732726d1": "increaseLockedAmount(address,uint256)", +"732783ac": "tokensBought()", +"7328c6ec": "submitNewContract(string,address[],string,bytes32)", +"7328f531": "evaluateSkill(address,uint8,uint256,uint256,uint256)", +"7329036a": "getBlocksLeftInCurrentKick()", +"732a37c9": "SnowdenAffact()", +"732b6963": "emitEnd()", +"732bdbbf": "clearApprovalAndTransfer(address[16],address,address,uint256)", +"732c227f": "contributionCaps(uint256)", +"732d2da4": "testHasCinderToken()", +"732d565b": "ONE_YEAR_KEEPING()", +"732e632e": "assemblyTest()", +"732e77d0": "EGGS_TO_HATCH_1SHRIMP()", +"732e78d1": "_sign(address)", +"732ef12c": "fee_registration()", +"732f5d0c": "AdvancePayplus()", +"732fe2ff": "buyerCapLowEther()", +"73305f14": "Quicketh()", +"7330aba2": "getOracleAddresses()", +"7330aca4": "_isTransferAllowed(address,address)", +"7330daac": "isOnList(address)", +"73311631": "addBrand(address,string)", +"733122aa": "fromMemory(uint8[])", +"73321f03": "GateToken()", +"733261bf": "bountyAdress()", +"7332b520": "getRewardsCount(uint256)", +"73333128": "out3Done()", +"73335b46": "GlobfoneToken()", +"73339a13": "setNetworkState(uint256)", +"7333fd00": "lock4Dividend(uint256)", +"73342168": "BFToken(string,string,uint8,uint256)", +"733452bc": "Descript()", +"733480b7": "transferToICAP(bytes32,uint256)", +"7334a63f": "whatWouldPurchaseDo(uint256,uint256)", +"7334b2d7": "isBurnWallet(address)", +"7334d5e2": "editSpecial(uint256,uint256,uint16)", +"73357018": "RATE2()", +"73373879": "RecoveryQuorum(address,address[])", +"733746ba": "Snickers()", +"73379c54": "SecretNoteUpdated(address,bytes32,bool)", +"7337c993": "initiate(uint256,bytes20,address,address,bool,uint256)", +"73383832": "barrierPrice()", +"73384fd5": "addMultipleAddressesToUncappedAddresses(address[])", +"7338c25c": "hasAttribute(address,bytes32)", +"7338ddcc": "acm()", +"7338faba": "setHardCapEther(uint256)", +"73396ff4": "getLoanToDepositRatio()", +"7339affc": "UbiqTalk()", +"733ad6e3": "BHMBLU()", +"733b679e": "PRESALE_LEVEL_2()", +"733bdef0": "getStakerInfo(address)", +"733bf2f2": "setPercentageCut(uint256)", +"733ccaba": "setResolver(string,address)", +"733d8053": "containsToken(address)", +"733dca75": "registerCoin(bytes4,string,string,address)", +"733e193c": "saleHasEnded()", +"733ef936": "drainFunds()", +"733efe16": "numSkinOfAccounts(address)", +"7342048a": "transferOwnershipOfContract(address)", +"7342c484": "airdropDistributedTokensAmount()", +"73440745": "listItem(uint256,uint256,address,bytes32,address)", +"73454fe4": "StuckOnStupidToken()", +"7345a3a2": "payExcess()", +"7345da39": "logPayerStatement(string)", +"73463965": "notifyPlaceSellOrder(uint256,uint256)", +"73463c9c": "ReceivedETH(address,uint8,uint256)", +"7346ec57": "tokensToWei(uint256)", +"73475373": "trySell(uint256,uint256)", +"73479f39": "totalT8EXSold_CORNERSTONE()", +"7347a25d": "BitcoinTrade()", +"7348ac1f": "ecoSupplyAddress()", +"73493f09": "getTokensCost(uint256)", +"734a2c72": "ProjectTestToken()", +"734a56f0": "preSaleEtherPaid()", +"734b4861": "addOpenAction(string,address,string)", +"734b9a87": "mod(uint64,uint64)", +"734bb97e": "checkcoursestudent(address)", +"734ce665": "newProposal(address,uint256,bytes32,bytes32)", +"734d8287": "unclaimedFees()", +"734e21bd": "getToken(address,address,uint256,address)", +"734e3015": "newMegabox(address,uint256,uint256)", +"734f2838": "FinishCompetition(uint32)", +"734f8a4d": "kycValid()", +"735056a3": "SpoolAmount()", +"73520a2b": "getReservedTokenDestinationList()", +"7352e4b8": "setAffiliate(address,address)", +"735307fb": "createTimeLockContract()", +"73535aa7": "PixelUpdate(uint32,uint8)", +"7353a21d": "queuedAmount()", +"7353f62b": "testGetApprovalDb()", +"73545d44": "landmarkOwnershipCount(address)", +"73549604": "getFinalTime(bytes32)", +"7354eb04": "rocCoreAddress()", +"7355303e": "_priceOf(uint256,uint256)", +"7355a424": "getDataCount()", +"735631ad": "revokeTransaction(uint256)", +"7356a8a9": "getTile(bytes)", +"73580358": "ColorBayTestToken(uint256,string,string)", +"73582884": "releaseGrant(address,address,bool)", +"735958f2": "XPAAssetToken(string,string,uint256)", +"73596cfc": "Bitcoincredit()", +"73599205": "ProdDToken()", +"7359f5cf": "FundAddress()", +"735a3326": "getLeftTickets()", +"735a80b1": "test_voteSpammingAgainst()", +"735af2eb": "Rate10()", +"735b232c": "addWhitelistedTransfer(address)", +"735b266d": "icoStage1Deadline()", +"735b38a3": "getCardCanPresaleCount()", +"735b81ab": "circulationAt(uint256)", +"735bae84": "migrateRoundData(uint256,uint256,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"735bb742": "sha256Docs(bytes32)", +"735cfff2": "valueTotalSupply()", +"735d3e81": "updatedBalance(address)", +"735d45e1": "RADIUM()", +"735d8876": "getCurrentExpirationTime()", +"735dcc8b": "devfeetodev()", +"735e9cbb": "disableModule(bool)", +"735f11b4": "updateAndWithdraw(uint256,int256[2],uint256[2],int256,bytes32,address,uint256,uint256,uint256[3])", +"735fb8e0": "fundOwner()", +"7360ab6e": "mint(address,uint256,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"73611c48": "send3MilWeiToPong()", +"73618371": "Molecule(uint256,string,string)", +"7362377b": "withdrawEther()", +"73627826": "getTime(uint256)", +"7362d9c8": "addWhitelistAdmin(address)", +"7363d85b": "TMEXAddress()", +"73646c91": "updateMirroir(address,address)", +"7364a8dc": "MyBalance(uint256)", +"73654b6d": "userTransferFrom(address,address,uint256)", +"7365870b": "bet(uint256)", +"7365babe": "MIN_TOKEN_INVEST()", +"7365e1fd": "setPriceCutoff(uint256)", +"7365e2d7": "totalPresaleTokensSold()", +"736660ac": "determiningWinner()", +"7366794e": "distributeTokens(uint256)", +"73668b06": "XCCCrowdsale(address)", +"7366c68d": "calculateCommission(uint32)", +"7366e3ff": "raisedInPresale()", +"73671268": "vestToAddress(address,uint128)", +"73674ecc": "admin_deposit(uint256)", +"7367df4b": "Syndicate(uint256)", +"7367e302": "ContractCreationTransaction(bytes,uint256,uint256,address,uint256,uint8,uint256,uint256)", +"7367f156": "gameSettings(uint256,uint256)", +"73681818": "EICQ()", +"73688914": "owner1()", +"7368a8ce": "create(bytes32)", +"7368b3cb": "DinsteinCoin(uint256,uint256,uint256,string,string)", +"736a0102": "bonusETH()", +"736a1b9a": "AdjustClientAccountBalance(bytes32,bytes32,bytes32,string,uint256,string,uint256)", +"736b13ae": "setRefillFor(string,uint256,uint256)", +"736c24b5": "AdsharesToken(address,address,address,uint256)", +"736c3e82": "onPayment(address,uint256,bytes)", +"736c983a": "setCurrentRevision(address)", +"736d323a": "setPausable(bool)", +"736d7c52": "isAlreadyDelegate()", +"736d7ee9": "revokeAccess(address,int256,address)", +"736ead2c": "optionsCalculator()", +"736ec05c": "setMigrateTo(address)", +"736eec58": "TransferAnimalToAnotherUser(uint256,address)", +"736fafd3": "setPreIco()", +"736fe565": "withdrawAmount(address,uint256)", +"73705090": "teamOnePrefix()", +"7370a38d": "getNumPackages()", +"7372014e": "midnight()", +"73720de9": "receiveMonthlyNRT()", +"7372196c": "PHASE_4_PRICE()", +"7372c2b5": "pull(address,address,uint256)", +"73732024": "isDeposited(address)", +"737377fe": "getTokenVolumebasedBonusRateForPhase2(uint256)", +"7373af84": "numberOfNarcosByDistrict(uint8)", +"7373f41d": "getEthereumBalance()", +"73741171": "createVCXVault(uint256,address)", +"73743fbe": "prospectors_team()", +"7374b013": "buyTDETokensWithoutETH(address,uint256,uint256)", +"737517f5": "powerUp(address,uint256)", +"73752db4": "getKYCPayload(bytes)", +"7375c0c3": "PonderGoldToken()", +"7375e0fe": "testSimpleObject()", +"7375ed82": "LogLoss(address,uint256,uint256)", +"7376678b": "finalizePreSale()", +"7376fc8d": "right67(uint256)", +"73770c01": "Updater()", +"737732b2": "DEVELOPERS_BONUS()", +"7377a036": "CloudexchangeToken(address)", +"737a7698": "transferAssigner(address)", +"737aa5a0": "remainingTokensWallet()", +"737c2d8c": "checkAvailableTokens(address,address)", +"737c8ea1": "_getRevisionBlockNumber(bytes32,uint256)", +"737ce916": "MT(uint256,string,string)", +"737d5f39": "AccessAdmin()", +"737d8c8e": "ChangeTokenWalletAddress(address,address)", +"737e2835": "_minHouseEdgeClassic()", +"737e7d4f": "getByVersionId(uint256)", +"737f18ff": "_weiToVouchers(uint256)", +"7380fbf3": "removeMemberArrayToken(address,address,uint256)", +"73815ab7": "nfc_simplehq()", +"738198b4": "cast(uint256)", +"738228cd": "testUmlaut()", +"73826a93": "updateTokenDetails(string)", +"7382901e": "serverSeedHash()", +"73835f35": "checkIfEligable(address)", +"7383d709": "buyItem(uint256,address)", +"7383d8ee": "getEachBindAddressAccount()", +"73845cfa": "setLocked(address,uint256)", +"738486bd": "BeerCoin(uint256)", +"7385c4be": "deleteHiddenPosition(uint32,int64[],bytes16)", +"7385e1f3": "level_5_amount()", +"7386c2be": "Exilium()", +"7386f0a7": "reservedTokensDestinations(uint256)", +"7387479e": "reclaim_art_token()", +"73889677": "ownerLives()", +"73889f4a": "getHoldersCount()", +"7388fb2b": "AltTokenDistribution(address)", +"73898796": "Tier_Classic_Registration()", +"738a2679": "left85(uint256)", +"738a2cf8": "nextPaymentTime()", +"738acb3b": "sha(string)", +"738b2fac": "setSignedPublicEncKey(string)", +"738b31b5": "minimumWithdrawal()", +"738c2931": "rewardTwo()", +"738d8d82": "numberWikiPages()", +"738ddabe": "getContentIndexedAccountCred(uint256,address,address)", +"738e6d78": "checkRefund(address)", +"738fa7a4": "userRank()", +"738fdd1a": "reg()", +"7390a673": "MyEtherTellerEntityDB()", +"7390c786": "getRandomResult()", +"739112da": "safeSubtrCPCE(uint256,uint256)", +"73913545": "fundVesting(uint256)", +"73916918": "getinfowinning(address,uint256)", +"73918980": "multiTransferEth(address[],uint256[])", +"73925694": "take(uint256,address[])", +"739294d2": "setAssignedID(address,address,uint256,string)", +"7392ce80": "TokenDeployed()", +"73930ce2": "validAmount()", +"73931bbf": "getGame(bytes32)", +"73932bfd": "withDrawal()", +"7393d262": "goldenTicketUsed(address,string)", +"7393e0b2": "DayTrader()", +"7394cb3f": "addLocationRecord(uint256,uint256,string,string)", +"73962b26": "isReleased(uint256)", +"73963bf0": "setIdArray(address,address,string,string,uint256[])", +"73964787": "batchAddCancelledOrFilled(bytes32[])", +"7397d5f1": "getMintForReportingParticipantAmountValue(int256)", +"73980d69": "dollarRaised()", +"739826c5": "changeAllowTransfer()", +"739838be": "DigitalEnthusiasts()", +"73984188": "delOwner(address)", +"739890f0": "disqualifyTeam(address)", +"7398ab18": "getPosition()", +"7399646a": "theRun()", +"73998758": "smpToken()", +"739ab361": "needApprovesToConfirm()", +"739b47ca": "recordWin(address)", +"739b5014": "Snatch(uint256,address,address)", +"739b6214": "doProveMemoryWrite(uint256,bytes32,bytes32[])", +"739b78ed": "LogSell(address,uint256,uint256)", +"739b8c48": "setForwardedOutcome()", +"739bdcff": "pricePause()", +"739beded": "mintSendTokens(int256)", +"739cb57d": "setEndtDate(uint256)", +"739d3307": "SetWho(address)", +"739d980e": "address(address,uint256)", +"739e40b7": "getMyPunchCards()", +"739e7f48": "TeamChoice(address,uint256)", +"739f2224": "SetActive(bool)", +"739f763e": "getListing(bytes5)", +"739f888c": "setNewEstimate(int256,int256)", +"739f9202": "dev_share()", +"739fab1b": "getAvailableWithdrawInvestmentsForOwner()", +"73a070bc": "addressReserveFund()", +"73a077a4": "sub16(int16,int16)", +"73a17e6d": "setCompte_31(string)", +"73a19dd2": "Deposited(address,uint256,uint256)", +"73a1e7f5": "allReceivedEth()", +"73a1f366": "founderTokenCount()", +"73a22e62": "fetchPaidOrdersForMerchantByAdmin(address)", +"73a26a12": "CryptoDiamondCoin()", +"73a29b5e": "get_presale_arbits_sold()", +"73a2d1ff": "MexicovsSweden()", +"73a3d9e4": "canUpdatePercentToTakeAsSeed()", +"73a40efb": "_computeRarity(uint256,uint256,uint256,uint256,uint256,uint256)", +"73a4c307": "COMMUNITY_SUPPLY()", +"73a55389": "setRarePrice(uint256,uint256)", +"73a5717e": "BaironSupply()", +"73a5f508": "getAuditorRegistry()", +"73a699ad": "isGenesMarket()", +"73a6b2be": "isAccountValid(address)", +"73a72b18": "setFountainFoundationOwner(address)", +"73a75c1f": "addVineyard(string,uint16,uint24,uint32,uint16)", +"73a7b8b2": "storeStages(uint256[])", +"73a7dfda": "we()", +"73a80336": "prizeWon()", +"73a80b74": "_mintSqr(uint256,address,uint256,uint256)", +"73a91544": "showMigrationStabitcoinAddress(address)", +"73a95ddd": "redemptionPaused()", +"73a97787": "sgcToken()", +"73a97f42": "MetaRules(address,address[])", +"73aad472": "guaranteedBuyersBought(address)", +"73ab7503": "FlightPlan(address)", +"73abecbb": "kill1()", +"73ac4739": "getOnSellCardIds()", +"73acbcb2": "switchBleachAllowed(bool)", +"73acee98": "totalBorrowsCurrent()", +"73ad2a15": "AllowedRecipientChanged(address,bool)", +"73ad468a": "maxBalance()", +"73ad6c2d": "setMarketplace(address)", +"73ae277b": "getDepositAddressVerify()", +"73aef263": "FDSToken()", +"73aef2b6": "unFrozenControl(address,uint256)", +"73af6308": "setTierLimit(uint256)", +"73af652c": "setCollectibleExposure(address)", +"73b1184e": "setupVote(uint256)", +"73b14098": "getTotalDevelopmentFundEarned()", +"73b1edce": "_lock(address)", +"73b24ca0": "indInflation()", +"73b2c384": "_computeBorder(uint256)", +"73b2e80e": "hasClaimed(address)", +"73b34271": "ETH420on49()", +"73b38101": "wipe(bytes32,uint256)", +"73b3dcde": "maxDestroyThreshold()", +"73b4086b": "loans(address)", +"73b40a5c": "forwardTo(address,address,uint256,bytes)", +"73b4484f": "registerA(string,string,string,address)", +"73b47908": "_updateCounters(uint256,bytes32)", +"73b4df05": "createToken(string,address,uint256)", +"73b51d38": "startWork(string)", +"73b51f0b": "_tokenDelivery(address,address,uint256,uint256)", +"73b55eaf": "registerData(address,int256,bytes32,address)", +"73b5abaa": "PresaleDiscountPercentageChanged(address,uint8)", +"73b6656f": "relay(address)", +"73b68be8": "preicoAddresses()", +"73b6a48a": "GetDataRequest(uint256,bool,string,uint256)", +"73b793a8": "PrizeFund()", +"73b8a8c1": "MeetOneCommunityBonus()", +"73b913fa": "safeTransferManyFrom(address,address,uint256[])", +"73b972bc": "bonusTokensIssued()", +"73b9aa91": "account(address)", +"73baae7a": "KingKongCoin()", +"73bbda81": "standardTokenDefrosting(address[])", +"73bc1b2f": "customerPool()", +"73bc8b2f": "kvcSub(uint256,uint256)", +"73bc8b77": "SPIDER_BOOST()", +"73bda17e": "restrictedTokens()", +"73be0a99": "getData_7()", +"73be6ddd": "allowEscrow()", +"73bf2ce0": "getMilestoneHashById(uint256)", +"73bfb566": "withdrawFromProject(address,uint256)", +"73c107b3": "checkWins(uint256,uint256,uint256)", +"73c1af76": "deleteFreezeList(address)", +"73c24cb1": "Buy(uint256,address,uint256,uint256,uint256,bytes16,bytes32)", +"73c261f4": "getRegionUpdatedAtPurchasedAt(uint256)", +"73c28692": "disallowFunding()", +"73c2ec65": "sendbal(address,uint256)", +"73c32a71": "get_property_basic_info(uint256)", +"73c4726b": "minHouseStake(uint256)", +"73c4942a": "depositStopTime()", +"73c6a4ec": "acknowledgeCopieExecutoire(bytes32)", +"73c6aa7d": "ExchangeEfx()", +"73c74103": "recoverTokensTo(address,uint256)", +"73c8c4bf": "Leverages()", +"73c8d8a2": "setMaxPaymentInEther(uint256)", +"73c8de54": "issueByTranche(bytes32,address,uint256,bytes)", +"73c90b43": "calcBidAllocationFee(bytes32)", +"73ca1b28": "WHYPHY()", +"73cb0620": "fluffyCatAddress()", +"73cb8ab7": "enableTokensTransfer()", +"73cbd8ce": "getPublicSupply()", +"73cc3ec7": "iceFundDeposit()", +"73cc9153": "MeshPointManager()", +"73cce6f1": "presaleAllocateTokens()", +"73cd0a19": "allowanceBurn(address,address)", +"73cd148e": "VariableConstructor(string)", +"73cdcac4": "getPostsFromPublisher(address,string,uint256,bool,uint256)", +"73ce3c72": "UpStats(uint256,uint256,uint256,uint256)", +"73ce9920": "parseOrder(bytes)", +"73cf013c": "isBlacklist(address,address)", +"73cf8f97": "registryRequestSku()", +"73d00224": "swapTokens()", +"73d01ead": "prepareForMigration()", +"73d08bc5": "prefill(address[],uint256[])", +"73d0d693": "Set(address,uint32[],uint24[])", +"73d0fe48": "totalLockedHavvens()", +"73d28995": "isMidGrade(uint256)", +"73d31240": "removeGame(uint256)", +"73d3172e": "MXY_chain()", +"73d384c8": "hasDeposits(address)", +"73d45ba4": "owner_ActivatePOS(bool)", +"73d4a13a": "data()", +"73d4c0ff": "m_aOwner()", +"73d4d500": "transferPayable(address,address,uint256)", +"73d4d9f9": "checkMAC(bytes32,bytes32[],bytes32)", +"73d55379": "Beneficiary()", +"73d65c00": "GEN0_NO()", +"73d69720": "checkWhitelistAddressValue(address,uint256)", +"73d6c2ec": "init_ico(address)", +"73d901d6": "activityClosed()", +"73d9170d": "GKBToken(uint256,string,string)", +"73d9fd0c": "placeTokenBet(uint256[],bytes32,uint256,uint256,bytes32,bytes32,uint8,uint256,address)", +"73da968d": "buySection(uint256,uint256,string)", +"73dae7d6": "issueTokensForPrivateInvestor(uint256)", +"73db0844": "ETHUSD()", +"73db2350": "commentsLength()", +"73dc7635": "openAttacksCount(address)", +"73dd9073": "secondStage()", +"73de3570": "calcaultePrizes(uint256,uint256)", +"73de3e72": "_refundTokens()", +"73de975c": "alreadyMintedOnce()", +"73def2b7": "subFreezingPrice()", +"73df6b19": "visitLength(uint8)", +"73e1743a": "buildDSBasicAuthority()", +"73e1851b": "migrateMyTokens()", +"73e1c5c9": "getMyFreeCoin(address)", +"73e2212e": "changepresalebonus(uint256)", +"73e2ab69": "_removeWhitelistAdmin(address)", +"73e2d75f": "changeClons(address,uint8,bool)", +"73e2faa8": "destructionContractAddress()", +"73e30e49": "majorEventFunc(uint256,bytes,bytes)", +"73e3ce80": "fact()", +"73e3de70": "CardSwap(address,uint256,uint256)", +"73e3e7a7": "getAdultByAddress(address)", +"73e40ed4": "REWARD_SUPPLY()", +"73e4d829": "createLandmark(uint256,uint256,address,uint256)", +"73e52855": "crownUnFreeze()", +"73e538fc": "availableTokensOnCurrentStage()", +"73e55a57": "DAOstackPreSale(address,uint256,uint256)", +"73e58a75": "balanceTeam()", +"73e61cf2": "changingEnabled()", +"73e67a38": "GameGoldToken()", +"73e6fc1b": "parseUint(string,uint256)", +"73e7c8ce": "setErrorRest(bytes,uint256)", +"73e81d88": "TrustMarketHubToken()", +"73e87d74": "OTM()", +"73e888fd": "contribute(address)", +"73e8b3d4": "exist(bytes32)", +"73e9f3e6": "Crowdsale(address,uint256,uint256,uint256,address,address)", +"73eab74b": "SoulTransfer(address,address)", +"73eaddf0": "OMGBalance()", +"73ec6bb5": "AMOUNT_PER_PHASE()", +"73ec7df0": "joinCommunity(address)", +"73ecac3b": "setGiftTokenAmount(uint256)", +"73ece9c4": "setEmployee(address,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint8)", +"73eda3cc": "finalizePublicSale()", +"73eec3c5": "payoutDividends(address,uint256)", +"73eef753": "coinSendSameValue(address[],uint256)", +"73ef6357": "selectplayer()", +"73efc627": "addAction(bytes32,bytes32,string,uint256,bool,uint256,uint256,uint256,uint256,bytes32)", +"73f00fb3": "emissionlocked()", +"73f01104": "reveiveToken(address,uint256)", +"73f029cd": "setOrUpdateRecord(string,string,string,string,address,uint8,bytes32,bytes32)", +"73f03d53": "crowdSaleFinalized()", +"73f1e6d7": "resolveLotteryByOraclize(uint32,uint32)", +"73f28451": "tokensRate()", +"73f310df": "multiAccessRemoveOwner(address)", +"73f3312d": "setMentorsTokensWallet(address)", +"73f3bd1f": "earlyInvestors()", +"73f42561": "burned()", +"73f440fe": "prevRoundTweetId()", +"73f58acd": "createTeamTokenTimeLock(address,uint256,uint256,address)", +"73f5cfb1": "isPhaseValid(uint256)", +"73f5edce": "UpPlayerResult(string,address,uint256,uint256,uint256)", +"73f5f8ee": "tokensAvailableAtCurrentTier()", +"73f64212": "supplyMultiplier()", +"73f69bc5": "TrustedDocument()", +"73f8edc3": "configureMarketItem(uint256,uint8,uint8,uint8,string)", +"73f8fd4b": "getUserTokenBalance(address,address)", +"73f93a48": "getAccountContentTip(address,uint256)", +"73f9421d": "getUpgradeCardsInfo(uint256,uint256)", +"73f9d5a0": "eostContract()", +"73f9ff23": "RaffleMakersBook(string,uint256)", +"73fa9ce8": "getAmTokenBalance(address)", +"73fac6f0": "confirmReceived()", +"73fb7878": "dividendFor10kDaily()", +"73fba0e8": "airdropReserve()", +"73fc115f": "RubiToken(address)", +"73fc83fa": "updateDireccion(address,bool)", +"73fc8420": "deployedOn()", +"73fc9643": "calculateFLC(address,uint256)", +"73fcfea1": "withdrawPLAT()", +"73fddd16": "refundEndTime()", +"73fe1673": "cpow2(uint256)", +"73fe747c": "TransferCreators(address,uint256)", +"73fee090": "setfee(uint256)", +"73fef35a": "setStartTimeIcoStage2(uint256)", +"73ff4d48": "getPlayerForCard(uint256)", +"73ff81cc": "getOwnersCount()", +"73ffd5b7": "transferEther(uint256)", +"73ffd969": "setMap(uint256,uint256,uint256)", +"73ffecd0": "getPlayerHistories(address,uint256)", +"74002b6c": "getTokenPriceInWeiAndPhaseIdxsForDate(uint256)", +"7400ed3b": "acceptDeposit(address,address,uint256)", +"74019f87": "BATSafe(address)", +"7401aaa3": "getPlayerRoundBought(uint256,uint256)", +"7401f9c0": "flag(uint256,address)", +"740227d1": "receiveFunds(address,uint256)", +"7402a9aa": "isFirstStageFinalized()", +"74030531": "bet(string)", +"7403db08": "getVerifiedHash(address,uint8,address,uint256,uint256,uint256,uint256,uint256,bytes32,bytes32)", +"7403e980": "initPGOMonthlyPresaleVault(address[],uint256[])", +"74040424": "startPartnerSale(uint256)", +"74040cd2": "setBidFeePercents(uint256)", +"74041d1f": "liquidPledging()", +"74043a70": "FRPUSD()", +"740528a7": "GrantRevoked(address,uint256)", +"7405322e": "checkBalance(address,string)", +"74056b73": "crowdsaleMinUSD()", +"7405cee9": "CGCToken(uint256,string,string)", +"74063cc1": "tokenOfMakerByIndex(address,uint256)", +"74068480": "setPresaleFail()", +"7406d1a7": "updateRegistratorStatus(bool)", +"7406d943": "BIGTPrivate()", +"740707cf": "cancelSaleOfMintingAddress()", +"74087040": "testBitsNotEqualSuccess()", +"740907ea": "buySale(address)", +"74091685": "setReservesForExchangeTokensPercent(uint256)", +"7409e2eb": "swapTokenToToken(address,uint256,address,uint256)", +"740a2a90": "registerEmployer(string,string,bytes32,uint256,uint256,uint256[],string,string,string)", +"740ab8f4": "partitionsOf(address)", +"740b63f9": "set_hedgeAddress(address)", +"740b91b6": "horseOwnerIndex(uint256)", +"740d0a6f": "getAmbientHumidityException(bytes32)", +"740d73f3": "addToWhiteList(address[])", +"740e2a29": "setFundRepository(address)", +"740ed4e0": "addNewStakeDiceGame(uint256)", +"7411b2b2": "TrendNetworkToken()", +"741273d6": "testThrowRegisterContractAgain()", +"7412c223": "getCurrentTier()", +"74135154": "func1()", +"7413801a": "initializeAdvisorVault(address)", +"7413dcc3": "DelistTitle(uint256)", +"74141266": "arbiterList(uint256)", +"741430ad": "VINCToken()", +"7414edc4": "ERC20Token(string,string,uint8,uint256,address,uint256)", +"74151a2a": "retrieveUnsoldTokens()", +"74158cd8": "updateAdministratorKey(address,address)", +"7415fbdb": "_getGameInfoPart2(uint256)", +"74163ab1": "minsignupeth()", +"741677a5": "makeTrade(address,address,uint256,string)", +"741685e5": "EtherFuture()", +"7417040e": "numberOfParticipants()", +"7417575c": "_releaseEarning(bytes32,bytes32,bytes32,bool,address,uint8)", +"74182009": "CreateWolk(address,uint256)", +"74192209": "getTokenEnhanced(uint256,bool)", +"7419e77a": "setMarketplace(address,bool)", +"7419f190": "stakeStartTime()", +"741a35c4": "getTx(address,uint256)", +"741ad7a3": "transferDividends()", +"741b0508": "isSplitable()", +"741b2239": "unfreeze_period_time()", +"741b3c39": "depositBond()", +"741bcc93": "fillOrKillOrder(address[5],uint256[6],uint256,uint8,bytes32,bytes32)", +"741bd9c8": "ETHDeposir()", +"741be410": "getOpenPackageIdOfOneAgency(address)", +"741bef1a": "priceFeed()", +"741c251d": "changeGamemaster(address)", +"741cb9ce": "setCurve(address,bytes32,int256,int256[])", +"741cdf27": "Library()", +"741e2345": "registerMany(address,uint256,int256,uint256,bytes20,address,bytes)", +"741e3576": "getBonustokens(uint256)", +"741ed475": "AnkitVictoToken()", +"741f0434": "check(bytes20,uint32,int24[4],int24[4],uint32[4],bytes32[])", +"741f7034": "CrowdsaleToken(string,string,uint256,uint8,bool)", +"74214c92": "StandardERC223Token(uint256)", +"74220f3d": "burnApproval(address,address,uint256)", +"74229301": "isTokenized()", +"7422a127": "is_valid_event()", +"7423ab57": "Project_RemoveToken(uint256,uint256)", +"7423d96e": "txnTax()", +"7423e225": "getDataPointForSubject(int256,uint256,uint256,int256)", +"7424bab1": "currentAirdropAmount()", +"7424bebc": "bonusBasePoints()", +"7426172d": "addPurchaseFromOtherSource(address,string,uint256,uint256)", +"74268ff2": "deleteOffer(uint256)", +"74281f95": "FNAToken()", +"74287872": "investedAmountOf()", +"742887ff": "deleteAddress(address)", +"7428c5f4": "Gamble()", +"7428eed3": "IndieGameToken(string,string,uint8,uint256,address)", +"74294070": "_createItem(string,address,uint256,bytes32,address,address)", +"742978da": "getAssets(address)", +"7429c086": "repeat()", +"7429d78b": "SUCC(uint256,string,uint8,string)", +"7429f1eb": "multiAccessSetRecipientD(address,address)", +"7429fd67": "initHolderConfig()", +"742a1a56": "CCTE()", +"742a9fa0": "recursiveFloor(uint256,uint256,uint256)", +"742aa578": "AddressRecovered(address,address)", +"742b8b9d": "_CallRejected(bytes32,bytes15)", +"742ba8de": "declareProjectNotFunded()", +"742bff62": "SoftDude()", +"742c81e4": "approveOwnership()", +"742cd75d": "mintPCD(address,uint256)", +"742d5355": "calcTokenOwnerReward(uint256)", +"742d9f0b": "lastBlock_v7()", +"742d9fa3": "userOfferSubmitElement(uint256,uint256,uint256,uint256,uint256,uint256)", +"742e2ebd": "AllowedSet(address)", +"742e54b2": "_airdropSupply()", +"742f79d5": "preRate()", +"7430faf4": "fechSnapshotBlockByIndex(uint256)", +"74313b4a": "releaseTokens(address,address)", +"7432542d": "_remainReward()", +"74331be7": "sete(address)", +"7434206e": "validateReceipt(string,uint256,bytes32,bytes32,bytes,bytes,bytes32)", +"743438ad": "id_for_address(address)", +"7434d180": "removeSmartContractByAddress(address)", +"7434e60d": "HamsterToken()", +"7435039d": "calculateBountyRewards(uint128)", +"743521c6": "rewardBountyMany(address[],uint256[])", +"7437681e": "maxTx()", +"74388347": "checkBetDozen(uint8,address,bytes32,bytes32)", +"74389991": "breakit()", +"7438b0df": "WIN_CUTOFF()", +"74396ed1": "makeWithdrawal(address,address,uint256,uint256)", +"74398d45": "setGlobalTokenTransferLock(bool)", +"7439a3bd": "verifyClaim(uint64)", +"7439e787": "getUserValues(address)", +"743a3252": "addAddressAsMultiOwner(address,string)", +"743ab538": "validateNameSignature(string,uint256,address,string,uint8,bytes32,bytes32)", +"743b179e": "giveRefund(address)", +"743b8e1a": "ROHH(uint256,string,string)", +"743bd681": "OWNERS_AUCTION_CUT()", +"743bdcef": "MAX_WITHDRAW_PCT_TX()", +"743c006b": "iWantXKeys(uint256,uint256)", +"743c6775": "investorBaseInfo(address)", +"743c7f6b": "setPreSaleDate(uint256)", +"743e0c9b": "receiveTokens(uint256)", +"743e92ee": "getNode()", +"743f78ab": "WalletSet(address)", +"743f978f": "addValueToCovfefe(uint256)", +"74400873": "execute(uint256,address,uint256,uint256)", +"744013c4": "Gnome()", +"74418368": "getAdvertisementStorageAddress()", +"7441b8bb": "lockBalance(address)", +"7442f427": "subUserTokenLocalBalance(address,uint256)", +"74439ca7": "classic()", +"74449ca4": "getContentCount()", +"7444b006": "transferCopyFrom(address)", +"7444b227": "getMidgradeCarsForVariant(uint256)", +"7445690b": "getLotteryClass(uint8[7],uint256)", +"744598cd": "Phase1AccountTokensMaxUpdated(uint256)", +"7445af4b": "pay_by_bond_contract(address,uint256)", +"7445d659": "foreignBridge()", +"74467a1e": "FOR_SALE()", +"7446ce1c": "addJob(bytes32,uint256)", +"74478bb3": "isClaimable()", +"74479db0": "fcontr()", +"7448d386": "getStageData(uint8,uint256)", +"744927fd": "getWinnerWithRank(uint8)", +"744a8f77": "chefPrice()", +"744b4b3f": "createNormalBank()", +"744bb8d2": "crowdsaleHardCap()", +"744bfe61": "withdrawFunds(uint256,address)", +"744c7c7f": "proposeMinting(uint256)", +"744c8c09": "chargeFee()", +"744d0a92": "MINI_GAME_BONUS()", +"744d3411": "getBidCount(uint256)", +"744d8b4f": "recordWin(uint256,uint256)", +"744f4994": "getBrickIdsByOwner(address)", +"744f5f1a": "modifyTaxRate(uint256)", +"744f7c7d": "toUint256Safe(int256)", +"744fa2c8": "submitTokenToEthOrder(uint128,uint128)", +"7451bf71": "admin_transfer(address,address,uint256)", +"745332fe": "getRestarTime()", +"74536403": "getAvar()", +"74539f98": "getEventResolvers()", +"7453a417": "__address4__()", +"7453cfa1": "EtherPaint()", +"7453de96": "approveTransaction(uint256,uint256,string,uint256)", +"745400c9": "requestWithdraw(uint256)", +"74544e2d": "setGrandFactory(address)", +"7454e74c": "setAudit(address,address)", +"74552650": "left95(uint256)", +"74556ee9": "getQST()", +"7456be7d": "rent(uint256)", +"7456f2b9": "getDistributionTime()", +"74573f80": "lastPlayTimestamp()", +"7457412e": "THIRD_PARTY_LOCKUP_ADDR()", +"7457a9e1": "Coupon(uint256)", +"74580e2f": "changeCreator(address)", +"745828ef": "ProofOfLongHodlV2()", +"74583772": "adminSendTokens(address,uint256)", +"74590f64": "setApoderado(bytes32)", +"745911d5": "getHolidayByIndex_(uint256)", +"745944d5": "setCampaignValidById(bytes32,bool)", +"7459a5e1": "KriptoPark()", +"7459f2a3": "registerArbiter(uint256,uint256,uint256,uint256,uint256)", +"745a8be2": "flip32(bytes)", +"745ab73d": "BrainIsToken()", +"745ce3bb": "iaInvestedBy(address)", +"745ced49": "CORE_TEAM_PORTION()", +"745cf221": "ArjunaCoin()", +"745d1d64": "ethCollector()", +"745dcd4d": "stop(string)", +"745e77f9": "_createAnimecard(string,string,string,string,uint256,address)", +"745e9da2": "GameProgress(uint256,uint256,uint256)", +"745ea0c1": "registerNameXnameFromDapp(address,bytes32,bytes32,bool)", +"745f2860": "_buyTokens(address,uint256,uint8)", +"74601c3c": "availableToMint()", +"746022c2": "oneGetMoneyBack()", +"74607d91": "patient(uint256)", +"74609d0c": "createDApp(bytes32,uint32,bytes,bytes32)", +"746178ed": "escrowTokensWallet()", +"7461dbff": "setOwnerAirDropRate(uint32)", +"7462260b": "KEM()", +"7462beec": "renewSubscriptionByDays(uint256,uint256,uint256)", +"7462e4f9": "Etheropoly()", +"74635cfc": "setMembers(address[])", +"74646086": "StreamityTariff(address)", +"7464d5d8": "rewardDistributionStart()", +"74651594": "tgeSettingsChangeRequest(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"746584b4": "setMintingContractAddress(address)", +"7465df26": "totalAccessories(uint256)", +"74664b34": "interestNextInPercent()", +"7466b2d0": "transferIsPossible()", +"7466e67d": "mintToOtherCoinBuyer(address,uint256,string)", +"7466ee48": "getAppAddress(uint32)", +"74674256": "temroyToken()", +"746796f0": "_setProfitSharingParameters(uint128,uint128)", +"7467af07": "EladToken()", +"7467bc92": "disbursementHandler()", +"7467bcd9": "minPaymentWei()", +"74689990": "schedulePayoutOraclizeCall(uint256,bytes32,uint256)", +"746a9af2": "printCertificate(string,string,string,uint16,string)", +"746abc79": "distributeRegistrationBonus(address)", +"746ac67e": "PCNCrowdsale()", +"746c9171": "m_required()", +"746d3024": "perPrice()", +"746df633": "getTeamBallers(address)", +"746eff8c": "_cancelRolePermissions(address,address)", +"746f79d9": "TIER2_PERCENT()", +"746fc8d0": "right47(uint256)", +"74703123": "proceedKYC(address)", +"74707e0d": "deleteWallet(address,address)", +"747082b9": "FsTKAuthorityChanged(address)", +"7470a835": "OliToken(uint256,string,uint8,string)", +"7470f760": "createTeamTokenByPercentage()", +"74711285": "restartSale()", +"74715432": "renounceAuctionManager()", +"7471ea81": "IPayX()", +"7471f6f6": "buy_beer(uint256,uint256)", +"747293fb": "addCaller(address)", +"7473f4e0": "grantAccessbyDelegate(bytes32,address,address,string)", +"74748460": "balanceOfAtInternal(address,uint256)", +"7474dfd0": "_getBetAmount(bytes32)", +"74754282": "manufacturer()", +"747586b8": "setInt(int256)", +"74759f43": "numberOfInvestments()", +"7475baa6": "AirDropPayBitsBounty(address[])", +"7476865f": "ToggleMaintenance()", +"74772667": "changeMinContrib(uint256)", +"74775cdd": "buyAtPrice(uint256)", +"74780111": "assertEq16(bytes16,bytes16)", +"747853bc": "test_validBoardFundTransfer()", +"74796cc2": "getPlayersInGame(uint256)", +"7479aa04": "getCurrentRoundStartTime()", +"7479b9ac": "founderToken()", +"747ad1c1": "getPeriodIdx(uint256)", +"747bcd72": "SCORE_UNITARY_SLASH()", +"747c1d87": "getInvestorsAmount()", +"747cb030": "SALE_3WEEK_BONUS()", +"747d6dd0": "_getCrabPartBonuses(uint256)", +"747dff42": "getCurrentRoundInfo()", +"747e0670": "UseWish(string)", +"747f3380": "phoneNumber()", +"747fc0d2": "maxReferrals()", +"7480a676": "Cryptosquirrel()", +"74816d1e": "webGiftUnTransfer(address,address)", +"74817d9b": "startPublicSale(uint256)", +"74818530": "Creedex()", +"7481a8aa": "TokenizedSplitter(string,string,uint248)", +"7482e533": "EventLuckyNumberRevealed(address,uint256,uint256)", +"7483883d": "getOrAddMasterWallet(address)", +"74845024": "scribes_hisory_length()", +"748467b9": "callBtcWithSto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"7486a8e3": "get_publisher(bytes32)", +"748837b2": "getIsBonusUnlockExempt(uint256,address)", +"74888914": "setHatchDurationMultiByGeneration(uint32[])", +"7488aa3c": "getNextBonusIndex()", +"7488ad7c": "minDepositInCents()", +"74891e1b": "getCoinAgeInternal(address,address,uint256)", +"7489308f": "lpTargetPosition()", +"7489472a": "step_pay()", +"748949e8": "setGalleryFourPrice(uint256)", +"7489ec23": "cancelOrder(bytes32)", +"748b659d": "pauseCollectToken()", +"748b95b6": "decimls()", +"748ce291": "addRewardforNewContributor(address,uint256,string)", +"748d071d": "seriesCreated(bytes32)", +"748d1078": "updateDukeHistory(string,bool,string,address,uint256,uint256)", +"748dd2fc": "GAME_TYPE_DICE()", +"748de225": "getFreezeAccount(address)", +"748de5d3": "UpdateAddressPayForService(address)", +"748e4f40": "sendTokensToTeam(address)", +"748ed9a8": "getTargetIncorrectDesignatedReportMarketsDivisor()", +"748efab5": "_copyToBytes(uint256,bytes,uint256)", +"748f0810": "ProposalTallied(uint256,uint256,uint256,uint256,bool)", +"748f7215": "getUnlocktime()", +"748fa599": "someUnsafeAction(address)", +"748ffa5b": "cei(uint256,uint256)", +"74900c92": "MINIMUM_ETHER_SPEND()", +"74912463": "tokenEmission()", +"74914710": "getCrySolObjectsByOwner(address)", +"7491ef60": "PrecommitmentAdded(address,uint256)", +"7492384a": "backTixOwner()", +"7493357b": "reservedOwner()", +"7493539b": "KOALAPROJECT()", +"74935f11": "PLS()", +"74942868": "rate8_end_at()", +"74942c0f": "tokens_received()", +"7494ad81": "judge(uint256,address)", +"749510d4": "BOUNTY_FUND()", +"749555cd": "toggleIsLive()", +"7495a1e4": "buyFor(string,address)", +"7497a061": "getAuthorDrawings(uint256)", +"749843ea": "setPlatinumAddress(address,address)", +"74991569": "setVestingContract(address)", +"74998f33": "Infinix()", +"749a47b7": "minPreviewInterval()", +"749aa2d9": "endRound()", +"749b7820": "canBuy(address,uint256,uint256,uint256,bytes8)", +"749be0c0": "GetTotalPot()", +"749c190b": "getHashsLength()", +"749ca1f3": "setGameOnoff(uint256)", +"749cab54": "setBlocks(uint256,uint256)", +"749db2f6": "Contract(string,string,address)", +"749dd65d": "_currentMonth2ndDayTimestamp(uint256,uint256)", +"749e8b88": "BUYPRICE()", +"749e93fc": "actualPriceDivisor()", +"749ea598": "leaders(address)", +"749f1bc3": "agendaOf(address)", +"749f9889": "changeAllowedRecipients(address,bool)", +"749fe7c4": "getPlayerEnergy(uint32)", +"74a042b5": "ClaimEthersEvent(address,uint256,uint256,uint256,uint256)", +"74a0cd8c": "getCombinedWarriors()", +"74a205d9": "ZIMBOCOIN()", +"74a25d43": "startAuction(uint256,uint256,uint256,uint64)", +"74a32dd7": "TotalAirdropRequests()", +"74a37efc": "setSalary(uint256,uint256)", +"74a3c5d5": "getVestingAmountByNow(address)", +"74a46050": "offer(address,uint256,uint256)", +"74a76649": "payTheWinner(uint256)", +"74a76816": "dividendsOf(address,bool)", +"74a7d6b9": "initNewPlayer(address,bytes)", +"74a7d77c": "sellTokensNow(uint256)", +"74a814fe": "getGeneral(uint32)", +"74a85571": "addAccount(address,uint256,bool)", +"74a8f103": "revoke(address)", +"74a93e6c": "setTokenHolder(address,address)", +"74a9446e": "_removeAllActiveTasksWithHoles(uint256,uint256)", +"74a9ced9": "createPoll(string)", +"74a9e440": "createProposal(uint256,address)", +"74aa9e2c": "PRESALE_RESERVERED_AMOUNT()", +"74aac084": "joinDelta()", +"74aaefcc": "SundaToken()", +"74ab3e4b": "updateCardStatistics(address)", +"74ac5bb4": "erc20KGS(uint8)", +"74ac6112": "HOPE()", +"74acb5d6": "isAirdrop(address)", +"74acf0b1": "communityDevelopmentWallet()", +"74ad74e9": "getMinLockedAmount(address)", +"74ae26f7": "checkReleaseAmount(address)", +"74af10cf": "setNeedToGetFree(uint256)", +"74af3ee1": "getTournamentState()", +"74b00a6c": "convertNums(uint256[])", +"74b04fa7": "setArtistAccount(bytes16,address)", +"74b10ae5": "checkWhale(uint256)", +"74b26fa1": "delegateReferralTokensBulk(address[],uint88[])", +"74b27b9b": "indexextend(address)", +"74b38531": "stopBet()", +"74b39158": "validateAttack(address,address)", +"74b3ee18": "getFlag(string)", +"74b433bd": "TOKEN_SUPPLY_MKT()", +"74b491ff": "airdropCurrentTotal()", +"74b527b0": "getMintedCounts()", +"74b5545a": "delCertAdmin(address,bytes32)", +"74b57486": "DebugContract()", +"74b58489": "setWeiMinContribution(uint256)", +"74b58ae7": "setCCH_edit_10(string)", +"74b5fb06": "_payout()", +"74b67b27": "GameCoin()", +"74b78b26": "payeth1(address,uint256)", +"74b799af": "disableEdition(uint256)", +"74b874a6": "liquidationTimestamp()", +"74b9dc6b": "assertEq9(bytes9,bytes9,bytes32)", +"74b9f229": "buyTokensPreSale()", +"74bb3cb4": "getOrderActualTotalRefundHelper(uint256,uint256)", +"74bd6261": "AdsVenture()", +"74bdb7ee": "createApprovalEvent(bool,address,address,uint256)", +"74bde311": "scheduleNewDerivativeToken(address,uint256)", +"74be3c7f": "TRONV()", +"74bfb965": "addNewProxy(address)", +"74bff257": "getCartItemInfo(address,uint256)", +"74c06f5d": "saleHasFinished()", +"74c1328a": "bytesToUInt(bytes)", +"74c13fda": "defaultToken()", +"74c1438c": "DeepGold()", +"74c166e9": "phase1MaxTokenForSale()", +"74c16b23": "registryAdmin()", +"74c1b1c9": "refundOpen()", +"74c1d7d3": "_best(address,address)", +"74c21059": "totalInvested(uint256)", +"74c272b7": "Begin(string,string)", +"74c40f2e": "dexTestTransferFrom(address,address,address,uint256)", +"74c42e5d": "setuserlevel(address)", +"74c43f26": "setFundariaBonusFundAddress(address)", +"74c57fa1": "LogTeamTokensDelivered(address,uint256)", +"74c65206": "Buy_Offer(uint256,uint256,uint256)", +"74c6bd74": "privateSaleLockEndTime()", +"74c77b52": "SetupToken(string,string,uint256,uint256,uint256,address,address,uint256)", +"74c80467": "createNewElections()", +"74c85591": "fundDepositAddress()", +"74c90d0d": "sellAllCookies()", +"74c950fb": "TOKEN_TOTALSUPPLY()", +"74c97c99": "manaToken()", +"74cad0b7": "ForTester()", +"74cb55fb": "fundsDistributor()", +"74cc991c": "getBetValue(bytes32,uint8,uint8)", +"74ccd7cc": "walletLock(address,uint256,bool,bool)", +"74ccf06f": "addParsel(uint256,uint256,address[])", +"74cd5a31": "HXTtoken()", +"74cd5c0b": "getOneWithdrawRec(uint256)", +"74ce52ce": "Kildoneum()", +"74ce9067": "isCommitPhase()", +"74ce97fe": "year3LockAddress()", +"74cf6f49": "withdrawNoLimit(address,uint256)", +"74cfa35f": "ambassadorAddressOf(address)", +"74d04f83": "addtoPrivateSale(address,address,uint256,uint256)", +"74d050fb": "cardNumbersOf(uint256)", +"74d15357": "virtualc()", +"74d16c37": "getAssetsValue()", +"74d1eb3f": "MANToken(string,string,uint256,uint256)", +"74d21ae0": "unlike(uint256)", +"74d301d6": "sizeBonus()", +"74d33745": "REAPER_INTREPID_FTL_SPEED()", +"74d3475c": "PowerofBubble()", +"74d393f0": "setValue2(uint256)", +"74d3b7cd": "LTR3Token()", +"74d42916": "IINEToken()", +"74d4ab27": "fipsRegister()", +"74d50c1c": "TOPB()", +"74d53cc2": "sendReferral(address,uint256)", +"74d55ceb": "Rhemaxcoin()", +"74d5e1ea": "setteam(address,uint256)", +"74d5f2aa": "BoxTrade()", +"74d618cb": "setTransferActive(bool)", +"74d699b6": "Sale(string,uint256,address)", +"74d6aa1f": "getOrCreateFeeWindowForForkEndTime()", +"74d76bc4": "_getGameInfoPart3(address,uint256)", +"74d88c50": "submitEthToTokenOrder(uint128,uint128)", +"74d89c47": "testUpdateNameDb()", +"74d8b268": "getGunByIdPart1(uint256)", +"74d9c2ef": "tokenTosale()", +"74da564f": "registerMeOnTokenCore(address,address,uint256,string)", +"74dacc7a": "m_attaching_enabled()", +"74daf5cc": "setValidPriceDurationInBlocks(uint256)", +"74db5b27": "totalOf(uint256[])", +"74dbe5e6": "GetSpud(address)", +"74dc1e04": "TokensDestroyed(address,uint256)", +"74dcfd37": "NotakeyVerifierForICOP(address,address)", +"74dd7be9": "setCompte_42(string)", +"74de4ec4": "addReward(uint256)", +"74de8caf": "ERC20transfer(address,uint256,bytes)", +"74de9ebb": "MintEvent(uint256,address)", +"74dfcabc": "changeFreezeTransaction(string)", +"74dff9d8": "stopCycle()", +"74e00730": "DISTRIBUTION_COMMUNITY()", +"74e048d5": "settleBetUncleMerkleProof(uint256,uint40)", +"74e09606": "setSignatureTimeout(uint256)", +"74e104d3": "BITWORKCOIN()", +"74e24367": "ownedTokensIndex(uint256)", +"74e29ee6": "deleteService(uint256)", +"74e4435f": "getUserAddress(uint256,bytes32)", +"74e4f31d": "ZJLToken()", +"74e5530d": "testHasRole()", +"74e57397": "BrandUpdated(address,address,string,bool)", +"74e59296": "MYE()", +"74e5b122": "changeGenerator(address)", +"74e5b186": "_mint(string,address)", +"74e60a48": "cancelOrder(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", +"74e7493b": "changeRate(uint256)", +"74e74f24": "rulesProposal(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"74e8288c": "SaiContest_Gaia()", +"74e861d6": "getHubAddr()", +"74e95828": "_distributeWinnerAndLandholderJackpot(uint256,uint256)", +"74e99f87": "AIWEBToken()", +"74e9e102": "GetTempStuffList(address)", +"74ea9437": "transferICOToken(address,uint256)", +"74eac2e6": "Beruqtoken()", +"74ead7b7": "unstakePrimordialTokenFrom(address,uint256,uint256)", +"74eb7c90": "withdrawSaleManagerBalances()", +"74eb936b": "ethQuantity()", +"74eb9b68": "isAccountLocked(address)", +"74ebe3ec": "isSet(address)", +"74ec8682": "walletForETH()", +"74ec89cb": "H2CToken()", +"74ecf4b5": "getWinningNumber(uint256)", +"74eead66": "SFT_PER_ETH_SECOND_EARLY_BIRD_RATE()", +"74eedd46": "fundingEndTime()", +"74ef109b": "ChinaLifeCoin(uint256,string,uint8,string)", +"74f0314f": "SECONDS_PER_DAY()", +"74f059ad": "dateDefrost()", +"74f0765a": "mintSeq(address[])", +"74f079b8": "txCounter()", +"74f12933": "devPaid()", +"74f1d6ce": "keccak(address,address,uint256)", +"74f28eaf": "_set11()", +"74f47a7a": "nextDrawTime()", +"74f519db": "setLastTimestamp(uint256,uint256)", +"74f569e7": "EriCoin()", +"74f61642": "rewardsRedeemed()", +"74f760e4": "WithdrawWinnings(uint256)", +"74f78412": "market_DeclareBid(uint256)", +"74f78437": "FD(uint256,string,uint8,string)", +"74f79c8e": "DEFROST_INITIAL_PERCENT()", +"74f8d96e": "getRevisionBlockNumber(bytes20,uint256)", +"74f8f7ac": "increaseUpdateMetadataCounter(uint256)", +"74f91b56": "setXTVNetworkContractAddress(address)", +"74fa01c9": "MilcToken()", +"74fa4874": "getResultStatus(uint256)", +"74fa98f5": "setInviteCodeFree(string)", +"74fb381a": "inject(address,address)", +"74fbbc86": "rate(uint256,uint256,string)", +"74fc27c1": "xfitcoin()", +"74fcd919": "tokenMsg()", +"74fd08cd": "whatSatoshiSays()", +"74fd6176": "removeBulk(address[])", +"74fe6dea": "nameCat(bytes5,bytes32)", +"74fe9247": "AddRevocationBounty(bytes32)", +"74fefa2c": "findEndpointByAddress(int256,address)", +"74ff2324": "requestMinimum()", +"74ff32e9": "_percUp(uint256)", +"74ff90ba": "Disbursement(address,uint256,uint256)", +"74ffdcd0": "WEI_PER_ETH()", +"75012c35": "setBonusTokenInDays(address,uint256,uint256)", +"750142e6": "totalReward()", +"7501f741": "maxMint()", +"750225d0": "completeSale(uint256)", +"750240a2": "setMaxResolvedAgonId()", +"75030996": "getServiceName(address)", +"7503af06": "Test9J()", +"7503cda7": "getLogOwnerAddr()", +"7503cda9": "thinkLength()", +"7503e1b7": "tournaments(uint256)", +"750446a3": "howManyTokensAreReservedFor(address,address)", +"750482ba": "ownersBalance()", +"75048ebd": "claimUnsold(address)", +"7504aaaf": "updateTargetedMoney(uint256)", +"750509ba": "getStateRoot(bytes,bytes32)", +"75052882": "modifyProductPrice(bytes32,uint256)", +"75056811": "accountClaimedReward(address)", +"75067219": "MAX_UCCOIN_SUPPLY()", +"75071c4c": "founderFund()", +"750732ec": "addVineyardByRegulator(string,string,uint16,uint24,uint32,uint16)", +"7507b2e5": "OVOToken()", +"7507ba39": "remit()", +"750852b3": "test_invalidThrowWithAsserts()", +"7508f147": "setOperationalReserveAddress(address)", +"75090ebf": "changeDomain(uint256,uint256,uint256,address)", +"750a687c": "GetRevealBlock(bytes32)", +"750a96ac": "_createPermission(address,address,bytes32,address)", +"750c47a1": "TOKEN_PER_ETHER()", +"750c77cb": "AccountMinterRemoved(address,address)", +"750cae6a": "enableBetting_only_Dev()", +"750cc645": "_sendToken(address,address,uint256)", +"750dd523": "getContractCreationTxOrigin()", +"750e1f59": "transfer(address,uint256,bytes1[])", +"750e443a": "voteAgainst(uint256)", +"750e75d5": "distributeJackpot(uint256)", +"750ee24a": "changeIcoEndBlock(uint256)", +"750f0acc": "withdraw(uint64)", +"750f2d81": "ChangeFreezeTime(uint256,uint256)", +"750f7daf": "hashBiometricTemplates(string,int256,string,string)", +"750fd1d1": "startTimeRefund()", +"7510a98c": "updateConfig(uint32,int256)", +"7510c5a0": "encoding_description()", +"75114bcc": "addPhrase(string)", +"7511828e": "Laxz()", +"7511ef65": "setWithdrawAddr(address)", +"7512071b": "doApprove(address)", +"75121c2c": "FCOIN1448Token(uint256,string,string,uint256)", +"751318f4": "bountyAdded()", +"7513eaa7": "HolyCoin()", +"75143ef2": "mintFinished()", +"75151f6b": "addCountryCode(uint256)", +"751559e8": "transactionfee()", +"7515b583": "exchangeCoin(uint256)", +"7515b84a": "releaseRoto(address,bytes32,uint256)", +"75160a20": "pay_royalties()", +"751634d9": "ChangeRules(uint256,uint256,uint256,uint256)", +"751686f7": "_maint_setBlockLimit(uint256)", +"75172a8b": "reserves()", +"7517b57e": "withdrawTaxEarning()", +"7517ea47": "configureSale(uint256,uint256,address,uint256,address,address,address,address)", +"751823f2": "changePartnerCoinPercentage(uint256)", +"751827ac": "setRareAddress(address,address)", +"7518af71": "VGWToken(address)", +"7518fa98": "tokensContract()", +"7519dd8e": "starsOf(uint256)", +"751a0225": "addElement(address,bytes32)", +"751a2d06": "Token_4()", +"751a9108": "balancesof(address)", +"751accd0": "executeGovernorProposal(address,uint256,bytes)", +"751c4d70": "contributeDelegated(address,uint256)", +"751ce8fb": "sendRewardBlockCDN(address,uint256)", +"751d9e65": "WALLET_FOUNDER()", +"751e1079": "compareAndApprove(address,uint256,uint256)", +"751ecea0": "FUTURE_DEVELOPMENT_POOL()", +"751ef753": "toggle(uint256)", +"751fef65": "sellUnit(uint256,uint256)", +"7520320f": "registerCustomer(address)", +"7520767f": "createNew(string)", +"7520bf60": "gas_price_max()", +"75217477": "Debit(address)", +"75218a54": "getUserReactionCount()", +"75219e4e": "transfer(address,address,uint256,bool)", +"75229e28": "lockcheck(uint256)", +"7522aff5": "rejectContract(bytes32)", +"752329ec": "retainedEarning()", +"7523a46e": "HARITECOIN()", +"75247ccb": "_calculateReward(uint256)", +"75250e85": "limitDateCrowdWeek1()", +"752551c9": "_END_DATE()", +"75257013": "appendToDistributionList(string,address,uint256,uint8)", +"7526f98c": "getMin(uint16[])", +"7527313d": "minedBlock(uint256)", +"75286211": "finalizeChange()", +"75287bab": "fetchAllResultByIndex(uint256)", +"75288d95": "platformSupply()", +"7528a6ab": "icoPhase4Start()", +"75298734": "getShare()", +"7529b1d9": "upgradeHasBegun()", +"752a3df6": "transferIfHardForked(address)", +"752b016d": "DeletePatient()", +"752bacce": "getExecPrice()", +"752bece8": "Minus(uint256,uint256)", +"752bf6f8": "sale_pause()", +"752c5628": "callSend(address,uint256)", +"752c8777": "setArenaPool(address)", +"752d2bfb": "addDividend(uint256)", +"752d349c": "depthCheck(int256,int256)", +"752da85a": "endContribution()", +"752dd0dc": "unfreezeBonuses()", +"752dd635": "ETHButton()", +"752efafc": "TIER5_RATE()", +"752f3c8c": "relinquishOwnershipAddress()", +"752faa51": "setLockedGroup(uint8,bool)", +"752fc70e": "howManyEthersToChangeSymbolName()", +"7530b54d": "PRESALE_LEVEL_3()", +"7530d99d": "addForgivedChar(string)", +"7530fe1d": "getContractMessages(uint256)", +"753117ff": "stealTheLeek()", +"7531e032": "resolveExchangeAddress()", +"75321c35": "TransferAgentSet(address,bool)", +"75321c4a": "getOpen(uint256)", +"75322e47": "change(uint256)", +"7532b4ac": "percent(uint256)", +"7532eaac": "signedTransfer(address,address,uint256,uint256,uint256,bytes,address)", +"7532ef1c": "accRecive()", +"75335702": "GSDToken()", +"753384fa": "TOKEN_BONUS_RATE()", +"7534a714": "checkExpectedTokens(address[],uint256[],uint256)", +"75355e34": "giveExchangeRateAdvice(uint256)", +"7535679a": "faucet(address,address)", +"7535927a": "importAmountForAddress(uint256,address)", +"7535c930": "priorityCap()", +"75367ab5": "addToWinners(address,uint256)", +"75383265": "TON()", +"753868e3": "lockContract()", +"753899e9": "alive()", +"7539189c": "getData_3()", +"75395a58": "finalizeBlock()", +"753af202": "SpermToken()", +"753b0dc1": "createFashion(address,uint16[9])", +"753b8c02": "EthernautsMarket(uint256)", +"753c619c": "emitTransferEvents(address,address[],uint256[])", +"753ca259": "PiXS()", +"753cb4eb": "fetchVoteNumForCandidate(address)", +"753cba93": "isPlatinumLevel(address,string)", +"753d764c": "unlistSubName(bytes32,bytes32)", +"753d93e4": "changePlatform(address)", +"753ded15": "failsOf(address)", +"753e88e5": "upgradeFrom(address,uint256)", +"753ea1be": "_transferCoins(address,address,address,uint256)", +"753ed1bd": "ceiling()", +"753f313f": "setPOOL_edit_26(string)", +"753f416a": "send1(address)", +"75401eac": "_isSaleContract()", +"7540b097": "inflateCount()", +"75421e93": "buyIcoTokens()", +"75424253": "BoughtToken(address,uint256)", +"75426ec8": "tokenFulfillmentDeposit(address[2],uint256,uint256[8],uint8,bytes32[2])", +"75428615": "getCallData(bytes32)", +"7542890d": "editIt(uint128,uint64,bytes32[],string,string,string)", +"75432ec4": "setStorageFee(uint256,address,uint256)", +"75438e49": "fillGas()", +"7543af9c": "amount3()", +"7543e3f0": "setReferral(address,address)", +"7544ac1f": "CSAToken(uint256,string,string)", +"75456b49": "fillIndexedBidByAddress(address,uint256)", +"75457583": "Return(address,address,uint256)", +"7545c449": "confirmOrderCompletionByPatient(bytes16,bool)", +"7545f9a1": "processTicketBuying(string,uint256,address)", +"7546006b": "ContractCall(address,uint256)", +"754628d0": "cancelTopUpLimit(uint256)", +"75479c34": "newPlayer()", +"7547c7a3": "stakeTokens(uint256)", +"7548014d": "recoverOnlyOnChainFunds()", +"7548f65b": "END_AMOUNT()", +"754a347a": "transferViolated(string)", +"754a77f5": "fcc()", +"754ad981": "MoveFish(uint256,uint256)", +"754b9e3d": "hashFromHash(string)", +"754c16e8": "getAmountOfProposals()", +"754c175e": "getTip()", +"754c301d": "sumOfFreezing(address)", +"754c3957": "benecifiary()", +"754c67ad": "setTokedoToken(address)", +"754d71e7": "getCurrentBuyOffer(uint32)", +"754db89b": "gameExists(bytes32)", +"754dea40": "setBackendOwner(address)", +"754e0b74": "solveDispute(bytes32,address,bool)", +"754e1764": "DiceRoll()", +"754e1e8e": "invalidateEarlyPurchase(uint256)", +"754efc98": "throwOnGasRefundFail()", +"754f579d": "ownerSetGameName(string)", +"754f9b37": "BasicAccessControl()", +"754fd352": "addOwnerFromRecovery(address,address,address)", +"75504b6e": "getAwardCost(uint256)", +"75524ffd": "mintBase()", +"75526ed5": "setServiceAccount(address,address,bool)", +"7553044b": "setUserServerPermission(address,string)", +"75543074": "getOrganisation(uint256)", +"75545949": "countMails()", +"75545cb2": "processMyVestingRules()", +"75549490": "isEarlyBird(address)", +"7554fffd": "successFee()", +"75556e32": "totalMaxBuyin()", +"7555bfd7": "exchangeAndWithdrawToken(uint256)", +"7556c9e9": "SilentNotaryToken()", +"7556e07f": "hasRate()", +"75570ea7": "closeBets(uint256)", +"7557b2ae": "Advertisement()", +"7558d81e": "contractProgress()", +"7558d9a6": "wallet_Mini_Address()", +"75593a39": "fixPrice()", +"755a11dc": "winnersPot()", +"755a29f4": "set_minCWCsPerSaleMoreThan(uint256)", +"755a8d31": "getBattleTeamSize()", +"755b5b75": "setNumUnits(uint256,uint256)", +"755b9d63": "_addOrder(address,uint64)", +"755bdcc1": "completeTrade(address)", +"755c020e": "withdrawALTokenss(address)", +"755c30a4": "earlyInvestorsBonus()", +"755cc41e": "mintTimes()", +"755d43d3": "calculateAmountReceived(uint256)", +"755d766c": "s27(bytes1)", +"755d80ab": "MintDarioToken(int256,address,int256,uint256)", +"755d98a3": "getTotalDividendPool()", +"755db762": "addVestingAddress(address,uint256)", +"755dc018": "FANBASEToken()", +"755e3e28": "tokensAllocated()", +"755f047b": "projectDescription()", +"755f12db": "totalTokensSoldInThisSale()", +"755f99c2": "AddNewSmallContract(address)", +"755fa815": "getAllIndexesByAddress(address)", +"755fd25c": "mintEditionCards(address,uint8,uint8)", +"75608264": "get_hash(uint8,bytes32)", +"7560a8d9": "_devTokens()", +"7560cab5": "createListing(bytes5,uint256,uint256)", +"75619ab5": "setDistributor(address)", +"7562b0cf": "process(address,uint256)", +"7563113b": "mintPromoEtherBro(uint16)", +"7563c81f": "WorldBetToken()", +"75640ef3": "calculateTotalMinePay(uint256,uint256)", +"75643e1f": "setReward(uint128)", +"75659508": "hasPayroll(address,address)", +"7565a2b6": "transferTokens(address,address,uint256,uint256,uint256)", +"7565d2eb": "coinfabrikAddress()", +"7565ef66": "getTodayLotteryNumber()", +"75661f4c": "calcPlayerICOPhaseKeys(uint256,uint256)", +"75662b0e": "ChainSign()", +"75669274": "XXXToken()", +"7567281d": "_addrunmoney(address,uint256,uint256)", +"75678491": "AMSBToken()", +"7568353c": "isKilled(uint256,uint8)", +"7568a9af": "claimNametagToken(address,bytes32)", +"7568d562": "AssetToken(uint256,string,string,uint8,address)", +"75698524": "UpdateUSDETHPriceAfter(uint256)", +"7569b369": "updateUnclaimedDividend()", +"7569b3d7": "contributorsCount()", +"756a288e": "getStageTokensSold(uint8)", +"756a515f": "test_insert_findNoHintUpdateTail()", +"756abb98": "timeSlicesCount()", +"756af45f": "withdrawBalance(address)", +"756afcab": "Mari()", +"756b1140": "Readings()", +"756b397a": "GainmersSALE(uint256,uint256)", +"756bae5c": "finish(bytes32,bytes32)", +"756bf6e9": "Popcore(uint256,string,uint8,string)", +"756d5e0d": "EvGroupChanged(address,uint8,uint8)", +"756dc34a": "PHASE_NUMBER()", +"756dd3a4": "getSubmission(bytes32)", +"756e15e5": "test_spamApproveAndFreeze()", +"756e8ed3": "innerGuess(uint32,uint16,uint32,address)", +"756f6049": "CORE_NAMESPACE()", +"756f7ce8": "fundariaStakesFrozen()", +"756fb8c9": "getOptionChain()", +"756feedc": "KingXChainToken()", +"75700437": "query1_withGasLimit(uint256,string,string,uint256)", +"757007f6": "CONFIG_MIN_VALUE()", +"757085e3": "fetchAllVoteResultForCurrent()", +"7570acd4": "indVesting()", +"75718e2c": "_increaseTotalDivis(uint256,uint256)", +"7571ca36": "getTerminated()", +"75724990": "addShareholder(address,uint256)", +"7572ead0": "halfyearteam()", +"7572f341": "subtractWee(uint256,uint256)", +"757387d0": "nextInListToReturn()", +"75749f52": "LOCKED_BOARD_BONUS_TOKENS()", +"757501c5": "districtsCore()", +"7575594b": "buyShip(uint16)", +"7575884d": "InTokenTest11(uint256,string,uint8,string)", +"75759319": "wthdraw(address,uint256)", +"7575db0a": "invalidateCache(bytes32)", +"7575ecf6": "validateAndLower(string)", +"75765249": "saveLottery(uint32,uint256,uint256)", +"75766294": "teamPeriodAmount()", +"757765f8": "setMaxBuyLimit(uint256)", +"75776fa4": "createPromoPony(uint256,address)", +"7577732e": "createController(address,address[],uint256)", +"75780127": "testExecuteSellOrderShouldIncreaseBuyerTokens()", +"75785afc": "createDefaultGen0CobeFriend(uint256,address,uint256,uint256)", +"757861eb": "start_play_and_gain(string,string)", +"75790787": "getFeeCollectedByAsset(address)", +"75792f0d": "_transferToICAPWithReference(bytes32,uint256,string,address)", +"75794a3c": "nextTokenId()", +"75796f76": "setWithdrawalWallet(address)", +"7579f2c9": "ArollaToken()", +"7579fcb3": "mintPackSaleCard(uint8,address)", +"757a449e": "approveWithIndex(address,uint256,uint256)", +"757a5522": "channelPartTimeout(uint64)", +"757a61b9": "buyAssetPack(address,uint256)", +"757bd312": "getCrystalWrapper(address,uint256)", +"757be78e": "PlayersStorage()", +"757ccd3b": "canCreate()", +"757d9b97": "getTradeRate(address,address)", +"757de573": "setOwnerCut(uint256)", +"757dfdcc": "SafeWalletCoin()", +"757e5e73": "_giveShares(address,uint256)", +"757f70fb": "SAMPLEToken()", +"757f7302": "updateStateChangeAgent(address,bool)", +"75806e6e": "setIssuerDelegate(address)", +"75811c15": "ownerChange(uint256,address)", +"75812019": "getBurningReward(uint256)", +"7581a8e6": "enableBurning()", +"7581aa5f": "setActivityState(bool)", +"7581d62f": "genesisProtocol()", +"75821d21": "changeTokenWallet(address)", +"75829def": "transferAdmin(address)", +"75830463": "checkBetLowhigh(uint8,address,bytes32,bytes32)", +"758357b8": "fstPrice()", +"7583902f": "getProviderInfo(address)", +"7583a523": "maxEarlyPresaleEDUSupply()", +"75846a5e": "ZoueToken()", +"75849902": "forwardPurchaseFeesTo()", +"75854fbd": "b(bool,bool)", +"75862df4": "TokenWithEStop(address)", +"75864416": "MeritToken(uint256)", +"7586cd45": "getPokemonCurrentPrice(uint256)", +"7586fcc5": "AutoCoin(string,string,uint8,uint256,uint256)", +"75872a5a": "evolveMonster(uint256,uint16)", +"75874f3e": "Divineum(uint256,string,uint8,string)", +"758822e6": "checkForValidity(string)", +"75885f6a": "approveAndCall(address,uint256,bytes1)", +"758866f0": "TOSToken()", +"7588f82b": "currentVestedAmount()", +"75892cf1": "convert(address,address,uint256,uint256)", +"75894e8c": "getEntity(address)", +"758971e8": "ownerTakeProfit(bool)", +"7589ca40": "BCV()", +"758b31df": "premiumMod()", +"758b5172": "setPlayersPerRound(uint256)", +"758befae": "tokenPresaleCap()", +"758e08d0": "Authorization(address)", +"758ed826": "addDAppContract(address)", +"758f39b8": "verifyProofOfStake(address,bytes32,uint64,uint256,bytes32[],uint256[],uint256,uint256)", +"758fabcd": "MAX_CONTRIBUTION_SLOTS()", +"759014f0": "getChallenge()", +"7591dfa0": "dmlToken()", +"759234ec": "POLE()", +"759242fd": "WorldReserveCurrency()", +"75924b95": "changeWinConfig(uint8[],uint8[])", +"7592550b": "transferHomeViaRelay(address,uint256,uint256)", +"759343d4": "sendTo(address,bytes,uint256)", +"7593473c": "set_brain(address)", +"7593ca71": "setExchangeInterval(uint256)", +"75949c13": "sendHalf(address)", +"7596732f": "MorzeF()", +"759793c1": "buyInternal(uint256,address)", +"7597eede": "isHoliday(uint256)", +"7597fd6b": "escape(uint32,int256,uint32)", +"7599609d": "getEventForHousePlaceBet(uint256)", +"7599f8d9": "private_setRandomAPIURL(string)", +"759a2753": "StakeIncreased(string,address,uint256,uint256)", +"759b2ac4": "removeRole(uint256,address,uint256)", +"759bca86": "TEMWallet()", +"759c01dc": "SonDepTrai()", +"759c676d": "removeAddressToWhitelist(address)", +"759c7a58": "setAdOwner(uint256,address)", +"759e6558": "changelp9(address)", +"759f0914": "createObject(string)", +"759f8712": "nonActivationShortWithdrawal(address[2],uint256[8],uint8,bytes32[2])", +"75a0a7a4": "generateNumberWinnerQuery()", +"75a0ff93": "BTKToken()", +"75a2b407": "createPromoFighter(uint256,uint8,uint8,uint8,uint8,address)", +"75a35191": "Travelercoin()", +"75a374ee": "transferMined(address,uint256)", +"75a3eac0": "checkExistsOwnedAngel(uint64)", +"75a4894b": "setReaderId(bytes32,bytes32)", +"75a4e3a0": "unlock(bytes4)", +"75a4ea52": "updateCandidateAddr(address,address)", +"75a52506": "display(bytes32)", +"75a53a8f": "changeTrusteeOwner()", +"75a5425a": "DTesh()", +"75a55a44": "CR7()", +"75a5b1ab": "registerDuration()", +"75a5ba80": "delegateDklSiringAuction(uint256,uint256,bytes,uint256)", +"75a66774": "stampDocument(bytes32,uint256)", +"75a6a332": "testThrowRetractNotRetractable()", +"75a6dbda": "delAdminUsrs(address)", +"75a73ed3": "createMessage(bytes32)", +"75a747dc": "_mint(address,uint256,bytes32)", +"75a75ba9": "TRANSFERS_ALLOWED()", +"75a7db40": "existenceSymbol(address)", +"75a806cd": "transferLoss(uint256,address)", +"75a88bcf": "getPreClaimTimeStamp(address)", +"75a90144": "voterExists(address)", +"75a90e02": "readisnameregistered(string)", +"75a949a3": "transferBlocToUsers()", +"75a94af5": "JadetToken()", +"75aa39bd": "getTeamScore(uint256)", +"75aa8705": "begin(bytes32)", +"75ab9782": "tokensToSend(address,address,address,uint256,bytes,bytes)", +"75ac3b08": "presaleEndBlock()", +"75ace438": "setRdCollectorAddress(address)", +"75ad319a": "makeLiquid(address)", +"75ad31a0": "vesting1Withdrawn()", +"75ad4787": "_processRefund(address,uint256)", +"75ad97bb": "_initSpaceship()", +"75ada3d3": "getLicenseReimbursement()", +"75ae267d": "setCanTransfer(bool)", +"75ae51ce": "minForceOffsetAmount()", +"75aecd8d": "ContributionAdded(uint256,address,uint256)", +"75af370f": "ChainToken()", +"75af65d1": "discounts()", +"75b03941": "retrieveGains()", +"75b0d9cd": "totalSupplyOf(uint256)", +"75b1e894": "ProposalLog(uint256)", +"75b238fc": "ADMIN_ROLE()", +"75b3a83e": "START_ICO_TIMESTAMP()", +"75b3ea8e": "calculateExcessTokens(uint256,uint256,uint256,uint256)", +"75b3f9f5": "currentRateLevel()", +"75b44aea": "getEthRate()", +"75b466d1": "sendOrderedTokens()", +"75b4d78c": "bonus()", +"75b5243d": "editBasePrice(uint256)", +"75b599c0": "changeFashionAttr(uint256,uint16[4],uint16[4],uint16)", +"75b5ec08": "DcatNetwork()", +"75b65abf": "claim(uint16,uint16,uint16,uint16)", +"75b77c4b": "PRICE_MAX()", +"75b82a66": "distributeGameDividend()", +"75b88b82": "Beebit(bytes32)", +"75b8de15": "encodeInt(int256)", +"75b8fa6f": "contractMoneyBalance()", +"75b91305": "_removeDeposits(address,uint256)", +"75b94133": "validatorReward()", +"75b975b7": "askArbitrator(address,bytes32)", +"75b99fb1": "HonestisnetworkICObalances()", +"75b9b357": "updateData(uint256,string,string)", +"75b9c384": "UpdatePay()", +"75b9fd47": "BuyAcorns()", +"75bac6fd": "getLastDeedTimestampByAddress(string)", +"75bae755": "AariTestToken()", +"75bba189": "setModerator(address)", +"75bbc15d": "isNeedDrawGame(uint256)", +"75bbc204": "addJackpotGuaranteed(uint256)", +"75bc369a": "_triggerCoolCountDown(uint256)", +"75bcf09f": "getFibo(uint256)", +"75bd3237": "listingExists(bytes32)", +"75be5846": "unlockForever()", +"75bedf12": "valueOf(uint256,uint256)", +"75bf4777": "Presale(address,uint256,uint256)", +"75bfb140": "teamInstantSent()", +"75c0ae13": "getSalaryTokenAddress(address,address,uint256)", +"75c14f7d": "buyoutAndSetReferrer(uint256,bool,uint256,uint256,address)", +"75c1b643": "setconfig(uint256,uint256,uint256)", +"75c268f3": "rateFeesDenominator()", +"75c26c3f": "closeCrowdfund()", +"75c3039c": "finalizeCapReached()", +"75c304f7": "matchable(address)", +"75c34d94": "BitcoinElena()", +"75c48942": "restrictedVault()", +"75c4a4d6": "isClaimable(int8)", +"75c4aaa6": "addUnderDog(uint256)", +"75c4e9ec": "token_reward()", +"75c589a0": "getMinimumCallCost()", +"75c5efd8": "teamFundsAddress()", +"75c66e2f": "mintTokens(uint256,uint256,address)", +"75c69e39": "SOLUSCRSToken()", +"75c7d4e1": "sellMyTokensDaddy()", +"75c81ad0": "minProfit()", +"75c8a66e": "MANHATTANPROXY7THST()", +"75c8f04b": "addTenant(address)", +"75c9c4a4": "SQUIRREL_BASE_REQ()", +"75c9ee06": "teamFrozenTokens()", +"75c9f351": "maxTokenNum()", +"75ca1fad": "setcommissionPer(uint8)", +"75ca3b2e": "getKittyInfo(uint256)", +"75cb14bc": "panicOff()", +"75cb1bd1": "setWallets(address,address,address)", +"75cb2672": "configure(address)", +"75cbe239": "rulesProposals(uint256)", +"75cc21bd": "LogInvestshare(address,uint256)", +"75cc499f": "LogTokenPurchase(address,uint256,uint256)", +"75cc90b3": "ADMINS_COUNT()", +"75cd109a": "BurnSplit(uint256)", +"75cd51ed": "accountExists(address)", +"75ce2913": "pushOwnedToken(address,uint256)", +"75ce738e": "base_token()", +"75cf567a": "TOKEN_RATE_15_PERCENT_BONUS()", +"75cf77fb": "buyPoohs()", +"75d04628": "updateMatchStartTime(uint8,uint256)", +"75d049bb": "ApplyDividentsMultiplicator()", +"75d0c0dc": "contractName()", +"75d14478": "Chi_available()", +"75d16a1e": "JaxBox()", +"75d1722d": "_cancelOrderWithPayer(string,address)", +"75d2fd7f": "setERC20compatibility(bool)", +"75d32381": "Gave(uint256,address,address,uint256,uint256)", +"75d3bda6": "Product()", +"75d4066d": "getKeccak256(string,string)", +"75d4115e": "orderSubmitter(bytes32)", +"75d427e2": "greaterHash(bytes32,bytes32)", +"75d53a73": "approveMe(address)", +"75d57f44": "Benable()", +"75d5a7c6": "torchContractBalance()", +"75d60ba1": "PayToContract()", +"75d7036b": "getOuvidoriaEnteTipo(address)", +"75d7348a": "makeReferalBonus(uint256)", +"75d74f39": "get_s()", +"75d79399": "LogNotifyOfArbitrationRequest(bytes32,address)", +"75d7e4bd": "hydroTokenAddress()", +"75d7e8ea": "canTransferIfLocked(address,uint256)", +"75d9085a": "buyCardXname(uint256,string)", +"75d91db8": "cancelAuctionByMaster(uint256)", +"75d955f7": "realWorldPlayerMetadataForPlayerTokenId(uint32)", +"75d96718": "RELEASE()", +"75d9aa1a": "migrateFromLegacyReputationToken()", +"75da33bd": "tokpereth()", +"75dbc1aa": "LiquidHome()", +"75dc6471": "getSalesCity(uint256)", +"75dc7d8c": "calcFee(uint256)", +"75dcb701": "getBonusTierCount()", +"75dcb70a": "updateEditionTokenURI(uint256,string)", +"75dd3799": "NetWexCoin()", +"75dd82b8": "setPreMineAddress(address)", +"75ddbc4e": "setBalanceOfPendingToken(address,uint256)", +"75ddfa11": "ChannelBought(string,address,address)", +"75deadfa": "endTimes()", +"75df1fe8": "lockReleaseDate1year()", +"75df9fdb": "backVISTAcoinOwner()", +"75e01780": "startExchange()", +"75e0747e": "referrerBonus1()", +"75e2f405": "product1_luckybuyTracker()", +"75e2ff65": "setMigrationAgent(address)", +"75e3661e": "unblacklist(address)", +"75e372f2": "BlocklancerDataHolder()", +"75e3921c": "ETH_VTA()", +"75e39f26": "getHeroInfo(uint256)", +"75e3e4d4": "_sendTokens(address,address,uint256)", +"75e42744": "balanceOf(address,bytes32,address)", +"75e456c3": "validInvestment()", +"75e5598c": "ACTION_KEY()", +"75e6f675": "redemptionPercentageOfDistribution()", +"75e71d6d": "beneficiaryExists(address)", +"75e87642": "getRoundBetAmount(uint256,uint256)", +"75e88e3a": "getForceOffsetBooks(address)", +"75e8b1a3": "changeWithdrawnTime(uint256)", +"75e8f289": "depositWalletAddress()", +"75e8f757": "ERC20PreICO(address)", +"75e96908": "saveLifeEvent(string,string,string)", +"75e9c91f": "dropNectar(address[],uint256[])", +"75e9e3e2": "Ldt()", +"75ea1b68": "completeDeliverable(bytes32,address,address)", +"75ec899a": "addBodyParts(uint8[])", +"75ed5604": "referralLinkRequirement()", +"75ed8f89": "tOS(address)", +"75ee1908": "whitelistManyUsers(address[])", +"75ee549c": "seteUSD(address)", +"75ee7315": "IcoPaused()", +"75ee85bd": "salsa20_8(uint256,uint256)", +"75eeadc3": "hasWon(uint256)", +"75f0a874": "marketingWallet()", +"75f12b21": "stopped()", +"75f208bf": "testFailCreateWithParentNotInUse()", +"75f289bc": "setDiscountBonus(uint256)", +"75f2e45d": "charityPayed()", +"75f33ed6": "EtherReceival(address,uint256)", +"75f40f40": "underdogPayoutFund()", +"75f41f4a": "initExchangeUser(uint256)", +"75f45878": "scheduleCall(bytes,bytes,uint256)", +"75f46563": "setVLTMultiSig(address)", +"75f6641f": "GoldBackedToken(address)", +"75f7cc4a": "PeriodStarted(uint256,uint256,uint256,uint256,uint256,uint256)", +"75f7d866": "tokenReserved2Deposit()", +"75f7e6f0": "saneIt()", +"75f829a9": "BetAccepted(uint256,uint8,address,uint256,uint256)", +"75f890ab": "setContract(address)", +"75f91ec8": "getTokenAmount()", +"75f96ead": "Guess(uint256)", +"75f9ae86": "setCertificateSigner(address,bool)", +"75f9e6da": "initialIssueMintingDate()", +"75fa1bd3": "_reserveTokens(address,uint256)", +"75fc8e3c": "goodbye()", +"75fcc6f1": "OWN_burnToken(address,uint256)", +"75fd4c23": "test_basicUnitTest()", +"75fd776a": "STRATEGIC_PARTNERS_POOL_ALLOCATION()", +"75fda973": "tokenDistributeInDividend()", +"75fe06dd": "claimXmasGift(address)", +"75fe2cb8": "setDnaExist(uint64,bool)", +"75fe2e33": "getMonsterObjId(address,uint256)", +"75ff0664": "ERC223TokenMock(address,uint256)", +"76005c26": "fulfillData(uint256,bytes32)", +"76014a2d": "senderETH(address)", +"760163af": "getLastGames()", +"76017bbd": "getRewardWei(address)", +"7603ac4b": "registerFileClosing(string,uint256,string,string)", +"7603b02d": "houseCommission()", +"76041376": "devTeamAddress()", +"76045702": "AcceptsDividendFacial(address)", +"7604b6d7": "testGetBlobStoreFromFullBlobId()", +"76052df8": "setPurchasable(bool)", +"760672df": "weiToTokensAtTime(uint256,uint256)", +"7606f781": "getMetrics()", +"7607422a": "CSCS(address)", +"76098303": "futxMiner()", +"7609c5a9": "transferFromToICAP(address,string,uint256)", +"760a221c": "LOCK_RELASE_TIME()", +"760a45cf": "lockStrategy(address)", +"760a812c": "ChangedNeighbourReward(uint256)", +"760a8c2a": "setActive()", +"760ac21b": "testFailBadTransfer()", +"760b8f62": "bonusAll()", +"760bb006": "isUser(bytes32)", +"760c1fa3": "loadX(uint8[],uint256,uint256,int256)", +"760cd8e1": "transferAgent()", +"760cfa57": "GeneratedERC20Contract()", +"760df4fe": "_isCarousal(uint256)", +"760e2cf3": "buyUpgradeCard(address,uint256,uint256)", +"760eab1a": "ZodiacCore()", +"760ee49c": "setCurrentState(bool)", +"760f7382": "shipTokens(address,uint256)", +"76102b3c": "PRICE_PRESALE_WEEK3()", +"76105fe7": "tarifOf(address)", +"7611f50d": "periodStage()", +"7612115d": "setTokenPartner(address)", +"76124dac": "vote(bytes32,uint256,address)", +"76124db7": "Update_TrustlessTransaction(uint256)", +"761390b9": "BCX()", +"76147a0e": "notification(address,uint256)", +"7614e727": "baseMineTokenAmount()", +"761522af": "TradeBits()", +"76164085": "seek(int256,int256,bool)", +"76165adf": "buy(address,address,uint256,uint256,uint256)", +"76167a89": "getMessageSender()", +"7617f814": "sumPreICO3()", +"7617fbbd": "PreOrder(address,address,address,address,address,bytes32,uint256,uint256,uint256,uint256,uint256)", +"76190f8f": "isSiringClockAuction()", +"76192200": "finishMinting(address)", +"7619317b": "redemptionWallet()", +"76196c88": "setDnsrr(bytes32,bytes)", +"76197591": "finalizedICO()", +"7619d22e": "LEGAL_EXPENSES_2_TOKENS()", +"761a5b0e": "updateERC20rewardMultiple(uint8)", +"761a832f": "setBaseRewards(uint256,uint256)", +"761aef78": "BuyTicket()", +"761b59ac": "crabPartDataFromGene(uint256)", +"761ba894": "getPremiumMultiplier()", +"761bb70a": "train3(uint256,uint256)", +"761c1cf9": "SetupGWT(string,string,uint256,uint256,uint256,address,address,uint256)", +"761c3688": "remark2()", +"761c4524": "SHARE_TEAM()", +"761c7cfe": "resolveChallenge(uint256)", +"761d9e68": "getUserPolicy(address)", +"761dc416": "Megaton()", +"761e0d2d": "DEFAULT_MINING_BIT()", +"761e64c4": "setPI_edit_31(string)", +"761fe6fe": "totalAmountsBetStage1(uint256)", +"76207a5b": "getOrderInfo(bool,uint256,uint256)", +"7620a65b": "Publisher()", +"7620f4bb": "fipsNotaryLegacy68b4()", +"76227f3b": "burnAdminAmount(uint256)", +"76235b49": "getUUIDS(bytes32)", +"76247776": "getDirectory()", +"762506b6": "lrs(uint256)", +"7625391a": "distribute(uint256,uint256)", +"762549e0": "minThresholdUnits()", +"76266ce9": "logResources()", +"76271346": "_parent(uint8)", +"76278e7b": "limitDatePresale()", +"7627c9ad": "grantTransferRight(address)", +"7627e941": "validateOrder_(address[7],uint256[7],uint8,uint8,uint8,bytes,bytes,bytes,uint8,bytes32,bytes32)", +"76285b5b": "_is360thDay()", +"76289f71": "setMasterAddress2(address)", +"7628e728": "PRE_ICO_TILL()", +"7629cca0": "ContractDisabled()", +"762a4f35": "updateClosingTime(uint256)", +"762a66a2": "getAuction(address,uint256)", +"762ac19d": "startICOPhaseOne()", +"762c38fd": "askQuestion(uint256,string,address,uint32,uint32,uint256)", +"762c7ab2": "setPercentForHelpCoin(uint256)", +"762ced87": "prcntRate()", +"762d739a": "vigencia()", +"762e3816": "TOURNAMENT_WALLET()", +"762ede1e": "ETHCONEarlyBirdToken()", +"762fdc0c": "getRatePlan(uint256,uint256)", +"762ffc42": "VanityReserved(address,string)", +"76305a89": "CoinCrowdICO(address,uint256,uint256)", +"763091ff": "initCreator(uint256)", +"76309e70": "CTT()", +"7630ad34": "getInfoD(uint256)", +"76319190": "removeSupportedToken(address)", +"76323253": "createRounds(uint256)", +"76324597": "dropStart()", +"763250e1": "GizerToken()", +"763265de": "setMaxCap(uint256)", +"7632b18b": "WICCrowdsale(address,uint256,uint256,uint256,address,address)", +"76338028": "functionCalls(bytes32)", +"763430b8": "mFUNDING_SALE_TIMESTAMP()", +"7634d45d": "titlesSold(address)", +"7634ecc0": "debitEqually(address[],uint256)", +"7634ed39": "saveNewAnchor(bytes32)", +"763542ce": "BucketBuy(bytes32,uint256,address,uint256)", +"7635761b": "getusersCount()", +"7635e1de": "changeTokenManager(address)", +"7635e409": "createZombie(uint8,bytes32,uint16,bool,address)", +"763730bd": "whitelistAddresses(address[],uint256,bool)", +"76375c5c": "splitterContract(address,uint256)", +"763770d2": "getTokensManual(address,address)", +"7637a12e": "GoldmintMigration(address,address)", +"7637da03": "MINER_STARTING_PRICE()", +"76385f2a": "PeriodOfAccount(address,uint256)", +"76389260": "EthlanceSearchFreelancers(address)", +"76390144": "getCorrectedStats(uint256)", +"76399bc6": "getFoundtionAddres()", +"763a6390": "setWeightLostPartLimit(uint8)", +"763a666a": "withdrawLiquidityPoolTokens(address,uint256)", +"763a738c": "allNames()", +"763ac589": "createStake(address,address,uint256,uint256,bytes)", +"763add8f": "KPCS(address)", +"763b144e": "EmpireCrowdsale(uint256,uint256,address,uint256,uint256,uint256)", +"763cbde0": "_addPassportLogic(string,address)", +"763cf9aa": "feed100(uint256)", +"763d2500": "getTotalNbOwners(uint256)", +"763e29ad": "CherishToken()", +"763f337e": "setAllowReferral(bool)", +"763f4011": "mintMarketing(address,uint256)", +"763fd2ab": "TOTAL_PRESALE_TOKENS()", +"763ffcec": "setupDisbursement(address,uint256,uint256)", +"7640304d": "_lastSnapshotId(address)", +"76405122": "buyImplementation(address,bytes32,uint256,uint8,bytes32,bytes32)", +"76418809": "private_withdrawBankFunds(address)", +"7641a8c6": "SetFinalBlock(uint256)", +"7641e6f3": "burn(uint256,string)", +"76421887": "OWNER_LOCK_BLOCKS()", +"7642249c": "mintadd()", +"76429844": "MultiSendToken()", +"7642dc0f": "calcVesting(address)", +"764300bf": "ALLOC_MARKETING()", +"764358e6": "logSweep(address,address,uint256)", +"764423a4": "buyerAddressTransfer(uint256,address,address,address)", +"764499e5": "GamePlayed(bytes32,bytes32)", +"7644d361": "hashMessage(string,string,string,uint16,string)", +"7644ecbf": "BallotO(address[],uint256[])", +"76456887": "startSecondPhase()", +"76466d42": "setAllowedContract(address,address)", +"7648c929": "returnRemainingEther()", +"7648f99b": "ProposalSubmitted(uint256,uint256,address,uint256,uint256,string,address,uint256,uint256)", +"764912ef": "totalTokenCount()", +"76495ce7": "tokensFor1EthP4()", +"76496e34": "earlyCommunitySupply()", +"764ab11b": "WalletV2(address,address)", +"764b08c3": "STATS_SIZE()", +"764c499b": "contract_terminated()", +"764c6dd3": "voteToFreeze(address)", +"764c86bd": "totalDistanceRun()", +"764c8e54": "depositBoth(uint256)", +"764c92f2": "trustedOrderTransfer(address,address,uint256)", +"764c98c1": "getIntArrayDynamic()", +"764c9d32": "sleepContract()", +"764d1e04": "getFreelancerParams()", +"764d9969": "XubiToken()", +"764e50eb": "priceUpdated(uint256,uint256,string)", +"764e5cd9": "getSkills(address,uint256)", +"764e971f": "add(uint256,bytes32)", +"764ea3fe": "walletEhterCrowdsale()", +"764f3aa8": "getTokenBalances(address)", +"764fe7d1": "totalMiners()", +"76520713": "setLock(string,bool)", +"7652ce3b": "getRoot(uint64,bytes)", +"7653740f": "addCbAddress(address,bytes1,bytes)", +"765388ae": "createCrab(uint256,uint256,uint256,uint256,bool)", +"7653d31c": "_clearQueue()", +"7653f795": "CarTaxiIco(address,address)", +"7655e825": "unsafeWriteUint8(uint256,uint8)", +"765718d7": "register(uint256,bytes)", +"76577eae": "distributeEarnings()", +"76586bcb": "doWithdrawal(address,uint256)", +"76587847": "buyDepots(uint256)", +"76587921": "transferFromWithNarrative(address,address,uint256,string)", +"7658c574": "setQuantityFactor(uint256)", +"7658d5ef": "totalICO()", +"76596a1a": "hasTeamMember(address)", +"7659de23": "snapshotBlockHeight()", +"7659fd71": "BitcoinProtocol()", +"765aa39e": "startMulti()", +"765af8bf": "getNumArtworksXType()", +"765b1766": "tryFinishInterface(address)", +"765b59d2": "getStatus(uint256,address,address)", +"765b8dee": "transferStep2(address)", +"765bfac6": "setEscuela(uint256)", +"765c9c7f": "bionic()", +"765dd7a0": "addTeamAddress(address)", +"765e0159": "getNext(address)", +"765f09f2": "GetCurrencyInformation(uint256)", +"7660473a": "EconomyTaxed(string,string,string,string,string)", +"7661129e": "updatePromoEthCommission(uint256)", +"76617156": "burnAmountAllowed(address)", +"7662850d": "init(uint256,uint256,uint256,uint256)", +"7662c9a7": "GetAskSeries(address)", +"7663265c": "_setGameSettings()", +"7663680e": "setTotalBurntCoins(uint256)", +"76636e73": "PREICO_BONUS()", +"76637dcd": "WhoIsTheContractMaster()", +"7663f171": "getCardIndexOfOwner(address,address)", +"7663f228": "testBurnThis()", +"7663f822": "exists(address,address)", +"76640648": "payforRefund()", +"7665f6a7": "setTransferOwnership(bool)", +"7666ee8f": "addCustomerToRegistry(address)", +"76671808": "currentEpoch()", +"766719f0": "optInXferGas()", +"766954b4": "hashString(string)", +"7669c0c4": "showPhaseCount()", +"766a3f2e": "Security_ConnectBankAccountToNewOwnerAddress(uint32,string)", +"766a5f09": "setSalesPool(address)", +"766b0823": "addWhiteBackersByList(address[])", +"766b1818": "PYCToken()", +"766bd930": "Duanwu()", +"766d30aa": "setDefaultRecommAddr(address)", +"766d5235": "isOpening()", +"766d8365": "resetRoundStartTime(uint256)", +"766e33f4": "releaseStart()", +"766e4f2c": "issueTokensToUser(address,uint256)", +"766e866c": "setMaxGasRefund(uint256)", +"766e8b27": "tokensaleTokensPerEtherNow()", +"76703ef1": "AVIU()", +"767180d0": "impl_purchase(address,bool,bool)", +"767392b3": "equal(bool,bool,string)", +"7673faf0": "wallet4()", +"76740de0": "isPlayer()", +"767418b0": "alterBalance(uint256)", +"76745dbb": "increaseTotalStake(uint256)", +"76748f2a": "default_price()", +"7674cee3": "paymentMin()", +"76753b04": "ledgerUserBetContribution(address)", +"76775c10": "addReferrer(address,uint256)", +"76779829": "randomC()", +"767800de": "addr()", +"7678369a": "dayfund(address)", +"7678473d": "BTCDOGE(uint256)", +"7678f8bb": "getBid(int256)", +"76792ad9": "setDaily()", +"76793f47": "kwhFund()", +"7679a816": "handleFund()", +"767a11ca": "verifiedAttributes(address)", +"767a99ee": "legalContract()", +"767b6190": "constructor(uint256)", +"767b79ed": "register(string,uint8)", +"767bc136": "cards_titanium_total()", +"767bcab5": "setRandomizer(address)", +"767c732e": "enterBidForCollectible(uint256,uint256,int256)", +"767c9d18": "getMigrateInAttoTokensValue()", +"767d65ba": "ASEChain()", +"767eb651": "getRemainingAmount(address,address)", +"767eb8ad": "isValidName(bytes16)", +"767f0215": "MAIN_SALE_BONUS_PERCENTAGE_PHASE3()", +"767f61ac": "putTitle(bytes32,string,bytes32,bytes32,bool,string)", +"767f7b01": "User(string,address)", +"767fa723": "getPresaleInfo()", +"767fb1c4": "RecoverableController(address,address,uint256,uint256)", +"76809973": "BeneficiaryChanged(address,address)", +"76809ce3": "decimal()", +"76814692": "BusToken()", +"76823637": "startNewTurn()", +"768255ca": "TokitRegistry(address)", +"7682e6ff": "getTrustSetting(address)", +"768356c1": "TUI_ADDRESS()", +"768433c2": "topFab()", +"76849376": "addNode(bytes32,address)", +"768549aa": "KpopItem()", +"76855764": "enableSudo(bool)", +"76858faf": "ViralToken()", +"7685e1df": "NPTToken(address)", +"7686136a": "updateCourseRate(address,uint256)", +"76865eea": "unHalt()", +"7686cea9": "etap()", +"76884153": "AirTransfer(address[],uint256,address)", +"76888a3e": "TheTokenF()", +"76890c58": "transferOut(address,uint256)", +"76894bd9": "tokensToEthereum(uint256,uint256)", +"76897b90": "setReserved(uint8,uint8)", +"768a3326": "myxTest()", +"768a3a7d": "GetSender()", +"768aa331": "addHpbNodeBatch(address[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[])", +"768afcec": "buyKeys(uint256,string,string)", +"768b4ce0": "updateWorldScore(uint256,uint256)", +"768bd5cd": "THULYA()", +"768c326d": "validatePhaseDates(uint256,uint256)", +"768c9af4": "Approval(address,address,bytes32,bool)", +"768e7220": "ownerLockedBalance()", +"768f930d": "checkSignersByAddress(bytes32,uint256,uint256,uint256)", +"76907bc7": "setCoinBalance(address,uint256)", +"7690bee4": "NextGenHyip()", +"7690ed70": "_changeLockDate(uint256)", +"7691471c": "PRE_SALE_TOKEN_CAP()", +"76917b68": "updateMC(uint256)", +"76918f5d": "setAdPriceMultiple(uint256)", +"76922f78": "auctusPreSaleAddress()", +"7692ac94": "createEtherMonster(uint256,uint256,uint256)", +"7692ba9a": "claimOwnership(string,string,uint256,uint256)", +"7692c4d8": "testCantFinalizeNotEndedSale()", +"7693488b": "finalizeTokenSale()", +"76937a3f": "airDropCustom(address[],uint256[])", +"7694df16": "scaledRemainder()", +"76959b6a": "hasSDC(address,address,uint256)", +"7695be1d": "DaleOR()", +"7695d79b": "nftTokenCount()", +"769643bc": "reclaimTokenOwnership()", +"76965867": "getStakedBalance()", +"7696c042": "secondsPerMonth()", +"7696cf52": "bonusFirstWeekPeriod()", +"7696f0db": "frozenCellCount(address)", +"769794dd": "TildeCoin()", +"769796fe": "resetAction(uint256)", +"7698da24": "affirmationsSigned(bytes32)", +"76992d7c": "SettingsChanged(uint256,uint256,uint8,uint8,uint8,uint8,bool)", +"769988b3": "p_update_mEmpireScoreMultiplier(uint256)", +"76999896": "KingOfTheEtherThrone()", +"769af180": "EGGS_TO_HATCH_1BAT()", +"769bf742": "unregisterRecord(bytes32)", +"769c9226": "setLockAll(bool)", +"769db61d": "addNewCard(uint256)", +"769dc523": "GetCategoryNumber(bytes4)", +"769e86cd": "getMyAccountBalance()", +"769edf6a": "createHash(uint256,address)", +"769f194f": "FOUNDERS_TOKENS_VESTED_2()", +"769ffb7d": "setDirectMintAgent(address)", +"76a04af5": "CompensateChips(address,uint32[])", +"76a133ca": "KabirTestToken2()", +"76a24f25": "originalPrice()", +"76a25c5c": "calculateReward(uint256,uint256,uint8)", +"76a310a5": "addAuction(uint32,uint256,uint256,uint8,uint32)", +"76a327fc": "hitMobster(uint256,uint256)", +"76a3f9c9": "addToWinningsArray(uint256,address)", +"76a43abc": "_createPony(uint256,uint256,uint256,uint256,address,uint16)", +"76a4a44d": "AssignGGEPoolOwner(address)", +"76a54c60": "sendEth(address)", +"76a5b431": "removeTip(address,bytes32)", +"76a5b5b9": "LogTransfer(address,address,uint256,bytes)", +"76a64cbf": "BasicToken(string,string,uint256,uint256)", +"76a6676a": "IssuerTransferred(uint256,address)", +"76a67a51": "pause(address)", +"76a684de": "denyAllowanceProxyAccess(address)", +"76a6bf52": "isExecuted(uint256)", +"76a766f7": "Dashgold()", +"76a85d54": "setExchangePrice(int256)", +"76a8bc10": "setExpiry(address,uint256)", +"76aa2f74": "increaseJackpot()", +"76aad651": "paymentSupply()", +"76ab5ea6": "changeDifficultyAndPrice(uint256,uint256)", +"76aba714": "refundMany(uint256,uint256)", +"76abc03b": "getShareDistribution(uint256)", +"76ac2323": "WinkSale(uint256,uint256,uint256,address)", +"76acb5e8": "BuyTicket(uint256)", +"76acb968": "TESTTOKEN1()", +"76ad3abf": "unregisterTraderAccount(address)", +"76ae684d": "setSaleOngoing(bool)", +"76aed2e1": "getTokenType(uint256)", +"76aef5e0": "doubleSend(uint256,address)", +"76af7837": "Loss(address,uint8,uint256)", +"76af9a1a": "balancePreSale4()", +"76b07186": "isPass(address)", +"76b088a9": "check_lock(address,address)", +"76b1514f": "getMaxFreeTeams()", +"76b15836": "changeStatusModerator(address,bool)", +"76b18618": "changeUnitsOneEthCanBuy(uint256)", +"76b1f3d3": "grantAccessToAddress(address)", +"76b3131e": "createvillage()", +"76b33367": "refundsIssued()", +"76b34d2f": "changeCrowdsale(bool)", +"76b39cf9": "activateInTestMode()", +"76b3c8a8": "getLotteryInfo(uint256)", +"76b547b8": "AthaYOGAToken(address,address)", +"76b5d926": "unreserve(uint256)", +"76b63576": "mintFounderTokens()", +"76b69d77": "apiRegistryContractAddress()", +"76b707b7": "getRelease()", +"76b95761": "setVestingStartDateTime(uint256)", +"76ba242c": "bonusTokens()", +"76ba6009": "approveRequest(bytes32)", +"76babef7": "Puzzled(address,bytes32,bytes32)", +"76bc21d9": "fireEventLog2Anonym()", +"76bc522c": "getZIndex(uint16)", +"76bd28bf": "ORNETCOIN()", +"76bd4220": "depositBank()", +"76bd4d2d": "submitProblem(uint256)", +"76bd5f3c": "changeMintedCappedIdx(address)", +"76be0b89": "HIROTOKEN()", +"76be166c": "toAsciiString()", +"76be6c24": "mintLVE(address,uint256,uint256)", +"76bef6b4": "getOneByOneRootHash(uint256)", +"76bf2392": "getCurrentDisplacement()", +"76bf8044": "pledge(bytes32)", +"76bf9f57": "wildcardCount()", +"76bfa5f6": "ProvideSale(address,address)", +"76bfba0e": "splitPay(address[],uint256)", +"76bfba56": "depositForDividend(uint256)", +"76c158cf": "minBankerEther()", +"76c2c0aa": "oresLeft()", +"76c2c296": "SYSTEM_CREATION_LIMIT()", +"76c2f9e7": "HitToken(string,string,uint8,uint256,address,address,address,address)", +"76c30794": "mint0(address,uint256)", +"76c390fe": "Display()", +"76c3b445": "calculateTotalTokenPerContribution(uint256)", +"76c44a80": "openIEOStarted()", +"76c46a70": "changeUnitUserBalanceLimit(uint256)", +"76c535ae": "isExpert(address)", +"76c6c685": "assertItDoesntThrow(string)", +"76c6dc8b": "isPosBitOne(uint256,uint256)", +"76c6fc9a": "checkOwnerShare(address)", +"76c70431": "CRCToken()", +"76c75958": "startCrowdsale(uint256,uint256,uint256,address)", +"76c7a3c7": "MIN_FEE()", +"76c7b434": "developersCut()", +"76c7fc55": "removeBorrower(address)", +"76c82e92": "minAcceptedAmountPresale()", +"76c87548": "scoreBracket(address)", +"76ca0225": "initTwo(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"76ca0c77": "scheduleCall(address,bytes,uint256,bytes,uint256)", +"76ca9e48": "indexPaidBonus()", +"76cb69e9": "KOIN(uint256,string,uint8,string)", +"76cb6f9b": "removeOffChainAddress(address,address)", +"76cba420": "stcOrginalBuy(uint256)", +"76cc1c5c": "landManagement()", +"76ccb1fe": "getSpinOutput(uint256,address,uint256)", +"76cce072": "setBlance(address,address,uint256)", +"76ccf063": "calSimpleRoom(uint256,uint256,uint256,bytes32)", +"76cd005d": "distillGodOwner()", +"76cd470c": "getCurrentAccountingPeriodId()", +"76cd7cbc": "sign(bytes)", +"76cd940e": "currentBatch()", +"76cdb03b": "bank()", +"76cfc366": "depositOffchain(address,uint256,uint256,bytes)", +"76d06add": "issueTokensWithCustomBonus(address,uint256,uint256,uint256)", +"76d0998f": "Odin2(address)", +"76d173a9": "addressAndBalance(address)", +"76d1d35e": "numberOwners()", +"76d260bb": "setInitialVaribles(address,address)", +"76d2d717": "GetFreeTokens()", +"76d33951": "bid(string,address)", +"76d380cb": "IrisTokenPrivatSale()", +"76d438b0": "sendReward(uint256,uint256)", +"76d47bf5": "unlockAddress(address,address)", +"76d57aad": "amountInLock(address,uint256)", +"76d57ad3": "getMixerInfo(bytes32,uint256)", +"76d60a91": "TokensMinted(address,uint256,uint8)", +"76d66f5d": "_Transfer(address,address,bytes32)", +"76d690bb": "BountyList()", +"76d6c296": "getPresale1()", +"76d6da67": "TokenMintingEnabled(address,bool)", +"76d738d9": "DAZToken()", +"76d75952": "getLabelType()", +"76d76b9d": "marketRegisterCost()", +"76d83cb3": "getTerminalCount()", +"76d865dd": "addAdminOwners(address,string,string)", +"76d8f03e": "getBonusCount()", +"76d92428": "setGatekeeperAddress(address)", +"76da5667": "admin_kill()", +"76dad223": "showNumber()", +"76db2e84": "setMinimumEtherAmount(uint256)", +"76db6c8d": "isRedeemable(address)", +"76db76f1": "clearNextPrizeTime()", +"76db7fd4": "setExchangeFlag(bool)", +"76db9b14": "CXTCContract()", +"76dbd108": "calculateProof(string)", +"76dc4c0a": "isFundRequestToken()", +"76dc6643": "threeHotHoursCapInWei()", +"76dc74cb": "sendHoldComisions()", +"76dc76e7": "getUserNumbersOnToken(address,uint256)", +"76dc97d9": "_saveMessage(uint256,uint256,address,string)", +"76dd1f86": "totalMintLimit()", +"76ddfc39": "MIN_HARD_CAP()", +"76de03d0": "weiTotalRefunded()", +"76de1684": "generateOrderByMerchantWithPayee(address,address,uint256,string,string,string)", +"76dffa4e": "MedCann()", +"76e00ed7": "_fromNanoNIL(uint256)", +"76e0f978": "navAdmin()", +"76e20e53": "getMyBets(uint256)", +"76e277c1": "ChickenFarm()", +"76e29114": "nfsPoolCount()", +"76e2bbc7": "paymentInternal(bytes32,uint256[])", +"76e403ec": "balancesLocked1Y(address)", +"76e40c9c": "lendEther()", +"76e44ed8": "lockAll()", +"76e4660c": "getSumAmountOfDisputedStepsProPatient()", +"76e4ca0d": "voteQuorum(uint256,bool)", +"76e4f921": "parachute()", +"76e51e96": "TokenModuleManager()", +"76e53221": "participationCaps(address)", +"76e55338": "mytest()", +"76e57d4b": "withdrawalAddressFixed()", +"76e5c0ca": "WineryOperations()", +"76e608c7": "buyExistFactory(uint256)", +"76e6d2b4": "unLock(address)", +"76e6dbc7": "tokenBaseRate()", +"76e702ee": "tokenDeliveryDue()", +"76e71dd8": "delegateTotalSupply()", +"76e7430e": "finally(address)", +"76e75e05": "getPurchaseRecord(address)", +"76e7b151": "GOFCoin(uint256)", +"76e83bcb": "listModule(uint256,bytes32,bytes32,string,bytes4)", +"76e92559": "totalMembers()", +"76e93db5": "totalMaxBuy()", +"76e9d4fb": "Hybrid(uint256,string,uint8,string)", +"76ea1c6a": "BuyOnSecondaryMarket(uint32)", +"76ea430a": "STAGE1_TIME_END()", +"76ea909d": "indSale()", +"76eaef99": "CatOffered(uint256,uint256,address)", +"76eb5ce0": "END_PREICO_TIMESTAMP()", +"76ec477d": "cancelGame(uint256,string,uint256)", +"76edb1b5": "ReleaseUpdate(uint256,uint256,uint256,string)", +"76edc29d": "TelegramOpenNetwork()", +"76ee2d68": "lokedMint(address,uint256,uint256)", +"76ee3a87": "mainICOStartTime()", +"76ef5d14": "divX(uint256)", +"76f10ad0": "getSnapshot(uint256)", +"76f14c98": "personalizeSquare(uint256,bytes,string,string)", +"76f187ab": "tokensTransferredToHold()", +"76f1dbd4": "Authenticate(address)", +"76f28a4f": "setMarket1(address)", +"76f2a59a": "instantMint(address,uint256)", +"76f2a94b": "acceptWithdrawals(uint256[],uint256[],uint256[])", +"76f30ca1": "toContentID(address,uint256,string,bytes)", +"76f31513": "decreseApproval(address,uint256)", +"76f3264b": "getProviderSupply(uint256,uint256)", +"76f36dec": "ETHC(uint256,string,uint8,string)", +"76f39b28": "SetMaxAllowedBetInTokens(uint256)", +"76f4d8ad": "exchangePlayerTokenCount()", +"76f6218a": "promoBonus()", +"76f660f6": "batchTransferFrom(address,address[],uint256)", +"76f6de69": "RTCCOINERC20(uint256,string,string)", +"76f70900": "oraclesCount()", +"76f75e7f": "orderList(uint256)", +"76f7c522": "hasOneStepWithdraw()", +"76f86e18": "order_buy(address,uint256)", +"76f88781": "pow2Constant()", +"76f9378d": "getWords(uint256)", +"76f95818": "stopFlagOn()", +"76f9b8d9": "getTokenInfoSignatures()", +"76f9e018": "greedIsGood(address,uint256)", +"76f9fd38": "castVote(string,uint16)", +"76fb7c72": "setAllowedAgentsForOtherSource(address,bool)", +"76fc53c0": "extDistributeBondFund()", +"76fd7951": "MacoTestCoin()", +"76fd7b11": "requestWeiPrice(string)", +"76fe192a": "forceResetPeriod()", +"76fe3efa": "itemNameAddress(uint256)", +"76fe47eb": "returnBooleanInverted(bool)", +"76fe8228": "getHorseSex(uint256)", +"76fede7a": "get_term_deposit_end_date(address)", +"76fee774": "getNewPetCard(uint8)", +"76fee8e0": "MineBlocksAddr()", +"76ff1d24": "MailhustleCrowdsale()", +"76ff87cc": "VYRAL_REWARDS()", +"76ffb887": "failure()", +"77002fcf": "getBadge(bytes32)", +"77009c5c": "EYCryptoTradingGOLD()", +"7701c52d": "withdrawMarginPreSignedHashing(address,address,uint256,uint256,uint256,uint256)", +"7701f361": "test_newProposalAndNotEnoughVotes()", +"7702b8e4": "confirmOneSell()", +"770342ee": "ChannelClosed(address,uint256)", +"7704533d": "arbitrationWallet()", +"77049457": "median()", +"770506c1": "withdrawMobileAppCoin(address)", +"7705b6f4": "claimBoard(uint256[81])", +"7706390b": "handover(uint256,address)", +"77073437": "alicoinToken()", +"77076855": "isInOpenMakeOrder(address)", +"77079f55": "YohoToken()", +"7707c69a": "set_sale_owner(address,address,bool)", +"7707e2b2": "withdrawHoldVault(uint256)", +"770850c8": "accountIndexOf(address)", +"770864ad": "addOpenMakeOrder(address,address,uint256)", +"77086d94": "addSpaces(uint256[],uint256[],bytes)", +"7708b441": "founderWithdrawablePhase2()", +"7708e321": "setaddress(address,address)", +"7708e43b": "getNumBets(uint256)", +"7708ea1d": "ROLE_CEO()", +"77097bfa": "testerReentrant()", +"77097fc8": "mint(uint256,string)", +"7709bc78": "contractExists(address)", +"7709c0d3": "setMaxWhitelists(uint256)", +"770a4265": "updatePrizeDist(uint8,uint8,uint8,uint8,uint8)", +"770ae2af": "setMinAllowedBetInEth(uint256)", +"770b210e": "canBuyLimit()", +"770b5414": "getCurrentData()", +"770b80b6": "returnBalanseToTarget()", +"770b8aab": "RecoveryModeActivated()", +"770bb9ae": "_createDrawings(bytes32,bytes32,address,string)", +"770c59b8": "purchaseParrot(uint256)", +"770c6bde": "removeItemLendingList(address,uint256)", +"770c6cbb": "WithDrawPreForkChildDAO()", +"770cde1b": "ContractExample(string)", +"770d64c6": "LogLate(address,uint256,uint256)", +"770d6591": "_setArmorValue8(uint256)", +"770d8e79": "ADDR_TKG_TEAM()", +"770e3106": "getAccountsCount()", +"770e9e85": "takeTheTorch(address)", +"770eaebe": "Send_Data(address,uint16)", +"770eb5bb": "set_label(bytes12,bytes32)", +"770f75b7": "fireCancelProposalEvent(address,uint256)", +"770f9feb": "clyckterium()", +"770fe154": "ApplyVote()", +"77109b05": "depositEther(address[2],uint256[7],uint8,bytes32[2])", +"7710f29f": "setupPeriodForICO(uint256,uint256)", +"77115c9d": "seedRoundEndTime()", +"771282f6": "currentSupply()", +"77129790": "Crowdsale(address,address,uint256,uint256,uint256)", +"7712acd2": "getABname(uint256)", +"7712c870": "slammerTime()", +"7713b431": "getContactsLength()", +"7713ba04": "setPI_edit_11(string)", +"77146255": "_nextTokenId(uint256)", +"771548e2": "moveAccount(bytes32,bytes32)", +"771602f7": "add(uint256,uint256)", +"77169fbd": "gainsOfVault(uint256,address)", +"7717403b": "ALLOC_CROWDSALE()", +"7718238f": "addFee(address,uint256)", +"7718ce93": "player5()", +"7719f57e": "Seedex420(uint256,string,uint8,string)", +"771a2af4": "getCitationRecordsLength(string)", +"771a3a1d": "taxRate()", +"771acf31": "fluffyCatCut()", +"771ad078": "BuyGenesis(address,address)", +"771ad635": "getContentCred(address,uint256)", +"771c04ae": "ARCToken(address,uint256,uint256)", +"771c288b": "next_stone_id()", +"771c3ec7": "setVendingAttachedState(uint256,uint256)", +"771c7ad1": "hotwalletAddress()", +"771cbe3d": "_mintCard(uint8,address)", +"771ce552": "readownerXname(string)", +"771d7b47": "finishedMigration()", +"771d9d05": "ecosystemAllocated()", +"771e4326": "wingsETHRewards()", +"771eee16": "freezeToken(bool)", +"771feb74": "getPrecious(uint256)", +"771ff086": "allocatenonCSTokens(address,uint256)", +"7720295a": "STARTING_CLAIM_PRICE_WEI()", +"7720e74c": "changeSaleEnd(uint256,uint256)", +"77215c8d": "getObserverCount()", +"772199a1": "getJob(address,uint256)", +"77226237": "isCompetitionAllowed(address)", +"77228659": "query2(uint256,string,string,string)", +"7722d01f": "TokenChanger(address,address)", +"77231e6c": "tokens_sold()", +"77233e90": "setTo(address)", +"7723e2f3": "ArtToken()", +"77241a5f": "makerDaoContract()", +"77248e3d": "claimReservedTokens()", +"7724bdbf": "setStatusInternal(address,uint8)", +"772506bb": "jackpotFraction()", +"77253984": "DPToken(uint256,string,string)", +"7725686f": "thawGlobalTransfers()", +"7726a59a": "WINNER_COUNTRY_CODE()", +"7726bed3": "setEnable(bool)", +"7727c9ad": "changeMinStake(bytes32,uint256)", +"77282b70": "polymathRegistry()", +"7728579a": "isIcoFinalized()", +"77287520": "donate(string,address,string,int256)", +"77289b50": "setMedium(uint8)", +"7728c75a": "LoanRepaid(address,address,uint256,string)", +"7728f48b": "destroyRobot(uint256)", +"772a3835": "customerExchangeFiat(uint256,address,string)", +"772b7a73": "getTxOrigMcwTransfer(bytes32)", +"772bcc79": "DexAgeTest()", +"772c1863": "increaseStellarBalance(uint256)", +"772c658b": "getVIPBounusRate(address)", +"772cb26b": "isStringEq(string,string)", +"772ce10b": "setFuelDestination(address)", +"772e1c6f": "getTrustValue(uint256)", +"772e6f03": "votingProposal(string,bytes32,uint256)", +"772fdcb1": "isContributorInLists(address)", +"77300338": "setActiveTimes(uint256[],uint256[])", +"773041ce": "setInvestor(address)", +"77312cdc": "setMultiETH(address[],uint256[])", +"773183e3": "buyEmptyLocation(uint256)", +"7731cd2a": "Acc(address)", +"7732b2a4": "getNextCrystalReward(address)", +"7732b322": "PinMoCrown()", +"773355bf": "script(bytes)", +"77337d37": "tstart()", +"7733f24f": "ratePreSaleStage()", +"77343408": "setURL(string)", +"7734da3c": "NewPassContractor(address,address,address,address)", +"7734e398": "setFirstBonus(uint256)", +"773531f3": "tokenOwnerBurner()", +"77364291": "taskInfo(uint256)", +"773721b3": "receivedCWCreturn(address,uint256)", +"77372213": "setName(bytes32,string)", +"77381082": "Virtonomi()", +"77390f8b": "_envelopes(string,address)", +"773984dd": "closeIt()", +"7739ad70": "markAsScam(address)", +"773a1154": "generateRandomNumber()", +"773a8597": "HashTokenAward(uint256,string,string)", +"773adc70": "getAllowedStepAmount()", +"773b5b5e": "maxUpdates()", +"773b82a3": "addPerson(bytes32,bytes32,uint256)", +"773b90db": "_lotteryCardNoSend(uint256)", +"773c3f50": "DPPToken()", +"773c5049": "solvency()", +"773c84ee": "exec(address,bytes,uint256,uint256)", +"773d33f5": "transferAndCallback(address,uint256,bytes)", +"773da57d": "DGZTokensWithdraw(address,uint256)", +"773dcb98": "startTransfers()", +"773dfb86": "_extendRound()", +"773e04a9": "log2Ceiling(int256)", +"773e1e84": "fight(uint32,uint16)", +"773e236b": "createLockbox(string,address,uint256,uint256,string,string,string,address[],string)", +"773e8b0f": "testDAO()", +"773ee5a3": "execute_transfer()", +"773eef36": "stopRefund()", +"773ef1cf": "saleOn()", +"773ef38e": "PRICE_RATE_SECOND()", +"773f4873": "Ecopay()", +"773f5edc": "guess(uint256,string)", +"773f7665": "processVIPBenefit(address,uint256)", +"773ff502": "LogMake(bytes32,bytes32,address,address,address,uint128,uint128,uint64)", +"7740f667": "mtStartTime()", +"77410c03": "adminLockdown()", +"774120fa": "merge(address)", +"77413267": "getAuctionByTokenId(uint256)", +"774190dd": "showUserPoolAddresses(address)", +"7741ad4e": "play_game(uint8)", +"7741b4ec": "RandomNumberFromSeed(uint256)", +"7741fc52": "LottoCount()", +"7742ede4": "IMARK()", +"77439e8b": "doYourThing(address,address)", +"77446767": "destinationOf(uint256,uint256)", +"77453df7": "Ex()", +"7745d3b1": "getUsername(address,address)", +"7746167f": "transferBlockValueToBattleValue(uint16,uint256)", +"77463b50": "getEggsToHatchDragon()", +"77467197": "tokensVested()", +"774685c7": "CPO_SHARE()", +"77469275": "getLegacyRepToken()", +"77472b6f": "minEtherCap()", +"7747c993": "competition(uint256)", +"77482b18": "getDeveloperFee()", +"7748b07e": "usersNTD(address)", +"7749d667": "getIncreaseTime(uint256)", +"7749e693": "setCategory(uint256,uint256,bytes32)", +"774a63a5": "CDSToken()", +"774a97cf": "getCurrentTapAmount()", +"774b71d6": "TokenPriceProposalSet(uint256,uint256,uint256)", +"774bafdf": "unlockMe()", +"774dba58": "playHome()", +"774e88dc": "hasUnlockDatePassed()", +"774eb322": "close(string,bytes32,uint8,bytes32,bytes32)", +"774ec644": "setUserPrice(uint256)", +"774f787a": "ShitsToken()", +"77507425": "buyerFunded(bool,address)", +"7750b2b1": "__setDeadline(uint256)", +"775146c3": "request(bytes32,uint256)", +"77517765": "getTotalActiveStake(uint256)", +"7752182b": "AddReserveToNetwork(address,bool)", +"77524af9": "wethTransfer(address,uint256)", +"775274a1": "requestRefund(bytes32)", +"77532fa8": "TotalClosedDeposits()", +"77538407": "Ap()", +"7753ec49": "in_registration_phase()", +"77542194": "setTokenTransferStatus(bool)", +"7754305c": "getURI()", +"7754ec29": "WinCoin()", +"7755a0f5": "ResolutionProposalSubmitted(uint256,uint256,address,string,string)", +"7756c908": "transferLocked(address,uint256)", +"7757fc5d": "withdrawalOpen()", +"7758bf86": "maxBridgeWidth()", +"7758c4f8": "quickBuy(uint256)", +"7758d407": "nextCommonTTWTokenId2()", +"775915ce": "stepTwoEndTime()", +"77598626": "TZCoin()", +"77599026": "calculateYourValue2(uint256)", +"775a25e3": "getTotal()", +"775a8f5e": "toBytes(uint256)", +"775a91ac": "timeLockTokens(uint256)", +"775ad527": "allow(address,address)", +"775af9df": "MiningRigFarmer()", +"775b9c13": "setWhiteList(address[])", +"775c300c": "deploy()", +"775c46cd": "startFunding(uint256,uint256)", +"775dec49": "keccak()", +"775e38f7": "NO_MONSTER()", +"775eb900": "signed(bytes32)", +"775ee3ef": "view56()", +"775f5ec0": "finishRitual(address)", +"775f731c": "addSomeUETsTo(address,uint256)", +"775fc127": "operation()", +"77609a41": "challengeCanBeResolved(bytes32)", +"7760da7f": "reclaimTokens(uint256)", +"77610ba2": "setDollar(uint256)", +"77617a7d": "BuyToyMoney()", +"776184b1": "test_oneValidEqString()", +"77620729": "forward(address,address,uint256,bytes,bytes32,bytes)", +"776247c4": "withdrawEthFromBalance()", +"77627a1d": "Goutex(uint256,string,uint8,string)", +"7762df18": "VVDB(address)", +"7762df25": "potentialOwner()", +"7762f046": "setContractBridgeAddress(address)", +"77640f9c": "setClaim(address,bytes32,bytes)", +"7764d878": "checkstatus()", +"7764f771": "getBackBNB()", +"776532de": "Numa()", +"7765c52c": "getAuctionStatus(uint256)", +"776676d6": "newRC(uint256,uint256)", +"77669b2d": "setCompte_33(string)", +"7767ecc3": "inSdcForAdmin(address,address,uint256,uint256)", +"7768dec0": "isTokenSale()", +"77695d39": "getDb(uint256)", +"77699a06": "reclaimExpiredSwap(bytes32,bytes32)", +"7769d384": "revokeAndPublish(address,bytes32,bytes32,address)", +"7769ea0a": "addPool(uint256)", +"776a038e": "PurchaseToken()", +"776ab634": "unpauseToken(uint256)", +"776b37e2": "editCertificate(string,address)", +"776b6b27": "setRoscaAddress(address)", +"776bf795": "pieceTransfered(uint256,address,address)", +"776c3b70": "setNewSalesManager(address)", +"776d1a01": "setTarget(address)", +"776d62f6": "costs()", +"776d89ba": "delPhase(uint256)", +"776dba67": "VioRewardERC20Token()", +"776df027": "testFailDisownNotOwner()", +"776e7fc1": "checkRedbullQuest(address)", +"776f3b99": "burnByPercentage(uint8,uint8)", +"776f9663": "PeerBet()", +"776fd7ce": "setEscrowTransfer(address,uint256,uint256,bool)", +"77703d29": "getBuyOrder(uint80)", +"7770bd15": "crowdSale()", +"777256c4": "Greeter()", +"77725b88": "SetFFSettings(address,address,uint256,uint256)", +"7772a380": "isInGeneration(address,uint256)", +"7772ba07": "setDelays(uint256,uint256)", +"77738ce7": "fundAccount(address,uint256,uint256)", +"7774c394": "isNecromancer(uint256)", +"7774d64c": "testCreateOrder()", +"7774e950": "createUnit(uint256)", +"7775eec9": "getCompte_29()", +"7776466c": "preSaleToken()", +"777665b8": "transferTOKENtoProviders(address,address,uint256,address,uint256)", +"77773d90": "amountOfTokensPerEther()", +"7777789f": "_mint(address,uint256,uint256[])", +"7777d088": "lotteryTokensPercent()", +"777850f9": "payAfter(address,uint256)", +"77790081": "updateMaritalStatus(string)", +"777955b1": "updateReferralGu(uint256)", +"7779b0e4": "_buyTokens(uint256,uint8,address,address)", +"777a5dc5": "explodePhoenix(uint256)", +"777ab367": "mk_contract_address(address,uint256)", +"777ac349": "totalWins()", +"777ac522": "_createTree(string,string,uint256)", +"777aff7d": "updateHistory(address,uint256)", +"777b4547": "ICO(address,address,address)", +"777c1bb2": "eosLITE(uint256,uint256)", +"777c658f": "getTotalDonations()", +"777cfd5f": "createSubmission(address,string,bytes32,bool,bytes32,string,uint256)", +"777d1a8d": "HealthCoin(uint256,string,string)", +"777dff4a": "transferCTO(address)", +"777e479d": "getRoundBlockNumber(uint256)", +"777e6b1c": "getEntitledFunds()", +"777e82ca": "BookERC20EthV1p1()", +"777e940c": "excessRefund(address,uint256)", +"777ecb74": "LogPaused()", +"777eceb8": "tokensForOneEther()", +"777f942d": "changeMinStake(address,bytes32,uint256)", +"777feff5": "getCertificationDbAtIndex(uint256)", +"7780ae85": "desimls()", +"77810380": "getRegistrationToken()", +"77818808": "Electrium()", +"7781eafa": "considerPerseus(uint256)", +"77826b0c": "setMaxReceiveEther(uint256)", +"778317c4": "setWinLossAmount(uint256,uint256)", +"77838c63": "distributedToOwner(uint256)", +"7783c06b": "newArt(string,string)", +"7785859f": "altCapitalization()", +"7785954b": "produceRandom(uint256)", +"778639cb": "checkValidFighter(address,address)", +"77863b61": "CrossWhitehatWithdraw(uint256,address)", +"7786b22d": "ELRUN()", +"77870bce": "BeatOrgTokenPostSale(address)", +"7787dfaf": "test_9a_transferShouldBeFalse()", +"77886028": "setTokensContractAddress(address,address)", +"7788d126": "REFERRAL_BONUS_LEVEL3()", +"77895ef4": "listedMonForClass(uint64)", +"7789f844": "backTokenOwner()", +"7789fc90": "createBet(bytes32,bytes32,uint256,uint8,uint16,uint16,uint16,uint8,uint256,uint8)", +"778a56ce": "toggleBurn()", +"778a5978": "guessNumber(uint16)", +"778b5aee": "getWalletsCount()", +"778c2cea": "onlyLocklistedCanDo()", +"778d00f0": "pushPrivateInvestment(uint256,uint256,address)", +"778d491e": "wd(uint256)", +"778e388e": "parseInt_(uint256)", +"7790a5d2": "Token_5()", +"77913fbc": "getModuleId(string)", +"7791dc1f": "AuthEnd()", +"77921952": "contributorCounter()", +"77922220": "getRegionProducts(address,uint256,uint256,uint256,uint256,uint256,bool)", +"77922e57": "batchCancel(address[],uint256[],uint256)", +"7793868c": "RostToken()", +"779454ff": "boardAddress()", +"77952161": "didDepositCollateral(bytes32,address,uint256)", +"7795820c": "getCommitment(bytes32)", +"7796fb95": "setSink(address)", +"7798e525": "countUBetChecks()", +"779972da": "setLockPeriod(uint256)", +"779997c3": "bump(bytes32)", +"779a3611": "makeBet(uint256,uint256,uint256)", +"779a5a7f": "getContributorByAddress(address)", +"779ad324": "getIEOId()", +"779b2e11": "getCurLevelKeyNum()", +"779b8dc0": "load(bool,address,address,address,address,address)", +"779beca0": "getNumOfSalesWithSameId(bytes)", +"779beedf": "registerWallet(address)", +"779c4a26": "getUserSponsorships(address)", +"779c9b19": "_emitCategorySet(uint256,uint256,bytes32)", +"779ce152": "WIN_PERCENT_PER_DISTANCE()", +"779d2e20": "setLawSupportProfitAddress(address)", +"779d6fc7": "logInitialReportSubmitted(address,address,address,uint256,bool,uint256[],bool)", +"779de55d": "paymentsByBenefactor()", +"779dec5b": "bZRxTokenContract()", +"779e170d": "isSaleOn()", +"779e5ad8": "gvOptionToken20()", +"77a0e875": "destTokensSit()", +"77a1ec4b": "hodlCountdown()", +"77a28225": "delegateFromReferral(uint88)", +"77a28461": "ownerSetupBankrollInterface(address)", +"77a28fec": "DealCancelRate(uint256)", +"77a3a0a2": "removeMarketFrom()", +"77a43129": "publicSellLockEndTime()", +"77a54b38": "checkForNewStellar(address,uint256)", +"77a54eb8": "blacklistAddresses(address[])", +"77a6acfb": "tokenDemo(uint256,string,string,address)", +"77a6cb64": "TokenEscrow()", +"77a714ae": "ERC721Token()", +"77a7354d": "addExperience(string)", +"77a74a20": "expressingTraits(uint256)", +"77a7d968": "walletBalances(address,address[])", +"77a7e6be": "getRefTotal(uint256)", +"77a8bc86": "untrustedExecuteRuling(uint256)", +"77a9037b": "updateLastVotedOnParameter(bytes32,address)", +"77a9e152": "redeemToken(uint256,uint32)", +"77aaafd2": "interfaceFrozenTransfer(address,address,uint256)", +"77aad873": "proposeLaborHourToken(address)", +"77ac3da5": "oraclize_query(uint256,string,string[1],uint256)", +"77acbb22": "manager2()", +"77ad619d": "get_commit_no()", +"77ae6c47": "requestBatchInsatalmentsLoans(uint256,uint128,uint256,uint24,uint40)", +"77afd7e6": "shitRate()", +"77b02a33": "getGameLock(address)", +"77b08df0": "Migrations4()", +"77b0c751": "getNextPayDay()", +"77b0dd70": "depositAndInitiate(uint256,uint256,address,bytes32,address,uint256)", +"77b11de3": "setPlayerHasGetFree(address,address,bool)", +"77b1788e": "postTrade(bytes32,uint256)", +"77b19cd5": "getCallBaseGasPrice(bytes32)", +"77b1b2eb": "MAX_CANVAS_COUNT()", +"77b1bba6": "ChangeCollector(address)", +"77b1da93": "crowdSaleClosed()", +"77b2d590": "_set3()", +"77b38e2a": "MasternodeDeregistered(address,uint256)", +"77b440e9": "WALLET_FOUNDATION()", +"77b4a9c1": "getMakerBalance(address)", +"77b57073": "sponsorList(address)", +"77b68dae": "devDivRate()", +"77b71df0": "stake(int256)", +"77b74692": "setKYCAddress()", +"77b76ec3": "checkBalance(address,address)", +"77b77a4f": "PlatoPresale()", +"77b7b5f3": "returnCreator(uint256)", +"77b92c07": "Approve(uint256)", +"77bad015": "GetMyEgg()", +"77bb09eb": "addSweeper(address,address)", +"77bb5e34": "ChillCoin()", +"77bbc957": "returnReclaimed(uint256,address)", +"77bbf28a": "createDividend(uint256,uint256,address,uint256)", +"77bc222c": "_eraseSingleNode(bytes32)", +"77bc48f8": "view_owner()", +"77bc57e7": "Agencies()", +"77bd1bfe": "ITT(uint256,uint8,string,string)", +"77bd35fc": "claimPremium(address,uint256)", +"77bd775c": "setMinPurchaseAmt(uint256)", +"77bdab19": "OtoniToken()", +"77bdbccc": "registerCertificate(address)", +"77bde142": "setTargetBondingRate(uint256)", +"77bdfcfa": "cards_metal_check(address)", +"77bf8b91": "CelebSold(uint256,uint256,uint256,string,address,address)", +"77bf8e6f": "myShare()", +"77bf96d4": "claimProfitEquivalent()", +"77bf9776": "stopUpdate()", +"77bffc9a": "getRemainingStars(address)", +"77c07c19": "storageControllerAddress()", +"77c0891f": "setVotingParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"77c13323": "closing_requests(bytes32)", +"77c2f72e": "LightenToken()", +"77c2fb9b": "updateMokenName(uint256,string)", +"77c34ee7": "tokensRemainingIco()", +"77c427b7": "TemperatureMeasurementB(address,int8,int8)", +"77c4fd07": "availableEarlyPlayerShares()", +"77c626e3": "getStageAvailableTokens(uint256)", +"77c68aa7": "IGTMYR()", +"77c71396": "charityBeneficiary()", +"77c76449": "AVAILABLE_IN_MAIN()", +"77c78df9": "getCurrentLevel()", +"77c82476": "viewPetition(uint256)", +"77c846af": "changeUsername(string)", +"77c8d5a0": "computeTimeBonus()", +"77c90dd4": "VaporCoin()", +"77c93662": "sponsor()", +"77c9dd4b": "iOwner()", +"77ca4d11": "loadVotesForParticipant(bytes32,bytes32,uint8)", +"77caa61a": "updateExchangeRates()", +"77caa7e6": "endICOp2()", +"77caf711": "transferValue(uint256)", +"77cb6b7f": "AbccCoinToken()", +"77cb8edd": "_robot()", +"77cc437c": "institutionWallet()", +"77cdd2e5": "icoBtc()", +"77ce4fd1": "changeBlocksToExpire(uint256)", +"77ce52f8": "totalInfo()", +"77ce9bdd": "createPersonalDepositAddress(bytes32)", +"77cebd89": "isAllowedToBuy(bytes32)", +"77ceded8": "mintGrey(int256,address,uint256)", +"77cf0369": "totalPreICOavailibleWithBonus()", +"77cfe1c1": "isValid(string,address,uint256)", +"77cff22d": "init(address,address,uint256,uint256)", +"77d1f95d": "AntCoin()", +"77d223b2": "setLowestClaim(uint256,uint256)", +"77d2f203": "neg(uint256)", +"77d317d0": "destroy(uint256,string)", +"77d32e94": "ecrecovery(bytes32,bytes)", +"77d3550b": "commissionPercent()", +"77d447d6": "ContractorManagerSet(address)", +"77d4c48b": "arr(address)", +"77d4e5bc": "secondTimeLine()", +"77d555b7": "RateSetterChanged(address,address)", +"77d55755": "getMiningReward(bytes32)", +"77d56a04": "getReserveBalances()", +"77d58f21": "_safeContract(address,address,address,uint256,bytes)", +"77d630ae": "activationFee()", +"77d6a880": "saleOrNot()", +"77d6cfeb": "setGoalReached()", +"77d70b1f": "jackpots()", +"77d79d10": "getGame(uint8)", +"77d821a2": "testOnlyMultisigCanDeployANT()", +"77d83b81": "confirmGetFreeQuest(address)", +"77d89406": "bankerFeeDataRecord(address,uint256,uint256)", +"77d8ffc0": "getTokensFromBuy(address)", +"77d99ef5": "createBattleboard(uint256,uint8)", +"77d9d1fb": "maxHEXCap()", +"77d9e5fd": "isElectionValid(uint256,uint256)", +"77da0add": "seeAsset(uint256)", +"77dac983": "abandonEscrowService(uint256)", +"77daeb80": "addDeal(address,address,address,uint256,uint256,uint256,uint256,string,uint256,uint256,bool)", +"77db5206": "checkStatus(address,uint256)", +"77dbbd76": "transferFrom(address,uint256,uint256)", +"77dc0413": "small_payout(uint256)", +"77dc657c": "checkPassword(bytes)", +"77dc6ac7": "tokensSelling()", +"77dcb4f9": "doPresaleMinting(address,uint256)", +"77dcba6d": "writeConversion(string,address,uint256,uint256)", +"77dd3323": "setts50(uint256,address)", +"77dd8ea7": "ethFnkRate1()", +"77df3013": "calculatePurchaseAndBonuses(address,uint256)", +"77dfec3c": "exchangeRateTimestamp()", +"77e13c10": "playerMakeBet(uint256,uint256,bytes32,uint8,bytes32,bytes32)", +"77e17039": "startSettlement()", +"77e17191": "COIN_SUPPLY_MARKETING_TOTAL()", +"77e19824": "numSubmissions()", +"77e26762": "getErbutongHao(uint256)", +"77e2965b": "updateTokenAge(address,address)", +"77e2a6ed": "openGiveAway()", +"77e2e5ce": "ICO_setParameters(address,uint256,uint256,uint256,uint256,address,uint256)", +"77e303d2": "_Deposit(bytes32,uint256,uint256)", +"77e49660": "addAddressAliasUnsafe(address,address)", +"77e4fb04": "testFailNotEnoughValue()", +"77e5bf84": "getTxGasprice()", +"77e5d8f8": "advisersUnvested()", +"77e5f6d0": "setGizerItemsContract(address)", +"77e60f42": "marginForMajority()", +"77e6bb15": "getCurrentBonusPercent()", +"77e71ee5": "getForkEndTime()", +"77e75b07": "mintAndAllocateZCO(address,uint256)", +"77e7645b": "CoinSaleActive()", +"77e7ff41": "kickTheCoin()", +"77e8a52e": "SEARCH()", +"77e91f26": "getAyantDroitEconomique_Compte_10()", +"77ea8c72": "RGLSToken()", +"77eaa420": "_clearAuthorization(address,address)", +"77eab3e3": "changeMinimumAmount(uint256)", +"77eb4c50": "hasSponsor(uint32)", +"77eb74a1": "PassportInterfaceID()", +"77ec0feb": "dividendPerToken()", +"77ee311c": "totalMember()", +"77eefa5a": "pullBack(address,address,uint256)", +"77ef2c91": "whitePaperHash()", +"77ef9581": "Registry(address)", +"77f051c3": "AcceptsToken3D(address)", +"77f122bd": "setBlockValueBalance(uint256)", +"77f172b6": "_wager(uint256)", +"77f18090": "Citizen()", +"77f18ed3": "isImmortal()", +"77f25566": "setOne(uint256)", +"77f27251": "paybackDelta()", +"77f2d0b0": "partnerInfo_for_Owner(address)", +"77f325df": "submitAnswer(bytes32,bytes32,uint256)", +"77f3293a": "endPreICO()", +"77f37cd1": "luckyBonus(uint256)", +"77f38024": "BountyPart()", +"77f3c0cd": "InvokeTransfer(address,uint256[],uint256)", +"77f3e3d1": "Bounty_Supply()", +"77f3f782": "UserBalances(address)", +"77f41164": "stageTwoClosed()", +"77f46346": "CheckIfIsAllowed(address)", +"77f48f94": "spin(bytes32)", +"77f50f97": "claimAdmin()", +"77f51246": "tokenIsLocked()", +"77f53095": "createBasicToken(string,string,uint256,string)", +"77f54a82": "setICOParams(uint256,uint32,uint32,uint256,uint256,bool)", +"77f6f7e8": "YoloToken()", +"77f74b6b": "getTimestamp(uint16,uint8,uint8,uint8,uint8,uint8)", +"77f83bce": "PruebaCoin()", +"77f8afc3": "FixSale(uint256)", +"77f929fb": "DeveloperCoin()", +"77f98616": "getTotalProduct()", +"77f9bc13": "getVendorApplicationStatusTrack(string,uint256)", +"77f9c101": "testDeployNewTokenWithTheTestContractAsOwner()", +"77f9c862": "GetSellOrderDetails(address)", +"77f9db33": "disableTokenTransfers()", +"77fa3d32": "addAuction(uint32,uint256,uint256,uint8,uint8)", +"77fa4c21": "getRewardPot()", +"77faba66": "setRewardPercentageK(uint256)", +"77faffa0": "nextround()", +"77fb6269": "migrateData(address,uint256,uint8)", +"77fbe611": "forTeamETH()", +"77fc35e5": "_burn(string)", +"77fcb91d": "forward(address,bool)", +"77fcbebe": "TokenLimitReached(uint256,uint256)", +"77fcc493": "TOKEN_MIN_PRICE_THRESHOLD()", +"77fcce68": "setSignatureValidatorApproval(address,bool)", +"77fd347a": "makePredictions(int16,string)", +"77fe2a0d": "unfrozePerDay()", +"77fe38a4": "transferToICAPWithReference(bytes32,uint256,string)", +"77fed1c7": "addOverview(uint256,string,string)", +"77ff24f4": "test0()", +"77ffd2e8": "setCurrencyExchangeRate(uint256,uint256,uint8)", +"780004ac": "systemFreeze(uint256,uint256)", +"7800313f": "getCurrentTokensByType(uint32)", +"7800a9f6": "getP3DInfo()", +"78013292": "optionAddress()", +"78018581": "Allysian()", +"7801fc3e": "totalReceivedEth()", +"780211a2": "refundOrder(address,address,address,bytes32,address,address)", +"78021e7c": "ownersOfToken(uint256)", +"780249cd": "DC()", +"7802857a": "BONUS_TIER_8_LIMIT()", +"7802cbaf": "addTokenOwnerReward(uint256)", +"7802f4e4": "nada(uint256)", +"78030b83": "makeWildCardToken(uint256)", +"78044965": "setACLRole8972381298910001230(address)", +"78044ba5": "transferToBuyer(address,uint256,address)", +"7804a5dc": "canCreate(address)", +"7805862f": "Unpause()", +"7805a548": "_createItem(uint256,uint256,uint256,uint256,address)", +"7805dd1c": "_totalUsersBets()", +"7807e826": "calculateWeiNeeded(address,uint256)", +"78080c9d": "rateStage1()", +"7808dc69": "createSale(uint256,uint256,address,address,address)", +"780900dc": "create(uint256)", +"7809231c": "DistributeAirdrop(address,uint256)", +"7809dd64": "_receiveRefund()", +"780a4d74": "RecipientUpdated(address,address,address)", +"780aa037": "receiveTokenFromContract(uint256)", +"780ae915": "completeMigration(address,uint256)", +"780aee73": "newGame(string,bytes32)", +"780bbe60": "createChamp(address)", +"780bd739": "giveOut(address[])", +"780be5be": "AggiungiNegoziante(address)", +"780bfed0": "addPermission(bytes4,string,string,string)", +"780c4a73": "addCounter(address,uint32)", +"780c5316": "payMinAuctionEther()", +"780c5689": "writes(bytes32,address)", +"780cbf65": "_queryCallback(uint256,bytes)", +"780d2328": "recordVisit(address,string)", +"780e4b96": "setConsolationRewardsClaimPercent(uint256)", +"780f4987": "systemMessage(string)", +"780ff8d1": "viewLatestErc20TransactionRequest()", +"78108368": "atxRate()", +"78121b60": "KeyedCollection()", +"781224f4": "setVendorWallet(address)", +"78122f3a": "fail(string)", +"78127ee7": "GOLDBARToken()", +"781327de": "createStrategy(string,string,string,address[],uint256[],bytes32)", +"78152bbe": "setPresaleStart(uint256)", +"78155bf4": "PaymentCompleted(address,uint256,uint256)", +"78160d6b": "numChipsClaimed()", +"78166097": "isValidCustomer(address)", +"7817364d": "ChillTalk()", +"7817a60f": "acceptMember(address,string)", +"7817abee": "getOwnerRatingTuple()", +"7817eedd": "rawOwnerOf(bytes32)", +"78186f51": "etherPriceInDollarOut()", +"7818e9ef": "opencode(bytes32)", +"7819d30d": "updateNameResolver(string,address)", +"781a2cca": "Pay(uint256)", +"781a4a74": "getTokensIcoSold()", +"781c0db4": "finishFreeGet()", +"781c4dad": "tierNo()", +"781cc3d3": "cancelAction(bytes32)", +"781cd99d": "START_TIMESTAMP()", +"781db835": "_buyTokens(address,uint256)", +"781e48e4": "MYCareCoin()", +"781e9892": "cumulativeRatios()", +"781f5a83": "registerIdentity(address,address)", +"782037dc": "reserveTeamRecipient()", +"78205f67": "testThrowTransferEnableNotTransferable()", +"7820cd94": "flexibleRewardLevel(uint256)", +"7821a514": "addReserves(uint256)", +"7822b902": "setSaleAmountCap(uint256)", +"7822ed49": "bankAddress()", +"78231978": "totalSaleSupply()", +"782378d1": "MIC(uint256,string,uint8,string)", +"78238cf0": "setCmd_control(uint256)", +"7824407f": "tokenSupply()", +"78248880": "decreasePaymentsBalance(address,address,uint256)", +"7825396b": "setPrices(uint16[])", +"78258c41": "ZXToken()", +"78261878": "saleCompleted()", +"78263edf": "changeMaturity(uint256)", +"7826bbc3": "fstPrivateSalePortionDenominator()", +"7826bfa8": "ethereumLottery()", +"7826f28f": "S1()", +"7827b226": "froze_contract()", +"782841cd": "changeMintingState()", +"78296854": "origMktValue()", +"782a0170": "etherPriceInUSD()", +"782a2737": "vestingMap(address)", +"782addbd": "isInvulnerableByArea(uint256)", +"782b2340": "getStartIcoTimestamp()", +"782b3602": "taker()", +"782b9d50": "setCitizenAddress(address,address)", +"782c6ef8": "refundSender(address,uint256,uint256)", +"782c9689": "DeliverToClaimers(address[],uint256[])", +"782ce79c": "burnClosedToken(bytes32)", +"782da1ea": "transferFromInternal(address,address,uint256,bytes)", +"782e1e6c": "tokenTarget()", +"782e34c9": "ownerSafeWithdrawal()", +"782ec023": "transferMultiAddressFrom(address,address[],uint256[])", +"782f08ae": "setUri(uint256,string)", +"782fb5d4": "getVoteCounts(bytes32)", +"7830b7f8": "PowerNetCoin()", +"783110dc": "increaseStep()", +"78312435": "updateIssuer(address)", +"78321efb": "pushElement(uint256)", +"78329d61": "processPurchase(address,address,uint256,uint256)", +"7832bbf7": "temporaryEscapeHatch(address,uint256,bytes)", +"78330101": "ESlotsICOTokenDeployed(address)", +"783370b5": "setEditionLimits(uint256,uint8,uint8,uint8)", +"7834a504": "buyCoin(address)", +"78351502": "hasPastFreezTime()", +"78357e53": "Manager()", +"78367e46": "enterSmall()", +"783680a7": "ico2Min()", +"78375f14": "requireisfine(uint256)", +"78375f61": "BetTest111()", +"7837848c": "expire(bool)", +"7837e170": "lockBalance(address,uint256)", +"7838415b": "MeetOneToken()", +"783870eb": "rubusBlackAddress()", +"78388eb6": "allocationsOverTime(uint256)", +"78393237": "MAT_PARTNERS_SUPPLY_LIMIT()", +"783a2cca": "approveWithdrawal(address,uint256,bytes32,bytes32,uint256)", +"783ac3ee": "offThreshold()", +"783b4569": "rawRegister(bytes32)", +"783b7b1e": "sendJackpot(address)", +"783c2088": "lookupRegName(address)", +"783c8db0": "minimumFundingAmount()", +"783cc9dc": "CNNToken()", +"783ce458": "expmod(uint256,uint256,uint256)", +"783d5dec": "_limitTeamWithdraw(uint256,uint256,uint256,uint256,uint256)", +"783ddace": "mintAdvisersTokens(address,uint256)", +"783e7a06": "removeVerificatorAddress(address)", +"783f28e6": "adminUpdMinSign(uint256,uint256)", +"783f6af5": "people()", +"783f7b98": "setEtherQuota(uint256)", +"78405234": "indexOf(uint8[],uint8,bool)", +"7840c781": "_setTokenOwner(uint256,address)", +"78415956": "after_test_2_method()", +"7841a530": "set_tokens_sold(uint256)", +"7841b780": "isPaymentSettled(uint256)", +"78420d4a": "validateLock()", +"784279d8": "setSupportedTokens(address,bool)", +"7842a3a4": "payReward()", +"7842aded": "getLotteryMoney()", +"7842dca8": "allTime()", +"7843184b": "setMultiBonusTokens(address[],uint256[],uint256)", +"78446bc1": "timeLockPeriod()", +"7844ce81": "hodling()", +"78451d64": "SplitPayment(address[],uint256[])", +"78452d65": "CATContract(address,string)", +"784547a7": "isConfirmed(uint256)", +"7845b86e": "fundingRatePredictionBonusClaimWindow()", +"7845cbef": "GOLDT()", +"7845d5aa": "UpgradeAgentSet(address)", +"7845d76b": "tune(uint256,uint256,uint256,uint256)", +"7846188d": "_getCrabTotalStats(uint256)", +"7846c3c8": "minimumContributionPresalePhase2()", +"784712f2": "pendingPayouts(address)", +"78473485": "getSellDemand(uint256)", +"7847352a": "setBettingCondition(uint256,uint256)", +"7848033e": "distributeCHENDE(address[])", +"784813e0": "lookupBet(uint256,uint256)", +"78483632": "secondsaleOpen()", +"78489ed6": "compareIntValue(bytes32,int256,bytes1)", +"78498818": "getTokensBought()", +"784a3e40": "bountiesIssued()", +"784aa7d2": "setTitulaire_Compte_5(uint256)", +"784ba0f5": "yearteam_trade_date()", +"784d17f9": "DarkrenlandToken()", +"784f47ff": "reduceCredits(string,uint256,uint8,address)", +"784f6654": "activateMe(string)", +"784fcb94": "MARXToken()", +"784fdf26": "totalExternalSales()", +"7850a6b2": "transferDoftManagment(address)", +"7850b72f": "LSDCrowdsale()", +"7850c2ac": "holdersAllocatedAmount()", +"7850f0a4": "setPromotedGame(uint256,bool,string)", +"785105f6": "savedBalance()", +"78517536": "updateBlockNumberOfGladiatorBattle(uint256)", +"7851bcbd": "safePerc(uint256,uint256)", +"78524b2e": "halveMinQuorum()", +"785250da": "kyberNetworkProxyContract()", +"78533046": "getMetaInfo(uint256)", +"78533e90": "setTokenMinter(address)", +"78537808": "union(address[],address[])", +"7853c945": "bitcoinKey()", +"7854216b": "autoAirdropAmount()", +"78547d5f": "processPurchase(address,uint256)", +"7854b798": "addauction(uint256,uint256,uint256,uint256,uint256,string,string)", +"78566845": "allocateTicket(uint256,address,string)", +"78572816": "addAffiliate(address,bytes32)", +"78579d7c": "addEntry(address,uint256,bool,uint256,uint256)", +"7857f6e7": "setReverseRate(address[],int16)", +"7857fcda": "assertEq3(bytes3,bytes3)", +"78581a46": "getBatchCreateDrawingsAddress()", +"785826a7": "sendReferrer(uint256)", +"78583275": "updateMinSale(uint256)", +"7858651e": "getConnection(address,address,bytes32)", +"7858eb7b": "setScore(string)", +"7858f93a": "addressFundTeam()", +"78591e1d": "findAllCliWithPendingTask()", +"7859f9e6": "purchaseCarAdv(uint256,string,string)", +"785b1eb4": "PayEIF()", +"785b804a": "transferEtherInitiation(address,uint256)", +"785bc758": "setBaseStorage(bytes4,uint256,string)", +"785cc997": "mint(uint256,string,bytes)", +"785ce7ca": "walletBlockOf(address)", +"785da817": "unterminateFunding()", +"785e64a1": "whatIsMocount()", +"785e9e86": "erc20()", +"785fa627": "prizeAmount()", +"785fb499": "burnFoundersTokens(uint256,uint256)", +"78607c33": "FundWithdrawed(uint256)", +"7860ed56": "secondItemWrong()", +"78629c0f": "lockAddressToken(address)", +"7862affa": "calculateTimeBonus(uint256)", +"78635049": "MarzCoin()", +"786420d1": "getEstate(uint256)", +"786431c1": "MAX_OPS()", +"78644a4a": "userOfferAcceptElement(uint256,uint256,uint256)", +"7865f463": "mmul(uint128,uint128)", +"7865f611": "LogBet(address,bool,uint256,uint256,bool)", +"7866ed6e": "getBloodline(uint256)", +"78670289": "MAX_END_BLOCK_NUMBER()", +"7867060d": "approveComponent(string)", +"78683654": "convertMainchainGPX(string,string)", +"7868c89d": "getRateByStage(uint256)", +"786926fa": "existenceBalanceOf(address)", +"78698e45": "_updatePrices(uint256,uint256,uint16,uint256[],uint256[])", +"786ab4b6": "addAccountWithBalance(uint16)", +"786b844b": "closeGame()", +"786bfd76": "SimpleConstructorString(string,string)", +"786c5065": "closeDistribution()", +"786caff8": "claimerOfSocialIdentity(uint256,uint256)", +"786cf3ee": "DurioTEST()", +"786d02d0": "getHoldingsCount()", +"786d8a25": "test_falseEqNoLog()", +"786e06f3": "sendETHtoBoard(uint256)", +"786e4799": "removeRatePlan(uint256,uint256)", +"786ecf16": "doRestart()", +"786edae0": "registerEndpoint(string,int256)", +"786ef70a": "earnedEthWei()", +"786fb317": "requestOutput(bytes4)", +"787089bd": "PandoraToken(uint256,string,string)", +"787091e9": "EABToken(string,string)", +"7870f889": "MyWhiteList()", +"78710d37": "seven()", +"78710f72": "canBuyTokens()", +"787112be": "set_saleAgent(address)", +"78719b15": "likeCelebrity(uint256[],uint256[],uint256)", +"78719ee8": "DAppNodePackageDirectory(address,address)", +"7871a9ff": "Crypterium()", +"78720063": "EligmaSupplyContract(address,address)", +"7872e3da": "disbursementDuration()", +"78730d65": "nextLotteryTTMTokenId9()", +"7873447b": "getFrozenAccountList()", +"7873832e": "SingularDTVLaunch(address,address,address,uint256,uint256,uint256,uint256,uint256)", +"787394fc": "setJackpotIncrement(uint256)", +"7873bc61": "contestant(uint256)", +"787414ac": "ABC123ABC()", +"78744754": "getClassName(uint32)", +"7874b66f": "ReferralActivated(address)", +"7874d32c": "unblockTokenTime()", +"78753818": "MAIN_SALE_VALUE_CAP()", +"7875bbe2": "DividendPaid(address,uint256,uint256,uint256)", +"7875d41b": "takeBet(uint256,uint8)", +"78761590": "findTargetCell(uint256,uint256)", +"7877f72d": "getHours(uint256)", +"78782027": "enter(string,address)", +"7878903c": "hasPreSaleEnded()", +"7878b66a": "isPauseSave()", +"7879e19e": "CollectAllFees()", +"787a08a6": "cooldown()", +"787addc3": "FideliumToken(uint256,string,string)", +"787b586f": "setMediumProbability(uint8)", +"787b6725": "removeProduct(address)", +"787bd6f9": "setDistribution(uint256[5])", +"787c17d9": "privateSell1Token()", +"787c23e0": "whitelistWallet(address)", +"787ccb61": "replenishPool(uint256)", +"787d024d": "mintLzToken(address,address)", +"787d64e4": "m_multiOwnedRequired()", +"787dbaf1": "feedTweet(uint256,uint256,string)", +"787dc68f": "createPromoAthlete(address,string,address,uint256,uint256,uint256)", +"787dc9f1": "getFee(bytes8,uint256)", +"787e9137": "collectedTokens()", +"787ed1f8": "sayOwnerHello(string)", +"787ed54f": "payDividendsManually()", +"787eda49": "assertEq20(bytes20,bytes20,bytes32)", +"787f9710": "namespaceTaken(bytes32)", +"787f9cc3": "ManualPriceChange(uint256,uint256)", +"787fd167": "GameJoined(address,address,uint256,uint256,uint8,uint256)", +"788023ff": "changeShareable(address[],uint256)", +"78809c52": "ratePerEthPhase1()", +"788102ff": "reservedFundsParking(address)", +"788222ae": "tokenEmail()", +"78831239": "deleteTopic(bytes15)", +"78831b36": "setDividendsWallet(address)", +"7883985b": "addrExecutor()", +"78843a95": "isTier1(address)", +"7884e787": "getDni()", +"78862e69": "deathData_f9()", +"788649ea": "unfreezeAccount(address)", +"7886b526": "checkRecords(uint256[])", +"78879d74": "betAmountAfterRakeHasBeenWithdrawnAndProcessed(uint256)", +"78880f4a": "population()", +"788873ea": "logFeeWindowTransferred(address,address,address,uint256)", +"7888e957": "storageToUint(int256,string)", +"788a8c8b": "ARBI()", +"788ac4a8": "Petrocoin()", +"788acd7e": "issueBounty(address,uint256,string,uint256,address,bool,address)", +"788b2ba2": "Stock(string,string,uint256,string,uint256)", +"788bb8df": "EUR_Omnidollar()", +"788bc78c": "setVersion(string)", +"788bc8c0": "tokensToUsd(uint256,uint8)", +"788c26b4": "createNewVesting(address,uint256,uint256,uint256,string,uint256,bool)", +"788c4023": "isWalletLocked_Receive(address)", +"788c5999": "mintMode()", +"788ce6f2": "icoAddress()", +"788d135b": "GoForLaunch()", +"788d1fa6": "setInt8(int8,int8)", +"788d3851": "voteOpen()", +"788d5881": "licenseTermsHasMinCost(bytes32,bytes32)", +"788e0760": "shpExchangeRate()", +"788e26e7": "sponsorDeposit()", +"788e2c3c": "getRoundRemaining()", +"788e31bf": "addBoolSetting(string,bool,address,address,string)", +"788e72a5": "purchaseProduct(bytes32,uint256)", +"788e7909": "testTransferFromDoesNotAllowTransferOfMoreThanExistingTokensByDelegate()", +"788efb9e": "get_taker_fee()", +"788fa540": "CANONICAL_PRICEFEED()", +"78912dee": "FINTRUX_RESERVE_FTX()", +"78912eae": "sendTransaction(address,uint256,uint256,string,uint256,bytes)", +"7891663d": "HDXToken()", +"78918e89": "deleteCell(address)", +"7892cabf": "mixGenes(uint256[2],uint256[2],uint256,uint256,uint256)", +"7892d29e": "calcTradeFee(uint256,uint256)", +"7892fd29": "ROUND_TIME()", +"7893d936": "associate(bytes32,bytes32)", +"7893f4c2": "DBToken()", +"7894aafa": "createDivCard(string,uint256,uint256)", +"7894d1d0": "makeConcept(address[],uint256[],uint256,bytes,address)", +"789533e9": "getTeamPrice(uint256)", +"78954b3b": "previousContract()", +"7895dd21": "claimTokensFromSeveralAuctionsAsSeller(address[],address[],uint256[],address)", +"7895f853": "isFundLocked()", +"78960df6": "policyCandyBalance()", +"7896904e": "DaaToken(string,uint8,string,uint256)", +"7896cd95": "exchangeEnableCost()", +"789770f4": "ethToToken()", +"7898278f": "emergencyFreezeAllAccounts(bool)", +"78984793": "setLimit(address[],uint256)", +"7898acef": "usernameOf(address)", +"7898b917": "getKey(address,string)", +"78990684": "closeAllSales()", +"789a12fd": "getRafflePlayers(uint256)", +"789b2e6c": "payDay()", +"789b4690": "diviRate()", +"789c617c": "intStorage(bytes32)", +"789c6740": "testEmptyCart()", +"789cf5e2": "auctionSumPlat()", +"789dfc91": "SafeNetToken(uint256)", +"789e4e53": "createContractCollection(string)", +"789ea7dc": "becomeBatlord()", +"789fdcb6": "DoMusicPayout(uint256)", +"78a17883": "_batch4_icosaleEndTimestamp()", +"78a1b7c2": "pct(uint256,uint256)", +"78a2157a": "erc20ECT(uint8)", +"78a21a20": "_setStake(address,uint96,uint128)", +"78a29c66": "votesAvailable(address)", +"78a2e101": "TOKENS_FOR_PRESALE()", +"78a32742": "Pinged(address,uint256)", +"78a5b1b0": "blockHeaders(bytes32)", +"78a5f0ca": "withdraw_dao_fund(address)", +"78a62e9d": "isAppCode(uint32)", +"78a6c6d2": "createBreedingAuction(uint40,uint128,uint128,uint40)", +"78a70de5": "safeMathDiv(uint256,uint256)", +"78a71d78": "sendMail(address[],uint256,bytes32,uint256,bytes32,uint256)", +"78a72e0d": "encodeTransfer(uint96,address)", +"78a77b84": "closeRaffle()", +"78a7b804": "setKittyCoreAddress(address)", +"78a7e17d": "convert10MTI()", +"78a83232": "violaToken()", +"78a89567": "getTokenCount()", +"78a8b1fb": "ZTKGamers()", +"78a90a59": "presaleStop_13_December()", +"78a9e88a": "parseBitcoinComFeed(string)", +"78a9eeed": "listAll()", +"78aa08ed": "lotteryFee()", +"78aa34bf": "test_6_assertGasUsage2000Boards()", +"78abafaf": "limitAmount()", +"78abf854": "_budgetEndAndOfficalVotingTime(uint256)", +"78abfbeb": "finalization()", +"78ac19f9": "GexPayTest2Token()", +"78ad76e6": "DeBiToken()", +"78adf55e": "PreICOPart()", +"78ae12d8": "PRE_SALE_1000_ETH()", +"78ae88d1": "newDeal(uint256,uint256,uint256,uint256,uint256)", +"78af5058": "picosSold()", +"78af63ac": "btcRaised()", +"78afda07": "firstContractAddress()", +"78b04df0": "Play(address,uint256,uint256,uint256,uint256)", +"78b0cb23": "addGpgKey(string)", +"78b14f0a": "addCharity(address)", +"78b150bd": "contractUpgradable()", +"78b17bd1": "supercustomhash(bytes)", +"78b17ccf": "CANCELLATION_FEE()", +"78b226c4": "updateMemberAddress(address,address)", +"78b27221": "mintFungible(uint256,address[],uint256[])", +"78b290b5": "OPERATION_HOLDER()", +"78b29105": "forceBuy(address,address)", +"78b5a576": "updateDexterity(uint256,uint8)", +"78b6e20c": "untrackTreasuryToken(uint256)", +"78b71079": "hasEnoughGrantAmount(address,uint256)", +"78b83360": "freezingBalanceInfoOf(address,uint256)", +"78b8a6c2": "issueTokensInternal(address,uint256)", +"78b8c58c": "getTokenInfoNumToknes()", +"78b99c24": "pricingStrategy()", +"78ba24f2": "addContractBalance(uint256,uint256)", +"78bb5164": "whitelistLength()", +"78bb9e54": "niceguy4()", +"78bba530": "communityHolder()", +"78bc254b": "setPreIcoParameters(uint256,uint256,uint256,uint256)", +"78bc6460": "getCallGasPrice(bytes32)", +"78bca3e7": "NeuralNetwork()", +"78bcd39a": "accountLockCheck(bytes32)", +"78bd7935": "getAuction(uint256)", +"78be0496": "MTF(uint256,uint256)", +"78beda71": "createPromoMineral(bytes32,address,uint256,uint256)", +"78bee6b4": "transferToAnotherAddr(address,uint256,bytes32)", +"78bf2b53": "setToken(address,uint256)", +"78c01961": "EmitEntityIds(address[])", +"78c24e9b": "adminSetFeeDialNumber(uint256)", +"78c2c849": "burnUnicorns()", +"78c37a45": "amendCount()", +"78c38a79": "setOwnedArea(address,uint256)", +"78c3b3a5": "futureRoundWallet()", +"78c3df77": "addProfitPerShare(uint256,address)", +"78c3e2ec": "createTask(address,string,string,uint256)", +"78c3e7a4": "generateCardsFromClaimForOpponent(address,address)", +"78c3f298": "pvtTokens()", +"78c53533": "getPoolOwner()", +"78c5e86f": "crowdsaleClosedTime()", +"78c62ca4": "changeDestinationAddress(address)", +"78c68573": "getLineUpEnable_miner(address)", +"78c6d437": "founders_addr()", +"78c70a4e": "allowAddressToSendMoney(address,address)", +"78c7524d": "versionIndex(bytes32,bytes32,address)", +"78c83f71": "rebalance_insert(uint256)", +"78c8cda7": "removeWhitelist(address)", +"78c91d29": "getCountCanAdd()", +"78c9f9cf": "computeEarningsAmount(uint256,uint256,uint256,uint256,uint256)", +"78ca923d": "nearestKnownBlock()", +"78caa728": "getLLV_edit_12()", +"78cac18d": "updateInfo(address,address,uint256)", +"78cb2f56": "DENtoken()", +"78cc180b": "bpSaleIssue(address,uint256)", +"78ce14dd": "CryptotalksToken()", +"78ce341a": "enablePayable()", +"78cf19e9": "reserveTokens(address,uint256)", +"78cfccb5": "REDDCCOIN()", +"78cffc09": "set_location(uint256)", +"78d012a6": "roundIn()", +"78d0a415": "getDthTeller(address)", +"78d18198": "getNextSnapshotBalance(address)", +"78d18bef": "withdrawalsInitiated()", +"78d19e42": "MintableToken(uint256,string,uint8,string)", +"78d22ab0": "getStageMinWeiAmount(uint256)", +"78d34986": "updateKittensRemainingForSale()", +"78d3633b": "illiquidBalance(address)", +"78d38d1a": "SenegalvsColombia()", +"78d45eb6": "checkAccess(address,bytes1)", +"78d46c3f": "listSpriteForSale(uint256,uint256)", +"78d4e808": "fetchCancelledOrdersForPayerByAdmin(address)", +"78d55ac1": "MRCCToken(uint256,string,string)", +"78d5e123": "unstakeTokensManually(address)", +"78d63908": "doBuy(address,uint256,bool)", +"78d63c59": "AMFBToken()", +"78d6525f": "test_validEmptyEqEmpty()", +"78d6fd25": "getRecTransactions()", +"78d74f60": "LyCI(address,string,uint8,string,string)", +"78d7ccea": "ComputeEggsSinceLastHatch(address)", +"78d8615f": "addEvent(uint256,string,bytes32,bytes32,string,bytes32)", +"78d8e17b": "totalGenesisTokens()", +"78d8fed8": "setUnlock(bool)", +"78d9472f": "setDefendBoostMultiplier(uint256)", +"78d9b048": "teamPoolInstant()", +"78d9c387": "newContest(uint32,uint256,uint256,uint32,uint256,uint32)", +"78da32f2": "setUintF1F2F3(uint256,uint256,uint256)", +"78da7ba1": "presaleEndTimestamp()", +"78dbce5f": "GetStakingNow()", +"78dbfd91": "createBuyOrder(address,uint256,uint256,uint256)", +"78dc6b7e": "transferring(address,address,uint256)", +"78dc7017": "getYellowCards()", +"78dc70c0": "feePeriodStartTime()", +"78dda193": "getCarState()", +"78df0fe1": "getProfits(address)", +"78dfd3a9": "getNumParticipants(uint256)", +"78e03373": "operationalAddress()", +"78e0a0bd": "flashSale(uint256,uint256,uint256)", +"78e24ab5": "SALE1_RATE()", +"78e2df0e": "soft_cap()", +"78e4ca77": "Connect4eth(address,address,uint256)", +"78e4d750": "PenPalToken()", +"78e5d841": "HaltableToken(address)", +"78e619df": "DOOMCOIN()", +"78e65d2e": "bridgeValidatorsImplementation()", +"78e7058e": "advisorsTokensHolder()", +"78e77477": "releasedAdvisorsTokens()", +"78e7e5ea": "LAND_ADDRESS()", +"78e80b39": "UserGetPrize()", +"78e8356c": "removeBet(string,uint256)", +"78e8488d": "gameGiftSentAmount()", +"78e870cd": "balances_available_for_crowdsale()", +"78e88c3c": "getMyFee(address)", +"78e89085": "Dispute(uint256)", +"78e8b8fc": "dataSourceCallbackGroup(uint256,uint8,uint8)", +"78e8cab5": "gcpm(uint256)", +"78e90190": "mokenBytes32(uint256)", +"78e95645": "noteChainFee()", +"78e97925": "startTime()", +"78e9f1ba": "minimumBetAmount()", +"78e9f81f": "assignRoleWithExpiration(address,bytes32,address,uint256)", +"78ea787b": "getDefaultAllowance(string)", +"78eb890b": "checkErrors()", +"78eba8fc": "icoCheckup()", +"78ec0adf": "scannedSilverCaps()", +"78ec1eb4": "checkIfEligable(address,address)", +"78ec383a": "MRC()", +"78ec6dbd": "Beth()", +"78ec81a0": "sendEarnings(address)", +"78ec96a0": "GREEN()", +"78eca227": "getBuyOrderInfo(address,address)", +"78ecabe6": "changeAvailableSpend(uint256)", +"78ed2178": "linkFileToTask(address,bytes32)", +"78ed43c1": "administrationContractFrozen()", +"78ed8dfd": "allocateUnsoldTokens()", +"78ed9156": "diary(uint64)", +"78ee6035": "cancelPledgePayment(uint256)", +"78eef9d4": "move_excess_for_bucket(uint256,uint256)", +"78efa1db": "COIN_SUPPLY_ICO_TIER_3()", +"78f0161a": "setGreyGreenPrice(uint8)", +"78f08268": "getUsersCount(address)", +"78f08f2e": "getLineStat(uint256)", +"78f13614": "ATTR_LEASABLE()", +"78f1a5ce": "addTeamAndAdvisoryMembers(address[])", +"78f2144b": "_originalBuyPrice()", +"78f22cc0": "getAuditRegistrar(uint256)", +"78f305c6": "getStartDate()", +"78f55622": "calCurrentVirus(address)", +"78f55de4": "sxpNumber()", +"78f5958f": "setblocksPerMonth(uint256)", +"78f5e0ec": "CampingCoin()", +"78f5e59f": "TOTAL_SUPPLY_VALUE()", +"78f74fbe": "tokenIssuedPrivateIco()", +"78f76779": "batchOrderTrade(uint8[2][],bytes32[4][],uint256[8][],address[6][])", +"78f79187": "DailyAndSnapshotable(uint256)", +"78f7aeee": "tokenAllocated()", +"78f7d9c6": "payBill(uint8,uint256)", +"78fad7bc": "champToken()", +"78faff96": "isSet(address,address)", +"78fbc9ea": "weiToCollect()", +"78fc3cb3": "canTransfer(address)", +"78fc52b3": "processDiceRoll(address,uint256)", +"78fca301": "Menu03(uint256)", +"78fd98d1": "freezeAmount(address,uint256)", +"78fddd69": "MedAIChain(uint256,string,uint8,string)", +"78fe2951": "enableService(uint256)", +"78ff54eb": "updateRestrictedVault(address)", +"7900438b": "registerDevice(bytes32,bytes32,bytes32)", +"79008da5": "addRandomTile(uint16,uint8)", +"790105ff": "withdrawEIP20Token(address)", +"79018524": "Token(uint256,address)", +"79028df3": "GetFirstName(uint256)", +"79032fa7": "storeHorsey(address,uint256,address,bytes32,uint8,uint8)", +"790377dc": "getLastAuditId(address)", +"7903d8c8": "canSend()", +"79049227": "lockupSeconds()", +"7904d388": "ethRec(uint256)", +"7904f688": "distributePrizes(uint16)", +"79053739": "damage(uint8[176],uint8,uint8)", +"790587d1": "updateIpfsGateway(string)", +"79061e96": "withdraw_ether()", +"7906305b": "upgradeTier(string)", +"790683d3": "getTopicByOffset(uint256)", +"79081feb": "getCardLeaseLength(uint8)", +"7908f25c": "thirdTeamWithdrawal()", +"79099e15": "MAX_USD_FUND()", +"7909da6f": "createExchange(uint256,uint256,uint256)", +"7909f569": "gasForFLKD()", +"790a091e": "test_rewardPoolShare_notTranscoder()", +"790b1656": "ThreeEtherFree()", +"790be9b5": "SETC(uint256,string,string)", +"790c33b8": "getReportingTokenOrZeroByPayoutDistributionHash(bytes32)", +"790ca413": "launchTime()", +"790cbfa0": "createMeshPoint(int256,string)", +"790d4e11": "getLosersOnePercent(uint256)", +"790dd0f5": "fuint256(uint256)", +"7910085d": "fipsIsRegistered(bytes20)", +"79103c2e": "RejectedApplication(address,uint256,string)", +"7910830a": "setCrowdSaleStatus(bool)", +"7910867b": "isApproved(uint256)", +"7911d80a": "Presale1Sold()", +"7912b0f1": "HOPEToken()", +"79132085": "APSP()", +"79141f80": "getBetInfo(uint256)", +"791455dd": "addPieceAndHash(string,string,string,address)", +"79147cf0": "_result()", +"79147d07": "UnsoldAllocation(uint256,address,uint256)", +"7914d10f": "setminContribution(uint256)", +"7915785e": "accountsToAllocate()", +"791581c6": "addTime(uint256,uint256)", +"7915c069": "register(string,address,address)", +"7915c9e0": "verifyTransfer(address,address,uint256,bool)", +"79162aeb": "pauseEmergence()", +"79164773": "nextForkBlockNumber()", +"7919233f": "emitWorkOrder(address,uint256)", +"7919792b": "doThrowOnDivByZero()", +"791ac4e5": "_getUtilizationRate(uint256)", +"791af2b6": "dkBB(bytes32)", +"791af8e4": "totalExtraTokens()", +"791b1150": "notify_payment_reject(uint256)", +"791b51f1": "Consulting(address,address)", +"791bbe35": "TheDeadShitCoin()", +"791cbc4f": "stopConvertTokens()", +"791dd41c": "ownerOverride(uint256)", +"791f0333": "equalStrings(string,string)", +"792037e3": "shut(address,bytes32,address)", +"79203dc4": "totalAllocation()", +"7920d804": "getKing()", +"7920f72c": "_tag(int256,string)", +"79214878": "regionExists(uint256)", +"792166b8": "createEscrow(uint256,uint256,address,address)", +"79216aec": "ManagedToken(address,address[])", +"79216f5f": "add_monster(uint16,uint16,uint16)", +"79217982": "preIcoMinInvest()", +"79219a24": "getLockRecordCount()", +"7922841c": "registerAssetHeader(int256,string,string,string,string,string)", +"7923715b": "RPEICO_TOKEN_SUPPLY_LIMIT()", +"79250dcf": "getApprovePreSignedHash(address,address,uint256,uint256,uint256)", +"792544af": "get_DB_info(uint256)", +"79254bb8": "right29(uint256)", +"792651b0": "app_storage()", +"7927448a": "getTicketTime(bytes32)", +"7927bc0c": "list_token_bid(address)", +"79287790": "get_milestones_information(uint256)", +"792a152d": "addRegion(uint16,uint256,string)", +"792ad365": "lastBlock_f15Hash_uint256()", +"792b22c6": "returnCoupon(address[3],bytes32)", +"792b476b": "getPositionCount1(address,address)", +"792c02ea": "stagesLength()", +"792c91c2": "setRecordId(uint256,bytes32)", +"792cb544": "_setCertificateSigner(address,bool)", +"792e1ffc": "authorize(uint8,bytes32,bytes32,address)", +"792e79c5": "stealCardWithTwitterId(uint256)", +"79304063": "depositsSigned(bytes32)", +"7930a433": "withdrawDelta(uint256)", +"7930acd6": "getCCH_edit_27()", +"79318d81": "closeRefunds()", +"7931a765": "Issued(uint32,address)", +"793267f0": "vaildBalanceForTokenCreation(address)", +"79326c01": "isSaleOwner()", +"7932f07f": "getRegionBlockUpdatedAt(uint256)", +"793318eb": "MMMPCoin()", +"79332159": "Bet(address,address,uint256,uint256,uint256)", +"79341ca1": "getRoundAmtPot(uint256)", +"7934b50f": "_lockToken(uint256)", +"7934f4ed": "processPayment(uint256,bytes)", +"7935326b": "preICOTokensAllocated()", +"79362167": "getBillboard(address)", +"79372f9a": "ClaimReward()", +"7937f46d": "setBBO(address)", +"79381c80": "performRefund(bytes32,uint8,uint256,uint256)", +"7938cc42": "allocateProofTokens(uint256)", +"7939a10b": "getSellValue(uint256)", +"793a2cd1": "isPausedICO()", +"793a8c95": "owner_updatePayout(uint256)", +"793c0fd4": "authorizeSpender(address,bool)", +"793ca3fe": "getFirstCycleBlock()", +"793cd71e": "cashOut()", +"793cf430": "option30name()", +"793d424e": "getBLAddress()", +"793d7165": "fSqrt(uint256)", +"793dae12": "acceptSettlement()", +"793e9b0b": "OPTION_POOL_ALLOC()", +"793ec6c2": "turnOffCanUpdateBackWindowAdjustmentRatio()", +"79409b19": "EthToUsd()", +"79412da6": "withdrawalTokens(address,address,uint256)", +"7941a062": "getBlocksRemaining()", +"7941d7bd": "changeTokenOwnerByAdmin(uint256,address)", +"79420fb1": "tierTotal()", +"79428570": "getTeamId(uint256)", +"7943f2ec": "withdrawCoinToOwner(uint256)", +"79444ad3": "handleForTokenId(uint256)", +"7944875b": "StopSale()", +"7944b4b9": "mileStone(address,uint64,uint8)", +"79456cb6": "test_1_method()", +"79459ac3": "buy10(address[],address[],uint256[],bytes,bytes,bytes,bytes,bytes,bytes,bytes,bytes,bytes,bytes)", +"794752c7": "askForgiveness(string)", +"79480a4c": "getOrderValuesFromData(bytes)", +"79480fe3": "nextMintFeeAbs(uint256)", +"79485d41": "DeauthorizeServiceProvider(address,address)", +"7948a9c5": "TokensWithdraw(address,uint256)", +"7948f523": "setAmbiAddress(address,bytes32)", +"79491370": "closeSale(address)", +"79492f30": "allocationFor(uint256)", +"7949859e": "UpdateToeknLimitICO(address,uint256,uint256)", +"794ab0a8": "etherPriceInDollarIn()", +"794b0c62": "DAICO()", +"794b0e6b": "addExperience(address,uint256[],int32[])", +"794c0c68": "stakingEpoch()", +"794cea42": "search(address,address[])", +"794d0d8d": "WithdrawVault(address)", +"794df640": "updateUsdEthRate(uint256)", +"794e9434": "awardWeeklyLottery(address,uint256)", +"794ee205": "createMarriage(bytes32,bytes32,uint256,bytes32,bytes)", +"79501a83": "isBiometricLocked(address)", +"79502c55": "config()", +"7950c5f8": "verifyingKey()", +"7951357e": "Suspended()", +"79515566": "calcAllowedWeisToInvest(uint256)", +"7952a0ed": "MetaProject()", +"79530087": "BirCoin()", +"79538e47": "addVpf(bytes32,uint256,uint256,uint256,uint256,int256[])", +"7953ae77": "MainSaleDeadline()", +"7953e0ab": "dateEcoRelease3()", +"79544754": "getBonus(address,uint256,uint256)", +"79557e4f": "traded_token_balance()", +"7955a65f": "adminWithdraw(address[3],uint256[3],uint8,bytes32,bytes32)", +"7955dd45": "player_withdrawPendingTransactions()", +"795612d6": "buyItem()", +"79564072": "directorLockUntil()", +"7956f46a": "AggiungiProfessore(address)", +"7957170b": "getApproveRecord(uint256)", +"795741c8": "withdrawEscrowFees()", +"79583e22": "buyOrder(address,uint256,uint256)", +"7958533a": "meta(uint256,bytes32)", +"795a16e3": "setRecipient(string)", +"795b0e16": "TransferAllowed()", +"795b5b83": "createSaleCardToPlayer(uint256[],address,address)", +"795b9a6f": "scheduleCall(address,bytes4,uint256,bytes)", +"795bfd7b": "togglePreventDoublePurchases()", +"795c1713": "FCoinToken()", +"795c6437": "isWorkflowState()", +"795da78f": "coinsIssuedCmp()", +"795dbede": "idx()", +"795e09ef": "privilegedAccountsCount()", +"795e4547": "changeContractUpgradability(bool)", +"795ebb68": "setTokensDecimals(uint256)", +"795fcd6e": "RelentlessConscience1Token()", +"795ff8aa": "safeTokenWithdrawal(uint256)", +"7960d19b": "MediatedTransactions_Log(uint256)", +"79618233": "createDividendWithCheckpoint(uint256,uint256,address,uint256,uint256,int256,bytes32)", +"79624add": "MAX_DAILY_SOLO_SPEND()", +"7962525c": "getRoundNumberOfBets(uint256)", +"79630bd8": "rate10()", +"7963b478": "assertEq28(bytes28,bytes28,bytes32)", +"79644576": "newProposal(uint256,address,uint256,string)", +"796485f9": "back_giving(uint256)", +"7964dd2b": "excludeAddressFromStaking(address,bool)", +"7964ea87": "claim(bytes32,uint256,bytes)", +"79655bd0": "getStages()", +"7965bb86": "STQPreICO2(address,address[])", +"79662bd5": "withdraw(string,address,uint256,string)", +"796676be": "urls(uint256)", +"796686a9": "book(uint256[],uint256)", +"7966c431": "subString(string,uint256,uint256)", +"796736f0": "tradeBalances(address,address,uint256,uint256,address,uint256,bytes32)", +"7967a50a": "preSaleEndDate()", +"7968196c": "amountRaisedInUsdCents()", +"79681c94": "buyRoundDataRecord(uint256,uint256)", +"79683e63": "inviteInit(address,address)", +"79687166": "uintToBytesForAddress(uint256)", +"79694f08": "topUpDelegate(address,address,uint32,uint192)", +"796a6ec9": "Credited(address,uint256,uint256)", +"796a8076": "updateAuctioneer(address)", +"796b89b9": "getBlockTimestamp()", +"796c0c78": "allocatedTokens(address,uint256)", +"796c5b08": "getPenaltyFactor(uint256)", +"796c5e5b": "saveHash(bytes8,string)", +"796c8902": "getInvestor()", +"796d67da": "numberOfProposals(bytes32)", +"796d8950": "StromkontoProxy()", +"796dc916": "pauseResumeContract(bool,bytes32)", +"796f6281": "tokenFront()", +"7970785d": "withdraw(address[],uint256[],address[])", +"79710f07": "drainERC20(address)", +"79716e43": "confirmTransaction(bytes32)", +"7972d079": "setMfgValues(string,string,string,string,string,string)", +"79735d54": "hasEnoughStake(address)", +"7973830a": "getMapValue(uint256)", +"7973b370": "ProudOfYourCoin()", +"7973c57f": "fechVoteNumForCandidateBySnapshotBlock(address,uint256)", +"7974a9e6": "publishOption(uint256,uint256,uint256)", +"7974f8fe": "changeTime(uint256)", +"7974fdbd": "secondStageRefund()", +"79753e82": "initAirdrop()", +"7975752c": "ScabbageToken()", +"79758d46": "reading_card_at(uint8)", +"7975c56e": "oraclize_query(uint256,string,string)", +"7975c609": "accountLevels()", +"7975ce28": "buyTokens(uint256,uint256)", +"7976eaa2": "getBonusTokens(uint256)", +"79770d5f": "minBidDifferenceInSzabo()", +"7977f708": "addRoleCapability(uint8,address,bytes4)", +"79787196": "killTotalSupply()", +"7978c7ed": "exotownToken()", +"7978f1b2": "licenseCostNumerator()", +"79798ccb": "startTokenSale()", +"79799193": "FreezedCash()", +"797a49b6": "createPoll(string,uint8)", +"797af627": "confirm(bytes32)", +"797b5877": "NCU(uint256,string,string)", +"797bfaf3": "ico1endTime()", +"797c6f3a": "advertisingUse(uint256,uint256)", +"797d660f": "getCandidateNumberList()", +"797d8b85": "calculateDividend()", +"797d9437": "loadedRefund()", +"797df209": "configureVesting(uint256,uint256)", +"797e2aec": "addCharacters(uint8)", +"797f6bb1": "raiseTraderUnregistered(address)", +"797f73ff": "alreadyClaimed()", +"797f87ba": "chests()", +"79808552": "cancel_lottery()", +"7980a1ab": "increasePaymentsBalance(address,address,uint256)", +"7981e7f1": "generateTokensByList(address[],uint256[])", +"7981fd67": "loikikd()", +"7982abf0": "testTransferGas()", +"7983eb31": "distributeEvenly(uint256)", +"798405fc": "Hold(address,address,uint256,uint256)", +"79843715": "crowdSaleMax()", +"79848daa": "setReleaseManager(address)", +"7984932e": "releaseNow(uint256,uint256,uint8[],uint256,uint256,uint256,string,string)", +"79853c7e": "payFromCampaign(bytes32,address,address)", +"79859a78": "setMaxAgonCount(uint256)", +"7985b860": "AboutBill(uint256)", +"7985ee8f": "deleteRewards()", +"7986c724": "BOUNTY_TOKENS_LIMIT()", +"7986cbfc": "getGroupbyIndex(uint256)", +"798764ec": "ShowCoinToken()", +"79878757": "passTokensToTheTeam()", +"79881b5a": "setPresaleStartsAt(uint256)", +"79885b91": "LIB()", +"79891359": "getOnePlayCoin()", +"798929da": "distributeCoins(address,uint256,uint256,uint256)", +"798974dd": "getNumProposals()", +"798a970b": "setUnitCoinProductionIncreases(address,address,uint256,uint256,bool)", +"798b18fd": "currentRateM()", +"798b3ecf": "processCooldown(uint16,uint256)", +"798b7a71": "callOnce()", +"798bede1": "advisorSupply()", +"798c1f2a": "do_bet(uint256)", +"798c6e0f": "clearStages()", +"798ce54f": "payoutPartial(uint256)", +"798d05fa": "getCountTeams()", +"798ec637": "transferEtherToSender(uint256)", +"798f3e85": "PublicTokenReleased(uint256)", +"798f9790": "getResoDetails()", +"798fd178": "getFrom()", +"79902299": "recalculateTotalFees()", +"79905753": "reclaimFundMultiple(address[])", +"7991c63a": "MetaChanged(uint256,bytes32,bytes32)", +"7992e39f": "TierAmount()", +"7993e5c2": "Devcon2TokenForTesting()", +"7994f55b": "setEndpointParams(bytes32,int256,bytes32[],int256)", +"79953633": "ownersProductAdded(address,uint256,address)", +"79955b4c": "richardAddr()", +"7995b15b": "nowInSeconds()", +"7995ba90": "withdrawExcessToken(address,address)", +"7995ed8c": "ClaimedWei(uint256)", +"79968b77": "sellLicense()", +"79974ce8": "MiningAttemptEvent(address,uint256,uint256,uint256,uint256)", +"79978630": "settleChannel(address,uint256,uint256,bytes32,address,uint256,uint256,bytes32)", +"7997b997": "doMelt(uint256,uint256)", +"79981387": "setWhiteList(address[],address,bool[])", +"79984882": "getProxyExecID(address)", +"79987504": "ECN(uint256,string,string)", +"7998a1c4": "identifier()", +"79991997": "enter(bytes32,bytes8,uint16)", +"799957d2": "TTC()", +"7999c7ca": "myUsername()", +"799a5359": "transferToken()", +"799ae223": "flipCoin()", +"799b3864": "getVersionLength()", +"799b7bb8": "PRE_ICO_ADDR()", +"799c0468": "withdrawMarketingAndCommunityOutreach()", +"799c7b69": "_resetGame()", +"799c8ef2": "callScheduler()", +"799cd333": "sign(bytes32)", +"799d916b": "getObjectValueByKey(string,string)", +"799dcf7e": "staticArrayTests()", +"799efef0": "setLockedWalletAmount(address,uint256,bool)", +"799f0c5d": "locked_funds_for_revealed_spins()", +"799f4079": "unholdSubscriptionOffer(uint256)", +"799f7043": "recordBet(bool,uint256)", +"79a0e5be": "changeMessage(uint16,string)", +"79a18b3a": "isRoundThreeSalePeriod(uint256)", +"79a1c1f6": "proposalStatus(bytes32)", +"79a1ed16": "WithdrawalQuick(address,uint256,uint256)", +"79a2bbec": "_addResources(address[],bytes4[])", +"79a2bfa5": "PRE_SALE_MIN_BUY()", +"79a34619": "startTimeMain()", +"79a3510d": "thisVoterExists()", +"79a37bd0": "tellTime()", +"79a410a7": "bonusesOf(address)", +"79a411ff": "ScareERC20Token()", +"79a4b4bd": "sellPrice(uint8)", +"79a4ee93": "testDeregisterCustomer()", +"79a6877f": "initializeToken(string,uint256,uint256)", +"79a7cfee": "setAddress(bytes32,bytes32,address)", +"79a7de4f": "buildId(address,uint256,bool)", +"79a8416e": "checkPayment()", +"79a84750": "createTokensTo(address,uint256)", +"79a85e6c": "getProductInfo(uint256)", +"79a87b19": "migrationDestination()", +"79a88683": "startCrowdsalePhase3Date()", +"79a8945c": "isDeveloper()", +"79a89b06": "releaseExpiredEscrow(address,address)", +"79a8ba40": "createRequest(uint256,address,uint256,string)", +"79a8f2fa": "processRoulette(address,uint256,bytes32,uint256)", +"79a958c2": "codeUpdateState()", +"79a9986c": "addBadge(string,uint256)", +"79a9e9ea": "IkuraToken()", +"79a9f14d": "getBcouponBalances(address)", +"79a9f23f": "transferAllowedAdd(address)", +"79a9fa1c": "buyback(uint256)", +"79a9fd36": "SUAPPToken()", +"79aa024e": "setAirdropAdmin(address,bool)", +"79aa668d": "setEventsContract(address)", +"79ab295f": "SALE1_CAP()", +"79abb2f5": "play_paper()", +"79aca4e0": "acceptSmartTokenOwnership()", +"79ae0c0a": "updatePrice(bytes32,uint32,uint64,uint32)", +"79ae1c36": "setStopDefrost()", +"79ae77cf": "OEM_Wallet()", +"79ae9c5e": "clearLC()", +"79af55e4": "increaseLockTime(uint256)", +"79af6547": "addLockStep(uint8,uint256)", +"79af8380": "addCrowdsaleContract(address)", +"79b0797c": "AmIPlayer1()", +"79b2614d": "currentMintNonce()", +"79b37a86": "usdRate()", +"79b45b18": "removeEmployeesWithExpiredSignaturesAndReturnFadeout()", +"79b466b0": "TOTAL_TEAMS()", +"79b4a2c7": "transferMultiAddress(address[],uint256[])", +"79b5b1d1": "EvaCurrency(string,string)", +"79b7b30b": "endTrading(bool,bool)", +"79b80455": "onTimeLock()", +"79b9a060": "changePayout(uint256)", +"79ba5097": "acceptOwnership()", +"79ba50b1": "LAME()", +"79ba7b61": "ServiceCoin()", +"79baa8a9": "BasicIncome_CoFund()", +"79bae8a1": "test_failed_payment_throwing_token()", +"79bc2040": "canbuynum()", +"79bc46b3": "SELL_HARD_LIMIT()", +"79bcabf4": "Authority()", +"79bcae2a": "createFuel(uint256,string,uint256,uint256,uint256)", +"79bd04f2": "_bidLaterShip(uint256,uint256,address,address)", +"79bd42cf": "END_DURATION_BETTING_BLOCK()", +"79be02af": "Read(address)", +"79bed048": "turnOffCanUpdateAmountToTakeAsRake()", +"79bf8df3": "mModeratorKeys(uint256)", +"79bfaaeb": "visaLength(address,uint256)", +"79c0909e": "getRandomFromBlockHash(uint256,uint256)", +"79c0b9fb": "sanityCheck(uint256,uint256,int8,int8,int8)", +"79c0d5ae": "tokensInvested()", +"79c0f30e": "advancedThreshold()", +"79c12db5": "EventTicket(uint256,uint256)", +"79c20b41": "changeArtName(string,string)", +"79c30e49": "openCdp(uint256,uint256,uint256,uint256,address)", +"79c310a6": "increasePlayersJadeProduction(address,uint256)", +"79c3199d": "preIcoStartDate()", +"79c36409": "DifToken(uint256,string,uint8,string)", +"79c3dd32": "thirdLevelPrice()", +"79c3ddc1": "isPackageOwner(string,address,address)", +"79c3f694": "_getPVPFeeByLevel(uint256)", +"79c4264a": "earlyBirdMinPerPerson()", +"79c4264b": "matchCount()", +"79c597ff": "ends()", +"79c5ba97": "enterBidForGanToken(uint256)", +"79c5c6b6": "MyWill()", +"79c5cb1c": "createItem(string,uint256,uint256,uint256)", +"79c62711": "createJob(string,uint256,uint256)", +"79c63c40": "dxfOpen()", +"79c65068": "mintToken(address,uint256)", +"79c66892": "EmrCrowdfund(uint256,uint256,string,string)", +"79c69195": "setParamsTotalSupply(uint256)", +"79c6a1b8": "registerAdmin(address,string)", +"79c6b667": "registerPoA(string,bytes32,uint64[],uint64[],address,address,string)", +"79c6c11a": "takeEther(uint256)", +"79c7180d": "Erc20SummaryLogic(address)", +"79c73464": "numAdrs()", +"79c749cd": "generateContentID(string)", +"79c74a38": "Fomo5d()", +"79c7c806": "proofExists(string)", +"79c7f38c": "_freezeAccount(address,bool)", +"79c84100": "getFreezeHourglass(bytes32,bytes32)", +"79c88f20": "datacoin()", +"79c8fe30": "setMaximumGasPrice(uint256)", +"79c9e396": "test_oneInvalidEqBytes2()", +"79ca0792": "beneficiaryMultiSigWithdraw(uint256)", +"79ca9ad4": "tokensToEth(uint256)", +"79caf670": "ethealController()", +"79cb5a2f": "setEtheraffle(address)", +"79cb650f": "testAliceFooKill()", +"79cb657a": "setRateStalePeriod(uint256)", +"79cbfd18": "computeCurrentPriceImpl(uint32,uint64)", +"79cc6790": "burnFrom(address,uint256)", +"79cc90c4": "repossess()", +"79ccd1a1": "BetherBank()", +"79cce1c5": "getReleaseHashes(uint256,uint256)", +"79cd421d": "ERCTestToken()", +"79ce0515": "removeCP(address,address)", +"79ce37e1": "deadline_modify(uint256,uint256)", +"79ce9fac": "transfer(bytes32,address)", +"79cef607": "_purchaseTokens(string,address,uint256)", +"79cf3a7a": "zeroOut()", +"79d007f7": "forceOffsetExtraFeeRate()", +"79d00c5d": "EasyCrowdsale()", +"79d10a76": "SedPosToken()", +"79d116ed": "setWhiteListingAdmin(address)", +"79d1d4fa": "verify(bytes,bytes,bytes,bytes32)", +"79d220ae": "setCrowdsaleOpenTimerFor(uint256)", +"79d28ac9": "balanceOfCreator(address)", +"79d2e48d": "upgradeFinalize()", +"79d303ae": "doStart()", +"79d3d547": "grantToken(address)", +"79d42bfe": "CLNRaised(address,address,uint256)", +"79d4fe00": "totalTokensICO3()", +"79d60cdf": "LongChain()", +"79d6348d": "sign(string)", +"79d68f79": "COIN_PER_ETHER_BOARD()", +"79d88d87": "forbid(bytes32,bytes32,bytes32)", +"79d8cc7b": "setFlights(uint16[],uint16[],uint256[],uint256[])", +"79d95c5a": "setMaxCap10X(uint256,string)", +"79d9e979": "minimumDealAmount()", +"79da06a2": "BlockSwapWrapperGolemNetworkToken()", +"79da9747": "switchCrowdsale()", +"79db228a": "RegisterList(address[],bool)", +"79db5f67": "removeRole(address,uint256)", +"79db671d": "upadateContributorsCount(uint256)", +"79db77a3": "removeStaffWhitelist(address[])", +"79dbdbb9": "CKYAdv(uint256,string,string)", +"79dc04c0": "BCTVToken(uint256,string,string)", +"79dc10a6": "takeOwnershipFeePercents()", +"79dd02cb": "PerfectCoinControl()", +"79dd822a": "setSignatureRest(bytes,uint256)", +"79ded380": "setRabbitMother(uint32,uint32)", +"79df2a4c": "ReferredInvestorAddition(address,address)", +"79df4fa2": "startDeposit()", +"79df896d": "ScandinavianEKrona()", +"79e05a36": "getUintField2()", +"79e097f0": "addVotePair(address,address)", +"79e0ef1b": "withdrawBalanceAmount(uint256)", +"79e0f59a": "setEarlyParicipantsWhitelist(address[],bool[],uint256[],uint256[])", +"79e1250d": "setTotalToken(uint256)", +"79e12f7e": "getBoardByHash(bytes32)", +"79e1c9dc": "changeAmountPerEther(uint256)", +"79e1fa2e": "convertToEur(uint256)", +"79e23483": "addLockValue(address,uint256)", +"79e2bbea": "getLifeVal()", +"79e35d0b": "poolcoin(uint256,string,string)", +"79e468ef": "createLand(address)", +"79e54e6e": "AleKoin()", +"79e58973": "coinBalanceOf()", +"79e58cfd": "transferIcoship(address)", +"79e79023": "KuaiMintableToken(address,uint256)", +"79e8b8eb": "lastSubTokenCreatorOf(uint256)", +"79eaaf61": "totalTiers()", +"79eac7c3": "confirmOccupancy()", +"79eb16d4": "calculateShareETH(address,uint256)", +"79eb26cc": "RANGE_SCALE()", +"79eba0b6": "showPrivateVars()", +"79ec3864": "getMemberAtAddress(address)", +"79ec4f19": "setStartAndEndTime(uint256,uint256)", +"79ed13a7": "availableOptions()", +"79ed3d69": "setNextCommonTTMTokenId2(uint64)", +"79edfa7d": "setMetadataUrl(string,string)", +"79ee54f7": "getRewards(address)", +"79eee392": "DEVELOPERS()", +"79ef6858": "addItemToMenu(bytes32,uint256)", +"79ef704e": "addLogic(address)", +"79efb507": "oldData()", +"79f00703": "setEthartArtReward(uint256)", +"79f015b2": "getCarProductName(uint32)", +"79f0b427": "log_demurrage_fees(address,address,uint256)", +"79f0c524": "ParseHeaderData(bytes)", +"79f0cd62": "revertTokensByKYC(address,address)", +"79f0f7b3": "safeMulWithPresent(uint256,uint256)", +"79f119cd": "PXP()", +"79f1433c": "post_energy_balance(int256)", +"79f16ba1": "ShanDianLian()", +"79f1987d": "thirdExtendedBonusSalesEnds()", +"79f1a6ef": "_noMatchingPairs()", +"79f3b481": "putTreeOnSale(uint256,uint256)", +"79f57e68": "getAsAddress(bytes32)", +"79f59f09": "ParsecTokenERC20()", +"79f645ea": "RANDOMIZER_RETRY_COUNT()", +"79f64720": "cancelAndReissue(address,address)", +"79f68f85": "forwardFunds(bool)", +"79f74fd5": "ControllerSet(address)", +"79f7a873": "isAtLeast(uint256,uint256,string)", +"79f7e600": "setApproveOwner(uint8,bool)", +"79f90d6c": "ownerPauseContract()", +"79f9578c": "queryBalanceMinter()", +"79f96600": "getCurrentFeeWindow()", +"79f9b10b": "registerAsExportingAuthority(address)", +"79f9cc72": "setGasLimits(uint256,uint256)", +"79fb18ac": "transferSmartTokenOwnership(address)", +"79fc3682": "addressBalances(address)", +"79fc4687": "receiveDividends()", +"79fd86cc": "airDrop_(address,address,address[],uint256)", +"79fd8c24": "PriceUpdate()", +"79fdc915": "_decideMarket(uint256)", +"79fdf548": "updateTokenInvestorBalance(address,uint256)", +"79fe3b06": "setPercentTokensToSale(uint256)", +"79fed7cb": "checkMinContribution()", +"79ff69d9": "paymentSettle(uint256)", +"79fff7a9": "logReputationTokenMinted(address,address,uint256)", +"7a00698f": "_doProposal()", +"7a0092b5": "Aunder()", +"7a009c22": "increaseBank()", +"7a00cf46": "isCloseable()", +"7a00e2e3": "removeReferrer(address)", +"7a013105": "ico_start()", +"7a02a973": "resetStaking()", +"7a02dc06": "getInfo(bytes32)", +"7a02eb1d": "Maesawa()", +"7a039beb": "GXX()", +"7a041e7e": "fundsFromPreSale()", +"7a044323": "accumulated()", +"7a04581c": "getBetclose()", +"7a04855a": "EplusCoinToken()", +"7a04f9ea": "getPhaseExpiry()", +"7a060b53": "GOLD_AMOUNT_TPT()", +"7a07424e": "promotionRatio()", +"7a08339d": "setFakeTime(uint256)", +"7a091f95": "batchPunchIn(address[],uint64[])", +"7a09588b": "cashoutEOSBetStakeTokens_ALL()", +"7a096f53": "getTransfer(address,address)", +"7a09defe": "totalMonster()", +"7a0a2e00": "auctionEndHashing(uint256,uint256)", +"7a0b0a3f": "MAX_STAGE_1_LIMIT()", +"7a0b294c": "buyPresaleTokens()", +"7a0c396d": "giveMeNILs()", +"7a0ca1e2": "attach(address)", +"7a0d819e": "casinoDeposit()", +"7a0e03ec": "getUInt8Value(bytes32)", +"7a0e09aa": "getConsent(uint256)", +"7a0e2d1a": "updateUser(bytes32,bytes,bytes32,bytes32)", +"7a0ecfc2": "LogUpdatedInitialTimestamp(uint256)", +"7a0fee37": "MinerRandomNumber(uint256)", +"7a10f17b": "PIN_PRICE()", +"7a1126f0": "houseWithdraw(uint256)", +"7a118fdc": "SHNZ()", +"7a11dfb4": "redeemBounty(uint256,uint256,uint8,bytes32,bytes32)", +"7a12cabf": "owner_updateRelay(address,bool)", +"7a12cdb8": "cybToken()", +"7a1395aa": "setDecimals(uint8)", +"7a13d14c": "disputeAutomatedReport()", +"7a1439d7": "payOffClaim(bytes32,uint256)", +"7a14f465": "crosairSoldCount()", +"7a152c11": "unpause(uint256,uint256)", +"7a153043": "disbursements(address,uint256)", +"7a1593d6": "freeze(address,string,uint256,uint256,uint256)", +"7a15eb8d": "lottoIndex()", +"7a16c6dd": "setsetperiod(uint256)", +"7a16cbe3": "setData_4(uint256)", +"7a178741": "getMemberAddr(uint256)", +"7a17feff": "setTransferLimit(uint256)", +"7a186ebf": "WHITELISTED_PREMIUM_TIME()", +"7a1903f2": "checkBonus(uint256)", +"7a1a0604": "AuctusTokenSale(uint256,uint256)", +"7a1a7e7f": "itemCancelMarkets(uint256)", +"7a1ab407": "bountyOwnersTokens()", +"7a1ac566": "registerSale(address,address)", +"7a1aeb3c": "getTokenCount(bool)", +"7a1b26a8": "TransactionAccepted(uint256)", +"7a1b63bc": "buyCMTAgainstEther()", +"7a1bba3a": "TestFoo()", +"7a1bbb40": "getNegativeArray()", +"7a1bcae9": "playerDecision()", +"7a1bf7f6": "PreIcoClosedManually()", +"7a1c0063": "emitExecuted()", +"7a1c39cb": "setIII_R2(uint256)", +"7a1c44f8": "DappleAirdrops()", +"7a1cf806": "configureTokenDividend(address,bool,address,bytes)", +"7a1d66dd": "determinePosition(address,address)", +"7a1d8570": "getSendVal()", +"7a1e16bc": "signEscrow(uint256)", +"7a208990": "Arcus()", +"7a20ff15": "getWeiAllowedFromAddress(address)", +"7a223758": "detOwner()", +"7a22393b": "setTokenSeller(address)", +"7a233fb3": "redeemPrice()", +"7a26924f": "timeToFinishTokensSale()", +"7a2756f2": "getWager(uint256)", +"7a276bb6": "getDeveloper(uint256)", +"7a28399b": "approveProvider(address)", +"7a28e60f": "EXTRADECOIN(string,string,address)", +"7a28f8bc": "accountData()", +"7a290fe5": "burnRemainToken()", +"7a29332d": "buyAllOutcomes(uint256,uint256)", +"7a294055": "VoteReceived(string,address,uint256)", +"7a2a0456": "swapEtherToToken(address,uint256)", +"7a2a3931": "galleassetTransferFrom(address,address,uint256)", +"7a2a530d": "getAllDevices()", +"7a2b0587": "isReserve(address)", +"7a2b2dd7": "Metaexchange(address,address,address,uint256,uint256,uint256)", +"7a2b78e5": "findIndex(uint256,uint256)", +"7a2b9116": "checkValidTk(address)", +"7a2c1b71": "CheckProfit(address)", +"7a2c8506": "getUserReward(address,bool)", +"7a2cc6d8": "_createPermission(bytes32,address[],bytes4[])", +"7a2e1c61": "getSoldCountOfPackage(uint256)", +"7a2e41d1": "InitiateCryptoGamers()", +"7a2ecfdb": "setMostSent(uint256)", +"7a309005": "devSENSDestination()", +"7a30ebed": "holyFoundersFundDeposit()", +"7a3130e3": "migrateFrom(address,uint256)", +"7a314ce2": "FUND_GATHERING_TIME()", +"7a319590": "changeFees(uint256,uint256,uint256)", +"7a31ee21": "MinimumFundingGoalChanged(uint256)", +"7a32c84c": "getDonatee()", +"7a341bc7": "setFounder(address)", +"7a34cedb": "purchaseWithBTC(address,uint256,uint256)", +"7a350141": "BalanceChanged(address,address,uint256)", +"7a360ec3": "forwardWei()", +"7a3629dc": "setMinimumStakingRequirement(uint256)", +"7a362fe1": "ICO_START1()", +"7a366d14": "softCap(uint256)", +"7a37f56e": "PandorasWallet()", +"7a38012e": "handleEarlySaleBuyers(address[],uint256[])", +"7a38417b": "delayOpeningTime(uint256)", +"7a386e88": "setupAmbi2(address)", +"7a387bc2": "returnNote(uint256)", +"7a38f9eb": "isZero(uint256)", +"7a396264": "winAmount2()", +"7a3979da": "pay_money()", +"7a39bb28": "FirstPeriodCapUpdated(uint256,uint256)", +"7a3a0e84": "fundingGoal()", +"7a3aa8ea": "CoXxMoXx()", +"7a3abce9": "withdrawComB()", +"7a3b0b5d": "positive_terms_of_Service()", +"7a3c4c17": "currentPrice(uint256)", +"7a3cbbe4": "TIMER_STEP()", +"7a3d2e5c": "changeArtUrl(string)", +"7a3d4b1a": "createSwap(uint256,address)", +"7a3dae68": "_createKT(string)", +"7a3dbc16": "getInitialPrize(uint256)", +"7a3e0013": "setArbitrator0(address)", +"7a3e286b": "currentCollectRound()", +"7a3eeb57": "setdteamVaultAddr2(address)", +"7a3f5781": "setAllowRefunds(bool,uint256)", +"7a3fa650": "IONIA()", +"7a4058dd": "confirmDealCompletionByPatient(bytes16,bool)", +"7a40618d": "emitContractRemoved(address,address)", +"7a408454": "burn(bytes32,uint256)", +"7a4093b8": "SETUP_DONE()", +"7a427d98": "forceReturn()", +"7a42a9cd": "checkOwner(bytes32)", +"7a43cb62": "positionWeightOf(uint256,uint256)", +"7a442a9b": "isClaimable(string)", +"7a444072": "getDeveloper()", +"7a44d730": "PGM_Coin()", +"7a457855": "getNumeroMensajes()", +"7a468170": "ethCap()", +"7a4690fb": "TOKEN_SALE1_NORMAL()", +"7a476a42": "queryPublishedContractTemplate(uint256)", +"7a479160": "getRequestArgs(uint256)", +"7a4822d7": "addTransaction(address,uint256,string,bytes)", +"7a4843ca": "product3_luckybuyTracker()", +"7a48b408": "MCIM()", +"7a48f5c7": "start_pg_quiz(string,string)", +"7a4aa92f": "provideTeamHolderToken()", +"7a4b7075": "getMake(uint256)", +"7a4b762b": "synechronToken()", +"7a4bfebb": "FixedGameToken(bytes32,uint256,address)", +"7a4c2e9a": "access_hidden_layer(int256[],uint256[],uint256)", +"7a4c96ad": "vote(string,string,uint256)", +"7a4cac15": "removeUserAsset(address,uint256)", +"7a4e320c": "MINIMAL_PRE_ICO_INVESTMENT()", +"7a4e365d": "destroyFreezeFunds(address)", +"7a4f2fde": "decreaseSalesBalance(address,address,uint256)", +"7a4f7b92": "getInitializedFeeWindow()", +"7a4fb678": "Operation(uint8,bytes32[8])", +"7a504ceb": "endCrowdsale(uint256)", +"7a50aeb5": "ProofToken(address,address,uint256,string,string)", +"7a518d9f": "epoch_release_count()", +"7a51a611": "getOptionIdForPoll(uint256,uint256)", +"7a52ad76": "ChangeMainSaleDates(uint256,uint256)", +"7a530f03": "createPromoFlower(uint256,address)", +"7a5310b9": "confirm2stage()", +"7a53bcfc": "batchSend(address[],uint256[])", +"7a5402e9": "getPolicyData(uint256)", +"7a543a94": "isIcoFinished()", +"7a545b0c": "preIcoSold()", +"7a554786": "saveUserWallet(address,address)", +"7a55cece": "PlusPay()", +"7a55d4bd": "getCurrentBragKing()", +"7a5615c0": "changeTokensPerUSD(uint256)", +"7a58b058": "read_max_dgx_available_daily()", +"7a58ce90": "CryptoLinkNet()", +"7a5977be": "MAX_TOKENS_ADVISORS()", +"7a5984c4": "burn(uint32)", +"7a5a35ad": "setUSDEth(uint256)", +"7a5a59ec": "angelAllocation()", +"7a5b4f59": "getMetadata()", +"7a5bed43": "deleteSharedAccount(bytes32,bytes32,bytes32)", +"7a5c8432": "paymentqueue()", +"7a5c9028": "getLengthClassPlayers(uint256,uint256)", +"7a5ced61": "batchcollecttaxes(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"7a5d5345": "signControllerChange(address)", +"7a5db3f3": "renounceInvestor()", +"7a5dbc21": "ipow(int256,int216)", +"7a5df22b": "getStakedAddress(address)", +"7a5e842a": "nizk_verifyproof(string,string,string,string,string,string,string)", +"7a5f5021": "closeBets(bytes32,bytes32,uint256,uint256)", +"7a5f715c": "SetCityName(bytes32)", +"7a5f973b": "INITIAL_SUBSIDY()", +"7a62b77c": "ShowChargeTime(address,uint256)", +"7a631201": "resetEvents()", +"7a63626c": "ownerIndexToERC20Balance(address,address)", +"7a63c290": "mintCapInTokens()", +"7a645975": "InexProject()", +"7a6506f6": "dividendsPayedIndex()", +"7a6543e2": "getRegistered()", +"7a654915": "BitcoinTRONIX()", +"7a657c53": "checkVotingForSendWeiFromPayment()", +"7a6615d4": "NewPAIReceipt(address)", +"7a66e5cf": "paySolutionReward(uint256,uint256)", +"7a67011f": "setMoneyline(int256,int256)", +"7a6838ec": "ownerBank()", +"7a690951": "_endBetListing(uint256)", +"7a6994dc": "getSpaceByIndex(uint256)", +"7a69e225": "settleMissedJackpot(bytes32)", +"7a6a00bb": "balanceEthOf(address)", +"7a6a18cf": "CrowdsaleMintFinished()", +"7a6ad926": "getUint(bytes32,bytes32)", +"7a6adab6": "getAdsLength()", +"7a6b1c7c": "authAccess()", +"7a6b2a2c": "lookupAmountUserDonatedToCampaign(address,uint256)", +"7a6b456f": "countShips(uint16,uint16,uint8,bytes32)", +"7a6b8361": "zeroBytes()", +"7a6ba98c": "getHashKey(address,uint256)", +"7a6c7783": "_consume(address,uint256)", +"7a6cb1aa": "getReceiverVesting(address,address)", +"7a6ce2e1": "getMsgSender()", +"7a6d6f3d": "gettormow()", +"7a6d8030": "BLOCKMALL()", +"7a6e1384": "priceForBuyingCostume()", +"7a6e2b49": "payService(bytes32,address,address,uint256)", +"7a6e5949": "getwithdrawEthertoAmountValue()", +"7a6e9df7": "getTimestamp(bytes)", +"7a6e9e41": "withdrawSellDemand(uint256)", +"7a6ee304": "IAMRefundedForWei(address,uint256)", +"7a706ac7": "setBuyRatio(uint256)", +"7a70abda": "updateAvatar(uint256,uint256)", +"7a71055d": "setAvgMinedPerDay(uint256)", +"7a713023": "finalizeSettingDeprecation(uint256)", +"7a71dee0": "onePotWei()", +"7a72416f": "security_address()", +"7a72c30d": "checkMilestoneStateInvestorVotedNoVotingEndedNo()", +"7a72c32f": "Paraboloid()", +"7a740a68": "communityReservation()", +"7a74b672": "clearEndpoint(bytes32,int256)", +"7a766210": "XYZA()", +"7a766460": "getStake(address)", +"7a773293": "setMarketingRates(uint8,uint8,uint8)", +"7a783d91": "Leeroy(address)", +"7a78cccc": "DAMIToken(address)", +"7a78ee2c": "lastBlock_a12Hash_uint256()", +"7a791524": "setNextFeePercentage(uint8)", +"7a792fa0": "get_reward(uint256)", +"7a79940d": "getSharedAccountPw(bytes32,bytes32)", +"7a7cdfa9": "createT(string,string,string,string,string,string,uint256,uint256)", +"7a7d4937": "secondsPerBlock()", +"7a7ebd7b": "channels(bytes32)", +"7a805504": "getAuditReportBlockNumber(uint256)", +"7a80760e": "ERC20Token()", +"7a81f972": "releaseCelebrity(uint256)", +"7a824b1d": "cooperativeSettle(uint256,address,address,uint256,address,address,uint256,bytes,bytes)", +"7a827634": "_emitContractAdded(address,address)", +"7a828b28": "terminate(uint256)", +"7a837213": "setAllowedAccount(address)", +"7a83e89e": "_endBetBlock()", +"7a840a52": "PKBCoin()", +"7a84d13e": "getNumberOfCandidates()", +"7a852c7e": "transferTokensWei(address,uint256)", +"7a8566ae": "richToken()", +"7a85c02a": "tokensOfEdition(uint256)", +"7a85e031": "finalizeInternal()", +"7a86d3d6": "addWithdrawTransaction(address,uint256,bytes)", +"7a872547": "defaultInput()", +"7a875ade": "fishPromoHelpers(address)", +"7a87f51a": "emergency_eth_withdraw()", +"7a888ca9": "startOptionsSelling()", +"7a88aabb": "getAddressOfTokenUsedAsReward()", +"7a899cdc": "_setPermission(address,address,bytes32,bytes32)", +"7a89d33e": "testdynamic_income(uint256,uint256)", +"7a8a5cf3": "totalMigratedIn()", +"7a8a8720": "firstUnitStartTime()", +"7a8b0114": "setA_ASM(uint256)", +"7a8b089b": "developerFundDeposit()", +"7a8bd25a": "get_bet_nfo(uint256)", +"7a8bd93e": "flipRewardAmount()", +"7a8df1b9": "getAffiliateInfo(address)", +"7a8e3d8d": "withdrawEth2Wallet(uint256)", +"7a8e832f": "MyBalance()", +"7a8f7be6": "HAYATO_EXTRACTION_BASE()", +"7a8fa666": "addPoweruser(address)", +"7a8fe3b1": "getProductBuyersWithUnconfirmedRequests(uint256)", +"7a9036cd": "registerFixedToken(bytes32,uint256,address)", +"7a906be0": "createAuction(uint256,uint128)", +"7a90a7a3": "feeBurnerWrapperContract()", +"7a9110d5": "klik()", +"7a91d5f9": "dilutePower(uint256,uint256)", +"7a91e53d": "isNotSelf(address,address)", +"7a926165": "manageAdmins(address,bool)", +"7a927429": "TokenValue(uint256,string,uint256)", +"7a935644": "I30Token()", +"7a93b917": "Lirux(string,string,uint256,string)", +"7a943538": "Victory()", +"7a954d5d": "investedInPreICO()", +"7a95e305": "escrowedForAsset(bytes32)", +"7a95f174": "CGT()", +"7a960154": "numOfPurchasedTokensOnCsBy(address)", +"7a9839c2": "fun(uint256)", +"7a99b018": "withdrawClient()", +"7a99ba4f": "investETH(address)", +"7a99bb0a": "_getTokenAmount(uint256)", +"7a9a032d": "addProposal(string,uint256,uint256,string,string)", +"7a9b0412": "setChainlinkOracle(address)", +"7a9b486d": "deposit(string,string)", +"7a9c960b": "DayDayToken(address)", +"7a9d366a": "debug_bool(bool)", +"7a9db28a": "_setPriceFactor(uint256)", +"7a9df8c0": "sellChickenParkCoin(uint256)", +"7a9e19de": "nextOffsetIndex()", +"7a9e5e4b": "setAuthority(address)", +"7a9ee2dc": "SogetiCoin()", +"7aa064ef": "intersubuser(address,uint256)", +"7aa0eb97": "LogSendTokens(address,uint256,string)", +"7aa11238": "Flow(uint256,string,string)", +"7aa1688e": "setUser(address,string,string,bool,bool,bool)", +"7aa1a77d": "rawWipeAttributes(bytes32,bytes32[])", +"7aa2096a": "setPI_edit_15(string)", +"7aa2bcd6": "bonusCompaignOpen()", +"7aa306a2": "numOwnerAddress()", +"7aa3295b": "trusted(address,address)", +"7aa356af": "phaseTwoRate()", +"7aa359f8": "changemem(uint256,bytes32)", +"7aa3803c": "takeRent(address)", +"7aa3976f": "DragonStone()", +"7aa3b39b": "_vest(address,uint256)", +"7aa3f6cb": "setKyberProxyAddress(address)", +"7aa3ff67": "AlterMediatorSettings(address,uint128)", +"7aa41ed5": "getNumPieces()", +"7aa50c56": "performDifferent(address,address[],uint256[])", +"7aa5a1a8": "set_eth_as_seeded()", +"7aa63a86": "getTotalElements()", +"7aa86e2f": "fetchProfit()", +"7aa98fb3": "timeLock(address,uint256,uint256)", +"7aa9a7f9": "getNumberThree()", +"7aaa3470": "getInterest(address)", +"7aaae78c": "preSaleBonus1Amount()", +"7aacd17d": "MyToken(string,string)", +"7aacf03c": "auctionIndex()", +"7aada63b": "maxEarlyStage()", +"7aae42c9": "endIcoPreICO()", +"7aaeb37c": "SimpleTGEContract()", +"7aaf334d": "offFreeze_Bounty(address)", +"7aaf58d7": "creatUserPurchase(address,address)", +"7aaf87d2": "getallresutl()", +"7ab0089e": "YiLiaoLian(uint256,string,string)", +"7ab03c25": "reserveTokensProjectAndFounders()", +"7ab0b998": "signRecoveryChange(address)", +"7ab13461": "decreasePrice(uint256)", +"7ab13ba9": "isProgress()", +"7ab14aae": "createBattle(address,uint256[],bytes32,uint256)", +"7ab21613": "getStopReceive()", +"7ab2af2b": "isRegistrationOpen()", +"7ab38e88": "issueTokensPresale(address,uint256)", +"7ab42bbd": "grantXPTokens(address,uint256)", +"7ab4e968": "oneEDG()", +"7ab528c9": "revokeDelegate(address,string,address)", +"7ab5e1e1": "reservedTokensFunctionality()", +"7ab61372": "totalRunePurchased()", +"7ab672c4": "GrabRedHarvest()", +"7ab7a9fa": "aurasCompatible(uint64,uint8)", +"7ab7ab2e": "AcceptsHalo3D(address)", +"7ab7d55b": "calculateHash(uint256,uint256,uint256,bool,bytes32)", +"7ab7e492": "RANGESTART_2()", +"7ab7fa9f": "UBEX()", +"7ab91b3a": "hash(uint64[8])", +"7ab96fda": "testBalanceCanbeWithdrawn()", +"7aba2249": "StoppableMock()", +"7aba4d23": "delToken()", +"7aba6f37": "setLock()", +"7aba86d2": "bonusMax()", +"7abaf552": "nexium()", +"7abb03bc": "noticeWinner(uint8)", +"7abbe9c0": "DEFAULT_GAME_COST()", +"7abc06aa": "tokensPerCents_gte50kUsd()", +"7abcc5bc": "bidInfo(string)", +"7abccac9": "getTokenMetaData(address)", +"7abdf949": "getUpgradePrice(uint256)", +"7abe24d4": "Firechain(uint256,string,string)", +"7abeb6a0": "createMarket(address,address,uint24)", +"7abec356": "Deposit(address,uint256,int256)", +"7abf75fd": "CFNDCrowdsale()", +"7ac02331": "ethMultisigWallet()", +"7ac07dcc": "isCaller(address)", +"7ac1cb30": "setbili(uint256,uint256)", +"7ac26aeb": "getTag(string,uint256)", +"7ac37d58": "ownerTransferEther(address,uint256)", +"7ac3c02f": "getSigner()", +"7ac40b10": "thedate()", +"7ac4b05e": "returnMyMoney(uint256)", +"7ac4ed64": "getAddress(address,bytes32)", +"7ac59d43": "getSellerSignature(string)", +"7ac5bb54": "getFlight(uint16,uint16)", +"7ac5d8a9": "RoundNumber()", +"7ac6e6a8": "objectHelmet()", +"7ac7ef85": "Msg()", +"7ac81da5": "useProps(uint256[],uint16[],uint16[])", +"7ac8dc26": "subFundPrecent()", +"7ac91cc2": "testFailOwnedAuth()", +"7ac94409": "sixthExtendedBonusSalesEnds()", +"7ac9f013": "removeVal(address,bytes32,address)", +"7aca84a1": "createVaultAccess(uint256)", +"7aca97b5": "changeDeadline(uint256)", +"7acb3e67": "EthTraderDAO(address,bytes32,address,address,address)", +"7acb4b0f": "isGroupInPolicy(bytes32,bytes32)", +"7acb7757": "stake(uint256,address)", +"7acbfb65": "setOwner(uint256,uint256)", +"7acc0b20": "products(uint256)", +"7acc6f74": "addSingleAddressToWhitelist(address)", +"7acc8678": "transferAdminQuickly(address)", +"7acd0412": "newInvest(address,uint256,uint256)", +"7ace341b": "getCurrentOwner(uint256)", +"7ace41f2": "CoinvestToken(uint256)", +"7ace58d8": "changeBranch(uint256,uint8)", +"7acee816": "claimIFactor2(bytes32,bytes32)", +"7acf16c3": "findLowestBenefactor()", +"7acf4892": "isNotPaused()", +"7ad00589": "getAffiliateSenderPosCode(uint256)", +"7ad06be3": "recycleAppearance(uint128[5],uint256)", +"7ad0bf86": "exchangeRegulatorWallet()", +"7ad1428d": "m_record(string)", +"7ad157b9": "buy(uint256,address,bool)", +"7ad226dc": "refund(uint256,address)", +"7ad2856f": "info(string,uint8)", +"7ad28c51": "changeTimeLock(uint256)", +"7ad2a0ce": "doAirDrop(address[],address,uint256,uint256)", +"7ad3c119": "ContractInfo()", +"7ad3def2": "updateToken(address)", +"7ad4b0a4": "setAttribute(address,bytes32,bytes,uint256)", +"7ad53eae": "sani()", +"7ad59e20": "end_Dec_21_2017()", +"7ad5a045": "_ReparameterizationProposal(address,string,uint256,bytes32)", +"7ad77fd9": "firstWeek()", +"7ad7e846": "robocoinToken()", +"7ad8800f": "ShowPrice(string)", +"7ad9642f": "changeMiniumBet(uint256)", +"7ad979a3": "setupFund(string,address,uint256,uint256,address,address,address,address[],address[],uint8,bytes32,bytes32)", +"7adaa3f8": "right39(uint256)", +"7adac0e6": "stopTransfers()", +"7adb7ced": "ekkoBlock(uint256,string,uint8,string)", +"7adbf973": "setOracle(address)", +"7adc22d8": "bujankkoin()", +"7add0106": "initBronze()", +"7addc766": "ADDR_MAYA_MARKETING()", +"7ade8d6a": "Totti(string,string,uint256,uint256)", +"7adec1c9": "DepositAcceptedEvent(address,uint256)", +"7adee0e3": "setJoinDelta(uint256)", +"7adfec71": "allTasksCount()", +"7adff2cb": "auth(uint8,bytes32,bytes32)", +"7ae046d5": "joinGame(uint256,address,string)", +"7ae0c915": "SmartBondsSale()", +"7ae11443": "getCurrentStakingPeriod()", +"7ae145cb": "Badge(uint256,string,uint8,string)", +"7ae15a19": "createKingdom(string,uint256,uint256,uint256,uint256)", +"7ae1cfca": "getBool(bytes32)", +"7ae26546": "setApprovedContractAddress(address,bool)", +"7ae26773": "revokeAllowance(address,address)", +"7ae2a331": "goldenTicketFound(address)", +"7ae2aa34": "teamVestingStage()", +"7ae2b5c7": "min(uint256,uint256)", +"7ae316d0": "getTotalFee()", +"7ae38a95": "isDestructionStarted()", +"7ae488c3": "priceOfPlayer(uint256)", +"7ae4bff8": "changeStage(uint256)", +"7ae506ac": "minimumPurchaseValue()", +"7ae5dfe5": "TTC(uint256,string,uint8,string)", +"7ae68ada": "getReferralCode()", +"7ae6b763": "updatePartner1_will(string)", +"7ae7024c": "_realBalanceOnToken(address)", +"7ae74432": "PhilToken()", +"7ae77ecf": "onlyBouncerCreateContract(bytes)", +"7ae79345": "ZeroChain()", +"7ae79e86": "crowdfundEndsAt()", +"7ae81801": "userUpgradeElement(uint256,uint256,uint256)", +"7ae8b321": "withdrawGNT(uint256)", +"7ae8c854": "getMaturity(bytes32)", +"7ae9c430": "getMinFunds()", +"7ae9c856": "getassignTokensperType(uint8)", +"7aeaa864": "storePhoto(string)", +"7aeabb39": "lastPaymentDate()", +"7aeb0763": "habichnet()", +"7aeb9500": "getAutoInvestStatus(address)", +"7aec05b6": "TemroyToken()", +"7aec2277": "ValueCyberToken()", +"7aece878": "receiveObject(uint256,address)", +"7aef1cdc": "airDropDestinations(address)", +"7aef1d4d": "setMinEther(uint256)", +"7aef2226": "MIKETANGOBRAVO18Crowdsale(uint256,uint256,uint256,address,uint256,uint256,uint256)", +"7aef951c": "bid(string)", +"7aefec13": "followTraderPreSignedHashing(address,address,bytes32,uint256,address,uint256)", +"7af05516": "claimRewardTillRound(uint64)", +"7af0ed7e": "NewStatic()", +"7af1337b": "updateCrystal(address)", +"7af20a0a": "LITECORE()", +"7af2a28e": "createContractElement(string,uint256)", +"7af30442": "testToggleBitFailIndexOOB()", +"7af327a0": "deposito()", +"7af3670c": "NewToken()", +"7af52ade": "collectEntryFee()", +"7af5878e": "safeSend(address,address)", +"7af5dc37": "safeSub(int256,int256)", +"7af85411": "DisableReturnFunds()", +"7af8b87d": "verificationRate()", +"7af8c4f2": "changeTokenSaleAddress(address)", +"7af91032": "getPoolDoneCount()", +"7af915af": "setResourcesBanker(address)", +"7afa0c66": "lockedMonsterStatsCount()", +"7afa1eed": "generator()", +"7afa8388": "transferFromWithReferenceCallGas()", +"7afbe4f1": "Add(uint256,uint256)", +"7afc84df": "NKHOIToken()", +"7afcb524": "foundersBalance()", +"7afd4762": "auctionPriceLimit()", +"7afde96b": "isInPreSale()", +"7afea44f": "kycManager()", +"7aff5061": "penalizeNode()", +"7afff425": "reclaimAllocated()", +"7b01127c": "getValue(bytes32,bytes32)", +"7b012ff6": "IcoCap()", +"7b015ff7": "crowd_start_date()", +"7b019f89": "squareRoot(uint256)", +"7b02347d": "distributeRef(uint256,uint256)", +"7b02b2c9": "sendMsg(address,string)", +"7b02b6de": "initialChargeFee(uint256)", +"7b02f6e1": "_vote(address,address,uint256)", +"7b0383b2": "initializeDispute(uint256)", +"7b039576": "setCreditStatus(bool)", +"7b039bb6": "createVariation(uint256,uint256)", +"7b03e5f0": "_getUint(address,bytes32)", +"7b0472f0": "stake(uint256,uint256)", +"7b04a2d0": "onApprovalReceived(address,uint256,bytes)", +"7b04b1f8": "prePaidFee()", +"7b053195": "testItems(bytes)", +"7b05d785": "redeemTokens(string)", +"7b069edb": "createNewGame(string,uint8,uint256[],uint256[])", +"7b06e907": "teamAddressOne()", +"7b07788e": "removePrecondition(uint256)", +"7b0862e1": "getLatestSettingId(uint256)", +"7b0863de": "beginClosingPeriod()", +"7b087636": "testToUint96()", +"7b088543": "setDollarForOneEtherRate(uint256)", +"7b0934ab": "KRTR()", +"7b0a2340": "issueBook(uint8)", +"7b0a3a8d": "maxRecords()", +"7b0a47ee": "rewardRate()", +"7b0a7bf8": "disableContactMint(address)", +"7b0b5b93": "MannaCoin(address,address)", +"7b0c15ff": "ApolloSeptemStarted()", +"7b0de015": "teamTokensAddress()", +"7b0f6f18": "executeArbitrage(address,uint256,address,bytes)", +"7b0f94ed": "advisoryEthWallet()", +"7b103999": "registry()", +"7b10a1d9": "changeInviteReward(uint256)", +"7b10b293": "requestMembership()", +"7b10e717": "received_wei()", +"7b1278e9": "setStageLength(uint256)", +"7b129c48": "TrueTHB()", +"7b12df39": "userProfits()", +"7b12e074": "getSiringWithId(uint256)", +"7b144a84": "testFunded(uint256)", +"7b146f6f": "contributorPoolAddr()", +"7b15013c": "JPPreICO()", +"7b151be0": "market_WithdrawWei()", +"7b169f8c": "refBonusOf(address)", +"7b16c028": "HumaniqICO(address,address,address)", +"7b16f7a0": "transferAll(uint256,address,address)", +"7b1707ee": "sendAliceBlue(address,uint16,uint256,bytes)", +"7b1760da": "computeCertHash(address,bytes32)", +"7b17e543": "user(uint32,uint32)", +"7b1837de": "fund(address,uint256)", +"7b19bbde": "fundValues(uint256)", +"7b1a4909": "transferETH(address,uint256)", +"7b1a547c": "registerAs(address,string,uint256,string,address)", +"7b1aa45f": "ownerDeposit()", +"7b1ae67a": "OrganicumOrders()", +"7b1b0c8a": "isWeekdayInsideTimestamps(uint256,uint256,uint256)", +"7b1b1de6": "pricePerToken()", +"7b1bc329": "bountySend(address,uint256)", +"7b1bd162": "NatureSeedToken()", +"7b1c5368": "fetchVoteMainInfoForVoter(address)", +"7b1c6c83": "MangGuoToken(string,string,uint8,uint256)", +"7b1c88be": "transferIncome(address,uint256)", +"7b1cbb13": "getChannelValue(bytes)", +"7b1cdd4f": "withdrawWallet3()", +"7b1e855a": "setBountyCoin(address)", +"7b1e8871": "_transferBilrew(address,address,uint256)", +"7b1f1f83": "SgdToWeiRateSet(uint256)", +"7b1f337d": "endingBlock()", +"7b23f37d": "ownerRandomNumber()", +"7b24343e": "salvageOtherTokensFromContract(address,address,uint256)", +"7b2454c2": "InvestmentAnalytics()", +"7b24d867": "TokensImport(address,uint256,uint256)", +"7b253fe6": "getWithdrawableAmountAS(address)", +"7b2581c2": "totalPurchase()", +"7b25aeca": "totalLimitUSD()", +"7b25de45": "isNewToken()", +"7b25ec58": "getTierTokens(uint8)", +"7b2643f2": "receiveNVT(uint256,uint256)", +"7b266b21": "durationh()", +"7b26de4b": "newPlayer(address,uint256,address)", +"7b26ff88": "JuryMemberAdded(string,address)", +"7b274afc": "stopIco()", +"7b27739c": "LSCKcoin()", +"7b283b71": "RATE_TIER1()", +"7b28aa4c": "orderCancel(address,uint256,address,uint256,uint256)", +"7b292909": "square(uint256)", +"7b294495": "lastActiveTs()", +"7b2abb34": "doProveMemoryRead(uint256,bytes32,bytes32[])", +"7b2b24e9": "isCurrentOrPastUser(address)", +"7b2bff9d": "getRobotsForUser(address)", +"7b2c5148": "catReleaseToPrice(uint32)", +"7b2c8905": "FailedToClaim(address,uint256)", +"7b2ca96c": "ProdPresale()", +"7b2d1b30": "getDragonPriceNo()", +"7b2d3b27": "getStageDiscount(uint8)", +"7b2e0046": "createAddress(bytes32,address)", +"7b2e5086": "withdrawFounderFunds()", +"7b2feaaa": "blockStart()", +"7b30074d": "trustedCancelOrderTransfer(address,address,uint256)", +"7b303965": "getStats(uint256)", +"7b304179": "createMainNetContract(uint256,uint256)", +"7b3051db": "get_minimum_trade()", +"7b30de25": "setConfig(string,string)", +"7b316db2": "enterBidForCollectible(uint256,uint256)", +"7b3179bc": "setEconomyParameters(uint128,uint128,uint128,uint128,uint128,uint128,uint128)", +"7b317ef6": "payoutPendingWithdrawl(uint256)", +"7b31db17": "intMax()", +"7b327104": "addBidToStack(bool)", +"7b32daf8": "contractTimeout()", +"7b3303b1": "startcrowdsale()", +"7b33e01a": "increaseApproval(address,uint256,bytes,string)", +"7b33fa25": "confirmReturn()", +"7b34203d": "getNumberOfDisputedStepsProPatient()", +"7b352962": "isFinished()", +"7b35819f": "setPresaleEndDate(uint32)", +"7b362143": "inactive_withdrawable()", +"7b36277e": "tier2Total()", +"7b367343": "IPv7Token()", +"7b370a01": "crowdsaleDistributedUnits()", +"7b37b6a3": "RAXToken()", +"7b38f391": "p1_white_duration()", +"7b3941d7": "Redeem(uint32)", +"7b395487": "voteForUltimateOutcome(bytes32,uint16)", +"7b3aa441": "contributeWithAddress(address)", +"7b3ae1f1": "addClaim(string)", +"7b3bfc35": "setRound(uint256,uint256,uint256,uint256,uint256,bool)", +"7b3c24ac": "compensate(uint256,address)", +"7b3ca1c6": "registerNameXname(string,bool)", +"7b3cf41a": "setExplosivePower(uint256,uint256)", +"7b3d398f": "getTicketHolderCount()", +"7b3d9338": "market_is_open()", +"7b3e2ce0": "BuyTicketUseVaultSeed(uint256)", +"7b3e5e7b": "amountRaised()", +"7b3ed808": "withdrawlOwner()", +"7b3f0fb7": "updateRevertSuspendedPayment(bool)", +"7b3fdcd8": "removeVerifier(address,address)", +"7b40b291": "RetractRoutingNS(bytes32,bytes32,uint256,bytes)", +"7b4126f4": "buyContent(bytes32,uint256,uint256,bytes8,string,address)", +"7b413985": "tokenValueInEther(uint256)", +"7b422184": "giveBirth(uint256,uint256)", +"7b424c0d": "changeRelease12m(address)", +"7b42f6f7": "intervalAt(uint256,uint256,int256,uint256)", +"7b436460": "Kubic()", +"7b436fa4": "garanteSystemDepositInOneFund()", +"7b43a8e6": "commits(address)", +"7b43adfb": "checkBalanceContract()", +"7b449206": "changeClearance(uint256,uint256,uint256,uint256,bool)", +"7b44eb51": "UPO(uint256,string,uint8,string)", +"7b464e93": "prescriptions(bytes32)", +"7b46b80b": "unfreeze(address,uint256)", +"7b473783": "EcoValueCoin()", +"7b47457f": "MintTokens(address,uint256)", +"7b47cb68": "lifeFactor_ii()", +"7b47ec1a": "burnToken(uint256)", +"7b48ba20": "testThrowDisownNotOwner()", +"7b48de6b": "returnTransactionPrices(uint256)", +"7b4938c3": "LinkNaturePower()", +"7b49e4c0": "DelphyToken(address[],uint256[])", +"7b4b5e4e": "changeYUMAddress(address,address)", +"7b4fcdcf": "GetAccess(address)", +"7b4fd96e": "token_price()", +"7b5005e8": "ZRXToken()", +"7b50a573": "functionOne(uint256,uint256,uint256,uint256)", +"7b510fe8": "getAccountInfo(address)", +"7b51c463": "hasDebris(bytes32,uint8)", +"7b523c35": "request(address,address,bytes,bytes,uint256,uint256)", +"7b5330a7": "getEntitlement()", +"7b540dd2": "ChangeHold(address,address,uint256,uint8)", +"7b54a994": "safeAdd(uint256,uint256,uint256,uint256)", +"7b550233": "deathData_v18()", +"7b55c8b5": "scheduleCall(address,bytes4,bytes,uint8,uint256[4])", +"7b55f66e": "manualCloseBet(uint16,uint16)", +"7b563e3a": "hourPotLeader()", +"7b564b7f": "test_insert_updateTail()", +"7b568081": "trade(address[],uint256,uint256)", +"7b575b33": "operate(bytes)", +"7b58120f": "preSaleSecondStartDate()", +"7b5825d5": "get_amount_buy(uint256)", +"7b58d46e": "changeWikiID_Name(uint256,string)", +"7b58d7ee": "Jawn()", +"7b599b5b": "COOLBTCEXCHANGE()", +"7b59af16": "registerName(string,address)", +"7b5a08c5": "TradeList(uint256)", +"7b5bc2e4": "isVoted()", +"7b5bd741": "getIdentityWallet(address)", +"7b5bee1d": "_getItem(uint256)", +"7b5c7b7b": "privilegedTransfer(address,uint256)", +"7b5cc75d": "lastDividendTime()", +"7b5d2534": "semaphore()", +"7b5d5d1a": "halvingStartBlock(uint256)", +"7b5e400d": "recipientsMap(bytes32)", +"7b5eb564": "approveWithData(address,uint256,bytes)", +"7b5ecb32": "test_twoValidEqUint2()", +"7b5f4fc9": "get_all_attender()", +"7b5f7267": "getTokenPriceUSDWEI()", +"7b61b201": "getHouseCard(uint8)", +"7b61c320": "tokenSymbol()", +"7b627879": "Conference()", +"7b632c41": "TimestampScheduler(address,address)", +"7b641fbc": "getMembers(bytes32)", +"7b647652": "LittleEthereumDoubler()", +"7b647d72": "BITIC()", +"7b65d0ec": "initialBuyCard(uint8,string,string,string)", +"7b663d30": "ChangeClaimAmount(uint256)", +"7b66c032": "HashBuxICO()", +"7b66da95": "calLast5RoundProfit(uint256)", +"7b66e17f": "getDonator(uint256)", +"7b6750bf": "getTokenDelegate(uint256)", +"7b680deb": "SpiceUpPrizePool(address,uint256,string,uint256)", +"7b68533f": "earlybird_percentage()", +"7b68a8f0": "getPixelColor(uint256)", +"7b698602": "NEXMESH()", +"7b69db5c": "increment(int256,int256)", +"7b6a3e27": "out2Done()", +"7b6a6f4a": "roundUp(uint256)", +"7b6a912c": "etherCost()", +"7b6ae58f": "AMICoin()", +"7b6b3f46": "preMining()", +"7b6c0492": "allowanceSubId(address,uint256,uint256)", +"7b6c4b27": "BidRevealed(bytes32,address,uint256,uint8)", +"7b6c4dc7": "AgriChainProductionContract()", +"7b6c7a14": "transferAuthorship(address,bytes32)", +"7b6ccf85": "LogRefund(bytes32,address,uint256)", +"7b6d79f1": "cancelBet()", +"7b6d7a4a": "VoteIntentionSet(uint256,bool,bool)", +"7b6e49a8": "fetchVoteNumForVoterByIndex(uint256,address)", +"7b6e7603": "levelClearTime()", +"7b6e8740": "changeCATDestinationAddress(address)", +"7b6f5a4c": "getCurrentRoundMinimumTime()", +"7b6ff689": "setImmediateAllowancePercentage(uint8)", +"7b70209f": "isBeneficiary()", +"7b7054c8": "__approve(address,uint256,address)", +"7b707e9c": "getNumberOfCreatedTokens()", +"7b70cdcd": "dayFor(uint256,uint256)", +"7b70ed51": "setAngelDate(uint256)", +"7b71aec8": "ethPropagate()", +"7b7330cc": "return_eth()", +"7b73aef8": "setNote(bytes32,bytes32)", +"7b73c2ef": "defaultDeadline()", +"7b74644d": "WKToken()", +"7b74e5c3": "buyByAddress(uint256,uint256)", +"7b755373": "amountPercentage(uint256,uint256)", +"7b75a302": "MatContract()", +"7b75ea7b": "rewardPayableDays()", +"7b760537": "updateLatestRevision(bytes20,bytes32)", +"7b7670f6": "gasForXaurDataUpdateAtBlock()", +"7b76ac91": "day()", +"7b775ec3": "wallet89()", +"7b777517": "teamVestingStages()", +"7b777ecc": "getMaxReportsPerLimitedReporterMarket()", +"7b77bbc8": "dyn_call(address,bytes)", +"7b789b3d": "agreement(bytes,bytes,bytes)", +"7b7a43eb": "setMINfinney(uint256)", +"7b7a720a": "chrissycoinToken()", +"7b7b81c5": "loikikdi()", +"7b7c343d": "setRequiredConfirmations(uint256)", +"7b7ccc66": "burnSaleTokens()", +"7b7d4655": "releaseTokenCornerstone()", +"7b7d6c68": "setController(address,address)", +"7b7d7225": "_approve(address,uint256)", +"7b7d8888": "permanentlyOwnMyCompany(bytes32)", +"7b7e97f1": "isIncluded(uint256,uint256)", +"7b807a51": "devTimeLock()", +"7b80889b": "lockedBalance()", +"7b80a0ca": "endEarlyStage2()", +"7b8108c6": "isIn(address,address[])", +"7b813089": "team4Token()", +"7b816719": "testToInt(bytes)", +"7b81c3cd": "claimIcoContribution(address)", +"7b8208b7": "destroyUselessContract()", +"7b821410": "createPlotVineyard(address)", +"7b8239fa": "fun3()", +"7b82d9ee": "canDouble(address)", +"7b830854": "unlockTokenTransfers()", +"7b831c30": "isRoundEnded(uint256)", +"7b834bcc": "marketTime()", +"7b841eff": "turnOffCanUpdatePercentToTakeAsSeed()", +"7b84de4e": "StarFishCoin()", +"7b851f65": "hasIcoEnded()", +"7b86120a": "foundersReserve()", +"7b865061": "CAPToken(address)", +"7b87312a": "timeToOpenPresents()", +"7b875aab": "addrSale()", +"7b891cf7": "YBCLiveToken()", +"7b898c71": "_checkLoanBalance()", +"7b89a582": "Management()", +"7b89eef2": "getMyAverageDividendRate()", +"7b8a1898": "setStore(string)", +"7b8ac66b": "deliver(uint256,uint256)", +"7b8b7364": "isAddressVerified(address,address)", +"7b8b82a8": "createManyProxies(uint256,address,bytes)", +"7b8bf4fd": "set_fee(uint256,uint256,uint256)", +"7b8c0e0f": "offlineExchange(address,uint256)", +"7b8cfbe1": "howManyEtherInWeiToKillContract()", +"7b8d56e3": "setValue(uint256,uint256)", +"7b8d771e": "_buyTicket(uint256,address)", +"7b8d9930": "AxieDependency()", +"7b8de6d0": "executeTokenFallback(address,uint256,bytes)", +"7b8e3514": "allowedValidators(address,address)", +"7b8e7964": "JPGToken()", +"7b8e8bdd": "modifyCloseTime(uint256)", +"7b8eeb96": "StarMarket()", +"7b8f186e": "updateIdx()", +"7b8f2e07": "addCreature(uint16,uint8,uint8)", +"7b8fa867": "setAllowedAdd(address)", +"7b8fac4f": "AC(uint256,string,string)", +"7b907094": "solidityCompileVersion()", +"7b926c2a": "IFSBalances(address)", +"7b929c27": "development()", +"7b92a2de": "Reservation(address)", +"7b93253c": "validateClaim(address,bytes32)", +"7b9358a0": "changeRegistrationStatuses(address[],bool)", +"7b936934": "artistFees()", +"7b936ac2": "getCFO()", +"7b9417c8": "addAddressToWhitelist(address)", +"7b94ffb5": "grantBounty(address,uint16,string)", +"7b9504d5": "_isOwner(address,uint40)", +"7b965785": "EVER()", +"7b969dcd": "_checkPixelAboveLeft(uint256)", +"7b97008d": "purchaseTokens(uint256)", +"7b979b41": "leakEther()", +"7b97c621": "Transferred(bytes32,address,address)", +"7b9884b9": "addallrunmoney(address[],uint256[])", +"7b991c1a": "findEmptySlot(uint32)", +"7b9940b6": "initambassadors_()", +"7b9a3f4c": "TotalFunds()", +"7b9a9926": "RESToken()", +"7b9b9c89": "augmintToken()", +"7b9c34e0": "requestRN(uint256)", +"7b9c4756": "SanchitToken()", +"7b9c5794": "test_YayIsOverSixtyPercent()", +"7b9c7437": "LUCToken(uint256)", +"7b9daba8": "wa()", +"7b9dbf95": "FulfillmentAccepted(uint256,address,uint256)", +"7b9dc066": "tokenTransfersFrozen()", +"7b9e5bec": "getAsBytes(uint256,uint256)", +"7b9e9073": "buyLimitSupplyMin()", +"7b9f87d3": "Setup(address,address)", +"7b9fa595": "_getCrowdsaleTokenAmount(uint256)", +"7ba016d0": "icoDiscountLevel2()", +"7ba04809": "assertFalse(bool,string)", +"7ba0e2e7": "mint(bytes)", +"7ba121ff": "EventBonusPercentChanged(uint256,uint256)", +"7ba1e407": "tokenBack(address[],uint256[])", +"7ba201c5": "refundSingleUser(address)", +"7ba22e1e": "changeWorkerBalance(address,uint256)", +"7ba36880": "_secondLevelEth()", +"7ba38916": "changeAdminFromBoard(address)", +"7ba3c804": "AiEXToken()", +"7ba3f08d": "grantPermissionTo(address)", +"7ba46004": "totalRuneWithdrawn()", +"7ba49b81": "lastMintedTimestamp(address)", +"7ba4a58a": "addressToken()", +"7ba5f145": "mod256(uint256,uint256)", +"7ba64e40": "removeBeneficiary(address,uint256)", +"7ba70bf2": "gettoken(address)", +"7ba79848": "processReferral(address,uint256,uint256)", +"7ba7acc9": "initTokenSale(address,address,uint256,uint256,uint256,uint256,uint256)", +"7ba7dcea": "setRefundable()", +"7ba8c064": "VotedEvent(uint256,address,bool,uint256,string)", +"7ba8c12d": "addWhitelistUser(address,uint256)", +"7ba992fc": "PeriodicTokenVesting(address,uint256,uint256,uint256,uint256,bool,address)", +"7baa4524": "emptyRemainingsToOwners()", +"7baa73c6": "_updateCreditedPoints(address)", +"7bab59f4": "feedTransfer(address,address,uint256)", +"7babf021": "RLCOIN(uint256,string,string,bool)", +"7babfffc": "transferDelegation(address)", +"7bacd526": "withdraw_admin(uint256)", +"7bacfb0c": "PresaleEndTimeChanged(uint256)", +"7badc7af": "gaveVote(address)", +"7bae0585": "approveMany(address[],uint256[])", +"7bae3f27": "changeTransferFeeOwner(address)", +"7bae50e0": "mintGen0Spinners()", +"7baf5b84": "startUnlock()", +"7baf71f9": "claimPrizePool(address,uint256)", +"7bb050cf": "migratePlayerPhrasesData(uint256,uint256,uint256)", +"7bb0688d": "claimedUsers()", +"7bb0aefe": "hasAuthoritySignedMainToSide(address,address,uint256,bytes32)", +"7bb0b3c6": "checkifCapHasReached()", +"7bb1a312": "transferToTeam(address,uint256)", +"7bb1efa1": "manualInitializeTreasure(uint256)", +"7bb20df6": "isExistingBattle(string)", +"7bb25d60": "withdrawInProgress()", +"7bb26a1b": "ethFoundDeposit()", +"7bb305ef": "set_foundtion_addr(address)", +"7bb31dbb": "calcBetResult(uint256,bytes32)", +"7bb333d6": "EBankerICO(address)", +"7bb34a23": "bva(address,uint256,uint256,address)", +"7bb3546b": "hgs()", +"7bb3ca86": "addReferralHashrate(address,uint256)", +"7bb43e6e": "returnUnsoldSafeXLarge()", +"7bb4493c": "FBI()", +"7bb476f5": "getAvailableAmount()", +"7bb4c4da": "nAuditorsAlarm()", +"7bb55287": "assignRaffleWinner(address)", +"7bb5e1d1": "Cowboy()", +"7bb6a4c6": "uno(uint256)", +"7bb6fc6b": "LoveToken(uint256,string,uint8,string)", +"7bb7adb6": "hugeContributionBound()", +"7bb866c1": "GetBoosterCount()", +"7bb8c4e5": "setCut(uint16)", +"7bb96acb": "getBlockHeight()", +"7bb98a68": "balances()", +"7bb9c776": "ticket(bool)", +"7bb9dc13": "setPublicSaleWallet(address)", +"7bba0613": "attackCountry(uint8)", +"7bbb3a60": "inactivityTimeout()", +"7bbba97e": "CreateEstate(address)", +"7bbbd75b": "_getNow0()", +"7bbbe9fd": "claimGameReward(address,uint256,uint256)", +"7bbc101b": "distributionStart()", +"7bbc33f0": "vet(address,bool)", +"7bbc5c01": "calcRefund(address)", +"7bbc816e": "UTCToken(uint256,string,string,uint256)", +"7bbd3f19": "removeLastRace()", +"7bbf2300": "claimAccountOwnership(string,string,uint256,uint256)", +"7bbf4a3f": "callers(address)", +"7bbfb0bd": "startTokenPriceWei()", +"7bbfbaee": "MAX_SUPPLY_USPN()", +"7bc046ef": "ClaimRemoved(address,address,bytes32,uint256)", +"7bc0e005": "setDirectDebit(bool)", +"7bc0ff20": "setupExportFee(address,uint256)", +"7bc120c2": "isView()", +"7bc14a67": "Initial_Supply()", +"7bc21b6b": "bbAdvisorWallet()", +"7bc25372": "UserCheckBalance(address)", +"7bc25da8": "Alaves()", +"7bc363f9": "serviceTransferOwnership(address)", +"7bc36e04": "setPrivateSalePrice(uint256)", +"7bc49a95": "play(uint256,uint256)", +"7bc4be40": "isGlobalLock()", +"7bc4d6a6": "testInitial1of3()", +"7bc58805": "balanceFinney()", +"7bc5af10": "getAwarding(address,bytes32)", +"7bc62dc3": "ALD()", +"7bc69bbc": "getBonusByRaised()", +"7bc6a02e": "isAutoridadElectoral()", +"7bc6aa07": "omniTeamAddress()", +"7bc74225": "getTotalStake()", +"7bc76388": "test_set_owner()", +"7bc775db": "GxOwned(address)", +"7bc835da": "UpdateConfirmed(address,address,uint256)", +"7bc8649f": "NewTKLNToken(address)", +"7bc89ae7": "registerNameXNAME(string,address)", +"7bc9165b": "offchainPayment(address)", +"7bc94872": "FinishReceivingContributions()", +"7bc9d4ba": "TielseEendrachtCombinatie()", +"7bc9eb8c": "p_setSoft_deadline_duration(uint256)", +"7bca38be": "heartbeatTimeout()", +"7bcaf585": "checkSignature(string,uint32,string,string,bytes32,bytes32,uint8)", +"7bcc1ff6": "allowanceInternal(address,address)", +"7bcc9c6f": "sendBackTokens()", +"7bcd7fad": "getRecordAtIndex(uint256)", +"7bcdc2f0": "_forwardApprove(address,uint256,address)", +"7bcdfd4f": "setEpochData(uint64,uint64,uint256)", +"7bce366f": "minBlockPurchase()", +"7bce89cc": "currentMarketRate()", +"7bd13f08": "recoverAddressFromBalanceProof(uint256,bytes32,uint256,bytes32,bytes)", +"7bd1a731": "deleteIdentity(string,string)", +"7bd216c6": "teamAddressThree()", +"7bd2593d": "XfiniteUtility()", +"7bd26969": "ChannelNew(address,address,address,uint256)", +"7bd2bea7": "gem()", +"7bd352b7": "relay(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32,uint8,uint128)", +"7bd379b3": "PaymentProcessed(address,uint256,uint256)", +"7bd3acbb": "pointArrayOf(uint256)", +"7bd53618": "TaiyuanCoin()", +"7bd63411": "defaultPercent()", +"7bd6c0e4": "setMigrationHost(address)", +"7bd703e8": "getBalanceInEth(address)", +"7bd7c0ac": "armyDronesCount(uint256)", +"7bd7c891": "becomeFalconmaster()", +"7bd85cb3": "LZLTokenDeposit()", +"7bd95a85": "rewardPoints(address)", +"7bd97ca7": "editMemeTemplate(uint256,string)", +"7bd9e8fd": "CTO_SHARE()", +"7bd9f47a": "Best_Bank_with_Interest()", +"7bdb7a90": "setCdRate(uint256)", +"7bdbab0c": "tokenMintInit()", +"7bdc011e": "Pray4Prey()", +"7bdc297c": "TimeLockedWallet(address,address,uint256)", +"7bdc60d9": "getTokenById(uint256)", +"7bde5628": "addNuja(address)", +"7bde7fcf": "maxApenSell()", +"7bde82f2": "redeem(uint256,address)", +"7bdef3f8": "gameMiningTokenCap()", +"7bdf9d56": "MANHATTANPROXY5THST()", +"7be00510": "lastInvest(address)", +"7be122a3": "isSchoolAllowed(uint256)", +"7be1e747": "initAddress()", +"7be266da": "isRegisteredInPreviousEpoch(address)", +"7be296d8": "filmamount()", +"7be2d5a2": "setDropNumber(uint8)", +"7be33b36": "getSoundcoinsAddress()", +"7be34109": "diffMonths(uint256,uint256)", +"7be4ce4b": "updateRngAddress(address)", +"7be4ed55": "fixPayAmt()", +"7be5b5ae": "setBuyDirectMode(bool,address)", +"7be68454": "optionsRegistryAddress()", +"7be6d2de": "transferToContract(address,uint256,bytes,bool)", +"7be80b39": "forceWithdraw()", +"7be8352e": "getPixelCount()", +"7be8630f": "lastHotPotatoHolder()", +"7be8f86b": "done(address)", +"7be96b1a": "AAA(address,uint256)", +"7bea7112": "TheOneToken()", +"7beb2e1e": "minNumbPerSubscr()", +"7beccd70": "revokeTransferManager(address)", +"7becd54a": "destErc20()", +"7bedcb7f": "DemirPara()", +"7bee30ce": "createSspAndChannels(address,uint256,string,address[],address[],uint256[],address,string,bytes,uint32[])", +"7bee86d6": "lastImageId()", +"7beeb945": "isRole(address)", +"7bef29f7": "BittechToken()", +"7bf08621": "payTo(address,uint256)", +"7bf0a8f3": "operationsTokens()", +"7bf0cd0d": "getTargetBlock(uint256)", +"7bf0e054": "getLotteryDetailsB(int256)", +"7bf1648a": "setContract(uint256,address,address)", +"7bf1a627": "ethToken()", +"7bf1ca1f": "TransferToken(address[],uint256,uint256)", +"7bf212f8": "getCondition(uint256)", +"7bf21aa4": "generatePresaleHouses()", +"7bf21ab8": "sellPBTTAgainstEther(uint256)", +"7bf26182": "calculateVestedTokens(bool,uint256,uint256,uint256,uint256,uint256,uint256)", +"7bf2bb10": "arbiters(address)", +"7bf3f900": "gameManagerPrimary()", +"7bf437e6": "transferCoinUserToUser(address,address,uint256)", +"7bf47cda": "cancelSellOrder(address,uint256,uint256,uint256,uint256)", +"7bf4b18f": "tokenSetMintFeeAbs(address,address,uint256)", +"7bf57ca8": "_taxesDue(address)", +"7bf5b04b": "processDividends()", +"7bf5b5d6": "distributeWalletTokens()", +"7bf6f26e": "setMaintenanceMode(bool)", +"7bf796dc": "SmartAgreement(bytes,address[])", +"7bf92690": "changeArrangerFee(uint256)", +"7bf992ac": "GoodKarma(uint256,string,uint8,string)", +"7bf9d052": "firstRankForFree()", +"7bfa6e1a": "gameShouldRestart()", +"7bfaad96": "addNode(bytes,address)", +"7bfb0934": "value(bytes32)", +"7bfbe091": "creatorRejectRequestFundTransfer(uint256)", +"7bfbfecb": "BurnCoin()", +"7bfe950c": "withdraw(address,address,uint256,uint256)", +"7bfe97ce": "IBMISOFT()", +"7bff0a01": "createRandomZombie(string)", +"7bff9797": "canTeamKeepingWithdraw(uint256)", +"7c0012d4": "ZiipToken()", +"7c0081f5": "petCardSeriesCollection(uint8)", +"7c0176df": "starUp(uint256,uint256,uint256,uint256)", +"7c0207cb": "isActiveTranscoder(address,uint256)", +"7c024fe2": "getNowTimestamp()", +"7c027ed9": "bonus01Start()", +"7c02e1ea": "addressChangeBlock()", +"7c03d6f9": "ApprovalFlower(address,address,uint256)", +"7c051d47": "seedSaleFinished()", +"7c052478": "setSports3DContract(address)", +"7c05ba7a": "accreditInvestor(address,address)", +"7c05caf3": "testCreateCostAuth()", +"7c0656ac": "LogEtherBounty(address,uint256,string)", +"7c06db04": "doManualTrade(address,address,uint256)", +"7c06eb7c": "IGTRMB()", +"7c0712ae": "setAdd(bytes32,address)", +"7c07329f": "returnUserBalance(address,address[2],uint256[8],uint8,bytes32[2])", +"7c078723": "saleExchangeRate4()", +"7c08ab5b": "BITToken()", +"7c098bc3": "getBonusPercent(uint256)", +"7c0a893d": "blockAccount(address)", +"7c0ab7be": "setBidding(uint40,uint256)", +"7c0b2484": "enableInviteOfSU(string)", +"7c0b582f": "WORLD1Coin()", +"7c0b8de2": "NFT()", +"7c0c19b3": "zrcoin(uint256,string,uint8,string)", +"7c0cc0be": "setActivator(address)", +"7c0d021e": "CreateIssue(uint256,uint256,uint256,address)", +"7c0e2a5a": "SetLockDate(uint256)", +"7c0efb8b": "revokeManagerPermission(address,string)", +"7c0f6b35": "getAllMembers()", +"7c0f884b": "SlidebitsTestToken(string,string)", +"7c0fbc31": "signedTransferCheck(address,address,uint256,uint256,uint256,bytes,address)", +"7c0ff00c": "WithdrawTokensToBankroll(uint256)", +"7c1008d5": "getLastTipTime(address,bytes32)", +"7c108f84": "UBToken()", +"7c10e00e": "setMinBetForOraclize(uint256)", +"7c116ec9": "respectRequiredToRecruit()", +"7c11ef87": "calcUSE(uint256,uint256,uint256)", +"7c1288b5": "distAgent()", +"7c129c1c": "voteXId(uint256,bool)", +"7c12b6f2": "_handleWin(uint256,uint256)", +"7c12f1a4": "addgamecard(string,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"7c132f2c": "crossForkBlockNumber()", +"7c134a38": "DetailedERC20()", +"7c13b331": "OysterShell()", +"7c13ed68": "setIPGInfo(address,address)", +"7c153534": "tokenFrom()", +"7c157d12": "_synthesizeWith(uint256,uint256)", +"7c1595f2": "setLockupContract(address)", +"7c161409": "BetexToken(uint256,uint256)", +"7c163fb8": "myLoveBlocks()", +"7c170237": "ElectroneumGold()", +"7c1716af": "payToken(bytes32,uint256,address,bytes)", +"7c17357d": "totalVesting()", +"7c17dc02": "AddFish()", +"7c183b4b": "LogRef(address,address)", +"7c18a32f": "deductionToken(address,uint256)", +"7c194295": "BurnableTokenMock(address,uint256)", +"7c197c09": "fullSupplyUnlocked()", +"7c19e1f0": "replaceInFrontRequest(address,uint256)", +"7c1a35d7": "RECYCLE_TIME()", +"7c1a4ee8": "SITExchanger(address,address,address)", +"7c1b6afe": "getGrantCount()", +"7c1b814f": "openCrowdFunding(bool,uint256,uint256)", +"7c1c05dd": "gapInPrimaryCrowdsaleAndSecondaryCrowdsale()", +"7c1c7860": "TMEDsalesToken()", +"7c1e5ced": "transferTemp(address,uint256)", +"7c1f9d5e": "tokenFeeMin()", +"7c204c27": "MinerX()", +"7c21ae12": "activeShareholdersArrayLength()", +"7c21c7e2": "getToggleOwner(uint256)", +"7c22232a": "playersPoints(address)", +"7c236c3b": "confirmStackholderTransaction(uint256)", +"7c23d1cb": "removeLevel(uint256)", +"7c2464f3": "startICOTime()", +"7c24b295": "votedYes()", +"7c24dfb0": "FundTransfer(address,string,uint256)", +"7c25d997": "getRarityValue(uint256)", +"7c25f260": "Government()", +"7c261929": "query(string)", +"7c262269": "isWorkFailState()", +"7c265200": "NameGame(uint256,uint256,uint256)", +"7c267b07": "Cryptrust()", +"7c280f44": "generate_random(uint256,string)", +"7c28ddc1": "fiatPerAssetUnit()", +"7c2926a8": "getHTLCHash(uint256,uint256,uint256,bytes32,int256)", +"7c29c514": "AgroeconomyToken()", +"7c29e89a": "mintUnlockTimeBatch(address[],uint256[],uint256)", +"7c2b00fc": "SGCL()", +"7c2b07e3": "EtherX()", +"7c2b11cd": "arraySum(uint256[])", +"7c2b606a": "isAddressManager(address)", +"7c2b8d0a": "votedFreeze(address)", +"7c2cf543": "ROLCToken()", +"7c2d2326": "PostIL()", +"7c2d86f7": "usePluginWhitelist()", +"7c2da7aa": "setValue(string,uint256)", +"7c2db5ff": "payoutX(address,uint256)", +"7c2e08a3": "isMinimumGoalReached()", +"7c2eb1c8": "distributeEther(uint256,uint256)", +"7c2efcba": "v()", +"7c2ffbb3": "returnRate()", +"7c3064f1": "refundStake()", +"7c313baa": "buyPriceAtIndex(uint256)", +"7c31975f": "SolClub()", +"7c320853": "initialSale()", +"7c331b52": "FlightDelayAddressResolver()", +"7c337086": "CryptoDegree()", +"7c33774d": "CluckCoin()", +"7c3382ae": "setIcoTokenExchangeRate(uint256)", +"7c33ebfd": "transferToMany(address[],uint256[])", +"7c34689b": "ACchainToken()", +"7c34752f": "stringToSig(string)", +"7c34e853": "getCombinedTotalHP(uint256,int256)", +"7c35384f": "addTradeRecord(uint256,uint256,uint256,uint256,address,address)", +"7c359dc3": "manualTokenTransfer(address,uint256)", +"7c35b6ed": "setPriceBeforeGoalReached(uint256)", +"7c35be7a": "isOpen(bytes32)", +"7c360d1e": "calculate(uint16,uint8)", +"7c3625e3": "SatoExchange()", +"7c366cb5": "LADToken()", +"7c372277": "ReserveTokensHolder(address,address,address)", +"7c37559e": "CreateGLX(address,uint256)", +"7c37605c": "startSellingGenes(uint256,uint256,address)", +"7c377d74": "getForkReputationGoal()", +"7c38ce18": "tokensIssuedLocked()", +"7c38ee53": "addContactRecord(string,string,string,address,string,string,int256,string,int256,address,string,int256)", +"7c396b83": "f6()", +"7c39759b": "kscBurnWhenMoveToMainnet(address,uint256,string)", +"7c399142": "ITSToken()", +"7c3a00fd": "interestRate()", +"7c3a1d32": "setWithdrawCreator(address)", +"7c3aef0e": "cardDescription(uint8)", +"7c3b1e06": "setcompany(string,uint256,string)", +"7c3ba89e": "early_bird_minimal()", +"7c3be5fb": "setVernamOriginalToken(address)", +"7c3bf42d": "applications(address)", +"7c3c0f89": "eastadsCredits()", +"7c3c2611": "Retained(address)", +"7c3c4c83": "ARBITRAGECrowdsale(address,address)", +"7c3d30fd": "_bid(uint256,uint256)", +"7c3e50ff": "balanceLocked(address,address)", +"7c3eef61": "AbyssToken(address,address[],address)", +"7c3fe278": "endSto()", +"7c3ffdee": "awardCup(uint8)", +"7c405325": "unlockTokens(uint256)", +"7c4057ae": "removeMasterNodes(address,uint256)", +"7c41de34": "_AwardedMissedBlockBonus(address,address,uint256,bytes32,uint256,uint256)", +"7c423f54": "getAlerters()", +"7c4338af": "getEarlyIncomeBalance(address)", +"7c434fbb": "AT(uint256,string,uint8,string)", +"7c435e6f": "updateEursPerEth(uint256)", +"7c436a6d": "ownerEnableRefunds()", +"7c437918": "addPreSaleBuyer(address,uint256)", +"7c44066c": "summCashwolf()", +"7c44546e": "SiliconValleyToken()", +"7c44f160": "Tier_Starter_Registration()", +"7c45c98a": "removeSpectatorBetFromGladiatorBattle(uint256)", +"7c45ef6c": "stringToSig(string,string)", +"7c46a5e7": "Unhalted()", +"7c4734f4": "getParticipantsHash(address,address)", +"7c475ade": "IOV()", +"7c479343": "investSum()", +"7c47965e": "isInCurrentGeneration()", +"7c47ac44": "getProjectVerification(uint256)", +"7c47df2f": "removeEligibleBurner(address)", +"7c48bbda": "tokensIssued()", +"7c48f8e7": "penaltyFraction()", +"7c4a0552": "freezeBlocks()", +"7c4a7831": "concludeSeason(int8,uint256,uint256)", +"7c4aa44c": "saleStartEpoch()", +"7c4b414d": "depositTokens()", +"7c4c27c8": "isThisPuritanicalVersion()", +"7c4cafd9": "startSecondaryCrowdsale(uint256)", +"7c4d18bd": "setMockBool(bytes4,bool)", +"7c4d972b": "setRoundEnd(uint256,uint256)", +"7c4db77d": "saleWallet()", +"7c4deecb": "checkGameContinues()", +"7c4e7fbb": "QKL()", +"7c4ecead": "startPresale(uint256,uint256)", +"7c4edde7": "withdrawFrom(address,address,address[])", +"7c4f8958": "SPECIALIST_STAKE_ONE()", +"7c513a21": "arrIdx2lost(uint256)", +"7c519ffb": "setTrading()", +"7c524b2e": "set_sell(bool)", +"7c52b934": "getTokenOrder(uint256)", +"7c535f1f": "bonusAmount(uint256,address)", +"7c54aa1a": "deployCommunityBallot(bytes32,bytes32,uint128)", +"7c559d5f": "bonusPattern(uint256)", +"7c567bfe": "isSale(address)", +"7c56b798": "addProject(address)", +"7c56d40b": "LogFunderInitialized(address,address,string,uint256)", +"7c57ad45": "newAsset(string,uint256,string,string)", +"7c57d947": "tokenMinter(uint256)", +"7c5817e1": "indexOfProvider(address)", +"7c582304": "updateInvestmentTotal(address,uint256)", +"7c58a4ed": "canPlatformFundingWithdraw(uint256)", +"7c59cb3d": "setCSInterface(address)", +"7c59f828": "getWizzType(uint256[2])", +"7c5b4a37": "adminWithdraw(uint256)", +"7c5b5b06": "lastProcessedVaultId()", +"7c5bfe81": "INITIAL_EXCHANGEABLE_TOKENS_VOLUME()", +"7c5c2cef": "nPolls()", +"7c5ca5a6": "ICOFY()", +"7c5d4949": "calcInvesting(address)", +"7c5d7980": "addRC(address)", +"7c5df29b": "auctionDeklaEnd(address,uint256,uint256,bytes)", +"7c5e16fd": "MAX_ALLOWED_BY_STAGE_2()", +"7c5e2795": "INITIAL_PRICE()", +"7c5e6949": "setlvlUpdate(string)", +"7c5e83cc": "Bullex()", +"7c609885": "allowWorkersToContribute(address,address[],address)", +"7c60fa60": "minReq()", +"7c612409": "setClient(address,address,string,string,string)", +"7c61b482": "coinAgeRecordForAddress(address,address,uint256)", +"7c61d567": "transferRegion(uint256,uint256,address)", +"7c622a65": "TEBT()", +"7c623ce2": "boughtWithWhitelist()", +"7c62965e": "excess_withdraw()", +"7c62e2a4": "getDog(uint256)", +"7c63144e": "TokenUsed(uint8,uint8)", +"7c645c21": "getPlayerLength()", +"7c64a45c": "TOTAL_VOTE_PERIOD()", +"7c64ac43": "vestingEnds()", +"7c652e26": "CENT_DECIMALS()", +"7c654303": "isFunded()", +"7c65452c": "newValue()", +"7c65f503": "initVault()", +"7c66ae22": "play(uint256,uint256,address)", +"7c674695": "MarkedAsScam(address,address,uint256)", +"7c67fb9f": "MIN_STARTING_PRICE()", +"7c67fdf5": "bltOwnedAcc()", +"7c67ffe7": "ownerSetBankroll(address)", +"7c686c15": "setBonusPrice()", +"7c68bebe": "getUserDepositsAmount(address)", +"7c68e078": "_createMonster(uint256,uint256,uint256,uint256,uint256,bytes,address)", +"7c68ec4c": "_compareStrings(string,string)", +"7c695384": "bet(uint8,uint256)", +"7c699401": "getAllRevisionIpfsHashes(bytes32)", +"7c69b5d1": "NewDeposit(uint256)", +"7c69ef8d": "market2020TokenCreated()", +"7c6aafd1": "getRegularCarsForVariant(uint256)", +"7c6ac2af": "withdrawal_Lem(uint256)", +"7c6b2d6a": "setV_R1(uint256)", +"7c6b5b10": "amountFirst()", +"7c6bd3e8": "preGrant(address,uint256)", +"7c6bd96d": "extendStart(uint256)", +"7c6db9b5": "changeMinimumWei(uint256)", +"7c6e19a8": "UpdateTokenDailyExchangeAmount(address,address,uint256)", +"7c6e481c": "bancorChanger()", +"7c6e5809": "AEZtoken()", +"7c6e607d": "SuicideContract()", +"7c6e94e3": "migrationStarted()", +"7c6eb7bb": "generateNewRandom()", +"7c6fa5c2": "attackPrizeRatio(address)", +"7c6fb02a": "getCrydrViewStandardName()", +"7c6fb59d": "updateCreditBalance(address,uint256,uint256)", +"7c6fdec5": "getStrategyTokenPrice(uint256,uint256)", +"7c6fe7a9": "getAddressIdArray(address,uint256,string,string)", +"7c709fbe": "mxrjjToken()", +"7c70b205": "windowLength()", +"7c70c444": "DOXToken()", +"7c70e791": "removeInspector(address)", +"7c70e7fe": "currentRewardReleasePercentageRatePerYear()", +"7c71c0eb": "getIsProjectBonus()", +"7c7202e5": "setReceiver2()", +"7c72d868": "sendDividendsEthers()", +"7c72e273": "auctionFinalize(bytes32)", +"7c73f846": "getMinimumEndowment(uint256,uint256,uint256)", +"7c74d4d4": "JCCoin()", +"7c759d0d": "lock(address,uint256,uint256,uint256,uint256)", +"7c75c1b4": "distributeWithPolicy(address,uint256,uint8)", +"7c774111": "OF()", +"7c77b7c4": "getNumberOfDisputedDealsProDoctor()", +"7c77fad6": "AddMatch(string,string,uint256)", +"7c78cb13": "decrementQuantity(uint256)", +"7c7959e0": "CryptoNumismat()", +"7c796a83": "setGasUsage(uint256)", +"7c799e90": "str2bytes(string)", +"7c79c167": "stageHardcap(uint8)", +"7c79ebce": "expired(uint64)", +"7c7a52bf": "newChallenge(uint256,address)", +"7c7b0ff4": "getRide(uint256)", +"7c7b13b0": "PlayX50()", +"7c7c7695": "getAccountID(address)", +"7c7c7c3c": "SUPER_ADMIN()", +"7c7ce7df": "mintToPool(uint128,uint256,uint128)", +"7c7d14cf": "getPawnId(uint256)", +"7c7d809b": "saleEndUnixTime()", +"7c7dc098": "early_supporters_distribution(address[],address,address,uint256)", +"7c7dd391": "TokensWithdraw(address,address,uint256)", +"7c7ead51": "Wscchain(uint256,string,string)", +"7c7edd68": "PRHXToken()", +"7c7eeaa1": "hirerLastResortRefund(bytes16,address,address,uint256,uint256)", +"7c80bb4f": "getNameByAddress(address)", +"7c80feff": "getTokenIndicies(address,address[])", +"7c812015": "HedgeCoinCapitalToken()", +"7c81ff56": "TGE_SUPPLY()", +"7c8255db": "sendGifts(address[])", +"7c82a1d4": "reserveKY()", +"7c82eff7": "getZero(uint256)", +"7c831bd9": "rateCoefficient()", +"7c83b25c": "gettimelineandgoal()", +"7c83fdf7": "createFiatInvestorRequest(uint256)", +"7c842e5e": "updatePriceFromRealUnicornPrice()", +"7c84b40c": "makePrivate()", +"7c84c69b": "assertEq(bytes32,bytes32)", +"7c853cc1": "WithdrawFromKickTheCoin()", +"7c857566": "destructGame(address)", +"7c858e02": "smallestUnit()", +"7c85a757": "updateGooConfig(address)", +"7c85ab3a": "boardMemberCancel()", +"7c85df24": "setWHaddress(address)", +"7c871d31": "setIcoDates(uint256,uint256)", +"7c88e3d9": "mintBatch(address[],uint256[])", +"7c89e504": "removeSomeEthers(uint256,address)", +"7c8af704": "resolveRound()", +"7c8b1fa2": "ShNShToken()", +"7c8c2234": "pushMilestone(uint16,string,string,uint64,bool)", +"7c8c6643": "unhint(bytes32)", +"7c8d56b8": "numeraiTransfer(address,uint256)", +"7c8db773": "CSE()", +"7c8dc575": "rejectConsent()", +"7c8de59a": "DCM(uint256,string,uint8,string)", +"7c8e040f": "confirmAtkBossQuest(address)", +"7c8e17e5": "teamOneTotalPlayers()", +"7c8e4e25": "credosReserveAccount()", +"7c8e8e69": "MarkLesterMiranda()", +"7c8f76a1": "issueTokens(address[],uint256[])", +"7c8f8278": "setTotalTokenSupply(uint256)", +"7c8ff8ac": "tokenProof(uint256)", +"7c905c9f": "preICOprice()", +"7c9143c9": "_hash(uint256,bytes32)", +"7c91e4eb": "DISTRIBUTION()", +"7c92a217": "c_MinFunds()", +"7c930a10": "ETHERECASHTOKEN(uint256,string,string)", +"7c935183": "test_deposit()", +"7c937700": "revokeAllVulnerable()", +"7c9473f6": "sellNoDecimals(address,uint256)", +"7c94830b": "kairosOwner()", +"7c9542bd": "LogWalletUpdated(address)", +"7c955583": "pendingWhitelistHash(address[])", +"7c95ef3f": "privatePlacementSupply()", +"7c9677be": "allocateTeamToken()", +"7c968f5d": "get_token_data_buyable(uint256)", +"7c96f680": "MyAdvancedToken(uint256)", +"7c97479b": "cardSupply()", +"7c976dbd": "tokenCreationCapOverall()", +"7c97ffe2": "DeusToken()", +"7c987ba4": "getMemberPayed(address)", +"7c989b45": "setBonus(uint256,uint256,uint256,uint256,uint256,uint256)", +"7c996d9e": "IndiaStocksCoin()", +"7c99922d": "founderTokensVested()", +"7c9b0892": "lnUpperBound(uint256,uint256)", +"7c9b387b": "maximumClaimPriceWei()", +"7c9c3d89": "mintCoinsForOldCollectibles(address,uint256,address)", +"7c9cbd38": "changeTeamTokens(address)", +"7c9cd7df": "changeDeveloper_only_Dev(address)", +"7c9d564f": "_pRand(uint256)", +"7c9d8bdb": "getBetsByCategory(bytes32)", +"7c9f4941": "SplitSend(address,address)", +"7c9fe2a7": "train2(uint256)", +"7ca005b3": "generateProof(string,address,address,uint8)", +"7ca013e6": "getRateToPxlAmount(uint256,uint256)", +"7ca01b2a": "getTestFour()", +"7ca1a66c": "resumeLotto()", +"7ca1cb48": "approveCurrencyTokenAddress(address,bool)", +"7ca21b37": "setMinPersonalCap(uint256)", +"7ca24d95": "changeEndTime(uint64)", +"7ca2795f": "AdvanceQueue()", +"7ca31724": "tokenId(address)", +"7ca54248": "lastSaleInHGT()", +"7ca55e00": "etherandomVerify(bytes32,bytes32,bytes32,uint256,uint256)", +"7ca5d8fa": "read_u8()", +"7ca60997": "rewardComment(address)", +"7ca63061": "LibraCreditNetwork(uint256,string,uint8,string)", +"7ca64683": "hasFiveStepWithdraw()", +"7ca823d5": "getAverageChainWork()", +"7ca828d0": "_canBreedWith(uint256,uint256)", +"7ca9429a": "getOfferCount(address,address)", +"7caae38c": "calluseraddress(address,address)", +"7cab5e8c": "removeApproval(address)", +"7cab9ba2": "setReceiver()", +"7cac4c7d": "JOY()", +"7cac9736": "computeResult()", +"7cad997f": "purchaseByEMONTImpl(uint16,uint256,uint64,address)", +"7cae6cb5": "determineEdition(uint256)", +"7cae8509": "delete_blockedAddress(address,address)", +"7caf3115": "MovieWorld()", +"7caf59d9": "addPullRequest(bytes32,bytes32,uint128)", +"7cb04b87": "running_id()", +"7cb070c7": "OPL()", +"7cb1442c": "f1(uint256,uint256)", +"7cb1bb0b": "setOraclizeGasExtraArtwork(uint32)", +"7cb25bc7": "dividendCount()", +"7cb2b79c": "setTokenManager(address)", +"7cb2c15b": "getTXdatabyCode(bytes32)", +"7cb34d2d": "register(bytes32,bytes32,bytes32,string)", +"7cb46307": "NewContent(bytes32)", +"7cb4e22a": "IEIP165()", +"7cb4ef0e": "getHashRateOf(address,uint256)", +"7cb51761": "setMaxPayments(uint256)", +"7cb56698": "rescueLostFighter(uint256,address)", +"7cb5d0ef": "Airchain(uint256,string,uint8,string)", +"7cb6a6b2": "generateContract(uint256,uint256)", +"7cb6b35d": "adjustLimitBetweenIssueAndNormal(uint256,bool)", +"7cb6cf3e": "ETH_SIGN_PREFIX()", +"7cb8adc7": "s9(bytes1)", +"7cb916b9": "withdrawAlltokenFunds(address)", +"7cb91d84": "slots_left()", +"7cb97b2b": "set_owner(address)", +"7cb9cf54": "removeSeller(address)", +"7cb9da88": "setIncludes(uint256,uint256)", +"7cba3f04": "PriceWeekThree()", +"7cbab0cb": "updatewallet(address)", +"7cbae071": "setPresalePerEth(uint256)", +"7cbb6934": "generateRandomNum()", +"7cbba335": "get_order_book_length(string)", +"7cbbf1da": "proofType_Native()", +"7cbc2373": "redeem(uint256,uint256)", +"7cbc4eb6": "lost(uint256)", +"7cbc6903": "totalBidCount()", +"7cbcc254": "__reset__()", +"7cbd3508": "_unpackExpValue(uint256)", +"7cbd5444": "isPriv()", +"7cbd9e8d": "existCaller(address)", +"7cbe0f32": "addOpenAction(string,string,string,string,string)", +"7cbe9e41": "DANKSIGNALS()", +"7cbf2bdc": "CapFlexed(uint32)", +"7cbfb8a5": "TransferTokens(address,uint256)", +"7cc07974": "HFTCrowdsale(address)", +"7cc08d53": "partProvider()", +"7cc0c3a7": "controllers()", +"7cc0e670": "freezeAccountForContract(address,bool)", +"7cc1303a": "trade(uint8[2],bytes32[4],uint256[7],address[6])", +"7cc1c640": "getActualPriceOfCardOnBuyAuction(uint256)", +"7cc1e28d": "setValidatorRewardPool(bytes32,uint256)", +"7cc1f867": "getContractInfo()", +"7cc2fe49": "setResourcesPrimaryManager(address)", +"7cc35d99": "historyIt()", +"7cc3ae8c": "endAt()", +"7cc3b48e": "withdrawKrowns(address,uint256)", +"7cc3beb2": "acceptArbiter()", +"7cc48875": "Slots()", +"7cc49427": "RemoveLock(address,uint256)", +"7cc4e55f": "lowestAskPrice()", +"7cc4ef14": "purchaseLand(uint256,uint256,uint256)", +"7cc589f9": "BlocklancerEmploymentContract(string,address)", +"7cc666da": "MoratoriumTransfers(uint256,address[],address[])", +"7cc9e4f0": "registerParticipant(address)", +"7ccaa9fa": "calcMerkle(bytes32[],uint256,uint256)", +"7ccc5aea": "DSPParametersChanged(address)", +"7ccc7e94": "inv_contract()", +"7ccce851": "isBlacklistedUser(address)", +"7ccd099d": "test_32_assertGasUsage100Boards()", +"7ccd3f79": "setAA(uint256)", +"7ccec110": "TestWorldSnapshot(uint256)", +"7ccefc52": "minimumMakerProtocolFee()", +"7ccf0d44": "_setAuctionObj(address,uint256,uint256)", +"7ccfd45a": "removeSubUser(address)", +"7cd022d4": "gen0PresaleLimit()", +"7cd07e47": "migrator()", +"7cd208b6": "requestRefunding()", +"7cd30fe3": "MarketingDevelopmentAddress()", +"7cd3229a": "board()", +"7cd3969d": "getUnsoldReceived(uint256,address,address)", +"7cd44272": "getConversionRate(address,address,uint256,uint256)", +"7cd4559c": "_rewardApprovers(address)", +"7cd49414": "participate(address,string,bytes32[],bytes32[])", +"7cd49fde": "_counter()", +"7cd50577": "setTradable(bool)", +"7cd64c79": "AdvancedERC20(uint256,string,string)", +"7cd6a7fd": "setSettings(uint256)", +"7cd73941": "withdrawBAT(uint256)", +"7cd7c2bd": "setAnimalMeta(uint256,string)", +"7cd87ee9": "Libertax()", +"7cd9b0f8": "userHasHunterLicence(address)", +"7cda71a6": "preSaleTotalSupply()", +"7cdacb98": "setContractPartner(address)", +"7cdbae63": "addRegistryIntoTagsIndex(address)", +"7cdcc514": "replyThread(uint256,string,string)", +"7cdcdf23": "RenderTokenCrowdsale(uint256,uint256,uint256,uint256,address,address,address)", +"7cdd053a": "addRace(uint8,uint8,uint8)", +"7cdd8419": "getEtherPriceforDapp()", +"7cddc1de": "checkBonusTokenHoldingPeriodRemained(address)", +"7cde2a7e": "setCount(uint256,uint256)", +"7cdee6fb": "buySpaceship(uint16)", +"7cdef83c": "debtEngine()", +"7cdf6d0b": "TranslateME()", +"7cdf8ace": "adminCommand(uint8,address,uint256)", +"7ce01daf": "rollSystem(uint256,address)", +"7ce1b194": "ModernTokenPlus()", +"7ce1db53": "ShowNextCliff(address,uint256)", +"7ce1e2eb": "releasedBountyTokens()", +"7ce2432b": "lbrsToken()", +"7ce26195": "approveGame(address)", +"7ce2d863": "_calcCheckoutTime(uint256)", +"7ce335ac": "amountwon()", +"7ce3489b": "setFeePercent(uint256)", +"7ce50441": "updateTimer(uint256,uint256,uint256)", +"7ce52eb6": "distributePrizes()", +"7ce56303": "deployVestingContract(address,address,uint256,uint256,uint256,bool)", +"7ce5b85e": "transferBuy(address,uint256)", +"7ce5f9da": "DIYToken()", +"7ce645a6": "fundsAreAvailable()", +"7ce65725": "TEC()", +"7ce67d60": "initLoan()", +"7ce6e4ca": "getData_1()", +"7ce7c990": "transfer2(address,uint256)", +"7ce7d660": "CAF1(address)", +"7ce84784": "createtoken(string,string,uint256,address,address)", +"7ce85957": "setEthCollector(address)", +"7ce8e196": "test_claim()", +"7ce901e7": "TestContract(address)", +"7ceac0b8": "TokenSale(address,uint256,uint256)", +"7cead212": "dissolvedIndexToApproved(uint256)", +"7cec3a3a": "getBUS(bytes32,uint256)", +"7ced3d4c": "validArb2(address)", +"7ced55c2": "pvpPaused()", +"7cee8e70": "subTotalSponsored(address,address,uint256)", +"7cee919c": "getCurrentHash()", +"7cee9ee8": "placeBet(uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"7cef6047": "getNavHistory(uint256)", +"7cef6966": "addLaureato(string,string,string,bytes32)", +"7cefcc52": "burnedCount()", +"7cefd9f8": "initCrowdsale(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"7cf0ffcb": "forceDivestAll()", +"7cf12b90": "unFreeze()", +"7cf12ff8": "registryRequestSerialNumber()", +"7cf141fd": "removeGlobalAdmin(address,address)", +"7cf2b9e4": "updateVotingContractAddress(address)", +"7cf2f670": "Pinakion(address,address,uint256,string,uint8,string,bool)", +"7cf37493": "finalizeNOK()", +"7cf4c543": "createTransaction(uint256,address)", +"7cf52f3c": "getPrevRoundWinner(uint256)", +"7cf5d66f": "notifyTokensReceived(address,uint256)", +"7cf5dab0": "increment(uint256)", +"7cf62838": "EIP20ByteCode()", +"7cf6babf": "BasicSprout()", +"7cf6be2c": "createBid(bytes32,address,address,address,uint256,uint256,uint256)", +"7cf7b9f4": "determineDate()", +"7cf7e0e2": "VLCCoin()", +"7cf7f740": "getBuildingInfo(uint256)", +"7cf846c9": "registerManoContract(address,bool)", +"7cf90fcc": "addItem(address)", +"7cf99c33": "getIsMigratingFromLegacy()", +"7cfa1133": "Baxgold()", +"7cfb1e66": "TeamSum()", +"7cfb6052": "setPremium(int256)", +"7cfbc7a5": "setMaxBetAmount(uint256)", +"7cfe18c0": "internalCalculateEthersWithBonus(uint256)", +"7cfe19af": "A_Free_Ether_A_Day()", +"7cfe7a25": "BankhadCoin()", +"7cff33c7": "setMainSaleParameters(uint256,uint256,uint256)", +"7d007ac1": "setProposalDuration(uint256)", +"7d00818c": "allowedAddressesOf(address)", +"7d00848a": "getSinistre()", +"7d019f87": "isPreSaleClosed()", +"7d02bc1c": "getOldest()", +"7d02db72": "CryptoRUB()", +"7d036b0d": "finishProofPhase(uint256)", +"7d0381a7": "notify(address,uint256,uint8,uint8,uint8,uint256,uint256,bool)", +"7d0385c2": "createPromotionalRenewal(uint256,uint256)", +"7d03c394": "Logs2(uint256,uint256,uint256,uint256,uint256,uint256)", +"7d03e603": "GetUserExtraData2(address)", +"7d03f5f3": "newGame()", +"7d049675": "fechAllCandidatesByStage(uint256)", +"7d04d239": "setTokenMintApproveReset(address,address,address,address)", +"7d051cf3": "getTokensAcquired(address)", +"7d052a2e": "processReservationContribution(address,uint256)", +"7d06053b": "perturb(bytes32)", +"7d065c93": "getPayout()", +"7d075efb": "withdraw(address,address,address,bytes)", +"7d087715": "getwithdrawableAmount(address)", +"7d087f47": "gamblerevent(address,uint256)", +"7d091a7e": "pct(uint256,uint256,uint256)", +"7d094533": "announceVictory(string)", +"7d0981dd": "ModifyMine(address,bool,string,uint256)", +"7d09f560": "Equio(string,address,address,bytes32,uint256,uint256)", +"7d0a5e3b": "fightWIthMob(uint256,uint256)", +"7d0b4c8b": "withdrawEquity(uint256,bool)", +"7d0b4d60": "migrationEnded()", +"7d0bc9c6": "tier_action(uint8,uint256,uint256,uint8,uint256,uint256)", +"7d0bd79a": "publicSaleTokensPurchased()", +"7d0c269f": "isWhitelister(address)", +"7d0cf8b5": "Seele()", +"7d0e6aa9": "BitrootCoin()", +"7d0e6b6f": "setNextDiscountTTMTokenId1(uint64)", +"7d0e750d": "getMyTime()", +"7d0eb9b9": "RemoveVerifiedInfo(bytes32)", +"7d0f023d": "_deleteBytes(bytes32)", +"7d0f7528": "getFromList_(uint8,uint256)", +"7d103f14": "getBallotBook(uint256,uint256,uint256)", +"7d1108f5": "getAssetData(uint256)", +"7d112d64": "authenticateVoter(string)", +"7d1157c8": "rawSendEther(bytes32)", +"7d1173b0": "DGAMEToken()", +"7d11f020": "oracleName()", +"7d124a02": "setRewardAddresses(address,address,address)", +"7d1286f6": "InterfaceId_ERC721Exists()", +"7d128d2e": "checkAgentSign(address,address,bytes32)", +"7d12b689": "checkPoolsDone()", +"7d136133": "SimpleATM()", +"7d13a256": "highFundingGoalReached()", +"7d14500a": "Sukiyaki()", +"7d14c8df": "setStaleTime(uint256)", +"7d150529": "countdownTimeLeft()", +"7d1541ad": "listDapp(string,string,string)", +"7d1710e4": "saleBalanceOf(address)", +"7d1842ec": "getPayeeBalance(bytes32,uint8)", +"7d18a197": "IndoAset()", +"7d19514d": "addFunds(uint256,uint256,bytes32,uint256)", +"7d19c777": "Emission(address,uint256,uint256,uint256,uint256,uint256)", +"7d19e292": "transferTokensToContractOwner(uint256)", +"7d19e596": "getEscrow(uint256)", +"7d19ec9d": "getUserAccount(bytes32)", +"7d1a6e3f": "compareTo(string,string)", +"7d1b2666": "fibokenCreatedCount()", +"7d1bd3ea": "setClientSupply(address,uint256,uint256)", +"7d1ca9fd": "setBeneficiary2(address)", +"7d1d0553": "convertToMiniUI(uint256)", +"7d1d7fb8": "settlementFee()", +"7d1e97a1": "cardTokenAddress()", +"7d1ea6d4": "m_token()", +"7d1f067c": "EthBankRoll(uint16)", +"7d1f561b": "set_pre_kyc_iconiq_bonus_denominator(uint256)", +"7d2026cd": "distributeWinnings()", +"7d2044cc": "AuctusStepVesting(address,uint256,uint256,uint256)", +"7d211c75": "peth()", +"7d21ce4d": "_Mint(address,uint256)", +"7d2211d6": "setStatus(string)", +"7d22e9df": "clearAllocatedAndSalaryTokens(address,address)", +"7d22f431": "delegatePercent(uint256,uint256,uint256)", +"7d230dfd": "wedding()", +"7d236928": "getGenesMarketAddress()", +"7d2402d6": "inPresale()", +"7d240b9c": "setLockToken(bool)", +"7d2429a8": "long_party()", +"7d242ae5": "setBasePrice(uint256,bytes)", +"7d24a8a1": "returnToken(address,uint256)", +"7d24cd18": "onExecuteMessage(address,uint256)", +"7d25d7cd": "tokensToTransfer(bytes32,address,address,address,uint256,bytes,bytes)", +"7d263245": "COOLDOWN_TIME()", +"7d264bad": "adexTeamAddress()", +"7d268ac1": "ArtworkCore()", +"7d27ecf9": "phase1TokenSold()", +"7d287697": "testTryGetUnset()", +"7d298ee3": "beforeExecute(address,uint256)", +"7d29beff": "placeVoxel(uint8,uint8,uint8,uint8)", +"7d29f868": "ChangeUSDto1ETH(uint256)", +"7d2a0f7a": "isWhiteListedValueValid(address,uint256)", +"7d2a47b9": "findShareholder(address)", +"7d2aeb8a": "releaseVestedTokens(uint256)", +"7d2b48bb": "getMaxAssignedRequests()", +"7d2b9cc0": "setRequiredSignatures(uint256)", +"7d2c93d7": "validateTypeReference(uint256,bool)", +"7d2d661f": "genLimit(uint256)", +"7d2d92ac": "withdrawTheUnsoldTokens()", +"7d2dfc30": "FourCrowdsale(uint256,uint256,uint256,uint256,address,address)", +"7d2f42c3": "updateRating(address,bool)", +"7d309331": "Bitceun()", +"7d3157bf": "confirmBeneficiary(uint256)", +"7d320ef8": "proofStorage_IPFS()", +"7d326635": "getLendingObjId(address,uint256)", +"7d32e7bd": "transfer(address,bytes32)", +"7d34c2e3": "setMarketingAndRNR(address)", +"7d34f5ac": "dailyTotals(uint256)", +"7d3533da": "ownerSetAllowPublicWithdraw(bool)", +"7d35f656": "count_customer_deposits()", +"7d363718": "BitcoinXChainToken()", +"7d363720": "getCurrentBonusFactor()", +"7d368f88": "afterEnded()", +"7d36e478": "ClaimBalance(address,uint256)", +"7d37fcba": "setManagementContractAddress(bool,address)", +"7d380265": "addOptionChain(uint256,string,uint256,uint256,bytes32,address,int256[])", +"7d38a772": "updateDeveloperMiningPower(uint256)", +"7d394f90": "addMasternode(address)", +"7d398a86": "SourceChanged(string,string,uint256)", +"7d3b2d81": "PayXToList(address[],uint256)", +"7d3bfaee": "withdrawSurprisePotUser(uint256,uint256,uint8,bytes32,bytes32)", +"7d3c42d2": "EtherBrosMaker()", +"7d3c5961": "middleTimestamp()", +"7d3c6da5": "CreateLudumTokens(address,uint256)", +"7d3d220d": "CitizenOne(uint256,address,uint256)", +"7d3d6522": "goalReached()", +"7d3dcbc3": "setTRM1BonusActive(bool)", +"7d3ee409": "setPatient(string,uint256,address,string,string,uint256,uint256)", +"7d3fa29e": "addressToGoldDeposit(address)", +"7d3fcaff": "getMatchReport(uint256)", +"7d40189a": "timeAdjustPlus()", +"7d40583d": "setRoleCapability(uint8,address,bytes4,bool)", +"7d408b44": "getMemberTokenRemain(address)", +"7d40e9e0": "purchasedAmountOf(address)", +"7d40eb25": "TITANCORE()", +"7d4120a9": "insChainToken()", +"7d41cc60": "modifyAuthorizedCaller(address,address)", +"7d426826": "INTREPID_VOUCHER_PRICE()", +"7d42af97": "PrivateSaleEndTime()", +"7d436d76": "consume(bytes32,bytes32[])", +"7d443e57": "getInitInfo()", +"7d445654": "lastLargestHODLERBalance()", +"7d4504e0": "totalETHraised()", +"7d451aa7": "zgetOwner()", +"7d457ac3": "CompensationSentEvent(address,uint256)", +"7d459c71": "Multiexshares()", +"7d46702b": "icoCollected()", +"7d472f1c": "xnotifications(uint256)", +"7d475c32": "LogAccessPolicyChanged(address,address,address)", +"7d478407": "gameEncryptedText()", +"7d47b4e7": "setAIRDROPPrice(uint256)", +"7d48441f": "_isContract(address)", +"7d487532": "setMember(bytes32,address,bool)", +"7d48dcd7": "onPurchase(address,address,uint256,uint256,uint256)", +"7d49300d": "initGame(address,uint256,uint256,uint256)", +"7d49e51d": "getSpaceshipUpgradePriceByModel(uint16,uint8)", +"7d4a899e": "SafeSender()", +"7d4af159": "marketMakerFee()", +"7d4c1403": "get(address,address,string)", +"7d4c258a": "Set(bytes32)", +"7d4c4a04": "saleStartSecondDayEnd()", +"7d4c7806": "disputeCrowdsourcerCreated(address,address,address,uint256[],uint256,bool)", +"7d4cb964": "MAX_ENTRIES()", +"7d4ce874": "maxInvEth()", +"7d4cf602": "buildDSBalanceDB()", +"7d4d3128": "startTransferToken()", +"7d4d42c5": "_addGraffiti(uint256,string,string)", +"7d4da754": "CoiinToken(address)", +"7d4deda1": "setAirLimitCount(uint32)", +"7d4e1353": "erc20TRFT(uint8)", +"7d4e1eb0": "stop_game()", +"7d4f0406": "PPY(uint256,string,string)", +"7d4f128b": "createLockTokenHistory(address,uint256,uint256)", +"7d4f1883": "closeMonthlyInvest()", +"7d50bef3": "account(address,address,uint256)", +"7d5224d3": "registerNewUser(address)", +"7d53223a": "setVestingReleasedAmount(address,address,uint256)", +"7d53409a": "setMaxbonds(uint256)", +"7d534aa0": "disableCharity()", +"7d549e99": "totalTokensMinted()", +"7d54a3ba": "CROWD_WAVE1_PERIOD()", +"7d55094d": "toggleMinting()", +"7d55758f": "underMint(address,uint256)", +"7d55923d": "click()", +"7d55f64d": "fixedFeeInWei()", +"7d564056": "getUserProperty()", +"7d564f11": "setsystemprice(uint256)", +"7d574678": "setICOIsFinished()", +"7d57a85c": "preIcoFinish()", +"7d57edf3": "HOPE(uint256,string,string)", +"7d580939": "_HOLDersPayRoll()", +"7d58eb76": "hasResolver(string,address)", +"7d59a938": "month6companyUnlock()", +"7d5a9b41": "init(uint256,uint256,address,uint256,uint256,uint256,address,uint256)", +"7d5bc9fe": "Account_balances(address)", +"7d5c1914": "getWalletInfo(address)", +"7d5db5e0": "Dagelas()", +"7d5dc538": "getToJackpot(uint256,uint256)", +"7d5dec2a": "multiplex_remove(address)", +"7d5f66f2": "mintBounties()", +"7d5fbcab": "setMystr(string)", +"7d5fec5a": "setOwner(uint8,uint8,address)", +"7d606100": "BetOverlap()", +"7d60b6ce": "setCommissionWallet(address)", +"7d60e291": "FIFTY_THOUSANDS_LIMIT()", +"7d60e343": "getFileListSize()", +"7d619d9b": "holdCoin(address,address)", +"7d61b9fe": "intervalsCount(bytes32)", +"7d61de37": "foundersRewardTime()", +"7d620130": "getCardCount()", +"7d635502": "buyEgg()", +"7d636d9b": "refferal(address)", +"7d63a93a": "REKT(uint256,address)", +"7d64bcb4": "finishMinting()", +"7d652335": "changeAssetsState(bool)", +"7d656a72": "NewPost(bytes32,uint256)", +"7d65b2f7": "hasCompleted()", +"7d65e3fe": "totalInterestCycles()", +"7d661e3c": "giveToken(address,uint256,string)", +"7d6651b9": "claimEthIfFailed()", +"7d683b95": "unsoldUnlockedAt()", +"7d684a9d": "RENEEKROM(address,address,address,uint256,uint256,uint256)", +"7d68582a": "manuallyExchangeContractPreDGZtoDGZ(address,uint256)", +"7d68bee7": "LogPollDeleted(bytes32)", +"7d692faf": "readMailByAdmin(uint256,bytes16)", +"7d6979e7": "canBeChanged(uint256)", +"7d69880b": "addBalance(uint256,uint256,uint256)", +"7d69f335": "changeColorRed()", +"7d6a59ed": "getInvoiceCount()", +"7d6a5f7b": "requireNotPaused()", +"7d6ad4cd": "triggerAutorelease()", +"7d6b4278": "outcomeState(address,uint256,uint256)", +"7d6bc260": "maxTiers()", +"7d6c1ff1": "addMake(address,uint256,uint256)", +"7d6c8388": "INVECH(uint256,string,string)", +"7d6c864e": "withDrawable()", +"7d6cf2df": "get_deploy_fee()", +"7d6d28ef": "setComisionInTokens()", +"7d6dc737": "getBylawsMinTimeInTheFutureForMeetingCreation()", +"7d6e061c": "getFinishDates()", +"7d6e3751": "_addVouchers(address,uint256)", +"7d6ebe94": "setDoubleClaimSegmentSlashAmount(uint256)", +"7d6f0d5f": "changeFundsWallet(address)", +"7d6f174e": "invalidateSignature(uint8,bytes32,bytes32)", +"7d6f3781": "userChallenge()", +"7d6fb089": "setBGXTokenInterface(address)", +"7d7106ad": "_updateStats(uint256,uint256)", +"7d71a19b": "setAccountInfo(address,address)", +"7d720296": "airSender()", +"7d722a30": "Funding_Setting_cashback_before_start_wait_duration()", +"7d72aa65": "addRole(address,string)", +"7d736d0d": "weekPotExpiration()", +"7d74039d": "getAmountOfShareholders()", +"7d7452aa": "DSVCoin()", +"7d7714fb": "coinAllowance(address,address)", +"7d7786a3": "GetGuestName()", +"7d77c8f9": "allowTransferBetweenUsers()", +"7d780e2a": "blocked_amounts(address)", +"7d78b94d": "claimNihilum()", +"7d78ef4a": "BKKToken()", +"7d790630": "setContractFrozen(bool)", +"7d79265b": "REDEEM_METHOD()", +"7d79c192": "awayTeam()", +"7d7a1a80": "UCToken(uint256,string,string)", +"7d7a31b6": "max(uint64,uint64)", +"7d7a3a1a": "bittravelxToken()", +"7d7a9ca4": "MachineToken()", +"7d7b0099": "API()", +"7d7b2051": "finalizeExits(address)", +"7d7be90f": "Splitter(address[])", +"7d7c2a1c": "rebalance()", +"7d7c7258": "adminSendMoneyToUser(address,uint256)", +"7d7ca00c": "JSONpath_int(int256,string,string,uint256)", +"7d7d4a68": "start_service(address)", +"7d7e5e3d": "setFlagPair(uint256,bool,bool)", +"7d7eee42": "setPreSalePrice(uint256)", +"7d7f0050": "TradeEnabled(bool)", +"7d7f1699": "freeBet(address)", +"7d7fa215": "getSaleData()", +"7d7fef7e": "receivedEtherFrom(address)", +"7d802655": "delLimitedWalletAddress(address)", +"7d80def3": "setENDPhase()", +"7d81d62f": "doGroupRefundPayoutsSuccess(address[])", +"7d820414": "GeXCHANGE()", +"7d82bf73": "getBonusTokens(uint8)", +"7d836281": "getBetState(address)", +"7d83e527": "PensionCoin()", +"7d851a13": "signerIsWhitelisted(bytes32,bytes)", +"7d851c70": "getTokensBack()", +"7d85445d": "EducationToken()", +"7d85facd": "transferred()", +"7d862a7e": "changeDutchIdxAddr(address)", +"7d87bb7b": "HATCHING_COST()", +"7d87e97d": "makeMemberOfGroup(address,uint256)", +"7d882097": "totalDeposits()", +"7d882e9b": "resetWinner()", +"7d886976": "testMintGuyAuth(int256)", +"7d8966e4": "toggleSale()", +"7d8978db": "addCasino(uint16,uint256,string,string)", +"7d897ccd": "KPCSAdministrator()", +"7d89ae63": "__findRef(string)", +"7d89f040": "AddAmount(uint256)", +"7d8be627": "activateLineItem()", +"7d8c0c7c": "adminSetRegisterCost(uint256)", +"7d8ccd59": "debug_uint(uint256)", +"7d8cfd1a": "flag_hash()", +"7d8d4878": "updateETHEUR(uint256)", +"7d8f442e": "getPrice(uint40)", +"7d8f94a0": "slackUsersCap()", +"7d8fcfb4": "transferSuperAdminOwnership(address)", +"7d8fe090": "REFERRAL_BONUS_LEVEL5()", +"7d902311": "gameGiftLineTime()", +"7d917fcb": "Registered(bytes32,address)", +"7d919a43": "tohash(bytes32,address,address,uint256,uint8,bytes32,bytes32)", +"7d91da87": "buyPixelTokenFor(uint24,uint256,uint24,address)", +"7d9201cc": "rspToken()", +"7d921af0": "disableTimelock()", +"7d92561d": "NewBuyer(address,uint256,uint256)", +"7d92654c": "endRoundAndStartNextRound()", +"7d92bb6e": "getClaimKeys()", +"7d92f6be": "goldRegistry()", +"7d9375b8": "authorizeContract(address,string)", +"7d9383c3": "valid_creature(address)", +"7d93ccdf": "Halo3DDoublr(uint256,address)", +"7d940912": "addArea(uint256,uint8,uint8[],uint256,string,uint256,bool,uint32)", +"7d94792a": "seed()", +"7d94d4aa": "SergeToken()", +"7d95dcd7": "createPromoArtwork(string,string,uint32,address)", +"7d961218": "REGTMProc()", +"7d962e44": "addHash(bytes16)", +"7d96f693": "getDepositAmount()", +"7d97597d": "DEFAULT_AUCTION_LENGTH()", +"7d97b1f6": "VestingScheme()", +"7d98ebac": "exchange(address,address,address,address,uint256,bytes)", +"7d99ae17": "issue(address,bytes32,bytes32)", +"7d9a4e2c": "safeToMultiply(uint256,uint256)", +"7d9a9046": "resolveDisputeBuyer(string)", +"7d9a9096": "icoFinishedAt()", +"7d9c68f7": "getUserBattleValue(address)", +"7d9d4bed": "secondStageEnd()", +"7d9d972d": "guardian3Vote()", +"7d9e5243": "BonusAmountUpdated(uint256)", +"7d9f298e": "setLockedState(bool)", +"7d9f6db5": "auction()", +"7d9f8cf2": "startFirstStage()", +"7d9fb742": "fourthRoundPercent()", +"7d9fc342": "PreICODays()", +"7da028d6": "SaleCompleted(address,uint256,uint256)", +"7da0389d": "referralProgram(address[],uint256[],uint256)", +"7da0399a": "CloseAuction(bytes32)", +"7da0e079": "_closeMotion(uint256)", +"7da16762": "executeParentDaoSplit()", +"7da208aa": "deleteArrayAddress(bytes32,uint256)", +"7da21a1a": "WaltonToken()", +"7da25928": "announcedTimeStamp()", +"7da3400b": "_contractExists(bytes32)", +"7da39157": "poWtfContract()", +"7da3c3ab": "revert()", +"7da3e219": "testInitialTokenBalance()", +"7da3f613": "lockAddress()", +"7da40b65": "isPlatformOrSupportManager(address)", +"7da4d24b": "activationOpen()", +"7da5efc8": "drop(address,address[],uint256[])", +"7da63c59": "changeValuePerToken(uint256)", +"7da7a437": "Clinicoin()", +"7da7d5ab": "nextGameRakePercent()", +"7da81364": "getProposalAction(uint256)", +"7daa10ce": "getMyInfo()", +"7daa9fcd": "buyGems()", +"7dab61b6": "setBlack(bool)", +"7dab84d8": "ShowTestU(string,uint256)", +"7dabb4d6": "addKycVerifiedInvestor(address)", +"7dac0547": "VIRGOToken()", +"7dac9048": "addArgumentToRequestUint(uint256,bytes32,uint256)", +"7dae6e95": "noOfTokenAlocatedPerICOPhase()", +"7daeef25": "objectTome()", +"7daf06fd": "withdrawPart(uint256)", +"7db0799f": "EnduranceToken()", +"7db12abc": "contractorWithdraw()", +"7db1c36f": "setFeedBackFee(string,uint256)", +"7db2cff8": "old_address()", +"7db33f99": "setLeaseCard(uint8,uint256,uint256)", +"7db4149d": "RegisterTokenTransaction(address,uint256,address)", +"7db42b6c": "AutoBusinessFinance()", +"7db45975": "register(uint256,uint256,bytes32,string,bytes32)", +"7db48416": "_getMinions(uint256)", +"7db6a91d": "checkDeck(uint8[],bytes32,bytes32)", +"7db6cbfc": "_addDefaultOperator(address)", +"7db724b6": "MAIN_QUESTION()", +"7db7c239": "tranchesPayedOut()", +"7db8782a": "uint256At(uint256,bytes,uint256)", +"7db91595": "setOwnedBonus()", +"7db9743b": "Registry()", +"7dbb82a8": "setLicenseTermsRegistry(address)", +"7dbbc0cd": "EliteShipperToken()", +"7dbbf2e6": "RecallTokensFromContract()", +"7dbc1d6f": "modifyPrivateList(address[],bool)", +"7dbc827b": "vestingWithdraw(address,uint256,uint256)", +"7dbc9fba": "amendClaim(uint8,uint8,uint8,uint8)", +"7dbd0139": "softCapOk()", +"7dbd33c1": "_percDown(uint256)", +"7dbdab18": "CreatedAngel(uint64)", +"7dbdc2eb": "getQueryPrice()", +"7dbdf168": "EtherBetIO(address,address)", +"7dbecc54": "EDColiseum()", +"7dbece3c": "usdCurrencyFunding()", +"7dbedad5": "createReward(uint256,uint256)", +"7dbf1fe6": "Towers(uint256)", +"7dbf67a7": "setDebt(uint256)", +"7dbff420": "donationUnlockTs()", +"7dc0015d": "centToken()", +"7dc09e4a": "getRequestedProducts()", +"7dc0d1d0": "oracle()", +"7dc0d451": "CHINESE_EXCHANGE_2()", +"7dc10df5": "Jackpot(address,uint256,uint256,uint256)", +"7dc2268c": "minting()", +"7dc28eb2": "LOCKAMOUNT4()", +"7dc379fa": "getTicket(uint256)", +"7dc45e27": "setCryptoMatchValue(uint256,string)", +"7dc4da2e": "initiate(uint256,bytes32,address,uint256)", +"7dc4feb7": "setConstraint(bytes32,address,address,uint256)", +"7dc5cc64": "getTotalDivis(uint256)", +"7dc5cd32": "_patternToNumber(bytes)", +"7dc673bc": "closeRegistration()", +"7dc6c3d9": "deactivateAdSlot()", +"7dc7363b": "LogNewTemplateProposal(address,address,address,uint256)", +"7dc74473": "tokenPrivateMax()", +"7dc79375": "delOracle(address)", +"7dc7c5a5": "debug1()", +"7dc7f7c4": "Pitcheum()", +"7dc8c73e": "canTokenUnlocked(uint256)", +"7dc8e069": "shorten_end_block(uint256)", +"7dc8f086": "getOutcomeCount()", +"7dcab440": "SubinGuhan()", +"7dcaf720": "getReadme()", +"7dcb422e": "setPresaleStartDate(uint32)", +"7dcb6b92": "testegy()", +"7dcbd078": "thirdPay()", +"7dcc3f0c": "LukapToken()", +"7dccd4d6": "setIndividualCertificate(string,bytes32,bytes32,bytes32)", +"7dcd17d9": "sumHardCapICO1()", +"7dcd277b": "SimpleTingToken()", +"7dcda7df": "initiateProviderCurve(bytes32,int256,int256[],address)", +"7dcdace2": "Deposit(address,uint256,uint256,bool,string)", +"7dcdec34": "sendTokenFundsToManager(uint256)", +"7dce4595": "sendToken(address,uint256,string)", +"7dce6bdb": "freeCrawDeadline()", +"7dce8461": "GSENetwork()", +"7dce8dd4": "GenesisSalesCount()", +"7dcfb801": "veryAngry()", +"7dcfd3d5": "blockTransfers()", +"7dd003f1": "test_chain2_4()", +"7dd02c8e": "transferETHFromContract(address,uint256)", +"7dd07097": "tgeSettingsPartProject()", +"7dd0d61c": "check_hash(address,bytes32,bytes32)", +"7dd10e4f": "newUsers()", +"7dd15d40": "getData_13()", +"7dd1f126": "optionTaker(bytes32)", +"7dd256ff": "PATToken(address)", +"7dd26660": "getMegaboxIndex()", +"7dd2899f": "changeDividentContract(address)", +"7dd2e993": "removeTenant(uint256)", +"7dd3cf54": "ChangeCostByManager(uint256)", +"7dd45999": "lockDomainOwnershipTransfers()", +"7dd563c3": "setMainSaleParams(uint256,uint256,uint256,uint256)", +"7dd56411": "ownerOf(bytes32)", +"7dd91734": "compositeReputation(string)", +"7dd9d27f": "exiteEntidad(address)", +"7dd9f846": "buyCard(address,uint256)", +"7dd9fcf7": "latestprice()", +"7dda48a5": "WhatTimeIsNow()", +"7ddaa56a": "tokenContributionMin()", +"7ddb3c00": "total_pay_claimed()", +"7ddb5e65": "votingReward()", +"7ddbf0ed": "setLockedTokenAddress(address)", +"7ddbf1a7": "passFundsToTheTeam()", +"7ddc02d4": "isOwner(address,address)", +"7ddcbfd9": "TegTokensSale(uint256,string,string)", +"7ddd0ce1": "getBetDivisor(uint256)", +"7ddd130f": "PRBCoin()", +"7ddd20ba": "getRequiredStateNumbers(uint256)", +"7dddb66f": "collectOwnRew()", +"7dde0138": "modifySupplyLimit(uint256)", +"7ddfffbf": "mint(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"7de06cfc": "startTge()", +"7de09476": "getSpecificBuyerTransaction(address,address,uint256)", +"7de0cc65": "preMcFlyWallet()", +"7de11a8f": "getBlockVerifierAddressesCount(uint256)", +"7de14129": "approveInvestor(address)", +"7de1a631": "confirmETH(bytes32)", +"7de295d2": "withdrawalsCTR()", +"7de2d523": "setbonus(uint256,uint256)", +"7de2e95c": "TransferCow(address,uint256)", +"7de2fe4d": "linkToMasterWalletInternal(address,address)", +"7de32b17": "CuratedTransfers(address,address[],address[])", +"7de36138": "setPreICO(address)", +"7de47b3f": "fundingGoalUSD()", +"7de4800f": "withdrawEscrow(bytes32)", +"7de480c6": "aiurExchangeOracle()", +"7de4ceb2": "DebugValue(string,uint256)", +"7de50c44": "TIME_LOCK_END()", +"7de548d8": "releaseStake(uint256,address,address)", +"7de576cd": "vote(uint16,uint256)", +"7de5ad89": "setJntController(address)", +"7de6c905": "LetItPlayToken(address,address,address,address,address,address,address,address)", +"7de77700": "bytes32ToBytes(bytes32,bytes32[],bytes32)", +"7de7a18d": "setShare(address)", +"7de7ea78": "TokenHNC(uint256,string,string)", +"7de7edef": "changeMasterCopy(address)", +"7de8bb63": "Commons()", +"7de976dc": "amountFundHolder()", +"7de9f212": "colorfilter(uint256)", +"7dea9118": "setIdentityName(bytes32)", +"7deb6025": "buy(uint256,address)", +"7debb959": "calculateAllocation(address)", +"7dec2299": "getStagesInfo()", +"7dec3d35": "FOUNDERS_WALLET()", +"7dec4ce8": "SettleBond(uint256)", +"7ded0c15": "getStakeTokenBalanceFor(uint256,uint256)", +"7ded2210": "setPreIcoCap(uint256)", +"7dee2cad": "CancelMyInvestment()", +"7def2fdf": "changeStakeRate(address,bytes32,uint256)", +"7def7351": "teamTokensFirstShare()", +"7df02c0e": "getLinglongCat(uint256)", +"7df042a2": "totalRegularTokensSold()", +"7df19a78": "BetPlaced(address,uint256,uint8)", +"7df1f1b9": "borrower()", +"7df23b6a": "ReleaseOracle(address[])", +"7df2e3e3": "getRcdExchange(uint256)", +"7df38c5b": "wad()", +"7df3a229": "PissToken()", +"7df432c9": "minSelfBuyPrice()", +"7df4732e": "seeZombieStar(uint256)", +"7df47407": "SigProof()", +"7df4c235": "kolidat()", +"7df52ba8": "Arbitrate(uint32,uint32,bool)", +"7df545c7": "MaximumSellableTokensChanged(uint256)", +"7df54c73": "setMiniPoolEdit_4(string)", +"7df5f4ae": "_upper(bytes1)", +"7df65a1d": "getMinersByAddress(address,address)", +"7df68a8b": "addPeriod(uint256)", +"7df73e27": "isSigner(address)", +"7df7ec18": "test_invalidEmptyEqVal()", +"7df82cc9": "veztUsers(uint256)", +"7df83cd0": "getDepositWithdrawList(address,uint256[])", +"7df841cd": "setPlayerVirusDef(address,uint256)", +"7df855f2": "getAuditAddress(address,address)", +"7df8833a": "createEvent(string,uint256,uint32)", +"7df9bb31": "heredar()", +"7dfa0b3f": "canSell(address,uint8,uint8)", +"7dfa7d79": "claimUnsoldTokens()", +"7dfac5a2": "accMinterOne()", +"7dfb0ba5": "getRecordOffers(address)", +"7dfb6626": "withdrawRewards(bytes32)", +"7dfbc19c": "HaltTime()", +"7dfbdf6d": "returnFundsFor(address)", +"7dfc64ca": "getTotalBudget()", +"7dfce5e9": "withdrawExcessReserves()", +"7dfce6d7": "MAX_INTEREST_AMOUNT()", +"7dfda44c": "AssignAddress(uint256)", +"7dfe1674": "CTB(uint256,string,string)", +"7dfe4302": "privateSaleTokens(uint256,uint256)", +"7dfe58d0": "clearEscapeRequests(uint256[],uint256[])", +"7dfe7741": "InviteAccepted(address,address)", +"7dfebff3": "addEth(uint256,uint256)", +"7e007c1e": "minimumWEI()", +"7e00d6d6": "enablePurchase()", +"7e00d77a": "mintExtendedTokens()", +"7e01c088": "removeWhitelistedAddr(address)", +"7e029bde": "setEthUsd(uint256)", +"7e02bb0f": "finish(address,address,address)", +"7e03ad1a": "numImports()", +"7e057b8e": "IYMAYA()", +"7e06ec93": "MDOSToken(address,address)", +"7e070df6": "rootOwnerOf_(uint256)", +"7e07877a": "hasFailed(address,uint256)", +"7e080911": "TRUEToken(address)", +"7e08a846": "tokenCollectedOf(uint256,address)", +"7e09d09b": "theFloatMultiplier(uint256)", +"7e09f0aa": "predictMarket()", +"7e0a16b1": "forwardAllRaisedFunds()", +"7e0be7e3": "upgradeGooCost(uint256)", +"7e0c1792": "oracle_address()", +"7e0c240d": "LianJieToken()", +"7e0cfc3d": "truncate(uint8[],uint8)", +"7e0d149e": "getGameAddresses(uint256)", +"7e0d8b27": "leekStealToday_()", +"7e0e20ba": "HighGasAmount()", +"7e0e471d": "Licensium(uint256,string,uint8,string)", +"7e0f7a87": "getUnixTimeStamp()", +"7e1028b2": "_doTradeWithEth(address,uint256,address,uint256)", +"7e1055b6": "icoEndTime()", +"7e111f59": "sell_toContract(uint256)", +"7e11f453": "ETH_Rate()", +"7e12180e": "setSaleDuration(uint256)", +"7e133564": "donateDna(address,uint256,uint8)", +"7e13b0be": "changeTokenDecimals(uint256)", +"7e150d66": "maxTxSize()", +"7e1629ab": "token_transfer(address,address,uint256,bytes,string)", +"7e167198": "_preValidatePurchase(address,uint8,uint256)", +"7e168086": "preallocate(address,address,address,address)", +"7e169860": "createNewEvent(bytes32,string,string,uint256,uint256,string,string)", +"7e16cfde": "getGameBlockNumber(uint256)", +"7e16eca0": "getContractTimestamps(bytes32)", +"7e1721ee": "LMAOtoken()", +"7e179816": "setRefShare(uint256)", +"7e18dd21": "motodoughToken()", +"7e1934f9": "swpFund()", +"7e199b70": "startCrowd(uint256,uint256,uint256)", +"7e1a6753": "Destruct()", +"7e1ab812": "utrToken()", +"7e1b52f6": "doftManager()", +"7e1c06b6": "newOwner(uint256)", +"7e1c0c09": "totalTokens()", +"7e1c4205": "query2(uint256,string,string,string,uint256)", +"7e1cae40": "changeRefundToken()", +"7e1cb559": "members(bytes32,address)", +"7e1cd42f": "convertIcoBalance100to70()", +"7e1cd79c": "Voting(bytes32[])", +"7e1db495": "addPendingWithdrawl(uint256,address,bool,bool)", +"7e1db516": "init3_block_height()", +"7e1e06ea": "EventTransferWasReset()", +"7e1e1ff6": "Giorgi()", +"7e1e447e": "total_wins_count()", +"7e1f2bb8": "createTokens(uint256)", +"7e1f89c8": "PRE_SALE_START()", +"7e20e7c0": "getRegistryDataMinter()", +"7e2224bd": "compress(bytes)", +"7e23f7cd": "teamKeepingLockEndBlock()", +"7e241c64": "getServiceNameByAddress(bytes32,address,address)", +"7e241dbf": "unlockMiner()", +"7e245fac": "PHXTKN()", +"7e24cb8f": "reservedFundLeft()", +"7e25ac5b": "destroyRewards()", +"7e25b7d6": "implements(address,bytes4)", +"7e266385": "setPrefix(uint8)", +"7e26639f": "saleLimit()", +"7e27133f": "tradingMonDataContract()", +"7e274f7e": "Reederem(string)", +"7e288822": "pendingWithdrawal()", +"7e298249": "setPriceInWei(uint256,uint256)", +"7e29d2a3": "TokenCoin4()", +"7e29dad0": "testBuyExceedHardLimit()", +"7e29f242": "changeDiscount(uint256,uint256,uint256,uint256)", +"7e2a0141": "removeToken(address[16],address,uint256)", +"7e2a6db8": "trusted()", +"7e2ac454": "disagree(bytes32,bytes32,bytes32[])", +"7e2bc821": "SaturnPresale(address,address,uint256,uint256,uint256)", +"7e2bef39": "calldata(uint256)", +"7e2bf3c6": "freezeCreditScore(address,uint256,string)", +"7e2c0459": "_transfer(bytes32,bytes32,uint256)", +"7e2c83fc": "seriesByAddress()", +"7e2ce380": "_calculateOwnerCut(uint256)", +"7e2e3958": "setBUS(bytes32,uint256,string)", +"7e2e756e": "testToUint32()", +"7e2f014f": "addResolversDelegated(string,address[],uint256[],uint8,bytes32,bytes32,uint256)", +"7e2f0843": "updateMaxTokensCollected(uint256,uint256)", +"7e2f6e3b": "getReserveSupply()", +"7e2fc2b6": "_Crowdsale(address,uint256,uint256,address)", +"7e2fdb0c": "dataForBuy(address)", +"7e2ff5f9": "setPreSale()", +"7e300fc6": "crowsaleShare()", +"7e319e4a": "getNextAssignedPolice(uint256,address)", +"7e31c53a": "HodlWithdrawn(uint256,address,uint256)", +"7e32456d": "STRC_SUPPLY()", +"7e327168": "allocatePresaleTokens(address,string,uint256,string)", +"7e32a592": "repairTheCastle()", +"7e32baea": "TRIPToken()", +"7e32fc47": "registerAsset(string,bytes32)", +"7e331a99": "setUserMessage(string)", +"7e33e361": "setRowQuiter(bool)", +"7e340b01": "getLatestPayday(address,address)", +"7e342507": "gameIndexToBuy()", +"7e3475a8": "lockQtyToAllowTrading()", +"7e347b82": "REALCrowdsaleMock()", +"7e34dbe0": "deposit(uint256,uint256,uint8,bytes32,bytes32)", +"7e363ffa": "setupCost()", +"7e36edce": "RATE_DAY_28()", +"7e373bc0": "bulletAmount()", +"7e380099": "addOrgCertificate(string)", +"7e38b424": "reverseFiatPurchase(uint256)", +"7e38d065": "ADVISORS_AND_CONTRIBUTORS_TOKENS()", +"7e39082f": "escrowedMYB(address)", +"7e3bfa1d": "removeRecoveryAddress(address)", +"7e3d15ae": "nextHolder(address)", +"7e3d45ef": "gameMiningToken(uint16)", +"7e3d8813": "setup(address,uint256,uint256,uint8)", +"7e3da027": "approveAndCustomCall(address,uint256,bytes,bytes4)", +"7e3dbf96": "addr(bytes,bytes)", +"7e3df726": "EZEtherMarketplace()", +"7e3e40ec": "getRequiresKing(bytes)", +"7e3e7bdf": "checkReward(address,uint256,uint256)", +"7e3ef7cd": "getMyBalance(address)", +"7e3ef935": "setReleaseMake(uint256,bool)", +"7e3f2b2d": "getDocumentSignsCount(uint256)", +"7e3f5b70": "JFBToken()", +"7e3faec1": "GoldTxFeePool(address,address,bytes)", +"7e402eb0": "setSecondAdmin(address)", +"7e410427": "aDay()", +"7e4115ba": "toAddress(string)", +"7e4241b4": "ownerTake(uint256,address)", +"7e429f02": "burnMultDen()", +"7e42be1a": "quarantineAddress(address)", +"7e42f8b4": "setRefund(bool)", +"7e42f94d": "horsePr(uint256)", +"7e43185a": "showCollectorsAddresses()", +"7e4358c3": "used_in_contract_fees()", +"7e43828e": "bountyTokenWithdrawal()", +"7e441048": "hasCategory(address,uint256,uint256)", +"7e445d44": "setEndICO(uint256)", +"7e456808": "reclaimUnusedEtherBalance()", +"7e457b85": "startEarlyStage3()", +"7e458492": "addInspector(address)", +"7e45d15c": "___coinAddress()", +"7e466bb4": "forTeamCOT()", +"7e470882": "setStrF1(string)", +"7e482379": "totalEthInWeiForSecondIco()", +"7e4929c4": "priceBox2()", +"7e4930ae": "modifyCap(uint256)", +"7e495dae": "changeMinters(address,address,address)", +"7e4985c5": "LookUpAvailableDivLarge(address)", +"7e49aa05": "testSelfdestructIsRevertedWithMinReturn()", +"7e49d530": "fechVoteMainInfoBySnapshotBlock(uint256)", +"7e4a1731": "returnWallet()", +"7e4a82b1": "foreignBuyTest(uint256,uint256)", +"7e4b5eb5": "getPhControlLimits(bytes32)", +"7e4c3b2e": "requestRate(string,string,bool,uint256,uint256)", +"7e4d25c5": "Refundably_if_gasprice_more50gwei_Send_Votes_From_Your_Balance(address,uint256)", +"7e4d4495": "getEthCapPerAddress()", +"7e4d4653": "echoTest(uint256)", +"7e4d5ea1": "STARTDATE()", +"7e4e46e7": "withdraw_profit(address,address)", +"7e4e95d7": "airDropPercent_()", +"7e4eb35b": "left43(uint256)", +"7e4f1a9f": "AKMJCHAIN()", +"7e4f6b95": "MyAdvancedToken(uint256,string,string)", +"7e4f9397": "gSetAlive(bool)", +"7e4fdd0b": "SetherStarted()", +"7e545305": "firstBalance(address)", +"7e5465ba": "approve(address,address)", +"7e549814": "setEscrowedProjectPayees(uint256,address)", +"7e54b8e2": "AddCandidate(string)", +"7e551b75": "hashOf(uint256)", +"7e55a212": "JustTheTipCrowdsale(uint256,uint256,uint256,address)", +"7e55a311": "getPurchaseSeconds()", +"7e55b83c": "readValidDate(uint8)", +"7e55ec25": "CryptoPokemon()", +"7e569e66": "TDEContributorCount()", +"7e56d25f": "ReplyShare(uint256,string,bool,string)", +"7e56fde5": "calculateEggBuySimple(uint256)", +"7e5713d9": "setGenesisAddressArray(address[])", +"7e574098": "confirmEthTransactionRequest()", +"7e575524": "poolMintAmount()", +"7e577274": "onAuctionEnd(bytes32)", +"7e580d30": "ZCrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"7e58f815": "pauseRoundA()", +"7e59092e": "getVersionById(uint256)", +"7e5912d7": "reputationHashSubmissions(address)", +"7e59d513": "deathData_f1()", +"7e5a4dde": "getMarriage(uint256)", +"7e5a66df": "uniqueSpinnerOwners(uint256)", +"7e5a9ed9": "updateHpbNodeBatch(address[],bytes32[],bytes32[],bytes32[])", +"7e5af26c": "BugisContract()", +"7e5b1cdd": "GOToken()", +"7e5c344a": "Upgrade(address,address,uint256)", +"7e5c86a2": "moveFundToOwner(uint256)", +"7e5cd5c1": "disableMinting()", +"7e5e190c": "getBaseTypeStats(uint256)", +"7e5fc6f4": "calculateIcoBonus(uint256,uint256,uint256)", +"7e600c87": "doSend(address,address,address,uint256,bytes,bytes,bool)", +"7e602078": "assertInvalidState(address)", +"7e60a4bf": "removeLockFunds(address[])", +"7e61c768": "isClient(address,address)", +"7e61e6ef": "GasWar()", +"7e621667": "sendFromOwn(address,uint256)", +"7e626e58": "getUnPurchasedProducts()", +"7e62eab8": "withdraw(int256)", +"7e638974": "CalculateFinalDistance(bytes32,bytes32,bytes32,bytes32)", +"7e63dd86": "seed_additional_token(uint256)", +"7e64721f": "viewNumberOfMessages()", +"7e6503bb": "getActiveOrderCounts()", +"7e655ddd": "tokensSoldInThisRound()", +"7e6667c9": "Invoked(address,bool,uint256)", +"7e6688a2": "lastJackpotPayout()", +"7e668cd2": "fSqr(uint256)", +"7e66f15f": "nowSupply()", +"7e67429f": "switchToCrowdsale(string)", +"7e687a8b": "getTotalInvoicesCount(address,uint256[])", +"7e69671a": "distributeFees(uint256,uint256)", +"7e69ba22": "ethForTokens(uint256)", +"7e69e0fc": "ETH420on420()", +"7e6a0720": "removeClaim(uint32,int256,string,string)", +"7e6b867f": "insertProductIntoCart(uint256)", +"7e6bdb95": "getTransactionHashes(uint256,uint256,bool,bool)", +"7e6beae1": "team2018TokenCreated()", +"7e6c945c": "FileHashInt()", +"7e6d0fa0": "isWithdrawAllowed()", +"7e6d6928": "SmartBusinessToken()", +"7e6d86ff": "BOUNTIES_SHARE()", +"7e6dce9c": "throwIn()", +"7e6e65f3": "acceptSellOffer(uint32)", +"7e6eee20": "olympusTest()", +"7e6f6947": "setTokenBurnFeeAbs(address,address,uint256)", +"7e71496b": "TRCToken(uint256,string,string)", +"7e71572b": "_checkCap(uint256,uint256)", +"7e71ccd8": "HShoe_Limit()", +"7e71fb09": "transferOwnershipImmediately(address)", +"7e72fb52": "buyToken(address)", +"7e7307c5": "Contribute(bool,uint8)", +"7e737551": "setMaxWhitelistLength(uint256)", +"7e7388b1": "NewRiskAdr(address)", +"7e742432": "addNewDegree(string,bytes32)", +"7e74325f": "turn(address)", +"7e74a1ed": "depositRate()", +"7e754146": "getCurrentImpeachmentUrlDetails()", +"7e761240": "setMyName(bytes32,bytes32)", +"7e766e1f": "IonixxToken(uint256,string,string)", +"7e76b836": "minter1()", +"7e7712f2": "standardReleaseAmount()", +"7e773d9d": "testTimestamp()", +"7e77509e": "isRoundingErrorFloor(uint256,uint256,uint256)", +"7e779985": "isTransactionSuccessful(uint32)", +"7e77c503": "initialize(string,string,uint256,address,address)", +"7e780157": "PERCENT_100()", +"7e7894e4": "PendingETHs()", +"7e79a562": "TripPay(uint256,string,string)", +"7e79e8ba": "getEmail()", +"7e7a2fbf": "contribute_toTheGame()", +"7e7af34f": "setPostICOSale(bool)", +"7e7be158": "validatePurchaseAndDistributeFunds(uint24[],uint24[],uint256[])", +"7e7c16de": "secsPerBlock()", +"7e7c4243": "getTheBet(address)", +"7e7c8c6e": "catToken()", +"7e7d5689": "requireTrade(address)", +"7e7d76ad": "SPORT(uint256,string,uint8,string)", +"7e7db227": "lastAccountNum()", +"7e7dd581": "oldDBAddress()", +"7e7e4b47": "getOutcome()", +"7e7e5a75": "changeIdentityNarcoRespect()", +"7e7f1bfd": "total_refunded()", +"7e7f8e1e": "AddItem(uint256)", +"7e809973": "hash(address)", +"7e815fb4": "ScooterCoin()", +"7e81701a": "sitExchanger()", +"7e81b6aa": "KingdomFactory()", +"7e823bd1": "OMGToken()", +"7e82d0e6": "dbkWithdraw()", +"7e83027f": "setRegionForSaleToAddress(uint256,uint256,uint256,address)", +"7e8306ae": "profitrate()", +"7e83185b": "updateImageAddress(string)", +"7e835e86": "minechaincointest(uint256,string,uint8,string)", +"7e837ccc": "dispute_confirmed()", +"7e84adda": "setGameState(bytes32,int8[128],address)", +"7e85477f": "myInner1()", +"7e86e0f2": "BKFToken()", +"7e86f8e5": "blockedDeadLine(address)", +"7e873c2c": "uniq(uint256[])", +"7e87cf30": "tokenOpen()", +"7e888767": "getNumUsersToPayout(bytes32)", +"7e88f603": "returnDeposit()", +"7e893159": "changeIssuer(address)", +"7e8a9db9": "BasketEscrow(address,address,uint256)", +"7e8ab941": "_play(uint256,uint256)", +"7e8bca6f": "Tenteniy()", +"7e8bf1cd": "calculateCurrentMarketPixelPrice()", +"7e8c3ab6": "distributePartnerTokens()", +"7e8ca5f6": "unlockAdvisorTokens()", +"7e8d1a39": "finishIssuing()", +"7e8d2c19": "reserveForJackpot()", +"7e8e13e4": "Lesson_7(address,uint256)", +"7e8e353c": "setValidatorForND(uint256,uint256,uint256,uint256)", +"7e8e6d45": "setScaleContractAddress(address)", +"7e8ecf4f": "balanceOfInvestor(address)", +"7e8ff036": "submit(bytes32[])", +"7e904a48": "getNumContents(uint256)", +"7e904f7b": "stakePrimordialTokenFrom(address,uint256,uint256)", +"7e90819a": "unofficialApplicationSignUp(string)", +"7e9266bb": "ChallengeToken()", +"7e926b4b": "renounceOwnership(bool)", +"7e92a7e8": "getPublicBattlePokemon1()", +"7e93150b": "_transferHelper(uint256)", +"7e93163b": "tip(bytes32,bytes32)", +"7e932d32": "setFrozen(bool)", +"7e93810b": "playe1Bid()", +"7e93e4db": "KhabibvsMcGregor()", +"7e944756": "getPlayersCollection(address)", +"7e945935": "oneTokenInCents()", +"7e947347": "changeWeiCostOfToken(uint256)", +"7e94cf0c": "getValidityBondAttoeth()", +"7e951bc6": "update_coeff()", +"7e95385c": "setJackpot(address)", +"7e95cd27": "forbid(address)", +"7e95d2f6": "doSend(address,address,uint256,bytes,address,bytes,bool)", +"7e968195": "batchTransferETH(address[])", +"7e969692": "EthRateChange(uint256)", +"7e97ca29": "registeredInDay(address)", +"7e98bc8f": "Accumulate(address,uint256)", +"7e990ad8": "isRentals()", +"7e999cd9": "revokeMintDelegate(address,int256)", +"7e9a8685": "getWager(address)", +"7e9abb50": "getUnavailableTakerTokenAmount(bytes32)", +"7e9ad046": "upper(string)", +"7e9aef53": "elementsAreSet()", +"7e9b98ae": "transferFromWhiteList(address)", +"7e9ba301": "getResponseAddress()", +"7e9cd30c": "rescueLostHero(uint256,address)", +"7e9d2ac1": "burnAll(address)", +"7e9d7f68": "namiCrowdSaleAddr()", +"7e9de0bc": "buyTile(uint8,uint256,address)", +"7e9e1561": "getStakerFromDelegateKey(address)", +"7e9e1637": "getStockTotal(address)", +"7e9e1cb6": "Execution(bytes32)", +"7e9e3b3b": "RESERVED_TOKENS_BOUNTY()", +"7e9e3d51": "TokenERC20(string,string,uint8,address,uint256)", +"7e9e4b5d": "firstStageTokensSold()", +"7e9e511d": "issueAndActivateBounty(address,uint256,string,uint256,address,bool,address,uint256)", +"7e9e940a": "ClaimDisbursement(address,uint256)", +"7e9eaf41": "getMinBorrowedValue()", +"7ea01c0d": "currentLowest()", +"7ea074b3": "GetJackpots()", +"7ea11880": "VestedPayment(uint256,uint256,uint256,uint256,uint256,address)", +"7ea15da1": "priceUpdateAt()", +"7ea17a1d": "ORACLIZEQUERYMAXTIME()", +"7ea1a871": "announce(uint256,uint256,uint256)", +"7ea1b7ba": "_closeSale()", +"7ea1e2d9": "ethpause()", +"7ea23fa6": "unlockEthBalance(address,uint256)", +"7ea2bbac": "getOwnerGennezise(address)", +"7ea2be2b": "log32(uint32)", +"7ea2ddeb": "randomNumber(address,uint256,uint256)", +"7ea2e31c": "EligmaMintingContract()", +"7ea2fc89": "cancelBetByPlayer(uint256)", +"7ea30d5d": "BuyCreditsByEth(uint256)", +"7ea310d4": "getCurrentPrice(uint40)", +"7ea31352": "getReadableStats()", +"7ea31ded": "isBuyBackOne()", +"7ea46993": "revokeMultiplePermissions(address,bytes32[])", +"7ea531e7": "_generateNewHorseShoe(uint256,uint256,address)", +"7ea5d50e": "tokenWinRatio()", +"7ea5e7d3": "reserveDeployment(address,bytes32,address,uint256,uint8,bytes32,bytes32)", +"7ea60eb8": "roleEditorAddress()", +"7ea61ed7": "withdrawInternal(address)", +"7ea6c6ba": "MemoLandCoin()", +"7ea80eb2": "_receiveBuyLandForCandy(address,uint256)", +"7ea83869": "increasePreSaleSupply(uint256)", +"7ea84748": "addPlayerOrder(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"7ea868e1": "makeInvest(uint256,bytes5)", +"7ea8f250": "isRunningPreIco(uint256)", +"7ea94985": "calcHashes(uint32,uint32)", +"7ea95733": "emissionReleaseThreshold()", +"7ea9b2bc": "REQUEST_URL()", +"7eaa0c29": "LogTransactionFailed(bytes32,address)", +"7eaa4389": "finish(uint8,uint8,uint8)", +"7eab4e48": "openGiftFromSanta(address)", +"7eac7382": "getCAOAddres()", +"7eae1626": "getBack()", +"7eae6759": "_setBalance(address,uint256,uint256)", +"7eae75a8": "EtherMango()", +"7eaef50c": "over()", +"7eaf45f8": "SaveAccountBuyingGodz(address,uint256)", +"7eafcdb1": "updateGroupName(address,address,bytes32)", +"7eb13d8a": "_SetEducationQualificationOf(uint256)", +"7eb14990": "isBuyer(address,uint256)", +"7eb1bfb9": "feeWithdrawEthAll()", +"7eb2b856": "createEscrow(bytes16,address,address,uint256,uint16,uint32,uint32)", +"7eb30cd0": "checkTreeStructure(address,address)", +"7eb312b1": "SUCCESS_BONUS()", +"7eb41ce5": "modifyCfo(address)", +"7eb4b376": "UpgradeSpaceETH(uint8,uint256)", +"7eb52145": "_preValidateFinalization()", +"7eb5df39": "equal(uint256[],uint256[],string)", +"7eb60591": "NVISIONCASHTOKEN()", +"7eb6634c": "phasePresale_From()", +"7eb69ba1": "hint(int256,bytes32,string,bytes20)", +"7eb82601": "getHighestBlockNumber(uint256)", +"7eb96aa3": "setCurrentWeekPool(uint256)", +"7eb9f04a": "updatePriceInWei(uint256,uint256)", +"7eba7ba6": "getSlot(uint256)", +"7ebaaa60": "MemberBoughtToken(address,uint256,uint256,uint256,uint256,uint256)", +"7ebadcd8": "acceptPayments(bool)", +"7ebd02f8": "typeA()", +"7ebd89ee": "TokenSale(address)", +"7ebdab54": "setup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256[],uint256[],uint256[],uint256[],uint256[])", +"7ebdc478": "settleTimeout()", +"7ebdf4ac": "setMaxAllowedBetInEth(uint256)", +"7ebdf57d": "icoTimeBonusPhase1End()", +"7ebe7626": "FreezeTokensReleaseTime()", +"7ebedc34": "hasEndedIco()", +"7ebf65fd": "changeGasLimitOfSafeSend(uint32)", +"7ec0c39c": "whitelistPrincipleLockPercentage()", +"7ec0f30d": "ack(string)", +"7ec13996": "getBytes32Value(string)", +"7ec1c1aa": "acceptPAIReceiptOwnership()", +"7ec20127": "createPoolIfNeeded()", +"7ec2402f": "freezeSupply()", +"7ec27000": "AiTokenToken()", +"7ec2ae46": "setSparkDividends(address)", +"7ec2e264": "_generateCode(address,uint256)", +"7ec2fd36": "capReleaseTimestamp()", +"7ec2fd95": "DrawCom()", +"7ec36494": "osmCoin()", +"7ec3e63e": "getsubscribersSinceLastHatch(address)", +"7ec4a5a6": "requestReturn(address)", +"7ec4edbe": "offset(address,address)", +"7ec509c4": "external_call(address,uint256,uint256,bytes)", +"7ec54bdc": "eosShareDrop()", +"7ec62cf7": "MthereumToken()", +"7ec650db": "__mul(bytes,bytes)", +"7ec69c50": "changeWhitelistingStatus()", +"7ec72d3c": "setSwap(address,uint256)", +"7ec80c27": "priceStep6()", +"7ec82929": "setFunctionIdVoteRules(bytes4,bool,uint256[5])", +"7ec8ff4f": "crosairVoucherSoldCount()", +"7ec9084d": "RRCoin()", +"7ec9290b": "setCouldTrade(uint256)", +"7ec9c3b8": "per()", +"7ecab507": "registerPresale(address,uint256,uint256,bool)", +"7ecacb95": "Example7()", +"7ecaf696": "createMultiple(uint256[],uint256[],uint256[],address[])", +"7ecb6475": "aggiungiFrase(string)", +"7ecc2b56": "availableSupply()", +"7ecc866f": "changeAllowAllWhitelistIssuances(bool)", +"7eccc40a": "contains(uint256,address)", +"7ecdb299": "SetEthBalance(address,uint256)", +"7ecdbf61": "SPPSeriesA(uint256,string,uint8,string)", +"7ece75dd": "lockPeriodStart()", +"7ecedac9": "allInitialOwnersAssigned()", +"7ecef543": "_getAppliedPolicyIndex(address,uint8)", +"7ecf9142": "depositToken(address[2],uint256[7],uint8,bytes32[2])", +"7ecfa8a8": "ico(address,address,uint256,uint256,address[],uint256[])", +"7ecfae65": "invokeFor(address)", +"7ecfb675": "stdBalance()", +"7ed02af9": "acceptNegotiationTenant()", +"7ed02cbe": "fireLottery(uint8)", +"7ed040f2": "prod(bytes32,uint128)", +"7ed04cf2": "getTokenNames(address,uint256[])", +"7ed05315": "newGubberment()", +"7ed06cf3": "nativeProof_verify(string,bytes,bytes)", +"7ed0c3b2": "write(bytes)", +"7ed0f1c1": "redeemed(uint256)", +"7ed18aa5": "WhitelistUpdated(address,uint8)", +"7ed19af9": "multiAccessRevoke(bytes32)", +"7ed1ca6a": "BetExecuted(uint256,address,uint256)", +"7ed273e9": "_mintToken(uint256,string,address)", +"7ed2d5ae": "getBlockBalance(uint256,uint256)", +"7ed32df6": "buyRtc()", +"7ed37b8d": "setPotato(string)", +"7ed40602": "IsICOstarted()", +"7ed4e321": "CakeToken()", +"7ed51b47": "getResult(uint256,uint256,uint256,uint256,uint256)", +"7ed57fa0": "pregnantHorses()", +"7ed5a6d4": "TYPE_EXPLORER_FREIGHTER()", +"7ed5d621": "Crowdsale(address,address,address,uint256,uint256,uint256)", +"7ed65c87": "closeProvider()", +"7ed67185": "getPoolTimeoutInBlocks(uint256)", +"7ed7101d": "mainIcoStartBlock()", +"7ed77c9c": "setContract(bytes32,address)", +"7ed788c8": "push(address,uint256,uint256)", +"7ed83d50": "INCO()", +"7ed8a719": "addItem(string,string)", +"7ed8b225": "createMesaVerify(bytes32[])", +"7ed9c734": "burnRemainingToken(uint256)", +"7ed9d3a3": "_error(uint256,bytes32)", +"7eda09e8": "test_me(int256,int256,int256)", +"7edaabd8": "sendApprovedTokensToInvestor(address,uint256,string,string)", +"7edaca89": "DAToken(uint256,string,uint8,string)", +"7edba6c8": "sam()", +"7edd9060": "_nominCap()", +"7eddea21": "STAKEHOLDERS_POOL()", +"7ede036d": "minimumSupply()", +"7edea039": "private_addPermittedRoll(uint256)", +"7edebaf1": "buyXname(string)", +"7edee605": "receivePayment(uint256,uint256,bytes)", +"7ee0cda4": "validate(string,uint256)", +"7ee0d91c": "isKycRequired(address)", +"7ee212bb": "planetIndexToApproved(uint256)", +"7ee23d59": "removeNodeFromStakedList(address)", +"7ee26b2e": "callKoikeToken(address,address,uint256)", +"7ee26e63": "_alreadyInList(address)", +"7ee2ea76": "isSafeHavenToken()", +"7ee42e6d": "_createToken(string,bytes5,address,uint256)", +"7ee54b82": "TYU(uint256,string,uint8,string)", +"7ee54eec": "onTicketPurchase(uint32,address,uint16[])", +"7ee55c97": "isICO()", +"7ee5c97a": "returnReferral(address)", +"7ee5eef2": "changeToPublicSale()", +"7ee62440": "highEtherBonusLimit()", +"7ee65635": "LookAtDepositsToPlay()", +"7ee6b2d0": "fundingMinCapInWei()", +"7ee7f42a": "MIN_RELEASE_DATE()", +"7ee80d17": "isScheduled()", +"7ee81902": "DatoDEX(address,address,address,uint256,uint256,uint256)", +"7ee8703a": "getProgressOfAddressAndId(address,address,uint32)", +"7ee96f6d": "getEnd(uint256)", +"7eeb5906": "createCountry(string,string,uint256)", +"7eec20a8": "cancelTask(uint256)", +"7eed2814": "transferAD()", +"7eee1ab6": "HahaCoin()", +"7eee288d": "unlock(address,uint256)", +"7eee56f9": "issueIcoCoins(address,uint256)", +"7eee6d1f": "getUserQuickPromoBonus(address,address)", +"7eeec2cf": "GigaWattToken()", +"7eefe47e": "editCode(uint256,string)", +"7ef01fb9": "totalLockedBonus()", +"7ef0356a": "littafiTimeCapsule(bytes32,string,string,string,string,uint256)", +"7ef039f8": "candySentAmount()", +"7ef09476": "transfer(uint64,address)", +"7ef1925b": "getShareRange(uint256,uint8)", +"7ef1a396": "YOU9COINToken(string,string,uint8,uint256)", +"7ef1ab2c": "payoutRange()", +"7ef224ee": "getContractOrNormal(address)", +"7ef26d42": "HardCapEthereum()", +"7ef2bd52": "currNumOfUpgrades()", +"7ef3bb63": "createKitties()", +"7ef3e741": "totalEtherReceived()", +"7ef4cabb": "nextSupplyAfterBlock()", +"7ef50298": "registry(bytes32)", +"7ef581cc": "whitelistAdmins()", +"7ef58e73": "totalGooProduction()", +"7ef59d01": "setTrader(address,bool)", +"7ef5b6ea": "refillTokens(uint256)", +"7ef5e6a2": "rescale(int128)", +"7ef61e28": "dayEthInLimit_()", +"7ef72eb5": "AlphaMarketCoin(address)", +"7ef7ce92": "revokeMint(uint256)", +"7ef81a34": "TestableTwoStageSale(bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address,uint256,uint256,uint256)", +"7ef9016e": "MultiTransferValue(address[],uint256)", +"7ef92867": "Faucet(address)", +"7ef95c6f": "extractAccountAllowanceRecordLength(address)", +"7efa1433": "EVNTToken(address)", +"7efc05ae": "TUBECOIN()", +"7efc2315": "minPaymentForAnswer()", +"7efcbb33": "getTradeRecord(uint256)", +"7efce4ff": "TransactionRefunded(uint256,uint256)", +"7efce591": "TokenRDN(uint256)", +"7efd3441": "DynamicSKx2(uint256)", +"7efd9112": "decodeTokenId(uint256)", +"7efe0e76": "PhoenixFundDeposit()", +"7efe294c": "removeFromFreezedList(address)", +"7efe3d86": "dataControlChangeMinApproval(uint8)", +"7efe64ba": "InfinityHourglass()", +"7eff1465": "setAccountAllowance(address,address,uint256)", +"7eff275e": "changeProxyAdmin(address,address)", +"7effb427": "TTTToken()", +"7efff887": "topUpBalance()", +"7f002ffe": "setTradeable(bool)", +"7f004afa": "participantRoundChange(address,address,uint256)", +"7f005c7c": "showHiddenValue()", +"7f006ce1": "reading_card_upright_at(uint8)", +"7f008a0a": "cancelSell()", +"7f01bb38": "getVestingRevocable(address,address)", +"7f052e03": "commitPlasmaBlockRoot(bytes32)", +"7f053808": "approveAndAuction(uint256,uint256,uint256,uint256)", +"7f0554ca": "mntToken()", +"7f056637": "testExecuteSellOrder()", +"7f05c3a6": "supportAccounts(address)", +"7f067ff7": "Bitcoinsummit()", +"7f069942": "transferToBeneficiary()", +"7f070a9b": "withinRefundPeriod()", +"7f0899f2": "AddTicket(bytes5[])", +"7f08a250": "testPoint(uint256[3])", +"7f08ea8b": "getBetPool(uint256,uint256)", +"7f08ea8f": "getTotalTokensPerArray(uint256[])", +"7f09171b": "addAd(address,uint256,uint256,uint256,string,string)", +"7f095bfb": "multiSendB(uint256,uint256)", +"7f09ad64": "drainMe(uint256)", +"7f09bd1d": "setEthPreAmount(uint256)", +"7f09beca": "moveToWaves(string,uint256)", +"7f0a1bed": "bidderPlaceBid()", +"7f0b61f7": "ManagerEnabledEvent(address)", +"7f0bd881": "wanport()", +"7f0c949c": "setJurisdication(string)", +"7f0cd33c": "ApproveAndtransfer(address,uint256)", +"7f0d35e2": "totalPublicSaleWei()", +"7f0da94e": "cooloffIncrement()", +"7f0ed037": "setKickOff(uint8,uint256)", +"7f0f04a8": "unregister(bytes32,address,uint256,uint256,uint256)", +"7f0f09af": "EtherdeCoin()", +"7f102c16": "currentGameStatus()", +"7f10a3c0": "presaleBonusAddress()", +"7f1165c1": "getSencBalance()", +"7f1482b1": "round3Bonus()", +"7f15a21c": "modify(address,address,uint256)", +"7f15a6a3": "setCCH_edit_31(string)", +"7f16ab50": "replaceAuthorised(address,address)", +"7f16d7b3": "TRL2()", +"7f1731b6": "unsetRegistrar(uint256,address)", +"7f17b05d": "OwnerAddress()", +"7f17b79d": "setGameCost(uint256)", +"7f17ce9b": "DIGIPLACED()", +"7f180db7": "kudos(uint256)", +"7f187d2d": "score(bytes32,string)", +"7f18b569": "setKncPerEthBaseRate()", +"7f18f10c": "setGeneContractAddress(address,address)", +"7f191255": "punchOut(address,uint64)", +"7f1926c7": "GagarinToken()", +"7f1a2a73": "getEmployerAvgRating(address,address)", +"7f1a4c1f": "withdrawContributorsTokens(address,uint256)", +"7f1a8749": "purchaseMakeAdv(uint256,string,string)", +"7f1b1e51": "testTooFewTokens()", +"7f1b8cc3": "getUsersByBalance()", +"7f1bb473": "daysFrom(uint256)", +"7f1bffc1": "_removeToken(uint256)", +"7f1c25d0": "HolaMundo()", +"7f1ce417": "isITOFinished()", +"7f1ebc4d": "reentrantGuard()", +"7f1ecfe0": "getCurrentBid()", +"7f1f0507": "publicRate()", +"7f205a74": "SALE_PRICE()", +"7f205c8c": "getOraclizeCallback(bytes32)", +"7f205f02": "changeBoolean()", +"7f21d498": "getMinBid(uint256)", +"7f23fb92": "setGenres(string)", +"7f2438cb": "sellFor(address,uint256)", +"7f25c1e4": "etherRaisedByState(uint256)", +"7f2609eb": "LogFinalizeMatch(uint256,uint8)", +"7f26fc7d": "removeCreator()", +"7f279a73": "Cashing(address,uint256)", +"7f2857b6": "viewFunc()", +"7f28c44f": "isIcoSuccessful()", +"7f290d2d": "ExpiringMarket(uint64)", +"7f293e02": "ChangeCoinCrowdsale()", +"7f294b10": "setPI_edit_26(string)", +"7f298f93": "crowdsaleEndBlock()", +"7f2a4784": "KYC_VERIFICATION_END_TIME()", +"7f2aeea4": "getType(bytes32)", +"7f2b06ed": "bonusLimit3()", +"7f2b88ea": "getThirdPhaseCap()", +"7f2c1633": "prenesiKovance(address,uint256)", +"7f2c4ca8": "getLastBlock()", +"7f2e01fb": "ListValidated()", +"7f2e0ec2": "remainRewards()", +"7f2e98ad": "PoissonData()", +"7f2f506b": "CLAIM_INTERVAL_DAYS()", +"7f300576": "startThrowing()", +"7f301b83": "setMetadataHash(string)", +"7f31b480": "changeMasterAddress(address,address)", +"7f31cbfa": "batchShareAmount(address[],uint256[],uint256,uint256,uint256)", +"7f32f6de": "isSoftCapCompleted()", +"7f33375b": "getReturnedData()", +"7f334bd1": "_generateRandomId(string)", +"7f33c1e1": "Ethurem()", +"7f3436ef": "addOrganisation(address,string,string,string)", +"7f349329": "currentRoundSupply()", +"7f35571f": "Sell(uint256,address)", +"7f3681f6": "setKNCRate()", +"7f3745ad": "execute_transfer_all(uint256)", +"7f3745db": "getTracksByArtist(address,uint256,uint256)", +"7f37b905": "salesCounter()", +"7f37fab6": "addActionToRole(string,string,string)", +"7f3800ba": "setMultihash(bytes32,string,bytes)", +"7f386b6c": "minimumPrice()", +"7f38a4a7": "updateUSDETH(uint256)", +"7f38b980": "setTokenDistributionPool(address)", +"7f38e526": "pendingPayments(address)", +"7f390088": "QYCC()", +"7f3a2472": "reserveIssue(address,uint256)", +"7f3a98b7": "burnMyBalance()", +"7f3ad651": "KayoToken(address,address,uint256,string,uint8,string,bool)", +"7f3bd56e": "disburse(address,uint256)", +"7f3c26b1": "rejectHours()", +"7f3c2c28": "registerContract(string,address)", +"7f3cb47b": "minimumAmountWei()", +"7f3cd28e": "tokenSalesByOwner(address,uint256)", +"7f3d5c4c": "ICOPaused()", +"7f3ded93": "voxFab()", +"7f3df4bb": "addBonus(uint32[],uint64[])", +"7f3e1841": "endSecondPeriodTimestamp()", +"7f3e4d1b": "setAtkNowForPlayer(address)", +"7f3f3398": "transferAndCallExpanded(address,uint256,bytes,address,address)", +"7f3f81c0": "confirmProposal(bytes32,address,uint256)", +"7f404b7f": "updateInt256(bytes32,int256)", +"7f40d9d8": "delayDonPhase(uint256,uint256)", +"7f4316ec": "getDefendPlayerList()", +"7f4384a8": "RichNiggas()", +"7f440d57": "getProjectReport(uint256)", +"7f445c24": "subRegistrar(string)", +"7f44fcfa": "_getPoints(uint256)", +"7f453951": "CBMDToken()", +"7f45b835": "getPrimaryRecord(string)", +"7f45ec91": "emitIssuance(uint256)", +"7f460693": "ownerPutCapital()", +"7f46550f": "CrowleyToken()", +"7f476471": "setRCContractAddress(address)", +"7f480f9d": "processDividends(address)", +"7f486ca6": "cancelChibiForFusion(uint256)", +"7f493ce6": "disableTokenTransferability()", +"7f497550": "scheduleTransfer(address,uint256,uint256)", +"7f498ffc": "setEnd(uint256)", +"7f4a1c52": "setExceed(uint256)", +"7f4a9691": "depositTokenToVault(address,uint256,uint256)", +"7f4ab1dd": "messageForTransferRestriction(uint8)", +"7f4ae68d": "restrictedAddress()", +"7f4af951": "pixelPrice(uint256,uint256)", +"7f4bf7d1": "Inerex(bytes32)", +"7f4c7064": "ESCROW_TOKENS_PERCENT()", +"7f4d5150": "CheckItemExists(uint256)", +"7f4d6aa4": "LogResumed()", +"7f4da132": "goldFee()", +"7f4db7fb": "testPrivate(uint256)", +"7f4e4669": "raiseInitialSupply(uint256)", +"7f4e4849": "getContractState()", +"7f4ec5a7": "toAddressThrow()", +"7f4ed2c7": "addToWhitelistMulti(address[])", +"7f4ed5ac": "sumHardCapICOStage2()", +"7f4edd72": "getAllAdIdsByUser(address)", +"7f4ef9d4": "getText(uint256)", +"7f4fd78e": "BTCCollected()", +"7f50c74b": "FIXED()", +"7f51bb1f": "updateTreasury(address)", +"7f52fcae": "tokenAmountPerUser()", +"7f5341da": "startTimeSale3()", +"7f5369f1": "DEFAULT_REVOCABLE()", +"7f5375c1": "getLastWin()", +"7f53b15d": "_ICOSale(address,uint256)", +"7f555b03": "erc20Proxy()", +"7f55b2d9": "cleanBalance()", +"7f55b87f": "createCountry(string)", +"7f564472": "resetAmountBonuses()", +"7f5651d7": "setNamehash(string,bytes32)", +"7f56c072": "SIEChain()", +"7f56c0b4": "setTeamFundWallet(address,address,uint256)", +"7f56ca73": "Volkstest2()", +"7f573a4f": "UNSOLD_SOLD_RATIO()", +"7f582b47": "howMuchWithdrawed()", +"7f58b9ee": "allQueryIds()", +"7f592be4": "TRANCHE2_ACCOUNT()", +"7f592cfe": "setLLV_edit_12(string)", +"7f59cbcc": "withdrawFromRelay()", +"7f5a259f": "FIXED_RATE()", +"7f5a285a": "notInWhitelistAllow()", +"7f5a448c": "switchToWhaleMode(bool)", +"7f5ae339": "isAdminister(address)", +"7f5b47cd": "eventApproval(address,address,uint256)", +"7f5b503c": "toB32(bytes,uint256,address)", +"7f5ba3cc": "REGULAR_TYPE2()", +"7f5ba79f": "registerNewProduct(uint256,string,string,string)", +"7f5bfe30": "PaymentExecuted(uint256,address,uint256)", +"7f5d3dc8": "getStats(uint256,uint256[7])", +"7f5d85f8": "testBurnGuyWithTrust()", +"7f5dfd16": "approveProxy(address,address,uint256,uint8,bytes32,bytes32)", +"7f5e495d": "defaultLimits()", +"7f5f0d6a": "resumeIco()", +"7f5f17b1": "getCompte_8()", +"7f5f9128": "alreadyReservedForTeam()", +"7f601a50": "getHouseCardsNumber()", +"7f602231": "tip(bytes32,address,uint256)", +"7f60b20a": "getSlice(uint256,uint256,string)", +"7f60bb7c": "applyBonusAmount(address,uint256,bytes32)", +"7f6150cb": "getRoundCurKeyNo(uint256)", +"7f626f1a": "setStore(uint256)", +"7f630259": "getSuperReferrerRate(address)", +"7f63040b": "CompcoinCash()", +"7f630b4c": "share(string)", +"7f63af42": "deployConsortium(address)", +"7f64727b": "getTreesOnSale()", +"7f649783": "addToWhitelist(address[])", +"7f64c34e": "deadline365()", +"7f64d2d3": "NCAAChampionship()", +"7f654b1c": "setLatestPayday(address,address,uint256)", +"7f6578d3": "REFUND_PERIOD()", +"7f6597e0": "AcuteEthereumCloudMiningunion()", +"7f660b01": "FEE_COLLECTOR()", +"7f66af09": "card_titanium_first()", +"7f66ccbe": "EthereumVerge()", +"7f66d1f8": "mOnApprove(address,address,uint256)", +"7f671c1b": "insert(int128)", +"7f686259": "migrateBalancesFromLegacyRep(address[])", +"7f695f28": "isFlying()", +"7f6a731c": "donationAmountInWei()", +"7f6ae0c0": "canUpdateDeveloperMiningPower()", +"7f6d8955": "RegisterOne(uint32,address,address)", +"7f6ec891": "withdrawNonTopForTeam(address,uint256)", +"7f704657": "RESERVED_FOR_TEAM()", +"7f71f1f9": "controllerApproval(address,address,uint256)", +"7f725862": "_setNewEstimate(uint256,uint16)", +"7f7376e8": "launchSale()", +"7f74ac15": "ownerContract()", +"7f7575c9": "FixedSupplyCrowdsale(uint256,address,address,uint256)", +"7f760335": "PurchaseTokens(uint256,address)", +"7f761472": "canRedeemUTXOHash(bytes32,bytes32[])", +"7f7624d0": "MjolnirAddress()", +"7f7634ba": "winnerConfirmed()", +"7f76bd3a": "lastBlock_v18()", +"7f76d76d": "minCapIco()", +"7f784da7": "addNews(string)", +"7f78636a": "BASE_URL()", +"7f790b7b": "getCreateUniverseParentPayoutDistributionHashValue()", +"7f791790": "roll(uint16[],uint16)", +"7f791833": "toTimestamp(uint16,uint8,uint8,uint8)", +"7f792910": "setExchangeable(bool)", +"7f7977d1": "isFundraiser(address)", +"7f7985cf": "setEthUSD(address)", +"7f79cbfe": "MANHATTANPROXYLEXINGTONAVE()", +"7f7b1393": "getLocation(uint256)", +"7f7b17a0": "SetupPreSale(bool)", +"7f7c1491": "remove(address,address)", +"7f7d31dd": "sub32(uint32,uint32)", +"7f7d711e": "setRequireCustomerId(bool)", +"7f7dcdbf": "isContractOwner()", +"7f7de185": "handleProductionDecrease(address,uint256)", +"7f7fde8e": "sellAssets(address[],uint256[])", +"7f81f0b9": "setTransferLock(uint256)", +"7f83a4a6": "canRefund()", +"7f83bf7d": "setMinimumPayment(uint256)", +"7f84017f": "SELL_SOFT_LIMIT()", +"7f848ccb": "_packMakeData(address,uint256,uint256)", +"7f85066e": "Reflex()", +"7f853e7e": "MLCToken()", +"7f85c599": "addOrder(bytes32,address,uint256,uint256)", +"7f860330": "batchReturnEthIfFailed(uint256)", +"7f863cab": "Bid(address,uint256,address,uint256)", +"7f8661a1": "exit(uint256)", +"7f869d98": "stepFour(int256)", +"7f86cd3f": "parseLoanOfferRates(uint256[10],uint32[4])", +"7f86d985": "drunkness()", +"7f86f7f4": "walletPlatform()", +"7f877710": "recoverUnawardedMILs()", +"7f879229": "setSalesUser(address)", +"7f88616f": "onlyAdminAndNotInit()", +"7f89ce48": "initTiers(uint256[],uint256[])", +"7f8b8f48": "Ledger(address)", +"7f8b9478": "getImpliedRoot(bytes,bytes,uint256,bytes32[])", +"7f8c263f": "dragonBalance(address)", +"7f8d429e": "isFinalized(bytes32)", +"7f8d53c6": "put(address,uint256)", +"7f8dafef": "unsoldAllocationCount()", +"7f8fdcfb": "suspendDeposit()", +"7f9144ce": "token_member_order_pop(address,address,uint32)", +"7f91fb7d": "isSignedBy(address)", +"7f9245d0": "_clearTokenApproval(uint256)", +"7f924c4e": "testDeposit()", +"7f925c93": "withdrawSeller(address[2],uint256[7],uint8,bytes32[2])", +"7f93354b": "multiVoteNoLock(address[],uint256[])", +"7f9343ad": "playNumberSuit(uint256[])", +"7f93de95": "deposit100Percent()", +"7f947168": "TimeTransferAllowed()", +"7f949386": "updateMessage(uint256,string)", +"7f949ac0": "ethashContract()", +"7f94a8fa": "getWriteTimestamps(bytes32[])", +"7f95d6f6": "accountBalances(uint256)", +"7f95d919": "DistrFinished()", +"7f967a8c": "IsExchanged(address,string)", +"7f9785b0": "_resetList()", +"7f97e836": "didCommit(address,uint256)", +"7f98444f": "randomEnd()", +"7f99e11a": "isMiningOpen()", +"7f99f3c4": "MaybePerformOpen()", +"7f9ac04f": "balancesStaticoin()", +"7f9b48bc": "setCompte_9(string)", +"7f9bf9e4": "startMinting(string)", +"7f9c23e0": "_determineHitPoints(uint256)", +"7f9c8974": "getAssetCollectedOreBallancesArray(uint256)", +"7f9c9d91": "_getBorrowAmount(uint256,uint256,uint256,uint256,bool)", +"7f9cbfc1": "checkPayments()", +"7f9d139a": "positionScount(address)", +"7f9d2044": "UniBowToken()", +"7f9d314e": "autoBirth(uint256)", +"7f9df012": "VoteRevealed(address,uint256,uint256,uint256)", +"7f9f5495": "levelTokens()", +"7fa0c10f": "DeleteUserByAddr(address)", +"7fa0c908": "newChow(address)", +"7fa22001": "assertEq0(bytes,bytes,bytes)", +"7fa24846": "SetSAToEContract(address)", +"7fa28d75": "transferRightIfApproved(address,bytes32)", +"7fa34e92": "preIcoAddr()", +"7fa39958": "RateAdd(address)", +"7fa3f3d0": "addLock(uint256)", +"7fa400e4": "totalTokensAvailableForSale()", +"7fa40a42": "sumICOStage8()", +"7fa44926": "setMinMaxInvestValue(uint256,uint256)", +"7fa4cacb": "setDestinationAddress(address)", +"7fa5aa9d": "registerPreSignedHashing(address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256)", +"7fa6c365": "phase3MaxTokenForSale()", +"7fa6c745": "_setNewStartTime()", +"7fa767bc": "createBox()", +"7fa7a7c8": "buyInWithAllBalance()", +"7fa7acf8": "createCertification(uint256,uint256)", +"7fa87949": "unblockAccountFunds(address,uint256)", +"7fa8c158": "startICO()", +"7fa9aa76": "owner_updateBaseFee(uint256)", +"7faa0044": "renderString(string)", +"7fab541c": "exec(bytes32,bytes)", +"7fab624b": "purchaseGenes(uint256,uint256,bool)", +"7fabbd7b": "unilateralRefund(bytes32)", +"7fabe1a5": "allPendingRefs()", +"7fad54e4": "distributeGame(uint8,uint256)", +"7fad9b53": "BASE_TEAM()", +"7faddcfb": "currentDistributionAmount()", +"7faff876": "updateUser(bytes32)", +"7fb00168": "CryptekZ()", +"7fb0a445": "systemSaleAddress()", +"7fb0fe14": "voteCandidateTwo()", +"7fb158c5": "ChannelSettled(address,address,uint32,uint192)", +"7fb181c1": "swapTime()", +"7fb191a5": "TokenVestingContract(address,address,bool,bool,bool,address)", +"7fb1a5ed": "AirdropController()", +"7fb33170": "transferAdmin(address,uint256)", +"7fb33dc6": "burnTokensWhenFinished(address)", +"7fb3d459": "GetChipsInfo(address)", +"7fb419b6": "WalletBoss()", +"7fb5d847": "delTransferWhiteList(address)", +"7fb5ff3e": "MNTP()", +"7fb7b5ed": "enableTeamWithdraw()", +"7fb9e405": "getTitulaire_Compte_10()", +"7fbb1b56": "claimEgg(uint8)", +"7fbb345e": "getInvestorsTokens(address,address)", +"7fbc0c48": "_mint(uint256,address,string,string)", +"7fbc9c55": "calculateMultiplierAfterConversion(uint256,uint256,uint256)", +"7fbcef65": "BTH(address[],uint256,address,uint256,uint256,uint256)", +"7fbd778a": "getTotalScientists()", +"7fbe0680": "MIN_PURCHASE_OTHERSALES()", +"7fbea955": "getCanvasByState(uint8)", +"7fbf28f7": "_withdrawDivis(address)", +"7fc29fc9": "authorisedMinter()", +"7fc32915": "ThrowbackThursdayToken()", +"7fc38e04": "SponsorshipReceived(string,string,string,uint256)", +"7fc3bb26": "endPostICO()", +"7fc3f49e": "getReinvestableTokenAmount(address)", +"7fc446f2": "changeCustomDefrostingRate(address,uint8)", +"7fc4d6c3": "isPhaseExist(address)", +"7fc53fb5": "returnInvestmentsToInternal(address)", +"7fc543ec": "_donations(uint256)", +"7fc55eb4": "ContributionWallet(address,address)", +"7fc56856": "IOXDistribution(address)", +"7fc5af95": "getWinnerList()", +"7fc5f05c": "changeVoters(bytes32,address,string)", +"7fc611f0": "multiCall()", +"7fc729c2": "_buy(address,uint256,bytes)", +"7fc7e643": "SetUp(uint256,uint256,uint256,address)", +"7fc88fe2": "timelockContractAddress()", +"7fc8b612": "interadduser(address,uint256)", +"7fc8fd9e": "Update_MediatedTransaction(uint256)", +"7fc90182": "Pool(uint256)", +"7fc90a5c": "batchAssignTokens(address[],uint256[],uint256[])", +"7fc96619": "getPartner(uint256)", +"7fca432e": "FHFTokenCrowdsale(address)", +"7fcac0fb": "USDBCoin()", +"7fcae430": "PendingApplication(address,uint256,string)", +"7fcaf666": "setString(string)", +"7fcb024a": "secondLockTime()", +"7fcb2386": "MorrowToken()", +"7fccb4ba": "transferAppOwner(bytes8,address)", +"7fcd3ce2": "maxBetPrice()", +"7fcdd1f0": "setConfirm(uint256)", +"7fcf3a2f": "throwFooBar()", +"7fcf440a": "getOwnerBalance(address)", +"7fcf532c": "Withdrawal(address,uint256)", +"7fcf64b2": "updateEarnedBy(uint256,uint256)", +"7fcfb422": "increaseApprovalWithData(address,uint256,bytes)", +"7fcfc4a0": "ApisToken()", +"7fd004fa": "submitWhitelistAddition(address[])", +"7fd13532": "whitelistMany(address[],uint256,uint256,uint32)", +"7fd169d6": "createGroup(string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"7fd19692": "setLockAddress(address,bool)", +"7fd2304f": "_maximumBuy()", +"7fd238ba": "doCoinage(address[],uint256[],uint256,uint256,uint256)", +"7fd26dd1": "tokenUsers(uint256)", +"7fd2ffa7": "InvestorWhiteListAddition(address)", +"7fd30df0": "mintBulk(address[],uint256[])", +"7fd39247": "setOwner(uint256,address)", +"7fd42617": "safeWithdraw()", +"7fd5bb31": "propose(address,bytes32,address[],bytes32[])", +"7fd5dd04": "APPROVE_OWNER()", +"7fd6f15c": "feePercent()", +"7fd751a8": "PRICE_ICO2()", +"7fd84609": "setOwnerThree(address)", +"7fd8601e": "deathData_v5()", +"7fd8d339": "changeicoBackend(address)", +"7fd8d51d": "stakeGLXForContributors()", +"7fd8ee68": "computeNameHashExt(bytes)", +"7fda8d52": "internalEnableRefunds()", +"7fdac6f1": "getCurrentCreditsExchanged()", +"7fdafafa": "totalTreePower()", +"7fdb0d6b": "Latcoin()", +"7fdb5031": "transferableTokens(address,uint256)", +"7fdb5efb": "GDCAcc01()", +"7fdb6720": "teamFundAddress()", +"7fdbd0f2": "ERC721DutchAuction(address,uint256)", +"7fdc5bd6": "LANA()", +"7fdc8290": "isUnderscore(bytes1)", +"7fdd458d": "createWithParents(bytes32,bytes32,bytes32[])", +"7fdd5403": "clearApproval(uint256)", +"7fdd69f6": "setMaxAllowedReservingPercentage(uint256)", +"7fddc0de": "getBiddingInfo(uint16,address)", +"7fde1c8a": "addRole(address,uint256)", +"7fde24c7": "addToPrivateWhitelist(address)", +"7fdea25b": "newVoting(uint8)", +"7fdf6911": "checkRoundAndDraw(address)", +"7fdfbe1b": "getBytes(string,uint256,uint256)", +"7fe02f94": "fireFightResultsEvents(uint8[4])", +"7fe0518a": "asyncSend(address,uint256)", +"7fe09003": "NewBlock(uint256)", +"7fe0c38b": "JOCKEY_LIMIT()", +"7fe0ff52": "StorageFee(address,uint256)", +"7fe11990": "authoriseManyAccounts(address[])", +"7fe11adc": "resetStage(uint8)", +"7fe18cf7": "_getInStageIndex()", +"7fe1a801": "setBountyCampaign(address)", +"7fe1dc7e": "getToken(bytes)", +"7fe1feb0": "initEmployee1()", +"7fe23f62": "winPool()", +"7fe275d4": "culmulative_demurrage_collected()", +"7fe320ab": "mvpExists()", +"7fe38fc3": "etherwow()", +"7fe3dc2e": "getGasCost()", +"7fe551fd": "clearingPrice(bytes32)", +"7fe5850b": "_redeemByDefaultPartitions(address,address,uint256,bytes,bytes)", +"7fe60640": "updateBtsPoint(int256,uint16,int256,uint16)", +"7fe650b1": "finalizeICOOwner()", +"7fe6eee0": "fundingLimit()", +"7fe846ba": "isSubjectDestruction(uint256)", +"7fe864b8": "MAX_TOKEN_CAP()", +"7fe88885": "storeHash(bytes32)", +"7fe8ca66": "sendInput(int256,int256)", +"7fe97bc5": "getSqrY(uint256)", +"7fe98ae0": "updateEthICOThresholds(uint256,uint256,uint256,uint256)", +"7fe9d39c": "changebeginnerprotection(uint256)", +"7fea061a": "TimeTransferAllowanceChanged(string,uint256)", +"7fea0d4b": "beforeAll()", +"7feb4685": "Chende()", +"7febd721": "presaleAmountRemaining()", +"7fec1b7a": "WBT()", +"7fec5d33": "Eightk()", +"7fec8d38": "trigger()", +"7fecd538": "isWaiting()", +"7feda59a": "revokeAttribute(address,string,bytes)", +"7fee4ecb": "GAS_PER_DEPTH()", +"7feec9be": "sams(uint256,string,string)", +"7feed5b6": "price_exponent1()", +"7fef036e": "totalEntries()", +"7fef21d4": "getBoundingBox(uint256)", +"7fef2d38": "updateMatchInfo(uint256,string,uint64,uint64)", +"7fefde53": "WillRegistry()", +"7ff02139": "updateCrytal(address)", +"7ff0346b": "getContents(bytes32[])", +"7ff276bd": "totalEthFundCollected()", +"7ff2acb7": "getData_2()", +"7ff2c70a": "ipo_price()", +"7ff2cf93": "getcertifieddatacount()", +"7ff31d2b": "setData_28(string)", +"7ff3366f": "TeamAddress()", +"7ff44544": "GetCurrentSalePrice(uint256)", +"7ff44a91": "getAllKeyNum()", +"7ff4b630": "action(bytes32[])", +"7ff6ea1c": "WolkCreated(address,uint256)", +"7ff6f83a": "_distributeTax(uint256,address)", +"7ff701dd": "TrackerToken()", +"7ff70a89": "getOwnedTokenList(address)", +"7ff729fc": "fillUpProject(uint256,uint256)", +"7ff860f6": "batchCreateAssetSale(uint256[],uint256[],uint256[],uint256[])", +"7ff86a35": "HappyBirthday(address,uint256)", +"7ff91228": "Stake(address[],address,address,uint256,address)", +"7ff92d6e": "set_address__Arina(address,address)", +"7ff931bd": "lastWinningNumber()", +"7ff988c5": "setKtcAddress(address)", +"7ff9b596": "tokenPrice()", +"7ffaae3e": "balanceEth(address,address)", +"7ffb8577": "totalGains()", +"7ffc0712": "getLifeRate(uint256)", +"7ffc80cf": "queryRandomTryTime_()", +"7ffcb093": "addVoter(address,bytes32[])", +"7ffce58e": "getTokenForInvester(address,uint256)", +"7ffdf53e": "conversionRate()", +"7ffe8be1": "setKycAddress(address)", +"7fff9f1a": "getProposalVoteCount(uint256,uint256)", +"7fffb7bd": "HelloWorld()", +"80007e83": "isVerified()", +"80008794": "round1Target()", +"80009630": "setCore(address)", +"8001553a": "OwnerRemoval(address)", +"80017cbc": "cancelLine(uint256,string)", +"80033408": "CANSale()", +"8003524e": "calcDoHash(string,bytes32)", +"800362ae": "loveStoriesCount()", +"80054c5d": "FreedomToken()", +"80056b5b": "changeAdminPrivilege(address,bool)", +"80057b9a": "getColor(uint256)", +"80059593": "numberAccounts()", +"8005993e": "getProfileHash(address,address)", +"800626a6": "AIR_1_SUPPLY()", +"8006692f": "stage3Deadline()", +"8006745b": "getPayout(address)", +"8006a5d3": "delegateAddresses()", +"8006f807": "COBAIN()", +"8007604b": "Stage1Deadline()", +"80078a0f": "ForFood()", +"8007acbf": "getActiveShareholdersArray()", +"80087745": "closeInvest(bytes5)", +"8008d5bc": "inSale()", +"8009484b": "getMaxBetAmount(uint8)", +"80097484": "transfer(address,uint32)", +"80097a8e": "adjustedPotBalance()", +"800a320a": "TokenGameTransfer(address,uint256)", +"800ab784": "verifyMerkleProof(uint256,uint256)", +"800bbd1f": "getCountTokens(address,uint256)", +"800c5086": "giveERC20AllowanceToKyber(address[])", +"800c7e38": "getCurrentPageCount()", +"800d0f6a": "LCToken(uint256,string,uint8,string)", +"800d41a3": "newExitWallet(address)", +"800deda5": "yoyoTransfer(uint256,string,string)", +"800ed545": "MWSToken()", +"800edb9d": "changeCap(uint256)", +"800f8e52": "placeBetWithInviter(uint256,address)", +"80105295": "maxUserPower()", +"801137e7": "setDepositPercents(uint256)", +"80113832": "ORDER_MODIFY(address,address,uint256,uint256,uint256)", +"801145bd": "sig_to_add(bytes16)", +"801161b0": "setMain(address)", +"80117026": "FRAC_BOT()", +"801298fa": "changePaymentFlagger(address)", +"80130383": "LGCY()", +"801336cb": "STARTING_RickAndMorty()", +"8013f267": "calcUnMaskedGuEarnings(uint256)", +"8013f3a7": "dev2()", +"8014f238": "editCard(uint8,string,string,string)", +"801512af": "SvinChainToken()", +"8015a96d": "For_admin()", +"8015e6f3": "getDungeonPower(uint256)", +"8016b6ed": "getKeyValue(address,string)", +"80173a19": "geneManager()", +"8017732d": "LDT()", +"801a115d": "transfertCopieExecutoire(bytes32)", +"801a1467": "swapFor(address)", +"801aaffb": "potWithdrawTo(uint256,address)", +"801aba56": "etherProceeds()", +"801b4189": "claimRental()", +"801c334e": "auctionIncreaseBid(bytes32)", +"801db9cc": "MIN_CAP()", +"801e2593": "maxAllowedAmount(address)", +"801f568e": "SpenderAuthorization(address,bool)", +"80200e12": "subFreelancerTotalInvoiced(address,address,uint256)", +"802028c9": "createDerivative(bool,uint8,uint256,uint256,bytes16,uint256,uint256)", +"802049ac": "setUpgradeableTarget(address)", +"8020f54e": "addAssetToNetwork(address)", +"8020fb77": "getCurPayTable()", +"8020fc1f": "isDeregistered(address)", +"802114a8": "_removeRole(address,string)", +"80218eeb": "tokensIssuedTillNow()", +"802293c2": "getResultblockHash(bytes32)", +"8022fb7a": "setFrozenCoin(bool)", +"8023769f": "getPCAddress()", +"8023ffbd": "getOverallSize()", +"80249468": "getUserHSCeducationDetails(string)", +"8024c400": "limitPerDay(uint256)", +"8025e303": "VERSION_NUMBER()", +"802608a2": "setExpirationDate(address)", +"802644a4": "fundingEndUnixTimestamp()", +"8026efaa": "token18KstepCAP()", +"8026fe24": "FundTransfer(address,uint256,uint256,bool)", +"8026ffd9": "_move(address,address,uint256)", +"80270b33": "CSCResource(string,string,uint256)", +"80274db7": "preRelayedCall(bytes)", +"8027dece": "updateShare(address[],uint256[])", +"8028bdc4": "returnedCWC(address,uint256)", +"8028ce6b": "claimRefundsFor(address[])", +"80296dec": "admin_check(address)", +"802a350f": "addCustomerService(address)", +"802b1d93": "officiant()", +"802b45e2": "ISBCoin()", +"802b8453": "setPerventValue(uint256)", +"802bbab2": "ChainStarBase(uint256,string,string,uint8)", +"802c8cda": "_cancelEscrow(address,uint256)", +"802cd15f": "changeDistributor(address)", +"802d1848": "setLimitations(uint256,uint256,uint256)", +"802daa62": "latinotoken(uint256,string,uint8,string)", +"802de8fc": "setPremiumFactors(bytes32,uint256,uint256)", +"802deb22": "TokenTrader(address,uint256,uint256,bool)", +"802ea720": "getTotal(bytes)", +"802eb89c": "_getWeight(uint256)", +"802f2ffa": "_addPayment(address,uint256,uint256,uint8)", +"802f5bae": "ADDITIONAL_PORTION()", +"802fcc0d": "internalSafeTransferFrom(address,address,uint256,uint256,bytes)", +"80311bf9": "buyCore(uint256,uint256,uint256,uint256)", +"8031233c": "inflationCompBPS()", +"80318be8": "transferOverride(address,address,uint256)", +"8031e85c": "calculatePremium(uint256,uint256,uint256,uint256,string,string,string)", +"80322cbd": "isNowApproved()", +"80325b2d": "queryN(uint256,string,bytes,uint256)", +"8032751b": "returnInvestments(uint256)", +"803287de": "_frozenTokens()", +"80330982": "sendEther(address,address)", +"80334b8f": "TomBit(uint256,string,uint8,string)", +"8033c643": "ROSCAv1(uint16,uint128,uint256,address[],uint16)", +"8033cc70": "StealthToken()", +"8033fe49": "releaseEnd()", +"80341744": "contactsAddresses(uint256)", +"803435d7": "startDefinedGameManually(uint256)", +"80355798": "isAlreadyUsed(uint256)", +"803587ae": "invalidateCertificate(bytes32)", +"8036b5db": "setPresidenteDeMesa(bytes32,uint256,uint256,bytes32)", +"8036d757": "getRateUpdateBlock(address)", +"80373436": "setSecondaryGameManager(address)", +"80378b78": "setShopRunning(address,bool)", +"8037bfe0": "unRedeemedMTU()", +"803965c4": "amountFixed()", +"803a62ea": "Register(uint256,address,address)", +"803b4c11": "OwnerUpdate(address)", +"803c64c3": "GetCardList(address)", +"803c6fa9": "getWeiTokensOwed(address)", +"803c8383": "getKey(address,address,uint32)", +"803cc0d0": "kscTransfer(address,uint256,string)", +"803d65ff": "_sendtoken(address,address,uint256)", +"803e8fbb": "lengthOf_dataPattern_to_voteRulesHash()", +"803ea2ee": "MoneyTransfered(address,uint256)", +"803fbe5b": "paymentRegularTokens(uint256,uint256)", +"803fcd43": "check(address,address,address,address,uint256)", +"80402564": "addrList(uint256)", +"8040cac4": "testOverflow()", +"80412042": "decrementOwnedTokensLength(address)", +"8041fcc4": "AVMToken()", +"8042b215": "developerPctX10K()", +"8042fba5": "newEscrow(address,address,address,uint256,bytes32,bool)", +"8043154d": "post(address,bytes32,bytes32)", +"804327bb": "buyPreIcoTokens(uint256)", +"8043c9c0": "eventName()", +"8043cf2d": "mintB()", +"8044c67e": "updatePrizes(uint256[])", +"804518a8": "nic()", +"8047ba70": "getTokensAmountUnderCap(uint256)", +"8047cb93": "createGame(bytes32,uint256,address)", +"8047cf41": "init(uint256,string,uint8,string,address)", +"80496fd6": "CaData()", +"804afd9e": "vigAddress()", +"804afffb": "tokenIndexToPrice(uint256)", +"804b55d5": "finaliseAs(address)", +"804ba97a": "tryGet(bytes)", +"804c68aa": "allocateTCLRinTeamTokens()", +"804c7fa0": "_migrateExoplanet(uint256,string,uint256,uint32,string,uint32,uint8,string,address)", +"804d564c": "whitelist10Addresses(address[10])", +"804d77c8": "approveLoanIdentifier(bytes32)", +"804e11dc": "testThrowsDisownNotTransferable()", +"804e1c53": "_updateProfit(uint256,bool)", +"804e8063": "setAffiliateEdge(uint256)", +"804ee2b5": "addProduct(uint256,uint256,string)", +"804f82d3": "showLastBidValue()", +"804fe7ac": "acceptBid(address,bytes32,uint256,uint256,uint256,uint256,bytes32,uint8,bytes32,bytes32,uint8)", +"805013c2": "setPresalePhaseUInt(uint256)", +"80504271": "fundingExchangeRate()", +"80519ac7": "getItem(bytes,uint256)", +"8051d02d": "getBlockNumber(bytes20,uint8)", +"805210b7": "AmIPlayer2()", +"8052191e": "dip(address)", +"8052474d": "Name()", +"80528865": "changeWithdrawState(uint8)", +"80529172": "setUsdPerEthRate(uint256)", +"805484b7": "getUpperMaximum(uint256)", +"8054b2f2": "NKN()", +"805553e8": "randMod(uint256)", +"80559357": "setTokenAvailable(bool)", +"805593db": "storeProductReference(address)", +"8055d33a": "exchangeSgnForSga(address,uint256)", +"8055dbb5": "GetExchangePoint(uint8)", +"8055f9d7": "Moderated()", +"80560a0a": "setIsProjectBonus(bool)", +"8056696e": "loadController(address,address)", +"80570d69": "JoshuaCoin()", +"80571e93": "UranBank()", +"80576150": "BoughtViaJohan(address,uint256)", +"8057b96d": "buyTokensForSelf()", +"8057e0b0": "DutchAuction(address,uint256,uint256,uint256)", +"8059382a": "setGasInTokens(uint256)", +"805996f2": "AccountCreated(address)", +"80599e4b": "remove(string)", +"8059e804": "ethealMultisigWallet()", +"805abe6a": "destoy()", +"805b8455": "bumpRound(uint256)", +"805b90d6": "unlockTokensAmount(address)", +"805bc096": "Roll100()", +"805c2b6c": "broadcastOpinion(string)", +"805c3abd": "getPreviousHashUint()", +"805c3d89": "SimpleLSTDistribution(address,address,uint256,uint256,uint256,address)", +"805c733b": "lottoBalance()", +"805d2679": "rndIssue(address,uint256)", +"805e99e0": "isFirstRound()", +"805f4cfc": "TosTeamLockContract()", +"80603faa": "isTakePermitted(uint256,uint256,address,address,uint256,uint256)", +"80615ffa": "receiveApproval(address,bytes)", +"806186f3": "LogRewardAllocated(address,uint256,uint256)", +"8061a159": "TokenSoftCapReached(uint256)", +"8061d365": "FINANCE_CAP_PER_ROUND()", +"8062d3e6": "insertAndCheckDo(bytes32)", +"8063ab78": "setWalletsDelegate(address)", +"8064696b": "getOraclizePrice(string)", +"80650f76": "sigCheck(bytes32,bytes32,bytes32)", +"80657151": "patronRewardMultiplier()", +"8065eaa6": "CreatorWithdrawAll()", +"80661555": "commandMintBonus(address)", +"80664ba0": "ProofTeamVote()", +"80667509": "MYGREATTOKEN()", +"80667aa8": "CBN(address)", +"8066f3c8": "totalSTACoin()", +"8067f7ba": "read_i16()", +"80690e01": "IsAirdrop()", +"80691858": "GoalReached(address,uint256,bool)", +"8069dc2d": "ThundervsJazz()", +"806a2a3c": "investors_needed_until_jackpot()", +"806ad169": "getWithdrawal()", +"806ad57e": "addWorker(address)", +"806b0365": "changeBountyWallet(address)", +"806b39ab": "crownTotalSupply()", +"806b6c28": "GetCurrentTypeSalePrice(uint256)", +"806b984f": "lastBlock()", +"806ba6d6": "founder2()", +"806bd2b6": "challengeCooldownTime()", +"806c6188": "adjustMinimumPledgeAmount(uint256)", +"806cdc0b": "getBonusBalance(uint256,uint256)", +"806e085e": "transferBatch(address[],uint256)", +"806ee278": "collectionFunds()", +"806f208a": "invalidPayments(address[],uint256[])", +"806f3319": "multipleTokenDistribute(address,address[],uint256[])", +"80710f39": "withdrawAllToOwner()", +"8071a7ba": "PCTToken(address)", +"8071aa05": "multisend3(address[],uint256[],uint256[],address[],uint256[])", +"807283df": "Patronage(string,address,address)", +"80738c4d": "USTM01()", +"80744a9c": "LoyelaTestCoin()", +"8074dc59": "gift(address,uint256,uint256,string,string)", +"8074e31d": "Victory(uint256,string,uint8,string)", +"8074f332": "droneIndexToOwner(uint256)", +"8074fe33": "minerCurrentChallenge()", +"80759f1f": "getRootHash()", +"8075acd0": "couponBonusEnabled()", +"80766b68": "Bitcoin1()", +"807693b6": "grantPermissionToChange(address,uint256,bool)", +"8076bd41": "set_sale_closed()", +"8076f005": "cancelledOrFinalized(bytes32)", +"8077ccf7": "etherTokens(address)", +"80780801": "LimitedSetup(uint256)", +"80787f2c": "terminateSale()", +"80788cba": "CancelSubscription(address,address)", +"807896d5": "voteProposal(uint256)", +"8078cc57": "_changeLicenseTerms(bytes32,bytes32,bool,uint256,bool,uint256)", +"807a599c": "mintFinish()", +"807a87ed": "YouAreHere(uint256)", +"807b08c7": "runScript(bytes)", +"807d2da3": "start_ICO()", +"807d782e": "crcWithdrawAccount()", +"807d94a7": "maxIssuableSynths(address,bytes4)", +"807e5cee": "WhitelistUnset(address)", +"807eb7cd": "sumICOStage1()", +"807f08ea": "totalDepositedEthers()", +"807f0ac5": "slice(bytes,uint256)", +"807f3bce": "adminGetLastSignedTime(address)", +"807fb834": "resetRaz(uint256)", +"80806362": "IssueTokenFactory()", +"808134c8": "setBoardMember(uint256,uint256)", +"8081a1e7": "ecmul(uint256,uint256,uint256)", +"8082a929": "holderAt(int256)", +"8082ee0d": "Exchange(address,string)", +"80833d78": "unauthorise(address)", +"80836cab": "enableUpdates()", +"8084ee58": "setMaxLimit(string,uint256,uint256,uint256)", +"8085de8b": "MOBToken()", +"808615ac": "stake(address,address)", +"8086b8ba": "accountOf(address)", +"80870bc1": "trackBuy(address,uint256,uint256)", +"808757ac": "getFreeBat()", +"8087da3a": "order_number()", +"8088e0b6": "turnOffCanUpdateNextGamePotSplit()", +"80892b8a": "calculateTokensReceived(uint256,uint256)", +"8089d001": "getHashOfBlock(uint256)", +"808a69e2": "tokenAddressesSet()", +"808ab1d6": "getCertificationDbCount()", +"808ac94d": "getWeaponIds()", +"808ae9f8": "MoveLearned(uint256,uint256)", +"808c1499": "setIcoPhase2(uint256,uint256)", +"808cf58e": "initial_reward()", +"808e0ae2": "platformLogin()", +"808f30f3": "BitEyeToken()", +"808f3652": "calcHash(string)", +"808f4d21": "incentivisingEffortsAddress()", +"808f8292": "Menu03()", +"808fc72c": "wasSaleStarted()", +"8090114f": "percentRate()", +"809051db": "ipfs_hash()", +"80906b13": "controllerClaim(address,uint256)", +"80908b11": "Advertisement(address,address,address)", +"8090b131": "fetchNumber()", +"8090d83c": "jackpotProportion()", +"8090e4d5": "core(uint256,uint256,uint256,uint256,uint256)", +"8090f92e": "revealVotes(uint256[],uint256[],uint256[])", +"8091bfc9": "STEM()", +"8091d7a5": "addCustomField(uint256,bytes32,bytes32)", +"8091f3bf": "launched()", +"8091fbe1": "gen0PresaleCount()", +"8091fc76": "isValidICOInvestment(address,uint256)", +"80921070": "AvocadoToken()", +"8092285e": "setODEMClaim(address,bytes32,bytes,bytes32)", +"809282b2": "EtherTower()", +"80929e5b": "setBurnable(bool)", +"80943252": "numGamesTimedOut()", +"80947d17": "Verification()", +"80948ddd": "calculateTokenToEth(uint256,uint256)", +"8094ebe3": "joinGame(address,uint256,address,address)", +"80956021": "Concept(address[],uint256[],uint256,bytes,address)", +"80956e8b": "setMintFeeProp(uint256)", +"80959721": "poster()", +"80959cb6": "getCloseAmounts(uint256,uint256,uint256)", +"8095ab76": "songWriterSign()", +"8095cc36": "createForecast(uint256,uint256,uint8,uint8,bool,uint8,uint8)", +"8096bac6": "setNewMaxDeposite(uint256)", +"80972a7d": "ok(uint256)", +"809837c1": "ITECToken(uint256,string,string)", +"809841aa": "getCompte_25()", +"8098e45e": "getRamdon()", +"8098f67c": "ApexIssued()", +"80994e15": "STUDToEth()", +"80999b71": "removeBaseWhitelist(address[])", +"80999cc0": "MarketplaceInformation(address)", +"8099f357": "milliTokensPaid()", +"809a12de": "addRelatedAddress(uint256,address)", +"809a6173": "testCompare()", +"809a812c": "immlaToken()", +"809a9e55": "getExpectedRate(address,address,uint256)", +"809ae91e": "setBattleStart(bool)", +"809b296d": "consumeOperation(bytes32,uint256)", +"809c5b9e": "votingDescription()", +"809d7902": "rejectBid(address,uint256)", +"809d8988": "getTribe(string)", +"809d9a94": "transferMonster(address,address,uint64)", +"809dab6a": "getAvailableBalance()", +"809e243d": "LanxangCash()", +"809e4a2d": "claimUnrented()", +"809e52b2": "updateExperience(uint256,uint32)", +"809ef92f": "crowdsaleStarted()", +"809f8cc9": "VersumToken(uint256,string,string)", +"809fc4f8": "MKRUSD()", +"809ffb20": "setShopModerator(address)", +"80a0155c": "RBACMock(address[])", +"80a0c461": "updateMinimumPodSize(uint256)", +"80a15ad9": "setRocketValues(uint256[],uint256,uint256[],uint256[],uint256[])", +"80a1a86b": "countPayment(address)", +"80a1ba6a": "getTimeLeftToNextCollect(address,uint256)", +"80a1ec2e": "initUser(uint256)", +"80a23ddf": "mintBadge(int256,address,uint256)", +"80a2ddad": "founder4()", +"80a37e23": "recordHighScore(uint256,address)", +"80a3a783": "presaleStartDate()", +"80a3f8b4": "getWorkflowName(uint256)", +"80a3f9b3": "bonusCapUSD()", +"80a429ee": "VitaminToken()", +"80a507c6": "is_started_bonuses()", +"80a51c5e": "ownerDeclareRefundStart()", +"80a54001": "parentToken()", +"80a5cca3": "approveViaProxy(address,address,uint256)", +"80a6ee7d": "totalTokenBetValue()", +"80a738bf": "withdrawHighscorePot(address)", +"80a92b67": "payReward(uint256,address,uint256)", +"80a973e6": "sendTeamBalance(address,uint256)", +"80a979e1": "crowdsaleTransfer(address,address,uint256)", +"80aa5757": "getEtherForTokensOld(uint256)", +"80aab099": "nextAllowancePeriod(bool)", +"80ab611e": "cancelRecurringPayment(bytes32)", +"80abb85b": "refereds(address)", +"80ac5448": "operatingAddress()", +"80ac613f": "BatchCreateSales(uint256[],uint256,uint256,uint64,address)", +"80ac80b0": "iterStart()", +"80acaafb": "profitDistribution()", +"80ad17b2": "removeSiteSet(uint256,uint256)", +"80ad2cf3": "setCap(address,uint256)", +"80ad639d": "deleteAddressDataPatternVoteRules(address,address,uint256)", +"80adede0": "currentLoanAmount()", +"80ae4ebc": "_initialize()", +"80aed05f": "LooneyDice()", +"80af6002": "minimumICOCap()", +"80af6d79": "addEmissionProvider(address,uint256)", +"80afd844": "getPrivateFundAddres()", +"80afdea8": "appId()", +"80b022e8": "changeBurner(address)", +"80b20208": "thePot()", +"80b29f7c": "revokeDelegate(address,bytes32,address)", +"80b30c13": "tokensToSold()", +"80b38c2d": "ProcessTxFee()", +"80b3c3d8": "buyTokensWithIcon(address,uint256)", +"80b44c1b": "extraStatsForGen(uint256)", +"80b51fe3": "getPoolTimeOfStateInBlocks(uint256)", +"80b52136": "MoneyCoinCoin()", +"80b525ce": "BurnableTokenWrapper(address)", +"80b57824": "discount(uint32,uint256)", +"80b63e7e": "wakeUp(uint256)", +"80b6518a": "createEmptyTrack()", +"80b69199": "releaseBonusTokens(address,uint256,address,bytes1)", +"80b7ca90": "OrderList(address)", +"80b855d6": "ZiggyToken()", +"80b8e6d1": "changeWhitelistStatus(address,address,bool)", +"80ba4b75": "getActionsCount()", +"80bb3360": "exchangeToIco(address)", +"80bc150d": "Bounty(uint256)", +"80bc99cb": "teamLocker()", +"80bd0936": "Multivest()", +"80bd2723": "SecurityChainToken()", +"80be3cc4": "BurnTokensNew(uint256)", +"80bf099e": "orphantoken(address)", +"80bf549a": "maxICOSecondSupply()", +"80bf98f8": "makeSwapInternal()", +"80bfbe68": "setWhitelist(address,address,uint256)", +"80bfc599": "sellVouchers()", +"80bfe883": "wins(uint256)", +"80c05bc6": "random_callback(bytes32)", +"80c0a250": "fetchVoteResultForCandidate(address)", +"80c18d45": "addAddressToFounders(address)", +"80c190cf": "getReservedTokensListValInPercentage(address)", +"80c2fb7d": "currentTreasure()", +"80c30f3d": "buyContract(address,uint256)", +"80c324cf": "isBallotInProgress(uint32)", +"80c3780f": "schedules(address)", +"80c399f4": "refundInvestors()", +"80c3f96d": "addFarmer(address)", +"80c4237f": "tryToWin()", +"80c4e5c5": "changeSynthesizeAllowed(bool)", +"80c5bef8": "UGToken()", +"80c6ff73": "keepaliveBlock()", +"80c7507a": "getMigration(uint256)", +"80c80611": "Withdraw_3()", +"80c810d5": "MucToken()", +"80c81c16": "getStateInfo()", +"80c86c30": "CommonError(bytes)", +"80c8a270": "tokenReserved4Deposit()", +"80c8fde7": "perTokenAmount()", +"80c951bf": "currentClaimPriceInFinney()", +"80c96527": "getAssociatedTAOSetting(bytes32)", +"80c99dd2": "getPeriodicalBudget()", +"80ca7aec": "forceReseed()", +"80caac1d": "setTitleImage(string)", +"80cae007": "cleanOcean(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"80cd0015": "migrateUsername(bytes32,uint256,uint256,address)", +"80cd2464": "offer(uint256,uint256,uint256)", +"80cd5ac3": "newAppInstance(bytes32,address)", +"80cda248": "EGGS_TO_HATCH_1TOAD()", +"80cdc9c9": "RESTRICTED_PERIOD_DURATION()", +"80ce60d1": "setResult(uint8)", +"80ce98e7": "distributeDividends(uint256,address)", +"80cecea9": "transferToContract(address,uint256)", +"80cf264d": "getFirstPhaseCap()", +"80d07ce8": "Gifto()", +"80d10934": "freeXLMG()", +"80d1bd47": "jackpotHit()", +"80d1cb35": "getDeploymentBlock()", +"80d24e9d": "SISKTechnologyGroupToken()", +"80d2c1a6": "CatRescued(address,bytes5)", +"80d32dbb": "ChaoExToken()", +"80d32f85": "isSoftCapReached()", +"80d52ed9": "switchToNextRound()", +"80d5398e": "logOrderFilled(address,address,address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes32)", +"80d563d7": "LogCancelContractProposal(address,address,uint256)", +"80d61012": "canReceive(bytes32,address,address,uint256,bytes,bytes)", +"80d7bcba": "incomingTokensTransactions()", +"80d7d81a": "giveMeBackMyMoney()", +"80d7f7ac": "TaxicToken()", +"80d7f92a": "_address(address,uint256)", +"80d85911": "initialize(uint256,uint256,uint256)", +"80d8b380": "setQtyStepFunction(address,int256[],int256[],int256[],int256[])", +"80d8ce23": "publishBytes(string,bytes)", +"80d95b42": "supplySeed()", +"80d9eaa6": "refCount()", +"80daa1c6": "setDiscountForPlayer(address,uint256,uint256)", +"80db79d9": "StructAndFor()", +"80dbb7d2": "RacingClubPresale()", +"80dbde63": "PI_EDIT_4()", +"80dcaf27": "getRefNumber()", +"80dcbff1": "getAdminArray()", +"80dce0b4": "getAwardTime()", +"80dceec4": "setHuntingPrice(uint256)", +"80ddcc62": "SUPPLY_HARD_CAP()", +"80ded586": "removeFromTokenHolders(address)", +"80dee9d1": "miningStorage()", +"80df2cee": "TeddyChain()", +"80df4123": "NucleusVisionTimeVestingTokensMinted(address,uint256,uint256,uint256,uint256)", +"80dfa34a": "saveBatch(string)", +"80dfb104": "setCoOwner1(address)", +"80dfee5c": "NewSale()", +"80e039f9": "rocketGetResourceValues(uint256)", +"80e0c053": "MassERC20Sender()", +"80e13b10": "CompanyTokenIssued(address,address,uint256,uint256)", +"80e15b56": "cancelCredit(address)", +"80e15f76": "setBuildPrice(uint256)", +"80e183a3": "CLASS_PLANT()", +"80e1b9c4": "finishBattle(uint256,address,address)", +"80e2517c": "TokensPerEther()", +"80e2653e": "setDougAddress(address)", +"80e2d53b": "rateWaitingEnd()", +"80e339fc": "balancewof()", +"80e37b5f": "maxIssuableNomins(address)", +"80e3f1ad": "toggleWhitelist(bool)", +"80e47e71": "maximumValueWithoutProofOfAddress()", +"80e52f31": "EtherCash1()", +"80e5d7b0": "Voted(uint256,uint256,uint256,bool,address)", +"80e5e069": "ITO_TOKENS()", +"80e64e8b": "buyBottle()", +"80e6bffb": "CalculateBankCredit()", +"80e74b04": "testControlUpdateLatestRevisionEnforceRevisions()", +"80e8b12a": "_createDungeon(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"80e9071b": "reclaim()", +"80e9a1da": "STATUS_LENT()", +"80e9e9e1": "getClaimIdsByTopic(uint256)", +"80e9f98c": "getRacer(uint32,uint256)", +"80ea8273": "SetBonus(uint256)", +"80eb1cbc": "monsterIdToIVs(uint256,uint256)", +"80eb6b7f": "LogRemTokenPairWhitelist(address,address)", +"80ebb08e": "updateResult()", +"80ebed20": "createBook(address,address,address,uint256,int8)", +"80ec35ff": "awardByRndNo(uint256)", +"80ec4a96": "CrowdsaleFinished(uint256)", +"80ede329": "getDocumentDetails(uint256)", +"80edef8e": "owner_address()", +"80ee9792": "_ethDeposit()", +"80ef353d": "tryClose(bytes32)", +"80efa4af": "extBuyTokens(address,uint256,uint256)", +"80f034b1": "getContractBytecode(string)", +"80f03fa6": "getTotalPets()", +"80f183ce": "visitCost()", +"80f20363": "lockToken(uint256)", +"80f29894": "getWeiForCent(uint256)", +"80f2fa03": "getSellPrice(address)", +"80f34c14": "ContortedCoin()", +"80f393c8": "ProofOfIdiot()", +"80f3f094": "setGGCAddress(address)", +"80f41e76": "calcMintFee(uint256)", +"80f4432a": "inception()", +"80f4531f": "closeTimerElapsed()", +"80f4ab5f": "seeMyNumbers()", +"80f4bcb8": "tokenTeamAllocated()", +"80f55605": "market()", +"80f5a37c": "Crowdsale(address,address,address,uint256,uint256)", +"80f5e0a1": "shouldBoost(bytes32)", +"80f6c383": "setshares(uint256,address)", +"80f6d782": "swapAddress()", +"80f7d0ab": "storeReading(uint256)", +"80f7e238": "ANIMETOKEN()", +"80f86009": "Initialize()", +"80f89a31": "ballotNames(uint32)", +"80f89bce": "distributeDRMK(address[],uint256,uint256)", +"80f8d688": "redTeamAddress()", +"80f8ea60": "Put_BRTH_GFT(address)", +"80fa272f": "TokenWithMint(string,string,uint8,uint256)", +"80fa4517": "completedTasksCount()", +"80fa7902": "getPlayersBattleStats(address)", +"80fa7942": "tokensForReserve()", +"80fa860f": "executeElectionMandate(uint256)", +"80fc16c8": "setAffiliateFee(uint256)", +"80fe4958": "createBetWithPayable(bytes32,bytes32,bytes16,bytes32,uint256)", +"80febdbd": "updateMe(string)", +"81001f3c": "collectFee(address[])", +"810164f7": "getTotalBPOfAddress(address,address)", +"81016509": "getBtcRequestHash(bytes,bytes,uint256)", +"8102387d": "burnRedRibbonCoin(uint256)", +"81030e35": "ALAP()", +"810405d6": "numOfPurchases()", +"81042183": "ExpeditingToken()", +"81045ead": "getIndex()", +"8105a6d7": "calculate_bond_token_to_bix_rate(uint256)", +"8105aa55": "grantAdvisorTokens(address)", +"81064e2d": "getCreditorAmounts()", +"8106d57a": "getCityPendingBuildings(uint256,uint256)", +"8107b269": "Novatore()", +"81081184": "bursarPayOutNetContractBalance(address)", +"8108592c": "calcKncStake(uint256)", +"81086763": "placeNewBid(uint256)", +"81086918": "delAcceptedToken(address)", +"8108e54c": "marketAllocation()", +"810a192b": "transferCollateral(uint256)", +"810a217f": "pValidationState()", +"810a3919": "hard_limit()", +"810a882f": "setConfigBytes(bytes32,bytes32)", +"810ac3ce": "IssueOffer(address)", +"810ba058": "Public_Sale_SUPPLY()", +"810bbec3": "claimHelper()", +"810be182": "_updateCountries(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"810c0af8": "depositTokenByAdmin(address,address,uint256)", +"810c547a": "_rebase(uint256)", +"810cbbd0": "bat_match(uint256[39])", +"810cf6cb": "MRazaAnisTestCoin()", +"810d54a0": "lockBalanceChanges()", +"810e4ff0": "cashOut(address,address,uint256)", +"810e78ab": "declareIcoFinished()", +"810e9720": "GlobalCoin()", +"81104666": "advisoryWithdraw()", +"8111e0ad": "updateMaxTxGasPrice(uint256)", +"8111ecef": "FinalizeStage()", +"8111f24e": "isFreezed(address)", +"81120dd7": "myLastRef()", +"8112821f": "EthVentures()", +"8113e285": "withdrawTokenPayment()", +"8115a2ac": "getOnMintTargetValue()", +"8115f52d": "Evacuated(address)", +"8116c063": "claimOwnersEarnings()", +"811743e7": "fighterIndexToOwner(uint256)", +"81183633": "setStandard(bytes32)", +"8118e0ae": "dtValidateWorldSnapshot(uint256)", +"81193a30": "returnRequestCancel(uint256)", +"81195993": "allocateEcoFundToken(address[],uint256[])", +"8119c065": "swap()", +"8119f4ae": "getRoc(uint256)", +"811a0a85": "saleComplete()", +"811aecf4": "finishPhase()", +"811b1268": "noteSale(address,uint256,uint256)", +"811bab32": "GenesisCallerAddress()", +"811c626d": "changeIcoRoundEnding(uint256)", +"811c66ac": "nameSuccessor(address)", +"811de206": "isConfirmedByOwners(uint256)", +"811e1468": "computeAccount(uint256)", +"811e4f71": "DisburseEarnings()", +"811e539c": "campaign()", +"811ea6de": "transferToken(address,address,uint256,bool)", +"811f273d": "hasThreeYearWithdraw()", +"811fe466": "beginTime_()", +"81207183": "deployGLX()", +"8121b0d4": "verifyStoredData(bytes32)", +"8121dbc1": "MyPizzaPieTokenPreSale(uint256,uint256,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"8121ddd7": "RATE_DAY_7()", +"81236e47": "setUserYan(address,uint32)", +"812403f6": "bonusPhaseThreeDeadline()", +"81240b9c": "subWithdrawFor(address,address)", +"8124bb0f": "continueExecution()", +"81252548": "getContractServerBlackWhiteListType(string)", +"81252680": "getBaseQuick(bytes32)", +"8125c102": "BountySent(bytes32)", +"8125c6fd": "_getDividendsBalance(address)", +"8125ceb2": "showMessage()", +"8125fc44": "thirdPreSaleEndDate()", +"81263fed": "getStrandCount()", +"81267bd0": "_transferMeme(address,address,uint256)", +"812699a9": "Quiricos()", +"81269a18": "voteBalance(address)", +"81269a56": "checkMintSolution(uint256,bytes32,bytes32,uint256)", +"8126c38a": "allPunksAssigned()", +"8126cb1e": "rejectRewards(uint256,string)", +"8126e4e3": "philanthropise(string)", +"81281be8": "placeBid(address,uint256,uint256,uint256)", +"81290a80": "AviciiCoin()", +"8129212e": "getCommonInitBlockNum()", +"8129519d": "setLoading(uint256)", +"8129aa75": "TransferFeeRateProposalAdded(uint256,address,uint256)", +"8129fc1c": "initialize()", +"812a4f47": "BeatTokenIcoPhase2Started()", +"812af8ec": "getAccountData()", +"812ba50c": "preEndBlock()", +"812c3251": "Escrow(address,address,uint256)", +"812c86e0": "updateTokenContract(address,string)", +"812cbf38": "sellFci(uint256)", +"812cddf2": "getSavedString()", +"812cf740": "ArrayPractice()", +"812d504d": "transferToOwner(address)", +"812d6c40": "changePercent(uint256)", +"812e1d1d": "APT(address)", +"812e6741": "Mountain(bytes32,uint256,uint256,uint256,address)", +"812ed5cc": "report(address,address,bytes)", +"812f55c3": "get10Ads(uint256)", +"812fd5d7": "payToProvider(uint256,address)", +"813051bc": "createGOP(address,string,uint256)", +"8130c9b2": "untrustedTokenNumerator(uint256)", +"8132581c": "amountRaisedInEth()", +"8132e223": "internalSafeTransferFrom(address,address,uint256,bytes)", +"81333d57": "LKB(uint256,string,string)", +"8134064b": "setMotherCount(uint32)", +"81350bd4": "releaseTimeTeamAdvisorsPartners()", +"8135e137": "getPresciption(int256)", +"8136c1b9": "registerUserOnToken(string)", +"8136f02d": "setAddressOfERC20OldToken(address,address)", +"8136fd26": "createJob(string,uint256,uint256,address)", +"81395866": "numberOfAdmins()", +"8139bc2f": "ecothereum()", +"813a573a": "CheckPurchaseCount(address,uint32)", +"813b024f": "addProductInUsd(uint256,uint256,bytes32)", +"813b65aa": "setNewCajutel(address)", +"813d13cb": "getBB(bytes32)", +"813d599f": "getValidatorAddress(int256)", +"813d6c9a": "bonusPercentage()", +"813d89e1": "artExplain()", +"813df488": "preMinedFund()", +"813e7847": "withdrawalNormal()", +"813e9aca": "init(address,uint256[],uint256,uint256,uint256,uint8)", +"813f4db4": "isStakingPeriod()", +"813f563a": "devsHolder()", +"813f5717": "LinkRevenue()", +"813faa53": "getVoteRulesOfProposalTransaction(uint256,uint256)", +"813fdec8": "getContestStatusForDate(uint32)", +"8140ce63": "kvtOwner()", +"8140d0dc": "setContact(string)", +"8141fd37": "tickRequiredLog()", +"8142453f": "_saveRequest(address,address,uint32)", +"8142a25a": "testAliceFooSend()", +"8142b8d7": "editGardener(uint256,uint256,uint256)", +"8143e3da": "allBonus(address,uint256)", +"8143eb2d": "gameOpened()", +"8143f8a8": "totalGas(bytes)", +"8144650a": "transferTokenTo(address,uint256)", +"814487c4": "addSuperReferrer(address,uint8)", +"8144ee2f": "adventureSettingContract()", +"8146f323": "isFinalised()", +"8147bcf7": "deletePlatform(bytes32)", +"8148d2fe": "getNodeId(bytes32,bytes32)", +"8149657b": "closeEthPool(uint256)", +"814971de": "issueReward(uint256,uint256,uint256[],uint256)", +"8149ea9b": "randomSkill()", +"814a78f4": "KM(uint256,string,string)", +"814ab9f1": "salesSupply()", +"814ae0ba": "gcf()", +"814b3fe0": "dividends(uint256)", +"814b53b0": "killCoin()", +"814c25fc": "setTokenInformation(bytes32,bytes32)", +"814c2aa1": "changeTotalExchange(uint256)", +"814e23c8": "calculatePayout(uint256,uint16)", +"814e3bd3": "ContribToken(uint256,string,string)", +"814e5c9b": "totalSaleAmount()", +"814e6d44": "_unpackIdValue(uint256)", +"814eba9e": "simPunitiveInterestRate(bytes)", +"814f737d": "phaseThreeEnd()", +"814f9201": "payUserIncomingTransactionCommission(address)", +"814fbd8f": "RefundBTC(string,uint256)", +"81508615": "getBeneficiaryDevelop()", +"81516c7b": "initialTIPsupply()", +"8152c7ed": "adminSetRandomInput(string)", +"81531c64": "Strike()", +"81547f25": "CONI()", +"8154b57c": "secondsAfter()", +"8154d4de": "setMarket(bytes32,bytes32)", +"81550287": "PRESALE_CLOSING_TIME()", +"81553709": "releaseEndTimeOfStage(address,uint256)", +"815639ea": "read_u64()", +"8156afdf": "Aletheia(address,address,address)", +"8157d4b5": "bindContract(address)", +"81580761": "getUniqueLineCount()", +"815847df": "_addBonusOfReferrer(address,uint256)", +"81584ff3": "CutieBitToken()", +"81587463": "sendTradeEvent(uint256[],address[])", +"81592aab": "instantUpdate()", +"81597d0c": "mintIcedToken(address,uint256)", +"815a4876": "setEthereumWallet(address)", +"815bc7a0": "vote_reward_pool_amount()", +"815c326d": "ProducerOperations()", +"815d1fe5": "RewardChannel(address,address,address)", +"815dcd36": "dailyAccounting()", +"815def1a": "changeAllocation(address,int256)", +"815eb7c1": "satoeContract()", +"815ec64a": "zReceiveFunds()", +"815f73f0": "m_walletAddress()", +"816036ae": "removeSmartContract(address)", +"8160b246": "BONUS_TIER3()", +"8160f0b5": "minimumQuorum()", +"81613a62": "LogPause(bytes32)", +"816163b1": "checkGameResult(bool)", +"81617f8f": "reLoadXaddr(uint256,address)", +"816194f8": "refreshVoteForAll()", +"81619954": "DAOFactory(address,address,address)", +"8161c5e5": "main_balance()", +"8161dfa6": "EmailSent(address,uint256,string,string)", +"8161f0e1": "execID()", +"816273f6": "computeAmountBonus(uint256)", +"8162de9c": "getCryptoAvatar(uint256)", +"8162f631": "LogFunderInitialized(address,address,string,uint256,uint256)", +"8163681e": "isValidSignature(address,bytes32,uint8,bytes32,bytes32)", +"816413f8": "transferPreSignedHashing(address,address,address,uint256,uint256,uint256,bytes)", +"81641ff7": "casinoBank(address)", +"81646be8": "setCloseTime(uint256,uint256)", +"8165354e": "setOracleRegistry(address)", +"8165913d": "withdrawEthBalance(address,bytes)", +"81671042": "setOptionLibrary(address)", +"81676ecd": "FGorToken()", +"8167d996": "deAuthorize(address)", +"8168b41e": "TokenTWL(uint256,string,string)", +"816a873f": "createMorePaymentChannelsInternal(uint256)", +"816b6574": "LogCrowdsaleFinalized(bool)", +"816bf490": "transferTokens(uint256,address[],address,address)", +"816bff5f": "CIFCoin()", +"816c4ad1": "baseIntCalc()", +"816c66c9": "updateRank(bytes32,bytes32,uint256,bytes32,uint256)", +"816c76e3": "GoozeToken(uint256,string,uint8,string)", +"816c7da4": "approveAllAndCall(address,bytes)", +"816ca77c": "CollateralSeized(address,uint256)", +"816d199c": "SIGMA_FTL_SPEED()", +"816d3da9": "purchaseAdmin()", +"816d3dc1": "get_info(address)", +"816dbae4": "monethaVault()", +"816dcd91": "updateBitComparisonMask(bytes32)", +"816e117c": "setMaxSize(uint256)", +"816e24b0": "setupDeposits()", +"816ed336": "emitFeeSet(uint256,address)", +"816f3438": "maxFoundationCapUSD()", +"816f3f4d": "madKing()", +"816fceb7": "MultiTransaction(address,address[],uint256[])", +"816ffbab": "Uint256Oracle(int256,uint256)", +"81702c34": "refund_me()", +"8170733d": "MyBitFoundation()", +"81710c78": "getMyPolicies()", +"8171362a": "votingByXid(uint256,bool)", +"81715d8c": "pIdIter_()", +"817189df": "setEarlyLimits(uint256,uint256,uint256)", +"817246cf": "setsalesdeadline(uint256)", +"817287d0": "isOwnner(address)", +"8173832a": "LogUnsortedOffer(uint256)", +"8173b813": "setNumCities(uint256,uint256)", +"8173e363": "hard_cap_wei()", +"817472c0": "TOKEN_INIT(bytes32,bytes32,bytes32)", +"8174b6d7": "ownerCutPercentage()", +"81751312": "getAllCardsModifierPrimaryVal()", +"81758fb4": "bohwa()", +"8176419f": "SCCC(uint256,string,string)", +"81767aed": "getIdentifiers(address)", +"817725aa": "disableChangesMultitoken(uint256)", +"81776ba4": "backup_refund(uint256,uint256)", +"81777b78": "Take(bytes)", +"8177ffae": "PresaleContract(address)", +"81788e2b": "addAllowedAddress(address)", +"8178a943": "add_scribe(address)", +"8178ab99": "_transferFromSenderPaysFee_byProxy(address,address,address,uint256)", +"8179c2b3": "Result(uint256,address,uint256)", +"817ad683": "XHO()", +"817afff8": "_updateWithdrawCountry(uint256,uint256,uint256,uint256)", +"817b106e": "setChangeIdentityNarcoRespect(uint256)", +"817b1cd2": "totalStaked()", +"817b90fe": "getCategoryId()", +"817c1e52": "startICO(uint256,uint256,uint256,uint8)", +"817c7483": "settleLeague()", +"817c8966": "getLevel(address)", +"817d62a4": "shouldGetHighFive()", +"817e8332": "STAKE_BONUS_RATIO()", +"817e9d31": "setFactor(uint256)", +"817eca0c": "ConstructByEth(uint256,uint256)", +"817edbd2": "set(uint32,uint8)", +"817f0023": "recievePayment(address)", +"817f688f": "BLAAICOIN()", +"81807a07": "calculateBonusAmount(uint256)", +"818097c5": "getVotesForCandidate(address)", +"8180f2fc": "approve(address,uint256,bytes32)", +"81813963": "claimEDEX(address)", +"8181b029": "confirmImplChange(bytes32)", +"818211f8": "getProposalsNum(address,uint256)", +"8182173c": "PricesUpdated(address,uint256,uint256)", +"81824d53": "setData_1(uint256)", +"8182c6a7": "IssueToken(string,string)", +"81830593": "adminAddr()", +"818438ca": "getWizzPandaQuotaOf(uint256)", +"8185402b": "buyAllAmount(address,uint256,address,uint256)", +"8185b8e9": "getWeiPerCent()", +"81862f25": "newThreadComment(bytes32,bytes32,string)", +"81884756": "citationCount()", +"8188f71c": "holders()", +"81895b73": "registry(bytes32,address,address)", +"818a19b5": "FeeAddr1()", +"818a4b48": "preSaleMinAmount()", +"818ad300": "TeamVesting(address,uint256,uint256)", +"818b4564": "DefineType(address,uint32,string)", +"818c2858": "HPCToken(uint256,string,string)", +"818c606f": "NewAuction(address,uint256,uint256,uint256,uint64,uint256)", +"818d4b5d": "owns(address,uint256)", +"818e8cfa": "setLogoURL(string)", +"818f7d01": "checkTransferFunctionPrivateSale(address,address,uint256)", +"818f92c7": "createPurchaseOrder(address,uint256,uint256,bytes32)", +"818fd7a1": "beforeBuy()", +"81904676": "lastDistributedAmount()", +"8190cf07": "setRate_ETHUSD(uint256)", +"81915a67": "EventSetContract(address,string,address)", +"8191745f": "Description()", +"8191ab45": "setUsdConversionRate(uint256)", +"8191b9a2": "__tokenAndWalletBalancesMatch__(address,address,address)", +"8191d30f": "crossForking()", +"81923240": "mine(address)", +"8192433f": "receiveTokenDeposit(address,address,uint256)", +"8193327b": "test1Bob()", +"8193844b": "linkIssuerName(bytes32)", +"819384a2": "payoutToReferrer()", +"8194aff3": "Matchpool()", +"8195031f": "Bitsta()", +"819512cd": "buyTokens(address,uint256,address)", +"81961946": "NETR()", +"8196410b": "GustavoCoinCrowdsale(uint256,uint256,uint256,address)", +"8196b8c7": "getValueOrZero(bytes32)", +"81980c27": "SOLOBOT()", +"81981f7c": "getMyFranklin()", +"819891ac": "_newGroup(address,uint256)", +"8198c2bd": "ICCCOIN()", +"8198edbf": "getFeeRate(address)", +"819912a2": "setGame(address)", +"819927e7": "transferUserTokensTo(address,address,uint256)", +"819abe80": "giveFreeUnit(address,uint16)", +"819ad6d6": "EstimatedICOBonusAmount()", +"819b0293": "validPosition(uint256,uint256,address,uint256)", +"819b25ba": "reserve(uint256)", +"819b9773": "PaymentAvailable(address,uint256)", +"819c5773": "withdrawForMany(address[])", +"819cfdf1": "YFTToken(uint256,string,string)", +"819e3903": "LogTrade(uint256,address,uint256,address)", +"819ee03a": "InterfaceId_ERC721()", +"819f2494": "createOffer(uint64,uint256)", +"819f255a": "is_passcode_correct(uint256,bytes32)", +"819f5e24": "burnAndFinish()", +"819f8927": "setMilestonesList(uint256[],uint256[],uint256[])", +"81a00361": "YONDcoin()", +"81a03133": "authorizePayment(uint256)", +"81a084fd": "remainingGasRefundPool()", +"81a09bf0": "mergeMedal(uint256,uint256)", +"81a1384b": "LockedVotingTokens()", +"81a1fa02": "itemsCounts()", +"81a22b41": "PaymentsProcessed(address,uint256,uint256)", +"81a22bee": "reservePart()", +"81a238b5": "thirdWavePrice()", +"81a2568d": "setXToken(address)", +"81a2824f": "getUserBet()", +"81a28c28": "isSecured()", +"81a33a6f": "bytesToUInt(bytes32)", +"81a3b17f": "removeFace()", +"81a46662": "rolloverPercent()", +"81a4af15": "rewardTokens(address,uint256)", +"81a5ad6d": "YamatoCoinCrowdSale()", +"81a5e88b": "ICOCompleted(uint256)", +"81a60c0d": "getResults(uint256)", +"81a73ad5": "getTokenSymbol(address)", +"81a752ef": "removeSdaContract()", +"81a7a503": "ActiveProposalNum()", +"81a7ac54": "MAX_PERCENT_OF_SALE()", +"81a8e78a": "getGalaxies()", +"81a955b0": "editInfo(uint256,bytes)", +"81aa5067": "addLockedAccount(address,uint256,uint256)", +"81aa8a4b": "pre_PRICE()", +"81abb800": "lengthOfKeys(uint256,uint256)", +"81ac9b93": "AuctionCancelled(address,uint256,address)", +"81accd0b": "create(bytes1,bytes32,bytes32)", +"81add559": "partners()", +"81ade307": "query(string,string)", +"81ae20b2": "setInvestorsBatchSize(uint256)", +"81aea668": "atNow()", +"81aee4f4": "getNoteDesignatedReport()", +"81af0750": "Simt()", +"81af8949": "getPackBuy(address,address,uint256)", +"81af95fc": "startAuction(uint256,uint256,uint256,uint256,address)", +"81afc50d": "delegateCustodian(address,address)", +"81aff6ec": "get_presale_arbits_sold(address)", +"81b074ab": "user_on_freeze()", +"81b1c6bb": "getWinLoseAmountByBettingIdInGamblingParty(uint256,uint256)", +"81b23042": "burnMonster(uint64)", +"81b2d07b": "showBalance()", +"81b2dad9": "setByeSayer(address,bool)", +"81b3171c": "extGoalReached()", +"81b31cec": "setNextCommonTTWTokenId2(uint64)", +"81b3ea13": "getResponseError(uint256)", +"81b54498": "seedStartTime()", +"81b69494": "fee_ratio()", +"81b72d88": "startRequest_callback()", +"81b736e9": "createChild(uint256,address)", +"81b7c6e7": "stop_it()", +"81b7f157": "_updateSpendAvailable()", +"81b890fc": "setName(uint256,bytes16)", +"81b93757": "ADEVA()", +"81baf3ab": "sendTokens(address[],uint256[],address)", +"81baf55e": "processBuyRequest(string,address,uint256,uint256)", +"81baf820": "BlockScheduler(address)", +"81bb1277": "_calculatePointsAndRewards()", +"81bb2b20": "payFee(bytes32,uint256)", +"81bb59bf": "goodsNotOK(uint256)", +"81bb73af": "signArchive(bytes32,string)", +"81bb9470": "DNCEQUITY()", +"81bc3657": "migrateSinglePlanet(uint256,string,uint256,uint32,string,uint32,uint8,string,address)", +"81bc50ef": "getBUA(bytes32,uint256)", +"81bc8742": "BCToken(uint256,string,string)", +"81bd24d1": "revertTest()", +"81bd66fe": "upgradeMeAdmin(address)", +"81bdc78d": "getProposalAmount(uint16,uint16)", +"81bf1cff": "ThailandVsMyanmar()", +"81c0ddc3": "villageinfo(uint256)", +"81c1346d": "setFundsCreditDaoAddress(address)", +"81c2d4b6": "freeToken()", +"81c2d875": "getConsensusRules()", +"81c385b5": "safeWithdrawEther()", +"81c405c6": "registerCustomer(address,address,bytes32,uint256)", +"81c485e7": "getDiscipleSale(uint256)", +"81c4e1c8": "User(address,address,address)", +"81c56dfb": "d27d7bad()", +"81c59c8d": "getStrategyTokenCount(uint256)", +"81c5b206": "addMeToGame(uint256)", +"81c648e2": "betYours()", +"81c64ea2": "SixPlayerRoulette()", +"81c70870": "ClientUpdated(address,address)", +"81c79fd5": "transferMerchantProxy(address,address,uint256,uint256,uint8,bytes32,bytes32)", +"81c7ae3b": "miningEveryDay()", +"81c8149d": "timeOfLastProof()", +"81c81cdc": "setContractStatus(address,bool)", +"81c8b563": "coinLockRemove(address)", +"81c92486": "ProcessRooms()", +"81c9786c": "administratorsLength()", +"81ca3ea1": "hasEitherAttribute(address,bytes32,bytes32)", +"81cb79ca": "createEmptyTrack(uint256)", +"81cbeaf0": "getValidated(address,address,uint256)", +"81cc49dd": "secondLoos()", +"81ccb678": "Confiscate(address,uint256)", +"81cd2ffb": "ConversionFeeUpdate(uint32,uint32)", +"81cd30a8": "round_c_begin_date()", +"81cd4570": "Moneytoken()", +"81cd5eec": "bonusPot()", +"81cd8194": "transferPrice()", +"81cd872a": "deals(bytes32)", +"81cda317": "MINTING_HARDCAP()", +"81cde1a9": "GOOD_ERC20()", +"81ce7184": "TestText()", +"81cebf7e": "vestingPaid()", +"81cedafc": "Nodalblock()", +"81cf7fef": "registerSmartID(string,string,string,bool,bool)", +"81d01ed3": "p2()", +"81d12c58": "requests(uint256)", +"81d136cb": "presaleAllocation()", +"81d16e0d": "_isDiamondVerified(string)", +"81d2c871": "SetMinFee(uint256)", +"81d2fd9c": "setFaucetAmount(uint256)", +"81d36f4e": "KEVINTOKEN()", +"81d38ada": "Remove_member(address,address)", +"81d38f2d": "SheetMusic(address)", +"81d3c435": "setAddresses(address)", +"81d434e9": "transferToICAP(string,uint256)", +"81d44053": "reading_length()", +"81d45a5c": "isPreICOPublicClosed()", +"81d5e753": "CuratedWithWarnings(address[],address,address[],address[])", +"81d693be": "claimDay(uint16)", +"81d6c866": "harvestabledivs()", +"81d77862": "newMostInviter_()", +"81d92ed4": "shp()", +"81d96005": "sigDestinationTransfer()", +"81d961e4": "eligible(uint256,uint256)", +"81d97051": "setOwnerOne(address)", +"81d9c5e4": "handleIncomingPayment(address)", +"81dafe0e": "calculateDuration(uint256)", +"81db6c28": "redeemVoucher(uint256,address,address[],uint256)", +"81dc66f4": "checkTankAuction(uint256)", +"81dca05c": "setAuthorization(address,address,bool)", +"81dd70db": "kickoffQuorumPercent()", +"81de10e2": "getContentAt(uint256)", +"81ded5b8": "numOfConfirmationNeeded()", +"81df464f": "totalRaisedIco()", +"81df893c": "withdrawMon(uint64)", +"81e1ccba": "stakingPercentage()", +"81e2ef3a": "ReceivedETH(address,uint256,uint256)", +"81e529cd": "setOwnerFreeDay(uint256)", +"81e559ae": "clientKeys(uint256,uint256)", +"81e69eff": "publishMetaData(bytes32)", +"81e6c686": "returnMaxGoal(uint256)", +"81e6e083": "getLifetime()", +"81e75dd0": "testPublicBuy()", +"81e7645f": "findFigures(uint256,uint256)", +"81e77878": "getChooses()", +"81e7a97e": "killMonster(uint16,uint8)", +"81e7e20e": "user(address)", +"81e7e329": "test_6_accessRestriction_removeMember_shouldThrow()", +"81e83991": "howMuchInEscrow()", +"81e8927b": "getValidationsCount()", +"81e8a1f7": "newRandomByte(bytes)", +"81e9abef": "_updateEarnedBy(uint256,uint256)", +"81ea4408": "getCodeHash(address)", +"81ea6834": "getEvilMortyAddress()", +"81eac2ee": "checkClientFunds(address)", +"81eaf99b": "lockSupply()", +"81eb3e01": "setValueStep1(uint256)", +"81ebd8de": "setDeveloperStatus(address,address,bool)", +"81ebdeea": "testThrowCreateWithNonceRetracted()", +"81ec792d": "getPackSummary(uint256)", +"81ed8680": "pingTimestamp()", +"81edaae4": "serviceFee(address,uint256)", +"81edc308": "insertAndApprove(uint256,address[],uint256[])", +"81ef1b18": "startFundraising()", +"81ef93ae": "lastFueledFundingID()", +"81efc01d": "withdrawHouseStake(uint256)", +"81f0c440": "MikeChanCoin()", +"81f1a41b": "CROWD_SUPPLY()", +"81f1aad7": "setCancelApproveFee(uint256)", +"81f1d75c": "updateUserEmail(address,bytes32)", +"81f1f92a": "withdrawSoftwareProductDevelopment()", +"81f1fa93": "RKCAcquired(address,uint256,uint256)", +"81f2a3f1": "GetDownTickPrice(uint256)", +"81f2d44c": "getStarIdAtPosition(uint8,uint8,uint16)", +"81f2d4ee": "updatePartner2_will(string)", +"81f3e897": "getSettingData(uint256)", +"81f4f9bf": "ticketHolder()", +"81f59f51": "shareService(bytes32,address)", +"81f5f75c": "getApprovedProxies()", +"81f65883": "CompetitionStore()", +"81f6bf7d": "deleteCertificate(string)", +"81f6c7e5": "_release(uint256)", +"81f799e2": "reveal_end_time()", +"81f86241": "ExGirlfriendCoin()", +"81f8658a": "DATE_OPEN_ON_FLOOR()", +"81f87d6d": "deleteCandidateCache(address)", +"81f8a6f7": "checkTokenSupported(address)", +"81f8b722": "LogIncomeAllocation(address,uint256)", +"81f91c4a": "transfer(address,bytes32[8])", +"81fab567": "maxPayments()", +"81fb1fb4": "participants(uint256,uint256)", +"81fb2585": "isOfficial(uint16)", +"81fb3803": "einzahlen()", +"81fbc084": "mul27(uint256,uint256)", +"81fbf0a5": "totSupply()", +"81fbffe1": "getGiftoAddress()", +"81fc4d90": "increaseLockAmount(bytes32,uint256)", +"81fc7f2b": "accountFrozenStatus(address)", +"81fcef3c": "bitcoinContract()", +"81fcfbcc": "allocateBountyTokens()", +"81fd552f": "storageOwner()", +"81fd63c2": "kanaabbcwalletcoin()", +"81fdbeff": "TransferCoinsFrom(address,address,uint256)", +"81fe5786": "max(int256,int256)", +"81fedc73": "Casinowo(uint256,string,uint8,string)", +"81feed27": "awardName(uint8)", +"81ff01f7": "REPOPCore()", +"81ff4d0b": "TEAM_TOKENS()", +"81ffdfab": "getTokenAmountForCampaign(bytes32)", +"82004053": "ownerSetZlotsAddress(address)", +"8200a57f": "changeOwner(address,address,bool,bytes)", +"8201ff14": "setNewTerrain(uint256,uint256,bytes32)", +"820203a3": "ztx()", +"82023707": "updateSecondUnionIds(bytes32,bytes32)", +"82024a14": "PromissoryToken(address,uint256)", +"820267ff": "diminishPool(uint256)", +"82027b6d": "isAllowed(bytes32,address)", +"820333a2": "seeAddress()", +"8203e7f3": "justSendDonations()", +"8203f5fe": "initContract()", +"82043443": "transfer_(uint256,address,address,uint256)", +"820447fc": "TrimpoToken(uint256,string,string,address,address,address)", +"8204ecdd": "getFee(bytes)", +"820537b7": "getDaoists()", +"8205e8e7": "setPayment(uint256,uint256,bool,address)", +"82067cc0": "pauseRoundB()", +"8206ba89": "MAX_STAGE_2_LIMIT()", +"82076979": "TeamTokenHolder(address,address,address)", +"820776de": "DivsToRefundpot()", +"8207b07d": "lastPurchasePrice()", +"8208921d": "getWalletFor(address)", +"8208df23": "stack(address,uint256,uint256)", +"820935dd": "HDILToken()", +"82094fa4": "setAddressAdmin(address)", +"8209b38a": "Freecoins24()", +"8209d121": "a_viewSellOffersAtExchangeMacroansy(address,bool)", +"820a5f50": "fundedAmount()", +"820b9f1e": "kncPerETHRate()", +"820bec9d": "receivedETH()", +"820c05db": "FPINCOIN(uint256,string,string)", +"820c1dd0": "pollBurnQtyMax()", +"820c59bb": "GetIsPauded()", +"820c7468": "isVendorOf(address,address)", +"820c815e": "EGGS_TO_HATCH_1DINO()", +"820cfa06": "LogUserRemoved(address)", +"820dc540": "lockBalanceIndividual(address,uint256)", +"820e0d1f": "getChallenger(bytes32)", +"820e5e0b": "DividendRecycled(address,uint256,uint256,uint256,uint256)", +"820e79ed": "cstBalanceLimit()", +"820e93f5": "email()", +"820ecdaf": "iou_purchased(address)", +"820f52bc": "validPeriods()", +"820f9b85": "changeBetRange(uint256)", +"82100be6": "getWinningPayoutDistributionHash()", +"82100e3f": "deploymentBlock()", +"82104786": "Profit1000()", +"8210f13b": "BatchCancelSales(uint256[])", +"82123075": "safeExit()", +"82123cd2": "prizeReferee()", +"8213dafc": "setupAirDrop(bool,uint256,uint256)", +"82142370": "preICO(address)", +"82147bb4": "getGuardianNum()", +"8214fe03": "setMetadataChannels(string,string)", +"82154075": "Rentable()", +"8215c35d": "bincentiveErrand()", +"821648f4": "accessHolder(address)", +"8216ed6c": "getCompte_22()", +"82173d11": "KentKoinToken()", +"82189551": "buy(uint256,bytes)", +"8218e540": "insertHash(uint16,uint8,uint8,string)", +"821919fd": "getPetCanPresellCount()", +"821b771f": "targetBondingRate()", +"821b98f3": "closeTheoreticalClosedAuction(address,address,uint256)", +"821bee73": "vestings(uint256)", +"821c9a57": "test_testableStandardCampaignRefund()", +"821d7356": "setMainnetLocked(bool)", +"821e2491": "MyBetting()", +"821e3759": "payDivsValue(uint256)", +"821e4496": "isVerifiedCode(address,bytes32)", +"821e9169": "testFailControllerChargeMoreThanApproved()", +"821f830f": "addPack(address)", +"82202a15": "fetchCurrentSnapshotBlockIndex()", +"8220e945": "FactoryChangedEvent(address)", +"8221ac6f": "_createHolderId(address)", +"822221a6": "setContractToken(address,address)", +"82222674": "changeEndBlock(uint256)", +"822296d4": "isList()", +"8222a5ce": "insurance_Token()", +"8222aa1e": "settle(address,uint64,uint64,bytes)", +"8222b7e9": "getBonusPercentage()", +"8223188c": "Rose43()", +"82233b7a": "returnHostCut(uint256)", +"8224b76b": "StartOK()", +"8224ca2b": "SaleEDUSupply()", +"82251512": "divCeil(uint256,uint256)", +"8225172f": "getVowInfo(bytes32)", +"82251b99": "DRONECOIN()", +"8225757b": "getAddressByUserId(uint256)", +"822785e4": "_setTokenDescription(address,uint256,string)", +"82281104": "incise(uint256)", +"82286755": "MyRefundableCrowdsale(uint256)", +"82288e89": "setAccountIsNotFrozen(address,bool)", +"8229268b": "StageThreeDisable()", +"822942aa": "placeDeal(bytes16,address,address,uint256)", +"822a46ae": "setTiimPrivateSaleAddress(address)", +"822b08d0": "grantManagerPermission(address,string)", +"822b0be3": "teamTimeLock1()", +"822b1747": "_getEpicPlusRarity(uint32)", +"822bd0dd": "BOT_ELEMENT_3()", +"822c7671": "testControllerShouldBeSet()", +"822cba69": "setUint64(uint64)", +"822d487d": "getBrands()", +"822d9b4e": "onlyOwnerGetBountyWallet()", +"822daf60": "timeFactor()", +"822e1506": "_bonusRatio2()", +"822e57f1": "depositHelper(uint256)", +"822ee26c": "canMovetoken()", +"822f31e2": "AlexCoin()", +"822f7eb4": "setFeeReceAccount(address)", +"823113c7": "thresholdsByState(uint256)", +"82311e25": "checkStage1Over()", +"823126d5": "_createToken(address,uint256)", +"8231ee98": "lastTimeGen0()", +"823213ef": "removeExclusiveRate(address)", +"823287b7": "chargeQuarterlyRate(bytes32,address)", +"8232e09e": "DeleteUser(address,address)", +"82330505": "setCommissionPoints(uint256,int256)", +"823374e3": "changeDedicatedProxy(address)", +"8233fbcb": "getTotalProfit(address)", +"82348bab": "setMinSlippageFactor(uint256)", +"823506af": "getData_29()", +"82351b43": "getLinearRelease()", +"82357105": "bl()", +"8236342c": "hashToPoint(bytes32)", +"82367b2d": "updatePrice(uint256,uint256)", +"8237ab8d": "IsSeedMember(address)", +"8237bbf0": "min_shares_to_sell()", +"82381c96": "WatchCurrentMultiplier()", +"8238520f": "getParentBranch()", +"8238b968": "BeatOrgTokenMainSale(address)", +"8238cc8f": "getFIRST_STEP_MULTIPLIER()", +"823914d9": "multisigETH()", +"82396bc6": "lnLimited(int128,int256)", +"82396f60": "getTokensInAction()", +"8239773a": "NePay()", +"8239b1e7": "getSequenceId(uint256)", +"8239b29d": "periodITO_hardCapInUSD()", +"823ab43b": "returnedTo(address)", +"823ac373": "verify(bytes32,bytes,address)", +"823b5e9f": "getAuditTimeoutInBlocks()", +"823b7475": "UpgradeAgentSet(address,address)", +"823ba0b8": "burnFormula()", +"823ba381": "InvestClose(uint256,uint256,uint256)", +"823bce43": "zasxzasx()", +"823c73ec": "MarginToken()", +"823c82ca": "FREEZE_PERIOD()", +"823cfd70": "changeMinStakingTime(uint256)", +"823e1832": "ChangeClientCategory(address,uint256)", +"823e569e": "controlWallet()", +"823e6e79": "validateBalance(address)", +"823edd48": "getComponentId(uint256,uint256)", +"823f57ca": "withdrawFromAmt()", +"82401f06": "transactionSwitch(bool)", +"82402743": "createPromoNarco(string,string,address)", +"8240ae4b": "challengeReparameterization(bytes32)", +"82419e92": "numberToString(uint256,uint256)", +"8242216d": "jackpotOfHouseEdge()", +"82425d7c": "hasNoBids()", +"82428323": "updatePeriodically(uint256)", +"82430c07": "_sendOwnership(address,address,uint256)", +"824338bd": "founderAllocation()", +"8243a036": "presaleFemaleTokensLimit()", +"8243fd61": "addMilestone(uint256,uint256,uint256,uint256,string)", +"8244208c": "FrescoToken()", +"8244b8c8": "findEndpointByAddress(int256,address,address)", +"8244ee58": "Amberella()", +"824563f6": "mintingContractAddress()", +"82457d53": "periodTable(uint256)", +"82474b1b": "teamName()", +"8248159e": "registerApprove(bytes32,uint8,bytes32,bytes32)", +"82484a36": "vestingToken(address)", +"82484c0b": "BetstreakICO()", +"824891f8": "changeMinimumCap(uint256)", +"82489311": "_buyNationInternal(uint8,uint256)", +"8248e722": "updateConfig(uint256,uint256)", +"824916b6": "playersAmounts()", +"82495626": "getVoteAccount(uint256,uint256,uint256)", +"824989c3": "changeLifetime(uint256)", +"824a5166": "ChannelCloseRequested(address,uint256)", +"824be3c7": "TheRichestWins()", +"824d1b4b": "preICOStartDate()", +"824d5603": "getIndex(uint16,uint16)", +"824d84d5": "createVestingContractWithFloatingPercent(address,uint256,uint256,address,uint256[])", +"824dbc9a": "changeMembership(address,uint256,bool,string)", +"824e5ebf": "distributeETHOS(address[],uint256)", +"824eddd9": "removeSupportedToken(address,address)", +"824eec3b": "editionOfTokenId(uint256)", +"824f0f7e": "tittyContractAddress()", +"824f2f1f": "globalConstraintsCount(address)", +"82507c5a": "Radix()", +"8250ea7d": "getReferralPool()", +"8250f7e5": "isInvestmentPermitted(address,uint256,uint256)", +"82518c2a": "exercisePut(uint256,uint256,uint256)", +"82520e07": "receiveFrom(address)", +"82528791": "setWallets(address,address,address,address,address)", +"8252ad9c": "totalAuction()", +"8252b2cf": "acceptCreatureOwnership()", +"8252e391": "transferInternal(address,address,uint256,bytes,bool,string)", +"825374ba": "buyATCToken()", +"8253adf1": "createBet(bytes16,bytes16,bytes16,bytes16,uint256,uint256)", +"82544c1f": "GoWalletToken()", +"8256687c": "addClaim(bytes12,bytes12)", +"82568a24": "p_update_planetCryptoCoinAddress(address)", +"82576dd6": "Laundromat(uint256,uint256)", +"8257f610": "canPurchase(uint256)", +"8258cbbd": "getContractETH()", +"825918ee": "delgodaddress(address,address)", +"82594f09": "iMaliToken(address)", +"825993ab": "totalCouponsUSD()", +"8259c78c": "depositPpm()", +"825a229e": "setEditor(address)", +"825af86b": "processJackpots(bytes32)", +"825b8b42": "buy(uint16[])", +"825bdb74": "setSecondaryManager(address)", +"825c3e36": "closeGame(bytes32,uint8)", +"825d7034": "RiptoBuxToken()", +"825e04d3": "dfs()", +"825edfd3": "getClassMechValue(uint256)", +"825f5a93": "RoundDSold()", +"825f6552": "SVET()", +"82609d51": "failedDonations()", +"82611dfe": "setOption(string,uint256)", +"8261b6bf": "receiveTokenLoot(uint256[9],uint256,uint8,bytes32,bytes32)", +"8261c4c7": "MINERS_HOLDER()", +"8261cfe4": "travelTo(uint256,uint256)", +"8261eb1b": "frtToken()", +"82629384": "shareStoredTokens(address,uint256)", +"8262963b": "setInfo(string,uint256)", +"8262fc7d": "addrBalance(address)", +"8263a938": "getProposalLength()", +"8263e953": "_claimSocialNetworkIdentity(uint256,uint256,address,uint8,bytes32,bytes32)", +"826446fa": "parse2wei(uint256)", +"82645725": "Planetagro(address)", +"82648222": "retrieveWCT2()", +"8264fe98": "buyPunk(uint256)", +"8265d137": "checkRegistrationStatus(bytes32,address)", +"8265d577": "TestreplayAnser(uint256)", +"8265dbc1": "bonusAndBountyTokens()", +"8265fb13": "optionPoolMembersAmount()", +"82661dc4": "splitDAO(uint256,address)", +"826679a1": "getFundSPBalance()", +"82672304": "GeneratePublicKey(string,string)", +"82672482": "vestingRegistered()", +"826776fa": "claimTeamTokens(address,uint256)", +"8267a9ee": "deleteIntValue(bytes32)", +"82688f14": "bn128_multiply(uint256[3])", +"8268efcd": "RunningAuctionsEvent(address,uint256,uint256,uint256)", +"82692679": "doSomething()", +"82699367": "CicadaToken()", +"8269cf4d": "seo(uint256)", +"8269d3c0": "buyTokensT4T(address)", +"8269df9b": "getLastCategory()", +"8269ee3d": "Issued(address,uint256,uint256)", +"826a483f": "_emitHashSet(address,bytes32,bytes32)", +"826a49c9": "removeGameInfoFromArray(uint256)", +"826c10d9": "exhaustBattle(uint256)", +"826c2447": "PGDToken()", +"826c69b8": "participantBalance(address)", +"826c6f73": "addServer(string,uint256)", +"826cc57a": "referral_address()", +"826d3379": "tierPrice(uint256)", +"826db6c8": "SLFYCoin()", +"826e9def": "initPresaleTokenVault(address[],uint256[])", +"826efb6d": "payBonus(address[])", +"826f57a1": "endBetting()", +"826f8a00": "createOrder(string,string,string,string,string,string)", +"827037d6": "modCEOAddress(address)", +"827037db": "icoStart()", +"8270c41e": "setPriceToken(uint256)", +"82712aeb": "purchaseWolkEstimate(uint256,address)", +"827147ce": "returnString(string)", +"8271bd99": "payoutAmount(address)", +"8271bedc": "getUserBetsLength(uint256)", +"8272d083": "isSupported(address,bool)", +"82731247": "isB(address)", +"8273a411": "allBalancesOf(address)", +"82744368": "minimumEtherAmount()", +"82757f99": "withdrawTeamPot()", +"82760c88": "GoGlobals()", +"82766b1b": "setAmount(address[],uint256[])", +"82768708": "weiMinimumGoal()", +"8276bd19": "PROPOSED_STATUS()", +"8276ccf2": "setHeroName(uint256,string)", +"82771c8e": "isSane()", +"82771ff4": "endPlaceOrder(uint256)", +"82776521": "strConcats(string,string)", +"8278337a": "writeAttributeFor(bytes32)", +"8278fcea": "AirdropReward()", +"82790c19": "SideBridge(uint256,address[],uint256)", +"82792ce8": "getInsideCallSender()", +"82797bea": "Preesh()", +"8279c7db": "setReceiverAddress(address)", +"8279ea54": "change_bounty_manager(address)", +"827aeb16": "_changeTittyPrice(uint256,uint256)", +"827bc64b": "setLeftoverTokensBuffer(uint256)", +"827bfbdf": "setLocation(string)", +"827c049e": "emission()", +"827c1e41": "getTittyByWpId(address,uint256)", +"827cc452": "withDrawMoney(uint256)", +"827d084a": "getActiveBusinessesPerCity(uint256)", +"827d7ba9": "Fosha(address)", +"827e4cf1": "manuallySetNumRewardsAvailableForChildAddress(address,address,uint256)", +"827ef325": "_parseMsgData(bytes)", +"827ef4c7": "m_fundsAddress()", +"827f143e": "setPresentMoney(uint256)", +"827f32c0": "generateTokens(address,uint256)", +"827fc57c": "ChickenFarmer()", +"827ffcea": "horas()", +"8280114b": "addressOfERC20Token()", +"828033da": "getFlag(uint256,string,string)", +"82803c22": "sell_tokens(uint256)", +"8280b498": "setFrozen(address,bool,uint256)", +"82812aed": "BuyPriceSet(uint256)", +"828183bc": "getSwapInfo(uint256,address,address,address)", +"8281da38": "refundBet(address,bytes32)", +"8281feaa": "QuestionIs(string,string)", +"828282e9": "bonusRates(uint256)", +"8282e1e4": "SEPA()", +"828363b4": "transferAdviser(address[],uint256[])", +"828375e8": "computeTokensWithBonus(uint256)", +"82838c76": "subTotalSupply(uint256)", +"8284f2a7": "proposeGame(address)", +"82857a03": "approveAndCallWithSender(address,uint256,bytes4,bytes)", +"8285d272": "GOAL_REACHED_CRITERION()", +"82862275": "getDeadline(uint256)", +"82872491": "setCaps(uint256,uint256,uint256,uint256)", +"8287ccb4": "onDeposit(uint256)", +"8287d6ce": "_createDeposit(address,uint256,bool)", +"828806cd": "submitTransactionWithSignatures(address,uint256,uint8[],bytes32[],bytes32[])", +"8288196d": "THANKSTEST1()", +"8288edd0": "nonTransferrableBalances(address,address)", +"828909bd": "getIntValue()", +"82892dd9": "blockMember(address)", +"828a33b9": "FreeDiceCoin()", +"828ae96d": "cdc()", +"828c06cd": "expLimited(int256,int256)", +"828ca03c": "getTaskListSize()", +"828d671c": "dyn_sig()", +"828dfbca": "user_acq_address()", +"828eab0e": "defaultResolver()", +"828f1b42": "buyObject(address)", +"828f4057": "numberofGamePlay()", +"828f5fba": "air2(uint256,uint256,uint256)", +"828f717c": "fixPlayerID(uint256,uint256)", +"828f8581": "tokenTransferFunctionIdentifierMap(bytes32)", +"8290d1e0": "StandardTokenDeployable(string,string,uint256,uint256,address)", +"8290fe25": "finalizeExits(uint16)", +"8291286c": "contractId()", +"82914e5d": "getObjectData(bytes32[],uint8[])", +"82916381": "execute(address,uint256,uint256,bytes)", +"82917320": "increaseLockedBalance(address,address,uint256)", +"8293779c": "isOps(address,address)", +"82939b27": "getPreSaleData()", +"8293a114": "unbanAddress(address)", +"8294a796": "WelfareHandout(address,uint256,uint256,uint256,uint256)", +"829534d7": "m_pendingIndex()", +"8295a9ba": "checkDupe(string)", +"829644a6": "freelanceReinvest(address)", +"82964696": "ZSYCoin(uint256,string,string)", +"8297b90c": "PRESALE_LENGTH()", +"8297d46d": "BTL_ATHENIAN()", +"8298c3b5": "itemVoteDn(address,uint256)", +"8298c5dc": "last_winner()", +"829923bf": "admin_setAdmin(address,bool)", +"829965cc": "epochCount()", +"82996d9f": "rent()", +"829981fb": "FinalToken(uint256,string,string)", +"829a34c6": "getUserInfo(bytes20)", +"829a92f4": "hardcapChanged(uint256[])", +"829b38f4": "getMaxEscrowAmount(uint256)", +"829bd99c": "balanceOfByLegacy(address)", +"829c3428": "startTransfer()", +"829c38e1": "claimSolve(uint256[],uint256,uint256,bool)", +"829c3dee": "createDebt(bytes32[8],bytes,uint256)", +"829e9ece": "deathData_v16()", +"829ebdcd": "upgradeFor(address,uint256)", +"829ed3a5": "ownerTokenTransfer(address,address,uint256)", +"829efd71": "TonhaoCoin()", +"829f0667": "verify_sk_knowledge(uint256[2],uint256[2])", +"82a0888b": "totalSaleWei()", +"82a09cc5": "TokenCreated(uint256,address,string)", +"82a123ea": "WhitelistUpdated(uint256,string,uint256)", +"82a147cd": "addYouCollectContract(address,bool)", +"82a18331": "MOONCOINCONTRACT()", +"82a1ce1b": "setSourceToken(address)", +"82a352e4": "firstStagePriceOfTokenInWei()", +"82a35706": "tokenSoldPreICO()", +"82a3e5df": "STATE_CLAIM_ENABLED()", +"82a3f98d": "VOTING_PERIOD_DURATION()", +"82a5285d": "getMinBetAmount()", +"82a60a59": "CollectibleIndex2()", +"82a62137": "activateAccount(address)", +"82a66d93": "earlySponsor()", +"82a7cf1e": "ownerOf(uint16)", +"82a86cda": "getRarePLATInfo(uint256)", +"82a90545": "funComputeRoundTime(uint256)", +"82ab890a": "update(uint256)", +"82ab8a82": "startDeal(bytes32,uint256)", +"82ac1d99": "getNodeValue(bytes32)", +"82acaa39": "getChildrenAgainstAnimalId(uint256)", +"82ad5ecf": "yeedToken()", +"82ad6f35": "refund(address,address,uint256)", +"82ade405": "forceChooseRandomWinner()", +"82ade466": "getWithdraw(address,address,uint32,bytes32[],uint256)", +"82ae2227": "createUser(uint32,uint64)", +"82af3526": "addGift(address,uint16)", +"82afd23b": "isActive(uint256)", +"82b00403": "finalFundGoalReached()", +"82b022e0": "set_species(uint256)", +"82b0444e": "CityMayor()", +"82b0627c": "changeFundingTime(uint256)", +"82b0862f": "addBps(uint256,int256)", +"82b1ad50": "totalPrize()", +"82b1b4f3": "WithdrawToAdmin(uint256)", +"82b1b617": "ViewSellOrder(address)", +"82b1fb0d": "setGlobalMultisigWallet(address)", +"82b2a559": "buy(uint256,uint256,address,address)", +"82b2e257": "getTokenBalance()", +"82b2f95f": "DEVELOPER1()", +"82b49248": "BlockOne()", +"82b57b96": "MONUMENT_UN_FEE()", +"82b58599": "WeiHash(address)", +"82b61a3e": "Rectangle(address)", +"82b68f4f": "actionVotedRate()", +"82b74b89": "lockTransfers()", +"82b7b500": "find(string)", +"82b7fa4e": "cancelGladiatorBattle(uint256,bytes32)", +"82ba614f": "setRound(uint256,uint256)", +"82bb326b": "isGoldMigrated(address)", +"82bbcc2c": "removeIdArrayItem(address,uint256[],string,uint256)", +"82bbd1fe": "setlastprize()", +"82bbdbec": "nameAvailable(string)", +"82bbe9cc": "getGameFee(uint256)", +"82bc07e6": "lastRound()", +"82bcd463": "DAKUToken()", +"82bcef79": "increaseAllowanceProxy(address,address,uint256)", +"82bd5a71": "warriorToApproved(uint256)", +"82be0ccd": "distributeTokensToApprovedUsers()", +"82be415d": "BonusDealer()", +"82bf6464": "DAOrewardAccount()", +"82bf9a75": "setPip(address)", +"82bfa9f2": "upgradeStorage(address)", +"82bfc739": "reLoadXaddr(address,uint256,uint256)", +"82bfefc8": "TOKEN()", +"82c00a50": "getCourseLength()", +"82c0287e": "deleteEtherBox(address)", +"82c058d9": "showTrnsactionLog(uint256)", +"82c0652a": "calcMultiplier()", +"82c174d0": "preSigned(bytes32,address)", +"82c198ef": "fxpDiv(int256,int256,int256)", +"82c20f84": "preSaleBonus3Percent()", +"82c26c6a": "GOCToken()", +"82c30220": "Earthcrypt()", +"82c4175d": "privateRate()", +"82c48f9e": "_batchTransfer(address,address[],uint256[])", +"82c51376": "LENRCoin(uint256,string,uint8,string)", +"82c59c81": "getGameBlocks(uint256)", +"82c6b2b6": "OfficalHold()", +"82c7340e": "GetPlayerRound(address)", +"82c7bac7": "callOnExchange(uint256,bytes4,address[5],uint256[8],bytes32,uint8,bytes32,bytes32)", +"82c7bf2f": "Zigger()", +"82c7f4d6": "setMessagefromdovie(string)", +"82c8ac27": "DatCrowdPreSale(address)", +"82c8c76f": "blocktube(uint256,string,uint8,string)", +"82c9004a": "computeArtistGenesisSaleFee(bytes32,uint256)", +"82c97b8d": "collectReward(address)", +"82ca116d": "changeBankAddress(address)", +"82ca49a8": "sendOwnerFee(uint256)", +"82cac6df": "lastRate()", +"82cb08aa": "MoveToBase(uint256)", +"82cb9df9": "addrFinance()", +"82cbb2e4": "Dagelane()", +"82cbdc0f": "create(string,string,string,address)", +"82ccef76": "GameEnded(address,address,uint256,uint256,uint8,uint8)", +"82cdc0fb": "setRunTimeAfterSoftCapReached(uint256)", +"82cdc93e": "getPlayerInstWinning(uint256,uint256,uint256)", +"82ce6523": "IWasFirstShareToken()", +"82cee91c": "BonusPeriodFor(uint256)", +"82cf114c": "setProfitAddress(address)", +"82cf2116": "transferAndAuction(uint256,address,uint256,uint256,uint64)", +"82cfd1e0": "turn_flag_OFF()", +"82cfee4d": "BitcoinSapphire()", +"82d04bd4": "_complianttransfer(address,uint256)", +"82d1407c": "calcTicketEarnings(uint256,uint256)", +"82d18650": "minPay()", +"82d1bc89": "Darks(address,address)", +"82d22377": "infraIndexToApproved(uint256)", +"82d288c2": "setMintingCurator(address)", +"82d29195": "FundingStageNum()", +"82d2dcfb": "UETH()", +"82d33374": "updateLastTransactionTime(uint256)", +"82d40041": "getAbilitiesForCollectibleId(uint256)", +"82d419f5": "fullUnlockAngelsAccounts(address[])", +"82d4685c": "setAllocations(uint256,uint256,uint256,uint256,uint256,uint256)", +"82d559de": "catchMonster(address,uint256,uint32,string)", +"82d5eb98": "playerIdToExtendedAttributes(uint256,uint256)", +"82d708c4": "dividendRecentBuyersPercentage()", +"82d74005": "YUPTimelock(uint256,uint256,address,uint256)", +"82d82983": "RuralBank(uint256,address[])", +"82d8dff6": "getMaxPrice()", +"82d95df5": "setStartDate(uint256)", +"82d9ac39": "percentForBounty()", +"82d9b9bb": "turnOffCanUpdateNextGameMinAndMaxBlockUntilGameEnd()", +"82db9bd4": "setCaissa()", +"82dc107d": "SECOND_TIER_SALE_START_TIME()", +"82dc1ec4": "addPauser(address)", +"82dc5c9d": "UnionChain()", +"82dc7836": "openGate()", +"82dc87b6": "RefundPeriodStart()", +"82dced63": "testHitPresaleCapPresale()", +"82dd6012": "_aremoveByIndex(uint256)", +"82dd87dc": "deleteUser(uint256,uint256)", +"82ddad13": "Auction(address,uint256,uint256,uint256,string)", +"82de6df7": "getGameBegin()", +"82deb6cd": "m_publiclyDistributedTokens()", +"82decb49": "_maint_setCustomSeed(uint256)", +"82dfc5f7": "WETH_ADDR()", +"82dfe1fb": "changeTreeAttributes(uint256,string,string)", +"82e1250f": "DaysToMyDestroy()", +"82e2f767": "finalizedNextUpgrade()", +"82e3036c": "StandardToken(string,string,uint8,uint256,address)", +"82e37b2c": "getPlayerName(uint256)", +"82e380ef": "auctionInformation(uint256)", +"82e41258": "unregisterPrefix(string)", +"82e43a3b": "TheFrozenSolidShitCoin()", +"82e46b75": "setCoin(address)", +"82e5d073": "getRewardTokenCount()", +"82e615fc": "bidRegistry()", +"82e61d79": "PayoutDividends(uint256,uint256)", +"82e6bbd2": "onlyBouncerExecuteDelegatecall(address,uint256,bytes)", +"82e6d3d6": "foundationSupply()", +"82e77165": "_setAllKeys(uint256,uint256)", +"82e93309": "importGenesisPairs(address[],address[])", +"82e94ac5": "eject()", +"82e96916": "setCoinPercent(uint256)", +"82e97740": "initAffiliate()", +"82ea3985": "clearNextArenaTime()", +"82ea84a3": "getIssuedScoreAmount()", +"82ea872c": "refHandlerAddress()", +"82ea97b3": "tokensForIco()", +"82ebaec4": "distributeTEST(address[])", +"82ebe9ba": "photoData()", +"82ec5ddc": "BioToken(address,address,address,address,address)", +"82ec623c": "_noThrowImplements(address,bytes4)", +"82edaf94": "tokenContractAddress()", +"82ee27cc": "setCoinBalance(address,uint32)", +"82ee282b": "thirdBonusSalesEnds()", +"82eed60c": "pauseCrowdsale(address)", +"82ef351a": "getTotalMonster()", +"82ef6483": "RabbitCore(string,string)", +"82ef8fa8": "adminClaim()", +"82f0151c": "MetaHash()", +"82f0622a": "teamReward()", +"82f0b31c": "getLife(bytes32)", +"82f0d875": "makeHash()", +"82f128f7": "MJOYToken()", +"82f16872": "raffle_balance()", +"82f19e3a": "deltaTFunc(uint256,uint256,uint256,uint256,uint256)", +"82f1ec1f": "getActivityAccountInfo(address)", +"82f2045c": "getEntitiesCount()", +"82f2a164": "addCET6(uint32,uint32,uint32)", +"82f2d8d7": "moveMarketData(uint256[],uint64[],uint64[],uint128[],address[])", +"82f39e2f": "mktTokenCap()", +"82f43303": "roundMax()", +"82f4b3a8": "badgeIfFreeze(address)", +"82f4ef73": "getStageName()", +"82f56556": "udgradeAttack(uint256,uint256)", +"82f5a3e1": "withdrawTotalBalanceDonateWei(address)", +"82f5e31b": "convertFromWei(bytes32,uint256)", +"82f66ff0": "RabbitCoin(uint256,string,string)", +"82f68dc4": "rankOf(uint256)", +"82f7325e": "CRYPTOVENO()", +"82f768d4": "tokenbeneficiary()", +"82f78260": "acupuncturecoin(uint256,string,string)", +"82f7d5c3": "divideNumberBy()", +"82f8152c": "account2()", +"82f858e8": "addresses4(uint256)", +"82f867a4": "BpsToken()", +"82f8767d": "SuperPAC()", +"82f87fdb": "checkFundingStateFailed()", +"82f8b6e9": "roundInterval()", +"82fa3421": "push(uint256,bytes32)", +"82fa7f8b": "weiPerWholeToken()", +"82fa9c0d": "isPersonalBonuses()", +"82fac352": "getPricesOfLatestTradeRecords(uint256)", +"82fb3b7c": "voteNoLockByAdmin()", +"82fb63c7": "getImageCurrentRegionId(uint256)", +"82fbbe47": "Ticked(uint256,uint256,uint256)", +"82fbdc9c": "register(bytes)", +"82fc49b8": "setCosignerAddress(address)", +"82fd5bac": "getDeal(uint256)", +"82fe1e46": "JaneToken()", +"82fef47d": "addToLists(address,bool,bool)", +"82ffee45": "approveRemoveOwnerRequest2()", +"82fffde0": "get_articolo(bytes,bytes10)", +"830010f3": "setReferrerRewards(uint256[])", +"8300399d": "aqwsaqws()", +"8301cfec": "backVenusCoinOwner()", +"8301fb2e": "cashOutTank(uint32)", +"8301fb61": "userHasSmartSpeed(address)", +"830245e3": "sumICOStage7()", +"830321be": "PGUC()", +"83037b81": "checkInterest(address)", +"830402c1": "startGameGas()", +"83054b6a": "GetConsentDirectiveCount()", +"8305d1c3": "GGGToken()", +"830639ac": "isWhitelisted(address,uint256)", +"83076a73": "updateCfo(address)", +"83084b3f": "setNotInWhitelistAllow(uint256)", +"8308c786": "minBlockGap()", +"8308d7e9": "set(address,uint256,uint256)", +"830953ab": "claimAmount()", +"830adf56": "get_previous_user_recast_from_item(bytes32,bytes32)", +"830b3a1e": "setIsFixed()", +"830b6868": "getPriceCredentialItemId(bytes32)", +"830b6b87": "MyOffer(uint256,string,uint8,string)", +"830cbbbd": "redeemToken(address,uint256)", +"830ced52": "TIER_1_CAP()", +"830d0627": "giveCdpToProxy(address,bytes32)", +"830d77d4": "ETHERONEUM()", +"830e8e64": "callAmendment(uint256)", +"830ebd7f": "transferFromNotFullAllowanceTest(address)", +"830ef41b": "transferERC20(uint256,address,address,uint256)", +"830f2935": "icoAgent()", +"830f3d8a": "Diploma()", +"83100580": "PriceWeekTwo()", +"8310d61c": "getLastGame()", +"83111397": "blacklistAddr(address[])", +"831121dc": "getLockedStateAddress()", +"83123f30": "setRole(address,bytes32,bytes32,uint256)", +"83123fa6": "coinsIssuedIco()", +"8312a886": "tokenValueCount()", +"8314b490": "earlyContribList(uint256)", +"8314dcb4": "unAuthorizeContract(address)", +"83150a93": "opetTokenBalance()", +"83160d71": "setPrices(uint256,bool)", +"8316394e": "allow(bytes32,string,address,bool)", +"83186be0": "startICO_w1()", +"83187cf4": "cryptaurRecovery()", +"8318e40b": "transferBcoupons(address,uint256)", +"83197ef0": "destroy()", +"8319da07": "setOwnerCut(uint16)", +"831a1754": "TOKENS_HARD_CAP()", +"831a1a3c": "ECPoints()", +"831a987a": "getSoulByEth(uint256)", +"831aab01": "setData_15(string)", +"831aba43": "referralsOf(address)", +"831b19c2": "KOToken()", +"831b3f67": "convertDustToEther(uint256)", +"831b55d6": "get_balance(address,uint32)", +"831bb4f2": "setAcceptedLegacyAugmintToken(address,int256,bool)", +"831c2b82": "getChannel(bytes32)", +"831d3e09": "offFreezing()", +"831dc22c": "CATCrowdsale(uint256,uint256,uint256,address,address,address)", +"831e0485": "twitterIdOfClaimerAddress(address)", +"831e1deb": "changeExchange(uint256)", +"831e6270": "isSaleFinalized()", +"831e80f2": "create(string,string,uint8,uint256)", +"831ed348": "clearJoinedCrowdsales()", +"831f5ad2": "remainBalanced()", +"831f750e": "claim(address,string,string)", +"832018aa": "BitSelectProtegido()", +"832048d4": "TokenLoot(address,address,address,address,address,address)", +"83206e78": "marriedAt()", +"83212e74": "updatePreSaleCloseTime(uint256)", +"83219a8a": "editMetadata(uint256,string)", +"8322cb91": "addTicket2(address,uint256)", +"8322fff2": "ETH()", +"83234aa6": "FileInfoManager()", +"8323550b": "TUSD()", +"8323bebb": "TokenSold(address,uint256,uint256,uint256)", +"8324a852": "partner(address,address,uint256)", +"8325229a": "playerWithdraw(address)", +"83253cfa": "cancelMarginCallOnBehalfOf(address,bytes32)", +"83255d6e": "getOwnProducts()", +"8325a1c0": "borrowInterestRate()", +"8327a313": "test_initialize()", +"832880e7": "getUser()", +"83289567": "meetingDate()", +"8328b610": "setStakingRequirement(uint256)", +"8328dbcd": "migrationAgent()", +"8328e032": "setStandardPackPrice(uint256)", +"8329ac52": "voteForCandidate(string,string)", +"8329df0a": "allowReferrals()", +"832a66a2": "purchaseCardinal()", +"832b0dc3": "testThrowOnTransferToNullAddress()", +"832b2c60": "specialManagerAddressNumberMap(address)", +"832b9eb2": "MANHATTANPROXY6THAVE()", +"832bc28d": "getPoolHistoryCount()", +"832bff3a": "setForkEndTime(uint256)", +"832df980": "lockEmission()", +"832e02ef": "getUpgradeValue(address,uint256,uint256,uint256)", +"832f6412": "getCenturion(uint256)", +"832f6924": "shuliang()", +"83315b6e": "CONTRACT_FEATURES()", +"83318574": "maxPreSaleStage()", +"83324e8c": "numGroups()", +"833270d8": "preIcoEnd()", +"833331e8": "totalJadeProduction()", +"8334278d": "reserves(uint256)", +"83343d80": "deleteItem(bytes32)", +"833472ba": "TCOCOIN()", +"83347622": "newTeam(string,string)", +"83349122": "crowdsaleIsOpen()", +"8334d195": "viewToken(uint256)", +"8334e170": "SellableToken(address,address,address,uint256,uint256)", +"83366ab0": "addBytes(bytes32,bytes)", +"8337077b": "returnToken(string,address,uint256)", +"83370c25": "FFFToken()", +"833747f8": "getLovers(bytes32)", +"8337680a": "getMyCommitmentCount()", +"833888f0": "LAF()", +"83393882": "contracteeWithdraw(uint256)", +"8339e153": "SETPointerToken()", +"833abf3a": "registerAssetProxy(bytes4,address,address)", +"833b1fce": "getOracle()", +"833b4596": "testApproveSetsAllowance()", +"833be5d5": "getTotalLoans()", +"833c202e": "UNITTransferWhiteList()", +"833cde52": "SaleToken()", +"833cf6fc": "TransCompleteds(address[])", +"833d56c7": "doSwarm(address,uint256)", +"833ea306": "soldForThird()", +"833eaa8b": "incise(address,uint256)", +"833eccc5": "batch_transfer(address[],uint256[])", +"833f43c2": "refill(address)", +"833ffb63": "removeOverride()", +"83405ddb": "unstakeCommunityTokens()", +"83408d73": "burnRemainingTokens()", +"8340f549": "deposit(address,address,uint256)", +"8341f26c": "icoTokenLimit()", +"834292a3": "CanYaCoin(address)", +"8342a9d9": "crowdfund()", +"8343816d": "AcceptCastleOffer(uint256)", +"8343e416": "asideTokensHaveBeenMinted()", +"83442b1e": "opt(address)", +"834472a5": "buildICOStageOne()", +"8344d26d": "TryUnLockCreatorBalance()", +"834614dd": "freeSub(address,uint8,bytes32)", +"8346378b": "transferBenship(address)", +"8346aa47": "spentParsecCredits()", +"8346d3c6": "MultiVesting(address)", +"8347a0d1": "issueTokenAndTransfer(uint256,address)", +"8348bfb9": "setICOAddress(address)", +"8348cf1e": "authorizeAmount(address,uint32)", +"8348d71f": "strConcats(string,string,string)", +"8348fe61": "createCenturion()", +"83492ff1": "deletePrice(string,string,string)", +"83499fdf": "BitcoinRed()", +"834b1aa1": "m_owner20()", +"834be978": "getRewardedSumByRound(uint256)", +"834c3351": "getGoldDataWeight()", +"834c6c84": "setCCH_edit_19(string)", +"834cc6fc": "createEscrow(address,address)", +"834d42c6": "serverForceGameEnd(uint8,uint256,uint256,int256,uint256,uint256)", +"834e0565": "GiveRNG(uint256)", +"834e476f": "newAuctionID()", +"834e6261": "CreateICO(address,uint256)", +"834ee417": "start_time()", +"834eebe8": "calculatePremium(uint256,uint256,uint256,string,string,string)", +"834f199d": "_calculateRequiredManaAmount(uint256)", +"834f54d0": "CarPark()", +"8350dfaf": "fetchdivstopot()", +"8350eb5e": "getHashInDataObject(bytes32[])", +"835164a0": "INBCToken(uint256,string,string)", +"8351a0d4": "getCumulativeProfit()", +"83525394": "NONE()", +"83533d63": "setNumAffirmationsSigned(bytes32,uint256)", +"83537b5f": "test_threeValidEqInt()", +"8353bb51": "ROLE_STATE_PROVIDER()", +"8353c9c8": "SetFreezingEvent(address,uint256,uint256,uint8)", +"8353ffca": "Withdraw(uint256,address)", +"835409f0": "InfimonkCoin()", +"835436b4": "evictWorker(address)", +"835592f8": "passed(address)", +"8355c263": "frozenMinDeposit()", +"8355e15c": "withdrawTokens2(uint256)", +"8356027e": "unfrozenTokens()", +"83563dc6": "_getYear(uint256)", +"83565503": "setMember(address,bytes32,address,bool)", +"83565cc7": "additionalAction(bytes32,uint256[])", +"8356a5b5": "weekOneStart()", +"8357417d": "WithdrawDevFunds()", +"8357c2f0": "setAmountToReceive(uint256)", +"835850f9": "_bytesToAddress(bytes)", +"83586713": "computeResult(uint32,uint32)", +"835939d5": "vote(address,bool,string)", +"8359f045": "range(int256,int256,int256)", +"835a749d": "partialRedeem(uint256,address[])", +"835ac5ce": "softcapUSD()", +"835b3720": "setGeneKind(uint8)", +"835b42fc": "testThrowUpdateLatestRevisionNotUpdatable()", +"835b862f": "OneGameToken(address)", +"835bbd55": "reserveTokens(address)", +"835c1154": "checkInvestments(address)", +"835c19f3": "receivePayment()", +"835c6386": "isPurchasePossible()", +"835c853b": "notaryFee()", +"835cb53b": "MAXIMUM_NON_WHITELIST_AMOUNT()", +"835d2d2e": "executeTransfer()", +"835e119c": "availableSynths(uint256)", +"835e33e7": "DianJingToken()", +"835e98d7": "bonusShare()", +"835eb9f8": "ShieldNetwork()", +"835ec6ef": "CreateDDFT(address,uint256)", +"835f6775": "setBonusesForAmounts(uint32[],uint32[])", +"835fa3ac": "icoSuccessful()", +"835fc6ca": "withdrawal(uint256)", +"835fcab3": "NAME_HAWKING()", +"836028a2": "disputeOpen()", +"83607b02": "calculateDevCut_(uint256)", +"836115fe": "unlockedTokens(address)", +"83617782": "startLive()", +"83624c17": "getPartyA(bytes)", +"83627b8e": "getEmployeeId(address,address)", +"8362f6eb": "balanceSender(address)", +"83634ad7": "fnv(uint256)", +"83636209": "RecoveryKeccak256(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"83638710": "getOwnerOf(uint256)", +"83638c12": "GCOIN()", +"83640881": "getTokenOrdersLength()", +"8364c078": "ownerGetUser(address)", +"8365172c": "num_levels()", +"8366437d": "RegisterUser(bytes32,bytes32[8])", +"83664dd3": "substituteManagerContract(address)", +"8366ee2b": "getPayeeLenght()", +"83672f3e": "setWallets(address,address,address,address)", +"8367e120": "apiUrl()", +"836826a6": "highestBet()", +"83685488": "TECHToken()", +"836880d3": "softcapAchieved()", +"8369ff08": "log2ForSmallNumber(uint256,uint256)", +"836a1040": "mint(uint256,address,uint256)", +"836a107f": "removeFromKYCList(address)", +"836a1e23": "collectExcess()", +"836adfd9": "libbibatchbacktest(uint64,uint32[],uint64[],uint64[],int64[],int64[])", +"836b680f": "createProductionUnit1()", +"836c67d7": "BAC()", +"836cca1d": "privateIcoMax()", +"836d6d66": "WeeklyLotteryB(address,uint256)", +"836d8b2a": "SolusPlatform()", +"836d9665": "removeUsersWhitelistA(address[])", +"836dea0b": "myEther()", +"836e4158": "numOrdersOf(address)", +"836e643f": "endStake(address,address,uint256)", +"836e8180": "round1()", +"836e9431": "updateUsersList()", +"83711c70": "ContributionResolved(bytes32,bool,address,address,uint256,uint256)", +"83714834": "factorial(uint256)", +"83714b27": "_safeMul(uint256,uint256)", +"837150cf": "paused(bool)", +"837197b2": "sendTokens(address)", +"8371e1e9": "rescale(int256)", +"83725a91": "Payment(address,address,uint256,uint256,address,uint8,uint256)", +"837356b1": "doNotAlwaysRequireCosignature()", +"837381fa": "withdrawFromContract(address,uint256)", +"837386ca": "candidateXPAAssets()", +"83739eda": "allocationsInitialised()", +"8373ae71": "cancelTradeOffer()", +"837564dd": "CNotes(string,string,uint8,uint256,uint256)", +"83771e56": "BSCToken(uint256,string,uint8,string)", +"83773de8": "_transfer(uint32,address)", +"83781340": "registerTradeProfile(bytes,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,bytes,uint256)", +"83786f8c": "getBalanceOfToken(address)", +"83788fce": "nextBlock()", +"8378ce42": "readStamped(bytes32)", +"837929b6": "getEventful()", +"83794502": "payForTask(uint256,uint256)", +"8379d75b": "BDC()", +"837a7ba5": "testThrowTransferDisabled()", +"837a8eb3": "CATWithdrawn(uint256)", +"837ada41": "cens()", +"837b68c8": "requestTokenExchange(uint256)", +"837cfb34": "LADYCoin(uint256,string,string)", +"837d52d8": "RAIT()", +"837e4cd9": "getNameAndAge()", +"837e60e6": "removePA(uint32)", +"837e6a94": "setOverride(address)", +"837e7cc6": "rollDice()", +"837f1bf7": "_appendTagged(string,string)", +"838006c0": "OwnableOZ()", +"83804c69": "verifyTransaction(bytes32,uint256,address,address,uint256,address,address,uint256,bytes32,bytes32,bytes,bytes)", +"8380edb7": "isUnlocked()", +"8381ada3": "GOLDEQ()", +"8381f58a": "number()", +"83829bf1": "Involve()", +"8382a574": "Factory(address,bytes32,address)", +"8382b460": "getSlashRewardPart(bytes32)", +"83835c01": "accuracy()", +"8383671b": "mintTokens1(address,uint256,uint256,bytes32)", +"8383bfc8": "EscrowFoundry()", +"83841e0c": "change(string,string)", +"838445e8": "EtherAds(address,address,address)", +"83852cf6": "setEnablePurchase(bool)", +"8385fa0f": "ESCROW_WALLET()", +"838661eb": "unfreeze_periods()", +"8386927a": "ToSponsor()", +"83876bc9": "newProposalInWei(address,uint256,string,bytes)", +"83879c15": "cooRemoveManager(address)", +"8387aa39": "addChainlinkExternalRequest(address,bytes32)", +"83894548": "getTokenBalanceOf(address)", +"838985d7": "gymFee()", +"8389f353": "setNumCities(uint256)", +"838a05e4": "part20Transfer()", +"838a48d6": "disableBlackListForever()", +"838bdce2": "team3Token()", +"838c29b6": "checkInterval()", +"838c63b7": "avgRate()", +"838ca346": "currentFunds()", +"838d6e05": "getChannelInfo(uint256,address,address)", +"838eb17e": "takeSnapshot(uint256,uint256)", +"838f0602": "SOLEToken(address,uint256)", +"838f5165": "refundFor(address[])", +"838f7f94": "getTotalAmountOf(uint256)", +"839006f2": "rescue(address)", +"8390b02a": "rfindPtr(uint256,uint256,uint256,uint256)", +"83914275": "getUserBonusBalanceByType(address,bytes1)", +"83917229": "_createGameItem(string,address,uint256,uint256)", +"8391a1c4": "get_table_size(uint256)", +"8391e45c": "dividendsOwing(address)", +"8391e48d": "WCoin(uint256,string,uint8,string)", +"83924dea": "MyTestToken(uint256,uint256,string,string)", +"83944a4b": "CreateWTE(address,uint256)", +"83947ea0": "acceptRelayedCall(address,address,bytes,uint256,uint256,uint256,uint256,bytes,uint256)", +"839484a7": "Iou_Token()", +"8394f639": "SimpleExchange(address,uint256)", +"83955bb2": "SpecialPurchased(address,uint256,uint256)", +"8395aa94": "PLATINUM_AMOUNT_SKL()", +"83960e3c": "importTokens(address,uint256,address)", +"8396392d": "add(string,string,string,address)", +"839655c8": "BetOnHardFork()", +"83973dc3": "withdrawBAT()", +"83975e7d": "PapaBearToken()", +"83979803": "setNewRateLevel(uint256,uint256)", +"8397a260": "getAction(bytes,uint256)", +"8397cc94": "tokenFallback(address,uint256,bytes32)", +"8397f3bc": "isBonusPayable(address,string,uint256,uint256,uint256,uint256)", +"839849c0": "changeBaseMultiplier(uint256)", +"83985082": "disarm()", +"83988ef5": "accountNoneFrozenAvailable(address)", +"839930ba": "getMinimumBet()", +"839972f9": "lockToken(address,uint256,uint256)", +"83999223": "release_all()", +"8399f93f": "reservedFund()", +"839a01be": "privateLockedAmount()", +"839acf14": "buyMonument(uint256,uint256)", +"839affc3": "batchDepositTokenTo(address[],address[],uint256[],uint256)", +"839b2386": "ReverseRegistrar()", +"839b240e": "setHardCapCrowdSale(uint256)", +"839b913e": "getTargetReportsPerLimitedReporterMarket()", +"839daf1d": "migrate2(address,uint40,uint40,address,address)", +"839dbbb1": "iconicsCount()", +"839df945": "commitments(bytes32)", +"839ea3c4": "startVotingTeam(uint256)", +"839ff719": "FML()", +"83a076be": "gift(uint256,address)", +"83a07765": "drawTicketCount()", +"83a18678": "total_racers()", +"83a1a3aa": "setC4FContractRequesterLock(address,bool)", +"83a1a4f2": "YesNo(string,string,string,string,string,string,bytes32,address,string,address,uint256)", +"83a1f52a": "GetManifestoByCategory(string,uint256,uint256)", +"83a287dd": "closeGame(bytes,address,uint256,uint256[],bytes,bytes)", +"83a37262": "stopQueueing(uint256)", +"83a41f93": "descentX()", +"83a4f2f5": "whitelistOperators(address)", +"83a51213": "takedaily(address)", +"83a51ad0": "oraclize_setConfig(bytes32)", +"83a6595f": "setMinDonation(uint256)", +"83a68993": "gameOp()", +"83a6ad6b": "grantAccessDeploy(address,address)", +"83a6b565": "payCommission(uint256,uint256)", +"83a74acc": "gift(uint256,uint256)", +"83a7b701": "masternodeRegister()", +"83a9094f": "PRICE_RATE_THIRD()", +"83aa4958": "getContributeAmount()", +"83aa9985": "ownerTwo()", +"83ab12e7": "Auctions()", +"83abd7e2": "removeIdentifier(address,bytes32)", +"83ac44e6": "marketingAccount()", +"83ac4ae1": "_sendWinnings()", +"83ac98fe": "transfer_Different_amounts_of_assets_to_many(address[],uint256[])", +"83ae0839": "ETNToken()", +"83ae5266": "addCertificate(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,string,bytes32[],bytes32[])", +"83ae62c4": "_frozeAmount()", +"83aec57c": "getUsersForDate(uint32)", +"83af3c40": "getRemainingTokenAmount()", +"83b01a83": "updateTAOContentState(bytes32,address,bytes32,uint8,bytes32,bytes32)", +"83b14c0a": "toAddr(uint256)", +"83b23b40": "cEthereumlotteryNet()", +"83b2c476": "updateLibrary(address)", +"83b2d77f": "signFact(bytes16)", +"83b3999a": "addToAddresses(address,address)", +"83b3c85f": "pecul()", +"83b40eb7": "creditEqually(address[],uint256)", +"83b47a4d": "whitelist_addys(address[],bool)", +"83b4918b": "reinvest(uint256)", +"83b49485": "BurnablePayment(bool,address,uint256,uint256,string,string)", +"83b572d1": "getPlayerStake(uint256)", +"83b58323": "setTransferFeePercentage(uint256)", +"83b5ff8b": "ownerCut()", +"83b60a33": "transferToken(uint8,address,uint256)", +"83b665b9": "purchase(uint152,uint256)", +"83b7db63": "getExtensions()", +"83b83c1c": "setOpGas(uint256,uint256)", +"83b8b9f0": "ForceCloseContract()", +"83b8c8f6": "bonusLevel100()", +"83b9e9f7": "train3(uint256)", +"83ba3a97": "sendTeamSupplyToken(address)", +"83baa6f4": "presaleopeningTime()", +"83bd5f42": "distributeDevCut(uint256)", +"83bd72ba": "stopGame()", +"83be9d54": "placeBet(bytes32,address)", +"83bebcc2": "changeSellPriceForAthlete(uint256,uint256)", +"83bebced": "_rate()", +"83bf1cbc": "delayDefaultRelease()", +"83bf4609": "createTemplate(string)", +"83c08784": "Incrementer3()", +"83c0dd25": "LogNewAllocation(address,uint256)", +"83c10844": "percentLeftFromTotalRaised()", +"83c17c55": "setFactoryAddress(address)", +"83c1f2e6": "unlb()", +"83c218c2": "oraclizeId2proposalId(bytes32)", +"83c28ddc": "getRefundAmountForFunder(address)", +"83c28ecc": "getTokenWithdrawHold()", +"83c3bd6b": "isEqualLength(address[],uint256[])", +"83c4c2e9": "makeSuccessor(address)", +"83c4cc46": "StartCrowdsale(address,address,uint256)", +"83c51a38": "thesimplegame()", +"83c56fc8": "dailyTotals()", +"83c592cf": "stake(uint256,bytes32)", +"83c5e3c9": "removeBRA(address)", +"83c68f48": "AIChain()", +"83c6aa47": "arrangeUnsoldTokens(address,uint256)", +"83c75ed5": "setGatewayB(address)", +"83c7d7c1": "sumMultiplayer()", +"83c7f14c": "bytesToBytes4(bytes)", +"83c81bec": "Arbiter(address)", +"83c99722": "lockforTransfer()", +"83ca8632": "_getCrabPartData(uint256)", +"83cb2fee": "INITIAL_SEED_FARMING_AMOUNT()", +"83ccc2b5": "_0xBitcoinCash()", +"83ccc8b8": "getEtherContributed()", +"83ccdcc3": "detailsOfWindow()", +"83cd5e13": "debug_multiplehash(uint256,uint256)", +"83cd9cc3": "setDelegator(address)", +"83cdb517": "transfer_to_0(uint256)", +"83ce63b5": "doRouletteBet(bytes,uint256,bytes32,bytes32,bytes32)", +"83ce8a61": "changeMPO(address)", +"83cfab42": "unFreeze(address)", +"83cfbd7f": "revokeOwnership(address)", +"83cfc5f2": "changeNameRestricted(string)", +"83d158f0": "ShadowToken()", +"83d2421b": "setWorkerPort(uint256)", +"83d4f946": "round0EndTime()", +"83d51a38": "concatString(string)", +"83d52f36": "OpenAIChainToken()", +"83d53895": "interfaceSupported(address,bytes4)", +"83d6236c": "amIin()", +"83d66353": "LotteryGames()", +"83d67039": "Register(string,string,string,uint256,uint256)", +"83d67fc1": "_addAddressToGrantAccess(address,uint256)", +"83d7529f": "reservationFromBackend(uint256,bytes32,address,uint256,uint256)", +"83d852d9": "shutdownTransactions()", +"83d880d0": "setParticipationCap(address[],uint256)", +"83d8a90f": "theDonkeyKing()", +"83d8bae3": "listItem(uint256,uint256,uint256,address)", +"83d8e480": "registerCoin(address,string,string)", +"83da4d86": "ApolloCoinToken(uint256,uint256,address,address)", +"83db0680": "TOTALSHARES()", +"83db1548": "addPost(uint256,uint256)", +"83db8e31": "HMCToken()", +"83dbb27b": "invalidOrder(address)", +"83dbc55b": "verifyXOR(bytes32,bytes32,uint8)", +"83dbff4b": "get_first_item_in_state(bytes32)", +"83dc077d": "acceptContribution()", +"83dcecd3": "CompanyTokensIssued(address,uint256,uint256)", +"83dd7aa4": "setBankName(bytes32)", +"83de6ed6": "changeStageTwo()", +"83dea2a8": "renounceExcluded()", +"83df762f": "BDayToken()", +"83df7d21": "updFreezeEnabled(bool)", +"83dfd040": "isPresaleFull()", +"83dfe5fd": "C()", +"83e03c3d": "HumanERC223Token(uint256,string,uint8,string)", +"83e06ead": "setPercentages(uint256,uint256,uint256,uint256,uint256)", +"83e07382": "setMovePermissionStat(bool)", +"83e19248": "afterStart()", +"83e19a95": "MANAGEMENT_LOCKED_PERIOD()", +"83e1bb4f": "dequeueIngot()", +"83e219eb": "removeFromTotalSupply(uint256)", +"83e256dc": "gameIdGame(uint256)", +"83e2a0c4": "joinGame(address,uint256,address)", +"83e3607c": "fourthBonusSalesEnds()", +"83e48d43": "_sptc(uint256,uint256,uint256,uint256,address)", +"83e49c53": "burnWithData(address,uint256,bytes)", +"83e4eed0": "apply(string,string)", +"83e5cb26": "ownerAddCeo(address)", +"83e78b31": "bet(uint8,bool,uint8)", +"83e7f347": "ICOBank()", +"83e811a6": "founderLockup()", +"83e83b54": "payBounty()", +"83e8dbb8": "calculateSaleAmount(uint256,uint256)", +"83e99a93": "balanceOfUnclaimedTT(address)", +"83ea0620": "packageExists(string)", +"83ea5111": "MESH(uint256)", +"83eb7257": "companySupply()", +"83eb72ac": "getStrandDescription(uint256)", +"83ec0648": "BlockStackCoin()", +"83ec0bd2": "showPeopleInQueue()", +"83eca581": "setReferrerReward(uint256)", +"83edf023": "totalWeiRecieved()", +"83eed3d5": "queryN(uint256,string,bytes)", +"83eeecc0": "ethInWei()", +"83ef0c23": "buyEgg(uint256,uint256,bool)", +"83f0b184": "calculateMaxContribution()", +"83f0bb45": "_getPartSkillLevel(bytes,uint256,uint256)", +"83f11daf": "SetCandidatePrincipal(uint8,uint256)", +"83f1211b": "transfersLocked()", +"83f12f91": "grantFounderTokens(address)", +"83f12fec": "batchTransfer(address[],uint256)", +"83f13e7f": "setNewDividendContract(address)", +"83f2a8ca": "dividendsCalculated()", +"83f3c3df": "PaymentGot(bool)", +"83f4a27b": "TATCOIN(uint256,string,string,uint256)", +"83f537cc": "LendingBlockToken(address)", +"83f57fd7": "_addDemoc(bytes32,address)", +"83f5a47e": "tokenOfOwnerAndCreatorByIndex(address,address,uint256)", +"83f5b46f": "refSystem()", +"83f5e360": "_unpackClassValue(uint256)", +"83f66212": "getTop11_20Messages()", +"83f6cc69": "transferAllowedOf(address)", +"83f6d9a4": "validateNameInternal(string)", +"83f7a095": "setCoefficient(bytes2,string,uint256)", +"83f7b8e1": "getNumberOfPhotos()", +"83f7e2d7": "reduce(uint256)", +"83f94db7": "upgradeImplementation(address)", +"83f95f13": "openClaim(string)", +"83f9a788": "BlockTubePrepaid(address)", +"83fa07fd": "fechAllCandidates(uint256)", +"83fa2039": "Dealer(address,address)", +"83fa7e02": "isSiringClockAuctionStorage()", +"83fa87f2": "activateAdSlot()", +"83fae425": "setPresaleAllocation(address,uint256)", +"83fb42ba": "proposeBurning(uint256)", +"83fbbc7a": "OnlineSocialChainToken(uint256,string,uint8,string)", +"83fbc2b4": "weiRised()", +"83fc58b4": "tranferOwnership(address)", +"83fcafbb": "GetPrizeFund()", +"83fcb85e": "revertFunction()", +"83fcf308": "getPropertyRating()", +"83fcf973": "unlockVestedTokens()", +"83fcfafe": "LooqCrowdsale()", +"83fd65d8": "setETHExpectedFee(address,uint256,uint256)", +"83fd8a64": "CBCK(uint256,string,string)", +"83fe05f1": "PutFreeEther()", +"83fe10e4": "isMetered()", +"83fee16d": "finalizeUpdate(uint256,address)", +"83ff0189": "buy_tickey_free()", +"83ff1bb6": "approve(string,uint8)", +"83ff5bf2": "Bittobit()", +"83ff9bec": "petCardDataContract()", +"8400c307": "isRecipientAllowed(address)", +"8401824f": "compactFraction(uint256,uint256,uint256)", +"84019cae": "WOWToken()", +"8401e614": "lengthOfPermissions()", +"8401f8d1": "addMultipleToWhitelist(address[])", +"8402181f": "pull(address,uint128)", +"8402ac99": "firstYearEnd()", +"84035e07": "amendEarlyPurchase(uint256,address,uint256,uint256)", +"8403be91": "isAppRegistered(address)", +"84048497": "listMultipleItems(uint256[],uint256[],address,bytes32[])", +"84054d3d": "cashout()", +"8406ab82": "deleteGame(address)", +"8406c079": "relayer()", +"84073164": "transferFromPie(uint256)", +"84083c89": "addWhitelistUser(address)", +"84086357": "crowdfundFinalized()", +"8408643a": "getBlockTimestamp32()", +"840880f2": "TeamLockingPeriod18Months()", +"8408cb9d": "setPreICOPrice(uint256)", +"840aab14": "_hasName(address)", +"840b7403": "computePayout(uint256,uint256)", +"840bc19c": "NON_PAYABLE_AMOUNT()", +"840c0ca9": "setMaximumClaimPriceWei(uint256)", +"840c401f": "pruneRestrictStock(address,uint256)", +"840cfffd": "burnIndexedByAddress(address,uint256)", +"840d7fb6": "createLottery(address,string,string,uint32,uint32,uint8)", +"840dea74": "COMBINED_WEI_GOAL()", +"840e2673": "startTransferTime()", +"840e78fd": "projects(address)", +"840eb43e": "removeLicenseTerms(bytes32,bytes32)", +"84100d5c": "selectRandomTrait()", +"841016d0": "setAdditionalOwners(address[])", +"8410956a": "initialise(address,uint256,uint256,uint256,uint256,uint256)", +"84109e50": "setTiimKyberGoAddress(address)", +"84120645": "setMasterRewardsPercent(uint256)", +"841237b7": "Wallet9()", +"841244a8": "FeedCreated(uint256,string)", +"84125e0b": "withdrawBalancesToNFC()", +"84126e01": "cancelPayment(string)", +"841302ce": "getHash1(uint8[5],uint8,bytes32)", +"84132cf5": "deposit(address,uint8,bytes32,bytes32)", +"84140c40": "delFromVestMap(address)", +"841410cd": "maxETHContribution()", +"84160ec0": "getAddressesAccounts()", +"84168c01": "tradesUnlock(address)", +"8417fa2f": "goPublic()", +"8418cd99": "contribute(address,uint256)", +"8418dc36": "teFoodsAddress()", +"84191f62": "changeController()", +"8419604e": "SendingBounty(bytes32,uint256,address)", +"8419c986": "foundTime()", +"841a12bd": "setKittyTokenAddress(address,address)", +"841b4cd8": "registerForRaffle3()", +"841baf2c": "m_tokensClaimed(address)", +"841d0ac3": "init_daylimit(uint256)", +"841e6ce9": "betFee()", +"841eb7f8": "paymentRewardTokens(uint256)", +"841efac4": "updateFieldss(uint256,uint8,uint256)", +"841f3729": "howManyTokensAreReservedForMe()", +"84219204": "minVotedTokensPerc()", +"8421ec8a": "MyCash()", +"842249cb": "weiTotalReceived()", +"8422927d": "cancelPayment(uint256)", +"8422b3bf": "RailzToken()", +"8423157b": "getWinAmount(uint256,uint256)", +"84248a51": "changeDrawFee(uint256)", +"84249ed0": "manualBuyPrice(uint256)", +"8424b40d": "setLotteryCore(address)", +"8424f952": "IMEIM()", +"84268051": "payoutToOwnerIsLimited()", +"84269ed9": "transferFrom(address,address,uint32)", +"8426a452": "getSellingItem(uint256)", +"84270db0": "selfdestructTokens()", +"84281dcc": "isBalanceSufficientForContractCreation(address)", +"8428cf83": "recoverAddress(bytes32,uint8,bytes32,bytes32)", +"84297029": "getIdxBatchByUsername(bytes20[])", +"84298882": "setLogo(uint256,string)", +"842a6415": "DTRC()", +"842acf9d": "mintDSBIToken(address,uint256)", +"842b6357": "checked_in()", +"842b8efa": "FailedMarking(bytes32,bytes32,uint256,int256)", +"842bc37b": "GetSmallCotractIndex(address)", +"842bd2db": "getDeduction(uint256,uint8,address)", +"842bfad2": "updateParticipantCapTier2(uint256)", +"842c17be": "firstStageMinted()", +"842c45c5": "ROBIES()", +"842e062f": "p_setCurrentRoundJackpotPercent(uint256,uint256)", +"842f10d1": "dropMultiple(address[])", +"842ff2bd": "numPolls()", +"84300859": "setTokenUnlock()", +"84304ee5": "chronus()", +"84311353": "totalAmountOfPurchasesInCny()", +"84313086": "divCutMaster()", +"84317008": "setprice(uint256,uint256)", +"84317143": "INITIAL_EARLYBIRD_TOKENS()", +"84321b41": "ligerAdminAddress()", +"843296d6": "DealCancelationReason(uint256,address,uint32,uint32,uint256,string)", +"8433acd1": "collectTokens()", +"8433d6f2": "from_Initialisation_to_cycleDeVie()", +"84344415": "chargeMoney()", +"84345b35": "createRandomZombie_ZOB_goldpack()", +"8434c80d": "cleanArray(uint256[])", +"843545be": "getPrinciple(uint256)", +"843584f1": "log_recast_fees(address,address,uint256)", +"8435be4b": "getLastFarm(uint8,uint8)", +"8435da61": "getTile(uint16,uint16,uint8)", +"8435f147": "bytes32Func(bytes32,bytes32)", +"8436bd4e": "MintyMcCringleToken()", +"84370813": "subscribe(uint256,uint256)", +"8437b2a5": "tier(uint256,uint256)", +"84385c6f": "assignOperator(address)", +"84386004": "channelsSold()", +"84394e6f": "addValidation()", +"8439ec4a": "setBlacklistBulk(address[],bool,bool)", +"8439f80d": "accumulatedBalanceOf(uint256)", +"843a7f74": "getCKNPriceNow()", +"843aa0db": "insert(uint256,uint256,uint256,uint256)", +"843ad7b5": "dailyMintable()", +"843b1a09": "spendNonce()", +"843b4386": "addComment(string)", +"843bd641": "itemExists(uint256)", +"843cbae4": "EtherBattleCoin()", +"843cfb9e": "vestingTotalPeriods()", +"843e240e": "getAuditContractUri(uint256)", +"843e8d27": "downVote(bytes12,bytes12)", +"843fcf90": "EOSGold()", +"843ff6f6": "getTitulaire_Compte_7()", +"8440b3b0": "BUY_INCREASE()", +"8440d167": "getCategory(address)", +"84413b65": "airdropAddress()", +"8441f89e": "deleteWitness(address)", +"8442171d": "bonusLimit2()", +"84429480": "TokensBought(address,uint256,uint256)", +"84429579": "getRunningTokenPairs(address[])", +"844323fa": "xtime()", +"8443f07c": "UVIDIFYTOKEN()", +"8444b391": "getUpgradeState()", +"84465fa5": "changeFeeOwner(address)", +"844669b3": "accountC()", +"844706a6": "UsdCapUpdated(uint256,uint256)", +"84477036": "tempTokensBalanceOf()", +"8447c02f": "takeAGuess(uint256)", +"8447c4fa": "LibraToken()", +"84488126": "isForceExecute(address)", +"844891a0": "ABTCETHER()", +"8449129e": "EthereumNova()", +"8449133b": "initQuoteBalance()", +"84491566": "getPrevRoundWinnerCount()", +"8449b0af": "PRICE_MULTIPLIER_ICO5()", +"8449d772": "withdrawM5()", +"844bdea4": "LhsToken(uint256,string,uint8,string)", +"844c3edc": "setThresholdSendToSafeWallet(uint256)", +"844c4264": "cycleEndTime()", +"844c7d95": "updateBalances(address,bytes32,string,address,uint256)", +"844d38ee": "view_get_Gains()", +"844d65c5": "whitelistedMax(address)", +"844dbf67": "RecurringPayment(address,uint256,uint256,address)", +"844e774d": "joinraffle()", +"844e89a9": "Unregistered(bytes32,uint256)", +"844ea6f9": "E25()", +"844ef097": "bridgeValidatorsOwner()", +"845051d3": "testContractsNotNull()", +"8450b12e": "getSupplyLimit(uint16)", +"8451738d": "rentHo(uint256)", +"8451d312": "showAllFunds()", +"845238fe": "lookup(address[],address,address,bool,bool)", +"84533794": "setEthRate(uint16)", +"845381c0": "FailedVote(address,string)", +"84539789": "useNeonMarbles(address)", +"8453a8c8": "Factom()", +"84545ef8": "setRegionPurchasedPixelPrice(uint256,uint256)", +"8454665d": "startingInsuranceBalance()", +"84553e16": "AccessAddress(address)", +"84564676": "tokenSetAdmin(address,address,address,address)", +"8456cb59": "pause()", +"84570d0d": "assertEq5(bytes5,bytes5)", +"84571235": "minimum_bet()", +"84585099": "TransferTo(address,uint256)", +"8458644c": "play(bytes32,address,address)", +"845890c3": "buyATR()", +"8458bd70": "getHp(uint256)", +"8459857f": "mentors()", +"845a51ec": "rewardPoolAddress()", +"845a7468": "getStakersAndAmounts()", +"845ab425": "getProjectDescription(uint256)", +"845b6aca": "buyBasicCards_Migrate(address,uint256,uint256)", +"845c8801": "checkHasPermissionForPack(address,address,uint256)", +"845c9306": "participate(uint256)", +"845d586f": "publicTransfersEnabled()", +"845dcc2b": "_isSoldOut()", +"845e76b3": "getStudentArray(bytes32)", +"845eaedb": "SmartVows(string,address,address,string,address,address,string,string,string,string,string,bytes,bytes)", +"845ec8de": "FOUNDER_EXCHANGE_SHARE()", +"845f5593": "initStages(uint32[],uint32[],uint128[],uint128[],uint128[],bool[])", +"846030a0": "hasClaimableShares()", +"84605d0d": "total_iou_withdrawn()", +"8460a9d9": "suicideSend(address)", +"84610618": "registerRequest(int256,int256)", +"846153b5": "registerAddresses(address[])", +"8462151c": "tokensOfOwner(address)", +"84622425": "onlyPrimaryMock()", +"8462df7f": "diff(uint256[],uint256)", +"8463bcf5": "countClients()", +"84644ec9": "addPromise(uint256)", +"8464878d": "emergency_used()", +"84653605": "DateCoin(uint256)", +"84658e2a": "sendtoken(address,uint256,address,uint256,address,uint256,address,uint256,address,uint256,address,uint256)", +"846639dc": "currentAwards()", +"8466c3e6": "aa()", +"846786f1": "openIco()", +"8467d9cf": "refundPayment(uint256,uint32,uint32,uint256,string)", +"8467f7cb": "resetContract(uint256)", +"84680fc2": "autoSelectOpponentForGladiatorBattle(uint256,bytes32)", +"84682fbb": "auxWorstPoints()", +"84691cd8": "grapesToProduceBottle()", +"84696810": "winningCountry()", +"846a09e1": "AddAuthorityAddress(address)", +"846a284e": "_addTicket(address,uint32,uint8)", +"846a5dde": "delayPayment(uint256,uint256)", +"846b055a": "startCrowdfund(uint256,uint256)", +"846b0ef0": "proxiedContribution(address)", +"846b23d4": "getEmployerInvoicesByStatus(address,address,uint8)", +"846b68e3": "MERCULET()", +"846e5851": "LogStudentUncertified(address,uint256,address)", +"846e832d": "getStateAt(uint256)", +"846e980d": "setFreeLobster(uint16)", +"846f1185": "sendEthProportion(address,bytes,uint256,uint256)", +"846f652b": "getSpawned(uint32)", +"8470ffd6": "_transfert(address,address,uint256)", +"84716854": "investInCharger(uint256)", +"84734476": "copyBytes(bytes,uint256,uint256,bytes,uint256)", +"8473e55f": "amountForSale()", +"8475bfed": "div18(uint256,uint256)", +"8475f6f9": "getPublicKeyG()", +"8476f105": "Menu08(uint256)", +"847760ee": "getArtToken(uint256)", +"847778ad": "edit(address,address)", +"84780009": "getFinishStatus()", +"84788f01": "mvnperethBonus()", +"847927ed": "icoEtherMaxCap()", +"847a1ca6": "raiseSellOrderCreated(address,uint32,uint32,uint80,uint256,int160)", +"847a5e99": "getPlayerStats()", +"847af92c": "setMintMode(uint256)", +"847bd61c": "processPurchase(uint256[])", +"847c096d": "removePresaleContributor(address)", +"847d97ab": "add(string,address,string,uint256)", +"847dc0a7": "percentageETHReserve()", +"847dc59e": "MicoinToken(uint256,string,string)", +"847dd67c": "buyEth(uint256)", +"847e09f2": "TOKEN_HARDCAP()", +"847e12c4": "FixyNetwork()", +"847e27d9": "wanToken()", +"847e2ba1": "revokeAccessMint(address)", +"847ec2de": "totalBunny()", +"847eefb6": "ICOHardcap()", +"847f2177": "Electron()", +"847f4a88": "stopSaleType(uint8)", +"847f8a10": "Refund(uint32)", +"8480021c": "crowdfundDeadline()", +"8480544e": "getCAOAmount()", +"848125ea": "issueBlockReward()", +"8481573e": "contractBalanceOf(address)", +"8482167e": "makeCall(address,uint256,bytes)", +"84837981": "BTCT()", +"8483dfcc": "isOverflow(uint256,uint256)", +"84841523": "Buttcoin()", +"8484dc24": "removeEmissionProvider(address,uint256)", +"8484ff59": "setTokenCollectable(bool)", +"8485b90c": "proposalAuthor()", +"84861e93": "auctionState(uint256)", +"84869679": "isDistributionDue(address)", +"8486d444": "_getUsdAmount(uint256)", +"848784e5": "transferPreSigned(bytes,address,uint256,uint256,uint256,uint256)", +"8487b73a": "Milestone_BankLicenseFailed(string)", +"84883795": "ico_rejected()", +"84885ed6": "getData_19()", +"8488e58a": "setReturnableToken(address)", +"848a0327": "dividendForYearly()", +"848a2130": "releaseChecksum(uint8)", +"848b3821": "fundingCapReached()", +"848b86e3": "updateWallet(address)", +"848c0a39": "buildLeft(address,uint256)", +"848dd14e": "CostStuff(address,uint32,uint256)", +"848e3442": "automaticThreshold()", +"848efb3d": "rentOut(uint256)", +"848f002f": "setBoolF1F2(bool,bool)", +"848f1470": "disableRefundPeriod()", +"848f6d8d": "OneBroGlobal()", +"848faed7": "BAI20()", +"84900b04": "whitelistContract()", +"8490d598": "wholeTokensReserved()", +"8491b49c": "rain(address[],uint256[])", +"84922374": "isDistConfig()", +"84924b60": "findAndPayTheWinner()", +"849292bc": "emitStateContractChanged(address)", +"8492aa9c": "getAddressNickname(address)", +"8493407b": "CorporateNews(uint256,string,uint8,string)", +"84934e40": "DappUpgraded(address,address,address)", +"8493a06e": "returnLongTokenAmount(address[3],bytes32,uint256)", +"84941984": "_removeTokenFromPartition(address,bytes32,uint256)", +"8497a8d8": "ESCToken()", +"84987faa": "getNodeRightChild(bytes32)", +"8498f706": "EthPalace()", +"84995370": "TheFoolRareToken()", +"8499bc63": "GeneBlockChainUserIDs(address)", +"8499ee3a": "newToken(string,uint8,string)", +"849a7337": "approveBountyTransfer(address,address)", +"849a7cb7": "convertBytes4ToArray(bytes4)", +"849aaf8e": "minimumValue()", +"849ab974": "HasOwner(address)", +"849ae5ea": "isBlockpassInvestor(address)", +"849bb2db": "withdrawServiceFee()", +"849cf588": "addSynth(address)", +"849d0d24": "TVCrowdsaleContract()", +"849d16d2": "BffDoomToken()", +"849d926b": "parseBlockHeader(bytes)", +"849e3dcd": "SangusToken()", +"849e6b17": "MakeBuyOrder(bytes32,address,uint256,uint256,address)", +"849e961a": "ICO_PRE_SALE()", +"849f94bf": "getMatchIndex(uint8)", +"84a014d8": "oneTimeSold(address)", +"84a0f604": "transferMultipleDifferentValues(uint256[],address[])", +"84a11df9": "ismaster()", +"84a1f5a5": "claimTokensFor(address[])", +"84a2f00b": "order(bytes32,uint256,uint256)", +"84a2f5a4": "MoonDust()", +"84a34caa": "BaseMPHToken()", +"84a37273": "addTransaction(address,uint256)", +"84a429a0": "createDklSiringAuction(uint256,uint256)", +"84a438de": "Course(string,string,uint256)", +"84a4974c": "MintAndTransferEXH(address,uint256,bytes32)", +"84a6469a": "setNewMintRequest(address,uint256)", +"84a64c12": "cancel1(uint256)", +"84a68690": "withdrawRequest(uint256,uint256,uint256,uint256)", +"84a6a68a": "releaseTeams(uint32,uint32[])", +"84a7b223": "Canary(address)", +"84a80c6b": "getB0()", +"84a83662": "changePassword(string,string)", +"84a97ab7": "removeAddressFromAccount(address,address)", +"84a9b91c": "capWEI()", +"84a9d711": "assertThrows(string)", +"84ab2cdb": "byte_to_bits(bytes1,uint256)", +"84ac33ec": "deregister(address)", +"84acdae7": "getAuctionStartBid()", +"84ad6ff3": "ReversibleDemo()", +"84ad8e8f": "discountPrice()", +"84aeb4f0": "getTokenContribution(address)", +"84afaa7c": "getReceiptAmount(uint256)", +"84afb526": "marketor()", +"84afd121": "bytesToUint2(bytes)", +"84b00eb6": "fetchVoteNumForCandidateByIndex(uint256,address)", +"84b06191": "CampaignAccount(address,uint256)", +"84b08d41": "partner2_signed()", +"84b0e001": "setEventResult(string,uint32,uint8)", +"84b1fcb6": "TokenOwnedFund()", +"84b2e59d": "lower(string)", +"84b35fbb": "proposeFoundationTransfer(address)", +"84b366dc": "dest()", +"84b3b232": "depositofferToken()", +"84b4340b": "failWithReason(string)", +"84b46829": "San4Contract()", +"84b4d3f6": "determineGoalScoringCardIds(uint256[],uint256[],uint256)", +"84b60937": "getRollUnder(uint256,uint256)", +"84b735c2": "address1a()", +"84b76824": "cancelWithdraw()", +"84b7964f": "isClient(address)", +"84b79b3d": "eosBASE(uint256,uint256)", +"84b83a96": "finishChampionGame()", +"84b8d6a5": "Airdrop(address)", +"84b98987": "getPrice(address,string,string,string)", +"84b9a4a5": "SALE_STEP()", +"84ba2642": "mint(address,uint256,address,string)", +"84ba745e": "totalClass()", +"84bc8d2e": "read_purchase_at_index(uint256)", +"84bcd93e": "setSealableProperty(uint256,bytes32,bytes32)", +"84bcefd4": "collected()", +"84bd3a28": "TierRainmakerDividendAddress(address)", +"84bdaf85": "centsInPhaseOne()", +"84be4079": "Lendr(string,string,address)", +"84be414d": "KryptopyCrowdsaleMock(address)", +"84be59d1": "giftPool()", +"84beac36": "KRCToken(address)", +"84bf6fac": "mEtherValid()", +"84c019e3": "noBonusTokenRecipients()", +"84c14b25": "sellDentacoinsAgainstEther(uint256)", +"84c2473f": "mainIcoEndBlock()", +"84c344fe": "_register(bytes4,string)", +"84c3edf9": "getHoldAmountAccounts()", +"84c4ee9e": "getHivePot()", +"84c5c34d": "transferFromToICAPWithReference(address,string,uint256,string)", +"84c615e2": "giveKingdom(address,string,string,uint256)", +"84c64a19": "setApp(address,address)", +"84c6774c": "safeMathMul(uint256,uint256)", +"84c6a9fe": "setFABAcompanyTokensPercent(uint256)", +"84c6f650": "PAYOUT_TIME()", +"84c7bf4c": "setBlocking(address,address,bool)", +"84c830d3": "getDepositByIndex(address,uint256)", +"84c8d5fa": "xenograft(uint256,uint256,uint256)", +"84c8df88": "testMemoryIntegrityCheck31Bytes()", +"84c99b6d": "tokenIssuedAirDrop()", +"84ca65e0": "addOperationType(string,string)", +"84cb4fec": "_getBlocksPerYear(uint256)", +"84cba6da": "registerUsers(address[],uint256[])", +"84cbc92f": "buyPotato(uint256)", +"84cc315b": "getCurrentPrice(address)", +"84cdbb4b": "relaseLock()", +"84ce8f1e": "getTotalF3()", +"84cfa08c": "startKilling()", +"84cfc5aa": "WABnetwork(uint256,string,string)", +"84cfca00": "setMaxPlayers(uint8)", +"84d062b4": "updateEthToTokenOrder(uint32,uint128,uint128)", +"84d0aad8": "loadOldData()", +"84d24226": "claimableTokens(address)", +"84d2688c": "getDarknodePublicKey(address)", +"84d2731c": "namesOf(address)", +"84d43f66": "setAffiliateSetter(address)", +"84d452ff": "resetRound()", +"84d46860": "getMyStageBet(uint256,uint256,uint256)", +"84d47dee": "DayDayCrowdsale(uint256,address,address)", +"84d4c178": "_escrowInflationBonus(bytes32,uint256,uint256,address,address,bool)", +"84d5d944": "transferAndLock(address,uint256,uint256)", +"84d60043": "CioCoinERC20180629Token(uint256,string,string,uint256)", +"84d61a32": "showFPInterest()", +"84d62f47": "bindSmartIdentityByRegulator(string,string,string)", +"84d6bd43": "requiredEvidence()", +"84d7c99d": "deleteUInt8Value(bytes32)", +"84d7ea12": "setMilestonesContractAddress(address)", +"84d80057": "hasDeadlinePassed(bytes32)", +"84d83f07": "GetLoanIdFromPortfolio(uint256,uint256)", +"84d8529f": "refundInternal(bytes32,address,address,uint256)", +"84d9390a": "TEAM_PERCENTAGE()", +"84d9bee2": "bidCC(uint256,bytes32)", +"84da7e38": "setColorRed()", +"84da92a7": "updateName(string)", +"84dac46e": "Fucksign()", +"84db71a3": "getRefereeRewards()", +"84db8d1e": "_nextPotTax(uint256)", +"84dc1028": "getBonustwo(uint256)", +"84dc2b10": "_saveData(address,bytes32,address,bytes32,uint256)", +"84dcde97": "removeSynth(bytes4)", +"84dd4332": "lastCallPUST()", +"84dd9591": "getTotalHoldAmount(address)", +"84df87c3": "SPITEST()", +"84dfb2bd": "setETHAddress(address)", +"84dfbfe2": "setLpFee(uint256)", +"84e0b689": "_yearThreeSupply()", +"84e10a90": "getTotals()", +"84e11251": "setMinInvestmentLimit(uint256)", +"84e192a7": "getArbiterCandidates()", +"84e1bf74": "emissionOn()", +"84e2341d": "internalSetDestinationMultisigWallet(address)", +"84e2d578": "OperationAddress()", +"84e336fc": "ANUNYA()", +"84e37ad9": "prefixedHash(uint256)", +"84e3ac94": "oneTokenInWei()", +"84e45689": "authorize(address[])", +"84e4c52b": "getTimeLockSecondsRemaining(uint256)", +"84e4d3a8": "freezeAccount(address,bool,uint256,uint256)", +"84e4d57f": "ApplyForCertification(string,string,string,uint256)", +"84e527ad": "IMDESale(uint256,uint128,uint256,uint256,uint128,string)", +"84e60e8b": "ico_promo_reward(address,uint256)", +"84e64a1f": "stageStartDate(uint8)", +"84e67523": "getSumAmountOfOpenSteps()", +"84e6ee4b": "setMainnetAccount(string)", +"84e70093": "cloneOrder(address,uint256,uint256,uint256)", +"84e700ee": "totalAllocatedPurchase()", +"84e7686b": "setAdmin(address[],bool)", +"84e77095": "GetEvidence(bytes32)", +"84e77da2": "updateKryptoroToken(address)", +"84e79842": "addAgent(address)", +"84e7e3d3": "MINT_INTERVAL()", +"84e83ee2": "SparksterToken()", +"84e84506": "onContribution(address,uint256,uint256,uint256)", +"84e85974": "YGO()", +"84e8a7df": "_soldOutside()", +"84e8b36e": "GetAskingTokenDecimal()", +"84e8bff9": "burnaftersale(uint256)", +"84e9ec37": "bonusTokenRateLevelFour()", +"84ea2e31": "GetDOTNumRevokableHashes(bytes32)", +"84eb11ce": "DoggyToken()", +"84eba00c": "tokenholder()", +"84ebd065": "NunesTestCoin()", +"84ebde52": "Under_the_Hood()", +"84ec480c": "marketToken2020()", +"84ecdaf6": "advanceState()", +"84ececf2": "userCreateSaleIfApproved(uint256,uint256,uint256,uint256)", +"84ed49a7": "isPoweruser(address)", +"84ef0778": "tokensIssuedTotal()", +"84efe4d6": "backSkinCoinOwner()", +"84eff1d0": "walunlock()", +"84f06570": "createAllTokens()", +"84f08cd9": "TokenContract(address)", +"84f0bb96": "NMRToken()", +"84f10c35": "testTransferCreator()", +"84f19f37": "createVoting(bytes32)", +"84f1b0b8": "__flooredLog10__(uint256)", +"84f1bd4e": "fpart(int128)", +"84f1cdb7": "intFunc(int256,int256)", +"84f32395": "setAssetToExpire(uint256)", +"84f3597b": "availableRefunds()", +"84f54874": "startWeekThree()", +"84f85951": "founderWithdraw()", +"84f88cbf": "TonToken()", +"84f94221": "getRoot(bytes32)", +"84f9c928": "get_signature_block(address,address,bytes32)", +"84fa2c97": "totalCentsCollected()", +"84fae760": "hello(address)", +"84fb24a5": "_addCourse(uint256,string,uint16,uint16,string,string)", +"84fb427c": "_transferHolder(address,bool,uint256)", +"84fc8050": "nugget(uint256)", +"84fd176b": "bonusPhaseTwoDeadline()", +"84fd5477": "isAuthorizedAccount(address)", +"84fd7ef0": "TOKEN_FOUNDATION_CAP()", +"84fdab0d": "pickConsolationPrize(uint256[])", +"84fde1c6": "calculateScorersForTeamIds(uint256,uint256)", +"84fdec83": "ownerCanWithdraw()", +"84fe5029": "weiCap()", +"84feab93": "Emit_OffchainPaymentFlag(address,address,bool,bool)", +"84feed25": "VoxelX()", +"84ff2e45": "coreTeamTokenSupply()", +"84ff435f": "UpdateUserNickName(address,bytes32)", +"84ffc422": "BountiesTokensHolder(address,address,address)", +"84ffcb5d": "setContractsMiniGame(address)", +"85000a86": "TitleUpdated(uint256,uint256,string,string,string,uint256)", +"85002354": "ZillowBlockchain(uint256,uint256)", +"85003d30": "CollateralTransferCanceled(uint256)", +"85007e54": "Zakat()", +"8500d919": "getBorrower(uint256)", +"85011eec": "Movie(string,string,uint256)", +"8502293b": "newCs(address)", +"85025396": "setProviderClientsCount(uint256,uint256)", +"8502935a": "maxInflationRate()", +"850382c8": "prova3(uint256[])", +"8503a6bf": "ERC721TokenMock()", +"8503b6a5": "addProposal(address,uint256,address,string,uint256)", +"850595c1": "contributorID(uint256,address)", +"8505a074": "ClassyCoin()", +"85071d9c": "SCARABToken1()", +"8507bee8": "joinedCrowdsalesLenMax()", +"850895dc": "CheckValidDate(uint8,uint8,uint16)", +"8508a693": "doTeamMinting()", +"8508d88f": "sendICOSupplyToken(address,uint256)", +"85093668": "jackpotBank()", +"8509a001": "rewardDenominator()", +"850a1532": "voteSnapshotBalance(address,uint256)", +"850a2e78": "setResults(address,uint256,uint256[2])", +"850a4621": "emitActiveChanged(bool)", +"850a7eca": "endTimeLockedTokensAdvisor()", +"850c1a0c": "earlyResolveA()", +"850c362a": "initCard1()", +"850d8a14": "CryptolottoToken()", +"850d9afb": "ENDTIME()", +"850db35d": "didPayInterest(bytes32,address,address,address,uint256,bool,uint256)", +"850e141a": "updateYearsSinceRelease()", +"850e2bc4": "setLLV_edit_22(string)", +"850e3760": "getShine(uint16)", +"850e47db": "KudoCoin()", +"850f2e2c": "findTileByAddress(uint16,uint16,address,address)", +"850fb62d": "transferProcess(address,address,uint256)", +"85107367": "stakeAddress()", +"8510b43f": "isSaleRunning()", +"85113156": "etherERC20()", +"8511b843": "addSpaceshipMoney(uint256,uint256,uint256)", +"85138313": "PureAirToken(uint256,string,uint8,string)", +"8513c619": "addManager(address,address)", +"8513db86": "test_threeValidAndInvalidEqAddress()", +"851545de": "transformAgent()", +"8515e413": "payUserOutgoingTransactionCommission()", +"851645e6": "getRandomUint(uint256)", +"85174a31": "transferToSelf(uint256,bytes)", +"85177f28": "EthReceived(address,uint256)", +"8518b0ad": "scheme()", +"851a33e9": "getBylawsMilestoneMinPostponing()", +"851a61d7": "Dist(address,uint256,address)", +"851ad4d6": "getNumDragons()", +"851aea7a": "setUser(string,string,string,bytes32)", +"851b6ef2": "getAllVotes()", +"851bb3c3": "bonusEnds15()", +"851c0cf6": "bltMaster()", +"851c27de": "earlyStageSetting()", +"851c4414": "getEvabotContractAddress()", +"851c5bf6": "addVestTokenAllocation(address,uint256)", +"851c9d11": "DGB()", +"851cad90": "THOUSAND()", +"851cc7f9": "coinMultiplayer()", +"851d1c27": "_transferFrom(address,address,address,uint256)", +"851d46f3": "internalCheck()", +"851e6b3a": "buy100Price()", +"851ee3e2": "ApproveERC20()", +"851f9e20": "chargeOff(address)", +"85203aa2": "lengthNotEqual(uint256[],uint256,string)", +"85209ee0": "contractState()", +"85216449": "checkCustodian()", +"8521b59c": "addDataPoint(int256,uint256,bytes32)", +"852263aa": "LogThresholdChange(address,uint256)", +"8522ac8c": "testTransferOwnership()", +"85233869": "NumberOfMiners()", +"8523930a": "calculateNoOfTokensToSend()", +"85252e82": "setTransferFee(address,uint256)", +"85255ab0": "Nero()", +"8526492f": "getTokensAmount(uint256)", +"85265ee6": "press_address()", +"8526d092": "isValidContributorAddress(address)", +"85271fa1": "_validateUSDAmount(uint256)", +"85276721": "DevReward(address,uint256)", +"8527831b": "getIndex(bytes32)", +"8527c3b0": "changePriceRandomFight2Death(uint256)", +"8528b7b0": "WILDToken()", +"852980a0": "addCourses(string,string,string,string,string,string)", +"852987f3": "getRecoverSigner(uint40,uint256,uint8,bytes32,bytes32)", +"8529d576": "toUint(bytes)", +"852a12e3": "redeemUnderlying(uint256)", +"852a6bd4": "getBalanceOfPlayer(address)", +"852a7d6c": "setExtraDistribution(address,uint256)", +"852ada4b": "nonFungibleOfOwnerByIndex(uint256,address,uint128)", +"852b6121": "setInitialBlockTimestamp(uint256)", +"852c061a": "axiesPrice(uint256,uint256,uint256)", +"852c5662": "adjustFlame(uint256)", +"852ccf2b": "YIYSToken(address,uint256)", +"852da11d": "tokenCreationCapPreICO()", +"852dbfc6": "pickURL()", +"852dc589": "setQuitLock(address)", +"852dce8d": "changeOraclizeGasLimit(uint256)", +"852e9f46": "transferAndFreeze(address,uint256,uint256)", +"852ede8d": "removeToken(string,int256)", +"852f31c6": "teamStageSetting()", +"852f6662": "isProgramFactoryContract()", +"852f8b74": "getBookSigner(bytes16)", +"85307bef": "TronToken(address)", +"85318217": "RegisterMine(string,uint256,uint256)", +"8531bb56": "SaleHasEnded()", +"8532137c": "Lexzoom()", +"853255cc": "sum()", +"853262a2": "tgrSettingsPartContributorIncreasePerStage()", +"85349e01": "totalDeveloperCut_()", +"8534b3a8": "setParticipateFee(uint256)", +"853504f3": "OpenToken()", +"8535490f": "redeemEther(uint256)", +"853552d7": "_slotAddNew(address)", +"8535d2ec": "sendBatch(address[],uint256[])", +"8536a50e": "_setBurnFeeProp(uint256)", +"8536bf8f": "BuyIPG()", +"85370965": "distributeVault(uint256,uint256,uint256,uint256,uint256)", +"853717bb": "calcBurnAmount(uint256)", +"85378346": "getChancePowerWithBonus(address)", +"853828b6": "withdrawAll()", +"853a4ec2": "grantReserveToken(address)", +"853a9d32": "EGGS_TO_HATCH_1HIPSTER()", +"853b59d7": "phase_1_token_price()", +"853d814e": "MyFairToken()", +"853df275": "duel(address)", +"853e88fe": "hashVM()", +"853f636b": "sendAllTokensToFounder(uint256)", +"853f7e98": "BDLToken()", +"85423912": "setDiscipleItem(uint256,uint256)", +"854254e8": "buildLoanOrderStruct(bytes32,address[6],uint256[9])", +"85431ec8": "setRate333()", +"85439f82": "someFunction4()", +"8544023a": "nokuMasterToken()", +"85443a2b": "CampaignContract()", +"85444de3": "getChildChain(uint256)", +"85445829": "numMatches()", +"85448c59": "getBountyAddress()", +"85461f69": "calcReward(uint256,address)", +"854642e1": "mintNewDrawings(uint256)", +"8546d393": "Anatomia(uint256,uint256)", +"85473be1": "maximumCoinsPerAddress()", +"85476d6e": "GetCurrentTypeSaleItem(uint256)", +"854772ea": "getUserTotalReward(address,bool,bool,bool)", +"8547af30": "lastBidder()", +"8547bb3a": "publicSaleMode()", +"85482f89": "setOnePowerAge(uint256,uint256)", +"8548cc21": "allocateOwnerTokens()", +"8549b326": "isSettable(uint256,string)", +"8549d6f4": "MayanProtocolContract(uint256,uint256)", +"854a3d64": "LogStartSale(uint256,uint256)", +"854a9cc4": "ImpeachmentProposed(address,string,uint256,address)", +"854b1cdf": "curPayTableId()", +"854bb344": "NoblesseOblige()", +"854bec87": "payback()", +"854c2e1e": "HitToken(string,string,uint8,uint256,address,address,address)", +"854c4a0d": "DownSuccess(string,address)", +"854c584d": "AdsventureToken()", +"854cb674": "TheIlluminati()", +"854cd978": "ClaireToken()", +"854cff2f": "setWhitelist(address)", +"854e32cc": "revenueShareDistribution(address)", +"854e85c6": "lifeEvents(uint256)", +"854ecd23": "Vaynix()", +"854f1663": "setNonprofitDisbursementAddress(address)", +"854f1a1c": "VIVARefundVault(address)", +"854f3988": "eighth_withdrawal(uint256)", +"854f4817": "buyKissBTCWithCallback(address,uint256)", +"85502264": "deptcheckrespond(address)", +"85506473": "GnosisToken(address,address[],uint256[])", +"855085b8": "interCrypto()", +"8550aaf0": "BONUS_TIER_9_LIMIT()", +"8550cf46": "buyGameCoin(uint256)", +"855114c9": "buyNation(uint8)", +"85511d5f": "setEmergencyCode(uint256,uint256)", +"85512e5b": "EthlanceUser2(address)", +"8551884a": "authorizeListingService(address)", +"8551b896": "pre_tokensSold()", +"8551e3fe": "savePost(bytes32,uint256)", +"85522831": "numIntervals(uint256)", +"85528394": "currentClaimPriceWei()", +"85529636": "getSiteTokenId(uint256,uint256)", +"85530d7c": "setPetLastBreedingTime(uint64)", +"85535cc5": "setVaultAddress(address)", +"8553f6fb": "hardCapDividends()", +"855460d8": "externalBuy(address,uint256,uint256)", +"8554d60a": "addTenParticipants(address,address,address,address,address,address,address,address,address,address)", +"8554d92c": "verify(uint256,uint256,uint256,uint256,uint256)", +"85550c6b": "tradeKey(bytes32,bytes32)", +"8555cde9": "Permissioned(address,address,bool)", +"8555de47": "BlackPyramid()", +"85561120": "TPTToken(uint256)", +"85564b97": "MasterWithdraw()", +"85565585": "crowdsaleOwner()", +"85580c5b": "userinverst(uint256,address)", +"85586e8a": "allocateCommunity(address,uint256)", +"85587375": "restartAssign()", +"855876d5": "countCliDreams(address)", +"8558c0af": "createBag(uint256)", +"8559fd88": "requestRandom(uint8)", +"855b7f5b": "getAdvancedTransfer(bytes32,bytes32)", +"855b842d": "isUserInBlackList(address)", +"855c145b": "specialManagerCountInt()", +"855c45e7": "EIP20Factory()", +"855c8999": "GetSlug(address)", +"855c95f1": "createETHAuction(uint256,address,uint16,uint256)", +"855ce579": "setTwoPowerAges(uint256,uint256,uint256,uint256)", +"855ceb7d": "AirToken()", +"855d0700": "insertList2(uint256,uint256,uint256,uint256,string,uint256,string)", +"855d7c21": "updateTokenBaseRate(uint256)", +"855e0629": "setIconRate(uint256)", +"855eafa7": "get_maker_fee()", +"855f2b3a": "createGen0Auction(uint256[2])", +"855fe4c0": "ifSuccessfulSendFundsTo()", +"855fe6ed": "getConfigEntryInt(bytes32)", +"85602ad5": "getPreviousValidators()", +"85609b1c": "compose(string)", +"8561d136": "currentRunningAddress()", +"8561dc0b": "tokenPostIcoUsdCentPrice()", +"8562e452": "ADVISORS_SHARE()", +"8564b2cd": "listItem(uint256,uint256,address,uint256)", +"8564c284": "setCompte_34(string)", +"85652d1f": "getInvoiceAddress(uint256)", +"85654c9c": "setMembershipRoster(address)", +"85663119": "initialPrize()", +"85666a7c": "TEAM1()", +"85673296": "DepositBalance()", +"85673fb8": "follow(address,uint256,address)", +"8569cc4e": "release_4()", +"856a89fd": "drawRaffle(uint256)", +"856b3108": "UpdateInitiateContractAddress(address)", +"856b7d2c": "SignDividend(uint256)", +"856bb9cc": "addConsent(address)", +"856c0181": "countriesStatus()", +"856c486b": "WoodyToken()", +"856c6bd1": "checkRose(bytes32)", +"856c71dd": "isAvailable()", +"856c8922": "getGameRules(uint256)", +"856cddb0": "DummyOVOToken()", +"856dc78e": "getWarriors(uint256[])", +"856de136": "FAPFundDeposit3()", +"856deacf": "findTag(string)", +"856df931": "LYB(string,string,uint256)", +"856e8488": "erc20TokenContract()", +"856eb2d1": "submitTransactionWithSignaturesToken(address,address,uint256,uint8[],bytes32[],bytes32[])", +"856ed703": "currentCap()", +"856f3080": "WhatWasMyHash(bytes32)", +"8570153e": "publish(string,string,bytes,address[])", +"85716e2f": "changeAdminer(address)", +"8571baff": "SimpleCrowdsale(address,address,address,address)", +"8572e364": "scale(uint256,uint256,uint256,uint256,uint256)", +"8573d4aa": "OwnershipTransferPending(address,address)", +"8574ddf9": "snailmasterReq()", +"8575052a": "set_fees(uint256,uint256)", +"857512b4": "airdropCountLimit2()", +"85760377": "PixelTransfer(uint16,uint16,uint256,address,address)", +"857637c9": "ShopDexToken2()", +"85766cc3": "Calculation(string,string,string,string,address)", +"8577efc5": "DIGI()", +"8577ffc1": "unofficialUserSignUpFee()", +"857835f9": "getPostsFromIds(address[],string[],uint256[])", +"85787c8b": "encode(uint256[],uint256[])", +"85796a2d": "bonusClosingTime0()", +"8579c10e": "payDevelopersFund(address)", +"8579cbde": "getPrice(string,uint256,address)", +"857ac1c9": "TokensBurned(address,address,uint256)", +"857b3224": "setOAR(address)", +"857b575e": "qquizwinnerToken()", +"857b7dfc": "buyLittleDragonGirlLottery()", +"857ba7fb": "MAX_CONTRIB_CHECK_END_TIME()", +"857bcb2c": "adminAddTrustedCurrencyContract(address)", +"857cc1c4": "ExchangeGift(string)", +"857cd569": "FundDeposit(address,address)", +"857cdbb8": "getPublicKey(address)", +"857cfff9": "homeDailyLimit()", +"857d39d7": "CCH_LLV_FIFA_1()", +"857d4c07": "throwScraps(uint256)", +"857e6a99": "decreaseTokens(address,address,uint256)", +"857f4864": "getNextSnapshotTime()", +"857f54e4": "MonethaGateway(address,address)", +"8580563c": "finalize(bytes,bytes,bool)", +"8580b71b": "getLoanIDbyClient(uint256)", +"8580eb2f": "setFeeBalance(uint256)", +"858110a5": "proposeShutdown(uint256)", +"858155e4": "subcontractExecuteCall(address,uint256,bytes)", +"8581dc7c": "SociBit()", +"85820925": "getCompte_17()", +"8582ac21": "getIcoInfo()", +"8582b7dd": "OrxERC20()", +"8582e554": "transferBy(address,uint256)", +"858310d8": "getPreICOAddress(uint8)", +"85839731": "setKittyContractAddress(address,address)", +"8583b1b8": "_setUserInfo(address,uint256,uint256)", +"85861b15": "setUnboundedLimit(address,bool)", +"85867cd5": "BDSMtoken()", +"8586b2f0": "getPermission(address,string)", +"8586e75b": "ChangedResource(bytes32)", +"8587be6e": "ceil(uint256,uint256)", +"8587edbb": "lockEndBlock()", +"8588b2c5": "adopt(uint256)", +"85899cee": "CryptoThreeKingdoms()", +"8589c725": "deleteWork(uint256)", +"858ac4d8": "TransferOwner(address)", +"858c7559": "chainIDSeed()", +"858ced35": "setUser(address)", +"858e41b4": "lemonContract()", +"858e58d6": "RemapImportedNotUsed()", +"858f84e7": "WTFToken()", +"858fa2f5": "setArrayIndexValue(bytes32,uint256,address)", +"85903f67": "setUnofficialUserSignUpFee(uint256)", +"85908ffa": "buyTokensPostHook(address,uint256,uint256)", +"85909ac6": "operate(address)", +"8592b778": "_rand()", +"8594bed0": "cancelMintRequest()", +"85952454": "newOwner(address)", +"8595c9ff": "diff(uint256[])", +"8595f8b1": "getGasPricePctOfBetValue()", +"8596982d": "getNotesCount()", +"8596d9ed": "transferInternal(address,uint256,address)", +"8597705f": "DataEquip(address)", +"8597eb6e": "ericukis(uint256,string,uint8,string)", +"859832e6": "locationsLength()", +"85984e69": "WavesCommunityToken()", +"859971dc": "initialFunding()", +"8599d0d8": "buildIdentifier(address,address,address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,string)", +"859a711d": "icoBonus2EndDate()", +"859a954b": "peace(string)", +"859b97fe": "cancelAuction(address,uint256)", +"859bbfee": "floatAdd()", +"859bcc71": "allowDisbursePaymentWhenPaused()", +"859ccc72": "setPlayerVirusNumber(address,uint256)", +"859d1bc7": "updateLeftLottery()", +"859da4e3": "transferParityOwnership(address)", +"859e0547": "createBounty(address,string)", +"859e25df": "giveProjectMoreVotes(address,uint256)", +"859e7d32": "getEpochData(uint256)", +"859f5717": "AuctionSuccessful(address,uint256,uint256)", +"859f63dc": "checkRewards(uint256[])", +"85a013e0": "setAnswer(uint256)", +"85a08f41": "buyLimitSupplyMax()", +"85a09f6f": "withdraw123()", +"85a10b30": "burningAdress()", +"85a143f4": "DailyRoi()", +"85a156af": "activityFunds()", +"85a17a1a": "isValidBet(uint8[4])", +"85a1c242": "PSM_PRICE()", +"85a227fd": "APC()", +"85a242d7": "teamTokensAccount()", +"85a2675b": "isConfirmedWithdraw(uint256)", +"85a26d7d": "getAllPeople()", +"85a2dd15": "hasAccess()", +"85a2f6af": "donateToken(address)", +"85a30c33": "changeContractAddress(address)", +"85a33ce9": "exitinverst(address)", +"85a345e2": "disTrust(address)", +"85a34f4a": "getGameSums(uint256)", +"85a38635": "votingEnd()", +"85a4757e": "releasedAmountBlocksIn(uint256,uint256)", +"85a49f2e": "verifyPass(address)", +"85a52584": "SettingsChanged()", +"85a735dd": "partAllocationLength()", +"85a8f42e": "diff(int256[],int256)", +"85aa6103": "auctions()", +"85aa6e09": "granted(address)", +"85aa92a7": "storageAddress()", +"85aaff62": "transcoder(uint256,uint256,uint256)", +"85ab0c19": "tokenProvenance(uint256)", +"85aba275": "assign(address)", +"85ac2f7b": "getListedTime()", +"85add95b": "Spike()", +"85ae067b": "func_040B()", +"85ae2f1c": "sunFinished()", +"85ae6d2d": "OfferingOpens(uint256,uint256)", +"85af4142": "verifyTeam(uint256)", +"85b018e9": "isSubjectRaiseTap(uint256)", +"85b09a01": "DIVC()", +"85b12c7c": "launch(uint256)", +"85b1423e": "returnAll()", +"85b142ed": "getAccountState(bytes32)", +"85b2ff8f": "getWeightedRandomMember(uint256)", +"85b31d7b": "myInfo()", +"85b39fc1": "CONTRACTIUM()", +"85b3c420": "createWeight(uint256)", +"85b3ed4e": "GoalReached(uint256,uint256)", +"85b443b6": "econReserveWallet()", +"85b4bb53": "getSettings()", +"85b51737": "addSafe(uint256,uint256)", +"85b55c07": "withdrawFeesToPoolOwners()", +"85b6824f": "setMinterWallet(address)", +"85b688de": "PRIVATE_STAGE_START()", +"85b73d3c": "testCreateNewRevision()", +"85b75b1e": "toogleStatus()", +"85b86188": "isSaleClockAuction()", +"85b8c64a": "bonusFreeLOT()", +"85b8d86f": "CrowdSaleFinished(string)", +"85b923ca": "getCandidates(bytes32)", +"85b94536": "debug_judge(bytes32[13],uint256,bytes32[],bytes32[],bytes32,bytes32,uint256[4],bytes32[10],uint256[4])", +"85b9c729": "OnWithdrawTo(address,address,address,uint256,uint64)", +"85b9f607": "buyTokensWithGuarantee()", +"85ba0052": "stringToUintNormalize(string)", +"85ba9a99": "setMinimumHydroStakes(uint256,uint256)", +"85bac237": "addPayment(address,uint256)", +"85bb7d69": "answer()", +"85bb821b": "WTO()", +"85bb8e29": "continuousSale()", +"85bbb53a": "ancestorBuffPercentage()", +"85bdc4a2": "lastBlock_v16()", +"85bddb97": "addOnOneStage(address,uint256,uint256)", +"85bde3f2": "SaddlePr(uint256)", +"85be2f02": "SampleCrowdsaleToken(string,string,uint8,uint256)", +"85be8fe6": "confirmReceivedAt(uint256)", +"85bf96a0": "JOP(uint256)", +"85bfe55d": "getUserByEmail(bytes32)", +"85bfff9c": "sayNoNo(uint256)", +"85c07546": "TransformCoin()", +"85c09f26": "topTotalSupply()", +"85c1057b": "payAndHandle(uint256,address,uint256)", +"85c15d9a": "exchangeRates(address)", +"85c3649f": "registerSelf(bytes32)", +"85c373c3": "releaseAccount(address)", +"85c3bb6f": "getMsg2()", +"85c4e3d1": "sendSubscriptionBonus(address)", +"85c53cf1": "giveAccess(address,bytes32)", +"85c5e9f8": "mimin(uint64,uint64)", +"85c64029": "set_prices(uint8,uint8,uint8)", +"85c653ba": "Divsforall()", +"85c78fac": "retryOraclizeRequest(uint256)", +"85c7a953": "WithdrawFullBalanceFromBankAccount()", +"85c855f3": "setStake(uint96,uint128)", +"85c8d362": "CTM()", +"85c8f447": "totum()", +"85c95d30": "setResourcesOtherManager(address,uint8)", +"85c9dd72": "GCOXToken(string,string,uint8,uint256)", +"85ca165a": "count_donors()", +"85cb2e6e": "refreshEmissionReleaseTime()", +"85cb469a": "getIcoFund()", +"85cb4ea2": "getPunchCardsInternal(address)", +"85cba6b1": "getFallback()", +"85cba722": "EGLSold()", +"85cbc881": "totalUSDRaised()", +"85cc3114": "doDeposit(address)", +"85cc51c2": "destTokensTeam()", +"85cc63ec": "getCurrentMinigamePrizePot()", +"85cc6fba": "boomrToken()", +"85cc9a2b": "issueKey(bytes32,address)", +"85cd233c": "getResidualEtherAmount(uint256,uint256)", +"85cdafa6": "teamOneVolume()", +"85cf61ef": "payRake(uint256)", +"85cfdec7": "buyKWHAgainstEther()", +"85d02c8a": "changeMaximumInvestmentsAllowed(uint256)", +"85d178f4": "withdrawWallet()", +"85d19a25": "getPositionId(uint256)", +"85d1be13": "preSaleSecondPrice()", +"85d3b5bd": "policyID(uint256)", +"85d45d34": "comments2()", +"85d51d19": "contributorETHBalance(address)", +"85d544be": "transferAndLockUntil(address,uint256,uint256)", +"85d559ee": "TbookToken(uint256,string,string)", +"85d5c971": "logTransfer(address,address,bytes32)", +"85d5e631": "disableTokenTransfers(bool)", +"85d61e2a": "supplyNum()", +"85d63cce": "REMAINING_SUPPLY()", +"85d71df1": "investxPlatform()", +"85d77e5f": "priceExpiration()", +"85d80458": "m_deployer()", +"85da1192": "setMaxFaucet(uint256)", +"85daafe6": "capitalRaisedTarget()", +"85dacd5b": "voteSnapshotBalanceAuto(address,uint256)", +"85db2dda": "PayoutQueueSize()", +"85db2e3a": "PoD()", +"85db66e8": "addGroupMembers(bytes32,address[])", +"85dc3004": "setFundAddress(address)", +"85dc6721": "emptyShipCargo(uint32)", +"85dcbb5a": "returnMember(address)", +"85dcee93": "descriptionHash()", +"85dcfbd4": "VernamWhiteListDeposit()", +"85dd1fbd": "bet_on_team_1()", +"85dd2148": "getSaleDate(bytes16)", +"85ddb747": "transferFromPosttgefund(address,uint256)", +"85ddf726": "dismissOperator(address)", +"85de4841": "uint2str(uint64)", +"85de4f72": "luckybuyTracker_()", +"85dee34c": "query2_withGasLimit(uint256,string,string,string,uint256)", +"85defaf4": "voteEnds()", +"85df508f": "tip_rate()", +"85df51fd": "blockHash(uint256)", +"85e00e4b": "bezpolToken()", +"85e040b1": "Invested(uint256,address,uint256)", +"85e050e4": "get_property_contact(uint256)", +"85e05445": "MartiniumToken()", +"85e0832c": "totalMintSupply()", +"85e1684c": "computeS(uint256,uint256)", +"85e344f7": "SmartInvestmentFundToken(address)", +"85e36cc2": "foundationAmount()", +"85e3f058": "getIdentity(uint256)", +"85e41e7e": "TokenFree(uint256)", +"85e436bf": "setBuyRate(uint256)", +"85e567d4": "verifyProof(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[1])", +"85e57f3c": "updateLogoUrl(bytes32,bytes32)", +"85e5908e": "Group_3()", +"85e5bb3a": "Security_AddPasswordSha3HashToBankAccount(bytes32)", +"85e5d7ee": "mintAll(uint256[])", +"85e5f08a": "updateVerifiedSign(address,address,string,uint8,string)", +"85e612e4": "getBirthYear()", +"85e61b4a": "processFundingSuccessfulFinished()", +"85e61e67": "set_arbits_whitelist(address,address,bool)", +"85e68531": "revokeAccess(address)", +"85e7d4cb": "CCC()", +"85e870b3": "default_rate()", +"85e91347": "initializeSaleWalletAddress()", +"85e99be4": "updateHighestPrices_(uint256,address)", +"85e9bd2b": "setAdminAddress(address,address)", +"85eac05f": "changeOwnerAddress(address)", +"85eb6109": "getAddressClaims(address,address,uint8)", +"85ec419a": "setTokenTwdt(address)", +"85ed5cf9": "resetAlias()", +"85eddeea": "setReward(address[],uint256[])", +"85edf68d": "initVestingStages()", +"85ee292c": "airdropTesterFinal(address[],uint256)", +"85ef4ae7": "f_internal()", +"85ef5a8a": "GermanCoin(address,address)", +"85efa3aa": "setHold(address)", +"85efb721": "fillTheBank()", +"85eff0ef": "hardcoreBattleWith(uint256,uint256)", +"85f01859": "setWord()", +"85f07a2b": "CALLER_EXCHANGE_SHARE()", +"85f07b64": "confirmedAmount()", +"85f07bbe": "MIN_PLAYERS()", +"85f0e72c": "uintToStr(uint256,uint256)", +"85f0f098": "allowWithdrawals()", +"85f16544": "EdgarRichardWunsche()", +"85f19bc4": "giveDividend()", +"85f255ea": "getUserFactoryContractAddress()", +"85f2aef2": "team()", +"85f2d854": "createManyDrinks()", +"85f2e4b1": "_strConcat(string,string,string,string)", +"85f3c568": "LogContribution(address,uint256,uint256)", +"85f45250": "addFunds(uint256,uint256)", +"85f517d4": "account3Address()", +"85f52912": "TGRUPToken()", +"85f52984": "addPrecondition(address)", +"85f59db3": "CheckN2Exception(bytes32,uint32)", +"85f63a4a": "preICOBeneficiaryAddress()", +"85f671a6": "requestWithdrawal(bytes32,uint64,bytes32[],uint256[],uint256[2],uint256)", +"85f67ae4": "addEpisode(address)", +"85f8c16d": "claimHours(int256)", +"85fa33eb": "declareDividend(uint256)", +"85fab341": "transferTokensAfterEndTime(address,uint256,uint256,uint256)", +"85fae602": "getInsurance(uint256)", +"85fbd17f": "PonzICO()", +"85fbdd47": "_order(uint256,uint256,uint8)", +"85fbdefc": "masterBalanceOf(bytes32,address)", +"85fc835e": "getSoftcapUsd()", +"85fcb4a8": "findPrevOrderId(uint128,uint128)", +"85fcd363": "votesArr(address)", +"85fceea8": "getCountSubscribers()", +"85fdeba7": "vendorAllocation()", +"85fe0448": "testThrowRestartNotUpdatable()", +"85fe551a": "ownerGrace()", +"85fe6200": "recordEndedGame(uint256)", +"85fed812": "ERC20Lookup()", +"85ff5e13": "SkinCoin()", +"85ff70de": "_payFees()", +"85ff96a7": "getTotalSellingMonsters()", +"86001519": "totalProfit()", +"86005b14": "allocateVestable(address,uint256,uint256,uint256)", +"8600e40b": "notifyWithdraw(address,uint256)", +"8600f2ec": "totalChildTokens(address,uint256)", +"86013322": "withdrawSaleBalances()", +"860241c2": "TAXToken()", +"8602c8b6": "countryofN(address)", +"8602c8d3": "ethSendDifferentValue(address[],uint256[])", +"8603d31a": "auctionDetails(uint256)", +"860427fc": "setGPSRatio(uint256)", +"86047946": "_processHistoryItem(bytes32,bytes32,uint256,address,address,uint256,bytes32,bool)", +"86048c9a": "totalCashout()", +"8605c97e": "setMarginThresholds(uint256,uint256)", +"86060884": "SafeGuard(bytes20,uint256,uint16)", +"86066750": "HelloWorld(string)", +"86068367": "DYITToken(uint256,string,string,uint8)", +"8606f905": "balanceOf(address,bytes)", +"86070cfe": "recoveryVaultAppId()", +"86073441": "signToApproveAddTokenData()", +"860772a9": "establishBorrowerReturnFiatPerEthRate(uint256)", +"860779e7": "setMinBuy(uint256)", +"860838a5": "frozenAccounts(address)", +"8608e58b": "sendOwnerDeposit(address)", +"86096578": "getRetailer(uint256,address)", +"860aefcf": "limits()", +"860bb34a": "SIGMA()", +"860c5ed6": "testVote()", +"860c851a": "votePrice()", +"860caf69": "HashAdded(address,string,uint256)", +"860d7273": "masterKeyActive(address)", +"860e6185": "commitTo(bytes32)", +"860e9960": "BetPriceLimit()", +"860e9b0f": "updateRegistryPrice(uint256)", +"860f5048": "baseSupply()", +"861004ae": "Visus(address)", +"861080ae": "transferMembership(address)", +"8610f045": "withdrawOffer(uint256)", +"86115c1d": "MyPurchaseContract(address)", +"8611643a": "Withdraw(string,string)", +"86116c12": "PerkscoinToken(uint256)", +"86117319": "buy_the_tokens(bytes)", +"8611e330": "FishbankBoosters()", +"86127ecf": "oraclize(bytes32,bytes,bytes,bytes,string,bytes,bytes,uint256,bytes)", +"8612d049": "isLocked(address,address)", +"8612ee13": "addMatch(string,string,string,bool,uint8,uint8,uint256)", +"86145875": "contributeInternal(address,uint256,uint256)", +"861654f7": "updatefundingStartTime(uint256)", +"8616865d": "ReferredInvestorAdded(string,address)", +"8616bc8b": "contributedTotal()", +"8617457a": "start_()", +"86188c97": "fetchOrdersForMerchant()", +"86190d62": "buyable(address)", +"86192c36": "privateOfferingPercentage()", +"861c3385": "blocksquare()", +"861c3a09": "queryByUser(bytes)", +"861c9c79": "transferToComposition(address,uint256)", +"861cab52": "canSendGameGift()", +"861d4e51": "NOETToken()", +"861d7daf": "deleteImage(uint256)", +"861dd0a5": "releaseCats(uint32,uint256,uint256,string)", +"861e2e43": "orderCore(uint256,uint256,uint256)", +"861e5d6a": "CryptoKotik()", +"861ec457": "SILVER_AMOUNT_TPT()", +"861ed3ea": "controllersByPartition(bytes32)", +"861f8a52": "testThrow_2_invalidOwner_accessRestrictionThrow()", +"861fcefb": "Token1Token()", +"86200842": "getSellDailyLimit(uint256,bytes2)", +"8620410b": "buyPrice()", +"86212913": "queryAuction()", +"86216ace": "NotThrowingToken(uint256)", +"8622031f": "setModuleAddress(string,address,bool)", +"862235f5": "EthertoteAdminAddress()", +"8622a689": "expiresAt()", +"86231246": "returnsOneNamed(uint256,uint256)", +"86231b9e": "contentHostPaidByAO(bytes32)", +"86237e7b": "setAngel(uint8,address,uint256,uint16)", +"862440e2": "setURI(uint256,string)", +"86260cfe": "UpdateUserEmail(string)", +"86269a88": "checkBetNumber(uint8)", +"86271d8b": "minPurchaseInEth()", +"8627df46": "buyTickets(uint256,uint256)", +"862882e5": "startAuction(string,uint256)", +"8628892e": "Initialize(address,address,bytes32,address,uint256,bytes32,address,uint256,bytes32,uint256)", +"8628aca9": "setIds(uint256,uint256)", +"862a4bf2": "tokenHolder(uint256)", +"862b092b": "getTokenName()", +"862b525c": "gameMiningTokenStartTime()", +"862b6683": "setValues(uint256,uint256,uint256,uint256)", +"862c5e16": "validatePurchase(address,uint256,int256[],int256[])", +"862cb14e": "DMI()", +"862cdef3": "auctionTank(uint256,uint256,uint256,uint256)", +"862d0d4b": "_weiToFinney(uint256)", +"862eb9c0": "setGoldReward(uint256)", +"862ed594": "XmonetaToken()", +"862f4517": "hasVoting(uint256,uint256)", +"862fd38c": "concat(uint8,bytes32,bytes32)", +"86312b1b": "TripsCoin()", +"86314af9": "BetOnHashV84()", +"8631890e": "PLANET_PRICE()", +"86318bc4": "ethBioxRate2()", +"86321f95": "switchClaimerAndRemoveOldOne()", +"86323e85": "isSellingNow()", +"8633497f": "angelCurrentAmount()", +"863451dd": "donateEther()", +"86346c42": "awards(uint8)", +"86348afa": "ColorReserved(address,uint256)", +"863524b1": "partnersKey()", +"86356ab9": "finalizeRefunding()", +"8635b527": "resetPainting(uint256)", +"8635f45d": "getSpaceshipProductAttributesByModel(uint16)", +"863682f4": "getScore(uint32)", +"86377b63": "registerLoanReplaceDuplicated(address,uint256,uint256)", +"863843bc": "bonusSupply()", +"8638aa65": "DEBUG_MODE()", +"8639ae69": "getAllCrySolObjects()", +"8639b0d7": "getBalanceDiscrepancy()", +"863a0372": "hex2dec(uint256)", +"863a03e0": "salvage(address)", +"863ac22b": "EtherGame()", +"863b3b66": "purchaseThemedSpinner(string,uint256)", +"863c51a9": "setCustomerSignature(address,uint256,bytes32)", +"863c607c": "ReactioonToken()", +"863d62ac": "Goldmint(address,address,address,address,address,address)", +"863da000": "disburseAuthorizedPayments(uint256[])", +"863e24d6": "updateBonusTicketsPercentage(uint8)", +"863e76db": "ONE_DAY()", +"863e7e4b": "getCurrentPhraseInfo()", +"863e8320": "initGPS()", +"863f2a19": "adjustTime(uint256,uint256,uint256,uint256,uint256,uint256)", +"863f40ac": "syp1(address)", +"863f52b4": "makerBetsCount()", +"864059ac": "clearingPriceComponent()", +"86420710": "setReceivers(address[],uint256)", +"8642269e": "buyProduct(uint256)", +"86428900": "SetPeriodITO_startTime(uint256)", +"86432925": "profitDistributionContract()", +"8643d01d": "throwsSaleWalletIncorrectSaleAddress()", +"8644ddd9": "WOB(uint256,string,string)", +"86452295": "getPointOf(uint256)", +"86457702": "authorize(string,address)", +"8645a3da": "ATTR_PRODUCIBLE()", +"8646b5cb": "marketTotalEarning()", +"8646fb43": "Electrominer()", +"864757a8": "minFinneyToKeep()", +"8647a5dc": "getTimeLock(bytes32,bytes32)", +"86481d40": "getLevel(uint256)", +"864824a0": "phase9Price()", +"86485cdf": "setCurrentExchangeRate(uint256)", +"86489ba9": "initialize(address,address,uint256,uint256,uint256,uint256)", +"8648c0ce": "neumarkCap()", +"8648f24c": "changeVariables(uint256)", +"86496e2e": "TcToken(uint256,string,uint8,string)", +"8649c0a4": "SetEndTime(uint256,uint256)", +"864a1057": "Start4()", +"864a9a09": "__mod(bytes,bytes)", +"864aef45": "buyCard(address,uint256,uint256,uint256)", +"864af3f4": "Menu02(address[],uint256)", +"864b525c": "GoldDollar()", +"864c189b": "LBCToken()", +"864c2e94": "service_founder()", +"864ca300": "goldBalanceOf(address)", +"864ce5dc": "getWeekBonus(uint256)", +"864d1d72": "getUserCountByRole(string)", +"864d7e14": "approveAsset(uint256)", +"864da88c": "_clearBlocksProducers(uint256)", +"864dd17d": "Controller(address,address)", +"864e8cc1": "setMaxCharacters(uint256)", +"864f4e54": "PeerWalletsToken()", +"864fda69": "minNum()", +"864fff0a": "DealCompleted(uint256,address,uint32,uint32,bool,uint256)", +"86508380": "_getUncreditedPoints(address)", +"8650b6ef": "endTimePre()", +"86517df4": "concludePresale()", +"8651dc1e": "confirm(uint256,uint256)", +"865232fb": "setarg_3_input(uint256)", +"86544e11": "STARTING_SNAIL_COST()", +"8654b78d": "AttoresDigitalCertificates(address)", +"865508ef": "minSend()", +"86556071": "gracePeriodStart()", +"8655f0da": "copyAllHpbNodesByStageNum(uint256)", +"8656dcb6": "distributeTeam()", +"865733da": "MercuryCrowdsale()", +"86575e40": "changeName(string,string)", +"86578375": "withdrawFund(uint256,bool)", +"865891b0": "PlanToken()", +"8658b8b9": "checkPermission(address,address,bytes32)", +"86590955": "changeHeight(uint256)", +"86591bd6": "testFailMintWhenStopped(int256)", +"86598549": "_withdrawTokensFor(address)", +"8659d573": "getCountPosition(uint256,uint256)", +"865a4253": "prcSum()", +"865ad6c2": "levelUpCar(uint32,uint32,uint32)", +"865b0d30": "SingularityTest15()", +"865c79b2": "setImageDataLength(uint256,uint16,uint16)", +"865cc6a3": "getDErc20OwnerClaimEnabled(bytes32)", +"865dc0d9": "EndChanged(uint256,uint256,address)", +"865e288b": "getAvailableWithdrawProfitValue(address)", +"865eb3d3": "getWorkerProfit()", +"865fd239": "transfer_token_ownership(address)", +"865fe035": "addressIco()", +"86602b6b": "testControlRetractLatestRevisionNotOwner()", +"86602c84": "frozenAmount(address)", +"86609b37": "_createCard(address,uint16,uint16)", +"8660b220": "buyerRate(address)", +"8660b32b": "getSumInByGame(uint32)", +"8660bb8b": "updateAllPixelDetails(uint256,uint8,uint8,uint8,uint256,string)", +"8660cbf5": "battleDecider()", +"8661009b": "checkPayments(uint256)", +"866192a2": "getLastAuditDocumentation(address)", +"866278a8": "level_7_amount()", +"86628eed": "weisDeposited(address)", +"86630b7b": "getSaleData(uint256)", +"86633571": "DestructibleMiniMeToken(address,address,uint256,string,uint8,string,bool,address)", +"8663b4c7": "StudyCoin()", +"866408eb": "getPlayerKeysCount()", +"86647821": "NeuroDAO(address,uint256)", +"86647bac": "getBountyArbiter(uint256)", +"8666107c": "eth_received()", +"86667435": "getPercent5(address)", +"8666fca5": "holdingsOf_BEAR(address)", +"86673464": "assertEq15(bytes15,bytes15,bytes32)", +"8668a416": "assignMultipleParcels(int256[],int256[],address)", +"8669ccf4": "getFreelancers(address,uint256)", +"8669e08c": "migrationFinishedTime()", +"866b5674": "totalBountyinWei()", +"866b9323": "mintForReportingParticipant(int256,uint256)", +"866c03eb": "_unmintedTokens()", +"866d840a": "setCompte_44(string)", +"866df234": "setLink(bytes)", +"866e5162": "oslikToken()", +"866eb7b5": "initialParameter(address,address[],address,uint256,uint256,uint256,uint256,uint256,uint8,uint8,uint8,uint32[])", +"866f4555": "Basic23TokenMock(address,uint256)", +"866f6736": "trustedChildWithdraw()", +"867022d1": "Initialise(address)", +"86703c9c": "getProviderClientsCount(uint256)", +"86707026": "midEtherBonusLimit()", +"8670cc7c": "BlueDragon()", +"8670e183": "createLegendaryAuction(uint256,string)", +"8671090e": "setSavedBalanceToken(uint256)", +"86715acf": "BodyOneToken(address)", +"8671b894": "cancelOrder(uint256[3],bytes32,bytes32,uint8)", +"8671ef4d": "grg(address)", +"86723215": "createMarket(bytes,uint256,uint256,address)", +"8672e853": "LogOwnerAdded(address,address,address)", +"8672f1bc": "isProposalActive()", +"8673094f": "allGuGiven_()", +"867387d4": "BurnableToken(address[50])", +"86749d97": "ZOOToken()", +"8675cf9e": "MaxToken(uint256,string,string)", +"8676993f": "setTransformAgent(address)", +"86773cae": "setPromoEndTime(uint256)", +"8677ebe8": "isSigned(address,bytes32,uint8,bytes32,bytes32)", +"8678446e": "preSaleMinEth()", +"8678c2b9": "HodlEth(uint256)", +"867904b4": "issue(address,uint256)", +"86795e8d": "set_master(address)", +"867a66ac": "ownerCredit(address,uint256)", +"867b36fe": "setFiscalVerify(bytes32)", +"867b3d4b": "updateEtherPrice()", +"867b79a1": "withdrawalRange(uint256,uint256,address)", +"867befba": "SUV_TYPE()", +"867c0547": "newPonziFriend(uint256)", +"867c2857": "transferAgents(address)", +"867c6e23": "CryptoRides()", +"867c7eda": "getProposalByID(uint256)", +"867e248c": "feePercantage()", +"867e958f": "NAEC()", +"867ea029": "WESSToken()", +"867eed11": "privilegedTransferLock()", +"867f990a": "changePriceUSD(uint256)", +"867fbe6d": "AnotherOwnerAssigned(address)", +"86804aad": "queryData(address)", +"8680e52d": "emitJobOfferAccepted(uint256,address)", +"86813c53": "sellerIdOf(address)", +"86814819": "_prePurchaseAmount(uint256)", +"868149da": "TRONCLASSIC()", +"8681a07f": "ownerSetRandomApiKey(string)", +"868203ea": "ZeroChainToken()", +"86820a7d": "createInputData(uint256,uint256)", +"86834610": "registerEscapeRequest(uint32,int256,bool,uint32)", +"8683612b": "exists(bytes32,bytes32)", +"8683e4b4": "WHUToken()", +"86842bc2": "verifyNonces(bytes,uint64[],uint64[])", +"86845f9a": "theCyberGatekeeperTwo()", +"868467e6": "deliverTokens(uint256)", +"86849a6c": "TeamTailsChoice(address)", +"86852dca": "getElectionInfo()", +"86852fd7": "bountySupply()", +"86863ec6": "init(address,address,uint256)", +"86867740": "trueSupply()", +"86869eae": "totalClosedContracts()", +"86886a38": "transferAccessOn(address)", +"8688b5fe": "getMyContractsByType(uint256)", +"86897cb8": "Addresses()", +"8689a500": "putToken()", +"868a8813": "calculateGrapeBuySimple(uint256)", +"868d2b62": "ZeusCoin()", +"868d5383": "transferFromWithData(address,address,uint256,bytes,bytes)", +"868defd0": "getRemovableIdArrayAddressItems(address,uint256,string,string,string)", +"868df7f6": "alterFeaturedLength(uint256)", +"868e3c52": "EosPizzaSliceSafe(address)", +"868eb6bf": "removeOrders(uint256,uint256)", +"868f2564": "Iconss(address,address)", +"868f9c57": "Administrator(string,address)", +"86908b3f": "TransferInternalLedgerAT(address,address,uint256,bytes32)", +"86908f93": "FFG(uint256,string,string)", +"8690d6d5": "CentrallyIssuedToken()", +"8691162a": "TlcCoin()", +"86913884": "ShroomeryFarmer()", +"8692ac86": "transferOwnershipNow(address)", +"86936ed5": "isReceiptClaimable(bytes8,bytes8,address[],bytes,bytes32[],uint256[],uint256[],bytes)", +"86954ecc": "Finished(uint256)", +"86964032": "getHash(address,uint256,uint256,uint256,uint256)", +"8696807d": "addABaddress(address,address,string)", +"8696eec4": "setTokedoTokenFeeDiscount(uint256)", +"86973b0f": "RewardDemoChannel(address,address,address)", +"86985bee": "getTeamSalary()", +"86994b71": "RND()", +"869984c8": "addrOwner()", +"8699a65f": "rewardsCount()", +"869ac8dc": "getReferenceCurrency(address,uint256)", +"869af1ff": "finishTransferGet()", +"869b22fd": "toEthertoteDevelopmentWallet()", +"869b3f6a": "testThrowsRetractNotOwner()", +"869c63c1": "batchOrderTrade(uint8[2][],bytes32[4][],uint256[7][],address[6][])", +"869c8bd4": "buyChannel(string)", +"869d436d": "approvedAddressLUT(uint256)", +"869d785f": "removeModerator(address)", +"869d7d93": "countLeadingZeros(uint256,uint256)", +"869e0e60": "decreaseSupply(uint256,address)", +"869f1c00": "presaleParticipationMinimum()", +"869fe15d": "setFirstWinner(address[])", +"86a046d5": "lastRefrralsVault_()", +"86a17f29": "modifyLevelCap(uint256,uint256)", +"86a1ea7a": "HeliosToken()", +"86a2ef34": "Indemnisation_4()", +"86a2f98a": "getPersonalStakeForAddresses(address,address)", +"86a3171f": "removeAllAttachmentsFromCollectible(uint256)", +"86a33a0b": "RoundBSold()", +"86a3736e": "increaseTokenBalance(address,uint256)", +"86a3c902": "If(address,bytes32,bytes32)", +"86a3e0a7": "allocated1Year()", +"86a40e63": "_removeExcluded(address)", +"86a4f6ee": "MOM()", +"86a50535": "voteFor(uint256)", +"86a57f6f": "byteArrays(bytes1,bytes)", +"86a5ebe1": "getPlayerDetails(address,address)", +"86a5ff97": "changeStatus(string)", +"86a61c81": "medicos()", +"86a66dc3": "getVoteResults()", +"86a7b995": "maxContributionInWei()", +"86a8da37": "getNumWinners(uint256)", +"86a91ab4": "Scale(int256,bytes32)", +"86a9443e": "WellyPai()", +"86aa354a": "PUBLIC_SALES_2_PERIOD_END()", +"86aa552a": "lockAbsoluteDifference()", +"86aa6c09": "P3D_address()", +"86ab3f7b": "RESERVED_TOKENS_FOR_ICO_BONUSES()", +"86abfce9": "Voted(uint256,bool,address)", +"86acb16d": "register_creature(address)", +"86ace9b1": "setICOWeek1Bonus(uint256)", +"86ae5fec": "getParticipantCount(uint256)", +"86aecb9d": "_lotteryToken(uint256,address,address)", +"86af6ba5": "addDeed(address,uint256)", +"86afa110": "lockTrading()", +"86b08228": "getInvestorAddr(uint256)", +"86b0befc": "congress()", +"86b0fc9d": "startsWithDigit(string)", +"86b14583": "EzPoint()", +"86b27391": "startCrowdsale(uint256,uint256,uint256,uint8)", +"86b2be73": "ICO_RATE2()", +"86b35f79": "read_u16()", +"86b3610f": "wei2usd(uint256)", +"86b46073": "getCurrentBidOwner(uint256)", +"86b46694": "currentWave()", +"86b467f2": "tokenSaleContractAddress()", +"86b5e2b9": "dataSourceCallbackRoundOfSixteen(uint256,uint8)", +"86b6b721": "Anaco()", +"86b6ec6c": "showLastChange(address)", +"86b6f462": "updateMaxContribution(uint256)", +"86b714e2": "s()", +"86b715bd": "setAutoNewbond(bool)", +"86b76d6c": "MunishExchange(address)", +"86b7b8f6": "setBalanceHolder(address)", +"86b88af0": "setLLV_edit_10(string)", +"86b8f0a2": "teamAllocations()", +"86b945b0": "getRoundStatus()", +"86b9a1f4": "logShareTokensTransferred(address,address,address,uint256)", +"86ba793e": "setProviderCountry(uint256,uint256)", +"86bb1b24": "pegEtherValues(uint256,uint256,uint256,uint256,uint256,uint256)", +"86bb1e03": "toCollect(uint256)", +"86bb5a48": "buyAsset(address)", +"86bb7121": "getBlocksPerRound()", +"86bb8f37": "claimReward(uint256,uint256)", +"86bc2338": "isConsumable()", +"86bd4ef7": "lockPayment(bytes32,address,uint256,address)", +"86bdea3f": "postTrade(bytes32,uint256,address)", +"86be3981": "dividendsForUser(address)", +"86be53d3": "isPresaleOn()", +"86beaece": "doPurchase(uint256,uint256,uint256,address,address,uint256)", +"86bfbd44": "setDailyPrices(uint256,uint256)", +"86c02e88": "allocateFundToken()", +"86c23d54": "EliteShipperToken(uint256,string,string)", +"86c2b53d": "EximchainToken()", +"86c2e8e3": "accept(uint256,address[],uint256[],uint256)", +"86c3ceae": "setVAtomOwner(string,string)", +"86c455ee": "team2LockEndTime()", +"86c57fcc": "b32ToBytes(bytes)", +"86c59418": "USDToken()", +"86c5bc1c": "totalExchanged(uint8,uint8)", +"86c6f66b": "buySilver(uint256,uint256,uint8,bytes32,bytes32)", +"86c8c491": "setTransferAdmin(address,bool)", +"86c99779": "blocktubeUser()", +"86ca32b5": "claimExist(string)", +"86cb034f": "KIBIS_Token()", +"86cb531b": "mintPartnerWithLock(address,uint256,uint256)", +"86cb5cdb": "feeForFirstArtWorkChangeRequest()", +"86cba22b": "getAllBuyers()", +"86cc5a1d": "testIsOptionPairRegistered(address,uint256,address,uint256,uint256)", +"86cd71be": "getNumberOfMinters()", +"86cdbae9": "append(string)", +"86ce0285": "allocateTokens(address,uint256)", +"86ce8327": "updateStarScore(address,uint256)", +"86ce9835": "transferMoney(address)", +"86cef432": "CONTRIB_PERIOD3_STAKE()", +"86cf1e39": "GetherCoin()", +"86d01727": "setPendingTaxParameters(address,uint256)", +"86d08447": "getTestThree()", +"86d0b46d": "foundersTokensPercent()", +"86d0b48c": "round3Sold()", +"86d12325": "preSaleDistributionContract()", +"86d1a69f": "release()", +"86d23143": "getLastAcceptedProposal(bytes32)", +"86d263fe": "MarketCollateralPool(address)", +"86d2ee85": "HOLDING_START()", +"86d2fe57": "privateSaleStartDate()", +"86d35ed9": "getCrypton(uint256)", +"86d3a2b8": "setContributorCap(uint256)", +"86d3cf0d": "crazyearners(uint256)", +"86d3f4b7": "ethRateURL()", +"86d4c423": "UBTC()", +"86d4ebf7": "test_BasicThrow()", +"86d4fe9c": "viewTokensRemaining()", +"86d4ff1d": "canSell(address)", +"86d518bf": "grantAccessMint(address)", +"86d53469": "sendPreSaleETH()", +"86d54fe1": "EtherFundMeCrowdfunding(string,string,string,uint256,uint256,uint256,address,address)", +"86d59996": "deleteValidationData()", +"86d5c5f9": "getPassportLogicRegistry()", +"86d5e9a6": "setTokenNameSymbol(string,string)", +"86d6c8a0": "getTankProduct(uint32)", +"86d6c9d1": "canHolderTransfer()", +"86d74037": "distributeToken(address)", +"86d8aab4": "cancelMultipleOrders(address[3][],uint256[3][],uint8[],bytes32[],bytes32[])", +"86d922a9": "lastCallTime(address)", +"86d9b0c5": "make(address,uint256,bool)", +"86da69f0": "gamble()", +"86dbfa98": "DINTToken()", +"86dc88ff": "addMadeTX(address,uint256,uint256,uint256,uint256)", +"86dc8ace": "pendingVestingPool()", +"86dcbefc": "test_registerWithoutCertification()", +"86dd03bd": "setRedeemLevel(uint256)", +"86dd5e03": "setBossRoundNumber(uint256)", +"86de99dd": "SetStatus(uint256,uint256)", +"86def3b9": "getDukeDate(string)", +"86df3d5b": "getCreateOrderMinGasNeeded()", +"86e1e589": "NamiAddr()", +"86e261c9": "updateSecondAmount(bytes32,bytes32,uint256)", +"86e2c40c": "removeAffiliate(uint256)", +"86e3060d": "nextFlexibleReward()", +"86e32cb5": "setSpecialFeePercent(address,uint256)", +"86e32ed0": "setAllowedContract(address)", +"86e36ce2": "speechOfOwner(address)", +"86e37ae7": "tokensForFight()", +"86e399c1": "priceDivisor(uint256)", +"86e476dd": "communityAddress()", +"86e49407": "setFeeUnit(uint256)", +"86e4993c": "issue(uint256,uint256,address[],uint256[])", +"86e4a33e": "countBtcAddressLeadingOnes(bytes,uint256)", +"86e4e178": "CheckTickets(address,uint256,uint256)", +"86e58bef": "del_user(bytes32,bytes32)", +"86e58c0c": "getGalleassTokens(address,bytes32,uint256)", +"86e5ceb4": "previousRoundJackpot()", +"86e6361e": "setSellInfo(uint8,uint256,uint256)", +"86e6eee1": "INEX_Token()", +"86e8c57a": "secondroundprice()", +"86e92957": "lastDecimal(uint256)", +"86e97442": "mora(uint8)", +"86e99bdb": "XTOToken()", +"86eb23ca": "getOrganizerSymbol(uint256)", +"86eb3899": "lockPeriodForBuyers()", +"86ec6177": "endEvent()", +"86ec8f62": "validateTokenProperties(uint256)", +"86ecce90": "test_5_assertGasUsage1400Boards()", +"86ed60e9": "getSpawned(uint32,int256)", +"86ee8f01": "masterAddress1()", +"86ef1be2": "getRegistered(uint256,uint256)", +"86efb94e": "addressHistoryOf(uint256)", +"86f10e8b": "divForEthertoteLiquidatorWallet()", +"86f1865d": "_bcto(uint256,uint256,uint256,uint256,address)", +"86f19dde": "phase6Price()", +"86f1f2d4": "mintDigitalArt(string)", +"86f254bf": "minConversionRate()", +"86f28fe3": "token_member_order(address,address,uint256)", +"86f2907a": "doesEventExist(bytes32)", +"86f2e5cf": "_setHairColorValue7(uint256)", +"86f32586": "checkIfFundingCompleteOrExpired()", +"86f328a9": "episodes(uint256)", +"86f35b7c": "FeeCalculation()", +"86f3c026": "UpdateMoney(address)", +"86f3d0cd": "limitedDeposit()", +"86f5114e": "voteName()", +"86f5bf88": "interestPermil()", +"86f6e410": "adminIsAdmin()", +"86f7313d": "ico_enddate()", +"86f7993e": "acceptCooOwnership()", +"86f79edb": "getMessage(uint256)", +"86f822fa": "DunkPayToken()", +"86f876e2": "hyperEnable(address,bool)", +"86f8950a": "getUnclaimedBalance(address)", +"86f8bce9": "tixFundDeposit()", +"86f8e4ef": "mintFinalize(address,uint256)", +"86fa0671": "tokenShareShow(address)", +"86fa18df": "throwsWhenTransferingFundsDuringSale()", +"86fb8715": "ArbitratedBuyDeposit(address,string)", +"86fbb494": "DigixbotConfiguration()", +"86fbeb8c": "investors(uint16)", +"86ffe00f": "preSaleMaxTokens()", +"87000d42": "clearBetMap()", +"8700522a": "setLandProductionMultiplierCCUser(bytes32,address)", +"8700ceb2": "sellCertainOrder(uint256,uint256,uint256)", +"87011092": "refundContributor()", +"8701a2f0": "finishBet()", +"8702735c": "setCapitol(uint256,uint256)", +"8703b7d8": "setPOOL_edit_4(string)", +"8703e506": "stage4Bonus()", +"87040a86": "AddHOLDer(address)", +"87045369": "setCanCall(address,address,bytes4,bool)", +"870488f9": "sendTokensToInvestors(address,uint256)", +"8704c6ac": "MAXIMUM_CONTRIBUTION_LIMITED_PERIOD_USD()", +"87055008": "euroLock()", +"8705ae63": "migrationChain(uint256)", +"8705f218": "RemoveOwnerAddress(address,address)", +"8705fcd4": "setFeeAddress(address)", +"87067595": "MagicToken(uint256,string,string)", +"8706ab57": "setE4RowPartner(address)", +"8706b052": "PGD()", +"8707ee3e": "formatDate(uint256)", +"8708b5b2": "sourcePrice()", +"870911ff": "onExchangeTokenToEther(address,uint256,uint256)", +"87092940": "calculateInterest(address,address)", +"8709bece": "availablePrivateICO()", +"870b399a": "LOCKUP_6M_ICO_TIMESTAMP()", +"870b8b94": "hasFiveYearWithdraw()", +"870baf84": "sendToGiveth()", +"870bb8c2": "CROWD_WEEK1_PERIOD()", +"870bfc75": "lockMultis()", +"870c426d": "getUniverse()", +"870c8079": "getGovernmentAddress()", +"870dbae0": "TOTAL_MAX_CAP()", +"870e5405": "insert(bytes32,bytes32,int256)", +"870f0e27": "developmentLockEndTime()", +"870f892d": "getGTOAddress()", +"8710296f": "totalEarlyPurchaseRaised()", +"871105cc": "setVaultContractAddress(address)", +"871113c3": "oraclize_query(string,string[1],uint256)", +"87113b88": "managerListMap(uint256)", +"87114b8c": "versionInfo(uint256)", +"87115a9d": "setRemainingHealthAndMana(uint256,uint32,uint32)", +"8711e4a9": "lockTimeout()", +"8712523e": "lastTransferBlock(address)", +"87127f85": "ZeonToken()", +"8712c1c5": "freeTotal()", +"87136940": "tokenRateInUsdCents()", +"871388c9": "SetGene(uint256,bool,uint64)", +"8713d931": "BONUS_100_250()", +"8714b028": "offers(uint256,uint256,uint256)", +"8715d65d": "TierWildcatDividendAddress(address)", +"87161e59": "commandGetBonus()", +"871625e2": "retraitStandard_2()", +"871745aa": "presaleAddTree(address,address)", +"87174c3e": "refundManager()", +"87178668": "RATE_DAY_14()", +"8717ef27": "setVotingParams(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"87182d47": "totalSecondICOSupply()", +"87191e41": "isWhalePaying()", +"87195d23": "getInstallments(bytes32)", +"87196863": "_lower(bytes1)", +"8719715e": "walletAvatar()", +"8719e8ac": "setStatus(uint256,bool)", +"871b4e3c": "getCardBuyAuction(uint256)", +"871c7aab": "total_freeze_term()", +"871caa98": "dataOf(uint256)", +"871cc9d4": "decrementNumber()", +"871ced4a": "HeartBoutToken()", +"871cf692": "pullEtherFromContractAfterPreICOPrivate()", +"871d3eab": "addExtraDays(uint256)", +"871da475": "GetSellPrice()", +"871e0155": "pushNodeGroup(uint256,uint16)", +"871e5fac": "contributorsCurrentPeriod()", +"871fe6e1": "_validateHardCap(uint256)", +"872053e6": "releaseThisBonuses()", +"8720bb42": "liantoken()", +"87210f63": "tokenMainSale()", +"87214728": "contractIsCanceled(string)", +"8721db89": "requireKyc(address[])", +"8722860e": "isThereAnOnGoingProposal()", +"8722a57c": "forwarderOf(address)", +"8722d4d9": "enforceAddressMatch()", +"8723202e": "NewSmartSharingContract(string,uint256,uint256,string,string,string)", +"8723c377": "shiftOut(bytes,uint256)", +"8724025e": "AENIGMAZ()", +"8724e751": "Panax()", +"87250a35": "getSkull(uint256)", +"872519cd": "VerifyAccount(address,bool)", +"872539e7": "numberOfLeafs()", +"872588ba": "lock(bytes32,bytes32,bytes32)", +"8725d6be": "createToken(uint256,uint256,uint256,address,uint8)", +"872628e8": "setPriceStep2(uint256)", +"8726baf7": "unapproveArtist(address)", +"87275aba": "preMinting(uint256,uint256,uint256,uint256)", +"8727b7fc": "calculateAmountBonus(uint256)", +"87280324": "callMe(bytes32)", +"87281fab": "VestingReleased(uint256)", +"87283f0f": "ActivationRequest(address,bytes32)", +"87287fd7": "setMinFee(uint8)", +"872887c2": "getPeriodStartTimestamp(uint256)", +"87297093": "previousWithdrawal()", +"8729fff4": "buyCommission()", +"872a4e32": "change_min_price(uint256)", +"872a7810": "revocable()", +"872b31b6": "_removeStakeholder(address)", +"872bac57": "UpdateEmployee(address,uint32,uint32,uint16)", +"872bc83a": "GCCExchangeCore()", +"872d637f": "DivvyUp(bytes32,bytes32,uint8,uint8,uint256,uint256,uint256,address)", +"872dbdab": "advert_machine()", +"872dd49b": "getMigrateOutAttoTokens()", +"872dd84b": "priceBeforeGoalReached()", +"872f2526": "getGuestOrders(address,address)", +"872f5459": "toUINT120(uint256)", +"872fe620": "withdrawByResque()", +"87319e1e": "changeContractRegisterOwner(string,string,string,string,address)", +"8731a8d9": "deposit(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256,string)", +"8731cce5": "PledgePaymentCanceled(uint256)", +"87324ef0": "ecrecover2(bytes32,uint8,bytes32,bytes32)", +"8732d065": "ignoreKYCLockup()", +"87330b85": "getString1()", +"87336473": "unblockTransfer()", +"87338e98": "jackPotBestHash()", +"8733d130": "ownerManualMinter()", +"8733d4e8": "identityOwner(address)", +"8733f360": "initialize(address,address,uint256,uint256,address,address,address,address,address,address,uint256)", +"8734ffc9": "authorizedETH(address)", +"87355084": "transferCrowdsale(address,uint256)", +"8736381a": "contractCount()", +"87369c4b": "BOUNTY_EXCHANGE_SHARE()", +"87369e04": "refundTransactions(uint256)", +"8736fd16": "getRefStatus(uint256)", +"87393bc6": "verifyFirstHalf(uint256[4],uint256[4])", +"8739cacf": "getJobRating(address,uint256)", +"8739f930": "queryGameHistoryLength()", +"873a2878": "acceptWork(uint256)", +"873a5690": "VikkyToken()", +"873ab2ce": "computeFeeRate(address)", +"873b3009": "getKeyRevisionNumber(uint32,int256)", +"873bdee0": "systemWithdraw(address,uint64)", +"873c56d7": "officialLimit()", +"873cb0ab": "redeemedKarmaOf(string)", +"873cdb03": "Litas()", +"873db84c": "queryN_fnc()", +"873dc3b3": "bountyOnlineGW()", +"873dc71d": "getCycleInfo()", +"873ebe6a": "collect(address[],uint256[])", +"873f610c": "Contractors(uint256)", +"873f9a6a": "registerDIN(address)", +"873fd089": "isStaker(uint256,address)", +"87407993": "inQuitLock(address)", +"8740b73d": "EthereumGoldPro()", +"87412a4b": "TeamAndPartnerTokensAllocated(address,address)", +"8741ab49": "setupCompleteFlag()", +"8741f15e": "tileBalance()", +"874252ef": "giveProgectTokens(address,uint256)", +"8742792f": "changeNameByEveryone(string)", +"8742fc3b": "getVoteResult()", +"8744e974": "CallOption(address,uint256,uint256,uint256,uint256,uint256)", +"87451d52": "addQuickPromoBonus()", +"8745ddb3": "jailAmountOf(address)", +"8746656f": "extendDuration(uint256)", +"874752b4": "SpiceMembers()", +"8747a674": "getWrapperBalance()", +"8747f9b1": "resultReject()", +"8748ecda": "Dynamic1_5x(uint256)", +"87491c60": "closeMinting()", +"874a7036": "placeNotes(uint256[],uint256[],uint256)", +"874b4fcc": "setSigningPublicKey(string)", +"874b953a": "changePrimaryApprovedWallet(address)", +"874d6d81": "getWeek()", +"874d73a7": "addLottery(string,uint32,uint32,uint32,uint32,uint32,uint32)", +"874f33a1": "doStuff()", +"874f874c": "reminderCalc(uint256,uint256)", +"874f8ef6": "getAdv(uint256,uint256)", +"874fe370": "finalizeTS()", +"874ff7ed": "YOYOW(address)", +"8750367e": "FundRequestPublicSeed(uint256,uint256,address)", +"8750c2d7": "priceInTokens()", +"8751775b": "cancelRewardsWithdrawal()", +"87521056": "createMineForToken(uint256,uint256,uint256,uint256)", +"87524581": "accounts(address,uint256)", +"87526b0a": "totalPendingPayments()", +"87528d5e": "setInitAttr(address[],uint256,uint256)", +"87529f0f": "getTeam(address)", +"8752cff2": "isUserExisted(address)", +"8753b16e": "requestOwnership(address)", +"87541c9e": "setLLV_edit_3(string)", +"87543ef6": "upgradeController()", +"87548fcf": "getTracks()", +"8754b1d1": "createPainting(address,uint256,uint256,uint8,uint8,uint256,uint256)", +"8754b29c": "buyCore(address,address,uint256)", +"87551db0": "getChecksum(string,string,string)", +"8755b065": "initialTransfers(address[],uint256[])", +"875606a1": "freezeTransfer()", +"8756f3e7": "LogErrorMsg(uint256,string)", +"8757a2cd": "test_depth(uint256,uint256)", +"8757d620": "firstBuy(string)", +"87585707": "buyVouchers()", +"87586b32": "getPI_edit_2()", +"8758ba8f": "approveForGeneLab(uint256)", +"875991eb": "dealLog(uint256[2],bytes32,bytes32,uint8)", +"875999e0": "getLastKeyTime()", +"8759afc9": "_initStages()", +"8759c2f1": "getHappinessCitizens(uint256)", +"8759d1c3": "sendReceivedTokens(address,address,uint256)", +"875a8dfc": "post(address,string)", +"875ac8f1": "PAYOUT_DATE()", +"875ad967": "DopeRaiderCore()", +"875c330c": "LogPush(address,uint128,string)", +"875c7143": "setSecondYearAllowancePercentage(uint8)", +"875cb3e5": "closeSuccess()", +"875dc0ee": "changePaymentDestination(address)", +"875de431": "phaseOneBonusPercent()", +"875e7bb4": "FactoringChain(address)", +"875ea5e7": "dividend(uint256)", +"875ed7ae": "unitEquippedItems(address,uint256)", +"875f0671": "crowdsaleStatus()", +"875f71a3": "ETHDistributor()", +"875fde3d": "createErc20Token(string,string,uint256,uint256)", +"876012fc": "composeJingle(string,uint32[5],uint8[20])", +"87609d1a": "__price()", +"8760b171": "getBPhashFromBPTokenId(address,uint256)", +"87612102": "loadRefund()", +"87615cb2": "enableRegulator(address,string)", +"8761fb7c": "escrowAdmin()", +"87627869": "setCopaMarketAddress(address)", +"8762d50b": "_xx()", +"87630a2e": "activateContract(address,address)", +"876339b8": "_sellPutToOpen(uint256,uint256,uint256,uint256,address)", +"8764159e": "findContractByModName(string,string)", +"8764edd0": "VerificationAccountOnJullar()", +"876588b8": "Apply_Store_Id_Fee()", +"876590c3": "setTeamPrice(uint256[],uint256[],uint256)", +"876777d0": "TTCoin()", +"87679684": "checkProof(bytes,uint256,bytes,bytes)", +"876848d3": "valid(uint80)", +"876911ca": "ArrAccountIsFrozen(uint256)", +"8769817a": "CROWD_WEEK1_BONUS()", +"87699aa6": "TOKENMOM()", +"8769bc7e": "currentSpiderOwner()", +"8769beea": "openESOP(uint32,bytes)", +"8769c281": "allowRefunds(bool)", +"8769c28c": "bogotacoin()", +"876b0946": "NucleusVisionToken()", +"876b0a95": "getDiceWinAmount(uint256,uint256,bool,bool)", +"876b1566": "getTokenHolders()", +"876ba3cd": "transferModeratorship(address)", +"876cf0ef": "getCrystals(address)", +"876da006": "TOKECOIN()", +"876e79f6": "targetDiscountValue7()", +"876ee240": "EthWuxia()", +"876f1c27": "replaceAnimal(uint16)", +"876f20b1": "crownSymbol()", +"876f5746": "ShitcoinCash()", +"876f9795": "mineSalary(uint256)", +"877046a2": "CGCCoin()", +"87708311": "OBEFAC(address)", +"87717cb1": "_hackoinToken()", +"8772a23a": "configured()", +"8772ae3c": "setMinimumBet(uint256)", +"87730ed7": "allocateFundsBulk(address[],uint256[])", +"87734d53": "getBet(address,uint256,uint256)", +"8773c0d0": "buySoul(address)", +"8774e5d0": "setPriceInWei(uint256)", +"87757835": "Ducker()", +"8775a557": "DadaCollectible()", +"877653f0": "_storeBalanceRecord(address)", +"8778205d": "TransferDisable(uint256)", +"8778c090": "arrayOfNonTrivialAccounts()", +"87793dc7": "invokeOnceFor(address)", +"877aaf4f": "tosToken()", +"877af5b4": "subFundAccount()", +"877b9a67": "isIssuer(address)", +"877c2184": "getIntValue(string)", +"877c3650": "getproductprices()", +"877c4f6e": "submitPeriod(uint256,bytes32,bytes32)", +"877cedb8": "Lockup12m(address)", +"877d481c": "startStage3()", +"877ddd77": "commission_ratio()", +"877f5618": "isAllowClaimBeforeFinalization()", +"87800ce2": "MD5FromMarketingKeywords(string)", +"87801cc3": "setNextRoundDonation(uint256)", +"87804708": "_validate()", +"8781249f": "getCntByRarity(uint8)", +"8781382e": "WBU()", +"878170d1": "fetchValue()", +"878314c9": "crowdsale_eth_fund()", +"878377e7": "RAM_Token()", +"8783bf1a": "EGGS_TO_HATCH_1DRAGON()", +"8783d407": "feeReplyThread()", +"87848727": "writedb(string,string,string)", +"8784ea96": "getCommit(bytes32)", +"87864af8": "UNFREEZE_TEAM_BOUNTY()", +"87873b6d": "MoneyTreeToken()", +"87874e02": "getNextAvailableLevel()", +"87877e4d": "setSponsor(string)", +"8787c9ff": "approveCertificate(address,address)", +"8787f75d": "Kodobit()", +"878808af": "tokensSoldGoal()", +"87881ede": "getStackholderConfirmations(uint256)", +"8789dfbf": "instContAllocatedTokens()", +"878a18ef": "tokensSentDev()", +"878c1484": "cause()", +"878d4204": "testInitialCrowdsale()", +"878d5ff7": "partnerInfo(address,address)", +"878de0ae": "userEndGameConflict(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,uint256,address,bytes,bytes32)", +"878e10e4": "SEHR_WALLET_ADDRESS()", +"878e8827": "getActionParameterByIndexes(uint256,uint256)", +"878eb368": "cancelAuctionWhenPaused(uint256)", +"878eb4ca": "serviceDeposit()", +"878edb66": "getVotesByPollingStation(address)", +"878ef7fe": "RealMadrid()", +"878fb316": "btycsell(uint256)", +"87902997": "acceptAndAdditionals(bytes32,uint256[])", +"87903097": "timeoutPlayer(uint256,address,uint256,uint8)", +"879125a4": "setMaximumRate(uint256)", +"87914c6f": "prolongateContract()", +"879206a2": "lastPayerOverflow()", +"87924815": "ownerAddressSize()", +"87925132": "PandaCore()", +"879281c4": "login(bytes32)", +"87932e0f": "setAddress(bytes32,address,address)", +"87934ec8": "skinCreatedLimit()", +"8793ae52": "getCurrentDaoStakeSupply()", +"87943859": "getRefBonus()", +"879499f4": "newUriBase(string)", +"87950f49": "setDistributorAddress(address)", +"879611bb": "removeGlobalConstraintPost(int256,address,int256,address)", +"879647e2": "getindex()", +"8796a7ba": "totalPrivateSaleStage()", +"8796d43d": "activeToken()", +"8796ec86": "getDocumentHash(uint256)", +"879736b2": "swapValidatorKey(address,address)", +"87982928": "launchPeerWallet(address[],address[],uint256[])", +"879844b9": "crowdsaleAddressSet()", +"87986f52": "getOrderSupportCancel()", +"879a2d2a": "getApplication(address)", +"879a6f7a": "recoverWarriors(uint256[],address[])", +"879a83fc": "LogWithdraw(uint256)", +"879abc11": "applyRuntimeUpdate(address,address,uint256,uint256)", +"879b18b6": "getMemberCanVote(address)", +"879bfa27": "Investors()", +"879ce676": "withinExecutionLimit(uint256)", +"879cffdf": "TokenBuy(address,uint256,uint256,string)", +"879d46fd": "DAOTrust(address,address,bytes,uint256,uint256,uint128)", +"879e4b1a": "empty(bytes32)", +"879e84ab": "minChequeValue()", +"879f30ad": "burnSent(uint256)", +"879f4dfe": "_getCampaign(bytes32)", +"879f9c96": "purchased()", +"87a01164": "teamTransferFreeze()", +"87a04b67": "KUYOOToken()", +"87a07692": "setWinner(string,uint8)", +"87a07adb": "getSharedAccounByIndex(uint256)", +"87a09877": "AdvisorGPX(address[],uint256)", +"87a16f12": "addScriptExecutor(address)", +"87a2a9d6": "_MAXIMUM_TARGET()", +"87a2afb3": "releaseBets()", +"87a378fb": "holdSubscription(uint256)", +"87a3903e": "buy(uint16,uint16,uint16,uint16)", +"87a3be75": "init(address,uint256[],address[])", +"87a3e445": "icoBonus4()", +"87a407a1": "setBurner(address,address,bool)", +"87a675ca": "DataContacts(address,address,address)", +"87a767e3": "removeCA(address,address)", +"87a796a1": "_fetchCancelledOrdersForPayer(address)", +"87a846a5": "getBonus(uint256,uint256,uint256)", +"87a88c43": "iDistribution()", +"87a91506": "PlayChainPromo()", +"87a97752": "setInitialEnemyCombination(uint32[4])", +"87a9a8ef": "totalSupplyAtCheckpoint()", +"87a9be0d": "BitSelectArrojado()", +"87a9c6c5": "buyAndTopup(address)", +"87aa14d2": "freezeEventOutcome(uint256,uint256)", +"87aa2bf9": "rmul(uint128,uint128)", +"87ab42b3": "MysteriumTokenDistribution()", +"87ab8403": "transferScoreToAnother(uint256,address,address,uint256)", +"87adab57": "VISTAcoin()", +"87ae00a3": "ZebiMainCrowdsale(uint256,uint256,uint256,address,uint256,uint256,address,address,address,uint256,uint256,uint256,uint256,int256,uint256)", +"87ae0dbe": "yearSeconds()", +"87af74ab": "calculateNumberOfNeighbours(uint256,address,address)", +"87afe179": "getTotalTicketSetsForRound(address,uint256)", +"87b01dc9": "setSale(uint256,bool,uint256)", +"87b0be48": "releaseTokens(address)", +"87b0d60c": "sumICO1()", +"87b15c0b": "periodITO_wei()", +"87b234ec": "createReferralGiveAways(uint256,uint256,address)", +"87b261ad": "coeff()", +"87b2fe7f": "luckynum()", +"87b30845": "exchangeDIDForEther(uint256)", +"87b3be7d": "Ring()", +"87b47e4f": "transSupply()", +"87b4e60a": "newTokens()", +"87b547e5": "balanceOfDirectoryToken(uint256)", +"87b551b5": "tokenPayout()", +"87b55705": "mintingThreshold()", +"87b57fa7": "GetMinerRigsCount(address,uint256)", +"87b5914c": "exchangeRateETHToUSD()", +"87b5c21f": "OCTWasteToEnergyJV()", +"87b5f114": "xpTokenAddress()", +"87b73795": "verifyKYC(address,address)", +"87b751ae": "TokenTrader(address,uint256,uint256,uint256,bool,bool)", +"87b7a068": "updatesAreAllowed()", +"87b8963c": "badgeDecimals()", +"87b9a544": "DataController(address)", +"87b9e310": "nominPool()", +"87ba67be": "nextLevelPercent()", +"87ba67dd": "Arascacoin()", +"87bab806": "getNumOrganizers()", +"87bb25b5": "UndermineComponent(uint256,address,uint256)", +"87bb675c": "indexTracker()", +"87bb6aa6": "_revealBid(bytes32,address,uint256,address,address,bytes32,uint256,uint256)", +"87bb7ae0": "getTicketPrice()", +"87bc0fc6": "TokenAirdrop(address,uint256)", +"87bc6906": "BitGuildTrade()", +"87bd499b": "lastLevelChangeBlock()", +"87be727b": "getSum(uint16)", +"87bea35f": "getCreatePrice(uint16,uint256)", +"87bf26b9": "GetGrade(uint256)", +"87bf740b": "YYToken(uint256,string,uint8,string)", +"87bfce9e": "claimedYesterday()", +"87c00626": "calcTokensToEthers(uint256)", +"87c05510": "setNewlockAccount(address,uint256,uint256)", +"87c19bcb": "votelog(bool,address,uint256)", +"87c1be6e": "globalPause(bool)", +"87c1ed12": "transferToOwner(uint256)", +"87c23143": "totalEthBankrollCollected()", +"87c2ee62": "secondStageEndsAt()", +"87c38114": "Emojicoin()", +"87c4aaea": "totalTokenVested()", +"87c50df5": "erectBarrier(uint16,uint8,uint8)", +"87c55589": "blockTube(uint256,string,uint8,string)", +"87c5d1be": "LEDTEAM_TOKENS()", +"87c60d89": "getAllSubcontracts()", +"87c70d21": "expressReloadNums(uint256,uint256,uint256[])", +"87c79d1d": "getColors()", +"87c84933": "LogParticipation(address,uint256)", +"87c86277": "setPetName(string,uint64)", +"87c8ab7a": "changeAllowance(address,address,uint256)", +"87c95058": "setAdministrator(address,bool)", +"87cb15f7": "move(uint256)", +"87cc1e1c": "setExporterBank()", +"87ccb440": "getReg2()", +"87ccb57b": "testExecuteSellOrderShouldNotChangeBuyerBalance()", +"87ccccb3": "PublicMine()", +"87ccd8b3": "_isComplete(uint256)", +"87cef144": "updateVIPs(address)", +"87ceff09": "getBlockTime()", +"87cf34cf": "getUserContributionReclaimStatus(address)", +"87cf7768": "walletG()", +"87cfc1d8": "disableAgency(address)", +"87d14a36": "MaxPlayers()", +"87d25299": "tessrX()", +"87d2544d": "CMOSignature()", +"87d3525f": "CancelSimpleOffer_internal(uint256,bool)", +"87d36176": "False()", +"87d3764b": "ROLE_LEVEL_PROVIDER()", +"87d3a184": "makeZero(uint256)", +"87d4ca93": "escrowFrom(address,address,uint256)", +"87d517c9": "fetchInitialDetails(string)", +"87d5418f": "aSetEnd(uint256)", +"87d570c0": "OHGRiverResort()", +"87d5c6b8": "rentalElapsedTime()", +"87d67208": "changeIcoStartBlock(uint256)", +"87d741c9": "getPaidETHBack()", +"87d76f09": "calculateEstimateToken(uint256)", +"87d79f8a": "buyIceDrangon()", +"87d7d24d": "ownerconfirm()", +"87d803a3": "setResult(uint8,uint8,int8)", +"87d81789": "payments(uint256)", +"87d87090": "setMinRefEthPurchase(uint256)", +"87d9d224": "TokenDistribution(uint256,uint256,uint256,int256)", +"87da18ee": "getRankPriceEth(uint256)", +"87da3208": "CollateralToken(string,string,uint256,uint8)", +"87da9cad": "ApprovalToken(address,address,uint256)", +"87db03b7": "add(int256)", +"87dba600": "_set6()", +"87dc0c55": "getAuctionEnd()", +"87dcd2b6": "superOwner()", +"87dcfd2d": "numTokensLeft()", +"87dd1908": "_voteAndContinue()", +"87ddc521": "rewardController(address,bytes5)", +"87dde4ad": "get_candidate(uint8)", +"87ddf6cd": "setAddressArrayIndex(bytes32,uint256,address)", +"87def081": "getFeeRecipient(int256)", +"87df4838": "CancelSell(uint256)", +"87dfc909": "queryMap(uint8,int256[],int256[])", +"87e06546": "PLATINUM_AMOUNT_XPER()", +"87e0f794": "TwistoToken()", +"87e1029a": "newStar(uint8,uint8,uint256)", +"87e12235": "_filiate()", +"87e19cc5": "EBETCrowdsale()", +"87e25e0e": "deleteCertificator(address)", +"87e412f4": "SecurityDeposit(address)", +"87e42622": "KONSTANTOR()", +"87e44935": "IDOToken()", +"87e46baf": "transferVoxel(address,uint8,uint8,uint8)", +"87e4e64d": "getBalanceMy()", +"87e6835f": "tokensDrukker(address,uint256)", +"87e70933": "VoteMusic(uint256,address)", +"87e7dc5f": "ICOStarted(uint256,uint256,uint256,uint256,uint256)", +"87e854d3": "addRate(address,uint8)", +"87e89845": "getBabyMommas(uint256)", +"87e8a980": "godChangeGod(address)", +"87e97e82": "AuctionStarted(bytes32,uint256)", +"87ea8581": "setTemp(uint40)", +"87ea8893": "PGGameToken()", +"87ea9d52": "INK()", +"87eba3c7": "GetBuyingTokenAddress()", +"87ebd76c": "initContract(string,string,uint256,uint256)", +"87ecaf0d": "check2(uint256,uint256)", +"87ed1bd0": "grantAccess(address,uint8)", +"87ed5112": "setApoderadoVerify(bytes32)", +"87ed90ba": "securityWallet()", +"87edb2f5": "decode(bytes,uint256,uint256,uint256,uint256,uint256)", +"87ede474": "MicinRasaJamur()", +"87eeddf8": "confirmAndExecuteWithdrawal()", +"87efeeb6": "singularDTVToken()", +"87f06ec0": "getForkDurationSeconds()", +"87f0b8c5": "getStrong(address)", +"87f0bf31": "addResources(address[],bytes4[])", +"87f0fae9": "setKingdomFactory()", +"87f162c8": "initialEBETSupply()", +"87f1e7f3": "c_softCapUsd()", +"87f24484": "hashPass()", +"87f29fdd": "removeDiscountPhase(uint256)", +"87f3e5d6": "contributorsOfCauldron(uint8)", +"87f404cd": "getContractRhemBalance()", +"87f40ba4": "supplyReserveVal()", +"87f503fd": "DEV_TEAM()", +"87f51ac2": "athToken()", +"87f5c846": "ethBalanceOfNoFee(address)", +"87f6be15": "houseCredits(address)", +"87f74e7c": "updCouponBonusConsumed(string,bool)", +"87f7cab9": "removePerson(bytes32)", +"87f7e2a1": "getTeamCost(uint256)", +"87f9534b": "getLinkedIn()", +"87fc00f7": "setTPTContractAddress(address)", +"87fcd708": "StartICO(uint256)", +"87fcdbc1": "updateConversionRate(uint256)", +"87fd0421": "TheEthereumLottery()", +"87fdc401": "make(address,uint256,bytes)", +"87feba8f": "getInstallmentDuration(uint256)", +"87fef15b": "purchase(bytes32,bytes32,bytes32)", +"87ffe5a7": "dataSourceGetRedCards()", +"8800052e": "preSaleTokensLeftForSale()", +"88016da5": "allocateFrom(address,address,uint256)", +"88017e05": "setContribution(uint256)", +"8801b4fc": "paused_()", +"8801c928": "createJob(bytes32,uint256)", +"88026706": "Template()", +"88034bc5": "CreateTIX(address,uint256)", +"88037e1c": "view_get_gameData()", +"88046818": "getFeeSharingWallets()", +"8804863f": "payWithToken(uint256,address,address)", +"8804d119": "sendNextRewardTo(address)", +"88053eef": "RebuyInformEvent(address,uint256)", +"88054039": "NordstromOnlineRetailDigitalCoin()", +"880613ee": "getMadeTXCount()", +"88064637": "registerAssetDetail(int256,string,string,string,string,string,string,int256)", +"88064b07": "setNextLotteryTTMTokenId10(uint64)", +"88065236": "approvedAmount(uint256,address)", +"88072700": "itemIndexToApproved(uint256)", +"8807592c": "_calculateCommission(uint256)", +"88077b51": "setPrivateFundEnd(uint16,uint8,uint8,uint8,uint8,uint8)", +"8807a110": "isCrowdsaleClosed()", +"8807a468": "getOrgByIndex(string,uint256)", +"8807f36e": "lastInitializedRound()", +"88088a54": "getTransformState()", +"8808f3d0": "canPledge(uint256,uint256)", +"8809540d": "globalReinitialization()", +"8809716c": "setDungeonDifficulty(uint256)", +"880a0664": "getRoundFinish(uint32)", +"880ad0af": "transferOwnership()", +"880ade5b": "foundNewGamblingParty(uint256,uint256,uint256,uint256,uint256,uint256)", +"880b36e7": "getLastCaller()", +"880b844f": "getRoundWeight(uint256,uint256)", +"880c0b9d": "lpAskPrice()", +"880c5f3d": "EtherBTC()", +"880c7864": "ResearchGroupAddr()", +"880cab29": "Founder2()", +"880cdc31": "updateOwner(address)", +"880cfc2f": "deposite(address,uint256)", +"880dc4e6": "isWithdrawEnabled()", +"880e73a3": "OTA()", +"880e87ed": "setUnlimitedMode(bool,address)", +"880ead7e": "returnOtherCrypto(address)", +"880fc14c": "inRate()", +"88102583": "safeCastSigned(uint256)", +"881056ba": "GMR_TOKEN_SALE_CAP()", +"8810ac6c": "BuyCarFailed(address,uint256,uint256)", +"8810c990": "sha3(string)", +"88116d13": "checkReferalLink(uint256)", +"8811a0ae": "addressCount(address)", +"8811e191": "setDebugMode(bool)", +"8812e897": "getCurrentBonus(address)", +"8812ec52": "adviserWallet()", +"8813304b": "forwardOnBehalfWithRevert(address,uint256,bytes,uint256,uint8,bytes32,bytes32)", +"881362b4": "changeUserInfo(bytes32)", +"881461be": "burnAddress(address)", +"88149fb9": "beginTime()", +"8814fa3f": "Log0(string)", +"88157942": "icoStartP3()", +"8815ee86": "purchaserList(uint256)", +"8815f3d3": "judgement(bool)", +"8817a198": "priceToBuyInFinney()", +"8817ecde": "_getPeriodFor(uint256)", +"88180ff6": "underwrite(address,uint256)", +"88185aad": "airDropTokens(address[],uint256)", +"8819dd8e": "getCurrentPeriodKey()", +"881abe3e": "addProposalVote(uint256,address)", +"881adeaa": "abioToken()", +"881b2666": "xTokenPercent_()", +"881be8f7": "undo()", +"881c255e": "updateStageBySaled()", +"881cfeb6": "addInternal(address,address)", +"881d3bd0": "LongBought(address[2],uint256[3],uint8,bytes32[3],uint256)", +"881dac8e": "ECHO()", +"881ed6db": "lockStart()", +"881eeaa5": "createEstateWithMetadata(int256[],int256[],address,string)", +"881eff1e": "setMaxBet(uint256)", +"881fae6c": "endSTO()", +"881fcab3": "getShipProductCurrentPriceByModel(uint16)", +"881fcefc": "updateEnabled(string)", +"881fd690": "isSecondStageTokensMinted()", +"881fe0ce": "ZealconToken()", +"881fe258": "_emitRecord(bytes32,uint256,uint256,uint256)", +"88203417": "AthleteTestToken()", +"8820401a": "_tokenPurchase(uint256)", +"8820e2d6": "newVote(address,string,uint256,uint256,uint256,uint256)", +"8820f6bd": "economy()", +"8821bb43": "change_owned(address)", +"8822048e": "isTransferAllowed(address)", +"8823a9c0": "changeFeeTake(uint256)", +"8823da6c": "removeAccess(address)", +"88254efa": "hideSubcategory(uint256)", +"88257016": "getNthBallot(bytes32,uint256)", +"882645fe": "preICObonusMultipiersInPercent(uint256)", +"8826ce84": "uint8ToString(uint256)", +"8826db7a": "getNextPoliceAssignment(address)", +"8826fa2e": "setStakedBalances(uint256,address)", +"88275b68": "mintLockupTokens(address,uint256,uint256)", +"88279320": "prizeValue()", +"8827a985": "durationPhaseIndex()", +"8829a5a7": "transferAndWriteUrl(address,uint256,string)", +"882a1dee": "KrisTest()", +"882a1fa0": "getDivCard(uint256)", +"882b4e68": "User_2()", +"882bc3e1": "RemoveAllConsentDirectives()", +"882d851c": "tokenMinus(address,address,uint256)", +"882dd41e": "updateTokenBalance(uint256)", +"882e2606": "icoEndLine()", +"882e9709": "record(string,string,string,bool,string,string,string)", +"882ee532": "getBylawsMilestoneMaxPostponing()", +"882f327b": "addLock(address)", +"882f3e16": "forceWithdraw(address)", +"882f7e83": "changeRigoblockAddress(address)", +"88301f57": "subDevOne()", +"88308ca1": "hardCapInCents()", +"8830a718": "BTHRTokenSale(uint256,address)", +"8830e09a": "ATTContribution()", +"88318834": "abandon()", +"8831e9cf": "setPlatformWallet(address)", +"8832243a": "profitSharing()", +"8832bc29": "ETH_PRICE()", +"8832ebe8": "lolita()", +"88331b6f": "amountPower()", +"883356d9": "isBurnable()", +"8833ae6f": "aquaman()", +"8834277e": "emitErrorCode(uint256)", +"8834526a": "MARKET_CAP()", +"883462ca": "removeFromKyc(address)", +"8835097d": "assignedAmountToPrivateEquityFund()", +"88352a29": "signedApproveAndCallHash(address,address,address,uint256,bytes,uint256,uint256)", +"8835ba24": "Legolas()", +"88362d4b": "setDailyLimit(uint256,uint256)", +"88369d6b": "getTokenBalance(address,address,bytes32)", +"8836f3ef": "getNumberOfBounties()", +"8838af8a": "rarityMultiplier()", +"8838b68e": "etherLeft()", +"88394fdc": "startRoundA()", +"8839515c": "OWN_ChangeToken(string,string,uint8)", +"88398fbc": "PreSaleHardCap()", +"883a3ea8": "LottoNumberTest()", +"883a584c": "RichiumToken(uint256,string,string)", +"883a6476": "IsAirDropEnabled()", +"883a92e1": "setFreezeEndTime(uint256,uint256)", +"883a98e7": "addTileBonus(uint256,uint256,uint32[8])", +"883ba26b": "getIsSettled()", +"883ba466": "changeHiddenOwnership(address)", +"883cd1a5": "cloudsPerEth()", +"883cdeb9": "newTrack()", +"883cf630": "resetBucket()", +"883d0ac6": "totalnSupply()", +"883dfaba": "getWinBalancesOf(address)", +"883fd348": "hasAvailableRewards(address)", +"883fdd6f": "IWABOO()", +"88400fbe": "ICO_TEAM()", +"884095f6": "getWineryMappingID(string,string)", +"8841520b": "SpinnerCountsByAddress(address)", +"88416792": "usersPause()", +"88417820": "LBSN()", +"884179d8": "ipfsAttributeLookup(address)", +"8841937a": "setTileHp(uint16,uint8,uint32)", +"8841ac11": "buyItem(uint256,uint256,uint256,uint256)", +"8841dd3c": "thirdRewardPeriodPercent()", +"88426aec": "getStageDeadline(uint8)", +"8842bfa0": "Chain4()", +"8843641e": "removeAmountForAddress(uint256,address)", +"8843c1ba": "listAcceptedTokens()", +"8843c222": "MIN_ACCEPTED_AMOUNT_FINNEY()", +"8843ffba": "signup(uint256)", +"88445e29": "sha3(uint256)", +"884543c0": "TokenBought(address,uint256,uint256,uint256)", +"8846594b": "checkKYC(address)", +"8847092d": "upgradeMaterial(uint256)", +"884790de": "agentInvo(address)", +"8847df97": "ChangeEmissionRate(uint256)", +"88482233": "Lizambo()", +"884870c7": "setParameters(uint256,uint256)", +"884879d6": "startSecondStage()", +"88488c33": "finalizeTask(uint256)", +"8848fb0d": "addEmployerJob(address,address,uint256)", +"884a2308": "setCompte_5(string)", +"884a26da": "massBurn(uint8[],address[],uint256[])", +"884a47b4": "setNews(string)", +"884ade03": "ForceSeller(address)", +"884ae10b": "saleWalletAddress()", +"884b5dc2": "fill(uint256[])", +"884b850b": "BurnAssignedFees(address,address)", +"884bf67c": "getPrizePool()", +"884c1480": "LacesToken(uint256,string,string)", +"884c6440": "BuyItem(uint256)", +"884ca7b1": "getButtonPrice()", +"884edad9": "Withdraw(address,uint256)", +"884f3db0": "check_the_rule(address)", +"884fafcd": "totalJackpotEven()", +"88508a18": "getRecentPlayers()", +"885124c0": "Coin5941()", +"88516a89": "ownerFraction()", +"88519ea4": "availablePreICO()", +"8852024f": "max_TotalSupply_limit()", +"88524780": "saleAuctionERC20()", +"885349a2": "payToBank(uint256)", +"88535e90": "changeMinimumContributionForPublicPhase(uint256)", +"8853636b": "revealResult(uint256,bytes32)", +"885363eb": "landOf(address)", +"88537daf": "checkMiningAttempt(uint256,address)", +"88538c36": "candidateInformation(uint256)", +"885463fd": "strategicAllocation()", +"8854baa8": "AddReturnsMapping(uint256)", +"88550b6a": "getTokenBuyPrice()", +"88559aaf": "processAllocation(address,uint256)", +"8856cd84": "medicaxess()", +"8856d517": "GetReferralInfo()", +"8857322d": "DOLLAR_DECIMALS_MULTIPLIER()", +"885819c2": "getVatIdByAddress(string)", +"8858287b": "vendorCount()", +"8858ad6c": "Exploreon()", +"8858adc6": "setColor(uint16,uint24)", +"8858fa3b": "totalEthReceivedInWei()", +"8859c6d6": "operatorCampaignID(address,uint256)", +"885a3b75": "currentTotalSupply2()", +"885a5ec2": "lastBlock_f10()", +"885a5ef2": "getMinEtherInvest(uint256)", +"885b63da": "setAuctionStartBid(uint256)", +"885b6cfb": "addZethrAddress(address)", +"885c69b5": "clearMetadata(address)", +"885e2750": "groupsCount()", +"885e401e": "lifeFactor_i()", +"885ec18e": "left6(uint256)", +"885f5011": "calcRatioNext()", +"8860565f": "GetBeneficiaryInfo()", +"8860805a": "extractMax()", +"8860bf94": "showworker()", +"8860d49f": "_transferInternal(string,address,string,address,string,uint256,uint256)", +"8861026f": "complianceWallet()", +"8862198a": "MasterContract(address)", +"8862d26a": "offeringType()", +"88631e18": "distribute(address,uint256,uint256,address[],address,uint256[])", +"88635b06": "createContractPerson(string,uint256,address)", +"8863c8d5": "concludeCrowdsale()", +"8863dd1a": "transferOwnerShip(address)", +"8863f31d": "Controller(address,address,address)", +"8864a5fd": "processPendingTickets()", +"8864d074": "RADCOIN()", +"8865015d": "g(uint256[20])", +"886588ac": "confirmVerbose(bytes32,address,uint256,bytes)", +"8865cbd6": "cancelAllOrdersByTradingPair(address,address,uint256)", +"88668d21": "getReplyRaw(bytes32,uint256)", +"88671acc": "FundAllocation()", +"88672f82": "setEtherRate(uint256)", +"88684aa5": "nextUnLockTime()", +"88685cd9": "releasePayment(uint256)", +"886b148d": "setPropertyPrivateModeEarnUntilLastUpdateBecomePublic(uint16,bool,uint256,uint256,uint256)", +"886b4954": "secToNextInterestPayout()", +"886bb359": "chown(address)", +"886bbe0c": "submitProof(bytes32,bytes32,uint256[],bytes,uint256)", +"886c0ee6": "Develop()", +"886d3db9": "uintToBytes32(uint256)", +"886d969b": "calc_partnerPercent(uint256)", +"886db803": "_setBigWinner(address,uint256,uint256)", +"886e549b": "PineappleArcadeTrophy(uint256)", +"886ed2d1": "enableRealWorldPlayerMinting(uint128[],bool[])", +"886ef644": "getRate(address,uint256)", +"8870155c": "getNumTknOfferors()", +"88702cc4": "debug_hash256Double(bytes)", +"88705f7d": "NeoCrowdsale(uint256,uint256)", +"8870985b": "getFreeBalance(address)", +"887159a2": "treatRemaintoken()", +"887240d0": "generateFileID(string,string,string,string)", +"887263cf": "EnigmaToken()", +"88727ba9": "_depositEthers(address)", +"8872bb2a": "_createElement(bytes32,uint256)", +"8872c094": "getUnsoldToken()", +"8872c68a": "sampleStorage()", +"8873704c": "addRequest(string,address)", +"8873d247": "THANKSTEST()", +"8874fa28": "CurrentRevision()", +"88753343": "maxResolvedAgonId()", +"88758581": "unregisterEmployee(address,address)", +"8875a40b": "endTimeTLP2()", +"88760a18": "loadStarbaseEarlyPurchases(address)", +"887651cc": "isAlreadyIn()", +"887699f3": "periodContributionOf(uint256)", +"88770cb0": "extendEndTime(uint256)", +"88776a7e": "testThrowTranferFromEmptyBalance()", +"88780b8e": "safeBalance()", +"88782386": "UnicornMilk()", +"8878356d": "testBetAmount()", +"88786272": "startingTimestamp()", +"8878990e": "changeCollateralSeizer(address)", +"8878adac": "refund_claims(string)", +"8878d726": "buySpecialBuilding(uint256,uint256,uint256)", +"8878db7f": "setCRYPTON_CUT(uint16)", +"887a8e33": "AgencyLock1()", +"887b00db": "TESTTESTICO(address,address,address,address)", +"887b1b0b": "recalculateTokensToBuyAfterSale(uint256,uint256[])", +"887bae74": "addReferenceParentWineryOperation(string,uint256,string,address,int256)", +"887bbef5": "setMinInvestment(uint256,uint256)", +"887bdcfc": "accountBalance(address,address)", +"887c3e5d": "updateAddress(bytes32,address,address)", +"887c4646": "approveIndexedByAddress(address,address,uint256)", +"887c4f68": "ludumTokensPerEther()", +"887c7f92": "remainingReserveSupply()", +"887ccc82": "getStake(uint256,uint256,address,bytes32)", +"887cfc3e": "orderToTransfer(address,address,address,uint256,string)", +"887d23a6": "isBeforeEndTime()", +"887d813d": "serviceGroupGet(address)", +"887e0c07": "runPlugin(address,uint40,uint256)", +"887e22b1": "tier5Time()", +"887f6178": "genericTransfer(address,uint256,bytes)", +"887ffc9c": "referalPayByNum(address,uint32)", +"88806b37": "transferZone(uint256,address)", +"8880a933": "transferTokensToNonEthBuyerToMany(address[],uint256[])", +"8881d3a2": "CompensationFailEvent(address,uint256)", +"8882349b": "vppToken()", +"88824bd1": "PonziUnlimited()", +"88827c16": "addPost(bytes32)", +"8882ddc9": "maxCharacters()", +"8883478e": "preicoAndAdvisors()", +"8883c52a": "getNumberOfAssetPacks()", +"88840671": "Milkcoin()", +"888419ed": "setData_8(string)", +"88849e71": "BasketToken(address[],uint256[],uint256)", +"8884b807": "getVoters(uint256,uint256)", +"8884cd7c": "changeBuyFlag(bool)", +"8884fbec": "checkTotalsAndMintTokens(address,uint256,bool)", +"8885f2a3": "setzBool(bool)", +"88865347": "grapesToBuildWinery()", +"88865ee3": "cleanupEven()", +"8886a667": "registerNameXIDFromDapp(address,bytes32,bool)", +"8886ca33": "getHeroBP(uint256)", +"88873eea": "blocktubeClip(string,uint256,uint256,address)", +"888764c8": "addBouncer(address)", +"888808ba": "Bittelux()", +"88888f61": "purchase(uint256,bytes32)", +"8889025a": "increaseJackpotTimeAfterBet()", +"88896a0d": "deliverPrize(address,bytes)", +"88897c37": "request_close()", +"888a3f79": "_approvedFor(bytes32,uint256)", +"888aab22": "addWithdrawal(address,uint256,uint256,uint256)", +"888ade0a": "publicKey(address)", +"888b6557": "minFundingGoalWei()", +"888d5917": "limitDateCrowdWave2()", +"888ea120": "saleDeadline()", +"888f2b13": "SALE_RATE()", +"88908546": "refund_eth_value()", +"889087b1": "meltCrystals(uint256[])", +"8890e13d": "isArenaContract()", +"88922e7a": "raiseAppeal()", +"889231c1": "promoLimit()", +"889258ea": "startICOStage1()", +"88929931": "UnlockDateExtended(uint256)", +"8892bb73": "createChildUniverse(bytes32,uint256[],bool)", +"8892d571": "withdraw_Leim(uint256)", +"8893240d": "setPeonyAddress(address)", +"88933e07": "getSMPTokensLeftForICO()", +"8893eb13": "getActivated()", +"88945187": "updatePurchasingState(address,uint256)", +"8894dd2b": "addEther()", +"88951352": "distributeTokens(address[])", +"889569cd": "getKoikeContract()", +"88968b94": "rateOwner(uint256)", +"88968bc3": "clearKyc(address[])", +"8897b1a7": "PRESALE_HARDCAP()", +"8897c1f4": "randomNumber(uint256,uint256,uint256,uint256,uint256,bytes32)", +"8897df9d": "addEpisode()", +"8899568c": "createDefaultZodiac(uint256,uint256,uint256,address,uint256,uint256)", +"8899fa0d": "onUnVote(address,int256)", +"8899fffd": "myFinneyValue()", +"889b59d9": "getDBallotsN(bytes32)", +"889c10dc": "addDelegate(address,address,bytes32,address,uint256)", +"889cd532": "upsertOne(address,uint256,bool,bool,uint256)", +"889d227d": "newPaymentAddress(address,bytes4)", +"889d9550": "getCryptoCupTokenContractAddress()", +"889e175e": "__slash__(address)", +"889e5073": "getStatus(address,address)", +"889eaa0d": "nextRate(uint256)", +"889f0c99": "withdrawFor_(address)", +"889fa1dc": "getFighter(uint256)", +"889fb53e": "incrementCoin(address,uint256,bool)", +"88a0e990": "BridgeTheChain()", +"88a12f7a": "_getUint(bytes4)", +"88a15f11": "secondMaxAmount()", +"88a17bde": "allocation()", +"88a1e895": "test2Fails()", +"88a2653c": "unwhitelistAddresses(address[])", +"88a2995d": "MyToken(uint256,uint256,string,string,uint256)", +"88a49164": "testErrorUnauthorizedTransfer()", +"88a4e86c": "balanceOfRaw()", +"88a525c4": "withdrawTokenBalance(uint256)", +"88a55c8b": "setBustRange(uint256)", +"88a6c749": "getFirstTranscoderInPool()", +"88a6cc53": "lockPurchasedTokensClaim(uint256)", +"88a6f02b": "deleteRecord(uint64)", +"88a74525": "fraction(int256,int256,int256)", +"88a79003": "addWhitelistInternal(address,address,bool)", +"88a7ca5c": "onTransferReceived(address,address,uint256,bytes)", +"88a89dd0": "add_to_buy_bounty()", +"88a8b341": "setVoteInternal(uint256,uint160,bool,bool)", +"88a8c95c": "changeDev(address)", +"88a8d602": "management()", +"88a95495": "removeFromMap(uint256[])", +"88aa1001": "checkJoinAirdropQuest(address)", +"88aa8bee": "getTokenDetails(address)", +"88aaa229": "AcceptsIDK(address)", +"88abc4a2": "coinIssuedPrivate()", +"88ac76ca": "cthereum(uint256,string,uint8,string)", +"88ad52f0": "DouYinToken()", +"88adbf8f": "addressOfTokenUsedAsReward()", +"88aebe00": "calculateWineBuy(uint256,uint256)", +"88aece7f": "setBuyOrdersContract(address)", +"88aed238": "ixix()", +"88af30c3": "_mainAddress()", +"88af6534": "VRF_EGG_COST()", +"88af883b": "adm_trasfer(address,address,uint256)", +"88af8ed4": "removeInvestor(bytes32)", +"88afdeba": "totalCreatedGame()", +"88afe426": "_removeAgonIdByOwner(address,uint64)", +"88b02acd": "displayTable()", +"88b11ee2": "DZoneCoin(uint256,string,uint8,string)", +"88b2ed1a": "addPlotAndData(uint24[],string,string,uint256)", +"88b322c3": "setAdvisors(address)", +"88b3a538": "projectManagers(uint256)", +"88b44c85": "assertEq(uint256,uint256,string)", +"88b45046": "income()", +"88b4b861": "proposeTo(address)", +"88b51ac0": "gernerateVoting(uint256,uint256)", +"88b55641": "buyTokenIco(address,uint256)", +"88b59734": "vendueClosed()", +"88b5f6f3": "PimpToken()", +"88b75493": "getLastAuditAuditor(address)", +"88b7a17c": "functionName(bytes32)", +"88b7a89d": "test0_create()", +"88b7e6f5": "returnInt128(int128)", +"88b7f5e5": "advisersWallet()", +"88b8c487": "playerWithdraw()", +"88b9022f": "semanticVersion()", +"88b95242": "PricingEnergy(uint256)", +"88b9a469": "initVault(uint256)", +"88b9e10e": "seizeTokens(address,uint256)", +"88bac2b8": "Mediated_Transfer(uint256,address,address,uint256)", +"88bb0c73": "teamsReward()", +"88bb18fc": "mintDSBCToken(address,uint256)", +"88bb6e68": "AkershoekToken()", +"88bb9fb1": "MultivestSet(address)", +"88bc65e3": "getFreelancerAvgRating(address,address)", +"88bec9da": "deleteMember(uint256)", +"88bf60b7": "transferMinimumFee()", +"88bff117": "setDrop(bool,uint256,uint256)", +"88c058a5": "subDefence(uint256,uint256)", +"88c0b8a7": "setChangeFee(uint32)", +"88c0bc8e": "buyTokensWithReferrerAddress(address)", +"88c12be2": "deathData_f0()", +"88c190a4": "NiMingToken(uint256,string,uint8,string)", +"88c2a0bf": "giveBirth(uint256)", +"88c30278": "getMinerOffsetOf(address)", +"88c3ba85": "ParallelGambling()", +"88c3ffb0": "getRoundInfo(uint256)", +"88c463af": "contributorsOfCauldronRound(uint8,uint32)", +"88c4e888": "get_token_state()", +"88c55c47": "initializeVesting(address,uint256)", +"88c600d0": "CryptoCongress(address,uint256,uint256)", +"88c662aa": "getController(address)", +"88c6abf8": "currentIteration()", +"88c7b6e6": "CrowdSaleMacroansyA()", +"88c7e397": "buyable()", +"88c8475c": "batchFreezeAccount(address[],bool)", +"88c8da99": "deactivate_admin_comission()", +"88c912b8": "sendToAddressWithBonus(address,uint256,uint256)", +"88c91d24": "computeCooldownTime(uint128,uint256)", +"88c91fb1": "transferExtender(uint256)", +"88c9a7d5": "setPixels(uint32,uint32[],uint8[])", +"88c9cb3c": "timer()", +"88c9ebbd": "getKeyPrice(uint256)", +"88cac17d": "setNextLotteryTTWTokenId3(uint64)", +"88cb214e": "editWhitelist(address,bool)", +"88cb8a73": "setPixelBlockPrice(uint256,uint256,uint256)", +"88cbc84a": "buyInvestmentPackage(uint256)", +"88cbdf13": "toUint32Throw()", +"88cc58e4": "getFactory()", +"88cc81de": "PaymentExpectationCancelled(bytes8)", +"88cc852a": "notZero(address)", +"88cca295": "addressToPurchasedBlocks(address,uint256)", +"88ccf2b9": "SetTokenInfo(uint256,address,uint256,uint256)", +"88cd2d47": "UserCRUD()", +"88ce3048": "lastweek_winner3()", +"88cee87e": "adminRemoveRole(address,string)", +"88cf2bc6": "buyStarCoin()", +"88cf6648": "liquidationPriceWad()", +"88d0443d": "bounty_address()", +"88d0820e": "selfFreeze(bool,uint256)", +"88d0b42d": "getRecentActivity()", +"88d115af": "PonyCore()", +"88d116b8": "_createPlayer(string,uint256,address,uint256)", +"88d12a4d": "totalWeiReceived()", +"88d18ea4": "featureSprite(uint256)", +"88d21ff3": "pollExists(uint256)", +"88d2faf9": "publishMemberEvent(address,uint256)", +"88d450e4": "setArtistsAddressAndEnabledEdition(uint256,address,address)", +"88d52ef7": "poolContract()", +"88d60e27": "setPercentTokenAllocation(uint256,uint256,uint256)", +"88d695b2": "batchTransfer(address[],uint256[])", +"88d723ac": "TetherToken(uint256,string,string,uint256)", +"88d761f2": "finishMigration()", +"88d7cd97": "externalStorage()", +"88d7e087": "withdrawChi()", +"88d8c702": "Summary(address,uint128[])", +"88d8da5f": "equals(string,string)", +"88d937a3": "createnation(uint16[],string,uint256)", +"88d97c30": "getGroupPageCount(string)", +"88d9fc4d": "updateReserveVault(address)", +"88da9bfd": "getUserNumbersOnEther(uint256)", +"88db84bc": "getRequiredStateChanges()", +"88dbe7a7": "dividendBonus(address,uint256,uint256)", +"88dc0d49": "TRcoin()", +"88df13fa": "multiMint(uint256,uint256[])", +"88df31f0": "minDiscountEther()", +"88dfee60": "setOtherFounder(address,uint256)", +"88e01a98": "closeRound(uint256)", +"88e072b2": "checkTransfer(address,uint256)", +"88e114cc": "log_approve(address,address,uint256)", +"88e16190": "ItemCreatePrice()", +"88e2af0e": "initialBattle(uint256,uint256)", +"88e2ca21": "getClue4()", +"88e2da99": "randDelay()", +"88e2f29b": "updatedPrice()", +"88e3c5d6": "addVerifiedUser(address)", +"88e3cfda": "setResult(string)", +"88e3ffeb": "updateMinimumWeiRequired(uint256)", +"88e47f29": "_ChallengeSucceeded(uint256)", +"88e490eb": "getInfoCellBalance()", +"88e4b6ad": "calculatePotCut(uint256)", +"88e5581e": "twitterDropSingleAmount(address[],uint256)", +"88e62721": "revoke(address,bytes32)", +"88e67d96": "isAccess(address,string)", +"88e694aa": "MANNCOIN()", +"88e765ff": "maxBuyAmount()", +"88e814e6": "getTopPlayers()", +"88e85127": "ModeratorAdded(address,address,bool)", +"88e854e0": "SDR(uint256,string,string)", +"88e8e26a": "ServiceToken()", +"88e90253": "NewRateSet(uint256)", +"88e951dd": "totalContributors(uint256)", +"88e9d45d": "ButtonClickGameContract()", +"88e9fb4f": "keyEmployeesAllocatedFund()", +"88ea41b9": "setMinBet(uint256)", +"88ea70ee": "bountyTokensAddress()", +"88ea8ee5": "bonusCRS()", +"88ea8fd8": "manualUpdatePrice()", +"88eb615c": "LogWhiteListed(address,uint256)", +"88eb7af7": "_isHuman()", +"88eb944b": "addDedication(uint256,string)", +"88ebf975": "setDebt(uint256,address)", +"88ec6f42": "Cef()", +"88ec838f": "configParams()", +"88eccb09": "addLevel(uint256,uint256)", +"88ed8b36": "notRandomWithSeed(uint256,uint256)", +"88ede276": "hasBeenConstructed()", +"88ee4b2d": "_getIdIfValid(bytes32,uint256)", +"88eea4f3": "WhiteBitcoin()", +"88ef59fb": "releaseOldBalanceOf(address)", +"88efc97b": "activateEscapeHatch()", +"88efedf4": "AIRDROPS_PERIOD()", +"88f020bb": "drawWinner(uint8)", +"88f1ccf2": "cancelInvestment(address[])", +"88f2b12e": "SerpentHead()", +"88f34bc2": "depositAndVote(uint256,uint256,uint256)", +"88f53db1": "getDataRequest(uint256)", +"88f5eb36": "exchangeRateForBTC()", +"88f6d5a4": "constructCoinbaseTx(uint256,uint256)", +"88f7c6d6": "setExchangeStatus(bool,bool)", +"88f9ff98": "_random256()", +"88fabb3a": "SetMessage(string)", +"88fad42a": "EthereumRisen()", +"88fb4af0": "ShootRobinHood(uint256,string)", +"88fc0825": "unregisterNode(uint256)", +"88fc176c": "DucToken(uint256,string,uint8,string)", +"88fc65fb": "isTransferable(address,uint256)", +"88fcba88": "fundingDeadline(bytes32)", +"88fd0b6e": "getMembershipPrice(uint8)", +"88fd35e8": "setConfiguration(uint256,uint256,int256)", +"88fdf3d4": "setWinnerPrizes(uint32)", +"88fedd04": "houseProfit()", +"88ff2dcc": "createProject(string,address,address)", +"88ff9416": "initialize(address,address,address,address,address,address,address,address,uint256,uint256,uint256,uint256[])", +"88ffc33e": "bltMasterAcc()", +"88ffe867": "pledge()", +"89009ab0": "purchaseAd(uint256,uint256,string,string)", +"8901b9ae": "withdrawBalanceFromAdmin(uint256)", +"89020fe3": "PacifistFarmer()", +"89029d8c": "get_all(uint256,uint256)", +"89034082": "issueToken(address)", +"8905fd4f": "reclaimERC20(address)", +"89064fd2": "approveWithSender(address,address,uint256)", +"89065e9a": "getPlayerSpaceshipOwnerById(uint256)", +"89077ad2": "SharderToken()", +"8907e787": "isAccountWhitelisted(address)", +"89080102": "verifyDSHash(uint8,bytes,bytes)", +"8908017f": "calculatePhoenixPoolCut(uint256)", +"890814f8": "bountyValue(uint256,uint256)", +"890853d9": "HuatUSD()", +"8908e693": "setTokenCurator(address)", +"890a018d": "externalSales(uint8[],bytes32[],address[],uint256[],uint256[])", +"890a7ef7": "publish(bytes,string)", +"890a9917": "privateSaleMinContrAmount()", +"890ac366": "mintReserve()", +"890b2adc": "Reply(bytes32,bytes32,uint256)", +"890c6848": "WallCoin()", +"890d6908": "solve()", +"890e2a6b": "updInvestorPreSaleEnabled(address,bool)", +"890e839f": "isOnSale()", +"890e9d2f": "getAllowanceSpenderValue()", +"890ea91a": "creditsOf(uint256,address)", +"890eba68": "flag()", +"890ed1cb": "dealHouseCards()", +"890ede44": "TokenCoin5()", +"890f2168": "crowd_end_date()", +"8910b070": "NUC()", +"8910cd58": "substractLockedAmount(uint256)", +"89110058": "Investments(address)", +"89113858": "IHCToken(uint256,string,string)", +"8911cd9a": "silverPercentage()", +"8911cf0d": "unsafeResignOwnership()", +"8911e26b": "isUnrestricted()", +"89128b70": "get_submission_queue_length()", +"8912ab5c": "dropVotes(address[])", +"89135ae9": "setAdministrator(bytes32,bool)", +"891363a6": "lastCWCETH()", +"8913b809": "initPlayers(uint32,uint32)", +"891407c0": "purchaseTo(address,uint256)", +"8914f1e1": "getDepositAmountFor(address)", +"89158ff9": "assignDispute(string,address,string,address)", +"89165dcb": "changeEtherDeltaDeposit(address)", +"8916cbc6": "minRedeem(address,uint256,uint256)", +"8918485b": "setEthlanceSponsorContract(address)", +"8918ab1b": "Sumte()", +"89198fed": "fulfilled(bytes32,address)", +"8919e3b6": "VinzCoin(uint256,string,uint8,string)", +"891a2f31": "buyItem(string,uint256)", +"891a3e23": "gettotalEth()", +"891a8b85": "ethPriceInUSD()", +"891aab6a": "addStaffWhitelist(address[])", +"891acff7": "updatedPrice(string)", +"891c738a": "isTransPaused()", +"891d4fe8": "printContent()", +"891de9ed": "fromTLA(string)", +"891df671": "registeredAt(uint256)", +"891e6f43": "thisContract()", +"891e75bf": "preSaleCreated(uint256,uint256,uint256)", +"891f5ce5": "successfulFunding()", +"891fa67d": "PsyMultiSig(address[],uint256)", +"891fe103": "typeBuffPercentage()", +"89206411": "batchAttachAssets(uint256[])", +"8920bcf9": "mediaToken()", +"8921329f": "registerBlog(string)", +"89222698": "SetWriter(address,bool)", +"89224227": "haltDirectTrade()", +"892250a7": "commonBudgetAdress()", +"89225c5a": "bountyManagerAddress()", +"89231bcc": "getDataNum()", +"89233fbd": "getPlayerGuessNumbers()", +"892412f0": "availableInventoryOf(uint256)", +"89244e2a": "dateEnd()", +"8925d7bb": "getTotalBrags()", +"8925f9e9": "getWorseOrderId(bytes32)", +"89266fca": "tokensSoldOnPublicRound()", +"8926f723": "GMBCToken()", +"89273f15": "addStorage(string)", +"89281963": "setServicestationAddress(address,address)", +"8928378e": "getMarketPrice(uint256)", +"89286abd": "freezeAccountTransfers(address)", +"892886e1": "PresaleTokenPurchase(address,address,uint256,uint256)", +"89291b05": "updateSubscription(address,bool,uint256)", +"892a0e42": "releaseToSeller()", +"892ad596": "changeTimes(uint256,uint256,uint256,uint256)", +"892c0214": "NumberOfCurrentBlockMiners()", +"892cd384": "CreditHydraToken()", +"892d31e8": "setEndCloseSale(uint256)", +"892db057": "isTokenEscapable(address)", +"892dfdf6": "transferDisabled()", +"892e0614": "distributeDivs(uint256)", +"892e243a": "directorName()", +"892e3f98": "setContributionInWei(uint256)", +"892e8dd9": "getViewDataByIndex(uint256)", +"892ee1a2": "removeUserFromBlacklist(address)", +"892ef672": "getACLRole8972381298910001230()", +"892f81df": "initializeTreasure(uint256)", +"89301afc": "Registrator()", +"8930c702": "updateWhitelist(address,address,uint8)", +"89311e6f": "startIco()", +"8931c998": "calculateTokenPresale(uint256,uint256)", +"89320239": "WHP()", +"89320771": "FDC(address,string)", +"89325127": "test_require()", +"89327ad5": "transfer_single_token_balances(address)", +"8932da79": "additional_price_money()", +"8932dc3d": "publishResult(string,string)", +"893372ca": "cancelPending(bytes32)", +"89337e84": "createTokens(bytes32[])", +"89341f6e": "TCASH()", +"89349217": "GamersCoin()", +"8934d115": "verifyUrl(string,string)", +"8935556d": "setDividends(uint256)", +"8935860d": "transferAgent(address)", +"8935b613": "setContentsManager(address)", +"8935ced5": "weightOf(uint256,address)", +"8936b8d4": "getCurrentRateInCents()", +"8937a0e8": "Guestbook()", +"8937d3dd": "Champion()", +"8937e223": "distoryAndSend(address)", +"8938656b": "getGeneratorsIds()", +"893880b6": "purchaseShareContract(address)", +"8939f5f6": "recoverCat(uint256)", +"893ae703": "bonusInPhase4()", +"893b3dd5": "setFreeze(string,bool)", +"893b746a": "cooperateRewardSupply()", +"893b8b0a": "getCategoricalMarketNumTicks(uint256)", +"893c1d31": "bountyReserveTokensDistributed()", +"893cebb3": "createSalesOffer(bytes32,address,uint256,bool)", +"893cf478": "chargeVerificationFee(address,address)", +"893d20e8": "getOwner()", +"893d4948": "JTEToken()", +"893fb18e": "buyout(uint256,bool,uint256,uint256)", +"89400fcc": "SkillCoin()", +"89402a72": "__default__()", +"8940aebe": "publicKey(uint256)", +"8940afe7": "testFailBurnGuyNoAuth()", +"8941db65": "addTime()", +"894306d5": "CanChange()", +"89443aac": "bttsVersion()", +"89452488": "NEBC(uint256,string,string)", +"8945a8af": "TOKEN_RESERVE1_CAP()", +"8945b1fc": "takeOwnership(string)", +"8945d643": "m_softCap()", +"8945e00d": "getForkCalled()", +"89462c38": "setContract2(address)", +"89465d2e": "dataForWithdraw(address)", +"8946d33f": "SplitterEthToEtc()", +"89473a0e": "PRCT100_D_TEAM()", +"89476069": "withdrawToken(address)", +"894766dd": "setTotalCoins(uint32)", +"89483926": "checkGainsToReceive()", +"894875cf": "_decimals18()", +"8948fe67": "wlDuration()", +"89495172": "convictFinal(uint256,uint256)", +"8949e109": "curReward()", +"894a62b3": "addContributionList(bytes10,string)", +"894a93e2": "tgeSettingsPartInvestorIncreasePerStage()", +"894b8d2e": "victorieumStatic1Token()", +"894ba833": "disableContract()", +"894ca160": "CanToken()", +"894cd9b6": "placeBuy(address,uint256,uint256)", +"894cdcc1": "ADXToken(address,address,uint256,uint256,uint256,address,uint256,address,uint256,address,uint256)", +"894d05b5": "buy_drink(uint256,uint256)", +"894d6ef9": "TripCoinTeamAddress()", +"894d7b08": "claimTokenBonus(address)", +"894e036d": "callAndReward_2(string,string,uint256)", +"894e5e1f": "GEE()", +"894e5f2d": "isUserAuthorized(address)", +"894ee6d9": "_getTimeValue(address,address)", +"894f6531": "SingleTokenLocker(address)", +"894fefeb": "TokenHeld()", +"89506a44": "MAX_TRANCHES()", +"89514f6e": "setSummary(string)", +"89519c50": "refundTokens(address,address,uint256)", +"895224db": "testControlBlobStoreNotRegistered()", +"89523d77": "removeProperty(bytes32)", +"895274bb": "getPlayerSpaceshipBattleLevelById(uint256)", +"8952877b": "storeProof(bytes32)", +"8952f965": "isTransferConfirmed(uint256)", +"8954f5b1": "winChoice()", +"895594f6": "setEarlyParticipantWhitelist(address,bool,uint256,uint256)", +"895595d5": "firstRoundICODiscount()", +"8955ed7e": "claimBalanceOwnership()", +"895678a2": "expireDelay()", +"89568a13": "TSTEST1()", +"895693a9": "getToBalance()", +"8956fceb": "addAlt(address,uint256,uint256)", +"89574144": "GXESwapper()", +"89578145": "checkIfYearHasPassed()", +"8957d6f2": "numOfLegendary()", +"8957f8bf": "getLastMoveTime(uint16)", +"89596409": "getMigrateState()", +"89597595": "HCLCToken(uint256,string,string)", +"8959cbfe": "punksOfferedForSale()", +"895a8cfb": "secondWeekMainICOBonusEstimate()", +"895ab68c": "canCallDefault(address)", +"895abac9": "landPriceCandy()", +"895b327e": "isTokenActive(address)", +"895b4da7": "RunSale()", +"895bf2e1": "tickets10price()", +"895c1596": "getExpectedTotalTokens()", +"895c1bdb": "setStatus(address,address,uint8)", +"895c4c39": "unlockDevSupply()", +"895c666a": "createCommonPlayer()", +"895cf354": "validCertificators(address)", +"895d4e1b": "getMiningDetail(uint256)", +"895e8b23": "_tokenExists(uint256)", +"895ec54c": "getPack(uint256)", +"895ee30d": "Purchase(address,address)", +"895f468b": "markAllRead()", +"895fb022": "purchase_car(uint256)", +"89604ed0": "rebalance_delete(uint256,bool)", +"89611d0a": "checkIfSignedBy(bytes32,address)", +"89612f95": "setPrivateSaleTokensSold(uint256)", +"896131ca": "NewEntry(address)", +"896147e1": "ratePre()", +"8962aead": "setPOOL_edit_23(string)", +"896317b8": "getAssetType()", +"89637214": "presalePiTokensLimit()", +"896372b4": "addLogBlock(uint256,uint256,uint256,string)", +"89638de3": "setItemNotForSale(uint256)", +"8963c04b": "tokenSaleTokenBalance()", +"8963dab4": "getNodeId(bytes,bytes)", +"89658163": "setPath(uint256,uint256,bytes,bytes)", +"8966321e": "canTransfer(address,address,uint256,bool)", +"89666fd6": "adminSetPercentInvite(uint256,uint256)", +"8966768f": "confirmOracle(address,uint256)", +"89668a39": "addOpenRoomCount(address)", +"89675cac": "set(address,address)", +"89676b27": "storePrizeMoney()", +"89685242": "isValidPeriod(uint256)", +"8968c17c": "BlockchainCutiesCore()", +"8968db88": "GazeCoin()", +"896941e1": "ethTransfertoKYC(address,uint256)", +"89698f02": "recordContract()", +"8969fb5f": "USDETHRATE()", +"896a17a4": "releaseRestBalanceAndSend(address)", +"896ca3f4": "put_purchase_for(uint256,address,address,uint256,uint256,uint256,address,bytes)", +"896ce019": "getDailyTransactionVolumeSending()", +"896d505a": "setReport(uint256,bytes)", +"896d807a": "setAttribute(bytes32,string,uint256)", +"896e0349": "TokensClaimed(address,uint256)", +"896ed75a": "refuseAddress(address)", +"896f40dd": "ownerOnly()", +"896f8b4c": "changeEthBackRate(address,uint8)", +"897032e3": "ClipToken()", +"8970430e": "IcoContributed(address,uint256,uint256)", +"8970a0f4": "getFinalPayoutDistributionHash()", +"8970d84c": "_tokens()", +"89712af3": "longTermHolding()", +"8971739b": "getVIPCount()", +"8972feba": "reserveTokensGroup(address[],uint256[])", +"8973123c": "saleStartDate()", +"8973d0cf": "CoinwareToken()", +"8973e316": "resolveSellCityForEther(uint16)", +"8974372d": "payFund()", +"897463aa": "startContribution()", +"89749adb": "BuyTokens(uint256)", +"8975e45f": "currentNumberOfUnits()", +"89760e0a": "stateIndexToOwner(uint256)", +"89765328": "totalInvestmentOf(address)", +"8976762d": "setA_Signature(uint256)", +"8977f909": "UTCStart()", +"89781912": "setAllowedAddresses(address,bool)", +"8978fc79": "batchDistributeFees(uint256,uint256[])", +"89790192": "WithFee(address,uint256)", +"897a7dab": "createTokens(uint256[],address[],bytes32[],uint256[],uint256[],bytes32[])", +"897b0637": "setMinAmount(uint256)", +"897c41dd": "showInvestorVaultFull(address)", +"897c8613": "payContributorByAdress(address)", +"897cb036": "softCapTokens()", +"897cceee": "lockContract(bool)", +"897d2b10": "getPixelArray()", +"897d55cd": "migrationGetBoard(bytes32)", +"897e47f5": "setDateMainEnd(uint256)", +"89800cc2": "mtrContractAddress()", +"89804ddc": "getSagaExchanger()", +"89805f30": "s32(bytes1)", +"89805fc6": "PPCContract()", +"8980f11f": "recoverERC20(address,uint256)", +"89813984": "isWhitelistAddressListed(address)", +"8981a7ca": "actionA(uint256)", +"8981d077": "lockForWork(address,address,uint256)", +"8981d513": "owner(bytes12)", +"89826963": "changeICOStartTime(uint256)", +"8982b185": "buySEKU(uint256,uint256)", +"8982d772": "submitInitialEmptyState(bytes32,uint64,uint256[2],bytes32,bytes32,uint8)", +"898366d7": "ETH888CrowdsaleS2(address,address)", +"8983d2e9": "goldSymbol()", +"8984034f": "emitPriceUpdated(uint256,uint256)", +"898403c3": "getCurrentBlockTime()", +"8984e5dd": "_subBalance(address,uint256,address)", +"89850fae": "nextStep(uint256)", +"89852db2": "PARSEC_CREDITS_MINIMAL_AMOUNT()", +"89853691": "readUint256(bytes32)", +"89859b50": "updateLatestTree(bytes32)", +"8985a309": "setAllowedAddress(address,address)", +"8985abc8": "publicSaleAmount()", +"898644cc": "getFreeMiner(address)", +"89864915": "TyzonSupply()", +"89869163": "claimFailedConsensus(address)", +"8986ff32": "setEndTimeIcoStage3(uint256)", +"898855ed": "changeName(bytes32)", +"89885a59": "tokenOwnerOf(uint256)", +"8988b284": "isMod(address)", +"8988c1ff": "LogWhitelistUpdated(address)", +"8988d59e": "Transfer(address,address,uint256,address,bytes,bytes)", +"89895d53": "orderBlockNumber(bytes32)", +"89897104": "_buyRank(address,uint256)", +"8989851c": "operationList(uint256)", +"898a1813": "expectationsLeft()", +"898aa23b": "setPriceInCents(uint256)", +"898ad5ec": "set_arbits_presale_open(bool)", +"898b7663": "add_profit(address,uint256)", +"898c94b7": "SetDidPayOut(bytes32,bool)", +"898ce10c": "ChangeItemOwnerID(uint256,uint256)", +"898dc9b6": "setData_31(string)", +"898e3950": "addWinner(address,uint256,uint256)", +"898f767b": "precioether()", +"898fb033": "updateDescription(bytes)", +"898fdf94": "claimRate()", +"8991dede": "Falcon()", +"89920edf": "mintLockCashout(int256,address,uint256)", +"899231ef": "PRE_ICO_MINIMUM_CONTRIBUTION()", +"8992ae0e": "UBETCOIN_LEDGER_TO_LEDGER_ENTRY_DOCUMENT_PATH()", +"8993021b": "risks(bytes32)", +"899346c7": "nextPositionId()", +"89935c39": "getAmbientTempControlLimits(bytes32)", +"8994fa53": "TopUpMember()", +"89952097": "releaseRestBalance()", +"8995305e": "AsterionWorldToken()", +"89975389": "newVoting(string)", +"89976229": "setAmout(uint256)", +"8997f8cf": "getTokenUpdatedCounter(uint256)", +"8998470d": "tradeIntentOf(address)", +"8998ef19": "withdrawTokenMaker(address,uint256,address)", +"899942b8": "Devcon2Token()", +"899967b7": "redeemExcluded(address[],uint256[])", +"8999dd63": "ESoulToken()", +"899a0e7e": "OpenAIBlockChainToken()", +"899a1e36": "addBounty(address,uint256)", +"899aa65c": "Judged(uint256,bool,address,bytes32)", +"899ae006": "createBabies(uint256[],uint256[],uint256[],uint256[])", +"899b3414": "updateCoupleImageIPFShash(string)", +"899b53c9": "RICHToken()", +"899b64d9": "tokensPerEther_denominator()", +"899b6713": "VIRTToken()", +"899bf897": "isAllowedToRedeemNow()", +"899c0360": "getVIPRank(address)", +"899c4434": "testValidateTrade(address,address,address)", +"899d1556": "firstRoundICOTokensLimit()", +"899d840f": "PayPoker(string,string)", +"899e0fc9": "balanceOfPot()", +"899e37b9": "mintAndLock(address,uint256,uint256)", +"899e87f3": "AmountSet(address,uint256)", +"899ecf2b": "phase3EndBlock()", +"899f107d": "roomNightsOfOwner(uint256,uint256,bool)", +"899f9d29": "YCBToken()", +"89a0b679": "setContributor(address,address,bool,uint16,uint16,address)", +"89a2662f": "NeonCoin(uint256,string,string)", +"89a27984": "phepToken()", +"89a30271": "USDC()", +"89a3a00d": "addMinutes(uint256,uint256)", +"89a3e807": "Corban(address)", +"89a419e1": "set_stage_Days(uint256)", +"89a451fb": "getPriceChannel(string)", +"89a45223": "testFailCreateWithParentsParentNotInUse1()", +"89a4931d": "maxContributionAmountContract()", +"89a4bd1b": "foundationHashed()", +"89a4c1a0": "DevAddress()", +"89a5f2df": "privateSaleBonus()", +"89a69c0e": "setSubRegistrar(bytes32,address)", +"89a7adcc": "DelSocialAccount(bytes32,bytes32)", +"89a81e83": "validPurchase(uint256,uint256,uint256)", +"89a83701": "level(address,address,uint256)", +"89a8814d": "GetLastName(uint256)", +"89a9453a": "removeAllowedContracts(address[])", +"89a9d38e": "_approve(address,address,bytes32)", +"89a9d6b4": "tokensRemainingStage3()", +"89aaad29": "currencyUpdateAgent()", +"89abeb19": "ProcessGameExt(uint256)", +"89ad0a34": "setLocked(address,bool)", +"89ad0efd": "calculateAmountOfUnits(uint256,uint256)", +"89ad50e3": "CindicatorTalk()", +"89ada759": "availableBountyCount()", +"89ae1c90": "nativeReputation()", +"89aeca76": "registrars(address)", +"89af049d": "removeNacFromNLF(uint256)", +"89af175c": "RiservaETH(uint256)", +"89af2dce": "getBalanceFrom(address)", +"89afaf9d": "AddMod(address,address,bool)", +"89afc0f1": "operatorFee()", +"89afcb44": "burn(address)", +"89b13814": "Killable()", +"89b1714b": "simpletransfer(address,uint256,uint256)", +"89b1802c": "feesRateCongres()", +"89b1fa0a": "ROLE_TRANSFER()", +"89b2050b": "addExtraBalance(address,uint256)", +"89b2b09e": "ABDEL_ADDRESS()", +"89b2df31": "getTurn(uint16)", +"89b337a7": "GetCityData()", +"89b38d2f": "getInvoicingAddressByIndex(string,uint256)", +"89b3f8c7": "Flames()", +"89b49d61": "checkCapNotReached(uint256)", +"89b4a36f": "Depot()", +"89b4c550": "checkAndSendPromoBonus(uint256)", +"89b51f94": "setCommunityAddress(address,address)", +"89b52360": "referralCount()", +"89b52b9b": "sendCoin(address[],uint256[],bytes32)", +"89b540aa": "FuckYou()", +"89b5b514": "maxFinalStage()", +"89b5ea24": "outputMoney(address,uint256)", +"89b61a85": "updateVeifyFee(uint256)", +"89b68f40": "releaseFounderTokens()", +"89b7e746": "getMyOpenedCount(address)", +"89b898b8": "batchConvertIntoHtlc(bytes32[],address[],uint256[],uint256[],uint256[],bytes32[])", +"89b8b492": "read(uint64)", +"89b8db55": "minBounty()", +"89b933cd": "serviceFallback(address,uint256,bytes,uint256)", +"89b9572f": "RBTToken()", +"89b97d07": "totalSite()", +"89b9defb": "buyTokenForAddressWithEuroCent(address,uint64)", +"89ba3b23": "confirmDepositQuest(address)", +"89ba8e61": "getExplicitStrategyState()", +"89bb55c7": "apply(bytes32,uint256,string)", +"89bc0e6e": "UnitedToken()", +"89bc2006": "BagPackToken()", +"89bc455d": "THO()", +"89bca2d5": "addAuctionItem(uint256,uint256,address,uint256)", +"89bcbee2": "DemoToken()", +"89bcf968": "timeExpires()", +"89bdb217": "totalTeamFundMinted()", +"89be87a1": "openChannel()", +"89bfc6be": "PIVOTCHAIN()", +"89c0b25c": "openDispute(address,string)", +"89c1108d": "isTimeVault()", +"89c186d5": "addNewBusinessWallet(address)", +"89c18b48": "EtherusToken(address)", +"89c19ddb": "concat(string,string)", +"89c2443e": "executeSelfdestruct()", +"89c29b61": "calculatePaycheck(uint256)", +"89c44def": "sendMileStone(address,uint256,uint256)", +"89c5077f": "withdrawDevFee(address,uint256)", +"89c55845": "setBonus(uint8[5])", +"89c5ee3b": "executeAfterFinalize(bytes)", +"89c67976": "getAcceptance(bytes32,address)", +"89c698d4": "CrypteriumToken()", +"89c73565": "birthBlockThreshold()", +"89c766fd": "pause_for_maintenance()", +"89c77dfe": "mintValue()", +"89c7abfd": "removeAdministator(address)", +"89c7e70c": "BitliquorStandardToken(uint256,string,uint8,string)", +"89c98c06": "getMaxGasPrice()", +"89c9c44a": "EmontFrenzy(address)", +"89c9c586": "slopeDuration()", +"89c9e80f": "PotOwner()", +"89cb29dd": "nextEscrowId()", +"89cbc416": "tokensRedeemed()", +"89cc5c2b": "createdBlockOnRevealsPhase(uint256,address)", +"89cc5ea8": "bid(string,address,uint256)", +"89cc81c1": "contribute(bytes32)", +"89ccd39a": "set_address_A(address,address)", +"89ccf28c": "checkCapAndRecord(address,uint256)", +"89cd4b5e": "decidingBlock()", +"89cda6a8": "pausePVP()", +"89ce16cc": "maxRange()", +"89ce33bd": "delegateERC820Management(address)", +"89ce555c": "devFeesAddr()", +"89ced196": "setNotUpdatable(bytes32)", +"89cf3204": "insurance()", +"89cf5604": "releaseReserveTokens()", +"89cf9f94": "_reserveRefTokens(address,uint256)", +"89cfa823": "addPendingWithdrawal(address,address,uint256)", +"89cfd71b": "setPrivate(uint256)", +"89d2fca3": "DoctorChainToken()", +"89d3a15b": "addNewBlock(bytes32[],bytes32,bytes32)", +"89d3ed8d": "defineDiscountBorderLines()", +"89d410e9": "setIcoOwner(address,address)", +"89d4a66c": "internalDeposit(address,uint256)", +"89d59ee5": "createPersonalDepositAddress()", +"89d5da3b": "AlphaMarketICO(address[])", +"89d61942": "nextAuctionSupply(uint256)", +"89d61d77": "setOrganizer(address)", +"89d67775": "window1TokenCreationCap()", +"89d6d69d": "stampIndexToApproved(uint256)", +"89d700a5": "TheGTokenTest(uint256,string,uint8,string)", +"89d75221": "revokeSignToCancelAgreement(uint256)", +"89d77f82": "blocksToWaitLong()", +"89d86c5d": "getRetailer(uint256)", +"89d8b472": "_error(string)", +"89d8ca67": "drawPot(bytes32,bytes32)", +"89d8f96f": "getDirectOffersComissionRatio()", +"89d9b059": "refillRatifiedMintPool()", +"89d9ed38": "reserveFunds(address,address)", +"89da85d3": "getNumberOfArticles()", +"89dbeb64": "fundForAirdrop()", +"89dc8719": "getUserMaxPurchase(address)", +"89dcbbf9": "getFreeLobster()", +"89dcd64f": "saiTub()", +"89dd9e22": "changeBrick(uint256,string,string,string,bytes32[])", +"89ddeff3": "neurodao()", +"89de2581": "SetStorageContract(address,address)", +"89df1b01": "setMultiRequestLastRequestId(uint256,uint256)", +"89e198b4": "validContract(uint32,uint32,address)", +"89e2605d": "setReleaseAmountToCreator(uint256)", +"89e28a47": "getGameResults()", +"89e2c014": "allocateVestedTokens(address,uint256,uint256,uint256,uint256)", +"89e2d8bb": "handlePayableSharesDelta(uint256,uint256)", +"89e40af2": "stageSum(uint256)", +"89e42346": "enableRefund()", +"89e478f6": "minGasForDrawing()", +"89e4e22b": "pingDelta(uint256)", +"89e52771": "getTeamAddresses()", +"89e582c4": "FuturXe(uint256,string,string,uint8)", +"89e6359f": "preIcoEthers(address)", +"89e63a60": "conversionHashes(bytes32)", +"89e6579b": "registerExchange(address,address,bool,bytes4[])", +"89e6b5fb": "transferOwnership(address,bytes32)", +"89e7b8f6": "frozenFundsOf(address)", +"89e7f5cb": "OCZAPI()", +"89e85217": "teamBalance()", +"89e877a3": "activateWhitelist()", +"89e8beb3": "_strConcat(string,string)", +"89e94513": "advance(bytes15,uint32,uint64,uint64,int64,uint64)", +"89e96773": "BEY()", +"89ea2cb7": "onRefundPollFinish(bool)", +"89ea642f": "getString()", +"89ea770a": "grantTokensAdvisors(address,uint256)", +"89eaa610": "userAccess(address)", +"89eb313a": "isReadyToMate(uint256)", +"89eb4fee": "MYJ256()", +"89ebe846": "loyaltyWallet()", +"89ecd0e8": "disableAllowBuy()", +"89ed0b30": "setOraclizeGas(uint32)", +"89ed2ebf": "_transferDrone(address,address,uint256)", +"89ede784": "starbaseCrowdsale()", +"89edf114": "referralOwnerPercent()", +"89ee8758": "Daz()", +"89eea0eb": "tetherCount(address)", +"89eedf00": "setPdfHash(bytes,bytes)", +"89ef40e7": "numberOfHealthyGenerations()", +"89ef75b1": "purchaseWithPromoter(address,address)", +"89ef8292": "bulkTransfer(address[],uint256[],address)", +"89efa1b5": "registerEtherBalance(address)", +"89f0151c": "addAttribute(bytes32)", +"89f03ebc": "Incrementer2()", +"89f0ccba": "pre_start()", +"89f12d00": "minBlockNumber()", +"89f12ed9": "novaAddress()", +"89f182aa": "createMilestoneAcceptanceProposal()", +"89f1c26e": "minterTransferFrom(address,address,address,uint256)", +"89f1d38d": "Swap(uint256)", +"89f21090": "singleValueAirDrop(address[],uint256)", +"89f224a8": "EthlanceJob(address)", +"89f27d55": "transferItem(uint256,address,uint256)", +"89f37c45": "test_invalidThrow()", +"89f395de": "tos()", +"89f47b64": "doCrowdsaleMinting(address,uint256)", +"89f4ed7a": "getLastTag(uint256)", +"89f4fd57": "getUserProxy()", +"89f63f50": "teamb()", +"89f650fd": "next(bool)", +"89f6709c": "longRecord(address,uint256)", +"89f6e826": "drainRemainingToken()", +"89f71d53": "lastAction()", +"89f85a4b": "BalanceLocked(address,uint256,uint256,uint256)", +"89f8601e": "Engraved(address,bytes32)", +"89f88d7a": "Chess(bool)", +"89f8ab94": "lastRateUpdateTimesForCurrencies(bytes4[])", +"89f91592": "agreeWithdraw(uint256)", +"89f915f6": "getNumbers()", +"89f9b01e": "countingMeme()", +"89fa413d": "tradeRobot()", +"89facb20": "INTERVAL()", +"89fb75f9": "amountOfStage(address,uint256)", +"89fc01f6": "GetBidSeries(address)", +"89fcd099": "getApproval(address,address)", +"89fd14a1": "raiseTrivialThreshold(uint256)", +"89fdd81d": "PRE_ICO_LIMIT()", +"89fe141a": "maxSupplyPossible()", +"89fe253a": "BountyCampaingWallet()", +"89fe5273": "getTokensToSend(uint256)", +"89fe8507": "setNumbers(uint256)", +"89fee530": "CBSToken(string,string,uint8,uint256,uint256,uint256,bool,bool)", +"89ff7fe0": "getCurrentBlockNum()", +"8a007d86": "preSaleMinPaymentWei()", +"8a007f30": "endGame(uint256,string)", +"8a00a82f": "withdrawRewardFor(address)", +"8a010c22": "changeBankAccount(address)", +"8a0193ac": "getGameExpired(uint256)", +"8a024a3f": "releaseINAToken()", +"8a03ad86": "getUserAddressById(uint256)", +"8a0490db": "PrakashToken()", +"8a0520fb": "isApprovable(address,uint256)", +"8a054ac2": "d()", +"8a059493": "fetchRoundIndexBySnapshotBlock(uint256)", +"8a05ad20": "TokensIssued(address,address,uint256)", +"8a05e478": "instantiate(address,address,bytes32)", +"8a063d91": "rewardThree()", +"8a066045": "unescrowFrom(address,uint256)", +"8a06cb71": "get_config()", +"8a06ce1b": "setTotalSupply(address)", +"8a0807b7": "indexOf(string,string)", +"8a0904da": "mainSale_EndDate()", +"8a098cd7": "bucketManager()", +"8a0a53d5": "BicycleSupply()", +"8a0c47cd": "changeWallet(uint8,address)", +"8a0cbf50": "VCCoin(address)", +"8a0cc3c6": "SMILO_COMMUNITY_AMOUNT()", +"8a0e5a75": "addToPublicSaleWhitelist(address[])", +"8a0e859f": "isDiamondAuction()", +"8a0f1e52": "PlayerBet(uint256,uint256)", +"8a107a31": "generate(string,address,address,bytes32,uint256,uint256)", +"8a1129f1": "unfreeze_start_date()", +"8a120dc9": "testBitEqualFailIndexOOB()", +"8a124744": "SiuToken()", +"8a127931": "profit5eggs()", +"8a13796e": "CERB_Coin()", +"8a13aa4b": "takeEth()", +"8a13aa4f": "WorldToken()", +"8a13eea7": "erc20Token()", +"8a1427d1": "addReferrerDefaultRate(address)", +"8a1489e3": "viewInvestorDividendHistory(uint256)", +"8a14f12c": "totalWagered()", +"8a155171": "availableForWithdrawal(address,address)", +"8a157df3": "createAuction(uint256,uint256,uint256,uint256,uint256)", +"8a157fae": "getEthBase()", +"8a1678a4": "LUMA()", +"8a17041a": "_founder_one()", +"8a17164c": "distributeTokenSaleJackpot(uint256,uint256)", +"8a172f2e": "getPawnEngine(uint256)", +"8a175ac2": "enableContribution(bool)", +"8a186788": "lookupIndex(uint256)", +"8a18a804": "UnsoldTokensBurnt(uint256)", +"8a18c55f": "SMT()", +"8a192c70": "setWLMTfinney(uint256)", +"8a194223": "Cryptolotto6Hours(address,address,address,address)", +"8a196437": "VRJToken()", +"8a19ac6d": "fechAllVoteResultPreRoundByBlock(uint256)", +"8a19b4d2": "addAdmin(address,address)", +"8a19c8bc": "currentRound()", +"8a19e355": "addToBalance(uint256)", +"8a1abbcf": "_getClientSupply(address,uint256,uint256)", +"8a1af4c4": "addOperator(address,address)", +"8a1b991d": "SBCE(uint256,uint256)", +"8a1bb169": "getJsonToTokens(string,uint256)", +"8a1bba96": "InvestorSum()", +"8a1bda63": "LogRedistributeTokens(address,uint8,uint256)", +"8a1be474": "CCNCrowdsale(address)", +"8a1d42f4": "setData_4(string)", +"8a1d8ae6": "x32323(uint32,string,uint8,string,address)", +"8a1dd162": "getPixel(uint256,uint256)", +"8a1e1404": "showFPLowerlim()", +"8a1f7a1b": "getMesa(uint256,uint256)", +"8a1fde4b": "setMaxwin(uint16)", +"8a20d00c": "buyTokensFromContract(uint256)", +"8a20f724": "currentRoundIndexByDate()", +"8a20f73c": "isInstrument(address)", +"8a213adb": "testFailMintGuyNoAuth()", +"8a237f27": "F2D()", +"8a2418ab": "nextSeedHashA()", +"8a24fd78": "convertGeneArray(uint256)", +"8a252194": "betGanjilGenap(bool)", +"8a252831": "asyncSend(address)", +"8a25aefa": "TEST_HOUSE()", +"8a2693e5": "kycVerification(address,address,uint256)", +"8a26d4c4": "GBTToken()", +"8a27a31c": "currentBanker()", +"8a27a51c": "transferGiveaway(address)", +"8a27a88b": "recoverAddressFromBalanceProofUpdateMessage(uint256,bytes32,uint256,bytes32,bytes,bytes)", +"8a294c60": "blacklisting(address)", +"8a29b77d": "receiveApproval(bytes)", +"8a2a0879": "TAUKEAYAM()", +"8a2a60ef": "foreignDailyLimit()", +"8a2ade34": "DonationClaimed(address[2],uint256[7],uint8,bytes32[2],uint256,uint256)", +"8a2ae2ab": "killTile(uint16,uint8)", +"8a2bfdf2": "add2Auction(uint256,uint256,uint256,uint256,uint256)", +"8a2cb24d": "castleExpAdjustment()", +"8a2e196c": "NTRYAvailableForSale()", +"8a2e2bf8": "updateLuckpool(uint256)", +"8a2e467c": "firstRoundTime()", +"8a2f6f94": "getRoleStatus(address)", +"8a30442e": "validTransfer(address,address,uint256,bool)", +"8a306c21": "mainSaleSupply()", +"8a31ffda": "replaceBoardMembers(address[])", +"8a323b38": "Contract(uint256,string,uint8,string)", +"8a329809": "setFeeContractAddress(address)", +"8a331846": "dividendParentsPercentage()", +"8a333b50": "max_supply()", +"8a33f585": "getOrder(address,uint32)", +"8a340eab": "BKToken()", +"8a341c83": "testErrorRootAuthorityChangeUnownedPackage()", +"8a34396a": "personalCapActive()", +"8a344477": "putDeed(bytes32,uint256,bytes32,bytes32,uint256,string)", +"8a349cc4": "subscribtionLittafi(uint256,string,string)", +"8a34bb24": "changeContractFee(uint256)", +"8a355a57": "removeProvider(address)", +"8a359d6e": "getEducationCitizens(uint256)", +"8a35b8c7": "invested(address,uint256)", +"8a35f788": "_getWinner()", +"8a36c3dc": "TeamToken(string,string,address)", +"8a36ebc2": "showSmallProfit()", +"8a36f5a2": "Debug(uint256)", +"8a38ab2c": "createCourse(string)", +"8a3907b9": "buyPerSell(uint16,bytes32)", +"8a394c4c": "eraseUnsoldPreSaleTokens()", +"8a39ebdc": "globalPresaleLimit()", +"8a3a84a8": "Total_Payouts()", +"8a3aa194": "endCrowdSaleTime()", +"8a3b0199": "transferOnBehalf(address,address,uint256)", +"8a3bacd1": "backup_drawdown()", +"8a3bc2bc": "iPropose(bytes,uint256,bool)", +"8a3c36cb": "DollHair()", +"8a3c44a5": "Constructor()", +"8a3d6290": "addBountyTransferredTokens(uint256)", +"8a3d7cdc": "tiles(uint256,uint256)", +"8a3db05f": "_myTokeName()", +"8a3e37c3": "StarbaseMarketingCampaign(address)", +"8a3e44d4": "assetMoveInformation(address,address)", +"8a3e99ff": "HighCastleToken()", +"8a3f6e2a": "transferFromAndDepositTokenFunction(address,uint256,address)", +"8a3f8a23": "queryChibi(uint256)", +"8a4068dd": "transfer()", +"8a40bd00": "allowedToUpgrade()", +"8a40c4c4": "Youdeum()", +"8a426b1b": "handleExternalBuyers(address[],uint256[],uint256[],uint256[])", +"8a42b68c": "approveOrderHash(bytes32)", +"8a42ebe9": "set(string,uint256)", +"8a433274": "executeVoting(uint256,bytes)", +"8a43fc7e": "return_rejected_payment(uint256)", +"8a449c2c": "VividoRaidenToken()", +"8a44ae91": "setAUM(uint256)", +"8a45242d": "newGame(bytes32,uint256,uint256,uint256)", +"8a45557e": "flowerTotalSupply()", +"8a4577ea": "returnTokensFromTeamAddress(uint256)", +"8a462fbc": "calculateNewPrice(uint256)", +"8a46467d": "reloadCore(address,uint256,uint256)", +"8a4660fe": "MINIMUM_INVESTMENT()", +"8a468e15": "TBowner()", +"8a469c16": "addGeneralMilestone(string,string,uint64)", +"8a46bf6d": "testFallback()", +"8a47cadb": "SunPowerToken(address,uint256)", +"8a48941f": "getDistributionFacts()", +"8a48ac03": "getAccounts()", +"8a49a3cc": "updateTrustScore(address,uint256,uint256)", +"8a4a8718": "GoinbitToken()", +"8a4a9aab": "xhstoken()", +"8a4af069": "TotalTokenSupply()", +"8a4b08d9": "getPriceRate()", +"8a4be59e": "incentiveDistributed()", +"8a4c81c2": "SEADToken(uint256,uint256,uint256)", +"8a4cae0e": "addVpf(bytes32,uint256,uint256,uint256,uint256,uint256,int256[])", +"8a4d5a67": "content()", +"8a4db4fa": "allowedToBuyBack()", +"8a4e3025": "addStaff(string,uint256)", +"8a4e4639": "pregnantPoniesies()", +"8a4e7a7c": "endCrowdsalePublic()", +"8a4ea479": "addUndergraduate(uint32,string,uint16,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)", +"8a4fb16a": "getWithdrawal(uint256)", +"8a4fbead": "setTokenAllowance(address,uint256)", +"8a4fe8ac": "membersNumber()", +"8a505b4c": "setAutoBuyFee(uint256,uint256)", +"8a5144c0": "estProviderFee(address,uint256)", +"8a519fb9": "BlockChainEnterprise()", +"8a51d0fc": "totalEarlyInvSupply()", +"8a51e8ed": "_timeLimit()", +"8a529159": "KinguinKrowns()", +"8a53360f": "GrantUpdated(address,uint256,uint256)", +"8a53862d": "refundPartCollateral()", +"8a53c3b1": "TeamTokensHolderMock(address,address,address)", +"8a53f230": "noError()", +"8a545aec": "getEngineerPrizePool()", +"8a547932": "sendFounderAndTeamTokens()", +"8a54d6a4": "recordVotes(uint256[])", +"8a55b001": "Sleipnirwallet()", +"8a55d36e": "isStart()", +"8a5651e3": "EMISSION_FOR_PRESALE()", +"8a56b230": "setMiningWarInterface(address)", +"8a56ca45": "lastOwner()", +"8a56d115": "lagDefrost()", +"8a56e85e": "_createRandomDna(string)", +"8a56f3ee": "burnFrom(uint256,address)", +"8a56fe46": "orderExpired(address,address)", +"8a570230": "IDK()", +"8a57af6b": "lockAfter(address,uint256,uint256)", +"8a585214": "BogpillToken()", +"8a5910a5": "RewardTimePeriod()", +"8a593cbe": "pre_ico(address,uint256)", +"8a59eb56": "updateStatus(bytes32)", +"8a5a68f4": "richtokenIndexToOwner(uint256)", +"8a5be698": "balanceOfDerivative()", +"8a5c19c0": "getWeekNo()", +"8a5c9098": "_mint(address,uint32,uint32,uint32)", +"8a5cca14": "AccountTransfersFrozen(address,bool)", +"8a5cd1ca": "updateBlockVoter(uint256,address,bytes32,uint256,uint256)", +"8a5cf5ee": "quarter3()", +"8a5d815e": "finishContract()", +"8a5ddd9b": "emergencyAndHiddenCapToggle()", +"8a5ddf9d": "emergencyRedeem(uint256,address[])", +"8a5fb3ca": "currentFeePercentage()", +"8a604017": "pendingParticipants(uint256)", +"8a6083d2": "changeCrowdfundState()", +"8a609155": "totalUniquePlayers()", +"8a6158f7": "startSettlementProcess()", +"8a61a2a6": "NewKoth(uint256,uint256,address,uint256,uint256,uint256,uint256,uint256)", +"8a61b26d": "startICOPhaseTwo()", +"8a61bb91": "initiateBoardMemberVote(string,bytes32,address[])", +"8a61dcb7": "MiningReward()", +"8a626ba1": "offerPriceCandy(uint256)", +"8a6281f6": "getOwnerInfos()", +"8a62e9e9": "setIgnoreRequestIds(bytes32[],bool[])", +"8a62fd12": "NVTFallback(address,uint256,uint256)", +"8a6508ce": "removeCooldown(uint256)", +"8a653c93": "extGetLock(uint256)", +"8a654a64": "lockedAccountThresholdEth()", +"8a65d874": "userStats(address)", +"8a662b59": "SOLID()", +"8a6655d6": "vote(uint256,uint256,uint256)", +"8a6700e8": "Dex(address,address,address,uint256,uint256,uint256)", +"8a67456a": "contractPaused()", +"8a67c544": "setSchemaValidity(bytes32,bool)", +"8a67f04b": "_payoutMining(uint256,address,address)", +"8a67f4bf": "getRewardsBalance(address)", +"8a684f97": "EthMsig()", +"8a689784": "blocksDelay()", +"8a68ae3c": "transferPaladinOwnership(address)", +"8a69218c": "getLastRewardTime(uint256)", +"8a699023": "phase8Price()", +"8a69fead": "getTitulaire_Compte_1()", +"8a6a3584": "clearAccount(address)", +"8a6a8b6c": "getMonthlyTransactionVolumeSending()", +"8a6b114b": "getBet(address,uint256)", +"8a6b6877": "withdrawMineral(uint256)", +"8a6b9be4": "allowToWithdrawFromReserve()", +"8a6bc85a": "getInterestor(address)", +"8a6c02ae": "safeWithdrawal3(address)", +"8a6c0b26": "registerCreatorsPools(address[],uint256)", +"8a6d2d7b": "MATOU()", +"8a6d39b9": "Leak()", +"8a6db9c3": "minterAllowance(address)", +"8a6e0a8e": "_increaseApproval(address,address,uint256)", +"8a6ee066": "_releaseWithReward()", +"8a7097ce": "checkWithdrawalsgross(address)", +"8a7180ae": "team_token_percentage_max()", +"8a72ea6a": "offers(uint256)", +"8a738683": "sweep(address,bytes32)", +"8a7398e7": "getAllRoundRefIncome(address,address)", +"8a74b45c": "editApi(uint256,uint256,address,string)", +"8a74ee43": "allowTransferFrom(address)", +"8a74f69d": "transferMod(address)", +"8a758625": "setStrF1IntF2StrF2UintF2(string,int256,string,uint256)", +"8a75f56a": "setArbiterLocked(address,bool)", +"8a769d35": "miningTarget()", +"8a76a63e": "whitelistedInvestorCounter()", +"8a76d99b": "buyTicket(uint32,uint32,uint32,uint32,uint32,uint32)", +"8a775ab6": "RiskPrices(uint128[])", +"8a77ba1a": "companyVault()", +"8a78b7fb": "test_invalidProposalExecution()", +"8a78f5e2": "changeMember(address,bool,bool,uint256)", +"8a7a7e03": "ETH_PER_LARE()", +"8a7a8f46": "HJF()", +"8a7c20d7": "setReferralFund(uint256)", +"8a7c2ad7": "buyService(address,uint256,bytes)", +"8a7c2be2": "payEth(address,uint256,uint256)", +"8a7c2d6d": "hasOpenApplicationFromSource(address,address)", +"8a7c63c5": "privateStartTime()", +"8a7cc2ca": "RemapImported()", +"8a7d124b": "destroyToken(uint256)", +"8a7e30a1": "token_set()", +"8a7e5144": "addWhiteList(uint8,address,uint256)", +"8a7ed05c": "MAX_BID_FRAC_TOP()", +"8a7ef3df": "testFailCreateWithParentsParentSameItemId1()", +"8a7f1146": "RetrieveFunds()", +"8a7f800c": "preCensor(bool)", +"8a808acf": "Yaraq()", +"8a8090b8": "_setUint(bytes32,uint256)", +"8a80d9a3": "isRefundPaused()", +"8a80dfb1": "isFirstBadgeEle(uint256)", +"8a8146d0": "end_ICO_PreICO()", +"8a814cfe": "MyCrowdsale()", +"8a827eb9": "setSecondary(address)", +"8a82a09d": "MISTT1()", +"8a83d4a0": "burnMythexTokens(address,uint256)", +"8a863fbd": "juryOnlineWallet()", +"8a8672dc": "DINRegistry(uint256)", +"8a871c5f": "crosairVouchersMinted()", +"8a874084": "updateInteface(address,address)", +"8a87873a": "create(bytes32,address,bytes32[3],bytes32,bytes32)", +"8a87aeb9": "EthToOwner(address,address,uint256)", +"8a87b5c5": "dailyAdminAllowance()", +"8a87d8ea": "hasLicenseTerms(bytes32)", +"8a881e0e": "isExists(bytes32)", +"8a88c349": "addVestingMember(address,uint256,uint256,uint256)", +"8a88c4fe": "replaceOwnerIndexed(address,address,uint256)", +"8a890695": "logPurchaseViaFiat(address,uint256,bytes32)", +"8a892271": "initiateLocking(uint256)", +"8a89b338": "set_commandPercent(uint256)", +"8a8a0aab": "_b2(string,address)", +"8a8b4d61": "MediaBroadcast()", +"8a8b51b8": "setAddGas(address,uint256)", +"8a8b7deb": "CAT()", +"8a8b7e02": "whitelist_enabled()", +"8a8b98dd": "ETHT()", +"8a8bbd5c": "ThanhnvToken()", +"8a8bf82a": "batchTransferToken(address,address,bytes32[])", +"8a8c523c": "enableTrading()", +"8a8c8c42": "TokenCoin()", +"8a8cd78d": "setTurnoverTo(address,uint256)", +"8a8e2028": "getCurrentTranche(uint256)", +"8a8e3999": "_unsafeEncodeTokenId(int256,int256)", +"8a8e5239": "get_power(address)", +"8a8e5afb": "shaCommit(uint256)", +"8a8ede8a": "hasStatus(address,address,uint8)", +"8a8f1f25": "setAccountSpendingLimit(address,uint256,string)", +"8a8f5b79": "newXPAAssets()", +"8a905482": "createIpo(address,uint256,uint256,string,string)", +"8a926d0f": "maxTokenAmount()", +"8a933eac": "setSmartContractPrice(uint256)", +"8a93d70d": "MakerWithdrewEther(uint256)", +"8a93dbdf": "getInvestorDividend(address)", +"8a946339": "ERC20Token(string,string,uint256)", +"8a955876": "incrementCountSales(uint256,uint256)", +"8a957929": "setFeeAuthority(address)", +"8a957f15": "ccReleaseBlock()", +"8a95a746": "pie()", +"8a95addc": "NewPotentialOwner(address,address)", +"8a95f59f": "setHHRAddress(address)", +"8a96e27e": "CTTCToken()", +"8a973e17": "borrowEther(uint256)", +"8a97d915": "TokenMetadataUpdated(uint256,address,string)", +"8a983fbc": "KulouCoin()", +"8a98a9cc": "gen0SaleCount()", +"8a98cbd0": "SalePaused()", +"8a98deca": "setEtherCostOfEachToken(uint256)", +"8a9920b7": "emergentWithdraw()", +"8a99aa69": "_setStore(address)", +"8a99e917": "activatedPhases(uint256)", +"8a99fc87": "checkWhenContributorCanTransferOrWithdraw(address)", +"8a9b2b36": "_fillCardStruct(uint8,address,string,string,string)", +"8a9b35a7": "totalPresaleWei()", +"8a9b4067": "ren()", +"8a9b809b": "ChargCoinContract()", +"8a9ba931": "setContract(address,address,address,address,address,address,address)", +"8a9bb02a": "getRoundInfo(uint256,uint256)", +"8a9c497b": "totalBunniesCreated()", +"8a9c636c": "setAquiferInstituteCoinAdd(address)", +"8a9cb361": "hundredPercent()", +"8a9cba3c": "set_result_of_game(uint8)", +"8a9cf23a": "isEarlybird()", +"8a9d1fbf": "uniquePet(uint64)", +"8a9d3839": "setBountyWallet(address)", +"8a9d43e2": "getPlayerFee(uint256)", +"8a9d6bb1": "GEZI()", +"8a9d7982": "getActiveBetsRefund(address)", +"8a9e0876": "tokensReleased()", +"8a9e8671": "totalBid()", +"8a9f8a43": "set_block(uint256)", +"8a9fb135": "humaniqToken()", +"8a9fc475": "wipe(address,bytes32,uint256,address)", +"8a9ffb90": "transfer(string,string,bool)", +"8aa001fc": "getSecond(uint256)", +"8aa08617": "mintInitialTokens(address,uint256)", +"8aa0fdad": "mint(string,string)", +"8aa10435": "getContractVersion()", +"8aa14a07": "transferToAddress(address,uint256,bool)", +"8aa1949a": "executionMaxPerTx()", +"8aa19ef7": "setOraclizeQueryGasPrice(uint256)", +"8aa2c280": "newAuction(uint128,uint256,uint256,uint256)", +"8aa31cbf": "ICO_PRICE8()", +"8aa33776": "setMsgPrice(uint256)", +"8aa35083": "PRE_CROWDSALE_DURATION()", +"8aa3cc5a": "setMonsterAssetAddress(address)", +"8aa43284": "getNbProjects(string)", +"8aa4e240": "payoutOCDividend(address,address)", +"8aa4e315": "setExchangePrice(uint256)", +"8aa5440e": "setXCPlugin(address)", +"8aa5b2c3": "changeStartTime(uint256)", +"8aa6e6de": "approveMint(uint256)", +"8aa6f1b1": "setUltimateOutcome(bytes32)", +"8aa7d975": "DOCC()", +"8aa81eac": "ixentest()", +"8aa91406": "createIdea(address,address[],string)", +"8aa94f56": "updateUserCreatedPerformance(uint256)", +"8aa96f38": "collectAllocations()", +"8aa978be": "Pricing(address)", +"8aa986f6": "minimumContributionPhase2()", +"8aa99826": "IsTradeable()", +"8aaa559a": "ProtectedApi(address)", +"8aaaa197": "getCurrentRoundEndTime()", +"8aab811e": "setLOCdata(string,address,int256,address,uint256,string,uint256)", +"8aabb56f": "setMigrateIn(bool)", +"8aabe700": "refundTokensForAddress(address)", +"8aabff06": "getPVECooldown(uint256)", +"8aac0fa4": "transferGasFee(uint256)", +"8aac1708": "_deleteOperation(bytes32)", +"8aac61e9": "assetArray()", +"8aadf70a": "generateUniquePets(uint8)", +"8aae13cb": "getTokensByUSD(uint256)", +"8aae1f50": "withdrawOperationFees(uint32[])", +"8aae45be": "lastBonusMultiplier()", +"8aaf09a1": "getInitialInvestAddres()", +"8aaf699d": "sendCommunitySupplyToken(address,uint256)", +"8aafef65": "ITC(uint256,string,string)", +"8ab058b1": "AllocateToken(address[])", +"8ab11869": "sign(string,string,string,string)", +"8ab1a5d4": "sell(uint256,uint256,bool)", +"8ab1d681": "removeFromWhitelist(address)", +"8ab21fb6": "delegateVote()", +"8ab30e9f": "test_validShouldBe3_increaseBlocksBy100()", +"8ab3580c": "bigbomToken()", +"8ab3e33f": "removeKey(address,address)", +"8ab422a1": "addEmployee(uint256,string,string,string,string)", +"8ab476bf": "setDevelopers(address)", +"8ab49873": "isSubmitterAccepted(uint256,address)", +"8ab4ca8a": "lockRound(uint256)", +"8ab4d1ca": "PapyrusAirdrop(address)", +"8ab5212b": "teamVault()", +"8ab5fcc5": "setTypePrice(uint256,uint256)", +"8ab63380": "setContractAddresses(address,address,address)", +"8ab7f807": "applySettings(uint8,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"8ab8064f": "continueITO()", +"8ab8342e": "changeInsurerOperation()", +"8ab905d4": "existedOnWhitelist(address)", +"8aba9215": "initialBlockHeights(uint256)", +"8abab8fb": "saleAccepting()", +"8abadb6b": "setAccountLevel(address,uint256)", +"8abb0e1f": "MRDSPrivateSale()", +"8abcb485": "InvestorBonusGet(address[])", +"8abdb005": "addCard(string,uint256,int256,string,uint256,uint256,address)", +"8abdf5aa": "serviceFee()", +"8abe09f2": "now()", +"8abe5593": "hashLength()", +"8abe59ea": "outcomeTokens(uint256)", +"8abe789b": "mulToResult(int256)", +"8abf344d": "callStages()", +"8ac01eaa": "SHARE_CRYSTAL()", +"8ac0ca36": "buyViaJohan()", +"8ac0e150": "fatigueBlock()", +"8ac0eef9": "changeUserKey()", +"8ac1a8d6": "weiRaiseLimit()", +"8ac1f290": "changelp20(address)", +"8ac2571f": "publish(address,bytes32,bytes32)", +"8ac27f5f": "investors()", +"8ac2b5f2": "_claimLoanToken(address)", +"8ac2c680": "minInvestment()", +"8ac341c6": "numModules()", +"8ac3ea2c": "recordEvaluation(uint32,uint32,uint8,uint8,uint8,uint8,uint8)", +"8ac44de2": "TBT_MINER()", +"8ac4e1d8": "TemperatureOracle()", +"8ac6a869": "isObsolete()", +"8ac78c80": "Docsign()", +"8ac81296": "ethTokenRatio()", +"8ac91be7": "unPause(bytes32)", +"8ac97efb": "whitelistDayCount()", +"8ac9fa73": "getTrustState()", +"8acb99ac": "owned(uint256)", +"8ace1732": "burnerOwner()", +"8ace4131": "CryptoTestCoin()", +"8aceaa4a": "GetTotalGamblerNum()", +"8acf94df": "setTierData(uint256,uint256,uint256)", +"8ad141ec": "updatePlayerContinusFund(address,uint256,uint256)", +"8ad14ee6": "setSuccessful()", +"8ad17f00": "setJackpotFeeRate(uint256)", +"8ad1896c": "bonusOptionsPromille()", +"8ad1d846": "getDebtorsDebts(address)", +"8ad20640": "allowedSinceReadable()", +"8ad2739b": "UMCCToken()", +"8ad2eaea": "has_token_sale_started()", +"8ad2f289": "checkPermission(address,address,bytes4)", +"8ad30473": "set_crowdsaleClosed(bool)", +"8ad46ba0": "b32toHexString(bytes32)", +"8ad476d7": "foundationReservation()", +"8ad47c47": "Dragon()", +"8ad5d779": "increaseOffsaleCountByOne()", +"8ad68253": "HostingDNS(uint256)", +"8ad682af": "ROLE_OWNER()", +"8ad8998c": "tokenTotalClaim(address)", +"8ad9a976": "getServiceStat(uint64)", +"8ad9c8c3": "GetUserConAddr(string)", +"8ada066e": "getCounter()", +"8ada1957": "TOKEN_WALLET()", +"8ada80a2": "getWinnersLen()", +"8adb208d": "withdrawDukeOwnersMoney()", +"8adba5a9": "cap4(address)", +"8add359d": "WorkerPoolHub()", +"8adde811": "test2_addingSecond()", +"8addf3ca": "performUpdateMemsize()", +"8ade246a": "makeBet(uint256,address)", +"8ae0368b": "challengeNumber()", +"8ae06cf7": "SAFeth()", +"8ae0a7ec": "uniq(uint32[])", +"8ae18dfd": "setRemainingLockDate(uint256)", +"8ae1d8d4": "StatsTotalSupply()", +"8ae3beb2": "setPending(bool)", +"8ae4200a": "revokePrivilege(string)", +"8ae470a9": "set_time(uint256)", +"8ae475a9": "notorize(string)", +"8ae5e0ec": "allowManyTokens(address[],address,uint256[],bool[])", +"8ae5e372": "getMouthValue(uint256)", +"8ae63d6d": "blockNum()", +"8ae69807": "sendAirdrop(address[],bool)", +"8ae69caa": "getCountryOwnershipList()", +"8ae76b77": "createToken(uint256,address,bool,uint256)", +"8ae79c8c": "LovelockPayment(address,bytes32,uint256)", +"8ae83bf3": "DISPLAY_CLASSIQUE()", +"8ae85b80": "storeN(uint8[],uint256,uint256,uint256)", +"8ae881a6": "initMetadata(bytes32,bytes32,bytes32,string,bytes32,bytes32,uint256,uint256,uint256,uint256,address)", +"8ae8c1f3": "transferFromCrowdfund(address,uint256)", +"8ae986cf": "registrantApprove(address)", +"8aea12b6": "c_paymentChannelBonusPercent()", +"8aea2f6e": "totalFundingAmount()", +"8aeb8f98": "isNotEmpty(string,string)", +"8aebebd9": "restartCycle()", +"8aece8b0": "MRNToEth()", +"8aed434a": "oracle_values(uint256)", +"8aee0443": "getNumberOfPurchases()", +"8aee3a54": "enableATMExchange()", +"8aef16d0": "appendSupplyChanges(address,bool,uint256)", +"8aef91f5": "TimeLeftBeforeCrowdsale()", +"8af1bac9": "isMoron(address)", +"8af1c825": "SALE_MIN_BUY()", +"8af2c328": "buyTokensFor(address,uint256,uint256)", +"8af2ce26": "districtLimit()", +"8af2d152": "limit6()", +"8af49ab7": "maintain(uint256,uint256)", +"8af51833": "_transfer(address,string,address,string,uint256)", +"8af57597": "getSingleDeveloper(address)", +"8af6c259": "totalDuration()", +"8af784dc": "expectEventsExact(address)", +"8af82a2e": "getFirstUnsortedOffer()", +"8af9f493": "reap(address)", +"8afa08bd": "setDrawDate(uint256)", +"8afa46b1": "refunds()", +"8afa7c6a": "createBasket(string,string,address[],uint256[],address,uint256)", +"8afbcdd0": "setEmissions(uint256[])", +"8afbf669": "withdrawRemainingTokens()", +"8afc3605": "Ownable()", +"8afcf1c9": "_transferSignership(address)", +"8afdc26e": "currentIcoPhaseBonus()", +"8aff794d": "milestoneSystem()", +"8b00299b": "setSellComissionUnits(uint256)", +"8b008f0f": "setBuyBackPrice(uint256)", +"8b00c467": "growthTokensWallet()", +"8b0133d5": "calcBonus(uint256,uint256)", +"8b018bca": "maxDividendDepth()", +"8b01bcc3": "isJobCancel(uint256)", +"8b021df4": "safePayback(address,uint256)", +"8b0254b6": "bilateralCancelOrder(bytes32)", +"8b02c8b2": "addFundTX(uint256,uint256)", +"8b031e1c": "_checkFundingGoalReached()", +"8b034136": "totalBids()", +"8b036ee2": "PRE_SALE_BONUS_PERCENTAGE()", +"8b038f7f": "edrBalance()", +"8b03fcfd": "backersRedeemed(address)", +"8b043e08": "getPublisher(address)", +"8b044a50": "getCofounditTokenAddress()", +"8b0451d9": "CAT_PER_ETH_SECOND_EARLY_BIRD_RATE()", +"8b048091": "getTicketsSoldToday()", +"8b048645": "setCCH_edit_26(string)", +"8b05afd2": "saveBytes(bytes32)", +"8b06a662": "submitTotalSellOrder(bytes32,uint256,uint256)", +"8b072f0e": "migratePlayer(address,address,uint256,uint256,uint256)", +"8b073bb3": "changeStageBlock(uint256)", +"8b077355": "saleDistributorAddress()", +"8b07b006": "_tokensToSell()", +"8b07edba": "getI1()", +"8b08292d": "isValidAirDropForAll()", +"8b087f3f": "signToCancelAgreement(uint256)", +"8b092580": "preIcoHasEnded()", +"8b095904": "getBalancePercentageLimit()", +"8b0980d9": "Phoenixcurrency()", +"8b0b8820": "transactionStructFromBytesSeriality(bytes)", +"8b0b9cac": "setLatestTokenAllocation(address,address,uint256)", +"8b0b9ed4": "getWinningNumber()", +"8b0c7f67": "CROWD_WAVE2_PERIOD()", +"8b0d0258": "amount(uint256)", +"8b0e093c": "INEXTokenNew()", +"8b0e9f3f": "totalStake()", +"8b0ee5a3": "GAS_PRICE()", +"8b0fc015": "submitChoose(address,uint256)", +"8b0fc19a": "TokenSaleAfterSplit(uint256,uint256,uint256,address,address,bool,uint256)", +"8b10297c": "test_0_ensureControllerWorks()", +"8b104534": "tokensPerBatch()", +"8b1097c1": "setGeneMixerAddress(address,address)", +"8b110e0a": "MeshPoint(int256,string,address)", +"8b11fb3e": "secureTokenPay(uint256)", +"8b121c9d": "airdropMinting(address[],uint256[],int256)", +"8b121cf0": "TransactionEscalated(uint256)", +"8b122274": "setPriceIncrease(uint256)", +"8b128249": "MASSTokenPreSale(address,uint256,uint256)", +"8b12befe": "accrueBonusTokens(address,address,uint256)", +"8b12c25f": "updateReferralMasks(uint256,uint256)", +"8b12dc23": "DewToken()", +"8b133c56": "WatahaToken()", +"8b13b64b": "timeFrame()", +"8b13d4e0": "addTeamMember(address,bytes32,address)", +"8b13dd7b": "getAcceptance(address,uint256)", +"8b14251f": "setNarcosCoreAddress(address,address)", +"8b144851": "getCompanyWallet()", +"8b14592a": "EtherNex(uint256,string,string,uint8)", +"8b147245": "update(bytes32)", +"8b148ef6": "usedHashGuard(bytes32)", +"8b156d4c": "EthernautsUpgrade()", +"8b157515": "tokensInfoOfOwner(address)", +"8b15a605": "proposalDeposit()", +"8b169c7a": "coinageContract()", +"8b17ab2f": "calculateOptions(uint256[9],uint32,uint32,bool)", +"8b1928a5": "getAllergies()", +"8b19a476": "oraclize_query(string,string,uint256,uint256)", +"8b1acf9e": "ZcnoxToken()", +"8b1ad6c6": "AuctionFinished(address,uint256)", +"8b1b4036": "newTrade(string,string,uint256,uint256)", +"8b1b925f": "isValid(address)", +"8b1c80e2": "MAIN_SALE_BONUS_PERCENTAGE_PHASE2()", +"8b1c8792": "Blocktix(string,uint256,uint256)", +"8b1cc4f4": "tokenBurner(uint256)", +"8b1cf21c": "unlocked(uint256)", +"8b1cffe0": "newBrehonContract(address,address,uint256,bytes32,address,uint256,uint256,address,uint256,uint256,address,uint256,uint256)", +"8b1d37d4": "testUserCanSignUpAndLogin()", +"8b1d67f9": "initial_disbursement()", +"8b1db910": "hasSuicided()", +"8b1f3206": "addlockAccount(address,uint256,uint256)", +"8b20468b": "updatePalette(uint8,uint8,uint8,uint256)", +"8b20d082": "_getPlayerThemeEffect(bytes,uint256)", +"8b20d9fa": "get_probability(bytes32,uint32,uint32)", +"8b214d5d": "imOwner()", +"8b21d307": "createProxyAddress()", +"8b220a31": "addProcessableAllocation(address,uint256)", +"8b223943": "stage3BeginTime()", +"8b22c7b3": "keeppetToken()", +"8b22e1df": "raiseDay1()", +"8b23397a": "_getFashionParam(uint256,uint16,uint16,uint16)", +"8b235f04": "lastSignedBlockHash()", +"8b24793d": "revealCeiling(uint256,uint256,uint256,bool,bytes32)", +"8b24c3e0": "getRequiredMajor()", +"8b257d3d": "isValidSignature(bytes32,uint8,bytes32,bytes32)", +"8b259bdb": "setupIco(uint256,uint256)", +"8b278707": "addFeeFeedBack(address,string)", +"8b278a30": "updateBanThreshold(uint256)", +"8b27c179": "maxPlay()", +"8b281018": "sendFunds(uint256)", +"8b2886ca": "setNorthPoleAddress(address)", +"8b28ab1e": "calculateFee(address,uint256)", +"8b28df17": "NCCUyen()", +"8b2909cf": "tokensFromPreviousTokensale()", +"8b290a72": "employeeShare()", +"8b294960": "balanceInTranche()", +"8b299903": "turn()", +"8b29b4fc": "setArray(string,string)", +"8b29e88b": "icoTokenCap()", +"8b2a6f58": "cancelEpochUpTo(uint256)", +"8b2a81ed": "HashGardToken()", +"8b2a9606": "addDigitalArtSellingItem(uint256,uint128)", +"8b2ad32e": "getSketchesOnOfferWithHolder(address)", +"8b2ae073": "setCouponMulFactor(uint256)", +"8b2b423a": "privateSaleAmount()", +"8b2be40e": "firstCurrentAmount()", +"8b2c434c": "CryptoGiants()", +"8b2d2dca": "setAllowMarketplace(bool)", +"8b2d4ed1": "creatorsPoolAddrs(uint256)", +"8b2de796": "housePercentOfTotal()", +"8b2e2b07": "CAKSale()", +"8b2e31dc": "STARTING_LOBSTER()", +"8b2e41b2": "getPlayerShipBattleWinsById(uint64)", +"8b2e6dcf": "publish(bytes32)", +"8b2e92ce": "rewardAngel()", +"8b2ef965": "securityDepositRegistry()", +"8b2f1652": "transcoderStatus(address)", +"8b2f7af3": "CalculateAllocatedUcash()", +"8b3049e1": "lotteryByETH5(address)", +"8b31aaca": "ZOB()", +"8b31bd50": "appreciationRate()", +"8b322791": "confirmCrowdsaleEnd()", +"8b325902": "totalTokenMintedOpen()", +"8b3272dc": "setUseService(bool)", +"8b3294e5": "addRecipientUpdate(bytes32,bytes32)", +"8b32f62a": "TEAM_AMOUNT()", +"8b33b4b2": "operations()", +"8b3437c5": "setDebugNow(uint256)", +"8b343e8f": "getMemberCredit(address)", +"8b34839f": "claimTokensEnabled()", +"8b34a4b3": "nestedSecondAllToAll(uint256)", +"8b35a244": "partner2()", +"8b360f4d": "teamSupply24Months()", +"8b36ed08": "CmmToken()", +"8b37112b": "doReclaim(address,uint256)", +"8b37691b": "TxOriginContract()", +"8b37e656": "getCallScheduledBy(bytes32)", +"8b384f9f": "getMenu()", +"8b392dff": "mModerators(address)", +"8b39bdba": "tokensDaily()", +"8b3aa967": "getDepositDelta()", +"8b3ac630": "buyShip(uint256,address)", +"8b3c4f6f": "Register(bytes4)", +"8b3ca352": "CFL()", +"8b3caf37": "Operatable()", +"8b3cda96": "IotPC(bytes32,bytes20,uint256,address,uint256,uint256)", +"8b3d10bf": "BMCTToken()", +"8b3dd749": "getInitializationBlock()", +"8b3e23d9": "preIcoSupply()", +"8b3edbdf": "changeManufacturerWallet(address)", +"8b3f0337": "extractNibble(bytes32,uint256)", +"8b3f863f": "getUserType(address)", +"8b40594d": "tokenExchangeRatePreSale()", +"8b409cec": "addRelease(bytes32,string)", +"8b42ad37": "test_twoFalseAssertNoMessage()", +"8b43234b": "endPeriodB()", +"8b449ffd": "woyaoqianqian(uint256)", +"8b44af0e": "transferETHS(address[])", +"8b44c99a": "capture(bytes32)", +"8b44f194": "TBOT()", +"8b45ab24": "SoccerBet(string,uint256,address)", +"8b45ce03": "_cancelVote(address,address,uint256)", +"8b46e1f1": "getVercodesOfCampaign(bytes32)", +"8b473c3d": "getKeysByDeviceId(uint8,uint8)", +"8b477adb": "transferFromByLegacy(address,address,address,uint256)", +"8b47c10b": "ERC721token()", +"8b490893": "CBO()", +"8b49644d": "test_invalidProposalBytecode()", +"8b4a781c": "getVoters(bytes32)", +"8b4b891b": "Duarte()", +"8b4b8a26": "updatePriceTier(uint8,uint256)", +"8b4bf731": "setEtherPriceUSD(uint256)", +"8b4c40b0": "donateETH()", +"8b4c4307": "EstLiquidationCap()", +"8b4ce7ce": "updateRegionPixelPrice(uint256,uint256)", +"8b4d199e": "recordTransaction(address,uint256,uint64,uint64,uint64)", +"8b4d3f20": "Xin(uint256,string,string)", +"8b4d56de": "createAndJoinCDPDai(uint256)", +"8b4e79c2": "delegateFromPool(uint96)", +"8b4e8a6a": "MedED()", +"8b4ef7d4": "ContractAdded(string,address)", +"8b4fac8e": "testsignature()", +"8b4fff3e": "register(address,string,string,string,uint256,string)", +"8b50cd34": "attackTile(address,uint16,uint256,bool,bool)", +"8b51365b": "set82Mode(bool,bool)", +"8b519e09": "mainSaleEnd()", +"8b51ca42": "roleList(bytes32,bytes32,address)", +"8b51d13f": "getConfirmationCount(uint256)", +"8b52463a": "commissionerAuctionCancelled(uint32)", +"8b533562": "giftsOfOwner(address)", +"8b534dd3": "goldenTicketMoved(address)", +"8b53808b": "ForwardToEIF()", +"8b53cbaa": "addNode(string,uint8)", +"8b5406af": "angelLockingPeriod()", +"8b542d74": "test_twoValidEqInt()", +"8b543b80": "maximumCredit(address)", +"8b5462da": "getMy()", +"8b55c1b3": "pushPlayer(address)", +"8b56aff8": "createPromoMonster(uint256,address)", +"8b57192b": "Woleum()", +"8b57ebc6": "claimSegments()", +"8b57f150": "newUserReward()", +"8b587b82": "createPuppySiringAuctiona(uint256,uint256,uint256,uint256)", +"8b58c64c": "getUserCap(address)", +"8b595440": "setBurnAdminApproval(address,address,address)", +"8b5a17df": "frozedCount()", +"8b5a64fb": "registerNameXname(string,bytes32,bool,uint8)", +"8b5b1c9a": "setPools(uint16,uint16,uint16)", +"8b5b4228": "listTiers()", +"8b5b9ccc": "getPlayers()", +"8b5bc550": "WPAYReward()", +"8b5c37c3": "L19_Token()", +"8b5caa66": "backendWithdraw(address,uint256)", +"8b5dc8a5": "IsAllowed(address)", +"8b5de2d9": "FunFairSale()", +"8b5e331c": "HatchEgg()", +"8b5e6679": "setNewIco(uint256,uint256,uint256,uint256,uint256)", +"8b5f42ca": "addDataStream(address,string,bytes32)", +"8b5ff1d9": "batchDeleteHpbNodeCache(address[])", +"8b603300": "updateLocation(int256,int256)", +"8b6084e4": "switchState()", +"8b615813": "fundLockTransfer(address,uint256)", +"8b629cbc": "m_ETHPriceUpdateInterval()", +"8b63c0e8": "returnTokenDepositState(address[2],uint256[7],uint8,bytes32[2])", +"8b63c86f": "setupRace(uint32,uint32)", +"8b64574b": "nextFreeze()", +"8b6497b9": "s41(bytes1)", +"8b649b94": "roundLength()", +"8b64b3af": "advisors_address()", +"8b64d70e": "owner_set_time_limit(uint256)", +"8b66bf68": "takeMyMoney(bytes32)", +"8b66d153": "STSTEST()", +"8b66e3b4": "hasPlayersInRound(uint256)", +"8b6715cd": "getTotalRankTokens()", +"8b673e7a": "setConfig()", +"8b67430e": "voteToCandidateIndex(uint256)", +"8b676ae8": "scheduleCall(address,bytes4,uint256,uint256,uint8,uint256,uint256)", +"8b67d56e": "getContributorsWallet()", +"8b67ef19": "distance(uint8,uint8,uint8,uint8)", +"8b68cd9d": "rndMax_()", +"8b692479": "addProduct(uint256,uint256)", +"8b6932f1": "saleTimeOver()", +"8b69759d": "removeAuthorizer(address)", +"8b699fbb": "KiemTra(uint256)", +"8b6aacc8": "stopSendWebGift()", +"8b6bd650": "ChangeCoinPresale()", +"8b6bf3dd": "intervalueToken(uint256,string,string)", +"8b6c1cfb": "totalHeldSupply()", +"8b6c69e5": "presaleLimitUnits()", +"8b6d6e48": "GoldPurityToken()", +"8b6d6f1d": "checksOn()", +"8b6dde89": "OwnerFreeze(uint256,address)", +"8b6df6bf": "DEMOHASHTOKEN(uint256,string,uint8,string)", +"8b6e10ac": "allBalances(address[],address)", +"8b6f8646": "CHCTokenERC20()", +"8b6f894f": "releaseEscrow(address)", +"8b6fb3ac": "GetOrganNumber()", +"8b6fc452": "tip(address,uint256)", +"8b7001d0": "ReceivedBCH(address,uint256,string)", +"8b7116e4": "reviewActiveMembers(uint256,uint256)", +"8b7261bd": "fetchAllVoteResultForNodes(uint256)", +"8b72a2ec": "transferPunk(address,uint256)", +"8b72ddf7": "setMinimalTokens(uint256)", +"8b7314e3": "BEToken()", +"8b7358a0": "getPoliceReportResult(uint256,address)", +"8b73a46b": "getNumberOfMembers()", +"8b73c10e": "buyChibiWithFcf(string,string,uint8,uint256)", +"8b745ff2": "valueBlocked(address)", +"8b76e976": "setRef(uint256,address)", +"8b77071c": "profitEth()", +"8b78a388": "reduceallrunmoney(address[],uint256[])", +"8b79bb43": "MTelCoin()", +"8b7a01e3": "depositOwnership(address)", +"8b7afe2e": "contractBalance()", +"8b7b45d9": "hashSchema(string,string)", +"8b7bcc86": "numWinners()", +"8b7bf3eb": "getAdminCount()", +"8b7c34d4": "setCompte_12(string)", +"8b7d38a1": "sPerDate()", +"8b7d6b05": "makerUnlockedKnc(address)", +"8b7e7a2e": "TBEToken()", +"8b7f0ddd": "register(address,address,string,string,bytes32[],uint256,string)", +"8b7f4cb7": "_calcDate0(uint256)", +"8b7fe5be": "DonationEvent(address,uint256)", +"8b800e6f": "migrationCounter()", +"8b805e65": "setUsers(address)", +"8b80bd19": "Migrated(address,uint256)", +"8b80fd5a": "extraDataToSubcourtIDAndMinJurors(bytes)", +"8b810c36": "epoch(address)", +"8b81b1af": "getLastOwner()", +"8b8211a1": "closeSale1()", +"8b82f4bc": "PAYCOINLY()", +"8b83209b": "payee(uint256)", +"8b832705": "getAmountOfGrantAccessInvestor(address)", +"8b833318": "getArtworkGroup()", +"8b8373ca": "AMBASSADOR_SIX()", +"8b8414c4": "getPoaConsensus()", +"8b845c1d": "withdrawCommisionToAddressAltCoin(address,uint256)", +"8b8519a2": "frozenTimeOf(address)", +"8b859409": "setRelease(bytes32,bytes32,string)", +"8b863095": "setContractorProposal(uint256,bytes)", +"8b87c544": "getInventory(address)", +"8b87e3b6": "bountyMinted()", +"8b886d04": "setCatchable(uint32,bool)", +"8b88a687": "getCost(address)", +"8b88c9cf": "setSpaceCraftAddress(address,address)", +"8b8c1177": "changeTokenOffer(uint256)", +"8b8c5ed9": "scheduleUnderwriteOraclizeCall(uint256,bytes32)", +"8b8d7c04": "writeConditions(uint8,string)", +"8b8e5fe2": "secondRewardPeriodEndBlock()", +"8b8ecffa": "teamAndFoundersWallet()", +"8b8f8504": "NodeManager(address[],address[])", +"8b906ca5": "enterBidForSketch(uint256)", +"8b90a378": "STATE_DONATION_ROUND_2()", +"8b91124d": "getSubscriptionClosedAt(bytes32)", +"8b91d5f6": "PRICE_CROWDSALE()", +"8b91e9a2": "getSubscriptionNonce(bytes32)", +"8b91f4a3": "ProofOfBitConnect()", +"8b9299dc": "authorizeMany(address[50])", +"8b93509f": "addTeamtoBoard(uint16,address,uint8)", +"8b935fb1": "keys(uint256,uint256)", +"8b93d3fc": "stake(uint256,bytes32,uint256,uint256,uint256)", +"8b959014": "DPC(uint256,string,string)", +"8b9596ed": "Eladporat()", +"8b95ec0c": "testAddBalance()", +"8b96801e": "soldTokensCount()", +"8b969c33": "editTokenProperties(string,string,int256)", +"8b96e41c": "_preMcFly()", +"8b9724d1": "setExclusiveRate(address,uint256,uint16,uint32)", +"8b9726c1": "multiAccessCallD(address,uint256,bytes,address)", +"8b975028": "setCooldown(uint256,uint256,uint256)", +"8b9801b0": "TheHashSpeed()", +"8b9847a5": "AmazonBestsellerLabs(uint256,string,uint8,string)", +"8b986566": "TokenTESTToken()", +"8b9997fd": "getOwnerHoverText(address)", +"8b99b742": "arbitrateCancelCampaign()", +"8b9a167a": "aliceClaimsPayment(bytes32,uint256,address,address,bytes20,bytes)", +"8b9add74": "minCapReached()", +"8b9af5c1": "wmul(uint256,uint256)", +"8b9b1cbd": "withdrawRemainder()", +"8b9b62b1": "toB32(uint256,bytes,address)", +"8b9bde27": "setNameHashByWriter(address,bytes32,address,bytes32)", +"8b9c7a36": "initialStartPrice()", +"8b9ce419": "getBorrowAmount(uint256,uint256,bool)", +"8b9ce6a6": "create(uint256,uint256,address,address,address,uint256,uint256,address,uint256,uint256,bool,bool)", +"8b9d6899": "lockedAmountOf(address)", +"8b9e2832": "mintRep(address,uint256)", +"8b9e4768": "_level()", +"8b9e5385": "MeterSlock(uint256,uint256,address)", +"8b9efe2d": "lastCountAddress()", +"8b9fae3f": "getETHback()", +"8b9ff6b6": "left91(uint256)", +"8ba19d4f": "EGGS_TO_HATCH_1CRAB()", +"8ba1c353": "_scaleExp(uint32,int32)", +"8ba1ebce": "updateGenVault(address)", +"8ba209b6": "isAccountVerified(address)", +"8ba28961": "spawn(uint32,int256,address)", +"8ba39ea8": "getChecksum()", +"8ba3ee95": "setConverterRamp(address)", +"8ba45307": "basePunish()", +"8ba47bdd": "ticker()", +"8ba4cc3c": "airdrop(address,uint256)", +"8ba5306b": "getDefaultRecommAddr()", +"8ba5758b": "HumanStandardToken(uint256,string,uint8,string,uint256)", +"8ba5807c": "raceCount()", +"8ba5882a": "manualOverrideEditionHighestBidAndBidder(uint256,address,uint256)", +"8ba64328": "getParentOperation(bytes32,uint8,uint8)", +"8ba677fa": "sendPremiumPack(uint256)", +"8ba7bdc4": "adminClaimTokenForUser(address)", +"8ba7e570": "executeCall(address,uint256,uint256,bytes)", +"8ba7e7f2": "createHash(address,bytes32,bytes32)", +"8ba7fe81": "updateActiveStatus(bool)", +"8ba88c9c": "internalRemoveManager(address)", +"8ba8da61": "payback(uint64)", +"8ba8ffc6": "buyGrapes()", +"8ba92763": "ABsCoin(address,uint256)", +"8ba93fcb": "magicStore()", +"8ba9a7bb": "FACTOR_4()", +"8ba9d9b0": "EmailSent(address,string,string)", +"8ba9f354": "testClearBitSuccess()", +"8baa28f7": "allocate(address,uint256,uint256,string,uint256)", +"8baa8b1f": "staker(bytes32,address)", +"8bab6718": "investorsInfo(address)", +"8bab8791": "testPkgUpdate()", +"8baba52a": "allStates()", +"8bace235": "kycAddresses(address)", +"8bace717": "getPresaleAllocation(address,address)", +"8baced64": "isInPool(address)", +"8bad5de9": "checkMinBalance(address)", +"8bad8d8e": "reserveManyTokens(uint256[],uint256)", +"8badbb8b": "ETPToken()", +"8bae2a03": "getStoredFib()", +"8baecc21": "revive(uint256)", +"8baeefce": "stopTrade()", +"8baf612f": "Ownable2()", +"8baf7a0c": "CryptoPrueba()", +"8bb04875": "executeRuling(uint256)", +"8bb0faee": "setRef(string,string)", +"8bb19439": "isPending(uint256,uint256)", +"8bb1a5ef": "executeDeal(uint256,string)", +"8bb204d4": "setCaptainIndexToCount(uint32,uint256)", +"8bb28de2": "minShare()", +"8bb307a2": "getMyTokenBalances()", +"8bb36848": "pollDataMultihash()", +"8bb55cae": "beforeExecuteForFutureBlockCall(address,uint256)", +"8bb5d9c3": "setCounter(uint256)", +"8bb64abe": "releasableBonus(address)", +"8bb75533": "split(string,string)", +"8bb7819f": "curMaxBet()", +"8bb87f5b": "isTank(address)", +"8bb88db6": "EtherSmart()", +"8bb8b2db": "getTokenPerEth()", +"8bb93173": "getNextTimeAtkPlayer(address)", +"8bb9fe58": "addStruct(uint256,string)", +"8bba143c": "getNumberOfContributors()", +"8bbade4e": "usdEth()", +"8bbb594a": "createActiveEdition(uint256,bytes32,uint256,uint256,uint256,address,uint256,uint256,string,uint256)", +"8bbb5af7": "test1Fails()", +"8bbb668b": "ItemSelling()", +"8bbb9fca": "buyPresale(address)", +"8bbbc7a2": "BitnanRewardToken(address)", +"8bbd309c": "BLTCoin(address)", +"8bbd7f87": "removeMemberById(uint256,address,address)", +"8bbda7e3": "setContent(string,bytes)", +"8bbdcf67": "_createProduct(uint256,uint256,uint256,uint256,uint256)", +"8bbdfaa6": "approveChange(address,uint256,bool)", +"8bbe005d": "setGateGas(uint256)", +"8bbe4719": "donateToPool()", +"8bbec9e4": "WALLET_T8EX_ADMIN()", +"8bbf037c": "addService(string,string,int256,uint256,uint256,uint256)", +"8bbf51b7": "DOW_WED()", +"8bbf7330": "FlyCareToken()", +"8bc008e6": "xra()", +"8bc04eb7": "DECIMALSFACTOR()", +"8bc05609": "setNotaryAddress(address)", +"8bc05808": "addLockTokenAllocation(address,uint256)", +"8bc05833": "setTotalSupply()", +"8bc0b887": "initializeAfterTransfer()", +"8bc12fd1": "cancelOrder(address[4],uint256[7],bool,uint8,uint8,bytes32,bytes32)", +"8bc19bda": "setupRaffle(string)", +"8bc19c04": "getPlacedNotes()", +"8bc30096": "numDrops()", +"8bc4a65f": "unPackDecision(uint256)", +"8bc5816a": "startStage1()", +"8bc5aab0": "FundsRecovered()", +"8bc5b3c5": "getExchangeInfo()", +"8bc5f845": "sendToken(address[],uint256)", +"8bc6a72b": "adjustCut(uint256,uint256)", +"8bc70769": "BTToken(uint256,string,uint8,string)", +"8bc7fa9c": "getCrop(uint256)", +"8bc82c9b": "registeredInMeeting(address,uint256,uint256,uint256)", +"8bc85b03": "bonusEnd()", +"8bc88d7c": "nameMiner(uint256,string)", +"8bc97754": "popcnt64(uint64)", +"8bc9b67f": "endOfGame(address)", +"8bca15d6": "balancesCanSell(address)", +"8bcad96a": "AdminstratorAdded(address)", +"8bcb4250": "_bytesToUint(bytes)", +"8bcb6f01": "getLoserAddressList()", +"8bcba0b2": "_transferToContract(address,uint256,bytes)", +"8bcba45a": "secondPartOfTeamTokensClaimed()", +"8bcbb60b": "betsArePayed(address,uint256)", +"8bccae3f": "tokensForCrowdsale()", +"8bccb1b4": "EosPizzaSlice(uint256)", +"8bccbf62": "setShares(address,uint256)", +"8bcd0680": "CrowdsaleiPRONTOLiveICO()", +"8bcddd5d": "getLogsNum(address,uint256)", +"8bcdecd7": "getIssuerStatus(address,address)", +"8bce09fa": "resolutionProposal(string,string,address,uint256)", +"8bcea54f": "viewComponent(address,uint256)", +"8bcf0eea": "GCAP()", +"8bcf649d": "GetRank(uint16)", +"8bcff416": "asyncSend(address,address,uint256)", +"8bd031fe": "submitIssue(uint256)", +"8bd0ba67": "addChild(address,address)", +"8bd0f12b": "_deleteBool(bytes32)", +"8bd1b610": "deleteTeller()", +"8bd25857": "joinManual(address,uint48)", +"8bd30ba1": "KekToken()", +"8bd317eb": "reclaim(address,uint256)", +"8bd379b5": "itDevAddr()", +"8bd50488": "Policy(string,address,address,string)", +"8bd50c1f": "privateSaleCloseTime()", +"8bd53bea": "oraclizeFees()", +"8bd56066": "WXC()", +"8bd5d30f": "scoreGroups(bytes32,bytes32,bytes32,bytes32)", +"8bd61f26": "tokensRemainder()", +"8bd66bb3": "ModifyMine(uint256,bool,string,uint256,string)", +"8bd6da16": "distributeXAIN(address[],uint256,uint256)", +"8bd76535": "currentExchangePrice()", +"8bd7920d": "BitcoinCashPrivate()", +"8bd7df6e": "sharePot()", +"8bd82b20": "getInCar()", +"8bd8669e": "transferAllTokensToOwner()", +"8bd87a69": "TimeMachineToken()", +"8bda1540": "getOldBalance(uint256,address)", +"8bdac196": "KLSToken(uint256,string,uint8,string)", +"8bdbbca9": "GameChannel(address,uint256,uint256,address,address,uint256)", +"8bdbee39": "str_length(string)", +"8bdc16fe": "changeHouseOracle(address,uint256)", +"8bdc558d": "hash_ack()", +"8bdc5a5f": "withdraw(address,address,uint8,bytes32,bytes32)", +"8bde7fc3": "ClickButton()", +"8bdff161": "getBonus()", +"8be1049d": "getTypeFromIndex(uint256,uint256)", +"8be13d71": "countOpenPackage()", +"8be18df9": "getOutcomeOfFirstPeriodByEntity(uint256)", +"8be3a897": "_v3()", +"8be3df0a": "vipPlacementNotDistributed()", +"8be4339b": "packsPerClaim()", +"8be4886c": "PUBLIC_RESERVED()", +"8be52783": "decreaseApprovalPreSigned(bytes,address,uint256,uint256,uint256)", +"8be7a96a": "registerLockedTokens(address,uint256,uint256)", +"8be7f4f5": "FOUNDER_FUND_1()", +"8be7fe95": "CreateDigitalAssetToken(uint256,uint256,string,string,string,string)", +"8be8f944": "lastBlock_f6()", +"8be909a3": "mainSaleWeiCap()", +"8be90b52": "averageGasPrice()", +"8be94a45": "Gallery_MuYi_No1()", +"8be97285": "MIN_TOKENS_TO_EXCHANGE()", +"8be9ca21": "GerritCoin()", +"8bea6a39": "safeSubtr3DL(uint256,uint256)", +"8beac22d": "STAEtoken()", +"8beb1af1": "PresalePool(address,address,address,uint256,uint256)", +"8beb60b6": "setAdminFee(uint256)", +"8beb9f12": "moveBlockValue(uint8,uint8,uint8,uint8,uint256)", +"8bec5b31": "reserveOwnership(address)", +"8bec683f": "getID_control()", +"8bee241b": "delegateOperation()", +"8bee78e6": "buySharesFromListing(uint256)", +"8bef5222": "CONFIG_MAX_TICKETS()", +"8bef7ba5": "updateBalances(address)", +"8bf0af3e": "purchaseTokens(uint256,uint256)", +"8bf13a30": "UTCStop()", +"8bf34237": "addPartner(address)", +"8bf35316": "givePermission(address,address,uint256)", +"8bf4515c": "read(bytes)", +"8bf57f4e": "getTimestamp(address)", +"8bf60537": "setDividendManager(address)", +"8bf62f14": "EtheropolyShrimpFarmer(address)", +"8bf68690": "mintToken(uint256,address,uint256,bytes32,uint8)", +"8bf74527": "EMISSION_FOR_SALESTAGE7()", +"8bf85ef0": "SigmaIOToken()", +"8bf87123": "_transfer(address,address,uint40)", +"8bf8a338": "getAttribute(bytes32,string)", +"8bfa4b4e": "tokenAdvisor()", +"8bfac3bb": "updateBalances(address,bytes32,string,uint256)", +"8bfb07c9": "release(address,address,uint256)", +"8bfb85c3": "agreeAmendment()", +"8bfbc753": "setEthBonus(uint256)", +"8bfc2f33": "delegateDAOTokens(uint256)", +"8bfe0aec": "getNextExit(address)", +"8bfe4e0b": "GaillardToken()", +"8bfe88c5": "ArteufToken(address,address)", +"8bffc74d": "mainstreetToken()", +"8bfff5a0": "setPurchaseableMode(uint256,bool,uint256)", +"8c003134": "Raffle_ID()", +"8c00ce76": "unhalt_30day()", +"8c0124fb": "transferAndFreezeMulti(address[],uint256[],uint256[],uint256[])", +"8c02d13f": "MAX_NUMBER_OF_PREMIUM_SALES()", +"8c02e029": "save2(address,bytes,string)", +"8c0320de": "payforflag(string,string)", +"8c041d7c": "editProfile(string,bool,string,bool,uint256,bool,bool,bool,string,bool)", +"8c042317": "startQuater()", +"8c04b985": "readSellTokenAmount()", +"8c063686": "getRelayAuthority()", +"8c06fa18": "PRICE_PREICO()", +"8c088d98": "winMultiplePer()", +"8c08ae0d": "withdrawEtherRemaining()", +"8c09138f": "fourth()", +"8c0989ab": "MultiServiceFactory(address)", +"8c09bfdc": "shake(uint256)", +"8c0a41f2": "gibtesnet()", +"8c0b1588": "createNFT(uint256,address,bytes32,bytes32,bytes4)", +"8c0b372d": "e6c65e93()", +"8c0b4ae5": "setGenesMarketAddress(address,address)", +"8c0bae5b": "releaseRedTeamTokens()", +"8c0c0368": "_confirmOneSell()", +"8c0c9c07": "updateCampaignAbi(string)", +"8c0cf897": "develop()", +"8c0d0c29": "mark()", +"8c0d4199": "lock(address,address,uint256,uint256,bool)", +"8c0d6593": "CustomDealICO(uint256,uint256,uint256,address,uint256,uint256)", +"8c0dacf2": "deleteRecord(bytes32)", +"8c0dee9c": "operatorTransferByPartition(bytes32,address,address,uint256,bytes,bytes)", +"8c0e156d": "scheduleCall(bytes4,uint256,uint256)", +"8c0e299a": "proposeCompanyAllocation(address,uint256)", +"8c0e2a31": "regProxy(address)", +"8c0e45f6": "test_openRegistryRules()", +"8c0ead61": "_updateMLBPlayerId(uint256,uint256)", +"8c0ec0d1": "changeClient(address)", +"8c0f082c": "setFLKDForGas(uint256)", +"8c0f8e11": "getWorkerScore(address)", +"8c0ff5b7": "maxWithdrawal()", +"8c10671c": "addManyToWhitelist(address[])", +"8c115322": "isP2PKH(bytes,uint256,uint256)", +"8c118cf1": "verify(uint256,uint256,uint256,string,string,bytes32[2])", +"8c12324a": "Mire()", +"8c1256b8": "Recovered(address,uint256)", +"8c12c35c": "BTWO_CLAIM_PERCENT()", +"8c12d8f0": "arithmetics(uint256,uint256)", +"8c133a77": "previligedBalances(address)", +"8c133c25": "changeBetPrice(uint256)", +"8c13aabe": "lockStages(uint256)", +"8c14db73": "testThrowsSaleWalletIncorrectBlock()", +"8c155b5b": "tradeForTokens(address[2],address,bytes,bytes)", +"8c156213": "generateHash(address,string)", +"8c160095": "deleteInt(bytes32)", +"8c165146": "initSale1()", +"8c165932": "sendShip(uint32,uint32,address)", +"8c167076": "setHoldersList(address)", +"8c172fa2": "getEvent(bytes32)", +"8c17c5ab": "setNowTime(uint256)", +"8c17fc91": "getWeaponsArmy2(uint256)", +"8c19773f": "addBlock(address)", +"8c19c175": "getStageState(uint256)", +"8c19d2ca": "setCombatWonTeam(uint256,uint128)", +"8c1ab426": "WithdrawalofFunds(uint256)", +"8c1c7acc": "icoThreshold2()", +"8c1d01c8": "defaultPayment()", +"8c1d4a0a": "GreenEcoMinerToken()", +"8c1d8941": "transferLockedBalances(address,address,uint256)", +"8c1d92af": "distributePresaleTokens(address[],uint256[])", +"8c1d9f30": "isValidCandidate(bytes32)", +"8c1e04a6": "updateGenerationDict(uint256,uint64)", +"8c1e21da": "tokenPreSale()", +"8c1f85e5": "FeeSetup(address,address,uint256)", +"8c206979": "_freeze(uint256)", +"8c2081b5": "RewardsCoin()", +"8c217d06": "zsjz(uint256,string,string)", +"8c21f6bb": "getLockedGroup(uint8)", +"8c21ffba": "supplyLockedB()", +"8c22ac8b": "Account_frozen(address)", +"8c2305fd": "stakeBela(uint256)", +"8c25466a": "mintPreSale(address,uint256)", +"8c254c0b": "walletDev()", +"8c259654": "getRegistryDataRegistry()", +"8c25f54e": "linkContracts(address)", +"8c261e2c": "getHashRightPad()", +"8c26691e": "RanToken(address,address)", +"8c267b97": "cmoAddress()", +"8c26a340": "generateOrderByAdminWithPayee(address,address,address,uint256,string,string,string)", +"8c26c937": "STQPreICO3TestHelper(address,address)", +"8c26ebf7": "EgretiaToken()", +"8c272dba": "_buyin(address,uint256)", +"8c273a98": "getRefBonus(address)", +"8c2779f5": "gold_token_storage()", +"8c28c16e": "STAGE_TWO_ETHRaised()", +"8c28fd6e": "mintHelper()", +"8c2962b9": "setBuyAgent(address)", +"8c299d0c": "AdoptionOfferCancelled(bytes5)", +"8c29bce5": "setJoule(address)", +"8c2a5938": "setAllowedToBuyBack(bool)", +"8c2b8283": "WeiLaiExToken()", +"8c2d1549": "getTotalMined()", +"8c2d396f": "TelegramOpenNetworkContract()", +"8c2e6b3f": "ChangeSellRate(uint256)", +"8c2ec28d": "TestCTR()", +"8c2f04d9": "distributeUsingVaults(uint256,uint256,uint256,address)", +"8c2f6458": "calculatePreviousPrice(uint256)", +"8c30079a": "generateTeamTokens()", +"8c30779b": "getAvailableVestingAmount(address)", +"8c3088c6": "HeritableWallet(address,address,uint256)", +"8c308a71": "Anemoi(uint256,string,string)", +"8c3135f2": "poolTokenBalance()", +"8c31d67e": "getNoOfSoldToken()", +"8c324604": "MAX_TOKENS_EARLY_INVESTORS()", +"8c32c568": "Airdrop(address,uint256)", +"8c32e774": "isMaxTokensReached()", +"8c33417c": "WankCoin()", +"8c335b4b": "oceanBonus()", +"8c339a58": "QSHUCOIN()", +"8c33a5c4": "RESEARCH_AND_DEVELOPMENT_TOKENS_PERCENT()", +"8c343aee": "TestIssued()", +"8c346690": "toggleHalt(bool)", +"8c34dbec": "bitcoing()", +"8c363fda": "AbstractToken()", +"8c366dd3": "newinitialSupply(uint256)", +"8c3692c3": "popToken(address)", +"8c36ae89": "clearReward(address)", +"8c374d8d": "releaseApproval(address)", +"8c3753d7": "WEI_PER_FINNEY()", +"8c377ca6": "UnsetUsername(string,address)", +"8c379133": "Water(string,string)", +"8c37ce04": "MeetTokenBase()", +"8c37e152": "bountyTokensReserve()", +"8c37e31e": "setSpawningManager(address)", +"8c37edc4": "USN(address,address,bytes32,uint256,uint256,uint128)", +"8c382e22": "checkIsAssetPartOwner(bytes32,address)", +"8c3846e8": "ConsumerAddition(address)", +"8c38eddd": "_clearAddressFromCrowdsale(address)", +"8c397363": "setFinancialAddress(address,address)", +"8c39bf96": "DredgrSwapSolo(bytes5,bytes5,bytes32,bytes32,uint256,bytes32,bytes32,uint256)", +"8c39cb93": "makeClaim(bytes32,string,uint256,bytes32,uint256,uint256,uint8,uint256)", +"8c3b4fea": "_addVesterManager(address)", +"8c3b6f0e": "getCrystalGeneKindWeight(uint256)", +"8c3c00aa": "overdraftPeriodAmount()", +"8c3c4b34": "getSaleStatus()", +"8c3d5897": "MANHATTANPROXY2NDAVE()", +"8c3e1ff1": "modexp(bytes,uint256,bytes)", +"8c3e9e1a": "verifyYourself(string,uint256)", +"8c3f71b2": "_getCurrentTradableToken()", +"8c3f914a": "spread(bool)", +"8c3fae8c": "BeeUnity(uint256,string,string)", +"8c404cf1": "stablesCities(uint256)", +"8c41399c": "view30()", +"8c41d101": "LogAgreementAccepted(address)", +"8c421815": "RefundedTokens(address,uint256)", +"8c43a6f0": "updateBlockVoterProposal(uint256,address,bytes32)", +"8c4406c1": "setInputName(uint256,uint256,uint256)", +"8c4430b4": "setFinalLotteryAddress(address)", +"8c44cb27": "creationQuantity()", +"8c44dfb5": "bids_computed_cursor()", +"8c45cf24": "addJobContractMessage(uint256,string)", +"8c461e97": "setValueAirDrop(uint256)", +"8c46c7cd": "betAmount_()", +"8c47ddcc": "refundOwner()", +"8c4899ab": "ownerOfPlanet(uint256,uint256,uint256)", +"8c497285": "ChangeAddressTrust(address,address,bool)", +"8c4a6f62": "delMinter(address,address)", +"8c4af723": "changeNewRoundDelay(uint256)", +"8c4b0c58": "FrozenProfit(address,bool)", +"8c4b0e7e": "setOrganiser(address)", +"8c4b7300": "ViewBet()", +"8c4b87d2": "chris()", +"8c4c26a3": "BunToken(address)", +"8c4c564d": "deletePoll(bytes32)", +"8c4d3193": "getOrderDealTimeInterval()", +"8c4d59d0": "ticketCounter()", +"8c4dd5cd": "Democracy()", +"8c4e3f32": "_setApprovalForAll(address,address,bool)", +"8c4e8c21": "nextMintTime()", +"8c4e9c50": "prepareSell(address,uint256)", +"8c4ef31a": "getremainTokensperType(uint8)", +"8c4f7dae": "getMatchCount()", +"8c500418": "getICODate()", +"8c50d756": "bidSuccess(uint256,address,uint256)", +"8c518026": "_preSale(address,uint256)", +"8c523e27": "setFechHpbBallotAddrAddresss(address)", +"8c529628": "getVoteFromProposal(uint256,uint256)", +"8c52dc41": "enableRefunds()", +"8c5344fa": "countThisRecursive(uint256)", +"8c534d54": "getTokenTxnNum()", +"8c53f61d": "receiveETH(address)", +"8c546f81": "GNT()", +"8c549ef7": "COLOR_BROWN()", +"8c55041c": "Announcement(address[],uint256,uint256)", +"8c551742": "createItem(string,uint256)", +"8c55284a": "confirm(uint256,bool)", +"8c5597fd": "finalizeContributionEvent()", +"8c561592": "canUpdateInvoicingAddress(string,address)", +"8c564ebf": "freezeBypassing(address)", +"8c5871bf": "getLocksUnlockDate(address,uint256)", +"8c590917": "contribute(uint256,uint256)", +"8c590b5d": "getAllMatingAnimals()", +"8c59f7ca": "cancelOrder(address[5],uint256[6],bool,uint8,uint8,bytes32,bytes32)", +"8c59fba0": "DATP()", +"8c5a03bb": "SimpleDistributor()", +"8c5aae96": "LocalsMembership()", +"8c5ae183": "RemoveMod(address,address,bool)", +"8c5b830e": "getInviteeInfo(uint256)", +"8c5cc61c": "approvedreg(string,string,string,string)", +"8c5ce82a": "powerTest(uint256,uint256,uint32,uint32)", +"8c5d5e87": "ownerSetMod(bool)", +"8c5e06b1": "Channel(address,address)", +"8c5e2b0e": "MainSaleStart()", +"8c5f2d5d": "get_all_payment(uint256,address)", +"8c5f6d5a": "SetDebugExtra(uint32,uint8)", +"8c5f997e": "NewEntry(address,uint256,uint256,uint256)", +"8c5fb7fb": "modifyMember(string,string,string,string)", +"8c60e806": "closeContributions()", +"8c614502": "addCountry(address,uint256)", +"8c618066": "addressOfName(string)", +"8c6310ac": "NextOpen()", +"8c638152": "setApoderado(bytes32,bytes32,bytes32)", +"8c64400d": "updateTierDuration(uint256,uint256)", +"8c648117": "actualPrice()", +"8c6486c4": "sendRegistration()", +"8c64eb4f": "switchCrowdState()", +"8c655550": "advisorsAllocatedAmount()", +"8c6589b2": "getLastSTCPrice()", +"8c65f15d": "clearBonuses()", +"8c662ffa": "LogCollect(address,uint256,uint256)", +"8c663229": "lastSellPrice()", +"8c663ffc": "getBounsWithRoundID(uint256)", +"8c66c9fc": "findBest()", +"8c66d04f": "setFeeCalculator(address)", +"8c66f294": "distributeFeeRewards(address[],uint256)", +"8c676aaa": "CUZ()", +"8c67f63a": "calculatePayment(uint256)", +"8c682bde": "setWinnerAndWithdrawAllFunds(address)", +"8c6838ba": "getPost()", +"8c68bc3e": "SetContractorManager(address)", +"8c69554d": "OwnerRefunded(address,address,address,uint256)", +"8c69930d": "getNewFallbackDepositEffectuation()", +"8c69c559": "Crypbest()", +"8c6aefcf": "chip(uint256)", +"8c6b6085": "supportNewVoter(address,address)", +"8c6ba233": "isLateBy(address)", +"8c6c8323": "buyTokens(address,address,uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"8c6f2ec1": "setCompte_17(string)", +"8c6fc437": "standardICO(string,string,uint8,address,uint256[],uint256[],address[2],address[])", +"8c6fd8ec": "removeByIndex(uint256)", +"8c701ba8": "releaseRoots()", +"8c717138": "lastBlock_a1Hash_uint256()", +"8c71bed2": "unlockTeamTime()", +"8c71eaf1": "TokenBEN(uint256,string,uint8,string)", +"8c71ec16": "create(address,uint256,uint256,uint256)", +"8c7229cb": "pantura()", +"8c727fa3": "oldCirculatingSupply()", +"8c72c54e": "publisher()", +"8c72d4a4": "getStageTokenAmount(uint256,uint8)", +"8c733fdf": "weiToUsd(uint256)", +"8c73596c": "init(address,uint8,uint256,uint256,uint256,uint32,uint256)", +"8c748334": "cancelBuyOrder(uint256,uint256)", +"8c74c5c0": "bonusOff()", +"8c74d62c": "LockedInToken()", +"8c7565dc": "ADChainGrants(bytes32,bytes8,bytes32,bytes)", +"8c756b1d": "balanceByAd(address)", +"8c7698df": "lowerCase(bytes32)", +"8c76b4b7": "addTrustedContracts(address[])", +"8c771a8e": "newEscrow(address,uint256)", +"8c787768": "abbcwalletcoin()", +"8c789fb2": "setTokenBudget(address,uint256)", +"8c794114": "prizeWithdrawal()", +"8c79a24d": "refName(uint256)", +"8c79ca5d": "AddMember(address,uint256)", +"8c7a63ae": "getTokenInfo(uint256)", +"8c7a8140": "extractVestedOptionsComponents(uint256,uint256,uint256)", +"8c7c35b9": "internal_tester()", +"8c7c4016": "GameLogicContract()", +"8c7c9e0c": "eth()", +"8c7d1e8a": "MyKillerContract()", +"8c7d3241": "total_iou_available()", +"8c7d58aa": "isTimeExpired()", +"8c7dd9ec": "_canReveal(address,address)", +"8c7e1227": "setupStakingPriceFeed()", +"8c7e5008": "maxDonationInWei()", +"8c7e763b": "HSCC()", +"8c7f7806": "AfeliCoinPresale(address)", +"8c7fcd46": "BLVToken(uint256,string,string)", +"8c80fd90": "setMinStake(uint256)", +"8c812c51": "PhoenixExchangeFund()", +"8c817b6e": "registered(uint256,address)", +"8c82790b": "getReg3()", +"8c82dccb": "updateStatuses(bytes32[])", +"8c832ef4": "GalaxyCoin(uint256,string,string)", +"8c849f3f": "getMemes()", +"8c85ec66": "getCurrentDayRestDepositLimit()", +"8c864dfe": "_updateChecksum()", +"8c86ec20": "NMC(uint256,string,string)", +"8c877527": "allowTransfert()", +"8c87b2fc": "Identity(bytes32,bytes32)", +"8c882958": "LEToken()", +"8c88512f": "initializeCrowdsale(address)", +"8c88752a": "ContributorList(uint256)", +"8c8885c8": "setDecimals(uint256)", +"8c88b85f": "_finalizeRound()", +"8c88d716": "transferIfRequirementsMet(address,address,uint256,bool)", +"8c89b1c7": "setINCENTIVE_POOL_ADDR(address)", +"8c8a03ac": "setBucketManager(address)", +"8c8a261a": "devMiningRewardChanges(uint256)", +"8c8a40bd": "hashNotFound(address)", +"8c8b31ab": "dhanaToken()", +"8c8b6fc5": "challengeSubmitted(bytes32,bytes32)", +"8c8b802e": "getLimitPeriod()", +"8c8b9d54": "setEmployeeStorage(address)", +"8c8bc5ce": "ChangeICOStart(uint256)", +"8c8d067f": "chosenProposal()", +"8c8d2ede": "team1()", +"8c8d36c2": "THANKSTEST3()", +"8c8d98a0": "toTimestamp(uint16,uint8,uint8)", +"8c8df7cd": "GOTokenCrowdsale()", +"8c8e2478": "convertTokens()", +"8c8e5f1f": "BlockTubePrepaid()", +"8c8e8fee": "token_address()", +"8c8ee490": "checkReleaseAt(address)", +"8c8f94f5": "DeletePrice(uint256)", +"8c8f95fb": "lockFunds(uint256)", +"8c8f9c0e": "issueTokenToAddress(address,uint256,uint256)", +"8c8fc30b": "addAd(uint32,uint32,string,string,string,uint256)", +"8c907c0d": "LanderToken(uint256,string,uint8,string)", +"8c90b2ea": "pay055(address)", +"8c9151ae": "voteProposal(uint256,bytes32)", +"8c91bd3e": "addMoves(uint256,uint256[2])", +"8c91daac": "startRoundSeed()", +"8c920a38": "testSanityCheck()", +"8c924e9c": "incrementRead()", +"8c93256e": "transferReward(address)", +"8c934d71": "forceRefundCfd(uint128)", +"8c937da3": "WALLET_LB_TEAM()", +"8c9425e4": "privateLockAddress()", +"8c943b6c": "setDistrictCode(bytes32)", +"8c944339": "setActiveSkin(uint256)", +"8c944bb2": "_createPrimordialLot(address,uint256,uint256,uint256)", +"8c945d38": "takeOffItem(uint256,uint8,address)", +"8c94db38": "MMCoin(uint256,string,string)", +"8c9512bc": "companyTokens()", +"8c9515ea": "doPayouts(uint256[49],address[49],uint256)", +"8c9540d3": "isCommittee(address)", +"8c95acee": "getTreshold(uint256)", +"8c96a2c9": "getAssetPackPrice(uint256)", +"8c96a538": "COO_SHARE()", +"8c96e34b": "betIsSettled()", +"8c98117c": "getBill(uint256,uint256)", +"8c988a46": "isLinkedWallet(address)", +"8c9924d5": "AddrMarketing()", +"8c99d363": "updateTokensToInvestor(address,uint256)", +"8c9a4f13": "FundsTransferred(address,uint256)", +"8c9ae56f": "QueryPlayerBonus(address,uint256)", +"8c9b2cd1": "ModultradeProposal(address,address,address)", +"8c9c2977": "newMember(uint8,bytes32,address)", +"8c9ce20c": "_addressNotNull(address,address)", +"8c9cf205": "SignVersion(string,string)", +"8c9d8300": "withdrawForAdmin(address,uint256)", +"8c9dd650": "Etherlott()", +"8c9e81e5": "triggerICOState(bool)", +"8c9ecd00": "toDec()", +"8c9f7074": "setInterestFeePercent(uint256)", +"8c9f7b39": "endSale(address)", +"8c9f8935": "ClaimSet(address,address,bytes32,bytes32,uint256)", +"8c9fcfe2": "payForUpgrade(address,uint256)", +"8ca0dd20": "tgeCap()", +"8ca10f9b": "sendRemainingTokens(address)", +"8ca17755": "etheraffle()", +"8ca17995": "divest(uint256)", +"8ca3b448": "addUser(address,address)", +"8ca3c553": "setData(string,string)", +"8ca47688": "WhiteListUpdated(address,bool,address)", +"8ca4eef6": "getBuild(bytes32)", +"8ca517dd": "getActiveBuyDetails(bytes32)", +"8ca51f82": "setMinimumClaimValue(uint256)", +"8ca5d525": "removeAllowedHICAddress(address)", +"8ca5da35": "mintManual(address,uint256)", +"8ca6c287": "InsurContract()", +"8ca6f747": "potatoBalanceOf(address)", +"8ca74163": "BZCToken(address,uint256)", +"8ca79351": "ethPriceIn()", +"8ca84d40": "preparationPeriodTrainingFeeMultiplier()", +"8ca9ac01": "LogBeerClaimed(address,uint256)", +"8ca9e721": "finalizeCrowdSale()", +"8caa0083": "teamCount()", +"8caa5c91": "DataBase()", +"8caaaae6": "totalWeiPrice()", +"8caaab4d": "verifyProofOfStakeInternal(uint256,bytes32,bytes32,uint256,bytes32[],uint256[],uint256,uint256)", +"8caad7b5": "changeMinDepositAmount(uint256)", +"8caba7b7": "startCharging()", +"8cac1939": "TOKEN_TEAM()", +"8cac3b42": "addDividend()", +"8cac5f55": "feeForTheStakingInterval()", +"8cad5826": "FundTransfer(uint256,bytes32,address,address)", +"8cadaa5d": "TokenFreeze()", +"8cadd6a2": "getVestedBalance(uint256,uint256,uint256,uint256)", +"8cae013e": "signatureFunc(bytes)", +"8cae1374": "editBlock(uint8,uint8,uint256,int8[5])", +"8cae59dd": "heapSort(uint32[])", +"8cae711f": "mintLiquidToken(address,uint256)", +"8cb09d4d": "GCTToken()", +"8cb0a511": "approve(uint256,address,uint256)", +"8cb18ef6": "needFightToAdult()", +"8cb1b614": "setWhitelisted(address,address,uint256)", +"8cb1e9c1": "unlockedAt()", +"8cb240b0": "saasPayment(address,uint256)", +"8cb36aef": "requestCoinToUSD(string,bool,uint256,uint256)", +"8cb3728c": "getAllRevisionTimestamps(bytes32)", +"8cb39385": "getMinBid()", +"8cb3c89f": "loadEthBalances()", +"8cb47a2f": "CrowdForceSampleToken()", +"8cb5497c": "setOperator(bytes32,bool)", +"8cb56999": "GetExpireTime(uint256,uint256)", +"8cb5a0c0": "removeCoordinator(address)", +"8cb858cb": "PRCVToken(uint256,string,uint8,string)", +"8cb996df": "LogMigrationEnabled(address)", +"8cbb02ad": "Marijuana()", +"8cbb13e7": "TokenRHT()", +"8cbb6593": "SHNZ2()", +"8cbba6cf": "isPreWhiteListed(bytes32)", +"8cbbe25f": "NIMFA_PER_ETH_PRE_SALE()", +"8cbc8c0b": "lockholderNumber()", +"8cbcbca2": "_payChicken(address,uint256)", +"8cbcca07": "fillBuyOrder(uint256)", +"8cbdf1d1": "mintARC(address,uint256)", +"8cbe775a": "Bitdepositary()", +"8cbe898d": "CommitteeLimits(uint256,uint256)", +"8cbeb340": "ControlContract(address)", +"8cbf4145": "confirmPrintProxy(bytes32)", +"8cbfa1ec": "quoteAsk()", +"8cc02403": "cobrarImpuesto(uint256)", +"8cc04ebb": "_appendUintToString(string,uint256)", +"8cc17117": "forceRecoverCollateralInternal(address)", +"8cc2f547": "DiceGameCrowdsale(address)", +"8cc30c6f": "buyStageDataRecord(uint256,uint256,uint256,uint256)", +"8cc34ed7": "zilla_remaining()", +"8cc40d71": "dividend_amount()", +"8cc4ab11": "getPurchaseTimestampEnds()", +"8cc50ecd": "addBlock(string,uint256,string)", +"8cc519bf": "companyTimelock()", +"8cc51eda": "kitties(uint256)", +"8cc5510f": "setTeamAddress(address,bool)", +"8cc55473": "bulkTokenMint(address[],uint256[])", +"8cc57368": "getUserTokens(address,uint32)", +"8cc5cde2": "isLunyrToken()", +"8cc5e56e": "revokeLockByIndex(address,uint256)", +"8cc60a61": "isStoreActive(uint256)", +"8cc60eca": "SS()", +"8cc63bfb": "marketingFunds()", +"8cc6acce": "updateConfig(bytes)", +"8cc78a40": "option20symbol()", +"8cc7ea0e": "Xian()", +"8cc89e1b": "TCCoin()", +"8cc8baaf": "getBuyPriceTimes()", +"8cc8c236": "_transfer(address,uint256,bytes)", +"8cc9638c": "fundBurn(address,uint256)", +"8cc98bc3": "approveEliminate(address,uint256)", +"8cc99aa3": "getAmountForCurrentStage(uint256)", +"8cca5a3f": "withdrawWallet(address)", +"8cca8f64": "canClaimRefund(address)", +"8ccb381b": "tenthTotal()", +"8ccb4daf": "getPositionMaxDuration(bytes32)", +"8ccb59e8": "revealWinner(uint256)", +"8ccb9f2d": "del_admin(address)", +"8ccbd6da": "freezeToken()", +"8ccc04ea": "proofOfConceptCap()", +"8ccc4781": "Math(int256)", +"8cccc341": "initiateChallenge(address)", +"8cccf2df": "viewServiceReward()", +"8ccd227c": "gameRequestTokens(address,uint256)", +"8ccdcf80": "tokenSalePausedTime()", +"8cce10c8": "rank(address,address,uint256)", +"8cce49c9": "mokenData(uint256)", +"8cce7e92": "removeMarketFromWasCalled()", +"8cceb1e8": "notifyBurn(address[])", +"8cd0a573": "transferWithCustomReserving(address,uint256,uint256)", +"8cd0fc3d": "TRONClassic(uint256,string,string)", +"8cd221c9": "roundId()", +"8cd25904": "calculateAndCreateTokens(uint256)", +"8cd3751b": "newProposal(address,uint256,uint256,bool,bool,address,uint256,uint256,uint256,uint256)", +"8cd3f064": "acceptToken(address)", +"8cd41fae": "StartCompetition(uint8,uint8,uint8,uint8,uint80,uint32)", +"8cd41fd8": "referrerBonus2()", +"8cd42991": "getTimeRemaining(uint256)", +"8cd47415": "zkWithdrawTrusted(bytes32,uint256,address,uint256[2],uint256[],uint256[],uint256[],uint256)", +"8cd4d21a": "x(uint256,address)", +"8cd4fdf1": "maxGamble()", +"8cd53767": "withdraw(bytes32,address,address,uint256,uint256,bytes32,bytes,bytes,bytes32)", +"8cd5dce3": "setNextRoundRequiredBetAmount(uint256)", +"8cd6c7fa": "seedSingleSaleCount()", +"8cd70e72": "isInitalized()", +"8cd85846": "totalTranches()", +"8cd85dc2": "getWinNumbers(uint256)", +"8cd8bd05": "IanCoin()", +"8cd8db8a": "init(uint256,uint256,uint256)", +"8cd90e31": "EAToken(uint256,string,uint8,string)", +"8cda2a15": "SafePromo(string,string)", +"8cda4430": "lookupRoyalty(address)", +"8cdb1719": "approveCertification(uint256)", +"8cdbd8fb": "remainToken()", +"8cdc86a6": "sort()", +"8cdcbdef": "closeBlock()", +"8cdcdae1": "testControlUpdateLatestRevisionNotOwner()", +"8cde43dc": "getCrowdsaleMaxRaise(address,bytes32)", +"8cde4667": "BANKNET()", +"8cdf31fa": "Cryptoya()", +"8cdfb1e6": "transferIfHF(address)", +"8ce0080f": "updateGuMasks(uint256,uint256)", +"8ce05b54": "bornFamedStar(address,uint256)", +"8ce060fb": "FounderSwitchRequestEvent(address)", +"8ce0bae8": "Canceled(address,uint256,address,address,uint256,address,uint256,uint256)", +"8ce0bd46": "Deposit(address)", +"8ce113dc": "right60(uint256)", +"8ce187fd": "raisedUSD(uint256)", +"8ce25a93": "numAccounts()", +"8ce2ae2d": "creator_new()", +"8ce2e0ea": "addLastTwoAmbassadors(address,address)", +"8ce2f386": "AcceptsOmniDex(address)", +"8ce3ee62": "transferEmpire(address)", +"8ce450de": "assetThaw()", +"8ce4f1b2": "setGasRewardPercent(uint256)", +"8ce53e5b": "getMaximumInvestmentPerDay()", +"8ce5877c": "removeSpender(address)", +"8ce69b72": "USD_IN_ETH()", +"8ce74426": "protocol()", +"8ce795f5": "SerbiavsBrazil()", +"8ce7be01": "getUniqueSpinnerPrice()", +"8ce7ff4a": "getVote(uint256,uint256,uint256)", +"8cea577a": "allowFunction(bytes32,bytes4)", +"8ceaa23f": "setAvailablePositions(uint256)", +"8cead4bf": "currentProfit()", +"8cec9176": "SimpleMultisigWallet(address[],uint256)", +"8cec9f4c": "playlotto(uint256)", +"8cecd03e": "INVESTOR_TOKENS()", +"8cece594": "countClaimBackers()", +"8cecf66e": "_inverse(uint256)", +"8ceda04d": "getCounting(bytes32)", +"8cee3b4d": "getPolicyByCostumerCode(string,uint256)", +"8cee8778": "crear(uint256)", +"8ceeaaa8": "getTodayOwnerAddress()", +"8ceedb47": "cage(uint256,uint256)", +"8cef1ed9": "xpectoTTF1Token()", +"8cef2b93": "CECNaypyidaw(address,uint256)", +"8cefad63": "setAirEndtime(uint256)", +"8cefaf1a": "setSalesEndTime(uint256)", +"8cf0c191": "rum()", +"8cf19975": "createLottery(string,uint256,uint256,uint256,uint256,uint256,uint256)", +"8cf1c5c4": "LogFeeEvacuation(uint256)", +"8cf20038": "engDevAddress()", +"8cf228cd": "DNNTDE()", +"8cf3313f": "calculateWeightedMultiplier(uint256,uint256,uint256,uint256)", +"8cf3562b": "DEC15Recursive()", +"8cf37ece": "InformRebuy(uint256)", +"8cf39a9c": "TicTacToe(address,address,uint256)", +"8cf3a181": "addRRA(address)", +"8cf3e683": "isAddressExcept(address,address)", +"8cf49cad": "ReleaseDate()", +"8cf4dbfb": "collectBalance()", +"8cf57cb9": "rewardAddress()", +"8cf5dbc6": "recruitHero()", +"8cf7b7a4": "slashAddressLikeUsername(string,uint256)", +"8cf7d906": "playAndFinishJackpot(uint256,uint256,uint256,uint256)", +"8cf80438": "winningBid()", +"8cf8151f": "appWasMade(bytes32)", +"8cf907fb": "EndRefund()", +"8cf92ade": "distributeBountyTokens(address[],uint256[])", +"8cf9f5e7": "getPreSelledInPool()", +"8cfa8eea": "getWeiToUsdExchangeRate()", +"8cfaabcc": "managementTransfer(address,uint256)", +"8cfae7e4": "TransferUnsoldTokensBackToTokenContract(address)", +"8cfb3088": "defaultExpiry()", +"8cfb7c02": "updatePopularity(bytes32,uint256)", +"8cfb8f21": "isKnownUniverse(address)", +"8cfd6d4c": "CCH_LLV_FIFA_2()", +"8cfd8901": "_incBlock()", +"8cfdacb0": "STARTING_PACIFIST()", +"8cfe6a09": "tokensToEthereum_2(uint256)", +"8cfe7c32": "bTransfer(address,address,address,address[],uint256[])", +"8cff1990": "isSignedByAndrey()", +"8cffa21c": "getOwnedItems()", +"8d000903": "createTokenToMarket2018()", +"8d003a0f": "addCurrentTime(uint8)", +"8d008989": "Multisig(address,address,address,address)", +"8d00abb6": "setAElfCommunityMultisig(address)", +"8d012295": "presaleVesting(address,uint256,uint256,uint256,uint256,uint256)", +"8d0128cb": "transferMintKey(address,int256)", +"8d01308c": "PRESALE_START_WEEK3()", +"8d03b102": "testing()", +"8d044c06": "unpauseRedemption()", +"8d049190": "mapWidth()", +"8d0515dc": "HenryMiniToken(uint256,string,uint8,string)", +"8d0522c5": "set_contrib_arbits_max(uint256)", +"8d0528ec": "Withdraw_referral()", +"8d05ad4e": "NLL()", +"8d062046": "testTokensAreTransferrableAfterSale()", +"8d068043": "requiredSignatures()", +"8d0716c4": "approveScoupons(address,uint256)", +"8d07ae9f": "getBidDetails(address)", +"8d086da4": "withdrawShares()", +"8d089930": "limitEndDate()", +"8d08eefa": "setCORAddress(address)", +"8d09b9cc": "TeCToken()", +"8d09c674": "Donated(address,uint256,uint256,uint256)", +"8d0a3b6d": "bonusByAmount()", +"8d0a5fbb": "getOrderCount()", +"8d0a73e3": "tokenDistributionStartTime()", +"8d0aadca": "playerDelayOnExit(address)", +"8d0ae472": "AsheToken()", +"8d0b3d9b": "_add(uint32,address)", +"8d0b4be5": "setXPContractAddress(address)", +"8d0bba03": "MINIMUM_CONTRIBUTION()", +"8d0caef5": "bonusStage1()", +"8d0cf786": "MatchAdded(uint256,uint8,uint16)", +"8d0d018c": "havedDistDevCoin()", +"8d0d27ba": "queryPlayerType(uint32[11])", +"8d0d3ccf": "getBonusTier()", +"8d0d877f": "LZZ()", +"8d0dd3c0": "setBUU(bytes32,uint256,uint256)", +"8d0e5136": "isPlayerInQueue(address)", +"8d0eda03": "isInvestorLocked()", +"8d0f403a": "adminAddAction(bytes32)", +"8d0f8cef": "drop(address,uint256)", +"8d0fc05a": "votesYes()", +"8d10215e": "grantAccess(uint256,uint256,string)", +"8d106690": "setPropertyFlag(uint16,uint8)", +"8d111ac6": "checkTokSold()", +"8d119d41": "AngelCoinV1()", +"8d121247": "changeProductionFeeRecipient(address)", +"8d12aba7": "IMCOToken()", +"8d134175": "CellTokens()", +"8d1343e0": "issueDate()", +"8d13d972": "getUsdFee(bytes32,uint256)", +"8d13ea34": "changeUserProjectExp(bytes32)", +"8d14670a": "multiUnlock(address[])", +"8d149b3c": "compareInts(int256,int256)", +"8d152d78": "pushBytesArray(bytes32,bytes32)", +"8d1540c1": "CoinBuy(uint256,address)", +"8d159787": "buyDragon(uint256)", +"8d15a218": "LogRedeem(address,uint256)", +"8d15b307": "privateEventActive()", +"8d16fd83": "sellDai(uint256,uint256,uint256)", +"8d17664d": "getSecret(uint256)", +"8d182f01": "removeSale(bytes32)", +"8d1a4b28": "getGame(address)", +"8d1a7765": "getPlayerGeneral(uint64)", +"8d1b2afd": "logFeeWindowCreated(address,uint256)", +"8d1bc93d": "buyWuxiaMaster()", +"8d1c3b8b": "sHasDownvoted(uint256,uint256,address)", +"8d1c8048": "transport(uint256)", +"8d1ca4ec": "addGuess(int256)", +"8d1d1572": "transferFeeAddress()", +"8d1d22d8": "renameMonster(uint64,string)", +"8d1d2c21": "categoricalEvents(bytes32)", +"8d1d8639": "getcanuserun(address)", +"8d1dff6b": "mintTokens(uint256,address,bool)", +"8d1e6b56": "issueCompanyTokens()", +"8d1eaf78": "registrarInfo()", +"8d1fdf2f": "freeze(address)", +"8d20194d": "getWhiteUsersFrom(uint256,uint256)", +"8d215adc": "Bettings(uint256,uint256)", +"8d216186": "roll(uint256,bytes32)", +"8d22651e": "MAX_NUM_OF_CHOICES()", +"8d227fc0": "getPeriodInfo()", +"8d22b345": "getAppTokenCode(uint32)", +"8d24abbc": "closeAndTransferTokenOwnership()", +"8d24d147": "rvDeposit()", +"8d24f5bc": "tokensByBtcTx(string)", +"8d256b0a": "ExchangeRate(uint256)", +"8d258104": "setManager()", +"8d25827a": "countOpenPackageOfOneAgency(address)", +"8d259d65": "_sellCallToOpen(uint256,uint256,uint256,uint256,address)", +"8d25af04": "restartGame()", +"8d26d88f": "feeWithdrawTokenAmount(uint256)", +"8d26eb2b": "edgePigmentG()", +"8d272b0a": "TaeCoin()", +"8d2810fe": "GenesisBuyPrice(address)", +"8d288e93": "toRefund()", +"8d28da21": "ECT(uint256,string,uint8,string)", +"8d298851": "initialIssue()", +"8d29a239": "finalizeHoldingAndTeamTokens(uint256)", +"8d2a0910": "getTotalDividendsPaid()", +"8d2af65d": "claimTokenReserveFinan()", +"8d2c8ce8": "RrcToken()", +"8d2c929a": "bridgeNodes(address)", +"8d2d2563": "saleFirstEarlyBirdEndBlock()", +"8d2d3f41": "getKeyRevisionNumber(uint32)", +"8d2dcb2d": "TokenPool(address,address)", +"8d2ea8dc": "withdrawAvailableToken(address,address,uint256)", +"8d2f349f": "TransCompleteds()", +"8d2f7272": "CariToken()", +"8d300458": "updateInvested(address,uint256)", +"8d30241b": "HasGoods(uint32)", +"8d30d418": "ContractRemoved(address)", +"8d30e65d": "claimReservedTokens(address,uint256)", +"8d3121b3": "releasedTokenTotal()", +"8d317de2": "OctusToken()", +"8d323fdc": "LogAddressTokenCapChange(uint256,string)", +"8d331996": "setTimeWindow(uint256)", +"8d334529": "restrictions(address)", +"8d348b7c": "mintToClient(address,uint256)", +"8d357fa3": "getKeys(uint256)", +"8d35b9ce": "ARXpresale()", +"8d361e43": "removeSigners(address[])", +"8d361f6e": "bonusTokensDistributed()", +"8d375da2": "testMakeItFail()", +"8d37f52c": "addAgingTime(uint256)", +"8d38b237": "calculateCountOfInvestmetnsInQueue(uint256,uint256)", +"8d38f5a0": "Burn(address,uint256,bytes)", +"8d3945e4": "setCounter()", +"8d3965be": "buyerApprove(uint256,bytes)", +"8d3972d5": "FABIToken()", +"8d399ce3": "submit(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[])", +"8d3a5ded": "initPlatinum()", +"8d3af7eb": "withdrawLemontokens()", +"8d3b6d08": "registerSsp(address,uint8,uint16)", +"8d3bd1f8": "teamTokensGenerated()", +"8d3c7415": "JuzixTokenManager()", +"8d3d523b": "bet2Of(uint256)", +"8d3d6576": "maxContribution()", +"8d3d70df": "takeBet(uint256,address,uint256,uint256)", +"8d3d8587": "GanaPreSale(address,address,address)", +"8d3def46": "oryza()", +"8d3ef87d": "getuserlistlength(address)", +"8d3f0ed5": "allocateTokens(address,uint256,uint256)", +"8d3fd859": "sellFucks()", +"8d442ae0": "toUint8(bytes,bytes,uint256)", +"8d447e39": "getLatestWhitepaper(address)", +"8d44c90b": "BurnMyTokensAndSetAmountForNewBlockchain()", +"8d44f13b": "claimFromPool()", +"8d4572be": "rens()", +"8d45e221": "Partial23Transfer()", +"8d467f22": "getKeysFromEth(uint256,uint256)", +"8d472709": "contribute(address,address,uint256)", +"8d475461": "m_teamId()", +"8d4777c8": "claimGooDepositDividends(address,uint256,uint256)", +"8d47c7d7": "getTokenListed()", +"8d498158": "DaleoneToken()", +"8d49cd7f": "getTeam(uint32)", +"8d49da75": "stopCollection()", +"8d4a2d39": "addSeconds(uint256,uint256)", +"8d4d801c": "addRecipient(bytes32,string,string,address)", +"8d4d8e19": "unregisterAsDelegate()", +"8d4e4083": "isFinalized()", +"8d4e57e6": "ROLE_TOKEN_CREATOR()", +"8d4ea1ba": "addEtherForOraclize()", +"8d505019": "addNote(bytes32,string)", +"8d50b6d0": "doSelectDisputedStateRoot(uint256,bytes32,uint256)", +"8d51faec": "setOwnerTestValue(uint256)", +"8d521149": "bonus_received()", +"8d52a1fc": "setStrikePrice(uint256,uint256)", +"8d539b35": "resetPendingContribution(address)", +"8d53b208": "revokeAccess(bytes32,address)", +"8d551860": "horseNotForSale(uint256)", +"8d553538": "addSecondaryRecord(string,bool,string,bool,string,string,string)", +"8d5555f2": "priceFor(uint256)", +"8d55719e": "_withdrawEther(address)", +"8d55b6ac": "thirdRate()", +"8d565abf": "createTx(address,address,uint256)", +"8d56ac74": "REALEX()", +"8d56bc62": "Bankroi()", +"8d574383": "setDemurrageFrequency(uint256)", +"8d578bee": "totalSaleCap()", +"8d5802e2": "getAssetOwner(uint256)", +"8d59cc02": "register(address,string,string)", +"8d59d1f1": "donate(uint256,string)", +"8d5a225e": "assignReserveSupply(address)", +"8d5c4456": "pIndex()", +"8d5c84cd": "isStart(bytes32)", +"8d5cc102": "traded_token()", +"8d5ceeca": "checkShares(address)", +"8d5d1e97": "priceStar3()", +"8d5d3429": "requestLoan(uint256)", +"8d5d88c9": "LTYG()", +"8d5dee05": "EGGS_TO_HATCH_1TURTLE()", +"8d5e4f9c": "BroFistCoin()", +"8d5f3f96": "nextInvestorsProfitSum()", +"8d5f8d1c": "forwardFundToCompanyWallet(uint256)", +"8d5fa05c": "setAreas(address,uint256)", +"8d6014a8": "FixedCeiling(uint256,uint256)", +"8d60be98": "ICO_TOKENS_PERCENT()", +"8d60e30b": "reward(address,uint256,bool,string)", +"8d60ed85": "setDevCutPercentage(uint256)", +"8d614474": "AdvancedEthVocToken(uint256,string,string)", +"8d622749": "award(address,address,string)", +"8d627e91": "isTryedFinishCrowdsale()", +"8d62b845": "isMakersSignatureValid(address,bytes,string,address)", +"8d63c77b": "WizardReplacedEvent(address,address)", +"8d63cfa7": "getPixelOwner(uint16,uint16)", +"8d647185": "setBaselineRate(uint256)", +"8d647d3a": "allowPrivateParticipant(address,uint256)", +"8d64bcf1": "maxWhitelistPurchaseWei()", +"8d65095e": "PI_EDIT_3()", +"8d656b83": "minWeiInvestment()", +"8d664d6a": "setFeeRates(uint8,uint8,uint8)", +"8d670a2e": "unlockPlayerFunds(address)", +"8d6731b0": "LudumToken()", +"8d67799e": "MAX_SIZE()", +"8d6819be": "mintTokens(uint256,address,uint256)", +"8d688b6e": "EthPyramid()", +"8d68cf59": "sendFunds()", +"8d69121d": "addDocument(bytes32,string,string)", +"8d69ca74": "wdEthereum(uint256,address[])", +"8d69e95e": "serviceProvider()", +"8d6a2ed5": "minimumBuyAmount()", +"8d6a6d4b": "_allocatePromoTokens(address,uint256)", +"8d6a6fbd": "proxyTransfer(address,address,uint256,bytes,string)", +"8d6b5d3e": "getScouponAllocationFactor()", +"8d6c58ab": "isTransferToICAPAllowed(address,bytes32,uint256)", +"8d6cc56d": "updatePrice(uint256)", +"8d6cd879": "FOUNDATION_STAKE()", +"8d6cd8de": "buffPtr()", +"8d6e56e1": "manyInputsNoReturn(uint256,uint256,uint256,uint256)", +"8d6f24d4": "hash_msg()", +"8d702122": "ownerKill()", +"8d70650f": "getSiteId(uint256,uint256)", +"8d70baaa": "BattleOfTitansToken()", +"8d70c0ce": "transferToExchange(address,uint256,uint256)", +"8d7108e5": "isValidLocation(uint8,uint8,int8[5],int8[24])", +"8d711776": "sendCrypto(address,uint256)", +"8d7117d4": "etherRatio()", +"8d715d9d": "Backdoor()", +"8d71f131": "TOKEN_RESERVE2_CAP()", +"8d72920b": "getAllowedAmountToContribute(address)", +"8d72a473": "deductFunds(address,uint256)", +"8d72f856": "deleteVip(uint256)", +"8d734b30": "setupMintableAddress(address)", +"8d73c027": "mintWithApproval(address,uint256,address)", +"8d747928": "isDrivezyPrivateTokenAcceptable()", +"8d748148": "monitor(address,bool)", +"8d74fd52": "GlobalTourToken()", +"8d75533f": "mint(address,string,bytes)", +"8d7570fc": "doBurn(uint256)", +"8d75fe05": "mintedTokens()", +"8d7601c0": "addResolvers(address[],uint256[])", +"8d77090f": "TriggmineToken()", +"8d776457": "sellBNT(uint256)", +"8d78c90b": "EventUpgrade(address,address)", +"8d79283d": "query1_fnc()", +"8d792964": "TD(uint256,string,string,uint8)", +"8d7a55bf": "PubKeyHashTypeAdded(uint8)", +"8d7af473": "numberOfProposals()", +"8d7b5243": "minerTotalReward()", +"8d7cdcf4": "setLLV_edit_8(string)", +"8d7cffb7": "transferWrappedContractAdmin(address)", +"8d7d2e5b": "minerPreSupply()", +"8d7daf95": "isTokenPairWhitelisted(address,address)", +"8d7e5be0": "getClue1()", +"8d7e7958": "userGrowsPoolSupply()", +"8d7e8a57": "approveSpenders()", +"8d7eca6f": "FUNDING_END_TIMESTAMP()", +"8d7f26e9": "setIPAddress(bytes32,bytes32,address)", +"8d7fe693": "Helios()", +"8d8001ad": "updateMintingStatus(uint256)", +"8d809b0e": "project_wallet()", +"8d80c34e": "unblockAccount(uint256)", +"8d80c922": "getAddressById(uint256)", +"8d81a1ce": "setClamTax(uint256)", +"8d81a88f": "BP_ATHENIAN()", +"8d81e2c0": "getTankTotalEarned(uint32)", +"8d81f51e": "safeTransferChild(uint256,address,address,uint256,bytes)", +"8d822615": "setFeeForArtWorkChangeRequest(uint256)", +"8d835674": "euroRaised(uint256)", +"8d837f38": "getEthBalTeller(address)", +"8d83cc95": "getNextSnapshotBalanceOfMul(address[])", +"8d842fad": "stopPreICO()", +"8d84a7fd": "credit(string,uint256)", +"8d854fde": "getDisputeId()", +"8d859f3e": "PRICE()", +"8d85a70f": "Vote(address,uint256,bool)", +"8d860880": "CheckOut()", +"8d86484c": "setPercentUnfrozenAfterAwardedPerPeriod(uint256)", +"8d8660bc": "setQuantity(string,int256)", +"8d86faa6": "getAmountToGive(address,address,address,uint256,uint256,uint256,uint256,uint8,bytes32,bytes32,uint256)", +"8d87b102": "amountOfStakeToBeReturned(address,uint256)", +"8d8833bf": "periodPreITO_wei()", +"8d89873c": "updateAndGetRemaining()", +"8d8a7f07": "VLBRefundVault(address)", +"8d8a88fc": "pay(bytes32,uint256,bytes)", +"8d8acee9": "setupMultisig(address,address)", +"8d8b1b88": "mixGenes(uint256,uint256)", +"8d8bd44f": "TokenSaleFinished(string,address,uint256,uint256,uint256)", +"8d8c36e9": "purchasedBy(address)", +"8d8d22ba": "changeServiceAddress2(address)", +"8d8d50d0": "createUnicorn()", +"8d8d92fa": "theBid()", +"8d8e2ea9": "Tablow()", +"8d8e4561": "theGrid(uint256)", +"8d8e5da7": "emergencyWithdrawal(address,address,uint256)", +"8d8f2adb": "withdrawTokens()", +"8d8f7780": "GEE100()", +"8d8f95d1": "collectDrugs(address)", +"8d909ad9": "getSeedAndState(string,address)", +"8d91801a": "RxEALTestSaleContract()", +"8d91931f": "longLock()", +"8d91e803": "buyWhiteCore(uint256,uint256,uint256,uint256)", +"8d920b02": "rejectPayment(uint256)", +"8d927069": "getTrace(uint256)", +"8d927b34": "maxPendingBalances()", +"8d928af8": "getVault()", +"8d92910c": "isLegalAttack(uint256,uint256)", +"8d92c187": "testFinalize()", +"8d92ce46": "submitBlockHeaders(bytes)", +"8d92fdf3": "withdrawAsset(uint256)", +"8d93758e": "PRESALE_STAKE()", +"8d93eac2": "mintFeeNumerator()", +"8d93ec88": "poolWallet()", +"8d94053f": "verifyAutoridadElectoral(bytes32)", +"8d949635": "endRefundableTime()", +"8d949c8b": "D(uint256)", +"8d956f1e": "tokenTransfer(address)", +"8d95f245": "sellkey(uint256)", +"8d976d76": "investCommission()", +"8d977672": "tasks(uint256)", +"8d977d9e": "checkGameClosed(address)", +"8d98ee43": "_verifyAddress(address)", +"8d98f4e3": "getAllCardsDefence()", +"8d9940b9": "createRetainer()", +"8d995f94": "transferAndFreeze(address,uint256)", +"8d99b2eb": "endPoll()", +"8d9a7b49": "pricePerMessageChanged(uint256,uint256)", +"8d9ad08e": "getAllInvestments()", +"8d9afc0f": "getStageId()", +"8d9b449b": "addRevenueShareCurrency(address,string)", +"8d9d851c": "toggleVaultStateToAcive()", +"8d9e6e47": "setFinalICOPeriod()", +"8d9e8a76": "CMGG12StandardToken(uint256,string,uint8,string)", +"8d9efa3f": "LogPhaseSwitch(uint8)", +"8d9f39d1": "_clear(uint256)", +"8d9f95c4": "PresaleEntry(address,uint256)", +"8da03997": "getNativeReputation(address)", +"8da15531": "SimpleCoinToken()", +"8da16e48": "geraHash(string,string)", +"8da198cd": "simpleAssert(bool)", +"8da1e722": "minGamePlayAmount()", +"8da2a2a1": "reserveDistribute()", +"8da2defb": "WE(uint256,string,uint8,string)", +"8da2fc26": "Burn(address,uint256,uint256,bytes)", +"8da3d736": "addToList(uint256,address[])", +"8da46db4": "DistributeXcel(address)", +"8da4d3c9": "claimCount()", +"8da4d776": "newCommune(address)", +"8da58897": "starttime()", +"8da5cb5b": "owner()", +"8da5fd77": "unlockSecondaryTokens()", +"8da66e67": "LogCollectAmount(uint256)", +"8da76874": "mintFromTrustedContract(address,uint256)", +"8da7d0b5": "totalChildContracts(uint256)", +"8da8023c": "endTimeOfStage(address,uint256)", +"8da8524f": "LogFrozenStatus(bool,uint256)", +"8da87ac6": "addressFundPlatform()", +"8da8a5ae": "nativeBlockhash(uint256)", +"8da8f235": "_addController(address)", +"8da91d04": "unset(uint32[])", +"8da9b772": "getHello()", +"8daaaa2f": "HOUSE_EDGE()", +"8daaf0a2": "addTokens(address,address,uint256)", +"8dab38da": "BONUS1_LIMIT()", +"8dac0e8c": "GetEtherPrice()", +"8dac7191": "initialTokenOwner()", +"8dad52f4": "dive4(address)", +"8dae3d68": "awardLuckyCoin(uint256,uint256)", +"8dae5adc": "FundTransfer(address,address,address,uint256)", +"8dae9364": "_stakeAmountValid(address,uint256,uint256,bytes8,uint256,uint256)", +"8daed4c4": "allocateShareholder(address,uint32)", +"8daf08d9": "requestStempas(bytes32,address)", +"8daf4dcf": "getTournamentRate()", +"8daf5033": "TokenPurchased(address,address,uint256,uint256)", +"8db02d79": "Tiguan5Coin()", +"8db0816a": "claimC2()", +"8db0e83b": "getBytesArray(bytes32)", +"8db1296d": "token_creation_cap()", +"8db1ccac": "PUBLIC_SALES_1_RATE()", +"8db23385": "balanceOfTotalUnclaimedCookie()", +"8db261e0": "hardWithdrawAll()", +"8db49b57": "GrantDeleted(address,uint256)", +"8db4dad2": "contractSignedTime(string)", +"8db517fb": "GMQToken(uint256,string,string)", +"8db518f3": "ContractiumToken()", +"8db54c90": "getTotalSendingAmount(uint256[])", +"8db57994": "fundLoan()", +"8db6c17e": "ISCoin()", +"8db7183a": "dateMarketing()", +"8db783ce": "addHourToProject(uint256,uint256)", +"8db78a37": "setBountyVault(address)", +"8db7cd54": "getTournamentEntranceFee()", +"8db8053b": "mintPresaleTokens(uint256)", +"8db8f8bc": "ELACoin(uint256,string,string)", +"8db9653f": "getTotalIssued()", +"8db974e4": "optionTotalSupply()", +"8db9c13c": "removePolicy(uint8)", +"8dbb908a": "clearAllrequest()", +"8dbbbe10": "getFeeTake(uint256)", +"8dbc2fd1": "setNewEndtime(address,uint256,uint256)", +"8dbd7d54": "addCashier(address,address)", +"8dbdbe6d": "deposit(uint256,uint256,address)", +"8dbdfae7": "referalBonusPercent()", +"8dbe3be5": "isCeilingStrategy()", +"8dbe6c33": "_setUserInfo(address,uint256,uint256,address)", +"8dc01209": "CJC()", +"8dc07e46": "picops_is_enabled()", +"8dc1c44d": "testFailCreateWithParentSameNonce()", +"8dc2a2cd": "GMCCERC20(uint256,string,string)", +"8dc401ae": "withdrawAllDevelopersCut()", +"8dc43256": "AFRTokenERC20(uint256,string,string)", +"8dc45377": "getDuel1(uint256)", +"8dc4c6ab": "recoverable(address)", +"8dc654a2": "withdrawLink()", +"8dc6af54": "UsdToTokenConvert(address,uint256)", +"8dc6e2f1": "onMarketFinalized()", +"8dc71928": "minimumTargetReached()", +"8dc73521": "clearLock(address)", +"8dc850dc": "currentCoinsCreatedInteger()", +"8dc889f6": "requestDisbursement(uint256)", +"8dc949e8": "SapienToken()", +"8dc95182": "AssignWhitelistManager(address)", +"8dc9650f": "claimdram()", +"8dc98851": "Billboard()", +"8dca05c9": "airFropPot_()", +"8dca5511": "usdPerEve()", +"8dca7a01": "unicornManagement()", +"8dcb25e0": "balanceOf2Internal(address,address)", +"8dcb8c21": "coinsFlipped()", +"8dcd555f": "_buyNextRank(address)", +"8dcd64cc": "createAndEndowD(uint256,uint256)", +"8dcd992e": "_setBabzBalanceOf(address,uint256)", +"8dcdfe12": "distributeCrowdsaleTokens(address,uint256,uint256)", +"8dcf7892": "setAllocateTokenDone()", +"8dcfdaad": "removeMany(address[])", +"8dcff4f9": "setupAssetOwningListener(address)", +"8dd05b56": "getImageDataLength(uint256,uint16)", +"8dd14802": "setBridge(address)", +"8dd1e732": "YYBToken()", +"8dd1e96c": "getAngelFundAddres()", +"8dd21b0f": "redTeamLockingPeriod()", +"8dd3c196": "addInvestment(bytes32)", +"8dd42808": "removeHolder(address)", +"8dd47d91": "Wthdraw()", +"8dd4f292": "getRemainingSellingToken()", +"8dd5ac24": "SaveToken()", +"8dd5e298": "canEnterPool(address)", +"8dd66012": "incChildren(uint256)", +"8dd6908e": "ambassadorMode()", +"8dd6ce79": "setRatePrices(uint256)", +"8dd745bb": "adminSendTokens(address,uint256,uint256)", +"8dd747ec": "balanceOfKyCToBeApproved(address)", +"8dd7d6d1": "newPuppet()", +"8dd7e44b": "withdrawalComplete()", +"8dd8596c": "sendDonation()", +"8dd9054b": "MATCoin()", +"8dda811c": "GameChannelBase(address,uint256,uint256,address,address,uint256)", +"8ddab3dc": "_preValidateRefill(address,uint256)", +"8ddab515": "MedicayunLink(uint256,string,string)", +"8ddb428a": "currentGeneration()", +"8ddc9aa7": "UpgradeProposed(address)", +"8ddcf81e": "get_deal_status(uint256)", +"8ddd8b69": "renounceFreezer(address)", +"8dde60fa": "transferCoin(address,uint256)", +"8dde907e": "FooBurnableToken()", +"8ddf52bd": "earlyContribShare()", +"8ddf792b": "setOraclizeGasLimit(uint256)", +"8de022b7": "dropAnchor(uint16,uint16)", +"8de04f87": "authorized_updateCardReserved1(uint256,uint8)", +"8de0ece7": "THEWOLF10XToken(uint256,uint256,uint256,uint256,address,address,address,address,string,uint256)", +"8de12845": "init(string,string,string,string)", +"8de1dcea": "rateAngelsDay()", +"8de21650": "getBooleanValue(string)", +"8de2947c": "chkLockedTokens(address,uint256)", +"8de2a051": "setUint(uint256,uint8,uint16,uint32,uint256)", +"8de3317d": "withdrawDRPU(uint256)", +"8de4f42f": "addNewAirdrop(uint256,string,uint256,address)", +"8de5104b": "startPreICOStage2()", +"8de575e4": "Veen()", +"8de69284": "subscribe(address,uint256)", +"8de69c3c": "AcceptsDailyDivs(address)", +"8de69f66": "allocateAdvisorTokens(address[],uint256[])", +"8de6b343": "deleteFromBlacklist(address)", +"8de74aa1": "setEstateRegistry(address)", +"8de85908": "ProjectCall(address,uint256)", +"8de8d47c": "sendObjectWithoutApproval(uint256,address)", +"8de8de61": "CC5Coin()", +"8de8e295": "setSupplyLimit(uint32,uint32)", +"8de93222": "purchase(address,uint256)", +"8de9ee05": "TakeBuyOrder(bytes32,address,uint256,uint256,uint256,address,address)", +"8dea60cc": "CryptopediaCoin()", +"8dec1720": "invites(address)", +"8dec3daa": "destroy(uint256,address)", +"8dec818a": "LogPaused(bool)", +"8dede3f5": "pendingInvestContractsIndices(address)", +"8dedeca8": "costAndBuyTokens(uint256)", +"8dee53b9": "setBoardMember(uint256,uint256,uint256,uint256)", +"8def14f3": "ether_per_token()", +"8def1d3b": "distinctInvestors()", +"8def32b6": "addOrderBatch(bool[],uint128[],uint128[],uint32[],int256,bool[])", +"8defbc5e": "right31(uint256)", +"8df068ab": "initialTransferToDevTeam()", +"8df0fda1": "isApplicationExits(string,string)", +"8df10469": "refundInvestor(uint256)", +"8df15e19": "tokenLock(address,uint256)", +"8df1a8db": "ENJAllocation(address)", +"8df208b7": "StopQ()", +"8df272d2": "CosmoCoin(address,address)", +"8df301aa": "tradeKyber(address,uint256,uint256,address)", +"8df35abe": "setManagerAndClaimer(address,address)", +"8df388c1": "totalUnvestedAndUnreleasedTokens()", +"8df3a24c": "canAcceptBuyNow(uint256,address)", +"8df41c32": "allocationAddressICO()", +"8df4235f": "setother(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"8df465ea": "Zendad()", +"8df48935": "uncooperativeClose(address,uint32,uint192,bytes)", +"8df4d225": "GLXChain()", +"8df554b3": "Dividend()", +"8df583bd": "exchangeBBDBalance()", +"8df5fc7a": "_RewardClaimed(address,uint256,uint256)", +"8df61294": "totalAmountOfOrders()", +"8df6ad66": "isArrAccountIsNotFrozenForReturn(address)", +"8df6af63": "setCHGUSDPrice(uint256)", +"8df793d6": "leaseCard(uint8,string,string,string)", +"8df8228c": "x888()", +"8df87c66": "_getTokenLockType(uint256)", +"8df8ac87": "recevedTokenFromEvabot(address,uint256)", +"8df8c008": "getFreeTurtles()", +"8df8cc4c": "_removeOperator(address)", +"8dfa6fcb": "endTimeAddBonus()", +"8dfa703f": "BitkerToken()", +"8dfaf7f0": "getTeamsInfo()", +"8dfb015f": "increaseInvestedWei(uint256)", +"8dfb04fe": "getExistCell(address)", +"8dfb9950": "transferTokensManually(address,uint256,uint256)", +"8dfbcf36": "addCapper(address)", +"8dfced82": "amountBonusEnabled()", +"8dfd1242": "updateStarScoreInBulk(address[],uint256[])", +"8dfda5ae": "getIndexByAddress(address,address)", +"8dfde39d": "abi(bytes32)", +"8dfef745": "bonussale_StartDate()", +"8dff1762": "RpsGame()", +"8dff4abd": "activateRevenueShareIdentifier(string)", +"8dffe343": "kvcDiv(uint256,uint256)", +"8dffe5c0": "buyPlace(uint256,string)", +"8dfff9f2": "changePrepaymentFee(uint256)", +"8e005553": "setFee(uint16)", +"8e006db0": "setProductStock(bytes32,uint256)", +"8e007cfa": "giveEthxAddress()", +"8e008b59": "_createTeam(address,uint32[])", +"8e01d34b": "AddGoods(uint32,uint32,uint256,uint32,uint32,uint32,uint8,uint8,uint8)", +"8e0273bb": "Existing(address)", +"8e0294a8": "_removeProposal(address)", +"8e035ac1": "BetOnHashV82()", +"8e045031": "isTokenCollected(uint256,address)", +"8e048315": "investorDeposit(address,uint256)", +"8e0488a8": "transferirSalaDePara(address,address,uint256)", +"8e04977d": "currentLotteryValue()", +"8e056fe6": "setBirthBlock(uint256)", +"8e05beb3": "token(bool,address,address,address,address,address[],uint256[])", +"8e05d59d": "signToApproveTokenControlInfo(uint256)", +"8e05d8a5": "_computeNextGen0Price()", +"8e068b11": "virtualReserveBalance()", +"8e07d7da": "confirmKittyActions(uint256,uint256[8])", +"8e082555": "changeOwnship(address)", +"8e08b2ec": "MinesOnTrade(uint256)", +"8e08cf38": "updateBonus(uint256,uint256,uint256,uint256,uint256)", +"8e09c8cd": "addCallSpenderWhitelist(address)", +"8e09ead7": "isTokenBankroll(address,address)", +"8e0a5faa": "invariant(address)", +"8e0adbf5": "getLLV_edit_11()", +"8e0af993": "setPrivateFund(address,uint256,uint256)", +"8e0b017d": "setSellRate(uint256)", +"8e0bba69": "iown()", +"8e0c2882": "drain_alltokens(address,uint256)", +"8e0c36c4": "verifySeed(bytes32,bytes32)", +"8e0c8999": "zkWithdraw(bytes32,uint256,address,uint256[2],uint256[],uint256[],uint256[])", +"8e0cac02": "redeemMarketingAndRNR()", +"8e0d5075": "claimDividendsForBlock(uint256)", +"8e0db0d9": "keyAtIndex(uint256)", +"8e0e8fb2": "approveProvider(address,uint256)", +"8e0ea5cf": "ReturnTokensFor(address,address,uint256)", +"8e0eef8e": "getTicketValue(uint256,uint256)", +"8e0ef033": "defrostTokens()", +"8e0f65eb": "isBelow(int256,int256,string)", +"8e0f9b85": "Smartcarblockchain(address,uint256)", +"8e0fee1f": "withdrawRefBalance()", +"8e101867": "maxTotalAmount()", +"8e1069f3": "getPlayRecord(address,address)", +"8e10be33": "primaryOwner()", +"8e111ef6": "addressOfERC20Tocken()", +"8e120f36": "prepareToPayWinners(uint32)", +"8e1227b2": "KTCWhiteList()", +"8e12823b": "getCompanyHash(address)", +"8e13435b": "MathPractice()", +"8e14cc91": "CreateTokens()", +"8e151947": "newBitsoAddress(address)", +"8e15e94b": "countOfCell()", +"8e15fc87": "clearDeposits()", +"8e165058": "sendTokensToBuyers()", +"8e17de8b": "Controlled(address)", +"8e180733": "_validCrowdsale()", +"8e1876ee": "permaStop()", +"8e19899e": "withdraw(bytes32)", +"8e19ee4c": "Recovery(uint256,address,address)", +"8e1a1c30": "WithdrawLeftToOwner(uint256)", +"8e1a55fc": "build()", +"8e1aa2c4": "bts_address1()", +"8e1b9f42": "CROWDSALE_WALLET_ADDR()", +"8e1bb633": "triggerRecovery(uint256,address,uint8,bytes32,bytes32,uint256)", +"8e1d9545": "setTokenSaleHalt(bool)", +"8e1dfd48": "isMerhantAlreadyRegister(address)", +"8e1e2add": "tradeABIHash()", +"8e1e3e6c": "POMACOIN()", +"8e1e3eb1": "setMinBuyEth(uint256)", +"8e1eeb09": "BarrelAgedFOMO()", +"8e1f0614": "EGYPT()", +"8e1fda84": "WorkcoinCrowdsale(address)", +"8e1ffb19": "testThrowsRetractLatestRevisionEnforceRevisions()", +"8e207fa0": "getApproveValueValue()", +"8e22e8de": "Cryptolotto7Days(address,address,address,address)", +"8e236cea": "setAnnualPrice(uint256)", +"8e242d54": "withdrawSharesTo(address,uint256)", +"8e25071a": "setProxyCurrator(address)", +"8e263e6f": "firstAttack(address,uint256,uint256[],uint256[])", +"8e268934": "LogSendPOSTokens(address,uint256,string)", +"8e26a223": "getPoSReward(address,address)", +"8e26c09d": "waitPeriod()", +"8e26c30c": "carTransferState()", +"8e26e582": "_mintDataStream(address,uint256,bytes32,bytes32,uint256)", +"8e273ef4": "buyLicenseForERC20(address)", +"8e27d719": "deposit(string,uint256)", +"8e280dce": "findNextYear(uint256,bytes)", +"8e2832b7": "ethereumToTokens(uint256)", +"8e298549": "migrateListing(bytes32)", +"8e29d149": "claim_block()", +"8e2a37b2": "privateAllocated()", +"8e2a6470": "allocateShares(address,uint256)", +"8e2a8312": "EmjacToken()", +"8e2ab359": "_transferToAddress(address,address,uint256,bytes)", +"8e2ae564": "mintingDone()", +"8e2c6f4d": "initiateVerification(address,bytes,bytes)", +"8e2d0699": "getCompte_32()", +"8e2e0776": "doInitialDistribution(address,address,address)", +"8e2e2077": "setTokensForSaleCount(uint256,bool)", +"8e2f0f46": "ownerSetMarginPremium(uint256)", +"8e303097": "BestWallet(address)", +"8e3047d9": "getBonuses(address)", +"8e3047e0": "getCrossConnectorReturn(address,address,uint256)", +"8e3058f3": "getPostFromId(address,string,uint256)", +"8e3073a6": "getEth(uint256)", +"8e314783": "addTotalPaid(address,uint256,uint256)", +"8e316327": "calculateEggSell(uint256)", +"8e3177e1": "purchaseIpfsAfterTitle(bytes32)", +"8e32217a": "calculateTokensQtyByEther(uint256)", +"8e327dd3": "setInvestor(address,uint256)", +"8e32e421": "expiredTime()", +"8e3390b4": "contributeMethodABI()", +"8e339b66": "controllerApprove(address,address,uint256)", +"8e343516": "balanceWinPoolToWinSystem()", +"8e351097": "MintedTokenCappedCrowdsale(address,address,address,uint256,uint256,uint256,uint256)", +"8e3571c0": "testNewCounterValueAfterAIncreaseAndADecrease()", +"8e357b6f": "AirTrafficControllerROS(address,int256,address)", +"8e36a9f1": "Neurus()", +"8e370b3d": "UnsoldTokensReturned(address,uint256)", +"8e372dcd": "refineCoke(uint256)", +"8e37adec": "setAddressArr(address[])", +"8e37c1e0": "collectorWeiCollected()", +"8e391cb2": "ProxyERC223()", +"8e3957d9": "RandomNumber()", +"8e3ab913": "transferToMany(address,address[],uint256[],uint256,uint256,address)", +"8e3af93f": "finalizeMint(uint256)", +"8e3b4525": "setExchangeLimit(uint256)", +"8e3bd6fa": "SetTradeable(bool)", +"8e3d4e5e": "Fibonacci(bytes)", +"8e3d5303": "addRegistrar(address,string)", +"8e3d63e3": "multiSendEth(uint256,address[])", +"8e3d7ae7": "drawFortune()", +"8e3dbf53": "getSalesPartnerAmount(address)", +"8e3dcc60": "sell_spice_melange(uint256)", +"8e3e1d86": "fisherYates(uint256)", +"8e3ed7d7": "sendEthers(address,uint256)", +"8e406072": "getKingdomCount()", +"8e414295": "Elixer()", +"8e416b9b": "randomFight2DeathContract()", +"8e417b30": "GTokenContract(uint256,string,string)", +"8e424f16": "onlyOwnerSetCompanyWallet(address)", +"8e434b82": "DADCoin()", +"8e438b70": "ConpayToken()", +"8e43e70e": "ParentKidsLinkToken(uint256,string,string)", +"8e44e74e": "DEFROST_MONTHLY_PERCENT()", +"8e452fc0": "findAvailableGame(address)", +"8e4553a4": "script(address,bytes)", +"8e455a1d": "_createVote(uint256,uint256,uint256)", +"8e468a88": "donationMap(address)", +"8e46afa9": "getDefaultGracePeriod()", +"8e46b68b": "keysRec(uint256,uint256)", +"8e46f716": "CoinX(uint256,string,string)", +"8e46fbb2": "testBitsXorFailIndexOOB()", +"8e4748cf": "MintingERC20(uint256,uint256,string,uint8,string,bool,bool)", +"8e47b87b": "FundsReceived(address,uint256)", +"8e47dd03": "currentProfitPct()", +"8e48474a": "chooseWinner(string,string)", +"8e496832": "DataContract()", +"8e497470": "displayNick(address)", +"8e499bcf": "numTokens()", +"8e49a2c2": "turnmigrate()", +"8e49a41f": "getVestingFromContract(address,address)", +"8e49cf5c": "soldSoulBecause(address)", +"8e49dd3f": "Failed(uint256,address,uint256,address,address,uint256,address,uint256,uint256)", +"8e49ff47": "AntzToken()", +"8e4a23d6": "Unauthorized(address)", +"8e4a943d": "IcoResumed()", +"8e4ab74b": "BANKROLL()", +"8e4adf4e": "tokenUpgrader()", +"8e4afa51": "checkTransferToICAP(bytes32,uint256)", +"8e4b0190": "deleteWorkerAdress(address)", +"8e4bf820": "settleBet()", +"8e4c64c0": "grantsController()", +"8e4cb2a9": "balances_after_buy(address)", +"8e4d0a83": "setLockupList(address,address,uint256)", +"8e4d5053": "getcontractBalance()", +"8e4e0f03": "teamAndExpertsTokens()", +"8e4f9606": "updateReputationScore(address,uint256)", +"8e4fa788": "accountHasCurrentVote(address)", +"8e5051f0": "weiToOwner(address,address,uint256)", +"8e50a65d": "prepareDividends()", +"8e514018": "getRandomPrice()", +"8e5152d6": "addToAngelExperienceLevel(uint64,uint256)", +"8e51b069": "ownerAddMarket(address,address,address)", +"8e51d624": "failsafe_addition(uint256,uint256)", +"8e52019d": "ECASH()", +"8e52cb51": "getRecordKey(bytes,bytes,bytes)", +"8e535ade": "lrcInitialBalance()", +"8e53d5e4": "cumulative(uint256)", +"8e53f4fb": "preicoSale()", +"8e543a12": "getLoanAmount(address,address)", +"8e550bd1": "lastNewInterest()", +"8e57d397": "modifyHorseyFeedingCounter(uint256,uint8)", +"8e588306": "getAutonomousSoftwareOrgInfo()", +"8e5919b6": "setEdoRate(uint256)", +"8e592caf": "KittyKendoCore()", +"8e599d50": "joinFunction()", +"8e59a15b": "checkMinGoal()", +"8e5b2899": "check(bytes20,uint24,uint32,bytes32[],uint16)", +"8e5c2e8a": "LogContractOwnershipChangeCompleted(address)", +"8e5d97a2": "releasePendingTransfer(uint256)", +"8e5e91ac": "executeStakeholderTransaction(uint256)", +"8e5ee9ec": "currencyToToken(bytes32[8],bytes)", +"8e5ef4ea": "DataShieldCoin(uint256,string,string)", +"8e5ef8fe": "ChivesToken()", +"8e5fd5fa": "validateReservation(address,uint8)", +"8e604b1d": "queryItems(bytes32,uint256,bool[6],bool)", +"8e611cee": "deductFromUnminted(uint256)", +"8e62bbd9": "DigitalCoin()", +"8e62c982": "initialARXSupply()", +"8e634029": "communityContract()", +"8e637a33": "authorizePayment(string,address,uint256,uint256)", +"8e63d7e1": "getTopLevel(uint256,uint256)", +"8e63ef75": "icoEtherReceivedPrivateSale()", +"8e641963": "_mintCards(uint32)", +"8e64a720": "PlendsToken()", +"8e65f7e4": "logAllTransactions(address)", +"8e6635a5": "toUint128Throw()", +"8e66ca5f": "setFirstBonusLimitPercent(uint256)", +"8e66da2f": "cancelBet(uint8,uint256)", +"8e66fea2": "TTCTokenERC20(uint256,string,string)", +"8e68f000": "oneTokenInWei(uint256,uint256)", +"8e690315": "AttributaOwners()", +"8e69367e": "RandomizedPriceFeedApi()", +"8e694807": "PHOENIX_CORSAIR_MAX_CARGO()", +"8e6954de": "totalFci()", +"8e69ceec": "dispatchTokens(address,uint256)", +"8e69e204": "getPeriodsWithdrawal(address,bytes32)", +"8e69eeb9": "setDefaultVoteRules(uint256[5])", +"8e6a1b24": "PIXToken(address)", +"8e6a2afa": "MAX_PERIOD_COUNT()", +"8e6b5462": "setOrCacheDesignatedReportNoShowBond(uint256)", +"8e6b551c": "sumHardCapPublicSale()", +"8e6b77a2": "interestArray()", +"8e6b851d": "valueGet(string)", +"8e6bee97": "pay(uint256,bytes32)", +"8e6ce1b1": "getActiveSellDetails(bytes32)", +"8e6d2599": "_activeness2level(uint256)", +"8e6d531d": "setSubPromoter(address)", +"8e6d7db8": "updateInstitutionAsset(string,string,address,address)", +"8e6ddab1": "createMonster(uint256,uint256,uint256,uint256,uint256,bytes)", +"8e6df32f": "exerciseOptions(address,uint256,uint256,uint256,bool)", +"8e6f2353": "ln(int256)", +"8e6f843f": "EarlyExchangeRateChanged(uint256)", +"8e6fdd31": "raisedEth()", +"8e6ff99a": "addVineyard(bytes32,uint16,uint24,uint32,uint16)", +"8e70fdbc": "setIsNotAdmin(address,bool)", +"8e71decb": "findWinner()", +"8e71f4fd": "_hasAllSigs(address,address)", +"8e728fec": "configTimeInit()", +"8e7296b1": "MOACSupply()", +"8e72a926": "bankRollBeneficiary()", +"8e72ca91": "proxyIncreaseWithdrawalChunk()", +"8e735547": "getUserByEmailVerify(bytes32)", +"8e739461": "getBalance(bytes32)", +"8e73d42c": "lunyrMultisig()", +"8e7418cb": "isSecondRound()", +"8e744f54": "tranferMinterOwnership(address,address)", +"8e74a528": "avarageBlockTime()", +"8e752b40": "startTeamTrade()", +"8e7547cb": "setWithdrawWallet(address,address)", +"8e755125": "testIntFixedArray(int256[3])", +"8e7558cd": "closeStage(uint256)", +"8e75dd47": "companyCount()", +"8e75f23c": "get_collateral_bix_amount()", +"8e760afe": "verify(bytes)", +"8e76581e": "getManifestId(address,bytes32,uint256)", +"8e767411": "setWhaleIncreaseLimit(uint256)", +"8e768288": "isSane(address)", +"8e76e3ba": "BillofLaden()", +"8e77304c": "YOUToken()", +"8e77afc5": "BSCore()", +"8e77d147": "transactionfeeAmount()", +"8e77fe2f": "blacklistAddresses(address)", +"8e77ff1f": "setMigrateTokenContract(address)", +"8e78eff6": "get_add(uint256)", +"8e78f0f2": "remOperator(address)", +"8e7952c6": "davToken()", +"8e79dc91": "set_participant_arbits(address,uint256)", +"8e7a1697": "setDepot(uint256,uint256)", +"8e7a9687": "check_vote(string)", +"8e7b36be": "payFor(address)", +"8e7b90e4": "setTgeAddress(address)", +"8e7c9e50": "logFloor(int256,uint8)", +"8e7cb6e1": "getIndex(uint256)", +"8e7cd5a7": "distributeExternal(uint256,uint256,uint256,uint256)", +"8e7d0f44": "publicKeyConsensus()", +"8e7e060f": "buyCards(uint8)", +"8e7e34d7": "fromHex(string)", +"8e7e879f": "migrateAll(uint256[])", +"8e7e99b8": "TotalSupply(uint256,uint256,address)", +"8e7e9a3c": "calculatePrizes()", +"8e7ea5b2": "getWinner()", +"8e7fd292": "trySetSubnodeOwner(bytes32,address)", +"8e7fdc6c": "LogBetProperties(uint256)", +"8e7fffe8": "individualRoundCap()", +"8e80ade9": "hodlTokens(address,uint256,uint256)", +"8e818aa1": "acceptAdminWithdraw()", +"8e81bc9c": "addWhitelistedBurn(address,address)", +"8e81c579": "poolEthSold()", +"8e81c64d": "burnTokens(uint256,uint256)", +"8e821b24": "persians()", +"8e84844e": "changeWeight(address,address,uint256,uint256)", +"8e84d413": "isFree(uint256[],uint256)", +"8e854ed8": "getResult(uint256,uint8)", +"8e8556b4": "privateSaleEtherRaised()", +"8e86077b": "foundingTeamSupply()", +"8e8622f9": "_getTAOIdByName(string)", +"8e869843": "sellfloaksAgainstEther(uint256)", +"8e86d030": "getMessageRequestHash(address,uint256)", +"8e8758d8": "tokenAllowance(address,address,address)", +"8e87f57c": "setCompare(bytes2)", +"8e87fcbf": "transformFrom(address,uint256,uint256)", +"8e885cbb": "LARGE_PURCHASE_BONUS()", +"8e894a6f": "getTileIDByOwner(uint16,address)", +"8e89ad00": "setMaxDailyPerUser(uint256)", +"8e89f6e2": "Crowdsale(uint256,uint256,uint32,uint32,address,address,address,uint256,uint256,uint256,uint256,uint256)", +"8e8a3983": "paySomeone(address,address)", +"8e8a4a20": "userTenantHashExists(bytes32)", +"8e8afc34": "setSlaveServer(uint32)", +"8e8b34bc": "createNewSecurityDeposit(string,string,uint256)", +"8e8bc816": "TokenBonus(address,address,uint256)", +"8e8cf4a8": "getThisBalance()", +"8e8df687": "processedTokens()", +"8e8e4675": "gur(address,address)", +"8e8e75fb": "addExternalController(address)", +"8e8f1e84": "setPublicSaleParams(uint256,uint256,uint256,uint256)", +"8e8f39d3": "getBlockNumberM1()", +"8e8fe845": "IsDistribRuSTMingFalg_()", +"8e9030f4": "maximumNonWhitelistAmount()", +"8e90b71a": "changeStatus(bytes1,bytes32)", +"8e90ccbe": "Governance(address[],uint256,uint256)", +"8e90e1e9": "_createCutie(uint40,uint40,uint16,uint256,address,uint40)", +"8e9185cb": "NON_TRANSFERABLE_TIME()", +"8e9206a0": "EOM()", +"8e928076": "setMaxGas(uint256)", +"8e92aea3": "_fetch(uint256)", +"8e92ee66": "redeemShardsIntoPending()", +"8e93907b": "FamilyResourceControl(uint256,uint256,uint256,uint256,uint256[])", +"8e93c883": "setMarketingTokensWallet(address)", +"8e940bb7": "test_testableContributionCaseExpectFailure()", +"8e943c8b": "checkParticipants()", +"8e94a5f3": "sellerRefund(uint256)", +"8e955978": "pushProposal(address)", +"8e95b0cd": "getSponsorshipsTotalRefunded(address,uint256)", +"8e95b28b": "delegateUrl()", +"8e964de9": "COPPER_AMOUNT_XPER()", +"8e9674c8": "WEMACOIN()", +"8e96eb3e": "coePerEthOffset()", +"8e979bad": "setwinPercent(uint256)", +"8e984ccd": "joinGameAndBattle(uint256,uint256)", +"8e98c6b9": "getLeaderboardPlayers()", +"8e98cee1": "update_session(uint32,uint64,uint64)", +"8e9a5890": "danGold()", +"8e9a7159": "LZLPrivate()", +"8e9aed2e": "HACHIROKU()", +"8e9b7ab8": "Partners(address)", +"8e9bf09c": "issueTokenToAddress(address,uint256)", +"8e9c3ce2": "assetOfBitmark(uint256)", +"8e9ccd04": "computeIndexId(address,bytes)", +"8e9e5c37": "requiringAuthorization()", +"8e9e697d": "reset(uint256,uint256,uint256,uint256,string)", +"8e9e8b14": "marketingPartnerSupply()", +"8e9f2738": "_transferAllArgs(address,address,uint256)", +"8e9f9072": "signedMessageECRECOVER(bytes32,bytes32,bytes32,uint8)", +"8ea04cb3": "getUpgradability(uint256,address,address,string)", +"8ea06c68": "BLMToken(uint256,uint256)", +"8ea0926a": "addBaseStats(uint256,uint8[8])", +"8ea0b540": "getProjectInformation(uint256)", +"8ea0d898": "DestroyedBy(address)", +"8ea1ee86": "DapCarToken()", +"8ea1ff21": "OwnedExample(address)", +"8ea25644": "XYY()", +"8ea390c1": "getOwedDividends(address)", +"8ea44bab": "setProviderAdmin(uint256,address)", +"8ea51696": "JRT()", +"8ea5220f": "devWallet()", +"8ea55bd7": "_pushContributor(address,bytes32)", +"8ea56e57": "ADV()", +"8ea64376": "opsAddress()", +"8ea67eb0": "ETCharPresale(address)", +"8ea69e37": "TestToken(uint256)", +"8ea6dd82": "BotAdded(address)", +"8ea7296b": "deleteChild(address)", +"8ea73a7c": "setDonationReward(uint256)", +"8ea74d95": "transferDaico(address)", +"8ea77300": "RELEASE_START()", +"8ea822d8": "createThings(bytes32[],uint16[],bytes32[],uint16[],uint88)", +"8ea83031": "swapContract()", +"8ea83681": "mintTreasuryTokens(address,uint256)", +"8ea8dc9d": "APP_MANAGER_ROLE()", +"8ea8e149": "removeService(address,address)", +"8ea8f83c": "activate(uint256,uint256)", +"8ea91bf3": "createVestedToken(address,uint256,uint256,uint256,uint256)", +"8ea95cbc": "lastDepositorAmount()", +"8ea98117": "setCoordinator(address)", +"8ea98db4": "Mmchain(uint256,string,string)", +"8eaa1e29": "getContentByData(address,uint256,string,string)", +"8eaa5d1c": "amount50kUsdInCents()", +"8eaa6ac0": "get(bytes32)", +"8eaa8d4f": "RefundedInvestor(address,uint256,uint256)", +"8eaa9c91": "Client()", +"8eaaeecf": "getUserCapInTokenWei(address,address)", +"8eac494c": "tierWhitelisted(uint256)", +"8eadb561": "IntelliToken()", +"8eaeb531": "setAccountA(address)", +"8eaf1dab": "PRCT100_R2()", +"8eafe0f0": "getCustomerRating(string)", +"8eb04f02": "setRefundManagerContract(address)", +"8eb066ce": "init(address[5],uint256[6],uint8,bytes32,bytes32)", +"8eb0e73e": "bonusPctSteps(uint256)", +"8eb179ad": "maxHardCaphardcap()", +"8eb206d1": "deletePage(bytes32,bytes32)", +"8eb36e3d": "initData()", +"8eb3e0e3": "socERC20(uint256,string,string)", +"8eb45cbf": "frozenProfitDate()", +"8eb4e0ad": "batchRelay(bytes16[],address[],address[],uint256[],uint16[],uint128[],uint8[],bytes32[],bytes32[],uint8[])", +"8eb547d4": "squareOfSums(uint256,uint256)", +"8eb5a7ac": "changePermission(address,bool)", +"8eb5f650": "ETIN(uint256,string,string)", +"8eb6418e": "LoritaBi()", +"8eb64b3d": "multi(address[],uint256)", +"8eb64b61": "MAX_NON_SALE_SUPPLY()", +"8eb689f7": "giveFor(address)", +"8eb6d683": "coinAllowanceOf(address,address)", +"8eb6ffaa": "withdrawBloc(uint256)", +"8eb717fc": "increaseCap()", +"8eb76eed": "emitUserRatingGiven(address,address,uint256)", +"8eb7ffe8": "assignInBatches(address[],uint256[])", +"8eb831fe": "ChangeOperator(address)", +"8eb857f8": "getData_25()", +"8eb88c1b": "EvergreenHealthToken()", +"8eb89a61": "getPointsBalance()", +"8eb976ca": "assertEq17(bytes17,bytes17)", +"8eb98150": "NOT_ENDED_FINE()", +"8eba2966": "RESERVE_PORTION_MULTIPLIER()", +"8ebaae08": "createListing(uint256,uint256,uint256,address)", +"8ebac11b": "getHash(address,uint256,uint256,uint256)", +"8ebb2ce7": "setProfitContainerAddress(address)", +"8ebb5aee": "calculateTokenBuy(uint256,uint256)", +"8ebc266d": "getCurrentUSDCentToWeiRate()", +"8ebe555b": "allocateShares(uint256,uint256)", +"8ebed616": "CRF()", +"8ec3167f": "calculateGoalsFromAttributeTotals(uint256,uint256,uint256[],uint256[],uint256)", +"8ec3272d": "addPicture(string,bytes32,string,address)", +"8ec48bcb": "BitCharity()", +"8ec49939": "switchOFFfreeForAll()", +"8ec4dc95": "getPerson()", +"8ec521a8": "setupStakeholders(address[],uint256[],uint256[],bool[],uint256[],uint256[],uint256[])", +"8ec5a309": "testHash(string)", +"8ec5ff41": "isUid(string)", +"8ec63da9": "checkIsOnlyProxy(bytes32)", +"8ec6677d": "registerUsername(string,address)", +"8ec84812": "updateProfit()", +"8ec86497": "clearname()", +"8ec89e4f": "_isActive()", +"8ec8fcad": "ADV(uint256,string,string)", +"8ec9925e": "jackpotToken()", +"8ec9a5de": "getLeaf(bytes32,uint256)", +"8ecaa140": "_refundHighestBidder(uint256)", +"8ecbc4e9": "setNewBRXPay(address)", +"8ecc0643": "BuyAd(address,uint256,string,string,string,uint256,uint8,address)", +"8ecc0950": "returnToOwner()", +"8ecc107f": "buyUninitializedPixelBlock(uint256,uint256,uint256,bytes32)", +"8ecc4353": "adddayruns(address,uint256)", +"8eccf58e": "getTokensCountPerEther()", +"8ecd2fe8": "testMul256By256()", +"8ece19f6": "setTokenLock()", +"8ece39cd": "startOraclize(uint256)", +"8ece85a4": "ETpay(uint256,string,string)", +"8ecebf34": "MorpheusToken()", +"8ecf0d0b": "getCreated()", +"8ecfc412": "workForce()", +"8ed06b62": "getShipPrice(uint256,uint256)", +"8ed08711": "saleMinimumWei()", +"8ed09bc9": "registerVoter(bytes32,address)", +"8ed0ac8b": "closeTrancheAddition()", +"8ed1858e": "distributeELTCSmall(address[])", +"8ed20fa0": "tokenWeiToSale()", +"8ed2395f": "ZCNYToken(address)", +"8ed33545": "sub_presale_arbits_sold(address,uint256)", +"8ed34751": "performHealthCheck(uint8)", +"8ed399ca": "teamWallet_2()", +"8ed3fa7c": "codexCoin()", +"8ed5047c": "updateCokeTotal(uint256,bool,uint16)", +"8ed5f2ca": "newTestableCampaign(string,uint256,uint256,address)", +"8ed67a44": "setPrice(uint16)", +"8ed6910f": "limitSell(uint256,uint256)", +"8ed7c3d3": "sendTokensManager(address,uint256)", +"8ed7ca93": "finishExam()", +"8ed8067e": "FundContract()", +"8ed882c5": "designatedReporterWasCorrect()", +"8ed91318": "nextAssetId()", +"8ed9be36": "temp(uint256,uint256,bytes32,bytes32)", +"8ed9fd75": "ICO_Supply()", +"8edb726d": "modifyEndFundingTime(uint256)", +"8edbf436": "getPriceInfo(address)", +"8edc4f8f": "isValidCap(uint256,uint256)", +"8edc707b": "adoptionOffers(bytes5)", +"8edcf21d": "getCurrentYearGameMiningRemainToken(uint16)", +"8edd6eb6": "getFund()", +"8eddc306": "__exchangerCallback(address,address,uint256)", +"8eddc804": "notifySale(uint256,uint256)", +"8eddf665": "onInvest()", +"8ede1817": "getReturnTime(uint256)", +"8ede3a34": "KeplerToken()", +"8ede74c1": "changeRage(uint256)", +"8ede94b4": "setLineUpEnable_miner(address,uint256)", +"8edeb15d": "donation()", +"8edec689": "wd()", +"8edfaef8": "getSetupParameters()", +"8edff3db": "getTerminal(uint256)", +"8ee030bd": "FaceterToken(address,address)", +"8ee070d9": "MYEMPEROR()", +"8ee0942b": "setSignatureROFR(bytes)", +"8ee0ffe8": "sendStakingContract()", +"8ee1409e": "TitanToken()", +"8ee17e0a": "MarvinCoin()", +"8ee21b8e": "get_default_keys()", +"8ee365fa": "removeAddressesFromAdmins(address[])", +"8ee36f05": "isVoted(address,uint256)", +"8ee3f472": "BoutsCrowdsale(uint256,uint256,uint256,address,address,address)", +"8ee3f72f": "PinCode()", +"8ee4d44b": "addAddressToOperators(address)", +"8ee4fd8a": "claimWithSignature(bytes)", +"8ee553cc": "getCroById(uint256)", +"8ee5a8b3": "UpgradeProposals(uint256)", +"8ee6540c": "seventeen()", +"8ee6f301": "readvalidrollsXteam(uint16)", +"8ee78046": "draw(address,uint8[])", +"8ee833cc": "isValidTenant(string,address,uint256)", +"8ee8a5c4": "Charity(string)", +"8ee93cf3": "post(string)", +"8ee97ff4": "VirtualRewardToken()", +"8eeb203e": "exchangeWeight()", +"8eeb33ff": "crowdSaleAddr()", +"8eeb3b0e": "KJCPerEthereum()", +"8eeb5073": "_bundle(address,uint256,uint256[])", +"8eeb5c97": "cancelDo(bytes32)", +"8eeb7d11": "unlockAllocationAddress(address)", +"8eeb8e5a": "MUC()", +"8eec5d70": "getPoolCount()", +"8eec6f7b": "lockETH(uint256)", +"8eec99c8": "setNewAdmin(address)", +"8eecddcf": "betBlockNumberOf(address)", +"8eecf64d": "createContractWithMeta(address,uint64,bytes,string)", +"8eee1cd6": "buyerExceededApprovedAmount(uint256,address)", +"8eef059e": "_lowerDown(uint256,address)", +"8ef0f09a": "createPromoPow(address,string,uint256,uint256,uint256)", +"8ef1a6b6": "makeProfit(uint256)", +"8ef1e886": "RESERVE_PERCENT_EVE()", +"8ef22afe": "getCostToCancel()", +"8ef25a7a": "KeplerTokenExtraSale(uint256,address,address)", +"8ef26a71": "coinSentToEther()", +"8ef28249": "totalGuesses()", +"8ef2826e": "HODLWallet(address[],uint256[])", +"8ef292fc": "BTM()", +"8ef326ea": "getCubeCount()", +"8ef44301": "tokenRecoveryFromTrade(address,address,address,uint256)", +"8ef47296": "StorageController(address,address,address,address)", +"8ef483eb": "getMyWager()", +"8ef490ea": "fullname()", +"8ef4c807": "lockedBalanceOf(address,uint256)", +"8ef53edf": "InitAssignOK()", +"8ef5ae21": "setupInfo(string,string,string)", +"8ef5ce28": "test1_addingFirst()", +"8ef5eaf0": "drop(address[])", +"8ef6e7fe": "build(string)", +"8ef6ed53": "_getRandom(uint256,uint256)", +"8ef72d15": "backEthRatio()", +"8ef79e91": "setTokenBaseURI(string)", +"8ef7c649": "getTicketPrice(uint8)", +"8ef8125e": "frontRunnerSetTimestamp()", +"8ef82010": "orderExecution(bytes32,uint256)", +"8ef85e04": "secondWeekTokenPrice()", +"8ef87843": "randomSkinAppearance(uint256,uint128)", +"8ef8f241": "getEmployerInfo()", +"8ef9c904": "NewAmbassador(address,address)", +"8efa00e2": "getPRETDETokenExchangeRate(uint256)", +"8efa23d1": "RELEASE_WALLET()", +"8efa3e21": "setIsMinter(address,address,bool)", +"8efbd512": "getAccountNumber(address)", +"8efc777f": "isBeta(bytes)", +"8efd4c75": "QUARTERLY_RELEASE()", +"8efd5f92": "divIntervalDays()", +"8efe6dc4": "changeMonthlyWithdrawLimit(uint256)", +"8efe7801": "showWinnersSort()", +"8efe8c1c": "EPTToken(address,address)", +"8eff3c29": "getRecords()", +"8effda0d": "IndorseSaleContract()", +"8f003a2d": "StarSportsToken()", +"8f00c0af": "has_contract_ended()", +"8f00cbfa": "winnerIndex()", +"8f00f49b": "totalAssetTokens()", +"8f0165e1": "min_pay_wei()", +"8f01932a": "mntpToMigrateTotal()", +"8f01e1e2": "getactiveleveltime(uint256)", +"8f02bb5b": "setTransferFee(uint256)", +"8f03850b": "numContributors()", +"8f038a5a": "initializeEthReceived()", +"8f039a10": "changelp8(address)", +"8f03f5c3": "firstUnlocked()", +"8f0427b1": "sellPosition(uint256)", +"8f049de5": "endBetRed()", +"8f054bf3": "referralList(address)", +"8f0563b9": "substring(string,int256)", +"8f061ef5": "Token(string,string,uint256,uint256)", +"8f06492d": "callOnRemoval()", +"8f0816bc": "PERKToken()", +"8f08288a": "clearBets()", +"8f08a60a": "transfer2(uint256,address[],uint256[],bytes,bytes,bytes,bytes)", +"8f08d44d": "burnAsset(uint256)", +"8f08e369": "withdrawApplication(address)", +"8f094efb": "getMineableSupply()", +"8f0a4c1b": "startPreSales()", +"8f0a6ecb": "returnBountyTokens(address,uint256)", +"8f0bc152": "claim(address,uint256,bytes)", +"8f0c724c": "setOperationsCallGas(uint256)", +"8f0d16da": "emitIssuersUpdated(address,bool)", +"8f0d3b8b": "_buy(uint256,uint256)", +"8f0d67ef": "activationTime(uint256)", +"8f0ec6b3": "ZanCoin()", +"8f10cad0": "StreampayToken()", +"8f10fd45": "getBuyCount()", +"8f112370": "addToAffiliate(address,uint256)", +"8f11e5f9": "checkWithdrawValue(uint256)", +"8f1224ce": "fixInvestment(address,uint256,uint256)", +"8f12355d": "assertEq7(bytes7,bytes7,bytes32)", +"8f1327c0": "getRound(uint256)", +"8f134025": "rewardSent(uint256)", +"8f13fd29": "setPriceValue(bytes32,uint256)", +"8f140568": "isServiceAddress()", +"8f142842": "getByAlias(string)", +"8f142907": "stables()", +"8f14b76b": "sendReferrer()", +"8f14d8a3": "reclaimContractTokens()", +"8f15024f": "ticketsSold()", +"8f152d0e": "vestingConfigured()", +"8f158e76": "remainingPublicSaleCap()", +"8f163497": "AgaCoin()", +"8f16eb1a": "setI_R1(uint256)", +"8f188b40": "migrateInvestor(address,uint256,uint256,uint256)", +"8f19ff45": "_handleTokensReceived(uint256)", +"8f1a422c": "minterWallet()", +"8f1a927a": "numTicksSinceAuctionStart(uint256)", +"8f1af992": "claimTwitterId(uint256,address,uint8,bytes32,bytes32)", +"8f1b0b02": "bulkTokenMint(address[],uint256)", +"8f1c204c": "test_fiveAssertFalse()", +"8f1cc85e": "SAGAcrowdSale(address)", +"8f1cc94e": "HashTypeAdded(uint8)", +"8f1d5f7e": "getLedgerNameHash()", +"8f1d8f41": "ethInvestment(address,uint256,uint256,uint256,uint256)", +"8f1d90b1": "tokenBearer()", +"8f1df4f7": "setPrices(uint256,uint256,uint256,uint8,uint256,uint256,uint256)", +"8f1eda37": "wmul(uint128,uint128)", +"8f1f761a": "Rewards_Supply()", +"8f1fc530": "startSplit()", +"8f1fc6bb": "testRemoveProductFromCart()", +"8f1fdbb9": "offerEth(uint256)", +"8f212eb7": "BITSDTokenInitialized(address)", +"8f217d6b": "lastChar(string)", +"8f22964d": "NegativeWhuffiesSent(address,address,uint256,string)", +"8f22d128": "testdigiToken()", +"8f24f2a3": "takeBuyOrder(address,uint256,uint256,uint256,address)", +"8f25159c": "getDayDepositLimit(uint256)", +"8f259117": "numcallsinternal()", +"8f25eec1": "BetWon(address,uint256,uint256)", +"8f26a5ab": "setSaleAgent2(address)", +"8f272c0b": "minor_partner_address()", +"8f2757d8": "Bitshopandearn()", +"8f282b87": "getSold()", +"8f283970": "changeAdmin(address)", +"8f287be5": "PitEur(address)", +"8f288526": "TokensPurchased(address,uint256)", +"8f288644": "getHighestBid(uint256)", +"8f2900d5": "timeLocks(uint256)", +"8f291158": "listBBO()", +"8f296759": "UTILITY_ROLE()", +"8f29f09a": "fetchPaidOrdersForMerchant(address)", +"8f2a3093": "freeBeerOnMe(string)", +"8f2a6d3e": "YOOBAToken(address,address,address,address,address)", +"8f2abe9a": "Voting(uint8,address,uint256)", +"8f2adbee": "tileBonuses(uint256,uint256,uint256)", +"8f2bab07": "getChainLength()", +"8f2be8e0": "MauiWowieToken()", +"8f2c2ab7": "checkAndCloseDeposit(uint256,bool)", +"8f2c3af8": "lastBlock_v10Hash_uint256()", +"8f2c44a2": "UnicornMilker()", +"8f2e695c": "ICO_state()", +"8f2e8d4a": "createTrack()", +"8f2e9ee7": "theDay(uint256)", +"8f2eabe1": "isValidatorFinalized(address)", +"8f2ec012": "dayToBlockNumber(uint256)", +"8f2ee2df": "mainPot()", +"8f2ef6b7": "CMGF()", +"8f303df9": "priceExpired()", +"8f30435d": "getCompetitionValues(string,uint8)", +"8f32106e": "CreateALLY(address,uint256)", +"8f32cf0c": "team_address()", +"8f32d59b": "isOwner()", +"8f33221e": "addContract(address,uint256,uint256)", +"8f33c285": "getAyantDroitEconomique_Compte_8()", +"8f33df77": "countAllVotes(uint256)", +"8f34296b": "Applied()", +"8f348cfe": "InsertProject(string,string,address,address,string,string,address)", +"8f34ac6e": "setCoOwner(address)", +"8f350624": "contributionOpen()", +"8f356f97": "lottoHighestNumber()", +"8f35a75e": "getInvestor(address)", +"8f36039c": "holdContract()", +"8f367001": "numTokensAbleToPurchase()", +"8f368359": "getTimeUntilInterestIncrease(bytes32)", +"8f3684bf": "returnTotalDividend()", +"8f36d03e": "_finishSpin(address)", +"8f36f8f1": "redeemStake(address,address,uint256,uint8,bytes32,bytes32)", +"8f37a0f9": "getTo(uint256)", +"8f382a00": "ETHEAL_UNIT()", +"8f38a896": "BRONZE_AMOUNT_XPER()", +"8f38bf34": "updatePrices(uint256,uint256[],uint16,uint256[],uint256[])", +"8f38d8cc": "S(string)", +"8f38f309": "buyXid(uint256,uint256)", +"8f3956a4": "ChangeUpgradeMaster(address)", +"8f395eb6": "addIntComparison(bytes32,int32,bytes1)", +"8f398180": "isUnknown(address)", +"8f3984b5": "setRole(address,string,bool)", +"8f3b6b84": "centsPerToken()", +"8f3b8c3a": "setTokennCrowdsale(address,uint256)", +"8f3bab85": "readFromCart(uint256)", +"8f3bed06": "pickUniquePacks(uint256[])", +"8f3de282": "onSealed(address,address,uint256)", +"8f3e568a": "findOutInterestByClientCategory(address,uint256,uint256)", +"8f3e8747": "getGasForMcrData()", +"8f3f50fc": "startICOTimestamp()", +"8f40104c": "init(address,uint256[],uint256,uint256,uint256,uint8,uint256,bool)", +"8f409b85": "Coin(uint256,string,uint8,string)", +"8f41e442": "breakTie(uint256)", +"8f420866": "DEFAULT_SEND_GAS()", +"8f426437": "getTankOwner(uint32)", +"8f42a864": "TitaToken()", +"8f43166b": "getGivenCount()", +"8f44097a": "TokenRDC(address,address,address)", +"8f449a05": "subscribe()", +"8f456125": "setCrowdSaleAddress(address)", +"8f4613d5": "left10(uint256)", +"8f4646b7": "transferPreSignedCheck(address,address,uint256,uint256,uint256,uint8,bytes)", +"8f46b586": "withdraw_team_fund(address,uint256)", +"8f4708bd": "mintingBountyFinish()", +"8f477c55": "updateLink(address,bytes)", +"8f4783f1": "_generateRealmSale(uint256,uint256)", +"8f47dd19": "bulkInit(address[],address[],uint256[])", +"8f484394": "manual_withdraw()", +"8f48c14a": "updateMinCompanyValue(uint256)", +"8f49a264": "provide_eth()", +"8f49ccf4": "reportUsage(uint256,uint256,address)", +"8f49da4b": "distributedToken()", +"8f4a2a51": "defaultWallet(address)", +"8f4b4b98": "messagesSigned(bytes32)", +"8f4ccce8": "startTokenVotes(address[15])", +"8f4ce746": "buyDeferredPresaleTokens(address)", +"8f4d8723": "_CallExecuted(address,bytes32)", +"8f4d874a": "referralTokensAddress()", +"8f4dc0d1": "updateAvailable(uint256,uint256,bool)", +"8f4e4321": "accountOf(uint256)", +"8f4e5158": "increaseFrozenBalances(address,uint256)", +"8f4ed333": "step2()", +"8f4f3c70": "DungeonChallenged(uint256,address,uint256,uint256,uint256,uint256,bool,uint256,uint256,uint256)", +"8f4fb958": "calculateRandomNumberByBlockhash(uint256,address)", +"8f4fde42": "crossForkCount()", +"8f4ffcb1": "receiveApproval(address,uint256,address,bytes)", +"8f50fb06": "getTrapInfo(uint256)", +"8f50fdd6": "walletAddressesSet()", +"8f512c47": "getSponsorships(address,address)", +"8f518475": "NewKoth(uint256,uint256,address,uint256,uint256,uint256)", +"8f52d420": "CryptoStrippers()", +"8f52da60": "technicalWallet()", +"8f535904": "CROWDSALE_REWARD_WALLET()", +"8f541730": "advisor1Sum()", +"8f55a850": "getArtistList()", +"8f56015f": "setRequirement(uint256)", +"8f5665ce": "nthWagerPrizeN()", +"8f571461": "ICOPRICE()", +"8f580996": "enablePurchasing()", +"8f58190e": "setLLV_edit_19(string)", +"8f581a53": "giveRegistration(address)", +"8f5949f9": "isContractActive()", +"8f5a5a39": "verifyPayment(bytes8)", +"8f5ab3ab": "transferdata(address,uint256,bytes)", +"8f5ab947": "getNextDropTime()", +"8f5b0b1c": "timeCheck()", +"8f5bae2e": "anchor(bytes32,uint256)", +"8f5bc587": "TokensForSale()", +"8f5c2eff": "getPurchaseInfo(uint256,uint256,uint256,uint256,uint256,bool)", +"8f5c5d40": "validTranscodingOptions(string)", +"8f5cbe36": "testCreateSale()", +"8f5cf7b9": "vestingStageTime()", +"8f5d23f6": "TOKENS_FOUNDATION()", +"8f5e0b3f": "UserBondByOffset(uint32)", +"8f5e514a": "diff(uint256,uint256)", +"8f5e619b": "publishEtherBox(bytes32,string,uint256)", +"8f5e9ca7": "acceptTOS(address,bool)", +"8f5f20c2": "LMA()", +"8f5f657d": "rateboc()", +"8f5fa4a4": "changeReceiverAddress(address)", +"8f608f4f": "exchangeRateMNY()", +"8f60cf17": "increaseSalesBalance(address,address,uint256)", +"8f6107ef": "MatthewWon(string,address,uint256,uint256)", +"8f612102": "createCarrier()", +"8f617fcd": "icoFinishTimestamp()", +"8f61da35": "getDebtLength()", +"8f620487": "expirationDate()", +"8f62077d": "getPlayerShips(address)", +"8f6218a3": "rollDices()", +"8f6245e1": "parseBool(bytes32)", +"8f627aab": "BlockIntervalCrowdsale(uint256)", +"8f62905f": "mintTokens(int256,uint256,uint256,address)", +"8f62b028": "updateUSeqgret()", +"8f632311": "doMint(address,uint256,bytes)", +"8f632a34": "MeetupToken(uint256,string,uint8,string)", +"8f6348b8": "stopFeeding()", +"8f63534a": "totalAuctionsCount()", +"8f64337d": "getHashedData(uint256,uint256,bytes32,bytes32,uint256)", +"8f652ec7": "_getVerifierInfo(address)", +"8f654175": "auditorAddress()", +"8f6612c9": "distributedAutonomousExchange()", +"8f679b2d": "EtheraffleICO()", +"8f67bd4d": "SBITokenCrowdsale(address,address)", +"8f67f9d7": "ILLIQUID_TOKENS()", +"8f6811a3": "mintTokensFor(address,uint256)", +"8f68b36f": "getMysubscribers()", +"8f68ca70": "setWhiteListContract(address,bool)", +"8f6963df": "initShareRule6()", +"8f699f6c": "calcInvalidKeys(uint256,uint256)", +"8f69fa25": "startLockingPeriod()", +"8f6a3deb": "_activateZoneLand(int32,int32,uint8,uint8)", +"8f6a7286": "refundMultipleUsers(address[])", +"8f6ac8d7": "FinalizableCrowdsale(uint256,uint256,uint256,address)", +"8f6b875a": "OWNER_POOL_COMMISSION()", +"8f6bc659": "ownerWithdrawExcessTokens(uint256,address)", +"8f6caf63": "sendPoint(uint32,uint32,int256,address)", +"8f6ede1f": "mintWithEther(address)", +"8f6f3275": "getLease(uint8,uint256)", +"8f6f6115": "getOraclizePrice()", +"8f6f988c": "setUltimateOutcome(bytes)", +"8f6fa4c2": "ICO_details()", +"8f6fba8c": "FEATURE_TRANSFERS_ON_BEHALF()", +"8f70009d": "id_for_address(address,address)", +"8f701eaa": "addguess()", +"8f702afa": "sellerNumOpenDeals(address)", +"8f70585f": "bid(address,uint256,uint256,uint256)", +"8f70bfa0": "processDeposit()", +"8f70ccf7": "setTrading(bool)", +"8f7140ea": "receivePlayerNameList(uint256,bytes32)", +"8f717e80": "totalCreationCap()", +"8f71b3db": "etherToUSDrate()", +"8f71f3cb": "getBdpPriceStorage(address[16])", +"8f728516": "initNewGame()", +"8f729925": "receivePercent()", +"8f72e065": "StabitCoin(uint256)", +"8f72fc77": "getOrders(uint256,uint256)", +"8f731077": "extractAllowanceRecordLength(address)", +"8f73c5ae": "distributeReward()", +"8f7445e6": "setStageThirdBegin()", +"8f7451ae": "GetStoreInfo()", +"8f750271": "prose()", +"8f75362d": "emergencyWithdrawAdmin()", +"8f75374d": "incrementSupply()", +"8f754a1e": "affectedCount()", +"8f755c7c": "getOptionState(address[3],uint256[3],uint256[2],bool)", +"8f760988": "forceStopCyle()", +"8f76691a": "margin()", +"8f76a1f7": "lastClaimedRound(address)", +"8f76dfc3": "allTokenICO()", +"8f770ad0": "supplyCap()", +"8f77339f": "sendToken(uint256,uint256,uint256,string)", +"8f775839": "settled()", +"8f776ff1": "allowanceBalance()", +"8f778bb9": "setEmployer(string)", +"8f77c2bf": "contractTransferOwnership(address)", +"8f78b34a": "lockAccounts(address[],uint256[])", +"8f790507": "teamEthContract()", +"8f7a1fe0": "static_income(address,uint256)", +"8f7a4738": "censure(uint16,uint32)", +"8f7a844b": "getAdminData()", +"8f7b7bce": "isTeamLockInPeriodOverIfTeamAddress(address)", +"8f7ba0a1": "registerbot()", +"8f7d33cf": "addCashback(string,uint256,address,uint256[],uint256[])", +"8f7d4dad": "getFirstPoints()", +"8f7d79da": "nextRoundMaxDonors()", +"8f7db6ee": "_setProviderSupply(uint256,uint256)", +"8f7dcfa3": "head()", +"8f7fe231": "ValidetherOracle()", +"8f80269d": "getClientSupply(address,uint256)", +"8f807f6b": "enqueue(address)", +"8f80b7bc": "registerTokenInternal(address,string)", +"8f80d339": "roundClaimICOKeys(uint256)", +"8f81ecfc": "removeChild(bytes32,bytes32)", +"8f81fd4a": "changeIcoDiscountPercentages(uint8,uint8,uint8)", +"8f8203c0": "transuser(address,uint256)", +"8f828c9e": "totalSupplyAtInternal(uint256)", +"8f82b8c4": "getWhiteListCount()", +"8f8336b7": "setFeesMaxUptoCoin(uint256)", +"8f835871": "addRealWorldPlayers(uint128[],bool[])", +"8f83719c": "getTreasuryBalance(address,address)", +"8f83743f": "Fricacoin()", +"8f838478": "getInstantiationCount(address)", +"8f842851": "dateManager()", +"8f847076": "removeNFToken(address,uint256)", +"8f84aa09": "ownerAddress()", +"8f850163": "flipsWon()", +"8f855433": "newCreator()", +"8f85f92c": "isPoDEnded()", +"8f860c5f": "createWallet(address,address)", +"8f86f5ea": "finishSale()", +"8f872bb1": "advisorsAndAmbassadorsAddress()", +"8f87932c": "fix_amount(uint256)", +"8f87c84b": "transferOutEth()", +"8f87e387": "updateSspManagerContract(address,string)", +"8f88110d": "updateRecordWalletAddress(string,address)", +"8f88708b": "retrieve(uint256)", +"8f88a00e": "calculateRewardStructures()", +"8f88aed0": "populateFromItemRegistry(uint256[])", +"8f88b792": "createCampaign(string,uint256[3],uint256[],uint256,uint256,uint256,uint256)", +"8f8949e6": "setTotalCardCount(uint256)", +"8f8a5832": "reLoadXid(uint256,uint256)", +"8f8b2c9b": "totalEthJackpotRecieved()", +"8f8bbb8c": "ObjectedVote(bytes32,address,uint256)", +"8f8bcae6": "minting(address,address)", +"8f8bd64c": "calculateNetworkTokenBonusPercentage(uint256,uint256,uint256,uint256,uint256)", +"8f8bde82": "MicroDAO()", +"8f8c7c50": "_randomMeme()", +"8f8d322e": "melt(address,uint256)", +"8f8d49ac": "setStore(string,uint256)", +"8f8db737": "buyDirectInMarketplace(uint256)", +"8f8e7419": "sharedStorage()", +"8f8e8f9d": "refundETHToCustomer(address,address,uint256)", +"8f8eabea": "ZNA(uint256)", +"8f8eb474": "burnBid(uint256)", +"8f8f6b52": "freezTwo()", +"8f907195": "rpow(uint256,uint256)", +"8f9087f5": "hashBytes(bytes)", +"8f908cbd": "setCaptainTokenContract(address,address)", +"8f90f2bb": "getNewRabbit(address)", +"8f9139fb": "Pokecoin(uint256,address,address)", +"8f924560": "addEntity(string,uint256,uint256)", +"8f929c4a": "createAccount(bytes16,string)", +"8f92d308": "viewFeaturePetitionFee()", +"8f937574": "OwnerHelper()", +"8f93bffe": "getOrCacheReportingFeeDivisor()", +"8f940f63": "typeId()", +"8f94f6a0": "piTokensForSale()", +"8f9593f4": "winnerFirst(uint256,uint256)", +"8f96a1ea": "addThing(bytes32,bytes32,bytes32,bytes32)", +"8f975a64": "sendERC20(address,address,uint256)", +"8f97ad89": "claimTokensFor(address,address)", +"8f97cff0": "getPersonsCount()", +"8f97d03f": "IbizaERC20Token()", +"8f97e3a0": "requestPayout(uint256)", +"8f984115": "AUEBToken()", +"8f98767e": "fundingMaximumTargetInUsd()", +"8f98ce8f": "transferFeeNumerator()", +"8f98e0e1": "MBToken()", +"8f99d31b": "betLow()", +"8f99ea43": "setDividendDB(address)", +"8f99fdab": "SafeDeduct(uint256,uint256)", +"8f9a42b8": "philadelphiaBets()", +"8f9a57ef": "minSignId()", +"8f9a6da1": "queryOracle(string,string)", +"8f9abae1": "accessControlled()", +"8f9abe52": "isValidSellOrder(address,address)", +"8f9ade5e": "create(address,bytes32,uint256)", +"8f9b7eb7": "updateReleaseAmount()", +"8f9bbf16": "getSecurityTokenData(address)", +"8f9bf95d": "_payCommission(address)", +"8f9d1cba": "zss(address)", +"8f9d390a": "toteLiquidatorTransferComplete()", +"8f9de24b": "uniqueSpinnersActive()", +"8f9df278": "newEntry(int256,bool,uint256,int256,string,bytes32,address,uint256[])", +"8f9e1409": "removeSection(bytes32,bytes32)", +"8f9f5b2f": "getMemoryWrite(uint256,uint256)", +"8f9fa9ec": "chngDL(uint256)", +"8f9fb0e4": "getAssetString(uint256)", +"8fa148f2": "currentRoundStartBlock()", +"8fa17580": "claimEgg(uint256,bytes32,bytes32)", +"8fa1ae05": "batchTransferSingleValue(address[],uint256)", +"8fa32111": "addInvestor(address[])", +"8fa366df": "changePhaseToICOweek3()", +"8fa3a84c": "validateTransaction(address)", +"8fa4c0b1": "tokenPlus(address,address,uint256)", +"8fa54b81": "setUserBattleValue(address,uint256)", +"8fa5614f": "getBylawsProposalVotingDuration()", +"8fa56215": "_createToken(string,string,string,uint256,address,uint256,uint256)", +"8fa566e8": "tokenIdOfUUID(string)", +"8fa5a6e9": "pmtAccount()", +"8fa65488": "startRefundInvestorsBallot()", +"8fa6da99": "Modultrade(address,address,address,address)", +"8fa81bb0": "PrivateSale(address,uint256)", +"8fa8b790": "cancelAuction()", +"8fa906b2": "addFounder(address,uint256)", +"8fa9cc09": "HeritableWalletFactory()", +"8fa9e55c": "signIn(address)", +"8faa6cb7": "partnersLockEnd()", +"8faa77b2": "deployers(uint256)", +"8faab3a7": "BatchAttachAssets(uint256[10])", +"8faad4c4": "createPromoTeam(string,address,uint256)", +"8fab0549": "setInvestorsPercentage(uint256)", +"8fabd326": "mPausedTime()", +"8fac3d3e": "feesGathered()", +"8fad8334": "_timeRemaining()", +"8fad8eec": "EnterRentToken()", +"8fadd08b": "betHigh()", +"8fae065c": "setStartIcoPreICO(uint256)", +"8fae4857": "finaliseChannel()", +"8fae60a5": "agree()", +"8fae8850": "ICOmint(address,uint256)", +"8faef6a5": "getTierForLastMiniting()", +"8faf682d": "payeeWithdrawCapital()", +"8faf850d": "addUser(bytes32)", +"8fafb286": "claimResearchDividends(address,uint256,uint256)", +"8fafebca": "TokensPurchased(address,uint256,uint256)", +"8fb0de08": "getCurrentRoundInfo2()", +"8fb197d1": "getUserDataOnToken(address,uint256)", +"8fb21a4b": "setMinReferrerBonus(uint256)", +"8fb25f82": "sellCells()", +"8fb29d6c": "pastAgreement(uint256)", +"8fb2f8b4": "isCollectTokenStart()", +"8fb2fbe1": "getTokenToEthUpdateOrderHint(uint32,uint128,uint128)", +"8fb48844": "noOfreservations(address)", +"8fb4b573": "start(uint256,uint256)", +"8fb50078": "joinProvider(address)", +"8fb51ccd": "QosinusCoin()", +"8fb5202b": "setFinancialAddress(address)", +"8fb5a482": "getPrices(address[])", +"8fb67f60": "aPurgeMessages()", +"8fb6d997": "updateStorageContract(address)", +"8fb74077": "HoursFromNow(uint256)", +"8fb74ae9": "isBannedUser(address)", +"8fb807c5": "totalAssetSupply()", +"8fb84bb0": "marketBuy(uint256)", +"8fb8f109": "addressToPersonId(address,address)", +"8fb96635": "decreaseBalance(address,uint256,uint256)", +"8fba273c": "m_investmentsByPaymentChannel(address)", +"8fba8d5c": "toHexString(uint256)", +"8fbb3c17": "CROWDSALE_PHASE_2_START()", +"8fbb9b49": "_isProduct(address)", +"8fbc3ecd": "BUFFER()", +"8fbc7eb0": "balanceOfToken(address,address,address)", +"8fbd4fa5": "claimPrizes(uint256,uint256,uint256,uint256)", +"8fbe382c": "totalFoundCoin()", +"8fbea5c9": "totalCommissionOwed()", +"8fbeee23": "sendOutEtherWithGasAmount(uint256)", +"8fc01623": "activatePackage(uint256)", +"8fc1d08b": "transferFromPublicAllocation(address,uint256)", +"8fc202ae": "currentKeyRound()", +"8fc264e0": "allocateTokens(uint256,uint256)", +"8fc3047d": "checkPrice()", +"8fc3c33b": "GenerateFortuneCookie(uint8)", +"8fc469b1": "setPricesDecimals(uint256,uint256)", +"8fc4ea4c": "ownerPetCollection(address,uint256)", +"8fc5668b": "processRequest()", +"8fc5efd4": "c_centsPerTokenFirst()", +"8fc5fd83": "FRPoint()", +"8fc6ad2d": "getParameterValueByTitle(bytes32)", +"8fc6bf7f": "ico3endTime()", +"8fc7a25d": "getEthAmount(uint256)", +"8fc8a134": "DepositBeneficiary(address,uint256)", +"8fc95403": "saleSecondEarlyBirdEndBlock()", +"8fc9bff6": "_claimRewardBlank(address,string)", +"8fca3057": "pastPlayRoundsCount()", +"8fcb4e5b": "transferShares(address,uint256)", +"8fcbeeb7": "getFreeDragon()", +"8fcc9cfb": "setMinDeposit(uint256)", +"8fcd558e": "GetDataRequestLength(uint256)", +"8fce0ee7": "secondLineWrong()", +"8fce6b07": "_addKeeper(address)", +"8fced626": "resolveBet()", +"8fcee83f": "getRoomStatus(uint256)", +"8fcf31e3": "createCardFromName(string)", +"8fd0290f": "YZChain(uint256,string,uint8,string)", +"8fd0b051": "buyTokens(address,uint256,uint256,uint256)", +"8fd0de57": "identityCommitments(uint256)", +"8fd16541": "referrer2Percent()", +"8fd1b1f2": "maxCardUpgradeLevel()", +"8fd21139": "MixMall()", +"8fd23762": "IOSToken()", +"8fd237e1": "setJackpotWinPercent(uint256)", +"8fd28bcf": "testFailAuthorityAuth()", +"8fd3ab80": "migrate()", +"8fd4f899": "setVipRate(uint256)", +"8fd57396": "winAmount5()", +"8fd5a39e": "distributeSMILE(address[],uint256)", +"8fd5d753": "EternalToken(uint256,string,string)", +"8fd5eb06": "_decodeSettle(bytes)", +"8fd611be": "eventManager()", +"8fd65890": "getCurrentAvailableFunds()", +"8fd7124e": "BeginRound()", +"8fd712ae": "PRICE_STAGE_ONE()", +"8fd79669": "setPokemon(uint256,string,address,uint256,uint256)", +"8fd7aab6": "unfreezeAccount(address,uint256)", +"8fd88225": "GetChipList(address)", +"8fd88ed1": "setManagerIncome(address,uint256)", +"8fd8b429": "vanishCoins(uint256)", +"8fd90960": "UpgradeProposalSubmitted(uint256,uint256,address,address,address)", +"8fd9f1b4": "DaoRules()", +"8fda183a": "hasPoolRole(address)", +"8fda356d": "activateContract()", +"8fda5c8e": "creatorsPoolMintQuota()", +"8fdb385b": "Trc(uint256,string,string)", +"8fdb7189": "double()", +"8fdb72f3": "gzeEth()", +"8fdc054f": "purchaseCrates(uint8)", +"8fdc24ba": "left94(uint256)", +"8fdf51d5": "getMyAllAuction(address)", +"8fdf741a": "_batch3_rate()", +"8fdfac6b": "setMAXfinney(uint256)", +"8fe10615": "walletLocked(address)", +"8fe10ae4": "FundsAdded(address,uint256)", +"8fe13b92": "addExchange(bytes32,address)", +"8fe26bf5": "TailsToken(uint256)", +"8fe2b355": "getGameVars()", +"8fe2eb9e": "setSellDividendPercent(uint256,uint256)", +"8fe316fe": "withdrawNotification(uint256)", +"8fe3579f": "addCharacter(string,address,uint256)", +"8fe3ec6d": "setDefendBoostCap(uint256)", +"8fe44adf": "ico4Min()", +"8fe47625": "showMyTokenBalance(address)", +"8fe52aea": "checkList(string,address)", +"8fe58eb9": "Triger()", +"8fe5f77d": "hackTenuous(address)", +"8fe60df1": "calculateCounterReceived(uint256)", +"8fe6677d": "addToWhitelistMultiple(address[])", +"8fe89502": "calculateFNKRate()", +"8fe8a0a6": "abcLottoResolver()", +"8fe8a101": "isKilled()", +"8fe8cb79": "promotionIndexToClaimant(uint256)", +"8fe91976": "activateWithdrawal()", +"8fe92aed": "votedPerCent(address)", +"8fe9a12f": "BKUToken()", +"8fea1e4d": "decreaseAllowance(address,uint256,address)", +"8fea64bd": "Hourglass()", +"8feaa243": "callTest(address,address,uint256,bytes,string)", +"8feadcb7": "setPeriod(uint256,uint256,uint256)", +"8febb1e5": "getPlayerHasAff(uint256)", +"8fedc959": "hedgeAddress()", +"8fedd2f2": "getTestTwo()", +"8fee3dab": "updateStat(uint256,uint256,uint256,uint8,uint8)", +"8fee7687": "allocatePresaleTokens(address,uint256)", +"8fee7b57": "registerQuarterSeason(int8)", +"8ff0c391": "isBuyBackTwo()", +"8ff11282": "parseKey(bytes32)", +"8ff1a583": "ICO_HARDCAP()", +"8ff21e0d": "LogBounty(address,uint256,string)", +"8ff255d6": "getHighestPrice(uint256)", +"8ff49347": "LOG_InvestorCapitalUpdate(address,int256)", +"8ff591b4": "addMinutes(uint256)", +"8ff5cbc3": "ApproveERC20(address[])", +"8ff5f021": "tokenAlreadyUsed(uint256)", +"8ff6650a": "Lending(uint256,uint256,address,uint256,uint256,uint256)", +"8ff67e35": "EthereumPro()", +"8ff6c8dd": "ICOSaleEnd()", +"8ff6e971": "isSecondary(uint256)", +"8ff72293": "getLotteryStatus(uint256)", +"8ff813fd": "transferVester(address)", +"8ff82a97": "TransferLockedToken(address,address,uint256,uint256)", +"8ff8754c": "getShareIndexDebugForTestRPC()", +"8ff936ea": "NoahCoin()", +"8ff95fa8": "catNames(bytes5)", +"8ff9b84e": "newStorage(address)", +"8ffa9690": "getBoolValue(bytes32)", +"8ffb4dc7": "nextStage(bool)", +"8ffb5e67": "getEvents(uint256,string,uint256)", +"8ffbcb81": "endIcoSaleRound3()", +"8ffbd95b": "setFcfContractAddress(address,address)", +"8ffc024f": "login(address,address)", +"8ffc831a": "testMemoryIntegrityCheck32Bytes()", +"8ffcdc15": "ContractDeployed(address)", +"8ffd2a1b": "add(uint256,address,uint8,string,address,address,string)", +"8ffe9b94": "transferTo(address,address,uint256,uint256)", +"8ffeb5c8": "MyBoToken(uint256,string,uint8,string)", +"8ffec6ee": "vinciCap()", +"9000b3d6": "addVerifier(address)", +"9000fcaa": "killAllowanceContract()", +"900104da": "updateAddressInfo(address,address,uint256,bool,uint256,bool,uint256,bool,string,bool)", +"90014f06": "ownerSetJackpotOfHouseEdge(uint256)", +"90018343": "_forwardFundsWei(uint256)", +"9002dba4": "right17(uint256)", +"900334b1": "investorDividendsAtNow(address)", +"9003adfe": "collectedFees()", +"9003ff51": "XET2()", +"90042baf": "createContract(bytes)", +"90044d18": "phaseTwoBonusPercent()", +"90045412": "withdrawloss(address,address)", +"900526b3": "getAuthorizeContract(uint256)", +"90059aed": "_daysToDate(uint256)", +"90061292": "Bazzhtoken()", +"90063fd4": "payContributorByNumber(uint256)", +"90065125": "PropertySet(address)", +"900683d0": "subtraction(uint256,uint256)", +"90070cb3": "Contribution(address,address,address,uint256,uint256)", +"9007127b": "getIntValue(bytes32)", +"900726c2": "sellOpen()", +"9007cdf3": "TOXBToken()", +"9007d53f": "withdrawTokens4(uint256)", +"900863e7": "depositTeamPerfit(uint256)", +"900888a3": "unsetERC777(address)", +"9008d64f": "getHolderInfo(bytes32)", +"90099ece": "preIcoOpen()", +"900a0285": "double(bytes32,uint8,uint256)", +"900a974e": "end(string)", +"900b7b62": "getWorkerAddress(uint256)", +"900cf0cf": "epoch()", +"900cff49": "getEsgoTXFund(uint256)", +"900d33d9": "createContractCar(string)", +"900d3812": "registerTransaction(string,address,uint256)", +"900d6f39": "maxStage1AllocationPerInvestor()", +"900d85fa": "updatePreReleaseTree(bytes32)", +"900dd918": "newTransferManualTokensnewTransfer(address,address,uint256)", +"900ddb58": "WCF()", +"900e1248": "sendlimit()", +"900e1561": "changePersonalMincap(uint256)", +"900eb5a8": "currentValidators(uint256)", +"900f080a": "reveal(uint256[],bool[],bytes32[])", +"9010470d": "markAsComingAndFreeze()", +"90107afe": "setAddresses(address,address)", +"9010c70b": "defaultLockBlocksForPool()", +"9010f726": "getKeysByPurpose(uint256)", +"90126acf": "optionsExercised(bytes32,address,address)", +"9012c4a8": "updateFee(uint256)", +"90135fec": "maxReached()", +"9013ad18": "activateUser(address,address)", +"9013d1ed": "startChallengePeriod(bytes32,bytes,address)", +"9014b075": "clockairdrop()", +"90152ddb": "Liutestcoin(uint256,string,uint8,string)", +"9015e1dc": "getPlayerAddressById(uint256)", +"9016bc21": "client_address(address)", +"9016dd4b": "push(address,uint256[2],uint8)", +"9017006e": "getDevFees()", +"901717d1": "one()", +"90171e57": "setBonusRound1(uint256)", +"9018c431": "serServerStatus(string,uint256)", +"901b2036": "totalSpins()", +"901b4301": "evacuate(address)", +"901b9249": "round(int256,int256,bool)", +"901c4e4f": "deployVault()", +"901c7518": "commRate(uint256)", +"901c947f": "showContractBalance()", +"901cea7b": "allocateEcosystemTokens()", +"901d7775": "voteOutMasterKey(address)", +"901da0df": "ownerTokenTransfer(address,uint256)", +"901fe291": "_deposit(uint256,address,address,uint256)", +"902025bd": "OfficalHolding()", +"9021c03d": "creditDividends(uint256)", +"9021dd30": "MinBetAmountChanged(uint256)", +"90232694": "toMemory(uint256,uint256)", +"90236e76": "Short()", +"9023c993": "YupieToken()", +"90255c6a": "salmanCoin()", +"9025ab6d": "ethTransfertoKYC(uint256)", +"9025e64c": "networkId()", +"902650aa": "initCards()", +"9026ad2e": "AbstractSweeper(address)", +"9026bd65": "RaffleGraphBook(string,uint256)", +"9026dee8": "checkAdmin(address)", +"902753f4": "verificationOff(address)", +"9028353a": "founder2Address()", +"9028f20b": "bodyElementBySubtypeIndex(uint256)", +"9029444a": "getMemberAddress(uint256)", +"9029a32b": "updateRausPoint(uint16,int256,uint16)", +"902a83cd": "addReleaseAuction(uint256,uint256,uint256,uint256,uint256)", +"902ab12f": "TestTest()", +"902c0dcc": "BalancesInitialised()", +"902c3ad7": "LOOMIA1_ADDR()", +"902c6811": "ProtectedReclaim(address,address,uint256)", +"902c92b7": "playHand(uint8,uint8,uint8,uint8[5],uint8[],uint8[],uint8[])", +"902d55a5": "TOTAL_SUPPLY()", +"902e64e5": "Oath()", +"902eded3": "eip165Supported(address)", +"902f1492": "registerPayment(address,uint256)", +"90300e38": "calNewTokens(uint256,string)", +"90304341": "safeToSub(int256,int256)", +"9030e40f": "totalFundRaised()", +"903171ae": "foundationTokenWallet()", +"9031bd2f": "_buyTokensFromSeller(uint256)", +"90323075": "TrustlessTransferStatusModified(uint256,bool)", +"9032bfc8": "setDaySecond()", +"9032f1a9": "createBenzTicket(address,uint256)", +"9033de61": "FricaCoin()", +"90347678": "numclaimed()", +"9034b427": "numDonors()", +"9035b4ff": "Biniu(uint256,string,string)", +"9036420a": "Cosmo()", +"9037ada9": "getTokenForEdit(address,string,string,string,uint256,uint256,uint256)", +"903833cc": "setMemorySize(uint256)", +"90393fc8": "maxPerTeam()", +"9039e01d": "newDay()", +"903a3ef6": "finalizeIco()", +"903a8298": "subscriptionCounter()", +"903b1f20": "enact_withdrawal_less(address,uint256,uint256)", +"903cc583": "calculateTokens(uint256,uint256)", +"903d0ac0": "publicAllocationTokens()", +"903d3340": "balanceOfFlower(address)", +"903d772a": "addDelegatorById(uint256,address,address)", +"903d9b2f": "Webrypto()", +"903db106": "x(bool)", +"903e95a9": "DeskToken(address)", +"903f2c48": "isAuthenticating()", +"903ff4fc": "AssetDK3()", +"90414116": "Period()", +"9041bdeb": "BNW()", +"9041f2c8": "WithdrawProposalFund(uint256)", +"9041f960": "manageTransferLock(address,bool)", +"90427b6c": "dev4Wallet2Pct()", +"9042aa27": "paymentForkIndexes(uint256)", +"9042bbf3": "prizeClaimed()", +"9042dcd9": "prizeMoneyQuantity()", +"90430c00": "getVersionImplementations(bytes32,bytes32,bytes32)", +"90431b6e": "withdrawAllFromToken(uint256)", +"90445e9f": "getPlayerNb(uint256)", +"9046fefd": "NewCurator(address)", +"904740cd": "getOscar()", +"9047ad74": "activateProject(address)", +"90483aa1": "PowerLedger(address)", +"9048816f": "resultConfirmed()", +"9048f510": "createContractGame(string,uint256)", +"9049681c": "addBuyOrder(uint256,uint256)", +"904a7d4c": "midasDeposit()", +"904aaf8f": "foreground()", +"904adc3d": "ERC23TokenMock(address,uint256)", +"904b46a1": "NEOToken()", +"904b67c2": "IcoClosedManually()", +"904bd6d0": "setTokensPerEther(uint256)", +"904c6094": "contractHash()", +"904cbd79": "depositCommission()", +"904d2248": "betHashOf(address)", +"904d3f47": "IADAddress()", +"904d5ed6": "Update_Cash_Proof_amount(uint256)", +"904da3d7": "Buyout(address,address,uint256,uint256,uint256,uint256)", +"904dc85d": "providerRewardLib(address)", +"904de64e": "TRSOffset()", +"904e1c88": "sales(bytes16,uint256)", +"90502c2e": "collectTokens(address[])", +"9050b560": "obligations()", +"9051d18a": "tokenEnabled(uint256)", +"90525c05": "devLimit()", +"905295e3": "unlockAccount(address)", +"9052b3d5": "_contains(address[],address)", +"9053ef56": "onReceivePrivate(address,address,uint256,bytes)", +"9053f420": "trade(address[8],uint256[6],uint256,uint8,bytes32,bytes32)", +"905473cf": "updateMaxJump(uint256,uint256)", +"9054bbb6": "INITIAL_TAP()", +"9054bdec": "toTimestamp(uint16,uint8,uint8,uint8,uint8,uint8)", +"9055172d": "UVDToken()", +"905529be": "startCrowdsales(uint256)", +"9055bc12": "QRToken()", +"9055ffb0": "trackTreasuryToken(uint256)", +"9057bc48": "canStopWork()", +"9057f289": "createListing(address,uint256,uint256,uint256,uint256)", +"9058c8a4": "setBuyFeeBps(uint256)", +"9058e228": "buy(address,bytes32)", +"90596dd1": "controllerBurn(address,uint256)", +"905a7649": "RegisterTransaction(address,uint256)", +"905a90fe": "numberImmortals()", +"905ae5f5": "fechCurrentStageIndex()", +"905b7256": "_rewardLotteryWinners(uint256,uint256)", +"905b8000": "CountStudentnRequests()", +"905bd5e4": "superTransfer(address,address,uint256)", +"905bebe9": "solveProblem(uint256)", +"905c949e": "AURIX()", +"905d326c": "_newCampaign()", +"905dca52": "haveEitherAttribute(address,bytes32,address,bytes32)", +"905e6e42": "JSON_Test()", +"9060091c": "setAmountToken(uint256)", +"90603bdb": "getEscrowsByOwner(address)", +"90604005": "cln()", +"9060e35d": "Voronezh()", +"9061a6e9": "increaseSoldSaleSupply(uint256)", +"9061aedd": "fundOnContract()", +"9061da22": "MANHATTANPROXYEASTENDAVE()", +"9062145a": "CreateXPA(address,uint256)", +"906273a3": "asyncTokenSend(address,uint256)", +"9062a445": "setGameAddress(address,address,address)", +"9063e860": "transferOrigin(address,uint256)", +"90645840": "newHash(uint256)", +"90646b4a": "setGateway(address)", +"9066314e": "toggleLastChance(bool)", +"90664cf5": "armyAircraftCarriersCount(uint256)", +"906686a6": "totalIssueTokenGenerated()", +"9066c472": "addRoyaltyReceiver(address,uint256)", +"90676901": "stallionWith(uint256,uint256)", +"9067b677": "getEndTime(uint256)", +"906802cf": "tokensUnlocked()", +"906860d9": "Whitelist(address,address)", +"906a114c": "getAllMoneyOut()", +"906a26e0": "softCap()", +"906ab111": "preIcoTokenSales()", +"906b23be": "TOKEN_FOUNDINGTEAM()", +"906c7c68": "internalGetApproved(uint256)", +"906ca728": "viewReservedTokens()", +"906d5785": "setTeamContract(address)", +"906d895d": "getAvailableSeats()", +"906e1ec0": "canWriteName(address,bytes32)", +"906e9400": "newManager(address)", +"9070222e": "getCardIdByRank(uint256)", +"9070b18d": "_getAllRevisionBlockNumbers(bytes32)", +"9070e8a5": "validContracts(address[])", +"90714770": "finalizeFirstStage()", +"9072d58a": "registerPullPayment(uint8,bytes32,bytes32,string,string,address,address,string,uint256,uint256,uint256,uint256,uint256)", +"907316a9": "_getEarnings(address,address,uint256)", +"90731848": "minPriceForNextRound(uint256)", +"9073280b": "SFTPRECOE()", +"9073576c": "UnfreezeAccountByTime(address)", +"90742e52": "initsegmentation(address,uint256,uint256)", +"90753533": "activateMainIco()", +"90754979": "sendPriceRequestToOracle(bytes16,bytes16)", +"9075726e": "SeeSourToken()", +"9075b10c": "LogWhiteListedMultiple(uint256)", +"9075becf": "multisigWallet()", +"9075f124": "setAccountVerified(address)", +"90762a8b": "ownerBurnToken(uint256)", +"907631fc": "toBool(bytes,uint256)", +"9076a38a": "getBackgroundImageCount(address)", +"9076aff7": "lastBlock_a4()", +"9076c166": "setAllocation(address,uint256)", +"9077309b": "burnSoupTokensForDay(uint256)", +"90778ab9": "issueToken(address,address,uint256,uint256,uint256,uint256)", +"9077dcfd": "submitCoding(string,uint256)", +"90785418": "addPiece(string,string,bytes32,address)", +"9078b596": "changePrice(bool)", +"90795e18": "borrowInternal(uint256)", +"90797634": "ident()", +"907a37c5": "getCandidateDetailOnElection(address,address,uint256,address,address)", +"907af6c0": "unit()", +"907b0305": "createERC20(address,uint256,string,uint8,string)", +"907b270b": "priceEthPerToken()", +"907b503d": "depositedToken(address)", +"907be394": "operationsFundAddress()", +"907c5082": "assignTeamTokens()", +"907dff97": "_emit(bytes,uint256,bytes32,bytes32,bytes32,bytes32)", +"907efd7a": "createToken(string,string,uint8,uint256,uint256,uint256,uint256)", +"907f67ee": "pauseBuyback()", +"907f7aa8": "cancelSellOfferInternal(uint32,bool)", +"9080345d": "Role(bytes32,address[])", +"9080c78c": "tixNumberforSale()", +"90810c77": "multivestBuy(address,address,uint256)", +"9081c3db": "markHours(bytes32,int256)", +"90825c28": "getMarketCap()", +"90828c78": "nextPromiseId()", +"90828cdd": "getCreateMarketUniverseValue()", +"90835848": "getCurrentRoundTotal()", +"90836822": "DXC()", +"90838e09": "totalInvested(address)", +"9083998b": "TechnoBit()", +"908408e3": "Initialized(address)", +"90843cd9": "fetchAllCreatedOrders()", +"90843d04": "numIncrement()", +"9084f1f9": "closeMotion(uint256)", +"90855c31": "ACT(uint256,string,string)", +"9085b77f": "allowed(address,bytes32,address,bytes4)", +"9085e88d": "giveBlockreward()", +"90862d1b": "unfreezeTokens(address)", +"908687a9": "Simoleon()", +"90869e9f": "getMartialNumber()", +"9086de3b": "isWhitelised(address,address)", +"90888aa1": "StakeObjects()", +"908921fc": "ceo()", +"90895e1c": "setAllocatedToken(address,address,address,uint256)", +"9089e0c2": "UnicornCoin()", +"9089f616": "removeClient(address)", +"908ab6a5": "roleHash(address,bytes32)", +"908b8cfc": "withdrawOperationalExpenses()", +"908c3a6a": "tokenUserCounter()", +"908ccc5e": "numberOfRecordEntries()", +"908d16de": "BountyAgentChanged(address,bool)", +"908da4e8": "timeTier1()", +"908dd411": "getFundAlterations()", +"908e049b": "destory(uint256)", +"908e2d2a": "maxCoinCap()", +"908e2f06": "mails_to_deliver()", +"908f68ee": "unrespondedCnt()", +"909006fc": "setDirectOffersComissionRatio(uint256)", +"90900df4": "addDebt(bytes32,uint256)", +"90905360": "setDividendsPercent(uint256)", +"9090ce1f": "CANCELATION_DATE()", +"90912d09": "pausingMechanismLocked()", +"9092b623": "PotOfEther()", +"90935301": "setCryptaurReserveFund(address)", +"90938792": "canVoteAs(uint32,int256,address)", +"9093bc3d": "addCoins(uint8,uint8,uint256)", +"9093f5d1": "ReverseBugBounty()", +"90949f11": "getNumberOne()", +"9094b22f": "setAttribute(address,address,string,bytes,uint256)", +"9094c763": "vote(uint32)", +"9095269d": "mintExtraTokens()", +"909540cb": "ERC165()", +"90954483": "createLandmark(string,address,uint256)", +"90957363": "removeFromFutureExpanstionMap(address)", +"9095b2cd": "IPcoin()", +"9095df68": "library2function()", +"90971fea": "ecrecoverWrapperView(uint8,bytes32,bytes32)", +"90972e89": "LogReceivedEther(address,address,uint256,string)", +"90974795": "getall()", +"90979943": "IRB()", +"909862b7": "updateSalary(address,address,uint256)", +"9098f074": "buyServiceByAdmin(uint64,uint64,address)", +"909c36b5": "newEntry(bytes32,bytes32,bytes32,bytes16,bytes1,bytes16,bytes32,bytes32)", +"909c9fca": "reclaimExpiredSwaps(bytes32,bytes32)", +"909d22c7": "many_cryptobanks()", +"909d2cc1": "hasTeam()", +"909d3bc9": "isIdle(address,uint64)", +"909d6877": "preSaleLimit()", +"909e4ab6": "getLog()", +"909e8f92": "unlockFirstPrivate()", +"909ec524": "KyberAirDrop(address)", +"909f2c3a": "ChangeNumber(string)", +"909f617e": "fill(address[5],uint256[6],uint256,bool,uint8,bytes32,bytes32)", +"90a08e70": "balanceOfUnclaimedGoo(address)", +"90a0a2ab": "GetPriceOfTroops(uint256,uint256,uint256)", +"90a1d580": "TSTEST2()", +"90a2005b": "transfer(bytes32[])", +"90a251da": "createNewTankWeapon()", +"90a25f28": "WeBetCrypto()", +"90a2e1ef": "emergencyReserve()", +"90a3d87e": "addLanguage(string)", +"90a4d287": "bovBatchDistributed()", +"90a53085": "votesCountByOperation(bytes32)", +"90a59ea1": "BasicAccountInfo(uint8)", +"90a5c7af": "Lesson_1(address,uint256)", +"90a6267a": "canRescue(address)", +"90a650e8": "UpgradeAgent(address)", +"90a70139": "pauseTransfer()", +"90a72a3f": "FundingCapSet(uint256)", +"90a744fe": "BossCoin()", +"90a7ba5b": "ticketsPurchased()", +"90a85119": "checkBetResult(uint8)", +"90a897c6": "frozenAddress(address)", +"90a971a8": "setPI_edit_27(string)", +"90a9cc02": "namiPresale()", +"90aa2185": "dailyCount()", +"90aa835c": "IsAuthorityAddress(address)", +"90ab54dc": "configureMigrate(bool,address)", +"90ab7d34": "deployRuntimeContract()", +"90abcb08": "TronyCurrencyContract(uint256,uint256)", +"90ac11a3": "designs(uint256)", +"90ac1866": "setMinGasPrice(uint256)", +"90ac3f4c": "_getTokenAmount(uint256,address)", +"90ac7588": "profitsLockedUntil()", +"90acc740": "transferCompanyTokens(address,uint256)", +"90ad304f": "ContractOwnershipTransferred(address)", +"90addc9a": "calculateMyRewardMax(address)", +"90ae144e": "swap_able()", +"90ae631d": "assignAll()", +"90ae6863": "gyCF()", +"90af1333": "allBoxNumbers()", +"90afca4c": "addPhases(uint256,uint256,bool,uint256,bool)", +"90b0636f": "rapidGrowthProtectionmMaxInvestmentAtNow()", +"90b06593": "landClaim()", +"90b08a52": "getSendAmount()", +"90b0e078": "discountTime()", +"90b17f99": "directPaymentThreshold()", +"90b22d03": "set_parameters(uint256,uint256,uint256)", +"90b25207": "GoogleChainToken(address)", +"90b26043": "NameRegistered(address,uint256,string,uint256)", +"90b2ae49": "verifyDeployment(address,bytes32)", +"90b2ce6f": "mvnpereth()", +"90b30251": "is_finalized()", +"90b3195f": "SHAREPERIOD()", +"90b398ff": "SetFreeGWT(uint256)", +"90b3d963": "trade(uint64,uint64)", +"90b4cc05": "mintAdvisorTokens()", +"90b4cc72": "numTransactions()", +"90b5561d": "insert(uint256)", +"90b5e6d9": "presaleFinished()", +"90b625f9": "stockSellOrder(uint256,uint256,uint256)", +"90b67185": "setPrivilegeState(bool)", +"90b6b209": "bonuses()", +"90b6f7e6": "RashidToken()", +"90b7ddd7": "t02_createContractMac(bytes32,bytes32)", +"90b7df75": "addAuthByPhone(string,string)", +"90b98a11": "sendCoin(address,uint256)", +"90b9be4a": "RetailerManager(address)", +"90b9c31a": "purchaseFinished()", +"90ba0e6c": "getNumOfBettersForMatchAndPrice(uint256,uint256)", +"90ba34cc": "refundClaimAddress()", +"90baaa5c": "checkPoolEnd(uint256)", +"90bb5ad0": "Eth2USD(uint256)", +"90bb6153": "withdrawTokenBalance(address)", +"90bb807e": "getVolumeDiscountsCount()", +"90bc1693": "burn(uint128)", +"90bd301e": "_validCharm(string)", +"90bdb275": "costOfTxShares()", +"90bde517": "getUser(address,address)", +"90be0bd9": "enableAuthentication()", +"90bee6aa": "getTransformRate(address,uint256,uint256)", +"90bf0301": "changemp(address)", +"90bf348f": "crowdSaleMinAmount()", +"90bf495d": "tokensReleasedToEarlyInvestor()", +"90bf693b": "logoFee()", +"90bf87a3": "setRestriction(address,uint256)", +"90c1288e": "setAddressF1(address)", +"90c2365e": "_addWeiAmount(uint256)", +"90c26736": "countRecommendFund(uint256)", +"90c32295": "bountySent()", +"90c3a370": "AuctionMaster()", +"90c3f38f": "setDescription(string)", +"90c40776": "donotIronDappToken()", +"90c459a3": "lnLimited(int256,int256)", +"90c46985": "calculate_difficulty_attempt(uint256,uint256,uint256)", +"90c4ce57": "getReportingWindow(uint256)", +"90c6087b": "_getName(string,uint256)", +"90c6b18a": "CreationTime()", +"90c6d1b9": "SetFreeTokens(uint256)", +"90c79af9": "startAcceptingFundsBlock()", +"90c8a72d": "sendOwnerShares(address)", +"90c8abd3": "CreateCaptainToken(address,uint256,uint32,uint32,uint32,uint32,uint32,uint32)", +"90c985a1": "buyCertificate(uint256)", +"90c98a7b": "resolveRankBoard()", +"90c9d6f8": "BankerExit(uint8)", +"90ca20e5": "init_wallet(address[],uint256,uint256)", +"90ca27f3": "vote(string,uint8)", +"90ca38d9": "setAdvisorsTokens(uint256)", +"90ca9dbf": "getGradeByQuailty(uint16)", +"90caa2b4": "getFreezeUntilDetails()", +"90cad537": "poolMintRate()", +"90cb04e1": "buy(string,uint256,uint16)", +"90cb4854": "createTokens(address,uint256,uint256)", +"90cbcf92": "getFibonacci(uint256)", +"90cbfa19": "abort(address)", +"90ccdafb": "increaseArrayOfBeneficiariesBalances(address[],uint256[])", +"90cd0d06": "registerApproveRequest(bytes32,bytes)", +"90cd5860": "VehicleRTO(address)", +"90cd6170": "getActiveSkin(address)", +"90cd8020": "licenseTermsMinCostPerSec(bytes32,bytes32)", +"90cddcc5": "getEpisodeDetail(uint256)", +"90ce9e5b": "getPreIcoInvestorsAddressesCount()", +"90cf3fed": "AKAIITO()", +"90cf581c": "voteYes()", +"90cf72de": "_getCommonPlusRarity(uint32)", +"90cf76fa": "bundleOfOwner(address)", +"90cf7ab4": "existsUser(uint256)", +"90cfce5a": "setgetgoods(uint256)", +"90d16b30": "resolveDisputeBuyer(address,string)", +"90d19241": "_removeAddress(address)", +"90d1c593": "Summary(address,address[],address[],address[],uint128[])", +"90d22eeb": "setIcosMinLimit(uint256,uint256)", +"90d240c6": "get_data(uint256,uint256)", +"90d28075": "getBasketArranger(address)", +"90d2cd5c": "getCurrentUserBigPromoBonus()", +"90d2f727": "signedApproveAndCallCheck(address,address,address,uint256,bytes,uint256,uint256,bytes,address)", +"90d370ba": "canReceive(address)", +"90d49b9d": "setFeeWallet(address)", +"90d4bcc0": "inject()", +"90d4bd45": "wetCoin()", +"90d58a70": "tgrCurrentPartContributor()", +"90d61290": "traded(address,uint256)", +"90d63e5d": "addAuthor(bytes)", +"90d68bb6": "getCallTypes(uint256)", +"90d6b45f": "kyc()", +"90d783bb": "BEEFJERKY(address)", +"90d83301": "SPAM()", +"90d8a4be": "badge(bytes)", +"90da7c3c": "isGeneMixer()", +"90daaf67": "getMinimalDeposit()", +"90db2aa9": "SellOrder(uint256,address,uint256,uint256,uint256,uint256)", +"90db623f": "increaseApprovalAndCall(address,uint256,bytes)", +"90db78f9": "crowdsaleInfo()", +"90dbf4fc": "getRequestBaseInfo(uint256)", +"90dc0636": "GetHoldersCount()", +"90dcba22": "addressPeople()", +"90dd027e": "migrateFrom(address,uint256,uint256,uint256,bool)", +"90dd2395": "listPrycto6()", +"90dd9d17": "perSaleWithDrawal()", +"90de4495": "dive5(address)", +"90de8234": "adminMode()", +"90de9ed9": "TOKEN_SALE_CAP()", +"90df44b4": "addDocument(string,string,string,string,uint256,uint256)", +"90dfb092": "privatePresale()", +"90e10134": "burnAdminApproval()", +"90e10250": "setCreated()", +"90e1de68": "allowedForwards()", +"90e2160a": "setMaxUpdates(uint256)", +"90e2b94b": "t0special()", +"90e2d4cc": "refreshLockUpStatus()", +"90e33e9c": "totalDDTforInterest()", +"90e3c278": "getShares(uint256[128])", +"90e47957": "erc165InterfaceSupported(address,bytes4)", +"90e4a130": "getMyDonations()", +"90e50ba7": "registerAltPurchase(address,string,string,uint256)", +"90e517e7": "logoY()", +"90e575f5": "auctionEnds(string)", +"90e57cac": "confirmProposalAndTransferFunds(uint16,uint16)", +"90e5e12a": "existenceTransferTest(address)", +"90e64d13": "hasExpired()", +"90e72127": "closeOrder(address)", +"90e761cd": "recoverAddressFromSignature(uint64,uint256,bytes32,bytes32,bytes)", +"90e7760e": "makeLive()", +"90e7a074": "codexStakeContract()", +"90e8265d": "tierDuration(uint256)", +"90e8317c": "rateWorkerSkills(uint256,address,uint256,uint256,uint256[],uint8[])", +"90e8edd8": "JincorTokenPreSale(uint256,uint256,address,address,uint256,uint256,uint256,uint256,uint256)", +"90e8f758": "liveEtherSportCampaign()", +"90e99b09": "finishRestore()", +"90ea0fb8": "isSignedByEugene()", +"90eb9632": "PROMETHEUS_PRICE_INCREMENT()", +"90ebed43": "getNumberOfCourses()", +"90ec028d": "LogPollCreated(bytes32)", +"90ec57f1": "Approve(address,uint256)", +"90ed6bf4": "startWithdraw()", +"90ee2ec2": "FCCPlaceHolder(address,address,address)", +"90ee4331": "getStartClaimDate()", +"90eed0ce": "SetCert(uint32,bytes32)", +"90eede26": "COMM_ADDR()", +"90ef08a1": "getdrawtoken(address)", +"90f08b32": "contract2Address()", +"90f098bb": "setFeeTake(uint256)", +"90f0a5bd": "BecomeTadpolePrince()", +"90f0dbd5": "CRSAllocation()", +"90f0f4f4": "ReserveFundAmount()", +"90f0fef0": "test2ContractVote()", +"90f1d909": "Ixellion()", +"90f25eb3": "getPercentages()", +"90f2c86d": "convertToWei(uint256,string)", +"90f2dc88": "getObjClassId(uint64)", +"90f3b693": "initialIssueMinted()", +"90f3deb1": "getTeamUnlockAmountHelper(uint256)", +"90f4c33a": "transferSaleWallet(address)", +"90f4d2fd": "checkMaxCapReached()", +"90f50cd9": "setPromo(address[],uint8[])", +"90f52ade": "LOTT()", +"90f549ba": "getLockCountForAddress(address)", +"90f551ec": "offerBtcFromApp(address,uint256)", +"90f5c2ca": "canRef(address,address,uint256)", +"90f5f99d": "DHUBTest()", +"90f6b2b3": "getInvestorByValue(address,address)", +"90f81702": "BaseToken()", +"90f8c118": "hyip()", +"90fa17bb": "constructor()", +"90fa337d": "storeBlockWithFeeAndRecipient(bytes,int256,int256)", +"90fa775e": "_calculateInflationBonus(uint256,uint256,uint256)", +"90fa8910": "GetBasePrice(uint256,uint256)", +"90faa3e9": "setPrice(string,uint64,uint8)", +"90fab7ce": "just50Send()", +"90fad1e6": "remove_from_whitelist(address)", +"90faeb62": "DolarToday()", +"90fbf84e": "trustedFeeWindowTransfer(address,address,uint256)", +"90fc2a32": "CaptainGameConfig()", +"90fcf551": "getTRIOs()", +"90fd4300": "releaseState4()", +"90fd53ec": "farmTile(uint8,uint8,int8)", +"90fd5452": "blockState()", +"90fd67fc": "setDepositAddressVerify()", +"90fdf36b": "_vouchersToWei(uint256)", +"90fe5609": "startVoting(uint256,uint256)", +"91006745": "isAdmin(address,address)", +"91014fcc": "_updateWhitelist(address,uint8)", +"91019db2": "getSellerTransaction(address)", +"9102bcc8": "Teacher(address)", +"91030cb6": "lockPercent()", +"9103321d": "TOTAL_TOKENS_AVAILABLE()", +"91039c83": "updateEndTimeManually(uint256,uint256)", +"9103cfb6": "TheophanesToken()", +"9103e368": "winnerTimestamp()", +"9104b6f4": "getPendingWalletFeeData()", +"9104c316": "internalBurn(uint8,address,uint256)", +"9104dbd2": "_createCompany(string,address,uint256)", +"91051e06": "poolWithdraw()", +"910545ff": "TOKEN_PRESALE()", +"91057f53": "ERC20TokenCPN()", +"91060168": "fetchString(address,bytes4,bytes32)", +"9106d7ba": "totalSold()", +"910887bc": "setPublisherCut(address,uint256)", +"91093ba4": "setUintF1F2(uint256,uint256)", +"910cbda6": "buyTokensFor(address,address)", +"910d52ea": "getPaperFee()", +"910eba1d": "buyBonds(address)", +"910f3b52": "bidFromEtherScrolls(uint256,address)", +"910f5b81": "preIcoStartTime()", +"91104f82": "bountyTokenAmount()", +"911058df": "setMockedNow(uint256)", +"91125fb7": "thirdWeekBonus()", +"91127c1f": "_clearApproval(address,uint256)", +"91136d3f": "Settlement(uint8,bool)", +"911402f1": "masterServer()", +"9114557e": "vestedBalance(address)", +"911463d2": "setPOOL_edit_27(string)", +"911475cc": "incNonce()", +"91147dfa": "restoreContract()", +"91149e85": "resetOfferingStatus()", +"91152c5c": "airdropTokens()", +"911550f4": "getBetterOffer(uint256)", +"9115abf4": "getDetails(uint256,address)", +"9115ca43": "getPayerString()", +"9115e9ee": "ExtractEtherLeftOnContract(address)", +"911644fa": "maxIceDragonsCount()", +"9116ee03": "testHasCorrectPriceForStages()", +"91174790": "addEvidence(bytes32,uint256,bytes32)", +"91174cb6": "roundnum()", +"91176f39": "presaleUnlimitedStartBlock()", +"91177db4": "batchTransferFrom(uint256[],address,address)", +"9117c6df": "balanceOfReadable(address)", +"9117e32e": "expireOf(address)", +"91184159": "getOptionHash(address[3],uint256[3],uint256[2],bool)", +"9118575a": "setTokenSale(address,address,uint256)", +"91194aab": "tixFoundersDeposit()", +"9119e5fb": "submitTransactionWithSignatures(address,uint256,bytes,uint256,uint8[],bytes32[])", +"911a40c9": "ARPToken()", +"911a56bc": "totalSupplyWithZeroAddress()", +"911a739e": "winnerLimit()", +"911a9ac0": "preSeasonGame()", +"911adc1a": "pay(address,uint256,bytes)", +"911b5f4e": "sub(uint64,uint64)", +"911cec25": "getMountTokenIds(address,uint256,address)", +"911d0189": "minJackpot()", +"911d3101": "escapeFreeze(uint256)", +"911d731a": "DWBTToken(uint256,uint256,uint256,uint256)", +"911d84cb": "updatePlayerRecommend(address,address)", +"911eb255": "approvePromise(address)", +"911ef2e9": "Voted(uint256,bool,address,uint256)", +"911ef508": "pausedTimestamp()", +"911fa5c9": "totalTokenSellAmount()", +"911ff22b": "EthereumRateUpdated(uint256,uint256)", +"911ffbdb": "lastRewards(address)", +"91214841": "usdraised()", +"912221d5": "tokenCost()", +"9122acd8": "KUYCToken()", +"912308dc": "withdrawToInvestor()", +"91240f44": "getReferee(address)", +"9124f1cf": "getOrderHash()", +"912525f4": "WideEnergy()", +"91256ed0": "freezeMustCalculate(uint256)", +"9125ecf1": "bountyVaultAddr()", +"9127bc2a": "FOUNDERS_TOKENS_LOCK_PERIOD()", +"9127d3d7": "EXPECTED_TOTAL_SUPPLY()", +"9127da7e": "RRcoinToken()", +"912875bc": "ICO_PRICE6()", +"91287962": "artworkRegister(address)", +"9128bbc6": "Tanaka()", +"91294ed1": "minContributionWei()", +"912bcb79": "betGame(uint256,uint8)", +"912c3fbf": "EYToken()", +"912c8b75": "claimGold(uint64,uint64,uint64,uint64)", +"912d6e28": "approveTokens(address,address,uint256)", +"912de8de": "fixBalance()", +"912eb6d9": "amountOfUBOsold()", +"912ee23d": "SaleStarted()", +"912f6ba4": "getAtheniansOnTheBattlefield(address)", +"912f6c71": "IssueIQTToken()", +"912f952f": "Ulti()", +"912ff8f6": "getServerState(uint256)", +"91301852": "CyberClassicToken()", +"91304f1f": "isKYCRequired()", +"913093aa": "initialSupply(address)", +"913158f7": "getIsland(uint256)", +"91318874": "setRates(uint32,uint32)", +"9131d803": "testSetFrontend()", +"91324514": "InfiCoin()", +"91324bea": "EscrowContract(address,address,uint256)", +"91329493": "charityCount()", +"9132b81d": "VotingStarted(address,uint256,uint256)", +"9132c26c": "calcSELLoffer(uint256)", +"9132dfca": "CATA()", +"913579b6": "updateWhiteListImplementation(bool)", +"913594ae": "JETUSA()", +"9135ac08": "addInInitialSupply(uint256)", +"91361f64": "getRankPriceCandy(uint256)", +"913683fc": "IODTOKEN()", +"9136d392": "KothWin(uint256,uint256,address,uint256,uint256,uint256,uint256,uint256)", +"91373711": "stopFlagOff()", +"9137471b": "setGoldBought(uint256)", +"91375e8d": "getGameEndTime()", +"91378400": "POSAddress()", +"91378456": "publicTGEEndBlockTimeStamp()", +"9137b6e6": "addAction(uint256,string,string,uint256,bytes32,uint256)", +"9137c1a7": "setStorage(address)", +"9137d10a": "refreshDirectSellParameter(uint256)", +"9137f9b1": "viewSecondLotOfClauses()", +"9138f38b": "claimTokensERC20(address,address,address,uint256,uint256,uint8,bytes32,bytes32)", +"913918a6": "changeSaleInfo(uint256,uint256,uint256,uint8,uint256)", +"913967d0": "getNextFeePercentage()", +"91398f25": "getTransferringFor(address)", +"913b1ecc": "setGroupWinner(uint256,uint256[])", +"913b2958": "appealRuling(uint256,uint256)", +"913cc77f": "setEthValueAmount(uint256)", +"913cf5ca": "eos()", +"913d23e2": "distributeMnyAfterSwap(address,uint256)", +"913d30b0": "LIDToken()", +"913d6906": "VotingToken(string,string,uint256,string,string,string,address,address,address,address)", +"913dd846": "PRESOLD_ADDRESS()", +"913e0887": "FundingRulesSet(address,uint256,uint256,uint256)", +"913e77ad": "collector()", +"913f424c": "_ecMul(uint256,uint256,uint256,uint256)", +"913f4766": "Refound(address,uint256)", +"913fb60b": "colorLeaderboard()", +"913fbd04": "aidPoolWallet()", +"913fc67a": "bidoohAdminAddress()", +"91404af8": "updateTokenRatio(uint256,uint256)", +"91407479": "Eth2USD_power18(uint256)", +"9140a101": "checkRegistrar()", +"9140a499": "updatePublicCheck()", +"9140f6ee": "releaseRestPreSaleTokens()", +"9140f968": "newInvestment()", +"91410c97": "stake_reward_rate()", +"91410e41": "getMyRecordCount(address)", +"91415ce9": "TRANSFERMANAGER_KEY()", +"9141bfae": "LogReveal(uint256,address,uint256)", +"9141d6f9": "unset(bytes32)", +"91421cf6": "ECRCTOKEN()", +"91423ef2": "getClientLastSupplyID(address)", +"91432155": "setBaseInterest(uint256)", +"91436eee": "issueLeftToken()", +"91441589": "run(bytes,uint8[4],uint8[2][4])", +"91449def": "_owns(address,uint256,bool)", +"9144f267": "ALBtoken()", +"91458ee8": "GameCreated(bytes32,string,string,uint16,uint64)", +"9145a7fd": "CrowdsaleEnded(uint256)", +"9147dd1b": "pricePresale()", +"9148018a": "getChatMessageAtIndex(uint256)", +"914810a3": "claimRepository()", +"91481123": "contestOverTime()", +"9148148b": "migrate_game_balance()", +"9148b237": "takeAllOrRevert(address[3][],uint256[3][],uint256[],uint8[],bytes32[],bytes32[],bytes4)", +"91492956": "getPrices(uint256)", +"914946aa": "getSignerAddresses()", +"914980d4": "setBonus(address,uint256,bool)", +"91499e2d": "disableService(uint256)", +"914a1e76": "getWinRate(address)", +"914a5b24": "popPlayer()", +"914ae352": "getCurrentNumberOfUsedServiceTokenWei()", +"914b7fd2": "calculateSellGoldFee(uint256,uint256)", +"914b857e": "unlockEscrow(bytes32)", +"914bdef8": "_transferWithData(address,address,address,uint256,bytes,bytes,bool)", +"914d581d": "fiatRaisedConvertedToWei()", +"914dde1c": "isProposed(address)", +"914de6d6": "MarketingAllocation(address,uint256)", +"914e1ee1": "resetSearchStartIndex()", +"914f716d": "BalanceHolder(address)", +"914ff398": "batchFill(address[5][],uint256[6][],uint256[],bool,uint8[],bytes32[],bytes32[])", +"915009a7": "getPaperFromMeta(uint256,uint256)", +"915015c5": "setColorBlack()", +"91508264": "getNextPrice(uint256,uint256)", +"9151c7e4": "GrandFraternityChain(uint256,string,string)", +"9151e092": "RisuToken(address)", +"9152486c": "currentInitPart()", +"9152f0b2": "getLastRequestId(uint256)", +"9152f764": "WorldCup(string,string,uint256,uint256,string,uint256)", +"9153d09a": "stringFloatToUnsigned(string)", +"915489f6": "futureTokens()", +"91548ccf": "ticket_address_added(address)", +"91555559": "getNumWeiAddressMayInvest(address)", +"9155b01a": "setSelfClaim(bytes32,bytes32)", +"9155cc2c": "HitToken(string,string,uint8,uint256,uint8,uint8,address,address)", +"91565aba": "updateUsableBalanceOf(address)", +"9156a003": "totalTokensIssued()", +"9156fb60": "addressERC20Token()", +"9157e556": "isQualitifiedAddress(address)", +"915a405f": "updateTransferMinimumFee(address,uint8)", +"915b5bfc": "NeoWorldCash()", +"915cfeac": "getTransferAgentStatus(address,bytes32,address)", +"915d44f6": "setRFFSessionsAdd(address)", +"915db230": "marketBuyOrdersNoThrow(uint256,bytes[])", +"915e1044": "strFunc(string)", +"915e5d44": "apply_compensation()", +"915ed87e": "LiveStarsTokenPresale(uint256,address,address,uint256,uint256,uint256,uint256,uint256)", +"915f3209": "changeMaximumValueDuringGuaranteedPeriod(uint256)", +"9160342e": "Sale(address)", +"91603691": "HDTTokenTest()", +"91607530": "RaisedByPartner(address,uint256,uint256,uint256)", +"9160aabc": "getPendingBetCount()", +"91613e4b": "FTC()", +"9161f789": "getRoundFunds()", +"9162a905": "GDCNumber5()", +"9162ab43": "MiningStolenPayout(address,address,uint256,uint256)", +"9163f897": "block6()", +"91647938": "saveMatchJoinAddr(uint256,address)", +"9165543a": "deleteUser(uint256,address)", +"91656aa9": "changelp11(address)", +"916576c8": "fundForSale()", +"91658639": "ChampionSimple(uint256,uint256)", +"916635c6": "log_mint(address,uint256)", +"91667aef": "getTokensPurchased()", +"9166a449": "totalTokenSaleCap()", +"9166b10a": "IcoAbandoned(string)", +"9166cba4": "sai()", +"9167c5ad": "removeClientToken(uint256)", +"91684f8d": "MMR(address)", +"916891aa": "allocateReserveAndFounderTokens()", +"916a2b29": "_removeHorseFromStud(uint256)", +"916a476e": "save3(address,bytes,string)", +"916a4b57": "addPet(uint256,uint256,uint256,uint256,uint256,uint256)", +"916b5cfa": "TIMEstartICO()", +"916be4fe": "HELP4HUMANITY()", +"916c99fd": "getCampaignEndPointById(bytes32)", +"916dbc17": "getPlayersFromCompetition(string,uint8)", +"916dbc9e": "Coin786token18()", +"916df92a": "Round()", +"916dfea2": "getPersonalBonus(address)", +"916e5901": "teamTokensLock()", +"916e93f8": "ecrecoverFromVRS(bytes32,uint8,bytes32,bytes32)", +"916eb6eb": "SetRoundResult(uint8,uint8,uint8,uint8,uint8)", +"916f5de1": "_emitJobOfferAccepted(uint256,address)", +"916f7c23": "setSelled(uint256,bool)", +"91702ddc": "highCompose(uint256,uint256,uint256)", +"91704e1e": "getBid(bytes32)", +"917105d4": "_takeOwnershipOfToken(uint256)", +"917116f2": "NewSellPrice(uint256)", +"917180c7": "setColdWallet1SplitPercentage(uint256)", +"91735092": "assignToEarlyBirds(address[],uint256)", +"9173a610": "createGame(string,uint256,bytes32[])", +"917418c1": "setMinRoundSize(uint256)", +"917569a8": "weiPresaleMax()", +"917603e5": "getNumberOfMyGamesCompleted(address)", +"917640b5": "getSELabels()", +"91778b9c": "changePrice(uint8,uint256)", +"9178732f": "warriorsOnTheBattlefield(address)", +"917ada14": "testControlCreateShortIdAlreadyExists()", +"917b4f8b": "TQXToken()", +"917d009e": "getAuctionPrice(uint256)", +"917d2be2": "wolkGenesis(uint256,uint256,address)", +"917ec8e2": "removeApp(uint32,string)", +"917f635c": "wct()", +"917fcc5d": "addJobProposal(uint256,string,uint256)", +"917fd839": "buyGEN0Chibi(string,string,uint8,uint256)", +"91814577": "renameStoreTo(bytes32)", +"91816981": "getProfitPercentForData(uint256)", +"91818130": "totalCharityPrize()", +"91828a2e": "extra_bonus_duration()", +"918307fd": "getRemainOfStage(address,uint256)", +"918359c6": "needsBirth()", +"91837535": "getgateway()", +"9183d360": "CreateINDI(address,uint256)", +"9183d8ab": "returnAndRevert(bool)", +"9183fd01": "getSeedPrice()", +"91854684": "pollBallot(uint256,uint256)", +"91858734": "takeControl()", +"9185c694": "_deleteAccount(address)", +"9186485a": "readKYC(address)", +"918657cb": "token_information()", +"91872a91": "isEmpty(string,string)", +"9187300e": "getTokensForSale(bool)", +"91876e57": "withdrawAuctionBalances()", +"91878995": "MYCOIN()", +"9188451b": "transferUserGrowthPoolTokens(address,uint256)", +"91885e1d": "nextWeaponID()", +"918898a5": "frozenRules(address,uint256)", +"9188d312": "getCard(uint256)", +"9189a59e": "sweeper()", +"9189edd2": "Zinoder()", +"9189fec1": "guess(uint256)", +"918a15cf": "toEthSignedMessageHash(bytes32)", +"918a2e0c": "AccessoryCollection(uint256)", +"918b8326": "startSto()", +"918c00c6": "LogCommit(uint256,address,bytes32)", +"918c783a": "hasPurchased()", +"918ca01d": "BurnConfirmed(uint256,address,uint256)", +"918d407d": "acceptOffer(uint256,address)", +"918e2c3d": "GetUserExtraData3(address)", +"918f1bb5": "ProjectKudos()", +"918f49ec": "NDCOIN()", +"918f5f74": "setMinBonusTrigger(uint256)", +"918f644e": "getScriptsCount()", +"918f8674": "DENOMINATOR()", +"91914b30": "setTokenUrl(address,string)", +"91915ef8": "setCapacity(uint256)", +"91916a5e": "Test(uint256,uint256)", +"9191b520": "PlatinumToken(uint256,string,uint8,string)", +"919203a0": "moveTokensFromStockToSale(uint256)", +"91923d7f": "delSuperInvestor(address)", +"9192f48e": "setLocked(address)", +"9193b2e3": "request(address,uint256,uint256,address)", +"9193ba0b": "createForwarder(address)", +"91959fe3": "getCalFactor(uint32)", +"91962739": "setWhiteListOwner(address)", +"9196bdd5": "ggc(address)", +"9196e481": "getAllSteps()", +"91970cba": "saftInvestorAllocation()", +"919747fb": "depositFunds(address)", +"91975e22": "ManagerDisabledEvent(address)", +"91977c56": "setDTR(address)", +"9197b7cd": "earlyWithdrawal()", +"919823df": "getHashExists(string)", +"919840ad": "check()", +"91988783": "IMDEXdepositToken(address,uint256)", +"9198e08c": "Linfinity()", +"919987bc": "rewardPool_()", +"9199a8bb": "dnnHoldingMultisig()", +"919a41dd": "endFight(uint256,uint256)", +"919aa4fa": "ZIGICOIN()", +"919acf1e": "getperiodlasttime(address,address)", +"919b30cf": "FTXToken()", +"919baade": "ProposalsEntity()", +"919be880": "createEscrow(bytes16,address,address,uint256)", +"919beeb1": "calculateRate()", +"919bf699": "EggsPurchased(address,uint256,uint32)", +"919c9d4a": "getAfterIcoPeriod(uint256)", +"919ca82d": "EtherprisesLLC()", +"919d3401": "MAXIMUM_ICO_TOKENS()", +"919d8bb2": "TokenTrader(address,address,address,uint256,uint256,uint256,uint256,bool,bool)", +"919e144c": "predict(uint16,uint8)", +"919e1967": "Ubiq()", +"919e7f42": "supportNewMoon(address)", +"919edc7c": "getChainySender(string)", +"919f31c2": "Ankr()", +"919f8cfc": "makerDepositEther()", +"919f90ca": "sendCommissionToOwner(uint256)", +"91a01414": "getPreviousBlock(uint256,uint256)", +"91a0ac6a": "equity()", +"91a0ba00": "icoRound1()", +"91a1896e": "setReserveForFoundersSecond(address)", +"91a1f16a": "getMaxWin()", +"91a266ac": "totalEthCharityRecieved()", +"91a34006": "getInitializeOutcomeValue()", +"91a3cec0": "receiveEtherFormOwner()", +"91a49300": "purchaseEnable()", +"91a553df": "developer_add_cost_of_transfers(string)", +"91a57544": "affiliatePercentage()", +"91a5b0c7": "bestSum(uint8[])", +"91a67e1e": "tokenFrozenUntilBlock()", +"91a73892": "getOrderStateHelper(uint256,uint256)", +"91a73a27": "cleanSellShareOutput()", +"91a7aa37": "Chain2()", +"91a852f6": "changeTicketFee(uint256)", +"91a89712": "link(address)", +"91a90014": "_updateTokenRates(uint256)", +"91aa94f1": "setPresidenteDeMesaVerify(bytes32,uint256,uint256,bytes32)", +"91aabeb5": "checkArea(uint32[],address)", +"91aac477": "addNacToNetf(uint256)", +"91aadff6": "OPEN_SALE_STAKE()", +"91aaf2e9": "presaleTokenAmount(address)", +"91ab0ca0": "authorisedContract()", +"91ac2c3f": "testCreateElection()", +"91ac46f5": "centRaised()", +"91ac7e65": "indexOf(uint256)", +"91ac96a9": "pendingWinners(uint256)", +"91acd8fb": "DEJToken()", +"91ad1ada": "VernamPrivatePreSale()", +"91ad27b4": "getInterval()", +"91ad48a1": "DataToSetting(uint8,bool,uint8)", +"91af8d14": "recalculateTopScores(uint256,uint256,uint256)", +"91afc432": "setUpdaterAddress(address)", +"91b1a02a": "SwissCryptoExchange(address,address,address,uint256,uint256,uint256)", +"91b22ebf": "getTokenAmountPerHeritor(address,address)", +"91b23419": "developerFund()", +"91b2413f": "HplusToken()", +"91b25b35": "revokeAndSetNewMember(uint8,bytes32,address)", +"91b2b30e": "LogI(uint256)", +"91b43d13": "fundingEndBlock()", +"91b4a0e7": "Difficulty()", +"91b4ded9": "lastPauseTime()", +"91b56822": "gameTick(uint256)", +"91b584f3": "_insertValidator(address,uint256)", +"91b6a086": "WithdrawToInvestor(address,uint256)", +"91b7ad06": "calculateTokens(address)", +"91b7d3e0": "redeemSurplusERC20(address)", +"91b7f5ed": "setPrice(uint256)", +"91b8a49a": "lastDonor()", +"91b97997": "endFirstWeekICO()", +"91b9b640": "getDApp(string)", +"91ba5d6a": "preICOMany(address[],uint256[])", +"91baabba": "CCLToken()", +"91bb2534": "impl_price()", +"91bb4816": "m_Database()", +"91bbb21a": "trialDeadline()", +"91bbb87b": "GetPurchaseInfo()", +"91bbbe4d": "_payoutTaxes(uint256)", +"91bbd6f6": "VeiagToken(address)", +"91bbdcc7": "convert()", +"91bc85a9": "SetTrustee(address)", +"91bc8a45": "bonusAdd()", +"91bdc458": "blockNewSpinnerPurchase(uint256)", +"91bdf9da": "isTen(uint8)", +"91be0b31": "setPriceChanger(uint256)", +"91be2f8d": "changeCCCoinAddress(address)", +"91be90c8": "_dust(address)", +"91bf9c50": "test_CampaignRulesFail()", +"91bfeb98": "CrystiumToken()", +"91c03391": "TraToken()", +"91c05b0b": "distribute(uint256)", +"91c11cae": "disputeTransaction(uint256,uint256)", +"91c1e2c1": "burnedBalanceOf(address)", +"91c20375": "setArtEsc(string,string)", +"91c23928": "divSafe(uint256,uint256)", +"91c259ea": "transferby(address,uint256)", +"91c27b2a": "setTransTimes(uint32)", +"91c3352e": "test_invalidEmptyEqVal1()", +"91c3e5ee": "rb(address)", +"91c3e7f8": "showlvzhou(address)", +"91c4529f": "isBlacklistSpender(address)", +"91c49026": "rebalanceEnclaves(address,uint256)", +"91c4c78f": "fund(address,uint160)", +"91c62a5a": "LogBounty(address,uint128,string)", +"91c71e2b": "disableLock(bool)", +"91c72d88": "holdSubscriptionOffer(uint256)", +"91c79a9a": "CON0217()", +"91c827a0": "AddOwnerAddress(address,address)", +"91c873cb": "getAdminContract(address,uint256)", +"91c8e336": "exchangeSupply()", +"91cadaf6": "evolvePrice()", +"91cb4316": "endOf24H()", +"91cb98af": "getPendingAmount(uint256)", +"91cca3db": "dev()", +"91cd242d": "setMeta(bytes32,bytes32,bytes32)", +"91cd450c": "AlienFarm()", +"91cd7e9a": "ChannelDeleted(address,address,address)", +"91cdecab": "TOTAL_DINOTOKEN_SUPPLY()", +"91ce8ca9": "IQTCrowdsale()", +"91ce8e04": "setTwo(uint256)", +"91cee1fd": "baseStats(uint256,uint256)", +"91cef6a8": "payAffiliate()", +"91cf2164": "transferFunction(address,address,uint256)", +"91cf7aca": "upgradeFrom(address,address)", +"91cfb7b6": "ceilings(uint256)", +"91d0b3fd": "_mine(address,uint256)", +"91d0dd17": "accrueCouponsPerXTokenETH()", +"91d15735": "left11(uint256)", +"91d15a91": "weiRaisedIco()", +"91d1addb": "plutocracylvlAchieved(string,string)", +"91d23a1a": "lastRewards()", +"91d2939d": "per(uint256,uint256)", +"91d4357b": "myBonus()", +"91d43b23": "right76(uint256)", +"91d462d9": "hashUnderlyingPrices(uint32,int256[])", +"91d558b7": "startCrowdsaleY0(address)", +"91d55c41": "RuiXueToken()", +"91d5d7d6": "out1Done()", +"91d6212a": "address5a()", +"91d625e5": "setupCore(string,string,address,uint256)", +"91d6367b": "reserveForTeam(address,uint256,uint256)", +"91d739ea": "updateRegistratorStatus(address,bool)", +"91d76bbb": "getTotalMigrated()", +"91d781ba": "kkTestICO1()", +"91d80948": "_checkAndCallTransfer(address,address,uint256,bytes)", +"91d8b14e": "BuyTickets()", +"91d91df3": "FesBerto()", +"91d96541": "refundedSat(address)", +"91da7aa8": "transferAndCall(address,uint256,uint256[])", +"91da9178": "WALLET_LB_ADMIN()", +"91db7b0d": "updateLockPeriod(uint256)", +"91dbd4c3": "payTournamentWinner(uint256)", +"91dc077b": "submitApplication(string,string,string,string,string,string,string,string)", +"91dc11fe": "setClaimParameters(uint256,uint256)", +"91dc1b1d": "mintCUSD(address,uint256)", +"91dc6d36": "pauseForDividend()", +"91dc956d": "addLog(string)", +"91ddadf4": "clock()", +"91de4f88": "claimCoreTeamsTokens(address)", +"91de5474": "getPurchaserCount()", +"91ded8fa": "getTokenByAddress(address)", +"91df0c08": "addReserve()", +"91df9562": "BSPToken()", +"91dfa960": "report(uint16,uint16)", +"91dfe428": "addFees(uint256,uint256)", +"91e05922": "contractICO()", +"91e078bb": "startAuction(uint256,uint256,uint256)", +"91e0a5a0": "checkHolderStep(address)", +"91e0b6c0": "ProofPublicVote()", +"91e0e39c": "resetDragonBalance(address,uint256)", +"91e1397d": "rcnFund()", +"91e145ef": "f(string)", +"91e192b7": "MintedToken(address,address,uint256)", +"91e1cc5a": "freezeAccount(address,uint256,uint256,uint256,uint256,uint256)", +"91e22c90": "interfacesSupported(address,bytes4[])", +"91e23a4d": "updateInterCryptonode(bytes32)", +"91e2f2c5": "HoQuToken(uint256)", +"91e30ec3": "buyDataRecord(uint256,uint256,uint256,uint256,uint256,uint256)", +"91e3387b": "numBrews()", +"91e50314": "isActivityCore()", +"91e52b91": "buySecond()", +"91e569c3": "recordBook(address)", +"91e59bcf": "testSetName()", +"91e6d028": "getFIRST_STEP_LIMIT()", +"91e6f274": "FirstUserDestroy()", +"91e7137d": "price2ndWeek(uint256)", +"91e732b6": "setInvestRestriction(uint256,uint8,bool)", +"91e79c72": "hodlerTotalValue()", +"91e7f7bc": "claimVotingRight()", +"91e8609f": "getParentId(bytes32,uint256)", +"91e863ca": "setBigPromoInterval(uint128)", +"91e88106": "abiLength(address[])", +"91e8d3dc": "testBitOrFailIndexOOB()", +"91e8fc34": "createPipe(uint256,uint256,bytes32)", +"91e9f106": "historyWinner(uint256)", +"91ea294e": "LogSetWithdrawer(address)", +"91ea4d07": "snatchedOn()", +"91ea59eb": "buyGuaranteed(address)", +"91ea8a05": "add(bytes32,bytes32,uint256)", +"91eb97ea": "pharmatrix(uint256)", +"91ebc861": "noFeeTransfer(address,uint256)", +"91ec1623": "_shutDown()", +"91ec845e": "isAtMost(int256,int256,string)", +"91ec910e": "OwnableImpl()", +"91ecda3c": "Menu10(address)", +"91ed6851": "createPromoCompany(address,string,uint256)", +"91ede45f": "Deposited(address,uint256,uint256,uint256)", +"91ee7bbf": "dispute(bool)", +"91ef14b4": "setApprove(address,address,uint256)", +"91f02379": "hundredKInvestor()", +"91f02f9c": "DelayChanged(uint256)", +"91f09f7c": "redeemPowerTokenBal()", +"91f11a9c": "lastWinNumber()", +"91f1cf05": "crafting()", +"91f1f310": "totalOffers(uint256)", +"91f2700a": "drop(address)", +"91f2ebb8": "heir()", +"91f34dbd": "transfer(uint256,address[],uint256[],uint256[3],bytes,bytes,bytes)", +"91f39f10": "getContactAddressByIndex(uint256)", +"91f3c4a2": "GSY(uint256,string,string)", +"91f4b7ff": "soulBookPage(uint256)", +"91f5637a": "frozenBalanceCount()", +"91f5c3a8": "donateAndCreateGiver(address,uint64)", +"91f5f3c9": "MAX_TOKEN_GRANTEES()", +"91f6c7e6": "getCurrentICOPhase()", +"91f72ebb": "is128Bit(uint256)", +"91f7cfb9": "availableAmount()", +"91f85480": "updateValidOrg(address,address,bool)", +"91f8668e": "setTokenUri(uint256,string,string,string,uint256)", +"91f90157": "highestBidder()", +"91f9bb85": "setAdvisorVault(address)", +"91f9f4a2": "getRateIncludingBonus()", +"91fa0555": "getParentAddress()", +"91fa196d": "getDesignatedReportReceivedTime()", +"91fa2df4": "addPaid(bytes32,uint256)", +"91fb4583": "reachedMajorityForTeam(uint256)", +"91fb9437": "isStoring()", +"91fc437e": "nameTaken(string)", +"91fc5696": "confirmBusinessOwner(address)", +"91fc7c70": "TreeCoin()", +"91fd1c7d": "getSenderByHash(string)", +"91fdbb55": "releaseUrl(uint8)", +"91fdf6b1": "electActiveTranscoder(uint256,bytes32,uint256)", +"91fe5a64": "_totalBurnedTokens()", +"91fe7bab": "mintTokensWithApproval(address,uint256,address)", +"91fea350": "checkFreezeValue(uint256)", +"91fed1c0": "RaffleResult(uint256,uint256,address,address,address,uint256,bytes32)", +"91feea93": "withdrawBoth(address,uint256,uint256)", +"91ff6baf": "requestsFunded()", +"92008bfa": "setResourcesSecondaryManager(address)", +"9200b04c": "myDeposit(address)", +"9201ac94": "getCON()", +"9201de55": "bytes32ToString(bytes32)", +"92031600": "setBonuses(uint256[],uint256[],uint256[])", +"92039b87": "balanceVested(address)", +"9203cb9e": "forwardWin(address,address,bytes,bytes32,bytes)", +"9204764f": "setHookOperator(address)", +"9204b2bd": "maxVeriAmount()", +"9204c013": "QKCCoin()", +"9205ab3c": "sendRefund()", +"9205dce7": "Usdcoins()", +"9205ec4d": "refundSponsorship(address,uint256,uint256)", +"9205fbc2": "testAuthorityAuth()", +"92066346": "setCastleLootDistributionThreshold(uint256)", +"92069ebd": "_getMarketPrices()", +"920775d4": "subVirus(address,uint256)", +"92093dd6": "getLastResult()", +"92093e7d": "addUserRefBalance(address)", +"92099fdb": "refundableEthBalanceOf(address)", +"9209b3c0": "getCrtDetails(bytes)", +"9209eebe": "SentToContractor(uint256,uint256,address,uint256)", +"920b0280": "noIcoPeriod()", +"920b3a7e": "getFundersCount()", +"920bb680": "ledgerWallet()", +"920c94df": "BuyTicketForOther(address,uint8,uint8,uint8)", +"920dce19": "getAngelCardSeries(uint8)", +"920dd47b": "first_partner_address()", +"920dfe52": "EFARMCoin()", +"920e3c96": "setUserStatus(address,uint8)", +"920e4da9": "created(string,string,address,uint256)", +"920ffa26": "ownerOf(string)", +"9211448f": "finalizeClaim(bytes32,string)", +"921193cf": "changelp3(address)", +"921200ed": "setBonusTokenRateLevelFour(uint256)", +"9212051c": "numJobs()", +"921233b9": "addBuyRequest(bytes32,address)", +"92123470": "mintTo()", +"921237a4": "createPlayer(address,address)", +"92127126": "canTransferByPartition(bytes32,address,uint256,bytes)", +"9212d0c1": "closeBetsIfEventNotSuccess(bytes16,bytes16,uint256,uint256)", +"92140775": "prefixedTest(uint8,bytes32,bytes32,address,address)", +"92140bb9": "getTransactionByTransactionAndEntityId(address,uint256)", +"921456e7": "modifierEx()", +"921496a9": "adminWithdrawTokens(uint256)", +"9214b644": "married()", +"9214e527": "Crowdsale(uint32,uint32,uint256,address)", +"9215b58e": "GoldMineChain(uint256,string,uint8,string)", +"9216728a": "cooWallet()", +"9216b7ad": "winTokenReward()", +"9216cf13": "licenseSalesContractAddress()", +"921710e9": "getShareRewardPercent()", +"9217500c": "setFightAuctionAddress(address,address)", +"9217c438": "getOracleAddress(uint256)", +"921828ac": "commitProposal(string)", +"921b004b": "depositFunds(address,uint256)", +"921b15ae": "LaborHourToken(address,int256,string,uint256)", +"921b2d64": "mintTokens(int256,address,uint256)", +"921b45f7": "checkAndCloseDeposit(uint256)", +"921bd6f0": "upgradeTimestamp()", +"921d72ed": "CreatedAccessory(uint64)", +"921dec21": "registerNameXID(string,uint256,bool)", +"921e1537": "dailyHash()", +"921e7ba6": "withdrawCoins(string,address)", +"921f5dec": "getBlockVoter(uint256,address)", +"921f98bb": "resolveFailVote()", +"921fb890": "buyGood(address,string)", +"92202126": "ETU()", +"92207bd8": "getMyCarsIdxCount(uint256)", +"9220d426": "_nowDateTime()", +"9220d5fa": "DiminishToken(address,address)", +"92223e7a": "BlueRedTokenERC20(uint256,string,string)", +"9223de05": "contributionAmounts(address)", +"922427de": "canSort()", +"922497fc": "regularTokenMaxSales()", +"92250c6a": "localBuy(uint256,address,address)", +"922587ff": "addMintable(address)", +"9226084e": "tier_cap_1()", +"92262375": "transferByDate(address,uint256[],uint256[])", +"922775e3": "createNewTrade(address,uint256,uint256)", +"92277933": "abc()", +"9227bed6": "bucketAmount()", +"922856da": "getPicksForUser(address)", +"9228e90d": "developer_BSR()", +"9229c504": "new_mainPlayer(address)", +"9229e3cd": "submitProof(bytes32,bytes32[],uint256)", +"9229f3c1": "KVLToken()", +"922a8425": "paymode()", +"922b01ca": "walkTokenLots(address,address,uint256,uint256,bool,bool,bool)", +"922b041d": "_getStatsSumHours(uint256)", +"922ba128": "calculateCurrDynamicPrice()", +"922bedf7": "mintNFTsNotForSale(uint256[],bytes32[])", +"922c64ef": "batchDistributeTokens(address[],uint256[])", +"922da521": "RocketPoolPresale(address)", +"922dd59a": "icapTransfer(bytes,address,bytes,uint256)", +"922dd7d9": "generateKey()", +"922f17ce": "emptyEther()", +"922f7124": "changeStrategyAddress(address)", +"922fc84b": "taskProcessedNoCosting(uint256)", +"923020d9": "whitelistMainSaleAddress(address,bool)", +"9231e0f9": "setPresidenteDeMesaVerify(bytes32,uint256,bytes32)", +"923211f5": "showLiveDividends()", +"9232494e": "BANCOR_NETWORK()", +"9232fdb5": "addUserExp(address,uint256)", +"9233c030": "_reward(uint256)", +"9233c1d6": "battle(uint256[],uint256)", +"9233d561": "setUnpaidPercentage(bytes32,uint8)", +"92346ed7": "test1(bytes)", +"92348055": "sellSoul(string,uint256)", +"9234c1fd": "MAX_REVEAL_DURATION_IN_SECONDS()", +"92363a42": "createProduct(uint256,uint256,uint256,uint256,uint256)", +"923689e4": "startRecovery()", +"92369bd5": "calculateAndDecreasePhaseSupply(uint256)", +"9237a125": "seedDeposit()", +"9237e074": "manager(uint256,address,string,uint256,bool)", +"9237e61b": "InvestmentSucceeded(uint256)", +"9239520b": "setQuorumPercent(uint8)", +"923a1abb": "SBCE(uint256)", +"923a2e61": "JinGangCoin()", +"923a367f": "PBToken(address,address)", +"923a4227": "CiceroToken()", +"923a69ae": "getCardRevenue(uint8)", +"923b3e75": "publishContractTemplate(uint256,string,address,string,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"923b9480": "getDatasCount()", +"923b9bae": "EventCreatePet(address,uint256)", +"923ce65f": "draftNewCard()", +"923d566d": "buyKey(uint256,uint256)", +"923db49b": "informOffChainBuy(address[],bytes32[])", +"923de8e2": "checkTransferAndCallDelegated(address,address,uint256,bytes,uint256,uint256,bytes)", +"923e1b84": "sendToEtheroll(uint256,uint256)", +"923e2645": "DonationGuestbook()", +"923f098e": "CLNRefunded(address,address,uint256)", +"923f1788": "convertChest(uint256)", +"923f8455": "BACE_ETH()", +"923f9bae": "testLedgerPayback()", +"923fa0fe": "ChildContract(uint8,address,bytes32)", +"92403b35": "tier2Count()", +"9240551b": "changeCurrentEtherRateInCents(uint256)", +"9240f699": "landmarkSize()", +"92414146": "preIcoWasSuccessful()", +"92414f92": "OpenDate(uint256)", +"92418cf6": "withdrawKncFee(uint256)", +"924320b5": "isMajorityShareholder(address)", +"9243e088": "setEnforceRevisions(bytes20)", +"9244c21e": "preicoUSD()", +"9244f496": "addAddressToWhiteList(address)", +"92450ac9": "setDataColla_AA_01(string,string)", +"9245290d": "changeFeeCollector(address)", +"9246177b": "changeTicketOwner(address)", +"9246ab77": "addWhitelist(address[],address)", +"9246e531": "getSignature(string,int256)", +"924720bd": "pizzaPrice()", +"9247ff59": "getAccountData(uint256)", +"9248019e": "addMonsterIdMapping(address,uint64)", +"924806a0": "returnToken(address)", +"9248d4ec": "getEthNeeded(uint256)", +"92491f21": "subTourFreezingTime()", +"9249993a": "BANCOR_GAS_PRICE_LIMIT()", +"9249bc75": "set_sale_open()", +"9249d865": "getAllLawyers()", +"924b1235": "price1stWeek(uint256)", +"924b39ae": "refundToWallet(address)", +"924b573a": "lastWagerTimeoutTimestamp()", +"924bb1d0": "updateETHPrice(uint256)", +"924c28c1": "ContractInterface(address,address,address)", +"924ca55e": "LindaPresale(uint256,uint256,uint256,uint256,uint256,address,address)", +"924ca61a": "coupon(address,address,uint256)", +"924dd50a": "startSelling(uint8,uint256,uint256,uint128)", +"924dedca": "getEpisodeDataCommand(uint256,uint256,uint256)", +"924e63f6": "setDisputeResolver(address)", +"924f6be0": "CONTEST_INTERVAL()", +"924fdaf6": "drawPorsche()", +"925012f6": "agingTimes(uint256)", +"9250640d": "INIT_TOKENS()", +"925074ca": "getAllPlots()", +"92509c16": "lock_by_manager()", +"9250b080": "picops_user()", +"9250d59f": "setIsSoftCapAchieved()", +"925176d6": "sellRate(uint256,uint256,uint256)", +"92524725": "mintToMany(address[],uint256[])", +"9252e819": "IGCoin()", +"92535862": "custodyCounter()", +"92536070": "RoomManager()", +"925382c0": "setMigrated()", +"92541925": "skynacoin()", +"92549366": "remainingCapInEth()", +"9254c2a8": "changeTotalRemaining(uint256)", +"92550bdd": "applyMigrate(uint256)", +"9256759c": "addressFundAirdrop()", +"9256c71d": "getPriceFeedsByOwner(address)", +"92573a0c": "token_callg()", +"925753d3": "TokenGenerationDisabled()", +"92579f34": "Aracle()", +"92584d80": "finalize(bytes32)", +"92588071": "saveAddress()", +"9258c8f8": "Applicationcoin()", +"9258d5a3": "isIcoRunning()", +"925aa2ad": "purchaseWithEth()", +"925ac216": "isICOOpen()", +"925ad1e7": "collectAllForce(address[],address)", +"925b83a7": "getCobeFriend(uint256)", +"925cbdd1": "createCost(uint256)", +"925cd80d": "contract_start()", +"925d3ec8": "dDowngradeToBasic(bytes32)", +"925f2573": "batchTransferDirectoryToken(uint256,address[],uint256[])", +"925f7239": "veztUserRegistered(address)", +"9260587e": "_removeTokenFrom(address,uint256)", +"92609315": "addAuctionManager(address)", +"9260e726": "giveReward(uint256)", +"9260faf8": "issueForEuro(uint256)", +"9262bba9": "titsTokenAuthor()", +"9262d759": "getAddress(uint256,uint256)", +"9263b559": "ethReceivedMain()", +"9263e371": "mint(bytes32,string,string,string,string,string)", +"9264a169": "tranferFrom(address,address,uint256)", +"9264ee57": "valuePerMicroKey()", +"92656b6d": "calculateHash(address[],uint256[])", +"9265996c": "getEventResult(uint32)", +"92664190": "PriceUpdate(uint256,uint256)", +"92670dc8": "currentBonus(uint256)", +"9267a36d": "founderVestingContract()", +"9267b291": "getGameStarted()", +"9267daba": "depositToGateway(uint256)", +"9268037a": "FortressToken()", +"92682b5f": "PauseOn(uint256)", +"9268e2d6": "setCLOUDForGas(uint256)", +"92698814": "reserved(bytes32)", +"926994e6": "testFailSoftLimit()", +"9269c0a7": "setABalances(address[],uint256[])", +"9269e464": "bountyTokenAllocation()", +"926a2456": "cancelIndexedSale()", +"926a4765": "getRoundStart()", +"926a9af0": "distributeForFoundersAndTeam()", +"926aa0a8": "sendEthTo(address)", +"926b33c6": "playSpecificDoubles(uint256,uint256)", +"926baab2": "proofImpl()", +"926bd180": "isGameVerified(uint256)", +"926c196a": "depositAndTransfer(address,uint256,bytes)", +"926d212e": "createGenerator(uint256)", +"926dfd5e": "becomeYouTubemaster()", +"926f0c7b": "partnersFund()", +"926f949e": "calculateWolkToBurn(uint256)", +"9270040f": "drawHeroLottery(address,bool)", +"92708ce1": "aletoken(string)", +"92710c60": "finalizePublicICO()", +"92716054": "freezer()", +"9271b8df": "totalPaidToFunder(bytes32,address)", +"9271b997": "setHighScore(uint256)", +"92721b86": "dividendRate(address,uint256)", +"9272e3f5": "many_currencies()", +"927319ba": "DCCToken()", +"92731aaa": "changesLocked()", +"927332da": "MaxChildLevel(address)", +"92736527": "freezeGame(uint32,bool)", +"92749978": "minBets()", +"9274c16b": "tokensDistributedToContributors()", +"9275ddd7": "SetFreeQPY(uint256)", +"92760a3e": "loveName()", +"92763585": "uniquePetsCount()", +"927675b8": "run(bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],uint256,uint256,uint256,uint256)", +"92771e0f": "getCertificateMetaData(bytes32,bytes32,bytes32,uint256)", +"927726ea": "_openPrize(uint32,uint32,uint256,uint256)", +"927731c8": "payDepositByCandidate()", +"9278c418": "targetWalletVerified()", +"9279011c": "nextroundlength()", +"927a11b6": "getBranch(uint256)", +"927a4a7b": "transferWithLockAfter(address,uint256,uint256)", +"927a90da": "icoOpen()", +"927aaa7c": "setGeneManager(address)", +"927ac4f5": "approveContractReceiveGameLockedToken(address)", +"927bcac3": "emergencySplitToggle()", +"927c4151": "finalizePresale(address)", +"927c60de": "BIKQuery(address)", +"927d9ab4": "set_building_amount(uint256)", +"927da105": "allowance(address,address,address)", +"927db818": "initPresale(address,uint256,uint256,uint256,uint256)", +"927db81f": "new_entity(address,string)", +"927e434b": "rocketAddFunds(uint256,uint256,uint256)", +"927e69e2": "_getBattleBonus(uint256,uint256,uint256,uint256,uint256)", +"927ed13a": "newClient(uint256,address)", +"927f1086": "MAX_RANDOM_DELAY()", +"927f4be0": "exhaustAfterBattle(uint256,uint256)", +"9280b836": "spreadGold(address,uint256)", +"9280df59": "Swapcoinz()", +"928161ca": "recoverFundsAndDestroy()", +"92817184": "redeemPurchasesForVendor(address)", +"928187a8": "BonumPreICO(address,uint256)", +"9281aa0b": "setWhitelisted(address,bool)", +"9281cd65": "changeApproval(address,uint256,uint256)", +"9281e270": "matchOrders(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes,bytes)", +"92824c24": "changeClaimAddress(address)", +"92829174": "preCrowdsaleTokensWallet()", +"9283032c": "storeWeekUnclaimed()", +"9283da60": "TeamtokenRelease1()", +"9283e6cb": "acquisitionsStatus()", +"92842802": "changeTierAdmin(address)", +"928432c0": "releasedSteps()", +"92844ddd": "_setUserRole(address,uint8,bool)", +"92846ab6": "put_transfer(address,address,address,uint256,bool)", +"92848c9e": "create(uint256,uint256,uint256,uint256)", +"9284cb0c": "getTotalPreSelled()", +"9286904c": "set_doctor(uint256,uint256,string)", +"928693c6": "RusaToken()", +"928771bb": "janPot_()", +"92878bd0": "forwardFunds(address,uint256)", +"9287c877": "getNavLength()", +"92885e86": "CountryPurchased(uint256,address,uint256)", +"9288cebc": "totalRollsByUser(address)", +"92890b09": "SmithToken()", +"92893fb9": "hasAddressVoted()", +"92898900": "allowTokenTransfer(address)", +"928993dd": "setBuyComissionUnits(uint256)", +"928a00d2": "deleteCoin(uint256)", +"928b06b5": "EAsset()", +"928b4cd2": "preICOTokenHardCap()", +"928b685c": "_buyPutToClose(uint256,uint256,uint256,uint256,address)", +"928b792e": "withdrawBonuses(bytes32,uint256,address,uint256,address)", +"928c5fb3": "getArrIntField3()", +"928c82a2": "createAsset(string,string,string,uint256,address)", +"928d09dd": "coreTeamAddr()", +"928d20fc": "_unpackPetValue(uint256)", +"928d4144": "verify(uint256,uint256,string,uint8,bytes32,bytes32)", +"928d81c1": "withdrawERC20Token(address,uint256)", +"928e6592": "sellingPriceInDayOf(address)", +"928e6b16": "getUint(bytes4)", +"928f0cc7": "ChangeStartByManager(uint256)", +"928f16e3": "geCompoundTimestampsFor12Months(uint256)", +"928fca1d": "withDrawlocked()", +"928fd553": "Migrated(address,address,uint256)", +"929066f5": "isParticipant(address)", +"9291b1f3": "tradeDealConfirmed()", +"92925c3b": "supplyTokens()", +"9293cc10": "TOU(uint256,string,uint8,string)", +"9293eb2f": "totalScammedRepaid(address)", +"9293f41e": "sendInviteDividends(uint256,uint256,uint256,uint256[])", +"92940bf9": "transferERC20Token(address,address,uint256)", +"92946284": "_placeSellTokenOrder(address,uint32,uint256)", +"9294e012": "sendOracleData()", +"92956506": "StarxCoin()", +"92958b7d": "markTokensToSell(uint256,uint256)", +"9295d038": "loyaltyPart()", +"92968125": "getUserDetails(address,uint256)", +"92979037": "teamTwoDivsUnclaimed()", +"9297afa2": "Eliminate(address,uint256)", +"9297c24c": "command()", +"9297d758": "DiceManager()", +"929911be": "takeSnapshot(address)", +"9299e552": "cancelListing(bytes32)", +"9299f294": "_buy()", +"929a3c18": "EMGwithdraw(uint256)", +"929a79b1": "getTitle(uint256)", +"929aa851": "maximumTokensForFifth()", +"929ac519": "changeOwnersWallet(address)", +"929ba8bf": "transferFromRwrd()", +"929c4649": "startUpgrading()", +"929c52a7": "changeClosingTime(uint256)", +"929d2033": "takeUpWork()", +"929de7c9": "setData_21(string)", +"929e626e": "getShareDistribution(bytes32)", +"929e902d": "curVotes()", +"929ec537": "getLockedAmount(address)", +"929f11ea": "withdrawOwnerAmount()", +"929f8dd4": "createBet(address,address,uint256,bytes32[])", +"92a04621": "maxPurchaseNum()", +"92a08dd1": "getCustomField(uint256,bytes32)", +"92a0fd64": "reserveTokenWallet()", +"92a11827": "canRevokeVesting(address,address)", +"92a20d0c": "ANONIMX()", +"92a2b44b": "offerTkn(uint256,uint256)", +"92a38e71": "createOpenValentineRequest(string,string,string)", +"92a39634": "VoltOwned(address)", +"92a42704": "verifyOwnership()", +"92a48bea": "setOfferContract(address)", +"92a4cc25": "readFrom(uint256,int256)", +"92a5f340": "BasePrice()", +"92a69395": "setTotalAirDrop(uint256)", +"92a70756": "m_thawTS()", +"92a70c42": "deployerHash()", +"92a73fb8": "testbool(bool)", +"92a781d8": "changeBaseValue(uint256)", +"92a7843c": "lastRefundedIndex()", +"92a79148": "getCryptoVersusReward()", +"92a793d0": "release_3()", +"92a81127": "BasicMilestones(address,address,bool)", +"92a8424d": "setPercentageCW(uint256)", +"92a93d33": "payAltCoin(bytes32,address,address,uint256,uint256,bytes)", +"92aaa019": "Inventor()", +"92abb859": "overrideBlock()", +"92acb4d6": "contributorList(address)", +"92ad728b": "staff_2()", +"92ae0530": "canUpdateFrontWindowAdjustmentRatio()", +"92aea05a": "expLimited(int128,int256)", +"92af0605": "playSystem(uint8,uint8,uint8,address)", +"92af7ce0": "throwsWhenGettingTokensWithEndedSale()", +"92afac6d": "reserveY1()", +"92afc33a": "ROLE_MINTER()", +"92b03120": "CONTRIBUTION_START()", +"92b0c5b2": "pow(int256,int256)", +"92b0d721": "mold(bytes32,uint256)", +"92b0fed8": "ChannelFactory()", +"92b1696d": "CNYToken(uint256,string,uint8,string)", +"92b18819": "getPoolFirstExpertStaker(uint256)", +"92b19872": "changemincap(uint256)", +"92b1b0ce": "RachelToken()", +"92b1b418": "tokenFallbackTest(address,uint256,bytes)", +"92b25a71": "Wallet(bytes32)", +"92b3228c": "getIreg()", +"92b39bf4": "assignPatient(uint256,uint256,uint256,uint256)", +"92b46390": "changeDevAddress(address)", +"92b4b68a": "get_bettor_nfo()", +"92b4bb50": "rps()", +"92b4ddeb": "phase_3_Time()", +"92b6641a": "hardCapHigh()", +"92b6ebfa": "getPreIcoBonus(uint256)", +"92b7bd27": "removeOwner_(address)", +"92b7bfbb": "TransferRate()", +"92b7d5b9": "getCurrentGaslimit()", +"92b863f3": "AbabPreICOToken()", +"92b87751": "_balanceOfUnclaimedMilk(address)", +"92b9308c": "getRespectiveValue(address)", +"92b96432": "setBpTime(uint256)", +"92b9fe8b": "Xenon()", +"92ba4ba6": "GridMember(string,uint256,bool,address,address)", +"92ba77ca": "setVeto(uint256,bool)", +"92bad6f4": "getNumber(uint256,uint256,uint48)", +"92bb3e6a": "setCoverImage(uint256,bytes)", +"92bbf6e8": "E()", +"92bc3251": "getCuts()", +"92bccb80": "pauseRedemption()", +"92bcf0d5": "ICO_PHASE2_LIMIT()", +"92bd38bc": "fundCampaign(uint256)", +"92bd3f16": "mainsaleTotalNumberTokenSold()", +"92bdf9ba": "lockedCollateral(address)", +"92be2ab8": "setRegisterFee(uint256)", +"92be5d13": "setDelegadoDeEscuelaVerify(bytes32,bytes32,uint256)", +"92be675f": "Y1_lockedTokenAmount()", +"92bec526": "GameChannelConflict(address,uint256,uint256,address,address,uint256)", +"92bec5c3": "distribute(uint256,uint256,address)", +"92bf2bf1": "changeMinimumContribution(uint256)", +"92c00590": "getAddReserveSignatures()", +"92c00a3f": "transferState()", +"92c00f3c": "investorsTokens()", +"92c19394": "packStore(address)", +"92c2bcb4": "changeRecipient(address)", +"92c31e61": "ZOINToken()", +"92c40344": "getReferralCode(address)", +"92c4a5ed": "MinBetUpdate(uint256)", +"92c537e9": "hatchStartTime()", +"92c54f92": "sit(uint8)", +"92c5769d": "unlockAddressAfterITO(address,address)", +"92c6b697": "claimGanaTokens()", +"92c6bf28": "getWalletsData()", +"92c70af1": "MAX_UN_LOCK_TIMES()", +"92c787ae": "register_recurcively(uint256)", +"92c8412f": "buykey(uint256)", +"92c87280": "joinProvider(uint256)", +"92c88a40": "CollectibleToken()", +"92c8eb96": "DSFalseFallbackTest()", +"92c9a11a": "getPrices2(uint256,uint256,uint256)", +"92c9a926": "stateStartDate()", +"92c9a9e2": "activateDestruction()", +"92ca3a80": "SingleTransact(address,uint256,address,bytes)", +"92cb5f19": "TokenTemplate(uint256,string,uint8,string,address)", +"92cb9030": "getFeeWindowForForkEndTime()", +"92cbda09": "subbtycmoney(address,uint256)", +"92cbeb59": "OracleBitstamp()", +"92cc2c94": "drainRemainingTokens()", +"92cd1ff2": "ETH_DECIMALS()", +"92cd2b99": "asciiToUint(bytes1)", +"92cdaaf3": "fulfillEthereumPrice(bytes32,uint256)", +"92cdb7d5": "deathData_a15()", +"92cf1d49": "setStop()", +"92cf9d45": "scriptAddresses(uint256)", +"92cfd461": "_createMedal(address,uint8)", +"92cfebd6": "LanaCharleenToken(uint256,string,string)", +"92d09ceb": "collateralAmount()", +"92d09f22": "pendingInvestContracts(uint256)", +"92d0d153": "t()", +"92d16464": "gameIsOver(uint256)", +"92d1abb7": "CONVERTER_CONVERSION_WHITELIST()", +"92d25259": "iBlock()", +"92d267c1": "setEthUsdRateInCent(uint256)", +"92d282c1": "Send()", +"92d2f118": "burn(uint8)", +"92d33200": "MAX_CRATES_TO_SELL()", +"92d3be79": "escrowWallet()", +"92d42475": "bbReserveWallet()", +"92d44650": "tokenApproves()", +"92d4d9ac": "verify(bytes32,address,uint8,bytes32,bytes32)", +"92d519de": "ATSXToken(address,address)", +"92d588a0": "INITIAL_COINS_FOR_VIPPLACEMENT()", +"92d59aff": "Take_payout()", +"92d60433": "CirculatingSupply()", +"92d66313": "getYear(uint256)", +"92d68619": "Multiplication(int256)", +"92d69a39": "addNodesToList(string,address)", +"92d7b620": "judge(bytes32[13],uint256,bytes32[],bytes32[],bytes32,bytes32,uint256[4],bytes32[10],uint256[4])", +"92d7f787": "getAccountWhitelist(uint256,uint256)", +"92d8c8cf": "setupImportFee(address,uint256)", +"92d98e95": "content(string,uint256,address,uint256,uint256,uint256)", +"92d996d7": "getPopularityByOffset(uint256)", +"92d997bd": "QuantityInitial()", +"92d9e3b8": "isAcceptingPayments()", +"92da29d2": "validPurchase(uint256,uint256,bytes)", +"92da856d": "currentStepIndexAll()", +"92dac258": "getAuctionItems(uint256[])", +"92daec51": "setLastBuyer(address)", +"92dbf585": "appendEarlyPurchase(address,uint256,uint256)", +"92dcf35d": "fourthExchangeRatePeriod()", +"92dd1246": "updateListReq(uint256,uint256)", +"92dd38ea": "arrayaccess(uint256)", +"92df61e8": "withdrawTokensFor(address)", +"92df6e91": "fortune_limitbreak()", +"92df94ec": "updateDream(address,string,string)", +"92dff48a": "backers()", +"92e0ba2a": "goldBought()", +"92e11e24": "teamAmountLeft()", +"92e16740": "scheduleOraclize()", +"92e18d9f": "setYcmContractAddress(address)", +"92e1ab17": "includesAddressesSet(address)", +"92e33d14": "enableWithdraw(bool)", +"92e405ac": "transferPartner(address)", +"92e41c69": "identityEthAddress()", +"92e4226a": "nextTransferFeeAbs(uint256)", +"92e423b5": "agent(address)", +"92e4b733": "_transferTokens(address)", +"92e4b8a4": "collectAuthorizedPayment(uint256)", +"92e4cd75": "icoTokensUnsold()", +"92e598f3": "test_fourInvalidEqInt()", +"92e5c9c9": "isBusinessOwnerConfirmed(address)", +"92e8202b": "withdrawInvestmentsOwner(address,address)", +"92e8438c": "issueTokensMulti(address[],uint256[])", +"92e8d866": "DailyGrowthUpdate(uint256)", +"92e9fd5e": "ColdWallet(address,address)", +"92eaa642": "transferLoveStory(bytes16,bytes32,bytes32,uint256)", +"92eada50": "lastBlock_a16Hash_uint256()", +"92eb35bc": "preSaleBonuses(uint256)", +"92ebf860": "invalidateTaskListingAtIndex(uint256)", +"92ec6ea8": "updateAsset(uint256,string,uint256)", +"92ecf577": "getCurrentTerm()", +"92ecf690": "grantToSetUnburnableWallet(address,bool)", +"92ed888b": "CcifToken()", +"92ee0334": "currentUser()", +"92eeee63": "createAndBuyAllAmount(address,address,address,uint256,address,uint256)", +"92eefe9b": "setController(address)", +"92efd277": "countOfDeedsByOwner(address)", +"92f00233": "minterContract()", +"92f00d37": "TalkToExpertToken()", +"92f1fc7d": "bytes32_to_bytes(bytes,bytes)", +"92f351f9": "openTimer()", +"92f461ed": "getTeamsOfOwner(address)", +"92f48846": "updateTokenSellAmount(uint256)", +"92f4d225": "spankToken()", +"92f52ddf": "DICE()", +"92f53757": "GLAM()", +"92f5cea7": "bytes32ToString(bytes32,bytes32)", +"92f692ea": "setInvitationValidPeriod(uint256)", +"92f6a74f": "totalTokenCapToCreate()", +"92f7ba17": "MELONPORT_COMPANY_STAKE()", +"92f8de45": "MXToken()", +"92f926e5": "makeMoveBro()", +"92f96115": "setPartialTransfers(address,bool)", +"92fa1453": "BankAccount()", +"92faad99": "setLoanParameters(address,bytes32,uint256,uint256,uint256,uint256,uint256)", +"92fb4acd": "terminatePackage(address)", +"92fb7ef8": "burnPoll(uint256)", +"92fd1c2d": "bat_match(uint256[])", +"92fd1f01": "getPayeeAddress(bytes32,uint8)", +"92fe028b": "PokerWinner()", +"92fe4098": "b32ToBytes(bytes32)", +"92fee51a": "setICORatio(uint256)", +"92ff0d31": "transferable()", +"92ff3751": "getMatchHomePlayers(uint256)", +"92ff4be4": "finalLottery()", +"92ff7859": "newFutureLottery(uint256,uint256)", +"93003033": "tokenSalesAll(uint256)", +"93004e62": "initPayoutTable(uint256,uint256)", +"93012d5f": "Loan(uint8)", +"9301bc88": "mapping(address,uint256)", +"9301eb36": "setItemOption(uint256,string)", +"9303633e": "tier_rate_2()", +"930429ea": "setFOUNDERS_POOL_ADDR(address)", +"93046a13": "withdrawEtherPayment()", +"9304ddc8": "setUnitCreationFee(uint256)", +"93051424": "KIUSToken()", +"9305b0f8": "WorldSafetySecurityToken()", +"9306099f": "GxOrders(address)", +"930622ed": "assignedAmountToMarketExpand()", +"9306635a": "PETRO(uint256,string,uint8,string)", +"93072684": "revokeDelegateSigned(address,uint8,bytes32,bytes32,bytes32,address)", +"9307ca0f": "houseKeep(int256,uint256)", +"93080cd4": "replaceChannelContractAddress(address)", +"9308151b": "crowdSaleTokens()", +"9308353f": "payin()", +"9308a865": "total_raised()", +"930916b2": "setInviteCode(string)", +"930a0daa": "checkMinimumQuota(address,uint256)", +"930a80b4": "testAuthorizedSetPackage()", +"930a9d92": "tradeOrder(address[3],uint256[5],int256,int256,uint8,bytes32,bytes32)", +"930ae8b0": "setSaleFlag(bool)", +"930b7a23": "approveOnce(address,uint256)", +"930bbbed": "changeBeedingCost(uint256)", +"930c0bba": "getWithdrawalEntryForFunder(address)", +"930c1198": "crowdsale(address,uint256)", +"930c2003": "victim()", +"930c57f3": "PublicSale(address,address,uint256,uint256,uint256)", +"930cb83e": "registerUsers(address[],uint256[],uint256[],uint256[],uint256[])", +"930cbf89": "ProposalAdded(uint256,address)", +"930cd62e": "getIcoInvestorsAddressesCount()", +"930d54b4": "revealSeckey(uint256,bytes32)", +"930db1ab": "setHijackPrice(uint256)", +"930ddb8e": "getIdea(address)", +"930e1173": "tokensReadyForRelease(uint256)", +"930e23b9": "_STCnContract()", +"930ed251": "getSavedVar()", +"930f5fbe": "setApplicationChecksum(bytes32)", +"930fed29": "EnkronosToken()", +"931010eb": "tokPrizes(uint256)", +"93107071": "PDAToken()", +"9310ba96": "TIX(uint256,address,uint256[],uint256[])", +"93119312": "returnMoney()", +"9312434e": "cryptocompareUsdOracleUrl(bytes32)", +"931274c8": "createContractScene(string,uint256[])", +"9312766d": "BSTokenData(address)", +"9313053e": "createItems(address)", +"93138faa": "isProviderParamInitialized(address,bytes32)", +"9313919a": "multipleShotTokenRepartition(uint256,uint256)", +"9313dc43": "claimTokensFromErc677(address,address)", +"9314be9d": "lock(bytes32,bytes32)", +"931634fd": "PGTBToken()", +"93167204": "teamTokensPercent()", +"931688cb": "updateBaseURI(string)", +"9316c3e7": "transferBulk(address[],uint256[])", +"931742d3": "commissionAddress()", +"9317cb37": "CUTOFF_PRESALE_ONE()", +"9317d6d3": "totalReceived(bytes32)", +"93183dc9": "paymentManager(address,uint256)", +"93192c65": "ProposalAdded(address,uint256,uint256,string,bytes32)", +"931983ad": "Connection(address,address)", +"9319f44d": "rateTierNormal()", +"931a4c5b": "maxContributionPhase2()", +"931a5256": "addOrder(uint256,uint256,address,address,uint256,address)", +"931b3385": "claimToken(address,string)", +"931c0040": "carrotsMultiplier()", +"931c6246": "VestingWallet(address)", +"931c8ba7": "count_products()", +"931cd0cc": "setBQL(uint256)", +"931dab50": "allocationAmount(uint256)", +"931df75f": "validateProposedThroneName(bytes)", +"931e44e2": "BuyLandsByEth(uint256)", +"931e7daa": "BettingKing()", +"931fbdd8": "Trenggalek()", +"9321cb7d": "SGT()", +"9321dc5f": "initRequest(uint256[])", +"9321e603": "changeMtcDailyLimit(uint256)", +"932354c1": "updateLocation(string)", +"93237833": "CONTRACT_HOLDER_BONUS()", +"9323eaad": "awardUnitRafflePrize(address,uint256)", +"9324dfff": "addWhitelistedTokenAddr(address)", +"93253a9d": "PublickOffering()", +"93257d33": "CheckForFloating(address,uint256)", +"93272baf": "getTokenType(address)", +"93275889": "ChangeTax(uint16)", +"9327891e": "testSetRole()", +"932838a1": "setCell(address,uint256)", +"9328bfc1": "getNumMessages(address,address)", +"9328fa02": "capitalAllocatedTo(address)", +"9329066c": "getJackpot()", +"93299395": "revokeEditAgentAuthorization(address)", +"9329f2fe": "postico_startdate()", +"932a0ee7": "getShowTextBytes96()", +"932a7b2e": "addApp(address,address)", +"932adda2": "newNode(bytes32,bytes32,bytes32,bytes32,bytes32)", +"932ae363": "buyerNumDeals(address)", +"932bead7": "updatePlanetURL(uint256,uint256,uint256,string)", +"932c1081": "closedHour(uint8)", +"932c360d": "SpaceRegistry()", +"932c90f3": "SUPPLY_FOR_TEAM()", +"932cd73e": "tokensReleasedToTeam()", +"932db761": "profitsFromBitnationDebitCard()", +"932def2e": "tgrCurrentStage()", +"932e1c76": "distributeEbyteForETH(address[])", +"932e2e95": "_withdrawEthereum(uint256)", +"932f4588": "RaffleResult(uint256,uint256,uint256,address,address,address,uint256,bytes32)", +"932f9f89": "testThrowInvalidProvider()", +"932fad1f": "totalWageredForOutcome(uint8)", +"932fd99f": "toHighestDenomination(uint256)", +"932fec40": "refundToken(address,address,uint256)", +"9330f97f": "removeDestinationByIndex(uint256)", +"93311632": "getTokenClaim(uint256)", +"93316cdf": "selltoken(uint256)", +"9331a922": "get_layer(uint256)", +"93320f2e": "expRequiredToReachLevel(uint256)", +"93325812": "addFreelancerTotalInvoiced(address,address,uint256)", +"9332b62c": "changeAllowAllWhitelistTransfers(bool)", +"93331892": "batch(address[],uint256)", +"9333a122": "ITECH()", +"9333cf5e": "communityPeriodAmount()", +"9333d6c0": "MILL()", +"933426f5": "GoolaToken(address,address,address)", +"93348f45": "ovedclaimBountyairdropMultiple(address[],uint256)", +"9334ab61": "Infos()", +"9334ad0d": "getVersions(address,bytes32,address,bytes32)", +"9335427c": "fullWithdrawnProfit()", +"93358320": "withdrawOwnerToken(uint256)", +"9335dcb7": "ownerWallet()", +"93361078": "confirmStartWork(uint256)", +"9338cbdd": "monToTrainer(uint64)", +"93395d99": "TalksChain()", +"93399949": "GTDCStandardToken(uint256,string,uint8,string)", +"9339c01a": "validICOPurchase()", +"9339e942": "check_flag(bytes32)", +"933aa667": "isPermission(bytes4)", +"933ba413": "totalEthInWei()", +"933bf760": "extend_life_of_contract(uint256)", +"933c798c": "next_payout()", +"933dc51b": "setUint256(int256,uint256,uint256)", +"93402e17": "setRewardManger(address,address)", +"934076f1": "BetOnMatch(address)", +"9341231c": "sendOrThrow(address,uint256)", +"9341287d": "setMetadataUrlPrefix(string)", +"9341aa4e": "initializeDistribution(address)", +"9341bc00": "drones(uint256)", +"934209ce": "rank()", +"9342160b": "eligibleCheckAndIncrement(uint256,uint256)", +"93423e9c": "getAccountBalance(address)", +"934354e7": "finishSpin()", +"93437b52": "Fibremoney()", +"93439950": "test_chain2_2_increaseBlocksBy5()", +"9344a0b6": "addAddressToRegistry(address)", +"9344b0d6": "playerCompleteGames(address,uint256)", +"9344c50f": "getNameOf(address,address)", +"93465da6": "Error(uint128)", +"934689a9": "getTokenCreator(uint256)", +"93469800": "minPower_()", +"93470fa8": "listMultipleItems(uint256[],uint256,address,uint256)", +"93474a4b": "getParticNum()", +"93478221": "LogSender2(address,address)", +"934865d0": "TransactionBlocked(address,uint256)", +"9348b810": "contractorTransferFrom_Bcoupon(address,address,uint256)", +"9348caf7": "testBuyTenTokens()", +"9348cef7": "reveal(uint256,uint256)", +"9348ff61": "setUSDRaised(uint256)", +"9349ba44": "AirRopToken()", +"934a029d": "getVoteAtTxForUser(bytes32,address)", +"934a0b57": "AXXToken()", +"934aa023": "charity()", +"934bb037": "MainBank()", +"934bc29d": "exampleFunction(uint256)", +"934c563f": "dataOf(uint256,uint256)", +"934d8a2e": "TokToken()", +"934db458": "Big()", +"934e03a4": "toBool(bytes32)", +"934e860d": "addOnHold(uint256)", +"934ea572": "w_Reserv()", +"934f92af": "ZebiCoinTempMgr(address,address,address)", +"93503337": "isAllowed(bytes32,uint256)", +"9351327f": "USD_PER_ETHER()", +"935146d0": "createMatch(string,string,uint256,uint256)", +"93519d66": "requestClearing(bytes32)", +"9351a8d7": "managementWithdraw(uint256)", +"9352fad2": "run(string)", +"93545a79": "isAmountBonus()", +"93559bc6": "lifeCoin()", +"9355d6db": "MadTok()", +"9355eb25": "privilege()", +"935600ce": "subRegistrationPeriod(bytes32)", +"9356b1fe": "BWCHToken(uint256,string,string)", +"9356e87f": "getLastMulti()", +"935814a6": "confirmRewardsWithdrawal()", +"93588a14": "setTop(uint256,address,uint256,bool)", +"9358928b": "circulatingSupply()", +"93595b66": "tokenSetMintFeeReceiver(address,address,address,address)", +"935aae40": "MINIMUM_BET()", +"935b1624": "get_first_global_audit_document()", +"935b2b1f": "buyBox2()", +"935b7dbd": "buyFor(address,uint256,uint256)", +"935bb767": "setPrices(uint256,uint256,bool)", +"935c1fb1": "addressIndex(address)", +"935cac39": "internalTransferFrom(address,address,uint256)", +"935d29d6": "BPToken()", +"935d647f": "getPublicForSecretFor(bytes32)", +"935dfb71": "adjusted()", +"935e1533": "processFinishLottery(address)", +"935e97c2": "settleTransactionByMediator(uint256,uint256,uint256)", +"935eb35f": "addToBlacklist(address[])", +"935ebb78": "MAX_USD_FUNDING()", +"935eeddc": "CarUpdated(uint256)", +"935f43b2": "ipart(int128)", +"935f4c18": "sendPayment(address,uint256)", +"935fb955": "Mytoken(uint256)", +"93602379": "_transferCar(address,uint256)", +"936061cd": "claimWinner(address)", +"93608dfb": "earlySuccessTimestamp()", +"9360b138": "sendTokensTo(address[],uint256)", +"936224b8": "midEtherBonusValue()", +"93623fb8": "changeAcceptDice(bool)", +"936241b7": "hunterLicenceEarning()", +"93627f42": "globalMax()", +"9362917c": "FuckKuanLi()", +"9362e50e": "changeDeveloperSENSDestinationAddress(address)", +"936315d6": "canReveal(address)", +"93632ddd": "totalBNBContributed()", +"93634702": "isValidSignature(bytes32,address,bytes)", +"9363933c": "GizerItems()", +"9363a141": "getDepositCount()", +"9363c812": "floorPrice()", +"9363fb71": "totalFreeTokensDistributed()", +"9364003c": "HDC()", +"93643a5b": "fazzycoin()", +"936597da": "mLoadAndReturn(bool)", +"9366804f": "checkForJoin(uint256,address,uint256)", +"9366fd5c": "getEvaluationByRecorderID(uint32,uint64)", +"936710bf": "getBalanceOfAccount(address)", +"9367a863": "t_Andrey()", +"9367f8de": "SPCToken()", +"93683f3d": "changeReserveBountyRecipient(address)", +"9368f482": "_betterThan(address,address)", +"9368f72c": "burnFromToken(address,uint256)", +"93694f67": "opponent()", +"936b360d": "Tachyon(uint256,string,uint8,string)", +"936b603d": "contributorTokens()", +"936bbf9a": "totalPostIcoContributorIds()", +"936bfa40": "the120address()", +"936bfc63": "OrcERC20()", +"936c9bc9": "ICOdeadline()", +"936cfb0e": "transferInternal(address,address,uint256,bytes)", +"936d2b0f": "addProductAtId(uint256,string,uint8)", +"936e9904": "AUCoin()", +"936ec951": "afterEach()", +"936f67ea": "CryptoStorage()", +"936f8a40": "setMinBuy(uint256,uint256,uint256)", +"936fddcb": "VULCAN_PROMETHEUS_EXTRACTION_BASE()", +"93709788": "forwardManyTransaction(uint256[])", +"9370a07c": "TSVC()", +"9371c369": "applicationRejected(address,address)", +"9371de6e": "unsoldVUPDestination()", +"93720b2f": "giveAways(address,uint256,uint256)", +"93736419": "UpdateUserExpire(address,uint32)", +"9373ad6c": "inviteFinished()", +"9373b8bd": "claimAddresses(address[],uint256)", +"9373e2a1": "CircleCrowdsale(uint256,address)", +"9373f432": "setWithdrawWallet(address)", +"93741a3e": "iterate(string)", +"93742d83": "makeBet(uint8,uint8,uint8,uint8,uint8,uint8,address)", +"9374c487": "overshoot()", +"9374ec98": "whiteListMge()", +"9375206a": "setAllowed(address[],uint8,bool)", +"93762cff": "_resetMine()", +"93766a57": "trade(address,uint256,address,address,uint256,uint256,bool)", +"93768820": "isCommunityToken(address)", +"9377530f": "grandTotalClaimed()", +"93778e2d": "setCompte_6(string)", +"9378a9e2": "setUInt(uint256)", +"9378f08f": "ScamStampToken()", +"9379077f": "bookDayVisit(uint256)", +"93790f44": "getKey(address)", +"93791262": "performInit()", +"93796317": "InternationalTourismPublicChain(uint256,string,uint8,string)", +"93798ff5": "BuurmansToken()", +"9379d936": "calculateBonus(uint8,uint256,uint256)", +"937a7ac5": "moveStageWithdrawn()", +"937a9151": "WBIToken(uint256,string,string)", +"937adbe6": "isInTerm(address)", +"937b19ef": "EtherRoyalToken()", +"937b7cf1": "contractFallback(address,address,uint256,bytes)", +"937c0cdf": "priviledgedAddress()", +"937c0d0a": "aaa()", +"937c9e3c": "CandyLandSale(address)", +"937cde20": "hasPass(address)", +"937dc72f": "AppCoins()", +"937e09b1": "minimumContribution()", +"937e909b": "reservesPerTokenDest(address,uint256)", +"937ebbd2": "sendTokensToBountyOwner()", +"937ef8e3": "getUserReferralsProfit(address)", +"937f2e33": "claimMyTokens()", +"937f6e77": "setInfo(string)", +"937fd355": "initializeBasicFundraiser(uint256,uint256,uint256,address)", +"93801acb": "deleteList()", +"93806144": "getPunitoryInterest(uint256)", +"93808351": "setPriceInternal(address,uint256)", +"9380b8e7": "testFailAddingMembers()", +"93813782": "Tasoha()", +"938199a5": "getDateOfLastPayment()", +"9381da6e": "getEstateData(uint256)", +"9381e53f": "TokensCollected(address,uint256)", +"9381ebfa": "EUAHTOKEN()", +"9382ef65": "prvdWallet()", +"93830c74": "solUpDownVote(bool,uint32,address)", +"9383d4e6": "SingularityTest14()", +"93847d54": "TRLCoinSale(address)", +"9384f31e": "SingularityTest19()", +"93854494": "factHash()", +"93859188": "amount_bonus()", +"93867fb5": "roleAdmin()", +"9388b560": "TOKENS_ALLOCATED_TO_SERVUS()", +"9389c5b5": "setPackPrice(uint256,uint256,uint256)", +"938a465e": "TOKETH_PRESALE_ONE()", +"938ae4cc": "testThrowDisownNotTransferable()", +"938b5f32": "origin()", +"938b643b": "TimeToMeet()", +"938bcd67": "getChannelIdentifier(address,address)", +"938c4307": "scheduleCall(bytes4,bytes,uint16,uint8,uint256,uint256,uint256,uint256,uint256)", +"938d0444": "SmileToken()", +"938d2f46": "escrowDeletion(address,address,uint256)", +"938d9632": "activekey()", +"938da22d": "secondReleaseTime()", +"938db92e": "ICO_Tier()", +"938e6fcc": "MiningStart(uint256,uint256,uint256)", +"938f3cc4": "create(address,address,address,address,address,address,address,string,string)", +"938f407a": "removeFromWhitelistInternal(address,uint256)", +"938f6c5f": "getBountyTokens()", +"938f7064": "createTopic(string,string,uint256)", +"93904aae": "coinToBurn()", +"939090f8": "deposit4(address,address)", +"93911ff8": "addTrades(address[],uint256[])", +"93920e8f": "invest(address[],uint256)", +"93924147": "MoveFromBase(uint256)", +"93928c91": "thirdBonus()", +"9392e5b5": "erase(uint256,uint256)", +"93930020": "getLastConsolationPrize()", +"9393c09c": "addFabric(address,address)", +"93940e0a": "INTLToken()", +"939528b1": "transferProposalCooldown()", +"939624ab": "removeStake(uint256)", +"9396a7f0": "getQuickBuyPathLength()", +"9396df32": "advertisingPercent()", +"939729c1": "installerPercentage()", +"9397afcb": "PlayingCrypto()", +"9397f2a2": "weekOneRate()", +"939802af": "getDataForTokenId(uint256)", +"93986193": "realizedTokenBalance(address)", +"9398e0cd": "data(int256)", +"9398ecb6": "setMaxParcels(uint256)", +"939935cb": "startTimeInMinutes()", +"93997075": "AddCommitteeVoteEvent(address,address)", +"9399869d": "getContractCount()", +"9399dcfb": "PointGameProcess(address,uint256)", +"9399dd7e": "serverEndGameConflict(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,uint256,address,bytes,address,bytes32,bytes32)", +"939a470e": "updateDescriptionHash(string)", +"939a79ac": "demo(string)", +"939a8dc1": "CryptoPepeMarketToken()", +"939b73aa": "getAthlete(uint256)", +"939b7842": "approveMigration(uint256)", +"939bfc79": "TTAC()", +"939c0a66": "AirDrop()", +"939c23b6": "setProtectionForMyUnprotectedCrypton(uint256,uint256)", +"939cda3f": "DgxDemurrageReporter(address,address,address,address)", +"939d3ac4": "sendCommunity()", +"939d8729": "_postValidatePurchase(address,uint256,uint256)", +"939de809": "checkSale()", +"939e014e": "optionTransfer(address,uint256,uint256)", +"939e436c": "weiPerContributor(address)", +"939ea4f8": "bombs(uint8)", +"939fb3bf": "Owanble()", +"93a00d27": "rektCoinCashSafe()", +"93a09352": "setValue(string)", +"93a0c742": "getIdeaParties(uint256)", +"93a0dc08": "disableAffiliate()", +"93a2f88d": "gettopid(address)", +"93a2fa6c": "Emission(uint8,uint256)", +"93a31509": "LEXToken()", +"93a32f62": "assignToken(address)", +"93a378da": "addHodlerStake(address,uint256)", +"93a408d7": "priceUSD()", +"93a422bb": "updUserBlackList(address[],address[])", +"93a45612": "SetPresaleHandler(address)", +"93a52980": "getTotalEtherPool(uint8)", +"93a595f5": "repayLoan(address,uint256)", +"93a5a9da": "resignTrustee()", +"93a69ae0": "eForecastGambleToken()", +"93a8333e": "Count()", +"93a91682": "curPrice()", +"93a91f25": "setInitialAllocation(address[],bytes32[],uint256[])", +"93a95fa8": "superPowerFulDragonOwner()", +"93a962fc": "addUndergraduate(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)", +"93a991af": "withdrawDai(uint256)", +"93aa3014": "BarryUtilityCoin()", +"93aa5ca8": "BITNOT(bytes32)", +"93aababc": "setlockBalance(address,uint256)", +"93aacd7d": "ownerLabel()", +"93abc530": "getSubscriptionOwner(bytes32)", +"93ac3638": "setAuctionAddress(address)", +"93ac3905": "lastGateway()", +"93ac5048": "BitallexToken()", +"93ac7c83": "EVTCToken(address,uint256)", +"93adf28b": "PumpAndDump()", +"93aef871": "checkSolved()", +"93af0292": "complete(address)", +"93af339f": "cardDrawPrice()", +"93af8ed4": "maybeChangePrice()", +"93afbdae": "repriceAuctions(uint256[],uint256[],uint256[],uint256)", +"93affe51": "getBoth()", +"93b14daa": "right14(uint256)", +"93b155af": "win(bytes32)", +"93b16ff5": "IkuraBurn(address,uint256)", +"93b1d4c7": "OfferingRegistry(address)", +"93b212bc": "subWithdraw(address)", +"93b21c8c": "destroyThreshold()", +"93b2467e": "totalSold(uint256)", +"93b30efc": "doSellerRequestCancel(bytes16,address,address,uint256,uint16,uint128)", +"93b3a368": "getCorrespondingIntegerValue(bytes32,uint8,uint256)", +"93b3bb35": "VisualFodderCoin()", +"93b3cc6b": "getRandomSeed()", +"93b4a73c": "KITTOKEN()", +"93b4c69b": "_assignRole(address,bytes32,address,uint256)", +"93b557db": "dSetArbitraryData(bytes32,bytes,bytes)", +"93b69f86": "getPlayerCoin(address,address,uint256)", +"93b71fe5": "Dao1901Votes(address)", +"93b7e7cb": "addCancellation(address)", +"93b8386d": "agencyOf(address)", +"93b8e90d": "isMasterAccount(address)", +"93ba3f15": "propose(address,uint256,bytes)", +"93baa6ef": "InterfaceImplementerSet(address,bytes32,address)", +"93bb3aee": "betAddressArray(uint256)", +"93bbafd1": "earlyBirdInvestments(address)", +"93bc771a": "ceoDevfund()", +"93bc96fa": "withdrawTo(uint256)", +"93bcabb7": "pullRow(uint256)", +"93bd0142": "ETHERDELTA_ADDR()", +"93bd1484": "mintApproveClear(address,address)", +"93bd27de": "IOweYou()", +"93bd4fc4": "depositAgent(uint256,uint256,uint256,string,uint256,string)", +"93bd90c4": "richtokenIndexToApproved(uint256)", +"93be0f83": "MSPT()", +"93bebdec": "corporationContract()", +"93c0771c": "getGamesPlayers(uint256)", +"93c166ec": "computeEndowment(uint256,uint256,uint256,uint256)", +"93c19e18": "rate0()", +"93c2c7f0": "getClosingSettle(bytes32)", +"93c2f482": "maxRound()", +"93c32e06": "changeFounder(address)", +"93c38965": "getData_15()", +"93c434e5": "getOptionInfo(uint256,uint256)", +"93c4ade0": "viewMaxShares()", +"93c5186c": "isNewPrice()", +"93c573c0": "maxChequeValue()", +"93c5ace0": "walletTokenTeam()", +"93c6475c": "processBet(uint8,uint256,uint256,int256,bytes32,bytes32)", +"93c69927": "sizeOfBool()", +"93c7ca84": "countBet()", +"93c7e009": "AddTrustedContractAddress(address,address)", +"93c8b0d4": "addForeignChild(bytes32,bytes32)", +"93c92b73": "exchangeRateArray()", +"93c94acb": "calculateRewards(uint256[3][3])", +"93c958f3": "ManufactorWallet(string)", +"93c98cbc": "ApplicationQualityCoin()", +"93c9b63e": "SGTCoin(uint256)", +"93ca5de7": "CIzTezt(string)", +"93cb1a4e": "originalHash()", +"93cc6d85": "transformDataContract()", +"93cc9162": "taskRejected(uint256,uint256)", +"93cca918": "place()", +"93cd22b8": "addAdministrators(address)", +"93cddbcf": "goldToEur()", +"93ce9791": "emergencyFinalize()", +"93cfd79f": "getVisitorCount()", +"93d07d07": "hoursCount()", +"93d087a2": "setData_33(string)", +"93d0de98": "AirDropContract()", +"93d1217e": "lastBlock_v3Hash_uint256()", +"93d18e92": "processOrder(bytes32)", +"93d22e52": "setEFContract(address,address,uint256)", +"93d25fbc": "getroommoney()", +"93d3173a": "delegateDecreaseApproval(address,uint256,address)", +"93d4673f": "BTCTKN()", +"93d48b11": "zombieToken()", +"93d51daf": "amountofp3d()", +"93d5276b": "investInternal(address)", +"93d5825e": "calculateTokenSell(uint256)", +"93d5908a": "harapan(address,uint256)", +"93d5c520": "DelegateCallToken(uint256)", +"93d60990": "teamWithdraw(uint256)", +"93d68cfa": "preferredSaleStartTime()", +"93d759b8": "allowedAccount()", +"93d76f0e": "DEVELOP_CAP_PER_ROUND()", +"93d79105": "hashRelease(bytes32,bytes32)", +"93d7c6bf": "researchDivPercent()", +"93d81d58": "cancelSubscription(address)", +"93d84bf0": "oraclize_newRandomDSQuery(uint256,uint256,bytes,uint256)", +"93d865e3": "tokensFromPresale()", +"93d88409": "suspendSale()", +"93d90a4e": "HostingIcos()", +"93d91eae": "getFractionalAmount(uint256,uint256)", +"93d96049": "burn_lost()", +"93d9df16": "setCounter(int256)", +"93d9fd74": "getTitulaire_Compte_4()", +"93da1db1": "Profiterole(address,address,address)", +"93da4cfd": "getInvertedPriceInfo(address)", +"93dafba2": "getSubpot(uint256)", +"93db7716": "get_sale_arbits_sold()", +"93dc12e6": "closeProject(uint256)", +"93dd4133": "signedByCLevel(bytes32,bytes)", +"93dd738e": "notifyLegacyClaimed(address)", +"93dd9443": "Community()", +"93dd9866": "summEccles()", +"93de2527": "RegisterStaff(address,string,string,string)", +"93de6c51": "CHGUSDPRICE()", +"93dfbbcb": "setTokenExchangeRate(uint256,uint256,uint256)", +"93dfea8f": "ong()", +"93e02d13": "FallenLeaders()", +"93e1021a": "Participant()", +"93e1595d": "ATTR_CONSUMABLE()", +"93e24b7a": "teamVaultAddr()", +"93e3fca1": "stopGameOnNextRound()", +"93e40f7e": "claimedLength()", +"93e426de": "MIN_WITHDRAW_WEI()", +"93e42dfa": "_withdrawInvestor(address,uint256)", +"93e432d4": "refillGift()", +"93e43bbe": "getPost(bytes32)", +"93e4bf4f": "addPrecommitment(address,uint256,uint256)", +"93e5365f": "maxAddresses()", +"93e580ea": "storageRoot(address,uint256)", +"93e59dc1": "whitelist()", +"93e67bff": "IPFSHash()", +"93e7155b": "swapActivityHandler()", +"93e7d6c6": "createInviteName(bytes32)", +"93e84cd9": "play()", +"93e96174": "getNextDiniRequestId()", +"93e9a084": "lastTime()", +"93ea0e02": "batchTokenTransfer(address[],uint256[])", +"93eade00": "tokenAssignExchange(address,uint256,uint256)", +"93eb049d": "dp()", +"93eb33b3": "notifyDeathConfirmation()", +"93eb3c62": "Send(address,address,uint256)", +"93ed013d": "ecosystemAddr()", +"93ed4426": "extraBonus()", +"93eda78d": "getClaimData3(uint256)", +"93edaf59": "freezers(uint256)", +"93edbe36": "CHELCOIN()", +"93eeb3fb": "checkRate(address,address)", +"93eec1fb": "setName(uint8,uint8,string)", +"93efbdbb": "DPIcoWhitelist()", +"93f0bb51": "order(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"93f1b685": "LuckyPackage()", +"93f27be2": "_assignOverlfowData(uint256)", +"93f2ad91": "ExtremeToken()", +"93f2ba24": "testdiv256_128By256()", +"93f2fa04": "ThingToken()", +"93f32659": "getInitialWithdraw()", +"93f33b88": "notifySale(uint256,uint256,uint256)", +"93f43863": "getEmployerJobs(address,address)", +"93f5ddf2": "ICOStarted(uint256,uint256)", +"93f63e70": "setBenefit(address)", +"93f6fd85": "createCampaign(uint256,bytes32,bytes32,bytes32)", +"93f7cc99": "getPlayerAccount(address)", +"93f826c9": "portfolioSummary(address,address)", +"93f84cfe": "mintTeam(address,uint256)", +"93f85021": "numLeaders()", +"93f8e9f7": "mediumMod()", +"93fa47f1": "lockGoldTransfers(bool)", +"93faf781": "loggedAsStatement(uint256)", +"93fb28bd": "getUnitAttackMultiplier(address,address,uint256)", +"93fc2c8b": "winnerIsDraw()", +"93fc5ebb": "_secondRoundWinnersFight()", +"93fe0237": "updateWhitelist(uint256[],bool)", +"93fe4248": "deleteUIntValue(bytes32)", +"93fea184": "CONTRIBUTIONS_MAX()", +"93fea3fc": "supportValidator(address)", +"93fea8f3": "MahamTestCoin()", +"93feb13b": "ForceSendHelper(address)", +"93ff3e4a": "insertNewUser(uint32,bytes32,address,uint256,uint256,uint256,uint32,bool)", +"93fffddc": "previousContractAddress()", +"94002b57": "goldToken()", +"940064e3": "periodPreITO_hardCapInUSD()", +"94009bbc": "powerUp(address,address,uint256)", +"940147ac": "tribeProducts(address)", +"94014dc0": "weiRaisedPreICO()", +"94018e20": "removeRoles(bytes32[],address,address)", +"9401c82b": "CAECToken()", +"9401d547": "lockExternalTransfer()", +"9401e4e7": "TokensFlushed(address,uint256)", +"94025211": "refundToOtherProcess(address,uint256)", +"9403e8dd": "casino()", +"94044c75": "_invokeTokenRecipient(address,address,uint256,uint256,uint256,uint256)", +"94056c42": "mintTRCToken(address,uint256)", +"9405b406": "ProposalManager()", +"9405c78f": "setQuantity(uint256,uint256)", +"9405de64": "checkAllowance()", +"9405dfdd": "listingId()", +"94062a9d": "minBuyingAmount()", +"94066fb1": "cancelOfferAlice(uint256)", +"9406aea9": "startCall(uint256,uint8,bytes32,bytes32)", +"9406cf59": "setChallengeFeeMultiplier(uint256)", +"9406e273": "NBELToken()", +"94074b03": "getNetworkName()", +"94077c50": "updatePriceAgent(address)", +"9407a688": "allowedForwards(bytes32)", +"9407ea98": "setMarketplaceFee(uint256)", +"94081387": "administrate(uint256)", +"940834be": "MidnightCoin()", +"940900b8": "bookOvernightVisit(uint256)", +"94097168": "burnTokenBurn(uint256)", +"9409962f": "withdrawExtraTokens(address)", +"940a4e45": "distributeReward(uint256)", +"940a6cf5": "getAdministratorCount()", +"940a82a3": "distributeCTS(address[],uint256,uint256)", +"940aa73f": "setMinimumVotingWindow(uint256)", +"940b29b2": "etherReceivers(uint256)", +"940bb344": "burnUnsoldTokens()", +"940beaf5": "getTransactionIds(bool)", +"940c154b": "lockBet(uint256)", +"940c17c0": "CROWD_WEEK4_PERIOD()", +"940d0780": "AdmChange_README(string)", +"940d553f": "FoodTransferEvent(address,address,uint256,address,uint256,uint256)", +"940d5e08": "Alpon()", +"940d72ec": "buyPack(uint8)", +"940dab4c": "prefixedHash()", +"940dbf3e": "invokeOnce()", +"940de97e": "privateSaleStartTime()", +"940df414": "claimAddress(address,uint256)", +"940ebef7": "secondsRemaining()", +"940f02e0": "setDevelopersTokensWallet(address)", +"940f0661": "PrivateLedger()", +"940f851c": "Ballot(uint8)", +"940fae9e": "confirmBoosterQuest(address)", +"9410579d": "_calculatePriceComplement(uint8)", +"94106200": "testFailCreateSameNonce()", +"94107690": "checkPurchaseRecord(address)", +"9411c88b": "TokenContract(uint256)", +"9414d0bf": "initializeUsdReceived()", +"9415931d": "getLastDividendsAmount()", +"941660e5": "getRoundMaxPerUser(uint256)", +"9416893b": "addDemoData()", +"94169f25": "preIcoTotalCollected()", +"9416b423": "toLower(string)", +"94181d27": "lastReparation()", +"94182798": "dna4(uint256)", +"9418b8a6": "closeUsingTrustedRecipient(address,address,uint256)", +"9418d25a": "proveBuy(bytes,int256)", +"94194be4": "openingTimeB()", +"9419768d": "checkBetting(uint256,address)", +"941993f8": "changeCofounderB(address)", +"9419a2da": "setPaymentDetails(uint256,string)", +"9419f17c": "decraseTimeToAction(uint256)", +"9419fd29": "getWidth(uint256)", +"941a4bc7": "getPartnerCash(uint8,address)", +"941a5074": "controllar_account()", +"941a8486": "ownerChangeSellerfee(uint256)", +"941b0161": "addMarket(uint256,uint256,uint256,uint256)", +"941da7b8": "testExpiredBalance()", +"941e98a8": "EMISSION_FOR_SALESTAGE1()", +"941f9580": "rewardKey(address,uint256)", +"94201882": "artistEmail()", +"94224066": "setCityValues(uint256[],uint256,uint256[],uint256[])", +"942273bd": "SAMURAI()", +"942324c3": "getSponsoringCount(uint32)", +"94235f77": "apLockUp(address)", +"9423719b": "tokenBonusForFirst()", +"942385eb": "getPayroll()", +"9423f443": "submitGameResults(uint256)", +"9423fc54": "transferClearingFunction(address)", +"94248eaa": "isStateProjectInProgress()", +"9425753c": "licenseProductId(uint256)", +"9426e226": "validatorSet()", +"94272356": "_setReferrer(address,address)", +"9427aa96": "getBonus(uint256,uint256)", +"9427dfea": "ownerRecoverTokens(address)", +"942802e7": "VULCAN_POD_FTL_SPEED()", +"94282357": "EFASCOIN()", +"9428522a": "getNode(string)", +"9429d441": "reclaimBySender(uint256,address,address,bytes32)", +"942a8ad3": "getAQL(address)", +"942ab177": "MintToggle(bool)", +"942ab286": "buyTicket(uint256[],address,uint256,uint256)", +"942ac303": "goalInEthers()", +"942ae0a7": "renderHelloWorld()", +"942b765a": "getList()", +"942b90d3": "getRewardTable()", +"942bc8d4": "unpauseAngelToken()", +"942d468b": "transferArray(address[],uint256[])", +"942d73b1": "readAddr()", +"942dac28": "amounRefferalWon()", +"942ea466": "getNumber(address)", +"942ff8fc": "inituser(address,uint256)", +"94306ecb": "AutoreleaseDelayed()", +"94313c5b": "getPositionOwedAmount(bytes32)", +"94313f9f": "cleanConsents(bytes32[],address[])", +"943153cf": "StonePaper()", +"9431e412": "getCommunityRates(uint256)", +"9431f5f0": "withdrawFees(bytes)", +"943215ae": "investmentFundWallet()", +"943250c4": "SquirtCoin()", +"9432c92c": "setStartTimeIcoStage1(uint256)", +"9432f0c7": "receiveClosePositionPayout(bytes32,uint256,address,address,address,uint256,uint256,bool)", +"9433a498": "totalFountainSupply()", +"9433a81e": "personIndexToApproved(uint256)", +"9434c981": "createNewMartial(uint256,uint256,uint256)", +"9434d765": "allocated12Months()", +"94353c70": "postMonForClass(uint64,uint32)", +"9435c887": "cancelBid()", +"9437563c": "logPriceBefore()", +"943814f0": "getWhitepaperAt(address,uint256)", +"9438cca8": "cancelEscrow(uint256,uint256)", +"9439060f": "getGameNumber(uint256)", +"943911bc": "getWorseOffer(uint256)", +"943a32bc": "Relay(address)", +"943a5e28": "RENEX_ATOMIC_SETTLEMENT_ID()", +"943b0747": "RewardOffer(address,address,bytes,uint256,uint256,uint128,uint256)", +"943b82f1": "getLimit(uint16)", +"943bd25d": "addNewBetAmount(uint256)", +"943dfef1": "bounty()", +"943e170d": "neededSignatures()", +"943e8216": "vote(uint256,uint8)", +"943eb504": "supplyLocked()", +"943fa364": "MPhoneSeller()", +"943fcc9d": "buyRoseETH(string)", +"943fd51c": "claim2Ply(uint64,uint64,uint64,uint64)", +"9440f01f": "buyCoins(address,uint256)", +"9441268b": "updateGlobalTokenAge()", +"944126f4": "acceptSupport()", +"94412943": "bountyOf(address)", +"9441e646": "addWhiteList(address,address)", +"9442936f": "d(address,address,uint256)", +"94429fa6": "withDrawAnyERC20Token(address,uint256)", +"9442fad9": "deployTokens(uint256[],address[])", +"94431f80": "getAvailableEtherCommissions()", +"94432deb": "fairsale_protection()", +"944358e0": "getContributedAmountInWei(address)", +"9443b9be": "TokenTimeLock(address)", +"9444991d": "getVotingListCount()", +"9445eb3a": "Terminate()", +"94465bf6": "adjustDuration(uint256)", +"94477104": "vestedOf(address)", +"9447fd0a": "until()", +"9448807a": "secondPay()", +"9448bcea": "getPlayerRoundNums(uint256,address)", +"94493c43": "getLockCount()", +"94495468": "totalTokenRice()", +"9449a361": "setStakeRequirements(uint256,uint256)", +"944a1a75": "CELION()", +"944abc22": "_updateCurrentPeriod()", +"944ac0c6": "MAIN_SALE_START_TIME()", +"944af2ae": "TegTokens(uint256,string,string)", +"944b7c3f": "getMaxNumberOfTokens()", +"944c1d97": "resetPeriod()", +"944c8929": "checkBeatingPrice(uint256,bool)", +"944d4505": "IqraChishti()", +"944da654": "editModule(uint256,uint256,address,bytes4)", +"944dc22c": "addRemovableIdArrayItem(address,uint256[],string,string,string,uint256)", +"944ea02d": "checkTokenBalanceState(address)", +"944ea477": "OPERATION_AMOUNT()", +"944f0499": "transferTokensFromTeamAddress2(address,uint256)", +"944f0e64": "tokenInfoParametersReady()", +"9450b1c8": "addCharityFundation(string,string,string)", +"9451bca7": "result_votes()", +"9451f865": "TestConf()", +"94525e12": "lowRate()", +"94532ced": "blockSettle(uint64,uint64,bytes)", +"9453b95d": "addOrUpdateAccounts(address[],uint256[],uint256[])", +"9453f381": "getBeneficiaryCash(address)", +"9453f767": "createOrder(string,address)", +"94543c15": "isDeprecated(address)", +"94544e64": "transferFeePercent()", +"94555d1a": "addSubscriber(address)", +"94558862": "setRewardClaimed(address,uint256)", +"9455924f": "getTotalVolumeToken(address)", +"94566d25": "jobPost()", +"9456e5b5": "stockSet()", +"9456f7e9": "getHashByTokenId(uint256)", +"9456fbcc": "withdrawERC20(address,address)", +"94579680": "changeUserGrowthAddress(address)", +"9457c1dc": "enableMigration(address)", +"9457c68a": "forceEndCall()", +"9458434f": "mainWeiRaised()", +"94594625": "distributeAirdrop(address[],uint256)", +"9459c254": "refund(address,string,uint256,uint256,uint256)", +"945a2555": "queryPermissions(address)", +"945aab47": "tokenSaleCap()", +"945ade92": "initialDate()", +"945c6cf8": "burn_all_unsold()", +"945c7438": "sign(address,int256)", +"945c7c59": "distributeTokenSale(uint256,uint256,uint256,uint256)", +"945d7b7e": "tranchesSent()", +"945ddb52": "mainSaleTotalSupply()", +"945e5f24": "roughSupply()", +"94602869": "receiverWithdrawal(uint256)", +"9461446d": "setProcessingFee(uint256)", +"94615fc1": "setFreezingStatus(uint8)", +"946267ec": "mintComplete(uint256,int256)", +"9462eae5": "ChangeContractor(address)", +"9462f02f": "tactics(uint256)", +"9462f4bc": "bytarr(bytes32[])", +"94636cee": "createPromoMonster(uint32,bytes,address)", +"9463d582": "teamOneWin()", +"94642f96": "investorWhiteList(address)", +"94644764": "lookUpClaimerAddress(uint256,address)", +"94650fb8": "Goal()", +"94655f2b": "printMoney()", +"94658690": "parseUserInivte(uint256,uint256)", +"9465c114": "vanishToken(uint256)", +"946644cd": "fun()", +"94679ce7": "changeEtherPrice(uint256)", +"946941ec": "Contribute(bytes24)", +"946a893d": "shopDoublet()", +"946ad94d": "tokenContractEnableTransfers(bool)", +"946ae8df": "FMGHEALTHCARE()", +"946ba496": "ShishuToken(uint256,string,string)", +"946bcc30": "getFounder()", +"946bf4d7": "winningProject()", +"946c0344": "getChallenges(uint256)", +"946ca295": "userTransfer(address,uint256)", +"946d1480": "ethToUsd(uint256)", +"946d8806": "getMyPacifist()", +"946d9204": "initialize(address,address[])", +"946f8876": "updateTierStatus(uint256,uint256)", +"94704818": "fillOrder(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,uint256,bytes)", +"94705167": "enableArbiter(address)", +"94707a95": "_setRate(uint256)", +"9470b0bd": "withdrawFrom(address,uint256)", +"94727b41": "deleteProduct(bytes32)", +"9472b32c": "sale_period()", +"9472eb76": "setPayerString(string)", +"947355df": "addToList(string,address[])", +"94737987": "referralProgram(bool,uint256)", +"94741017": "failCrowdsale()", +"94756e22": "VikoChain(string,string,address)", +"94759c36": "createQuote(uint256,uint256,bytes32)", +"9476760d": "AthletiCoin(address,address)", +"947721dd": "refundEndDate()", +"947846a4": "RefundableCrowdsale(uint256)", +"9478a7c9": "getReferralOf(address)", +"9478ab8c": "ethUsdPrice()", +"9478ba47": "calcUnclaimedFees(uint256)", +"9478f7cf": "_receiveEth()", +"9479a732": "sell_car(uint256)", +"9479f2c7": "STAKE_DEADLINE()", +"947a3168": "token_name()", +"947a36fb": "interval()", +"947aca55": "addMasterAccount(address)", +"947af462": "setBurnRequestAddressMap(uint256,string,address)", +"947bc72d": "MAX_TRANSFER_TIMSPAN()", +"947bd798": "rawManuallyMintTokens(address,uint256)", +"947cbc1e": "dariatest()", +"947e8a26": "TOKEN_MINTING()", +"947f7d1d": "newRandom()", +"947f8ede": "IcoCapChanged(address,uint256)", +"947f97cc": "getUnsoldTokens(uint256)", +"947f996d": "testGreatherThan()", +"947fd341": "getCoefficientMultiplier(string,string,string)", +"9480cd1a": "getPillarRoundsKitties(uint8,uint256)", +"94828ee8": "DelightToken()", +"94836dab": "sendFounders()", +"9483e91a": "withdraw(address,uint256,bytes,uint256)", +"9483f25c": "updateProfile(string,string,string,string)", +"948623dd": "buy(address,bytes,bytes32)", +"94868f7d": "airDropPayableTag()", +"948759d5": "transfermulti(address[],uint256[])", +"94876995": "isHandleAvailable(bytes32)", +"9489fa84": "calcSharePrice()", +"948a70d7": "SingularityTest16()", +"948b557a": "getDispute()", +"948b6790": "getTokensPrice(uint256,bool)", +"948bc5d6": "XfinityUtility()", +"948cd942": "getDronePot()", +"948cfd0c": "updateBootyBase(address)", +"948d902d": "getTokensByETH(uint256)", +"948e1a1c": "AVAILABLE_TOKENS()", +"948f1daa": "mintLockPeriod(address,uint256,uint256)", +"948f5076": "setCache(address)", +"949076b6": "ensureInterval()", +"94910d60": "createContract(address,address,uint256,string)", +"9491a8eb": "updatemktValue(uint256)", +"949201d7": "LOG_FailedSend(address,uint256)", +"94923fd7": "LogRevokeNotice(bytes32,address,uint256)", +"9492fbf7": "BGS()", +"94930138": "getLoanUnavailableAmount(bytes32)", +"949319b1": "verifyService(address)", +"9493242c": "returnLender(uint256)", +"9493ac07": "setBattleFee(uint256)", +"9493b9b0": "createMiner()", +"9493f012": "batchSafeTransferFrom(uint256[],address,address)", +"949430f0": "BTC_SUISSE_TIER_1()", +"94953294": "downTheDrain()", +"94954967": "setMaxWhitelistLengthInternal(uint256)", +"9495ad6c": "listExists(bytes32)", +"9495f8c6": "upgradableState()", +"9496df3f": "freezeQuorumPercent()", +"94974aea": "unlockedAtBlockNumber()", +"9497b7a1": "yearlyTeamAmount()", +"9498a265": "updateCertifier(address,address)", +"9498bef5": "overloadedMethod(address,uint256)", +"9498fb26": "ELIX()", +"94992b76": "ICOSTART()", +"94993e52": "_breedWith(uint256,uint256,address)", +"94996680": "setStartTimeStamp(uint256)", +"9499e018": "destructContract()", +"949a6868": "RefundTicket(address,uint256)", +"949a9d59": "receiveWithData(bytes)", +"949b56ef": "whitelistPrincipleLockPeriod()", +"949b9e10": "createHumanStandardToken(address[],uint256[],string,uint8,string)", +"949ba7c3": "GNCCrowdsale(address,address,address)", +"949c5099": "isAwaitingPRETDETokens(address)", +"949c89a0": "BitBaBeToken()", +"949cc9ea": "tokenSupplyBackedByGold()", +"949cfc64": "restTime(address)", +"949d225d": "size()", +"949db658": "rateProvider()", +"949dcdab": "forceWithDrawToInviter(address,uint256)", +"949dfa63": "calculatePurchaseReturn(uint256,uint256,uint8,uint256)", +"949e8acd": "myTokens()", +"949eabff": "fundsRaisedInWei()", +"949eb1c6": "bankersLimit()", +"949f80b0": "RandomExample()", +"949f80c5": "getResult(uint256,uint256)", +"94a08c69": "TOTALSUPPLY()", +"94a0b878": "fromTileId(uint16)", +"94a0c1cc": "cancelVoteForCandidateBySnapshotBlock(address,uint256,uint256)", +"94a1710d": "testNonOwnerCantBreach()", +"94a1be9c": "addVotes(uint256)", +"94a1d75c": "withdrawBidForSketch(uint256)", +"94a224c0": "withdrawExpenses()", +"94a2301e": "tokensInEth()", +"94a535fc": "TokenAdd(uint256,address)", +"94a53d41": "minimal()", +"94a5601a": "getMaxCap(address)", +"94a5c2e4": "maxValue()", +"94a5cccb": "deposit_period(uint256)", +"94a66da2": "GamePlayerCoin()", +"94a66df3": "objectGloves()", +"94a74249": "panicked()", +"94a754e0": "resolveChallenge(uint256,bool)", +"94a771d7": "getReportTimestamp()", +"94a7ef15": "addWhitelistAddress(address)", +"94a80dd9": "getPoolValue(uint256)", +"94a82671": "unRegister(address,string,address)", +"94a89233": "isPluginInterface()", +"94aa6775": "newDeposit(address,address,uint256)", +"94aa8174": "AddParticipant(address,address,string,uint8,string,string,bytes32)", +"94ab9608": "XRRtoken()", +"94abbeaf": "PieToken()", +"94ad4f89": "icoDays()", +"94ae2341": "exchangeHelenium(uint256)", +"94ae4899": "onMintCalled(int256)", +"94ae7ac3": "allowanceAdd(address,uint256)", +"94aef022": "getVariables()", +"94af9da8": "createNewCombination(address)", +"94b0780f": "burntokens(uint256)", +"94b2ffc0": "StarterCoin(uint256,address)", +"94b31fbd": "getTokenAllowance(address,address,address)", +"94b367a3": "_takeOwnership(uint256,address)", +"94b44f3e": "addressToBlock(address[],bool)", +"94b4c93d": "MomentalyOwned()", +"94b5255b": "distributePreBuyersRewards(address[],uint256[])", +"94b5c9f3": "getChampReward(uint256)", +"94b5ed6d": "minorOwnerShares()", +"94b66386": "attackIsland(uint256,uint256)", +"94b67b1c": "getWeakenedDefensePower(uint256)", +"94b8896c": "holdAddress2()", +"94b8e58e": "resetWith(address,address)", +"94b8e72a": "Allocate(address,address,uint256,uint256,bool)", +"94b918de": "swap(uint256)", +"94b91deb": "construct()", +"94b91f06": "PARTNERS()", +"94b941db": "investorInfo(uint256)", +"94b9b62f": "getPacifistmasterReq()", +"94b9bdc4": "BlueDiamond()", +"94b9f152": "cancelConversion(uint256)", +"94bab061": "getVersionNo(bytes)", +"94bacfef": "distributeVLD(address[],uint256,uint256)", +"94bb136f": "minFinnRequired()", +"94bb7d64": "itemHistoryOfPlayer(uint256,address)", +"94bbfb56": "changeAffiliatePercentage(uint256)", +"94bc7df4": "BlocksToGo()", +"94bcdb4c": "Example2()", +"94bd5cb6": "newParityOwner()", +"94bdb93b": "MessageAdded(address,string,uint256)", +"94be2423": "setAtomGen(uint256,uint8)", +"94beb9b2": "ConstructBitcoinClue(bytes32,bytes32,bytes32,bytes32)", +"94bf804d": "mint(uint256,address)", +"94bf8862": "numBoards()", +"94c06a58": "descending()", +"94c0ac22": "ExchangeZWCToToken(address,address,uint256)", +"94c0f3e2": "PRESALE_PERCENTAGE_5()", +"94c176e4": "distributeAll(uint256)", +"94c19fb8": "LogSaleClosed(uint256,uint256)", +"94c1d810": "partFromProvider(uint256,address)", +"94c21ff3": "STATEMENT_HASH()", +"94c275ad": "maxConversionFee()", +"94c33163": "getTotalTokensSold()", +"94c33d90": "districtToBuildings(uint256,uint256)", +"94c3fa2e": "getLastBlockHashUsed()", +"94c41bdb": "getPreferedQtySold()", +"94c467d0": "banAuditor(address)", +"94c475ec": "setAltDeposits(uint256)", +"94c4e3c6": "_getVolumeBonus(uint256,uint256)", +"94c6116f": "getNextPeriodTimestamp()", +"94c62fb5": "SPARCPresale()", +"94c64a2e": "updateBtcRate(string,string)", +"94c69715": "bonusInPhase3()", +"94c70cb1": "bonusEnd20()", +"94c77969": "setTokenContract(address,uint8[],bytes32[],bytes32[])", +"94c87a84": "withrawAllEthOnContract()", +"94c89af5": "FeeProvider()", +"94c8cd62": "AreebaCoin()", +"94c90cac": "EliteCoin()", +"94c9b647": "sendTransaction(address,uint256,int256)", +"94ca9f90": "highestBalance()", +"94cace04": "enableMix()", +"94cb0947": "availableTokens(address)", +"94cc0898": "___test()", +"94ccbc1f": "transferPattern(bytes32,address,string,uint8,bytes32,bytes32)", +"94cdbea1": "SetDappinfo(string,address,address,string,string)", +"94cddaf1": "unlockTeamAndReserveTokens()", +"94cec87b": "preSale3Finished()", +"94cf9b1b": "FGCToken()", +"94cfb3d8": "getItemTempHolders(uint256)", +"94d0025e": "getNumberOfOpenSteps()", +"94d008ef": "mint(address,uint256,bytes)", +"94d02fff": "Authored(string,string,uint8,uint256)", +"94d036bf": "validInitialBuyoutPrice(uint256,uint256)", +"94d10c41": "spendUserBalance(uint32,uint64)", +"94d127a8": "calculateSeedBuy(uint256,uint256)", +"94d1330d": "spinnerCounts(uint256)", +"94d1b7e8": "triggerFailFlags()", +"94d26cb5": "getBetterOrderId(bytes32)", +"94d2b21b": "unauthorizedAddress()", +"94d2bdfe": "addSkill(bytes32)", +"94d2ca12": "getByAlias(bytes32)", +"94d2d7a7": "getCreatorAddress()", +"94d3d38d": "registerHello(bool,uint8,int64,int64,string,string)", +"94d3de83": "TeamVesting(address)", +"94d44f12": "createBattle(uint256)", +"94d453db": "MIN_INVESTMENT_PHASE1()", +"94d45856": "placeBet(bytes32,bytes32,bytes32)", +"94d54581": "EICQERC20()", +"94d5539d": "transferLocked(address,uint256,uint256,uint256[])", +"94d63afd": "left3(uint256)", +"94d645a8": "resolveClaim(address)", +"94d702a4": "tgeNextPartInvestor()", +"94d762c3": "Vault(address)", +"94d77363": "getTokenSold()", +"94d95f8f": "MAX_CONTRIBUTION()", +"94d96fa1": "BTC7200on420()", +"94d9c9c7": "setObserver(address)", +"94d9cf8f": "CreateProxyWithControllerAndRecovery(address,address[],uint256,uint256)", +"94da0746": "PRESALE_TOKEN_ALLOCATION()", +"94dafb16": "geteam(address)", +"94db4d05": "changeStakingContract(address)", +"94dba872": "o_automata(uint256)", +"94dbc70e": "lockState(address)", +"94dbe74e": "removeEscrow(address,address,uint256)", +"94dc6f6b": "splitShares(uint256)", +"94dc7cec": "minBuyForPrize_()", +"94dc84ca": "AUTH_INITCONGRESS()", +"94ddc8c0": "submitBallot(bool)", +"94de3825": "_transferToAnotherAddr(address,uint256,bytes32)", +"94df682d": "loginVerify(bytes32)", +"94dfd38a": "test_invalidValue1EqValue2()", +"94e08fc2": "addProduct(bytes32,uint8,uint8)", +"94e09511": "sendTokenToPlatform(uint256)", +"94e0d371": "stage3()", +"94e0e328": "torchRunner()", +"94e0f844": "totalSellOrdersOf(address)", +"94e10784": "_getRate()", +"94e16386": "teammatesworld(address)", +"94e21fa0": "multiPay(address[],uint256[],address)", +"94e25c37": "unlockCustomer(address)", +"94e2662f": "setRequireWhitelistingBeforeDeposit(bool)", +"94e47e61": "create_block()", +"94e4a822": "split(address[])", +"94e4c808": "IPFSStore()", +"94e50e7a": "getSigner(address,uint40,uint40,uint128,uint256,uint8,bytes32,bytes32)", +"94e5b7e6": "getPlace(uint32)", +"94e5e890": "peculOldAdress()", +"94e8075d": "Development()", +"94e8767d": "uintToBytes(uint256)", +"94e93017": "_deployBallot(bytes32,bytes32,bytes32,uint256,bool,bool)", +"94ea9987": "sendEthersToWinnerAddress(address,uint256)", +"94eb463b": "Unset(address,uint32[])", +"94eba0b5": "StarCoin()", +"94ebd374": "purchaseAccessory(uint256,uint256,string,uint256)", +"94ec233f": "boolCallWithArray(bool,bool[4])", +"94ec3756": "resister(uint8,uint256,uint256)", +"94ec3a0d": "playersRequired()", +"94ec7cf2": "setA_Signature(int256)", +"94ed9b77": "append(address,address)", +"94eedaa4": "hirerReleaseFunds(bytes16,address,address,uint256,uint256)", +"94ef987e": "minimumPayment()", +"94efadea": "zoPrice()", +"94efafe9": "publishTemplate()", +"94effa14": "WithdrawETH(uint256)", +"94f0080c": "getBalancePremiumsPaid(address)", +"94f0b43c": "TripusCandyToken()", +"94f13f4a": "getGameItem(uint256)", +"94f183cb": "get_votes()", +"94f188be": "createIssuedToken(address[],uint256[],uint256,uint256,string,uint8,string)", +"94f29cb3": "medalIfFreeze(address)", +"94f2e623": "setLLV_edit_11(string)", +"94f2ed53": "_unlockNinja(uint256,uint16)", +"94f3217c": "MINIMUMINVESTMENTSALE()", +"94f38799": "GoChain()", +"94f3f81d": "removeAuthorization(address)", +"94f47146": "put(bytes)", +"94f5a1af": "LATOPreICO()", +"94f5ffd5": "betMake(uint256,uint8)", +"94f60a63": "getKudosLeft(address)", +"94f61134": "executeOrder(uint256)", +"94f649dd": "getDeposits(address)", +"94f6ba1c": "getMonsterClassBasic(uint32)", +"94f6e8ed": "initBallotProxy(uint8,bytes32,bytes32,bytes32[4])", +"94f75b96": "PerkToken()", +"94f7624f": "NAP()", +"94f8e954": "cancelInvestment()", +"94f92322": "getTotalPrediction(uint256,uint256)", +"94f976c3": "confirmProduct(uint256)", +"94fa3131": "claimBonus(uint16)", +"94fa5bcd": "setNewApproves()", +"94fabfb3": "getDocData(uint256)", +"94fb54d5": "euroThreshold(uint256)", +"94fb86c0": "referral_ledger()", +"94fd1c1c": "SAIToken(address,address,address)", +"94fdb8df": "HolyBible(uint16,uint16,uint16,uint16)", +"94fdbbb2": "createRedeemMessageHash(uint256,bytes4,bytes32,bytes32)", +"94fe344d": "SimpleToken(uint256,string,uint8,string,bool,bool)", +"94fe6ed1": "kTikTakCoin()", +"94ff1426": "_setTransmuterAddress(address)", +"94ff4b2b": "getServerFee(uint256)", +"94ffb819": "addApprover(address,string)", +"94ffe2c7": "PolicyRegistry(address)", +"95005a00": "LIANGToken()", +"95005b8b": "GetPlayerID(bytes32)", +"9500aa12": "MockController(address,address,address,address)", +"950108d7": "WithdrawForeign(address)", +"95029f34": "PendingOwner()", +"9502bb8a": "renounceMaster()", +"9502d761": "ProposalSubmitted(address,uint256)", +"950311ab": "setCurrentAction(uint256,uint8)", +"95032b62": "rand(uint256,uint256)", +"9503c4b4": "SmartRouletteToken()", +"95040933": "mrk_contract()", +"950463fc": "calculateRefundedEthWithDiscount(uint256)", +"9504f28a": "THBCToken()", +"95050862": "optimalExp(uint256)", +"95059465": "textFor(bytes32)", +"9505b2a7": "createPanda(uint256[2],uint256,uint256)", +"9506681f": "updateminContribution(uint256)", +"95066e33": "getTopic()", +"95068886": "change(address,uint256,address,uint256)", +"95069136": "requestLiquidation(uint256)", +"9506a57a": "Marriage(address)", +"9506a75c": "setChild(address,bytes32,bytes32,bool)", +"9507b53a": "SchedulableToken(address,uint256,uint256)", +"9507d39a": "get(uint256)", +"9508614b": "addStage()", +"9509a265": "allocateDividends()", +"9509ba0c": "getJackpotBalance()", +"950b5273": "currentARXtokenSupply()", +"950b550a": "fourth_withdrawal(uint256)", +"950c004d": "PiXD2019()", +"950c3d79": "LizunToken()", +"950c84e4": "presalePart()", +"950cb89e": "_editPriceOf(uint256,uint256,uint256)", +"950d22f2": "setCheckKYC(bool)", +"950da0c8": "calculation()", +"950da0e6": "hasMinRating(address,address,uint8)", +"950dad19": "burnToken(address)", +"950dff20": "cancelCodeUpdate()", +"950ef8c7": "setAuthorityContractAddress(address)", +"950f4170": "gubbermentOverthrown()", +"950f9813": "rejectPartnerAllocation(address)", +"950fabf3": "Lottery(uint256)", +"95101181": "removeAdminAddress(address)", +"9511309a": "setMinimumCollateralInEthAmount(uint256)", +"951166c0": "totalMessages()", +"9512243e": "TokenPurchase(address,address,uint256,uint256,uint256,uint256,uint256)", +"95127634": "upgradeOracle(address)", +"951303f5": "withdrawableAmount()", +"951367ad": "internalExchange(uint256)", +"951382bf": "mainSaleHasEnded()", +"95139780": "checkTokTotal()", +"951481b4": "addEmployee(uint256,uint256,string)", +"951506d3": "withdrawFeeRateE4()", +"9515a524": "BUSINESS_DEVELOPMENT_SUPPLY_LIMIT()", +"9515af55": "AetherClockAuction(address,uint256)", +"95163f39": "_finalizeStage()", +"9516a104": "getAllAddresses()", +"951717e2": "withdrawPrivateCoinByMan(address,uint256)", +"9518589a": "cost1token()", +"95199b24": "claimWin(bytes32,uint8,bytes32,bytes32)", +"9519e398": "aDeposit(uint256)", +"951b01c5": "setCertifierDb(address)", +"951b22fb": "swap(uint256,address,address,uint256,uint256,uint8,bytes32,bytes32)", +"951b26a3": "changeable()", +"951b73b1": "updateEndTimeManually(uint256)", +"951cfa47": "getScope()", +"951d0332": "_price_tokn_ICO1()", +"951d6c9c": "getDevRewardPercent()", +"951d86a4": "setBlockPerHour(uint256)", +"951e17a1": "totalSupplyForDivision()", +"951ea5f1": "setMarketingTokensPercent(uint256)", +"951f4a6e": "_triggerNFTEvent(address,address,uint256)", +"95206396": "numberLoop()", +"9520a06f": "DEFAULT_CREATION_LIMIT()", +"9520bd46": "multiPay(address[],uint256[])", +"9520cc72": "EtherTradex()", +"9520f878": "NaxomartToken()", +"9521000c": "setOnlyShowPurchased(bool)", +"95210e59": "setBattleRemoveContractAddress(address,address)", +"95217ec9": "newAttack(uint32[])", +"9522ca89": "Message_To_Investors()", +"9524bdf8": "_refundTokenCustomer(uint256,uint256)", +"9525c0cc": "cancelVote(bytes32)", +"9525f382": "finalizeSettingCreation(uint256)", +"95260a29": "PEP()", +"95263183": "setACmarge(uint8)", +"95270cd1": "setOraclizeFee(uint256)", +"95275e5e": "minerLockTime()", +"95286077": "UBETCOIN_LEDGER_TO_LEDGER_ENTRY_DOCUMENT_SHA512()", +"952868b5": "onMaintenance()", +"9528724f": "votedFreeze()", +"952882fd": "addtoEarlyInvestors(address,address,uint256,uint256)", +"9528a278": "getAllInvestorPositions()", +"9528d109": "authorSigned(address)", +"9528fcb5": "numSubscribed()", +"952a84ed": "Rocketship()", +"952a9320": "HexanCoin(uint256,string,uint8,string)", +"952ad7cb": "forwardSomeFunds(uint256)", +"952b264c": "FundsReleased(uint256)", +"952c0f9f": "initGold()", +"952d6c22": "tokenSaleEnd()", +"952f2f6f": "setAccountIsFrozenByDate(address,uint256)", +"95306706": "logTraderTradingTx(string[])", +"953078cd": "withdrawDivsWithContract(address)", +"95311142": "dOwnerErc20Claim(bytes32)", +"9531c536": "ReceivedGBP(address,uint256)", +"9531d072": "refundETH(uint256)", +"953203b5": "doMigration(address)", +"9532c476": "setParcelUsd(uint256)", +"953307d8": "revealScissors(string)", +"95331bf7": "commitPhases()", +"95334db2": "toIndex(address)", +"953440f9": "nCeilings()", +"9534e637": "closePoll(uint256)", +"9535ce12": "getBool(string)", +"95360a02": "calCurrentCrystals(address)", +"95364a84": "isPresale()", +"953669be": "tokenHolders()", +"9536c05f": "doCheckSendBounds()", +"9536e0bb": "returnDirectPayments(address,bool,bool)", +"9537796f": "addSubscriptionBonus(address)", +"95377ad9": "testInequalityUint(int256)", +"9537e8d1": "signContract(uint256)", +"9538833c": "changeOwnerAccept()", +"9539c4de": "withheldAmount(address,address)", +"9539ed7e": "changeFlipper(address)", +"953a03ca": "minMillPurchase()", +"953a7fab": "testMoveBalance()", +"953aa435": "GetPrice(uint8)", +"953b42b3": "buyClusterToken()", +"953b7ef8": "withdrawTeamTokens()", +"953b8fb8": "targetAmount()", +"953bad32": "verificationAddressMap(address)", +"953e3450": "DaoRulesProposalAdded(uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"953e474a": "setKoCommissionAccount(address)", +"954056f7": "setRedemptionWallet(address)", +"9540cb80": "End1()", +"9541945a": "registerNode(bytes16,uint16)", +"9541bc41": "getUSDAmount(uint256)", +"954290f4": "guessPassword(address,uint256,bool)", +"95437056": "AUTH_ADDOWNER()", +"95438548": "DONATION_RATE()", +"95441f9f": "ZEEWANTtoken()", +"95449ad5": "changeTimeInvest(uint256)", +"9545c42c": "minForExistingTopic()", +"95470497": "OTHERCRUISER_EXTRACTION_BASE()", +"95475c1f": "makeChild()", +"9547b44d": "Prepurchased(address,uint256,uint256)", +"95480879": "setDefaultMetadataURI(string)", +"9549355e": "oracalizeReading(uint256)", +"954969f6": "godSetInterfaceContract(address)", +"9549c330": "freezeFrom(address,uint256)", +"9549fea9": "MENSA(address)", +"954a5c19": "addPot()", +"954a8f8b": "TransferWithRef(address,address,uint256,uint256)", +"954ab4b2": "say()", +"954b2be9": "SelflleryYouToken()", +"954cbe3f": "mintSpecial(string,string,uint8,uint256,uint256)", +"954d2cfd": "updateUrl(address,bytes32[5])", +"954db474": "newProject(string,string,uint256)", +"954e8c2d": "buyShares(uint256,address,uint256,uint256)", +"954f3b20": "getTransferHash(address,address,uint256,uint256,uint256)", +"954ff2ad": "founderTokenWallet()", +"9550c023": "AllocationRevoked(address,address,uint256)", +"9551dd58": "listener()", +"955214d1": "LogRecordWin(address,uint256)", +"95522e54": "WeaponTokenize()", +"95523f7d": "newMember(string,uint256)", +"95533f17": "isTokenInList(address)", +"95534e00": "getAccountBlocks(address)", +"95535569": "LianBaoCoin()", +"9553652b": "Goldencloudtoken()", +"9553a19b": "BrengsTeamToken()", +"95543693": "ONE_DECIMAL_QUANTUM_ANZ_TOKEN_PRICE()", +"9554a202": "changeSwapperAdd(address)", +"9554c8e5": "getCrydrStorageAddress()", +"9554f920": "fillChannel(uint256)", +"9554fa12": "multiplies(uint256,uint256)", +"9555a942": "withdrawFrom(address,address,uint256)", +"9555c9d9": "capAdjusted()", +"95564837": "seed(uint256)", +"9556a31d": "GVOptionToken(address,string,string,uint256)", +"9556b05d": "OraclePoloniex()", +"95578ebd": "useDELEGATECALL()", +"95579063": "_bidderHasAnActiveBid(address,uint256,address)", +"9558abde": "sycCrowdsale()", +"9558e916": "teamWithdrawalRecipient()", +"9559225c": "debug_hash3Byte(bytes)", +"955b1535": "checkForNewLeader(uint256)", +"955b5e72": "CTCToken()", +"955d14cd": "getLastTime()", +"955d1721": "availableBalanceInLockingPeriodForInvestor(address)", +"955d4412": "addLocation(uint256)", +"955d4d16": "Wixlar()", +"955d50b7": "TestMasterToken(uint256,string,string)", +"955ef429": "closedown()", +"955f0460": "sgpc(uint256)", +"955ff603": "Viviox()", +"95607ced": "retrieveAll()", +"95608083": "_abortCurrentRound()", +"95612ec0": "allowInvestment()", +"95617dc3": "reportGame(string,uint8,bytes32,bytes32)", +"9561a038": "nextContributorIndex()", +"9561f0d8": "setTradingLive()", +"95621ccd": "theBet(uint256,uint256,uint256)", +"95623641": "marketAddress()", +"956248aa": "determinePayout(uint8,uint8,uint8)", +"95635b37": "addMiner(address,uint256,uint256)", +"9563dbcf": "setPeriods(uint256)", +"95645e34": "initialDistribution()", +"956483c1": "lastBlock_f14Hash_uint256()", +"95648f1b": "getFunctions()", +"95652e4f": "revokeAuthority(address,uint256)", +"95655f04": "getWilds(address)", +"9565f2fe": "AllCash()", +"9565feeb": "isBonusPeriod()", +"9566880b": "s16(bytes1)", +"95669952": "debtor(address,uint256)", +"95671958": "getFileListTail()", +"95671ed7": "logEvent(string,bool)", +"9567a161": "newBet()", +"95693aad": "CompositCoinCrowdsale(uint256)", +"956a2d03": "balance(bytes32,string,address)", +"956a2ea7": "setBidRegistry(address)", +"956a538a": "CoinsRemainAfterICO()", +"956a860d": "getMartialInfo(uint256)", +"956ab5d9": "getParetoBalance(address,address)", +"956b76f7": "setVicepresidenteDeMesa(bytes32,uint256,uint256,bytes32)", +"956cc859": "INIT_SUPPLY()", +"956d2172": "setAttackFee(uint256)", +"956e5f00": "LogEtheraffleChange(address,address,uint256)", +"956e958a": "dungeons(uint256)", +"956f4361": "getCampaignsByCountry(string)", +"956fd9df": "balanceOfPlayers(address)", +"956fffd3": "setFinishICO(uint256)", +"95701be3": "rolloverFeePeriodIfElapsed()", +"9570370f": "bondsOf(address)", +"95709441": "mintReputation(int256,uint256,address,address)", +"95722371": "storeX(uint8[],uint256,uint256,uint256,int256)", +"95722e66": "payPool()", +"95725d8a": "emitRoleAdded(address,uint8)", +"957287ce": "market2()", +"9574f4e1": "createMatch(string,string,uint256,string)", +"957563ec": "setProviderLock(bool)", +"95761c77": "SBCS()", +"9576b180": "initGoldData(uint256,bytes32,bytes32,bytes32)", +"9576bfbd": "setWhiteLister(address)", +"9576e5b3": "registerContract(address,bytes32,bool)", +"9577941d": "LogKill(bytes32,bytes32,address,address,address,uint128,uint128,uint64)", +"9578bce2": "setCreditsTokenPrice(uint256)", +"957908d1": "dequeue()", +"95792430": "grant(address,uint256,uint256,uint256,uint256,uint256,bool)", +"957a2772": "lastBlock_f9()", +"957a6254": "bonusScheme()", +"957aa3d1": "goldmintTeamAddress()", +"957aa58c": "live()", +"957ac9ad": "HappyBeeToken()", +"957b2807": "getPlayerPlayInfo(uint256,uint256,uint256)", +"957b2e56": "reinvestDividends()", +"957b52fb": "fidaPerEther()", +"957b781c": "mintBonus(address)", +"957b8d98": "publicsaleTokens()", +"957bb1e0": "bid(bytes32)", +"957c0ff2": "testNoTokensOneCall()", +"957d8250": "allocateBid(address,bytes32)", +"957dcb1e": "mintReservationTokens(address,uint256)", +"957e05d6": "setAllowTransferLocal(bool)", +"957f050b": "merchantAccount()", +"957f120e": "inPublicPreSalePeriod()", +"957f371f": "totalAmountOfEarlyPurchasesWithoutBonus()", +"957f9a0b": "tryFlush()", +"95803d6c": "STARTING_BULLS()", +"95805dad": "start(uint256)", +"9580811c": "setBalanceAdmin(address,uint256)", +"9580c4bc": "migrateFunds()", +"95816a16": "contributionCap()", +"958174a3": "ParentToken(uint256,string,uint8,string)", +"95818603": "fromTweiToFp(uint256)", +"958222aa": "isTokenTransferable()", +"95829738": "institutions(bytes32)", +"9583102a": "verify_send(address,uint256)", +"958343f9": "setOrderDealSpeed(uint256)", +"9583cf17": "claim_period()", +"9584894c": "getElementInfo(uint256)", +"9584fbfc": "TOKEN_SHARE_OF_TEAM()", +"9585a877": "isGameActivated()", +"958689d7": "emitMintEvent(address,uint256)", +"95878da6": "CurrentICOpublicSupply()", +"958799cb": "recordPurchase(address,uint256)", +"95880360": "setExchangeRatePreIco(uint256)", +"9588378e": "reputationOf(address,bytes32)", +"95883871": "TradeListing(address,address,address,uint256,uint256,bool)", +"958993a5": "allocatePrivatePresaleTokens()", +"958a3698": "setITTMultiSig(address)", +"958a41dd": "upgradeToAndCall(string,address,bytes)", +"958a9937": "createProduct(bytes32,uint128)", +"958b12b9": "ICOCap()", +"958b3f20": "final_fundraise()", +"958b6f55": "checkTokenVesting(address,uint256)", +"958c4be7": "makeCollectibleUnavailableToSale(address,uint256,uint256,int256,uint256)", +"958ce2d5": "Spoke(bytes16,string)", +"958d1725": "getChild(bytes32,uint256)", +"958e0028": "SoarCoin()", +"958f3624": "totalTokenWinValue()", +"958fde82": "newPinnedAppInstance(bytes32,address)", +"95907291": "CaptureTheFlag(string)", +"9590d4b9": "testCount()", +"9590ef13": "Option(string,string,uint8,uint256,address)", +"95910d46": "ownerPrimary()", +"95925814": "undo_deadline()", +"95929d22": "_updateNextAmount()", +"9592d424": "totalNodes()", +"95930b1c": "getAssetPacksUserCreated(address,address)", +"95932df3": "addCustody(address)", +"9593aa9a": "JTOKEN()", +"95949823": "setRemark2(string)", +"959499b6": "withdrawProfit()", +"95955d22": "escrowTransfer(address,address,uint256,uint256)", +"9595898a": "updateCard(uint256)", +"95966c3b": "get_eth_balance(address)", +"95969ba4": "enabledAddresses(address)", +"95977749": "IvoryTest()", +"95978868": "strConcat(string,string,string,string,string)", +"95980858": "currentText()", +"95982228": "Multiowned(address[],uint256)", +"95982f44": "GetLottery(uint8)", +"9598790d": "priceTokenSellWei()", +"95988a26": "proposalsRank()", +"95997c51": "withdraw(uint128,address,uint256)", +"9599ab63": "crowdsaleBonus(uint256)", +"959a1f08": "Hive()", +"959ac484": "push(uint256)", +"959b3fa0": "createSkin(uint128,uint256)", +"959b6916": "setCollectTokenTime(uint256)", +"959b8c3f": "authorizeOperator(address)", +"959c265b": "makePlayerID(address)", +"959ca192": "createCoupons(uint256)", +"959cb555": "address_register(address)", +"959d51f6": "W3SchoolToken(uint256,string,string,uint256)", +"959e4748": "totalIssuanceLastModified()", +"959e90ff": "totalTransactionCount(address)", +"959f601e": "getLimitMaxCrowdsale()", +"95a01505": "presaleStorageVault()", +"95a039ba": "getContractAddress(string,string,string,string)", +"95a078e8": "hasAccess(address)", +"95a08221": "tokensTotalSupply()", +"95a0f5eb": "totalMigrated()", +"95a0f9c7": "removeOffer(uint256)", +"95a1297a": "totalRewardsRedeemed()", +"95a13ff3": "polyComplianceAddress()", +"95a1c14d": "addThreeWayLine(uint256,string,uint256)", +"95a2251f": "redeem(address)", +"95a235ae": "set_deposit_address(address)", +"95a23c3a": "adminsPercent()", +"95a2d14b": "IcoCloseTime()", +"95a3bf6e": "getPayoutRequestedState()", +"95a3e2af": "isAddressFrozen(address)", +"95a47652": "getMintingStatus()", +"95a4f76d": "maxSaleNum()", +"95a50a9d": "monarch()", +"95a51233": "totalSupplyCeiling()", +"95a51669": "buyWithETH(address,uint256)", +"95a5418d": "_patternToNumber(bytes4)", +"95a59ac4": "PacificaToken()", +"95a5dfc0": "yes(uint256,string,uint256)", +"95a6f9ab": "makeProposal(string,uint256,uint256,uint256,uint256,address)", +"95a70863": "setOwner(uint16,address)", +"95a8c58d": "hasRole(address,uint8)", +"95aaa5d9": "BatakToken()", +"95ab32a3": "securityPercent()", +"95ad3d98": "ConnectCoin()", +"95addb90": "questions(bytes32)", +"95adfe72": "getPlayerPrice(uint256)", +"95ae0bf9": "extCreateNinja(uint256,uint256,uint256,uint256,address)", +"95ae66a5": "MilestonePricing(address,uint256,uint256[])", +"95af7006": "setFirstBonusPercent(uint256)", +"95afc05c": "withdrawRefunds()", +"95b1157d": "setLockAccount(address,uint256)", +"95b18bbe": "Created(address,uint256,uint256)", +"95b1e4f2": "addClaim(uint256,address,uint256,bytes32,bytes32,string)", +"95b1f93b": "changeStakerOperation()", +"95b2110a": "queryAirCrash(string)", +"95b25a1c": "Biograffi()", +"95b2d128": "TokenFund(address)", +"95b34f71": "_getTokens(uint256)", +"95b3559f": "CertifyDelegate(address)", +"95b3c92f": "TioToken()", +"95b3dc77": "setTransferableTime(uint256)", +"95b4b88d": "allowanceSub(address,uint256)", +"95b505f0": "getMigrateOutReporterValue()", +"95b537d5": "selfOn()", +"95b5d5ac": "token_ask(address,uint256)", +"95b68fe7": "getTokenToEthInputPrice(uint256)", +"95b6a08d": "canDisburseMultipleTimes()", +"95b71187": "getByFromCount(uint256)", +"95b7c348": "ICOCappedRefundableCrowdsale(uint256,uint256,uint256,address,address)", +"95b7ea26": "GetMaximumBet_ether()", +"95b7f0aa": "_removeAuction(address,uint256)", +"95b890d6": "purchaseTokensWithoutDevelopmentFund(uint256,address)", +"95b8cf55": "signalBackupWithdraw(address)", +"95b8fdef": "setCompte_22(string)", +"95b96e11": "PeriodEnd(uint16,uint256,uint64)", +"95b9bb68": "setCompositionAddress(address)", +"95ba64c9": "LogForbid(bytes32,bytes32,bytes32)", +"95bad022": "countTeam()", +"95bb733b": "CurrentCrowdsale(uint256,uint256,uint256,uint256,address,address,address)", +"95bb8d46": "publicSaleTransfer(address[],uint256[])", +"95bb9fcf": "getHolding(uint256)", +"95bbbe45": "transferFundWalletWallet(address)", +"95bc2673": "remove(bytes32)", +"95bc3bd0": "lockAmount(address)", +"95bc7eec": "payFunction()", +"95bc8515": "setHolder(address,uint256)", +"95bc9538": "changeStatus(uint8)", +"95bda19d": "register(address,uint256,address)", +"95bda742": "_create_user(address,address)", +"95bdca94": "isTyped(address,uint256)", +"95be55a6": "increasePrice_20_February()", +"95be7542": "CoinLLeague()", +"95be9ace": "NewDeal(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool,string)", +"95c02700": "ACN()", +"95c08f92": "investmentOf(address)", +"95c0954c": "ownerOfUUID(string)", +"95c0c3f6": "confirmGameEnded(bytes32)", +"95c0c447": "getLimitTypeOf(address)", +"95c0d65c": "editRank(uint256,uint256,uint256)", +"95c0e6c3": "transferOwnershipAtomic(address)", +"95c21ebf": "blueOs()", +"95c26d93": "thirdTierDiscountUpperLimitEther()", +"95c2d845": "driveCar(string)", +"95c303bc": "pyramid(address,uint256,bytes32)", +"95c30910": "unFreeze(address,address)", +"95c3be0b": "participantIndex(uint256)", +"95c3fc9b": "_setPowerBalanceOf(address,uint256)", +"95c43d84": "PHASE2_SUPPLY()", +"95c47416": "VoteOnMyTeslaColor()", +"95c4e59b": "AXIACOIN(address,address)", +"95c55798": "WZCoinToken()", +"95c5a2cc": "halfPercent(uint256)", +"95c5ed9d": "getVoterStatus(bytes32,address)", +"95c6fa61": "keyOf(bytes32,bytes32)", +"95c7a23f": "AutoBuy()", +"95c7b007": "setFreezeTx()", +"95c8d4ee": "grantAllocation(address,uint256,bool)", +"95c92d98": "viewTotalAffiliateCommissions()", +"95c93f8b": "setTierRates(uint256,uint256,uint256,uint256)", +"95c96554": "cancelVote()", +"95c97432": "nSubmittedHashes()", +"95c9f53f": "scaledDividendPerToken()", +"95cc2e8b": "DATE_ICO_START()", +"95cc74fe": "buyFromPartner(address)", +"95ccea67": "emergencyWithdraw(address,uint256)", +"95ccf8bf": "forward(address,address)", +"95cd73a2": "OpCoin()", +"95cd76fa": "getMaxOwners()", +"95ceb4b3": "winningProtocal()", +"95d12000": "ownerPercent()", +"95d22683": "MyUserName(string)", +"95d2b4b4": "_createMonster(uint256,address,uint256,bool,bool,bool)", +"95d38ea8": "mintableToken()", +"95d395dd": "XDToken()", +"95d47f2f": "lastBlock_f8Hash_uint256()", +"95d4f7dd": "primaryGasLimit()", +"95d5766c": "foundersContract()", +"95d5a1be": "SignatureReg()", +"95d5f6fd": "officialSite()", +"95d643a8": "earnings()", +"95d6718a": "grantOf(address)", +"95d697c4": "ProofOfReadToken(uint256,uint256,string,uint8,string)", +"95d793d9": "deposit(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)", +"95d84b30": "_replaceContract(address)", +"95d84d99": "setColorPurple()", +"95d89b41": "symbol()", +"95d8f60d": "sumHardCapICOStage6()", +"95d9a030": "externalControllerCandidate()", +"95d9cc18": "setStdOwner(address,address)", +"95db03fe": "krypteum()", +"95dba6c9": "getHealthForCost(uint32)", +"95dbee2d": "gift(address,address,uint256)", +"95dcac25": "IGTSGD()", +"95dd489b": "winningsPerRound()", +"95dd9193": "borrowBalanceStored(address)", +"95ddb3a6": "setJewelContract(address)", +"95de00a2": "getReservedDestinationInfo(address,bytes32,address)", +"95dea05b": "cleanActions(bytes32[])", +"95e05110": "sumHardCapICOStage3()", +"95e16e97": "validateraffle()", +"95e19fab": "setup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256[],uint256[],uint256[])", +"95e1d9f7": "getGamesForAdmin(address)", +"95e2a953": "etherRatioForInvestor()", +"95e2c773": "privatePreICOdepositors(address)", +"95e2db3d": "getDistributionContracts(address)", +"95e396f9": "crowdsaleTokensWallet()", +"95e3c50b": "tokenToEthSwapInput(uint256,uint256,uint256)", +"95e3cd5c": "preAllocation(uint256,uint256)", +"95e4c1bf": "hasConfirmedRecord(bytes32)", +"95e4d456": "DUNGEON_CREATION_LIMIT()", +"95e517be": "Offer(address,string,address)", +"95e52d98": "documentsCount()", +"95e66ea1": "isLeftTokenIssued()", +"95e77a05": "testItemStrict(bytes)", +"95e7b3c5": "angelRate()", +"95e87385": "availableRef()", +"95e8a67e": "toB32(bytes,bytes)", +"95e8d644": "requestRemoveOwner(address,string)", +"95e8f3e7": "get_hash()", +"95e911a8": "feeBase()", +"95eb84c0": "takeLoanOrderOnChainAsTraderByDelegate(address,bytes32,address,uint256,address,bool)", +"95eb8f15": "Attempt(address,uint256)", +"95eced5f": "ZToken(uint256,string,string)", +"95ecef72": "gSetRunning(bool)", +"95ed857c": "mintPredefinedTokens()", +"95ee1221": "isCancelled()", +"95ee4cfd": "set_percentFeeTimes5(uint256)", +"95ee8bae": "getInt(address,bytes32)", +"95eeb240": "disableApproval()", +"95ef9178": "setTokenSaleContractAddress(address)", +"95f0684b": "getPackageNameHash(uint256)", +"95f0f107": "_setBridgeAmount(uint256,address)", +"95f11ce6": "deleteCandidate(address)", +"95f1260b": "balanceToWithdraw()", +"95f16de8": "companyWithdraw()", +"95f17bce": "cancelCost()", +"95f20e88": "RANDCRYPT(uint256,string,string)", +"95f22405": "getImageInfo(uint256)", +"95f28272": "salesTokenHolder()", +"95f382bc": "depositVault(uint256,uint256)", +"95f47e4e": "setRegulatorAccessLevel(address,uint8)", +"95f5784f": "FIBASK()", +"95f59fe1": "vote(string,string,string)", +"95f62fb9": "registerDevices(bytes32[],bytes32[],bytes32[])", +"95f847fd": "transferToContract(address,uint256,uint256)", +"95f9432d": "ThankYouToken()", +"95fa7430": "get_iconiq_tokens(address,address)", +"95fbdcd9": "MeshToken()", +"95fbfa0d": "testBurningUndistributed()", +"95fc6354": "PLAYER_START_PERIODS()", +"95fc799f": "allocateRestrictedTokenToPartner(bytes32,bytes32,uint256)", +"95fcb00d": "addVesting(address,uint256)", +"95fdc999": "getFlag(uint256)", +"95fdd612": "hasRequested(bytes32,address[])", +"95fe0e65": "createD(uint256)", +"95fe27d3": "SmartCripto()", +"95fe4608": "revokeCert(bytes32,bytes,bytes32,bool,uint256)", +"95fe5234": "setSubnodeOwner(bytes22,address)", +"95fe6865": "checkIfCanUseTokens(address,uint256)", +"95fe6f1d": "isAddressReserved(address)", +"95ff24e3": "SellTokens(address,uint256,uint256,uint256)", +"95ff3cc1": "getMyApples()", +"95ffff09": "getMyBananas()", +"960024ff": "rebuyStarted()", +"96002aef": "offerProductOwnership(bytes32,address)", +"9600ead9": "RESELLING_UNLOCK_COUNT()", +"9600ec92": "transfer(address[],address,uint256[])", +"9600f294": "refundTokenPayment(uint256,address,string,uint256,address)", +"9601065d": "reachedMajority(uint256)", +"96013c9c": "testLatestPkgGetter()", +"960173b5": "aliceClaimsDeposit(bytes32,uint256,uint256,address,address,bytes20)", +"9601deb8": "LogTransferOwnership(address,string)", +"96023032": "updateContractAddr(string,string,string,string,address)", +"9602339d": "AlfaTowerShares()", +"96023cbf": "registraToken(bytes32)", +"96026d61": "BucketAndValuationAndCommitted(uint256,uint256,uint256)", +"9602bb20": "AMBTICO()", +"9602e9d5": "withdrawDev()", +"960384a0": "getValue(string)", +"96038f8f": "ICO_Graphene()", +"9604702a": "matchExistingBids(bytes32)", +"960491d7": "setNextRndTime(uint32,uint32,uint32)", +"9604a24b": "getPoolCapSize(uint256)", +"960524e3": "getInvestorCount()", +"96063049": "rollDice(uint8)", +"96066cf9": "MintConfirmed(uint256,address,uint256)", +"96069ee1": "CIPToken(address,uint256)", +"96074e70": "addBeneficiary(address,uint256)", +"9607610a": "withdrawFor(address,uint256,uint8,bytes32,bytes32)", +"960787a2": "sendFoods(address[500],uint256[500])", +"9607a1db": "claimShare(uint256,bool)", +"9608088c": "setAddress(address,address,address,address)", +"960834f4": "dAddBallot(bytes32,uint256,uint256,bool)", +"9608740e": "verifyBid(uint256,bytes32)", +"9608e9df": "DataWasRecorded(address,uint256,bytes32,uint256,string)", +"960954af": "chargeAdvertisers(address[],uint256[],address[],uint256[])", +"960983f4": "addArtifact(string,string,bytes32)", +"9609e488": "TootyrCrowdSale()", +"960a48ae": "createPreIco(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"960a57fc": "SHA256HashRegister(bytes32)", +"960ba088": "createFinancialStrategy()", +"960bfc9b": "_owns(address,uint64)", +"960bfe04": "setThreshold(uint256)", +"960d3f56": "impl_mining(address,uint256,bytes)", +"960d8cd3": "testFailUpdateLatestRevisionNotOwner()", +"960d94bb": "get_presale_goal()", +"960e55a8": "ChannelCloseRequested(address,address,uint32,uint192)", +"960e80b7": "trans()", +"960ecf0c": "addNewStage(uint256,uint256,uint256,uint256,uint256)", +"960fa70f": "synthGenes(uint256,uint256)", +"96102d7d": "ownerSetWallet(address)", +"9610b1bc": "resumeTokenTransferFromAddress(address)", +"9610e068": "GetAskingUnitPrice()", +"9610f0e6": "pveBattleFee()", +"96119f12": "SkribbleToken()", +"9611bfc5": "_getExistingTileAt(int32,int32)", +"96131049": "withdrawal(address)", +"96132521": "released()", +"9613bc90": "isEvolvementAllowed(uint256,uint256)", +"9613e19b": "createAuction(uint256,uint256,uint256,uint32,uint32)", +"96147933": "ContractEnabled()", +"9614c769": "setDesc(string)", +"9615ecb2": "wasSuccess()", +"9616b410": "incFreezeIndex(uint256)", +"96176797": "LogTransition(bytes32,uint256)", +"96178c20": "totalSupply2()", +"9617d90d": "cartaxiToken()", +"96186b6e": "MAX_PERCENT_OF_PRESALE()", +"961891d5": "changeEscapeController(address)", +"9619367d": "minBet()", +"961a16f2": "secondExchangeRate()", +"961a9218": "setLLV_edit_17(string)", +"961a929c": "gasPriceLimit()", +"961b16a1": "addInTeamBalanceMap(address)", +"961b2b96": "assignBountyAddresses(address[])", +"961be391": "cash()", +"961c2470": "refundRoots()", +"961c9ae4": "createAuction(address,uint256,uint256,uint256,uint256)", +"961cc569": "airdropReceiversLimit()", +"961cd8ce": "ticketsForWithExcess(uint256)", +"961d1284": "isRefundingEnabled()", +"961d30cc": "getMasterNodesDates(address)", +"961d3cd3": "setExclude(address,bool)", +"961e99d9": "startBuyBackTwo()", +"961f1d96": "RANGESTART_3()", +"961ffc68": "GatewayInterfaceAddress()", +"9620b995": "transfterForProjectManagement(address,uint256)", +"96214735": "setDeployer(address)", +"962174b6": "LotteryClaveChain(address)", +"9621bcf7": "publishTaskListing(string,address,uint256,uint256,uint256,uint256)", +"9621f497": "SetMaxAirDropXblock(uint256)", +"96221dc9": "mulX(uint256)", +"962318b8": "teamKeepingPercentage()", +"96242f41": "getFrontEndTokenSupply()", +"96246eb8": "Zmbc()", +"9624e534": "setBlockDotNumber(uint256)", +"9625a6c6": "hardLimitICO()", +"9627bf02": "preIcoEndsAtChanged(uint256)", +"96283310": "setHouseAddressShare(uint256)", +"96284fb6": "getNizkStruct()", +"96286cc9": "isTokenOwner(address)", +"96289427": "transferRestTokensToOwner()", +"9629da17": "withdraw(uint64,address,address[],bytes32[],address[],uint256[])", +"962a64cd": "convert(string)", +"962aab81": "blockEnded()", +"962ba36f": "quarantine(address,address[],uint256[])", +"962ba969": "ExceedIOToken(uint256,string,string)", +"962c9898": "SOLUSToken()", +"962c9c8d": "MAX_VOTED_TOKEN_PERC()", +"962ca53e": "Cosby()", +"962d0c72": "overRaisedUnsend()", +"962dae57": "getPriceContract()", +"962ffeae": "totalCurrentFunders()", +"9630961d": "createRole(bytes32,address[])", +"9631c1bd": "FounderFeeInPercent()", +"9633303f": "setSrc(address)", +"96344d05": "creatorRequestFundTransfer()", +"963476e5": "listBackers()", +"9634ef56": "start_of_report_period()", +"9635024c": "TANDER()", +"96354f6d": "BONUS_ICO_STAGE1_PRE_SALE3()", +"9635eaf7": "fundsToAddress(address,uint256)", +"9635fc2c": "yahooOracleUrl(bytes32)", +"963630a3": "ETGOLDToken()", +"963632d3": "Prosperity()", +"96365d44": "poolBalance()", +"96370fa2": "savePic(string)", +"963749b6": "calculateWinnerPrize(uint256,uint256)", +"963812c3": "createItemId()", +"96382f0b": "gameStatus(bool)", +"96383c04": "setPrice(uint256,uint8)", +"96386ab3": "myMethod2(string)", +"96389bd7": "OwnedController(address,address)", +"9638a89c": "DataRecordIndexStructs(uint256)", +"963a9a13": "startInvite()", +"963c0724": "Lucky()", +"963c1121": "set_pre_kyc_iconiq_bonus_numerator(uint256)", +"963c11df": "totalScammed(address)", +"963c3397": "winning_year()", +"963c6017": "postGoldPeriod()", +"963d62fb": "tokenLossRatio()", +"963dd1dd": "Diatom()", +"963de4d2": "GetBet(uint256,uint256,bool)", +"963e2680": "setMinSiteTipPercentage(uint256)", +"963e49c7": "FindCarrot()", +"963e63c7": "minValue()", +"963f2334": "settleCaller(address,address,uint256)", +"96401470": "TutorialToken(uint256,string,uint8,string)", +"96406391": "setTokenDistribution()", +"9640da30": "ethRedeemed()", +"96419497": "PAXToken(bool)", +"9642a19c": "optInGas()", +"9642ccdf": "functionName(bytes20,address)", +"9642ddaf": "testMint()", +"9643aef4": "testControlCreateWithParentSameNonce()", +"9644fcbd": "changeMembership(address,bool,string)", +"96450a6d": "walletWithdraw()", +"9645337a": "removeOrder(uint256)", +"9645bae5": "newAuction(uint256,uint256)", +"964620d2": "TheMostPrivateCoinEver()", +"96463fc6": "createTrade(uint256,uint256)", +"96468249": "getFoundation(address)", +"96469132": "setPonziPriceInWei(uint256)", +"9646b85d": "getMintableAddress()", +"9646df4d": "presaleEnds()", +"9647259c": "dividendDistribution()", +"9647df97": "TES()", +"9648c9f4": "sessionId()", +"9649650c": "removeBank(address)", +"96497258": "withdrawOverdraftTokens(address,uint256)", +"964997a4": "MoacSupply()", +"9649ccaa": "updateSubscriptionOffer(uint256,uint256)", +"9649d98b": "restrict()", +"964a4ac7": "ULTRA_HERO_MULTIPLIER()", +"964ad434": "TIER1_CAP()", +"964afe08": "addSomething(uint256)", +"964b97de": "box2Star5()", +"964c0b40": "ExtensionCalled(bytes32[8])", +"964c7d84": "addressToBlock(address,bool)", +"964c836c": "receiveExecutionNotification()", +"964ecc09": "forceRefunding()", +"964f61f9": "getCosigner(uint256)", +"964f6dcd": "Elephant()", +"964f8fba": "totalDinoSold()", +"964fad94": "fundingGoalOf(uint256)", +"964fb96d": "test_init()", +"965232c0": "getTotalAllowed(address)", +"9652389c": "setPreSaleOn()", +"9652713e": "runSigned(uint40,uint256,address)", +"96532d1c": "mintingAllowed()", +"9653dee5": "tokenSwap()", +"9653f8a1": "etherBalances(address)", +"965447d9": "toPowerOfTwoThirds(uint256)", +"965582d6": "requestNewID(string,string,string)", +"9655943e": "validMCAmount()", +"9655e4b0": "sellIdeas()", +"965693ee": "TicketsPurchased(address,uint256[],uint256[],uint8[])", +"96574919": "removeStakerFromArray(address)", +"96577caa": "getLowWinPercent(uint256)", +"9657f8ad": "TopiToken()", +"96581de1": "registerPayments(address[],uint256[],uint256[])", +"9658522c": "createPlayerOnAuction(uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8,bytes,string,uint256)", +"96594efb": "WorldBit(address,bytes2,bytes2,uint256,uint256,string,string,string,string)", +"9659867e": "mintCount()", +"965a324e": "OxShelterEye()", +"965a3b7e": "targetDemographics()", +"965a79fb": "getAllJobs()", +"965acc73": "setCampaignBudgetById(bytes32,uint256)", +"965b0cc4": "signedApproveAndCallCheck(address,address,uint256,bytes,uint256,uint256,bytes,address)", +"965b2bae": "setFinancierParticipationAdd(address)", +"965b5aa8": "paySolutionRewardGoodRep(address,uint256)", +"965b71bc": "cfoWithdraw()", +"965bdf33": "SetAuditedAssetSize(uint256)", +"965be457": "registerApp(bytes32,address,bytes4[],address[])", +"965beae8": "bulkTokenSend(address[],uint256)", +"965c643f": "setReference(bytes32,string)", +"965c90e3": "getNodeByIndex(uint256)", +"965edec5": "_publishSecret()", +"96603e88": "hotPotatoHolder()", +"9660ab3a": "setContractUser(address,bool)", +"9660aeeb": "isMatching(int256,int256,int256)", +"96617ba4": "ClientsNotified(string,string)", +"966203e7": "Product(bytes32,bytes32,address[],int256,int256,address,address)", +"9662355e": "generateAttestForDelegationSchemaHash(address,address,uint256,bytes32,bytes32,uint256[],bytes32)", +"96637b10": "getEscuela(uint256)", +"9663871f": "recursiveRound(uint256,uint256,uint256)", +"9663a496": "awardBronze(address,address,address)", +"9663f88f": "getBlockHash()", +"96642cfc": "_isAuctionExist(uint256)", +"9664ca94": "date_string(string,int8,int8,int16)", +"9664d2d9": "resourceIndex(address,bytes4)", +"9665688e": "setGame(uint256,uint256,uint256,uint256,uint256,uint256)", +"966588d4": "cloneWithTwoPops(uint256,uint256)", +"9665b658": "changeExecutor(address)", +"9665ef09": "bitmask_show(address)", +"9665f170": "pregnantEtherDogs()", +"96661b04": "closeDataResponse(address,bool)", +"9666856d": "stopList(uint256)", +"9666cbfa": "getDeployedMatches()", +"9666e1f9": "isCosignerSet(uint256)", +"966704c2": "autoTransferLocked(uint256,uint256)", +"96682704": "TransferToReferral(address,uint256)", +"96686560": "Setup(string,string)", +"96687919": "_preSaleSupply()", +"9668b281": "AKContract()", +"966933ce": "DURATION_PER_VESTING()", +"96696da8": "getHives()", +"966a1961": "get_time()", +"966a360c": "newExchange(address,uint256,address,address,uint256)", +"966a3b29": "setJMETHExchangeRate(uint256)", +"966a7dca": "payOrder(string)", +"966aa252": "addProperty(bytes32,bytes32,bytes32,bytes32,bytes32,uint256,bytes32,bytes32,uint256)", +"966acb38": "testThrowTransferNotTransferable()", +"966aeece": "changeWhitelister(address)", +"966b3514": "contract_address()", +"966b7d91": "AdminChangedFundingWallet(address,address)", +"966dae0e": "factoryAddress()", +"966dcd26": "intertransfer(address,address,uint256)", +"966e6ead": "DefaultReleaseCalled()", +"966edae7": "lastBlock_a3()", +"966f697c": "_getSubscription(bytes32,address)", +"966ff650": "totalBurnt()", +"9670078c": "burnDNC(address,uint256)", +"9670591b": "giveAwayHoldership(address)", +"9670c0bc": "getPrecision()", +"9671ef91": "WEI_TO_INSIGHTS()", +"9673d6a3": "events(string)", +"96744afb": "ADDR_TEAM_TOKENS_ACCOUNT()", +"967506be": "deleteTokenAddress(address)", +"9675bb9c": "totlePrimary()", +"967743a8": "unlock20Done()", +"96778446": "addVestingUser(address,uint256)", +"967826df": "maxAllowedManualDistribution()", +"96784f45": "balanceOf2(address,address)", +"9678a1e8": "ProxyCreated(address,address)", +"9678df74": "MerlinCash(uint256,string,string)", +"9678eb05": "SafeDiv(uint256,uint256)", +"9678fb88": "TACTICALCRUISER_MAX_CARGO()", +"96793725": "registerWallet(address,address)", +"9679dd7d": "tokenLeft()", +"967a08f7": "raiseTransferEvent(address,address,uint256)", +"967b2692": "SaleCount()", +"967b3c21": "unitEpicGrowth()", +"967c33b3": "Deployer()", +"967dd0ae": "orderFor(address)", +"967e6e65": "getAge()", +"967e8611": "placeCube(uint64,uint64,uint64,uint256,uint256)", +"967f1cc6": "ownerPause()", +"967ff23e": "blocks()", +"96800dfd": "updateCap(string,uint256)", +"96817396": "bonus20end()", +"96821fc1": "MAX_MILESTONE()", +"96834e36": "ownerSetStandardFee(uint256)", +"9683d11d": "OHWOWW()", +"9683fe3e": "create(address,bytes32,uint256,address)", +"9684da1a": "createGenesisUniverse()", +"9684fe92": "interestCycleLength()", +"9685e736": "stopAvatarCreation()", +"96862e2d": "PattyCoin(uint256,string,string)", +"968790d0": "reclamaPagamento()", +"96879353": "CreateIco(address,uint256)", +"968803e3": "CYC()", +"96881d20": "CoinParkToken()", +"968858c8": "tokenreward()", +"9688738b": "TokenContract()", +"968908a3": "createMarketMaker(uint256,uint16,uint256)", +"968997fb": "FootballToken(uint256,string,uint8,string)", +"9689ac95": "TYPE_NOT_AVAILABLE()", +"9689e535": "CBCC()", +"968b12aa": "Crowdsale(uint256,uint256,uint256,address,uint256)", +"968bb12c": "setLegalFileLink(string)", +"968bd60d": "LogSendReward(address,address,string)", +"968be45d": "MYPPToken()", +"968c15de": "inscription(uint256)", +"968d1cff": "percentForCommunity()", +"968d73d8": "start_service2(uint256,address,uint32)", +"968d901b": "getCurrentGame()", +"968ed600": "totalFunds()", +"968f0a6a": "getBidBySiteIndex(uint8,uint256)", +"968f9dc3": "EtherReserved(uint256)", +"968fc02a": "DogRace()", +"9690be37": "deleteGame(bytes32)", +"9690caa6": "Umint21()", +"9691a8bf": "changeIndividualCapInWei(uint256)", +"969235a4": "getSaleStart()", +"969283e2": "availableVolumeEnclaves(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", +"969295ae": "changeReferral(address)", +"96934e88": "isReward()", +"96937617": "Rpct()", +"96938d5b": "watchedAddress()", +"969464f6": "isCauldronExpired(uint8)", +"9694f039": "founderSupply()", +"96957869": "verifySignature(bytes32,uint8,bytes32,bytes32)", +"9695e3c0": "EOMarketToken()", +"9696e59a": "totumPhases()", +"9696ef66": "SLOTS()", +"9696fbf5": "Daschain(uint256,string,string)", +"96974e47": "setMinAllowedBetInTokens(uint256)", +"96984631": "RANGESTART_10()", +"9698d611": "setSaleManageContract(address)", +"9699ca16": "getPublicKey(bytes32,uint8,bytes32,bytes32)", +"969ac477": "PRIZE_POT_PERCENTAGE_MAX()", +"969be87e": "testGetNewItemId()", +"969bece3": "setRegionOnSale(uint16)", +"969bf358": "getCurrentTokenSaleId()", +"969ca0eb": "scavengeEscrow(uint64)", +"969cb4da": "changeSubmissionPrice(uint256)", +"969cb7c3": "getPublisher(uint256)", +"969d5b94": "changeMultiSigWallet(address)", +"969da324": "updatedEtherPrice(string)", +"969ddd71": "getMaxCap(address,uint256)", +"969e3756": "exchange(address,address,uint256)", +"969ea336": "maximumInWei()", +"969eb430": "updateVerifiersPerShard(uint256)", +"969ef40d": "updateFinishFlag()", +"969f1af4": "addMinerQuest(address)", +"969f8a83": "getConfirmations(bytes32)", +"969fa9d2": "EmergencyWithdrawalSucceeded(address,uint256)", +"969fbf12": "contructor()", +"96a04925": "retreiveTokens(address)", +"96a16793": "changeOraclizeAccountingSettings(uint256)", +"96a1e85c": "get_total_quantity()", +"96a34fc7": "exchangeToken(uint256,address,address)", +"96a44d35": "devuelveApproles(bytes32)", +"96a49d60": "getCircle()", +"96a51fde": "OilVisionShare()", +"96a566be": "PartnersNotSet(uint256)", +"96a625a5": "plantcToken()", +"96a68b91": "makeUndestroyable()", +"96a69d04": "totalSquareStakes(uint256,uint256)", +"96a6a748": "POHStopTime()", +"96a70169": "tradeETH(uint256)", +"96a77176": "setPresaleTwo()", +"96a7cf6a": "callDestruct()", +"96a80699": "postAllocateAuctionTimeMints(address,uint256,uint256)", +"96a942c7": "minTokenPurchaseAmount()", +"96a952a5": "setInstallmentsLoanData(uint128,uint256,uint24,uint40,uint32)", +"96a9df88": "_withdrawAirdrop(uint256,bytes)", +"96aa6305": "totalNotCompleted()", +"96aab4f6": "setBountyAddresses()", +"96ab97a5": "hasVested(address)", +"96ac591e": "postICO(address,address,address,address,address,address,uint256)", +"96ad4131": "getRequiredAdmin()", +"96ad6c8a": "deposit_address()", +"96ad704a": "addToken(address[16],address,uint256)", +"96adad2e": "sellStores()", +"96adfe42": "mintWithData(address,uint256,bytes)", +"96ae44f6": "addAcceptedArbiter(address)", +"96afb365": "reclaim(bytes32)", +"96afc450": "emissionRate()", +"96afccb3": "withdrawDonation(uint256)", +"96b01c37": "warriorToOwner(uint256)", +"96b116c6": "statusDoacao()", +"96b1348a": "claimTokenFunds(address)", +"96b1e4d4": "isFreeze(bytes32,bytes32)", +"96b2c923": "changePlatformWithdrawAccount(address)", +"96b47f0d": "soldOnStage()", +"96b55f7d": "tierCount()", +"96b58ac8": "tokensLeftForSale()", +"96b5a755": "cancelAuction(uint256)", +"96b5c5f4": "FeeWallet(address,uint256,uint256)", +"96b5f7b6": "ParallelWorld()", +"96b6af5a": "submitCustodianDoubleSign(address,uint256,bytes32[],uint256[],bytes32[])", +"96b76c23": "stand(uint256)", +"96b828b4": "Lock(uint256,uint16)", +"96b86436": "foundersAllocatedAmount()", +"96b86e1d": "PLCRVoting(address)", +"96b90b05": "Apex()", +"96b9a9d0": "medalBoostAndBurn(uint16,uint64)", +"96bb1fef": "claimStakingRewards(address)", +"96bba9a8": "slashSmallUsername(string,uint256)", +"96bc0f94": "onlyAdminsFriends()", +"96bc1a89": "getLockedAmount_investors(address)", +"96bc2287": "PRE_FUNDING_GOAL()", +"96bc3f3a": "getForecastScore(uint256)", +"96bc4a40": "bsWallet()", +"96bc5ab7": "setOracleURL(string)", +"96bcf236": "am_i_on_the_whitelist()", +"96bd09a1": "edit_safe(address,string,string)", +"96bd8dae": "transferAllowance(address,uint256)", +"96be8878": "team2Balance()", +"96bf15bf": "gamePrice()", +"96bf4ed5": "TOTAL_TOKENS_FOR_CROWDSALE()", +"96bf5022": "MRIDUL()", +"96bfc229": "isInWhiteList(address)", +"96c0fb8b": "setWhiteListInBatch(address[])", +"96c108c9": "assignToBeneficiary(address,uint256)", +"96c12acb": "Fuck()", +"96c14d92": "closeContract(bytes32,bytes32,uint256,uint256,uint64,uint64,bytes32,bytes32,bytes32,uint64)", +"96c16735": "UselessAirdroppedToken()", +"96c237b4": "getDeedInfo(address)", +"96c266ca": "developersKey()", +"96c28881": "fundraise_max()", +"96c2d498": "XTL()", +"96c2d4c9": "totalTipForDeveloper()", +"96c36170": "icoEtherBalances(address)", +"96c38294": "getETHUSD()", +"96c52fc3": "____forward(address,uint256,uint256,bytes)", +"96c5406d": "tokenFree()", +"96c5743a": "test03AliceBuyToken()", +"96c5ea93": "icoBeginDate()", +"96c62b27": "BalanceBook()", +"96c72144": "GrimReaperAddress()", +"96c74715": "NBW()", +"96c7a2a3": "BlockRxToken(uint256)", +"96c81be5": "unicornsOf(address)", +"96c824a8": "createAccountFundContract()", +"96c82e57": "totalWeight()", +"96c85b59": "TestBancorFormula()", +"96c8da45": "oneTokenInEur()", +"96ca7653": "LottixTest()", +"96cb4bc5": "RESERVED_ECOSYSTEM_GROUP()", +"96cc7be7": "updateCeleb(uint256,uint256[6],uint256[6])", +"96ccacb0": "hour_blocks()", +"96cdb027": "InstallerEscrow()", +"96ce0795": "denominator()", +"96cea3f7": "confirmWithdrawTransaction(uint256)", +"96ced078": "getPlayerNumbersInGame(uint256,address)", +"96cf5227": "changeLockTime(uint256)", +"96cfd124": "signedTransferHash(address,address,uint256,uint256,uint256)", +"96cfda06": "getCourseCount()", +"96cff3df": "getMinimumCallCost(uint256,uint256)", +"96d002a0": "subFundBalance()", +"96d02099": "rsplit()", +"96d122ea": "getStoreAddress(string)", +"96d195bd": "getWitnesses()", +"96d1c952": "filterBuyers(bool)", +"96d28e00": "spinDeposit()", +"96d2ede5": "preBalanceOf(address)", +"96d3196b": "getSumActiveToken()", +"96d373e5": "cast()", +"96d37936": "finishTokenMinting()", +"96d43cc6": "getMinimumFundingGoal()", +"96d46500": "ICO_CAP2()", +"96d4cb9b": "FipsRegistration(bytes20,address)", +"96d4d091": "advisorAddress()", +"96d4ebf1": "finneyPerToken()", +"96d4f640": "createOrder(address,uint256,address,uint256,uint256)", +"96d6401d": "TRANSFER_PROXY()", +"96d66cf8": "expertsAccount()", +"96d6c134": "coreVUPDestination()", +"96d7a9ed": "_menu(bytes32)", +"96d7f3f5": "lastTimeMinQuorumMet()", +"96d811b7": "TokenVesting(address)", +"96d8b050": "claimTokensToOwner(address)", +"96d8f4f3": "minimumDonation()", +"96d8fe3b": "_updateHistory(address,address)", +"96d92a72": "changeRNGenerator(address)", +"96d99568": "MMMTokenCoin()", +"96d9a881": "manualDeleteEditionBids(uint256,address)", +"96da1fba": "sendETHToContributionWallet(uint256)", +"96da2848": "gasForCLI()", +"96dbab81": "stub()", +"96dbad1e": "sellCityForEther(uint16,uint256)", +"96dbb486": "updateFinishTime(uint256)", +"96dbbc5f": "Token_Description()", +"96dbe56e": "ImpCore(address)", +"96dc461f": "setBountyTokensCount(uint256)", +"96de0c20": "_makeWithdrawForPeriod(bytes32,uint256)", +"96de56d2": "getPlayerFlips(address,uint256)", +"96de6caa": "qtyValidators()", +"96de9c8c": "cnyBtcRate()", +"96dea936": "proposalData(uint256)", +"96df3540": "TLD_NODE()", +"96dfa78b": "price_per_eth()", +"96dfcbea": "checkState()", +"96dfcc21": "weAreClosed()", +"96e05fdb": "PaymentAccepted(address,bytes8,uint256)", +"96e0ef33": "send(address,address,address[],uint256[])", +"96e1a657": "timeBetweenEditions()", +"96e264ff": "ownerSetPayOutDivisor(uint256)", +"96e332f3": "mainSaleMaxTokens()", +"96e438a1": "reclaimDeposit(uint256)", +"96e4ee3d": "convert(uint256,uint256)", +"96e4f67d": "icoEtherReceivedMainSaleDay()", +"96e50a8c": "saveNonce(uint256)", +"96e583a9": "getLetter(uint256)", +"96e6e65f": "ETCN(uint256,string,string)", +"96e76fa7": "Unregistered(string,uint256)", +"96e83a40": "refund(uint256,address,address)", +"96e8cace": "dripMe()", +"96e8d14c": "newRecord(string,string,string)", +"96e9df8d": "deployNewContract()", +"96e9f6f2": "lastBlock_v12()", +"96ea7487": "Opacity()", +"96ea76b7": "OnWithdrawTo(address,address,uint256,uint64)", +"96ea8b9c": "referralPercentage()", +"96ea9f49": "FundTransfer(address,uint256,uint256,uint256,uint256)", +"96ebabba": "distributeSuccessfulCampaignFunds(uint256)", +"96ebfb89": "generalManager()", +"96ec1ca2": "tipUser(bytes32,bytes32,bool)", +"96ec6fec": "APP()", +"96ec7114": "COMMUNITY_SALE_START()", +"96ecf3c4": "subtractFrozenBalances(address,uint256)", +"96ed10a4": "issuePOIs()", +"96edb898": "callTokenFallback(address,address,uint256)", +"96ee03d6": "__concat(string[6])", +"96eecf95": "saleSuccessfullyFinished()", +"96ef7aa0": "cash_transfered(string)", +"96efbb9b": "getActiveItemAt(uint256)", +"96f099bc": "preSaleTokenRaised()", +"96f0aa8f": "findNextSecond(uint256,bytes)", +"96f1370d": "TotiMed()", +"96f17aa5": "potTarget()", +"96f2710d": "managerOn(address)", +"96f27b29": "getContract(bytes32,uint256)", +"96f36997": "CLIBUXCoin()", +"96f392f4": "elixir()", +"96f42876": "buyerAddressTransfer(address,address,address)", +"96f429ba": "stateIsFinishedReplay(uint256)", +"96f47800": "investInternal(address,uint128)", +"96f494d1": "printCourse0(uint256)", +"96f6706f": "cancelOfferBob(uint256)", +"96f68782": "right62(uint256)", +"96f74e88": "setOrganizationName(string)", +"96f76f11": "contractFinished()", +"96f7807a": "getDuel2(uint256)", +"96f93e65": "Expire(address,address)", +"96f9cffa": "shareBonus()", +"96fb2e62": "Party(string,address,string)", +"96fbab31": "getZombiesFullInfoByOwner(address)", +"96fc00c2": "setPresale(uint256,address,uint256[])", +"96fc2256": "verify(address,uint8,bytes32,bytes32)", +"96fcbf65": "numOfSampleTypes()", +"96fcd214": "slaveServer()", +"96fd1c42": "flush(address,uint256)", +"96fd1df7": "isEndedTrack(uint256)", +"96fd550a": "betWithCredits(uint64)", +"96fe1338": "storageTime()", +"96fe5418": "contestEndTime()", +"96fe6e74": "external_oraclize_randomDS_setCommitment(bytes32,bytes32)", +"96fedaf7": "extraMinted()", +"96fef3f1": "submitTransactionToken(address,address,string,string,uint8[],bytes32[],bytes32[])", +"96ff0306": "retireWildHard(uint64,uint64,uint64,uint64,uint64,uint64)", +"96ff4483": "setTokenAsideAddresses(address,address,address)", +"96ff7631": "SetupYOU(string,string,uint256,uint256,uint256,address,address,uint256)", +"96ff7e97": "requestIdentity()", +"96ffa690": "countLocalRecursive(uint256)", +"96ffac0b": "setupRace(uint256,uint256,address)", +"97004255": "aliceClaimsPayment(bytes32,uint256,uint256,address,address,bytes)", +"9700d0f0": "stage_2_TokensSold()", +"970129be": "getCardInfo(uint256)", +"9702795d": "REFERRAL_SHARE_RATE()", +"97028899": "play(bytes1,bytes1)", +"97034ed0": "get_HoldersProfit(address,uint256)", +"970388b5": "setContractActive(bool)", +"9703ef35": "cancelBid(uint256)", +"9703fa2e": "airdropQty()", +"9704122c": "getFeeAmount(uint256)", +"97046afc": "burnProvider(address)", +"970574ac": "lnUpperBound32(uint256,uint256)", +"9705a592": "getUnprocessedQueryCount()", +"97062e8a": "ico3Bonus()", +"9707f708": "Totalsupply()", +"970875ce": "currentSnapshotId()", +"9708e250": "maxSellCap()", +"9709709a": "MomentumToken()", +"9709cdbc": "getExchangeGroupsKeyAt(uint256)", +"9709d040": "NewPayroll(address)", +"970a5fa8": "exchangeRateIdx(uint256)", +"970afd9b": "MAXIMUM_64_BIT_SIGNED_INTEGER_VALUE()", +"970db3df": "SPECIALIST_STAKE_TWO()", +"970e5904": "safeGetPartialAmountCeil(uint256,uint256,uint256)", +"97100be9": "setLiveTx()", +"97107d6d": "setProxy(address)", +"9710f014": "completeStatus(string)", +"971130b5": "MulaCoin()", +"9711715a": "snapshot()", +"9711e944": "Queue(uint256)", +"9711f20d": "isSanctuary()", +"971217b7": "values()", +"9712a57e": "purchasePotato(uint256)", +"9712a764": "takeBounty()", +"9712da8b": "getCompte_20()", +"97135d19": "santai()", +"971362c9": "partnerWithdraw()", +"9714378c": "extend(uint256)", +"97145273": "setHidden(address)", +"9714a27c": "miningOneFree()", +"9714f05c": "_minimumContribution()", +"9715a81f": "SurvivalRanchTestCoin()", +"9715d80e": "getCanShareProfitAccounts()", +"9715f05d": "OBSERVER(uint256,string,string)", +"97169426": "Owned1()", +"9717137a": "TLN_TOKEN_NAME()", +"97172664": "getIcoAddrCount(uint256)", +"97173a7a": "referalPayCount(address)", +"971751af": "lockAndDeliverTokens(address,uint256,bytes1)", +"9717ae9d": "DTCC_ILOW_5()", +"9717b2ae": "DividendsTransfered(address,uint256)", +"9717d76f": "getCandidatePosition(address,uint256)", +"9717df19": "fillFromQueue()", +"97187ac8": "coinSaleStarted()", +"9718b524": "newTreasury(address)", +"9719f290": "lockTeamTokens(address)", +"971a3593": "updateClosetime(uint256)", +"971a9091": "crystal()", +"971a9a29": "CbxeToken()", +"971b2b2e": "getFreelancerFeedbackOn(address,uint256)", +"971bd1b4": "estimateDistribution()", +"971c803f": "getMinimumStackCheck()", +"971ccc16": "addERC20Token(address)", +"971d2bd8": "getProposalByHash(bytes32)", +"971dbe0e": "getNbrOfPartyFor(address)", +"971e668f": "updateTokenToEthOrder(uint32,uint128,uint128)", +"971e80cb": "setWallet()", +"971ec3ce": "globecoin()", +"971f34a1": "SellPriceChanged(uint256)", +"971fe56b": "poolWeight()", +"971fff63": "setAdsStorageAddress(address)", +"972030bb": "mixGenesRabbits(uint256,uint256,uint256)", +"97203543": "getGuestCount()", +"972041e4": "getTokenTime(uint256)", +"97204d8e": "delegateProxyImplementation()", +"972072a2": "resolveChallenge(string)", +"9720dd5a": "kBit()", +"972161f7": "getFullState()", +"97217085": "maxBetDoubleDice()", +"9721dd4c": "GoldenChain()", +"972205d4": "Untethered(address,string,string,uint256,uint32,uint32,uint256,uint256,uint256)", +"97227325": "simulate_ico()", +"9722cdc6": "EarningsWithdrawal(uint256,address,uint256)", +"97235a1e": "receiveToken(address,uint256)", +"97246156": "HoQuBurner(address)", +"9724fc95": "getTotalProposalsCount()", +"9725b4a5": "BOXIcoin()", +"9725bd80": "preIcoEnded(uint256,string)", +"97267ae9": "startDividendDistribution()", +"972711cc": "KoreaShow(uint256,uint256,address,address)", +"97271615": "contract_newOwner()", +"9727e379": "addMeter(uint32,string,string)", +"97294e58": "register(address,string,address)", +"97296421": "joinTheHunt(string,string)", +"972973e7": "setOfferPrice(uint256)", +"97297467": "checkAndVerify(bytes)", +"972993e6": "b2bcToken()", +"97299d8a": "lendingDays()", +"9729d040": "_slashPower(address,uint256,bytes32)", +"9729ec26": "generateWarrior(uint256,uint256,uint256,uint256)", +"9729f9b9": "getBlockComission(uint256)", +"972ab95a": "bennylamToken()", +"972afc80": "ownerSetEmergencyStatus(bool)", +"972c169e": "datboiSupply()", +"972ca383": "MONTANATOKEN()", +"972d1ae2": "_getNextTokenId()", +"972e6151": "operationalReserveAddress()", +"972fa53f": "createTeam(string)", +"97304ced": "mintTokens(uint256)", +"973069f8": "transferRemaining(address,address,uint256)", +"97306c27": "getData3(uint256,uint256,uint256,uint256)", +"9730b305": "burnTokens(uint256,address)", +"9731a897": "famedStarMassToIds(uint256)", +"9733348a": "ProdToken()", +"9733dc79": "ManagerContract()", +"97346423": "HCOIN()", +"9734855d": "WhitelistAddressenable(address)", +"973516f2": "getH1Amount()", +"973549ea": "_setAddress(bytes32,address)", +"973628f6": "currentEra()", +"97365a0b": "safe(uint256,string,string)", +"97365df2": "sameOdd()", +"9736a590": "DistributedTokens(address,uint256)", +"9736aeb4": "OwnershipTransfered(address)", +"97374d89": "preIcoAllocation(uint256)", +"97379c32": "CBIX(string,string,uint256,uint8)", +"9737bc41": "ShineCoinToken(address,address,uint256,string,uint8,string,bool)", +"9738418c": "getVersions(bytes32)", +"973880e8": "getMinesInfo(uint256[])", +"973882e9": "returnPollStake(address,bytes32)", +"97388497": "getNumberOfRequests()", +"973885c0": "test_setMaxSize_decreaseSize()", +"9738968c": "canUpgrade()", +"9738b602": "getElementInfoView(uint256)", +"9738f92c": "transferLogicAuthority(address)", +"97391e2d": "PurchaseMade(address,bytes8,uint256)", +"9739203b": "view52()", +"9739951c": "tokenEmission(address,uint256)", +"9739db9d": "createOwnershipOffer(address)", +"973ad270": "removeArbitrator(address)", +"973b56e8": "MIN_FREEZE_DURATION()", +"973bc8cf": "getParticipantsChannel(address,address)", +"973cbc75": "testFailAppendTranch()", +"973d641e": "SplitPayment(address,address)", +"973dbfb7": "withdrawalValue()", +"973e315b": "setMigrateFromLegacyReputationToken(bool)", +"973e9b8b": "getAllowance()", +"973e9c5c": "Radiance()", +"973ea9d5": "team2Address()", +"973f6129": "adminArray(uint256)", +"973fcaef": "SIMCOIN()", +"973fe7ef": "secondWeekBonus()", +"97409192": "addRequest(uint256,string,string)", +"9740e4a2": "left87(uint256)", +"9741efe4": "currentBankroll()", +"974207fb": "logfolio(bytes32)", +"974238fd": "CreditMC()", +"97425a54": "ANMFutureVesting()", +"9742ca46": "setMiner(address)", +"9742d64a": "destroyBeneficiary(address)", +"974317dc": "ThreeDL()", +"9743ad98": "totalReservedAndBonusTokenAllocation()", +"9743c6c3": "joinMain()", +"9743dfc1": "jesterAutomaticCollectFee()", +"9743efe5": "kin()", +"974463d6": "ronerToken()", +"9744a1b1": "depositWithToken(bytes,uint256,uint256,uint256,uint256)", +"9745ac4d": "getResponseUint(int256,uint256,bytes32)", +"9745ad9c": "stageIT()", +"974626b4": "LotsaFucksToken()", +"97463b75": "getPOOL_edit_27()", +"974654c6": "finishPresale()", +"974654f4": "requiredGas()", +"9746f42b": "getBalanceTeam(address)", +"9747145b": "claimStorageForProxy(address,address,address)", +"974811fb": "tokensToEthereum_1(uint256,uint256)", +"9748334b": "PskERC20()", +"97487af8": "TOTAL_SUPPLY_ACES()", +"9748a3f2": "getOpenProposals()", +"9748bf5b": "bucketValue(bytes32)", +"9748db00": "DragonKing(address,address,address,address)", +"9748dcdc": "punish(address,address,uint256)", +"97495cce": "rate_toTarget()", +"974a832d": "rejectCertificate(uint256,uint256)", +"974b2525": "removeBurningMan(address,uint256)", +"974bd64b": "PromissoryToken(bytes32,address,uint256)", +"974c86b5": "Buy()", +"974cf025": "lockDonationReceiver()", +"974e7dc9": "_getWeekTotalStake(uint256)", +"974ee3bb": "_updateLockUpAmountOf(address,address)", +"974ef924": "parseBool(string)", +"974fa121": "GiveAnAngelCS(uint256,address)", +"974fd2f3": "setLastBattleResult(uint64,uint16)", +"975057e7": "store()", +"97508f36": "pollNonce()", +"97514d90": "sellOrder(uint256)", +"97518f74": "_OmnesCoinToken()", +"975289fd": "getPriceVolume(uint256)", +"9752bcd3": "guaranteedBuyersLimit(address)", +"9752f163": "deployAgent()", +"975347b8": "removeAddressFromAccessControl(address,uint8)", +"97537bdf": "BotCoin()", +"9753a84e": "PCHAlN()", +"9754a4d9": "grantVestedTokens(address,uint256,uint64,uint64,uint64,bool,bool)", +"9754a7d8": "pauseSell()", +"97557f6a": "QTB(string,string,address)", +"9755a710": "hasWinner()", +"97566aa0": "getMintDigest(uint256,bytes32,bytes32)", +"97567579": "getTokenWithdrawalAllowance(address,address)", +"975739a5": "maxKudosToMember()", +"9757e8a3": "customerCount()", +"97584b3e": "_hasAvailability()", +"9758af1e": "doesEntryExist(bytes32)", +"9758fd0d": "closeChannel(bytes32,uint256,address,uint256,address,uint256)", +"9759512b": "LogRefund(uint256)", +"9759c160": "BuyCore(address,uint256,uint256)", +"975b123e": "get_firstbytes(bytes,address)", +"975bad75": "_createCountryId(uint256)", +"975be231": "emitPricesUpdated(uint256,uint256)", +"975c2308": "getHeir(uint256)", +"975c5cab": "getSanageLink(uint256)", +"975c95da": "ICO_PERCENTAGE_5()", +"975dfff9": "monsterIdToTradeable(uint256)", +"975e001a": "tokenBonusForForth()", +"975e463a": "addInvoice(address,uint256,uint256,uint256)", +"975e76b3": "transferAdvisorsToken(address,uint256)", +"97603560": "rescueTokens(uint256)", +"9760b450": "_Stand()", +"97614302": "playCount()", +"976160fa": "SetDesignatedRouterSRV(bytes32,uint256,bytes,bytes)", +"9761cd63": "reduceHatchCooldown(address,uint256)", +"97623b58": "removeContract(string)", +"97624631": "assertEq(bytes,bytes)", +"9762737a": "remove_branch(uint256,uint256,uint256)", +"9762e9ea": "icoStartedTime()", +"9762f802": "hardCapReached()", +"976371c9": "_isTokenOwner(address,uint256)", +"9764053b": "_price_tokn_ICO2()", +"9765b4d7": "autoSend()", +"9766178c": "tradeDealRequested()", +"97668720": "set_centralAccount(address)", +"97672729": "releaseLockedTokens(uint8)", +"97679646": "whitelistMinTok(address)", +"9767dae8": "userWithdrewWei(address,address)", +"9767fff7": "setImageOwner(address[16],uint256,address)", +"976898c7": "bid(string,string,string,string)", +"976934ac": "dCHF()", +"9769eacf": "setBuyOpen(bool)", +"9769f0b0": "sellToken()", +"976a0b82": "vettingTime()", +"976a77b6": "freeForCarrots(uint256)", +"976a8435": "units()", +"976b01c0": "setNotRetractable(bytes20)", +"976b59b5": "ElyxrShrimpFarmer(address)", +"976bd47d": "LOOMIA2()", +"976bdba4": "makeOrder(address,address,bytes32,uint256,uint256)", +"976c3d04": "calculateTokenPrice(uint256,uint256)", +"976d00f4": "auditSecret(bytes32)", +"976d16d5": "getTotalAccessories()", +"976d36d0": "totalSupply1()", +"976e0da9": "getNextPrice(uint256)", +"976e14d6": "salePriceWei()", +"976f37fd": "lowCompose(uint256,uint256)", +"976f6c92": "lastBlock_a19Hash_uint256()", +"976fcda7": "WithdrawlRemainingPAT()", +"97709cde": "ARK_VOTER_1_00(uint256,uint256,uint256,uint256,uint256,uint256)", +"97709ce7": "setRaffleAddress(address)", +"977174ff": "normalRoomMax()", +"9771ccc8": "removeERC20(uint256,address,uint256)", +"97722acf": "getCapOfToken()", +"9772c982": "scheduleCall(address,bytes4,bytes,uint256,uint256)", +"9773252a": "isInBonusList(address)", +"9773489a": "forceOffsetExecuteMaxFee()", +"97734b85": "BNB(uint256,string,uint8,string)", +"9773b22e": "_HachirokuToken()", +"9774c190": "ShieldCureToken()", +"977564ed": "Zylli()", +"977567a4": "ico(uint256,address,uint256)", +"977615a3": "startDatetime()", +"9776415f": "setConntractEnable(string,uint256)", +"9776aacf": "addToken(bytes32,address)", +"9777487d": "sponsorValue()", +"977785c5": "testInitalBalanceUsingDeployedContract()", +"97779e1b": "isStop()", +"9777a30e": "EYHToken()", +"9777aa49": "owner_endGetting()", +"97788180": "GetCitySnapshot()", +"9778a177": "ManualPurchase(address,address,uint256)", +"977919bf": "adjustFeeAmount(uint256)", +"97792f2f": "PembiCoinICO()", +"97799d47": "Tmc4(uint256,string,uint8,string)", +"9779dcd9": "sendInvestmentsToOwner()", +"9779e135": "CreateUpgradeCards(uint256,uint256,uint256,uint256,uint256,uint256)", +"977a5ec5": "hold(address,uint256)", +"977a8f1b": "logTokenTransfer(address,address,uint256)", +"977ab3c2": "mintarget()", +"977af81c": "changeMessage(bytes32,string,uint8,bytes32,bytes32)", +"977b055b": "maxPurchase()", +"977cdc7e": "completeDefaultOperators()", +"977d0f9b": "escape(uint256[],uint256[],uint256[],uint256[])", +"977d2c45": "totalWallets()", +"977d6276": "getOrderPriceInfo(address,address,uint256,uint256)", +"977d996d": "createEvent(uint256)", +"977e09e6": "addGameRecord(address,uint256,int256,uint256,uint256,address,uint256,uint256)", +"977ed151": "fetchCancelledOrdersForPayer()", +"977eda79": "txLog(uint256)", +"977f1213": "FucksToken()", +"977f3b05": "calculateRegionSalePixelPrice(uint256)", +"977f7c7e": "bet_on_team_2()", +"977f9e24": "offlineDonate(uint256,uint256)", +"977ff98f": "currentSaleAddress()", +"97810850": "setPlaySeed(address)", +"9781a37e": "setCooldown(address,uint256)", +"9781c3ca": "buyTokensSigned(address,bytes)", +"9782c9ef": "unfreezeTrading()", +"9782e1ec": "ProxyMock()", +"9783585d": "setState2WithStop(uint256,uint256)", +"9783bef4": "EighthContinentSocialMarketplaceToken(uint256,string,uint8,string)", +"978414bd": "transferZTXOwnership(address,address)", +"9784696c": "PauseOff(uint256)", +"97848574": "NevadaBlackBook(address)", +"9784af62": "createTokenContract(string,string,uint8,uint256)", +"9784f585": "crowdsaleHardEndTime()", +"97871e56": "EtherPush()", +"9787a6b3": "setUint8(int8,uint8,uint8)", +"97883d1f": "tokenPriceMultiplies(uint256)", +"9788a8e7": "HOU(uint256,string,uint8,string)", +"9788c342": "HardCapReached()", +"9788d5ff": "_updatePrices(address[],uint256[])", +"9789103f": "fallbackProposal(address)", +"9789f9da": "crowdsaleFinishTime()", +"978ab53b": "withdrawFundInsurance()", +"978afdc8": "getBountyAmount(address,address)", +"978bbdb9": "feeRate()", +"978bc247": "_checkSetSkill(uint256,address,uint8,uint256,uint256,uint256)", +"978c5b15": "LOCKED_2Y_DATE()", +"978ca331": "mintSub(address,uint256)", +"978cb570": "firstTimer()", +"978d5c0e": "ASCCoin()", +"978d602a": "withdrawETH(address,address)", +"978d6cff": "ICO_TOKENCAP()", +"978dabbe": "test_fourValidEqBytes32()", +"978f68b5": "cancelListing(bytes5)", +"978f8934": "createPromoKydy(uint256,address)", +"9790268b": "setRewardBlockThreshold(uint256)", +"97905a88": "recoveryKey()", +"97907827": "sharesHeld()", +"97911fd7": "MyGameToken()", +"97912c2f": "startPreICOTime()", +"979141ea": "logFeeTokenBurned(address,address,uint256)", +"979260bd": "reserve2Address()", +"97936258": "GetBaseN(uint256,uint256,uint256,uint256)", +"9793714f": "approveSettingDeprecation(uint256,bool)", +"9793ebf4": "getBooleanMapValue(string,address,address)", +"97950740": "roomForBirth()", +"9795a644": "BITWhaleBalance()", +"9795aabf": "setNewTokenOwner(address)", +"97971c69": "TwentyOneMillionToken(address,uint256)", +"97976d15": "raisedUsing(uint256)", +"9797f51f": "ELTToken(address,string,string,uint256,uint256,uint256,address)", +"9798532f": "_priceToTax(uint256)", +"9798a106": "isNullAddress(address)", +"9798dfc2": "ReinvestAmount()", +"9798e639": "distributeLCWP(address[],uint256)", +"97990635": "SmartInvestmentFundToken(address,address)", +"97992a04": "villainIndexToOwner(uint256)", +"97994b96": "changeOpenNumber(uint256)", +"97997ebb": "stakeWithdrawDisallowPeriod()", +"979a5e1a": "set_presale_arbits_sold(address,uint256)", +"979af14d": "checkAccount(string)", +"979b49de": "checkBonusTokenAmount(address)", +"979b6f6f": "RoundInfo()", +"979bc638": "withdrawBidForPunk(uint256)", +"979bfba7": "PUMPHODL()", +"979c2441": "times7()", +"979c7a38": "MultiWhitelist(address)", +"979ca729": "IcoContract(address,address,uint256,uint256,uint256)", +"979cf824": "tokenSaleEnabled()", +"979d6dc7": "HUT34_WALLET()", +"979e0f22": "AuctionResumed()", +"979e199d": "setProceedsAccount(address)", +"979e8852": "existsEscuela(uint256)", +"979f1976": "tryInsertSequenceId(uint256)", +"97a09338": "freeMoney()", +"97a0a3ec": "SpeedCashTokenContract()", +"97a1c2cd": "preSaleFirstDay()", +"97a1d3f7": "_emitHolderOperationalChanged(bytes32,bool)", +"97a28819": "resetDividends()", +"97a315ff": "CHF_Omnidollar()", +"97a33431": "toContractDie(bytes32,bytes32,uint256)", +"97a42022": "scanOutputs(bytes,uint256,uint256)", +"97a432ff": "addressesToUsernames(address)", +"97a53219": "setSwapToken(address,uint256,uint256,uint256,uint256,bool)", +"97a55722": "get_win_coefs()", +"97a6278e": "removeAgent(address)", +"97a629aa": "shareholdersBalance()", +"97a6ef4a": "AutoCoinToken()", +"97a7293d": "getCCH_edit_5()", +"97a75fe8": "seriesASupply()", +"97a7804e": "FrozenToken()", +"97a7cfb4": "takeTheTorch_(uint256,address,address)", +"97a8c6ec": "emitEvent(string,address,address,uint256,uint256,string,string)", +"97a95086": "getBAU(bytes32,address)", +"97a97005": "transferAllArgsYesAllowance(address,address,uint256,address)", +"97a989c2": "__getbalance()", +"97a993aa": "buyers(address)", +"97aa28b4": "publicUnlock(address,uint256)", +"97aaa73c": "timeBasedBonus(uint256)", +"97aab362": "setReg(address)", +"97aae114": "setDeprecatedManual(uint256,address,bool)", +"97ab4786": "reserved(uint8)", +"97ab5baa": "withdraw_if_failed()", +"97ab9e7a": "contestStartTime()", +"97aba7f9": "recoverSigner(bytes32,bytes)", +"97ac37de": "_purchase(address,uint16,address)", +"97ac3b51": "CHXToken()", +"97ac3cd9": "noMoreNextRoundSetting(bool)", +"97ac4a25": "isRoundActive(uint256)", +"97acb3bb": "addAction(address,bytes4,bytes32[])", +"97acb94d": "withdrawalFrom(address,address,uint256)", +"97ad1cbf": "alterDividendCooldown(uint256)", +"97ae4491": "serviceFeeWithdraw()", +"97aeb405": "IFIN()", +"97aeb7ad": "setTeamByAddress(uint8,address)", +"97aeecd0": "AtraToken()", +"97af34db": "listActiveBets()", +"97af77b8": "getVisaAmountPaid(address,uint256,uint256)", +"97af90ae": "_userRefund(address,address)", +"97afb40c": "request_withdrawal(address,uint256)", +"97b0484e": "TOKEN_ICO2_LIMIT()", +"97b081ef": "setOrderDealTimeInterval(uint256)", +"97b09aa6": "tokenSaleAgreement()", +"97b0ad7d": "Fizzy()", +"97b10976": "removeAmountForAddress(uint256,address,address)", +"97b150ca": "tokenAmountOf(address)", +"97b1b2b7": "getFundStatsMap()", +"97b1ff1d": "getNumberOfBeats()", +"97b27c46": "decision(bytes32,string,address[],uint256[])", +"97b2f556": "numPlayers()", +"97b3116e": "setPrePaidFee(uint256)", +"97b34e1f": "readBools(bytes32[])", +"97b3ab70": "BetComplete(bool,uint256,uint256,uint256,address,uint256,bool)", +"97b3b441": "isAvailable(uint40)", +"97b4ddac": "currentGenesisAddresses()", +"97b51442": "setMinimumWait(uint256)", +"97b61c68": "giveOwnership(uint256,address)", +"97b68b60": "finishFreeGetToken()", +"97b6cf42": "icoParametersSet()", +"97b73c5c": "setMockUint256(int256,bytes4,uint256)", +"97b740e2": "addAuction(uint40,uint40,uint128)", +"97b817c9": "beginGame(address,uint64)", +"97b9d025": "past_present_future()", +"97ba42b3": "getsometoken(address,uint256)", +"97ba89c9": "setBetUnit(uint256)", +"97bb0de0": "mintLockedTokens(uint256)", +"97bb2a63": "newvow(uint256,address)", +"97bd820a": "divRound(uint256,uint256)", +"97bdc7c8": "changeWhitelist(bool)", +"97bdc9cc": "setBytes(address,string)", +"97bec0ec": "unlockCZR(address,uint256)", +"97bfd8cb": "_setClassMechValue19(uint256)", +"97bff97f": "broadcastTransfer(address,address,uint256)", +"97c0262a": "commissionWallet()", +"97c06deb": "debit(address[],uint256[])", +"97c08da6": "assignBurner(address)", +"97c112d5": "ItemInfo(uint256)", +"97c25f95": "coupon(address,uint256)", +"97c2a9b7": "withdrawFoxt(address,uint256)", +"97c3ccd8": "ban(address)", +"97c414df": "registerAccount(address)", +"97c5ed1e": "showMeTheMoney(address,uint256)", +"97c6006e": "SetFreeQDA(uint256)", +"97c6e24d": "ARMOR()", +"97c8f311": "distributeTokens(address[],uint16[])", +"97c9085f": "fromBytes96(bytes32,bytes32,bytes32,uint8)", +"97c911d5": "InitMaster(address)", +"97c93398": "test_insert_atPosition()", +"97cb2c17": "getSpaceshipProductPriceByModel(uint16)", +"97cbdfc9": "transferAbnormalERC20Tokens(address,address,uint256)", +"97cc3070": "setOrderFill(bytes32,uint256)", +"97ccd07b": "medium()", +"97cd1829": "copyEntireGlofile(address)", +"97cda349": "getLargeBonus()", +"97cdcbfd": "trainEquipment(uint256,uint256,uint256)", +"97ce3a4b": "getUnitsInProduction(address,uint256,uint256)", +"97ce8c43": "setFashionSuitCount(uint16,uint256)", +"97ceb310": "setHardCapInEther(uint256)", +"97d02e00": "DaoChallenge(address)", +"97d0b02c": "setUserManager(address)", +"97d11588": "createStandardDerivative()", +"97d159e7": "setMinTransfer(uint256)", +"97d32a12": "afterCrowdsaleAddress()", +"97d33c33": "burnNotDistrTokens(uint256)", +"97d351b3": "_doTradeForEth(address,uint256,address)", +"97d3624c": "TransferableMeetupToken(string,string)", +"97d3c683": "priceStep8()", +"97d425cb": "canBeTransfered(address,uint256)", +"97d47a60": "registerAccountant(bytes,address)", +"97d4cfb9": "initialTokenSupply(address,uint256)", +"97d4f342": "playerOneCommit(bytes32)", +"97d551a1": "TEC_TOKENS_NUMS()", +"97d5c6a1": "setEndTime(uint256,uint64)", +"97d5f823": "sendPOSTokens()", +"97d61c46": "getRedeemValue(uint256)", +"97d63f93": "initSupply()", +"97d68c77": "resolveSupply(address)", +"97d6ce76": "companyTokensInitial()", +"97d6daba": "expropriate(uint256)", +"97d74abd": "dataSourceCallbackTeamId(uint256,uint8)", +"97d7f2ee": "FundToken()", +"97d814c3": "withdrawCeo(address)", +"97d870c8": "tokenWithdraw(address,address,uint256)", +"97d88cd2": "subAllowance(address,address,uint256)", +"97d8a7e9": "getFreelancerHourlyRate(address,address)", +"97daa043": "register(bytes,address,address,uint256,bytes)", +"97db0a7b": "soccerGo()", +"97db7edb": "stopEmergency()", +"97db9a95": "changeAuthority(address,address)", +"97dbfc5a": "ICOEnabled()", +"97dc4a13": "airdrop(uint256)", +"97dc4c6f": "earlyBirdMaxPerPerson()", +"97dc97cb": "authorizedCaller()", +"97dd9892": "getCurrentRoundTeamCos()", +"97ddeb77": "LimitReached(address,uint256)", +"97dedb06": "strToBytes32(string)", +"97df212b": "getPersonaAttributes(address)", +"97df5028": "winProbability(address)", +"97df573e": "storageAddr()", +"97df8a50": "changeSuperContract(address)", +"97e10a79": "transferERC20(address,uint256,address)", +"97e12b0d": "lastRoundEndTimestamp()", +"97e1754c": "previousEntries(uint256)", +"97e18af3": "crowdsaleLock()", +"97e1d68d": "PRESALE_BASE_PRICE_IN_WEI()", +"97e1e9b5": "ILFManagerCandidateKeyHash()", +"97e1f48b": "userReinvest()", +"97e30fc4": "setPendingValue(uint256,address)", +"97e42023": "setRebuyThreshold(uint256)", +"97e484d2": "ElementeumTokenProxy(uint256,address[],address[])", +"97e4c28b": "transferPrefix(string,address)", +"97e4fdea": "pause_2()", +"97e4fea7": "exists(bytes8)", +"97e5d18a": "thirdLoos()", +"97e645f3": "isCallbackDone(address)", +"97e6c7f7": "getWeeklyDividends()", +"97e6dada": "_own(uint8)", +"97e851f6": "updateOptionalCommission(uint256,uint256,address)", +"97e8b490": "edit(uint256,address,uint256,string,string,string,string,uint256,address,uint256,string,string,string,string)", +"97e8e520": "stakeToMany(uint256[],uint256[])", +"97e92794": "digitalSignature()", +"97e950f7": "setMaxInvocations(uint256)", +"97e9a0bf": "contractPrice()", +"97e9beef": "withdrawUser(uint256,address)", +"97ea403d": "getCityResources(uint256)", +"97ea6e15": "bytesToBytes7(bytes1[7])", +"97eb0eab": "addAirdrop(address,uint256,bool)", +"97eb147d": "rlc_bounty()", +"97eb1800": "investorsStockInfo(address)", +"97ebe0d6": "approveTokenCollection(address,address,uint256)", +"97ec23cb": "getCreationTime(uint256)", +"97ec642c": "MAX_WITHDRAWAL()", +"97ec72b8": "STLHToken(string,string,uint8,uint256)", +"97ecd379": "nPlatCurTotalEth()", +"97ecfaab": "delWhitelist(address)", +"97ee041b": "incrementBasketsBurned(uint256,address)", +"97ee0a05": "SendPreReserved3()", +"97eea08b": "Mineral()", +"97eede11": "FACTOR_10()", +"97ef9779": "TransferBase(uint256,string,string)", +"97efff39": "amountToWithdrawOnDate(uint256)", +"97f1943c": "ROG()", +"97f22ea9": "addToPresaleWhitelist(address)", +"97f28419": "getAdminAddressIndex(address)", +"97f2b4b0": "isBetActive(bytes32)", +"97f2f5c3": "maxTokensForSale()", +"97f3016b": "finishLock()", +"97f3bb0c": "removeLocking(bool)", +"97f3c21e": "isUpgradeFinished()", +"97f3de37": "SetDataServerAddress(address)", +"97f46527": "getNextVestingQuantity(address)", +"97f58e91": "isLiquidating()", +"97f59897": "_nextOwner()", +"97f606eb": "ShowUnrelease(address,uint256)", +"97f735d5": "isBanned(address)", +"97f7b4f7": "getBid(address,uint256,uint256)", +"97f8fee1": "CORPAddress()", +"97f9653a": "statisticaldata(uint256,address,address,uint256[5],uint256[5])", +"97f990f2": "KNOWLEDGE_TO_GET_1FRANKLIN()", +"97fa346d": "sellTank(uint32,uint256,uint256,uint256)", +"97fb070b": "registryRequestDocumentation()", +"97fb2a14": "JTU()", +"97fb2cea": "getCustomerAtIndex(uint256)", +"97fbbfd1": "CoinstocksToken(uint256,string,string)", +"97fc93ab": "cashBack(address)", +"97fcb54e": "transfer_eth(address,uint256)", +"97fce1bb": "setGameLogicContract(address)", +"97fcedba": "setTotalInvestedToken(address,uint256)", +"97fdf5f2": "FOUNDERS_TOKENS_VESTED_1()", +"97fe5ea3": "addAdvocatedTAOLogos(address,uint256)", +"97fe728a": "useName(string)", +"97fe9129": "setCCH_edit_27(string)", +"97fea4e3": "showPlayerBetInfo(uint256,address,address)", +"97feb926": "depositERC20(address,uint256)", +"97fed5f2": "TokenXGroup()", +"97ff335b": "AddNewCourse(string,string,string,string)", +"97ff5be4": "getData_12()", +"97ff6d10": "cancelPlatformWithdrawal()", +"98004a2a": "processContributions(address,uint256)", +"980054be": "icoIsFinished()", +"9800fc16": "removeAllowedContract(address)", +"98019a41": "adjustAddressWealthOnSale(uint256,address,address,uint256)", +"9801ca60": "getWeeklyTokensForHoldersAmount()", +"9801cb8e": "ProofOfExistence()", +"98024a8b": "getPartialAmount(uint256,uint256,uint256)", +"98024f18": "testThrowsTransferDisableNotEnabled()", +"9802dd1a": "Dpc()", +"98036e7a": "ADVISORS_PERCENTAGE()", +"98041ea3": "addMember(address,uint256)", +"980481e0": "isABatchOpen()", +"98057510": "addLockedTokeB(address,uint8,uint256)", +"980591f4": "pause(bool,string,address,uint256)", +"9805d7d2": "landsOf(address)", +"98063de4": "LogPollVoted(bytes32,address,uint256)", +"98066221": "FlowchainToken()", +"980934ec": "create(address,string,bytes32,uint256)", +"9809a38b": "supplyPerColor()", +"980b05e0": "_createCollectible(bytes32,uint256,uint256)", +"980b5335": "getAvailableAmountWithdrawal(address,bytes32)", +"980c2f21": "releaseForeignToken(address,uint256)", +"980cf053": "stage4Bounty()", +"980d75ab": "Readcoin()", +"980dc482": "addOrder(address,uint256,uint256,uint256)", +"980e6e08": "timeLeftToCook()", +"980e8c81": "FutureBlockCall(address,uint256,uint8,address,bytes,uint256,uint256,uint256)", +"980ee29f": "MakeDai(address,address,uint256,uint256)", +"980f62b1": "kickoff()", +"980f8e5e": "createPaper(string,bytes32,uint256,uint256[],address,address[])", +"980fb0aa": "abortByBroker()", +"980ff6c6": "executeProposal(bytes32)", +"981012f2": "AddressChecker()", +"9810e089": "return_owner()", +"98110106": "_ownerTransfer(address,address,address,uint256)", +"981101f5": "VERToken()", +"981111ef": "factorial()", +"9811c7c1": "target(uint256)", +"98123528": "numThings()", +"98129013": "left47(uint256)", +"981489b8": "setWidthrawFor(string,uint256,uint256)", +"9814d0ee": "isProposalEnded(bytes32)", +"981566ce": "LotteryCore(address)", +"9816006c": "DeWeiSecurityServiceToken()", +"98163597": "getTotalVolumeEth(address)", +"9816af58": "getUserPools(address)", +"98179c41": "burnBalance(address)", +"98182950": "TARGET_TOKENS_ADDRESS()", +"98191a20": "inPreSale3Period()", +"981a1327": "tokenToExchangeTransferOutput(uint256,uint256,uint256,uint256,address,address)", +"981a60f5": "extractNameFromData(bytes)", +"981ae401": "ACTION_TAX()", +"981b24d0": "totalSupplyAt(uint256)", +"981b405b": "willChangeCost()", +"981b69b7": "soldForFifth()", +"981c6946": "holderAdded(uint256,address)", +"981c80b3": "Maia(address)", +"981c9e07": "PBSU()", +"981cc7ae": "GetRichQuick()", +"981dd797": "process_contribution(address)", +"98203e6b": "setDeprecated()", +"982078b8": "requestTokensFromCrowdsale()", +"98221166": "changeTypeHash(bytes32)", +"982270e7": "setPOOL_edit_6(string)", +"98229465": "_isAuthorizedOrOwner(address)", +"982296a8": "emitEvent(string)", +"9822e501": "exchangeOwner(uint256,uint256)", +"98234a6c": "max_crowd_vitas()", +"982371b4": "cancelOrder(address,uint256,address,uint256,uint256,uint8,bytes32,bytes32)", +"9824425a": "takeOrder(uint256,uint256,uint256,uint256)", +"982475a9": "approveKyc(address[])", +"982495c7": "attend(address[])", +"9824cec8": "CryptoTicketsICO(address,address,address,address,address,address,address,address,address,address)", +"9824e7f7": "userWalletTransferEther(address,address,uint256)", +"98251353": "grantedWallets(address,address)", +"98257d84": "changeDefaultTimeLock(uint256)", +"982657f3": "startGame(uint256,uint256,uint256,uint256)", +"98270d24": "atxToken()", +"982713e1": "ComplexExchanger(address,uint256,uint256,address[],uint256,address)", +"98278bc8": "DefaultSweeper(address)", +"9827a996": "terminateProject(bytes32)", +"98290c53": "stakeBelaSplit(uint256,address)", +"98296c54": "assertEq(uint256,uint256)", +"982a2376": "settingExist(uint256)", +"982a83eb": "createCrowdsale(uint256,address,string,string,uint256,uint256,uint256)", +"982a96e3": "bonusRemaining()", +"982b5dd2": "processVestingRules(address,address)", +"982b6689": "transferMultiple(uint256,address[])", +"982bb5d8": "setDepositsSigned(bytes32,bool)", +"982c0455": "getSpecifiedComment(address,uint256)", +"982d1270": "shiftIn(uint256,bytes32,bytes,address)", +"982e5721": "getRateNow()", +"982f4a21": "INFOCORP_DONATION()", +"983032c2": "newShare()", +"983086df": "HMTCrowdsale(address,uint256,uint256,uint256,address,address)", +"9830a8fd": "getCustomerTxRegistry(address)", +"9830aa07": "UBlockChain(address)", +"98313b10": "splitTokensAfterDistribution(uint256)", +"98315249": "getUsersMicroModulesIds()", +"9831ca4d": "joinMiniGame()", +"983234b6": "setAmounts(uint256,uint256)", +"9832ee65": "resultsWeightedByTokens()", +"98337afb": "largeCount()", +"983485e1": "buyEthereumToken()", +"98358f82": "cap_in_wei()", +"9835efaf": "setAmountToDistribute(uint256)", +"98366d1c": "isMint(int256,address)", +"98390730": "takeAllEther(address)", +"98391c94": "muteMe(bool)", +"9839eafd": "getTicketNumbers(uint256)", +"983a7f47": "setDNA(uint256,uint256)", +"983a8c8a": "_setRoles(address,uint8[])", +"983a95b2": "trackClick(address,address,address,address)", +"983b2d56": "addMinter(address)", +"983b94fb": "finalizeAuction(bytes32)", +"983bc49d": "currentBalance(address,address)", +"983c09ee": "steal(address,address,uint256)", +"983c0a01": "closeCrowdsale()", +"983c4647": "TunTokenERC20()", +"983c7630": "setPermissionByAddress(uint8,address,bool)", +"983c8449": "VzanToken(uint256,string,string)", +"983ce499": "_set2()", +"983df7cd": "isOperatorAuthorizedBy(address,address)", +"983e1318": "Hack()", +"983ef725": "getDifficulty(uint256)", +"983f724b": "getCassetteType_()", +"9840a504": "NFCToken()", +"9840a6cd": "getSubscriptionValue(bytes32)", +"9840a8f8": "minAllowedBetInTokens()", +"98413ff1": "extensionByIndex(uint256)", +"98416339": "KRYPTONIUM()", +"98419ec5": "shouldThrowOnAttemptToTransferWhenNotOwner()", +"9841a2d8": "startSale1Phase()", +"9842692b": "_contractFallbackERC223(address,address,uint256)", +"984274af": "preTgeCap()", +"9842a37c": "__callback(uint256,bytes32)", +"9842ec30": "drawItemLottery(address,uint256)", +"9843e648": "setItemsEC(address,address)", +"9843eae3": "airdropActive()", +"984413b8": "_eraseNode(bytes32)", +"9844347b": "createCertificate(bytes,bytes,uint256,bytes)", +"98445e6f": "getCurrencyPayment(address,uint256)", +"9844613e": "ViewCoin()", +"984474fb": "price_token()", +"9844c294": "existenceAllowance(address)", +"9844d5a7": "Martcoin(uint256,string,string)", +"984572d0": "privatePreICOBonusPercent()", +"9845b448": "PHASE5_START_TIME()", +"98475e30": "BTCETH(uint256)", +"9847d267": "GoodLuckCoin()", +"984809bf": "setPublicOfferingLimit(uint256,uint256)", +"984877b0": "GoalHitWithdrawl()", +"9848fef8": "tokensReleasedToEcosystem()", +"984a27be": "m_SMRMinter()", +"984a470a": "forwardedOutcome()", +"984a74f7": "TazitToken()", +"984ac378": "lotteryTitle()", +"984bc8c5": "placeTicket()", +"984c0450": "withdraw(bool,uint256)", +"984c14ac": "setupVolumeMultipliers(uint256[],uint256[],uint256[])", +"984ce0fd": "transfertoacc(string,uint256)", +"984d11fc": "validSupply()", +"984d4a93": "setAdminsAddress(address)", +"984ddfe8": "DevTokensHolderMock(address,address,address)", +"984e1ff4": "mock_setShouldSucceedTransfers(bool)", +"984e2829": "_updateState(address,int128,uint128,uint256)", +"984e5a0b": "FunKoin()", +"984ec03e": "_storeStakes(uint256,address,uint256,uint256,uint256,uint256,uint256)", +"984fba49": "removeInvestorFromWhiteList(address)", +"9850d32b": "maintainer()", +"98512d72": "round1TokensRemaning()", +"9851553b": "EthereumTravelToken(address,uint256,string,string)", +"9851663f": "_computeCurrentPrice(uint256,uint256,uint256,uint32)", +"98519340": "setParameters(uint32,uint32,uint32,uint32,uint32,uint32)", +"9851b2bd": "AIN()", +"9851fd9a": "eventStatus()", +"9852099c": "depositId()", +"9852595c": "released(address)", +"9853b234": "createPhoenix(uint256,uint256,uint256)", +"98544710": "setKeyHash(bytes32)", +"98547a45": "donacionCruzRoja()", +"985540b9": "remove(int8,int8)", +"98575188": "removeUser(address)", +"9857650c": "claimIFactor(bytes32,uint256)", +"9858cf19": "FREE_SUPPLY()", +"9859387b": "createAccount(address)", +"98593b7a": "SenseProtocol()", +"98596560": "get_activity_by_id(uint256,uint256)", +"98596726": "note(uint224)", +"98597629": "max_value()", +"98598905": "subVirusDef(address,uint256)", +"985989d2": "ROLE_UNDER_MINTER()", +"9859adf0": "_payByEth(uint256)", +"985a882c": "MINEX()", +"985b71f1": "calcBindedBlindHash256(string,address)", +"985bcf34": "canExit(bytes32)", +"985bdd43": "isExchangeAlive()", +"985c7564": "getNextTournamentData()", +"985d43f1": "TOTAL_APC_SUPPLY()", +"985d5702": "ExShellStock()", +"985dea23": "getETH(uint256,address)", +"985df3a7": "setHeroAssetAddress(address)", +"985e2cdf": "updateExchange(address,address,bool,bytes4[])", +"985e4634": "CreateLPT(address,uint256)", +"985e4cd0": "sumBalanceOf(address)", +"985f26f6": "AddOwners(address[])", +"985fc7ea": "destructionAddress()", +"98603cca": "disableBurning()", +"98608111": "getStorageNameHash()", +"9860d0a5": "setTransferFee(uint32,uint32)", +"98636f32": "isException(address)", +"98646d68": "setNumDesignatedReportNoShows(uint256)", +"98650275": "renounceMinter()", +"98668b24": "tokensVotedForDisable()", +"98672215": "getTearAward(address,uint256,uint256)", +"98683105": "CCH_EDIT_1()", +"98686304": "Elance()", +"986876e6": "ChannelCreated(address,address,uint192)", +"98688a95": "Ai()", +"9869aca0": "setSchedule(uint256,uint256)", +"9869b736": "ONE_MILLION()", +"9869f1b7": "migrateTokens(address,address)", +"986b3a9a": "getCanvSize()", +"986b5676": "loveID()", +"986bb99a": "setPOOL_edit_30(string)", +"986bf5e8": "addAudit(bytes32,uint256,bytes32,uint8,bytes32,bytes32)", +"986c1938": "setRegistrarAuth(address)", +"986c7cc7": "BitArbToken()", +"986cc311": "executeProposal(uint256,uint256,uint256)", +"986ccc7f": "setHelper(address)", +"986d08a8": "OSECOIN()", +"986dcd4d": "setCycleLimit(uint256)", +"986e791a": "getString(bytes32)", +"986e7ed3": "AssignGGCOwner(address)", +"986ec464": "tokensLeftDrain(uint256)", +"986ee316": "VoteMemberCandidate(uint256)", +"986f3c9b": "addComment(address,address,bytes32,bytes32,bytes32)", +"986f737b": "onrs(uint256)", +"98702402": "refPercentage(address)", +"9870d7fe": "addOperator(address)", +"987196ae": "HabibaTokenCoin()", +"9871cb8f": "Moneto(address)", +"9871e4f2": "makeSubscriptionId(address,uint256)", +"9871e510": "hashExists(string)", +"9871ee02": "PCT()", +"98729c37": "_changeUpPrice(uint256)", +"9872a20a": "registerUInt(address,uint256)", +"98738f97": "preIcoBonuses(uint256)", +"9874a3d0": "WAIT_BLOCKS()", +"9874cdf4": "performRefund(bytes32,bytes32)", +"9874f5d7": "addString(string)", +"9875958c": "PlaceRocketForSale(uint32,uint80)", +"98764f22": "setPrice(uint32,uint64)", +"9876962a": "setstart()", +"9876ee61": "coinsAddresses(uint256)", +"98772e80": "disrupt()", +"987757dd": "settle(bytes32)", +"98779240": "transfersAllowDate()", +"9877bdff": "Alice()", +"9878cc51": "MELON_ASSET()", +"98791010": "deleteHpbNode(address)", +"987b7967": "BLOCKMALLToken()", +"987b904b": "BOUNTY_LIMIT()", +"987bc844": "HolikopterTokenToken()", +"987c4311": "setPublicChainlinkToken()", +"987c6b9d": "swap(address,string,string,uint256,uint256,uint8,bytes32,bytes32,uint256)", +"987c9efd": "PayIreward()", +"987cb9b0": "updatePublicSale(uint256)", +"987cec61": "converted(uint256)", +"987d9768": "ILF(address)", +"987e565d": "buyKim(uint256)", +"987ea899": "addAssetManager(address)", +"987eae8f": "totalPets()", +"987eeee5": "createMain()", +"987f3bdb": "_playGame(uint256,uint256,uint256,bytes32)", +"987f710a": "TIME_TO_COOK()", +"987faf18": "prevJackpotsLength()", +"9880472f": "multiSigOutputAddress()", +"98804938": "deposit_eth(uint8,uint256)", +"98806bf0": "convertTokens(address)", +"98827d5e": "createCoins()", +"9882e15e": "withdrawOverdue(address,address)", +"9883521e": "presaleProcessed()", +"9883548a": "fint32(int32)", +"9883b9f4": "addAmendment(string)", +"98842c3b": "ipfsGet(uint256)", +"988483d4": "convertMsgValueToBytes20()", +"98864aaf": "getPropertyFlag(uint16)", +"98866c1a": "personUpdateDOD(uint256,int256)", +"98866ead": "_gensGenerate()", +"9886de1f": "multiTransfer(uint256,address[])", +"98876609": "create(bytes32,address,bytes32[])", +"98880043": "addGame(string,string,uint256,uint256)", +"9888103f": "buyTokensInternal(address)", +"988a18f6": "claimTokens(address[],address)", +"988a9fb5": "getTokenIdOfAddressAndIndex(address,uint256)", +"988b1d86": "remoteApprove(address,uint256)", +"988b590f": "withdrawBSAFE(address,uint256)", +"988ba8e8": "finishPreSaleRound()", +"988bfcfa": "_buyToken(address,uint256)", +"988bfd47": "ProxyCreationAndExecute(address)", +"988da80f": "getUserName(uint256)", +"988fc9a8": "fetchOrderByIdWithWithPayerByAdmin(string,address)", +"9890220b": "drain()", +"9890d6bc": "GetDisputesAtTheMoment()", +"9890eabe": "distributeDividendsOnTransferFrom(address,address,uint256)", +"9890f48a": "LocalStarRoster()", +"9891d61c": "getEnabledTokensLength()", +"9892003a": "TexasHoldem(string,uint8,uint8)", +"98924050": "addtoLottery()", +"98924dd6": "_doesUserExist(address)", +"9892977b": "_attributeSale(address,uint256)", +"98934c0a": "payEther(address[],address,uint256[])", +"9893f27e": "allowancePresetTransfer(address)", +"9894221a": "SendCashForHardwareReturn()", +"98943c88": "getAllWeaponData(uint256)", +"9894ba7c": "transferOut(address)", +"9894eb8e": "hashSecretKey(bytes32)", +"98951b56": "approveProposal(uint256)", +"98951bfc": "foundersAmountLeft()", +"9895dd78": "setRegularTransTime(uint32[])", +"98968f15": "purchase(address,uint256,uint256)", +"98969906": "PassportToken()", +"9896b6cb": "testToUint16()", +"98973f2b": "setRestrictedAddress(address)", +"9897e8a5": "scalarEvents(bytes32)", +"9897f916": "manualRelease(address,uint256)", +"98981756": "teamExists(uint256)", +"98983cc5": "isCrowdsalePaused()", +"9898e18c": "tokenSender()", +"9899276b": "getOwnedTokensLength(address)", +"9899722d": "newRateTime()", +"9899a2c5": "aliceClaimsDeposit(bytes32,uint256,bytes32,address,address,bytes20)", +"989a55fa": "_increaseApprovalAllArgs(address,uint256,address)", +"989b595f": "shuffleSeed(uint256)", +"989ceab1": "WhitelistAddressAdded(address,address)", +"989ced26": "updateTokenContract(address)", +"989db511": "Input()", +"989ddfce": "AdminDeleted(address)", +"989e4a8c": "_processPurchase(address,uint256,address)", +"98a05bb1": "deletePermission(address)", +"98a05cfb": "arbitroAprovaPagamento(bool)", +"98a0871d": "buyXaddr(address,uint256)", +"98a0bf6e": "ForeverChain()", +"98a0e1c8": "computeKnockoutPoints(uint8,uint8,uint8,uint8,uint8,uint8,bool)", +"98a10993": "finalizeWhenForked()", +"98a1803c": "ICONotCompleted()", +"98a1b397": "ROLE_OPERATOR()", +"98a1e1ba": "ownerSetLimits(uint256,uint256)", +"98a26497": "payCeo()", +"98a29a58": "testControlDisownNotTransferable()", +"98a2f59f": "ToLend()", +"98a30f76": "totalTokensPreICO()", +"98a322ae": "ownerComission()", +"98a33bfe": "addGlobalConstraint(int256,address,int256,bytes32,address)", +"98a34fef": "withdrawBeneficiary()", +"98a36ebf": "setTradeEventEnabled(bool)", +"98a42ec4": "verificationAddressNumberMap(address)", +"98a595a5": "requiresInitialization()", +"98a6a6c0": "isTokenSaleActive()", +"98a73afa": "getAwards(uint256)", +"98a7cafd": "setData_27(string)", +"98a87f7d": "CPCToken()", +"98a892c9": "getBylawsCashBackVoteRejectedDuration()", +"98a9ae44": "remaindersSet()", +"98a9bfd4": "is_max_goal_reached()", +"98ab1c72": "setBackgroundImage(uint256,bytes)", +"98aca922": "getReceiver()", +"98acd7a6": "getBaseToken()", +"98ad004c": "GetCollectionInfo()", +"98ad2f12": "getid(address)", +"98af629b": "winnerDecidedGas()", +"98b00ee0": "getFinalBytes()", +"98b01fe3": "totalBonusTokensIssued()", +"98b04c16": "SportistToken()", +"98b0787e": "playerTwoCommit(bytes32)", +"98b1e06a": "deposit(bytes)", +"98b23a29": "TimeShareEstate()", +"98b35e73": "saveReading(string,string)", +"98b3dfd6": "NamCoin(address)", +"98b41763": "publicGetAdvertisement(uint256)", +"98b547e0": "transfer_ownership(bytes32,address)", +"98b78849": "preStakingDistribution()", +"98b7db75": "PayForFlag(uint256)", +"98b90fe1": "closeOption(address[3],uint256[3],uint256[2],bool)", +"98b9a2dc": "changeWallet(address)", +"98b9d151": "InsuranceHolder(address,address)", +"98ba2453": "canSynthesizeWith(uint256,uint256)", +"98ba676d": "getEntry(uint256,uint256)", +"98bbc47e": "addPerson(uint256,string,string,string)", +"98bca41a": "removeSeenAddress(address)", +"98bcfbb8": "minimumTokensBeforeSale()", +"98bd359c": "deposit(address,uint128,string,uint32)", +"98bd5663": "confirmTime()", +"98bdf6f5": "tokenIdCounter()", +"98be22f7": "forfeitGame(uint256)", +"98be7c62": "minterFeePercent()", +"98be7df7": "releaseEthers()", +"98bf043d": "clearUnusedDeposit(uint256,uint256)", +"98bffb2a": "manualRecovery(address)", +"98c07938": "votersCount()", +"98c086d8": "_amountReq()", +"98c0bb94": "returnante(address)", +"98c16888": "SToekn()", +"98c20c00": "addToAllocation(uint256)", +"98c23836": "schellingDB()", +"98c31b1d": "addEvent(uint256,uint256,uint8,string,string)", +"98c39cc2": "AnubisToken()", +"98c5166c": "inResources(address,bytes4)", +"98c547b8": "setContentExtraData(bytes32,string)", +"98c562b3": "contributionsBySender()", +"98c66b7f": "_startTokenTransfer(uint256)", +"98c69648": "DEFAULT_NAME()", +"98c6a46f": "setPayoutDistributionId()", +"98c6e760": "migrateTo()", +"98c7458e": "getEventsByIds(uint256[])", +"98c83a16": "PRIVATE_SALE()", +"98c8bde6": "GICTBalance()", +"98c9cdf4": "getMinimumCallGas()", +"98c9faac": "cancelActiveAuction(uint40)", +"98ca667f": "FOUNDERS_SUPPLY()", +"98cb12dc": "isRandomPlayer()", +"98cb2342": "getNumEvenSplits()", +"98cba526": "TeamAndAdvisorsAllocation(address)", +"98cbb277": "Admined()", +"98cbefbe": "init(string,string,uint8,address)", +"98cc223f": "BiboToken()", +"98cc2c53": "VerifiedKYC(address)", +"98cc6754": "dumpBalance(address)", +"98cdf0ca": "updateConfig(uint16)", +"98ce476a": "EPTCrowdfund(address,address,uint256)", +"98cef4bd": "earlyBirds()", +"98cf6dd3": "deleteInvestorTokens(address,uint256)", +"98cf6f22": "queryN(string,bytes)", +"98cfa44e": "setFSTPrice(uint256,uint256)", +"98d0573e": "_getActiveMessageId()", +"98d07356": "getDepositValue()", +"98d0a6c7": "setBcouponAllocationFactor(uint256)", +"98d0b85f": "isNonZeroAccount(address)", +"98d0de03": "addPlayerToServer(uint256,uint256)", +"98d15134": "companiesManager()", +"98d24806": "GetPlayerById(uint256)", +"98d2e3b1": "calcTokenToWei(uint256)", +"98d30c50": "winnerCheck()", +"98d31a13": "AIR_2()", +"98d35f20": "anchors()", +"98d41484": "applySettings(uint8,uint256,uint256,uint256,uint256,uint256,uint256)", +"98d48567": "disapproveUserKYC(address)", +"98d4cacb": "_assemblyCall(address,uint256,bytes)", +"98d4e59c": "decreaseOffsaleCountByOne()", +"98d501ca": "OysterPearl()", +"98d5a1b1": "burnFromIco()", +"98d5fdca": "getPrice()", +"98d6ceb3": "BetSetAnswer(address,address,uint256)", +"98d6d8ed": "isPresaleStarted()", +"98d70779": "contRefer50x50()", +"98d714ac": "ethereumFromAltar()", +"98d7352f": "setTokenURI(address,string)", +"98d7456f": "ShowInfo(uint256)", +"98d764be": "Myastheniagravis()", +"98d78fe2": "soldDuringTokensale()", +"98d8adc0": "DividendDistribution(uint256,uint256)", +"98d8d7b4": "Vlicoin()", +"98da2133": "SEC_contract()", +"98da8121": "lock_vote_amount(bool)", +"98daa8c2": "changeJoysoWallet(address)", +"98dacb46": "setLockPostion(address,uint256,uint256,uint256,uint256)", +"98db173f": "calcaultePrizes()", +"98dc6ae2": "divX(uint256,uint256)", +"98dc8b44": "getStageIndex()", +"98dd0293": "changeBonusFrequency(uint32)", +"98dd0baa": "getNumOfLotto()", +"98dd4b7c": "getCountStakesToken()", +"98de4f35": "purchaseTokensfor82(uint256,address,uint256)", +"98de921f": "removeLoanFromPortfolio(uint256,uint256)", +"98dec601": "REGULAR_RATE()", +"98dedf30": "getBySchool(uint256,uint256)", +"98df3d00": "getNote(bytes32)", +"98df67c6": "revealSecret(uint256)", +"98e00e54": "getCallWindowSize()", +"98e02be7": "abandonShip()", +"98e09333": "valueGet(address,string)", +"98e0fb08": "ICO_TOKEN_SUPPLY_LIMIT()", +"98e12d12": "updateAnimal(uint256,string,string)", +"98e15065": "info256(string,uint256)", +"98e1a322": "LivepeerTokenFaucet(address,uint256,uint256)", +"98e1b410": "getMoney()", +"98e1b6cd": "stopPromotion()", +"98e23dcf": "finishPreSale5()", +"98e25733": "currentRoundNum()", +"98e314a2": "distributeDonationTokens()", +"98e364d6": "saasApiProfitAddress()", +"98e3d1d3": "getWineProductionRate()", +"98e4053f": "changeVerify(address)", +"98e47e49": "LoomToken()", +"98e4f581": "getSkin(uint256)", +"98e527d3": "getProposalsCount()", +"98e52f9a": "decreaseSupply(uint256)", +"98e54c55": "setAsTest()", +"98e6176a": "_isProxy(bytes32)", +"98e73df9": "hasOutstandingChallenges()", +"98e76e06": "buyValue()", +"98e7ea43": "reward(uint32[],address[])", +"98e8c54f": "testerCanReentrant()", +"98e8f365": "getYourRewardStock(address)", +"98ea1c51": "ecrecovery(bytes32,uint8,bytes32,bytes32)", +"98ea5fca": "depositEther()", +"98ea6536": "_beginOfICO()", +"98eaca94": "inKissBTC(uint256)", +"98eaf11c": "getBool(bytes32,bytes32)", +"98eb1096": "CalculateCreateFee(uint256)", +"98ec341d": "addThing(bytes32,string,string,bytes32)", +"98ec9095": "total_distribution()", +"98ecd12c": "test_mixValidEqBytes32Message()", +"98edc9ce": "distributeLottery()", +"98ef4b0b": "total_iou_purchased()", +"98ef5bf9": "BuyItem(uint256,string)", +"98f038ff": "migrateRegistry(uint256)", +"98f04128": "getRoundJackpot(uint256)", +"98f1312e": "MINT_CAP()", +"98f1e0e7": "sendTokensWindow(uint8)", +"98f20367": "Curatable()", +"98f22786": "FireToken()", +"98f23a6d": "createToken(string,string,uint32,uint256,uint256)", +"98f25c44": "removeCurator(address)", +"98f28571": "ClientOrderEvent(address,uint8,uint128,uint256)", +"98f2af3a": "createGame(uint32,uint64,uint32,uint32)", +"98f31c82": "price2Of(uint256)", +"98f32d1d": "getCatRequestPrices()", +"98f3b81a": "getShares(address,bytes32[],int256[])", +"98f3c443": "CROWDSALE_WEI_CAP()", +"98f423b2": "bitsmileToken()", +"98f42e3b": "payoutInvestors()", +"98f44c62": "resetTokenOwnerReward()", +"98f4b1b2": "rateOracle()", +"98f4f54f": "KhairulRamadhan()", +"98f52c52": "firstChainHNw1()", +"98f5ee5d": "spawningManager()", +"98f69aeb": "_addChildToParent(bytes32,bytes32)", +"98f6c7e5": "refereeInvitations(address)", +"98f6ff63": "unlock(string,address,address,uint256)", +"98f72f42": "COSS()", +"98f7ba63": "UBCToken()", +"98f8193b": "replaceTokenFix(address[],uint256[])", +"98f87496": "setRateFinalStage2(uint256)", +"98f8fe90": "accessCostMYB(uint256)", +"98f96c3a": "AboutKelvin()", +"98f9724f": "holderAmount()", +"98fa6c8a": "batchTransferETHs(address[],uint256[])", +"98faa9a1": "getStageBonus(uint256)", +"98fabd3a": "DAO()", +"98faf5d1": "TBsell()", +"98fb0ac5": "tokenGenerationEvent()", +"98fb2eca": "voteStopped()", +"98fc2e0a": "GetTickSize(uint256)", +"98fc55d8": "whitelist(address,uint256)", +"98fcc93e": "getNumberOfBets(uint256)", +"98fdb377": "REOC()", +"98fdfd8e": "changeMallcoinTokenAddress(address)", +"98fe2b49": "NotifierChanged(address,address)", +"98ff116d": "deposit3(address,address)", +"98ff1ba1": "tokensGenerated()", +"98ff8075": "claimBounty(address)", +"990030cc": "trusted_contracts(address)", +"9900c978": "ScudoCash()", +"99013562": "Reject(address,string)", +"99016142": "claim(uint256,address,uint256,bytes)", +"9901bc77": "YRX()", +"9902ef5b": "blockLeft()", +"990333be": "salesDeadline()", +"99035895": "approveERC20()", +"9903745f": "SetsecondTTaxAmount(uint256)", +"990386e8": "dailyRelease()", +"9903a2bd": "calcReleaseToken(address)", +"9903c29c": "SALE_MAX_CAP()", +"990460c1": "ownerKill(address)", +"990484a7": "valueToToken(address,uint256)", +"9904a68d": "requiredDays()", +"9904e174": "sellTokens()", +"9904ed8d": "Reputation()", +"990502d0": "GasBuy()", +"9905b744": "logUint(uint256)", +"99061a08": "AltCrowdfunding(address)", +"9906352f": "MANAGE_CAP_PER_ROUND()", +"9906f41c": "setDevelopeo(address)", +"9906f81b": "Entrant(address)", +"99076eca": "IHubToken()", +"990816bb": "BitcoinSilver()", +"9908b25b": "publicTransferToken(address[],uint256[])", +"9908d3cf": "AMEBToken()", +"99091c93": "insertLawyer(address,uint256)", +"990986dd": "getRawPendingAmount(uint256)", +"9909afed": "has(address,string)", +"9909d1a2": "createTestData()", +"990a6a64": "SC_locked()", +"990ae727": "clearZoDailyLimit()", +"990c5485": "proxyMergeMint2(uint256,bytes32,address[])", +"990c75ed": "getWhitelistedAmount(address,address)", +"990c8f79": "returnValue()", +"990ca3ff": "tokensToBeAllocated()", +"990cc5c9": "buyFromCurrentOwner(uint256)", +"990d6fd2": "getNextTranche(uint256)", +"990dc9db": "transferFunds(address,uint256)", +"990dec94": "signToResetAddTokenData()", +"990e178a": "_revealBlock(address)", +"990e1c9b": "withdrawStep()", +"990e2979": "submittedAmount()", +"990e713b": "buyTokens(address,uint256,bytes4,bytes32)", +"990e80a3": "setAddressOf(string,address)", +"990ed905": "setNewBonusScheme(uint256)", +"990eda99": "FreezeAddress()", +"990f3f53": "computeResponseSecondHalf(uint256,uint16)", +"990f412f": "setAssetHolder(address)", +"990fa439": "setLLV_edit_1(string)", +"99110d3c": "PRESALE_END_TIMESTAMP()", +"991162db": "getDank(uint256)", +"99116354": "errorAndRefund(string)", +"99119290": "getCryptodiamondAddress()", +"9911ec1e": "freezeTokensToInvestor(address,uint256,uint256)", +"991257a2": "getSenderLands(address)", +"9913380e": "_getInt(address,bytes32)", +"99133c9f": "matched(address)", +"9913dcbb": "AEFToken()", +"9914038a": "getBankRollGrowthForGameId(uint256)", +"99141a47": "iffun()", +"99142b5f": "send(address,string)", +"99154b49": "ARK()", +"9916233e": "LimitOrder(address,bool,uint256,uint256)", +"99166f7d": "getTotalAddresses()", +"991678bf": "LogRefundETH(address,uint256)", +"9916c350": "numberEthUpdates()", +"9917ccb8": "HongmenToken(uint256,string,uint8,string)", +"9918925d": "setClaim(address,bytes32,bytes32)", +"9919b1cc": "getContentsByRanks(address,uint256,uint256,uint256)", +"9919c9cf": "getGoldBackedByEachToken()", +"991a3b5e": "ARCD_FUND_DEPOSIT()", +"991a9fa9": "etherHasBeenReturnedToInvestors()", +"991b650d": "dataIdentifierCount()", +"991bcae8": "setup(address,address,address,address,address,uint256,uint256,uint256[])", +"991c9ae5": "set(uint32[],uint24[])", +"991cc283": "distributeICOTokens(address)", +"991d79b5": "EtheremonAsset(address,address,address)", +"991dd5b6": "read_user_purchase_at_index(address,uint256)", +"991e0139": "completeJob(bytes32)", +"991e47ff": "CoinWindow(uint256,string,string)", +"991e86bb": "c_maximumTokensSold()", +"991ef443": "publishers(uint64)", +"991f6798": "updateEQUIPrice(uint256)", +"991fa5af": "BinaryOption(address,address,address)", +"991feab5": "MMToken(uint256,string,uint8,string)", +"991ffd4e": "scheduleCall(address,bytes,bytes,uint256,uint256,uint8,uint256)", +"99209e33": "setEndOfCrowdsale(uint256)", +"9920ecb8": "buyPhaseTokens(address)", +"9921cac5": "AlbertCoin()", +"992204e6": "GoldFee()", +"9922ea86": "allocateTokens(uint256,address)", +"99244d1a": "testvalue()", +"99248d3e": "AxieAccessControl()", +"992495e2": "minerRandomNumber()", +"9924ab31": "CIVCoin()", +"9924ad7c": "ovatel()", +"9924ba1a": "updateInfo(address,address,uint256,uint256)", +"9925b9c1": "setMintFeeAbs(uint256)", +"9925d68e": "createPreSaleShip(string,uint256,uint256)", +"99260144": "rewardMintOwner(address,uint256)", +"9927482d": "proxy(address,string,address,uint256)", +"992817b9": "recordGet(address)", +"9928811b": "testBroken()", +"99288dbb": "saleOpen()", +"9929057b": "executeDelayedSetStakes(uint256)", +"992a3e75": "changeBountyPaysTokens(uint256,bool,address)", +"992ae976": "isSafePunctuation(bytes1)", +"992b2f0f": "addSlogan(uint8,string)", +"992bb01e": "eval(bytes32[])", +"992bc0ce": "pay_to_OEM()", +"992c15fc": "MIN_VALUE()", +"992c3ff1": "TrekChain()", +"992c4435": "UETO()", +"992c870d": "transferName(bytes,address)", +"992cb59f": "getOrCreateDisputeCrowdsourcer(bytes32,uint256[],bool)", +"992d4196": "GNR(address)", +"992e0aa0": "purchaseBonus(uint256)", +"992e2a16": "getReportingEndTime()", +"992e74a9": "maxRefererTokens()", +"992e820e": "burnValue(address,uint256)", +"992ebc52": "setCounterLimit(uint256)", +"992ee4b6": "raiseTap(uint256)", +"992ee874": "WithdrawToken(address,uint256)", +"992fa380": "OmnisBit()", +"99304cd4": "AssetWithdraw(address,uint256)", +"993090d0": "adjustPrices(uint256,uint256)", +"9931a916": "TokenRK70Z()", +"99325442": "getCollectedOreBalances(address)", +"9932dc05": "codeToAddress(string)", +"9932fa28": "API2()", +"993301b2": "libbatchbacktest(bytes32,uint64,uint32[],uint64[],int64[])", +"9933a24a": "allowDirectDebit()", +"9933c6b5": "getPokemonLock(uint256)", +"9933d225": "addSpecial(address,uint16)", +"993480cf": "calculateRequiredVerifiers()", +"99348e90": "rewardsFunds(address,uint256)", +"99348f8e": "eggAvailable(uint16)", +"99351742": "distributePrize(uint256)", +"99352c42": "updateBtsPoint(uint16,int256,uint16)", +"99358876": "maxMintCookie()", +"9935935f": "setResolveHandler(bytes,address)", +"9935b968": "jesterBank()", +"9936746a": "DepositReceived(address,uint256)", +"99369801": "presaleTokenBalance()", +"99372321": "test(bytes32)", +"993783fc": "eraFromMokenData(bytes32)", +"99379718": "GimmerToken()", +"99384976": "setFounder(uint256,address)", +"9938579b": "getStatusTransferFrom()", +"9938b0de": "setPublisherCut(uint128)", +"9938be42": "getPOOL_edit_19()", +"9938fdd1": "downTick(address,uint256)", +"99393132": "onBurnCalled()", +"99395b1e": "OffMenuMorsel()", +"993ab58e": "setTournament(address)", +"993ae7e9": "updateUserBalance(address)", +"993af624": "BrehonContract(address,address,uint256,address,uint256,uint256,address,uint256,uint256,address,uint256,uint256)", +"993b4f71": "transferBag(address,uint256)", +"993b8cde": "countPurchasedPixels(address[16])", +"993bcc63": "enableTokenBurn()", +"993c78fa": "getMintApproval(address)", +"993ca7e3": "RTB1()", +"993d1123": "BoltToken()", +"993d13bd": "PRE_ICO_MAX_CAP()", +"993d29fc": "Mindmap_Token(uint256,address)", +"993d3489": "investorShortInfo(address)", +"993eaefa": "TravelWithMeToken()", +"993eda02": "giveArtworks(uint8[],address,uint256)", +"993f3197": "TOSInstitutionsHoldingContract()", +"993fd4de": "setTokensSource(address)", +"99404433": "levelup(address,uint256)", +"99405ad7": "NewTokenSale(address,address)", +"9940fb5d": "convertToMeth()", +"99413b4e": "connectToken(address)", +"994162cd": "BasicTokenStorage()", +"99418a21": "signEthereum(bytes32)", +"9941e3d0": "setCallAddress(address)", +"9942aa4d": "create(address,address,address,address,address,address,address,string,string,string,string)", +"9942ce36": "_initializeLockupStages()", +"9942ec6f": "f2()", +"99433fc3": "GreenWorldFarmToken()", +"99434669": "fabricoin()", +"99439089": "validatorContract()", +"99444e30": "ICOprice()", +"9944b729": "withdrowTokens(address,uint256)", +"9944d5e7": "burntBounty()", +"99456542": "getLargeBonusStopTime()", +"9945e3d3": "redeem(bytes)", +"99464c89": "freezeAll()", +"9946b9a5": "disable(uint256)", +"994828a1": "BabyBearToken()", +"9948e493": "calcMarketFee(bytes,uint256)", +"99497349": "setData_29(string)", +"994977e5": "finalizeRent(uint256,uint256)", +"9949f0c8": "convertEthToWeth()", +"994a69d1": "centsToTokens(uint256)", +"994aca84": "TrenoToken()", +"994b1a0f": "changeDivCardAddress(address)", +"994cc574": "setAyantDroitEconomique_Compte_9(uint256)", +"994d3969": "whitelistStart()", +"994d3be3": "publishFunctionMessage(uint256,string,string,string)", +"994e5267": "SetMaxAttempt(uint8)", +"994ebbe3": "signUpForPVP(uint32)", +"994f2e10": "getUpdateDerivePayoutDistributionHashValue()", +"994fb25f": "FileNameInt()", +"994fe290": "verificationListMap(uint256)", +"994ff619": "setKitty(address)", +"9950ace1": "rollRoom(uint256,address)", +"9951a2c8": "createTeamSaleAuction(uint8,uint256[9],uint256,uint256,uint256)", +"9951fc72": "TokenVesting()", +"99522297": "preCrowd_tokens_scaled()", +"9952b63d": "_receiveDonation(address,uint256)", +"995344da": "_updateVoucherMthEthRate()", +"99538898": "addTeamAddressInternal(address,uint256,uint256)", +"99540fe0": "normikaivo()", +"9954cf22": "JUST()", +"99552af1": "multiInvokeWith2Args(address,string,address[],uint256[])", +"99554e7b": "getNextFetchTime()", +"99554fb7": "distructVault()", +"99556615": "calculateProfitGameType2(uint256,uint256)", +"9956587e": "REGISTERFEE()", +"9956a28c": "mediumBuy()", +"995771b9": "CarnageToken()", +"995783d9": "ERC20(uint8)", +"9957ad05": "withdrawCreator()", +"9957f3e6": "KvantorToken()", +"99583417": "transferMultiple(address,uint256[],uint256[])", +"995893e6": "_createRole(bytes32,address[])", +"9958c661": "getstate(address)", +"9958d553": "max_creation_rate_per_second()", +"9958f045": "drasticMeasure()", +"995a15a8": "TouristToken()", +"995a299e": "setCurrentSeller(address)", +"995a2b52": "DeusETH(address)", +"995a7174": "_toLeconte(uint256)", +"995ab62e": "GAS_LIMIT_IN_WEI()", +"995b129f": "setAirDropManager(address,address)", +"995b2cff": "executeAffirmation(address,uint256,bytes32)", +"995b2e2c": "getUnreadMessage(uint256)", +"995b40f3": "_getNextAuctionPrice()", +"995b4a80": "LogTokenSent(address,bool,string)", +"995b5aae": "feeInfo()", +"995cb4ec": "doWorkAndPayEAT()", +"995cc82b": "powerTotalSupply()", +"995cd653": "createSale(uint256,uint256,address)", +"995d9ab7": "getTags()", +"995e4339": "getResult(uint256)", +"995e599d": "ARCONA()", +"995f80e9": "NewSoftCap(uint256)", +"995fac11": "migration(address,address)", +"99600baa": "SVIP()", +"99603bfe": "CryptoDuelCoin()", +"9960d947": "grantKudos(address,uint256)", +"99613a3f": "metaSet(address,uint256)", +"9961476c": "MatchBetting(string,string,uint256,address,address,uint256)", +"996301e4": "claimTimeoutEnded(bytes32)", +"9963181e": "setAyantDroitEconomique_Compte_10(uint256)", +"9963a8e0": "fund(bytes32,string,address,uint256)", +"99645ba2": "changeStepLockFlag(bool)", +"9964622c": "_setPendingAnchorAdmin(address)", +"9964935e": "makePayout()", +"99649d06": "setInitialDeposit(uint256)", +"996517cf": "mintLimit()", +"99651db8": "addShares(uint256)", +"99653fbe": "submitVote(uint256,uint8)", +"9965b3d6": "claimProxyOwnership()", +"9965ea53": "setPFManager(address)", +"99671dfb": "Sacacoin()", +"99678b43": "setFunctionThreePrice(uint256)", +"9968b87b": "SogetiTestCoin()", +"99693026": "setInitialState(address[],uint256[],address[],uint256[100][],uint256[],uint256,uint256,uint256,uint256)", +"99694cf2": "WIKICOIN(uint256,string,uint8,string)", +"9969b256": "sendOwnersBalance(address,uint256)", +"996a4be3": "uintToBytes(uint256,uint256)", +"996a8046": "__callback(bytes32,string,bool)", +"996b434a": "littID()", +"996b8b76": "updateIndividualCertificate(string,bytes32,bytes32,bytes32)", +"996cba68": "claim(address,address,uint256)", +"996ccf0b": "CockToken()", +"996d21aa": "privateTotalSupply()", +"996d2d65": "addAtkBossQuest(address)", +"996d310d": "resumeTransfer(uint256)", +"996ea781": "getOrganName()", +"996ec1f3": "BigBlockCoin()", +"996ed6e1": "TransactionSucceeded(address,uint256,string,address)", +"996f3247": "closeWall()", +"996f677b": "icoInvestmentsCount()", +"996f7602": "GetTotalMinerCount()", +"99704b65": "isAcceptedImportingAuthority(address)", +"997072f7": "getMemberCount()", +"9970e26b": "ParyToken(string,uint8,string)", +"9971b98d": "getDesign(uint256)", +"9971c6ce": "gupToken()", +"99721229": "amountForBonus()", +"9972b76c": "haltedFX()", +"9973b827": "totalLotteryValue()", +"997402f2": "liquidityAdd()", +"9975038c": "burnAll()", +"9975091a": "pausePreSaleRound()", +"997519f2": "SingularityNetTokenMock(address,uint256)", +"99753de7": "clear_level()", +"99755bab": "ICOCents()", +"9975c06b": "logDebug(string)", +"99761662": "YouWin(address,uint256,uint256)", +"997636ec": "play(string,uint256)", +"997664d7": "totalDividends()", +"997676c3": "checkWhitelistExist(address)", +"99767aa9": "FLC(uint256,string,string)", +"9976d32a": "coinOwner()", +"9976f5c5": "ProofOfDoge()", +"9976f9e1": "setAgriChainCultivation(address)", +"99771006": "GLORY()", +"99777d9d": "isPublicTokenReleased()", +"9977a108": "isCollected(address,bytes32)", +"9977b698": "startTokensSale(uint256,uint256,uint256,uint256)", +"99789670": "Initialized(uint256,uint256)", +"9978be95": "TOKENS_ADVISORS()", +"9978f01b": "setExchangeRate(address)", +"997995ec": "revealResultUncleMerkleProof(uint256,uint40)", +"9979b7aa": "CETACEA(address)", +"9979c009": "buyItem(uint256,uint256)", +"9979ef45": "placeBid(uint256)", +"997a0229": "_newPrice(uint256)", +"997a12fa": "attowethBalance()", +"997a2c1c": "numberOfMyComponents()", +"997aa31f": "sellChannel(string,uint256)", +"997bc6c9": "int2str(int256)", +"997c44e4": "setLockRate(uint256)", +"997c88ba": "calculateCurrentDistanceInRange(address)", +"997ce600": "endauction(uint256)", +"997cf69c": "dataset_sha256checksum()", +"997d2df8": "asserti(bool)", +"997d8473": "reserveBalanceMap(address)", +"997dd1c6": "dealHitCard()", +"997e02d9": "wormholeIsOpen()", +"997f0198": "setImageHeight(uint256,uint16)", +"997f35ac": "RewardOffer(address,address,bytes32,uint256,uint256,uint128)", +"997f50d8": "getCurrentTierHardcap()", +"997f51e6": "GAMToken()", +"997fdb1f": "setLockTime(address,uint256,uint256)", +"997ffd13": "quarterFourth()", +"99801bce": "dagheAcqua(uint256)", +"99808aff": "winningTicket(address)", +"9980dee2": "calculateHash(address,address,uint256,uint256,uint256)", +"9980ec86": "getAmount(uint256)", +"99817b47": "releaseVestedTokensForBeneficiary(address)", +"9981bd61": "requestTokenExchangeMax()", +"99820e96": "finishSunning()", +"9982257b": "hotQuestion(uint256,uint256,uint256)", +"998282e9": "winners(uint32,uint32[],uint64[])", +"9982e7ed": "updateBillionsCoinsRemainingToDrop()", +"998446a8": "acceptRequest(uint256,bytes)", +"99847f77": "addUnsoldTokens()", +"9984f30d": "setMaxValue(uint256)", +"99851eac": "updateCards(uint8,uint256[])", +"99863b5c": "canChangeOwnerParams()", +"9986d936": "setRestrictedPercent(uint256)", +"9987680b": "play(address,bytes32)", +"99878d5b": "play_scissors()", +"99879bb9": "startTimeInSec()", +"9987b2d2": "getProposalIndex(address,uint256,bytes32)", +"99882cdb": "propose(bytes32)", +"9988807d": "centsReceived(address)", +"9989a5ae": "setLimitOfParticipants(uint256)", +"998a1f96": "preICORaised()", +"998ac104": "AIRDROP_TRANSIT_ADDRESS()", +"998b022e": "_mintPrimordialToken(address,uint256)", +"998b723b": "waterTree(uint256)", +"998b894a": "isLegalTime()", +"998bac16": "bulkTransfer(address[],address,uint256[])", +"998be0d7": "sendTokenToSingleAccount(address,uint256)", +"998c4f5a": "setEthExchangeWallet(address)", +"998cab7e": "getTransformTarget_pool(address)", +"998eb4cf": "getRank03()", +"998f9203": "INCash()", +"9990b3a3": "getPreSaleWallet()", +"9990db92": "CryptoSureToken()", +"999122f4": "BHK()", +"999377ec": "acceptBlokTokenOwnership()", +"9993fa94": "balanceOfSender()", +"9994e112": "AddContact(address,bytes32,bytes32,bytes32,bytes32,bytes32)", +"9995bbf7": "ethforp3dbuy()", +"99967819": "lastaction()", +"9996eb64": "batchNewAccount(address[])", +"99999342": "GetBonusInv()", +"9999aae5": "EYTToken()", +"9999bd2e": "RATE_PRESALE()", +"9999d2ae": "getSubmissionCount()", +"999a9965": "setMany(uint256,int256,uint256,bytes,address,bytes)", +"999b078e": "isSoftCapHit()", +"999b5c72": "FASET(uint256,string,uint8,string)", +"999cbaf5": "Deposit(address,uint256,uint8,uint256)", +"999cef04": "PublishWorldCupResults(bytes32,bytes32,bytes32,bytes12)", +"999d350d": "totalBonusGiven()", +"999d3947": "getGenes(uint40)", +"999d46b9": "transferInterviewer(address)", +"999dd03e": "poolAddressCapTier2()", +"999eb6b1": "balanceOfThis()", +"999f18a6": "unsigned()", +"999f4b38": "sellDividendPercent()", +"999f5644": "Stoppable()", +"99a032ce": "isCurrentAccountReader(address,address)", +"99a03c70": "realBalanceOf(address)", +"99a17344": "setHiddenLogic(address)", +"99a1a412": "getModeratorCount()", +"99a2e1ec": "roundLatLngFull(uint8,int256)", +"99a3e03f": "testNegativeIntegerKeyValue()", +"99a3f0e8": "right70(uint256)", +"99a44e68": "BEXP()", +"99a48638": "packSettings(uint256)", +"99a48e17": "FinalizableToken(string,string,uint8,uint256,address,uint256,address[],uint256[])", +"99a5d747": "calculateFee(uint256)", +"99a6993b": "KCCTOKEN()", +"99a6f7d2": "createReserveTokens()", +"99a752d7": "setPriceETH(uint256)", +"99a79790": "startTimeSale2()", +"99a7b857": "FundsWithdrawal(address,uint256)", +"99a7b884": "getBuyerFullInfo(address)", +"99a7e9db": "get_presale_iconiq_arbits_per_ether()", +"99a856e3": "firstBonusRate()", +"99a88ec4": "upgrade(address,address)", +"99a8f2fe": "EncryptedToken()", +"99a9a04c": "BITStationERC20()", +"99a9ccb2": "preMinedSupply()", +"99a9f1b5": "totalStakingUnits()", +"99aa5d97": "Pixel()", +"99aa93c8": "numSales()", +"99aba8e3": "distribute(address,uint256,uint256,uint256)", +"99abaabb": "addMarketToWasCalled()", +"99abd788": "FIRSTSALE_TOKENCAP()", +"99ac4569": "withdraw(uint64,address[],uint256)", +"99acc3fd": "prizeshow()", +"99ad91c7": "AddAdmin(address,address)", +"99ae6a16": "Winner(address,uint32,uint32,uint256)", +"99aeade3": "iterateTable(uint256,uint256)", +"99aef94a": "getMyEntitySimple(uint256)", +"99af4114": "createPet(uint256,uint16,address)", +"99afb9b9": "createValidatedRequest(address[4],address,uint256[12],uint256,bytes)", +"99b0dc4d": "areAllUppercase(bytes16)", +"99b1adbf": "isUserMember(address)", +"99b22701": "delBackend(address)", +"99b29044": "getPropertyEarnUntil(uint16)", +"99b2a233": "offlineGuardianSold(uint256,address,uint256)", +"99b465cb": "currentSegment()", +"99b47af8": "reveal_test_data_groups_block_size()", +"99b4a0c6": "BTRL()", +"99b55343": "termsNumber()", +"99b58f06": "icoPushAddr(uint256,address)", +"99b5b2fa": "horseIndexPrice(uint256)", +"99b632e4": "winnovate()", +"99b6f5a1": "sendAdvisorsTokens()", +"99b721a5": "rewardEthAnd(address[])", +"99b77032": "setMinBuyLimit(uint256)", +"99b83f3d": "setMaxRedemption(uint256)", +"99b8a3f0": "charityBalance()", +"99b8e366": "reloadPlayerInfo(address)", +"99bac5c9": "setMinCustomerBalanceETH(uint256)", +"99bad2cd": "testAddExistingVoter()", +"99bb8134": "approveMany(address,uint256[])", +"99bb875c": "funeralAndBirth(bytes,int256,bytes)", +"99bc0aea": "expiryTime()", +"99bc826e": "intMemoryArray()", +"99bcb1a1": "thirdWeekMainICOBonusEstimate()", +"99bdc9c2": "AdminAddition(address)", +"99bea0bd": "AllForOne()", +"99c0058c": "getAttackPlayerList()", +"99c20c34": "percentToFoundersAfterICO()", +"99c24d85": "SetCurrentRoomAndRound(address,uint8,uint256,bool)", +"99c27d40": "updateGlobalMin(uint256)", +"99c2af56": "setRateEarlyStage2(uint256)", +"99c2b93b": "startCrowdsalePhase1Date()", +"99c2bb40": "listAssetDocumentsFrom(bytes32,bytes32,uint256,bool)", +"99c32025": "TwoPhaseTransfers(address[],address[])", +"99c4644a": "putIdentityProvider(address,string)", +"99c49852": "cancelOrder(address)", +"99c59bdc": "MadeBet(uint256,uint8,address)", +"99c69d40": "getPremiumsAvailable()", +"99c6d2de": "depositToken(address,uint256,uint256)", +"99c6da4a": "UTWD()", +"99c724ef": "skipInLine(uint256,uint256)", +"99c75517": "GetCompetitionInfo(uint32)", +"99c8055d": "Enable()", +"99c8268b": "totalBattle()", +"99c87629": "getFibonziPlayers()", +"99c8d556": "tax()", +"99c8fcba": "agreeBetWinner(uint256,uint8)", +"99cac223": "getBallotIndex(address,bytes32)", +"99caf208": "updatePendingManager(address,uint256)", +"99cb0823": "presaleBonus()", +"99cbc1b9": "Bet(address,bytes32,bytes32,uint256,uint8,uint16,uint16,uint16,uint8,uint256,uint8,address)", +"99cc00d1": "getImageHeight(uint256)", +"99ccbec6": "claimByTeam()", +"99ccf3da": "_increaseToken(address,uint256)", +"99ccfd34": "forkUpgrade(address,address)", +"99cd211d": "bountyTokensWallet()", +"99cd40aa": "_setBytes(bytes32,bytes)", +"99cdee0e": "own()", +"99ce00a9": "VREO_SALE_OPENING_TIME()", +"99ce12c1": "getAssetClaimString(uint256)", +"99ce919c": "goods(bytes32)", +"99ceb6e6": "BTCReceived()", +"99ceed71": "OwnerTokensBurned(uint256,uint256)", +"99cf5582": "burnVotes()", +"99cfe1e1": "issueCofoundersTokensIfPossible()", +"99cfe743": "TotalGenesisAddresses()", +"99cffe4d": "LinearBeam()", +"99d0f06c": "removeNotes(uint256[],uint256[],uint256)", +"99d136f5": "multiSend(address[])", +"99d18937": "getAllDSP()", +"99d1c413": "isEggFactory()", +"99d1d002": "debug_blockHeaderMerkle(bytes)", +"99d1e755": "getTeamWallets()", +"99d22e48": "founderAllocated()", +"99d3acd3": "EtherDeltaDepositToken(address,uint256)", +"99d413f4": "createDividendPercent()", +"99d43acc": "organizerRegistration(string,string)", +"99d4aec9": "getPurchaseRequests()", +"99d50d5d": "getComponents()", +"99d52baf": "test_startBool()", +"99d5af62": "unLockBatchAddr()", +"99d64ab0": "maximumFunding()", +"99d67084": "numberOfInvestorsToWithdraw()", +"99d76e49": "setDragonName(uint256,string)", +"99d786ca": "lastMonth()", +"99d792a2": "releasePrivateSupplyVested()", +"99d7dd25": "isEcoAllocated9()", +"99d80ed9": "addService(bytes32,uint256)", +"99d83b77": "BuyRC(address,bytes,uint256,uint256,uint256)", +"99d897f8": "sellForOtherCoins(address,address,uint256)", +"99d9b306": "trancheMinTx()", +"99d9d1e0": "KNB()", +"99db626c": "LOG_SpinExecuted(bytes32,address,uint256,uint256)", +"99db7eb7": "TapPoll(uint256,address,address,uint256,uint256,uint256)", +"99dbff01": "buyCourse(uint256,uint256)", +"99dc79d1": "getBracketScore(bytes8)", +"99dd1ed9": "estLiquidationCap()", +"99ddb29b": "addressType(address)", +"99de4fc5": "UNK()", +"99def960": "getcredibilityScore(bytes12,bytes12)", +"99df3d7a": "setFunctionAuthorized(address,string,bytes32)", +"99dfa711": "GetCurrentTypeStartTime(uint256)", +"99dfedb4": "getTeamSumSkills(uint256)", +"99e0021f": "mergencyCall()", +"99e07caf": "updateItem(uint256,string,string,string,uint256)", +"99e0dd7c": "setTokenURIPrefix(string)", +"99e133f9": "init(address,address,address,address,address,address)", +"99e1cc47": "calculateAndSendRefund(address,uint256,uint256,uint256)", +"99e1d127": "filterWarriorAuras(uint256,uint256)", +"99e2ab0e": "UpdateMinFee(uint256)", +"99e3a723": "verifyOwner(bytes32,address,uint8,bytes32,bytes32)", +"99e47b2d": "DinoFarm()", +"99e487a9": "F2UPhone()", +"99e71b64": "secondBalance(address)", +"99e74ce8": "tokenIdToHeroInstance(uint256)", +"99e7c00a": "yaaay()", +"99e7cedf": "cobeneficiary()", +"99e8f303": "getM5Reward(address)", +"99e91527": "dequeueAuditRequest(uint256)", +"99e9376c": "buyWithCustomerId(uint128)", +"99ea0fd5": "disputeAllReporters()", +"99eb6603": "initalize(uint256)", +"99eb975c": "TransID()", +"99ec140d": "Tokensale()", +"99eca69f": "withdraw(uint256,address[])", +"99ecba80": "maxMinutesProposalPeriod()", +"99ed7b87": "getStrengthValue(uint256)", +"99ee9076": "defendFee()", +"99ef111c": "stopAddresses(address)", +"99eff1f7": "nextElectionIndex()", +"99f02ab5": "getWinnerContractAddress(uint256)", +"99f02b60": "IHFVesting(address,uint256)", +"99f07bed": "_clearCommittedValidators(uint256)", +"99f16c6e": "validateContribution(uint256)", +"99f1718a": "getSiteItem(uint256,uint256)", +"99f3379f": "getSolverAddress(bytes32,string)", +"99f3487b": "testBoolKeyValue()", +"99f49f0d": "vitPerWei()", +"99f4b251": "mine()", +"99f5c357": "modultradeStorage()", +"99f5c904": "momentValueOf(uint256,uint256)", +"99f6021d": "durationSec(bytes32)", +"99f65122": "getParam(uint256)", +"99f6a693": "setMasterName(uint256,string)", +"99f6d9af": "getTotalNumberOfRegisteredCompanies()", +"99f91c5d": "updateAllRewPaid()", +"99f9be87": "TEX()", +"99fa6ed7": "EthPledge()", +"99fb15d2": "distributionActive()", +"99fbe995": "Wallet(address[],uint256)", +"99fbf3a2": "setRentPrice(uint256,uint256)", +"99fca937": "amountOfEthersOwnerCanWithdraw()", +"99fd12f6": "etc()", +"99fd9489": "endCrowdsale(bool)", +"99fdc17e": "redenominatedValue(uint256)", +"99fe18b9": "fightBoss()", +"99fe6c88": "CashTCoin()", +"99ff0246": "onRefund(address,uint256)", +"9a003b61": "checkRequiredChange(uint256,uint256)", +"9a008d7b": "startPaymentProcess(address)", +"9a01b4d5": "getChannel(address)", +"9a02d3ac": "unapproveWithdrawal(bytes32,bytes32,uint256)", +"9a02edfe": "maxTokensPerAccount()", +"9a033782": "addContractToTokenFallbackWhiteList(address,address)", +"9a037aa0": "setReferralBonus(uint256)", +"9a03d9a3": "setERC721Address(address)", +"9a03fe1d": "Div(uint256,uint256)", +"9a0475e9": "ASHLEY_ADDRESS()", +"9a04a4ed": "setOpenInterestInAttoEth(uint256)", +"9a04ab73": "safeAddI(int256,int256)", +"9a04b89e": "setGiftoAddress(address)", +"9a04e602": "mintBounty(address,string)", +"9a04f704": "guest()", +"9a04fc8b": "getNodeParent(bytes32)", +"9a05cd66": "_setNarcosCoreAddress(address,address)", +"9a065a60": "discountTokenAmount()", +"9a065aae": "LMYY_Token()", +"9a06671e": "CoinsRetrieved(address,uint256)", +"9a06b113": "createPool()", +"9a06c2d3": "getRnMmasterReq()", +"9a073742": "setFeesWithdrawalAddress(address)", +"9a0750d5": "tokenFundDeposit()", +"9a0846f1": "MyKidsEducationFund()", +"9a08623a": "withdrawFromToken()", +"9a0907c2": "contributeAndVest()", +"9a09a8ef": "getCoinByCount(uint64)", +"9a0af2ec": "getStLength()", +"9a0b2db3": "withdrawFeeEntitlement()", +"9a0ca07d": "changeLocked(bool)", +"9a0d4f40": "PRESALE_PERIOD()", +"9a0d6247": "withdraw(uint8,bytes32,bytes32,uint256,uint256)", +"9a0e4ebb": "multiMint(uint256[])", +"9a0e7d66": "getTotalVotes()", +"9a0e7e8e": "secondSaleDelivery(address,uint256)", +"9a0e9e50": "newPoll(uint256,uint256,uint256)", +"9a0f1561": "prizeDeposit()", +"9a10f719": "setFreezeAddress(address,bool)", +"9a10f819": "buyOracle(bytes,address)", +"9a114fb0": "_Challenge(bytes32,uint256,uint256,string)", +"9a116ca1": "implementationCall()", +"9a1295d9": "getPassportLogic(string)", +"9a14228e": "getEntryPrice()", +"9a158883": "BOBOToken()", +"9a15f4f3": "getBlockHeader(int256,int256)", +"9a160ad9": "MeissaToken()", +"9a163c44": "currentVotingAmount()", +"9a165f6c": "currentCapTokens()", +"9a166299": "getMyAddress()", +"9a167613": "forceConsume(uint256)", +"9a16a7e3": "getAccountInputSdcslength()", +"9a18a5ba": "NEXPARA(uint256,string,string)", +"9a19a953": "setInt8(int8)", +"9a1a661e": "entranceFeePool()", +"9a1ac4b2": "OpenAddressLottery()", +"9a1b420b": "OraclizeAddrResolver()", +"9a1ca8d2": "SALE_ETHER_MIN_CONTRIB()", +"9a1e7ea0": "randomSatoShiTime()", +"9a1e9dc3": "Buy(bytes32,address,uint256,uint256,address,address)", +"9a1f6a0f": "setPacksPerClaim(uint16)", +"9a1fd3d5": "armyPlanesCount(uint256)", +"9a1fdc10": "createHorseShoe10(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"9a1ff4f4": "Ruthenium()", +"9a202d47": "removeAdmin()", +"9a206ece": "isSpender(address)", +"9a20821b": "claim_winnings(address)", +"9a21213e": "_getProviderOwner(uint256)", +"9a2160a7": "currentBetNumber()", +"9a221876": "project_contract()", +"9a22dec5": "buyAllAmountPayEth(address,address,uint256,address)", +"9a234885": "storeUserDataHash(uint256,bytes32)", +"9a2392b2": "getFirstBuyNum(bytes32,bytes32)", +"9a23ab61": "XXXXXXXX06(address,address,uint256)", +"9a2457c1": "getMiningAttempt(uint256,address)", +"9a251185": "isValidCertificate(bytes32,bytes32,bytes32)", +"9a267230": "END_TS()", +"9a276186": "getLentTime(uint256)", +"9a27b7ed": "setBounty(address,uint256)", +"9a2828f3": "setTechnicalWallet(address)", +"9a285ffb": "myDividendsYes()", +"9a28910a": "PrivateSaleBuy()", +"9a29ccf7": "_determinePid(address)", +"9a2a1f75": "CrowdsaleLeviusDAO(address,address)", +"9a2a224a": "setWallet(address,address,address,address,address)", +"9a2b4bdf": "ChangeTotalSupply(uint256,uint256)", +"9a2d2692": "withdrawToPoolOwnerFee(uint256)", +"9a2dcadf": "fundoShares(uint256)", +"9a2e27f8": "presaleEndDate()", +"9a2e6b40": "vote(uint80,bool)", +"9a2f9e92": "keeCrytoken()", +"9a2fb8c1": "startTimePrivatePreICO()", +"9a307391": "operator(address)", +"9a314b8e": "Group(string)", +"9a317cca": "getHWCAddressByIndex(uint256)", +"9a31a5f0": "transferManual(address,uint256)", +"9a31ac53": "setLastRegistration(string,int256,uint256)", +"9a31b14e": "set_totalSupply(uint256)", +"9a323ac4": "MAXfinney()", +"9a3241a6": "AddParticipant(address,uint256)", +"9a325e52": "exchangeRateRoundTwo()", +"9a336fed": "removeTotalCoinLock()", +"9a33aff9": "startDocumentPoll(bytes32)", +"9a33c610": "addPA(string,string,string,address,address,uint32,uint32,address,address,uint32,string)", +"9a33e300": "projectName()", +"9a344170": "test_insert_full()", +"9a347dd9": "tokensToFunder()", +"9a35f886": "__dig_then_proxy(uint256)", +"9a36f932": "feeDivisor()", +"9a37d1b7": "distributeEbyteForETH(address[],uint256,uint256,uint256)", +"9a38330d": "setIssuer(address,address)", +"9a388bd2": "CORAddress()", +"9a38ac79": "requireAuthorisation(bool)", +"9a38aeb1": "verifySignature(address,uint256,bytes32)", +"9a38bfae": "voteHash(address)", +"9a3a8c85": "ExiliumToken()", +"9a3aed36": "setMainAdmin(address)", +"9a3c4158": "setEthWallet(address)", +"9a3ce541": "price(bytes12)", +"9a3d1f3f": "twentyThirtyVault()", +"9a3dc23f": "_removeWhitelisted(address)", +"9a3ea7cc": "provas(bytes32)", +"9a3fc225": "getMinAuditStake()", +"9a3fc66d": "iouTokens()", +"9a3fd1fb": "tokenFallBack(address,uint256,bytes)", +"9a3fdfd0": "bountyTokensPercent()", +"9a406338": "VESTING_DATE()", +"9a40a316": "betting(uint256,uint8,uint256)", +"9a40d8f5": "equal(address[],address[],string)", +"9a41c1e6": "walletToVault(address,uint256)", +"9a429d2f": "setDisclaimer(string)", +"9a42adb3": "change_ico_start(uint256)", +"9a42af48": "getLastPrice(bytes32,uint8)", +"9a42c935": "forLottesy()", +"9a42f3aa": "reveal(uint256,uint8,bytes32)", +"9a4363cb": "setlockall(bool)", +"9a436c9b": "burnBasisPoints()", +"9a4373a6": "_internalTransfer(address,address,uint256)", +"9a437da2": "lookupPriorLottery(uint256)", +"9a438c5f": "ChangeInsuranceFeesOperationEvent(uint80,uint80,uint80,uint80,uint256,uint80,uint80,uint256,uint256)", +"9a43e59a": "VAA()", +"9a4435c6": "BitcoinGame()", +"9a443955": "setNumVotesRequired(uint256)", +"9a44690e": "finalizeSettingUpdate(uint256)", +"9a454b99": "deployedAtBlock()", +"9a459f75": "setShortDescription(string)", +"9a45a263": "decentBetMultisig()", +"9a45e3fe": "getChannelExist(bytes32)", +"9a465b85": "lastBlock_a10()", +"9a46793e": "roundsManager()", +"9a471416": "bountyFunds(address[],uint256[])", +"9a47700f": "checkExpires(bytes32)", +"9a4772cd": "LogClaim(address,uint256,uint256)", +"9a478b49": "join(uint256,bytes32)", +"9a47cee3": "convertGene(uint8[48])", +"9a48007d": "hasHourlyRateWithinRange(address,address,uint256[],uint256[])", +"9a483a8e": "exerciseExpiredEmployeeOptions(address,bool)", +"9a48eb3e": "tokenTransferProxyContract()", +"9a49eab5": "MINER_CREATION_LIMIT()", +"9a4a0fb2": "centralBank()", +"9a4ac102": "tinyIPFShash(string)", +"9a4b19e4": "SiaCashCoin()", +"9a4b1d5c": "verifyTransfer(address,address,uint256)", +"9a4b87f1": "setDrop(bool)", +"9a4b8fc9": "lockInSemiFinalPrize()", +"9a4bca21": "setMintTap(uint256,int256)", +"9a4ca3cb": "itemsOfOwner(address)", +"9a4cbb92": "getDamage(uint256,uint256,uint256)", +"9a4cd266": "test_fourValidEqBool()", +"9a4d19f8": "getAmountAccredited(address)", +"9a4dfa87": "OfferCanceled(uint256,address)", +"9a4e36d9": "antiques(bytes32)", +"9a4e9bff": "FXPay()", +"9a4ed149": "getBlocksquareFee()", +"9a4f1e2c": "ETCrossPotatoPresale(uint256,uint256)", +"9a4f78cc": "decreaseShares(uint256,address)", +"9a4fd88d": "crowdsaleSucceeded()", +"9a4fdf66": "nextBro()", +"9a507d9b": "feeHoldingAddress()", +"9a508c8e": "finalizeUpgrade()", +"9a5199fc": "goodbye(uint256)", +"9a51a31a": "ToToken()", +"9a526b97": "setPreIco(address)", +"9a52b339": "checkInterest()", +"9a54596b": "Token(uint256,string,uint256,string,string,address)", +"9a5483e6": "addRole(uint256,address,uint256)", +"9a556a59": "getCooldown(uint256,uint16,uint8)", +"9a56193b": "getNumberOfDerivatives()", +"9a565169": "ETHERGOLD()", +"9a5666b8": "SVLightBallotBox(bytes32,uint64[2],bool[2])", +"9a571d9f": "isAlphaLower(bytes1)", +"9a573786": "getKeysManager()", +"9a581271": "cursedContract()", +"9a586d26": "MAX_SALE_VOLUME()", +"9a58c33d": "batchAssetTransfer(address,uint256[])", +"9a592415": "LostPayment(address,uint256)", +"9a593b9a": "startCrowdfund()", +"9a599e37": "burnfromAdmin(address,uint256)", +"9a5a2d4e": "lastTimePriceSet()", +"9a5a6483": "milliTokensSent()", +"9a5c0abc": "sellCards(uint256,uint256)", +"9a5dd735": "getRichest()", +"9a5e095c": "_buyTokensInCurrentStage(address,uint256,uint256)", +"9a5eb28f": "BUYER_CAP_LOW_USD()", +"9a5f17ee": "ccEndTime()", +"9a5f54b3": "getTetherInts(address,uint256)", +"9a6203e9": "getClosingObligation(bytes32)", +"9a628121": "random256()", +"9a62b752": "becomeTurtlemaster()", +"9a63157a": "addressBankPartners()", +"9a64a276": "findById(uint256)", +"9a650fd8": "isTerminated(address)", +"9a651f0b": "firstStageRefund()", +"9a6524f1": "TOKEN_CAP()", +"9a65ddec": "getAddressByName(string)", +"9a65ea26": "startMinting()", +"9a661e66": "getGratitudesSizeOf(address)", +"9a670bbc": "secondPreSaleEndDate()", +"9a68323c": "getRoundDetails()", +"9a684658": "_getBlockIndex(uint256,uint256)", +"9a6921e4": "getOpGas()", +"9a6a30a4": "reclaimEther(address)", +"9a6a68e9": "numberWinner()", +"9a6b32e1": "claim_reward(uint256,bytes32)", +"9a6b607f": "distributeTokensToMembers()", +"9a6bd379": "powerUp(uint256)", +"9a6ced6d": "bountyAgents(address)", +"9a6d3aaa": "bet(uint256,bool)", +"9a6d7cb8": "_canMateViaMarketplace(uint40,uint40)", +"9a6d9671": "combineMyGirls(uint256,uint256)", +"9a6dac14": "getLOTBalance(address,address)", +"9a6dfeff": "totalVotesForParty(uint256)", +"9a6e9914": "deleteArrayString(bytes32,uint256)", +"9a6ec511": "_buildId(address,uint256,bool)", +"9a6edad1": "Jupiter()", +"9a6f978d": "DIP()", +"9a6fb6df": "productionUnitTokenContractCount()", +"9a6fcbdd": "popElement()", +"9a6fe50c": "getLatestForContractAddress(address)", +"9a701075": "WITHDRAWAL_END()", +"9a702ad5": "AVAILABLE_JOINTTOKENS()", +"9a70855e": "exchangeFlag()", +"9a70eb1a": "onSaleAmount()", +"9a713233": "pre_end()", +"9a71825e": "sellKnowledge()", +"9a721302": "SUPPLY_FOR_BOOUNTY()", +"9a722769": "autoFinishTime()", +"9a727526": "getManagementInfo()", +"9a729d03": "token_bid(address,uint256)", +"9a72afb6": "setIsDisputeActive(bool)", +"9a730617": "init(address,uint256,uint256,uint256,uint256)", +"9a7394f5": "setData_34(string)", +"9a7443da": "stageUsdCap(uint16)", +"9a74adda": "moveAccountIn(address)", +"9a74c10c": "getDefaultReportingGasPrice()", +"9a751072": "applyChangeWalletAddress(address,address)", +"9a75aa06": "emitPublicCapabilityAdded(address,bytes4)", +"9a7614ee": "acceptEther(uint8)", +"9a7615a2": "burnOwner(uint256)", +"9a772bce": "TokenCappedCrowdsale(uint256,uint256,uint256)", +"9a7754d6": "StagedCrowdsale(uint256)", +"9a777d5d": "buyCoins()", +"9a7853cd": "postTX(address,string,uint256,uint256,uint256)", +"9a78afc6": "reduceDiv_()", +"9a78c066": "checkExistsInArray(address)", +"9a78c562": "setSellingTime(uint256,uint256)", +"9a797128": "withdrawed()", +"9a79f4a8": "testFailHeaderInsufficientFee()", +"9a7a3293": "NoFakeCoin()", +"9a7a7c11": "makeRoll(uint256)", +"9a7b5b7b": "tryClose()", +"9a7baa81": "EcomethToken()", +"9a7be471": "updateMinDeposit(uint256)", +"9a7d5211": "TheDigitalStandard()", +"9a7db5d9": "adminSendWorldBalance()", +"9a7e00ef": "acceptBet(uint64)", +"9a7e9e1f": "executeByAction()", +"9a7ee18c": "AccountIsNotFrozen(address)", +"9a7efb7f": "giftFor(address,address,uint256)", +"9a8061e8": "setLicenceShopPrice(bytes2,uint256)", +"9a80e52f": "updateTknPrice(uint256)", +"9a819e5e": "forceLiquidation()", +"9a82031e": "getRoundWinnigNumbers(uint32)", +"9a824f00": "transferTobucketTwoContract(address)", +"9a828a71": "oracalizeReading(uint256,string)", +"9a82a09a": "cancelled()", +"9a82c93c": "PRESALE_ENDTIMESTAMP()", +"9a82f890": "isOracle()", +"9a8318f4": "total_withdraw()", +"9a8335e0": "sendTo(string)", +"9a841413": "deleteDeployer(uint256)", +"9a84792b": "onReturned(address,uint256,uint256)", +"9a84d0c4": "addToken(address,string,string,string,uint8,bytes32,bytes32)", +"9a862c2d": "stage2StartTime()", +"9a863892": "NewProposal(uint256)", +"9a86acda": "getHeld(uint256)", +"9a86cd04": "shittyRand(uint256)", +"9a87ebb5": "changeAllowances(uint256,uint256)", +"9a880629": "dStartsNow()", +"9a880848": "attackhill(uint256)", +"9a881ab4": "payToFines(uint256)", +"9a882b7a": "createtoken(string,string,string,string,string)", +"9a891058": "keyIndex(bytes32)", +"9a89ad65": "within6Confirms(int256,int256)", +"9a8ae2fa": "changeLastFreeBlock(uint256)", +"9a8b3d8f": "getClientProjects(address)", +"9a8ca12c": "icoEnds()", +"9a8cea55": "testPush()", +"9a8cea82": "calculateDevFee(uint256)", +"9a8d10a3": "addData(uint256,bytes32)", +"9a8d36fa": "_openGameRange(uint256,uint256)", +"9a8d86c5": "CrowdSale_Finalize()", +"9a8e7b02": "ProposalClosed(uint256,uint8,uint256,uint256,bool,uint256,uint256)", +"9a8f09bd": "newKing(address)", +"9a8f139d": "getPercent1(address)", +"9a8f4dbf": "CancelSellOrder(uint32)", +"9a8f71f7": "saveData(bytes32,uint256)", +"9a8f72d1": "pruebacn123()", +"9a900e8c": "changeDepositWalletAddress(address)", +"9a903ca7": "allocateTokens(address,uint256,uint256,uint256)", +"9a9249a8": "_calculateCurrentPrice(uint256,uint256,uint256,uint256)", +"9a92b7e7": "EthVenturesFinal()", +"9a93e940": "testFailCreateNewRevisionNotUpdatable()", +"9a94ab9c": "addDelegate(address,string,address,uint256)", +"9a953408": "CHLORINETOKEN()", +"9a954af9": "getFreeToken()", +"9a956915": "icoInvestors(address)", +"9a95ca48": "presaleCapReached()", +"9a95d0e4": "DEEO()", +"9a960778": "SBK()", +"9a961416": "gameNext()", +"9a967e3b": "nextMember()", +"9a969768": "distributeProfits(uint256)", +"9a96f829": "devs()", +"9a97043b": "depositIdx(address)", +"9a98aa1e": "Scorpio(uint256,string,string)", +"9a98ac88": "GCSToken()", +"9a999359": "priceUpdatedTime()", +"9a99ebf4": "drainGame(bytes32,bytes32,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"9a99f7e0": "isModOrCreator()", +"9a9a5cdb": "checkEthBalance(address)", +"9a9b1709": "PGGamePlatform()", +"9a9b5323": "AlforroCoin()", +"9a9bc131": "aidrop(address[])", +"9a9c29f6": "settle(uint256,uint256)", +"9a9c437d": "CryptFillToken()", +"9a9c9c53": "DepositToBankAccount()", +"9a9d0935": "totalBountySupply()", +"9a9d6515": "APPC()", +"9a9e3fd8": "successful()", +"9a9ed624": "ProfitLoaded(address,uint256)", +"9a9f1304": "drawMini()", +"9aa035dd": "dev_multisig()", +"9aa03cc6": "calculateExchangeFee(uint256)", +"9aa07ed7": "DietEthereum()", +"9aa0a50e": "btcDeposits(bytes32)", +"9aa0ff7b": "SALE_END()", +"9aa1001b": "withdrawRewardPool(address,uint256)", +"9aa10ebf": "Story()", +"9aa13f04": "contractStart()", +"9aa1dab7": "removeOversight(address)", +"9aa26f06": "registerBytes32(address,bytes)", +"9aa287d9": "setIco1Tokens(uint256)", +"9aa3a443": "acceptContribution(address)", +"9aa4a64e": "set_patient(uint256,uint256,string,string)", +"9aa57922": "Bhtd()", +"9aa5ee73": "finalizeConfirmationPeriod()", +"9aa5f467": "phase_3_token_price()", +"9aa615ee": "initCrowdsale(uint256,uint256,uint256)", +"9aa72320": "EthereumCare(uint256,string,uint8,string)", +"9aa727f6": "mult(uint256,uint256)", +"9aa72b71": "shareAmount(address,uint256,uint256,uint256)", +"9aa74525": "increaseWithoutCounterparty(bytes32,uint256)", +"9aa84b0b": "blockNode(address)", +"9aa92f0c": "previousRounds(uint256)", +"9aa93224": "sendOre(address,uint256)", +"9aa99dc8": "ownerPauseJackpot(bool)", +"9aa9f27b": "privateSell2Address()", +"9aaa38a6": "ChangeComission(uint256)", +"9aaa3eec": "updateNickname(address,string)", +"9aaa4696": "transferRaw(address,uint256)", +"9aaa5750": "addGoldTransaction(string,int256)", +"9aaa6b4d": "getAttackAddress()", +"9aaac864": "isInitialBlockTimestampSet()", +"9aab0c7a": "BitUPToken()", +"9aac9e91": "EndPreSale()", +"9aacb10a": "setNewCreator(address,uint256)", +"9aacb18c": "getSolution(uint256,uint256)", +"9aae3d0e": "maxWeiTier1()", +"9aaf442c": "applyCensorship(uint256)", +"9aaf5e05": "allocateTokensBeforeOffering(address,uint256)", +"9aaf9f08": "getVersion(bytes32)", +"9aafbff0": "addEntryIn24WeekPeriods(address,uint256,bool,uint256)", +"9ab060de": "milestoneBonus()", +"9ab06fcb": "setPayment(address)", +"9ab102ac": "isAffiliated(address)", +"9ab1416c": "accept_B_coupons(address,uint256)", +"9ab1b484": "distributeTokens()", +"9ab1d468": "privateSaleTransfer(address[],uint256[])", +"9ab253cc": "transferToICAPWithReference(string,uint256,string)", +"9ab2cf0d": "checkLockedBalance(address,uint256)", +"9ab3161d": "AnimalFactory(address,address)", +"9ab361a2": "unlockTimeLine()", +"9ab3a1fd": "setMvpExists(bool)", +"9ab3bfd7": "Tier_Basic_Registration()", +"9ab42287": "getAllAnimalsByAddress(address)", +"9ab422f3": "register(string,uint256,uint256,uint256,uint256,address[])", +"9ab448d9": "updateForkValues()", +"9ab4833e": "viewToken()", +"9ab4b22f": "releasedBalance()", +"9ab4d3a8": "checkInvestorReturns(address)", +"9ab567ba": "batchTransferForSingleValue(address[],uint256)", +"9ab61631": "_removeVesterManager(address)", +"9ab79905": "withDiscount(uint256,uint256)", +"9ab7d0b7": "setTheName(string)", +"9ab7f298": "add_user(bytes32,bytes32,int256)", +"9ab80f14": "BuyPrice()", +"9ab86b78": "getVoteHubDetails()", +"9ab90ba0": "realityID()", +"9ab95202": "babzBalanceOf(address)", +"9ab9ee73": "prPool()", +"9abb08ed": "migrateStateFromHost()", +"9abb2c16": "getAuctionsCountForUser(address)", +"9abb9e78": "powerDayEthPerPerson()", +"9abc03d2": "auctionsStartTime()", +"9abd3572": "claimDividend(uint256)", +"9abd7d50": "SelfDestructTime()", +"9abe275f": "closeChannel(address,bytes32,uint256,bytes32,bytes)", +"9abe3906": "closePreICO()", +"9abec159": "DISCOUNT_STAGE_THREE()", +"9abeddf8": "getLastUnionId(bytes32,uint8)", +"9abfba20": "DeleteBillModerator(address)", +"9ac08dfd": "receiveApproval(address,uint256,address,bytes1)", +"9ac17057": "execute(uint128,uint128)", +"9ac18b19": "REQUIRED_SIGNATURES()", +"9ac1f9a1": "add_commitment(uint256)", +"9ac22e5b": "test_oneTrueAndFalseAssert()", +"9ac233f3": "Monarchy()", +"9ac2ba20": "start_all()", +"9ac3317b": "grantMultiplePermissions(address,bytes32[])", +"9ac3fce6": "getBankReg(address)", +"9ac467f9": "getAllSigners(uint256)", +"9ac4fa49": "isAirdropStopped()", +"9ac50a62": "tenmatest()", +"9ac58d58": "get_len()", +"9ac785ba": "LockDate(uint256,uint256)", +"9ac8cd1b": "calcJackpotFee(uint256)", +"9ac97e84": "getNumDIDHolders()", +"9ac9940f": "assetOwner()", +"9aca6e2e": "calculate_total_shares(uint256,uint256)", +"9acab88c": "forwardFunds(uint256,address,address)", +"9acade7e": "testFailTransferDisableNotEnabled()", +"9acae9fc": "createChannel(bytes32,uint256,uint256)", +"9acb1506": "_createMeme(string,uint256,address)", +"9acb1ad4": "right37(uint256)", +"9acb3824": "getHorsesInStud()", +"9acba2af": "durationSeconds()", +"9acbdcab": "updateNoteButContent(uint64,uint16,bytes12)", +"9acd07b5": "closeChannel(uint8,uint256,bytes32[4])", +"9acd5e0e": "getGuestNotes(address,address)", +"9acdc0e3": "setCommunityTokensHolder(address)", +"9acf603b": "token_wallet_address()", +"9acf6ff4": "distributeRemaining()", +"9acfb1a8": "getCCH_edit_25()", +"9ad0a5ac": "addWhitelisted(address[],uint8[],uint256[])", +"9ad0c86c": "IouRootsToken(uint256,address,string,string,uint8)", +"9ad10d79": "PELOMemberIDMap(uint32)", +"9ad1b348": "getKNCRateRange()", +"9ad1c999": "setdevFeeAddress(address)", +"9ad25a68": "COSMOTokenERC20(uint256,string,string)", +"9ad26744": "removeAuthorizedAddressAtIndex(address,uint256)", +"9ad3a7ba": "renounceWhitelister()", +"9ad4eccf": "sentTokensToFounder()", +"9ad4f658": "CATToken(address,address,address,uint256,uint256)", +"9ad4f98e": "BlocksureInfo()", +"9ad55220": "getPrivate()", +"9ad5be7b": "setPlayValue(uint256)", +"9ad73f20": "runPluginSigned(address,uint40,uint40,uint128,uint256,uint8,bytes32,bytes32)", +"9ad74f81": "setAllowTransferGlobal(bool)", +"9ad7ebc3": "specialPoolsRate()", +"9ad89ac4": "settleCancel(bytes32[8],bytes)", +"9ad8b5b7": "addAttachmentToCollectible(uint256,uint256)", +"9ad900d6": "get_first_asset_document(bytes32)", +"9ada7a4c": "NumberTaken(uint256)", +"9adba14b": "logStr(string)", +"9adc15ef": "ShaBi()", +"9adcb5eb": "acceptBet(uint256,uint8)", +"9add2ad9": "MIN_ETH_TRANS()", +"9ade76f4": "VestingCreated(address,uint256,uint256)", +"9aded5dc": "deathData_a6()", +"9ae000c6": "WeedToken()", +"9ae0140c": "removeRoleCapability(uint8,address,bytes4)", +"9ae06672": "getDailyTimeLeft()", +"9ae066b0": "foundationDeposit()", +"9ae082a4": "PooShitToken()", +"9ae120dd": "closeZoneTeller(bytes2)", +"9ae13375": "groupDates(uint256)", +"9ae1a635": "Q500()", +"9ae1c4f8": "mintToken(uint256,int256)", +"9ae21121": "lastowner()", +"9ae2835c": "balanceOfIssuer(address)", +"9ae38844": "newMembers()", +"9ae466bf": "recipientETH()", +"9ae4e388": "ChangeClientTokenAccount(address,bool)", +"9ae51a1f": "getTeamlistSupportInTournament(uint256)", +"9ae568b1": "CreateSEEDS(address,uint256)", +"9ae5dc91": "setNTToken(address)", +"9ae6303d": "getHatchDurationByTimes()", +"9ae6309a": "currentMintableTokens()", +"9ae65eea": "addProposal(string,string,string,address)", +"9ae6892b": "transferOwnershipToken(address)", +"9ae6b186": "bZxTo0xV2Contract()", +"9ae6cac7": "SemainToken()", +"9ae6ef15": "getCumulativeIncome()", +"9ae7a909": "multiPartyTransfer(address[],uint256)", +"9ae8886a": "p()", +"9ae8ac3c": "TRADING_STARTED()", +"9ae8b6a1": "WMCToken()", +"9ae980a8": "setMinWager(uint256)", +"9ae9d383": "getnotice()", +"9ae9ff6a": "withdrawBeforeVoting(uint256)", +"9aea020b": "sellDeadline2()", +"9aea5485": "revealMove(uint256,uint8,uint8,string)", +"9aeb14a5": "sumHardCapPreICO()", +"9aeb5947": "payToCharm(string,uint256)", +"9aeb69a2": "withrawWin(address,uint256)", +"9aebdf7e": "updateJackpotLeft(uint256)", +"9aece83e": "set_manager(address)", +"9aecea62": "finalizeIPO()", +"9aeceb1d": "transferBallance()", +"9aecfb8a": "Etharea()", +"9aed58c6": "_destroyRobot(uint256)", +"9aed6ac9": "registerPresaleContributor(address,uint256)", +"9aed7c15": "sendBalanceERC20(address,uint256)", +"9aedabca": "valueOfShares()", +"9aedb1f1": "setVotingQuestions(string,string)", +"9aee046b": "callOracle(uint256,uint256)", +"9aeea806": "MARKET_CHANGE(address)", +"9aef0c6c": "privateSaleClosingTime()", +"9aef319f": "closeBlacklistSwitch()", +"9aef8999": "removeWhiteList(bytes32)", +"9aefff29": "totalSupplyPreSale()", +"9af003bd": "ChangeConversionRate(uint256,uint256)", +"9af041aa": "currentSaleStage()", +"9af1d35a": "fees()", +"9af1ef32": "offerHelp(address,address)", +"9af22f9c": "Shiner()", +"9af25d07": "releasedRoundCount()", +"9af26b78": "finishMinting(bool)", +"9af28b65": "NEXT_POT_FRAC_TOP()", +"9af2b100": "Permissions()", +"9af2cad2": "CryptoCoin()", +"9af32035": "addIcoPurchaseInfo(uint256,uint256)", +"9af3352d": "updateGuReferral(uint256,uint256,uint256)", +"9af3b527": "getOwnerOfCardsCheapestWager(address,address)", +"9af4afb3": "BlueOs()", +"9af4b5c8": "isOwedFreeReferralPack(address)", +"9af55773": "minSumICOStage6USD()", +"9af605cb": "__proxy(address,bytes,uint256)", +"9af6489d": "CheckTree(address)", +"9af64d80": "previousstageplayer1()", +"9af6549a": "beneficiaryWithdraw()", +"9af75b29": "tokensMintedForOperations()", +"9af88ebd": "_createOpinionSet()", +"9af8c4ba": "respond(uint256,address,bytes)", +"9af8f5de": "totalEDUSLeft()", +"9af917f4": "addRentable(bytes32,uint256,uint256,uint256,uint256)", +"9af95a4b": "dateBonus(uint256)", +"9af9f012": "wavesAgent()", +"9afa3dc7": "ADVISOR_STAKE_THREE()", +"9afb24ab": "setCLIForGas(uint256)", +"9afb93cb": "buyTicket(uint256,string)", +"9afbe49a": "tokenAmountOfPeriod(uint256,address)", +"9afcfba3": "getBurnRequestStatus(uint256)", +"9afd46a3": "closeTurnByHand(uint32)", +"9afd8b1d": "LiteBoxToken(address,string,string,uint256,uint256)", +"9afd9d78": "rollback()", +"9afe340f": "OasisToken()", +"9afebd18": "contract_finish()", +"9afec0ae": "ESOPLegalWrapperIPFSHash()", +"9aff301f": "FightClockAuction(address,uint256)", +"9affa42d": "increaseApprovalBatch(address[],uint256[])", +"9b012dec": "denyTransfer()", +"9b013aee": "getBidPrice(uint256)", +"9b01c7ac": "getFishIdByAddress(address)", +"9b02e258": "changelp12(address)", +"9b03a211": "transferPresaleTokens(address,uint256)", +"9b04564a": "proposeTeamWithdrawal(address)", +"9b046ed3": "getCharacterTraits(uint256)", +"9b05535f": "checkpointBlock()", +"9b059309": "GoshenCoinCash()", +"9b05934c": "calculateSecretHash(uint256,bool,bytes32)", +"9b0646f6": "wadmin_setContrAddr(address,address)", +"9b06e9f5": "seTJackpotPersent(uint256)", +"9b087b2d": "totalTransferred()", +"9b08a22f": "allowTransfer()", +"9b08ace1": "bonusSecondWeekPeriod()", +"9b08e8fc": "changeParent(address)", +"9b092f73": "safemul(uint256,uint256)", +"9b09768a": "maximumPoolPurchase()", +"9b09dfbd": "addArrayItem(address,string,string,address)", +"9b0a4764": "AkirasToken()", +"9b0a541e": "LogAllowedToAddress(address,bool)", +"9b0a5e67": "buy(string,uint256,uint256)", +"9b0aac15": "maxTokenSupplyPublicSale()", +"9b0ac9b0": "refundTime()", +"9b0b5bb2": "MIN_BANKROLL()", +"9b0b9c07": "acceptBankDraft()", +"9b0c1e51": "BONUS_MAX_DURATION()", +"9b0d1b2c": "getSpawningFor(address)", +"9b0ec5ae": "newSeed()", +"9b0ee7b7": "updateAirdropEndTime(uint256)", +"9b0f2510": "placeLong(address[2],uint256[8],uint8,bytes32[2])", +"9b0facaa": "existIdBeforeVersion(bytes32)", +"9b10394c": "IsOnSale(uint32)", +"9b10e9f7": "rawDetailsOf(bytes32,bytes32)", +"9b110f4b": "GayPersonalAdsToken(uint256,string,uint8,string)", +"9b11503e": "PUBLIC_SALE_START()", +"9b121e7c": "wethWithdraw(uint256)", +"9b12664f": "referralMinimum()", +"9b129181": "LTE()", +"9b12a4a1": "setCanDisburseMultipleTimes(bool)", +"9b132392": "createTrainer(string,uint16)", +"9b139504": "addPlayer(string,address,uint256,uint256)", +"9b13d209": "buyGuardianRune(uint256,uint256,uint256,uint256)", +"9b15ef2e": "END_PRESALE_TIMESTAMP()", +"9b16250a": "finishSign(uint256)", +"9b164ce3": "TestApprove()", +"9b173d57": "withdrawPolicy(uint256,uint256,uint256,address)", +"9b17b2dc": "checkWeather()", +"9b181e39": "_isAccepted(address,address)", +"9b18d79a": "one_ether_usd_price()", +"9b19251a": "whitelist(address)", +"9b19a92b": "year1LockAddress()", +"9b1a78c0": "ClaimGMT(address,uint256)", +"9b1a9b23": "destinationAddress80()", +"9b1ad792": "destroyToken(address,uint256)", +"9b1b0ab3": "buyingEscrowAddress()", +"9b1b615e": "pool(uint256,uint256)", +"9b1b8f62": "_gapOfSquareSum(uint256,uint256)", +"9b1bb323": "initContract(address,address,address)", +"9b1cbccc": "finishDistribution()", +"9b1cdad4": "postBounty(uint128,uint256,string,uint256,uint256,uint256[8])", +"9b1d767f": "fstTotalSupply()", +"9b1d8032": "clz32(uint32)", +"9b1d834c": "genPot_()", +"9b1dd3e5": "pullRipCord()", +"9b1e3825": "approveFundTransferToSupplier(address)", +"9b1f46cd": "allMilk()", +"9b1f70d1": "BET_RELEASE_DATE()", +"9b1f9e74": "_burn(uint256)", +"9b1fe0d4": "isApprovedInvestor(address)", +"9b21003b": "notPauseable()", +"9b2112c7": "ShopDexToken()", +"9b217f90": "getVestingTime(address,uint256)", +"9b21929a": "TOTAL_SUPPLY_BOTTOM_BOUND()", +"9b227a97": "ETH_TLD_LABEL()", +"9b22c05d": "test(int256)", +"9b234a9e": "tokensByWavesTx(string)", +"9b248798": "_InsufficientFunds(address,uint256,uint256)", +"9b24b3b0": "getRoot(uint256)", +"9b250f76": "clientInit()", +"9b252b7e": "t3Token()", +"9b256f46": "changeRoundBlock()", +"9b25e6f1": "ReservedTokensDistributed(address,uint8,uint256)", +"9b263eca": "providerContract()", +"9b267540": "unblockTokens(address,uint256)", +"9b26bae3": "AliciaToken(string,string,uint8,uint256)", +"9b276964": "STARTING_BAT()", +"9b27bf3a": "setWhiteListStatus(bool)", +"9b2843e2": "randomDNA(uint256)", +"9b285582": "ChangeIp(bytes32,bytes32)", +"9b28db50": "getWalletId(address,bytes32)", +"9b28f644": "setupFunctionalAddresses(address,address)", +"9b28f75a": "reclaimBalanceTokens()", +"9b29a295": "Payable(address,uint256)", +"9b29cb23": "getDailyPayment()", +"9b29f133": "userCancelActiveGame(uint256)", +"9b2a9d19": "origDev()", +"9b2aab1d": "frozenAccountOf(address)", +"9b2b0031": "updateDescriptiveInformation(address,string,string,string,string)", +"9b2b89d4": "UCAL(uint256,string,uint8,string)", +"9b2bdc20": "claimAllowanceOwnership()", +"9b2cb5d8": "minAmount()", +"9b2d2cbd": "orePrice()", +"9b2e5d32": "claimItems(uint256,uint256)", +"9b2ea4bd": "setAddress(string,address)", +"9b30a187": "nextWave()", +"9b30c7db": "changePortalAddress(address)", +"9b311b17": "averageMinerSalePrice()", +"9b322b7e": "HuandeToken(uint256,string,uint8,string)", +"9b3235bf": "getAbel()", +"9b33093f": "createNew(address,address,uint256)", +"9b332a91": "payDate()", +"9b33d7b3": "createAuction(uint256,uint256,uint256,uint256,bool)", +"9b33f055": "cancelSubscriptionOffer(uint256)", +"9b343342": "getRandomPrice(uint256)", +"9b343525": "highestContribution()", +"9b343e35": "createChildContract(string,uint256,uint256)", +"9b347f42": "teamVesting2Years()", +"9b34ae03": "winningOutcome()", +"9b350e12": "isEscaping(uint32)", +"9b351087": "cancelTreeSell(uint256)", +"9b3544f6": "postAssertion(uint128,uint256,uint256,uint256)", +"9b35928f": "RXBbitToken()", +"9b35b35a": "lockTs()", +"9b36057c": "registerGame(address)", +"9b3662bf": "currentParticipants()", +"9b367370": "confirmBlackFlag(uint256,bool)", +"9b36c3bc": "setMaxTotalAmount(uint256)", +"9b3725e8": "stageGenomes(uint8)", +"9b39caef": "COIN_PER_ETHER()", +"9b39f377": "getAnimalByIdVisibility(uint256)", +"9b39f9bf": "remainingTokensForSale()", +"9b3a300b": "SNK(uint256,string,string)", +"9b3a36c0": "calculateTokensWithBonus(uint256)", +"9b3b24ba": "VESTING_AMOUNT()", +"9b3ba79f": "maxAllocation()", +"9b3bc6fb": "checkERC20Balance(address)", +"9b3cbdf6": "CrowdSale(address)", +"9b3d17b1": "tokenSPUsdCentPrice()", +"9b3dfce0": "isPoDStarted()", +"9b3e28cc": "TokenReceivingEchoDemo(address)", +"9b3e9a48": "changeFreezeTime(uint256,bool)", +"9b3ee16e": "initialize(address,address,uint256,uint256,address,address,address,address)", +"9b3fd75d": "beginGame(uint256,address,address)", +"9b3fdf4c": "EVMSCRIPT_REGISTRY_APP()", +"9b409510": "creditAdvertiser(address)", +"9b415b2a": "erc20Payment(bytes32,uint256,address,address,bytes20,uint64)", +"9b41a9c5": "SedoPoWToken()", +"9b41b00b": "Sorus()", +"9b426e62": "assignTester(address)", +"9b44cb3c": "lastTrade()", +"9b46301e": "playersPerRound()", +"9b46461e": "getAnimalIdAgainstAddress(address)", +"9b46a71c": "setContractCap(uint256)", +"9b4778e4": "get_arbits_sale_open()", +"9b480435": "setPublicPlacementNum(uint256)", +"9b487f3f": "_forwardTransferFromToICAPWithReference(address,bytes32,uint256,string,address)", +"9b49413c": "GetItemInfo(uint256)", +"9b4a6bdb": "test_spamVoting()", +"9b4a7fe9": "setCCH_edit_17(string)", +"9b4b2d77": "processOffchainTokenPurchase(address,uint256)", +"9b4b973d": "acceptSettlement(uint256,uint256)", +"9b4bb9f0": "schedulePriceUpdatesFixed(uint256[])", +"9b4c1290": "_getFishPrice(uint16,uint16,uint8,address)", +"9b4c1902": "getGovtApplicationByIndex(string,uint256)", +"9b4c7b70": "redemptionFundTotal()", +"9b4d54fc": "startCrowdsale2(address)", +"9b4d9ecc": "setGrowCost(uint256)", +"9b4e533e": "isLastWithdraw(address)", +"9b4f19c6": "getMonths()", +"9b4f1ecb": "initialCost()", +"9b504387": "controllerTransfer(address,address,uint256)", +"9b51e35a": "getSchemePermissions(address,address)", +"9b52cacc": "ListingCreated(bytes5,uint256,uint256,uint256,address)", +"9b539a17": "setEncryptKey(string)", +"9b53a396": "calcKicks(uint256)", +"9b53d87c": "isManagerEnabled(address)", +"9b550e55": "nextMineId()", +"9b563fa3": "save(uint256,string,string)", +"9b566564": "withdrawAirdrop(uint256,bytes)", +"9b56730d": "compoundInterest(uint256,uint256,uint256,uint256)", +"9b5696b0": "notCollectedAmountAfter24Hours()", +"9b56d6c9": "getCollateral(address)", +"9b5719a6": "setSalesContract(address)", +"9b58316a": "EBANKTOKEN()", +"9b58b463": "retire(address,address)", +"9b58e46b": "createProduct(string,bool,uint256)", +"9b5906e5": "getLifeCoin()", +"9b598caf": "pastProposalTimeRules()", +"9b59ffd7": "verifyGame(bool)", +"9b5a2e13": "setBadgeGiver(address)", +"9b5a66e6": "insertInPlace(uint8[],uint8)", +"9b5adea2": "setMinter()", +"9b5b094f": "ANMOToken()", +"9b5b4019": "EtherWild()", +"9b5b969f": "transferSub(address,uint256)", +"9b5c0b5e": "burnPerweiYearly()", +"9b5cc9f4": "transferOwner1(address)", +"9b5cfcdd": "account1Address()", +"9b5d2e78": "TPI()", +"9b5d7d0b": "addBalanceReplenishment(uint256,uint256,uint16,bytes32,uint256)", +"9b5d8e63": "Multiplexor()", +"9b5e5d8c": "newCustomFutureLottery(uint256,uint256,uint256,address,uint256)", +"9b5f8abb": "getAllSponsors()", +"9b5fde7d": "payOut(uint256,string)", +"9b601c4d": "getQueryPrice(string)", +"9b60a443": "payto1()", +"9b612a1b": "freezeStaking(address)", +"9b619d3b": "_deleteAllPackedRevisionBlockNumbers(bytes32)", +"9b61cf09": "MOBILITYCREDIT()", +"9b624e7b": "setRound(uint256)", +"9b632829": "refundAll(address)", +"9b6349a8": "TokenDCCB(uint256,string,string)", +"9b63d0f4": "core(bool)", +"9b63eb4b": "getTicketsByGameIndex(uint256)", +"9b666d7a": "cos(int256)", +"9b6687ac": "getNumPositionProduct(bytes32,uint8,string)", +"9b671604": "proposeVoter(bytes32)", +"9b678bfc": "calcRates()", +"9b67bfa3": "fiatValue(uint256)", +"9b6806c9": "getCompanyShareholders(uint256)", +"9b68c992": "SubmitSecretBet(bytes32)", +"9b69608f": "read_dgx_inventory_balance_ng()", +"9b69de79": "transferLockAmount(address,uint256)", +"9b6a2b2f": "spriteOwningHistory(address,uint256)", +"9b6a6709": "presaleMint(address,uint256)", +"9b6aa1fa": "TransferData(address,address,uint256,bytes)", +"9b6b838c": "reinvestment_share()", +"9b6c5283": "createPool(string,uint256,uint256)", +"9b6c56ec": "debt(address)", +"9b6d86d6": "adminSetRegistrationDisabled(bool)", +"9b6d96c5": "create(int256,int256,int256)", +"9b6dbc8a": "closeShop()", +"9b6e407d": "setPercentUnfrozenAfterBuyPerPeriod(uint256)", +"9b6ec1cb": "HerbsChainToken()", +"9b7143eb": "creditsClawbacked()", +"9b71a7c9": "addAddressToRole(address,string)", +"9b71dec3": "getVineyardCount(string,address)", +"9b727e80": "CNiteToken()", +"9b73a5d9": "hasTwoYearWithdraw()", +"9b743cbd": "allocated18Months()", +"9b7502c3": "getLastAuditExtradata(address)", +"9b769ce3": "JsCoin()", +"9b76a25c": "transferFee(address,address,address,uint256)", +"9b76c1de": "team3LockEndTime()", +"9b76fbd6": "_recordPlatformFee(uint256)", +"9b771346": "ImportTestB()", +"9b772524": "partner1_signed()", +"9b7750f1": "addBranchInEpisode(uint256,uint256)", +"9b77c21a": "getClaimStatus()", +"9b77d69f": "addTagByModuleType(uint8,bytes32[])", +"9b7812ff": "add_quote(bytes32,bytes32,uint256,uint256)", +"9b781ce4": "updateExcludedAddress(address,address,bool)", +"9b782070": "TSSECOND()", +"9b786d68": "profitSharing(address,string)", +"9b788752": "trade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,bool)", +"9b78cf9c": "medalFreeze(address,uint256,uint256)", +"9b7a67bd": "getAccountPar(uint256)", +"9b7b59db": "setdrawtoken(address)", +"9b7c08b8": "ERCToken(uint256)", +"9b7c288f": "lastDeploy(address)", +"9b7c5517": "committ_payment(uint256,uint256)", +"9b7d83e7": "porcoToken()", +"9b7defe3": "returnTokensFromHoldAdvisorsAddress(uint256)", +"9b7e5531": "ownershipDeadline()", +"9b7edbdb": "buyLimit(uint256)", +"9b7eeb12": "setScrapMinEndPrice(uint256)", +"9b7ef38c": "BatchUtils()", +"9b7efac7": "subUInt(uint256,uint256)", +"9b7f1687": "iUventaCoin()", +"9b7faaf0": "lockOver()", +"9b80c9e8": "payMoneytoOwner()", +"9b815057": "changeMakerDAO(address)", +"9b818ace": "SLChainToken(uint256,string,uint8,string)", +"9b819d38": "getNowTime()", +"9b81c8d3": "updateMeterValue(uint256)", +"9b82171f": "houseTotal()", +"9b828609": "reclaimContributionWithInterest(address)", +"9b82abdb": "LogBought(address,uint256,uint256,uint128)", +"9b831dcb": "RateUpdate(uint256)", +"9b8342d4": "getPlayerDividendByRound(address,uint256,uint256)", +"9b836d1a": "_payout(address,uint256)", +"9b83d121": "transferFokenBonus(uint256)", +"9b8430eb": "distributeRevenue(uint256,uint8,uint8)", +"9b850322": "escrowDecision(uint256,uint256)", +"9b855a85": "releaseEQUITokens(bytes32,uint8,bytes32,bytes32)", +"9b85b9c9": "createDrug(bytes32,uint256)", +"9b85bc85": "CocacolaToken()", +"9b865999": "InitialOwnerAddress()", +"9b86975d": "ANemoiSaleContract()", +"9b880fee": "registerVestingSchedule(address,uint256,uint256,uint256,uint256)", +"9b8831df": "hasArtist(bytes32)", +"9b8906ae": "saleEnded()", +"9b894703": "maxTickets()", +"9b8a74f0": "cancelOffer(address)", +"9b8abe0b": "thousandtimes()", +"9b8b03a2": "strongHands(address)", +"9b8b365d": "deathData_a5()", +"9b8b6037": "findModuleVersionByAddress(address)", +"9b8b7160": "setPreFundingtokens(uint256)", +"9b8d1dd4": "CARDANOCLASSIC()", +"9b8d3064": "setFinance(address)", +"9b8d34d9": "addAgreement(bytes32,uint256,address[])", +"9b8da66c": "getEthFundDeposit()", +"9b8eb288": "setPercentWeiDividend(uint256)", +"9b8eb7b4": "getSocialAccountByIndex(uint256)", +"9b8ebc54": "checkVoter(address)", +"9b8f2493": "updateBurnBal(uint256)", +"9b8f5acf": "CyberChainToken()", +"9b8f5d4a": "setTilePosition(uint16,uint8,uint8)", +"9b8f7113": "dateSoftCapWasReached()", +"9b8fdf1b": "cancelExpectedPayment(bytes8)", +"9b901d00": "_createTeamSale(uint256[9],uint256,uint256,uint256,address)", +"9b9073e4": "allocationPool()", +"9b9111ee": "commonConfigure(address,address)", +"9b914973": "prebuyPortionTotal()", +"9b91f9be": "Gol()", +"9b922d97": "setCoinsaleactive(bool)", +"9b9279ec": "StartRefound(bool)", +"9b92adf3": "EnableTokenMinting(bool)", +"9b93aaf4": "addNewLoggerPermission(address,address)", +"9b945097": "getRandom(address,uint256,uint64)", +"9b9545eb": "Rython()", +"9b9692f6": "TokensDistribution(address,uint256)", +"9b96c4ba": "AdvisorPart()", +"9b96eece": "getBalanceOf(address)", +"9b973803": "transfer10(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"9b97cee5": "getWorkCount()", +"9b985b30": "bountyMaxTokens()", +"9b986550": "getAllForPubKey(bytes32)", +"9b98a94b": "getLockTokens(address)", +"9b991d9b": "votingInfoTeam()", +"9b9958af": "getAllCardsClaimed()", +"9b99a8e2": "reserveTokenCount()", +"9b9a09a6": "HackContract()", +"9b9a236b": "SuperToken()", +"9b9a47e3": "getlastDividendPoints(address)", +"9b9b0b87": "mainICOFourthWeekEndTime()", +"9b9ba572": "oraclize_query(string,string[3])", +"9b9be9cb": "mainSale_TokesSold()", +"9b9bedf8": "getContractCreated()", +"9b9cc2ca": "getPrivateSaleAgentAddresses()", +"9b9ce1bc": "sendTokensBulk(address[],uint256[],uint256[])", +"9b9d0364": "_setFeeStructure(uint256,uint256,uint256)", +"9b9d2cc8": "RESERVED_TOKENS_ADVISORS()", +"9b9e07e1": "TeamtokenRelease3()", +"9ba11c0a": "coinunits()", +"9ba1a7d8": "preValidation()", +"9ba30c3b": "Healthcoin()", +"9ba319bf": "detangleQuanticCloudIOTData()", +"9ba33ab3": "refundLeftOverWei(uint256,uint256)", +"9ba3c2e0": "advisersAddr()", +"9ba3d8cf": "updatePromoFishCommission(uint256)", +"9ba4d4ee": "investedETH()", +"9ba4dbc2": "USDBTC(uint256)", +"9ba4eb5f": "SPINFundDeposit()", +"9ba58333": "AspirationCoin()", +"9ba5b4e9": "getEventHashes(bytes32[])", +"9ba65fff": "addNewcard(uint256)", +"9ba73d43": "deregisterCustomer(address,address)", +"9ba89492": "getNumAccounts()", +"9ba896cc": "refundTokensSale(address[])", +"9ba8975f": "changeFundsKeeper(address)", +"9ba8e37d": "withdrawFromToken(address,uint256)", +"9baa504e": "unrestrictedMint(address,uint256,uint128)", +"9bab0da3": "EVACASH()", +"9bab3988": "DongriToken(uint256)", +"9babdad6": "removeShareholder(address)", +"9bac6e8d": "currentMinter()", +"9bac8602": "testFailAddBalanceAboveOverflow()", +"9baca66b": "getElementOfWinnerTicketList(uint256)", +"9bacc97c": "specialAddress(address)", +"9bacf1ed": "createSynthesizingAuction(uint256,uint256)", +"9baddd98": "sendBountySupplyToken(address,uint256)", +"9bae56da": "getEstimatedRound(uint256)", +"9baeac78": "TOKEN_SUPPLY_PRESALE_LIMIT()", +"9baf7ffb": "etherToSendBankroll()", +"9bafd01a": "freeStorage(address)", +"9bafd22b": "DocumentCertoChainContract()", +"9bb00ae3": "ledgerCount()", +"9bb01b5f": "ElcoinDb(address)", +"9bb04895": "nominalValue()", +"9bb0e4df": "getUint(int256,bytes32,string)", +"9bb0f599": "hasToken(address)", +"9bb186d2": "MatchingMarket(uint64)", +"9bb192fd": "getVotes(uint32)", +"9bb1cfd6": "hasAvailableRewards()", +"9bb1dbea": "commonWithdraw(uint256)", +"9bb1fd66": "force_stop()", +"9bb2ea5a": "setMaxValidators(uint256)", +"9bb32be3": "challengeFinality(uint256)", +"9bb3bcaa": "setArrIntField1(int256[])", +"9bb5239a": "CheckPrize(address,uint256)", +"9bb5c96c": "isContributorsRewarded()", +"9bb5ce30": "participationFee()", +"9bb5d450": "getMonsterCount()", +"9bb5f901": "UCToken()", +"9bb603bb": "create(string,string,uint8,string,bool)", +"9bb639a8": "changeTokenCostInEth(uint256)", +"9bb6831f": "millCap()", +"9bb74bbd": "tokensSoldToInvestors()", +"9bb848e7": "isRunningIco(uint256)", +"9bb84cd0": "addSellTokensRequest(address,string,uint256,uint256)", +"9bb8b563": "POKCC()", +"9bb8ec22": "SmartAdvancedCoin(uint256,string,string)", +"9bb8fde4": "startTimeStage1()", +"9bb90467": "initTokenAndBrackets()", +"9bbba3a8": "getTokensOnSale(address)", +"9bbc156b": "AllLock()", +"9bbc574a": "closeUser(address)", +"9bbdb25a": "getPartners(address,uint256)", +"9bbeafc1": "setMarketFees(bytes32,uint16,uint16,uint16,uint16,bool)", +"9bbedbbc": "deliver(address,address,uint256)", +"9bbfa582": "Lambotoken()", +"9bc0fd25": "setBlocklancerContractHolder(address)", +"9bc13360": "standardrate()", +"9bc2bc71": "createEvent(string)", +"9bc30adb": "upgradeBalance(address,uint256)", +"9bc3135b": "buyoutDividendPercentage()", +"9bc33b8a": "MediatedTransactions_TransactionHeight()", +"9bc52a39": "logClassic(string,uint8)", +"9bc53cec": "Moontrail()", +"9bc5689d": "NUM_OF_CHOICES()", +"9bc61d06": "MeetupContract(string,string,uint256,uint256,uint256)", +"9bc64cc8": "saiTap()", +"9bc6b571": "ChangeExtension(uint256,bool)", +"9bc6d815": "BestCountTokens(uint256)", +"9bc6f0ec": "createChildDeposits(uint256)", +"9bc706e8": "publishedCountOf(address)", +"9bc72d5f": "worstCaseRateFactorInBps()", +"9bc742fe": "setStepOneLockEndTime(uint256)", +"9bc85302": "burnUserTokens(address)", +"9bc896f9": "orderCancel(uint256)", +"9bc8e9ee": "setMintingDec(uint256)", +"9bca3596": "Ubecoin()", +"9bca8a1e": "setTableTypesSize(uint256)", +"9bcb8dff": "BallzToken()", +"9bcc2b27": "ctrlZee()", +"9bcc9123": "rejectNegotiation(address)", +"9bccfe49": "actionsCount()", +"9bcdd9e8": "forgetCube(address)", +"9bce51e3": "sendCrowdsaleTokens(address,address,uint256)", +"9bcef169": "getLeaderboard(string)", +"9bcf497b": "setUserPaybackPool(address)", +"9bcf7352": "setEnableInternalLock(bool)", +"9bcf8ca2": "addresses(uint256,uint256,uint256)", +"9bcf9ea2": "PIVOT()", +"9bcfcee8": "minting(address,address,address,address)", +"9bd03774": "TokenContractImpl(uint256,uint8,address,address)", +"9bd0a967": "isEndsWithHpb(string)", +"9bd1ff8b": "tokenFallback(address,address,uint256,bytes,string,uint256)", +"9bd26234": "contrubutedAmount(address)", +"9bd2af03": "trent()", +"9bd2d912": "ZipflaxToken()", +"9bd33457": "totalOnDeposit()", +"9bd3651b": "Authenticate(uint256,address,uint256)", +"9bd41f7c": "createToken(bytes32,string,string,string,string,string)", +"9bd4d455": "addMember(string,address,string,uint256,uint256)", +"9bd4e13e": "bettor_reward(address)", +"9bd4e925": "CROWDSALE_ETH_IN_WEI_FUND_MIN()", +"9bd5679e": "getCurrentICOExpirationTime()", +"9bd6030c": "nbagame()", +"9bd658d9": "whoOwnsYou()", +"9bd69528": "addToKyc(address)", +"9bd695b0": "hasRequiredSignaturesToValidate()", +"9bd6a4de": "initPublicityAddr()", +"9bd702e4": "sellCrab(uint256,uint256)", +"9bd7d688": "checkAncestors(uint32,address,uint64,uint64,uint64)", +"9bd80dcf": "calculateMasked(uint256,uint256)", +"9bd8e081": "gunsFundDeposit()", +"9bd90aae": "maxTokensToCreate()", +"9bd99195": "multiAccessChangeOwner(address,address)", +"9bd9bbc6": "send(address,uint256,bytes)", +"9bda8678": "externalDeposit(address,uint256)", +"9bdbb4c7": "market_WithdrawBid(uint256)", +"9bdc6523": "setUserWhiteListContract(address,bool)", +"9bdce046": "DICE_HIGHER()", +"9bdd070d": "withdrawTokenToDefault(address,address,uint256,uint256,uint256,address)", +"9bdd7cdb": "forceRelease(bytes32)", +"9bde88f0": "getcan(address)", +"9bdf5a7c": "Zenix()", +"9bdf6f62": "soldTokenCount()", +"9bdff8eb": "oracleB()", +"9be07908": "left79(uint256)", +"9be08a4e": "NCPPrivate()", +"9be0f105": "OxChainNetwork()", +"9be0fc75": "toggleDrop()", +"9be1eab7": "setContractStakeToken(address,address)", +"9be1fcee": "BankOwner_DisableConnectBankAccountToNewOwnerAddress()", +"9be2385a": "depositOldTokens(address,uint256,address)", +"9be2faed": "isSchemeRegistered(address,address)", +"9be2ff64": "setAllowPlayer(bool)", +"9be3b286": "endOffering()", +"9be4d15e": "split(bytes32,uint8,uint256)", +"9be50784": "drawBenz()", +"9be56c67": "support(uint256,uint256)", +"9be572f6": "getTotalUsers()", +"9be5ad78": "_saleState()", +"9be5b3b1": "MetadollarOption()", +"9be6178e": "acceptBet(bytes16,bytes16,bytes16,bool)", +"9be6d404": "destructSelf(address)", +"9be7f1dd": "buyerfee()", +"9be88a01": "_rotateLeft(bytes32)", +"9be8a212": "FoundersFund()", +"9be95517": "_createRandomMonster(uint32)", +"9bea62ad": "restore(uint256)", +"9beaa524": "getActivityName(uint256,uint256)", +"9bead36f": "resolveEntityAddressAndOwner(address)", +"9beb6c6b": "_saleFinalized()", +"9bed31e4": "setParameters(uint32,uint256,address)", +"9bedb2c7": "MyReferrals()", +"9bee3365": "sayYes()", +"9bee757b": "requestExecution(bytes,uint256)", +"9beebe20": "setTrustedTransfer(bool)", +"9beef73f": "stageDistributed()", +"9bef0c47": "getUserPictureByWallet(address)", +"9befa8b4": "DisqusBot()", +"9befd45a": "payFee(bytes32)", +"9bf0093c": "LIV()", +"9bf037e5": "BaseCrowdsale(address,address,address,uint256,uint256,uint256,uint256)", +"9bf070b5": "ethRaisedWithoutCompany()", +"9bf08a06": "joinArena()", +"9bf1c389": "stage_1_add()", +"9bf1f148": "requestAudit(address,bytes32,uint256)", +"9bf22189": "Validated(string)", +"9bf2926d": "Proposal(address,uint256,string)", +"9bf2ab46": "preSalesEndDate()", +"9bf30bac": "handleIncomingPayment(address,uint256)", +"9bf34e30": "ecrecover3(bytes32,uint8,bytes32,bytes32)", +"9bf39dce": "contributionTime()", +"9bf4c5c5": "destroyedNinjas()", +"9bf677e4": "phase_1_rate()", +"9bf68006": "testControlSetNotTransferableNotOwner()", +"9bf6b0a8": "withdrawForFiveStep()", +"9bf6deaf": "ChangeEmissionRateCoefficient(uint8)", +"9bf6eb60": "mintTokensExternal(address,uint256)", +"9bf74ae0": "periodICOStage1()", +"9bf7ef63": "verifyMultiSig(address,bytes32,bytes,uint256,uint256)", +"9bf865d0": "numberToAddress(uint256,address)", +"9bf8df7d": "recoverLost(address,address)", +"9bf97bd9": "get_deployed_forwarders()", +"9bf97e74": "BNN()", +"9bf9cd26": "PreSaleSold()", +"9bfa1f33": "ORDER_FILL(address,address,address,bool,uint256,uint256,uint256)", +"9bfa835b": "privateMin()", +"9bfa882e": "updateAddress(address,address)", +"9bfaa24b": "startTradable(bool)", +"9bfafdc2": "ERC223Transfer(address,address,uint256,bytes)", +"9bfb9717": "additional_incentive()", +"9bfb9752": "setTime1(address,uint256)", +"9bfba3c6": "ico2cap()", +"9bfc80fc": "TopSciFiVoter()", +"9bfd8d61": "totalStaked(address)", +"9bfdbf8a": "getOrganizerRegistrationStatus(uint256)", +"9bfdce3e": "deal(address,uint8)", +"9bfdd1bb": "setSchema(string,bytes32,string,uint256,uint256,uint256,uint256)", +"9bfdf68d": "requestLoans(uint256[],bytes32[])", +"9bfe171a": "STASToken()", +"9bfe7bd5": "getNumOrdersByOwner()", +"9bfeda53": "_getRewardTokenAmount()", +"9bff209d": "softSub(uint256,uint256)", +"9bff662c": "notify_payment_acceptance_request(uint256)", +"9c001bcc": "TOKEN_SHARE_OF_BOUNTY()", +"9c0051db": "setProfitTransferTimeSpan(uint256)", +"9c007973": "resolveDispute(bytes16,address,address,uint256,uint256,uint8)", +"9c01e1f5": "addNFToken(address,uint256)", +"9c01fdaa": "PimmelToken()", +"9c03b04f": "testItStoresAValue()", +"9c03f17f": "sencToken()", +"9c03facb": "sold(uint256)", +"9c041ebd": "create(address,address,address)", +"9c043783": "eachUnfreezeValue()", +"9c049dd0": "hydroStakingMinimum()", +"9c04e4e7": "pre_sale_end()", +"9c04ece9": "lastBlock_f7()", +"9c05093b": "setTeamTokensWallet(address)", +"9c05ba60": "getIndexName(bytes32)", +"9c066eab": "seeRaised()", +"9c0770fe": "ZIL()", +"9c07b2cd": "resetTotalSales()", +"9c080f5d": "showBalance(address)", +"9c08606c": "lockedDays()", +"9c08d549": "startICO(uint256,uint256)", +"9c0953cf": "setProducer(address,address,bool)", +"9c09a64c": "claimSMR()", +"9c09b32c": "ProcessTransaction(uint256)", +"9c09bb4e": "getBestMatch()", +"9c09c3bb": "attestForIdentity(address)", +"9c09c7c6": "addGuessWithRefund(int256)", +"9c09c835": "enableWhitelist(address[])", +"9c09f869": "PixelSelling()", +"9c0a4bbc": "AlwaysFail()", +"9c0b7c08": "terminateFunding()", +"9c0baa2d": "_getRate(uint256)", +"9c0bd57c": "withdrawDragons()", +"9c0c2238": "withDrawEther()", +"9c0cc30c": "getAllArtworks()", +"9c0d010e": "_checkOpenGame()", +"9c0df4f2": "blessings()", +"9c0e3f7a": "write(uint256,uint256)", +"9c0e7d66": "leftoverTokensBuffer()", +"9c0ee65b": "Hold(address,uint256,address,address,address)", +"9c0f16ed": "tokensOfTeamAndAdvisors()", +"9c0fc1e4": "AIC()", +"9c117f0f": "get1(uint256)", +"9c118238": "withdrawBalanceFromServer(address,uint256,bytes)", +"9c1193ea": "GreeterA(bytes)", +"9c121aff": "LogClaim(bytes32,address,uint256)", +"9c121b6d": "meltHorseShoe(uint256,address)", +"9c1230c1": "amount_stages()", +"9c128493": "Lol1CoinCoin()", +"9c12ca21": "setGroupBounty(address[],uint256)", +"9c12deab": "isVendor(address,address)", +"9c135572": "documentsIds()", +"9c147688": "bulkMint(uint32[],address[],uint256[])", +"9c14c77b": "getBuyTime(uint256)", +"9c14e25b": "DonQuixoteToken(address)", +"9c1500f0": "registerMany(address,uint256,int256,uint256,bytes,address,bytes)", +"9c15b047": "getInitialOwners()", +"9c15b04b": "showDividendsAvailable()", +"9c15be0b": "left65(uint256)", +"9c161d1a": "setNextImagePart(address[16],uint256,uint16,uint16,uint16,uint256[])", +"9c16667c": "getAnswer()", +"9c166d31": "LukaToken()", +"9c172f87": "EthVentures4()", +"9c1747e5": "addRewardPercentage(uint256)", +"9c1817e4": "Saddle_Limit()", +"9c19aa9f": "setOrderSupportCancel(uint256)", +"9c19f170": "TotalRaised(uint256)", +"9c1a056f": "visitLength()", +"9c1a32fe": "setTake(uint256)", +"9c1b9408": "preMultisigEther()", +"9c1b987c": "setComment(uint256,bytes3,string)", +"9c1b9c1b": "assignTokens(address,uint256,uint256,uint256,uint256)", +"9c1cb7cf": "PaymentStatusBlockNum(address)", +"9c1d8fa2": "GPN(uint256,string,string,address)", +"9c1d9790": "sendBatchCS(address[],uint256[])", +"9c1e03a0": "crowdsale()", +"9c1f020a": "sendCrowdsaleTokens(address,uint256)", +"9c1f332f": "returnLastBuyerIndex()", +"9c1f6133": "registerVIP()", +"9c1fcc4c": "logicAddress()", +"9c2062ad": "RISK()", +"9c2108eb": "transferGoldFromHotWallet(address,uint256,string)", +"9c211755": "RequstOwnership()", +"9c225b33": "teamAndAdvisorsAllocations(address)", +"9c2412a2": "monarchyStartReward()", +"9c24654c": "presalestartTime()", +"9c24ea40": "setLinkToken(address)", +"9c24eedb": "upvote(uint256,int256)", +"9c24fc55": "presaleBalances(address)", +"9c250dd8": "etherTransfer(address,uint256)", +"9c253011": "print(int256,address)", +"9c255312": "addressETHDeposit()", +"9c25d975": "packLocation(uint64,uint64,uint64)", +"9c2622e2": "addOne(address)", +"9c2625fd": "TEAM_TOKENS0()", +"9c269c34": "TBL4Token()", +"9c27a6f4": "buyTicket(uint8,uint16[],address)", +"9c27ea08": "setNextLotteryTTMTokenId5(uint64)", +"9c27ff9b": "calculateFEE2Distribute()", +"9c286837": "devCut()", +"9c293792": "release_all(address)", +"9c2a7b89": "setTokenInfoHeritor(address,address,uint256)", +"9c2b1a95": "getManagementFee()", +"9c2c1b2b": "addDelegateSigned(address,uint8,bytes32,bytes32,bytes32,address,uint256)", +"9c2cdd5a": "MULTISIG_TKN()", +"9c2e29c6": "LocalLambosEscrows()", +"9c2ea2ec": "setEthExRate(uint256)", +"9c2f0067": "EPIToken(address,uint256)", +"9c2f4092": "DEVP()", +"9c2f5f8f": "closeCurrentGame(uint256)", +"9c2f7a43": "getCrystal(uint256)", +"9c2f88fa": "CoinBundleToken()", +"9c2fa55d": "buyFirst()", +"9c30936f": "removeCertificationDocumentFromSelf(bytes32)", +"9c30ad7e": "isPending()", +"9c31200b": "oraclize_query(uint256,string,bytes[1],uint256)", +"9c315684": "periodPreICOStage()", +"9c31c5ec": "setItemsContract(address)", +"9c323436": "getFixedEndTime(uint256)", +"9c33b66e": "checkAvailableTokens(address,uint256)", +"9c34a15f": "c(uint256,uint256)", +"9c34ae54": "setICODates(uint256,uint256,uint256,uint256,uint256,uint256)", +"9c351fec": "SNDToken(address,string,string,uint256,uint256)", +"9c36e141": "defaultTimeLock()", +"9c3723df": "windowBonusStep2()", +"9c38019b": "verifyProofOfMembershipInternal(uint256,bytes32[],bytes32,bytes32)", +"9c3807e6": "STARTING_STRIPPERS()", +"9c388d30": "LogAccountAmount(address,uint256)", +"9c392e5c": "VirginMToken()", +"9c39857b": "setTeamAdd(address)", +"9c3a39a2": "getPaymentData(uint256)", +"9c3b936f": "killBalance(uint256)", +"9c3b9aa3": "MundoGamerToken(uint256,string,uint8,string)", +"9c3bcd65": "deliverPresaleFuelBalance(address,uint256)", +"9c3c7b2c": "transferredPresale()", +"9c3c97a1": "prohibitFreeze()", +"9c3db309": "getCurrentMiningDifficulty()", +"9c3e0f3f": "icoStarts()", +"9c3ed1ae": "unitsUserCanBuyLimit()", +"9c3f1e90": "orders(bytes32)", +"9c3f7ca2": "acceptOffer(uint256,uint256,bytes32)", +"9c3fe721": "finishedIssuerMinting()", +"9c402944": "sendAVR(address,uint256)", +"9c40478c": "canClaimAuditReward(address,uint256)", +"9c4063ce": "WALLET_T8EX_TEAM()", +"9c409e4d": "VoteOnTransfer(address)", +"9c40ea5c": "setGRForGas(uint256)", +"9c41adfd": "withdrawDepositById(uint256)", +"9c41e591": "XGoldToken()", +"9c421665": "transferToMe(address,uint256)", +"9c4261b9": "VOLUME_EXTRA_BONUS_CONDITION()", +"9c43d950": "registration(uint256,uint256,uint256)", +"9c43eb54": "snapshotTimestamp()", +"9c44f090": "AlquilarBici()", +"9c45510d": "FootBallCoin()", +"9c472c70": "rateSecondWeek()", +"9c473bb2": "setTokenName(address,bytes32)", +"9c4780d8": "currentRoundNumber()", +"9c481c9e": "crowdsaleContractAddress()", +"9c489edb": "setNewExchangeAddress(address)", +"9c492b9e": "raisedFromFiat()", +"9c499b53": "getFeesAvailableForWithdraw()", +"9c4abe06": "getEthOfferPrice(uint256)", +"9c4ae2d0": "deploy(bytes,uint256)", +"9c4b653d": "sendFundsToMsgSender(uint256)", +"9c4b9c8a": "getFreezeTimestamp(address)", +"9c4baf27": "Skywalker(address,address)", +"9c4bcaa5": "setMinBuyPrivate()", +"9c4c557c": "startSale(bool)", +"9c4ca8cb": "IChain(address,uint256,uint256)", +"9c4de81f": "havven()", +"9c4e0f52": "setMaxTokenSellAmount(uint256)", +"9c4e3788": "earlyInitProjectSupply()", +"9c4eda5c": "balanceA()", +"9c4fc41a": "getWineCount()", +"9c4fc563": "_findParticipant(uint256)", +"9c50450f": "amountToCreate()", +"9c50e7ca": "tgeDateStart()", +"9c513bdd": "BwinCoin()", +"9c526380": "getUserTotalCredit(address,address)", +"9c52a7f1": "deny(address)", +"9c536640": "confSetupMixer(bytes32,uint256,uint256,uint256,uint256)", +"9c544e72": "removePending(address,uint256)", +"9c54b91f": "setApprovalCount(uint256)", +"9c54df64": "addAdmins(address[])", +"9c55519b": "optionsConversionDeadline()", +"9c561a42": "Wallet4()", +"9c566cad": "cards_start(uint256)", +"9c5686db": "isERC821()", +"9c579839": "QUOTE()", +"9c57d584": "verifyFingerprint(uint256,bytes,int256)", +"9c58b753": "getWriterId(bytes32)", +"9c58be11": "claimMyToken()", +"9c58c509": "buyIcoToken2(uint256)", +"9c591412": "lifeReserveWallet()", +"9c5945d9": "revealHiddenPosition(uint32,int64[],bytes32,uint64,bytes16)", +"9c5b33ae": "wb()", +"9c5bbc89": "setApprovedAddress(address)", +"9c5c53b3": "lockBonusTokensClaim(uint256)", +"9c5d5e98": "JACKPOT_WINNER()", +"9c5d7030": "reimburseGas(uint256,address,uint256,uint256)", +"9c5d7291": "PhoneCoin()", +"9c5de58b": "startRC()", +"9c5e078f": "createBBODocument(bytes32)", +"9c5e108c": "_getFreezeTime(uint8)", +"9c5e9023": "confirmBeneficiary()", +"9c5fafa4": "balanceOfComisionHold(address)", +"9c6034a7": "sendIfNotForked()", +"9c60839e": "mintBonusTokensForGames(int256,uint256)", +"9c623683": "setWinner(uint256,address)", +"9c62622d": "IHate0xBTC(string)", +"9c632c77": "getServiceTokenAddress()", +"9c6393f2": "TokensWithdrawn(uint256)", +"9c639db4": "UltiCoin()", +"9c63dae5": "depositorCurrency(address)", +"9c644221": "PRICE_STAGE_ONE_BONUS()", +"9c66452e": "checkTime(bytes32,bytes32,uint256)", +"9c665819": "Talent()", +"9c66fe00": "priceOfLandmark(uint256)", +"9c6735c7": "ProfitRate()", +"9c675eaa": "ownerAddr()", +"9c67f06f": "registryStarted()", +"9c67f2fb": "returnEth4Sender(uint256)", +"9c681f86": "totalTokenTransfers()", +"9c6891c5": "set_bountyPercent(uint256)", +"9c68bd60": "payPledge(uint256)", +"9c695a7b": "_isInStage(uint256)", +"9c69763b": "setICOManager(address)", +"9c697750": "getRemainingLimit(address)", +"9c6a5bca": "RiptideCoin()", +"9c6a97ee": "deleteMyCat()", +"9c6c3439": "burnReputation(uint256)", +"9c6e199a": "sendTokensManually(address,address,uint256)", +"9c6e1d46": "emitJobCanceled(uint256)", +"9c6f87e9": "getPseudoRandomNumber()", +"9c700b70": "withdrawOwnerEth(uint256)", +"9c707dcf": "_mthToVouchers(uint256)", +"9c7081df": "prestige()", +"9c709343": "split(bool,address)", +"9c70b899": "KYC_ETH_LMT()", +"9c715535": "confirmPendingChange(address)", +"9c71d169": "OfferCancel(uint8)", +"9c71efef": "STARTING_CraigGrant()", +"9c71fda4": "WALLET_LB_RESERVED()", +"9c7264d7": "fillOrder(address,uint256)", +"9c73048b": "distributeCastleLoot()", +"9c732203": "DoDev(uint256)", +"9c7336fe": "getValueOfRemainingTokens()", +"9c737e8f": "fundPot()", +"9c7387c7": "finishContribution()", +"9c73ff7d": "DANK()", +"9c7409b0": "_getProtectionParams(uint256,uint256,uint256)", +"9c75089f": "Tresdk()", +"9c755f2f": "stuff()", +"9c756200": "ContractOwnerWithdraw(uint256)", +"9c756ec9": "PREICO_PERIOD()", +"9c76a6ac": "buybackPrice()", +"9c775e1f": "delegateApprove(address,uint256)", +"9c787ab2": "YUNXINToken(uint256,string,uint8,string)", +"9c7912ff": "setXzlkcjqowhoqhwoihsiaoquweizxoiuo(uint256)", +"9c792938": "estimate(uint256)", +"9c79af26": "issueExchangeRate(address,address,address,uint256,uint256,uint256)", +"9c7a39e6": "doCustomAirdrop2(address,address[],uint256[])", +"9c7ab767": "numSubscribers()", +"9c7b3c45": "TextToken()", +"9c7b3d79": "ARTISTCOIN()", +"9c7b7a2d": "SingleSourceIdentity()", +"9c7beb8a": "mintingAgents(address)", +"9c7c2498": "OnChainOrderBookV013b()", +"9c7c722b": "rename(string,string)", +"9c7dcdeb": "hostAccount()", +"9c7e6e6e": "checkRokBalance(address)", +"9c7e8a03": "addParticipant(address,address,uint256)", +"9c7eaac5": "makeTrade(address,address,uint256)", +"9c7ebb30": "SellTokens(uint256)", +"9c7ed6cb": "AgiCrowdsale(address,address,uint256,uint256,uint256,uint256,uint256)", +"9c81806d": "WithdrawSpecialEth(uint256)", +"9c81a5f6": "getVestingsCount(address)", +"9c821ac4": "testFailsIfReturnLessThanMin()", +"9c82f2a4": "setSwapper(address)", +"9c830beb": "setStateHolding()", +"9c839bdd": "nextWithdrawDayCommunity()", +"9c83a1e3": "deleteDeposit(address)", +"9c83b0a1": "ValeoTestToken()", +"9c841c16": "checkCorrectRate(bool,uint8)", +"9c84d1f7": "News()", +"9c84eebe": "ERC20Token(uint256,address)", +"9c851ebc": "new_entry()", +"9c85a28a": "infoMessage()", +"9c8615ac": "is_entity(address)", +"9c865645": "calculateFactorFlushDifficulty(uint256)", +"9c86b241": "createPromoArt()", +"9c88b7bf": "enableNewPurchasing(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"9c88cbb6": "getCurrentBracket()", +"9c893d73": "LinkCoinToken()", +"9c89a0e2": "getReputation(address)", +"9c89a10a": "presaleOwner()", +"9c89ddb5": "addCourse(string,address)", +"9c89e828": "BidSubmission(address,uint256)", +"9c8a5a56": "bribedCitizen()", +"9c8aeedd": "breakIdMaintenance2(uint256,address)", +"9c8b8585": "txAboveLimits(bytes32)", +"9c8bb5d0": "confirmBoardScore(bytes32,bytes32)", +"9c8bcd6d": "WbtToken()", +"9c8e1d50": "getChipValue()", +"9c8f8569": "Scc()", +"9c8f94bd": "widthrawBondFunds(address)", +"9c8f9f23": "removeLiquidity(uint256)", +"9c90224b": "assertEq1(bytes1,bytes1,bytes32)", +"9c908f61": "acceptTokens(address,uint256,uint256,uint256,uint256)", +"9c91ae20": "getGeneration(uint40)", +"9c91dd56": "paymentContract()", +"9c9205b6": "Token(address,address,uint256)", +"9c926061": "HashProject(address)", +"9c92bfda": "testReceiveSubmittal()", +"9c93a52f": "SALE_TOKENS_SUPPLY()", +"9c9421c3": "Testtoken()", +"9c94e6c6": "notice()", +"9c960cbb": "setAyantDroitEconomique_Compte_6(uint256)", +"9c97114b": "s(bytes)", +"9c977e43": "requestOraclizeBalance()", +"9c978442": "TransferToAllAccounts()", +"9c981fcb": "getString(string)", +"9c9a1061": "buy(bytes32)", +"9c9a2365": "getFungibleTokenAddress()", +"9c9a4b72": "TokenVesting(address,address)", +"9c9b1170": "setoraclelimitgas(uint256)", +"9c9b2e21": "addReward(address)", +"9c9b8fcc": "ALC_FOUNDATION_ADDRESS()", +"9c9c344c": "getTotalUpdates()", +"9c9cc12a": "getCatRelease(uint256)", +"9c9d07c1": "STARTING_DINO()", +"9c9de4dc": "INT(address)", +"9c9e2752": "SBGCrowdsale()", +"9c9ecedb": "InitialArray()", +"9c9ef44a": "setDiscountValueOn()", +"9c9ef978": "addDataToList(bytes32,bytes32,bytes32,bytes32)", +"9c9fb68b": "GetGamblerChoices(address)", +"9c9fe2a4": "FundsClaimed(address,uint256,string)", +"9c9fe83a": "setBA(bytes32,address)", +"9c9ff934": "ETH_HEROCOIN()", +"9ca0e5e1": "setGoldBonus(uint256)", +"9ca0f19d": "GemsPlay()", +"9ca15d59": "oldInviteAddr()", +"9ca2b9e4": "AdvancedDeposit(bytes32,bytes32)", +"9ca3669d": "cancelCommissionerAuction(uint32)", +"9ca3c29c": "getCost(string)", +"9ca423b3": "referrals(address)", +"9ca44515": "ketqua()", +"9ca5454e": "distributes(uint256)", +"9ca5f4a7": "SafeERC20Helper()", +"9ca67a6e": "notapproved()", +"9ca6e670": "apply(uint256,uint256,string)", +"9ca74595": "BobMarleyCoin()", +"9ca75320": "searchNode(address)", +"9ca77f3c": "kingdomsByNumber(uint256)", +"9ca7c912": "ownerTime()", +"9ca9dcab": "getMemeCount()", +"9caaa154": "setLuckPrice(uint256)", +"9caaa7f4": "get_this_balance()", +"9caab55a": "ParticipantAgent()", +"9caabfac": "dateEcoRelease9()", +"9cad74b0": "randomNumber(uint8,uint8)", +"9cadb159": "settleChannel(uint256,address,uint256,uint256,bytes32,address,uint256,uint256,bytes32)", +"9cae6100": "addAward(string)", +"9cae9e03": "getPropertyInfo(uint8)", +"9caeab45": "periodICOStage5()", +"9caf34c4": "getBalanceEth()", +"9caf9695": "paleyer2show(uint8,uint8,uint8,uint8,uint8)", +"9cb02e8c": "delayPhaseEndBy(uint256,uint256)", +"9cb04d18": "newPresale()", +"9cb08312": "DMTToken()", +"9cb157d9": "VNT()", +"9cb15a94": "FreeCoin(uint256,string,string)", +"9cb1e9fe": "cubicContract()", +"9cb21f6d": "ImperialCredits()", +"9cb230ec": "Lockup(address)", +"9cb29034": "CCECOIN()", +"9cb2b69b": "getCreated(uint256)", +"9cb31079": "setLowLimit(uint256)", +"9cb33309": "BasicTokenMock(address,uint256)", +"9cb35327": "ceilDiv(uint256,uint256)", +"9cb42db4": "PDS()", +"9cb481ea": "getBountyAmount(uint256)", +"9cb4b31c": "tokenTimelockAddress()", +"9cb61295": "getVoterFromProposal(uint256,uint256)", +"9cb64a2d": "debtor()", +"9cb6a504": "addColor(string,string)", +"9cb6ed7e": "escape(address)", +"9cb6fc77": "confirmUpgrade()", +"9cb74ab6": "mgmtInvestProject(address,uint256)", +"9cb7595a": "getBridgeInterfacesVersion()", +"9cb75b2f": "sendBonusEgg(address,uint256)", +"9cb78df8": "minSuccess()", +"9cb7de4b": "setHandler(address,bool)", +"9cb8a26a": "selfDestruct()", +"9cb931f9": "setReferralPromille(uint8)", +"9cb998dc": "increase(bytes32)", +"9cb9b8f5": "withdrawBomb(uint256)", +"9cb9c14f": "Issuance(address,uint256)", +"9cba3559": "globalAmounts(uint256)", +"9cba60a7": "bitmask_check(address,uint256)", +"9cba713e": "reserveTreasury(uint256)", +"9cbad951": "withdrawAllTokensFromBalance()", +"9cbafcb6": "Pharamore()", +"9cbb165e": "isOnBorrow(uint256)", +"9cbb9460": "fetchOrdersForMerchantByAdmin(address)", +"9cbc2d62": "get_member_info(address)", +"9cbc87a3": "bytes32ArrayToString(bytes32[])", +"9cbcfcc7": "calculateGotTokens(uint256)", +"9cbd695f": "show(uint256,uint256)", +"9cbd7da5": "resumeICO()", +"9cbdffc6": "unblock()", +"9cbe5efd": "currentRoundId()", +"9cbf1b85": "exchangeRateAt()", +"9cbf73a9": "purchaserAddresses(uint256)", +"9cbf9e36": "createToken()", +"9cc04ea0": "newRecord(uint256)", +"9cc0c5e3": "experty_io()", +"9cc1c97b": "test_threeValidEqAddress()", +"9cc24569": "ExKnox(address,address)", +"9cc28aa0": "BdpOwnershipStorage(bytes8)", +"9cc2bcc6": "AhieldCureToken()", +"9cc33024": "setPresidenteDeMesa(bytes32,uint256,uint256,uint256,bytes32)", +"9cc3b949": "Bookmark()", +"9cc429dc": "getBattlesCount()", +"9cc477b2": "createFashion(address,uint16[9],uint16)", +"9cc4a319": "CarToken()", +"9cc4d3dd": "convertNumSec(uint256[],uint256[])", +"9cc4da3b": "WHAuthorizeAddress()", +"9cc579af": "MarketJob(address[],uint256[],uint256[],address,address,bytes)", +"9cc5dd95": "_removeOwnersAproves(address)", +"9cc73a6f": "raiseDay3()", +"9cc74299": "withdrawFromManager(uint256,address)", +"9cc7d917": "earlyBirdsAddress()", +"9cc7f708": "balanceOf(uint256)", +"9cc8295a": "EnoughClaims(uint256)", +"9cc84564": "envelopeCounts(address)", +"9cc9299e": "killSwap()", +"9cc946ee": "OlivToken()", +"9cc9b86d": "disableService(address)", +"9cca1c64": "getNonFungibleIndex(uint256)", +"9cca7ac3": "QueueDemandesEnCours()", +"9ccaec98": "getAuctionInfo(uint40)", +"9ccb6e8d": "SentToContractor(uint256,address,uint256)", +"9ccbbc6a": "minimumPowerUpSizeBabz()", +"9cccaea9": "StreamityContract()", +"9cccb272": "BatchPaint(uint8,uint256[],bytes3[],uint256[])", +"9cccd2a4": "getSumAmountOfSuccessfulSteps()", +"9ccd0b51": "getCountCourse()", +"9ccd7d86": "setWinery(address,address,bool)", +"9ccdd994": "Pume(uint256,string,string)", +"9ccf1a68": "prepareURL()", +"9ccfceed": "MANHATTANPROXY10THAMSTAVE()", +"9cd0126a": "gemHpConversion()", +"9cd01605": "exchangeAddress()", +"9cd04996": "DiscountedPreICO(uint256,uint256)", +"9cd08464": "transfer_eth_from_contract(address,uint256)", +"9cd08bae": "CevacToken(uint256,uint256)", +"9cd0c511": "depositMintAndPay(address,uint256,uint256)", +"9cd0f778": "setLuckPool(address)", +"9cd106a8": "cancelRecurringBilling(uint256)", +"9cd19074": "createKey(bytes32)", +"9cd1a121": "delegateTransfer(address,uint256,address)", +"9cd2021c": "mintRefs()", +"9cd22211": "getPlayerGameInfo(uint256,address)", +"9cd23707": "setTransferable(bool)", +"9cd3cb5d": "withdraw_token(address)", +"9cd417d7": "rejectCurrentValidation()", +"9cd43690": "GENTATOKEN()", +"9cd4fb47": "Tier_Classic()", +"9cd5c9a8": "setAssetWallet()", +"9cd70235": "setAmountToClaim(address,uint256)", +"9cd758d0": "setPOOL_edit_2(string)", +"9cd77457": "createInactivePreMintedEdition(uint256,bytes32,uint256,uint256,uint256,address,uint256,uint256,string,uint256,uint256)", +"9cd84ead": "APPToken612()", +"9cd994b4": "updateAuctionTime(uint256,uint256,uint256)", +"9cda1ec5": "setDistributor(address,bool,uint256)", +"9cda5a12": "calcPoseBits(uint256,uint256,uint256)", +"9cdacdb3": "Setup(address)", +"9cdaef4d": "_set4()", +"9cdaf438": "ARCCToken(address,uint256)", +"9cdb4fe8": "addEvidence(bytes32,uint256,bytes32,uint8,bytes32,bytes32)", +"9cdbaa21": "tokenTransferLocker()", +"9cdbc070": "addVoting(uint256)", +"9cdd2e76": "getHeroLocation(uint256)", +"9cdec2bb": "getCompte_18()", +"9cdee922": "RushCoin()", +"9cdf1872": "getOut()", +"9cdf4dd3": "Token(address,string,string)", +"9cdf8a1f": "WTBNToken()", +"9cdfa3df": "getAddrForPrivilege(address)", +"9ce04e35": "enableInvestorTransfer(address)", +"9ce21f3c": "fundingWalletAddress()", +"9ce2c7f2": "AumentaQuantitaVoti(uint256,address)", +"9ce318f6": "withdraw(uint8[],bytes32[],bytes32[],bytes)", +"9ce31fe1": "StudToken(uint256)", +"9ce3961f": "nextVersionAddress()", +"9ce3f461": "UP_winBets()", +"9ce51c7c": "sendNewTalentsAndPartnerships()", +"9ce682bd": "BetFromTransaction(address,uint256)", +"9ce80efc": "test_twoInvalidAssertFalse()", +"9ce840d4": "withdrawNotATokens(address)", +"9ce8fc4e": "LogForkSigned(uint256,bytes32)", +"9ce962ca": "payWallet()", +"9ce9e380": "_burnAllArgs(address,uint256)", +"9cea127f": "CMTTT()", +"9ceb5c6d": "icoBonus1EndDate()", +"9ceba90b": "startWeekFive()", +"9cec2789": "gettags(address)", +"9cecba34": "addPoliceNode(address)", +"9cecc80a": "setReserve(address)", +"9ced0e9b": "initialTime()", +"9ced5c29": "enableNode()", +"9cede14c": "checkAndGetSendersID()", +"9cee1773": "Mednus()", +"9cee9492": "setMaxRewardPercent(uint256)", +"9cef2a6a": "addLand(address,uint256)", +"9cef8873": "reclaimLand(int256,int256)", +"9cef9cfe": "isNumBlack(uint8)", +"9cefa50b": "winner(uint256,bytes32)", +"9cf17d5f": "ScamCoin()", +"9cf21342": "AnimeCoin()", +"9cf21d90": "ETCH3dV()", +"9cf2c727": "sumHardCapICOStage7()", +"9cf3123b": "sellWolkEstimate(uint256,address)", +"9cf3566d": "promotionAllocate(address,uint256)", +"9cf4124f": "enableContinuousDelivery()", +"9cf48365": "getInvestedToken(address)", +"9cf488ad": "sendPlayerBack(uint256[])", +"9cf4910c": "preDistriToAcquiantancesEndTime()", +"9cf4cb1e": "_getVotes(uint256,uint256,uint256,address)", +"9cf5453d": "bid(address)", +"9cf55cfb": "sampleBoolRetTrue()", +"9cf5c613": "setVerified(address,bool)", +"9cf60b86": "addRefBalance(address,uint256)", +"9cf66013": "whitelistRegistrantsFlag(address)", +"9cf66997": "clearLand(int256[],int256[])", +"9cf6f1eb": "CBVO()", +"9cf78527": "UAPToken(address)", +"9cf8ccfd": "currentPlayers()", +"9cf9342e": "createContract(bool,string,bool)", +"9cf94943": "whitelistAdd(address[])", +"9cf9d4c0": "setPOOL_edit_9(string)", +"9cf9e3ab": "TokenReleased(address,uint256)", +"9cfa0f7c": "maxTokensToBuy()", +"9cfa750f": "isParticipant(uint64,address)", +"9cfad128": "calculateFee(address,bool,bool,uint256,uint256)", +"9cfcab47": "NovoToken()", +"9cfd5dc4": "validPurchase(uint256,address)", +"9cfda697": "setColorsX4(uint16[4],uint256[20],uint256)", +"9cfdd04d": "BCN()", +"9cfdfe42": "AXIS()", +"9cfe42da": "addBlacklist(address)", +"9cfe6c86": "count_tokens()", +"9cff53e0": "nDeposits()", +"9cff621a": "withdrawDispersal()", +"9cff799c": "GetCuentaSocio(uint16)", +"9d000e78": "VUP_PER_ETH_PRE_SALE_RATE()", +"9d00ffa5": "isMessageValid(bytes)", +"9d01e730": "EarlyEndTimeChanged(uint256)", +"9d038cd3": "TEST1()", +"9d042f87": "dTimeoutCurrentStage()", +"9d0506ae": "checkData(bytes)", +"9d05414f": "Referral(address,address)", +"9d0617f9": "_send(address,uint256)", +"9d063ed8": "FIFSRegistrar(address,bytes32)", +"9d069353": "getAngel(uint64)", +"9d06a1d5": "removeFromWhiteList(string,address)", +"9d0714b2": "tgeSetLive()", +"9d079b18": "acceptProposal(bytes32)", +"9d07b653": "_createUnit(uint256,uint256,uint256,uint256,address)", +"9d07ff80": "ln_fixed3_lnr_18(uint256,uint256)", +"9d083222": "becomeMember()", +"9d0880a3": "transferUnsoldTokens(address)", +"9d09390b": "isValidAuthority(address,uint256)", +"9d097471": "getUserBounty(address)", +"9d09798f": "DemurringFee(address,uint256)", +"9d09f8e5": "changeRebackRate(uint256)", +"9d0b2c7a": "pendingStake(address,uint256)", +"9d0c0c35": "generateCrabGene(bool,bool)", +"9d0c1e6f": "walletETH()", +"9d0cfc2c": "closeDepositSubRound()", +"9d0d0a5a": "getTotalToggleGameDivsProduced()", +"9d0d9f1c": "azatipsToken()", +"9d0df9b5": "getPOOL_edit_11()", +"9d0e0cd3": "getTotalTAOsCount()", +"9d0e5871": "shipping(address)", +"9d0effdb": "revokePermission(address,address,bytes32)", +"9d0f17c8": "unsoldTokenIssued()", +"9d0f8763": "cancelOrderByAdmin(uint80,bool)", +"9d0fb699": "tokensToBeClaimed()", +"9d106954": "_getUserMinersAt(address,uint32,uint32)", +"9d1080c5": "UnilotToken()", +"9d10fda8": "escrow_fee_denominator()", +"9d118770": "destroy(uint256)", +"9d119a4e": "EmergencyUnPause()", +"9d119a7b": "getDepositTxMap(string)", +"9d11aaaa": "transferFeePercentage()", +"9d11f09f": "getTxAmountKWh(bytes32)", +"9d129afd": "prevBlock()", +"9d12e775": "zec()", +"9d13156c": "claimRefundOwed(uint256)", +"9d134185": "setauctionsystem(uint256,uint256)", +"9d1362a9": "getAllInvestmentsWithdrawnByBeneficiary()", +"9d139ff2": "LajokiCoin()", +"9d140fa2": "inPreSale2Period()", +"9d144f8a": "_preventedByNationalityBlacklist(address,uint256)", +"9d145866": "loadRate(uint256)", +"9d14f134": "getRepo(bytes32,string)", +"9d153495": "withdrawRefund(uint256)", +"9d1672c4": "getAffiliateRate()", +"9d16aca6": "changeExchangeContract(address)", +"9d170c5d": "getRef(string)", +"9d176556": "setDistConfig(address[],uint256[])", +"9d189473": "calculateAndMintTokens(address,uint256)", +"9d18e405": "approveAndBuyAffiliated(uint256,address,uint256,bool,address)", +"9d1a9ff9": "rebatePeriod_()", +"9d1acead": "periodPresale()", +"9d1b0fd1": "createProduct(bytes32,string,bytes32,bytes32)", +"9d1b464a": "currentPrice()", +"9d1b8945": "requestedRedeem(address,uint256)", +"9d1bbd7e": "CancelRoundAndRefundAll(uint256)", +"9d1be930": "autopayfee()", +"9d1c3f03": "isMaximumPreFundingGoalReached()", +"9d1c4d42": "buyAnalysis(uint256,uint256,address)", +"9d1d14e0": "setEtherExchangeLikeCoin(uint32)", +"9d1ddca5": "fiveYearGrace()", +"9d1e0d48": "buy(address,string,uint256,uint256,uint256,uint256)", +"9d1e351c": "totalBonusToken()", +"9d1e641b": "CROWD_WEEK3_BONUS()", +"9d1eb451": "MAT_CROWDSALE_SUPPLY_LIMIT()", +"9d1ebfd6": "nextReleaseAmount()", +"9d1eeb97": "redemptionBurn(address,uint256)", +"9d1f2800": "doPush(address,uint256)", +"9d1fd89c": "getFirstBorrowAgreementTool(address,address)", +"9d1ffed9": "_certify(bytes32)", +"9d2044e1": "setContrAddrAndCrwSale(bool,address,address,address,bool,bool)", +"9d20467a": "changeTiming(uint256,uint256)", +"9d209048": "getNode(address)", +"9d20b314": "TotalpresaleSupply()", +"9d210369": "resetMaxBonusThreshold()", +"9d210bdd": "getStoriesLength()", +"9d21328f": "sharedExpense()", +"9d21dd78": "getGameTime()", +"9d2235e7": "_leapYearsBefore(uint256)", +"9d22c693": "before_test_method_increaseTimeBy30000()", +"9d23c4c7": "tokenRegistry()", +"9d240cf2": "Workshop()", +"9d245238": "getWinNumbers(string)", +"9d248477": "BeaverCoin()", +"9d248e08": "burn3(uint256,uint256,uint256)", +"9d24c49f": "_payloadOffset(uint256)", +"9d24e482": "theWinner()", +"9d255663": "EthMonoPoly(address)", +"9d2620bf": "RealEstateCouponToken()", +"9d2668d4": "setPurchased(address,address,uint256)", +"9d273b20": "refundStatus()", +"9d2754a9": "createTokenToTax()", +"9d2777f4": "IntermediateWallet()", +"9d277a49": "unregisterPublisher(address)", +"9d2870c3": "LPAIToken()", +"9d29255b": "setCSCERC721(address)", +"9d29cac4": "getMonsterClass(uint32)", +"9d2a1eab": "GrantAdded(address,uint256)", +"9d2a8cf0": "unwhitelistAddress(address)", +"9d2ab46d": "BUZZToken()", +"9d2ae623": "depositJackPot()", +"9d2affd5": "transferFrom(address,address,address,address[],uint256)", +"9d2be721": "insertTopic(bytes15,address,bytes32,bytes15)", +"9d2cc436": "RESERVE()", +"9d2cd67c": "collect_main_fee()", +"9d2d912e": "futureDevLock()", +"9d2e4777": "vestingTransfer(address,uint256,uint32)", +"9d2ec188": "setFeeParams(uint256,uint256)", +"9d2f1cbb": "changeStakingFees(uint80,uint80,uint80,int256,uint80,int256,uint256,int256,uint80,uint80,uint256)", +"9d2fc3c8": "adjudicate(uint256,uint256)", +"9d2fcb8c": "setInvestmentAddress(address)", +"9d2ff29c": "ICDSupply()", +"9d30584c": "setHard_Cap(uint256)", +"9d323193": "RTCToken()", +"9d327229": "fechVoteResultForCandidateByStage(address,uint256)", +"9d340b71": "buyTokensfor82()", +"9d3565ce": "transferOr(address)", +"9d35dcac": "NewUser(uint256,address,address,uint32)", +"9d36c500": "freeAnimalsLimit()", +"9d38cdbf": "OwnedUpgradeabilityProxy(address)", +"9d38cea3": "stopPreIco()", +"9d390d83": "setIsWeiAccepted(bool)", +"9d3995c2": "setHeroPost(address,uint256)", +"9d3ac6d5": "getBuyerContribution(address)", +"9d3acf23": "isResolvedForDefendant(uint256)", +"9d3aee8d": "st4ckHeight(uint256)", +"9d3c015e": "PChannel(address)", +"9d3c3b5d": "getArrayHashMarketItem(bytes16)", +"9d3c663f": "isBreakingCap(uint256,uint256,uint256,uint256)", +"9d3cc187": "changeSetRateAddress(address)", +"9d3d1d82": "userSponsorshipsPred(address,uint256[],uint256)", +"9d3d741c": "testAboveLength()", +"9d3d9b4d": "FETCOIN()", +"9d3de343": "addVictim(string,string)", +"9d3de95a": "getPortfolioInfo(address,uint256)", +"9d3e069c": "StartDraw()", +"9d3e1ab8": "walletRemaining()", +"9d3ec1a7": "getMarriageDetails()", +"9d3f2e5f": "stakeEthForGas(uint256,address)", +"9d3fae04": "applyAuditorsCheckUpdate(address,address,uint256)", +"9d3fe4c2": "AGAVETHER(string,string)", +"9d4022c8": "OrderStatisticTree()", +"9d406a13": "getLocksLockedFor(address,uint256)", +"9d408b93": "gasBefore_()", +"9d4095cc": "getAmbientTempException(bytes32)", +"9d41198e": "startnewround()", +"9d41a9af": "getOccupation(address)", +"9d41d6fc": "testInitialBalanceWithNewRGXToken()", +"9d421ea7": "claimTeamToken()", +"9d42829a": "getGoldInfoDocumentation(address)", +"9d42d1a9": "sendEvent(uint256,bytes32)", +"9d4323be": "drainToken(address,uint256)", +"9d4327a0": "stockBuyCertainOrder(uint256,uint256,uint256,uint256)", +"9d433c71": "sharesOfSPS()", +"9d442102": "BuyRocketForSale(uint32)", +"9d44ac4f": "permissionExists(uint8,address)", +"9d44d93b": "delegateTransferAndCall(uint256,uint256,address,uint256,bytes,address,uint8,bytes32,bytes32)", +"9d44fca2": "computeEthConstant(uint256)", +"9d451c4d": "right77(uint256)", +"9d45b9d2": "soldTokensPreIco()", +"9d45d077": "raiseSellOrderMatched(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,int160)", +"9d463520": "lastMintTime()", +"9d463b99": "addPool(uint256,uint256,uint256)", +"9d471837": "updateTextForHolder(bytes32,bytes)", +"9d478656": "sendp(address,uint256)", +"9d481848": "propose(address,bytes)", +"9d484693": "payouts(address,uint256)", +"9d4936f9": "MINING_OUTPUT()", +"9d4971b7": "getOrderLength()", +"9d499363": "faucetTokenAddress()", +"9d4ab2a3": "setInvestAgent(address)", +"9d4aba7c": "getTimestamp_()", +"9d4ace0b": "reg_bountyHunter(address,address)", +"9d4b1239": "tokensDistributedCrowdsale()", +"9d4c162d": "executeProposal(bytes32,int256)", +"9d4c5451": "minTokens()", +"9d4c662c": "sell_id()", +"9d4c7737": "creditStatus()", +"9d4c8eed": "getChildCount(address)", +"9d4cc8ad": "Poppins()", +"9d4cf268": "isERC165Interface(bytes32)", +"9d4d8db3": "Happy()", +"9d4e85ce": "getUserDeposits(address,address)", +"9d4e9a60": "addContractERC20(address)", +"9d4ea0f3": "canMove(uint16,uint8,uint8)", +"9d4ff8ad": "enter(string)", +"9d5176fd": "getPremiumFactors(bytes32)", +"9d51d9b7": "setMaxBalance(uint256)", +"9d523f4c": "_getNextOwed()", +"9d52f74b": "getFreezeGap(bytes32)", +"9d532041": "createCrowdsale(address,address,uint256,uint256,uint256,uint256,uint256,bool,uint8)", +"9d535056": "punterWaiting()", +"9d5367c5": "KIDToken()", +"9d53827f": "MAX_TRANSFER()", +"9d53f19e": "getInvestorInforMin(uint16)", +"9d54c79d": "notary()", +"9d54f419": "setUpdater(address)", +"9d55fba7": "updateCommission(uint256)", +"9d564d9a": "unlockTokens(address,uint256)", +"9d56998d": "my_message()", +"9d5708ff": "myTulipsBatched(uint256,uint16)", +"9d575582": "depositToken(address,uint256,address)", +"9d5779ce": "Site(string)", +"9d5839e3": "getFirstMilestone()", +"9d585f7f": "loanAmount()", +"9d58a5b6": "unitExists(uint256,uint256)", +"9d58aa41": "changeRestrictedtStatus(address,address,bool)", +"9d58b15d": "addMember(address,address)", +"9d59011e": "setAmount(uint128)", +"9d599cbf": "hashClaimable(bytes32)", +"9d59beb1": "listTokenFee()", +"9d5c6061": "getMsgGas()", +"9d5c6e20": "setPrivateSaleEndDate(uint256)", +"9d5c7be8": "collectionCountsOf(address)", +"9d5de12e": "STQPreSale(address,address)", +"9d5eab46": "setItemOption(address,uint256,uint256)", +"9d5eb078": "buyTemplate(uint256)", +"9d5efb6b": "tokenContractSupply()", +"9d5f2422": "createDifficultyOracle(uint256)", +"9d5f5cd3": "mktValue()", +"9d5f658e": "viewFirstBatchOfContractState()", +"9d61193a": "passoverStartTime()", +"9d617fae": "pendingFills(address)", +"9d619dad": "currentTournamentBank()", +"9d61e624": "hardcapInEth()", +"9d625241": "powermayorCutPercentage()", +"9d62f07b": "BlockGrainCoin()", +"9d636359": "initialMarketSales()", +"9d63848a": "tokens()", +"9d64a5e5": "newFoundationCandidate()", +"9d64d474": "cancelExplorationByIndex(uint256)", +"9d652118": "presaleclosingTime()", +"9d66a9cd": "getDetail(uint256)", +"9d66e913": "callStcWithBto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"9d67b404": "addChunk6ToWhiteList()", +"9d68521a": "revokeOperatorTranche(bytes32,address)", +"9d69d5c6": "CERTIToken()", +"9d69fdff": "Ecometh()", +"9d6a4d77": "allotToken(uint256)", +"9d6abbcd": "unlockedEscrow(bytes32)", +"9d6abe4f": "getLink(address)", +"9d6ad799": "computeTokenWithBonus(uint256,address)", +"9d6adeaf": "HitToken(string,string,uint8,uint256)", +"9d6b74f8": "DISPLAY_CLASSIQUE_ET_VIDEO()", +"9d6bf036": "setIsLimited(bool,string)", +"9d6d22b5": "ProgrammerdaddysToken()", +"9d6d2321": "dividendsFull(address)", +"9d6d78e4": "chunk3IsAdded()", +"9d6d8598": "depositTokens(bool,uint256,address)", +"9d6dcf53": "Smilebitbuy(uint256,string,uint8,string)", +"9d6e0c22": "setBroker(address,address,uint256)", +"9d6e4eaa": "ReleasableToken(string,uint256,string,uint256)", +"9d6eaad5": "returnTokensToOwner(string)", +"9d6f78c1": "LineToken2()", +"9d6fa618": "requestTransferOwnership(address)", +"9d6fac6f": "cooldowns(uint256)", +"9d6fb020": "isRefunding()", +"9d70085e": "cap3(address)", +"9d707d03": "resetAuctionStart(address,address)", +"9d7150fe": "isAffiliateValid(address)", +"9d7233d4": "MIN_CONTRIBUTION_WEIS()", +"9d72d8d3": "luckyBuy(uint8)", +"9d733f0c": "submissionPrice()", +"9d735286": "forwardFunds()", +"9d7354c0": "BuyHandler(uint256)", +"9d735fc5": "RewardPoint()", +"9d73cecc": "validatePeer(address)", +"9d7437b8": "WALLET_ADVISOR()", +"9d74b37d": "getBool(address,bytes32)", +"9d74b959": "test_basicWithAssertBeforeThrow()", +"9d74fb7c": "ContributionMock()", +"9d755367": "getOwnerOfTicket(uint256)", +"9d75c113": "_joinCDP(bytes32,uint256)", +"9d7616a5": "preEtherCap()", +"9d76ea58": "tokenAddress()", +"9d770e49": "abstractResolver()", +"9d773a1b": "catsForSale(uint256)", +"9d77bd68": "luCat()", +"9d77e4f8": "getChainFees(uint256)", +"9d77f85a": "buyCollectible(uint256,uint256,int256)", +"9d79468a": "claimRewardTo(address,uint256,string)", +"9d7a63e9": "changeDripAmounts(uint256,uint256)", +"9d7acf74": "BluechipToken()", +"9d7b5621": "numberOfTokenId()", +"9d7b7636": "Neymar()", +"9d7b8887": "addAddressMappingProposal(address)", +"9d7bf73c": "PLUS()", +"9d7d6667": "multipliers()", +"9d7da479": "mintTokens1(int256,address,uint256,uint256,bytes32)", +"9d7e2730": "issueCoins(uint256,address)", +"9d7e6ca8": "setResponseAddress(address)", +"9d7eb375": "updateUserDetails(string)", +"9d80ac4d": "WithdrawedEthToWallet(uint256)", +"9d80c818": "addressCount()", +"9d815818": "validReleasedToken(uint256)", +"9d8168f0": "removeManyWhitelist(address[])", +"9d821c1a": "setManualSaleFlag(bool)", +"9d827eb9": "CreationFeeChangedEvent(uint256)", +"9d8374b4": "removeFromBlacklist(address,address)", +"9d837ccd": "ETH_CAP()", +"9d83ee1b": "getAllCardDatas()", +"9d84934d": "mintStartYear()", +"9d84ae69": "readAddress(bytes32)", +"9d856bdc": "queen()", +"9d858a80": "Pheonix(uint256,uint256)", +"9d85fca3": "findIndexFromRandomNumber(uint32)", +"9d866527": "Strange()", +"9d86ad52": "CloseIfBug()", +"9d86fd0c": "test_threeTrueAssert()", +"9d87a373": "transferFromMany(address[],address,uint256[],address)", +"9d87e7f0": "getWeiAvailableToReturn(address)", +"9d882b5d": "Sotoin()", +"9d88584e": "removeFamily(address)", +"9d888e86": "currentVersion()", +"9d88f3a1": "setLotteryAddress(address,address)", +"9d89add1": "createMechETH(uint256,address)", +"9d89e7d4": "challengeAmount()", +"9d8a0212": "costOfOneToken()", +"9d8a18ea": "VT(uint256,string,string)", +"9d8a8c43": "totalTokenMintedPreSale()", +"9d8abff3": "miningAttempts(uint256,address)", +"9d8b0834": "verifyLoanOfferingRecurse(address,address[9],uint256[7],uint32[4],bytes32,bytes)", +"9d8b157b": "teamCup()", +"9d8c3994": "giveAllToCharity()", +"9d8c428e": "addRoundMode(uint256,uint256,uint256)", +"9d8c7243": "CreateKRM(address,uint256)", +"9d8c997b": "getInfoByUnionId(bytes32)", +"9d8ca531": "closeLottery(uint256)", +"9d8cb45c": "foundationSupplyRemaining()", +"9d8d22f4": "grantReserveTokens(address)", +"9d8d911e": "_createCryptsy(uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,address)", +"9d8dbd20": "remove_kycer(address)", +"9d8df6dd": "cancelAdoptionRequest(bytes5)", +"9d8e2177": "UNIT()", +"9d8ee943": "right71(uint256)", +"9d8f2b17": "LCAP()", +"9d8f4c27": "priceUpdateAddress()", +"9d902fc0": "precisionFactor()", +"9d913c64": "addTokenLock(uint256,uint256)", +"9d9231b1": "_unpackLevelValue(uint256)", +"9d925fc8": "REFUND_RATE()", +"9d930f02": "newTeamOnEnd(uint64,uint64,uint64)", +"9d932a93": "validateSignature(bytes,bytes32)", +"9d94743a": "CND(address)", +"9d94a8fa": "_thresholdTwo()", +"9d94c343": "POSV()", +"9d94dac8": "fightEtherMonster()", +"9d95f1cc": "addNode(address)", +"9d963289": "NewLeader(address,uint8[])", +"9d96be58": "maxMintBlock()", +"9d96f200": "Factory(string)", +"9d97bcd7": "allocatePreICOTokens()", +"9d988d03": "X(address)", +"9d989b20": "chargeDailyRate(bytes32,address)", +"9d98cd78": "drawETH(uint256)", +"9d9a5e1c": "startPrivateICO()", +"9d9a7fe9": "completed()", +"9d9ab2d8": "setEtherUsdRate(uint16)", +"9d9ae444": "StatsReserved()", +"9d9aeb7f": "setInterestAllocationPercentage(uint256,uint256)", +"9d9afce9": "claimTokenReserve()", +"9d9b2e82": "RevenueSharingContract()", +"9d9b4d20": "DST_R_N_B_PROGRAM()", +"9d9b5342": "editInfo(string)", +"9d9bfb02": "throwsWhenNonMultisigDeploysANT()", +"9d9c9439": "tokenInitialised()", +"9d9c9a0d": "testControlCreateWithParentParentSameItemId()", +"9d9ca28d": "isWinner(address)", +"9d9cc8e9": "TestCrowdsale_Noname()", +"9d9d432f": "updateGenVault(address,uint256)", +"9d9db392": "makePayment(address,uint256,string)", +"9d9dcf81": "getXPL()", +"9d9fcc72": "checkWithdrawals(address)", +"9da065cb": "ReddyToken()", +"9da0c7b1": "nowCanProvideHash()", +"9da0d7d4": "dutchAuction()", +"9da0dc0a": "preICOWeiRaised()", +"9da1814c": "FremenTradeToken()", +"9da19acc": "isRedemptionReady()", +"9da1b02a": "createSale(uint256)", +"9da1bc7b": "updateBearCount(address)", +"9da26320": "registrations_confirmed()", +"9da2b791": "assignDNI(uint256)", +"9da30467": "payForOrderInTokens(uint256,address,uint256,address,uint256)", +"9da32c14": "Defapacoin()", +"9da43ef4": "getExtraPoints(uint32)", +"9da46ee3": "getPool(uint32)", +"9da59934": "getInbox(address,uint256)", +"9da5e0eb": "initDaylimit(uint256)", +"9da67e71": "OpenMoneyPresale()", +"9da680f3": "adjustRegistrationFee(uint256)", +"9da69180": "commitVote(uint256,bytes32)", +"9da78649": "getNewRecordInHistoryRecord(uint256)", +"9da8be21": "initWallet(address)", +"9da8e7e2": "createProxy(string)", +"9da9650e": "Cothereum(uint256,string,string)", +"9da9df3e": "withdrawContract()", +"9daa7b46": "STTCToken()", +"9daa9ecd": "percentAllocationFeeDenominator()", +"9daaae94": "setClient(bytes32,address)", +"9dab2054": "priceAt(uint256)", +"9dab3cd4": "userRight(address,bytes1,uint256)", +"9dab4607": "ACCEPT_DICE()", +"9dabff25": "sendReward(address)", +"9dac83e4": "allowWorker(address)", +"9dace789": "EOSGold(uint256,uint256)", +"9dad9382": "closeStream()", +"9dae2e80": "payoutDonations()", +"9dae6081": "createTournament()", +"9daf57cf": "getBdpDataStorage(address[16])", +"9daf77a5": "GetContractStateTerminatedMisrep()", +"9daf9b6b": "insertNodeAfter(uint256,uint256,address)", +"9daf9ce3": "computeTotalEthAmount()", +"9dafb4df": "prizeOwner()", +"9dafbc13": "initBlock(uint256)", +"9db02721": "refuseWork()", +"9db028ab": "getMetadataHistoryLength(string)", +"9db069d8": "bountyOwner()", +"9db09a08": "createContractMovie(string)", +"9db11039": "existenceTransferFromTest(address)", +"9db1b8af": "msc()", +"9db1cafa": "SuccessLife()", +"9db28672": "isOfferingStarted()", +"9db340de": "eraseNodeHierarchy(uint256,bytes32[],bytes32)", +"9db3956e": "setDatabase(string,uint256)", +"9db40718": "SearchIPR(string,string)", +"9db4372c": "num_tickets_current_round()", +"9db4577f": "addListToWhiteList(address[])", +"9db5d993": "putString(bytes32,string)", +"9db5dbe4": "transferERC20(address,address,uint256)", +"9db67cd0": "funcFromC3()", +"9db70e19": "tokenIdToRank(uint256)", +"9db7ff9e": "changeGameRuningblock(uint256)", +"9db834fe": "setColorPink()", +"9db8d393": "setCostToCancel(uint256)", +"9db91e78": "insecureMode()", +"9dbbcca3": "ChangePreICOStart(uint256)", +"9dbc041c": "requiredBid(uint256)", +"9dbc4f9b": "participantDetails(uint256)", +"9dbd1b96": "getRecipient(bytes)", +"9dbda902": "getHighestMortgageRate()", +"9dbdfe0d": "LocusOne()", +"9dbe3501": "LongPlace(address[2],uint256[8],uint256)", +"9dbf0087": "TokenERC20(uint256,string,string)", +"9dbf0543": "price_constant()", +"9dbf5eca": "updateRelayer(address,bool)", +"9dbf7014": "depositMineral()", +"9dbfe1b8": "setSaleRate(uint256,uint256)", +"9dc04184": "allowDraw()", +"9dc080d3": "angelToken()", +"9dc10d15": "preAllocatedTokensVestingTime()", +"9dc11280": "numDataOf(uint256)", +"9dc1d961": "message(bytes32,bytes32,string,string)", +"9dc27fe3": "setICOStatus(bool)", +"9dc29fac": "burn(address,uint256)", +"9dc2c8f5": "fireEventLog4Anonym()", +"9dc35799": "updateReading(uint256)", +"9dc371bd": "ULTRIXCOIN()", +"9dc42f16": "_removeOwner(address)", +"9dc43f2d": "newEmployeePoolPromille()", +"9dc4b9c9": "currentLevel()", +"9dc4ca42": "getWalletDigest(bytes32,address)", +"9dc4ef99": "_registerArtist(address)", +"9dc5b35e": "saveData(uint256,bytes32,uint8,bytes32,bytes32,bytes32,address)", +"9dc64f8e": "getWidthrawPercFor(string)", +"9dc6c12b": "TaiwanRepublic(uint256,string,string)", +"9dc6f173": "LogBidAccepted(address,uint256,uint256)", +"9dc7a49a": "RegisterUsername(string)", +"9dc7f01c": "pay_dividended()", +"9dc8832c": "JiucaiToken(uint256,uint8,string,string)", +"9dc905bb": "insertMilestone(uint8,uint256,uint256)", +"9dc90bd8": "GreeningDesertChainToken()", +"9dc9281b": "LjwToken3()", +"9dca362f": "createAccount()", +"9dca4e0a": "matchWinnerOk(uint8,uint8,uint8,uint8)", +"9dcb0f55": "fundingStartAt()", +"9dcb5c65": "resultsWeightedByEther()", +"9dcbed8b": "totalUnrestrictedTokens()", +"9dcbf7ea": "Rename(string,string)", +"9dccc5bf": "getRegistration(bytes32)", +"9dcd4beb": "optionExerciseSpan()", +"9dcee160": "voteC()", +"9dcf56b4": "proofType_TLSNotary()", +"9dd05af9": "setEarlyExchangeRate(uint256)", +"9dd0a30f": "iwithdrawal(uint256,uint256)", +"9dd0ff01": "max_bet_this_spin()", +"9dd1687e": "withdrawBasicTokens(address)", +"9dd21928": "whiteListAddress(address,bool)", +"9dd28e34": "registerVendor(uint256,bool,bytes,bytes)", +"9dd3045b": "TransferToken(address,uint256)", +"9dd373b9": "setStakingContract(address)", +"9dd409d3": "setPlayPrice(uint256,string)", +"9dd4fdd3": "MarketPrice()", +"9dd52927": "AuthorityController(address,address[],uint256,uint256,address)", +"9dd5b9a3": "_lockAllAmount()", +"9dd63c3a": "setOwnerPrice(uint256)", +"9dd74964": "dividendsSum()", +"9dd7b3c3": "getSellBallers()", +"9dd7e749": "getOffsaleCount()", +"9dd819cc": "test_fourValidEqInt()", +"9dd9c24b": "canPerform(address,bytes4)", +"9dda456a": "_firstLevelEth()", +"9ddae7f5": "determineOutcome(uint256,uint8[],uint8)", +"9ddaf5aa": "proofs(uint256)", +"9ddc4a47": "setTransformTarget_default(uint256)", +"9ddccc99": "TelonToken()", +"9ddd503e": "PlayChainToken()", +"9dde6eb6": "placeBidFromEtherScrolls(uint256)", +"9ddee5f9": "SlopeIncreased(uint256)", +"9ddf65e1": "AUTSCoin()", +"9ddf840d": "withdrawDivs()", +"9de0111f": "tokenWithdraw(uint256,address,uint256)", +"9de0eb04": "dappId()", +"9de12300": "updateICOmask(uint256,uint256)", +"9de18f9c": "controla(address,bytes32,bytes32)", +"9de2bd2f": "RYZToken()", +"9de2f796": "getMintAmount(uint256)", +"9de315f1": "getTargetContactPubKey(address)", +"9de39cb3": "testStartsWith()", +"9de4f41c": "seMurio()", +"9de518ba": "divertDividendsToBankroll()", +"9de66604": "erc20old()", +"9de6ba52": "ArtCore()", +"9de6c162": "acquireGauntlet(uint256,uint8,uint256)", +"9de6c45b": "addBox(uint256,string,string,string,uint256,uint8)", +"9de6d9aa": "changeGasLimitAndPrice(uint256,uint256)", +"9de7d032": "createPerson(uint32,string,uint256)", +"9de8302f": "createGen0Auction(uint256,uint128,uint128,uint40)", +"9de8535e": "readiscolorregistered(uint256)", +"9de91ccd": "getCCH_edit_12()", +"9de9205a": "getNujaNumber()", +"9de92f7e": "submitInput()", +"9de9d57e": "multiDistributeAdviserBounty(uint256[],bool)", +"9de9f1b8": "payJackpot3()", +"9dea34ad": "currBetID()", +"9deab49e": "_processERC20TokenPackPurchase(uint8,address,address)", +"9deb0b41": "createConsentFile(address)", +"9dec2189": "metaApproveHash(address,uint256,uint256,uint256)", +"9dec365e": "setCrowdsaleTotal(uint256)", +"9deca9ee": "disputeRounds(uint256,uint256)", +"9decaecc": "addEntryInMonths(address,uint256,uint256)", +"9decde19": "repriceAuctions(uint256[],uint256[],uint256[],uint256,address)", +"9ded1817": "sendCryptoVersusReward()", +"9ded35c8": "unpauseChannels()", +"9df06411": "addDepotEth(address,uint256)", +"9df08a9f": "getStatusEventCloseSuccess(bytes16)", +"9df0a5df": "ADDR_MAYA_TEAM()", +"9df0c176": "createCategoricalEvent(address,address,uint8)", +"9df184ae": "stageTwoEnd()", +"9df196ec": "getWhitelistDetailsFor(address)", +"9df1e2b0": "transferOtherToken(address,address,uint256)", +"9df1f9a1": "getYesCount(uint256)", +"9df21154": "AddToDB(address)", +"9df21bfd": "updateShareAddress(address,address)", +"9df39b4a": "removeCitation(address)", +"9df4867c": "transferSectors(uint16[],address)", +"9df4d0fe": "isChallenged()", +"9df51b89": "claimProfits()", +"9df537c6": "increaseBeneficiaryBalance(address,uint256)", +"9df5a643": "setAllowClaimUser(address,address)", +"9df5cbda": "isSucceed(uint8)", +"9df806d6": "setBurnerAddress(address)", +"9df8f631": "Ur()", +"9df93754": "Log2(bool,string)", +"9df94560": "leekStealTracker_()", +"9df971c1": "subFees(uint256)", +"9df9a1db": "disableKYC()", +"9dfaa207": "OWNERS_AND_PARTNERS_ADDRESS()", +"9dfad52d": "Expand()", +"9dfb071c": "WHITELISTING_MAX_CONTRIBUTION()", +"9dfb64fd": "toggleRefunds()", +"9dfb9de8": "getPawnLoanId(uint256)", +"9dfbb584": "refundNonWhitelistedPerson(address)", +"9dfcc05c": "isExpiredDeadline()", +"9dfcf372": "Lescovex_CYC(uint256,string,string,address)", +"9dfd1de3": "Token20(uint256,string,string)", +"9dfd4e2f": "MAX_ETH()", +"9dfd8b02": "getBuilding(uint256)", +"9dfde201": "Price()", +"9dfe29b5": "nextTokenType()", +"9dfecdcc": "openLottery()", +"9dff78de": "buyAnts()", +"9dfffa36": "countUp(address)", +"9e0112b8": "RESERVED_RESERVE_GROUP()", +"9e014cf1": "PrepareRollEvent(address,uint256,uint256)", +"9e01f9b9": "getUser2()", +"9e0234a1": "PHILCOIN()", +"9e036add": "NBCL(uint256,string,uint8,string)", +"9e03a5d0": "AndxorLogger()", +"9e03c589": "Delinetod()", +"9e03c971": "BuyKeys(uint256)", +"9e05c118": "availableCount()", +"9e05de62": "setFeeSharingValue(uint256)", +"9e060fb6": "updAcceptAdminWithdraw(bool)", +"9e07d205": "attorneySign()", +"9e098d9f": "LjwToken5(address,address)", +"9e0a2280": "TOKEN_SALE_ALLOWANCE()", +"9e0b7a1c": "approveCertificate(uint256,uint256)", +"9e0bb35e": "gamingDividendsReception()", +"9e0c0152": "lola()", +"9e0cb27b": "fetchOrderByOrderIndex(uint256)", +"9e0cbb64": "usersSpriteOwningHistory(address)", +"9e0cea05": "buyerCount()", +"9e0d8126": "PreICOEndTime()", +"9e0f35a2": "transfersSuspended()", +"9e0fd998": "updateEditionPrice(uint256,uint256)", +"9e0fdb26": "cancelSwap()", +"9e11b66c": "getLowerMaximum(uint256)", +"9e1224ce": "lotteryCloseInsurance(uint16)", +"9e126449": "registerForRaffle()", +"9e12c9b9": "sellCoin(address,uint256)", +"9e12d725": "NewTokenGrant(address,address,uint256,uint64,uint64,uint64)", +"9e12f15b": "units50percentExtra()", +"9e136878": "Transferred(uint256)", +"9e13baa4": "BNCConverterFactory()", +"9e13d3e1": "VietnamGemstoneChain()", +"9e140cc8": "ENCRYPTION_KEY()", +"9e1533a9": "getFounderMembersInvest(address)", +"9e159db0": "Lambo()", +"9e15bc25": "totalInput()", +"9e163aca": "getDocumentsCount(bytes16)", +"9e179b91": "addFreeMineral(address,uint32)", +"9e1832b5": "ListingCreated(bytes32,address,uint256,uint256,uint256,uint256,address)", +"9e196881": "sellBlock(uint256,uint256,uint256)", +"9e1a00aa": "sendTo(address,uint256)", +"9e1a4d19": "tokenBalance()", +"9e1ad320": "XERA()", +"9e1b9078": "addLandRevenue(uint256,uint256,uint256)", +"9e1be663": "SeedMarket(uint256,uint256)", +"9e1bf732": "addNewTokenTo(address,uint256)", +"9e1c6d6b": "transferFromFund(address,uint256)", +"9e1d14f1": "getThresholdsLength()", +"9e1e1ca9": "monstersForSale(uint8)", +"9e1e60c7": "depositOffchain(address,uint256,uint256)", +"9e1e6528": "uncertify(address)", +"9e1e9338": "getBuyerTransaction(address,uint256,uint256)", +"9e1eae34": "addReferrer(address,uint8)", +"9e1f5599": "executeTokenTxn(uint256)", +"9e20437c": "digits()", +"9e206ed5": "blockSkills(uint256[])", +"9e208922": "scheduledTopUp()", +"9e20a9a0": "registerToken(uint32,address,uint8)", +"9e20afdf": "weekly_disbursement()", +"9e20b768": "distributedBonusStakes()", +"9e20f6c9": "walletEmail()", +"9e211ee8": "dayFinished(uint16)", +"9e213fb7": "callReplaceCallback(string,address)", +"9e2262f5": "testCreateCostData()", +"9e229c55": "StatEventI(string,uint256)", +"9e22bd72": "lengthArrayApproval()", +"9e231e2d": "abortGame(uint256)", +"9e23602e": "hasAllAttrs(uint256,bytes2)", +"9e238366": "getCraftingAuction(uint256)", +"9e239ace": "itemOwner(bytes32,uint256)", +"9e23c209": "removeDeveloper(address)", +"9e243259": "frozenRate()", +"9e24edca": "TOKEN_FOR_INVESTER()", +"9e251c6f": "DonationReceipt(address,string,uint256,uint256,uint256,bytes32)", +"9e254262": "contractDurationInDays()", +"9e254d13": "Child()", +"9e25ec01": "KAL5Token()", +"9e25fd58": "SotkoCoin()", +"9e27a305": "sachin()", +"9e281a98": "withdrawToken(address,uint256)", +"9e282328": "getEditionReleaseTime(uint256)", +"9e28739d": "LogAddressTokenCapCalculated(uint256,uint256,uint256,string)", +"9e288374": "getContributor(address,address)", +"9e28abaf": "ShareActive()", +"9e29559c": "teamKeepingQuota()", +"9e29739e": "setContributionLevel(address,uint8)", +"9e29eb0f": "getUsersAwaitingForTokens()", +"9e2abcb5": "getddd(uint256)", +"9e2b8488": "getAuthor(uint256)", +"9e2d0478": "addNotaryToOrder(address,address,uint256,uint256,string,bytes)", +"9e2ed686": "cancel(address,bytes32)", +"9e2f04bf": "chooseWinner(uint256)", +"9e306d32": "MintableToken(uint256)", +"9e307955": "etherPrice()", +"9e30dd5f": "buyRareItem(uint256)", +"9e315d46": "payoutAmount(uint256)", +"9e31f9b6": "numGamesCheated()", +"9e321f42": "changeWhitelistOnly(bool)", +"9e3249ab": "setMinShards(uint8)", +"9e325b80": "SocialRemitToken(uint256,string,uint8,string)", +"9e326858": "private_AddGameBar(uint256,string,string,string)", +"9e331188": "startIco3(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"9e33f72c": "reclaimStarted()", +"9e34070f": "isClaimed(uint256)", +"9e340ffb": "endFreeGet()", +"9e34ba2f": "VUP_PER_ETH_ICO_TIER3_RATE()", +"9e34d78e": "getDrawCount(uint256)", +"9e352721": "PreBuy(uint256)", +"9e3572b5": "getCurrencyContract(bytes32)", +"9e35ff3e": "storeCarrotsCredit(address,uint32)", +"9e36fde7": "regName(string,address)", +"9e37273b": "getMintDigest(uint256,bytes32)", +"9e37c923": "subscriptionOf(address,address)", +"9e3809a9": "setFiscalVerify(bytes32,bytes32,bytes32,uint256,uint256,uint256)", +"9e385fa4": "raiseEmergency(bool)", +"9e38ac15": "ownerShip(address)", +"9e38c76e": "lockRedemption(bool)", +"9e39db38": "initChestsStore()", +"9e3a33b2": "_fetchPaidOrdersForMerchant(address)", +"9e3b34bf": "times()", +"9e3b77af": "lendingManager()", +"9e3b94f1": "CONFIRM_LIMIT()", +"9e3b9dc1": "secondTarget()", +"9e3c671c": "citizensAddresses()", +"9e3cd3f5": "_calculateRepayment(address,address)", +"9e3d0636": "numOfDeliveredCrowdsalePurchases()", +"9e3d154e": "vote(bool,bool,bool)", +"9e3d1b99": "Bakt(address,bytes32,address)", +"9e3d2d06": "totalEtherBetValue()", +"9e3d49db": "walletBounties()", +"9e3d7809": "setParamsTransfer(bool)", +"9e3df458": "twentyThirtyAllocation()", +"9e3e230b": "setSubmissionClosed(uint256)", +"9e3e6878": "allCatsAssigned()", +"9e3edce9": "setImageHash(uint256,string)", +"9e3f1f71": "isPartOfOrg(string)", +"9e416812": "creditGameAddress()", +"9e4195f1": "releaseOrderStakes(address,uint256,uint256)", +"9e41a9cd": "viewCertificateByCourse(address,string)", +"9e41b73f": "getWeapon(uint256)", +"9e422447": "clamp(uint256,uint256,uint256)", +"9e4307cf": "_95_ebetSmartContracti()", +"9e43692c": "FOUNDATION_POOL_TOKENS()", +"9e439ff8": "thirdPeriod()", +"9e455939": "getContractAddr()", +"9e459174": "_addDroneInternal(address)", +"9e45de73": "PieceTransferred(uint256,address,address)", +"9e45e0d0": "darknodeRegistry()", +"9e47214a": "isHarvestEnabled()", +"9e4734ba": "nextTimeout()", +"9e484dd4": "getMembersOfTierCount(uint256)", +"9e48d2fd": "setPayouts(uint256,string)", +"9e4902c9": "ZZCoin(address)", +"9e492aa6": "updateBLAddress(address)", +"9e497967": "CosmicPowerToken()", +"9e49e976": "importIssuerData(address[],uint256[])", +"9e4a5ade": "tokenICO()", +"9e4a613f": "setCertificate(string,string,string,uint256,uint256,string,string)", +"9e4a993b": "getGameStake(uint256,address)", +"9e4a9f2f": "SCComplianceService()", +"9e4ba1be": "testBuyTwoTokens()", +"9e4ba75b": "donateDividends()", +"9e4be339": "getPartners(address)", +"9e4bec3f": "senderIsProvider()", +"9e4c1357": "purposeWeiRate()", +"9e4d4d0c": "updateIcoEnding(uint256)", +"9e4ea320": "getterForTest(uint256)", +"9e4ece80": "getInvestorUnPaidAmount(address)", +"9e509af3": "NggaToken()", +"9e51051f": "initialRate()", +"9e524caa": "subMinutes(uint256,uint256)", +"9e5288a0": "getStep()", +"9e536132": "GetUserPools(address)", +"9e5406bf": "paymentWithCurrency(address,string,uint64,string)", +"9e544fff": "unclaimedReward(address)", +"9e551567": "PonziToken()", +"9e570d6f": "updateFighterStats(uint256,uint8,uint8,uint8,uint8,uint32)", +"9e58280c": "profit2()", +"9e584658": "newStandardCampaign(string,uint256,uint256,address)", +"9e58963f": "_clear(address)", +"9e58ad97": "getNormalCardList(address)", +"9e58cfd1": "decreaseBeneficiaryBalance(address,uint256)", +"9e58e1a7": "_addPartExperience(uint256,int32)", +"9e58f77f": "AddCandidateResult(uint256,address,uint256,uint256,uint256,uint256)", +"9e5914da": "setReferral(address)", +"9e59eb14": "getAllocated(address)", +"9e5ad3ea": "test_insert_findNoHintUpdateHead(int256)", +"9e5b241a": "getBorrowInfoByIndex(uint256)", +"9e5b53bb": "Crowdsale(uint256,uint256,string,string)", +"9e5cdaf0": "initialBankrollGrowthAmount()", +"9e5d0258": "regularDonations(uint256)", +"9e5d4c49": "executeCall(address,uint256,bytes)", +"9e5e86fa": "setEnforceKyc(bool)", +"9e5ece98": "updateLockDate(uint256)", +"9e5ee522": "tokensSoftcap()", +"9e5f1889": "partner2_address()", +"9e5faafc": "attack()", +"9e6031c6": "ZigZagToken()", +"9e60f8d6": "getPlayerSpaceshipBattleWinsById(uint256)", +"9e6371ba": "retire(address)", +"9e639858": "winPercent()", +"9e647aac": "getParameter(string)", +"9e6480fa": "A(uint256,string,string)", +"9e654dfa": "redeemForkedTokens()", +"9e65741e": "exchangePrice()", +"9e65a03a": "cancelSellCityForEther(uint16)", +"9e65c7e5": "updateLatestRevision(bytes20,bytes)", +"9e65fab0": "priceIsFrozen()", +"9e66cd38": "free(uint64)", +"9e67fa6a": "createArtwork(string,address,uint256)", +"9e686c0d": "getStaffLength()", +"9e687b6c": "retrieve(bytes32,address)", +"9e68ca82": "preValidatePurchase(address,uint256)", +"9e69383d": "TokenBatchTransfer()", +"9e697cd3": "startDateOfRestoreUnsoldTokens()", +"9e6985e2": "setbuyPrice(uint256)", +"9e6992b5": "BcengCoffeeToken()", +"9e69940d": "eachAirDropAmount()", +"9e69a6d2": "bountyTokensNotDistributed()", +"9e69c732": "take(string,string)", +"9e69f2bb": "premine()", +"9e6a5767": "previousTokenVesting()", +"9e6af2e3": "exchangeEthStb(uint256,uint256)", +"9e6afbda": "decreaseSpeed(uint256)", +"9e6b0faf": "addTimeForOpponentSelectForGladiatorBattle(uint256)", +"9e6bcba5": "getBoostFromTile(address,address,address,uint256)", +"9e6bdea0": "RegisterChallengeCreators(address,string)", +"9e6c0877": "__hasRole(uint256,uint256)", +"9e6cb42b": "voteEndTime()", +"9e6d4cd0": "joinRaceAndFinish(uint256,uint256)", +"9e6d6925": "setper(uint256,uint8,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"9e6d95c7": "checkHGame(uint256)", +"9e6eda18": "fee(address,uint256)", +"9e6f2ea2": "Kin()", +"9e6f505b": "BiigoToken(address,uint256)", +"9e6fb394": "companionsListCount()", +"9e7010a8": "Dashidai()", +"9e72942c": "getBoosters()", +"9e72a9d8": "sendToMarket(uint16)", +"9e750316": "pushBlock(uint256,uint256,bytes32,bytes32,string)", +"9e757e7f": "bookOVISSale(uint256,uint256,int256)", +"9e75a7c8": "bitplusAddress()", +"9e75c483": "busted(uint256,uint256,uint256,uint256)", +"9e761bbb": "beneficiaryList(uint256)", +"9e76a007": "removeConverter(address)", +"9e76e30d": "tokenRateUsd()", +"9e776ff5": "getTotalBattleboards()", +"9e79800d": "getOwner(uint16,uint8,uint8)", +"9e7a13ad": "people(uint256)", +"9e7b8d61": "giveRightToVote(address)", +"9e7cf86b": "changeSettings(uint256,uint256,uint256,uint256)", +"9e7d101e": "setMaxLeaders(uint256)", +"9e7d24df": "move(bytes32,uint256,uint256)", +"9e7e514b": "DiceGame()", +"9e7fec98": "owner_time_limit()", +"9e80138c": "LendConnect(address)", +"9e80b731": "test_threeValidAssertFalse()", +"9e80cab0": "ownerSetRecommendProportion(uint16)", +"9e8110e6": "setQuery(string)", +"9e813938": "expiresAfter(address,uint256)", +"9e817c03": "ROUND_LENGTH()", +"9e81c4b3": "sendFunds(address,uint256,uint256,uint256)", +"9e81e254": "_getMaximum(bytes32)", +"9e8385d6": "regadr(address)", +"9e83abe3": "newExit(address,uint256,uint32[])", +"9e84158e": "setPLATAddress(address,address)", +"9e845173": "getCCH_edit_34()", +"9e84d44d": "challengerConvicted(uint256)", +"9e8558a0": "setSellExchangeRate(uint256)", +"9e85742e": "approveEscrow(uint256,uint256)", +"9e86d7a8": "setVnt(address)", +"9e86f8c5": "RequestFactory(address,address,address)", +"9e86fb86": "investOffer(uint256,uint8[])", +"9e87a5cd": "getPriceFeed()", +"9e87c1c6": "getLastSingle()", +"9e87fac8": "Paused()", +"9e8836e2": "THORToken()", +"9e890cb3": "netAmountBought()", +"9e893d64": "TheUltimateWorldDigitalCurrency()", +"9e8a0f57": "getWinRate(uint256)", +"9e8a41f4": "getOutCar(uint256)", +"9e8ab40c": "ICOReserveWithdrawn()", +"9e8af7e9": "migrateInvestorFromHost(address)", +"9e8bf603": "curReleaseAmount()", +"9e8c3543": "setAuditAuditor(uint256,address)", +"9e8c39ed": "updateHolidayState(uint8,string)", +"9e8cfe20": "insert(int8,int8)", +"9e8e23b7": "lastBlock_v5()", +"9e8e3ef4": "nftExits(uint16,uint256)", +"9e8e4add": "changeTurnLast(uint256)", +"9e8ee59a": "addNewTicket(address,uint256,uint256,bool)", +"9e8f152c": "showLock(address)", +"9e8f2750": "withdrawInviteReward()", +"9e8fcbe9": "previousRoundId()", +"9e906157": "FundingRules()", +"9e90ce6c": "tokensIssuedForBonusRangeOne()", +"9e90f9aa": "blackHole()", +"9e916157": "STAGE_2_START()", +"9e9188ea": "setDividends(address)", +"9e918c0a": "setMaxArtworks(uint16)", +"9e9198c2": "layers(uint256)", +"9e920587": "testOwnedAuth()", +"9e92448e": "setRepAvailableForExtraBondPayouts(uint256)", +"9e925746": "_checkAndCallSafeTransfer(address,address,uint256,bytes)", +"9e92c991": "getTotalRollMade()", +"9e92dfd8": "getFiatTransactionsCount(string)", +"9e931e6b": "getRequesters(bytes32,uint256)", +"9e93d0e4": "reinvestReturns(uint256)", +"9e945ff2": "amendPurchase(uint256,address,uint256,uint256,uint256,string,uint256)", +"9e9548cb": "LabelSold(address)", +"9e95670d": "erc20Received(address,uint256,address,uint256)", +"9e9593ce": "RewardPoolAddress()", +"9e95f280": "setRatePreIco(uint256)", +"9e962b39": "minimumContributionPhase1()", +"9e964025": "bonusTokenThreshold()", +"9e965f7e": "revertSuspendedPayment()", +"9e96a23a": "give()", +"9e975ca6": "NSPToken()", +"9e976d38": "toMonth(string)", +"9e9785ad": "payoutCursor_Id()", +"9e985ea6": "changeControllerContract(address,address)", +"9e987b20": "treePot()", +"9e997121": "getConfigAddress(bytes)", +"9e9a783a": "canCallWithAssociation(address,address)", +"9e9a87e5": "agree(address)", +"9e9aed62": "contractTokenBalance()", +"9e9b6d06": "createOption(bool,address,uint128,uint128,address,uint64)", +"9e9bdb9b": "setMaxTransactions(uint16)", +"9e9ce791": "BrainLegitCoin()", +"9e9d0718": "Invested(address,uint256,uint256)", +"9e9d3aa4": "FirstBloodToken(address,address,uint256,uint256)", +"9e9e5b85": "ARIToken(address,address)", +"9e9ea24b": "PRE_ICO_TOKENS()", +"9e9eb444": "winFreeGo(uint256,uint256)", +"9e9ec9e3": "getHashAddresses()", +"9ea03ccb": "fundingUnlockPeriod()", +"9ea064b2": "getLevelConfig(uint32,uint32)", +"9ea0b8f0": "addTeamGrant(address,uint256,uint256,uint256)", +"9ea0c08c": "announcementName()", +"9ea134bf": "getRedeemableReputationStaker(bytes32,address)", +"9ea1b79d": "getContentChannel(uint256)", +"9ea2104d": "firstReleaseAmount()", +"9ea23080": "STQPreICO3TestHelper(address,address[])", +"9ea27016": "setTokenIdsIndex(uint256,uint256)", +"9ea28b5c": "VestingMemberAdded(address,uint256,uint256,uint256)", +"9ea30fae": "getPokemonOwner(uint256)", +"9ea407be": "updateTokensPerEth(uint256)", +"9ea480ec": "allowanceFlower(address,address)", +"9ea55bb0": "updateFeeAmount(uint256)", +"9ea57930": "stampIn(address,uint256,uint256)", +"9ea58112": "setLethalBonusAtHits(uint256)", +"9ea67876": "returnNumber(uint256)", +"9ea69541": "updateTileBlockValue(uint16,uint256)", +"9ea71c37": "getDesignatedReportingDurationSeconds()", +"9ea73895": "hitCharacter(uint16,uint16)", +"9ea76475": "subFreezingTime()", +"9ea776cd": "currentFundingRound()", +"9ea82706": "removeRealWorldPlayer(uint128)", +"9ea8a418": "updateFunds(uint256,uint256,uint256,bytes,bytes,bool,bytes32,bytes32)", +"9ea94877": "getLandIdByKey(bytes8)", +"9ea98d55": "intersect(address[],address[])", +"9eaa4812": "isLastMilestoneAccepted(bytes32)", +"9eab0e29": "FinalisedCrowdsale(uint256,uint256)", +"9eab503a": "dividendAddr()", +"9eab5253": "getMembers()", +"9eabebe7": "setTransferTime(uint256)", +"9eacc166": "transferAnyERC20Token(address,address,address,uint256)", +"9ead1478": "setMaxAnimals(uint16)", +"9ead1b00": "loanBalanceOf(address)", +"9ead7222": "tokenList(uint256)", +"9eadd77c": "roundMoneyDownNicelyET(uint256)", +"9eae2453": "setSchedule(bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,uint256)", +"9eae6555": "earlyContribList()", +"9eaeca9f": "getTokenReturnRate()", +"9eaeccf1": "TestToken(string,string,uint8,uint256)", +"9eaf17a1": "getCarveUpTokens()", +"9eb05f3a": "EarlySuccess()", +"9eb0ad03": "Exchange(address,address,address,uint256,uint256,uint256,uint256)", +"9eb180a7": "identifierToPrice(uint256)", +"9eb20aa7": "setPetLastTrainingTime(uint64)", +"9eb32fdb": "initializeContract()", +"9eb360cc": "updateRausPoint(int256,uint16,int256,uint16)", +"9eb44784": "getTokensForPresale()", +"9eb45706": "get_previous_asset_document_from_document(bytes32,bytes32)", +"9eb4da1c": "okamiTotalPurchase_()", +"9eb51bf1": "Goodluckcoin()", +"9eb59e00": "updateCursETHtoUSD(uint256)", +"9eb6c932": "ResetAllAmount()", +"9eb7294d": "transferRemainingTokens(address,uint256)", +"9eb7d170": "withdrawPendingBalance(address)", +"9eb81bd0": "unFreezeTransfers()", +"9eb866cc": "isBonusTime()", +"9eb8cbf3": "set_activity_details(uint256,string)", +"9eb9c68f": "stepBonusList(uint256)", +"9eb9dd3b": "getBetsProcessed()", +"9eba0196": "DYCOIN()", +"9ebafad6": "getLastAttackCount(uint256)", +"9ebb1250": "withdrawFinal()", +"9ebb5d3c": "getFreeCraigGrant()", +"9ebbf231": "setMinOrderSizeEth()", +"9ebc8c95": "isNeedLoan()", +"9ebca4ad": "setMasterRecruitmentAddress(address,address)", +"9ebe13a2": "END_ADDRESS()", +"9ebe4d98": "percentageQuarter2()", +"9ebee96c": "buyVirtTokens(address,uint256)", +"9ebf6d92": "Whitelist()", +"9ec0505a": "BING(uint256,string,string)", +"9ec12cfa": "sellsIngrWithoutDepletion(address,uint256,string)", +"9ec272b4": "getPremiumPack(uint256)", +"9ec32d45": "challengeWinningOutcome(bytes,uint16)", +"9ec35352": "returnRandom()", +"9ec3a90c": "verifyTimelock(bytes32,address,address,uint256,uint256,bytes32,bytes,bytes)", +"9ec40d1c": "checkCode(string)", +"9ec5a894": "rewards()", +"9ec68f0f": "multiSend(address,address[],uint256[])", +"9ec7486a": "GiveERC20()", +"9ec760df": "_sendMoney(address,uint256)", +"9ec7888f": "Available()", +"9ec79e99": "requestConsent()", +"9ec7e1c6": "nOS()", +"9ec8b026": "sort(uint256[])", +"9ec8eec9": "TokenImpl()", +"9ec92d42": "getSecondPhaseCap()", +"9eca085c": "isSupervisor()", +"9eca672c": "withdrawFor(address)", +"9ecbf341": "adminRescueFunds()", +"9eccf691": "setICOEnd(uint256)", +"9ece1d9c": "WeiToEther(uint256)", +"9ecf12cb": "HEART(uint256,string,string)", +"9ecf9037": "getNumberDonators()", +"9ed153c0": "master(address)", +"9ed1e4c6": "singleDigitBlock()", +"9ed26fe8": "setEtherInUSD(string)", +"9ed3b61b": "getTrustContract()", +"9ed3edf0": "transactionFee()", +"9ed44c91": "CharitySplit(uint256)", +"9ed474b3": "author2()", +"9ed49005": "completeIcoPart1()", +"9ed4ad43": "getMax(uint8[])", +"9ed53f88": "starExists(uint256)", +"9ed57360": "getPaintingSpeed(uint256)", +"9ed58c7a": "provideData(address,address,uint256,bytes)", +"9ed5c84c": "salePeriod()", +"9ed74a23": "createCloneToken(uint256,string,string)", +"9ed7772c": "OwnerSetPrizePool(address)", +"9ed78285": "GENEOS()", +"9ed78489": "Worldtvcoin()", +"9ed78df0": "PRESALE_TOKEN_SOFT_CAP()", +"9ed798be": "CrestToken()", +"9ed81bc9": "deregisterProducer(address)", +"9ed93318": "create(address)", +"9ed99951": "changeBntyController(address)", +"9eda7d23": "isContributor(uint256,address)", +"9edc7b44": "revokeStack(bytes32,uint256,uint256,uint256,uint256,uint256)", +"9edcebbb": "updateTabRap(bytes32)", +"9edd1bd2": "TestEvmStack()", +"9eddc441": "lockedAccountThresholdUsd()", +"9eddfb1b": "delay_pool_change_block(uint256)", +"9ede7a37": "voteCount(uint8,uint8,uint8)", +"9eded57a": "paybackLast()", +"9ededf77": "width()", +"9edf256d": "getShipPrice(uint256)", +"9edf42ff": "pendingNumbers(address)", +"9edfb647": "senderAllowedFor(address)", +"9edfb9ee": "acceptOwnershipOfVesting(address)", +"9ee035c9": "lookupCanonicalFormat(bytes)", +"9ee04661": "withdrawTeamFunds()", +"9ee06759": "setSquarePrice(uint8,uint256,address)", +"9ee0933f": "joinBounty(address)", +"9ee1bd0f": "whoIsOwner()", +"9ee22f9a": "setCompte_32(string)", +"9ee29ef2": "updateTargetToken(address,uint16,uint16)", +"9ee3518e": "setTeamMember(address,uint256)", +"9ee398ce": "getTierStartAndEndDates(uint256)", +"9ee484ce": "withdrawCerneuTokens(address)", +"9ee5451d": "PriceOneDisable()", +"9ee5555f": "setGovTax(uint8)", +"9ee60142": "_processBonus(address,uint256)", +"9ee61c9d": "testExistingVoteWeight()", +"9ee679e8": "requestWithdrawal(uint256)", +"9ee6a7c3": "onlineTime()", +"9ee6c0e1": "test_2_someTest()", +"9ee6ff70": "testSafeMul(uint256,uint256)", +"9ee71fae": "LogPolicyDeclined(uint256,bytes32)", +"9ee7fbd9": "extraRate(uint256,uint256)", +"9ee837f5": "total_empire_score()", +"9ee85a23": "Bitstoken()", +"9ee85a9f": "isPreSaleTokenRaised(uint256)", +"9ee8e2ff": "_addAmountBlocks(uint256)", +"9ee8fa93": "yearLength()", +"9ee94556": "TestTokensMigration(address)", +"9ee9c8b5": "chetan(uint256,string,uint8,string)", +"9ee9dd5c": "vault_state()", +"9eea480f": "TotalRequestsAmount()", +"9eea4a3a": "address2()", +"9eea67e8": "_addPerk(uint8)", +"9eeaa7f4": "exitDuration()", +"9eeb30e6": "turnoff()", +"9eeb4920": "setLockup_simus(address,uint256,uint256)", +"9eeb5a6a": "Manageable()", +"9eeb6c11": "setBatchCeateDrawingsAddress(address,address)", +"9eeb79b2": "buildUrl(address,uint256,uint256)", +"9eec22e7": "reclaimEtherDeadline()", +"9eec4bac": "payoutFromContract()", +"9eec6e89": "TokenLogic(address,address,address)", +"9eed8369": "neWon()", +"9eee5787": "Standard_1()", +"9eee8041": "getPointSize(uint32,int256)", +"9eee85fe": "bookEarnings(address,uint256)", +"9eeea0d0": "PAOCoin()", +"9eeef510": "bidCustomAuction(uint256,uint256,address)", +"9eef6f65": "addRequest(address,address,bytes32)", +"9eefdd87": "enableAddress(address)", +"9eefde81": "BasicKNOW()", +"9ef0653c": "setICO4Phase()", +"9ef065bb": "fDiv(uint256,uint256)", +"9ef1204c": "vote(bytes32,uint256)", +"9ef13593": "decayedBalanceOf(address)", +"9ef1fbc4": "MudshotsToken()", +"9ef279d1": "burn(address[16],uint256)", +"9ef27b00": "closedAt()", +"9ef35c01": "setJackpotFeePercent(uint256)", +"9ef36bd1": "queueCount()", +"9ef40238": "getcoinsvotes(string)", +"9ef45a31": "someFunction2()", +"9ef46973": "guessFlip()", +"9ef48a31": "setBonusTokenRateLevelThree(uint256)", +"9ef5233f": "setByteSize(bytes32,uint256)", +"9ef53400": "getStaticArraySize()", +"9ef63e97": "paybackToOwner(address)", +"9ef6bf79": "store_ETH_to_contract()", +"9ef6ca0f": "left33(uint256)", +"9ef7a463": "exchangeRateForETH()", +"9ef7e723": "withdrawContractToken(uint256)", +"9ef887ec": "makeItRain(address[],uint256[])", +"9ef916ab": "setOriginalSupply()", +"9ef95545": "CheersWangToken()", +"9ef965d1": "RealEstateToken()", +"9ef974bb": "checkGlobalBalance()", +"9ef9df94": "transcoderTotalStake(address)", +"9efa776d": "tokenFallback(address,uint256,uint256[])", +"9efbae81": "FundTransfer(address,address,uint256)", +"9efbc411": "PICOPSCertifierUpdated(address,address)", +"9efc0190": "YORITEX()", +"9efc81fe": "minimal_token_sell()", +"9efc94a6": "kycLevel()", +"9efd1f0c": "startNextEra_(bytes32)", +"9efe6454": "Rena()", +"9efedc91": "getMyAccuAmount()", +"9efeefa5": "betAgainstUser(uint256,uint256)", +"9effb6a6": "CrowdFunding(string,string,string,uint256,address)", +"9f00237b": "minContribution(uint256)", +"9f005920": "accept(address)", +"9f00c0de": "btycsubmoney(address,uint256)", +"9f020d3a": "equalsNoCase(string,string)", +"9f022f05": "IMDEXsetAdmin(address,bool)", +"9f03711a": "withdrwleftovereth(uint256,address)", +"9f03c3b8": "hicsTokenPrice()", +"9f03d82f": "CGTToken()", +"9f047f3c": "fundProject(string)", +"9f04873d": "VILLAGE_INCREASE_RATE()", +"9f04996d": "bid(uint256,address)", +"9f052fea": "setMintRequestAddressMap(uint256,int256,string,address)", +"9f054b15": "SushiCoin()", +"9f05a36d": "getEnd()", +"9f0650d9": "etherPriceUSD()", +"9f06a579": "ViewBet(address,uint256)", +"9f06aa08": "collateralize(uint256)", +"9f0812cb": "_registerIfNeeded(uint256)", +"9f084b3a": "CAMS()", +"9f08a68c": "working()", +"9f08fc38": "subGlobalBlockValueBalance(uint256)", +"9f095e88": "asdf()", +"9f0a11ee": "buyPrice_wie()", +"9f0b17e3": "forward_transaction(address,uint256,bytes)", +"9f0b7f16": "Foo(string)", +"9f0be144": "getGreeksBattlePointsBy(address)", +"9f0d5f27": "depositAll(address)", +"9f0d6d0f": "ship(uint256,address)", +"9f0de490": "challengeOutcome(int256)", +"9f0e1986": "createGen0Auction(uint256,uint64)", +"9f0e3107": "get_timestamp(bytes32)", +"9f0e591b": "ABCDToken()", +"9f0e7d44": "companyReserves()", +"9f0eed0f": "GetCurrentICOCycle()", +"9f0f78ca": "profitsTotal()", +"9f10a990": "userEntries(address)", +"9f117317": "releaseManyStakes(uint256[],address[],address[])", +"9f118536": "initiated()", +"9f11e9cd": "setRegistrant(uint256,address)", +"9f126281": "updateFirstBuyer(bytes32,uint8,bytes32,address)", +"9f12fde0": "modifyBet(uint256,uint256)", +"9f1306cb": "P3DReceive()", +"9f132677": "MAX_CONTRIBUTION_WEIS()", +"9f13c4c7": "sealableProperties(uint256,bytes32)", +"9f147c41": "tokenPriceInCent()", +"9f15e729": "setgamecardname(uint256,string)", +"9f161d39": "BaseCrowdsale(uint256)", +"9f165304": "STAGE_PRESALE_ETHRaised()", +"9f166cf1": "multiBalanceOf(address,address[])", +"9f16b7d0": "setStarAuction(uint8,address,address)", +"9f16d65f": "fifthMonthEnd()", +"9f16f0e2": "_deposit(uint256,uint256,address,uint256)", +"9f174c6f": "AIRDROP_SHARE()", +"9f180cf1": "calculateAccountValues(address)", +"9f181b5e": "tokenCount()", +"9f184dd5": "aggregateValues(address,address)", +"9f186edb": "setSpawner(address,bool)", +"9f19296b": "getGroupStatistic(uint256)", +"9f1aa404": "refundAllInvestorTokensPurchases(address)", +"9f1ae1c1": "FSATToken()", +"9f1ae6ac": "MAX_CARS_TO_GIFT()", +"9f1b3bad": "Receive()", +"9f1cda42": "ValidateEventStorage(bytes,bytes)", +"9f1eaa4c": "getUnsoldTokensWithDecimals(uint256,uint256)", +"9f1f07fe": "iWAMToken()", +"9f1f238e": "isChecksumValid(bytes32)", +"9f1f2d77": "_updateReferrerFor(address,address)", +"9f203255": "setAuditor(address)", +"9f204a47": "sendIncentivisation(address,uint256)", +"9f21edf6": "setLevelPAO(uint256,uint256,uint256,uint256)", +"9f223167": "ownerEth()", +"9f22af8e": "add2Y(address,uint256)", +"9f233c76": "Seiyuu()", +"9f237b43": "deathData_v9()", +"9f242bf5": "NUTScoin()", +"9f245957": "totalDiscountedItemsForSale()", +"9f275dec": "investBalanceOf(address)", +"9f2763d2": "newPurchase(string)", +"9f28f7c4": "toSCL(uint256)", +"9f28f8c2": "changeWhitelistedAddressCapAmount(address,uint256)", +"9f296b62": "getPaymentTotal(address)", +"9f29e1a1": "thisContractTokenBalance()", +"9f2a1471": "erc820Registry()", +"9f2a6374": "platformWalletAddress()", +"9f2b03b6": "LAB()", +"9f2b22c7": "CanYaCoin()", +"9f2bbcfd": "LoggerAuthorized(address)", +"9f2bc32b": "preITO()", +"9f2c1fd8": "ERC20(uint256,string,uint8,string)", +"9f2c9503": "mintAndLock(address,uint256)", +"9f2ccbcc": "buyAnimalsFromAnimalFactory(string,string)", +"9f2ce678": "vote(bytes32,bool)", +"9f2e0f9c": "managePlayer(address,uint256)", +"9f2e7ce3": "prevXRPCToken()", +"9f2eaf4e": "verifyCanWithdraw(address,address,uint256)", +"9f2ee8b8": "getBlocksByOwner(uint256,uint256,address)", +"9f2f077c": "totalTransformedTokens()", +"9f2f58ec": "void_race()", +"9f2ff221": "teama()", +"9f2ffaff": "_0xGoldToken()", +"9f30ca9a": "getOpenBidsByBidder(bytes32,address)", +"9f318ae8": "HKHCToken(address,uint256)", +"9f31de2e": "updateTokensForCloudexchangeTeam(uint256)", +"9f327124": "ReflexCoin()", +"9f329b15": "SpareCurrencyToken()", +"9f334696": "isNumRed(uint8)", +"9f337cce": "_createTeam(string,address,uint256)", +"9f33d9cb": "joinAsBuyer()", +"9f34ab0c": "PXGToken()", +"9f34ce14": "activateConflictResolution()", +"9f351fc0": "totalRedeemedCheque()", +"9f35910c": "getTeamOwner(uint32)", +"9f35caee": "getAllChainIDsOfUser(address)", +"9f35d3b2": "start(string,string,uint256,uint256,uint256,uint256)", +"9f37092a": "buyItem(address,uint256)", +"9f373a7a": "updateCandidate(address,string,string,uint256)", +"9f37b53f": "verificationSlashingPeriod()", +"9f396cff": "voteAgainst()", +"9f3c4416": "claimInheritance()", +"9f3ce55a": "sendMessage(address,uint256,bytes)", +"9f3d7b0b": "addProposal(address,uint256)", +"9f3e1846": "EscobarcoinToken()", +"9f3edbe1": "emissionStatusUpdate(bool)", +"9f3ef430": "payTokenHolderBasedOnTokenCount(address,uint256)", +"9f3f736a": "LIMITED_ADMIN()", +"9f3fab58": "a(bytes32)", +"9f3ff73a": "setExternalCurrencyProcessor(address)", +"9f403a3d": "addProfit(address,address,uint256)", +"9f406c8b": "isPreICOFinished()", +"9f408251": "TaTaTu()", +"9f4085fd": "setAddressKYC(address,address)", +"9f4216e8": "userList(uint256)", +"9f4283fa": "jdaleveridgesyscoin()", +"9f43daf7": "sendEthTweet(string)", +"9f43ddd2": "expirationTimestamp()", +"9f4478a2": "modifyRate(uint256)", +"9f44b34c": "EXT_COMPANY_TWO()", +"9f44fa19": "FeedbackUpdated(uint256,uint8,bytes32)", +"9f454f2b": "LEU(address,uint256)", +"9f45b45c": "getModuleByName(uint8,bytes32)", +"9f45c8ec": "nodeCheck(bytes32)", +"9f45f982": "PATH(uint256)", +"9f489e4e": "getDeposit(uint256,address)", +"9f494565": "LogMint(address,uint256)", +"9f49cefb": "addStage(uint256,uint256)", +"9f4aaaef": "asmName(address)", +"9f4ba0ee": "setInitialPrice(uint256)", +"9f4cd0ef": "current_item_index()", +"9f4e8405": "updatePaymentManager(address)", +"9f4f4808": "setCrowdfundAddress(address)", +"9f4f903e": "TicketToken()", +"9f4f9886": "getRateAt(uint256,uint256)", +"9f4fae14": "getAmountWeeklybyNum(uint32,uint8[4])", +"9f509ab1": "FUNDING_PRESALE_MAX()", +"9f5185b6": "EventCashOut(address,uint256)", +"9f51cf67": "balance_available_for_custom_voting()", +"9f5215dd": "availSupply()", +"9f5227c2": "confirmWithdrawal(address,string,uint256,string,address)", +"9f52b74e": "apt()", +"9f52f381": "startAllocation()", +"9f530cc9": "JACKPOT_CHANCE()", +"9f535821": "mint(uint256,uint256,string,uint8,bytes32,bytes32)", +"9f536edd": "setScore(address)", +"9f53e07b": "channelMaxSize()", +"9f544434": "sendFood(address,uint256)", +"9f548613": "MyUserToken(uint256,string,string)", +"9f549015": "Max_Mintable()", +"9f54c01c": "addProducer(bytes32,uint256,bytes1)", +"9f54c24f": "LogGive(address,uint256,string)", +"9f550293": "getTotalRaised()", +"9f55857d": "testBazMethod(uint32,bool)", +"9f55ecab": "currentVotingDate()", +"9f569ab4": "requestOfTime(address,uint256)", +"9f569e66": "sendTokensTo(address[],uint256[])", +"9f572048": "getCanvasByOwner(address)", +"9f5755ae": "announcement()", +"9f577c15": "setContractProvider(address)", +"9f57d16e": "getCurrentJackpot()", +"9f5892a7": "hash(string,uint256,uint256,address)", +"9f58d881": "executeOr(bytes32,bool)", +"9f591fa5": "deathData_v15()", +"9f59fc5a": "GetConsentDirectives()", +"9f5a5ff8": "Police_4()", +"9f5a851f": "configure(uint256,uint256,uint256,uint256,uint8,address)", +"9f5a9b7c": "getTotalBurnt()", +"9f5ac8f7": "creator(bytes32)", +"9f5b1d2c": "GITHUB_LINK()", +"9f5bd866": "setNodalblockURL(string)", +"9f5c11c4": "two_card()", +"9f5c671e": "MultipleErrorsContract()", +"9f5ce849": "CNT_Token()", +"9f5cfe03": "roundsCount()", +"9f5f0520": "myVault()", +"9f5f0826": "_bonusToPartners(uint256)", +"9f5f7c7f": "tokenSplit(address,address,address,uint256)", +"9f5ff50a": "calcTokens(uint256,uint256,uint256)", +"9f614b61": "addTitleTransfer(string,string,string)", +"9f6163ee": "lastBlock_v4()", +"9f621075": "ICO_AllowPayment()", +"9f624701": "DZONetwork()", +"9f6264d3": "setArray(bytes32,bytes32[])", +"9f62e202": "CrowdSale_AssignOwnership(address)", +"9f637851": "endICODate()", +"9f63f5c3": "approveLoan(address,uint256)", +"9f64b6fb": "sendAffiliateValue(uint256,address)", +"9f654dd2": "sellTokensIco()", +"9f659296": "createCardForAcquiredPlayers(uint256[],address)", +"9f65f242": "Itube()", +"9f665e1a": "offerAccepted(address,uint256)", +"9f668bba": "getGameIds()", +"9f674147": "accruedBonus(uint256,uint256)", +"9f674eb3": "myAccessLevel()", +"9f678cca": "drip()", +"9f6822b4": "startEscrow(bytes20,address,uint256)", +"9f684a0d": "disableATMExchange()", +"9f69b5a0": "updateEscrow(uint64,uint256,uint256)", +"9f6a4fbe": "CyteCoinERC20Token()", +"9f6b4cce": "BetPlaced(address,uint8,uint256)", +"9f6bd2a9": "isArbitrator(address)", +"9f6c20f6": "MRC(uint256,string,string)", +"9f6c3dbd": "join(address,address,uint256)", +"9f6dcd9d": "ETHtoZCOrate()", +"9f6e3456": "SOPHIYA()", +"9f6e4bb5": "weiAllowedToReceive(uint256,address)", +"9f6f99ee": "updateAPIPublicKey(bytes)", +"9f6fb2ba": "createRichContract(string)", +"9f6ff2e1": "EInvoicingRegistry()", +"9f70c3dc": "doWithdraw(address,address,uint256)", +"9f70db12": "removeEmployee(address,address)", +"9f727c27": "reclaimEther()", +"9f73bef1": "getSubjectsCount()", +"9f73dbc0": "getCurrTeamSizes()", +"9f7496ec": "_firstUnlockAmmount()", +"9f753df6": "MELON_BASE_UNIT()", +"9f75ccc8": "onSuccess()", +"9f75e990": "ReceivedCall()", +"9f7623b8": "sign(address,address)", +"9f769807": "setTokenState(address)", +"9f77920c": "Revoke(address)", +"9f789a0c": "setSchellingRoundDetails(uint256,uint256,uint256)", +"9f7904af": "available_with_bonus()", +"9f7a2ef5": "TEAMmint()", +"9f7a53a1": "sendBountyBalance(address,uint256)", +"9f7b0fc8": "getParent(address,uint256)", +"9f7b4579": "create(uint256,uint256)", +"9f7b967e": "SampleERC677Token(address,uint256)", +"9f7ba828": "getTokenToEthMakerOrderIds(address)", +"9f7c8851": "otherSupply()", +"9f7c94aa": "payoutWinners()", +"9f7d9f62": "deprecateDefenceSubtype(uint8)", +"9f7d9f92": "AggiungiMiner(address,bool)", +"9f7e03cc": "deposit70Percent()", +"9f7e1fed": "Lock(bytes)", +"9f7ed5b8": "startTimeTLP1()", +"9f7f0784": "appVersionListAt(bytes32,uint256)", +"9f7f2bd1": "createDog(uint256,address)", +"9f7f760c": "SimpleDice()", +"9f7ff381": "COMPLETION_STATUS()", +"9f8049ea": "distributeELTCLarge(address[])", +"9f807962": "buyMorties()", +"9f80d1b2": "presaleGoing()", +"9f810510": "ZONTEX()", +"9f8106cf": "transferAllUnsoldTokens(address)", +"9f819b13": "updateFunders(address,bytes32,string)", +"9f81c4d6": "bitcoingo()", +"9f83008a": "teamReserveWallet()", +"9f839d22": "getOptionPair(address,uint256,address,uint256,uint256)", +"9f853717": "duplicates(uint256)", +"9f855bd5": "shipLocation(uint16,uint16,address)", +"9f856de5": "doPurchase()", +"9f871242": "computeTokenAmount(uint256)", +"9f8743f7": "getRound()", +"9f87acd0": "exec(bytes32,bytes32,uint256)", +"9f87f419": "closeTierAddition()", +"9f881e0b": "MobSquads()", +"9f881f46": "checkPassed(address)", +"9f8970dd": "bountyTokensAccount()", +"9f8a13d7": "isActive(address)", +"9f8abede": "fixPermission(address,address,uint8,bool)", +"9f8adeb8": "givecandyto()", +"9f8ae5d3": "roundFourTime()", +"9f8aef2b": "ERC721Token(string,string)", +"9f8c45cf": "getQuestionDetails(uint256)", +"9f8c7c4c": "insertSums(uint256)", +"9f8e8209": "Cillionaire()", +"9f8f0dc3": "test_twoValidEqBool()", +"9f8f4c45": "developerPctX10()", +"9f8f4fb5": "withdrawAcquisitionsToken()", +"9f8f9b8e": "SetEvaluate(uint256[],uint8,uint64[])", +"9f8ff91d": "getSponsorFee()", +"9f90279e": "f_priv()", +"9f903ff6": "setEmitter(address)", +"9f90688a": "SmartCityToken(address,uint256)", +"9f912d25": "abort(uint16)", +"9f915aca": "Tier_Starter()", +"9f91d145": "draftNewCardWithReferrer(address)", +"9f923388": "secondStageTokensSold()", +"9f9248c7": "DepositInterest(uint256,address,uint256,uint256)", +"9f927be7": "getNextCall(uint256)", +"9f941f69": "getDesignatedReportingEndTime()", +"9f943039": "Ethershares()", +"9f94d684": "irreducibleOf(address)", +"9f94fb7a": "endAtkBoss()", +"9f95de64": "transferToGrant(uint256,uint256)", +"9f961c5a": "salesPipe()", +"9f963c4e": "periodPercent()", +"9f96de0f": "getResourceCount()", +"9f9727ce": "QuotaManager(address)", +"9f977b21": "getBob(uint256)", +"9f97a024": "testEscapedQuoteInString()", +"9f97d937": "start_declaration()", +"9f97fdbb": "setDonationReceiver(address)", +"9f9827fa": "adviserPart()", +"9f98985d": "endGame(uint256,uint256)", +"9f98a45a": "fillOptionOrder(address[3],uint256[3],uint256[2],address,bool,uint96,uint8,bytes32[2])", +"9f98df30": "give(address[],uint256)", +"9f98e0f3": "addMerchant(address,string,string)", +"9f9936e7": "BullToken()", +"9f9938fa": "SILALAHI()", +"9f9a9b63": "getCategoryLength(bytes4)", +"9f9a9b7d": "NDUXBase()", +"9f9ae633": "LademiA()", +"9f9b1048": "holderExists(address)", +"9f9b3d98": "softcap2Reached()", +"9f9b4c9d": "Unhalted(uint256)", +"9f9ea29d": "decodeLock(bytes)", +"9f9eac67": "ChangeName(string)", +"9f9f1fbe": "getRegionTax(uint16)", +"9f9f83dd": "remainingIssuableSynths(address,bytes4)", +"9f9fb968": "getDeposit(uint256)", +"9f9fe6bb": "acceptProvider(address)", +"9fa0f763": "buyDrugs()", +"9fa0fc4c": "pgoVault()", +"9fa2526f": "offline()", +"9fa45fa6": "sellMyStake()", +"9fa46754": "releaseBonus(address,uint256)", +"9fa4b6cb": "BetDex()", +"9fa50ab2": "voteDescription()", +"9fa5adca": "buyP3D(uint256)", +"9fa5df9c": "decreaseAllowed(address,uint256)", +"9fa5e5d5": "setARKowner(address)", +"9fa6a6e3": "current()", +"9fa6f886": "NewParticipant(address,uint256,uint256,uint256)", +"9fa778d8": "UECToken()", +"9fa77b20": "reserveOf(address)", +"9fa80c6e": "rewardDistributionEnd()", +"9fa8e5a0": "SetEvaluate(uint32,uint8,uint64)", +"9fa92f9d": "home()", +"9fa9440c": "BDAYSALE()", +"9fa9559c": "getLastYearOfInflation()", +"9fa95bfe": "_emitJobPosted(uint256,address,uint256,uint256,uint256,bytes32,bool)", +"9fa987d5": "curPosition()", +"9fa9b04c": "ADVISOR_ONE()", +"9faa3c91": "beta()", +"9fab63c7": "ICOBIDToken()", +"9fabf4da": "remainigTokens()", +"9fac68cb": "burn(uint256,bool)", +"9fac6ddc": "withdrawLeftoverWei()", +"9fac9abf": "icoHasEnded()", +"9faceee4": "MemeToken()", +"9fad2dcb": "setTaxInBps(uint256)", +"9fae8fd8": "GayBananaToken()", +"9faea9c6": "setUnavailableFlat()", +"9faec3c9": "adminWithdraw(address,uint256,address,address,bool,uint256,uint8,bytes32,bytes32,uint256)", +"9faec927": "withdrawChunk()", +"9faefe0c": "sendNow(uint256)", +"9faf52ee": "teamTwoVolume()", +"9faf6fb6": "removeAddress(bytes32)", +"9faf7000": "manualSend(address,uint256)", +"9fafcf72": "PersonaRegistry(address)", +"9fb03244": "softcapMainSale()", +"9fb03c7f": "countLayersGasLimit(uint256)", +"9fb14d9b": "getRemainingBytesTrailingZs(uint256,bytes)", +"9fb1b5fb": "setJackpotGuaranteed(uint256)", +"9fb25d9e": "LeaderMessage()", +"9fb31475": "refundable(bytes32)", +"9fb3b7dc": "_setWeights(uint256[])", +"9fb3d489": "cancelProposalByCreator(uint256)", +"9fb42b1f": "numRequests()", +"9fb4c63d": "assertEq21(bytes21,bytes21)", +"9fb4d1b0": "_getDepth(uint256)", +"9fb52b6e": "dividendsGetPaid(uint256)", +"9fb5bdb9": "registerAsSeller(address,string,string,string,string)", +"9fb632c1": "private_withdrawBankFunds(address,uint256)", +"9fb65754": "FishProxy(address,address)", +"9fb65968": "presaleTokensDistributed()", +"9fb69839": "getTransactionInformation(uint256)", +"9fb6c796": "mint(bytes32,uint256,string)", +"9fb755d7": "setHotWallet(address)", +"9fb8657b": "getNodes(string)", +"9fb876c0": "getAllOwnersClaimPriceOfCard(address)", +"9fb8dd1a": "getBaseLockPercent()", +"9fb95205": "getWithdrawSum()", +"9fba2578": "summaryData(address)", +"9fbc6a1a": "EtherHellHydrant()", +"9fbdcef0": "setauctionotherfree(uint256)", +"9fbf538f": "addApprovedBattle(address)", +"9fc04ce2": "setMaxReferrerTokens(uint256)", +"9fc18031": "getNodesBatch(bytes32,bytes32)", +"9fc18d4b": "migrateDisabled()", +"9fc1d0e7": "forcedTransfer(address,address,uint256)", +"9fc1ff30": "InooviToken()", +"9fc20f60": "priceForSaleAdvertisement()", +"9fc21eeb": "wdrawBfr()", +"9fc23a74": "totalContractsAvailable()", +"9fc3587a": "releaseSupply(uint256)", +"9fc39549": "removeInvestorList(address[])", +"9fc3b4e7": "checkQuorum(uint256)", +"9fc3e53a": "controlstampdissolution(bool,uint256)", +"9fc53f30": "getIdByHash(bytes32)", +"9fc5852e": "BytePeachCoin()", +"9fc5ce2a": "initialMint()", +"9fc6ceac": "SponsorsQty()", +"9fc6d585": "percentageRecipient2()", +"9fc71314": "KontolToken()", +"9fc71b31": "transferToken(uint256)", +"9fc75354": "isMasternodeOwner(address)", +"9fc7a200": "startNumber()", +"9fc880f4": "weiRaisedAfterDiscounts()", +"9fc89294": "productTypes(uint8)", +"9fc8ed76": "serviceAtIndex(uint256)", +"9fc9141d": "calculateHash(bytes8,uint256,uint32)", +"9fc91980": "JoailyToken(uint256,string,string)", +"9fc9278e": "returnAnyERC20Token(address,address,uint256)", +"9fc9ceb8": "HRWtoken(uint256,string,uint8,string,address)", +"9fc9d6c0": "FrannickToken()", +"9fcaa5ef": "extendMembership(uint256)", +"9fcb114c": "addSomeTokens(uint256)", +"9fcb29fc": "_assign(address,address,uint256)", +"9fcb7100": "approveAndCall(address,int256,bytes)", +"9fcbc6f1": "bitvimToken()", +"9fcbc738": "setIntermediate(address)", +"9fcc4767": "set_referral_fee(uint8)", +"9fcdec61": "buyPresale()", +"9fce2d80": "didCommit(bytes32,address)", +"9fce5c8e": "indexOf(address[],address)", +"9fce89a4": "intercrypto_recoverable()", +"9fcf11bb": "determineCurrentStage()", +"9fcf4115": "updateRoundEndTime(uint256)", +"9fcf89ee": "lastBlock_a13Hash_uint256()", +"9fd033ed": "isHolder(address,address)", +"9fd03ed8": "XENIA()", +"9fd0506d": "pauser()", +"9fd1bd1f": "changeSelfAddress(address)", +"9fd1e7f6": "purchaseTokensERC20(uint256)", +"9fd3ad34": "setFunds(address,uint256)", +"9fd4da40": "totalInitialSupply()", +"9fd4f7d1": "replaceWizard(address)", +"9fd52984": "burnAfterSoldAmount()", +"9fd547fb": "PayeeWithdrawCapital(address,uint256)", +"9fd55832": "BrancheProportionalCrowdsale(uint256,uint256)", +"9fd58182": "withdrawManagerIncome(bytes32)", +"9fd64fea": "findAuditor(address)", +"9fd6adb3": "unVote(uint256)", +"9fd6d285": "AirdropMined(address,uint256)", +"9fd6db12": "mintingEnabled()", +"9fd7ca8a": "getCurrentTrancheIdx(uint256)", +"9fd859ee": "disablePreminer(address,address,address)", +"9fd8914d": "GameAAAToken()", +"9fd8b4f1": "redirectToPurchase()", +"9fd8bfb3": "voteCandidateOne()", +"9fd8c361": "CHECKgamberOne()", +"9fda3675": "MYYG()", +"9fda5ad2": "confirmedTimesByOwners()", +"9fda6271": "setElectionInfo(uint256,uint256,uint256)", +"9fdb35e7": "retriggerDrawOnOraclizeError()", +"9fdc0ea6": "getDirectoryLength()", +"9fdc3255": "_permittedPartnerTranferValue(address,uint256)", +"9fdc4d13": "isBuyable(string)", +"9fdc53b1": "registerLoanReplace(address,uint256)", +"9fdd32cd": "_drawFailure(uint32,uint8,string)", +"9fdd983f": "setAmount(uint256,uint256,uint256,uint256)", +"9fddd5a7": "SeedTestToken()", +"9fde4ef8": "winningOption()", +"9fdeeb5e": "teamVestingContractAddress()", +"9fdf057f": "setMiningToken(address)", +"9fdf9625": "seizeForWork(address,address,uint256,bool)", +"9fe005e8": "horseShoeNotForSale(uint256)", +"9fe03c59": "PayForPrivKey(address)", +"9fe14580": "BONUS_TIER_1_LIMIT()", +"9fe17cc2": "icoContractAddress()", +"9fe21fc4": "depositAndInitiate(uint256,bytes32,address,uint256)", +"9fe304a0": "catch_the_thief(address)", +"9fe34d9f": "isAllowedUser(address)", +"9fe39d85": "CHINESE_EXCHANGE_1()", +"9fe4712d": "schedule(address,bytes,uint256[8],uint256)", +"9fe4b663": "buyTokensInternal(address,uint256,string)", +"9fe5e868": "NewWallets(address,address)", +"9fe634b9": "getReleaseAuctionEndTime(uint256)", +"9fe6999a": "tokensFor1EthP5()", +"9fe72acd": "airDropsClaimed()", +"9fe7ac12": "removeBool(bytes32)", +"9fe7ba47": "updateFirstUnionIds(bytes32,bytes32)", +"9fe802f1": "transferEx(address,uint256)", +"9fe81f52": "changeTimeLimitMinutes(uint256)", +"9fe93231": "ICOEndedSuccessfuly(uint256,uint256)", +"9fe9bde0": "tripleRoomMin()", +"9fe9f623": "setTransferEnabled(bool)", +"9fe9fc1a": "SoldBlock(uint256,uint256,uint256,uint256,uint256,address)", +"9feb8d23": "amendClaim(uint8,uint8,uint8)", +"9fec4ac4": "SputnikPresale(address)", +"9fec8e3b": "addToWhiteListMultiple(address[])", +"9fec8e96": "claimedAmounts(address,address,uint256,address)", +"9fecb69f": "finishGame()", +"9fecf214": "XChain(uint256,string,string)", +"9fed35a6": "createBulkContributions(address[],uint256[])", +"9fed39c5": "numWhitelistedInvestors()", +"9feda172": "totalRice()", +"9fedb749": "setTeam(uint256,string)", +"9fee14ae": "getAllot(bytes32,uint8,uint8)", +"9fee597b": "extractEther()", +"9fef0ae1": "BetherFund()", +"9fef26ce": "buyTokens(address,uint256,string)", +"9fef93f8": "buyKey(uint256)", +"9ff00adc": "betOnOddEven(bool)", +"9ff031ce": "createEscrow(uint256,uint256,uint256,address,address)", +"9ff12bba": "removeContractMiniGame(address)", +"9ff1b56f": "lockInTime2()", +"9ff25fa4": "InitialDateChange(uint256,uint256)", +"9ff32b18": "grantAllowanceProxyAccess(address)", +"9ff33fd1": "getByInternalId(uint256)", +"9ff34878": "IPTVcontract()", +"9ff3487f": "ConsumerRemoval(address)", +"9ff36b54": "isClientPayed(uint256,address)", +"9ff390c1": "currentTotalBuyin()", +"9ff394a8": "goShort()", +"9ff4125a": "ICOendTime()", +"9ff47485": "isBetPossible()", +"9ff512fa": "getTransactionDetail(uint256)", +"9ff61487": "myBackerToken()", +"9ff652cb": "setToContractAddr(address)", +"9ff71ccb": "modifyCategory(uint256,string,string)", +"9ff7422d": "SurgeTestToken()", +"9ff7971b": "setWeiPerToken(uint256)", +"9ff8c63f": "issueMaxSynths(bytes4)", +"9ff9007d": "lastweek_winner1()", +"9ff93088": "settleGame(uint256,uint256)", +"9ffa0711": "CashOut(uint256)", +"9ffa43ce": "buyFST(address)", +"9ffaf32e": "resourceDelete(address,bytes4)", +"9ffb2ed5": "showRewards(address)", +"9ffbb57f": "SongTokenAdded(address,bool)", +"9ffc981f": "getDepositOwner(address)", +"9ffcc4c3": "getPayoutCumulativeInterval()", +"9ffd1c10": "TrueFlipICO(address,address,address,address,address,uint256)", +"9ffdb65a": "validateName(string)", +"9ffea547": "_purchaseOneUnitInStock(uint256)", +"9fff19ef": "_setValidatorWrotePart(uint256,address)", +"9fff37e0": "JACKPOT_SIZE()", +"a000812c": "Y1_lockedTokenReleaseTime()", +"a000aeb7": "weiReceived()", +"a0013419": "ShanxiCoin()", +"a001ecdd": "feePercentage()", +"a001ef87": "TestOneToken(string,uint8,string)", +"a00223ec": "_recordFirstClaimTimestamp(uint256)", +"a002b179": "getCandidateForApoderado(bytes32)", +"a003371e": "PreICOEarlyDays()", +"a003651d": "getNumberOfChoices(bytes32)", +"a0041286": "changeURL(string)", +"a00413bd": "resetReportTimestamp()", +"a004737a": "startPrePreIco(uint256)", +"a004ee5a": "isCustodianOf(address,address)", +"a00545b2": "claimPrize(address,uint16)", +"a00553a5": "WinnerIndex(uint256)", +"a005b87b": "NullMapTest()", +"a006b0e2": "_regName(bytes32)", +"a006e0e5": "phaseTwoLimit()", +"a0071552": "sellItem(uint256,uint256,uint256,uint256)", +"a007bc45": "getRateStages(uint256)", +"a008d288": "Pethreon(uint256)", +"a008d893": "isReferee(address)", +"a008f5eb": "_isNativeToErcBridge(address)", +"a0099b60": "deltaEFunc(uint256,uint256,uint256,uint256,uint256,uint256)", +"a00a3440": "mainSale1Limit()", +"a00a7a6d": "determineNewRoundMostInviter(uint256,uint256)", +"a00aede9": "scheduleCall(uint256,address)", +"a00afaa0": "ADMIN_GET_FEE()", +"a00b043e": "bonusTokenVault()", +"a00b603c": "getDNI()", +"a00c0a28": "Log2(string,uint256,uint256)", +"a00c3e72": "ExtendLife()", +"a00c9374": "afterSaleMinting(uint256)", +"a00ce377": "getIsContractValid()", +"a00ce6a5": "mintForReportingParticipant(address,uint256)", +"a00d7740": "setCUSDAddress(address)", +"a00d7b27": "myFirstHelloWorld()", +"a00dc9dd": "changesp1(address)", +"a00ddad1": "verifyBalance(address)", +"a00ec993": "setStarRate(uint256)", +"a00ee946": "existAccount(uint256)", +"a00f198a": "confirmOrder()", +"a00f64d6": "_soldOutsidePMZ()", +"a00f77e1": "getMemInvestor(address)", +"a00fd3c8": "register(uint256,string)", +"a00fd7c8": "getPayOut()", +"a00fe86b": "SaleAborted(uint256)", +"a00fff6f": "pendingManager()", +"a0109c9f": "incrementFee()", +"a0111086": "ParentFee()", +"a0113f18": "isCrowdsaleFull(address,bytes32)", +"a0129b00": "redeemSurplusETH()", +"a01317cb": "BlockHipo()", +"a0132df2": "validationTime(address)", +"a0135b2b": "updatefee(uint256)", +"a0135d04": "seSigner(address)", +"a013ab77": "isBuilt(uint256)", +"a013ad54": "BONUS_DURATION()", +"a013e4d0": "GouShiTokenFunc()", +"a014b9bd": "addReferralOf(address,address)", +"a015cb10": "claimOwnerEth(uint256)", +"a01701dc": "capPerAddress()", +"a01729a4": "communityCliff()", +"a0175360": "Approval(address,address,address,uint256)", +"a0175b96": "changeAllCosigners(uint256,address[],uint256[3],bytes,bytes,bytes)", +"a0179949": "feeAccount1()", +"a017ed35": "G12Coin(uint256,string,uint8,string)", +"a0187f91": "DataExternalValidation(address)", +"a0189345": "outOfLimitAmount()", +"a018f2b2": "delegateProxyAssert(address,bytes)", +"a0193ff9": "allowed_contract()", +"a01a3a07": "LogTicket(uint256,address,uint256)", +"a01a478c": "getEnemyCombinationOfAddress(address,address)", +"a01a4cfa": "getMyInstancesOfAPackage(uint256)", +"a01b0c27": "getRegisteredContract(uint256,uint256)", +"a01bc729": "monster_attack(uint256)", +"a01bc8f6": "setdaily(uint256,uint256)", +"a01bfa79": "adminWithdrawBCEOPreSale()", +"a01c144e": "addPriceChange(uint256,uint256)", +"a01c489d": "setMaxFeeTrade(uint256)", +"a01c62f7": "isTransferLocked()", +"a01cb43d": "WithdrawFee(uint256)", +"a01de7ae": "BFToken()", +"a01e1a21": "setPendingReserveData(address,uint256,address)", +"a01e5490": "isUnconfirmedGblock(bytes32)", +"a01eacc2": "Aerosyn()", +"a01fdbef": "approvePullRequest(bytes32)", +"a0214c1c": "mintClose()", +"a02172d3": "getAssData(uint256)", +"a0218b66": "getAccountAmount(uint256)", +"a021d76d": "deleteIssuer(uint256)", +"a022ac81": "test3Args()", +"a022c15e": "getTaskReward(bytes32)", +"a022da29": "increaseLoanOnBehalfOfRecurse(address,address,bytes32,uint256,uint256)", +"a022e283": "APOLLOCOIN_COMPANY_AMOUNT()", +"a0234a91": "supplyLockedA()", +"a023d4a7": "Redicon()", +"a023e7d3": "updateTrustRankAfterStoryExpiry(bytes12)", +"a023ea47": "burnAdminTokens()", +"a024284d": "participantsForCustomSale(uint256,address)", +"a024ea16": "MAX_BOUNTY_ALLOCATED_TOKENS()", +"a025bcc3": "calculateFee(bool,bool,uint256,uint256)", +"a026348c": "pitboss()", +"a0263a5a": "addgodaddress(address,address)", +"a0268aea": "fcomToken()", +"a026946d": "ieth()", +"a026d7c4": "SunflowerToken()", +"a026da8c": "teamClaim(uint256)", +"a0270dbc": "resolve(uint8)", +"a02745af": "setarg_2_input(uint256)", +"a0275c05": "appendStock(uint256)", +"a02853ef": "BitcoinExchange()", +"a028554e": "setInitialMintingPowerOf(uint256)", +"a0285c01": "initiateChange(bytes32,address[])", +"a028aa1b": "distributeVariable(address[],uint256[])", +"a028d749": "caculateFee(address,uint256,uint8)", +"a028e63c": "setName(uint256,bytes32,bytes32)", +"a02a338a": "tokensPerOneETH()", +"a02a34cd": "skinOfAccountById(address,uint256)", +"a02b114c": "setArray(bytes32,address[])", +"a02b161e": "unregister(uint256)", +"a02b1a51": "getPaid(bytes32)", +"a02b7fbe": "MANAGEMENT_TEAM_SUPPLY_LIMIT()", +"a02b9aac": "getPaymentDataByAddress(address)", +"a02c40e1": "qbxSourceToken()", +"a02c4b97": "holdAddress5()", +"a02c5279": "testIntegerKeyValue()", +"a02cf937": "feePct()", +"a02d2376": "SubContract()", +"a02e98df": "getAdd(bytes32)", +"a0305398": "getOtherMapValue(uint256)", +"a030b8e6": "restartsys()", +"a03189b3": "devPayed()", +"a03243cf": "getMinimumTribute()", +"a0326040": "weekPot()", +"a0326fae": "_removeFromList(address,uint256)", +"a033fcd4": "collectFees(address,uint256)", +"a0340625": "unfrozen()", +"a03435d1": "authorizerAddress()", +"a0345fca": "finalize(bytes)", +"a034b6cb": "vote(uint256,uint256,uint256,string)", +"a0354921": "setSTMPPrice(uint256)", +"a0355eca": "setTime(uint256,uint256)", +"a0355f4e": "decline(uint256)", +"a035b1fe": "price()", +"a036f0f8": "getUsableXPA(address)", +"a0376dfe": "getAskByUserID(uint32)", +"a0378730": "addReceivers(address[],uint256[])", +"a0385e1c": "superTransferFrom(address,address,uint256)", +"a038af35": "GetChallengeBetsInformation(uint256)", +"a0392897": "_decreaseApproval(address,address,uint256)", +"a039e3c7": "testSetNotTransferable()", +"a03b1ea9": "_getFee(uint256,uint256)", +"a03b66e5": "ZilleriumPresale()", +"a03c5832": "getPermissionParam(address,address,bytes32,uint256)", +"a03cc0b2": "setExchangeToken(address)", +"a03d0f06": "lockAccount(address,bool)", +"a03df051": "rentedLand()", +"a03eb806": "recoverAddressFromSignature(bytes32,uint256,address,address,uint256,address,address,uint256,bytes)", +"a03f254f": "getWebsocketUri()", +"a03f633a": "resetListing(bytes32)", +"a03fa7e3": "transferTo(address)", +"a03fb4c0": "makeTradeable()", +"a0417c9a": "updateAsset(uint256,string,uint256,uint256)", +"a0422d02": "COLOR_NOT_AVAILABLE()", +"a0422d31": "getApiById(uint256)", +"a0426fb2": "preSaleEnded()", +"a0428bbc": "balancesStaticoin(address)", +"a042b9c1": "newComment(bytes32,bytes32,string)", +"a04369f8": "addBoosterQuest(address)", +"a0437f63": "rewardBounty(address,uint256)", +"a043bb16": "tokensBoughtInBonusProgram()", +"a0440426": "purchaseProduct(uint256,uint256)", +"a044b070": "a(address,uint256)", +"a0452bfb": "dividendFee_()", +"a045fdff": "scheduleCall(address,bytes)", +"a0469b02": "inputToDigit(uint256)", +"a046c5f6": "NewStaticAdr(address)", +"a0472d6c": "blocksInADay()", +"a0489ac2": "draining()", +"a0493834": "unconfirmedSum()", +"a04a0908": "execute(address,bytes,uint256)", +"a04a59cc": "randMod()", +"a04a6ac8": "auctionEndPrice()", +"a04a7b1f": "getPoolMinStakeQspWei(uint256)", +"a04a85c0": "checkFrozen(address)", +"a04b3c2d": "mine_jade_ex(uint256)", +"a04bd02f": "getIsStartable(uint256)", +"a04cc350": "_addDefaultOperatorByTranche(bytes32,address)", +"a04ce2c5": "setArrayIndexValue(bytes32,uint256,uint256)", +"a04d4c60": "getDataColla_001_001(string)", +"a04da725": "SEXNToken()", +"a04e34bc": "weiAllowedToReceive(uint256,uint256,uint256,uint256)", +"a04f7bd1": "MMONToken()", +"a04fce5b": "MINDBODYToken()", +"a050975b": "requestReclaimContract(address)", +"a050d07d": "getNumWizards()", +"a05190f4": "BOT_ELEMENT_2()", +"a051b6b1": "phase_5_rate()", +"a052c595": "addTrustedPartner(address,string,string)", +"a052eae4": "writeStuff(uint256,int256,uint256)", +"a052f024": "addDonator(address)", +"a053ce1f": "referralRate()", +"a053eb9d": "OPERATION_STAKE()", +"a0548d2f": "redistributeLosingReputation()", +"a054cbea": "isPlatform()", +"a054d3ef": "checkWithdrawal(address,uint256,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"a0557818": "getSireId(uint256)", +"a055d455": "run(uint40,uint256,address)", +"a055fe64": "_projectCommitNew(address)", +"a056469a": "extractFeeLength()", +"a0566330": "LJCJ()", +"a05693c6": "clearSmet()", +"a0572fda": "titleIds(uint256)", +"a0577762": "changeTechAccountAddress(address,address)", +"a0579801": "icoStoppedManually()", +"a057dade": "blackListUser(address,address)", +"a05801b7": "metadataOfTokenByIndex(uint256)", +"a05809ff": "calculateTotalPayoutAmount()", +"a058ce51": "DigiCash1()", +"a059ffa6": "createNewTourament(uint256[])", +"a05a1218": "triggerStealManually2(string)", +"a05a70a7": "QTLToken(address)", +"a05b8ed8": "_execute(bytes32)", +"a05bba46": "getAllDepositorsCount()", +"a05c47ca": "ico2Max()", +"a05c7bda": "AuthorizeToTransfer(address)", +"a05d03fd": "currentSale()", +"a05d068d": "foundationTokensVested()", +"a05e1db7": "getBuyerfee()", +"a05e3bb0": "setBasicBallotsPer30Days(uint256)", +"a05e822a": "howManyOwners()", +"a05fc749": "CoinLotto(address)", +"a05fccef": "transferMultiple(address[],uint256[])", +"a0605a79": "ZTTBToken(uint256,string,string,uint8)", +"a060d498": "KillSwitchEngaged(address)", +"a060ecce": "checkPosition1(address,address,uint256)", +"a0617ad0": "totalMaxSupply()", +"a061eba0": "proposeVersion(address)", +"a0626939": "setFoundersTokensReserve(uint256)", +"a06285ed": "CharityInProgressSupply()", +"a062d5fe": "TOTAL_SATOSHI()", +"a063dae8": "equal(int256[],int256[],string)", +"a0641288": "redeemableBalance(address)", +"a064481e": "BokkyPooBahWuzHere()", +"a065a2bf": "distributeFAITH(address[],uint256,uint256)", +"a0660943": "computeSlaves(address,address)", +"a067412b": "assignInitialAddresses(address[])", +"a0684251": "remainder()", +"a068e8d3": "convict(uint256,uint256,uint256,uint256)", +"a068edb5": "determineOutcome()", +"a0695f24": "assertBalances()", +"a0695fc2": "startIcoOne()", +"a06ac637": "listUserRecasts(address,uint256,bool)", +"a06aceb2": "ATCController()", +"a06b7eb0": "decreaseLockedAmount(address,uint256)", +"a06c5a24": "monthlyPrice()", +"a06caae8": "TransactionSettled(uint256,uint256,uint256)", +"a06cab79": "Registrar(address,bytes32)", +"a06ced75": "RESERVE_LOCK_TIME()", +"a06d083c": "credit()", +"a06db7dc": "gracePeriod()", +"a06dd6dc": "emergencyFlush()", +"a06de4d9": "rand8(uint256,uint8,uint8)", +"a06e09f1": "PrivateSale(address)", +"a06e58ac": "isResolvedForComplainant(uint256)", +"a06ef4f2": "icoAmountBonus3()", +"a0712c3d": "feesRateTeam()", +"a0712d68": "mint(uint256)", +"a07245fd": "getHtlcPaymentBlock(bytes32,bytes32)", +"a0726b72": "getPresaleRaisedAmount()", +"a072f02b": "idvRegistry()", +"a0742666": "isParticipant(address,address)", +"a074d5ee": "unClaimedEther()", +"a0759e14": "setEmontRewards(uint256,uint256)", +"a075e164": "setup(uint256,uint256,uint256,bool)", +"a076da7a": "notifyExecuteSellOrder(uint256,uint256)", +"a076e223": "Declaration()", +"a077321c": "restrictUntil()", +"a0775baf": "AUTBToken()", +"a0776a59": "getTokenSupply(string)", +"a07778ec": "icoBonus3EndDate()", +"a077b298": "restrictions()", +"a077c657": "giveRightVote(address)", +"a078f737": "hasUserRole(address,uint8)", +"a0790cb7": "setFreezed(address,bool)", +"a0796236": "rejectWithdrawal(address)", +"a07b206f": "totalWhiteListed()", +"a07b2461": "proveIt(address,string)", +"a07c132b": "setPrevOwner(address)", +"a07c4fcf": "getTapRemaining()", +"a07c765f": "END_TIMESTAMP()", +"a07c7ce4": "burnable()", +"a07c8ed9": "changeName(bytes,bytes)", +"a07c9156": "UpdateWhiteListImplementation(bool)", +"a07da887": "deploy(address,uint256,uint8,address,uint256[])", +"a07daa65": "newRequest(uint256)", +"a07ead73": "setColdWallet1(address)", +"a07f0a98": "DEFROST_AFTER_MONTHS()", +"a07f3a56": "isAttended(address)", +"a07f3bb0": "UpgradeableStandard23TokenMock(address,uint256,bytes32,bytes32,uint256)", +"a07f5f84": "beneficiary3()", +"a07f8f19": "isCrowdSaleFinished()", +"a07fc020": "moveToRST()", +"a080249b": "BonusPoolSupply()", +"a08038be": "setPreferredCurrency(bytes4)", +"a0807404": "setBZxOracle(address)", +"a080c8ba": "getLamboModel(uint256)", +"a081fc19": "deathData_f6()", +"a082022e": "Sell(address,address,uint256,uint256)", +"a0821be3": "availableBalance(address)", +"a0823111": "removeAffiliate(address,bytes32)", +"a08299f1": "divisionby0(uint256)", +"a082c86e": "DEADLINE()", +"a0831fdb": "BNBB(uint256,string,uint8,string)", +"a0836e28": "getaddressret(address,address)", +"a083cb48": "TokenBase(uint256,string,string)", +"a0844bb5": "_computeRarityBonus(uint256,uint256)", +"a0847a95": "updateRoundBalance(uint256)", +"a084af95": "Trust(address[],uint256,address,bytes)", +"a084ee76": "removeReturnAgent(address)", +"a0851928": "convert_valuation_to_art(uint256,uint256)", +"a0852bbd": "SynTokenAddress()", +"a0859845": "emitPreferredCurrencyChanged(address,bytes4)", +"a0876445": "artworkCount()", +"a0877304": "minSale()", +"a08783bf": "Moviecoin()", +"a087ac0c": "perDeadLine()", +"a087ae89": "calculatePeriodsCountAndNewTime(uint256,uint256)", +"a0893ef2": "releaseSupply()", +"a0895ec1": "LogUnfrozenTokens(string,address,uint256)", +"a089feea": "kill_switch()", +"a08aa298": "NewSupplyAdjuster(address)", +"a08b1447": "presaleAmountETH()", +"a08b3367": "EC()", +"a08c0908": "getFiatTransaction(string,uint256)", +"a08d3f83": "Etheropt(uint256,string,uint256,uint256,bytes32,address,int256[])", +"a08df770": "changeRecoveryFromRecovery(address)", +"a08e3f0e": "restTokensMoved()", +"a08e8b36": "totalFunctions()", +"a08ed1cb": "initUnstake()", +"a08f1b09": "getArrUintField2()", +"a08f8428": "BasicTokenWrapper(address)", +"a08fcabb": "setUint(bytes4,uint256)", +"a09037a9": "totalContracts()", +"a09107e1": "only6()", +"a0922e15": "calcTransferFee(uint256)", +"a0927a6a": "authorizedPayments(uint256)", +"a0929cda": "salvageTokensFromContract(address,address,uint256)", +"a092ae25": "getMyAllowance()", +"a094a031": "isReady()", +"a0954a49": "changeEarnings(uint256)", +"a09635b0": "_transferToICAP(uint256,bytes32,uint256,string,uint256)", +"a09686c4": "getRoundsCount()", +"a096ea1b": "bltRetainedAcc()", +"a0979332": "Bitcoineum()", +"a098a04b": "getRandomAnimalId()", +"a0996799": "getMyBulls()", +"a0997b66": "ROLE_RBAC_ADMIN()", +"a0999436": "ESOPAddress()", +"a099ad85": "workingState()", +"a099d079": "getEarlyIncomeByAddress(address)", +"a099e6be": "updateTokenExchangeRatio(uint256)", +"a09a05e0": "AllocateUnsoldTokens(address,address,uint256)", +"a09a1e22": "dealSellContract(uint256,string,uint256,uint256,string)", +"a09ae0aa": "absDiff(uint256,uint256)", +"a09b39ae": "WorldCup(string,string,uint256,uint256,string)", +"a09b7e2b": "totalPresaleBase()", +"a09cca93": "ownerTransferOwnership(address)", +"a09cec67": "_setData(uint256,uint256,uint256)", +"a09d4240": "UacCrowdsale(address,address,address,address,address,address,address,address[])", +"a09d4ae4": "returnTempTokens(address)", +"a09d9c09": "setTransferRate(address,int16)", +"a09ddd4f": "setSaleAgent(address,bool)", +"a09ddf4e": "getCurrentRgb(address)", +"a09de28d": "approveAndCall(address,uint256,bytes,address[],uint256[])", +"a09e3d0a": "getChildCount(bytes32)", +"a09e9c1d": "startBidding(uint256)", +"a09f6691": "LogGetMoneyBack(address,uint256,string)", +"a09f8659": "newConflictRes()", +"a09fb22e": "updateReputation(string,uint256,uint256,string,string,address)", +"a0a0d331": "COMPANY_WALLET()", +"a0a1082a": "createCustomVUP(address,uint256)", +"a0a2b573": "setTimestamp(uint256)", +"a0a2c11d": "ListValSince(uint256)", +"a0a2f629": "setReferralId(uint256,address)", +"a0a337e2": "getSetupFunctions()", +"a0a3ec6d": "getDividentsFromShare(uint256)", +"a0a4cb6c": "reveralSupply()", +"a0a4d9df": "batchTransferORSB(address[],uint256)", +"a0a4f93b": "setGasused(uint256)", +"a0a5cd92": "OkapiToken()", +"a0a695fe": "registerTier1Users(address[])", +"a0a6e940": "finalizePresale()", +"a0a7131c": "test_twoValidAssertFalse()", +"a0a7299b": "feeInBps()", +"a0a76eb0": "charactersOf(address)", +"a0a7dc2e": "withdraw_1Completed()", +"a0a7e0f8": "GameCellCoin(uint256,string,uint8,string)", +"a0a8045e": "getEthUsdPrice()", +"a0a86de3": "PreSaleTokenSoldout()", +"a0a8e460": "contractVersion()", +"a0a95502": "reading_card_count()", +"a0a986f1": "price0()", +"a0aaa87f": "secondStageMinted()", +"a0ab2847": "tfg()", +"a0ab308c": "BidAskX()", +"a0ab7091": "_isCooldownReady(uint256,uint256)", +"a0ab9653": "execute(uint8[],bytes32[],bytes32[],address,uint256,bytes,address,uint256)", +"a0abdba0": "allocatorAddress()", +"a0ac47fe": "_ethereumToTokens(uint256)", +"a0ac5776": "claimBooty(uint256)", +"a0acb9dd": "getA(string)", +"a0ad04c0": "changePhaseToICO()", +"a0ad51a6": "KNOW()", +"a0aead4d": "getAssetCount()", +"a0af0127": "world(uint256,uint256,uint256)", +"a0af3252": "thirdCurrentAmount()", +"a0afd731": "dividendBalance(address)", +"a0afebbc": "emitContractAdded(address,address)", +"a0affbfd": "upgradeHGT(address)", +"a0b06190": "addOneUserIntoWhiteList(address)", +"a0b091e4": "sellMFCoins(uint256)", +"a0b1b385": "playerSetInput(address,uint256)", +"a0b1f668": "GetRandom_In52(uint256)", +"a0b28861": "createAndBuyAllAmountBuyEth(address,address,address,uint256,address,uint256)", +"a0b2995a": "GetParticipantRole(address,address)", +"a0b2becb": "getLastAcceptedProposals()", +"a0b31d58": "addPacksToNextPremiumSale(uint32[])", +"a0b3bef0": "NVBToken(uint256)", +"a0b4388a": "activateShip(uint32)", +"a0b43a4e": "getWinnerPot()", +"a0b45df2": "transferOwnershipAndToken(address)", +"a0b498a4": "issuedTokens(address)", +"a0b55095": "allGames(uint256)", +"a0b5cf5f": "changeResolverAllowancesDelegated(string,address[],uint256[],uint8,bytes32,bytes32,uint256)", +"a0b65332": "getProposalIdByIndex(uint256)", +"a0b70e87": "capTokens()", +"a0b76d49": "JToken()", +"a0b7967b": "getNextSequenceId()", +"a0b7dcb4": "_transferInternal(address,address,uint256,bytes,string)", +"a0b7ebbd": "isExistingPlayerInBattle(string,address)", +"a0b7f0f8": "updateContributorAddress(address,address)", +"a0b873f2": "updatePlatformFeePercentage(uint8)", +"a0b87d1e": "MuseumsChain()", +"a0b946f0": "calculateMatchWitnessHash(address[],uint256[])", +"a0b9e8d5": "getRaisedAmountOnEther()", +"a0b9f0e1": "checkPause()", +"a0bb233c": "changeFeeAndCheatWarrant(uint256,uint256)", +"a0bb7508": "_addSig(bytes32,address)", +"a0bc572b": "benefactor(uint256)", +"a0bcfc7f": "setBaseUri(string)", +"a0bd1ec1": "hodlerTransfer(address,uint256)", +"a0bd3c0f": "scheduleCall(address,bytes,bytes,uint256)", +"a0bdb04e": "tier1Start()", +"a0bdcd3a": "BCNewToken()", +"a0bde7e8": "getShareDistributionWithTimestamp(bytes32)", +"a0bde945": "buyCity(uint16)", +"a0be06f9": "adminFee()", +"a0be2d9d": "Inco(address)", +"a0bee465": "BrylliteToken(address,uint256)", +"a0befa94": "getStake(uint256,uint256)", +"a0bf0539": "_checkThreshold()", +"a0bf775f": "canTransferBefore(address)", +"a0c01e58": "divForPrice()", +"a0c07002": "ArcBlockToken()", +"a0c16fb6": "HuobiPoolToken()", +"a0c1ca34": "migrateIn(address,uint256)", +"a0c1e119": "unhaltFundraising()", +"a0c32df7": "TRMToken(address,string,string,uint256,uint256)", +"a0c354ea": "getSumAmountOfOpenDeals()", +"a0c3bc68": "setOverflowBounds(uint256,uint256)", +"a0c42ed1": "getPOOL_edit_12()", +"a0c567a2": "blackListActive()", +"a0c57eb4": "checkCrowdsaleState()", +"a0c642bd": "multisendFrom(address,address,address[],uint256[])", +"a0c66283": "ZEROCoin()", +"a0c66b43": "maxActiveCastle()", +"a0c6e65e": "getResourceBalance(uint16,address)", +"a0c73e7c": "HDAToken(uint256,string,string)", +"a0c86718": "assetOwnersIndexes()", +"a0c8ad10": "removeAuthorizedExternal(address,address)", +"a0c8c156": "emptyCart()", +"a0c8e0ff": "testCanSendEthToContractWhenCrowdsaleInProgress()", +"a0c95e24": "disableBuyingTime()", +"a0c96e43": "getCommissionTarget()", +"a0c97bce": "paySeller()", +"a0c99c51": "paymentInfo(address,string)", +"a0ca0a57": "backlogLength()", +"a0cce3d2": "getAssetIdCreator(uint256)", +"a0cde1f0": "finishCrowdCoin()", +"a0ce4ff8": "priya()", +"a0ce8a0e": "SingleSourceAuthority()", +"a0cecb3b": "findOutInterestByBank(uint256,uint256,uint256)", +"a0cf01d4": "MoneroGold()", +"a0cf17da": "amountFunded(bytes32,string,address)", +"a0cf8857": "setTransferFeeAbs(uint256)", +"a0cfbc1b": "getDeploytimeBlocktimeBlocknumber()", +"a0cfc196": "getNumWineryOperation(bytes32)", +"a0d045bc": "AppleToken()", +"a0d0b13d": "addBook(string,string,string,string)", +"a0d0be4f": "calculateValue(uint256,uint8)", +"a0d0ee3b": "buildTokenContract()", +"a0d121a9": "addPolicy(uint256,uint256)", +"a0d1de29": "sendSeedAndHash(bytes32,bytes32)", +"a0d1f9e9": "serviceIncreaseBalance(address,uint256)", +"a0d3253f": "spawn(uint32,address)", +"a0d39949": "_rewardUnnapprovers(address)", +"a0d46c87": "validateRequestParams(address[3],address,uint256[12],uint256,uint256)", +"a0d578f4": "isServerEnable(string)", +"a0d605c6": "addCertificationDocumentInternal(address,bytes32)", +"a0d63f7e": "setDistributionMinimum(uint16)", +"a0d7bb1b": "addReserve(address,bool)", +"a0d80e65": "internalNoter(uint256,uint256)", +"a0d81b21": "ConsentFile(address)", +"a0d87fc2": "burnFromOwner(address,uint256)", +"a0d8848c": "getTicketStartPrice()", +"a0d8ad85": "_updatePayment(uint256,address,uint256)", +"a0d8b4bd": "changePresaleDiscountPercentage(uint8)", +"a0d8b4e9": "ownerMintRate()", +"a0d8e231": "SmartpoolVersion()", +"a0d9669c": "test_invalidAddressNotZero()", +"a0da3236": "ActionMining(address,uint16)", +"a0da7d2e": "addressLocked(address)", +"a0db0a22": "right4(uint256)", +"a0db844f": "F2UPAY()", +"a0dbd8d6": "startBlockNumber_()", +"a0dbde9d": "logBase2(uint256,uint256,uint256)", +"a0dc6b74": "emergencyPay()", +"a0dce445": "nothingLib()", +"a0dd678b": "VCFToken()", +"a0ddb418": "currentKey()", +"a0dde02a": "AftabCoin()", +"a0df9538": "walletOwnerAddress()", +"a0dfc61f": "DICE_LOWER()", +"a0e06c8a": "weekPotHighscore()", +"a0e0c317": "getTradeOfferRecipient(uint256)", +"a0e1001e": "IiinoCoin(string,string,uint8,uint256,int256,uint256)", +"a0e16fed": "getFinalizationTime()", +"a0e1f42c": "addPurchaser(address)", +"a0e23ebd": "openAt()", +"a0e2abf7": "getFirstActiveGamble()", +"a0e4d7d4": "getManifestIdsByName(address,bytes32)", +"a0e5588a": "paymentAction(uint256,address,uint256)", +"a0e5bb69": "setPI_edit_17(string)", +"a0e5e821": "recordDealCancelReason(uint256,address,uint32,uint32,uint256,string)", +"a0e67e2b": "getOwners()", +"a0e6a44b": "getCustomerTxPaymentMCW(address,bytes32)", +"a0e7192e": "requestEthereumLastMarket(string,string)", +"a0e724d3": "ReserveKnown(bool,address,uint256,uint256)", +"a0e7b4dc": "lastAmountSent()", +"a0e8b6b0": "the_address_for_option_A()", +"a0e8d21f": "join(address,string,string,uint256)", +"a0e8ef3d": "SetUSDPerETH_byContract(uint256)", +"a0ea0ef9": "constructionStart()", +"a0ea83dd": "SetSummRew(uint256)", +"a0eaa5dd": "lastTokenIsTransferableNumber(address)", +"a0eb5dd1": "AIRDROP_TOKENS()", +"a0ec4e09": "getUltimateOutcomes(bytes32[])", +"a0ec7f89": "transferPresaleTokens()", +"a0ed4cff": "MiniMeToken(address,address,uint256,string,uint8,string,bool)", +"a0ed6707": "EtopayNetwork()", +"a0eda9f2": "_transferFee(address,uint256,string)", +"a0edc204": "noOfPhases()", +"a0edc671": "USDtoHAV(uint256)", +"a0edcd7a": "burnPercentage100m()", +"a0ee153e": "isOwnerOrApproved(uint256,address)", +"a0ef8647": "BlueToken()", +"a0ef91df": "withdrawEth()", +"a0efe255": "m_categoriesCount()", +"a0f029fc": "ContractorInterface(address,address,address)", +"a0f04c38": "getKittyPower(uint256)", +"a0f0e95f": "DDJBTC()", +"a0f15b87": "registryICAP()", +"a0f1665b": "PriceSet(uint256,uint256)", +"a0f1ba62": "isOpenDistributionSetup()", +"a0f24ea7": "getTotalTokens(uint256,uint256)", +"a0f4a9a9": "Challenge()", +"a0f4d3df": "getRandomForContract(uint256,uint256)", +"a0f52da0": "startMigration(address)", +"a0f561ca": "ExtractDepositTime(address)", +"a0f61310": "FakeRelay(bytes)", +"a0f72985": "PassToken()", +"a0f78572": "Leaderboard()", +"a0f7bbcd": "sendTokensToAdvisors(address)", +"a0f82817": "Max()", +"a0f8be8c": "startOf(uint8)", +"a0fa0fb4": "ConstructorTest(uint256,uint256)", +"a0fa930a": "Ethercoin()", +"a0faf6a1": "getPortion(uint256,uint256,address)", +"a0fb1497": "deleteDocument(uint256)", +"a0fb7f57": "GMET()", +"a0fc4994": "setX(int256)", +"a0fcd161": "depositToken(uint256,bytes32,uint256)", +"a0fe6202": "SHA256(string)", +"a0ff1705": "depositTokenFunction(address,uint256,address)", +"a0ffe7bb": "registerInNewMarketplace()", +"a0fffd5f": "rand(uint32,uint256)", +"a1007e68": "TokenAmountToPay()", +"a10132ad": "callbackGas()", +"a1013abb": "TOKENS_DISTRIBUTED()", +"a1017649": "updateWalletLock()", +"a101c2d3": "time_out()", +"a101f7cd": "bountyFee()", +"a1022294": "Guess(string)", +"a1029aff": "findTile(uint16,uint16,uint16)", +"a102e8a5": "addMeterpoint(int256,address,int256)", +"a103983c": "BitShopperToken()", +"a1049c06": "Zolox()", +"a104dcd4": "changeUpgradeAgent(address)", +"a104e5e1": "recordNewOwner(uint256,address)", +"a1057852": "addToken(address,uint256,string,string,string,string)", +"a106320a": "icoFinalized()", +"a1063d20": "addIntermediateAddress(address)", +"a106832b": "disableInitialAmbassadorStage()", +"a106dbc8": "participantsFor1stSale(address)", +"a106f0bf": "bonusAmtThreshold()", +"a107994e": "test_validProxyOwnershipTransfer()", +"a107ceb6": "affiliateUtility()", +"a10874d9": "SquirrelGims()", +"a1088571": "CEO()", +"a10889fa": "setVersion(uint32,uint32,uint32,string,string)", +"a10954fe": "reserveBalance()", +"a109a089": "addWalletAddress(address)", +"a109b8bd": "feesCal(address,uint256)", +"a10a7782": "defaultReputationReward()", +"a10b10f5": "setFriendsFingersWalletForCrowdsale(address,address)", +"a10b3ffd": "ALLOC_PARTNER()", +"a10bee85": "_transferFromWithReference(address,address,uint256,string)", +"a10c0fd5": "ROLE_MULTIOWNER()", +"a10c44fb": "s18(bytes1)", +"a10cda99": "isWhiteListed(address,address)", +"a10d4f56": "updateCaps(uint256[])", +"a10d6a51": "officialTelegram()", +"a10d80de": "quitBattle(uint256)", +"a10daf4b": "GroupMultiplier(uint256,uint256)", +"a10e057c": "preIcoMinimumWei()", +"a10e6d28": "arbitrationFeePerJuror()", +"a10ec6e5": "initialize(address[4],address,uint256[12],uint256,bytes)", +"a10edc55": "GeneralPurposeProfitSplitter()", +"a10ef122": "WWWToken()", +"a10f0f5a": "addField(string,uint256)", +"a10f42c4": "isICOEnded()", +"a10f43a3": "bountyReward()", +"a10f5610": "authoriseAddress(address)", +"a10fc32f": "setInstantTransfer(bool)", +"a110063a": "createGOP(address,string)", +"a1103f37": "attrUUID(address,uint256)", +"a110d350": "finalPot()", +"a1119bf2": "bountyFeeCount()", +"a111b0da": "InternationalTourismCoin(uint256,string,uint8,string)", +"a111bab9": "totalLockAmount()", +"a11223da": "airdropTokens(address[],uint256)", +"a1130d04": "createTemplateAndAskQuestion(string,string,address,uint32,uint32,uint256)", +"a1131e14": "withdrawSale3()", +"a113bf2c": "ZITOKEN()", +"a114b5ae": "_createZodiac(uint256,uint256,uint256,uint256,address,uint256)", +"a1155286": "deleteOrg(string)", +"a1155f5c": "buyBlockCDN()", +"a1158c43": "commissionCheck(uint256[],uint256[],uint256[],uint256)", +"a1159838": "removeFreeze(address)", +"a115e38f": "VirtueToken()", +"a11674b0": "divsOf(address)", +"a1169d72": "_payChain(uint256,address,uint256)", +"a11748fd": "ReceiveGBP(address,uint256)", +"a1183d50": "FixedSupplyToken()", +"a1188e56": "getCurrentDifficulty()", +"a118babd": "withdrawPayment()", +"a118ca27": "validateStep(uint256[],uint256[])", +"a118f249": "addAccess(address)", +"a1190a36": "withdrawOtherTokens(address)", +"a11976f6": "confirmTransactionAfterDisputeFee(uint256)", +"a119a65a": "gettodayget()", +"a11aab78": "createGame(uint256[],uint256[],uint256,uint256)", +"a11ab71a": "fundsToCommunity(uint256)", +"a11bab06": "GChain(uint256,string,uint8,string)", +"a11df9c7": "PlanetZeroToken()", +"a11e1645": "registrationRights(address)", +"a11e22d9": "toDate(uint256)", +"a11e7f5e": "get_iconiq_presale_open()", +"a11ed157": "setBirthFee(uint256)", +"a11f8de4": "FomoToken()", +"a1206d4e": "setUserContract(address)", +"a1207708": "confirmDividends()", +"a120fdbd": "dayTokenAddress()", +"a1210a69": "endIcoDate()", +"a1211bc0": "finalizeCampaign()", +"a121d8df": "testFailCreateWithParentSameItemId()", +"a122e060": "rateForPhase3()", +"a12301f5": "promethCount()", +"a1232723": "playerPrizes()", +"a123422e": "_setContributor(address,uint256)", +"a12396aa": "setName(uint256,bytes32)", +"a123c33e": "owner(uint256)", +"a12412f0": "CAT_PER_ETH_BASE_RATE()", +"a12433fa": "getLastAttack(uint256)", +"a1243ad3": "mintPartners(uint256)", +"a12498dd": "ownerEnablePayee(address)", +"a125c824": "setDefaultTokenURI(string)", +"a1264994": "setfounderAddress(address)", +"a126c5df": "GAS_TO_AUTHORIZE_EXECUTION()", +"a126d601": "closePosition(uint256)", +"a127cfb6": "LogRequestAccepted(address)", +"a12842cc": "sellMyTokens(uint8)", +"a1291f7f": "ownerTransfer(address,address,uint256)", +"a1298368": "stringEqual(string,string)", +"a129cb94": "summPremineBounty()", +"a129ecda": "SetdivForSellBack(uint256)", +"a12a52dc": "allOwners()", +"a12a6bb0": "KYC()", +"a12c2564": "preEndTime()", +"a12c7dd8": "presaleContribute(address,uint256)", +"a12cad70": "getPayer(bytes32)", +"a12d2de3": "withDrawToPoolOwnerFee(uint256)", +"a12d7e2c": "WubCoin()", +"a12da89f": "Deviser()", +"a12e429c": "getDiscipleNum()", +"a12e55d9": "rollIt()", +"a12e9670": "setMaxETHContribution(uint256)", +"a12ee7ba": "changeMaintainer(address)", +"a12f69e0": "divides(uint256,uint256)", +"a1315b7e": "createPricing()", +"a132a785": "removeOwner(address,bool,bytes)", +"a132aad1": "startPresale(uint256)", +"a132ab82": "startAirdropTime()", +"a132e336": "changeDeedPrice(uint256,uint256)", +"a1338118": "increaseAllowance(address,uint64)", +"a1344589": "vestedTo(address,address)", +"a1347622": "t_Michail2()", +"a1350c00": "migratePropertyOwnership(uint16[10])", +"a13615a5": "desposeBear(address)", +"a1365fda": "dev_streamsLength()", +"a136aadc": "getMinerHashRate(uint256)", +"a136c448": "updateTokenSellingPrice(uint256,uint256)", +"a1391297": "ETH_CLEAR()", +"a139dee2": "_deleteHybridization(uint256)", +"a13a7cee": "createChildren(uint32,uint32)", +"a13ae1ee": "updateTokens(address,int256)", +"a13c24c7": "BithubCommunityToken()", +"a13c58f7": "logCoinAgeRecord(address,address,uint256)", +"a13d2733": "updatePatientHealthData(string,string,uint256)", +"a13d3832": "deactivateTokenSwitch()", +"a13d8ec4": "generateFinished()", +"a13e3351": "transferRefPercents(uint256,address)", +"a13f9e58": "RESERVATION_CAP()", +"a1405522": "MilkCow(address)", +"a140a687": "localsService()", +"a140e4ee": "getDropNotices()", +"a140e79c": "setMinimumDebatePeriod(uint256)", +"a1410994": "intelligentmasschainToken()", +"a141ce6a": "packageOfferInfo(address,uint256)", +"a142040b": "Dil()", +"a142d608": "escapeHatch(address)", +"a1446287": "LKYToken(uint256,string,string)", +"a1448fa7": "secondRewardPeriodPercent()", +"a144a3e0": "whitelistTransferFrom(address,address,uint256)", +"a1450c8a": "XDRAC()", +"a1454830": "getExpirationTime(bytes32)", +"a145492a": "transferToPartnerAccount(address,uint256)", +"a145636b": "artworkIndex(uint256)", +"a14598e6": "changeBonusPercentage(uint256)", +"a14779c9": "airdropWallet()", +"a1490581": "Deal(address,uint256)", +"a1490d50": "getTradeHash(address,uint256,address,uint256,uint256)", +"a14977d5": "getCustomerTxCount(address)", +"a1498f50": "check_result()", +"a14a5648": "bonus02Start()", +"a14b877b": "refundEverybody()", +"a14c1c4f": "setSTO(address,uint256,uint256,uint8)", +"a14c36ce": "dGetPool(uint8,uint8)", +"a14c9bed": "resetCurrentIdTo(uint256)", +"a14cf394": "generateInitialCard(uint16)", +"a14d191c": "PausePublic(bool)", +"a14d427a": "transferBonusToken(address,uint256)", +"a14d6517": "tweetIt(string)", +"a14e0e4e": "runInit()", +"a14e88fe": "firstTokenCap()", +"a14ea9c0": "selfRegisterDIN()", +"a14eaada": "tipCreator()", +"a14fc1e7": "aDropedThisWeek()", +"a14ff857": "setBytes32(bytes32,bytes32,bytes32)", +"a150be7a": "distributionPreIcoCount()", +"a152479c": "_computeNextCommissionerPrice(uint128)", +"a152b23e": "UKW()", +"a15348fa": "TitleRegistry()", +"a1536211": "AtacToken()", +"a153b399": "ZeePinToken(address,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"a15404b7": "createUnicornPrice()", +"a15454ba": "payTransactionFee(uint256)", +"a154aa36": "getTotalGoals()", +"a154ce82": "disableContract(address)", +"a155beb8": "buyerDatabase(address,uint256)", +"a156ce7b": "totalReimbursedWei()", +"a157696b": "setWhitelistedOnly(bool)", +"a1578d53": "EventBuyTank(address,uint32,uint32)", +"a157979c": "netOutcomeTokensSold(uint256)", +"a1580f1a": "damage()", +"a1581821": "transferWholeTokens(address,uint256)", +"a158e377": "statusICO()", +"a158e632": "lastLapId()", +"a1594d21": "DividendClaimed(uint256,address,uint256)", +"a159c548": "amountOfTokensPoolC()", +"a159c937": "getReferencePriceInfo(address,address)", +"a15a2289": "GameNumber()", +"a15a8613": "VoteCountPerProcess()", +"a15a9a15": "Presenca()", +"a15afb48": "Replicator()", +"a15b4d2d": "getAllCardByAddress(address,address)", +"a15b53ad": "pre_minContribution()", +"a15b9769": "addRandomClass(uint32)", +"a15bb363": "createBoardHash(bytes32,address)", +"a15c1788": "checkForLog(string)", +"a15cdbf7": "moveERC20Tokens(address,address,uint256)", +"a15d59ce": "totalVestedBalance()", +"a15db1c5": "_validateTokensAmount(uint256)", +"a15e3919": "getCrowdsaleUniqueBuyers(address,bytes32)", +"a16085ce": "the_address_for_option_D()", +"a16094d1": "burnMarketMakerApproval()", +"a160bdf5": "expiration(bytes12)", +"a1616429": "testBitOrSuccess()", +"a1616c92": "hasFreelancerMinRatingsCount(address,address,uint256)", +"a16249e2": "__min__(uint256,uint256)", +"a162a71f": "addToOwnerlist(address)", +"a162c04c": "buyTicketsFor(address)", +"a1636db0": "stepThree(int256)", +"a16383e2": "getTrustedTransferAttotokensValue()", +"a1639c6b": "customerConsents(address)", +"a163a624": "Test()", +"a163c090": "maxArtworks()", +"a164845a": "TheImmortalsPhoto(string,string,address,address)", +"a1654379": "isAllowed(address,address)", +"a1658fad": "canPerform(address,bytes32,uint256[])", +"a1659822": "UncursedToken()", +"a16618ae": "updateClientVersion()", +"a1663c48": "MIN_PRE_FUNDING_GOAL()", +"a1664ae2": "icoStartTimestampStage1()", +"a166b4b1": "addParticipant(address[])", +"a1672717": "getMinContributionInWei()", +"a1687d31": "isPlayer1sTurn()", +"a168d873": "gameAddress()", +"a1696076": "CCH_EDIT_3()", +"a1698315": "setExtraTokensWallet(address)", +"a169ce09": "boom()", +"a16a3179": "multiTransfer(address[],uint256)", +"a16bed3a": "changeTradeFee(uint256)", +"a16c6a73": "setClaim(uint256,uint256)", +"a16c86f7": "withdrawRefund(address)", +"a16cdbb1": "maxLockDuration()", +"a16d5960": "setPartner(address)", +"a16e5326": "CryptoSagaCorrectedHeroStats(address)", +"a16f3774": "getReservedTokens()", +"a16fa142": "generate_token_for(address,uint256)", +"a1702265": "keyEmployeesAllocation()", +"a17042cc": "getMsgValue()", +"a17177a1": "marketingTokensDistributed()", +"a171b694": "RefundIssued(address,uint256)", +"a172045d": "PUSH1()", +"a172db06": "portalAddress()", +"a1731366": "withdraw_to_reward_contract()", +"a173ba2f": "deathData_v2()", +"a1741d0f": "checkLiquidationValue(uint256)", +"a1743410": "_refundExceededValue(uint256,uint256)", +"a1744812": "setMaxCoordinate(uint16)", +"a174a8e9": "addNewColor(string)", +"a174c4c6": "mintAmount5()", +"a176d7c9": "createAndTransfer(address,uint256)", +"a176f6bc": "freezeTimeOf(address)", +"a1775db5": "isContract(address,address)", +"a1779a3d": "getFieldData(uint256)", +"a1784139": "updateChildMinLogos(address,uint256)", +"a1786803": "getCreationCost()", +"a1786d1b": "changeMessage(uint256,string)", +"a1787880": "createCustomToken(string,string,uint8)", +"a17a2685": "canUpdate()", +"a17a9e66": "A(uint256)", +"a17b229d": "total_fund()", +"a17ca853": "round(uint256,uint256)", +"a17cc7eb": "storedData(address)", +"a17d4228": "SingleApproval()", +"a17d5f44": "initializeWhitelist(address)", +"a17d713a": "stringToUint32(string)", +"a17dd26c": "buyWithReferral(address)", +"a17de881": "DigitalIntelligentToken()", +"a17e463c": "NbtToken()", +"a17ea25b": "getAppChainCode(uint32)", +"a17eb09f": "ExtraHolderContract(address,address[],uint256[])", +"a17ecf9e": "kill(uint256,address[],uint256[],uint8[],bytes32[],bytes32[])", +"a17eee56": "setGasRefundForClaimLoot(uint256)", +"a17f0bbd": "ICO_BONUS_TIME_3()", +"a17fa5f2": "fillRandomCars(uint256[],uint256)", +"a17feadb": "airdropAmounts(address[],uint256[])", +"a1804e67": "buyWithBalance(uint256,uint256,uint256)", +"a181b040": "SlammerTime(address)", +"a18232e8": "estimateTokenNumber(uint256)", +"a1826a9a": "CMK()", +"a182da60": "crowdSupply()", +"a1837d21": "ChangeBonus(uint256)", +"a183e9a5": "ErrorMessage(string)", +"a18473c2": "RequestCurrencyContractInterface(address,address,address)", +"a1848b61": "someMethod(uint256)", +"a1857f4a": "OTHERCRUISER_MAX_CARGO()", +"a1865376": "changePrice(uint256[],uint256)", +"a186e120": "setTokenTransferState(bool)", +"a18717a9": "addressToPass(address,bool)", +"a1883d26": "setTaxAddress(address)", +"a1885d9b": "whitelistWeiRaised()", +"a18861a3": "getHistoryCount()", +"a1888c34": "setGamblingFee(uint256,uint256)", +"a188b8fd": "accountAddressForSponseeAddress()", +"a188fcb8": "orderDepth(bytes32)", +"a189a487": "status(uint8)", +"a18a186b": "getCurrentOwner()", +"a18a2092": "changeTokenHolder(address)", +"a18a7bfc": "setReferrer(address)", +"a18bf6e9": "addFundAccount(address)", +"a18c1ab0": "burnToAddr()", +"a18c751e": "set(bytes,bytes)", +"a18ccc8a": "transferToWallet(uint256)", +"a18cd06c": "distribute(address,address)", +"a18dda19": "releasePayment(bytes32,address,uint256,address,uint256,uint256,address)", +"a18e0ce4": "addBorrowingItem(address,uint256,uint256,address,bool,uint256,uint256)", +"a18e133e": "registered_racers()", +"a18e2eb9": "left69(uint256)", +"a18ef171": "ALLN()", +"a18f43ef": "hasForfeitedBatch(address,uint8)", +"a18f7567": "Thecap()", +"a18f9b11": "drawWinners(uint256,uint256,uint256)", +"a1900c22": "takeTokenProfits(address)", +"a1903737": "addressOfTokenUsedAsReward5()", +"a1903eab": "submit(address)", +"a190500a": "tokenSecondPeriodPrice()", +"a1907386": "debugLatestPurchaseCentsValue()", +"a1920586": "offer(uint256,uint256)", +"a1920f36": "reservingStep()", +"a192274d": "initializeBread(uint256,string)", +"a192a425": "Founder1()", +"a192fdba": "bonusEnds10()", +"a1931ff9": "tryAnotherOne()", +"a1943113": "devWithdrawn()", +"a1945458": "getIdentityInfo()", +"a1960d80": "deferredKyc()", +"a19638e6": "betsCountToUseFreeBet()", +"a196593c": "findTenAmUtc(uint256)", +"a1965dca": "move(uint8,bytes,uint8,bytes32,bytes32)", +"a196981b": "withdrawCrowdsaleDragons()", +"a196bea0": "isDirectDebitEnable()", +"a1972fc4": "updateDividends(address)", +"a1975c38": "Token77G(address,address,address,uint256)", +"a197c042": "checkCustomer(address)", +"a197ec5d": "excessTokensBurnt()", +"a1988458": "readGlobalPurchasedToday()", +"a198a418": "LKLZ()", +"a1992419": "createCandidateOnElection(uint256,address,address,string)", +"a19b5493": "successed()", +"a19b8766": "transferTEST(address,uint256)", +"a19beba9": "addCompanion(address)", +"a19c1f01": "burnRemainder(uint256)", +"a19c406a": "newIdTankWeapon()", +"a19c9cd1": "getEthfromUSD()", +"a19cb5ee": "addHash()", +"a19db682": "defaultFoundersRewardTime()", +"a19e1d00": "bonusInPreSalePhase1()", +"a19e29a9": "claimUnsold(uint256)", +"a19ed39d": "finalizeFunding()", +"a19ee7a3": "changeMinMakerBetFund(uint256)", +"a19fab4c": "setWhitelisted(address,uint256)", +"a1a04486": "monthLength()", +"a1a0ee90": "LogPolicyApplied(uint256,address,bytes32,uint256)", +"a1a17ec3": "rentSign(uint256)", +"a1a1efe7": "addBallot(bytes32,bytes32,address)", +"a1a200c5": "getRankList()", +"a1a3e4c7": "UserIDChanged(address,bytes32)", +"a1a49a09": "unlockTimes(address,uint256)", +"a1a59f52": "_renew()", +"a1a5d118": "deployNetwork(address)", +"a1a66e56": "deductFunds(uint256)", +"a1a6d5fc": "transfer_(address,address,uint256)", +"a1a71a20": "buyCommon(address,uint256,uint256)", +"a1a71a83": "checkUsernameVerified(bytes32)", +"a1a7405a": "destTokensSgt()", +"a1a74aae": "removeMember(uint256)", +"a1a79f64": "_winAmount(uint128,uint16,uint16,bool)", +"a1a7e68b": "mintTreasuryTokens()", +"a1a85253": "ReturnBack()", +"a1a887b8": "isUserExists(address,address)", +"a1aab33f": "weight()", +"a1aad09d": "setBondPrice(uint256,uint256)", +"a1ab46d0": "DepositReceived(uint256)", +"a1ac727f": "airdrop(address,address[],uint256)", +"a1ac8c56": "balanceOfOwnerAndCreator(address,address)", +"a1acd4b2": "AWD_SHARE()", +"a1acf069": "ArtChainToken()", +"a1ad2b99": "removeExchangeAccounts(address,address)", +"a1ad54e6": "holdingToken()", +"a1ad7cef": "tokenBurned()", +"a1adbb25": "addCandidate(bytes32,bytes32)", +"a1add510": "hasRelation(bytes32,bytes32,address)", +"a1aeb1c2": "paybackToOwner(address,uint256)", +"a1aec173": "COLOR_SILVER()", +"a1af90ad": "funcalls()", +"a1afaa19": "previligedUnLock(address,uint256)", +"a1b0f3a0": "userChallenge(uint256)", +"a1b140b6": "getDistributionStatus()", +"a1b162a8": "set_timeframes(uint256,uint256)", +"a1b16e5c": "returnAgents(address)", +"a1b1cb43": "hasAccess(address,uint8)", +"a1b1e507": "addMintingFactory(address)", +"a1b22154": "preemption()", +"a1b22c19": "delExcluded(address)", +"a1b235af": "popLanguage()", +"a1b258c1": "firstWeekBonus()", +"a1b289dd": "TulipToken()", +"a1b2acc1": "cancelApproval()", +"a1b35c79": "getSection(bytes32)", +"a1b39c38": "_removeMarkets(uint256)", +"a1b3ef4b": "flightDone()", +"a1b40946": "getWordIndex(string)", +"a1b4dd2d": "DXBCToken(address)", +"a1b4f57c": "joinBattle(string)", +"a1b5b581": "ymtest(uint256)", +"a1b608c9": "setMainPoolCutPercentage(uint256)", +"a1b64c86": "TokenMock(string,address)", +"a1b6b1b5": "updateUnlockData(address,address,uint256,bytes32)", +"a1b6d4ae": "REPLACES()", +"a1b77835": "getRefPercentsByIndex(uint256)", +"a1b7887f": "logShareTokenBurned(address,address,uint256)", +"a1b7ae62": "setdirectorName(string)", +"a1b7ffb2": "_checkRequireERC20(address,uint256,bool,uint256)", +"a1b86605": "getHourglassBalance()", +"a1b8c40f": "lastDepositIndex()", +"a1b94c0b": "timeOfWin()", +"a1b9af31": "unlockBets()", +"a1b9cb8f": "getTitulaire_Compte_6()", +"a1b9e03f": "Unagold(address)", +"a1ba0331": "CoinTroops()", +"a1ba444d": "createOrder(uint256,uint256,uint256)", +"a1ba7554": "fibokenUsedCount()", +"a1bb6220": "halting()", +"a1bb7828": "make_transfer(address,uint256,uint256,bytes32)", +"a1bba310": "DonationDoubled(address,uint256)", +"a1bc13ad": "forgeItems(uint256,uint256,address)", +"a1bc76d1": "extendPRETDE(uint256)", +"a1bc7a8f": "sha3_512()", +"a1bd55c2": "TimeDecayingToken(address,uint256,string,uint8,string)", +"a1bda122": "returnInt16(int16)", +"a1bdd146": "setEndorsement(address,uint256,uint256)", +"a1be79a0": "equipUp(uint256[6])", +"a1bed0be": "GOAL()", +"a1bf8a9d": "endICO_w1()", +"a1bffefa": "emitCancelled()", +"a1c0539d": "scheduleCall(address,bytes4,bytes)", +"a1c14350": "getUpdateMarketPhaseCalled()", +"a1c1519a": "calcNewSkinAppearance(uint128,uint128)", +"a1c15f56": "CipherPlay(address,address)", +"a1c29db6": "MAX_FUNDING_AMOUNT()", +"a1c2f644": "address4()", +"a1c308d0": "ProspectorsGoldToken()", +"a1c448f1": "kingdomCreationFeeWei()", +"a1c4774b": "getCostToKick()", +"a1c4db02": "eth_meth()", +"a1c51915": "getB()", +"a1c68880": "final_share_price()", +"a1c6d088": "airDropTokenDestroy()", +"a1c80cea": "getUriCount(address)", +"a1c8ca7e": "removeClaim(address,bytes32)", +"a1c90a11": "updatePlayersCoinByPurchase(address,uint256)", +"a1c91040": "requestEvidence()", +"a1c93169": "DividendClaimed(address,uint256,uint256)", +"a1c934b6": "TestNetworkToken()", +"a1c95ac2": "GSIToken(uint256,string,uint8,string,address)", +"a1c9d235": "minimumElectionQuorum()", +"a1ca00c0": "ELIXAddressSetter()", +"a1ca70f4": "totalDiv()", +"a1ca8f8d": "LTRToken()", +"a1cb31b7": "_state()", +"a1cbae6c": "communityTokens2()", +"a1ccc49c": "addDataPatternVoteRules(uint256,uint256,bytes,bytes,uint256[5])", +"a1cd150d": "_calculateFee(uint256)", +"a1ce5ba7": "getIncentiveNum()", +"a1ce7e03": "openOrder(uint64,bytes,bytes32)", +"a1cea675": "cryptaurRewards()", +"a1ceb253": "mintAdvisorsTokens(uint256)", +"a1ceb359": "CryptoStrategiesIntelligence()", +"a1d0846c": "setPrices(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"a1d0a48f": "addCurrency(string)", +"a1d0ab04": "allocateContributorsToken()", +"a1d10d11": "StoneLog(uint256,uint256)", +"a1d20653": "setVersion(bytes32,string)", +"a1d25205": "lowEth()", +"a1d27925": "personalContract()", +"a1d280d3": "releaseValue1()", +"a1d3612c": "DKS()", +"a1d36cb0": "checkClaimEntitlementofWallet(address,address)", +"a1d48aa8": "PaymentChannel(address,address,uint256)", +"a1d4c7ce": "_emitSkillRatingGiven(address,address,uint8,uint256,uint256,uint256,uint256)", +"a1d4c820": "Signum()", +"a1d53160": "Capital()", +"a1d5b36e": "calculateTxHash()", +"a1d61b07": "dateTier4()", +"a1d707a3": "setReleaseCar(uint256,bool)", +"a1d7d1dd": "setup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256[],uint256[],uint256[],uint256[])", +"a1d7ecbb": "updateShareETH(address)", +"a1d82cfd": "EBANK()", +"a1d86608": "_claimedSurroundingTiles(uint256)", +"a1d915b8": "ClaimTokens()", +"a1d91ee0": "technologyContract()", +"a1da2fb9": "retrieveDAOReward(bool)", +"a1da32be": "Shopiblock()", +"a1dab23e": "sellFloor()", +"a1dabfb2": "OAIToken(address,address)", +"a1db9782": "withdrawERC20(address,uint256)", +"a1dc139d": "setSigner(address,address,bool)", +"a1ddcd2d": "USDCX()", +"a1dddf70": "registerEthHandle(bytes32,address)", +"a1dea137": "checkBlacklist(address,address)", +"a1df7eb3": "YBKToken(string,string,uint256,uint256,string)", +"a1dfe545": "logShareTokenMinted(address,address,uint256)", +"a1e03f57": "ratePerWeiInSelfDrop()", +"a1e04406": "preSale4Finished()", +"a1e0c2c9": "winnerCounter()", +"a1e15c33": "canuseOf(address)", +"a1e3b16d": "Crypseum()", +"a1e3c008": "mainSendTTC()", +"a1e4cb30": "investorsTotalSupply()", +"a1e4d3c2": "MembershipRoster()", +"a1e4eaf1": "updateUserBalance(uint256,bool,uint256,uint256,uint256,address,address)", +"a1e4f73d": "construct(bytes32,string,bytes32,address,uint128,uint256)", +"a1e51a79": "emitDestruction(uint256)", +"a1e564b1": "CashOut()", +"a1e59471": "HashBux()", +"a1e66038": "getTrusteeTable()", +"a1e6a255": "nextUserId()", +"a1e7e21c": "crowdsaleBurnAmount()", +"a1e89aec": "saleCount()", +"a1e8a780": "getAdPriceMultiple()", +"a1e93b63": "withdrawTipBalance(uint256,address,uint256)", +"a1e95792": "eatUnicornsAlive(uint256)", +"a1ea00bc": "isUserTakerFeeEnabled(address,uint256)", +"a1eb0bae": "eliminarjugador(uint256)", +"a1eb84b0": "transferOwnedOwnership(address,address)", +"a1ecb43c": "incrementLimitTeam()", +"a1ee7855": "ATT()", +"a1ee8c78": "issueToken()", +"a1ef9b8f": "reallocate(address,address,address,uint256)", +"a1f1aa66": "cancelVoteInternal(bytes32,address)", +"a1f1de65": "getPrizeAmount(uint256)", +"a1f24b3d": "getAssetDetails(uint256)", +"a1f36a78": "EROSCOIN()", +"a1f43f40": "UNICToken()", +"a1f4b9c8": "updatePlayerGen(address,uint256)", +"a1f54adf": "nextPremiumSale()", +"a1f56b0a": "getRollOutput(uint256,uint8,uint8,uint256,address)", +"a1f7f269": "_breedWith(uint256,uint256)", +"a1f841d7": "unlockFund()", +"a1f8adac": "investorList()", +"a1f8ea3b": "numOfDeliveredEarlyPurchases()", +"a1f902a7": "ComputeVestSpend(address)", +"a1f91057": "updateLock(bool)", +"a1fa39c4": "getRaisedPercents(address)", +"a1fa540d": "changeVotingBlocks(uint256,uint256,uint256,uint256,uint256)", +"a1fa566e": "getChannelPartners(bytes32)", +"a1fac24c": "Follow(bytes32,bytes32,bool)", +"a1fafe0c": "sendResidualAmount(uint256)", +"a1fb03f2": "GooCrowdsale(uint256,uint256,uint256,uint256,address)", +"a1fb1de9": "Message()", +"a1fb34c1": "setCustomExtraData(bytes32,uint256,bytes32,bytes32)", +"a1fc21f4": "setStaffDisbursementAddress(address)", +"a1fcc3bc": "stage2()", +"a1fd49b7": "getMFBalance(address)", +"a1fd92f5": "destinationMultisigWallet()", +"a1feba42": "tokensLocked()", +"a1ffba04": "PPGT()", +"a2008eb9": "acceptBidForStar(uint256,uint256)", +"a200dc73": "getNextShareholder(address)", +"a201222d": "recalculate(address)", +"a201bf26": "settleETH(bytes32)", +"a201d102": "VOTING_END_TIME()", +"a201ed8b": "transferMultiple(address[],uint256[],uint256)", +"a2023ff8": "setStartEndTimeTLP(uint256)", +"a202e476": "last_hash()", +"a20348c4": "ToPeriod()", +"a2035fef": "changeCustomTimeLock(string,uint256)", +"a20495d3": "Managed()", +"a20741dd": "getOperation(uint32)", +"a207b7fa": "SALE_FUND()", +"a208b3b7": "findFigures(uint256)", +"a2093e1b": "migrateCatOwnersFromPreviousContract(uint256,uint256)", +"a209a29c": "getStringValue(bytes32)", +"a20aede0": "phaseThreeRate()", +"a20b77ad": "getDocHash(uint256)", +"a20b8ab3": "ttlInvestAmount()", +"a20bbb8b": "addBadge(uint24,int16,int16,uint24,uint256,string,string,string,uint256)", +"a20bc7fe": "allownce(address,address)", +"a20c15cf": "_generateCampaign(string,uint256[3],uint256[],uint256,uint256,uint256,uint256)", +"a20c404f": "ModifySettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"a20cc495": "bytesFunc(bytes,bytes)", +"a20cd047": "moveTokenToAccount(address,uint256)", +"a20cf0e7": "setTokenNAVMicroUSD(uint256)", +"a20ddfb6": "getPartnerAddresses()", +"a20def62": "checkExistsOwnedAccessory(uint64)", +"a20e2525": "UnlockWei(uint256)", +"a20efba3": "mintGrey(address,uint256)", +"a20f46c6": "searchAddress(address)", +"a20f4ee6": "pixelCost()", +"a210a676": "buyBunny(uint32)", +"a210bf55": "updateJackpotFeePercentage(uint8)", +"a210c6a9": "creatorPaid()", +"a210f934": "rateEarlyStage2()", +"a21174bb": "DefaultReverseResolver(address)", +"a2119377": "createToken(string,address)", +"a2119a3a": "allocateForRefund()", +"a2125232": "addItem(uint256,uint256)", +"a213051c": "individualMinPurchaseWei()", +"a21383cb": "permissibleTokenWithdrawal(uint256)", +"a213972c": "ViewBet2(address,uint256)", +"a213c280": "DayByDayToken()", +"a21515e3": "computed_shares_sold()", +"a2152e32": "testOracle()", +"a215457a": "transferBurnRole(address)", +"a215cd92": "setMinConversionRate(uint256)", +"a2167ac4": "_donations()", +"a216e0aa": "transferRobot(address,uint256)", +"a2177ff0": "getKeyLength()", +"a2187de0": "available_tokens()", +"a218d8ca": "clearAndDestoryAfterTwoWeeks()", +"a2190b46": "calculateTakerFee(address,uint256)", +"a21931ea": "CreateProposal(string,string,string,uint32,string,string,string,uint32,uint32)", +"a21a32cb": "Securities_1()", +"a21a65ae": "getIntArrayLength(bytes32)", +"a21d5b9f": "utilityLockedDate()", +"a21d942f": "checkResult()", +"a21df9f0": "THIRTY_DAYS()", +"a21e14fe": "reportInvalidDeposit(bytes32[])", +"a21ea6b7": "CrabCoin()", +"a21eea2a": "assertValidChallenger(address)", +"a21eef95": "getBarrierNum(uint16)", +"a21f0368": "History(uint256)", +"a21f74b8": "fundGooResearch(uint256)", +"a21f836e": "pubCount()", +"a21fbc92": "isAllowed()", +"a2200278": "checkStatus(bytes32)", +"a2200fbe": "AgreementUrlEn()", +"a220a90e": "transferLoveStoryWithData(bytes16,bytes32,bytes32,uint256,string)", +"a220d6c4": "tCampaignStart()", +"a2210352": "doRebuyTo(address)", +"a22107b4": "createRandomZombie(int256)", +"a222a52f": "firstPostIcoContributorId()", +"a222c98d": "declareWinnerForRaz(uint256,uint256)", +"a22304cd": "_specialDistribution(address,uint256)", +"a2233631": "withDrawal(address,address,uint256,bytes)", +"a2233c4d": "BancorConverterFactory()", +"a22352e2": "getDisputeFee(bytes32)", +"a2240eb0": "Scope()", +"a2248be0": "set_pre_kyc_bonus_numerator(uint256)", +"a224a5b3": "push_key(uint256,uint256,uint256)", +"a224c745": "setWhitelistAddress(address)", +"a224dcb7": "withdrawClaim(uint256)", +"a224f4ce": "earningsFromScore(address,address)", +"a2252aaa": "referralProgramOwner()", +"a225d0be": "setTokensByWaveIndex(uint256,uint256,uint256)", +"a2261508": "tokenSpender()", +"a2267a3a": "newProposal(uint256,uint256,string)", +"a2271b15": "m_presaleFinished()", +"a22838b9": "ExecuteTrade(uint256,address,address,uint256,uint256)", +"a229090a": "dropTo(string)", +"a22913b5": "addTeamAddress(address,uint256,uint256)", +"a229b901": "transferApprover(address)", +"a22a12de": "submitWithMetaHash(bytes32,bytes32)", +"a22a31dd": "Forged(uint256)", +"a22b35ce": "_burnFrom(address,uint256)", +"a22b5a1c": "getFiles(bytes32)", +"a22b97f5": "withdrawOnBehalf(address)", +"a22ba787": "allocateETH(bool)", +"a22bb384": "GBAChain(uint256,address)", +"a22c81ec": "MIDGRADE_TYPE2()", +"a22cb465": "setApprovalForAll(address,bool)", +"a22cd657": "getImpactValue(string,address)", +"a22ce93d": "getActiveConsentTemplates()", +"a22d5a51": "deleteActivity(uint16)", +"a22dff2c": "getMainBalance()", +"a22e9009": "epm()", +"a22ec476": "setSireStop(uint32)", +"a22ed371": "mentalBalanceOf(address)", +"a22f2b2e": "set_lock_list(address,address,uint256)", +"a22fb98b": "updateBounty(string,uint256[])", +"a2302af9": "queryWinningTeam(uint256)", +"a2309ff8": "totalMinted()", +"a230c524": "isMember(address)", +"a231a84f": "ssp()", +"a232155d": "getbetresultfirst(address)", +"a2325259": "buyTokensWithUpdateRate(address,uint256)", +"a23281e6": "numPositionsExpired()", +"a2328e2e": "_FIVEHUNDRED()", +"a23291b6": "QUIOToken()", +"a232e64b": "createForum(string)", +"a235ae52": "setWithoutFee(address,bool)", +"a2362aca": "HyunJaeToken()", +"a2368e11": "setAirDrop(bool)", +"a236a3d7": "configRoundKeyAdd()", +"a236e665": "buyNac(address,uint256)", +"a236eb85": "subdivide(uint256,bool,bool,uint256,uint256,string,string)", +"a236f388": "getGameWin(address,uint256)", +"a23744f0": "tryCreateCheckRecord(bytes)", +"a2375d1e": "getC()", +"a237f4d8": "developerFundAddress()", +"a2393922": "getTokenDealRange()", +"a23951c8": "WidthdrawEarnings(uint256)", +"a239756d": "setRandom(uint256,uint256)", +"a239d260": "KinTokenSaleMock(address,uint256)", +"a23a373f": "DrawWinning(uint256,uint256)", +"a23a49c1": "setEscrowTokensWallet(address)", +"a23a5315": "SkyToken()", +"a23b5bd1": "getRandomUint256(uint256)", +"a23b791a": "Bitcoin()", +"a23bbb11": "GroupClosed(uint32,uint256)", +"a23bc6fe": "setTokenHolderAddress(address)", +"a23bec7b": "constrcutor()", +"a23bfd84": "weiPerCHF()", +"a23c3397": "getTokensPaidToGame(address)", +"a23c86c0": "allocateBulkTokens(address[],uint256[])", +"a23d20f4": "blockedDivisionJurisdictions(bytes32)", +"a23d3c35": "founderWallet()", +"a23d64c4": "isReturnRequested(address)", +"a23da130": "FundsRegistry(address[],uint256,address,address)", +"a23e21f7": "change(uint8,bytes32,bytes32,bytes20)", +"a23e3e89": "removeToken(address,uint256,uint256)", +"a23f41e2": "curs()", +"a2407c7b": "verifyUpdate(uint256,int256[2],uint256[2],int256,bytes32,address,uint256,uint256,uint256[3])", +"a240d8ad": "changeWeeklyRate(bytes32,uint256)", +"a241c089": "updateContract()", +"a2420f73": "EthermiumTokenList(address,address,uint256,uint256)", +"a24247f1": "getStartLockTime()", +"a242519b": "Technology3G(address)", +"a242f049": "ICOEndTime()", +"a243b6c1": "setPrice(uint256,uint256[],uint256[])", +"a243f512": "removeTrack(bytes32)", +"a243f874": "takePayment()", +"a244e03d": "definirMessage(string)", +"a244f365": "SbuyToken()", +"a245b774": "lockedFundsForthefuture()", +"a24636c1": "InvalidState(bytes)", +"a246d83b": "relaySellerCannotCancel(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32)", +"a2471fa5": "RecoverableWallet(address)", +"a2473cc1": "stakeOf(address,uint96)", +"a2478c8d": "CT(uint256,string,string)", +"a247bc32": "payouts()", +"a24835d1": "destroy(address,uint256)", +"a248da12": "Exam()", +"a248de8f": "own(bytes32)", +"a248df4f": "XFC()", +"a249225e": "setAuthorizedUser(address,bool)", +"a2495ace": "transferCongress(address)", +"a2497b5c": "ETQuality()", +"a24a21fa": "TheBillionCoin()", +"a24bcf46": "calculateTokenAmount(uint256)", +"a24beff7": "closeBet(uint256)", +"a24c9737": "BUYER_CAP_HIGH_USD()", +"a24d23eb": "ProcessGame(uint256,uint256)", +"a24d9658": "revokeConsent(string)", +"a24dbe76": "StatusContribution()", +"a24e20de": "withdraw_dao_fund(address,uint256)", +"a24ea666": "withdrawedFundrasingPart()", +"a24ea868": "PROOF_MULTISIG()", +"a24ed4e5": "isLimitedWalletAddress(address)", +"a24ed8aa": "newLeader()", +"a24f1e82": "publiclyDistributedParts()", +"a25047a2": "hasEntry(address)", +"a25057de": "_transferToICAP(bytes32,uint256)", +"a250f43b": "verifiedWinnersLastCount()", +"a25236fe": "requestVotingRights(uint256)", +"a25277f3": "totalTokensCrowdSale()", +"a25287c5": "allowChangePrice()", +"a25367ff": "method2(bool)", +"a253c06e": "_circulatingSupply()", +"a25401ea": "PapyrusToken(address[],uint256[])", +"a254e662": "managementTokensDelivered()", +"a2550108": "alt_buyCollectible(uint256,uint256)", +"a2554c36": "walletForPresale()", +"a2558ee2": "holderReward()", +"a255d68d": "ticketTransferees(address,uint256)", +"a2564afc": "activatePermissionsBot(bytes32,bytes32)", +"a2564f7c": "randomNumberGen(uint256,uint256)", +"a2578f1c": "armyCountBattlesWon(uint256)", +"a258dafc": "getTopInfo(uint256)", +"a2594b83": "greylistMany(address[])", +"a2596576": "submitMint(int256,address,uint256)", +"a2596ebe": "returnTokensFromHoldProgectAddress(uint256)", +"a2597659": "changeMinAccEthers(uint256)", +"a25983e5": "lockTokens(address,uint256,uint256)", +"a25a34b1": "findPositionInMaxExpArrayTest(uint256)", +"a25b859d": "soldIdeaWeiIco()", +"a25b9384": "isUserAllowedToTransfer(address)", +"a25bc80c": "setPresaleState(uint8)", +"a25be434": "notifyTranferToken(uint256,address,address)", +"a25c1f3a": "presalePurchasesLoaded()", +"a25d8973": "createSale2()", +"a25e6898": "withdrawForeignTokens(address,address,uint256)", +"a25eb5d9": "exchangeToken()", +"a25f2d7e": "ReinvestmentWithdrawal(address,uint256)", +"a25f55d4": "getBatchSize()", +"a25f5e98": "doAdditionalMinting(address,uint256,int256)", +"a25fc8dc": "adminAddCity(string,uint256,uint16)", +"a25fdcec": "editPlanet(uint256,uint256,string,string)", +"a25ff42d": "HumanStandardToken2(uint256,string,uint8,string)", +"a2605dc1": "EventLuckyNumberRequested(address,uint256,uint256,uint8)", +"a2609759": "transferPreSignedMany(address,address[],uint256[],uint256,uint256,uint8,bytes32,bytes32)", +"a260c045": "PROMETHEUS_SHIP_LIMIT()", +"a260d8da": "makePresaleReady()", +"a26176b1": "testInequalityUint()", +"a2624afe": "raiseJackpot()", +"a262c092": "CollectChipBag()", +"a26329f0": "finalizeRefunds()", +"a2635401": "getCurrentGameId()", +"a263601c": "find_contribution(address)", +"a26388bb": "testRevert()", +"a263c7ba": "changeBuyPrice(uint256)", +"a263e793": "EdittedEntry(address,uint256)", +"a2644eb0": "withdrawFullTokenBalance(address)", +"a264f18e": "CROWDSALE_ETH_IN_WEI_ACCEPTED_MIN()", +"a2651d30": "purchaseAreaWithData(uint24[],uint24[],uint256[],string,string,uint256)", +"a2657960": "DolyToken3()", +"a26636f3": "StpacToken()", +"a266b0f2": "CoinStacks()", +"a266c820": "changeARIWallet(address)", +"a266f4da": "liquidateFund()", +"a26730e1": "minRelease()", +"a26759cb": "addFunds()", +"a267b5cf": "TokensTransfered(address,uint256)", +"a268b332": "testBitXorFailIndexOOB()", +"a269202f": "setHash(address,bytes32,address,bytes32,uint256)", +"a269e31f": "setPrices(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"a26a1bc9": "clearLockUser(address,uint256)", +"a26ac680": "BoBoToKen()", +"a26b0e34": "dbVal(address,uint256)", +"a26b2d76": "StepCoin()", +"a26b8822": "tokensSoldExternal()", +"a26bddb4": "LockedTokens(address)", +"a26c7810": "mintToTeamAccounts()", +"a26d494d": "getEscrow(address)", +"a26d6de6": "LogWithdrawal(uint256)", +"a26d7b94": "isCrowdSaleClosed()", +"a26dbf26": "totalParticipants()", +"a26e1186": "deposit(string)", +"a26e7a6c": "_initOpinion(uint256,string)", +"a26efcf8": "startGame(bytes,address,uint256,uint256[],bytes)", +"a26f644c": "Transfer_of_authority_data(address)", +"a270907c": "Btcandres()", +"a270a737": "venue()", +"a270cdf3": "getMarketInfo(bytes32)", +"a2720018": "freelanceFillBonds(address)", +"a2729a01": "updateDelegatorWithEarnings(address,uint256)", +"a273079a": "addLog(string,string)", +"a2730c23": "EthToAFW(uint256)", +"a273738c": "preICOEndTime()", +"a27411d8": "Earthpayment()", +"a2741bdb": "MAX_CITIES()", +"a2744a22": "addProduct(uint256,uint256,string,uint256)", +"a2752df9": "tokenSetTransferFeeProp(address,address,uint256)", +"a275ee1b": "getDeployTime()", +"a27678c9": "preDGZToken()", +"a277051f": "userAddr()", +"a277b787": "CARXTOKEN()", +"a277d5b1": "totalTokensPurchased()", +"a277fa88": "setWhitelistOn()", +"a2788b58": "ConflictResolutionManager(address)", +"a278ce66": "backWindowAdjustmentRatio()", +"a278fdfb": "bidOnAuctionToBuy(uint256)", +"a27966dd": "finishselfdrop()", +"a2798f0a": "GetQueueNumber()", +"a279c488": "addPending(address,uint256)", +"a27a9e7f": "publicAmount()", +"a27aebbc": "extendTime(uint256)", +"a27b9bf4": "matchcoin(uint256,string,string)", +"a27c1756": "ECONOMY_BOOST()", +"a27c3a2d": "HngCoin(uint256,string,string)", +"a27c672a": "owner_reveal_and_commit(uint8,bytes32,bytes32)", +"a27c794b": "insertDetails(string,uint256,uint256)", +"a27c9af0": "gameDestroy()", +"a27d8298": "leader_3()", +"a27e0e67": "QLFY()", +"a27ee939": "payto3()", +"a280b3db": "preSaleBonus3Time()", +"a280ce8f": "distributeWinnerPot()", +"a280e67a": "leftnum()", +"a28103f2": "batchTransfer2(address[],uint256[])", +"a283063c": "ChargeFee()", +"a2832c97": "CappedDividendToken(uint256)", +"a283c9c5": "getLastBidAmount()", +"a283f907": "addOrderContract(address)", +"a283fd00": "getPendingPaymentAmount(address)", +"a284b6d3": "maxTicketAmount()", +"a28504b4": "isSwapDone()", +"a28555d5": "setTAOFamilyAddress(address)", +"a28576aa": "LogUserRegistered(address)", +"a285f19f": "signedTransfer(address,address,address,uint256,uint256,uint256,bytes,address)", +"a2860050": "estimateReturns(address,uint256)", +"a28641cc": "_buyTile(address,uint256,bytes)", +"a2866a78": "HouseICO()", +"a28812c2": "existingIds()", +"a288237c": "MeSum()", +"a288b609": "releaseOf(address)", +"a288fb1f": "setConfigUint(int256,bytes,uint256)", +"a2890972": "synthesize(uint16[5])", +"a289409b": "addAddressesToAdmins(address[])", +"a289673b": "fipsChangeOwner(bytes20,address,address)", +"a289d187": "depositDividend()", +"a28a1564": "GBToken()", +"a28b1ffd": "isLive(uint32,int256)", +"a28bc99a": "TipSmartToken()", +"a28c644d": "setACLRole5999294130779334338(address)", +"a28c76cc": "initialize(address,address,address,bytes32,uint256,uint256,uint256)", +"a28d0185": "removeComponent(uint256,uint256)", +"a28d57d8": "btc()", +"a28e68d3": "setOnceMintAmount(uint256)", +"a28ecf0b": "sendCryptedHand(bytes)", +"a28f19f8": "AddDroneItem(address,uint256,uint256)", +"a29063c1": "LuckyNumberImp()", +"a290f4f2": "logoPrice()", +"a2919502": "getWalletLibrary()", +"a29256bd": "Ethereum()", +"a292f7d3": "paymentEscrow()", +"a29337bd": "tokensToCompany()", +"a293688b": "triggerFindWinner()", +"a293cba1": "LETSCOIN_Token()", +"a293d1e8": "safeSub(uint256,uint256)", +"a29445a9": "EnclavesDEXProxy(address,address,address,address,uint256,uint256,address,bytes32,bytes32)", +"a294542f": "setPreSaleTLYperETH(uint256)", +"a2948cdf": "futureDevelopment()", +"a294ed7a": "voterAddressOf(uint256,uint256)", +"a2950fd8": "Birth(address,uint256,uint256,uint256,uint256,uint256)", +"a2958b76": "_transferOwnershipOfStorage(address)", +"a29626c2": "createSingleSeedAuction(uint8,uint8,uint256,uint256,uint256,uint256,uint256,uint256)", +"a296b323": "setTransfer(bool)", +"a296fed8": "HitToken(uint256,string,string)", +"a297d43c": "openDistributionContract()", +"a2987245": "getIntArrayIndex(bytes32,uint256)", +"a298ba7c": "AntiqueCoin(address,uint256)", +"a299b155": "setInitialTokensBalance()", +"a29aaad6": "MatreXaCrowdsale(uint256,uint256[],uint256[],uint256,uint256,uint256,uint256)", +"a29b7fa0": "TklnAirdropToken()", +"a29c3574": "OrgonToken()", +"a29cc6c8": "allocateVestedTokens(address,uint256,uint256)", +"a29cd847": "changeEndPreSale(uint256)", +"a29d4859": "drpuToken()", +"a29d578a": "changeABaddress(string,address)", +"a29dbf46": "isAllowedToSend(address,address)", +"a29f9fb9": "onChainAddresses(bytes32)", +"a29fe9b1": "UBOToken()", +"a29ff28d": "receivedStaAmount()", +"a2a02202": "smg(uint256)", +"a2a0d0fc": "pre_endTime()", +"a2a140f9": "MinInvestment()", +"a2a1521a": "SignalPylon(address)", +"a2a17629": "addrBroker()", +"a2a206c0": "ImperoITCoin()", +"a2a23fb2": "getVersionsLength()", +"a2a256b9": "AirDroppedTokens(uint256)", +"a2a3d051": "B3(uint256,string,uint8,string)", +"a2a483ee": "setCS(address)", +"a2a51ccd": "transferToCrowdsale(address,uint256)", +"a2a5243c": "_calculateExcessBonus(uint256,uint256)", +"a2a53c7c": "Exercise(uint256)", +"a2a6aa11": "TileClaimed(uint256,uint256,uint256,address)", +"a2a6ca27": "setMinPerTx(uint256)", +"a2a746e1": "moveToInitiator(address,address,uint256)", +"a2a8336f": "claimEtherSigner(uint256)", +"a2a84a5d": "zonesSwarmAddress()", +"a2a8e279": "getTokensForEther2(uint256,uint256)", +"a2a957bb": "setFee(uint256,uint256,uint256,uint256)", +"a2a96799": "totalSuply()", +"a2a9a6c1": "satellite()", +"a2a9d1ef": "initReverseENS(address)", +"a2aa0724": "enterLottey()", +"a2aaa10e": "DigiCrowdSale()", +"a2ab2686": "participatePresale()", +"a2ac0a1a": "getUserAssetBalance(address)", +"a2ac5360": "calculateFounderCut(uint256)", +"a2aca613": "buyLicense(address,address,string)", +"a2ad16ed": "WinEToken()", +"a2ad360f": "SUV()", +"a2adaf15": "isOpened(uint256,uint256)", +"a2ae72ec": "open_commitment(uint256)", +"a2ae86ac": "setUntsqm(uint256)", +"a2af0e37": "assignPlayer(string,address)", +"a2af5fe9": "content(string,string,string,uint256)", +"a2b038b3": "addOffChainRaisedContribution(address,uint256,uint256)", +"a2b0867d": "Admined(address)", +"a2b0f9f6": "setMaxWeiForVerificationLevels(uint256,uint256,uint256)", +"a2b144f0": "getGasForMcr()", +"a2b1da51": "inflat(uint256)", +"a2b21d7d": "trainSpecial(uint256,uint256,uint256[2],uint256[2])", +"a2b40d19": "changePrice(uint256)", +"a2b424b1": "firstPresaleEnd()", +"a2b475f3": "levelOneBonus(uint256)", +"a2b5591c": "oraclize_query(uint256,string,string[],uint256)", +"a2b60f43": "EmployeeMigrated(address,address,uint256,uint256)", +"a2b6cbe1": "deleteTxDataBlockNumber(bytes32)", +"a2b6f0ec": "addRewardToPendingWithdrawals(uint32)", +"a2b7976d": "bbye()", +"a2b7a18b": "BCE()", +"a2b7e23d": "queueMode()", +"a2b8891e": "getFreeKebaber()", +"a2b8bc77": "domain_reward(address,uint16)", +"a2b946aa": "getNewGame()", +"a2bad039": "getCompte_27()", +"a2bb5d48": "get_username(address)", +"a2bb635a": "WhitelistedAddress(uint256)", +"a2bbeac2": "Shares(string,string,uint256,uint256)", +"a2bc0e31": "testCheckRokTeam()", +"a2bc183f": "secondPlacePot()", +"a2bc1cd4": "getNumEthOfferors()", +"a2bc2eef": "CipherPlayToken(address,address)", +"a2bcb304": "setfanbei(uint256)", +"a2bccae9": "plyrRnds_(uint256,uint256)", +"a2bcee8b": "build_creature()", +"a2bd018c": "targetDiscountValue3()", +"a2be1761": "addDiscounts(address[],uint256)", +"a2be19fb": "assignPoliceToReport(uint256)", +"a2be23cd": "BASIC_RATE()", +"a2be427d": "updatePlayer(uint256)", +"a2bf1d06": "DURATION_NONUSETEAM()", +"a2bf68b9": "membership()", +"a2bf6939": "setTokenValue(uint256)", +"a2bf6f7e": "ClaimedStatus(address)", +"a2bfae64": "mmin(uint128,uint128)", +"a2c030a5": "changeRootAuthority(address)", +"a2c17459": "getCreateUnicornFullPriceInCandy()", +"a2c25131": "LogItemUpdate(uint256)", +"a2c2ed9b": "killContract(uint256)", +"a2c3a542": "getFallbackDepositPeriod()", +"a2c3b256": "receiveCheck(address)", +"a2c3bd83": "TokenInvestment(address,address,uint256)", +"a2c41366": "getIcoBonus()", +"a2c44503": "doesUserHaveBalance(address)", +"a2c4895a": "encodeOperator(uint256,uint256)", +"a2c4a06f": "startTimeOne()", +"a2c4c336": "getPurchaseReturn(address,uint256)", +"a2c4d268": "addToRef(uint256)", +"a2c52c4d": "CoreMediator()", +"a2c6fa83": "transferFromStudio(address,address,uint256)", +"a2c77e68": "isLeftTokens(uint256)", +"a2c8b76b": "getPriceFor(uint256,uint256,uint256,uint256)", +"a2c93406": "blinc()", +"a2c99d47": "rateAfterValidation(uint256,bool)", +"a2c9d630": "manualPrice()", +"a2cc1f62": "disagree(address)", +"a2cdd471": "cc()", +"a2cdd82f": "setAuctionObj(address,uint256,uint256)", +"a2ce0f87": "min_contribution()", +"a2ce4215": "TOKEN_PREICO_CAP()", +"a2ce588d": "roundExpired()", +"a2cff990": "getHeroCurrentLevel(uint256)", +"a2d0b147": "RedTicket(uint256,address)", +"a2d0f942": "canRedeemUTXOHash(bytes32,bytes)", +"a2d10ba5": "kyber()", +"a2d1c624": "checkKingFounder(address)", +"a2d1cf11": "propheciseExecute(address)", +"a2d24c5e": "getFirstTranche()", +"a2d39bdb": "addKey(address,uint256)", +"a2d3e2be": "ReleaseTimeChanged(address,uint256,uint256)", +"a2d435d4": "icoTotalCollected()", +"a2d46832": "speech(uint16)", +"a2d4db9c": "newUpload(bytes32,string,uint16,bytes32)", +"a2d57853": "receiveApproval(address,uint256,bytes)", +"a2d5b8bf": "withdrawBoardMeetingFees()", +"a2d6a926": "CapCoinInternational()", +"a2d6d382": "videos(bytes32)", +"a2d6f8de": "startEarlyStage4()", +"a2d74227": "spendToken(uint256)", +"a2d74b29": "setJobHiringDone(uint256)", +"a2d819b4": "getSenderSig()", +"a2d83b5e": "update(address,uint256)", +"a2d89edf": "bountyInit()", +"a2d97fa7": "TimeLockr()", +"a2da2b47": "ausGroupReleaseDate()", +"a2da84f8": "setCAOAmount(uint256[])", +"a2db644e": "vestingTransfer(address,address,uint256)", +"a2dc7dcf": "initialize(address,address,address,address,address,address,address,address,address,uint256,uint256,uint256,uint256[])", +"a2dc9d9c": "ChangeMessage(string,string)", +"a2dcb5d4": "bindUserWithBoard(uint256,address)", +"a2dd2e96": "InitCancel(address)", +"a2dd3283": "setICOContract(address,address)", +"a2dd9dd3": "canMateWith(uint256,uint256)", +"a2de29d4": "setReleaseAmount(address,uint256)", +"a2de45b7": "Listed_Validated(uint256,string)", +"a2de5b50": "buyWithPromo(address)", +"a2dea26f": "sendAllocation(address)", +"a2deadbd": "getTransactionHash(bytes)", +"a2dee527": "setSaleBonus(address,address,uint256)", +"a2df26f5": "printMarket(int256)", +"a2df6c42": "splitFirst(string,string)", +"a2df7465": "DeepToken(address,address,address,address,address)", +"a2dfa2f0": "buySampleTokens(address)", +"a2e0ee3e": "theWinningReferral()", +"a2e1a8d8": "isOwnerAddress(address)", +"a2e23a51": "TAIL_EMISSION()", +"a2e2842e": "ChannelSecretRevealed(bytes32,address)", +"a2e2998c": "setPricePerMessage(uint256)", +"a2e3750c": "preSaleCSSC()", +"a2e38b54": "getTransactionIds()", +"a2e40e50": "endorse(bytes32)", +"a2e55e88": "IQB()", +"a2e5f168": "DaoAccount(address,address)", +"a2e62045": "update()", +"a2e65477": "changePeriod(uint256,uint256,uint256)", +"a2e7223e": "isNewPlayer(address)", +"a2e7241c": "citizensAddresses(uint256)", +"a2e800ad": "rounds()", +"a2e841ba": "getUnprocessedQueryBytes32(uint256)", +"a2e855a5": "batchFillOrKill(address[5][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[])", +"a2e91477": "publicSaleStarted()", +"a2ea2aaf": "CreateToken()", +"a2ea771f": "receivedTokenOf(address)", +"a2ea7c6e": "getSchema(bytes32)", +"a2ea80f9": "setPayableEnabled(bool)", +"a2ea9883": "OwnerChanged(address)", +"a2eaa896": "winningBidder(string)", +"a2eb0d01": "gift_CreateTINAmotleyLine(string)", +"a2eb164d": "lockUpdateTokenAccount(address,bool)", +"a2ebaa1d": "TEAM_PERCENT_EVE()", +"a2ebb20b": "icoHolder()", +"a2ec191a": "addDSource(string,uint256)", +"a2ec258f": "future()", +"a2ec2957": "updateInvestorDates(uint256,uint256)", +"a2ec5414": "getAllowanceExpiration()", +"a2ee1a27": "sellPrice_wie()", +"a2ee4000": "cancelSalesOffer(bytes32)", +"a2ee8669": "PussyToken(uint256,string,string)", +"a2eeb5d4": "pyramid(uint256)", +"a2f09dfa": "addFund()", +"a2f1607c": "_calcLockRewardPercentage()", +"a2f16d80": "dexWithdrawCollectedFees()", +"a2f182d4": "setLimits(uint256,uint256,uint256,uint256,uint256)", +"a2f23659": "VPCx()", +"a2f26fb2": "FTTIssued(address,address,uint256,uint256)", +"a2f3139c": "stagedVestedLockUpAmounts()", +"a2f35f44": "addNewAddress(address)", +"a2f37360": "addSponsorshipAmount(address,uint256,uint256)", +"a2f39dc6": "OLDSPTI()", +"a2f3ba5b": "setSynthetixState(address)", +"a2f3ede2": "computeNameHash(bytes)", +"a2f44e72": "p_update_action(uint256,address,address)", +"a2f45660": "Purchase(address,address,address)", +"a2f4f550": "getDataPointForSubject(uint256,uint256,int256)", +"a2f56b2c": "refundEth(bytes32,address,uint256)", +"a2f5ee48": "CarbonExchangeCoinToken()", +"a2f6e5fb": "ViewMyDivs(address)", +"a2f77bcc": "getGame(uint256)", +"a2f78d7a": "startICO(address,address)", +"a2f792d5": "AdministratorAdded(address,address)", +"a2f7a2e0": "changeIcoPhaseAmounts(uint256[])", +"a2f7b3a5": "instances(uint256)", +"a2f7b7fd": "callTokenFallbackIfNeeded(address,address,uint256,bytes)", +"a2f7f58f": "getBetAmountOf(uint256,uint256)", +"a2f91af2": "cage(uint256)", +"a2f95b44": "committeesArray(uint256)", +"a2f9eac6": "persons(uint256)", +"a2fa0157": "isAssetActive(address)", +"a2fb1175": "winners(uint256)", +"a2fb342d": "lend(address,uint256)", +"a2fb98fa": "starting_clones()", +"a2fba23c": "holderGroup(address)", +"a2fbe98c": "haveIWon()", +"a2fc0bd5": "BuyEvent(address,uint256,uint256,uint256)", +"a2fc2254": "LAFINAL3()", +"a2fcd1af": "amountRaisedInUsd()", +"a2fd0179": "unlockBatchOfAddressesAfterITO(address[])", +"a2fdea11": "getBonusCoefficient()", +"a2fe802b": "isExit()", +"a3000128": "getContributionHash(address,uint256)", +"a3006abf": "buyBoosterPack()", +"a3006f5f": "CETFToken()", +"a300aa66": "RIKCoin(address,address)", +"a300c6ae": "confirmCollRecv(uint256)", +"a300eadf": "_getAllParents(bytes32)", +"a3011a02": "WatcharaHashCoin1()", +"a301b493": "Milestone_IcoFailed(string)", +"a3022667": "modifyAllLevelCaps(uint256[])", +"a302fdf1": "WHITELIST_BONUS_RATE()", +"a3030b10": "getTournamentBattleResult(int256,int256,uint256,uint256,uint256)", +"a3031b77": "getTradeCount()", +"a3032f25": "claimTreshold()", +"a3035454": "WeiControllerFactory(address)", +"a30376b7": "getReferralCount(uint256)", +"a3045113": "payUp()", +"a304f625": "updateInheritedEarlyParticipantWhitelist(address,uint256)", +"a3053236": "SafeInvestments()", +"a305ac76": "futureHolder()", +"a306e754": "batchIssueTokens(uint256)", +"a3078815": "darknodeOwner(address)", +"a307b727": "refund(bytes32,string,address)", +"a3082be9": "GoodLuck(uint256,uint256)", +"a30872db": "tierContract()", +"a308c2a7": "validReferralCode(string)", +"a30955af": "balanceToken()", +"a309800c": "_withdrawWei(uint256)", +"a309f2ee": "setBalanace(bytes32,address,uint256)", +"a309f589": "crowdsaleRatio()", +"a30a86fe": "setMainSaleParameters(uint256,uint256,uint256,uint256)", +"a30b5c69": "AttributeModel()", +"a30bdea4": "isOffchainWhitelisted(address,bytes)", +"a30c5f17": "get_root()", +"a30cc5f6": "multiFixed(uint256[2][6])", +"a30d5627": "ItemToken()", +"a30d59c9": "getEggsCount()", +"a30eb0ef": "freeTokenTime()", +"a30eddcc": "bitSlice(uint256,uint256,uint256)", +"a30ef9e7": "toBase32(bytes)", +"a30f786f": "allowedRewardTokens()", +"a30fb52d": "sendGameGift(address)", +"a30fbae1": "endBuyBackDate()", +"a310293e": "weiDonated()", +"a31052e8": "clearReleaseTime(address)", +"a3106b95": "setMinterAddress(address)", +"a310f36a": "test2(bytes,uint256)", +"a3111d7c": "withdrawListing(uint256,address,bytes32)", +"a311a08e": "setPartners(bool,uint256,uint256)", +"a311c7c2": "collateralisationRatio(address)", +"a311d157": "addContributor(address,uint256,uint256)", +"a311d970": "TokenTycoonIGO()", +"a311dd70": "setArray(uint8[10])", +"a31271f5": "updCrowdSaleEnabled(bool)", +"a313c371": "memberInfo(address)", +"a31477b4": "getSncTokenIssuance(uint256,uint256)", +"a314acfe": "attemptToClaimCard(address,address[3])", +"a314dc2d": "feePayed()", +"a3155013": "month60Allocated()", +"a315acf5": "minter_address()", +"a315cda0": "priceOfSmartContract()", +"a316aa93": "setActivityDetails(uint256,string)", +"a3179fe0": "getAccountsNumber()", +"a317abc7": "defaultMax()", +"a318d521": "disableBeforeActivation()", +"a3194d50": "setFinished(uint8,bool)", +"a319b232": "VTCoin(uint256,string,uint8,string)", +"a31a9752": "Payout(uint256,bool)", +"a31b858d": "_buyDiscountTTM(uint256,uint256,address,address)", +"a31c5436": "TOKEN_AMOUNT_PRE_ICO()", +"a31caec8": "AkilosToken()", +"a31cc317": "evaluateContract()", +"a31cd710": "_getExpMultiple(int256)", +"a31d291a": "HOHO(uint256,string,string)", +"a31d30a5": "WhitelistUpdated(uint256,string,address,uint256)", +"a31d5580": "Registrar(address,bytes32,address)", +"a31e3678": "addExceptAddress(address,address)", +"a31e5e97": "setHouseAddressOne(address)", +"a31e88c2": "numIntervals()", +"a31f2c52": "partner2_voted_update_prenup()", +"a31f61fc": "setGroupCap(address[],uint256)", +"a31f79fb": "slopeReleasePercentage()", +"a31ffa30": "setCtuContract(address)", +"a3201daa": "setPrices(uint256)", +"a3208c1e": "addUserIntoBlacklist(address)", +"a3210e87": "sendeth(address,uint256)", +"a3221c8e": "step8()", +"a3223d50": "ETHER_MIN_CONTRIB_USA()", +"a322accf": "tokenFallbackExpanded(address,uint256,bytes,address,address)", +"a322c40e": "toString(int256)", +"a322d49e": "FirstTradingEcosystemCoin()", +"a323a748": "SBT()", +"a323af85": "hasTwoStepWithdraw()", +"a323bdb4": "currentPublicSale()", +"a3240455": "offerStarForSale(uint256,uint256)", +"a3246549": "stageOneClosed()", +"a324ad24": "getMonth(uint256)", +"a324cca0": "optimalLog(uint256)", +"a324ed9f": "BurnUnsoldToken(uint256)", +"a324f8bf": "tanksBeforeTheNewTankType()", +"a32508a1": "Carpati()", +"a3262e57": "burnCoin(uint256)", +"a32710eb": "setRole(address,address)", +"a3273535": "tdeDuration()", +"a327a958": "numCourse()", +"a327c45d": "dev1()", +"a328f90b": "_nextBudgetStartAndEndAndOfficalVotingTime()", +"a3293c0e": "handToCards(uint32)", +"a32a6737": "setTotalDeposit(address,uint256,address)", +"a32ac9e1": "Bitcoin_IDToken(uint256,string,uint8,string)", +"a32af535": "depositAndFreeze(address,address)", +"a32affeb": "loadEarlyParticipantsWhitelist(address[],uint256[])", +"a32bf597": "getCurrentRound()", +"a32c3bd6": "GetBounty(address,uint256)", +"a32cb608": "getReverseRate(address)", +"a32ce11e": "approvals(address,address)", +"a32e935a": "allocateTokenForTeam()", +"a32f0f41": "testFailControllerUnapprovedTransferFrom()", +"a330814c": "unregisterAuditor(address,address)", +"a3316ccc": "RATE_SALESTAGE7()", +"a3318359": "sendPrizes()", +"a331939d": "freezeAdmin()", +"a331cd38": "toKeyValue(uint256,string)", +"a3322a12": "getFilesCount()", +"a332853a": "futureDevelopmentFundAddress()", +"a3330574": "checkAndMint(uint256)", +"a333658f": "addTreasuryManager(address)", +"a333f96d": "LogRefundProcessed(address,uint256)", +"a33467cf": "getClue2()", +"a334edf6": "consumeWine(uint256)", +"a3358ae4": "REAPER_INTREPID_EXTRACTION_BASE()", +"a335b828": "FUS()", +"a337840c": "setGuardianRune(uint256,uint256)", +"a338bd2c": "showTopBonusBalance()", +"a338eba5": "sendTokens(address[],uint256)", +"a3393a35": "getDrawEthAmount(uint256,address,uint256)", +"a3395a52": "searchTicketsXaddr(address)", +"a339aaf7": "addOracles(bytes4[],address[])", +"a339abd5": "crowdsaleOpeningTime()", +"a339c18f": "ACNNIco(uint256,uint256,uint256,address,address)", +"a339c21a": "addContractTestToBounty(address,address)", +"a33a5225": "allRefererTokens()", +"a33b7510": "shareAddEtherValue()", +"a33bea16": "GENEOSSale(uint256)", +"a33c0972": "tokenAllocToCompany()", +"a33cbc55": "TCI_admin()", +"a33d4968": "Tripler()", +"a33d5d9d": "EthDev()", +"a33d652e": "setFunding(uint256)", +"a33dd801": "setTreasuryBalance(uint256)", +"a33e1d16": "drapcoin()", +"a33e6b07": "AccountFrozen(address,bool)", +"a33e8d62": "RxEALTokenContract()", +"a33eaa0b": "_setTokenUri(uint256,string,string,string,uint256)", +"a33ed39d": "numRef()", +"a33eff5a": "createResource(bytes32,bytes32,bytes32)", +"a33f3939": "setNetwork()", +"a340295a": "setPhoenixOwners(address[19])", +"a340ceac": "transfekbolOwnership(address)", +"a340cf79": "paid(address)", +"a340d587": "offlinePurchase(address,uint256)", +"a3414653": "COIN_COST_ICO_TIER_1()", +"a3429689": "TaiCoin()", +"a3435da5": "BONUS_LEVEL_3()", +"a3451568": "airdropBatchTransfer(address[],uint256)", +"a3454712": "AssetCreated(address)", +"a34560be": "updateEtherCap(uint256)", +"a34574f0": "gamers()", +"a346b62d": "CaptainKitties()", +"a346e536": "week_winner()", +"a3472270": "mock_getAddress(uint256)", +"a347ef84": "calcpustprice(uint256,uint256)", +"a348ea79": "contests(address)", +"a34945db": "maxAllowedBetInEth()", +"a3494fdc": "expectRefund(uint256)", +"a349bfa2": "addOwner(address,uint256,uint256)", +"a349d683": "FRP()", +"a34ad6b6": "clockmint()", +"a34bbf51": "getGeneralInfo()", +"a34c6716": "testHashing(address,uint256,address,uint256,uint256,uint8,bytes32,bytes32,bytes32)", +"a34cc845": "win(address)", +"a34d2ff7": "votingBymy(bool)", +"a34d42b8": "setContractOwner(address)", +"a34d5312": "registryRequestVendor()", +"a34d5f82": "GiveBlockReward()", +"a34d7c11": "flipCoinWithEther(uint8,uint8)", +"a34d9270": "setMinInvestedLimit(uint256)", +"a34d942b": "FUXEToken()", +"a34dffba": "SILVER_AMOUNT_NDC()", +"a34e5990": "setTier(uint256,uint256)", +"a34e9e66": "approveBcoupons(address,uint256)", +"a34edc03": "assertTrue(bool,string)", +"a34f42a9": "LogRandom(uint256,uint256)", +"a34f82f4": "summFounders()", +"a34fc5ac": "_lockTokens(address,uint256)", +"a350539e": "makeBid(uint32)", +"a3508b17": "getOpenedStageIndex()", +"a35132ac": "SMSReward(address)", +"a3515b98": "initializeWeekData(uint256)", +"a352f1a8": "calcSHA3(bytes)", +"a3536b0c": "calculateHolderPiece(address)", +"a353c600": "Ponged(uint256,string)", +"a35523da": "currentLoanDayTime()", +"a356fdf3": "getPreICOPercentage(uint8)", +"a3577e93": "depositFunds(bytes,uint8[2],bytes32[2],bytes32[2])", +"a357880d": "whitelistedAddrs(address)", +"a3580695": "inSpecialSalePeriod()", +"a358aa18": "_transferFromInvestor(address,address,uint256)", +"a35a319b": "delFromBlackList(address)", +"a35aae9c": "roundID_()", +"a35ae3ab": "Bam()", +"a35bc497": "remainTime(uint256)", +"a35bd437": "toUSD()", +"a35bd591": "newRound(uint256)", +"a35bfcac": "ownerRemoveRole(address,string)", +"a35cad77": "maxLeaders()", +"a35cfa22": "make_move(uint256,uint8,uint8,uint8,uint8)", +"a35d631a": "PausableMock()", +"a35d6dd6": "rDEX()", +"a35d78a6": "_approvedGen1(address,uint256)", +"a35da419": "setlock(bool)", +"a35e617f": "setMaxCount(uint256)", +"a35e83ea": "getReplay(uint256,uint256)", +"a35f9514": "calcDstQty(uint256,uint256,uint256,uint256)", +"a360098f": "Immigration(address,address)", +"a360b26f": "Migrations()", +"a361b184": "move(bytes32,bytes32)", +"a3624b72": "finalizeTransferAddressType()", +"a362858a": "EthereumCashPro()", +"a36298c7": "totalLimit()", +"a362cf0c": "TrueWorld(uint256,string,string)", +"a363f269": "watchMovie()", +"a3641c84": "card_metal_first()", +"a364b5c1": "setProposalNames(bytes32[])", +"a365bd9f": "BaseToken(string,string,uint256)", +"a365f3cc": "Util()", +"a3666d23": "weekTwoPriceRiseBegin()", +"a367b891": "SplitPhaseDistribution(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"a367d99a": "investStart()", +"a367e565": "setIBalances(uint256[],uint256[])", +"a368107b": "SetRecordType(uint32)", +"a369658c": "TARGET_EVE()", +"a369b0ac": "depositsClosed()", +"a369bb28": "SaleWallet(address,uint256,address)", +"a36a0551": "createCarrierFromVault()", +"a36a48a5": "ETH500on719()", +"a36a7526": "setOp(address)", +"a36b15d0": "enableBundlingMultitoken(uint256)", +"a36b8af1": "LogItemModified(address,uint256,uint256,bytes32,bytes32,bytes32)", +"a36badd7": "hasJobRecommendations(address,address,uint256)", +"a36be43a": "SetFreeYOU(uint256)", +"a36be9a1": "paybackDeadline()", +"a36c2cbe": "informarOng(address)", +"a36c8ec2": "UpdateContractorAddress(address)", +"a36db282": "SendLCRTokens(address,address,uint256)", +"a36ddfae": "_0xForkTokenToken()", +"a36f127e": "removePresetTransfer(address)", +"a36f259d": "campaignOf(address)", +"a36ff98b": "team1Points()", +"a36ffd4d": "ADEToken()", +"a37173e9": "transfer_left_funds_to_project()", +"a37218ed": "MAMECOIN()", +"a3721adc": "contractCreationBlockNumber()", +"a37330ea": "getDestroyedWhenRoundOver()", +"a3743afc": "getProjectHour(uint256)", +"a374480a": "placeValue(address)", +"a3744828": "GetPriceByN(uint256)", +"a3747fef": "register(bytes,bytes)", +"a375de4f": "addTokensToBank(address,uint256)", +"a37641ff": "MAX_RING_SIZE()", +"a3766f88": "tokenVendor()", +"a376c19d": "setEventResult(string)", +"a377104c": "init(string,uint256,uint256,uint256)", +"a377b34e": "YoloToken(uint256)", +"a377ff17": "setHorseDataAddr(address,address)", +"a3787858": "resumeBlockNumber()", +"a37889a9": "createPromoGirl(uint256)", +"a378bba5": "gameEnds()", +"a3792985": "getBonusDropsOf(address)", +"a37936f9": "SuspendEmployee(address,uint32)", +"a379e626": "ownerPerThousandShareForBuying()", +"a37a3859": "configPerFund()", +"a37a778f": "SetIPR(string,string,address,string,string,uint256,string)", +"a37ba32a": "duration(bytes32)", +"a37be00f": "transferBackTo(uint256,address)", +"a37be75f": "ethBase()", +"a37c314d": "set_iconiq_tokens(address,address,uint256)", +"a37ccabc": "PositionBought(uint256,uint256,uint256,address,uint256,uint256)", +"a37d1556": "refAmount(address)", +"a37da615": "showInvestedNum(address)", +"a37dec33": "calculateWineSell(uint256,uint256)", +"a37e66f5": "ethPendingManagement()", +"a37e6f69": "failedByDeveloper()", +"a37f00f7": "getItemByTokenID(uint256)", +"a37fd390": "setHomeAdv(uint256,string)", +"a380dcb9": "wpp()", +"a381de54": "bonusAddress()", +"a382aee2": "fourthExchangeRate()", +"a382edfd": "SeeleGold()", +"a38320e6": "TITANToken()", +"a3833a13": "balanceOfColdWallet()", +"a3848b1a": "getMonsterIVs()", +"a384af00": "market_BuyForSale(uint256)", +"a384d6ff": "lowerBound()", +"a38591fc": "test_percOf1()", +"a3863d81": "buyTokensLowLevel(address,uint256)", +"a38717f4": "exFeeTotal()", +"a3875883": "etherPriceUSDWEI()", +"a387cf34": "closeTokenSale()", +"a3885413": "withdrawOwner(address,uint256)", +"a388a836": "DDAContract(address)", +"a3893a33": "changeExchanger(address)", +"a3895fff": "changeSymbol(string)", +"a389783e": "isApproved(address,address)", +"a389ef53": "receiveDeposit(uint256,uint256)", +"a38b68cb": "nonzeroAddressesLengthForApi(uint256)", +"a38b8469": "TokenADSVENTURE()", +"a38b9a19": "printQuotation()", +"a38c48b6": "createProductionUnit2Beta()", +"a38ce2b4": "revokeAddress()", +"a38deeab": "Grid(uint16,uint256,uint256,uint256)", +"a38eb622": "pauseBuy()", +"a38f18a0": "RedBlueToken3()", +"a3907d71": "enable()", +"a3908e1b": "convert(uint256)", +"a3912ec8": "receiveEther()", +"a3916164": "withdrawInvestments()", +"a391c15b": "div(uint256,uint256)", +"a3922eac": "setCategories(address,uint256,uint256)", +"a3926f14": "PixelsMain()", +"a392f54a": "giveMeCoins(uint256)", +"a3934de4": "Upgrade(uint256,address,address,address)", +"a39385de": "transferWithReferenceCallGas()", +"a393dc44": "_totalsupply()", +"a393fb0f": "reducemoney(address,uint256)", +"a39417f9": "LOG_NewBet(address,uint256)", +"a39495f0": "isPreallocated()", +"a394bbc8": "isRegisteredParticipant(bytes32)", +"a395e2cc": "TPLAYToken(uint256,string,string,uint8)", +"a3961207": "amountOfRedemptionPayouts()", +"a3964cb9": "toB32(bytes,address,bytes)", +"a396541e": "getPongvalTxRetrievalAttempted()", +"a397d8e0": "getUnusedBalance(address)", +"a398063a": "setEmergentHalt(bool)", +"a3980dd7": "Readycoin()", +"a3988500": "CloudexchangeCrowdsale(uint256,uint256,address)", +"a398b89b": "receivedEther(address,uint256)", +"a39953b2": "startCrowdsale()", +"a399eb76": "ZoharTC()", +"a39a2b76": "dropUnitPrice()", +"a39a45b7": "replaceOwner(address)", +"a39a70a9": "developReserveTimeLock()", +"a39aaec6": "getCompte_37()", +"a39ab3a3": "bla(address)", +"a39ad747": "minVote()", +"a39b10d2": "lastBlock_a17()", +"a39d716d": "WithdrawBalance()", +"a39db022": "changeBonus(uint256,uint256,uint256)", +"a39dc9be": "HOUR()", +"a39e1149": "getSECOND_STEP_MULTIPLIER()", +"a39eede8": "settleAssets()", +"a39f7449": "startTimer()", +"a39f9712": "sendTokensAfterBuy(address,uint256)", +"a39fa2f6": "VPE_address()", +"a39fac12": "getAddresses()", +"a3a06c54": "endICOPhase()", +"a3a0b937": "transferFokenWhitelisted(uint256)", +"a3a0ee24": "evFreeze(address,uint256)", +"a3a183c1": "overflow(address)", +"a3a187cf": "TokenBought(address,uint256)", +"a3a1cd6d": "getNumberOfKnownPropertyAddresses()", +"a3a1d015": "failUserRefund(uint256[])", +"a3a27105": "stakeholderPayment(address)", +"a3a402a7": "deletefromblacklist(address)", +"a3a40323": "ArtificialNeuralNetwork()", +"a3a40ea5": "getCurrentPhase()", +"a3a4851a": "deliveryReject(address)", +"a3a48785": "unsetClaim(uint256)", +"a3a4a18b": "test_claimShares_emptyFeePool_isTranscoder()", +"a3a4ba31": "createChild()", +"a3a4c74d": "closeAutoFree(address)", +"a3a51983": "updateCurrentStage()", +"a3a5650a": "currentStageMaxSupply()", +"a3a6a43e": "approveUserKYC(address)", +"a3a6c73e": "_isIdExisted(string)", +"a3a7647c": "tier1Count()", +"a3a7b804": "changeMaxGasprice(uint256)", +"a3a7e7f3": "transferAll(address)", +"a3a81d40": "totalBGX()", +"a3a82678": "collectRef(address)", +"a3a9196a": "dexTestNormalTransfer(address,address,uint256)", +"a3a93721": "SYLVIe()", +"a3a9d67b": "AdviserCasperToken()", +"a3aa1913": "balanceDetails(address)", +"a3ab5045": "isNewTile(uint16)", +"a3aba50e": "referrerEnable()", +"a3ad1676": "isPurchasedEpisode(uint256,address)", +"a3adb958": "transferToggleRequester()", +"a3ae2f5c": "award(uint256,address)", +"a3ae88a0": "totalUSD()", +"a3b01f23": "intoverflow_add(uint256)", +"a3b0bff4": "getPersonalStakeActualAmounts(address,address)", +"a3b0c661": "setLineUpEnable_default(uint256)", +"a3b1dc52": "logEscapeHatchChanged(bool)", +"a3b2363d": "parentAddress(address)", +"a3b24dcd": "getSumsHash(address)", +"a3b2938d": "updateStatusInternal()", +"a3b2c41e": "readArticle(bytes32)", +"a3b34190": "unlockSecond()", +"a3b3fff1": "getVotingToChangeMinThreshold()", +"a3b42cba": "register(bytes8,bytes8,uint256)", +"a3b4ab48": "BBPToken(address,uint256)", +"a3b4b07f": "ACL_APP()", +"a3b6120c": "dateStart()", +"a3b61cf0": "getuserprize(address)", +"a3b62bc3": "AdminRemoved(address)", +"a3b65d29": "getarg_3()", +"a3b80993": "WorkValley()", +"a3b8cd3b": "_equipDownOne(address,uint16)", +"a3b908ff": "unusedOf(address)", +"a3b922ca": "buyPandaERC20(address,address,uint256,uint256)", +"a3b959da": "change_dev(address)", +"a3b9b8d1": "receivePaymentForOraclize()", +"a3bbc294": "galleassTransferFrom(address,address,uint256)", +"a3bbf81b": "USACOIN()", +"a3bc3fce": "getFillOrderMinGasNeeded()", +"a3bc6163": "getMessageGas()", +"a3bdc655": "getRemainingTimeTillExpiration()", +"a3be094d": "countTokens(uint256)", +"a3bef4d7": "numVotes()", +"a3bf5b9a": "revokePermission(address)", +"a3bfdf47": "closeSession(uint256)", +"a3bfe069": "_sumActivePerks(uint8[32])", +"a3c07c6a": "removeHatchingTime()", +"a3c0a477": "crowdsaleIsActive()", +"a3c1954e": "supporter()", +"a3c1d83d": "forgiveMeOnBehalfOf(address)", +"a3c28dfc": "eventExists(uint256)", +"a3c2c462": "totalReceived()", +"a3c441e7": "setAdvisoryWallet(address)", +"a3c49da0": "DollarCoin()", +"a3c50b32": "orderDetails(bytes32)", +"a3c66c1d": "notEqual(bytes32[],bytes32[],string)", +"a3c68e3d": "CancelGameAfterResultsPublished()", +"a3c86bef": "AcademyToken(address)", +"a3c88b31": "addInternalBalance(uint256)", +"a3c8ef7a": "signedByWhiteHat()", +"a3c9df3f": "plutocrat()", +"a3c9fc7d": "_withdrawTo(uint256,uint256,uint256,uint256)", +"a3ca17b2": "getUSDETHPrice()", +"a3cb3e97": "removeHatchingTimeWithToken(address)", +"a3cb679d": "getTotalBets()", +"a3cbf67d": "NewBOP(address,address,address,uint256,bool,uint256,string)", +"a3cc8b9c": "changeRateUSD(uint256)", +"a3cd2d78": "nextReward(uint256)", +"a3cd4065": "ReceiveBTC(address,uint256)", +"a3cf3ec0": "lowestAddressReserving()", +"a3d07452": "fightAuction()", +"a3d2078b": "TokenSaleOpened()", +"a3d23e52": "round2Cap()", +"a3d3a265": "setCreditBond(address)", +"a3d4e4b5": "buyItem(uint8,uint8,uint256,uint256)", +"a3d53934": "MegaToken()", +"a3d5e8e0": "_update(uint256,string)", +"a3d5ec39": "PlynToken()", +"a3d646fe": "ETHEUR()", +"a3d658dc": "extendLiquidationPeriod(uint256)", +"a3d6f9a9": "publicKeys(address)", +"a3d7bd43": "doSend(address,uint256)", +"a3d823ad": "changeORACLIZE_GAS_LIMIT(uint256)", +"a3d87805": "TerraToken(uint256)", +"a3d88453": "isAvailableAccount(address)", +"a3d8fdd5": "totalAccessorySeries()", +"a3d94402": "safeMathAdd(uint256,uint256)", +"a3d9c3d1": "ApprovalHash(bytes32,bytes32,uint256)", +"a3dab216": "setOpeningClosingTime(uint256,uint256)", +"a3dc65a7": "wipe(address,bytes32,uint256)", +"a3dc8a7a": "exrate()", +"a3dcb4d2": "receiverAddr()", +"a3dceacb": "MessageSent(uint256,uint256,string,string)", +"a3dd2619": "getCurrentStatus()", +"a3dd2b3e": "projectInfo(address)", +"a3dd3aa7": "setGBT(address)", +"a3ddc24a": "purchaseDeposit(address,uint256)", +"a3de9354": "createDividendWithCheckpoint(uint256,uint256,uint256,int256)", +"a3def923": "create(address,bytes32)", +"a3df30b4": "GIDe()", +"a3df870a": "hentaisolo()", +"a3dfc364": "StartGame()", +"a3dfcb0d": "_setUniqueValue0(uint256)", +"a3dfdf30": "read_i64_array()", +"a3e135fa": "reclaimTokien(address,address,uint256)", +"a3e14d74": "getLowerBoundBlocksTillGameEnd()", +"a3e1f666": "getCreatorMetadataOfHistoricalMetadata(string,uint256)", +"a3e20625": "giveReputation(address,bool,string)", +"a3e20d71": "transferUnPaidFundAccount(address,uint256)", +"a3e29360": "ownedTicketIdList(address)", +"a3e298d1": "VIBETPerEther()", +"a3e2b1de": "getProjectArbiter(bytes32)", +"a3e2ce24": "getTokensAndAmounts()", +"a3e31246": "setLucky()", +"a3e3a8e0": "withdrawEthPool(uint256,uint256)", +"a3e486d1": "ptc_balance(address)", +"a3e4c0c4": "setRandomizer(uint256)", +"a3e667b3": "releaseMany(uint256,uint256)", +"a3e67610": "tokenOwner()", +"a3e7061d": "getPaintingIdAtIndex(uint256)", +"a3e76c0f": "receive()", +"a3e787b5": "FITToken()", +"a3e831b4": "NewTokenFromFactory(address,address,uint256)", +"a3e860fe": "DEFAULT_RATE()", +"a3e8b6db": "MetrumcoinShares()", +"a3ea1376": "removeListingInternal(uint64)", +"a3ea478f": "setTier1Participants(address[])", +"a3eb6436": "TOKETH_PRESALE_TWO()", +"a3ebb0b3": "getConsideration(uint256)", +"a3ebeab7": "testConcatMemory4Bytes()", +"a3ec138d": "voters(address)", +"a3ec5616": "next(bytes,bytes,bytes,bytes,bytes,bytes,bytes,uint256)", +"a3ecbc33": "DSPUnregistered(address)", +"a3efc756": "transferPreICOFunds()", +"a3f144ae": "OFFSET19700101()", +"a3f1bd35": "getDouble()", +"a3f1ee91": "RequirementChange(uint256)", +"a3f22739": "payout(uint256,uint256,bytes32,bytes32)", +"a3f2a813": "StartsAtChanged(uint256)", +"a3f2d2b5": "SZA(uint256,string,string,uint8)", +"a3f31b80": "teamPayment(address)", +"a3f36da3": "ProRataDistribution()", +"a3f3dd32": "Verifier(uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[])", +"a3f424c2": "verifyProof(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[10])", +"a3f4df7e": "NAME()", +"a3f5a178": "approveTakeover(uint256,address)", +"a3f5c03d": "launchInvestment()", +"a3f5c1d2": "nexus()", +"a3f66b46": "newQuestion(string)", +"a3f67d6d": "playersCount()", +"a3f70ed3": "party_a()", +"a3f7c989": "enableStorage(bool)", +"a3f7e26d": "finishMintingIssuer()", +"a3f8eace": "releasable(address)", +"a3f991a5": "totalPot_()", +"a3face0b": "setInteractionPrice(uint256)", +"a3faef60": "MicroBitCoin()", +"a3fb5917": "getFirstOrder()", +"a3fb8f15": "getRaisedPOLY()", +"a3fbbaae": "changeManager(address)", +"a3fc136a": "signedApproveSig()", +"a3fc32c8": "getWLInfo()", +"a3fc81cb": "buyTokensViaBackend(address,uint256)", +"a3fca677": "LogBuy(address,address,uint256,uint256)", +"a3fcafb9": "soldCoins()", +"a3fcf9bc": "operationsPercentOfTotal()", +"a3fd6d0e": "feePaid(bytes4,uint256)", +"a3fdfee3": "deny()", +"a3fe0dc7": "userCrateCount(address)", +"a3fe70cb": "exchangeEnd()", +"a3ff0ea2": "issueAsset(bytes32,uint256,string,string,uint8,bool,address)", +"a3ff31b5": "getTokenStatus(address)", +"a3ff428e": "angelCardSeriesCollection(uint8)", +"a3ffac0d": "td()", +"a400594d": "lockAddress(address,address)", +"a4009e23": "TEST_MODE()", +"a400be54": "coinSendSameValue(address,address[],uint256)", +"a401d24d": "assignToken(address,uint256)", +"a401e585": "withdraw_privatefund(bool)", +"a4036b1c": "getAdPriceHour()", +"a4039098": "StartCompetitionEvent(uint32)", +"a4039a2a": "createNonRepeatableVpfFactory(string,bytes32,uint256,uint256,int256[])", +"a404f291": "microRate()", +"a40544c3": "notifyCancelSellOrder()", +"a4055f62": "freezeAccounts(address[],bool,bool)", +"a40668f5": "testDeregisterProduct()", +"a407db23": "GHK()", +"a407ee79": "bytes32ToAlphabetString(bytes32)", +"a4083849": "right44(uint256)", +"a4086854": "approveTransfer(uint256,address)", +"a4093718": "issueToken(uint256,uint256)", +"a4094a0d": "calculateFeeForAccount(uint256,uint256,address)", +"a409eb7b": "hasRequested(address)", +"a40a485f": "deathData_v3()", +"a40a99ac": "getInsertPointForNumTokens(int256,address,uint256)", +"a40ae4b7": "_uintToBytes(uint256)", +"a40bc352": "crowdSalePause()", +"a40c0a54": "USDGamblingToken()", +"a40c5221": "updateTokenAmount(address,uint256,uint256)", +"a40c8ad0": "addGenesisCatGroup()", +"a40cd3f3": "minContributionInWei()", +"a40cee9c": "updateIdentityImageURL(address,bytes32)", +"a40d32fe": "minPaymentAmount()", +"a40e0b91": "testGoalReached()", +"a40edb07": "processVerification(bytes32,string)", +"a40f1796": "prefixedHash(address)", +"a40fbd2b": "makeKebabs(address)", +"a410424e": "isMoneySent()", +"a4109017": "VanityTransfered(address,address,string)", +"a410a7f2": "getParticipantTickets(address)", +"a410f4b1": "changeFeePercentage(uint8)", +"a4112088": "Add_Company(uint256,string,string)", +"a412c6fc": "getRules(string)", +"a412f87c": "verifyInvestment(address,uint256)", +"a412fcc7": "defineType(string,uint8,uint8,uint32,uint8,uint32,uint8,uint32[5],uint32[5],uint32[5])", +"a413245a": "deductFromBond(address,uint256)", +"a41347e3": "usersCanTransfer()", +"a4136272": "MAX_TOKEN_SALES()", +"a4136862": "setGreeting(string)", +"a4144681": "RK40Z()", +"a414b00d": "SUNToken()", +"a414b379": "addContact(address)", +"a414e089": "Dimacoin()", +"a415833b": "numPurchasesOf(address)", +"a415965c": "refillMultiSigMintPool()", +"a415a93e": "initWithShips()", +"a415b8eb": "getCCH_edit_31()", +"a416b263": "charAt(bytes32,uint256)", +"a416b48c": "getActionCount(uint256)", +"a417357c": "unpauseTokens()", +"a419165e": "TokenCappedCrowdsale()", +"a41942a4": "transferCuratorship(address)", +"a419b0e7": "set_milestone_details(uint256,string,string,string,string,string)", +"a419f1e7": "NewPlayerAdded(uint256,uint256)", +"a41a9445": "getStopTransfer(address)", +"a41b3887": "setPrefixPrice(uint256,uint256)", +"a41b9c31": "unconfirmAddress(address)", +"a41d0584": "fixAddress(address,uint256)", +"a41da348": "fomo3d()", +"a41dedcc": "testAbs()", +"a41e61a4": "minSaleBalance()", +"a41e7d51": "updateERC165Cache(address,bytes4)", +"a41f0069": "GershToken()", +"a41fd917": "getUnprocessedQueryList()", +"a41ff1e5": "maxMintingDays()", +"a4201125": "sanToLower(string)", +"a4202504": "getPhaseSold(uint256)", +"a4202615": "makeAdoptionOfferToAddress(bytes5,uint256,address)", +"a4204e39": "getQuotes()", +"a42214b2": "cancelAuctionEmergency(uint256)", +"a422b761": "tokensIssued(address)", +"a422c0ca": "updateBonusParameters(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"a4230bd5": "addAdmin(address,bool)", +"a4238d31": "receiveBalanceUpdate(address)", +"a4245527": "getPaintingOriginal(uint256)", +"a424fa49": "NPXSToken()", +"a42533c8": "tubParamUpdate()", +"a4254fb4": "couponTokenBountyAddr()", +"a425b752": "destroyStake(address,bytes32,uint256,uint256)", +"a4262254": "calcFib(uint256)", +"a4268de6": "oracleItQuery(uint256,string,string,uint256,uint256)", +"a426cd19": "validPLAContract(uint32,uint32)", +"a4275535": "XTYF()", +"a4276533": "getProposalNum()", +"a427c5d9": "bonus(uint256,address[],address,uint256[])", +"a427ee36": "FruoCoinBETA()", +"a428033f": "minechaincoin(uint256,string,uint8,string)", +"a428517b": "Converted(address,uint256)", +"a4288d17": "tokensForReservedFund()", +"a429845e": "newCrowdsale(bytes32,uint256,uint256,uint256,uint256)", +"a42aa488": "checkRevert(uint256)", +"a42ac803": "getBonusAffiliate(uint256)", +"a42ad8b3": "NomuraDynamicsCoin()", +"a42b0d88": "advisorsPool()", +"a42b6bf1": "setStorageContract(address,bool)", +"a42cb160": "updatePlayerFund(uint256,address,uint256,uint256,uint256,uint256)", +"a42d630c": "SetupMultipliers(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"a42dc008": "newKudosToken(string,string,string,uint8,address)", +"a42dce80": "setFeeCollector(address)", +"a42e16fd": "MultiSig(address[],uint256)", +"a42e36c6": "scheduleTransaction(address,bytes,uint8,uint256[5],uint256)", +"a42ea491": "MrFibreToken()", +"a42ec1bc": "reserveWallet(uint256)", +"a42ecd5c": "setRealRef(address,uint256)", +"a42ef788": "potSwap(uint256)", +"a42f126c": "charityClaim()", +"a42f1edb": "market1()", +"a42f3f9d": "getTAOCurrencyBalances(address,address,address,address)", +"a4316c46": "MarketingToken()", +"a4325485": "getCreatorBalance()", +"a43293b4": "getTransaction(address,uint256)", +"a432cdb0": "Tier_Rainmaker()", +"a432e6d6": "switchToNextPeriod()", +"a4331929": "createNew()", +"a433a0b9": "addRecordByProvider(bytes32,address,string,string)", +"a433d5c6": "IsActiveUser(address,address)", +"a433f390": "approveAndTransferFundToCreator()", +"a4341ab0": "setCount(address,uint256)", +"a4343ae9": "onContribution(uint256,address,uint256,uint256)", +"a43569b3": "getValidatorDescription(address)", +"a43655c4": "rejectRequestPause()", +"a4366a8a": "processPayment(address,uint256,uint256,uint256,bool)", +"a4368de7": "addBonus(string,uint256,uint256,uint256,uint256,string,uint256,string,uint256)", +"a437164b": "assignUserWallet(string,address)", +"a43772bd": "thirdXRChangeBlock()", +"a43796ce": "getSecretSigner()", +"a437ab52": "setDevelopersFee(uint8)", +"a437e07a": "signAuthorship()", +"a437f91f": "doDistroAmount(address[],uint256[])", +"a4381dd4": "StanleyToken()", +"a438d208": "VOTING_DURATION()", +"a43914da": "getRootEdge()", +"a4399263": "finalise()", +"a439d3fa": "ChangeOfRules(uint256,uint256,int256)", +"a43b2ed0": "Test6()", +"a43b5e46": "buyWeapon(uint256)", +"a43b7cd5": "carTaxiToken()", +"a43b92a2": "tournamentIncentiveCut()", +"a43b9423": "triggerPreJackpotLimit()", +"a43be57b": "endPresale()", +"a43c49fc": "mul16(int16,int16)", +"a43c5415": "lastBlock_a3Hash_uint256()", +"a43c6002": "getTokensByGame(uint32)", +"a43cbe1c": "setThirdPartyDepositorDisabled(bool)", +"a43d12a7": "getParticipantesB()", +"a43d76e9": "isValidPrice(uint256,uint256)", +"a43d8654": "getSeason(uint256)", +"a43dc510": "yesBuyer(uint256,uint256)", +"a43e04d8": "removeContract(bytes32)", +"a43e0c2b": "calclulateBonus(uint256)", +"a43ea59b": "PublicSale(address,address,address)", +"a43fecbc": "setUsername(bytes16)", +"a4406bcd": "placeSellOrder(uint256,uint256)", +"a44081d1": "startPhase1()", +"a440a190": "getKeyPrice()", +"a440b21a": "setPortfolioManager(address)", +"a440dd87": "sigExists(bytes32,address)", +"a441698b": "getStockOrderInfo(bool,uint256,uint256,uint256)", +"a441c302": "operationAddress()", +"a442414f": "sumInvested()", +"a4425c55": "lastInvestorsProfitSum()", +"a442b824": "respawnGame()", +"a442d820": "verifyExtraData(bytes32,bytes32,uint256)", +"a4430321": "eachPUSTprice()", +"a4438334": "updateSettings(uint256,uint256,bytes32)", +"a4439890": "sweepUnallocatedDividends()", +"a4439dc5": "commitPeriodActive(uint256)", +"a444502b": "whitelistAccount(address,uint256)", +"a4447515": "getMakerBetBasicInfo(uint256,address)", +"a444ae41": "sourceContract()", +"a444f5e9": "run(uint256)", +"a4453336": "depositGTA(uint256)", +"a4453a96": "totalBuyersMapping()", +"a4453ecf": "splitEth()", +"a445dc5a": "tokensBoughtWithBTC(address,uint256)", +"a445f30d": "setFeeDistributionAndStatusThreshold(uint8,uint16[5],uint256)", +"a4464252": "priceUnitFix(uint256)", +"a447089e": "eniggerToken()", +"a447405e": "_getTravelPrice(address,uint256)", +"a447ff4f": "DXContracts()", +"a4482f41": "setUniquenessIndex(uint32)", +"a448afda": "BalanceChanged(address,uint256)", +"a448f8e0": "OuterContract()", +"a449a62e": "setDSTWalletLMNO(address)", +"a44a00c3": "areTokensSold()", +"a44b1756": "getMyDrugs()", +"a44b47f7": "TotalSupply()", +"a44b6b74": "setColor(uint256,string)", +"a44cff28": "CypressOrganization(bytes,uint256)", +"a44d0eb3": "MAKJLEB()", +"a44da065": "NigerTokenICO()", +"a44dd0f1": "ico2Cap()", +"a44de4e7": "decreaseStepPct()", +"a44e09db": "wadmin_burn(uint256,bool)", +"a44ead73": "ApplyforCertification(string,string,string,string,string,string)", +"a44eda3c": "checkWithdraw(address,uint256,address)", +"a44f40e3": "optionPoolMembersUnlockTime()", +"a4502cb8": "setExportFee(address,uint256)", +"a45066e5": "SingularityTes25()", +"a4516bb1": "SnapshotTaken()", +"a4516fad": "currentGameNumber()", +"a4520aee": "collect(address[])", +"a45230ec": "get_amount_sell(uint256)", +"a4530b4b": "testUpdateProgress()", +"a4534ef7": "remainingSupply_()", +"a453b639": "wuguAddr()", +"a4546876": "roots(address)", +"a454b07b": "checkString(string)", +"a454c5dc": "unlockStep()", +"a45563ed": "UpdateSellAgentBounty(address,address)", +"a4563e03": "totalPendingWithdrawals()", +"a4575296": "pepFarm()", +"a457c2ae": "clientSeed()", +"a457c2d7": "decreaseAllowance(address,uint256)", +"a457e1c0": "purchaseAsset(uint256)", +"a457f27f": "card_titanium_minamount()", +"a45858b6": "setzUint256Array(uint256[2],int256)", +"a458e34f": "setNewContractManager(address)", +"a459ae28": "collectSellFee(address)", +"a45a7371": "executeUpdateTransferFeeRateProposal(uint256)", +"a45b1795": "getAllCardsModifierSecondaryVal()", +"a45c793f": "restore(uint8[176],uint8,uint8)", +"a45cbbf4": "sendAdvisorsTokens(address,uint256)", +"a45cd953": "canPurchase(address,address,uint256)", +"a45d82bd": "signArchive(bytes32,string,string)", +"a45e11ab": "orderMatchBuy(uint256,uint256,uint256,uint256,uint256)", +"a45e1a6e": "getTokenCounters(uint256)", +"a45e7cb5": "addEntry(string,string,string,string,string,address)", +"a45ee32c": "nameOfIdentity()", +"a45f2057": "caltoken()", +"a45f4bfc": "kittyIndexToOwner(uint256)", +"a45f5685": "setOwnerEarnings()", +"a45f71ff": "increaseApprovalPreSignedHashing(address,address,uint256,uint256,uint256)", +"a4604a33": "changeBuyFeePercent(uint256)", +"a460b817": "updateTicketStatus(uint256,uint8)", +"a460bd6c": "presaleRemaining()", +"a4618691": "squak()", +"a4619682": "registerWithDAI(uint256,address)", +"a461cadf": "WHOLE_ETHER()", +"a461fc82": "SELFDESTRUCT_DELAY()", +"a4620d67": "shareholder3()", +"a4623cc4": "addHero(string,address,uint256)", +"a462f87f": "AICoinToken()", +"a462fb7b": "getFinalAnswer(bytes32)", +"a4633704": "NotifyMe(address,address,uint256)", +"a463685f": "AllocatedCrowdsale(address,address,uint256,uint256,uint256,address)", +"a463a500": "setUpgradeHasBegun()", +"a464d265": "editor()", +"a4659ba2": "stakeConfirmed_Eth()", +"a465e6ba": "committeeKickVoters(address,address)", +"a46841e1": "cnyEthRate()", +"a4689d48": "getroundendtime()", +"a4699cad": "resetWithdrawls()", +"a469b809": "getBetAmount(bytes32)", +"a469e5aa": "getOwnerItemIds(address)", +"a46a1219": "AcceptRouting(bytes32,bytes32,uint256,bytes)", +"a46a891e": "fromBase(uint256,bytes8)", +"a46a96d9": "calculateRegionSalePixelPrice(address[16],uint256)", +"a46afef1": "getSponsoring(uint32)", +"a46b3e9b": "treasuryDemurrageAmount(uint256)", +"a46b6593": "sendCandy(address)", +"a46b8171": "excToken()", +"a46c3637": "getWinnerCount()", +"a46c792c": "assignAgent(address)", +"a46c8fee": "ItdFund()", +"a46d11dc": "gType()", +"a46dfb45": "ResolveChips(uint32[])", +"a46efdb5": "getTokensForPreSale(uint256,uint256)", +"a46f3c7a": "getLiveMaxBet()", +"a46fbe1a": "fulfillEthereumChange(bytes32,int256)", +"a46fe83b": "numAssets()", +"a47001a8": "receiveEthPrice(uint256)", +"a470afa7": "Evernal(address)", +"a47255d7": "TimeWeekThree()", +"a472969c": "WithdrawFee()", +"a472c868": "_storeReward(address,int32)", +"a4754fac": "getValidated(uint256)", +"a475b5dd": "reveal()", +"a476f3d3": "demurringFeeNum()", +"a4776955": "setselfdroptoken(address)", +"a4785dfd": "ecverify(bytes32,uint8,bytes32,bytes32,address)", +"a47905cd": "getBondMultiplier(uint256,uint256)", +"a47abd0f": "testIsSuccessful()", +"a47ae542": "getCurrTotalInvest()", +"a47ae71f": "getCurrTypePrice(uint256)", +"a47b1a6c": "getContractsAddrs(address,address)", +"a47c4d64": "isAllocated3()", +"a47c6b84": "cofounderSwitchAddress(address)", +"a47c84bd": "getShiftedTokens(address,uint256)", +"a47ce954": "bonussale_TokenCap()", +"a47e7110": "AnnoMedal()", +"a47e713c": "ACCToken()", +"a47f519b": "CPCE()", +"a47fcc7c": "proposePartnerAllocation(address,uint256)", +"a4800172": "buyDiscountTTMByETH(uint256,address)", +"a48028aa": "valueOf(address)", +"a480ca79": "collectFees(address)", +"a481247c": "isKeyExist(address,address)", +"a48205cb": "emaValue()", +"a4821719": "buyToken()", +"a48255b7": "nextPVPBatleBlock()", +"a4828bca": "TrineChain()", +"a48296d9": "purchasePhoenix(uint256)", +"a484f413": "payJosh()", +"a48515fc": "castConstitutionVote(uint8,address,bool)", +"a48566ba": "serverSeed(address,bytes)", +"a487bcd8": "winners()", +"a487fd07": "ethFundsWallet()", +"a4893536": "_bonusToBettor(uint32,uint8,uint256)", +"a4898fd5": "deployContract(address)", +"a489a2c7": "sanityBounds()", +"a48a663c": "transferFromToICAPWithReference(address,bytes32,uint256,string)", +"a48bdb7c": "results()", +"a48be00b": "activateTokensForJury(uint256)", +"a48c98dd": "deployerAmount()", +"a48cef4a": "oracleInterfaceCountdown()", +"a48d9e70": "getIcoSupply()", +"a48de68b": "createPromoHero(uint256,address)", +"a48e1ff7": "BonusWithdrawn(address,uint256)", +"a48fb972": "_sendReward(address,address,uint256)", +"a49062d4": "MAX_LEVEL()", +"a490a697": "totalBadges()", +"a4923b8f": "placeIndexToOwner(uint256)", +"a492ef60": "Participant(string,address)", +"a4935f1f": "_tokenMetadata(uint256,string)", +"a4938313": "getAdvancedTransfer(bytes32,uint256)", +"a493b39f": "getAdPriceWeek()", +"a494411c": "allocateTokenForAdvisor(address)", +"a4945a07": "ftestnetico()", +"a494817b": "setIdle()", +"a4951771": "MeshPoint(string,address)", +"a4952f19": "LogPolicyPaidOut(uint256,uint256)", +"a4952f80": "getBytesName(string)", +"a49545ec": "useTokens(address,address,uint256,uint256)", +"a495c942": "set_topl_address(address,address,uint256)", +"a4963c0b": "SAPOVAM(address,string,string,uint256,uint256)", +"a49687d1": "stage4Deadline()", +"a4975aff": "raiseNumberOfCheckmarks(uint256)", +"a4978a15": "applyLOT(uint256)", +"a497d8c6": "privateTokenCap()", +"a497e674": "setAuctionDuration(uint256)", +"a4983079": "transferBalanceForPreSale(address,uint256)", +"a49886ce": "testToBytes32(bytes)", +"a4997fac": "propertyAddressOf(uint256)", +"a499bc4a": "DECEX()", +"a49a1e7d": "setMetadata(string)", +"a49a42e1": "CrytoWorldCup()", +"a49bb55c": "currentRoundMultiplier()", +"a49c2bbb": "getBeneficiaryCash(bool)", +"a49cc76c": "createCurrency(string,string,uint8,uint256,string)", +"a49d03bc": "privateSell1Address()", +"a49d53a1": "SmartRevshare()", +"a49d6be2": "shekel()", +"a49e0ab1": "complex()", +"a49e4540": "mintCapInETH()", +"a49ea0ab": "rankOf(bytes)", +"a4a01e33": "payoutRewardsFor(address)", +"a4a0d801": "valueOfContract()", +"a4a1485b": "createEthInvestorRequest(uint256)", +"a4a1a78d": "CertAdminAdded(address)", +"a4a1a9bc": "fightTeams(uint16,uint8,uint8)", +"a4a1e263": "getUsersCount()", +"a4a249d6": "quicksort(uint256[])", +"a4a2a9f6": "init(address,uint256,uint256)", +"a4a33638": "NAST()", +"a4a339ee": "doMint(uint256)", +"a4a3513c": "Accelerate(uint256)", +"a4a46f45": "LOG_InvestorEntrance(address,uint256)", +"a4a47582": "Pyrgressive()", +"a4a4c224": "setAngelLastBattleTime(uint64)", +"a4a5a46e": "EUNO()", +"a4a5e241": "setPrizeEndTime()", +"a4a5f550": "price_exponent2()", +"a4a6795a": "ReserveSupply()", +"a4a68e44": "userlogin(address)", +"a4a691ce": "parseResultCompatible(bytes)", +"a4a75c6e": "tokensSoldAmount()", +"a4a75edc": "registerDeal(address,address)", +"a4a7cf5c": "redeemWinnings(bytes32)", +"a4a83317": "emitChange(bytes32)", +"a4a85b22": "fund(address,address)", +"a4a8f8ea": "migrationHost()", +"a4a92dd0": "_createToken(string,address)", +"a4a94567": "setTokenContract(address,address)", +"a4aac6ec": "diff(int256[])", +"a4ab3e45": "buyerAddressTransfer(bytes32,address,address)", +"a4ab69cd": "cancelBuyOffer(uint32)", +"a4ac3e7d": "FrozenFu(address,bool)", +"a4acbcd6": "pregnantpuppies()", +"a4ad1a5f": "verEntidades()", +"a4adb24b": "createCourse(string,string,uint256)", +"a4adc2f7": "freezeTokens(uint256)", +"a4adc431": "fechVoteResultForCandidate()", +"a4adcde3": "getSingleGuessInfo(uint32)", +"a4ae32fd": "sampleBool(bool)", +"a4af1d1a": "totalPublicSaleStage()", +"a4afaeb0": "AutoKen()", +"a4b03f52": "internalLockAccount(address)", +"a4b06df2": "heapSort(uint8[])", +"a4b0a36f": "exchangeRateUSDToToken()", +"a4b159c0": "benefitMicros()", +"a4b16449": "transferTokensFromRetailersAddress(address,uint256)", +"a4b195ff": "numVoters(uint256)", +"a4b1b020": "transferLockedTokensBackToUser(uint256)", +"a4b1ce55": "scheduleCall(address,address,bytes4,bytes,uint8,uint16,uint256,uint256,uint256,uint256,uint256,uint256)", +"a4b31eb1": "bitWatt(uint256)", +"a4b32bd7": "modifyRent(uint256)", +"a4b3b042": "RDXToken()", +"a4b48828": "getOffer(address,address)", +"a4b52ef2": "hgt()", +"a4b5fa56": "blacklist()", +"a4b7459a": "transferFromToICAPWithReferenceCallGas()", +"a4b7f5ce": "resolutions(uint256)", +"a4b8a543": "sacarETH()", +"a4b8c2e7": "restart(bytes20,bytes32)", +"a4b910fb": "WithdrawToken(uint256)", +"a4b916e2": "mintB2BC(address,uint256)", +"a4ba2971": "addMemoryImageSlice(uint256,bytes)", +"a4ba5bdb": "Leonidas()", +"a4bad0ae": "vestingsBalance(address)", +"a4bb1324": "initGame(address,uint256,bytes32,bytes32,bytes32)", +"a4bb252e": "LogGameCreated(uint256)", +"a4bb43d2": "Beonbox()", +"a4bbded4": "MAX_ICO_SUPPLY()", +"a4bbf1a7": "LAUCHCONTRACT()", +"a4bc51d4": "PrivateSocialPlatform()", +"a4bce83c": "CSCToken()", +"a4bd7a20": "currentBoundary()", +"a4bd7b8d": "countApproval()", +"a4be2ea2": "HardClear()", +"a4be64a4": "warriorBlock()", +"a4beda63": "lockTime(address)", +"a4bef732": "userCancelOrder(address,address,uint256,uint256,address)", +"a4beffa7": "increaseInvestment()", +"a4bf594b": "CORENETCOIN(uint256,string,uint8,string)", +"a4c089be": "debug_finalizeBundleIPFS(bytes32,string,bytes32)", +"a4c0ed36": "onTokenTransfer(address,uint256,bytes)", +"a4c0fd51": "onlinenewsbalita()", +"a4c1e9c0": "depositToUser(address)", +"a4c3dfa4": "buff()", +"a4c3e789": "RUB_Omnidollar()", +"a4c44074": "setCashbackManager(address)", +"a4c4dfea": "WGNToken()", +"a4c4f172": "_arrayContains(uint8[],uint8)", +"a4c5bf66": "removeSkipPrice(uint256)", +"a4c64d78": "getContractDividends()", +"a4c6569b": "isWhiteListed(bytes32)", +"a4c673c5": "pauseInvest()", +"a4c6fcde": "allowEscrow(bool)", +"a4c756c7": "tokenAllocToTeam()", +"a4c7c7b3": "partner1()", +"a4c89322": "ethToTokens(uint256)", +"a4c8b35d": "moneyManager()", +"a4c93cab": "setDistributionSize(uint256)", +"a4c97967": "proof_of_public_key()", +"a4c9b0ca": "deleteTx(bytes32)", +"a4c9bb28": "VLOGCoin(uint256,string,string)", +"a4ca80be": "lockFile()", +"a4cae72b": "_createEtherDog(uint256,uint256,uint256,uint256,address)", +"a4caeb42": "periods()", +"a4ccd1ba": "breakevenLevel()", +"a4cdbd14": "changeSwapLifetimeLimits(uint256,uint256)", +"a4ce48c0": "addProposal(bytes32,uint256,bytes32)", +"a4ce8683": "create(string,string,uint8,address,string,address)", +"a4d1f29f": "BifrostToken()", +"a4d22c13": "enableDonation()", +"a4d28b62": "getMedalsBurned(uint16)", +"a4d33646": "setELIXAddress(address)", +"a4d4f070": "get_token()", +"a4d55686": "totalEthFundRecieved()", +"a4d575ce": "_forward(address,bytes)", +"a4d5a3a5": "airdropAmount(uint256)", +"a4d5a519": "TXwithCode(bytes32,uint256)", +"a4d5e30e": "removeHatchingTimeFee()", +"a4d66daf": "limit()", +"a4d66f1e": "calcReleaseToken(uint256)", +"a4d67d63": "finishGenerating()", +"a4d69fd3": "payoutMethodABI()", +"a4d6bb2b": "latestPayout()", +"a4d714c7": "addressToBytes2(address)", +"a4d72886": "PRE_ICO_RISK_PERCENTAGE()", +"a4d755ff": "setFactoryName(uint256,string)", +"a4d82f95": "Wallet6()", +"a4d840a8": "getInvestorInforMax(uint16)", +"a4d8b40a": "order2Shares(uint256)", +"a4d904ba": "foundersStake()", +"a4d91b02": "createtoken(string,string,string,string,string,string)", +"a4d924b6": "extractableFraction()", +"a4d95c76": "setRobotCoinContract(address)", +"a4d97569": "ACLYDCoinContract()", +"a4d99522": "setCryptaurRecovery(address)", +"a4da79a7": "_tokensOfOwner(address)", +"a4db2e9a": "initDao(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"a4db8c73": "BieberToken()", +"a4dbafbb": "batchReturnTokens(uint256)", +"a4dbbbf1": "joinWithCandy(address,uint256,uint256)", +"a4dd73cd": "isMinimumValue()", +"a4ddf312": "numberOfPunksToReserve()", +"a4de3c19": "setFeeAccount(address,bool)", +"a4de64c4": "isFundedMini()", +"a4df0758": "isClaimed(address,address)", +"a4df320d": "end_LOCKUP()", +"a4df6c6a": "freezeTokens(address,uint256)", +"a4df8ca1": "See_TokenPurchaser_Number()", +"a4dff0a2": "zzz()", +"a4e01230": "RamenContract()", +"a4e02fcc": "transferProfit(address,uint256)", +"a4e24173": "getUsersArtefactsIds()", +"a4e2d634": "isLocked()", +"a4e3374b": "transferDelegated(address,address,uint256)", +"a4e339c1": "validate(address,uint256,bytes32,bytes,bytes32)", +"a4e360c8": "getApprovals(uint256)", +"a4e4a7bb": "avatar(address,bytes)", +"a4e6dd3a": "coinDrain()", +"a4e85358": "getTEth(uint256,uint256,uint256)", +"a4e8e360": "enterFreeRaffle(uint256[],uint256)", +"a4e9bcb8": "vxtestPrivateSale(address,address)", +"a4ea471f": "getBoardRowDetails(uint256,uint8)", +"a4eacb34": "removeFromBountyProgramMap(address)", +"a4eaec5f": "targer()", +"a4eb5710": "needReleaseFor(address)", +"a4eba44d": "setPriceCoolingPeriod()", +"a4ebf74d": "CorsariumAccessControl()", +"a4ec0620": "getAllCoins()", +"a4ec11b1": "getStepFunction(uint256)", +"a4ece52c": "pop()", +"a4ed22b6": "testInsertLawyer()", +"a4edff47": "addNote(string)", +"a4ee7c18": "_computeCommission(uint256)", +"a4eed4dd": "setupWhitelist(address,bool)", +"a4ef2cbb": "setWhiteListAgent(address)", +"a4efc580": "lastPriceCheck()", +"a4f0d9b1": "setCut(uint256,uint256)", +"a4f15498": "projectedPrizeForPlayer(address,uint256)", +"a4f2613d": "bid(string,string)", +"a4f28bdd": "fundingMinInEth()", +"a4f29aad": "setTokenName(string)", +"a4f35b65": "minTransfer()", +"a4f3fa10": "getToday()", +"a4f4662f": "getOwnersTokenIndex(address,uint256)", +"a4f5b8c1": "bonusCreationRate()", +"a4f63ec8": "setBytesArrayIndex(bytes32,uint256,bytes32)", +"a4f6d5ce": "BeeGims()", +"a4f7c2b7": "getLeftChildI(uint256)", +"a4f82f27": "allocationOf(address)", +"a4f89235": "SALE0_CAP()", +"a4f91a2e": "remainingOwner()", +"a4f927d5": "certifyAccount(address,bool)", +"a4f939a1": "_touched(address,address)", +"a4fa75cf": "StartIcoStage()", +"a4fa8d57": "reward(uint256,uint256)", +"a4fac56e": "rateForOnePTM(uint256)", +"a4faf89e": "incentivesOut(address[],uint256[])", +"a4fd3cea": "getToken(uint256,uint256)", +"a4fd6f56": "isEnded()", +"a4fda741": "usedResidualAmount()", +"a4fde8bc": "player_declare_taking_too_long()", +"a4fefad6": "_currentSupply()", +"a4ff83f5": "warriorsByPlayer(address,address)", +"a4ffd7fa": "noOfICOPhases()", +"a5007da7": "openEgg(uint256,uint256)", +"a50097f2": "getUserEthVolumeSaldo(address)", +"a501123d": "doRollBet(uint256,uint256,bytes32,bytes32,bytes32)", +"a501553e": "getAssetLength()", +"a501ab39": "sendToMe()", +"a501e88d": "Content()", +"a5021a17": "getNodePrice()", +"a5025222": "addressExists(address)", +"a502aae8": "getNextGenerationId()", +"a502bfbd": "invest(address,uint256,bytes)", +"a503473a": "mul2Assert(uint256)", +"a50395cf": "totalPetCardSeries()", +"a504bd0d": "nextTradeEvent()", +"a50569b7": "addUNISSUEDBALLOTPAPERS(uint256,uint256,uint256,uint256,uint256)", +"a50643b7": "getPrizePoolSize()", +"a506e5dc": "transferLand(uint256,uint256,address)", +"a5075567": "RegistrationAntique(bytes32)", +"a50776dd": "managementLocked()", +"a507afd5": "burniEther(uint256)", +"a508ae0f": "P2TCToken()", +"a508dd1d": "OldCanYaCoin()", +"a509b030": "recentActivityIdx()", +"a50a1fe6": "remainingAmount()", +"a50b21c8": "getInputData(uint256,uint256)", +"a50c386a": "exFeeRate()", +"a50cd8e7": "votesFor(address)", +"a50cf84e": "ICO_PHASE2_PERIOD()", +"a50d81c7": "mintForOwner(address)", +"a50e20c1": "checkProfit(address)", +"a50ec326": "deposite()", +"a50ed19b": "setCooldown(uint256,uint256)", +"a50edca0": "fiat()", +"a50f2a25": "AirdropSingle(address,uint256)", +"a510921e": "SaleStop()", +"a510f776": "setCompany()", +"a510fd2b": "returnBetFromGladiatorBattle(uint256)", +"a512fb25": "Purchased(address,uint256)", +"a5135634": "avalibleSTCTokens()", +"a51548a1": "CryptoPainting()", +"a515aaeb": "cdFee()", +"a5171828": "MillionDollarToken()", +"a5177400": "minimumContributionPhase3()", +"a5181756": "AdameToken()", +"a519419e": "depositoryDelegate()", +"a51a38cf": "MasharibCoin()", +"a51a6054": "roundLeader()", +"a51a8682": "saleTransfer(address,uint256)", +"a51ad03f": "isFirstYear()", +"a51aea2d": "changeMaxMultiplier(uint256)", +"a51af4c5": "distributorAddress()", +"a51b79e3": "changeYumAddressTo(address,address)", +"a51ba542": "deleteMonsterIndexToApproved(uint256)", +"a51bb77a": "getInvoiceHashAddresses()", +"a51d5924": "transferMain(address,address,uint256)", +"a51d5f02": "RemoveOwners(address[])", +"a51db46b": "changeDX(address)", +"a51e62a1": "developmentAuditPromotionWallet()", +"a51e81bb": "TRexCoin()", +"a51f3782": "investor_getMediumInfo(address)", +"a51f41a0": "setConfig(uint256,uint256,string,string,uint256)", +"a51fbb3f": "approveTokensWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"a51fe113": "start(uint256,uint256,address)", +"a52079ea": "balanceBlocksIn(address,uint256,uint256)", +"a521036c": "feePaymentEnabled()", +"a5214f77": "setContext(bytes32,address)", +"a521ebfa": "refundPresale(address,uint256)", +"a521f09f": "Greenbow()", +"a522ad25": "withdrawTokens(address,address)", +"a523b88a": "like()", +"a524ce4f": "deliverPresaleTokenToClient(address,uint256)", +"a525663a": "updateOwnerProprietaryData(uint256,string)", +"a525f42c": "transferFromToICAP(address,bytes32,uint256)", +"a526c826": "ICOBuyer(address,address,uint256,uint256)", +"a526f74f": "PRICE_AFTER_SOFTCAP()", +"a527096e": "preallocate(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"a5289158": "end(address,address)", +"a528cb4f": "currentNumberOfRares()", +"a528fec4": "setSecureFees(bool)", +"a5290f74": "phase_2_rate()", +"a5294f93": "CryptoTradeToken()", +"a5295ae4": "AaaToken(uint256,string,uint8,string)", +"a5298955": "setAllHatchConfigs(uint32[],uint256,uint32[])", +"a52a0f8e": "getIntervalCoefficientMultiplier(uint256,uint256,uint256)", +"a52b121e": "faucetThresholdSecs()", +"a52b2b88": "hasWon(address)", +"a52b904b": "ScoreToken(string,uint8,string,string)", +"a52bc175": "Essential()", +"a52c0512": "getNumIncorrectDesignatedReportMarkets()", +"a52c101e": "send(uint256)", +"a52c11a6": "setBalance(uint8,address,uint256)", +"a52c34c3": "shopSettings()", +"a52c9efd": "updateIncrease(uint256)", +"a52cf5a4": "HanlinTestToken(string,string)", +"a52dc2e7": "blockN()", +"a52e6180": "setDiamondAuctionAddress(address)", +"a52ef9b0": "look_for_node(address)", +"a52f365a": "dissmisPurse(uint256)", +"a52f89fa": "nujaBattleTransfer(address,uint256)", +"a5304fc3": "ownerSetJpMinBet(uint256)", +"a5313069": "StairStepDecayingTokenFunction()", +"a53260c1": "migrateEthers()", +"a53290ab": "getClassTransformInfo(uint32)", +"a53324b5": "mint(uint256,string,uint8,string)", +"a53367dc": "ICOBuy()", +"a533daf7": "investmentPositions()", +"a533fb8d": "_mintToPool(uint128,uint256,uint128)", +"a534150c": "feePpm()", +"a536ae38": "payBidAllocationFee(bytes32,uint256)", +"a536cffd": "assertEq6(bytes6,bytes6,bytes32)", +"a536dbe8": "getCurrentPrice(uint256,uint256,uint8)", +"a5374005": "paymentsProcessor()", +"a537b716": "applyWithdraw(address,uint256)", +"a53818ca": "setNodeAllocation(address)", +"a53830e3": "numVotes(address)", +"a538d287": "getMinMax()", +"a53a1adf": "approve(bytes32)", +"a53a4747": "setOperatingCost(uint32[5])", +"a53aeb4e": "accumulate()", +"a53b1c1e": "setInt256(int256)", +"a53bfcf5": "varTokenAllocation(uint256)", +"a53c6dd4": "splitComissions(uint256)", +"a53c7b45": "setGameStatus(bool,string)", +"a53cb8ca": "setWhitelistTokens(address,bool,uint256)", +"a53d5205": "stepTwoLockEndTime()", +"a53d66e4": "changeAuxPartner(address)", +"a53ec007": "changeAirLimitCount(uint256)", +"a53f0e14": "addGrant(address,uint256,bool)", +"a53f138a": "updateTeamsTableAttributes(uint256,uint256,uint256,uint256)", +"a54016a0": "set_price_in_micro_ether(uint256)", +"a5403b3b": "secondaryLedgerCount(string,address)", +"a540db73": "triggerCooldown(uint256)", +"a5410a66": "kycVerified(address)", +"a5417f64": "decreaseICOEndTime(uint256)", +"a541a2a2": "projectCreator()", +"a5422d8a": "mineSoul()", +"a542a02f": "lookupAllSprites(uint256)", +"a542c3d7": "stageDevelop()", +"a54315fd": "SetBuyoutPrice(uint256,uint256)", +"a543a7e5": "addLockUpData(address,uint256[],uint256[])", +"a543bae7": "createSwap(bytes20,address)", +"a5440fa0": "GetAll()", +"a54447aa": "purchaseCard(uint256)", +"a544594e": "donateDAI(uint256)", +"a544805c": "CentralityGiftShop()", +"a544f062": "finanReserveWallet()", +"a54527d5": "AllSpringChainToken()", +"a54580f2": "drive()", +"a545ff0c": "withdrawRemainingEthAfterAll()", +"a5460352": "_validatePurchase(address,uint256,uint256)", +"a54677e3": "getOptionTitleForPoll(uint256,uint256)", +"a5468081": "Pyramid(address)", +"a546cbf7": "core(uint256)", +"a546f2e7": "changeNewHDX20Contract(address)", +"a5473276": "slice(uint32[],uint8,uint8)", +"a5473f78": "withdrawOrderRefundToOrder(uint256)", +"a54799bd": "Person(string,address)", +"a547adce": "lastBlock_f16()", +"a547ec4c": "setTime(uint256,uint256,uint8)", +"a548617c": "SampleCrowdsale(uint256,uint256,uint256,address,uint256,string,string,uint8,uint256)", +"a5488a37": "allowTransactions()", +"a54940b1": "Devable()", +"a5496781": "NamiMultiSigWallet(address[],uint256)", +"a5496e60": "newProposal(uint256,string,string,uint256,uint256)", +"a549ac10": "mintNFTForSale(uint256,string,uint256)", +"a54a2b8b": "testBlockHashFetch()", +"a54b2a73": "burnPool()", +"a54baeda": "removeAllowedLock(uint256)", +"a54c03e2": "distributeStakingShare(bytes32,uint256)", +"a54c2a9a": "removeListing(uint64)", +"a54cd4f7": "minParticipants()", +"a54d396e": "internalAction()", +"a54e1ec4": "SubpreferToken()", +"a54efb1e": "BKB()", +"a54ff9ac": "downvotePost(bytes32)", +"a5500c30": "setAirdropAmount(uint256)", +"a5502b01": "Total_Players()", +"a550f86d": "named(bytes32)", +"a5512db0": "setTSTC(address)", +"a5513af5": "checkPrevOwner(bytes32)", +"a55168ea": "SendEtherToAsset(uint256)", +"a551878e": "fix()", +"a551de87": "MonethaAddressSet(address,bool)", +"a55231f4": "declareEmergency(string)", +"a552c8a0": "LogSendFail(uint256,bytes32)", +"a553506e": "checkData(bytes32)", +"a5536fe7": "mutable()", +"a553748e": "listingActive(uint256)", +"a5537586": "conversionOfferedAt()", +"a553a597": "configure(uint256,uint256,uint8,address)", +"a553c4d2": "tier2LOT()", +"a553e1da": "getUserTokensCount(address)", +"a5541ca2": "AICT()", +"a554a72e": "POINTS_TO_SPEND()", +"a55526db": "touch()", +"a55545a9": "EthVocToken(uint256,string,string)", +"a556a057": "ZAPAX()", +"a557f834": "month24companyUnlock()", +"a558410a": "test_twoValidEqUint(int256)", +"a5584456": "addDiscount(address,uint256,uint256)", +"a559217c": "raisedEther()", +"a5595683": "lockBalance(address,uint256,uint256)", +"a559ec20": "upgradePendingExchange(address,uint256)", +"a55a2577": "addHpbNode(address,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"a55b13c8": "validOtherSource(string)", +"a55bbff9": "setDatePayout(address,uint256)", +"a55bfdc4": "getPhasesCount()", +"a55c51d8": "havven_escrow()", +"a55c974f": "tokenXstepCAP()", +"a55cab95": "getName(uint8,uint8)", +"a55cc1cc": "newTokenWeiPrice()", +"a55cd51c": "updateMaxBet(uint256)", +"a55d260d": "depositNoRef()", +"a55deccb": "locked(address[],uint256[])", +"a55e9370": "getDateCount()", +"a55ec39d": "BulkTransfer(address[],uint256[])", +"a55ee823": "BYN()", +"a56024d8": "deleteUserForUser(string,uint8,bytes32,bytes32)", +"a5603f02": "getCurEarlyIncomeByAddress(address)", +"a5609ab5": "enableDepositTo(bool)", +"a560a956": "duelAnotherCovfefe(uint256,uint256)", +"a5613724": "Start1()", +"a561b1c2": "executeBatchTransfer(address[],uint256[])", +"a56226ef": "officialApplicationSignUp(string)", +"a5622c94": "xEURCoin()", +"a5627d32": "callDeposit(uint256)", +"a564871f": "ctWallet()", +"a56539a4": "_addLock(uint256,uint96,address,uint256)", +"a565efff": "countWinners()", +"a566d383": "softCapCHF()", +"a5670c80": "get_sale_arbits_per_ether()", +"a56793ae": "addCoin(uint256)", +"a567d371": "prepareForRefund(address,address)", +"a568907a": "SUCToken(address)", +"a568a09d": "BuyShareWithDividends(uint32,uint256,uint32,address,address)", +"a56a1de0": "Mortal_HelloWorld()", +"a56b3d11": "setNewCdFee(uint128)", +"a56b60ee": "_removeFromBlacklist(address)", +"a56be205": "developer_new_price(string)", +"a56befd1": "required_number_players()", +"a56c2ac0": "totalWeiRefunded()", +"a56c5be1": "WithdrawConfirm(uint256,uint256)", +"a56d1de3": "valueOfVault(uint256,address)", +"a56d7601": "getPlayerTickets(address,uint256,uint256)", +"a56d96bb": "unmint(uint256,string)", +"a56d9dda": "getCosigner(bytes32)", +"a56dfe4a": "y()", +"a56e7213": "unpausePending()", +"a56e7bae": "getTitleAddress(uint256)", +"a56f2d5f": "AutoMOBILEtoken()", +"a56f5b53": "withdrawDonations(address)", +"a56f9bea": "KarTokenERC20Advanced(uint256,string,string)", +"a5705d17": "performUpdateStackPtr()", +"a57229bd": "linkToNewHouse(address)", +"a572ba41": "CEL(uint256,string,uint8,string)", +"a5731c1c": "getTXSAddress(uint256)", +"a57366e7": "changeSubcourtJurorsForJump(uint96,uint256)", +"a573a9f4": "Bilateral()", +"a57429e2": "getWinConditionInLibra(bytes32)", +"a5749710": "getCurrentBalance()", +"a574cea4": "getMetadata(uint256)", +"a5752034": "changeRound(uint256,uint256,uint256,uint256)", +"a57544da": "right36(uint256)", +"a5758552": "redeemTokens(address)", +"a5766aa6": "setFeePercentage(uint8)", +"a577efd4": "closePot(string)", +"a578ae32": "getApprobation(uint256,address)", +"a578e38a": "RadiumSupply()", +"a5790bde": "toBytes1(bytes)", +"a57918dc": "ptc_addr()", +"a579349a": "currentStageRemainingJM()", +"a579e461": "SetAdminContract(address,address)", +"a57a84a6": "sendPending()", +"a57b54b7": "excTx(uint256)", +"a57c0919": "update(uint256,uint8,address,address,string,string)", +"a57c6e86": "sellTokens(address,uint256,uint256,address,bytes)", +"a57ce52f": "_removeKeeper(address)", +"a57d1560": "lottery(uint256)", +"a57d814b": "MONACOESTAT()", +"a57e768c": "SetLockAddress(address,bool)", +"a57f57f8": "TBToken()", +"a57f59c0": "getMatchInfoList02()", +"a57f6500": "readCTDdata(uint256)", +"a5804521": "StateChanged(bool,string)", +"a58079fc": "FIXED_PRESALE_USD_ETHER_PRICE()", +"a58091cd": "privateSaleSencPerMEth()", +"a58092b7": "getSanityRate(address,address)", +"a580a5b0": "setRepayment()", +"a58180b4": "_batchBuild(uint256[],int256[],int256[],uint8[])", +"a581a27a": "owner_balance()", +"a581c333": "getSHA256(bytes)", +"a581ff0e": "CopyrightExchangeToken(uint256,string,string)", +"a5820daa": "issueTokens(uint256)", +"a5828b7d": "payBonus(address)", +"a583535d": "addCutie(uint32,uint256,uint256)", +"a5841194": "sync(address)", +"a5842415": "Cubes(uint256)", +"a5843f08": "init(uint256,uint256)", +"a5847862": "sizeOfString(string)", +"a584d8cc": "startProduct(string,string,string,int256)", +"a58561ec": "DISCOUNT_STAGE_TWO()", +"a5857318": "getIdArrayItemsCount(address,uint256,string)", +"a586fd0f": "_substring(string,int256,int256)", +"a587686d": "addCardToEdition(uint8,string,uint8,uint8,uint256,uint256,uint256)", +"a5878c65": "addPrivatePresaleTokens(address,uint256,uint256)", +"a587c9f7": "bountyTokenAddress()", +"a587cd36": "DisableSetTransferable(address,bool)", +"a587da29": "setPackage(bytes,uint8,uint8,uint8,bytes)", +"a588a968": "rushitesticoToken()", +"a5891bb0": "modifyWhitelistMulti(address[],bool[])", +"a5898832": "getReferrerRewards()", +"a58ac1a1": "buyTokensInternal(uint256)", +"a58b2e43": "LendingLiquid()", +"a58b55a9": "StreamityEscrow(address)", +"a58b7eed": "setFlags(address,address,uint256)", +"a58ba458": "multiTransferTightlyPacked(bytes32[],address)", +"a58c07ee": "fetchOrderByIdWithPayerByAdmin(string,address)", +"a58c30c5": "block2()", +"a58d3ad1": "dumpCube(bytes,bytes32)", +"a58daf76": "setAuthorizedToDraw(address)", +"a58fd85b": "setReflectSwitch(bool)", +"a58ff4fc": "deletThisContract()", +"a590529e": "updateWithPositionHint(uint32,uint128,uint128,uint32)", +"a590799a": "refundInvestment(address,uint256)", +"a59162eb": "OWEToken()", +"a5917019": "SecurityDepositCreated(uint256,address,string,string,uint256)", +"a5917baf": "vestingVault()", +"a5917dea": "processInternalRequest(string,bool,uint256,uint256)", +"a591a59b": "tuple(uint256)", +"a591d4a6": "getMsgValueAfter()", +"a5925b5b": "clearAuthorization(address)", +"a59307e8": "Play(address,bytes1,uint256)", +"a593845f": "_rollCriticalDice()", +"a594056f": "getPriceInExoTokens(uint256)", +"a59455dc": "getPacket(uint256)", +"a594a117": "giveGen(uint256)", +"a594a236": "_updateClaims(string,string,string)", +"a594b29b": "PRE_SALE_START_4()", +"a595a94d": "_sendGameGift(address,uint256)", +"a595b655": "Gimli()", +"a595f2eb": "quantidadeDeAutorizacoesNecessariasParaUmaNovaOuvidoriaPoderSeCadastrar()", +"a5967039": "cancelMigration(address,address)", +"a5968cc6": "PresaleTokenVesting(address,uint256)", +"a5976f97": "allocateReservedFunds()", +"a59799e6": "updateAvatarInfo(uint256,string,uint256)", +"a5982885": "assertFalse(bool)", +"a5982aee": "closeregistrationphaseandchoosefirstselector(address,address)", +"a5985e8c": "getLevel()", +"a5987c9e": "getMyKilo()", +"a5989dbe": "nines(uint256)", +"a599ef65": "enroll(uint256,uint256)", +"a59a3750": "getWeapon(uint8[176],uint8,uint8)", +"a59ac6dd": "buy(address,uint256,uint256)", +"a59aef4e": "nickOf(address)", +"a59af340": "isInvestorApproved(address)", +"a59b193a": "setRecord(bytes32,string,string)", +"a59b7de5": "consumeCoinForNova(address,uint256)", +"a59cacb2": "setMinWeiAllowed(uint256)", +"a59d6986": "recoverLostFunds()", +"a59d8898": "transferByDateSingle(address,address,uint256,uint256)", +"a59d930b": "ownerSetEtherwowAddress(address)", +"a59dbfb7": "gift_Transfer(address,uint256)", +"a59def62": "ABYSS()", +"a59eca54": "getPlayerIdByAddress(address)", +"a59f3e0c": "enter(uint256)", +"a59f8a2b": "GFCB()", +"a59f9d56": "ChangetokenManagerAddress(address)", +"a5a01bc7": "addCarInit(address,uint32,uint32,uint32,uint64)", +"a5a0545f": "FCChainTokenTest(uint256,string,string)", +"a5a2286b": "ReserveAddress()", +"a5a2aa33": "purseExchange()", +"a5a2cb19": "buyUpgrade(uint256)", +"a5a2fc4a": "claimableFeesOf(address,uint256)", +"a5a32c3a": "GEMCHAIN()", +"a5a3ad0b": "ValidatorBond(address,address)", +"a5a45785": "setRescue(address,bool)", +"a5a54ea5": "SM()", +"a5a584a2": "QuestionToken()", +"a5a5f468": "WorldCupAuction(uint256,uint256,bool,address,address)", +"a5a65bba": "checkvehrespond(uint256,address)", +"a5a6a7b2": "after20Seconds()", +"a5a6d7b3": "sellMyBanana(uint256)", +"a5a7d086": "ethereumFoundationTickets()", +"a5a7dadf": "preCrowdsaleEndTime()", +"a5a83e4d": "right91(uint256)", +"a5a89837": "createPrimera()", +"a5a899ec": "halts()", +"a5a8c53d": "setmessiCommunityAddress(address)", +"a5a98d78": "inflate()", +"a5a9ba8d": "getSellReturn(uint256)", +"a5a9cf0d": "sixthTeamWithdrawal()", +"a5aa0545": "createHumanStandardToken(address,uint256,string,uint8,string)", +"a5aa4348": "setTitulaire_Compte_9(uint256)", +"a5aa542e": "remainingFunds()", +"a5ab3436": "Payouts(uint256,bool,address,uint256,uint256)", +"a5ab5479": "generateNum2Win()", +"a5ab89ff": "setHost(string)", +"a5abe7f6": "isConstant()", +"a5acb022": "LOG_BetWon(address,uint256,uint256)", +"a5acc46e": "PauseInfrastructure(bool)", +"a5acd206": "updateStateFromOracleFoo(address)", +"a5ad0588": "transferFrozenTokens(address,uint256)", +"a5ad1348": "checkPosition(address,address,uint256)", +"a5adb226": "setABackend(bytes32,address)", +"a5ade117": "candyPrice()", +"a5ae65ba": "getGen()", +"a5aeb9b7": "totalWeiContributed()", +"a5af66c5": "HowLongIsDisputeRevealStillRunning(uint256)", +"a5b067b3": "INKCToken()", +"a5b0930d": "getAddressArray()", +"a5b19937": "endVesting(address,address)", +"a5b1e13d": "settle(address,address,uint256,uint256)", +"a5b209df": "doEthDistro(address[],uint256)", +"a5b222c9": "setData_20(string)", +"a5b2235d": "register(address,address[])", +"a5b36a36": "stalePeriod()", +"a5b3720b": "BulkTransfer()", +"a5b3d1a9": "tenmarionCoin()", +"a5b4069e": "DataCoin(address)", +"a5b41c0e": "AK48Coin(uint256,string,string)", +"a5b482c2": "getAmountOfSubcontracts()", +"a5b4aaab": "editMilestone(uint256,uint256,uint256,uint256,uint256,string,string)", +"a5b4f7d3": "setAgentVerificationByAgent(bytes32,address)", +"a5b538f9": "nextBonusPayout()", +"a5b589ce": "mHostFee()", +"a5b6420e": "_setBool(bytes32,bool)", +"a5b6ea8f": "spin(uint256)", +"a5b70519": "multiValueAirdrop(address,address,address[],uint256[])", +"a5b75814": "bonusPhase3()", +"a5b781e1": "lockPostion1Add(uint8,address,uint256,uint256,uint8,uint256,uint8,uint256,uint8,uint256,uint8)", +"a5b78bfa": "NebulaToken()", +"a5b87ef7": "StgFourbonusEnds()", +"a5b9b45d": "tokenConsumed()", +"a5b9e922": "getContentTimetamp(uint256)", +"a5ba3b1e": "tokenClaims(uint256,address)", +"a5bb9162": "tokenadd(address,uint256)", +"a5bbc311": "getNCSTotalSupply()", +"a5bbc423": "withdrawByEmergency(string)", +"a5bbd67a": "lockedAddresses(address)", +"a5bbe7bf": "takeOrder(address,uint256,uint256)", +"a5bc770c": "tokensPerKEther()", +"a5bd1566": "getDiscipleVend(uint256)", +"a5bdbb28": "buyBlock(string,uint256,uint256,uint256,uint256)", +"a5be0c5e": "ERC20Proxy(string,string,uint8,address)", +"a5be1a4d": "multipleTransfer(address[],uint256)", +"a5beb4e5": "claimRefundFor(address)", +"a5bebf48": "founderTokenUnlockPhase1()", +"a5bf7aae": "CPSTestToken1()", +"a5bfa9a9": "claimToken(bytes32)", +"a5bfd16a": "getAllLoans()", +"a5c02493": "setChain(string,address,address,address)", +"a5c04bfe": "allocateTeamBonus(address,uint64,uint64,uint64)", +"a5c102a2": "setMinterFeePercent(uint256)", +"a5c12df9": "OpenANXToken(address)", +"a5c154b3": "setMiniPoolEdit_2(string)", +"a5c1db32": "CrosspaysToken()", +"a5c28b1e": "getGovtApplication(string,string)", +"a5c3eb03": "UbbCoin(uint256,string,string)", +"a5c464b3": "isOnSaleAny2(uint256,uint256)", +"a5c5436f": "preCaution()", +"a5c5463f": "getCurrentlyRunningTier()", +"a5c5762b": "PVT_INV_TOKENS()", +"a5c57b18": "BITDINERO()", +"a5c58944": "dSetEditorArbitraryData(bytes32,bytes,bytes)", +"a5c5edee": "updateGameMetadata(uint256,string,uint256,bytes32[])", +"a5c6ac0d": "percentagePerMonth()", +"a5c7ac13": "test_updateKey_decreaseNoHint()", +"a5c81622": "signedApprove(address,address,uint256,uint256,uint256,bytes32,address)", +"a5c860ba": "eth_minimum()", +"a5c8a201": "geth(uint256)", +"a5c8b7a1": "transferPublisher(address)", +"a5c978c0": "TIA()", +"a5c9cd82": "TOKEN_UNIT()", +"a5ca2afa": "VESTING_INTERVAL()", +"a5ca35f5": "Trade(uint256,address,uint256,address)", +"a5cae60c": "getAppInfo(uint32)", +"a5cb66c0": "ChronosCore(uint256,uint256,uint256,uint256)", +"a5cbe71c": "getCooldownEndBlock(uint256)", +"a5ccd855": "setConstractDeployTime(uint32)", +"a5ccfb06": "sellCard(uint256,uint256)", +"a5cd184e": "free(bytes32,uint256)", +"a5cd3fd0": "steemh()", +"a5cd761f": "getTokenOwner(uint256)", +"a5cd806b": "BONUS_PCT_IN_VREO_SALE_PHASE_1()", +"a5cda792": "distribution(address[],address,uint256[],uint256[])", +"a5ce0693": "endBlockBonus1()", +"a5ce3eb0": "totalPaidAmount()", +"a5ce413b": "unstakeTokens()", +"a5ceefa2": "computeTokenAndETHRewards(uint256,uint256)", +"a5cf3898": "verifyExtraData(bytes32,uint256)", +"a5cf38da": "createCrowdsaleTiers(bytes32[],uint256[],uint256[],uint256[],bool[],bool[])", +"a5cf56f2": "ethReceivedPresale()", +"a5cf599c": "ENDING_TIME()", +"a5cfefde": "updateChainlinkAddresses()", +"a5d048d3": "create(address,uint256,uint256,address)", +"a5d0bab1": "buyPartial(uint256,uint256)", +"a5d18cb6": "checkGameAmount(uint256)", +"a5d1c0c0": "gameTime()", +"a5d33c2b": "MessageSentToChannel(address,string,string,uint256)", +"a5d3845b": "tokenEventAddress()", +"a5d572c4": "fixedTotalSupply()", +"a5d57bb7": "ApproveAndDo(address,uint256,bytes32,string)", +"a5d5ca54": "PolyCustomers()", +"a5d5db0c": "depositCollateral(address,uint256)", +"a5d638f1": "transferOwnershipRequest(address)", +"a5d677ab": "getFileByIndex(bytes32)", +"a5d68bfd": "RATE_WHOLESALE()", +"a5d6d4c3": "mintAuthorizedBatch(address[],uint256[])", +"a5d7a14f": "ContractorProposalAdded(uint256,uint256,address,uint256,uint256)", +"a5d8628a": "AgriChainDescription()", +"a5d871c0": "AddressChanged(uint256,address)", +"a5d8746e": "canMakeBet()", +"a5d8b72b": "midasAdvisorOperateMarketingAddress()", +"a5d8cdf2": "deploy_time()", +"a5da0bf5": "addAfterId(address,uint32,uint128,uint128,uint32)", +"a5db83e4": "marketRegisterToken(address)", +"a5dcf458": "uintToBetsArray(uint256)", +"a5ddfef1": "getTotalAmountOfTokens(uint256)", +"a5de12ab": "ITBITSToken()", +"a5de3619": "admins()", +"a5de811f": "checkMyWithdraw(address,address)", +"a5def8cb": "numbOfFrozenAmCount(address)", +"a5dfd89a": "getPrize(address,uint256,bytes3,uint16)", +"a5dfee67": "testThrowsCreateNewRevisionNotUpdatable()", +"a5e00e53": "QNTU(address[],uint256[])", +"a5e09282": "_burn(address,address,uint256,bytes)", +"a5e108af": "addEmployerContract(address,address,uint256)", +"a5e11729": "maxPower()", +"a5e1c5b5": "setVal(bytes32,uint256)", +"a5e20eaa": "getProjectStartDate(bytes32)", +"a5e220c2": "Owner(address)", +"a5e2dbfb": "_scto(uint256,uint256,uint256,uint256,address)", +"a5e33048": "generateTokens()", +"a5e45bec": "range(uint256)", +"a5e4e9a0": "maxCWCsPerReturnLessThan()", +"a5e4fedc": "LogTransferFromOwner(address,address,uint256,uint256,uint256)", +"a5e52c08": "ImmediateProfit(address,uint256)", +"a5e53bfe": "checkRandomFromRandao(uint256)", +"a5e558a3": "MIN_FUND_AMOUNT()", +"a5e57fcf": "GetUserBitFlag(address)", +"a5e5e034": "swapTop(uint256)", +"a5e62f02": "fallbackRP()", +"a5e7131e": "transferFundsAdminOnly(address,uint256)", +"a5e767cd": "frozenAccount(address,address)", +"a5e7a31c": "summReserveFund()", +"a5e82807": "deletedTeamIds(uint256)", +"a5e8c5d6": "setVoteRight(address,uint256)", +"a5e90eee": "setManager(address,bool)", +"a5e9585f": "xxx(uint256)", +"a5e99c4e": "createSubmission(uint256,string)", +"a5e9fffa": "calculateAmount(address,uint256,uint256)", +"a5ea11da": "getParameters()", +"a5eb1c6d": "Ovation(uint256,string,string)", +"a5eb7a4e": "operated()", +"a5ebb9ef": "backERRLCoinOwner()", +"a5ebc10b": "blocktubeClip(string,uint256,uint256)", +"a5ebf389": "getMoneyTotals()", +"a5ec4fae": "changeBaseVerifierFee(uint256)", +"a5ecacae": "getContributionTime(uint256)", +"a5ece941": "marketingAddress()", +"a5eceaf1": "bet1000_1eth()", +"a5edcd9e": "ethtotalSupply()", +"a5ee79d3": "extendRequestTimeLock(bytes32)", +"a5ef0dd6": "setGen0Profit(uint256)", +"a5ef69ea": "icoEndAt()", +"a5ef9915": "jotAllowance()", +"a5f02b00": "markCombatEnded(uint256)", +"a5f0dea2": "saleFinalized()", +"a5f11474": "Tronix()", +"a5f128fb": "stopSelling(uint256)", +"a5f18c01": "getStartBlock()", +"a5f1e282": "lockedOf(address)", +"a5f257e7": "transferDividendToShares()", +"a5f26760": "updateTimeMintBalance(uint256)", +"a5f2a152": "transferTo(address,address,uint256)", +"a5f2e079": "borrowerReturnAmount()", +"a5f357de": "MAXROUNDS()", +"a5f3c23b": "add(int256,int256)", +"a5f4648c": "getNextTurnColor(uint256)", +"a5f4864d": "ELBT()", +"a5f4af33": "playerWithdrawPendingTransactions()", +"a5f4c6ff": "publicStart()", +"a5f732e5": "distributeLTCW(address[],uint256)", +"a5f75a5e": "dollars_per_kilo_ether()", +"a5f7823e": "onlyAdmin()", +"a5f7c148": "transfer(address,int256)", +"a5f8b874": "wasProxyStorageSet()", +"a5f8cdbb": "buyTicket(address)", +"a5f9b5c2": "gameRound()", +"a5f9fd99": "splitShare()", +"a5fa2490": "smxSold()", +"a5fa5e52": "showTime(address,address)", +"a5faa125": "getAuthor()", +"a5fadf93": "modify_Presale3StartDate(uint256)", +"a5fb929a": "userRewarderCount(address)", +"a5fba4e1": "isDistributionDue()", +"a5fbd808": "globalBurnAmount()", +"a5fbdd41": "updatePremiums(address)", +"a5fbf287": "isSupported(address,uint256)", +"a5fc2994": "sendStore(address,uint256)", +"a5fd0a18": "chargeChannel(uint256)", +"a5fd1838": "getBonus2(uint256)", +"a5fdc5de": "collateral(address)", +"a5fefcfd": "thirdMonthEnd()", +"a5ff2551": "LOCIcoin(uint256,string)", +"a60014e3": "buyCore(uint256)", +"a60110ee": "ProposalTalliedEvent(uint256,bool,bool)", +"a6021ace": "ERC20Address()", +"a6024524": "PRE_ICO_FINISH()", +"a6027d53": "IconomiTokenTest(uint256,string,uint8,string,uint256)", +"a6044f28": "virtualEntitiesCreated()", +"a604c1ad": "Blocker_send(address)", +"a6060fcb": "Bitdore(uint256,string,string)", +"a6065c96": "brokerVerifierContract(uint64)", +"a6066523": "payment_amount()", +"a6069146": "setItemRangeURI(uint256,string)", +"a606b94a": "transferBalance(address,address,uint256)", +"a6070967": "minSumICOStage8USD()", +"a60745aa": "getBountyData(uint256)", +"a608067b": "getDrugPrice(uint256)", +"a608a65b": "CryptoAdsToken(uint256)", +"a6091b32": "removeControllerByPartition(bytes32,address)", +"a60956a6": "newItem(uint8,uint8,uint256,uint256,uint256,uint256,uint256,bool,bool,address)", +"a6099372": "payDiff(address,uint256)", +"a609e209": "BIRTHDAY()", +"a609f034": "getByteFromBytes14(bytes14,uint256)", +"a60b693d": "getTotalCap()", +"a60b8aa9": "minusTourFreezingTime(uint256,uint64)", +"a60bbcd3": "ModelCoordinator()", +"a60c8043": "totalDistributionAmountInWei()", +"a60c9cdb": "TheBolthDAICO(address,address,address,address,address,address,address,address)", +"a60dc38a": "convertToWei(uint256)", +"a60e043e": "CappedRefundableCrowdsale(uint256,uint256)", +"a60e8bd6": "setVotingProxy(uint8,address)", +"a60eb299": "setRewardGenerationComplete(bool)", +"a60f3588": "payoutIdx()", +"a610fe9b": "chargeHoldingTax()", +"a6113c0d": "getSynthesizationResult(address)", +"a6117f39": "validPrePurchase()", +"a611e0e6": "forceRentalEnd()", +"a612c638": "emergencyRestart()", +"a6138ed9": "pricer()", +"a613c42d": "NWT()", +"a6145ba2": "isAllowContribution()", +"a614d54e": "GlobalAdmin()", +"a6151a84": "isDestroyed()", +"a615237e": "rebrand(string,string)", +"a615d7ee": "withdrawTokenToInvestorOwner(address)", +"a6178731": "usingInterCrypto()", +"a617aff1": "brideAddr()", +"a61855a4": "changeCommonRebate(uint256)", +"a618993c": "setGBA(uint32)", +"a618f50c": "distributeSSENTE(address[])", +"a619486e": "masterCopy()", +"a61bd76d": "purgeInformation(uint256)", +"a61c48f0": "getPollResultsSize()", +"a61c5b82": "numStudentRequest()", +"a61d0aed": "maxBets()", +"a61d6829": "getPosterInfo(uint256,uint256)", +"a61e1fc1": "_shuffle(uint8[])", +"a61e67aa": "testFailMintGuyWhenStopped()", +"a61e9f4d": "momentBlockOf(uint256,uint256)", +"a61ef635": "translateToStartingTile(uint16)", +"a61fe970": "candyBalance()", +"a6208622": "refusePayment(uint256,uint8)", +"a621344a": "setTokenWallet(address)", +"a621d679": "XPZ()", +"a6223a58": "testAccess(address)", +"a622510b": "TranslationService()", +"a623e9bf": "PresaleDistribution(address,address,uint256)", +"a62438e2": "getPeriodKey(uint256)", +"a6245974": "getUpgradeProposalCount()", +"a6248874": "totalFirstICOSupply()", +"a62533e6": "diffString(string,string)", +"a62552b3": "modificaPuntos(uint256,int256)", +"a6256644": "setDonationsReceiver(address)", +"a625d78d": "MasterDeposit(address,address,uint256)", +"a626c089": "changeSettings(uint256,uint256,uint256)", +"a626c3fe": "assignBountyTokens(address,uint256)", +"a626f445": "GlobalPersonalInsuranceChain()", +"a62784e2": "setCCH_edit_3(string)", +"a6279dbd": "getPartialAmountCeil(uint256,uint256,uint256)", +"a62819ed": "AddExec(string)", +"a62875d9": "getMyPastWins(address)", +"a62a07dd": "release_dates(address)", +"a62a86a0": "associateWithTaskAddress(address)", +"a62adfec": "buyTokens(uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", +"a62ce8ce": "capitalization()", +"a62d4df3": "_absSubtraction(uint256,uint256)", +"a62d7801": "resumePhase()", +"a62d9ba3": "withdrawToPlatformFunding(uint256)", +"a62e4246": "CampaignBeneficiary()", +"a62e5a7d": "sellComission()", +"a62ea098": "buyLCRTokens()", +"a62f3503": "updateBankAmount()", +"a630a92e": "ownerTransferWeiFirstWallet(uint256)", +"a6314342": "deleteManager()", +"a63234e0": "issuerAddress()", +"a6327ffc": "convert2PlatinumToken(uint256)", +"a632a2e5": "setnumber(uint256)", +"a632d5e1": "MANHATTANPROXLENAV()", +"a633d8d4": "getDougAge(uint256)", +"a633f61f": "getPositionOwedAmountAtTime(bytes32,uint256,uint32)", +"a6345859": "setEscapeRequest(uint32,uint32)", +"a635d31e": "Vote(address,bool)", +"a635e7c5": "BuyEBETtokens()", +"a636f4a1": "VoterAdded(address)", +"a6372087": "starNoLongerForSale(uint256)", +"a63744e0": "addPoll(uint256,bytes,uint8)", +"a63832a0": "dateFunc(int256)", +"a6391823": "awardsOf(address,uint8)", +"a6393784": "BiddableEscrow(address)", +"a63a9fa6": "setNextSnapshotBlock(uint256)", +"a63aeed9": "tokenSaleResumedTime()", +"a63b91f4": "autoBurn()", +"a63c500f": "is_locked()", +"a63c7ba2": "payoutToBeneficiary()", +"a63d0be6": "findAndTrade(address,address,uint256,uint256)", +"a63d6f05": "setRewardLevel(uint256,uint256,uint256,uint256[],uint256[])", +"a63d914f": "confirmAction(uint256)", +"a63dcbd7": "updateRtbSettlementAbi(string)", +"a63e10fa": "getUnreadMessageCount(address)", +"a63f1350": "getParentUniverse()", +"a63f5e2a": "candyToken()", +"a63f8020": "scWithdrawCall(address)", +"a6403636": "resolve(uint8,bytes32,bytes32,bytes32)", +"a64085cc": "getAllClients(address)", +"a641d28e": "revokeDelegateSigned(address,uint8,bytes32,bytes32,string,address)", +"a641edc7": "BOC(uint256,string,string)", +"a6424d22": "setVigAddress(address)", +"a64278ce": "lost_and_found_master()", +"a642c032": "getEdition(uint256)", +"a643c1a0": "updateAddresses(address)", +"a6441979": "StexIssued()", +"a6459042": "agencyReceiver()", +"a645a33a": "VotingFinished(bool)", +"a645e840": "getCurrentGameInfo()", +"a645ff5f": "send(address[],uint256[])", +"a646f9ad": "userWithdraw()", +"a6472906": "getAxie(uint256)", +"a6474a58": "setnotice(string,string,string)", +"a647e8ec": "mint(address,uint256,uint256,uint256)", +"a6482858": "boxPrice()", +"a648567b": "placeBet(uint8,uint8)", +"a648fec2": "updateAllTurnover(uint256)", +"a6491545": "_giveToken(address,uint256)", +"a64968ac": "joyToken()", +"a64a1c0b": "totalSoldTokensWithoutBonus()", +"a64ad595": "getDelegator(address)", +"a64b0b62": "addDevReward()", +"a64b63a8": "ParcelXGPX(address[],uint256)", +"a64b6e5f": "transferTokens(address,address,uint256)", +"a64bb045": "Test7J()", +"a64c7e2a": "Crowdsale(address,address,address)", +"a64d1c09": "hashOrder(uint8,address,uint256,uint256,uint256,uint256)", +"a64ded31": "tttTokenAddress()", +"a64e7969": "balancesCannotSell(address)", +"a64e920d": "vrcCount()", +"a64ed8ba": "tokensCount()", +"a64f0ca4": "getEtherInEuroCents()", +"a64f197e": "allocateBid4b(bytes32)", +"a64f829a": "addDungeonRewards(uint256,uint256)", +"a64fa869": "PrezzoCMT(uint256,uint256)", +"a650ebbc": "transferFromInternalStakingfund(address,uint256)", +"a6515a98": "admined()", +"a652477b": "STSTEST3()", +"a6534b63": "EtherBet(address,uint256,uint256)", +"a65465ff": "pank15()", +"a65491d5": "yeezy()", +"a654cfab": "pots()", +"a655fb4e": "level_9_amount()", +"a6567a9a": "calculateNewTime(uint256,uint256)", +"a656e51f": "lastInvestorsProfitDay()", +"a657242b": "Hardcap()", +"a6572c87": "getemployee(address)", +"a657cb9c": "submitRedeem(uint256)", +"a6593562": "getamountvotes()", +"a65a0068": "getAccountBalances()", +"a65a26e8": "returnAddressList()", +"a65a7753": "Zentum()", +"a65ac961": "batchTransferValues(address[],uint256[])", +"a65ae513": "ownerDeclareFailure()", +"a65b37a1": "buyXname(bytes32,uint256)", +"a65b62c9": "priceRound(uint8)", +"a65c3097": "_distributeRest()", +"a65e53e2": "prizeWithdrawTo(uint256,address,uint256)", +"a65e91b8": "baseTokensSold()", +"a65eacdc": "delManager(address)", +"a65ecbeb": "getMaxTokenAvaliable()", +"a65f0f79": "Ethereal_Smart_ID(address,address,string,string,bool)", +"a65f1193": "weiToUsdCents(uint256)", +"a65f51c8": "gapTime_()", +"a6605a77": "_updateTradingVolume(uint256,address,address,uint256)", +"a660698e": "TheInternetDigitalCurrency()", +"a660a326": "balancesHold(address)", +"a660f827": "bonusEnds5()", +"a6624bf4": "ISBToken()", +"a6632904": "tier_cap_4()", +"a663b5de": "viewCoinsKarma(uint256)", +"a664225c": "exchangeFinished()", +"a6656096": "invalidateGame(uint256)", +"a6658dea": "BitSelectConservador()", +"a6661901": "totalNormalContributorIds()", +"a6662a3c": "initMetadataDisabled()", +"a6666f0f": "TTGCoin()", +"a6667e18": "RemoveWhitelist(address)", +"a666ff3c": "lockedTokenAddress()", +"a66712ae": "usersOfAccount(uint256,uint256)", +"a6674aa3": "Resigned(address)", +"a6678b60": "setJadeCoin(address,uint256,bool)", +"a668d7c9": "NiceGuyPonzi()", +"a66939ad": "hostileTakeover(address,uint256)", +"a669b56b": "pay_day()", +"a669c9f9": "registeredServices(address)", +"a669d972": "c_centsPerToken()", +"a66ac7bc": "payout(bytes32,bytes32)", +"a66b62e6": "gameOverByUser()", +"a66b7748": "follow(bytes32)", +"a66c0b1c": "setGoldmintTeamAddress(address)", +"a66c53b2": "buyCore(uint256,uint256,uint256,string)", +"a66cb0ee": "GetBonus()", +"a66d5ef7": "createNamespace(string)", +"a66db704": "getPOOL_edit_23()", +"a66ddf43": "mainSaleRateP3()", +"a66df701": "chargeFee(address)", +"a66e6e5c": "etoken2Symbol()", +"a66ee056": "internalTransfer(int256,address,address)", +"a66f32e5": "stage3Bounty()", +"a66f42c0": "boost()", +"a66f7ad6": "signRelease(uint256)", +"a66fd42b": "mintToggle(bool)", +"a670b9e7": "nestedSecondSome(uint256,uint256)", +"a670c133": "numTeamDeposits()", +"a6712778": "investBct(address)", +"a672990c": "whitelistContract(address,bool)", +"a6735023": "getProfilePicture(address,address)", +"a673b130": "Reserved(address,uint256[])", +"a6741cfd": "injectEtherToDividend()", +"a6747670": "senderToProxy()", +"a675807e": "totalLevs()", +"a675887e": "EtherReceivedFromRelay(address,uint256,address)", +"a676b174": "frozenAccountProfit()", +"a677fbd9": "example2Func()", +"a6780857": "fireEventLog0Anonym()", +"a6784488": "cleanOut()", +"a67909bd": "LOCKTC()", +"a6791568": "burnAllTokens(address)", +"a67a6eab": "bearToken()", +"a67ad1b2": "sellICloudSecsAgainstEther(uint256)", +"a67aee1f": "tokenConverter()", +"a67afd30": "vest2all(address,address)", +"a67ba5d2": "changeAdminCharges(uint256,uint256,uint256)", +"a67bb583": "tokenCapForSecondMainStage()", +"a67c2730": "getBonusPerShare()", +"a67c2dcb": "accept_ownership()", +"a67c8bc4": "mintFundsTokens()", +"a67cace9": "AIT_TokenERC20(uint256,string,string)", +"a67d2602": "getSafeAddr()", +"a67de805": "DWalletToken()", +"a67e91a8": "TOKENS_MAX()", +"a67eb8d7": "STRIMToken(address,address,uint256,uint256)", +"a67ebf73": "Voting(uint8,address,uint256,uint256)", +"a67f122f": "_1_vozrast()", +"a67f9997": "LIQUIDATION_RESERVE_RATIO()", +"a67fc3fa": "getRewardAmount(bytes32,bytes32)", +"a6801cbd": "reset(uint256,uint256,uint256)", +"a6808c3c": "_setAgilityValue17(uint256)", +"a6809af0": "setOdds(uint256)", +"a680baaf": "backendWallet()", +"a681bf23": "LegalBot()", +"a681f950": "setMinMax(uint256,uint256)", +"a6823189": "parseAddr(string)", +"a682d5ad": "clampMin(uint256,uint256)", +"a682dd4f": "SWAP(address,address,address)", +"a6832d53": "allowedTransfer(uint256)", +"a68393a2": "debug_getCoinbaseTxOutputLen(uint256)", +"a6843f34": "right48(uint256)", +"a6846026": "TokenMintingDisabled(address,bool)", +"a684bc9f": "tokenReserved3()", +"a684ff03": "bet(uint16,bytes32)", +"a68567ac": "IDToken()", +"a6856e9d": "JTEBIT(address,uint256)", +"a685a41e": "parseLoanOffering(address[9],uint256[7],uint32[4])", +"a685ae66": "minerTimeOfLastProof()", +"a685ea57": "getROFRStatus()", +"a68602fb": "SignalingDisabled(address,uint256)", +"a687be48": "RocketsAndResources()", +"a6885e88": "getStageData()", +"a6895b5a": "getDailyLimit()", +"a6896bdf": "isRightPosition(uint128,uint128,uint32,uint32)", +"a68a2884": "TournamentCore(address,address,address,address)", +"a68a76cc": "createForwarder()", +"a68b51ed": "addProposal(address,uint256,uint256,string,uint256,bytes)", +"a68b91ab": "getContractData()", +"a68c5ca1": "SDTToken(uint256,string,string)", +"a68c68b4": "get_asset(uint32)", +"a68c9bbb": "getBid(address,address)", +"a68cfb25": "getSecondAmount(bytes32,bytes32)", +"a68d9a62": "_setDownRequest(address,uint256,uint256,uint256)", +"a68dfb2d": "TTToken()", +"a68e27b7": "getLuckProps(address)", +"a68e4578": "totalLBSold_CORNERSTONE()", +"a68e5ad0": "depositTokensForTrading(uint256)", +"a68eb555": "payVATToBusinessOwner(uint256,uint8,address)", +"a68f0bc1": "TOTAL_LARE_FOR_SALE()", +"a68fff3f": "GenRandom(uint256,uint256)", +"a6903278": "beginBlock()", +"a69032ee": "proxyTransferFromToICAPWithReference(address,bytes32,uint256,string,address)", +"a69177b1": "addTotalSupplyAmount(uint256)", +"a6921956": "tokenStatus()", +"a692c2f9": "_toTileId(int32,int32)", +"a692d5ae": "migratePriceLeader(uint8,address,uint256)", +"a6934950": "_confirmOneBuy()", +"a69358aa": "voteForTap(bool)", +"a693600b": "poolAmount()", +"a69364fc": "ProofOfTheRich()", +"a6940238": "growth()", +"a69416f6": "getNodeType(address)", +"a6948cd9": "calculateArea(address[16],uint256)", +"a694dabd": "STARTING_SNAIL()", +"a694fc3a": "stake(uint256)", +"a69520aa": "alchemy(uint256)", +"a695cacf": "getGameIdsByCategory(bytes32)", +"a69709ae": "toHexString64(uint256)", +"a69722de": "validateDescription(string)", +"a6973fa1": "computeS(uint256)", +"a697ca14": "finishSingleLock(address,address)", +"a6980a17": "addPromo(bytes32,uint256,address,uint256,uint256)", +"a6983932": "SeckeyRevealed(bytes32)", +"a6988576": "walletTokenBounty()", +"a699cd20": "getGrowingControlStartAt()", +"a699d9b0": "saosao6()", +"a699fb18": "payoutWorth(address)", +"a69a2ad1": "totalBalances()", +"a69a5588": "set(bytes12,bytes32)", +"a69ade72": "LED_MULTISIG()", +"a69bd4a8": "regStartTime()", +"a69beaba": "vote(bytes32)", +"a69c22be": "getYays(uint256)", +"a69c5bbf": "bucketClosureTime(bytes32)", +"a69c6597": "getPlayerName()", +"a69cbb50": "_getEarlyBonus()", +"a69dde14": "checkPassiveAndNull(address)", +"a69df4b5": "unlock()", +"a69e894e": "createTokens(address,uint256)", +"a69eae7c": "changeAllowanceToMint(address)", +"a69f7d1f": "FOUNDATION_PERCENT()", +"a69f886a": "withdrawRaised(uint256)", +"a6a1858f": "whale()", +"a6a20ff6": "DSEasyMultisig(uint256,uint256,uint256,uint256)", +"a6a34dd3": "_setMinCardPrice(uint128)", +"a6a3a439": "getNumTransactions(address,uint256)", +"a6a3ba2b": "pausestatus()", +"a6a5bfe3": "getStage2Start()", +"a6a62d58": "lastBlock_f2()", +"a6a633af": "ROA()", +"a6a68606": "findOnePercent(uint256)", +"a6a6a0d8": "becomeFrom()", +"a6a6f1c7": "registerLicense(string,string)", +"a6a86130": "usdToWei(uint256)", +"a6a9a099": "privateIcoMin()", +"a6aa7f7a": "onlyFounders()", +"a6ab1216": "getWeaponsArmy1(uint256)", +"a6ab36f2": "initialize(uint256,uint256,address)", +"a6aba1b5": "BitCoix()", +"a6abbad6": "assertEq16(bytes16,bytes16,bytes32)", +"a6ac9225": "getJackpotResults(uint256)", +"a6ad57e6": "difficultyScaleMultiplierLimit()", +"a6ae0aac": "coinbase()", +"a6afd5fd": "getBets()", +"a6afed95": "accrueInterest()", +"a6b01e50": "isMultiOwner(address)", +"a6b05af6": "INITIAL_BONUSLIST_TOKENS()", +"a6b08498": "isOps()", +"a6b10dd1": "showToken_For_Circulation()", +"a6b11fb3": "factorial_ICO()", +"a6b165ee": "total_investors()", +"a6b197aa": "Order(address,uint256)", +"a6b1caa3": "gasScalar(uint256)", +"a6b206bf": "doSomething(uint256)", +"a6b26697": "EthRefundReceived(address,uint256)", +"a6b2c437": "confirmRequest(uint256)", +"a6b2df9b": "requestDocument(uint256,string)", +"a6b3abba": "getMyTokenBalance()", +"a6b402ec": "MGU()", +"a6b4492f": "servusToken()", +"a6b4b0f4": "testCreateGames(uint256)", +"a6b513ee": "finalPrice()", +"a6b55eec": "unlock(bytes16,uint32)", +"a6b57b5d": "sharesOwned(address,uint256)", +"a6b7fa36": "withdraw(uint32,uint192,bytes)", +"a6b87b52": "erc()", +"a6b909e1": "trades()", +"a6ba250c": "fechVoteInfoForVoterBySnapshotBlock(address,uint256)", +"a6bb012b": "penalizeInactiveArbitrators(address[],uint256[])", +"a6bb1667": "updateMatch(uint8,uint8,uint8)", +"a6bc18f9": "setTrader(address)", +"a6bd5427": "getOptionCount()", +"a6bd853b": "mtdPreAmount()", +"a6bdcc17": "isAtLeast(uint256,uint256)", +"a6bf3df0": "oraclize_query(string,string[2],uint256)", +"a6bf45a9": "getNumberOfDeedsByAddress(string)", +"a6c01cfd": "isInGeneration(uint256)", +"a6c09381": "_setPackedTimestamp(bytes32,uint256)", +"a6c0d5a8": "YukiChainToken()", +"a6c1d611": "getAngelLockStatus(uint64)", +"a6c1f87f": "partial_refund(address)", +"a6c216c2": "UpgradeEvent(address,address)", +"a6c226f0": "lock(address,address,uint256[],uint256[])", +"a6c23bc4": "setTokensPerUsdRate(uint256)", +"a6c24b38": "getRequiredPrice()", +"a6c2591e": "get_header(uint256,uint256)", +"a6c2f3b2": "getAllAgreements(uint256)", +"a6c30b29": "startGasCalculation()", +"a6c3e6b9": "author()", +"a6c4cce9": "registeredApps(address)", +"a6c4d58c": "MetronomeToken()", +"a6c4ec0e": "hasUser(address)", +"a6c5612e": "areTokensFree()", +"a6c58b63": "getJobStatus(uint256)", +"a6c62c90": "snake(uint256)", +"a6c662ea": "Cmc()", +"a6c66575": "processInviterBenefit(address,uint256)", +"a6c6aee1": "ODEEPToken()", +"a6c7bf8a": "setMasterWallet(address)", +"a6c7f715": "MoimToken(uint256,string,string)", +"a6c8210e": "getVotingParams()", +"a6c93349": "createContract(uint256,uint256,int256,int256,int256,int256)", +"a6c94d2e": "durationVoting()", +"a6c95de1": "transferBountyTokens(address,uint256)", +"a6c98142": "SquirrelFarmer()", +"a6ca0a98": "PARAMOUNT()", +"a6ca322b": "refundCompleted()", +"a6ca54bd": "lawEnforcementRole()", +"a6cb4654": "catchYou(address,uint256,uint256)", +"a6cb9e64": "scheduleCall(address,bytes,bytes)", +"a6cbcdd5": "numSignatures(bytes4)", +"a6cc0428": "withdrawCryptoCurrencyNetworkTokens(address)", +"a6cd5ba3": "MaxMasternodesAllowedChanged(uint8)", +"a6cd8c68": "Match_Maker()", +"a6ce25b2": "In(uint256)", +"a6ce69a2": "changeSupply()", +"a6ce8c29": "HandsOnToken(uint256,string,uint8,string)", +"a6cea881": "KayiToken()", +"a6ceaeb8": "getSoldTokens()", +"a6ceb1f3": "sendAirdrop(address[],uint256[])", +"a6cfaf2e": "MMC(uint256,string,string)", +"a6cfb7a3": "getBack(uint256)", +"a6cfbb7f": "revenueBalance()", +"a6d00693": "getMeshPointByCreator(int256)", +"a6d150e0": "updateWhitelists(address[],bool[])", +"a6d15124": "coinsLeftInTier()", +"a6d15963": "createChannel(address,uint192)", +"a6d23e10": "payments()", +"a6d2bff6": "getTeamTokens()", +"a6d34fa8": "JackpotPayoff(uint256,uint256,address)", +"a6d40d39": "unlockFounder(uint256)", +"a6d49dca": "emitTransferEvent(address,address,uint256)", +"a6d4b5c2": "getGroupResult(uint256)", +"a6d4e9da": "tokensByTx(uint8,string)", +"a6d544e9": "sumHardCapPreICO1()", +"a6d6d046": "LetsfairToken()", +"a6d6ec85": "Add_Product(uint256,uint256,string,string)", +"a6d72407": "interface()", +"a6d7d72e": "addTwinAddress(address)", +"a6d87f7d": "myReferralDividends()", +"a6d8adf9": "compensateAll(address)", +"a6d930bb": "FundCrowdsale()", +"a6d93a9a": "_sell(uint8,bytes6,uint32,uint32)", +"a6d958c6": "getLastInput()", +"a6d96af6": "_createCompany(bytes32,bytes32)", +"a6da1e7d": "depositAndLock(address,uint256,uint256)", +"a6da3761": "StoneumToken()", +"a6da467c": "buyCozyAffiliated(uint256,uint256,bool,address,address)", +"a6da54a3": "validCoordinate(uint256,uint256)", +"a6dacdd7": "right59(uint256)", +"a6dc0173": "BRFCrowdsale(uint256[3],uint256[3],uint256[3],uint256[3],address,uint256,uint256,address,uint256,address)", +"a6dc15bd": "PriceChanged(uint256)", +"a6dc1ada": "setMaxStage3AllocationPerInvestor(uint256)", +"a6dc6771": "third()", +"a6dc84f0": "balanceOfFrozen(address)", +"a6dcb12d": "candyTotalSupply()", +"a6dcc834": "getUserInventory(address,address)", +"a6dd06e1": "getPOOL_edit_34()", +"a6ddcc96": "FillBuyOrder(address,address,uint256,uint256,uint256,uint256,uint256)", +"a6ddce13": "setDisable(address,bool)", +"a6de42c8": "AuthorizedAddresses()", +"a6dea55e": "sendEthToAddress(address,address,uint256)", +"a6ded200": "redeem_funds(address,uint256,uint256,bytes32)", +"a6defd45": "ZeroHooStandardToken(uint256,string,uint8,string)", +"a6df0344": "REF_CREDITS_PER_AXIE()", +"a6df33a2": "creationInvestmentSupply()", +"a6df6c30": "minCWCsPerReturnMoreThan()", +"a6e0264a": "_checkMyVesting(address)", +"a6e158f8": "redeemTokens(uint256)", +"a6e16ba2": "testThrowsRetractLatestRevisionNotOwner()", +"a6e1bc7c": "IndoCrypt()", +"a6e26e96": "batlordAddress()", +"a6e2eab1": "recycleAfterEnd()", +"a6e315ff": "addExemptionAddress(address)", +"a6e3289d": "addNextMemberPayment(address,uint256,uint256)", +"a6e3a8a7": "findMinAuditPricesStats()", +"a6e3f533": "redeemKmPardsBal()", +"a6e3fcf6": "setBaseTokensSold(uint256)", +"a6e4002e": "DividendManager(address)", +"a6e497b6": "getUserContractAddress(address)", +"a6e4ae01": "gcp(uint256)", +"a6e5291f": "UniversalGiftToken()", +"a6e5303a": "SLKToken()", +"a6e53b99": "PHASE1_ACCOUNT_TOKENS_MAX()", +"a6e5f2f5": "Show_Address_for_option_C()", +"a6e7469c": "getSendersHash(address)", +"a6e77af1": "setEntryPrice(uint256)", +"a6e7f409": "STATE_OWNED()", +"a6e81e7c": "refundWei(address,uint256)", +"a6e826e8": "startsecurities()", +"a6e8a859": "target2()", +"a6e915b6": "confirmOpening(uint256,uint256)", +"a6e9e95f": "setCoinAllowance(address,address,uint256)", +"a6ea7ad2": "dexTestTransfer(address,address,uint256)", +"a6eaab99": "DGCASH()", +"a6ebbe5a": "NewDeposit(uint256,uint256,address)", +"a6ec01f7": "clearPendingWithdrawal(address)", +"a6ec0708": "setCompte_28(string)", +"a6ec3022": "getCurrentYearRemainToken(uint16)", +"a6ecfff8": "is_btc()", +"a6ed563e": "getBytes32(bytes32)", +"a6ee5eed": "changeFinishPreSale(uint256)", +"a6ee6fd9": "max_schrems_addr()", +"a6eea7f3": "liquidationPeriod()", +"a6effaed": "DetailedERC20(string,string,uint8)", +"a6f07a5c": "bigbomMultiSigWallet()", +"a6f0cba6": "DarioAdministrator()", +"a6f0e577": "isLeapYear(uint16)", +"a6f1c939": "getPick(uint256)", +"a6f1fd51": "addDeposit(uint256)", +"a6f20445": "LogCancelReservation(address,uint256)", +"a6f257cc": "AgroTechFarmToken()", +"a6f2ae3a": "buy()", +"a6f2e80d": "lockFunds(address)", +"a6f2fd5c": "disable(bool)", +"a6f48c90": "freeCount()", +"a6f4ab2e": "setStalePeriod(uint256)", +"a6f55282": "addNacToNLF(uint256)", +"a6f57199": "CrowdsaleExtended(uint256)", +"a6f5a22b": "openShop()", +"a6f6a8a6": "_setPrices(uint256)", +"a6f6d8bb": "getObligation(bytes32,uint64)", +"a6f70594": "SpoutCrowdsale(address,uint256,uint256,address)", +"a6f7257a": "getSigns(uint256)", +"a6f7541c": "maroonToken()", +"a6f81668": "gameInfo(uint256)", +"a6f87bc6": "WumingToken(address,address)", +"a6f935f6": "exporterAcceptedIBankDraft()", +"a6f9885c": "MAX_LENGTH()", +"a6f99922": "EcologicalShield()", +"a6f9dae1": "changeOwner(address)", +"a6fb08ae": "contractWithdraw(uint256)", +"a6fb475f": "transferFrom(address,address,uint16[])", +"a6fbf3d2": "getInt(bytes32,bytes32)", +"a6fc2823": "continueIco()", +"a6fc5c03": "getCode(uint256)", +"a6fd0085": "sub(uint128,uint128)", +"a6fd2487": "recordName()", +"a6fd96b0": "MultiService(address,address[])", +"a6fda231": "ICO_RATE3()", +"a6fdedef": "aimeIncreasePerTrip()", +"a6fe178c": "getRegisteredExchanges()", +"a6fe7a28": "removeService(address,uint32)", +"a6fea6f4": "registerVendor(address)", +"a6ff20a3": "addVehicle(uint256,uint256,bytes32,bytes32,uint256,uint256)", +"a6ff85e2": "ReceiveDonate(address,uint256)", +"a6ffefae": "balancesListNumberMap(address)", +"a701229f": "ChangedOwner(address)", +"a7016023": "setOwnership(address)", +"a7021bc5": "executorAlive()", +"a70284be": "soldBeercoins()", +"a702be14": "feedSecondaryPot(uint256)", +"a703078c": "sortAuction(uint256[])", +"a7030a53": "extractAndStoreBitcoinAddresses(bytes32,uint256,bytes,bytes)", +"a703c751": "batchWhiteListInvestors(address[])", +"a705245e": "setReserveVault(address)", +"a70616de": "platformWithdrawalRecipient()", +"a7068d66": "addDelegate(address,bytes32,address,uint256)", +"a706a2e2": "requestUnlock(bytes32,address,bytes4,address)", +"a706d26e": "DragonTreasureToken(address,address,address)", +"a7070373": "setAllowance(address,address,address,uint256)", +"a707300f": "addAcceptedContribution(address,uint256,uint256)", +"a7074a82": "getCrowdsaleStatus(address,bytes32)", +"a707ce55": "changePass(bytes32)", +"a707fc81": "payback(uint64,address[])", +"a708142b": "addressSCComplianceService()", +"a7084516": "VictoryX(uint256,string,uint8,string)", +"a7086536": "withdrawOfferForCollectible(uint256,uint256)", +"a7096ac8": "addLogicVersion(uint256,address)", +"a70a92f7": "setLiquid0(bool)", +"a70a9ad7": "switchDeity(address)", +"a70b015d": "stageICO()", +"a70b21a3": "ReceiverPays()", +"a70beb13": "processSellOrder(uint256,uint256)", +"a70c41b4": "getTransferFromPreSignedHash(address,address,address,uint256,uint256,uint256)", +"a70ce015": "safeGetPercent(uint256,uint256)", +"a70d7006": "StinkyLinky()", +"a70e82d4": "changeFreeUntilDate(uint256)", +"a70f101c": "useEmergencyCode(uint256)", +"a70f84c3": "registerName(address,bytes32,uint256)", +"a70fc3ba": "setCap(uint256,string)", +"a70fc680": "fundraising()", +"a71168e3": "setTrainingScienceContract(address)", +"a7120433": "setItemContract(address)", +"a7134993": "lifeD(uint256)", +"a7134f73": "acquire()", +"a713a3f7": "loggedTotalSupply(uint256)", +"a7154d22": "cancel(address,uint32)", +"a7157c72": "withdrawToTeamStep2(uint256)", +"a715bf33": "ICO_PRICE()", +"a715df58": "setUnownedName(uint256,string)", +"a715ff59": "EtherandomProxy()", +"a716144a": "getStack(bytes32)", +"a7177ebf": "getSpellAbilityCost(uint8)", +"a718309f": "CryptoCurrencyExchange()", +"a7188b4e": "setEditModeBool(bool)", +"a718d11b": "addWhiteList(address,bool)", +"a718e288": "Robet(uint256,string,string)", +"a718e774": "closeWeeklyInvest()", +"a718f4b3": "searchJobs(address,uint256,uint256[],uint256[],uint8[][4],uint8,uint256[],uint256[],uint256)", +"a7194e2a": "returnTokensListOfAddresses()", +"a71962c2": "GAME_STARTED()", +"a719804d": "Spank(string,string,uint8,uint256,uint256)", +"a71a3dde": "DEFAULT_LOCK_COST_PER_HOUR()", +"a71acabc": "newSection(bytes32,bytes32,bytes32,uint256)", +"a71aec73": "isTradable(uint16)", +"a71b4c26": "auctionSumGwei()", +"a71bd1cd": "getCurrentDay(uint256,uint256)", +"a71be2c0": "Clip()", +"a71d6f9f": "setTRCExchangeRate(uint256)", +"a71d8181": "createCeleb(string,uint256)", +"a71e12e5": "JoinGameAsPlayer(uint8,uint256,uint8)", +"a71e46d3": "maxRecordID()", +"a71ee0c6": "changetradestatus(bool)", +"a71ef84d": "getVotingWinner(address)", +"a71f94c8": "scheduleSetUInt(address,uint256,uint256)", +"a71fa796": "addResearch(address,uint256)", +"a7205062": "constructor(address,uint256,uint256)", +"a720cbb8": "create(address,address,address,string,string,address,uint256,uint256)", +"a720e0a8": "ebyteToken()", +"a720faa9": "maxPreICOSupply()", +"a721c06c": "LENTToken()", +"a721d9d9": "EmiratesCoin()", +"a721ebe8": "numberSyndicateMembers()", +"a72299dd": "MetadollarShare()", +"a7232aae": "setGPSMinEth(uint256)", +"a723761a": "investEtherForDID()", +"a723cda8": "AQUAOIN()", +"a7240d45": "updateTransaction(bytes32,uint256,address,uint256,address,uint256,bytes32,bytes32,bytes,bytes)", +"a72460d1": "getProviderEndpoints(address)", +"a724e54c": "newCollectible(uint256,string,uint256,uint256,uint256,string,uint256,string)", +"a724f68a": "CratesOpened(address,uint8)", +"a7256621": "addInt(uint256,int256)", +"a725c4a4": "StrategicPartners(address,uint256)", +"a725fa1f": "CpublicgoldToken(address)", +"a7261f79": "isPayableEnabledForAll()", +"a72670b8": "getReportingWindowByTimestamp(uint256)", +"a726be9a": "get_token_data(uint256)", +"a727390d": "GetDomainInfo(string)", +"a727632f": "Date_Finished()", +"a7281bbf": "CollectTaxes(uint256)", +"a728fa93": "getMyCraigGrant()", +"a7292c74": "amountEthRaised()", +"a72a05f7": "getReceiversCount()", +"a72aa163": "setPropertyMode(uint16,bool,uint32)", +"a72b1444": "minimumSupport()", +"a72cb9aa": "editAddress(int256,address,string,address)", +"a72cc1e8": "updateTask(address,string)", +"a72dc52e": "fixedExpUnsafe(uint256)", +"a72dc950": "StageOneEnable()", +"a72ec7a0": "TokenLiquidityPlatform()", +"a72f3dea": "removePVPContender(uint256)", +"a72f5aaa": "preDistribute(address,uint256)", +"a72ff7de": "buySmartContract()", +"a7304287": "godUnpause()", +"a731c4ec": "addUserTokenLocalBalance(address,uint256)", +"a731f31a": "getBoxes(address)", +"a7321096": "mainSaleBonus()", +"a7322d9d": "DURATION_SALESTAGELAST()", +"a7324134": "parseLoanOffering(address[11],uint256[10],uint32[4],bytes)", +"a732d6c4": "calculateAffiliate(uint256,uint256,uint256)", +"a732f9ac": "increasePlayersGooProduction(address,uint256)", +"a7334c93": "addSales(uint32,uint256,uint16,uint16,uint64,uint64,uint32,uint8)", +"a733800d": "Shipia()", +"a73381d5": "EYInnovationCoin()", +"a733e21d": "twice(address,uint256)", +"a733f702": "isValidSize(uint256)", +"a73467bd": "TestCitySnapshotInternal(address,uint256)", +"a73598fd": "tryFinalizeStage()", +"a73638a7": "selectGod(uint16)", +"a7365ea9": "Gealena()", +"a7368afb": "allocateTokens(address[],uint256[])", +"a7374b21": "sendFundsInternal(uint256,address,bytes)", +"a737ec3d": "GxAdmins(address)", +"a737ecc9": "getProfitToAddress(uint256,address)", +"a7384c1e": "eth2erc20()", +"a739013f": "buy(address,address,uint256,bool)", +"a7397d27": "xaurForGasLimit()", +"a73b60f4": "buttonClicks()", +"a73b9bcb": "FTFExchangeToken()", +"a73c0ba2": "play(uint256,uint16,uint8)", +"a73c52e7": "getLastPerUser(address)", +"a73c7140": "amountTotal()", +"a73d633c": "addWhitelist(address,address)", +"a73d907e": "inboxIsEmpty(address)", +"a73e01cb": "WPTokensBaskets(address,address,address,address,address)", +"a73e38ce": "generateICOcrowdsale(uint256)", +"a73e9837": "newEnterWallet(address)", +"a73ee331": "MAIN_HOLDER_ADDR()", +"a73f7f8a": "addRole(address,bytes32)", +"a73fc4cd": "get_pre_kyc_iconiq_bonus_denominator(address)", +"a7403160": "vestingsReleasedRemain(address)", +"a74035b5": "setEvabotContractAddress(address)", +"a740a194": "getGasToReport()", +"a740a6fa": "clearRAM()", +"a740cf90": "TGIF(address)", +"a740de43": "nameLocked()", +"a7419b51": "setAirLiftPrice(uint256)", +"a742a942": "create(address,bytes32,address,address[],address,bytes32)", +"a7432434": "refferalPreICOBonus(address)", +"a743a61f": "checkStudentsApply()", +"a743fa50": "beneficiaryFunded(address)", +"a744a633": "getWeeklyTransactionVolumeReceiving()", +"a745863b": "startRebuyTime()", +"a745953e": "buyStarInitial(uint256,string)", +"a745ec70": "bountyDistributorAddress()", +"a7467039": "sharesToManager(uint256)", +"a747007f": "AffiliateProgram(address)", +"a7483f74": "CATFreezer(address,address)", +"a74905db": "reportProfit(int256,address)", +"a74915cf": "getadd()", +"a7491b48": "votesByAddress(address)", +"a7497fa5": "tge()", +"a749870d": "etherValueAllowStale(uint256)", +"a749e97b": "_setPaymentSchedual(uint256,uint256,bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,bytes2)", +"a74a1831": "post(bytes32)", +"a74baaa4": "amountOfHolders()", +"a74e01cf": "unFreezeAllTransactions()", +"a74e493f": "pregenTokens(address,uint256,uint256)", +"a74ecb12": "setMasterAddress1(address)", +"a74f277a": "MaintenanceUpdate(bool)", +"a7502a3f": "totalTeamWithdrawSupply()", +"a7507df2": "loveUrl()", +"a75252ea": "sellToAddress(uint256,address)", +"a75261f2": "certbot()", +"a75274e9": "setMarkup(uint256,uint256)", +"a752c2c5": "UniversalSchemeMock()", +"a75343bf": "claimOwnership2()", +"a753d6f2": "CreateProposal(string,string,string,string,string,string,uint32,uint32)", +"a753fd08": "setWinNetworkFee(uint256)", +"a7542448": "addRef(bytes32,bytes32)", +"a75439d1": "minValuePre()", +"a755a47e": "triggerAllRefunds()", +"a7560bec": "EBITOKEN()", +"a7565888": "m_Paused()", +"a75688b2": "oldMillionEther()", +"a756f362": "Th_stage1(uint256)", +"a75761f1": "returnUint16(uint16)", +"a7577542": "addCrowdSaleTokens(address,uint256)", +"a757ac4b": "privatesaleAddress()", +"a757fc42": "buyTwo(uint256,uint256,uint256,uint256)", +"a758ac6a": "MaecenasCrowdsale()", +"a759822b": "performCalculations()", +"a75a1d6c": "claimRefundTokens(address,address)", +"a75a4e4a": "updateScoreAndBalance(uint256,uint256,address,address)", +"a75a9049": "setInitialOwner(address,uint256)", +"a75aef40": "SYCEarlyPurchase()", +"a75c6f65": "updatedCirculation(string)", +"a75c8546": "determineDiscountRate()", +"a75c981d": "totaltokensold()", +"a75d0042": "signedTransferCheck(address,address,address,uint256,uint256,uint256,bytes,address)", +"a75dd0d4": "AddPrivateKey(string,string)", +"a75df814": "knownAddress(address)", +"a75e2853": "transferForICO(address,uint256)", +"a75eb727": "updateExistingRaz(uint256,uint256,uint256,uint256,uint256)", +"a75fe8e1": "removeWallet(address)", +"a7603a86": "getDefaultValidityBond()", +"a76044a4": "binary()", +"a760d1d0": "setRateAgain()", +"a760e442": "setLosers(uint256)", +"a76188b9": "setRewardPercentages(uint256,uint256,uint256,uint256,uint256)", +"a7633064": "getRandomType(uint16)", +"a7638346": "setFinaliseTime()", +"a7638c4d": "disableStakingPeriod()", +"a764eb45": "setCurrentIssuanceData(address,uint256)", +"a7651147": "loyaltySupply()", +"a76594bf": "getPlayersCount()", +"a7668eba": "calcTokenCost()", +"a766f3d1": "storeStub(address,bytes32,bytes32)", +"a76769a5": "fillOrderWithEth()", +"a76774f5": "jackpotCompleted()", +"a7677ee3": "AslanToken()", +"a767d8be": "preIcoMaxCap()", +"a76a155e": "getBetsFromAddress(address)", +"a76bb04e": "setRewardPoolWallet(address)", +"a76d368a": "candyPowerToken()", +"a76d50ad": "multipleTransfer(address[],uint256,uint256)", +"a76dd676": "TIER3_PERCENT()", +"a76decce": "_createNFT(uint256[5],address,uint256)", +"a76ee2d8": "fillBuyOrder(address,address,uint256,uint256,uint256,uint256)", +"a76eeab2": "updateVitality(uint256,uint8)", +"a76f3543": "getUpgradePointer()", +"a76f43a0": "bancorDaiSmartTokenRelay()", +"a77078e7": "withdrawForOp(address)", +"a7721e0f": "multiplyTokensSend(address[],uint256[])", +"a7724b16": "bingo()", +"a7728589": "setMintAgent(address,address)", +"a7731150": "StoreFile(bytes32,string,string,string,string,string,uint256,bytes)", +"a7737b93": "NumberOfPart()", +"a77384c1": "setTotalShares(uint256)", +"a773d98a": "getAssetIDHash()", +"a7741827": "deleteAllUris()", +"a7743462": "setFounderTokenWallet(address)", +"a774f163": "adjustDefaultSpritePrice(uint256,uint256)", +"a775511a": "isMainsalePeriod()", +"a775b1c4": "NAORIS_TEAM_TOKENS()", +"a7760d79": "preICOendTime()", +"a77674a7": "buy_energy(address,uint32,uint32,uint64)", +"a7771ee3": "isVoter(address)", +"a7775bd7": "YDToken()", +"a777aa5d": "changeMaxTokenSell(uint256)", +"a777d0dc": "hello(string)", +"a777deca": "thirdRelease()", +"a777eca9": "MinerRewardChanged(uint256)", +"a77a8230": "allowence(address,address)", +"a77aa49e": "setIntValue(bytes32,int256)", +"a77adc23": "WaxToken()", +"a77ae839": "approveRewards(uint256)", +"a77b2e37": "Coin()", +"a77b4d8b": "setBaseCurrency(address,bool)", +"a77b6efb": "mintCoins(uint256)", +"a77beea1": "transfer(address,address,address,address[],uint256)", +"a77c1b08": "checkTransfer(address)", +"a77c61f2": "cobinhoodUserIDs(address)", +"a77ee38c": "promoTypeNum()", +"a77f7c8c": "whitelistMany(address[])", +"a78036b7": "clearDeposits(address,uint256)", +"a7807b84": "transferByRelatedToken(address,address,uint256)", +"a78082aa": "TokenSafe(address)", +"a78085ef": "lockMainSaleToken()", +"a780b2f3": "parseRate(string)", +"a7811732": "totalERC20Contracts(uint256)", +"a78118a4": "onlyDevs()", +"a781384e": "TrivialToken(string,string,uint256,uint256,address,address,uint256,uint256,uint256,bytes32)", +"a7819ad7": "_challengePart2(uint256,uint256,uint256)", +"a783a4f1": "get_hash(uint16)", +"a78488af": "startTokenRaffle(uint256,address,uint256,bool)", +"a78488e1": "WSTO()", +"a784d969": "setAssetsCertified(uint256)", +"a784ef22": "_calculateScore(uint256,uint256,uint256,uint256)", +"a7859131": "m_initialSettingsSet()", +"a785b96a": "TDEStartDate()", +"a786c1d2": "BONUS_DAY1_DURATION()", +"a7878831": "splitTokens()", +"a78810f8": "subscribeMe(uint8,bytes32)", +"a788aa07": "test_threeValidEqUint(int256)", +"a789e29c": "getContributorData(address)", +"a78a43c1": "getAllTeamScores()", +"a78a651a": "processContribution(address)", +"a78adf57": "UserAddressRegistry()", +"a78adfec": "setButtonParams(uint256,uint256,uint32,uint32)", +"a78b3d96": "addSubOwner(address,address)", +"a78bcf6e": "changeBankroll(address)", +"a78c5476": "SaleStarted(uint256)", +"a78c81ea": "changInviteAmountLimit(uint256)", +"a78cb567": "getCosignerFee(uint256)", +"a78cdfed": "gana()", +"a78d4316": "_near(uint256)", +"a78db39c": "blockedUntil()", +"a78deefa": "isGameEnd()", +"a78e635c": "XToken()", +"a78e887c": "calculatePurchaseReturn(uint256,uint256,uint16,uint256)", +"a78f0489": "secondTierDiscountUpperLimitEther()", +"a78f16ba": "setWhitelistedStatusInternal(address,address,uint256)", +"a79094b7": "changePolyRegisterationFee(uint256)", +"a7909e47": "DAppReady()", +"a791c665": "WojakCoin()", +"a791da46": "buyXwithdrawForContract(address,uint256,uint256)", +"a7932d20": "marketToken2019()", +"a7944579": "sit()", +"a79726b7": "tokenSpin(uint256)", +"a7972a80": "MoviePass(string,string,uint8,uint256)", +"a7977ffc": "isWhiteListedAndAffiliate(address)", +"a7985ae4": "SNAILMASTER_INCREASE()", +"a7987b58": "LendroidSupportToken()", +"a799464c": "isMyInfra(uint256)", +"a7996adc": "_safePaymentActionAtIco(uint256,address,uint256)", +"a799de7e": "anotherTransferTo(address,uint256)", +"a79a3c30": "teamAlloacting()", +"a79a3cee": "isConfirmed()", +"a79a416d": "SetCommissionRate(uint256)", +"a79ac3be": "ReleaseTokenForReserveFund()", +"a79b2752": "validate(address[4],address,uint256[12],uint256,bytes,uint256)", +"a79c7faf": "test_threeInvalidEqBytes()", +"a79ca634": "_setSubnodeOwner(bytes32,address)", +"a79dad23": "GetBetNums(uint256)", +"a79deb4f": "acceptTradeDeal()", +"a79ec95a": "oneEtherIsHowMuchFST()", +"a79f26dc": "force()", +"a79f4773": "buy_ETH(uint256,bytes8)", +"a79f7412": "withdrawCoinExt(uint256)", +"a79fdbb4": "presalePaused()", +"a7a066b7": "AxtrustICO(uint256)", +"a7a0d537": "something()", +"a7a1019d": "tixPresale()", +"a7a1e0a7": "auditNTVUText(uint8,uint8,string)", +"a7a1ed72": "pass()", +"a7a260cf": "TokenDeployed(uint256)", +"a7a2720e": "processFunding(address,uint256)", +"a7a38f0b": "history(uint256)", +"a7a39daa": "getBrickIdsByBuilder(address)", +"a7a3ba54": "SponsorMusic(uint256,uint256,address)", +"a7a44eba": "getFirstUnionIds(bytes32)", +"a7a5e00b": "updateCustomer(address)", +"a7a604b2": "mintUptoCap()", +"a7a60580": "MeteorToken()", +"a7a62aee": "init(address,uint256,address,string,string)", +"a7a7be1a": "newWriteAddr()", +"a7a8add2": "setSaleAgentContract(address,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"a7a957ff": "getSaleDayNow()", +"a7aac32d": "withdrawAdvisorTokens()", +"a7aad3db": "voterReward(address,uint256,uint256)", +"a7aaf58c": "getPollID(uint256,uint256)", +"a7ab6961": "withdrawalDelay()", +"a7abb8cc": "BM_MasterClass_Reserved()", +"a7abc124": "activate(bool,bool)", +"a7ace55d": "incrementDivisor()", +"a7ae9756": "startNewStakingInterval(uint256,uint256)", +"a7af0b99": "Nerdearla()", +"a7afc1ca": "deactivateCurrentRound()", +"a7b0793b": "setAdvisorFundWallet(address,address,uint256)", +"a7b07acc": "AssetSplit(address,address,address,address)", +"a7b2042f": "phasePublicSale3_From()", +"a7b2bfc7": "multyTransfer(address[],uint256[])", +"a7b2d313": "LogAnswerReveal(bytes32,address,bytes32,bytes32,uint256,uint256)", +"a7b2d4cb": "remove(int256,address)", +"a7b2fc00": "updateTokenNameSymbolAddress(string,string,address)", +"a7b314ac": "stepProfit()", +"a7b3a6fc": "Mine(address,uint256,uint40)", +"a7b4b60f": "erc223Fallback(address,uint256,bytes)", +"a7b69ed9": "PostLicense()", +"a7b71dca": "getJobValue(bytes16,address,address,uint256,uint256)", +"a7b7eefb": "JustmakeToken()", +"a7b7f1d4": "getLatestUnitRaffleInfo()", +"a7b83225": "AgriChainSeal()", +"a7b86824": "lockup(address,uint256)", +"a7b88506": "canRead(address,bytes32)", +"a7b8c868": "startCrowdsaleTime()", +"a7b91780": "getTokensSale()", +"a7b94972": "newBen(address)", +"a7ba0cb5": "createChatRoom(bytes32)", +"a7ba44c3": "isFinalizerSane()", +"a7ba9fb1": "epsilon()", +"a7bb1cf4": "_setRarityBonusValue20(uint256)", +"a7bb5803": "splitSignature(bytes)", +"a7bb959a": "Apen()", +"a7bc2efd": "transferGroupIntertrade(uint256,address)", +"a7bc3cb9": "SafeLocked(uint256)", +"a7bc8c46": "howManyVoters(bytes32)", +"a7bd4791": "MakeItWeinSec()", +"a7bda7e3": "extractNameFromDataET(bytes)", +"a7bdf16e": "isValidBump(uint16[3],uint16[3])", +"a7be2648": "unTrackToken(address,uint16)", +"a7be85c6": "AUTHOR()", +"a7bf1b6c": "purchase(uint256,uint256,address,address)", +"a7bf1cbf": "unfreezeTransfersSince(string)", +"a7bf8921": "freezeContract(bool,uint8[],bytes32[],bytes32[])", +"a7c19841": "preSaleInit()", +"a7c1a708": "LogGameStarted(uint256)", +"a7c1a75b": "maxAuditDuration()", +"a7c1abf1": "decodeMessage(string)", +"a7c1e629": "cancelTransfer(address)", +"a7c25c5a": "setMileagePointPrice(uint256)", +"a7c368c0": "pushBuyerList(address)", +"a7c3ce60": "distributeRegisterFee(uint256,uint256,bytes32,uint8)", +"a7c3d71b": "icoStartTime()", +"a7c41e28": "zennitToken()", +"a7c4abdb": "calculateTokenAmount(uint256,uint256,uint256)", +"a7c5052e": "buildDSTokenRegistry()", +"a7c591c4": "setBest(uint8)", +"a7c5c2a2": "BirthFee()", +"a7c6c83a": "getMystr()", +"a7c6f483": "exchangeRateAuth()", +"a7c742c9": "CommissionEarnedEvent(address,uint256)", +"a7c7d2a0": "airdropValue()", +"a7c7e2a0": "assignOwner(address,address)", +"a7c7fdeb": "transferTokensToOwner()", +"a7c83514": "inflationChange()", +"a7c8e68a": "sealManualMigration(bool)", +"a7c961d5": "bonussale_Cap()", +"a7c9771b": "getVATDeductions(uint256,uint8,uint256,uint8)", +"a7c98748": "test3_searchNext()", +"a7c99f2c": "changeCompetitionAddress(address)", +"a7c9d92f": "HammBones()", +"a7ca3010": "getWithdrawTransactionCount(bool,bool)", +"a7cac846": "weights(address)", +"a7cadc50": "Dagelan()", +"a7cb6edc": "tokenRestriction(address,bool)", +"a7cbe06f": "MaxFunds(address,uint256,uint256)", +"a7cc440e": "getCityResourceRichness(uint256)", +"a7cc90e9": "calculateCounters(uint256,uint256,uint256,uint256)", +"a7cd21ea": "transferPrivilege(string,address)", +"a7cd674e": "whitelist_enable()", +"a7cdc2ad": "getAddressExist(address)", +"a7cebd4d": "createActivity(uint16,uint16,uint128,uint64,uint64)", +"a7cec1d2": "DataStorage()", +"a7cf7edd": "mimul(uint64,uint64)", +"a7cfe365": "addAuction(uint40,uint256)", +"a7d0b6ce": "payoutForResult(uint256)", +"a7d0c490": "keybuy(uint256)", +"a7d0f8af": "callStoWithBto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"a7d27056": "readMessage(uint256)", +"a7d2b73f": "SharkProxy()", +"a7d2d2ab": "AngelCoin()", +"a7d30400": "window1TokenExchangeRate()", +"a7d4549c": "test(uint8,bytes32,bytes32,address,address)", +"a7d4bbe6": "modexp(uint256,uint256,uint256)", +"a7d4e89d": "migrationOperator()", +"a7d512d6": "getCertificateInfoByNo(address,uint8)", +"a7d55b76": "tryDismissRoom(uint256)", +"a7d5d4fa": "approveAddToken()", +"a7d68896": "updateCap(uint256)", +"a7d77305": "chargeMonthlyRate(bytes32,address)", +"a7d8287d": "MyFreezeContract(address)", +"a7d82b00": "setGoldCertVerifier(string)", +"a7d89168": "getLockedAmount(address,address)", +"a7da611f": "commission_mom()", +"a7da74f8": "addQuoter(address)", +"a7daf6dd": "eligibleForDividence(address)", +"a7dbb402": "changeAddress(string,address)", +"a7dbfcaa": "setCostOfToken(uint256)", +"a7dc0aee": "test_threeValidEqString()", +"a7dd7a59": "unchainedMultisigVersionMinor()", +"a7dd7e37": "distrust()", +"a7de83e6": "generate(address,address)", +"a7de9c63": "quantityFactor()", +"a7dea7e4": "getMyPastLosses(address)", +"a7dee615": "_NewListingWhitelisted(bytes32)", +"a7dfc420": "investorAmountTokensToBuy(address)", +"a7dfc874": "unregister(bytes,address,uint256,bytes)", +"a7e03dcb": "mintPerBlock()", +"a7e1a8ee": "setAttributeType(uint256,string)", +"a7e1b516": "unban_user(address)", +"a7e1c4ac": "YunbeiToken(uint256,string,string)", +"a7e1f6a2": "doubleDown()", +"a7e21e80": "hold(address)", +"a7e25683": "testShortOutput()", +"a7e2cca9": "setFinished(bool)", +"a7e328d4": "setSomeValues()", +"a7e33a0c": "sendChatMessage(string)", +"a7e350f7": "payOutGovernors()", +"a7e45699": "buyWildcardToken()", +"a7e47920": "createItems(uint256[],address[])", +"a7e48375": "MikadoToken()", +"a7e53987": "EthCapInWei()", +"a7e5a338": "HIDERA(uint256,string,string,uint256)", +"a7e5cb3e": "getWhoBet(address,uint256,uint256)", +"a7e5f1bc": "LogN_fnc(address,bytes32,uint256,string,bytes,uint256,bytes1,uint256,uint256)", +"a7e5f3c5": "likeBlock(uint256)", +"a7e74377": "_preValidateTransaction(address,uint256)", +"a7e74ab7": "setMx(bytes32,address)", +"a7e7d2f4": "BBXCoin()", +"a7e81d22": "lastBlock_f5Hash_uint256()", +"a7e86daa": "executeBidFor(address,uint256,uint256,uint256)", +"a7e92fb5": "unagree()", +"a7e93e87": "retractLatestRevision(bytes20)", +"a7e94542": "approve(address,uint32)", +"a7ea48cf": "CoinBroToken()", +"a7ead565": "FiO()", +"a7eb3848": "transferRewardWithoutFee(address,uint256)", +"a7eb685b": "mintFeeTokens(uint256)", +"a7eb891f": "isClientPaidUp(address)", +"a7ebc5bd": "privilegedAccountStatus(address)", +"a7ec619f": "getCurrentStageDiscount()", +"a7ecce5f": "removeQuitAccount(address)", +"a7ecd0ad": "getSpecialAddresses()", +"a7ee323e": "VULCAN_PROMETHEUS_FTL_SPEED()", +"a7eea700": "sale2Started()", +"a7eeea37": "NewContributor(uint256)", +"a7ef4329": "getHelloWorld()", +"a7f01e4d": "getLockedFunds(address)", +"a7f07011": "tradeExecutor()", +"a7f0b3de": "genesis()", +"a7f17bd5": "Bodcoin()", +"a7f18b5a": "setPOOL_edit_14(string)", +"a7f1b77a": "addReferralDeposit(address,uint256)", +"a7f2cc54": "feeCalculated()", +"a7f2f4e2": "getMembershipStatus(address)", +"a7f31e0a": "getCelda(uint256)", +"a7f32edd": "OfflineCastleSold(uint256,address,uint256)", +"a7f365ae": "setLockoutPeriod(uint256)", +"a7f36c2e": "setProviderPriv(uint256,bool)", +"a7f39d8a": "tokenSaleWeiGoal()", +"a7f3e70f": "setSaleTimes(uint256,uint256)", +"a7f43779": "remove()", +"a7f43acd": "reserveContract()", +"a7f49e1d": "maximumBuyBackAmountInCents()", +"a7f58c24": "computeInitialPrice(uint8)", +"a7f5eccc": "previousReturnValue()", +"a7f738df": "getRoundAheadAmount(uint256)", +"a7f7417d": "preICOFreeBonusPercent()", +"a7f81863": "thirty_wallet()", +"a7f86c63": "_removeRoomNight(address,uint256)", +"a7f879ea": "teleportToken()", +"a7f8a53c": "ownerSetControllerAddress(address)", +"a7f8fbd4": "cancel_contract()", +"a7f95a92": "HardcodedCrowdsale(address)", +"a7f9801b": "TakedFunds()", +"a7f987ee": "getDebugNow()", +"a7f9df38": "investWithBitcoin(address,uint256)", +"a7f9fe72": "getAllRecords()", +"a7fab81a": "impl_redeem(address,uint256)", +"a7fb95f6": "changeTeamName(uint256,string)", +"a7fbe7ad": "safeLastDate()", +"a7fbed9e": "getCurrentPhaseIndex()", +"a7fc7a07": "addController(address)", +"a7fca953": "getSrcQty(address,address,uint256,uint256)", +"a7fdb4f5": "finishedSale()", +"a7ff0a4e": "TransferTokens()", +"a7ff2373": "multiSendFrom(address,address[],uint256[])", +"a7ff7a40": "MANACrowdsale()", +"a7ffb2db": "getMaximumRound(uint256)", +"a7ffe560": "batchSpawnAsset(address,uint256[],uint256[],uint256)", +"a8006dfe": "exec_admin()", +"a801ea25": "launchLotto()", +"a801fd63": "setNewValue()", +"a802257d": "addr_Saddlery()", +"a8026912": "setSource(address)", +"a802afa1": "minOfArray(uint256[])", +"a80325bd": "toB32(bytes)", +"a804903a": "FOUNDER2()", +"a80498f1": "AdvancedDeposit(bytes32,uint256)", +"a804cc7d": "setUser(address,address,string,string,bool,bool,bool)", +"a804da18": "cliffReleasePercentage()", +"a804fcb4": "COMMUNITY_PERCENT()", +"a805bfef": "addInvestors(address[],uint256[],uint256[],address[])", +"a8074b55": "bundlingDenied()", +"a807598e": "incluirUsuario(address)", +"a8077951": "updateLastBuyKeysPIDs(uint256,uint256)", +"a807ea0f": "newMostInviteTimes_()", +"a8083b74": "setContributionSettings(uint256,uint256,uint256)", +"a8084938": "CryptoCupToken()", +"a80955b1": "setFoundersTokenAllocation(uint256)", +"a80a60fb": "saleFirstPresaleEndBlock()", +"a80a9e40": "setActive(address,address,uint256)", +"a80acfd3": "DisableSelling()", +"a80aee59": "isActiveDelegate()", +"a80bf3e6": "tokenLocker()", +"a80bffb6": "tokensOfSell()", +"a80c609e": "tokenImbalanceData(address,uint256)", +"a80c89d2": "RollbackedContract(uint256,address,address)", +"a80d2fb4": "getPeerMessageCount(address,address)", +"a80d4e9a": "EtherAuction(uint256)", +"a80da0f1": "SpursvsWarriors419()", +"a80da34a": "propertyAreaSqFtOf(uint256)", +"a80db9fb": "nextStealTimestamp()", +"a80dca57": "recharge(string)", +"a80de5ea": "lottery(uint8)", +"a80e3659": "testDisputedReadValid()", +"a80e6c01": "getClassPlayers(uint256,uint256,uint256)", +"a80f54ca": "transferToExchange(address,uint256)", +"a80f9e2d": "RankingBallGoldCustomToken(address)", +"a80fe377": "Goahead()", +"a8103621": "dividendsPayed()", +"a810385e": "setBla(string)", +"a8103c80": "SSHToken(uint256,string,uint8,string)", +"a81077a7": "usersRegistered()", +"a810a54c": "withdraw(bool)", +"a810bc13": "ETCharPresale_v2(address)", +"a8132a46": "hardCapInToken()", +"a8140c95": "OceanScapeCoin(uint256,string,string)", +"a8150e72": "removeOrderOfVendor(address,uint256)", +"a8154e17": "teamUnfreezeDate()", +"a815a85d": "getItemCounts()", +"a815ff15": "set(string,address)", +"a8164a84": "ThxMsg(address,string)", +"a816899e": "icoBalances(address)", +"a817163b": "BusTokenLock(address,address)", +"a817ccac": "threeParams()", +"a817d2de": "extract20(bytes32)", +"a817f668": "findPlayer(address)", +"a8181851": "dapCarToken()", +"a8182cd3": "serverCancelActiveGame(address,uint256)", +"a818a222": "TokenAdded(address,uint256,uint256)", +"a819515d": "updateParentTotalTheoreticalSupply()", +"a819819b": "sweepDeityCommission(uint256)", +"a819c36c": "ClapToken()", +"a81a3e4d": "hasOpenApplication(address)", +"a81afa57": "sellSpecialTokens(address,uint256)", +"a81c3bdf": "ethFundDeposit()", +"a81c804e": "addToWhitelistBulk(address[])", +"a81d18d7": "setTokenMeta(uint256[],uint256[],uint256[])", +"a81d3424": "getFrozenToken(address)", +"a81daf29": "ETHernitymining(address)", +"a81dfde0": "CBT()", +"a8201894": "getCurrAuctionPriceAuctionID(uint256)", +"a820b44d": "iterateStart()", +"a820d02e": "MarketingDevelopmentAmount()", +"a8222adf": "sellerNumOpenDeals()", +"a82375d1": "ToGoConcert(uint256,string,string)", +"a8239d0b": "getPrice(string,address)", +"a8243ff4": "getactlen()", +"a824bd9a": "autoSell(address,uint256)", +"a824e636": "walletSend(address,uint256,address)", +"a82524b2": "presaleStartTime()", +"a8267482": "msp()", +"a826b422": "addCbAddress(address,bytes1,address,bytes)", +"a826ee78": "submitResult(uint256,uint256[])", +"a8276d97": "SetcashOutTime(uint256)", +"a827ef0a": "EvLoveItemAdded(bytes32,address,uint256,uint256,string,string)", +"a828251e": "voteProposal(bytes32,address,address,uint256,bytes32,string,bytes)", +"a8287f79": "addProduct(address,uint256,string,string,string)", +"a828eec5": "pureFn(uint256)", +"a828f441": "redeemFromEscrow(uint64)", +"a82970d7": "SetWorldData(uint256,uint256,uint256,uint256,uint256)", +"a829c3d1": "requestArbitration(bytes32,uint256)", +"a829d8ec": "VUP_TOKEN_SUPPLY_TIER4()", +"a82aa270": "updatePick(uint256,uint256)", +"a82b3640": "getDrawP()", +"a82ba2d5": "renounceKeeper()", +"a82cb091": "BuyDoubler()", +"a82d1d1a": "TwinkleToken()", +"a82d4ac1": "Crowdfunding(address,address,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"a82e0dcc": "theCyberMessage(string)", +"a82e1374": "changePublicallocation(uint256)", +"a82e3179": "jingleContract()", +"a82fc94f": "issueTokensPresale(address[])", +"a8308665": "add5NewTraits(string,string,string,string,string,bool)", +"a8311aa8": "getParties()", +"a831751d": "addPartOwner(address)", +"a8319481": "cancelRole(address,address)", +"a831f0bb": "compareStringValue(bytes32,bytes32,bytes1)", +"a8321459": "topUpAvailable()", +"a8324a3f": "batchRestoreWebGift(address[])", +"a832d7df": "newSell(uint32,address,uint256)", +"a83332d5": "TokeniVOX(uint256,string,string)", +"a833386b": "toBytes32()", +"a833c7ab": "incentivisationAllocation()", +"a83467a1": "dividendcommission()", +"a8347f6a": "maxCrowdsaleCap()", +"a834c43d": "buyAccess(string)", +"a83500e0": "check_redeemed(string)", +"a8351c03": "pauseCrowdsale()", +"a83627de": "updatePeriod()", +"a8366fef": "TOKEN_STANDARD_ERC20()", +"a8370492": "setTrFee(uint256)", +"a83723f3": "runRotateTime(uint256[],bytes32,bytes32)", +"a8372511": "STCoin(uint256,string,string)", +"a837aeb2": "AdminStartDraw(string,bytes32)", +"a837c35e": "createAmountFromEXORForAddress(uint256,address,address)", +"a8385231": "sendTokensToAddress(uint256,address)", +"a839fc56": "setGoalAchieved(bool)", +"a83b1e21": "reply(string,bytes32)", +"a83cf7fe": "RefundVault(address)", +"a83e1d10": "getUserQuoteIds(address)", +"a83f9429": "extend1Week()", +"a840617f": "LogKycRefused(address,uint256)", +"a840d2a8": "GTO()", +"a8418d01": "BECToken(uint256,string,string)", +"a841da4b": "lockJackpots()", +"a841f1eb": "handleFunds(address,address,uint256)", +"a842375e": "refundToken(address)", +"a842f0f2": "upgradableContractAddress()", +"a843c51f": "transferContractOwnership(address)", +"a843c97f": "attack(uint256,uint256,uint256[])", +"a844545d": "completeMinting()", +"a84524a4": "getDetailedPollResults(uint256,uint256)", +"a84694c8": "permissionIndexOf(uint8,address)", +"a8469ce9": "MINING_REWARD()", +"a846c2fd": "payback(uint256)", +"a846fa37": "waitQuery()", +"a8474a30": "_computeRunes(uint256)", +"a847a1b3": "StarbasePresaleWallet(address[],uint256,uint256)", +"a847a71c": "isOnTrading(uint64)", +"a8484938": "doApprove(address,uint256)", +"a848e2ec": "tokenSupportSoftLimit()", +"a8492f46": "pickTicket(bytes4)", +"a84950df": "calculateTimeBonuses(uint256)", +"a8496426": "getOrderId()", +"a849cef8": "minDeposits(uint256)", +"a84a70aa": "lockedTime(uint256)", +"a84b9de0": "dequeueDouble()", +"a84c5330": "createNewRevision(bytes20,bytes)", +"a84c6362": "ICO_CAP4()", +"a84d073a": "interfaceMintTokens(address,uint256)", +"a84dd3a6": "teamWallet_3()", +"a84e5f40": "CRYPTONEREUM()", +"a84eb999": "removeAddresses(address[])", +"a84ebb58": "setVM(bytes32[10],uint256[4])", +"a84f3e5a": "overdraftUnvested()", +"a84f763b": "TokenTransferred(uint256,address,address)", +"a84fa137": "transferToRound(uint256)", +"a8514113": "_emitCategoryEvaluated(address,address,uint8,uint256,uint256)", +"a85165e0": "checkSubPrice(bytes32)", +"a8516d21": "_withdrawTokens(address,uint256)", +"a851e2f6": "LogCreateNET(address,uint256)", +"a852995d": "bonus1StartETH()", +"a852d5ba": "emergency_withdraw(address)", +"a853d2cd": "getUserByUsername(bytes20)", +"a8540daa": "getSellPriceDecimals()", +"a8542f66": "ANY()", +"a8545830": "transact_token1(address,address,uint256)", +"a855d4ce": "uintStorage(bytes32)", +"a8565523": "AquaPay(string,uint256,uint8,string)", +"a8567a1c": "bidderUpdateBid()", +"a85688d2": "_rewardPoS()", +"a856b9c2": "lastRandom()", +"a85717d3": "open(bool)", +"a8575102": "getDnasCount()", +"a8590135": "issuanceEnabled()", +"a85923aa": "ZibPay()", +"a859a092": "minToken()", +"a859eb81": "BONUS_TIER_4_LIMIT()", +"a859fffe": "SweDexDividends()", +"a85a726d": "NewUser()", +"a85aba19": "setPreURI(string)", +"a85ade82": "FOUNDERS_VESTING_DURATION()", +"a85adeab": "endTimestamp()", +"a85b13b9": "claimBitNauticTokens()", +"a85c06b7": "_packRaceData(uint256,uint256,uint256,uint256)", +"a85d11b3": "verifyCode(bytes32,uint256)", +"a85d3179": "getMiningRate(address)", +"a85e07e2": "getMesa(uint256,uint256,uint256)", +"a85e59e4": "transferFrom(bytes,address,address,uint256)", +"a85ef579": "appendDarknode(address,address,uint256,bytes,uint256,uint256)", +"a85f3761": "repayments(uint256)", +"a85f5c2e": "tradingData()", +"a85ffd1a": "setAutoDistributionViaETHContributions(bool,bool)", +"a85ffe4f": "manualSell(address,uint256)", +"a860bfa2": "BRCToken()", +"a860d119": "communityTokenHolder()", +"a861baea": "presale_address()", +"a861e16f": "setEmployeeSalary(address,uint256,uint256)", +"a861f99a": "getClientPaidUpTo(address)", +"a8627c15": "LINICOIN()", +"a863f595": "Btczocker(uint256,string,uint8,string)", +"a86416e2": "CROWDSALE_PRICE()", +"a8644cd5": "contract_eth_value_bonus()", +"a86477ad": "offeringEnabled()", +"a8648aad": "TokenFunctions()", +"a8659216": "setInitialLockinDays(uint256)", +"a8660a78": "vestingStartTime()", +"a866665a": "ConsoToken()", +"a8670711": "isCloseSale()", +"a8681169": "withdrawWhiteList(uint256)", +"a868378b": "returnOfIncome(address,uint256)", +"a8683df7": "TokenMyUnicoin(uint256,string,string)", +"a868cd6f": "LogPolicyManualPayout(uint256,bytes32)", +"a868ec85": "setName(uint256,uint256)", +"a86abb3d": "allFilmsInfo(uint256)", +"a86b73f0": "toByte(uint8)", +"a86bc181": "EXPECTED_END()", +"a86c938b": "balanceOf(bytes8,address)", +"a86e3576": "symbol(address)", +"a86ed5e4": "thirdMaxAmount()", +"a86ee746": "restoreCutieToAddress(uint40,address)", +"a86f7212": "_allocatePlayerTokensTo(address,uint256)", +"a870a0a5": "getChannelClosingSettler(bytes32)", +"a870be8a": "setVendingStepValues(uint256,uint256,uint256)", +"a870ddc2": "moveTokensFromSaleToCirculating(address,uint256)", +"a871da91": "SHORT()", +"a871ffdc": "Getsafe(uint256)", +"a87253c7": "getlastuser()", +"a873b155": "GetMinimumBet()", +"a8740a71": "getCreditLedger(uint256)", +"a8754caa": "purchaserMapping(address)", +"a8756337": "getCurrentValidatorsLengthWithoutMoC()", +"a87595ce": "buynowPrice()", +"a875b2ed": "setIsBatch(bool)", +"a87607af": "Show_address_for_option_B()", +"a8762854": "numberInRaffle()", +"a8766017": "ARXToken()", +"a876a8a0": "_round()", +"a877b557": "TransferMinimumFeeExecuted(uint256,address,uint8)", +"a877db9f": "none()", +"a878ad27": "createTokenToOperation()", +"a878aee6": "withdrawAllTokens(address)", +"a8790533": "distribution(address[],address,uint256,uint256,uint256,uint256,uint256)", +"a879af45": "oldTokenBalance(address)", +"a879fcbb": "assetInfo(uint256)", +"a87af57b": "setTokenForSale(uint256,uint256,address,bool)", +"a87b1cd2": "whitelistedBeforeActivation(address)", +"a87b73c7": "StageOpened(uint256)", +"a87ced35": "startDispute(bytes32,address,int256)", +"a87d2321": "Gummy()", +"a87d8b6b": "walkClientOrders(address,uint128,uint128)", +"a87d942c": "getCount()", +"a87de9cc": "ADD(uint256,uint256)", +"a87e0c33": "newAgon(uint64,uint64)", +"a87e5d3f": "setPriceUpdateFrequency(uint256)", +"a87e7552": "isValid(bytes,bytes)", +"a87e8aad": "getMyCat()", +"a87ebcb5": "setJackpotMinimumAmount(uint256)", +"a87f32a2": "ownFiles(string,string,string)", +"a87f84fc": "updatePersonLocation(uint256,string)", +"a87ffd1d": "GenesisInitialSupply(address,address)", +"a880319d": "addToken(address,string,string,uint8,bytes,bytes)", +"a880531f": "getOraclizeCbAddress()", +"a8817403": "addFamedStar(string,uint256,uint256)", +"a881f85e": "clearTokenSale(uint256)", +"a8825650": "slice(bytes32[],uint256,uint256)", +"a8826602": "getAllCellIds()", +"a882d49f": "replaceMultisig(address)", +"a8834aac": "getPointer(uint8)", +"a8836844": "returnPayees()", +"a883aab3": "GlobalAmountCapHard()", +"a883b0c4": "changeRate(uint256,uint256)", +"a883fb90": "getPendingVersion()", +"a884a248": "getFill(bytes32)", +"a885508a": "removePermissionManager(address,bytes32)", +"a885dab6": "getTokensPerDay(uint256)", +"a8862fcc": "isEscaping(uint32,int256)", +"a8865bda": "masternodeIsValid(address)", +"a886d66f": "crowdsaleList(uint256)", +"a8870d6f": "mintingDataUpdatedAtBlock()", +"a88775e0": "rememberOldestBlock()", +"a887d816": "checkTransferRequirements(address,uint256)", +"a888e4c9": "releaseSingleAm()", +"a8893a6e": "getNumOfSalesWithSameId(bytes16)", +"a88b2562": "AZLTEST()", +"a88b61aa": "isIncreasedEnough(address)", +"a88be96b": "RESERVE_EXCHANGE_RATE()", +"a88c0a9f": "LAMP()", +"a88c5ef7": "NextPayout()", +"a88c906c": "_buyUninitializedPixelBlock(uint256,uint256,uint256,bytes32)", +"a88d1902": "get_asset_count()", +"a88e34cb": "setERC20address(address)", +"a88ec6fa": "showUnpaidDepositPercent(address)", +"a88ef2d3": "CarlosToken()", +"a88fa4b4": "updateStartTimeManually(uint256)", +"a88fe42d": "setPrices(uint256,uint256,uint256)", +"a88fe73a": "discountValue10()", +"a89004c5": "modifyQuanticCloudIOTData(uint256,uint256)", +"a89026a3": "teamProfitAddress()", +"a890b7d9": "finalize(address,bool)", +"a890d257": "IsThisPrivate()", +"a8915c7e": "periodPreITO_weiPerToken()", +"a89171e3": "checkHasilBet(address)", +"a89196a6": "eraExists(bytes32)", +"a891af67": "megaCandy()", +"a891fdc3": "earlybirdEnded()", +"a8928b45": "withdraw_internal(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[4])", +"a8929183": "LinkyexToken(address,address)", +"a894878d": "createPromoMeme(address,uint256,string,uint256)", +"a8967557": "isPresaleClosed()", +"a896d92d": "isRegularAddress(address)", +"a8977041": "Plenum(uint8,uint256)", +"a8978434": "softResolveAnswer(uint256)", +"a8986327": "minTokenForSP()", +"a899e615": "raiseRatio()", +"a899ef57": "parentSnapshotId()", +"a89a4f09": "creatorBalanceChecker()", +"a89acca4": "setCrowdsaleDates(uint256,uint256)", +"a89ae4ba": "oracleAddress()", +"a89c5be0": "MAX_TOTAL_TOKEN_AMOUNT()", +"a89c8c5e": "setTokenAddresses(address,address)", +"a89cdad9": "nextSnapshotTime()", +"a89d1eb9": "foobarToken()", +"a89f173c": "setUint(int256,uint256,uint8,uint16,uint32,uint256)", +"a89f5f85": "cmp(uint256,uint256,bool)", +"a89fb977": "investorDeposited(address,address)", +"a8a01c3e": "cvcOwner()", +"a8a1d27b": "firstRoundWMTokensLimit()", +"a8a403df": "MaptPresaleToken(address,address)", +"a8a4bf11": "startNewAuction(uint64,uint64,uint64,uint64)", +"a8a52747": "getRelayedSender(bytes16,uint8,uint128,uint8,bytes32,bytes32)", +"a8a54008": "registerAddress(address)", +"a8a5c22c": "refineCost()", +"a8a618e9": "draw_random_card(uint8)", +"a8a6e9df": "deliveryToken(uint256,uint256)", +"a8a77984": "StoreBytes(bytes)", +"a8a9aaa9": "TokenLayer(address,address)", +"a8aa1b31": "pair()", +"a8aa7e19": "buyTeamHandle(string)", +"a8aaa2a6": "StringMapper()", +"a8aae025": "delFromList(string,address[])", +"a8abe1fb": "getCET4ScoreById(uint32)", +"a8abe69a": "getTransactionIds(uint256,uint256,bool,bool)", +"a8ac262b": "phaseCrowdsale()", +"a8ae3745": "evaluateTokens(uint256,address)", +"a8ae3e4b": "getAllocatedTokenValue(address,address,address)", +"a8ae5eb8": "howManyTanks()", +"a8ae9046": "RFToken()", +"a8aeecd9": "getCostForBattleCards(uint256,uint256,uint256)", +"a8af232b": "withdrawTopUp()", +"a8af4ff5": "getRegistrationStatus(address)", +"a8af6e05": "emitHashSet(address,bytes32,bytes32)", +"a8af74f1": "calcTrackerCount(uint256)", +"a8afc538": "priceAtInitialAuction(uint256,uint256)", +"a8b0312c": "GameStatus(uint8,uint8,uint8,uint8)", +"a8b05162": "_changeTilePrice(uint8,uint256)", +"a8b151fd": "santaFundWallet()", +"a8b1895d": "leftLottery()", +"a8b25075": "allowTransfers(bool)", +"a8b26420": "isUInt64ValidIn64(uint64)", +"a8b31f04": "HHH3(string,string)", +"a8b322b6": "verifiedWinnersCount()", +"a8b3f80f": "getListTokens(address,uint256,uint256)", +"a8b415d2": "BanliangCoin()", +"a8b42f1f": "registerAsAnOpponent()", +"a8b50ee0": "getWinnningsLength()", +"a8b57f15": "VIPPurchase(address,address,uint256,uint256)", +"a8b60b93": "ackMsg(uint256,string)", +"a8b65043": "useChainlinkWithENS(address,bytes32)", +"a8b82c5b": "BaseAgriChainContract()", +"a8b86c4c": "ZchargeToken(uint256,string,string)", +"a8b8799f": "getRecordId(uint256)", +"a8b88268": "checkEarlybird(uint256)", +"a8b973a1": "bonusMultiplier()", +"a8b981d3": "FOURTH_RATE()", +"a8baa97d": "getPlayerDetectGroup(address)", +"a8bb76d4": "checkSettlement()", +"a8bbe5a4": "ERC20Voting(address)", +"a8bc362e": "KleynCoin()", +"a8bc3a6c": "whitelistedPlannedContributions()", +"a8bcbf3c": "payManagementBodyAmount(uint256)", +"a8bd9c32": "tokenIndexToApproved(uint256)", +"a8bda3e9": "getTRed(uint256,uint256,uint256)", +"a8beb2cf": "Lockup6m_20180801(address)", +"a8bfd57f": "getMinerOffset()", +"a8c0f15e": "addProperty(bytes32)", +"a8c10d78": "BetSubmission(uint256)", +"a8c12d7c": "PayMain(address)", +"a8c17ec2": "incremental(uint256)", +"a8c1a0b7": "BuyTokensExternal(address,string,uint72,uint88,uint88)", +"a8c23cb9": "isValid(bytes32,string,address,uint256,address)", +"a8c278a2": "verificationFee()", +"a8c2c4a7": "mainICOEndTime()", +"a8c310d5": "distributeAmounts(address[],uint256[])", +"a8c3d246": "LamaToken()", +"a8c3ec48": "oraclize_query(uint256,string,string[2])", +"a8c499a0": "lrcDeposited()", +"a8c4c8bc": "right64(uint256)", +"a8c65126": "determineNextRoundLength()", +"a8c69264": "setreleaseFinalizationDate(uint256)", +"a8c6e684": "addint16(int16,int16)", +"a8c89c5b": "payableEnabled()", +"a8c923e2": "BlockchainDevCoin()", +"a8c9f8ae": "unSoldTokens()", +"a8ca698b": "absSub(uint256,uint256)", +"a8cab3d1": "Frozen()", +"a8cb7b4f": "ownerRequired()", +"a8cbabb7": "blockCrowdsale()", +"a8cbb5de": "addMake(uint256)", +"a8ccef6c": "setClue2(string)", +"a8cd0a80": "getTest()", +"a8cdcebd": "exchangeIdsToOpenMakeOrderIds(uint256,address)", +"a8ce0e60": "QuestTestToken()", +"a8ce6b73": "calculateWithdraw(uint256,uint256,uint256,uint256)", +"a8d00e73": "dayLength()", +"a8d088bb": "getManagers()", +"a8d10fb8": "getOrgCount(string)", +"a8d18472": "estWolkToBurn(address,uint256)", +"a8d18bc0": "HireGoCrowdsale(uint256,address)", +"a8d1fcff": "cancelNewBallot()", +"a8d201ab": "removeNodeFromWhitelist(address)", +"a8d34ea5": "getCompte_10()", +"a8d3a63d": "pullEtherFromContractAfterICO()", +"a8d48709": "EARLYBIRD_PRICE_MULTIPLIER()", +"a8d49e64": "setWhitelistAdmin(address)", +"a8d4a03b": "heroes(uint256)", +"a8d4ee0f": "setOwnerExt()", +"a8d51f7e": "GiftToken(address)", +"a8d5308c": "bountymanager()", +"a8d5652e": "tokensPerTier()", +"a8d5efa3": "CATPayment(address,address,uint256)", +"a8d5fd65": "share()", +"a8d84b7c": "purchaseWithIndex(uint256,uint256)", +"a8d84fc3": "activeEnd()", +"a8d88127": "exists(int256,int256)", +"a8d8c7c8": "adddayeths(address,uint256)", +"a8d8e055": "checkAddressBatch(address[])", +"a8d95496": "getHighestPriceOwnerAt(uint256)", +"a8d95fb2": "claim(address,string)", +"a8d99045": "totalSellCardNumber()", +"a8d9a89a": "initialICOCap()", +"a8d9e8a3": "sendFeeIfAvailable()", +"a8da6873": "_fetchCreatedOrdersForPayer(address)", +"a8dab783": "isPASigned(uint32)", +"a8db1837": "test_updateAndGetPrice()", +"a8db2445": "setCompany(address)", +"a8dc824c": "unlockSupply()", +"a8dd07dc": "totalBonus()", +"a8ddefab": "withdrawNacNetfRe(uint256)", +"a8df3e69": "post(address,address,uint256,string)", +"a8df7894": "investDirect(address,uint256)", +"a8df80ad": "Hellob()", +"a8df99a9": "_emitSkillsSet(address,uint256,uint256,uint256)", +"a8e02ccb": "activeCall(address)", +"a8e04f34": "disableInitialStage()", +"a8e1903c": "RevokeTokens(address)", +"a8e1b53f": "AICoin(address,uint256)", +"a8e3371a": "eduCash(uint256,string,string)", +"a8e3a6b6": "communityTokensCap()", +"a8e48a7e": "PausableCrowdsaleImplUnpaused(uint256,uint256,uint256,address)", +"a8e496b9": "toDay(uint256)", +"a8e4fb90": "proposer()", +"a8e553f5": "decrypt(uint32[26],uint32[4])", +"a8e5740c": "setOgToken(address)", +"a8e5e219": "jobStatus(uint256)", +"a8e5e4aa": "approveERC20(address,address,uint256)", +"a8e6e77b": "addManyAdmins(address[])", +"a8e6ee52": "goldCertVerifier()", +"a8e6f9dc": "set_property_address(uint256,string,address,string,string,string)", +"a8e70dd3": "unblockMessagesFrom(address)", +"a8e81844": "GeneBTC()", +"a8e8f677": "maxDice()", +"a8e91396": "setICOPriceatDollar(uint256)", +"a8e9b249": "versionSelectors(bytes32,bytes32)", +"a8ea8554": "changeAmount()", +"a8eaefd7": "TotalFee(address[])", +"a8ec9ffb": "CrowdsaleStageStarted(uint256,uint256,uint256,uint256,uint256)", +"a8ecc7f1": "rbac()", +"a8ed1be5": "bts_address2()", +"a8eee036": "Locality(string)", +"a8ef4b66": "PERMISSIONMANAGER_KEY()", +"a8ef6edd": "testTrusting()", +"a8f02555": "DXF_Tokens()", +"a8f03616": "ownerTokenSharePct()", +"a8f06876": "CETToken(uint256,string,string)", +"a8f07dcc": "minimum_investment()", +"a8f0d3a7": "getArrayBytes32(bytes32)", +"a8f0e6e2": "sellPriceOf(uint256)", +"a8f0ebeb": "decreaseClaimsBalance(address,uint256)", +"a8f0fbbd": "helloToken()", +"a8f11eb9": "autoDistribute()", +"a8f2ba4c": "bet_win()", +"a8f2d63b": "isPublicTokenSaleRunning()", +"a8f436df": "startEvaluating()", +"a8f56600": "model_accuracy_criteria()", +"a8f5bbd9": "initiateUser()", +"a8f5c673": "savePepe(uint256)", +"a8f653fa": "finalizeStage()", +"a8f6c913": "erc20Contract()", +"a8f6d313": "minimumFundingUSD()", +"a8f6d84d": "returnPercentage()", +"a8f6f1f0": "randomGenerateMethod()", +"a8f7e238": "getAdminsForGame(uint256)", +"a8f7f82d": "ICO_start_future(uint256)", +"a8f8884d": "botIndexToApproved(uint256)", +"a8f899a0": "LogBuyForInvestor(address,uint256,string)", +"a8f8c6de": "getCollaborated(uint256)", +"a8f8e2ae": "testFailIfReverts()", +"a8f927e9": "getLanguage()", +"a8f92b52": "MindCoin(uint256,string,string)", +"a8f9868e": "getTotalBalanceFor(address)", +"a8fa14b0": "disableContractUpgradability()", +"a8fa2fc6": "getCurrentDevReward()", +"a8fa5682": "dnsRecord(bytes32,bytes32,uint16)", +"a8fa6e14": "setLastRewardTime(uint256,uint256)", +"a8fa8e52": "valuePerToken()", +"a8fac082": "claimMonthlyDemurrage(uint256)", +"a8faf6f0": "SmartAirdrop()", +"a8fc1a2a": "realDevReward()", +"a8fc32de": "sendDividends()", +"a8fca0fc": "toRtc(uint256)", +"a8fd1026": "gemPerEther()", +"a8fdb290": "EtherToken(uint256,string,string)", +"a8fdf903": "_underMintNextTokenId(uint256)", +"a8fe43ce": "getVotingProxy(uint32,int256)", +"a8fe5465": "PRE_SALE_15_BONUS_MIN()", +"a8feda51": "processRefunds()", +"a8ffa37f": "gameTokenResolution(uint256,address,uint256,address,uint256)", +"a8ffa9d9": "addCandidato(string)", +"a9011990": "getOneDepositRec(uint256)", +"a90135df": "pgoInternalReserveWallet()", +"a9014b0f": "isListed(uint64)", +"a9018896": "refreshScore(uint8,bytes32)", +"a901aaa0": "AirRewardmaxTotalSupply()", +"a901ce92": "founderTokenWithdrawnPhase4()", +"a9030162": "refundFish(address,uint256)", +"a903073e": "getOwnerTeam(address)", +"a9036b43": "Minter(address,uint256,uint256,uint256)", +"a903741a": "TEAM_BONUS()", +"a904cc53": "withdrawEtherBalance(uint256)", +"a904d13d": "setShifter(address,address)", +"a904e5c8": "TRM1BonusActive()", +"a9055b81": "makerRequiredKncStake(address)", +"a9059cbb": "transfer(address,uint256)", +"a905f4c0": "DUOLINGO(uint256,string,string,uint256)", +"a9061415": "getsellmoney(uint256)", +"a9064e29": "indexshow()", +"a906f837": "relocationSwitch(bool,address)", +"a9076f9e": "setBidding(bool)", +"a908f2e3": "Faucet(string,address)", +"a9092c11": "numChoices()", +"a909d7d3": "removeTokenEmission(uint256)", +"a909fc56": "mint(int256,address)", +"a90a4ac2": "addStruct1(string)", +"a90a6427": "setPaydayFrequencyInDays(uint8)", +"a90a6952": "EmissiveErc223Token(address,string,uint8,string,string)", +"a90a8eea": "getDaysInYear(uint16)", +"a90ae887": "claimPayment(uint256,uint256,bytes)", +"a90b5e62": "setTokensContractAddress(address)", +"a90d3cda": "totalContributionsBy(uint256,address)", +"a90e0608": "icoFinalized(uint256)", +"a90e09e2": "addWhitelisted()", +"a90e65a3": "MinorPrizePayout(address,uint256,uint8)", +"a90eb2b9": "sendFundsToNextCycle(uint256,uint256)", +"a90f8e9a": "referredBy(address)", +"a90fcfa0": "_generateName(string,string)", +"a90fd971": "minerRelaseTime()", +"a90fdf20": "test_bytes(bytes)", +"a910a531": "_approveTokenTransfer(address,address,uint256)", +"a9112140": "change(address,uint256,uint256)", +"a91202d3": "createUser(bytes32,bytes32)", +"a9120f6d": "release_by_manager()", +"a913c43f": "getLockedAmount_jiedians(address)", +"a913eb24": "_price_token_ICO2()", +"a9142808": "logFollowerTradingTx(bytes32)", +"a9147e22": "setIsCheckStage(bool)", +"a9157518": "add5NewStreetNames(string,string,string,string,string)", +"a9171d56": "purchaseCallbackOnAcceptAndDistribute(uint256,address[],uint256[])", +"a9188878": "setPrimordialPrices(uint256,uint256)", +"a918c09c": "supplyFuel(uint256)", +"a91a1080": "getCase(uint256)", +"a91a39ad": "havedCrowdCoin()", +"a91aae63": "NihilCoin(uint256,string,uint8,string)", +"a91abdcb": "referralCut()", +"a91b2e9f": "getProfit(uint256)", +"a91bc3cd": "nextMinimumTimeout()", +"a91be87f": "addEarlylist(address[],address)", +"a91c39a9": "setEnergyCost(uint256)", +"a91ce985": "createOrder(address[3],uint256[4])", +"a91cec21": "ineRexToken()", +"a91cfecf": "Foosball()", +"a91d6c65": "initLockedBalanceOf(address)", +"a91d99db": "whitelistAddressesPresale(address[])", +"a91ed8c6": "mintReserve(address)", +"a91ee0dc": "setRegistry(address)", +"a91f559d": "NeLunaCoin()", +"a91faadf": "JoshContract()", +"a91fbb99": "MonetoSale(address,address)", +"a91fc821": "Registry(address,address,address)", +"a9203f3c": "getFlower(uint256)", +"a92100cb": "loop()", +"a921ba7d": "totalBattleboards()", +"a9221706": "_transferAndCall(address,address,uint256,bytes)", +"a9225743": "_commitBallot(bytes32,uint256,uint256,bool)", +"a92259fc": "AVAILABLE_TOTAL_SUPPLY()", +"a923ebac": "unbindEthereumAddress(address,bytes32)", +"a923fc40": "setInfo(string,string)", +"a9240e32": "setEtherRatioForOwner(uint256)", +"a924d3ca": "getMangers()", +"a924ee60": "disableTokenMinting()", +"a9250212": "publicationCount(address)", +"a925252a": "acceptAuctionResult(address,uint256,string)", +"a925d85e": "Exchange(address,address)", +"a926819f": "disableWallet(address)", +"a927f46b": "Etherwow()", +"a9287619": "buyXaddr(uint256,address)", +"a9293efe": "calculateSeasonScore(address,int8)", +"a92950f6": "chainWith(uint256,uint256)", +"a9298848": "askForALoan(address,uint256,uint256)", +"a92aafb0": "paused_1()", +"a92ab316": "EIN()", +"a92c300a": "getBidData(uint256)", +"a92c3231": "stageNumber()", +"a92ca27d": "editionInfo(uint256)", +"a92d5367": "changeTournamentTaxAmt(uint8)", +"a92d6a48": "disableAuthentication()", +"a92ec661": "isAfterStartTime()", +"a92f0c80": "TokenVesting(uint256,uint256,uint256)", +"a92f0cb9": "withdrawFailedOldOwnerTransferAmount()", +"a92fcf9c": "addRecord(string,string,string,bytes32,int64)", +"a9321573": "addExcluded(address)", +"a9324192": "walletOut1()", +"a9328435": "getMinimeCheckpointsLengthSlot(address,uint256)", +"a932ed0d": "whitelistRemove(address)", +"a934dd0c": "getFeeAmount(uint256,uint256)", +"a936444a": "POWH33()", +"a936c203": "reLoadXid()", +"a937c28b": "authorisedInvestors()", +"a937f12b": "TidealToken(address)", +"a9390454": "DevvotePrefund(address,address)", +"a9393452": "getAuctions(uint32,uint32)", +"a9396a1b": "getStageInfo()", +"a93a77c1": "available_percentage()", +"a93b1a65": "_referrerTax(uint256,bool)", +"a93b5331": "totalFundingSupply()", +"a93c1286": "Y2CASH()", +"a93d7c72": "quickChange(address[],uint256,uint256)", +"a93deda4": "Philanthropy(address,string,uint256,uint256,uint256,uint256,uint256)", +"a93e0386": "preSaleBonus4Amount()", +"a93e2b49": "YBQ()", +"a93e4044": "getCountTokensByLottery(uint32)", +"a93e8701": "BetCanceled(address,uint256)", +"a93fd5f1": "organizer5()", +"a940565e": "haveIBeenNaughty(address)", +"a9405923": "getParent(address)", +"a9405f4f": "HashToFileName(string)", +"a940d013": "ether_profit()", +"a9414cc3": "getPositionsAndTokensCnt(uint256)", +"a941be3c": "internalBuy(address,uint256,bool)", +"a941c8d6": "calculateWinningEntries()", +"a941ff21": "getCampaignEndDateById(bytes32)", +"a942bf05": "dDeployCommunityBallot(bytes32,bytes32,bytes32,uint128)", +"a942de01": "createSetup(uint256,uint256,address[])", +"a9430dcb": "Shabu()", +"a94385a0": "donateFromWallet(uint256)", +"a94387a6": "raiseBuyOrderCreated(address,uint32,uint32,uint80,uint256,int160)", +"a943c21f": "getVotingResult(address)", +"a9445499": "ZperMainSale(address,uint256,uint256,uint256)", +"a944f15b": "createAuction(address,uint16,uint16,uint256,uint64,uint16,uint16,uint64,uint256)", +"a94510ca": "withdraw_badge()", +"a9457d9c": "whatIsCurrentCap()", +"a945c5c3": "totalInvestments(uint256)", +"a945f90f": "partnersWallet()", +"a9466a88": "getAllScripts(uint256)", +"a946d7bb": "setMedalsClaimed(uint16)", +"a9472396": "getClientReward(uint256)", +"a94834a1": "openGameRange(uint256,uint256)", +"a948d72d": "ZethrBankroll()", +"a9496e73": "timeBeforeJackpotReset()", +"a949c637": "addOwner(address,address,address)", +"a949f3af": "getMyLastCollectHour(uint32)", +"a94a06e8": "findRegularTime()", +"a94ab274": "corePay(uint256,uint256,uint256,string,uint256)", +"a94c33a6": "Auxilium()", +"a94c468d": "RemoveRank(uint256,uint256)", +"a94c7c65": "limitedPrint(address,uint256)", +"a94e7ed4": "isSpecificallyApprovedFor(address,uint256)", +"a94feacc": "claimTokenWindowOpen()", +"a95022a6": "GoodTimeCoin(uint256,string,string)", +"a95055a8": "getPlayerBoardsIDs(bool)", +"a9505eb4": "maxOfArray(uint256[])", +"a950fb0e": "b64decode(bytes)", +"a9510f89": "totalAmountOfTokens()", +"a951c534": "_CallScheduled(bytes32)", +"a951c994": "setSetupComplete()", +"a951f28e": "dayaToken()", +"a951fad2": "CryptoX(uint256,uint256)", +"a9522f4e": "IsDividendAvailabe()", +"a95236ed": "DeDeTokenContract(address)", +"a95240c4": "memberShareCount()", +"a9524310": "getTokenAsset(address,uint256)", +"a95281f0": "registerPoA(string,bytes32,uint256[],uint256[],address,address)", +"a952f268": "MAYExchangeRate()", +"a9535320": "TwoXJackpot()", +"a9538157": "increaseApprovalByLegacy(address,address,uint256)", +"a953d08d": "mintBounty(address,uint256)", +"a954736d": "cancelSellPop(uint256)", +"a9549f81": "getDAOId(uint256)", +"a954c209": "great(uint256)", +"a9550ecb": "getMonsterDefenseFromDna(uint256,uint256)", +"a9553d74": "phaseThreeBonusPercent()", +"a9559dd7": "updateBalance()", +"a95609ca": "editContribution(address,uint256,uint256,uint256,uint256)", +"a9572ac7": "setMulFactor(uint256)", +"a9580edd": "distribute(uint256,uint256,address,uint256)", +"a95824b4": "votingOpen()", +"a95836d1": "finalizeICO(address)", +"a958ffc4": "fundingDurationInHours()", +"a9593b98": "changeVote(uint256,uint256)", +"a9595472": "SOC()", +"a95a3887": "rolloutDividends(address)", +"a95bc9a7": "changeChannel(address,uint256,uint256,uint256)", +"a95bfd36": "adminAddBallotOption(uint32,string)", +"a95c372d": "fetch()", +"a95c4d62": "purchaseToken()", +"a95c5339": "checkGameRegiester(address)", +"a95d017d": "getRevisionBlockNumber(bytes32,uint256)", +"a95d580c": "withdrawEarnings(uint256,bool)", +"a95d85d8": "withdrawTo(uint256,address,bytes)", +"a95d9c14": "Uncloak()", +"a95ff7d5": "isDecentBetCrowdsale()", +"a9604239": "maxAmountRoundSeed()", +"a9607011": "HappyEthericHome()", +"a96088a5": "vernamToken()", +"a9612f72": "emitOwnershipChange(address,address,bytes32)", +"a9615f59": "platAuction()", +"a961e9e8": "startSaleTime()", +"a9625fa8": "MANHATTANPROXY3RDST()", +"a962a7d6": "set_burned(uint256)", +"a9636b9f": "Bytes32Oracle(bytes32)", +"a964bb9a": "configureLimit(uint16,uint16)", +"a964bea7": "CheckRevoke(address)", +"a96594d3": "nextLotteryTTMTokenId10()", +"a965a941": "getNote(uint256)", +"a965e5c1": "setBonusAddress(address,bool)", +"a96654ee": "transferredOwner(address)", +"a9671d8f": "getProductionOf(address)", +"a9671dd9": "enableProxy(address)", +"a967f3e7": "emitProjectCreated(uint256,uint256,address)", +"a968309d": "plutochain()", +"a968991b": "confirmed()", +"a9689d0f": "transactionFeeRate()", +"a968ad0e": "resetBonuses(address)", +"a968b97c": "verifyCodeLength(string)", +"a96948c6": "chefBalanceOf(address)", +"a969574d": "ratePreICOEnd()", +"a969f080": "QUIKKO()", +"a969ff0a": "collectFee(uint256)", +"a96a4998": "DEFROST_FACTOR()", +"a96a5a5b": "pwin()", +"a96af0f4": "saleSupply()", +"a96b1828": "GLOBALETHER()", +"a96b2dc0": "getCallCount()", +"a96b3ab8": "getDthShop(address)", +"a96c3e6e": "getPlayerAddr(string)", +"a96c4eb7": "Sold(uint32,address,address,uint256)", +"a96c6bfe": "setDeveloper(address,bool)", +"a96ce7aa": "unlock(string)", +"a96f45c7": "ETHTransfer(address,address,uint256)", +"a96f8668": "releaseTokens()", +"a96fb9b4": "testTokenA()", +"a970a23a": "internalUpdateRates(bytes4[],uint256[],uint256)", +"a970ef6e": "tokenContractDefined()", +"a9718d51": "getTransferValuebyArrd(address)", +"a971c23d": "minimumFeePercentage()", +"a9725a68": "LIMIT_STAR5()", +"a9726c1e": "withdraw_bounty()", +"a972a451": "sqrt(uint32)", +"a973e27c": "testFind()", +"a9740fdf": "SwapCreation(address,address,uint256,uint256,address)", +"a9743c68": "getCallPayout(bytes32)", +"a9746acf": "UserBought(address,uint256,uint256,uint256,uint256)", +"a974e21f": "HKIN(uint256,string,string)", +"a97501a3": "ManUvsTottenham()", +"a97583de": "_transferByPartition(bytes32,address,address,address,uint256,bytes,bytes)", +"a9758fcc": "CurationRightsTransferred(address,address)", +"a9764152": "createFunction(string,string)", +"a9767e14": "masternodeMineTokens()", +"a977449e": "unbanReferrer(address)", +"a977c71e": "changeQuota(uint256)", +"a977f628": "viewNumberOfApprovedUsers()", +"a9782954": "hunterOf(address)", +"a979169f": "updatePackage(uint256,string)", +"a9791aec": "tgeSetFinished()", +"a9797521": "bn128_is_on_curve(uint256[2],int256)", +"a97a6d63": "setWhitelisted(address,address,bool)", +"a97b8b48": "LOG_CurrentPercent(uint256)", +"a97b8b4d": "closeBallot()", +"a97c8eb4": "RTEToken()", +"a97cb561": "isTransferAgent(address,address)", +"a97cc114": "getTile(uint256)", +"a97d48fd": "sendContractFundsToAddress(uint256,address)", +"a97e5c93": "isOracle(address)", +"a97fc381": "toSlice(bytes)", +"a97fe7b6": "airDropTotalSupply()", +"a97ffd5e": "safeToSell(uint256)", +"a9804acb": "HealthyCoins(string,string,uint256)", +"a980bb9e": "isDisclosureSigned(uint256)", +"a9814d14": "Outcome()", +"a981daca": "testIntParserNegative()", +"a9820ead": "Ballot(bytes32[],bytes32[])", +"a9824288": "CTMC()", +"a9825b7c": "bonusUnsold()", +"a9831437": "setCreationPrice(uint256)", +"a9831edf": "unlockFundsAndPassEther()", +"a98325b6": "collectDividend()", +"a983637e": "BACHELORCHAIN()", +"a9839dd7": "exchg(address)", +"a983c932": "isValidContract(bytes32)", +"a983d414": "safeassert(bool)", +"a983dcc0": "setDefault(bytes32)", +"a983e1bb": "random(uint256,uint16)", +"a984cec2": "additionalPresaleInvestors()", +"a9850e26": "SellToyMoney(uint256)", +"a9854087": "closeAt()", +"a9856d6d": "initSale(address,address,uint256,string)", +"a985e6c6": "withdrawAirDrop(address[],uint256)", +"a986c969": "stand(address,uint8[],bytes32,uint8[],uint8[],bool[],uint256,bytes32,bytes32)", +"a986ef4a": "nextRoundCoolingTime()", +"a9872393": "racesInfo(uint256,uint8,address)", +"a9875d70": "stage4Start()", +"a987d4c6": "_mint(address,uint256,string)", +"a987d654": "restoreItem(uint256)", +"a987f9da": "Creation(uint256,string,address)", +"a9888148": "testFailRetractNotRetractable()", +"a988845a": "setNewMessageNumber2(string,uint256)", +"a988df4b": "bgb_per_eos()", +"a988e371": "taxPaid(address)", +"a988ea3a": "NETHtoken(uint256,string,string)", +"a98902e9": "LUNVault(address)", +"a98a6d19": "ICOWeiRaised()", +"a98a89c2": "buy1(address[],address[],uint256[],bytes)", +"a98ad199": "removePermittedContract(address)", +"a98af238": "setCCH_edit_16(string)", +"a98c439f": "buyTokensAltercoins(address,uint256)", +"a98ca17d": "exercise(uint256,uint256[3],address)", +"a98cb619": "transferGenesis(address)", +"a98d5961": "pickRandomAssetPosition(uint256,uint256,uint256)", +"a98e4e77": "getAccountCount()", +"a98ee0b7": "_getInitAuctionSeconds()", +"a98f81fd": "BEXAM()", +"a98f99d8": "removeDefaultOperatorByTranche(bytes32,address)", +"a9901c6b": "getIsCoinReg(bytes4)", +"a990dd52": "unitsOneEthCanBuybefore()", +"a9918dfc": "getCompte_36()", +"a991a24d": "getTenancy(uint256,uint256)", +"a991cb0e": "respond(uint256)", +"a991faf9": "getTotalDividendsAmount()", +"a99306e7": "addPVPContender(address,uint256)", +"a993772f": "isPreIcoFinish()", +"a993e180": "getFechaTax()", +"a9948f7e": "GetNbyPrice(uint256)", +"a996d6ce": "setBurner(address)", +"a996d72e": "OracleChainToken(uint256,string,uint8,string)", +"a9974338": "setB0xToken(address)", +"a997f82f": "setCrowdsaleStage(uint256)", +"a998146b": "allToken()", +"a9985260": "test_setMaxSize()", +"a9989b93": "tokenAddresses()", +"a998fdbe": "getWithdrawAmount(address,address)", +"a9995010": "CappedCrowdsale()", +"a99a353b": "SWAP(address,address)", +"a99a3f03": "PLAYER_TIMEOUT()", +"a99a3f98": "initSale(uint256,uint256,uint256,uint256,uint256,uint256)", +"a99a985b": "betOn(uint32,uint32,uint256,address)", +"a99aa366": "presaleDiscount()", +"a99b9e39": "ICO_START_DATE()", +"a99be610": "PreIcoMessage()", +"a99bf4fa": "Potential_Investors(address)", +"a99ce372": "VINE_CAPACITY_PER_LAND()", +"a99d8d48": "changeTransferable()", +"a99da6af": "finishDeal(uint256)", +"a99dca3f": "hi()", +"a99df9c3": "oneCentInWei()", +"a99e0a81": "maxICOFirstSupply()", +"a99e6465": "addTier2Member(address)", +"a99e7e29": "register(bytes,address)", +"a99f0d9f": "_addBallot(bytes32,uint256,uint256,bool)", +"a99fa3e2": "addGroupMember(bytes32,address)", +"a99fba7d": "calculatePlatformCommission(uint256)", +"a99fc5aa": "tempCharity()", +"a99ffb7b": "timestamp(bytes12)", +"a9a07af9": "incFightToDeathWin(uint256)", +"a9a0844b": "getSaleVolume()", +"a9a0b495": "getPreSignedHash(bytes4,address,uint256,bytes,uint256,uint256)", +"a9a11111": "QuadraticVoting()", +"a9a18dda": "totalEthReceived()", +"a9a1fb96": "releaseTokensForce(bytes32)", +"a9a26902": "changeBubbleWallet(address)", +"a9a29afa": "getRefundTxFee()", +"a9a343b3": "Puzzled(address,bytes32)", +"a9a3a9c5": "vxtest()", +"a9a3cef4": "LISKClassic()", +"a9a3da4a": "getRemainUtcoin()", +"a9a40c71": "getNumberOfOpenDeals()", +"a9a51f89": "changeTokens()", +"a9a5e3af": "removeOwners(address[])", +"a9a615e9": "setWhitelistedStatus(address,uint256)", +"a9a6e9b4": "distributeLCD(address[],uint256)", +"a9a8679b": "authorizeAccount(address)", +"a9a8fc84": "ItemCreated(address,uint256)", +"a9a9d7af": "sellerList(address)", +"a9a9e4f7": "_payloadOffset()", +"a9aac3e4": "registerWineOwner(address,string,string)", +"a9aad58c": "PAUSED()", +"a9aae07a": "setMinGas4Accts(uint256)", +"a9aaf116": "BillahChain()", +"a9ab9b46": "getAccountItems(address,uint256)", +"a9abe7be": "setIcoSecondWeekRate(uint256)", +"a9ac225c": "ProposalTallied(uint256,uint256,bool)", +"a9ac4c5f": "checkMonthlyLimit()", +"a9acc475": "getBlockValue()", +"a9adaecd": "calcStopPriceFactor()", +"a9add7dc": "setEvolvePrice(uint128)", +"a9ae8323": "presaleDateFinish()", +"a9aeb059": "updateCeiling()", +"a9b07600": "setIdArray(address,uint256,string,string,uint256[])", +"a9b0c5a4": "preIcoFinished()", +"a9b0e8d5": "Cscchain(uint256,string,string)", +"a9b11426": "getImageOwner(uint256)", +"a9b12c4c": "blocktime()", +"a9b1d507": "makeWallet()", +"a9b1ffd9": "totalChequeValue()", +"a9b2c135": "lockedYears()", +"a9b2ca9c": "changeDragonGen(uint256,uint256,uint8)", +"a9b2cc09": "getMaxContributionAmount()", +"a9b35240": "packageExists(bytes32)", +"a9b46030": "BurnableOpenPayment(address,uint256)", +"a9b48ba7": "WIN()", +"a9b4b780": "getWeight()", +"a9b542bd": "getDna1(uint256)", +"a9b551d2": "getAdministratorMoney(address)", +"a9b5ae83": "messageForPeace(string)", +"a9b69e7c": "deployersCount()", +"a9b6c8bc": "getAddress(bytes16)", +"a9b76504": "getContestTeam(uint32,uint32)", +"a9b7c3bf": "cooAddress1()", +"a9b86292": "totalSharePool()", +"a9b86924": "buyStoreByName(bytes32)", +"a9b8dad6": "level_3_percent()", +"a9b8f7b8": "ProtectTheCastle()", +"a9ba2b09": "releaseFine()", +"a9bb03a4": "deptrespond(address,address,string,bool)", +"a9bb3274": "UCCOIN_PER_ETHER()", +"a9bc5db1": "createHeld(address,uint256)", +"a9bf1c9f": "ENS_ROOT()", +"a9bfe5c7": "TokenBalance()", +"a9c0838d": "getPI_edit_3()", +"a9c1873c": "setTokenPerEth(uint256)", +"a9c1f2f1": "decayRate()", +"a9c2ac3a": "getBetIds(uint256)", +"a9c2e36c": "getFactoryAddress()", +"a9c32c35": "NewExchangeRate(uint256)", +"a9c38476": "latestEditionReleased()", +"a9c4429a": "getInvestmentPackageInformation(uint256)", +"a9c45fcb": "upgradeToAndCall(uint256,address,bytes)", +"a9c4d62e": "S25ICO()", +"a9c5c9df": "aval(uint256,address)", +"a9c6a624": "updateNumber(int256)", +"a9c6c714": "unsoldAllocationOraclizeGasLimit()", +"a9c70eaa": "getUint(uint256)", +"a9c73e80": "setText(string,string)", +"a9c7648f": "distributeToken(address[],uint256)", +"a9c76999": "totalProfit(address)", +"a9c8733c": "correct()", +"a9c8dfcd": "AuctionCreated(uint256,uint256,uint256,uint256)", +"a9c95328": "renameList(address,string)", +"a9ca2072": "getAccountValue(uint16,uint8,uint8)", +"a9ca6057": "baseball()", +"a9cb2227": "getPlayerRoundTeamBought(uint256,uint256,uint256)", +"a9cbd0a5": "percentageToEthertoteDevelopmentWallet()", +"a9cc077a": "TOKEN_PRICE_DENOM()", +"a9cc4718": "fail()", +"a9ccc3af": "isEtherSpaceUpgrade()", +"a9cd2be6": "createSlot(uint256,uint256)", +"a9cd9e06": "secureWithdraw(uint256,address)", +"a9cdf643": "TEAM_MEMBER_VAL()", +"a9cf037a": "EEYcoin(address)", +"a9d04bd8": "getStakingRequirementTime(address,uint256)", +"a9d05989": "ETFW()", +"a9d07519": "TokensCappedCrowdsale(uint256)", +"a9d0b164": "priceOfEthOnUSD()", +"a9d0ddc7": "addContractWithInfo(string,string)", +"a9d0fd87": "_updatePurchasingState(uint256,uint256,uint256,bool,address)", +"a9d2293d": "lastClaimBlock()", +"a9d23ace": "getBundleExpiredTimeOfEmail(string,uint8)", +"a9d2d87c": "Manual_Mint(address,uint256)", +"a9d3da74": "SimpleAuction()", +"a9d40b77": "buyOffspring(address,string,uint256,uint256,uint256)", +"a9d424e2": "buy(address,address,uint256,uint256)", +"a9d48032": "maxSpendToken()", +"a9d49f62": "searchInsertionPoint(uint256,uint256)", +"a9d4d6bc": "lastBlock_f1()", +"a9d5e255": "GACToken(uint256,uint256)", +"a9d66127": "cancelPawn(uint256,address,bool)", +"a9d66352": "minimum_deposit_amount()", +"a9d72f82": "alterFeaturePetitionFee(uint256)", +"a9d74013": "claimedToday()", +"a9d82f18": "realDEXToken()", +"a9d85266": "setValue(bytes32,bytes32,uint256)", +"a9d9f572": "Println(address,uint32,uint256,uint256,uint256,bool,uint32)", +"a9d9f644": "viewLockUpStatus(address)", +"a9da0fad": "setOutcome(uint8,uint8)", +"a9da1417": "DEXHIGH(address,address,address,uint256,uint256,uint256)", +"a9dab167": "extendLock(bytes32,uint256)", +"a9db06e5": "perAmountRaised()", +"a9db9ce6": "getOraclizeGasPrice()", +"a9dbaf25": "length(bytes32)", +"a9dbe76f": "confirmSeller(uint256,uint256)", +"a9dc1d54": "singularDTVCrowdfunding()", +"a9dc491d": "getResolver()", +"a9dd1225": "random(uint256,uint256)", +"a9dd6895": "acceptTransaction(uint256)", +"a9dda4df": "setAuctionAddress(address,address)", +"a9de5045": "acceptAction(bytes32)", +"a9de581b": "auctionWinnerMessageHash()", +"a9df1aa2": "WithdrawalNormal(address,uint256)", +"a9e044ae": "SetProjectTag(string)", +"a9e0f3ed": "checkCounterLimit()", +"a9e10bf2": "recieve()", +"a9e2bcfe": "oneRoll()", +"a9e2e084": "_createPoo(string,address,uint256)", +"a9e30f96": "TokenPK(uint256,string,uint8,string)", +"a9e3fd27": "contentHostPrice(bytes32)", +"a9e406d5": "_setProviderSupply(uint256,uint256,uint256)", +"a9e4d6ce": "UpdateTokenRate(address,address,uint256)", +"a9e5714b": "AgriChain()", +"a9e732bb": "cashout(uint256)", +"a9e79359": "payoutForTimeline(uint256,uint256)", +"a9e7c2e5": "claimToken(uint256)", +"a9e7cb10": "Mediation(address)", +"a9e7f730": "FreyrCoin()", +"a9e899ef": "challengeFeeMultiplier()", +"a9e8a6bb": "prolongBonusPreIco(uint256)", +"a9e8f2f0": "get_refund_vocean_addr_amount(uint256)", +"a9e931ab": "addRec4L8R(address,uint256)", +"a9e94aa2": "Sponsor()", +"a9e966b7": "setState(uint256)", +"a9ea1896": "priceT1()", +"a9ea4aaa": "EntryToken()", +"a9ea6454": "basicThreshold()", +"a9ea96f0": "setDevelopersTokensPercent(uint256)", +"a9ea9d17": "PURCHASES_BONUS()", +"a9ead91c": "addressToAsciiString(address)", +"a9ebeb25": "nextReferrerId_()", +"a9ec77d3": "PublicSale(address,address,address,address,uint256,uint256,uint256)", +"a9ed003d": "sister()", +"a9ed9cb8": "disallow(address)", +"a9eeaeee": "getSanSlots(address)", +"a9eed530": "reduceOrderQty(uint256,uint256)", +"a9f00221": "resetTokenOfAddress(address)", +"a9f036dc": "accCompany()", +"a9f09079": "exchangeRateStoredInternal()", +"a9f0a590": "transferAdministratorship(address)", +"a9f12d8a": "RaliusToken()", +"a9f16529": "thisVotersChoice()", +"a9f2db37": "unlockTokens(address,address)", +"a9f5de42": "crowdsalePhase()", +"a9f69edb": "checkRole(uint256,address,uint256)", +"a9f6def0": "HonestDice()", +"a9f73dd2": "_getRarity(string,uint8,uint8)", +"a9f79f7d": "FXT(address)", +"a9f7c131": "updateDateOfPurchase(address,uint256)", +"a9f7d03b": "admin_typeOf(address)", +"a9f7e664": "transferTokens(address,uint256,uint256)", +"a9f7f7e5": "o_algoritmo(uint256)", +"a9f844a8": "PlayerBalance(address,uint256,uint256)", +"a9f8792e": "votingProxyContract()", +"a9f8ec6c": "AlarmClockTipFaucet()", +"a9f940c3": "addChain(string,string)", +"a9f951dc": "getNation(uint8)", +"a9f987b5": "UFOcoin()", +"a9f992b1": "BTC8000on420()", +"a9fab274": "burnAuditApproval()", +"a9fae422": "getParents(address)", +"a9fb11b3": "potAddup()", +"a9fb4385": "ContributeWithSender(bool,uint8,address)", +"a9fb8fe6": "getFeesByAsset(address)", +"a9fbc614": "lookupTicketHolder(uint256)", +"a9fc771c": "PinkToken()", +"a9fc9501": "indexTheWorkcrew()", +"a9fcf76b": "setIntArray(bytes32,int256[])", +"a9fd1bd3": "TradeAffected(uint256,uint256)", +"a9fd3f42": "transferApprovedFunds()", +"a9fde745": "transferTrade(address,address,uint256)", +"a9feca22": "_emitOracleAdded(address)", +"a9ff2a5e": "transferTokensFromWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"aa01ac22": "gmAddress()", +"aa01ef7d": "finishVotingPublic(address,uint256)", +"aa02a90f": "majorityMargin()", +"aa03214c": "calcBonusPercent()", +"aa0372e7": "getItem(bytes32)", +"aa03dfaa": "createChannel(bytes32,address,uint256)", +"aa0465b8": "setPriceData(uint256,uint16,uint256,uint8)", +"aa049691": "changeAccount(address)", +"aa04e566": "getWhoPiad(address,address,address,address,address,address,address,uint256)", +"aa052bd1": "startPreSaleStage()", +"aa056d2a": "cloneWithPopAndBottle(uint256,uint256)", +"aa058a73": "right6(uint256)", +"aa05b852": "s34(bytes1)", +"aa065074": "StageVestingToken()", +"aa071061": "LogAccountModified(address,address,bytes32,bytes32,bytes32,bytes32)", +"aa077992": "getProductEarning(uint32)", +"aa08523d": "lockedCustomer(address)", +"aa08c9e6": "getCoverImageCount(address)", +"aa08dfd3": "setFeeParams(uint256,uint256,uint256,uint256,bytes)", +"aa09bab8": "usedTotalSupply()", +"aa0bf9ba": "calculateRawPoolAmount(uint256)", +"aa0cd6eb": "_distributePoolReward(uint256,address,uint256)", +"aa0cfcbf": "buynums(uint256)", +"aa0d30f3": "deduct_fees()", +"aa0d9fb5": "_aremoveByValue(address)", +"aa0e38b4": "Mobilink()", +"aa0f0d4a": "Team(bytes32,bytes32,address,bytes32)", +"aa10ce22": "addExchange(address)", +"aa10e8c2": "CreateAPool(string,string)", +"aa11772b": "setOperators()", +"aa1199ea": "setApprove(bool)", +"aa121bbe": "ABIChanged(bytes32,uint256)", +"aa125d08": "timeWaitUnlock(address)", +"aa127ae3": "test_9_checkDestructionOverflow_shouldThrow()", +"aa13ca76": "getTokenPrices()", +"aa13e8c2": "waitingTime()", +"aa141ee2": "spartans()", +"aa14c39a": "submissionDeposit()", +"aa14fa5a": "ICObonus()", +"aa156645": "isWorker(address)", +"aa1589a9": "approveLeave(address,uint256,string,uint256,bytes32)", +"aa1614eb": "ethRetrieve()", +"aa17973c": "createRandomAtom()", +"aa17e768": "getParentI(uint256)", +"aa183877": "getMonkey()", +"aa188b29": "SandBoxERC20()", +"aa18c05c": "TRANSFER(address,address)", +"aa18f76a": "getAllowedAmount(address)", +"aa1953cc": "canAccess()", +"aa19ed77": "freezeTransfersUntil(uint256,string)", +"aa1b510e": "cheat()", +"aa1ba6a9": "totalWin()", +"aa1c31a3": "BatCave()", +"aa1cdce8": "allot(uint256)", +"aa1cf1cd": "dumpFreeTokens(address)", +"aa1cf23e": "_isIdle(address,uint256)", +"aa1d807f": "ESCBDevMultisig()", +"aa1d98af": "personIndexToOwner(uint256)", +"aa1e47ae": "MyCoin()", +"aa1e84de": "hash(bytes)", +"aa1f609f": "ETHER_MIN_CONTRIB_PRIVATE()", +"aa202aca": "testBytes32Len()", +"aa20e1e4": "updateMasterMinter(address)", +"aa216998": "INITIAL_SAPLLY()", +"aa2262a8": "prevCourse()", +"aa226780": "trade(address[11],uint256[11],uint8[2],bytes32[2],bytes32[2])", +"aa228cda": "reduceMul_()", +"aa22b56b": "getDAOById(bytes32)", +"aa235449": "SpencerToken()", +"aa237e21": "set(bool,uint256)", +"aa238110": "getCurrentPrice(uint16)", +"aa23cb19": "transferFromIndexed(address,address,uint256)", +"aa23e03d": "getIdentifier()", +"aa24da73": "MultiToken()", +"aa24e8aa": "numberOfAlternatives()", +"aa2529a2": "RefundChequeById(string)", +"aa2580c1": "startPreSaleRound()", +"aa258b2e": "TitlePurchased(address,uint256)", +"aa25c744": "getDenominationByName(bytes8)", +"aa25f57e": "setPartnerETHRewardsPercent(uint256)", +"aa271e1a": "isMinter(address)", +"aa272d4b": "getNodeIndexId(bytes)", +"aa2796fd": "payoutForMining(address,uint256)", +"aa27cdf2": "deleteSharedAccount(bytes32,bytes32,uint256)", +"aa283e76": "setMintPrice(uint256,int256)", +"aa284a4a": "ProofPublicVote(address)", +"aa289b15": "deleteOutStreamOf(address)", +"aa28b89f": "preICOStage()", +"aa29787e": "bonus15end()", +"aa2a006d": "OrderCancelled(uint256,uint256)", +"aa2a1c47": "getTotalCollectedFrom(uint64,address,address)", +"aa2b5d7d": "getMiningWarPlayerData(address)", +"aa2bebb7": "getFeeWindowByTimestamp(uint256)", +"aa2d5c05": "FillOrder(uint256,address,uint256)", +"aa2de6c3": "minimumPurchase()", +"aa2df88b": "_isTransferAllowed(address,address,uint256)", +"aa2e7ea0": "createSwap(bytes20,address,uint256,address)", +"aa2efbad": "nominsReceivedForEther(uint256)", +"aa2f04da": "alterPause(bool)", +"aa2f7494": "createMobster(string,uint256,uint256)", +"aa2f892d": "requestRedeem(uint256)", +"aa2fc145": "numStageRecalc(uint256)", +"aa2fddc7": "transfer(string,address,uint256)", +"aa3022d0": "settotal(uint256)", +"aa306d79": "voteForCandidate_(uint256,address)", +"aa30abf1": "crowdsaleBurnAddress()", +"aa30b7e3": "hasEnoughValidSignatures(bytes,uint8[],bytes32[],bytes32[],address[],uint256)", +"aa31aee8": "getLockTime(address)", +"aa31e4a0": "setSelfHybridizationPrice(uint256)", +"aa33171f": "newPromotion(string,string,string,uint256,uint256,uint256,uint256)", +"aa332032": "NewRound(string,bytes32)", +"aa33ab1b": "getVoted(uint256)", +"aa3435c0": "setTokenInformation(string,string,uint8)", +"aa351cf5": "triggerShutdown(uint256)", +"aa352ca4": "withdrawOffer()", +"aa3633f3": "CreationFailedEvent(address,uint256,string)", +"aa366290": "forfeit(uint8)", +"aa367664": "fundingMaximumTargetInWei()", +"aa368c19": "createScore(string,string,uint256,uint256,uint256,uint256,string,string,string,string,string)", +"aa36aae8": "prolongCrowdsale()", +"aa36b52e": "_updateNeeded(uint256,uint256,uint256)", +"aa36cdfc": "getPlayerHistory(uint256)", +"aa3744bd": "recipient1()", +"aa3801d8": "getTokenAddress(bytes)", +"aa391317": "returnUnsoldSafeMedium()", +"aa3ad4e4": "validate(address,address,uint256)", +"aa3aef50": "purchaseTicket(uint16,uint16[])", +"aa3ba179": "widthraw()", +"aa3dacac": "sideBetPercent_MAX()", +"aa3eb769": "sendPTokenFrom(address,uint256,address)", +"aa3ec0a9": "cid()", +"aa3ef248": "postFact(bytes16,address,string)", +"aa3f5087": "AuctusPreSaleDistribution()", +"aa404876": "RedBlueToken2()", +"aa41d605": "_estimateWeight(uint256,uint256,uint256,uint256,uint256)", +"aa421944": "setMaxVeriAmount(uint32)", +"aa430e64": "setTotalPhases(uint256)", +"aa4537b2": "referredBonusRate()", +"aa454e9c": "setBuyer(uint256)", +"aa45b11e": "setReferralAddressShare(uint256)", +"aa462a5a": "whenGameDies()", +"aa4859fd": "newBookingfc(uint256,address,uint256,uint256,uint256)", +"aa487f49": "PRESALE_PERCENTAGE_1()", +"aa4925d7": "subscribe(uint256,uint256,address)", +"aa497b9d": "scheduleCall(address,uint256,bytes,uint256,uint256,uint8)", +"aa4abe7f": "setMaxRate(uint256)", +"aa4ac835": "exportTankResetEarning(uint32)", +"aa4b4d0b": "test_v0()", +"aa4b62f3": "initData(address,uint256)", +"aa4b980e": "phase_1_bonus()", +"aa4bdd3b": "realEtherCapHash()", +"aa4cb547": "setMultihash(bytes32,bytes)", +"aa4cc01f": "checkIfCancelled(bytes32)", +"aa4cd810": "addMeterPoint(address,int256)", +"aa4ce2c6": "blockDotBlockHash(uint256)", +"aa4d4213": "getOldAllowance(address,address)", +"aa4d490b": "registerNameXaddrFromDapp(address,bytes32,address,bool)", +"aa4eaa72": "addToPreSaleWhitelist(address,address)", +"aa4ee730": "LastRiskPrice()", +"aa4f6012": "addSupply(address,uint256)", +"aa4f861f": "getInvestorInforMax(address)", +"aa4fc0a1": "Talius()", +"aa510c8c": "getLinkToPostId(string)", +"aa513c71": "updateInfluencer(string,address,uint256,address)", +"aa51793c": "isLosingBet(uint256)", +"aa525c55": "removeMilestone(uint8)", +"aa52a251": "transferSnowflakeBalanceFrom(string,string,uint256)", +"aa52fbd4": "period2Denominator()", +"aa534161": "releasedTeamTokens()", +"aa53d504": "Bounty()", +"aa53d7d4": "gettotalReceivedTicket()", +"aa541c9f": "unfroze_contract()", +"aa54abb1": "setLSEscrowContractAddress(address)", +"aa54ad35": "tokenSaleAddr()", +"aa54e040": "change_rate(uint256)", +"aa5581ef": "weiMaximumLimit()", +"aa5583d7": "Connections()", +"aa55a1a2": "giveAdditionalTokens(address,uint256)", +"aa55b55f": "getCardTypeInfo(uint256)", +"aa56c8e7": "isCrowdsaleFinished()", +"aa585d56": "setPrice(uint256,uint256,uint256)", +"aa58d4df": "calculateWinnerGameType2(uint256,uint256)", +"aa590140": "length(int8)", +"aa59770f": "sendCreatorByOwner(address,uint256)", +"aa59b024": "CROSAIR_SHIP_LIMIT()", +"aa59fb7d": "ChemistryCore()", +"aa5a11c5": "removeTellerModerator(address)", +"aa5a20e5": "setUpgradeAgent(address,uint32)", +"aa5b7df8": "marketingTokensWallet()", +"aa5b95d1": "deathFactor_i()", +"aa5c02a3": "LETX()", +"aa5c3ab4": "rewardBalance()", +"aa5c88ca": "setFreezePercent(uint8)", +"aa5d4719": "getTransferable(bytes20)", +"aa5d6d5f": "dropWallet()", +"aa5dcecc": "allocator()", +"aa5dd215": "doAirDrop(address[],address,uint256[])", +"aa5df9e2": "ownersArr(uint256)", +"aa5e2500": "clearProposalNames()", +"aa5ebd7f": "removeAddressFromWhitelist(address,address)", +"aa60145b": "cancelPledge(address)", +"aa601a71": "setAllowChangePrice(bool)", +"aa601e86": "SimpleMultiSigWallet(address[],uint256)", +"aa613b29": "authenticate(string)", +"aa613faf": "U42Token()", +"aa616da1": "addSkillNames(address,bytes32[],address)", +"aa617f25": "getAdUrl(uint256)", +"aa61924a": "CREATE_VERSION_ROLE()", +"aa61fc58": "getAirdropList(address)", +"aa620192": "today(uint256)", +"aa6217eb": "getMaximumContributionPossible()", +"aa628c31": "timelock(address,uint256)", +"aa63dea4": "dateMainStart()", +"aa646ebb": "_mint(address,uint256,uint128)", +"aa647673": "getKingPoints()", +"aa64c43b": "transferPool(address,address,uint256)", +"aa64f3c6": "addWhiteListed(address[])", +"aa656a3a": "updateGameMoney(uint256,uint256,uint256,uint256)", +"aa657658": "setMigrationGate(address)", +"aa657815": "takeoffer(uint256,uint256)", +"aa65a6c0": "getTokenWithId(uint256)", +"aa65c1f1": "WinningOutcomeDeclared(uint8)", +"aa66797b": "RESERVE_SUPPLY()", +"aa677354": "register(address,address)", +"aa67bc04": "eraByName(bytes32)", +"aa67c919": "depositFor(address)", +"aa682682": "startBuyTime()", +"aa68894b": "ownerWithdrawAccount(address)", +"aa692151": "fbytes32(bytes32)", +"aa6aca58": "setDelegadoDeEscuelaVerify(bytes32,bytes32,uint8,uint8)", +"aa6b5d9f": "ElyToken(address,bool)", +"aa6b631a": "getSetting(string)", +"aa6be303": "debtors(address)", +"aa6bf687": "calculateBonus(bytes32,uint256)", +"aa6ca808": "getTokens()", +"aa6d5dce": "_withdrawAllFunds()", +"aa6d7de4": "Hash()", +"aa6e4858": "VoteAdvertisement(uint256,address)", +"aa6e6539": "chkUserDetails(address,address)", +"aa6ebdcb": "numberOfDAppNodePackages()", +"aa6f5bb6": "setCreateDigitalArtFee(uint128)", +"aa727e46": "MAX_PUBLIC_FUNDING_SUPPLY()", +"aa72f217": "bountyMktWallet()", +"aa72f725": "listAssetDocuments(bytes32,uint256,bool)", +"aa735dd6": "ZBAStandardToken(uint256,string,uint8,string)", +"aa736f57": "transferLocker(address)", +"aa738940": "Show_Company(uint256)", +"aa743c85": "sixMatchPayoutInPercent()", +"aa74c9fc": "addressToURI(address)", +"aa74fad8": "buyNewInfra(uint256)", +"aa7517e1": "minimumBond()", +"aa7618d5": "increaseApprovalPreSigned(address,uint256,uint256,uint256,uint8,bytes)", +"aa7622c7": "finalizeSecondStage()", +"aa7629ab": "withdrawDRPS(uint256)", +"aa76994d": "numOverthrows()", +"aa772fa0": "WinningEvent(address[],address,uint256)", +"aa775278": "deallocateBalance(address)", +"aa77f26c": "vestedAmount(address,address)", +"aa78a883": "BDP()", +"aa79376e": "updatePlayersCookie(address)", +"aa799fdc": "ZeroxDinar()", +"aa79bc02": "maxTrophies()", +"aa7a7744": "isRegisteredPair(address,address)", +"aa7abc8d": "sellWonder(uint256,uint256)", +"aa7b6c59": "wirteData(string)", +"aa7bc1c0": "createTokenFunctions()", +"aa7be9a7": "watchVideoA(address)", +"aa7ca464": "didReveal(address,uint256)", +"aa7dcd84": "testUpdateAuthorityEvent()", +"aa7ebf43": "level_1_percent()", +"aa7f6a3f": "AirdropList(address[],uint256[])", +"aa7f6a61": "newPurchase(address,uint8,uint8,uint32)", +"aa804a80": "jdouble(uint256,uint256,uint256)", +"aa80eec8": "testCheckRokBounty()", +"aa8116be": "fundedPrincipal()", +"aa81f862": "numDepositsSigned(bytes32)", +"aa82635d": "allocateManualMintingTokens(address[],uint256[])", +"aa833a25": "TheTokenC()", +"aa848ee2": "setPrivateList(address)", +"aa84d4b1": "whitelistOff()", +"aa84edb8": "MYDLToken()", +"aa85048a": "TotalCrowdsaleSupply()", +"aa8596ea": "setGalleryFivePrice(uint256)", +"aa863759": "addtoTechOperation(address,address,uint256,uint256)", +"aa864e49": "remainingPoolOptions()", +"aa8675d1": "singleIDXMQty()", +"aa8676b2": "gameDividendOf(address)", +"aa86fbc5": "HETCCStandardToken(uint256,string,uint8,string)", +"aa8713dd": "secondWeek()", +"aa877470": "isInsurance(address)", +"aa879119": "allowApprovee(address,bool)", +"aa87af1e": "voirMessage()", +"aa88bb5b": "resolveDispute(uint16,address,address,uint8)", +"aa89376a": "Example2(string)", +"aa8a0002": "raiseLimit()", +"aa8b20f6": "getAvatar()", +"aa8b76ea": "reclaimDividend(uint256)", +"aa8b99d2": "length(uint256)", +"aa8c217c": "amount()", +"aa8c5324": "prolongate()", +"aa8d11e3": "ThirdPartyVoter()", +"aa8d715d": "itemBalance(address)", +"aa8dc41e": "vriesorexContract()", +"aa8dd5a1": "GRForGas()", +"aa8dde58": "Repost(bytes32,bytes32,uint256)", +"aa8dea8c": "fipsAddToLedger(bytes20,address,bytes)", +"aa8e8fb0": "LTKN()", +"aa8f0269": "ScicoinsICO()", +"aa8f027b": "isEmoji()", +"aa8f365c": "test_invalidProposalValue()", +"aa8f44ec": "isSaleAddr(address)", +"aa908e3f": "closeContract(bytes32,bytes8,uint256,uint32,uint32,uint64,uint64,bytes32)", +"aa91cc61": "rodToken()", +"aa91d5c5": "HappyEnding()", +"aa9224cd": "withdraw(uint32)", +"aa9246ef": "_parseIntScientific(string,uint256)", +"aa93038b": "reward_total()", +"aa931697": "minNac()", +"aa93334d": "currentPeriodStartBlock()", +"aa9449f2": "Test(address)", +"aa9454b5": "transferAndBuy(address,uint256,uint256,uint256)", +"aa954845": "isConfirmed(bytes)", +"aa9669c1": "roll(uint256,bytes)", +"aa974eff": "multitokens(uint256)", +"aa985a63": "distributeWei(uint256,uint256)", +"aa98a41a": "setGenesisAddressArray(address[],address)", +"aa98d57b": "calcCollectedFee(uint256)", +"aa99474f": "authorized_changeOwnership(address,address,uint256)", +"aa994ab8": "transferGIM(address,address,uint256)", +"aa999b4c": "mixDna(uint256,uint256,uint256)", +"aa99ebb6": "CheckTimestampsDuringOneDay(address)", +"aa99f4d0": "teamTwoId()", +"aa9a0912": "mulDiv(uint256,uint256,uint256)", +"aa9a2cf0": "host_percentage()", +"aa9a79f2": "SubBankerPrincipal(uint8,uint256)", +"aa9ad331": "NEON()", +"aa9b5ba8": "getPaidDIVDSchedule()", +"aa9cdaf4": "coinAge(address)", +"aa9e40e0": "confirmDebt(uint256)", +"aa9f3666": "ClassicToken(string,string,uint8,uint256)", +"aa9f37f0": "purchaseContract()", +"aa9f5477": "Nursicoin()", +"aa9fa274": "addExtraReceiver(uint256,address)", +"aaa006b2": "countPlayer()", +"aaa04812": "presaleEthAmountsProcessed()", +"aaa05e20": "cityTransferResources(uint256,uint256,uint256,uint256)", +"aaa08e9b": "testBonus()", +"aaa0f5cc": "userAlreadyBoughtEth(address)", +"aaa24d31": "deathData_f7()", +"aaa2b78f": "allowedWithdraw()", +"aaa2b8c8": "rootAddress()", +"aaa2fe13": "getMin(uint8[])", +"aaa3de26": "getUsersInfo()", +"aaa40bc7": "TUXToken()", +"aaa44e5c": "getAllIds()", +"aaa51ec6": "setStoreAddress(address,address)", +"aaa5a02a": "claimTimeout(bytes32)", +"aaa5ad61": "getTokensAvailable()", +"aaa5c431": "editMemes(uint256,string,string,string,string,uint256)", +"aaa668aa": "getUserTenantId(address)", +"aaa6bc40": "removeWhitelistedUserAddr(address)", +"aaa7062b": "posShare()", +"aaa71e45": "mininglock()", +"aaa7744b": "_subjectToFees(address,uint256)", +"aaa77f55": "wuxiaMaster()", +"aaa99809": "FlatPricingExt(uint256,bool)", +"aaaa3218": "EmpireCrowdsale(uint256,uint256,address,address,uint256,uint256,uint256)", +"aaab3025": "replaceAbility(uint256,string,bool,uint8,uint8,uint8,uint256,uint256)", +"aaab51c9": "close(uint256,bytes,uint256,uint8[],bytes32[],bytes32[])", +"aaabdf16": "reputationIRNNodeShare()", +"aaac205b": "ZeenCoin()", +"aaac50bd": "transferDisable(bytes32)", +"aaac6539": "withdrawRepaidLoan(address,address)", +"aaac8040": "referralAmount(uint256,bool)", +"aaac9718": "package()", +"aaad0c84": "isExisted(address)", +"aaadc832": "isRedeeming()", +"aaae05b2": "approvePreSignedCheck(address,address,uint256,uint256,uint256,uint8,bytes)", +"aaae7799": "insertUser(uint256,bytes32)", +"aaaea138": "testFailBurnWhenStopped()", +"aaaf8a52": "approvePrimordialToken(address,uint256)", +"aaaf9595": "_generateTokens(address,uint256)", +"aab0395b": "LandToken()", +"aab065e8": "LifChannels(address,uint256)", +"aab14d04": "orderState(bytes32)", +"aab27ad1": "depositaCaucao()", +"aab324ae": "transferAnyERC20Token(address,uint256,address)", +"aab32cfa": "VerifierRegistry(address,uint256)", +"aab402e5": "toggleSale(bool)", +"aab40661": "_fishAquarium(uint256)", +"aab52c33": "initGameTeam(uint8)", +"aab60ebc": "totalLockedRewardsOf(address)", +"aab633dc": "private_setmaxRoll(uint256)", +"aab6606e": "BalanceEth()", +"aab725b3": "icoTokensSold()", +"aab75253": "StaffPicks()", +"aab78bf5": "compensateLatestMonarch(uint256,uint256)", +"aab8c476": "ABCXYZBBTT()", +"aab8f6e0": "airdropBy0Eth()", +"aab99609": "ApaAjaToken()", +"aab9f165": "processPayment(uint256,uint32,uint32,uint256)", +"aaba2fb8": "UnicornRanch()", +"aaba3e3b": "getSymbol(string)", +"aabb3d61": "MainBridge(uint256,address[],uint256,uint256,uint256)", +"aabbb8ca": "getInterfaceImplementer(address,bytes32)", +"aabbd0ce": "approveNewShorter(address)", +"aabd3904": "isCreating(uint256)", +"aabd46e3": "getMintRequestStringMap(uint256,int256,string)", +"aabd5b88": "_sold()", +"aabd971e": "presaleTransfersPaused()", +"aabda436": "fund_()", +"aabdf682": "FINTRUX_RESERVE()", +"aabe00c4": "verifyPreSupport(uint256)", +"aabe2fe3": "currentWinner()", +"aabe7dc4": "unlockRewardToken(address)", +"aabecb89": "setRate10(uint256)", +"aabf05cf": "set_presale_iconiq_arbits_per_ether(address,uint256)", +"aabf382b": "upgradeLevel(uint8)", +"aabf901a": "Distributor(uint256,address)", +"aac0d9c2": "CompanyReserve(address,uint256)", +"aac0e4c5": "getPendingSignatureStatus(address)", +"aac1335c": "tgeSettingsMaxStages()", +"aac1b0b7": "safeExchange(address,address,uint256)", +"aac1c80b": "getCompte_12()", +"aac24374": "setBoxPrice(uint256,uint256,uint256)", +"aac2c717": "buyXaddrWithInviteCode(address,uint256)", +"aac3e314": "setPrevOracle(address)", +"aac4e3a8": "whiteListingAdmin()", +"aac57b3a": "newAPM(bytes32,bytes32,address)", +"aac5ab61": "Crowdsale(address)", +"aac5ce9a": "Stakeholder()", +"aac67b05": "changeFactoryUsageFee(uint256)", +"aac6ba41": "setModel(address[],uint256[])", +"aac746ee": "getNameFromAddress(address)", +"aac74c92": "getPI_edit_30()", +"aac756b8": "setxiudao(address,uint256,bool)", +"aac80472": "getManagerAddress(uint256)", +"aac81654": "isNoEmptyTranches()", +"aac8788a": "setIncrementOpenInterest(bool)", +"aac878eb": "approveTransaction(uint256,bytes)", +"aacaa602": "getCurrentAmountBonusRate(uint256)", +"aacb15e6": "_validate(uint256,uint256,uint256,uint256)", +"aacb4442": "repaintVoxel(uint8,uint8,uint8,uint8)", +"aacbe4b3": "set_maxUETsPerReturnLessThan(uint256)", +"aacc3a16": "printAddress(address[3],address)", +"aacc5a17": "getRandom()", +"aacd572f": "private_setMinRollUnder(uint256)", +"aacd5a85": "orderTrade(uint256,uint256,uint256)", +"aacd9794": "setUniqueSpinnerPrice(uint256)", +"aacdb27b": "setPixel(uint32,uint32,uint8)", +"aacec70b": "createCrySolObject(string,uint256,uint16,uint16,uint8,uint8)", +"aacf3f2e": "contributionInCauldronRound(uint8,address,uint32)", +"aacf5328": "setVideoID(string,uint256)", +"aacfd352": "blockBeforeEncounter(uint256)", +"aacffccf": "getAccountOwner(bytes32)", +"aad00089": "tokenIssue(uint256)", +"aad0bb90": "TEMath(uint256,uint256,bool)", +"aad12029": "freezeAccounts(address[])", +"aad13b15": "fight(address,string)", +"aad2b723": "changeSigner(address)", +"aad3ec96": "claim(address,uint256)", +"aad41a41": "multisend(address[],uint256[])", +"aad429f1": "_buyCommonTTW(uint256,uint256,address,address)", +"aad52373": "ValidateAndStore(bytes,bytes)", +"aad55726": "getContract(address,uint256)", +"aad5632a": "generateNext()", +"aad62da2": "left89(uint256)", +"aad71040": "changeUnlockTime(uint256,uint256)", +"aad7152b": "updateTokenTransferAddress(address)", +"aad83ab3": "SpinTestToken()", +"aad85f7c": "setAchievedDate(uint256,uint64,uint64)", +"aad935af": "updateSellPossible(bool)", +"aad99ef1": "setPriceIncreaseScale(uint256)", +"aad9afee": "kingsMessage()", +"aada1cb3": "activateUniqueSpinners()", +"aada4b06": "saleIssue(address,uint256)", +"aadad773": "removeServer(uint256)", +"aadba3dc": "finishWhen()", +"aadbc52d": "addContractMember(address,bytes32,address)", +"aadbc5a0": "getMatches(uint256,address,uint256)", +"aadc0a9d": "sneakUpOn()", +"aadc1ac1": "approveLoan(uint256)", +"aadc3b72": "hasVoted(bytes32,address)", +"aadc8f23": "RogueProtocol(address)", +"aadd1b03": "donateEth()", +"aade1323": "_processUpdateFee(address[16],uint256)", +"aade53fe": "_removeCardSetAtIndex(uint256,uint256)", +"aade84ae": "TopIvy()", +"aade8dcc": "discountTokenPercent()", +"aade9bb4": "icoReturnBonus(uint256)", +"aadf017e": "_processReserve(address,uint256,address)", +"aadf1e73": "selectWinner30()", +"aadf6838": "getOldSchoolCoins()", +"aae07890": "setUnit(uint256)", +"aae07cd0": "getTokenLayers(uint256)", +"aae0ff1e": "incLuckyCoin(address,uint256)", +"aae1f5c3": "processDonate(address)", +"aae233b4": "cleanUpPreviousRound()", +"aae3d025": "transferClose()", +"aae3d031": "enableKYC()", +"aae40ddc": "getCurrentClaimerForTile(uint16)", +"aae4cbe4": "EcoToken()", +"aae62507": "getUnavailableValueT(bytes32)", +"aae755af": "m_currentUsdAccepted()", +"aae764c1": "assertFalse(bool,bytes32)", +"aae8312e": "getStakeholderTransactionCount(bool,bool)", +"aae8e1b3": "withdrawFlag(address,uint256,uint256)", +"aae99c66": "whitelistAddress(address[],bool)", +"aae9a4c7": "singleInvestorCap()", +"aae9d7ed": "__callback(bytes32,uint256)", +"aaea144d": "setPackage(bytes1[42])", +"aaea396c": "verifiedlist(address)", +"aaea4472": "LifeFactor_ii()", +"aaea44c4": "strConcat(bytes,string,bytes)", +"aaea53f3": "Channel(address,uint256)", +"aaeaa36c": "isBatchSupported()", +"aaead0f0": "initializeIndividualCapsFundraiser(uint256,uint256)", +"aaeb3255": "getInsuranceIDsByClient(address)", +"aaec0c03": "FireflyRegistrar(address,bytes32,address)", +"aaec2fa5": "getGirlsAuctionPrice(uint256)", +"aaecc9cf": "checkGameOver()", +"aaed2c3d": "getRewardRate(address,address)", +"aaed31c7": "createCoins(address)", +"aaed3c7d": "tokenBuyersAmount()", +"aaee686e": "confirmTransactionFee(uint256)", +"aaeea585": "DMToken()", +"aaef36b5": "CorvinusCoin()", +"aaf04471": "transferAndCallDelegated(address,address,uint256,bytes,uint256,uint256,uint256,bytes)", +"aaf05f3d": "f3()", +"aaf10f42": "getImplementation()", +"aaf13d10": "Wallet3()", +"aaf20486": "ProofOfLongHodl()", +"aaf3e4f4": "left88(uint256)", +"aaf47835": "acceptBuyOffer(uint32,uint256)", +"aaf49910": "sanMinLength()", +"aaf4f1ed": "setMinDailyPerUser(uint256)", +"aaf517f5": "GetRoundIndex(uint8)", +"aaf592bf": "receiveApproval(uint256[])", +"aaf5eb68": "PRECISION()", +"aaf60eec": "setRoundOneRaito(uint256)", +"aaf73ef7": "registeredDeals()", +"aaf7e700": "setResetvalue(uint256)", +"aaf809f8": "_isUnique(uint256[],uint256)", +"aaf885f8": "getRazInstanceInformation(uint256,uint256)", +"aaf9419d": "latestNewRockForSale()", +"aaf9d13e": "buyTopDog(uint256,uint256)", +"aafa4827": "KOIOSTokenSale(address,uint256,uint256,uint256,uint256,address)", +"aafa944e": "createJob(string)", +"aafab1e8": "paymentsCount()", +"aafafbf3": "multiSendEth(address[])", +"aafb088e": "stageDuration()", +"aafba184": "removeShareholderListing(uint256)", +"aafbb120": "getSaleInfo(address)", +"aafbd3da": "create(bytes32,address,bytes32,bytes32,address,bytes32)", +"aafbe1c0": "NectarController(address,address)", +"aafd775e": "getLockedBalanceForUser(address,address)", +"aaff096d": "updateDarknodeRegistry(address)", +"aaff2a83": "totalRemainingTokensForSales()", +"aaffadf3": "minContribution()", +"aaffc4b6": "currentRoundCount()", +"ab004a97": "traded_token_seed_amount()", +"ab021884": "setMinimumPriceFusion(uint256)", +"ab022b28": "resetAirdropAmount()", +"ab02f27c": "Europium()", +"ab03cf46": "sendFunds(uint256,address,bytes)", +"ab03d0e8": "changeUnitsUserCanBuyLimitEth(uint256)", +"ab040107": "decline()", +"ab044622": "syndicateTokensWithdrawn()", +"ab045871": "Indemnisation_2()", +"ab051767": "userlogout(address)", +"ab05a69a": "InbotProxy(address,address,address,address)", +"ab05bfff": "setReleaseTime(uint256)", +"ab062643": "getNumTokensPurchased()", +"ab065d6c": "getProjectClient(bytes32)", +"ab067a5b": "periodSales()", +"ab06bea3": "reportContribution(address,uint256)", +"ab06da29": "setUTExchangeRate(uint256)", +"ab074225": "BLOOToken()", +"ab0783da": "mat()", +"ab07f054": "getLandPrice(int32,int32)", +"ab080aab": "SecondBiathlonToken(address,address,string,string,uint256,address)", +"ab08d048": "SPAYToken()", +"ab08f75b": "getMoneyline()", +"ab09ee80": "respond(uint256,uint256,uint256,uint256)", +"ab0a9865": "createGen0Dog(uint256)", +"ab0b29a5": "applySetMaxFeeTrade()", +"ab0ba5d4": "challenge(uint256,bytes32,bytes)", +"ab0bcc41": "saleStart()", +"ab0cba56": "ICO(uint256,uint256,uint256,uint256,address)", +"ab0cd5bc": "createMineForToken(uint256)", +"ab0ced0e": "checkContribution(address)", +"ab0cf8b7": "Wolf()", +"ab0d92dd": "totalPrice()", +"ab0da5a9": "reject(address)", +"ab0db220": "createBattle(uint256,uint256[],bytes32,uint256)", +"ab0e6765": "setEmployer(address,address,string)", +"ab0eda9e": "setAirdropAddress(address)", +"ab0facc0": "raiseLimit(uint256)", +"ab0fd373": "matchTimestamp(bytes32,bytes32)", +"ab0fe874": "purchaseCap()", +"ab108915": "createUser(address,bytes20,uint64)", +"ab1193fa": "PREMINE_ALLOCATION_ADDED(address,uint256)", +"ab11ebdd": "returnIcoTokens(address,uint256)", +"ab127a0c": "searchBestRate(address,address,uint256)", +"ab1377c0": "startSeedStage()", +"ab14a41f": "reentrancyHelper(address,bytes,uint256)", +"ab150226": "checkAdmin()", +"ab1547d2": "nextOpenRewardTime_()", +"ab15d70c": "updateFifthExhangeRate(uint256)", +"ab15f723": "pauseMints()", +"ab165623": "TalentEducationToken()", +"ab165831": "checkContractAddress(address)", +"ab166a48": "addHistory(address,uint256[4])", +"ab16cef1": "addBigPromoBonus(uint256)", +"ab17176c": "VCCToken(uint256,string,string)", +"ab172cf5": "getCandidateByIndex(uint256)", +"ab179e9f": "currentReleaseCeiling()", +"ab17bad0": "setGasConsume(uint256)", +"ab18af27": "setDepositAddress(address)", +"ab18f6ac": "parseTimestampToYM(uint256)", +"ab19d396": "couponTokenCampaignAddr()", +"ab19fff9": "TokenFrank()", +"ab1a84da": "isCrowdfundCompleted()", +"ab1ac9f6": "BITSDToken()", +"ab1b1cb5": "getSubscriptionLastPaid()", +"ab1b3830": "EIForceCoin()", +"ab1b75f2": "burnUnpaidTokens()", +"ab1bef4e": "getDailyTickets(address)", +"ab1d3add": "assignDispute(string,address,string)", +"ab1d581b": "checkPet(uint64)", +"ab1e96e9": "migrationPeriod()", +"ab1ebb4d": "OneMillionToken()", +"ab1f7929": "setMigrationInfo(string)", +"ab207628": "getAffiliateAmount(uint256)", +"ab209e23": "Manifesto(uint256,uint256)", +"ab2191a2": "Satanshi()", +"ab21b055": "getTickets(string)", +"ab21d58a": "enableCharity()", +"ab225edc": "DepositFund()", +"ab22a640": "getVideoGameOwner(uint256)", +"ab22c561": "getVestingCliff(address,address)", +"ab231511": "lastWithdrawTime()", +"ab23c50d": "AirDropAFTK3SeptSandBox()", +"ab250cb5": "addSubcontract(address)", +"ab253ca6": "buyMinions(uint8)", +"ab2643a1": "commitCollateralToPool(address,uint256)", +"ab273016": "signProposal(uint256)", +"ab27be20": "mine(address,uint256)", +"ab27d755": "confirmOrder(bytes16)", +"ab282655": "removeHouse(address)", +"ab2874cb": "buySlot(uint256)", +"ab28c704": "initialSupportAmount()", +"ab28e8af": "serviceTokensBurn(address,address)", +"ab2a4f8a": "transferRevenue(address,address,uint256)", +"ab2a5772": "setIcoHardCap(uint256)", +"ab2a6dc1": "dealsGetter(address,uint256)", +"ab2af349": "CallCancelled(bytes32)", +"ab2c8b16": "fundingLowcapReached()", +"ab2e5a1f": "play(uint256,uint256,uint256)", +"ab2ebcf1": "priceExpirationInterval()", +"ab2f0e51": "availableBalance()", +"ab30c26d": "getInvestorInforMin(address)", +"ab32775c": "alreadyContains(uint256[],uint256,uint256)", +"ab331a34": "getProperty(string)", +"ab33cbcf": "inxCrowdsale()", +"ab34dc48": "monechainToken()", +"ab351270": "lottery(address,uint256)", +"ab3545e5": "getMember(uint256)", +"ab35678c": "trackCount()", +"ab3640c8": "processPayment(address,uint256,bytes32)", +"ab36e4a6": "milestonesCount()", +"ab37594b": "cancelOrderByMerchant(string)", +"ab383a6b": "getPropertyPrivateModeBecomePublic(uint16)", +"ab3860d0": "test_twoValidEqUint()", +"ab3a32c4": "refundAllExternalPurchase(address)", +"ab3a39c2": "scamSealTokenAddress()", +"ab3b87fe": "setOwner(address,uint256)", +"ab3bd81f": "changeTuneOption(uint32,uint32,uint256,bool,bool,uint128,bool,uint64,uint256)", +"ab3bfac4": "freezeBalance(address,uint256)", +"ab3c04d3": "BAKEToken()", +"ab3cdaf0": "PRE_ICO_BONUS_TIME_2()", +"ab3d2e74": "_clearApproval(uint256)", +"ab3d4e8b": "MembershipPurchase(address,uint256,uint256)", +"ab3dd698": "airdropDiff(uint256[],address[])", +"ab3e9c56": "ChangedInitialPrice(uint256)", +"ab3ed9f0": "DecisionToken()", +"ab3efa83": "tokenSafeLock(uint256,uint256,uint256,uint256)", +"ab3f22d5": "allocate(address,uint256,uint256)", +"ab3f699c": "getOrCreateNextFeeWindowWasCalled()", +"ab400d86": "updatePlayerEth(address,uint256,address)", +"ab40340a": "recordWithdraw(uint256,address,uint256)", +"ab40b01f": "getAddressAnswerKeccak256(uint256,address,address)", +"ab40b65a": "receiveapproval(address,uint256,address)", +"ab413a7e": "getScoreAndCount(address)", +"ab4215cc": "getDataOfGame()", +"ab430d49": "transferToken_toInvestBalance(address,uint256)", +"ab442c59": "getICOToken()", +"ab4459bc": "releaseBountyTokens()", +"ab447007": "setClaimDate(uint256)", +"ab45e2a0": "processPurchase(address)", +"ab464a4c": "launch_date()", +"ab464fa6": "transferMultiDiff(address[],uint256[])", +"ab46cc46": "add_attender(string[])", +"ab470f05": "getCaller()", +"ab473f48": "closeFunding(uint256)", +"ab47f1bf": "getFilledAmount(uint256)", +"ab4865ec": "boardTokensAddress()", +"ab486607": "getLeaderboardLength()", +"ab489f08": "toBytes(address[])", +"ab48f2f8": "PlayNow()", +"ab4955c2": "ReserveWalletUpdated(address,address)", +"ab4a2eb3": "getUnlockableTokens(address)", +"ab4b3929": "updateMinMaxInvestment(uint256,uint256)", +"ab4b4def": "WITHDRAWAL_SCALE()", +"ab4bc414": "bitbgcToken()", +"ab4bf05e": "addSignature(string,int256,string)", +"ab4c4487": "getSystemSalePrices()", +"ab4d0ca9": "multiAdd(address[])", +"ab4e21c4": "OneBlocToken()", +"ab4e8ef1": "getAirdropTokens()", +"ab4ef895": "MB()", +"ab4f643c": "PublisherParametersChanged(address)", +"ab4fa078": "ListAllSince(uint256)", +"ab503e30": "SetminTokens(uint256)", +"ab50bc86": "PubRegistered(address)", +"ab50e7f2": "third_release(uint256)", +"ab5170b2": "getstr()", +"ab519020": "calcShare(uint256,uint256)", +"ab51937b": "startproduction()", +"ab519b0c": "prepare(uint256,address,address,uint256,bytes)", +"ab51b06f": "preSaleBonus()", +"ab51cff2": "getQuarterVATBalance(uint256,uint8,address)", +"ab531efd": "_encodeTokenId(uint256,uint256)", +"ab5366dd": "pendingOwner2()", +"ab53d3b3": "jpotInfo()", +"ab54775d": "lookupSigName(address,address)", +"ab55979d": "changeStaker(address)", +"ab55d1cc": "getDAIBalance()", +"ab5690c4": "enableWithdrawals(address,address)", +"ab56c09e": "Placed(uint256,uint8,address)", +"ab5706ee": "setBaseSummonPrice(uint256)", +"ab5783c4": "StopGame(uint8)", +"ab582eb3": "kickOwner(address)", +"ab5841f2": "updateReserve(address,uint32,bool,uint256)", +"ab590032": "cleanAssetHolders()", +"ab5a7076": "RadiumToken(address)", +"ab5aa302": "_START_DATE()", +"ab5aea81": "Menu07(address)", +"ab5b4456": "use(uint256)", +"ab5db036": "refundICO(address)", +"ab5e28c5": "transfers()", +"ab5e5158": "setNewManager(address,address)", +"ab5ed150": "getOne()", +"ab5efded": "OmegaToken(address,address)", +"ab5f3380": "getVineyard(string,address,uint256)", +"ab5f6b91": "multiCreate(uint256,uint256,uint256)", +"ab5fa2c6": "setITO(address)", +"ab60443b": "changeInviteRate(uint256)", +"ab605eea": "fighterIndexToApproved(uint256)", +"ab60e4e5": "setWebGiftOnceMaxAmount(uint256)", +"ab60ffda": "exp()", +"ab61787a": "proofFailed(address,uint256,uint256)", +"ab619e5a": "StandardToken(string,string)", +"ab6231f1": "RefundedETH(address,uint256)", +"ab62438f": "submitImpeachmentProposal(string,address)", +"ab624cf1": "setPartyA(address)", +"ab630fc4": "kimsOnAuction()", +"ab635b48": "createTokenVestingContract(address)", +"ab63d7f2": "getUniqueId()", +"ab643c07": "getAllBounties()", +"ab643c10": "requestEthereumPrice(address,string)", +"ab64611b": "BitmarkPaymentGateway(address)", +"ab651065": "setESCBCoin(address,address,address,uint256,uint256)", +"ab65c534": "SqueezeTheJuice()", +"ab65cda6": "getDial2Type(uint8)", +"ab65f20a": "mintCards(uint256[],address)", +"ab6680f3": "initAuction(uint256,uint256,uint256,uint256,uint256,address,bool)", +"ab67aa58": "transferFrom(address,address,uint256,bytes)", +"ab686d0a": "setFrontWindow(address)", +"ab6a5d95": "changeBoardAddress(address)", +"ab6a9f0e": "knockoutTeam(uint256,uint256)", +"ab6ad452": "unlockedBalance()", +"ab6ae424": "affWallet()", +"ab6b551e": "isSideBridgeContract()", +"ab6b7e22": "grantBounty(address,uint256)", +"ab6bfe78": "Hongshanchain(uint256,string,string)", +"ab6c291b": "getWiningType(uint256)", +"ab6c5f58": "removePlayer(uint256,uint8)", +"ab6cab71": "PoWH4DSupply()", +"ab6cb831": "UNIToken(uint256)", +"ab6cf42f": "isReservationFull()", +"ab6d8a9a": "gemFab()", +"ab6da028": "TOKEN_FOR_COMUNITY()", +"ab6db199": "dias()", +"ab6ddfa8": "holderBalance(address)", +"ab6def1c": "isShareToken()", +"ab6e1be4": "getTs()", +"ab6e4959": "depositsOfMember(address)", +"ab6e79ed": "getBaseToQuoteReturn(uint256)", +"ab6e9072": "admin_wallet()", +"ab6e988c": "playerVault(address)", +"ab6ef0b1": "purchaseLandWithCC(uint8,bytes32,uint256)", +"ab6f78f0": "SetRecord(address)", +"ab6f9e4a": "votesPerChoice(uint8)", +"ab700624": "toWidthString(string,uint256)", +"ab701ca3": "_upgradeabilityOwner()", +"ab702d48": "train2(uint256,uint256)", +"ab70bba7": "OtxToken()", +"ab70d0c5": "_getEndWeek(uint256,uint256)", +"ab70ee5c": "PoloneumToken()", +"ab71b8ac": "maxBountyTokens()", +"ab727094": "reinvestDivies()", +"ab731fd6": "ownerSetOverride(address,address,bool)", +"ab736b5d": "checkUniqueLockedTokenReceivers()", +"ab73e316": "next(address)", +"ab73f08e": "findOptionId(address)", +"ab74731d": "dividendPayment()", +"ab75a4a2": "angelWheelFinancing()", +"ab75e6c8": "DTXTestToken()", +"ab7748da": "Blocker_resume(bool)", +"ab779505": "NettingChannelContract(address,address,address,address,uint256)", +"ab77b178": "issueCoin(address,uint256)", +"ab7891f5": "deleteSiringWithId(uint256)", +"ab79fd26": "setBeginTimeTS(uint256)", +"ab7a162f": "getInterCryptoPrice()", +"ab7a9691": "isReleaseAgent(address)", +"ab7aa65d": "icoThresholdBonus2()", +"ab7af62f": "setAttackBoostMultipler(uint256)", +"ab7b347c": "BitcoinDominatorERC20Token()", +"ab7b47aa": "_generateInitialPattern()", +"ab7cb211": "allowBuy()", +"ab7ccc1c": "credit(uint256,uint256)", +"ab7df819": "Simscoin()", +"ab7e50ba": "GAX()", +"ab7e9dca": "getPrivilegedBalance(address)", +"ab7ebbce": "startPresale(address)", +"ab7ec692": "primoContratto()", +"ab7f8f12": "masicotestToken()", +"ab802509": "setMintAgent(address)", +"ab80c807": "RareCoin(address)", +"ab81e773": "left61(uint256)", +"ab82d9a0": "challenge(uint256)", +"ab831144": "parseUint(bytes32)", +"ab834bab": "atomicMatch_(address[14],uint256[18],uint8[8],bytes,bytes,bytes,bytes,bytes,bytes,uint8[2],bytes32[5])", +"ab840808": "migrateBasicData(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"ab8425d8": "set_amount(uint256)", +"ab84db68": "releaseArr()", +"ab850a85": "mintGold(uint256)", +"ab8530f8": "Mint(address,address,uint256)", +"ab8620dd": "getStageSoldTokens()", +"ab86ba3a": "bonus3()", +"ab86e0a6": "_setBalance(address,uint256)", +"ab87d816": "getPerson(uint32)", +"ab883d28": "multisendEther(address[],uint256[])", +"ab888539": "setIdentifier(address,bytes32)", +"ab889df9": "DoradoToken()", +"ab89641b": "getTlength50()", +"ab89d8c6": "WGWToken()", +"ab89f2c7": "getCurrentStageId()", +"ab89f870": "setMultiple(uint256)", +"ab8a0360": "Auth()", +"ab8a1595": "test_25_assertGasUsage1400Boards()", +"ab8a288b": "checkStoredFile(string)", +"ab8be231": "setMockedTime(uint256)", +"ab8ca6e9": "getBonusTier(uint8)", +"ab8d01b8": "transferFromToUpdateToken(address,address,uint256)", +"ab8d1daf": "payTokenOwner(address,uint256)", +"ab8d3dc1": "TokenPing(uint256)", +"ab8e0f6e": "Mmcchain(uint256,string,string)", +"ab8e5b01": "testGetLastTime()", +"ab8efb87": "UInt256(int256)", +"ab8f1957": "investedPeriods(uint256)", +"ab8f3c98": "validateBroadcasterSig(string,uint256,bytes32,bytes,address)", +"ab8feb02": "TKN()", +"ab90602c": "registerTicketsToUser(string,address,uint256)", +"ab90a8ac": "createSaleTokens()", +"ab90f855": "maxPromoToons()", +"ab911060": "assertOnlyFrom(uint256)", +"ab91154e": "ownerAddSanSlot(address,uint256)", +"ab91c7b0": "queueLength()", +"ab9213f3": "addAddressReferrals(address[],address[])", +"ab92670e": "Franc()", +"ab929fcd": "submitArticle(string,string,bool)", +"ab92f290": "addNewDividends(uint256)", +"ab948370": "KingToken()", +"ab948374": "gen0EndingPrice()", +"ab95b586": "getEventTimes()", +"ab9611f4": "setCancelableAt(uint256)", +"ab96cc4c": "receivedFunds()", +"ab96d498": "addPublicFundingWhiteList(address[])", +"ab96dd18": "earlyStageLasts()", +"ab97af6c": "initialCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"ab97d59d": "getTokenManager()", +"ab97e196": "revokeAmountVote(uint8)", +"ab98458e": "getUint80val()", +"ab989586": "WMCToken(uint256,string,string)", +"ab998660": "LockMechanismByOwner(address,uint256)", +"ab998939": "RequireDispose(address)", +"ab99deb8": "Expread()", +"ab99e48f": "requestMerge(uint256[])", +"ab9a5caa": "AEStoken()", +"ab9a78df": "priceOf(string)", +"ab9a81c3": "numOfBlocksInMinute()", +"ab9a913a": "generatedEve()", +"ab9ae1be": "isCrowdSaleStatePreSale()", +"ab9af166": "reduceCDFee(uint256)", +"ab9b8637": "medibitICO(address)", +"ab9c1758": "cancelMarginCallOnBehalfOfRecurse(address,address,bytes32)", +"ab9c20d0": "finalizationSuccessHook()", +"ab9cd37e": "withdraw(uint80)", +"ab9d8b8b": "circulatingTokens()", +"ab9d8e4b": "Thankfulness()", +"ab9dbd07": "getID()", +"ab9def41": "hardCapTokensAmount()", +"ab9fe3a1": "importBalances(address,address[])", +"aba00859": "decBalance(address,uint256)", +"aba01e5c": "impl_amountOfWorkpointQueue()", +"aba0e189": "checkGameStatus()", +"aba1017b": "despawnGladiatorAndAwardCoins(address)", +"aba133ea": "GVPE_Token()", +"aba13a2f": "_resetTiles()", +"aba16a02": "offerToChannels(uint256)", +"aba222ed": "nodeRegistrationEnabled()", +"aba23628": "mintPlayers(uint128[],uint256,uint256,uint256)", +"aba3d017": "windowAt(uint256)", +"aba46a93": "etapAddressesLimit()", +"aba47d1a": "getGrapesToBuildWinery()", +"aba61514": "priceT4()", +"aba683fa": "Etbccoin()", +"aba70319": "FreyrTokenLocker()", +"aba7ad0d": "lotteryFeeVal()", +"aba88037": "DARKNODE_FEES_NUMERATOR()", +"aba88766": "claimableHalvingsOf(address)", +"aba89198": "getCurrentCapacity()", +"aba8dfbd": "SecondBonus()", +"aba9650e": "createDepositContract(address)", +"abaa5f3e": "randomDS_getSessionPubKeyHash()", +"abaa9916": "allocate()", +"ababa4a7": "authorize()", +"ababb2dd": "_tryUnlockBalance(address)", +"ababe93d": "distributeBondFund()", +"ababf71b": "GetSummReward(uint256)", +"abacf5d7": "getBoardUpdateTime(uint256)", +"abad3466": "createtoken(string,string,uint256)", +"abadaf9a": "bonusAmount()", +"abadeb06": "teamPeriodsNumber()", +"abaed924": "executeOrders(address[],bool[],uint256[],uint256[],address[],address[],address[8][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[])", +"abaf1de9": "setPublicPrice(uint256,uint256)", +"abaf5880": "Crowdsale(uint256,uint256,uint256,address)", +"abaf9457": "localRevenuePercent()", +"abafaa16": "emitIssue(bytes32,uint256,address)", +"abb00601": "addUnpausedWallet(address)", +"abb151c8": "CCICoin()", +"abb1a33a": "SetHotLists(string)", +"abb21618": "changeAirdropValue(uint256)", +"abb254de": "developer_withdraw_ETH()", +"abb2874f": "DezToken()", +"abb29f70": "TinyOracleDispatch()", +"abb2d04b": "editName(string)", +"abb4108e": "addRoles(uint8[])", +"abb41fab": "_reward_masternode()", +"abb43397": "getCanvasBitmap(uint32)", +"abb46619": "DSCToken(uint256,address)", +"abb4fe2d": "MiningRigRentalsToken()", +"abb524a4": "PapyrusSalePhase1(address,address)", +"abb58d20": "Registry(address,address,address,string)", +"abb58fd3": "createLink(bytes32)", +"abb5bf16": "reinverst(address)", +"abb689e1": "payRedemption(uint256)", +"abb69a1a": "getInvoicesByStatus(address,uint256,uint8)", +"abb70034": "getChosenNumbers(address,uint256,uint256)", +"abb721ce": "_deposit()", +"abb743c8": "setUint(int256,uint256)", +"abb8c965": "_setOwner(address,bool)", +"abb9e0bf": "coinIssuedAdvisor()", +"abb9eef4": "YUNXIN2Token(uint256,string,uint8,string)", +"abba87c1": "_prestige()", +"abbadf55": "oobiqoo(address)", +"abbb4695": "setNotifier(address)", +"abbbf451": "getRound0MinDuration()", +"abbc54b0": "changePriceUpdateWaitingTime(uint256)", +"abbc5d2a": "levToll()", +"abbc8afa": "teamPoolForFrozenTokens()", +"abbcb24b": "LEGAL_EXPENSES_ADDR_2()", +"abbdc272": "checkGameStart()", +"abbe3056": "stage2Deadline()", +"abbef24e": "buyDaiWithEth(uint256)", +"abbf7228": "changeBlocks(uint256,uint256)", +"abbf94f8": "PlatoniusToken()", +"abbff658": "Ownable3()", +"abc1c9fe": "requestForRefund(uint256)", +"abc21702": "getPI_edit_25()", +"abc2a40a": "minInvestBTC()", +"abc2ab75": "FinalizeDispute(address)", +"abc32931": "safeTransferFromDataContract(address,uint256)", +"abc33778": "Result(bytes32,address,uint256,bool)", +"abc38cf2": "submitNewClip()", +"abc3bc92": "getReferrerBalance(address)", +"abc40f41": "batchWrite(uint256,uint256,string)", +"abc4558e": "_requireRenewableProduct(uint256)", +"abc45ddc": "BANKOIN()", +"abc48a0d": "minerTotalSupply()", +"abc4cbd3": "transferForTeam(address,uint256)", +"abc6124f": "Bought(uint256,string,address,uint256,string,string)", +"abc63d00": "STARTING_TIME()", +"abc66e82": "dev_fee(uint256)", +"abc6affb": "publicGetUserHistory(address,uint256)", +"abc6fd0b": "disburse()", +"abc897f4": "removeMinterByValue(address)", +"abc8bc4c": "addBomb(uint8,uint256,uint8,uint8)", +"abc8c7af": "marketplace()", +"abc93aee": "left64(uint256)", +"abc9e8c0": "fetchOrdersForPayer(address)", +"abca7290": "feeDeposit()", +"abcafdf8": "prizeProjection(uint256,uint256)", +"abcb7fce": "getTokenAddressHashing(address,uint256)", +"abcb9934": "unlistToken(address)", +"abcc11d8": "lastResult()", +"abcc8a46": "LogEuroTokenOwnerMigrated(address,uint256)", +"abccb043": "modifyMaxContractBalance(uint256)", +"abcccdb1": "agentAddr_()", +"abcd0d9d": "getNewEndTime(uint256,uint256,uint256)", +"abcd7960": "equal(uint256,uint256,string)", +"abcdabcd": "aiGFJ()", +"abcdff1d": "ComputeMyShare()", +"abce03d0": "KoreaRepublicvsGermany()", +"abcf033c": "safeWithdrawalFromCrowdsale(address)", +"abcf1328": "InterestBank()", +"abd05acd": "createDklSaleAuction(uint256,uint256)", +"abd06c3b": "remove(bytes1,bytes1)", +"abd10e07": "failSafeAddWhenGreaterThanIntMax()", +"abd117fe": "GXCSentToETH()", +"abd15c4f": "transferProd(address)", +"abd188a8": "setKyberNetworkContract(address)", +"abd1a89c": "allocTokenHolder()", +"abd225e1": "isStarted(uint256)", +"abd23d95": "getNameByAddress(address,address)", +"abd2adbb": "columns()", +"abd2cc5f": "presaleClosed()", +"abd2ecb7": "isOnExchangeById(uint256)", +"abd437da": "balanceOfCall(address)", +"abd44556": "setBatchDetachCollectibles(uint256[])", +"abd49646": "makerDAO()", +"abd5100d": "referralAmountInvest(address)", +"abd5f3c7": "poolPrice()", +"abd6b000": "CryptoSagaCardSwapMerculet(address,address,address,address)", +"abd6cb3c": "firstStageRaised()", +"abd6ff8e": "setIntValue(string,int256)", +"abd70aa2": "getPoolBalance()", +"abd74e52": "getLastPriceFeedValues()", +"abd796bf": "addAllowedAddress(address,address)", +"abd7f8de": "doEmit(uint256,uint256)", +"abd8537f": "makeSmokeymon(string,uint8)", +"abd89e1e": "preICOmint(uint128)", +"abd8d939": "buyThroughProxy(address)", +"abd936ab": "delegateDklSaleAuction(uint256,uint256,bytes,uint256)", +"abd958eb": "getCurrentBlockValueAndSellPriceForTile(uint16)", +"abda35de": "inMaintainance()", +"abda78ed": "getAltOracles()", +"abdb5ea8": "repayBorrow(address,uint256)", +"abdbe6ca": "CrowdDreaming()", +"abdbf4a3": "UpdateAsk(address,uint256,uint256)", +"abdc5dee": "HumaniqToken(address)", +"abdd0c44": "marginCallOnBehalfOf(address,bytes32,uint256)", +"abdd11a8": "setOpeningTime(uint256)", +"abdd19d9": "setCityContract(address)", +"abdd2430": "AuctionCreated(address,uint256,uint256,uint256,uint256,uint256)", +"abdde3d1": "getEthToTokenOrder(uint32)", +"abde33f7": "right26(uint256)", +"abded6fd": "setANT(address,address,address)", +"abdf9566": "setData_16(string)", +"abdf9bda": "bountyProgam()", +"abe088a7": "financialOfficerAddress()", +"abe1d5a2": "ViewRawDeposit(uint256)", +"abe24a3d": "mulByFraction(uint256,uint256,uint256)", +"abe2a16e": "FeeRate()", +"abe2a18d": "stateChangeAgents(address)", +"abe3219c": "safeMode()", +"abe35312": "getAvailableTokensToSellCurrentPhaseIdx(uint256)", +"abe3d0e3": "logPurchase(address,uint256,uint256)", +"abe3dfd1": "setInitialRate(uint256)", +"abe4136f": "getNickname()", +"abe4932c": "createPostboyAccountForSomeone(uint256,uint256,bytes16)", +"abe5b120": "Registered(address,uint256,uint256,uint256)", +"abe65ec9": "_createDiamond(string,address,string,string,string,string,string)", +"abe6c54d": "deleteCandidates(address)", +"abe6e82f": "setAmountBonuses(uint256,uint256,uint256)", +"abe7008e": "getPlayerValue(uint8[],uint8)", +"abe756da": "dateRelease9()", +"abe75844": "preSaleFirstEndDate()", +"abe7b54e": "readWelfareDetails(address)", +"abe7c08e": "finishVoting(uint256)", +"abe7cc7b": "LOCK_END()", +"abe7f1ab": "remove(address,uint256)", +"abe7f6fe": "ensureAllowance(address,address,uint256)", +"abe8014a": "totalWeiRaisedDuringPreICO()", +"abe9717a": "A2ACrowdsale()", +"abe9f569": "oraclize_getPrice(string,uint256)", +"abea0804": "nAddresses()", +"abea8d79": "setMiningLeader(address)", +"abeb5f9f": "hasQuickBuyEtherToken()", +"abebb746": "_fillOrder(address,address,uint256,address,uint256,uint256,uint256)", +"abebb7f3": "MarketsContract()", +"abec0a00": "BLVK()", +"abed982b": "LockedUpTokensWithdrawn()", +"abedeab4": "init_claim(uint256)", +"abee967c": "initialReward()", +"abefe7ac": "canCreateUnit(uint256)", +"abf03e19": "end_ICO(uint256)", +"abf0661f": "_burnForDeposit(address,uint256)", +"abf0c538": "vestTokens()", +"abf17198": "getShipProductEarningByModel(uint16)", +"abf19801": "createVesting(address,uint256,uint256,uint256,uint256,bool,address)", +"abf26786": "item(uint256,bool,bytes)", +"abf2b5b9": "cancelMtr(uint256)", +"abf2e01c": "isElectionPeriod()", +"abf3260f": "highestEditionNumber()", +"abf45359": "preSaleTokenCap()", +"abf52f53": "independentSellerJoined(address,uint256,address)", +"abf567e1": "setStartTime(uint256,uint64)", +"abf64392": "withdrawInvalidated(uint256)", +"abf74a93": "pitFee()", +"abf74cda": "_issueTokens(address,uint256)", +"abf74d5f": "bury(uint256)", +"abf7b063": "totalSuperAdminsMapping()", +"abf7bfd8": "createUser(bytes32)", +"abf7f83e": "setBonuses(bool)", +"abf8de6b": "TrocarAdmin(address)", +"abf8fbb8": "BCB(uint256,string,string)", +"abf98fe1": "getDepositBalance(uint256,uint256,uint256)", +"abfb589b": "revealBet(uint256,uint256)", +"abfb84a9": "TransferredPrefix(string,address,address)", +"abfc3db2": "MIN_UPDATE(bytes32)", +"abfc99a8": "setPeriodStart(uint256)", +"abfcb627": "subscribe(address,bytes32)", +"abfcb6f8": "checkInfo(uint256,address)", +"abfcc7d8": "endRound(uint256,uint256,address[],address[],bool)", +"abfccf3c": "REKTTokenSale(address,address,uint256)", +"abfceffc": "getAssetsIn(address)", +"abfd5c94": "addEntryInDays(address,uint256,uint256)", +"abfdcced": "setBool(bytes32,bool)", +"abfdd068": "getUserAuctionIds(address)", +"abfdfbe6": "setRentalPricePerDay(uint256)", +"abfe0472": "setMainLocation(uint16,uint16)", +"abfe35ad": "getStakingReward(uint256)", +"abfe40a8": "privateMint(uint256)", +"abfea3c5": "IraPid()", +"abfebfd9": "fifthWeekTokenPrice()", +"abff0110": "broker()", +"abff3fc1": "eventSaleEnd()", +"abffc9ac": "delistToken(address)", +"abffeffc": "create(address,address,address,address)", +"abfffa28": "foundersTokensDisbursed()", +"ac001725": "Goldic()", +"ac00c3e6": "teamEndTimestamp()", +"ac01367f": "CryptovoxelsProperty(string,string)", +"ac016a31": "label(bytes12)", +"ac01b83d": "getAllPlayers(uint256)", +"ac0250f7": "memberAt(uint256)", +"ac0287e2": "arrr(uint256[])", +"ac02c601": "TranferETH(address,uint256)", +"ac03f324": "transfer_status()", +"ac045aca": "soldSoulFor(address)", +"ac0496e1": "setItemToken(address)", +"ac04f5a7": "append(address)", +"ac05e0f7": "getBurnRequestUintMap(uint256,string)", +"ac05e15f": "manuallyMintTokens(address,uint256,uint256)", +"ac066073": "startTimePresale()", +"ac06e302": "SetupCrowdsale(uint256,uint256)", +"ac06eb81": "MDIVToken()", +"ac080f48": "getDebrisStatus(bytes32,uint8)", +"ac0840db": "resultsPublishedTime()", +"ac098ce9": "addAnn(string)", +"ac0a04b2": "signToApproveAddTokenData(uint256)", +"ac0a7223": "buyCost()", +"ac0ab476": "transferToContract(address,uint256,bool,bytes)", +"ac0b1786": "MeibangAccumulationAppreciationAllocation(uint256,string,uint8,string)", +"ac0ba9b1": "payUSDCToProvider(address,address,uint256)", +"ac0c103a": "a_palavra(bytes5)", +"ac0c518d": "preSaleTokenSold()", +"ac0ca722": "AutoreleaseTriggered()", +"ac0db69d": "Log(uint8)", +"ac0eeeb3": "showGuessIds(uint256)", +"ac0f3865": "LogTokensWithdrawn(address,uint256)", +"ac0f90e3": "checkCrowdsaleState(uint256)", +"ac0fdae5": "Record(address,string)", +"ac110d8e": "Take()", +"ac12319d": "adminPayout(uint256)", +"ac128f4f": "roundResults(uint256)", +"ac12bf92": "setAdminStatus(address,uint256)", +"ac12f3e9": "partner1_voted_update_prenup()", +"ac132dc3": "ProtectedUnlock(address,address,uint256)", +"ac133709": "getChannelParticipantInfo(address,address)", +"ac133d3b": "deploymentCost()", +"ac134c08": "rewards_amount(uint256)", +"ac13d9a6": "setPartnerContracts(address)", +"ac1424fd": "generateNewTicket(address)", +"ac145d80": "setOperationsCallGas(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"ac14c61e": "PresalePool(address,uint256,uint256,uint256)", +"ac151959": "setmaxprice(uint256)", +"ac1559d2": "totalTokensSent()", +"ac155a6c": "MatryxToken()", +"ac171101": "GAGARIN()", +"ac17cba4": "lemonsRemainingToDrop()", +"ac17d506": "getMemberData(address,address)", +"ac185644": "ownerTimeLastMinted()", +"ac1864b8": "treasuryManagers(uint256)", +"ac187542": "forceEndGame()", +"ac18de43": "removeManager(address)", +"ac194b07": "preIcoStartBlock()", +"ac19c726": "setKeepEth(bool)", +"ac1a13fb": "cancelOrder(uint256,uint32,uint32,uint256,string)", +"ac1a182c": "_calcProportion()", +"ac1a386a": "setWalletAddress(address)", +"ac1a7175": "lockUserInfo(address)", +"ac1aaa1a": "calticket(uint256)", +"ac1ad7d1": "tickerQuery()", +"ac1b14ff": "proxyCall(uint256)", +"ac1bc7e8": "updateDetails(string,string)", +"ac1c1443": "listProducts(address)", +"ac1c3d04": "generateToken()", +"ac1cb329": "withdrawBuyAgent()", +"ac1cd994": "seed_coins_vault2()", +"ac1d0609": "updateWhiteList(address,bool)", +"ac1d6fe2": "changeAllocation(int256)", +"ac1deea0": "RateUpdated(uint256,bytes32,uint256)", +"ac1e17df": "addHolder(address)", +"ac1e4734": "ORCA()", +"ac1e765b": "checkValidity(string,address,string)", +"ac1f7ca1": "totalFundsAvailable()", +"ac20902e": "NormalizeMoney()", +"ac20e2a0": "TOTAL_TOKENCAP()", +"ac210cc7": "wrapper()", +"ac216ae9": "setCheckBonus(bool)", +"ac218c6d": "addressICOManager()", +"ac21bacd": "TokenPriceChanged(uint256)", +"ac22b970": "_medalFreeze(uint256)", +"ac22cec8": "withdrawGasCost()", +"ac230e52": "getHeroName(uint256)", +"ac232383": "getAyantDroitEconomique_Compte_6()", +"ac246c3e": "TIME_TO_STALEMATE()", +"ac256e1d": "RiekCoin()", +"ac25f266": "add_to_whitelist(address)", +"ac26109e": "lockForOrder(address,uint256)", +"ac267435": "volumeType7()", +"ac270c37": "contractUp()", +"ac280cb9": "MAX_STANDARD_SALE_PACKS()", +"ac281ca6": "recordPayment(uint256,uint256,uint256)", +"ac28240d": "transferBackMANA(address,uint256)", +"ac283f5b": "Error(string,string)", +"ac28838b": "getPerson(bytes32)", +"ac28ff48": "collectableTokenBalance()", +"ac297d21": "vendDisciple(uint256)", +"ac2ac86c": "setSmallCapWhitelistParticipants(address[],uint256[])", +"ac2aefd2": "addPigment(uint256,uint256,uint256,uint256)", +"ac2c8bb5": "getTile(uint16)", +"ac2d456d": "setOracleCallbackGasPrice(uint256)", +"ac2d7ce5": "setNextLotteryTTWTokenId4(uint64)", +"ac2e043d": "whitelistMulti(address[],uint256[],uint256[])", +"ac2e064b": "set_maxCWCsPerSaleLessThan(uint256)", +"ac2e2c65": "JULIAN_ADDRESS()", +"ac2f0074": "polls(uint256)", +"ac307773": "claimFunds()", +"ac30da84": "BountyHunter()", +"ac3120a0": "LogContribution(address,uint256,uint256,uint256,uint256)", +"ac31818d": "Better_Bank_With_Interest()", +"ac328187": "initializeTeamVault(address)", +"ac3314a6": "issueLockedTokens(uint256)", +"ac336f7b": "getCurrentConsensus(string)", +"ac355ed3": "_salesprice()", +"ac35bdb4": "sub_session(string,uint256)", +"ac35caee": "transferWithReference(address,uint256,string)", +"ac360d3c": "TokenWrapper()", +"ac375770": "didWithdraw(address,uint256)", +"ac377553": "fillFromCollateral(uint256)", +"ac38eb07": "tokenIdForHandle(bytes32)", +"ac3910a2": "ballot()", +"ac3c27cf": "resolveDisputeSeller(address,string)", +"ac3c49e0": "getMarketMakerAddressFromToken(address)", +"ac3c9952": "batchTransfer(address,uint256[])", +"ac3cb72c": "addApproval(address,uint256)", +"ac3cdf78": "RANGEEND_10()", +"ac3d057d": "releaseBudget(address,uint256)", +"ac3d5084": "initialFrozenTime()", +"ac3d8558": "setExitStake(uint256)", +"ac3dc451": "TorontoRules(address,address[])", +"ac3dc9aa": "startBlockTimestamp()", +"ac3e6b2f": "testSetNotRetractable()", +"ac3e7d24": "addChainyData(string)", +"ac3fc432": "stampCreatedCount()", +"ac403817": "addresIndex()", +"ac41865a": "getPrice(address,address)", +"ac41b4a5": "SignalingEnabled(address,uint256)", +"ac42c3ec": "maxTokenBetValue()", +"ac42ea7d": "rejectBurnRequest(uint256,string)", +"ac42f301": "getNextForwardUserId()", +"ac42f446": "botPhase()", +"ac440d13": "CardsAccess()", +"ac4501d9": "splitTrade(uint256)", +"ac451185": "getGames(uint256,uint256)", +"ac45185d": "adminStewardship(address[2],uint256[7],uint8,bytes32[2])", +"ac457a9d": "ExposureOpened(bytes32,address,uint256,uint256,uint64,uint64)", +"ac460d66": "setTokensContract(address,address)", +"ac46a451": "OpsAddressChanged(address)", +"ac46fa22": "burnEscrow(uint256,uint256)", +"ac4746ab": "EPOCH_LENGTH()", +"ac4758cc": "Takafuly()", +"ac475e5c": "CheckTimeout()", +"ac476a05": "MarketMaker(address,address,uint256,uint256)", +"ac47981c": "issueCertificate(string,string,string,address,address,string)", +"ac480af9": "updateFirstDeposits(uint256)", +"ac482bff": "resume_PRIVATESALE()", +"ac48bd5a": "ethUSD()", +"ac48fcbc": "testTheMultipliers()", +"ac490b08": "parsha()", +"ac49dd5c": "removeTimelock(address)", +"ac4a743d": "ecoFundSupply()", +"ac4ab3fb": "hasRole(address,bytes32)", +"ac4abae1": "lockReleaseDate()", +"ac4b2bae": "newParameters(int256,uint256,int256,uint256)", +"ac4ba3ea": "initManager(uint256,uint256)", +"ac4bd53a": "currentLeader()", +"ac4bed68": "modifyHorsey(uint256,address,bytes32,uint8,uint8)", +"ac4c25b2": "void()", +"ac4c8bf3": "argCurMax()", +"ac4ce2c6": "setAddress(uint256,address)", +"ac4cfa4c": "calcAmount(address)", +"ac4d2e95": "ownerTokensFreeDay()", +"ac4d8a26": "setRepPriceInAttoEth(uint256)", +"ac4d965c": "notZeroAndNotSender(address)", +"ac4ddd9f": "retrieveTokens(address)", +"ac4df041": "donationClosed()", +"ac4e677c": "registerTrack(bytes32,uint256,bytes32,bytes32,bytes32,bool)", +"ac4e73f9": "proposeReverse(string,address)", +"ac4eefc5": "getGoldDataMinted()", +"ac4fb219": "enableLockFlag(bool)", +"ac50713a": "foundingTeamWallets(uint256)", +"ac509050": "getPlayerRoundsKitties(uint256,uint256)", +"ac50a466": "betfortoken()", +"ac50af76": "transferExcessTokensToReserve()", +"ac50b2e5": "getPlayerRoundNumbers(uint256,address)", +"ac51009e": "createBountyTokens()", +"ac51215b": "TokenRegistry(address,int256)", +"ac516951": "setAddressVoteRules(address,address,bool,uint256[5])", +"ac51a36a": "_unpackPetData(uint256)", +"ac51af8e": "transferWithBonus(address,uint256)", +"ac51d3a5": "smileyToken()", +"ac5277a4": "teamSupply6Months()", +"ac552cf2": "getCurrentDukePaid(string)", +"ac5553ce": "phaseDuration()", +"ac5555aa": "initialized(bytes32)", +"ac562666": "freezeCoin()", +"ac566953": "getInfra(uint256)", +"ac56c52b": "makeDealForTwo(string,uint256)", +"ac56f980": "setRealseTime(uint256)", +"ac570411": "getRecipientBalance()", +"ac588536": "delayPayout()", +"ac5895f6": "getSoilHumidityControlLimits(bytes32)", +"ac591e40": "SelectOne(uint256,uint256,uint256,uint256,uint256,string,address)", +"ac592944": "SendPreReserved2()", +"ac59eeeb": "recoverAddressFromWithdrawMessage(uint256,address,uint256,bytes)", +"ac59f0d9": "addToken(address,address,string)", +"ac5aaa5b": "toToteLiquidatorWallet()", +"ac5b3998": "assignLockedBalance(address,uint256)", +"ac5b3dbb": "Michael1011Token()", +"ac5c8535": "storeData(bytes)", +"ac5c867c": "sendCrowdsaleBalance(address,address,uint256)", +"ac5c915f": "burnBonuses()", +"ac5ce03b": "marriageProofDoc()", +"ac5cf934": "usdSeasonAccountRef(uint16,address)", +"ac5cfc3d": "getMsgWaiting(uint256)", +"ac5d2dbf": "typeToken()", +"ac5d51cb": "setAdministrator(address,address,bool)", +"ac5d67e9": "lockAdvisorsTokens()", +"ac5d8745": "voteWithSpecifiedAmounts(bytes32,uint256,uint256,uint256)", +"ac5ddf80": "modify_bool(bool)", +"ac5e7977": "receiverThree()", +"ac5e81a9": "historyPayout(address)", +"ac5ec9ef": "setAcceptPayment(bool)", +"ac5f91a0": "previousMinters()", +"ac6068b5": "isNotExpired()", +"ac60a6cd": "payInvoice(uint256)", +"ac60bbca": "userTokenStats(address,address)", +"ac60c969": "canFirstMint()", +"ac60da79": "TOKEN_SALE3()", +"ac61e92b": "createBet(uint256,uint256,uint256,uint256,bool)", +"ac624f52": "crowdSaleToken()", +"ac62ddb2": "validateMigrationIsPending(string,string)", +"ac62e250": "CertificationSet(string,address,uint256)", +"ac63208d": "SPRToken()", +"ac637c7a": "delegateTo(address)", +"ac64198b": "RSPLT_G()", +"ac6456df": "_betFailure(string,uint256,bool)", +"ac646629": "viewTokenBalance(address,address)", +"ac646756": "pause2()", +"ac656636": "getDepositReceipts(address,int256,uint8)", +"ac65b258": "PresalePool(uint256,address,uint256,uint256)", +"ac66777f": "multiCallTightlyPacked(bytes32[])", +"ac67857e": "ArtsCoin()", +"ac697fb5": "SkySwapToken()", +"ac69c09c": "changeVotingRules(address,uint256)", +"ac6a2b5d": "_withdraw(uint256)", +"ac6a4d6a": "fooInt()", +"ac6a602f": "getCompte_34()", +"ac6af280": "setRates(uint256,uint256)", +"ac6b02c4": "IFCC()", +"ac6b8e00": "transferLock(address,uint256,bool)", +"ac6bc853": "startSpin()", +"ac6c5251": "getWeight(address)", +"ac6d0316": "performUpdateCallPtr()", +"ac6d0fed": "nestedFirst(uint256)", +"ac6d8150": "getPayment(uint256,string)", +"ac6da90d": "qwercoin()", +"ac6e1237": "CrowdsaleEndedSuccessfuly(uint256,uint256)", +"ac6e2db6": "tokenCreationCapOne()", +"ac6ebb28": "CioCoinERC26Token(uint256,string,string,uint256)", +"ac6ee852": "newGanToken(uint256)", +"ac6eead3": "team_token_percentage_total()", +"ac6fe0ed": "Batchdrop(address)", +"ac700665": "getOrdersForBuyer(address)", +"ac700e63": "pauseMigration()", +"ac708f0c": "getProjectedBlockHash(uint256)", +"ac70a1ef": "getTreasures()", +"ac70e6c4": "level_9_percent()", +"ac71045e": "getOffer(address,uint256)", +"ac711cbb": "withdrawEtherAll()", +"ac71abde": "addAccounts(address[])", +"ac72200d": "getMinted()", +"ac72c120": "hasReverse(bytes32)", +"ac72cd7e": "BrokerInt(address)", +"ac73e97e": "lastMiningTime()", +"ac74bcde": "defaultNumberJuror()", +"ac74f2a8": "Bothereum(uint256,string,string)", +"ac767539": "testFailItemStoreNotRegistered()", +"ac76a499": "clientsAverageRating(address)", +"ac76fbf1": "GeoGame()", +"ac7709bc": "setTimedTransfer(uint256,uint256)", +"ac778b8f": "createCertificate(string,string,string)", +"ac77eb8e": "ZingToken()", +"ac781fbe": "TrustTokenERC20(uint256,string,string)", +"ac789e5f": "BlindAuction(uint256,uint256,address)", +"ac78dc16": "payTeam()", +"ac793a60": "createBet(uint256)", +"ac798bd3": "calculateArtCoinSupply()", +"ac798def": "set_sale_arbits_sold(uint256)", +"ac79a4b1": "getCreateMarketCreatorValue()", +"ac7a1b5b": "maxWithdraw()", +"ac7a722e": "updateETHPriceInCents()", +"ac7a95d5": "getNewShroom(uint256)", +"ac7b663a": "_settleInterest()", +"ac7b986f": "lotusWallet75Pct()", +"ac7bb2b4": "removeFromWhiteList(uint8,address)", +"ac7cda53": "changeRegisterBot(address)", +"ac7dce1d": "BsPresale_SNOV(address,address,uint256)", +"ac7e1e0a": "setEtherProceedsAccount(address)", +"ac7f0c48": "calculateWin()", +"ac7f9329": "AUTH_SETMINTAMOUNT()", +"ac7fc263": "multipliers(uint256)", +"ac7ffae3": "updt(uint256,string,uint256,uint256,string,string,address)", +"ac800b32": "transferCanaryOwnership(address)", +"ac82239f": "enableInvite(string,bytes32)", +"ac824fd9": "SHEX(uint256,string,uint8,string)", +"ac8261c9": "optionProgram()", +"ac828200": "_dlgtRet(uint64)", +"ac833fd9": "test_insert_findWithHintNextUpdateHead()", +"ac838774": "addauction(address,uint256,uint256,uint256,uint256,uint256,string,string)", +"ac8388a5": "callthis()", +"ac83ae55": "GAMEToken()", +"ac83e891": "BokkyPooBahsAutonomousRefundathonFund()", +"ac84ed4f": "TronClone()", +"ac856216": "setNumRewardsForTMEUser()", +"ac860a59": "_signPropertyByAgent(address,address,bytes32)", +"ac8641ee": "updateRefundWalletAddress(address)", +"ac8648a2": "mintFeeTokens(int256,uint256)", +"ac869cd8": "setFrozen(address,bool)", +"ac884902": "setResults(bytes32[])", +"ac8860b9": "ProposalExecutedEvent(uint256)", +"ac88c8d8": "verifyAndLiquidate(address,address,address,uint256,uint256,uint256,uint256)", +"ac88ffb2": "feeWithdrawEthAmount(uint256)", +"ac890c4c": "unsetAllowedMultivest(address,address)", +"ac8a2af0": "updateShareholders(address)", +"ac8a584a": "removeOperator(address)", +"ac8aa236": "batchTransferVIP(address[],uint256[])", +"ac8aea24": "transferUnsoldToken()", +"ac8c5e8e": "buyLong(address[2],uint256[3],uint8,bytes32[3])", +"ac8d6030": "removeRequest(address)", +"ac8d6632": "addMasterNodes(address,uint256,uint256)", +"ac8dc6ea": "_decodeData(bytes)", +"ac8e88c2": "_updateSolvency(uint256)", +"ac8f539b": "emergencyDrain(address,uint256)", +"ac8fa644": "transfer_Same_Amounts_of_assets_to_many_addresses(address[],uint256)", +"ac8fbd09": "UpdatePoolTarget(uint256)", +"ac900c2d": "unregisterSeller(address)", +"ac92f4ae": "calldatacpy(uint256,uint256,uint256)", +"ac92fdb5": "getSaleDate(bytes16,uint256)", +"ac940823": "betOnLowHigh(bool)", +"ac957954": "transferDonations(bytes32,address)", +"ac95a2aa": "_createOriginalPainting(uint256,uint256,uint256)", +"ac95be9b": "testico()", +"ac9630fa": "publishGraduatingClass(string)", +"ac964f21": "numProducts()", +"ac9650d8": "multicall(bytes[])", +"ac9663a6": "approveByC(uint256,string)", +"ac96a0b3": "GYG()", +"ac96c65e": "doCancel(bytes32)", +"ac96f981": "authorizeAccess(address,int256,address)", +"ac978cea": "TeamHOMO()", +"ac979688": "transferAnyERC20TokenToBeneficiary(address,address,uint256)", +"ac97ad89": "getTokensFromAddressReturns(address,address)", +"ac985f0a": "townsSold()", +"ac9873c7": "CanaryV7()", +"ac988bdc": "_getStageIndex()", +"ac991b65": "double_blind_sha256(string,address,address)", +"ac996e7e": "resolvePledging()", +"ac99aa69": "recoverEthers()", +"ac99e0aa": "BitImageToken()", +"ac99f7b7": "_setStages(uint256,int256)", +"ac9a252a": "ownershipTransferred(address)", +"ac9a6515": "testTokenOwnershipAfterFinalize()", +"ac9b5671": "setVerifier(address,bool)", +"ac9b5c30": "getCreateMarketfeePerEthInWeiValue()", +"ac9c3b7a": "TokenTotal()", +"ac9c80af": "seed_additional_eth()", +"ac9cd354": "getTransferInfoCount(address)", +"ac9d7e0a": "raisevote()", +"ac9ef8a1": "changeMultisigs(address,address)", +"ac9f0222": "setState(bool)", +"ac9f2b7b": "callDeposit(address,address,uint256)", +"ac9f9d12": "FACHAINStandardToken(uint256,string,uint8,string)", +"ac9fd2b8": "nextLoanInterestRate(uint256)", +"aca00932": "calculateBaseTimeout()", +"aca15663": "transferToExchangeAddress(address,uint256)", +"aca19256": "_logRoundExtensionVolume(uint256)", +"aca233fd": "one_two(uint8)", +"aca31e61": "setEthPerToken(uint256)", +"aca34c11": "getPoolDetails()", +"aca62a5f": "convertAllOldTokens(uint256,uint256)", +"aca66aec": "DVIP()", +"aca67a8f": "getIsNFTAttached(uint256)", +"aca6bef7": "checkPolicy(uint256)", +"aca6fdf2": "getJobWorkerName(uint256)", +"aca7207a": "changeCoolDownTime(uint256)", +"aca7dcfe": "token_swap_supply()", +"aca7fdd4": "initialFunding(address,address,uint256)", +"aca867b3": "secure(address,uint256)", +"aca8dd6b": "test_threeInvalidEqString()", +"aca8e9dd": "setBillboard(string)", +"acaa78cd": "addTransferrer(address)", +"acaab181": "addSomeGas()", +"acab021c": "getTOS(address)", +"acab3e5d": "PricingStrategy()", +"acabbbc0": "getSlogan(uint64)", +"acabd1b9": "setFee3(uint256)", +"acac0b9f": "setMaxPerExchange(uint256)", +"acac9a9f": "undropped()", +"acad94ae": "humanStandardByteCode()", +"acada0d8": "SUNQToken()", +"acaf0278": "contractuallyOf(address,address)", +"acb02504": "getJobDescription(uint256)", +"acb02f7c": "VotePumpCoin0x()", +"acb09dde": "fechVoteNumForCandidate()", +"acb0bdc3": "isPolicyExist(bytes32)", +"acb10351": "setupDutchExchange(address,address,address,address,address,uint256,uint256)", +"acb1516f": "accreditationMember(address,address)", +"acb1e61f": "transferable(address)", +"acb2ad6f": "transferFee()", +"acb2d607": "TokenBet(address)", +"acb2fe3e": "checkBlackListAddress(address)", +"acb39d30": "tokenCreated()", +"acb3c073": "setSwap(address)", +"acb461df": "tavern(uint256)", +"acb5e570": "DepositClaimed(uint256,address,uint256)", +"acb62d7c": "clearConfig()", +"acb6a6aa": "_generateRandomNumber(bytes32,uint256)", +"acb6c69b": "setTrustedClient(address)", +"acb6ca94": "Nomid()", +"acb6e626": "ImageCoin(uint256,string,string)", +"acb6e9b1": "testControlItemStoreNotRegistered()", +"acb6f75c": "PreIco(uint256,address,uint256)", +"acb748e9": "RuletkaTestIo()", +"acb74e73": "canSaleInfo()", +"acb8726a": "distributeTax(uint256,uint256,uint256,uint256)", +"acb88986": "freeze(address,uint64)", +"acb894d2": "fint256(int256)", +"acb902f6": "secondHighestBid()", +"acb93f36": "ratePerHourInWei()", +"acb9656c": "setLockedTokens(address)", +"acb9d6f6": "getStageandPrice()", +"acbaed04": "TootyrTokenSale()", +"acbb471f": "EthermiumAffiliates(address)", +"acbb5759": "SetAction(address,uint256)", +"acbc272b": "newToken(string,string,uint256)", +"acbc3ff4": "keyFoundation()", +"acbc62ae": "TokitDeployer(address,address)", +"acbcabc0": "pantryT()", +"acbd9563": "buyPatent(uint16)", +"acbdb084": "RequirementChanged(uint256)", +"acbdb72c": "getSecondAdmin()", +"acbdea6c": "canUpdateBackWindowAdjustmentRatio()", +"acbe274d": "this_tablet_name()", +"acbf98a7": "endsWith()", +"acbfbaac": "getPOOL_edit_30()", +"acbfbd9e": "Unlock_Tokens(address)", +"acc02119": "DirectDemocracy()", +"acc05ccc": "AddressProxy()", +"acc0a246": "uint256At(bytes,uint256)", +"acc10f11": "collect(address,uint256,uint256)", +"acc12168": "on_block()", +"acc2508b": "payoutNow()", +"acc32da3": "validateIpfsDoc(address,uint256,bytes)", +"acc3b363": "ContractBHVC()", +"acc3c020": "investorsToWithdrawIter(uint256)", +"acc3e283": "test_insert_empty()", +"acc3e5d9": "deathFactor_ii()", +"acc58d24": "_removeStackholder(address)", +"acc5a0dc": "GetPrize()", +"acc68b2c": "usersRef(address)", +"acc69261": "addCompany(address,uint256)", +"acc79f74": "openMail(uint256)", +"acc7f8a8": "getCurrentDatetime()", +"acc823f8": "getSurname()", +"acc88c0d": "decayedBalanceOf(address,address)", +"acc8cb18": "pushTerm(string)", +"acc907a9": "getWinner(address,uint256)", +"acc9138e": "revealBid(bytes32)", +"acc9383a": "dist_privateSale(address,uint256)", +"acc93c9e": "setBonusThresholds(uint256[],uint256[])", +"acc99bb7": "allUnKycedEth()", +"acca2c24": "getFirmFromAuthority(address)", +"acca92e0": "finalize(uint32,bytes32)", +"accb2677": "createCarsTokens()", +"accb4219": "RISHABHToken(address,address)", +"accbdfd0": "IsDistribRunningFalg_()", +"accc4a61": "setPresaleOpeningClosingTime(uint256,uint256)", +"accd932b": "icoClosedManually()", +"accd962b": "tokensaleContributors(uint256)", +"acce4b10": "crowdsaleTargetReached()", +"accf80a4": "RelaunchedCrowdsale(address,address,uint256,uint256,uint256,uint256)", +"accf878a": "ActionPresell(address)", +"accfa48b": "changeRelease18m(address)", +"accfaeba": "LEGAL_EXPENSES_1_TOKENS()", +"acd00a5c": "fillAmount()", +"acd00dc1": "_emitCountryCodeChanged(uint256,uint256,uint256)", +"acd02c30": "disburseToken(address,address[],uint256[])", +"acd04c4c": "_setVersion(uint256)", +"acd105d1": "doomsday()", +"acd19170": "getarg_2()", +"acd1bdb4": "updateMinimumContribution(uint256)", +"acd256db": "setOraclizeBytes(uint256)", +"acd2988c": "setValidBwMarketCaller(address)", +"acd2e875": "refferedBy(address)", +"acd3057a": "jishituihuan(address,uint256)", +"acd3c39f": "frozenAccount(address,bool)", +"acd47b3a": "addAuditOrEvidence(bool,bytes32,uint256,bytes32,uint8,bytes32,bytes32)", +"acd47bc3": "COMMUNITY_BOUNTY_STAKE()", +"acd47e97": "TokenPurchase(address,address,uint256,uint256,bool)", +"acd485fe": "Balicoin()", +"acd4bca6": "vanbexTeamSupply()", +"acd4e110": "Amorcoin()", +"acd4e4aa": "SilverFiftyToken()", +"acd590d3": "preSale2Finished()", +"acd5b7b9": "stopAt()", +"acd5fb23": "isZero(int256,string)", +"acd6a40a": "testUntil()", +"acd6f096": "testThrowsIfSaleIsNotTokenController()", +"acd782b1": "setProtectionPrice(uint256)", +"acd78e3a": "getPayIdAndHeld(uint256)", +"acd84e24": "PLN()", +"acd9277f": "market_DeclareForSale(uint256,uint256)", +"acd94ccb": "frozenDaysForICO()", +"acd9930b": "setHoverText(uint256[2])", +"acd9fd65": "fun1(uint256)", +"acda01f6": "setPendingWalletFee(address,uint256)", +"acda28a1": "bacFund()", +"acda3e10": "UpdateEtherPriceNow()", +"acda6737": "TADPOLE_BOOST()", +"acdaa0d2": "payout(uint256[],address[],uint256[])", +"acdba7c2": "contract_num()", +"acdba91f": "setTokenExpectedFee(address,uint256,address)", +"acdc42f3": "failICO()", +"acdd1454": "mint(uint256,string,string,string)", +"acdd9c5c": "SetRegistrationContract(address)", +"acddb63c": "requestMortgage(uint256[6],string,uint256,uint8,bytes32,bytes32)", +"acddbe1c": "someFunction3()", +"acde39d9": "c4cfee()", +"acdeb5b9": "tokenApprovals(uint256)", +"acdec908": "getBetIdAtRound(uint256,uint256)", +"acdf4f18": "buyBack()", +"acdf67b3": "blockWithdrawBegin()", +"acdf7362": "setLock(address,address,uint256,uint256)", +"acdfa0ac": "acceptNameTranfer()", +"acdfb350": "hariKari()", +"ace1ed07": "get_creator()", +"ace1fab1": "withdrawReserve()", +"ace237f5": "pep()", +"ace30883": "absMinFee()", +"ace36da2": "setChain(address,address,address)", +"ace4283b": "getSecondsToExpiration()", +"ace45552": "endICOStage6()", +"ace51abc": "helperVerifyHash__(uint256,int256,int256[],int256,uint256,int256,int256[],int256)", +"ace523c4": "createReferendum(string,string,uint256,uint256)", +"ace80e0d": "bytesMemoryArray()", +"aceaa365": "_creditTo(address,uint256)", +"aceb87e1": "getUserBio(string)", +"acec0e1d": "setconf(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"acec338a": "setActive(bool)", +"acec460f": "tokenDataValue(uint256,uint256)", +"acec488d": "setAnnouncement(string)", +"aced1661": "keeper()", +"aced5935": "getConfig(address,string)", +"acedc33e": "setDecrementOpenInterest(bool)", +"acee57e1": "airDropPayableMoney()", +"aceecbc8": "disableSelling()", +"acef193e": "FundingCompleted(uint256,uint256)", +"acef6037": "transferToAddress(address,uint256)", +"acefb7bd": "JudgmentCoin()", +"acefd330": "createRandomNumber(uint256)", +"acf0dd57": "getRegionUrl(uint256)", +"acf197b1": "IcoRunnedManually()", +"acf1b06a": "systemCreatedCount()", +"acf1e9fa": "buyNinja(address)", +"acf2f478": "changeTradableFciInSession(bool)", +"acf3508e": "_isLatitude(int256)", +"acf36037": "getCountryData(uint256)", +"acf36e53": "addParent(address)", +"acf372ef": "SetMasterWallet(address)", +"acf400b2": "getSellOrdersBlackMarketComplete()", +"acf4280c": "buildDSApprovalDB()", +"acf50f55": "setItemForSale(uint256,uint256)", +"acf555b8": "regReferrers(address[])", +"acf5c689": "setRequiredBlockConfirmations(uint256)", +"acf5cfbf": "Spend(uint64,address,string)", +"acf67746": "getPlayerTeam(address)", +"acf6d918": "ChangeReturn(address,uint256)", +"acf7aea7": "getCountryLimit(uint256)", +"acf7c1d2": "updateJackpotBalance()", +"acf8bf2a": "channelCount()", +"acf94ed5": "fallbackTriggered()", +"acf975d6": "addCycleAddress(address)", +"acf97a65": "redistribute(address[])", +"acfabbe4": "updateCurrentPeriod()", +"acfb153d": "RoundTime()", +"acfb208b": "transferFee(uint16,uint64,address)", +"acfb2d95": "iHaveABiggerDick(string,string)", +"acfb4b26": "DIVIUMx2()", +"acfd18c6": "FOUNDATION_ADDRESS()", +"acfd35a0": "distributeSuccessfulCampaignEth(uint256)", +"acfd82f2": "grantOwnership(address)", +"acfdfd1c": "deploy(uint256,string,string,address)", +"acfe27d7": "Slashing(address,uint256,bytes32)", +"acfe711a": "Scientific()", +"acff2fce": "forceNSFW(uint256,bool)", +"acfff377": "rollDice(uint256)", +"ad00129e": "bonusOver100ETH()", +"ad00297a": "payDeposit(address,uint256,bytes)", +"ad003aeb": "setUserNotifications(address,address,bool[],bool,uint8[],uint8)", +"ad009062": "newVitaReward(address)", +"ad0096af": "transferFromWithCustomReserving(address,address,uint256,uint256)", +"ad01ed4c": "s3(bytes1)", +"ad0212df": "capitalNeeded()", +"ad0254a6": "BitGuildWhitelist()", +"ad03261e": "supportRebalance()", +"ad03abc5": "enableRealCap(uint256,uint256)", +"ad044f49": "totalFunded()", +"ad04592e": "owner_deposit()", +"ad04d74d": "buyCoreWithBalance(address,address,uint256)", +"ad0570c7": "setUsernameForAddress(bytes32,address)", +"ad07008f": "icoDiscountPercentageLevel2()", +"ad07220f": "forceTransferBalance(address,address,uint256)", +"ad075684": "TotalPayment()", +"ad0767bd": "RECORDPart()", +"ad076994": "verify(address,address,uint256)", +"ad076bfc": "debug_hash256Double_concat(bytes,bytes,bytes)", +"ad09019d": "oraclize_getNetworkName()", +"ad09202a": "confirmDealCompletionByDoctor(bytes16,bool)", +"ad093409": "getTicketOwner(uint256)", +"ad0a58c8": "checkAndDeclareWinner(uint32)", +"ad0a6cc3": "attackTileForExistingUser(uint16,uint256,bool)", +"ad0af8c8": "MariamTestCoin()", +"ad0b2bec": "redeemWinnings()", +"ad0b38a2": "getAppId(string)", +"ad0b6013": "DEFAULTED_STATUS()", +"ad0bc739": "testConcatMemoryZeroLength()", +"ad0be174": "zHQNumber()", +"ad0c3dff": "icoStartedAt()", +"ad0d3713": "getTittyOwner(uint256)", +"ad0d4c3d": "HaiWang(uint256,string,string)", +"ad0dd79f": "usersWithdrew()", +"ad0e053b": "getPointerOwner(uint8)", +"ad0e13bb": "toB32(bytes,bytes,address)", +"ad0e8bc7": "givepoints(address,uint256)", +"ad0e9053": "set_pauseReturn(bool)", +"ad0f2916": "coinPrice()", +"ad108280": "BECTStandardToken(uint256,string,uint8,string)", +"ad1088e4": "didProve()", +"ad111feb": "DFSToken()", +"ad11cc1d": "claimC1()", +"ad11fe44": "revokeAllowance(address)", +"ad121e33": "fundFounder()", +"ad1288c8": "forkTransferFrom(address,address,address,address,uint256)", +"ad12cc0b": "removeLibrarian(address,address)", +"ad13eb02": "createScanner(uint256)", +"ad150aec": "calculateHeldTokenDistribution()", +"ad156d34": "AllocateBountyAndEcosystemTokens(address)", +"ad166aae": "MyTest(uint256,string,uint8,string)", +"ad180328": "_check(address,address,uint256)", +"ad188be0": "userBetContribution(address)", +"ad1892b2": "sendEthersToRefundAddress(address)", +"ad1896db": "resetElectionPeriod()", +"ad18ad0c": "quote(address,uint256,address)", +"ad1922b0": "setIcoCloseTime(uint256)", +"ad19bd26": "getVoteCommit(uint256,address)", +"ad19e993": "_callSender(bytes32,address,address,address,uint256,bytes,bytes)", +"ad1a17b4": "getPaymentCount(uint256)", +"ad1a38be": "_createNarco(string,string,address)", +"ad1a7d0c": "getBook(bytes32)", +"ad1aa252": "withdrawUnsentTokensForOwner()", +"ad1b1f8b": "settleJackpot()", +"ad1b3909": "coinage()", +"ad1be7c1": "softCapClose()", +"ad1c582a": "divUIntValue(bytes32,uint256)", +"ad1c5d6c": "updateShareCrystal()", +"ad1c61fd": "test(uint256,string)", +"ad1d0dcf": "exodus()", +"ad1def42": "registeredAddress(address)", +"ad1ef61e": "donkeyInvested(address)", +"ad203bd4": "subMonths(uint256,uint256)", +"ad207feb": "ethTeamWallet()", +"ad217ae5": "stats(uint256)", +"ad220cf1": "currentPrivateSale()", +"ad221195": "transferTokenFrom(address,address,uint256)", +"ad221321": "withdrawTimes(address)", +"ad22453c": "BRANDS()", +"ad226122": "presaleFallBack(uint256)", +"ad22980a": "TopChainCoinMintFinished()", +"ad22ccc0": "committeeJoinVoters(address,address)", +"ad22d4a2": "get_last_item_in_state(bytes32)", +"ad2334a0": "spinnerModulus()", +"ad2377c1": "pausePriceRaise()", +"ad23ad92": "AfriHealthCoin()", +"ad23de63": "isAddressWhiteListed(address)", +"ad23e038": "HelloToken(uint256,string,uint8,string)", +"ad23fdc3": "deCompose(string)", +"ad23fde0": "breed(uint256[2],uint256[2],uint256)", +"ad247dd9": "permissonedAccounts(address)", +"ad24d512": "TECHNOBITToken()", +"ad25ce57": "bidOnSaleAuction(uint256)", +"ad266df8": "ARA(uint256,string,uint8,string)", +"ad26f6e1": "SetParticipantName(address,address,string)", +"ad27b14d": "cancelBet(bytes16)", +"ad28ff88": "blacklist(address,address)", +"ad295b26": "getDepositInstanceCount()", +"ad29ca6d": "eosCrowdsaleAddress()", +"ad29ddaa": "removeRound(uint256)", +"ad2a0a7b": "_changeEternalStorageContractAddress(address)", +"ad2a39d6": "secondStartTime()", +"ad2a9c5f": "MIN_CARD_PRICE()", +"ad2af501": "Games(uint256,string,uint8,string)", +"ad2b14d1": "changeCrowdsale(address)", +"ad2b1e03": "privilegedBurn(uint256)", +"ad2b260a": "decimalNum()", +"ad2b3037": "getLeaves()", +"ad2ba325": "splitStr2Int(string,string)", +"ad2bb1b3": "blockAddress(address)", +"ad2bbf9c": "_redeemByTranche(bytes32,address,address,uint256,bytes,bytes)", +"ad2c1632": "ArenaplayToken()", +"ad2d10b2": "initializeReservedVault(address)", +"ad2da239": "calculateVote(uint256,uint256,uint256)", +"ad2daa48": "roundTimeRemaining()", +"ad2de16d": "acceptTxTask(uint256)", +"ad2e1d49": "getHeirachy(bytes32)", +"ad2e6aff": "WithdrawEarnings()", +"ad2e8c9b": "getDuration()", +"ad2ec740": "PRICE_9()", +"ad2fad33": "setSpawnProxy(uint32,int256,address)", +"ad2fea7c": "removeMinter(int256,address)", +"ad317c23": "mileagePointPrice()", +"ad319bab": "TokenERC20AC(uint256,string,string)", +"ad31e845": "_tag(uint256,string)", +"ad3286fc": "AddToken(address,uint8)", +"ad32a40f": "Fund(address,address,address,address,address)", +"ad32f925": "makeAvailable()", +"ad3335b5": "setINNBCTokenAddress(address)", +"ad33513f": "refundAmount()", +"ad33e21d": "getReferralBonus(uint256)", +"ad3429be": "developmentTokens()", +"ad344465": "AccessorySeriesCollection(uint8)", +"ad344bbe": "sgtExchanger()", +"ad35bdb0": "extraSupply()", +"ad35dcd3": "AGAVE(string,string)", +"ad36c593": "getOwnerOfCampaign(bytes32)", +"ad3704c5": "getApplicantsLength()", +"ad374f5b": "enableClaimTokens(bool)", +"ad376113": "addDevReward(uint256)", +"ad379089": "canSettle(bytes32)", +"ad37c41b": "blackListEnabled()", +"ad381cb7": "getCurrentRoundIsActive()", +"ad38867e": "checkWinner()", +"ad388896": "setWinnerAndEndEvent(bytes32,bool,string)", +"ad389d5d": "isValidAdversary(uint8,uint8)", +"ad38bf22": "updateBlacklister(address)", +"ad38d6f1": "whitelistWallet()", +"ad38fba5": "transferEthTo(address,uint256)", +"ad395939": "withdrawContributorPot()", +"ad395ad3": "removeFromContractIDArray(address)", +"ad3a05ca": "BlackToken()", +"ad3b1b47": "withdrawFees(address,uint256)", +"ad3bf1f1": "refundPeriodOver()", +"ad3c0b9d": "CROWDSALE_DURATION()", +"ad3c8b22": "addSkipPrice(uint256)", +"ad3c901c": "getPendingById(uint256)", +"ad3cd883": "changeContractName(string)", +"ad3cf852": "redeemLuckPool()", +"ad3de14c": "getMap()", +"ad3e0ed2": "getAffiliateSenderPosAmount(uint256)", +"ad3eb71f": "plcrFactory()", +"ad3ef46d": "RealstateOceanProject1(address)", +"ad3f972e": "deleteChild(address,address)", +"ad3ff3c1": "houseAlwaysWins()", +"ad401842": "setDateMainStart(uint256)", +"ad40256f": "reclaimableOwner()", +"ad418e66": "strategicReserveSupply()", +"ad41b628": "MHCToken()", +"ad447a19": "getBalanceDB()", +"ad449198": "returnBorrower(uint256)", +"ad4493fe": "checkPoint(uint8,int256,uint16)", +"ad44c205": "Nudge()", +"ad44e73b": "unwhitelist(address[])", +"ad450b72": "SupplyLimitChanged(uint256,uint256)", +"ad452254": "BsToken_SNOV()", +"ad459a1c": "CurrentAirdropped()", +"ad468489": "register(bytes32,address,bytes32,bytes32,bytes32)", +"ad470886": "token_approve(address,address,uint256)", +"ad4749f4": "setupPeriodForFirstStep(uint256,uint256)", +"ad474b9a": "Engraved(address,string,string,bytes32)", +"ad475113": "PRESALE_BONUS_VOTING()", +"ad478dda": "investmentUpperBounds()", +"ad483188": "setCCH_edit_12(string)", +"ad48636a": "secondBonusSalesEnds()", +"ad487790": "reveal(bytes32,address)", +"ad487f3c": "LogFreeze()", +"ad48d611": "marketToken()", +"ad4946ee": "removeAddressFromNonzeroBalancesArray(uint256,address)", +"ad498ce1": "RATE_NO_DISCOUNT()", +"ad49f595": "checkAddress(address,address)", +"ad4a7bd9": "lockTokensForAs(address,address,address,address,address,address,address,address,address)", +"ad4ac3de": "LoveCoin()", +"ad4b243b": "buyOneMinuteLottery(uint256,uint8[],address,bool)", +"ad4b2ca4": "batchdrop(address[],uint256[])", +"ad4b558c": "monsterIndexToOwner(uint256)", +"ad4c05f1": "setResourceForStar(uint8[5],uint16[5],uint32[5])", +"ad4cd0d6": "stdlib()", +"ad4dde0f": "transferOwnershipOfItemsStorage(address)", +"ad4e2f77": "addDragon(address,uint256,uint256)", +"ad4e39f3": "getLendingItemInfo(address,uint256)", +"ad4f0e3a": "DevsmartCoinFive()", +"ad50039f": "setTechBonus2(uint256,string)", +"ad5022a5": "Votes()", +"ad506098": "WowMusicDiamondToken(address)", +"ad509c1d": "sendToken(address[],address[],uint256[])", +"ad50dd1f": "endPrivateSaleStage()", +"ad53322b": "donationAmountInWei(address)", +"ad534d9c": "logCoinAgeRecord(address,address,uint256,bool)", +"ad53be1d": "priceLeRT()", +"ad544dcb": "testSetNotUpdatable()", +"ad549e53": "set_participant_arbits_kyc_whitelist(address,bool)", +"ad5511a5": "_setTokenSeed(uint256,string)", +"ad559fd6": "setHigherPricePercentage(uint256)", +"ad562965": "getReceiptRoot(bytes32)", +"ad5632e6": "storeAuthenticity(string)", +"ad5688d8": "setCountryPicture(uint256,string)", +"ad5780af": "clearDNSZone(bytes32)", +"ad57a2df": "unrestrict()", +"ad57ceb4": "ethForMilestone()", +"ad58a7d2": "getSettingState(uint256)", +"ad59ffd1": "maxAmountBonus()", +"ad5a157d": "promoMoney()", +"ad5a8f29": "canEnterPool(address,uint256)", +"ad5b7189": "hasBooster(address)", +"ad5b896e": "refundMany(address[],uint256[])", +"ad5bfcb5": "getServiceStatByAddr(uint64,address)", +"ad5c1687": "offchainUpload(address[],uint256[])", +"ad5c4648": "WETH()", +"ad5c613d": "purchase(bytes)", +"ad5cd9e7": "startSTO()", +"ad5d2862": "getWinnings(uint256)", +"ad5d638d": "minFundedValue()", +"ad5dabb0": "assertYoungerBalance(uint256,uint256)", +"ad5dabca": "QatarCoin()", +"ad5e2cd0": "addPresale(address,uint256)", +"ad5e46cb": "hasError()", +"ad5f3433": "sumHardCapICOStage4()", +"ad5fb2b1": "seedVerification(string)", +"ad60540b": "MoccaCoin()", +"ad605729": "getParticipantCount()", +"ad606c72": "devWithdraw()", +"ad60fb73": "mint(string,uint8,string)", +"ad615f40": "getCrosCounter()", +"ad621b14": "BaoMaToken()", +"ad622d0e": "addDoctors(uint256,uint256,string)", +"ad62bda5": "setRoundLength(uint32)", +"ad62f1ca": "mintFor(uint256,address)", +"ad631abe": "BLO_PER_WEI()", +"ad63a469": "totalUsedTokens()", +"ad64ae4b": "registerModule(address)", +"ad64fa5c": "MINBET_forORACLIZE()", +"ad652cdd": "InternetMarket()", +"ad655998": "addAuthorizedInsertAgent(address)", +"ad65d76d": "ethToTokenTransferInput(uint256,uint256,address)", +"ad66de24": "impl_lock4Dividend(address,uint256)", +"ad66e52a": "etherBalance()", +"ad677d0b": "join(bytes32)", +"ad686011": "returnPurchase(address)", +"ad68ebf7": "migrate(address,uint256)", +"ad69644b": "setBestAngel(uint32)", +"ad69caa5": "expMod(uint256,uint256,uint256)", +"ad6a0546": "creatorsLocked()", +"ad6ad449": "HodlerMining()", +"ad6aefbb": "BeatTokenPreIcoStarted()", +"ad6b2c90": "getListTokens(address,uint256,uint256,uint256)", +"ad6b5d04": "amountClaimed()", +"ad6b9499": "getContactRecord(string)", +"ad6c8762": "paymentChannelsCount()", +"ad6cd14e": "EthLongExercised(address[2],uint256[8],uint256,uint256)", +"ad6d9b89": "bytetherOVAddress()", +"ad6dfe5c": "getPRewardId(address,uint256)", +"ad6e155e": "setContractPreICO(address)", +"ad6eba9f": "getSingleSubjectByAddress(address,uint256)", +"ad6eff22": "getUserType(address,address)", +"ad6f80ff": "getSignatures()", +"ad70810a": "getChainDrawings(uint256)", +"ad70924a": "stablize()", +"ad70fbc8": "QuickChain()", +"ad714012": "calculateMatchOutcomesForRoundId(int256)", +"ad71766e": "getWeiSoldToday(address)", +"ad717e8c": "_oraclizeQueueRound()", +"ad71a1fd": "MAX_SUPPLY_OF_TOKEN()", +"ad71c687": "registerSystem(string,string,string,string)", +"ad71ec8a": "YiWenTest(uint256,string,string)", +"ad7222c1": "tokensAmountFrom(uint256)", +"ad723faa": "MChip()", +"ad72dce9": "buildFactory(uint8,uint256)", +"ad731de7": "createPromoCollectible(uint256,address,uint256)", +"ad732eea": "send(bytes20[])", +"ad738845": "payVATToGovernment(uint256,uint8)", +"ad7411e1": "CreateNertia(address,uint256)", +"ad7430cc": "RECEIVER()", +"ad74f9bc": "calculateCurrentPrice(uint256)", +"ad7554d9": "setDoubleRewardEndTime(uint64)", +"ad76325f": "finishProposalVoting(uint256)", +"ad7639fe": "TokenPurchase(address,address,uint256,uint256,string)", +"ad76423e": "DelphiToken()", +"ad764780": "OpenController(address)", +"ad7738b6": "MAX_TOTAL_ADOPTED_AXIES()", +"ad78dc8e": "totalWannaBuyAmount()", +"ad78f31a": "ticketStringFromAddressBytes(bytes32,address)", +"ad796b5d": "TOKEN_SUPPLY_AIR()", +"ad79c927": "TokenSwap(address,address,address)", +"ad7a14e1": "tokenRemainPublicSale()", +"ad7a5ff9": "autoDistributionViaETHContributions()", +"ad7a672f": "totalBalance()", +"ad7b09c5": "InitIcoController(address)", +"ad7b6884": "editContributors(address[],uint256[],uint256[])", +"ad7b6cb5": "bountySEEDSinWei(address[],uint256)", +"ad7bafc7": "mint(int256,address,uint256,uint256)", +"ad7bfd2d": "Cashchain()", +"ad7c66d0": "sellAllMilk()", +"ad7d59fc": "checkPlace()", +"ad7df080": "consul()", +"ad7e01c8": "wolkGenesis(uint256,uint256,uint256,address,address)", +"ad7e262c": "hasEmployerMinRatingsCount(address,address,uint256)", +"ad7e74f9": "addJobSkill(uint32,bytes32)", +"ad7e7cfc": "UpdateMaintenance(bool)", +"ad7ead58": "walletLock()", +"ad7eb560": "block5()", +"ad7ed3c2": "executeLottery(address)", +"ad7ed923": "ElepigToken()", +"ad7eee9f": "updateInt256s(bytes32[],int256[])", +"ad7f02b5": "balanceOf(address[16],address)", +"ad7f401b": "creatorInited()", +"ad7f9d76": "getInvestorBuyers()", +"ad7fa43c": "settleFeeSecondPart(address,uint256)", +"ad7fadc5": "buy(address,address)", +"ad7fff7c": "hasWorks(bytes32)", +"ad8088a5": "XdacToken()", +"ad80a7b4": "totalUndistributedDividends()", +"ad80ef94": "tokenExchanges(uint256)", +"ad810fe5": "holderIndex(uint256)", +"ad818071": "showStats()", +"ad81cd90": "villagesSold()", +"ad81d6f3": "createDefaultLinglongCat(uint256,uint256,uint256,address,uint256,uint256)", +"ad81f3be": "Barneys4HackerSpaceToken()", +"ad82ae61": "internalDoubleTransfer(address,address,uint256,address,uint256)", +"ad82dcac": "testBlockhashCorrectFee()", +"ad838107": "_checkDestination(address,address,uint256,bytes)", +"ad83bfce": "GetOwner(string)", +"ad845d2d": "toBytes()", +"ad84e1be": "createTokenContract(address)", +"ad84e2a6": "getCrab(uint256)", +"ad84eaab": "minimumPurchaseAmount()", +"ad869e1a": "_batch3_icosaleEndTimestamp()", +"ad86c10d": "GamingCoin(string,string,uint8)", +"ad86ee0b": "passOnContract()", +"ad8718c2": "Create(uint256,uint256,uint32)", +"ad8733ca": "multisend(address,address[],uint256[])", +"ad879a46": "cancelBetByA(uint256)", +"ad886326": "_isSignedOwner(bytes32)", +"ad889f03": "USER_TIMEOUT()", +"ad88d8a5": "try_pay(address,bytes12)", +"ad88f53e": "setFirstStageEndsAt(uint256)", +"ad89e64b": "_updateLandData(int256,int256,string)", +"ad8a9c8e": "ownerSetOwner(address)", +"ad8ae3ae": "poke(address,bytes32)", +"ad8b4698": "COMETUBU()", +"ad8b6657": "_createDrone(address,uint256,bool,bool)", +"ad8c3cd2": "setTank(address)", +"ad8ce06b": "gasPerTx(bytes4)", +"ad8d36cb": "CCH_EDIT_2()", +"ad8d5f48": "exec(address,bytes,uint256)", +"ad8ead69": "createTeam(string,uint256)", +"ad8ed335": "__proxy(address)", +"ad8f5008": "strike()", +"ad8f905d": "PoolPrize(uint8,uint8,uint256,uint256)", +"ad8fccf3": "freezeMulti(address[],bytes32[],uint256[],uint256[],uint256[])", +"ad906661": "add_to_ico()", +"ad913633": "getOriginalOwner()", +"ad9171df": "getRemainingLimit(address,address)", +"ad92e46c": "getNumBettings()", +"ad93640f": "TRANSFER_PROXY_V2()", +"ad94d901": "ownsAll(address,uint256[])", +"ad9657f4": "createCoin(uint16,string)", +"ad966a03": "_bytes32ToString(bytes32)", +"ad973d74": "addCustomer(address)", +"ad976c3e": "setData_24(string)", +"ad979417": "setPoolName(string,uint256)", +"ad98ebaf": "ProjectManager()", +"ad994621": "answerDeliveryChallenge(address[2],uint64,bytes32[],uint256[],uint256[2],uint256[2],uint256,bytes32[3],uint8,bytes32[])", +"ad9a9f17": "SINGLE_BLOCK_LEN()", +"ad9abf32": "payDividends(uint256,uint256,uint256)", +"ad9ac1bc": "addToAllocationList(address,uint256)", +"ad9b4fc5": "Win(address,uint8,uint256,bytes32,bytes32,uint256,uint256)", +"ad9b8024": "price(address,uint256)", +"ad9bdebb": "isReleasable()", +"ad9c280f": "setLoveUrl(string)", +"ad9d4ba3": "depositEth(address)", +"ad9df055": "adminClaimAirdrop(address)", +"ad9e3e85": "My2Token()", +"ad9ec17e": "setGreyToken()", +"ad9f20a6": "MIN_PRICE()", +"ad9f9a68": "withdraw_unclaimed_balance(uint256)", +"ad9fb75e": "teamDate()", +"ada0114c": "Firstsale()", +"ada018e1": "setBurnFeeAbs(uint256)", +"ada0618a": "CATSPACE()", +"ada06dac": "tokenSaleCosts()", +"ada14698": "killSwitch()", +"ada199dd": "setFoundersTokensPercent(uint256)", +"ada1a34b": "resetVoteKindnessEvery()", +"ada1a8f7": "VUP_PER_ETH_ICO_TIER2_RATE()", +"ada1b74e": "finalTokensIssueTime()", +"ada1f3ad": "ReferralContract(address,address,address)", +"ada24dfc": "KeberuntunganAcak()", +"ada2cced": "getNumberSuppliers()", +"ada44092": "addClient(bytes32)", +"ada4c022": "getAvailableWinnings(address,address)", +"ada5ba01": "getNodeIndexId(bytes32)", +"ada5cf63": "initializedBlock()", +"ada636ce": "compareStages(string,string)", +"ada65728": "Funding_Setting_funding_time_end()", +"ada69935": "PonicsToken(string,string,uint8,uint256)", +"ada6b1d9": "collectedCent()", +"ada6e537": "AuctusBountyDistribution()", +"ada7061b": "add_hard_limit(uint256)", +"ada791f9": "Airdrop(address,uint256,uint256,address)", +"ada8938f": "moedaToken()", +"ada8a7d5": "presaleTotalNumberTokenSold()", +"ada8cfcd": "removeUint256s(bytes32[])", +"ada8e5ef": "IsCanAllotAward()", +"ada993ad": "Airdrop(address,uint256,uint256)", +"adaa19cc": "TGMtoken()", +"adaa3c73": "enableBets()", +"adaa730e": "RollDice(address,uint256,uint256,uint256)", +"adaaa1e1": "addThing(bytes32,string,bytes32,string)", +"adaabaaa": "bonusEndDate()", +"adabc7f8": "changeTransferStep(uint8)", +"adacb0fa": "CloseChannel(bytes32,uint8,bytes32,bytes32,uint256)", +"adaccd74": "getNickname(address)", +"adad1cb1": "VisperNetwork()", +"adad4873": "distributePresale(address[],uint256[])", +"adad6d50": "KujiraFund()", +"adad9c4e": "increaseMaxCap(uint256)", +"adadb11f": "setJotter(address)", +"adadc77f": "unown()", +"adae08dd": "createItem(uint256,uint256)", +"adaea0b9": "fund(address,address,bool)", +"adaf28d1": "whichPeriod(address,uint256)", +"adaf7c84": "PreICOStartTime()", +"adaf8c79": "chargeOn(address,uint256)", +"adb187bb": "validRequest(bytes32[],bytes5,address)", +"adb1ad42": "HelloGoldToken(address)", +"adb1cd73": "getUnpaid()", +"adb1f640": "getScore(uint256,bytes32)", +"adb27ded": "tokenBonusTimes(uint256)", +"adb2e02f": "internalRegisterCert(bytes32,bytes,uint256)", +"adb37277": "setWebsiteUrl(string)", +"adb3a3a6": "deadlineToFreedTeamPool()", +"adb42139": "totalCrowdsale()", +"adb44a32": "updateUint256(bytes32,uint256)", +"adb4af3e": "getLatestUpdate()", +"adb4d990": "assigned()", +"adb506a6": "FACTOR_5()", +"adb5735c": "withdrawFor(address,address)", +"adb5777c": "getDrawBlockNumberByWinner(address)", +"adb5a4f1": "ListReservePairs(address,address,address,bool)", +"adb5a54d": "eccVerify(bytes32,uint8,bytes32,bytes32)", +"adb5da34": "_getClientPaidUpTo(address)", +"adb610a3": "currentNonce()", +"adb67c41": "XiongDiLianToken(address,address)", +"adb6859d": "directorTransferShareRequired()", +"adb69560": "createController()", +"adb6e8f5": "GetDislikeCount()", +"adb6f63f": "commitments(address,address)", +"adb746dc": "bltOwned()", +"adb77576": "etherLeaked(uint256)", +"adb8249e": "increaseApprovalPreSigned(bytes,address,uint256,uint256,uint256)", +"adb848df": "NZD_Omnidollar()", +"adb88cb9": "totalSupplyIco()", +"adb9066e": "COLDITION()", +"adba54e0": "commandPercent()", +"adbc9bed": "getRestWhite(uint256,uint256)", +"adbd9753": "issuingTokenOwner()", +"adbda5a8": "voteToKickoffNewFiscalYear()", +"adbde797": "updateTrustRankAfterStoryExpiry(bytes12,bytes12[])", +"adbe2f6f": "abortive(uint256)", +"adbefffe": "getAddressBetsForEvent(bytes32,address)", +"adbf29fd": "getPlayerDataForGame(uint256,address)", +"adbf54b7": "initialBalanceForMarketingCampaign()", +"adc02a64": "addAsset(string,address)", +"adc042bf": "mint(int256,uint128)", +"adc06ccd": "batchDoubleBalances(address[])", +"adc128eb": "Today()", +"adc1463a": "ZLCC()", +"adc1b956": "lastClaimed()", +"adc1db89": "SpaceKIMToken()", +"adc1f702": "LanaCharleen8()", +"adc20b1c": "lastMint(address)", +"adc23f03": "canClientTerminate(bytes32)", +"adc29028": "calcAndSetPlayerTotalCanAccept(address,uint256)", +"adc2c98a": "edge()", +"adc38b2f": "iterateTurn(uint16)", +"adc4739a": "setWLAddress(address)", +"adc4f654": "ChargeEnergy(uint256)", +"adc54d30": "transferFromPresale(address,uint256)", +"adc6d49d": "_executeTransaction(uint256,address)", +"adc73d46": "getPlayersOfOwner(address)", +"adc7d448": "_clearAttackLog(uint256)", +"adc84a42": "SVEToken()", +"adc87956": "teamVestTokenAllocation()", +"adc8b4cf": "empowerAdmin(address)", +"adc8f941": "addExclusionFromTokenUnlocks(address[])", +"adc9772e": "stake(address,uint256)", +"adca32e7": "setFiscal(uint256,uint256,uint256,bytes32)", +"adca8ac6": "addToTransferWhiteList(address,address)", +"adcaea0a": "simulated_snt(address)", +"adcb0993": "LILE()", +"adcccb6f": "Obirum()", +"adcd2632": "saleTeamAddress()", +"adcd4aaf": "sendNegativeWhuffies(address,string)", +"adcd905b": "setListener(address)", +"adcde05f": "averageKimSalePrice()", +"adce1c5f": "ensResolver()", +"adce80d5": "mStopped()", +"adcf4831": "registerAuditOutcome(address,bytes32,bool)", +"adcf59ee": "isOwnerOrOps(address)", +"adcf780a": "disallowTransferBetweenUsers()", +"add052b4": "getStateFunding()", +"add08f87": "coinbaseAmount()", +"add1cbc5": "TOKEN_TRANSFER_PROXY_CONTRACT()", +"add2af69": "releaseLockedTokensByIndex(address,uint256)", +"add37100": "getOrderHash(address,uint256,address,uint256,address,uint256,uint256,address)", +"add3bf39": "manualTransferTokensToInternal(address,uint256,uint256,uint256)", +"add3fa39": "sharing_confirmed()", +"add40ced": "getKeyID(bytes20,uint8)", +"add43c59": "EtherTopDog()", +"add466a4": "chfCentsPerTokenWhileBonus()", +"add4bfb0": "createDragon(uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint16,uint16)", +"add4c784": "getResult(bytes32)", +"add54303": "setBlock(uint256,uint256,string)", +"add5eb02": "setAdminVariables(uint256,uint256,uint256,uint256)", +"add68daf": "amountOfBidders(uint256)", +"add7690b": "period0End()", +"add769a3": "POOToken()", +"add82871": "strEqual(string,string)", +"add84df3": "changeGoal(uint256)", +"add94f25": "IDAP(address,address,address)", +"add98c70": "dispute(bytes32)", +"adda1d4d": "receiveListing(bytes32,uint256,bool,address,uint256,uint256)", +"adda8cf4": "Propvesta()", +"addace62": "getYesVotes()", +"addad094": "VLOGS()", +"addb246b": "MIN_SITE_ID()", +"addb51ff": "monsterCreator()", +"addd5099": "oracles(address)", +"addd7020": "minWei()", +"adddbacb": "tokenSellCap()", +"adde36bb": "betEven()", +"adde61ef": "_isUpdateAuthorized(address,uint256)", +"added436": "sendFromFund(uint256,address)", +"addf0813": "withdrawERC20Balance(uint256)", +"ade05b35": "commissionType()", +"ade077e3": "Ecoin()", +"ade0e93e": "withdrawals()", +"ade2f939": "lookupAllSince(uint256)", +"ade342ab": "takeShitcoin(address)", +"ade4637a": "transferFrozen()", +"ade53c4e": "GenChipsLevel(uint256,bool)", +"ade5a328": "YYXToken()", +"ade5e07d": "test_1_validOwner_accessRestriction()", +"ade60e9a": "modifyOwner()", +"ade62d6f": "withdrawCommunityFunds()", +"ade645fa": "bonusPhase2()", +"ade6e2aa": "expiryTimestamp()", +"ade716e5": "activatedArbitrationTokens(address)", +"ade7a3ad": "totalParticipationAmount()", +"ade7dd7b": "storeInvestment(address,uint256)", +"adeaa851": "getTotalPrize()", +"adeb8dec": "setLocks(address[],uint256[])", +"adeba3a5": "payWithdraw(address)", +"adebf6f2": "isFungible(uint256)", +"adec07c7": "setPriceUpdateInterval(uint256)", +"adec3a92": "totalPonziInGame()", +"adeca283": "payeeArray()", +"adedc071": "internalApprove(address,uint256,uint256)", +"adee3f4b": "getCodeType(uint256)", +"adef40db": "disputeJUR(address,uint256,uint256[])", +"adefc37b": "sub(int256,int256)", +"adefd501": "ledMultiSig()", +"adf069ea": "startsWith(string,string)", +"adf07791": "tenant()", +"adf0c351": "add_participant()", +"adf13281": "mineFor(address,bytes32)", +"adf24dec": "setDemurringFee(uint32,uint32)", +"adf272ab": "vest(address,uint256,uint256,bool)", +"adf2cead": "mint(bytes32)", +"adf2d029": "calculateAdminTxHash()", +"adf2ef99": "ReichaCOIN()", +"adf2f978": "getCurrentDragonGirlLotteryNumber()", +"adf403ad": "capitalReserveWallet()", +"adf4285d": "GovernanceAddOwner(address,address)", +"adf46a39": "createContractDank(string)", +"adf4a144": "startRefund()", +"adf4fa09": "addPurchased(address,address,uint256,uint256)", +"adf54e0c": "betOnLowHigh(bool,bool)", +"adf59f99": "query(uint256,string,string)", +"adf5d1cb": "YumeriumToken()", +"adf5e565": "verify(bytes,address,uint256,uint8,bytes,bytes)", +"adf60404": "THreeDBToken()", +"adf684ac": "ULChain(address,uint256)", +"adf6e486": "unPauseToken()", +"adf70883": "completeUnlockTime()", +"adf74fc9": "distributeELTCMedium(address[])", +"adf8a01b": "emitSkillEvaluated(address,address,uint8,uint256,uint256,uint256)", +"adf8f79d": "LOG_ContractResumed()", +"adf96752": "trade(address[13],uint256[15],uint8[2],bytes32[2],bytes32[2])", +"adf9a754": "forwardFundsToOwner()", +"adf9cd49": "totalWeiCap()", +"adf9ffea": "lockupOf(address)", +"adfa1f0c": "Pinged(string)", +"adfa820a": "deleteBlockState(bytes32)", +"adfa845a": "test_remove_notInList()", +"adfaae32": "lastMinedOn()", +"adfc36a3": "getAssembly(uint256)", +"adfceb9a": "proxyBuy(bytes32,address)", +"adfd5380": "preTgeBonus()", +"adfd7935": "setBridgeNode(address,bool)", +"adfdb75e": "setRedeemRequestLimitInterval(uint256)", +"adfdc12f": "createNewGame(string,string,string,uint256)", +"adfe1190": "components(uint16)", +"adfe6b80": "InvestAdd()", +"adfec5f5": "buy(bytes8)", +"adff2450": "getOuverture_effective()", +"adff5f36": "PanamavsTunisia()", +"adffe4db": "setFundingRules(address,bool,uint256,uint256,uint256,uint256,uint256)", +"adfff41d": "m_Data(address,uint256,uint256)", +"ae0041aa": "signalCount()", +"ae005a87": "ERC777DemoToken(string,string,uint256,uint256,uint8)", +"ae012367": "withdrawTopForTeam(address,uint256)", +"ae014f1d": "getUserNameByWallet(address)", +"ae01a8fb": "toCloseVote()", +"ae01ab47": "setFracoinAuction()", +"ae01c14f": "SendBid()", +"ae01dd06": "noteDesignatedReport()", +"ae01ed8a": "manualWithdrawalFallback(address,uint256)", +"ae024c40": "isTopic(bytes15)", +"ae0250c1": "showPoolNumber(address,address)", +"ae025faa": "newGroup()", +"ae0269aa": "VirtuePokerSale()", +"ae02ee5b": "pack(bytes,address,address,uint8,uint256)", +"ae035846": "END_TIME_SALE()", +"ae0395ad": "setFriendsFingersWallet(address)", +"ae03d6c2": "getIrisProvidersReport(bytes32,address)", +"ae03f754": "GongPanToken()", +"ae040b1d": "get_orderAddress(address,uint256,uint256,uint256)", +"ae041b90": "WRLCrowdsale()", +"ae043336": "dolRate()", +"ae04d45d": "setLockTime(uint256)", +"ae056477": "addInvestorBalance(address,uint256)", +"ae06494e": "createHNtokens(address)", +"ae065737": "tradePreToken(uint256,address,address,uint256,address)", +"ae06c1b7": "setFeePercentage(uint256)", +"ae06dbc0": "dataControlSetFeeAbsMaxGlobal(uint256)", +"ae0755d3": "popTransaction()", +"ae078036": "preICO_tokens()", +"ae08b8b3": "BUXCOINMONEYCONTRACT()", +"ae093eb7": "sendICOTokensBack(uint128)", +"ae0996fc": "getMyEOSKey()", +"ae0a6b28": "signature(string,bytes32)", +"ae0a90b2": "domain_buy_useArina()", +"ae0aba8c": "acceptPayment()", +"ae0b4edd": "cancelSellOrder(address[])", +"ae0b7bdb": "twoWeeks()", +"ae0bbe4d": "approveRecipient(address,bool)", +"ae0be41c": "periodPreITO_hardCapInWei()", +"ae0db13c": "totalBidEth()", +"ae0e5387": "networkReserveFund()", +"ae0e8725": "Checkable()", +"ae0e8f3f": "strategicLockup()", +"ae0eadbf": "isFirstStageTokensMinted()", +"ae0f6166": "subtract(int256)", +"ae101f31": "addStage(uint256,uint256,uint256,uint256)", +"ae104265": "calculatePrice(uint256)", +"ae117f3e": "getFSTBalance()", +"ae11cf73": "isVerfied()", +"ae11ea9b": "transferChild(address,address)", +"ae125f00": "mint(uint256,address,bytes32,bytes32,bytes4)", +"ae1345c4": "CharterCapital()", +"ae136d62": "firstBonusEnds()", +"ae13efe0": "batchFreeze(address[],bool)", +"ae152cf4": "oraclize_query(string,string,uint256)", +"ae154aab": "passOff()", +"ae15eb8e": "getCertificate()", +"ae1616b0": "airdropReserveWallet()", +"ae169a50": "claimReward(uint256)", +"ae180337": "withdrawBaseERC20(address)", +"ae181958": "_setNonlistedUser(address)", +"ae181f84": "passThroughTap(uint256)", +"ae188884": "sendOneEtherToMiner()", +"ae18f5ad": "issueContractAddress()", +"ae190819": "getBS(bytes32)", +"ae1a0b0c": "launchLength()", +"ae1a15e3": "PresaleFundCollector(address,uint256,uint256)", +"ae1a5611": "ratePerEthPhase2()", +"ae1a9a3e": "castToUint(int256)", +"ae1aafb9": "buyPredictForContract(address,uint8)", +"ae1adba2": "calculateStakeGains(uint256)", +"ae1b4beb": "buyFactorPromotion()", +"ae1b6405": "endICOTime()", +"ae1be1e4": "releaseLockedToken()", +"ae1c4062": "stopStage()", +"ae1c9437": "_stringsEqual(string,string)", +"ae1cad3a": "tip(address,string,uint256,string)", +"ae1d12a6": "WhyWhyToken(address)", +"ae1d3043": "teamTimeLock2()", +"ae1d4b4b": "GambleEther()", +"ae1dd78c": "sendEtherManually()", +"ae1e2096": "MAGICCOINERC20(uint256,string,string)", +"ae1e964e": "newOwnershipFeeProposal(uint256,string)", +"ae1f14ca": "mainSale_WeiRaised()", +"ae1f91b7": "updateMinMaxBetCount(uint256,uint256)", +"ae1fb61a": "TokenTransferProxy()", +"ae200c73": "joinGameTeam(bytes32,uint8)", +"ae2022c0": "getUint256Max(int256)", +"ae203146": "getAccountType(address)", +"ae2074c8": "addWhiteListAddress(address,address,uint256)", +"ae20bf15": "claimFreeEggs()", +"ae224633": "videos()", +"ae22c1be": "ShowRelease(address,uint256)", +"ae22e331": "_getCurrentSchellingRound()", +"ae248ced": "deliverETH()", +"ae249f2b": "destroyWhenRoundOver()", +"ae24e328": "tickerQueryData()", +"ae25532e": "getProxyId()", +"ae25753b": "wildcardsHeld(address,uint16)", +"ae25f630": "DownPlayerResult(string,address,uint256,uint256,uint256)", +"ae262114": "crowdSaleDragonPrice()", +"ae263730": "isOperationAllowed()", +"ae26588c": "removeTrustedContractAddress(address)", +"ae277584": "amountToSend()", +"ae27e3c6": "relu_activation(int256)", +"ae28b68c": "safeTransfer(address,uint256,uint256,bytes)", +"ae28e912": "teamTokenAmount()", +"ae2a0ce3": "JustinsToken()", +"ae2b4e16": "getBalanceInRemix(address)", +"ae2b5d3b": "_emitCountryCodeAdded(uint256,uint256,uint256)", +"ae2bd2bd": "clearAuction(address,address,uint256,uint256)", +"ae2c1506": "getRoundNumberOfBets(uint256,uint256)", +"ae2c923c": "OlympusLabsCore(address)", +"ae2cbc91": "Tradable()", +"ae2da5c5": "getLLV_edit_20()", +"ae2df7b3": "setImporterBank()", +"ae2e054c": "closeOrder(uint256,address)", +"ae2e933b": "feePool()", +"ae2f1f6f": "calculatePayerDeposit(uint256)", +"ae307098": "c_MinInvestmentInCents()", +"ae30d35d": "ARK_TROGLOg_1_00()", +"ae3125d9": "showTokenSaleClosingTime()", +"ae319f60": "_updatePurchasingState(uint256)", +"ae31deb9": "burnCrowdsale()", +"ae326221": "setSpawnProxy(uint16,address)", +"ae327322": "cantSetReferrer()", +"ae32ac7e": "TEAM_LOCK_DURATION_PART2()", +"ae32c399": "lastBlock_f1Hash_uint256()", +"ae353131": "BiquToken(uint256,string,string)", +"ae35707d": "sectionForSale(uint256)", +"ae35d21a": "CollectibleBidWithdrawn(uint256,uint256,uint256,address)", +"ae366735": "EQUIPMENT_REWARD_WALLET()", +"ae36c602": "createPromoItem(address,string,uint256)", +"ae36f6f9": "_batch4_rate()", +"ae3783d6": "relayedSet()", +"ae382baa": "GainCard(address,uint32)", +"ae39279f": "sendFee()", +"ae3b2137": "getRoomSetCount(uint256)", +"ae3b748d": "setMinCap(uint256)", +"ae3b94b2": "_minimumTokens()", +"ae3baf4d": "mintableAmount()", +"ae3c697c": "getMyAvailableWine()", +"ae3d27ed": "Token_For_Circulation()", +"ae3d5047": "_changeSymbol(string)", +"ae3d7160": "compareByte(string,string)", +"ae3d81b8": "allowedJurisdictions(bytes32)", +"ae3f4a6c": "test_3_method()", +"ae3f84f3": "proofMultiSig()", +"ae3fc899": "CheckExchange(string)", +"ae404996": "oraclize_query(string,string[3],uint256)", +"ae40f72f": "testAdd()", +"ae41480b": "importEthers(address)", +"ae422c09": "sys()", +"ae42ce85": "update_oracalize()", +"ae436b5e": "getLimitedReporterMarketsCount()", +"ae44dea2": "bytesToUInt(bytes,bytes32)", +"ae44e840": "priceConfirmedOver500()", +"ae4538ce": "walletCompanyReserve()", +"ae457835": "buyTokensFor(address,uint64,uint256,uint8,bytes32,bytes32)", +"ae457dab": "bonusEnds20()", +"ae45850b": "schedulerAddress()", +"ae458ab6": "approve(uint64,address)", +"ae466db7": "withdrawPenaltyTokens()", +"ae46e284": "setPortfolio(uint256,bytes32[],uint8[])", +"ae479a63": "badgeSymbol()", +"ae47a290": "changeMaxBet(uint256)", +"ae487dad": "reset(uint256,uint256,uint256,uint256,uint256,uint256)", +"ae49165a": "getAncestor()", +"ae49a717": "EVNT()", +"ae4a7512": "mintICOTokensFromExternal(address,uint256)", +"ae4a8c88": "claimLoot(uint256,address)", +"ae4aadbb": "showTransferConfigs()", +"ae4ab7ce": "Put_DEDI_gift(address)", +"ae4ac63e": "STANDARD_BUYIN()", +"ae4b1b5b": "proxyStorage()", +"ae4b5cb8": "collectDonations(uint256,address)", +"ae4b76fe": "_createPiranha(string,address,uint256,uint8,uint256,uint8,uint8)", +"ae4c20af": "increaseICOcap(uint256)", +"ae4c5e45": "setStarNewOwner(uint256,address)", +"ae4cc757": "closeEarlyPurchase()", +"ae4d0ff7": "gen0StartingPrice()", +"ae4d1af6": "setup(bytes32,address,address)", +"ae4d42b8": "ptxTail()", +"ae4d503b": "withdrawOtherERC20Balance(uint256,address,address)", +"ae4e7fdf": "isMature()", +"ae4eba1f": "setOldE4(address,address)", +"ae4f1198": "publicationFeeInWei()", +"ae4f1476": "searchSeed()", +"ae4fbdeb": "LastValidated()", +"ae501c75": "LogLotteryResult(uint32,uint8,bytes32,bytes)", +"ae50d660": "setFilletPrice(uint16,uint16,uint8,uint256)", +"ae5103e8": "preSaleFourthPrice()", +"ae516449": "uintCeil(uint256,uint256,uint256)", +"ae51c484": "a(bool)", +"ae51db0d": "VesaStage2PreICO()", +"ae52026f": "icoSoftCap()", +"ae529499": "CurrentARXSupplyInWei()", +"ae530504": "setSetting(string,uint256)", +"ae53d79e": "ICO_PRICE7()", +"ae5409fb": "seedInvestorsReserve()", +"ae55c888": "getData(string)", +"ae55f1af": "artWorkChangeApprove(uint256,uint256,bool)", +"ae56463e": "getPoliceReport(uint256,address)", +"ae56e668": "setUnlockAddress(address,bool)", +"ae5942cd": "deletePermissions(address[])", +"ae59bd5a": "mintManually(address,uint256)", +"ae5a1460": "NewDigitalAsset(address,address)", +"ae5a17a7": "updateCharityAddress(address)", +"ae5a4a7f": "maxBatchAssignment()", +"ae5a9bb4": "operatorTransfer(address,uint256,bytes,bytes)", +"ae5a9d17": "getCompletedTransactions()", +"ae5adac7": "mintInCurrPeriodCount()", +"ae5b2540": "setApp(bytes32,bytes32,address)", +"ae5b6d89": "submitSteak(address,bytes32)", +"ae5c1816": "CreateKittyToken(address,uint256,uint32)", +"ae5c24bd": "getFirstElement()", +"ae5c37fd": "contributionsByIntel(uint256)", +"ae5c3f14": "getVipBrokerNum()", +"ae5c75aa": "getBadgeByKtUserId(uint256)", +"ae5c888d": "month60Unlock()", +"ae5d2cbe": "_getOwnerTokenByIndex(address,uint256)", +"ae5da7a0": "_generateGame(bytes32,bytes32,address,uint256[10])", +"ae5dbd43": "view_get_ResultData()", +"ae5e6cf4": "cancelReservation(uint256)", +"ae5ec2e9": "matching()", +"ae5f502e": "RoundSubmission(uint256)", +"ae601e4d": "IADForGas()", +"ae602223": "standFeeAfter500()", +"ae610b48": "sign(int256)", +"ae61fcda": "isEthernautsStorage()", +"ae6215d8": "getBlockHeight(bytes)", +"ae622c4b": "addToInxWhitelist(address)", +"ae62fd7c": "setCrowdSale(bool)", +"ae639329": "sendTo(address,address,uint256)", +"ae63b517": "ADVISORY_BOARD_TOKENS()", +"ae640923": "playerEndGame(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address,bytes)", +"ae6439c4": "icoSaleSoftCap()", +"ae6506f9": "getCurrentTierIndex()", +"ae665d5d": "MooguToken()", +"ae66d948": "getWithdrawn(address)", +"ae6751e2": "EmilTestCoin()", +"ae67701f": "ZperPreSale(address,uint256,uint256,uint256)", +"ae67b4c3": "evolveAxie(uint256,uint256)", +"ae68c80a": "AddRocket(uint32,uint64,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint64,uint32)", +"ae68fb83": "creditShareProvision(uint256,uint256)", +"ae69a893": "getHeirCount()", +"ae69ccdc": "GMSToken(uint256,string,uint8,string)", +"ae6a19af": "tokensSoldLimit()", +"ae6a1c30": "setApprovedWallet(address)", +"ae6a2435": "HOST_CUT()", +"ae6a70ee": "_tokenMetadata(uint256)", +"ae6b0792": "paymentManager(string,address,string,uint256,uint256)", +"ae6c0b03": "canWithdrawBond(uint256)", +"ae6caafd": "buyByBot(uint256,uint256,address)", +"ae6d8a52": "viewFourthLotOfClauses()", +"ae6dca72": "_allocate(address,uint256,uint256)", +"ae6e11dc": "terminateTokenLock()", +"ae6e22f1": "totalEther()", +"ae6f1db6": "payableFinneyReceived()", +"ae6f5bd2": "_calResultReturnIsWin(uint256,uint256)", +"ae702ba4": "isSubscriptionActive(bytes32,uint256)", +"ae70609e": "LogResult(uint256,address,uint256,uint256,uint256,int256,uint256,uint256)", +"ae708e7c": "totalConsideredFundedEther()", +"ae71d5da": "initProceeds(address,address)", +"ae721e45": "fetchOrdersForPayerByAdmin(address)", +"ae748575": "CGCM()", +"ae748837": "addTestimony(address)", +"ae75c4f7": "rewardsTokensVault()", +"ae75f9e6": "mock_resetLatestTokenAllocation(address,address)", +"ae76145d": "SEXcoin()", +"ae7635f2": "icoEndUnfrozeTokens()", +"ae764df3": "ICOWallet()", +"ae775b27": "betOnDozen(uint8)", +"ae77a6f4": "goldBalance()", +"ae77c237": "purchase(uint256,address)", +"ae77d51f": "m_chiefOwnerIndexBit()", +"ae788913": "AIHToken()", +"ae788b34": "ILFManagerCandidate()", +"ae799f4a": "TokenERC20(string,string,uint8,uint256)", +"ae7a45ba": "addZethrAddresses(address,address)", +"ae7a833d": "hydroContract()", +"ae7ad3fd": "setUpgradeabilityOwner(address)", +"ae7b0333": "executeOrder(address,uint256,uint256)", +"ae7b1620": "rushTimeChallengeRewardsPercent()", +"ae7b3825": "exchangeForETH(uint256)", +"ae7b6bd9": "getLatitude()", +"ae7b6daa": "numberOfCellsOwnedBy(address,address)", +"ae7c046b": "applyAllPermission(address,address)", +"ae7d00f3": "validationPrice()", +"ae7d0cac": "addShare(address,uint256,uint256)", +"ae7e23cc": "otherCoinsPurchase(bytes32,uint256)", +"ae7ed04c": "getLastBidForCanvas(uint32)", +"ae7f5da4": "lockPeriod2()", +"ae7fa597": "removePrize(uint16,address,uint256)", +"ae7fc1da": "_randMod(uint256,uint256)", +"ae7ffadc": "Bitway()", +"ae813029": "makeBid(uint16,uint256)", +"ae813ebb": "TokenFactoryAirdropCoin()", +"ae815843": "query(uint256,string,string,uint256)", +"ae817dd1": "doSendBounds(bytes32)", +"ae818340": "getProfiles(address[],string[])", +"ae81a54b": "factTeamOf(uint256)", +"ae81f51b": "mintTokens2(address,uint256,uint256)", +"ae8205e3": "insert(bytes32,int256)", +"ae82fcf4": "teamLocked()", +"ae83ed91": "HashBlock()", +"ae8421e1": "done()", +"ae850da9": "getNumberSources(uint256,uint256)", +"ae873405": "AVG_BLOCKS_24H()", +"ae873fa5": "PRESALE_MAX_RAISE()", +"ae87fc4b": "claimStatus()", +"ae87fd06": "gasPriceLimit_()", +"ae882412": "getTotalDivsProduced()", +"ae882cf1": "allowSpecies(uint16,uint16,address)", +"ae896b2e": "TPN()", +"ae89a29e": "maxHolderCount()", +"ae89aeb9": "getEscrowData(uint256)", +"ae8a473d": "_setReserveFactorFresh(uint256)", +"ae8a6833": "InitialSettings()", +"ae8a7180": "setStartOfCrowdsale(uint256)", +"ae8a8690": "createActivePreMintedEdition(uint256,bytes32,uint256,uint256,uint256,address,uint256,uint256,string,uint256,uint256)", +"ae8b9d7b": "autoSolveGame(uint256,uint256,uint256)", +"ae8bce2c": "product1_pot()", +"ae8cdd59": "IBTC(uint256,string,string)", +"ae8dab48": "setUp(address,address,address,address,address,address,address)", +"ae8e2217": "SmartexController()", +"ae8e3b70": "Fin()", +"ae8efe46": "CheckEntity(bytes32)", +"ae8f1d29": "createPermission(bytes32,address[],bytes4[])", +"ae8f2328": "finishcrowdsale()", +"ae8f6489": "createAndBuyAllAmountPayEth(address,address,address,uint256,address)", +"ae9074ff": "internalSuccessOver()", +"ae90b213": "payee()", +"ae90e9f8": "returnToBuyersContinue()", +"ae91b691": "changeRefPercentage(uint256)", +"ae92b204": "getCurrFeeRate()", +"ae93e513": "cancelOfferForCity(uint256)", +"ae94bbf1": "getCarDetails(uint32)", +"ae94e448": "imax(int256,int256)", +"ae94ec05": "placeBuyTokenOrder(uint32)", +"ae954790": "Authorizable()", +"ae9569d0": "PLATPriceOracle()", +"ae95a7a4": "TacoToken(address,string,string,uint256,uint256)", +"ae95c24e": "issueMap(address)", +"ae96b094": "VergeDark()", +"ae96bf2c": "TakePot()", +"ae9759ff": "PRICE_MULTIPLIER_ICO2()", +"ae978f08": "getLatestTweet()", +"ae97dde8": "MAX_COMMISSION()", +"ae989d36": "homeTeam()", +"ae99847b": "daylimit(uint256)", +"ae999ece": "reserve(string)", +"ae99aa3c": "getMemberInfo(uint256)", +"ae99f03c": "SetAddresses(address[],address[],address[],address[])", +"ae9a0785": "getChannelPostCount(address)", +"ae9a9295": "YKC(uint256,string,uint8,string)", +"ae9aea6d": "maxMintQuantity()", +"ae9b051c": "withdrawSome(uint256)", +"ae9b233f": "PasesLibresSocio(uint16,uint16)", +"ae9c1962": "withdrawCommunityPot()", +"ae9d70b0": "supplyRatePerBlock()", +"ae9dc04c": "offerSketchForSaleToAddress(uint256,uint256,address)", +"ae9f96c7": "weightsApportion(uint256,uint256)", +"aea01c49": "stringToBytes(string,string)", +"aea09e6e": "crowdfundStartTime()", +"aea0e35f": "createMarket()", +"aea13844": "safeGiveByContract(uint256,address)", +"aea1935b": "confirmEndWork(uint256)", +"aea197fe": "CreateRecipt(string,uint256,string,string,string,string,string,uint256)", +"aea31fc7": "setProof(string,string)", +"aea398da": "paymentWalletAddress()", +"aea3ad8c": "supportKickoffQuorum(uint256)", +"aea40787": "SetOwned()", +"aea43a29": "addMassAddressToWhitelist(address[])", +"aea452ba": "isBinding(uint16)", +"aea48690": "incentivisingEffortsSupply()", +"aea57be4": "resumeIEO()", +"aea5b69f": "solutionInfo(uint256)", +"aea6022c": "change_metadata(uint256,string)", +"aea64763": "stopsale()", +"aea65bf6": "VerifyProof(uint256[],uint256[],uint256[])", +"aea68d6b": "Shakedown0x()", +"aea6e1a4": "buyAnotherDrangon()", +"aea787a2": "showleveldetail(address)", +"aea8126f": "transferMSM(address,uint256)", +"aea8d47c": "getLatestContract(bytes32)", +"aea8dcca": "setTokenInfoMaxTotalImbalanceList(uint256[])", +"aea92852": "getDevIndex(address)", +"aea96513": "returnSecretVoteHash(uint256)", +"aea9b438": "getBuyerInstanceAddress(address)", +"aeaa3091": "getDealerValue(uint8[],uint8)", +"aeaaaa08": "proxyClaimTokens(address)", +"aeaabffe": "UnlockAll()", +"aeab24df": "reinvestDivsWithContract(address)", +"aeac3354": "Deal(address,address,address)", +"aeac529a": "TradingLife()", +"aeac538a": "ClimateCron()", +"aeaca25e": "getTotalJadeProduction()", +"aeacd658": "signProduct(string)", +"aead9e47": "claimAndWithdraw()", +"aeadbe24": "getTotalTokens(address)", +"aeae264b": "BeteventCrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"aeaf5a37": "total_land_sold()", +"aeaf7fc1": "updateCandidate(address,bytes32,bytes32)", +"aeb00fda": "_getRacerCar(uint256)", +"aeb1355f": "getH2Amount()", +"aeb26733": "previligedApprove(address,address,uint256)", +"aeb27602": "addHash(string)", +"aeb2ffc1": "getQuery(uint256)", +"aeb37075": "DividendPaid(uint256)", +"aeb3ebd0": "LogContributorsPayout(address,uint256)", +"aeb447ff": "getLevelUpCost(address,address)", +"aeb47e2a": "COMMUNITY_POOL()", +"aeb4f0d3": "RegisterTwo(address,address)", +"aeb58dc5": "setPOOL_edit_15(string)", +"aeb669eb": "getHatchingEggId(address)", +"aeb754e5": "Auction(address,uint256)", +"aeb7614c": "bid(bytes32,bool,int32)", +"aeb7dd80": "_computeCurrentPrice(uint128,uint128,uint40,uint40)", +"aeb817ab": "etcSupply()", +"aeb89f14": "totle()", +"aeb8f966": "mintToken(address,uint256,int256)", +"aeb94f48": "getFreePacifist()", +"aeb9c40e": "isReadyToStart(uint256)", +"aebacd53": "PRE_BONUS()", +"aebad3a4": "getCaptainCount(uint32)", +"aebb2540": "setNewMultisig(address)", +"aebc0310": "updateOdds(uint256,uint256)", +"aebcd2d9": "AddSocialAccount(bytes32,bytes32,bytes32,bytes32)", +"aebd3f96": "receiveToken(address,uint256,address)", +"aebd4fcd": "shopStoreRegister()", +"aebe0224": "CollectibleTransfer(address,address,uint256,uint256)", +"aebe5523": "addTokenWalletInWhitelist(address)", +"aebf1e3d": "computeTokens(uint256)", +"aec02eb5": "ServiceContractResolver(address)", +"aec1914d": "surrender(bytes32)", +"aec1dd81": "updateNonClosingBalanceProof(address,address,bytes32,uint256,bytes32,bytes,bytes)", +"aec1ee7b": "STAT_MAX_VALUE()", +"aec205a5": "contractLaunched()", +"aec26c0e": "setLoanParameters(address,bytes32,uint256,uint256,uint256,uint256,uint256,string)", +"aec2f2d9": "first_bonus_duration()", +"aec30dc1": "minWeightPunish()", +"aec318f1": "enableMasterTransfers(bool)", +"aec3ab53": "_futureSupply()", +"aec4e0bb": "numberOfPunksReserved()", +"aec5ab08": "getAllDapps()", +"aec651fb": "getUserTokensByMatch(address,uint32)", +"aec72d8d": "STAGE_3()", +"aec77b63": "returnTokensInPool(address[],uint256[])", +"aec7f5b2": "JoustNum()", +"aec7f6f3": "compoundInterest(address)", +"aec8fae8": "getMemberAtKey(uint256)", +"aec9a987": "claimShare(address,address)", +"aec9c480": "includesSet(bytes32)", +"aecadd53": "grantTeamToken()", +"aecaf4ba": "addMoneyInternal(address,uint256)", +"aecbaaa1": "LogPayout(address,uint256,uint256)", +"aecbb5f1": "winAmount1()", +"aecbf70c": "Kisaan()", +"aeccee75": "_register(address,uint256,address)", +"aecd15e3": "getWithdrawalWallet()", +"aecd1fed": "setupToken(address,address)", +"aecd27fa": "linkCoin(address)", +"aecd46db": "testDepositCanbeWithdrawn()", +"aecdceef": "intToBytes(uint256,uint256)", +"aecef00e": "record(uint256,string)", +"aecf2149": "sendScoreToCustomer(address,uint256)", +"aecfd412": "Group_2()", +"aed214fb": "setBooleanMapValue(string,address,address,bool)", +"aed29d07": "totalRewarded()", +"aed2e7d4": "addGen(uint256)", +"aed339ef": "storeHarvestOperation(bytes32,address,string,string,uint32,uint24,uint16,string)", +"aed362c1": "hasModerator()", +"aed396c6": "setStageBonus(uint256,uint256)", +"aed3ebe4": "TokenBCCO(uint256,string,string)", +"aed4839a": "transferFrom(uint256,address)", +"aed4aab6": "receiveERC20(address,uint256)", +"aed5c011": "payWithMerculet(uint256)", +"aed6512e": "callerAdd(address)", +"aed6d8d4": "GetStuffNum(address,uint32)", +"aed76aa4": "getInvestorDepositAmount(address)", +"aed82a99": "sin_table_lookup(uint256)", +"aed83846": "removeFromPrivateSaleWhitelist(address[])", +"aed89fed": "projectContract()", +"aed8e967": "getEndpoint()", +"aed8f3da": "partsPerBillion(uint256,uint256)", +"aeda10be": "ethselfToken()", +"aeda352b": "hasName(address)", +"aeda852f": "houses(uint256)", +"aedb1c8f": "executeContract()", +"aedb8621": "TMONEY()", +"aedb9eef": "LDXCToken(uint256)", +"aedbbf36": "deleteNote(uint64)", +"aedd18dc": "timeout(address)", +"aedd3acc": "currentSTCPrice()", +"aeddaa02": "DelVer(address,address)", +"aeddab95": "batchUnmount(address,uint256[],uint256)", +"aeddf677": "lockLimit()", +"aede4680": "firstReserveWallet()", +"aede879d": "whatIsMissing()", +"aedf5360": "icoCrowdsaleContract()", +"aee06324": "trickleUp()", +"aee0abaa": "authorizeMany(address[],uint256)", +"aee14460": "getSummary(uint256)", +"aee145f7": "addressReserve()", +"aee1b8a1": "XBStandardToken(uint256,string,uint8,string)", +"aee1d4d3": "blockCreationRate()", +"aee25613": "sendErc20(address,address[],uint256[])", +"aee273f8": "createTokens(address,uint256,address,bool)", +"aee2988d": "addressOps()", +"aee2dbbf": "getSaleOrdersBySeller(address)", +"aee338ef": "referalAddrByNum(address,uint32)", +"aee36731": "OrderApprovedPartOne(bytes32,address,address,address,uint256,uint256,address,uint8,uint8,address,uint8,bytes)", +"aee40270": "AddAddressToWhitelist(address)", +"aee4c502": "test_remove()", +"aee7052e": "startPhaseLength()", +"aee776ae": "stnExchange(address,uint256)", +"aee7e176": "finalBonus()", +"aee83b61": "TASOHATOKEN(uint256,string,string)", +"aee84f6b": "setTime(address,uint256)", +"aee8a3bd": "add2Auction(address,uint256,uint256,uint256,uint256,uint256)", +"aee9293f": "chargeAndChange(uint8)", +"aee92d33": "approveByLegacy(address,address,uint256)", +"aee98408": "versionIndex(bytes32,bytes32)", +"aee99e52": "getPresale()", +"aeeaf3da": "addPackCategory(uint256,bytes4)", +"aeeb96af": "Highlander()", +"aeec9ba0": "UpdateManifesto(uint256,bool,bool)", +"aeedc9e9": "GroupBuy()", +"aeeed0db": "buyXaddr(address)", +"aeefb9d1": "distributeEDNR(address[])", +"aeefb9eb": "PixelToken()", +"aef0004a": "outputAddress()", +"aef08617": "limitTier3()", +"aef093ce": "Doge2Token()", +"aef0ef2e": "test_validShouldBe3_2()", +"aef1b9b5": "test_threeInvalidFalseEqLog()", +"aef251a7": "tokenCtr()", +"aef3575e": "HandWinsView(address)", +"aef35e6a": "stage2Sale()", +"aef37284": "getReservedTokensListValInPercentageUnit(address)", +"aef3bc17": "getMemberInformation(uint8)", +"aef3fa6c": "AFROIN()", +"aef41e3a": "getItemIdsPagable(uint256,uint256)", +"aef5cbee": "VICToken()", +"aef5ddec": "Paper(string,address,uint256,uint256,address[],address)", +"aef721b8": "createSwap(uint256,uint256,address,address,address)", +"aef76dda": "createPresale(address,uint256,uint256)", +"aef7ad9c": "getSchellingRoundDetails(uint256)", +"aef88aba": "DDJATCoin()", +"aef8a536": "SCNToken(uint256,string,string)", +"aef95098": "setUrl(uint256,string)", +"aef983d0": "getDigitFromByte32(bytes32,uint8)", +"aef99eef": "Game()", +"aefa573d": "genCode()", +"aefa68f0": "ifInAllowedLocks(uint256)", +"aefa7550": "read_u32()", +"aefa7d98": "getContractAddress(uint256)", +"aefaacda": "finalTimeout()", +"aefb1643": "ownerSetPaused(bool)", +"aefb2dad": "ticketsFor(uint256,address)", +"aefb658e": "playerDayEthInLimit_()", +"aefbbf2a": "BANKROLLER()", +"aefc4ccb": "associatedContract()", +"aefc8c72": "unsealBid(bytes32,address,uint256,bytes32)", +"aefd0299": "makeWager()", +"aefe5ee0": "cashOutTank(uint256)", +"aefe696b": "changeColorPink()", +"aefe9ca0": "s40(bytes1)", +"aefea053": "timelockVault()", +"af0062e4": "sellable_tokens()", +"af00be12": "_sendToken(address,uint256,bytes)", +"af017526": "whitelistAddress(address,bool,uint256)", +"af01841e": "getownership(uint16)", +"af01866d": "insertSchedules(uint256,uint32[],uint256[])", +"af023335": "burnSynths(bytes4,uint256)", +"af02d47b": "currentBonusPercent()", +"af030d2c": "setResult(uint256,uint256,bytes32)", +"af03105b": "depositMintSince(address,uint256,uint256,uint256)", +"af0396ae": "PLDT()", +"af03e856": "MockUpgradeableToken()", +"af047106": "sumPreICO2()", +"af049ea9": "testFail_interface_call()", +"af04d0c0": "Deal(address,uint256,uint256)", +"af053b71": "CostToken()", +"af05fa10": "upgradedVersion()", +"af05fc63": "mulpow2(uint256)", +"af0638f6": "currentMaxPurchase()", +"af079dec": "setHardwareWallet(address)", +"af07c768": "Arte()", +"af080014": "nameChange(string,string)", +"af086d6f": "setTestVar(uint256)", +"af08e1ad": "get_arbits_presale_open(address)", +"af093f9c": "specificBatchCheck(uint256)", +"af09420b": "_addStackholder(address)", +"af0a078e": "tHasUpvoted(uint256,address)", +"af0aba4e": "setExpirationRequest(uint256)", +"af0ac4b7": "submitNextStage()", +"af0b4cc0": "minerTotalTime()", +"af0b7029": "KYCApprove(address[])", +"af0bbfb8": "registerEndpoint(int256,string)", +"af0bdb38": "to(address,bytes)", +"af0c09db": "getChosenNumber()", +"af0c9259": "Total_SoldToken()", +"af0cfe1f": "addArticolo(bytes,bytes10,bytes10,bytes)", +"af0def14": "startWonderAuction(string,address)", +"af0dfd3e": "blockPeriod()", +"af0e7ba3": "LeanFund()", +"af0eec40": "assignWarriorsToBattle(address,address,uint256,uint256)", +"af1034ab": "addUpdateGrantee(address,uint256)", +"af106b10": "oracCost()", +"af107749": "m_emissions(uint256)", +"af10b8cf": "totalBooty()", +"af10c810": "turnOff()", +"af123fe7": "makeDeposit(address,address,uint256)", +"af129dc2": "numTokensTotal()", +"af135ff5": "getMemberInfoLength()", +"af136dea": "setCheckInPeriod(uint256)", +"af1380ad": "_getTournamentBattles(uint256)", +"af13aacc": "blocksPerPhase()", +"af13f1ad": "forSaleSupply()", +"af1484d0": "setForkReputationGoal(uint256)", +"af157c19": "getContributors()", +"af164016": "PersonalTime(address,uint256)", +"af16972c": "mining(uint256,bytes)", +"af1747aa": "checkDeck(bytes32,uint8[],bytes32)", +"af17dea6": "symbol_()", +"af18a548": "lockBuying()", +"af191aa5": "isCertificateRegisteredAndValid(address)", +"af19f0d1": "CoinPreSale(uint256,uint256,address,address,uint256,uint256,uint256,uint256)", +"af1af4df": "feeBurnerWrapperProxyContract()", +"af1b5feb": "addWeiRaised(uint256)", +"af1b7d90": "take(uint256,uint256[4])", +"af1c084d": "adminName(address)", +"af1c7940": "fiatInvestorShare(address)", +"af1cd6d3": "test2(uint256,uint32)", +"af1cd9f6": "getGGCTokenBalance(address)", +"af1d06e8": "validateSignature(bytes32,uint8,bytes32,bytes32,address)", +"af1e19d9": "getPlayers(bytes32)", +"af1ee630": "getBdpOwnershipStorage(address[16])", +"af1ff972": "rateForCurrency(bytes4)", +"af2096ef": "MAX_PUBLIC_SOLD()", +"af209cf8": "addFactory(address,uint8,uint256)", +"af20b964": "maximumFundingGoalInETH()", +"af21037f": "clearStartTime()", +"af224bdc": "parseAndStore(bytes)", +"af225fd6": "get_last_user_recast(bytes32)", +"af22fd8e": "NtsToken()", +"af23e1f1": "returnForMint(uint256,uint256,uint256)", +"af24cba2": "setLastAction(uint256,uint256,uint8)", +"af24d25c": "openTransfer()", +"af250a5e": "calculateAndTransferTokens(address,uint256)", +"af259886": "userToNumVillages(bytes32)", +"af261875": "t_ImmlaBountyTokenDepository()", +"af263ec9": "HomeToken(string,string,uint8,uint256)", +"af269745": "upgrader()", +"af26ed68": "setReportProcessingFeePercentage(uint256)", +"af2759f7": "timeUntilClaimAvaliable(address)", +"af2768ec": "commitMove(bytes32,bytes32)", +"af2780ee": "PERIOD_BLOCKS()", +"af27c7b3": "Security_HasPasswordSha3HashBeenAddedToBankAccount()", +"af28059d": "ChangeItemPrice(uint256)", +"af2885b2": "minimumEtherCommission()", +"af28a537": "totalRoundSeedAmount()", +"af299510": "HasBooster(address)", +"af29e720": "remainingGasFund(uint256)", +"af2a7fb2": "Brewers()", +"af2b114a": "Erc20SupplyToken(uint256,string,uint8,string)", +"af2b1925": "MarmotToken(uint256,string,uint8,string)", +"af2b2e5c": "ReVo()", +"af2b76ab": "airDropHero(uint16)", +"af2bf027": "minMaintenanceMarginAmount()", +"af2cff59": "removePVPContender(uint32)", +"af2e285c": "setBidState(bytes32,uint8)", +"af2e2da9": "getValidatorName(address)", +"af2f0c46": "SupportComponent(uint256,address,uint256)", +"af2f9105": "_performWithdraw(address,address)", +"af2fa91c": "otherCurrenciesChecker()", +"af2fcc17": "globalMinPurchaseAmt()", +"af303a11": "salvageTokens(address,uint256)", +"af304bab": "getPriceByCredentialItemId(address,bytes32)", +"af30e4d6": "Log2(address,bytes32,uint256,string,string,string,uint256,bytes1,uint256)", +"af30e9f7": "transferICOTokens(address,uint256)", +"af30ee3f": "GOD()", +"af310f02": "NotCoin(string,string,uint8)", +"af314579": "isDayFirst()", +"af31f49b": "startNextAccountingPeriod()", +"af3309d8": "heartbeatCount()", +"af333595": "proxyMergeMint_old(uint256,bytes32,address[])", +"af339ee4": "convertLotById(bytes32)", +"af33f8a5": "Order_execute(address,address,uint256,uint256)", +"af35314a": "INITIAL_TOKEN_FROM_COMPAIN()", +"af356eee": "preicoContractAddress()", +"af35ae27": "getRemainingTokens()", +"af35ae3e": "setSaddleShopSaleFee(uint256)", +"af35b3f1": "why()", +"af35c6c7": "enableTransfers()", +"af35dac2": "convertToCents(uint256,uint256,uint256)", +"af36778b": "aggregate()", +"af36e7a7": "removeUserWhitelist(address[])", +"af371115": "findCertificate(bytes)", +"af375838": "addBurnupGame(address)", +"af378ce5": "bust(uint256)", +"af38d757": "claimable()", +"af3996c3": "fourthStageMinted()", +"af3a4feb": "LOOMIA_LOOMIA_REMAINDER_ADDR()", +"af3cc6be": "MoxianCoin()", +"af3d8e43": "preICOTokenDelivery(address,uint256)", +"af3dc180": "ecosystemBuildingWallet()", +"af3e8a40": "orderMatch(bytes32)", +"af3f0ebe": "c_startTime()", +"af3f12bc": "profitSharingContract()", +"af3f1db4": "BMEtestToken1()", +"af408d89": "setStatus(bytes)", +"af40ce20": "revokeUnicorn(uint256)", +"af40dd2f": "AccessToken()", +"af418e4c": "setReclaimPeriod(uint256)", +"af422cce": "marketSellOrders(uint256,bytes[])", +"af42d106": "setKey(string)", +"af431f03": "setUser(address,string,uint256)", +"af43f597": "get_amount_minus_commission(uint256)", +"af448721": "refundMe(address,uint256)", +"af44e487": "overdraftPeriodsNumber()", +"af45118e": "createProposal(address,bool)", +"af45de05": "disableDonation()", +"af463d2a": "CentaToken()", +"af468682": "startsAt()", +"af46aa08": "stakeBalanceOf(address)", +"af475a9b": "setUSDPerETH(uint256)", +"af477528": "addMetadataObject(string)", +"af47c1af": "getActionByIndex(uint256)", +"af481be8": "mint(string,uint256,uint256,uint8,string)", +"af488ca3": "setLiquid(bool,uint256,bytes)", +"af489d5a": "_moveBalance(address)", +"af49a228": "DeshiCoin()", +"af49e321": "getHolderLimit(address)", +"af4a2984": "createPrizePool(uint256[])", +"af4a822d": "getCurrentTrancheIndex(uint256)", +"af4b382d": "PaquariumToken(uint256,string,uint8,string)", +"af4b3cab": "delBounty(address,address,uint256)", +"af4bed26": "setExchangeRateByOraclize(address,bytes32,string)", +"af4c14ee": "setAddressWhitelist(address,bool)", +"af4c2288": "getNumAcceptance(address)", +"af4c3d1d": "BPofMakerByIndex(address,uint256)", +"af4c6838": "tokenDeposited(address)", +"af4c9b3b": "withDrawalether(uint256)", +"af4cd457": "getOrCacheValidityBond()", +"af4d723c": "Libidocoin()", +"af4e3d37": "withdrawReservedTokens()", +"af4e4494": "TANKER_TYPE()", +"af4e99de": "getGameData()", +"af4fd9e7": "setValidLockingAmountToPeriod(uint256[3],uint256[3])", +"af500fb7": "readBytes32(bytes,uint256)", +"af50e0d3": "DeDeMasterContract(address)", +"af5177b1": "calcDrawCode()", +"af519bf5": "doesProofExist(uint256,bytes32)", +"af5260bf": "finalTime()", +"af52fbed": "retrieveWineData(bytes32)", +"af53dc6e": "contractbacklist()", +"af54e324": "upgrade_self(address)", +"af55bba0": "removeRegistryFromTagsIndex(address)", +"af5610dd": "isThisPreforkVersion()", +"af567633": "minPresaleWei()", +"af574319": "UpgradeProposal(address)", +"af577c4c": "unlockReserve()", +"af57d236": "STAGE_2_TIME()", +"af580d2c": "getPurchaseById(string)", +"af58574a": "getTierPosition(address)", +"af589421": "callerAdded(address)", +"af589572": "getAssetIdTripStartTime(uint256)", +"af58eda8": "findSeedAuthorized(address)", +"af598bc7": "winnerOf(uint256,uint256)", +"af599a8d": "_depositTokens(address,uint256,address)", +"af59c789": "setVendingAmount(uint256,uint256)", +"af5a3db8": "finaliseVoting(uint256)", +"af5a7625": "getFundInfo(bytes32,string,address)", +"af5b065a": "getMinimumPurchase()", +"af5b0ece": "getAmountContributed(address)", +"af5ba32a": "_fund(uint256,address)", +"af5c1020": "InfinityDataChain()", +"af5c295a": "checkMaxAllowed(address)", +"af5c4540": "getVoteTokens()", +"af5c6f38": "synthesize(uint16[5],uint256)", +"af5cfae8": "remainingInvestment()", +"af5d4013": "toteLiquidatorTranserComplete()", +"af5ee700": "buyTokenPerEther()", +"af604173": "ico_startTime()", +"af608fad": "isTimelockAllowed(address,address)", +"af60b50f": "CGCoinsToken()", +"af60dc4f": "SCMOXToken()", +"af6128c2": "calcTotal(uint256)", +"af62a708": "getCrystalKindWeight(uint256)", +"af62cfd2": "endBetBlue()", +"af63066e": "userRound(address)", +"af6337fd": "pausecontract()", +"af6375cd": "setNewStartTime(uint256)", +"af63da13": "getMemberRegistry()", +"af640d0f": "id()", +"af6499c5": "ActiveDigger()", +"af653861": "applyAndLockSettings()", +"af664f3a": "Bitkat()", +"af6682ab": "query(uint256,uint256)", +"af66c560": "convertData(bytes)", +"af66eb1f": "LogWithdraw(address)", +"af6704ee": "NehalCoins()", +"af67cdc4": "HBToken()", +"af685482": "BonusChanged(uint8,uint8)", +"af68a2c4": "getMyGameDividends()", +"af68dd3f": "getBaseInfo(uint256)", +"af692e00": "getPullRequestById(bytes32)", +"af6972c0": "submitDeliveryCommitment(address[2],uint32,uint64[3],bytes32[],bytes32,uint256[2],uint256,bytes32,bytes32,uint8)", +"af6a2c5c": "JTCCtoken(uint256,string,string)", +"af6afce5": "min(int256[])", +"af6b08a1": "Sale(address,address,uint256,string,uint8,string,uint256,uint256,uint256)", +"af6b3615": "getInitialReportStakeSize()", +"af6b3d43": "roundSwitch()", +"af6bb824": "_cancelSale(uint256,address)", +"af6bd8ce": "durations(address)", +"af6c0f60": "bntToken()", +"af6c3021": "MaxReleasedBac()", +"af6c7f77": "crowdSaleStartTime()", +"af6cd244": "acceptAnswerAndFinalize(uint256,uint256)", +"af6d0437": "AtomicSwapRegistryConstructed()", +"af6ddad8": "shift_left(uint256,uint256)", +"af6df563": "withBonus(uint256,uint256)", +"af6e66e6": "Lockup36m(address)", +"af6f37a2": "getBasicTokenAmount(uint256)", +"af6f964d": "minReached()", +"af6fae22": "roomAvailable(string,uint256[],uint256)", +"af6fce9a": "RoyaltyInformationContractSet(address,address,bool)", +"af6fe8e2": "testGetToken()", +"af713566": "batch()", +"af713dda": "SUPPLY_FOR_PARTNERSHIPS()", +"af722ea7": "connectors(address,address)", +"af7296ec": "remainingBankroll()", +"af737da7": "_setClientLastPaidRate(address,uint8)", +"af738bbf": "setDepositoryDelegate(address)", +"af7520b9": "startingPriceOf(uint256)", +"af75ad2d": "createDispute(address)", +"af7665ce": "ethPriceFeed()", +"af769b54": "transferAcceptable(address)", +"af769eff": "Paper()", +"af76c4d2": "mined_blocks()", +"af76ccd7": "finishedPromotionIDs(uint256)", +"af77040e": "bonusIncreasePercentage()", +"af77649d": "paySmartContract(bytes32,uint256)", +"af77c473": "p_setGamePaused(bool)", +"af77ebee": "transfersOnOff(uint8)", +"af77f8bd": "setVIPBonus(uint256)", +"af7885b5": "listSubName(bytes32,uint256,uint256)", +"af78facf": "valueBonuses(uint256)", +"af7912a1": "bonusTake()", +"af791df2": "recoveryDone()", +"af794a4f": "tulips(uint256)", +"af79b437": "MintingDisabled()", +"af79ffde": "userInitialized()", +"af7a0899": "firstStageWallet()", +"af7a1762": "getBetfundingAddress()", +"af7a6164": "setMaxMessagesGlobal(int32)", +"af7b2eb7": "listAddresses(address[],uint256[])", +"af7bcf5e": "LigoToken(uint256,string,string)", +"af7bfd6c": "setValueAny(uint256)", +"af7c8f96": "changetokenBurnAddres(address)", +"af7d0eff": "setSellPrices(uint256)", +"af7d1890": "adminAddICO(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"af7d469c": "setGeneratorAddress(address,address)", +"af7d4b21": "RXPSale()", +"af7d5ebe": "change_p4(uint256)", +"af7d697e": "EnableTransfer()", +"af7d6ca3": "spend(address,uint256)", +"af7e8577": "TCCCoin()", +"af7ed9d7": "maxGasPriceInWei()", +"af7fdd76": "setModified()", +"af80562c": "testReceiveHash()", +"af819c67": "TTCSale(address,uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"af81bd03": "_voteAndCheck(uint256)", +"af81c5b9": "addToken(address,uint256)", +"af8214ef": "LIMIT()", +"af82403c": "getNextNode(bytes32)", +"af8255ab": "updateProgress(uint256,uint256)", +"af825c78": "Hjjm()", +"af83782e": "setMinimumWishTribute(uint256)", +"af837832": "isPromo(address,address)", +"af83f252": "historyRed(uint256)", +"af8472b1": "consecutiveDeaths()", +"af84fb00": "withdrawAmount(uint256,uint16)", +"af8532e3": "roundDeadline()", +"af854db1": "allowedTransferDuringICO(uint256)", +"af857a84": "batchTrade(address[13][],uint256[15][],uint8[2][],bytes32[2][],bytes32[2][])", +"af862b6a": "ETH_withdraw(uint256)", +"af874a76": "isValid(address,address)", +"af87c366": "walletUnlock(address)", +"af87c833": "initiateProvider(uint256,bytes32)", +"af8927c1": "GetRealCost(address,uint32)", +"af8979fd": "confirmDeath()", +"af8996f1": "setPublicationFee(uint256)", +"af899735": "playGame()", +"af8a849c": "AllocationGranted(address,address,uint256,bool)", +"af8af39f": "setRate555()", +"af8b0ec7": "rewardRoto(address,uint256)", +"af8b7525": "CollectAndReduceFees(uint256)", +"af8b912d": "setVotingMachine(address)", +"af8c1946": "refundAllEther()", +"af8d5a48": "icoEndTimestampStage()", +"af8d7611": "setPointIdentifier(string,int256)", +"af8d98c9": "gameEndPlayNo()", +"af8d9f37": "addressContainsContract(address)", +"af8ec44c": "offerGanTokenForSaleToAddress(uint256,address,uint256)", +"af8f35c4": "_fallback()", +"af8f7fdf": "ProductUpdated(address,address,address,string,bool)", +"af8ff2f8": "runPreMint(address,uint256)", +"af906cf3": "setToken(uint256,address)", +"af91b947": "UnsuccessfulAttempt(address)", +"af91c5fd": "getVotersChoice()", +"af91e0bf": "freezeOracle()", +"af92080b": "downTick(address)", +"af92a693": "addRegistrar(address)", +"af933b57": "withdrawEther(address)", +"af93a6d1": "CatNamed(bytes5,bytes32)", +"af93aebb": "adjustPhaseBasedOnTime()", +"af93afdd": "Shipment(bytes,bytes,bytes,bytes,string,bytes,uint256,uint256,bytes,bytes,uint256,uint256,string,bytes,bytes,bytes)", +"af93e308": "HookToken(address,address,uint256)", +"af941129": "testMintGuyAuth()", +"af944fc7": "getQueueLenght()", +"af949df9": "isValidUser()", +"af9658cd": "custodianVerify(address)", +"af988341": "sendLink(string,string,string)", +"af9890aa": "GUS()", +"af98cfd6": "exchangeByBuyer(uint256,uint256)", +"af98f757": "cancelRequest(address)", +"af99a327": "finalizePartnerSale()", +"af9a3f9b": "hashName(string)", +"af9a51c6": "getComponents(uint16,uint8,uint256)", +"af9a91d9": "setDrawerFee(uint256)", +"af9a99fa": "updateDates(uint8,uint256,uint256)", +"af9afe73": "unmintTokens(address,uint256)", +"af9b192e": "RESERVE_AMOUNT()", +"af9b1cef": "transfer_funds_to_project()", +"af9b6bd2": "bidEMONTMin()", +"af9bbcc4": "unbanAccounts(address[])", +"af9c5e7a": "getWhitePlayer(bytes32)", +"af9cb8c0": "StartOfPayments(address,uint256)", +"af9cb9f6": "setRequiredStake(uint256)", +"af9dfd1a": "FoodTokenEmissionEvent(address,address,uint256,bool,uint256)", +"af9ee81d": "_unstake(address)", +"af9efd4c": "_api_PlaceBet()", +"af9f3e20": "BTCVERVIER()", +"af9f788c": "TankWithdrawSome(uint256)", +"af9fc8a8": "UHC()", +"afa01c90": "CollectibleIndex4()", +"afa03ac9": "doFailingTransfer()", +"afa0f8c9": "getUintCoinProduction(address,address,uint256)", +"afa12a8a": "roundEnds()", +"afa17725": "WillyCoin()", +"afa1d6c9": "mainSaleTokenRaised()", +"afa202ac": "setRolesContract(address)", +"afa25098": "returnCoins(uint256)", +"afa293d4": "getSource()", +"afa31744": "saleTokensAddress()", +"afa33fb8": "chkLockedB(address,uint256)", +"afa3a5d1": "SetdivForTransfer(uint256)", +"afa3de9b": "revokeUserLicense(address,string)", +"afa40bbd": "UNIT_PRICE()", +"afa4179d": "_getInvestorLockedAmount(address,address)", +"afa437c0": "callBackForRequestRandom(bytes32)", +"afa560b0": "transferToICAPCallGas()", +"afa5e0a9": "getCountry(uint256)", +"afa5e56a": "decExchangeBalanceOf(address,uint256)", +"afa5f45c": "changeDecimals(uint256)", +"afa60035": "doesAssetTokenExist(address)", +"afa60487": "getDocAsBytes64(uint256)", +"afa6c735": "PRICE_PRESALE()", +"afa72b9f": "CinderToken()", +"afa7a25f": "updateArtistsAccount(uint256,address)", +"afa902a0": "isAutoFowarding()", +"afa936b8": "deleteCertificate()", +"afa99860": "getTokenPrice(address,address)", +"afa9a86e": "tokensInPlay()", +"afa9f179": "toReal(int64)", +"afaaa654": "setEndIcoPreICO(uint256)", +"afaaf9f9": "DepositBroker()", +"afab2b0f": "inventoriesOfDate(uint256,uint256,uint256[])", +"afab729d": "EntrepreneurShop()", +"afabe8b4": "CALLToken(uint256,string,string)", +"afac8ed3": "rand(uint16,uint16)", +"aface2f1": "mintTokensFor(address,uint256,uint256)", +"afaebf3e": "setDispatcherAddress(address)", +"afaf6b2e": "AuditSafeGuard(bytes20)", +"afaf97e7": "privateSaleToken()", +"afb058ce": "teamTwoPrefix()", +"afb0db5f": "random3()", +"afb18fe7": "paymentTokenAddress()", +"afb2032b": "LuckChain()", +"afb390aa": "getIsSecondPhaseEndedByTime()", +"afb3a8e9": "accept2(uint256)", +"afb3ae7a": "SPECIALIST_ONE()", +"afb47bb3": "approveModeratorship()", +"afb4d2ee": "getM()", +"afb58d18": "setPriceOneToken(uint256,uint256)", +"afb688a2": "mineth()", +"afb6b9a5": "m_hardCap()", +"afb7e495": "eruptionThreshold()", +"afb95eed": "logApproval(address,address,bytes32)", +"afb97c20": "tokenTransferDelegate()", +"afbae469": "mediumSize()", +"afbb9d44": "ico1Bonus()", +"afbc4ebc": "OWNER_CUT()", +"afbcd19b": "CROWD_WAVE3_BONUS()", +"afbcd904": "setDataColla_001_001(string,string)", +"afbd3b7f": "minLot()", +"afbd8092": "CATRefundedForWei(address,uint256)", +"afbdaa05": "isInBlockFilter(address)", +"afbddfa9": "toggleFreezeTokensFlag()", +"afbde5c9": "getNumTopics()", +"afbea641": "SECToken()", +"afbec8df": "TheGrid()", +"afbfdd93": "Notonegoro()", +"afc01cb9": "getFinishTime()", +"afc0b5d3": "Crypto010()", +"afc0bf27": "registerName(string,address,bool)", +"afc0bf43": "setRecoveryInfo(bytes32,uint256)", +"afc0e324": "stringToBytes12(string)", +"afc17f80": "addLockedTokens(address,uint8,uint256,uint256)", +"afc24bfb": "getRules(uint8)", +"afc24e3d": "getChallengeAnswer(uint256)", +"afc2cc46": "SGEICO()", +"afc2f503": "allowEmployeeMigration(address,address)", +"afc361bc": "tokenFrozen()", +"afc3a2ad": "current_tier_sold_tokens()", +"afc3b688": "perc(uint256,uint256)", +"afc3c31f": "initDepositAccount()", +"afc48052": "mintBounty()", +"afc4a982": "PathCost(uint16,uint32)", +"afc6740e": "PricePerCafe()", +"afc6fe2e": "MaybePerformWithdraw()", +"afc75b1d": "SwissTrustToken()", +"afc797a6": "lastStealValue()", +"afc7c400": "ProICOPrice()", +"afc81953": "createGame(bytes32,uint256,uint256,bytes32,bytes)", +"afc83802": "setTotalWeiToBeDistributed(uint256)", +"afc88141": "WhitelistAddressdisable(address)", +"afc8fbc6": "MerkleAirDropToken(string,string,uint8,bytes32,uint256)", +"afca35e5": "QuadToken()", +"afcac546": "getByteSize(bytes32)", +"afcb0d3a": "place(int8)", +"afcc05c0": "buyRedirectFor(address)", +"afcc1286": "dtEnd()", +"afcc8676": "SMPLTSTToken()", +"afcced41": "CROWDSALE_GASPRICE_IN_WEI_MAX()", +"afcd565c": "createTile(uint16,uint8,uint8,uint8,uint32,uint16,uint64,uint64,address,uint8)", +"afcd6561": "getIdentifierFromSectionIndex(uint256)", +"afce2d62": "PoC()", +"afcee461": "DungeonRunAlpha()", +"afcf2fc4": "charityAddress()", +"afcfad6e": "getJobPayments(bytes32)", +"afd07e80": "getMiningWarRoundOfPlayer(address)", +"afd09bab": "quadrupler()", +"afd0a85a": "ListingCancelled(uint256,uint256)", +"afd0fd1d": "getDecimals(string)", +"afd20e33": "LOCKAMOUNT()", +"afd237bd": "getTxn(uint256)", +"afd23d4a": "STAGE_1_FINISH()", +"afd2d5f6": "OpinionToken()", +"afd3f79a": "_isCorrectQuarterBuyin(uint256)", +"afd42fd3": "addCloud(uint16,uint16,uint16,uint8,uint8)", +"afd51a6e": "updateLimit()", +"afd61d2c": "getBonusEgg(uint64)", +"afd6b607": "createRequestAsPayee(address[],address[],int256[],address,address,string)", +"afd7b21e": "companyCapital()", +"afd7b9ed": "angelStartTime()", +"afd7bf92": "noContract()", +"afd7d464": "FaradTokenSwap()", +"afd82067": "getScore()", +"afd8515e": "setTotumPhases(address)", +"afd8c8c4": "GasProxy(address,address)", +"afd8fd5f": "createToken(string,string,address)", +"afd925df": "setPermissionManager(address,address,bytes32)", +"afd9897e": "restTokens()", +"afda2dac": "jackPotC()", +"afda5460": "YDTToken()", +"afdac68d": "query(uint256)", +"afdb0970": "sendToBuyer()", +"afdbd499": "reclaimERC20(address,uint256)", +"afdc3823": "updateTlcTlr(uint256,uint8,uint8)", +"afdcd8ec": "RAZEN()", +"afdd4d23": "airDropValues(address,address,address[],uint256[])", +"afde86c1": "getHash2(address,bytes32)", +"afdebfe7": "setWeiRaised(uint256)", +"afdfaee7": "_preValidatePurchase(address,uint256,address)", +"afdfb804": "getVendors(uint256,uint256,bool)", +"afe007b6": "_transferAction(uint32,address,uint8)", +"afe0e33c": "reputationRewardLeft()", +"afe12e77": "withdrawWrongNode(bytes32,address)", +"afe14c19": "clean(address,address)", +"afe15cfb": "appealPeriod(uint256)", +"afe17129": "tokensStillInLockup()", +"afe18413": "placeOrder(address,uint256,address,uint256)", +"afe1d4cf": "setTechBonus3(uint256,string)", +"afe2ce0e": "setSaleAddr(address,bool)", +"afe38ade": "payoutWinners(uint256,address[],uint256[])", +"afe4720c": "toggleFeatured(uint256,string)", +"afe69bb0": "Create(bytes32,bytes32,address,address,address,uint64)", +"afe70413": "getCommissionForType(string)", +"afe76ab1": "calcProgress(uint256,uint256,uint256)", +"afe80b8d": "newCmas(uint256,string)", +"afe8abbf": "transferPresaleCoins(address,uint256)", +"afe8b652": "countriesCount()", +"afe948ce": "OKEToken()", +"afe98be1": "calculateId(uint256,uint256,uint32,uint256)", +"afe9c776": "XITC()", +"afec91c4": "icoInstalled()", +"afed762b": "toSlice(string)", +"afef07da": "ico2receivedTotal()", +"afef0e28": "MARKETING_supply()", +"afef25d7": "Puremail()", +"aff038e6": "sellForOtherCoins(address,uint256)", +"aff06fbd": "playerCancelActiveGame(uint256)", +"aff16621": "toSig(bytes)", +"aff177ca": "updateWhitelist(address[],bool)", +"aff1e0de": "crowdsaleTotal()", +"aff1f15f": "rate3()", +"aff21b00": "imOut()", +"aff21c65": "getMinimumEndowment(uint256)", +"aff23300": "UserWallet(address)", +"aff36885": "setBlockMaxVotes(uint256,uint256,uint256)", +"aff3a08e": "CreateFAP(address,uint256)", +"aff46572": "getMarketplaceContract()", +"aff4b849": "getMemberName(address)", +"aff4cbea": "SHIP_SLOTS()", +"aff57736": "getNumbersFromString(string,string,uint32)", +"aff5dff2": "getCreditsFor(string)", +"aff5edb1": "deregister()", +"aff6b3e8": "setupRace(uint256,uint256)", +"aff74c6d": "getTotalPeriods()", +"aff7bd49": "trackSell(address,uint256,uint256)", +"aff7fae4": "GodzSwapGodzEther(address,address,address)", +"aff8c7ab": "IkuraAuthority()", +"aff9b3cc": "getCarName(uint256)", +"aff9e954": "topOptions(uint256,uint256)", +"aff9f40d": "SaddleForSale(uint256,uint256)", +"affb62dd": "dAdd(bytes32,address)", +"affb672b": "realimmocoin(address)", +"affbe8ab": "ACNCToken()", +"affbf593": "withdrawExcess(address)", +"affc0670": "openVoting()", +"affca932": "changeFeeRate(uint256)", +"affcba25": "createNewMintableUser(address)", +"affcce10": "_unpackRaceData(uint256)", +"affd0dd4": "Funding_Setting_funding_time_start()", +"affe39c1": "owners()", +"affed0e0": "nonce()", +"affee29b": "submitEthToTokenOrderWHint(uint128,uint128,uint32,int256)", +"afff33f4": "GameEvent(uint256,address,uint8)", +"afff5064": "setBonusesForAmounts(uint256[],uint32[])", +"afff9720": "addrBounty()", +"b0005ff1": "validPresaleTrading()", +"b000c81b": "InitBetContract(address,address,uint256)", +"b000dec2": "total_token_sold()", +"b001134a": "balanceInTier()", +"b0011509": "calcMarketFee(uint256)", +"b00124c4": "epocum()", +"b00140aa": "getHash(bytes)", +"b0018bfc": "changeTokenName(string)", +"b0036d32": "mintByGateway(uint32,uint64,address,string)", +"b003dd86": "encode(uint256[])", +"b004079e": "lol(bytes32)", +"b0043308": "setaddAddressListItemSet(bool)", +"b00606a5": "confirm(bytes32,uint8,bytes32,bytes32)", +"b0062595": "KcashToken()", +"b006b86e": "_addEthereumAddress(uint256,address)", +"b006de0d": "initialBalanceForCrowdsale()", +"b006e2b0": "txhash(string)", +"b0070a30": "changeBeneficiary(uint256,address)", +"b00791fa": "proxy_contribution(address)", +"b0091773": "orderExecutionBlockTime(bytes32)", +"b009c50d": "DevxToken()", +"b00a0dbf": "allowanceTransfer(address,address)", +"b00a81fb": "buy(uint256,uint256,string,string,string,string,string)", +"b00b1239": "approveAndDeposit(address,uint256)", +"b00baa11": "DaicovoStandardToken(string,string,uint8)", +"b00bad50": "identifierToBuyoutPrice(uint256)", +"b00cdd9b": "preICOgoal()", +"b00d4c75": "singleLineWrong()", +"b00d70ca": "sollReserve()", +"b00dba63": "setTokenData(uint256,bytes32)", +"b00e8668": "can_refund()", +"b00eb9fe": "feeCalculator()", +"b00f9702": "setTeamPerfitAddr(address)", +"b0102e20": "equipMultipleTokens(uint256[])", +"b010d80e": "ensureTokensAvailable(uint256)", +"b010d94a": "canExitPool(address)", +"b0112ef2": "changeReserveCATDestinationAddress(address)", +"b0119a22": "genOrder()", +"b011fcf1": "doWithdraw()", +"b0128c08": "getCeiling()", +"b013b369": "_errorBuyingTokens(string)", +"b013f637": "getNicknameByAddress(address)", +"b013fa91": "JadeCoinMining(address,uint256)", +"b01454dd": "vrc()", +"b015b81a": "amountToTakeAsRake(uint256)", +"b015c2ce": "FLOWToken()", +"b0166b04": "testTransferringMkr()", +"b016f9f2": "ThirdAddressBalance()", +"b0171fa4": "getCurrentGenerationId()", +"b0175308": "PriceDecimals()", +"b017c036": "rlc()", +"b017d808": "assertEq32(bytes32,bytes32,bytes32)", +"b01800f8": "createNewUser(bytes32,bytes,bytes32,bytes32,address)", +"b0181b3c": "setMyIdentity(bytes32,string,string)", +"b018d65a": "maxAffiliate()", +"b0192f9a": "auctionManager()", +"b019ffd2": "thirdDiscountCap()", +"b01a71d8": "setProvider1(address)", +"b01ab46d": "validPurchase(address)", +"b01afdab": "changeBaseValue(uint256,uint256,uint256,uint256,uint256,uint256)", +"b01b0304": "ExchangeRateChanged(uint256,uint256)", +"b01b299f": "setTokenPriceProposal(uint256,uint256,uint256)", +"b01b3b6c": "_createSale(uint256,uint256,uint256,uint64,address)", +"b01b8877": "setFundingFueled()", +"b01c60b7": "getPrices(uint256,uint256)", +"b01d3d9e": "ENTToken()", +"b01d54ed": "PolyAi(uint256,string,uint8,string)", +"b01d5b63": "purchaseFor(address,uint16,address)", +"b01d7a11": "sendTokensToFive(address,address,address,address,address,uint256)", +"b01e8308": "JointToken()", +"b01ead43": "returnToOwners()", +"b01eba14": "MIN_TOTAL_AMOUNT_GET_ETH()", +"b01f1571": "unitsPerEth()", +"b01f31c9": "hardcapInTokens()", +"b0203f3f": "totalAmountsBetStage2(uint256)", +"b020b188": "developmentToken()", +"b020d7a3": "_reinvest(bytes32,uint256)", +"b021cace": "RubyCoin()", +"b0228f8c": "icoEtherReceivedMainSale()", +"b02447e0": "bonusChangeTime()", +"b024abad": "GoTokenDutchAuction(address,address,address,address,address,address,uint256,uint256,uint256,uint256,uint256)", +"b024b2e3": "GridyToken()", +"b0251e6d": "setUserLocked(address,bool)", +"b0259633": "SHIPToken()", +"b025abf1": "step0Rate()", +"b025cc45": "deadlines(uint256)", +"b0267126": "advisorySupplyRemaining()", +"b0271023": "verifyFile(string)", +"b0273de1": "addVpf(bytes32,uint256,uint256,uint256,uint256,uint256[])", +"b028c059": "createMatch(uint256,string,string,int32,int256,uint64,uint64)", +"b028d73a": "isCrowdsaleAllowed()", +"b028ee13": "s2b(string)", +"b0293850": "claimBuyerFunds(address,address,address,uint256)", +"b029c2c8": "approve_unwanted_tokens(address,address,uint256)", +"b029d940": "setPlatinumAddress(address)", +"b02a2fd1": "withdrawLemonCoins()", +"b02a73a1": "sendTo(address,uint256,bytes)", +"b02af038": "bonusesSold()", +"b02b69d6": "addBonus(uint256,uint256)", +"b02bf4b9": "earn(address,uint256)", +"b02c43d0": "deposits(uint256)", +"b02c8054": "withdrawICO(uint256)", +"b02da8d8": "diamondBonus(uint256)", +"b02dbd07": "teamAllowance()", +"b02e8496": "processSellRequest(string,address,uint256,uint256,bool)", +"b02ef382": "SALE1_END()", +"b02f1edc": "TokenERC20(string,string)", +"b02f53ae": "testConcatStorage31Bytes()", +"b03031b7": "_askQuestion(bytes32,bytes32,address,uint32,uint32)", +"b0304813": "currentMilestone()", +"b03053b6": "createListing(uint256,uint256,uint256)", +"b0321d45": "ZJMToken(address,address)", +"b03260be": "scheduleTransaction(uint256,address,bytes)", +"b032fff4": "weiMaximumAmount()", +"b0335ffc": "setStage(uint256,uint256,uint256,uint256,uint256)", +"b033777f": "endCurrentGame()", +"b033a02b": "payDivsValue(uint256,string)", +"b033a6c3": "lookup(address,uint256)", +"b033cab9": "voterStakes()", +"b0340123": "votingToken()", +"b0347c56": "estimatePots()", +"b0349184": "clearRecords(bytes32[])", +"b0349650": "_removeControllerByPartition(bytes32,address)", +"b034998b": "ChooseBwea()", +"b034d5aa": "Total_Deposits()", +"b034f3cf": "myLatestBid()", +"b0355b45": "LuHuToken(string,address)", +"b03645b5": "max_users()", +"b036ab65": "LemoSale(uint256,uint256,uint256)", +"b037e4f5": "MCoin()", +"b0388344": "readTaskCreatedOn(string)", +"b03903fd": "usernames()", +"b03941bc": "dropable()", +"b0397857": "secondaryListing()", +"b03b3a0a": "setPOOL_edit_13(string)", +"b03c4b33": "setLock(address,bool)", +"b03c6729": "inmax()", +"b03cf9bd": "MerkleAirdrop(address,bytes32)", +"b03d169c": "mineCount()", +"b03d5ce8": "PVCToken(address)", +"b03e02ad": "bluemoontestToken()", +"b03f75a5": "giveupBid(bytes32)", +"b04010c6": "fuse()", +"b0402d36": "LiveAuctionEvent(address,uint256,uint256,uint256,uint256)", +"b0407315": "purchaseWarehouseSpace(address,uint256,uint256)", +"b0408721": "buyVouchers(uint256)", +"b040d545": "tokenToTokenSwapOutput(uint256,uint256,uint256,uint256,address)", +"b0414a2d": "setMinimumGasLimit(uint256)", +"b0417e98": "checkVote()", +"b0419107": "_getNthNibbleOfBytes(uint256,bytes)", +"b042307d": "_isInterceptableMsg()", +"b0423141": "StringStorage(string)", +"b04247e9": "DentacoinAddress()", +"b04287b3": "sharesOfVault(uint256,address)", +"b0433fe9": "_supportsERC165(address)", +"b0445a77": "PRIME_VESTING_DATE()", +"b04464cd": "ChangeImage(string,uint256)", +"b0448884": "updatePrice(bytes10,uint32,uint64,uint32)", +"b04510d5": "xultoken()", +"b0459d49": "LoanStandard(address,address,uint256,uint256,uint256,uint256,uint256)", +"b0467deb": "getUser(uint256)", +"b0471d43": "primary_wallet()", +"b047dd06": "tokensale(address,uint256,uint256)", +"b047ee56": "getBalance_Token1(address,address)", +"b047f245": "listForSale(uint16,uint256)", +"b047fb50": "cooAddress()", +"b048357d": "lastBlock_a15()", +"b0483c3f": "reload(uint256,uint256)", +"b048546f": "Divide(uint256,uint256)", +"b0485706": "read_u32_array()", +"b048e60d": "FebToken()", +"b049474d": "disableSuicide()", +"b049d176": "cancelSellToBlackMarket(uint256,uint256,bool)", +"b04a1680": "GetConsentDirective(uint256)", +"b04a3f1c": "EndLottery()", +"b04b3f57": "isCustodian(address,address)", +"b04ca7f0": "dateAdmin()", +"b04d6638": "mangeFundAmount()", +"b04e74f2": "Gerritcoin()", +"b04e7668": "createCastleWithToken(address,uint32,string,uint64,uint64,uint64,uint64,uint64,uint64)", +"b04eb639": "subCrystal(address,uint256)", +"b04fc4e1": "superContract()", +"b05005a2": "lock(uint128,string,address,bytes16,uint32)", +"b050b49c": "rewardFoundersAndPartners()", +"b050f83a": "proportion(uint256,uint256,uint256)", +"b051d722": "loadRandom(uint256)", +"b052852f": "approveAllocation(address)", +"b0532349": "_destroyContract()", +"b054058a": "nSign(uint256)", +"b0544308": "newLockTimestamp(uint256)", +"b0545532": "numGamesCompleted()", +"b0547d8c": "deleteShopMods(address)", +"b0557bf1": "updateParams(uint256,uint256,uint256,uint256)", +"b055a62a": "INCRYPTHEDGE(uint256,string,string)", +"b055d1bc": "amountProportion()", +"b055fdf2": "isTarget()", +"b05609ce": "pricegreengrey()", +"b0560eba": "GuardaProva(address)", +"b056561a": "DATE_31_DEC_2022()", +"b056bb81": "RedSoxYankees410()", +"b0573de6": "getDefaultPartitions(address)", +"b0575069": "ap(address)", +"b05784b8": "retreive()", +"b0578878": "translate(address)", +"b05940f2": "getOpenAuctions()", +"b059c177": "_0_name(uint256)", +"b05a0071": "DET()", +"b05a47d9": "VocToken()", +"b05d8096": "setStr(string,uint256)", +"b05e390a": "TokenEther(string,string)", +"b05eb08d": "_isLeapYear(uint256)", +"b05f1b88": "getAmountOfTransactionsInProposal(uint256)", +"b05f99f5": "changeInvestment(address)", +"b05fa837": "patronageContractForUsername(string)", +"b05fceba": "mDepositWallet()", +"b05fef55": "Issuer(address,address)", +"b0603326": "auctionStatus(bytes32)", +"b0604a26": "schedule()", +"b0604a9c": "testCantBuyTokensInStoppedSale()", +"b060b785": "getWithdrawableOperationFeeDatesAndAmount()", +"b060de3a": "withdrawAllOptions(address[])", +"b0619e85": "hasPermission(address,bytes32)", +"b0623074": "frozenTime(address)", +"b063152a": "generateHash(string)", +"b064bb56": "_ltoa(bool)", +"b064ca18": "userForceGameEnd(uint256)", +"b06576f3": "contrBonus(uint256[])", +"b0660c3d": "transfersAllowed()", +"b0667cf8": "queryPrice()", +"b066d3b7": "removeReputation(address,uint256)", +"b066dca9": "MERZhToken()", +"b066ef3c": "cooldown(uint32)", +"b0670cc9": "get_size()", +"b0671381": "isValidWalletSignature(bytes32,address,bytes)", +"b0673d57": "getItemStore(bytes32)", +"b0686584": "incNT()", +"b068776b": "SaleFinished(uint256)", +"b068b5b8": "getRank01()", +"b06939a2": "notEqual(address[],address[],string)", +"b0698763": "subdomainOwner(string,string)", +"b069dbf1": "sendFromContract(address,address[],uint256)", +"b06bcb40": "getAddressInfo(address,address)", +"b06c76d0": "totalMinedSupply()", +"b06df18e": "transfer(bytes20,address)", +"b06df2ae": "GetMyOrders()", +"b06e1e02": "changeTeamWallet(address)", +"b06e64ca": "maxTokensWithBonus()", +"b06eb03f": "DSEasyMultisig(uint256,uint256,uint256)", +"b06ee044": "totalBasicIncome(address)", +"b06eedf5": "getReferralBonusAmount(uint256)", +"b06f4d00": "AICoin(uint256)", +"b06f8d34": "redeemWallet()", +"b06fd1e3": "CRAWDSALE_START_DAY()", +"b06fe82e": "changeEtherRatioForOwner(uint256)", +"b07048d9": "remove_user(address)", +"b0705e44": "getMySword()", +"b070bbd4": "doCalculateRoom(uint256,uint256,uint256,bytes32,uint256)", +"b070bdc6": "all_obstacles()", +"b071cbe6": "hardcap()", +"b071fa2a": "SENC_HARD_CAP()", +"b0720613": "fundingMinInWei()", +"b072bd10": "usedSummReserve()", +"b0732278": "finishICO(address,address,address)", +"b073e2b7": "testMath()", +"b073f52b": "updateBalance(bytes32,uint8,int256)", +"b0756562": "addLottery(string,uint32,uint32,uint32)", +"b07576ac": "delMin()", +"b0759c3e": "lockInBatches(address[])", +"b0773d12": "payAndRemoveInvestor(uint16,uint256)", +"b07741fd": "refresherFee()", +"b077c09b": "readSample(bytes)", +"b0780bd8": "getDonationStats()", +"b0786de9": "NeptunSupply()", +"b078ffe8": "BitcoinUnicorn()", +"b0792570": "beneficiaryStake()", +"b0799375": "nameValue()", +"b079cf62": "getRandomDragon(uint256)", +"b07a3107": "isOraclizeQueued()", +"b07a6735": "processPrivateFunding(address)", +"b07bbefd": "updateValueAndMint(uint256,uint256,int256)", +"b07be1fe": "createThemedSpinner(string,uint256,address,uint256)", +"b07be207": "calculateTicketPrice()", +"b07c76e8": "LoggedDividend(uint256,string,uint8,string,bool,bool)", +"b07e4e34": "_unpackCycleValue(uint256)", +"b07ed982": "setMaxTokenSupply(uint256)", +"b07ee0d2": "erc20TokenTransfer(address,address)", +"b07f0a41": "exercise(uint256)", +"b07f1fa2": "init(address,uint256,uint256,uint256,uint256,uint256,uint256,bool,address)", +"b07f3025": "CROWDSALE_ETH_IN_WEI_FUND_MAX()", +"b081b9aa": "propose_beneficiary(address)", +"b081cfc5": "_thresholdOne()", +"b0827f42": "restrictedTokensDate()", +"b082b9c7": "getOrganisationCount()", +"b0837524": "minIcoTokenLimit()", +"b08428c1": "internalCalc(uint256)", +"b08480d4": "finishSettlement()", +"b08496dd": "_newSpaceshipProduct(uint16,bytes2,bytes2,bytes2,bytes2,uint256)", +"b08510a3": "setdissolvedcontract(address)", +"b0859b6f": "oraclize_setGasPrice(uint256)", +"b085a5af": "getMyWine()", +"b085b9a5": "Example()", +"b08639e3": "getRepAvailableForExtraBondPayouts()", +"b0867a5c": "joinGameRandom(uint8)", +"b086d5aa": "getUriSetCount()", +"b087b8bc": "getWorkflowCount()", +"b0882c4b": "newETHUSDPrice(string)", +"b0883120": "balanceOfBuyer()", +"b0885dd6": "distributeWithTransferFrom(address,address,address[],uint256[])", +"b0891f4f": "setTokenAgent()", +"b0894aa6": "getDateOfAcceptance()", +"b0898886": "claim_devidend_for(uint256)", +"b08a3619": "registerDepositAddress()", +"b08af3dd": "get_participant_num_of_uses(address)", +"b08b3410": "getStraightReleasableAmount(address)", +"b08ba6a1": "view22()", +"b08bbff0": "isUserAllowed(address,string)", +"b08c2915": "JP_winningHash()", +"b08c7730": "feeGame()", +"b08c9bd1": "refuseSale()", +"b08cfb84": "addWhitelistedAddress(address,address)", +"b08d2718": "ReleaseableToken(uint256,address)", +"b08db494": "toAddress(bytes,address)", +"b08e0d3e": "applyRefund(uint256,bool)", +"b08e0f4a": "manualWithdrawal(uint256)", +"b08f8e1d": "setContractHoldBalance(uint256)", +"b08f965e": "SSA()", +"b090c768": "LogSelectWinner(uint256,uint256,address,uint256,uint256,uint256)", +"b09173f6": "viewAffBonus(address)", +"b091a044": "transferRecord(address,address,uint256)", +"b092145e": "whitelist(address,address)", +"b0927de7": "newRepo(string,address)", +"b0933f25": "fixAdvance(uint256,uint64)", +"b0934d7d": "removeFromBlackList(address,address)", +"b0949833": "NineStandardToken(uint256,string,uint8,string)", +"b0950b8c": "canCloseVoteCommitPhase(address,bytes32,bytes32)", +"b09609d5": "LogMinting(address,uint256,uint256)", +"b097bdbd": "PRESALE_STARTTIMESTAMP()", +"b097c984": "setIEOAddress(uint256,address)", +"b098b86b": "ownsOrSelling(uint256)", +"b098bdba": "getAppeals(uint256)", +"b09938b8": "VormaToken()", +"b0994d4a": "authorizeOperator(address,bool)", +"b099cceb": "makeBet(bool)", +"b09ac6f2": "isUserProduct(bytes32,bytes32)", +"b09ad8a0": "upperBound()", +"b09afec1": "getTokenData(uint256)", +"b09b1a51": "buyUnicorn(uint256)", +"b09bc3bf": "try_to_get()", +"b09c0f30": "rewardWeekly(uint32,uint32)", +"b09c235e": "MargamCoin()", +"b09db392": "addressDevelopers()", +"b09df36a": "getFunctionSignatures()", +"b09f1266": "_symbol()", +"b09f168e": "tokenOfOwnerByRange(address,uint256,uint256)", +"b09f4af5": "executeLock(bytes16,address)", +"b0a0662a": "FIRSTSALE_BASE_PRICE_IN_WEI()", +"b0a08873": "adjustLoanParams(uint256,uint256,uint256)", +"b0a1bfa9": "updateFeeBalance(uint256)", +"b0a1c666": "newComment(bytes32,string)", +"b0a1e2b4": "disputeID()", +"b0a2365c": "percentTokensToSale()", +"b0a254a7": "addStackholder(address)", +"b0a267da": "userTipped(address,bytes32,uint256)", +"b0a54a76": "TN()", +"b0a5a57a": "createEmergencyFundReleaseProposal()", +"b0a5c979": "CheckAmbientHumdtyException(bytes32,uint32)", +"b0a66a84": "creator(bytes)", +"b0a6a5ab": "IoTonToken(uint256,string,string)", +"b0a6d947": "unfreeze(address[])", +"b0a77ef7": "WithdrawToSponsor(address,uint256)", +"b0a8489e": "btycBalanceOf(address)", +"b0a84974": "payedBalancesOf(address,uint256)", +"b0a8be37": "RegCost()", +"b0a91659": "FixProfit()", +"b0a94ef7": "Divest(uint256)", +"b0a9b0ff": "createTeam(string,string,uint256,uint256,address,uint256)", +"b0a9c7f4": "checkGameResult(address)", +"b0aa09f2": "mainSaleStartTime()", +"b0aab296": "getNextNode(bytes)", +"b0aae3fa": "passGateway()", +"b0abbc7b": "setData_23(string)", +"b0ac0ef2": "currentActiveGameID()", +"b0ac4c8c": "getLastData()", +"b0acc531": "reserveWave()", +"b0acd745": "EventCreateStatic(address,uint128,uint256,uint256)", +"b0acde14": "withdrawInternal(address,uint256,address[],uint256[])", +"b0ad38c4": "buildCity(string,uint256[2],uint256[2])", +"b0ad3a5f": "not(bool)", +"b0ae1d64": "getpurchaserAtIndex(uint256)", +"b0aed621": "addJugada(uint256,string,uint256,uint256)", +"b0af768b": "setTokenBurner(address)", +"b0b02c60": "setUpdateOperator(uint256,address)", +"b0b185c7": "allowedForwards(uint32)", +"b0b189ca": "sendToInvestor(address,uint256)", +"b0b24e2c": "ERC()", +"b0b2b499": "test_token_fall_back()", +"b0b315e7": "calculateMaxContributionUsd()", +"b0b3c9a6": "ETHERAFFLE()", +"b0b503f9": "MonyaToken()", +"b0b53a1f": "WSKYToken()", +"b0b60b06": "ZXGToken()", +"b0b773c4": "ESSgenesis()", +"b0b8579b": "hop()", +"b0b92263": "setTotalTokens(uint256)", +"b0b9603b": "saleTokens()", +"b0b99c7d": "createPotato(uint256,uint256,uint256,uint256,address)", +"b0ba621a": "SoapBox()", +"b0bb3759": "XPAAssets(uint256)", +"b0bc4d67": "preserveHolders(address,address,uint256)", +"b0bcc610": "scheduleTransaction(address)", +"b0bcd8f3": "preCrowdsaleOwner()", +"b0bd5888": "transferredTokens()", +"b0bdacc6": "setCoinAddress(address)", +"b0bebdf5": "endICOp1()", +"b0bed0ba": "selfBalance()", +"b0bed1e9": "SMSCoin()", +"b0bf092a": "getSoftCapInWeis()", +"b0bfe169": "changeAirdropLimit(uint256)", +"b0c0552f": "AuctionCreated(address,uint256,uint256,uint256,uint256)", +"b0c13bfb": "addDestroyer(address)", +"b0c1adac": "setPrice(uint256,bool,uint256)", +"b0c20e4a": "setRateProvider(address)", +"b0c2a163": "currentDifficultyWei()", +"b0c2ebfd": "NathalieToken(uint256,string,uint8,string)", +"b0c2ff43": "tokenAccountAddress()", +"b0c35c05": "autoBirthFee()", +"b0c39bbd": "setFreezeIn(address[],bool)", +"b0c42691": "frozenWallet2y()", +"b0c4b3bb": "dateEco()", +"b0c5134e": "forwardEther()", +"b0c577c1": "phase3TokenPriceInEth()", +"b0c6d7df": "clearMonsterReturnBalance(uint64)", +"b0c73bc6": "getInvitor(address)", +"b0c74430": "saysomething()", +"b0c7f709": "kingAutomaticCollectFee()", +"b0c80972": "setBalance(uint256,bool)", +"b0c8d2dc": "updateMeta(uint256,uint256,string)", +"b0c8f9dc": "add(string)", +"b0c95b1d": "SetAccess(address,uint256)", +"b0c9fec7": "ButtonClicked(address)", +"b0ca2e62": "VEC()", +"b0cae18a": "WDNA()", +"b0cb3299": "checkIfOnUncle(uint256,uint256)", +"b0cbaab2": "exp(int128)", +"b0cbc8b9": "callContractFunctionByAddress(address,string,address,address,uint256,uint256,bool,bool,string,string,bytes32,bytes32)", +"b0cbe292": "_extendBadges(uint256,address,uint256)", +"b0cbea9f": "updatePoll(uint256,bool,uint256,uint256)", +"b0cc0596": "getUserOptOut(address,address)", +"b0cc3951": "manualEntry(bytes32,bytes32,uint256,uint256,address)", +"b0ccbf8c": "rageQuit()", +"b0cccbc3": "setFreezeOracle(bool)", +"b0cccc84": "validResult()", +"b0ce8668": "IJC()", +"b0cee590": "TwiceAWeekCoin(uint256,string,uint8,string)", +"b0cf0dcb": "revokeTokenGrant(address,address,uint256)", +"b0cf35f5": "getNewFallbackDeposit()", +"b0d08d3d": "setTxCount(address,uint256)", +"b0d12477": "listMAS()", +"b0d138e8": "bounty_percent()", +"b0d13a25": "retrieveEther(uint256)", +"b0d1a26c": "advisorTimeLock()", +"b0d26478": "setIdentity(uint256,address,address,string)", +"b0d2b936": "_isTxExistWithArgs(bytes32,uint256)", +"b0d3a396": "ADDITIONAL_BONUS_NUM()", +"b0d3ef3d": "isOpenFor(address)", +"b0d4ff96": "getMadeTX(uint256)", +"b0d54bcf": "setTradingFee(uint256)", +"b0d56da6": "ElephantToken(uint256,string,string)", +"b0d60c2e": "rawTransferFrom(address,address,bytes32)", +"b0d65d29": "partialWithdrawal(uint256)", +"b0d66291": "migratebyowner(address)", +"b0d79497": "allowOrRestrictMigrations()", +"b0d7fd9a": "NewListing(uint256,uint256)", +"b0d81f94": "lockTokensForFs(address,address)", +"b0d8a83c": "Osmium()", +"b0d8b51f": "getOwnedTokenIds()", +"b0d997d9": "bitGuildContract()", +"b0d9fef9": "udfVUPDestination()", +"b0dbce71": "setStreamityContractAddress(address)", +"b0dc1666": "DacToken()", +"b0dc63eb": "startWineryProductByRegulator(string,string,string,string,int256)", +"b0dcbce5": "payWithPLAT(uint256)", +"b0dd15a6": "paint_pixel(uint256,bytes3,uint256)", +"b0dd2858": "TokenBuyPresale(address,uint256,uint256,string)", +"b0dd478a": "setCountdown(uint256[5])", +"b0ddaddd": "shareBalance(address,uint256)", +"b0de0c40": "getBalancesList(uint8)", +"b0de1cb7": "publish(uint64,bytes,uint64)", +"b0ded9ce": "fechAllCandidates()", +"b0df5f81": "_computeWings(uint256,uint256,uint256)", +"b0df9e53": "getCards()", +"b0e0346e": "UNLB()", +"b0e09ac0": "test_validShouldThrow()", +"b0e0ef09": "withdrawTokensFrom(address,address,address,uint256)", +"b0e12715": "makeTrade(address,address,uint256,uint256,uint256)", +"b0e16cce": "removedotchtooffer(uint256,uint256)", +"b0e1aaa5": "getNumPresaleTokensBought(address,address)", +"b0e1f553": "whiteListingContract()", +"b0e24364": "CaerusToken(address,uint256)", +"b0e37f79": "isChecker(address)", +"b0e4925c": "BCIA()", +"b0e547e8": "referrerLevel2Percent()", +"b0e572c8": "getStrategy(bytes15)", +"b0e5aa82": "_rememberBlockHash(uint256)", +"b0e5aa89": "bonusStage2SecondDay()", +"b0e657a7": "firstMintRound0(uint256)", +"b0e667a9": "bidSpaceship(uint256)", +"b0e757c5": "GameXChange()", +"b0e849fe": "auctusWhiteListAddress()", +"b0e8cba8": "toggleContractAccessForEverybody()", +"b0e9a1ef": "setHodlerTime(uint256)", +"b0ea1e2e": "START_TS()", +"b0ea8d8f": "getRedeemableTokensStaker(bytes32,address)", +"b0eb5162": "closeGeneralSale()", +"b0ebb261": "withdrawGift()", +"b0ebefbc": "distributeFoundersRewards(address[],uint256[],uint256[])", +"b0ec2bed": "test_8_accessRestriction_UnderscoreAddMember_shouldThrow()", +"b0ecc878": "calculateEthToAfterschool(uint256)", +"b0ecca8f": "LookAtLastTimePerZone(uint256)", +"b0ed439e": "getMaxHolder()", +"b0ed656c": "claim(bytes32,bytes32,bytes32)", +"b0ed9774": "changeTakeoutWallet(address)", +"b0ee60a3": "_addLicenseTerms(bytes32,bytes32,bool,uint256,bool,uint256)", +"b0eeefea": "YANKEES(address)", +"b0eefabe": "setArbitrator(address)", +"b0f07e44": "registerData()", +"b0f0c96a": "hello(uint256)", +"b0f11234": "getMessageCommunicationHash(address,uint256)", +"b0f239e9": "totalCheque()", +"b0f23d80": "SetCountryCode(uint16,string)", +"b0f2b72a": "set_value(uint256)", +"b0f32e55": "ContractFactory(uint8,uint8)", +"b0f42dc4": "isPure(uint256,uint256)", +"b0f471dd": "_partFromProvider(uint256,address)", +"b0f5ae72": "exchangeEtherOnTokens(address)", +"b0f69523": "rentOut(address,uint256,uint256)", +"b0f72665": "multiSigDev(bytes32)", +"b0f7d744": "getBoughtTime(address)", +"b0f85a10": "airEndtime()", +"b0f94b16": "batchFishAquarium(uint256[],address)", +"b0f9ba74": "destroyEternalStorage()", +"b0f9f315": "accountClaimedReward()", +"b0fa4926": "buyLicenseForETH()", +"b0fa5032": "DDToken()", +"b0fb3095": "transferDividendBalance(address,uint256)", +"b0fc2c77": "peaceOf(uint256)", +"b0fc2d72": "grantPurchasedTokens(address)", +"b0fc9bdf": "lilitoken()", +"b0fd035b": "safeWithdraw(uint256)", +"b0fd935b": "registerCertificationDb(address)", +"b0ff4210": "BAFC()", +"b1000f23": "_airdrop()", +"b100ad20": "incremCounter()", +"b102bfbe": "getOwner(bytes)", +"b102f52b": "enterLottery(uint32)", +"b103bb58": "setMaximalInvestment(uint256)", +"b103c1dd": "claimCofounditTokens()", +"b103ef5b": "buyfp(uint256,uint256)", +"b10477c9": "getAntsSinceLastCollect(address)", +"b104c509": "earlyInvestorSupply()", +"b1050da5": "newProposal(address,uint256,string,bytes)", +"b105126f": "initLottery(uint256,uint256,uint256,int256)", +"b1057e9c": "sell2(address)", +"b105be51": "BoonyToken()", +"b105c904": "intrepidVouchersMinted()", +"b1063c19": "setMiBoodleVault(address)", +"b106ef69": "Tutoreum()", +"b1077666": "hitWin(uint256)", +"b107baa1": "minimunBTCToInvest()", +"b107e815": "bet(uint32,uint8[4])", +"b107ea12": "setDefaultAQL(uint256)", +"b1084ce2": "currentNorsefire()", +"b108501f": "WINNER()", +"b10908ff": "ACO_Token()", +"b1091e1b": "Ez()", +"b1099347": "buysTokens()", +"b109bc6d": "getUpVoteCount(bytes12,bytes12)", +"b109e894": "PRICE_VARIABLE()", +"b10c7544": "getCmd()", +"b10c7dc4": "revokeMembership(uint8)", +"b10cf224": "userUnlockToken(uint256)", +"b10d539b": "MergeStatus()", +"b10d5a52": "setTechnicalPercent(uint256)", +"b10d6060": "StorageToken(address,address,address[],uint256,string,string,uint8)", +"b10d6b41": "getDocument(bytes32)", +"b10e4172": "remove(bytes32,bytes32)", +"b10eabe8": "ADDOCoin()", +"b10ec8da": "LogPrepareContribution(address,uint256,uint256,uint256)", +"b10ed487": "minimumInvest()", +"b10f8583": "update(uint256,uint256,bytes32,bytes32)", +"b1103200": "poolEthCap()", +"b1110c29": "createTokenUri(uint8,uint8,uint8,uint8)", +"b1112507": "bonusDeadlineDefault()", +"b112349e": "get_my_dni()", +"b1135686": "votesIter()", +"b113d9dc": "tokensale(address)", +"b11408b7": "free1Of(uint256)", +"b1144c9a": "presaleAllocations(address)", +"b114b96c": "left99(uint256)", +"b11560c5": "removeFromWhiteList(address[])", +"b115d28c": "transferDaxsToken(address,uint256)", +"b1174177": "LogWhitelistRemove(address,uint256)", +"b117a3e8": "kingBank()", +"b118060e": "stringLength(string)", +"b1186efb": "decode(bytes,uint256,uint256,uint256,uint256)", +"b11873d1": "BOSX()", +"b11888d6": "testThrowOnTransferWhenNotCreator()", +"b11894c9": "addBadToken(address)", +"b1194648": "setSaleWeiLimitWithoutKYC(uint256)", +"b1194bc4": "setGlobalDelegation(address)", +"b1199a87": "resetMeter(address)", +"b11a19e8": "toString(bytes32)", +"b11a1b89": "setCoinContract(address,address)", +"b11a2a97": "setEDUPrice(uint256,uint256,uint256)", +"b11a41fb": "AfrFballCoinToken()", +"b11b40a1": "getDna2(uint256)", +"b11c4fd8": "approveAndCallcode(address,uint256,bytes)", +"b11cc099": "winPrize()", +"b11ce2db": "addContractAddress(address)", +"b11d8bb8": "revealVote(uint256,uint256,uint256)", +"b11dd097": "initEmployee()", +"b11e0acb": "supplyAvailable()", +"b11e3889": "bulkDepositTo(uint256[])", +"b11e3b82": "createEvent(bytes32,bool,int256,int256,uint8,address,address,bytes32[])", +"b11ec3b3": "MENSA1(address)", +"b1202774": "ico4Max()", +"b120c16a": "setReputation(address,uint256)", +"b120e1ef": "setTokenSaleDistribution(uint256)", +"b12155a9": "burnTokens2(uint256)", +"b121a199": "_transfer(address,address,bytes32)", +"b122a0ef": "joinCommunity(uint256)", +"b1233451": "setTerm(uint256,string)", +"b1237eae": "withdrawAmountTo(uint256,address)", +"b123f68b": "LogAddress(address)", +"b12673b2": "token10MstepCAP()", +"b1267579": "totalTokenRaiseWei()", +"b126d0e5": "createAndSellAllAmount(address,address,address,uint256,address,uint256)", +"b126dc4d": "blockIndex(uint64,uint64)", +"b127221d": "ICO_BONUS()", +"b127326e": "masterTransfersEnabled()", +"b1273db1": "batchSetInvite(address[],uint256[],uint256[])", +"b1275f9a": "addPlayer(address)", +"b1276a42": "addCurrencyExchangeRate(uint256,uint8)", +"b1283e77": "markets(uint256)", +"b1288c11": "bytes32ToString(uint16)", +"b128ca5c": "adjustCap(uint256,uint256,uint256,uint256)", +"b12931a6": "removeByValue(address)", +"b129497c": "john()", +"b12a8229": "tokenSaleEndTime()", +"b12b714f": "_add(uint256,address)", +"b12dca5a": "ergebnis(uint256)", +"b12de559": "invalidateOrdersBefore(address,uint256)", +"b12dff65": "relaxFundingCap(uint256,uint256)", +"b12e1449": "reserveEscrow()", +"b12e3e60": "voltTransfer(address,address,uint256)", +"b12e4410": "getTokenAddress(bytes32)", +"b12e5f09": "OpsManaged()", +"b12e9c41": "SYS_Token()", +"b12ed9ef": "FCOIN1122Token(uint256,string,string,uint256)", +"b12f9eab": "finalizeSet()", +"b12fe826": "addMod(uint256,uint256,uint256)", +"b13170d6": "Change_approvePay(address,bool)", +"b1321ed7": "payOutPercentage()", +"b1330ca9": "startVoting(uint256,string)", +"b133f39b": "_shuffleParams(uint256,uint256,uint256,uint256)", +"b13413b0": "allocateTokensToTeamAndProjects(address,uint256)", +"b1343ee9": "paymentsByUserId(uint256)", +"b1344271": "slasher()", +"b1347e9d": "mintsub()", +"b1356488": "getEndDate()", +"b135bbb0": "nextGameId()", +"b1366d5b": "bet(uint256,uint256,address,bytes32)", +"b1369e6a": "toFullUnits(uint256)", +"b13770af": "determinTID(uint256,uint256)", +"b13795af": "GDCNumber3()", +"b138251c": "fetchAllResult()", +"b138d500": "presaleAmount()", +"b138d838": "getContractEarnings()", +"b139275f": "transferto(uint256)", +"b139560b": "getCreateMarketEndTimeValue()", +"b139af17": "startSpaceship()", +"b139f780": "NRB_Common()", +"b13a2e1f": "chargeOwe(bytes32)", +"b13b4f2d": "wipe()", +"b13b6a2a": "_decreaseApproval(address,uint256,address)", +"b13bdfb6": "isAtMost(uint256,uint256,string)", +"b13c7047": "DragonKingTest(address,address,address,address)", +"b13c8fe0": "BILLION_TOKENS()", +"b13d5180": "checkAndCallApprove(address,uint256,bytes)", +"b13ef343": "Vesting()", +"b13fd2b8": "DividendAvailable(uint256)", +"b1401858": "levelOneBonus()", +"b1404198": "LogForwarded(address,uint256,bytes)", +"b1406a33": "buyNac(address)", +"b140bee5": "testFailBuyAfterClose()", +"b1418cf4": "payHouse()", +"b14201d0": "requestForArtistRegistration(bytes32,bytes32,bytes32)", +"b1429863": "test_oneFalseAssertNoMessage()", +"b1432cc3": "CrowdSale_Change_ReceiveWallet(address)", +"b1437e27": "tokenTotal()", +"b143c703": "createBarCodeData(bytes32,bytes32,int256,string)", +"b143c916": "getTeamPayouts(uint256,uint256)", +"b143d6fb": "setRunning()", +"b144a4d8": "DistributionSale()", +"b144adfb": "balance_of(address)", +"b14537b0": "maxContributor()", +"b145a5b8": "isInit()", +"b145c013": "checkPayout()", +"b146ba8e": "changeQuecoinAddress(address)", +"b146bdee": "cancelDigitalContract(string)", +"b14762bc": "setAirDropDestination(address)", +"b14781fb": "BITBalanceOf(address)", +"b14823e1": "logDisputeCrowdsourcerTokensMinted(address,address,uint256)", +"b148313e": "partnerSaleTokensPurchased()", +"b1483eee": "_TARGET_EPOCH_PER_PEDIOD()", +"b14904b4": "BTCET()", +"b14959dc": "setbonusDate(uint256)", +"b1498e29": "insert(string)", +"b149ece0": "joinPool(uint8)", +"b14a44ac": "_unregisterArtist(address)", +"b14cf5e0": "changeManager(address,address)", +"b14d703f": "Bitsonalite()", +"b14debe4": "getEthPhiRate()", +"b14e7bc1": "_isOperatorForPartition(bytes32,address,address)", +"b14ec275": "_createHero(uint256,uint256,uint256,uint256,address)", +"b14ecf18": "BlackSwan()", +"b14edac5": "destructo()", +"b14f2a39": "changeTreasury(address)", +"b14f6439": "finshCrowdsale()", +"b14f8432": "hasValidSubscription(bytes32,address)", +"b15089b1": "unlockBonusTokens(uint256,uint256,uint256)", +"b151c0c8": "ModuleRegistrar(address)", +"b15201b2": "MIN_TIME_EXPLORE()", +"b1523087": "_transfer(address,uint256,address)", +"b1527bd9": "CYFM()", +"b152f19e": "getFirstSchedulableBlock()", +"b152f6cf": "TOKEN_SUPPLY()", +"b152fbd1": "lockingRatio()", +"b1536051": "_contractFallback(address,address,uint256,bytes)", +"b154224e": "TimeLockMultisig(address,address[],uint256)", +"b1542d39": "_createCrab(uint256,uint256,uint256,uint256,bool)", +"b1546194": "TimeBoxToken()", +"b154dea6": "NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_ID()", +"b154f47c": "dev3Wallet2Pct()", +"b1557c2c": "lastContract()", +"b155c7d6": "devTokensIco2()", +"b155d434": "FINTIFLUSHKA()", +"b15651ff": "emissionPrice()", +"b156f79b": "FeeAddr2()", +"b1574b38": "toggleActive(string)", +"b157528b": "getERC20(address,address,address,uint256)", +"b157add3": "bonus_()", +"b157bfab": "VerEstadoSocio(uint16,uint32)", +"b157c5cd": "setJudge(address)", +"b15868eb": "GetVersions()", +"b15897cc": "setfreeze(bool)", +"b158a23f": "betOpen(uint256,string,string,string,string,bool)", +"b158b63f": "getBillOwner()", +"b1597517": "getPoolState(uint256)", +"b1598725": "CultureTravelFoundationAddr()", +"b159bcff": "COMPANY_ACCOUNT()", +"b159beac": "MINIMUM_QUORUM()", +"b159d61b": "addSellerSig(string,string)", +"b15a3647": "trade(uint256,uint256[3],bytes32,bytes32,uint8)", +"b15a72d8": "wagerPool13()", +"b15aa5b7": "getSignHash(bytes32)", +"b15addec": "Test1()", +"b15b2c29": "GetContractStateEarlyTerminatedByTenantSecDep()", +"b15d6f35": "requestChangeInsurer(address)", +"b15dc523": "minFundInEther()", +"b15dcc25": "query(address,bytes2,uint256)", +"b15fbfe6": "getFromAmountBooks(address)", +"b16020a0": "STBIToken()", +"b160a86b": "setKycHash(bytes32)", +"b1610080": "TravelNote()", +"b1610d7e": "VOTING_PERIOD()", +"b16219c6": "feeWithdrawTokenAll()", +"b1622818": "softWithdrawRewardFor(address)", +"b162a382": "updateName(address,bytes32)", +"b163cc38": "addBalance()", +"b1643e96": "changeFeeEVOT(uint256)", +"b1648152": "setBetMinMax(uint256,uint256)", +"b1649a2d": "cancelOrder(address,address,address,address,bytes32)", +"b1652b2f": "playerRollDice(uint256,address)", +"b16562fe": "fipsRegister(address,bytes)", +"b165a332": "getPercentageBonusForIco(uint256)", +"b1662d58": "setModule(address,bool)", +"b16661bf": "joinAgreement(bytes,uint8,bytes32,bytes32)", +"b166b55a": "LogRemainingHalvingSubsidy(uint256,uint256)", +"b166c1ba": "sendProfit(address,uint256)", +"b167c34e": "getTxAtIndex(uint256)", +"b167d512": "allowedSince()", +"b167fe1b": "getExploreItem(uint256)", +"b168da8a": "getCustodianName(address)", +"b1699e2e": "C(bool)", +"b16a4a52": "TokensUnfrozen()", +"b16a867c": "summary()", +"b16ab3a3": "emergency_token_withdraw(address,address)", +"b16afaf6": "OChain()", +"b16b1e28": "getAddressField2()", +"b16b8485": "setExchangeStart(bool)", +"b16bd58f": "maxTokenlossValue()", +"b16c09f0": "clearIssuanceData(address)", +"b16c9e59": "flexibleReward()", +"b16d0839": "RootsToken()", +"b16d0e38": "IBG(string,string,uint8,uint256)", +"b16d1538": "nonEthWeiRaised()", +"b16d22a0": "StopPaymens()", +"b16d2fd1": "winnerTicket()", +"b16d8622": "maxICOSupply()", +"b16dd130": "baseKernel()", +"b16deab2": "CentrallyIssuedToken(address,string,string,uint256,uint256)", +"b16eaafa": "PetsToken(address)", +"b16f4a3a": "GPaid()", +"b1700e61": "trackAddresses(address)", +"b17076b2": "RemoveProofOfOwnership(bytes32)", +"b1718455": "NUM_COIN_PER_AXIE()", +"b171ae40": "ethSold()", +"b171b18f": "triggerInvestment()", +"b171dee6": "_setCategories(address,uint256,uint256)", +"b17216f5": "mintForwarder(uint256,bytes32,address)", +"b17231ac": "sendTokens(uint64,uint256)", +"b1723215": "TestPersandToken()", +"b17346fd": "finalizeSeedSale()", +"b174734c": "pendingOwner1()", +"b175a0d2": "BONUS_TIER_3_LIMIT()", +"b17607e9": "costoken()", +"b1766617": "ganTokenNoLongerForSale(uint256)", +"b176a0b4": "RabbitArena(address)", +"b1782d18": "tgrNumber()", +"b17922f6": "onlyRoles(address,uint16)", +"b179882d": "RESERVED_PRESALE_CAP()", +"b179f4d8": "G5()", +"b17a56f7": "isTrustedLink(address,address)", +"b17a98b6": "withdrawAllToWithdrawalAddress()", +"b17a9e11": "confirmCustomer(uint256)", +"b17aa196": "_generateNewRandom()", +"b17acdcd": "collectFees(uint256)", +"b17b94c1": "testSystem()", +"b17c3f99": "confirmation(uint256)", +"b17c6ab8": "cancelSaleOrder(uint256)", +"b17d5938": "submitPool(address,uint256)", +"b17d8646": "EpisodeManager(address,address)", +"b17df316": "setMigratedBalance(address,uint256)", +"b17e8c4f": "tokensForplutonics()", +"b17eb9dc": "supporthill(uint256)", +"b17f0c1c": "tokenSaleWeiCap()", +"b17f5332": "EnterCode(uint256)", +"b17fc36d": "setSoftCapDeadline(uint256)", +"b18019bd": "_executeVote(uint256)", +"b1816f60": "TEMTicket(address,uint256,uint256)", +"b181954d": "addAttribute(string,bool,bytes32,string,string)", +"b18196f4": "GenexiToken()", +"b181a8fc": "resetContract()", +"b181d3d5": "GMF()", +"b1826ee7": "getLevelUpFeeByLevel(uint256)", +"b1829738": "setContractorsProfitAddress(address)", +"b184be81": "drain(address,uint256)", +"b18588fb": "updateGravatarName(string)", +"b185a8a4": "ChangedTokens(address,uint256)", +"b186eed8": "dealerDay()", +"b1871886": "growthReserve()", +"b1874b99": "INVESTMENT_USER1()", +"b187984f": "disableTransfer()", +"b187b6b1": "getBlockValueBalance()", +"b187bd26": "isPaused()", +"b1881225": "KEYS(uint256,string,uint8,string)", +"b188c70d": "feeMode()", +"b1895823": "mintMultiToken(address[],uint256[],uint256)", +"b189ad2a": "testErrorUnauthorizedAfterTransfer()", +"b189fd4c": "hash(uint256)", +"b18a02a4": "getPlayers(uint8)", +"b18a714e": "getReservedBalance(address)", +"b18a78e3": "currentBetAmount()", +"b18af4e3": "addProduct(bytes32,uint256,string,string,string)", +"b18bca4d": "countAbstentions()", +"b18c6847": "manualUpdateBalances()", +"b18d0c80": "getImageWidth(uint256)", +"b18de618": "EndQuestion()", +"b18e0ab8": "FooWallet(address[],uint256)", +"b18e4f5f": "appendKeyValue(string,string)", +"b18ef18c": "GlobalChain()", +"b18efff3": "GenesisCatsAdded(bytes5[16])", +"b18f1943": "ownersLength()", +"b1905727": "getPermissionManager(address,bytes32)", +"b19068c7": "minimumWager()", +"b19129b1": "addCustomertoBL(address,address)", +"b19183f2": "HodlReleased(bool)", +"b191f79d": "isJobStart(uint256)", +"b19208f3": "getPreIcoFunds()", +"b192da2d": "burnt()", +"b1933a0b": "getAllSharedAccounts(bytes32)", +"b1934151": "tokenScaleFactor()", +"b1936c24": "presaleOngoing()", +"b194073a": "getUmkaAddress(address)", +"b194c73a": "EpinToken(address,address)", +"b196aabb": "maximumBaseContribution()", +"b196f378": "weiLiquid()", +"b1972567": "lockAddresses(address)", +"b1976a02": "Get()", +"b197997a": "getCurrentYearMinedTokenCap(uint256)", +"b1987c7d": "NotaryPlatformToken()", +"b1989a2b": "calculateFadeoutToPool(uint32,uint256[9])", +"b198ef45": "checkVotingForAllowTransfer()", +"b1999937": "leapYearsBefore(uint256)", +"b19a4540": "allocatedEth()", +"b19a5f62": "placeOpenPurchaseOrder(address)", +"b19ab052": "withdrawEtherManually()", +"b19ab945": "maxBurnThreshold()", +"b19b1550": "FintechnicsPublic()", +"b19b2162": "refundFailedAuctionAmount()", +"b19bc02e": "Griddeth()", +"b19c0f5e": "registerForCompetition(address,address,address,address,address,uint256,uint8,bytes32,bytes32)", +"b19d134d": "reviseNumAvailable(uint256,uint256)", +"b19d4916": "setCompte_2(string)", +"b19d632b": "publish(bytes32,uint256)", +"b19e288c": "set_pauseCWC(bool)", +"b19f30e2": "changeKYCAddress(address)", +"b19faed8": "doSucceedingApprove()", +"b19fde5a": "getPresaleAllocation(address)", +"b1a00406": "getactendlen()", +"b1a0570d": "mintBIX(address,uint256,uint256,uint256)", +"b1a06ee7": "setPreSaleTokenExchangeRate(uint256)", +"b1a08010": "orderTrader(bytes32)", +"b1a11c92": "trashedTokens()", +"b1a1318a": "HolderAddress(uint256)", +"b1a1b3bc": "get_chronus()", +"b1a2bbd1": "TOTAL_TOKEN_CAP_OF_SALE()", +"b1a329d7": "optionPoolTotal()", +"b1a34e0d": "addClaim(uint256,uint256,address,bytes,bytes,string)", +"b1a3c6b4": "Balances_of(address)", +"b1a56055": "add_OEM()", +"b1a6676e": "isBurnActive()", +"b1a681c8": "receiveEtherAndData(bytes)", +"b1a6afd3": "declaration()", +"b1a7c005": "hashDelegatedTransfer(address,uint256,uint256,uint256)", +"b1a82e8f": "Jaak()", +"b1a8b25a": "returnBalanceToMainAccount()", +"b1a96135": "DMT_TotalSuply()", +"b1a997ac": "poke(address)", +"b1a9bd77": "settlementIsRunning()", +"b1a9f8a4": "_toString(bytes32[4],uint256,string)", +"b1aa6dfa": "finishInitOwners()", +"b1aac629": "addSoundEffect(uint256,uint8[])", +"b1ab0999": "supportKickoffQuorum()", +"b1ac478f": "_generateBattleReward(uint256,int32)", +"b1ad4c48": "getInvestorDividendsAmount(address)", +"b1adc241": "BalanceDB()", +"b1ae9017": "refundsall()", +"b1ae9887": "lastTreeId()", +"b1afe96b": "setMaxInvestorContributionInWei(uint256)", +"b1b2aef3": "testInsertProductIntoCart()", +"b1b30533": "contractTokenWithdrawToFreeTokens(address,uint256)", +"b1b3d3f6": "allow()", +"b1b5537c": "activateCycle(uint256)", +"b1b68cce": "getListIndices(address)", +"b1b68fad": "makeTradable()", +"b1b6a6ed": "addPremineAllocation(address,uint256)", +"b1b6aecb": "SLMToken()", +"b1b79120": "setFightFactor(uint8)", +"b1b7c88f": "getPreSaleBonusRate(uint256)", +"b1b82922": "_getProviderRateHistory(uint256,uint256,uint8)", +"b1b96fdf": "giveTokens(address[],uint256)", +"b1b9e78d": "acceptOffer(address,uint256)", +"b1ba6ad7": "privateSaleAddress()", +"b1bb1a60": "serviceGroupChange(address,address,uint8)", +"b1bb4d35": "proxyMint(uint256,bytes32)", +"b1bb5855": "maxTicket()", +"b1bb5fde": "runningDebt()", +"b1bb7e0f": "verificationPeriod()", +"b1bbc6f5": "onlyBouncerSetGasRefund(bool)", +"b1bbd453": "winnerWithdraw(uint256)", +"b1bcc1b7": "depositOrder()", +"b1bd7683": "maxAvailableForSale()", +"b1bd7b80": "transEther()", +"b1be53e9": "getCancel(bytes32)", +"b1beb3c0": "NonActivationWithdrawal(address[2],uint256[7],uint8,bytes32[2],uint256)", +"b1bf0510": "getJobsBoard(uint256)", +"b1c0e063": "cancel(address[3],uint256[4])", +"b1c0f2df": "maxWithWhitelist()", +"b1c16a2b": "HARD_CAP_TOKENS()", +"b1c19c4d": "LetItPlayTokenPromo()", +"b1c23704": "myMethod3(string)", +"b1c23ce6": "saleContributions()", +"b1c25586": "lockTokens(address,uint256)", +"b1c30210": "setValidationData(uint16,uint16,uint8,uint8,uint8,uint8,uint16)", +"b1c32b2b": "updateAngelLock(uint64,bool)", +"b1c3c97e": "increaseTotalWinningStake(uint256)", +"b1c4b70d": "confirmLawfulness(bool,bytes32)", +"b1c5f992": "setAffiliateRate(uint256)", +"b1c62e8a": "createProductionUnit4()", +"b1c6517a": "LookAtNumberOfPlayers()", +"b1c6f883": "recordCreate(address,uint256,int256,bool)", +"b1c73525": "getKeccak256(uint256)", +"b1c8ac52": "minEthToContribute()", +"b1c90f6f": "ClaimingTimeLimit()", +"b1c9cc6c": "getSBounty()", +"b1c9fe6e": "phase()", +"b1ca3b3a": "_icoTokens()", +"b1cb0db3": "expires()", +"b1cb267b": "getE()", +"b1cb4217": "betContractUP()", +"b1cb43bf": "tokenToExchangeSwapInput(uint256,uint256,uint256,uint256,address)", +"b1cb574b": "setEarlyParticipantWhitelistMultiple(address[],bool[],uint256[],uint256[])", +"b1cb9425": "private_kill()", +"b1cc1d4d": "depositAndBundle(uint256)", +"b1cc38d0": "setShortPositionExpired()", +"b1cc4348": "placeWager()", +"b1cc7c60": "mintInterest(uint256)", +"b1cd221a": "redeem(address,uint256,string)", +"b1cd79de": "setlockaddress(address,uint256)", +"b1cdbe2a": "ELTC()", +"b1ce0a9b": "nextPayoutBlock()", +"b1ceb746": "acceptContribution(address,uint256)", +"b1cedd89": "PayPerkToken()", +"b1cee330": "arrayOfTokensByAddress(address)", +"b1cf404b": "sendTokensToOneAddress(address,uint256)", +"b1d006d6": "extendICO(uint256)", +"b1d0073b": "updateMaxNumMC(uint256)", +"b1d05422": "SendEmail(string,string)", +"b1d06c46": "moduleHandler(address[])", +"b1d0b725": "sellStatus()", +"b1d0fbc5": "uraniumplusToken()", +"b1d11f23": "setVesting(address,uint256,uint256,uint256,uint256,uint256,bool)", +"b1d17c98": "distributeTokens(address)", +"b1d1a159": "curRefNumber()", +"b1d1fed9": "multisigDXF()", +"b1d2372b": "JumboToken(string,string,uint256,uint256)", +"b1d27e3f": "setSmallPrice(uint256)", +"b1d3ea61": "salesContract()", +"b1d45fad": "HoneyBadger(address)", +"b1d4e357": "addTokenToFund(address,uint256)", +"b1d5114c": "Hawk2(uint256,string,string)", +"b1d51d31": "pay(uint64,address)", +"b1d66003": "getRareItemInfo()", +"b1d6a2f0": "saleAgent()", +"b1d7ee21": "discountMultiplier()", +"b1d919ed": "LogCertifierDbChanged(address,address)", +"b1d9647e": "ecoBuilder()", +"b1db1cac": "gameGetTokenBankrollList()", +"b1db9c2e": "WordCoin()", +"b1dbb87a": "DEVELOPER_FEE_PERCENTAGE()", +"b1dbeb37": "PRTC()", +"b1dce014": "buildTeamMapping(uint256)", +"b1ddf52f": "getAuctionByIndex(uint256)", +"b1de4f0f": "setOwnerMaster(address,address)", +"b1de74d6": "LOG_SpinsContainerInfo(bytes32,address,uint256)", +"b1e045f7": "sponsoredJackpotMax()", +"b1e05e8a": "extractBytes32(bytes,uint256)", +"b1e19d45": "whitelistBurnFrom(address,uint256)", +"b1e1c18f": "addToManagementWhitelist(address)", +"b1e1ff3a": "tokenMetadata(string)", +"b1e254c7": "mock_clear()", +"b1e2a116": "playersToTotalBets(address)", +"b1e2cb03": "newLottery()", +"b1e2e1dc": "rollRoom(uint256)", +"b1e2e28c": "YUPIE_PER_ETH_SALE()", +"b1e3301f": "checkFlags(uint16,uint16)", +"b1e35242": "getMeOutOfHere()", +"b1e37921": "setDefaultMintingAddress(address)", +"b1e3dd57": "availableTokensAmount()", +"b1e50702": "setConfigSetupContract(address)", +"b1e5e2b7": "openBox(uint256)", +"b1e776e3": "updateMarketCap(uint256)", +"b1e834b0": "totalPreSaleTokenIssued()", +"b1e8aea8": "turnBackTime(uint256)", +"b1e8cca8": "openWormhole()", +"b1e9292f": "min256(uint256,uint256)", +"b1e9932b": "claimAndConvertFor(address[],uint256,uint256,address)", +"b1e9b21d": "deletePokemon(uint256)", +"b1e9ee64": "addressChangeRequests(address)", +"b1eac37e": "jackpotAmount()", +"b1eb2c10": "getForecast(bytes32,bytes32)", +"b1ebcce1": "setTxcode(uint256,uint256,uint256)", +"b1ecb343": "recentPlayersBack()", +"b1ed795e": "withdraw_all_eth()", +"b1ed8c99": "stageFourEnd()", +"b1eefcc1": "_changeOwnership(address,address,uint256)", +"b1ef2e97": "setXPROMO_MULTIPLIER(uint16)", +"b1efbd6f": "setMinimumEthereumToInvest(uint256)", +"b1efc755": "operationAmount()", +"b1efeece": "assignedSupply()", +"b1f0a72f": "getSubmittedStateRoot(uint256,uint256)", +"b1f0e40b": "finanVestingStage()", +"b1f253f6": "theDividendsOf(bool,address)", +"b1f25ffe": "calcFutureDebt(address,uint256)", +"b1f29590": "totalTulipCount()", +"b1f2e537": "setIsTokenTransferOpen(bool)", +"b1f32231": "awe()", +"b1f35246": "setActualMinerAddress(address)", +"b1f395ea": "addPauser_(address)", +"b1f3b35c": "listeners(uint256)", +"b1f3ec87": "SafeasyToken()", +"b1f42430": "ZitKOINCrowdsale(uint256,uint256,uint256,address,address)", +"b1f4ff90": "filters()", +"b1f525c6": "counter(uint256)", +"b1f56187": "debugBuy()", +"b1f5b6da": "setTokensLimit(uint256)", +"b1f6bd0d": "deleteInvoice(bytes32)", +"b1f7cec8": "sendRemainingETH()", +"b1f8100d": "proposeNewOwner(address)", +"b1f864fb": "diamondIndexToOwner(uint256)", +"b1f9275f": "ENJ_UNIT()", +"b1f99cd5": "blockDotCoinbase()", +"b1fa884d": "FixedChain()", +"b1fc0792": "ICO_LEVEL_5()", +"b1fc756f": "getRefBonusPercent()", +"b1fc8466": "MAX_AVAILABLE_JOINTTOKENS()", +"b1fca956": "endTimeRound1()", +"b1fe1b4a": "weiRaisedICO()", +"b1fe3eef": "buyTokensFor(address,bytes32,uint256,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"b1fe5f58": "BIDDED()", +"b1fe933d": "incrementRedemptionAddressCount()", +"b2016bd4": "collateralToken()", +"b2019b8a": "EmtCrowdfund(uint256,uint256,string,string)", +"b202a9f4": "ERC223MintableToken(string,string,uint8,address)", +"b203bb99": "balance(address,address)", +"b204bb5d": "AddTicket()", +"b2057a6f": "inquireDividentAmount()", +"b205feb7": "stringToUint(string,int256,string)", +"b2067bd6": "ETHs(uint256,string,uint8,string)", +"b206eb42": "getImageDescriptor(uint256)", +"b207e32b": "testChangeRole()", +"b2085903": "Winner(address,uint32,uint32,uint32,uint256)", +"b208a600": "Nordic()", +"b20953f2": "isFiscal(bytes32)", +"b20a459d": "ZZZToken()", +"b20a4abb": "LogCustomSale(uint256,uint256,uint256,uint256)", +"b20a8779": "transferPreICOCollected()", +"b20b0ef5": "getAvailableCardCount()", +"b20b8403": "updateClaimFee(uint256)", +"b20baa00": "RegisteredToken(address,uint256,address,address)", +"b20bf95b": "setYearlyUSDSalary(address,address,uint256)", +"b20c0e43": "PHASE1_RATE()", +"b20c9f8b": "sellMaximumPossibleAmountOfTokens()", +"b20cc590": "allowedRoles(uint8)", +"b20cedc3": "getAdmin(address,bytes32)", +"b20d30a9": "setDailyLimit(uint256)", +"b20d3b1c": "vestingReleased(uint256,uint256,uint256,uint256,uint256)", +"b20de8f3": "TECHNOToken()", +"b20debeb": "Duckcoin()", +"b20e5a79": "getdecimals()", +"b20f41ab": "updateBaseComparable(int256)", +"b21089dc": "removeInvestmentPackage(uint256)", +"b210dac9": "confirmTransactionSig(bytes32)", +"b210e434": "functionThree()", +"b210f639": "PlatformAutonomyAddr()", +"b2112ce6": "beerContract()", +"b21287ae": "ToOwner()", +"b212a23e": "ethConvertRate()", +"b2138754": "verifyDocument(bytes32,bytes32[])", +"b213d77d": "editBalanceOf(address,address,uint256)", +"b2141ba4": "assertCompareBalance(uint256,uint256)", +"b21457e3": "getInvestorByIndex(uint256)", +"b214691c": "setAgent(address,address,bool)", +"b2148d38": "getBasicExtraBallotFeeWei()", +"b214ecda": "createGift(uint256,string,string)", +"b214faa5": "deposit(bytes32)", +"b215814b": "emtpyTo(address,address)", +"b215a879": "cg()", +"b215d2c9": "getCertainProducts(address,uint256,uint256,uint256,uint256,uint256,bool)", +"b215f30c": "changeWhitelist(address,address)", +"b2163482": "lockedAt()", +"b216c15d": "copyPopRequest()", +"b2170394": "getLastPaperFromContract(address,address)", +"b2173afd": "setzAddressesArray(address[2])", +"b21800d0": "TokenTransaction()", +"b2185bb1": "drawWinner()", +"b2186b05": "CrowdsaleSoftCapReached(uint256)", +"b2189168": "updateGame(uint256,string,uint256)", +"b2189d5a": "GetUserPELOBonus(address)", +"b218cf15": "registerToPool(address)", +"b2194fd8": "UinfoToken()", +"b219610a": "getRegionPurchasedAt(uint256)", +"b219c852": "firstStageTotalSupply()", +"b219e87b": "deleteCandidateByIndex(uint256,address)", +"b21a8be0": "isSuccessfulIco()", +"b21bce4c": "vote(bytes,bool)", +"b21c2475": "getWeiForRefund()", +"b21c2a68": "changeBZRxTokenContract(address)", +"b21ce425": "amountToTransfer()", +"b21cee7d": "get1TokenBuyPrice()", +"b21e4ebd": "itemOfOwnerByIndex(address,uint256)", +"b21ed44e": "percentForSale()", +"b2205a38": "xcertKyc()", +"b2210c91": "cashBalanceOf(address)", +"b22175db": "GetLikeCount()", +"b2225351": "verify(uint8)", +"b222cb0b": "selfRegister(bytes32)", +"b2237ba3": "setRatio(uint256)", +"b223d285": "releaseVanityUrl(string)", +"b2240566": "EOJ()", +"b2246f43": "Result(bytes32,address,uint256)", +"b224c40a": "vote(uint8,string)", +"b22528e4": "getUserEventsByIds(address,uint256[])", +"b225c23f": "updateCredit(address,uint256,uint256,uint256)", +"b225e08a": "whiteListTime()", +"b226ec29": "Gov(uint256,string,uint8,string)", +"b2280b48": "chairmanOf(uint256)", +"b2281442": "setMaxAbsKindness(int256)", +"b2288649": "lotteryBalance()", +"b22a7bfa": "migrateBalances(address,address[])", +"b22b2b66": "setKYCFull(address[])", +"b22c14c7": "multiPartyTransfer(address[],uint256[])", +"b22d9f50": "GallerionCoin()", +"b22dd140": "assetStaker(bytes32)", +"b22dd2ca": "R1()", +"b22e6fee": "get_pre_kyc_iconiq_bonus_denominator()", +"b230642d": "createSubscription(uint256,uint256,uint256)", +"b23096e9": "tokensTeamBlockedTimestamp()", +"b230eda1": "stageTwoSupply()", +"b2310cc5": "payRequstedSum(uint256,uint256)", +"b231e5cd": "STAGE_FOUNDATION()", +"b2322c40": "RabtestToken()", +"b2353d69": "updateRightLottery(address)", +"b2355b42": "setHomeDailyLimit(uint256)", +"b2356ad4": "tradingFeePercentage()", +"b2357392": "NewToken(uint256,string,uint8,string)", +"b23605eb": "PALToken99(uint256,address)", +"b2369f12": "getLockAccounts()", +"b236a3c9": "updateminAmount(uint256)", +"b236b068": "totalAlloctedToken()", +"b2378428": "LetsbetToken(address,address,address)", +"b237f7d4": "burnTokens(address)", +"b238724b": "setPendingValue(uint256,uint256)", +"b2389da8": "balanceOfFlurbo(address)", +"b238ad0e": "getDaysInMonth(uint8,uint16)", +"b2394040": "rateThirdWeek()", +"b239e2f1": "adventureHandler()", +"b23a0b90": "Henfruit()", +"b23a31e4": "getBrickIds()", +"b23b369b": "getPokemonLevel(uint256)", +"b23b4dd4": "incrementOwnedArea(address,uint256)", +"b23bc656": "setOverdraft(uint256,uint256)", +"b23c1f19": "mintTokenRewards(address,uint256)", +"b23c298c": "getNumberOfPayoutsForStaker(uint256,uint256,address,uint256)", +"b23d36b0": "isCheckStage()", +"b23d4854": "setTokenContractAddress(address)", +"b23db1be": "subtoken(address,uint256)", +"b23e35bf": "readLoveStory(bytes16)", +"b23f3594": "updateTeam(address)", +"b2401e1e": "nextDisbursement()", +"b2406905": "whoHasTheBiggestDick()", +"b240798e": "withdrawBet()", +"b241a020": "freeGameLockedToken(address,uint256)", +"b241b3b5": "getHarvestOperation(string,address)", +"b241ff03": "passPeriod()", +"b2427755": "minTrade()", +"b242c9c3": "getAmountRegistered()", +"b242e534": "transferOwnership(address,bool)", +"b24374a2": "omg()", +"b2444a70": "getParentA(uint256)", +"b2449d65": "YES()", +"b244b268": "SeeleCrowdSale(address,address,address)", +"b244c3f3": "ddftFundDeposit()", +"b2450b15": "openSoldTokens()", +"b24539a9": "getIcoTime()", +"b245923e": "proveIt(bytes32)", +"b245d6da": "coinIssuedIco()", +"b245fc92": "findNextMonth(uint256,bytes)", +"b2461b15": "upgradePermissionedSC(address,address)", +"b24626e9": "setAODevTeamAddresses(address,address)", +"b2467742": "CryptoPhoenixesCivilWar(address,address)", +"b2471e8e": "Fart(string)", +"b2478cfe": "recoveredIndex(address)", +"b247c525": "amountNeedToBeLock()", +"b247ed92": "getAllShipStats(uint32[])", +"b2481048": "newGlobalChanceNo()", +"b248e436": "IsBoilerExpire(address,uint256)", +"b248e4e1": "orderPriority(bytes32)", +"b2494df3": "getModules()", +"b2498a1f": "setPercent1(address,uint256)", +"b249bf01": "sendtoC(uint256)", +"b24a5425": "_setRoleCapability(uint8,address,bytes4,bool)", +"b24b09fd": "RefundEvent(address,uint256,uint256)", +"b24bf695": "getInvestorsAddresses()", +"b24c0a38": "setPreSaleParameters(uint256,uint256,uint256,uint256)", +"b24c35e4": "getRoundBetOrigin(uint256,uint256,uint256)", +"b24cb812": "removeAllowCnsContract(bytes32,address,bytes32)", +"b24ce5fa": "thirdCheckpoint()", +"b24d0c84": "addDat(string,string)", +"b24d8de2": "failedTemperaturesAt(uint16)", +"b24dced3": "setTransferFeeMin(uint256)", +"b24ec0b0": "LogStudentCertified(address,uint256,address,bytes32)", +"b250ce21": "CMC()", +"b251eb05": "MemberAdded(address)", +"b2523b67": "getReferenceAddressesOfCode(bytes32)", +"b252720b": "healthCheck()", +"b252ff2b": "threeHotHoursTokensCap()", +"b25302f6": "WineSupplyChain(address)", +"b25310b0": "DdosToken()", +"b25461ec": "cancelRequestPause()", +"b2549717": "setCalFactor(uint32,uint32)", +"b2550a53": "maxCyclePlayersConsidered()", +"b2552fc4": "annualInterest()", +"b2561417": "setMinimumGoal(uint256)", +"b2563a1b": "getMinimumLimit()", +"b256b093": "reservedForFounders()", +"b256dd6e": "WhosTheBossNow()", +"b2570b1c": "getBattleCardInfo(uint256,uint256,uint256)", +"b258eacf": "totalSupplyInt()", +"b2594125": "SurgeToken()", +"b2596a67": "levels(uint256)", +"b2596acd": "setForRent(uint256,uint256,uint256)", +"b25a00fd": "nativeToErcBridgesAllowed()", +"b25a7a9d": "calculateOwnership()", +"b25a80f4": "StoppableShareable(address[],uint256)", +"b25af26f": "applyForVisa(uint256,uint256)", +"b25ba6a7": "refundContribution(address,uint256)", +"b25bb3a7": "ownersGeneration()", +"b25c22b2": "approveMotion(uint256)", +"b25c372e": "prolongate(uint256)", +"b25cdccf": "fundingState()", +"b25e6181": "UnanimousConsent(address[])", +"b25e8973": "LBN()", +"b25ebbad": "_issueBitmark(address,bytes32,int256,uint256)", +"b25f539d": "registerUser(address,address,string,uint256)", +"b25f692a": "validateAndGetPurchaseTokens(address,address,uint256)", +"b25f8596": "PUBLIC_SALES_1_PERIOD_END()", +"b25fa92c": "adminAddRole(address,string)", +"b26041a1": "DELL()", +"b260c42a": "activate(uint256)", +"b26140f3": "BoBToken()", +"b261ce9c": "IsThisPublic()", +"b261f82f": "releaseAll(uint256,uint256)", +"b26209f6": "remainingFundsToEndAuction()", +"b2627ec0": "buyPriceAt()", +"b263c00c": "setV_R2(uint256)", +"b263f638": "minimalRewardedBalance()", +"b263f865": "usdPerHundredEth()", +"b263fb3f": "updateBasePriceAndMarketCap(uint256,uint256)", +"b2667cd0": "currentInvestment()", +"b266b828": "_sendTo(address,address,address,uint256,bytes,bytes,bool)", +"b266c661": "startDates(uint256)", +"b267f998": "addressFundBonus()", +"b2683aa6": "numberOfWagersToFinalTimeout()", +"b2684945": "usdSale(address,uint256)", +"b2686774": "sendFunds(uint256,address)", +"b269681d": "destination()", +"b269d584": "insertValue(uint256)", +"b269eaff": "imageGenerationCodeMD5()", +"b26b4b6a": "feesOwedToOperator()", +"b26b4f25": "changePrice(string)", +"b26c9779": "changeApproval(address,bool)", +"b26d9d6e": "IntermediateVault(address,uint256)", +"b26e4aed": "test_set_get_PremiumFactors()", +"b26eafe4": "lockUntil(uint256,string)", +"b26ee15c": "interfaceFreezeTokens(address,uint256)", +"b26ee5fe": "getTotalF4()", +"b26f72a4": "withdrawJOYTokens()", +"b26f78d3": "acceptNextManager()", +"b26f7efc": "startGame(uint256,int256,address[])", +"b270b209": "BlocklanceContractHolder()", +"b27201ca": "investedFrom(address)", +"b272fa2d": "getMyHipster()", +"b273952a": "_isUserInternalLock()", +"b2741997": "BAIRON()", +"b274e48e": "setSaleStatus(bool,bool)", +"b2758411": "setUserDisplayName(string)", +"b275a9d8": "PackageContract()", +"b275ba3a": "registerUser(address,address,string)", +"b2774b17": "createOrSet(string,uint256,string)", +"b2775b02": "genBaseStats(uint256)", +"b2787e0c": "changeTransferAgentCA(address)", +"b2788540": "manuallyConfirmDonation(address,uint256,uint256,string,string)", +"b278b8df": "updateVoteInfo(address)", +"b27913a6": "LedgerUpdated(address,address)", +"b2792811": "getFreelancersJobContracts(address[],uint256)", +"b27a1f63": "horseFS(uint256)", +"b27b0755": "earlyBirdsSupply()", +"b27b7dd1": "removeStage(uint8)", +"b27b8415": "dailyHashExpires()", +"b27bcaea": "startBetBlue()", +"b27c0ccb": "ETASToken()", +"b27c4b92": "buyCore(address,uint256)", +"b27c4cde": "ethereumhorse()", +"b27d31de": "bulkTransferEther(address[],uint256[])", +"b27daded": "processorAddress()", +"b27e7244": "addDestinationChain(bytes8,address)", +"b27ea08d": "tokensRemainingPreIco()", +"b27eb3e5": "airDrop(uint16)", +"b27f829e": "removeNetworkMember(address)", +"b27f88fb": "endFifthWeek()", +"b280055b": "roleSetup(address)", +"b280a7e7": "changeSender(address)", +"b280a96e": "setUseAddr(address)", +"b280f180": "setRates(uint8,uint8,uint8)", +"b2813f19": "withdrawOrderTo(address,uint256)", +"b28175c4": "stor()", +"b281c478": "currentCluster()", +"b28241f9": "getCityPopulation(uint256)", +"b283f2f1": "accessoryDataContract()", +"b28448f4": "NewDeposit(uint256,uint256,uint256,address)", +"b2849055": "resetBalanceOfValues()", +"b284fc29": "investorsTokensPercent()", +"b285041d": "Satoshi()", +"b2852bec": "saveCash(address,uint256)", +"b2855b4f": "setFeeAddr(address)", +"b285643e": "leaderboardDataContract()", +"b2860396": "setstart(uint256)", +"b286a346": "SimpleAIToken(uint256,string,uint8,string)", +"b286ba8c": "heapSort(uint64[])", +"b2879d45": "setDRSCoinAddress(address)", +"b288d748": "reduceLockingTime(uint256)", +"b2893ba5": "next_balance()", +"b28945a5": "setApprovalForAllByContract(address,address,bool)", +"b28b3a6e": "famedStarNameToIds(bytes32)", +"b28bb2a0": "setStorageTime(uint256)", +"b28bf6af": "decreaseClaimsBalance(address,address,uint256)", +"b28c461c": "TOKEN_RATE_BASE_RATE()", +"b28c48bb": "NecashToken()", +"b28c747d": "getSentTransfersCount()", +"b28e5904": "Xflip()", +"b28eed93": "Listed_NotValidated(uint256,string)", +"b28f1433": "BHNNetwork()", +"b28f1ee3": "reserveSeats(uint256[],uint256)", +"b28f4c60": "isEmptyString(string,string)", +"b28f53fe": "setMinimumTokensForPurchase(uint256)", +"b28f6fa3": "isOnAuction(uint64)", +"b28fc973": "getEthBalanceOf(address)", +"b28fd472": "miaomiao()", +"b290ae06": "shrToken()", +"b290b9ce": "resetAllDelegations(bytes32)", +"b290e45b": "BonusIssued(address,uint256)", +"b2910826": "set_payments_processor(address)", +"b29120fe": "getHeartPrice()", +"b291820b": "Etherich()", +"b29212b5": "delAudit(address,address)", +"b2923cff": "TAXRATE()", +"b2931096": "hasClaimed(address,uint256)", +"b29387e5": "payWinnerManually2()", +"b295a00e": "getLimit()", +"b2963db6": "closeDailyInvest()", +"b29775c1": "isDiscountValue()", +"b297a35d": "_redeem(bytes32,address,address,uint256,bytes,bytes)", +"b298247e": "gift(uint256)", +"b2983281": "largeCapLimitOf(address)", +"b2984858": "ico1cap()", +"b2990de1": "getByToCount(uint256)", +"b299708d": "dspRegistry()", +"b29a0308": "logAnonymous(bytes,bytes,bytes,uint256)", +"b29a08f7": "ContractMadePermanent(string)", +"b29a3cfd": "getPI_edit_13()", +"b29a61c1": "investorBalances(address)", +"b29ae23f": "getDateOfSignature()", +"b29b3511": "getSpaceshipUpgradeTotalSoldByModel(uint16,uint8)", +"b29b5366": "setRentable(bool)", +"b29b5be7": "getMintAdminApproval(address,address)", +"b29b686a": "isWarrantyValid(address,string,string)", +"b29c2493": "token(uint256,string,uint8,string)", +"b29c62f4": "myAccount()", +"b29cbcec": "LogChangeMultiSigAddress(address)", +"b29d7914": "getRefResults(uint256)", +"b29e201c": "spread(address,address[],uint256[])", +"b29e9909": "sCVars()", +"b29f0835": "doIt()", +"b29f2e77": "sendWarriors(address,address,uint256)", +"b29f731d": "__tinyOracleCallback(uint256,bytes)", +"b29f7f9e": "removeODEMClaim(address,bytes32)", +"b29f9d3b": "unfreezeAccountWithToken(address,uint256)", +"b2a02ff1": "seize(address,address,uint256)", +"b2a072c6": "passUndistributedEther()", +"b2a082b9": "suicaId()", +"b2a1449b": "out()", +"b2a1a022": "getGasPrice(string)", +"b2a1c540": "setMemberId(address,uint256)", +"b2a1de22": "whitelistedCount()", +"b2a29615": "Criptomedicina1()", +"b2a2a4e2": "complianceContract()", +"b2a3fd05": "WithdrawEth(uint256)", +"b2a4c897": "createTable()", +"b2a4efd4": "MASTERY_THRESHOLD()", +"b2a5a012": "setTokenReturnRate(uint256)", +"b2a5bc70": "_tokenLeft()", +"b2a68466": "OZENToken(uint256)", +"b2a6d21b": "COMPANY_RESERVE()", +"b2a7239d": "sklToken()", +"b2a780e4": "BITCLAVE_AMOUNT()", +"b2a7d1b7": "AssetsExplorer(address)", +"b2a840c0": "enable(string,uint256)", +"b2a87fc3": "targetToAchieve()", +"b2a8a6f3": "sendFLC(address,address,uint256)", +"b2a8ff45": "Tokens_Per_Dollar()", +"b2a91457": "OIA()", +"b2a9ab9c": "getTotalBraggedVolume()", +"b2aa8291": "MAINSALE_CAP()", +"b2aa9f0f": "increaseTotalSupply(address,uint256)", +"b2aac51f": "lookupUser(string)", +"b2aae005": "getBalanceOf(uint256)", +"b2ab526d": "approveUsers(address[])", +"b2ab530e": "testFailRetractLatestRevisionNotUpdatable()", +"b2ab70ba": "getMaxIterationsForRequestDividends()", +"b2ac1bbe": "buyInternal(address)", +"b2ac5407": "GMRTokenManager(address)", +"b2acbc13": "isOwner(bytes8,address)", +"b2ad1993": "BalanceNum()", +"b2ad35c0": "distributor_address()", +"b2ad3d44": "updateComplianceProof(bytes32,bytes32)", +"b2aeb260": "setHiringDone(address,uint256,address)", +"b2af9362": "isValidSignature(uint256,bytes)", +"b2b02109": "partnerSaleTokensAvailable()", +"b2b0aefb": "verifyPendingShares(uint256[],uint256[],uint256,uint256[],uint256[],bytes,bytes,uint256)", +"b2b106d6": "participate_in_arbits_presale_crypto()", +"b2b158e8": "setHolderAmount(uint256)", +"b2b28679": "getDelegationID(address,address)", +"b2b3abb1": "removeOrderFromList(bytes32)", +"b2b45df5": "init(address,string,string)", +"b2b4ae25": "isEntitled(address,address)", +"b2b5d93c": "Stop(bytes32)", +"b2b5f0cf": "IOBT()", +"b2b5f86f": "getLocality()", +"b2b5fbf5": "subDroneItem(address,uint256,uint256)", +"b2b6e37e": "_min256(uint256,uint256)", +"b2b74405": "PizzaParlor(address)", +"b2b7d0ce": "HakataCoin()", +"b2b877c1": "MithrilValkyrie()", +"b2b95adc": "finalizeChangeInsurer()", +"b2b96792": "proposeSettlement(uint256,uint256)", +"b2b98ed2": "Winner()", +"b2b99ec9": "removeNode(address)", +"b2ba0aa5": "feesPer10000()", +"b2ba97de": "team_and_angel_beneficiary()", +"b2bab02a": "startIssue()", +"b2bae511": "initSiteRewards(uint256)", +"b2baede4": "getListingContractAddress()", +"b2bb419f": "ActivateEscrow(uint256)", +"b2bb72bf": "getIndexInfo()", +"b2bbac16": "firstWeekPreICOBonusEstimate()", +"b2bbae69": "payForVote(address,bytes32,uint256)", +"b2bbe75e": "Sunshine()", +"b2bc2f68": "Kitcoins()", +"b2bc6c19": "PRICE_11()", +"b2bcf495": "_releasableAmount(address)", +"b2bd96b2": "AcceptsFUNDS(address)", +"b2bdc6b3": "adminAddMonument(string,uint256,uint16)", +"b2bdfa7b": "_owner()", +"b2be8180": "TombCore()", +"b2be8a0d": "getUserWalletTokenBalance(address,address)", +"b2bea9c1": "releasePurchasedTo(address,uint256)", +"b2bec979": "cashOutCar(uint32)", +"b2bf731d": "SPECTRE_BOUNTY_ADVISORY_DEV_TEAM_ALLOC()", +"b2bfd948": "checkNumbers(uint8[3])", +"b2c09c92": "gameWithdrawFrom(address)", +"b2c15f29": "updateLastTime(bytes32,bytes32)", +"b2c1d7dc": "BGToken()", +"b2c2196f": "MxRecordChanged(bytes32,address)", +"b2c26f94": "updateParameterValue(bytes32,uint256)", +"b2c2921a": "TeamBox()", +"b2c3429d": "VouchCoin()", +"b2c3609b": "Play(uint8)", +"b2c50b92": "retryWinners()", +"b2c5b208": "_returnReturnData(bool)", +"b2c60132": "wingsWallet()", +"b2c60690": "finalizeVoting(address)", +"b2c62d46": "endClaim()", +"b2c652f3": "getMarkets(uint256[128])", +"b2c6b6dd": "preSaleContract()", +"b2c7c90d": "bitcoin_ratio()", +"b2ca38fe": "GAP()", +"b2ca3ec4": "securityGuard()", +"b2cad9b7": "getLevel(uint32)", +"b2cb0a3d": "VESTING_TEAM_DURATION()", +"b2cb1ebd": "Typhoon()", +"b2cb26c1": "addMaster(uint32,string,uint16,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)", +"b2cb3a9b": "getCurrentShare(address)", +"b2cb3e93": "COSSDemo()", +"b2cb9f05": "Total_Deposited()", +"b2cc0eb3": "SpaceCoinToken(address,string,string,uint256,uint256)", +"b2cc36fc": "restoreFromColdWallet()", +"b2cc4165": "getOrderAmount(address,address,uint256,address)", +"b2cca39d": "pausedTime()", +"b2ccc4ab": "getFameBalance(address)", +"b2ccda0e": "setPrimaryOperator(address)", +"b2cd67ef": "Klein()", +"b2cda083": "PassCommitteeRoom(address)", +"b2cefd2f": "LiteToken()", +"b2cf9814": "assetManagerIncome(address)", +"b2cfdfda": "stringToArray(string,string)", +"b2d111f6": "maxGasPriceValue()", +"b2d1289b": "DepositManager(address)", +"b2d138d2": "rspScience()", +"b2d14545": "fbytes2(bytes2)", +"b2d1573f": "getUserRank(address)", +"b2d1f9be": "buyStar(uint256,string,string)", +"b2d23b7d": "fetchVoteResult()", +"b2d27832": "vestingPeriodTime()", +"b2d2c1de": "withdrawProfit(address,address)", +"b2d318f7": "VeteranCoin(uint256,address)", +"b2d37165": "startMinting(bool)", +"b2d37e95": "remove_order(uint32)", +"b2d3e85e": "isPeriodAllTokensSold(uint256)", +"b2d444df": "TIM6(uint256,string,uint8,string)", +"b2d48237": "refferalsRateBonus()", +"b2d4ae5e": "__callback(bytes32,string,string)", +"b2d5362d": "contractTokenBalance(string)", +"b2d5ae44": "getRefund()", +"b2d5e8b1": "VALUE_OF_UTS()", +"b2d6bc83": "fundCapital()", +"b2d6fd0b": "id_for_address(address,address,address)", +"b2d8efe0": "crowdsaleOpen()", +"b2d96b81": "safeAssetData(uint256)", +"b2da302b": "Thrill()", +"b2dad155": "trim(string)", +"b2dad25d": "getNameOfAddress(address)", +"b2dae885": "SpecialArrays()", +"b2db1d23": "regularMaxPerPerson()", +"b2dd5c07": "registered(address)", +"b2dda6b5": "totalEthReleased()", +"b2de1a3f": "CONTRACT_PROVIDER_ADDRESS()", +"b2df8456": "sponge(uint256[9])", +"b2df8bad": "getAvailableCoinsForCurrentStage()", +"b2dfa399": "ZRX_TOKEN_ADDR()", +"b2e02430": "divRate()", +"b2e02fc1": "addRefund(uint256,uint8)", +"b2e0baee": "SunContractIco(uint256,address)", +"b2e235c2": "BitBall()", +"b2e2c1c9": "updateCondition(uint256,uint256,uint256,uint256)", +"b2e2c75f": "totalUsed()", +"b2e30440": "Ducaat()", +"b2e33c8f": "getCountPlayerByTrackId(uint256)", +"b2e357b4": "isLinkClaimed(address)", +"b2e37e18": "extDestroyNinja(uint256)", +"b2e3d212": "IndexCoin()", +"b2e4c183": "preICOBonusPercent()", +"b2e4d35d": "validate(uint256,uint256,uint256,uint256,string,string,string)", +"b2e545ac": "TokenGreeneum(uint256,string,uint8,string)", +"b2e5d3ba": "getBtcRate()", +"b2e6ceeb": "takeOwnership(uint256)", +"b2e752cb": "MINCAP_TOKENS()", +"b2e774ce": "deliver(address,uint256,bytes32)", +"b2e7c288": "recipientString()", +"b2e85b67": "getPlayerStatus(address,uint256)", +"b2e94e78": "stage1_start()", +"b2ea073f": "setGeneScienceAddress(address,address)", +"b2ea088d": "returnUnsold()", +"b2ea0a39": "changeMinDonationLimit(uint256)", +"b2ead7bb": "fundsOut()", +"b2eafd57": "getRewarder(uint256)", +"b2ebe1c5": "_determineCharacterType(uint256)", +"b2ed26f6": "addresses3(uint256)", +"b2ee95f9": "dateRelease6()", +"b2eed299": "getPOOL_edit_28()", +"b2ef089a": "isStateTokensale()", +"b2ef48b9": "buyTokensWithWei(address)", +"b2f05133": "set_trader(address)", +"b2f0575c": "FooMintToken(int256)", +"b2f094de": "BittechPresale(address)", +"b2f106c0": "determineReward(bytes32)", +"b2f1bb5b": "tellMeASecret(string)", +"b2f1fe99": "refundManyTransaction(uint256[])", +"b2f2303a": "BreakbitsERC20Token()", +"b2f24225": "set_minDETsPerReturnMoreThan(uint256)", +"b2f2588b": "sortNumbers(uint8[3])", +"b2f2b06d": "_createCar(string,address,uint256)", +"b2f3319e": "ToggleTestMode(bool)", +"b2f3d299": "loadFunds()", +"b2f3ded4": "allMarketsFinalized()", +"b2f40531": "shutdownTransactions(address)", +"b2f4bdb0": "createdTime()", +"b2f5a54c": "getInvestors()", +"b2f7e989": "sourceTokens()", +"b2f9c5b9": "canTransfer(bytes32,address,uint256,bytes)", +"b2fa1c9e": "isComplete()", +"b2fa9206": "cancelIco()", +"b2fadc78": "_getStorage()", +"b2fb3b90": "cancelActiveAuctionWhenPaused(uint40)", +"b2fcb395": "GoldenBullChainToken()", +"b2fce4ea": "delegateVote(int256,address)", +"b2fd3a7d": "getHardcapUsd()", +"b2fed358": "getsafemode()", +"b2ff7945": "setARR(address)", +"b3002be7": "burnNSPs(address,uint256)", +"b30054b4": "set_address_GIC(address,address)", +"b3007dc6": "rateFirstWeek()", +"b302ea1e": "setRaindropAddress(address)", +"b302ec4b": "LocklistedAddress()", +"b30300d7": "_increaseAllowance(address,uint256)", +"b3034371": "unilateralRuling(uint8,uint256,uint256)", +"b30387a4": "gen0Count()", +"b30390ce": "registerItem(uint256,uint256,bytes32,bytes32,bytes32)", +"b303cec0": "addAccountReader(address)", +"b303dcbd": "Owned()", +"b303f9f7": "releaseHTOSupply(address)", +"b304376c": "begins()", +"b30475b6": "totalWeiClaimed()", +"b304b2e1": "allocated()", +"b305836f": "feeWithdrawTokenAll(address)", +"b3066d49": "setContracts(address,address,address)", +"b3070c12": "ADVISOR_REWARD()", +"b3074b8a": "SUTokenContract()", +"b30779b1": "payCommission()", +"b3082d25": "CreateCards(uint256,uint256,uint256,uint256,uint256,bool)", +"b30841d9": "totalEras()", +"b3097a08": "heldTotal()", +"b30ab349": "getContent(address)", +"b30bca06": "sum(uint8[])", +"b30cf414": "unpauseSALE()", +"b30d1bb8": "isDisableEther()", +"b30d95a0": "changeBonus(uint256,uint256,uint256,uint256,uint256,uint256)", +"b30dbc67": "DeNetToken()", +"b30e4533": "ABBCToken()", +"b3113d3f": "hardCapPrivate()", +"b311db2f": "setAccountType(address,uint256)", +"b311ee0c": "refundClaimDeposit()", +"b312dc91": "currentPayout(address,address,bool)", +"b31394cb": "_checkThenTransfer(address,address,uint256)", +"b3139d38": "updateSlasher(address)", +"b3141c69": "localsReptoken(uint256,string,uint8,uint256,string,string)", +"b314a984": "burnRemain()", +"b3154db0": "check(address,address)", +"b31567d3": "LogRemoveWhiteListed(address)", +"b31597ad": "redeem(bytes32,bytes32)", +"b315e453": "multiWithdrawReward(uint256[])", +"b31610db": "getIndex(address)", +"b317d031": "STATUS_PAID()", +"b319c6b7": "cooldownTime()", +"b319e9fa": "distributeMultiple(address[],uint256[])", +"b31a17f0": "FtC()", +"b31a4047": "_convertBlueprint(string)", +"b31a404a": "withdrawOnNoAvailablePlan()", +"b31a4e0d": "allocatePresaleTokens(address,uint256,uint64,uint64)", +"b31ab1c3": "disconnectOrderUser(address,address,uint256,uint256,address,address)", +"b31ba590": "PlayerCreated(address,uint256)", +"b31c5c64": "kscDecreaseApproval(address,uint256,string)", +"b31c710a": "oldToken()", +"b31cbe9a": "getAlice(uint256)", +"b31cd1be": "secretTaken(bytes32)", +"b31cf984": "getProgram()", +"b31d61b0": "whitelistAddress(address[])", +"b31d7730": "presaleFinalizeAgent()", +"b31d8a6f": "FreeTokenAdded(address,uint256)", +"b31dcaad": "timeToUnlockDDHHMM()", +"b31e1d4d": "delegateVote(address)", +"b31e822b": "isAllowTransfer(address)", +"b31e8889": "setParticipantWhitelist(address[],bool)", +"b31f8f93": "tokensLeft()", +"b32022e8": "calculateKebabBuySimple(uint256)", +"b3204b8b": "setParent(address,address)", +"b3204cc3": "setLineUpEnable_pool(address,uint256)", +"b3205410": "getCustomerInfo(address)", +"b3206453": "destination(bytes4,bytes)", +"b3209136": "WakaWakaCoin()", +"b320f459": "removeBid(uint256)", +"b32142a0": "getProgramPercent(uint256)", +"b3215499": "ICOBonusPercent3week()", +"b3219d17": "calculatePurchaseBonus(uint256,uint256)", +"b322269e": "GameStart(uint256,uint256)", +"b32381ee": "addmoney(address,uint256,uint256,uint256)", +"b324816a": "createPaymentsSplitting(address[],uint256[],uint256)", +"b324c62a": "fastTokenSale(uint256)", +"b324e80d": "depositEscrow(address,uint256)", +"b324fb6b": "startTimePreICO()", +"b3253e0f": "lastScheduledTopUp()", +"b326124b": "tRegSaleStart()", +"b326c189": "hasOpenCommissionerAuction(uint128)", +"b32776e1": "getSigner(address,string,address,uint256,bytes32,bytes32,uint8)", +"b3280830": "addLibrarian(address,address)", +"b3292ff0": "addSuperAdmin(address)", +"b329bf5c": "cancelTransfer(bytes32)", +"b32b2805": "getArmyFullData(uint256)", +"b32b664f": "wantItForFree(uint256)", +"b32b8e2c": "contains(uint256[],uint256)", +"b32c41d7": "crowdsaleTargetUBO()", +"b32c65c8": "contract_version()", +"b32c6a25": "GenesisToken()", +"b32cb292": "setStartICO(uint256)", +"b32cec45": "CROWDSALE_ACCOUNT()", +"b32d01c2": "modify_bytes(bytes)", +"b32dbcd8": "getNumKnights()", +"b32dc51c": "totalPhase1Donations()", +"b32e02e8": "_getRarePlusRarity(uint32)", +"b32e4207": "setzString(string)", +"b32f19f9": "showFreezedTokensAmount(address)", +"b32f4b9a": "Barbie()", +"b32fab4e": "moneyback()", +"b3311309": "SingularityTest5()", +"b3335e6b": "setICOStartDate(uint256)", +"b33381fe": "calcAmountEther(address,uint256,uint256)", +"b333adfc": "coursesLength()", +"b333b0ee": "_stake(bytes32,uint256,uint256,address)", +"b333ce0d": "icoFinish()", +"b3344593": "trackingNo()", +"b334e90b": "tadpoleReq()", +"b334fd07": "createFincontract(bytes32)", +"b3350f03": "forbiddenAction()", +"b33527d2": "CreateBAT(address,uint256)", +"b3369866": "indexOf(uint128[],uint128,bool)", +"b336ad83": "getByName(string)", +"b336f8a3": "GetNumberOfRigs()", +"b33712c5": "unpauseContract()", +"b337a20d": "verifyLockSignature(bytes32,address,address,uint256,uint256,bytes32,bytes)", +"b33926cb": "owner_withdraw(uint256)", +"b33a10de": "cards_titanium(uint256)", +"b33a2ea0": "lastBlock_v18Hash_uint256()", +"b33a8a11": "setTokenReference(address)", +"b33aca37": "Mcoin(uint256,string,uint8,string)", +"b33adbf1": "darPremio()", +"b33c24b2": "createERC20TokenNetwork(address,address,uint256,uint256)", +"b33c4b1f": "end_now()", +"b33cb8f6": "CrowdsalePaused()", +"b33ceb2c": "AddGossip(address,string)", +"b33e8ee5": "exchangeTokensById(uint256,uint8,uint8)", +"b33fcc7a": "multiTransfer(uint256[])", +"b340a972": "getaddr(address,uint8)", +"b340d8cf": "encodePriceFeed(uint256,uint256,uint256,uint256)", +"b340f2b4": "showAssetDetails(bytes32)", +"b3413d9f": "_forwardFunds()", +"b34195a3": "ICOTokensInvested(address,uint256)", +"b3423eec": "requestWithdraw()", +"b34244e8": "setCBaddress(address,address)", +"b34253be": "FundsVault(address)", +"b342d7c0": "genEOS()", +"b34362be": "setParter(address,uint256,uint256)", +"b3446f85": "registerPlayer(string)", +"b3447ac9": "getBytes32Values(bytes32)", +"b344e002": "saleDeposit()", +"b3470e97": "addHashes128()", +"b3472edb": "getMaxProfit(uint256)", +"b3477201": "createPadlock(string)", +"b3480369": "_getWaitingBlocks(uint256)", +"b3481e61": "updateTeam(address,uint32,uint8[],uint32[])", +"b3485dca": "UpdatePrice(uint8,uint32)", +"b3487a71": "getBetWaitEndEther()", +"b348ddde": "ETH750on54()", +"b3490bfc": "allowTransfer(address)", +"b34937c9": "feedMessage(uint256,string,string)", +"b349b973": "_init()", +"b349dbdc": "nfsPoolTransfer(address,uint256)", +"b349f6c7": "attemptSpend(uint256)", +"b34b2c26": "Simpletokenq()", +"b34b4f69": "XingchenToken()", +"b34b5825": "getAvailablePacks(bytes4)", +"b34c28de": "calculateBurnGoldFee(uint256,uint256,bool)", +"b34c3610": "assert1()", +"b34c8afb": "getBaseAmount(address)", +"b34d471d": "bulkCreateLamboSale(uint256,uint256,uint256)", +"b34debac": "canUseResource(address)", +"b34e0c47": "getUserScore(address)", +"b34e7b9d": "getgamecardlength()", +"b34e97e8": "login()", +"b34f094f": "INTToken(uint256,string,uint8,string)", +"b34f0e5e": "CLAIM_STAGE()", +"b34f407d": "setPerformer(address)", +"b34f43c7": "SVDelegationV0101_1(address)", +"b34f594b": "setNodePrice(uint256)", +"b34f7b50": "_generateDiscipleSale(uint256,uint256,uint256,uint256)", +"b350723f": "_guarantedBid(uint256)", +"b3508654": "addController(address,bool)", +"b3508783": "TOKEN_MAX()", +"b35176e2": "show_number_of_days_since_bank_opening()", +"b3521607": "XYCCTEST()", +"b3527cfe": "Follow(uint256,address,uint256)", +"b3528158": "DASHABI(uint256)", +"b352867c": "setFreeExtension(bytes32,bool)", +"b3535fe2": "_setProviderInfoFields(uint256,string,string,uint256,string,address,uint8)", +"b35376b5": "getDiamond(string)", +"b3539c44": "getMintForReportingParticipantTargetValue(int256)", +"b3549265": "coloredTokenCount()", +"b3559460": "getGenerationSize(uint256)", +"b3562e6e": "getCrowdsaleTier(uint256)", +"b356a3a5": "PLATFORM_GROWTH_VESTING_AMOUNT()", +"b3570116": "mintIfNecessary(uint256)", +"b357a028": "SCISSORS()", +"b357a552": "claimAuctionableTokens(uint256)", +"b357b72f": "setMaxMarketOffers(int32)", +"b35861b4": "setERC20Address(address,address,uint256,uint256)", +"b358755e": "testerCanNotReentrant()", +"b35893f3": "setExporter()", +"b358e375": "JobsManager(address)", +"b359cedd": "getTime(string)", +"b35ae7e8": "ViotToken()", +"b35e7d45": "setCriticalBucket(uint256)", +"b35eeb46": "GenHeliosCoin()", +"b3610f37": "destroyCar()", +"b36117b2": "create18FilmsTokens()", +"b36216d3": "allTokensDecimalsBalancesWeights()", +"b3621e1a": "addAddress(address[])", +"b36234c2": "AltruismMode(address,uint256,uint256)", +"b36292eb": "TestingCoin()", +"b3629f79": "get_proposal_by_row(uint256)", +"b3643e3a": "createSale(address,uint256)", +"b36752ee": "addressFoundersShare()", +"b36763c9": "_owoAmount()", +"b367fb11": "platformTokens()", +"b36877c9": "DragonKing(address,address,uint8,uint8,uint8,uint16[])", +"b368cb10": "getProviderInvitedUser(uint256,address)", +"b369940c": "wingsETHRewardsPercent()", +"b3699d0b": "withdrawedTeamCounter()", +"b369af71": "intervalOf(uint256)", +"b36a06b5": "preSaleFirstBonus()", +"b36a0b15": "getSignDetails(uint256,uint8)", +"b36ada82": "mintingOracle()", +"b36af005": "Menu04()", +"b36b9ffd": "bountyManager()", +"b36ba252": "getSellOrderPrices()", +"b36c1284": "MaxSupply()", +"b36c14fe": "getWhitelistUser(address)", +"b36c8022": "UnfreezeAccount(address)", +"b36c973e": "payOutWinner(address)", +"b36d829b": "getwinningaddress01()", +"b36df681": "ExecutableBase()", +"b36eaad8": "createUserMeme(address,uint256,string,uint256)", +"b36f2c30": "maxWeiUnverified()", +"b36f8e8f": "allowManager()", +"b36fef76": "promoFishCommission()", +"b3710a80": "infraEthWallet()", +"b37139e6": "reduceCD(uint256,uint256)", +"b37217a4": "getRandomNumber(uint256)", +"b372bd31": "getCommissionBalanceWEIInfo()", +"b373a48b": "getOneself()", +"b373a61c": "priceRandomFight2Death()", +"b373a6cd": "sendTokens(address[])", +"b373f167": "transfer(address,uint256,bytes,string,bool)", +"b3745afa": "changeAllocator(address)", +"b3746849": "buyTokens(address,bytes)", +"b374db9a": "secondsTimeLockedDefault()", +"b3753107": "gweiBBDPriceInWei()", +"b375603c": "raffleId()", +"b375a72c": "getHashPicture(bytes32)", +"b375b95a": "getMaxRankingSpots()", +"b3760c80": "orderMatch(uint256,uint256,uint256,int256,uint256,uint256,address,uint8,bytes,bytes,int256)", +"b37610ad": "getKey(uint16,uint16)", +"b37681fd": "SetPlayerID(bytes32,uint16)", +"b376feba": "_unsafeTransfer(address,uint256)", +"b378e89b": "CreateToken(address,uint256)", +"b37983e2": "gasRequired()", +"b379d235": "setFlowerAuctionAddress(address)", +"b37a336d": "VESTING_DIV_RATE()", +"b37a5de7": "throughputToday()", +"b37a6a2c": "restartPrivatePlacement()", +"b37bcd94": "discountPeriod()", +"b37c191b": "rank(uint256)", +"b37c7dc0": "sub256(uint256,uint256)", +"b37cc2f0": "getUserEventsLength(address)", +"b37d61f8": "checkMyBalance()", +"b37d97b5": "addMany(address[])", +"b37dcce2": "trainingFeeMultiplier()", +"b37edb66": "FundingEntity()", +"b37edfb6": "checkChangeOwnerArgs(uint256,uint256)", +"b37f17ee": "migratingAmountBooks(address,address)", +"b3803956": "showPlayerFullScores(address)", +"b380b0d4": "setProfitPercentage(bytes32,uint256)", +"b380beac": "setTotalWizzPandaOf(uint256,uint256)", +"b380d365": "resolveDisputeSeller(string)", +"b381cfe5": "iotpowerToken()", +"b3822da8": "getContents(uint256[])", +"b38260fe": "totalAngelCardSeries()", +"b382b0d6": "createContract(uint256,uint8,uint256,uint256,address,address,address,address,address)", +"b38336de": "getCoinAmount(uint256)", +"b3834ed4": "getRefunded()", +"b383616d": "setSupplyAgent(address,uint256)", +"b38400ff": "getEndedGames()", +"b38415f3": "getConfigBytes(bytes)", +"b384abef": "vote(uint256,uint256)", +"b384e9b4": "incentivisationFundAddress()", +"b3850b2a": "total_reward_amount()", +"b385e7b6": "playerPrizes(address,uint256)", +"b387ed6d": "getCompetitionStatusOfHopefuls()", +"b387ef92": "currentOwner()", +"b38854be": "ownable()", +"b38928c5": "Vineyard(address)", +"b38b2261": "addValidation(bytes32)", +"b38bf811": "setMessagesSigned(bytes32,bool)", +"b38c1504": "TOTAL_LBTOKEN_SUPPLY()", +"b38c7e3a": "getStrong()", +"b38ce3e7": "deedIds(uint256)", +"b38d3ab4": "attackeePrizeByToken(bytes32,address,address)", +"b38de8ce": "DelGoods(uint32)", +"b38f974a": "buyFood(uint32)", +"b38fb813": "crowdsaleInit()", +"b38fced1": "availableThemedSpinners()", +"b3908dc1": "IPXToken()", +"b390c0ab": "burn(uint256,uint256)", +"b391983c": "getLimitAndPrice(uint256)", +"b3922c42": "TOKEN_INVESTORS()", +"b3924a58": "GreenMining()", +"b3927eeb": "Expended()", +"b3935caa": "trivenewstestToken()", +"b3936f95": "basis(uint256,uint256)", +"b3938edc": "changeETHUSD(uint256)", +"b393a5b5": "setKingdomCreationFeeWeiRP(uint256)", +"b393a759": "ipfsSet(string)", +"b393fa46": "fundersClaimed()", +"b3942cbd": "setTransferAllowed(bool)", +"b3947c17": "muldiv(uint256,uint256,uint256)", +"b395cb3c": "vest(address,uint256,uint256,uint256,uint256)", +"b395f278": "view_get_blockNumbers()", +"b3965083": "Pothereum(uint256,string,string)", +"b3965cec": "RefundPeriodStarted()", +"b3966dc9": "init(address,uint256,uint256,uint256,address,address,uint256)", +"b396d7ad": "heapSort(uint256[])", +"b3970f27": "updateHpbNodeBatch(address[],bytes32[],bytes32[])", +"b397657d": "endInitialization()", +"b397ffd8": "m_foundersTokensStorage()", +"b39852f9": "createGame(uint256,uint256,uint256,uint256,uint256,uint8)", +"b398924d": "RangeGameProcess(address,uint256)", +"b398e098": "setMaxETHAutoContributions(uint256)", +"b3997703": "Loser(string,string)", +"b399a9f8": "setFungibleTokenAddress(address,address)", +"b399b0bc": "remaining(address)", +"b39a64cd": "getNumCalled()", +"b39a69a3": "withdrawPROV(uint256)", +"b39a7fbe": "setBattleDeciderAddress(address)", +"b39ad6e0": "DonatorInteract(string)", +"b39c2944": "requiredAuthorities()", +"b39c8739": "Strikes()", +"b39ca258": "createOrder(address,bytes32,bytes32,address,uint256,uint256,uint256)", +"b39d49fe": "sellNapkins(uint256)", +"b39d66d0": "LiipCoin()", +"b39d6b7b": "DukatToken()", +"b39dcb1d": "showDepositEther()", +"b39e12cf": "contractManager()", +"b39e1c6c": "withdrawDirectDebit(address)", +"b39e7bc1": "RealEstate(uint256)", +"b39f4171": "payForOther(address)", +"b39f4483": "setPOOL_edit_28(string)", +"b3a06e75": "airdropSingleAmount(address,uint256)", +"b3a0b1ef": "basicInfoGetter()", +"b3a0e188": "firstReserveTimeLock()", +"b3a1362a": "setMessage(int256,string)", +"b3a1584a": "toAddr(bytes)", +"b3a18632": "stakeAOContent(uint256,uint256,bytes8,uint256,string,string,string,string,uint256,uint256)", +"b3a196e9": "presaleSupply()", +"b3a1ca52": "addressFundDigitalMarket()", +"b3a26071": "LiquetLottery()", +"b3a27842": "getEntity(uint256)", +"b3a2a6c0": "setOfficialWebsite(string)", +"b3a2a999": "nextWithdrawal(bytes16)", +"b3a3c4f6": "identifierToRentPeriod(uint256)", +"b3a3d671": "addAllowanceToRecieveToken(address[])", +"b3a3dda3": "clearExpiredAssignments(address,uint256)", +"b3a41c65": "power(uint256,uint256,uint256,uint256,uint8)", +"b3a56077": "vestingPeriodLength()", +"b3a61c80": "tryNextTimeRange()", +"b3a6d09d": "tgrSettingsPartContributor()", +"b3a7cbf6": "XRRsale()", +"b3a810f7": "tournamentOwnersCut()", +"b3a844ae": "tokenClose()", +"b3a9afb7": "getQuickBuyEtherToken()", +"b3a9b5f6": "multiply(uint256,uint256,uint256)", +"b3aaa277": "validate(address[4],address,uint256[11],uint256,bytes,uint256)", +"b3aae830": "deployProject(uint256,string)", +"b3ab15fb": "setOperator(address)", +"b3ab715e": "getTileIDbyPosition(uint16,uint8)", +"b3ac149c": "getCurrBalance()", +"b3ac7acd": "ownerSetMaxProfitAsPercentOfHouse(uint8)", +"b3ad4600": "RedCarpetToken()", +"b3adc716": "is_banned(address)", +"b3ade772": "shipProducts(string,string)", +"b3adfa0c": "summLeskiw()", +"b3ae1d2c": "completeTransaction()", +"b3ae65d7": "initialBlockNumber()", +"b3aefb75": "getCap(address)", +"b3af4426": "jackpotTokenLoseRewardRate()", +"b3af88f0": "proposalPresent(string)", +"b3afe437": "SPECIALIST_TWO()", +"b3b0c83f": "withdrawEndTime()", +"b3b0cf86": "Birth(uint256,string,address)", +"b3b0eae5": "getPaidAmount(string)", +"b3b163c4": "getLatestVersion(address,bytes32,address,bytes32)", +"b3b294a6": "bonusOn()", +"b3b2b1b6": "setPaidStatusCustomer(address)", +"b3b32dc0": "hasSeat(uint256)", +"b3b39809": "Filiate_Changed(address)", +"b3b4b21e": "ZZZCoinDistribution()", +"b3b4ec54": "acceptColuLocalNetworkOwnership()", +"b3b4fd0f": "affiliateProgram()", +"b3b51aa3": "recycleSkin(uint256[5],uint256)", +"b3b548eb": "submitPrice(uint256,uint256)", +"b3b55c0f": "ELTWagerLedger(address)", +"b3b5c0ee": "fillSellOrder(uint256,uint256,uint256)", +"b3b5eaa3": "dive2(address)", +"b3b5ec33": "onPollFinish(bool)", +"b3b5fc76": "getImagePartsCount(uint256)", +"b3b71063": "BitPeso()", +"b3b77a51": "lock(bytes32,uint256)", +"b3b789fb": "GetLogMessageInfo()", +"b3b78cc2": "crowdSaleZxcSupply()", +"b3b81d38": "changeMinContribution(uint256)", +"b3b85e7f": "buyAtoken()", +"b3b89158": "reserveUnlockTime()", +"b3b8c620": "icoRatio()", +"b3bb594c": "delivery(address,uint256)", +"b3bb8cd4": "_now()", +"b3bb8d44": "OwnerDefined()", +"b3bb9b58": "LiquidDemocracy(address,string,uint256)", +"b3bc5b10": "editDefinedGame(uint256,string,uint256,uint256,int256,uint256,uint256)", +"b3bd870a": "participated(address)", +"b3bf07a1": "balanceofSTCDR(address)", +"b3c06f50": "transferFrom(address,address,bytes32)", +"b3c0b7be": "createOracle(address,uint256,bytes32)", +"b3c10469": "hijackClones()", +"b3c185a7": "addNVTtoGame(uint256,uint256)", +"b3c199c1": "dividendFor(uint32)", +"b3c1a588": "parseMsgData(bytes)", +"b3c1ee88": "updateDescription(string,bytes32)", +"b3c1fe4f": "donationMultiplier()", +"b3c2083f": "sellVolumesNext(address,address)", +"b3c25835": "addUser(address,string,string,uint256)", +"b3c298ea": "angelInvestors()", +"b3c2e8fa": "ethPause()", +"b3c2eac1": "setStatus(bool,bool)", +"b3c3699f": "createLockedState()", +"b3c3bbbd": "betters()", +"b3c4a36b": "setupToken(address)", +"b3c4b54a": "updateDestination(bytes32,address)", +"b3c4ee17": "userOfferCancelElement(uint256,uint256,uint256)", +"b3c4f83b": "DoftToken()", +"b3c5209f": "limitation()", +"b3c5998d": "onTransfer(address)", +"b3c63629": "PTSDToken(uint256,string,uint8,string)", +"b3c6487b": "setCatPrice(uint256,uint256)", +"b3c7476c": "TOSLittleHodingContract()", +"b3c7618e": "getVoteRuling(uint256,uint256,uint256)", +"b3c7d097": "theDeal(uint256)", +"b3c9983a": "getPara(uint256,uint256)", +"b3ca07d1": "closeRound(bytes32,uint8)", +"b3caba5a": "setReferralAddress(address)", +"b3cb8885": "nextUnderdogPayout()", +"b3cba833": "getData_16()", +"b3cc167a": "bidIncrement()", +"b3cc35f0": "taxPerc()", +"b3cd95d3": "incRandNonce()", +"b3cdabfd": "funForOwner()", +"b3cea217": "ID()", +"b3cea9e2": "createRadar(uint256,string,uint256,uint256,uint256)", +"b3cffc6e": "contributeBTCs()", +"b3d14775": "getPOOL_edit_13()", +"b3d159bf": "SearchMyFiles(string)", +"b3d176c9": "setPOOL_edit_33(string)", +"b3d1958d": "flush(uint256)", +"b3d1b801": "getOwnerCars()", +"b3d1bd95": "_recordFeePayment(uint256)", +"b3d2b441": "grantTokens(address)", +"b3d34e1b": "WithdrawDevFunds(uint256)", +"b3d39e63": "deleteProposal(bytes32)", +"b3d3d37e": "takeSnapshot()", +"b3d4e279": "earlyBackerList()", +"b3d4e3f2": "makeVendorValid(uint256,bool)", +"b3d4e41f": "PURA()", +"b3d62a25": "matchDay()", +"b3d6e119": "lockedPeriod()", +"b3d73743": "box1Star4()", +"b3d76188": "pay(address,address,uint256)", +"b3d7ac6a": "transferCompensationEthers()", +"b3d8056d": "findString(bytes32)", +"b3d84a28": "FreezeProduct(uint256)", +"b3d91e41": "DECIMALFACTOR()", +"b3da4b09": "mintEnergyAttributionToken(address,uint256,string)", +"b3da6eed": "Alluma()", +"b3daa652": "CLIFF_DURATION()", +"b3daab8a": "updateInvestBalance(uint256)", +"b3dac57f": "cancelUpcomingEvent(uint256)", +"b3db410c": "allowTransferTimestamp()", +"b3db428b": "depositFor(address,address,uint256)", +"b3dc0e94": "transferSoldCoins(address,uint256)", +"b3dcc5eb": "mint_and_transfer(int256,address,uint256)", +"b3dd23e8": "BTC_SUISSE_TIER_2()", +"b3dd5b1a": "WavesBitcoinToken()", +"b3de019c": "changePrice(uint256,uint256)", +"b3de5cc0": "_getTimeLeft()", +"b3de648b": "f(uint256)", +"b3dedf5c": "BACToken()", +"b3dee386": "collect(uint16,uint16,uint8)", +"b3df27f4": "checkFundingGoal()", +"b3df5b45": "oxleytoken()", +"b3df8737": "left50(uint256)", +"b3dfcdc3": "Contribution(uint256)", +"b3e18ed9": "finisGame()", +"b3e1f523": "setUnpausedWallet(address,bool)", +"b3e2564a": "amendAmount(uint8,uint8,uint8)", +"b3e25665": "collaborateInMerge(address,int256,int256)", +"b3e33a74": "mintingGoal()", +"b3e366ab": "getLastMilestone()", +"b3e3cc34": "sellToBlackMarket(uint256,uint256)", +"b3e3d8b4": "startOrHoldCrowdSale(bool,bool,bool,uint256,bool)", +"b3e53d8a": "maxPresaleContributionEther()", +"b3e5519b": "getOpenBids(bytes32,uint8)", +"b3e6713e": "LogClaimTokens(address,uint256)", +"b3e6c19f": "OJCToken()", +"b3e7c201": "ethPromoHelpers(address)", +"b3e7c2bd": "getVote(bytes32,address)", +"b3e83761": "KanCoin(address)", +"b3e8fe00": "totalpro()", +"b3e98f82": "viewClaimableInvestorDividendPool()", +"b3e99b77": "systemClaimAirdropMultiple(address[])", +"b3e9da0c": "businessersTotalBalance()", +"b3ea3924": "PointlessCoin(int256,uint256,string,uint8,string,address)", +"b3ea553b": "JoyCoin()", +"b3ea5984": "getIndexOfTarget(address[],address)", +"b3eaaa7e": "calculateCHGAmountToEther(uint256)", +"b3eae9ac": "WashingtonExchange()", +"b3eb3a86": "getClosedContract(bytes32)", +"b3ebc3da": "weiRaisedTotal()", +"b3ed1957": "USDMToken()", +"b3ed2081": "fixedExpTest(uint256,uint8)", +"b3ede13f": "addToPrizePool()", +"b3ee4564": "assertStillValid(uint256)", +"b3ee5307": "CountersUpdated(uint256,uint256)", +"b3ee7248": "getDate(uint32)", +"b3eee638": "icoEnablersTokensMinted()", +"b3ef0045": "decodedRecipient()", +"b3ef774b": "getNumOfTokensBonusOnPurchase(uint256)", +"b3f00674": "feeReceiver()", +"b3f05b97": "finalized()", +"b3f08078": "bookCanvasFor(uint32,address)", +"b3f15866": "CropOracle(address)", +"b3f17c20": "miningOne()", +"b3f19abd": "GetRecordAddress(uint256)", +"b3f1c0c9": "setIssuer(address,uint32)", +"b3f1f31b": "testRecurringClones()", +"b3f22cb4": "setLUCKContractAddress(address)", +"b3f2c866": "startDateOfSaleStageLast()", +"b3f2ecfd": "endDiscountTime()", +"b3f2fa99": "playersShareAllocation()", +"b3f3668c": "getprizeamount()", +"b3f3ab5c": "removeContributor(address)", +"b3f3dcf6": "reinvestSubdivsAmount(uint256)", +"b3f3e673": "switchPeriod()", +"b3f3e737": "SendWalletFees(address,address,address)", +"b3f4d235": "updateCnyEthRate(uint256)", +"b3f50029": "finishedGameWithdraw()", +"b3f523a8": "devuelveTodasApps()", +"b3f57bae": "tokenIncluded(address)", +"b3f5849f": "Battle7oken()", +"b3f5ab78": "noncex()", +"b3f691c2": "approvePendingCostume(uint256)", +"b3f841ba": "minimumNumberOfTokens()", +"b3f865f7": "rebalance(address,address,uint256)", +"b3f8bef1": "tgeSettingsAmountCollect()", +"b3f936f2": "getTypeName(uint32)", +"b3f98adc": "vote(uint8)", +"b3f9b6e1": "showPlayerScores(address)", +"b3fa24ef": "getUnlockSdc()", +"b3faa12d": "blockTokens(address)", +"b3fad72f": "deposited(address,uint256,string)", +"b3fb052a": "NTVUToken(uint8,uint256,uint256,uint256,uint256,uint256,bool,string,address)", +"b3fb14ad": "getGameResult()", +"b3fb59c1": "_setCardId(uint256,uint256,uint256)", +"b3fc0c83": "safeLock(uint256,uint256)", +"b3fc34d4": "specialSanMint(string,string,address,address)", +"b3fcb85b": "Sold_Token()", +"b3fdc99d": "signalTradeIntent(address)", +"b3feda02": "ASSET_MANAGER_WALLET()", +"b3ff0065": "CGC()", +"b3ff1112": "redeemFunds(uint256,uint256,uint256,bytes32)", +"b3ff277d": "totalWon()", +"b3ff8bfb": "BONUS_5_DAYS()", +"b3ffb760": "buy(address,uint256,address,uint256)", +"b4003de4": "removeFromTeamBalanceMap(address)", +"b4007cda": "emergencyFlag()", +"b400d149": "betOnNumber(uint8)", +"b40127f0": "bestmoney()", +"b4015034": "cancelExplorationByShip(uint256)", +"b401faf1": "claimWinnings()", +"b4022950": "collectFeesInEther(uint256)", +"b4024d9f": "testTransferNoMoreThanTokenBalance()", +"b4025b92": "deployProject(uint256,bytes32)", +"b4026ed5": "clearAuth(address)", +"b402973c": "SeeToken(uint256,string,string)", +"b4037767": "CryptoUniversityTuition()", +"b4037bca": "setWins(uint256,uint16)", +"b4038efe": "setVestTokenAllocationAddresses(address,address)", +"b403c290": "getwinningaddress50()", +"b404e001": "COMMISSION_PERCENT()", +"b4051397": "TokenEtcb(uint256,string,uint8,string)", +"b405c549": "waiting()", +"b40615c6": "soldTokensTotal()", +"b4068734": "drawWinner(uint32,int8)", +"b406cf39": "isPeriodTimePassed(uint256)", +"b406d386": "convertForPrioritized3(address[],uint256,uint256,address,uint256,uint256,uint8,bytes32,bytes32)", +"b4071f8f": "setBlacklist(address,address,bool,bool)", +"b4073060": "getLockListLen(address,address)", +"b407d1d2": "allocate7ProjectToken()", +"b408ac01": "totalCandyNo()", +"b4099ff7": "queryImage(address,bytes)", +"b409da05": "logDoubleIndex(bytes,bytes,bytes,uint256)", +"b40a5627": "bidCount()", +"b40a9304": "allocateDelayedTokens(address,uint256)", +"b40b234e": "DigitizeCoin()", +"b40bfd35": "AlexTestCoin()", +"b40d8d58": "hodlerTime9M()", +"b40e415e": "mutagen2FaceContract()", +"b40e4bec": "computeCap(uint256,uint256)", +"b40e76fa": "minePoP(address,uint256,uint256)", +"b40ee3b3": "NewSmartSharingContract(string,uint256,uint256,string,string,string,uint256,string)", +"b40ee8b4": "setCredit(address,uint256)", +"b40f0352": "refund(address,address[])", +"b40f6f4c": "buyOptions(address,uint256)", +"b41044c4": "btc_token(address,uint256)", +"b410a034": "issuanceRatio()", +"b4114165": "foundationFundTokenCountInWei()", +"b411e54f": "removePolicyFrom(address,uint8)", +"b411ee94": "hash(string)", +"b4123abb": "getBatch(address,address,uint256)", +"b412506b": "turnFaucetOff()", +"b41283bc": "parseTradeCompatible(bytes)", +"b412a2d7": "StartDateUpdated(uint256,uint256)", +"b412a4b7": "asideTokensMintDate()", +"b412b1e9": "getForestCount()", +"b412b445": "icoBonus3()", +"b412d4d6": "CafeDelivered()", +"b412d627": "TokenWin(address,uint256,uint256)", +"b4134e6e": "totalRedeemedValue()", +"b413c923": "setReservedTokens(uint256,address[],uint256[])", +"b4144b79": "getTradesByAddress(address)", +"b414d4b6": "frozenAccount(address)", +"b4150f17": "masterAuth()", +"b415c4ca": "total_burned_by_raffle()", +"b416bc93": "TokenAllowance()", +"b4174cb0": "right51(uint256)", +"b41762f9": "capIncreased()", +"b41960d4": "redeemGift(string,address)", +"b419bd17": "getNumCoins()", +"b419dd2d": "hashesUsed()", +"b419f447": "ZipcoinToken()", +"b419f73b": "proveIt(address,bytes32)", +"b41a6ce2": "changeSettings(uint64,uint64,uint8)", +"b41a9f22": "totalRedemptionIdValue(address,uint64)", +"b41b208e": "DLP()", +"b41b3967": "m_holders(uint256)", +"b41bfa6a": "ABLGenesisToken()", +"b41d989d": "angelsDayCooldownEnd()", +"b41e6640": "taxMan()", +"b41e79d4": "firstChangeBlock()", +"b41f511c": "trade(uint256[],uint256,uint8,bytes32,bytes32,bytes)", +"b41fc258": "balanceOfPaillier(address)", +"b4200294": "totalApprovedAmount()", +"b42072e4": "tokenExchanged()", +"b420feb2": "ethDepositAddress()", +"b4210257": "addInitiator(address)", +"b4214c8c": "LogWithdrawal(address,uint256)", +"b42220ad": "enableChangeChannel(bool)", +"b4223757": "modifyMilestoneFrom(address,uint8,uint8)", +"b423c31e": "catchYou(address,uint256)", +"b423d93f": "icoUsd()", +"b424bd83": "getLastOrderId(address)", +"b425282d": "getBonusPool(bool)", +"b4256888": "openTime()", +"b425bd43": "distributeTokenToAddressesAndAmountsWithoutHost(address,address[],uint256[])", +"b42748d3": "PSYT()", +"b4279df3": "initialization(address,address,address)", +"b427c148": "calculatePointsBlock(uint32)", +"b4288aa5": "EventBattle(address,uint64,uint64,uint64)", +"b42963f8": "executeUpdateTransferMinimumFeeProposal(uint256)", +"b429844c": "userBanned(address)", +"b429af5e": "changeBotAddress(address)", +"b429afeb": "isController(address)", +"b429f65a": "totalEtherCookieResearchPool()", +"b42a02b5": "updateDID(string,string)", +"b42a11f9": "refundAllCollateral()", +"b42a275e": "bankAmount()", +"b42a8bf9": "_distributeRevenue(uint256,uint256,uint8,uint8)", +"b42b14c4": "DCNForGas()", +"b42b8559": "createPreSale(uint256,uint256)", +"b42c6b4f": "getPumpRate()", +"b42d6bd2": "SunToken(uint256,string,uint8,string)", +"b42dfa0d": "gen()", +"b42e49ef": "rollFive(address,uint8,uint8,uint8,uint8,uint8)", +"b42e8923": "pushBAU2(bytes32,address,uint256)", +"b4307192": "Bible()", +"b430da3c": "migrateHero(uint256,address)", +"b431da0c": "JavaOwnerExample()", +"b43216bf": "cvsquare(uint256[],uint256)", +"b4328e5b": "TokenSale(uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"b4330e24": "transferred_total()", +"b43386cd": "testBalanceAfterDeposit()", +"b434486a": "getPriceRiseAndFeePercent(uint256)", +"b4349daf": "TOTAL_HAWKING()", +"b4350e69": "ARBITRAGING(address)", +"b43545bb": "ownerValidate(address)", +"b436db29": "deployNetwork(address,address)", +"b43716a0": "getMajorityThreshold()", +"b43740c0": "casamenteiroToken()", +"b4375dc9": "adminSetEnabled(bool)", +"b4380764": "totalTokenHolders()", +"b438a2d0": "RigIdle()", +"b438d018": "guessNumber(uint256)", +"b439548d": "getStudent()", +"b43959c0": "setMembershipStatus()", +"b4396d42": "SAKECOIN()", +"b439be79": "AHCToken()", +"b43bd069": "getNumPassingTokens(address,uint256,uint256)", +"b43c19a6": "monsterAuction()", +"b43c35a5": "p_update_action(uint256,address,address,uint256,string)", +"b43c39a7": "_setRenewable(uint256,bool)", +"b43d42ec": "revokeRatioVote(uint8)", +"b43d4851": "transferSupply(address)", +"b43d9ede": "setMapMaster(address)", +"b43dbffc": "BulletinBoard(address)", +"b43f8a5c": "registNameXname(string,string)", +"b4402991": "userVoteFor(address,uint256,uint256,uint256)", +"b440b5c7": "EthPyramid00XX()", +"b440bf39": "setMonethaGateway(address)", +"b440f7ff": "setInterestor(address,uint256,uint256)", +"b4421cbd": "isPreTokenSaleActive()", +"b4421e7c": "releaseFoundationJM(address)", +"b442649d": "IlluminaCoin()", +"b4427263": "createTokens()", +"b443a085": "boom(uint256)", +"b443c607": "verifyCestificate(address,uint256)", +"b444b606": "getNowTokenPrice()", +"b444ff41": "setFirstRoundPricing(uint256)", +"b44531d3": "test_payment()", +"b4454253": "timePassed()", +"b446b5aa": "addAuthorized(address,address)", +"b446e7b9": "outterlockStartTime()", +"b4472022": "AECTToken(uint256,string,string)", +"b4478d7d": "updateTurnover(bytes32,uint256)", +"b447968c": "enterWithReferral(uint256,address)", +"b447acfa": "doubleSomeVar()", +"b447cfd4": "InitQuantity(int32,string)", +"b448017b": "periodPREICO()", +"b449188a": "updateCirculation()", +"b4495b7d": "MIN_USD_FUND()", +"b44996c4": "checkProof(bytes32,bytes,uint256[],bytes,bytes)", +"b449c689": "testdata()", +"b44a5e64": "GreenMed()", +"b44b0836": "getEAAttributes(uint32)", +"b44ba774": "_existPublicKey(bytes32,address)", +"b44bd51d": "getConfig(string)", +"b44bd688": "recoverLost(address,uint256)", +"b44cac23": "addJobSponsorship(address,address,uint256,string,string,uint256)", +"b44d7325": "signedTransferFromHash(address,address,address,address,uint256,uint256,uint256)", +"b44df72d": "tokensClaimed()", +"b44e2ab9": "onlySignerMock()", +"b44ec921": "whiteListContract(address)", +"b44eccc9": "periodICO()", +"b44ed831": "isDailyUplimitReach(address,address,uint256)", +"b44ef712": "secondRefundRoundFinishTimestamp()", +"b44f776a": "Test22Coin()", +"b44f794f": "removeUserRole(address,uint8)", +"b44f8cda": "icoSaleDeposit()", +"b45105b2": "post(string,address,string)", +"b4512913": "voteStatus(bytes32,uint256)", +"b45156fc": "startDate2()", +"b451794e": "numberOfOrders()", +"b4538897": "ICO_PHASE3_AMOUNT()", +"b4539817": "Donator2()", +"b453afb8": "getMinDisplayPrice()", +"b453fb01": "feeReceiverContract()", +"b4542a70": "getLLV_edit_19()", +"b454c415": "rNo()", +"b454e62e": "addPool(bytes32,address,uint256,uint256,uint256,address)", +"b456d9e2": "activateCrowdSale()", +"b456ecc5": "GetHash(bytes)", +"b458189f": "setAccountB(address)", +"b4590cbe": "ICOStatus()", +"b4594c36": "numberOfQuestions()", +"b4596ea6": "setPlayerGeneralAttrAdd(uint64,uint8,uint32)", +"b459c3fe": "WithdrawUnclaimed()", +"b45a2712": "mintCapInUSD()", +"b45aff16": "pullBalance()", +"b45b290d": "finalizePretge()", +"b45b7a51": "TokenSold(uint256,uint256,address,address)", +"b45be89b": "toGiveBase()", +"b45c48dc": "Security_AddPasswordSha3HashToBankAccount(bytes)", +"b45cff5f": "houseBankRoll()", +"b45db978": "Centspooladdress()", +"b45dd873": "enableBurning(bool)", +"b45f6df2": "updateDayTokenFees(uint256)", +"b45fb209": "setNewMessageNumber(string,uint256)", +"b460481d": "redeemShares()", +"b46062ad": "setInterestRate()", +"b460af94": "withdraw(uint256,address,address)", +"b4612d78": "CD(uint256,string,uint8,string)", +"b4621d07": "LimitBottom()", +"b4628c8a": "ENSRegistrar()", +"b46300ec": "send()", +"b46310f6": "setBalanceOf(address,uint256)", +"b463a75c": "addTeam(address)", +"b463bcde": "testThrowsSetNotTransferableNotOwner()", +"b46452a1": "convertTokensAmountInWeiAtRate(uint256,uint256)", +"b464631b": "get(address,uint256)", +"b464d582": "checkHowManyOwners(uint256)", +"b464d99e": "startTimeEarlyBird()", +"b465307c": "validPayAmt()", +"b4654d98": "transferMinusFees(address,uint256,uint128,uint16)", +"b465e52f": "secondRefundPollDate()", +"b46631cd": "SetTestModeHands(uint256,uint256)", +"b466b76f": "fresh()", +"b4670002": "updateEntries(address[],bool)", +"b4679b06": "multiplyWithNumber(uint256)", +"b46801c2": "balanceUpdatesCount(address)", +"b4693d23": "changeOpeningClosingTime(uint256,uint256)", +"b469ba24": "updatePokemon(uint256,uint256,uint256)", +"b469d6c8": "setFundingLowcapReached(uint256)", +"b46a8a21": "support_proposal()", +"b46bcdaa": "entries(bytes4)", +"b46e42ec": "setClue4(string)", +"b46eeebb": "TOKEN_FUTURE_CAP()", +"b4706fa1": "tokenSalesCapReached()", +"b470aade": "periodDuration()", +"b471fade": "_withdrawal()", +"b473d3b6": "EjariRulesC()", +"b4745939": "convertEtherToDust()", +"b47481a9": "BajwaToken()", +"b4750ca0": "getMiniumInputEther()", +"b4755160": "mkhash(uint256,uint256,bytes32,string)", +"b4758e82": "tokenAssignExchange(address,uint256)", +"b475a1c8": "ALLOC_TEAM()", +"b4765db7": "transferFromToken(address,address,uint256)", +"b476de2e": "callURL(string,string,string,string)", +"b47779ce": "FivePercent4Ever()", +"b47784d9": "testControlDisownNotOwner()", +"b477e7d5": "getFullTicketDetails(int256,uint256,uint256)", +"b4781f63": "change_coef(uint256)", +"b4787dc5": "linkEID(bytes,bytes)", +"b478886d": "promethCost()", +"b478f416": "setBaseCurrency(address)", +"b47a7a67": "proveIt(string)", +"b47b2cfe": "retraitStandard_4()", +"b47b6116": "removeCapFreeAddress(address)", +"b47be3e4": "addToWhitelist(address,uint256,uint256)", +"b47c11e8": "fidget(address)", +"b47d7409": "disablePurchase()", +"b47d89ad": "Details()", +"b47dbf22": "minPurchaseAmount()", +"b47deb3c": "winner(uint256,uint256)", +"b47df046": "setGrantEnable(bool)", +"b47e4c6c": "getTestOne()", +"b47f817e": "confirmAllBuys()", +"b47f833c": "contains(int8,int8)", +"b47fa7e0": "DepositLimit(uint256)", +"b4800033": "set(bytes32,string)", +"b4801272": "Dust()", +"b480eac0": "setTarget(uint256)", +"b4816be9": "endOfRewardsConfirmed(bool)", +"b4819e76": "getTokenDescription(address,uint256)", +"b481cbc0": "withdrawJajalanTokens(address)", +"b4821203": "investInQueue(address,uint256)", +"b483c054": "setOtherFomo(address)", +"b484d371": "fundReferrel(address,uint256)", +"b484de0d": "GetHashedMove(string,string)", +"b484e532": "getMyMsg()", +"b48585e5": "ATM(uint256,string,uint8,string)", +"b4861ca5": "assertSaneBalance(uint256,uint256,uint256)", +"b48666ee": "silverSaleLimit()", +"b4873ac7": "setCEOAddress(address,address)", +"b487b699": "addData(address[],uint256[])", +"b488abd8": "ANACoin()", +"b488f00e": "runSuperPrivilegeLuckyDraw()", +"b4894b1d": "gaps(uint256)", +"b489b365": "authorizeStore(address)", +"b489c597": "limitPresale()", +"b48ae96f": "finalizeRoom(uint8)", +"b48b4204": "register(bytes32,uint256,address,string,uint256)", +"b48b73aa": "setDivBonus(uint256)", +"b48bc2ee": "transferDepositsToNewDao(address)", +"b48c6807": "EtherLinkToken()", +"b48d323f": "getLiveChallenges(uint256)", +"b48eea44": "isWhitelisted(string)", +"b48f4f5c": "PreICOCents()", +"b48fcdc0": "setConfiguration(uint256,uint256,uint256,uint256,uint256,uint256)", +"b4909307": "getData(address,address)", +"b490e79f": "getChosenFreelancer()", +"b4921774": "getReportsByReporter(address)", +"b4929d4c": "publicSell()", +"b492bd32": "setMulBonus(uint256)", +"b493b0d0": "GESToken()", +"b4942ad1": "transferByCoinOwner(address,address,uint256)", +"b4944333": "getPlayerEarning(address)", +"b494b49d": "variationProbably()", +"b494f1fb": "totalReservedTokenAllocated()", +"b49575a7": "CORENET()", +"b49593fe": "PREMIUM_SALE_PACK_COUNT()", +"b4961379": "private_setOracleFee(uint256)", +"b49651ef": "FAPFund()", +"b4972398": "CTCToken(address)", +"b497d17d": "TileUpdated(uint256)", +"b4980148": "numberOfStarsToReserve()", +"b49845f9": "EventClear()", +"b498e3e4": "NeverConfused()", +"b4999e85": "endBlockNumber()", +"b499a26f": "getHowManyLeftToDistribute(uint256)", +"b499b2ce": "doNotThrowOnValidDiv()", +"b49ce17f": "totalCapsules()", +"b49d3a53": "stopTokenTransfer()", +"b49e3b62": "getPenetration(uint256,uint256,uint256)", +"b49f4afd": "getBasePrice()", +"b49f57ad": "getLastLevel()", +"b4a09ba9": "canAccessExclusive(address)", +"b4a0a6b8": "Sgethereum(uint256,string,string)", +"b4a0e24c": "getQuotaCheck()", +"b4a176d3": "restoreRegistry()", +"b4a2251e": "getOp()", +"b4a3208a": "SUAppToken(uint256,string,string)", +"b4a357a2": "get_participant(address)", +"b4a39dfd": "getChildId(bytes32,uint256)", +"b4a4136d": "BIMI_DAO_31()", +"b4a516a6": "addRTO(uint256,address)", +"b4a523e8": "mintedTotallyByBridge(address)", +"b4a5ef58": "updateDefaultTimeoutPeriod(uint256)", +"b4a61608": "MAX_STAKE_PATHS()", +"b4a66678": "Numtokens()", +"b4a77b0e": "isUserBlocked(address)", +"b4a7a022": "_buyInBatch(uint256,address,uint256,uint256[],uint256)", +"b4a8dd5b": "updateTimestampLimit()", +"b4a8f3e6": "timeOfDeath()", +"b4a93d9b": "transferBasic(address,address,uint256)", +"b4a97fc1": "removeBottomUpChild(address,uint256,uint256)", +"b4a99a4e": "Owner()", +"b4a9d156": "changeWaitTimeUntilWithdrawOrTransfer(uint256)", +"b4aa24db": "uncheckedUpgrade(address)", +"b4ab271c": "giftIdToGift(uint256)", +"b4abda8b": "sendOwnershipAndCall(address,uint256,bytes)", +"b4abea24": "BONDS()", +"b4ac5452": "exerciseCUSE(address,uint256)", +"b4ac8ad9": "getRetailerBalances(address,address)", +"b4ad016d": "Socialife()", +"b4ad6b5b": "transferFromTo(address,address,uint256,bytes)", +"b4ae641c": "arrayLimit()", +"b4b063df": "addNewClaim(string,uint256,uint256,string,string)", +"b4b06a74": "GiftClaimed(address,uint256,uint256)", +"b4b097eb": "addNewState(string,uint256[])", +"b4b0a6e2": "ADULTEUM()", +"b4b14467": "submitTokenTransaction(address,address,uint256)", +"b4b179dc": "getAmountToGive(address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,bytes,bytes,bytes)", +"b4b1b6d9": "getRecordStateRequiredChanges()", +"b4b1d9c7": "getDescription(address)", +"b4b22b5e": "ico_allocation()", +"b4b2938a": "Finapse()", +"b4b2d3d8": "phase3Price()", +"b4b3b028": "AddChain(bytes)", +"b4b4ff0a": "setDateStartTransfer(uint256)", +"b4b54328": "getActualPeriod()", +"b4b598ce": "TEAM_FUND()", +"b4b5b48f": "tokenData(uint256)", +"b4b68490": "totalTokenCap()", +"b4b68dab": "createPermissionsBot(address)", +"b4b71450": "PlaceRocketForSaleEvent(address,uint32,uint80)", +"b4b7771d": "setInvadeAddr(address)", +"b4b857d8": "DepositEther(address)", +"b4b9cd62": "UpgradeRig(uint8,uint16)", +"b4b9d1f1": "lookup(uint256,uint256)", +"b4ba2a1b": "percentFrom(uint256,uint8)", +"b4ba2eaa": "moveEther()", +"b4ba349f": "sing()", +"b4ba9e11": "claimFor(address,address)", +"b4baf9ff": "HybridX()", +"b4bb1b0a": "isEscrowActive()", +"b4bb58fb": "mix(uint256,uint256)", +"b4bbfb9e": "StateTransition(uint256,uint256,uint256)", +"b4bc3564": "do_guess(uint256)", +"b4bcc23b": "setInvest(address,address)", +"b4bd5c75": "setupPREICOPeriod(uint256,uint256)", +"b4bd9e27": "isOver()", +"b4be6190": "getFreelancerHourlyRateCurrency(address,address)", +"b4bede85": "transferSenderPaysFee(address,uint256,bytes)", +"b4bee870": "ChangePoolName(string,string)", +"b4beff8a": "GetMinerICOData(address,uint256)", +"b4c045e4": "NHMToken()", +"b4c16970": "BigRedCoin()", +"b4c16ea5": "CREATED_PROMO()", +"b4c28ead": "expertScoreOf(address)", +"b4c2aaee": "tokenPriceMin()", +"b4c2e22c": "_ownerOfLand(int256,int256)", +"b4c48026": "safeBlock()", +"b4c4e005": "testTransferToAcceptAuthority()", +"b4c555a7": "addCollaborateToCampaign(uint256,uint256)", +"b4c5c983": "setMainYouCollectContractAddresses(address,address,address,address[])", +"b4c64ab0": "Goo()", +"b4c65de3": "identify(string)", +"b4c65f7b": "bonusesByDates(uint256)", +"b4c7abaf": "waitTime(address,address)", +"b4c8c5c4": "isApprovedAddress(address)", +"b4c91611": "weiDistributed()", +"b4c93fc0": "setOneGroupJoinersCount(uint256)", +"b4c98496": "CreditAsiaCoin()", +"b4caf8be": "rewardPoolTokens()", +"b4cbdd8b": "setClaimSignerAddress(address)", +"b4cbff23": "disputeStartedFreeze(bytes32)", +"b4cc2181": "setPropertyBecomePublic(uint16,uint256)", +"b4cd3701": "PointGameWithITG(address,uint256)", +"b4cd8865": "getArrBoolField1()", +"b4cdd3b7": "buyCertainOrder(uint256,uint256)", +"b4cdeb78": "LarsGeburtstagsgruss()", +"b4ce8ae0": "updateCrowdsaleEndBlock(uint256)", +"b4cec530": "totalFailedOldOwnerTransferAmounts()", +"b4cf5648": "PRESALE()", +"b4cfd972": "ROUND_4_PRESALE_BONUS()", +"b4cff9f5": "depositBool(address)", +"b4d00d94": "setIcoCap(uint256)", +"b4d01e87": "urandom(bytes32,uint256)", +"b4d07c7d": "GetWorldSnapshot()", +"b4d07e81": "setString(bytes)", +"b4d0ccb6": "getVaultInterestPerDay()", +"b4d0e552": "rareStartPrice()", +"b4d11f35": "getReleased(address)", +"b4d12bfa": "withdrawStudios()", +"b4d14728": "setRateAddress()", +"b4d168f7": "getFundedTokenCount(bytes32,string)", +"b4d1c485": "unlockFunds()", +"b4d1d795": "PERIOD()", +"b4d314f2": "isWithinPeriod(address)", +"b4d3c122": "CXLTotalSupply()", +"b4d3ef5f": "contributedEth()", +"b4d40694": "getPreminer(address)", +"b4d462b3": "unlockDate3()", +"b4d49b62": "RemovedTokenHolder(address)", +"b4d510dd": "countOfSaleTokens()", +"b4d60cfd": "payoutMining(uint256,address,address)", +"b4d657cc": "modifyCurrentHeroPrice(uint256,uint256)", +"b4d6befe": "BuyForHKGTransaction(address,uint256,uint256,uint256,uint256)", +"b4d6d4c7": "getPackageData(bytes32)", +"b4d8166e": "northadvisor()", +"b4d85686": "deductFee()", +"b4d927d0": "moneyFreeze()", +"b4d9cc3a": "profitDisperser()", +"b4da40f3": "getBadBets(uint256)", +"b4da4baf": "OWPayoutArb()", +"b4da662c": "_acceptDividends(uint256)", +"b4dad588": "numPendingRequests()", +"b4daff13": "test(uint256,uint32)", +"b4db1fc1": "deleteCandidatesBatch(address[])", +"b4dbf642": "buyATicketFromContract(uint256)", +"b4dc3dc7": "unbundle(address,uint256)", +"b4de64bd": "Sarf()", +"b4de8673": "balance0f(address)", +"b4def1e7": "completedTransfers()", +"b4e05b89": "getOwnedShips()", +"b4e0aa3e": "testCallBack(uint256)", +"b4e0b764": "minSumICOStage5USD()", +"b4e19f3e": "getBestGuessSecondPlaceTentativeWinningPayoutDistributionHash()", +"b4e1a78e": "correctExchangeRateBTCxETH(uint256)", +"b4e28f79": "test_TorontoRules()", +"b4e327ec": "MajListNotVal()", +"b4e3add2": "_createCollection(string)", +"b4e3c486": "addProposal(uint16,uint256,string)", +"b4e50c9b": "contributed4(address)", +"b4e51b7b": "sane()", +"b4e56e01": "setMerchantRate(address[],int16)", +"b4e6850b": "add(uint80,uint80,address,uint32,uint32,uint32,uint256)", +"b4e68dc1": "ERC721BasicToken()", +"b4e6f92b": "BuyTroop(uint256,uint256)", +"b4e7fe0c": "pendingOraclize()", +"b4e81236": "_verifyOptionPoolIncome(address,uint256)", +"b4e8c036": "ProofOfWeakFOMO()", +"b4e92f20": "getInitializeUniverseValue()", +"b4e9ac13": "getAddressRefundValue(address)", +"b4ecb847": "areTokensDistributedForAddress(address)", +"b4ed3622": "calculateDecayedBalance(uint256,address)", +"b4ed7ec3": "getVoteOption(uint256,uint256)", +"b4ed8bf8": "removePolicyAttribute(uint8,uint256)", +"b4ee4f81": "Sotko()", +"b4eecb54": "s_pwd()", +"b4eff690": "checkFlag(bytes)", +"b4f14b2b": "DragonsBurned()", +"b4f15310": "invalidateHash(uint256,uint256)", +"b4f181c6": "ethToUsdExchangeRate()", +"b4f20aa9": "executionOpen()", +"b4f272e3": "TOPToken(uint256,string,uint8,string)", +"b4f2bb6d": "getPoolIds()", +"b4f2dc7d": "approveDividends(uint256)", +"b4f2e8b8": "setFee(uint256,address)", +"b4f3625e": "fuelContract()", +"b4f3b453": "reserveTimelock()", +"b4f40c61": "k()", +"b4f48e08": "projectFoundersReserved()", +"b4f4e284": "addAdminWhitelist(address[])", +"b4f5a21a": "getCurrentPeriodIndex()", +"b4f5a6a6": "minPurchaseOnce()", +"b4f5b9b9": "affiliatThreshold3()", +"b4f5d282": "getImmed(bytes32)", +"b4f666da": "capToken()", +"b4f6aa56": "getForSalePrices(uint16)", +"b4f7451b": "getTransactionVATTotal(uint256)", +"b4f80eb9": "getPixel(uint256)", +"b4f82c6a": "readCompany(uint8)", +"b4f94b4f": "_transferByDefaultPartitions(address,address,address,uint256,bytes,bytes)", +"b4f9529c": "RemoveMember(address,address)", +"b4f96d60": "_calculateBonus(uint256,uint256)", +"b4f9b6c8": "kill(bytes32)", +"b4fadcad": "relayMetaTx(uint8,bytes32,bytes32,address,bytes)", +"b4fc0344": "getAdsCountByCat(uint256)", +"b4fc3e3b": "createSchedule(address,uint256,uint256,uint256,uint256)", +"b4fcf935": "revealBet(uint256,uint256,bool,bytes32)", +"b4fe3017": "Whitelist(address[],uint256)", +"b4ff4f3d": "setCanMint(address,bool,int256)", +"b4ff87f2": "_approveTransaction(uint256,address)", +"b4ffaece": "setReservedTokensListMultiple(address[],uint256[],uint256[])", +"b4fffa52": "min_value()", +"b5000405": "gifted()", +"b5004d1c": "currentPotSplit()", +"b500cc08": "toBase58(bytes)", +"b501671c": "KillingChainToken(address,address,address)", +"b501df23": "Mintloot()", +"b503a2b9": "categoryId()", +"b503fcf3": "totalToSale()", +"b5040f0a": "getLastSessionVote(uint256,address)", +"b5044e85": "BATO()", +"b5046219": "getDailyPrice()", +"b504adda": "LOG_BetLost(address,uint256,uint256,bytes32)", +"b505a3f2": "LOG_Payout(address,uint256)", +"b505c6ef": "releaseTokens(address,address,uint256)", +"b507f7c4": "_setBlockHash(uint256)", +"b508069b": "implChangeReqs(bytes32)", +"b508adb9": "isStateInit()", +"b5093f7c": "HasNoEther()", +"b50954b6": "cancelWaitingForOpponent()", +"b509bae5": "OpenFundFactory()", +"b509c090": "getCurrEthValue()", +"b50a0899": "seeZombieDna(uint256)", +"b50a89f3": "MyToken(uint256,string,string,uint8)", +"b50bf8cb": "getStakeholderConfirmations(uint256)", +"b50c77f2": "initWallet2of3()", +"b50d2b35": "currentTokensRemaining()", +"b50e44b8": "EXCHANGE()", +"b50e4610": "refoundTokens(uint256)", +"b50eb5d7": "KeyTokenSale(uint256,address)", +"b50f2832": "set_participant_num_of_uses(address,uint8)", +"b50fa90b": "verPlayer()", +"b50ff2b8": "hiddenCapTriggered()", +"b51051d4": "addDataPoint(uint256,bool,string)", +"b510dc2a": "setIcoAddress(address,uint256)", +"b510e42c": "ethOfKey()", +"b510fe45": "newIdShip()", +"b5116a93": "getMyOwed(address,address)", +"b5120c30": "canBeClosed()", +"b5125493": "organizer4()", +"b5128f66": "view38()", +"b512e8a6": "agtAtnReceived()", +"b512f98c": "TSFINAL()", +"b5133189": "anotherOwner2()", +"b51459fe": "canWithdraw()", +"b5147d64": "getAccountCoords(address)", +"b515622f": "_getBonus()", +"b5160d6f": "setFreeMem()", +"b516444a": "mine_success(bytes32)", +"b516ce40": "manageKey(uint256,uint256,uint256)", +"b516cf2e": "MainContract()", +"b5175571": "changeCheckDate(bool,uint256,uint256)", +"b517570a": "ICO_TIER_FIRST()", +"b518a776": "tmp()", +"b519719e": "assertCheck(bool)", +"b51996de": "setWalletWithdraw(address)", +"b519c05b": "updateAdditionalEmission(uint256,uint256)", +"b519cf31": "rateLimiter_()", +"b51a81b4": "setOrganizationLogo(string)", +"b51aae5a": "ResetAirdrop(uint256)", +"b51abfcd": "BCBCOIN(uint256,string,string)", +"b51ac349": "_updateArtistLookupData(address,uint256)", +"b51ad456": "IsPreSaleEnabled()", +"b51b63f7": "sendMessage(address,address,uint256,uint256,bytes)", +"b51bda59": "_depositForRenter(address,uint256)", +"b51be1db": "infytoken()", +"b51c3d2a": "maxImmortals()", +"b51c4f96": "getCodeSize(address)", +"b51d42a2": "customPedro(uint256,uint256,bool)", +"b51d93eb": "confirmNewOwner(address)", +"b51dfa9d": "buySupply()", +"b51f86c0": "getCrcWithdrawAccount()", +"b520b68c": "withdrawForeignTokens(address,bool)", +"b520c7e7": "getWeeklyVolume()", +"b5217c39": "TotalCrowdsaleContributions()", +"b521c106": "bonusDate()", +"b521d3bb": "gcpn(uint256)", +"b522739a": "register_node(string)", +"b52303b2": "TransferToExchange(address,address,uint256,uint256)", +"b5232ba3": "registerUserWallet(address,uint32)", +"b523d13c": "VernamCrowdSaleToken()", +"b5247199": "readPhaseData(uint256)", +"b524abcf": "totalSupply(bytes32)", +"b525256f": "BloxrouteToken()", +"b525ab8d": "min_balance_for_bonus()", +"b5268fa4": "DisableTransfer()", +"b527b0a6": "setSaleAuction(address)", +"b5281b31": "purchaseMysteriousEmblem()", +"b52923a0": "setCompte_11(string)", +"b5299ca6": "giveMeat()", +"b52a3d8d": "initCaps()", +"b52a467c": "buyGold(bytes32,string,string,bytes32,string,string,bool)", +"b52a5851": "burnUnsold()", +"b52a6a38": "atLastUnclaimedFeeAllocation()", +"b52ae3fc": "transferBlackFunds(address)", +"b52b925d": "investorProfit()", +"b52bb6b9": "TokenSale(address,address,address,uint256)", +"b52c0c35": "setPayOutPercentage(uint8)", +"b52c1d5b": "calculateSeed(uint256[],uint256)", +"b52c64c7": "addNewInsurance(bytes32,uint256,uint32,uint32,bytes32)", +"b52db3b9": "updateRecord(address,address,bool)", +"b52e0dc8": "getRateAt(uint256)", +"b52fddbd": "setCrowdsale(uint256,uint256)", +"b53148ad": "currentAmountOfTokensWithNoBonus()", +"b5319335": "promoCreationLimit()", +"b531a872": "icoStop()", +"b532073b": "OwnerChanged(address,address)", +"b5320cd6": "test_22_assertGasUsage100Boards()", +"b532e4cb": "addModerator(address)", +"b5338408": "_numDigits(uint256)", +"b533ff5f": "getLockedStructTimeToLock(address,address,uint256)", +"b534b5b7": "issuedTokens()", +"b5352fa7": "MuMuToken(uint256,string,string)", +"b53564ea": "setInvestors(uint256[],address[],uint256[],uint256)", +"b535b5c3": "hashExists(bytes32)", +"b535c741": "makeOldFucks(uint32)", +"b5364560": "clearApprovalForGeneLab(uint256)", +"b536c686": "burnedTokens(address)", +"b536fa63": "stopGracePeriod()", +"b537488c": "GanaToken()", +"b537752f": "transfer(address,address,uint256,uint256,bool,bool)", +"b537f5b5": "settleBet(bytes32,bytes32)", +"b5389c20": "timeToBeBurned()", +"b538c5ea": "addWorkerPool(address,address)", +"b538cefc": "subtractDarknodeFee(uint256)", +"b538d3bc": "addArbiter(address)", +"b539cd55": "maxProfit()", +"b53aab4c": "changeServicePercentage(uint256)", +"b53b0a75": "Startex()", +"b53b1f12": "findRankByCount(uint256,uint256,uint256,uint256)", +"b53b3f41": "LuckyTree(uint256,uint256,uint256,uint256)", +"b53c71b6": "addLifeEvent(string,string,string)", +"b53c7245": "set_min_contribution(uint256)", +"b53dfdb9": "getTeamFund()", +"b53e07c4": "transferReward(uint256)", +"b53e9dfe": "requiredContribution()", +"b53ea172": "calcBindedBlindHash3(string,address)", +"b53ea1b6": "replaceKey(address,address)", +"b53eb39f": "getSecondsToComplete(bytes16,address,address,uint256,uint256)", +"b53f4d94": "setPOOL_edit_32(string)", +"b53ffba0": "owner_testEnd()", +"b5402ec3": "manager_withdraw()", +"b54030d5": "recordNr()", +"b54050c2": "_updateStateIfExpired()", +"b54144b2": "Receipt(address,uint256,uint256)", +"b5417a52": "TEAM_VESTING_WALLET()", +"b541a778": "SampleOffer(address,bytes32,uint256,uint256,uint256)", +"b5420d68": "getCategoryPack(bytes4,uint256)", +"b5432fcc": "setManagerAgent(address)", +"b5439012": "closeSale(address,uint256)", +"b543d4b4": "getMasterWallet(address)", +"b54430ce": "canSign()", +"b5444ef2": "becomeCoowner()", +"b5446457": "deleteRoomByIndex(uint256)", +"b544bf83": "lockTimestamp()", +"b545252c": "isNewDay()", +"b545ddf5": "calculateReleased()", +"b545f2a6": "cards_blue(uint256)", +"b547a726": "turnOff(address)", +"b547aeda": "spawn()", +"b547b7a1": "committeesMap(address)", +"b54811f1": "EtheremonTransform(address,address,address,address,address,address,address)", +"b5481743": "exchangeRateAgent()", +"b5483f28": "changeAddressJoker(address)", +"b548b892": "getMarketWithInfo(uint256)", +"b548c6f6": "Transaction1()", +"b549793d": "scheduleCall(bytes4,bytes,uint256,uint256,uint8,uint256)", +"b549bdda": "XavierToken()", +"b549c6b3": "_transferInvestor(address,uint256)", +"b54a7987": "LogGetDeposit(address,uint256,string)", +"b54b1187": "setdteamVaultAddr4(address)", +"b54b4fb9": "getPriceOf(uint256)", +"b54beedc": "getCCH_edit_10()", +"b54c71eb": "weightedVoteCountsOf(uint256)", +"b54ca7b4": "setIncreaseK(uint256)", +"b54cd451": "updateFlightStatus(bytes32,uint256)", +"b54d6238": "releaseToken(uint256)", +"b54e7a4a": "sanitize(string)", +"b54eb822": "redistributionTimeout()", +"b54ef544": "buyStakeWithStarCoin(uint256,address)", +"b54f24a9": "getMappingID(string,address,address)", +"b55027a9": "maxMinutesFundingPeriod()", +"b550e634": "getTotalInvestmentsStored()", +"b551c373": "getTotalReputationSupply(bytes32)", +"b5522e89": "addContract(address,uint256)", +"b5531651": "Startable()", +"b553b715": "rewardDistributedUnits()", +"b55459d1": "User_5()", +"b5545a3c": "claimRefund()", +"b554d538": "recoverBounty()", +"b554f8eb": "withdrawAllWei(address)", +"b5554e73": "getPlayerJackpot(address,uint256)", +"b5558562": "tokenWithdraw(address)", +"b556188e": "finaliseTime()", +"b5563dcf": "BillOfSale()", +"b5565aac": "endPromotion(uint256)", +"b556861a": "add_tokens(address,uint256)", +"b556a895": "incFreezeHybridizationsCount(uint256)", +"b556ff26": "NewBid(bytes32,address,uint256)", +"b557478a": "refundClaimed(address)", +"b557a11d": "getReplyCount(bytes32)", +"b557c9a4": "slaveWalletInitialized()", +"b5581663": "airDropMultipleAmount(address[],uint256[])", +"b55845e7": "totalExchange()", +"b55867ea": "_goldUnFreeze(uint256)", +"b558a50c": "LongevityCrowdsale(address,uint256)", +"b558d1ea": "updateRate(address,uint256)", +"b558f334": "isRedemptionPermitted(address,uint256,uint256)", +"b559490d": "payVisa(uint256,uint256)", +"b559b0fe": "withdrawFromRemainingTokens(uint256)", +"b55a7d45": "multiplierPercent()", +"b55ad27e": "getBlipTokenAddress()", +"b55b089b": "bigTokensPerEther()", +"b55cdbf9": "setExtraBalance(address,uint256)", +"b55cff2d": "test_twoValidEqBytes()", +"b55da874": "create_private_room()", +"b55e31f4": "assertOrders(address,bytes32)", +"b55fc3d6": "UnregisterList(address[],bool)", +"b560b6da": "enableDistrict0xNetworkTokenTransfers()", +"b560c4de": "adminPayout()", +"b560d589": "getUserInvestBalance(address)", +"b561d5b3": "OrguraExchange()", +"b5622abc": "EuroGoldTest(uint256)", +"b563b75d": "getAdminRevenue()", +"b564561e": "register(bytes32[])", +"b56494c0": "validateBoard(uint256[81])", +"b56537ef": "isEASigned(uint32)", +"b566d0b4": "getContributorRemainingPresaleAmount(address)", +"b5674c68": "TokenGNO(uint256)", +"b5675ee4": "bookkeeping(uint8,uint8,uint256)", +"b56797fd": "getSaleHourNow()", +"b567a1e7": "ShopClosed(uint32)", +"b568e689": "getCrowdsaleWhitelist(address,bytes32)", +"b5692a67": "removeExemptionAddress(address)", +"b569a35f": "YSSYBToken(uint256,string,string)", +"b56a9f2c": "heartBeat()", +"b56aef62": "sampleTypes(uint32)", +"b56b2627": "add_owner(uint256,address)", +"b56b366b": "maliceReportedForBlock(address,uint256)", +"b56b5918": "TicketRefund(uint256,address,uint256)", +"b56b64d9": "disputing()", +"b56ccd93": "arr(address,address,address)", +"b56d3ccc": "select(bytes32,bytes32,bool)", +"b56d4717": "lockOwner(address)", +"b56e1bca": "setExchangeToken()", +"b56e2d76": "testRewardSS(string)", +"b56ea5cc": "specialApprove(uint256,bytes32,bytes)", +"b56ebf42": "GetNow()", +"b571324d": "ShareErc20(string,string,uint256)", +"b57228fd": "ChangeEmissionGrowthCoefficient(uint256)", +"b5725445": "setOptionalFeeSplit(address,uint256)", +"b5738a78": "SatoMotive()", +"b573a104": "secondStageTokenRate()", +"b5740cc2": "preSaleVault()", +"b5744134": "setLaunchDate(uint256)", +"b5754045": "disown(string,address)", +"b57566d8": "setvalue(string,string)", +"b5776339": "transferGDPOracle(address)", +"b5784f6f": "testMultiplePackages()", +"b57874ce": "addressToPass(address[],bool)", +"b578e764": "ACNN()", +"b579184f": "addContributor(address)", +"b57934e4": "haltCrowdSale()", +"b5794222": "destroyAndSendToStorageOwner()", +"b57980ce": "prepareContribution(uint256,uint256,uint256)", +"b579b6c5": "distributeToken(uint256,uint256,bool)", +"b579d7de": "RewardEnd()", +"b57adee3": "setBanker(address,uint256,uint256)", +"b57c5814": "getDonatorsNumber()", +"b57d5d27": "assertBalance()", +"b57dbdc6": "safeguard()", +"b57e55ec": "seeAllPlayers()", +"b57e6ea1": "tokenGenerationMax()", +"b57ff495": "triggerPauseEvent()", +"b5802ae6": "getCirculationCap(address)", +"b5809c9b": "COPPER_AMOUNT_TPT()", +"b580a7a1": "totalBalanceClaimed()", +"b580d205": "ChangeRate(uint256,uint256,uint256,uint256)", +"b58166f2": "lastRoot()", +"b581b725": "transferToken(bytes8,address,uint256)", +"b582ec5f": "j()", +"b58489ac": "isAuction(string)", +"b5848db4": "validateStartMegabox(address,uint256)", +"b585245b": "_callSender(address,address,address,uint256,bytes,bytes)", +"b58617d9": "CCRCrowdsale()", +"b58637e8": "approveToSell(uint256)", +"b5863ed7": "addContribution(address,uint256,uint256,uint256,uint256)", +"b58696ba": "test_ShouldPassButNoBondSoFail()", +"b587194e": "TokenMigration(address,uint256)", +"b587dc57": "openICO()", +"b587e3c7": "getRank04()", +"b5881422": "unsafeIsEth(uint16)", +"b588bfad": "writeMessage(string)", +"b588fdc1": "takeTokenContractOwnership()", +"b58aa6be": "checkWithdrawalAmount()", +"b58b9d5c": "getSaveData(address,address)", +"b58baa0d": "displayString()", +"b58c2d31": "addAddressManual(address)", +"b58d0651": "checkAllowedAddressFoTransfer(address,address)", +"b58d4885": "addNewTrait(string,bool)", +"b58de1d5": "JSONpath_int(string,string,uint256)", +"b58dff99": "gntContractAddress()", +"b58e5216": "allowBlocking(address,address)", +"b58e60db": "theWord()", +"b58ee9a3": "companyRemainingAllocation()", +"b58f4a24": "LOTTERY_FUND_ADDRESS()", +"b58fa125": "commit_end_time()", +"b58fc3e7": "distributeIncomeEther()", +"b5917478": "TYPE_FREIGHTER()", +"b5919b48": "toBuyBack()", +"b591fc69": "totalEtherContributed()", +"b5922a2b": "INITIAL_AIRDROP()", +"b592500e": "RICEBALLZ()", +"b59284ac": "unlinkAddress(address)", +"b592bb99": "SSDToken()", +"b592de3a": "sell(bytes32,uint256)", +"b5930872": "test_testablestandardcampaignDeploymentAndUse()", +"b5931f7c": "safeDiv(uint256,uint256)", +"b5932ee2": "DistrictsCore()", +"b5936da2": "seedEnded()", +"b594f086": "changeDuration(uint256)", +"b5950529": "CTSCToken()", +"b595181f": "ShapeshiftBot()", +"b595357b": "getLLV_edit_29()", +"b5957288": "getMatchBettingDetails(uint8)", +"b59589d1": "relay()", +"b595b8b5": "betOnColor(uint256)", +"b5962159": "moveMinions(uint8,uint8,uint32)", +"b5967e16": "updatePlayersGoo(address)", +"b59712af": "totalSupplyOfType(uint256)", +"b59724e8": "NewFunding(address,address,uint256,uint256,uint256,address)", +"b597842a": "TimeNow()", +"b597e784": "setTokenPriceInWei(uint256)", +"b5980f7d": "unverifyAddress(address)", +"b598afcb": "oraclize_query(string,bytes[5])", +"b598d3e8": "getMessages(address,uint256)", +"b598f882": "updateTokenRates(uint256)", +"b5999c12": "getPoohsSinceLastHatch(address)", +"b599aaec": "TheBitcoinCenterToken()", +"b599afc8": "totalBetCount()", +"b59a1598": "distributeGLAU(address[],uint256,uint256)", +"b59a1d37": "buy1(uint256)", +"b59a60db": "minContribute()", +"b59b0fc4": "modifyTokenPrice(uint256,uint256)", +"b59b44f5": "usePlayerFiboken()", +"b59b6acb": "GetDynamicCardAmountList(address)", +"b59bb5e3": "testcall(address)", +"b59bc382": "setReportingFeeDivisor(uint256)", +"b59ca0f6": "registerDINsWithResolver(address,address,uint256)", +"b59d689f": "grantStock(address,uint256,uint256)", +"b59d7fe6": "EtherbotsBase()", +"b59dd856": "GetCardInfo(uint8)", +"b59f16d1": "Set(bytes32,address,address)", +"b59ffdd3": "getFreeAnthill()", +"b5a01992": "setDDF(address)", +"b5a02db1": "totalHouseWinnings()", +"b5a030d8": "link(bytes32[],bytes32[],address[],uint8[],bytes32[],bytes32[])", +"b5a04829": "setLargeCapWhitelistParticipants(address[],uint256)", +"b5a0596e": "declareCheaters(address[])", +"b5a127e5": "minQuorum()", +"b5a1a64b": "lockedRewardsOf(address,address)", +"b5a27a21": "leave_square(uint256)", +"b5a29d11": "purchaseCRS(uint256)", +"b5a312c6": "mintlvlToken(address,uint256)", +"b5a46d5e": "whoOwner()", +"b5a4a146": "generateRnd(bytes,uint256,uint256)", +"b5a4e04a": "canFinalizeEarly()", +"b5a54627": "setPrimaryGameManager(address)", +"b5a5b8f5": "setPreSaleContract(address)", +"b5a60045": "setJob(uint256,string,string,uint256[],uint256,uint256,uint8[],uint8,bool,address[])", +"b5a678d7": "YouRyuCoin(uint256,string,string,uint8)", +"b5a6c525": "extractFrozenAccountLength()", +"b5a7900e": "nextroundsoldierreplenishrate()", +"b5a89065": "getUserData(address,string)", +"b5a8fa80": "VRChainToken(string,string,uint8,uint256)", +"b5a90793": "Sender(uint256,address[])", +"b5a9823f": "tier3Time()", +"b5a9de6e": "minEtherParticipate()", +"b5aab008": "WobToken()", +"b5aae6fc": "_setCurrentSecret(uint256)", +"b5aae91a": "handle_dividend(address,address)", +"b5ab05a5": "tokensHardCap()", +"b5ab58dc": "getAnswer(uint256)", +"b5ac7894": "partnerInfo_for_Partner(bytes32,uint8,bytes32,bytes32)", +"b5ac7c27": "payForOrder(uint256,address,uint256)", +"b5add717": "claim(uint256,uint256,uint256,uint256)", +"b5ade81b": "_BLOCKS_PER_READJUSTMENT()", +"b5ae4519": "endorsements()", +"b5ae64b2": "piStartTime()", +"b5ae8225": "auditSwap(bytes32)", +"b5aebc80": "donate(string)", +"b5aece02": "silverBoxAmountForSale()", +"b5af411f": "NXETToken()", +"b5afb120": "updateSkill(uint256,uint256,uint256,uint256)", +"b5afd61b": "maxForceOffsetAmount()", +"b5b12e75": "isApprovedFor(uint256,address)", +"b5b13462": "getUserTotalSales(address)", +"b5b1fc05": "getAdminFromMintedCappedProxy(address)", +"b5b26505": "DURATION_SALESTAGES()", +"b5b33eda": "scheduleCall(address,uint256)", +"b5b3fc07": "GlowToken()", +"b5b4d0d6": "COLLATERAL_HELD()", +"b5b52096": "fixedFeeInCWC()", +"b5b5a057": "changeMinimumDonation(uint256)", +"b5b64d24": "GetExistsChipList()", +"b5b73c63": "getUserSignedDocuments()", +"b5b77d7f": "executeSettingsChange(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"b5b7916b": "getMembershipType(address)", +"b5b7d767": "vpe_per_eos()", +"b5b86a51": "getReferralBalance(address)", +"b5b879c2": "mAlek()", +"b5b90a26": "addHash(bytes32[])", +"b5ba7074": "isBelow(uint256,uint256,string)", +"b5ba95a0": "ElectronicMusic()", +"b5ba9a7e": "getReferralPackageKind(bytes)", +"b5bab68e": "minLimitPublicSecondSale()", +"b5bb0ade": "agreementExists(bytes32)", +"b5bb5ee4": "withdrawMintTokens(address,uint256)", +"b5bd3eb9": "totalCredits()", +"b5be0ebb": "MStoken()", +"b5bf15e5": "freeze(bool)", +"b5bf4c74": "RandomWinner()", +"b5bf6eb6": "incrementPrice()", +"b5bfdd73": "addDSource(string,bytes1,uint256)", +"b5c05570": "toggleLockIn()", +"b5c07eab": "metaBaseUrl()", +"b5c0c884": "refundLosersBids(uint256)", +"b5c12c09": "cancelRequest(uint32,string)", +"b5c12f4d": "setWhitelistRequired(bool)", +"b5c14adb": "setGamePaused(bool)", +"b5c150d4": "availableAmount(uint256)", +"b5c1662f": "addWei(address,address,uint256)", +"b5c18ea8": "rejectClearingPriceSubmission(address,address,bytes32,uint256)", +"b5c19d59": "betLastTime()", +"b5c1ac14": "toBE()", +"b5c2b889": "XTVBurned()", +"b5c2c600": "Gave(address)", +"b5c3a111": "depositCell(address,uint256)", +"b5c4147f": "getZoneShop(bytes2,bytes16)", +"b5c47f69": "megaRate()", +"b5c56797": "AIMToken()", +"b5c5a635": "incrementProgressOfAddressAndId(address,address,uint32)", +"b5c5f672": "withdraw(address,uint256,uint256)", +"b5c61e90": "TokenMigration(address)", +"b5c645bd": "record(bytes32)", +"b5c6b5a2": "FishFarmer()", +"b5c6e7d6": "getCountsByName(bytes32)", +"b5c73816": "ASSC()", +"b5c7a4e4": "validateReleasedToken(uint256)", +"b5c7b1fe": "claimTokenTokens(address)", +"b5c83592": "offerExists(uint256)", +"b5c8b021": "testMintableToken()", +"b5c8f317": "SimpleERC20Token()", +"b5c90917": "GetAllReferralAddresses()", +"b5c9cbbe": "setBalance(address,address,uint256)", +"b5c9fa0a": "setBountyRewardPercent(uint256)", +"b5ca87c4": "setAccountFactoryV1(address)", +"b5caadf2": "setParams(address,address,address,uint256,uint256)", +"b5cab1ce": "tokenMetadataBaseURI()", +"b5cadc91": "convertForMultiple(address[],uint256[],uint256[],uint256[],address)", +"b5caf461": "removeAllApprove()", +"b5cb0611": "setCrowdsaleState()", +"b5cb15f7": "getUserCount()", +"b5cb6a17": "capDay3()", +"b5cc7e29": "unfreezeTokenTransfer(bool)", +"b5cc84f5": "getVatomOwner(string)", +"b5cc916c": "CITY_PRICE()", +"b5cd1821": "lastBlock_a0Hash_uint256()", +"b5ce3600": "thirdStageDuration()", +"b5cf852d": "triggerHiddenCap()", +"b5d011fd": "updateCalculator(address)", +"b5d02a56": "nextRand(uint256)", +"b5d03751": "YoutubeViews()", +"b5d0c747": "setApiCallsContractAddress(address)", +"b5d0f16e": "getGasScalar(uint256,uint256)", +"b5d11d39": "validatePurchase(uint256)", +"b5d11e99": "testInit()", +"b5d1220a": "hasPreviouslyEnteredCardIds(uint256[])", +"b5d125f1": "isApprenticeChest(uint256)", +"b5d1548c": "CCH_RE_1()", +"b5d1990d": "numRecords()", +"b5d1aedc": "COLOR_YELLOW()", +"b5d29f21": "authorizationPayment()", +"b5d347ed": "CryptoCityToken()", +"b5d34966": "unlockCapital(address,uint256)", +"b5d3a379": "CanaryTestnet()", +"b5d3a9c6": "groomSignedAt()", +"b5d446ab": "mokenEra(uint256)", +"b5d561bb": "migrateManual(address,bool)", +"b5d65f61": "partialRedeem(uint256,bytes32)", +"b5d6cbfe": "FSHN()", +"b5d76067": "Alter_TrustlessTransaction(uint256,bool)", +"b5d7df97": "Sign()", +"b5d7eca5": "token_was_created()", +"b5d8514b": "Arthimetic()", +"b5d86c86": "ownerOfCountryCount(address)", +"b5d89627": "getValidator(uint256)", +"b5d9ac79": "toB32(bytes,uint256)", +"b5d9f80b": "serverEndGameConflict(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address,bytes,address,bytes32,bytes32)", +"b5da0114": "isNull()", +"b5da2df4": "markAsImported(address,address)", +"b5dadb17": "whitelistThreshold()", +"b5db26cd": "manualOverrideEditionBid(uint256,address,uint256)", +"b5dba35b": "onlyMinterMock()", +"b5dc40c3": "getConfirmations(uint256)", +"b5dc9399": "fetchPaidOrdersForPayerByAdmin(address)", +"b5dcbb69": "takeRegion(uint16)", +"b5dd20e9": "createIsland(bytes32,uint256,address,uint256,uint256)", +"b5de8d4c": "getModule(address)", +"b5dea68c": "_addNewEscrow(address,address,address,uint8)", +"b5debaf5": "exp(uint256,uint256,uint256)", +"b5debd95": "totalAmountOfEarlyPurchasesInCny()", +"b5deeca7": "BaseRegistry()", +"b5df3ef8": "WillWithdraw(uint256)", +"b5dfad16": "specialSkinOfTokenId(uint256)", +"b5dfd153": "withdraw(uint256,uint256,address,uint256)", +"b5e02e84": "Exorbuxcom()", +"b5e11819": "disableContract(bool)", +"b5e12715": "updateRankList(address)", +"b5e1fe13": "thirdTokenExchangeRate()", +"b5e221c1": "winnerBidder()", +"b5e292d3": "processHandEnd(bool)", +"b5e2bb10": "reserveBalanceOf(address)", +"b5e3504a": "HumanX1()", +"b5e35248": "stage2NotReached()", +"b5e36417": "transfer(uint256[])", +"b5e4d6ce": "addOrder(bool,uint32,uint128,uint128,uint32,int256)", +"b5e4ece1": "LOG_GasLimitChanged(uint256,uint256)", +"b5e54406": "amountOfItem()", +"b5e574e9": "SetGasSell(uint256)", +"b5e59318": "SLPC_ERC20Token()", +"b5e71687": "getTeam4name(string)", +"b5e73249": "mint(address,uint256,bool,uint32)", +"b5e8077c": "_unpackWarriorId(uint256,uint256)", +"b5e82975": "setMintDone()", +"b5e872e0": "TransferFeeRateExecuted(uint256,address,uint256)", +"b5e8cf02": "burnReward(uint256)", +"b5e91891": "changeStock(address)", +"b5e989c7": "ballotOptions(uint32,uint32)", +"b5ea510a": "YOBTC()", +"b5eaac7f": "pushBlockVerifierAddress(uint256,address)", +"b5eacc01": "investor(address,uint256,uint256)", +"b5ec85f0": "getOldBalanceOf(address)", +"b5ed298a": "proposeOwner(address)", +"b5ed886f": "getExchangeRateInCents()", +"b5ee6f3d": "isVotingPhaseOver()", +"b5eeee6e": "cleanSeedUp(address)", +"b5ef06d0": "changeDeveloperETHDestinationAddress(address)", +"b5ef0ab1": "openDispute(bytes32,address)", +"b5ef649d": "GetChipUsedNum(uint32)", +"b5f09a39": "lockupDate()", +"b5f0f41b": "allowedTransferTo(address)", +"b5f12736": "CustomToken(uint256,string,string,uint256)", +"b5f16939": "saleRevenue()", +"b5f16e48": "setShareholder(address,bool)", +"b5f187b9": "changeFundWallet1(address)", +"b5f2054b": "getWinningsBalance(address)", +"b5f228d7": "LiquidityNetworkToken()", +"b5f26055": "restrictedStockSendTimeOf(address)", +"b5f3484d": "PaymentStatusTimeStamp(address)", +"b5f3e71a": "addAddressToAdminlist(address)", +"b5f45edf": "marketPoohs()", +"b5f50ef3": "claim_prize()", +"b5f529cf": "orderNotAccepted()", +"b5f5962a": "CALL_GAS_CEILING(uint256)", +"b5f59a92": "LUV_Crowdsale()", +"b5f5d582": "TPortToken()", +"b5f6b1f6": "setBonusThreshold(uint256)", +"b5f72d88": "beginProjectRound(string,uint256,uint256)", +"b5f78d11": "purchase(bytes8)", +"b5f7f636": "totalTokenSold()", +"b5f918ff": "roundOneAmount()", +"b5f9371a": "writerAccountSupply()", +"b5f9b1c2": "Bonds(uint32)", +"b5f9ca19": "doesPaymentExist(address,address)", +"b5fa2044": "SetPatentProperties(uint256,uint256)", +"b5fa77bd": "SetAddress(string,address)", +"b5fb19ed": "addressEccles()", +"b5fbc49f": "isAreaEnabled(string)", +"b5fcfbcc": "_getProviderAdmin(uint256)", +"b5fd76bb": "AddLocation(string)", +"b5fdeb23": "getMsg()", +"b5fe79db": "getInfoLevels()", +"b5fea522": "putBtcWithStc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"b5fecc30": "stockSupply(uint256)", +"b5ffa082": "StorageUpdated(address)", +"b6010fcd": "getItem(string)", +"b6013cef": "finalize(uint256,uint256)", +"b6015204": "receiver2()", +"b601818b": "newOwner(string)", +"b601e850": "loanMatured(address)", +"b6027026": "AOK()", +"b602a917": "changeTransferStats(bool)", +"b6030d35": "nProposals(uint256)", +"b6033daf": "getMintingPowerByAddress(address)", +"b6034964": "_endContestIfNeeded(address,uint256)", +"b6037759": "setStudentNumber(uint256)", +"b603cd80": "killMe()", +"b604a86e": "ratePublicSaleStage()", +"b604ad72": "create(string,string,uint8,uint256,address)", +"b604ed1b": "withdrawByGid(uint256)", +"b6055167": "receiveExternalProfits()", +"b6057719": "setMinAuditStake(uint256)", +"b6062b5b": "ICO_TOKENS()", +"b6069742": "propertyLatLongOf(uint256)", +"b607068c": "getMyDividendRate()", +"b60710c0": "LogWithdrew(address,uint256)", +"b60761c4": "Internet(string,string)", +"b607ea45": "claimTilesForNewUser(bytes32,bytes,bytes32,bytes32,uint16[],address)", +"b60868be": "getFishAtBase(uint256)", +"b608c938": "releaseNextShares(uint256)", +"b6096ce9": "EloTest()", +"b609d0e6": "lastOracleUpdate()", +"b60a7405": "_addOwner_(address)", +"b60a82e0": "addSponsorship(address,uint256,uint256)", +"b60ad98d": "Board(address,bytes32)", +"b60afaa4": "distributeLCWP(address[],uint256,uint256)", +"b60b3c59": "otcPurchaseAndEscrow(uint256,address)", +"b60b7084": "builtOn()", +"b60b9fcb": "joinGame(uint256,uint256)", +"b60b9ff7": "Shopdex()", +"b60cc68b": "MIN_ICO_SLOGN_COLLECTED()", +"b60cee3c": "countAllSmartSharingContract()", +"b60d4288": "fund()", +"b60e00b9": "disableBets()", +"b60e2333": "joinTeam(uint256,address,uint256,uint256)", +"b60e6bc0": "tokenIdToApprovedRecipient(uint256)", +"b60e72cc": "log(string,uint256)", +"b60eb800": "addressSCEscrow()", +"b60f54f4": "SortingCoins()", +"b60f5b91": "isPreICO()", +"b60ffa9c": "setDistributeAgent(address)", +"b61012a9": "preICOparticipated(address)", +"b610c75e": "incrementTimestamp(uint256)", +"b611d649": "GteChainERC20()", +"b61241ed": "allocateTokens(address,uint256,address)", +"b612ac29": "BONUS_15_DAYS()", +"b61334b1": "setPayoutsWallet(address)", +"b6136dca": "alt()", +"b61386fb": "registerHandle(string)", +"b6139992": "issue(address,address,uint256)", +"b613df16": "_finishBet(bool,address)", +"b614213d": "maxPriceInWeiFromUser()", +"b615243a": "getExtraTokens(address)", +"b6172704": "isConfirmedStakeholder(uint256)", +"b61727ed": "_transferTo(address,address,uint256)", +"b6176a33": "addStakeholderTransaction(address,bool)", +"b617a4fd": "getClientCategory()", +"b617cf42": "removeExchange(address,uint256)", +"b618214a": "enableService(address)", +"b618387a": "registerBuyer(string,string)", +"b618cbba": "EvLoginfo(string,string)", +"b618d9a4": "checkStatus(address,address,uint256)", +"b6195134": "changeAdminToo(address)", +"b61992e7": "setPricePerBlockInWei(uint256)", +"b61a98cb": "updateMarriageLicenceImageIPFShash(string)", +"b61c0503": "fireEventLog1()", +"b61cb058": "setAvatarFee(uint256)", +"b61cbcd3": "nextGenome()", +"b61d27f6": "execute(address,uint256,bytes)", +"b61d4511": "maxPreIcoTokens()", +"b61daaee": "tokenBase()", +"b61e96a5": "requester()", +"b61f16e3": "getEarningsPool()", +"b61f36f7": "calculateWdxFee(uint256,uint256,uint256)", +"b61fa7c0": "doAirdrop2(address,address[],uint256)", +"b6206e67": "unitBattlePLATCost(uint256)", +"b6213490": "initialDrop()", +"b6215091": "Test2Token()", +"b621bd15": "SALES_END()", +"b622ab4a": "buyWithFunction(bytes4)", +"b6230a74": "icoStatusUpdated(address,string)", +"b623f5e5": "checkSetCosignerAddress(address)", +"b62418a1": "decrementOpenInterest(uint256)", +"b624fc54": "rafEnd()", +"b6253539": "needsInitialization()", +"b62596a2": "fundStorageVaultAddr()", +"b625dd87": "getUpdateTAOContentStateSignatureAddress(address,bytes32,address,bytes32,uint8,bytes32,bytes32)", +"b6261d0a": "acceptOffer(address)", +"b6266248": "refunded(uint32)", +"b626913f": "buy_block()", +"b627cf3b": "welcome()", +"b627ff04": "Sheep(string,string)", +"b6282d0d": "angelOnBattleboards(uint64)", +"b628672b": "setPreSaleHalt(bool)", +"b6288553": "decim()", +"b6294bde": "AdminGetFee()", +"b629d741": "transferUnownedPlanet(address,uint256)", +"b62c0b41": "MintByBTC(uint8,address,uint256)", +"b62c208f": "CryptoQuantumTradingFund()", +"b62c3a4f": "FinastraToken()", +"b62d4301": "testingSelfDestruct()", +"b62d4ce1": "canLayEgg(uint64,uint32,uint32)", +"b62eac16": "CrowdsaleProxy(address)", +"b62f0a6b": "YouTubemasterReq()", +"b62fc7c0": "buy2(address[],address[],uint256[],bytes,bytes)", +"b63005ec": "withdrawJuror()", +"b630230a": "MIN_CROWSALE_TIME()", +"b6304c2a": "KOINCONEKT()", +"b6307f0e": "nLuckyVoters()", +"b630aa48": "tokensSentPresale()", +"b630d706": "thisisfine(uint256)", +"b631c8e8": "_generateCastleSale(uint256,uint256,uint256,uint256)", +"b632d2e0": "SingularityTest20()", +"b633620c": "getTimestamp(uint256)", +"b6339418": "storeNumber(uint256)", +"b633b2ab": "getNextRoundTimestamp()", +"b633d272": "emitWorkResumed(uint256,uint256)", +"b633e4cd": "claimBalance(address)", +"b63423a3": "testCheckoutCart()", +"b63426b3": "Oxygen()", +"b634fc77": "FathomToken(address,address,uint256,address)", +"b6356251": "callThisContractBalance()", +"b63569c3": "developer_address_for_C(address)", +"b635a52d": "disconnectOrderPrice(address,address,uint256)", +"b635ba5f": "getEthValueAmount()", +"b6363cf2": "isOperator(address,address)", +"b63688d3": "setValidationOpen(uint256)", +"b637b269": "maximumValueDuringGuaranteedPeriod()", +"b637b7c4": "BZToken(uint256,string,string)", +"b638f72a": "_preICOSale(address,uint256)", +"b6397a42": "lotteryGiveHunt()", +"b639c9ec": "burnWarrior(uint256,address)", +"b63a35bf": "CTX_Cap()", +"b63a61d3": "auther_user()", +"b63adb3a": "preico(uint256,address,uint256,uint256)", +"b63bb5c6": "SNToken(uint256,string,string)", +"b63c2ac4": "setPowerContract(address)", +"b63c57f1": "buyForBitcoin(address,uint256)", +"b63ca981": "setHKGPrice(uint256)", +"b63cf3ca": "BitcoinDiamond()", +"b63deb24": "setSendProfitsReward(uint256)", +"b63df2a0": "approveControllerContractMigration()", +"b63e0cd8": "start(uint32)", +"b63e93dc": "ownerClawback()", +"b63ed405": "getWeiBalance()", +"b63f0d20": "newcheckToken()", +"b642c768": "_distributeTeamToken(uint256)", +"b642d58f": "INIT_DATE()", +"b6435f00": "getUsersAwaitingForTokensTop150(bool)", +"b6438092": "ManifestoCount()", +"b643f2c9": "stopDefrost()", +"b644ee41": "PRESALE_END_DATE()", +"b6469620": "getPersiansBattlePoints()", +"b64698cb": "_resolveAquarium(uint256)", +"b646c194": "addApprover(address)", +"b647990a": "countVotes()", +"b6481a92": "GotingToken()", +"b6496c6a": "addressLUTSize()", +"b64a097e": "info(bytes32)", +"b64afbe5": "participate(address,uint256)", +"b64b09d5": "invokeFallback(address)", +"b64bbd9e": "Finalizable()", +"b64c154a": "Klassicoin()", +"b64c1e7e": "claimForDeposit(address,address)", +"b64c4905": "sellVolumesCurrent(address,address)", +"b64c9326": "projectoperation_beneficiary()", +"b64d44f1": "TeamLockingPeriod12Months()", +"b64dc853": "onCompensated(address,uint256)", +"b64e2fc4": "getIncludes(uint256)", +"b64e8ad8": "addAllocationPartTwo(uint256)", +"b64eecb1": "transactionRequestCore()", +"b64f3cac": "getDSPRegistry()", +"b64ff429": "consent(bytes32[])", +"b64ff868": "getAdvertisers(bytes32,uint256)", +"b650048b": "unpausePlayerContracts(uint256,uint256)", +"b6506f25": "setLLV_edit_20(string)", +"b6508067": "lastTotalSupply()", +"b6509c12": "Ethereum_twelve_bagger()", +"b650bbef": "safetyInvariantCheck(uint256)", +"b65177ee": "ERC827Receiver()", +"b651cbaf": "add_level(address,bytes)", +"b652c822": "transferPosition(bytes32,address)", +"b652dc2f": "SOFT_CAP()", +"b65412b5": "refundPayment()", +"b65418f5": "raisedIcoValue()", +"b6549f75": "revoke()", +"b654bdb0": "HIBA()", +"b655078a": "getPlayerWager(uint256)", +"b655d0c4": "getBaseRate()", +"b655e138": "sliceAddress(bytes,uint256)", +"b655f822": "Ballot()", +"b655fda2": "updateUserFullName(address,bytes32)", +"b656850a": "_getStakingEpoch()", +"b656e9f4": "isInTestMode()", +"b6576bdf": "getValue(bytes)", +"b657ae63": "eSendTokens(address,uint256)", +"b657c996": "control(address)", +"b6581516": "crossForkDistribution()", +"b6588ffd": "del()", +"b65a1350": "rateLastWeek()", +"b65a34f5": "CeffylToken()", +"b65ae769": "WithdrawSpecialToken(address,uint256)", +"b65b3f80": "exchangeAndSpend(address,uint256,address)", +"b65b4c9a": "sponsoredBonusMax()", +"b65b99a3": "_verifyDate(string,uint256)", +"b65bce8b": "ContractDisabledEvent(uint256)", +"b65be60d": "_updateLots(uint256)", +"b65c2611": "setUnfreezeTimestamp(uint256)", +"b65c2b40": "incrementLastTokenId()", +"b65c3a7f": "calcAmountAt(uint256,uint256,uint256)", +"b65cb801": "SnailToken(uint256,string,uint8,string)", +"b65d0807": "Carpio()", +"b65dc843": "crowdsaleMintingCap()", +"b65ddf2b": "addTipForDeveloper(uint256)", +"b65e1ab8": "setGoldmintFeeAccount(string)", +"b65f3bb5": "executeOffset(address,uint256,address,uint256)", +"b65f90e3": "split(uint8,bytes6,uint8)", +"b65ff419": "deleteNick()", +"b6607cc5": "AML_THRESHOLD()", +"b6608467": "updateShares(uint256)", +"b660d77c": "switchMPO(address,address)", +"b6615acc": "_isAllowed(address,uint256)", +"b661f55d": "saleTokensHaveBeenMinted()", +"b6622c0f": "updateDonor(address)", +"b6629d98": "placeBetEth(bytes)", +"b6629e20": "purchaseWithEth(uint256)", +"b662a73c": "freezeUpgrade()", +"b662dc9b": "OWNER_SUPPLY()", +"b662ef9c": "InsuranceMasterContract()", +"b6635be6": "setupComplete()", +"b663dc0a": "ONE_QUINTILLION()", +"b6644080": "ADMIN_GET_USD(uint256)", +"b66578dc": "nextSeedHashB()", +"b6660af4": "schelling(address,address,bool)", +"b667486d": "BetClosedNoWinningTeam(address,uint256)", +"b6674935": "minPot()", +"b66846fc": "offerToSell(uint256,uint256)", +"b668efe7": "PI_EDIT_2()", +"b6693f80": "phase_2_remaining_tokens()", +"b66a0e5d": "startSale()", +"b66a261c": "setSpread(uint256)", +"b66a323c": "claimThrone(string)", +"b66a94ef": "erc20ECHT(uint8)", +"b66aae65": "removeHoldByAddress(address)", +"b66afea3": "getOrCreateFeeWindowByTimestamp(uint256)", +"b66ce7cc": "Ignite()", +"b66d887a": "setSTGContractAddress(address)", +"b66dbdc5": "totalSupplyHistoryLength()", +"b66dd4b2": "lockFromSelf(uint256,string)", +"b66deb80": "removeEntry(address)", +"b66e68f2": "testFirst(bytes)", +"b66e7524": "getReportingStartTime()", +"b66f39ad": "withdrawAvailableReward(bytes32)", +"b66f7a8b": "isEnded(uint256)", +"b6700930": "removeSet(bytes32)", +"b670a4b1": "unsoldTokens()", +"b670a910": "frontWindow()", +"b6712a4f": "gatFoundDeposit()", +"b6721bc4": "setMinPaymentForAnswer(uint256)", +"b6725bcf": "bitswift()", +"b672b4d4": "testTransferToken()", +"b672cf50": "balanceOf(uint128)", +"b6738bfb": "presalePiStart()", +"b673a75c": "crowdsaleAddr()", +"b673ddb7": "hasAirDropHero(uint16,address)", +"b674e749": "mock_contains(address,address)", +"b675271e": "contributeForDcorpMember(address)", +"b6755038": "_setPotValue(uint256,uint256)", +"b6757b50": "RocketPoolToken()", +"b67590aa": "batchTrade(address[11][],uint256[11][],uint8[2][],bytes32[2][],bytes32[2][])", +"b6761717": "pullEtherFromContract()", +"b67719fc": "WithdrawFunds(address,uint256,address)", +"b6791322": "createERC20(uint256,string,uint8,string)", +"b6791ad4": "getChain(uint256)", +"b67a77dd": "ART1(address)", +"b67aa257": "purchasePop(uint256)", +"b67b1a4d": "withdrawEtherOnlyOwner()", +"b67b60c7": "nextPrime(uint256)", +"b67b7163": "approve(string)", +"b67ba1b5": "killWallet()", +"b67c2893": "VitalLogging()", +"b67c838f": "Total_Paid_Out()", +"b67cb359": "feed1(uint256)", +"b67d4111": "getItemUri(uint256)", +"b67d50b5": "referrerBalanceOf(bytes32)", +"b67d77c5": "sub(uint256,uint256)", +"b67d8c69": "order_counter()", +"b67ddf20": "BlockICOdatetime()", +"b67e2064": "injectEtherFromIco()", +"b67e5b3b": "validPurchaseBonus(uint256)", +"b67f4eff": "sendTo(address,uint256,uint256)", +"b67f8b6d": "Master()", +"b67fabdf": "scheduleTransaction(address,uint256,uint256,bytes)", +"b68035a7": "COMMISSION_DIVIDER()", +"b6813b1c": "setcoe(uint256,uint256)", +"b6816590": "previousFounders(uint256)", +"b681f9f6": "resumeContribution()", +"b6823a66": "tournamentRewards()", +"b682c019": "pieceWanted()", +"b682da3e": "feesData()", +"b682ea1b": "_figthEnemy(address)", +"b6834572": "EOS()", +"b684101d": "emitExecuted(address,uint256,uint256,uint256)", +"b684ccad": "getDisputesToSolve()", +"b6854f96": "freezeToken(uint256)", +"b685afd0": "getBlockVerifierAddress(uint256,uint256)", +"b6868a69": "theFunction()", +"b686a635": "PossContract()", +"b686c983": "cancelLoanRequestAtIndexByBorrower(uint256)", +"b686d8b4": "holdingTaxInterval()", +"b686e44c": "SHA256ofArtwork()", +"b688524f": "_isCeo(address)", +"b688578c": "STAGE_3_START()", +"b6889e48": "globalChanceNo()", +"b688a363": "join()", +"b6893f7d": "DataContacts(address,address,address,address,address)", +"b6898845": "RPESALE_TOKEN_SUPPLY_LIMIT()", +"b6898d6c": "addVowInfo(bytes32,string,string,string)", +"b689ca61": "sellsIntermediateGoodWithDepletion(address,uint256,string,uint256)", +"b689d5ac": "has()", +"b689d850": "FederatedOracleBytes8(uint8,uint8)", +"b68a06ba": "transfer_with_extra_gas(address,uint256)", +"b68c6ae3": "mtcLastDay()", +"b68cc035": "bonusLimit(uint256)", +"b68cf49f": "roundResolved()", +"b68d1809": "getDomain()", +"b68d1d4d": "addressInArray(address)", +"b68e15d6": "freezedAccounts(address)", +"b68e21ac": "FinishLottery()", +"b68e7f6e": "testCastVote()", +"b68e8552": "setRegionOwner(uint16,address,uint256)", +"b68e8760": "setBn(bytes32,bytes32,string)", +"b68ed11f": "preSaleSoldTokens()", +"b69065d6": "DevelopeoERC20(uint256,string,uint8,string,bool,bool)", +"b69147f2": "monthlyMinting()", +"b6926b52": "RaffleDraw()", +"b692c89d": "getRaised()", +"b6932ce7": "solicitaPagamento()", +"b694dbb5": "fromBytesToBytes32(bytes)", +"b695ecfd": "HonestHeart()", +"b696a6ad": "issue(uint256,address)", +"b6972146": "mul(int128,int128)", +"b6974d87": "cancelVoteForCashBack()", +"b6975ddb": "becomeSnakemaster()", +"b697fc93": "POT_DRAIN_TIME()", +"b6982c7f": "setup_race(uint256,uint256)", +"b6984002": "EQU(uint256,string,string)", +"b6990ee1": "getPollWinner(uint256)", +"b6992247": "getStakeholders()", +"b69924c3": "GetNextWithFunds(uint256,uint256)", +"b6994dc0": "RomanLanskoj()", +"b69a375d": "callback(uint256,string)", +"b69a8107": "setSkcAdderss(address)", +"b69b5611": "setOwnership(uint256,address,address)", +"b69ba46d": "publishMetaData(bytes32,bytes32,bytes1)", +"b69c0896": "BaseScheduler(address,address,uint256)", +"b69c2115": "approveRequest(bytes32,uint256)", +"b69e7d70": "random(uint256,uint256,address,uint256)", +"b69e9b1d": "getStaticElementAt(uint256)", +"b69ea1e9": "WineSpiritCoin()", +"b69ec629": "setBpToken(address)", +"b69ee531": "GBNC(string,string,uint256,uint8)", +"b69ef8a8": "balance()", +"b69f5ada": "totalUserProfit()", +"b69f917d": "addCosToGame(uint256,uint256,string)", +"b69fae22": "hashTransfer(address,address,bytes,uint256)", +"b6a0a119": "countDestinations()", +"b6a12f63": "setTokenMarketMaker(address,address,address,address)", +"b6a1cb2b": "setMinReward(uint256)", +"b6a2b110": "SOCXSentToETH()", +"b6a324e0": "fundMe()", +"b6a46b3b": "create(string)", +"b6a48c2a": "abcLottoController()", +"b6a499ab": "_computePVPWarriorAura(uint256,uint256)", +"b6a4a0e9": "GogaTokens()", +"b6a5091a": "HuanHuiToken()", +"b6a59176": "getUsedCoreSupply()", +"b6a5d7de": "authorize(address)", +"b6a65665": "getGameData(uint256)", +"b6a79409": "necropolisContract()", +"b6a7b42c": "getMyTomatoes()", +"b6a8933b": "EXCHANGE_COMMISSION()", +"b6a96e45": "BuyCarCompleted(address,uint256)", +"b6a9ed31": "sellAnts()", +"b6abd4e7": "transfer_close()", +"b6ac24df": "updatePatchTree(bytes32)", +"b6ac4984": "tokenTransfersEnabled()", +"b6ac642a": "setWithdrawFee(uint256)", +"b6acabc1": "crowdFunding()", +"b6acc48c": "ICO_TOKEN_CAP()", +"b6acd931": "payDAPP(address,uint256,address)", +"b6ad4784": "resignTranscoder(address)", +"b6ad57d6": "paySmartContract(bytes32,address[],uint256[],bytes32)", +"b6ad8934": "renounceFundkeeper()", +"b6add0f4": "initPrice()", +"b6ade100": "notifylvlClients(string,string)", +"b6ae90fb": "FuturOwner()", +"b6aeb4a2": "erc20VARA(uint8)", +"b6aeec7b": "CHATTER()", +"b6af3643": "setWithdrawalTime(uint256)", +"b6afd2ca": "listMembers()", +"b6b0eaca": "SMILEHEART()", +"b6b0f77b": "idToString(bytes32)", +"b6b12e61": "getRoundDetails(uint256)", +"b6b18eff": "founderWithdrawablePhase1()", +"b6b1e359": "verifyIt(bool)", +"b6b2210c": "lockSell(bool)", +"b6b32c07": "presalePurchase(address[],address)", +"b6b35272": "isWhitelisted(address,address)", +"b6b3d325": "view40()", +"b6b425c7": "doSingleMigration(uint256)", +"b6b55f25": "deposit(uint256)", +"b6b57c9e": "setWhiteListContractAddress(address)", +"b6b57ebd": "finalizeWorkOrder(address,string,string,string)", +"b6b7032e": "rentalAccumulatedPrice()", +"b6b7e7eb": "toRLPItem(bytes)", +"b6b7e84d": "SGTExchangerMock(address,address,address)", +"b6b8c3cd": "m_categoriesCreator()", +"b6b9d57e": "propertyIndexToData(uint256)", +"b6ba1a98": "NIMFA_PER_ETH_SALE()", +"b6ba600a": "lockGNO(uint256)", +"b6baffe3": "getDifficulty()", +"b6bb38dc": "approveCetification(address)", +"b6bb3ade": "multiCall(address[],address,uint256[])", +"b6bba846": "sellTokensForDash(string,address,uint256,uint256)", +"b6bbafa2": "CrowdsaleStoneToken()", +"b6bbcf5b": "benchmarkRandom()", +"b6bcf354": "getCensuring(uint16)", +"b6bd387a": "lastRegionId()", +"b6bdedca": "MagnaChain()", +"b6be128a": "getPhoto(uint256)", +"b6beb400": "NuggetsToken()", +"b6bf1b3a": "mintForDisputeCrowdsourcer(uint256)", +"b6bf3bb3": "setBlackListERC20(address)", +"b6bf7318": "clz64(uint64)", +"b6c05255": "burnOwner(address,uint256)", +"b6c054ce": "restake(int256)", +"b6c0eca8": "LogRefund(address,uint256)", +"b6c1cb03": "transferFromWithComment(address,address,uint256,string)", +"b6c1eaad": "refundStarted()", +"b6c238b5": "starts(address)", +"b6c279ee": "setInputSize(uint256,uint256)", +"b6c32d71": "startStandardSale()", +"b6c37e58": "balancesRiskcoins(address)", +"b6c3987d": "validateHarCap(uint256)", +"b6c3e8cc": "increaseApprovalInternal(address,uint256)", +"b6c44bd1": "ZCash()", +"b6c47da1": "setSuperman(address)", +"b6c4da52": "addVestingRule(address,address,uint256,uint256)", +"b6c58236": "getOwner(uint32,int256)", +"b6c6ecd3": "getDial3Type(uint8)", +"b6c78f26": "HellaBank()", +"b6c88977": "finalizeCrowdfund()", +"b6c9f707": "ContractCreation(address,address)", +"b6ca878c": "addCard(bytes32,address,uint256,uint256,uint256,uint256)", +"b6ca8996": "CentrallyIssuedToken(address,string,string,uint256,uint256,uint256)", +"b6cb3777": "collectAnts(address)", +"b6cb405b": "getContractor()", +"b6cb5d72": "NFToken()", +"b6cb7f41": "fundsVault()", +"b6cba7eb": "recoverERC20Tokens(address,uint256)", +"b6ccc6ba": "signVer(address,bytes32,uint256,uint8,bytes32,bytes32)", +"b6cce5e2": "sponsor(uint256)", +"b6cd05e5": "withdrawAllTokensOnContract(uint256)", +"b6cd0b88": "setPersonalHash(bytes)", +"b6cdc815": "maixiaohetoken(uint256,string,uint8,string)", +"b6ce5581": "oraclize_query(string,string[5],uint256)", +"b6ceb489": "OWN_burn(uint256)", +"b6cf146c": "proposeMint(uint256)", +"b6cf3579": "PROVISIONING_supply()", +"b6d1d3d1": "setAirSender(address)", +"b6d1fbf9": "setXPERContractAddress(address)", +"b6d2a9b9": "SetupToken(string,string,uint256)", +"b6d31d97": "addToPrivateSaleWhitelist(address[])", +"b6d33511": "AKTestEther(address,address,address,uint256,uint256,uint256)", +"b6d34f12": "Emission(uint256,uint256,uint256)", +"b6d3faa3": "billingAmount()", +"b6d42ec3": "setApTime(uint256)", +"b6d5e8cd": "mintUniqueTokenTo(address,uint256)", +"b6d6164a": "reject(address,uint256,bytes,uint256)", +"b6d67a0b": "hasPlayerWon(uint8,uint256,bytes32,bytes32)", +"b6d6806c": "createEscrow(address,uint256,address)", +"b6d703ae": "confirmTotalTokenThreshold()", +"b6d7855a": "TokenName()", +"b6d7dbb2": "SAtomX()", +"b6d827bb": "WhitelisterChange(address,bool)", +"b6d8f59d": "WAN_TOTAL_SUPPLY()", +"b6d9721c": "getMerkleRootAndUnlockedAmount(bytes)", +"b6d9ef60": "setOracleFee(uint256)", +"b6dadbdf": "_createPart(uint8[4],address)", +"b6dadeb4": "getCardInsurance(uint256)", +"b6daea6c": "addAgency(address)", +"b6db75a0": "isAdmin()", +"b6dc1124": "private_setPauseState(bool)", +"b6dc572f": "addSubscription(address,bytes32,uint256)", +"b6dc8e25": "exchangedAmountToReceive(uint256)", +"b6ddcd14": "icoAccount()", +"b6ded5c1": "windowPeriodEnd()", +"b6df4906": "safeOwnerOf(uint256)", +"b6e087d6": "GunChain()", +"b6e119ab": "balanceOfEnvelopes()", +"b6e390ae": "First_pay_bountymanager()", +"b6e3943a": "AK4EtherDelta(address,address,address,uint256,uint256,uint256)", +"b6e3ca3c": "UpdatedExchangeRate(uint256)", +"b6e3cc1a": "authorCount()", +"b6e456bb": "getUInt()", +"b6e49fd9": "LocalEthereumEscrows()", +"b6e54bdf": "majority()", +"b6e76873": "getAction(uint256)", +"b6e7d90b": "delegatePass(bytes32,address)", +"b6e86e13": "createProxyImpl(address,bytes)", +"b6e8bac7": "anailNathrachOrthaBhaisIsBeathaDoChealDeanaimh(address[],uint256[])", +"b6e99235": "drawNumbers(uint256)", +"b6e9c2ac": "getUserBalance(bytes32)", +"b6ea62de": "kycApprove(address)", +"b6eb15c7": "gvOptionToken10()", +"b6eb7dae": "freedWosPoolToWosSystem()", +"b6ecd81c": "Vets()", +"b6ed0632": "cancelOrder(uint256,uint256)", +"b6ed3308": "setPriceOfEther(uint256,string)", +"b6ed9f15": "PFOffer(address,address,bytes,uint256,uint256,uint128)", +"b6eda884": "ads()", +"b6edc68f": "changeMicroPay(address)", +"b6edd743": "transferTokensTo(address)", +"b6ee48aa": "setContractSK(string,string)", +"b6ee8120": "realizedETH(address)", +"b6eeb6bb": "PREPURCHASER()", +"b6ef4454": "funderWithdraw()", +"b6ef78c2": "cancelCounterStack(bytes32,bytes32)", +"b6f020b2": "checkExistsItems(string)", +"b6f0391b": "setMap(string,string)", +"b6f085c7": "usernames(bytes20)", +"b6f0ecb1": "setAMLWhitelisted(address,bool)", +"b6f1a927": "CPAWallet()", +"b6f250ea": "determineWeights()", +"b6f29d50": "awardSellers()", +"b6f35624": "boughtAmountOf(address)", +"b6f36dcf": "owner3()", +"b6f3c071": "CyCo()", +"b6f3d256": "lowestBid()", +"b6f46b61": "claimBeercoins()", +"b6f46d4c": "RFQ(string,uint256,string)", +"b6f478de": "lifeVestingStage()", +"b6f4df34": "totalSupplyEdition(uint256)", +"b6f4f96c": "fundingThreshold()", +"b6f50c29": "setICO(address)", +"b6f529d6": "paused_2()", +"b6f5dda5": "getAllInvestmentsCollected()", +"b6f5e0e6": "showProfileDetails()", +"b6f681ce": "ChangeOwner(address,address,uint256)", +"b6f687a2": "rewardKoth()", +"b6f6e8ae": "getMatches(uint256,bytes3)", +"b6f73bb9": "devuelveRoles(bytes32)", +"b6f7600d": "GetAllConsentData()", +"b6f7bfcd": "ADVISORS_ADDR()", +"b6f84764": "getRemainingUint(uint8,bytes)", +"b6f921ad": "check(string)", +"b6f98e53": "needsAllowancePayment()", +"b6f9fda5": "timeoutResolve(bytes32,uint256)", +"b6fac235": "callStcWithBtc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"b6fae6c7": "approveContract(bytes32)", +"b6fb4a14": "createNewSystem(string,uint8,uint8)", +"b6fb7e46": "endingBalance()", +"b6fb9f25": "redeemWithdrawalCertificate(string,uint256,address,bytes)", +"b6fc1043": "make(bool,uint8,uint256,uint256,bytes16,uint256,uint256)", +"b6fc14a6": "createNewZMultiSigWallet(address[],uint8)", +"b6fc276a": "preparationPeriodEquipmentTrainingFeeMultiplier()", +"b6fca0df": "sendAirDrops(address)", +"b6fda7ba": "allocateTokenForAdvisor()", +"b6fe87fb": "remoteBettingClose()", +"b6fef44c": "increaseArrivalTime(uint256,uint256)", +"b6ff5087": "notifyDeathCancellation()", +"b7009613": "canCall(address,address,bytes4)", +"b700967b": "modexp(uint256[],uint256,uint256[])", +"b7009c97": "StatPreICO()", +"b700f67a": "settleApproveRequest(bytes,bytes,bool,uint256)", +"b7019063": "EthereumDIDRegistry()", +"b7019744": "payBack(address,uint256)", +"b701dc14": "setBackEndAddress(address)", +"b7020c63": "getSpermlordReq()", +"b7028b1c": "CryptoRideCoin(uint256,string,uint8,string)", +"b702a879": "draw(uint256,address)", +"b703aa3a": "stopForge()", +"b703c75a": "getPresaleNumber()", +"b704b608": "weiToTokens(uint256,uint256)", +"b7056765": "implementsERC165InterfaceNoCache(address,bytes4)", +"b706b764": "HelpCoin()", +"b706f78e": "_mintTokens(int256,address,uint256)", +"b7073d2e": "insertCLNtoMarketMaker(address)", +"b7086f7b": "stopSale(address,uint256)", +"b708aabe": "getrunprize()", +"b70902bc": "debug4()", +"b7090bb5": "www_experty_io()", +"b70949c9": "editContributors(address[],uint256[],bool[],uint256[],uint256[])", +"b7098a32": "Bee()", +"b709df11": "getValue(address,address,address)", +"b70a7545": "GIFT(uint256,string,uint8,string)", +"b70ae49a": "execute_payment(uint256,bytes32)", +"b70b9717": "voitingStartTime()", +"b70c9acf": "stream(bytes32)", +"b70d0b3b": "ownerEdge()", +"b70d30bf": "returnTokens2(address,uint256)", +"b70da7dc": "isKnownCrowdsourcer(address)", +"b70dfb25": "SeleniumRichChain(uint256,string,uint8,string)", +"b70f0058": "_isApprovedBattle()", +"b70f4b13": "crowdfundContract()", +"b70f6ea8": "getDataPoint(uint256,uint256)", +"b70fadb7": "getAddressFromSan(string)", +"b70fbda1": "GoldRegistry()", +"b71051e2": "percentageOf(uint256,uint256)", +"b7107d00": "setSeller(address,address)", +"b710e8fe": "_restartsystem()", +"b711e18a": "_applyRefCredits(address,uint256)", +"b7133fa9": "test(uint256[5])", +"b7134feb": "icoMaxCap()", +"b713ef49": "developer_increase_price(uint256)", +"b714075e": "transferDevBalance(address,uint256)", +"b714e3cc": "GetDynamicRatio(uint256)", +"b71503fc": "FundsDrained(uint256)", +"b7159185": "shortShare()", +"b7160dee": "CVR()", +"b7161cc1": "VitaminTokenNew(uint256,string,string)", +"b71653a8": "setGalleryThreePrice(uint256)", +"b7167359": "contributed1(address)", +"b71698c7": "solutions(uint256)", +"b716e3f2": "addBoard(address,address)", +"b716f404": "raceOut(uint256)", +"b71738f1": "withdrawDthTeller(address)", +"b717cfe6": "CallTest()", +"b717dadf": "getEtherCountFor(address)", +"b7182b95": "getTokenOwner()", +"b719397f": "IsPreICO()", +"b719d032": "predecessor()", +"b719d1d0": "getRegInfo(address)", +"b71a6dd6": "deposit_asset(uint32,uint256)", +"b71ab971": "getPlayerEarning(uint256)", +"b71c47a2": "surrender()", +"b71ce659": "GCA()", +"b71d1a0c": "_setPendingAdmin(address)", +"b71e0120": "limitBranchType()", +"b71e513b": "createGame(string,string,uint16,uint64)", +"b71e9c23": "throws()", +"b71f3cde": "onRefund(uint256,address,uint256)", +"b71f7f1c": "SuperFruit(uint256,string,string)", +"b71f8010": "setContract3(address)", +"b720a274": "_endOfICO()", +"b7213bd4": "readLog(uint256)", +"b72179ff": "viewFirstLotOfContractState()", +"b72218e3": "initialHolder()", +"b722875f": "giveBonus(address,uint256)", +"b722a9ef": "getPreviousShareholder(address)", +"b72314a1": "getGroupDescription(uint256)", +"b7232cd9": "enterBidForStar(uint256)", +"b723b34e": "mintTo(uint256,address)", +"b72413e4": "tokenDiscountPercentage(address)", +"b72481f8": "totalWinnings()", +"b725d84f": "PRICE_10()", +"b725e556": "UserOffers(address)", +"b7266456": "StandardToken()", +"b7268ef4": "rdiv(uint128,uint128)", +"b72703ac": "getPrev(address)", +"b72753d5": "updateItem(uint256,string,uint256,bool)", +"b7279ca6": "enableSweep(uint8[],bytes32[],bytes32[],address)", +"b727b194": "initialIssueMinting()", +"b7288f02": "freezeAccount(bool)", +"b72916ef": "getMsgValueBefore()", +"b7297cf3": "gameSettings()", +"b729d499": "dustPepe(uint256,address)", +"b72a0026": "APPToken()", +"b72a97e6": "updateTeamV(address)", +"b72b5a33": "NewBoardMember(address)", +"b72bedd0": "validation(uint256)", +"b72cacde": "approveByA(uint256,string)", +"b72ceab8": "alwaysRequireCosignature()", +"b72d0be5": "revocables(address)", +"b72e717d": "fromAddress(address)", +"b72f0e06": "LicenseCoin()", +"b72f547d": "startTransferGet()", +"b72f8ebb": "changeFreeBetValue(uint256)", +"b730aaaa": "Counting_CardPoint(uint256)", +"b730ee7f": "Anemoi()", +"b73112e5": "setCountryRank(uint256,string,uint256)", +"b73114b9": "purchaseCenturion(uint256)", +"b7312707": "fromHexChar(uint256)", +"b7317598": "claimI()", +"b7317806": "setEndOfICO(uint256)", +"b731e848": "left93(uint256)", +"b7324f8e": "PresaleClaimed(uint256)", +"b733e6a6": "LaunchContract(address,bool)", +"b73405a9": "roundMoneyDownNicely(uint256)", +"b734cbba": "setIcoDates(uint256,uint256,uint256,uint256,uint256)", +"b7352bee": "usdSeasonAccountPurchased(uint16,address)", +"b736ca82": "initialize(address,address,address,address,address,address,address,uint256,uint256,uint256,uint256)", +"b7375af7": "PresaleUnlimitedStarted(uint256)", +"b737ed1b": "getRandom(bytes32)", +"b737f5bd": "addOldInvestment(address,uint256,uint256)", +"b738169c": "betOnOddEven(bool,bool)", +"b7381a2c": "noteTokens(address,uint256)", +"b7384f6b": "initialOraclizeSettings()", +"b7387e66": "OpenBox(uint256)", +"b7388178": "getIsStoreSet(string)", +"b73974a1": "HIGH()", +"b73a9dbc": "variationCycle()", +"b73afe4f": "relocate()", +"b73b68e5": "lockTokens(address,uint256,bool)", +"b73c6ce9": "withdrawEarnings()", +"b73c71b2": "Test1Coin()", +"b73cb519": "changeIcoCap(uint256)", +"b73ded75": "setParams()", +"b73eb3e9": "decorationAt(address,uint256)", +"b73f02e4": "setActiveHashType(bytes32,bool)", +"b73f1e52": "fourthRelease()", +"b73fe29c": "getPeriodicalAR()", +"b73fe963": "noOfWaves()", +"b73fefe8": "rejectProposalAsHost(uint256)", +"b7403878": "updateLeaders_(address,uint256)", +"b741cb36": "setStageStartTime(bytes32,uint256)", +"b742398b": "trade(address,uint256,bytes,address,uint256,bytes)", +"b743f7b6": "giveEthCharityAddress()", +"b744a850": "getAssetTokenByIndex(uint256)", +"b744d2e6": "WithdrawEther(address)", +"b744d893": "DigiBlackCoin()", +"b7462833": "Blarity(address,uint256,uint256,uint256,address[],uint256[])", +"b7465a19": "setSlackUsersCap(uint256)", +"b746ec9f": "checkTotalPayouts()", +"b74746e7": "CharlieToken()", +"b747e025": "testFailMintNoAuth()", +"b7482509": "deposit(address,string)", +"b7491780": "_calculateNewHeroPower(uint256,uint256,uint256,uint256,uint256,bool,uint256)", +"b7491d65": "BiathlonNode(address,string,string,string)", +"b749b225": "bountyDrop(address[],uint256[])", +"b74a3266": "finalizeTemplate()", +"b74bc710": "LuckyDoubler()", +"b74bd09e": "rndGap_()", +"b74bd72b": "canTransfer(uint32,int256,address)", +"b74bee6a": "Mido()", +"b74c13f1": "storeAttachment(string)", +"b74cf3b6": "setVoterCount(uint256)", +"b74d13a5": "disableCheckArea()", +"b74d4103": "getForwardUpdateFeesTo()", +"b74d8e58": "getKittySkillScore(uint256)", +"b74db274": "VeryToken()", +"b74e20bb": "xCrypt(address,address,address,address)", +"b74e452b": "today()", +"b74e47ac": "getPartsOfOwner(address)", +"b74e825e": "DIVIDEND_FUND_FRAC_BOT()", +"b74f010f": "DreamCoin(uint256,string,string)", +"b74f312e": "changeTotalDistributed(uint256)", +"b74f32f2": "airdrop(address[],uint256,uint256,uint256)", +"b74feb18": "getRoundWinnerPot(uint256)", +"b74ffca7": "bookCab(uint256)", +"b75014c0": "startIcoMainSale()", +"b750948d": "canUserReleaseArtwork(address,address)", +"b750ac85": "LOG_HouseAddressChanged(address,address)", +"b751ecfc": "DomainIO(uint256,uint256)", +"b7526b79": "migrateDungeon(uint256,uint256)", +"b753485f": "currentGen()", +"b7538f3e": "ChangeClient(address)", +"b753a98c": "push(address,uint256)", +"b7540d9f": "freezed()", +"b756919d": "_handleEnergyTopup(address,uint256,uint256)", +"b756feff": "triggerDisposition()", +"b7581c67": "vestingFounderAllocation()", +"b7595d3f": "getBoolField1()", +"b7598cca": "AreaPrice(uint256,uint256,uint256)", +"b759f954": "approve(uint256)", +"b75a0ac6": "setICOToken(address)", +"b75baa18": "w_futureDevelopment()", +"b75c2068": "lockShares()", +"b75c4f80": "getInternalDependencies()", +"b75c7d9e": "updateDealer(string,address,uint256)", +"b75c7dc6": "revoke(bytes32)", +"b75c7e62": "MedsupplyToken()", +"b75d7e50": "getExtrasData()", +"b75ece9c": "startFundingTime()", +"b75f4084": "finishInvesting()", +"b75f9b20": "commissionPCT()", +"b75fdf3a": "liquidityPoolTokens()", +"b760744f": "MytilcoinStorage()", +"b760c979": "TokenGranted(address,uint256)", +"b760e822": "minimumPurchaseInWei()", +"b760faf9": "depositTo(address)", +"b7614de7": "stakedByUser(address)", +"b7618a31": "rvt()", +"b761962c": "sampleMulti(bool,bytes32,int8,bytes4)", +"b761a16b": "JustmakeNewAccountsIssuer()", +"b7629dcb": "investorsAddress()", +"b762e6e8": "mintTimeLocked(address,uint256,uint256)", +"b762fbac": "changeFountainContractAddress(address)", +"b763150d": "registerCustomer(address,address)", +"b763aeed": "sheetcoinToken()", +"b764132e": "CubaLibre()", +"b764311d": "RITToken()", +"b7643c5c": "_computePVPPetAura(uint256)", +"b7645ed4": "changeMaxCapUSD(uint256)", +"b76467c1": "Haltable()", +"b764e273": "failSend()", +"b764e8f5": "read_config()", +"b76564bd": "app()", +"b7656808": "minted(address,uint256)", +"b7656dc5": "transferFromPreSignedHashing(address,address,address,uint256,uint256,uint256)", +"b7663b08": "startICO_w2()", +"b7665613": "isPlaying(address)", +"b7667603": "Goldplatina()", +"b76689a4": "createInviteID(address)", +"b766b562": "setBonusReceived(address,bool)", +"b76803b2": "cgoAddress()", +"b7682a81": "buyGanToken(uint256)", +"b768628f": "publishedWinningScoreThreshold()", +"b7688c8b": "ico_period()", +"b768cd5d": "modifyStartTime(uint256)", +"b768ce60": "getTotalVolumeToken()", +"b7692032": "Facebook()", +"b769e4c5": "LogCancelTemplateProposal(address,address,uint256)", +"b76b37dd": "toLotteryPool(uint256)", +"b76b3e39": "setICObyAddress(address,uint256)", +"b76b4ee2": "ManagerPermissionGrantedEvent(address,string)", +"b76b78fb": "getAllElement()", +"b76bf76b": "distributeTime()", +"b76c2e39": "LQX()", +"b76c3764": "NumberGame()", +"b76c5c9f": "sendAdvisorsBalance(address[],uint256[])", +"b76c8a2c": "SpartaTeamCoin()", +"b76c94e1": "fundsOf(uint256)", +"b76ce26c": "updatesolbuyrate()", +"b76d0edd": "Log1(address,bytes32,uint256,string,string,uint256,bytes1,uint256)", +"b76dfb28": "totalRemainInInventory()", +"b76e1324": "startCreatingAss(string,string,uint256,uint256,uint256)", +"b76e4890": "Tester()", +"b76e5e06": "getBA(bytes32)", +"b7700f33": "getManagerPubkey()", +"b77030a0": "setTau(address)", +"b770391b": "MineAffected(uint256,uint256)", +"b770485f": "specialContract()", +"b770486f": "investmentGuidesRewardsWithdrawn()", +"b770c7ef": "giftPlanet(uint256,uint256,address)", +"b7719ef5": "devWithdrawal(uint256,uint256)", +"b7742856": "mainSaleprice()", +"b774d3d7": "BankOwner_GetDonationsBalance()", +"b775553d": "setDividendCutPercentage(uint256)", +"b775c9ef": "etxAddress()", +"b7760c8f": "transfer(uint256,address)", +"b7764475": "ETHXBT()", +"b776fc15": "addItem(uint256,string,uint256)", +"b777b11e": "setBurnStart(bool)", +"b777cad7": "managerPrimary()", +"b7782455": "unicornAddress()", +"b77825d2": "getIndexOrder2(uint256)", +"b778809b": "initiateContract()", +"b778d4b4": "releaseToday()", +"b778e69e": "getPastWinnerEntries()", +"b7796a43": "getAllInvestmentsWithdrawnBack()", +"b77a284c": "transferAndCallWhitelist(address)", +"b77bf600": "transactionCount()", +"b77cd1c7": "refreshBalance(address)", +"b77d09c9": "gameGifIsOver()", +"b77d1597": "QAcoin()", +"b77d4876": "startTokensSale(address,uint256)", +"b77da4a0": "totalDevCoin()", +"b77e4185": "promotionsAvailable()", +"b77e60dd": "tokensaleSecondsToStart()", +"b77ebcbb": "Country_code(uint16)", +"b77f00b3": "preIcoPhaseCountdown()", +"b77f39fe": "recoverTokens()", +"b77fc549": "withdrawAffiliateCommission()", +"b77ffaf5": "changeInvestNum(uint256)", +"b7808600": "ClaimCrowdsale(uint256)", +"b780a659": "cryptoString()", +"b780ef58": "_transferRobot(address,address,uint256)", +"b7813355": "getTotalCollectedWei()", +"b781ad99": "ALLOC_SALE_CORNERSTONE()", +"b781afa7": "EverhuskCrowdsale(uint256,uint256,uint256,address)", +"b7825cfc": "addTask(bytes32,string)", +"b782fc9b": "getFirstActiveDuel2()", +"b7833cc3": "getWitness(uint256)", +"b783508c": "receiveAuction(address,uint256,uint256,uint256)", +"b78376e9": "addPayer(address)", +"b783969f": "GenkiProjectToken()", +"b783d6c7": "challengeRegistration(bytes32)", +"b7840731": "RedeemOraclize(uint256)", +"b7844170": "getSellUnitsInformations()", +"b7844aff": "NeuroToken()", +"b7845c97": "isPhase(uint256,uint256)", +"b785473c": "satRaised()", +"b786ed91": "isCommit(bytes32)", +"b7870845": "getCalculatedFees()", +"b787b91d": "registerVestingSchedule(address,address,address,uint256,uint256,uint256,uint256)", +"b7886b37": "checkReceivedUser(address)", +"b789321a": "priceRound4()", +"b7897485": "getCurrentBet()", +"b78a80ff": "delayedSetStakes(uint256)", +"b78aa7f4": "challengeChannel(bytes,bytes,bytes)", +"b78ae50a": "getCrystalsByKind(address,uint256)", +"b78b52df": "allocate(address,uint256)", +"b78b6087": "finalizeMigration()", +"b78b7232": "addFeedIn(address,address,int256,uint256,uint256)", +"b78b842d": "kyberNetwork()", +"b78bd4a5": "breakCookie(string)", +"b78be802": "emergency_withdraw(uint256,address)", +"b78be927": "ZYCoin(uint256,string,string)", +"b78c1517": "reservationFund()", +"b78c1853": "deleteOwnPeerReview()", +"b78d27dc": "bond(uint256,address)", +"b78d32cd": "BET()", +"b78da386": "withDrawFunds()", +"b78e4bfd": "jinglesInfo(uint256)", +"b78e5e26": "transferTokensFromBountyAddress(address,uint256)", +"b78f8389": "divideUpReward(uint256)", +"b78f9de7": "Sale()", +"b78fd7bc": "transferRemainingTokensToUserAdoptionPool(uint256)", +"b790301a": "PLN_Omnidollar()", +"b79047cc": "PricePredictionBettingGame(address)", +"b790505d": "set_compenstation(uint256)", +"b790634e": "getDepositRate()", +"b7909898": "allocateInitialBalances(address[],bytes32[],uint256[])", +"b790a77b": "_withdraw(address,uint256)", +"b790c32c": "transferAuditorRecord(address,address)", +"b7915e39": "getAllowedNotaries()", +"b791e8ed": "calcEffectiveOptionsForEmployee(address,uint32)", +"b791f3bc": "migrateAmountBooks(address)", +"b7928b4f": "getReason(uint256)", +"b792d022": "batchCreateSingleSeedAuction(uint8[],uint8[],uint256[],uint256[],uint256[],uint256)", +"b792e6ec": "init(uint256,address)", +"b792f5f6": "ret_luklen()", +"b7930507": "UNLOCKED_TIME()", +"b793233b": "icoEndTimestamp()", +"b7935f0a": "emergencySetDAdmin(bytes32,address)", +"b794004d": "YOU_BET_MINE_DOCUMENT_PATH()", +"b7942d78": "RegReader(address)", +"b79550be": "recoverFunds()", +"b795aab3": "getRemainingCountImpl(uint32)", +"b795dffe": "purchaseKey(bytes32)", +"b796a339": "addRegistryIntoOwnerIndex(address,address)", +"b796c9b8": "Withdrawall(uint256,address[])", +"b7970d80": "rngCallbackGas()", +"b7975d1f": "getMyToad()", +"b797b5ba": "tgeCurrentPartInvestor()", +"b798b129": "finalizeEarlyBirds()", +"b7992c0b": "finalize3()", +"b799ba7e": "CalorieCoin(address,address,uint256)", +"b79a5539": "preTokenSalesCapReached()", +"b79a6231": "Tier_Basic()", +"b79af928": "totalSpentEth(address)", +"b79c5f7f": "IntentionToFund(address,uint256)", +"b79eb3a4": "AlterContactPubkey(address,bytes32,bytes32,bytes32,bytes32)", +"b79ec028": "setLevelup(uint8[4])", +"b7a025f9": "bZxTo0xContract()", +"b7a139bf": "firstRoundPercent()", +"b7a1affa": "DACContract()", +"b7a1c236": "LogChangeIsPayableEnabled(bool)", +"b7a1d003": "SessionClose(uint256,uint256,uint256,uint256,uint256)", +"b7a2cbcc": "lockedTransfers()", +"b7a2d99d": "withdrawAbleEther()", +"b7a2e1f2": "buy(string,string,uint256,address,address,address,address,bytes2)", +"b7a311fd": "TimoNetwork(uint256,string,string)", +"b7a3446c": "oldBalanceOf(address)", +"b7a40f21": "purchasePlanet(uint256)", +"b7a55438": "replaceOperator(address,address)", +"b7a693d7": "MaxSantaRewardPerToken()", +"b7a6b6a7": "AIREP()", +"b7a7612c": "setBtcEthRate(uint256)", +"b7a78911": "testMultitransfer2()", +"b7a8807c": "openingTime()", +"b7a90cf9": "BitAseanToken(uint256,string,uint8,string)", +"b7a9434b": "registerSpawned(uint32,int256)", +"b7a973bd": "setCompte_13(string)", +"b7a97a2b": "isValidChannel(uint256)", +"b7ab4db5": "getValidators()", +"b7ab63e9": "getPollingStation(uint256,uint256)", +"b7ab7ade": "setAllowedContract(address[])", +"b7abf606": "modifyLocality(string)", +"b7ac5d3b": "marketingFundAddress()", +"b7acbd41": "checkSellerGuarantee(address)", +"b7acdca6": "addBet(uint256,address)", +"b7ad2432": "totalWindows()", +"b7adb169": "getPendingUserlists()", +"b7adb974": "lightingTransfer(address,address,address,uint256,uint32,bytes32)", +"b7ae74fd": "FreeCoin(address,uint256,uint256,uint256,uint256,uint256)", +"b7aec6a5": "scheduleCall(address,bytes,uint256,uint256,uint8,uint256)", +"b7aec6b1": "getSpecificEscrowTransaction(address,address,uint256)", +"b7b0422d": "init(uint256)", +"b7b172b3": "cashout(address,uint256)", +"b7b1b93f": "_createPixel(uint32,uint8,uint8,uint8,string)", +"b7b1d7f7": "isCrowdSaleActive()", +"b7b1e3cc": "getPropertyData(uint16,uint256,uint256)", +"b7b2a009": "getCardDetails(uint8)", +"b7b2bbc0": "WinnerSet(uint256,uint256,address)", +"b7b2c7d6": "batchFillOrders(address[5][],uint256[6][],uint256[],bool,uint8[],bytes32[],bytes32[])", +"b7b2e501": "makeInvisible(uint128)", +"b7b33765": "calculationOfPayment()", +"b7b3a56e": "overflow_lower()", +"b7b3b89a": "lockedVault()", +"b7b3ea98": "endContrib()", +"b7b4557c": "LogMigrationInitiated(address,address,address)", +"b7b47e31": "batchActivenessUpgrade(uint256[],uint256[])", +"b7b48388": "addThing(bytes32,bytes32,string,string)", +"b7b4ceb3": "CPCEIco()", +"b7b4fe13": "setWhitelistDemoc(address,bool)", +"b7b5709a": "freezeFrom(address,bool)", +"b7b57c3f": "getPartnerMessage(address,address,uint256)", +"b7b5e811": "getProjectBonus()", +"b7b6700b": "viewPlayerPayout(address)", +"b7b6e978": "unlockForOrder(address,uint256)", +"b7b747c5": "testDepositUsingDeployedContract()", +"b7b8533a": "expireAfter()", +"b7b96723": "right7(uint256)", +"b7b9dead": "MyAdvancedToken()", +"b7ba0ba0": "showAssetEvent(bytes32,uint256)", +"b7ba6050": "currentTokenOfferingRaised()", +"b7bae9b7": "exists(bytes,bytes)", +"b7bb018d": "unlockingBlock()", +"b7bb208b": "JobitToken()", +"b7bc2c84": "isFueled()", +"b7bc7653": "set_pauseDET(bool)", +"b7bc7cb8": "fixedExp(uint256)", +"b7bda68f": "taxAddress()", +"b7bdc7ef": "setDomainPrice(bytes32,uint256)", +"b7bedaf1": "setPreAddr(address)", +"b7bf356a": "taskExists(bytes32)", +"b7c03170": "CurrentState()", +"b7c14d7a": "payOutJackpot()", +"b7c1a119": "percent3_33()", +"b7c251c3": "getRedeemedPeriods(bytes32,address,uint256)", +"b7c2ccb6": "getNodalblockTimestamp(string)", +"b7c3236f": "getEtherKey(uint256)", +"b7c38d02": "testControlCreateSameIpfsHashAndNonce()", +"b7c42cf0": "claimTokensICO(address)", +"b7c4b775": "setMaxGas(uint256,uint256)", +"b7c4bf17": "readyUp()", +"b7c52820": "addSentTrade(address,bytes32)", +"b7c54c6f": "getHKGOwned()", +"b7c55259": "endGame(uint256,address,address,address)", +"b7c5b181": "delegatedTransfer(address,address,uint256,string,uint256,bytes32,bytes,uint256)", +"b7c65d1a": "retrieve_domain(address,uint256)", +"b7c70c34": "seratioCoin()", +"b7c74cf6": "_calculatePayment(uint8)", +"b7c763b5": "getString(uint256)", +"b7c7986f": "getMarket_CommunitUnusedTokens()", +"b7c7ecbe": "setTitulaire_Compte_6(uint256)", +"b7c8561f": "removeDestroyer(address)", +"b7c8699d": "modifyGovtAccount(address)", +"b7c8a90a": "removeExclusionFromTokenUnlocks(address[])", +"b7c93330": "ResourcePoolTester()", +"b7c940f6": "SolarDaoTokenCrowdsale(address,address,uint256,uint256,uint256)", +"b7c97930": "registerPool(string,uint256,uint256)", +"b7c97fa0": "BEN()", +"b7c9da33": "buyTulips(uint32,uint16)", +"b7ca3086": "getSelfCount()", +"b7ca51e8": "starToken()", +"b7caf50a": "ticketsNum()", +"b7cb4830": "NERU()", +"b7cc2312": "bobClaimsPayment(bytes32,uint256,uint256,address,address,bytes20)", +"b7ccc466": "categoriesCount()", +"b7ccccaf": "bridgeValidatorsProxyOwner()", +"b7cce253": "maximumMainSaleRaise()", +"b7cdddcb": "claimEth()", +"b7cefd9f": "FlatEarth()", +"b7d02044": "deployToken(string,string,uint8,uint256)", +"b7d0628b": "getGameState()", +"b7d130ff": "isAuthorizedToSell(address)", +"b7d29e91": "NameChanged(bytes32,string)", +"b7d3a9c9": "setWhitelistAgent(address)", +"b7d3cb87": "countAllProposals()", +"b7d454a4": "setNotTransferable(bytes32)", +"b7d478bf": "getAvgAmount(uint256,uint256)", +"b7d4c4a5": "getInvestorsList()", +"b7d4dc0d": "unsetBase(address,uint64)", +"b7d4e5fd": "getX2(uint256)", +"b7d534a1": "addrToString(address)", +"b7d5d4c0": "piggyBank()", +"b7d5d74c": "balanceAtBlock(address,uint256)", +"b7d5ddc8": "setAssetClaimString(uint256,string,string)", +"b7d5e804": "remove(uint8,uint8)", +"b7d5ef4d": "BATokenFactory()", +"b7d65d17": "setUnitCoinProductionMultiplier(address,address,uint256,uint256,bool)", +"b7d6f432": "buyCar(address,uint256,bool,address,uint256)", +"b7d6f6c6": "WHALE(address)", +"b7d74fda": "DevelCoin(uint256,string,uint8,string)", +"b7d7a4e0": "say(uint256,uint256)", +"b7d7acea": "externalGiftEth(address)", +"b7d89483": "AddressList(string,bool)", +"b7d8b1d9": "emitWorkStarted(uint256,uint256)", +"b7d9549c": "incrementPrice(uint256,address)", +"b7d9d7b9": "roundTwoAmount()", +"b7da166b": "_mint(address,address,uint256)", +"b7da5b0d": "TreatzCoin()", +"b7dacbf1": "setBackup(address)", +"b7db7f0f": "allowTransfer(address,address,address,uint256,bytes)", +"b7db87e8": "testFooArray()", +"b7dc2a9f": "weiMinimum()", +"b7dc3b18": "buy(uint256,string)", +"b7dc5c11": "priceGuaranteed()", +"b7dc8a32": "firstValidBlockNumber()", +"b7dc9d85": "ORDER_DONE(address,address,address,bool,uint256,uint256,uint256)", +"b7dcf6a9": "createPromoCollectible(uint8,uint8,uint256,address,uint256,uint256,uint256)", +"b7dd1d17": "getAllRevisionBlockNumbers(bytes32)", +"b7ddcb27": "InteractiveCrowdsaleToken(address,string,string,uint8,uint256)", +"b7de47d3": "getIndex(uint256,uint256)", +"b7dea35f": "hatchSeeds(address)", +"b7dec1b7": "GENESIS()", +"b7ded7cc": "purchaseHero(uint256)", +"b7df07a6": "receivePlayerInfo(address,string)", +"b7df7ef8": "AccountUnlocked(address)", +"b7df9289": "recvShrICO(address,uint256,uint256)", +"b7dfc8a5": "updateTokenPerEther(uint256)", +"b7e0308d": "priceStep2()", +"b7e03264": "showWinner()", +"b7e05277": "private_DelGameBar(uint256)", +"b7e05d4f": "newProposallog(string)", +"b7e09773": "devTeamReinvest()", +"b7e1917c": "tokenAdmin()", +"b7e1b974": "getStr(uint256)", +"b7e1bce7": "ReceiverAddressChanged(address)", +"b7e1ecef": "addAttendantAndTransfer(string,string,bool)", +"b7e1fd9b": "createDividend(uint256,uint256,address,uint256,bytes32)", +"b7e2263b": "getTotalMatches()", +"b7e24979": "addThing(bytes)", +"b7e28a3b": "certificationManager()", +"b7e2f504": "isPreSaleFinalised()", +"b7e39b4f": "setBalances(address[],uint256[])", +"b7e43a84": "maximumIssuerReservedUnits()", +"b7e45353": "forbidChecking(uint256)", +"b7e4a503": "Determine_Result(uint256,uint256)", +"b7e5cabb": "contractorsProfitAddress()", +"b7e621c3": "claimCompanyTokens()", +"b7e6bd34": "getTopic(bytes15)", +"b7e6dfe3": "GetApplicantAddress()", +"b7e82526": "GraybuxToken()", +"b7e83329": "ExportMaster()", +"b7e90262": "roleAdminAddress()", +"b7e92ede": "EtheRoox(address,address,address,uint256,uint256,uint256)", +"b7e9f193": "nextWithdrawal()", +"b7eb22b3": "getAccountsSize()", +"b7eb5e0a": "unlockAddress(address)", +"b7ec2086": "priceWei()", +"b7ec44b4": "asyncTransfer(address,uint256)", +"b7ecbaae": "removeWhitelistAddress(address)", +"b7ee2552": "ICOpaused()", +"b7eea206": "openLedgerAddress()", +"b7ef5fed": "claimRewards(uint16[],address)", +"b7efc1cd": "authorizeMintToken()", +"b7eff231": "oraclize_query(string,bytes[3])", +"b7efff16": "GANAPATI()", +"b7f01bfc": "tank()", +"b7f1489e": "setLosePercent(uint256)", +"b7f1e6af": "preferredSaleEndTime()", +"b7f2f33c": "transferRightIfApproved(address,bytes)", +"b7f37983": "getInvestmentRecordListLength()", +"b7f3ffed": "updateProfiterole(address,uint256)", +"b7f43a63": "brideVow()", +"b7f48211": "setPackState(uint256,bool)", +"b7f53c91": "CryptoSilver()", +"b7f545cc": "deployTokenContract(uint256,bool)", +"b7f603ff": "LimbToken()", +"b7f63665": "ttToken()", +"b7f6a75a": "XPAToken(address,address,uint256,uint256,uint256)", +"b7f6e74d": "unpositionFrom(address,address,uint256)", +"b7f79374": "DildoToken()", +"b7f84ae2": "icoPhaseTimeInterval()", +"b7f90f12": "decrementCount()", +"b7f927e6": "PROMETHEUS_VOUCHER_LIMIT()", +"b7f92b71": "reserveFund()", +"b7f9c4f6": "initCapsule(uint256)", +"b7fa265a": "_withdraw(bool)", +"b7fb1dc8": "payToMarketingReferral()", +"b7fba4d3": "getProxy(address)", +"b7fc5a48": "getPoolStars(uint32)", +"b7fc6612": "transferMany(address[],uint256[])", +"b7fcc321": "CryptoHoleToken()", +"b7fcfa69": "amountReceivedFromTransfer(uint256)", +"b7fd45a0": "EscrowICO()", +"b7fda832": "updateGenVaultAndMask(address,uint256)", +"b7fde9da": "mintCoins(address,uint256)", +"b7ff11be": "isAcceptedDcorpMember(address)", +"b7ff2aed": "withdrawMaker(address,uint256,address)", +"b8005f38": "execBoard()", +"b800b2fe": "BEZOS()", +"b800db55": "__isSenderInRole(uint256)", +"b8017221": "get_party2_balance()", +"b8029269": "get_money()", +"b804dc56": "setRecallPercent(uint256)", +"b80509c5": "getCountsById(uint256)", +"b80540c0": "Adjudicator(address[],uint256,uint256)", +"b80546c2": "endPeriodA()", +"b805a5ca": "GetChip(uint32)", +"b8066bcb": "etherToken()", +"b8068a5f": "CATServicePaymentCollector(address)", +"b80756f0": "_calculateLockedBalance(address)", +"b80777ea": "timestamp()", +"b8077e28": "getTxOrigin()", +"b8079d49": "debitWalletLMNO(address,uint256)", +"b807ed76": "SANKEYSOLUTION()", +"b80825ff": "TheBittrip()", +"b808745c": "transferPass(bytes32,address)", +"b8087ac0": "goalMet()", +"b80907f2": "getReputationToken()", +"b809127e": "getQuickPromoBlockInterval()", +"b8093100": "giveBounty(uint256,address,address)", +"b809ceb2": "updateIcoDates(uint256,uint256,uint256,uint256)", +"b80a30b7": "_getInvestorTokenAmount(address)", +"b80ac7df": "verifyProof(bytes32[],bytes32)", +"b80aedf2": "setReservedTokensList(address,uint256,uint256,uint256,bool)", +"b80cdcf6": "finishCrowdsale()", +"b80ced14": "LPCoinToken()", +"b80d3181": "annualPrice()", +"b80e63df": "baseTokenBalance(address)", +"b80ee369": "createCardForAcquiredPlayer(uint256,address)", +"b80f3532": "exchnageRate()", +"b8109e1a": "MeetingsEntity()", +"b810b81c": "Pixereum()", +"b810bfa4": "GDC(address,address,address,address,address)", +"b810d24b": "updMinPurchaseLimit(uint256)", +"b810fb43": "addressList(uint256)", +"b811215e": "initialCap()", +"b81168b4": "CNNTokenBase(uint256,string,string,uint8)", +"b8121385": "stopOperation()", +"b8121fe4": "viewPetitionSigner(uint256)", +"b8126a3e": "addSideService(address,uint256)", +"b812a6ce": "lastBlock_v11()", +"b813c627": "releasedSupply()", +"b813d939": "test_fourValidEqUint(int256)", +"b8144a72": "getBankRating(address)", +"b814660e": "AllowTransferLocal()", +"b8163641": "checkReceive(address)", +"b8174685": "_claimReward721(address,string)", +"b817e043": "JobMarket()", +"b818f9e4": "batchTransferFrom(address[],address[],uint256[])", +"b8198875": "StreamToken(uint256)", +"b81af39b": "declineMP(address,int256)", +"b81b0b6a": "claim(bytes32,string,string,address,bytes32,bytes32,uint8)", +"b81bb854": "createRequest(address,address[],address[],int256[],address,string)", +"b81c259e": "PexCash()", +"b81c6453": "vote(uint8,address)", +"b81ca723": "InitialCoinOfferingToken()", +"b81ccdd5": "cashilaTokenSupply()", +"b81ce8a7": "MicropaymentsNetwork()", +"b81db9da": "addUserValueName(bytes20)", +"b81df742": "minBuyLimit()", +"b81e3b19": "bankMoney()", +"b81e43fc": "getEventName()", +"b81ec822": "PRE_SALE_2WEEK_BONUS()", +"b81f39a8": "addToReserve()", +"b81f3be0": "deleteVotersWithoutShares(uint256[],uint256[],bool)", +"b81ff45b": "getBalanceByAccount(string)", +"b8205d35": "IncentToken()", +"b8206a18": "unVestAddress(address)", +"b820c41c": "iceToken()", +"b8216ea8": "redeemMany(address[])", +"b821da1b": "submitBid(uint256,uint256)", +"b821f815": "pay_winner(uint256)", +"b8225dec": "selfDestructInitiated()", +"b822b28a": "lastBlock_a8Hash_uint256()", +"b823aac7": "endICOTimestamp()", +"b823e991": "CourseCertification()", +"b8240a65": "UpdatedPrice(uint256)", +"b82465e9": "managerIncome(address)", +"b8248dff": "isValidOwner(address)", +"b82545e5": "judgeWin(uint256,uint256)", +"b8254880": "SurrusContract()", +"b8261f8f": "myEntityList(uint256)", +"b826d6d7": "DigiPulseToken()", +"b82852ec": "changeReserveIAMDestinationAddress(address)", +"b82864e0": "getHouseEdgeFee(uint8,uint256)", +"b828cfd2": "PRVTToken(uint256,string,uint8,string)", +"b8291bda": "Pomzon()", +"b829528e": "LotteryLog(address,string)", +"b82a0ce8": "bonusTime()", +"b82a65b2": "getReportingToken(uint256[])", +"b82a737c": "communityAmount()", +"b82b2a07": "makeProposal(uint8,uint8)", +"b82e6416": "doTimeoutForDefendant(uint256)", +"b82eb946": "_setStageLimit(uint256)", +"b82fb745": "saleEndAtBlock()", +"b82fcdeb": "tokensAllocatedForTeamAndReserve(address)", +"b82fd275": "removeFrozenTokenConfigurations(address[])", +"b82fedbb": "register(bytes32,address,bytes32,bytes32)", +"b8305b43": "HodlCreated(uint256,address,uint256,uint256)", +"b83069c5": "getStemPrice()", +"b830b305": "getpersonCount()", +"b830c538": "unassignRole(address,bytes32,address)", +"b8314c22": "whaleMax()", +"b831d137": "saleSharesSold()", +"b832004d": "setTokenInfoParametersReady()", +"b832679c": "setKmPards(address)", +"b832fdde": "NON_VESTED_TEAM_ADVISORS_SHARE()", +"b833ac27": "PolyToken(address)", +"b8341628": "mintingPreIcoFinish()", +"b834f6fb": "isMainChain()", +"b83506cf": "defaultBuyNowPrice()", +"b83520b3": "allowIcoExit(bool)", +"b835a7fe": "RubiksToken()", +"b8366bd1": "CorruptionCoin()", +"b837433c": "TEAM_ADVISORS_SHARE()", +"b837a3b8": "sendProfitsRewardBips()", +"b837c58e": "payTo()", +"b837c94f": "ASEBToken()", +"b8385339": "finalizeStage(uint256)", +"b8386f3b": "_gambling(uint256,bytes32,uint256)", +"b8388aca": "findBestRate(address,address,uint256)", +"b839e0d1": "lockedAllocatable()", +"b83a1bdc": "lastMineralUpdateTime()", +"b83a4da9": "totalWeiSale()", +"b83ace61": "setHouseEdge(uint256,uint256,uint256)", +"b83b4529": "FundsTransferredToMultisig(address,uint256)", +"b83c298e": "updateBoolSetting(uint256,bool,address,string,string)", +"b83d3f2c": "oraclizeSource()", +"b83dfdc9": "setInvestorData(address,uint256,uint256)", +"b83e1d14": "CountTokenUser(address,uint256,bool)", +"b83e4779": "OntologyToken(uint256,string,string)", +"b83e9662": "ParaTransfer()", +"b83fc6b6": "CrowdsaleClosed(uint256)", +"b8406a7e": "balanceOfLotteryNum(address)", +"b840a1db": "WhitelistChanged(address,bool)", +"b840b421": "OriginalVirtualOperation()", +"b8415b0c": "startDistribute()", +"b8416d2e": "exec(address,bytes32,bytes)", +"b84172e7": "getH1Bidder()", +"b842826c": "Built()", +"b842eef2": "test02BuyToken()", +"b8435050": "crowdsaleclosed()", +"b84391de": "setBetEndTime(uint256)", +"b8441be0": "setTransferAuthPermission(address,bool)", +"b8444c13": "forceVoidRace()", +"b845b51e": "IIPToken(uint256)", +"b845c9a2": "WEI()", +"b8471085": "PRIVATESALE_START_DATE()", +"b84738aa": "changeMinPay(uint256)", +"b848b944": "doSellerCancel(bytes16,address,address,uint256,uint16,uint128)", +"b8499750": "advisorLock()", +"b84a6849": "createShareToken(uint256)", +"b84aac5c": "decreaseApprovalPreSigned(address,uint256,uint256,uint256,uint8,bytes)", +"b84b05b2": "NetyulCrowdsale(address,uint256,uint256,uint256,address,address)", +"b84b276d": "second_whitelistSupplier()", +"b84b8b8c": "buyGoods()", +"b84c11da": "create(address,string,bytes32,uint256,address)", +"b84c35b3": "addCode(string,uint256)", +"b84c743b": "getReferencePrice(address,address)", +"b84c8246": "setSymbol(string)", +"b84cc017": "myBonus(uint256)", +"b84d2106": "shut(bytes32)", +"b84dda70": "tweakState()", +"b84dfbd2": "securityToken()", +"b84e1327": "checkIfContractCreatedHere(address)", +"b84e44ab": "setProviderLastSupplyID(uint256,uint256)", +"b84ebd7f": "createMechBTC(uint256,address)", +"b84ee1a4": "setTransferProxy(uint32,int256,address)", +"b84f1318": "AddNewCurrency(string,string,string)", +"b84fe73b": "voteAll(address)", +"b84fed88": "isMintContract(address)", +"b8500e5e": "purchaseRecordsNum()", +"b8506a3f": "tokensPerWei7()", +"b850ae36": "isRegular(uint256)", +"b851ed97": "bonusAllowed()", +"b8522043": "getUserList()", +"b8534ed1": "contractEndTime()", +"b8547736": "testBadWithGoodInterface(address,uint256,address,uint256)", +"b85477c5": "dealStatus()", +"b857a688": "Eth_Amount()", +"b858b39f": "PhotoAdded(address,address)", +"b85926e0": "VESTED_AMOUNT()", +"b85973c1": "overbidNation(uint8)", +"b8598f9e": "computeOppositePrice(uint16)", +"b85a6a20": "numComments()", +"b85bf538": "ownerSetBankersLimit(uint256)", +"b85c2f72": "submitEntry(uint256,uint256,uint256,uint256)", +"b85cf54e": "rewardPoolPercentage()", +"b85d6275": "RemoveModerator(address)", +"b85dfb80": "backers(address)", +"b85e0402": "AppCoinsIAB()", +"b85e0aca": "legacyRepContract()", +"b85e5915": "ExitPlincWithLoss(uint256)", +"b85e7df1": "setPresaleMode()", +"b85e84c0": "judgeFinality(bytes32[13],bytes32[],bytes32[],bytes32[10],uint256[4])", +"b85ea983": "countPortfolios(address)", +"b85eb295": "checkOwnershipAndAvailability(address,uint256[4])", +"b85ed17d": "getHolderByIndex(uint256,address)", +"b85f726a": "Cashier()", +"b85fb20f": "getPollStage(uint256)", +"b861be22": "checkPermissions(address,address)", +"b8621759": "issueNewCoins(address,uint256)", +"b862d80d": "minBetVal()", +"b86397e7": "mFUNDING_CURRENT_DURATION()", +"b863bd37": "random(uint256)", +"b8642896": "ETSToken(address)", +"b864f5a9": "verify(uint256[],uint256[])", +"b8657988": "MYSUPERTOKEN()", +"b8661e2d": "getAllTeamsIds()", +"b86780b3": "restTokensBurned()", +"b867e8e6": "accrueDividendsPerXTokenETH()", +"b868723e": "endPrice()", +"b868a2ff": "update(uint256,uint256,bytes32[])", +"b8697dbd": "getLockByIndex(uint256)", +"b869f1e2": "SALE_CAP_IN_USD()", +"b86a1fb2": "adminPool()", +"b86a3582": "ETCH3dVs()", +"b86b14cd": "setRate1(uint256)", +"b86b9aa4": "getJackpotWinBonus(uint8,bytes32,bytes32)", +"b86bc74f": "CERTIFIER()", +"b86c49e1": "getMarketsItemId(uint256)", +"b86c6b7b": "calculateCellBuy(uint256,uint256)", +"b86c9845": "MithrilSword()", +"b86dab46": "addToApprovedAddress(address)", +"b86df9db": "RewardRecycled(uint256,address,uint256,uint256,uint256)", +"b86e0657": "removeServer()", +"b86e321c": "withdrawReward(address)", +"b86ec38f": "REIMBURSABLE()", +"b86eeb69": "bountyTotalSupply()", +"b86f602c": "submitOrder(bytes,uint64,uint64,uint256,uint256,uint256)", +"b86f6aa7": "resetCollectedFees()", +"b8701689": "removeGlobalConstraintPre(int256,address,int256,address)", +"b870ecbb": "testNormalWhitelistAdd()", +"b870f613": "back(address,uint256)", +"b8716f3a": "_teamTransfer(address,uint256)", +"b8726395": "Mint(int256,uint256)", +"b873846f": "ArrayPasser(uint8[9])", +"b873e9a7": "trustedReportingParticipantTransfer(address,address,uint256)", +"b875a5e0": "rateThirdRound()", +"b8760ad3": "payStakingFee(address,uint256,uint80,uint80,uint256,address)", +"b87760ad": "uint256Tostr(uint256)", +"b8782d49": "PHASE2_RATE()", +"b8788453": "mainSale_StartDate()", +"b87aedcc": "recentPlayersFront()", +"b87b9ac3": "testExchangeRate(uint256)", +"b87ba329": "getMemoryTraceMeta(uint256)", +"b87c01e3": "GVPE_address()", +"b87c03c2": "multiAccessOwners(uint256)", +"b87c7d43": "setEthAmount(uint256)", +"b87cbafc": "bn128_check_pairing(uint256[12])", +"b87d8712": "RulesProposalSubmitted(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"b87dbf81": "handleAffiliate(uint256,uint256,uint256)", +"b87dddf6": "tokenFallback(address,uint256,bytes,string,uint256)", +"b87e461c": "scrapPercent()", +"b87e64ce": "DecentBetVault(address)", +"b87ee9d6": "setLLV_edit_4(string)", +"b87f9b98": "_stringToByte(string)", +"b87fb3db": "start_block()", +"b87fb721": "LogNewTemplate(uint256,address,string)", +"b87ff295": "MintTokens(int256,address,uint256)", +"b8803738": "total_user_eth_cap()", +"b88064ad": "peMinPerPerson()", +"b881604d": "removeStrip(uint256)", +"b8840d3d": "getDrug(uint256)", +"b88467c2": "getProjectEscrowAddress(bytes32)", +"b8847e9d": "haltRevealPeriod(bytes32)", +"b8850556": "ApplyAction(uint32,uint32,uint256,address,address)", +"b8851fea": "endDateStart()", +"b8852718": "transferLockedPart(address,uint256)", +"b8857936": "dtSetEthBalance(address,uint256)", +"b885acd8": "fourthWeekTokenPrice()", +"b885d560": "airDeliverStandalone(address[],uint256[])", +"b88635e2": "PtestToken()", +"b8867485": "proxyOf(uint256)", +"b8871f98": "_createEdition(uint256,bytes32,uint256,uint256,uint256,address,uint256,uint256,string,uint256,bool)", +"b8872fb7": "reinvest(address)", +"b8873077": "HUNT(uint256,uint256,uint256,uint256,address)", +"b88746b0": "previousDrawingClosed()", +"b8878171": "getPersiansBattlePointsBy(address)", +"b888690a": "deleteMessage(uint256)", +"b888a492": "isNewPayoutPeriod()", +"b888a66b": "tktPrice()", +"b888adfa": "lastPhaseChange()", +"b88903f7": "TokenDrop(address,uint256)", +"b8894fe3": "mintTokenToBuyer(address,uint256,uint256)", +"b889d440": "markTokenSold(uint256)", +"b88a374c": "EarnEnoughMoney()", +"b88a529b": "getCurrentRate(uint256)", +"b88a802f": "claimReward()", +"b88ab668": "TBXToken()", +"b88c9148": "getFee(address)", +"b88d0169": "INITIAL_EMISSION_FACTOR()", +"b88d4fde": "safeTransferFrom(address,address,uint256,bytes)", +"b88d6aa7": "refund(bytes32,uint8,uint256,uint256)", +"b88e8518": "FluencePreSale(uint256,uint256,uint256)", +"b88e962f": "showEmployee(uint256,uint256,uint256)", +"b88eef53": "registryCreated()", +"b88f9936": "setMinTms(uint256)", +"b88fd16e": "developmentFundAddress()", +"b8901a41": "am_I_locked(address)", +"b8905649": "Crowdsale(address,uint256,uint256,address,address)", +"b8906755": "payProviderFee(address)", +"b890de6b": "thirdLineWrong()", +"b890ed85": "CryptoSagaCardSwapVer2(address,address,address,address)", +"b891656e": "thismanyblockstillthspudholderwins()", +"b8918710": "FangTangCoin(uint256,string,string,uint8,bool,uint256,uint256,uint256,uint256)", +"b893deb1": "getContestEndTime()", +"b89503f3": "getDiceWinAmount(uint256,uint256)", +"b895947a": "Janders()", +"b895c813": "registIcoAddress(address)", +"b896149c": "BLUEOS()", +"b89648cf": "getBoughtTicketList()", +"b8972db5": "sendToken()", +"b8973927": "setContractStart(bool)", +"b89761b8": "encoded_data()", +"b897b4f5": "multAirdrop(address[],uint256)", +"b8991ffb": "reject_payment(uint256,bytes32)", +"b899e1b7": "_setApp(bytes32,bytes32,address)", +"b89a73cb": "isShareholder(address)", +"b89bf71d": "safeWithdrawal4(address)", +"b89c5932": "setRequestLimitInterval(uint256)", +"b89c70c0": "calculateCoinBuy(uint256,uint256)", +"b89cd5bd": "icoPartner(address,uint256)", +"b89e066a": "MINCAP_TOKENS_PRE_ICO()", +"b89e8cbb": "getRemainingSellingTime()", +"b89f3025": "investExt(address,uint256)", +"b89fc89e": "setDistributionAddress(address)", +"b89fde71": "CheckAmbientTempException(bytes32,uint32)", +"b8a15b1d": "bobMakesErc20Payment(bytes32,uint256,address,bytes20,address,uint64)", +"b8a1e355": "doBet(uint256)", +"b8a1fdb6": "transferAndFreezing(address,uint256,uint256,uint256,uint8)", +"b8a24252": "checkpoints(uint256)", +"b8a25119": "setPresaleMode(bool)", +"b8a268c1": "getCloseFlag(bytes)", +"b8a32c7e": "claimTile(uint256,uint256,uint256)", +"b8a358e9": "canMintUtility(address,uint256)", +"b8a393b8": "openCompetition()", +"b8a3c6ea": "KPCSAdministrator(string)", +"b8a4a064": "applauseCashCrowdsale()", +"b8a4b858": "INVESTOR2()", +"b8a4db81": "addValueBonus(uint256,uint256)", +"b8a4f9ae": "addInFutureExpanstionMap(address)", +"b8a5368a": "gameStart(uint256)", +"b8a548c5": "SCTokens()", +"b8a582a9": "EtherMoney()", +"b8a582af": "logicVersion(address)", +"b8a67b6e": "GiroToken()", +"b8a67c3c": "expireDate()", +"b8a684f8": "CryptoSagaSwapPLAT(address,address,address,address)", +"b8a76f54": "setIPFSHash(string)", +"b8a7c78a": "CommunityAddress()", +"b8a80aac": "getItem(address,uint256)", +"b8a876ed": "Quitcoin()", +"b8aa0a34": "getSealDate()", +"b8aa4da8": "addMemberToBS(address)", +"b8aaae7a": "PXXToken()", +"b8aac3a5": "createAndSignBBODocument(bytes,bytes,address[],uint256)", +"b8ab9203": "secondRoundMayTokensLimit()", +"b8ab9883": "claimTimeoutEndedWithMove(bytes32,uint256,uint256)", +"b8aba8cf": "NewPayment(address,uint256)", +"b8abd184": "getInvestorKey(bytes32,uint8)", +"b8aca90b": "CurrentGame()", +"b8ad2abe": "addTokenGrant(address,uint256)", +"b8ad2fca": "claimMeme()", +"b8adaa11": "reject(uint256)", +"b8af146f": "subsm(uint256,uint256)", +"b8af21b9": "isLotteryClosed()", +"b8af6bc7": "getAgentsAmount()", +"b8af7642": "seeAddress(uint256)", +"b8afae78": "IPM2COIN()", +"b8afd597": "FinishRoundGamble()", +"b8b040a1": "xapo()", +"b8b0f533": "get_bitcoineum_contract_address()", +"b8b13e6b": "MaximumcoinStart()", +"b8b18915": "withdrawBonus(address)", +"b8b199e5": "_userSignUp(string,address,bool)", +"b8b19c27": "MultiOwnable(address[16],uint256[16])", +"b8b2052c": "setCrowdsale(address,address)", +"b8b23120": "getFlagPrice()", +"b8b27765": "payManagementBodyPercent(uint256)", +"b8b2bdad": "setBool(string,bool)", +"b8b2d490": "feePerSec()", +"b8b359b8": "voteByIndex(uint256,address,uint256)", +"b8b3d85b": "getFunderBalance(address)", +"b8b459bc": "OrderUpdated(uint256)", +"b8b4f1a0": "signContract()", +"b8b52652": "startFightA(uint256,uint256,bytes4)", +"b8b570f1": "Distributed()", +"b8b690e7": "__targetExchangeCallback(uint256)", +"b8b798be": "getYearlyUSDSalariesTotal()", +"b8b7b899": "receiveTransfer(address,uint256,address,bytes)", +"b8b7edb2": "hashToken()", +"b8b808cc": "getAddressFromNumber(uint256)", +"b8b85873": "purchaseArray(uint256)", +"b8b8d387": "myWeiValue()", +"b8b8fc3a": "getPI_edit_20()", +"b8ba427d": "RetDime()", +"b8ba532f": "developer_edit_name(string)", +"b8ba7c7f": "createGen0Auction(uint256,uint8,uint8,uint8,uint8)", +"b8baed2c": "calcTradeFeeMulti(uint256[],uint256[])", +"b8bb372c": "APIHeaven()", +"b8bb41dc": "setReceiver6()", +"b8bcaad5": "_randomPack(uint256)", +"b8bce6d0": "dateEcoRelease12()", +"b8bcf6c9": "ico2ndPrice()", +"b8bd3dbb": "setMakerFee(uint256)", +"b8bdd8dd": "close(bytes)", +"b8bdf701": "initiateCreateSale(uint256,uint256,uint256,uint256)", +"b8be73ed": "offchainUploaderAddress()", +"b8beafd6": "buyVolumes(address,address)", +"b8bf029b": "list(address,uint256,uint256,uint256,uint256)", +"b8bf0f1f": "getRemainingBlocksUntilPayoutk()", +"b8c0517a": "splitStake(address,address,address,uint256)", +"b8c26d0b": "ContractWithParams(address)", +"b8c2a9e1": "getBidReports(uint256)", +"b8c375b6": "WavesToken()", +"b8c48f8c": "setInitialParent(int256,int256,int256)", +"b8c508e5": "MOBOL()", +"b8c52477": "_exchange(uint256,uint256)", +"b8c577ff": "setGrowth(uint32)", +"b8c58128": "setList(uint256,uint256[])", +"b8c65462": "preICOSaleStart()", +"b8c6a67e": "maxPendingParticipants()", +"b8c6d2e9": "BretCoin()", +"b8c6f579": "setAuction(address)", +"b8c766b8": "saleClosed()", +"b8c78391": "releaseableBalanceOf(address)", +"b8c7dea3": "stageCurrentSum(uint256)", +"b8c7e354": "tryToCompleteProject()", +"b8c86aa6": "getArraySettingResult()", +"b8c87a06": "setStage3()", +"b8c8fb73": "solve(uint256,uint256,uint256,uint256)", +"b8c92537": "acceptBidForCollectible(uint256,uint256,uint256,int256)", +"b8c9371d": "getPassOwner(bytes32)", +"b8c963a6": "atxContract()", +"b8c9c4d2": "burnResource(uint16,uint256)", +"b8c9d365": "h()", +"b8c9e4ed": "getStr()", +"b8c9e694": "getRaceMutation(uint32)", +"b8cb243d": "escrowTransfer(uint256,address)", +"b8cb40e0": "getDistributedTotal()", +"b8cb65ee": "removeTokens(uint256)", +"b8cc3c12": "depositToSubRound(uint256)", +"b8ccbd17": "removePermission(bytes4)", +"b8ccc682": "constructUrl(bytes32,uint256)", +"b8ccf4c7": "sendPositiveWhuffies(address,string)", +"b8cd0b94": "DoorLock()", +"b8cd4a8e": "joinCarveUpTen(uint256)", +"b8cd81ed": "raffleTokenReward()", +"b8ce670d": "burn(address,uint256,address)", +"b8cf14e7": "updateStatusPlayer()", +"b8cf2515": "currentFundrise()", +"b8d00d4a": "requestErc20Transfer(address,address,uint256)", +"b8d04f4e": "getReferrerAddress(address)", +"b8d08db2": "releaseCount()", +"b8d0cf4a": "setTokenPriceUSD(uint256)", +"b8d117fc": "bonusEnds4()", +"b8d1194c": "tokenGoal()", +"b8d16dbc": "isLeapYear(uint256)", +"b8d2f523": "no_aff()", +"b8d364bb": "allDistinct(address[5])", +"b8d3bfe3": "MeatGrindersAssociation(address,address,uint256,uint256,uint256,address)", +"b8d3d08a": "assertEq29(bytes29,bytes29)", +"b8d400d2": "fromEthers(uint256)", +"b8d415c9": "bntyMicrodollarPrice()", +"b8d46c9c": "setOrUpdateRecord2(string,string,string,string,address,uint8,bytes32,bytes32)", +"b8d4b642": "startICODate()", +"b8d4efb5": "validate_percent(uint8)", +"b8d55a91": "CPLToken()", +"b8d5b7f0": "maximumToken()", +"b8d73101": "expirationString()", +"b8d73849": "LogTokenDeposit(address,uint256,bytes)", +"b8d74f4b": "getAcceptedTokenAmount(address)", +"b8d85d23": "adminSetAddress(address)", +"b8d87069": "_removeContributor(uint256)", +"b8d94039": "writePosition(uint256,int256)", +"b8d94b95": "buildDSNullMap()", +"b8d9cbbe": "addMember(address,uint256,uint256,uint256)", +"b8daf1b1": "cancelChainlinkRequest(bytes32)", +"b8dbf876": "transferFromOwner(address,address,uint256)", +"b8dd3c55": "confirmSettingsChange(uint256)", +"b8dd7a5b": "numberOfWagersToMinimumTimeout()", +"b8ddc4df": "HPA_TokenERC20(uint256,string,string)", +"b8ddef1a": "IdeaCoin()", +"b8de3843": "allAmountRaised()", +"b8de85d8": "p_setBankOfEthAddress(address)", +"b8df17f0": "verifySigner(bytes32,uint8,bytes32,bytes32,uint256,uint8,uint256,bool)", +"b8df5ce3": "ownerInitialBalance()", +"b8e010de": "set()", +"b8e046d1": "MinexoDigital()", +"b8e0d08d": "increaseHardCap(uint256)", +"b8e0ffbe": "getPaymentsLength()", +"b8e2cfb1": "getMinMaxInvest()", +"b8e31ee7": "MithrilGauntlet()", +"b8e381e5": "subscriptions()", +"b8e3d8e8": "LOL()", +"b8e3e6da": "participateCrowdsaleAll()", +"b8e4189c": "updateHighestMiles_(uint256,address)", +"b8e42041": "invalidateOrdersBefore(address)", +"b8e44852": "chargeTokensForManagement()", +"b8e60467": "LRCMidTermHoldingContract(address,address)", +"b8e6a433": "calcFactorReward(uint256)", +"b8e920de": "buyTicketTest2(bytes)", +"b8e945fc": "setOwnerNick(uint256,string)", +"b8e9a6f0": "addLockedAccount(uint8,address,uint256)", +"b8e9ac71": "BICToken(uint256,string,string)", +"b8e9c22e": "getRate(address,uint256,bool,uint256)", +"b8eaffcc": "getnodeparam(address)", +"b8eb115e": "increaseDuration(uint256)", +"b8eb3546": "maxSell()", +"b8eb993d": "PUBLIC_SALE_TOKEN_CAP()", +"b8ebed78": "rightForInterest(uint256,bool)", +"b8ec59e4": "changeColorOrange()", +"b8edcd1f": "isOwnerOfJob(address,uint256)", +"b8eddde1": "paymentsOwed(address)", +"b8ef04e7": "_getRandomNumber(uint256,uint256)", +"b8ef5f4d": "nextGameSeedPercent()", +"b8ef9fcc": "cardAddressExists(address)", +"b8f20cfd": "myBalances()", +"b8f249e2": "testThrowsSaleWalletIncorrectSaleAddress()", +"b8f2690d": "TestDividendFund()", +"b8f28531": "notEqual(address,address,string)", +"b8f2954d": "addData(bytes32[],bytes32,bytes32,bytes32,uint256,uint256,uint256,uint256)", +"b8f2bbac": "modify_perms(bytes32,bytes32,int256)", +"b8f3b75d": "buyWithAddress(address)", +"b8f47481": "withdrawErc20ForAddress(address,address,uint256)", +"b8f48d3d": "setMaxRoundSize(uint256)", +"b8f53f36": "maxPrivateSaleStage()", +"b8f5e56c": "DeClub(uint256,string,string)", +"b8f6c219": "purchaseDatesToken(uint256)", +"b8f6d3ef": "getNodalblockData(string)", +"b8f6e7ff": "changeMarketStatus(uint8)", +"b8f71f26": "scheduleTransaction(uint256,address)", +"b8f75c0b": "bountyFactory()", +"b8f76562": "setWithdrawable(address)", +"b8f77005": "getQueueLength()", +"b8f78178": "createNameAndPoint(int256,bytes32,address)", +"b8f7a665": "isLive()", +"b8f7f41e": "drpCrowdsaleRecordedBalance()", +"b8f929ad": "saleWhitelist()", +"b8fa7778": "for_votes()", +"b8fbb72d": "COMMON_WITHDRAW_SUPPLY()", +"b8fbb87d": "isAssociatedAddressFor(uint256,address,address)", +"b8fbe499": "Cygnus()", +"b8fc7bd0": "setPresidenteDeMesaVerify(bytes32,uint256,uint256,uint256,bytes32)", +"b8fcf937": "myToken()", +"b8fd1e10": "updateBalancesContract(address)", +"b8fd1ffa": "addressToEtherOwed(address)", +"b8fde2a4": "dailyPercentAtNow()", +"b8fe6f93": "triggerTransaction(uint256,uint256)", +"b8ffc962": "isMaxSupplyLocked()", +"b8ffd53f": "getStageStartTime(bytes32)", +"b8ffd64b": "PowTokenBase()", +"b9002e62": "delegatedFwd(address,bytes,uint256)", +"b900a870": "getApprenticeChestPrice()", +"b900da19": "calculateBonusPercentage(uint256)", +"b9019437": "eitherHaveAttribute(address,address,bytes32)", +"b9022e44": "updatePresaleWhitelist(address[],bool)", +"b90291c3": "changeWebsite(string)", +"b902c833": "switchfor()", +"b90306ad": "Burn(uint256)", +"b9037bc2": "unlockTokensForAddress(address)", +"b903a2a5": "MultiTransfer(address[],uint256)", +"b904088e": "maximumInvestment()", +"b9043235": "_create(uint256,address)", +"b90436ba": "MBT()", +"b9045c00": "InvestCoin()", +"b904ef4a": "delUIntValue(bytes32)", +"b9068d9e": "distributeFunds(uint256,address,address,address)", +"b906b7b7": "burnPercentage10m()", +"b9078616": "executeTrade(address,address,uint256,uint256)", +"b907996a": "Forwarder()", +"b9089280": "admin_del(address)", +"b908b008": "verifyTx(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[1])", +"b9093fc6": "addIdentity(address)", +"b9098b33": "krs()", +"b90a4df1": "ApushJoustUser(address,address)", +"b90ae5a1": "registrarAuth()", +"b90b0108": "iconcontract()", +"b90b09c0": "random_bool(uint8)", +"b90b1248": "extractTokenEth(uint256)", +"b90b9aea": "EOCToken(uint256,string,string)", +"b90c1dbb": "getCreationDate()", +"b90c8566": "Somplak()", +"b90c86a9": "LogOraclizeCall(uint256,bytes32,string)", +"b90c92e2": "FysicalToken()", +"b90cec6d": "AddOfficialApps(address)", +"b90d3d0c": "data(address)", +"b90d86b9": "autoMatch()", +"b90d89a0": "start_seller(address,address,uint32)", +"b90da496": "getRankTitle(uint256)", +"b90dcc58": "SAFEToken(uint256,string,string,uint8)", +"b90e6bd8": "userRound(address,uint256)", +"b90f1af1": "icoEndUnix()", +"b90f65a2": "canCancelBet()", +"b910378d": "getBI(bytes32)", +"b91038c7": "participate(address)", +"b9103e1f": "refundAction(bytes32)", +"b9106dd9": "setAllowAccess(address,bool)", +"b91070e8": "processEmergencyFundReleaseFinished()", +"b9119b87": "ChangeSwapperAddress(address)", +"b911f2fb": "settleCandyGetx(uint256)", +"b912950e": "buyItemRaffleTicket(uint256)", +"b91366b0": "upgradeReactor()", +"b9138584": "Deedcoin()", +"b9140422": "readMailByAdmin(uint256,bytes16,address)", +"b9144c96": "TokenMinted(address,uint256)", +"b9145944": "verifySig(address,bytes32,bytes)", +"b914cf7c": "leve1(address)", +"b914d908": "getBeneficiaryIndex(address)", +"b9156830": "hasPriorDuplicate(string,uint256)", +"b9166178": "investorWallet(address)", +"b916c5ff": "redeemCoupons(uint256,string)", +"b916de59": "reset(address[])", +"b916e5d0": "goldenTokenId()", +"b916f8fd": "delistMon(uint64)", +"b9172dec": "changeStage(uint8)", +"b9174330": "gco(uint256,address)", +"b9186d7d": "priceOf(uint256)", +"b919be66": "useMultipleItem(uint256,uint256,uint256,uint256,uint256)", +"b91aedab": "transferLocked(address,uint256[],uint256[])", +"b91bb31c": "initLottery(uint256,uint256,uint256)", +"b91bf310": "initialChargeFeePool(address)", +"b91c771f": "replaceProduct(address,address,address,address)", +"b91d1aed": "createPassport(uint256,bytes32)", +"b91d3ace": "addDev(address)", +"b91d4001": "releaseTime()", +"b91d4a0f": "frontWindowAdjustmentRatio()", +"b91db40c": "FINE()", +"b91dee6c": "ResetUpdateState()", +"b91e3422": "premiumHold()", +"b91e4087": "validAddresses(address)", +"b91fe64b": "getLastDepositDate()", +"b9204d1c": "TeamVestTimeLimit()", +"b9209e33": "isVerified(address)", +"b920c799": "Insureum(uint256,uint256)", +"b920ded9": "_detectInvestorGroup(uint256)", +"b920ef71": "removeExtension(uint256)", +"b9212662": "s13(bytes1)", +"b921e163": "increaseSupply(uint256)", +"b9223946": "endVote()", +"b9224385": "LogResultWinner(uint256,address,uint256,uint256,bytes)", +"b92289ef": "sendleftmoney(uint256,address)", +"b9235d08": "FlippedCoin(address,uint256,int256)", +"b923909d": "check_hash_exist_in_chain(string)", +"b923b205": "setWhitelist()", +"b9247673": "buyListing(bytes32,uint256)", +"b9256f7e": "newTickerQueryResult(string,bytes32)", +"b925af47": "creatorsTotalBalance()", +"b92620bd": "targetWallet()", +"b926bd06": "Prepurchased(address,uint256,uint256,uint128,uint256)", +"b9272a11": "_redeemAdoptedAxies(address,uint8,uint256)", +"b927ef43": "validatorSetApplyBlock()", +"b928024d": "tokensPerWeiBonus250()", +"b9291296": "useMyOldName(string)", +"b9292158": "getTimestamps(address)", +"b929709a": "getPOOL_edit_1()", +"b92984f8": "TokenGame()", +"b92a3961": "currentRoundBudget()", +"b92a56bf": "deathData_v10()", +"b92ae87c": "isSubscribed(address)", +"b92b9d6c": "replacePublisherRegistry(address)", +"b92cb5b8": "addBrick(uint256,string,string,uint256,string,bytes32[],uint256)", +"b92cc8cf": "isExisting(uint256)", +"b92cd8f1": "officalHolding()", +"b92ce1a7": "createRandomCharacter()", +"b92d6c2f": "TWCToken()", +"b92dd395": "setManagerPowerful(bool)", +"b92ddee6": "setStartTimeIco(uint256,uint256)", +"b92e9f9e": "reportWasCalled()", +"b92edfc6": "NumberOfAuctions()", +"b92f1986": "IMDEXinvalidateOrdersBefore(address,uint256)", +"b9308d9e": "updateName(address,string)", +"b9318b0c": "_born(uint256,uint256)", +"b931b484": "bountyTokensLeft()", +"b931bec5": "setContractErc20Token(address,address)", +"b9324db6": "upgradeCardShield(uint256)", +"b9330829": "maxUint256()", +"b935170b": "addShopOwner(string,string)", +"b93529bc": "tokenTicketPrice()", +"b9358ba4": "isApper(address)", +"b9359169": "GayPersonalAds()", +"b9364835": "getCatOwner(uint256)", +"b93651bb": "__initFuse()", +"b9368721": "balancesRiskcoins()", +"b93806ab": "setWinningNumbers(uint256,string)", +"b9381f3c": "checkCapsAndUpdate(uint256,uint256)", +"b93833c3": "changeRewardAmount(uint256)", +"b9384f12": "changeMinCapUSD(uint256)", +"b938b469": "SetRewardMultiAD(uint256)", +"b938bf42": "sendBounty(bytes32)", +"b93983dd": "StoxSmartTokenSale(address,address,uint256)", +"b939d43a": "ARISCOIN()", +"b93a4408": "setMintFrequency(uint256)", +"b93a50b0": "_setApprovalForAll(address,bool)", +"b93ab165": "getCurrentInfo()", +"b93c109f": "totalInterests()", +"b93c3de2": "getHistoryRoundList()", +"b93c7d42": "sellDividendPercentCandy()", +"b93dab0b": "getBetCount()", +"b93dc802": "setEth(uint128[2])", +"b93e0e39": "ROCK()", +"b93ea812": "subtract(int256,int256)", +"b93eb763": "x(int256,int256)", +"b93f9b0a": "getAddress(uint256)", +"b93fd2bf": "createCustomAtom(uint64,uint8,uint8,uint8,uint128,uint128,uint32)", +"b9408373": "USD_PER_ETH()", +"b940db1a": "sellAllDolAtOnce()", +"b9413c47": "totalReturnedCredit()", +"b9420310": "tokenSale()", +"b942394d": "getPercent2(address)", +"b94265b8": "addReferrer(address,address)", +"b9429069": "isFarmer(address)", +"b94371ec": "getWhitelistOwner()", +"b9447f7e": "customBuyerForIndex(uint256)", +"b944ef3c": "initialTraining()", +"b94512c7": "BioCoin()", +"b9459b70": "getCurrentLuckyStonePrice()", +"b9460d04": "updateTicketVault(uint256,uint256)", +"b94669e5": "interfaceThawTokens(address,uint256)", +"b9468f7e": "bid(uint256,bool)", +"b946c19c": "rankDataContract()", +"b946fab1": "maxAmountPresale()", +"b9474959": "_isTokenOperator(address,uint256)", +"b94761b4": "SetupAllowance(address,uint256)", +"b94776de": "mintUnlockTime(address,uint256,uint256)", +"b9478ade": "DylanCoin(uint256,string,string)", +"b948348c": "purchaseTicket(uint256)", +"b94844dd": "AAAToken()", +"b9484955": "getInvestorArray()", +"b9488546": "ownersCount()", +"b9499cd6": "Midwife()", +"b949f2f3": "finishPVEBatch(uint32[])", +"b94b0a3a": "getFulfillment(uint256,uint256)", +"b94bae91": "setUser(address[])", +"b94bc7fe": "proofOfSalt(bytes32,uint8)", +"b94c3451": "techBuff()", +"b94cc52f": "mark(address,bytes32)", +"b94e3516": "TAKCoin()", +"b94e962a": "allocateTickets(uint256)", +"b94ee0fc": "Triunvirate(address[])", +"b94f5a6e": "eventPirze(address,uint8)", +"b94f969c": "investmentBTC()", +"b94fa03f": "requiredSharesToBeBoardMember()", +"b94fb4a3": "WaykiCoin()", +"b94fdaab": "upload_group_key(uint256[4])", +"b950556a": "setThingValid(bytes32[],bool)", +"b950ae2b": "changeTopWithdrawable(uint256)", +"b950f0a0": "rateTier3()", +"b95254f6": "setAsLotteryRunner(address,bool)", +"b952ab7b": "unclaimedTokensForInvestor(address)", +"b9531df3": "lowTimeBonusLimit()", +"b953a9ac": "getDocumentProposalCount()", +"b9541ad5": "resetReferee(address)", +"b95459e4": "moduleRegistry()", +"b95460f8": "open(address)", +"b954ca70": "setcapbounus(uint256,uint256,uint256)", +"b95594e5": "lineOfPlayers(uint256)", +"b9559685": "StateHolder()", +"b955b95c": "getKindOfPackage(address)", +"b955e60d": "roundData(uint256)", +"b956a8a6": "easyMineToken()", +"b9570c01": "transferAndCall(address,uint256,bytes32)", +"b957aeb6": "getUserReaction(uint256)", +"b957b886": "stackOffset(uint256)", +"b9582195": "SFXToken()", +"b958893e": "XTVAirDropped()", +"b9588adc": "getStageAttributes(uint8)", +"b958a5e1": "getPhoneByAddress(address)", +"b958abd5": "setA(string)", +"b9592e92": "setGM(address)", +"b9599f3a": "fetchUndistributedProfit()", +"b95a4baf": "daysSinceLaunch()", +"b95a8327": "marketGrapes()", +"b95af889": "processTransferToICAPResult(address,bytes32,uint256,bool)", +"b95bb4f8": "price(uint16)", +"b95c2740": "buy(address,bytes)", +"b95cbed6": "currentExpiryInterval()", +"b95d2a53": "deedUri(uint256)", +"b95f2be8": "_releaseVouchers(address,uint256)", +"b96095fd": "GEND1()", +"b960a45f": "unpauseTrueUSD()", +"b960a6d4": "ITTMultisig()", +"b96144fd": "removeUsername()", +"b9615878": "getHeader(bytes32)", +"b961716b": "getActiveTier()", +"b961b1e0": "teamNamingIncome()", +"b96297b5": "killya()", +"b962de9a": "ProsperaToken(uint256,string,uint8,string)", +"b9632689": "numFunders()", +"b9635685": "JAJToken()", +"b963e1d0": "getPurpouse()", +"b964608d": "get_return_by_level(uint256)", +"b9649e52": "getPlayerPotWinning(uint256,uint256,uint256)", +"b96528fd": "pubAddress()", +"b9653382": "firstPeriodEndDate()", +"b965817d": "UBSCoin()", +"b9659d4a": "sibling()", +"b9668eb2": "settleUnclaimedPerTokenPayouts(address,address)", +"b966f350": "tokenMintingEnabled()", +"b96732d9": "TransferToSAToE(uint256)", +"b9676e72": "SPTToken()", +"b967a52e": "setContactInformation(string)", +"b968440a": "Finalized(uint256,uint256)", +"b968486e": "isLottoStarted()", +"b96890a1": "airdroptoken()", +"b96891e5": "getAddressesSize()", +"b9689cf3": "crowdsaleAirdropAddress()", +"b968a53c": "getBurnAddresses()", +"b969d399": "getBattleCooldown(uint64)", +"b96a39bd": "createPlayer(string,uint256,uint256)", +"b96b8edf": "changeAirdropQty(uint256)", +"b96bf2b5": "expressReloadNumSec(uint256,uint256,uint256[],uint256[])", +"b96c0866": "completeOrder(string)", +"b96c10ba": "_assign(address,address,address)", +"b96d64fb": "start_quiz_game(string,string)", +"b96dc22a": "enableLambo(uint256)", +"b96dc96d": "delCertificate(string)", +"b96e988b": "addressBilborough()", +"b96f54d1": "fixedReverse(uint256[10])", +"b96f8a39": "Voting()", +"b970e3d0": "JATICO()", +"b971667c": "calculateEmissionTokens(uint256,uint256,uint256,uint256)", +"b9717b23": "setOdd(uint256,uint256,uint256)", +"b971a1f8": "VivekTestToken()", +"b971b4e5": "setNotTransferable(bytes20)", +"b9727dc2": "getProjectClient(uint256)", +"b9727f50": "saveRevenueShareDistribution(address,uint256)", +"b972b967": "transferTokensToTeam(address,uint256,uint256)", +"b97386d1": "reputationProblems(address,bytes32)", +"b973b286": "Imteaz()", +"b974b0a3": "allData()", +"b974ddcb": "getAnimalById(uint256)", +"b9750acf": "selfDestroy()", +"b97585d3": "addOldNickname(address,string)", +"b975ce23": "crownName()", +"b975d9c7": "setCCH_edit_32(string)", +"b976b35b": "uponTransfer(address,address,uint256)", +"b976f464": "authoriseAccount(address)", +"b9774f7b": "confirmations(uint256)", +"b9776301": "testTrustedTransferFrom()", +"b9789d7d": "ChangeDeadLine(uint256,uint256,string)", +"b97a6c12": "redeemForReportingParticipant()", +"b97a7d24": "getGoal()", +"b97af2c8": "setTokenDecimals(uint256)", +"b97b451e": "increaseApprovalPreSignedCheck(address,address,uint256,uint256,uint256,uint8,bytes)", +"b97b9df8": "AUACoin()", +"b97cab2c": "convert2Peony(uint256)", +"b97ce4d3": "distributionteamFinished()", +"b97d3627": "TosToken()", +"b97df70a": "setTokenReward(address,address)", +"b97e3b43": "setMintAgent(address,address,bool)", +"b97fd9e1": "releaseWallet(address)", +"b980a312": "PtestTokenICO(uint256,uint256,address,address,address,uint256,uint256,uint256,uint256)", +"b980b10d": "masterCardEscrow()", +"b9812d9a": "getNextReportingWindow()", +"b981655f": "DebtManager()", +"b9818be1": "feeOwner()", +"b982e5c1": "testAddPending()", +"b9843c7c": "setUnavailable()", +"b9844d6f": "updateSelfDropStageState(uint256,uint256,uint256,uint256,uint256,uint256)", +"b9855c76": "restartPeriod()", +"b9858a28": "addContract(address,address)", +"b9861011": "setUniqueBlindedProposal(uint256,bytes32)", +"b986b611": "withdrawAddressUpdate(address)", +"b986bb67": "STATUS_DESTROYED()", +"b9871548": "set_token_address(address,string)", +"b9879450": "CREATOR_TOKEN()", +"b987ae02": "fundWithdrawal(uint256)", +"b987bdac": "InterCrypto()", +"b987f688": "gettotalCards()", +"b9883b3f": "main(uint16,uint8,int256)", +"b988899f": "setBenificiary(address)", +"b988c505": "newProposal(address,uint256,string,bytes,uint64)", +"b9890a74": "initBonuses(string)", +"b989915c": "lastUsdPerEthChangeDate()", +"b989c7ee": "returnInt32(int32)", +"b989ffa7": "getArtist(bytes32)", +"b98a5418": "assignedAmountToAngelInvestment()", +"b98aacf0": "retreiveHrt(string)", +"b98ac0c5": "setUserAlloc(address,uint256,uint256)", +"b98b5f9c": "listPrycto1()", +"b98bafde": "Redeemed(uint32,address)", +"b98bcf16": "getPubKeyByHash(bytes28)", +"b98c90c2": "ECOS(address)", +"b98cb57e": "rinkeby()", +"b98d49a5": "getSponsorshipCount(address)", +"b98dbb50": "updateprojectDuration(address,uint256)", +"b98de7c7": "setLive()", +"b98e2769": "sketchNoLongerForSale(uint256)", +"b98ef00d": "disclosureList(uint256)", +"b98f0992": "TokenRK50Z()", +"b98f5932": "getUserExp(address)", +"b98fa504": "AddTower(uint32,uint16,uint16,uint256,uint256,uint16,uint16)", +"b98fb437": "getethused(address)", +"b98fdc36": "IconomiToken(uint256,string,uint8,string,uint256)", +"b990033e": "setNewRegister(string,bytes32,uint256)", +"b9902eef": "Rate8()", +"b9908cbb": "maximalIndividualContribution()", +"b9910c5f": "JixoCoin(uint256,string,string)", +"b991357c": "isAdvisorsTokensThirdReleased()", +"b99152d0": "balanceOfToken(address)", +"b991bc14": "direct_refunds(address[],uint256[])", +"b991f607": "Bank(uint256,uint256)", +"b9926d1d": "limitBuy(uint256)", +"b992812e": "hasIssued(address)", +"b9931d30": "getPlayerToken(uint32)", +"b9934b9e": "ownerResumeContract()", +"b99371a0": "GetPrestigeInfo(uint256)", +"b993a53e": "preSaleBalancesOf(address)", +"b993a91f": "migrationAccountCounter()", +"b993c871": "NGToken()", +"b995b014": "_exploreUsingEmont(address,uint256,uint256,uint256)", +"b995ce4d": "returnTokenAddress(uint256)", +"b99613cb": "getPlayRecordNoTurnData(address,address)", +"b99798e8": "accFounder()", +"b9980306": "processARvRevForecast()", +"b9981a67": "firstBalanceOf(address)", +"b999279e": "VerifyProofAndUpdateState(uint256[],uint256[],uint256[],uint256[],bytes)", +"b9997819": "ownerSetHouseEdge(uint16)", +"b999abbc": "Spole()", +"b99a8a00": "exchange_coefficient()", +"b99ac856": "roundin(address)", +"b99b2f81": "myReferrals()", +"b99b951d": "claimTokensE(uint8)", +"b99bc116": "verifyTrustedSender(address[],uint256,uint256,address,uint8,bytes32,bytes32)", +"b99c2b51": "_getWinAmount(uint8,uint8,uint8,uint24,uint256,uint256,uint256,uint256,uint256)", +"b99de11e": "endThirdWeek()", +"b99dfe18": "getPackage(uint256)", +"b99ec99a": "AuditorRegistryReplaced(address,address)", +"b99eccc1": "SplitWeighted(uint256)", +"b99f1d02": "claimClusters()", +"b99f247d": "ERGCOIN()", +"b99f48d5": "promisedPop()", +"b99f6073": "tokenPurchased()", +"b9a0157e": "setArrayIndexValue(bytes32,uint256,bytes32)", +"b9a0a708": "testChargesAmountApproved()", +"b9a0c1bb": "_approveRobot(uint256,address)", +"b9a1bd86": "registerPrivateContribution(address,uint256)", +"b9a2131b": "ContractTST()", +"b9a29d42": "getKevin()", +"b9a2de3a": "endAuction(uint256)", +"b9a30afb": "HelloGoldSale(address,address,address,address)", +"b9a41409": "gcpa(uint256)", +"b9a45aac": "whitelistAddress(address,bool)", +"b9a4a755": "afterApproveAction(uint256)", +"b9a4defe": "changeTargetAddress(address)", +"b9a52203": "saveRN(uint256)", +"b9a527b4": "book(address,address,uint256,uint256)", +"b9a54062": "getMaximumWritesPerStep()", +"b9a59b83": "isEngineerContract()", +"b9a5a2d9": "numberOfApprovedSteaks()", +"b9a5e073": "contracteesSize()", +"b9a60038": "totalTransactions()", +"b9a68300": "bountyOnlineWallet()", +"b9a6e94c": "buyTile(int32,int32)", +"b9a6f7b0": "BTHB()", +"b9a804fb": "ArrowTestCoin()", +"b9a82f80": "buyPepe(uint256)", +"b9a904f9": "testUnauthorizedSetBetaPackage()", +"b9aa8236": "getMaxAgonId()", +"b9aaaeee": "populateTierTokens()", +"b9ac0524": "icoEtherReceivedTotal()", +"b9ac38aa": "test_newProposalAndVoting()", +"b9aceb63": "BuyTicketUseVault(address,uint256)", +"b9ad36b9": "prophecise(bytes32)", +"b9ad771c": "registerHWCWit(string)", +"b9ae4bda": "associatedPubkeys(uint256)", +"b9ae7364": "pauseAuction()", +"b9af809e": "getMinEthersInvestment()", +"b9afd6e1": "returnChildAddressForParent(address)", +"b9b162c3": "calculateTop5HeroesPower(address,address,uint256)", +"b9b1c90c": "moveToSafetyWallet()", +"b9b237c2": "tokenFunded()", +"b9b26bd2": "registerBroker()", +"b9b2a331": "setAccPrice(uint256)", +"b9b2a890": "rewardDaily(uint32,uint32)", +"b9b2b5cd": "totalFeeCollected()", +"b9b3ded2": "createDividend(uint256,uint256)", +"b9b42602": "ethRefunds(address)", +"b9b43faa": "createInt256s(bytes32[],int256[])", +"b9b466ab": "myLoveBlockCount()", +"b9b6990b": "getUserBetsInARazInstance(uint256,uint256)", +"b9b6c2d4": "getAmountOwed(bytes32,address)", +"b9b7238b": "addInvestorBonusInPercent(address,uint8)", +"b9b7569b": "isGameLogicContract()", +"b9b7b68c": "limitbreak_contrib()", +"b9b842e5": "setCandyLand(address)", +"b9b8af0b": "halted()", +"b9b8c246": "invest(address,uint256)", +"b9b8e25d": "getRemainingTokensToSell()", +"b9b94997": "repossessBooking(address,uint256)", +"b9ba2926": "receivedCollateral()", +"b9bac5f8": "lockedUntilTime()", +"b9bcf81f": "getTlength10()", +"b9bd4f76": "newSale(uint256,uint256,uint8,uint256)", +"b9bda244": "sumICO()", +"b9bdbbbb": "FILMToken(uint256,string,uint8,string)", +"b9beadae": "testCantBuyTokensInEndedSale()", +"b9beeb8d": "DatingCoinToken()", +"b9bf068e": "getUncompensatedContributors(uint256,uint256)", +"b9c009f0": "checkContributorBalance(address)", +"b9c0d227": "defaultTokensPerWei()", +"b9c105cf": "getTaskRewardAndStatus(bytes32)", +"b9c1a60a": "econReserveAllocation()", +"b9c2c6fb": "removeMember(bytes32)", +"b9c2ee82": "upgradeController(address)", +"b9c3395f": "getTokenAmountBonus(uint256)", +"b9c3515c": "votingActive(bytes32)", +"b9c390aa": "SaferEcRecover()", +"b9c3a818": "TEAM_SUPPLY()", +"b9c4d0a7": "fundOrder(uint256)", +"b9c53d04": "SECCoin()", +"b9c5be85": "allocatePurchase(address,uint256,uint256)", +"b9c5eb90": "updateVoucherMthRate(uint256)", +"b9c7ce49": "totalIssuingCollateral()", +"b9c81f1d": "Membership()", +"b9c8464d": "extractFees(uint256)", +"b9c8559d": "RocketPoolReserveFund(address)", +"b9c89ff7": "getTargetRepMarketCapDivisor()", +"b9c97a44": "UnlockAccount(address)", +"b9c99e5e": "DepositUnfrozen(address,uint256)", +"b9caebf4": "del(address)", +"b9cb385d": "invitedInit(address,address)", +"b9cb5b5f": "HatchEggs()", +"b9cbbb62": "testInequalityAddr()", +"b9cc8b48": "oraclizeOn()", +"b9ccaed2": "getMesas()", +"b9cce72c": "addFlag(bool[2])", +"b9ce10d5": "Fyle(string,string,uint8,uint256)", +"b9ce795f": "createVoter(string)", +"b9ceda19": "updateTokenNameAndSymbol(string,string)", +"b9cf01a1": "Cardiology()", +"b9cf9d49": "getNextOrderUser(address,address,uint256,address)", +"b9d0a638": "Bro()", +"b9d1d49b": "minimumBalance()", +"b9d1ed4a": "ethDeposits(address)", +"b9d1fd60": "fundingMaxAmount(address)", +"b9d2fa35": "disableFundingWallets(address)", +"b9d32a1f": "tokenTransferOwnership(address,address,address,address)", +"b9d3514d": "addEventToUser(address)", +"b9d36743": "priceToMint(uint256)", +"b9d414bd": "setSecurityTokensWallet(address)", +"b9d47fff": "mySubdividends()", +"b9d5205c": "SASH()", +"b9d54f6f": "setMinPurchaseLimit(uint256)", +"b9d5d7fe": "resetUserPicture(string)", +"b9d6257d": "DeletePool(string)", +"b9d677f9": "_buyProp(uint256,uint256,uint256)", +"b9d69a30": "sendTo(address,address,uint256,bytes)", +"b9d723eb": "startNewPeriod()", +"b9d7fdf4": "bonusTierSize()", +"b9d8350e": "getWeiFromUsdCents(uint256)", +"b9d92de8": "calculate(uint256)", +"b9da4033": "_randBySeed(uint256)", +"b9da706e": "LandSale(address,uint256,uint256,uint256)", +"b9da8360": "_setBattleContract(address,address)", +"b9db15b4": "getProduct(uint256)", +"b9db9a6d": "resetAllApproval()", +"b9dc25c5": "approvedUser()", +"b9dda7b8": "_ERC20Contract()", +"b9de1c41": "buyRaffleTicket(uint256)", +"b9deb729": "isTransferEnable()", +"b9dedc6a": "shareTransfer(address,address,uint256)", +"b9df2d22": "isGameRunning()", +"b9df819f": "receiveFunds(address,address,uint256)", +"b9dfaf3a": "setPriceChannelMaxSize(uint256)", +"b9e01aeb": "buySpaceshipUpgrade(uint256,uint16,uint8)", +"b9e04eea": "withdrawStuckEtherOfAmount(address,uint256)", +"b9e15a67": "coinAgeForAddress(address,address)", +"b9e16b65": "issueDescription()", +"b9e1aa03": "deposit(address,bytes32)", +"b9e205ae": "updateExchangeRate(uint256)", +"b9e290f9": "setValue(bytes32,address)", +"b9e328de": "GIDIDAX()", +"b9e3a8dd": "isCompositionOnlyWithBaseLayers()", +"b9e3e2db": "releaseDate()", +"b9e3ee01": "addNodeToWhitelist(address)", +"b9e448df": "OpenFund(bytes32,string)", +"b9e4d098": "setNewEndDate(uint256)", +"b9e58ab0": "setPropertyOwnerSalePricePrivateModeFlag(uint16,address,uint256,bool,uint8)", +"b9e5e2c4": "ratePerWeiInPreICO()", +"b9e6152b": "process(address)", +"b9e6ac68": "TabTradersToken(address,address)", +"b9e6edcf": "s15(bytes1)", +"b9e6f1d9": "get_amount()", +"b9e70ed6": "setLoanParameters(address,bytes32,uint256,uint256,uint256,uint256,uint256,uint256)", +"b9e722cd": "caddress()", +"b9e77649": "OVISBOOKED_TOKENS()", +"b9e7afd1": "__setSecretaryGeneral(address)", +"b9e7c061": "tempGetDataToCheck(uint256,uint256)", +"b9e7e2f9": "Beercoin()", +"b9e8574f": "getReservedDestinationInfo(address)", +"b9e95382": "store(uint32)", +"b9e99231": "EEM()", +"b9e9d1aa": "futureOwner()", +"b9e9e441": "exchangeTokensByAddress(uint256,address,address)", +"b9eb04f3": "hashPosition(uint32,int64,bytes16)", +"b9eb5511": "setPI_edit_5(string)", +"b9eca0c8": "gID_()", +"b9ed6df8": "withdrawEtherFromcontract(uint256)", +"b9ed93e9": "setWaitTimeBlocks(uint256)", +"b9edf911": "approveBulk(address[],uint256[])", +"b9ef7835": "infect(bytes32)", +"b9f10278": "EtherPredictx()", +"b9f14557": "unban(address)", +"b9f1fb62": "transferPrivateReservedUFT(address,uint256)", +"b9f2086b": "BlockWar()", +"b9f24e44": "freezeGame(uint256)", +"b9f256cd": "newProposalInEther(address,uint256,string,bytes)", +"b9f28076": "historyIdx(address)", +"b9f2d592": "maxAllowedReservingPercentage()", +"b9f308f2": "getEtherForTokens(uint256)", +"b9f37c86": "Registrar()", +"b9f4657d": "approve_tx(address,bytes)", +"b9f48cad": "performAction(address,bytes,uint256)", +"b9f4b5c2": "refundStart()", +"b9f615d7": "bankRollInvest()", +"b9f696d5": "setNote(uint256,bytes32,string)", +"b9f71934": "promotionsOfClaimant(address)", +"b9f7d242": "restoreAllPersistentTokens(uint256)", +"b9f89751": "withdrawAsCreator()", +"b9f96247": "SellMulti(uint256[],address)", +"b9f9d9a5": "test_insert_findNoHintAtPosition()", +"b9fa2055": "capETH()", +"b9fac520": "BIU()", +"b9fb0579": "Transfer_of_authority(address)", +"b9fb3ff8": "BOOYAHTEST()", +"b9fb7b8c": "Deposit_referral()", +"b9fbe331": "bonusTokenRateLevelOne()", +"b9fea3bb": "setBaseInfo(address)", +"b9feeb05": "GetCategoryCount(string)", +"b9ff5fcf": "getMakerBetDetails(uint256,address)", +"b9ffc576": "RevalootSwap()", +"ba001de3": "revokeBountyTokens(address,uint256)", +"ba00660f": "publicWithdraw()", +"ba00ab60": "cancelAuthorizations(address,address[])", +"ba0179b5": "confirm(uint256)", +"ba02021d": "redeemTicket(uint256,address)", +"ba029c97": "wei20()", +"ba02cf47": "MORTU()", +"ba02e9f2": "Coincirculationchain()", +"ba02f006": "_concat(string,string)", +"ba030c8c": "endRefundingingTime()", +"ba033fe1": "buyAndTransfer(uint256,address,address,bytes)", +"ba0410fb": "changeExhangeRate(uint8)", +"ba044799": "setDropable(bool)", +"ba057826": "MDXToken()", +"ba065e1f": "expired(uint256)", +"ba067f59": "setToSendLeft()", +"ba075da2": "undermineComponent(uint16,uint256)", +"ba081b8d": "PHOENIX_POOL()", +"ba086518": "delist(uint16)", +"ba087b9d": "balanceOfAtType(address,uint256,uint256)", +"ba08809d": "showTimeLock(address)", +"ba08f299": "decrementTotalIssuerCount()", +"ba09591e": "setSellFloor(uint256)", +"ba0a272b": "icoEtherReceivedPreFirstSale()", +"ba0a4ca9": "_safeGasStaticCall(address,bytes)", +"ba0a93a8": "getRankOnePlayer()", +"ba0b9788": "setTitulaire_Compte_7(uint256)", +"ba0bafb4": "currentWindow()", +"ba0bba40": "setup()", +"ba0bc2f4": "initialCardPrice()", +"ba0bf0c4": "weiMaxInvestment()", +"ba0bface": "managementBodyAddress()", +"ba0c1777": "ecoLock13()", +"ba0c9b54": "mcs()", +"ba0cf581": "findDispute(address)", +"ba0d291b": "CashMateToken()", +"ba0d46f3": "BoraToken(uint256)", +"ba0d94a8": "Bcigarcoin()", +"ba0df427": "sumOf(uint256[])", +"ba0e0f5e": "removeTrustedAccount(address)", +"ba0e6cc9": "removeVerified(address,address)", +"ba0e930a": "transferManager(address)", +"ba0f5b20": "getDarknodeBond(address)", +"ba0fbf0d": "_saleTokens()", +"ba102763": "etherToSendSecurityPool()", +"ba1066ed": "pendingAmount()", +"ba10db46": "transferEthHandleOwnership(bytes32,address)", +"ba112d50": "setDataEquip(address)", +"ba1162d7": "getFmLength()", +"ba119e5a": "SEBCToken()", +"ba11ecde": "preSaleOpen()", +"ba124401": "FrozenGuard()", +"ba13a572": "lottery()", +"ba14d606": "test(address,uint256)", +"ba151ad9": "USD_PER_TOKEN()", +"ba157d46": "setWebGiftEtherAmount(uint256)", +"ba15e52e": "getInfo(bytes20)", +"ba15fcaa": "Tremendoustoken()", +"ba16ae2d": "WBET()", +"ba16d600": "minReward()", +"ba16e00e": "bonusEnd05()", +"ba17e592": "performWrite1()", +"ba1803c1": "setCryptoJinglesContract(address)", +"ba181ac6": "setWhitelist(address,address)", +"ba1a2243": "setTokenPaymentCustomer()", +"ba1ad438": "newFee(uint256)", +"ba1af80f": "phase4Price()", +"ba1b44da": "getBoardRating(address,uint256)", +"ba1b6221": "calcUnMaskedGuEarnings(uint256,uint256)", +"ba1c0201": "evRefund(address,uint256,address,uint256,bool)", +"ba1c3b92": "setSalePeriod(uint256,uint256)", +"ba1ccbee": "getSupportedRolesCount()", +"ba1cd983": "unitCreationFee()", +"ba1d8d4f": "createAutoridadElectoral(bytes32,bytes32)", +"ba1f879f": "privateSale()", +"ba1fd9f4": "widraw(uint256,address,bytes32)", +"ba209dab": "rejectCertification(uint256)", +"ba20dda4": "getBeneficiary(bytes32)", +"ba21d62a": "Command(address,bytes)", +"ba2318ca": "totalSaleSupplyCap()", +"ba236abe": "getMyWinAmount(address)", +"ba255cd1": "liquidAllocatable()", +"ba25a585": "EventUpgradeTank(address,uint256,uint8)", +"ba25d944": "longDescription()", +"ba278e08": "setStartTime(uint256,uint256)", +"ba285f5d": "minimalPaymentInWei()", +"ba286ee3": "testRegisterCustomer()", +"ba2902fb": "rehancoin()", +"ba2a730b": "getAddressLastUpdate(address,address)", +"ba2a98f2": "closeZoneShop(bytes2)", +"ba2ab079": "changeEndPrivateSale(uint256)", +"ba2aee26": "addGains(address,uint256)", +"ba2d5c88": "MINBET_perTX()", +"ba2e84f9": "publicsalesCap()", +"ba2eb541": "isExpired(address)", +"ba2ee51f": "ICO_TOKENS_AMOUNT()", +"ba2ee65c": "manage()", +"ba2eebb4": "transferControl(bool)", +"ba2fa957": "markettingPercentage()", +"ba3019de": "fwdPaymentAndData(address,bytes)", +"ba3025d4": "epicenter_works_addr()", +"ba32348f": "reffUp(address)", +"ba32694c": "howCoin()", +"ba331eab": "tokenSetTransferFeeAbs(address,address,uint256)", +"ba33a876": "VBToken()", +"ba34251b": "usdToEthPrice()", +"ba344304": "Lydian()", +"ba344743": "_rawTransfer(address,address,uint256)", +"ba346d11": "ArenaPool()", +"ba34c8f1": "setrate(uint256)", +"ba353925": "paymentDisable()", +"ba35749c": "deleteOffer(bytes32,address)", +"ba35b1d3": "TxMessage(uint256,uint8,uint256)", +"ba35c0be": "changeSelectFight2DeathContract(address)", +"ba35f38d": "eip20TransferFrom(address,address,address,uint256)", +"ba3603fd": "usdPerMEth()", +"ba36f423": "att()", +"ba3717c0": "setStrF1F2(string,string)", +"ba376923": "Cez()", +"ba377731": "getSupplyBalance(address,address)", +"ba37caa4": "exchangeStaStb(uint256,uint256)", +"ba386f0b": "propertyIdToAuction(uint256)", +"ba38743b": "GrabUnallocatedValue()", +"ba38c599": "announced()", +"ba391bb2": "perTokenPrice()", +"ba399ad2": "isInLockStage()", +"ba3b60ed": "rawVotes()", +"ba3c0067": "getTopPlayers(uint256)", +"ba3d0cb5": "retentionMin()", +"ba3dc67c": "startingPoint()", +"ba3eb50f": "TokenEther()", +"ba3eb61d": "InterfaceData(address)", +"ba3eefc5": "makeInvestment(uint256)", +"ba3f41da": "beginCodeUpdate()", +"ba3f56f8": "startFinalStage2()", +"ba3f5a12": "tokenMultiplier()", +"ba3f8f2c": "getTokenPriceUSDWEI(uint256)", +"ba3f8f31": "ReleasingScheduleLinearContract(uint256,uint256,uint256)", +"ba3fc155": "ownerWithdrawal(uint256,address)", +"ba3fd8f7": "currChampion()", +"ba3fdb8f": "_createArt(uint256,address)", +"ba40aaa1": "setGiveAway(uint256)", +"ba414fa6": "failed()", +"ba41dc5b": "setwalletOne(address)", +"ba425379": "Ico_rejected(string)", +"ba429f33": "getRewardsContractHash(address)", +"ba42c8e5": "resolveSupervisorVote(uint256)", +"ba42fdb9": "handleLastProposal()", +"ba437b5d": "KOKC()", +"ba441560": "SetRedeemRate(uint256)", +"ba4442ab": "ReassingTokens(uint256,uint256)", +"ba44593c": "set(bytes32,address)", +"ba44bc0b": "UserMinMaxCrowdsale(uint256,uint256)", +"ba44f6a4": "RETHEN1()", +"ba452930": "stopPrivatePlacement()", +"ba454d60": "changeMaxEntries(uint256)", +"ba457dd1": "BreezeCoin()", +"ba45b0b8": "transfer(address,address)", +"ba4611d9": "getClaimCount()", +"ba463acd": "createPackage(uint256,uint256,uint256,string,uint256)", +"ba4670da": "onlyOwnerSetAdvWallet(address)", +"ba46adeb": "exerciseLong(address[2],uint256[7],uint8,bytes32[2])", +"ba470738": "changeRejectSetting(uint256,bool)", +"ba47c5f8": "inpreSalePeriod()", +"ba4823e1": "SoundcoinsToken(address)", +"ba485844": "func_0C0E()", +"ba487e62": "newCampaign(uint32,uint96,uint16,uint16)", +"ba48e057": "setBatchTransferLimit(uint256)", +"ba490a03": "SpudToRotator(uint256,address)", +"ba49e21f": "getAttoTokensAmountPerWei(uint256)", +"ba4a579d": "canBetOnRound(uint256)", +"ba4bcd72": "currentAdmin()", +"ba4c206e": "removeCertificationDocumentInternal(address,bytes32)", +"ba4c825e": "_transfer(address,address,uint256,bool)", +"ba4d0c99": "conversion(uint256)", +"ba4d573f": "addSelctFight2Death(uint256,uint256,uint256)", +"ba4e1c38": "airdropTotalQty()", +"ba4feabd": "createEscuela(uint256,address)", +"ba50f965": "add_creature(uint256,address)", +"ba5129b9": "ethRateChanger()", +"ba515481": "maturity_refund(address[],address,uint256[])", +"ba51a6df": "changeRequirement(uint256)", +"ba51b1b4": "setTokenSymbol(string)", +"ba5233b2": "setPartnerQuota(address,uint256)", +"ba52688d": "approveCycle(bool)", +"ba53d9f3": "getSpartansOnTheBattlefield(address)", +"ba554374": "updateTranchRate(uint256,uint256)", +"ba5595d3": "numTokensAuctioned()", +"ba5673c3": "getChildrenLength(bytes32)", +"ba56763e": "getBidInfo(uint64)", +"ba56f6ee": "god()", +"ba57225d": "LogCrowdsaleEnd(bool)", +"ba575a39": "KOREKCHAIN()", +"ba59a75e": "bn128_map_to_G1(bytes32)", +"ba59f784": "ChessLotto()", +"ba5a2d33": "exitPool(address)", +"ba5abaf8": "startFightB(uint256,uint256,bytes4)", +"ba5b0e95": "CPCEIcoDeposit()", +"ba5bea09": "addPendingPayment(address,uint256)", +"ba5c3a9d": "distributionList(uint256)", +"ba5c5d93": "address_book()", +"ba5c9bd6": "processReinvest(address,uint256,uint256,uint256)", +"ba5cb281": "uint32At(bytes,uint256)", +"ba5cb999": "RealTotalSupply()", +"ba5e286b": "getShipProductCount()", +"ba5eceb6": "borrowerBalance(address)", +"ba5f3e46": "getPlayerBetData(address)", +"ba61021f": "calcBonus()", +"ba612493": "getCurrentPassportLogicVersion()", +"ba61810c": "startNextPhase()", +"ba61a960": "Launched()", +"ba61ee09": "myRefBonus()", +"ba622884": "isManufacturerAddress()", +"ba622ddc": "getPlayerAnimals(address)", +"ba625fe6": "WineCoin()", +"ba629113": "contract12function2()", +"ba6361fb": "payme()", +"ba639d5a": "supplyRound1()", +"ba63abd6": "getPInvestedSumByRound(uint256,address)", +"ba63defb": "etherToSendJackpot()", +"ba63e25a": "canBeWhitelisted(uint256,bytes32)", +"ba6489e5": "getAccountReferrer(address)", +"ba65fa25": "getMerchantPublicKeyByAdmin(address)", +"ba66d7a6": "MDKICO(uint256,uint256,uint256,address,address)", +"ba6763ce": "withdrawBalanceFromStorageContract()", +"ba68693f": "PinZhiCoin()", +"ba693c86": "addsmartContractAdress(address)", +"ba69fcaa": "deleteStringValue(bytes32)", +"ba6a7e27": "AOABANK()", +"ba6afc50": "getIncentivesPool()", +"ba6b285a": "neuroChainAddresses(address)", +"ba6b5f96": "getChild(address,uint256,address,uint256)", +"ba6bbe55": "getPublicSaleTokensAvailable()", +"ba6c6490": "unlockTeamTokensTime()", +"ba6ca603": "ALDToken(uint256,string,uint8,string)", +"ba6cc6c3": "open(bytes32,address,uint32)", +"ba6dc506": "throwSlammerEvent(bytes32,address,address,uint256[10])", +"ba6f30e4": "sellCenturion(uint256,uint256)", +"ba6f4ab0": "burnCarbonDollar(address,uint256)", +"ba6ff8ad": "RTokenBase(uint256,string,string,uint8)", +"ba70d049": "DonateAdded(address,address,uint256)", +"ba70d54a": "ACTIVE_STATUS()", +"ba71c7f5": "setPricesManually(string)", +"ba723f99": "stopBid()", +"ba723fe2": "getRequestHash(bytes,bytes,uint256)", +"ba72cc36": "teamLock()", +"ba730e53": "getSellPrice(uint256)", +"ba7314ae": "AncestorHellNotes()", +"ba7325be": "indexOf(string,string,uint256)", +"ba736a99": "fetchOrderByIdWithWithPayer(string,address)", +"ba73737d": "AndiosCoin(uint256,string,uint8,string)", +"ba7435d9": "knightEquity()", +"ba75bbd8": "front()", +"ba75d0de": "minimumHydroStakeDelegatedUser()", +"ba76000e": "Add_Patient(uint256,uint256,string,string,string)", +"ba7607bf": "LogBidAccepted(bytes32,address,bytes32,address,bytes32,uint256)", +"ba76938b": "freezeDeposit(uint256)", +"ba76bfb7": "checkWithdrawalAvailable(address)", +"ba76e19b": "EthereumPrivateToken()", +"ba770154": "getUserPictureByUsername(string)", +"ba7705aa": "setIPFS(address,string,string)", +"ba773a70": "icoPrice_()", +"ba77ddc9": "PresaleFinalized(uint256)", +"ba780759": "EtherSportCrowdsale(uint256,uint256,address,address,address)", +"ba78a98a": "timelockEndTime()", +"ba78c773": "declineBid(string,uint64)", +"ba7a8149": "lockEtherPay()", +"ba7b37d4": "updateBalance(uint256)", +"ba7b86b9": "KhuuKoin()", +"ba7badeb": "nextVersion(address,bytes32)", +"ba7bd2aa": "withdrawTokens(uint256,uint256)", +"ba7bde55": "totalSupplyShares()", +"ba7bf7ff": "addcoinfee()", +"ba7c4af8": "revokeMyId(bytes32)", +"ba7cc631": "createKingdom(string,string,uint256,address,bool)", +"ba7ce849": "drawPool(uint256)", +"ba7d0b3c": "ETE()", +"ba7d619c": "returnTokensFromHoldAdditionalAddress(uint256)", +"ba7da724": "devVUPDestination()", +"ba7dc45f": "_removeOperation(bytes32)", +"ba7e424d": "isIcoEnded()", +"ba7e7cab": "getApprovalCount(uint256)", +"ba7ed2ff": "setMinInvestment(uint256)", +"ba7efcdd": "investmentLimit()", +"ba7fb1df": "getAddressToken()", +"ba8029bb": "setStartSale(uint256)", +"ba809390": "AccountReaderAdded(address,address)", +"ba80d787": "contributor()", +"ba80e058": "landingDiscount_ppc()", +"ba8118b1": "goNextRound()", +"ba81522f": "maxBlockDrift()", +"ba816496": "last50plusblocknr()", +"ba818f8d": "affiliateFee()", +"ba827243": "YangMaoZhuangYuan(uint256,string,uint8,string)", +"ba82bde2": "bindusertop(address,address)", +"ba82c897": "updateRewardToken(address,uint256)", +"ba82f55d": "ethsoccer48()", +"ba838b01": "EdCoinToken()", +"ba83c970": "closeSell()", +"ba83d63d": "getBidFreelancer(uint256)", +"ba847552": "isAddrCanCallServer(string,address)", +"ba84cb3f": "MobileApp()", +"ba85571c": "getPlayerInfoByAddress(address,uint256)", +"ba8661a2": "TimestampScheduler(address)", +"ba873f60": "setAssociation(address,bytes32,bytes32)", +"ba8747b3": "addReport(uint256,string,string)", +"ba874999": "getGameEngineAddress()", +"ba87ebfa": "IMDEXsetOwner(address)", +"ba87fdd4": "getSenderCities(address)", +"ba885446": "tokensPerAllocation()", +"ba88d537": "_getSenderStatus(uint256)", +"ba8a141f": "EnterCoin()", +"ba8a86c2": "whiteListedAddressPresale(address)", +"ba8ad39e": "grantToAllowBlocking(address,bool)", +"ba8af655": "returnAmountPledged(uint256,address)", +"ba8b7152": "BlockOfLifeToken()", +"ba8b9712": "adminRefundTokens(address,uint256)", +"ba8bb22a": "LIRAX(uint256)", +"ba8c0c9d": "getPropertyLastUpdater(uint16)", +"ba8c6980": "hasGrantAccess(address)", +"ba8cded7": "Bet(uint256)", +"ba8d045a": "tobuy(uint256,address,uint256)", +"ba8ef244": "getEvaluation(uint64)", +"ba8fb567": "startPhase2(uint256)", +"ba904eed": "removeRegistrar(address)", +"ba9072ea": "crownedTime()", +"ba907b7e": "testFailCreateWithParentsSameItemId()", +"ba90d553": "getContractsByType(uint256)", +"ba90f022": "modifyRecord(uint256,string,string,string,bytes32,int64)", +"ba9130a6": "execCustom(address,bytes,uint256,uint256)", +"ba91d87b": "mintForWorker(address,uint256)", +"ba922e04": "Karma(uint256)", +"ba92d382": "factory_address()", +"ba9316b7": "getExp(uint256,uint256)", +"ba9334a0": "testCombinators()", +"ba9398e9": "publicSaleEtherRaised()", +"ba93d5e5": "setBankrollAddress(address)", +"ba93d980": "swapOpen()", +"ba941154": "newTapProposalFromCompany(uint256)", +"ba944118": "TMXGlobalToken(uint256,uint256,string,string,uint8)", +"ba953bc8": "KanadeCoin()", +"ba95b235": "sayNo()", +"ba95d63a": "leftSharePriceRateOfIncrease()", +"ba95df98": "releaseUserPrivateBonusTokens(address,uint256,address)", +"ba967a84": "addInit(address,address,address,address,uint256,string)", +"ba976ae5": "marketToken2018()", +"ba982c41": "tokensUnsold()", +"ba996aca": "getPlayerLevel(uint256)", +"ba99d1a6": "RATE_DAY_0()", +"ba9a061a": "START()", +"ba9a4d6e": "hasAddressVotedInBallot(uint32,address)", +"ba9a8b37": "convertibleTokenCount()", +"ba9a91a5": "SALT()", +"ba9a9e03": "StorageEnabled()", +"ba9ac37f": "mul(uint16,uint16)", +"ba9bb827": "CONTRIBUTION_MIN()", +"ba9bf757": "getPlatformBalance()", +"ba9c4637": "getMyPoints()", +"ba9d0638": "receivedCount()", +"ba9d407a": "GetAddressByName(bytes32)", +"ba9d4c09": "devuelveAppaddr(bytes32)", +"ba9e0907": "XJF()", +"ba9e9a86": "binarySearchForChallenge(uint256,uint256,bytes,uint256,bytes32[])", +"ba9ea413": "purchaseCostFiat(uint256)", +"baa0181d": "batchCancelOrders(address[5][],uint256[6][],uint256[])", +"baa0b806": "content(uint256)", +"baa23ac1": "SpecialDrawingRight()", +"baa24fce": "rightVotes()", +"baa28752": "listCenturion(uint256)", +"baa290d9": "DANSToken(address,address,uint256,uint256,uint256,address,uint256,address,uint256,address,uint256)", +"baa2e587": "confirmReception()", +"baa2edaf": "tokensDataProviders()", +"baa2ff01": "get_blockhash(uint256)", +"baa30f7b": "jackpotCount()", +"baa32a94": "NiuYanToken(uint256,string,uint8,string)", +"baa371d0": "DigiPulse()", +"baa3f7ee": "claimedOf(address)", +"baa3fc48": "calculate_proportional_reward(uint256,uint256,uint256)", +"baa40cd4": "mintForPrivateFiat(address,uint256)", +"baa40e5c": "getVote(string)", +"baa416b6": "CorsariumCore(address[],uint256[])", +"baa46bdd": "_createDistrict(uint256,uint256,uint256,uint256)", +"baa47694": "submitBlock(bytes32)", +"baa5eb5c": "isDspRegistered(address)", +"baa61df0": "tokenContractClaimTokens(address)", +"baa6ab81": "priceByPeriod()", +"baa70a8b": "LBCoinJ(string,string,uint256)", +"baa79dd3": "ethOdinRate2()", +"baa7d1f3": "MULTISIG_ETH()", +"baa83568": "requestColuLocalNetworkOwnershipTransfer(address)", +"baa8529c": "give(bytes32,address)", +"baa90366": "isThereACoinAtCoordinates(uint16,uint16)", +"baa92a05": "returnsenderbalance()", +"baa93b56": "crownIfFreeze(address)", +"baa9a8a9": "EtherbotsCore()", +"baa9da15": "soldTotal()", +"baa9e531": "totalTokensBought()", +"baaa3eef": "setDistValues(string,string,string,string,string)", +"baaa8b9a": "actualGotTokens(address)", +"baaac593": "LogWaterTree(uint256,address,uint256)", +"baab7a3a": "isSuccessDoneState()", +"baab89d5": "getLockedStructAmount(address,address,uint256)", +"baac2178": "MNLTToken()", +"baac274d": "getCustomerBalance(address)", +"baac4316": "sendTokensToMe(address,uint256)", +"baac5300": "createTokenProxy(address)", +"baad0828": "changeControllerInBntyTokenContract(address)", +"baad1532": "getMatchServer(uint256)", +"baad6c2e": "setInfoTier(string)", +"baadbca0": "newTickerQuery(string,bytes32)", +"baae172c": "setRefreshLockBalance(address)", +"baaee21f": "getLastN(bytes1,uint8)", +"baaeecb0": "getAllApproval()", +"baaefe5b": "priceInc()", +"baaf2d4f": "transferOtherERC20Token(address,uint256)", +"baaf4eef": "RESERVES_HOLDER()", +"bab1d921": "closeCurrentStage()", +"bab25514": "GRUToken()", +"bab2b5e9": "percent3()", +"bab2f2b5": "containsOnlyAlphaNumerics(string)", +"bab2f552": "currentCycle()", +"bab41142": "takerApproves(uint256)", +"bab41293": "getDataColla_001_002(string)", +"bab42b54": "test_campaignRules()", +"bab4e3b1": "getOwnedToken(address,uint256)", +"bab54f69": "_isExcluded(uint256)", +"bab5714c": "sendTeamSupplyToken(address,uint256)", +"bab58ec9": "periodITO_tokenPriceUSD()", +"bab5b64e": "spenderAddress()", +"bab5e2af": "LogBTHFoundationWalletChanged(address)", +"bab6d101": "checkClaimTokenByIndex(uint256)", +"bab6f9bf": "generateRevokeStakeForDelegationSchemaHash(uint256,uint256)", +"bab7b237": "totalRelease()", +"bab86ea8": "test(string,string)", +"bab8bd04": "clearAllRequests()", +"bab8fe40": "claimableTokens()", +"bab92a29": "get_owner_planets(uint256)", +"bab94366": "AppUpdated(address,string,address,uint256,bool)", +"bab95dba": "_getFeeAndNetAmount(uint256)", +"bab99890": "CPollo()", +"bab9c00c": "SmartSignature()", +"bab9fc63": "testFailCreateWithParentParentNotInUse()", +"baba4811": "recieveFunds()", +"babb019d": "enact_liquidation_less(address,uint256,uint256)", +"babb3e0b": "updateEthRate(string,string)", +"babbb78d": "teamTokenWallet()", +"babcc04c": "getLogsNum()", +"babcc539": "isAllowed(address)", +"babd222f": "addressToLarePurchased(address)", +"babd7012": "activeSupply()", +"babddb4c": "FundReturn(address,uint256,bool)", +"babe9394": "EasyMineToken(address,address,address,address)", +"babf2b2d": "EscrowMyEtherEntityDB()", +"babf5e37": "changeFree(uint256)", +"bac02609": "buyEarlyWhitelist(address)", +"bac03cd7": "totalContractBalance()", +"bac0b029": "BifreeToken()", +"bac0b276": "allocate(address,uint256,uint8)", +"bac127b9": "SecondAddressBalance()", +"bac15203": "unPauseContract()", +"bac18f9a": "handToBitmap(uint32)", +"bac1e2e0": "testBitsAndSuccess()", +"bac1e9f6": "getChannelSize(address,uint256)", +"bac21a22": "totalSupplyLimit()", +"bac37239": "addMarketMakerAddress(address,address)", +"bac506e0": "rf()", +"bac55edd": "setDnsDomains(string,string,string)", +"bac6068c": "inject(address,uint128)", +"bac6241f": "LookRevToken(address,uint256)", +"bac74b4f": "ISLABCoin()", +"bac756e1": "PresaleToken(uint256,uint256)", +"bac79651": "setTokens(address,uint256)", +"bac7bb9f": "checkaddress()", +"bac7c252": "BTC10kon54()", +"bac97647": "uncleSafeNr()", +"bac9dbab": "ROLE_COO()", +"bacbe2da": "cancelVote(uint256)", +"bacc2753": "vestTo(address,uint256)", +"bacc2c42": "participate(uint256,uint256,uint256,uint256,uint256,uint256)", +"bacc58d7": "backManusOwner()", +"baccc92b": "RegulatorIfc(address)", +"bacd2a90": "mallocBudget(address,uint256)", +"bacd2e97": "executedCount()", +"bacd70b7": "callSomeFunctionViaInner3()", +"bacd8d88": "soldPercent()", +"bace4cf6": "Distribution(uint16,uint256,address)", +"bacef685": "createTokens(uint32,address)", +"bacf3f65": "secondPeriodOfICO()", +"bacf5f84": "_addBaseStats(uint256,uint8[8])", +"bacfddbc": "isDepositAddress(address)", +"bad09457": "test3(address[5],uint256[5],uint8,bytes32,bytes32)", +"bad16031": "isBlackjack()", +"bad19ead": "copyToAllUnits(uint256,uint256,uint256,uint256,uint256)", +"bad1f08f": "open(uint256,uint32,uint256)", +"bad21d65": "startInstantInterface(address,address,uint256,uint256,uint256,address,uint256,address,uint256)", +"bad2d6d2": "removeBlacklist(address,address)", +"bad4d623": "setAltDeposit(uint256)", +"bad568b1": "allowanceBcoupons(address,address)", +"bad69502": "getProviderRateHistory(uint256,uint256)", +"bad6b379": "changeCUSEaddress(address)", +"bad751bc": "createPeerReviewContract(address,bytes)", +"bad7726c": "checkDividendPaymentAvailable()", +"bad7d46a": "CreateOffer(uint8)", +"bad84416": "eligibleVotes(address)", +"bad845e6": "deleteProductInternal(bytes32)", +"bad84c9e": "getNumTicks()", +"bad9643b": "balance_wirthdraw()", +"badaba27": "packTable(uint256)", +"badae9b4": "addArgumentToRequestUint(int256,uint256,bytes32,uint256)", +"badb2e5a": "UpgradeRigETH(uint8,uint256)", +"badb97ff": "adminBurn(uint256)", +"badbaa3c": "setCallData()", +"badbbf34": "RBACWithAdmin()", +"badc9a52": "adminChanged(address,address)", +"badca131": "kill_and_withdraw(address)", +"badcf391": "sendMail(bytes16,bool)", +"badcfbcf": "withdrawSnowflakeBalance(address,uint256)", +"baddee6f": "listMultipleItems(uint256[],uint256,address)", +"bade1c54": "proposeReparameterization(string,uint256)", +"bade1ef9": "Birth(address,uint256,uint256,uint256)", +"bade6033": "propose(bytes,uint256)", +"bade777c": "Marked(address,address,address,address,uint256,uint256,bytes32)", +"badec5b4": "HK168coin()", +"badf3de9": "durationForBetAmount(uint256)", +"badf8b37": "TwoFactorAuth(string,string)", +"badfa573": "setAllowTransferTimestamp(uint256)", +"badfedf2": "genEthsRec(uint256,uint256)", +"bae07416": "canBeValidated(uint256)", +"bae0c536": "addSaleAgent(address)", +"bae118f4": "setHouseInfo(bytes32,uint256,string,bytes32)", +"bae18880": "getReceipt(address,uint256)", +"bae18ac3": "setUpgradeFee(uint256)", +"bae1c1ac": "doSendWithSignature(address,uint256,uint256,bytes,uint256,bytes,bool)", +"bae1cc74": "multiSubWithdraw(address[])", +"bae2718f": "WithNoArgumentConstructor()", +"bae2b6ab": "setLedgers(uint256)", +"bae2ddb5": "XBHX()", +"bae37857": "getEndTimeOfSession(uint256,uint256[],uint256)", +"bae3791e": "weisHardCap()", +"bae3c066": "sendInternally(uint256,uint256)", +"bae3c27f": "weiLimit()", +"bae4f466": "roundKeys()", +"bae5e693": "partnersAllocation()", +"bae5f9dd": "takerAffiliateFee()", +"bae61714": "setICOWeek3Bonus(uint256)", +"bae667bc": "tokenOf(bytes32)", +"bae6c2ad": "queueSize()", +"bae6d62b": "manualOverride()", +"bae70892": "setMyPubKey(bytes32,bytes32,bytes32,bytes32,bytes32)", +"bae72565": "readAddress(address,uint256)", +"bae728b1": "setUnholdDate(uint256)", +"bae78d7b": "getEntry(uint256)", +"bae804a7": "transferFromSender(address,uint256)", +"bae8d888": "createArtefact(uint256)", +"bae944ba": "globalUnlockTime()", +"bae971e4": "getWithdrawEtherAmountValue()", +"bae99efc": "ICO_MAX_CAP()", +"baea0431": "getMsgDataAfter()", +"baea3a21": "addToWhitelistInternal(address)", +"baeb0718": "checkin()", +"baeb8cad": "deleteGroup(address,address)", +"baeb91ae": "invest(uint128)", +"baebcaf0": "getApp(address,uint256)", +"baec1ced": "depositPresaleWithBonus(address,uint256,uint256)", +"baec25ee": "ZYHToken()", +"baecd693": "sendTokensAfterBuy(address,uint256,uint256)", +"baed8bb1": "getAddressValues(bytes32)", +"baee193d": "changeCountryLimit(uint256,uint256)", +"baeeddfc": "Ublasti(uint256,string,string)", +"baef73e9": "expiryOf(uint256)", +"baf00f76": "removeAllSubUsers()", +"baf03586": "calculateBaseGet(uint256,uint256,bool,uint256)", +"baf05a87": "hodl_interval()", +"baf11cab": "isCommitted(uint256,address)", +"baf1256f": "withdrawToPlayer(address)", +"baf30051": "token_issued()", +"baf38352": "buy_for(address)", +"baf3a4d4": "distDivRate()", +"baf3d262": "Tickets_Sold(string,uint256)", +"baf3ef13": "disableNode()", +"baf44453": "FundAccount(address,address,address)", +"baf4960d": "createPlanet(uint256,address,uint256,uint256,uint256,uint256,uint256)", +"baf4ec53": "sumICOStage3()", +"baf4f6d1": "_endContestIfNeededStalemate()", +"baf539ee": "changeGasLimit(uint256)", +"baf5fbff": "PreIcobonusEnds()", +"baf652fe": "bonusThresholdWei()", +"baf6f9ca": "saleis(bool)", +"baf6fd32": "setintertoken(address)", +"baf73c0f": "holdingsOf_BULL(address)", +"baf79eb4": "removeDealInternal(bytes16)", +"baf8809b": "releaseTimeLock(address)", +"baf8c622": "_SUTokenContract()", +"baf9b369": "post(bytes)", +"baf9c5a2": "initialSupplyPrivateSale()", +"baf9d07b": "addAuthorization(address,address)", +"baf9d0cf": "getRoundAwardTicketNum(uint256)", +"bafa090d": "breakup(address,uint256)", +"bafa9c9d": "FighterUpdated(uint256)", +"bafb8e83": "marketSupply()", +"bafc1437": "getPurchased(uint256)", +"bafc7fe9": "zero_fee_transaction(address,address,uint256,uint256)", +"bafcea6f": "dataSourceGetYellowCards()", +"bafd244f": "setAmbassadorAddress(address)", +"bafdaf5e": "_getTargetBlock(uint256)", +"bafdebf3": "getServerAddress(string)", +"bafe648d": "BerithCoin(uint256)", +"bafedcaa": "lastRewardAmount()", +"baff4609": "lockTokenForNode(uint256,uint256,uint256)", +"baffa903": "getStartPrice()", +"baffed2a": "disallowWrite(uint256,address)", +"bb004abc": "reserveManager()", +"bb005d4f": "setPlayerResearch(address,uint256)", +"bb007db9": "getSalaryTokenCount(address,address)", +"bb00c8f9": "ownerMintAmount()", +"bb00faca": "bonus02()", +"bb00fc55": "bookEarnings()", +"bb013206": "addNewCertificate(uint256,bytes32,bytes32)", +"bb0165b1": "setContractAddress(uint256,address)", +"bb01aa39": "unreserve(uint32)", +"bb01fb1f": "Issue(uint64,address,uint256)", +"bb043d53": "MinimalPayValue()", +"bb053484": "getInitializeFeePerEthInAttoethValue()", +"bb056781": "purchaseGas(address,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"bb057c5e": "proposedImplementation()", +"bb05ca52": "JadeCoin()", +"bb061fb5": "addWhite(uint256,uint256,uint256,bool)", +"bb07576d": "voteToUpdatePrenup()", +"bb083c2b": "substractFee(uint256,uint256)", +"bb08b247": "showAuction(string)", +"bb08c6c3": "o_desafiante(bytes14)", +"bb0936f7": "first_bonus_amount()", +"bb09adbb": "privGoal()", +"bb0a420a": "user(address,address)", +"bb0a64b6": "batchTransfer(address[],uint256[],address)", +"bb0bcbff": "AddPoolMember(address,string)", +"bb0bef19": "validateFile(address,uint256,bytes,bool,bool)", +"bb0c08b6": "getDebitNonce(bytes32)", +"bb0c8298": "minimumAmount()", +"bb0c8893": "claimUnrelatedTokens(address,address)", +"bb0ce7d3": "TotalHoldersAmount()", +"bb0d6fb6": "noCount(uint256)", +"bb0d7f9a": "listTCC()", +"bb0db551": "add_32(uint32,uint32)", +"bb0e01fd": "isError(uint8)", +"bb102aea": "totalSupplyCap()", +"bb10b2f1": "PRE_SALE_BONUS_PER_CENT()", +"bb119f6e": "productInfo(uint256)", +"bb11ed7e": "rescueTokensInMultiplePolls(uint256[])", +"bb128575": "StopSell()", +"bb13245f": "decimalsMultiplier()", +"bb133331": "trusteeContract()", +"bb1488d8": "_newAuction(uint256,uint256,uint256,uint256)", +"bb1583fc": "isBatched()", +"bb158dd5": "addToTokenLocked(address[])", +"bb15ac8e": "readBool(bytes32)", +"bb1630f2": "getAllSigs()", +"bb169da5": "Diploma_landing_page()", +"bb1757cf": "claim(address,bytes)", +"bb17a938": "toRlp(uint256)", +"bb17c8cc": "round2StartTime()", +"bb17e050": "Nullify(address,address,address,address)", +"bb18705c": "_buildSettleId(bytes,bytes)", +"bb1953fe": "updateSeed()", +"bb1a473b": "VOLUME_25()", +"bb1a5aad": "flipFinalizedSwitchTo(bool)", +"bb1ad687": "gateKey()", +"bb1adf9b": "DURATION_BEFORE_RESTORE_UNSOLD()", +"bb1af82b": "Test3()", +"bb1b21ed": "RefCommission(uint256,uint256)", +"bb1b99ce": "isCurrentUserAdministrator()", +"bb1c9351": "redeemNativeToken(bytes32,address)", +"bb1cc065": "buy_lovelock_withLOV(bytes32,string,string,string,uint256)", +"bb1d1cf9": "tier_rate_3()", +"bb1d45fc": "setOtherManager(address,uint8)", +"bb1d7ffa": "weddingdate()", +"bb1dfeca": "buildId3(address,uint256)", +"bb1e54bc": "TokenCrowdsale(address)", +"bb1eeb59": "totalWeiAmountSale2()", +"bb1f602e": "FailingDeployment()", +"bb205c84": "getDownVoteCount(bytes12,bytes12)", +"bb210372": "getPresale(uint256)", +"bb221cc8": "Hadescoin(address)", +"bb221e4b": "FuelToken()", +"bb22d75c": "PROMOTION_PROGRAM()", +"bb23e3a9": "arr(uint256,uint256,uint256)", +"bb23ef74": "setOwnerTestValue(uint8)", +"bb2408e6": "PERCENT_DELIMITER()", +"bb245283": "getHatchDurationMultiByGeneration()", +"bb24f0dc": "operationsLength()", +"bb2559ca": "initialTokenBalanceFetched()", +"bb256f68": "VaultCountPerProcess()", +"bb25b143": "DrawReadyToPayout(uint32,uint8,uint8,uint8,uint8,bytes32)", +"bb25bd15": "addWin(address,uint256)", +"bb25fd7f": "SODIUMTOKEN()", +"bb262080": "JaroSleep(address,uint256)", +"bb26d9d1": "requestCosign(address,uint256,bytes,bytes)", +"bb27e19e": "getlen(bytes32,bytes32)", +"bb280cba": "addBackers(address,uint256,uint256)", +"bb287679": "mainFabricAddress()", +"bb28c3f2": "setNonce(string,uint256)", +"bb29998e": "test(address)", +"bb2a51d1": "setSecurityGuard(address)", +"bb2a7d0c": "addVestingSchedule(address,uint256[],uint256[])", +"bb2aebe3": "createAssetPack(bytes32,string,uint256[],bytes32[],uint256)", +"bb2bded0": "trinityDataContract()", +"bb2c5ad7": "hasRandom()", +"bb2ce2f5": "DeedClosed()", +"bb2ced1b": "previousFounders()", +"bb2ced25": "startPoll(address,address,bytes32,bytes32,uint256,uint256)", +"bb2d713e": "sells(uint256)", +"bb2dc863": "getChildBlock(uint256)", +"bb2de15a": "TicketsBought(uint8,address,uint16[])", +"bb2e6904": "hopeCoin(uint256,string,string)", +"bb2eb4d2": "ONE_PERCENT()", +"bb2eb982": "impl_rewardsFactor()", +"bb2ebf83": "CostChip(address,uint32)", +"bb2f159b": "read_i32()", +"bb2f3228": "EOCSToken(uint256,string,string)", +"bb305ef2": "getBondOwner(uint256)", +"bb3084db": "ICOStarted(uint256)", +"bb30d796": "releaseAllocation(address)", +"bb316f06": "contributeForAddress(address)", +"bb32b6f8": "receivedCWC(address,uint256)", +"bb33072f": "refundToInvestor()", +"bb33d729": "unpauseSale()", +"bb33e730": "MoveTokens(address,address,uint256,string)", +"bb340909": "initPecul()", +"bb34534c": "addressOf(bytes32)", +"bb34e57c": "ROLE_BURN()", +"bb35783b": "move(address,address,uint256)", +"bb35b29c": "MintIND(address,address,uint256)", +"bb35f7ee": "rocketTravelTimeByResource(uint256,uint256)", +"bb3611e7": "BonusWhiteListCrowdsale(uint256)", +"bb36a233": "customtransfer(address,uint256)", +"bb36e5d0": "returnExternalPayments(address,bool,bool)", +"bb36ef7b": "addManyToKyc(address[])", +"bb370bad": "orderWasValid(uint256,uint256,uint256,uint256)", +"bb371fdd": "setMaxDeposit(uint256)", +"bb37a162": "payAdvertisers(bytes32)", +"bb389952": "unlockFounder()", +"bb38be10": "notifyCharge()", +"bb397161": "createNonRepeatableVpfFactory(string,bytes32,uint256,int256[])", +"bb39a960": "trade(address,uint256,address,uint256)", +"bb39c85f": "getTotalOwedTokenRepaidToLender(bytes32)", +"bb39ea60": "MIN_ACCEPT_ETHER()", +"bb3a304f": "setFundingLock(bool,address)", +"bb3a77ae": "ROLE_ARBITER()", +"bb3b2a35": "withdraw_4()", +"bb3b8dca": "getCertificateHash(bytes)", +"bb3ce7fe": "DepositHolder()", +"bb3cf577": "AddressListed(address,uint256)", +"bb3d13c5": "addValidation(address,bytes32)", +"bb3d5af2": "GetClaimCount()", +"bb3d9326": "YTC()", +"bb3e409a": "buyEggs(uint256,address)", +"bb3e443b": "FDataToken()", +"bb3e5b0a": "setPI_edit_34(string)", +"bb3f0390": "min_inv()", +"bb3f5330": "revertFunds()", +"bb3f5b7d": "totalTransfer()", +"bb3ff0bd": "TITSCOIN()", +"bb41f421": "payerPercent()", +"bb424892": "minimumCost()", +"bb427d8a": "enterBet()", +"bb42de92": "getSubscriberContentCount()", +"bb43a11e": "getHashOf(address)", +"bb440715": "getPoolBonusExpertFactor(uint256)", +"bb440b82": "funComputeRoundPrice()", +"bb445084": "getRDividends(address)", +"bb449782": "setCommunityAccount(address)", +"bb44e08d": "updateOrderNumber(uint256)", +"bb452ea7": "objectDoublet()", +"bb4534f1": "addrecruit(address,address,address,address)", +"bb453d5a": "CBCToken()", +"bb45d09d": "getCurrGameInfo()", +"bb471d73": "getRealAmountBonus(uint256,uint256,uint256)", +"bb472219": "resetGame()", +"bb472c93": "bet2deltaOf(uint256)", +"bb476637": "deliverTokensAdmin(address,uint256)", +"bb48156a": "preSaleRound()", +"bb4872de": "stoppable()", +"bb48d190": "upgradeToPremium(bytes32)", +"bb4a7f18": "getAllBusinessOwners()", +"bb4b236a": "CSToken(uint256,string,uint8,string)", +"bb4b7bd0": "listForSale(uint256,bytes32)", +"bb4c006c": "checkDeletable(address)", +"bb4c9f0b": "multiSend(address[],uint256[])", +"bb4cbd0b": "gracePeriodStopBlock()", +"bb4d0cb5": "FSC3()", +"bb4d4b2f": "addVestingAccount(address,uint256,uint256)", +"bb4d7cd1": "tag(uint256,string)", +"bb4d9e22": "WithBonusPeriods()", +"bb4e3f4d": "add(uint8,uint8)", +"bb502bac": "EthbetOraclize(address,address,uint256)", +"bb502dd9": "checkExchangeSupported(bytes32)", +"bb504317": "divest(address,uint256)", +"bb50c67a": "crowdsaleRunning()", +"bb510a77": "createChannel(address,uint256)", +"bb5166e7": "getPaymentType(address,uint256)", +"bb5196d6": "setParams(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"bb51de39": "IDEAL()", +"bb51f32d": "withdrawTeam()", +"bb52ca2c": "getOrgClaimsCount(address)", +"bb537ced": "matchesDelay()", +"bb540231": "totalFartsReceived()", +"bb542ef0": "setOwnerWallet(address)", +"bb5530c4": "updateCampaign(uint256,string,string,string,address,address,address,string)", +"bb56a683": "guaranteedBuyersBought()", +"bb572896": "consolationRewardsRequiredFaith()", +"bb57349c": "handleSaleClaimCallback(address,uint256)", +"bb575333": "sessionEndTime()", +"bb582db6": "mgmtBodyAddress()", +"bb584a3a": "EventCancelAuction(uint256,address)", +"bb59b48c": "payableWeiReceived()", +"bb59d68c": "DariaRotkoToken()", +"bb5a1149": "myReferee()", +"bb5a4f4c": "placeBet(uint256,uint256,uint256,uint8,bytes32,bytes32)", +"bb5a7ca0": "extendEventStartsTime(bytes32,uint256)", +"bb5adf14": "setProxyManagementContract(address)", +"bb5b3edc": "emergencyWithdraw(uint256,bool)", +"bb5b5203": "toggleActions()", +"bb5b586b": "usdPerKEther()", +"bb5b6aa4": "myInner2()", +"bb5bf0c3": "WisdomWorldStandardToken(uint256,string,uint8,string)", +"bb5c3821": "total_ICO_supply()", +"bb5d3bcb": "tokensPromotion()", +"bb5d40eb": "isValid()", +"bb5d69a0": "setEns(string,address)", +"bb5ddb0f": "sendMessage(address,bytes)", +"bb5e0696": "LongTermReserveMinted(address,address,uint256,uint256)", +"bb5e3d3b": "doThing(string)", +"bb5e5875": "InseeCoin()", +"bb5e78a4": "HasSigningPermission(address)", +"bb5e9dec": "get30Artworks(uint16)", +"bb5e9eab": "thirdWeek()", +"bb5f4629": "orders(address,bytes32)", +"bb5f747b": "isWhitelistAdmin(address)", +"bb5f95fe": "LSECoin()", +"bb602e80": "Volkscoin()", +"bb6198dd": "getOrCacheTargetReporterGasCostsWasCalled()", +"bb632244": "btcs()", +"bb642f65": "seedCreatedCount()", +"bb64c09b": "KIMEX(address,address)", +"bb64c79e": "SearchTimeBlocknumber(string)", +"bb64e420": "getTransactionByTransactionId(uint256)", +"bb6534a9": "AMOUNT_TeamSupport()", +"bb67be65": "AFUN(address,uint256)", +"bb68b86f": "maxTokensToDistribute()", +"bb6954ce": "BourseToken()", +"bb6996a5": "swapWinner(uint256,bool,uint256)", +"bb6a0853": "GreedPit()", +"bb6a0f07": "tasksCount()", +"bb6a1427": "testThrowRestartEnforceRevisions()", +"bb6a55bd": "_mintToken(address,uint256)", +"bb6ad6ef": "withdrawTokenId(uint256)", +"bb6af3da": "limit9()", +"bb6af543": "setJackpotPayRate(uint256)", +"bb6b13a1": "tier1()", +"bb6b38bb": "setAdminAddressForComissions(address)", +"bb6b4619": "SendETC(address)", +"bb6c1178": "RentToken()", +"bb6c4827": "burnThis(uint256)", +"bb6d0132": "End_Promotion()", +"bb6d203c": "spend(address,uint256,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"bb6d8c77": "contractPoweredUp()", +"bb6e7de9": "endContract()", +"bb6f0f0f": "fetchAllCandidatesBySnapshotBlock(uint256)", +"bb6f175f": "SimpleAquaPriceOracle(uint256,uint256)", +"bb6f6c15": "protectedDenominationOfOrigin()", +"bb7029a9": "gameCollapse()", +"bb702c8e": "discard()", +"bb707059": "approveMany(address[])", +"bb70abfa": "_computePVPBeneficiaryFee(uint256)", +"bb718861": "scheduleCall(address[2],bytes4,bytes,uint8,uint16,uint256[6])", +"bb71a7c3": "makeInvestment(address,address,uint256,uint256,address)", +"bb72680c": "getHasPermission(address,string,string)", +"bb72b12d": "oldOwnerProfit()", +"bb731f98": "Excalibur()", +"bb73703f": "delRoleForUser(address,string)", +"bb7436a7": "getUsersDroidsIds()", +"bb74a5a0": "testValidationOfDoubles()", +"bb74b4e6": "TOKEN_SUPPLY_OWNER()", +"bb74dcda": "isRefunded(address,address)", +"bb750232": "allowReceiver(address)", +"bb75a2a9": "throwMe()", +"bb76d8a5": "TimeLock()", +"bb777028": "PRE_ICO_BONUS_TIME_3()", +"bb777498": "calculateId(string,string,string)", +"bb77b136": "planetAuction()", +"bb77d7d8": "ConunToken(uint256,string,uint8,string)", +"bb784140": "AragonTokenSaleMock(uint256,uint256,address,address,uint256,uint256,uint8)", +"bb7859b5": "periodThree()", +"bb785f0e": "AirDropPayBitsR1(address[])", +"bb78d159": "approveTokenControlInfo(uint256)", +"bb79428c": "RateUpdate(string,uint256,string,string)", +"bb7963e3": "hasArbiterVoted(uint256,address)", +"bb7a6dba": "vestingHasStarted()", +"bb7c15ab": "createDog(uint256,uint256)", +"bb7c62cb": "getReferrerBonusTokens()", +"bb7cb80b": "dropOffset()", +"bb7d064f": "automatedReport(uint256[])", +"bb7d4f65": "ICOFFSHORE()", +"bb7d715b": "startEthToCentsRateUpdateCycle()", +"bb7dd72d": "finishMintingStruct()", +"bb7fa4ac": "sellCeiling()", +"bb7fb08b": "getContributor(address,uint256)", +"bb7fde71": "mint(address,uint256,uint256,string)", +"bb7fe5c9": "LotteryAdmin(address)", +"bb7ff992": "requestSellforETH(uint256)", +"bb806dc9": "initial()", +"bb813a9b": "KkkTokenSale(uint256,address)", +"bb814746": "ICO_TWO()", +"bb814e9e": "versionExists(bytes32)", +"bb818ea6": "advancedNETH(uint256,string,string)", +"bb81926d": "_applyCommission(uint256)", +"bb822605": "calculateTokensTier(uint256,uint256)", +"bb826e50": "maxBlockActions()", +"bb828f11": "setChallengeRewardsPercent(uint256)", +"bb83a01f": "MyTALToken()", +"bb843219": "closingDateFunding()", +"bb84d362": "splitProfitVIP_only_Dev()", +"bb850e01": "_transferOwnershipOnBuy(address,uint256,address)", +"bb85931b": "eSTATERToken(address,address)", +"bb862588": "getCET6ScoreById(uint32)", +"bb86d8fe": "CPGPEREGRINE_FTL_SPEED()", +"bb878f2a": "ProposalAdded(uint256,uint256,string)", +"bb87b5f8": "getPersonalStatus(address)", +"bb87c1f2": "getAllowedUsers(address,uint256)", +"bb889341": "ZiberToken()", +"bb88c016": "decreaseApproval(uint256,address,uint256)", +"bb898233": "getAct()", +"bb8ab48c": "Bluechip()", +"bb8b2b47": "getUserContribution(address)", +"bb8bbc90": "ContractEFT()", +"bb8bcc46": "crowdSaleCap()", +"bb8be064": "HardwareToken()", +"bb8bedc9": "setMasternodeCandidate()", +"bb8c256a": "ecadd(uint256,uint256,uint256,uint256)", +"bb8c7ce4": "ContributionReceived(address,bool,uint256,uint256,uint256)", +"bb8c869d": "contestOver()", +"bb8c9797": "claimReward(string)", +"bb8d35ce": "medibitToken()", +"bb8dc735": "getNonceCompareOp()", +"bb8e8f46": "isExecutionAllowed()", +"bb8f0dd2": "PonziSeller()", +"bb8f712f": "generateGame(bytes32,bytes32,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"bb90617b": "toUINT112(uint256)", +"bb90cec2": "setNewRound()", +"bb911607": "percents(uint256,uint256)", +"bb912454": "setKNCPerEthRate(uint256)", +"bb913f41": "_setImplementation(address)", +"bb91f8ae": "ownerTransferAllEther()", +"bb925c19": "_selectWinner(uint256)", +"bb94392e": "getRemainingTokenForArticle(string)", +"bb945177": "produceTokens(address,uint256,uint256)", +"bb9453a5": "assetProperties(address)", +"bb95024c": "DevilsCoin()", +"bb95d992": "blockhashes(uint256)", +"bb963c8a": "transferLibOwnership(bytes,address)", +"bb969132": "getLandEstateId(uint256)", +"bb9694f3": "Eth()", +"bb971094": "finishAirdrops()", +"bb979c3d": "getHotelsByManager(address)", +"bb9932a7": "addressReserveSupply()", +"bb996043": "returnPtSafeXLarge()", +"bb99999c": "TokenLinked()", +"bb99dec1": "MoldCoin(uint256,address)", +"bb9b02a8": "evLockFund(address,uint256)", +"bb9b13d8": "getTotalInterestAmount(address)", +"bb9ba82d": "Florijn(uint256,string,string)", +"bb9c3f2b": "minWager()", +"bb9c6c3e": "verify(string)", +"bb9e1edc": "ethBaseBalance(address)", +"bb9e3547": "setTokenCost(uint256)", +"bb9e37ec": "TitleApproved(uint256)", +"bb9efd5e": "bulk(address[],uint256[])", +"bb9efdc6": "QUAK()", +"bb9fc9ed": "transferStmpsToOwnerAccount(address,uint256)", +"bba02bf8": "LyuTestToken()", +"bba04dc9": "resetExplicitState(uint32,int64,int256,uint64,int8)", +"bba231ce": "_isPast(uint256)", +"bba2e907": "prepaymentFee()", +"bba33ace": "sellerCut()", +"bba45738": "setOmegaContract(address)", +"bba46031": "LOFO()", +"bba4a876": "setStateDistributing()", +"bba4b31e": "birthBlock()", +"bba4c282": "RaiblocksClassic()", +"bba4e4c0": "AddressForReturn()", +"bba4e9bd": "getTraitCount()", +"bba52516": "tokenTimelock()", +"bba570cb": "getDatURL(string)", +"bba5ad87": "registNameXid(string,uint256)", +"bba5b24e": "buyTokens(uint8)", +"bba65ed1": "isbit(uint256,uint256)", +"bba7a1ab": "getTokenVolumebasedBonusRateForPhase1(uint256)", +"bba80923": "msub(uint128,uint128)", +"bba8a065": "insert(uint8,uint8)", +"bba8b342": "PresaleMidexToken()", +"bba90086": "updateAndTransferFrom(address,uint256,string,uint256,uint256)", +"bba91ea7": "getHomeadvIndex(uint256)", +"bba9a9f6": "zeroFeesTransfer(address,address,uint256)", +"bba9cfe1": "soldBeforeUnsoldAllocation()", +"bba9dc60": "deactivateProvider(address)", +"bba9ffce": "TransactionFailed(address,address,uint256)", +"bbaa7345": "changeDivestmentFee(uint16)", +"bbaa7a57": "getHeroAttributes(uint256)", +"bbaaa787": "claimable(address,bool)", +"bbaac1e8": "privateSaleTokensAvailable()", +"bbab867c": "setSubContractAddresses(address,address)", +"bbac78a9": "setImmutableOwnership(address)", +"bbad490f": "phase_3_bonus()", +"bbad6172": "ICOZ()", +"bbadb845": "updateProduct(uint256,string,uint256,uint256,uint256)", +"bbaefe9f": "bytePrice()", +"bbafb379": "updateBatchStartTime(uint256,uint256)", +"bbb01c9c": "privateIcoMinimumContribution()", +"bbb0c054": "foundersVestedPayment()", +"bbb0d58e": "_createNeighbors(int32,int32)", +"bbb104cf": "FucksToken9()", +"bbb1c4c0": "withdrawForFiveYear()", +"bbb21c4d": "explore(uint256,uint256)", +"bbb28a65": "contributors_count()", +"bbb37f60": "purchaseLeader(uint256)", +"bbb37f76": "registerTier2Users(address[])", +"bbb44989": "Token2GB(address)", +"bbb50b78": "vraWallet()", +"bbb655b6": "_setGasPrice(uint256)", +"bbb7259c": "CrowdsaleLimit(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"bbb73e3e": "GetBuyPrice()", +"bbb7d310": "getCompte_19()", +"bbb7eb64": "addInventories(uint256,uint256,uint256,uint16)", +"bbb896ad": "isCurrentAdmin(address)", +"bbb906f7": "TomSkin()", +"bbb92642": "BotTradesToken()", +"bbba3333": "safer_ecrecover(bytes32,uint8,bytes32,bytes32)", +"bbbc0f55": "_price_tokn_ICO_first()", +"bbbc67d0": "getParticipantDestination()", +"bbbc77dd": "intersubtoken(address,uint256)", +"bbbd2953": "startNewBattle(uint256,uint256,uint256,uint256)", +"bbbdef70": "FreezoneToken()", +"bbbe1390": "getEmployerJobsForFreelancerInvite(address,address,address)", +"bbbeac89": "MastermindAlliancePublishingGroupToken()", +"bbbf8fbd": "increaseWeiRaised(uint256)", +"bbbf9384": "BATTLE_CASUALTIES()", +"bbbfc4db": "mulsm(uint256,uint256)", +"bbbff4fb": "updateMinAmountWei(uint256)", +"bbbff571": "changeKey(string)", +"bbc001c3": "alloc()", +"bbc0c1a2": "addOrg(string,string,string)", +"bbc0ebbf": "soldForFirst()", +"bbc10d1a": "distributeeBitcoinCashSmall(address[])", +"bbc2402d": "startCrowdsale(uint256)", +"bbc2986c": "setPrice(uint16,uint256)", +"bbc2fcf5": "TOKEN_PER_ETH()", +"bbc30ad8": "getGalleryData(uint256)", +"bbc32820": "autoPay()", +"bbc39ab6": "readCharityAddress()", +"bbc42b3f": "orderToContractor(uint256)", +"bbc43d41": "pay(uint128,address,bytes1)", +"bbc49130": "Milestone_OpenTheIco(string)", +"bbc53086": "csvConcat(string,string,string,string)", +"bbc5aa5b": "maxTransferAmount(uint256)", +"bbc5d3d9": "setQuickConverter(address)", +"bbc6049d": "etherSpin()", +"bbc620a8": "setNewWithdrawCommission(uint256)", +"bbc6351e": "MMMC()", +"bbc64582": "getVotesCount(address,uint256,bytes32)", +"bbc6df30": "getRoundInfoByID(uint256)", +"bbc6eb1f": "getDefaultDonation()", +"bbc7d0b9": "marketingPool()", +"bbc7f045": "ZenCoin()", +"bbc84d1a": "voteWorth()", +"bbc878c4": "totalSeraphims()", +"bbc894a1": "GuoCoin()", +"bbc8e3cb": "disallowTransfers(address[])", +"bbc94fda": "priceProgression()", +"bbc9626b": "move_o(uint8,uint8)", +"bbc9f09a": "payPartners()", +"bbca0a89": "c_endTime()", +"bbcac1c3": "vipBrokerFee()", +"bbcb4e3a": "TokenERC20(uint32,string,string)", +"bbcbce8e": "MIN_GOLD_TO_UPGRADE()", +"bbcbe572": "d(address,address)", +"bbcbefd0": "unset()", +"bbcc69ef": "withdrawTokensByInvestors()", +"bbcc8cea": "SaiSaiToken(uint256,string,string)", +"bbcd0f02": "endorseClaim(string,string,string,address,address,string)", +"bbcd5bbe": "setTokenContract(address)", +"bbcdd139": "initExploit()", +"bbcded7a": "left73(uint256)", +"bbce2c17": "lastBurn()", +"bbce3fc2": "getLastBet()", +"bbce67ca": "lastPlayTime()", +"bbce877b": "getbuymoney(address,uint256)", +"bbced0d0": "newTopic(string)", +"bbcef175": "end_redeem_period()", +"bbd0c939": "computePrice(uint256,uint256)", +"bbd1e186": "addModule(string)", +"bbd1e1fc": "editionActive(uint256)", +"bbd2e01e": "betsLength()", +"bbd2e059": "impl_transferMSI(address,address,uint256)", +"bbd31db3": "openAll()", +"bbd32de0": "massTransfer(address[],uint256)", +"bbd3684c": "reservedteamtoken()", +"bbd37e37": "RICO()", +"bbd37ef3": "getReportingParticipant(uint256)", +"bbd39ac0": "coinBalanceOf(address)", +"bbd3b27c": "loveEvent()", +"bbd3b2ab": "inrSessions()", +"bbd418e6": "testConcatStorage4Bytes()", +"bbd425df": "bestUser()", +"bbd4271f": "setRateAndStart(uint256,uint256,uint256)", +"bbd46303": "changeStage(uint8,uint256,uint256,uint256)", +"bbd4e8c9": "numDeposits()", +"bbd4edb1": "updateRatingCustomer(string,bool)", +"bbd4f854": "buyShares(bytes32,uint8,uint256,uint256)", +"bbd5301a": "_devteam()", +"bbd53bf7": "fairsale_protectionOFF()", +"bbd5d174": "LogGame(string,string,string,string)", +"bbd6dd48": "getUserTokenInfos(uint256)", +"bbd74748": "Ethraffle_v4b()", +"bbd7a3c7": "scripts(address)", +"bbd8b602": "getOracleOutcomes(bytes,address[])", +"bbd95c32": "inArray(uint256[],uint256)", +"bbd974cc": "maxAllowedTakerBetsPerMakerBet()", +"bbd9a5fa": "grantPermission(address,string)", +"bbda1e9a": "BicycleToken()", +"bbda33d9": "getGameName()", +"bbdaebe2": "transferFromInternal(address,address,uint256)", +"bbdb31cb": "challenge(uint256,address,bool)", +"bbdb57c3": "batchTransferORSS(address[],uint256[])", +"bbdbd31e": "beneficiaryAndBirth(bytes32,int256,bytes32)", +"bbdc02db": "gameType()", +"bbdc04d8": "getDealData(bytes32)", +"bbdc7709": "startDispute()", +"bbdd366a": "DECIMALS_MULTIPLIER()", +"bbddaca3": "setReferrer(address,address)", +"bbdefbbb": "AWMVoucher()", +"bbdfbfba": "delivered()", +"bbe00af5": "beneficiars()", +"bbe18d43": "betClosed()", +"bbe2b727": "burnWholeBalance()", +"bbe42771": "closeDeed(uint256)", +"bbe430de": "available(address,address)", +"bbe437eb": "endICO_w2()", +"bbe4fd50": "getNow()", +"bbe562b0": "multiplication(uint256,uint256)", +"bbe5d9d4": "addSpace(uint256,uint256,bytes)", +"bbe61730": "get_sale_arbits_total()", +"bbe7180b": "envio_dinero()", +"bbe7221e": "orderbookContract()", +"bbe86e6a": "sendTokensToOne(address,uint256)", +"bbe8a9b6": "registerSecretBatch(bytes32[])", +"bbe93d91": "mul(int256,int256)", +"bbe9c7d6": "takePromille(uint256,uint256)", +"bbe9f99d": "isTeamMember(address)", +"bbeadcad": "invalidateVotingAtIndex(uint256)", +"bbeb5923": "joinFee_()", +"bbeb76bc": "setMultipleParticipantWhitelist(address[],bool[],uint256[])", +"bbec170f": "lockAllAccount()", +"bbec3768": "createOrder(uint128,uint16,uint256,uint8,uint256)", +"bbec9e1b": "deletePriceCredentialItemId(bytes32)", +"bbececa9": "left78(uint256)", +"bbed7177": "getContentTimestamp(uint256)", +"bbee1ab7": "forgiveIt(address)", +"bbef83cf": "getContractNameById(bytes32)", +"bbef8624": "calculateWithdrawalRequestWitnessHash(address[],uint256[])", +"bbef86b8": "PayForServiceCHL(uint256)", +"bbf02b00": "level_8_percent()", +"bbf0f065": "keepEth()", +"bbf14d67": "tier3Timestamp()", +"bbf1e6d0": "SetMiningEnable()", +"bbf2a9a3": "changeAcct3(address)", +"bbf2ee4e": "lockAddress(uint256)", +"bbf3ae00": "ccExchangeRate()", +"bbf48d6f": "convertReward()", +"bbf58f4d": "foundersVault()", +"bbf59a41": "personal_withdraw()", +"bbf646c2": "ethAddr()", +"bbf7585c": "getDistributionAt(uint256)", +"bbf76802": "purchaseApprove(address)", +"bbf78026": "SetMemberInfo(address,address,bytes32)", +"bbf89803": "addBuyer(address)", +"bbf9cd8b": "EACCoin()", +"bbfa6153": "getRegulatorLevel(address)", +"bbfad256": "updated(uint256)", +"bbfb2f7a": "getEndtime()", +"bbfbaaf8": "getWorkSecondsInProgress()", +"bbfbe6b6": "discountedMiningDifficulty(address)", +"bbfcc86b": "getHistEthRate(uint256)", +"bbfdc3c4": "logicStatic(address)", +"bbfe6b75": "externalCall(address,uint256,bytes,uint256,uint256)", +"bc0111a8": "initEnsRigistrar()", +"bc014bb9": "earlyBackers()", +"bc019eed": "getAffiliate(address)", +"bc01b767": "freezeTransfersUntil(uint256)", +"bc02844c": "totalRemaining(uint256)", +"bc032967": "getRetailerByAddress(address,address)", +"bc03a31e": "superManager(address)", +"bc04056a": "LockedDayAdded(address,uint256,uint256)", +"bc0409bf": "addTokens(bytes32,uint256)", +"bc04562d": "Reclaimer(bytes32)", +"bc04cb0f": "FEED1()", +"bc04d77b": "datasetHub()", +"bc055227": "ownerOfPiranha(uint256)", +"bc05529b": "SaleDeadline()", +"bc058968": "updateThingData(bytes32[],bytes32[],uint88)", +"bc05d087": "registerProduct(uint256,string)", +"bc063e1a": "MAX_FEE()", +"bc064863": "getRequestorAddresses()", +"bc070e83": "minimumBuyIn()", +"bc084de9": "CrowdsaleAuthorizer(address,uint256,uint256,uint256,uint256,uint256)", +"bc08afd9": "WebOfTrustToken(address,uint256)", +"bc09b5ec": "fundPreIco()", +"bc0aaff2": "setzBytes32(bytes32)", +"bc0aca61": "setFeeAccount1(address)", +"bc0ae61e": "GazeBountyCoin()", +"bc0b45fa": "OSPN()", +"bc0c868c": "stocksOf(uint256)", +"bc0cd8d3": "BOOCOIN()", +"bc0e7adb": "testThrowsDisownNotOwner()", +"bc0eaf0a": "calcAmountAt(uint256,uint256)", +"bc0f920a": "AuthSuspend(bool)", +"bc0fb9a0": "predictWinner(uint256,uint256,uint256)", +"bc1013db": "m_totalWorkerPoolCount()", +"bc101ffe": "twentyPercentWithBonus()", +"bc104f24": "compareItemSlots(uint256,uint256)", +"bc10a667": "euroRaisedICO()", +"bc10ce84": "Test(int256)", +"bc1123fe": "isUInt256ValidIn64(uint256)", +"bc112fa3": "ALC_FUNDATION_ADDRESS()", +"bc11f72c": "DABcoin()", +"bc120fe7": "whitelisted(address,address)", +"bc126ba1": "totalCents()", +"bc1292a0": "BonusChange(uint256)", +"bc129a98": "accountedTokenSales()", +"bc12d19d": "maxCapTokenPresale()", +"bc12e3d7": "getAuction(uint64)", +"bc1351ba": "has_contract_started()", +"bc13e3a6": "controller2()", +"bc14016b": "removeAllOps()", +"bc148094": "PostAdded(address)", +"bc1558be": "MANHATTANPROXY3RDAVE()", +"bc15a2dd": "BEAXY()", +"bc15be93": "firstRoundCosmosDiscount()", +"bc15e5fe": "get_next_global_audit_document(bytes32)", +"bc16272d": "requestRegistration(bytes32)", +"bc168c90": "_setIPFSHash(bytes32,string)", +"bc174df3": "ProofOfCryptoNick()", +"bc17991d": "restoreBalances(address[60],uint256[60],uint256[60])", +"bc17a0b4": "PAST()", +"bc17bd7e": "SelfDestructible(address,address)", +"bc17e669": "exiteJugador(address)", +"bc186dc9": "unlockBalanceByIndex(uint256)", +"bc18f727": "galleryFive()", +"bc197c81": "onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)", +"bc19bcbf": "submitBallotWithPk(bytes32,bytes32)", +"bc19bce5": "resolveName(string)", +"bc1a3810": "thelnwaonCoins()", +"bc1af71d": "_maxTokenSoldPreICO()", +"bc1c002c": "call_contract(address,address)", +"bc1c58d1": "contenthash(bytes32)", +"bc1c9888": "CoOwnerSet(address)", +"bc1e9ca3": "USD_CENT_PER_TOKEN()", +"bc1ea063": "LogContractOwnershipChangeInitiated(address)", +"bc1f71e1": "depositKncForFee(address,uint256)", +"bc2010cc": "feesC()", +"bc2017f3": "adjustPriceOfCountryPlayersAfterWin(uint256)", +"bc201a9d": "addSupport(address)", +"bc208057": "enter(uint256,uint256,uint256)", +"bc215cb6": "BBTokenBox()", +"bc21ce9d": "Aggregation()", +"bc22df1a": "buySpaceshipUpgrade(bytes5,uint16,uint8)", +"bc22f570": "poolsToCreate()", +"bc231983": "Temp()", +"bc24300e": "_borrowToken(address,uint256,uint256,address,address,bool,bool)", +"bc244c11": "shut(address,bytes32)", +"bc244fc9": "systemAddress(address)", +"bc24612c": "claimableAmount(address,bytes4)", +"bc246a36": "hashState(address,uint256,uint256,uint256)", +"bc24d886": "setSail(uint256,uint256,uint256,uint256,uint256,uint256)", +"bc25415c": "produce(uint64)", +"bc25a810": "lock(address,bytes32)", +"bc25e2fd": "postProof(string)", +"bc2622b4": "addKeyValue(string,string,string,uint256)", +"bc2674b1": "LogExchange(address,address,uint256)", +"bc27c7bb": "buyZoAssets(bytes32)", +"bc28cfe4": "getTicketSet(address,uint256,uint256)", +"bc28d878": "rejectProposal(uint256)", +"bc294a7c": "setCEOAddress(address)", +"bc2a4dd6": "doBalanceOf(address)", +"bc2b6913": "donateSkin(uint128[],address[],bool[],uint256[])", +"bc2bbad7": "getMyNotes(uint64,uint64)", +"bc2be1be": "getStartTime(uint256)", +"bc2c3a12": "ValidContractAdded(address,address,uint256)", +"bc2c5873": "reinvestPartial(uint256,bool)", +"bc2d10f1": "finishEthGet()", +"bc2d87f5": "Set(string,string,address)", +"bc2eb3f8": "removeNode(bytes32,bytes32)", +"bc2fe07b": "transferCardOwnership(address,uint8)", +"bc300ed3": "setBounty(address)", +"bc304e55": "serverTransfer(address,address,uint256)", +"bc308233": "autoreleaseTime()", +"bc30e4ac": "abcLotto()", +"bc30f3f8": "modifyPlatformAddr(address)", +"bc339f41": "logMarketCreated(bytes32,string,string,address,address,address,int256,int256,uint8)", +"bc33f8ef": "commonRebate()", +"bc345e11": "Updated(address,address,bytes,bool)", +"bc346090": "DigipayToken()", +"bc346c9c": "Attack(address)", +"bc34f204": "getP3DBalance()", +"bc356eea": "VEN()", +"bc3574d4": "adjustSupply(uint256)", +"bc3589bf": "TOKEN_FIRST_PRICE_RATE()", +"bc358af9": "listItem(uint256,uint256,uint8,address)", +"bc35c57f": "setMinAmount2Round(uint256)", +"bc3619dd": "onBlockClose(address)", +"bc364d7b": "tokenVestingAddress()", +"bc367377": "setTokenBurnApproveReset(address,address,address,address)", +"bc376bbe": "unlockFor(address,uint256)", +"bc378a73": "getProposalsLength()", +"bc37d7b8": "setVendingFee(uint256,uint256,uint256)", +"bc389b6d": "callWithdraw(uint256)", +"bc38a991": "testInsert()", +"bc39d42f": "sigDestinationTransferFrom()", +"bc3a72a5": "ETHHToken(uint256,string,string)", +"bc3abbdb": "etherPerMiner()", +"bc3b0d31": "STCB()", +"bc3bc814": "changeTolerance(bytes32,uint256)", +"bc3c2846": "requestMediator(uint256,uint256,address)", +"bc3d9390": "printBlockHash()", +"bc3dde2f": "xxx(address)", +"bc3f7bcb": "moleculartechnologySupply()", +"bc3f931f": "getVote(uint256,address)", +"bc4006f5": "erc721Metadata()", +"bc40487c": "Hashnodetestcoin()", +"bc4076e9": "accountsReceiveableHeld()", +"bc408ec4": "ElixirUSD()", +"bc40b52a": "startPreICO()", +"bc40bac6": "getCrydrViewAddress(string)", +"bc41f298": "changeControllerAccess(address,bool)", +"bc427bc8": "setFreezeForFounding(uint256,address,uint256)", +"bc428ee2": "getTimeOutAuthentication()", +"bc431846": "getBetPriceID(uint256)", +"bc4447ef": "getBlackListStatus(address,address)", +"bc447a6d": "numDragonTypes()", +"bc448782": "setCrowdsaleAddress(address,address)", +"bc44e79d": "getStageWinners(uint8,uint16,uint8)", +"bc44ea9a": "setBank(address,uint256)", +"bc451844": "BONUS_DURATION_1()", +"bc456c42": "changePaymentAddress(address,address)", +"bc45d789": "setConfigUint(int256,bytes32,uint256)", +"bc466ab2": "setNewEnd(uint256)", +"bc467a3e": "ownedContract()", +"bc48bc22": "erc20TokenCount()", +"bc48f4be": "getLand(int256,int256,address)", +"bc499814": "generatePrefixedPreimage(bytes32)", +"bc4998b9": "eth2MNT(string)", +"bc4a2030": "getCurrentRate(uint256,uint256,uint256,uint256)", +"bc4af295": "spawnAssetWithCreator(address,uint256,uint256,uint256,address)", +"bc4afa67": "MBTCToken(address,uint256)", +"bc4b3365": "addFunds(address,uint256)", +"bc4b346d": "confirmQuest()", +"bc4bbad1": "updateCostETH(uint256)", +"bc4c594b": "tokenManagerAddress()", +"bc4d76e5": "EPay()", +"bc4d9b50": "minerLockedAmount()", +"bc4e3105": "unlockAddressDuringITO(address,address)", +"bc4f65a3": "addCity(bytes32,uint256,uint256)", +"bc4fcc4a": "redeemedAt(bytes32)", +"bc4fe17e": "addressToUser(address,address)", +"bc50c09e": "playAnyTriples(uint256)", +"bc517131": "walletVersion()", +"bc5213b7": "_setCurrentRate(uint256)", +"bc523229": "ShopDex()", +"bc525652": "templates(uint256)", +"bc52b43b": "buyinAs(address)", +"bc537bae": "getMeOutOfHereStocks()", +"bc53a93d": "E4Token()", +"bc54a168": "buyTokensOnInvestorBehalfBatch(address[],uint256[])", +"bc54f56f": "getTemplateDetails()", +"bc562b9e": "loseSponsor(uint32)", +"bc56a240": "walletEtherPresale()", +"bc56e749": "acceptProposal(uint256,address)", +"bc57275b": "EthCnyPrice()", +"bc579103": "totalPayed()", +"bc57d5f5": "transferFrom(address,address,uint256,uint256,uint256,uint256)", +"bc597d9f": "getProposalVotesCount(uint256)", +"bc59afe6": "scanMany(address[],bytes1[])", +"bc59d45a": "raisedWei()", +"bc5b75f4": "EtherWorldCup()", +"bc5bf5bf": "releaseVestingTokens(address)", +"bc5c0c67": "setDowntime(uint256)", +"bc5cfd4f": "lastBonusNumber()", +"bc5d066e": "changeCompanyWallet(address,address)", +"bc5d0f65": "beginExecution()", +"bc5dc168": "balanceOfLocked2Y(address)", +"bc5dfd7d": "getCompte_23()", +"bc5e4bb4": "_hasSkillsCheck(uint256)", +"bc5ff5e1": "oraclize_query(string,string[4],uint256)", +"bc602ab7": "removeRandomClass(uint32)", +"bc607f7b": "funcFromC2()", +"bc60878e": "total_received_amount()", +"bc60a365": "removeAdminAccount(uint256,address)", +"bc60ac60": "StefyToken()", +"bc61394a": "fillOrder(address[5],uint256[6],uint256,bool,uint8,bytes32,bytes32)", +"bc6171df": "sendETHToMultiSig(uint256)", +"bc62c89a": "getTrainerEarn(address)", +"bc62d8d8": "parse(string)", +"bc632a21": "creationTime(address)", +"bc634abb": "getDocumentProposals()", +"bc636707": "_explorationTime(uint8,uint8,uint8)", +"bc63cc90": "starCountsForOwner(address)", +"bc64059b": "exchangeEtherForHavvensAtRate(uint256,uint256)", +"bc643df1": "getIncludes(uint256,uint256)", +"bc649f4c": "grantProvider(address)", +"bc6548fb": "etherVault()", +"bc655f54": "getEndDate1()", +"bc65c559": "preIcoInvestment(address,uint256,uint256)", +"bc65d6f6": "getSubscriberContentHashes()", +"bc65e9e1": "PenCoin()", +"bc6633f7": "setSaleState(uint16,bool)", +"bc677b46": "viewOwner()", +"bc67f832": "setMessageSender(address)", +"bc68118b": "setDeveryRegistryAddress(address)", +"bc68fad9": "burnBalance()", +"bc697319": "minimumGoal()", +"bc698641": "relayBalance()", +"bc69dc89": "BenefyCashToken(string,string,uint8,uint256)", +"bc6a49a3": "LaunchRocketEvent(address,uint32,int64,int64)", +"bc6ac112": "calculateRegionInitialSalePixelPrice(address[16],uint256)", +"bc6b12b3": "odem()", +"bc6c06e7": "GoodfieldRetail(uint256,string,string)", +"bc6c4d0f": "totalVotesForCandidate(uint256)", +"bc6d68ee": "updateSubscription(address,address,bool,uint256)", +"bc6d80fa": "getLenderAmountForIncreasePositionAtTime(bytes32,uint256,uint32)", +"bc6e6604": "TOKENS_PER_ETH()", +"bc6f1699": "clockpos()", +"bc6f712a": "Attestation(string,bool,address)", +"bc6f9021": "maxCapTokens()", +"bc6fd6d9": "MINIMAL_WEI()", +"bc70ad19": "IMEXX()", +"bc713f1d": "AddPoolCoOwner(string,address)", +"bc71b0a6": "DeCenterToken(address,address,address,uint256,uint256)", +"bc71cdcb": "BAInvestor()", +"bc7202d7": "_updateSalePrice(uint256,uint256,address)", +"bc734f0f": "nextSeason()", +"bc735d90": "setOperator(address,address,bool)", +"bc73a7e4": "_preValidatePurchase(address,uint256,uint256)", +"bc73c971": "TierBasicDividendAddress(address)", +"bc7411b2": "chargeBonuses()", +"bc745a0d": "nextBonusStepLimit()", +"bc752b61": "buyTicket(uint256[],uint256)", +"bc76dca0": "GoWalletProject()", +"bc77b919": "_mySymbol()", +"bc77f476": "EVCChain()", +"bc78ac81": "setPet(string)", +"bc7a6e35": "_startAuction(bytes32)", +"bc7b3f86": "NewHighestBid(address,uint256,string)", +"bc7b6d62": "setResolver(uint256,address)", +"bc7b801e": "adminUpdateWorldSnapshot()", +"bc7c322c": "ratePerWei()", +"bc7c55ed": "listing()", +"bc7c72d7": "getmessagefromdovie()", +"bc7d8cb4": "EURSToken(address)", +"bc7dbc0d": "yearlyFee()", +"bc7dce06": "setETHPrice(uint256)", +"bc7e8d3c": "isDeholdable()", +"bc7f25e4": "getReferrerOf(address)", +"bc7f3b50": "getDelegate()", +"bc7f58b1": "addAgreement(address,bytes32,uint32,uint32)", +"bc802c83": "userManagerContract()", +"bc80bee8": "setFeerate(uint256[3])", +"bc81572c": "createPromoScene(address,string,uint256[],uint256)", +"bc81786f": "addBonusToClient(address,address,uint256,string)", +"bc81c97b": "failingRefund(address,uint256)", +"bc81f147": "set_iconiq_arbits_per_ether(uint256)", +"bc81f2f5": "eraseMatch(uint256)", +"bc82f4d3": "verifyEmailAddress(address,string)", +"bc83a6fb": "ekkoBlock1(uint256,string,uint8,string)", +"bc83d001": "DividendFacial()", +"bc8409a4": "investWallet()", +"bc843509": "toByte()", +"bc84a7ba": "getsometokenn(address,uint256)", +"bc851718": "hashLast()", +"bc855006": "SantaiToken()", +"bc85c055": "queryEOSTokenBalance(address,address)", +"bc85e064": "merchantWallet()", +"bc86a23a": "addPrimaryRecord(string,string,string,string,string,string,string)", +"bc87103a": "removeFunder(address,address)", +"bc8711fd": "getWinnersLength()", +"bc87b70f": "oldestGen()", +"bc88adc4": "getBuyerBalancesOfCurrentAuctions(address[],address[],address)", +"bc899015": "CappedCrowdsaleImpl(uint256,uint256,uint256,address,uint256)", +"bc8aa899": "we_token()", +"bc8b336d": "Ninecoin()", +"bc8bde64": "_creator()", +"bc8caa47": "resetDividendsCalculation()", +"bc8cb3f9": "destTokensReferals()", +"bc8d7a51": "gemsOfOwner(address)", +"bc8e1143": "processTransaction(bytes,uint256,address,bytes20)", +"bc8e9cde": "createGen0Horse(uint256,uint256,uint256,uint256,uint256,uint256,address)", +"bc8f3bcb": "ZeroDollarHomePage()", +"bc8fbbf8": "nuke()", +"bc903cb8": "getProposalInfo(uint256)", +"bc912e1a": "WHITELIST_SALE_PRICE()", +"bc9147a4": "Foundation()", +"bc916a50": "hasOwner(uint16)", +"bc921d54": "setImageData(uint256,uint16,uint256[])", +"bc92bea5": "getRandomItems(address,string)", +"bc944d9e": "newLowestAsk(uint256,address)", +"bc950708": "totalRaisedInCents()", +"bc95f178": "make(bytes32,bytes32)", +"bc9748a1": "pong()", +"bc978361": "setrteamVaultAddr(address)", +"bc97a8ac": "JackpotPayout()", +"bc97fd06": "updateMultipleUsersReward(address[],uint256[])", +"bc98b8b0": "getTTTInfo(uint256)", +"bc9904ec": "updateProfile(address,bytes)", +"bc99249e": "buy(address,bool)", +"bc9968a2": "dataController()", +"bc99c8be": "takerAddressAt(uint256)", +"bc99cc37": "maxInvestors()", +"bc99d04c": "YRQ(uint256,string,string)", +"bc9abe67": "completedFlag(uint16)", +"bc9aed8b": "TokensIssued(address,uint256,uint256,uint256,bool,uint256)", +"bc9b717e": "TokenPurchase(address,address,uint256)", +"bc9c278d": "IcoContract(address,address,uint256,uint256,uint256,uint256)", +"bc9c58f6": "countOrigins()", +"bc9cbcc8": "setImbalanceStepFunction(address,int256[],int256[],int256[],int256[])", +"bc9cc1fb": "getAllbetByGtype(uint8)", +"bc9d8d6a": "getLastWallet()", +"bc9da641": "testToUint8()", +"bc9e080e": "setVerifierManager(address)", +"bc9e6b0f": "_getClientLastPaidRate(address)", +"bc9f31e3": "mock_throwIfNotRemoved(address,address)", +"bc9ff567": "InternetWealth(uint256)", +"bca19900": "tokenHardcapIssued()", +"bca19ca0": "TAAS_CONTRACT()", +"bca1f81c": "lockOpen()", +"bca2b941": "setTokenPrice(uint256,uint256,uint256)", +"bca2bbc0": "EtherModifierMoops()", +"bca36985": "ExposureSettled(bytes32,address,uint256)", +"bca38dab": "createGuess(uint256,string,string,string,uint8,bytes,uint256,uint256,uint256[],bytes32[])", +"bca3eb24": "setCAO(address)", +"bca50515": "transferFromPreSigned(bytes,address,address,uint256,uint256,uint256)", +"bca51abf": "_detectStage(uint256)", +"bca53fa0": "AIHTeamLockContract()", +"bca58da8": "change_block()", +"bca60cf5": "getAgreement()", +"bca63e50": "mintTotal()", +"bca65475": "jugar()", +"bca6e8ec": "sendToReceiver(address,address,uint256)", +"bca7093d": "withdrawalPeriod()", +"bca72b59": "revealVote(string,uint256,uint256)", +"bca76131": "GoCryptobotCore()", +"bca77cd6": "YUBToken()", +"bca7a9e2": "lockToken()", +"bca7bd85": "getAllLockerInfo()", +"bca7e96b": "needsFinalization()", +"bca86986": "testSetup()", +"bca915c7": "createPromoPlayer(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"bca9745c": "display_time(bytes32)", +"bca9a5c5": "getEmployee(uint256)", +"bca9adef": "vestedAvailableAmount(address,address)", +"bca9e546": "testControlCreateWithParentParentNotInUse()", +"bcaa218e": "myFrontEndTokens()", +"bcaa85df": "lockAccounts(address,bool)", +"bcab7ad2": "TimeDecayingTokenBoundary(uint256,uint256,uint256,uint256,address)", +"bcabb0c8": "getAllProposalVoters(uint256)", +"bcabb54c": "modifyCommunityInfo(uint256,string,string,string,string)", +"bcabbfb1": "startDonation()", +"bcae19f4": "base58Address(bytes)", +"bcae9d43": "theProxy()", +"bcaedade": "STANDARD()", +"bcafe9a9": "setIncreaseRepAvailableForExtraBondPayouts(bool)", +"bcb02b74": "testFailPushWhenStopped()", +"bcb0a787": "_setSchellingRoundSupply(uint256)", +"bcb0c2d7": "removeStakeholder(address)", +"bcb0c7c0": "nomParticipant(uint256)", +"bcb0f541": "setEarlyBirdDuration(uint256)", +"bcb1e4f7": "GetSellingTokenUnitPrice()", +"bcb2f8c6": "externalFundProposal(uint256)", +"bcb32828": "emissionAddress()", +"bcb39621": "currentSeason()", +"bcb3b5d2": "getGamblesList(uint256)", +"bcb593f1": "subOnStage(address,uint256)", +"bcb60fa9": "blockTx(bool)", +"bcb638cb": "parseImpressions(uint64,bytes)", +"bcb7b0d4": "pauseICOs()", +"bcb7f880": "DTCC_ILOW_2()", +"bcb83450": "createMarriage()", +"bcb98ba2": "changeChampsName(uint256,string)", +"bcba53f4": "_createBlock(uint256,uint256,uint256,string,address)", +"bcba6939": "transferERC20Token(address,uint256)", +"bcbb64c4": "softCapInToken()", +"bcbc1585": "_payRoyalty()", +"bcbc758a": "SixStandardToken(uint256,string,uint8,string)", +"bcbc9175": "prefixedHash(bytes32)", +"bcbd3bcd": "_editPersonalNote(string,uint256)", +"bcbd82e5": "rateForPreICO()", +"bcbd9881": "setFriendsFingersRate(uint256)", +"bcbdbf40": "SaleResumed()", +"bcbea1ad": "transferCardTo(address,address)", +"bcbf5b90": "totalSupplyForPresale()", +"bcbf7229": "resetVoteCount(uint256)", +"bcbfe43c": "openSaleCompleted()", +"bcc13d1d": "contributionMin()", +"bcc1480a": "canTransferBalance(address)", +"bcc17ca0": "getvalues(uint256)", +"bcc221d0": "getBonusValue()", +"bcc30409": "processPurchase(address,uint8,uint256)", +"bcc37dd4": "approvedAccount(address)", +"bcc38018": "recycleReward(uint256)", +"bcc38d59": "proxies()", +"bcc3af24": "hasVotedOnConstitutionPoll(uint8,address)", +"bcc44a72": "restoreTokenOwnership()", +"bcc46e83": "addCollateral(uint256)", +"bcc4e4ab": "getVesting()", +"bcc4f0ed": "isValidBuy(uint256,uint256)", +"bcc5601b": "BaktFactory(address,bytes32,address)", +"bcc5dce5": "stash(uint256)", +"bcc6092a": "MyEtherBank()", +"bcc673bd": "GeneralToken(string,string,uint8)", +"bcc70902": "create(address,uint256,uint256[],uint256)", +"bcc74a3b": "isAdminAddressExist(address)", +"bcc7900c": "SystemTest()", +"bcc7db5a": "cleanupErrorGame(address,uint256,uint256)", +"bcc91d61": "sendEther(address[],uint256[])", +"bcc941b6": "totalWinners()", +"bcc94309": "calculator(uint8,uint256,uint256)", +"bcc9ed6f": "MAX_PAYOUT_FRAC_TOP()", +"bcca1fd3": "changeVotingRules(uint256,uint256,int256)", +"bccb6157": "RedemptionWalletUpdated(address)", +"bccb8fc0": "vestTokens(address,uint256,address,uint256,uint256,uint256,bool)", +"bccc85e6": "receiveTokenLoot(uint256,uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"bccda810": "logicContractAddress()", +"bccdd9a6": "getValueFromCents(uint256)", +"bcce515d": "bulkMint(uint256[])", +"bccee504": "m_ETHPriceLifetime()", +"bccf0972": "egrToken()", +"bccf5aa4": "issueTokenAndTransfer(address)", +"bcd0b22a": "getSnapsLength()", +"bcd0ce28": "BitcoinUniversal()", +"bcd101a6": "getStartDates()", +"bcd2780b": "addValidContract(address)", +"bcd2feff": "biotorBiomassToken()", +"bcd396d1": "adminTrade(uint256[],address[],uint8[],bytes32[])", +"bcd3d8ca": "Collector(address,address,uint256)", +"bcd3ff89": "setGameSponsorInfo(address,uint256)", +"bcd4144b": "giveGreed()", +"bcd45a76": "HolderVacated(address)", +"bcd47934": "hasBiometric()", +"bcd5078c": "get_king_address()", +"bcd533ae": "newRefundProposal()", +"bcd5349f": "getCapacity(uint256)", +"bcd59261": "getDepositBlock()", +"bcd59b36": "secondsAfterStart()", +"bcd60f6c": "winningProposal(uint256)", +"bcd61c6a": "getGoodPrice(bytes32)", +"bcd789cc": "submitProposal(bytes32,string,address,address,uint256)", +"bcd85b6d": "getBackerStatus(address)", +"bcd88a61": "viewInvestorDividendPool()", +"bcd9cc60": "rejectCetification(address)", +"bcda2c0c": "_delete()", +"bcda601f": "Panicked(address)", +"bcdac66f": "Power()", +"bcdaea36": "setOpGas(uint256,uint256,uint256,uint256,uint256)", +"bcdb446b": "recoverEth()", +"bcdd6121": "increaseApproval(address,address,uint256)", +"bcdda53f": "TokenERC20(address,uint256,address)", +"bcddd64e": "CHECKPOINT_KEY()", +"bcde18f1": "fundingStart()", +"bcde87eb": "totalAmountOfTeatokensCreated()", +"bcdea6f9": "getStageMinimum(uint8)", +"bcdf266c": "EphronTestCoin()", +"bcdf43dc": "add_presale_arbits_sold(address,uint256)", +"bcdf569b": "finalize(address,address)", +"bcdfe0d5": "Hello()", +"bce0e87a": "payoutOnPurchase(address,uint256)", +"bce0fb22": "takeOwnershipWithIndex(uint256,uint256)", +"bce1cdc3": "getTotalEtherOfAllRounds()", +"bce24669": "removeGame(address)", +"bce2b9a3": "purchaseEgg()", +"bce2bb42": "setCoinTotalsContract(address)", +"bce2d16d": "koef()", +"bce32da4": "AndhraToken()", +"bce3cc67": "TokensReclaimed(uint256)", +"bce440d5": "TokensContractAddressSet(address,address)", +"bce49a90": "KKCToken(address)", +"bce4d041": "updateCancels(address,uint256)", +"bce5a209": "owners2tokens(address,uint256)", +"bce5fc53": "UIOCOIN(uint256,string,uint8,string)", +"bce6158d": "PTransfer(address,uint256)", +"bce643aa": "developer_new_symbol(string)", +"bce70868": "buildingIsPublic(uint256)", +"bce83d2a": "setWhitelist(address,address,string)", +"bce94649": "getRangeURI(uint256)", +"bce9ae3d": "NewDeal(uint256,address,address,address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"bce9ccb9": "GetCitySnapshot(address,uint256)", +"bcea363d": "killContract(address)", +"bcea7ea0": "chargingGas(uint256)", +"bcead63e": "lender()", +"bceaf1fd": "CLOUDForGas()", +"bcec1df3": "ROLE_DISTRIBUTOR()", +"bcecbc65": "getSendersEth(address)", +"bceceefe": "startCrowdsale0(address)", +"bcecf667": "usdToEth(uint256)", +"bced2c8c": "InteractingTokenA(uint256,uint256)", +"bced9cfd": "guessSeed(uint256)", +"bcedb86c": "payQuarterFinalWinner(uint256)", +"bcee2dd4": "getFeeCollected()", +"bcee6eb9": "validateProposedThroneRules(uint256,uint256,uint256,uint256)", +"bceeb243": "getUserSSCeducationDetails(string)", +"bceee05e": "isSuperuser(address)", +"bceeeb9a": "SearchIPR(string,address)", +"bcef393a": "balanceOfVault(uint256,address)", +"bcef84b1": "getMaxBuy(uint256,uint256)", +"bcefafab": "changeAccountAddressForSponsee(address)", +"bcf0dd8e": "marketTransfer(address,address,uint256)", +"bcf0e1ea": "TerrariumCoin()", +"bcf175c8": "oraclize_cbAddress()", +"bcf2e323": "sort(bool)", +"bcf49c72": "dewhitelistAddress(address,address)", +"bcf599f1": "toUnixtime(bytes32)", +"bcf610bc": "UnsetAgenda(string,address)", +"bcf6558c": "releaseMid()", +"bcf685ed": "setAgent(address)", +"bcf68f87": "lockCrowdSale()", +"bcf6b3cd": "changeBaseValue(uint256,uint256,uint256,uint256)", +"bcf711b2": "CBXToken()", +"bcf7b67e": "emitFeesClaimed(address,uint256)", +"bcf7bd0b": "requireEnoughExpForBreeding(uint256)", +"bcf83634": "basecost()", +"bcfa87d2": "getBounsEarnings(address)", +"bcfaa79d": "mintTokens(address)", +"bcfb0140": "getTokenOrderDataHash(uint256[],uint256,uint256,address,address)", +"bcfb4ea1": "Million()", +"bcfb9b61": "voteProposal(uint256,bool)", +"bcfbd445": "getTrader(uint256)", +"bcfc5078": "bountiesKey()", +"bcfcb03e": "allocateFounderTokens()", +"bcfde742": "setHardCapCHF(uint256)", +"bcfe070f": "batchCancel(address[],uint256[])", +"bcfe8fb4": "ArtTokenBurn()", +"bcfea3e4": "BLMCH()", +"bcff702b": "salePause()", +"bcfffab8": "shopStoreNextId()", +"bd002e1e": "startPoll(bytes,uint256,uint256,uint256)", +"bd00b0c2": "changeDedeAddress(address)", +"bd0100c9": "registerAddress(string,address,address)", +"bd01c7d5": "buyTicketToDraw(uint256,uint256,address)", +"bd025a79": "setDoge(address)", +"bd02942f": "allocateAdvisors(address,uint256)", +"bd02d0f5": "getUint(bytes32)", +"bd02e4f6": "calcRandomNumberAndGetPreliminaryGameResult(uint256,uint64)", +"bd041c4d": "vote(address,bool)", +"bd042ca6": "GigsToken()", +"bd04923f": "values(uint256,uint256,uint256)", +"bd05c055": "timeBetweenGames()", +"bd05cb4d": "createContractItem(string)", +"bd06aa84": "WithdrawalContract()", +"bd06e777": "SCORE_REPORT_START_TIME()", +"bd075b84": "mint(address[])", +"bd079484": "getmortiesSinceLastHatch(address)", +"bd079a18": "YTPAY(uint256,string,string)", +"bd088724": "mintDone()", +"bd097e21": "fundContract()", +"bd09f117": "eidooWallet_()", +"bd0a0e85": "setLeaderboard(uint256,uint256)", +"bd0ae405": "voterReward(address,uint256)", +"bd0af85d": "pay(address,address)", +"bd0b65e4": "sub_id(string,uint256)", +"bd0c6307": "contrExit(uint256[])", +"bd0cac13": "updPool(uint8,uint256)", +"bd0cc4ee": "reverseSplitTokensAfterDistribution(uint256)", +"bd0e5d07": "deposit4()", +"bd0e6a0f": "startICO(bool)", +"bd0fda3d": "EntityCount()", +"bd102430": "blacklister()", +"bd102993": "CurrentStageUpdated(uint256)", +"bd119967": "add_rating(uint256,uint256)", +"bd11e933": "wingsTokenRewardsPercent()", +"bd129b92": "batchFillOrders(uint256[],bytes[])", +"bd12a007": "InterfaceId_ERC721Metadata()", +"bd131a78": "firstAuctionsExtendableDuration()", +"bd149031": "LongToken(uint256,string,string,uint256)", +"bd14fe3e": "hasOwnerAccess(address)", +"bd153c64": "emitted()", +"bd15e9ab": "hasMinBudget(address,uint256,uint256[])", +"bd1607ed": "HashRush(string,string,uint8,uint256)", +"bd16deaa": "ownerSetMaxBet(uint256)", +"bd16f1f3": "unfreezeByIndex(uint256)", +"bd1723e5": "blackBox()", +"bd17647f": "changeMilestone(uint8,uint256,uint256)", +"bd17a9d8": "blockAccess(address,bytes32)", +"bd17d63a": "TokenStorageContract(address,address,address[],uint256,uint256,string,string,uint8)", +"bd183430": "ArtIs()", +"bd185612": "changeCertificateHash(address,bytes32,uint256)", +"bd187e3b": "changeParticipationFeeForRaz(uint256,uint256)", +"bd189666": "DetailedERC20Mock(string,string,uint8)", +"bd19036a": "investmentCapIcoPhaseTwoPounds()", +"bd1954c6": "ownerToBooty(address)", +"bd1a77a8": "sellNac(uint256,address,uint256)", +"bd1ad05c": "LogRecoveryChanged(address,address,address)", +"bd1b324c": "NewMyToken()", +"bd1b768b": "getApprovedAddressesOfList(address[],address)", +"bd1baedb": "SignumToken()", +"bd1bca06": "_getCrabData(uint256)", +"bd1d3432": "FOUNDER_ADDRESS1()", +"bd1de900": "totalOffer()", +"bd1edd81": "acceptDeposits(uint256[],uint256[],uint256[],uint256[])", +"bd1f4b52": "withdrawErc20(address,uint256)", +"bd1f7d52": "GetBoosterData()", +"bd1fac00": "TOKEN_COMMUNITY()", +"bd218493": "tokenLimitPerWallet()", +"bd21a864": "DigitalTradingCoin(address)", +"bd21fa47": "accountBalances()", +"bd22b1cb": "millionDollarTokenReward()", +"bd22d07f": "getTankByTokenId(uint256)", +"bd22f1cd": "testSubmitHash()", +"bd2302fc": "transferProposal()", +"bd23076f": "LamboToken()", +"bd23eb39": "tokenFallback()", +"bd242709": "initBob(uint256,uint256)", +"bd249ff0": "lockedBoardBonusAddress()", +"bd24b0d0": "ZHORA()", +"bd24de29": "blockDuelBegin()", +"bd24f08a": "isInBalanceLimit(address,uint256)", +"bd2560a0": "_inverseGetTokenAmount(address,uint256)", +"bd262a20": "setAuthority()", +"bd272880": "OnUpdateFee()", +"bd2850ab": "Freeze(address,address,uint256,uint256,string)", +"bd285ea8": "ReferedCrowdsale()", +"bd28d688": "TFOA(uint256,string,string)", +"bd28f504": "_computePet(uint256,uint256,uint256)", +"bd290d8b": "isValidLenth(string)", +"bd295f30": "GoodTronToken(address,address)", +"bd2b4ab7": "DigitalContentsToken()", +"bd2b6444": "adminUpdateWhiteList(address,address,bool)", +"bd2c0ead": "removeHolder(address,uint256)", +"bd2c245e": "privateIcoFinalized()", +"bd2cef65": "callback_ForPayout(bytes32,string,bytes)", +"bd2deecb": "create(bytes32,address,address[],address,bytes32)", +"bd2fffb3": "FlipNA()", +"bd3124e0": "addToBank()", +"bd320dde": "firstSaleDelivery(address,uint256)", +"bd322b77": "enableApi(address)", +"bd32aa44": "initiateSelfDestruct()", +"bd336584": "first_release(uint256)", +"bd338d85": "yearOneMultiplier()", +"bd33cc91": "requestRefundContributor()", +"bd345ed9": "setETH(string,uint256)", +"bd353ce2": "withrawDev()", +"bd355f43": "amountOfBags()", +"bd3566b7": "generateToken(address,uint256,string,string)", +"bd35d570": "GAS_TO_COMPLETE_EXECUTION()", +"bd366ddc": "reclaimEthicHubTeamFee()", +"bd36a5cd": "updateSaleStatus()", +"bd36c881": "bytesToAddress(bytes,bytes)", +"bd36cc93": "burnCancel(address,address)", +"bd37fec9": "Protean()", +"bd382b45": "getWindowAdjRatioForGameId(uint256,bool)", +"bd3a2ef4": "updateOdds(string,uint256)", +"bd3a5208": "getOraclizeRoundGasFee()", +"bd3a9d3c": "_createAuction(uint256,string,uint256)", +"bd3b5d07": "m_pending()", +"bd3bef41": "NewLeader(uint256,address,uint256,uint256)", +"bd3ccfc9": "getWeeklyTransactionVolumeSending()", +"bd3ce132": "transferManually(uint256,address)", +"bd3d0ecb": "newName(string,string)", +"bd3e19d4": "getCost()", +"bd3e7401": "setupSale(uint256,address)", +"bd3f0965": "AiraEtherFunds(string,string)", +"bd3f7817": "DaysToDestroy(address)", +"bd3fe562": "getRadarsIds()", +"bd4074f9": "tokensForCrowdSale()", +"bd431462": "BuyBSTtokens()", +"bd45115c": "PGPToken()", +"bd457de2": "KAPcoin(uint256,string,string)", +"bd478fcb": "readFromCart(address,uint256)", +"bd47c1a2": "getAccountListLenght()", +"bd47dd7a": "lockSeedInvestors()", +"bd484606": "techWallet()", +"bd48fa0e": "unpause_3()", +"bd499af3": "updateOptionsRegistryAddress(address)", +"bd49f00f": "ownersTokenList(address,uint256)", +"bd4a359d": "getLatestVersion(bytes32,bytes32)", +"bd4b6bbd": "transferScoupons(address,uint256)", +"bd4bb67e": "transferTokensFromKingWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"bd4c0755": "Test68()", +"bd4cfadf": "getownerInfo(address)", +"bd4dc024": "landRegistry()", +"bd4e0b4d": "REFERRAL_TOKENS()", +"bd4ed6cc": "sumHardCapPreICO2()", +"bd5021af": "startRecovery(address)", +"bd5034ff": "Redeem(address,uint256,uint256,uint256)", +"bd50b3b4": "transferAndLock(address,uint256)", +"bd513bea": "getTreasure(bytes32)", +"bd51525e": "typeOf(address,uint256)", +"bd51654b": "showMyEtherBalance(address)", +"bd516e04": "addCombat(uint128,uint128,bytes32)", +"bd5196cf": "createGame(string,string,uint256,uint256,string,address,uint256,string,bytes32[2],bool,string)", +"bd51d5d0": "hasBalance(address,uint256)", +"bd51fa4c": "propose(string,string,string)", +"bd527527": "setLLV_edit_13(string)", +"bd52d81a": "_emitRoleRemoved(address,uint8)", +"bd5304e3": "ContributorBalanceChanged(address,uint256)", +"bd53cb96": "changeUnitsUserCanBuyLimit(uint256)", +"bd541ad0": "depositEscapedFunds()", +"bd545f53": "cancelAllOrders(uint256)", +"bd54bced": "LogN_fnc(address,bytes32,uint256,string,bytes,uint256,bytes1,uint256)", +"bd550824": "_setPayTo(address)", +"bd556252": "PRE_ICO_PERIOD()", +"bd58118f": "allocateAngelTokens(address,uint256)", +"bd5821ca": "_refund(address)", +"bd5821f1": "changeActualTokenValue(uint256)", +"bd583bff": "registerManager(address,address)", +"bd59434d": "setGame(uint8,address)", +"bd59fdde": "ITube()", +"bd5acbd6": "continueOrder(uint128,uint256)", +"bd5ae945": "NodeSwapCrowdSale(uint256,uint256,uint256,uint256,uint256,address,address,address,address,address,uint256)", +"bd5b758d": "ObtainChip(uint32)", +"bd5b948d": "CCH_ILOW_1()", +"bd5c4e24": "TIMEOUT_DESTROY()", +"bd5c5420": "setExchangeRate(address,uint256)", +"bd5ca3a3": "createProxyImpl(address)", +"bd5d7b1d": "FEELCOIN()", +"bd5dec98": "withdraw(address[])", +"bd5e3a80": "GPPHARMTOKEN(uint256,uint256)", +"bd60527b": "getEmployerContracts(address,uint256[],uint256[])", +"bd611c73": "TOTAL_ICO_TOKENS()", +"bd61ff75": "cmpn(uint256,uint256)", +"bd6206ec": "initialDayWithdraw(uint256)", +"bd621042": "setUnownedPriceInExoTokens(uint256,uint32)", +"bd623d68": "encodeData(uint128,uint256,uint24,uint40,uint32)", +"bd625f1b": "setend(uint256)", +"bd62fff3": "Nines()", +"bd632e10": "batchInvest(address[],uint256)", +"bd633642": "MeissaChallengeToken()", +"bd639259": "getOwnerAngelCount(address)", +"bd63c338": "canRecover(uint256)", +"bd646356": "calculateCommissionToWithdraw(uint32)", +"bd6501b1": "isValidator(uint64,address)", +"bd656daf": "Fomo2D()", +"bd659784": "addToList(address)", +"bd65fc4c": "stb()", +"bd66528a": "claim(bytes32)", +"bd675c0e": "revealMove(uint256,uint8,string)", +"bd679ab2": "WithdrawGains()", +"bd679ad6": "burnDragons(uint256)", +"bd6812a4": "lastBlock_a0()", +"bd684865": "getAuthByPhone(string)", +"bd68817f": "clearRAMAll()", +"bd68eb34": "_spawnAxie(uint256,address)", +"bd6a9abb": "hasClearingPrice(address,bytes32)", +"bd6bbc31": "lastCollection()", +"bd6bf475": "canUpdateCompany(string,address)", +"bd6c4661": "fetchCancelledOrdersForPayer(address)", +"bd6c6756": "cardsCount()", +"bd6cac4f": "isPriorPack(address)", +"bd6d894d": "exchangeRateCurrent()", +"bd6de5a3": "dNextOffer()", +"bd6e578a": "getPreSaleFund()", +"bd6e5e03": "calcICO(uint256,uint256,uint256)", +"bd6edba5": "getUserBalances()", +"bd6fd20d": "getDeedTimestamp(string)", +"bd7084b2": "getNextNonce()", +"bd7095db": "GetCompetitionFunds(uint32)", +"bd70c53a": "LYFToken()", +"bd70fce9": "getApprenticeDistributedRandom(uint256)", +"bd7162b6": "setPixelPrice(uint16,uint16,uint256)", +"bd7173dd": "addLuckyblock(uint256)", +"bd719336": "canDistributeReservedTokens()", +"bd71e476": "ownerSetMinBetMining(uint256)", +"bd7243f6": "wipeBlacklistedAccount(address)", +"bd725f6e": "UBSToken()", +"bd728083": "ShowPurchased(uint256,address,address,uint256,uint256)", +"bd733dfb": "getUintsOwnerCount(address,address)", +"bd739a2f": "existsManagedContract(uint256,address)", +"bd73a9b4": "setTime4(address,uint256)", +"bd7427f8": "forceRefund()", +"bd7474ca": "upgradeDeploymentAdmins(address)", +"bd74c4e7": "setAttribute(address,address,bytes32,bytes,uint256)", +"bd74dc9d": "servicePaymentWithCharityPercentage(address,uint256)", +"bd763f59": "addPlayerData(uint256,uint256,string,uint256,uint64,uint64,uint64)", +"bd76540a": "buyIn(uint8,uint256)", +"bd76bf19": "addToBuyList(uint256,uint256)", +"bd778fde": "CoinNext()", +"bd77ac2c": "disburse(uint256)", +"bd780d0d": "getLastAttack(uint256,uint256)", +"bd788c88": "allocate(address,address,uint256,uint8)", +"bd792db3": "setIcoAddress(address)", +"bd797e32": "ChangeEmployeeState(address,uint8,uint8)", +"bd79a42a": "decimalToPreciseDecimal(uint256)", +"bd79d692": "depositEtherToVault(uint256)", +"bd7a9fda": "nameRegistry(address)", +"bd7afb29": "lastBlock_f17()", +"bd7b09e4": "totalCitizens()", +"bd7b7849": "addFace(string,string)", +"bd7be110": "SaveCoin()", +"bd7c13c6": "phase1MaxEtherCap()", +"bd7d2789": "checkWinner(uint256,uint8,bytes32)", +"bd7d3836": "pauseCrowdSale()", +"bd801ed4": "yishiliToken()", +"bd80d449": "newOK()", +"bd812166": "getSeasonInfo(uint32[99])", +"bd815a10": "RecyclerToken(uint256,string,string)", +"bd820688": "numOperators()", +"bd826f2b": "currentnumber()", +"bd837b2b": "approveToPullOutTokens(address,address,uint256)", +"bd83ea8d": "createMarriage(string,string,string,string,uint256)", +"bd84d8f6": "ProgressiveIndividualCappedCrowdsale(uint256,uint256)", +"bd853960": "assertEq14(bytes14,bytes14,bytes32)", +"bd85530c": "getAllSuccessInvestmentsCollected()", +"bd858288": "orderMatch(uint256,uint256,int256,uint256,uint256,address,uint8,bytes32,bytes32,int256)", +"bd85948c": "startNewRound()", +"bd85aac5": "getAllShareholdersAndShares()", +"bd85b039": "totalSupply(uint256)", +"bd85e163": "FOURTH_USER_CUT()", +"bd865d29": "end_auction()", +"bd8697ab": "makeFailed(bool)", +"bd88a04f": "p3dWithdrawForAdmin(address,uint256)", +"bd88f603": "setImageData(address[16],uint256,uint16,uint256[])", +"bd897671": "KYRIOSToken()", +"bd89d806": "y_Title()", +"bd8a79d5": "getFollowingCandidate()", +"bd8aa780": "whitelist(address[])", +"bd8b452e": "eatUnicorns()", +"bd8c1d33": "checkTransferFromToICAPWithReference(address,bytes32,uint256,string)", +"bd8c5643": "disableMoving()", +"bd8caabf": "setVirtualReserveBalance(uint256)", +"bd8cb6ca": "removePlugin(address,address)", +"bd8d34f5": "fundForTeam()", +"bd8d585e": "NCO()", +"bd8d5c7f": "EtherCartel()", +"bd8d5ce3": "amountReservedTokens()", +"bd8d86c4": "getlevel(uint256,uint256)", +"bd8d92c3": "requestDiplomaEntry(uint256,uint256)", +"bd8e0905": "weiToToken(uint256)", +"bd8e4725": "IxiniumFT()", +"bd8e4a51": "getCAORatio()", +"bd8e68c9": "PRICE_STAGE_FOUR()", +"bd8f61d8": "PerfectCoin()", +"bd8f997c": "getTotalQtyIpfsAddresses()", +"bd902dad": "approveSingleUser(address)", +"bd90df70": "targetContract()", +"bd916452": "claimReferrerBonus()", +"bd9215f4": "highest_bidder()", +"bd9335c0": "scheduleHangouts()", +"bd93f493": "LAUNCH_DATE()", +"bd945430": "OUTINGRESERVE()", +"bd94b005": "cancelSale(uint256)", +"bd94fafc": "PRESALE_CAP()", +"bd952178": "rejectAllocation(address)", +"bd95264c": "store(address,address,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"bd957585": "declareCrowdsaleEnd()", +"bd95b1f2": "getdays()", +"bd95d909": "sellTokenPerEther()", +"bd95f042": "sendRemainsToOwner()", +"bd963442": "handleRefundRequest(address)", +"bd965677": "setRelayed(address)", +"bd968eed": "runeToWeiRatio()", +"bd96b348": "GeBitToken()", +"bd97ce3a": "changeReferrer(address)", +"bd987008": "setAccountIsNotFrozenForReturn(address,bool)", +"bd991fc5": "setGroupRight(string,string,bool)", +"bd9934f1": "freezeAddress(address,uint256)", +"bd993f9e": "COREthExchangeRate()", +"bd998dc8": "CloseSale()", +"bd9a0158": "setTimeConstants(uint256,uint256)", +"bd9a11fd": "finalstate()", +"bd9a548b": "getPrices()", +"bd9a5673": "oraclize_query(string,string[5])", +"bd9b49b7": "goalCompletedBlock()", +"bd9b6d86": "confirmOwner()", +"bd9b6e85": "tokenTranslate()", +"bd9c33bc": "_discount(uint8)", +"bd9c5688": "distributeFee(uint256,address)", +"bd9ca422": "AIChain(uint256,string,string)", +"bd9d6b37": "AddNewPresalePackage(uint16,uint256)", +"bd9d6d7f": "memeData(uint256)", +"bd9e6bfc": "makeBuyOffer(uint32)", +"bd9ead1f": "calculateClaimableReward(address,address)", +"bd9ebfbb": "marketSellOrdersNoThrow(uint256,bytes[])", +"bd9ec492": "maximumEther()", +"bd9ef436": "witnessOf(uint256)", +"bd9f8917": "finalizeEnableRefunds()", +"bd9fbe7b": "getDefaultAQL()", +"bda00866": "getAmountOfUnlockedTokens(address)", +"bda02782": "b(address)", +"bda1504b": "currentSize()", +"bda1f35e": "Fleuth()", +"bda2aa53": "testUnsyncedRate()", +"bda2e692": "DinosaurFarmerNew()", +"bda330f7": "refundingStarttime()", +"bda393d3": "totaldividends()", +"bda4cf80": "_pfind(address)", +"bda4fd89": "totalItem()", +"bda5c450": "calculateDividendTokens(uint256,uint256)", +"bda5ea03": "tkwins()", +"bda6642c": "changeStartingPricesLimits(uint256,uint256,uint256)", +"bda6c497": "borrowerReturnDate()", +"bda70d92": "destroyOldCoins(address,uint256,string)", +"bda77531": "changeAdultDragonStage(uint8)", +"bda7c3ee": "delegateTransfer(address,address,uint256,uint256)", +"bda81086": "jsonRead(string,string)", +"bda8bf45": "getWitnessWeiCost()", +"bda9a055": "getStepsCount(uint256)", +"bda9b45c": "whitelistMe(uint128,uint8,bytes32,bytes32)", +"bdaa80c1": "TronX()", +"bdaacabd": "buyXname()", +"bdaacbbe": "calculateAdminFee(uint256)", +"bdaae1e7": "createGame(uint256,uint256,uint256,uint256)", +"bdab5fb0": "fishLocation(bytes32)", +"bdace3de": "ChessClubLiveChessCoin()", +"bdad3db2": "_mintTo(address,uint8,uint256)", +"bdad4dc3": "allocate(address[],uint256[])", +"bdad8112": "hashArguments(address,uint40,uint40,uint128,uint256)", +"bdaeb0a0": "m_GameHidden()", +"bdaf2fae": "timeBought(uint256)", +"bdaf78fb": "refundUser(bytes32,bytes32)", +"bdafcda9": "logClassic(string,address)", +"bdb001a7": "mana()", +"bdb00fb9": "blackjack(uint256,uint256,address)", +"bdb084b2": "startCrowdsaleY1(address)", +"bdb10825": "MOOVIN(uint256,string,string)", +"bdb15209": "getNewPrice(uint256,uint256)", +"bdb27170": "setLockinManagerAddress(address)", +"bdb2e597": "TheBestToken(uint256,string,uint8,string)", +"bdb337d1": "gameOver()", +"bdb4dc6e": "getBrickSize()", +"bdb4f321": "balanceOfStocksAt()", +"bdb57edc": "TokenRedeem(address,uint256)", +"bdb5daf5": "OvisAddress()", +"bdb66236": "pushDividends()", +"bdb6bce8": "livingSupply()", +"bdb81203": "newGrant(address,address,uint256,uint256,uint256,uint256,bool)", +"bdb9c11f": "transferTokensFrom(address,address,uint256,uint256)", +"bdb9f28d": "setPresaleAddress(address)", +"bdba9255": "getCounterLimit()", +"bdbaae63": "mint(int256)", +"bdbb829d": "haltICO(address)", +"bdbbf429": "escrowHistory(address,uint256,uint256)", +"bdbbfcad": "stageAmount()", +"bdbcd001": "testSetValidProvider()", +"bdbcd192": "PowerEnabled(address,address,address,address)", +"bdbed722": "getAllTokenIds()", +"bdbf3a2c": "addBenefactor(uint256,address,string,string)", +"bdbf40a9": "Certify(address,uint256)", +"bdbf7d4c": "DELETE_NAME_ROLE()", +"bdc056c0": "BanknadToken()", +"bdc06de4": "SGTExchanger(address,address,address)", +"bdc0ba8e": "disableMaintenance()", +"bdc0f93c": "node_count(uint256)", +"bdc2866e": "MasterMindAlliance()", +"bdc2f1e8": "multivestBuy(address,address,uint8,bytes32,bytes32)", +"bdc31ce8": "Roto2coin()", +"bdc33928": "placeIndexToApproved(uint256)", +"bdc441b2": "getItemCount(uint256)", +"bdc4843a": "lockAddressAfterITO(address,address)", +"bdc6d9ab": "schedules(uint256)", +"bdc742fc": "updAcceptDonate(bool)", +"bdc74e23": "_processTokensAssgin(address,uint256)", +"bdc850d6": "ALasser()", +"bdc8e551": "isICOOver()", +"bdc95b32": "registerIdentity(string,string,string)", +"bdc963d8": "getUIntValue(bytes32)", +"bdc99152": "Token_1_Balance(address,address)", +"bdcab795": "addBeneficiary(address,uint256,uint256,uint256,uint256,bool)", +"bdcafc55": "setSaleFee(uint256)", +"bdcbd9d1": "howMuchCanXContributeNow(address)", +"bdcbda5c": "AccountTransfersThawed(address,bool)", +"bdcc3439": "add_master(address)", +"bdcc809a": "setReleaseCompany(uint256,bool)", +"bdccd1af": "TokenHolder(uint256,address)", +"bdcd0262": "addRecord(bytes32,bytes32,bool)", +"bdcd21a1": "spawnRaceManual(uint256,uint256,bool)", +"bdcd3071": "LogBonusLOTRedemption(address,uint256,uint256)", +"bdcdc0bc": "updateTotalAvailable(uint256,uint256)", +"bdcdc258": "transferAllowed(address,address,address,uint256)", +"bdce46be": "PriceIncrease(string,uint256,address)", +"bdced258": "VendCrowdsale(uint256,uint256,uint256,address,uint256)", +"bdceed0b": "gvToken()", +"bdcefb62": "FRST_CRWDSALE_RATIO()", +"bdcf49b5": "changeContractStatus(address,bool)", +"bdcfbc37": "ANMInflationVesting()", +"bdd079fc": "addManyToWhitelist(address[],uint256[],uint256[])", +"bdd088e9": "littleMonster()", +"bdd1de62": "delWhitelists(address[])", +"bdd2ae24": "add(bytes,int256,uint256)", +"bdd2d286": "drawPlayer(address,address)", +"bdd30406": "successfulWithdraw()", +"bdd36562": "getBonusByAddressAndIndex(address,uint256)", +"bdd3abd9": "MjolnirWebsite()", +"bdd3fea0": "set_for_sale(uint256)", +"bdd41d4c": "ParagonCoinToken(address)", +"bdd50908": "approveWithdrawAddress()", +"bdd5be2f": "performBuy(address[8],uint256[6],uint256,uint256,uint8,bytes32,bytes32)", +"bdd5f8da": "weiPerSgd()", +"bdd62b7b": "defective(bytes32,uint256)", +"bdd75267": "OPULENCE()", +"bdd7908b": "getFishParams(uint256,uint256,uint256,address)", +"bdd7c220": "CryptessaLiquidCoin()", +"bdd83add": "isAllocated12()", +"bdd8a366": "g1()", +"bdd8f051": "SmartOToken()", +"bdd9f4e7": "batchInnerTransfer(address[],address[],uint256[],uint256)", +"bddac117": "SetAmount(string,uint256)", +"bddae40e": "setCommittee(address)", +"bddb7c83": "setUserBlacklisted(address,bool)", +"bddba4eb": "grantRole(address,string)", +"bddbe244": "get_vice_pic(uint8)", +"bddcfead": "MakeWinner(address,uint256,uint256)", +"bddd0abd": "ExampleToken(uint256)", +"bddd1e7e": "WITHDRAWAL_END_TIME()", +"bddd3202": "_tryTriggerPayout(uint16,uint256)", +"bddd3a6b": "step7()", +"bddefc06": "withdrawed(address,uint256,string)", +"bddf66ff": "claimMigrate()", +"bde18839": "OHGVientiane()", +"bde1f585": "endCrowdsalel()", +"bde236a5": "checkClaimEntitlement()", +"bde27f4a": "forwardToHotWallet(uint256)", +"bde2ddf2": "_forwardFunds(address)", +"bde4e7c2": "tokenAddFee()", +"bde5c4a2": "_stealCardWithId(uint256)", +"bde60ac9": "donate(uint64,uint64)", +"bde66362": "_createNinja(uint256,uint256,uint256,uint256,address)", +"bde6a5a9": "burnPrice()", +"bde7ef86": "SynTokenCrowdsale()", +"bde7fa7d": "removeWhiteListed(uint256)", +"bde842ac": "getJobStatus(uint256,uint256)", +"bde86dd1": "tokenExpirationTime(uint256)", +"bde8a93e": "setBankroll(address)", +"bde8c509": "mintIdentityTokenDelegated(address,address,uint8,bytes32,bytes32)", +"bde8cd4d": "icoPool()", +"bde97455": "SCRefundVault()", +"bdeb130c": "doPayment(uint256,uint256,address)", +"bdeb45b8": "expireIfNecessary()", +"bdeb9fb4": "tokensAvailableForSale()", +"bdec5cce": "LotteryRoundCompleted(bytes32,uint8,bytes4,uint256)", +"bdeddb45": "setMyICOContract(address)", +"bdee21ff": "test_oneValidAssertFalse()", +"bdef744b": "PriceTwoDisable()", +"bdf1211e": "getPercentBurn()", +"bdf1e7cf": "getProviderReward(address,uint256)", +"bdf27b50": "setPOOL_edit_21(string)", +"bdf2a0f5": "fundDaoFor(uint256,uint256)", +"bdf3390e": "checkPwnData()", +"bdf384a8": "peekUpdated()", +"bdf391cc": "getPair(uint256)", +"bdf3c4ae": "stock()", +"bdf44067": "TCASHx()", +"bdf499e1": "DappHunt()", +"bdf4bb73": "DatToDtrcNumerator()", +"bdf4e7c6": "TaskRegister(address,address,address)", +"bdf5fba1": "COMMUNITY_POOL_ADDR()", +"bdf63c15": "RSPLT_F()", +"bdf692f4": "Propersix()", +"bdf6fb56": "requestMilestonePayment(uint256)", +"bdf70087": "getInvestor(bytes32,uint8)", +"bdf70de1": "SportXToken()", +"bdf7220f": "getFinalTeams()", +"bdf75a6a": "PRICE_RATE_FIRST()", +"bdf7716d": "getNodeHeight(bytes32)", +"bdf79c9d": "Adapter(address,address,address)", +"bdf7a8e6": "airdrop(uint256,address[])", +"bdf7f22f": "puremail()", +"bdf82b2a": "killFrost()", +"bdf86a66": "give(address)", +"bdf88d34": "stopTest()", +"bdf944b3": "depositAffiliate(uint256)", +"bdf99bd4": "AntPetTempleToken()", +"bdf9f646": "disApprove(address)", +"bdfaa337": "totalAlloc()", +"bdfb481d": "ABDEL_ALLOCATION()", +"bdfbab66": "getReferals(address)", +"bdfc0522": "investBounty(address,uint256)", +"bdfd582b": "FailClosedVault(address,address,uint256,uint256,address,uint256)", +"bdfd6257": "settingNameExist(string,address)", +"bdfdb519": "accept(string,uint256,uint16)", +"bdfdbf56": "read_u16_array()", +"bdfe7d47": "addresses(string)", +"bdff85cf": "ArrAccountIsNotFrozenForReturn(uint256)", +"bdff9fca": "checkTotalPaid()", +"bdffd282": "SIZE()", +"be0043bc": "removeMinterByIndex(uint256)", +"be007380": "DapdapNiubi()", +"be01bc87": "carTaxiCrowdsaleAddress()", +"be02bc3c": "internalTransfer(address,address,uint256,uint256)", +"be030bd8": "_setToken(address)", +"be038478": "createPermission(address,address,bytes32,address)", +"be03c602": "test_get()", +"be040fb0": "redeem()", +"be041614": "storedDataInBytes()", +"be048d04": "getOrganizationalCertAddressByID(string)", +"be0522e0": "inflation()", +"be063693": "intermediadorAprovaPagamento(bool)", +"be0638e4": "WealthShare()", +"be06ae25": "VirsymCoin()", +"be06e4e8": "inheritedConstant()", +"be08728f": "_setRemovalPrice(uint256)", +"be08d744": "TFcoin(uint256,string,string)", +"be099e7d": "endICOs()", +"be0ad4d1": "calculatePayoutVariables()", +"be0ca01b": "resetChallenge(uint256)", +"be0d4da4": "produceLottoNumber(uint256,uint256)", +"be0da251": "CANCELLED_FEE_FLAG()", +"be0e9d75": "removeWorker(address,address)", +"be0ecd32": "synthInitiatedExchange(address,bytes4,uint256,bytes4,address)", +"be0f0a50": "setPriceStep5(uint256)", +"be0f27cf": "rejectBountyTransfer(address)", +"be0f6bcb": "End10()", +"be104849": "AutorizeRefund()", +"be10862b": "partner()", +"be10c33d": "LogOperatorRem(address)", +"be116c3b": "removeProxy(address)", +"be11ce2f": "minEthContribution()", +"be1271c4": "setPrice(uint8)", +"be140381": "firstEntranceToSaleStateUNIX()", +"be14e5fc": "ETH530on420()", +"be154a18": "Partial8Transfer()", +"be160a92": "ERC20token(uint256,string,uint8,string)", +"be162060": "validCrowdsale()", +"be163d75": "validPurchase(uint256)", +"be165566": "setTokenBankrollAddress(uint8,address)", +"be169856": "getOriginByIndex(uint256)", +"be16dccd": "tomoDeposit()", +"be177c6a": "addJoinAirdropQuest(address)", +"be17a8b1": "doCustomAirdrop(address,address[],uint256[])", +"be17be5d": "total_minted()", +"be189035": "modifyIndividualCap(address,uint256)", +"be18a08b": "finishUpRound(int256,string)", +"be190032": "timespan()", +"be19d926": "Britishcoin()", +"be1abba5": "payoffAmount()", +"be1b7b4c": "FIRST_UNLOCK()", +"be1c766b": "getLength()", +"be1eefbf": "hotStore()", +"be1ef5c1": "approveWithdraw(address,address)", +"be1faaaf": "depositCoupon(address[2],uint256[7],uint8,bytes32[2])", +"be1ff08b": "sbtToken(address)", +"be20d298": "AxiePresale()", +"be20f9ac": "getSlotInfo(uint256)", +"be213c2d": "startBoughtExit(bytes32[],uint256,bytes32[])", +"be220272": "houseWithdraw()", +"be22f546": "daiToken()", +"be22f6aa": "LUYOCrowdsale()", +"be23d291": "requestPrint(address,uint256)", +"be241871": "isTxExist(bytes32)", +"be2430fe": "sendValues()", +"be25270f": "hash(string,uint256)", +"be25d0ce": "buyerCapHighEther()", +"be2671c9": "getUserBonusBalance(address)", +"be26733c": "Kill()", +"be268c3f": "batchSubmit(address[])", +"be275680": "submissionOpen(uint256)", +"be27b22c": "claim(bytes,bytes)", +"be2863ab": "addWalletsToWhitelist(address[])", +"be28f5db": "makeTokens()", +"be29184f": "mint(address,uint128)", +"be292552": "setMintAddress(address,address)", +"be297530": "Coinname()", +"be29783f": "commitVoteOnSpecialProposal(bytes32,bytes32)", +"be29d81f": "BRL_Omnidollar()", +"be2a2ff2": "getAccountBlockedFunds(address)", +"be2b1047": "hodlerTimeStart()", +"be2b5996": "designateAdmin(address,address)", +"be2d8b2d": "PowerToken()", +"be2dbe21": "Raffle()", +"be2dcd6c": "buyMFCoins(address,uint256)", +"be2eaad4": "expectedFunds(uint256,bool)", +"be2ef9f0": "secondWalletPercent()", +"be2f3059": "RcdGet()", +"be2fd146": "addMultiRequest(address,uint256,uint256,address)", +"be2ff4a9": "withdrawBank(uint256)", +"be30eda8": "transferAndLock(address,address,uint256)", +"be30f0a6": "setPurchaseLimits(uint256,uint256)", +"be317e7e": "ICOReserveLockUp()", +"be31b600": "CART()", +"be31ffed": "AOSToken()", +"be32cf8d": "mix()", +"be32eeba": "getFishIdByPos(uint256)", +"be3400b8": "CharityCashCoin()", +"be34dab3": "addBrick(string,string,uint256,string,bytes32[])", +"be354949": "setReservesForExchangeTokensWallet(address)", +"be35525d": "setPlayerAffID(uint256,uint256)", +"be357616": "withdrawFee(uint256)", +"be361f60": "retrieveChange()", +"be363e36": "sendMoneyBack()", +"be36e676": "Set(bytes32,bytes32)", +"be38e241": "activations()", +"be3912fa": "registerProduct(uint256,uint256,uint256,bytes,bytes)", +"be3945e4": "getFee(address,address,uint256)", +"be395cd5": "setPoliticsForJackpotParticipantsList(bool)", +"be3c33f4": "ZeroXCoin()", +"be3c8488": "previousStageIsFinalized()", +"be3c92a6": "setLimitTokenPurchase(uint256,uint256)", +"be3ca849": "getFunding(address,uint256)", +"be3cbb04": "iWantXJade(uint256)", +"be3daf55": "shouldLiquidate(bytes32,address,address,address,address,uint256,uint256,uint256,uint256)", +"be3dd131": "migrateFunds(address[])", +"be3dedae": "changeOwnership(string,uint256,uint256,address,address)", +"be3e33d5": "play(bytes1)", +"be3e41b1": "bonusFirstTwoDays()", +"be3eac25": "WithdrawEnabled()", +"be3ee935": "addClient(string,string,string,string,uint256,uint256,uint8,uint8)", +"be3f3471": "total_trades()", +"be3f34a1": "collectIncome(address)", +"be400cad": "KudosToken(string,string,string,uint8,address)", +"be4054b9": "commitReading(address,uint256,uint256,string)", +"be40887d": "sumDepth(uint128)", +"be408a5f": "winner_percentage()", +"be410448": "getERC20Id(uint256,address)", +"be427b1c": "setFinderFee(uint256)", +"be4299a6": "Maxsupply()", +"be4413fc": "Donator3()", +"be4474b4": "processFee(uint256)", +"be44e2d6": "getdeptreqscount()", +"be457017": "validateRefundSignature(uint8,bytes,address)", +"be45a26f": "variables()", +"be45af43": "InnovateToken()", +"be45cdb8": "crowdsaleTokenBalance()", +"be45d47e": "whitehatRecover()", +"be45fd62": "transfer(address,uint256,bytes)", +"be46203e": "Claim_TRAC_900()", +"be4663a1": "vestContract()", +"be46b94c": "ROLE_KNOWN_ORIGIN()", +"be46bffb": "verifyLottery(uint8,bytes32,bytes)", +"be46e9ca": "starting()", +"be46ee5f": "postNewAnswer(bytes32,bytes32)", +"be471027": "limitedSale()", +"be47dca1": "getNumberOfClients()", +"be482cc2": "getCurrentLotteryJoiners()", +"be48acc4": "MAX_PERSIANS()", +"be48d81e": "team_accounts(uint256)", +"be490a04": "Banned(address,bool)", +"be494573": "pureBalanceOf(address)", +"be4951e4": "setBroker(address,address)", +"be4a0910": "sendTokensSale(address,uint256)", +"be4a0b11": "preAssign(address)", +"be4a471c": "memoryFactor()", +"be4a6bad": "newOrder(address,uint256,uint256)", +"be4a7160": "closeDistribution(bool)", +"be4a90eb": "GoramCoin(uint256,string,uint8,string)", +"be4aba09": "tokenR6()", +"be4b1772": "withdrawToken(uint256,address)", +"be4bb31a": "WAmlingCoin()", +"be4c3a0c": "getContractOwner(string)", +"be4c45d5": "changeBuyingPrice(uint256)", +"be4c9e96": "TRONIC()", +"be4cbafd": "RichGoldToken()", +"be4cc281": "ManagerUpdate(address,address)", +"be4ce05c": "JULY()", +"be4d06cc": "setLLV_edit_16(string)", +"be4dbb5e": "getInvestorByValue(address)", +"be4dbe26": "getBlocklancerContractHolder()", +"be4ea54d": "setDeveloper(string,uint256)", +"be4eb0e9": "getUserFromId(uint256)", +"be4ebda3": "BOUNTY_SHARE()", +"be4f4fdf": "restrictedShare()", +"be50af2e": "tokenWithdraw(address,uint256)", +"be519862": "percDown(uint256)", +"be51bc0a": "FuncToken()", +"be523c23": "dungeonPreparationTime()", +"be5308ea": "BitplusToken(uint256,uint256)", +"be53874f": "emergencyFundReleased()", +"be53f968": "getPreSaleStart()", +"be54c568": "starting(uint256)", +"be54f214": "monthWithdraw()", +"be5638ff": "investor_contains(address)", +"be5648c3": "getResoType()", +"be56e037": "equipSingle(uint256)", +"be571e2e": "BigbomToken(uint256,uint256,address,address,address,address,address,address,address)", +"be571e8f": "getTokens(address,bytes32,uint256)", +"be572d52": "addItem(uint256,string)", +"be576364": "synthInitiatedFeePayment(address,bytes4,uint256)", +"be592488": "validateName(bytes)", +"be597faa": "_finishTge()", +"be59b4b1": "mostRecentCaller()", +"be5affd1": "address3a()", +"be5b9c74": "MultiSigWalletMock(address[],uint256)", +"be5babc2": "CryptoGems()", +"be5c2423": "failedVerificationSlashAmount()", +"be5df6cb": "findLover(address)", +"be5e72e0": "updateBasePrice(uint256,uint256,uint256,uint256)", +"be5ea335": "betERC20(address,bool,uint256)", +"be5eb443": "getScriptAction(bytes,uint256)", +"be5eeb2d": "getSociety(uint256)", +"be5f3d12": "allocateTokensForAdvisor()", +"be5f5a5b": "setSecretSignerByIndex(address,uint256)", +"be600276": "move(uint16)", +"be6002c2": "exec(address,bytes)", +"be6010f9": "calcHash(uint32,uint8,uint256,uint256,int256,bytes32,bytes32,uint256)", +"be60988e": "getLotteryByID(uint32)", +"be60989d": "addCard(string,uint8,string,string,string)", +"be60be76": "TokenMigration()", +"be60e771": "ZAMZA()", +"be616e83": "processAP()", +"be621764": "TradeRegister()", +"be62e98e": "MIN_PRICE_SALE()", +"be6307c8": "getDraw(uint256)", +"be6340b8": "mintedDirectly()", +"be63c8ca": "Retire()", +"be63f7b1": "TobkaCoin()", +"be640921": "regInitAccount(string,string,string)", +"be65d234": "Owner_Changed(address)", +"be65d27a": "vaultDeposit()", +"be66399f": "setOuverture_effective(uint256)", +"be676ac6": "transfer_balances(address[])", +"be67f4fd": "ActualShareManager()", +"be6872af": "totalTokensForSold()", +"be6896c3": "PropellerheadSupport()", +"be692cd3": "erase_data()", +"be6ad6d2": "ForceEther()", +"be6ae331": "get_session_state(address,uint32,uint32)", +"be6b6ba6": "getVestingStageAttributes(uint8)", +"be6c03ff": "stakedForProposal(address,address,bytes32,bytes32)", +"be6c554f": "firstCheckpointPrice()", +"be6c61f5": "unsetIdentity(address,address)", +"be6c87ad": "item(address,address,uint256,bool,bytes)", +"be6cef0a": "msgExaminer()", +"be6d055a": "proxy(address,bytes)", +"be6d91e6": "getBalanceOfSender()", +"be6fc181": "getFeeParams()", +"be71021f": "_crownFreeze(uint256)", +"be7118a7": "Dilution(address,uint256)", +"be71248a": "payWinner()", +"be737f72": "toSmallestShareUnit(uint256)", +"be7385e3": "getPlayerSpaceships(address)", +"be73983a": "reservePR()", +"be73d879": "joinBytes(bytes,bytes)", +"be74264d": "getFeePercent()", +"be74381f": "calculatePercents(address)", +"be743ccb": "MCCPP()", +"be754ba4": "buy20Price()", +"be760488": "assign(address,uint256)", +"be782f58": "setBreedTimeout(uint32)", +"be78632e": "nstDeposit()", +"be788e70": "getWithdrawableBalance()", +"be78bb7a": "transferCallGas()", +"be78e656": "buyXaddr()", +"be79ca77": "preSaleBonus3Amount()", +"be7a1540": "setlvlNfee(uint256)", +"be7a3164": "getNextAuditRequest()", +"be7aa7be": "SportStarToken()", +"be7b4858": "isOpenDistributionClosed()", +"be7c06ba": "iniOwner()", +"be7c29c1": "getNewDAOAddress(uint256)", +"be7ccd7e": "setupMiniGame(uint256,uint256)", +"be7cddf8": "TwoD()", +"be7e2848": "SkillChainContributions()", +"be7edebe": "setURIBase(string)", +"be7f5d23": "addressesReserving(uint256)", +"be7fdab1": "returnMoney(address)", +"be80073a": "SentTo(address,address)", +"be802f05": "getIcoTokensSold()", +"be80dcfd": "floatEconony()", +"be81d5bf": "CROWD_WEEK3_PERIOD()", +"be82f56b": "drainToken(address,address)", +"be82fffe": "allPolls()", +"be8360c5": "_maint_EndPromo()", +"be83a6b4": "ShitCloneslordReq()", +"be83b3c6": "LogFinishICO(address,address,address,address)", +"be83ff83": "vipRate()", +"be854def": "robPantryT(address,uint256)", +"be85bf3b": "PaymentWithdrawn(uint256,address,uint256)", +"be85cbcd": "makeLoan(address,uint256)", +"be85e4ef": "initEngineer()", +"be86d5a7": "makerTransferEther(address,uint256)", +"be86d996": "SINGLE_SALE_MULTIPLIER()", +"be87662b": "inviteProfit(address)", +"be87bcfc": "getReport(uint256,uint256)", +"be87c1ab": "returnBalance(address[2],uint256[7],uint8,bytes32[2])", +"be882d91": "setQuestionFee(address,uint256)", +"be888bd7": "devteamReserve()", +"be89900b": "PIOE()", +"be8a4737": "withdrawalT4T()", +"be8a550d": "ICO(address,address)", +"be8acd3f": "ordersLength()", +"be8b4f45": "HussyToken()", +"be8bd3df": "IlumXToken()", +"be8c1bcc": "batchDrop(address[],uint256[])", +"be8cd7b8": "participatePresaleNow()", +"be8db3cf": "deadlineBlockNumber()", +"be8dd49a": "getTokenUserCounter()", +"be8ecef3": "requestAddOwner(address,string)", +"be8eef8e": "hasOpened()", +"be8f316a": "testmsg()", +"be90be7f": "clearPoolsDone()", +"be9117cc": "curryChickenToken()", +"be912a0a": "getAyantDroitEconomique_Compte_7()", +"be913b6f": "ETH_FUND(address)", +"be916531": "test_OverSixtyPercent()", +"be91de53": "frozenBalanceOf(address)", +"be91ebe5": "tgrSettingsChangeRequest(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"be92ccfd": "setDisableBet(uint256)", +"be92f334": "astrSold()", +"be9413a7": "_cancelRole(address,address)", +"be95e01a": "payout(uint256,address)", +"be96031e": "playerinfo(address)", +"be96bb92": "_isFullOrNull(uint256,uint256)", +"be96faf7": "AWYManKeepChain()", +"be975f57": "CreateSTR(address,uint256)", +"be981ff4": "transferOwnershipForVanityURL(address)", +"be986420": "quarters()", +"be987c11": "PriceDecrease(string,uint256,address)", +"be988dbc": "BroCoin()", +"be999705": "addFunds(uint256)", +"be99a797": "setNewRegister(int256,string,string,uint256)", +"be99a980": "setAddress(bytes32,address,bool)", +"be99c50f": "purchaseInternal(uint256,address)", +"be99ed6f": "getCompte_41()", +"be9a6555": "start()", +"be9a9a28": "getRequestStatus(uint256,uint256)", +"be9aa8ac": "setSaleContracts(address,address,address)", +"be9afac7": "getDaysInMonth(uint256,uint256)", +"be9b076d": "Initialized(uint256)", +"be9b3282": "cookUpFee()", +"be9b3e8a": "reclaimEth(uint256)", +"be9ba97f": "maxContributionPerAddress()", +"be9c1add": "heldBalanceOf(address)", +"be9d89c5": "createTokenToMarket()", +"be9ddfed": "getSanTimeLastMove(uint256)", +"be9e1080": "_escrowPaymentEarning(address,bytes32,uint256,uint256,address,address,bool)", +"be9e3774": "deathData_f18()", +"be9e4697": "getDiscountTrancheDiscount(uint8)", +"be9f2dc0": "hourPotHighscore()", +"be9f7a20": "setInsertCar(bytes32,uint256,uint256,uint256,uint16,uint8,uint8,uint8,uint8,uint8)", +"be9fa8dc": "Ethex(address,address,uint256,uint256,address,uint256)", +"bea046a1": "cashOutShip(uint32)", +"bea05440": "CurrentStatus(uint8)", +"bea10370": "hasRecentPrice(address)", +"bea124a6": "query(bytes,bytes,int256)", +"bea1dcf8": "taxCollector()", +"bea24735": "create_a_new_market(address,uint256,uint256,uint256)", +"bea28a30": "undoTransferOwner()", +"bea31228": "ObirumIssued()", +"bea3c8b3": "PardusNetwork()", +"bea40bad": "composeJingle(address,uint32[5],uint32[5],string,string,uint8[20])", +"bea412fa": "RedBUX()", +"bea433a9": "TriumHolding()", +"bea4ae88": "saleDue()", +"bea4c4ee": "setIBalance4(uint256,uint256,uint256)", +"bea50ae3": "setConfirmationPeriod(uint256)", +"bea51ec2": "SunnyX()", +"bea51f81": "addToKYCList(address)", +"bea5f9cd": "newPokemon(uint256,uint256,uint256)", +"bea677dd": "MCS()", +"bea69bb9": "Bal()", +"bea70578": "getPOOL_edit_16()", +"bea72c0a": "dsAdd(uint256,uint256)", +"bea76c3c": "disputeBlockNos(uint256)", +"bea7c13a": "gasPriceForCompensationAtHomeSide()", +"bea8bd27": "updateVettingTime(uint256)", +"bea948c8": "GetGift()", +"beaa4765": "setComplete(bool)", +"beab0638": "TokenAllocate(address,uint256)", +"beab3537": "isClaimed(bytes32,string)", +"beab9848": "SelfllerySaleFoundation(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint8)", +"beabacc8": "transfer(address,address,uint256)", +"beabb2c2": "proxyEnableRefunds()", +"beabdb7b": "isPermitted(bytes32)", +"beabeb3c": "getTheRandNum()", +"beac4bc3": "pauseUET()", +"beacf74f": "test_insert_findWithHintPrevDecreased()", +"bead0513": "leaveCommunity(address)", +"bead21a6": "lockAtTime()", +"bead45cf": "deposit_amount()", +"beadd203": "confirmWarranty(string,string,string)", +"beadf957": "cancelOperation(bytes32)", +"beae207f": "startAirdrop(uint256)", +"beaf56a6": "changeInsurer(address)", +"beafa2dc": "sacToken(uint256,string,string)", +"beb08ab9": "projectWallet()", +"beb0a416": "website()", +"beb1274d": "medianize(uint256[])", +"beb2b55d": "balanceHaben(address)", +"beb2bad6": "SHITP()", +"beb318a0": "updateSelfDropStageState(string,bool)", +"beb38b43": "set(bytes12,address)", +"beb3a38f": "capDay1()", +"beb40d58": "queryShare(address)", +"beb5f658": "compare(address,address)", +"beb6422f": "setClue1(string)", +"beb7de13": "updateCaps(uint256,uint256,uint256,uint256)", +"beb7fd4e": "_setMany(address,uint256,uint256[],uint256[],bool)", +"beb92f55": "setCaller(address)", +"beb9571c": "User_3()", +"beb96be5": "releaseFor(address,uint256)", +"beb9716d": "canMint()", +"beb9c90d": "wavesGW()", +"beb9d27e": "prepopulate(address)", +"beb9df86": "fwdToENS(bytes)", +"beba0b11": "ScallopCrowdsale(uint256,uint256,address,address)", +"beba285d": "privatePlacementAllocatingToken()", +"bebaa421": "setTrustAddress(address)", +"bebb7756": "RecievedDonation(address,uint256,string)", +"bebb7e60": "kscBurnFrom(address,uint256,string)", +"bebc3bfb": "requestWithdrawal(address,uint256,string)", +"bebc9d93": "buyCopyright(uint256,string,string)", +"bebcc045": "description(bytes32)", +"bebd284e": "registerCoinData2(address,uint256,address)", +"bebda5b9": "WhitelistUpdated(uint256,string,address)", +"bebdd5ca": "GenericCrowdsale(address,uint256,uint256,uint256)", +"bebe3c88": "advisorsPeriodLength()", +"bebe4f6d": "Standard_5()", +"bebeb73f": "createRoom(uint256,uint256,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"bebf10d5": "WorkflowState()", +"bebf8498": "addCardToRegistry(address,bytes32,uint256)", +"bebfe207": "publishMessage(string)", +"bec0d799": "removeBook(uint256)", +"bec10cde": "increaseStake(uint256,uint256)", +"bec13af1": "doBuyerCancel(bytes16,address,address,uint256,uint16,uint128)", +"bec17f69": "isPreIco()", +"bec24a0d": "payJackpot1()", +"bec272da": "IotaGoldToken(address)", +"bec3150e": "EthereumBrilliant()", +"bec3e6f3": "overStage(uint8)", +"bec3fa17": "transferTokens(address,uint256)", +"bec507ce": "switchfun()", +"bec5e7b2": "playerDataRecord(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"bec60bd2": "change_token_price(uint256)", +"bec6bc67": "adoptionRequests(bytes5)", +"bec6eb15": "buyGladiatorChest(uint256)", +"bec77cb1": "getOwnerCards(address)", +"bec7abfd": "getBounsEarningsInRound(address,uint256)", +"bec809ec": "tomoConvertRate()", +"bec81091": "executeEtherDeltaBuy(uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,bytes32,uint256)", +"bec823c6": "BitcoinGreen()", +"beca159b": "registerUser(address,string,uint256,uint256,uint256)", +"beca40df": "PERC_TOKENS_TO_DEV()", +"beca4a8e": "TeleGrams()", +"beca7440": "right52(uint256)", +"becb1f35": "isForking()", +"becb44da": "token_sale_start_block()", +"beccdb77": "lastFeesCollected()", +"beccdd91": "updateSecPerBlock(uint256)", +"becd0580": "payEtherToWinner(uint256,address)", +"becd283f": "getPurchaseCount()", +"becd7027": "withdrawPurchasedTokens()", +"becda0ea": "tune(uint256)", +"bece1b22": "GameData(address,bytes32[],bytes32[],int256[])", +"bece2ea1": "tokenPriceIncremental()", +"bececd4e": "updateVerificationStatus(address,bool)", +"becee565": "GodeCoin(address,address)", +"becf0426": "registerAffiliate()", +"becf3add": "bonusPercent()", +"becf917f": "DistribFundsReceiverAddress()", +"becf9ce1": "removeFromAccountList(address)", +"becfbf69": "peekLastNonce()", +"bed03fdb": "winnerSelect(uint256)", +"bed09038": "updateMember(address,address,uint256)", +"bed0a8e5": "testRegisterSwarmEth()", +"bed0d1b9": "validTransfer(address,uint256)", +"bed18966": "getCompletedFlag(uint16,uint16)", +"bed1a924": "totalICOSupply()", +"bed1b8b9": "convertToInt(string)", +"bed1cfcd": "addToOwnership(address)", +"bed230d0": "burningMansCount()", +"bed25542": "onTokenReceived(address,uint256,bytes)", +"bed289c9": "CPolloToken()", +"bed315f8": "setRate(uint16)", +"bed33cae": "getCancelableAt(uint256)", +"bed34bba": "compareStrings(string,string)", +"bed36fee": "test_insert_null()", +"bed411a0": "CheckPrize(address)", +"bed43ffa": "CoinCrowdToken()", +"bed47ed8": "sId()", +"bed50ef8": "emitFeesWithdrawn(address,uint256)", +"bed531fd": "playersAmounts(uint256)", +"bed54a24": "ert()", +"bed6701f": "lastweek_winner2()", +"bed7437f": "setHydroTokenAddress(address)", +"bed866f6": "donations(bytes32)", +"bed9404f": "calculateAccountLiquidity(address)", +"bed9588b": "getUint256Max()", +"bed99850": "burnRate()", +"bed99dec": "replaceSecurityDepositRegistry(address)", +"bed9d712": "chargeJNT(address,address,uint256)", +"bed9d861": "withdrawStake()", +"beda363b": "dynamicReverse(uint256[])", +"beda86b9": "removeContributors(uint256[])", +"bedaa624": "setBZRxToken(address)", +"bedb86fb": "setPause(bool)", +"bedbb1a5": "saucePoolTotal()", +"bedc17ea": "testFailSetName()", +"bedc7796": "ownerCountOfCard(address,address)", +"bedca054": "Crowdsale(address,address,uint256)", +"bedcb4fc": "EthlanceContract(address)", +"bedcf003": "ownerBalance()", +"bedd12a5": "depository()", +"bedda13f": "setData_1(string)", +"bedddbc4": "darkcoin()", +"beddf557": "NOLLYCOIN(address)", +"bede2cac": "joinedCrowdsales(uint256)", +"bede4bd8": "lockupOf(uint256)", +"bedecc06": "seatsCount()", +"bedefffe": "getOwnerName(address)", +"bedf0f4a": "Stop()", +"bedf8e75": "Netyul(uint256,string,string)", +"bee03488": "getAllSSP()", +"bee066a8": "blocksUntilWin()", +"bee11672": "allowBundlingMultitoken(uint256)", +"bee1351e": "_getJYPCBonus()", +"bee14b3d": "getDevBalance()", +"bee16cae": "getCodeToken(uint256)", +"bee200cb": "underLimit(address,uint256)", +"bee2135e": "prefixedHash(string)", +"bee23c42": "contain(address[],address)", +"bee28042": "LVX()", +"bee2e134": "ethCollected()", +"bee36f37": "disableMiniSwapLock()", +"bee40aa4": "setCallType(uint256,uint256)", +"bee47606": "originalPricesBySpinner(uint256)", +"bee4bbeb": "unsetIsBuyByAtom(uint256)", +"bee4cc6b": "getBAB(bytes32,address)", +"bee588e9": "registerCert(bytes32,bytes,uint256)", +"bee5cdca": "getProjectById(uint256)", +"bee5ea6d": "PurgeCoin()", +"bee604ea": "addGame(address,string,uint256)", +"bee6348a": "presaleOpen()", +"bee712da": "buyZone(uint256)", +"bee96d9f": "updateGoldReferrer(address)", +"bee98dff": "get(string,int256)", +"bee9f6f3": "_getVATToCollect(uint256,uint256,address)", +"beea7bfb": "newSubdomain(string,string,string,address,address)", +"beea887c": "totalVCCoin()", +"beeae9a6": "Ather(uint256,string,string)", +"beeb0578": "processFundingFailedFinished()", +"beeb0a82": "SeaCoin()", +"beeb1b5d": "amountRaisedIsc()", +"beeb6d87": "withdrawCoin(bytes4,bytes32,uint256)", +"beebeff7": "tokenForAdvisor()", +"beec1caa": "issueCertificate(string,string,string)", +"beee5852": "opponentAmount()", +"beee9a34": "TIER4()", +"bef17ed0": "totalTeamContributorIds()", +"bef19a8b": "narcosByDistrict(uint8)", +"bef23131": "_createBurnLot(address,uint256)", +"bef28736": "UpgradedController(address)", +"bef2e0d8": "Variant()", +"bef35ccb": "requestClose(uint64)", +"bef39963": "releasedTokens()", +"bef3a083": "deadLine()", +"bef44f18": "transferChild(uint256,address,address,uint256)", +"bef4876b": "finished()", +"bef4f95d": "alarms(uint256)", +"bef5223f": "withdrawTokenToFounder()", +"bef55ef3": "readData()", +"bef566ef": "requestForMigration(address)", +"bef5bb45": "checkHash(address,string)", +"bef72fa2": "controllerLookupName()", +"bef7a2f0": "Fee()", +"bef7c258": "tierStartTime(uint256)", +"bef80387": "KYCCrowdsale(address)", +"bef8f7a5": "userAddressAdded(address)", +"bef90b94": "GetShipsByOwner(address)", +"bef973e4": "getUnclaimedFunds()", +"bef97c87": "transfersEnabled()", +"bef9e4ce": "getPreviousProfit(uint256)", +"befa1e2f": "totalBets()", +"befa7d5a": "addressFundDevelopers()", +"befaed75": "Sell_Offer(uint256,uint256,uint256)", +"befb6e56": "calCandidate(address)", +"befbae04": "completeIcoPart2()", +"befc3e2b": "getInvested()", +"befc5c32": "getOwnersItemList(address)", +"befcc34d": "updateSignedDealsCount(address,uint256)", +"befda2ff": "postIcoPhaseCountdown()", +"befe0e79": "infinity()", +"befe6299": "buySPIKE()", +"befed472": "SKToken(uint256,string,string)", +"beff6dbf": "getInsurancesCount(bytes32)", +"beff778e": "CoinBazarCap()", +"beff90dc": "isVersionContractOrLogic()", +"beffc416": "set_address2(address,address)", +"befff6af": "setUseDELEGATECALL(bool)", +"bf02dbcf": "randNums()", +"bf03e092": "join_address_pay(uint256,address)", +"bf03ef7d": "setDailyTokenLimit(uint256)", +"bf04820b": "totalLosses()", +"bf050334": "resolveDisputeBuyer(string,address)", +"bf052a8a": "countConfirmations(uint256)", +"bf059dc2": "_nonce1()", +"bf05cbe6": "hasFourStepWithdraw()", +"bf05d653": "endVesting(address)", +"bf06444b": "BrokenContract()", +"bf07aae7": "CQT(uint256,string,uint8,string)", +"bf082e38": "GICT()", +"bf084408": "submitProof(bytes32)", +"bf0872ef": "totalDiscount(uint256,uint256,string)", +"bf08778c": "seeAllNumbers()", +"bf09466f": "addEntryIn4WeekPeriods(address,uint256,bool,uint256)", +"bf0a07bd": "getHardCap()", +"bf0a53f5": "Notarize(bytes32)", +"bf0aaaf5": "OWN_ChangeState_locked(bool)", +"bf0af1ba": "checkProof(bytes,bytes32,bytes32)", +"bf0b0c52": "PaisaToken()", +"bf0b47ce": "getWinLoseAmountByBettingOwnerInGamblingParty(uint256,address)", +"bf0b88aa": "CanYaDao()", +"bf0bb225": "recoverAddressFromSignature(bytes32,uint256,address,address,uint256,address,address,uint256,bytes32,bytes32,bytes)", +"bf0c4343": "dividends_by_type(address,bool)", +"bf0ce059": "isRootAuthority(address)", +"bf0d44d5": "testControlCreateWithParentsForeignNotInUse()", +"bf0d4f03": "EventLevelUp(uint32,uint32,uint32)", +"bf0d51be": "COINLAW()", +"bf0dc1c0": "IICToken(uint256,string,string)", +"bf0df0c1": "Start3()", +"bf0e4900": "randomWithNonce(uint256)", +"bf0e63d7": "FastGrowthToken()", +"bf0e9d61": "getProof(string,string)", +"bf0f5495": "volunteerWrite()", +"bf0f88ae": "Google()", +"bf101b32": "isTransferAuthorized(address,address)", +"bf1031d9": "proposeTemplate(address,address)", +"bf10bde1": "calculatePrize(address,uint256,uint256)", +"bf1152db": "preTransfer(address,address,uint256)", +"bf11f412": "buyCreditsAndSpendAndRecover(string,uint256,uint8,address,uint256,address)", +"bf120ae5": "freeze(address,bool)", +"bf12165e": "fillUpSlot(uint256,uint256)", +"bf125c49": "balanceIsZero(address,string)", +"bf12bf4f": "transformContract()", +"bf13633c": "setvalues(string,string,string,string,string,string)", +"bf137795": "canSpawnAs(uint32,int256,address)", +"bf1482fa": "getDonators()", +"bf14c119": "fund(bytes32)", +"bf14dcbf": "collectStakingBonusTokens()", +"bf152765": "userBalance()", +"bf15a645": "add_numbers(uint256)", +"bf15d827": "issueTDETokens(address,uint256)", +"bf15e42a": "CoinClaim(string,string,uint8)", +"bf15e64c": "setPlayerLimit(uint256)", +"bf15ea76": "transferrableTime()", +"bf16e9e8": "PccToken()", +"bf16ec99": "_computeCut(uint128)", +"bf176c34": "profitAddr()", +"bf1792b3": "toHex(uint256)", +"bf187478": "shift_left(uint64,uint256)", +"bf18dfbe": "PhantomToken()", +"bf190c8e": "GACToken()", +"bf1a2e52": "NucleusVisionTokensMinted(address,uint256)", +"bf1b31c2": "ThirdPartyPlatformAddr()", +"bf1b5f19": "withdrawRequest(int256,int256)", +"bf1bb055": "getCCH_edit_14()", +"bf1c30f5": "applicationNameTaken(string)", +"bf1c8016": "closedSaleWallet()", +"bf1cd416": "GrowthPool_Released()", +"bf1d4c66": "lastPurchaseTimestamp()", +"bf1dfb8a": "totalBattles()", +"bf1e799b": "getTimelock(address)", +"bf1e8497": "preCrowdMinContribution()", +"bf1fe420": "setGasPrice(uint256)", +"bf205ebc": "luckyNumber()", +"bf208e00": "setMinAcceptedAmountInPresale(uint256)", +"bf2095a4": "sellManually(address,uint256)", +"bf212637": "getMatronId(uint256)", +"bf21e45d": "changeCrowdSaleDates(uint8,uint256)", +"bf22c457": "getJob(uint256)", +"bf22d670": "boolCallWithArray(bool[4])", +"bf22f63d": "PasswordChallenge(bytes20,bytes32)", +"bf23aec2": "getplaypool()", +"bf23b411": "eosPRIVATE(uint256,uint256)", +"bf24a794": "getMostVotedOptions()", +"bf24aad0": "set_maxDETsPerReturnLessThan(uint256)", +"bf24de3d": "transferTo(address[])", +"bf251bc6": "foundersPercentOfTotal()", +"bf251e7f": "TOTAL_CROWDSALE_FUND()", +"bf254915": "set_Gas(uint256)", +"bf255974": "GoldRegistry(address)", +"bf25bf2e": "ethToTokenRest(uint256,uint256)", +"bf25c597": "VernamToken(uint256)", +"bf25c61d": "isOwnerItem(uint256,bytes32)", +"bf260037": "addressFutureInvest()", +"bf2699e7": "initValidator(address,address,address)", +"bf26bf58": "MartinKoTokenHolder()", +"bf277962": "beneficiary(bytes32,int256)", +"bf27f585": "totalFundsReceived()", +"bf27fa7c": "OCoin()", +"bf2805e3": "getVestingAllocation(address,uint256)", +"bf2860a4": "allocateProofTokens()", +"bf28d7ee": "_setOutcome(int256)", +"bf29a854": "aboutFactoryWorkers(uint256)", +"bf29b90a": "changeAssociation(address)", +"bf2b7524": "updatePoolAddressCapTier2(uint256)", +"bf2c1cc8": "setDailyDepositLimit(uint256)", +"bf2c3dad": "TransferSellAgentSiteReg(address,uint256)", +"bf2c7cbe": "rateT4T()", +"bf2d9e0b": "totalRevenue()", +"bf2e694f": "getPreviousRequest(address,address)", +"bf2e727b": "BONUS_LEVEL_1()", +"bf303d14": "convertCountryIndexToBytes(uint256[])", +"bf30d943": "changefirst24Percent(uint256)", +"bf31196f": "offerPunkForSaleToAddress(uint256,uint256,address)", +"bf314640": "newResolution(string,string)", +"bf31d573": "send_to_darshil()", +"bf31fc58": "VestingMasterContract(address,bool)", +"bf326254": "unlockedCustomer(address)", +"bf32a4b6": "withdrawOwner2(uint256)", +"bf32bf97": "FailGuyTax()", +"bf33589b": "createImageTest()", +"bf33be97": "balanceOfOrder()", +"bf34040d": "_depositEthereum(uint256)", +"bf347404": "engravedToken()", +"bf34ea7d": "makeBatchPayment(address[],uint256[])", +"bf354389": "Eplay()", +"bf35588b": "setDepositRate(uint256)", +"bf35af36": "vestingOwing()", +"bf35d5de": "FighterCreated(address,uint256,uint256)", +"bf35d96b": "Lock(uint256,address,address,uint256,uint256)", +"bf363b18": "transferFee(address,uint256)", +"bf368399": "leaderboard(uint256)", +"bf36c5b0": "offerPieceForSale(uint256)", +"bf36dd16": "icoStartTimestamp()", +"bf3724af": "f2(uint256)", +"bf375fb5": "signFork(uint256,bytes32)", +"bf37689c": "showArrayLength()", +"bf37b8f1": "devOwed()", +"bf381f93": "changeVestingAddress(address,address)", +"bf385c00": "hasSufficientPaymentInternal(address,uint256)", +"bf390355": "initCasino()", +"bf391545": "getBAUU(bytes32,address,uint256)", +"bf395d3d": "getShipProduct(uint32)", +"bf3986ba": "TrustlessTransactions_TransactionHeight()", +"bf39ba48": "PRIVATESALE_SUPPLY()", +"bf3b1101": "transferWalletOwnership(address)", +"bf3b397b": "tokensToEthereum_(uint256)", +"bf3b9e38": "a(uint256,uint256,uint256)", +"bf3bcc41": "isMod()", +"bf3c1120": "setBytesValue(string,bytes)", +"bf3c685f": "TOTAL_VALUE()", +"bf3d6141": "setParams(uint256[],uint8[],uint256[],uint256[])", +"bf3d9995": "officialWebsite()", +"bf3da865": "scannedGoldCaps()", +"bf3e394e": "withdrawInvestment()", +"bf3e4a79": "CoreTeamAndFoundersWallet()", +"bf3e67eb": "Sk8coin()", +"bf3eea48": "privateFundEnabled()", +"bf3f493c": "AdminAdded(address,address)", +"bf40b904": "getIssuedBlock(bytes32)", +"bf40fac1": "getAddress(string)", +"bf417b9f": "MINING_SUPPLY()", +"bf419975": "MBLToken()", +"bf41e16f": "TOTAL_SHARE()", +"bf428c17": "addTrustedContractAddress(address)", +"bf4386a0": "maxMembers()", +"bf439e80": "mintForEarlyInvestors(address[],uint256[])", +"bf43e91c": "withdrawAffVault(uint256)", +"bf43ed4d": "dateInit()", +"bf43fffb": "getFirstEncounterIdFromDay(uint256)", +"bf44aa70": "setSellCommission(uint256)", +"bf44eb03": "liquidityReserveWallet()", +"bf45db19": "ArtGallery()", +"bf463341": "GetInitData()", +"bf4637e5": "jackpotPercent()", +"bf464090": "getManagerCut(uint256,uint256)", +"bf466c06": "getIntValueByKey(string,string)", +"bf46ad1d": "approveSponsorableJob(address,uint256,address,address[])", +"bf46d3df": "canSwap(uint256,address)", +"bf474766": "joinGame(bytes32)", +"bf485e95": "getElementLocation(address)", +"bf487801": "getContractBalanceOf()", +"bf48d8b5": "setCurrenseeFoundationAddress(address)", +"bf49649b": "Galatasaray()", +"bf49d120": "addReview(string,uint256,address)", +"bf4a185b": "ClientOrderEvent(address,uint8,uint128)", +"bf4a5485": "extLockBot(uint256,uint16)", +"bf4a63f8": "withdrawSOC(uint256)", +"bf4a79e6": "TimeChain()", +"bf4aaf86": "DefaultActionDelayed()", +"bf4aeff2": "payoutPeriodEnd()", +"bf4b72e3": "metaTransferHash(address,uint256,uint256,uint256)", +"bf4b7ddd": "updateEnabledStatus(address,bool)", +"bf4c06a1": "changeLogOwner(address)", +"bf4d0abe": "NatoExchangeToken()", +"bf4d5af4": "failures(uint256)", +"bf4d89b5": "parseInt(string,uint256)", +"bf4e9615": "calcPriceFromFactor(uint256)", +"bf4f7cc0": "onlyStores()", +"bf503a6e": "crowdSalePercentage()", +"bf506b47": "registerTXS(uint256,address)", +"bf5103a1": "AUTH_CANMINT()", +"bf5124d0": "displayCard(uint256)", +"bf52439b": "BezantERC20Base(string)", +"bf530969": "setLabel(string)", +"bf53253b": "NATIVE_ASSET()", +"bf5371e3": "sendOnRequest()", +"bf538b68": "BOXToken()", +"bf538f6f": "mintingCompleted()", +"bf539711": "buyTokensPresale(address)", +"bf53dd15": "HBToken(uint256,string,string,uint256)", +"bf53e3ba": "harvestQuorumPercent()", +"bf53fa61": "PRIVATESALE_END_DATE()", +"bf547894": "transferBatch(address)", +"bf54bb60": "Bitscor()", +"bf552230": "_changeAttributes(uint256,uint256)", +"bf5522da": "bounties(bytes32)", +"bf55486b": "Tanya()", +"bf559d11": "startTournament()", +"bf566599": "changeMyName(string)", +"bf5671fd": "changeSecOwner(address)", +"bf568a4c": "endIcoByCap()", +"bf56ac81": "withdrawAffiliateBalance(address)", +"bf56cc08": "emergencyClawbackEther(uint256)", +"bf5772b9": "escape(uint32,uint32)", +"bf583903": "remainingTokens()", +"bf58aad8": "privatePreSale()", +"bf59cdff": "getH3Amount()", +"bf5a451b": "foreverBlockBattleAddressUpdate()", +"bf5a4dd3": "unlist(uint256)", +"bf5a79ee": "_getSchellingRoundDetails(uint256)", +"bf5abfe3": "SimpleConsent(string,address,address)", +"bf5b2e5d": "MIND_FOUNDATION_AMOUNT()", +"bf5b4c0c": "getPendingExploreData(address)", +"bf5b6016": "addContract(string,address)", +"bf5b6234": "fillSellOrder(address,address,uint256,uint256,uint256)", +"bf5bb323": "donationMap()", +"bf5c7f9b": "emissionProvidersCount()", +"bf5c844b": "oneweek()", +"bf5cf791": "AIRDROP_TOKENS_NUMS()", +"bf5e54d2": "updateTokenImprint(uint256,bytes32,int256)", +"bf5f0169": "deliverTeamTokens(address)", +"bf5f2b67": "tradingBalanceOf(address,address)", +"bf5f4edf": "addMonsterClassExtend(uint32,uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8)", +"bf5f93e7": "twoHightestBidsDifference(string)", +"bf5fc2ee": "setStartsAt(uint256)", +"bf604019": "coinTradeStart()", +"bf606d14": "sendOneEtherToHome()", +"bf611c78": "OmniDex()", +"bf61b517": "FEE_SILO()", +"bf61e4b2": "AsuRaimu()", +"bf620a45": "lockAccount(address,uint256)", +"bf6211d9": "StripToken(address)", +"bf624273": "expiryBlock()", +"bf630bc8": "AliCoin()", +"bf6311c2": "_progressAdPrice(uint256)", +"bf632e67": "stateController()", +"bf6537a0": "crowdsaleBeneficiary()", +"bf654aac": "maxFeePercentage()", +"bf656791": "getMinContrib()", +"bf65d492": "FileName()", +"bf65dd32": "_checkAndCallApprove(address,uint256,bytes)", +"bf664892": "PARSECS_PER_ETHER_BASE()", +"bf66a5f9": "indSaleDeposit()", +"bf6713f6": "getGift(uint256)", +"bf671782": "handleReferrals(address,uint256,uint256)", +"bf686453": "PAN()", +"bf6888c8": "VESTED_PERCENT()", +"bf6896eb": "signAgreement(bytes32)", +"bf69d707": "punkBids()", +"bf6a10d7": "validateContributor(address,uint256,uint8,bytes32,bytes32)", +"bf6a1413": "hasSigned(address)", +"bf6ad320": "winnerPrice()", +"bf6ad32b": "getgbyte()", +"bf6afbaf": "FeePaid(address,address,uint256)", +"bf6b43a1": "upgradeCrystalMine()", +"bf6b6536": "SampleContractOther()", +"bf6c277a": "getTotalAccessorySeries()", +"bf6c4de9": "newPLCRWithToken(uint256,string,uint8,string)", +"bf6ca138": "issuedExternallyTokens()", +"bf6d91be": "addClient(address,uint256,uint256,uint256)", +"bf6d9abd": "unlockTransfer()", +"bf6deda4": "createLotto(bytes,bytes,bytes10,bytes10,bytes)", +"bf6eac2f": "stake(address,address,uint256)", +"bf6eb070": "MAX_ALLOWED_STAGE_2()", +"bf6ec777": "takeFee(uint256,address)", +"bf6edbd9": "mintFrozen(address,uint256)", +"bf6f7755": "transferBaseOwnership()", +"bf7035c3": "getSaleContractDepositEtherMin(address)", +"bf70a985": "PRESALE_ETH_IN_WEI_FUND_MAX()", +"bf70bd75": "stopPreIco_step2()", +"bf716708": "TOKEN_SUPPLY_SEED_PRESALE_LIMIT()", +"bf730997": "modifyGuess(uint256,uint256,uint256)", +"bf733e29": "oraclize_newRandomDSQuery(uint256,bytes,uint256)", +"bf735b13": "createSale(bytes32,uint256)", +"bf737c87": "JackpotWon(address,uint256)", +"bf7408de": "TAJ()", +"bf742d56": "canExecuteArbitraryCode()", +"bf748655": "isPaymentRegistered(bytes32)", +"bf748e47": "get_pre_kyc_iconiq_bonus_numerator(address)", +"bf7540d2": "getMoneyCount()", +"bf754558": "conversionsEnabled()", +"bf75553a": "sacarWEA()", +"bf75fdb5": "CreateShortAlias(bytes32)", +"bf77aa1f": "updateListing(uint256,bytes32,uint256)", +"bf77afdb": "TokensReserved(uint256)", +"bf7929a6": "refundeadline()", +"bf7abee6": "SetAuth(address)", +"bf7b69ee": "payDebt(address)", +"bf7ba12a": "LupeShares(address,address)", +"bf7c734e": "setMinSell(address,uint256)", +"bf7c775e": "RESERVED_RESERVE_UNLOCK_AT()", +"bf7e214f": "authority()", +"bf7e4026": "pizza_machine(uint256,uint256,uint256)", +"bf7e7f62": "MaxCouponsPaymentUSD()", +"bf7ea21c": "addWhitelistMember(address[],uint256[])", +"bf7f10fe": "isTransferShipment()", +"bf7f3cfe": "getVotesPerProposal()", +"bf7f8b89": "EthernetCash()", +"bf7ff81e": "bitwordsWithdrawlAddress()", +"bf815059": "updateUnidentifiedSaleLimit(uint256)", +"bf81765c": "adminAddressForComissions()", +"bf83735c": "changelp19(address)", +"bf83f2a2": "setAllocator(address)", +"bf843aed": "BuckyCoin()", +"bf8554ff": "fireOnOfferingChanged(uint256,bytes32,uint256[])", +"bf85cc27": "settleCfd(uint128)", +"bf85e628": "startVesting(uint256,uint256)", +"bf86d690": "isShutdown()", +"bf86e013": "createPromoBot(uint256,address)", +"bf872aee": "revokeConfirmation(uint256,bytes)", +"bf8783e0": "callAndGetReturn(address,bytes,uint256)", +"bf884cf5": "exitThisIcoForHalfOfTokenPrice()", +"bf8853c6": "getUserInterest(address)", +"bf8869b5": "GetBal()", +"bf88a6ff": "reward_contract()", +"bf88fc09": "revokeOwners(address)", +"bf892eaa": "removeTrustedContract(address)", +"bf89662d": "refundable()", +"bf8981c0": "left36(uint256)", +"bf8af541": "setLockRatio(uint256,uint256)", +"bf8b6466": "anOfferWeCantRefuse()", +"bf8b7ec2": "OpenGift()", +"bf8ba305": "getCodeStorage(uint256)", +"bf8bcee4": "setMaxLimit(uint256)", +"bf8bdac1": "setService(address)", +"bf8bf85e": "latestReleaseChecksum()", +"bf8c50ff": "scheduleTransaction()", +"bf8c6b63": "is_diagonal(int8)", +"bf8ce97f": "_take0xTrade(address,uint256,address[5][],uint256[6][],bytes)", +"bf8d5df8": "setTickerSymbol(string)", +"bf8dde4d": "calculatedReward()", +"bf8e0ea4": "logGive(address,string)", +"bf8eae55": "ChangeGasReuired(uint256)", +"bf8ecf9c": "authProposals()", +"bf8edd85": "setPriceInEth(uint256,uint256)", +"bf8f09cb": "cancelOrder(address,uint32)", +"bf8faa9c": "AMLToken(string,string,uint256,uint256,bool)", +"bf8fc670": "sendToAggregation(uint256)", +"bf9005ec": "Test6J()", +"bf907def": "buyGold(bytes32,string,string,string,string,string)", +"bf90c4e7": "PYRToEth()", +"bf913c5e": "getFamedStarByMass(uint256)", +"bf91cbb5": "mineIsBigger()", +"bf91ef18": "mergeBoostData(uint256)", +"bf9222d0": "DNT()", +"bf93a8be": "changeOwnership(address,address)", +"bf947852": "blockInvestor(address)", +"bf94de12": "createPoll(address,bytes32,uint256)", +"bf955038": "Judgement(uint256,uint256,uint256)", +"bf962302": "addIntTag(bytes32,int32)", +"bf96ae63": "signUp()", +"bf981995": "getCountryInfo(uint256)", +"bf983772": "BaseExchangeRateChanged(uint256)", +"bf98976e": "test_curatorDoesVeto()", +"bf989b6e": "setContracts(address,address,address,address)", +"bf98a50d": "GasReceipt(address)", +"bf99669d": "DevPromotionsMarketingSupply()", +"bf99cce1": "buyTokens(address,uint256,bytes32[])", +"bf9a5fde": "setConfiguration(uint256[],uint256[])", +"bf9a6958": "createVoterOnElection(uint256,address,address,string,string,string)", +"bf9ab00c": "getTeamPerfit(uint256)", +"bf9b8b38": "CrypviserToken(address)", +"bf9bbe71": "TRE()", +"bf9befb1": "totalStakes()", +"bf9c0d44": "RandomLedgerService()", +"bf9c3949": "createFaucet()", +"bf9c5001": "authors(address)", +"bf9d3d39": "setLineUpEnable(uint256)", +"bf9e6b0e": "TokenSwap(address,uint256)", +"bf9e7b75": "DeliveredBTC(address,uint256)", +"bf9f01f8": "buyMasterNodes(uint256,uint256)", +"bf9fc4e2": "balanceOfRobots(address)", +"bfa0b133": "salt()", +"bfa0fc93": "getVoteResult(uint256)", +"bfa190f3": "mTransfer(address,address,uint256)", +"bfa1bd62": "stakeAirdropWhileLocked(address,address,uint256,bytes)", +"bfa3c1e6": "MySale(uint256,uint256,uint256,uint256,uint256,uint256,address,bytes32,address,uint256)", +"bfa51df9": "isAirdropped(address)", +"bfa535c7": "apply(string,uint256)", +"bfa54b3f": "BLB()", +"bfa5f1f7": "getLandmark(uint256)", +"bfa814b5": "func()", +"bfa87e80": "tellPreviousContract(address)", +"bfa8ad36": "createProof(bytes32,bytes32)", +"bfaa1763": "FATA()", +"bfaad84b": "getLastStarOfAssetId(uint32)", +"bfab3db9": "withdrawContractBalance()", +"bfab41c9": "getTargetBlock()", +"bfab4f8b": "isMonsterAuction()", +"bfabd754": "increaseFrozen(address,uint256)", +"bfabe6c4": "ShakaliosToken()", +"bfac0046": "getPlayerWallet(uint256)", +"bfad16f4": "new_offer(uint256,uint256)", +"bfae2f0e": "addrAdmin()", +"bfae8867": "getLockTimestamp(string)", +"bfaec04e": "publish(string,bytes32)", +"bfafa8e6": "auditText(uint8,string)", +"bfafb91c": "changeMaxCoefPlayerForEmission(uint256)", +"bfafe92f": "_buyCallToOpen(uint256,uint256,uint256,uint256,address)", +"bfb01f72": "buyWithCustomerId(string)", +"bfb04c60": "proposeAcceptanceAsMember(uint256)", +"bfb05e0b": "declineFightApproval(uint256)", +"bfb08b4f": "MayanToken()", +"bfb0d82e": "__callback(bytes32,address[])", +"bfb1fcf5": "dmlwallet()", +"bfb2fad7": "totalDepositTokenAll()", +"bfb42682": "addPresaleOrder(address,uint256)", +"bfb460e9": "receiverSetAmountRequired(uint256)", +"bfb47e72": "CryptoSurprise()", +"bfb4d66f": "SudjuKoin()", +"bfb4ebcf": "Foo()", +"bfb51ac9": "startGame(uint256,bytes32)", +"bfb65777": "allContacts(address)", +"bfb68141": "disableTokensTransfer()", +"bfb77030": "BRM()", +"bfb7896d": "OQToken()", +"bfb790b4": "weeklyRate(uint256)", +"bfb7c227": "Developeo(uint256,string,string,address,address,address,address,address,bool)", +"bfb7d9f6": "stringandbytes()", +"bfb80547": "unfreezeAddress(address)", +"bfb8a319": "withdrawal(bytes32,address)", +"bfb8c63e": "confirmDeal(bytes16)", +"bfb909ce": "applyFeeToAddress(address,address)", +"bfb9f088": "addInvestorList(address[])", +"bfba1e8d": "gamePlayed()", +"bfba5dd6": "equal(address,address,string)", +"bfba9029": "hashBetMax()", +"bfbaa54d": "MithrilMace()", +"bfbad8b9": "preSaleEtherRaised()", +"bfbb6a23": "winEth(address,uint256)", +"bfbbd489": "setMonsterAuctionAddress(address)", +"bfbbfb1d": "getWinNumberBySlot(uint256,uint256)", +"bfbc37f7": "KOSHER()", +"bfbc793c": "computeNameFuzzyHash(string)", +"bfbc944c": "oldTokenReward()", +"bfbccfae": "currentCoinsCreated18Decimals()", +"bfbcf293": "setChampEC(address,address)", +"bfbd5074": "getVillain(uint256)", +"bfbf95cf": "participateICO(address,uint256)", +"bfbfa8e4": "kBalance()", +"bfc0a342": "owner_loadFunds()", +"bfc0cc5c": "sendEcosysSupplyToken(address,uint256)", +"bfc0e849": "startNextEra(bytes32,uint256,int256)", +"bfc1f48c": "isCapFree(address)", +"bfc2a675": "CreateCredo(address,uint256)", +"bfc2aa2a": "claimedSupply()", +"bfc303fa": "updatePublicData(uint256,string)", +"bfc38592": "cancelItemSale(uint256)", +"bfc3aef0": "setActiveStar(uint256)", +"bfc3cd2f": "testFailChargeMoreThanApproved()", +"bfc3d84b": "CT()", +"bfc47aa0": "tokensCrowdsale()", +"bfc4d11c": "subJobSponsorshipsBalance(address,uint256,uint256)", +"bfc54822": "bet(uint256,uint256,uint256)", +"bfc5624a": "newBadAPM(bytes32,bytes32,address,bool)", +"bfc6cdd1": "DukevsKansas()", +"bfc708a0": "reportMalicious(address)", +"bfc7952f": "outstandingPayouts()", +"bfc83af4": "setBountyTokenWallet(address)", +"bfc84528": "juicyBonus()", +"bfc8bfce": "executeTransaction(uint256,address,bytes,bytes)", +"bfc99f5b": "unsafeWriteAddress(uint256,address)", +"bfca33f7": "Court(address[],uint256[])", +"bfcabcbf": "changeFeeAmountThreshold(uint256)", +"bfcae563": "dateSaleEnded()", +"bfcc4ab2": "change_time_stamp(uint256,uint256)", +"bfcc8b6d": "ownerOfPlayer(uint256)", +"bfcdbae9": "preICOStartTime()", +"bfcdca48": "CastVote(bool)", +"bfce0b7f": "mainSaleEtherCap()", +"bfce477f": "forwardTransaction(uint256,bytes)", +"bfce8cbf": "redeemAdoptedAxies(address,uint256,uint256,uint256)", +"bfcf04cf": "updateId()", +"bfcf0baf": "testSliceToString()", +"bfcf63b0": "claimEther(address,uint256)", +"bfcf73e7": "blocksToLive()", +"bfd07c38": "LowJackpotHolder()", +"bfd0a553": "specWallet()", +"bfd1084f": "BitNauticWhitelist(uint256)", +"bfd13217": "ethReceivedPresaleOne()", +"bfd17831": "RECEIVER_ADDRESS()", +"bfd201f5": "setTransferFees(uint256,uint256,uint256)", +"bfd2385e": "allowanceOf(address)", +"bfd24821": "BonusCrowdsale(uint256,uint256)", +"bfd2ed01": "bountyPercent()", +"bfd3c5fa": "refundTransactionAfterExpiry(uint256)", +"bfd3fa6a": "becomeFairymaster()", +"bfd431d1": "RefundToBuyers()", +"bfd45540": "BlocHipo()", +"bfd4d720": "investors_number(uint256)", +"bfd4dce9": "WhatIsTheBestFoodInTheWorld()", +"bfd525b3": "stopTimeLength()", +"bfd61504": "_addControllerByPartition(bytes32,address)", +"bfd6ef3e": "explore(uint256,uint256,uint256)", +"bfd74534": "getRequest(address,address)", +"bfd7534f": "developer_address_for_D(address)", +"bfd75da4": "TrueUSD()", +"bfd812ec": "suspend(bool)", +"bfd8222a": "checkReward(uint256,uint256)", +"bfd8300d": "setBonusInterval(uint256)", +"bfd85808": "frozenTokens(address)", +"bfd8a06e": "getFinalWinningReportingToken()", +"bfd8fc93": "getOwnersLength(bytes32)", +"bfd90435": "addDataset(address,address)", +"bfd94c8c": "transferIsAllowed(address)", +"bfd9726d": "getMntTokenBalance(address)", +"bfda3b1a": "setSharedStorage(address)", +"bfdad9a4": "SignedContractVault(string)", +"bfdadc19": "change_price(uint256)", +"bfdb8796": "getPoolNameByID(uint256)", +"bfdc35f2": "onBalance()", +"bfdcc9a2": "numBuckets()", +"bfdcd480": "test_invalidProposalDuration()", +"bfdcdbf5": "subkey(address,uint256)", +"bfdd1a20": "getPOOL_edit_17()", +"bfde4f62": "withdrawAllEthToOwner()", +"bfdecf8c": "purchaseTokenInPresale()", +"bfdeddaa": "AllowedContributionCheck(uint256,uint8)", +"bfdf5e80": "communityPot_()", +"bfe0c27e": "getCurrencyAddress()", +"bfe10928": "distributor()", +"bfe1292a": "distributeLenderBot(address[],uint256,uint256)", +"bfe36f58": "HashCoinToken()", +"bfe370d9": "bytesToBytes32(bytes)", +"bfe38df5": "getTotalBet()", +"bfe3a664": "createCrowdsale(address,uint256[8])", +"bfe3c39d": "JYKToken()", +"bfe3e03a": "midGradeHold()", +"bfe44c4b": "getUserValue(bytes20,uint256)", +"bfe484de": "judge(uint256,bool,bytes32)", +"bfe4ed8e": "Razoom(address)", +"bfe53e5c": "holdersWithdrowsOf(address)", +"bfe597fe": "genesisBlockCount()", +"bfe689cf": "lockedValuesAndTime(address,uint256,uint256,uint256)", +"bfe6b1ac": "acceptOffer(uint16,uint256)", +"bfe6c0c7": "viewa1(address)", +"bfe70251": "_checkCertificate(bytes,uint256,bytes4)", +"bfe713e3": "truecoin()", +"bfe777c3": "addPrMemberById(uint256,address,address)", +"bfe7e2eb": "BCBCYCoin()", +"bfe86bbe": "publicGetElement(uint256,uint256,uint256)", +"bfe8936c": "getAssetDetailsURI(uint256)", +"bfe8c107": "betOnDozen(bool,bool,bool)", +"bfe9b7df": "pubkeys1()", +"bfe9e7f4": "pack(address,bytes)", +"bfe9f204": "dividendCycleTime()", +"bfea267a": "getBalanceToMint(address)", +"bfea8790": "enableScheduler()", +"bfead4b9": "maxWithoutWhitelistPerUser()", +"bfeb049c": "IndexOfCurrentDraw()", +"bfebb947": "unblacklist(bytes32)", +"bfec83d6": "RoleAdded(address,string)", +"bfec8b01": "insertSection(bytes32)", +"bfee3569": "setTokenControlInfo(address,uint256,uint256,uint256)", +"bfef9627": "set(bytes4,uint8,uint8)", +"bff04d6f": "testPostpone()", +"bff05aef": "adminRefundTokens(address,uint256,uint256)", +"bff0fbb8": "calculateMeat(uint256)", +"bff10815": "deleteOffer(uint16)", +"bff179c4": "setJadeCoinZero(address)", +"bff18c78": "deployFactory()", +"bff1f9e1": "totalUsers()", +"bff2c413": "ChangeFoundersWalletAddress(uint256,address)", +"bff35618": "setTransferLock(bool)", +"bff41e36": "WEI_RAISED_CAP()", +"bff44f0d": "confirmAddressChange(address,address)", +"bff49180": "updateVendorValid(uint256,bool)", +"bff547c0": "setOrganizationShareSymbol(string)", +"bff5e021": "PumpToken()", +"bff5fb64": "appNickname()", +"bff5fccd": "myWishes()", +"bff65668": "isPresaleHolder(address)", +"bff7df7c": "refundDeadLine()", +"bff7e179": "multiPurchase(uint32[],uint8[],uint8[],uint8[],string)", +"bff8314f": "SetMaxPosXblock(uint256)", +"bff8a36d": "decreaseReserve(uint256)", +"bff974e8": "getContentReplies(uint256)", +"bff99c6c": "tokenWallet()", +"bff9e842": "getSamplesForOwner(address)", +"bffa02d5": "sendP3D(address,uint256)", +"bffa4e41": "getMintAmountApproval(address,address)", +"bffa55d5": "claimRefund(address)", +"bffa9258": "assetCount(address)", +"bffb10de": "add_creature(address,string)", +"bffbe61c": "node(address)", +"bffc235a": "mintedList(uint256)", +"bffcd758": "nasdaqo(uint256,string,string)", +"bffd952a": "transferMaintainer(address)", +"bffdf3f1": "Test4()", +"bffeadd6": "move(uint8,uint256,bytes,uint8,bytes32,bytes32)", +"bffee609": "setSkills(address,uint256,uint256,uint256)", +"bfff23f2": "CaptainKitty()", +"bfff374d": "DepositReturned(uint256,address)", +"bfffe670": "window1StartTime()", +"c00007b0": "getReward(address)", +"c0001786": "ownerBurn(address,uint256)", +"c0012077": "TeamContract()", +"c002c4d6": "getTicket()", +"c003598a": "XEN()", +"c0036137": "ownerProfitPercent()", +"c003b082": "getMyPlayerID()", +"c003f540": "sco(uint256,address,uint256)", +"c00465ab": "CrowdsaleToken(uint256,uint8,address,bool,address)", +"c004a877": "shiftSalePurchase()", +"c0056b7b": "updateAccount(uint8,bytes32,bool,bytes32)", +"c005c686": "validateCompoundContract(uint256)", +"c005dc7b": "hon2backup()", +"c00710fa": "userContractsPred(address,uint256[],uint256[],uint256)", +"c0075772": "setPromoTokenController(address)", +"c0086b19": "BCP(uint256,string,uint8,string)", +"c00941d9": "Dominator()", +"c009b451": "setEventActive(bool,string)", +"c00ab18c": "_toSgaAmount(uint256)", +"c00ade41": "receiveTransferOwnership()", +"c00b060c": "getArrBoolField3()", +"c00c176c": "GoGO()", +"c00c2ceb": "isRedeemAllowed()", +"c00c4e9e": "batch(address[],uint256[])", +"c00ca383": "getByOwner(address,uint256)", +"c00d5305": "oraclize_setNetwork()", +"c00d8f3d": "processLotteryReward()", +"c00daefe": "etherFund(bytes32,string)", +"c00e4306": "getCurrentTokenAmountForOneEth()", +"c00ea6ef": "Polaris()", +"c0112678": "arcToken()", +"c0116c3c": "doAirdrop(address[],uint256[])", +"c011cd1c": "getClixToken()", +"c012e179": "mintDepositAccount()", +"c0130adb": "addadjacencies(uint16[],uint16[],uint16[])", +"c0140fd1": "bid(bytes32,address,uint256)", +"c014464e": "checkFeePeriodRollover()", +"c014875f": "mint(bytes32,address,uint256,bytes)", +"c01569f9": "buyPiece()", +"c01685d4": "FTKTToken()", +"c01706dd": "getContentByRank(address,uint256,uint256)", +"c0171112": "timestamp(uint64)", +"c018d0e6": "getFeeAmount(int256,int256)", +"c018fe0d": "sub_sessione(string,uint256)", +"c01a1c5f": "totalSellPrice(uint256,uint256)", +"c01a8c84": "confirmTransaction(uint256)", +"c01ae5d3": "drop(address[],uint256[])", +"c01b3aa4": "STARTING_SNAKE()", +"c01bc982": "isRestricted(address)", +"c01c1ca3": "claimRemaining()", +"c01ca43f": "getPlayerState(address)", +"c01d1c60": "getTokenExchangeRate()", +"c01d8280": "get_balance(address,string)", +"c01de45c": "storeBet(uint256,uint256,uint256)", +"c01e38e6": "addPlayer(address,uint256,uint256)", +"c01e3985": "StupidityToken()", +"c01e8b6a": "Zigit()", +"c01f475f": "_setClearingPrice(bytes32,uint256)", +"c01f56d0": "OfferToDisciple(uint256,uint256)", +"c01f9e37": "proposalDeadline(uint256)", +"c0204bab": "EasyOsmiumCrowdsale()", +"c020df48": "updateGas(uint256)", +"c022215c": "getTotalDeposit()", +"c0227bd3": "_toTaxes(uint256)", +"c022abbe": "GetAuction(uint32)", +"c022ef43": "getTimeLeftToNextLocalBountyCollect(uint16)", +"c023a231": "BitSTDView(address)", +"c02515a9": "maxTokenForHold()", +"c0263163": "ATT(address)", +"c026327a": "removeBankToken(uint256)", +"c02738da": "generateTargetTokens(address,uint256,uint256)", +"c02898a0": "potatoOwner()", +"c028c674": "right82(uint256)", +"c028df06": "offer()", +"c028e3c9": "cordX(uint256)", +"c0297bc8": "DreamX()", +"c02aaea1": "totalTokensForSaleDuringPreICO()", +"c02b04d8": "rescueLostProperty(uint256,address)", +"c02b5395": "NAMO()", +"c02bf40c": "FundsDeposited(address,uint256,uint256,uint256,uint256)", +"c02c89fe": "PreicoClose()", +"c02cc957": "firstDigit(string)", +"c02d0140": "buyCard(uint8,string,string,string)", +"c02d1e02": "a_document(uint256)", +"c02e580e": "roundEnd()", +"c02f081a": "shiftBits(bytes,int256)", +"c02fd500": "E4Lava()", +"c0309697": "challengeContract(address)", +"c030d8b8": "setCardContract(address)", +"c030f3e2": "increaseSaleLimit(uint256)", +"c031a180": "getBytes(bytes32)", +"c031a78b": "maxMedalsBurned()", +"c0324c77": "setParams(uint256,uint256)", +"c032846b": "getContractStatus()", +"c0329a3e": "startAirdropFrom(address,address[],uint256)", +"c032dc30": "execute(uint256,address)", +"c0338a0c": "transferTileFromOwner(uint16[],address)", +"c0343b09": "setDisputeInterface(address)", +"c035340c": "withdraw_1()", +"c035e492": "onholdBalances(address)", +"c0362523": "setUpgradedOwner(address,address,address)", +"c036c100": "NextGenHype()", +"c03785c3": "MyRefundVault(address)", +"c03795ba": "departmentrequest(address,string,bool)", +"c037ae58": "VESTED_AMOUNT_TOTAL()", +"c037d9ce": "getElementsFromIndex(uint32,uint32)", +"c038a38e": "totals()", +"c038f541": "setProperty(string,string,uint256,int256,string)", +"c03951f7": "FaceWalletToken()", +"c0395bb5": "isCurrentOrPastAdmin(address)", +"c039b88c": "_makeSpecialId(address,address,bytes32)", +"c039bd87": "withdrawTokenFromPkt(address,uint256)", +"c039d6db": "PutEther()", +"c039daf6": "tokenCreationMin()", +"c03a4018": "getGuessInfo(string)", +"c03aac7a": "setSellDividendPercentageFee(uint8)", +"c03b70d5": "getTurnover(address)", +"c03ba041": "BNC(address)", +"c03bdbae": "setRdFee(uint256,uint256)", +"c03c3003": "increment(int256)", +"c03c72aa": "isBattleDecider()", +"c03ce1d8": "BondingManager(address)", +"c03ce796": "crowdSaleStage()", +"c03cf137": "getMyLocker()", +"c03d00f3": "a_viewCoinSupplyAndFunding(bool)", +"c03d1b1d": "verifyCertWithID(bytes32,bytes32,bytes32,address)", +"c03d848c": "convertEthToCents(uint256)", +"c03e2cbf": "Whitelisted(address,bool,uint256,uint256)", +"c03e382f": "calculateShare()", +"c040188f": "preSaleLockEndTime()", +"c0406226": "run()", +"c040e6b8": "stage()", +"c040ebec": "getUserSize()", +"c04123fb": "checkProposalCode(uint256,address,uint256,uint256,bytes)", +"c041652d": "getVendorApplicationStatusTrackCount(string)", +"c04198f3": "getEndDate(string)", +"c042575f": "ETHmultiplier()", +"c0435e29": "setDefaultFriendsFingersRate(uint256)", +"c043c0d9": "changeMaximumPlayers(uint32)", +"c043df8c": "verifyWithdrawSignature(address,bytes)", +"c04484fd": "resetInternal(uint256)", +"c045732c": "addPreIcoMembers(address[])", +"c0459899": "approvePreSigned(address,uint256,uint256,uint256,uint8,bytes)", +"c04605b8": "softEndDate()", +"c0462ec3": "withdrawAllTokensToExchange(address,address,uint256)", +"c0463711": "lastUpdate()", +"c0463810": "PalmToken()", +"c0465f3a": "dateSisterWins()", +"c046c691": "setMoveProductToWhom(address,uint256,address)", +"c046d9b5": "borrow(address,uint256,address,bytes)", +"c0472889": "currentIDnumber()", +"c047c1d8": "transactionsStatusUpdate(bool)", +"c0489af5": "foundersTimelock1()", +"c048dfb8": "postpone(uint256)", +"c0496e57": "setNotarisationFee(uint256)", +"c049813a": "preIcoStagePeriod(uint256)", +"c04a5414": "developmentWallet()", +"c04aa9b8": "rpow(uint128,uint64)", +"c04bb954": "rejectionRatio()", +"c04c5947": "getGames()", +"c04c68eb": "changeAllowTransferState()", +"c04c8e43": "SNSCOIN()", +"c04ca3f5": "_removeAgent(address)", +"c04cc86b": "collecttaxes(uint256)", +"c04d90d0": "ownerByIndex(uint256)", +"c04de318": "slashAddressLikeUsername(string)", +"c04ecdb8": "promoTokenController()", +"c04f01fc": "power(uint256,uint256)", +"c04fcad8": "INITIAL_TOTAL_SUPPLY()", +"c0506782": "_createArtwork(string,string,uint32,address)", +"c050f6dc": "admitUser(address)", +"c0517c5a": "XferMoneyMarketing()", +"c051f75f": "setSchemaRegistry(address)", +"c05283ff": "logQuery(bytes32,address)", +"c0533b5d": "appVersionList(bytes32,address)", +"c05374f7": "AirChn()", +"c05390f6": "PRIZE()", +"c053dc6b": "EtherBags()", +"c053ebf5": "setProviderClosed(uint256,uint256)", +"c054e050": "extractProofOfExclusion(address[],uint256[],bytes32[],uint256[],bytes,bytes)", +"c0567656": "subtractFee(uint256)", +"c0576b73": "monsters(uint256)", +"c057b40d": "SpainvsRussia()", +"c057eca7": "minStakingTime()", +"c0584e68": "ContributorsSupply()", +"c0597a55": "freedWosPoolForThirdStage()", +"c05a30b9": "_processFunds(uint256,uint256)", +"c05a8e81": "getPosition(uint8[176],uint256)", +"c05b7cf6": "setCreationProfit(uint256)", +"c05b8066": "setCompte_18(string)", +"c05ce08f": "calculatePoints(uint256,uint256)", +"c05d1f0e": "PRESALE_JOINTTOKENS()", +"c05dd5d2": "MatchAborted(uint256)", +"c05e5776": "giveRightToVote(address,address)", +"c05f486e": "DEV_SUPPLY()", +"c060ac53": "bytes20ToString(bytes20)", +"c0615f09": "CPGPEREGRINE_EXTRACTION_BASE()", +"c0619c70": "setPrimaryManager(address)", +"c06265d3": "createContractState(string)", +"c062dc5f": "releaseAmount()", +"c062ef86": "_random_empty_location()", +"c062f578": "updateStage()", +"c0631b12": "moneyWallet()", +"c0645011": "getPastRound(uint256)", +"c06474e0": "removeShare(address,uint256)", +"c06508dc": "QBTCoin(address)", +"c0652cf9": "EdelRostenCoin()", +"c0659108": "beneficiariesLength()", +"c065ecc2": "queryChildLength()", +"c065fcf1": "RESERVED_PARTNERS_SIDE()", +"c066bd1a": "addItem(uint256,uint256,address)", +"c06702dd": "changeStage()", +"c0670d2c": "calculateDistributionPeriods()", +"c0675b78": "addBuyTokensRequest(string,uint256)", +"c0677fb6": "SetIdentifiedContract(address,address)", +"c0689e2d": "newCrowdFundingCampaign(address,uint256)", +"c068eae0": "player_collect_winnings(uint256)", +"c06a22f4": "dollarsForEther()", +"c06b0d21": "BondToken(address,address,address)", +"c06b5281": "buyXnameQR(address,bytes32,uint256)", +"c06c4474": "get_burned(bytes32)", +"c06c66ca": "bountyFund()", +"c06d1272": "startPreIco()", +"c06d1490": "oppositeAnnouncement(uint256)", +"c06d7744": "getAllSignersCount()", +"c06dabf8": "_escrowHostPaymentEarning(address,bytes32,uint256,uint256,address,bool,uint256)", +"c06f146b": "setNumInvalidMarkets(uint256)", +"c06f1bc4": "updateVoterTimes(address,uint256)", +"c06f4c1d": "newCampaign(bytes32,bytes32,bytes32,address,uint256,uint256,uint256,address)", +"c06f8340": "cancelAuctionByAdmin(uint256)", +"c06fad06": "items()", +"c06fff76": "proposePauseChange(bool)", +"c0702d9c": "_mint()", +"c07097a6": "coindropsLockEndingAt()", +"c0715d1d": "assertSafe(bool)", +"c071f3bf": "deliverPurchasedTokens()", +"c072422d": "buyTokens(bytes32,uint256,uint8,bytes32,bytes32)", +"c072497a": "claimPlotMultipleWithData(uint256[],uint256,string,string,string,string)", +"c072dcf3": "ExampleContract()", +"c073af55": "GetJackpotMin()", +"c07401f0": "addToPool()", +"c0740c16": "numElementsOdd()", +"c0741c53": "test_assetRegistration()", +"c0743044": "partAllocations(uint256)", +"c074313f": "pricePerStake()", +"c074a27e": "proposeTransaction(address,uint256,bytes,string)", +"c074fe80": "SetPrecioUnidadPase(uint256)", +"c07653af": "Gavinhereum(uint256,string,string)", +"c076c847": "NorthPoleAF()", +"c0774df3": "canForward(address,bytes)", +"c0777545": "balanceAD()", +"c077b0f9": "getARSchedule()", +"c079418b": "setTranchWei(uint256[])", +"c0797ae1": "stakerIncomeShare(bytes32)", +"c079c318": "adjustFee(uint256)", +"c07a1f0c": "changeHouseFeeAddress(address)", +"c07a32c4": "dateIsLegal(uint256)", +"c07a5537": "MintableTokenWithMinters()", +"c07b18ca": "PullPaymentMock()", +"c07b2586": "SAFCOIN(uint256,string,uint8,string)", +"c07bcfdc": "updateLimitPerDay(bytes32,uint256)", +"c07dc59c": "withdrawPot(string)", +"c07dc890": "selfRegisterDINs(uint256)", +"c07dd842": "buyFactor()", +"c07e3391": "setMonethaAddress(address,bool)", +"c07f47d4": "latestVersion()", +"c07f773a": "totalTokensAllocated()", +"c080f08f": "complexReturnType(int256,string,bool,string)", +"c0819961": "Invest()", +"c081efc1": "hasSellerBeenAccepted(address)", +"c083455f": "ownerPutInterest(uint256)", +"c0835106": "isVotable(bytes32)", +"c08415b1": "ORDER_PLACE(address,address,bool,uint256,uint256,uint256)", +"c0845e8a": "catchMonster(address,uint32,string)", +"c0846957": "EtherDeltaTokenBalance(address)", +"c0851e09": "getEarlyPurchase(uint256)", +"c0864877": "tokensForOwner()", +"c088003d": "getMinThresholdOfVoters(uint256)", +"c0887991": "getOperation(address)", +"c088df47": "SECRET_BONUS_FACTOR()", +"c08a86b1": "endGame(bool,uint256)", +"c08cc02d": "getProposalCount()", +"c08d1fe5": "timeLimit()", +"c08dd1dc": "IOU(string,string,uint8)", +"c08e05aa": "icoRuleCancel(uint256)", +"c08eea14": "cloneAccount(uint256)", +"c0905fef": "getStackholders()", +"c090b4df": "createRecord(string,string)", +"c090b86d": "createKingdom(string,address,address,address,uint256,uint256,uint256,uint256,uint256)", +"c090da1e": "Zhennong(address)", +"c0910475": "PaymentStatusTimeStamp(address,address)", +"c0916437": "modifyChoice(uint256)", +"c091c435": "refund(address[],uint256[])", +"c091e45a": "redenominate()", +"c0926d40": "HBOToken()", +"c0929385": "confirmInit(address,address,string,bytes32,uint256)", +"c092ecf4": "blocksToVest()", +"c0934c45": "getNextRules()", +"c0938c1a": "setMintAgent(int256,address,bool)", +"c0942dfd": "registerNameXIDFromDapp(address,bytes32,uint256,bool)", +"c0946d54": "AtomCoin()", +"c094c73e": "VeritaseumToken()", +"c094df20": "shift(address,uint256)", +"c0956fd9": "getRealTokenAmount(uint256)", +"c0963d97": "getTokensAmount(uint256,address)", +"c0966693": "RoomNonceAdd(uint8)", +"c09689a6": "tryFinalizeProposalsByVoterIndices(uint256[],uint256[],bool[])", +"c096aa81": "fuint8(uint8)", +"c097d629": "setPI_edit_30(string)", +"c0981285": "buyComissionUnits()", +"c098201f": "updateEtherAndtokenAmount(uint256,uint256)", +"c0997654": "destIndex(address)", +"c09a4ef4": "latestEthTxRequest()", +"c09a898d": "SPTS()", +"c09b2a2c": "weiMinSale(uint256)", +"c09bdd06": "_escrow(address,address,uint256)", +"c09d81be": "calculatePoundsTimesEther(uint256)", +"c09f32e8": "closeQuestion(uint256)", +"c09fed25": "transferFromBalance(uint256,address)", +"c0a06ecb": "infoWithdraw4()", +"c0a0b5fa": "getKilledArray(uint256)", +"c0a14da4": "isTeamLockInPeriodOverIfTeamAddress(address,address)", +"c0a150b3": "RovaZoneBToken()", +"c0a1a949": "x15()", +"c0a1b72a": "totalSupplyWithOutBonus()", +"c0a1e525": "createDaoPOLSKAtokens(address)", +"c0a2203e": "insert(address,address)", +"c0a239e3": "valuePerShare()", +"c0a28014": "setTreeStructure(address,address)", +"c0a2d9b3": "EssentiaToken()", +"c0a35d62": "burnReturn(address,uint256)", +"c0a35e8b": "getTokensMintedAt(uint256)", +"c0a36345": "getTokenOwnerRewardPercent()", +"c0a39fb0": "blockTransfer(uint256)", +"c0a41466": "etherSender(address,uint256)", +"c0a42d91": "SignatureInvalidity()", +"c0a5bcbd": "DefaultCents()", +"c0a7639e": "checkIfAddressIsWhiteListed(address)", +"c0a7f894": "MAVCash(uint256,string,uint8,string)", +"c0a843a1": "getCurrentUserRefBonus()", +"c0a8694d": "NamableAddressList(string,bool)", +"c0a899f2": "transferAsChild(address,uint256,address,uint256,uint256,bytes)", +"c0a8fb73": "FlightDelayController()", +"c0a9066b": "LogValentineRequestCreated(string,string,string,address,address)", +"c0a9581d": "sendFee(uint256)", +"c0a963c9": "notifyWinner(address,uint256)", +"c0a99a83": "oneTokenInUsdWei()", +"c0aa18e7": "History()", +"c0aa3b21": "ownerTokens()", +"c0aa7e2e": "cancelInvoice(bytes32)", +"c0aace0b": "totalKitties()", +"c0ab5704": "setVesting(address,uint256,uint256,uint256)", +"c0ab86bd": "SBSolutions()", +"c0abf829": "tokenCreationMinMile2()", +"c0ac3d1c": "PRE_ICO_BONUS_RATE()", +"c0ac9983": "tokenURIPrefix()", +"c0ad7427": "saleTokenSupply()", +"c0adb725": "AuthCancel(address,address)", +"c0adc465": "getCurrentBonusRate()", +"c0ae6a3a": "ultimateOutcomes(bytes)", +"c0aee5ba": "THAW_CYCLE_USER()", +"c0b14de7": "setLandLimit()", +"c0b204a6": "TeamWalletAmount()", +"c0b241d7": "icoRate()", +"c0b332c1": "moveCharge()", +"c0b3569d": "setAssetProxy(address)", +"c0b3870a": "withdrawJackpot()", +"c0b39e68": "unfinalize()", +"c0b3aff3": "INCREASE_RATE()", +"c0b3dab3": "Devilsbest()", +"c0b4d404": "setGrowingControlStartAt(uint256)", +"c0b4e657": "HongkongerCoin()", +"c0b4fa6d": "_reward(address[])", +"c0b6762c": "SILVER_AMOUNT_XPER()", +"c0b6f0c2": "NextRoundAndEvents()", +"c0b6f561": "initiateOwnershipTransfer(address)", +"c0b75b7d": "setMinContributionAmount(uint256)", +"c0b7eba4": "game_allocation()", +"c0b82515": "gzeUsd()", +"c0b84bfe": "setFee(uint256,uint8)", +"c0b8a80d": "CVAlejandro()", +"c0b92612": "changePig(address)", +"c0b9b36a": "bountyTokensBatch(address[],uint256[],string)", +"c0b9b8ce": "releaseToAdvisor(address,uint256)", +"c0b9ecc8": "getNames(address,uint256,uint256)", +"c0ba6adf": "gemDefenseConversion()", +"c0bac1a8": "isMigrated(string,string)", +"c0bb20a6": "setBonusSale(uint256,uint256,uint256)", +"c0bb6c27": "setTotalPersistLimit(uint256)", +"c0bb8466": "WithdrawFees()", +"c0bd3f40": "dumpData(uint256,uint256)", +"c0bd8351": "getGameId()", +"c0be3e9a": "removeOffChainAddresses(address[])", +"c0be4b51": "genWeeklySecondPrizeKey(uint8[4])", +"c0be7ad3": "freezeAccountDirect(address,bool)", +"c0c116d5": "getStringValue(uint256)", +"c0c133a8": "DATE_ICO_END()", +"c0c19d29": "mock_length()", +"c0c1b107": "changeOraclizeGasPrice(uint256)", +"c0c1b18e": "getDepositSize(address)", +"c0c1cf55": "executeAction(uint256)", +"c0c1dab1": "setReceiver1()", +"c0c1eebc": "addToken(address,bytes32)", +"c0c2c087": "getOrdersInfo()", +"c0c3da9c": "totalSupplyLocked1Y()", +"c0c4440a": "totalAmountOfCrowdsalePurchases()", +"c0c47e12": "getDeal(bytes16)", +"c0c4d8a8": "Fundraiser(address,address,uint256,uint256,address,uint256,bytes32,uint256,uint256,uint256,uint256,uint256)", +"c0c53b8b": "initialize(address,address,address)", +"c0c5fda5": "getTotalSupply(address,uint256,bytes,uint8,uint256)", +"c0c602d9": "tokenAssigned()", +"c0c620d2": "DroneToken(uint256,string,string)", +"c0c6a430": "BadTronToken(address,address)", +"c0c6a68a": "setMockedBlockNumber(uint256)", +"c0c76940": "StopperCoin()", +"c0c77236": "resetHolder(bool)", +"c0c77b71": "changeRegistrationStatusForGoldWhiteList(address,bool)", +"c0c81969": "tokenSupplies(uint256)", +"c0c83c0d": "getDebtById(uint256)", +"c0c8821a": "icoRuleUpdate(uint256,uint256,uint256,uint256,uint256)", +"c0c8b567": "registerCertificateHash(address,bytes32)", +"c0c8ccb3": "PreHELIX()", +"c0c91e6d": "getMinPriceSale()", +"c0c95917": "BrinkzSupply()", +"c0c98d6f": "setProof(uint256,bytes32)", +"c0cab256": "ZZWHToken()", +"c0cad302": "setNetworkName(string)", +"c0cc365d": "setExpirationTime(uint256)", +"c0cc6eb1": "rejectPayment(bytes8)", +"c0ccc863": "NacContract(uint256,uint256,uint256,address,uint256,uint256)", +"c0cd1ec1": "recordLog(uint256,address,uint256,uint256,uint8,uint8)", +"c0cd2e32": "chargeWeeklyRate(bytes32,address)", +"c0cd54c6": "GetGameType(address)", +"c0cf067b": "deathData_v7()", +"c0cf22e9": "setSendGiftPrice(uint256)", +"c0cfa7e5": "startDispute(uint256)", +"c0d061f4": "execute(address,uint256,bytes32)", +"c0d0aa69": "daoMultisig()", +"c0d129d4": "BallotPreferential()", +"c0d13a6d": "MIN_BUY_ETHER()", +"c0d26946": "randomNumber(address,uint256)", +"c0d2834b": "DataSource()", +"c0d3f378": "specialManagerListMap(uint256)", +"c0d470a6": "setCCH_edit_23(string)", +"c0d4fa0c": "emitFeePeriodDurationUpdated(uint256)", +"c0d6568d": "FEATURE_TRANSFERS()", +"c0d6ce63": "punksRemainingToAssign()", +"c0d75442": "TOKEN_SALE()", +"c0d84ce5": "TransferFrom(address,address,uint256)", +"c0d8b0b8": "setPetAuras(uint64,uint8,uint8,uint8)", +"c0d910cd": "getTankOwner(uint256)", +"c0d9f997": "transperrun()", +"c0dab516": "adminPercent()", +"c0db4dd7": "TRANSACTION_MIN_IN_ETH()", +"c0db8dd8": "allowToLock(address,address)", +"c0dcf63a": "isLastRaceFinsihed()", +"c0de3d71": "TransactionCancelledICAP(bytes32,uint256,string,address)", +"c0df77d0": "getRefName(uint256)", +"c0e06ca3": "whitelistAddressPresale(address,uint256)", +"c0e093f1": "AirdropMultiple(address[],uint256)", +"c0e09852": "isVesting(address)", +"c0e17c61": "TenStepTestCoin()", +"c0e18579": "ONETIMESOLD(uint256)", +"c0e19314": "divideFractional(uint256,uint256,uint256)", +"c0e1e272": "buyToken(uint32,uint32,uint32,address)", +"c0e22f31": "frozenStatusOf(address)", +"c0e31001": "avatar(address,uint256,bytes)", +"c0e3153c": "balanceSub(address,address,uint256)", +"c0e317fb": "addToBalance()", +"c0e33275": "perTokenAmountMax()", +"c0e37b15": "transferData(address,uint256,bytes)", +"c0e59e4d": "lastRateUpdateTimeForCurrency(bytes4)", +"c0e5fbb6": "unlockBalanceOf(address)", +"c0e71f54": "toKeyValue(string,string)", +"c0e738ef": "summAdvisors()", +"c0e789cc": "friendsFingersWallet()", +"c0e793c2": "transferOwnership(string,address)", +"c0e79a11": "setAllowed(address)", +"c0e8ad51": "LydianCoin()", +"c0e9118e": "killAllXAITActivity()", +"c0e91320": "finishPVEBatch(uint256[])", +"c0e91569": "GRCToken()", +"c0ea09d7": "rest()", +"c0ea537b": "amountOfTokensPoolD()", +"c0ea6ff5": "test3_search()", +"c0eaded2": "makeDeal(uint256,uint256,uint256,uint256,uint256,string,address,string,address,uint256,uint256)", +"c0eb2325": "scheduleTransaction(address,bytes,uint256)", +"c0eb2e70": "buy(address,uint256[],uint256[],bool)", +"c0ebc67a": "SimpleStateChannel()", +"c0ebdba1": "InvestedOtherCrypto(address,uint256,uint256)", +"c0ec55a5": "buyPokemon(address,uint256)", +"c0ed969a": "updateBackend(address)", +"c0edec55": "CroatiavsDenmark()", +"c0ee0b8a": "tokenFallback(address,uint256,bytes)", +"c0ee57a5": "giveReserveTo(address,uint256)", +"c0ee6db8": "_lockToken(address,uint256)", +"c0efa161": "getDeveloperReservedBalanceLimit()", +"c0f0c21c": "updateMaxTokenLimit(uint256)", +"c0f0e925": "getPercent3(address)", +"c0f11a1b": "addressArrayContains(address[],address)", +"c0f16fab": "checkAllowedContribution(address,address,uint256,uint8)", +"c0f17d13": "ChessCash()", +"c0f3622c": "updateRates(uint256,uint256,uint256)", +"c0f3ab76": "B2BCoinContract()", +"c0f40163": "issueFTT(address,uint256)", +"c0f496ac": "ecosystemAllocation()", +"c0f4bfa4": "nbSellers()", +"c0f4d29b": "setLocation(uint256,uint256)", +"c0f4f41e": "changeRefresherFee(uint256)", +"c0f57529": "eth_seed_amount()", +"c0f5a9cb": "deleteThing(bytes32[])", +"c0f5b5f7": "setSecondRoundPricing(uint256)", +"c0f5dc97": "totalSupplyUnlocked()", +"c0f64f43": "attachAsset(uint256)", +"c0f65734": "SignedDigitalAsset(string)", +"c0f68859": "getMinimumGracePeriod()", +"c0f6a3f9": "reserveVaultAddr()", +"c0f6c0da": "getTokensFromEth(uint256)", +"c0f6c7b8": "getIdArray(address,uint256,string,string)", +"c0f70d5a": "IOUSupply()", +"c0f7c498": "create_planet()", +"c0f8275e": "detailsOf(uint256)", +"c0f8940c": "decode()", +"c0f8de32": "shouldThrowOnAttemptToTransferToNullAddress()", +"c0f96105": "Enabled()", +"c0fd43b4": "lastNonce(address)", +"c0fdba2d": "YCBIToken()", +"c0fe6c92": "isClientAddedBefore(address,address)", +"c0feb62d": "fundRaisedDuringPublicSale()", +"c0feee42": "Error(bytes32)", +"c0ff3ebc": "ILFManager()", +"c1009f1b": "testInitialLedgerBalance()", +"c1013658": "createAsset(uint256,bytes32,uint256)", +"c1021099": "DBDVToken()", +"c1039215": "PresaleExtended(uint256)", +"c10435cc": "lastEruptionTimestamp()", +"c1061561": "shut_down()", +"c1072279": "unicornBreeding()", +"c1075329": "withdrawFunds(address,uint256)", +"c10796df": "_performTransferToICAPWithReference(bytes32,uint256,string,address)", +"c107aa6f": "addAssociatedAddress(address,address,address,uint8,bytes32,bytes32,uint256)", +"c107b9b8": "CTCB()", +"c107e109": "addFactory(string,address)", +"c1082c00": "YBananaCoin()", +"c108adab": "setChangeFee(uint256)", +"c108d542": "distributionFinished()", +"c108f3b4": "nextDelayedSetStake()", +"c1098e2e": "preSaleFirstCap()", +"c109e024": "blockdif()", +"c10a0840": "CryptoChallenge()", +"c10b30c0": "unlockPurchasedTokensClaim()", +"c10b9358": "saleEnd()", +"c10be521": "gapFactor()", +"c10bef22": "ConditionsAdded(address,uint256)", +"c10c0bd3": "logMatchdayResults(int16,string)", +"c10c3463": "addProduct(string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"c10c3546": "setEscrow(address)", +"c10ce2b0": "calculateDiffPercent(uint256,uint256)", +"c10d0f11": "didChangeCollateral(bytes32,address,uint256)", +"c10dd4c6": "getEvents(bytes32[],address)", +"c10e5fe7": "GemCoin()", +"c10e7dfe": "bonusInited()", +"c10e9ba0": "isClientIdentRejectedOf(address)", +"c10eb14d": "_withdraw()", +"c10efd2f": "compareResults()", +"c10f1a75": "proxyFactory()", +"c10f5075": "KudosPoll(string,string,uint8,uint256,uint256,uint256)", +"c10fa635": "channelParticipantCount(uint64)", +"c10fa789": "withdrawalsVotes(address,uint256)", +"c10fbf0e": "reDraw()", +"c110afe2": "Percent(uint256,uint256)", +"c110e6a0": "HealthCoin()", +"c111368b": "vestingsRemainBalance(address)", +"c112411e": "_clarifyPVPSchedule()", +"c112601c": "transferLibOwnership(bytes32,address)", +"c1127f90": "PresalePool(address,uint256,uint256)", +"c112a083": "finalizeChangeName()", +"c112dfa3": "changeDecimals(uint8)", +"c11301d4": "getSaleContractTargetEtherMax(address)", +"c1139ba0": "transferAuthorship(address,bytes32,bytes32)", +"c113d195": "XECToken(string,string,uint8,uint256)", +"c11403fc": "maxListingSeconds()", +"c114301c": "icoPlatformWithdraw(uint256)", +"c115b06c": "CYFToken()", +"c11645af": "test_threeInvalidAssertFalse()", +"c116574c": "__update_oraclize(address)", +"c1165781": "totalSupplyOnIco()", +"c11737c7": "getFirstBuyer(address)", +"c11741a9": "submitReview(uint256,bool)", +"c117c9eb": "isUserInAllowedList()", +"c117cfe2": "TwoDimensions()", +"c11808da": "getFloor()", +"c1184537": "changeContracts(address,address,address,address)", +"c118a9de": "getDiscountOf(uint256)", +"c119167b": "numberOfExchInEstateNasBob(address,uint256)", +"c119d019": "collectPayment(address,uint256)", +"c11a4b47": "Origin()", +"c11b2252": "equipContract()", +"c11bd455": "timeOfLastHalving()", +"c11bf4e3": "execute(uint256,address[],uint256[],uint8[],bytes32[],bytes32[])", +"c11bf8d6": "CLXToken(uint256,string,string)", +"c11c0cc1": "getSecondPoints()", +"c11d9d9f": "minEtherContrib()", +"c11dde0d": "setManufacturer(address)", +"c11e1ff3": "getMe()", +"c11efcdc": "getRaisedForCurrentStage()", +"c11f49e3": "ETHERNETSUPPLY()", +"c11f5284": "setReceivers()", +"c11fb13e": "trustedProposals(uint256)", +"c1204caa": "trade(uint256[11],address[4],uint8[2],bytes32[4])", +"c12076f1": "holderGroupNumber()", +"c120d1a4": "outingreserveBalance()", +"c121be4d": "removeAddressManual(address)", +"c122759f": "issuerDistributedUnits()", +"c1232366": "gameCloneFee()", +"c1238940": "bmy(uint256,string,uint8,string)", +"c123a658": "boostCloneMarket(uint256)", +"c1243528": "airdropRecord(address)", +"c1246d39": "simulatePathwayFromBeneficiary()", +"c124e2ea": "checkBetDozen(uint8)", +"c1257bad": "testPassingAProposal()", +"c1258f69": "txCount(address)", +"c1263215": "calculateObtainedJOY(uint256)", +"c1266227": "pow2Bounds(int256)", +"c12692dc": "tokenRaise(address,uint256)", +"c12719a7": "EthPriceDependent(address[],uint256,bool)", +"c1273676": "fundingUnlockTime()", +"c1273ba0": "likeCelebrity(uint256,uint256)", +"c127ae41": "getSignatureHash()", +"c127c247": "addMember(address,string)", +"c127ee20": "SearchUserPurchase(string,string)", +"c128c9e7": "GetBuildingData(address,uint256)", +"c1292cc3": "lastId()", +"c1294224": "payoff(address)", +"c12954fa": "restartMinting()", +"c129827b": "_setSpecialityValue21(uint256)", +"c12a0fd7": "removeReverseRate(address[])", +"c12ae5e9": "blocksInFirstCapPeriod()", +"c12af1ce": "fipsRegister(uint256,bytes)", +"c12b2513": "assignSubBroker(uint256,address)", +"c12c202c": "getGrapesSinceLastHarvest(address)", +"c12c2eb3": "abstractENS()", +"c12c31d6": "listAllAdmins()", +"c12d1d82": "updateToken(uint256,uint256)", +"c12d7b01": "Error(uint16)", +"c12d97de": "DevGiveBlockReward()", +"c12dec39": "_fetchOrdersForMerchant(address)", +"c12e760e": "agreeFromDrone()", +"c12eb191": "updateEarlyParticipantWhitelist(address,uint256)", +"c12edde6": "EURValue()", +"c12f48e3": "AssetRegistered(address,string,string,string,uint256)", +"c12fac40": "oneHundredThousand()", +"c13026b0": "changePresaleCap(uint256)", +"c13051d7": "getCellsInfo()", +"c1309aea": "getOfferor(uint256)", +"c1310951": "createNewDepositContract(uint256)", +"c131acdf": "GetBestTokenCount(uint8)", +"c1321111": "setSaleLength(uint256,uint256,uint256,uint256)", +"c132bc18": "balanceWosPoolForThirdStage()", +"c132dd4f": "authorizedCreateTokensToPrivate(address,uint256)", +"c1331bc3": "setBlacklistSpender(address)", +"c1333a9c": "setPurchaseRequirements(uint8,address[],uint256[])", +"c134bc92": "hell()", +"c13517e1": "createDispute(uint256,bytes)", +"c135a2d8": "getBackgroundValue(uint256)", +"c135c040": "gzePerEth()", +"c1374d5a": "EtherUSDPriceFactor()", +"c138195c": "icoEtherMinCap()", +"c1381ea3": "DutchExchangeProxy(address)", +"c13862ea": "setBoardRating(uint256,uint8)", +"c13982ee": "checkCap()", +"c13992b4": "Metadium()", +"c13a135a": "getWinnerOfEvent(bytes32)", +"c13ab0fe": "WOLF4()", +"c13afa91": "object_locations(uint256)", +"c13b22ef": "setTokenTransferFeeAbs(address,address,uint256)", +"c13b37c7": "updateIsRevertedEndTimeReached()", +"c13b3895": "getHype(uint256)", +"c13b72a8": "registerCDP(uint256)", +"c13c6813": "_addTimelock(address,uint256)", +"c13ca374": "SimpleSale()", +"c13e24d2": "Reinvest(uint256)", +"c13e285d": "maxTrialDrops()", +"c13f4af7": "claim(address,uint128)", +"c13fb08b": "breedOnAuction(uint256,bool,uint256,bool,string,string)", +"c140635b": "audit(bytes32)", +"c1408cda": "getDataFromAddress(address)", +"c141e6da": "ERC721ReceiverMock(bytes4,bool)", +"c141ed74": "calculateCrowdAmount(uint256)", +"c14248a2": "lrcSent()", +"c1429c11": "ChainStarToken()", +"c143a372": "TokenTransferFrom(address,address,uint256)", +"c143ab2c": "crowdSaleStop()", +"c143f701": "getRequestFundInfo(uint256)", +"c1440167": "Voterplayer()", +"c1441172": "setBlackFlagRequest(uint256,uint256)", +"c144734c": "getUploadTypes(uint256)", +"c1448284": "approved(address,uint256)", +"c144a510": "ADDR_WITHDRAWAL2()", +"c144a5db": "Bytelending(uint256,string,string)", +"c144d7dc": "buyMine(uint8)", +"c145d105": "withdrawSettle(bytes32,address,uint256,uint256,bytes32)", +"c1460942": "getLiquidationSpread()", +"c14634cf": "KudosTokenSale(address,uint256,address)", +"c1468587": "mainwallet()", +"c146eb02": "UNOPEN(string,string,uint256,uint256,bool)", +"c148002c": "latestUnlockStage()", +"c148e20e": "FCCToken(string,string,uint256,uint256,bool)", +"c14958cb": "giveUp(address,address)", +"c1499199": "_uncreditUser(address,uint256)", +"c14a2455": "balDailyLotto()", +"c14a3b8c": "mintTimelocked(address,uint256,uint256)", +"c14a6046": "payerContract()", +"c14a932f": "signedTransferFromSig()", +"c14a9f05": "challenge(address,uint256,uint256)", +"c14ab7a1": "PredictTheFutureCaller(address,uint8)", +"c14bafb1": "lastPurchaseTime()", +"c14bfd29": "hasAlreadyVoted(uint256,address)", +"c14c1ce3": "requestUpdate(uint256)", +"c14c5574": "Gold(address,address,int256,address)", +"c14c7bd7": "performRead1()", +"c14d2358": "init(address,uint256[],uint256,uint8,uint256,bool)", +"c14d3abe": "enableSuperUser(address,bool)", +"c14e50ce": "setValidater(address)", +"c14e61ba": "overdraftTotal()", +"c14e6cd0": "changeTransferLock(bool)", +"c14e7a3f": "setCooldown(uint16,uint32)", +"c14e9f58": "submitBlockHeader(bytes)", +"c14edad2": "teamDistribute()", +"c14f42fd": "mLoadAndReturn(bytes32)", +"c14f7ea8": "rejectSubmission(uint256)", +"c14fbd64": "satoshiMood()", +"c15185f5": "getAuditPrice(uint256)", +"c151ac55": "_createMovie(string,address,uint256)", +"c151c5ad": "getSignerTable()", +"c15294a1": "creatGameBet(uint256,bytes32)", +"c152d3eb": "setKYCTeam(address)", +"c1531ecc": "changeIssuer(address,bool)", +"c1551fc8": "QuadCoreChain()", +"c1554658": "changeDepositorLimit(uint256)", +"c155836d": "LuCyToken(address,string,uint8,string,string)", +"c155cfde": "_preAllocateTokens(address,uint256)", +"c1560a14": "hardCapInUSD()", +"c1562547": "checkUser()", +"c156ef6b": "_createPainting(address,uint256,uint256,uint8,uint8,uint256,uint256)", +"c157b869": "totalUsdValueOfAllTokens()", +"c157d72c": "itemInfo(address,uint256,bytes)", +"c1596534": "addReserve(address,uint8,bool)", +"c1598f6a": "newWage(uint16)", +"c1599011": "conversionRateOfState(uint256)", +"c1599bd9": "X()", +"c15a6791": "oneShotTokenRepartition(uint256)", +"c15ae376": "_shareToDistribution(uint256,address,uint256,uint256)", +"c15aec44": "totalGasUtilizing()", +"c15b42bf": "AsignarPasesLibres(uint16,uint32)", +"c15c09b5": "admin_set_exchange_rate(uint256)", +"c15d0b10": "getLoanValue(bool)", +"c15d15da": "_isValidSignatureAndData(address,address,bytes)", +"c15d7bca": "setEthToTokenConversion(uint256)", +"c15e47c4": "getFirstBatch(address,address)", +"c15e61c0": "Authorization()", +"c15f05fb": "changePrimaryArbitrator(address)", +"c15f618a": "purchasePokemon(uint256)", +"c15f68f0": "Retired()", +"c15f817d": "_import_island(bytes32,address[3],uint256[7],uint256[8])", +"c15f8779": "get_previous_item_in_state_from_item(bytes32,bytes32)", +"c1614981": "allocateLocked(address,uint256)", +"c1615945": "setAffiliateContract(address)", +"c1615c87": "DEFROST_PERIOD()", +"c161d506": "CollabCoinToken()", +"c162ba2f": "walletId()", +"c162bc03": "clearProposal(address)", +"c163bba7": "publish(string,string)", +"c163edf7": "OutcomeEvent(string,uint256)", +"c163fb0e": "ownedHouses(address)", +"c1640913": "RETAINED_TOKENS()", +"c166311f": "freeLotterySeconds()", +"c166c458": "getUserRequestCount(address)", +"c166ee38": "sweepAccount()", +"c1670257": "redeemContractSentTokens(address,uint256)", +"c1674b74": "assertReadyToClose(uint256)", +"c167d1cd": "getAvailableSupply()", +"c1684711": "migrateTokens(address)", +"c16849c0": "tokenSC()", +"c1687877": "buyTokens(uint256,uint256,address)", +"c168e037": "getCustomerPremium(uint256)", +"c1691fc3": "add_bonus(uint256)", +"c1694bd4": "TransferDetails(string,uint256,string,uint256,uint256,address[])", +"c16959b2": "_unpackRaceFinishData(uint256)", +"c1699a99": "stakePeriod()", +"c1699bf6": "setPrimaryAccount(address)", +"c169ec0d": "setBuzzCafe(address)", +"c16ac06f": "CM()", +"c16ae3ce": "_receiveFrom(address,uint256)", +"c16b451f": "_checkedTransfer(address,address,uint256)", +"c16b9374": "regularEndGame(address,uint32,uint8,uint16,uint256,int256,uint256,address)", +"c16bca13": "MIN_AUDIT_TIME()", +"c16bea20": "addControllerByPartition(bytes32,address)", +"c16c0851": "miningOneSelf()", +"c16d1377": "IS_CND_CONTRACT_MAGIC_NUMBER()", +"c16d3344": "setMinimumOfferPrice(uint256)", +"c16d515a": "_createCenturion(address)", +"c16e50ef": "validate(bytes)", +"c16f402c": "getEpisodes()", +"c16fe907": "getTransfer(uint256)", +"c1707f66": "stateSetOpen(uint32)", +"c170fd54": "bid(uint40)", +"c171747b": "convertEthToMet(uint256)", +"c1717f80": "BC2Token()", +"c171cfa6": "getBetValueByGamble(uint8,uint8)", +"c171fb91": "referrerLevel1Percent()", +"c172085e": "initialization()", +"c17281d0": "refundPartial(address,uint256,uint256,uint256)", +"c172aae5": "getIdentifier(uint256)", +"c172f9c9": "receiveApproval(address,uint256,address,bytes32)", +"c1733712": "authorizePayment(address,uint256,uint256)", +"c1733f68": "getToken(string)", +"c173508b": "removeConnection(address,address,bytes32)", +"c1736222": "tokenForSPSold()", +"c1739b69": "InfraOfOwner(address)", +"c1747585": "testEvent2()", +"c174cc59": "getrunused(address)", +"c1751903": "lockBreak()", +"c1756a2c": "sendEther(address,uint256)", +"c1758fee": "vest2mlDevelopers(address,address)", +"c1766657": "addBonusForMultipleHolders(address[],uint256[])", +"c176b1d8": "deletePriceIdv(bytes32)", +"c176d42a": "NavGlobalTourCoin()", +"c176e639": "payout(address[],uint256[])", +"c176e73b": "pkt()", +"c177c20f": "CliToken()", +"c177e804": "WEETtoken()", +"c177f22e": "findKingdomCalled(string)", +"c1784a4e": "safekey(uint256)", +"c1786ab2": "pre(address,bytes32,bytes32)", +"c178a2d4": "CreationContract()", +"c178fc87": "setTokenRate(uint256,string)", +"c1790561": "_getPetBonus2(uint256)", +"c179186e": "collectWinnings(uint256,uint256,uint256)", +"c179520c": "ManageAccount()", +"c17a099b": "presaleBonusTokensDistributed()", +"c17a893e": "transferAUTOtoken1(address[])", +"c17b5a93": "ProfitExchange()", +"c17b9770": "log2Floor(int256)", +"c17c0456": "ownerCEO()", +"c17c3521": "setHourlyRate(uint256)", +"c17ccc6c": "withdrawUnlockedTokens()", +"c17d8720": "checkBank(string,address)", +"c17de343": "isStarOwner(uint256,address)", +"c17e2aa1": "burnAllTokens()", +"c17e6817": "sendSafe(address,uint256)", +"c17e92b6": "unregisterFromBlacklist(address)", +"c17ed7bd": "purchaseSilver()", +"c17f23e8": "getRoundID()", +"c17f8891": "setEtherFeeMin(uint256)", +"c17ffac6": "unsetRegionForSale(uint256,uint256)", +"c180e1d0": "GCPToken()", +"c1811783": "FreezableToken()", +"c1812b15": "reorganizeOwners()", +"c1826d78": "Collect()", +"c1829a14": "testFailTooFewConfirms()", +"c182f531": "GetFreeEther()", +"c183660c": "cancelJobContract(uint256,string)", +"c18378a0": "sellTokensFrom(address,uint256)", +"c18384ec": "setRestricted(address)", +"c1838e92": "proposeTokenOwner(address)", +"c1839258": "LogTokenPurchase(uint256,uint256)", +"c1840b39": "_generateRandom(bytes32)", +"c1857bf7": "withdrawFoundation(address,uint256)", +"c185d772": "emissionStages(uint256)", +"c185e492": "preSaleThirdPrice()", +"c186dcbf": "getStaticArraySum()", +"c18715f8": "prolongationPermitted()", +"c1873e26": "releaseCoreTeamAccount()", +"c1889ff2": "payAccTax(uint256)", +"c188f44b": "addproduct(string,string,uint256,string)", +"c1891ac6": "multiplePing(address[])", +"c1899ca7": "request_dividend(address)", +"c18a40c7": "multiowned(uint256,address[])", +"c18b4136": "AAC()", +"c18b5279": "KFHToken()", +"c18b8db4": "listings(bytes32)", +"c18b9760": "test_insert_findWithHintPrevDecreased(int256)", +"c18bca5f": "setCollectionAddress(address,address)", +"c18ca54c": "testEvent(int256,int256,uint256,uint256,string,string)", +"c18d767a": "weiMinSalePreIco()", +"c18e8903": "totalWeiRaisedDuringICO4()", +"c18e94b4": "Keizer()", +"c18edde1": "saleopeningTime()", +"c18f4831": "burnFeeDenominator()", +"c1908360": "createEntry(string,string)", +"c190b129": "holderState()", +"c1912433": "acceptAndPay(bytes32,uint256[],uint256[],int256)", +"c1918e90": "accountAddressForSponsee()", +"c191cbd7": "TeamTokensAllocated(uint256)", +"c191d37d": "Escapable(address,address,address)", +"c1927292": "TIER1_BONUS()", +"c1929d8c": "ADVISOR_THREE()", +"c192ca98": "isCS(address)", +"c1932833": "maxAirdropParticipants()", +"c19358bb": "setPropertyLastUpdater(uint16,address)", +"c193fbf8": "pushArray(bytes32,address)", +"c19455c8": "signedTransferCheck(address,address,uint256,uint256,uint256,bytes32,address)", +"c1955e62": "spend(uint256,bytes32)", +"c195dc41": "getStageEndDate()", +"c19678d5": "canLotteryBeExecuted()", +"c196b54f": "bound(uint256,uint256)", +"c1971240": "dailyGrowthUpdated_date()", +"c197a7b1": "getLastStoragePayDate()", +"c197cdee": "preSaleTokenLeft()", +"c1989276": "MaxItems()", +"c1991040": "getCurrentVotingDescription()", +"c19a8095": "deleteUser(address,address)", +"c19bbf50": "getLockStatus(address,address)", +"c19c9a21": "CCTHCoin()", +"c19d7808": "MamaBearToken()", +"c19d93fb": "state()", +"c19da6b2": "canBuy(address,address)", +"c19dccd8": "KantrotechCoin1(string,string,uint256,uint256)", +"c19dd320": "cancel2(uint256)", +"c19e33ce": "COIN_SUPPLY_ICO_PHASE_0()", +"c19e7b00": "WeiCapChanged(uint256)", +"c1a06de3": "Valens()", +"c1a12d66": "crowdsaleOpen(bool)", +"c1a21bf3": "sellerBalances(address,address,uint256,address)", +"c1a2a8f4": "boards()", +"c1a2babc": "getMemberSince(address)", +"c1a38768": "STARTUP()", +"c1a3bb06": "total_bet_withdrawn()", +"c1a3bda5": "randomQueryID()", +"c1a6ec6a": "ADVISORY_TEAM_PORTION()", +"c1a7db7b": "MtcDailyLimitChange(uint256)", +"c1a82cdb": "reissueCertWithID(bytes32,bytes,bytes32,uint256,bytes32,bytes,bytes32,uint256,bytes32)", +"c1a85e16": "test_insert_findWithHintNextUpdateTail()", +"c1a9953f": "checkRokTeam()", +"c1aa049d": "getIsPurchased(address)", +"c1aa104e": "OpenRetailContract(uint16,bytes32,string,string)", +"c1aa5d98": "getGameIdByAddress(address)", +"c1aa721d": "lockAfterManuallyMint()", +"c1aaa717": "_bountySupply()", +"c1ab1b54": "RebateCoin()", +"c1abbf6a": "addjoinlist_even(address,uint256)", +"c1ac7902": "playJackpot()", +"c1ad5bea": "isdeposit()", +"c1ad7925": "finalizeFunding(address)", +"c1adb83e": "NecashTokenBase()", +"c1ae36d0": "carsOf(address)", +"c1ae4044": "checkBetColor(uint8)", +"c1af5785": "enterLottery()", +"c1afdd48": "belowSevenBets()", +"c1b0510a": "GlobalBusinessSystem()", +"c1b0561d": "PDTToken()", +"c1b056b0": "getNodeLeftChild(bytes)", +"c1b06513": "registerEvent(bytes32[])", +"c1b07b1a": "receiverOne()", +"c1b082b6": "issueOfTokens()", +"c1b0dc2f": "LogPolyClaimed(address,uint8,uint256,uint256,uint256)", +"c1b15e44": "_setAllowance(uint256)", +"c1b16cb0": "ownerAddAsset(string)", +"c1b2dfc1": "gameGiftMaxAmount()", +"c1b36489": "QuickUnionPayChain()", +"c1b3e6ab": "blockedSum()", +"c1b43a17": "secondHighestBidder()", +"c1b43af8": "IPchainStandardToken(uint256,string,uint8,string)", +"c1b466d6": "calculate0xbtcReceived(uint256)", +"c1b4aa51": "burnContractCoins(uint256)", +"c1b533b0": "getExchangeRateInUSD()", +"c1b58f6c": "unlockAllAllocationAddresses()", +"c1b664de": "setStageCount(uint256)", +"c1b668a9": "getBoardInfo(address,address)", +"c1b68a7c": "DebitClientOnce(address)", +"c1b73010": "removePauser_(address)", +"c1b74ad8": "propose(uint256,bytes32,address)", +"c1b7a892": "AsiaCoin()", +"c1b8847b": "setMaxFeeWithdrawal(uint256)", +"c1b8b704": "updateGlobalMax(uint256)", +"c1b90c7b": "_sendTokens(uint256,address)", +"c1b99811": "transferPrimordialToken(address,uint256)", +"c1b9f177": "bountyReserve()", +"c1ba93e1": "dbkDeposit()", +"c1bb95d0": "TransferConfirmed(address,uint256,uint256)", +"c1bbcbef": "MICKTOKEN(uint256,string,string)", +"c1bc2664": "ClearView()", +"c1bd1e85": "killFeed()", +"c1bd3685": "proposeSolve(uint256,uint256)", +"c1bd762b": "wantMyEther()", +"c1bd8186": "crowdsalepricing(address,uint256)", +"c1bd8ecb": "initializeCrowdsale(address,uint256)", +"c1bd9b12": "getShareAddressFromId(uint256)", +"c1bdff26": "onNewLoan(uint256,address)", +"c1be4031": "XaurumProxyERC20()", +"c1beb1e1": "MusereumToken()", +"c1bf1dcf": "setRegistrar(address,bool)", +"c1bf22a9": "XAUToken()", +"c1c02a46": "Atlas()", +"c1c03094": "EventBattleOver()", +"c1c0e046": "rescueAccount()", +"c1c0e9c4": "exec()", +"c1c1066b": "getCommentsCount()", +"c1c11aca": "GitToken(uint256,string,uint8,string)", +"c1c11c96": "getSender(address,uint256,address,uint256,uint256,uint256)", +"c1c1d218": "BOND()", +"c1c28d7d": "calNewTokens(uint256)", +"c1c379ac": "tokenTwitter()", +"c1c3eccf": "vestingPeriodInMonths()", +"c1c43648": "addAction(uint256,uint256,uint8[6],uint8[6],uint16[6],uint8[6],uint256,uint256)", +"c1c4676e": "updateGameCost(uint256)", +"c1c5897e": "AOMcoinERC20()", +"c1c5a3b6": "CaptainSell()", +"c1c5de4a": "tryDeposit()", +"c1c64ecf": "mintPriceBuffer()", +"c1c6c749": "changeWhitelistPrivateStatus(address,bool)", +"c1c6d4e8": "addLoanProduct(uint32,uint32,uint32,uint256,uint32,bool)", +"c1c723f4": "validateProposedMonarchName(bytes)", +"c1c74dde": "_setFunds(address,uint256)", +"c1c7bc68": "addFreeMineralMulti(address[],uint32[])", +"c1c8277f": "reclaimOwnership()", +"c1c8b89d": "Recash(uint256,string,string)", +"c1cbbca7": "contribute(uint256)", +"c1cbbe6c": "getRoundAvailableToken(uint256)", +"c1cbdff3": "moreThanSoftLimit()", +"c1cc0046": "returnOffer(uint64)", +"c1cc0775": "calculateFeeDynamic(uint256,uint256)", +"c1cc6958": "leekStealGo()", +"c1ccaed3": "pageBuyRecordByAccount(address,uint256,uint256)", +"c1cd1759": "SpicePayroll(address)", +"c1cda902": "setTradeable()", +"c1cdaae8": "generate(address,address,address,uint256,uint256)", +"c1ce53fc": "reflect(string)", +"c1ce56eb": "addAccount(address,uint256)", +"c1ce6647": "minAmountToGetBonus()", +"c1cfb99a": "get_balance()", +"c1d038b2": "getSkillIdByIndexAndLevel(uint8,uint8)", +"c1d11037": "updateAddresses(address,address)", +"c1d1f5c0": "BirdToken()", +"c1d1faf3": "createAuction(uint40,uint128,uint128,uint40,address)", +"c1d22403": "_subFromValueHeld(address,uint256,bool)", +"c1d25c3d": "insert(int256,int256)", +"c1d298ab": "emitFeesDonated(address,uint256)", +"c1d32ad5": "Distribute(address,uint256)", +"c1d34b89": "transferFromAndCall(address,address,uint256,bytes)", +"c1d357bc": "getMinAllowedBid(uint256)", +"c1d4691a": "withdrawalTo()", +"c1d47a21": "submitPayment(bytes8,uint32)", +"c1d4bc64": "originalsCount()", +"c1d4f708": "getMwLength()", +"c1d55af8": "buy(uint256,address,uint256,bool)", +"c1d5725f": "buyToken(address,address,uint256)", +"c1d5e84f": "addNewUser(address)", +"c1d6036b": "contractExchangeRate(address)", +"c1d63ce6": "deleteArrayBytes32(bytes32,uint256)", +"c1d66482": "Postman()", +"c1d6ab37": "setIsContainerForShareToken(bool)", +"c1d6cbd8": "getPlayerPoint(uint32)", +"c1d75bea": "IBM()", +"c1d9e273": "nextFreeCount()", +"c1da1881": "getPollType(uint256)", +"c1da3923": "ICOstartTime()", +"c1dbbfb3": "withdrawAllFromRoot()", +"c1dbd9b2": "authorize(address,uint256)", +"c1dbf5ef": "changePTSBAddress(address)", +"c1de0842": "quarterThird()", +"c1de93df": "Forwarded(address,uint256,bytes)", +"c1de9ef8": "getPositionHeldToken(bytes32)", +"c1dfacb2": "getQualifiersPoints(uint160)", +"c1e0e604": "updateUsdPerMEth(uint256)", +"c1e10f65": "distributeeBitcoinCashMedium(address[])", +"c1e1955e": "getaddressfocuscardid2(address,address)", +"c1e1b327": "adminCollectPastShopFund()", +"c1e31eab": "SERVER_TIMEOUT()", +"c1e3bd3e": "getParticipants(uint256)", +"c1e41f38": "COMPANY_TOKENS()", +"c1e457c8": "experienceDelay()", +"c1e472be": "returnNotes(uint256)", +"c1e4884d": "setSecondStageStartsAt(uint256)", +"c1e4dfda": "setPriceWei(uint256)", +"c1e50f3c": "internalAddManager(address)", +"c1e5202a": "isUserMakerFeeEnabled(address,uint256)", +"c1e52775": "addDenomination(bytes8,address)", +"c1e5304a": "CreateNewDraw(uint256,bytes)", +"c1e5976e": "getStarkKey(address)", +"c1e59a50": "Example4(string)", +"c1e6102b": "LunyrToken(address,address,uint256,uint256)", +"c1e65cb9": "BTRS()", +"c1e68672": "totalWhitelistedFunding()", +"c1e68e4b": "developer_string_D(string)", +"c1e6c506": "TokenPriceInWei(uint256,uint256)", +"c1e70e63": "startManualPeriod(uint256)", +"c1e71903": "getResults(uint256,string)", +"c1e7310a": "signEA(uint32)", +"c1e74d71": "minPresaleContributionEther()", +"c1e80334": "_acceptImplementation()", +"c1e99a0e": "isInitialInvestor(address)", +"c1e9c53e": "Lottery(uint8,uint256)", +"c1ea8b93": "preCrowdsaleTokens()", +"c1eac693": "ArisaCoin()", +"c1eb1840": "canBurn()", +"c1eb3534": "batchMintToPool(uint128[],uint256[],uint128[])", +"c1eb354a": "setlockall(uint256)", +"c1eb50a7": "LinaAllocation(address,uint256)", +"c1eb5ddd": "DEV()", +"c1eb8c89": "wihtdraw()", +"c1ec10f4": "RigoBlock()", +"c1ec4a2a": "RegisterContract()", +"c1eca4b0": "checkCanAddStockProfit()", +"c1ed41fa": "appliedPresale()", +"c1ed54a1": "isBetValid(uint256,uint256,bytes)", +"c1ee22dd": "EMISSION_FOR_SALESTAGE5()", +"c1ee3375": "autoTransferApproved(uint256,uint256)", +"c1ef098b": "storeHarvestOperationByRegulator(string,string,string,uint32,uint16,uint16,string)", +"c1f04f3c": "allWeights()", +"c1f06e89": "changeYUMOAddress(address)", +"c1f0dac1": "test_largeDeviationNotPermitted()", +"c1f0e2c3": "createGameRound(uint256)", +"c1f10663": "withdrawAccumulatedFees(address)", +"c1f16bdc": "getWeiBalance(address)", +"c1f18e38": "isExpired(bytes)", +"c1f19220": "summFounders1()", +"c1f1d116": "internalVote(bytes32,address,uint256,uint256)", +"c1f307c9": "_isTime()", +"c1f45e80": "sendForPreICO(address,uint256)", +"c1f52604": "winningPrice()", +"c1f573ca": "bidInAuction(uint256,uint256,uint256)", +"c1f602e0": "intoRoom(uint256)", +"c1f62946": "getSecretRevealBlockHeight(bytes32)", +"c1f64cb0": "supportedRoleList(uint256)", +"c1f77309": "assignedPayoutAddress()", +"c1f7c539": "initPricer()", +"c1f8056b": "createAvatar(address,string,uint256)", +"c1f979ab": "add_recent(uint256)", +"c1fa1ed0": "assertEq(bytes32,bytes32,string)", +"c1fae25b": "receiveAirDrop()", +"c1fb7c34": "hmin(uint128,uint128)", +"c1fb9b9e": "developer_How_To(string)", +"c1fcf863": "getSoftwareExecRecord(uint32)", +"c1fd2580": "spendable_supply()", +"c1fd4339": "createMarket(bytes32,uint256,uint256,address)", +"c1fe5281": "minPurchaseNum()", +"c1ff808d": "changeBonus(uint256)", +"c1ffc0a5": "MinimumEthereumInvestmentUpdated(uint256,uint256)", +"c2006a18": "set_fixedFeeInCWC(uint256)", +"c201293b": "setCollateralPoolContractAddress(address)", +"c20155df": "ethRate2()", +"c201df97": "UnLockAddress(address)", +"c2021d1b": "maxTeamBonusBps()", +"c203367a": "EnddatePresale()", +"c2038560": "setOutcome(bytes,bytes)", +"c203d77f": "setSaleFinishTime(uint256)", +"c204505a": "testFailRetractLatestRevisionDoesntHaveAdditionalRevisions()", +"c204642c": "airdrop(address[],uint256)", +"c204b288": "InvestorChanged(address,address)", +"c204f9f1": "_transferFromToICAP(address,bytes32,uint256)", +"c2052403": "payOut()", +"c20547b3": "getGameAmount(uint256)", +"c205afd4": "deferredTotalTokens()", +"c205e64c": "revokeInsertAgentAuthorization(address)", +"c20615ed": "ownerWithdrawn()", +"c20652fe": "setApiAddress(address)", +"c2083f55": "lacksFunds()", +"c2091d0e": "getPatron(uint256)", +"c209fbe9": "change_notice(string)", +"c20a20d6": "setBlipTokenAddress(address)", +"c20a6ae9": "EDMToken(address,uint256)", +"c20c0f3a": "betsForLevel(uint256)", +"c20c1d9b": "newWithdrawCommission(uint256)", +"c20dcbf7": "createPool(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,string)", +"c20e346f": "unFrozenToken(address,uint256)", +"c20ec5dc": "numberOfFriends()", +"c20f966b": "Utcoin()", +"c2108a92": "calculateBalance(uint256,uint256)", +"c210c623": "getKeys(uint32)", +"c21191ae": "GechainCoin()", +"c2127e03": "getMyShrimp()", +"c212bad5": "dropModule(string,bool)", +"c212cffa": "NUGOLD()", +"c2134b23": "addRecoverer(address)", +"c215290a": "frozenUntil(address)", +"c215e800": "currentSubRound()", +"c2161c31": "getStringHash(string)", +"c2168ecd": "removeMintContract(address)", +"c216c0d3": "addCredits(address)", +"c217a724": "spendWithGasAndData(address,uint256,uint256,bytes)", +"c217c0e1": "ClickGemTokenERC20()", +"c2190c94": "registerSettlement(uint64,address,address)", +"c219c28c": "votingTokenAddress()", +"c219d326": "getData_14()", +"c21aa2e4": "PoHarj()", +"c21ab7f9": "createToken(address)", +"c21abf05": "tatalEthFromBuyer()", +"c21afa55": "MintingManagerRevoked(address)", +"c21afe12": "schedulePriceUpdatesRolling(uint256,uint256,uint256)", +"c21bbe56": "SetupDone()", +"c21c45e3": "iconRate()", +"c21c5ee1": "fixSpecications(bool)", +"c21c9c21": "validEvent()", +"c21d0204": "SetEvaluate(bytes32[],uint8,uint64[])", +"c21d5ab7": "setNode(address)", +"c21db033": "removeSupplier(address,address)", +"c21de274": "transferReverseProxyThirdParty(address[],uint256[],uint8[],bytes32[],bytes32[])", +"c21e5712": "makeLiquidCor()", +"c21ea693": "retraitStandard_3()", +"c21ec92c": "getAssetIpfs(uint256)", +"c21ed112": "genesisVirus()", +"c21fb125": "SpecificApproval(address,address,uint256)", +"c21fcffb": "DIYTubeCoin()", +"c2205ee1": "_authority()", +"c22082ab": "EveryCoin(address,uint256)", +"c2222b80": "claimSubscriptionDeposit(uint256)", +"c222ef6d": "periods(bytes32)", +"c2234f67": "CONVERSION_DENOMINATOR()", +"c2235e74": "getTotalAmountOfChatMessages()", +"c2236b26": "setICO3Phase()", +"c2239daa": "setselfdropamount(uint256)", +"c223f557": "stopRedeeming()", +"c2248877": "getBarCodeDataCount(bytes32)", +"c2248c22": "changeOldTokenReward(address)", +"c2250a99": "transferStoreOwnership(address)", +"c225752c": "OneChanceCoin(string,string,uint8,address,address)", +"c22598d2": "BitClemm()", +"c225bf03": "resetContractDeploymentDate()", +"c226d279": "setMiniPoolEdit_7(string)", +"c226d9ee": "doTest()", +"c2276090": "settleBet(bool)", +"c227cee0": "shutThatShitDown()", +"c2289576": "AddTitle(uint256,string,string,string,uint256)", +"c228bcc6": "getFillVolumes(bool,bytes,uint256,uint256)", +"c2299e33": "shutdownMarket(bytes32)", +"c22a146c": "Unlock(address,string,bytes32)", +"c22a933c": "setBaseDeposit(uint256)", +"c22ab4e0": "reservedWallet()", +"c22af7ff": "ComputeBuy(uint256)", +"c22c4f43": "services(uint256)", +"c22d6c3c": "setArenaInterface(address)", +"c22f0ee2": "transferManagers(address)", +"c22f1c54": "_initializeAccount(address,address,uint256,uint256)", +"c22f8250": "updateStandard(bytes4,bytes4)", +"c22fc384": "exitScam()", +"c2304c4a": "addExplicitPosition(uint32,int64)", +"c2314be4": "CONFIG_FEES_DIV()", +"c231bace": "setMigrationTarget(address)", +"c232209e": "_verify(address,string)", +"c2328516": "disablePrivateFund()", +"c2329e5f": "_isNotOnSale(uint256)", +"c233e870": "isLatestPatchTree(bytes32,bytes32)", +"c2353918": "getCount(uint256)", +"c2356d23": "mintChest(address,uint16,uint24,uint24,uint8,uint8)", +"c235a5c7": "getGameStart(uint256)", +"c235e858": "VendorInterface(address)", +"c2362dd5": "lastEpochBlock()", +"c23693e0": "multiAccessRequired()", +"c23697a8": "check(address)", +"c236cc66": "GeneralUpdate(uint256,uint256)", +"c2370a62": "openGameResult(uint256,string)", +"c237898d": "getOwnerBalanceInMilliTokens()", +"c2381296": "beginPwn()", +"c2385fa6": "right78(uint256)", +"c238999b": "dislikeTrack(address,bytes32)", +"c239dfe0": "PermissionAdded(address)", +"c23a25ba": "getRoundBetOrigin(uint256,uint256)", +"c23a7427": "createMultipleWikiPages(string[])", +"c23a9e84": "getuserinverst()", +"c23b4b5b": "bountyShare()", +"c23c87d5": "play(bool)", +"c23da3a9": "initialSaleEndDate()", +"c23de962": "DefaultActionCalled()", +"c23e1cea": "SaleTokens()", +"c23ec301": "KSScidTOKEN()", +"c23f001f": "balances(address,address)", +"c23fed45": "setEscapeRequest(uint32,int256,uint32)", +"c2407089": "CursedToken()", +"c2410a69": "lockCostPerHour()", +"c2412676": "Token()", +"c2427f76": "getBidID(address,bytes32,uint256,uint256,uint256,uint256)", +"c242afaf": "bet(uint256,uint256,uint256[],uint256,address,bytes32)", +"c243431e": "AnalyticProxy()", +"c24366f0": "setKYCProvider(address)", +"c243bdee": "isHolderOwnAddress(bytes32,address,address)", +"c24504b7": "internalBuyTokens(address,address,uint256)", +"c245c1bc": "ownerBurnToken()", +"c2473378": "consortiumPlaceholder()", +"c247620d": "getArtistInfo(address)", +"c2490a67": "removeCardOwner(uint64)", +"c24924d6": "setQueryFee(uint256)", +"c2494dbf": "transferOnWallet()", +"c24962f4": "calculatePercentageToRelease(uint256)", +"c24977cf": "testPrivate()", +"c2498be6": "conjureAirdrop()", +"c24a0f8b": "endDate()", +"c24a8908": "token_airdrop_cnt_max()", +"c24a9674": "finalizeLastRound()", +"c24ad463": "Refundpot()", +"c24becf3": "getLastTier()", +"c24c153d": "addRound(uint256,uint256,uint256,uint256,uint256,bytes32)", +"c24d316e": "UNITDummyPaymentGateway(address)", +"c24de0e4": "halvingSubsidy(uint256)", +"c24dec82": "TOKEN_BUSINESS()", +"c24e1fc1": "issuedSupplyRatio()", +"c24fe21b": "transferLockup()", +"c2502d34": "claim_price_money()", +"c2506eee": "setO3(address)", +"c2507ac1": "getTokenAmount(uint256)", +"c2507ef7": "_createPanda(uint256,uint256,uint256,uint256[2],address)", +"c250a312": "active_withdrawable()", +"c250ef46": "refSystem(uint256,address)", +"c25193ad": "lcm(int256,int256)", +"c251a4e9": "G2Ufund()", +"c252ca75": "getBonusPercent(address)", +"c252d844": "rest_time()", +"c253400b": "RPS(address)", +"c2535bf0": "COOLCOIN()", +"c254e4db": "SFT()", +"c2552497": "impl_mining(address,bytes)", +"c255343e": "targetUser()", +"c255fa40": "updateTotal()", +"c255fb17": "getRefBalance(address)", +"c25615c0": "joinOneLottery()", +"c256d578": "getLastAuctionWinsDate()", +"c256ea58": "get_receiverCryptobank(uint256)", +"c2571a0a": "percUp(uint256)", +"c2572c51": "advisorsAndPreICO()", +"c2577661": "getBallotPapper(uint256,uint256,uint256)", +"c257c851": "calculateEtherReceived(uint256)", +"c257eabb": "etherPaid()", +"c257f3ab": "getNumberOfShipsByOwner()", +"c258ff74": "List()", +"c2596b1e": "getDragonPrice(uint256,uint256)", +"c25a796e": "setHardcupFalse()", +"c25ab8b0": "iOSCoin()", +"c25acada": "Bithereum()", +"c25ae09f": "EthealNormalSale(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"c25b345a": "VivekRohitVibhayToken()", +"c25c22ee": "stageTokenMul(uint256)", +"c25cf1d0": "changeLockPeriod(uint256)", +"c25d0ac1": "tgeSettingsPartInvestor()", +"c25e6908": "ultimateOutcomes(bytes32)", +"c25f1901": "addThing(bytes32,string,string,string)", +"c25f1afe": "SponsorAdded(address)", +"c25f75fc": "pantry()", +"c25fe1a4": "changeHoldingTax(uint256)", +"c2606d99": "BITTECHToken()", +"c2608314": "getJntBeneficiary()", +"c260f681": "IsBoilerValid(uint256)", +"c2610cda": "SecretNumber()", +"c26181e0": "censorUser(address,bool)", +"c2619a5a": "AdministratorAdded(address,address,bool)", +"c26298a7": "getBalanceOfResidualBcoupons()", +"c262a33b": "preSaleCloseTime()", +"c262b912": "createCampaign(string,uint256[3],uint256[],uint256,uint256,uint256,uint256,string,int256)", +"c262df45": "isKnownRequest(address,address)", +"c26317d1": "RoundRevealStarted(uint256,uint256)", +"c26381f2": "limitETH()", +"c264786f": "pauseBlockNumber()", +"c264a063": "withdrawExcess()", +"c264a77c": "setSettleTimeout(uint256)", +"c2656473": "CROWDSALE_LIMIT()", +"c265a6c0": "KRCPreSaleContract(uint256,address,address)", +"c26613d5": "LogRebalance(address,bytes32,string,uint256,uint256,uint256)", +"c2664609": "submitStackholderTransaction(address,bool)", +"c2674780": "freecommunitycoin()", +"c2676e39": "VAToken()", +"c267e4b8": "previousWeiBalance()", +"c26875a4": "calculateCellBuySimple(uint256)", +"c268e777": "setDailyHourLimit(uint8)", +"c268e93f": "recordShareholders(address,address,uint256)", +"c269014b": "getMemberId(address)", +"c2695a25": "Rivercoin()", +"c2699b1d": "getFirstBuyLimit(bytes32)", +"c269f263": "PRETDESupplyRemaining()", +"c26a331d": "bonusProvider()", +"c26aa3c9": "lockUnicorn(uint256)", +"c26b41e7": "totalUETsSold()", +"c26b7ce9": "CashTelexToken()", +"c26b93df": "vote(uint80,uint256)", +"c26bacd1": "removeDriver(address)", +"c26c12eb": "getQuorum()", +"c26c7472": "addTimeToExpiry(uint256)", +"c26c84ec": "setBI(bytes32,int256)", +"c26d0412": "ethRate1()", +"c26d0c2c": "emitWorkPaused(uint256,uint256)", +"c26d69e1": "OnePercentGift()", +"c26d7daa": "startGladiatorBattle(uint256)", +"c26dd189": "jade(uint256)", +"c26fe7ce": "releaseVestedTokensFor(address)", +"c270cbeb": "BtcThumb(uint256,string,uint8,string)", +"c270ce28": "rdCollectorAddress()", +"c270d7cb": "getPlayerRoundWinningInfo(uint256,address)", +"c2710949": "calcValuePerShare(uint256,uint256)", +"c2714a97": "addBRA(address)", +"c271ca90": "numMomentsOf(uint256)", +"c2722ecc": "getStore()", +"c2723d2e": "token_transfer(address,address,uint256,bytes)", +"c272f73e": "burnSignature(bytes,address,address,address,uint256,uint256,uint256,uint256,bytes)", +"c27382d9": "buyAndPlayGame(uint256,uint256,address)", +"c273b05f": "spentParsecs()", +"c27509cf": "investDirect()", +"c27549d9": "setRemainders(uint256,uint256)", +"c276086f": "createProducer(bytes32,uint256,bytes32)", +"c2761031": "k(uint256,uint256)", +"c2765b77": "setLegalToken(address)", +"c276963f": "tabsOneEthCanBuyICO()", +"c2769b11": "renounceVesterManager()", +"c276dce3": "internalForward()", +"c2775347": "haltsTrades()", +"c2777ce3": "currentEtherRateInCents()", +"c277f1ac": "fromId(uint256)", +"c277fe56": "pause(bool,string)", +"c2783ee5": "viewCrowdSaleLive(bool,bool)", +"c2784966": "TkoWhitelist(address)", +"c279d042": "product4_sell()", +"c27a65c1": "changeEthPriceQueryDelay(uint256)", +"c27a74d0": "catOwners(uint256)", +"c27b1ed9": "getConversionRateFactor()", +"c27b2c2d": "collectEarnings()", +"c27bc67c": "configureKeys(uint32,int256,bytes32,bytes32,uint32,bool)", +"c27bc7b2": "fortifyClaims(address,uint16[],uint256,bool)", +"c27c327e": "changeNewRubesUntilPayout(uint256)", +"c27cabb5": "proposalFee()", +"c27d1580": "getNorsefirePrice()", +"c27d607b": "lastEvidence()", +"c27d7721": "create(uint256[101][])", +"c27e7398": "getLockedTimeUserInfo(address,address)", +"c27fc305": "f1()", +"c280541c": "buy(uint256,address,bytes32)", +"c2808d1a": "MinSum()", +"c2812f74": "triggerMinCap()", +"c281309e": "feeTake()", +"c28196b1": "addImmigration(address)", +"c281a013": "FinalizableCrowdsale(uint32,uint32,uint256,address)", +"c281d19e": "cbAddress()", +"c283226d": "reclaimTokens(string,string)", +"c2832430": "withdrawForfeited(address,uint8,address)", +"c2843a14": "addInviterValue(uint256,uint256,address,address)", +"c2844c60": "emitJobRatingGiven(address,address,uint256,uint8)", +"c2844ebf": "isCustomerAlreadyRegister(address)", +"c2845184": "SUPPLY_FOR_REFERAL()", +"c284ab55": "eLYQD()", +"c284cdc5": "GetDescript(string)", +"c2852f38": "pauseContract(uint256)", +"c2856ca9": "presoldMax()", +"c285a245": "preferredSaleTLYperETH()", +"c285daf9": "Xoflife()", +"c286ba5b": "unfreezeAccountTimeAndValue(address)", +"c286f3d9": "SetLockAddress(address)", +"c287820a": "kittensSold()", +"c287fa72": "calcDiviDistribution(uint256,uint256)", +"c288ab9d": "getUserCurrentMartialId()", +"c288eeee": "nowPeriod()", +"c2897b10": "stand()", +"c289adfa": "getAssetPrice(uint128,uint128)", +"c289dbe8": "first_withdrawal(uint256)", +"c28a56f1": "checkReceiptProof(bytes32,bytes,uint256[],bytes,bytes)", +"c28a9157": "bullsmasterReq()", +"c28aafb1": "addWallet(address,string)", +"c28b4369": "giftCard(uint256,address)", +"c28b4577": "setPermissionById(uint8,bytes32)", +"c28bfe5a": "testFailCreateSameIpfsHashAndNonce()", +"c28c770a": "getLockedTokensPerUser(address)", +"c28cedf3": "DEMO()", +"c28d38a8": "STARTING_SEEDS()", +"c28d5644": "LogMinSell(address,uint256)", +"c28db642": "tocancel(uint256)", +"c28dbc38": "grantAccessForToken()", +"c28de2cd": "upgraded()", +"c28e5022": "collectAndUpdate(address[])", +"c28e6e39": "ReducingSupplyCoin()", +"c28eab85": "setMinimumTokenSell(uint16)", +"c28ec9d7": "respondToChallenge(uint256[9],bytes,bytes32[],bytes,bytes32[],bytes,bytes32[],bytes,bytes,bytes32[])", +"c28f57ca": "ICOSaleStart()", +"c28f812c": "getPaycarnita()", +"c28f8e09": "icoFunded()", +"c28f9df1": "requestVestingTrusteeOwnershipTransfer(address)", +"c290367f": "playDiceCombinations(uint256,uint256,uint256)", +"c290d691": "pay(uint256)", +"c291ad27": "Notify_Number(string,uint256)", +"c291bf6d": "AuthDapps(address,bool,int256,bool,bool)", +"c291df56": "affPercent_()", +"c29224ea": "roundFailedToStart()", +"c292aae3": "McrForGasFailed(address,uint256)", +"c2930f91": "baseUnit()", +"c29338cf": "cozyTime(uint256,uint256,address)", +"c293fc0a": "SetBankerPrincipal(uint8,uint256)", +"c29402f1": "relistGenesisSales(bytes32,uint256)", +"c2944f69": "_multiSendOwner()", +"c2944f7a": "registHolderStep(address,uint8,address)", +"c294c93b": "getSANOwner(uint256)", +"c2954ff4": "Sent(address,uint256,bytes)", +"c2955bdf": "setUserBlacklistedStatus(bool)", +"c296302a": "transferRoot(address)", +"c296f721": "_buyLandForCandy(address,uint256)", +"c29721e0": "sendArena(address[],uint256[],uint64)", +"c297fa0f": "DEFAULT_DURATION()", +"c2985578": "foo()", +"c2992300": "setCreatePrice(uint256)", +"c29988db": "distributeEbyte(address[],uint256)", +"c299a394": "getNextRank(address)", +"c29a6fda": "setERC20(address)", +"c29d350f": "startTimeOf(address)", +"c29d9d74": "startMultipass(string,string,string,string,string,uint256,address)", +"c29e8863": "setImplementation(bytes32,bytes32,address,bytes32)", +"c29fb94a": "transferFokenIssued(uint256,uint256)", +"c2a029f0": "setID_control(uint256)", +"c2a15dbb": "_currentIcoPhaseBonus()", +"c2a15e7e": "votingEndsInHHMM()", +"c2a24b33": "Post(address,string,string)", +"c2a2747b": "p1()", +"c2a2916d": "nameAddress(string)", +"c2a33485": "setReg3(uint256)", +"c2a394cb": "AuctionSuccessful(uint256,uint256,address,address,uint256)", +"c2a48c70": "revokeUserRole(bytes32,string,address)", +"c2a49237": "memberSellToken(uint256)", +"c2a5e5c2": "setTwitter(string)", +"c2a63e3b": "getEmployeeCount()", +"c2a88340": "Deactivate()", +"c2a8ec80": "betStats()", +"c2a95cc9": "updateTrustSettings(address,uint256)", +"c2a960a1": "signSendFlower(bytes32,string,string,address,string,bytes16,uint256)", +"c2a96ce5": "EscrowVault(address)", +"c2a98b41": "mymethod(uint256,string)", +"c2aaf9c4": "receiveEth(uint256)", +"c2ab66dd": "hasAttribute1ButNotAttribute2(address,bytes32,bytes32)", +"c2ac0b4a": "intMax(int256)", +"c2ac3aff": "addEth()", +"c2ac481c": "disaToken()", +"c2acc5cf": "mintTokens(address[],uint256[])", +"c2add678": "getLockerInfo(address)", +"c2adf34a": "bonusWeiAmount()", +"c2ae1a53": "sendTransaction(bytes32,uint256,int256)", +"c2ae7e14": "approvePaillier(address,string)", +"c2aeb355": "GRAMATON()", +"c2b06664": "setDS(address)", +"c2b0c743": "payETHToProvider(address,address,uint256)", +"c2b12a73": "setBytes32(bytes32)", +"c2b2fb5e": "editionExists(uint256)", +"c2b373a7": "seedHash()", +"c2b41ac4": "updateMinimumStakingTokenPercentage(uint8)", +"c2b4470c": "FINLAB_PRESALE()", +"c2b477a7": "mintLimitByTemplate(uint256)", +"c2b4ab4d": "getCountBonus(uint256)", +"c2b4ddde": "setFundingEnabled(bool)", +"c2b6b58c": "isClosed()", +"c2b70850": "QuantiModoToken()", +"c2b7be16": "addSupportedToken(address,address)", +"c2b8fd12": "MYRN()", +"c2b98295": "balanceOfNonKYC(address)", +"c2ba4744": "canMint(address)", +"c2ba5b40": "getPackageData(string)", +"c2ba857e": "setJobAccepted()", +"c2baa882": "tokensPerCHF()", +"c2bc2efc": "get(address)", +"c2bdb862": "verifyProofOfTransitionAgreement(address,uint64,uint256,bytes32,uint256[2],bool,bytes32,bytes32,uint8)", +"c2bf17b0": "recover(bytes32,uint8,bytes32,bytes32)", +"c2bf1af7": "freezingStatus()", +"c2c06f20": "OldRopeToken()", +"c2c13a70": "LOCKUP_WALLET()", +"c2c3bd6a": "_v()", +"c2c4a328": "getInitPrice(bytes32,uint8)", +"c2c4abe6": "ASSPToken()", +"c2c4c5c1": "checkpoint()", +"c2c5143f": "bobMakesEthDeposit(bytes32,address,bytes20)", +"c2c52055": "ChampionGameStarted(uint256,uint256)", +"c2c546b8": "sumICOStage6USD()", +"c2c5b9f1": "setInt(string,int256)", +"c2c5ec41": "isValidProof(bytes32,string)", +"c2c5f89f": "BonusAwareCalculator(address,address)", +"c2c61d01": "agreeToTrade(address)", +"c2c62562": "setCrowdsaleData(uint256,uint256,uint256)", +"c2c68ee1": "unlockTrading()", +"c2c7ca1d": "extraTokensMintedDuringPresale()", +"c2c7ff0a": "ToperCoin()", +"c2c8fd40": "increaseWorldLimit(uint256,uint256,uint256)", +"c2ca058d": "clearBlacklistMapping()", +"c2cb88bd": "giftMessage()", +"c2cb9927": "reward(address,uint256,uint256,string)", +"c2cba306": "TokenAddress()", +"c2cbb299": "airdrop_auto(address,address)", +"c2cca62c": "TransferMinersReward()", +"c2ccb8a8": "isCurrentAccountMinter(address)", +"c2cd0e01": "issueNewCoins(address,uint256,string)", +"c2cd7632": "isEmployee(address,address)", +"c2cdaf24": "start1BonusPeriod1()", +"c2cdbf01": "SyloToken()", +"c2cf7326": "hasConfirmed(bytes32,address)", +"c2cf9bbb": "PotPotato()", +"c2d0916f": "moveMetadata(address,address)", +"c2d15d21": "totalIssuanceLastAverageBalance()", +"c2d23e41": "continuousBacking()", +"c2d25167": "closeIcoOne()", +"c2d37428": "withdrawForWinner(uint256)", +"c2d415e2": "Chicken()", +"c2d4160a": "GetEvaluate(uint256,uint8)", +"c2d42ef2": "removeAccount(uint256)", +"c2d4423f": "excludeWhale(address)", +"c2d4489f": "provider2()", +"c2d4f851": "calculatePrice(uint256,address)", +"c2d526aa": "_rank(uint256)", +"c2d53eb4": "initOwner()", +"c2d560ab": "stopOraclize()", +"c2d5baf9": "JJL()", +"c2d83718": "randomTeam()", +"c2d83e61": "UserPool(address,address)", +"c2d86376": "NewDonor(address,uint256,uint256)", +"c2d8de54": "promisor()", +"c2d936d9": "MINATOKU()", +"c2d9c196": "preico_startdate()", +"c2da621b": "setMeterPoint(address,int256)", +"c2dab162": "mineit(address,uint256)", +"c2db0482": "getUnionIdByAddress(address,address)", +"c2db26fc": "unverifyAccount(address)", +"c2db2c42": "purchaseToken(uint256)", +"c2db5890": "breedAxies(uint256,uint256,uint256)", +"c2db8676": "BloodToken()", +"c2db9e25": "getMinerHalvingHashRate()", +"c2dc0470": "KilledTillNow()", +"c2dc9af4": "hardCapHash()", +"c2dcdfb4": "preferredSaleTokensLeftForSale()", +"c2dced85": "numberDecimal18()", +"c2de2909": "drawRandomWinner()", +"c2de89b7": "getCleide()", +"c2def3b9": "getOrganizer()", +"c2df8815": "Adnity()", +"c2e0af44": "doMove(address,address,uint256)", +"c2e12f21": "setDefaultTranches(bytes32[])", +"c2e171d7": "Save()", +"c2e26adb": "bulkPay(address[],uint256,address)", +"c2e28dd1": "setTitulaire_Compte_8(uint256)", +"c2e2a338": "withdrawRejected()", +"c2e2a33e": "setPermanentLimitForType(uint32,uint256)", +"c2e3460d": "Anxxia()", +"c2e4601a": "getAffiliateRate(uint256)", +"c2e46379": "transferBountyTokens(address[],uint256[])", +"c2e4b8fb": "TokensUpgradedFrom(address,uint256)", +"c2e52206": "getPlayerCount()", +"c2e55da3": "product3_pot()", +"c2e5d950": "finalizedRefund()", +"c2e5ec04": "setTradingEnabled(bool)", +"c2e5feb5": "KeyReplaced(address,address)", +"c2e62675": "COTToken()", +"c2e78f12": "deVerify(address)", +"c2e800ed": "isContractProxy(address)", +"c2e88185": "CyberMusicToken()", +"c2e9fab3": "SubUser()", +"c2ea2f9c": "halfCentury(address)", +"c2ea5c9e": "getInvArray()", +"c2eaaeb3": "computeTxFee(uint256)", +"c2eac875": "secure(uint256,string)", +"c2eb10a2": "makeBundle(uint256)", +"c2ecdf8e": "ownerCMIT()", +"c2ed2b05": "documents(uint256)", +"c2eddfd2": "kyberMultiSigWallet()", +"c2edec0b": "setCharityDonation(uint256)", +"c2ee0a57": "getBlockList()", +"c2ee3a08": "ONE()", +"c2eef08e": "stopLandEthSale()", +"c2f02b33": "Crowdsale7(address,uint256,uint256,uint256,address,address)", +"c2f0bb29": "getCardDetails(uint16,uint8,uint256)", +"c2f0c083": "angelOnLeaderboard(uint64)", +"c2f0d93f": "icoAbandoned()", +"c2f0dbe2": "claimPremium(address[2],uint256[7],uint8,bytes32[2])", +"c2f137f1": "swapAddr()", +"c2f3ce10": "ADDRESS_LIMIT()", +"c2f3d788": "read_total_number_of_purchases()", +"c2f415b5": "CTBoatGame(address,address,uint256)", +"c2f490e9": "caller_()", +"c2f4976f": "setRoundFinalScore(uint16,bytes32)", +"c2f4faf4": "TestOrder(address)", +"c2f61a9f": "setOraclizeQueryType(string)", +"c2f666a3": "PriceIncrease()", +"c2f7c50a": "FindID(address)", +"c2fa6697": "fundraiserCallData()", +"c2fa8b2d": "PoetToken()", +"c2faa691": "Constructor(uint256,string,string)", +"c2fb538e": "updateFactoryContract(address)", +"c2fb8f36": "TinyHuman(address,address,address)", +"c2fbe7bc": "transferFees()", +"c2fc048a": "transferOwnerToProxy()", +"c2fcbf37": "isValidateParameter(string,uint256)", +"c2fce718": "getPartsOfOwnerWithinRange(address,uint256,uint256)", +"c2fd0263": "isTripleNumber(uint256)", +"c2fe2022": "getFollowers(address)", +"c2fe3321": "PRE_ICO_ON()", +"c2febe49": "QuantorToken()", +"c2febef5": "removeCountry(uint256)", +"c2ff0f15": "NewShare(string,bool,string)", +"c2ff3334": "jump(uint256)", +"c2ff7a38": "adjustBalanceCheckpoints(address)", +"c2ffc7bb": "slates(bytes32,uint256)", +"c2fffd6b": "setCancelFee(uint256)", +"c30096ef": "calculationTeamsRewards(uint256[])", +"c3017200": "removeAssociatedAddress(uint256,address,address)", +"c3027525": "getOwned()", +"c302a45b": "crowdsaleStopped()", +"c302f747": "poolPresale()", +"c30354cb": "VUP_TOKEN_SUPPLY_TIER3()", +"c30381b9": "setSellCourse(uint256)", +"c303c3d5": "returnEtherToInvestors()", +"c303c53a": "withdrawForTwoStep()", +"c304b368": "updatedRandom(string)", +"c304ffc4": "CreateICE(address,uint256)", +"c3059c63": "buyUpgradeCard(uint256)", +"c306834e": "PRIVATE_SALE_LIMIT()", +"c306cb90": "sendDevTokens()", +"c30715d1": "setNumRewardsUsedForAddress(uint256,address,address)", +"c30718e8": "testIntParser()", +"c3077c10": "settxpct(uint256)", +"c307f6ba": "withdrawWbtToken(address,uint256)", +"c3082e95": "playerOutputAtNow(address)", +"c308f55b": "fallback(uint256,address,uint256)", +"c30a990a": "createPaymentChannel(address,uint256,uint256)", +"c30b06e8": "allMultitokens()", +"c30b182e": "sendVNET(address,uint256)", +"c30b8867": "maxPercentPerPlayer()", +"c30bc5ef": "breedWith(uint40,uint40)", +"c30bf4d8": "CodeEligible()", +"c30c0c0c": "checkUsers(address,address)", +"c30d0ee4": "phiRate()", +"c30dafd8": "_setTittyForSale(bool,uint256)", +"c30df14c": "logPurchase(address,uint256)", +"c30df586": "ZAI()", +"c30e9767": "canReceive(address,address,bytes32,uint256,bytes)", +"c30ed0a4": "Getwsic(uint256)", +"c30f4a5a": "updateURI(string)", +"c31028dc": "hasFirstUnionIds(bytes32,bytes32)", +"c31051fe": "teamPeriodLength()", +"c31053f7": "NNT()", +"c310b9df": "ProposalAdded(uint256,uint256,string,bytes32)", +"c311a3cd": "GetHoga(address,uint32)", +"c311d049": "withdrawEth(uint256)", +"c312d468": "sendPToken(address,uint256)", +"c312ffed": "Contributed(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"c31422ac": "calculateTokens(address,uint256)", +"c3143fe5": "setUserCap(address,uint256)", +"c31453a7": "_unpackAttackParams(uint256)", +"c3146814": "pegETHUSD(uint256)", +"c3153834": "prefixedRecover(uint8,bytes32,bytes32,address)", +"c315432a": "isGameStarted()", +"c3155201": "XulCrowdsale(uint256,uint256,uint256,address)", +"c31592af": "getY(bytes)", +"c315a082": "KRT()", +"c3169ef2": "respond(uint256,uint256[4])", +"c316c98b": "updateCollector(address)", +"c3173774": "balanceThreshold()", +"c317464d": "CryptoHearthStone()", +"c31752c0": "getEmployerJobs(address,uint8)", +"c3182360": "getTimeBonus(uint256)", +"c3191f31": "readWelfareAddress(uint256)", +"c3192c82": "getcurrNumOfUpgrades()", +"c319618f": "getAllMyPackageIds()", +"c31989ed": "TronGold()", +"c319a02c": "right98(uint256)", +"c319e412": "allowContribution()", +"c31a0972": "OrpheusRoyalSiamRailways()", +"c31ad7dc": "voteYes(string)", +"c31b29ce": "GAME_DURATION()", +"c31bb2fb": "XEPToken()", +"c31bb8d6": "percentToTakeAsRake()", +"c31c0b62": "isSaleComplete()", +"c31c5221": "approveSetTokenControlInfo()", +"c31c6855": "presaleBonusTokensClaimed()", +"c31ce93e": "getExchangeGroups()", +"c31ceb2a": "numberOfAttendees()", +"c31d0031": "CrowdFundDAO(string,uint8,string)", +"c31d309a": "addRequestorAddress(address)", +"c31d3a6d": "payInvestors()", +"c31d3e8e": "maxPublicSale()", +"c31e0547": "quickConverter()", +"c31e6ee0": "sendTokensToService(address)", +"c31f3537": "removeBotAddress(address)", +"c31f586d": "cancelSaleAuction(uint256)", +"c31fa083": "setIpfs(string)", +"c32011f0": "unfreezeTeamRecepientBlock()", +"c3204954": "confirmTransactionByMediatorFee(uint256)", +"c320c727": "setRegistrationFee(uint256)", +"c3210eb7": "proposeCount()", +"c3218f50": "startPreICO(address)", +"c321dc18": "showParticipantWei(address)", +"c32221cf": "_newRepo(string,address)", +"c32377df": "recevoirApprobation(address,uint256,address)", +"c3237ff4": "emitFeePeriodClosed(uint256)", +"c32426c9": "ProvideToken()", +"c324606a": "confirmStakeholderTransaction(uint256)", +"c324a669": "purchaseSoldiers(uint256,uint256)", +"c325ae4e": "belongsToUser(address)", +"c3262dfd": "setUserID(bytes32)", +"c3283d83": "getStrandContract(uint256)", +"c32863a7": "every15()", +"c32935d7": "getBuyPriceTimesByTime(uint256)", +"c329e4a5": "BoardAddressChanged(address,address,address)", +"c32a4369": "getAllSamplesForOwner(address)", +"c32a4c7e": "returnCoke(uint256)", +"c32a50f9": "setSeed(uint256)", +"c32a6f6d": "toUint(string)", +"c32a88ae": "recoveryPaymentDigest(bytes32,uint256)", +"c32a8edf": "someMethod1(uint256,uint256,uint256,uint256)", +"c32a9b00": "do_grant_tokens(address,uint256)", +"c32aaa86": "getNameWriterId(bytes32)", +"c32b8683": "creatorRequestFundTransfer(uint256,address,uint256)", +"c32c1e65": "setOperations(address)", +"c32cc6d5": "investFor12Months(address,uint256,uint256)", +"c32ceb14": "setQueryIdForAddress(bytes32,address)", +"c32d88bb": "changeDepositAmount(uint256)", +"c32d946d": "performTransfer(address,address,uint256,bytes)", +"c32dee3a": "second_bonus_amount()", +"c32e16e7": "REQUEST_CANCELED_BY_LENDER_STATUS()", +"c32e2b42": "SalesAgentRemoved(address)", +"c32ee591": "isTransferAllowed(address,address,address,address,uint256)", +"c32f6945": "MiningLevelup(address,uint256,uint256)", +"c32fb5ea": "getNewAllowancePeriod()", +"c32ff491": "ServerManager()", +"c3310517": "reservedTokensDestinationsLen()", +"c3315b4b": "EasyInvest25()", +"c3328816": "TeamAdvisorsWallet()", +"c3332621": "shippingDate()", +"c3332732": "setNextGame(uint256,uint256,uint256,uint256)", +"c3336c0f": "transferMultipleSame(address[],uint256)", +"c3340892": "LogStateChange(uint8)", +"c334447b": "bytes32ToTokenId(bytes32)", +"c334e875": "payByErc20(uint256)", +"c334ea8f": "setMateAdvertisementRate(uint256)", +"c3351b88": "getParticipantExternalId(bytes32)", +"c3354632": "_premoveByIndex(uint256)", +"c335f0a4": "RKGToken()", +"c336937d": "Revoked(address,address)", +"c3369b0d": "issueTokens(uint256,uint256,uint256)", +"c336e7fb": "NobelToken()", +"c3380b72": "getDefense(bytes32,bytes32,uint256)", +"c33818fd": "Controller_Address2()", +"c338287f": "getUSDPrice()", +"c33890ff": "StartNewIteration()", +"c3392f25": "PRCT100_R_TEAM()", +"c33a4cc8": "PresaleUpdated(uint256,uint256)", +"c33a5bb6": "RLCPerETH()", +"c33a66e0": "updatePriceEDEX(uint256)", +"c33a800b": "createHeldCoins()", +"c33aa7fe": "submitBid(string)", +"c33af352": "_getFunc(uint256,uint256,uint256,uint256)", +"c33b76c6": "rakeAddress()", +"c33bbe47": "LAM()", +"c33cfe36": "KolkhaToken(uint256)", +"c33db789": "_triggerFinishTournament()", +"c33df4ba": "getNumOfRickHolders()", +"c33e1844": "BTMC()", +"c33e40a3": "setBasePoints(uint256)", +"c33e4942": "definition(bytes32)", +"c33fb877": "process()", +"c3403ddf": "endVoting()", +"c34052e0": "contains(uint256)", +"c341031a": "Testereum()", +"c341b9f6": "freezeAccounts(address[],bool)", +"c3430bce": "validWhiteListedPurchase(address)", +"c3434883": "buy(uint256,uint256,bool)", +"c3437e06": "approvedBuyer(address)", +"c3440022": "WhitelistedAddress()", +"c34492a7": "buyTokensByOptions(address,uint256,string)", +"c344bc47": "HonestisNetworkTokenWire3()", +"c344bc4a": "REALCrowdsale()", +"c344cdd2": "offerOptionsConversion(address)", +"c34588ba": "countOfDeeds()", +"c3458d18": "callRecipient(address,address,address,uint256,bytes,bytes,bool)", +"c345b571": "_subDai(uint256,address)", +"c345c54b": "doSafeSend(address,uint256)", +"c3462818": "PFC(address)", +"c34764cf": "makerWithdrawERC20Token(address,uint256)", +"c347fe1f": "addCET4(uint32,uint32,uint32)", +"c3492908": "BASE_TIME_TO_COOK()", +"c3496529": "setVesting(address[],uint256[])", +"c34a253a": "cardFacevalue(uint8)", +"c34b6ae0": "setFreeTransferAllowed(bool)", +"c34ba3e9": "createPromise(address,uint256,uint256)", +"c34c08e5": "executor()", +"c34c27ad": "SendOwner()", +"c34c4417": "registerData(bytes)", +"c34c6b93": "getDateInfo(uint256)", +"c34d2732": "MAX_COMMIT_DURATION_IN_SECONDS()", +"c34da17c": "isBurned()", +"c34db131": "CSCPreSaleManager()", +"c34dd141": "percent_reduction()", +"c34de22d": "genKeysRec(uint256,uint256)", +"c34debc7": "updatePlayerWin(address,uint256)", +"c34e6e1b": "OnlyWhiteListedAddresses(address)", +"c34ef9af": "second_bonus_duration()", +"c34f1fea": "UnfreezeAmount(address,uint256,uint256)", +"c34f6b0d": "getPrize()", +"c34f783d": "allocateToken(address[],uint256[],uint256[])", +"c34f869b": "Voted(uint256,bool,address,string)", +"c34fb5ca": "canonizedParameterizer()", +"c3500745": "refundLockDate()", +"c3501ff6": "redeemToken(uint256,address)", +"c3502510": "UsdPerEthChanged(uint256,uint256)", +"c3508d58": "refundByOwner(address)", +"c350bbb6": "RoscaERC20(uint256,string,string)", +"c3513132": "accessTokenFee(uint256)", +"c351fd77": "setGasPricePctOfBetValue(uint256)", +"c351fdfd": "setBatchNumber(address[],uint256[])", +"c3521b1a": "wolkFund()", +"c352dae2": "getWalletInfo()", +"c352fbda": "grantMarketingCoins(address,uint256)", +"c353a89e": "changeMember(address,address)", +"c353c2de": "unPauseTokenSale()", +"c353dbb1": "EtherPluscoin()", +"c3542cad": "SaleStageUp(int256,uint256)", +"c3548647": "setActivationFee(uint256)", +"c35506c0": "upgradingEnabled()", +"c355b107": "cNiceGuy()", +"c355eaf0": "setEthlanceSponsorWalletContract(address)", +"c35740f9": "partner2_name()", +"c3576b41": "setOwnersCommission(uint256)", +"c35774a1": "setApproval(address,uint256[],bool)", +"c35789cc": "Close()", +"c3584d88": "getMaxEtherToInvest()", +"c358ced0": "isRevealPhase()", +"c359a2a4": "increaseContribution(address,uint256)", +"c35a4d46": "DubaiGreenBlockChain()", +"c35ac080": "modificaCurso(uint256)", +"c35c08bd": "getCrowdsourcer(bytes32)", +"c35c3265": "novumAddress()", +"c35cabf4": "littClientId()", +"c35d1e01": "RESERVE_TOKENS()", +"c35dcf90": "getWhitelists()", +"c35e1b33": "MSERToken(uint256,string,string)", +"c35ef892": "getWriteTimestamp(bytes32)", +"c35f4bbb": "calculatePrimordialMultiplier(uint256,uint256,uint256,uint256,uint256)", +"c3602ee5": "delayedRequest(string,uint256)", +"c36086f0": "initTransaction(address,uint256)", +"c360c616": "TittyPurchase(address,address)", +"c3615e39": "set_address(address,address)", +"c36360f2": "limit8()", +"c36433e2": "createPromoDrug(bytes32,address,uint256,uint256)", +"c3645759": "increaseDistrictWeed(uint256,uint256)", +"c364a25d": "setHash(uint16,bytes32)", +"c3650a21": "danserviceTeamAddress()", +"c36572d6": "hasEnded(uint256)", +"c3657f96": "setBoxCount(uint16,uint16)", +"c365a646": "_setRiskParameters(uint256,uint256)", +"c365d4f0": "initWidth()", +"c36604ed": "secretNumber()", +"c3662528": "isApproved(bytes32,uint256,bytes)", +"c3663271": "Icoends()", +"c366b1d3": "BulkToken()", +"c3676a02": "mangeWhileList(address,bool)", +"c367ec17": "rewardAuditor(uint256,address,uint256)", +"c36800eb": "IdentityCreated(address,address,address,address)", +"c368109c": "monster_hp(uint256)", +"c3681e3d": "change_p3(uint256)", +"c3682ace": "time_end_sale()", +"c36851bc": "bidOnWonder()", +"c3685e89": "addMessage(address,string,string)", +"c3689f01": "testControlSetNotRetractableNotOwner()", +"c368b160": "disbursement()", +"c36981f4": "withdrawNacNetfReController(uint256,address)", +"c369c0c6": "addValidationPreSigned(address,bytes32,uint8,bytes32,bytes32,bytes32)", +"c36a7b45": "getUserTotalEthVolumeSaldo(address)", +"c36ad8a6": "deleteStar(uint256)", +"c36af460": "getLatest()", +"c36c0155": "get_planet_info(uint256)", +"c36c09e2": "setTrustedSender(address)", +"c36ccedc": "approve(address[16],address,uint256)", +"c36de353": "Ethereumt()", +"c36de531": "smallestUnitName()", +"c36e6fe5": "XclusiveCoin()", +"c36e9546": "SVL()", +"c36ff164": "claimFoundationToken()", +"c36fff2d": "availableOptions(uint256)", +"c37067fa": "donate(bytes32)", +"c370b0b5": "BbeCoin()", +"c370c86d": "setTokenName(address,string)", +"c370d8fe": "ExpandandHarvest(uint256)", +"c3720290": "giveSignOff()", +"c37210f4": "getDocumentSign(uint256,uint256)", +"c3722b1f": "AutoSell()", +"c3736dfa": "_shiftRight(bytes32,uint256)", +"c3737054": "changeManagerQuorum()", +"c373c0ef": "setStartDate(uint32)", +"c37479b4": "mintForwarder(uint256,bytes32,address[],int256,address)", +"c3751729": "mGenerateTokens(address,uint256)", +"c375ba8a": "getLavaPacketTypehash()", +"c375c2ef": "removeContract(address)", +"c3762904": "ethraised()", +"c37792b5": "generateSecurityToken(string,string,string,bool)", +"c3780a3a": "myFunction()", +"c3787865": "balanceFromToken(uint256)", +"c378a83b": "EarthToken()", +"c378ea76": "getFrom(uint256)", +"c378f1af": "RemoveAll()", +"c37981b3": "maxFixedSupply()", +"c37991e3": "ProposalEnd(uint256,string)", +"c37a676c": "acceptMins(uint256)", +"c37a6e8d": "signer1_proposal()", +"c37a832d": "getRoundUserBalance(uint256,address)", +"c37b0aa7": "modifyPriceCountry(uint256,uint256)", +"c37b85a6": "assignIndices(address[])", +"c37bcb1e": "unlockDate1()", +"c37cb1ae": "airdropsTokens(address[],uint256[])", +"c37cdcfe": "doDisputeMemoryRead(uint256,bytes32,uint256)", +"c37d1c8b": "tokensToMint(uint256)", +"c37d8a7e": "indexReplies()", +"c37d9044": "create(uint8)", +"c37db253": "isNotZero(bytes32,string)", +"c37dfc5b": "fillOrder(uint256,uint256)", +"c37e7379": "distributePresale(address)", +"c37e74c7": "getRet()", +"c37e8cb2": "testExportAuthorized()", +"c37e8f11": "additionalCurrency(address,int256)", +"c37f68e2": "getAccountSnapshot(address)", +"c37f7f7f": "doTransferIn(address,address,uint256)", +"c37ff3d9": "sha(uint256,uint256)", +"c3800257": "Addmember(string,address,address,uint256,bool,uint256,bool)", +"c3800fdc": "CurrentToken(address)", +"c3801938": "getStateRoot(uint256)", +"c3830618": "reduceStake(uint256)", +"c3834d89": "setPromo(address,uint256,uint256)", +"c383b1bb": "summon10SkinAppearance(uint256,uint128)", +"c383e020": "endContract(address)", +"c384521f": "tokenCapPhaseTwo()", +"c384b170": "teamWallet2()", +"c3858e82": "unregisttIcoAddress(address)", +"c38672a0": "confirmTokenTransaction(uint256)", +"c38678c3": "addBuildingToServer(uint256,uint8[10],uint8[10],uint8[10],bytes32[10],uint8)", +"c386ff7d": "checkFunction(bytes32,uint256)", +"c38789ba": "example(uint256,address)", +"c387b2a7": "BatchTransferContract(address)", +"c3886f61": "checkWithdrawal(address,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"c3888bce": "transferTokenToMultiple(address[],uint256)", +"c388c167": "setNameAndTicker(string,string)", +"c388cca6": "testBitAndFailIndexOOB()", +"c38a0306": "devFeeHandle(uint256)", +"c38a0fcb": "MGLTOKEN()", +"c38a8afd": "minimumBet()", +"c38ad273": "priceETH()", +"c38ad65b": "getHeroPostAddres()", +"c38bb537": "setPauseStatus(bool)", +"c38c0fa7": "getParentPayoutDistributionHash()", +"c38c5813": "registerAdmin(address)", +"c38c9800": "innerContract(string)", +"c38caab5": "setPost(string)", +"c38e52c0": "deletePeerReview(address)", +"c38e650f": "changeRoundManager(address)", +"c38f0741": "snapshotDailyGooResearchFunding()", +"c38f1abf": "waitTokensPeriod()", +"c391c1b5": "updateOwner(address,address,uint256)", +"c391d581": "getXPROMO_MULTIPLIER()", +"c392079f": "removeCoin(string)", +"c392cf41": "reveal(address)", +"c392f118": "getSellingStatus(uint256)", +"c392f5a0": "getAllPackageReleaseHashes(string)", +"c39387ad": "checkAndUpdateStage()", +"c3946909": "setTheKingsQuote(string)", +"c394f6cb": "unclaimedTokens()", +"c39513af": "setDeprecated(string,address)", +"c395546c": "authorizedToSpend()", +"c395a16b": "leaderBid()", +"c395f336": "processPurchase(uint256,uint256)", +"c3964372": "startRound(uint256,uint256)", +"c3966409": "endProject()", +"c397ae1b": "holosForWei(uint256)", +"c39804ac": "generatePreimage(uint256,uint256,uint8)", +"c39899c1": "isDeadline(uint256)", +"c398a925": "supportsERC165(address)", +"c398f030": "expire(uint256,uint8,bytes,bytes,bytes)", +"c399330d": "getBonusByTime()", +"c399d7c5": "getAccountTokenStats(address)", +"c399ec88": "getDeposit()", +"c39a9d97": "crowdSaleType()", +"c39afb0b": "BitcoinEther()", +"c39b79d4": "_contains_(address)", +"c39cb03f": "ERC827Token(uint256,string,string)", +"c39cbef1": "changeName(uint256,string)", +"c39ce8b6": "FranklinFrank()", +"c39cf53d": "nextrafflenumber()", +"c39e7394": "addAuctionReward()", +"c39ffc65": "GVFX()", +"c3a07df6": "getPermissions()", +"c3a0ba73": "BlockFilesManagement()", +"c3a11c51": "etherPriceInUsd()", +"c3a151de": "getPlayedGamePlayers()", +"c3a18dec": "PRIVATE_SUPPLY_ADDRESS()", +"c3a1e7cc": "totalWEIInvested()", +"c3a25c4c": "computeCntrAmountUsingPacked(uint256,uint16)", +"c3a267b7": "createEthGlobalDelegation(address,address)", +"c3a2a665": "retrieve(address,uint256)", +"c3a2a93a": "getContracts()", +"c3a2c0c3": "scheduleCall()", +"c3a3017d": "issueMasterCardNumber(address,address,uint256)", +"c3a34e1c": "timeTillImpact()", +"c3a35825": "getUint(bytes32,string)", +"c3a39544": "initialCompanysTokenAllocation()", +"c3a3ee80": "setPartsToSell(uint256,uint256)", +"c3a48741": "distributeTKLN(address[],uint256)", +"c3a4ebf5": "_roundOver()", +"c3a4f8b5": "hibit(uint256)", +"c3a5fc4d": "IconFoundation()", +"c3a62a68": "getDate(bytes10)", +"c3a69a75": "dividendsDistributor()", +"c3a6e2a7": "disableToken(bool)", +"c3a74e6a": "placeSellFciOrder(uint256)", +"c3a83aab": "getTokensAvailableToMe(address)", +"c3a869e6": "goldenTicketPrice(uint256)", +"c3a8da5f": "EthereumMark()", +"c3a8f536": "rsub(uint128,uint128)", +"c3a9b1c5": "sayHello(string)", +"c3a9bd8b": "maximumTokens()", +"c3a9be6b": "setLimitGame(uint256,string)", +"c3a9c930": "Gift(uint256,address,address)", +"c3aa0fe6": "setItemLimitHolding(uint256,uint256)", +"c3abe888": "sendBatch(address[])", +"c3ac93df": "QCOToken(address,address,address,address,address,address)", +"c3ad5ecb": "getTweet(uint256)", +"c3ae43a0": "buy100tickets()", +"c3aea22e": "fillSellOrder(uint256)", +"c3aeacdf": "changeRules(address)", +"c3aebdd1": "s5(bytes1)", +"c3aedd92": "updateIsVerifiedInBulk(address[],bool[])", +"c3af38fa": "changeInfoUrl(uint256,string)", +"c3af702e": "totalfv()", +"c3b0f915": "KickToken()", +"c3b1037b": "ownerSetGasPrice(uint256)", +"c3b18fb6": "updateSplit(uint256,uint256)", +"c3b18ff2": "totalSupplyICO()", +"c3b1d52b": "recipientToGiftIds(address,uint256)", +"c3b1ff93": "acceptGame(address,uint256,bytes32)", +"c3b24be0": "Leg()", +"c3b2556d": "lookup(bytes)", +"c3b2d337": "_initialSupply()", +"c3b3271d": "updateStar(uint256,string,string)", +"c3b35a7e": "withdrawTo(address,address,uint256)", +"c3b3c656": "kickOutGroup(address,uint256)", +"c3b4db25": "setSeller(uint256)", +"c3b55635": "log(string,bool)", +"c3b57af8": "getStageAmount(uint256,address,address)", +"c3b66bed": "getProposalVotersCount(uint256)", +"c3b6f939": "mToken()", +"c3b7572c": "updateCommission(string,uint8,uint8)", +"c3b75b8f": "setLockProductActiveState(uint32,bool)", +"c3b7e378": "startTimeStage2()", +"c3b8bfe5": "transferIfNoHF(address)", +"c3b909d7": "progressiveId()", +"c3b91d15": "AiBank()", +"c3b9741b": "ModifiedCrowdsale(uint256,uint256,uint256,address)", +"c3b9e2ed": "powerWithModulus(uint256,uint256,uint256)", +"c3b9f21e": "p4()", +"c3ba2368": "transferERC721(address,string)", +"c3ba65e7": "totalChicken()", +"c3ba7574": "mintForFund(address)", +"c3ba938d": "JPY_Omnidollar()", +"c3bb68cf": "weisPerEther()", +"c3bb8feb": "releaseSell(uint256)", +"c3bcb586": "soldKeys()", +"c3bd0bae": "CapLevelPrice()", +"c3bdc16f": "setUserRole(address,bytes32,address,uint8)", +"c3be259f": "ConnectiusToken(uint256)", +"c3be3c24": "_updateTopUpAvailable()", +"c3be6e8d": "SetStartTimeTLP1(uint256)", +"c3be8df3": "addAff(uint256,bytes32)", +"c3bea9af": "createGen0Auction(uint256)", +"c3bf32e3": "numberOfHeroClasses()", +"c3bf504a": "extractEth(uint256)", +"c3c0198c": "getAssesByOwner(address)", +"c3c0befb": "dumpPrize()", +"c3c132b2": "_indexProofId(string)", +"c3c1d4c7": "withdrawTokensTo(address)", +"c3c2686c": "preSaleWallets(uint256)", +"c3c2f066": "block(bytes32)", +"c3c357f9": "tokenSaleCompleted()", +"c3c5026c": "depositWEI()", +"c3c503b7": "becomeBankermaster()", +"c3c51aca": "cancelSellTokenOrder(uint64)", +"c3c563f4": "validateAmount(uint256)", +"c3c59aa9": "walletTimeOf(address)", +"c3c5a547": "isRegistered(address)", +"c3c5b40e": "setSaleAddr(address)", +"c3c63edc": "mintBadge(uint256)", +"c3c6e202": "indexLastThreads()", +"c3c6f0c9": "getCustomerTxTimestampPaymentKWh(address,bytes32)", +"c3c735cb": "BITDRIVE()", +"c3c74c45": "applyForCertification(string,string,address,string,string,uint256)", +"c3c75e5c": "setEditionPackSize(uint8,uint8)", +"c3c88a1d": "disableTransfer(uint256)", +"c3c8c12b": "setVipInfo(address,uint256)", +"c3c90e64": "checkReward(address)", +"c3c95c7b": "getMarket(bytes32)", +"c3ca3c6a": "SingularityTest3()", +"c3cad5e7": "senderMIT(address)", +"c3cb4159": "getICOBonus()", +"c3cb50ed": "setTileType(uint16,bytes32)", +"c3cb8c14": "finalizeVault()", +"c3cbc2c9": "offerSacrifice()", +"c3cbd341": "create(address,uint256,address,address)", +"c3cd9996": "CLASS_AQUATIC()", +"c3cdb4af": "getMinimeCheckpointSlot(uint256,uint256)", +"c3ceb939": "view58()", +"c3cfe00f": "EEB(uint256,string,uint8,string)", +"c3d014d6": "setContent(bytes32,bytes32)", +"c3d08f06": "setPermissionByAddress(uint8,address)", +"c3d0a20a": "NewToken(address,string,string)", +"c3d0a564": "getAccountBalance(bytes)", +"c3d23e10": "checkBet()", +"c3d2c355": "setKey(bytes32)", +"c3d32e56": "PixelCore()", +"c3d345c4": "getHangoutAddress()", +"c3d38586": "newCookie()", +"c3d4d75a": "getCommitHash(bytes32,address)", +"c3d54c9a": "paiementConfirmation(bytes32,bytes32)", +"c3d55adc": "calculateBuyGoldFee(uint256,uint256)", +"c3d58d95": "runICO()", +"c3d59369": "setIcoDiscountPercentages(uint8,uint8,uint8,uint8)", +"c3d5fd39": "getAdminInfo()", +"c3d68a85": "temporaryKill(address)", +"c3d69d03": "NatureX()", +"c3d7ad74": "sendPurchasedTokens(address,uint256)", +"c3d7e350": "removeAccount(uint256,address)", +"c3d8c099": "endICOStage5()", +"c3d97a27": "carsCount()", +"c3d9820d": "RefillOraclize()", +"c3d9c4b4": "share(uint256)", +"c3da42b8": "c()", +"c3da5153": "getEthartArtReward()", +"c3daab96": "withdrawBond(uint256)", +"c3dac9a1": "time_bought()", +"c3db397f": "unstakePartialContent(bytes32,uint256,uint256,bytes8,uint256)", +"c3db5ead": "Uruntest()", +"c3dc0083": "finishDeal(uint256,uint256)", +"c3dc1040": "orderInternal(uint256,bytes32)", +"c3dd2395": "maxCapEur()", +"c3de1ab9": "gamePaused()", +"c3de7cbf": "checkRedemptionWindow(uint256,uint256)", +"c3ded82a": "toUint96Throw()", +"c3dee67f": "updateAllHoldersShareInfo()", +"c3defb70": "changePause()", +"c3df99b6": "upvoteComment(bytes32,bytes32,bytes32)", +"c3dfb938": "countFortunes()", +"c3dfbeea": "migratePresaleBalances(address,address,address[])", +"c3dfdae6": "gameToken()", +"c3e017c2": "dNextStage(uint32)", +"c3e053ac": "percentBuyBackTypeTwo()", +"c3e06be9": "changeReceiveWallet(address)", +"c3e0ae67": "future_round_percentage()", +"c3e0bbad": "getContentByName(string)", +"c3e1d25c": "percentsOfProjectComplete()", +"c3e2087c": "setManagementCompany(string)", +"c3e27948": "setTrueUsdFastPause(address)", +"c3e2f26e": "icoedAmount()", +"c3e38ae9": "setSEKU(uint256)", +"c3e3908c": "get_pre_kyc_bonus_numerator(address)", +"c3e3c7bc": "teamTokens()", +"c3e50027": "dealConfirm(uint256)", +"c3e58eec": "blackListSectorExists(uint8[])", +"c3e6ea31": "BONUS1()", +"c3e8fb40": "smartToken()", +"c3e92f9e": "DrawLottery(string,uint256)", +"c3e93fa3": "depositHelpe(uint256)", +"c3ea0fca": "promoEthCommission()", +"c3ea901d": "uint2ToStr(uint256[2])", +"c3eb0723": "LogNewSecurityToken(string,address,address,address,uint256,uint8)", +"c3edb4c2": "finalizeChangeInsuranceFees()", +"c3ee6311": "lockAndCall(string)", +"c3eed29a": "reinvest(uint256,address)", +"c3ef473c": "ShareHolderVoted(address,uint256,bool)", +"c3ef586a": "Gambit()", +"c3ef83fc": "executionTimeOf(uint256)", +"c3f010f7": "numGames()", +"c3f03fb8": "querySpecialRateForAddress(address,address)", +"c3f07ba7": "addTokenAddresses(address[])", +"c3f0dad9": "isGenerator()", +"c3f17ae8": "getAmountToIssue(uint256)", +"c3f1a710": "getInvestment()", +"c3f1b0ea": "changeRequest(bytes32,bytes32,bytes32,string,bytes32,bytes32,uint256)", +"c3f3310b": "tokensOfFounder(address)", +"c3f34a50": "Dao(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"c3f3b854": "maxNumBets()", +"c3f44c0a": "relayMetaTx(uint8,bytes32,bytes32,address,bytes,address)", +"c3f51fca": "initMintable(address,address,uint256,uint256)", +"c3f53e94": "ownerClaimTokensAndRefundForUser(address)", +"c3f59687": "transferMastership(address)", +"c3f6263f": "charityCutOf(uint256)", +"c3f67cde": "withdrawSecond()", +"c3f6e09c": "sendOnlyHash(string)", +"c3f7ec97": "addLog(bytes)", +"c3f7f169": "safeSend(uint256)", +"c3f843d7": "minVeriAmount()", +"c3f84c05": "retribution(uint256,address)", +"c3f90202": "f4()", +"c3f909d4": "getConfig()", +"c3f9409f": "signBitcoin(bytes32,uint8,bytes32,bytes32)", +"c3fa4f27": "sendPowerToken()", +"c3fa5f93": "BlockScheduler(address,address)", +"c3fb31a4": "coolDungeon()", +"c3fb5e5f": "createVestFundFor(address,uint256,uint256,uint256)", +"c3fb90d6": "_storage()", +"c3fbc632": "ICORunning()", +"c3fc4787": "finalizeFork()", +"c3fdbef8": "totalInSharedPool()", +"c3fe3e28": "game()", +"c3ff05d1": "getBoxCountZIndex(uint8)", +"c3ff3878": "checkForValidChallenge(address,uint256)", +"c401a2a3": "destroyforproduction(uint256)", +"c401d6b0": "totalTokensToSupply()", +"c4021c13": "topupEnergyByToken(address,uint256,uint256)", +"c4026d7b": "removeDev(address)", +"c402e446": "Express_Satisfaction_MediatedTransaction(uint256)", +"c403adc8": "changeInSale(bytes32,bytes32,uint256)", +"c403cf6d": "RESERVED_TOTAL_AMOUNT()", +"c403f90f": "airdropTime()", +"c4041bc5": "viewauction(uint256)", +"c4043465": "MYEXCTOKEN()", +"c404b3f6": "currentTranche()", +"c4052559": "haraKiri()", +"c4052a78": "airLiftPrice()", +"c4057e61": "getData_4()", +"c40580de": "removeOwners2()", +"c405b1f0": "addJob(address,uint256,uint256)", +"c405d30e": "send2marketing(address,address)", +"c405e11b": "_addAnswerToHistory(bytes32,bytes32,address,uint256,bool)", +"c4069caf": "getPlayersByTrackId(uint256)", +"c406d4af": "getPixelToken(uint24)", +"c407670f": "donorCount()", +"c4076876": "pay(address,uint256)", +"c407c6d8": "chop(string)", +"c4085bf6": "_sell(address,uint256,bytes)", +"c4086893": "getLockedBalance(address)", +"c408efba": "isMigrationPhaseOpen()", +"c40940f4": "pricePerUnicorn()", +"c409ad08": "exec(bytes,bytes,address[])", +"c40af29f": "tokenTeamSupporter()", +"c40b276b": "hasString(string[],string)", +"c40b4c4d": "minSumPreICOUSD()", +"c40b716c": "setLLV_edit_14(string)", +"c40b8868": "changePresale(address,uint256[])", +"c40b8dcf": "usdToHavPrice()", +"c40bdc05": "_requestLoans(address,uint256)", +"c40cf4eb": "memberContract()", +"c40d19a5": "getAddressSize()", +"c40d4163": "ArthToken(uint256)", +"c40d62fe": "OrpheusBlockChainCitySiam()", +"c40dc8ec": "deadline(uint256)", +"c40fdc94": "Delisted(uint256)", +"c40fec3a": "forceOffsetExecuteFeeRate()", +"c4109843": "OrdersMatched(bytes32,bytes32,address,address,uint256,bytes32)", +"c4109d48": "baseTokensAllocated()", +"c411e4d4": "canCancel(uint256)", +"c4128b6d": "upgradeCount()", +"c4130ae0": "registerEvent()", +"c413af2e": "setPreICOPhase()", +"c413fdf3": "testPayout()", +"c414dede": "tablets(address,uint256)", +"c41518f2": "luckyYouToken()", +"c41559bb": "ETHbalanceOf(address)", +"c415b95c": "feeCollector()", +"c4163518": "isMining(address)", +"c4164365": "investBalanceMax()", +"c4166ea8": "OBGAllocation(address)", +"c416a0d7": "emergencySetBBFarm(uint8,address)", +"c41728a7": "sectorOwnerCut()", +"c4173548": "preSaleRaised()", +"c417becd": "RCToken()", +"c4184def": "BCBToken()", +"c418c8c9": "TradeToken(address,string,string,uint256,uint256)", +"c418c93e": "addOnStage(address,uint256,uint256)", +"c4198161": "setParameters(address,uint256)", +"c41a360a": "getOwner(uint256)", +"c41a9892": "bet2()", +"c41a9dfe": "has_joined()", +"c41addb5": "newModerator()", +"c41b0ae7": "getNumberOneArg(address,bytes4,address)", +"c41c19dc": "trackContributions(address,uint256)", +"c41c33af": "submitChallengeOrder(bytes,uint64,uint64,uint256,uint256,uint256)", +"c41c3bde": "setBuyingTime(uint256,uint256)", +"c41c9a61": "transferERC20Tokens(address,address,uint256)", +"c41e1d4f": "MAX_NUM_NAVITOKENS()", +"c41efe08": "getBestSale(bytes32)", +"c41f48a3": "DinosaurFarmer2()", +"c41f4cc0": "takerStatus(address)", +"c41f9482": "getDateTime(uint256)", +"c41fbbb5": "addFounder(address,uint256,uint256)", +"c420928d": "EncryptoTelToken()", +"c420f7fe": "getPlayerShipModelById(uint64)", +"c421249a": "sui()", +"c4215398": "publicSaleAddress()", +"c4218d33": "oraclizeBalance()", +"c421fa8e": "updateCrowdfundState(uint256,address,uint256)", +"c421fc6b": "currentStageData(uint8)", +"c422293b": "finishIssuance()", +"c422d09b": "ConfirmOwner()", +"c422ed19": "addFreeBet(address,uint256)", +"c4236cdc": "catchStarters()", +"c4254c7b": "CoreWallet()", +"c4255d61": "addZeroTest()", +"c4259e2e": "changeOwnerInfo(uint256,uint256,string,string,string,string)", +"c4264738": "refundSafe()", +"c426b1e5": "showDepositEther(address)", +"c426c3e2": "getExtendedAttributesForPlayer(uint256)", +"c426fbb6": "setCrowdsaleStartBlock(uint256)", +"c4270574": "userRollDice(uint256,address)", +"c42791ae": "setBountyOwner(address)", +"c427a68b": "ExtremeSetupToken()", +"c427af9b": "outcomeAmounts(address,int256)", +"c427e699": "getContractsOf()", +"c42882e3": "getEarlyAccessKitsRemaining()", +"c42890b6": "setCastleContract(address)", +"c4290b76": "getAmountWithdrawal(address,bytes32)", +"c42956d3": "nextExchangeRateIndex()", +"c4298f89": "ACL(address)", +"c429e4a3": "TEAM_ALLOWANCE()", +"c42a0716": "erc20(string,string,uint256,uint256)", +"c42b372d": "openAutoFree(address)", +"c42b5fe1": "registerExternal()", +"c42bb1e4": "contract_eth_value()", +"c42bd05a": "newToken()", +"c42c237a": "CortexCoin()", +"c42c9905": "register(bytes20,uint32,int24[4],int24[4],uint32[4],bytes32[])", +"c42cb819": "goldBoxAmountForSale()", +"c42cce7e": "total_tickets()", +"c42cd8cf": "etherSplit(address,address)", +"c42cf535": "setGovernor(address)", +"c42e04c0": "etherOne()", +"c42e1ace": "TKP()", +"c42ed894": "getRoundTargetBlock(uint32)", +"c42edd61": "payFeesToggle()", +"c42edf88": "leveRage()", +"c42f61d3": "RhodoToken(address)", +"c42fd368": "RateChanged(address,uint256,uint256)", +"c4305a55": "windowBonusMin()", +"c430bcda": "whitelistInvestor(address)", +"c43147c1": "InitializeManifesto(string,string,uint256,bool,bool)", +"c43148ca": "makeProposal(string,uint256,uint256,uint256,uint256,address,address)", +"c4319bd8": "AgreementHashEn()", +"c431f885": "addToContribution()", +"c4321adb": "investInTheSystem(uint256)", +"c4329ae5": "totalChangedPixels()", +"c433793d": "removeWhiteListedAddress(address)", +"c433e8ca": "remainMintTokenAmount()", +"c4342252": "latestScheduledUpdate()", +"c434650c": "_checkOrder(address)", +"c4359c1b": "marketSeeds()", +"c435ae0c": "setMaxGoal(uint256)", +"c435d26f": "GREMToken()", +"c435d2ac": "publishedTokenOfOwnerByIndex(address,uint256)", +"c435d68e": "numberOfContracts()", +"c4366149": "optionBalance(bytes32,address)", +"c4373c05": "tickRequiredLog(uint256,address,uint256)", +"c43782e0": "ZipToken()", +"c437b951": "BytechTechnology()", +"c43821aa": "issuanceCurrentBalanceSum(address)", +"c43823e1": "jsonKeyExists(string,string)", +"c4387936": "edgePigmentB()", +"c439af4f": "WAVEliteToken()", +"c43a6a79": "returnsTwoNamed(uint256,uint256)", +"c43aa319": "startTime_()", +"c43ae983": "GROWTH_BUMP()", +"c43b7934": "stagePrice(uint256)", +"c43bb538": "requestOwnershipTransfer(address,bytes32)", +"c43c633b": "traderBalances(address,address)", +"c43c9e12": "addTokenAdmin(address,address)", +"c43d0575": "scheduleCall(bytes4,uint256)", +"c43d56bb": "changelp4(address)", +"c43d9ac9": "TCETest()", +"c43e0e72": "_withdraw(address,address)", +"c43e9462": "getRoundNumber(uint256,uint256)", +"c43eb0e0": "getAvatar(bytes32)", +"c43ed2c8": "update(bytes)", +"c43f22c4": "isInvestorAllowed(address)", +"c440008e": "foundersFund()", +"c4400ed4": "getProfit(uint8,uint256)", +"c4405fa7": "_getMaxRarityChance()", +"c44088fd": "rewardUnitsRatePerYear()", +"c440e875": "dedeNetworkAddress()", +"c44193c3": "offerPunkForSale(uint256,uint256)", +"c44237dc": "EventUpgradeShip(address,uint32,uint8)", +"c4426a88": "arbitrate(address,address,bytes32,bool)", +"c44299c7": "preAlphaPrice()", +"c4432f31": "P3DAddress()", +"c443a99a": "MicoinNetworkToken(uint256,string,string)", +"c44412e3": "revokeBonusCreditOf(address,uint256)", +"c4453bd0": "getPlayerMinions(uint32,uint8)", +"c4454980": "fundManually(address,uint256)", +"c4457e47": "load(uint8[],uint256,uint256,uint256,bool)", +"c445e2ef": "RedPillToken()", +"c4468f69": "setNewPotWinner()", +"c4477a11": "Banknote(address,uint256)", +"c4479812": "batchMultipleAmount(address[],uint256[])", +"c44828be": "totalAllowance(address,address)", +"c4489110": "BUYOUT_PRICE()", +"c448fa85": "isExtraDistribution()", +"c44a2a10": "ownerCredited()", +"c44b0290": "setLockPostion1(address,uint256,uint8,uint256,uint8,uint256,uint8,uint256,uint8,uint256,uint8)", +"c44b10d9": "payoutOdds()", +"c44c2efd": "burnPLUTUSTOKEN(uint256)", +"c44cb8fc": "viewTotalPayoutToPlayer(address)", +"c44cd4df": "sendReaction(address,int8,string)", +"c44ced7e": "ozr()", +"c44d36ee": "protectedTransfer(address,uint256,bytes32)", +"c44d6f87": "PAPER()", +"c44dcaca": "draw(uint256,address,uint256)", +"c44e6640": "getAuctionCount()", +"c44e787f": "sideBetPay(bytes32)", +"c44f7864": "getRemainingTimeInSecond()", +"c450a08a": "queryLockedTokens(address)", +"c450a25f": "unfreeze_contract()", +"c450d98b": "getCommunityReputation(address)", +"c4522c92": "removeStaff(address)", +"c45250c8": "icoRound3()", +"c45330b4": "remainingTotalBonuses()", +"c453cdd4": "getMyVines()", +"c4543386": "TUIToken()", +"c4545e6d": "_replaceModule(address)", +"c4552791": "proxies(address)", +"c4561d61": "finishICO()", +"c456354e": "setEndTimeStamp(uint256)", +"c4569504": "getKudosOf(address)", +"c456d394": "getPixelPrice(uint256)", +"c4576525": "WEC()", +"c457fb37": "getTokenPrice(uint256)", +"c45849c2": "doDistribution(uint256,address,uint256)", +"c458e5f3": "CrowdForceTestToken()", +"c4590d3f": "setLimits(uint256,uint256)", +"c4596419": "mintSoldTokens(address,uint256)", +"c45982b9": "madd(uint128,uint128)", +"c459b003": "ATTR_PERMANENT()", +"c459b9e3": "MaxStarIndexAvailable()", +"c45a0155": "factory()", +"c45a4047": "batchTrasfer(address[],uint256,uint256)", +"c45a6f98": "unlockMultiple(address[])", +"c45aa04c": "queryShareholders(bytes,uint256)", +"c45ad06a": "etherSince50()", +"c45b415e": "createRequest(address[4],address,uint256[11],uint256,bytes)", +"c45bb448": "MIX()", +"c45c4f58": "balance1()", +"c45cda5a": "init_fund()", +"c45d19db": "tokensToBeReturned(address)", +"c45d32cf": "getRemainingBytesLeadingZs(uint8,bytes)", +"c45d3d92": "conversionWhitelist()", +"c45d5fcb": "TwoStageCrowdsale(uint256,uint256,address)", +"c45d8af4": "getWinIndexFromHash(address,bytes32)", +"c45d8c8b": "Gryphon()", +"c45ddd87": "targetDiscountValue4()", +"c45df8e5": "COSIGN_MAX_TIME()", +"c45e4a7b": "SwiftDex()", +"c45ec88c": "Put(bytes32)", +"c45ef547": "offlineDiscipleSold(uint256,address,uint256)", +"c46073f7": "LUCYD()", +"c46093de": "_0xMonacoinToken()", +"c46180a7": "setBalanceOfActiveToken(address,uint256)", +"c461889e": "OkLive(uint256,string,string)", +"c4618978": "MIN_INVEST_ACTIVE()", +"c4620549": "quaker(address)", +"c4626ea7": "PumpHodl()", +"c4628520": "cashoutEOSBetStakeTokens(uint256)", +"c462a408": "maxParticipantCount()", +"c462bd11": "setupRules()", +"c46362fd": "set_merge_mint_threshold(uint256)", +"c463a1af": "CapitalMatchToken()", +"c463b008": "triggerTransferEvent(address,address,uint256)", +"c464fe65": "sellTokens(address,uint256)", +"c465e742": "UpdatedTokenInformation(bytes32,bytes32)", +"c466313c": "GetMainSale()", +"c4664649": "FIXEDREWARD_MM()", +"c4666fab": "transferNodeContractOwnership(address)", +"c467706d": "startEarlyAdopters()", +"c467a317": "freezeTeam()", +"c467b0ff": "_play(uint256,uint256,uint256,uint256,uint256)", +"c4694ec6": "ecoSupply()", +"c4697667": "BONUS_WL()", +"c469eb99": "deleteFromWhiteList(address,address)", +"c46a23a2": "signedAverage(int256,int256)", +"c46a2925": "setMinApprovalCount(uint256)", +"c46a3a0d": "icoPhase1EndTime()", +"c46a6262": "playEtherOf()", +"c46aaf38": "PharmaGenome()", +"c46b2d9d": "denyBundling()", +"c46b644b": "NewTicketEvent(address,uint8,uint8,uint8)", +"c46c3c68": "RuffToken()", +"c46cacae": "initial_time()", +"c46ce53e": "getOneTotalFeesCollected(uint256)", +"c46d2235": "serverEndGameConflictImpl(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,bytes32,bytes32,uint256,address)", +"c46d4cf1": "thawAccountTransfers(address)", +"c46df008": "walletData(address)", +"c46e3e85": "unitGooProduction(uint256)", +"c46e614a": "isCMCT()", +"c46ed45a": "fee_percentage()", +"c46f3e25": "lastChanceEnabled()", +"c4701037": "aaa(bytes)", +"c47028c1": "TOKEN_RATE_CROWDSALE()", +"c47031ab": "getKarma()", +"c470ff6d": "getInsideCallCount()", +"c4716d0f": "contributedCap(address)", +"c4725577": "getPrice(uint256,uint256,uint256,uint256)", +"c472c7e6": "setTotalWithdraw(address,uint256,address,bytes,bytes)", +"c4735121": "thirdRoundTime()", +"c4740a95": "removeAccount(address)", +"c4749079": "_roundDivision(uint256,uint256,uint256)", +"c4749bbd": "showInvestBalance()", +"c474e70a": "returnFundsForMultiple(address[])", +"c4752773": "priceStep3()", +"c475abff": "renew(uint256,uint256)", +"c475cdf5": "issueNew(uint256)", +"c476dd40": "reportMalicious(address,uint256,bytes)", +"c477d234": "checkIfAlreadyOrderedForDay(uint256,address)", +"c4784fd4": "setMsg(string)", +"c4788efe": "resetTotalVotes()", +"c478b52f": "PLATINUM_AMOUNT_TPT()", +"c478fc37": "EtherWheel(uint256,uint256,uint8)", +"c4791421": "changeCooldownEndTime(uint40,uint40)", +"c47958e2": "ERC20(string)", +"c479ace6": "updateOwners(uint256,address,address[],uint256,uint8[],bytes32[],bytes32[])", +"c47af5cf": "ChangeCost(uint256)", +"c47af732": "setReserved(address,bool)", +"c47bc007": "add_funds()", +"c47c4cc7": "getInitialBalanceByAddress(address,address)", +"c47cf5de": "getAddress(bytes)", +"c47d5bb8": "unitsUserCanBuyLimitEth()", +"c47e7bcb": "softcap3Reached()", +"c47e951f": "adjust_eth(uint256)", +"c47e9fea": "ContributionRefund(uint256,address)", +"c47ef875": "activeTokens()", +"c47f0027": "setName(string)", +"c47f0f90": "getPurchases()", +"c47fae76": "autoPlayBot()", +"c47fc244": "grantInvestorsTokens(address[])", +"c48029d4": "AddTokensToMember(address,int256)", +"c4806df4": "createTokenOwner()", +"c480e583": "revertTransfer(address,uint256)", +"c4811a0e": "maxICOThirdSupply()", +"c4813b2c": "StgOnebonusEnds()", +"c4815c96": "teamAdvTokens()", +"c4818ae1": "joinPillar(uint256,uint8,uint256)", +"c4818cdc": "_balanceOf(address,address)", +"c482299f": "transferAUTOtokens10(address[])", +"c482ceaf": "reinit()", +"c4834c30": "teamTotalSupply()", +"c483b71c": "Map(address)", +"c483befa": "setParameters(address,string,string,string,address,uint256,uint256)", +"c4841369": "paymentsByPurchaser(uint128)", +"c4843365": "getRarity(uint32,uint256)", +"c48513a4": "getStringConstant()", +"c485297b": "HelloSystem()", +"c48590e9": "PARTNER_SUPPLY()", +"c485ac95": "setWalletForTokens(bytes32,address)", +"c486301b": "AcceptsExchange(address)", +"c4864f45": "changeAcceptExchange(bool)", +"c4868452": "preIcoActive()", +"c486d133": "round1InitialBonus()", +"c4871039": "totalWeiRaisedDuringPhase2()", +"c4882e44": "disableRound0()", +"c488847b": "liquidateCalculateSeizeTokens(address,address,uint256)", +"c488d6f2": "stopOffering()", +"c489744b": "getTokenBalance(address,address)", +"c489a649": "updateAirdrop(address)", +"c48a0dc0": "OptionToken()", +"c48a3cbf": "setStackPtr(uint256)", +"c48a66e0": "transferTimelocked(address,uint256,uint256)", +"c48a7560": "sellScams(uint256)", +"c48b1cf0": "test_5_accessRestriction_addMember_shouldThrow()", +"c48c68ee": "addressFounders4()", +"c48d5a4a": "_buy(uint256,uint256,uint256,address,uint256)", +"c48d93d8": "JuraToken(uint256,string,string)", +"c48d99ca": "DataDumped(address,string,bytes32)", +"c48db366": "Africacoin()", +"c48dc5fb": "JackpotAwarded(uint256,address,uint256)", +"c48e1c4d": "importAddresses(address[],address[])", +"c48e5ec4": "getPurchaseDetail(uint256,uint256)", +"c48e819c": "test_openRegistry()", +"c48eabc0": "getContributionPool()", +"c48ef17c": "floorId()", +"c4909a70": "addConfig(bytes32,bytes32)", +"c490a266": "toUInt(bytes)", +"c490dfa6": "isVerifiedAddress(address,address)", +"c491fd18": "FlexibleTokenSale(address,address,uint256,address)", +"c493afcf": "closeRefund()", +"c494a080": "totalPlayer()", +"c494c3dc": "hashParent(uint256,bytes32,bytes32)", +"c494c3f7": "teleportKnight(uint32)", +"c494f71a": "LedgerFund(uint32,uint32,uint64,uint64)", +"c49589bb": "rateUSDcETH()", +"c4969b8f": "setSellerAndAmt(address,uint256)", +"c4977807": "getFrozenAccount(address)", +"c4983c65": "updatePoints(address)", +"c498fcfd": "getUnitDefenseIncreases(address,address,uint256)", +"c49a1ede": "updateShareValue(address,uint256)", +"c49a3b04": "OraclizeVerifier(address,string,uint256,uint256)", +"c49a8fc9": "secureUpdateOrderFunds(address,bool,uint128,uint128,uint128,uint128)", +"c49b94e9": "getTokenTxn(uint256)", +"c49c3635": "getEventOutcomeIsSet(uint256,uint256)", +"c49d3b9f": "memberData()", +"c49d9ff8": "chatMessages(uint256)", +"c49ee5b4": "finalUnpause()", +"c49f91d3": "EIP712DOMAIN_TYPEHASH()", +"c49fea77": "setVariables(uint8,uint8,uint8,uint8,uint256)", +"c49fef66": "maxAnimals()", +"c4a06710": "isKYCPassed(address,address)", +"c4a0dada": "getOtherName()", +"c4a13f23": "affiliateBonusPercent()", +"c4a1dfda": "viewFirstBatchOfClauses()", +"c4a1ee37": "gasLimitWithdrawConfirm()", +"c4a1fedf": "increaseWeeklyTransactionVolumeReceiving(uint256)", +"c4a2c6b4": "Partial23Send()", +"c4a2d664": "setTransferFeeMax(uint256)", +"c4a2e641": "confirmTransaction(uint256,bytes)", +"c4a2fe12": "setversion(uint256)", +"c4a31557": "packSaleAddress()", +"c4a381b8": "setTokenRate(uint32)", +"c4a4cb4e": "countMilk()", +"c4a4e267": "weaponToApproved(uint256)", +"c4a4f265": "minimalContribution()", +"c4a50433": "unprocessedProfits()", +"c4a5350d": "createNewContract(string,string)", +"c4a5b138": "approved(address,uint256,address,bytes)", +"c4a796c1": "setReferee(address)", +"c4a8158c": "getMyTurtle()", +"c4a8598e": "BANCOR_X()", +"c4a85bc1": "allowAccess(address)", +"c4a89e9e": "lengthOf(uint256,uint256)", +"c4a8a670": "getEvent(string,uint256)", +"c4a8b570": "setdteamVaultAddr3(address)", +"c4a942cb": "chunkSize()", +"c4a96758": "getByteFromByte32(bytes32,uint8)", +"c4a9e116": "stakeCount()", +"c4aa94a6": "withdraw(address,uint256,address[],uint256[])", +"c4ad32be": "generateTrees(uint256)", +"c4adb406": "validDestinations(uint256)", +"c4ae16a8": "getPlayerId(address)", +"c4ae3168": "togglePause()", +"c4b05f49": "addThing(string,string,string,string)", +"c4b06c19": "SeedSale(address)", +"c4b14e0b": "getSignature(bytes32)", +"c4b195ab": "r2(address)", +"c4b24a46": "checkReward()", +"c4b2841c": "_doTradeWithEth(address,uint256,address)", +"c4b293db": "getBuyRatio()", +"c4b296a7": "getInvestorIndex()", +"c4b2a668": "GlavCryptPoint()", +"c4b2eccb": "maxAmountAddresses(address)", +"c4b35f3d": "DIV()", +"c4b379f7": "earningsOfPlayer()", +"c4b3a516": "setPercentageAvailableToSell(uint256)", +"c4b40fb7": "tkcAddress()", +"c4b4dff1": "PayChain()", +"c4b54551": "MAX_SPARTANS()", +"c4b57df5": "createEscrow(uint16,address,address,uint256,uint16,uint32,uint32)", +"c4b5cde2": "EventBuyShip(address,uint16,uint64)", +"c4b5f891": "LTBToken()", +"c4b62bbb": "updateAddressSetting(uint256,address,address,string,string)", +"c4b67e8a": "generateReport2(int8[],uint32[])", +"c4b6b5fd": "initChallenge()", +"c4b6c2f3": "btcPriceProvider()", +"c4b6fec9": "sendVal()", +"c4b71cec": "ICO_LEVEL_1()", +"c4b781a8": "setPercentAllocationFee(uint256,uint256)", +"c4b7c4cf": "communityVote(bytes32,bool)", +"c4b80f6e": "incPlayerOwed(address,uint256)", +"c4b9223f": "setVestingSchedule(address,address,uint256,uint256,uint256,uint256,bool)", +"c4b9897b": "IagonToken()", +"c4baa573": "process2(bytes32,uint256[],bytes)", +"c4baf4a4": "IQT_FUNDATION_ADDRESS()", +"c4bb0173": "hash_sha3(string,uint256)", +"c4bc5da5": "resumeContract()", +"c4bc7b70": "setGlobal(uint64,bool)", +"c4bd10d9": "getPollOption(uint256,uint256)", +"c4bd8ebc": "num_monsters()", +"c4bde5e1": "totalLotteryNumber()", +"c4bebd69": "pauseLastStart()", +"c4bff124": "addBlacklistItem(address)", +"c4c0698d": "withdrawInEmergency()", +"c4c1b39a": "tokenPriceInitial_()", +"c4c1c94f": "add(address[])", +"c4c1d835": "DataAuction(address,address)", +"c4c22e98": "blockInterval()", +"c4c24249": "turnLast()", +"c4c2e702": "execute(uint32)", +"c4c308be": "getBeneficiaryCash()", +"c4c3718b": "satoshi_bth_decimals()", +"c4c39ba7": "SWAP_CAP()", +"c4c49380": "setCap()", +"c4c4a89b": "buyNewDrone(uint256)", +"c4c4d00b": "CRBTTokenLive()", +"c4c4e3c0": "GOLD_AMOUNT_SKL()", +"c4c4e438": "oraclize_query(uint256,string,bytes[3])", +"c4c50acf": "giftTokens(address,uint256)", +"c4c59c77": "ethIN()", +"c4c5f3de": "forecastingClosed()", +"c4c6710d": "buyTicket(uint256,uint256,uint256)", +"c4c676cf": "TRBToken()", +"c4c68b44": "getTotalSupplyForType(uint256)", +"c4c745b6": "getBonusFactor(address,uint256)", +"c4c842f7": "_emitJobBinded(uint256,uint256,bool)", +"c4c90d70": "withdrawHouseFee()", +"c4c90f4c": "tokenUsersSave(address)", +"c4cae886": "setManualTradingAllowed(bool)", +"c4cb291e": "unpaid()", +"c4cbb591": "compot()", +"c4cbd65b": "isTourUnfreezed(uint256)", +"c4cbfa44": "isConstructor()", +"c4cc161b": "SellSnail(uint256)", +"c4cc5616": "addStory(uint256,string)", +"c4cc6e53": "TgeOtherReleasingScheduleContract(uint256,uint256)", +"c4ccf6ea": "getAmountBonus(uint256)", +"c4cf8a40": "createTradeContract(address,address,uint256,uint256,uint256,bool,bool)", +"c4cf9385": "MetaMorph()", +"c4cfc5be": "PGE01NY()", +"c4d01481": "getPreRemainCoins()", +"c4d07951": "setVoting(address)", +"c4d18b18": "calculatePoohBuy(uint256,uint256)", +"c4d252f5": "cancel(bytes32)", +"c4d259ad": "setIsAdmin(address,bool)", +"c4d2783c": "GTTAirdrop(address,address)", +"c4d2b1b3": "getLoanData(bytes32)", +"c4d2bac9": "HelloToken()", +"c4d3926a": "currentTokenIdNumber()", +"c4d42292": "ResidualShare(uint256,string,string)", +"c4d4fdc0": "getBonusRateForTimeBased()", +"c4d66de8": "initialize(address)", +"c4d77090": "nodeAddresses(uint256)", +"c4d7b98f": "erc20ContractSwitch(address,address,uint256)", +"c4d8aa44": "VenaCoin()", +"c4d9102f": "setNextID(uint256,int256)", +"c4d97470": "PeriodReset(uint256,uint256,uint256,uint256)", +"c4daa2a6": "roundFees(uint256)", +"c4dbf622": "buyPrice(uint256)", +"c4dc1556": "finalizeProposal()", +"c4dcad1d": "mining(address,uint256)", +"c4dd3b33": "checkUserSignature(address,string,uint32,string,string,bytes32,bytes32,uint8)", +"c4dd5acc": "isLastBadgeEle(uint256,uint256)", +"c4dddedd": "addressVerified(string)", +"c4ded499": "getActiveBetsAmount(address)", +"c4df310a": "isWithinTokenAllocLimit(uint256)", +"c4e11c91": "updateStats(uint256,uint256)", +"c4e12e1d": "updateMinVotedTokens(uint256)", +"c4e16b7d": "whitelistToken(address,uint256)", +"c4e1793f": "_onOverTimeBall(uint8,uint8,uint8,uint8,uint8[3][3][31])", +"c4e29e66": "getOrderHash(address,uint256,address,uint256,uint256,uint256,address)", +"c4e34d46": "lockBonusTokens(uint256,address,uint256)", +"c4e37095": "setSaleState(bool)", +"c4e3a63b": "firstPeriod()", +"c4e41b22": "getTotalSupply()", +"c4e5b7f2": "createAcceptAndPayFromBytes(bytes,address[],uint256[],uint256[])", +"c4e5fd83": "_safeTransferFromInternal(address,address,uint256,bytes)", +"c4e627c2": "maxTokenCount()", +"c4e6aaa6": "setLocationId(uint32)", +"c4e6c604": "otherAddress()", +"c4e7099f": "mockTime(uint32)", +"c4e71adc": "firstReleaseTime()", +"c4e7d14c": "MultiSender(uint256)", +"c4e85b63": "flushTokens()", +"c4e9311b": "bindJobWithBoard(uint256,uint256)", +"c4e98398": "SimpleRegistrar(bytes32,uint256)", +"c4e9e80b": "setAutoSell(uint256)", +"c4eaa978": "_price_token_ICO4()", +"c4eb2b3c": "putSaveData(address,address,string)", +"c4eb8ec2": "transfer_ether(address,uint256)", +"c4ecfbbe": "MonsterChampionship(address)", +"c4eeeeb9": "isReissuable(bytes32)", +"c4ef18fc": "setRentAuctionContractAddress(address)", +"c4ef92d3": "OmiseGOGold()", +"c4efa665": "decimalPrecision()", +"c4f06ba9": "makerOf(uint256)", +"c4f07cff": "getWithdrawTransactionIds(uint256,uint256,bool,bool)", +"c4f0a043": "BTCPrice()", +"c4f1215c": "maxGoalReachedAt()", +"c4f141ff": "setWeiPerCHF(uint256)", +"c4f14c9c": "restrict(address,address)", +"c4f161ab": "isWinner(address,address)", +"c4f1ce79": "clearCurPrize(address,uint256)", +"c4f2a64f": "blockWait()", +"c4f2a7af": "GeneScience(address)", +"c4f35d6c": "WithdrawalToken(uint256)", +"c4f363bf": "getVersionByte(uint256)", +"c4f3c097": "setBasicRate(uint256)", +"c4f54568": "blocktubeTag(string)", +"c4f5cd82": "firstAllocation()", +"c4f62031": "setPlayerPrice(uint256,uint256)", +"c4f7f1e2": "scaledRewardPerToken()", +"c4f8210e": "_safeTransfer(address,uint256)", +"c4f8adc7": "consul_nme()", +"c4f8b9fb": "testAdd(uint256,uint256,uint256)", +"c4f8f339": "getPercent4(address)", +"c4f95105": "showUnpayedPercent(address)", +"c4f987a5": "removeWorker(address)", +"c4f99aa5": "publicReservedAddress()", +"c4fa9c6b": "getReservedTokenDestinationList(address,bytes32)", +"c4faa950": "BrinkToken(uint256,string,uint8,string)", +"c4fbdaff": "gibLambos(uint256)", +"c4fc3a3b": "presaleTokenSupply()", +"c4fc89e1": "bubbled()", +"c4fce59a": "fourthExtendedBonusSalesEnds()", +"c4fd262a": "CrowdsaleStarted(uint256,uint256,uint256,uint256)", +"c4fda23e": "sellTokensIcoWithReferal(address)", +"c4fdc6b8": "pauseIco()", +"c4fe2675": "getProtoIdByTokenId(uint256)", +"c4fed7fb": "addHouseCredits(address,uint256)", +"c4ff3614": "Wallet(address[],uint256,uint256)", +"c5007227": "DTToken()", +"c500ea36": "userPendingCrateNumber(address)", +"c501024b": "setMinCutValue(uint256)", +"c5015018": "TEAM_MONTHLY()", +"c501825a": "WALK()", +"c501b87f": "setCreditMcAddress(address)", +"c503101e": "setCanClaim(bool)", +"c503772d": "returnUint8(uint8)", +"c503a868": "getTeamFee(address)", +"c5043343": "tempSetWinner(uint256,address)", +"c5044b62": "isDescriptionFinalized()", +"c50497ae": "SUPPLY()", +"c50499db": "developer_string_contract_verified(string)", +"c504bfb8": "ColorsMain()", +"c50508de": "initialAuctionDuration()", +"c505c82c": "zxcSold()", +"c505ebce": "endRate()", +"c506adae": "migrateInvestorsFromHost(uint256)", +"c5072172": "justThrow()", +"c50853f5": "getNumPublications()", +"c50886ae": "test_ConsensysNotReached()", +"c508d8f2": "reederemPeriods(uint256)", +"c5096a69": "feeFor(address,address,uint256)", +"c509c262": "TokenManager()", +"c509d0b2": "logCompleteSetsPurchased(address,address,address,uint256)", +"c509db3b": "getverifytime(address)", +"c50aea06": "claimShares(uint256,uint256)", +"c50bb446": "getNeutralMutation(uint32)", +"c50bd2e4": "trancheDenominator()", +"c50be063": "myPlanetList(address,uint256)", +"c50be16c": "setPublicRelease(uint256)", +"c50c44cf": "getAuctionSeller(uint256)", +"c50c97d0": "changeStorage(address)", +"c50cb9ae": "transferComplex(address,uint256,uint256)", +"c50d725c": "DACToken()", +"c50d847e": "POSC()", +"c50ec10a": "repoAppId()", +"c50f197b": "charitySplitPercent()", +"c50f8274": "IWasFirstServiceToken()", +"c50ff563": "canSubAllocation(address,uint256)", +"c510187e": "vpfHash(bytes32,uint256,uint256)", +"c5104c3d": "minPurchaseAmt()", +"c5105bb5": "TotalEDUSupply()", +"c510c906": "getEventOutcomeNumeric(uint256,uint256)", +"c510da62": "getsell(uint256)", +"c510db20": "userCanStillBuyEth(address)", +"c510dfeb": "convertAddressFormat(address[8])", +"c510f746": "createElection(bytes32,bytes32[])", +"c51131fb": "canBeSet(bytes32)", +"c511a362": "TransferTargetToken(address,uint256)", +"c511b016": "SingularDTVToken(address,address,string,string,uint256)", +"c511ed5e": "closeMarket()", +"c51215df": "preSaleListTime()", +"c51226b3": "secondStageMintingDate()", +"c5129348": "See_price()", +"c512d1d1": "testCalculateItemId()", +"c5132a5c": "getCreateMarketDesignatedReporterAddressValue()", +"c5133802": "mintFraCoins(address,uint256)", +"c5135ba0": "fuckynum()", +"c513cde2": "KD1Token()", +"c513d596": "BountyAdded(bytes32,string)", +"c513f66e": "EMPTY_PARAM_HASH()", +"c51450ca": "getTokenIdAtIndex(uint256)", +"c514ff3f": "EasticoinToken(uint256,string,string)", +"c515205d": "getValue2()", +"c515627e": "depositEther(address,uint256,uint256,uint256)", +"c5160187": "mintStart4()", +"c5162e1a": "vendre(uint256)", +"c516358f": "bountyAddress()", +"c5179027": "team0Points()", +"c518123a": "financingPeriod()", +"c519099d": "teamAndFounders()", +"c519500e": "potSplit_(uint256)", +"c51a29e0": "getContractType()", +"c51be90f": "query_withGasLimit(uint256,string,string,uint256)", +"c51bf934": "CEILING()", +"c51cc592": "setTransferAllowance(bool)", +"c51cd5d6": "StarWarsRTscore()", +"c51cd6ad": "getLockAccount(address,uint256)", +"c51ce17b": "TelegaOut(address)", +"c51cf179": "calcBaseFeeForShares(uint256)", +"c51d16b6": "totalCollectedWei()", +"c51dc993": "expiryCheck(string)", +"c52046de": "isDeployed()", +"c5210e89": "ERC20Standard(uint256,string,uint256,string,bool)", +"c52141da": "checkSign(address)", +"c52164c6": "reputation()", +"c52173de": "xConvert(address[],uint256,uint256,bytes32,bytes32,uint256)", +"c5231563": "addAddress(uint256,address)", +"c523d5dd": "setBlockPart(uint64,uint64,uint64,bytes32,bytes)", +"c523ef11": "VNDCash(uint256,string,uint8,string)", +"c5241e29": "removeWhitelisted()", +"c5242acb": "setWithdrawOwner(address)", +"c524645b": "getTimeBonusAmount(uint256)", +"c527018b": "jdalevsystemscoin()", +"c527326e": "PFOffer(address,address,bytes32,uint256,uint256,uint128)", +"c5277ddd": "isPublisherRegistered(address)", +"c5282f7a": "generateTokensForPresaleAccounts(address[])", +"c528fee7": "DRCToken()", +"c5292c67": "getStart()", +"c5292ed9": "calculateEggSell(uint256,uint256)", +"c52987cf": "strikePrice()", +"c529b80b": "transferWithData(address,uint256,bytes32)", +"c52ab778": "execute(address,uint256,uint256)", +"c52adfda": "BobsNVag()", +"c52ba8b6": "addCrowdsales(address,address)", +"c52bd836": "setDappOwner(bytes32,address)", +"c52c936c": "removeByIdx(uint256[],uint256)", +"c52cb003": "OwnerDistribSupply_()", +"c52cde58": "getRedeemableTokensVoter(bytes32,address)", +"c52ce9be": "basicTransferFromTest(address)", +"c52e40d0": "totalWeiExpected()", +"c52f02ce": "BLS_PRE_ICO()", +"c52f9fa6": "PartialOwnershipCrowdsale(uint256)", +"c52fd6fa": "exTx(uint256)", +"c5312191": "WeiController(address,address,address,uint256,bool)", +"c531c245": "exists(int256)", +"c531d52b": "STRUTToken()", +"c5337992": "setBossHPDefault(uint256)", +"c5337ed4": "random2()", +"c5339132": "lastPlayed()", +"c533fc68": "getLockAccInfo(address)", +"c5340dcd": "received_wei_with_bonus()", +"c53467cf": "releasePublicPresaleBonusTokens(address[],uint256)", +"c5346fb1": "approve_coin(string,bool)", +"c534ba4b": "destroyBlacklistedTokens(address,uint256)", +"c5350345": "Magexbit()", +"c535165f": "revealAndPayout(bytes,bytes)", +"c5364bc3": "GetChallengeWeightedVolumes(uint256)", +"c536c952": "getDsitribute(address,uint256)", +"c536ed5f": "buyDmlCoin(address)", +"c537a210": "principalOutstanding()", +"c537f954": "adjustDeployRange(uint256,uint256,uint256)", +"c53833fe": "getLastContract()", +"c539607c": "get_internal_block_number()", +"c53a0292": "increaseNonce()", +"c53abe29": "tokenOnlyDeploymentCost()", +"c53ad76f": "Kardashian()", +"c53adaff": "SingularDTVWorkshop()", +"c53b12f9": "myEthBalanceOf()", +"c53b4252": "getpatient(uint256,uint256)", +"c53b9c04": "maxTimeRemain()", +"c53bafbb": "setPriceOf(string,string,address)", +"c53c2556": "getTokenIdFrombBPhash(string)", +"c53c614d": "canBeWhitelisted(string)", +"c53ce034": "totalDraw()", +"c53d6ce1": "getAllBalances(address)", +"c53d8483": "getActualTotalTokens()", +"c53dbf82": "disclosureAdded(uint256,bytes32,bytes32,bytes32,bytes16,bytes1,bytes16,bytes32,bytes32)", +"c53df200": "getArrUintField1()", +"c53df937": "unshareService(bytes32,address)", +"c53e4387": "IHODLToken()", +"c53ee3a5": "_setInitialCardPrice(uint128)", +"c53f926b": "setByuoutActive(bool)", +"c53fc65f": "tokensDevelopers()", +"c53ffe66": "KillerWhale()", +"c5401559": "setQuantityAdminOnly(uint256,uint256)", +"c5405f17": "registerUserBonus(address,address,address)", +"c540f903": "DeployRelay()", +"c540fb66": "updateBuyNum(bytes32,uint8)", +"c54110d6": "AcceptsNASDAQ(address)", +"c54117ac": "REDGILL()", +"c54124be": "sub()", +"c541783c": "getLockedBalanceOf(address,address)", +"c541a5bd": "revertAML(address)", +"c5426124": "getStar(uint256)", +"c542675e": "fus(uint256)", +"c54397a4": "changeAffiliate(address,uint256)", +"c543ae53": "evaluateArea(address,uint8,uint256)", +"c543b427": "IntegrationOfCredit()", +"c543c922": "devWithdraw(uint256)", +"c54421ae": "teamTokensNotDistributed()", +"c5442f7d": "getRandom(uint16,uint8,address)", +"c5444ff9": "buyTokens(address,uint128,uint256)", +"c544682b": "rewardForBurn(uint256)", +"c544f8d9": "EventRemoveFromBattle(address,uint64)", +"c5454d11": "Finalize()", +"c545c09d": "calculatePrice(uint256,uint256,uint256,address)", +"c5460e71": "getReleasableAmount(uint256,address)", +"c5465a23": "votingstage()", +"c546a92e": "testTransferTokensUsingRawCall()", +"c54704e6": "setLockStartTime(uint256)", +"c547092b": "setMilestone(uint256)", +"c547af82": "_totalVouchersSupply()", +"c547d8f1": "totalWeiAmountSale3()", +"c547e14d": "setHatchDurationByTimes(uint32[])", +"c54837a4": "extinguish()", +"c5487661": "proxyTransferToICAPWithReference(bytes32,uint256,string)", +"c5494b82": "SCH()", +"c5495b54": "replaceAssetManager(address,bytes32)", +"c5498e4e": "setTeamAndAdvisorAndAirdropAddresses(address,address,address)", +"c54996b7": "refundBond(uint256,address)", +"c549e4e9": "sellPriceAt(uint256)", +"c549e6b9": "DAYS()", +"c549e7a0": "ManualTokenMintRequiresRefund(address,uint256)", +"c54a068c": "getCurrentRateInternal()", +"c54a0980": "Total_Entries()", +"c54b25b0": "claimCancelled(uint16,address)", +"c54b5658": "toAddress(bytes,bytes,uint256)", +"c54c80eb": "RxPharma()", +"c54cd39c": "getSandwichInfoCaloriesPrice(uint256)", +"c54d51d4": "popDecoration()", +"c54d59a1": "snt_claimed(address)", +"c54d8609": "setCoOwner2(address)", +"c54e73e3": "setPresale(bool)", +"c54e91c6": "currentPart(address,address)", +"c54f050c": "_createOrder(address,address,uint256,address,uint256,uint256,uint256)", +"c54f3409": "getGameEnd(address,uint256)", +"c54f5344": "OfficialWalletAddr()", +"c5503e89": "allocateTokensInternally(uint256)", +"c5505235": "toEther(uint256,uint256,uint256)", +"c550eb56": "isOrderExist(uint64)", +"c5526d16": "setCrowdsaleWallet(address)", +"c5530077": "wildcards(uint16)", +"c55374d0": "oraclizeDelay()", +"c55425e6": "TotalOwnerSupply()", +"c5543b22": "powerDayPerPersonCapInWei()", +"c5546ecd": "transferTokensToParticipants(uint256,uint256,uint256,uint256,address)", +"c5549cc0": "minDeadline()", +"c554a600": "initTokenPorter(address,address)", +"c5566dac": "getNumberOfCourse()", +"c5575ef0": "checkTransferFrom(address,address,uint256)", +"c557b985": "icon()", +"c557d29c": "ByteLocker()", +"c557e552": "_getWager(address)", +"c558ae6b": "Airdrop(address[],uint256[])", +"c5590033": "setStatus(string,string)", +"c5592be2": "addContract(string,address,address)", +"c559743a": "included(address)", +"c559c395": "bitwordsCutOutof100()", +"c55a02a0": "SNT()", +"c55b6bb7": "setAdmin(address,address)", +"c55c1cb6": "queryN_withGasLimit(uint256,string,bytes,uint256)", +"c55c4115": "FEE_CHARGER_DENOMINATOR()", +"c55c4f47": "isCrowdsaleSuccessful()", +"c55d0f56": "getCurrentPrice(uint256)", +"c55d34d4": "airdropGW()", +"c55dae63": "baseToken()", +"c55dd86a": "isLegalPlayer(bytes32,address,address)", +"c55e0eaa": "bonusPeriodDurationInHours()", +"c55e4645": "LETOCoins()", +"c55ed894": "withdraw_to_owner()", +"c55ee28c": "nextSession()", +"c55f1f42": "timeLockSend(address,address,uint256,bytes)", +"c55f3b4c": "GetInventory(address,uint256)", +"c55f60dc": "checkAndUpdateLimit(uint256)", +"c55fb39f": "SAFE_PERIOD()", +"c5620ded": "LogBuy(address,uint256,uint256,uint256)", +"c56351cd": "createCrowdsale(address,uint32,uint256,address,uint8,address,address)", +"c5639ed2": "SUB(uint256,uint256)", +"c56551b6": "pos()", +"c56597ba": "_v2()", +"c565eba6": "isRoundTwoSalePeriod(uint256)", +"c566d43c": "registerPlayer(address,bytes32)", +"c5671148": "mul64()", +"c567cd26": "updateStudent(string,bytes32,string)", +"c567e43a": "show_me_the_money()", +"c567f304": "approveAddReserveData(uint256)", +"c5682244": "changeTickPrice(uint256)", +"c56893fb": "getLockerCount()", +"c5689e7d": "deWhiteListContract(address)", +"c56935e2": "showJackpotNextRd()", +"c5699ac2": "canRestoreUnsoldTokens()", +"c5699d68": "_compare(int256,bytes,int256)", +"c569bae0": "right93(uint256)", +"c569fb36": "setDepositPool(address)", +"c56a0ffe": "summDevelopers()", +"c56a3e88": "isManager()", +"c56af732": "CannabanC()", +"c56b2dc2": "upgradePony(uint256,uint256,bytes)", +"c56b4294": "_initialMint()", +"c56bbda4": "isTransferApprove(uint256)", +"c56bea64": "setBlacklistedUser(address)", +"c56c89a2": "ChendeWorld()", +"c56cf2b2": "getAllSaleAnimals()", +"c56d0d67": "tokensSoldWhitelist()", +"c56e3849": "Versioned(string)", +"c56e610e": "getEscrowBalance()", +"c56ecdfa": "_isOne(address)", +"c56ef049": "execBuyBack(uint256)", +"c56f1578": "UzairToken()", +"c56fc9c1": "PreSaleDistributed()", +"c570e952": "CustomPOAToken(string,string,address,address,uint256,uint256,uint256)", +"c5715483": "bonusMinContribution()", +"c571627b": "ChangeMainWallet(address)", +"c572652b": "distributeWithLockup(address,uint256,uint256,uint256,uint256)", +"c5729617": "get_value_by_hash(string)", +"c572ca10": "TokenProcurement(address,address,uint256,uint256)", +"c572dcc3": "getFreeMiner()", +"c572e9cb": "_decodeBuyData(bytes)", +"c57380a2": "getControllerAddress()", +"c573902d": "getInfoPanel()", +"c573e6bd": "distributeIfNeeded(address,uint256)", +"c57443fa": "ZRX_EXCHANGE_ADDR()", +"c574a53c": "addJurisdiction(bytes32[],bool[])", +"c574d156": "getGameBalance()", +"c575200d": "setPropertyBecomePublicEarnUntil(uint16,uint256,uint256)", +"c575c238": "sendToken(address)", +"c57679fc": "recipientMIT()", +"c5774a3f": "seedAmount()", +"c5787fa3": "picops_identity(address,uint256)", +"c578b2f4": "getTransformTarget_default()", +"c578f2c8": "SetCityName(address,bytes32)", +"c5793979": "sendCheck(address,uint256,bytes32)", +"c57949e2": "AllowanceLedger(address,address)", +"c57981b5": "FEE()", +"c57a050e": "fairandeasy()", +"c57a4a4d": "TOKEN_PUBLIC_SALE_CAP()", +"c57a8825": "updateRegistryAddress(address)", +"c57a99e5": "testFailRetractLatestRevisionEnforceRevisions()", +"c57c3bbd": "addLockProduct(uint32,uint32,uint32,bool)", +"c57c5f60": "initMultiowned(address[],uint256)", +"c57c7b62": "mktIssue(address,uint256)", +"c57d3fb7": "setReFundAddress(address)", +"c57d5fe9": "addToBalance(address,address,uint256)", +"c57dead7": "betsLost()", +"c57fbf90": "tokenRate(address)", +"c58068d8": "getIdFromStr(string)", +"c5809312": "setLLV_edit_28(string)", +"c58156e0": "removeAllocation(address)", +"c5820c45": "DFSDex()", +"c58343ef": "getRequest(uint256)", +"c5837713": "a_empresa(bytes5)", +"c583bb53": "RYNO()", +"c5854113": "MilestonesFactory(address)", +"c58580aa": "icoAddress1()", +"c585bb93": "registerAssetProxy(address)", +"c585de64": "Rate3()", +"c58684ab": "setPauseEmergence()", +"c5868754": "is_signed()", +"c587e3d6": "totalRised()", +"c587f93e": "softCapCountDownTimer()", +"c588415e": "phase4EndBlock()", +"c588953e": "enddate()", +"c588ba1b": "getLowestGameWithoutQuorum()", +"c588cabd": "firstBonusPercent()", +"c5893a8e": "OnPreSaleBuyerCompensated(address,uint256)", +"c589f1f3": "transferEthersToDao(uint256)", +"c58a3321": "setAccessControl(address,address,uint8,bool)", +"c58a34cc": "setTimeout(uint256)", +"c58a6ce8": "sendPayment(uint256,address)", +"c58aaae6": "selfDestructBeneficiary()", +"c58b54ef": "getAssetAttributes(uint256)", +"c58cc060": "firstBuyers()", +"c58ce220": "setDeveloper(string)", +"c58d0be0": "getCompetitionStatusOfRegistrants()", +"c58d96a5": "whiteListERC223(address)", +"c58f2f49": "hashTypes(uint8)", +"c58f520f": "sharingPool()", +"c5907a34": "Kanicoin()", +"c590c994": "unfreezeCount()", +"c5917695": "KevCoin()", +"c5919f24": "addNewMeme(string,string,string,string)", +"c591b3ca": "itemCanVote(address,uint256)", +"c591c8a3": "getAllJinglesOnSale()", +"c59255dc": "changeMilestone(uint8,uint256,uint256,uint256)", +"c592c3ba": "addAmountBoughtAsMember(address,uint256)", +"c5933658": "registerEmailAddress(address,string)", +"c59361b9": "getInsurance(address,uint256)", +"c593dfbf": "queryDataFromId(address,uint256)", +"c5944f30": "Token(address,uint256)", +"c5947cd6": "getReportingState()", +"c594a12d": "areadjacent(uint16,uint16)", +"c59513a4": "updateMyTimeMintBalance()", +"c5958bda": "removeFile(bytes)", +"c595fee6": "adminWithdrawEther()", +"c5960c29": "buyKeyByAddr(address)", +"c59671a7": "set_dni(uint256)", +"c5980b07": "getDRSCoinDividend(uint256)", +"c5981892": "buyTokensCrowdsale(address)", +"c59981cd": "edit(uint256,uint256,uint8,uint8,uint8,uint8,string)", +"c599b77f": "setUserGroup(address,address)", +"c599d58f": "MAX_NUM_PAYOUT_ATTEMPTS()", +"c59a9428": "transferTreasurership(address)", +"c59acae4": "lrcWithdrawn()", +"c59b2e20": "NEVA()", +"c59b5562": "buyICO()", +"c59c1144": "setDefaultKey(address,address,uint8,bytes32,bytes32)", +"c59d278e": "vehicleDatesByCity(bytes32)", +"c59d4847": "getStats()", +"c59d55ad": "releaseTransfer(bytes32,uint8,bytes32,bytes32)", +"c59d5633": "getPurchasePrice(uint256)", +"c59d6abe": "getAngelClaims(uint64)", +"c59e0b87": "setSecondWalletPercent(uint256)", +"c59e5729": "upAd(uint256)", +"c59ea269": "snowflakeBalance(string)", +"c59ee1dc": "raisedAmount()", +"c59f3a7c": "getConditionsState()", +"c59f6983": "editMaxItems(uint8)", +"c59f83cf": "_getNftContract(address)", +"c5a0a555": "setImageRegionId(uint256,uint256)", +"c5a0ca8f": "init(address[],uint256[],uint256,address)", +"c5a0d1c7": "percentageQuarter1()", +"c5a104d9": "ln_fixed3(uint256,uint256)", +"c5a1d7f0": "metadataHash()", +"c5a2d352": "publish(uint256,bytes32)", +"c5a369b4": "addAddressDescription(string)", +"c5a46ee6": "value(uint256)", +"c5a4eb35": "initialPricePaid(uint256)", +"c5a55152": "distributeRewards(address[])", +"c5a60ddb": "payout(bytes32,uint256,uint256)", +"c5a6732b": "_isChallengerAttackFirst(uint256,uint256)", +"c5a796ac": "set_address_Arina(address,address)", +"c5a83c2b": "countAssets()", +"c5a88559": "getWithdrawNum()", +"c5a8a2ab": "changeStatus(uint256,uint8)", +"c5a8d421": "RocketFuelToken()", +"c5a9833e": "trusteeVaultAddr()", +"c5a988c9": "extendPreSalesPeriodWith(uint256)", +"c5aa0f17": "setNewJackpot(uint256,uint256,address)", +"c5aad3be": "getStackPtr()", +"c5ab4602": "updateBalance(address,address,uint256,bool)", +"c5ac124d": "cashToEth()", +"c5ac8a4d": "leftSharePrice()", +"c5aca3b2": "NYXDecentralizedIdentificationRequest(string,string)", +"c5ace443": "priceFeedSource()", +"c5ad94a9": "addressSharesCount(address)", +"c5ae6e0e": "Kernal()", +"c5ae7570": "getSaleFinancialData()", +"c5af3808": "setJntBeneficiary(address)", +"c5af9000": "Convert()", +"c5afc0a5": "BonusAllocation(address,string,uint256)", +"c5afce8b": "ensureInAccountList(address)", +"c5b045eb": "secondRoundPercent()", +"c5b05616": "TokenAuction()", +"c5b15057": "updateSettlementStatus(bool)", +"c5b15caf": "CIBOS()", +"c5b1a53c": "deposit(bytes16[],uint64)", +"c5b1d9aa": "newRound()", +"c5b1e789": "Unset(string,address)", +"c5b2333c": "set_status_user(address,address,bool,bool)", +"c5b2429d": "periodPreITO_tokenPriceUSD()", +"c5b35556": "bixToken()", +"c5b3a429": "PresaleStartTimeChanged(uint256)", +"c5b417ec": "buyPlot(uint256,uint256)", +"c5b43c39": "CypherX()", +"c5b53a34": "_setAuthorizedPower(uint256)", +"c5b748c0": "redemptionPrice()", +"c5b7589c": "startMiniGame()", +"c5b7be81": "TruckingCoin()", +"c5b7c51b": "participateEvent(address)", +"c5b7f5bf": "presale_eth_fund()", +"c5b85eb8": "UBSI()", +"c5b8d7a1": "cyclesStartFrom()", +"c5b8f772": "isOwnerOf(address,uint256)", +"c5b930f9": "singletonHash(bytes32)", +"c5b9cdf8": "SMARTCCCoin()", +"c5bac421": "pruneInvestors(uint256,uint256)", +"c5bafbc4": "eosDACToken()", +"c5bb8af4": "IMDEXsetInactivityReleasePeriod(uint256)", +"c5bcc4f1": "parentSnapShotBlock()", +"c5bd8456": "TakeOffWorldWide()", +"c5bd9089": "redeemCoupons(uint256)", +"c5bdbd70": "multDenominator()", +"c5be7a77": "_shareDevCut(uint256)", +"c5bef690": "_escrowIndex()", +"c5bef74e": "getHash1(address,uint256,address,uint256,uint256,uint256)", +"c5bf2249": "wallet(bytes)", +"c5bf339c": "getLastNonPublished()", +"c5bfa9d9": "getUserBalanceOnEther(address)", +"c5bfd5dd": "TokenDrop()", +"c5bfef39": "initCountry(uint256,uint256)", +"c5c00ac6": "needVerified()", +"c5c01169": "checkFrozenAccounts(address)", +"c5c03af3": "_mode()", +"c5c09b20": "TestRecover(uint256,uint256,uint8,bytes32,bytes32)", +"c5c0b859": "pauseMaster()", +"c5c0db08": "whom()", +"c5c187f5": "LogApproval(address,address,uint256)", +"c5c2f6e0": "getTopPlayerScores(uint256)", +"c5c4412d": "CleanBankerRound(uint8)", +"c5c4744c": "totalRaised()", +"c5c5135c": "crystalPrice()", +"c5c56740": "ROBIET()", +"c5c593e1": "openGameResultAndNewGame(uint256,uint256,uint256,string,bytes32)", +"c5c680f3": "testUser()", +"c5c6b12a": "isInvestorInWhitelist(address)", +"c5c715e4": "approveBatch(address[],uint256[])", +"c5c72bf4": "sayAnything(string)", +"c5c7681f": "Main(address)", +"c5c78258": "YoloTokenPresaleRound2(uint256,uint256,uint256,uint256,address,address)", +"c5c80103": "listFaceToFaceAttendants()", +"c5c8015b": "isNotContract(address)", +"c5c872ae": "transferFromRobot(address,address,uint256)", +"c5c87db4": "reinvestReturns(uint256,address)", +"c5c8a08a": "getExpirationTimeFromAddress(address)", +"c5c925e2": "StoreRegistry()", +"c5c93bdc": "Birth(uint256,uint256,uint256)", +"c5c95c55": "QuantityUnit()", +"c5c9e3be": "setPreparationPeriodTrainingFeeMultiplier(uint256)", +"c5c9f617": "walletE()", +"c5cac386": "Questions()", +"c5cc52fc": "Indemnisation_5()", +"c5ccebd3": "smallerPriceComparator(uint256,uint256)", +"c5cd3bec": "getRevisionTimestamp(bytes20,uint256)", +"c5cd88db": "missingFundsToEndAuction()", +"c5ce3911": "productId()", +"c5cf8c7e": "getCurrentHighscore()", +"c5d03fc0": "OftenChainToken()", +"c5d0c68b": "addMaster(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint64,uint64)", +"c5d14955": "phase_2_token_price()", +"c5d22e94": "MAX_TOTAL_AMOUNT_TO_RECEIVE_ETH()", +"c5d2577c": "newTransfer(bool,address,address,uint256,uint256,uint256)", +"c5d290d0": "RUNtoken(uint256,string,string)", +"c5d39a33": "isEating(address)", +"c5d456d6": "moves(address,uint256,uint256)", +"c5d46dfc": "computeScore(address)", +"c5d51586": "loser(address)", +"c5d5997c": "changeSubUser(address,address)", +"c5d61ad0": "newGame(uint256,bool,uint256)", +"c5d65d1a": "approveSponsorableJob(uint256)", +"c5d6a7f1": "GreatcoinERC20Token()", +"c5d6c75d": "PunchClock()", +"c5d7802e": "z()", +"c5d7dd0a": "Blockcash(string,string,uint256,uint256)", +"c5d81804": "mintSBIToken(address,uint256)", +"c5d83794": "setDesign(uint256,string)", +"c5d8adcb": "EventProduct(uint32,string,uint32,uint32,uint32,uint32,uint32,uint256,uint256,uint256)", +"c5d953a3": "setCurrentMarketRate(uint256)", +"c5d9ada3": "IANToken()", +"c5d9c762": "set_pre_kyc_iconiq_bonus_denominator(address,uint256)", +"c5dacf68": "getOwnerEth()", +"c5db22da": "lastBlock(uint64)", +"c5dba811": "doRandom(address[],address,uint256)", +"c5dc6b55": "getAccountBonus(address,address)", +"c5dce83d": "changeAPTController(address)", +"c5ddb614": "BlockFundIncubatorToken()", +"c5ddba02": "startDate1()", +"c5decd37": "ico3Raise()", +"c5df27ef": "ETHcap()", +"c5e08ba9": "get_oo_of(address)", +"c5e12813": "burnAllInvestorTokens(address)", +"c5e290cd": "_editInfoImpl(string)", +"c5e2a7db": "updateMetadata(address)", +"c5e2f418": "disableChanges()", +"c5e34e77": "Total_Products(uint256)", +"c5e35f42": "Gentingchain(uint256,string,string)", +"c5e36b7e": "lockMana(uint256)", +"c5e3adf5": "nFund()", +"c5e3b1a6": "reclaimOwnership(string,string,bytes32)", +"c5e3e3f3": "s21(bytes1)", +"c5e412e5": "createSaleContract(address,uint256,uint256,bool)", +"c5e42338": "getIncreaseTotalStakeCalled()", +"c5e4594f": "multiline(uint256,uint256,uint256,bytes32)", +"c5e634e4": "transferAuditTokens(address,uint256)", +"c5e7b4fe": "setupPreIco(uint256,uint256)", +"c5e8b864": "hasEnoughBST(address,address,address)", +"c5e951a4": "agentOrdersOf(uint256,uint256)", +"c5e974ed": "transferToken(bytes32,address,address,uint256)", +"c5e98a4c": "updateIncentiveTokenLimit(uint256)", +"c5e991a8": "ThirdEtherLimit()", +"c5ea01c9": "testF2(uint256)", +"c5ea0b4a": "buySquare(uint8,uint256,address)", +"c5ea3c65": "maxId()", +"c5ea6256": "enableSecureMode()", +"c5ea8e1d": "RefUpdate(string,uint256,uint256,uint256)", +"c5eab684": "calculateDividends(uint256,uint256)", +"c5eaccfd": "whitelistAddrAndBuyTokens(address,uint256)", +"c5ebeaec": "borrow(uint256)", +"c5ec05fd": "scheduleSale(uint256,uint256)", +"c5ec365f": "guideInvestmentAttractedShareToPay()", +"c5ecfc61": "getEscrowDeposit(string)", +"c5ed7162": "firstPresaleStart()", +"c5ed8c99": "canCollect(uint256)", +"c5edd450": "payFor(uint256)", +"c5ee5688": "setCompte_25(string)", +"c5ef4c3e": "set(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"c5efaa11": "calculateValue(int256,uint64)", +"c5efaae8": "buyCredits(address,uint256)", +"c5efea68": "getAdminStatus(address)", +"c5f0d3d6": "geneKind()", +"c5f2892f": "get_deposit_root()", +"c5f310c0": "register(bytes12)", +"c5f39cd7": "rateSecondTier()", +"c5f40edd": "discountedDealAmount()", +"c5f4b3da": "RewardPoolAmount()", +"c5f4c98b": "changeDiscountStep(uint256)", +"c5f5ce21": "advisorTokenWallet()", +"c5f60620": "expectedTokens(uint256,bool)", +"c5f70682": "setByuoutCount(uint256)", +"c5f713cf": "push(uint256,bool)", +"c5f7ed63": "NeckCoin()", +"c5f913fe": "callExitFromUnknownContract(address)", +"c5f956af": "treasuryAddress()", +"c5f98578": "RequestFromContract()", +"c5f98a3f": "mega()", +"c5fa1924": "MMS()", +"c5fbe723": "result_payto()", +"c5fc43cb": "Newera()", +"c5fc98c9": "TOKEN_THIRD_DISCOUNT_MULTIPLIER()", +"c5feaf60": "PRE_SALE_START_1()", +"c5fee757": "executeOrder2(uint256)", +"c5ff2069": "MooTokenSale()", +"c5ff2222": "playNo()", +"c600e1dc": "getProfit(address)", +"c6011633": "setRateFees(uint256,uint256)", +"c6017a25": "playerRoll(uint256,address)", +"c601b7f8": "icoPhase1Start()", +"c60211ee": "MineFinished()", +"c6028cf3": "nextSaleStage()", +"c6029e7b": "sendBPESOTokenToMultiAddr(address[],uint256[])", +"c603a4e3": "getTotalHP(uint256,uint256,uint256,int256)", +"c603ae14": "jockeyFS(uint256)", +"c603bd7d": "_executeOrder(address,uint256,uint256,bytes,int256)", +"c603c97b": "NewPiedPiperCoin(string,string,uint8,uint256)", +"c6041333": "calculateKnowledgeBuySimple(uint256)", +"c6046f77": "mintAndTransfer(address,uint256,bytes)", +"c6049946": "saleExchangeRate1()", +"c604bec9": "hasExtension(address)", +"c604e967": "delFilter(uint256)", +"c605f76c": "helloWorld()", +"c6062bc3": "sellerRefund(uint256,address)", +"c60778cf": "RefundRequest(uint256,address,uint256)", +"c6080b3f": "KiDhon()", +"c60880e0": "Aster()", +"c609ab26": "setImageCurrentRegionId(uint256,uint256)", +"c60aa10d": "newForgeCon(address)", +"c60b099f": "removeRate(uint256,uint256)", +"c60b7784": "queryEOSCrowdsaleKey(address,address)", +"c60bdc7f": "setUsersContract(address)", +"c60c13a3": "blockAccountFunds(address,uint256)", +"c60c3aca": "callFor(address,uint256,uint256,bytes)", +"c60cae29": "changePeriodTime(uint256,uint256)", +"c60ccb0e": "takerBuyAsset()", +"c60ce271": "findNextMinute(uint256,bytes)", +"c60ced1b": "LetsGoChain(string,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"c60f56b2": "totalAcorns()", +"c60f6462": "resetRick()", +"c610bb07": "tranfer(address,uint256)", +"c6113205": "getTokenByIndex(bytes32,string,uint256)", +"c6114aaf": "updateIPOPrice(uint256)", +"c6117d37": "xactionFeeShare()", +"c611ded7": "reserveTokensAddress()", +"c6129a5a": "GetVersion()", +"c612cc4e": "compareDatesWithoutTime(uint256,uint256)", +"c613089f": "getBetsEvenAndODD(uint256)", +"c6132eb3": "timeBetweenRewards()", +"c6137977": "eliminateSmartContractByteCode()", +"c614b522": "getAllInvestmentPackageIds()", +"c614da67": "free(bytes12)", +"c6150296": "checkBalances(address,address)", +"c615365f": "EthBetter()", +"c6159a35": "icoTransfer(address,uint256)", +"c6169e1f": "maxTournamentContenders()", +"c616f412": "totalQuantity()", +"c6178a65": "soldTokensSale()", +"c617fe6e": "_setAllowance(address,address,uint256)", +"c6180d27": "silverBoxPrice()", +"c618210a": "crowdsalepricing(address,uint256,uint256)", +"c618a1e4": "volume()", +"c618d15f": "ConvertNumbers(bytes5)", +"c6195d03": "ONE_DECIMAL_QUANTUM_ABC_TOKEN_PRICE()", +"c6195d36": "setConfig(address,uint256)", +"c6199b6d": "getCustomerServiceAddress()", +"c619bbd3": "GetPower()", +"c61ab738": "getSupplyLimit(uint32)", +"c61b06ae": "collectibleIndexToOwner(uint256)", +"c61b8a44": "rewardGenerationComplete()", +"c61c3c4b": "buyPackWithETH(bool)", +"c61de162": "_withdrawPromoter(address,uint256)", +"c61e42ae": "mint(uint256,int256)", +"c61e5be6": "cardSetsInCirculation(uint256)", +"c61ea7a3": "CrowdfundableToken(uint256,string,string,uint8)", +"c61efde6": "MsgEngine(uint8)", +"c61f1103": "foundersTimelock2()", +"c61f13a1": "setWitdrawGas(uint256)", +"c61f3a2c": "drpToken()", +"c61fb3f1": "Moon()", +"c62072d2": "nfo_transaction(uint256,uint256,address,address,bytes32)", +"c620b5fe": "isDaySecond()", +"c620ecc7": "KYCTeam()", +"c62122eb": "AmberToken()", +"c621f96e": "deleteDIDHolder(address)", +"c6220fbd": "dividendDistributionStartTime()", +"c6221878": "projectCompleted()", +"c62239da": "printAllCompanies()", +"c6224757": "issueTreasury(address,address,address)", +"c622afb0": "getInsertPointForNumTokens(address,uint256)", +"c6235f8d": "delMarketMaker(address,address)", +"c623674f": "ipfsHash()", +"c6236a5c": "scheduleCall(bytes,uint256,uint256,uint8,uint256)", +"c6240303": "SetAuxOwner(address)", +"c6253f14": "XXXXXXXX08(uint256)", +"c625bd27": "transferFromBRXPay(address,address,uint256)", +"c625e9b1": "buyTokens(uint256,address)", +"c62631a5": "LicensingToken()", +"c62662f2": "setTotalCapitalization(uint256)", +"c6266693": "setCoreContract(address)", +"c626c52e": "isGame(address)", +"c6279ab1": "voteClose()", +"c627d0f8": "setCampaign(uint256,uint256)", +"c628ddc3": "TAIL()", +"c629061d": "external_oraclize_randomDS_proofVerify(bytes,bytes32,bytes,string)", +"c6291223": "fundTransferWithin(address,address,uint256)", +"c629cdf4": "collectPayout()", +"c629e770": "donorList()", +"c62aa67d": "getNodeId(bytes32)", +"c62c5fda": "setIcoFirstWeekRate(uint256)", +"c62cfa1d": "getMyNote(uint64)", +"c62d7407": "frozenOf()", +"c62dcd5b": "getSentTransactions()", +"c62dee76": "HumanBlockToken()", +"c62eac5c": "create(address,uint256,bytes32,int256)", +"c62fae5d": "getValueInfo(address)", +"c63012a1": "setHashPiture(uint256,bytes32)", +"c630f92b": "canEnterPool()", +"c630f96b": "ZToken(uint256,string,uint8,string)", +"c6314bf9": "companyAllocation()", +"c6317f37": "Token_Saled()", +"c631b292": "closeVoting()", +"c631e758": "clearRole(address)", +"c6321979": "buyTokenPack(uint256)", +"c632e654": "_takeRdFee(uint256)", +"c633084f": "sendGreeting(address,string)", +"c6335b26": "startInvasion(uint256,uint256[])", +"c633eb24": "generateReserve()", +"c63445f3": "setFeePool(uint256)", +"c634d032": "mintToken(uint256)", +"c634fd83": "adminSetDefaultFee(uint256,uint256)", +"c63545e9": "developer_edit_text_fees(string)", +"c6354bc0": "addCountries()", +"c6357b54": "impl_forging(address,uint256,uint256)", +"c635a9f2": "MinimumDeposit()", +"c635bf38": "keyGt(bytes32,bytes32)", +"c635d65e": "StandardToken(address,string,string,uint8,uint256,bool)", +"c6361267": "mintOneWeek()", +"c6366ce9": "TOTAL_ICO_CAP()", +"c636813e": "disapproveSingleUser(address)", +"c63755e1": "transferPresale(address,uint256)", +"c6381649": "getChats()", +"c6384071": "voteCount()", +"c638529f": "SetProvider()", +"c6388e6f": "_AtlantisToken()", +"c6393e62": "migrationSetBoard(bytes32,bytes32,string,uint8,address)", +"c63998ed": "updateUnitsOneEthCanBuy(uint256)", +"c6399fc7": "_setItemNotForSale(uint256)", +"c639e8c5": "registerVerifier(address)", +"c63a4e05": "getCartLength()", +"c63c1a27": "calcFight(uint64,uint64,uint256,uint256)", +"c63ccb3b": "Discount()", +"c63d04df": "BonusReferred(address,address,uint256,uint256)", +"c63d99db": "auctionName()", +"c63e2ebc": "setRoundStart(uint256,uint256)", +"c63e529b": "buy(string,string)", +"c63ebcbb": "claimedUnits()", +"c63f49ab": "LuckyDice()", +"c63fdcc7": "claimPayment(uint256)", +"c63ff8dd": "claim(bytes)", +"c64012a6": "CoinSent(uint256,address,string)", +"c640487d": "_changeLogicContractAddress(address)", +"c640752d": "update(address,address)", +"c641aaca": "addPrivateSaleEndDate(uint256)", +"c6427474": "submitTransaction(address,uint256,bytes)", +"c642b103": "treasuryTimelockAddress()", +"c642e7bf": "getRoundState(uint256)", +"c642f094": "MOT()", +"c6430e29": "get_firstbytes(address)", +"c6434660": "isTakePermitted(uint256,uint256,uint256,address,address,uint256,uint256,address)", +"c643872e": "paymentTo(uint256,bytes,address)", +"c6440b3e": "sub(uint32,uint32)", +"c64572b8": "minimalPriceUSD()", +"c645ecc4": "handleReturnBytes32()", +"c6461625": "setIV_R4(uint256)", +"c64743d5": "BlockMined()", +"c6476fe9": "isMinimumInEther()", +"c647b20e": "setTaxes(uint256,uint256)", +"c647c3d9": "t_1st_StageEnd()", +"c648843a": "current_week()", +"c6490835": "total_tokens()", +"c64a2358": "_targetBlock()", +"c64a3239": "updateExec(address)", +"c64aace0": "airdropConjured()", +"c64bf22d": "SummerGreen()", +"c64bf32f": "distribute_token()", +"c64d73c6": "JCoin()", +"c64e03a2": "FAPcoin()", +"c64e08a0": "CampaignPausd(uint256)", +"c64e8bc0": "executeN(uint256)", +"c64f28c8": "createImage(address,uint256,uint16,uint16,uint16,uint16)", +"c64f9490": "updateAccessoryLock(uint64,bool)", +"c64fa2e4": "totalDividendShares()", +"c64fbbce": "_calcRemainingRoundTime()", +"c65025f8": "isSmartSharingEnded(bytes32)", +"c6502da8": "basePayment()", +"c6512a33": "CNC(uint256,string,uint8,string)", +"c6544e5c": "icoSpecConfirmed()", +"c6548076": "isUserBlacklisted(address,address)", +"c65538ec": "afterSTEDistributed()", +"c655d7aa": "recoverAddress(bytes32,bytes)", +"c655fd2c": "setSlowDump(uint256)", +"c6560856": "currentJackpotInWei()", +"c6567835": "changeVaultWallet(address)", +"c6570e67": "contractorTransfer_Scoupon(address,uint256)", +"c65799a4": "ReturnRequested(address,address)", +"c6580352": "HeroTrained(uint256,address,uint256,uint256,uint256,uint256,uint256,bool,uint256)", +"c65808b9": "getSpell(uint32)", +"c6585a27": "updateNotaireAddress(address)", +"c659ce2b": "setBountyAddress(address)", +"c659d443": "url(bytes32)", +"c659dceb": "is_verified()", +"c65a0fdf": "updatePixelIndex(uint16,uint16)", +"c65a4068": "_multisig(bytes32,uint256)", +"c65ac542": "saleUnpause()", +"c65ad85c": "isReadyToStart(bytes32)", +"c65b125f": "setContestContractAddress(address,address)", +"c65b490e": "getBabyMakinPrice(uint256)", +"c65c6eae": "getReadableContribution()", +"c65c9567": "gameResult(uint256,uint256)", +"c65c9d63": "getNextStakedNode(address)", +"c65ccc07": "setLtdParams(uint256,uint256,uint256)", +"c65cec32": "refundTokenToCustomer(address,address,uint256,address)", +"c65d15b9": "reference()", +"c65daea0": "allocated6Months()", +"c65fb380": "isSet()", +"c6601270": "getMyIceDragon()", +"c660477b": "GetData(uint256)", +"c6610dec": "owner_share()", +"c661deb4": "issueHardcapToken(address,address,uint256)", +"c661ee4d": "proofAddr()", +"c661fed3": "isAdvisor(address)", +"c6620580": "presale_tokens()", +"c6634ef5": "certify(uint256)", +"c6638df9": "LogTemplateCreated(address,address,string)", +"c66485b2": "setDefaultResolver(address)", +"c665242b": "storeMsg(string)", +"c6653041": "ParticipantRegistry()", +"c666c798": "setExtendedTokenCap(uint256)", +"c6677519": "executeSettingsChange(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"c667ab20": "setFundsRegistry(address)", +"c6685617": "record(address,uint256)", +"c6688445": "stringToSignExample()", +"c668dfd7": "doAirdrop(address,address[],uint256)", +"c668ee3d": "operatingFundAddress()", +"c668f71b": "exchFee()", +"c6699ba8": "addPayTable(uint16,uint16,uint16,uint16,uint16,uint16,uint16,uint16,uint16)", +"c669c955": "incentivesIn(address[],uint256[])", +"c66a431d": "addContract(bytes32,bytes32,bytes32,bytes32,address,bytes32)", +"c66aaf0f": "sucessor()", +"c66bd6aa": "updateEthICOThresholds(uint256,uint256,uint256,uint256,uint256)", +"c66c2536": "doTransferOut(address,address,uint256)", +"c66c67e9": "setReservedTokensPercent(uint256)", +"c66e4095": "icoContract()", +"c66e9260": "ESCCrowdsale()", +"c66ed8f7": "lockGenesisImports()", +"c6702187": "CLAIM_SIGNER_KEY()", +"c6705a00": "signupUsersManually(address)", +"c6711049": "withdrawTokenManually(uint256)", +"c67117f5": "InvEnterpriseAddr()", +"c67146a5": "check_bet(uint256,address,uint8)", +"c6715f81": "left44(uint256)", +"c6716590": "DovieBarMitzvah()", +"c67410fb": "getOwnersLoan(address)", +"c67415f3": "mineCrystals(uint256)", +"c674e0c9": "setSmartContractStatus(uint8)", +"c67685a9": "turnOffCanUpdateDeveloperMiningPower()", +"c67747a5": "bitGuildAddress()", +"c6776239": "BitPropertyToken()", +"c6777e63": "changeUrls(string,string)", +"c677b207": "addElectedMember(address,string)", +"c6786e5a": "destroy(address[])", +"c6788bdd": "claims(address)", +"c678ca19": "comfirmIsses(uint256)", +"c678e618": "sendDividend()", +"c679580e": "isModuleHandler(address)", +"c6795b45": "bonusPatterns(uint256)", +"c67979a5": "PakistanRupee()", +"c6798033": "dedicatedProxyAddress()", +"c67acceb": "firstStageEndsAt()", +"c67af5cc": "logMarketParticipantsDisavowed(address)", +"c67b099f": "createWildcard(string,uint256,uint16)", +"c67b599a": "presaleMinPurchase()", +"c67bbc24": "getVolume()", +"c67c6eab": "stopCrowdSale()", +"c67ce6f5": "FlightDelayNewPolicy(address)", +"c67d376d": "getClosedCandidates()", +"c67e43c1": "setExpectedEnd(uint256)", +"c67f3ba3": "GanLiXia()", +"c67f3e1f": "totalDistributedinWei()", +"c67f7df5": "getDepositsCount(address)", +"c6803622": "wasCalled()", +"c68098d9": "personalCapEndAt()", +"c6814aa2": "copyPaper(address,uint256)", +"c681d68d": "badgeBalanceOf(address)", +"c68218d1": "setStrF1F2F3(string,string,string)", +"c6822356": "_createAss(string,uint32,string,uint256,uint256,uint256)", +"c682a10d": "createRoot(string,string)", +"c682d0bb": "authorized_updateSaleInfo(uint256,uint256)", +"c68309a7": "buyICloudSecsAgainstEther()", +"c683630d": "isWhitelist(address)", +"c6837a87": "getDepositeTime(address,uint256)", +"c683d8e4": "enableSale()", +"c6842868": "registerBroker(address)", +"c6851889": "Sale(address,uint256)", +"c68581ea": "addFile(uint256,string,uint256,string,string)", +"c686554e": "getInfo(address,address)", +"c687857c": "updateAsset(uint256,string,string,string,uint256)", +"c687ce9d": "setInitialOwner(address,uint256,uint256)", +"c6888fa1": "multiply(uint256)", +"c68890c7": "AcceptGuardianOffer(uint256)", +"c6891018": "take(uint256,bytes32[])", +"c68a3c1e": "setShares()", +"c68a536d": "GetLuckyRewards()", +"c68ad0a8": "Hold(address,address,uint256,uint8)", +"c68ae617": "authenticate(address,uint256,uint256,uint256)", +"c68b82c9": "ethLastUpdate()", +"c68bf3ea": "eDeposit()", +"c68cd47e": "COIN_SUPPLY_ICO_TIER_1()", +"c68cee04": "addArtistToRegistry(bytes32,address,uint256,uint256)", +"c68d81e0": "a(address)", +"c68deb7e": "saleEndTimestamp()", +"c68e35b0": "verifyHash(bytes32,uint8,bytes32,bytes32)", +"c68e52d9": "setTimeStamp(string,uint256)", +"c68ee9cd": "search(uint256,uint256)", +"c68eebe3": "getCurrentTokenPriceInCents()", +"c68f2ada": "getDoc(string,string)", +"c68f7dfc": "test_hasClaimableShares_zeroClaimableStake()", +"c68fd307": "minimumContributionPresalePhase1()", +"c68fe0c1": "WeClosedInto()", +"c69034ab": "test_21_assertGasUsage50Boards()", +"c690c9a5": "Apollo()", +"c6912a39": "confirmRedbullQuest(address)", +"c692c049": "pushData()", +"c692d9de": "LogNeumarksIssued(address,uint256,uint256)", +"c692f4cf": "renounceAgent()", +"c69493a0": "subSale()", +"c69500fd": "rewardPay(address,uint256)", +"c695ff11": "randomAPI_url()", +"c6960d4c": "winnerid()", +"c6967c17": "DeviseToken(uint256)", +"c6969604": "emitBoardCreated(uint256,bytes32,bytes32,address,uint256,uint256,uint256,bool)", +"c69768dd": "createInkeTrade(bool,uint256,uint256)", +"c6979c0a": "WhitelistContract()", +"c697cbec": "_startNextRound()", +"c6998dc2": "updatePartner1_vows(string)", +"c69a00be": "setPeggedToken(address,address,address,uint256)", +"c69a8e13": "erc20BalanceForAddress(address)", +"c69b3936": "getNumSigs(bytes32)", +"c69b5df2": "prev_hash()", +"c69b5dfb": "verifyInvestors(address[])", +"c69b761f": "admin_set_deposit(address)", +"c69c7069": "mintPaper(string,string)", +"c69cd09d": "breedingFee()", +"c69e06db": "transactionsActive()", +"c69ed5f2": "executeTransaction(bytes32)", +"c69f4481": "setBlacklist(uint32,bool)", +"c69f8623": "convertSignalToMinimal(uint256)", +"c69fa8a9": "setAuthorizerAddress(address)", +"c69fbf48": "bountyProgram()", +"c6a00369": "LRCFoundationIceboxContract(address,address)", +"c6a05c06": "payOut(uint8,uint256)", +"c6a09d95": "grantAccess(address,address)", +"c6a0b13f": "cancelOnSaleCrab(uint256)", +"c6a0eb24": "test_threeInvalidEqBytes32Message()", +"c6a118d4": "impl_transferMS(address,address,uint256)", +"c6a17d2b": "pow10(uint256,uint8)", +"c6a22681": "getParticipantIndex(uint64,address)", +"c6a2573d": "oneTokenInEurWei()", +"c6a2afa7": "TokenECCAC(uint256,string,uint8,string)", +"c6a41bd7": "updateDetails()", +"c6a470e2": "getDisputeState(uint256)", +"c6a496bf": "Artwork(bytes32,uint256,string,string,string,uint256,address)", +"c6a4d345": "setMaxEscrow(uint256)", +"c6a4f4af": "getCurrentPotInfo()", +"c6a52959": "gba()", +"c6a5d5da": "updateBlocksPerDay(uint256)", +"c6a69931": "verifyCommit(address,uint40,uint256,uint8,bytes32,bytes32)", +"c6a71577": "WEKUToken(address)", +"c6a725d8": "confirmTransaction(uint256,bool)", +"c6a7d3af": "setTokenExcange(address,uint256)", +"c6a81857": "existsCountsById(uint256)", +"c6a898c5": "u()", +"c6a97c60": "SolusToken()", +"c6a98543": "ICONIC_NIC(uint256,string,string)", +"c6ab4514": "sendRobust(address,uint256,uint256)", +"c6ab5429": "KotET2()", +"c6ab5cdc": "closeBuy()", +"c6ab5d90": "withdraw(uint8)", +"c6ab848a": "referralInstance()", +"c6abc298": "getBetAt(address,uint256)", +"c6ac53fd": "submitTransaction(address,uint256,bool,bytes)", +"c6ad1191": "MyOwnCoin()", +"c6ad5d7c": "expireBid(address)", +"c6ae3b57": "dEthereumlotteryNet(address,address)", +"c6ae67ad": "fundcruToken()", +"c6af3166": "checkDouble(address)", +"c6af43f9": "updateThresholdNewAuction(uint256)", +"c6af477c": "get(bytes32,string)", +"c6afd98a": "requestConversion(uint256)", +"c6b0263e": "setPublicCapability(address,bytes4,bool)", +"c6b0a1fa": "checkPricePair(uint256,uint256)", +"c6b0de7e": "removeFromWhiteList(address,address)", +"c6b0ffd0": "is_success()", +"c6b20dc2": "Invacio()", +"c6b2a5dd": "updateCurrentSupply()", +"c6b3a7cf": "wplus(uint256,uint256)", +"c6b3ad7b": "setTWhitelist(address[],uint256[])", +"c6b4ad80": "ctu_owner()", +"c6b511a1": "EshaCoin()", +"c6b547e6": "getDocumentName(uint256)", +"c6b59e9e": "changeParameters(uint256,uint8,uint256)", +"c6b6005b": "TMSYToken(address,address,address,address,address)", +"c6b6b1e8": "ICOReserveSupply()", +"c6b6bc3c": "burnPurchase(uint256)", +"c6b85d2b": "AtomicX()", +"c6bbb6ef": "sendTokensTo7(address,address,address,address,address,address,address,uint256)", +"c6bc8dee": "testInitial2of3()", +"c6bcd5f7": "INTEGROToken()", +"c6bcefe5": "otherPoolTotal()", +"c6bd541f": "supportTeam(uint256,uint256,uint256)", +"c6bd5a13": "dividendsPaidPerShare(address)", +"c6bd62f5": "get_CountAllHolderForProfit()", +"c6bd9187": "closeEvent(bytes32)", +"c6bec93a": "startLottery(uint256)", +"c6befedf": "createPoll(bytes32)", +"c6bf03dd": "changeReleaseAccount(address,address)", +"c6bf7489": "sendLudumToMany(address[],uint256[])", +"c6c09252": "_generateCode()", +"c6c18e31": "PCToken()", +"c6c1e248": "ProductFactory()", +"c6c20a75": "getTotalCardValue()", +"c6c25d04": "artUrlList()", +"c6c27c71": "_slrByrLmtChk(address,uint256,uint256,address)", +"c6c2966d": "setFundingEnv(uint256,uint256,uint256)", +"c6c2ea17": "fib(uint256)", +"c6c332f2": "getUserEthVolumeSaldo(address,address)", +"c6c39bda": "unitsOneEthCanBuyafter()", +"c6c3bbe6": "mint(address,address,uint256)", +"c6c3f3f9": "setKyberProxy(address)", +"c6c4676c": "currentResult()", +"c6c4bf44": "issueFor(bytes32,address)", +"c6c55773": "Topplay()", +"c6c599c1": "changeApprover(address)", +"c6c5de53": "testFailMixItemStoreNotRegistered()", +"c6c65136": "spiderReq()", +"c6c68eb7": "getAyantDroitEconomique_Compte_2()", +"c6c6b3ed": "Sale(uint256,uint256,address)", +"c6c7d143": "cancelRedemptionRequest(uint256)", +"c6c7f5aa": "impl_amountOfOrderQueue()", +"c6c839f0": "increaseFreezeValue(address,uint256)", +"c6c85ca5": "updateTokenRate(uint256)", +"c6c8823c": "getActionPrice(string)", +"c6c8cdc7": "LogFundTransfer(address,uint256,bool)", +"c6c99744": "t01_setKey(bytes32)", +"c6caa959": "sellRock(uint256,uint256)", +"c6cb7a96": "orderMatchTest(uint256,uint256,int256,uint256,uint256,address,address,uint256,int256)", +"c6cb7ab8": "getBytesValues(bytes32)", +"c6cbc52a": "revokeCertificate(bytes32)", +"c6cbd5f0": "abandonedIcoBalances(address)", +"c6cc68b9": "BuyStockRocket(uint16,address)", +"c6cce2e7": "len(address)", +"c6cd15aa": "frozenVaults()", +"c6cd712d": "delegatedTransferAndNotify(address,address,uint256,uint256,uint256,bytes32,bytes,uint256)", +"c6cdbe5e": "categories(uint256)", +"c6cdc6f6": "fastICO(uint256)", +"c6cdf77e": "upgradeWeth(address)", +"c6ce2664": "setBancorRegistry(address)", +"c6ce81f0": "manualSendTokens(address,address,uint256)", +"c6ceafef": "setFeedAddress(address)", +"c6ceb50b": "Decimals()", +"c6cebebd": "get_info(uint256)", +"c6ced32b": "getWorkersCount()", +"c6cf1c7f": "generateRandomPerformance()", +"c6cf452b": "testInitialA()", +"c6cf4dd9": "upgradeOnePointZeroBalances()", +"c6cf54de": "BIC(uint256,string,uint8,string)", +"c6d04634": "BasicCrowdsale(address,address)", +"c6d0be63": "emergencyCease()", +"c6d0ffda": "failedTemperaturesLength()", +"c6d1d23d": "totalPledgedFeesAt(uint256)", +"c6d2cb6a": "getLavaTypedDataHash(address,address,address,uint256,uint256,uint256,uint256)", +"c6d32838": "deathData_f3()", +"c6d3ab9d": "changeTokenSymbol(string)", +"c6d417de": "NewName(address,string)", +"c6d44ecc": "_getTokenCountToBuyFromSeller(uint256)", +"c6d456ec": "Winning_Entry()", +"c6d48e0d": "getVersionsCount()", +"c6d69a30": "setTaxRate(uint256)", +"c6d761d4": "cancelEscape(uint32)", +"c6d779e6": "getAmountOrdersForDay(uint256)", +"c6d784cc": "Statustelega(address)", +"c6d81547": "DecisionTokenSale(uint256,address)", +"c6d8a203": "setConversionRateAddress(address)", +"c6d8be5a": "setPricingStrategy()", +"c6d8f0c4": "getLocks(uint256)", +"c6d90e70": "AcceptsDailyRoi(address)", +"c6d9112a": "MAX_DAILY_TOKEN_COSIGN_SPEND()", +"c6d95512": "ExchangeTokenPushed(address,uint256)", +"c6dad082": "make()", +"c6daeeaa": "TIME_TO_HATCH_1SNAIL()", +"c6dbdf61": "primary()", +"c6dc3640": "AirDropPayBitsR2(address[])", +"c6dc437b": "bids_ignored_count()", +"c6dca1d2": "proposeAsset(string,uint256,uint256)", +"c6dd5098": "DateCoinCrowdsale(uint256,uint256,uint256,address,address,address,address)", +"c6dd5db5": "validateOrder(address,uint256,address,address,uint256,address,uint256,uint256)", +"c6dd8018": "Cygnal()", +"c6ddcfe8": "publicSellToken()", +"c6ddd889": "ForeignBridge(uint256,address[])", +"c6de150b": "soldIdeaWei()", +"c6de5709": "calc_partnerPercent(address)", +"c6deeb9d": "contributionAccepted()", +"c6df66a7": "firstPlay(bytes32,uint8,bytes32)", +"c6e000b5": "mntpToken()", +"c6e0329f": "LaoHuiHui(uint256,string,string)", +"c6e04590": "rateHard()", +"c6e08ba9": "EligmaCrowdsaleContract()", +"c6e0c908": "checkTransferFromWithReference(address,address,uint256,string)", +"c6e0dc6e": "ChangeTransferStatus()", +"c6e1c178": "TheLuckyOne(bytes)", +"c6e3a9b3": "_total_sold()", +"c6e3d1b4": "promotionsOfHost(address)", +"c6e3e8fd": "getManualByAddress(address,address)", +"c6e3ffc3": "determinePID()", +"c6e416b5": "addressGains(address)", +"c6e5546c": "distributeTokens(uint256,uint256)", +"c6e68059": "DeAuthorized(address)", +"c6e68ea6": "createTournament(bytes32,uint256,uint256)", +"c6e6ab03": "allocateCandyToken(address[],uint256[])", +"c6e6b803": "grantAt()", +"c6e715e1": "rechargeDeposit()", +"c6e81b07": "remainingAuctionable()", +"c6e8b4f3": "createProxyAndCall(address,address,bytes)", +"c6e946df": "ComputePharaohReq()", +"c6e994d7": "shareWithdraw()", +"c6e9ce11": "NZD_CLEAR()", +"c6e9ff54": "changeBonusDistributionAddress(address)", +"c6ea3037": "_createSale(uint256,uint256,uint256,uint256,address)", +"c6ead8af": "tokensBurnt()", +"c6eae0c5": "limitEth()", +"c6eb8a65": "stage2BeginTime()", +"c6ed3418": "TokenMintPoD()", +"c6ed8990": "addTokens(uint256)", +"c6ed8e1b": "getApprovedProxys()", +"c6eda379": "totalZTKCheckAmounts()", +"c6ee701e": "getInts()", +"c6ee7a2c": "Linkable(address,address)", +"c6eeeb04": "increaseTimeBy()", +"c6f017e1": "addOrgan(address)", +"c6f03aaa": "getRegister(string,string)", +"c6f0557f": "insertarMensaje(uint256,string,string)", +"c6f067d1": "MVPToken()", +"c6f1649f": "deposit(address,uint256,address,address)", +"c6f3a895": "endFirstPeriodTimestamp()", +"c6f47486": "getHistoricalPrice(uint256)", +"c6f482aa": "largeCapDelay()", +"c6f48866": "isGameOver(bytes32)", +"c6f4ebb3": "o_minerador(uint256)", +"c6f54e62": "order(address[2],uint256[4])", +"c6f5b0e0": "getContributor(uint256)", +"c6f5d91f": "getAddressWhiteList()", +"c6f6122d": "transferredManually()", +"c6f664af": "totalInsuranceFlows()", +"c6f6d9d9": "lotteryCount()", +"c6f6f216": "setMaxPerTx(uint256)", +"c6f70370": "generateRoomNightToken(uint256,uint256,uint256,uint256,uint256,bytes32)", +"c6f88b0a": "_hasCorrectTreasury(address)", +"c6f981d7": "setTrap(uint256)", +"c6f9defe": "futureExpanstion()", +"c6fadeb3": "fechAllSumNumForEncourage(uint256)", +"c6faf736": "updatePromoBonus(uint256)", +"c6fc2bae": "ACEEquityToken(uint256,string,string,uint8)", +"c6fd2103": "recordImbalance(address,int256,uint256,uint256)", +"c6fdee56": "isAddress(address,address)", +"c6fe317f": "changeVanityURL(string)", +"c6fe7296": "resetPhases(uint256,uint256,bool,uint256,bool)", +"c6ff3ae3": "EthMark()", +"c6ff4081": "tokenProcess(address)", +"c7005f04": "distributeInternal(uint256,uint256,uint256,uint256)", +"c701672f": "_recordPresalePurchase(address,uint256)", +"c7021c9e": "submitPresetTransfer(address)", +"c7024b98": "deleteHybridization(uint256)", +"c7027329": "isBossWannaCryContract()", +"c7028f96": "burnAllLeftTokens()", +"c702d3b4": "Unregistered(address,address,uint256,uint256,uint256,uint256)", +"c7033137": "settleBets()", +"c7033721": "genesisRoot()", +"c70383a5": "takeOwnerShip(uint256)", +"c7046117": "sendAsGift(address,uint256)", +"c7047fa7": "metadataUrlPrefix()", +"c704e04a": "recordingResultsOfBet(bytes16,bytes16[],uint8[])", +"c704f7ed": "lockName()", +"c705a1a8": "getMerchandise(uint256)", +"c705e1a3": "allowToken(address,address,uint256,bool,bool,address)", +"c7071c3e": "MiningRewardChanged(uint256)", +"c707936a": "Serpent()", +"c707bae5": "getTopNames()", +"c708ed9c": "getPI_edit_15()", +"c7091c5e": "INITIAL_STAGE()", +"c70978da": "UnicornBreeding(address)", +"c7097f62": "linkAddress(address)", +"c7098e91": "decodeOrderTokenAndIsBuy(uint256)", +"c709c7b8": "priceStep7()", +"c70a24af": "ROLE_NEED_LOCK_UP()", +"c70a3f1a": "whiteHat()", +"c70a9246": "GetConsentData(uint256)", +"c70ad05b": "identity_storage()", +"c70bbc13": "emitRevoke(bytes32,uint256,address)", +"c70cc560": "storePassword(string)", +"c70cdad8": "hashBacktestPositions(uint32,int64[])", +"c70cef3a": "WalamaCoin()", +"c70d169d": "answerRequest(uint256,bytes)", +"c70dd8b3": "procureTokens(address)", +"c70e8640": "amountFundTeam()", +"c70ef908": "setPI_edit_33(string)", +"c70f5eaa": "buyCard(uint256)", +"c70f8e71": "enableTypeById(uint256,uint256)", +"c70faf90": "EndMinting(uint256)", +"c70fe6bd": "migrateAuction(uint256,address)", +"c71029e1": "getBankRequests(string,uint256)", +"c7102df7": "__stopBlock()", +"c710a2aa": "marketplace_controller()", +"c7110035": "multiSigWithdrawal(address,uint256)", +"c7120bad": "linkAccount(uint8,string,string)", +"c7120d77": "sendFunds(address,uint256,uint256,uint256,uint256,uint256)", +"c712f3b3": "TradeId()", +"c7133f53": "setAccountS(address)", +"c713a67b": "momentNonceOf(uint256,uint256)", +"c713aa94": "setEndBlock(uint256)", +"c713b10f": "isSameSign(int256,int256)", +"c713bd70": "getMarketerRate()", +"c7143c41": "notSameSeed(string,string)", +"c7144269": "changeSettings_only_Dev(uint256,uint256,uint256,uint256,uint16,uint256,uint256,uint256,uint8,uint8)", +"c7153816": "lowerSupply(uint256)", +"c715533e": "allFrozenTime()", +"c715a2b1": "withdrawnOf(address)", +"c71692b6": "capPreICO()", +"c716b616": "adopt(uint32,uint32)", +"c7172710": "pouseCrowdsale()", +"c7178230": "isDeprecated()", +"c717e9eb": "voidOrRevert(uint256)", +"c718640a": "setDragonSpecialPeacefulSkill(uint256,uint8)", +"c718b272": "Floor(uint32,address)", +"c718b2bb": "YunToken(address)", +"c718d0e0": "_setFreezedBalance(address,uint256,uint256)", +"c7192cda": "EventUpdateWasReset()", +"c7192e44": "setPaid(address)", +"c719348b": "safeCheck(uint256)", +"c71a7aea": "distributedReservedTokensDestinationsLen()", +"c71ad84d": "vehrespond(uint256,uint256,address,bool)", +"c71b583b": "closeRequest()", +"c71ba100": "revokeBalance(address,address,address)", +"c71bee4c": "OMITokenLock(address,address)", +"c71bf8ba": "multiplierOfPrice()", +"c71c0b40": "fundRaised()", +"c71c3f05": "blackListCompanies()", +"c71c6c55": "receiveIncome(bytes32,bytes32)", +"c71c890a": "weekFourStart()", +"c71cb0b4": "buildTile(uint16,uint16,uint8,uint16)", +"c71cbcf3": "recoverAccount(address,address)", +"c71daccb": "checkBalance()", +"c71ddb9f": "releaseContract()", +"c71e48d6": "setOutcome(bytes32,bytes32[])", +"c71e876b": "VESTING_DURATION_2Y()", +"c71eef58": "applyForTokenOneDay()", +"c71f2bae": "AddOpenOrder(uint32)", +"c71f311c": "setFABAcompanyTokensWallet(address)", +"c71f4253": "getNumberOfVotes(uint256)", +"c7216a44": "_generate_special_horsey(address,address,address,bytes32)", +"c721b34b": "setBattleAddress(address)", +"c721b6bd": "grantVestedTokens(address,uint256,uint256,uint256,uint256,bool,bool,bool)", +"c721cfe2": "reClaimBalance()", +"c721f08d": "activateSale()", +"c722328d": "withdrawToMultisig()", +"c722e113": "_transferDivs(uint256,uint256,uint256)", +"c722e462": "CoinX()", +"c7238af7": "escapeDestination()", +"c724772c": "turnOnIco()", +"c72486d2": "Unexpended()", +"c724acb7": "calcDifficulty()", +"c7258d7f": "isUserWhitelisted(address,address)", +"c726c2b9": "getPI_edit_24()", +"c726dea8": "memberArray(uint256)", +"c7277115": "ManagedToken(string,string,uint8)", +"c727980a": "payDeposit(uint256,address,uint256)", +"c7280315": "UnauthorizeToTransfer(address)", +"c7286a21": "removeContribution(address)", +"c7291b7e": "descriptionHashHistory(uint256)", +"c729a567": "withdrawFundToAddress(address)", +"c72a2328": "tier_rate_1()", +"c72a480e": "DGameController(address[])", +"c72b5176": "getGroups()", +"c72b5e4f": "persentRate()", +"c72be838": "gasForDCN()", +"c72c1133": "Log(string,uint256,uint256)", +"c72c757e": "delete_allowedAddress(address,address)", +"c72cbd78": "removeused()", +"c72e1576": "addAddressInWhitelist(address)", +"c72e57c7": "lockedTill()", +"c72e6d03": "p_setRefPercent(uint256,uint256)", +"c72e8baf": "PRICE_3()", +"c72e9e45": "setEgeregAddress(address)", +"c72f0dd9": "Player_HitOrStand(uint256,bool)", +"c7303c61": "createPost(string)", +"c7304f37": "changePool(uint88)", +"c730bbd8": "rateWaiting()", +"c730dfbb": "WemarkToken()", +"c731c504": "restoreFunds(address,address,uint256)", +"c731e124": "rewardslength()", +"c73202ff": "jpPercentageDivisor()", +"c732d201": "currentCount()", +"c7330bf6": "getDepositesCount(address)", +"c7343754": "getLendingItemLength(address)", +"c7347832": "asyncTransfer(address,address,uint256)", +"c734f917": "onTokenTransfer(address,uint256)", +"c73659be": "RexToken(uint256,address)", +"c736a051": "getPlayer(address,uint256)", +"c736e118": "bgxWallet()", +"c7377d80": "Bourneereum(uint256,string,string)", +"c737b7c6": "getTotalTickets(address)", +"c7381593": "Multimember(address[],uint256)", +"c7385f2e": "proofIds(uint256)", +"c738a836": "changeEnabledAddressStatus(address,bool)", +"c7395151": "updateMaxAcceptedDeposits(uint256)", +"c7398dd4": "getCustomValue()", +"c73992e4": "hasApproved(address)", +"c73997b1": "changeBaseValue(uint256,uint256,uint256)", +"c739d31c": "setPrivateSaleAgent(address,bool)", +"c73a2d60": "disperseToken(address,address[],uint256[])", +"c73aae86": "get_Release()", +"c73b187d": "oraclizeMinCallbackGas()", +"c73b302e": "projectsCount()", +"c73c27bc": "getNodeId(uint256)", +"c73c2a45": "WriteBible(uint16,uint16,uint16,uint16,string)", +"c73c933d": "ChangeBurnBoundsOperationEvent(uint256,uint256,uint256)", +"c73d3b30": "getAbilities()", +"c73defce": "ETCHaddress()", +"c73ea367": "setNickName(string)", +"c73ec2eb": "minCompositionFee()", +"c73f0c11": "burnGlobFoneCoin(uint256)", +"c73f20e3": "issueamount()", +"c73fcee2": "CLNTotalSupply()", +"c74073a1": "close(address)", +"c740bc9f": "setLongtermMinter(address,uint256)", +"c7410070": "publicbattlestart()", +"c7411eb4": "calculateAntBuy(uint256,uint256)", +"c741764c": "oldE4()", +"c741d70d": "retrieveFounds()", +"c741e85a": "set_parameter(string,uint256)", +"c741f0f3": "buyBILL()", +"c7420a9f": "store(bytes,address,address,uint256,uint8,uint8)", +"c7423803": "finishRecovery()", +"c7423f26": "strFundDeposit()", +"c74266b3": "HanYinToken()", +"c742bab1": "VUP_TOKEN_SUPPLY_TIER1()", +"c743092e": "Buy(uint256,address,uint256,uint256,uint256,uint256)", +"c7430e28": "Trillionix(address,address)", +"c7431f5c": "changeETXAddress(address)", +"c74352af": "FileServerManager()", +"c74370db": "Transfer(address,address,uint48,bytes)", +"c74442e6": "withdrawNexiums(address)", +"c7445c22": "getPassportId(address,address)", +"c7446565": "startAt()", +"c74590e3": "LogInvestment(address,uint256)", +"c745ca9a": "transferBack(uint256,address,address)", +"c745dab9": "MakerDepositedEther(uint256)", +"c7464e8a": "showRandomWinners()", +"c746a52d": "showme(uint256,uint256,uint256)", +"c746b299": "PSCToken()", +"c746c8f4": "addAllowedSender(address)", +"c747ef76": "AbieFund(address[])", +"c747f120": "totalIssuerCollateralisation()", +"c74803de": "_isContained(bytes32,bytes,bytes32)", +"c7489441": "closeMarketMaker(uint256)", +"c748b54b": "PeerWalletsERC20Token()", +"c74a2449": "canUserAnswerQuestion(address,uint256)", +"c74a4000": "cnrtoken()", +"c74a690c": "price_in_wei()", +"c74a827c": "setMonsterCreatorAddress(address,address)", +"c74a96eb": "setHGT(address)", +"c74abe43": "getMyTokensValue()", +"c74b1e01": "startPresaleTime()", +"c74b5a3e": "open5Chest()", +"c74c251f": "addSafely(uint256,uint256)", +"c74c851a": "isValidInvestment(address,uint256)", +"c74ca049": "unshareKey(bytes32,address)", +"c74ce765": "TESTTESTToken(address)", +"c74e907b": "commit(address,uint256,uint256)", +"c74fc077": "guards(uint256)", +"c74fda29": "_distributeAdvisorsToken(uint256)", +"c7506049": "_processSalePurchase(address,uint256)", +"c7508ec7": "removeClaim(address,address,bytes32)", +"c750938e": "shiftcashToken()", +"c750c3b1": "allocateEndTime()", +"c750cb79": "getHighestBidder(uint256)", +"c750df73": "submitContract(bytes32)", +"c7516da7": "CITY_INCREASE_RATE()", +"c751e027": "PoolTeam()", +"c752746e": "tokenHoldersClaimed(address)", +"c752a999": "MoneyTokenPromo(uint256,string,uint8,string)", +"c752ff62": "totalUpgraded()", +"c75363b6": "BEGIN_TIME()", +"c7542f1d": "GCCToken()", +"c754fc08": "addGroup(uint256,uint256,uint256)", +"c75514e8": "executeOptions(address,uint256,string)", +"c7559da4": "uint256ToBytes(uint256)", +"c7573e82": "registerStudent(address)", +"c7574839": "communityWallet()", +"c7576e8f": "TOBToken()", +"c7576ed4": "finalizeMigration(address,address)", +"c75782be": "startup(uint256,address)", +"c7586219": "burnShares(uint64)", +"c7586cde": "THIRD_USER_CUT()", +"c758b813": "ausGroupAllocation()", +"c75902cf": "iwtfundtokens()", +"c7591d35": "checkGuess()", +"c7593f01": "SKLAuction()", +"c75abf24": "setup(uint256,uint256,uint256)", +"c75bc4fb": "setMaintenanceLock(bool)", +"c75bc6f8": "UniverseShieldToken(address,address)", +"c75c6a06": "batchCancelVoteForCandidateByIndex(uint256,address[],uint256[])", +"c75d9d29": "unlockPurchase()", +"c75e8d55": "setRecipientString(string)", +"c75fb740": "Error(bytes)", +"c75fc22f": "freeEther()", +"c7600cde": "getInitialReporterAddress()", +"c7602316": "deploy(string)", +"c7614487": "MAX_CROWD_FUNDING_ETH()", +"c761a2f5": "revertFeeCalculatedFlag(bool)", +"c762547d": "contractCreatedCount()", +"c762c463": "mUsers(address)", +"c762d3ea": "calculateReferralBonus(uint256,uint256)", +"c762d5f7": "setBorrower(address)", +"c763400e": "endpreIco(bool)", +"c763e5a1": "chain()", +"c764427c": "addAllowedContract(address,address)", +"c764d4c4": "withdrawCountriesToken()", +"c764ee57": "VIWOZ()", +"c7656f6e": "startProject()", +"c765defd": "setBeneficiary(address,bytes32)", +"c76668cf": "transferCheck(address,address,uint256)", +"c7669337": "fundMinting(address,uint256)", +"c766ce02": "addFactProviderToWhitelist(address,address)", +"c768051a": "gla()", +"c768a4cd": "upgradeSword(address)", +"c768ac01": "totalWithdrew()", +"c76a4bfb": "relayReceiveApproval(address,address,uint256,bytes)", +"c76a74df": "Bitscoin()", +"c76b838c": "bulkSell(uint8[],bytes6[],uint32[],uint32[])", +"c76c1ba5": "placeBet(uint256,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"c76c68d0": "CalcToc(uint256,uint256,uint256)", +"c76c9269": "ethVest()", +"c76d0754": "fiatSend(address,uint256,uint256)", +"c76de3e9": "Start(string,string)", +"c76df481": "getArmyOwner(uint256)", +"c76e7f32": "addressToPersonId(address)", +"c76f0d13": "COSTToken()", +"c76f80c8": "_createCaptainToken(address,uint256,uint32,uint32,uint32,uint32,uint32,uint32)", +"c772173a": "ProsperToken()", +"c7725426": "setAuthorizeMintToken(uint256)", +"c772af39": "boss()", +"c7736abf": "windowOpenTime()", +"c77547f7": "maxTimeIntervalHB()", +"c7760b11": "getlevel(address)", +"c77636fc": "PauseOwnerAdmin(bool)", +"c77684f9": "ClipperCoin(uint256,string,string)", +"c776cc42": "FREEDOMCoin()", +"c7775011": "setSlaveWallet(address)", +"c77810a4": "Pot()", +"c778427b": "migrationInitiated(address)", +"c7786275": "Bitansuo()", +"c778a46b": "doPresaleMinting(address,uint256,int256)", +"c7798891": "TokensReleased(address,uint256)", +"c77a0de6": "xfer(uint256)", +"c77a16ed": "resumeTransfers()", +"c77ae9bf": "resetRaz(uint256,address,uint256)", +"c77bd8cc": "acceptAdminToo()", +"c77bdfce": "bindToken(address,address)", +"c77c00f8": "openNewBet(address,uint256,uint256)", +"c77db34e": "PWNasdas()", +"c77dff62": "shrimpyramid()", +"c77e7614": "getTotalWithdrawAmount()", +"c77ef9b8": "setAccessProvider(address)", +"c77f58c8": "transferMinusComission(address,uint256,uint256)", +"c77fe4d6": "incentivisingSupply()", +"c781d7b0": "calculateAntSell(uint256)", +"c781f97b": "getCurrentCrabPrice()", +"c7825c3f": "Pruebalillo()", +"c782fc60": "getExtraBalance(address)", +"c783dc9e": "pullEther(uint256)", +"c783fb10": "validBalanceOf(address)", +"c784648d": "addIdArrayItem(address,uint256,string,string,uint256)", +"c7847d19": "createAnnoTrade(bool,uint256,uint256)", +"c7857d27": "setMyName(string)", +"c786a66f": "_createSchedule(address,uint256,uint256,uint256,uint256)", +"c786ebd1": "LogPrepareToStart(string,uint256,uint256,address,address)", +"c7876ea4": "basePrice()", +"c7878fa0": "setHumanityFund(address)", +"c7888a07": "claimSuperDragonEggs()", +"c7891514": "forthWeekMainICOBonusEstimate()", +"c78974de": "get_test_data_length()", +"c78982d5": "getIntervalCoefficient(bytes2,uint256)", +"c789ea87": "acceptFoundation(string)", +"c78a33e1": "DestroyEvent(address,uint256)", +"c78a4c98": "icoRaised()", +"c78a8dfe": "Kardanor()", +"c78ad77f": "percentage()", +"c78af2f7": "contributeByProxyContract(address,uint256)", +"c78b200c": "transferableFromBlock()", +"c78b616c": "totalListings()", +"c78bd060": "makeInvestment()", +"c78c0138": "timestamp_contract_start()", +"c78c3a83": "getPredictions()", +"c78cdf66": "mintTimelocked(address,uint256,uint32)", +"c78d7380": "COINECTToken()", +"c78d846d": "PTCToken()", +"c78dc603": "alt_buyCollectible(uint256,uint256,int256)", +"c78e139a": "setUpgradedContractAddress(address)", +"c78f3e18": "starteth()", +"c78fc487": "indexedByOwner(address,uint256)", +"c791316e": "minFundingAmount()", +"c791bd21": "AngelToken()", +"c791cc39": "BOECoin(uint256,string,uint8,string)", +"c791e16b": "platPriceOracleContract()", +"c792024a": "tierRates(uint256)", +"c79343e5": "isSYNVault()", +"c7939f34": "oddsTotal(uint256,uint256)", +"c79403f5": "moveFurnaceData(address[],uint16[],uint256[],bool[],uint256[])", +"c7941a09": "setDelegadoDeEscuela(bytes32,bytes32,uint8,uint8)", +"c794549e": "setDesignatedReport(bool)", +"c7946842": "URLOf(uint256)", +"c794ef10": "purchaseCostEther(uint256)", +"c794f575": "makeAnnualInvest(uint256)", +"c7956846": "get_solved(address)", +"c795dd24": "availableTokenBalance(uint256,uint8)", +"c7963ae8": "Tabo()", +"c7968135": "totalNumberOfFunders()", +"c798b5cf": "CommunityToken()", +"c7990f70": "SetDevFee(uint16)", +"c7995a4e": "_registerTrade(uint32,uint256)", +"c79a68cf": "setPrices(uint256,uint256,string,string)", +"c79ba27d": "kscTransferFrom(address,address,uint256,string)", +"c79bb895": "SGACrowdsale()", +"c79bdb46": "setRewardPercent(uint256,uint256)", +"c79c9105": "countOfPublicKey(bytes32)", +"c79eaa22": "sub(uint96,uint96)", +"c79f5321": "update_data()", +"c79f7cef": "_postValidatePurchase(address,uint256)", +"c79f8b62": "error()", +"c79fc609": "addressC()", +"c7a02061": "totalEtherCollected()", +"c7a08487": "_generateRandomDna()", +"c7a16847": "SetRewardMulti(uint256)", +"c7a16965": "testUint(uint256)", +"c7a1865b": "play(bytes32)", +"c7a1f221": "tokenPriceInCents()", +"c7a1fb36": "PRE_SALE_CAP()", +"c7a24403": "Illuminatus()", +"c7a28247": "stopBuyingTokens()", +"c7a2a663": "getCodeAtAddress(address)", +"c7a323fe": "ACTION_INITIAL_BIDDING()", +"c7a32726": "StartCrowdsale()", +"c7a37657": "getCfd(uint128)", +"c7a3778f": "testControlRetractLatestRevisionNotUpdatable()", +"c7a4af15": "setPrice(uint8,uint128)", +"c7a4cf8d": "checkOverMaxcap(uint256)", +"c7a4e4bc": "VIPCHAINToken()", +"c7a5d285": "extract(address)", +"c7a6c454": "confirmTransaction()", +"c7a6c6d4": "_creditTokens(address,uint256)", +"c7a86dd2": "updateEnergy(uint32,uint32,uint256)", +"c7a86e33": "signedApproveCheck(address,address,uint256,uint256,uint256,bytes,address)", +"c7a96920": "stopICO_20_March()", +"c7a9a64b": "depositNetfRevenue(uint256)", +"c7a9d6de": "startICO(address)", +"c7aa278e": "poolInvestors()", +"c7aaa83f": "Bounty0xToken()", +"c7abc42a": "getgamecard(uint256)", +"c7ac0909": "AddedName(address,string,uint256,address,uint256)", +"c7ac14b1": "dividendCutPercentage()", +"c7acae2e": "getServerAddress()", +"c7ad31b0": "LogHodlStartSet(address,uint256)", +"c7adb61f": "initializeTreeCoinProject(address,uint256,uint256,address,address)", +"c7adef28": "getCitationRecord(bytes32,uint256)", +"c7ae3ad5": "fillBuyOrder(uint256,uint256,uint256)", +"c7ae7451": "addEvent(address)", +"c7ae9632": "xfer(address,address,uint256)", +"c7af18f1": "SedPoSToken()", +"c7af3dd1": "updateCost()", +"c7afe9f2": "setTokenAddress(address,address)", +"c7aff0d7": "manuallyProcessTransaction(address,uint256)", +"c7b0235b": "DPPCrowdsale()", +"c7b0f0ca": "lockTokensPercent()", +"c7b0fc5e": "usedItem(uint256)", +"c7b11fca": "mainMaxContribution()", +"c7b160db": "getTotalNumberOfAddressesReceivedAirDrop()", +"c7b1fd00": "usdPerEthLogSize()", +"c7b23ec6": "initalizeOrgan()", +"c7b27a25": "IOReceipts()", +"c7b31ed0": "store(address,address,uint256,uint8,uint8,bytes)", +"c7b3b0d4": "getCompanyInfo(bytes32)", +"c7b41aa9": "getSmartCoins()", +"c7b43f02": "expressBuyNums(uint256,uint256[])", +"c7b5716d": "createSellOrder(address,uint256,uint256,uint256,uint256)", +"c7b6084c": "backendOperator()", +"c7b6ccae": "opetToken()", +"c7b6fd6a": "subDays(uint256,uint256)", +"c7b799ae": "addressFunc(address,address)", +"c7b7d6ca": "sendResearchAndDevelopment()", +"c7b81f4f": "isEpochDataSet(uint256)", +"c7b850dd": "whitelistedContributors(address)", +"c7b87d74": "setOldTokenAddress(address)", +"c7b97288": "addTokenEmission(uint256,uint256,uint256)", +"c7b98dec": "right1(uint256)", +"c7b9bc9e": "Token(uint256,string,uint8,string,string)", +"c7b9c355": "setSecondBonusPercent(uint256)", +"c7ba24bc": "claimAndConvert(address[],uint256,uint256)", +"c7ba9264": "KAL4Token()", +"c7bb38e7": "setAmount(bytes32,uint256)", +"c7bb42f7": "TEAM0()", +"c7bc747d": "retrieveTokenByContract(address,uint256)", +"c7bce243": "Menu05()", +"c7bdbb95": "allowTransferOwnership(bool)", +"c7bdcde9": "IYAKIN()", +"c7be44fa": "banReferrer(address)", +"c7be7ae3": "frozenSupply()", +"c7bec318": "removeAccountAddress(address)", +"c7c049fc": "saleGoal()", +"c7c0c5bf": "modifyMarking(bytes32,uint256)", +"c7c16353": "weiToRaise()", +"c7c2aa25": "WarriorsBackToHome(address,address,uint256)", +"c7c2aee3": "personalCap()", +"c7c3268b": "setBaseUrl(string)", +"c7c36959": "GubbermentOverthrown(address,address)", +"c7c3b1c1": "canTerminate()", +"c7c3b2dd": "setMockedTotalCollected(uint256)", +"c7c40fbb": "addPassportLogic(string,address)", +"c7c4ff46": "depositor()", +"c7c54e4d": "theEBCC(uint256,string,uint8,string)", +"c7c5f59d": "forBounty()", +"c7c625ee": "rand(address)", +"c7c6939c": "LongPlace(address[2],uint256[8],uint8,bytes32[2],uint256)", +"c7c7322b": "testCantInitiateIncorrectSale()", +"c7c7e9ea": "getAllowed(address,address)", +"c7c806cb": "ambassadorAddress()", +"c7c80f02": "teamLockUp()", +"c7c83804": "setFinancingsAdd(address)", +"c7c8b07b": "KillSwitch()", +"c7c8c424": "ownersEth()", +"c7c8ff35": "getNeutralMutationCost(uint8)", +"c7ca07bb": "QuantityAvailable()", +"c7cb94e3": "GenPlayerRatio(address,uint256)", +"c7cbb9c8": "_createArea()", +"c7cc3743": "addContractAddr()", +"c7cc4ee9": "later()", +"c7cc63aa": "getBetTitle()", +"c7ccc559": "upgrade_cap()", +"c7cd31d5": "setLLV_edit_23(string)", +"c7ce060b": "publicDeductDeposit(address,uint256)", +"c7ceac99": "calculateBattleBoost(uint16,address,address)", +"c7cec7f8": "versions(bytes32)", +"c7cefbf1": "IDH()", +"c7cf28fe": "canClaimTimeout()", +"c7cf6a2a": "LJSToken()", +"c7cf8075": "getAvailableDevFund()", +"c7d044be": "AutoChainToken()", +"c7d128d1": "readTotalNumberOfUserPurchases(address)", +"c7d20f82": "addMeterpoint(address,int256)", +"c7d22929": "betOpen(uint256,string,string,string,string)", +"c7d26e90": "getAccessoryClaims(uint64)", +"c7d4f68e": "getRobotForUserByIndex(address,uint256)", +"c7d586c9": "provideProofOfWork(uint256)", +"c7d5b6f1": "cancelSellOffer()", +"c7d5c0af": "XVOTOKEN()", +"c7d5d171": "costRecharge(uint256)", +"c7d5dd36": "Factory(address,address)", +"c7d6e988": "fundOwnerWallet()", +"c7d6faf1": "easyPropose(address,uint256)", +"c7d77970": "registerNameXaddrFromDapp(address,bytes32,address)", +"c7d7b5a6": "fillOrder(address[5],uint256[6],uint8,bytes32,bytes32)", +"c7d96304": "canMateWithViaAuction(uint256,uint256)", +"c7d9f4d1": "transferableBalanceOf(address)", +"c7da93b7": "specialTransfer(address,uint256,uint256,uint256)", +"c7daae0a": "firstFreeAddressIndex()", +"c7dab436": "vestingTime()", +"c7daceb1": "acceptBuyNowOffer(uint256)", +"c7db04d7": "SelfDestructManager()", +"c7db3342": "getCurrentRoundKey()", +"c7dbbc47": "nextTicket()", +"c7dbc2be": "minimumPodSize()", +"c7dd4b4f": "gameID()", +"c7dddf0f": "itemHistoryOf(uint256)", +"c7de2d13": "WithdrawToken(address,uint256,address)", +"c7dea777": "areOldMiningKeysVoted(uint256,address)", +"c7deda22": "Doug()", +"c7df0a90": "all_eth()", +"c7df9054": "getBuyUnitsInformations()", +"c7dfabcc": "Buy(uint8,string)", +"c7e04670": "publicSaleTokenPrice()", +"c7e0635d": "AGENT_STATUS(bytes32,address)", +"c7e09d9c": "getSides(uint256)", +"c7e12723": "Erc20Test(string,string,uint8)", +"c7e210c3": "optionPoolMembersLockTotalOf(address)", +"c7e22ac4": "setOracleGas(uint256)", +"c7e284b8": "getTimeLeft()", +"c7e293d9": "allocateFunds(address,address,uint256)", +"c7e35a5c": "LOCK_START()", +"c7e3b6e8": "airdropAndVault()", +"c7e3ff4b": "pregnantMonsters()", +"c7e40b3a": "StatXCoin()", +"c7e416c5": "LOG_SuccessfulSend(address,uint256)", +"c7e4f453": "TokenFactoryImpl(address)", +"c7e50dc9": "isLOC(address)", +"c7e52480": "convertYourTokens()", +"c7e56740": "_getIndex(address,address)", +"c7e58644": "getSharesCount()", +"c7e59334": "toggleAttachedEnforcement(bool)", +"c7e5fc3b": "GlobalTechToken()", +"c7e67360": "GAS_BUFFER()", +"c7e6926e": "_airdropTotal()", +"c7e6d04f": "ownerConfig(address,uint256,uint256)", +"c7e73adf": "getParticipantSource()", +"c7e83451": "matchMultipleOrders(uint64[],uint64[])", +"c7e92738": "MicroBTC()", +"c7e975b8": "partner2_voted_update_marriage_status()", +"c7e9aaaf": "_isSiringPermitted(uint256,uint256)", +"c7ea07bb": "SealTokenSale(address,address,address,uint256,uint256,uint256,uint256)", +"c7ea8a68": "EOSToken()", +"c7ebc8fe": "getWinnings(address,uint256,uint256)", +"c7ed1e86": "getNoOfMsgs(address)", +"c7ed4555": "DepositSlot(address)", +"c7ed4d8c": "distributeVM(address[],uint256,uint256)", +"c7edaf33": "TheGoDgital()", +"c7edf88c": "DOW_SAT()", +"c7ee005e": "prime()", +"c7ee1c4e": "getPreviousSeed()", +"c7ee98c2": "trustedBurnTokens(uint256)", +"c7ef47d7": "isKill()", +"c7efa689": "getSaleDay(uint256)", +"c7efb162": "setup(address,address,address,uint256,uint256)", +"c7efb8ab": "ledger(address,bytes32)", +"c7f04e65": "purchase(uint32)", +"c7f132d5": "QuarterCoin()", +"c7f18d5b": "updateData(uint256,uint256,uint256,uint256,uint256,bytes,bytes)", +"c7f1f06f": "GetEmail(uint256)", +"c7f24b11": "getCCH_edit_8()", +"c7f2c3d9": "EasyInvest10()", +"c7f2e6af": "Contribute(bytes20)", +"c7f300ed": "CrowdSale_ModifyEndDate(uint256)", +"c7f3166d": "getBetInfo(uint256,uint256)", +"c7f31f1c": "HandWins(address)", +"c7f36010": "setupClaim(uint256)", +"c7f423c7": "setLeaf(uint256,bytes32)", +"c7f42c64": "battleFee()", +"c7f43b57": "TIER2_CAP()", +"c7f46dea": "testRewardBS(bytes32)", +"c7f5f1e8": "DistributeNextNTokens(uint256)", +"c7f6f40c": "updateKYCStatus(uint256)", +"c7f6fa60": "EIDTokenERC20()", +"c7f71103": "futrMiner()", +"c7f7475c": "AdminGroup(string)", +"c7f758a8": "getProposal(uint256)", +"c7f7be5c": "setGxCoinContract(address)", +"c7f84605": "___upgradeTo(address)", +"c7f86c37": "withdrawFundsRP()", +"c7f8fe65": "getBalanceReleased()", +"c7fa1d47": "Hedge()", +"c7fa52de": "setRegistryAddr(address)", +"c7faa88d": "collectProfit()", +"c7fb117c": "depositCancel(uint256,uint256)", +"c7fb9aab": "displaymultisig()", +"c7fbad27": "revealStart()", +"c7fc9ace": "WorldNode()", +"c7fccd3f": "isAuthorizedForToken(address,address,address)", +"c7fde81f": "changePOI(address)", +"c7fe11d4": "_createCaptainToken(address,uint256,uint32,uint32,uint32,uint32,uint32,uint256)", +"c7fee63e": "updateRate()", +"c7ff1584": "isHalted()", +"c7ff1b60": "maxCapReached()", +"c7ff2086": "getPropertyColorsOfRow(uint16,uint8)", +"c8004293": "lastKnownPropertyAddress()", +"c80094b3": "testEquals()", +"c8016c85": "MAIN_SALE_BONUS_PERCENTAGE_PHASE1()", +"c8027210": "Malaysia370()", +"c8028bee": "auditorRegistry()", +"c803486b": "getAvailableFunds(address)", +"c803ae2a": "kycComplete()", +"c803f981": "care(uint256)", +"c8045941": "changeDescription(string,string)", +"c8046827": "registerBurn(uint256)", +"c804a58e": "toggleRefunding()", +"c8051885": "isWithinContributionRange()", +"c805801c": "VoipTken()", +"c805914a": "setRespectRequiredToRecruit(uint256)", +"c805b6bc": "PRESALE_TOKEN_HARD_CAP()", +"c805f68b": "setRelay(address)", +"c806286d": "setFreeze(uint256,bool)", +"c80667e3": "appendUintToString(string,uint256)", +"c80675de": "sendDiamond(address,bytes32,string,bytes16,uint256)", +"c806a91d": "TOKEN_TOTAL_CAP()", +"c80743c5": "maximumTokenAmount()", +"c807be58": "endTimeSale2()", +"c807cb02": "Uninjected(address)", +"c807e645": "JECKAirdrop()", +"c8081bd2": "requestMutualJobCancellation(bytes16,address,address,uint256,uint256)", +"c8088830": "_canPayOraclize(uint256)", +"c808cf86": "exchangeHelenium(uint256,address)", +"c80944e5": "buildRight(address,uint256)", +"c80a589b": "withdrawTokenBalance(uint256,address)", +"c80b05e1": "isViolated(address)", +"c80bbb17": "ReserveFund()", +"c80becb6": "enablePreSale()", +"c80c14a5": "getBankBalanceWEIInfo()", +"c80c28a2": "getNumberOfParticipants()", +"c80d3694": "saleWeiCap()", +"c80db88c": "getSchellingExpansion(uint256)", +"c80e0ddd": "saveCode(uint256,string)", +"c80e3e1e": "SingularityTest23()", +"c80ec522": "withdrawn()", +"c80f9a4f": "transferPokemon(address,address,uint256)", +"c81050e6": "checkBranchInEpisode(uint256,uint256)", +"c8117b5b": "extractBalanceOfLength()", +"c81196da": "numberOfMilestones()", +"c8135ba1": "bids_decrypted_count()", +"c813c30e": "testThrowSomething()", +"c813e02e": "_isLeapYear(uint16)", +"c814324c": "timeBought(address)", +"c81450a0": "RaffleResult(uint256,uint256,address,uint256,uint256,bytes32)", +"c814864c": "CreateChips(uint256,uint256,uint256,uint256,bool)", +"c8149cbc": "setMigrationLock(bool)", +"c8159d70": "Seriality()", +"c815c9ef": "TerraEcoToken()", +"c8162068": "setTeamAddr(address)", +"c8162497": "BETX()", +"c8166a8a": "Question()", +"c817d75d": "Transfer(address,address,uint256,uint256,uint256)", +"c817e84d": "addWhitelisted(address,bool)", +"c8187cf1": "determineReward(uint256)", +"c818acf7": "createCloneToken(address,uint256,string,uint8,string,bool,address)", +"c818faec": "updatedAt(uint256)", +"c8193841": "addSoftwareVersionRecord(bytes32,bytes32,uint256)", +"c8199231": "createContractTot(string,uint256)", +"c8199826": "buyTickets()", +"c819f6e9": "levToken()", +"c81a5455": "Milestone_CloseTheIco(string)", +"c81a7d10": "CurryCoin()", +"c81bd106": "approveNewOwner()", +"c81c590d": "getEtherAmount(uint256)", +"c81caae7": "acceptMember(address,string,string)", +"c81cbc5c": "MIST()", +"c81cf764": "getAmountFromBuyer(address,address)", +"c81d1d5b": "getPunk(uint256)", +"c81e05ad": "KODO()", +"c81eccda": "getTokenId(bytes)", +"c81ede67": "pollBurnQty()", +"c81f49cb": "getTotalPaid(address,uint256)", +"c8216f33": "getLineUpEnable_default()", +"c8226e61": "withdrawEgereg(uint256)", +"c822bd3d": "transferCost(bytes16,uint256)", +"c822d7f0": "isRegistered(string)", +"c8234ac8": "createTokenUri(uint256)", +"c82467c9": "ComputeTokenPrice()", +"c8248f8d": "PreICO(address,address,address,address,address)", +"c824a222": "auctionsOf(address)", +"c82531a3": "createAuction(uint256,address,uint256,uint256,uint256,address)", +"c825a939": "fundingRatePredictionBonusPoolInIBC()", +"c827a7bb": "testExternal(uint256[20])", +"c82829e0": "setSoftHardCaps(uint256,uint256)", +"c828371e": "getStartTime()", +"c828e6ee": "getCurrentlyClaimableAmount(address)", +"c8290efd": "zen()", +"c8291dbd": "increment(address,address)", +"c829958c": "isImported(address,address)", +"c8299b10": "gotransfer()", +"c8299ed8": "afterClaim(uint256,uint256,uint256,uint256,uint256)", +"c829b0e3": "MAX_LAYERS()", +"c82aac47": "searchByTag(bytes32)", +"c82b8ec5": "EtherDaruma(address,address,address,uint256,uint256,uint256)", +"c82bb37b": "PotSplit(uint256,address,bool)", +"c82bd265": "ContributionAccepted(address,uint256,uint256)", +"c82c73c1": "isAddressSet(address)", +"c82cd463": "transferFundkeeper(address)", +"c82cd8e6": "ControllerRetired(address)", +"c82d81dd": "GICAToken()", +"c82db402": "ownerSetOraclizeGas(uint256,uint256)", +"c82f2418": "decodeTokenOrderTokenAndIsBuy(uint256)", +"c82f8d9e": "distributeToken(address,address,uint256)", +"c83068eb": "setPre(uint256,uint256,uint256,uint256,uint256)", +"c8306c89": "set_arbits(address,address,uint256)", +"c830b89d": "ReleaseDateChanged(address,uint256)", +"c830c656": "increasePermillage()", +"c83126ed": "generateVoteForDelegationSchemaHash(uint16,address,bytes32,address)", +"c831306e": "icoTimeBonusPhase2End()", +"c831391d": "getPoolOverlapSize()", +"c83261bd": "claimTokenFor(address)", +"c83281e9": "UserAccount(bytes32,bytes32,bytes32,bytes32,bytes32)", +"c832b00d": "limitDateCrowdWeek3()", +"c8335143": "AlekseiZaitcevPrivateSale(uint256,uint256,uint256,address)", +"c8335ba0": "setInitSize(uint256)", +"c833d7b1": "BigbomContributorWhiteList()", +"c834d03d": "verifyTx(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[3])", +"c83507a8": "removeAdv(address)", +"c836292b": "teamMembers(address)", +"c836efcb": "_permitted()", +"c83780a2": "crowdsaleCounter()", +"c838ccb6": "getDelegates()", +"c839008e": "setPixelPropertyContract(address)", +"c8391142": "j1Timeout()", +"c83923c5": "getMetadataChannel(string)", +"c83927a0": "pdo()", +"c8393ba9": "initiateWithdrawal(address,uint256)", +"c8398947": "currentStateActive()", +"c839c0de": "CreateVersion(bytes,string)", +"c83a7e94": "AEToken()", +"c83a9472": "deathData_a11()", +"c83a981c": "openPool(uint8)", +"c83abb40": "registerNotary(address,string,string,string)", +"c83ac557": "ChangeCommunityHolder(address,address)", +"c83be888": "single_move(uint256,uint8,uint8)", +"c83cb16c": "_not(bool)", +"c83ea900": "soldDET(address,uint256,bytes32)", +"c83ec89d": "tradeWithOutputFixed(address,address,address,uint256,uint256)", +"c8401567": "betbucketTwo()", +"c840b187": "goodsNotReceived(uint256)", +"c841df4f": "getMonsterStats(uint256)", +"c8420d2f": "CollectibleIndex5()", +"c8422c2d": "boostrapParty(address,address)", +"c8435ba2": "levelOneTokenNum()", +"c843c0c8": "getMyAlien()", +"c8443fad": "revokeExchanger(address)", +"c8449b65": "Gold()", +"c84640f5": "addtotalCardValue(uint256,uint256)", +"c846690b": "initialiseToken()", +"c847259c": "changeClub(address)", +"c84748f9": "returnFrozenFreeFunds()", +"c848a0bc": "notifySellToken(uint256,address)", +"c848fab7": "SeeleToken(address,address,uint256)", +"c84920cb": "Ubisoft()", +"c84a6140": "BackdoorBurner(uint256,string,uint8,string)", +"c84a8766": "setRegionImageDataCloud(uint256,uint256,uint256,string)", +"c84aba9b": "demurrageBalance(address,address)", +"c84b0555": "token(address,string,string)", +"c84b1ce7": "PUBLIC_RESOLVER_LABEL()", +"c84b470f": "SALE_PERCENTAGE()", +"c84ba84a": "finishedPurchase()", +"c84c009b": "Operated(address)", +"c84c5963": "setPauseCutoffTime(uint256)", +"c84c692a": "isTradableFciInSession()", +"c84c9ef5": "LastName()", +"c84ca867": "getCurrentPriceAttoTokensPerWei()", +"c84cda0f": "setRate(string,uint256)", +"c84d56e0": "setRealmSale(uint256,uint256)", +"c84eb9e5": "invest(address,bytes)", +"c84f5d6f": "RowanCoin()", +"c850029e": "returnTokenOwnership()", +"c85147c5": "mediumCount()", +"c8517b48": "CNDTTokenDeposit()", +"c851b643": "legendsToken()", +"c851ed7c": "startNewVote(uint256,string)", +"c8520131": "Withdrawable()", +"c85234c7": "startPreICOStage3()", +"c8525c09": "unlock(bytes32,bytes32)", +"c853c03d": "newDraw(uint256,uint8[3],uint256,uint256,uint256,uint256)", +"c8544e81": "addGenesisPairs()", +"c854db91": "vault_refund(address)", +"c85501bb": "minThreshold()", +"c855d689": "returnLongAddress(bytes32,uint8,bytes32[2])", +"c855e7bb": "tokenForTeamGranted()", +"c8578967": "setNewChecker(address,address)", +"c857a88c": "createDataRequest(address,address,uint256,uint256)", +"c8582572": "affiliateCommission(address)", +"c8583ad6": "UnregisteredPrefix(string,address)", +"c8583e69": "getEthUsdRate()", +"c858c017": "testMsgSenderInVoters()", +"c859c482": "holdBalanceOf(address)", +"c85aff48": "tokenNAVMicroUSD()", +"c85b7941": "totalEthBankrollReceived()", +"c85bb02a": "isParticipating(uint256,address)", +"c85bb1f7": "_doMapAuto(address,string)", +"c85bc22d": "getDefrostFactor()", +"c85c11eb": "TOKEN_SECOND_PRICE_RATE()", +"c85c75b2": "completeCodeUpdate()", +"c85dba67": "getPrefix(uint32,int256)", +"c85e07b9": "stamp()", +"c85e0be2": "setHost(address)", +"c85e1f73": "totalRecalled()", +"c85ee477": "FileCoinCash()", +"c85f6a80": "emission(address)", +"c85fd4f8": "deployToken(string,string,uint8,string,address,bool,address)", +"c86039da": "redeemedSupply()", +"c8612b2f": "TOKENS_FOR_SALE()", +"c861f243": "_getBonus(uint256)", +"c861f3a0": "houseStake()", +"c8622c24": "claim(address,bytes32)", +"c86283c8": "withdrawTo(uint256,address)", +"c862a134": "feePercent_()", +"c8636bb9": "forbidToken(address[])", +"c8643bc2": "MintOperationEvent(address,uint256,uint256,uint256)", +"c864e760": "recordCommissionEarned(uint256)", +"c865164b": "StakingPriceFeed(address,address,address)", +"c865c29b": "HopiumCoin()", +"c865cadb": "setActiveValueBonus(bool)", +"c86662a3": "addOwner_(address)", +"c86779a4": "lastBlock_v14()", +"c867cccb": "Contribution(address,address,address,address)", +"c867ea63": "GoldConnect()", +"c867fa29": "BookERC20EthV1p1Factory()", +"c86813a8": "PassContractorCreator()", +"c8685f21": "validUsername(string)", +"c868a569": "canBreed(uint40,uint256,uint40,uint256)", +"c8690233": "pubkey(bytes32)", +"c8691b2a": "getHistory(uint256)", +"c8695e59": "RPS(bytes32,address)", +"c86a90fe": "sendCoin(uint256,address)", +"c86a9dea": "isKickoffEnabled(uint256)", +"c86b7001": "randomOrgAPIKey()", +"c86c50f7": "changeAllowInvestment(bool)", +"c86d0251": "_getTeamSupportAmount(uint256,uint256)", +"c86dca5a": "isExploring(uint256)", +"c86e25d7": "tokenCreateContract()", +"c87022d3": "startMonarchyGame(uint256)", +"c8705544": "payAmount()", +"c870ef78": "MINING_POOL_HOLDER()", +"c8713608": "HELIX()", +"c87158fa": "_addBlockProducer(uint256,address)", +"c87235fd": "burnRemaining(address)", +"c872da3c": "KIND()", +"c8738351": "uintFloor(uint256,uint256)", +"c8744434": "lastTransferQueueIndex()", +"c8750d8a": "testHitSoftCapPresale()", +"c8756f12": "getTotalSponsorship()", +"c875b1fb": "distributeBonuses()", +"c875d16f": "ArthurStandardToken(uint256,string,uint8,string)", +"c8765ff2": "rateICO()", +"c87744d9": "_approvedForTransfer(address,address,uint256)", +"c8781368": "freezedMoment()", +"c8788134": "discountedPrice()", +"c878851d": "setCreate(bool)", +"c878dad9": "multiFreeze(address[],bool[])", +"c8796572": "collectFees()", +"c87a31cd": "fillOrder(bytes32,address[5],uint256[6],uint8,bytes32,bytes32)", +"c87b36ed": "disableBetting()", +"c87b56dd": "tokenURI(uint256)", +"c87be1af": "recoverHashSigner(bytes32,bytes)", +"c87c07de": "deprecateMeleeSubtype(uint8)", +"c87cfe63": "setData(uint256[])", +"c87e5613": "setMaxTokenBuyin(uint256)", +"c87e8bd0": "icoRound6()", +"c87f9386": "setAllItemActive(address,address,bool)", +"c8804b7b": "DSC()", +"c88098f2": "setParticipationFee(uint256)", +"c880fab1": "dragonTreasureToken()", +"c8813ffd": "addToVIPList(address[])", +"c881b3c0": "AllowedGasPriceUpdated(uint256)", +"c88215e7": "calculateExcessBalance()", +"c882acc8": "deleteMemberOfGroup(address,uint256)", +"c882ee8c": "testUint(int256,uint256)", +"c882ef92": "GameOpened(uint256)", +"c8830ddf": "ECryptoToken()", +"c883346e": "_getProviderIsForRent(uint256)", +"c8833f56": "setTiersInfo(uint8,uint256[],uint256[],uint256[],uint256[],uint8[2])", +"c883d3fa": "addMappingForPlayerIDs(uint256,uint256,uint256)", +"c88449a1": "_getTransferFeeAmount(address,uint256)", +"c8852b5b": "getBirthCut(uint256)", +"c8857dcd": "setOperateMode()", +"c885bc58": "withdrawReward()", +"c885e92d": "contlength()", +"c8860f41": "getWinningChoice(uint256,uint256)", +"c886594d": "getNodeEnabledStatus(address)", +"c8865c0e": "allocated24Months()", +"c886ec0d": "getTreasureProbabilityType(bytes32)", +"c888fafd": "bankerDepositPer()", +"c888fcc3": "getPollResult(uint256)", +"c8894a0c": "WMToken(address,uint256)", +"c88961da": "createKingdom(string,address,address,address)", +"c88996d6": "MessageCallTransaction(bytes,uint256,uint256,address,uint256,uint8,uint256,uint256)", +"c889e0de": "finishAirdropBy0Eth()", +"c88b675b": "setMaxAvailableSpot(uint256)", +"c88b77e0": "grantTeamAdvisorToken(address)", +"c88b7c8e": "setConversionFee(uint256)", +"c88bf75a": "applyRaises(uint256[])", +"c88c5101": "investor_bonus()", +"c88cc6ac": "getCertification(address)", +"c88e662e": "externalSales(address,uint256)", +"c88fd3ec": "changeIcoRate(uint256)", +"c88fe1fa": "maxCapMintTransfer()", +"c890635a": "ownerSale(address,uint256)", +"c890f27e": "GenChipByWeight(uint256,uint8,uint256[])", +"c891a29d": "setEpochData(uint256,uint256,uint256,uint256[],uint256,uint256)", +"c8922057": "MAXUM_SUPPLY()", +"c89231b3": "mintForInvestor(address,uint256,uint256)", +"c892693b": "setMotAddress(address)", +"c892cfdf": "amountRised()", +"c8931355": "setONTExchangeRate(uint256)", +"c893ae0b": "ptToPtwo()", +"c894e1e5": "setTransferFeeRate(uint256)", +"c895304b": "newDaoRulesProposal(uint256,uint256,uint256,uint256,uint256,bool,address,uint256,uint256)", +"c89547f9": "adminSetTxFeeInviteGame(uint256)", +"c89550a8": "BMICoin(address,address)", +"c89605a2": "DEALERWIN()", +"c8961644": "unBan(address)", +"c89924da": "totalTokensForSaleDuringICO2()", +"c8997121": "forwardFunds(uint256)", +"c899fa77": "hodlerTotalValue3M()", +"c89a32ab": "releaseTargetToken(uint256)", +"c89acc86": "send(address,bytes)", +"c89b50c7": "credit(address[],uint256[])", +"c89b7d8c": "buyCommonTTWByETH(uint256,address)", +"c89b989e": "lckTokenAddress()", +"c89baff5": "GoldenGate()", +"c89cea99": "getMyAnts()", +"c89d6063": "claim(bytes32,uint256,address,uint8,bytes32,bytes32,bytes32[])", +"c89dcfce": "mint(address,bytes32,uint256)", +"c89e4361": "delegate()", +"c89e528e": "receiveCreateAuctionFromArray(address,address,uint256[],uint256,uint256)", +"c89ec68a": "startRecovery(address,address)", +"c89f2ce4": "funds()", +"c89f51ef": "createPromoRabbit(uint256,address)", +"c89f8f08": "testGetController()", +"c89faa72": "confirmTransferItem(address,address,string)", +"c89fb5f0": "ethunpause()", +"c89fcf58": "setNoviceDungeonId(uint256)", +"c8a1becb": "_monthToNumber(string)", +"c8a1e1c7": "sendInternally(address,uint256)", +"c8a2c880": "setCallStack(uint256,uint256)", +"c8a2cc03": "strikersMetadata()", +"c8a2e0bc": "addCustomerReqACC(address,address,address,address)", +"c8a3af72": "is111bit(uint256)", +"c8a45c44": "tokenMaturityPeriod()", +"c8a48d71": "removeStep(bytes16)", +"c8a4ac9c": "mul(uint256,uint256)", +"c8a4c767": "kickCommitteeVote(address)", +"c8a4ddc3": "resetBatches(address,address)", +"c8a4e001": "EarlyPurchaseAmended(uint256)", +"c8a59bb6": "GrTokenTest()", +"c8a5e6d7": "transferFundAndEndGame()", +"c8a635b7": "setWeiRate(uint256)", +"c8a6dab7": "test_tokenFreeze()", +"c8a71e14": "bonusCalculationFactor()", +"c8a73eca": "transferOpen()", +"c8a7432f": "getPreIcoPurchase(address)", +"c8a76494": "Bet()", +"c8a7836e": "getFINMigrationRecord(address)", +"c8a808d6": "avatar(address,address,uint256,uint256,bytes)", +"c8a814b8": "firstSend(bytes32)", +"c8a830ba": "max(uint256)", +"c8a83384": "allowBurns()", +"c8a8ac2e": "submit(uint256,bytes32,bytes32,bytes32)", +"c8a90f76": "handlePresaleToken(address,uint256)", +"c8a9e841": "addCustomerFromKYC(address)", +"c8aafbc3": "NodeHash()", +"c8ac7014": "updateMerchantByAdmin(address,string,string)", +"c8ad27e6": "finishPre()", +"c8ad9645": "InactivityHolderResetBalance(address)", +"c8aded5d": "setDiscounts(uint256[],uint256[])", +"c8ae8774": "_startMegabox(uint256)", +"c8aef513": "preSendTTC()", +"c8aeff39": "isMarket()", +"c8af1538": "fallbackPayout()", +"c8af46b4": "canAnyoneBurn()", +"c8b08125": "tokensRemaining()", +"c8b0e68d": "getCEO()", +"c8b18b5b": "oneMonth()", +"c8b19fa8": "ioxToken()", +"c8b1a635": "pricePerCoin()", +"c8b21f18": "distributionuserFinished()", +"c8b26773": "startEnrollment()", +"c8b2ccba": "addStrand(uint256,address,bytes32,string)", +"c8b32089": "TokenLiquidityMarket(address,uint256,uint256,uint256)", +"c8b342ab": "getBid(address)", +"c8b35c7a": "BANANA()", +"c8b39eb5": "setEdCoreContract(address)", +"c8b413ad": "initialize(address[5],address,uint256[12],uint256,bytes)", +"c8b43c10": "isPausedCrowdsale()", +"c8b4c5b8": "MarketToken(uint256,uint256)", +"c8b4eb6e": "withdrawPresale(address)", +"c8b52bfb": "ChangeCost(uint256,uint256)", +"c8b56bda": "unregister_contract(bytes32)", +"c8b5da66": "pressButton()", +"c8b6a463": "ASUT()", +"c8b70559": "_endContestIfNeeded()", +"c8b7c3ee": "MITCoin()", +"c8b7e8c3": "testMakeBet()", +"c8b82220": "registerNameIP(string,string)", +"c8b91531": "MINOR_VERSION()", +"c8bb32e0": "updatePosition()", +"c8bb73ef": "testGetBitsFailIndexOOB()", +"c8bb7d51": "unitRareGrowth()", +"c8bc2452": "LuJiaZuiToken()", +"c8bc429a": "removeDividendPathway(address,uint256)", +"c8bc6fa0": "maxCapEth()", +"c8bd14ef": "totalInvSupply()", +"c8bd1d13": "VERIME(address)", +"c8bd3782": "OsherCurrentICOPrice()", +"c8bdbfb6": "withdrawUnsoldTokens()", +"c8bdc0c7": "RevokeDOT(bytes32,bytes)", +"c8bf3388": "totalIRCAllocated()", +"c8bffa93": "tier1End()", +"c8c01a55": "request(address,uint256)", +"c8c08a89": "_isOfficialApps(address)", +"c8c0b288": "bountyFundManager()", +"c8c0cbbb": "setLockedAccountThresholdUsd(uint256)", +"c8c1a400": "infoAboveSpot()", +"c8c21594": "releaseByStage(address)", +"c8c2ed54": "tokenAssignmentControl()", +"c8c2fe6c": "acceptManagement()", +"c8c365fc": "nowday()", +"c8c388eb": "RegBase(address,bytes32,address)", +"c8c3b926": "changeDragoDao(address)", +"c8c5139d": "setUserDisplay(address,string)", +"c8c67ca1": "transferValuebyAddr(address)", +"c8c719d2": "MangachainToken(address,address,address,address,address)", +"c8c72bb4": "TEAM_RESERVE_FTX()", +"c8c749ec": "preTgeManager()", +"c8c75647": "setVerified(address)", +"c8c79643": "addBurningMan(address,uint256)", +"c8c89fa5": "secretBids(address)", +"c8c9b1f8": "shouldVerifySegment(uint256,uint256[2],uint256,bytes32,uint64)", +"c8c9d745": "userLookup(uint256)", +"c8ca645f": "getName(string,string,address)", +"c8cada78": "oraclize_query(uint256,string,bytes[2])", +"c8cb60bb": "cancelBid(bytes32,uint8,int32,bool)", +"c8cb7d04": "Kristina()", +"c8cb8677": "WithdrawMyTokens()", +"c8cb8a75": "setCreator(address,uint256)", +"c8cb985a": "callDividend()", +"c8cc5cd8": "distributeYield(uint256)", +"c8cc9cc2": "getElement(address)", +"c8ccaebc": "extendedTimeLock()", +"c8cd09ae": "TransferredPreBuyersReward(address,uint256)", +"c8cd65e5": "processDeposit(address,uint256)", +"c8cddd61": "test_validShouldBe3_increaseTimeBy30000()", +"c8ce122b": "checkJackpot(address)", +"c8ce2fec": "lifetimeDeposits()", +"c8ce30b0": "blocksForWei(uint256)", +"c8ceaa95": "mint(bytes32,int256,address,uint256)", +"c8ceae12": "tavernContract()", +"c8cf4722": "getRequestsLength()", +"c8cf67a1": "buySmartSpeed()", +"c8cfb032": "getPlayerByAddr(address)", +"c8cfd490": "UNLOCK_TEAM()", +"c8cfe153": "revealVote(uint8,string)", +"c8d0ec0a": "reduceAllowance(address,address,uint256)", +"c8d172d6": "getTokenInfoNonce()", +"c8d1c017": "addUIntValue(bytes32,uint256)", +"c8d1cf4a": "tokenPriceForMainICO()", +"c8d3db82": "getPresaleMaxValue()", +"c8d47f16": "replaceLogic(address)", +"c8d4b389": "approveAndCallPreSigned(bytes,address,uint256,bytes,uint256,uint256)", +"c8d508fa": "test_insert_findNoHintUpdateTail(int256)", +"c8d50d7c": "nextBackWindowAdjustmentRatio()", +"c8d52ee3": "refundTransfer(address,uint256)", +"c8d61985": "setCryptoAgent(address)", +"c8d689b1": "addAllowedLock(uint256)", +"c8d840fa": "EventEmergencyContinue()", +"c8d86e35": "bullToken()", +"c8d88829": "oslikiFoundation()", +"c8d8cf88": "appIndex()", +"c8d942b5": "Travelerscoin()", +"c8d9c042": "AuctionCreated(uint256,uint256,uint256,uint256,bool)", +"c8d9ebc4": "getTomato(uint8)", +"c8db6a42": "functionCalling(address)", +"c8db6af9": "getCompte_14()", +"c8dc60ca": "vehiclesByCity(bytes32)", +"c8dc7e19": "setReconciliationDate(uint256)", +"c8dd64ea": "daVinciAddress()", +"c8dd6ce7": "getPlayerDetails(address)", +"c8dda301": "VOTING_START_BLOCKNR()", +"c8dda71c": "HistoryUpdated(string,uint256[])", +"c8ddf66f": "MMChainToken()", +"c8df5da0": "BOSHICoin()", +"c8e0f101": "userPlay()", +"c8e11521": "TripBitToken()", +"c8e13bb4": "fit()", +"c8e1fe3f": "getCountriesOfCampaign(bytes32)", +"c8e2190d": "_cancelOperation(bytes32,address)", +"c8e2fca0": "use(address,address,uint256,uint256,uint256,uint256,uint256,string)", +"c8e32074": "returnFrom(address,uint256)", +"c8e49707": "activateExportFee(address)", +"c8e4acef": "playerByAddress(address)", +"c8e55708": "oraclize_query(string,string[1])", +"c8e566c6": "betInputToBytes(uint40,uint40,uint40,uint40,uint40)", +"c8e569a8": "stopICO()", +"c8e56acb": "FAPFundDeposit1()", +"c8e5f54f": "ArcanaToken()", +"c8e626f8": "checkDivsBalance()", +"c8e6b2a8": "logTimestampSet(uint256)", +"c8e6ba4d": "verifyTx(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[])", +"c8e6c7d9": "imin(int256,int256)", +"c8e706e2": "contractWallet()", +"c8e71424": "MotherDNAShare()", +"c8e788c1": "RELEASE_EPOCH()", +"c8e7ca2e": "getMsgData()", +"c8e7e5ef": "TOTAL_NUM_TOKENS()", +"c8e8ce63": "outsourceConfirmNode(uint256)", +"c8e8d6d6": "TheTokenE()", +"c8e8f487": "missedVerificationSlash(uint256,uint256,uint256)", +"c8e9fc8b": "testgas()", +"c8ea0cfa": "CoinmakeToken()", +"c8ea1f7f": "updateEntity(uint256,bytes32,uint256,bytes32,uint256)", +"c8ea429e": "closeCdp(uint256,uint256,uint256)", +"c8eab537": "randomJackpot(uint32,bytes32,uint32)", +"c8eaf28f": "addWhitelists(address[])", +"c8eb747a": "B42Token()", +"c8ec2eb8": "MUBEX()", +"c8ec57ed": "revokeConfirm(bytes32)", +"c8ed6253": "ManagedToken()", +"c8ede712": "makersAverageRating(address)", +"c8edf65e": "GetAndReduceFeesByFraction(uint256)", +"c8ee0c6b": "withdrawBySubscription(address,uint256,bytes32,string)", +"c8ee2da8": "setReputationIRNNodeShare(uint256)", +"c8ef8b00": "window2TotalSupply()", +"c8efd7af": "getResolverFee()", +"c8f07770": "funcThatReverts()", +"c8f09634": "visaOfferingsLength(uint256)", +"c8f099cb": "upgradeEvilMorty(address,address)", +"c8f0d741": "AlienFarmer()", +"c8f21d22": "TagadaTsoinTsoinCoin()", +"c8f2835f": "transferBack(address,uint256)", +"c8f288ad": "getPoo(uint256)", +"c8f3a9e1": "getLastRollOutput(address)", +"c8f3e5f0": "getParameterByTitle(bytes32)", +"c8f41706": "pausePhase()", +"c8f478e1": "SetChangePlatformFlag(bool)", +"c8f490c8": "numOfBalloonsTypes()", +"c8f5c3f9": "LNCHSale(uint256,uint128,uint256,uint256,uint128,string,uint128,string,uint128,string,uint128,string,uint128,string)", +"c8f5d8b0": "total_coins()", +"c8f803f8": "setUnitJadeStealingMultiplier(address,address,uint256,uint256,bool)", +"c8f87d36": "_register(uint256,address)", +"c8f88076": "emissionMasOneType(address[],uint256[],bytes32[],uint256)", +"c8f8d75d": "Config(uint8,address)", +"c8f98db8": "getWinningFaction()", +"c8fbbdda": "getGPSStartTime()", +"c8fca35e": "getBidHash(uint256,uint256,address,address,uint256,uint256)", +"c8fd39f7": "GetEthShop()", +"c8fd6ed0": "unstake(uint256,bytes)", +"c8fdc891": "numberOfMonarchs()", +"c8fddb80": "updateLemonCoinsRemainingToDrop()", +"c8fdf67d": "holdTransaction(uint256,uint256,uint256)", +"c8fe2065": "getSingleBetItemCount(uint256)", +"c8fea2fb": "collect(address,address,uint256)", +"c8fed3f6": "withdrawCashReserveFund()", +"c8ff80a1": "setMonsterClass(uint32,uint256,uint256,bool)", +"c9000726": "nextStep()", +"c90109fa": "removeSomeCWCsFrom(address,uint256)", +"c90189e4": "fechAllVoteResultPreStageByBlock(uint256)", +"c902c3ae": "bets(bytes32)", +"c902d1b6": "_checkClientSign(address,bytes32,bytes)", +"c902ee36": "tokensAvailable(address)", +"c9030ea0": "addMember(address,bool)", +"c904a2ee": "minAllowedReservingPercentage()", +"c906a5aa": "testDeleteVoter()", +"c906baa3": "GACFund()", +"c906c873": "limitCrowdsale()", +"c906cd68": "ForceCoinTransfer(address,address,uint256)", +"c90755e2": "secretaryGeneral()", +"c90763f0": "subAllocation(address)", +"c9079673": "last_payment_timestamp()", +"c90797ea": "suicideContract(address)", +"c907d53b": "getTakeOwnershipFee(uint256)", +"c9085820": "set_owner(bytes12,address)", +"c908f302": "searchPursesByAddress(address)", +"c9090c7f": "levelFourTokenNum()", +"c9099385": "addApplication(string,string,string,string)", +"c909b929": "closingTimePeriodTwo()", +"c90a6a8e": "MAIN_SALE_BONUS_PERCENTAGE_PHASE4()", +"c90aef26": "Fetch_Game_Board_Vitualization(uint32)", +"c90c205b": "CLAIM_AMOUNT_ETH()", +"c90c589a": "OAR()", +"c90c83a8": "scheduleCall(address,uint256,uint256,uint256,uint256)", +"c90c949b": "checkForBonuses(uint256,uint256)", +"c90cfb0b": "newFact(string,string)", +"c90d080a": "registerEvent(bytes)", +"c90d1431": "MYLASTTOKEN()", +"c90d2cd9": "createBallot(uint256,address,string,string)", +"c90de215": "ClockAuction(address,address,uint256,uint256)", +"c90f34f0": "Bitstarti(uint256,string,string)", +"c90f793e": "currentAgreement()", +"c90fc8ee": "allTotalSupply()", +"c90fda80": "countRC(address)", +"c9100bcb": "getClaim(bytes32)", +"c9101f6c": "increaseApproval(uint256,address,uint256)", +"c9102029": "_getTokens()", +"c9116b69": "myBalance()", +"c9116e4a": "yearThreeClaimed()", +"c911b56e": "isController(address,address)", +"c913b552": "getVersions(bytes)", +"c913f364": "addMoonPrizePool(uint256,uint256)", +"c914ef54": "SetAllow(address)", +"c91540f6": "getCurrentCompetitionValues(string)", +"c915fc93": "proposeUpgrade(address)", +"c91610cd": "transferDelegator(address)", +"c91752b2": "girlIdToAuction(uint256)", +"c91813ca": "testToBool(bytes)", +"c919992d": "changeBrokerImp(address)", +"c91b0149": "setWhitelister(address,bool)", +"c91b46c6": "claimHero()", +"c91bc856": "withdrawCAT()", +"c91c6fa5": "completeSupply()", +"c91ca6c7": "calculatePeerTokens()", +"c91cd9d0": "minimumNumber()", +"c91d7e9c": "getFee(bytes32[])", +"c91d956c": "setMinBalance(uint256)", +"c91e4cc8": "getItemsByTypeAndOwner(string,address)", +"c91e5ad6": "DatingTokenTest()", +"c91fc619": "getTotalOut(address)", +"c92015f6": "getAccountUnlockTime(address)", +"c9206ddf": "setSalvageable(address,bool)", +"c9219a7a": "verifyProof(uint256[2],uint256[2][2],uint256[2],uint256[8])", +"c921f647": "GiftSend(uint256,address,address,bytes32,string,bytes16,uint8,bytes24,uint16,uint16,uint256)", +"c92261b5": "set(bytes32,int256)", +"c922f446": "emergencyWd()", +"c9230c5d": "assetName()", +"c923c870": "getsysdayruns()", +"c9247058": "MasternodeRewardAddedToRewardPool(uint256)", +"c924c524": "secondSend(bytes32)", +"c924d441": "EnableTokenWithdrawals()", +"c92501b7": "setStopTime(uint256)", +"c926435c": "bonusInfo()", +"c926aae6": "kscSell(address,address,uint256,string)", +"c9270652": "returnLoanLength(uint256)", +"c92728a1": "_ballotIdToNamespace(uint256)", +"c9295bc6": "getOrgInfo(address)", +"c9296d14": "scheduleTransaction(address,uint256,uint256,uint256,bytes)", +"c929bdac": "notaioAccounts(address)", +"c929ccf3": "setTokenId(uint256)", +"c929d55e": "overrideTokenHolders(address[],uint256[])", +"c92a1ad8": "bonusPriceDeltaPerHour()", +"c92a1e26": "setting(bytes)", +"c92aecc4": "chi()", +"c92ba8b2": "add(address,uint32,uint128,uint128)", +"c92babd1": "SITMock(address)", +"c92cd4d3": "getNewTokenBalanceOf(address)", +"c92d2385": "transferPreSignedHashingWithPrefix(address,address,uint256,uint256,uint256,uint256)", +"c92d3ea9": "Amazon()", +"c92db04d": "VanMinhCoin(uint256,string,uint8,string)", +"c92e365f": "placeBid(address,uint256,uint256,uint256,bytes,int256)", +"c92f068c": "updateHpbNodeBatch(address[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[],bytes32[])", +"c92f3a0c": "GameICO()", +"c92f8954": "withdraw(address,uint256[3])", +"c932c71e": "USDsToken()", +"c932ca62": "setBuildersAddress(address)", +"c9330bfb": "ethToTokenConversion()", +"c9334051": "decodeAssets(bytes32[])", +"c9335f58": "worldwidegiftcode()", +"c9351571": "WorldCupToken()", +"c93685b8": "getQuorumPercent()", +"c937b0a9": "platinum()", +"c937da12": "addToPublicWhitelist(address)", +"c937e091": "SearchUserID(string)", +"c9380d3e": "DeciserToken()", +"c938acc8": "checkExistsOwnedPet(uint64)", +"c9393c62": "NewState(uint8)", +"c939625b": "LuckCashCrowdsale(uint256,uint256,uint256,address,address)", +"c939fd50": "remainingIssuableNomins(address)", +"c93a6c84": "setDefaultFee(uint256)", +"c93aac88": "setReleasingSchedule(address)", +"c93ab4c3": "checkTreesWatered(uint256[])", +"c93b9755": "mintAgents(int256,address)", +"c93c266e": "updateWalletAddress(address)", +"c93ce90f": "chefOwnerWithdrawal()", +"c93ceec8": "collectDividends(address)", +"c93cff84": "test_validContractBalance()", +"c93dd31a": "Blammascoin()", +"c93e253d": "balanceOfBasic(address)", +"c93e718b": "removeAddressesFromOperators(address[])", +"c93e8862": "_checkCap(address)", +"c93e8b15": "getActiveBuyOrders(uint256)", +"c9406e86": "crowdsaleEnds()", +"c940c1b7": "addCustomerHash(bytes32,bytes32)", +"c9410b76": "ClockAuction(address,uint256)", +"c942940c": "Sukaya()", +"c944a38e": "CharlyLifeLog(string,int256)", +"c9456530": "isRespectTimeFrame()", +"c945b53f": "lottoIdentifier()", +"c946f3af": "Standard_3()", +"c94727f0": "getWinChoice(uint256,uint256)", +"c947db81": "earlyWithdrawalFeePct()", +"c9498266": "hash_passcode(bytes32)", +"c949ba9b": "TokenBase()", +"c949c0c9": "_houseOf(address)", +"c94a18ba": "kpyGoalReached()", +"c94a5841": "BITVesting()", +"c94b0ac1": "CryptoTwitch()", +"c94b56e3": "isMinCapReached()", +"c94b5c3d": "cabbageToken()", +"c94bfdb1": "setTokenDescription(address,uint256,string)", +"c94c6787": "specialSend(uint256,address)", +"c94c79dd": "EtherTots()", +"c94d0eee": "oddEven(uint256,address)", +"c94d9caf": "createTxEth(address,uint256)", +"c94dc71e": "Satochi()", +"c94e643c": "grantTokens(address,uint256)", +"c94e6567": "fetchBlocks(address)", +"c94e7b5c": "icoTokenSupply()", +"c94f2d69": "ILOTContract()", +"c94f7983": "StillToGo(uint256)", +"c94fbd4b": "Reek()", +"c9507465": "useraddinverst(uint256)", +"c9511b59": "setAddressToken(address,address)", +"c95292c4": "EthlanceDB()", +"c95320db": "migrationPhase()", +"c9537838": "getExpectedBalance(address)", +"c954d4fa": "blendbacktest(uint32[],bytes32[],bytes32[],uint64[])", +"c9553010": "testDistributing()", +"c955457e": "getRandomArbiter()", +"c955b514": "addCancelled(bytes32,uint256)", +"c955bde2": "getExpirationRequest(bytes32)", +"c9567bf9": "openTrading()", +"c956d497": "helpWithdrawal(address)", +"c956db57": "WOLF3()", +"c957012e": "caps(bytes32)", +"c9580804": "setAccessManager(address)", +"c9584008": "registerTicker(address,string,string,bytes32)", +"c959467b": "setInterestDB(address,uint256)", +"c959ec57": "GetRocketStock(uint16)", +"c95acadd": "ethAuction()", +"c95ae083": "isMethodAllowed(bytes4)", +"c95bd3aa": "closePreSignedHashing(address,bytes32)", +"c95c0efd": "setBonusUnlockAt(uint256)", +"c95c0f7b": "getTransactionIds(uint256)", +"c95c1036": "calculateStakeAmountWithBonuses(uint256,address,uint256)", +"c95c16af": "imported(address)", +"c95c67dc": "ADVISORS_SUPPLY_LIMIT()", +"c95c9a83": "ThinkCoin(uint256)", +"c95d8e40": "clientSign()", +"c95e0909": "resetPlayer(address)", +"c95e81cb": "MyBet(uint8,address)", +"c95f79ba": "closeLeaderboard(uint16)", +"c95f8b91": "TransferFunds(address,uint256)", +"c95f95bb": "ComputedGainsRate(address,uint256)", +"c96027b3": "ethpaused()", +"c9613733": "startNextEra(bytes32,uint256,int256,uint256,int256,uint256,int256)", +"c961df66": "contract_period()", +"c9620770": "doVote(address,uint256,uint256)", +"c96266e8": "getDragonFight(uint256)", +"c96304e8": "balancesAddressDescriptionUpdate(string)", +"c9634f32": "randomContestant(uint256,uint256)", +"c9644b77": "retireAxie(uint256,bool)", +"c96492c4": "SspManagerContract(address,address)", +"c964e493": "getSpaceship(uint256)", +"c9651729": "firstLineWrong()", +"c9653bea": "MainExchange()", +"c96593a0": "The10ETHPyramid()", +"c965e1d3": "constructAPIParam()", +"c965ed7b": "OwnerReward()", +"c9660d07": "ownerSetEdgeRangeAndPayout(uint256,uint256,uint256)", +"c966865e": "notRandom(uint256)", +"c9679537": "HafizToken()", +"c968907f": "grantVestedTokens(address,uint256,uint256,uint256,uint256,uint256,bool)", +"c968aab3": "makeUntradable(uint8)", +"c968ac68": "getWin(uint64)", +"c9693411": "deliverPresaleFuelBalances(address[],uint256[])", +"c96adb01": "getUserBet(address)", +"c96c54a7": "airdrop(address[],uint256,uint8)", +"c96c8a1d": "ownerListMap(uint256)", +"c96cd46f": "suicide()", +"c96cea70": "updateUsername(string)", +"c96d2dfa": "getStateAndProof(bytes,uint256)", +"c96e5627": "numRegistered()", +"c96e785f": "setWhitelisted(address,address)", +"c96e83db": "firstContributorId()", +"c96e8fee": "Bury(address,uint256)", +"c96f3238": "getWithdrawAmount(uint256,uint256)", +"c96f5041": "addHash(string,uint256)", +"c971442c": "getDBs()", +"c971aade": "FINALSTSTEST()", +"c971b12b": "_onRandom(uint256,bytes32)", +"c9734ebd": "WatchLastPayout()", +"c97358df": "GGPCToken()", +"c973851d": "kMaxStake()", +"c97399d0": "_isOwner(address,uint256)", +"c973c2e3": "collectorAddress()", +"c9744029": "getPremium()", +"c974631b": "platformWithdrawalProposed()", +"c974947d": "unlockAddress(address[])", +"c975653d": "StartCity()", +"c9762f8f": "TooBigPriceDiff(uint256,uint256)", +"c976b4f9": "slowDump()", +"c976bbbb": "_compare(int256,bytes2,int256)", +"c976ce9c": "privateSaleLimit()", +"c977a7a7": "setUsdToEtherExchangeRate(uint256)", +"c9788631": "beneficiaryWallet()", +"c978a7bc": "inviteRate()", +"c978c45d": "setNewMessage2(string)", +"c978ee59": "fourthStageMintingDate()", +"c979113c": "nextStageEmission()", +"c9791e0d": "confirmBobIndirectPay(uint256)", +"c97a06ce": "isHardcapReached()", +"c97aae82": "NulsStandardToken(uint256,string,uint8,string)", +"c97ab7ca": "isICOClosed()", +"c97b5278": "XYZSecurities()", +"c97b6d1f": "updateBatch(int128[],uint128[],uint8[],bytes32[],bytes32[],bool)", +"c97be180": "lock(address,uint256,uint256,uint256)", +"c97c1505": "readRate(string)", +"c97c6353": "testHello()", +"c97ca645": "updateWeiPerWholeToken(uint256)", +"c97cc71e": "getTransferRawAddress(bytes)", +"c97cef81": "Shelter(string,string)", +"c97dc17b": "DatareumToken()", +"c97e8480": "delegatedTransfer(address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"c97ec033": "changeOverERC228(address,address,uint256,address)", +"c97f8363": "setBonusAddress(address)", +"c9801b50": "f_public()", +"c98031be": "hintURL(int256,bytes32,string)", +"c980c626": "setImage(uint256,string)", +"c98165b6": "createTarget()", +"c98166c0": "ethAmount()", +"c9818728": "candyCap()", +"c9819d1e": "GuardaRegistro(bytes32)", +"c982e353": "getCurrentPrice(uint256,uint8)", +"c9838930": "setReferralTokenContract(address)", +"c985c221": "get_all_levels()", +"c986cf7c": "defrostAdvisorsTokens()", +"c987a78a": "AISI()", +"c987c5a1": "userAdd(address)", +"c988d70f": "getDailyWithdrawLimit()", +"c9891384": "PendinglinesToLines()", +"c9894b5c": "taxValue()", +"c98a79fb": "getBallotLogN(address)", +"c98b7027": "bgb_per_Keos()", +"c98bd7da": "isWinner(uint256,uint256)", +"c98bdd2f": "year5LockAddress()", +"c98c3083": "OutcomeToken()", +"c98c6e08": "payAmountForLoanAtIndex(uint256,uint256)", +"c98cf6e3": "COBToken()", +"c98d3457": "alliance(address,address)", +"c98d9b83": "getTokensContractAddress()", +"c98e4149": "setKingdomFactory(address)", +"c98f0ad9": "getUnlockedBalanceLimit(address)", +"c98fc4d9": "adminSetConfig(address,address,address)", +"c98fefed": "convertFor(address[],uint256,uint256,address)", +"c99051dc": "getWildcardsRemaining(uint16)", +"c9912255": "gago()", +"c99252d3": "joinGame(uint256,uint8,uint8)", +"c99380c9": "getAttoTokensBoughtInICO()", +"c9940c31": "getPoolCandidateContract(uint256)", +"c994fe31": "setCompanyManager(address)", +"c995623e": "revealMove(bytes32,uint256)", +"c9956b05": "FMCToken()", +"c99749a8": "prepareWithdrawProposalGivenSplitProposalId()", +"c997c1e2": "mul18(uint256,uint256)", +"c99842f9": "startPreIco(uint256,uint256,uint256)", +"c998e9dd": "changeUserKeyFromRecovery(address)", +"c9991176": "addAdministrator(address)", +"c99a975d": "optInFcnMinGas()", +"c99ae8a7": "setFechaTax(uint256)", +"c99b1f28": "icoWeek4Bonus()", +"c99b27ad": "updateFirstWallet(address)", +"c99c3c62": "getCarProductCount()", +"c99d89fc": "PriceOneEnable()", +"c99d9ef7": "startIcoDate()", +"c99db1ba": "_calculateLockedPercentage(uint8)", +"c99dccf9": "getInvestor(uint256)", +"c99f3357": "DRAIN_DELAY()", +"c99ff644": "dilute(uint256)", +"c9a04e55": "getDailyEthProfit(address)", +"c9a0e252": "ICOParticipants(address)", +"c9a1d88b": "placeBet(uint16,uint16,bool)", +"c9a2ab19": "aragonDevMultisig()", +"c9a30482": "BurnableCrowdsaleToken(string,string,uint256)", +"c9a365a7": "foundationlock()", +"c9a3f228": "SCLCrowdsale(address,address,address,uint256)", +"c9a43b2b": "m_software(uint256)", +"c9a4faa6": "AdexContract(address,address,address,uint256,uint256,uint256)", +"c9a5003c": "lastHello()", +"c9a52d2c": "setBytesValue(bytes32,bytes)", +"c9a56efd": "getBetterBettingInfo2(address)", +"c9a6964a": "initializeOwnable(address)", +"c9a6b2a8": "addAuction(uint256,uint256,uint256,uint256,address)", +"c9a6e480": "tokenSupplyFromCheck()", +"c9a75d90": "setPI_edit_20(string)", +"c9a7623a": "buyingPrice(bool)", +"c9a77e3d": "totaleMsg()", +"c9a815bd": "setSpendingLimit(address,uint256)", +"c9a82aa8": "markCrowdsaleEnding()", +"c9a8baae": "myFirstLoop()", +"c9a99f19": "subscribeCaller(address,address,uint256,address,uint256)", +"c9aa013b": "Start5()", +"c9aa4cf8": "testHasTokens()", +"c9aa71b8": "getFlyingUnicorns(bytes32,uint64)", +"c9ab521f": "AddBook(uint256,string,address)", +"c9ac836d": "transferPet(address,address,uint64)", +"c9acab84": "left59(uint256)", +"c9ad51b5": "TOKEN_AMOUNT_ICO_STAGE1_PRE_SALE3()", +"c9ae5594": "countHand(uint8[])", +"c9af089f": "getOrCreateChildUniverse(bytes32)", +"c9af2418": "checkUp(address,bytes32)", +"c9b06a4b": "AECloudToken()", +"c9b0d97b": "canCollect()", +"c9b0eef4": "oracleItQuery(uint256,string,string,string,uint256,uint256)", +"c9b110cb": "getAmountOfWithdrawals(address,address)", +"c9b1a517": "Show_Doctor(uint256)", +"c9b1b2ae": "etherKing(uint256)", +"c9b25f0f": "transferEther()", +"c9b2a580": "UTTotalSupply()", +"c9b2e522": "getSymbol(address)", +"c9b31d4b": "getCurrentSecret()", +"c9b3e736": "getTokenSellPrice()", +"c9b44821": "FIRETRADES()", +"c9b46bbb": "test0_adding()", +"c9b4cb94": "BIBToken(uint256,string,uint8,string)", +"c9b4ddb2": "receiveLockedAmount(address,uint256)", +"c9b5757e": "refundBet(uint256,uint8)", +"c9b5e555": "founderAddr()", +"c9b67627": "NonActivationWithdrawal(address[2],uint256[8],uint8,bytes32[2],uint256)", +"c9b7ab8b": "getPostLink(uint256)", +"c9b8020d": "starbaseToken()", +"c9b86d43": "manualState()", +"c9b94eb9": "liabilityFinalized(uint256)", +"c9ba0d4d": "r9kAddress()", +"c9ba32f4": "COPPER_AMOUNT_NDC()", +"c9ba73a3": "getmypost(uint256)", +"c9ba93be": "getIndexFromAddress(uint256,address)", +"c9bba27b": "manualEmissionEnabled()", +"c9bbc8c0": "donkeyName(address)", +"c9bc0883": "transferFromForcibly(address,address,uint256)", +"c9bc2bf5": "updateSnipCoinToEtherExchangeRate(uint256)", +"c9bc5dbd": "requestCeilingRaise(uint256)", +"c9bd2893": "fines()", +"c9bebd90": "ownerAlias()", +"c9c08bb7": "tickerAddress()", +"c9c09ac8": "denyBundlingMultitoken(uint256)", +"c9c0c77a": "deposit(uint16)", +"c9c0f25e": "getAllWorkers()", +"c9c1db4a": "launchFund(uint256)", +"c9c1ed93": "testControlRegisterContractIdAgain()", +"c9c1eded": "EPYCOIN()", +"c9c22deb": "getStarDistanceInLyThousandths(uint8)", +"c9c286c6": "getUnitRafflePlayers(uint256)", +"c9c347b9": "EthereumOneToken(string,uint8,string)", +"c9c4405b": "CariNetPrivilege(uint256,string,string)", +"c9c447e0": "getGamePrize(address,uint256)", +"c9c4797d": "ParticipantAuthority()", +"c9c51578": "buyBronze(uint256,uint256,uint8,bytes32,bytes32)", +"c9c53232": "totalStakedAt(uint256)", +"c9c538aa": "to_binary(uint256)", +"c9c5b5b4": "migrate(string)", +"c9c6176c": "BidSubmission(address,uint256,uint256)", +"c9c666aa": "changeCardboardUnicornTokenAddress(address)", +"c9c798b3": "addToFreelancerAvgRating(address,address,uint8)", +"c9c7cb74": "_burnTokens(address,uint256)", +"c9c7ef25": "withdrawtime()", +"c9c80a56": "adminshipLevel(address,uint8)", +"c9c8580c": "makeOffer(uint256,bytes32,uint256,address,uint256,uint256,address,address,uint256)", +"c9c85ec6": "currentGameCost()", +"c9c8ffd2": "test_increaseBlockNumber30211()", +"c9c92c12": "transferWineFromVineyardCellar()", +"c9c92dc5": "getProposal(bytes32,string)", +"c9ca080d": "Indecoin()", +"c9cb0043": "supportTokenAmount()", +"c9cb0e9b": "emitNewSmartToken(address)", +"c9cb6f47": "distributeDifferentAmountOfTokens(address[],uint256[])", +"c9cb7204": "unsold()", +"c9cbc222": "PicAdded(address,uint256,address,bytes32)", +"c9cbf8c9": "saleExchangeRate3()", +"c9cc0498": "buyComission()", +"c9cc0ed5": "setGuardianSale(uint256,uint256)", +"c9cc1a05": "transferTokensToContributor(uint256)", +"c9cd40a2": "vestingEntries(address)", +"c9cda91f": "changeTokenAddress(address)", +"c9ce1c23": "KUEKeNParty(string)", +"c9ce624f": "buyBackFund()", +"c9cf03ce": "refundMoneyForUser(bytes32)", +"c9cf2d4e": "vault_deposited(address)", +"c9cfa6ba": "setAllocation(address,address,uint256,uint256[],uint256[])", +"c9cfac55": "refundCurrency(address,uint256,uint256)", +"c9cfe755": "sendUnsold(address,uint256)", +"c9d00764": "TokenPurchased(string,uint256,uint256,uint256)", +"c9d0320a": "_doExtendPoll(uint256,uint256,uint256)", +"c9d07650": "NetkingToken(uint256,string,uint8,string)", +"c9d12d11": "RC(address,uint256,uint256,uint256,uint256)", +"c9d2373b": "marketKnowledge()", +"c9d256ae": "tokenSaleLeft()", +"c9d27afe": "vote(uint256,bool)", +"c9d27bcf": "doDisputeMemoryAccessSequence(uint256,bytes32)", +"c9d2d217": "TokenState(address,address)", +"c9d34622": "diffDays(uint256,uint256)", +"c9d4623f": "engine()", +"c9d57328": "managePlayer(uint256)", +"c9d66690": "RedeemEvent(address,uint256)", +"c9d68389": "airdropper()", +"c9d7d862": "drawFundsAfterTransfer(uint64)", +"c9d82560": "RewardBonusTimePeriod()", +"c9d82c96": "ICO_DURATION()", +"c9d96393": "updateGenVault(uint256,uint256)", +"c9d9c2b4": "deathData_a0()", +"c9dab438": "Subrosa()", +"c9dac221": "Bussines_Card(string,uint256,string,address)", +"c9db1bbf": "setPreICOStartDate(uint256)", +"c9db2bbd": "addPendingContribution(address,uint256,uint256)", +"c9dbc259": "ExchangeSwitch(bool)", +"c9dca9ba": "changeTokenMinter(address)", +"c9dd3a56": "annualInterestUpdateToken()", +"c9dd915f": "checkPremium(address)", +"c9ddd118": "checkPersonalRemaining(address)", +"c9ddd12f": "getTimestampOfDayEnd(uint256)", +"c9de31c7": "EOToken()", +"c9deb567": "collectionsAvailable()", +"c9dfa731": "lost(uint256,uint256)", +"c9e01787": "registerAffiliate(address[],uint256[],string)", +"c9e075c6": "showLockState(address,uint256)", +"c9e077e6": "bride()", +"c9e20791": "_setName(bytes32,string)", +"c9e25251": "buy(bool)", +"c9e3af7e": "currentBetLimit()", +"c9e3e66c": "secondCheckpointPrice()", +"c9e40106": "getConsolationPrizeTokenId(uint256,address)", +"c9e43221": "MIN_WTH()", +"c9e4d8bb": "isService(address,address)", +"c9e525df": "N()", +"c9e55b4e": "adminFixMaxSupply(uint256)", +"c9e6bef4": "_endsAt()", +"c9e7fd4b": "SovTokenCrowdsale()", +"c9e84346": "bonusLevels(uint256)", +"c9e904be": "totalEthRaised()", +"c9e9f4dc": "donateToLottery()", +"c9e9ff2c": "CPBWallet()", +"c9ea7c7c": "setMinimumFundingGoal(uint256)", +"c9ebb5e8": "freeMem()", +"c9ebeba6": "setIPFSParameter(string,string)", +"c9ec6cf6": "setOpenCloseHour(uint8,bool)", +"c9ecc566": "PurchasingAllowed(bool)", +"c9eda121": "setArrayIndexValue(bytes32,uint256,string)", +"c9ee21fa": "GUNS()", +"c9eea77c": "_updatePrice()", +"c9eebd9d": "modifyVictim(uint16,string,string)", +"c9ef5569": "getVolumeBonusPercent(uint256)", +"c9efa392": "bonusMilestones()", +"c9efda2c": "canStartAuction()", +"c9f09090": "populateTrancheTokens()", +"c9f0a02d": "burnAuction()", +"c9f166f8": "ctz32(uint32)", +"c9f1b7f0": "TeamToken()", +"c9f21fec": "setAuditTimeout(uint256)", +"c9f316dc": "getReferenceCodesOfAddress(address)", +"c9f3d62e": "getCarProductEarning(uint32)", +"c9f68025": "AMToken()", +"c9f73464": "maxCandidateId(uint256)", +"c9f84e1a": "unlockSecondPrivate()", +"c9f88f27": "invokeContracts(bytes)", +"c9f8cf20": "getCanvasesWithSellOffer(bool)", +"c9fa11df": "EventChain()", +"c9fa595b": "paused_3()", +"c9fa8f2d": "houseFeeHoldover()", +"c9faa7c5": "isActivated(address)", +"c9fb975c": "UnicornsSold(address,uint256,uint256,uint256)", +"c9fbdc36": "referral_fee()", +"c9fbe626": "TweetRegistry()", +"c9fca8a5": "rivetzRegister(uint256,uint256,uint256,address,address)", +"c9fd1955": "getVestingWalletLength()", +"c9fd83e2": "lastFeePeriodStartTime()", +"c9ff34ec": "privateTime()", +"c9ffb6e3": "claimPocketMoney()", +"ca001903": "AntarctiCoin()", +"ca00aad3": "closeLottery(uint256,string)", +"ca0157cd": "getGameIds(address)", +"ca01b37c": "DASToken()", +"ca01ba39": "generateTokens(uint256)", +"ca01d731": "XinfinUpgradeableToken(address)", +"ca02dbe3": "Requestprofit()", +"ca0370f7": "calculateCompoundContract(uint256,uint256)", +"ca03dab5": "withdrawSubdivsAmount(uint256)", +"ca03fdcd": "ShowADV()", +"ca04d26f": "transferReadable(address,uint256)", +"ca04e076": "getOwnerPixelCount(address)", +"ca051844": "withdrawBalance(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)", +"ca056aed": "addTokens(address,uint256,uint256)", +"ca06226d": "Ecopackcoin()", +"ca07218c": "setIt(address)", +"ca077f72": "allocate4ProjectToken()", +"ca0781a1": "getRateAndCheckCap()", +"ca079c52": "Upd(uint256,string,address,uint256,uint256)", +"ca087b96": "FlexFitRewards()", +"ca093888": "gameIsSundown()", +"ca0941b4": "findIdByHostPort(string,uint256)", +"ca0a992e": "IvyKoinContract()", +"ca0a9c2d": "makeUser(address,string,string)", +"ca0b1878": "addValue(address,uint256)", +"ca0b49ae": "getMyCarsIdx()", +"ca0c0a49": "gameActiveStrRef(string)", +"ca0c1e62": "computeMerkle(int256,int256,int256[],int256,int256,int256[])", +"ca0c2024": "minCapPre()", +"ca0c601c": "maxGoalInICO()", +"ca0c74be": "buyForInvestor(address,uint256)", +"ca0c9b5c": "storeTransactionData(address,address,uint256,uint256)", +"ca0cd7c0": "setUnlockLater(uint256)", +"ca0d01a6": "_yearTwoSupply()", +"ca0d0d82": "getMilestoneInfo(uint8)", +"ca0d6e48": "Mariton()", +"ca0d9564": "removeAdminList(address[])", +"ca0dcf16": "mintRate()", +"ca0e5c27": "ViewProjects()", +"ca0f1215": "initialSaleDuration()", +"ca0fe62a": "CryptoMemes()", +"ca0fe751": "switchRankings(uint8,uint64,uint64,uint64,uint64,uint64,uint64)", +"ca1149d1": "getUserEntryStatuses()", +"ca1314af": "getMax(uint256[])", +"ca13b818": "setWinningTeam()", +"ca13fb0f": "minInvestCents()", +"ca154008": "AssetContract()", +"ca15fb65": "getCardPower(uint256,uint256)", +"ca1637f5": "getGDemocsN()", +"ca169e66": "Voodka()", +"ca17cad1": "getBoxPrice(uint256,uint256)", +"ca185022": "foundersFundAddress()", +"ca1861aa": "stockCancelBuyOrder(uint256,uint256,uint256)", +"ca18da3f": "setGender(uint8,string)", +"ca18ebbf": "preICOPrice()", +"ca1929aa": "LogBeerRedeemed(address,bytes32,uint256)", +"ca1938e5": "houseCutPercentage()", +"ca1a2eb4": "localPaiementConfirmation(bytes32,bytes32)", +"ca1a3086": "transferChickenFrom(address,address,uint256)", +"ca1a4942": "CountExecs()", +"ca1a9433": "addZiekenhuis(address)", +"ca1aa5bb": "distributeReservedTokens()", +"ca1ab2ef": "divideByZero(uint256)", +"ca1ac5cb": "_createWhale(string,address,uint256)", +"ca1ad32c": "setPartnerPercent(address,uint16)", +"ca1b06b2": "ActionAuctionPlat(address,address)", +"ca1b5aa7": "allowUpgrading(bool)", +"ca1bf69f": "froze(address,uint256)", +"ca1c3bb3": "testNonExistingVoteWeight()", +"ca1c8895": "setPriceOfToken(uint256)", +"ca1d209d": "fund(uint256)", +"ca1d6f73": "doTeamMinting(address)", +"ca1e5bb7": "mintTokensByETHExternal(address,uint256)", +"ca1e9738": "getPricePerToken()", +"ca1ea20e": "dataMigration(address,address,address[])", +"ca1eb8be": "marketaWallet()", +"ca209c8b": "Bullexi()", +"ca2145a7": "CoinHot()", +"ca215005": "getIndividualPrice(address,uint256)", +"ca2156bd": "redenominate(uint256)", +"ca2177ef": "NSPFallback(address,uint256,uint256)", +"ca219b16": "XsearchToken()", +"ca2317dd": "changeReserveTeamRecepient(address)", +"ca2322c2": "mashToken()", +"ca2392f8": "sell(uint8,bytes6,uint32,uint32)", +"ca24034b": "deathData_v17()", +"ca2527e5": "batchTransfer2(address[])", +"ca256771": "weiPerUSDinTGE()", +"ca2571af": "lockedEarningsOf(address)", +"ca25bf6f": "IncubatorGlobalGas()", +"ca25e9c5": "setPurchaseRatios(address[],uint256[])", +"ca263a49": "registerDomain(bytes8,string)", +"ca2659dc": "commitPhasesDerived()", +"ca265c0f": "getCurrentSpend(address)", +"ca267f28": "getRecordCount()", +"ca2748bd": "transferAndFreeze(address,uint256,uint256,uint256,uint256,uint256)", +"ca276c07": "updateTierMinimum(uint256,uint256)", +"ca2785bf": "flushHouseFees()", +"ca278feb": "VanityURL()", +"ca27b214": "LucksToken()", +"ca27eb1c": "createListing(bytes32,uint256,address)", +"ca281fd9": "renounceControl()", +"ca28d2ae": "SEKCapitalToken()", +"ca292622": "getCompany(bytes32)", +"ca29cae8": "bufferWallet()", +"ca2a2f99": "_inMoney(uint256)", +"ca2acfff": "_getTokenAmountWithoutBonus(uint256)", +"ca2bf047": "predictPacks(uint256)", +"ca2c139c": "getCurrentQuickPromoBonus()", +"ca2cba95": "playerwithdraw()", +"ca2cd9d3": "marketactive()", +"ca2cef51": "MiningWarContract()", +"ca2d553a": "setAccessControl(address,address,uint8)", +"ca2dfd0a": "removeVerifier(address)", +"ca2dfff1": "notforked()", +"ca2e2f49": "firstVestedLockUpAmount()", +"ca2e8cc5": "markRedeemed(address)", +"ca2f281b": "FMC(uint256,string,string)", +"ca2f5a07": "PubRejected(address,string)", +"ca2f5cb4": "_addPauser(address)", +"ca2f6487": "Zettabyte()", +"ca2fd584": "getCommanderPot()", +"ca30597d": "BoomstarterPreICO(address[],address,address,uint256,bool)", +"ca30a279": "setTgeAsSaleAgent()", +"ca313539": "EMISSION_FOR_SALESTAGE2()", +"ca315ca6": "slashStake(uint256,address)", +"ca3181e0": "mint(address,uint32,uint256)", +"ca31879d": "claimToken(address,address)", +"ca3228d7": "_updatePlayersMilk(address)", +"ca325469": "destinationAddress()", +"ca3261c6": "giveAuthorization(address)", +"ca330563": "isRedeemed(address)", +"ca33a817": "_guardianVendPrice(uint256,uint256)", +"ca343d2b": "getICOBonusAmount(uint256,uint256)", +"ca34a0e3": "iterate_next(uint256)", +"ca34e1d6": "WineMarket(address)", +"ca35271c": "numDebtors(address)", +"ca35bff2": "setCaps(uint256,uint256,uint256,uint256,uint256)", +"ca36226d": "removeCrowdsaleContract(address,address)", +"ca3654e7": "requestBonus()", +"ca36695c": "setUsdPerEth(uint256)", +"ca368538": "randN()", +"ca37a9eb": "setWeiPerCent(uint256)", +"ca37dfad": "crossBalance()", +"ca37f7d9": "reserverWallet()", +"ca386496": "setPassword(string,string)", +"ca392c49": "setPreITO(address)", +"ca39e5ef": "fight(uint256,uint256)", +"ca3a3f0d": "_payTicketByEarnings(uint256,address)", +"ca3aa607": "LendToken()", +"ca3b5c91": "hasRelation(bytes,bytes,address)", +"ca3c7519": "getReffName(address)", +"ca3c8e11": "BRONZE_AMOUNT_NDC()", +"ca3c9147": "ownerHistoryEntry(uint256,uint256)", +"ca3dd175": "approveAuthority(address)", +"ca3e1176": "DaoRulesProposals(uint256)", +"ca3e1733": "ico1Tokens()", +"ca3e5333": "isFundManager()", +"ca3fc092": "CheckPrivilegeAccomplishment(uint256)", +"ca4028da": "BabyBorn(string,uint256)", +"ca408e14": "publishSerie(string,string,string,string)", +"ca414006": "setData_11(string)", +"ca41d16f": "SMTfundAfterPreICO()", +"ca4223ad": "LATIME()", +"ca42afda": "getGErc20ToDemocs(address)", +"ca43801a": "SelfDesctructionContract()", +"ca4398e3": "StellarToken(uint256,string,uint8,string)", +"ca43b191": "armySatelitesCount(uint256)", +"ca4401f1": "investor_addRefBonus(address,uint256)", +"ca440ca3": "decimalDiv(uint256,uint256)", +"ca441b85": "randomBlockStart(uint256)", +"ca446dd9": "setAddress(bytes32,address)", +"ca448a88": "revokeAsset(bytes32,uint256)", +"ca44c8e4": "testMemoryIntegrityCheck4Bytes()", +"ca46e41f": "CROSAIR_VOUCHER_LIMIT()", +"ca4742f1": "getRN(uint256)", +"ca482264": "GetApplicant(uint32)", +"ca482849": "_finalSupply()", +"ca4858af": "evacuateTokens(address)", +"ca48b0be": "setupToken(address,address,address)", +"ca4938fb": "totalFreezed()", +"ca495022": "weiFromExchange()", +"ca4a0298": "maxAirDrop()", +"ca4a2bf7": "NewTokensSold(uint256,address,uint256)", +"ca4a3df3": "winlose()", +"ca4b208b": "developer()", +"ca4b4fd6": "remove(bytes32[],bytes32)", +"ca4bb2b5": "printAllProducts(uint256)", +"ca4bc6ae": "getBurritoData(uint256)", +"ca4bd513": "FundsRefunded(uint256)", +"ca4c8fc6": "OneTestCoin()", +"ca4cbf67": "getUint(address,string)", +"ca4d1435": "GWGF(uint256,string,string)", +"ca4e02d0": "Jump(address,uint256,uint256)", +"ca4e4863": "VECTORZILLA_RESERVE()", +"ca4f0911": "preICOPush(address,uint256)", +"ca4ff630": "priceForStage(uint8)", +"ca5271a1": "funcWithoutArguments()", +"ca52cc86": "CollectibleOffered(uint256,uint256,uint256,address,uint256)", +"ca53135a": "min_bet()", +"ca5397c7": "cancelSellOffer(uint32)", +"ca5450ce": "any_customer_payments_yet()", +"ca5454db": "createTransferAgreement(uint256,uint256,address)", +"ca54ea4e": "pointOf(uint256)", +"ca5541c1": "nextRoundReserve()", +"ca555f2c": "setInitLockedAccount()", +"ca558b25": "DataContacts(address)", +"ca55954c": "getTokenHolder(uint256)", +"ca56106c": "testCopy()", +"ca561d4d": "KiemTraNamNhuan(uint16)", +"ca579642": "GroupBuy(address)", +"ca585774": "RewardForum(uint256)", +"ca588f14": "delAdmin(address,address)", +"ca58a06c": "managerKey()", +"ca58d2b4": "FUNDS()", +"ca58da1a": "changeReserve(address)", +"ca59f45b": "transferRecord(bytes32,address,uint256)", +"ca59fa8d": "_distributedTo(address,uint16)", +"ca5a3b4a": "isAllowedWhitelist(uint256,uint256)", +"ca5a3f38": "getDaysPassedSinceLastRefundBallot()", +"ca5a899c": "totalStashedPayouts()", +"ca5adadc": "processEthPulicFunding(address)", +"ca5b4207": "log8(uint8)", +"ca5b428f": "Police_2()", +"ca5b8a52": "REGULAR_CATEGORY()", +"ca5c058d": "founderTokensLockedUntil()", +"ca5c1547": "preSaleFirstPrice()", +"ca5c7a34": "getLand(int256,int256)", +"ca5c7b91": "lockedSupply()", +"ca5d0880": "airDrop()", +"ca5eb5e1": "setDelegate(address)", +"ca5f4282": "amountWanted()", +"ca607c4e": "transfer_other(address,address,uint256)", +"ca60f409": "CurrentIcePrice()", +"ca61295b": "removeFRA(address)", +"ca615662": "testFailCreateWithForeignParentNotInUse()", +"ca6158cb": "itemId()", +"ca61cdac": "testSub()", +"ca61e9b3": "verifyHashWithPrefix(bytes32,uint8,bytes32,bytes32)", +"ca621ac3": "DEVELOPER_RESERVED()", +"ca626232": "exchangeAdapterManager()", +"ca628c78": "withdrawToken()", +"ca632cc5": "bountyPaid()", +"ca639025": "getNujaRegistry()", +"ca63a55b": "getHotelsLength()", +"ca63b5b8": "freezingCount(address)", +"ca63f057": "DISCOUNT_STAGE_ONE()", +"ca6490cf": "elementFunction()", +"ca64a02d": "withdrawBalances(address)", +"ca64a095": "viewNextRelease(address)", +"ca64ad89": "getNotPayableTime(uint256)", +"ca64cd34": "marketCapRed()", +"ca6528cc": "increaseBalanceOrWithdraw(address,address,uint256,uint256)", +"ca6649c5": "joinGame(uint256,uint8)", +"ca668eb2": "MyERC20Token(string,string,uint256,uint256)", +"ca66a9c7": "blocktubeCoin(uint256,string,uint8,uint256,string,string)", +"ca67065f": "tokensAreFrozen()", +"ca67628f": "presaleFemaleEnd()", +"ca68968e": "ConversionRates(address)", +"ca68a45d": "createLastWill(address,string,string,string,uint256,uint256)", +"ca698873": "countWhitelists()", +"ca699de1": "StagedRefundVault(address)", +"ca69e323": "maxToken()", +"ca6ad198": "oraclizeMinCallbackGasPrice()", +"ca6ad1e4": "setCustomGasPrice(uint256)", +"ca6b72fd": "XtracoinToken()", +"ca6c7400": "getBuyerSignature(string)", +"ca6cf796": "startWinery(string,string,string,uint256)", +"ca6cfd95": "_createToken(string)", +"ca6d56dc": "addMember(address)", +"ca6d5d0c": "getLockedTokensInGroup_(address,uint256)", +"ca6f8295": "RDOToken()", +"ca7044c3": "RelentlessConscience2Token()", +"ca708230": "funnel()", +"ca709a25": "getFeeToken()", +"ca710013": "hasAllowanceToRecieveTokens(address,address)", +"ca7140ad": "playerForceGameEnd(uint8,uint256,uint256,int256,uint256,uint256)", +"ca722cdc": "settleBet(uint256,bytes32)", +"ca7230e9": "transferFromRegister(address,uint256)", +"ca7275cc": "SpiceHours(address)", +"ca733c32": "commandAddress()", +"ca73419e": "addAddressesToBlacklist(address[])", +"ca7390ab": "mulDivCeil(uint256,uint256,uint256)", +"ca740c8b": "IncreaseFunding(uint256,uint256)", +"ca74124c": "addUser(uint256,uint256,uint256,string,string)", +"ca7423ad": "withdrawLocks(bytes32,bytes32,uint256,address,address)", +"ca7430ea": "transferunlock()", +"ca758f42": "stcMaxBonus(uint256)", +"ca75b954": "PRESALE_HOLDER()", +"ca75cbfe": "submitTransaction(address,uint256,address)", +"ca75d770": "m_Owner()", +"ca760021": "withdrawChamp(uint256,address)", +"ca761365": "getDebris(bytes32,uint8)", +"ca76e548": "updateRest()", +"ca76ecce": "gettotalBondDivs(uint256)", +"ca7729f7": "_parseIntScientificWei(string)", +"ca77a6e8": "handleALU(uint256,int256,uint256,uint256,uint256,uint256)", +"ca77ab65": "calculate()", +"ca77ab8a": "getNextFile(bytes)", +"ca77ba31": "totalIssuanceCurrentBalanceSum()", +"ca77ea25": "createTokenByAtes(address,uint256,string)", +"ca78e65b": "disableManuallyMintTokens()", +"ca790380": "AstatosToken(address)", +"ca792754": "_assign(address,uint256)", +"ca79e2f2": "mintLongTermTokens(address,uint256)", +"ca79f967": "abortInactiveFight(uint256)", +"ca7a08ef": "compensate(address)", +"ca7b15da": "tokenRate5()", +"ca7bfc5d": "FinanceChain(uint256,string,string)", +"ca7c4dba": "getEtherPrice()", +"ca7c4e35": "OmenoToken()", +"ca7c8d07": "Medcash(address,address)", +"ca7c9296": "calculateFundedValueTokenToken(address,address,uint256,uint256,address,uint256)", +"ca7c95f2": "PRE_SALE_20_BONUS_MIN()", +"ca7ca5b4": "removeMember(address,bytes32)", +"ca7d18fe": "CORPayCoin()", +"ca7dc5b1": "getNumberOfTweets()", +"ca7e321f": "startBuyBackDate()", +"ca7e88ba": "setOutcome(bytes32,uint8)", +"ca80b489": "setGenes(uint256,uint256)", +"ca8127d4": "tradingFeeModifiers(address,address)", +"ca819d35": "getUserIDByWallet(address)", +"ca82a7c8": "rentModified(uint256)", +"ca82b5aa": "playBps(uint8)", +"ca84c176": "bonusAfterPresale()", +"ca84d17d": "payLeaderAndDev()", +"ca855a57": "SecureEgg()", +"ca85dbfc": "quickSetStarterClasses()", +"ca862298": "BitcoinWorld()", +"ca8695a4": "resetNewTokens()", +"ca8786c9": "bacancyToken()", +"ca879753": "burnMe()", +"ca87cb2a": "MRASToken()", +"ca87e67e": "setSaleTime(uint256,uint256)", +"ca87eb50": "Seo(address,uint256)", +"ca8836d2": "isPending(uint256)", +"ca88552d": "stock(address)", +"ca887dc4": "getAllGameStatistic()", +"ca88a7b0": "_shareToReferer(address,uint256,uint256)", +"ca88b3b2": "destructAll()", +"ca88bd5b": "isAccountBlocked(address)", +"ca88c5bd": "_getChallengeSuccess(uint256,uint256,uint256)", +"ca899878": "depositForRelay()", +"ca8a2c08": "createEstate(int256[],int256[],address)", +"ca8ab933": "countInstructors()", +"ca8b39c8": "setRegionBlockUpdatedAt(uint256,uint256)", +"ca8b42e4": "max_index()", +"ca8ee75a": "read_u8_array()", +"ca8f8ff3": "isExist(uint256)", +"ca8f9651": "voterVotingTime(address)", +"ca922078": "fundingStage(bytes32)", +"ca929e12": "transform(uint8,uint8)", +"ca92a136": "result_hash()", +"ca940bba": "getPastBet(uint256)", +"ca94452d": "setCrowdsaleTransfer(address,uint256)", +"ca94692d": "abiSignature()", +"ca949a1d": "blackjackValue(uint8)", +"ca94a927": "UnicornManagement(address)", +"ca95402d": "ExpRegistrar()", +"ca965c3f": "transferCEO(address)", +"ca96d7fc": "claim(bytes32,bytes32,uint8)", +"ca970bac": "donateDivs()", +"ca972cd4": "registerNewAccount()", +"ca97a248": "MoveRerolled(uint256,uint256,uint256)", +"ca97d274": "updateTokens3PerEth(uint256)", +"ca990859": "getPlayedInfo(address)", +"ca997200": "getForecastData(bytes32,bytes32,bytes12,uint8)", +"ca9a06df": "calcReservedTokens(uint256,uint256)", +"ca9a9386": "getNickname(address,address)", +"ca9c2862": "getCrydrController()", +"ca9c4b33": "hatchEgg()", +"ca9ccd3d": "secondRoundTime()", +"ca9d07ba": "refill(uint256)", +"ca9d0f8d": "process2(uint256,address)", +"ca9defb7": "ownerTransferZTH(address,uint256)", +"ca9e1993": "_transfer()", +"ca9ec138": "toEthSignedMessageHashBytes(bytes)", +"ca9efc73": "left81(uint256)", +"ca9f0803": "reservedInvestors(address)", +"ca9fa49e": "halfyearteam_trade_date()", +"caa02e08": "winnerCount()", +"caa035d6": "getTokenSaleType()", +"caa03a3e": "getPlayerId(string)", +"caa0f0af": "devAllocateTokenInMinutes(address,uint256,uint256)", +"caa0f92a": "getNextTokenId()", +"caa14e36": "setGiveBirthType(bool)", +"caa25756": "registerProductContract(address,address)", +"caa3b6e4": "TicTacToe()", +"caa3d559": "TRCExchangeRate()", +"caa4041e": "getAccountLimit(address)", +"caa4c5d0": "assumeControl()", +"caa5aba2": "ConfigurableParameters(uint256,uint256)", +"caa648b4": "getTotalValue()", +"caa67873": "CreateKDT(address,uint256)", +"caa6fea4": "emergency()", +"caa7590d": "MIN_INVEST_BOARD()", +"caa774ed": "petOnLeaderboards(uint64)", +"caa7b4b8": "ABToken(uint256,string,uint8,string)", +"caa7be13": "ClientPaymentEvent(address,uint8,uint8,int256)", +"caa7fd06": "cancelBid(uint256,uint256,bool)", +"caa82ab2": "TokenSendFail(uint256)", +"caa872ae": "_takeAll(address,address,uint256)", +"caa877e7": "buyFor(address,address)", +"caa8e084": "div(uint32,uint32)", +"caaa2045": "addressToNumTowns(address)", +"caaacb12": "totalForMining()", +"caab0acc": "testThrowCreateRetracted()", +"caab21d2": "Ore()", +"caabe889": "inAllocationLockPeriod()", +"caac87d0": "airdropPlays()", +"caad5b18": "withDrawEther(uint256)", +"caade55b": "AddrPartnerPocket()", +"caaed302": "rejectMilestone(uint256)", +"caaee91c": "setProxyOwner(address)", +"caaf2dd7": "getInitialAnswerResult(uint256)", +"caaf6d21": "numLoveItems()", +"caafa055": "ROUND_7_PRESALE_BONUS()", +"caafc163": "process2(uint256,address,address)", +"cab0198f": "emitTokensToOtherWallet(address,uint256,uint256)", +"cab067c0": "initialiseCrowdsale(uint256,uint256,address,address)", +"cab09273": "getUsedPaymentSupply()", +"cab0f632": "changeSponseeAddress(address)", +"cab17220": "VotesNecessary()", +"cab36e92": "addHash(uint256,string)", +"cab37586": "partnerWithdrawed(address)", +"cab39db9": "_updatePhase(bool)", +"cab3ad2c": "BONUS_ICO_WEEK_ONE()", +"cab47da7": "RATE_FOR_WEEK2()", +"cab54df1": "testHitPresaleCapPreDistribute()", +"cab59238": "setTrust(address,bool)", +"cab5c0f1": "_incrementState()", +"cab60267": "getGameCalculatedStats(uint256)", +"cab63661": "setPublisher(address)", +"cab6eade": "_destroyDeed()", +"cab7e3d9": "purchaseCars(uint256,uint256,bool)", +"cab7f0cc": "test_insert_findWithHintNextRemoved(int256)", +"cab7f521": "invoke()", +"cab896dc": "gameCost()", +"cab925a3": "BurnReceipt(address,uint256)", +"cab9c32a": "sellLimit(uint256,uint256)", +"caba203d": "Loyalty()", +"cabb3a3a": "isAlphaNumeric(string)", +"cabc0f43": "isLotteryOpen()", +"cabc6589": "awardWinnings()", +"cabc737c": "_addMaster(address)", +"cabcaaa0": "associateWithFile(bytes32)", +"cabd27de": "Motion(address)", +"cabd734f": "reject(bytes32)", +"cabe0452": "getCampaign(bytes32)", +"cabe2c0a": "levelEndDate()", +"cabf72e5": "WSBCCoin()", +"cabf8493": "balancesImporter4()", +"cabfb934": "replace(address)", +"cabfd1bf": "allocateTokens(address)", +"cac07bbf": "distributeTeamCut(bool,uint256)", +"cac12d2d": "tokenGenerationCap()", +"cac35112": "tokenRelease()", +"cac37f93": "totalTokensWithdrawn()", +"cac3e64a": "checkToken()", +"cac3f6c9": "percOf(uint256,uint256,uint256)", +"cac625e6": "transferTokenOwnership(address,address,uint16)", +"cac6d78f": "ToexCoin()", +"cac6edd8": "rightLottery()", +"cac77df7": "__transferFromToICAPWithReference(address,bytes32,uint256,string)", +"cac7db8a": "addUserToList(address)", +"cac7fc71": "allBalances(address,address,address[])", +"cac8d538": "setERC20Contract(address)", +"cac92fe1": "Aeroneum(address,address)", +"cac952ae": "isValidCustomerTxPaymentForMCW(address,bytes32)", +"cac98d6d": "getCCH_edit_24()", +"cac9a94e": "changeWalletOwnerAddress(address)", +"cac9ffbd": "fillIndexedBid(uint256)", +"cac9ffee": "unWhitelistAddress(address)", +"caca66bd": "transferPlatformship(address)", +"cacb27f4": "_D_sendToTeamEthContract()", +"cacc24eb": "transferFromViaProxy(address,address,address,uint256)", +"cacca238": "getBaseAmount(uint256)", +"cacca4a0": "approveTransfer(uint256)", +"caccd7f7": "developerAddress()", +"caccd805": "daoPOLSKAtokens()", +"cacd7a66": "creatUserID(string)", +"cace12e6": "roundInfo()", +"cace467e": "cancelSell(uint256,uint256,uint256,uint256)", +"cace7bd3": "claimRewardK(uint256)", +"cace8f37": "dragonGirlLotteryNumber()", +"cacf1e0e": "getPaymentsCount()", +"cacf5a33": "calculateVestedAmount()", +"cacf66ab": "genesisTimestamp()", +"cacfa24a": "_isBuilt(uint256)", +"cacfb535": "unpackAll(uint256)", +"cacfd8e9": "playTypes(uint256)", +"cad079ed": "investedUSD()", +"cad0899b": "sum(uint256,uint256)", +"cad1c663": "getChildOperation(bytes32,uint8,uint8)", +"cad1d39b": "getPersonalAirdropUnlockTimestamp(address,address)", +"cad2042f": "O2OToken(uint256,string,string)", +"cad27ae1": "random(uint64,uint8)", +"cad283a0": "EtherBetIO(address)", +"cad3d24d": "calculateBoatFee(uint256)", +"cad41357": "darknodeBond(address)", +"cad461ea": "setWeiPerUSD(uint256)", +"cad4ae37": "_addToBlacklist(address)", +"cad60d17": "freezeTokens(uint256,uint256)", +"cad66781": "NumOfStudentsRequests()", +"cad6dd1f": "sumPreICOUSD()", +"cad7214d": "supplyRound4()", +"cad80024": "left58(uint256)", +"cad916ec": "DEVELOP_CAP()", +"cad93688": "Test2(uint256)", +"cad9639d": "DEXK()", +"cad9642b": "getReportCount()", +"cad987f5": "updateAppreciationStep()", +"cadaacbf": "g(address)", +"cadb1166": "modifyWhiteList(address[],bool)", +"cadb3031": "timeoutY()", +"cadb48d9": "contractCreationBlockTime()", +"cadb5236": "vestToAddressEx(address,uint128,uint8,uint32)", +"cadbead4": "Pentacoin()", +"cadc958f": "VoteOnTransferStarted(address)", +"cadca796": "setShareHolders(bool,uint256,uint256)", +"cadcbce4": "PartComplete()", +"cadd888b": "getRewardToken(uint256,uint256)", +"cade3a5d": "_createPixel(uint24,uint32,address)", +"cade4f31": "collected_crowd_vitas()", +"cade77fa": "readAddress(address)", +"cadec1b2": "Registrar(address)", +"caded61f": "saleRatio()", +"caded711": "subOpenRoomCount(address)", +"cadf338f": "valueOf(uint256)", +"cadf74e2": "_unclaimedChickenOf(address)", +"cae039eb": "getWishTime(uint256)", +"cae07d2a": "TOKEN_SCALE()", +"cae15051": "tokenReceived(address,uint256)", +"cae20b59": "getAnimalIdsWithPendingCostume()", +"cae21530": "fightZeroMonster()", +"cae270b6": "sell(address,address,uint256)", +"cae342f6": "dontShowMeInTrace()", +"cae39b6f": "compute_pi(uint256)", +"cae3c254": "publicFundingWhiteList(address)", +"cae3d482": "vehicles()", +"cae44e83": "EthereumCoin()", +"cae4d676": "sendRefund(address)", +"cae523c1": "testOwnedTryAuthUnauthorized()", +"cae57913": "addTwo(uint256)", +"cae5c8c3": "APP_STORE()", +"cae6047f": "INVERSE_BASIS_POINT()", +"cae61d2e": "offer(string,uint256,uint256,address)", +"cae6b9c5": "tapPoll()", +"cae6ff18": "SKPT()", +"cae774b3": "maxInterval()", +"cae8e284": "newProposal(address,uint256,string,bytes32)", +"cae8eb2f": "ctrtToken()", +"cae96610": "WorldWifi()", +"cae96926": "is_creator(address)", +"cae98d4f": "r1(address)", +"cae9a07d": "changeManager()", +"cae9ca51": "approveAndCall(address,uint256,bytes)", +"caeafe6a": "stageStartTime()", +"caeb2539": "PreSaleBuy(address)", +"caeb2e2c": "_emitSkillAreasSet(address,uint256)", +"caeb30e9": "Configurator()", +"caebb256": "channelManagerByAsset(address,address)", +"caec390e": "getinfolaff(address)", +"caec3c79": "getBatchTransfer(address,address)", +"caecc5aa": "turnrefund()", +"caed4f9f": "DataService()", +"caed80df": "registries(address)", +"caee04b5": "AddGameCategory(string)", +"caee1daf": "creationRateOnTime()", +"caee262c": "sharesRec(uint256,uint256)", +"caee3305": "firstVestStartsAt()", +"caee4e18": "CommunityVotes(uint256)", +"caee7c78": "grantsCreated()", +"caef2181": "GetTimeMultiplier(uint256)", +"caef5dec": "getSubPayeesCount(bytes32)", +"caef6a84": "ETHMONEY()", +"caefb79e": "setCaps(uint256,uint256,uint256)", +"caefc5d5": "SemfaxToken()", +"caefdbe9": "FWDaddrETH()", +"caf05ce3": "isStopPlay()", +"caf0887d": "split(uint256,uint256,uint256)", +"caf19e5a": "toText(bool)", +"caf1bb7c": "repoBase()", +"caf29765": "PERCENTAGE_DIVISOR()", +"caf306c2": "ratePerWeiInMainICO()", +"caf439cb": "angelBurn(address,uint256)", +"caf44683": "test2(uint256)", +"caf597f3": "INVEToken(address)", +"caf66171": "bigRoundMaxRoundNum()", +"caf6cb3f": "marketDefaultFeeHigh()", +"caf6e1c9": "setClosedManually(bool)", +"caf6fe1a": "randomGenes()", +"caf71743": "createSellOrder(address,uint256,uint256,uint8[],address[5][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[])", +"caf798d7": "transferRegion(uint16,address)", +"caf7caf1": "_multiplyDecimalRound(uint256,uint256,uint256)", +"caf807a1": "closeEth()", +"caf91b30": "airdrop(uint8,bytes32,bytes32,uint256)", +"caf9bf58": "getContributionsCount(address)", +"cafa1cde": "PajCoin223()", +"cafa22d7": "setLeftICOTokens(uint256)", +"cafab7e1": "viewPetitionShareholderWithAddress(address)", +"cafaed51": "deadlineParticipation()", +"cafb2202": "invested()", +"cafbc49d": "createProduct(bytes32,string,address,uint256,uint8,uint256)", +"cafbcc8a": "inInnerScope(uint256,uint256)", +"cafc0fbd": "isRegulated(address)", +"cafd3d52": "setUpCrowdsale()", +"cafe0e90": "setFee(string,uint256)", +"cafe2f19": "setReachCapped()", +"caff4b03": "Response(bytes32,uint256)", +"cb009d2c": "KellerWilliams(uint256,uint256)", +"cb00e7f8": "MCTContractToken(uint256,address)", +"cb0177a0": "disableAllocationModificationsForEver()", +"cb0195ee": "changeDeveloperTemplateAmountLimit(uint256)", +"cb01a9bf": "payRent(bytes32,string)", +"cb01c70c": "episodesNum()", +"cb01cd02": "masscreate(uint256,uint256)", +"cb01f15c": "GetLogMessageWarning()", +"cb01f431": "maxTokensToSaleInClosedPreSale()", +"cb0210a0": "updateReputation()", +"cb029785": "Aphrodite()", +"cb02ba28": "multiSend(uint256,address[])", +"cb030cee": "_reducerunmoney(address,uint256)", +"cb03e43b": "AnimalFoodToken()", +"cb040e0b": "createTemplate(string,bytes32,bool,address,bytes32,uint256,uint256,uint8,uint256)", +"cb04a34c": "getMarketTotalPar(uint256)", +"cb05b93e": "getEth()", +"cb076478": "getTicket(address,uint256)", +"cb07b94b": "getLastRegionId()", +"cb09abc2": "resolveProp(uint256)", +"cb09b0d0": "ownerAPI()", +"cb0a2d95": "HashtagToken(uint256)", +"cb0a3889": "setPreIcoStart(uint256)", +"cb0ab425": "getIPFSHash(address)", +"cb0b6161": "_calcRelease()", +"cb0b7b03": "setContributionMinimum(uint256)", +"cb0cedb8": "getFineLevelOfAddress(address)", +"cb0cfaa2": "finalizeProposalByVoterIndices(uint256,uint256[],bool,int256)", +"cb0d3133": "setEscrowedProjectBalances(uint256,uint256)", +"cb0d3981": "getMintForReportingParticipantTargetValue()", +"cb0ef7d0": "hgtRates(uint256)", +"cb0f86ab": "cards_black(uint256)", +"cb0fb059": "getNumberTwoArgs(address,bytes4,address,address)", +"cb10e0c5": "getLastDuel1()", +"cb10fa76": "safeToMul(uint256,uint256)", +"cb11526d": "moving()", +"cb117f0c": "approveAndCallAsContract(address,uint256,bytes)", +"cb122a09": "setFee(uint8)", +"cb12b48f": "me()", +"cb12be81": "prometheusShipMinted()", +"cb12fc1d": "LAMDEN_DECIMALS()", +"cb1374a2": "claimTokens(address[],uint256[])", +"cb146814": "baseETHBalance()", +"cb149b09": "unlockWorker(address,address)", +"cb14a5cf": "treeDetails(uint256)", +"cb14b170": "SubscriptionModuleImpl()", +"cb14d93b": "getHash(bytes,address,uint256)", +"cb1579ec": "checkOrderBatch(uint256[48])", +"cb15d07b": "getOfferAmount(uint256)", +"cb161f8a": "AddDiv()", +"cb16415f": "fundsToOwner(uint256)", +"cb1650b4": "createThread(string,string)", +"cb16d4a2": "sendEther(uint256,address)", +"cb16e6d0": "earlyParticipantWhitelist(address)", +"cb170735": "createBools(bytes32[],bool[])", +"cb192f2c": "setAdvertisingAddress(address)", +"cb19bf53": "Testtoken5()", +"cb1a32a4": "aotLength()", +"cb1a7b1d": "tokenDelta(address,address,address,uint256,uint256,uint256)", +"cb1aaa31": "distributed_bounty()", +"cb1ab340": "setFinancialAdmin(address)", +"cb1b82b7": "getuserbalance(address,address)", +"cb1ba60f": "voteOnElection(address,address,address,address,uint256)", +"cb1be21a": "configureWallet(address)", +"cb1c2b5c": "MIN_STAKE()", +"cb1c8b6a": "purchaseDefense()", +"cb1d8418": "getForkingMarket()", +"cb1d9d63": "setENGCommunityAddress(address)", +"cb1de087": "transferFromFST(address,address,uint256)", +"cb1e4389": "isMajorityConfirmed(bytes)", +"cb1fa715": "setSingleWithdraw(uint256)", +"cb1faac1": "leftVotes()", +"cb1fc276": "createPassportByOwner(address)", +"cb1fc7bc": "totalSzaboInBids()", +"cb207166": "LifeFactor_iv()", +"cb227cae": "getPOOL_edit_18()", +"cb22c0aa": "setBudget(address,string)", +"cb22d392": "windowFinalBlock(uint256)", +"cb22d41b": "numBeneficiaries()", +"cb22fd59": "setFeeCharge(uint64)", +"cb238ffa": "returnHashLong(address,uint256[3])", +"cb2410b9": "changeContentData(uint256,uint256,bytes32)", +"cb244f65": "koreanCitizen()", +"cb24e8f1": "Foorp()", +"cb254080": "TomToken()", +"cb25d9a2": "JFDToken()", +"cb27bdc1": "revealDeadline(bytes32)", +"cb27f28a": "endCrowdFund()", +"cb282253": "totalEthContributed()", +"cb28ba6a": "AIToken(uint256)", +"cb28c716": "createKycData(address,string,string,uint256,uint256,string,string,string,string,int256,uint256)", +"cb293e7a": "rentRentable(bytes32,address)", +"cb294dc5": "ULTRONEUM()", +"cb2971b1": "eosTokenAddress()", +"cb297ef0": "_performRenewal(uint256,uint256)", +"cb29881c": "createEggScheme(uint256,uint256,uint256,uint256,uint256,uint256,bool,bool)", +"cb29eee0": "medsupply()", +"cb2b34d6": "setSalary(uint256)", +"cb2b5668": "EVBChain()", +"cb2b9031": "addressToBytes(address,address)", +"cb2bea55": "setEmergencySecrets(uint256,uint256)", +"cb2c05dc": "viewInitialPricePerShare()", +"cb2c8723": "addUtilityHolder(address)", +"cb2e0814": "iii(address)", +"cb2e1d10": "icoRound4()", +"cb2e46f3": "endTimer()", +"cb2ec895": "deposit(bytes32,address,uint256,bool)", +"cb2f7b87": "update(uint32,uint128,uint128)", +"cb2f7c49": "hashDifficulty(bytes32)", +"cb2fe520": "remainingTokenBurnt()", +"cb31b6cd": "multiTransferFrom(address,address[],uint256[])", +"cb3204a8": "getKycHash(uint256)", +"cb338436": "doSendProfits(address)", +"cb33e7fa": "doTrade(address,address,uint256)", +"cb35ef2c": "demotest()", +"cb3687df": "core(uint256,uint256,uint256,uint256)", +"cb3694ba": "getManualInvestorsCount()", +"cb379765": "tsauction(uint256)", +"cb381b61": "teamETHUnlock1()", +"cb381c3c": "setGas4Token(uint256)", +"cb388b9b": "test_callIt()", +"cb38c7b4": "getWithdrawalList(address)", +"cb393ecb": "Dice5()", +"cb3993be": "decreaseApprovalAndCall(address,uint256,bytes)", +"cb39aafb": "validateRequest(bytes32[8],bytes,bytes,bytes)", +"cb3a11f9": "withdrawUserSpecifiedFunds(string,uint256,uint8)", +"cb3ab271": "WYQToken(uint256,string,string)", +"cb3ae150": "Playforbulktoken()", +"cb3b0c79": "LotToken()", +"cb3bc227": "LogBeerBought(uint256,address)", +"cb3c28c7": "trade(address,uint256,address,address,uint256,uint256,address)", +"cb3cb085": "validateTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address)", +"cb3ce26e": "m_owners()", +"cb3cf99a": "decode(bytes,uint256,uint256,uint256,uint256,uint256,uint256)", +"cb3d6b5f": "devTeamWithdraw()", +"cb3e394d": "transferFromWithFee(address,address,uint256,uint256)", +"cb3e64fd": "unhalt()", +"cb3ebec2": "ownerDividend()", +"cb3eecc9": "getNewInstance()", +"cb3eef2c": "allWorkers()", +"cb3fcb56": "setGrowthTokensPercent(uint256)", +"cb4153e9": "destroyNinja(uint256)", +"cb421a21": "denemekontrat()", +"cb424c24": "HZRToken(address)", +"cb42a77b": "stringTobytes32(string)", +"cb43269d": "getRegistryImplementation()", +"cb4360d9": "allocateToken(address,uint256,uint256)", +"cb43e079": "drain_block()", +"cb44211e": "addApproval(address)", +"cb44b53d": "ResolutionProposals()", +"cb457d47": "unlimited()", +"cb45a294": "getSecondTokens()", +"cb4717b2": "SetProperty(bytes32,uint256,uint256,uint256)", +"cb4735f2": "estimatedFundingAmount(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"cb4799f2": "getMetadata(uint256,string)", +"cb47a8ce": "MultiChampion()", +"cb47abc7": "getTotalNumberOfTransactions()", +"cb48e1a5": "assignShareTokens(uint256)", +"cb4a15c5": "checkStringLength(string,uint256,uint256)", +"cb4b0105": "Unhold(address,uint256)", +"cb4b3710": "setStopSelling()", +"cb4b9db1": "EchoChainToken()", +"cb4bc2e9": "tryauthenticate(bytes)", +"cb4bd883": "updateRef(bytes32,string)", +"cb4be0bb": "getTurtlemasterReq()", +"cb4c86b7": "funding()", +"cb4c88ae": "MediatedTransferStatusModified(uint256,bool)", +"cb4c8ee4": "isRSPScience()", +"cb4d3d67": "AddedTokenHolder(address,uint256)", +"cb4de968": "ICO_BASE_PRICE_IN_WEI()", +"cb4e75bb": "smbl()", +"cb4e7fdc": "icoIsRunning()", +"cb4f1d85": "getPolicyHolder(bytes)", +"cb50301a": "unsoldAddr()", +"cb510e97": "isStaff(address)", +"cb51c418": "_toString(address)", +"cb51f777": "TOKEN_PRICE_NUM()", +"cb526229": "RefundChequeByHash(uint256)", +"cb52926a": "getBoughtAssetPacks(address,address)", +"cb52c25e": "updateAmountRemainingForSale(uint256)", +"cb553ac9": "sweepWizardCommission(uint256)", +"cb55adfb": "getStrategyTokenAndWeightByIndex(uint256,uint256)", +"cb560ac4": "winningMultiplier()", +"cb562fb3": "Uniond()", +"cb56d626": "testFailBlobStoreNotRegistered()", +"cb56dd79": "getFinalState(uint256)", +"cb56e40b": "getTrader(uint8)", +"cb574b8c": "buyUpgrade()", +"cb577480": "prepare(uint256)", +"cb5829ab": "Revision()", +"cb5853a8": "claimTaxex(uint256,uint256)", +"cb58594e": "airDropShadowMoney()", +"cb586251": "MintableMultiownedToken(address[],uint256,address)", +"cb5b6bef": "setPriceStep8(uint256)", +"cb5bf9b8": "EthersRaised()", +"cb5cf43f": "supplyReady()", +"cb5d0646": "Presale2Sold()", +"cb5e4805": "NvcFundCoin()", +"cb5e7d2d": "newMember(address,bytes20,uint64)", +"cb5e891f": "_setActiveSupply(uint256)", +"cb5f18db": "get_ads()", +"cb5fa63f": "getRoundEth(uint256)", +"cb5fd01f": "TestToken(address,address,address,address)", +"cb5fe36e": "VESTING_2_DATE()", +"cb60f8b4": "sellStartTime()", +"cb6142c9": "freezeAllAccountInEmergency(bool)", +"cb61522d": "MILLIODS()", +"cb61b42d": "updateShares(uint256,uint256,uint256)", +"cb61b49e": "_setRate(address,address,uint256)", +"cb6291cb": "ownerSendTokens(address,uint8,uint256)", +"cb6308f1": "approveVersion(address)", +"cb6367d1": "verifySignatures(bytes32,uint8[],bytes32[],bytes32[])", +"cb637d85": "changeAccountService(address)", +"cb639322": "realReserve()", +"cb63da4e": "ALLOC_RES()", +"cb63ddb6": "makeProposal(uint8,uint256)", +"cb642180": "_updateNodeHeight(bytes32)", +"cb645ae2": "addOneRequest(address)", +"cb64a37b": "createSeratioStake()", +"cb64d74d": "etherFeePercent()", +"cb656a13": "adviserSold()", +"cb65ad66": "MobileAppSupply()", +"cb65c0f5": "withdraw_excess_tokens(uint256)", +"cb662fe1": "claimedList(uint256)", +"cb67f20f": "SaleClosed(uint256)", +"cb67f948": "unlockTokens(address)", +"cb68780f": "GetICOData(uint256)", +"cb6890d9": "setAccount(address,uint256)", +"cb692928": "dataControlSetFeePropMaxGlobal(uint256)", +"cb6ad855": "log10Ceiling(int256)", +"cb6af4cb": "createChannel(string)", +"cb6b1f05": "cf2Wallet2Pct()", +"cb6b25f3": "votePassed(uint256)", +"cb6b8699": "getPI_edit_5()", +"cb6bfa03": "BNIToken()", +"cb6bfd23": "CyTestCoin(uint256,string,uint8,string)", +"cb6c1655": "tokensFor1EthP1()", +"cb6cec4b": "getIpfsAfterTitle(bytes32)", +"cb6d0c5f": "minimumDurationInBlocks()", +"cb6da9da": "takerCount()", +"cb6e3fa9": "shouldUpdateFunder(address)", +"cb70d9a7": "changeUserCertificate(bytes32)", +"cb712535": "_transferFrom(address,address,uint256)", +"cb7129a3": "resolvePriorBets()", +"cb724422": "testPayTokens()", +"cb739476": "MAGExCoin()", +"cb739c0f": "changeRateLoss(uint256)", +"cb740c61": "grant(address,uint256,uint256,uint256)", +"cb742358": "virtualBalanceOf(address)", +"cb752679": "buyTokensWithPoly(uint256)", +"cb757e92": "REGO()", +"cb758a89": "addDataPoint(uint256,bytes32)", +"cb76937c": "getUserBetsTimeStampInARazInstance(uint256,uint256)", +"cb7729d3": "shiny()", +"cb774d47": "startingIndex()", +"cb775d5a": "consumePower(uint256)", +"cb77ed34": "_getProviderSupply(uint256)", +"cb78bebc": "USER_BUY_LIMIT()", +"cb78c9f0": "flips()", +"cb795a64": "allowedBuy()", +"cb79d573": "maxCompanyValue()", +"cb79e31b": "votingRightsOf(address)", +"cb7a0a6f": "getPlayerSpaceshipBattleModeById(uint256)", +"cb7aac1e": "transferTokensFromProjectFundAddress(address,uint256)", +"cb7acdd9": "hola()", +"cb7b3f0a": "readPaymentChannels()", +"cb7b3fb9": "KinguinIco()", +"cb7b4ad4": "canCPCreateInFactory(address,address)", +"cb7b8673": "setTokenExchangeRate(uint256)", +"cb7bba39": "lockaddress(address)", +"cb7bba61": "prove(string,string)", +"cb7c05e7": "verify_fund()", +"cb7c225e": "Send_TrustlessTransaction(address,uint256)", +"cb7c30f2": "m_D_n()", +"cb7d38ac": "changeStartPreSale(uint256)", +"cb7d8ef2": "spark()", +"cb7e70fa": "buyTokensOnInvestorBehalf(address,uint256)", +"cb7e9057": "dispatcher()", +"cb7e9bf1": "rewardHistoryMapOf(address,uint256)", +"cb7ef63d": "Coinage(uint256,uint256,uint256,uint256,uint256,uint256)", +"cb7fd9db": "checkVeracity(string)", +"cb802c8b": "getInvoice(bytes32)", +"cb80bd60": "LogRefundFailed(address,uint256)", +"cb810ea9": "sendTokensSingleValue(address,address,address[],uint256)", +"cb81fecf": "lockRequestCount()", +"cb821f03": "calculateClaimByIndex(address,uint256)", +"cb82d5df": "canMakeNoFeeTransfer(address,address)", +"cb84e69e": "setMessageMaxCharacters(uint256)", +"cb8523c6": "addAllowed(address)", +"cb856252": "getFreezeList()", +"cb859c09": "getGameRules()", +"cb85f175": "WhiteListedInvestorAdded(address,string)", +"cb86df95": "moveStartDate(uint256)", +"cb8820ef": "setWriterId(address,bytes32,bytes32)", +"cb884207": "deathData_f5()", +"cb885a36": "Crowdsale(address,uint256,uint256,uint256,address,address,uint256)", +"cb89558d": "AgreementHashRu()", +"cb899024": "defrostToken()", +"cb8a67ed": "ownersForChange()", +"cb8b4b83": "CollectERC20(address)", +"cb8b99b2": "_addCryptantFragments(address,uint256)", +"cb8c2982": "getMyKebabers()", +"cb8c478a": "activeTime()", +"cb8cb4a3": "getGoals(address)", +"cb8cd7cb": "transferFee_()", +"cb8d0f46": "tstop()", +"cb8ff46f": "koinconekt()", +"cb908d78": "_updateEthereumPrice()", +"cb912ffb": "tokenCountSet()", +"cb918634": "setDrawP(uint256)", +"cb91a6ba": "setGemPerMiner(uint256)", +"cb91aec7": "getFreelancerContracts(address,address)", +"cb91f1c2": "periodPreITO_endTime()", +"cb92042c": "removeShare(address)", +"cb923813": "saled()", +"cb92bfa1": "_computeCurrentPrice(uint256,uint256,uint256,uint256)", +"cb92c28d": "rewardEvery1000Draw7(uint256)", +"cb92cb52": "BuyBackStart(uint256,uint256,uint256)", +"cb930934": "KopihitamToken()", +"cb93abb2": "BUYER_STEP_1(bytes32)", +"cb93e347": "CryptoGamesMarket()", +"cb93f7ef": "withdrawDevFee()", +"cb944e24": "saleCapUsd()", +"cb945312": "testEqual()", +"cb949213": "addressToPurchasedTokens(address)", +"cb949e51": "getCustomer(address)", +"cb94aa26": "withdrawBatch(address[],uint256[])", +"cb950c37": "updateValidMCAmount(uint256)", +"cb9580e0": "TotalPaid()", +"cb95a6f6": "Bounty(address)", +"cb96012e": "hashTo256(bytes32)", +"cb965ae9": "allKeys()", +"cb96b0d6": "MAX_EXCHANGE_FEE_PERCENTAGE()", +"cb96f11d": "Oversight()", +"cb9756ad": "buyClimateCoinsAgainstEther()", +"cb9854a2": "confirmSwap()", +"cb985708": "investorWalletAddress()", +"cb985dd1": "MARKET_SHARE()", +"cb990457": "holdersByIndices(uint256,uint256,bool)", +"cb991efe": "depositEscrow(uint256)", +"cb99cbac": "startServer(uint256)", +"cb99d98e": "_addWhitelisted(address)", +"cb9a20d0": "MINI_GAME_ADD_TIME_DEFAULT()", +"cb9a3251": "finalizeMany(uint64[])", +"cb9a32a5": "promoMasterpiecesCreatedCount()", +"cb9a5edd": "availableLand()", +"cb9aac64": "usesLibrary()", +"cb9ae707": "latestDifficultyPeriodStarted()", +"cb9b3a3c": "getCCH_edit_4()", +"cb9bdf45": "tokenSoftcapIssued()", +"cb9c8505": "throwIfStartPastBlocktime()", +"cb9d5eb4": "safeMove(address,address,uint256)", +"cb9d6176": "LogDelete(address,uint256)", +"cb9d86e2": "BlockRefunded(address)", +"cb9dd1a0": "setMoving()", +"cb9e2755": "deleteEntity(uint256)", +"cba01a49": "LunarLink()", +"cba0e996": "isExcluded(address)", +"cba1fa10": "set_iconiq_presale_open(address,bool)", +"cba25e79": "presaleHardcap()", +"cba2c735": "createPurse(string)", +"cba456df": "casinoProxy(address,address,address)", +"cba4bc94": "_setHowManyOwnersDecide(uint256)", +"cba4f643": "changePreIcoRate(uint256)", +"cba50fd1": "generateUserRelation(address,uint256)", +"cba58ab6": "disableService()", +"cba59827": "Reject()", +"cba5b465": "endContract(address,uint256)", +"cba6582e": "Ellomiun()", +"cba66250": "FTV(address,address,address,address)", +"cba66e14": "sliceBytes20(bytes,uint256)", +"cba6a3a2": "setTransferAuthorized(address,address,uint256)", +"cba74da1": "getResource(bytes32,uint256,bytes32)", +"cba88872": "countdown()", +"cba8901b": "getPayoutKeys()", +"cba8be1c": "setServerAdmin(address)", +"cba91a35": "roundTwoTime()", +"cba9a794": "handleReturnBool()", +"cba9c0e0": "presale_start_block()", +"cbaa0b25": "playerAttack(uint256,uint256)", +"cbaa0bec": "amendSingleResult(int16,string)", +"cbaba70f": "EADC()", +"cbac21b8": "periodPreITO_mainCapInUSD()", +"cbac8816": "tokenRate20()", +"cbaca250": "RewardSplit(uint256)", +"cbacb269": "stopBonusCompaign()", +"cbacffe4": "addToPayeeBalance(address,uint256)", +"cbad3779": "getPublisherRegistry()", +"cbad60b6": "spread(uint8)", +"cbad7bf6": "cg(address,uint256,uint256,uint256)", +"cbaddbaa": "BurnMe()", +"cbae0163": "readPosition(uint256,int256)", +"cbae0978": "NewResolver(uint256,address)", +"cbae1467": "deleteAllAvatars()", +"cbaeadb4": "getRewardHistory(address)", +"cbaedd3c": "slashUsername(bytes)", +"cbaf4742": "OPERATE_SUPPLY()", +"cbaf5104": "_isClosed(bytes)", +"cbaf566d": "updateRentInfo(uint256,uint256,uint256)", +"cbafee8a": "tokensToMint()", +"cbb01884": "setDefault(uint8,address)", +"cbb04cbd": "debtPaid()", +"cbb05527": "totalCapInWei()", +"cbb0c95a": "getPlayerWithdrawEarning(uint256)", +"cbb105d6": "NewWorld()", +"cbb1d761": "confirmBySigner(bytes32,address)", +"cbb2fd5d": "TRTToken()", +"cbb31da9": "maker(address)", +"cbb433ea": "DeepToken()", +"cbb45120": "TOTAL_WINS()", +"cbb45444": "test_transfer_to_contract_without_fallback()", +"cbb50d30": "teamAllocationTokenSend(address,uint256)", +"cbb6e5c9": "transferTopLevelDomainOwnership(bytes32,address)", +"cbb70c92": "addLOC(address)", +"cbb8b158": "TESTH()", +"cbb9818c": "turn_flag_ON()", +"cbb9dbb9": "depositCoupon(address[2],uint256[8],uint8,bytes32[2])", +"cbba3f4b": "DCSToken()", +"cbbacd48": "cliffs(address)", +"cbbaed1b": "incentiveDistributionMaxRounds()", +"cbbb2698": "checkBlackAccount(address)", +"cbbc1bf3": "setCosignerAddressForUser(address)", +"cbbc8504": "GnosisTalk()", +"cbbc8a51": "setForeignDailyLimit(uint256)", +"cbbcdf77": "addCurrency(uint256)", +"cbbd809c": "approvedAddressInLUT(uint256)", +"cbbda00e": "Ptest()", +"cbbdca36": "Upgradable(address)", +"cbbe2199": "ActualTokenManager()", +"cbbe2569": "Bogocoin()", +"cbbe300b": "FooMintToken()", +"cbbe974b": "unlockUnixTime(address)", +"cbbea348": "getModeratorAtIndex(uint256)", +"cbbf879c": "getNumParentOperation(bytes32,uint8)", +"cbbf9420": "distributeVES(address[],uint256,uint256)", +"cbbfe168": "getOrder(uint256,address)", +"cbc066ab": "_transferOrderMoney(uint256,address)", +"cbc12d13": "maxRingSize()", +"cbc1cfd2": "emergency_withdraw()", +"cbc24224": "MuskToken()", +"cbc264f2": "nestedFirstAllToAll(uint256)", +"cbc265ac": "revealSeckey(bytes32)", +"cbc3b73e": "delegateHasValidSignature()", +"cbc3fb0d": "blind_sha256(string,address)", +"cbc44835": "PlateMate()", +"cbc469de": "STRToken()", +"cbc52ee4": "EtherIslands()", +"cbc598c5": "isAmountAllowed(address,uint256)", +"cbc61daf": "mintForMarket(address,uint256)", +"cbc69c8d": "SocialMediaToken()", +"cbc6c267": "ejenfwdToken()", +"cbc7755c": "registerNameXnameFromDapp(address,bytes32,bytes32,bool,uint8)", +"cbc7854e": "setTokens(address,address)", +"cbc846d9": "setBoosters(address)", +"cbc85c97": "getAllCardsClaimContender()", +"cbc8ae5f": "TOKEN_SUPPLY_ICO()", +"cbc9023c": "forceRoll()", +"cbc91e98": "sendTokensAfterBuyExp(address,uint256,uint256)", +"cbc9c89c": "Claim_TRAC_3800()", +"cbca02d3": "trasnferFromOwner(address,uint256)", +"cbca99c7": "updateWLAddress(address)", +"cbcaacab": "checkTransferWithReference(address,uint256,string)", +"cbcabc13": "changeMdtTeamAddress(address)", +"cbcb3171": "tokenReserve()", +"cbcc65eb": "ACL_APP_ID()", +"cbccf9d6": "Simpletoken()", +"cbcd5dfe": "MintableMasterToken()", +"cbcdc2e4": "transferBalanceToOwner(uint256)", +"cbce2fcf": "setAmountBasedBonus(uint256[],uint256[],uint256[])", +"cbce4c97": "gift(address,uint256)", +"cbcf4d25": "icoAccounts(address)", +"cbcf8ece": "setAccountBonus(address,address,uint256)", +"cbcf98e6": "changeSecondaryWallet(address)", +"cbcffd2f": "ShowInfo(uint256,string)", +"cbd076f8": "depositForUser(address,uint256)", +"cbd07fd8": "paidDividends(address,uint32)", +"cbd08c8c": "config(uint256,uint256,uint256,uint256)", +"cbd1b782": "test_claimShare_notTranscoder()", +"cbd21f00": "JBartContract()", +"cbd243b4": "SetWhy(uint32)", +"cbd2ac68": "confirmWhitelistRemoval(bytes32)", +"cbd2bdfd": "getAllAuctions()", +"cbd2c73b": "signUserKeyChange(address)", +"cbd2ecd2": "transferAllowance(address,address,uint256)", +"cbd3b403": "getLuck(address)", +"cbd3faef": "amountOwedForApiForBuyer(uint256,address)", +"cbd49462": "_sender()", +"cbd5131b": "sponsoredBonusAmount()", +"cbd57134": "KTCToken()", +"cbd5bb2b": "setRound(uint8)", +"cbd6cc67": "SendDataToken(uint256,string,uint8,string)", +"cbd85c76": "bytesToBytes4(bytes,uint256)", +"cbd88663": "drawJurors(uint256,uint256)", +"cbd8877e": "stakeMinAge()", +"cbd8e690": "setTokenAmountPerHeritor(address,address,uint256)", +"cbd8ff79": "ContributionToPrizeFund()", +"cbd9597d": "GenChipLevel_Special(uint256,uint256,uint256)", +"cbd9d2e0": "InvalidCaller(address)", +"cbda1d85": "fundingGoalHardCap()", +"cbdb2469": "_getPetBonus1(uint256)", +"cbdb4f72": "GetClientBalance()", +"cbdc5aa4": "tokensTradeable()", +"cbdd3268": "genesisImportsComplete()", +"cbdd69b5": "tokensPerEth()", +"cbde2ff0": "isUnfreezed(uint256)", +"cbdf02fb": "rejectCertificate(address,address)", +"cbdf3878": "goldLevelBonusIsUsed()", +"cbdf8692": "Lockup()", +"cbe0a1aa": "totalEthCharityCollected()", +"cbe0e49a": "presaleGranteesMapKeys(uint256)", +"cbe211ec": "adPriceWeek()", +"cbe230c3": "isAllowedToken(address)", +"cbe239ed": "setIcoPaymentStatus(bool)", +"cbe23b94": "cards_start_total()", +"cbe29f34": "advisorsSupply()", +"cbe2e97e": "setGameStatus(bool)", +"cbe324d8": "_setSuggestedAdPrice(uint256,uint256)", +"cbe335c1": "verifyDocument(bytes32,bytes,uint16)", +"cbe37e25": "BYBToken()", +"cbe3a072": "add(uint32)", +"cbe3be97": "KeplerCoin()", +"cbe40622": "setup(address,address,uint256)", +"cbe432b0": "ico3Tokens()", +"cbe44fa2": "setWhitelisted(address,uint16)", +"cbe5404f": "setAccountFrozen(address,bool)", +"cbe56377": "amendLock(uint256,uint256)", +"cbe566de": "deleteCascade(uint256)", +"cbe7a150": "getCryptoMatch(uint256)", +"cbe7b838": "YunKaiCoin()", +"cbe8047e": "testValidation()", +"cbe8623f": "divUp(uint256,uint256)", +"cbe9ef39": "BasicCoin(uint256,address)", +"cbea4412": "getItemHolders(uint256)", +"cbeb5749": "ShoreCoin(uint256,string,uint8,string)", +"cbebc563": "computeTraitScore(uint256,uint256,uint256)", +"cbec09a7": "bonus01()", +"cbec455f": "continueCrowdsale()", +"cbec72f3": "ownerHasClaimedTokens()", +"cbec78b9": "requestPrice(string,string,int256)", +"cbecb89e": "refferal(uint256,address)", +"cbed1568": "addAdminWhitelist(address)", +"cbedbf5a": "sendMoney()", +"cbeea68c": "permit(address,address,bytes32)", +"cbefe55c": "calcTokenRate()", +"cbf09802": "rateOf(address)", +"cbf0b0c0": "kill(address)", +"cbf0fa2d": "totalWageredForAddress(address)", +"cbf1304d": "balances(address,uint256)", +"cbf1382f": "founderStorageVault()", +"cbf1591d": "setDenyContract(bool)", +"cbf21837": "isSelling()", +"cbf26c0b": "DeviceOwner()", +"cbf2ad23": "confirmedBy()", +"cbf2b203": "Crowdsale(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"cbf33562": "addTrustLink(address,bool)", +"cbf346cc": "_sellCrowd(uint256,address)", +"cbf4531d": "dividendsAmount(address)", +"cbf66a02": "withdrawRune()", +"cbf6fff9": "SALE_SUPPLY()", +"cbf7c9a7": "isUserKyc(address)", +"cbf7cc2e": "deployFinished()", +"cbf7f009": "FAPFounder()", +"cbf89ed8": "DividendDeposited(address,uint256,uint256,uint256,uint256)", +"cbf9051c": "setPublisherRewardPool(bytes32,uint256)", +"cbf93c9b": "_claimExploreItemUsingEMont(uint256,uint256)", +"cbf97572": "HipsterFarmer()", +"cbf9a125": "queryChibiAdd(uint256)", +"cbf9b6dd": "getRecorderAddress(uint32)", +"cbfa18ea": "contractRefundFinished()", +"cbfa3c9c": "scaling()", +"cbfba0e1": "withdrawFee(bytes8)", +"cbfc12ba": "Soniq()", +"cbfc4bce": "gift(address)", +"cbfd14a2": "publicSaleSupply()", +"cbfd79e2": "AirdropFan()", +"cbfe6d41": "documentExists(bytes32)", +"cbfebb34": "setETHRate(uint256,uint256)", +"cbff158f": "addPollOption(uint256,bytes)", +"cbff17fa": "_setMinted(uint256,address)", +"cbff2cfc": "_getValueEther(uint256,uint256)", +"cbff69db": "contributionAt(uint256,uint256)", +"cbffb1ae": "updateConflictResolution(address)", +"cc00814d": "setPublicOfferLimit(uint256,uint256)", +"cc00ce12": "set_arbits_sale_open(bool)", +"cc01e39f": "availableAmountToCollect(uint256)", +"cc0238be": "getsumdata2(bytes32)", +"cc027cc9": "register(address,uint256,address,address)", +"cc02d73f": "setColorContract(address)", +"cc03477d": "nMsgsWaiting()", +"cc03c342": "setPlatformAddress(address)", +"cc05d836": "executeOrder(bool,address[3],uint256[4],uint256,uint8,bytes32,bytes32)", +"cc062b58": "enableSelling()", +"cc06c359": "maxLevel()", +"cc06f5ea": "getPeriodReceivedBalanceFor(uint256,address)", +"cc071051": "purchaseWolk()", +"cc075fa7": "stopTeamTrade()", +"cc07a94d": "_createMobster(string,address,uint256,uint256)", +"cc07dc37": "userReferralsWei(address,address)", +"cc08ebf6": "CryptoSportZ()", +"cc09c6b3": "OXO(uint256,string,string)", +"cc0a26d1": "CurrentMined()", +"cc0b2c9f": "tokenToOwner(uint256)", +"cc0b5a5f": "cancel(uint256,address,address)", +"cc0b94b7": "getChannelStatus(bytes32)", +"cc0b9dff": "addExitToQueue(uint256,address,address,uint256,uint256)", +"cc0bb8e5": "proof_of_public_key2()", +"cc0d0c90": "BlueTitaniumClassic()", +"cc0e13e2": "enableMaintenance()", +"cc0e1f66": "startOver()", +"cc0e24e1": "CheckDOT(bytes32)", +"cc0e97c9": "logicContract()", +"cc0f1786": "feeDecimals()", +"cc0f65f7": "GetMinerData(address)", +"cc10145f": "ownerWithdrawRune()", +"cc1027ea": "_validateReferrer(address)", +"cc105441": "MMOcoin()", +"cc10d53d": "IsPatient(address)", +"cc10e401": "create(string,bool)", +"cc11298e": "getRewards(uint256,uint256)", +"cc121ac1": "unsoldTokensVault()", +"cc129f4d": "radd(uint128,uint128)", +"cc130482": "SUNX()", +"cc131be1": "CreateNewDraw(uint256)", +"cc135555": "currentGene()", +"cc1423bf": "releaseBubToken()", +"cc143ce9": "NewXRateProvider(address,uint16,address)", +"cc147334": "payAllRewards()", +"cc148bf4": "awardBalanceOf(address,uint8)", +"cc14a7a3": "paidAddress()", +"cc151c82": "tokensToSellOnce()", +"cc15bee7": "isPurchasingPaused()", +"cc15c26c": "buyTokensReserve()", +"cc15d080": "getEmployeeInformation(uint256)", +"cc1602df": "lotteryCore()", +"cc16e6e1": "TOTAL_RESERVE_FUND()", +"cc16f5db": "Burn(address,uint256)", +"cc17aa28": "numAdoptedAxies(address,uint8,bool)", +"cc181ca8": "king()", +"cc189d00": "Vault(address,uint256)", +"cc198380": "totalSoldSlogns()", +"cc1b63d5": "setStakeStartTime(uint256)", +"cc1b8de6": "freedWosPoolToTeam()", +"cc1bc747": "deallocate(address,address)", +"cc1c0937": "NeuralToken()", +"cc1d050d": "startBlockProfit()", +"cc1d1e18": "_getCurrentTokenPrice()", +"cc1d4c02": "certified(address)", +"cc1ef080": "startPreSTOSale()", +"cc204cc2": "amountsWithdrew(address)", +"cc20d075": "getChannelId(address,address,uint8)", +"cc212a48": "disburseFunds(uint256)", +"cc21a9a2": "_weekFor(uint256)", +"cc21e972": "US_INSTITUTIONAL()", +"cc234ee1": "setICORunning(bool)", +"cc23a690": "releaseValue2()", +"cc23b75b": "HARD_CAP_IN_TOKEN()", +"cc242f40": "CardsRead()", +"cc24f571": "releaseTenPercent()", +"cc255b38": "testBazMethodId()", +"cc25decd": "SampleOffer(address,bytes,uint256,uint256,uint256,uint256,uint256)", +"cc268393": "setDescendant(address)", +"cc2761a4": "test_me(int256)", +"cc27f97b": "LSYP()", +"cc289fa9": "getPartnerAddressStatus(address)", +"cc293aea": "setRenewalsCreditAffiliatesFor(uint256)", +"cc2942da": "SetAElfCommunityMultisig(address,address)", +"cc29a0e6": "transferTTProduction(address,address,uint256)", +"cc2a9192": "LogWinnerPaid(address)", +"cc2aa2c7": "NAMINORI()", +"cc2b20ff": "refferBonusFunction(uint256)", +"cc2c2058": "addSpinner(string,uint256,address,uint256,uint8,uint8,uint8)", +"cc2c2bcf": "MotionFactory(string,string,string)", +"cc2c5453": "add_sword(uint16)", +"cc2dcd7e": "removeSideService(address,uint256)", +"cc2e08ea": "getRecTransactionData(uint256)", +"cc2e15cc": "getSponsorableJobs(address)", +"cc2eacb1": "setReferralPercent(uint16)", +"cc2f5029": "updateNoteMetadata(uint64,uint16)", +"cc2f5186": "Balances(address,address,address)", +"cc2fd120": "unofficialUserSignUp(string)", +"cc304924": "DocumentAdded(uint256,string,uint256)", +"cc305ae6": "userAssignElement(uint256,uint256,address)", +"cc308a54": "whitelistStartBlock()", +"cc30eeb1": "isEligibleForRepayment(uint64)", +"cc3154f8": "attendeesList()", +"cc326e1c": "currentPhaseRate()", +"cc328f2f": "b531647b()", +"cc32f8ad": "transferMoneyForTaskSolutions(string,uint256)", +"cc33ad3d": "DSP(uint256,string,string)", +"cc33c875": "tokenInfo(uint256)", +"cc341430": "coordinatorAgreeForEmission(address)", +"cc342eba": "RoseToken()", +"cc3451d6": "MultiverseToken()", +"cc3471af": "maxClaimBlock()", +"cc348429": "Ethmall(address,address,address,uint256,uint256,uint256)", +"cc34a247": "icoEndTimestampStage1()", +"cc34f810": "AllstocksToken()", +"cc361cc4": "getTotalBonusPerShare()", +"cc364f48": "getRange(uint256)", +"cc36809f": "fee_msg()", +"cc36a328": "team0Query()", +"cc36f8eb": "ArtCoin()", +"cc373d79": "withdrawCommissions(uint256)", +"cc38639f": "newTuneOption(uint32,uint32,uint256,bool,bool,uint128,uint64)", +"cc38c8a0": "insuranceAccount()", +"cc3938f9": "chkLockedA(address,uint256)", +"cc397ed3": "getCurrentFor(address)", +"cc3a0c8d": "customerExchangeEther(uint256,address,string)", +"cc3ad9a1": "unPackParams(uint256)", +"cc3b8806": "getCertificateMetaDataCount(bytes32,bytes32,bytes32)", +"cc3bb31a": "crowdsaleStart()", +"cc3bde3d": "TOTAL_SUPPLY_LIMIT()", +"cc3bf9e9": "redeem(bytes32,address)", +"cc3c2c01": "getValidityBondFloor()", +"cc3c59cc": "Paymec()", +"cc3c7098": "createTokenToMarket2021()", +"cc3c74a1": "proposalNonce()", +"cc3ccf57": "previous_owner()", +"cc3d2721": "minWithdraw()", +"cc3d574b": "ElectedBoardController(address,address[],uint256,address)", +"cc3d967b": "getUserDetails(address)", +"cc3df01f": "issueToken(uint256)", +"cc3e378e": "hasEnoughFundsToStart()", +"cc3eacbb": "getOraclizeFee()", +"cc3efd6b": "PUKCoin()", +"cc3f44bf": "getGoldStatusMinted(address)", +"cc3f51d0": "hitPotProcess(string,bool,uint256)", +"cc3fa0fd": "NobleAssetsCoin(uint256,string,string)", +"cc3fdd4c": "buyFeePercent()", +"cc41a396": "rateStage3()", +"cc41d3b2": "refundPreIco()", +"cc422cc2": "coeRemainingAtCurrentRate()", +"cc423c28": "setSchellingExpansion(uint256,uint256)", +"cc42e83a": "withdrawWinnings()", +"cc436196": "initialFundsReleaseDenominator()", +"cc436e42": "memberIsActive(uint8)", +"cc442c3f": "ICO_PRICE4()", +"cc445611": "purchase(bytes32)", +"cc44b15b": "setCode(address,bytes32,uint256)", +"cc44fd2b": "changeManagement(address)", +"cc451581": "getCurrentBigPromoBonus()", +"cc4580c8": "getBetsLength()", +"cc459696": "contentCount()", +"cc466256": "_roll(address,uint256,uint256,bytes32,bytes32,bytes,bytes32,uint256)", +"cc4720c7": "calculateRewardTokens(uint256,uint8)", +"cc47a40b": "reserve(address,uint256)", +"cc47de73": "ExpandT()", +"cc490e64": "getSplitCount()", +"cc494291": "setJobController(address)", +"cc4999ea": "getTradingInfo(uint256)", +"cc49ede7": "getVesting(address)", +"cc4aa005": "getDestroySharesOwnerValue()", +"cc4aa204": "ERC20()", +"cc4b998a": "titleIds()", +"cc4bf6a3": "miningTen()", +"cc4c1c05": "SwytchToken()", +"cc4cc05f": "collectToken()", +"cc4d233c": "Reclaimed()", +"cc4d819c": "tokensPurchased()", +"cc4d96df": "_refreshVoteForVoter(uint256)", +"cc4da8f4": "EventWinReward(address,uint256)", +"cc4e0008": "Ticket(address)", +"cc4fa81b": "exchangeCalculator(uint256,uint256,uint256)", +"cc4fbc43": "acceptTokenPayment(address,uint256,address,uint256)", +"cc5061da": "voteForUser(uint16,address)", +"cc50dacb": "buyCar(uint32)", +"cc50fc28": "mintInternal(int256,address,uint256)", +"cc537821": "buyNextRank()", +"cc539eb1": "replaceAccount(address,address)", +"cc552c8e": "setHardCapUSD(uint256)", +"cc5530eb": "endPreSaleStage()", +"cc577f38": "addPresaleAmount(address,uint256)", +"cc57e4f8": "increasePregnantCounter()", +"cc58bcf8": "getCurrentLevel(uint256,uint256,uint256)", +"cc5a02cb": "withdraw(address,uint8)", +"cc5a7051": "_setMinDailyPerUser(uint256)", +"cc5a7804": "payoutTokens(address,uint256,uint256)", +"cc5aba27": "ConstructorTest(uint256,uint256,string,string)", +"cc5b13a0": "PAYOUT_DELAY_INTERVAL()", +"cc5b2292": "DepositForDividends(uint256)", +"cc5b542e": "toBeDistributed()", +"cc5c095c": "mintableSupply()", +"cc5c4224": "setFreezingManager(address)", +"cc5c4a6b": "attachPresale(address,address)", +"cc5cab33": "userRewarders(address,uint32)", +"cc5cee0a": "calculateEthereumReceived(uint256,uint256)", +"cc5f0240": "batchCancelVoteForCandidate(address[],uint256[])", +"cc5f09fb": "getNbCitizensLocation(string)", +"cc5fc0d7": "updateInvestBalance()", +"cc603ed5": "collectRate(address)", +"cc61d0cb": "changeMinWithdraw(uint256)", +"cc620704": "joinToTrack(bytes32)", +"cc6266a1": "getHashFromData(bytes32,bytes32)", +"cc6305ed": "getNumTicketsPurchased(uint256,address,address)", +"cc634dac": "get_kek()", +"cc63604a": "canExecute(uint256)", +"cc638e03": "rublaJEPoken()", +"cc63996e": "getHairValue(uint256)", +"cc63a3c9": "set_token(address)", +"cc642cc2": "numHolders()", +"cc64cfcb": "getDeployedMarriages()", +"cc64e2d5": "depositEthers(address)", +"cc657697": "GetMatchLength()", +"cc657e62": "sendToken(uint256,uint256)", +"cc668524": "verifyPosition(uint8,uint64,uint64,uint64)", +"cc66d3c7": "buyEngineer(uint256[8])", +"cc66ec47": "TerraformReserve(address)", +"cc677679": "setEMAPeriods(uint256)", +"cc679ffc": "TUPC()", +"cc67b1bf": "getTransferPerc()", +"cc69084f": "PHASE_CLOSED()", +"cc691763": "draw(uint32,uint8,bytes32)", +"cc6c010d": "ATMGold(uint256,string,uint8,string)", +"cc6c8e31": "NFXCoinToken()", +"cc6ca7b7": "specialBaseLayer(uint256)", +"cc6cf340": "BERTCLUBCOIN()", +"cc6d7850": "burnILF(address,uint256)", +"cc6d8ba6": "inheritInvestorPosition(uint256)", +"cc6da375": "recipientVIP(address)", +"cc6db55f": "setJackpotModulo(uint256)", +"cc6e15e5": "setDelayedTokenAllocator(address)", +"cc6e6f25": "Withdraw_5()", +"cc6e70e8": "MSTCOIN()", +"cc6e8593": "lawSupportProfitAddress()", +"cc6ec39a": "switchToGame(string)", +"cc6eced7": "priceOfTeam(uint256)", +"cc6f0ed0": "BirthdayCandy()", +"cc70993d": "earlyTimeLock()", +"cc70bb1a": "publish(string,string,string,address)", +"cc70decb": "showBonus(address)", +"cc7188a5": "unLinkFromMasterWallet(address)", +"cc724b27": "isTesting()", +"cc72c918": "queryOwnerAddr()", +"cc72ecb0": "purchaseStartBlock()", +"cc741c9c": "getDidClaimBooty(address,uint256)", +"cc743a86": "ICO_PROMO_REWARDS()", +"cc74e2ca": "min_refund_block()", +"cc750395": "setMonthOpen(uint256,uint256,uint8,uint256,uint256)", +"cc754a28": "ICOStartTimeChanged(uint256)", +"cc755b70": "releaseFrozenBalance()", +"cc759458": "unconfirm(address)", +"cc759f88": "removeBools(bytes32[])", +"cc75ac19": "_withdrawAffVault(uint256)", +"cc75c4b1": "abc(uint256)", +"cc75cc9b": "SendmoneyCall(uint256)", +"cc764986": "updateEmaDailyYield(uint256)", +"cc774681": "mapCompletionNumberForWithdraw(address)", +"cc77b82d": "BEEFYToken()", +"cc783c5e": "setBankrollerContractOnce(address)", +"cc78cc98": "multisigPreICO()", +"cc7949ae": "round_count()", +"cc797d8e": "setMaxAttackPrizePercent(uint256)", +"cc798890": "queryAccounts()", +"cc79aa04": "getProposal(bytes32,bytes32)", +"cc79eaf0": "getColors(uint32)", +"cc7a060f": "ethersCollecteds()", +"cc7a2049": "permissionManager()", +"cc7b2ee7": "initAirdropAndEarlyAlloc()", +"cc7b41ec": "changeRollUnder(uint256)", +"cc7b60fe": "_emitWorkFinished(uint256,uint256)", +"cc7c4c39": "gotWinner()", +"cc7cd9f8": "fundingEthGoal()", +"cc7cddb8": "dive3(address)", +"cc7d1a0f": "currentHighestBid()", +"cc7e1b9a": "setRedemptionAddress(address)", +"cc7e2208": "Order()", +"cc7e492e": "refillInstantMintPool()", +"cc7e930c": "commitmentsOf(address,address)", +"cc7f365c": "VLADALINA()", +"cc7f593c": "setRequiredMajority(uint256)", +"cc7f608d": "setSaleType(uint8,uint8,uint32,uint256,uint256)", +"cc7f8266": "read_i8_array()", +"cc7fa928": "nbMonthsPay()", +"cc7fe38c": "addPresaleInvestor(address,uint256,uint256)", +"cc80f6f3": "show()", +"cc80f9e8": "ownerOfID(uint256)", +"cc81dbb5": "DEFROST_FACTOR_TEAMANDADV()", +"cc822f54": "changeYDistAddress(address)", +"cc826160": "ownershipDistributed()", +"cc82e72e": "SetPlatformInformation(string)", +"cc833e69": "Cryptonationz(string,string,uint8,address,address,address,address,address)", +"cc851cac": "SecuritiesVaultBank()", +"cc863948": "withdrawTokenShare()", +"cc86566c": "tempMngr()", +"cc8658b3": "chkStaff(address,address)", +"cc865b71": "withdrawRoundController(uint256,address)", +"cc872b66": "issue(uint256)", +"cc876ded": "born(uint256,uint256)", +"cc87ed82": "checkNumCards(uint256,uint8,uint8,bytes32,bytes32)", +"cc8818f6": "setReservefund(uint256)", +"cc88be52": "NuoBaoChainToken(uint256,string,uint8,string)", +"cc891023": "depositLock(address)", +"cc893855": "calculateTotalPayment(uint64)", +"cc896494": "_setGameOver()", +"cc89698c": "getTopicCount()", +"cc897e40": "END_SKO1_UNITS()", +"cc89d596": "getCryptantFragments(address)", +"cc89e8bc": "ecosystemTokens()", +"cc8a86a0": "Y2_release()", +"cc8af0fe": "bytesToUInt(bytes,bytes)", +"cc8b34ab": "CrowdCoin()", +"cc8b96e5": "prepare(uint256,address,address)", +"cc8baf63": "m_tokenDistributor()", +"cc8bd060": "setUnitsOneEthCanBuy(uint256)", +"cc8c0f9f": "transferLocked(address,uint256,uint8)", +"cc8c3c45": "getTokenIdsLength()", +"cc8c49aa": "sc(uint256,uint256,uint256,uint256,uint256)", +"cc8cd5c5": "withdrawDragonsFilm()", +"cc8ce27e": "CryptoChamps()", +"cc8ce862": "allowedGasPrice()", +"cc8e4bc2": "LOCKAMOUNT3()", +"cc8eac6c": "isSTOAttached()", +"cc8eb425": "newuser(address,address)", +"cc8f0b48": "withdraw(bytes32,address,uint8,bytes32,bytes32)", +"cc90050e": "GetCurrentRoomAndRound(address)", +"cc9062f9": "finalizeTransferChildrenOwnership()", +"cc90da29": "bonusNum()", +"cc90e725": "addProject(string,address)", +"cc91e91c": "Freezable()", +"cc925957": "logAccess(string,string,uint256)", +"cc92bad4": "updateParkingRate(uint256)", +"cc92ebad": "createCrowdsale(uint256,uint256,uint256,uint256,address,address,address)", +"cc937ccd": "Doves()", +"cc93ee70": "forwardCoins(uint256)", +"cc93f66e": "endTournament(uint256,uint256)", +"cc9415d0": "commitOn(uint256)", +"cc9425b7": "OCTACryptoToken()", +"cc949797": "balanceAffiliateOf(address)", +"cc94d923": "createTransaction(address,uint256,bytes32,address,address,address)", +"cc94e4a2": "set_sale_address(address,address)", +"cc954820": "changeFallbackDeposit(uint256)", +"cc95d8d1": "s36(bytes1)", +"cc96019f": "referralTokenWallet()", +"cc96b943": "offerOptionsToEmployee(address,uint32,uint32,uint32,bool)", +"cc976620": "usdPerEthCoinmarketcapRate()", +"cc97b38f": "BANCOR_X_UPGRADER()", +"cc97edbf": "bmi()", +"cc98c893": "developer_Transfer_ownership(address)", +"cc98ff20": "purchaseVillage(uint256)", +"cc991d8a": "BTestToken(uint256,string,uint8,string)", +"cc996d1b": "bids()", +"cc9a31a7": "isRepresentor(address)", +"cc9a88c9": "canSend(uint32,uint32,int256)", +"cc9ab267": "voteForCandidate(bytes32)", +"cc9ac376": "addLock(address,uint256,uint256)", +"cc9ae3f6": "getMyReward()", +"cc9b31c9": "exchangeFeeIncurred(uint256)", +"cc9b714c": "ClearAuth(address)", +"cc9b71c2": "TaskCoin()", +"cc9b7826": "setGuaranteedAddress(address,uint256)", +"cc9ba6b2": "buyRef()", +"cc9c0936": "startedWorkTS()", +"cc9c437c": "get_orderAddress(address,uint256,uint256,uint256,uint256)", +"cc9d7519": "getTierInfo(uint256)", +"cc9d858d": "FundsRegistryTestHelper(address[],uint256,address)", +"cc9de25d": "bytesToUint256(bytes)", +"cc9e735f": "decrementDate()", +"cc9f28ea": "getDeletedTeams()", +"cc9fd9d9": "onSetCredit(address,uint256)", +"cca07f44": "setSpecialLimits(address,uint256,uint256)", +"cca08d55": "updatesolsforhire()", +"cca0feb6": "updateTax(uint256)", +"cca10ba5": "getMultiSigBalance()", +"cca213a1": "setTranchTime(uint256[])", +"cca2194c": "getInvestorContribution(address)", +"cca26917": "getRoundBalance(address,address,uint256)", +"cca3e832": "_balanceOf(address)", +"cca40111": "_recharge(address,uint256)", +"cca41651": "addressPrivateSale()", +"cca470d2": "roundInvestorInfoByAddress(uint32,uint32,address)", +"cca4f3c5": "winthdraw(address,address,uint256)", +"cca5020b": "totalLBSold_PRIVATE()", +"cca520ee": "transferFromMoreThanAllowedTest(address)", +"cca5dcb6": "isTransferEnabled()", +"cca63f4f": "buyXname(uint256,uint256,string)", +"cca6ae0b": "getGPSMinEth()", +"cca746df": "getAnnualFee()", +"cca78d53": "getActiveListLength()", +"cca794da": "setGzeBonusOnList(uint256)", +"cca91579": "PlaceHolder(address)", +"cca97025": "_performTransferFromWithReference(address,address,uint256,string,address)", +"cca9943c": "wei25()", +"ccaa5135": "LIFECOIN()", +"ccaa5c65": "LomeliToken()", +"ccaab1ca": "companyPercent()", +"ccaaef45": "purchaseCompanyAdv(uint256,string,string)", +"ccab1be7": "SubmissionAccepted(address)", +"ccab841b": "divf(int256,int256,uint256)", +"ccabcfca": "XMLYBadge()", +"ccac77f5": "GooLaunchPromotion()", +"ccad19e4": "sendEtherFromAddContract(address)", +"ccadd6b1": "bet1Of(uint256)", +"ccadef15": "_setOCPTokenContract(address)", +"ccae794a": "showFPCount()", +"ccaee929": "JihoyContract()", +"ccaf4b03": "setIreg(uint256)", +"ccb00344": "changeEtsAddress(address)", +"ccb07cef": "crowdsaleClosed()", +"ccb0893d": "isUIntPrivate()", +"ccb13cbd": "_acceptAnchorAdmin()", +"ccb1c0a1": "getQuestion(string)", +"ccb1cbbc": "testFailBurnNoAuth()", +"ccb20e8e": "StormBrewCoin()", +"ccb22e37": "description3()", +"ccb2e9a4": "insertAccount(bytes32,string,uint256,string,string)", +"ccb3449e": "NewPresaleAllocation(address,uint256)", +"ccb50a29": "SIGMA_MAX_CARGO()", +"ccb53365": "startICOPhase()", +"ccb570e3": "transfer(uint256,address,address)", +"ccb60e39": "rentOutMultiple(address,uint256,uint256[])", +"ccb61dad": "MICRO_DOLLARS_PER_BNTY_MAINSALE()", +"ccb64997": "isBCDCToken()", +"ccb6cbe8": "icoBottomIntegerPrice()", +"ccb767ae": "transferTo(address,uint32)", +"ccb783a9": "setGPSStartTime(uint16,uint8,uint8,uint8,uint8,uint8)", +"ccb98ffc": "setEndTime(uint256)", +"ccbac9f5": "randomNumber()", +"ccbae5f6": "createEscrow(address,address,uint256,uint256)", +"ccbb41d0": "TOC()", +"ccbb52f5": "getGroupRates(uint256)", +"ccbba441": "setMigrateStage()", +"ccbd5152": "bankrollBeneficiaryAmount()", +"ccbd8d25": "setDropAmount(uint256)", +"ccbd8d29": "tokenAvatar()", +"ccbda1af": "getChannelByName(string)", +"ccbde432": "delete_candidate(uint8)", +"ccbe2a68": "kill(uint8[176],uint8)", +"ccbe4968": "Withdawal(address,uint256)", +"ccbfc6ed": "revokeSignature(bytes)", +"ccc08913": "Restricted()", +"ccc08974": "setGameActive(bool)", +"ccc108d7": "reopen()", +"ccc11f11": "hasAssetRights(address,bytes32)", +"ccc13814": "max(int256[])", +"ccc39b5d": "DonationClaimed(address[2],uint256[8],uint8,bytes32[2],uint256,uint256)", +"ccc51afb": "lookupFillingRing(address,uint256)", +"ccc54d69": "LOCKUP_3M_ICO_TIMESTAMP()", +"ccc55189": "Nation(address,address)", +"ccc5d05f": "testNoTokensNoCalls()", +"ccc61bef": "REWARD_WIN_MULTIPLE_PER()", +"ccc62bbe": "assertEq2(bytes2,bytes2,bytes32)", +"ccc643d7": "updateSaleTime(uint256,uint256)", +"ccc6ddf3": "createPromoPow(address,string,uint256,uint256,uint256,uint256)", +"ccc72302": "AUDITED_AND_REJECTED()", +"ccc8b33c": "buyXnameQR(address)", +"ccc924ef": "TokensUndelegated(address,uint256,address)", +"ccc9735d": "ERCSpammer(uint256,uint256,string,string)", +"ccc98790": "w(uint256)", +"ccca123b": "waitTime()", +"ccca237c": "foundationAsset()", +"cccb987f": "withdrawTwice()", +"cccc020f": "changeInsuranceFeesOperation()", +"cccc8f91": "getDappId()", +"ccccc36b": "createAcceptAndAdditionalsFromBytes(bytes,bytes,bytes,uint256[])", +"cccd2ea8": "getProductData(address)", +"ccce413b": "symbols(uint256)", +"ccce6458": "createKingdom(string,string,uint256,bool)", +"ccceee48": "lastBlock_v1Hash_uint256()", +"cccf3a94": "gasForCLOUD()", +"cccf7a8e": "has(uint256)", +"cccf88f9": "batch_refund_bix(address[],address,uint256[])", +"ccd15921": "addTransferAndCallWhitelist(address)", +"ccd1a621": "addguess(uint256)", +"ccd30a62": "getWhitelistedAddresses(uint256)", +"ccd331bf": "bountyAmount()", +"ccd385f5": "staff_3()", +"ccd3948b": "removeRestaurant(address)", +"ccd39537": "dilute(address,uint256)", +"ccd4020c": "PassTokenReborn(address)", +"ccd46ae4": "BuyTicketUseVault(uint256,uint256)", +"ccd65296": "initialize(uint256,uint256,uint256,uint256,address)", +"ccd6559b": "newRandom(string)", +"ccd65c0a": "activateMainSale()", +"ccd68f3b": "stamps(uint256)", +"ccd6aca4": "preSaleSecondCap()", +"ccd71e8c": "armySubmarinesCount(uint256)", +"ccd75361": "setFooInt(uint256)", +"ccd89ecd": "calculateManyHash(address,address[],uint256[],uint256,uint256)", +"ccd8ad0c": "setGenTime(uint256)", +"ccd8c186": "DebitCoinTokenGenesis(address)", +"ccd8e2cf": "AnmiToken()", +"ccd8ead7": "addToCategorie2(address,address)", +"ccd93998": "getRequiredSignatures()", +"ccd95a50": "sendTokenToMultiAddr(address[],uint256[])", +"ccd96ab0": "cite(bytes32,string)", +"ccd9aa68": "passedKYC(address)", +"ccd9d08f": "MLIOU()", +"ccda4b99": "getMethodValue(string)", +"ccda696b": "ownersTransfer(address,uint256)", +"ccdaeab0": "getTechBonus3(uint256)", +"ccdb05d4": "NokuCustomERC20(string,string,uint8,address,address)", +"ccdb3f45": "newAddress()", +"ccdbbff5": "securityTokensWallet()", +"ccdc535e": "placeBetV1(uint256,uint256,uint256)", +"ccdd1979": "multisend(address,address[],uint256)", +"ccdd49f2": "StyToken(address,address)", +"ccdd95d6": "releaseEnjinTeamTokens()", +"ccdf68f3": "isOutcomeSet()", +"ccdfcfa4": "returnFundsForAll()", +"cce0244d": "setSafeContract(address,bool)", +"cce0a1ca": "isPresaleSetup()", +"cce0c0fa": "addOneGame(string,uint256)", +"cce0cd0c": "blockVersion()", +"cce106f8": "AmountToLittle()", +"cce1dfd2": "minimum_token_sell()", +"cce21eda": "DividendsWithdrawal(uint256,address,uint256,uint256,uint256,uint256)", +"cce2270a": "isSecondStageFinalized()", +"cce2771e": "redeemUTXO(bytes32,uint8,uint256,bytes,bytes,bool,uint8,bytes32,bytes32)", +"cce29ea7": "preSaleEndTime()", +"cce2f8e3": "checkAddressMisused(address)", +"cce356b5": "getHodlers()", +"cce3906b": "hasWithdrawnRake()", +"cce3c13b": "isLeaf(uint256)", +"cce48e65": "GeeTestCoin()", +"cce4bd52": "reclaimFunds()", +"cce7db58": "swipe(address)", +"cce7ec13": "buy(address,uint256)", +"cce81927": "EtherDice(address,address)", +"cce91957": "take(bytes)", +"cce93ae1": "PeriodChanged(uint256,uint256)", +"cceb6368": "receiveTicket(address)", +"cceb9214": "setAuctionStatus(bytes32,uint8)", +"ccebca11": "Foo(address,bytes32,address)", +"ccec1461": "bulkEtherSender(address[],uint256[])", +"ccecc71f": "getPlayerPoints(bytes32)", +"cced2bb6": "LogOwnerRemoved(address)", +"cced9b63": "setBestMatch(uint256,uint256,address)", +"cceda56c": "CAPPED_SUPPLY()", +"ccedf3d2": "getChainCode(string)", +"ccee31e8": "setNbKingdomsType(uint256,address,bool)", +"ccee8047": "settleCall(uint256,uint256,address)", +"ccef6d63": "_isClientPaidUp(address)", +"ccf053ba": "TOTAL_TOKEN_SUPPLY()", +"ccf06abf": "canCompose(string,uint256[],address)", +"ccf0768a": "transferDividends(address)", +"ccf12304": "set_mint(uint256)", +"ccf1454a": "addressOf(string)", +"ccf1ab9b": "usurpation()", +"ccf1e80b": "JUNE()", +"ccf20872": "ChainKey(uint256,string,string)", +"ccf24838": "updateOwner(uint256,address,address)", +"ccf27a4e": "setPrice2(uint256)", +"ccf2b87b": "sendWithFreeze(address,address,uint256,uint256)", +"ccf41499": "TokenFactory(uint256,string,uint8,string)", +"ccf4a941": "getVendorApplication(string)", +"ccf4b70a": "RATE1()", +"ccf4f413": "setSubRegistrar(string,address)", +"ccf53a84": "getFile(uint8)", +"ccf5401e": "checkQuest(address)", +"ccf5c5cf": "registerConsumer(address,uint32)", +"ccf64316": "playerRollDiceSingle(uint256)", +"ccf670f8": "setLevelUpFee(uint256)", +"ccf69e9b": "randomContract()", +"ccf6b8b3": "CCCoinToken(string,string,uint256,uint256,address,address,address,address,uint256)", +"ccf7ba0f": "recoverPrice(address,address)", +"ccf7d0d4": "sendTokensAfterCrowdsale()", +"ccf7fe56": "JustinCoin()", +"ccf82afd": "WataexToken()", +"ccf8bcf3": "transferOVISBookedTokens()", +"ccf8e5d0": "CLITOKEN()", +"ccf8ef24": "undelegateVote()", +"ccf9f35f": "awardsCount()", +"ccfa8e71": "addBank(string,address,string)", +"ccfaa72f": "setRentalPricePerHour(uint256)", +"ccfbdb9e": "CrowdSaleDapCar()", +"ccfc0053": "withdrawMILs(uint256)", +"ccfc1e4e": "preSaleWeiCap()", +"ccfc811b": "registerParticipant()", +"ccfc8729": "registerWithToken(address,uint256,address)", +"ccfc9556": "USDChain(uint256,string,uint8,string)", +"ccfcbdbe": "canMakerTerminate(bytes32)", +"ccfdca9a": "setMinPaymentAmount(uint256)", +"ccfe4691": "CtfToken()", +"ccfed305": "CMDToken()", +"ccff361f": "AibitbankToken()", +"ccff42b2": "isValidAdapter(address)", +"cd008f1a": "getMine()", +"cd00ee0d": "startToken()", +"cd027be5": "getAllowAmount(address)", +"cd034234": "refundRequest()", +"cd0389fd": "metadataToken()", +"cd03b093": "getSupportersForTopic(string)", +"cd041ae9": "removeCooldown()", +"cd048de6": "setWord(string)", +"cd04ccfc": "newProposalEthUSDOracle()", +"cd05c214": "TOKEN_FOURTH_PRICE_RATE()", +"cd05d1eb": "shopPants()", +"cd062734": "getCallABISignature(bytes32)", +"cd0643ee": "takeInvestments()", +"cd066fd6": "computeInitialPrice(uint256)", +"cd0699e9": "OysterPrePearl()", +"cd06a7bf": "rewardsupply()", +"cd076620": "mint(address,uint256,int16,int16,int16,int16,int16,int16,uint256)", +"cd0845fd": "bool2str(bool)", +"cd09039b": "PayForFlag(string)", +"cd09263f": "rate_toCap()", +"cd0a314b": "walletBalance()", +"cd0c5896": "etherBalance(address)", +"cd0c870d": "XAP()", +"cd0e761d": "getCurrentContextAddress()", +"cd0e8900": "DEFACTO()", +"cd0ee59b": "_payByErc20(uint256)", +"cd0f26c6": "setRedemptionContract(address,address)", +"cd0f5abd": "DTCC()", +"cd0fdc24": "getPaintingArtistId(uint256)", +"cd0ffdba": "NukTestToken()", +"cd103b4d": "RateToken(uint256)", +"cd11731d": "setPlayerBookAddress(address)", +"cd11c85d": "timeTillNextAttack()", +"cd12efc8": "getsecond(uint256[])", +"cd132aad": "addPrivateSale(uint256)", +"cd133c8f": "buyXid(uint256)", +"cd13592a": "claimTokensByUser()", +"cd13c6f8": "wildlifeconservationToken()", +"cd152c0a": "getPreAuthorizedAmount(address)", +"cd154c59": "mainSaleExchangeRate()", +"cd15c6ab": "MANACrowdsale(uint256,uint256,uint256,uint256,uint256,address)", +"cd15fc71": "ContractFeatures()", +"cd16ecbf": "setNum(uint256)", +"cd17c4b6": "numOfTokens()", +"cd180fdc": "transferTokensFromAdvisorsAddress(address,uint256)", +"cd1814d7": "selfDestroyTime()", +"cd187043": "_price_token_ICO1()", +"cd18c168": "TakeEth(address,uint256)", +"cd18d5a4": "airDrop(address)", +"cd197ff6": "fechVoteInfoForVoter(address)", +"cd1a4e4d": "setHyperDisbursementAddress(address)", +"cd1a5cad": "PricingStrategy(uint256,uint256,uint256,uint256,uint256,uint256)", +"cd1a8ad7": "EGGS_TO_HATCH_1SNAKE()", +"cd1b9311": "challenge(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[])", +"cd1ce6d5": "setAdvisorFee(uint256)", +"cd1dc527": "isTokenAddressAlreadyInList(address)", +"cd1e0355": "totalRefundedAmount()", +"cd1e0717": "getRequester()", +"cd1e484b": "reserveStarsForOwner(uint256)", +"cd1f63dc": "getMinBuy(uint256,uint256)", +"cd1f8393": "logsCount()", +"cd1f9a57": "totalContractHolders()", +"cd1fca94": "BETNetworkTeamAddress()", +"cd1fdc14": "_claimReward20(address,string)", +"cd2057d0": "fail(bytes)", +"cd20b24b": "saosao5()", +"cd22ccea": "GameRoll(address,uint256,uint8,uint8,uint256)", +"cd22f418": "_getAllRevisionTimestamps(bytes32)", +"cd22f536": "addProductByRegulator(string,uint256,string,string,string,string)", +"cd230ebd": "tokensClaimableAfter()", +"cd233e25": "oraclize_gaslimit()", +"cd23dde0": "create(string,uint256,uint256,address,uint256,uint16,uint8,uint256[3],bool)", +"cd257213": "RemoveTickets(uint256)", +"cd25f56e": "OptionExercise(address,uint256)", +"cd26e1a8": "SECURITY_ETHER_CAP()", +"cd271488": "newSaleProjects(string,string,string,uint256)", +"cd277e6c": "addSolution(bytes32,address,uint32)", +"cd27d1a0": "setMaxRaiseAmount(uint256)", +"cd27f1d9": "cappedTokenSupply()", +"cd29c71a": "metadataUrl()", +"cd2a0c29": "purchase_with_eth(uint256,address,uint256,uint256,uint256,address,bytes)", +"cd2a11be": "EnableTrade(bool)", +"cd2a68e5": "withdrawBillionsCoins()", +"cd2a7a61": "broadcastState(bytes)", +"cd2ab49e": "setupBankrollInterface(address)", +"cd2b5a82": "weiToDistribute()", +"cd2cdd5b": "claimOwnershi()", +"cd2cde48": "authorizeIcoBurn()", +"cd2d5291": "walletAdvisor()", +"cd2d8a2d": "historyId()", +"cd2ec3fe": "runAnnualInflation()", +"cd2f0710": "getItemById(uint256)", +"cd2f5f2b": "clearFooArray()", +"cd2f7357": "tokenTransfer(address,uint256,uint256)", +"cd2f7c1a": "Census()", +"cd306137": "initialiseGlobals()", +"cd31037c": "BlockScheduler(address,address,address)", +"cd313ad9": "listOfFunds(uint256)", +"cd31f391": "SixtyPercentRules(address)", +"cd3265a3": "setUpgradeTarget(address)", +"cd327398": "addExceptions(address[])", +"cd3293de": "reserve()", +"cd336707": "reopenContributions()", +"cd342917": "Lesson(address,uint256)", +"cd35c5e9": "Eurotrad()", +"cd3651a7": "setLevelBonusJPYC(uint256,uint256,uint256,uint256)", +"cd367936": "fundICO(address)", +"cd37dcb8": "peCap()", +"cd3882d5": "stage4()", +"cd38aa87": "chooseWinner()", +"cd394a41": "ETH10K()", +"cd395a96": "_transferAndLock(address,address,uint256,uint256)", +"cd3a1dde": "MaxAirDropXblock()", +"cd3a376a": "changeSeller(address)", +"cd3a7531": "loadVotesForParticipantVerify(bytes32,bytes32,uint8)", +"cd3b0309": "CTokenCoin()", +"cd3c3011": "getPublishTime(bytes32)", +"cd3ce306": "redeemEther(bytes32,address)", +"cd3cf20e": "messageWithinLimits(uint256)", +"cd3de8d5": "payToController()", +"cd3e0155": "BucketDestroyed(bytes32,uint256)", +"cd3e45c5": "getTop10Messages()", +"cd3f7a50": "DepositMTU(uint256)", +"cd3fe21d": "getTotalNumberPlayed(uint256,uint256)", +"cd40137f": "resetTimeSeal()", +"cd402189": "list_files()", +"cd402c8e": "payoutSize(address)", +"cd40a48d": "send1Mil(address)", +"cd41ada1": "addressDividendReserve()", +"cd4217c1": "freezeOf(address)", +"cd423c99": "getDistributedOreBalances(address)", +"cd42693d": "victorieumToken()", +"cd43def3": "updateServiceTokensPerCredit(address,uint32,uint256)", +"cd43ebf9": "totalSpankStaked()", +"cd43ee99": "isAffiliateProgram()", +"cd45376c": "sellWine(uint256)", +"cd45e561": "CHSToken()", +"cd45fcdb": "Fxxk2Token()", +"cd46abe4": "ecosystemPercentOfTotal()", +"cd46d7e5": "approveByIndex(uint256)", +"cd474b04": "chainStartBlockNumber()", +"cd47c0e1": "cooRemoveReviewer(address)", +"cd47f390": "rescueLostKydy(uint256,address)", +"cd482d9f": "getLLV_edit_2()", +"cd48578f": "MaxEth()", +"cd495391": "setNonlistedUser(address)", +"cd496e35": "votePositionOf(uint256,uint256)", +"cd497999": "isHardCapGoalReached()", +"cd499523": "userList(address,uint256)", +"cd4aed30": "errorWithMessage()", +"cd4b3c57": "newSubdomain(string,string,address,address)", +"cd4b6914": "getRandom(uint256)", +"cd4c04c6": "Appoint(uint256,address)", +"cd4c4c0c": "getCurrentBucket()", +"cd4d0570": "getbuynode(address)", +"cd4d1664": "EconomyRebated(string,string,string,string,string)", +"cd4d4b46": "BONUS_CAP()", +"cd4d6895": "verifyEIP20(address)", +"cd4e28b5": "setNextBidExpireBlockLength(uint256)", +"cd4e396b": "USER_ACQUISITION()", +"cd4f5e90": "MTToken()", +"cd4fb3be": "newBurnableOpenPayment(address,string,uint256,uint8,uint256)", +"cd501bf7": "SignalsCrowdsale(address,address,address,address)", +"cd503c0b": "claimFees(bytes4)", +"cd504bd8": "getPhasePricesPeriods(uint256)", +"cd50d44f": "CheckRepresentment()", +"cd51bcae": "setBuyRequestLimit(uint256)", +"cd51f084": "owner_freeze_term()", +"cd5286d0": "getAsset(string)", +"cd53a3b7": "makerWithdrawAsset(uint256)", +"cd53ac45": "MANHATTANPROXYFDR()", +"cd53e455": "receivedEther()", +"cd5406e4": "getBalanceAtSnapshot(address)", +"cd54c54e": "setCirculationCap(address,uint256)", +"cd550cc8": "XferMoneyTeamAddress()", +"cd55205b": "KotET()", +"cd559561": "getPeers()", +"cd55cda2": "determineFinalOutcome(uint256)", +"cd56028f": "ArjToken()", +"cd560862": "EZ25COIN()", +"cd5617b6": "STCDR()", +"cd5655da": "setPixelBlock(uint256[],uint256[],uint256[],uint256[])", +"cd565bc5": "determineAffID(uint256,uint256)", +"cd5681d5": "mintRefs(bytes32)", +"cd568d0f": "submit(string,int8,int8,int16,string)", +"cd56f019": "getDefaultClaim(address)", +"cd572a07": "BOF()", +"cd575c32": "mintGem(uint256,string,uint256,bool,uint256)", +"cd576dd0": "IPAC()", +"cd5777e2": "allocateTokensToInvestors(address,uint256)", +"cd57a448": "SwapContract(address,uint256)", +"cd57a650": "BasilNetwork()", +"cd584045": "enableApproval()", +"cd586a50": "OnliCoinToken()", +"cd58a867": "internalAssignTokens(address,uint256,uint256,uint256,uint256)", +"cd58e75b": "newBurnableOpenPayment(address,uint256,uint8,uint256,string)", +"cd591822": "CanaryV7Fast()", +"cd59bf5b": "getNowFromOwner()", +"cd5a489d": "killContract(bool)", +"cd5a57cb": "registerOpinion(uint256,string)", +"cd5a9bf3": "isCurrentOrPastAccountMinter(address)", +"cd5ab612": "buyEmptyPixelArea(uint256,uint256,uint256,uint256)", +"cd5acd4d": "setKey(bytes32,bytes32,bytes)", +"cd5b4ae0": "zHQPreSale()", +"cd5b8837": "distributeGREEN(address[],uint256,uint256)", +"cd5ba752": "firstPlacePot()", +"cd5ba978": "presale_end_block()", +"cd5bfb63": "tokenIdOf(bytes32)", +"cd5bfbe4": "initialVestAmount()", +"cd5c222f": "msgMap(uint256)", +"cd5c4c70": "deleteOwner(address)", +"cd5d6c2b": "betInfoIsLocked()", +"cd5d950f": "TaxiToken()", +"cd5dba1e": "WhiteElephant()", +"cd5dd1d0": "showMsgSender()", +"cd5e2038": "t_ImmlaTokenDepository2()", +"cd5e3c5d": "roll()", +"cd5ebd93": "calculateTimeout()", +"cd5ecd60": "theWinnernumber()", +"cd5f49d5": "transferRewards(address,uint256,uint256)", +"cd5f5c4a": "tryGet(bytes12)", +"cd60aa75": "TokenPurchase(address,uint256,uint256)", +"cd60fe35": "MAX_TOTAL()", +"cd619681": "count_nodes()", +"cd61a95a": "sellOrder(uint256,uint256)", +"cd61cb3a": "setTokenUpgrader(address)", +"cd62b382": "Sunset(bool)", +"cd634920": "buyLeader(uint256,uint256)", +"cd635b71": "ownerShipTransfer(address)", +"cd639e6c": "EthFundTransfer(uint256)", +"cd639e8c": "transferByInternal(address,address,uint256)", +"cd63acf9": "buyChest()", +"cd63d930": "distributionCap()", +"cd64b135": "_depositToken(address,uint256)", +"cd64d952": "buildConnection(address,address,address,int256,uint256,uint256)", +"cd6566b0": "battle(bytes8,bytes5,bytes8,bytes5)", +"cd65908e": "changeIPFS(string)", +"cd65bb67": "ViewToken()", +"cd67571c": "accept(address,uint256)", +"cd679413": "ASHLEY_ALLOCATION()", +"cd67e55e": "LSTRatePerWEI()", +"cd67f3bc": "LimingCoin()", +"cd68100c": "lastAddress()", +"cd69859e": "vestedAdvisors()", +"cd69a7f1": "weightsApportionDecimals()", +"cd6a7ca7": "allowance(address,address,address,address)", +"cd6c4bb0": "startSettlementPreparation()", +"cd6c8343": "getAttributeValue(address,uint256)", +"cd6d7f81": "PRICE_FACTOR()", +"cd6dc687": "initialize(address,uint256)", +"cd6dca9e": "SaleFinalised(address,address,uint256)", +"cd6e05e2": "totalPotAwayTeam()", +"cd6e4dad": "LBCToken(address,address)", +"cd6e8855": "setMedications(bool)", +"cd6ebff6": "betAmountAtNow()", +"cd6ee0c2": "WISDOM()", +"cd6f4e0d": "dragoCount()", +"cd6f7c50": "GeneNuggetsToken()", +"cd6f7fdb": "applyKarmaDiff(address,uint256[2])", +"cd6fafa2": "XXXXXXXX04()", +"cd6fc2d1": "addMiningWarPrizePool(uint256)", +"cd704cb4": "getGeneralRelation(uint32)", +"cd71a397": "contract6function1()", +"cd71a471": "withdrawMkt(address,uint256)", +"cd72250d": "multiTransfer(address[],address[],uint256[])", +"cd728815": "setSubContractAddresses(address)", +"cd7292a0": "ChessLottery()", +"cd729a91": "unlockedTeamAllocationTokens()", +"cd72ab69": "etherRaised()", +"cd73d26c": "blocksPerDeal()", +"cd73df78": "getAllUsers(bool)", +"cd74096a": "getDataHoldersRefBonus(address)", +"cd755b41": "subs(address,address)", +"cd761b9c": "Grass()", +"cd762827": "joinGame(address,uint256)", +"cd76635b": "_setAddr(address)", +"cd76aa16": "getTotalCollected(uint64,address)", +"cd76faf5": "listActiveEggs()", +"cd7724c3": "getEthToTokenInputPrice(uint256)", +"cd77521a": "setFSTAddress(address)", +"cd77a0c8": "purchaseToken(address)", +"cd7805bc": "pinged(address,uint256,uint256,uint256)", +"cd781bf3": "pullEntry(uint256)", +"cd784d1b": "isSuperUser(address)", +"cd78a3b7": "processVote(bool)", +"cd79f86d": "submitPkgHash(string,string)", +"cd7a2c3b": "ResumeICO()", +"cd7b6744": "lockGlobalToken()", +"cd7ba8fd": "currentBlockHashCst()", +"cd7c92e3": "requestPrice(uint256)", +"cd7d5b92": "STARTING_SWORD()", +"cd7da845": "throwsWhenFinalizingWithIncorrectCap()", +"cd7da914": "renounceArbiter(address)", +"cd7dfa31": "setStarDeleted(uint256)", +"cd7e3184": "getValueBonus(uint256)", +"cd7e9fa6": "RefondCoin(uint256,string,string)", +"cd7eac3a": "house_fee_pct()", +"cd7ec171": "developer_string_C(string)", +"cd7ecda0": "grantPromoPack(address,uint8)", +"cd7f85fa": "budgetMultiSigWithdraw(uint256)", +"cd7fa74b": "setPendingReview()", +"cd7fb38c": "isValidMatingPair(uint256,uint256)", +"cd7ff921": "stringIndexOf(string,string)", +"cd80da82": "tokenShare(address)", +"cd819bdd": "setaddrFWD(address)", +"cd82a778": "_allowTimelock(address,address)", +"cd836e15": "SHARDING_REWARD()", +"cd838f0f": "getNames()", +"cd83b57c": "TacoCoin()", +"cd84cff4": "wwwithdrawww(uint256)", +"cd852330": "buyFromTrusterDealer(address,uint256,uint256)", +"cd854072": "affiliatThreshold1()", +"cd8550b8": "setBonus(bool)", +"cd85e945": "EtalonToken()", +"cd863e25": "startOffering(uint256)", +"cd866ee1": "MaximCoin()", +"cd868648": "setEndBlockNumber(uint256)", +"cd86eee2": "tokenCreationMinMile1()", +"cd871b16": "matchBytes32Prefix(bytes32,bytes,uint256,bytes)", +"cd875247": "OffGridParadise(string,string)", +"cd880b1e": "kcck256stradd(string,address)", +"cd881742": "teamTokensReleased()", +"cd88333e": "coldStore(uint256)", +"cd887739": "getExpertiseId(uint256)", +"cd88bac4": "teamTokensLockAddress()", +"cd897b75": "withdrawSubRound(uint256)", +"cd8aa272": "Icarus()", +"cd8b02c8": "Revoce()", +"cd8b0a77": "getProjectJudge(uint256)", +"cd8c063b": "isTransferAllowed()", +"cd8cc844": "lotteryStart()", +"cd8cdccd": "XiiPay()", +"cd8d3918": "calcLuckyCoinBenefit(uint256)", +"cd8d8da0": "tokenFallbackExchange(address,uint256,uint256)", +"cd8db998": "isDepositBlock(uint256)", +"cd8df8ec": "activateLastSale()", +"cd8e250a": "frozenBalancesOf(address)", +"cd8ed6f6": "addMarking(bytes32,bytes32,int256)", +"cd8f8b3c": "updateMintingAgent(address,bool)", +"cd8fce49": "Consents()", +"cd905dff": "isOperational()", +"cd9063f6": "replaceToken(address)", +"cd906676": "changelp1(address)", +"cd90b99d": "spawnInstance(address,uint256,uint256,uint256)", +"cd91672d": "firstStageDatetime()", +"cd91866a": "_startGameRound()", +"cd9217f7": "eventListener()", +"cd928f69": "updateAllowedTransfers(address,bool)", +"cd92dec0": "WaterMeterAcorn(address)", +"cd92eba9": "debtLedgerLength()", +"cd932c9c": "parseTimestampParts(uint256)", +"cd93307a": "EthereumSmart(uint256,string,string)", +"cd9354e4": "successesOf(address)", +"cd9380d5": "testSetBalanceSetsSupplyCumulatively()", +"cd93f6f3": "SetPoolEntryFee(string,uint256)", +"cd943e54": "transferToLock(address,uint256,uint256)", +"cd944e3b": "EXPERTS_POOL_TOKENS()", +"cd94a2a4": "owlToken()", +"cd953744": "getZTKCheck(address,address)", +"cd9548ce": "CompanyURL(string,string)", +"cd955faa": "hasSantaCoins(address)", +"cd9679dd": "issuePRETDETokens(address)", +"cd9745f2": "voteForTransaction(uint256)", +"cd9847bc": "testAccessControl()", +"cd98b214": "getMarketCreatorSettlementFeeInAttoethPerEth()", +"cd997aa3": "getData_31()", +"cd9a1b63": "devBalance()", +"cd9a1fa6": "countOfOwners()", +"cd9a27ba": "defaultRegionTax()", +"cd9a3c98": "any(bool[7])", +"cd9a7a56": "revokeOperatorByTranche(bytes32,address)", +"cd9b2f05": "addContributors(address[],bytes32[])", +"cd9c8d80": "VerifiedInfoHash(bytes32)", +"cd9d12f2": "icoStartUnix()", +"cd9d27ed": "setDelegadoDeDistritoVerify(bytes32,bytes32,uint8)", +"cd9ea342": "testMode()", +"cd9f05b8": "balanceEtherAddress(address)", +"cda0574e": "emitNominUpdated(address)", +"cda0eeaa": "gameMinBetAmount()", +"cda113ed": "globalBet()", +"cda2695a": "sponsor(address,uint256,uint256,uint256)", +"cda35494": "bonusMintingAgent()", +"cda368c3": "teamV()", +"cda3c001": "getUnsoldPeriod()", +"cda4351b": "ViewBetByID(uint256)", +"cda43ec5": "returnHrt(address,string)", +"cda4beef": "createAuction(uint256,uint256,uint256)", +"cda6239d": "getArrayOfTiers()", +"cda68e5d": "LogDecreaseCap(uint256)", +"cda6e92a": "sendTransaction(address,uint256,uint256,string,bytes)", +"cda78dea": "DTransport()", +"cda8300e": "Transfer_data_enabled()", +"cda87e33": "getConfigBoolz(bytes)", +"cda95d80": "Reserve()", +"cdab73b5": "blackList()", +"cdab9b5b": "setProviderName(uint256,string)", +"cdaba786": "addBet(uint256)", +"cdad5f94": "sendState(bytes,uint256,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"cdad6576": "changeBountyArbiter(uint256,address)", +"cdadb0fa": "right58(uint256)", +"cdaeb47d": "removeAddressFromMaster(address)", +"cdaf4028": "getMigrationCount()", +"cdb0ec6b": "getLinkedWallets(address)", +"cdb0fed9": "Livetest()", +"cdb230be": "DHAMAR()", +"cdb23c2d": "getMonarchyFactory()", +"cdb2867b": "canVote(uint256,address)", +"cdb294a2": "startDeal(bytes32,address)", +"cdb30482": "setBalancesUSD(address,address,uint256)", +"cdb3344a": "createGravatar(string,string)", +"cdb38f4f": "preICOTokenIssuedTotal()", +"cdb532b9": "deleteCharity(uint256)", +"cdb58e21": "DUBI()", +"cdb616b2": "ForkDelta(address,address,uint256,uint256,address)", +"cdb627b2": "showRecastConfigs()", +"cdb62c16": "getCashOutAmount(uint256)", +"cdb6753b": "setNav(uint32)", +"cdb75f2b": "NemoXXToken()", +"cdb7699a": "manualTransferTokensToWithBonus(address,uint256,uint256,uint256)", +"cdb78a2a": "giveNxc(address,uint256)", +"cdb7ef81": "getMinAuditPriceMax()", +"cdb80c51": "_service()", +"cdb88ad1": "setPauseState(bool)", +"cdb986cc": "getExperience()", +"cdb99909": "fstPrivateSalePortionNumerator()", +"cdbaed5a": "_isValidDepositCountry(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"cdbb02af": "getAddressCount()", +"cdbccf50": "unfreeze_end_date()", +"cdbce03d": "checkOwner()", +"cdbcff6d": "getQuotas()", +"cdbd0f0e": "getRatioOf(address)", +"cdbd1031": "craftTwoCards(uint256,uint256)", +"cdbd3fc9": "bax()", +"cdbd7516": "allowUsers(address,address[])", +"cdbdc7a4": "DeveciToken()", +"cdbdd569": "SetLastRoomAndRound(address,uint8,uint256,bool)", +"cdbdf391": "left34(uint256)", +"cdbf9c42": "multiply13(uint256)", +"cdbfd448": "memberLog()", +"cdc04961": "setStates(address[],uint8[],uint8[])", +"cdc0563a": "presaleTokenRate()", +"cdc06bdd": "CrypviserICO(address[],uint256)", +"cdc07bbc": "_destroy(address,uint256)", +"cdc18424": "withdrawer()", +"cdc25845": "setBuyPrices(uint256)", +"cdc26dcb": "dorcasToken()", +"cdc2895c": "getOffer()", +"cdc39f4a": "addCardSet(uint256,uint256,uint256,bytes32,string,address,uint8)", +"cdc3e046": "balanceMaxSupply()", +"cdc57fd3": "modifyTokenPrice(uint256)", +"cdc5c7cd": "updateLinkHash(uint256,bytes32)", +"cdc62c03": "getFeeToTokenConversion(uint256)", +"cdc62d39": "ballotDetails(uint32)", +"cdc68b85": "create_all()", +"cdc7076d": "getMilk()", +"cdc81bc2": "totalInVaults()", +"cdc86ec4": "tokenCreationMinPayment()", +"cdc89404": "round5StartTime()", +"cdc8d357": "mintVerify(address,address,uint256,int256,uint256,int256)", +"cdcb3cdb": "crowdsaleSupply()", +"cdcb7c8f": "chase()", +"cdcb8788": "nextRoundFee()", +"cdcbac0d": "phase3StartingAt()", +"cdcc599b": "YunnimToken()", +"cdcc5d3e": "getTokenHolderTribunal()", +"cdcd77c0": "baz(uint32,bool)", +"cdcda9a8": "DogeCash(uint256,string,string)", +"cdcdb463": "getRiskParameters(bytes32)", +"cdce240c": "WillCoin(string,uint256,string,uint8)", +"cdce5206": "getUserNum()", +"cdcf0c4a": "dispute(string,address)", +"cdcf4b9b": "priceDenominator()", +"cdcf5794": "checkCooldown(address,address)", +"cdd11b83": "roundTotalWinnings()", +"cdd13589": "batchDistributeWithAmount(address[],uint256[])", +"cdd13673": "rewardReductionRate()", +"cdd13701": "getEventHashes(uint256[256])", +"cdd1b539": "getSequenceNumber(uint256,address)", +"cdd2067e": "getVendingAmountSold(uint256)", +"cdd247a9": "offerAd(uint256,uint256)", +"cdd2ef0c": "starBuy()", +"cdd3574a": "crowdsaleStartBlock()", +"cdd3ab58": "addDistributionSources(address[])", +"cdd432d0": "rewardNumerator()", +"cdd63344": "moveTo(uint256)", +"cdd6d079": "_tokensForEth(uint256,uint256)", +"cdd72253": "getVoters()", +"cdd739f6": "tokenCapForPreICO()", +"cdd7b1fd": "init(uint256,uint256,uint256,address)", +"cdd8750e": "getDueTime(bytes32)", +"cdd8b2b2": "registerBeneficiary(address)", +"cdd8cc49": "debug_string(string)", +"cdd8d4e8": "mgmtRewardPercentage()", +"cdd90fbb": "firstRoundWMDiscount()", +"cdd93332": "getTradingStart()", +"cdd977e0": "addrService()", +"cdda62ad": "FutureBlockCall(address,uint256,uint8,address,bytes4,bytes,uint256,uint256,uint16,uint256,uint256)", +"cdda96cf": "TokenPriceETH()", +"cddaf241": "distributeReservedTokens(uint256)", +"cddb4e44": "getDataAddress()", +"cddb523b": "changeTeamWallet(address,address)", +"cddb8e94": "buyProduct(address,uint256)", +"cddbe729": "game(uint256)", +"cddbff7c": "CRYPTODUBAI()", +"cddc028b": "IndexEmpireToken()", +"cddc37c1": "withdrawForTwoYear()", +"cddce877": "TOKEN_SHARE_OF_LEGALS()", +"cddd351c": "transferFromOnBehalf(address)", +"cdde5413": "updateTileTimeStamp(uint16)", +"cdde76f7": "hasAnyAttrs(uint256,bytes2)", +"cdde9294": "avgTokenWinValue()", +"cddeaba0": "setTokenPrice(uint256,uint256,uint256,uint256)", +"cddfbaaf": "AirDropAFTKSeven()", +"cde02b25": "totaldivineTokensIssued()", +"cde0a4f8": "setRegulator(address)", +"cde180a9": "listContractByModuleId(string)", +"cde1d97a": "ChangeTokenVaultAddress(address)", +"cde25f8a": "getWineOwner(address)", +"cde2c35a": "rewardBobaBase(uint256)", +"cde2d72a": "receiveBTC(address,string,address,uint256,string)", +"cde2e8d7": "A2ACrowdsalePartner()", +"cde4018e": "AgriChainData()", +"cde40bc8": "bonusFirstWeek()", +"cde43f28": "mintTokens(uint256,int256,address,uint256)", +"cde4efa9": "flip()", +"cde596b2": "Pay(address)", +"cde5f58f": "RELEASE_INTERVAL()", +"cde68041": "hasPermission(address,address)", +"cde74e51": "licenses(bytes32)", +"cde7da75": "claimActingPlayerOutOfTime(uint256)", +"cde7f980": "save(string,address,uint256)", +"cde93eec": "NewIssue(address,uint256)", +"cde99727": "calculateROI()", +"cde9f2ea": "startdate()", +"cdea76d6": "buyLong(address[2],uint256[2],uint8,bytes32[3])", +"cdeaf5bc": "addItem(uint256,uint256,uint256,uint32[8])", +"cdeb1485": "massTransfer(address[],uint256[],bytes32)", +"cdeb7bac": "MaiToken2()", +"cdebf885": "Rent(address,uint256,uint256,uint256)", +"cdecd1d7": "FUN()", +"cded6986": "_getBridgeTokenFee(uint256)", +"cded6fa5": "JesusCrowdsale()", +"cdeda055": "_assert(bool)", +"cdee2112": "CyberToken()", +"cdee2b92": "saleclosingTime()", +"cdee5c4a": "raceRegistration(uint256,address)", +"cdee8973": "Swapped(address,uint256)", +"cdef3911": "assignTokenOperator(address)", +"cdef9423": "create(address,address,address,address,address,address,address,uint8,string)", +"cdef9fb6": "SimpleStore(uint256)", +"cdefa007": "FondoNetwork(uint256,string,string)", +"cdefa4de": "ParaD2Test()", +"cdefe704": "getLOCbyID(uint256)", +"cdf016ca": "minimumBounty()", +"cdf05ab5": "voteTime(uint256)", +"cdf20e1e": "currentSyndicateValue()", +"cdf32cab": "totalInvestedWei()", +"cdf3bc6f": "revise()", +"cdf3bdab": "GetMyAcorn()", +"cdf45c03": "FourLeafClover()", +"cdf46344": "mint(address,string,string,uint256,uint64,uint64,uint64)", +"cdf4d6b4": "registerKYC(address[])", +"cdf574f1": "purchase(uint256,bytes7)", +"cdf6ddb4": "activeCrowdsalePhase1(uint256)", +"cdf744b2": "setFounderPercent(uint256)", +"cdf90e02": "Roles2LibraryAndERC20LibraryAdapter(address,address)", +"cdf93c0f": "EtherBlock()", +"cdf99413": "CrowdsaleToken(string,string,uint256,uint256,bool)", +"cdf9b77e": "getCurrency(uint256)", +"cdfb0a21": "PRVTSToken()", +"cdfb2b4e": "enableWhitelist()", +"cdfb5832": "setClaimer(address)", +"cdfbc437": "setMaxBetAmount(uint256,uint256)", +"cdfbc8f1": "MINIMAL_PURCHASE()", +"cdfbe22c": "isAnExchanger(address)", +"cdfc20aa": "addHashType(uint8,string)", +"cdfd293b": "BOUTSPRO_AMOUNT()", +"cdfd72e8": "calcTeamEarnings(uint256,uint256)", +"cdfd7474": "SONICToken(string,uint8,string)", +"cdfdb7d6": "increaseAllowance(address,uint256,address)", +"cdfe2815": "createVip(address,uint256,uint256,uint256)", +"cdff1be4": "pauseWithdrawal(address,address)", +"cdff5857": "updateUint256s(bytes32[],uint256[])", +"ce00d49c": "_transferWithRate(address,address,uint256)", +"ce017242": "updateICOPrice()", +"ce01e1ec": "set2(uint256)", +"ce021384": "numberOfReferralCodes(address)", +"ce0457fe": "NewOwner(bytes32,bytes32,address)", +"ce04a8c5": "isDAppReady()", +"ce04c10e": "highContributionAward(address)", +"ce050632": "setBettingTime(uint256)", +"ce05264f": "createInterceptorFromVault()", +"ce05369b": "releaseTokenHolder()", +"ce058d0d": "ChangeLEXTokenAddress(address)", +"ce0617ec": "lockedUntil()", +"ce072163": "collectPayments()", +"ce07d2b4": "proxyTransfer(address,address,uint256,bytes)", +"ce098093": "createtoken(string,string,string,address)", +"ce0a191a": "setLotteryTokensPercent(uint256)", +"ce0b5bd5": "cancelWhitelistRemoval(bytes32)", +"ce0bb9c4": "looksCoin()", +"ce0bd51f": "bancorConverterFactory()", +"ce0befcf": "remainTokens()", +"ce0d5f78": "addAddressToBlacklist(address,address)", +"ce0df06b": "FreezeAccount(address)", +"ce0e19ba": "appendString(string)", +"ce0f802d": "MaazBTC()", +"ce0f92b7": "hashOrder(bytes,uint64,uint64,uint256,uint256,uint256)", +"ce0ff8d8": "CSStoken(uint256,string,string)", +"ce10814c": "wmax(uint128,uint128)", +"ce109195": "internalDoesEventExist(bytes32)", +"ce10cf88": "getAddressByIndex(uint256)", +"ce11f2bb": "vote(uint256[])", +"ce120afb": "_safeTransferPaymnt(address,uint256)", +"ce139296": "icoPhaseDiscountPercentage1()", +"ce13bfb7": "cancelLoanOffering(address[9],uint256[7],uint32[4],uint256)", +"ce144eb9": "spiceUp(string)", +"ce146d3d": "getTotalWins()", +"ce148564": "TIER3END()", +"ce148c1f": "tempTokensPeriodOf()", +"ce14a46e": "totalPeriod()", +"ce14d404": "PieTokenBase()", +"ce14eeb8": "BASE_HARD_CAP_PER_ROUND()", +"ce14f10b": "disabled(uint256)", +"ce15647a": "getTeam(uint8)", +"ce158ba2": "approveCompanyAllocation(address)", +"ce160edd": "searchAndBid(uint256,uint256)", +"ce1619f8": "_lockPaymentTokens(address,uint256,uint256)", +"ce161b57": "AngelTestToken()", +"ce165894": "updateExpectedAmount(bytes32,uint8,int256)", +"ce17f01e": "Hostblock()", +"ce18eb0b": "stage1Deadline()", +"ce19419b": "testThrowsSetNotUpdatableNotOwner()", +"ce1a70a3": "SimplePreTGEContract()", +"ce1aafc0": "VinaexToken()", +"ce1afbe1": "_transferToken(address,address,uint256)", +"ce1b088a": "withdrawDonations()", +"ce1bd789": "DestroyTransferFeeCoin()", +"ce1c1538": "getCardByOwner(address)", +"ce1c93af": "abandon(string)", +"ce1cf229": "SimpleMultiSigWallet()", +"ce1d6ea0": "testAppendTranch()", +"ce1ed182": "getLastMilestoneStartsAt()", +"ce1ed2bb": "BecomeSquirrelDuke()", +"ce1f561c": "holdingTaxDecimals()", +"ce1ffcd9": "setTransferEnable(bool)", +"ce203b83": "officialUserSignUp(string,address)", +"ce204b78": "defrozen(address)", +"ce204bf1": "TOKEN_LOCKING_PERIOD()", +"ce20fd84": "query(bytes2,int256)", +"ce21abf3": "sendUnsoldPRETDETokensToTDE()", +"ce21fbf4": "GolemToken()", +"ce220ecf": "testAddBalanceFailsAboveOverflow()", +"ce2293ca": "EIB(string,string,uint8,uint256)", +"ce230030": "unlockSupervisedFunds(address)", +"ce233452": "limitPurchasing(uint256,uint256)", +"ce23772b": "removeWalletFromWhitelist(address)", +"ce23e8bc": "LIQUIDATION_TOKENS_PER_ETH()", +"ce23f2b2": "newLoan(bytes32,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"ce241d7c": "LogSetOwner(address)", +"ce248843": "removeOne(address)", +"ce255bba": "setsafekey(uint256)", +"ce266af8": "tom()", +"ce267b55": "ecdsaVerify(address,bytes,uint8,bytes32,bytes32)", +"ce2777a3": "BigchatToken(uint256,string,uint8,string)", +"ce27a21a": "setLogoPrice(uint256)", +"ce289284": "Result(bytes1)", +"ce2a9f62": "totalEthCollected()", +"ce2c6ad5": "getChainFeeArray()", +"ce2ce3fc": "getLocation()", +"ce2d173f": "setSelfOff()", +"ce2d3fa1": "returnKVTToOwner()", +"ce2dfd00": "createFootballerStar(uint256,uint256,uint256,uint256)", +"ce2f67a2": "exampleFunction()", +"ce2fc873": "setArticleHash(uint256,string)", +"ce2fc8b1": "RequestC(bytes32,bytes32)", +"ce2fce38": "getTransferInfo(address,uint256)", +"ce3099fa": "testNBool()", +"ce30b8d9": "operatorBurn(address,uint256,bytes)", +"ce3174ca": "revokeSubmission(address,address)", +"ce329570": "byzantineCloseChannel(bytes32)", +"ce347a65": "fund(uint16)", +"ce3498b8": "DelegatedIdentity(address)", +"ce356e3a": "addTeam2(uint64,uint64,uint64,uint16)", +"ce371431": "queryFunds(address)", +"ce373b95": "heroOfThePit()", +"ce376aa3": "buy_king()", +"ce3800e1": "moonLevel()", +"ce383ec7": "view68()", +"ce389e53": "getTokenAddHold()", +"ce394696": "calculateCost(uint256,uint256)", +"ce39952a": "disableSecureMode()", +"ce39976d": "getUrlAtIndexOf(address,address,uint256)", +"ce3a7076": "Cancelot(address,address)", +"ce3b0475": "changePriceDecraseTime2Action(uint256)", +"ce3be6bb": "withdrawWallet1()", +"ce3cc3aa": "changeTolerance(address,bytes32,uint256)", +"ce3ccfd0": "shouldReturnDefault(bytes32)", +"ce3cd997": "setStage(uint8)", +"ce3cef0d": "stopTakeToken()", +"ce3d9237": "mintMarginTokens(bytes32,address[7],uint256[8],uint32[2],bool,bytes,bytes)", +"ce3e82a4": "KorkToken()", +"ce3f865f": "collect(uint256)", +"ce3fff35": "ONTTotalSupply()", +"ce4150eb": "migrateMarketInFromSibling()", +"ce419871": "openKYC()", +"ce41d75d": "NewIntelTechMedia(address)", +"ce4254ce": "terminationTime()", +"ce4258e9": "OPENAI()", +"ce429429": "generateOrderByMerchant(address,uint256,string,string,string)", +"ce42bb11": "getLockedDevFundAmount()", +"ce42fa88": "Telcoin(address)", +"ce435f4b": "SetParticipantAgrHash(address,address,bytes32)", +"ce43b0c0": "creditorAddresses(uint256)", +"ce43c032": "getUsername(address)", +"ce43c097": "CradTimeLock(address)", +"ce44573a": "GenChipByRandomWeight(uint256,uint8,uint256[])", +"ce45a260": "CryptoDime()", +"ce45f981": "MooAdvToken(uint256,string,string)", +"ce468922": "transferCat(bytes5,address,address,uint256)", +"ce46e046": "isPayable()", +"ce471aee": "kompitechToken()", +"ce47befd": "checkoutCart(string)", +"ce47e604": "sendAliceBlue(address,uint16,uint256)", +"ce483c42": "statusI()", +"ce483e88": "incrementOpenInterest(uint256)", +"ce48a54d": "getHeroLevel(address,address)", +"ce49735a": "distributeAlliniTokens()", +"ce4a6f09": "offerCanvasForSaleToAddress(uint32,uint256,address)", +"ce4a9206": "minPayInterval()", +"ce4ae74a": "setRewardMinter(address,uint256)", +"ce4c4a74": "TrueFlipToken(address)", +"ce4cf4c8": "advisorTotal()", +"ce4d01a3": "validate(uint256)", +"ce4d66b9": "roundBonus(uint256)", +"ce4d6fdf": "maritalStatus()", +"ce4dbdff": "securityTokenRegistry()", +"ce4ddabd": "updateTimeRC(address,uint256,uint256)", +"ce4e42d2": "BountyManager(address)", +"ce4e5aa4": "findBestMatch()", +"ce4e84a3": "STARTING_CHICKEN()", +"ce4e8c1a": "createNextPremiumSale(uint8,uint256)", +"ce4eb657": "updateXDRRate(uint256)", +"ce4ef577": "tokensAllocatedForAs(address,address,address,address,address,address,address,address,address)", +"ce4efe62": "insert(uint256,bytes32,bytes32)", +"ce507401": "oraclizeGasPrice()", +"ce50f72d": "getAvailableBalanceOf(address,address)", +"ce50f926": "getMinLimit()", +"ce510d46": "neededAmountTotal()", +"ce513b6f": "withdrawable(address)", +"ce52242e": "gotchinfo(address)", +"ce522f22": "updateWeiCap(uint256)", +"ce52c4ef": "createDelegation(address,uint256)", +"ce52cf84": "encoding_format()", +"ce53ee2d": "voteNoLockByAdmin(address,address,uint256)", +"ce5440bb": "depositAgent3(uint256,uint256,uint256[],uint256[],uint256)", +"ce5478a4": "lockedCapitalOf(address)", +"ce5494bb": "migrate(address)", +"ce5566c5": "cash(uint256,uint256)", +"ce557031": "purchaseTokens(address)", +"ce5570ec": "isWallet(address)", +"ce563036": "BaseContract()", +"ce5659bc": "changePartner2(address)", +"ce56c454": "withdrawEther(uint256,address)", +"ce56f3fb": "moneybuy(address,uint256)", +"ce5774c6": "Proposal(string)", +"ce578cd6": "managementContractAddress()", +"ce57d8d5": "getSingleInvestor(address)", +"ce5910f3": "unfreez()", +"ce592586": "setThresold(uint256,uint256)", +"ce5968da": "onMint(int256,address,uint256)", +"ce597164": "normalDemurrageAmount(uint256)", +"ce5a5df7": "createUnicorn(address)", +"ce5a63ff": "purchaseBlock(uint256,uint256)", +"ce5ac32d": "Firmament()", +"ce5c073d": "setMintMaster(address)", +"ce5c2c33": "performTransaction(uint256)", +"ce5c4fd8": "finalizeSale(uint256,uint256)", +"ce5c5201": "cryptogsAddress()", +"ce5d80e6": "stealCardWithId(uint256)", +"ce5e13aa": "getPlayerProfit(address)", +"ce5e4190": "set_tokens_per_ether(uint256)", +"ce5e6393": "tgrSetFinished()", +"ce5e84a3": "activate(bool)", +"ce5e9ffb": "CORRECTION()", +"ce5f9454": "numerator()", +"ce5fa1e9": "secondExchangeRatePeriod()", +"ce5fd7f3": "OfferContract()", +"ce606ee0": "contractOwner()", +"ce60f78d": "createMarriage(bytes,bytes,uint256,bytes,bytes)", +"ce622ec5": "announceWinner(string)", +"ce6236ca": "getRoundLength()", +"ce627bd9": "mineblocksAddr()", +"ce629a6b": "_computeTournamentBooty(uint256,uint256,uint256)", +"ce63066f": "test_6_basicTransfer_increaseBlocksBy1000()", +"ce6342f3": "getAbiVersion()", +"ce63cc89": "postTask(string,string,uint256,uint256)", +"ce649b39": "setEthereumRate(uint256)", +"ce655952": "_cancelSale(uint256)", +"ce665dd8": "OFFSET()", +"ce67bda6": "testNop(int256,int256,uint256)", +"ce686e40": "IcoToken(string,string,uint256,string)", +"ce686e62": "BurnableOpenPayment(address,uint256,bool,uint256,string)", +"ce691294": "kRate()", +"ce6933d5": "fetchPaidOrdersForPayer()", +"ce695d7f": "_addArea(address,uint256)", +"ce699a41": "releaseVestedTokens(address)", +"ce69cd20": "MIN_BID()", +"ce6a9bd6": "proofType_Ledger()", +"ce6b3467": "withdrawExcessToken(address)", +"ce6c0b64": "_getTokenNumberWithBonus(uint256)", +"ce6c2589": "_emitOracleRemoved(address)", +"ce6c5080": "tokenSetAudit(address,address,address,address)", +"ce6c9a89": "changeMinimalWei(uint256)", +"ce6d35d1": "migrateToken(address,address)", +"ce6d41de": "getMessage()", +"ce6eaef5": "startSecondSale()", +"ce6eaff9": "YOU_BET_MINE_DOCUMENT_SHA512()", +"ce6efb07": "AmountLimitCrowdsale(uint256,uint256)", +"ce6f149c": "WEEKS_26()", +"ce6f899d": "EventLogin(address,string)", +"ce709c9b": "proposalCreateTime(uint256)", +"ce70faec": "createUltimateOracle(address,address,uint8,uint256,uint256,uint256)", +"ce71b83c": "TianqibaoTokenERC20(uint256,string,string)", +"ce71caee": "juryOperator()", +"ce72a696": "ICO_PERCENTAGE_1()", +"ce73a61d": "setWhitelistExpiration(uint256)", +"ce73b41a": "addBuyTokensRequest(address,string,uint256,uint256)", +"ce742222": "SCARABToken2()", +"ce744ba5": "SellOffer(address,address,uint256,uint256,uint256,uint256)", +"ce746024": "recover()", +"ce7462e9": "setStarSellPrice(uint256,uint256)", +"ce749c29": "defund()", +"ce774030": "raiseCoinsAdded(address,uint32,uint256)", +"ce77cf42": "Rafflecoin()", +"ce782e08": "floorLog2Test(uint256)", +"ce784216": "scrapCount()", +"ce7842f5": "referralBonus()", +"ce784564": "findPositionInMaxExpArray(uint256)", +"ce78b752": "ActivatedEvent(bool)", +"ce7917d7": "GEOCOIN()", +"ce794294": "multisignature()", +"ce799b0a": "changeStakeRate(bytes32,uint256)", +"ce79add1": "givableBalanceOf(address)", +"ce79d17d": "Storesumdata(bytes32,bytes32,uint64)", +"ce7a0697": "_internalTgeSetLive()", +"ce7a2b02": "processPayment(address,address)", +"ce7a60ab": "unlockBalance(address)", +"ce7a94eb": "SliceByte32(bytes,uint32)", +"ce7aa79f": "PXMCToken(uint256,string,uint8,string)", +"ce7ab6a7": "set_refunded(bool)", +"ce7ba916": "_initBadges(address,uint256,uint256,uint256)", +"ce7c2ac2": "shares(address)", +"ce7c5d7f": "transferEthToOwner(uint256)", +"ce7ca615": "FoundationAddress()", +"ce7ca665": "medalBoost()", +"ce7cdbb7": "getIndexRoot(bytes32)", +"ce7d3539": "AVMDisputeProcess()", +"ce7e23a0": "UnityToken(address,uint256,uint256)", +"ce7e51e3": "uint256ToString(uint256)", +"ce7f6e82": "CoinPulseToken()", +"ce7fc203": "accForTeam()", +"ce803a70": "noOfSeats()", +"ce806176": "setPurchasing(bool)", +"ce809e4e": "ETH_DECIMALS_FACTOR()", +"ce813d8f": "addTurretParts(uint8[])", +"ce816706": "X4BToken()", +"ce818ed5": "SiringClockAuction(address,uint256)", +"ce82eb33": "ico4Bonus()", +"ce830f5b": "_unlockToken(address)", +"ce845d1d": "currentBalance()", +"ce85e801": "MAX_PRICE_SALE()", +"ce85fbe2": "joojinta()", +"ce860a62": "getShipIdsByOwner()", +"ce869a64": "fails()", +"ce8721b2": "daoAccounts(address)", +"ce873a67": "processReferer(address)", +"ce8775a4": "win(uint256,uint256,uint256,bytes,uint256)", +"ce87f626": "replaceWizardRP(address)", +"ce8804c9": "setAdvertAddr(address)", +"ce883cdb": "getPoolsLength()", +"ce8883af": "potFee(uint256)", +"ce88a9ce": "setProduction()", +"ce88b145": "getAccount(uint256)", +"ce89a2a2": "changeSettings(uint256,uint8)", +"ce89b5de": "buy100()", +"ce89c80c": "calcKeysReceived(uint256,uint256)", +"ce8ac033": "getAvatar(address)", +"ce8ae9f3": "giveReward(address,uint256)", +"ce8b5b60": "setLockAfterManuallyMint(bool,int256)", +"ce8b7151": "isHF()", +"ce8b7be4": "consultantsAllocation()", +"ce8bbe4b": "bobMakesErc20Deposit(bytes32,uint256,address,bytes20,address)", +"ce8bcae3": "allFundsCanBeUnlocked()", +"ce8d054e": "_setupNoCallback()", +"ce8d096d": "redeemVestableToken(address)", +"ce8d1910": "claimFromSeveral(uint256,address[])", +"ce8d388d": "disableWithdraw()", +"ce8d73de": "o_labirinto(uint256)", +"ce8dc388": "TOTAL_ROUNDS()", +"ce8e120a": "thawTransfers()", +"ce8e2fd8": "SaintArnouldToken(address,uint256,uint256)", +"ce8e5170": "burnedAfterSaleCount()", +"ce8e95d4": "updateRegion(uint256,uint256,uint256[],bool,bool,uint8[128],bool,address)", +"ce8ebfc8": "makeSchoolToken()", +"ce8ff29b": "TicTacToeAdjudicator(address,address,address,address,uint256)", +"ce90203c": "computeSellPrice()", +"ce906c6a": "listPrycto5()", +"ce909980": "checkTimeout(address)", +"ce90bafa": "topUpERC20(address,uint32,uint192)", +"ce912692": "createNew(address,address,address,uint256,uint256,uint256)", +"ce916d85": "icoTokensReceived(address)", +"ce91e4b3": "freezeaccount(address,bool)", +"ce923728": "setDealMembers(address,address,address,uint256)", +"ce92dced": "newBid(bytes32)", +"ce93b0e4": "returnAdvisorTokens(address,uint256)", +"ce950d1e": "FancyAssetsCoin(uint256,string,string)", +"ce952345": "icoAssignReservedBounty(address,uint256)", +"ce95aad2": "isOnCraftingAuction(uint256)", +"ce95b475": "getBalanceByAdress(address,address)", +"ce96c8e4": "set_deposit_manager(address)", +"ce96ec6b": "setRefer(address)", +"ce972050": "token_orderSheet(address,uint32)", +"ce972f33": "Menu01(address,uint256)", +"ce97f61a": "submitTally(uint256,uint256,uint256)", +"ce9822c7": "Magic10(uint256,address)", +"ce99151e": "p_wallet()", +"ce9a3b0f": "special()", +"ce9a6ac8": "putOn(uint256,uint256,address)", +"ce9ae667": "PharmaWit()", +"ce9ae91c": "getARed(uint256,uint256)", +"ce9af2b9": "isReserved(string,address,string,bytes32)", +"ce9b4321": "calculateCommission(uint256)", +"ce9c39c9": "stepTwoStartTime()", +"ce9e673b": "forceOffsetBasicFeeRate()", +"ce9e6bb7": "setEndTimeIcoStage2(uint256)", +"ce9e7730": "createSubcourt(uint96,bool,uint256,uint256,uint256,uint256,uint256[4],uint256)", +"ce9f24dc": "SilentNotaryCrowdsale(address,address,address,uint256)", +"ce9fb088": "TransferSellAgentBounty(address,uint256)", +"cea024d9": "tokenPriceNum()", +"cea08621": "changeDailyLimit(uint256)", +"cea10af7": "hardFundingGoal()", +"cea15706": "DarkrenlandCoin()", +"cea16c83": "endFinalStage2()", +"cea198c8": "LogBidCanceled(bytes32)", +"cea22b51": "ico_stage()", +"cea289db": "debugInt(uint256)", +"cea2ed48": "CreatedPet(uint64)", +"cea4b687": "updateListingWithSender(address,uint256,bytes32,uint256)", +"cea5033c": "_requestTokens(address,uint256)", +"cea5b151": "getLabelHash(string)", +"cea5d64b": "shift_right(uint256,uint256)", +"cea63361": "transactionFeeRateM()", +"cea65e97": "addressIsOwner(address)", +"cea67184": "getHydroId(address,address)", +"cea7555b": "distributedFundariaStakes()", +"cea81ab1": "generateContestForDelegationSchemaHash(address,uint256,bytes32)", +"cea876ba": "EthMatch(uint256)", +"cea943ee": "getSaleConfig()", +"cea9707a": "getMyTicketList(bool,uint256,uint256)", +"cea99275": "hasInitMartial()", +"cea9b7af": "ICO_EOS_AIRDROP()", +"cea9d26f": "rescueTokens(address,address,uint256)", +"cea9f621": "setVars(address,address)", +"ceaa50d4": "getLastPayoutAmountAndReset()", +"ceaae25d": "massChangeRegistrationStatusForGoldWhiteList(address[],bool)", +"ceaafb67": "AnonymousDeposit(address,uint256)", +"ceab09d8": "set_participant(address,uint256,uint256,uint256,bool,uint8)", +"ceab4ea7": "VOODOO()", +"ceac2aed": "submit_payment(uint256,uint256,bytes32,bytes32,uint256,address,bytes32)", +"ceacc749": "calcCurrentMinBid()", +"cead2c29": "get_ptc_balance(address)", +"cead4620": "putBtoWithSto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"ceadd9c8": "donateAsWithChecksum(address,bytes4)", +"ceae3424": "balanceSoll(address)", +"ceae7f64": "thirdStageMinting()", +"ceaf0bfb": "admAccount(address,bool)", +"ceaf1e94": "_transferToAddress(address,uint256)", +"ceaf9519": "needToGetFree()", +"ceafb18d": "getCard(address)", +"ceb0884d": "getSolution(address,uint32)", +"ceb10f1c": "preIcoCap()", +"ceb21433": "Activate(address,address,address,address)", +"ceb22fa0": "meteredEarn(uint256)", +"ceb24797": "getKycLevel(address)", +"ceb2731a": "purchaseCrate()", +"ceb35b0f": "addAddress(string,address)", +"ceb408b4": "_set5()", +"ceb41385": "getHashLeftPad()", +"ceb44d04": "checkSplitEnd(uint256)", +"ceb51f0a": "setApproved(address,uint256)", +"ceb5bc46": "proshgold()", +"ceb60654": "getGroup(uint256)", +"ceb6dbc3": "time_of_token_swap_end()", +"ceb791d9": "priceRate()", +"ceb7bc87": "tokenTransferFrom(address,address,uint256,address[])", +"ceb7e43c": "getAddOnComplete(uint16)", +"ceb88ff4": "setContribution(address,uint256)", +"ceb8ee8b": "durationInMinutes()", +"ceb98dc7": "unbuy()", +"ceb9a5fd": "getGameCurrentRoundId(uint256)", +"ceba1794": "MAX_LOAN_AMOUNT()", +"ceba30b5": "scheduleTransaction(address,bytes,uint256[4],uint256)", +"ceba5029": "MOBTokenIssue(address)", +"cebac2f2": "LRCLongTermHoldingContract(address,address)", +"cebae575": "GLAU()", +"cebb8bb0": "testControlRestartEnforceRevisions()", +"cebbbce5": "ClaimAirdrop(address,uint256)", +"cebc141a": "devCount()", +"cebc9a82": "getDelay()", +"cebce72d": "token(uint64)", +"cebd31bc": "getStartingPrice()", +"cebe09c9": "quota()", +"cebf3bb7": "minRaise()", +"cebfa61e": "month18companyUnlock()", +"cec0213e": "HealthDataChain(uint256,string,string)", +"cec0f734": "setTransferToken(uint256)", +"cec10c11": "setFees(uint256,uint256,uint256)", +"cec1365a": "ShortLimit(uint256)", +"cec17a12": "ChrisBell(uint256,string,uint8,string)", +"cec33f4e": "getPatentFee(address,uint16[5],uint256)", +"cec3638d": "VotingChallenge()", +"cec36cb4": "refundPoweredUp()", +"cec4a1cc": "pauseRefund(bool)", +"cec4ab9c": "whitelistEnable()", +"cec63cea": "NamoToken()", +"cec68824": "registerFull()", +"cec7260b": "move_monster(uint16,uint16)", +"cec77ad5": "ALLOC_ADVISOR()", +"cec7b4e8": "Deposit(uint256,address,uint256,string)", +"cec8d277": "decrypt(address,bytes,string)", +"cec95aa1": "getReleaseHashForPackage(string,uint256)", +"cec9b4ef": "_executeTransaction(uint256)", +"cec9df89": "getAddressBetsForEvent(bytes32,address,string,string)", +"ceca122d": "activate(bool,bool,bool)", +"ceca7e8e": "fundLock(address,uint256)", +"cecaf395": "buildBlocks(int32,int32,bytes16)", +"cecb06d0": "mintOwner()", +"cecc33e7": "issueTickets(address,uint256,uint256)", +"ceccc10e": "getHoldersNameAddr()", +"cecd0264": "executePayment(string)", +"cecd0ab5": "_processFundsOverflow(address,uint256)", +"cecd9dd4": "_isNeededNewLottery()", +"cecdc6aa": "TEAM()", +"ced095d6": "getContest(string)", +"ced0a3a5": "setHookOperatorContract(address)", +"ced0bcc3": "MangaCoin()", +"ced0c0c2": "subscriptionRate()", +"ced0d31d": "setFeeRate(uint256,uint256,uint256,uint256,uint256,uint256)", +"ced11e40": "addMemory(string,bytes)", +"ced1a60b": "pooja()", +"ced29978": "LogFrozenAccount(address,bool)", +"ced32b0c": "setSender(address)", +"ced39558": "buyLand(uint256)", +"ced3fb9c": "isAddressAuthorized(address)", +"ced444bf": "offerStarForSaleToAddress(uint256,uint256,address)", +"ced4c064": "withdrawTo(string,address)", +"ced4f4b8": "sellEther()", +"ced659b6": "burnMktCoins()", +"ced72f87": "getFee()", +"ced78ed1": "getImageData(uint256,uint16)", +"ced7d018": "reFundByOther(address)", +"ced80aca": "updateMultipleReservedTokens(address[],uint256[],uint256[],uint256[])", +"ced84a71": "addInvestor(address,uint256,uint256)", +"ced92670": "changeMultiplier(uint256)", +"ced9f7c0": "mokenNoName(uint256)", +"ceda4a03": "NovioCoin_TEST()", +"cedadaca": "SingularityTest6()", +"cedbbeee": "createTokens(address)", +"cedc01ae": "getActivator(address)", +"cedc2ce1": "setMaxTransfers(uint256)", +"cedc7277": "getBuyPrice(address)", +"cedcbd99": "ACTION_BUY_OFFER_ACCEPTED()", +"cedcd770": "foundationWithdraw(uint256)", +"cedd90f6": "purchase(bool,bool)", +"ceddd07d": "balanceOfUnlocked(address)", +"cedf222e": "congressMemberThreshold()", +"cee024dc": "getNumberOfVotes()", +"cee02a86": "SOFTCAP_ETH_LIMIT()", +"cee0b4fe": "CRTSTAL_MINING_PERIOD()", +"cee13e28": "Conversion(address,address,address,uint256,uint256,int256,uint256,uint256)", +"cee24e31": "gambler1()", +"cee26ed5": "sellers(uint256)", +"cee2a9cf": "isInvestor(address)", +"cee401ef": "enableICO()", +"cee594c8": "addStage(uint256,uint256,uint256,uint64,uint64,uint256)", +"cee6b0d9": "AcceptsSunny2(address)", +"cee6b53c": "updateLastActivity()", +"cee6ee38": "aEthereumlotteryNet()", +"cee6f794": "SEKEM()", +"cee6f93c": "getResultOfLastFlip()", +"cee73630": "buyTPT(uint256,uint256,uint8,bytes32,bytes32)", +"cee749bc": "withdrawTokenRefund(uint256,address)", +"cee80356": "min4payout()", +"cee829ea": "refundMany(address[])", +"cee8fa1f": "Funding_Setting_cashback_time_end()", +"cee93e23": "isActive(uint32,int256)", +"cee96f49": "setissuedSupplyRatio(uint256)", +"ceea3914": "lookupUserDonationHistoryByCampaignID(address)", +"ceead4b6": "setCompte_10(string)", +"ceeafd9d": "withdrawFundsAdvancedRP(address,uint256,uint256)", +"ceeb7066": "setJoinFee(uint256)", +"ceebe28d": "repoInterfaceVersion()", +"ceec8f8f": "removeProduct(string,string)", +"ceee4119": "getUsersRadarsIds()", +"ceee9658": "rotate_right(uint256,uint256)", +"ceeea0ea": "completeAttack(bytes32)", +"ceef3800": "calculateBonusTierQuotient()", +"ceef3d93": "changelp7(address)", +"ceef644c": "LIFEINVIDER()", +"ceefbbd6": "prePreIcoEndAt()", +"cef037fd": "setContinueSelling()", +"cef062fc": "reserveVault()", +"cef0e9e2": "getFalconmasterReq()", +"cef24cac": "AmountToFund(uint256)", +"cef29521": "PRICE_MULTIPLIER_ICO4()", +"cef2e559": "marketplace_storage()", +"cef42254": "getContribution(uint256)", +"cef4be3c": "partialClaim(address,uint256)", +"cef55ae1": "newComp(uint8)", +"cef5ed69": "changeServiceAgent(address)", +"cef6a39a": "createMinerAuction()", +"cef6cfb2": "addToWhiteList(string,address)", +"cef75d9f": "myCardDividends()", +"cef7a4d0": "LogTemplateSet(address,address,address)", +"cef7e760": "initialCaps()", +"cef887b0": "storeBlockWithFee(bytes,int256)", +"cef8d343": "buyShare(uint256,bool)", +"cef94360": "updatefundingEndTime(uint256)", +"cef9601f": "timeTillNextSteal()", +"cef9ca6b": "ThreeDLPrivate()", +"cef9db6d": "TOKEN_SUPPLY_TOTAL()", +"cefa624b": "getPlayerAirdropGameData(address)", +"cefa80fc": "foundersTeam()", +"cefaba7f": "prc(uint256)", +"cefad386": "_accountOkayChecks(bytes32,uint64)", +"cefb09b6": "getBrokerInfo(uint256)", +"cefb3605": "vaultToWallet()", +"cefc0848": "minimumStakingTokenPercentage()", +"cefce1f2": "GameOver(string)", +"cefd2239": "unlocktoken(address,address,address)", +"cefddda9": "isGenesisValidator(address)", +"cefdfcf3": "testControlRetractNotRetractable()", +"cefe23dd": "HarjCoin()", +"cefeb6f7": "MeshPointManager(int256)", +"cefed526": "Atlantide(uint256,string,string)", +"ceff149b": "getRoundLuckyPot(uint256)", +"ceff6fe6": "cancelApproveForAddress(uint256)", +"ceffbaf1": "isReleaseApproved()", +"cf0023ec": "pvt_plmt_max_in_Wei()", +"cf007460": "nextClaim(address)", +"cf00c197": "stageOneEnd()", +"cf00cba0": "BlocksquareSeriesA()", +"cf00d4b9": "prizePoolPercent()", +"cf011b26": "excludedAddresses(address)", +"cf02ba9d": "optionsPerShare()", +"cf034b1d": "transferFromTrustedContract(address,uint256)", +"cf03e589": "Registered(address,string,address)", +"cf03f5f4": "activateMasterKey(address)", +"cf04dd7e": "DAPSTOKEN()", +"cf04fb94": "changeVerifier(address)", +"cf054fb2": "hardCapAmount()", +"cf0682bc": "warning()", +"cf06b141": "assertEq17(bytes17,bytes17,bytes32)", +"cf06b3ba": "KOIOSToken(string,string,uint256,uint256)", +"cf071005": "showLastPoolAddress(address)", +"cf07fbb6": "HUToken()", +"cf082176": "ETHERION()", +"cf083591": "listAllAttendants()", +"cf086765": "getPatronsCount()", +"cf094497": "betCount()", +"cf09c6dd": "lastBlock_f10Hash_uint256()", +"cf09e0d0": "createdAt()", +"cf09e6e1": "SetBigContract(address)", +"cf09e820": "getPropertyOwnerSalePrice(uint16)", +"cf0a07b2": "Choon(address,address,address)", +"cf0a50d3": "DopeToken()", +"cf0aed0e": "setMinimumBuyValue(uint256)", +"cf0cb613": "finalUnlockTransfer()", +"cf0dbc27": "getH2Bidder()", +"cf0e4076": "findAddress(address,address[])", +"cf0e4be5": "eggsInTimeSlot(uint8)", +"cf0e80fe": "getClaimedBalance(address)", +"cf0f02bd": "IntoQueue(address)", +"cf0f0593": "shl8(uint8,uint8)", +"cf0f2bf8": "transferPreSigned(address,uint256,uint256,uint256,bytes)", +"cf0f34c4": "setMaxDuration(uint256)", +"cf0f864e": "battleCardIdRange()", +"cf0fc7d5": "_fetchOrderByIdWithMerchant(string,address)", +"cf0fdacb": "getRarityBonusValue(uint256)", +"cf100287": "payToManager(uint256)", +"cf112453": "canUpdateNextGameInitalMinBetSize()", +"cf124ba3": "tokenSaleIsFinished()", +"cf1259d8": "badge_obj()", +"cf12789a": "percOf(uint256,uint256)", +"cf12b725": "releaseTokenPrivate()", +"cf12d99f": "xorexs()", +"cf12e870": "giveAccess(address)", +"cf134a06": "totalLicensePurchases()", +"cf136426": "IagonTestToken()", +"cf1405fe": "firstDay()", +"cf14b191": "recoverAddressOfSigner(address,address,uint256,uint8,bytes32,bytes32)", +"cf14cecc": "whitelistMaxTok(uint256,address)", +"cf1578dc": "getOwnerFunds()", +"cf157942": "endsigning()", +"cf158fe9": "scheduleTransaction(uint256,uint256,uint256)", +"cf15b87d": "IcoCompleted()", +"cf160cf2": "addModerator(address,string)", +"cf16b4a2": "_packPlayerData(address,uint256)", +"cf16cc83": "getRoundStart(uint256)", +"cf16e955": "buyOnBehalf(address)", +"cf187228": "_createChar(string,address,uint256)", +"cf187df1": "addFrozenBalances(address,uint256)", +"cf18811f": "getTrusteeIndex()", +"cf1893de": "TimeBasedContract()", +"cf191540": "retraitStandard_5()", +"cf19463d": "newPokemonMaster(address)", +"cf195101": "Zchain()", +"cf195e34": "issuedToDate()", +"cf1a6243": "MIOTCrowdsales(address,address)", +"cf1b037c": "registerCallback(address)", +"cf1b11e8": "tokensPerWeiPlusBonus(uint256)", +"cf1b3f08": "withdrawTop(uint256)", +"cf1b45c3": "User(address,address)", +"cf1c13ce": "setBonusRate()", +"cf1c316a": "addAuthorized(address)", +"cf1c9f52": "pauseDET()", +"cf1cd249": "secureSend(address)", +"cf1d21c0": "ETHER_ADDRESS()", +"cf1d567f": "cosmicDice()", +"cf1d8294": "setPresaleParticipantWhitelist(address[],bool)", +"cf1e3bcb": "projectReserve()", +"cf1eba78": "promoMap(bytes32)", +"cf1ec58d": "usdPerEthLog(uint256)", +"cf1edfea": "checkIfLockCanBeRemoved(address)", +"cf1ee6f9": "OVISRESERVED_TOKENS()", +"cf1eef50": "UpdateRateAgent(address)", +"cf1f335e": "sendLiquidityFund(address,uint256)", +"cf1f3dd7": "ledgerName()", +"cf200e9f": "getBalancesSeller(uint256)", +"cf202727": "myfirsttoken()", +"cf20ac40": "citadelBalance()", +"cf210e16": "restrictedAcct()", +"cf216207": "tokensToTransfer(address,address,address,uint256,bytes,bytes)", +"cf21977c": "mint(address,uint256,uint256,uint256,uint256,string)", +"cf225109": "getSellAgents(uint256)", +"cf22c803": "Election(bytes32[],uint256,uint256,uint256)", +"cf2317d5": "nBallots(bytes32)", +"cf235743": "whitelist(address[],uint256[])", +"cf23616e": "enableTimelock(uint256)", +"cf25e4e8": "getActiveBusinessesPerType(uint256)", +"cf26ac9b": "getLinkOwner(address)", +"cf27539e": "LBL(uint256,string,string)", +"cf278430": "split(address,bytes32,uint8,uint256)", +"cf279ff1": "inserirOuvidoriaNoCadastro(address,bytes32,uint8,bytes32,bytes32,int256)", +"cf27d016": "isInGracePeriod()", +"cf282878": "_createNode()", +"cf2887e5": "transferTo(address,address[],uint256)", +"cf28b18e": "p_update_tokensRewardsAllocated(uint256)", +"cf295a5c": "mintbuy(address,uint256)", +"cf299d04": "joinPre()", +"cf2a8612": "two(uint256)", +"cf2affca": "changeRequiredAdmin(uint256,bool,bytes)", +"cf2b16d9": "Game(address)", +"cf2b3b47": "createRoomQuick()", +"cf2b8c05": "getRealisation_effective()", +"cf2c52cb": "deposit(address,bytes)", +"cf2d03ae": "minJump()", +"cf2d31fb": "register(bytes32,string)", +"cf2d5d66": "TestSelfDropToken()", +"cf2d5eb4": "ICO_TRIGGER()", +"cf2d923f": "ADVISORS_AND_CONTRIBUTORS_ADDRESS()", +"cf2e011e": "link(string)", +"cf2e161c": "DOWN_winBets()", +"cf2e3efc": "GetBankAccountBalance()", +"cf2e80cc": "_setSentReveal(uint256,address,bool)", +"cf2f856e": "gracePeriodMinTran()", +"cf2f9a4a": "transferTokenContractOwnership(address,address)", +"cf2fb7ca": "setDIDTokenAddress(address)", +"cf3006a1": "setEthPriceInDollar(uint256)", +"cf309012": "locked()", +"cf310642": "Police_1()", +"cf314b6a": "verifyAccount(address,bool)", +"cf317b7e": "getSellerInfo(address)", +"cf31e9fe": "getOutputHash()", +"cf31ff86": "isAddressValid(address)", +"cf32b062": "deadlines()", +"cf32b957": "LockInventory()", +"cf33babc": "VotingStarted(uint256)", +"cf351c1d": "setFeeTokenAddress(address)", +"cf35238a": "googleSupply()", +"cf356f83": "parcelGzeWithBonusOnList()", +"cf357364": "getOrderType(bytes32)", +"cf35bdd0": "assets(uint256)", +"cf35f275": "transferFromStakedisbursementfund(address,uint256)", +"cf3630b4": "setNextStartTime(uint256)", +"cf36fe8e": "bobMakesEthPayment(bytes32,address,bytes20)", +"cf3743c6": "DuxToken()", +"cf38b609": "priceChibi()", +"cf397201": "addLockedTokeA(address,uint8,uint256)", +"cf39bff5": "accoutToSummonNum(address)", +"cf3b1967": "TOKEN_DECIMALS_UINT8()", +"cf3b70e6": "CreatedIAM(address,uint256)", +"cf3c6fd3": "distributeFounderTokens(address,uint256)", +"cf3ca0fa": "blockDotGasLimit()", +"cf3cb33f": "exchangeToken(address,uint256)", +"cf3d1e3c": "sellOffline(address,uint256)", +"cf3d29ea": "SNTMock(address)", +"cf3d3849": "getNumInvalidMarkets()", +"cf3d82e5": "setMaxStage1AllocationPerInvestor(uint256)", +"cf3dd39e": "existenceTotalSupplyTest(address)", +"cf3e172b": "getTokenInfo(address,bytes32)", +"cf3e194d": "calculateMultiplierAfterConversion(address,uint256)", +"cf3e52b8": "ValidateWorldSnapshotInternal(uint256)", +"cf3e52d9": "topWizard()", +"cf3e9519": "lrcUnlockPerMonth()", +"cf40bb58": "currentTimeIndex()", +"cf40f290": "EventLuckyNumberUpdated(uint256,uint256,uint8)", +"cf4186cb": "rejectMint(uint256,uint256)", +"cf41d6f8": "getPaid()", +"cf4228ea": "isSignedByAll()", +"cf4246a6": "ethereum2USDprice()", +"cf424b16": "releaseForSeed(address,uint256)", +"cf427d1b": "currentPenalty(address)", +"cf4315bb": "MINBET_perROLL()", +"cf43f4aa": "TrustedhealthToken()", +"cf4422e8": "getMilestoneDetails(bytes32)", +"cf44f5f7": "updateKeyMasks(uint256,uint256,uint256,uint256)", +"cf456865": "createCompany(bytes32,bytes32,uint256)", +"cf45f83b": "MADToken()", +"cf460fa5": "right16(uint256)", +"cf462616": "isVestingSet(address)", +"cf464997": "safeAssert(bool)", +"cf46827e": "getStakingMetrics(address,bytes32)", +"cf46bd24": "TransferContractOwnership(address,address)", +"cf46db5b": "isAllowed(uint8,address)", +"cf46dca7": "setProducer(address,bool)", +"cf47810c": "deleteAvatar(uint256)", +"cf478921": "addSpecialFeeTake(address,uint256,uint256)", +"cf47c326": "generateCryptsyToken()", +"cf488329": "BITCASH(string,string,uint8,uint256)", +"cf48d1a6": "setVox(address)", +"cf4a1612": "scheduleTransaction(uint256,address,bytes,uint256)", +"cf4baa4b": "kemnagToken()", +"cf4c3eac": "reservedWeis()", +"cf4cc8fb": "BitBallCoin()", +"cf4cea67": "dateBonus(uint256,uint256,uint256)", +"cf4d3a88": "PeopleSeedCapitalCoin()", +"cf4d6c0b": "AcceptsHyperDivs(address)", +"cf4e593a": "getPlayedGameJackpot()", +"cf4e964a": "cardStructs(uint8)", +"cf4e9ec3": "endCallRequestDate(address)", +"cf4fab1f": "PERFORMANCE_FEE_RATE()", +"cf504d48": "projectActive(uint256)", +"cf509b9d": "gracePeriodAmount()", +"cf51ee7a": "removeValueBonus(uint8)", +"cf51f582": "NucleusVisionAirDrop()", +"cf52a7b2": "whiteListAddress(address)", +"cf52ab0b": "New(address,uint256,uint256)", +"cf5303cf": "checker()", +"cf530bc3": "LOG_NewBet(address,uint256,uint256,bytes32)", +"cf53951d": "test_registrationInformationAccurate()", +"cf53d630": "getBetInfoByID(uint256)", +"cf54aaa0": "getDecimals(address)", +"cf561cea": "TestKToken()", +"cf564ab5": "getVehicleByAddress(address)", +"cf5713b6": "whatsMyName()", +"cf58802f": "getOverview(uint256,uint256)", +"cf58a045": "memberBuyToken()", +"cf58fbeb": "test_insert_findWithHintNextRemovedUpdateTail()", +"cf5ae516": "PauseICO()", +"cf5b5a77": "medalUnFreeze()", +"cf5b8018": "summSupporters()", +"cf5b90f0": "sendToken(address[])", +"cf5ba53f": "create(bytes)", +"cf5bd8e6": "EthBlockExplorer()", +"cf5c1b52": "setForSale(uint256,bool,uint256)", +"cf5c2ac7": "usdCentsBalance()", +"cf5c8b99": "CuratorRules(address,address[])", +"cf5cb132": "getRegisteredAssets()", +"cf5d4e4d": "BarterCoin()", +"cf5d57db": "changeReward(uint256)", +"cf5e36df": "getWeiContributed(uint16,address)", +"cf5f2201": "unMinedPop()", +"cf5f87d0": "updateConsumable(uint256,uint256,uint8)", +"cf6036fd": "length(bytes1)", +"cf62277c": "ThePiContract()", +"cf62d4e3": "changeMaxBetDoubleDice(uint256)", +"cf6304d4": "endPreTokensale()", +"cf6346cb": "presaleMinValue()", +"cf63bb83": "neymarHasMinted(uint256)", +"cf63edea": "tokenIdExist(uint256)", +"cf64c42f": "endCrowdsalePhase1Date()", +"cf64da7f": "HOVERCRAFT_TYPE()", +"cf652d1d": "setDefaultBoxNumber(uint256)", +"cf654886": "getHeroLevel(uint256)", +"cf65952c": "deactivateDevice(address)", +"cf662b5e": "JGCoinOld()", +"cf665443": "nextMint()", +"cf6661fb": "getNativeAsset()", +"cf67805c": "MumsTheWord()", +"cf682b3c": "VMVToken()", +"cf69318a": "left60(uint256)", +"cf693418": "_teamJackpot(uint256)", +"cf69443c": "getCurrentUserTotalReward()", +"cf69df28": "getDataRequestLength()", +"cf6a8722": "removeBytes32(bytes32)", +"cf6accab": "sendCharityPrizeToCharityAddress(uint256)", +"cf6ad876": "cancelAgreement()", +"cf6b1081": "proxyGetRefund()", +"cf6b3822": "WatchCollectedFeesInSzabo()", +"cf6b70cf": "many_payments()", +"cf6b8bbf": "XYT()", +"cf6bd8b9": "view62()", +"cf6d06a1": "transferFree(address,uint256)", +"cf6e4488": "custodianChangeReqs(bytes32)", +"cf6efb49": "getCdRate()", +"cf6f3b59": "userAdd(uint256)", +"cf6f3fe4": "distance_driven()", +"cf6fbb9d": "Mint(address,uint256,uint256,bytes32)", +"cf6fbeea": "takeAway(address,address)", +"cf6fcbb0": "calculateAveragePixelPrice(uint256,uint256)", +"cf7018d4": "setAdURI(uint256,string)", +"cf70ba36": "tokenZNT()", +"cf710b34": "showTeam()", +"cf710b73": "test_setMaxSize_update()", +"cf72085f": "deliverTokensBatch(address[],uint256[])", +"cf7209c5": "KyberHandler(address)", +"cf724096": "transferEthers(address,address,uint256)", +"cf72b511": "get_refund_deposit_addr_amount(uint256)", +"cf7315c6": "retract(bytes20)", +"cf731bd7": "Temgean()", +"cf73a1bc": "managerAddress()", +"cf756935": "determineLuckyVoters()", +"cf763d1c": "periodLimit()", +"cf76a3b9": "TokenState(uint256,uint8)", +"cf76cb7d": "simInstallments(bytes)", +"cf76ebf9": "carsGifted()", +"cf772c7d": "victims(uint16)", +"cf7730f1": "reserveFundSupply()", +"cf775255": "configureDomainFor(string,uint256,uint256,address,address)", +"cf77c8db": "setAffiliateContract(address,address)", +"cf78044d": "setMaxIndex(uint256)", +"cf783d8a": "allAccounts()", +"cf78a450": "unlockBBK(uint256)", +"cf78cf0d": "ContractCreated(address)", +"cf7956ab": "SIEToken(address,address)", +"cf79d8b4": "completeRemainingTokens()", +"cf7a8965": "steal()", +"cf7aebea": "transferAntique(address,bytes32)", +"cf7b38a2": "resumeCollectToken()", +"cf7b8c5f": "player_count()", +"cf7bb192": "canStakeExisting(address,bool,uint256,uint256,uint256,uint256,bytes8,uint256)", +"cf7c2985": "setAuctionPriceLimit(uint256)", +"cf7c2b31": "paymentOf(address)", +"cf7d0304": "MintableLazyCoderToken()", +"cf7d23a3": "Withdrawn(uint256,address,uint256)", +"cf7dcc15": "distributeEth(uint256,uint256)", +"cf7e01ba": "ICO1Period()", +"cf7e06cb": "setCapForParticipants(address[],uint256[])", +"cf7e69f8": "changeCooldownIndex(uint40,uint16)", +"cf7e9242": "getAgreements()", +"cf7efb4c": "SketchMarket()", +"cf7f12ea": "getBidCountForSketchesWithHolder(address)", +"cf808000": "iWantXKeys(uint256)", +"cf81377d": "eosDASH(uint256,uint256)", +"cf813e3f": "getLockTime(uint8)", +"cf81978b": "recipientMIT(address)", +"cf81f24d": "iWannaLiveForever()", +"cf820461": "txFee()", +"cf82601b": "removeInstitutionAsset(string,string)", +"cf82731f": "getPic(uint256)", +"cf832ce2": "ownerRefundPlayer(bytes32,address,uint256,uint256)", +"cf837fad": "contractLock()", +"cf8407c9": "registerFund()", +"cf854969": "rate1()", +"cf866d6f": "LastProposalCanDiscard()", +"cf86a95a": "transferMintership(address)", +"cf876b72": "setAccountUrl(string)", +"cf879e83": "isRevoke(address,address)", +"cf881ad9": "fUseAmount()", +"cf88eebe": "enableBuyBackMode(address)", +"cf8951d1": "CollateralTransfered(uint256)", +"cf89744f": "MaxBetUpdate(uint256)", +"cf89956e": "Base(uint256,string,uint8,string)", +"cf8a24de": "emulatePurchase(address,address,uint256,uint256,uint256)", +"cf8bc918": "getCrowdsalesLength()", +"cf8c9cc8": "submitTransaction(address,address,uint256,uint256,bytes)", +"cf8d652c": "tokenCreationRate()", +"cf8d8ca0": "walletName()", +"cf8e9996": "MuellerFiredby51()", +"cf8eb597": "AccountIsFrozen(address)", +"cf8eeb7e": "subBalance(address,uint256)", +"cf8f4d4f": "getParticipantRegistry()", +"cf8f8f12": "finishICOInternal()", +"cf8fee11": "getBasicRate(address,bool)", +"cf904e7d": "delCertAdmin(address)", +"cf9057f7": "findNextYear(uint256,bytes4)", +"cf905858": "hasIdentity(address,address)", +"cf90bfc9": "DatPayToken()", +"cf90e741": "Presale(uint256,uint256,address)", +"cf910b37": "_getRandom(bytes32[4],uint8)", +"cf913ae7": "setKoikeToken(uint256,address)", +"cf914a87": "ownerSetOverride(address,bool)", +"cf91e331": "TransferGenesis(address)", +"cf92e19b": "maxPlayableGameId()", +"cf934d67": "newIndex(bytes32,uint256)", +"cf934fb8": "sendToBeneficiaryContract()", +"cf94e395": "set_hosp(uint256,string)", +"cf951c9f": "initAsset(uint256,string,string,string)", +"cf9530d0": "totalSupplyOf(address)", +"cf957ce0": "ROSCA(uint16,uint128,uint256,address[],uint16)", +"cf9676c1": "setMintRequestUintMap(uint256,int256,string,uint256)", +"cf96ce03": "setHouseEdgePercent(uint256)", +"cf9779cd": "accountFor(address,bool)", +"cf984f16": "testFailRestartEnforceRevisions()", +"cf98e120": "calculateStagePrice()", +"cf991259": "BRANDS_ADDR()", +"cf99a4d9": "buybackTypeTwo()", +"cf99cd2e": "iterateThroughSwarm(address,uint256)", +"cf99d935": "finalizeIfNecessary()", +"cf9a60d4": "ETH_USD_EXCHANGE_RATE_IN_CENTS()", +"cf9ac727": "logPrice(address,address,uint256)", +"cf9ac928": "bbd36484()", +"cf9b62d9": "OwnerOf(uint256)", +"cf9b9e0a": "FDCToken()", +"cf9d33d8": "GeniusInvest()", +"cf9df5eb": "insert(address,address,address,address,uint256,address,bytes32,uint256)", +"cf9f3db2": "PresaleTimeRangeChanged(address,uint256,uint256)", +"cf9f5ef6": "MANW()", +"cf9faf1d": "ownerSetRate(uint256)", +"cfa0136f": "setPresaleEndTime(uint256)", +"cfa01baf": "prepareForEarlyFinalization()", +"cfa059ee": "getIssuanceIds(bool,bool,bool,bool,uint256,uint256)", +"cfa06700": "_emitAccessBlocked(address,bytes32)", +"cfa084b0": "setTransferOwnership(address)", +"cfa0c480": "addTx(address,uint256,bytes)", +"cfa12510": "returnHash(address[2],uint256[7])", +"cfa24ee3": "setFighterCoreAddress(address)", +"cfa3bfce": "_validateLockupStages()", +"cfa3c132": "parentOf(uint256)", +"cfa446ec": "Standard_2()", +"cfa46990": "getSellUnicornFullPrice(uint256)", +"cfa4a6a6": "getPools(bytes32)", +"cfa4f3e8": "setRelease(uint256)", +"cfa517df": "getOwnerByAnimalId(uint256)", +"cfa51e01": "getAllTokenSold()", +"cfa5cfd3": "balanceInSpecificTier(uint256)", +"cfa5d53b": "blocktubeTransfer(address,uint256)", +"cfa5df4b": "swapAbleToken()", +"cfa5f02a": "exchangeETH()", +"cfa675cc": "_revealBid(bytes32,address,uint256,address,address,address,uint256,uint256)", +"cfa7074b": "BuyRateChanged(uint256,uint256)", +"cfa75d43": "developer_add_string_B(string)", +"cfa83079": "minHpDeducted()", +"cfa86845": "RedeemingTimeLimit()", +"cfa9fa85": "percentageHumanityFund()", +"cfaa234c": "_isNotMixing(uint256,uint256)", +"cfaa759d": "privateIcoStartTime()", +"cfaaa266": "TransferOwnership(address)", +"cfaaff4c": "ADZbuzzCommunityToken()", +"cfab3056": "guesses(int256)", +"cfab472f": "isUserEnabledForContract(address,address)", +"cfab6554": "sumElements(uint16[])", +"cfab8862": "pfcController()", +"cfabe67b": "acceptVestingTrusteeOwnership()", +"cfac2280": "uniqueJingles(bytes32)", +"cfad5277": "totalAddresses()", +"cfae2c65": "dispenseTokensToInvestorAddressesByValue(address[],uint256[])", +"cfae3217": "greet()", +"cfae52e1": "createFirstDay()", +"cfaed1e2": "minAllowedBetInEth()", +"cfaf7315": "BuyEggs()", +"cfaf8a33": "sellTile(uint256)", +"cfb009cf": "Obredis()", +"cfb079d3": "DX()", +"cfb27084": "switchAirDrop(bool)", +"cfb3647b": "tokenMinter()", +"cfb3a493": "getMyBounty(uint256)", +"cfb3b886": "jack_nonce()", +"cfb45e3c": "_cancelOperation(bytes32,uint256)", +"cfb51928": "stringToBytes32(string)", +"cfb5a5f8": "getShare(uint256)", +"cfb64dfc": "addCustomerFromProviderAdmin(address)", +"cfb6e9af": "LogBet(address,uint256,uint256)", +"cfb75c92": "slavenAdress()", +"cfb7b9e9": "PROM()", +"cfb9147d": "exploreFastenETHFee()", +"cfb9e26f": "getStateOfPlan()", +"cfba0279": "hasSkill(address,uint256,uint256,uint256)", +"cfba24ac": "isSenderBiometricLocked()", +"cfba4fe0": "findBalance(address)", +"cfba99dc": "getQuoteAsset()", +"cfbb2047": "currentSmartSpeedNumber()", +"cfbb4b24": "Invent()", +"cfbb7d36": "teamWithdraw()", +"cfbb9f37": "DOW_THU()", +"cfbbbd9e": "PASS()", +"cfbbd902": "calcWinNumbers(string)", +"cfbbda3d": "seekApproval()", +"cfbd3bbb": "GetCarrot(address)", +"cfbd4885": "revokeMinter(address)", +"cfbe2cb3": "walletDeposit(address,uint256,uint256)", +"cfbed755": "getCard(uint64)", +"cfbef67d": "extract(bytes,uint256)", +"cfbf92a9": "getNodeStake(address)", +"cfbf9a36": "getBetRecord(uint256)", +"cfc05b56": "setTokensSoldGoal(uint256)", +"cfc0cc34": "getStrategy(uint256)", +"cfc19710": "closeMtr()", +"cfc220b6": "SpermLabs()", +"cfc2a93e": "dividendRoundsBeforeFoundersStakeUnlock()", +"cfc2aad2": "generateBonusForGene(uint256)", +"cfc41c91": "reb()", +"cfc450af": "maxInvestmentInWei()", +"cfc45610": "Makindo()", +"cfc4af05": "blt()", +"cfc4af55": "tau()", +"cfc4d0ec": "getOrderHash(address[5],uint256[6])", +"cfc54848": "sendEth(uint256)", +"cfc5a969": "bytesToUint(bytes32)", +"cfc5e7c8": "getSellCount(address)", +"cfc72007": "selfdestruct(address)", +"cfc7e2da": "getMinAmount()", +"cfc9cb7f": "ForestingToken(address)", +"cfca375c": "NooCrowdsale()", +"cfcb2b7e": "createController(address,address,address,uint256,uint256,uint256,uint256,uint256)", +"cfcb69d1": "TelegramTON()", +"cfcba2f8": "firstRefundRoundFinishTimestamp()", +"cfcc09a9": "simpleICO(string,string,uint8,address,uint256[],uint256[],int256)", +"cfcc57ad": "maxFundsThatCanBeWithdrawnByOwners()", +"cfcc7720": "rechargeRobot(uint256)", +"cfcccb32": "escrowList(address)", +"cfcd84a9": "collectibleIndexToPrice(uint256)", +"cfcd8c2d": "init(address,uint256,uint256,uint256,uint256,uint256,uint256,bool,address,bool)", +"cfcdde19": "PRICE_PREBUY_BONUS()", +"cfd00530": "isContractSignedBySigner(string,address)", +"cfd0a970": "TierClassicDividendAddress(address)", +"cfd129f8": "stageSoftcap(uint8)", +"cfd28966": "getMigrateOutDestinationValue()", +"cfd2eb49": "StoreComission(address,uint256)", +"cfd32aa0": "removeFunder()", +"cfd32ef7": "isMember(address,bytes32)", +"cfd3c17d": "currentLuckyStoneNumber()", +"cfd447d7": "startSale(uint256,bool)", +"cfd4ca6b": "contract_md5()", +"cfd4edcf": "ProofOf()", +"cfd550a3": "ICO_ENABLERS_CAP()", +"cfd56a13": "_sell(address,uint256,uint256)", +"cfd5cb77": "userAttackMonsterCDSeconds()", +"cfd65fdb": "assertEq19(bytes19,bytes19)", +"cfd6eea2": "QDCoin()", +"cfd7ab91": "STARTTIME()", +"cfd7be04": "backNewHopeOwner()", +"cfd7f1fb": "_chkBuyerLmtsAndFinl(address,uint256,uint256)", +"cfd8a175": "betPrice()", +"cfd8d6c0": "setProvider(address)", +"cfd938df": "Channel(string)", +"cfd94b01": "votersLen()", +"cfd9e0ea": "getStateForTime(uint256)", +"cfda7175": "getArbiterFeeAmount(uint256,uint8,uint256,address)", +"cfdac910": "getSketchesWithAuthor(address)", +"cfdacb58": "SetCryptoPrice(uint256,uint256)", +"cfdafde4": "saleIsFinished()", +"cfdb2eb7": "freeClaimAllowanceOf(address)", +"cfdb35ed": "setLKCExchangeRate(uint256)", +"cfdba320": "getRemainLockedOf(address)", +"cfdbf254": "MAX_BATCH_SIZE()", +"cfdd4520": "showCurrentBidValue()", +"cfdd7557": "CountOfAlastayaToken()", +"cfdd7e8a": "createFirstCommonsForum()", +"cfdf35b6": "removeLog(string)", +"cfe01e23": "anyAuditRequestMatchesPrice(uint256)", +"cfe0a5dc": "tokenKoef()", +"cfe0d487": "backup_finishIcoVars()", +"cfe0eeb7": "startSale(uint32,uint64,uint64)", +"cfe186b2": "finishGame(uint256)", +"cfe1887b": "delListReq(string,uint256,uint256)", +"cfe2b37a": "setIntF1ArrBoolF2AddressF1(int256,bool[],address)", +"cfe2f4e2": "Nicks()", +"cfe30939": "houseEarnings()", +"cfe3b8fb": "sTks(address,uint256)", +"cfe3d16d": "_register(address,address)", +"cfe3e683": "GWBCoin()", +"cfe4fb8e": "VECTORZILLA_RESERVE_VZT()", +"cfe52bdd": "sendFunds(address)", +"cfe5344a": "updateNovaAddress(address)", +"cfe5655c": "createDataControl()", +"cfe60c87": "LookRevToken()", +"cfe643ac": "getRightAndRoles()", +"cfe67587": "getWeeklySellVolume()", +"cfe6f220": "CertificateAddresses(bytes32)", +"cfe76488": "whitelistApplication(uint256,bytes32)", +"cfe7b770": "getBetInfo()", +"cfe7e7a0": "createLamboSale(uint256,uint256)", +"cfe7f3c0": "AddForm45(uint256,uint256,uint256,uint256)", +"cfe8c535": "giveAnimals(uint8,address)", +"cfe9a7b8": "getPackageName(uint256)", +"cfea3bb6": "swapTokenInfo(address)", +"cfea751f": "getIsAllTransfersLocked()", +"cfeaa5ea": "setBonusList(address)", +"cfeaaca1": "newCampaign(string,uint256,uint256,address)", +"cfeb93a8": "delABaddress(uint256,address,address)", +"cfeb9a97": "setSubFreezingTime(uint64)", +"cfeb9ec0": "BSmartValueCirculateAssets()", +"cfebb88b": "recallVoteToFreezeFund()", +"cfebc813": "changeExplain(string)", +"cfebf24d": "optionOf(address)", +"cfec22f8": "minSum()", +"cfec6ca3": "calculateProfitGameType1(uint256,uint256)", +"cfec8d83": "GetUserPELOAmount(address)", +"cfec934a": "runCrowdsale()", +"cfecd73d": "EtherIncPrivate()", +"cfed9199": "timePassed(uint256)", +"cfedc04a": "neverdieToken()", +"cfee88db": "closeClaims()", +"cfefaa8b": "Executed(string,uint256)", +"cfefb3d5": "payout(bytes32)", +"cfefcfb0": "VotedForProposal(uint256,address)", +"cfefe48b": "transferableTokensNow(address)", +"cfefe5a2": "isContribPeriodRunning()", +"cfefeb60": "airDropTime()", +"cff068a3": "random(uint256,uint256,address,uint8)", +"cff07771": "getEvaluationCount()", +"cff0ab96": "params()", +"cff12797": "setIcoPhase3(uint256,uint256)", +"cff13efb": "newCar(string,bytes17)", +"cff1b6ef": "updateAdminFee(uint256)", +"cff29dfd": "bidders(uint256)", +"cff2fa42": "_returnFee(address,uint256)", +"cff382ae": "AICrypto()", +"cff3d4d8": "stage1()", +"cff410b4": "Exit()", +"cff43a03": "verifyNewOrganizer(bool)", +"cff4d6cd": "payoutTotal()", +"cff5b28e": "FLUX()", +"cff61fb6": "batchExchange(address[])", +"cff6bc21": "allSigners(uint256)", +"cff72e67": "changeDevelopersRecipient(address)", +"cff76d67": "totalEthBankrollRecieved()", +"cff82e22": "getTicketCount(address)", +"cff9293a": "vote(uint32,uint32)", +"cff941fc": "Configured(address,address)", +"cffa4346": "DIETCoin()", +"cffc9997": "SetBuildingData(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"cffdc976": "WithdrawOwnerFunds(uint256)", +"cffe02cf": "setCrowdsaleRate(uint256)", +"cffe764c": "Insure()", +"cffee328": "successfulDeals()", +"cfff25bb": "getNumReserves()", +"cfff63ca": "assignMediator(address)", +"cfff8974": "mintToInfluencer(address,uint256,string)", +"cfffa030": "lanch_atak()", +"d0005aa4": "salesStart()", +"d0008a6d": "addNewMember(address,uint256)", +"d000a404": "PT(uint256,string,string)", +"d001425a": "bank2()", +"d0015500": "ownerSecondary()", +"d002462b": "setDeploymentFee(uint256)", +"d002a41c": "getUnReportedMatches()", +"d00408b7": "StandardToken(address)", +"d0044f9a": "_getLuckyList(uint256,uint8)", +"d0045341": "totalMintAmount()", +"d0047acf": "mint(address,uint256,uint32)", +"d004f0f7": "swap(address,uint256)", +"d004f38b": "setRates(uint256,uint256,uint256)", +"d0064c00": "maxDebt()", +"d0068f80": "getClient(uint256)", +"d0072e59": "forceReturn(address)", +"d007c644": "payInterest(address)", +"d007ff4b": "showJackpotBalance()", +"d0089141": "ovedclaimBountyairdrop(address,uint256)", +"d008d7a2": "BosToken()", +"d00910a3": "yearlyTeamTokensPaid(uint256)", +"d0095cc6": "genNumber()", +"d00a9058": "getOwnTokens()", +"d00cce41": "roleExists(string)", +"d00d20f4": "getTokensCrowdsaled()", +"d00eef6a": "TokenGranted(address,uint256,string)", +"d00ef880": "setShareTokenAddress(address,address)", +"d01296d9": "addmember(uint256,address)", +"d0130009": "Subtraction(uint256,uint256)", +"d013a182": "getServerBuildingWeapon(uint256,uint8,uint8)", +"d0142c47": "ImperialCreditToken()", +"d014c01f": "enter(address)", +"d014d667": "XCDT()", +"d0158b87": "fetchCancelledOrdersForMerchantByAdmin(address)", +"d015d86f": "getRoundStats()", +"d015f6dd": "NorthPoleAddress()", +"d01678f0": "raiseDay2()", +"d0169c1e": "lockAsset(bytes32)", +"d0169f4c": "start_POSTICO()", +"d016ec40": "vipBrokerNum()", +"d0174145": "create(address,address,uint256,uint256,uint256,uint256)", +"d017c2b4": "returnTokensToWallet()", +"d017cdcf": "acquireFame(uint256)", +"d017e20d": "processing(address,uint256,uint256,uint256)", +"d017f49b": "JustOneToken2()", +"d01860d0": "isFinishedSuccessfully()", +"d018a00f": "redeemBeer(bytes32)", +"d018db3e": "attack(address)", +"d0198c33": "getFunctionIdentifier(string)", +"d019d2c4": "MRT()", +"d01a69c9": "totalBeneficiaries()", +"d01a9453": "BitAirToken(address,string,string,uint256,uint256)", +"d01ab2e6": "_cancelOrder(address,address,uint256,address,uint256,uint256,uint256)", +"d01ab31a": "ICOStart()", +"d01b555d": "setSalePause(bool)", +"d01ba5f0": "increaseShardBalance(address,uint256)", +"d01bbdc9": "setOracleCallbackGasLimit(uint256)", +"d01c0904": "FujintoToken(uint256,string,uint8,string)", +"d01d0175": "StorageConsumer(address)", +"d01d6b86": "amountOfRegisters()", +"d01e2df9": "testContains()", +"d01ec886": "importPresaleContribution(address)", +"d01f4c9f": "hoursSinceTimestamp(uint256)", +"d01f4ffe": "stopSecondSale()", +"d01f63f5": "getWhitelist()", +"d02041f3": "advisorsPeriodAmount()", +"d02042a3": "relief()", +"d020ae40": "gameTotalGen()", +"d020dc3b": "rejectMessage(uint256,string)", +"d02143ed": "getRefToLength(address,address)", +"d0216dce": "XXXXXXXX07(address)", +"d021d8da": "Coinbase()", +"d0220b1c": "setCreateChampFee(uint256)", +"d0225e9e": "MAX_LRC_DEPOSIT_PER_ADDRESS()", +"d0237ab8": "EtherLiteSupply()", +"d023d2bd": "getGladiatorChestPrice()", +"d023d32c": "setEndAfterSecond(uint256)", +"d024768f": "computePropertyHash(string,string)", +"d024cd02": "startAuctionDirect(uint256,uint256,uint256,uint64,address)", +"d02528e6": "GetGameIndexesToProcess()", +"d02721cb": "withdrawProvider()", +"d02764f3": "releasesCount()", +"d0280037": "buyin(uint8,bytes32,bytes32)", +"d0286ab2": "setEmissionTime(uint256)", +"d028754b": "Withdraw_1()", +"d028a625": "deathData_v11()", +"d028c246": "Compaq()", +"d028f571": "getTokenForTeam(address)", +"d0297bc6": "changeMaximumContribution(uint256)", +"d02982cf": "isMember()", +"d029a530": "buyUnicornWithCandy(uint256)", +"d02a4f84": "bcn()", +"d02a6db7": "TokenLongExercised(address[2],uint256[7],uint8,bytes32[2],uint256,uint256)", +"d02a9889": "getDateOfFirstPayment()", +"d02b1653": "enablePrivateFund()", +"d02b97aa": "withdrawPromoter()", +"d02bf162": "spinTheWheel()", +"d02bf828": "lotteryTokensWallet()", +"d02c438a": "enableTokenSupport(bool)", +"d02c8cdf": "cancelMatch(uint256)", +"d02cc69f": "playWar(uint256)", +"d02d08b2": "hasCrowdsaleFinished()", +"d02d1382": "getPlayerCard(uint8)", +"d02d3892": "ApolloSeptemBaseCrowdsale(address,address)", +"d02d4554": "createUser(address,address)", +"d02d518d": "setArtEvt(string,string)", +"d02dade4": "getProviderCounter()", +"d02ddc12": "insert(bytes1,bytes1)", +"d02e140a": "finalizePrivatesale()", +"d02e5cfb": "mtcDailySpent()", +"d02e8f70": "MONUMENT_CITY_FEE()", +"d02ea39e": "DuckToken()", +"d02ecbb5": "ObitanChainxToken()", +"d02f5463": "pillarTokenFactory()", +"d02f7351": "seizeAllowed(address,address,address,address,uint256)", +"d02f8b98": "getApplications(address,bytes32,address)", +"d02fcad9": "wdiv(uint128,uint128)", +"d0302051": "rewardPercent()", +"d031370b": "reserveTokens(uint256)", +"d0315658": "getShareDistributionWithTimestamp(bytes)", +"d031babf": "LikeCrowdsale(address,uint256,uint256,uint256)", +"d031d8c4": "_transferLand(uint256,uint256,address)", +"d032ae76": "doAirDrop(address[])", +"d033c456": "addAddress(address,string)", +"d033d277": "OwnerNamed()", +"d033e6ee": "preAllocate(address,uint256,uint256)", +"d033f913": "getRoundSeedHash(uint32)", +"d034536e": "logFileClosing(string,uint256,string,string)", +"d0356fa8": "createVestingGrants()", +"d035bed4": "validContract(address,uint32)", +"d035e45f": "token_escape(address)", +"d0360e59": "drainContract()", +"d036261f": "amountBonuses(uint256)", +"d036bce2": "_calculateTokens(uint256)", +"d0376283": "onlyApprovedOrOwnerOfToken(uint256,address,bool)", +"d0378d07": "decreaseReserve(uint256,uint256)", +"d038906a": "FloraFicToken()", +"d0399bb8": "endGame(uint256)", +"d03b41a9": "bountyBalance()", +"d03bf119": "RANGESTART_11()", +"d03c8e34": "addAngel(address)", +"d03cff97": "devMiningRewardPerETHBlock()", +"d03d5231": "raffleDraw()", +"d03d9604": "maskIt(address,uint256)", +"d03e1021": "ORACLIZE_GASPRICE_GWEY()", +"d03e3059": "someMethod3(uint256,uint256,uint256)", +"d03e6817": "Volkstest()", +"d03e9bcc": "LogReceiveFunds(address,uint8,uint256)", +"d03e9fff": "plusTourFreezingTime(uint256)", +"d03ffefb": "createDeposit()", +"d04148d6": "m_account()", +"d04206f3": "CROSS_RESERVE()", +"d042a795": "multiSendA(uint256,uint256)", +"d042ce2c": "currentStageTokensBoughtByAddress()", +"d04301f2": "Annexe_SO_DIVA_SAS_5()", +"d0431cf5": "_openBox(uint256)", +"d0435cb0": "MonsterTokenCrowdsale(uint256,address,address,uint256,uint256)", +"d043d028": "toBytes4(bytes,bytes,uint256)", +"d045e1ff": "_inverse()", +"d046065e": "addBet(uint256,uint256,address,uint256)", +"d0471ee1": "Leverages(address[])", +"d04737bd": "Yuzhuralzoloto_2()", +"d0479abc": "burnUnsoldTokens(uint256)", +"d047a0d0": "getEmergencyTransferSigner(address,uint256)", +"d04807e9": "Heronium()", +"d0481f82": "hasLicenseTerms(bytes32,bytes32)", +"d048bc87": "inAngelPeriod()", +"d048db37": "getOfferCount()", +"d04a419b": "getDegree(bytes32)", +"d04a46b0": "sendFutureExpanstionBalance(address,uint256)", +"d04b019e": "getWalletResourceBalance(address)", +"d04b5f82": "test01Token()", +"d04bfc9c": "buyer_pay()", +"d04c9115": "getLoyaltyPoints(address)", +"d04cb43f": "withdraw_all_token(address,address)", +"d04d26fe": "updateStrength(uint256,uint8)", +"d04d2ca3": "BlacklistParticipant(address)", +"d04d8667": "authorized_recordPlatformFee()", +"d04dbdea": "Testtoken4()", +"d04e5586": "MEAManager()", +"d04f0535": "PisticciCash()", +"d04fe107": "getActiveAds()", +"d050498e": "assertEq24(bytes24,bytes24,bytes32)", +"d050557d": "bulkRegisterPoA(bytes32,bytes32,bytes,uint256)", +"d05144c8": "getMakeCount()", +"d0516650": "frozen(address)", +"d0516b82": "maxPresaleAmount()", +"d051dfd3": "prizes(uint256,address)", +"d052fbf6": "getHistory(string,uint256)", +"d05391d2": "admin_transferFrom(address,address,uint256)", +"d05407d4": "SetStepFunctionWrapper(address,address)", +"d054261e": "_generateRandomHash(string)", +"d05461a6": "mintForReportingParticipant(int256,address,uint256)", +"d0549602": "scheduleTransaction(address,uint256,uint256,uint256)", +"d054cd87": "badBoardSent(bytes10,uint256,uint8,bytes32,bytes32,bytes10,uint256,uint8,bytes32,bytes32)", +"d0569bc8": "getWinResults(uint256)", +"d056cc69": "stateCode(uint256)", +"d0578df9": "SMGC()", +"d0587032": "tablet_length()", +"d0590bad": "generateMessageToSign(address,uint256)", +"d05b7ca4": "uintToChar(uint8,uint256)", +"d05ba4da": "addPokemonToSellingList(address,uint256)", +"d05bb517": "withdrawFeeToken(uint256)", +"d05c78da": "safeMul(uint256,uint256)", +"d05c9342": "_getATxToken()", +"d05c9ad6": "setNumRewardsAvailableForAddress(uint256,address,address)", +"d05cb545": "registry(address,uint256)", +"d05d996f": "TXDELAY()", +"d05ec6c5": "getBonus4(uint256)", +"d05ee727": "teamAccount()", +"d05efd40": "directorA()", +"d0600560": "AD()", +"d0607948": "getteamnum(address)", +"d060a2a5": "doSmallDrop(uint256,uint256,uint256,uint256)", +"d0610ac9": "interpolate(uint256,uint256,uint256,uint256,uint256)", +"d0617f2f": "OMICrowdsale(uint256,address,address,address)", +"d062c7ab": "CleanBankerCandidate(uint8)", +"d06301d3": "__resolve(uint256)", +"d063f55f": "toLittleEndian(uint64)", +"d06426d5": "convertUsdToEther(uint256)", +"d0647f30": "_createDebt(bytes,bytes,uint256)", +"d06502b9": "batchTransferAgileToken(address[],uint256[],address,address)", +"d06544d0": "getCoinAddress(string)", +"d0658850": "ListingDB(uint64,uint64,address)", +"d066c841": "GenesisBuyPriceHistory(address,uint256)", +"d06760da": "isPartOfOrg()", +"d0676647": "ProposalClosed(uint256,uint256,uint256,uint256,bool,uint256)", +"d06798f2": "fourweeks()", +"d0679d34": "send(address,uint256)", +"d0683428": "executeRulingA(uint256)", +"d0692775": "gamesLeft(address)", +"d06980f1": "LogHodlClaimed(address,address,uint256)", +"d06982b2": "setDemurrageAmount(uint256)", +"d0699c98": "calcFees(uint256,uint256,uint256)", +"d06a0f5b": "setDynamicCeilingAddress(address)", +"d06a57b0": "pauseAllTokens(bool,string)", +"d06a89a4": "maxLength()", +"d06b3ea0": "whackingPool()", +"d06b44a6": "YKCToken(uint256,string,string,uint256)", +"d06b6f7e": "setMinTokensToSale(uint256)", +"d06ba559": "WrestleCoin()", +"d06c54fb": "acceptNextOwner()", +"d06c7b5b": "signalToken()", +"d06c91e4": "multisigEther()", +"d06ca26c": "managedWallets()", +"d06cdc73": "LuckyNumberService()", +"d06d4612": "jak()", +"d06f887b": "destroyMyToken(uint256)", +"d06f9734": "setTreasurer(address,bool)", +"d0707c61": "PerformingDrop(uint256)", +"d0708e31": "DocumentCertoChainContract(string,string,string,string)", +"d071f7b1": "recover(bytes32)", +"d073c531": "IMOSToken()", +"d073ca3d": "SUCCESS_FLAG()", +"d074443f": "DeathFactor_i()", +"d0747a9c": "getGoldmintFeeAccount()", +"d074a38d": "biddingTime()", +"d074de8c": "Testico()", +"d074f215": "PHASE_1_PRICE()", +"d075c11c": "viewNoncsallocations(address)", +"d0774f74": "GENSIS_TOTAL_COUNT()", +"d077814b": "divBase()", +"d0785dd7": "getNumberOfPlayersInCurrentGame()", +"d07866d2": "sizeOf(uint256)", +"d0799bee": "setRole(string,string)", +"d07a8bd7": "RisingToken()", +"d07ac4c4": "oraclize_query(uint256,string,bytes[4],uint256)", +"d07adab3": "getOutAmount()", +"d07bff0c": "getVoter(uint256)", +"d07c53b6": "thinkMode()", +"d07e7d7c": "setTTCTokenAddress(address)", +"d07e9f90": "getJobsCount()", +"d07f29e5": "addFounderAccounts(address,uint256)", +"d07f2ff6": "GreenWorldFarm()", +"d07f3a8f": "RobBanker(uint8,uint256,uint256,uint8)", +"d07f8181": "decreasePaymentsBalance(address,uint256)", +"d07fdfb0": "October12_2017()", +"d081b681": "vows()", +"d081b9f5": "networkState()", +"d081f2b8": "BOUNTY()", +"d0821b0e": "bet(uint8)", +"d08275f1": "WolframAlpha()", +"d08279b0": "unpauseTournament()", +"d082ea8c": "setExchangeAddress(address)", +"d083955c": "adjustMintRates()", +"d084f670": "getLocked(bytes16)", +"d085835a": "timeLock()", +"d085b82f": "TIMECOIN(address)", +"d085c8b8": "StartDistribution()", +"d085e66e": "GetPart(bytes32,uint256)", +"d0863580": "blocksRemaining()", +"d0868223": "returnATXChanges()", +"d086a201": "main_ico(address,uint256)", +"d087d288": "getNonce()", +"d088070a": "checkWhitelist(address,uint256)", +"d088f50d": "getNumeroCeldas()", +"d0894297": "EARLY_INVESTOR_WALLET()", +"d0897347": "engrave(bytes32,string,string,bytes32)", +"d089e11a": "accountRegistry()", +"d08a787c": "bytes32ToString(bytes32,bytes)", +"d08b89f3": "disableStopping()", +"d08bc007": "logRef(address,uint256)", +"d08bfe26": "CrowdsaleClose(uint256,bool)", +"d08c6803": "deletePerson(uint256)", +"d08d5559": "AABToken()", +"d08d66ec": "setBonusState(uint256)", +"d08d6753": "mdtRewardAmount()", +"d08e2354": "goldPercentage()", +"d08f2c67": "getHistoryAt(uint256)", +"d0900033": "COLONERToken()", +"d09119b4": "mortgage(address)", +"d0914c8d": "RelestToken()", +"d091b550": "newOwnerCandidate()", +"d0937598": "getLuckyblockBase(bytes32)", +"d09398ee": "transferCDP(address,uint256)", +"d093e04b": "payJackpot(uint256)", +"d0940a5d": "best()", +"d0946d00": "subFreeMineral(address)", +"d0949f99": "UINT256_MAX()", +"d094dd21": "getLLV_edit_14()", +"d095761f": "withdrawNetIncome()", +"d095d499": "profit3eggs()", +"d095edb2": "initializeModuleAddresses(address[])", +"d09677df": "TankSellMaster()", +"d09685b0": "getEntriesCount()", +"d096b8f0": "setupRaffle()", +"d0973af8": "transferTokensFromContract(address,uint256)", +"d09812e1": "settlementRegistry()", +"d0982feb": "tokenLockDuration()", +"d0983f4b": "tokenRatios()", +"d0988149": "MANHATTANPROXYMADISONAVE()", +"d0995198": "returnMinGoal(uint256)", +"d0995b33": "refundBalances(address[])", +"d09a6a62": "transferUnlock()", +"d09b0ae4": "RealEstate()", +"d09cb807": "isCurrentAdmin(address,address)", +"d09de08a": "increment()", +"d09e21ee": "ignore(bytes4,bool)", +"d09e3526": "setStatusI(address)", +"d09eae58": "SCAMToken()", +"d09edf31": "authorizer()", +"d09ef241": "getOrder(uint256)", +"d09f85ca": "Eventine()", +"d09f872a": "VenusToken(uint256,string,string)", +"d09f8b8b": "addXY(uint256,uint256,uint256,uint256)", +"d09fb45e": "setApprovedContracts(address,bool)", +"d09fbcee": "HumanTokenAllocator(address,address,address,address,address)", +"d0a05fea": "setI_S(uint256)", +"d0a06fb9": "cloneCard(address,uint256)", +"d0a1adf4": "contains(bytes1,bytes1)", +"d0a27473": "teamUnlock1()", +"d0a2da8e": "give(address,uint256,string,string)", +"d0a2f2c4": "getAllInvestors()", +"d0a45f84": "getVersionImplementation(address,bytes32,address,bytes32,bytes32)", +"d0a4a81b": "setTellerModerator(address)", +"d0a56299": "GetAssetTypeAverageSalePrice(uint256)", +"d0a579fb": "releaseForEarlyInit(address[],uint256)", +"d0a5eb4e": "setMainWallet(address)", +"d0a61995": "sell_(address,uint256)", +"d0a62566": "approveIndexed(address,uint256)", +"d0a63663": "incrementLimitBranch()", +"d0a6f018": "LogBalanceChange(address,uint256,uint256)", +"d0a6fa54": "getPriceById(bytes32)", +"d0a7b467": "setAragonDevMultisig(address)", +"d0a826f3": "setWildcardList(address,address,bool)", +"d0a835e3": "buyShip(uint32)", +"d0a8c801": "fshare()", +"d0aa0313": "setCompte_38(string)", +"d0aa407f": "withdrawEther(bytes32,uint256,uint256,uint256[])", +"d0aac5cf": "teamProfile(uint256)", +"d0ab0066": "calcFlexibleReward(uint256)", +"d0ab48e9": "toB32(bytes,uint256,bytes,address)", +"d0ab8432": "whitelistRegisteredAmount(address)", +"d0ac01ac": "setOfferExpiry(uint256)", +"d0ac2252": "getShipEarning(uint32)", +"d0ad7fb8": "buyTicket(uint256[],address)", +"d0ade72d": "assertEquals(uint256,uint256)", +"d0ae4356": "getRequestStatus(address,address)", +"d0ae9aec": "setMinInvest(uint256)", +"d0aff67d": "setNeverdieContractAddress(address)", +"d0b01e68": "__setBeneficiary(address)", +"d0b02abc": "createProductionUnit3()", +"d0b06f5d": "lastUpdated()", +"d0b0c0d5": "unlockDevTokenSupply()", +"d0b18fbf": "transferByForce(address,address,uint256)", +"d0b1b910": "FXSToken()", +"d0b2b579": "seedFund()", +"d0b368a0": "addToApproveList(address)", +"d0b3da99": "join(uint256,bool)", +"d0b4755c": "RATE_SALESTAGE1()", +"d0b52156": "getIpfsHash(address,address)", +"d0b5981f": "closePreICOPublic()", +"d0b68efb": "yoobaTokenAddress()", +"d0b6ba2a": "moveFunds()", +"d0b74806": "claimA()", +"d0b753f3": "sendPreSaleBonus(address,address)", +"d0b7ca57": "mintToken(address,uint256,bytes,bytes)", +"d0b83db9": "insertUser(address,bytes32)", +"d0b86d15": "FaradEscrow()", +"d0b8bc84": "OwnerUnfreeze(uint256,address)", +"d0b91ca7": "showBurnedCoins(address)", +"d0b94ffe": "web3ViewRoll(bytes32,bytes32,uint256,uint256,uint256)", +"d0b99ee2": "_distributeLandholderTax(uint256)", +"d0b9e58b": "SspContract(address,address,address,uint256,string)", +"d0b9e792": "returnBorrowedEth()", +"d0bb1d40": "airdropsCount()", +"d0bc1a88": "addMoney(uint256)", +"d0bc97d0": "isCrowdsaleFull(uint256,uint256)", +"d0bcebc8": "collectBack3()", +"d0bcfc0c": "Bankroll()", +"d0bec975": "countBid(uint8)", +"d0bf4d95": "SmokeExchangeCoin(uint256,address,address,uint256,uint256,uint256)", +"d0bf9502": "btcLastUpdate()", +"d0bff051": "testSetBalanceDb()", +"d0c03f35": "multisigVault()", +"d0c0c39c": "countTokens(uint256,address)", +"d0c1c844": "getLimitedBalanceOf(address)", +"d0c1d117": "editAddressDescription(address,string,address)", +"d0c24e93": "setNotUpdatable(bytes20)", +"d0c3033c": "generalBounty()", +"d0c32dd3": "otcPurchase(uint256,address)", +"d0c32ea9": "SearchALLFileLength()", +"d0c39f14": "Lottery(address)", +"d0c412ec": "ENDOairdrop()", +"d0c426e6": "burnAllRemainingIBC()", +"d0c475e5": "addRecordStrict(uint256)", +"d0c55ea9": "withdrawForPartner(bytes32,address,uint256)", +"d0c5c585": "getBurnAmount()", +"d0c5c946": "refundBpToken(address)", +"d0c75ea2": "verifyCommonTransaction(bytes32,uint256,address,address,uint256,address,address,uint256,bytes,bytes)", +"d0c7b012": "placeGame(uint24,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bytes32,bytes32)", +"d0c7c635": "mintToTeamAndAdvisors()", +"d0c8a7a5": "randgen()", +"d0c9bb92": "releaseTCLRinTeamTokens()", +"d0ca12ba": "ICO_START()", +"d0ca1982": "getCrowdsaleInfo(address,bytes32)", +"d0ca4dd7": "ownerWithdrawTokens(address,address,uint256)", +"d0ca5e7a": "createTokenToMarket2020()", +"d0ca7379": "mintReferralShare(uint256,address,uint256)", +"d0cac952": "HouseManaged()", +"d0cb874a": "getTokenByMineID()", +"d0ccf4bc": "createInstance(bytes32,bytes32,address,bytes,bytes32,bytes32,address,bytes,bytes32,uint256,uint256,bytes)", +"d0ce659f": "SwitzerlandvsCostaRica()", +"d0ce7360": "closeContract(uint256)", +"d0cf49e9": "zoLastRefreshTime()", +"d0d0ed05": "withdrawVault()", +"d0d13e87": "smartContractIsForSale(uint256)", +"d0d1ea70": "setTrustee(address)", +"d0d2e745": "manualExchange(address,uint256)", +"d0d38b65": "setFirstRankForFree(bool)", +"d0d390bf": "HubToken(address)", +"d0d3b9df": "IfModuleRegist(address)", +"d0d3f5ba": "removeNode()", +"d0d44cca": "setPOOL_edit_34(string)", +"d0d511f9": "getGoalsCount()", +"d0d529a7": "openWindow()", +"d0d552dd": "setAsset(address)", +"d0d68241": "betALenght()", +"d0d832ad": "fundraiseType()", +"d0d89ce3": "cummulativeTokensSold()", +"d0d968c0": "burnFromReserve(uint256)", +"d0d98276": "revokeOffer(address)", +"d0d9e21d": "emitCapabilityAdded(address,bytes4,uint8)", +"d0d9fcf7": "RANGE_STAT_MAX()", +"d0da3e86": "getNextAntiReplayTag(uint256)", +"d0dad7e1": "maxCapMain()", +"d0db5083": "hatch()", +"d0dc0a04": "all_creatures_for_species(uint256)", +"d0dc5c65": "updateTotalSupply()", +"d0dd38ad": "setDepositGasCost(uint8)", +"d0de7b29": "MetadiumVesting(address,uint256,uint256,uint256,bool)", +"d0def521": "mint(address,string)", +"d0e075c7": "BitcoinPurple()", +"d0e0813a": "promote(address)", +"d0e0ba95": "setId(uint256)", +"d0e0e8f6": "isLockedConfig()", +"d0e2bef0": "initFactorReward(uint256,uint256,uint256,uint256)", +"d0e2dc64": "playAway()", +"d0e30db0": "deposit()", +"d0e33b1b": "testGetResults()", +"d0e3cbbe": "getCurrentTotalEther()", +"d0e3f734": "setPubkey(string)", +"d0e4567e": "activeGroups()", +"d0e46235": "buyCardsAndSendGift(uint8,address)", +"d0e4713d": "CEC()", +"d0e55727": "changeOfferTime(uint256,uint256)", +"d0e6cfec": "bountyTokenWallet()", +"d0e709b6": "initialTransfer(address,uint256,uint256)", +"d0e7a5cb": "editPrice(uint256,uint256)", +"d0e95ded": "MithrilOre()", +"d0e98c14": "sendRestBack()", +"d0e9f00f": "BNTBalance()", +"d0ebdbe7": "setManager(address)", +"d0ec057e": "getFeeAmount(uint256,bool)", +"d0ec1607": "cancelPoll(uint256)", +"d0ed5c2f": "walletContract()", +"d0edf912": "createTransaction(address,uint256,uint256,uint256,uint256)", +"d0ee32c4": "getSymbolFromAddress(address)", +"d0ef1048": "_getRand()", +"d0ef368d": "setAllocation(address,address,uint256,uint256,uint256)", +"d0eff891": "weiToEther(uint256)", +"d0f040c4": "checkOwnerAllowance(address)", +"d0f0efcb": "buyPredictXname(bytes32,uint8)", +"d0f13638": "minimumPrepaidClaimedPercent()", +"d0f15e9e": "WalletWithEmergencyTransfer()", +"d0f17d41": "contributionMaximum()", +"d0f2019c": "hasToken(address,address)", +"d0f3235d": "_transferAirdrop(address[],uint256,bytes)", +"d0f3aa80": "allowSale()", +"d0f46c0b": "getUsersContract()", +"d0f4f99c": "solvePuzzle(uint256)", +"d0f5f4cd": "getPixelColor(uint16,uint16)", +"d0f6fc40": "QuantityFactorSet(uint256,uint256,address)", +"d0f76bb8": "End3()", +"d0f7a601": "etherRate()", +"d0f817db": "getOrgCertificatesCount(address)", +"d0f86c9d": "getUser(int256)", +"d0f86ea8": "getMemoryRead(uint256,uint256)", +"d0f86fec": "ENKToken()", +"d0f87ce7": "periodPreITO_mainCapInWei()", +"d0f89c6d": "setWhiteBackersByList(address[],bool[])", +"d0f8c714": "add(bytes32,uint256,bytes,bytes8)", +"d0f8e6a4": "DelegationTransferred(address,address)", +"d0f96983": "composite(uint256,uint256,uint8)", +"d0f96f6b": "DigitalPadlock(string)", +"d0fa968a": "s14(bytes1)", +"d0fab480": "meg()", +"d0fb8909": "activations(address)", +"d0fbb9e4": "claimRemainEth(uint256)", +"d0fbe7fe": "buyTickets(uint256[])", +"d0fc1e7d": "getFrequency(bytes32)", +"d0fc2782": "multisigs(uint256)", +"d0fc35cf": "StandardFormula()", +"d0fc899a": "presaleInvestorsETH(address)", +"d0fca0ca": "gogo(bytes,bytes,address[])", +"d0fe3e85": "releaseTokensTo(address)", +"d0febda9": "getModerator(address)", +"d0febe4c": "buyTokens()", +"d0fef78f": "Visor()", +"d0ffecaa": "setWhaleMax(uint256)", +"d10032dc": "getTokeRate()", +"d1013fec": "endTimeSale1()", +"d101d3b2": "timelock(address,uint256,uint256,uint256,bool)", +"d1026aa8": "YESToken()", +"d10271a1": "OxProtocol()", +"d103449c": "addURL(string)", +"d1037a11": "swap(uint256,address,address,address,address,uint256,uint256,bytes,bytes,bytes)", +"d1042e31": "getUserReward(address,address,bool,bool,bool)", +"d1047434": "getFactoryCount()", +"d1048bc9": "reserveVanityURLByOwner(address,string)", +"d104a136": "getBase()", +"d104bca2": "getUnitsAttack(address,uint256,uint256)", +"d1051a68": "DynamicToken()", +"d10523b7": "GoldenLightChainToken(uint256,string,uint8,string)", +"d105350b": "getLockedBalance(address,uint8)", +"d10541ab": "changeIdentityEthAddress(address)", +"d1058e59": "claimAll()", +"d1073bdb": "setBitwordsCut(uint256)", +"d107a5cc": "freezeAllowance(address,uint256)", +"d108177a": "removeEmployee(address)", +"d10865a7": "endSecondWeek()", +"d108b7d4": "KyberContributorWhitelist()", +"d108ffc0": "tokenToWei(uint256)", +"d1092be8": "transferAllowedDelete(address)", +"d1096155": "requireOnce()", +"d10a5e1d": "lockBalance(uint256,bool)", +"d10ac7eb": "balanceOfComisionDone(address)", +"d10adfe3": "setPricing()", +"d10aee9c": "mainPlayer()", +"d10bc924": "seeCurrentParticipants()", +"d10c3d1d": "removeFromInitialSupply(uint256)", +"d10c504f": "has_voted(address)", +"d10ceb47": "setConsolationRewardsPercent(uint256)", +"d10d42eb": "Dividend(address)", +"d10da303": "_createLinglongCatWithTime(uint256,uint256,uint256,uint256,address,uint256,uint256)", +"d10db2e1": "addCar(address,uint8,uint16)", +"d10e10b3": "testCanFinalizeEndedSale()", +"d10e23c8": "ClothingCoin()", +"d10e73ab": "createIdentity(address,address)", +"d10e99fe": "mint(int256,bytes32)", +"d10f6de9": "_requestSignature(bytes32[8],bytes)", +"d1100691": "BookCafe()", +"d1104bd3": "SLRC()", +"d110f0e6": "LEGAL()", +"d1110c5f": "buyMicroKeysWithHandle(string,string)", +"d11127c0": "lastBlock_f18()", +"d1120db0": "size2()", +"d112cf30": "PCNCoin()", +"d114751e": "getWeightRange(uint256,uint256,uint256)", +"d1153f25": "bugFund()", +"d1159747": "PREICOstart()", +"d115cac6": "joinTournament(uint256)", +"d115f02d": "updateMinReward(uint256)", +"d116c8c4": "releasePayment()", +"d11711a2": "participate()", +"d1180c98": "Lotoblock()", +"d11831c3": "generateHash()", +"d1190b7f": "changeTransferStepLock(bool)", +"d1195c48": "transferNashOut(address,uint256)", +"d119db4c": "addScore(address,uint256)", +"d11bd1a6": "sendContingencyFunds()", +"d11bee0f": "STSTEST6()", +"d11cd4c6": "changeStartPrice(uint256)", +"d11d8526": "isValidProductID(uint256)", +"d11db83f": "getPendingTransactions()", +"d11e77e4": "REIToken()", +"d11f13df": "numberOfParticipantsWaitingForPayout()", +"d11f5b9f": "VictorieumNewICOToken()", +"d11ffc55": "referralSupply()", +"d1206a29": "unlockRewardTokenMany(address[])", +"d120a284": "getBytesFromNumbers(uint8[3])", +"d120a4f2": "setUnderCollaterizedPosition()", +"d1211a71": "Solarex()", +"d1226567": "bulletAmount(address)", +"d1237220": "LogId(address,uint48)", +"d1239730": "mintEnabled()", +"d123b6e2": "ensureRegulated(address)", +"d1241e67": "getProductIdAt(uint256)", +"d125a7e2": "partialRefund(uint256)", +"d1260edd": "userDeposit(address)", +"d126ae0c": "TRLCOIN_DECIMALS()", +"d126dac4": "cashout(address,address,uint256)", +"d1279ea8": "AddTrust(address,uint256)", +"d127bb9d": "currentElement()", +"d12892e4": "setGiftMode(bool)", +"d128f2de": "cancelOwner()", +"d128fc20": "allocateTokensForFounder()", +"d1295eca": "ENDRoot()", +"d1295f13": "DTRACK()", +"d129ee38": "MediatedTransaction_Protection_Seconds()", +"d12a039c": "_getTokenBalance()", +"d12a0a2e": "icoClosed()", +"d12a6049": "setWeiLockSeconds()", +"d12a7b42": "whitelistResolver(address)", +"d12b51c0": "changeUserEduExp(bytes32)", +"d12b88a6": "SelimToken()", +"d12c08bf": "EGGS_TO_HATCH_1BULLS()", +"d12c1e28": "badgesOf(address)", +"d12c7b52": "WarToken()", +"d12d5c47": "ReferredBonusTokensEmitted(address,uint256)", +"d12d9510": "DFTBToken()", +"d12e0b2a": "MultiOwnable()", +"d12f6938": "crowdSaleStatus()", +"d12f7029": "STARTING_PRICE()", +"d1301074": "grantTokenOwnership(address)", +"d13091ed": "newGoal(bytes)", +"d1314ee0": "getBroker()", +"d1315ea3": "ISRA()", +"d131a803": "FetchlastHacker()", +"d131ab1e": "UpdatedTokenInformation(string,string)", +"d131af30": "precisionMinimum()", +"d131dfb8": "setFirstStageStartsAt(uint256)", +"d13209f9": "unhold()", +"d132391a": "setSaleEndTime(uint256)", +"d132a8f4": "totalBuyTokens()", +"d132eb02": "ProposalPassed(address,address,uint256)", +"d13319c4": "getHash()", +"d1342958": "refuseKyc(address)", +"d134474c": "winnings()", +"d134f4aa": "challengeCanBeResolved(string)", +"d1351e94": "getRoundPlayerKeys(uint256)", +"d1354f64": "ReceiveTips(address,uint256)", +"d135ae6e": "isSignedByToly()", +"d135cc4b": "withdrawLocked()", +"d135df42": "CONEGTY()", +"d1366f17": "sellerRequestCancel(uint16,address,address)", +"d136a579": "claimEarlyIncomebyAddressRound(address,uint256)", +"d1375f76": "COIN_SUPPLY_ICO_TOTAL()", +"d1376daa": "getClosingLine()", +"d13782a7": "addStage(uint256,uint256,uint256)", +"d137874b": "getDiscount()", +"d1382092": "getNumTokens(address,uint256)", +"d1384eb6": "institution()", +"d13936fe": "connectOrderPrice(address,address,uint256,uint256)", +"d1397162": "icoOverview()", +"d13a3386": "withdrawSale2()", +"d13a64d3": "getYanCoefficient(uint256,uint32)", +"d13a73c4": "numberOfStages()", +"d13a7efd": "earlyResolveB()", +"d13b54b7": "getGameAmount(address,uint256)", +"d13bf769": "foundersFundTimelock2Address()", +"d13c9c1e": "allocatePresaleTokens(address,uint256,uint256,uint256)", +"d13cb1fb": "fundings(uint256)", +"d13d1ace": "scheduleCall(bytes,bytes,uint16,uint8,uint256,uint256,uint256,uint256,uint256)", +"d13daa79": "TestTokenERC20()", +"d13e0808": "nextCommonTTMTokenId8()", +"d13e2a6a": "Wei_Remaining_To_ICO_Cap()", +"d13e5846": "tokenHolderCount()", +"d13e79ec": "getUSDRaised()", +"d13ea9ca": "setMinesPrice()", +"d13f092e": "setRaffleLimit(uint256)", +"d13f90b4": "initialize(address,address,uint256,uint256,uint256)", +"d13f9d55": "newIteration(uint256,string,bytes32,bytes32,bytes32,string,uint256,uint256)", +"d1407bec": "TraceCrowdsale()", +"d141138e": "getServerMoneyBag(uint256)", +"d1414b20": "_withdrawOrderBalance(uint256,address)", +"d14192ba": "numParameters()", +"d141b610": "MembershipPaid(address,uint8,uint256)", +"d1428e7a": "ratioFor(uint256,uint256,uint256)", +"d142bc5c": "individualWeiCollected(address)", +"d143dad0": "getLineSum(uint256)", +"d1442e93": "getStrField2()", +"d1472046": "CollectChips(address,uint256)", +"d14779c4": "signDigitalContract(string)", +"d1477f7b": "setInitialTokenValue(uint64)", +"d1479575": "creditcoinLimitInFrac()", +"d1482791": "updateInterest()", +"d148288f": "setHoldingPeriod(uint256)", +"d14ac7c4": "crowdSaleAllowance()", +"d14b2f9b": "addBonusToken(address,uint256)", +"d14b691d": "_resetReleaseTime(address)", +"d14cd233": "tokenSpread()", +"d14e1784": "paymentForWeek(uint256)", +"d14e62b8": "setCount(uint256)", +"d14ebab3": "NXE_Coin()", +"d14f17f7": "airdrop(address[],address)", +"d14f56f1": "moveUnsold()", +"d14f9219": "ham()", +"d150f835": "currentDonation()", +"d150fbe6": "convertToInd()", +"d151ec28": "getMadeTXFund(uint256)", +"d152865b": "getLastDIVDPeriod()", +"d15334a5": "firstVestAmount()", +"d15376a7": "lastBlock_f14()", +"d1538303": "docdetail(uint256,string,string)", +"d15392b2": "forceRelease(uint256)", +"d153ab40": "addMultipleTier1Members(address[])", +"d153b60c": "proposedOwner()", +"d153d118": "MyDice()", +"d1541264": "getManagerForCount(address)", +"d1555f1f": "approveCommitmentTransfer(address)", +"d1558b7c": "referrersCount()", +"d155908b": "addone()", +"d155feec": "EdisonCoin()", +"d156549f": "setExpiredAndWithdraw()", +"d1571996": "multisigOwner()", +"d1572e4c": "setResource(string,string,address)", +"d1577656": "purchaseTo(address)", +"d157e816": "MiningExtended(uint256,uint256,uint256)", +"d157ee04": "approveNextManager(address)", +"d157f27d": "sendAdvisorsSupplyToken(address)", +"d157f645": "setPaymentInterval(uint256)", +"d1587a18": "getAvailableRewardForUser(bytes32,address)", +"d1594403": "manualTransferTokensTo(address,uint256,uint256,uint256)", +"d15b506b": "TokenROC()", +"d15b95b4": "delegateDklBidAuction(uint256,uint256,bytes,uint256,uint16)", +"d15b9614": "GetLogMessageError()", +"d15c11e5": "providerRegistry(address)", +"d15c82e3": "reserveManyTokens(uint256[],uint256,address)", +"d15cfa25": "ChronoMint(int256,address,address,address)", +"d15d2745": "CLE_Beta_Pictoris()", +"d15d62a7": "getLibrary(uint256)", +"d15db5fb": "_computeBackground(uint256)", +"d15e06a0": "registerCrowdsales(address,uint256,uint256)", +"d15e1014": "marketingTokensPercent()", +"d15e3170": "payoutVoter(uint256,uint256)", +"d15e9459": "stopAddressesTotal()", +"d15ecbc2": "simulatedBlockNumber()", +"d15ee9ff": "setUsersCanTrade(bool)", +"d15f10cc": "acceptSubmission(uint256)", +"d15fc954": "wallet_Address()", +"d16058df": "getPayOrderKey(uint256)", +"d1613036": "releaseTokenTransfer(bool)", +"d1613731": "adminGetBalance()", +"d1614df3": "individualMinCap()", +"d1615300": "startWeekTwo()", +"d161b56a": "tokensMintedDuringICO()", +"d1622424": "_checkAgreement(address)", +"d1631361": "ms0()", +"d1632f67": "assignFundReceiver(address,uint256)", +"d16352af": "getProtocol()", +"d163b764": "row(uint32)", +"d163fcab": "getCurrentHero()", +"d1650f7f": "test_oneValidEqStringNoLog()", +"d1651786": "donateUnicorns(uint256)", +"d165288e": "setAllowMining(bool)", +"d165d7cd": "registerNameXnameFromDapp(address,bytes32,bytes32)", +"d1660f99": "safeTransfer(address,address,uint256)", +"d16617ae": "restartMiniGame()", +"d166539b": "_migrate(uint256)", +"d16712ed": "maxGoalReached()", +"d16782f6": "testMetered()", +"d1682600": "StandardToken(uint256,string,uint8,string)", +"d16856ca": "addAdmin(address,string)", +"d16865a3": "PRIORITY_ADDRESS_LIST()", +"d168f699": "Glv(uint256,string,uint8,string)", +"d1698430": "revokeAllTokenGrants(address)", +"d169a020": "evMgmtIssueBountyToken(address,uint256,address,uint256,bool)", +"d169c869": "endOfPreSale()", +"d16a7a4b": "FreezeAccount(address,bool)", +"d16a8fe7": "kickMember(address)", +"d16a9624": "winBidEth(address,address,uint256,uint256)", +"d16b04cf": "myCoinAge()", +"d16b6473": "getOnTokenTransferToValue()", +"d16be71b": "teamTokensDelivered()", +"d16c4cf5": "FOUNDER1()", +"d16e1ded": "requestTransferItem(address,address,string)", +"d16e443a": "previousDelegates()", +"d16e92db": "createCrowdsale(uint256,uint256,address,address,address,address,uint256,uint256,bool)", +"d16edc15": "chargeFeePool()", +"d16f8669": "crowdsaleClose()", +"d16ff4c8": "nextCandidateId()", +"d1701397": "Flip1Token()", +"d17222dc": "CATContract()", +"d1724881": "getBroker(address)", +"d17291bd": "icoRunning()", +"d1729a4a": "sendTokensManually(address,uint256)", +"d172d6fc": "playFast()", +"d1734eac": "isInNextGeneration(address)", +"d173707d": "hasPhysicalAddress(address)", +"d1738b72": "wroomWroom()", +"d173d531": "Amalgam()", +"d173e578": "setInitialAllocationLock(address)", +"d173fc82": "setTokenAdmin(address,address,address,address)", +"d1746107": "teamTokenRatio()", +"d174c388": "tokensaleToOtherCoinUser(address,uint256)", +"d1759141": "massEthFund()", +"d175958f": "cancelApproveForAll(uint256)", +"d175d38d": "calculateBonus(uint32)", +"d176be98": "DonorCrowdsale(uint256,uint256,uint256,address,uint256)", +"d1776731": "userToRobots(address,uint256)", +"d1778ed7": "UltrixCoin()", +"d177e6a6": "fillOrder(address,address,uint256,uint256)", +"d1786610": "getTokenRemaining()", +"d1789176": "AMOUNT()", +"d179eb71": "clonedFrom()", +"d17a1b5b": "SetAccessType(uint32)", +"d17a79c1": "totalNormalEtherCollected()", +"d17aa842": "GetDivPerCoinLarge()", +"d17ab3c6": "free2Of(uint256)", +"d17be133": "getAllHousing()", +"d17cf29f": "retrieveWarriors(address,address,uint8)", +"d17d0d29": "SITExchangerMock(address,address,address)", +"d17d25de": "marketingTokenAddress()", +"d17e45fb": "s23(bytes1)", +"d17e4889": "decodeProps(uint256)", +"d17f5d9d": "indice_vincitore()", +"d17f7142": "isLocked(uint256,uint256,address,address)", +"d17fd539": "_newInterest(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"d1802d79": "mintEGAS()", +"d18063cd": "registerParticipantAgent(address)", +"d1809fe8": "depositLiquidateThePool()", +"d180be1d": "isMemberOf(address,address,string)", +"d180d0bc": "_deliverTokens(address)", +"d180ebca": "FinishIco()", +"d1812be7": "newCustomFutureLottery(uint256,uint256,address,uint256)", +"d18165f6": "OEN()", +"d1818aed": "setPresidenteDeMesa(bytes32,uint256,uint256,uint256)", +"d181c37e": "NecroToken()", +"d182b4ff": "CurrencyHedge()", +"d182b83b": "validate(string)", +"d182d253": "ICO_PHASE1_LIMIT()", +"d183434d": "accountsBalances(uint256,address)", +"d1835b8c": "left21(uint256)", +"d184194b": "Smw()", +"d184935d": "getDebug()", +"d184adf6": "distributeToAddressesAndAmounts(address[],uint256[])", +"d184b88e": "AddedPrepaidTokensEvent(address,uint256,uint256,uint256)", +"d18523ac": "TimeDestroy(address)", +"d185c583": "ownerWithdrawFees()", +"d185f378": "_owns(bytes32,uint256)", +"d18611d6": "reactivate()", +"d1866019": "GetReferredCount()", +"d186659d": "setRateIcoMainSale(uint256)", +"d186899a": "issueAndLock(address,uint256)", +"d18746ed": "BonusChanged(string,uint256)", +"d188f550": "setPlayerGeneralLv(uint64,uint8)", +"d1893d23": "oldusesr(address,address)", +"d189b98d": "firstPrivateReleaseTime()", +"d189c1b0": "createUserByEmail(bytes32,bytes32,uint256)", +"d18a5563": "depositsStack(uint256)", +"d18ad4de": "getPlayerAff(address)", +"d18b07b2": "calculateCommission(uint256,uint256)", +"d18b93e6": "_owns(address,uint256,uint256)", +"d18c5da7": "FrogDaruma(address,address,address,uint256,uint256,uint256)", +"d18d944b": "setHardCap(uint256)", +"d18df96c": "vault_enableRefunds()", +"d18dfdc9": "parrot(uint256)", +"d18e031e": "verifyDeed(string)", +"d18e142d": "Announcements(uint256)", +"d18e81b3": "currentTime()", +"d18ffb8d": "inversorIsKyc(address)", +"d19003e5": "_endOfPreICO()", +"d1900a04": "TRCTotalSupply()", +"d191b336": "AdjustBetAmounts(uint256)", +"d191d7f4": "OPERATIONS_SHARE()", +"d191e11d": "rateSystem(address,uint256)", +"d192367b": "randomA()", +"d1925b80": "YACHT()", +"d1933a1b": "goalManagment(bool)", +"d19370bb": "resetKYC(address)", +"d1938376": "get_payment_by_id(uint256,uint256,address)", +"d193a0ca": "splitsSingle(uint256,uint256)", +"d1940a16": "announce(uint256)", +"d195bbd5": "AywakeToken(address,address)", +"d195ef83": "mintAdminApproval()", +"d195fd28": "RESERVED_BOUNTY_SIDE()", +"d1976a6f": "completeGame(uint256,uint256,string,address)", +"d19853c7": "exchangeBounty(address,uint256)", +"d1987a28": "setTradeRobot(address)", +"d1988b6a": "getGameHash(uint256)", +"d199168d": "claimedTokens(address,uint256)", +"d199c81d": "TokenSale(uint256,uint256,uint256,uint256,address,uint256,uint256,address)", +"d19b8d87": "refundManagerContractAddress()", +"d19b99b5": "turnMigrateOff()", +"d19c395f": "capPreICOTrasferred()", +"d19d1912": "getSelfGroupsContributedTo()", +"d19d8e1a": "Ethereumbonus()", +"d19e09ce": "setDefaultAccountingPeriodSettings(bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,bytes2)", +"d19e1ad4": "_calculateNewPrice(uint256)", +"d19e2364": "addDonateTokenAddress(address)", +"d19e6cf0": "ChangeDeadLine(uint256,uint256,uint256,string,uint256)", +"d1a0cc5c": "processPayment(address,address,uint256)", +"d1a0e8c8": "setFeeRebatePercent(address,uint8)", +"d1a132f9": "enableNodeRegistration()", +"d1a1beb4": "mint(address,uint256,bool)", +"d1a1f5ba": "addSongData(string,string,string,string)", +"d1a2749c": "Crowdsale(address,uint256,uint256,address,address,uint256,uint256,uint256,uint256)", +"d1a2bfaf": "Wallet_Initial_Supply()", +"d1a2dfd2": "isExistingDataIdentifier(bytes32)", +"d1a301e3": "setInitialBlockHeight(uint256,uint256)", +"d1a3d3ad": "assertEq9(bytes9,bytes9)", +"d1a3fb20": "updateUserRatio(uint256,address)", +"d1a40ce1": "_rewardVote(address,address,uint256)", +"d1a4a98c": "BeBitcoin(uint256,string,uint8,string)", +"d1a61025": "tradeBookOf(address)", +"d1a634e6": "OVC()", +"d1a69455": "get_enode_by_row(uint256)", +"d1a6ed67": "setFunctionIdSubcontract(bytes4,address,uint256,uint256)", +"d1a75e0d": "VOTE_FOR()", +"d1a75fea": "createTreatyRequest(uint8,string,uint256)", +"d1a7d1a8": "MyPinerTokenTest2()", +"d1a8d447": "get_all_bet_values()", +"d1a94e58": "TXOtoken()", +"d1a9eb19": "withdrawToContractOwner(uint256)", +"d1a9f5be": "createFileWithContents(string,uint256,bytes32[],uint256)", +"d1aadb6a": "setColour(uint8,uint8,uint8)", +"d1ab0457": "AddSoftware(string,string,bytes32,bytes32,bytes32)", +"d1abdab8": "divideDecimal(uint256,uint256)", +"d1acb464": "CreatedLoan(uint256,address,address)", +"d1ae0488": "transferBecauseOfAggregate(address,uint256,address,uint32,uint256[],uint256[])", +"d1ae2f01": "getVictim(uint16)", +"d1ae956f": "isPayed(uint256)", +"d1ae9607": "LFSTYLToken()", +"d1aea543": "forwardFunds(address)", +"d1af8a5a": "LinkerExample()", +"d1afaf1f": "addusertime(address)", +"d1afdb86": "buyAllowed()", +"d1b12b4e": "extCreateBot(uint256,uint256,uint256,uint256,address)", +"d1b1a22b": "set(string,uint256[],uint256[],uint256[],bool[],uint256[])", +"d1b1b65a": "rangeETHAmount()", +"d1b31a63": "cryptobank(bytes32,bytes32)", +"d1b33094": "addAccessor(address,uint8)", +"d1b33afa": "_calculateDayPass()", +"d1b39ae5": "decimalOffset()", +"d1b4ff7e": "multiAccessRevokeD(bytes32,address)", +"d1b53d2d": "tryFinalizeProposalByVoterIndices(uint256,uint256[],bool,int256)", +"d1b5e2be": "testFailRegisterContractIdAgain()", +"d1b648cd": "contractSendGas()", +"d1b6a51f": "finishEthGetToken()", +"d1b6dd30": "airdropClaimed(address)", +"d1b7cb9b": "transferBatch(address[])", +"d1b878e9": "getresult(uint256)", +"d1b9c430": "OPEN()", +"d1ba656b": "minimumTransferInWei()", +"d1ba8257": "SIX()", +"d1baaf58": "communityRoundStartDate()", +"d1bab4cc": "batchApprove(address,uint256[],uint256[],uint256[])", +"d1baceac": "DepositBank(address,uint256)", +"d1bb0433": "preSaleTokensPurchased()", +"d1bb5cf1": "marketplaceContract()", +"d1bb7b59": "tokensPerWeiBonus111()", +"d1bb8688": "ICO_SHARE()", +"d1bba64f": "Investment()", +"d1bc2cc4": "transferGift(address,address)", +"d1bc4157": "KanZhang()", +"d1bc5c8e": "KryptoroToken()", +"d1bc62de": "EARLY_FOUNDERS_USD()", +"d1bc76a1": "recipients(uint256)", +"d1bcbf6c": "_isReady()", +"d1bd328b": "bonusFirstIco()", +"d1bd56c1": "TripleT()", +"d1bdf639": "cards_black_check(address)", +"d1be7cc4": "serverPortUpdate()", +"d1bf942a": "rok()", +"d1bf9aba": "nextRune()", +"d1c01b26": "Crowdsale(address,address,uint256,uint256)", +"d1c06b2f": "availablePositions()", +"d1c1132f": "lockInTreasury()", +"d1c13abd": "returnRental()", +"d1c15acf": "OWNERS_AND_PARTNERS_SUPPLY()", +"d1c19fbc": "Withdrawn(address,address,uint256)", +"d1c1f19f": "NewPlay(address,uint256,bool)", +"d1c2babb": "merge(uint256,uint256)", +"d1c31f10": "tokenLockUp(bool)", +"d1c332c7": "preDistriToAcquiantancesStartTime()", +"d1c43558": "TheExtraordinarySpacemen()", +"d1c46916": "releaseLock(address)", +"d1c484f6": "proposedRecoveryKeyPendingUntil()", +"d1c4c206": "setRoute(string,address,bool)", +"d1c5e119": "getMyAnotherDragon()", +"d1c673e9": "transferAndCall(address,uint256,uint256,bytes)", +"d1c693f8": "TOTAL_TOKENS_FOR_PRICE()", +"d1c699aa": "exerciseFee()", +"d1c6b0ca": "setBonusAmount(uint256)", +"d1c6f448": "updateInitialRate(uint256)", +"d1c72c89": "isInRoundTwoState()", +"d1c73322": "tokenHardcapReached()", +"d1c7a6ac": "ActivationWithdrawal(address[2],uint256[8],uint256,uint256)", +"d1c7be4d": "_pushLuckyInfo(uint256,uint8,address,uint256)", +"d1c85478": "GGRocketToken(address,string,string,uint256,uint256)", +"d1c8e7e6": "charityDonation()", +"d1ca0218": "issueToken(uint256,uint256,uint256)", +"d1cb0f0f": "getAllTombs()", +"d1cb923c": "HUNDREDTIMES(uint256)", +"d1cb993d": "grantAllowance(address,uint256)", +"d1cbfc66": "getOneTotalFeesDistributed(uint256)", +"d1cbfe65": "setRefferal(address)", +"d1cc9976": "isTerminated()", +"d1cd19cf": "advisorCut()", +"d1cd7bfa": "setSUTokenContract(address)", +"d1cdcf71": "PRICE_STAGE_FOUR_BONUS()", +"d1cdfe84": "Bonus_PoolTransfer(address,uint256)", +"d1ce017c": "getABIHashForMod(bytes32)", +"d1ce36aa": "unLockIdx()", +"d1ce65ab": "isCryptoRomeLandComposableNFT()", +"d1cec3ac": "CrowdSaleTest()", +"d1cf113e": "multiAccessSetRecipient(address)", +"d1cfe644": "EventCashOutTank(address,uint256)", +"d1d115ac": "test_fourInvalidEqUint(int256)", +"d1d1c8ae": "ConvertNumbers(bytes)", +"d1d1f264": "setSubscriptionStatus(bool,bytes32)", +"d1d2bd55": "calculateRangeLength()", +"d1d3a898": "_createElement(uint256,string,address,uint256,uint256)", +"d1d3bb92": "testSetPkg()", +"d1d3d8a6": "MintLog(address,uint256)", +"d1d422f6": "roundEvent(address[6],bytes32[6])", +"d1d46d2b": "setChestPrice(uint16,uint256)", +"d1d4c4c6": "safeDiv(int256,int256)", +"d1d5190c": "changeStart(uint256)", +"d1d53493": "setMaximalInvestmentTimeTreshold(uint256)", +"d1d566cf": "allocateExtraTokens(address)", +"d1d5824d": "maxBetThresholdPct()", +"d1d58b25": "claimable(uint256)", +"d1d675e4": "setMaximumCoinsPerAddress(uint256)", +"d1d6d639": "EstimateGas()", +"d1d6e44a": "paintGraffiti(uint256,string,string)", +"d1d80fdf": "setAddr(address)", +"d1d8fd65": "TransferCoins(address,uint8)", +"d1d93318": "createAvatar(string,uint256)", +"d1da09ee": "extractImportFeeChargeLength()", +"d1da8436": "setAdData(uint256,string,string)", +"d1db1cc4": "LogRefundingOpened(uint256)", +"d1db99b6": "INR_Omnidollar()", +"d1dbcd70": "isNodeTLDOfRegistrar()", +"d1dc3706": "LogReceivedETH(address,uint256)", +"d1dc72a0": "METAHASHCOIN()", +"d1dd2794": "buy_end_time()", +"d1ddb24e": "recordResult(address,address,address)", +"d1de5011": "getAccount(bytes32)", +"d1de592a": "add(bytes32,bytes32)", +"d1defff2": "_educatedToken()", +"d1df1252": "ringBell()", +"d1df306c": "burnToken(address,uint256)", +"d1df81df": "getPlayerInfo()", +"d1dfdc07": "patentSaleTimeDelay()", +"d1e0363d": "_createLock(uint32,address,uint256)", +"d1e040ec": "ConvertColouredBkp(address)", +"d1e07bcb": "onlyCapperMock()", +"d1e15045": "sendBack()", +"d1e191a4": "withdrawEverything()", +"d1e19ab2": "distributeAllTokensToContributor()", +"d1e2eb5e": "countInvestor()", +"d1e34733": "GCOXACMToken(string,string,uint8,uint256)", +"d1e400f4": "ecoSystemAddress()", +"d1e4b8da": "importBalance(address)", +"d1e58e0f": "preIcoRate()", +"d1e692eb": "lastLottoTime()", +"d1e6a64f": "leftForSale()", +"d1e7e81f": "selfLock()", +"d1e83b8b": "ChangeInterest(uint256,uint256,uint256,uint256,bool)", +"d1e8acb4": "ABC(uint256,string,uint8,string)", +"d1e9822c": "RESERVE_WALLET()", +"d1e99563": "BACKLEAF()", +"d1e9ab13": "Swift()", +"d1e9dcbf": "serverForceGameEnd(address,uint256)", +"d1e9f75b": "testHitSoftCap()", +"d1ea2786": "offerSketchForSale(uint256,uint256)", +"d1ea8b89": "QNTUsdRate()", +"d1eabc94": "CardToken(uint256,string,string,string,string)", +"d1eb6404": "donationsFrom(address)", +"d1eba9c9": "getDeployedAuctions()", +"d1ec32ed": "secondsToHold()", +"d1eca85e": "startIcoPreICO()", +"d1ecdec6": "m_OwnerFees()", +"d1ed3dad": "getIndex(address,address)", +"d1ed74ad": "retrieve(bytes32)", +"d1ee2bf9": "icoDiscountTime()", +"d1ee32c3": "issueTokensForICO(uint256)", +"d1ef4e91": "vestTokens(address,uint256,uint256)", +"d1ef752d": "Post(address,address,address,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"d1efb5cd": "_getChamp(uint256)", +"d1efd30d": "secret()", +"d1f03514": "getRewardLevel(uint256)", +"d1f0bb2d": "populateAllowedFreeExchanges()", +"d1f1ef34": "setPrivateSale()", +"d1f1fff8": "minBalanceForTxFee()", +"d1f276d3": "releaseAgent()", +"d1f2a7e2": "isUserPolicyAccepted()", +"d1f2efd5": "isMainSale()", +"d1f2f971": "calculateDivi()", +"d1f34b14": "__uintToBytes(uint256)", +"d1f38097": "CTGToken()", +"d1f461d5": "getUsernameFromAddress(address)", +"d1f46c8d": "resolveCycle()", +"d1f4df47": "grantBountyTokens(address)", +"d1f55764": "shareContract()", +"d1f59db9": "isLatestMinorTree(bytes32,bytes32)", +"d1f61c44": "Totalizeum()", +"d1f61ed5": "dropRoute(uint32)", +"d1f6424f": "configurationCrowdsale(address,uint256,uint256,address,uint256[],uint256,uint256,uint8,uint256)", +"d1f69902": "getHeroClassId(uint256)", +"d1f6d676": "ExchangeContract(address,address,uint256,uint256)", +"d1f70760": "setAdditionalTokensFromCommonPoolWallet(address)", +"d1f7a4e4": "createCertificate(bytes)", +"d1f8a208": "removeOrganisation(address)", +"d1f92cab": "timereumDelta()", +"d1f95204": "propertyIndexToOwner(uint256)", +"d1f9c24d": "gameState()", +"d1f9f3a0": "bitdncToken()", +"d1fa338d": "TokenStorage(address)", +"d1fa74d2": "SimpleEscrow()", +"d1fa94d0": "setLockStatus(bool)", +"d1fa9cad": "Partners()", +"d1fae327": "CofounderSwitchedEvent(address)", +"d1fb386a": "_recordStashedPayout(uint256,uint256)", +"d1fb5646": "releaseTo(address)", +"d1fc0ddf": "prevOracle()", +"d1fc8cf3": "endDispute()", +"d1fccf9e": "bonusedPurchases()", +"d1fd260e": "getLotteriesByOwner(address)", +"d1fd3b12": "_rotateCauldron(uint8)", +"d1fe43ba": "migrateDueToNoReports()", +"d1fea3d5": "setReleased(bool)", +"d1feb5ee": "deleteArrayBytes32()", +"d1feca67": "addSpendingRequest(address)", +"d1ff535e": "PURCHASER_MAX_TOKEN_CAP()", +"d1ff8151": "getNumTanks()", +"d1ff9605": "setAdminFeePercent(uint256)", +"d1ffb796": "_ListingRemoved(bytes32)", +"d2004f8c": "getChance(uint256,uint256)", +"d20058af": "ESCBAirdropper(uint256,address)", +"d2008118": "logPromiseConfirmed(uint256)", +"d202158d": "keyHasPurpose(bytes32,uint256)", +"d2038d4d": "finalize4()", +"d2051f8e": "updatePassword(uint256,string,string,string)", +"d205ad7d": "proposeDissolve(bytes)", +"d205bcb0": "isPendingOracle(address)", +"d205f1e6": "testFail_set_price_without_token()", +"d2064e2f": "getStamp(uint256)", +"d2077782": "changeRequestCount()", +"d2079c0f": "playersLength()", +"d207e757": "ownerSetOraclizeSafeGas(uint32)", +"d2080ccd": "pauseWhitelist()", +"d20838f4": "setRegistryContractAddress(address)", +"d208fd60": "getMessageSender(uint256)", +"d209a566": "BP_PERSIAN()", +"d20ae2b5": "getMyWorks(bytes32,bytes32)", +"d20c34de": "TaylorToken()", +"d20cd8e5": "Solved(address,string,string)", +"d20d6119": "createTokenUri(uint8,uint8,uint8,uint8,uint8)", +"d20db416": "_approvePurchaser(address,uint256)", +"d20de0bc": "nextParticipantIndex()", +"d20e54a8": "startBet(uint256)", +"d20f5029": "advisorsTokensAddress()", +"d21077f3": "areFundsReleasedToBeneficiary()", +"d211483f": "RoleRemoved(address,string)", +"d211fd18": "capital()", +"d211fe86": "icoEndtime()", +"d21220a7": "token1()", +"d212a69a": "_fees()", +"d2134b26": "expTx(uint256,uint256,uint256)", +"d2135356": "isValidRelease(uint256)", +"d213ed96": "manageApprovedMintingModule(address,bool)", +"d213f109": "calcAmtReclaimable(address)", +"d21407fa": "crowdSalesCompleted()", +"d214326f": "GetWinners()", +"d214becb": "charactersCountOf(address)", +"d21577f2": "stakeEther()", +"d2161687": "reflectSwitch()", +"d2164302": "forgeWeaponPureDamage(uint256,uint256,uint256,uint256)", +"d216995b": "determineBonus(uint256,uint256)", +"d2169d2f": "getMonsterLevel(uint64)", +"d2169dfd": "RETURN_DATE()", +"d216a47d": "decreaseApproveAndCall(address,uint256,bytes)", +"d216a86c": "publicEventActive()", +"d216d55d": "etherandomExec(bytes32,bytes32,uint256)", +"d21705ff": "admin_proportion()", +"d2178b08": "get2()", +"d217b149": "managerUnset()", +"d218e144": "calculateRanking()", +"d218f92d": "checkinter()", +"d219f103": "collectedEtherFrom(address)", +"d21ad1ed": "calculateWinnerCut(uint256,uint256)", +"d21b84ac": "createNewDAO(address)", +"d21b93df": "Hypes()", +"d21b96ab": "ringhashRegistryAddress()", +"d21bcc7c": "get46(uint256,uint256)", +"d21bdee4": "Bitforce()", +"d21c39a1": "acceptPayment(address,uint256,address,uint256,uint256)", +"d21c700f": "stopToken()", +"d21cacdf": "referrerOf(address)", +"d21cbffc": "getIfVoted(uint256,address)", +"d21ceba0": "RemainingTokensReceiverAddress()", +"d21cf24f": "setSingleWithdrawMax(uint256)", +"d21d2cd1": "lifePoints()", +"d21d7950": "changeGasLimitOfSafeSend(uint256)", +"d21e17a6": "_payEthereum(uint256)", +"d21efc35": "endPhase()", +"d21fa4e1": "contract_alive_until_this_block()", +"d2201c3b": "CreateLUNETS(address,uint256,uint256)", +"d22057a9": "register(bytes32,address)", +"d220b727": "ProposalTallied(uint256,int256,uint256,bool)", +"d2225635": "getBetterNumOfWinnings(address)", +"d22290a4": "feeBips()", +"d222dc04": "requiredSignedAddress()", +"d2231919": "TransactionRefundedByMediator(uint256,uint256)", +"d22341a9": "withdrawDeveloperPot(address)", +"d2234b37": "withdrawal2()", +"d2235998": "_cancelAuction(address,uint256,address)", +"d223926f": "buyBooster(uint256)", +"d224118f": "PrepareDraw()", +"d224c3e0": "gen0Step()", +"d224f1ed": "proxiesCount(address)", +"d2254db0": "DDEToken()", +"d22591c8": "addBook(string,address)", +"d226d11f": "foundEvidence()", +"d226ff1b": "User(string)", +"d2273f37": "_changeTuneOption(uint32,uint32,uint256,bool,bool,uint128,bool,uint64,uint256)", +"d2282dc5": "setUint256(uint256)", +"d228cfc5": "claimHodlRewardFor(address)", +"d229a94a": "lockTokensForTradingMarketContract(address,uint256)", +"d22a1180": "finanReserveAllocation()", +"d22ac06f": "_approveEscrow(bytes32,uint256)", +"d22b1a0f": "secondVestStartsAt()", +"d22b32e9": "hivePerEther()", +"d22b3c8b": "ownerArmyCount(address)", +"d22b3de6": "setTitulaire_Compte_10(uint256)", +"d22b64a2": "getDonationByAddress(address,address)", +"d22b9177": "getImageRegionId(uint256)", +"d22bdce2": "_getNextStage()", +"d22c391a": "validateProposedThroneRules(uint256,uint256,uint256,uint256,uint256)", +"d22c78f8": "getPlanetDetails(uint256,uint256)", +"d22d9c6d": "tokensInUse()", +"d22dee48": "claimProfit(uint256)", +"d22e7b69": "validatePublisher(address,bool,string)", +"d2305f07": "getCloneArray(uint256[])", +"d230e875": "MaxValue()", +"d232790d": "setLastWinner(address,uint256,uint256,uint256)", +"d232a8f5": "firstStageCap()", +"d23376ec": "getPOOL_edit_14()", +"d233e5c0": "oxen(address)", +"d233fc0b": "changeRecovery()", +"d235f947": "setMaxHealthAndMana(uint256,uint32,uint32)", +"d23628f1": "CyberRailNET()", +"d2368f64": "Billing(uint256,uint256)", +"d237a427": "TT()", +"d237b43f": "reclaimResourceDeposits(address)", +"d237bc74": "paymentSizeC()", +"d238cd1b": "redeemVoucherSingle(uint256,address,address,uint256)", +"d238ec90": "HWGLToken()", +"d2395dcd": "buyTokens(address,uint256,uint256)", +"d239ea8b": "getSchemasLenght()", +"d23ad39d": "setCommons(address)", +"d23b8f5c": "drawDailyWinner()", +"d23dcee0": "_generateTokenURI(bytes32[],uint256)", +"d23df2d1": "RENEX_SETTLEMENT_ID()", +"d23e09f5": "trioContract()", +"d23e8489": "transferOwnership(uint256)", +"d23ea159": "eGoldchainStart()", +"d23ef360": "setExchangeRegulatorWallet(address)", +"d23f0abb": "issueTokensForPresale(uint256)", +"d23f1bba": "noBets()", +"d23f4450": "scoreDown(address)", +"d24155c1": "getAmountBonusRate()", +"d2415852": "TheDivine()", +"d241ead8": "testMinReturn0WithReturn()", +"d242448c": "transferredCrowdsale()", +"d24257c0": "betAmount()", +"d2427db5": "checkTotalPayout(address)", +"d242b051": "reserveWaveLockup()", +"d243ec26": "payDev()", +"d244059a": "whiteListLimit()", +"d24481ea": "checkWin()", +"d24594b8": "canApply(uint256,bytes32)", +"d245a084": "TransactionRefundedAfterDispute(uint256,uint256)", +"d245aa92": "endBlockBonus3()", +"d245da28": "updateEarlyParicipantWhitelist(address,address,uint256)", +"d2467e31": "GetSellingTokenDecimals()", +"d246a8c9": "lastNegativeVoting()", +"d246b379": "calculateRevenue(uint256,uint256,uint256)", +"d246d411": "burnAddr()", +"d247160a": "ethertoteDevelopmentTransferComplete()", +"d24876b7": "sellCMTAgainstEther(uint256)", +"d248cf1f": "DASHABI(uint256,string,string)", +"d24987fc": "getNewTokenPrice(uint256)", +"d24999ca": "getkillerPriceConversionFee()", +"d249a52e": "update(bytes,uint256[],uint256[])", +"d24ac764": "getRejectionCount(uint256)", +"d24b06b7": "registryRequestCustodian()", +"d24b08cc": "callstoredaddress()", +"d24b62a8": "lotteryReset()", +"d24b7090": "_payEtherAndDistribute(uint256)", +"d24b7e7a": "setEthPrice(uint128)", +"d24bcb15": "usechainWallet()", +"d24bcf54": "getEarlyIncomeByAddressRound(address,uint256)", +"d24c48bc": "getLiquidationSpreadForPair(uint256,uint256)", +"d24c5a36": "random1()", +"d24c8fe4": "_getCurrentStage()", +"d24d11ad": "BattleProvider(address,uint256,uint256,uint256,uint256,uint256)", +"d24ddcfe": "buyKissBTC()", +"d24ecc10": "initializeSale(uint256,uint256,uint256,uint256,address)", +"d24ef4f3": "PLATFORM_DEVELOPMENT()", +"d24f8a17": "convertShortedTokensToLiquidationToken(uint256)", +"d2500033": "RISE()", +"d25090ff": "withdrawContribution(uint256)", +"d25119c7": "getMsgHash(address,string,string)", +"d2521034": "marriageStatus()", +"d2526418": "getFeePercent(address)", +"d2531590": "CANCEL_EXTRA_GAS()", +"d2536893": "setDividendWinners(uint256[],uint256[],uint8[],uint256)", +"d2548393": "team2019TokenCreated()", +"d255494a": "removeInventory(bytes32)", +"d25570f2": "AliceToken(uint256)", +"d2558fca": "Token3D()", +"d2559533": "WinancesToken()", +"d256451c": "setRates(uint256,bytes32[],uint256[])", +"d256c7a5": "setTokensPerEther(uint256,uint256)", +"d2571062": "setAllContracts()", +"d2577fec": "_getRoleSignature(address,bytes32,address)", +"d258d7b6": "test_4_generateTokensAccrossBlocksAfterDestroy_increaseBlocksBy1000()", +"d258f2f4": "TeTeToken()", +"d2591068": "TLCMarketCrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"d259224a": "ssstt()", +"d2598c4c": "removeTrader(uint8)", +"d2599300": "savedReferral(address)", +"d2599312": "initShareRule4Publicity()", +"d259d761": "changeAdminContract(address)", +"d25a1212": "revokeAttributeSigned(address,uint8,bytes32,bytes32,string,bytes)", +"d25a13b4": "roundTwoBlock()", +"d25a5be9": "airdropTotalSupply()", +"d25b3ee1": "AcademiCon()", +"d25b4f2a": "CrowdsaleRC()", +"d25c0767": "isSaleAuction()", +"d25d19e2": "SetThrdOwner(address)", +"d25d603c": "cancelOrder(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32,string)", +"d25dc056": "transferToWinner(address,address,uint256)", +"d25e3443": "ISLToken(uint256,string,string)", +"d25f08b1": "adminAddICO(uint256,uint256,uint256,uint256,uint256,uint256[],uint256[],bool)", +"d25f1c35": "CPGPEREGRINE_MAX_CARGO()", +"d25f82a0": "getAirdrop()", +"d25ff342": "MNXToken()", +"d2602930": "RockPaperScissors()", +"d26031ab": "phase2EndingAt()", +"d261de38": "NVCTToken()", +"d261fbed": "addressCallWithArray(address[3])", +"d2620e2d": "holdOf(bytes32)", +"d2625fce": "pendingOracleB()", +"d2631e42": "changeRewardManager(address)", +"d263b7eb": "ownerkill()", +"d263be48": "myWallets()", +"d263d2a4": "setWildCardToken(uint256)", +"d264a878": "getOraclizeWinnerTimeOffset()", +"d264cfdc": "lockAccountOf(address)", +"d264e05e": "forward()", +"d2650fe5": "RedeemEvent(address,uint256,uint256,uint256,uint256)", +"d2651855": "changeERC20(address)", +"d2654219": "getCurrencyDenominated()", +"d2656069": "SmartContract_Allowed(address)", +"d26574ac": "setCardPerkText(uint256,string)", +"d2663184": "setDividendCardAddress(address)", +"d266e83b": "isActive(address,uint256)", +"d2670025": "REQ()", +"d2676711": "getCommentAccountsLength()", +"d267dc96": "Tradenexi()", +"d2689abc": "ecdsaverify(uint256,uint256,uint256,uint256,uint256)", +"d269ae55": "MAX_ALLOWED_TOTAL()", +"d26c8a8a": "coinBalance()", +"d26cbe1e": "Contributed(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"d26cfeae": "setMinAmount4Round(uint256)", +"d26da39e": "isRequestFromOwnerOrMeterKey(address)", +"d26dbd2a": "preSaleTokensDisbursed()", +"d26ee061": "getAvailableFundsForTheTeam()", +"d26f9cd7": "backofficeRedeem(uint256)", +"d26ff86e": "submit(bytes32,bytes32)", +"d270085e": "addNoFeeAddress(address[],address[])", +"d270b8e8": "tokenDistributionEndTime()", +"d270cbaf": "buyAAC()", +"d270e7ab": "mainContract()", +"d271011d": "transferEthers()", +"d2715a6b": "getEmblemOwner()", +"d2718fbe": "setOwnerFlag(uint256,uint8)", +"d271900d": "linkContract(address)", +"d2719d22": "btcRate()", +"d271b067": "ln(int128)", +"d2727e6c": "_oneTokenInWei()", +"d2728f90": "Bought(uint256,address,uint256)", +"d273285b": "createdWallets()", +"d27399b5": "countAddressesSet()", +"d27416ec": "verify(bytes32,uint8[5],bytes32)", +"d27482a4": "claimOwner(address)", +"d274b230": "registerFor(address,address,uint256,uint256,uint256)", +"d274fa91": "amendRetention(uint256,uint256)", +"d2756e11": "finalizeNumber(uint256)", +"d2758538": "createOneDrink(string)", +"d2760b64": "_isBuying()", +"d27626fd": "pushToken(address[],uint256,uint256)", +"d2769df1": "isValidComposition(uint256[],uint256)", +"d276a3e1": "auctionedEth()", +"d2786ba4": "getMetaData()", +"d2789aa5": "getPrivilegeState(string)", +"d279830c": "addMilestone(uint256,uint256,uint256)", +"d279c191": "claimReward(address)", +"d27a43f6": "_checkWin(uint256,address)", +"d27a6f28": "ZyPPACrowdsale(uint256,uint256,uint256)", +"d27aa18e": "Secure()", +"d27bf2e3": "getCurrentLocation()", +"d27d1bc4": "proposalsNumber()", +"d27d3e88": "bulkSend(address[],uint256[])", +"d27f41cd": "CharityInProgressWallet()", +"d27fcf96": "gmtFundAddress()", +"d27ffef1": "OLIFEToken()", +"d282866a": "whichTick(uint256)", +"d282db01": "_withdrawal(address)", +"d2835c58": "P4P()", +"d283833d": "toekensForTeam()", +"d283859d": "removeBlack(address)", +"d2840362": "addAdvisors(address,uint256,uint256)", +"d28442ef": "ownerProfit()", +"d2846c7b": "isProxyContract()", +"d285b7b4": "loan()", +"d286dbf2": "internalNewRound(uint256,uint256)", +"d2871105": "tokensIssuedBySTO()", +"d2874e49": "withdraw(address,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"d2879f47": "_getContractTokenBalance()", +"d2886ebc": "getUserSkills(address)", +"d288c878": "blackListERC20(address)", +"d289ade2": "payFee(uint256)", +"d289eb82": "buyMultipleItems(uint8)", +"d289f187": "_addBonus(address,uint256)", +"d28a4f9e": "setKyberContractAddress(address)", +"d28ae9ef": "calcMiningSharesAmount(uint256,uint256)", +"d28b5317": "setCampaign(bytes32,uint256,uint256,uint256,uint256,bool,address,string,int256)", +"d28be797": "getShitClonelordReq()", +"d28c25d4": "changeGreeting(string)", +"d28c2aaa": "fix_parents(uint256,bool)", +"d28cb7b5": "availableWallet(address)", +"d28cbded": "ERC20Token(uint256,string,uint8,string)", +"d28d4e0c": "queryAllAccounts()", +"d28d8852": "_name()", +"d28dcdea": "haltPurchase()", +"d28e4355": "updateClaimable(uint256)", +"d28e88bd": "freezeDateOf(address)", +"d28f95ba": "withdrawalEth()", +"d28fa960": "withdraw_all_funds()", +"d28fdde8": "updatePrice(uint256[])", +"d2901c47": "RATE_SOFT()", +"d290ee06": "revokeTokenTimelock(address,uint256)", +"d291fa81": "GetMinerAt(uint256)", +"d29208d4": "MasterCoin()", +"d292515d": "totalMintNums()", +"d292b920": "CryptaurMigrations()", +"d292e6cb": "_sendPriceUpdate(address,uint256)", +"d294cb0f": "accountBalance(address)", +"d294f093": "claimFees()", +"d2953f84": "assetByIndex(address,uint256)", +"d29543af": "FolioNinjaToken(address,address,uint256,uint256)", +"d296853a": "whitelistPreSaleAddress(address,bool)", +"d2968a7f": "addContribution(address,uint256,uint16)", +"d2970120": "getSettlingTimeoutBlock(bytes32)", +"d29709fb": "returnDeposit(address,uint256)", +"d2973f93": "setUserType(address,uint256)", +"d2983dfd": "LoadedRefund(address,uint256)", +"d299dac0": "blake2b(bytes,bytes,uint64)", +"d29b5d2f": "mintReputation(uint256,address,bytes32)", +"d29c8c96": "createdBlockOnCommitsPhase(uint256,address)", +"d29cafe1": "ZilliqaToken(address,uint256)", +"d29cbd60": "getMonsterBaseStats(uint64)", +"d29d44ee": "_transferOwnership(address)", +"d29d503c": "addHolder(address,uint256,uint8,uint256)", +"d29d91ca": "getNarcoHomeLocation(uint256)", +"d29db7e4": "_processPurchase(address,uint256)", +"d29dd76d": "whitelistAdmins(address)", +"d29e2746": "place_buy_order(uint16,string,address,string,string)", +"d29e319c": "TOKEN_ICO3_LIMIT()", +"d29e6803": "secretHash()", +"d29ebd2e": "privateOfferingSupply()", +"d29f541d": "getPosition(uint256,address)", +"d2a09b96": "_updateReferrals(uint256,uint256)", +"d2a17959": "transferTokensFromVault(address,uint256)", +"d2a1e045": "FuBi()", +"d2a2feaa": "STRI()", +"d2a32c12": "bonus_amount()", +"d2a3899c": "payOrder(uint256,uint256,uint256)", +"d2a3b190": "SAToken()", +"d2a405f7": "_issetConverter(address)", +"d2a4ccc5": "redeemBuzzCafeBal()", +"d2a569c3": "startAirdrop()", +"d2a59d69": "dragons(uint256)", +"d2a6629c": "playerActiveGames(address,uint256)", +"d2a6cf5e": "internalTrade(uint256,uint256,uint256,uint256,uint256,uint256,bool,address,address,bytes32)", +"d2a718ec": "isRefundLocked()", +"d2a753e4": "cancelBid(address,bytes32,int32,bool)", +"d2a764d1": "contributeInBNB()", +"d2a79e57": "tixPresaleDeposit()", +"d2a7d38a": "MIN_FUNDING_AMOUNT()", +"d2a7ea17": "setSelfAsPureShareholder(string)", +"d2a86985": "_ORAK()", +"d2a9b6ed": "getVotingFor(address)", +"d2aa24b6": "getControlInfoMaxPerBlockImbalanceList()", +"d2ab6be1": "start(uint8)", +"d2ab78b7": "getGameName(address)", +"d2ac0f59": "setHeroContract(address)", +"d2ac1c8e": "addApprovedAddress(address)", +"d2ac2d8a": "heldOf(address)", +"d2acbc0d": "card_metal_minamount()", +"d2accad3": "_changeText(uint256,string)", +"d2ace0cc": "_newVoting(bytes,string)", +"d2ae5f65": "earlyInvestorTokenRaised()", +"d2ae8eaa": "getGenesForSale()", +"d2aeb90f": "removePoweruser(address)", +"d2aee00b": "getCanAttackMonsterIds()", +"d2afa8c1": "isERC721()", +"d2afeeeb": "createBoard(bytes32,bytes32,uint256,uint256,uint256)", +"d2b001fb": "PREMIUM_TYPE_COUNT()", +"d2b022d5": "pendingWithdrawalsBalance()", +"d2b0d554": "getDisclaimer()", +"d2b10b75": "AirDropContract(address,address)", +"d2b1569e": "redeemRewardedAxies(address,uint256)", +"d2b3fe93": "updateRoundLimits(uint256)", +"d2b420ce": "isOfferSorted(uint256)", +"d2b4a460": "getJackpotFee(uint256)", +"d2b50743": "DOW_FRI()", +"d2b5c227": "AsideTokensHaveBeenAllocated(address,uint256)", +"d2b5d9e1": "refferalFee()", +"d2b73cea": "getActiveContractAddress(uint256)", +"d2b74f70": "CryptoFamousStorage()", +"d2b75b70": "_upsert(address,uint256,bool,bool,uint256)", +"d2b77264": "pollMap(bytes32)", +"d2b78529": "getContractNetBalance()", +"d2b7d957": "executeDelegatecall(address,uint256,bytes)", +"d2b8035a": "draw(uint256,uint256)", +"d2b8915c": "offerPosition(uint256,uint32,uint256)", +"d2b8b867": "doPayment(uint256)", +"d2b93303": "EternalToken()", +"d2b962f2": "createLiability(bytes,bytes)", +"d2b9da84": "Office(string,string,uint256)", +"d2ba499c": "IS_SIGNATURER(address)", +"d2ba5537": "numberOfClaimants()", +"d2ba8073": "minbid()", +"d2bafbe6": "setMaxCoordinate(uint256)", +"d2bb6fd5": "timeTier2()", +"d2bbda29": "registerName(string,address,string)", +"d2bbf6df": "getIndexId(address,bytes32)", +"d2bd3dd9": "YAP()", +"d2bec28c": "startCraftingAuction(uint256,uint256,uint256,uint256)", +"d2bf36c0": "getPackData(uint256)", +"d2bf779f": "getKingdomInformations(string)", +"d2bfd24b": "setgamecard(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"d2c03c01": "auto_withdraw(address)", +"d2c0e032": "set(address,string,string)", +"d2c18e0b": "api()", +"d2c18f59": "emergencyManager()", +"d2c33eb2": "claimRaisedWei(address,address)", +"d2c37621": "getUserLocalTokenBalance(address)", +"d2c3a1ec": "updateStageInfo(uint256,uint256)", +"d2c411d3": "closeBatch(uint256)", +"d2c49b7f": "getTimeUntilEnd(uint256)", +"d2c51c72": "withhold()", +"d2c5c368": "testFailRestartNotUpdatable()", +"d2c5ce31": "dateTimeAddr()", +"d2c73093": "createTokens(uint256,address)", +"d2c731d9": "TermsOfUse()", +"d2c877f8": "setDollarRate(uint256)", +"d2c87b02": "MB(address,address,address,address,address)", +"d2c936ff": "currentBonusLevel()", +"d2c94ec5": "C4FToken()", +"d2ca159a": "listUnconferences()", +"d2ca2115": "periodLength()", +"d2cad255": "BankDeposit(address,uint256)", +"d2cad6da": "bonusCalculate(uint256)", +"d2cae700": "getAllFailedInvestmentsCollected()", +"d2caeea8": "aomucoin()", +"d2cafe2d": "allAssetsOf(address)", +"d2cbcea6": "getSSP(address)", +"d2cc7015": "placeMove(uint8)", +"d2cc718f": "accumulatedInput()", +"d2cced90": "getAnnualInterest(uint256)", +"d2cd9673": "totalMining()", +"d2cd96bd": "changeQuorum(uint256)", +"d2cdf580": "setKYCpassed(address)", +"d2ce33f8": "preMinting()", +"d2ce89e5": "logoURL()", +"d2cf7704": "BanAttempt(address,address,uint256)", +"d2cfe5a7": "posscoin()", +"d2d0ded1": "referrerBonusPercent()", +"d2d0e066": "deposit(address,uint256,uint16)", +"d2d10162": "initialize(address,address,uint256,uint256,address,address)", +"d2d10be8": "TGEToken(string,string)", +"d2d153a4": "Grand_Solar_Minimum()", +"d2d21e85": "sendToNest(uint256)", +"d2d26edc": "Cloudcoin()", +"d2d3b8e0": "multiAllowance(address,address[],address[])", +"d2d3d7fb": "fetchAllVoters()", +"d2d42074": "getExchangeContractAddress()", +"d2d44955": "Cindicator()", +"d2d4bd72": "getCrossRate(bytes,bytes)", +"d2d5a55c": "ownerValidator()", +"d2d7231f": "calculateReward(uint256)", +"d2d791c0": "payBatch(bytes32[],uint256[],address,address,bytes)", +"d2d85cf2": "rootsMatch(address,address)", +"d2d8cb67": "TOKEN_PRICE()", +"d2d8fd0a": "settleFrom(address,address,uint256)", +"d2d92f24": "getWhitelistEntry(uint256)", +"d2d93f90": "ethRate()", +"d2d976da": "webpage()", +"d2d97d9f": "coldStorage()", +"d2d9b8c6": "setCompte_24(string)", +"d2d9d44e": "awardTitanium(address,address,address)", +"d2da29c7": "hostAddress()", +"d2db29af": "claimFutureUse()", +"d2dc0869": "add(string,uint256,string,string,address)", +"d2dcd933": "totalSupplyAtTime(uint256)", +"d2dd8d2a": "authorized_updateCardClaimerAddress(uint256,address)", +"d2dd9f79": "transferVault(address)", +"d2ddf1ae": "TradingForest(address)", +"d2de6cca": "getArrayValueByKey(string,string)", +"d2de6ec5": "distribute(uint256,uint256,uint256)", +"d2de9989": "stopPreIoc()", +"d2df254c": "weiToUSD(uint256)", +"d2df9222": "recoverStockKey(bytes12)", +"d2df9cc1": "startTimeSaleNoBonus()", +"d2e013d9": "Execution(string,string,string,string,string,string)", +"d2e01b2f": "getLockPosition(address)", +"d2e0637b": "createContractTot(string)", +"d2e10879": "getReceiptRoot(uint256)", +"d2e1d201": "setstring(string,string)", +"d2e2acf5": "_proxyTransferEvent(uint256,uint256,uint256,bytes32)", +"d2e3646c": "optionsConverter()", +"d2e474b3": "PROMOTORS_POOL()", +"d2e73d78": "withdrawDepositorFunds(address,uint256)", +"d2e78ace": "DestructionContract()", +"d2e80494": "setConversionRate(uint256)", +"d2e81bf9": "initPlayer(address)", +"d2e8309e": "test_messageSenderEq()", +"d2e90d0f": "startTimeICO()", +"d2e91b85": "getset()", +"d2e9236b": "sendEthValue(address,bytes,uint256)", +"d2e9953a": "setAdmin(address,address,bool)", +"d2ea7f7f": "CreditDAOfund(address)", +"d2eb6483": "EVMDB()", +"d2ecb4f9": "initialAllocation()", +"d2ed2d30": "setWorst(uint8)", +"d2eda057": "checkBool(bool[])", +"d2eeead7": "PatrickTestCoin()", +"d2ef0669": "denyAccess(address,address)", +"d2ef3b0d": "getCreateShareTokenMarketValue()", +"d2ef7398": "challenge()", +"d2efeef3": "TradableTokens()", +"d2f03bf6": "registerWithETH(address)", +"d2f070b9": "email(address)", +"d2f0be99": "getRefund(uint256)", +"d2f1f189": "ICOAddress()", +"d2f1f712": "getVoters(uint128)", +"d2f27cf4": "setCelebrityPrice(uint256,uint256)", +"d2f28141": "calculateBonus(uint256,address)", +"d2f2d549": "CLPTestNetToken()", +"d2f32d94": "get_card()", +"d2f343c7": "timeWindow()", +"d2f3b963": "dateICOEnded()", +"d2f3ea43": "getPurchaseAmount(uint256)", +"d2f40cab": "getFunctioName()", +"d2f4a50a": "wallets()", +"d2f5e28b": "requestEthereumPrice(string,string)", +"d2f65fbc": "setMockBytes32(bytes4,bytes32)", +"d2f6f67d": "mintingContract()", +"d2f7265a": "exchange()", +"d2f7c5db": "GetDetail(address)", +"d2f7f377": "testRegisterNickWalletEth()", +"d2f80c15": "addDivisionJurisdiction(bytes32[],bool[])", +"d2f82026": "quickSortBids()", +"d2f8dd45": "Owned(address)", +"d2fa1f8b": "proxyPurchases(bytes32)", +"d2fa635e": "setMaxGasPrice(uint256)", +"d2fa9a67": "RESERVED_TOKENS_FOR_FURTHER_TECH_DEVELOPMENT()", +"d2fabaec": "VITToken()", +"d2faf216": "withdrawBuyer(address[2],uint256[7],uint8,bytes32[2])", +"d2fafb19": "setAmount(address,uint256)", +"d2fb32c2": "getGen0ObjInfo(uint64)", +"d2fb8787": "recordExists(bytes)", +"d2fbbc51": "ADVISORS_TOKENS_PERCENT()", +"d2fbd0ed": "payOrder(uint256,uint256)", +"d2ff5d4f": "allWETHbalances(address,address[])", +"d2ff8fd8": "ICOtokensSold()", +"d2ffca2d": "currentTotalExcess()", +"d2ffd541": "mintAdminCancel(address,address)", +"d30047bc": "firstPreSaleEndDate()", +"d3006dea": "ValueFinalized(bytes8)", +"d300746f": "pullTokensBack()", +"d300a034": "oraclize_query(string,bytes[])", +"d300a968": "isSecurityToken(address)", +"d3017193": "addUser(address,uint256)", +"d301c85f": "ownerAllocateTokensForList(address[],uint256[],uint256[])", +"d30272b8": "signAgency(uint256)", +"d302af4a": "isAirdropContract()", +"d302b0dc": "unFreeze(uint256)", +"d303b750": "Coupon(address,uint256,uint256)", +"d303e3b2": "checkMidiNoteValue(uint8)", +"d3050195": "_ownsRobot(address,uint256)", +"d305399d": "addToWhitelist(address,uint16,uint256)", +"d305577e": "GSSingle(uint256)", +"d305671a": "Dario(uint256,int256,uint256)", +"d3057859": "trade(uint8[2],bytes32[4],uint256[8],address[6])", +"d30592c6": "_trim(uint256[],uint256)", +"d3059c91": "maxTokensForCommand()", +"d305a45d": "requestDivident()", +"d3062b24": "getIndicesWithClaimableTokensForBuyers(address,address,address,uint256)", +"d3066879": "withdrawVestings(address)", +"d306967b": "TokenCreated(uint256,string,uint256,address)", +"d30792d4": "bonusesMapPos(bytes32)", +"d30796a2": "OwnerTransfer(address,address,uint256)", +"d307cd53": "_b4(string,uint256)", +"d3087ff5": "startOpenPpTime()", +"d3088b52": "transferWithMessageAndRequestAddress(address,uint256,address,bytes)", +"d3088b5f": "CesaireToken()", +"d30895e4": "player1()", +"d308cbe2": "withdrawMoneyByAdmin(uint256,address)", +"d30920c1": "contractTotalInvested()", +"d3098883": "memberFee()", +"d30a119b": "calculateBonusTokens(uint256)", +"d30a1325": "checkProposalExistence(string)", +"d30a512e": "betOnColumnOrDozen(bool,bool,bool)", +"d30a969a": "RemiCoin(uint256,string,string,uint8)", +"d30b5386": "payFee(bytes32,uint256,address)", +"d30bbde8": "checkWorkingInfra(uint256,uint256)", +"d30beffa": "unholdGold(address,uint256)", +"d30bf323": "setTaskRewardPaid(bytes32)", +"d30c0a64": "encodeUint(uint256)", +"d30cad77": "nextRoundDuration()", +"d30e2004": "setRegionUrl(uint256,uint8[128])", +"d30e268b": "saleTokensPerUnit()", +"d30e9302": "distributionTokens()", +"d30f945a": "setNewManager(address)", +"d30fa946": "fulfillDeliverable(bytes32)", +"d30fbd0d": "safeSubtract(uint256,uint256)", +"d30fc8a1": "FundsAdded(uint256)", +"d3100538": "YOLOCASH()", +"d3109af3": "drainWei()", +"d310bc32": "releaseName(string)", +"d3111d3f": "_getLockedAmount(address,address)", +"d3115524": "_bptc(uint256,uint256,uint256,uint256,address)", +"d3118a5a": "addDoc(string,string)", +"d3119dc0": "minEtherForAccounts()", +"d311b44d": "everyBidFee()", +"d312846b": "uniqueContributors()", +"d313f235": "terminateTokenSale()", +"d3140a65": "createOpenLockAndDraw(address,address,uint256)", +"d3146a46": "Claim_TRAC_9600()", +"d316e912": "deleteGrantee(address)", +"d3183864": "calculateMultiplierAfterBurn(address,uint256)", +"d3195184": "_canNowTransfer()", +"d3195c82": "refundTransactionAfterDisputeFee(uint256)", +"d319ab75": "getProposalContractor(uint16,uint16)", +"d31a8be1": "setCentsPerEther(uint256)", +"d31af484": "updateTokenUri(uint256,string)", +"d31b3320": "getUserTokenInfo(address)", +"d31c153c": "AllocateAgentChanged(address,bool)", +"d31cfed6": "initialMonthWithdraw(uint256)", +"d31d7b0a": "MoonCatRescue()", +"d31efc7e": "createHero(string,uint16,uint16,uint16)", +"d31f0f38": "RamenCoin()", +"d31fdffd": "setHammer(address)", +"d31feea1": "OpenLongevity()", +"d31ff13c": "changeContractOwner(address,string)", +"d320ac9a": "DonationDeposited4Matching(address,uint256)", +"d321fe29": "getAmount()", +"d3220144": "newPriceDecreaseRate(uint256,uint256)", +"d3226425": "DuMangoCoin()", +"d324191c": "Codexstandard()", +"d3251aa2": "setHelpCoinAddress(address)", +"d3257034": "AgriChainCultivation()", +"d3258b9e": "DevDorothyCoin()", +"d325c2e8": "revertPurchase(address)", +"d3261592": "dripRate()", +"d32632fd": "migrationGate()", +"d327523a": "getTotalNumberOfBoards()", +"d329ce51": "developer_cycle(address,uint256)", +"d32a7ee0": "updateLand(uint256,uint256,uint256,uint256)", +"d32a9cd9": "settle(bytes32,bytes32)", +"d32ab21d": "voteFor(uint8,uint8,uint8)", +"d32aba42": "getPresaleBonusAmount(uint256)", +"d32b1bea": "encodeAddress(address)", +"d32b607c": "sumElements(uint32[])", +"d32b8575": "_startAuction(uint256)", +"d32c943a": "resolveChallenge(bytes32)", +"d32cb0fe": "exercise()", +"d32cbabb": "Ast()", +"d32e245b": "getContributorRemainingCap(uint256)", +"d32e29de": "setApproveFee(uint256)", +"d32e48c0": "LockOpen(address)", +"d32ef1e5": "RhodonToken(address)", +"d3309a7e": "productTribe(string)", +"d3313802": "EtheraffleDisbursal(address)", +"d331aeb3": "getAllFiatTransactionsCount()", +"d331b696": "computeNameFuzzyHashET(string)", +"d33219b4": "timelock()", +"d333d7cf": "destroyShares(address,uint256)", +"d333ec79": "changeServiceAccount(address)", +"d334d75b": "expireLoan()", +"d3363dd7": "icoThresholdBonus3()", +"d3364687": "PRESALE_START()", +"d33656e0": "primaryOperator()", +"d336ac80": "getPersonInfo(uint256)", +"d337616e": "resetLottery()", +"d337b9c9": "myWeapons()", +"d337ce86": "addProject(uint256,string,address,uint256,uint256)", +"d337e72e": "EtherToken2()", +"d3382a55": "whitelistRate()", +"d3392545": "spawnItem(uint256,uint256,address)", +"d33abd33": "t_2nd_StageEnd()", +"d33b79d9": "addBallotAndVoterNoPk(bytes32)", +"d33c0a4d": "getMyCells()", +"d33c449f": "gesamtGuthaben()", +"d33ca02b": "externalCall(address,uint256,uint256,bytes)", +"d33cf9fa": "MultiSigMint(address)", +"d33d1aac": "getWeeklyTokensForWebsitesAmount()", +"d33d5f3e": "CLOSE_TIME()", +"d33d6732": "totalSupplyMintTransfer()", +"d33d6f65": "Delivery(address,uint256,uint256,int256,int256,int256,int256,address)", +"d33e1a48": "genRNGContractAddress()", +"d33ecfee": "setResume()", +"d3400a1d": "etherRatioForOwner()", +"d34047b6": "mint(address,string,bytes32)", +"d340ab41": "addInvestorBonusInTokens(address,uint256)", +"d340dd8a": "getCCH_edit_13()", +"d340e8f8": "setDistributionPercentage(uint256,uint256,uint256)", +"d341281a": "ALH()", +"d3418fb7": "capOfTotalSupply()", +"d3419bf3": "prices()", +"d3419d4e": "TokenAiContribution(address,address,address,address,address,address,address)", +"d341e052": "JoyGameDemo(address,address)", +"d342275e": "setProgress(uint256)", +"d342c598": "Bou(address)", +"d342e4f4": "runInOneDay()", +"d3437bd3": "ProofOfStableClone()", +"d3437fe0": "assertFact(uint256,bytes)", +"d3446856": "tournamentPaused()", +"d344e01b": "stopTransferToken()", +"d3451379": "updatePower(uint256)", +"d3456121": "amountInContract()", +"d3462259": "howManyTokens(uint256,address)", +"d346feb8": "changeCertBot(address)", +"d3471035": "KarmaToken()", +"d347c205": "transferableTokens(address,uint64)", +"d347de03": "setPlayerGeneralCd(uint64,uint32)", +"d3481bd0": "buyBlock(uint256,uint256)", +"d3484c1c": "TOKEN_SUPPLY_MAINSALE_LIMIT()", +"d348b409": "calculatePrice()", +"d348ee9a": "correctResult(int16)", +"d349f8b4": "MobileGoToken()", +"d34a280a": "setPreAmounts(uint256,uint256)", +"d34a412c": "switchRankings(uint16,uint8,uint64,uint64,uint64,uint64,uint64,uint64)", +"d34acd12": "functionCalls(uint256)", +"d34afaff": "getLatestIndex(address)", +"d34b1537": "minFundingReached()", +"d34b1aef": "returnUnsoldSafeLarge()", +"d34b2451": "BurritoPurchased(uint256,address,uint256)", +"d34b6cd3": "BBDToken(uint256,uint256,uint256,uint256)", +"d34b7e25": "checkWin(uint256[])", +"d34bb772": "EndsAtChanged(uint256)", +"d34be5be": "startVotingPrepare(address)", +"d34cc179": "updateDaoContract(address,string)", +"d34d8e43": "oracleItQuery(string,string,uint256,uint256)", +"d34dd1f0": "safeWithdrawal(address,uint256)", +"d34e4b20": "getWinnerHistory(uint256)", +"d34ed095": "getSoilTempException(bytes32)", +"d35066e6": "rsrvToSale(uint256)", +"d3511f82": "getRoundBetNumber(uint256,uint256,uint256)", +"d3516b7e": "setVote(uint256,bool)", +"d3525adf": "setMetadata(bytes32,bytes32)", +"d35262ef": "getInt256Min()", +"d3528d9b": "createBetAcrossDeposit(bytes16,bytes16,bytes16,bytes16,uint256,uint256)", +"d352a862": "ownerOfTwitterId(uint256)", +"d3535452": "buyPosition(address)", +"d353a1cb": "finish(uint256)", +"d3554dd5": "NieShichaoToken()", +"d35590c2": "sponsors(address)", +"d355f139": "requestBatchLoans(uint256)", +"d3565934": "YANG()", +"d3568560": "calcDates(uint256,uint256)", +"d356a28b": "addSERAPHIM(address)", +"d356a879": "removeAddressByIndex(uint256)", +"d357aa15": "raise2ndAppeal()", +"d357f0ce": "_checkPixelLeft(uint256)", +"d357ff87": "sweepRoundsActive(bool)", +"d359b0c7": "XeniaToken()", +"d359be70": "distributeExternal(uint256)", +"d359f82c": "updateExpiry(uint256)", +"d35ada32": "addParticipant(address,address)", +"d35b9d83": "codeAt(address)", +"d35bcf88": "addCET4(uint32,uint64,uint64,uint64,uint16,uint16,uint8,uint8,uint8)", +"d35c7372": "theCeiling(uint256,uint256)", +"d35c9a07": "withdrawProfit(address,uint256)", +"d35cf913": "mint_tokens(address,uint256)", +"d35d031e": "SellerChanged(address,address)", +"d35d90ba": "MPKToken()", +"d35e29d7": "mint(address,uint32)", +"d35e48e6": "PLBToken()", +"d35e6537": "IONIATOKEN()", +"d35e656b": "userNameTaken(string)", +"d35f0a16": "_getShares()", +"d35f4a99": "mint(int256,address,uint256)", +"d35fbbfb": "range(uint256,uint256,uint256)", +"d3604bc9": "yesContract()", +"d3614854": "getAdministratorETH()", +"d3617e7a": "MyToken(address)", +"d361ab64": "sendFreeTokens(address,uint256)", +"d3626d09": "getyestoday()", +"d3631e00": "refundUnconfirmed()", +"d3637c27": "icoArray(uint256)", +"d3650fb8": "approvers(uint256)", +"d365a08e": "masterAddress()", +"d365a3fb": "settleBet(uint256[],bytes32)", +"d366f83b": "allSidesPledgedAmount()", +"d366fbab": "startLottery(bytes32,uint256,uint256,uint256,uint256,bool)", +"d3670cb4": "BitcoinBlackToken()", +"d3671166": "PurchaseSuccessful(address,uint256)", +"d367a398": "NVTAddr()", +"d3695161": "deleteUser(string)", +"d369a744": "CCtestToken(address)", +"d36a1fa8": "ALKACOIN()", +"d36a35c9": "strikersBaseContract()", +"d36a8026": "Phoenix()", +"d36ae26b": "commBallotPriceWei()", +"d36afad5": "hasKey(address)", +"d36b96a9": "controllerFailed()", +"d36b9e64": "contributorsPeriodsElapsed()", +"d36bed21": "getGameAddressById(uint256)", +"d36bf8a1": "increaseWithdrawalChunk()", +"d36d9b19": "request_callback(uint8)", +"d36dbc0c": "addWineryOperation(string,string,string,uint256,uint16,string)", +"d36e0f39": "EIP20Token()", +"d36e9ac3": "burnUnused()", +"d36e9b2a": "RentalAgreement()", +"d36ef2cc": "PolicyPalNetworkCrowdsale(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"d36f0e9c": "etherForCharity()", +"d36f5c87": "stitch(int256,int256,bool)", +"d36f69eb": "getEthInCents()", +"d3701ff2": "TongToken()", +"d3707129": "_removeShareFromLastOwner(address,uint256,uint256)", +"d3708487": "setInfoAboveSpot(uint256)", +"d37194f5": "getTotalDepositsAmountLeft()", +"d371d551": "addAddressToCappedAddresses(address)", +"d372e3a0": "isCrydrViewAddress(address)", +"d3732642": "FastRealisticPyramid()", +"d373507b": "setAllowSell(bool)", +"d37360a0": "efw()", +"d3749a15": "user_contract()", +"d375b921": "orderUsable(address[8],uint256[6])", +"d3775371": "has_reading()", +"d377bc5f": "lockedMoney(bytes16)", +"d377dedd": "currentNiceGuy()", +"d378f4e0": "NOOR()", +"d37990ce": "setGenerationSeasonController(uint256)", +"d379be23": "claimer()", +"d37a9bb0": "restrictTransfers()", +"d37aff82": "changeStatus(uint8,bytes32)", +"d37b34d7": "blacklistAccount(address)", +"d37b8a96": "deploy(string,string,uint8,string,address)", +"d37cd1d9": "TalentCoin(address,uint256,string,uint256,string,uint256)", +"d37d753f": "spin(address,uint256)", +"d37fe6cb": "balanceOfWithoutUpdate(address)", +"d3807fa5": "NameChange(string)", +"d380e036": "marketDefaultFeeLow()", +"d3811c0f": "setMetadataBase(string)", +"d38159b8": "testPass()", +"d38185d3": "_buyXid(uint256,uint256,bytes32)", +"d381ba7c": "setRootUser(address,bool)", +"d381c67e": "isRentAuction()", +"d383b80d": "getCurrency(bytes32)", +"d383f646": "issue()", +"d384077d": "_closeProvider(address)", +"d384af87": "checkpopa()", +"d384d177": "haveCommonPrefixUntilZero(bytes32,bytes32)", +"d385293d": "confirmTokenTransferToBooking(bytes32,string,bytes32,bytes32,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"d38537cf": "TimerAuction(string,uint256)", +"d385fac9": "bwin()", +"d38609f9": "unhaltFX()", +"d386130c": "Encrypt(uint256)", +"d38685ee": "unlockGlobalToken()", +"d3872d57": "getLandRevenue(uint256)", +"d387978d": "cancelled(address,bytes32)", +"d387c4c1": "getOwnedTokens(address,address)", +"d388089a": "getJobDetail(uint256)", +"d3884c3f": "removeService(bytes32)", +"d38875ec": "addDeal(uint256,uint256,string,string,uint256,string,bytes32)", +"d388e416": "getAccountReferalsStats(address)", +"d3890a43": "DaoCasinoToken(uint256,uint256,uint256,address)", +"d3895c91": "changeConversionRate(uint256)", +"d38ac5ac": "WayBackToken()", +"d38bd9f0": "newTokenOwner()", +"d38bee56": "PlaceSell(address,address,uint256,uint256,uint256)", +"d38bfff4": "transferGovernance(address)", +"d38c3253": "ownerSelfDestruct()", +"d38c4cca": "removeFromTokenTransferDisallowedAddresses(address)", +"d38cba4b": "paymentRewardTokensPriority(uint256,uint256)", +"d38d0f28": "updateSplit(uint256)", +"d38e5ab7": "TransferDisable()", +"d38eb9d3": "escrowFrom(address,uint256)", +"d38f3b68": "getMedications()", +"d38fe43f": "setMembershipContract(address)", +"d390021d": "getLastTimeUpdated()", +"d390e819": "disableDonationContract()", +"d391014b": "ROLE_ADMIN()", +"d391a970": "removeFromOwnedTokens(address,uint256)", +"d391ce7a": "CrowdsaleContract()", +"d3927c15": "reimburse()", +"d392c5a2": "getNumOptionChains()", +"d3933154": "MYL(uint256,string,string)", +"d393c871": "register(string,address,uint256)", +"d393cde5": "wholeLineWrong()", +"d393f628": "changeDemurringFeeOwner(address)", +"d3943976": "getSGCUsers(address)", +"d3943ab4": "setIntArr(uint256,uint256)", +"d3943c83": "numberOfWithdrawls()", +"d3946ea4": "manuallyEndAuction()", +"d394a12e": "secondPresaleStart()", +"d39502bb": "AIBITTECH()", +"d3953822": "getThisAddress()", +"d395ee0f": "setQuickBuyPath(address[])", +"d3962239": "getCustomerPassword(address)", +"d3964ca1": "operationsEthWallet()", +"d397e9e4": "getDisputeCrowdsourcer()", +"d397f861": "TRAC_Tokens_left()", +"d3980d87": "ReferenceToken(string,string,uint256,address[],address)", +"d398806d": "updateMinJump(uint256)", +"d399354b": "KYC_USD_LMT()", +"d39aa15c": "_getTransferFeeAmount(address,address,uint256)", +"d39b0cbb": "Start10()", +"d39b1d48": "setDistributeAmount(uint256)", +"d39b7e4f": "setBPAddress(address)", +"d39bbf06": "MAX_INVESTOR()", +"d39c7880": "setAddressOfERC20Token(address)", +"d39c9afd": "OwnerKill()", +"d39cb111": "getShortId(bytes32)", +"d39cce1c": "calculateSaleReturn(uint256,uint256,uint16,uint256)", +"d39ce83a": "paymentMixed(uint256,uint256,uint256)", +"d39cee11": "benchTransfer(address[],uint256[])", +"d39d8fce": "presaleStart_6_December()", +"d39de6e9": "getAuthorizedAddresses()", +"d39e4607": "LogIcoCompleted()", +"d39eb301": "getStatus(uint8,uint8)", +"d39ebe2c": "setup(uint8,uint8)", +"d39ec1fe": "currentTethers(address,uint256)", +"d39f4149": "fxpMul(uint256,uint256,uint256)", +"d39f532d": "SafeGift(uint256,string,string)", +"d3a057c8": "isConfigured()", +"d3a05872": "AutoFareCalculator()", +"d3a0d0ab": "RTokenBase(uint256,string,string,uint8,bool)", +"d3a2d050": "addData(uint256[])", +"d3a3086e": "ActorCoin()", +"d3a39686": "getAddress(bytes32,bytes32)", +"d3a516d3": "viewSuperOwner()", +"d3a56ec3": "processRequest(uint256,uint256,uint256)", +"d3a5768b": "RoundWinner(address,uint256)", +"d3a57b9f": "showRdWonNum(uint256)", +"d3a5dcb0": "EQUITRADER()", +"d3a60bd5": "Exchange(address,uint256,uint256,uint256,address,address)", +"d3a61150": "setDatabaseDownloadUrl(string)", +"d3a699cd": "PePaDe()", +"d3a6be66": "donotXXXDappToken()", +"d3a6c234": "benWallet()", +"d3a70dba": "getReaderId(bytes32)", +"d3a73d12": "modifyLevelCaps(uint256[])", +"d3a85394": "currentPeriodTokenCollected()", +"d3a86386": "minimumBid()", +"d3a871e9": "REELToken()", +"d3a9187e": "mintTemplate(uint256,int256,uint256,uint256,uint256,string)", +"d3a99388": "JcashUpgradeableToken(address)", +"d3aa22c7": "transferTLA(string,address)", +"d3aa831f": "testOwnedTryAuth()", +"d3aceae2": "_balance(address)", +"d3ae2814": "LogTokensFrozen(bool)", +"d3aefeeb": "pauseUnpauseICO()", +"d3af4dc7": "processRequest(uint256,uint256)", +"d3b0d9eb": "refundFunds(address)", +"d3b15dd6": "Millet()", +"d3b19ee1": "dislike_trackable(address)", +"d3b234fc": "getAttoTokensToBeFounder()", +"d3b246d0": "upgradeEvilMorty()", +"d3b25696": "tradeIntentOf()", +"d3b302e7": "applyForMembership(string)", +"d3b3809c": "EscrowGoods(address,uint256,uint256,uint256,uint16,uint256)", +"d3b3eccb": "isARTDistributed()", +"d3b4be21": "Obtener_Reputacion(address)", +"d3b5305c": "setAgriChainDistribution(address)", +"d3b5695c": "setOraclizeCallbackGasLimit(uint256)", +"d3b58024": "RepeatCustomerToken()", +"d3b5c016": "submitSolution(uint256,string)", +"d3b5dc3b": "precision()", +"d3b6486a": "setLeastFund(uint256)", +"d3b6664a": "purchaseTrophy(uint256)", +"d3b6ac97": "defenceElementBySubtypeIndex(uint256)", +"d3b6fbc2": "MOVIECREDITS()", +"d3b7576c": "update(uint256,bytes32)", +"d3b7bcf1": "preAllocation()", +"d3b7bfb4": "fundingAddress()", +"d3b7ef5e": "SCE(uint256,string,string)", +"d3ba95ce": "throwsWhenFinalizingIfNotMultisig()", +"d3bac6e3": "coordinatorAccountCount()", +"d3bbb2c8": "b13ToBytes(bytes13)", +"d3bc89b7": "GetGuestTokenNo()", +"d3bc9aca": "addCourse(uint256,string,uint256,uint256,string,string)", +"d3bca884": "addBalance(address,address,uint256)", +"d3bced2c": "withdrawBotFee(uint256)", +"d3bd5a4b": "resetUserPromoBonus(address)", +"d3bd6e23": "newUpdater(address,address)", +"d3bd7713": "setCapAtDuration(uint256)", +"d3bdbd8f": "editMilestone(uint256,uint256,uint256,uint256,uint256,string)", +"d3bdd242": "isMovingEnable()", +"d3bf0ce6": "AAP()", +"d3bfe76a": "revokeApproval(address,address)", +"d3c0715b": "vote(uint256,bool,string)", +"d3c13c25": "GCOXAPLToken(string,string,uint8,uint256)", +"d3c18378": "getPlayersBalance(address)", +"d3c1c838": "batchTransfer(address[])", +"d3c2a592": "claimAsset(uint256)", +"d3c33c52": "ipc()", +"d3c4055d": "VITE()", +"d3c41dae": "FindCourseBaseOnIdStudent(uint256)", +"d3c564ad": "tokenZLT()", +"d3c567c1": "cancelVoteForCandidateByStage(address,uint256,uint256)", +"d3c5ea45": "ICO_PHASE3_PERIOD()", +"d3c62676": "MiamiToken()", +"d3c65384": "ContributedAmount()", +"d3c65737": "sumICOStage4USD()", +"d3c683e5": "LOG_FailedDraw(address,uint256)", +"d3c6a6d6": "getWitnessCount()", +"d3c764f2": "buyPixelBlock(uint256,uint256,uint256,bytes32)", +"d3c78097": "startDistribuion()", +"d3c7adf9": "JimatCoin()", +"d3c7c2c7": "getSupportedTokens()", +"d3c7ca2f": "Allinone()", +"d3c8dd69": "Parent()", +"d3c8e99e": "_shareDiscountPrice(uint256,address)", +"d3c9ad17": "REBALANCE()", +"d3c9cc26": "getTokens(uint256)", +"d3caee1b": "currencyToToken(address,bytes16,uint256,bytes)", +"d3cc0c37": "batchVote(address,address[],uint256[])", +"d3cc8d1c": "claimTokensFromSeveralAuctionsAsBuyer(address[],address[],uint256[],address)", +"d3cce1d2": "setOldContractData(address)", +"d3cd6052": "getProposalCount(bytes32)", +"d3cdb97b": "partIndexToOwner(uint256)", +"d3cde1a5": "updateReferral(address,uint256)", +"d3cde1c0": "getIndexAndCheckIfAllowedToPublish(uint256,uint256)", +"d3cdf6c5": "calculateTokenAmount(uint256,uint8)", +"d3ce71df": "buyCozy(uint256,uint256,bool,address)", +"d3ce77fe": "destroyTokens(address,uint256)", +"d3cea787": "setContractServerBlackWhiteListType(string,uint256)", +"d3cecc4d": "checkVestingCondition(address)", +"d3cedfee": "sspCount()", +"d3d10d87": "OwnerChanged(bytes32,address)", +"d3d18836": "publicLock(address,uint256)", +"d3d19965": "deleteCroupier(address)", +"d3d2172e": "total_reward()", +"d3d37a31": "setSaleCap(uint256)", +"d3d3b01c": "ToRent(uint256,uint256,uint256,address)", +"d3d3d412": "getGateAddress(address)", +"d3d3dd85": "updateHpbBallotAddress(address,address)", +"d3d43efa": "returnLoanStatus(uint256)", +"d3d44e8b": "getBlockCount(uint256,uint256,bytes32)", +"d3d54129": "setPCAddress(address)", +"d3d55493": "calculateRefundAmount(uint256,uint256)", +"d3d6a975": "testThrowsTransferNotEnabled()", +"d3d70c3c": "setPrivelegedWallet(address)", +"d3d77f98": "setCoeff(uint8,uint128,uint8,bytes32,bytes32)", +"d3d864f5": "isFundingOpen()", +"d3d8aa55": "IG()", +"d3d8acf8": "checkMyVestingPeriod()", +"d3d9e741": "SuperCoin()", +"d3da927f": "isRegistered(address,address)", +"d3daa8aa": "EtheremonPayment(address,address,address,address,address)", +"d3db2371": "DHCSToken()", +"d3dbc861": "Initiate()", +"d3dc9794": "pendingTxs()", +"d3dcc175": "devTeam()", +"d3dccb03": "ERC20Token(string,string,uint8,uint256,address,uint256,address[],uint256[])", +"d3dcd55a": "calcTokensFromEth(uint256)", +"d3dd9a18": "addManyAuthorizeToWhitelist(address[])", +"d3ddebce": "STATE_BET_DISABLED()", +"d3de5834": "disableFeesForUser(address,uint256)", +"d3deedfd": "MANHATTANPROXY2NDST()", +"d3df2d01": "maxUsdFundingReached()", +"d3e00f4b": "stampBirth(uint256,address)", +"d3e0996a": "checkProductGenuine(address,address,uint256)", +"d3e141e0": "left5(uint256)", +"d3e15747": "setLock(uint256)", +"d3e212c5": "bidExchange(uint256,uint256)", +"d3e242c2": "_confirmTransaction(uint256,address)", +"d3e2846a": "LINKFund()", +"d3e3623b": "earlyBackersAmountLeft()", +"d3e65414": "contributedToken(address)", +"d3e65b6c": "buyTicketByOther(uint256,bytes32,bytes32,bytes32)", +"d3e66a9e": "startCompetition()", +"d3e6dda7": "removeFound(address)", +"d3e6f49f": "isReadyToBreed(uint256)", +"d3e73312": "allocatedFounders()", +"d3e7d44d": "tokensBurnedTotal()", +"d3e82be8": "getMinPrivateSaleBuy()", +"d3e837cb": "setChecksOn(bool)", +"d3e848f1": "systemAddress()", +"d3e89483": "policies(uint256)", +"d3e8b207": "distributeWithLockup(address,uint256,uint256,uint256)", +"d3e91a98": "destroyAllTokens(address)", +"d3ea3322": "testBuildTokenSystemCost()", +"d3eb11d6": "payoutsWallet()", +"d3eb667e": "BigBoobsToken()", +"d3eb6f61": "isGoalReached()", +"d3ebd2dc": "transferFron(address,address,uint256)", +"d3ebf454": "LotteryRoundDraw(address,bytes4)", +"d3ecb95f": "wc()", +"d3ed0ea2": "setAuthor(uint256,string)", +"d3edcb0a": "_wholeToken(address)", +"d3edcb5b": "getCreditorAddresses()", +"d3ee86e7": "mmax(uint128,uint128)", +"d3eee5ad": "lockForDays(uint256,uint256)", +"d3efa856": "CreditBIT()", +"d3efbd7f": "freezeContract(bool,uint256,uint8[],bytes32[],bytes32[])", +"d3f01fbd": "calcToken()", +"d3f045d2": "Player(address,uint32,uint32,uint32,uint32,uint256,uint256)", +"d3f06def": "uploadFile(uint256,uint256,bytes32,bytes32[],bytes32[],uint256)", +"d3f16925": "setDevLimit(uint256)", +"d3f189bd": "COMMUNITY_ADDRESS()", +"d3f1a78c": "updateDelayTime(uint256)", +"d3f1fbd7": "updateLastMiningTime(uint256)", +"d3f233af": "burnOf(address,uint256)", +"d3f297d6": "claimLiquidityReward()", +"d3f2b996": "PTH(uint256,string,uint8,string)", +"d3f2e7cf": "runningRound()", +"d3f3bea2": "distributionRealized()", +"d3f40a02": "denyAccess(uint256,uint256)", +"d3f4fcd9": "claimInitialAllotment(string,string)", +"d3f574e7": "testToUint128()", +"d3f60667": "trackBuyBack(uint256,uint256)", +"d3f60d9c": "startTimeRound2()", +"d3f6a157": "setWallets(address,address)", +"d3f6be9f": "LogDeposit(address)", +"d3f6c328": "AMOCoin(address)", +"d3f6dc52": "oracleItQuery(string,string,string)", +"d3f71ecc": "checkIsOnSale(uint256)", +"d3f73bd4": "getOwnerCEO()", +"d3f8868b": "getFrequency(uint256)", +"d3f8cc95": "exhaustAfterFusion(uint256,uint256,uint256)", +"d3f92288": "WhiteList()", +"d3f9ba69": "processOneCombat(uint32,uint32)", +"d3f9fc33": "ownerRecoverTokens(address,uint256)", +"d3faaeca": "softCapInTokens()", +"d3fbf39d": "mintNFTNotForSale(uint256,string)", +"d3fc310a": "_addExtraReceiver(address)", +"d3fc9864": "mint(address,uint256,string)", +"d3fd311e": "trading_deactivated()", +"d3fd9eba": "transferAuction(address,address,uint256)", +"d3fe1ae1": "updateMember(address,uint256,uint256,uint256)", +"d3ff09a5": "setTotalTaskEscrow(uint256)", +"d40027ec": "lockoutPeriod()", +"d401defe": "getBasicInfo(address)", +"d40224ec": "triggerSale(bool)", +"d402be57": "calcMode()", +"d402f87c": "setTotalProfit(address,uint256)", +"d4030114": "tableSize()", +"d40394be": "batchAddWhitelistedTransfer(address[])", +"d404d6c2": "pushEther()", +"d404ea23": "hashKey()", +"d405a069": "grantInitialAllocations()", +"d405d6f4": "Chally()", +"d40619b8": "getUsersScannersIds()", +"d4065763": "returnRemainingMoney()", +"d406e403": "test_startBlock()", +"d407d212": "claimJ()", +"d408746a": "GetContractAddr()", +"d4088e33": "setPrice(uint256,uint256,uint64)", +"d4092dd2": "getPOOL_edit_29()", +"d409a12c": "Kcoin()", +"d409ddda": "EtherizationUtils()", +"d40a71fb": "step1()", +"d40b9d9a": "OwnerHeartbeated(address)", +"d40c0a58": "saveTeamSpent(address,uint256)", +"d40c3084": "fundValues()", +"d40d4d76": "etherToSendBankRoll()", +"d40dc870": "MAX_AMOUNT()", +"d40e35da": "Interest_Rate()", +"d40e985d": "decompose(uint256)", +"d40e9b9c": "rakeEventPlaceholderAddress()", +"d40fa8bf": "ZRX()", +"d40fd402": "salarySent()", +"d41097e3": "disbandTo(address)", +"d4112c56": "changeUtilityAccount(address)", +"d41212c8": "_insertTokenMetadata(uint256,string)", +"d41376e1": "withdrawl(address,address,bytes32)", +"d4138673": "IkuraTransferToken(address,address,uint256)", +"d413bd66": "OfflineMultiSig(address,address,address[],uint256)", +"d414da2a": "addPatternUserIndex(address,bytes32)", +"d4155d1f": "getJuror(address)", +"d41584ab": "LogCertifierRemoved(address)", +"d416c997": "_stringsEqual(string)", +"d416d1a6": "lastInvestorPaidOut(uint256)", +"d416d4f3": "Balance(address,address)", +"d416efdb": "donationTo(address)", +"d417f18d": "getTopicNameAndVotesAt(uint256)", +"d4186ba4": "test_oneValidEqInt3()", +"d41977cd": "contractFee()", +"d419ef9f": "WinToken(address)", +"d41b6853": "enter(address,uint256,uint8,uint8,uint8,uint32[11])", +"d41bcb81": "phaseEndTime(uint256)", +"d41bdea7": "unlock(bytes32,bytes32,bytes32)", +"d41be98d": "createDebtToken(string,string,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"d41c85fa": "__redeem()", +"d41cc314": "EventUpgradeTank(address,uint32,uint8)", +"d41d661e": "remOne(address)", +"d41ded30": "encodeLength(uint256,uint256)", +"d41e3281": "DocumentManager()", +"d4200f94": "setCreditBitContract(address)", +"d4203561": "transferFee(uint256)", +"d420e4e0": "BCaaS()", +"d420e527": "BuyLimitsCrowdsale(uint256,uint256)", +"d4212e93": "storeInitialClaim(address,uint16[],uint256,bool)", +"d4214d1b": "releaseUnclaimedBounty(address)", +"d42151b0": "FFCTToken()", +"d4229b1a": "appBase(bytes32)", +"d422cf58": "numLocks()", +"d422e4e0": "takeFee(address,uint256,string)", +"d422e810": "exchange_commission_wallet()", +"d423740b": "setter(uint256)", +"d423754b": "removeFactProviderFromWhitelist(address,address)", +"d4245e5b": "transferringETH(address)", +"d424f628": "fundingGoalReached()", +"d425bd91": "calculateDepositInfoWitnessHash(uint256[])", +"d4264af0": "mintTo(address,bytes32,string,uint256)", +"d4269986": "getPuzzle(uint8)", +"d426b04e": "largeContribThreshold()", +"d426bb47": "allocateForPrivateSale(uint256)", +"d42706bd": "Batix()", +"d4270d60": "recall()", +"d427ccbf": "getEventAddress()", +"d427ce74": "getBylawsProjectDevelopmentStart()", +"d428bf3b": "SetdivForPrice(uint256)", +"d4291e0c": "num_hosts()", +"d429bfae": "currentTokenOffered()", +"d42a5011": "setPackLimit(uint16)", +"d42a9dd5": "ICO_PHASE1_PERIOD()", +"d42aa2f6": "getHealth(uint8[176],uint8)", +"d42ad6ea": "getMinAuditPriceMin()", +"d42b31b9": "_DeclineInsurance()", +"d42bd8a4": "receivedUETreturn(address,uint256)", +"d42bf301": "doTriggerTryAuth()", +"d42c334e": "DepositMasterContract(address)", +"d42cc0d1": "Planetagro_Exchange(address)", +"d42cda15": "getOnMintTargetValue(int256)", +"d42cfc41": "transferFeeDenominator()", +"d42d24fc": "auditContract()", +"d42d4c10": "PASSToken()", +"d42d8eed": "tag(address,uint256)", +"d42db190": "versionAddresses(bytes32,bytes32,address)", +"d42dca55": "getAuditors(uint256)", +"d42e26f5": "initializePresaleFundraiser(uint256,uint256,uint256,uint256)", +"d42e87ed": "callOnSignUp()", +"d42ed758": "MixManager()", +"d42eeb4f": "EtherDrugs()", +"d4300225": "publicGetBalance(address)", +"d430381b": "mayorCutPercentage()", +"d4313945": "setProviderInvitedUser(uint256,address,bool)", +"d431b1ac": "setPause()", +"d431ba8e": "lastBlock_v8()", +"d432a885": "withdrawedFoundationCounter()", +"d4331c21": "setSubTourFreezingTime(uint64)", +"d4332f50": "changeBPaddress(address)", +"d4335bd2": "getSevenCount()", +"d433ea6a": "CueCrypto()", +"d4346010": "verifiedTransferFrom(address,address,uint256,uint256,uint256,uint256)", +"d43503ab": "Sunset()", +"d4357107": "address_to_tokens_prev_week1(address)", +"d43582c8": "removeNOSPackage(uint256)", +"d4365b4b": "Weaver()", +"d436b6e2": "EtherAdvance()", +"d4371968": "MAX_IMMORTALS()", +"d4384156": "UbexToken(uint256)", +"d438fdbd": "offlineSales(uint256,uint256)", +"d439390c": "MIN_PURCHASE()", +"d43948ee": "transferGainedEther()", +"d439ef55": "distributionMinimum()", +"d43a0b4c": "hodlerTotalValue9M()", +"d43a7c16": "finalizePrivateIco()", +"d43c3bb9": "getData_30()", +"d43c45b8": "withdrawSurprisePot(address)", +"d43c5a4a": "setTeamVault(address,address,uint64)", +"d43ea9e1": "levelTwoTokenNum()", +"d43ef6b9": "__mulmod(bytes,bytes,bytes)", +"d43f24b0": "removeApprovedContractAddress(address)", +"d43fb152": "isMilistoneSubmited(bytes32)", +"d4403495": "OWN_mintToken(uint256)", +"d440c6f3": "getWorkerAffectation(address)", +"d441ea62": "CleanBankerProfit(uint8)", +"d4430bc7": "tokenSaleOngoing()", +"d443173d": "requestUnFreezeAccount(address,string)", +"d4434387": "PolyCompliance()", +"d443f64a": "Start_Resume_PreICO()", +"d443fc85": "acceptGuardianVend(uint256)", +"d4440991": "callTransfer(address,uint256)", +"d44512e3": "changePrestige(address)", +"d445afdc": "week1Price()", +"d445cc78": "unfreezeTransfer()", +"d44750f5": "bonus_price()", +"d448273c": "mineForMany(address[],bytes32[])", +"d4483263": "secondRoundMayStart()", +"d4492c57": "addInvestorGrant(address,uint256,uint256,uint256)", +"d449844d": "XbitfwdToken()", +"d449a832": "decimals(address)", +"d449ce7c": "Administered()", +"d44a2863": "changeBooking(string,uint256[],uint256,address,bytes32)", +"d44aadf7": "initROS()", +"d44aecb0": "ico1_startdate()", +"d44b01ec": "safeWithdrawERC721(address,uint256,address,address)", +"d44bc088": "getTaskId(uint256)", +"d44cf3dc": "_setPriceFactor(uint256,uint256)", +"d44d159d": "mintWithBase(address,uint256,uint256)", +"d44d3394": "WIDTH()", +"d44dbbaf": "addStringComparison(bytes32,bytes32,bytes1)", +"d44dd681": "beginLiquidation()", +"d44f2d3d": "getInitialWithdrawalDone()", +"d45036c7": "viewTeamTokens()", +"d4508698": "driveCar()", +"d4524c72": "manualEtherWithdraw()", +"d45294f5": "charityAmtToCharity()", +"d45318b9": "scoringDuration()", +"d4538051": "_emitHolderAddressAdded(bytes32,address,uint256)", +"d4540ca7": "isDeployerOrOperator()", +"d454f92e": "mNumVoters()", +"d4550efd": "addEngineerQuest(address)", +"d455b973": "changeStageBlock()", +"d4565916": "activateproduct(uint256)", +"d45769b8": "N2Contract()", +"d4582b56": "Token(string,uint8,string)", +"d4589835": "sellMorties()", +"d4589e99": "assertDowntime()", +"d458c522": "participantCapTier1()", +"d459197b": "distributeALCTokenBatch(uint256)", +"d4595aaa": "blockExpiration()", +"d459654a": "techSupport()", +"d45973f4": "turretElementBySubtypeIndex(uint256)", +"d4597aa1": "tokenFrozenUntilTime()", +"d459fc46": "SetCheckpoint(uint256,bytes32,bytes32,uint64,uint8[],bytes32[],bytes32[])", +"d45a717e": "topGoodsId()", +"d45b1ae4": "StandardGasPriceLimit(uint256)", +"d45b5f71": "getIcoStep(uint256)", +"d45baeab": "Deposit(uint8)", +"d45bcac1": "listAddresses(address[],uint256[],uint256[])", +"d45c1b06": "Bank(string)", +"d45c241c": "minBonus()", +"d45c4435": "getTimestamp(bytes32)", +"d45e09c1": "canTransfer(address,uint256)", +"d45efad5": "getAccessControl(address,address,uint8)", +"d4607048": "buyForEverybody()", +"d461518c": "p_setGameDuration(uint256)", +"d4616967": "deployCode(bytes)", +"d4620041": "getFirstRoundReleaseTime()", +"d4625a3a": "equals()", +"d4629ae7": "ddftFund()", +"d46300fd": "getA()", +"d4631019": "_startCounter()", +"d4638401": "oneImpInWei()", +"d4638fea": "operatorRedeemByTranche(bytes32,address,uint256,bytes,bytes)", +"d463ca18": "findSsp(address)", +"d463eeb3": "numLoans()", +"d464520c": "PowX()", +"d4649fde": "expire(uint256,uint8,bytes32,bytes32,bytes32)", +"d4653a3b": "EXToken()", +"d465abca": "notInArray(address)", +"d465c392": "revealProofOfPerfBlock(uint32,string,bytes32,bytes16,bytes32,bytes16,bytes32,bytes32)", +"d466a03f": "citizensAmounts(uint256)", +"d466a046": "LogBidExpired(bytes32)", +"d466ab6b": "ROLE_BOUNCER()", +"d467cc00": "calculateRate(uint256,uint256)", +"d467cc64": "DoubleOrNothingImpl()", +"d4683f6d": "ArticCoin(uint256,string,string)", +"d4686534": "LYNIA()", +"d46a005a": "addWhiteListUser(address,uint256,uint256)", +"d46a5d7e": "vote(uint256,bool,uint256)", +"d46aa610": "buyInMarket(uint256)", +"d46b2987": "Luvtoken()", +"d46b9b84": "lifeN(uint256)", +"d46ba0c9": "etherRaisedPerWallet(address)", +"d46c0f40": "finishPrivatePlacement()", +"d46cddd4": "capPresale()", +"d46d0393": "getNextRegionId()", +"d46d0a22": "setV_S(uint256)", +"d46d79bb": "withdrawAllEth(address)", +"d46dbca1": "developerTemplateAmountLimit()", +"d46dd5bb": "showCurrentWinner()", +"d46ea4a4": "EXP_18()", +"d46eb119": "wrap()", +"d46f8eb1": "getSource(string,string,string,string)", +"d46ff2f1": "getTweetsDiff(uint256)", +"d470097c": "lastLargestHODLER()", +"d4701c35": "activate_kill_switch(string)", +"d4702576": "calculateTokens(uint256,uint256,uint256)", +"d4717240": "setkeytoken(address)", +"d4724a57": "TokenTransferForFounder(address,uint256,address,address)", +"d472d6bf": "get_token_balance(address)", +"d472fa26": "lockTokenToDate(address,uint256,uint256)", +"d472fe7e": "totalTokensICO1()", +"d4735d92": "Transfer(bytes32,address)", +"d4737d11": "setSampleRegistry(address)", +"d47380e0": "_mintToken(address,uint256,uint256,string)", +"d4740b78": "getAmountWeekly(uint32)", +"d4747f0a": "IQC()", +"d474a352": "submitBlockHeader(bytes,uint256)", +"d47510c0": "UNICORN_ID()", +"d475526f": "numActiveGames()", +"d475b1ab": "phase5Price()", +"d475bfa8": "proxyClaimTokens(address,address)", +"d47637f7": "getLittafiContent(bytes32,uint256)", +"d476620b": "winnerKey()", +"d476758f": "extractablePercentage()", +"d4768994": "soldIdeaWeiPostIco()", +"d477e3d4": "checkAddERC20(address)", +"d477f05f": "setDev(address)", +"d47875d0": "getScore(address)", +"d4788cc3": "HGT_Reserve()", +"d478f533": "allowFreezing(address)", +"d4793a9b": "getNextGuessId()", +"d4798327": "getPendingBattleRewardsCount(address)", +"d47a2010": "bnbRaised()", +"d47b44c3": "Fool()", +"d47bb75c": "TOKENERC20(uint256,string,string)", +"d47c0fb0": "onIncome()", +"d47c9e11": "eastadsCREDITS()", +"d47cc085": "sameNum()", +"d47cc9d7": "start_the_race()", +"d47cf598": "setDayThird()", +"d47d3202": "releaseINATokenToTeam()", +"d47d5cfe": "swarmTree()", +"d47d996e": "addCrowdSale(uint256)", +"d47dbde2": "buyerFundRelease(uint256,address)", +"d47e813d": "SteveCoin()", +"d47e81eb": "blockSettlement(uint64,uint64)", +"d47eb8ee": "validCall(uint256,bytes)", +"d47eca0a": "checkDiv()", +"d47ee6c1": "numberOfLeaderboardPlayers()", +"d47f269e": "getHand(uint256)", +"d4807fb2": "initializeRound()", +"d4810b61": "PRE_ICO_START()", +"d48210bc": "perValue()", +"d4821432": "endICOStage8()", +"d4849a8b": "newEthBackedLoan(uint32)", +"d484a285": "PRE_ICO_SLGN_LESS()", +"d48599e3": "setdrawadm(address)", +"d4859dbc": "UniversalFunctionSecure(uint8,bytes32,bytes32,bytes32,bytes32,bytes32)", +"d4859dc5": "disableManager(address)", +"d48675f3": "minGoal()", +"d4867694": "updateship(uint256,uint256)", +"d48684d8": "changeLimit(uint256,uint256)", +"d4868c32": "tokenReserved3Deposit()", +"d486d129": "releaseVesting(address)", +"d4871517": "BTCLotto(address,uint256)", +"d487758a": "forgive(uint16,uint32)", +"d4878cac": "_transferChild(address,address,uint256)", +"d487b21a": "assets_controller()", +"d4884b56": "getEventEnd()", +"d4897729": "getCET4InfoById(uint32)", +"d489a018": "adminAddWorldBalance()", +"d489b701": "starEthRate()", +"d489b83f": "teamOneShares()", +"d489c0bf": "getBuyCount(address)", +"d489e180": "getPendingPartCrateLength()", +"d489fc8b": "_useOraclize()", +"d48a1f6e": "returnPurchasedEther()", +"d48a9340": "SaveCryptoToken()", +"d48b2e92": "Identify()", +"d48b55e5": "calculateTokenOnlySellPrice(uint256)", +"d48b7a9d": "CryptoMyWord()", +"d48bb321": "next(bytes2,bytes2,bytes2,bytes2,bytes2,bytes2,bytes4,uint256)", +"d48bfca7": "addToken(address)", +"d48c4193": "addWhitelistedTransfer(address,address)", +"d48d02f6": "withinLimits(uint256)", +"d48e638a": "getCreator(uint256)", +"d48e6a1b": "TEAM_TOKENS_PERCENT()", +"d48e9cd5": "OMG()", +"d48ea599": "getBeneficiaryByTime(address,uint256)", +"d48f08e5": "disableRegulator(address)", +"d48f7196": "numHodlers()", +"d48fb85c": "FIVE_YEAR_KEEPING()", +"d48fe280": "OK()", +"d4912ab1": "SNTPlaceHolderMock(address,address,address,address)", +"d491461a": "Gnosis()", +"d492283f": "switchLock(bool)", +"d4923d4e": "getUserVote(address)", +"d493b9ac": "transferAnyERC20Token(address,address,uint256)", +"d494c388": "setMinBuyAmount(uint256)", +"d49620ec": "RoundFinalized(uint256)", +"d49636c2": "san()", +"d496a4f1": "cashBackVotes()", +"d496bde4": "mainSaleTime()", +"d496f9d2": "PlayReferred(uint8,uint8,uint8,uint8,address)", +"d4971613": "HashBounty()", +"d49758d6": "use_bounty_token(address,uint256)", +"d4975d71": "changeVoter(address,address,string)", +"d4981928": "WorkOrder(uint256,address,address,address,address,uint256,string,address,address)", +"d499555b": "getFirstActiveDuel()", +"d49982cc": "sendPreSaleBonusMany(address[])", +"d499b2c3": "pks(uint256)", +"d49ab244": "ICOWhitelisted(address)", +"d49ad161": "addTokenDetails(uint256,address[],uint256[],uint256[],uint256[])", +"d49c51b7": "claimedMK(address)", +"d49ce78d": "WiggaToken()", +"d49d1836": "openegg(uint256,uint256)", +"d49d1bac": "transferERC223(uint256,address,address,uint256,bytes)", +"d49d5181": "MAX()", +"d49dbb5c": "minBalanceToSell()", +"d49dd9a8": "getStateofContract()", +"d49dd9e4": "SonnetCoin()", +"d49edbd8": "lastPrizeGiven()", +"d4a03f60": "acceptAdoptionRequest(bytes5)", +"d4a04ff4": "importFromOld(address,address,address,address,address[],uint256[])", +"d4a226c3": "bountyManagerDistributionContract()", +"d4a2498d": "addData(string)", +"d4a24f06": "checkPermissions()", +"d4a28823": "EOSSale(uint256,uint128,uint256,uint256,uint128,string)", +"d4a2f3ca": "getShipAuctionEntity(uint32)", +"d4a34564": "start3BonusPeriod3()", +"d4a34a9e": "tokenDecimalsLeft()", +"d4a3e9d7": "capture()", +"d4a436cc": "_countBits(uint256)", +"d4a4513e": "fpct_packet_size()", +"d4a61d61": "OnlineCasinoCoin()", +"d4a631ab": "ContractLogEvent(int256,int256,uint256,string,string)", +"d4a67930": "openBuy()", +"d4a6fd3e": "has_presale_started()", +"d4a8d9ba": "Inbox(string)", +"d4a9991f": "requestDividends()", +"d4a99d61": "finishDelivery()", +"d4aa6b59": "Button(uint64,uint64,uint64,uint64,uint64,address)", +"d4aa7394": "GameStatusUpdate(bool)", +"d4aa7d38": "City(uint256,string,string)", +"d4aae0c4": "kernel()", +"d4ab4a89": "_migrateRobot(string)", +"d4ac6af5": "MAX_REFERRAL_TOKENS()", +"d4acaf6c": "ecrecoverFromSig(bytes32,bytes)", +"d4acfa01": "tokenFrozenSinceBlock()", +"d4ad678e": "addItem(bytes16,uint16,uint16,bool)", +"d4ae1061": "getPurseDetails(uint256)", +"d4afc8b6": "retrieveERC(address)", +"d4b03d34": "changeValueBonus(uint8,uint256,uint256)", +"d4b088f9": "ICO_PHASE2_AMOUNT()", +"d4b0a23b": "addWhitelists(address[],uint256[])", +"d4b0c6e5": "stringToBytes10(string)", +"d4b0e966": "changeSaleStart(uint256,uint256)", +"d4b15ee0": "LogRefund(address,uint256,uint256)", +"d4b175d4": "mineTokens(address,uint256)", +"d4b182d4": "block(address,bytes32)", +"d4b1a462": "LogBought(uint256)", +"d4b1cdcc": "isResolverFor(uint256,address)", +"d4b1d19f": "testThrowsTransferDisabled()", +"d4b2931c": "tokenSEEDcap()", +"d4b2d5f0": "SQR_TOKEN()", +"d4b3f5b6": "tokenWithdraw(address,uint256,uint256)", +"d4b572be": "RESERVE_TOKENS_SUPPLY()", +"d4b64f35": "getBalanceOfModifiedWeth()", +"d4b71aa9": "maxPresaleWei()", +"d4b795c0": "getCurrentRoundEntry()", +"d4b83992": "target()", +"d4b8a6f1": "setFeeSchedule(uint256,uint256,uint256,uint256)", +"d4b9e410": "coiner()", +"d4ba15ad": "earlyPariticipantWeiPrice()", +"d4ba769c": "getLatestComponent(string)", +"d4badfad": "totumAllocation()", +"d4bb02e4": "changeRatePreSale(uint256)", +"d4bb1f28": "FCOIN1346Token(uint256,string,string,uint256)", +"d4bc0942": "withdrawOracleFunds()", +"d4bc87d9": "currentPriceChangeNumber()", +"d4bcffe4": "AbxyjoyCoin()", +"d4bd5a0d": "addCollaborator(uint256,address)", +"d4bdb879": "tokenSaleHasFinished()", +"d4bdc45f": "downvote(uint256,int256)", +"d4bde313": "ownBalance()", +"d4bdfe00": "ETCTransfer(address,address,uint256)", +"d4be5f68": "ATL_PER_ATP()", +"d4be6356": "authentication(bytes8)", +"d4be7714": "bornFamedStar(uint256)", +"d4bffa5a": "STATE_INITIAL_BIDDING()", +"d4c0cbce": "NovaCoinTransfer(address,uint256)", +"d4c1089b": "WorldRecord(string,bytes32,address)", +"d4c24db7": "StarterTokenSale()", +"d4c2b6b1": "scheduleTransaction(address,bytes,uint256[5],uint256)", +"d4c30ceb": "getFeeBalance()", +"d4c34dbb": "changeSoulCap(uint256)", +"d4c3eea0": "totalValue()", +"d4c46fa6": "setDeploymentPriceYear(uint256)", +"d4c49094": "WithrawDevToken()", +"d4c50f00": "coinPerEth()", +"d4c55f56": "wkaToken()", +"d4c6d9ad": "getbetresult(bytes32)", +"d4c72e7f": "etherollBeneficiary()", +"d4c76e8b": "MaxToken()", +"d4c80edf": "amountWagered()", +"d4c8fdae": "saleEtherRaised()", +"d4c9b1f2": "setMainAddress(address,address)", +"d4ca68ea": "replacePolicyTo(address,uint8)", +"d4cab39b": "AddedPrecommitment(address,uint256)", +"d4cae6e2": "getMetadataURL(bytes,uint256)", +"d4caf2a4": "setCodeSize(uint256)", +"d4cd5509": "CulturalCoinCrowdsale(uint256,uint256,uint32,uint32,address,address,address,uint256,uint256,uint256,uint256,uint256)", +"d4cdeb3c": "isInPresale()", +"d4ce1415": "detectTransferRestriction(address,address,uint256)", +"d4ce545a": "random(bytes32)", +"d4cf02ef": "getStringToSignWithKey(string,int256)", +"d4d0aced": "transferPartOfUnsoldTokens(address,uint256)", +"d4d0d6e6": "addTrusted(address)", +"d4d0e931": "resetAllVotes()", +"d4d1b7da": "approveTokensFromAnyWithSignature(address,address,address,uint256,uint256,uint256,uint256,bytes)", +"d4d227de": "PBToken()", +"d4d2af8d": "sellCoin(uint16)", +"d4d2e23c": "LogRandom(uint64)", +"d4d30bd9": "GreenX(address,address,address)", +"d4d33ece": "isRebirthAllowed(uint256,uint256)", +"d4d37883": "sendSurplusTokens()", +"d4d42658": "getTokenRateEther()", +"d4d42c91": "SetupML(uint256,uint256,uint256,uint256)", +"d4d5d32a": "collectFee()", +"d4d64f2b": "getRevokeHash(bytes,uint256)", +"d4d6adc0": "SiliconXCoin()", +"d4d6cdc4": "getStageTotal()", +"d4d6d366": "metadataUrlSuffix()", +"d4d6f5ee": "deleteChannel(address,address,address)", +"d4d70128": "totalContributions(uint256)", +"d4d728fe": "IsClaimed(bytes32)", +"d4d7b19a": "isHolder(address)", +"d4d81a13": "ClownCore()", +"d4d82dae": "MCFitCrowdsale(uint256,uint256,uint256,address)", +"d4d84da5": "addTokenShop(address,uint256)", +"d4d90bd5": "MINIMUM_PURCHASE_AMOUNT_IN_WEI()", +"d4d91bdd": "_createOpinion(string,address,uint256)", +"d4d92b14": "mintInternal(address,uint256)", +"d4d96ac5": "flag(string)", +"d4d9748d": "NeoToken()", +"d4d9bdcd": "approveHash(bytes32)", +"d4d9f559": "addWhiteListAddSetAuctionObj(address,uint256,uint256)", +"d4db3791": "processTransferResult(address,address,uint256,bool)", +"d4dc8e83": "walletCreateSnap(uint256,uint256)", +"d4dca69b": "thisAddress()", +"d4dcbc60": "declineApproval(uint256)", +"d4dd1594": "updateLandData(int256,int256,string)", +"d4dd26fb": "initKYCUser(uint256)", +"d4dd5d99": "LiteXTokenVesting(address,uint256,uint256,uint256,uint256,bool)", +"d4dd707f": "upgrade_node(address,address,string)", +"d4dd92a9": "TeamAllocation()", +"d4def0ba": "escrowedTokens()", +"d4df0c6d": "setSaleAuctionAddress(address,address)", +"d4df1be8": "getETHNeedPay(uint256,uint256)", +"d4df6152": "getInvestorByIndex(uint256,uint256)", +"d4df89e2": "messageBoard1(string)", +"d4dfadbf": "getMarket(address)", +"d4dfc4b9": "MinimalManuscript(bytes32,string)", +"d4e08743": "isVaidUsername(string)", +"d4e12f2e": "approve(address,int256)", +"d4e17e6d": "closeBuy(bool)", +"d4e19bd1": "HART_NETWORK_ID()", +"d4e30489": "NewYorkCoin()", +"d4e32938": "subuser(address,uint256)", +"d4e4716f": "_setWhitelistedUser(address)", +"d4e4841d": "tokenToEthTransferOutput(uint256,uint256,uint256,address)", +"d4e678b8": "refundTransaction(uint256)", +"d4e75363": "NextDistribution(uint256)", +"d4e77133": "SendCoin(uint32,uint32,uint32,address)", +"d4e78272": "Draw()", +"d4e7b9cf": "amountAvailableToCashout()", +"d4e823a3": "createVendingItem(uint256,uint256,uint256,uint256,uint256)", +"d4e8b749": "periodITO_weiPerToken()", +"d4e8e063": "startGrantAuthentication(address)", +"d4e90e24": "CCTC()", +"d4e93292": "withdrawal()", +"d4ea7b08": "_emitPublicCapabilityRemoved(address,bytes4)", +"d4eaa9fd": "approveAndCall(uint256,bytes)", +"d4eb139d": "migrateSet()", +"d4eb21ff": "PonderAirdropToken()", +"d4eb4186": "setB0xAddresses(address,address,address,address)", +"d4eb4540": "BLOCKTIMEOUT()", +"d4eb487e": "getProtectHourglass(bytes32,uint8)", +"d4eba667": "updateNovaContractAddress(address)", +"d4ebc5ff": "voteUp(uint256)", +"d4ed0b46": "setCRaddress(address)", +"d4ed2cf5": "candidateTillExchange()", +"d4ed8990": "updatePoolAddressCapTier1(uint256)", +"d4ee025f": "resetRequest()", +"d4ee1d90": "newOwner()", +"d4ee4041": "removeBlock(address)", +"d4ee9415": "addPurchased(uint256,uint256)", +"d4ee9fba": "existPublicKey(bytes32,address)", +"d4eeb6ad": "seasonTopSalesRewards(uint16)", +"d4eec5a6": "optOut()", +"d4efcfe4": "getAccountInformation(uint256)", +"d4f04289": "ownerSellArmy(uint256,uint256)", +"d4f06298": "UpdatedMainAccount(address)", +"d4f0ca3f": "onlyTestSetTimestamp(uint256)", +"d4f0ebe6": "getWeaponNb(uint8[176],uint8)", +"d4f114a6": "numOfBoundaries()", +"d4f11ab2": "updateCompanyWallet(address)", +"d4f2e67c": "ico(address,uint256)", +"d4f2f1da": "EthereumNano()", +"d4f397b5": "getLootClaimed(uint256,address)", +"d4f3d6b8": "updateEditionType(uint256,uint256)", +"d4f3dd84": "_generation()", +"d4f50f98": "getVoter(address)", +"d4f639ea": "run2()", +"d4f6aa98": "getLargePaymentBonus(uint256)", +"d4f7329e": "minttoken(uint256)", +"d4f74bf4": "curatorAccount()", +"d4f77b1c": "joinGame()", +"d4f96a09": "giveawayAddr()", +"d4fa83c3": "setWhitelistTx(address)", +"d4fa9021": "DeductABS(uint256,uint256)", +"d4fac45d": "getBalance(address,address)", +"d4fb0bc1": "payOut(uint256,uint256)", +"d4fb0d23": "totalGuess()", +"d4fb9a01": "tradingStatus()", +"d4fbe1e0": "devAllocation(address,uint256)", +"d4fbeb19": "registerToken(address,string)", +"d4fc5822": "userWeiSpent(address)", +"d4fdbcff": "ViewDividendPoolEnds()", +"d4fef717": "APC(uint256,string,string)", +"d4ff60cb": "URB()", +"d4ff88d5": "TokenSent(address,uint256)", +"d4ffd1bd": "updateStrategy(uint256,string,string,string,address[],uint256[],bytes32)", +"d5002f2e": "getTotalShares()", +"d50030ad": "getMyDividends()", +"d5005c35": "COINVR()", +"d5009584": "getManager()", +"d500ca00": "assignReward(address,uint256)", +"d500dd6a": "challengeTimeout(uint256,bool,address)", +"d500f861": "buyFromWallet(uint256,bytes32)", +"d501953d": "poolTokenAmount()", +"d5020ce8": "daysMinutesTilExpiryTime()", +"d5025625": "terms()", +"d502db97": "getAddr(string)", +"d5034f2f": "changeRegistrationStatuses(address[],uint256[])", +"d503d33f": "MyPoolBalance()", +"d503e948": "developer_edit_text_minimum_period(string)", +"d503ef95": "getCategoryEvaluation(address,uint256,uint256,address)", +"d50495f4": "addTransaction(bytes)", +"d504cb65": "currentBet()", +"d504ea1d": "getArray()", +"d5050493": "tokenOf(address,address)", +"d505c1cf": "currJackpotBetID()", +"d506355c": "getRentInfo()", +"d5064037": "BitcoinVision()", +"d5065090": "setVendingStartPrice(uint256,uint256)", +"d5072607": "auditTimeout()", +"d5089396": "Token(string,string,uint8,uint256)", +"d509b16c": "testWithdraw()", +"d509b1f9": "like(address,address,uint256,string,address)", +"d50a04f4": "dataPerUsd()", +"d50a3d2c": "privateSale(address,uint256)", +"d50b3065": "addTokenBalance(address,uint256)", +"d50b65d7": "startBlockjack()", +"d50b7123": "testLockTokensForTrading()", +"d50bb794": "getComponent(uint256,uint256,uint256,uint256)", +"d50cb88b": "priceMultiplier()", +"d50d4822": "revokeParticipation(address)", +"d50e38c6": "IbkToken()", +"d50e829e": "setStopped(bool)", +"d50f6bf0": "transferETH(address)", +"d50f6d3a": "getPartner(address)", +"d50f7c73": "lastBlock_v10()", +"d5102704": "testRenameStore()", +"d51033db": "getTuple()", +"d5119402": "PUBLIC_SALES_3_PERIOD_END()", +"d511beec": "WithdrawICOEarnings()", +"d511cc49": "DAILY_PURCHASE_LIMIT()", +"d511f6c0": "startBuyingTokens(bool,uint256,uint256)", +"d5144eca": "updateUserBio(string,string)", +"d515b1ce": "Team(address)", +"d515be39": "getTokenName(address,uint256)", +"d5167b26": "partialTrade(uint256)", +"d5170fcc": "BonusFinalizeAgent(uint256,address)", +"d5171523": "euroteambet()", +"d517bc6f": "calcPointShamir(uint256,uint256,uint256,uint256)", +"d5182b70": "blocked(uint256)", +"d5185115": "forwardTokens(address,address,uint256)", +"d51902cf": "fallbackAccount()", +"d5193235": "mintUserAdoptionTokens()", +"d519bdcb": "distributeSML(address[],uint256)", +"d519fdc5": "alterGiveKarmaFee(uint256)", +"d51abbd9": "updateMaxTxGas(uint256)", +"d51c2454": "stepOne(int256)", +"d51c86e7": "setData_12(string)", +"d51d4fa8": "Securities_3()", +"d51e1737": "creedex(address,address,address,uint256,uint256,uint256)", +"d51eda9a": "AMC()", +"d51f5abd": "BEXMToken(uint256,string,string)", +"d52230c4": "totalContributionsBySender(address)", +"d5235a04": "contractEnable()", +"d5246eba": "queryRandom()", +"d5250364": "checkWrapperBalance()", +"d52550a4": "TokenPool(address,address,address)", +"d525aa32": "conditionalTransitions()", +"d5260eea": "getChannelAddress(string)", +"d526b9bd": "_allow()", +"d526c08e": "uv()", +"d526c40c": "_denyPublishSecret()", +"d526d332": "getLogic(uint256)", +"d526eaeb": "getMaximumReadsPerStep()", +"d5280c28": "AuthorizedCreate(address,uint256)", +"d529a072": "buyAddress(address,bytes8,uint256)", +"d529debb": "subOnHold(uint256)", +"d52a3524": "addAction(bytes32,bytes32,string,uint256,bool,uint256,uint256)", +"d52a5fc4": "decomission()", +"d52a7cbf": "setWallet1(address)", +"d52a7e86": "totalRewardedAxies(bool)", +"d52b38cd": "updateVendorApplicationStatus(string,string,string,string,string,string)", +"d52b5cb4": "_addLegitRace(address)", +"d52b79bd": "XTT()", +"d52b8a0e": "addVineyardEndorsement(string,uint256,bool,string,string)", +"d52b9e40": "activateTokenSwitch()", +"d52c6c08": "approCertificate(uint256)", +"d52e4633": "futureRoundTokensRelease()", +"d52f7122": "myCredit()", +"d52f916f": "setAddressCrowdsale(address,address)", +"d52f9f0f": "axonburn(uint256)", +"d530040a": "createAddressHash(address,bytes32)", +"d5307b0c": "weiContributed(address)", +"d53087b2": "JANUS()", +"d531eeaa": "icoBonus1()", +"d5320300": "getWithdrawableAmountANPES(address)", +"d532968f": "_chkSellerLmts(address,uint256)", +"d532df3c": "setCraftAuctionAddress(address)", +"d532e481": "activateFrozenAccount(address)", +"d533d0db": "changeUserLangAbility(bytes32)", +"d534831c": "sumOfWeights()", +"d5349606": "removeDeadTurns(uint16)", +"d535268d": "BUZZ()", +"d5353792": "setWithdrawGasCost(uint8)", +"d5356b7d": "TOKENS_PER_USD()", +"d5356fe1": "tokenFallback(address,address,uint256)", +"d53590a7": "durationPreSale()", +"d5364231": "forcedRedeem(address,uint256)", +"d536c3ae": "beginPhaseTwo(uint256)", +"d5370904": "getAvailableTokenCount()", +"d5375a5c": "getHigherInstance()", +"d537c3e3": "blockLockActive()", +"d537df3c": "claimTwitterIdIfNeededThenStealCardWithTwitterId(uint256,address,uint8,bytes32,bytes32,uint256)", +"d537e131": "calculateMatchPrice_(address[14],uint256[18],uint8[8],bytes,bytes,bytes,bytes,bytes,bytes)", +"d538359e": "Copeland()", +"d5387acb": "buy4(address[],address[],uint256[],bytes,bytes,bytes,bytes)", +"d539a014": "SSDTokenSwap()", +"d539a226": "assertEq10(bytes10,bytes10,bytes32)", +"d53a9b85": "tokensPerCents()", +"d53aaec2": "cPT()", +"d53abe1b": "stopRound(bool)", +"d53b2679": "activated_()", +"d53b4ab4": "communityAllocation()", +"d53b932a": "percentLeft()", +"d53bb6ac": "EthBita()", +"d53bc605": "testMultitransfer1()", +"d53beee4": "isOk(bytes1)", +"d53c61bf": "slasherAddress()", +"d53ca3c7": "setDiscountMember(address,address,string,bool)", +"d53ce956": "setOperationAddress(address)", +"d53dbe8e": "publishier()", +"d53e35db": "Garfield()", +"d53e963b": "buyCore(uint256,uint256)", +"d53f1cbd": "getBidFee(uint256)", +"d53f8208": "fundaria()", +"d541ca5d": "BONUS_PCT_IN_ICONIQ_SALE()", +"d5420df4": "drawToHand(uint256,uint32,uint256)", +"d5425571": "gasonBuffPercentage()", +"d5427123": "insertData(uint256,string)", +"d543f9d6": "setTeamPerfitAddress(address)", +"d544361e": "increaseShares(uint256,address)", +"d544e010": "removeAuthority(address)", +"d5456bc6": "lastBlock_a14Hash_uint256()", +"d545782e": "updateTokenRate(address,uint256,uint256)", +"d545ee2d": "CustomToken(string,string)", +"d54604ae": "min_fundingGoal()", +"d54656d5": "startTrade(address,address,uint256,uint256,uint256)", +"d546c975": "getCharacterServer(uint256)", +"d5472a5e": "userRewardAccountBalance(address,address)", +"d5472fcb": "removeWhiteLister(address,address)", +"d5477d37": "getColdWalletAddress()", +"d54839bf": "FEE_DEV()", +"d54a6bfb": "setHmcAddress(address)", +"d54ac04d": "get_master(bytes32)", +"d54ad2a1": "totalClaimed()", +"d54ad593": "getgamecardintro(uint256)", +"d54b02ec": "weiToCollectByInvestor(address)", +"d54b066f": "calcAmount(uint256)", +"d54c03a9": "NOORToken()", +"d54c2a63": "improveCard(uint256,uint256,uint256)", +"d54c4726": "usageCost()", +"d54c7099": "TVContract()", +"d54c7b4f": "_triggerCooldown(uint256)", +"d54c8c87": "emitApprove(address,address,bytes32,uint256)", +"d54ced9c": "canContributeAmount(address,uint256)", +"d54cefc1": "transferTokens(address,address[],uint256[])", +"d54dc5eb": "REGISTRATION_COST()", +"d54dd8f9": "slice4(bytes,uint256)", +"d54e583a": "transferFrom(address,address,uint256[],uint256[])", +"d54f4dd6": "TestVeryCoin3()", +"d550172a": "verifySig(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address,bytes,address,address)", +"d5503d5f": "payBalance()", +"d550668d": "setContract(bytes32,uint256,address,address)", +"d550f044": "setAllowLocalBuy(bool)", +"d55108be": "JOLDEAME()", +"d5518feb": "RequestCollectInterface(address)", +"d551f601": "_auth_mode()", +"d552844b": "signTrueloveByCOO(bytes32,string,string)", +"d55321db": "newGame(address,string,string,uint256,uint256,uint8,uint8,uint8,uint256)", +"d5537c0d": "setUsersCap(uint256)", +"d553adf0": "frozenFunds(address)", +"d5544f94": "getFundsAndAvailable(address)", +"d5547587": "ReviewToken(uint256,string,uint8,string,address)", +"d554ba86": "round_b_begin_date()", +"d554f8b4": "changeDeDeStorageAddress(address)", +"d5551518": "CapitalMiningToken(string,uint8,string,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"d5556544": "offset()", +"d5562901": "getFeeSchedule()", +"d5563f31": "createAuction(uint256)", +"d556c8f5": "getHashID(address,bytes32)", +"d5572bd6": "closeCrowd()", +"d5582205": "getCertifiedStudentAtIndex(uint256)", +"d5582965": "stopMint()", +"d55a772d": "getCurrentOwner(string)", +"d55ac94c": "WhiteBullsToken()", +"d55b7703": "privateIcoCap()", +"d55b9eb1": "XIAOMI()", +"d55b9f4d": "DISCOUNT_PRIVATE_PRESALE()", +"d55bc06a": "LDEX()", +"d55bdc5f": "getCampaignPriceById(bytes32)", +"d55c4af8": "_p3dSellPercentage(uint256)", +"d55c980f": "submitEntry(bytes,string)", +"d55c9c84": "confirmWinner()", +"d55cc3e2": "JSONpath_raw(string,string)", +"d55d1fed": "EGGS_TO_HATCH_1Dragon()", +"d55e62a0": "removeTrusted(address)", +"d55e725b": "initialFunds()", +"d55ec654": "wash_list(uint128)", +"d55ec697": "upgrade()", +"d55edcfd": "freezeChangesToVesting(address)", +"d55fe582": "isAssociated(address)", +"d560f696": "releaseRoto(address,bytes32)", +"d561be54": "createVestingContractWithConstantPercent(address,uint256,uint256,address,uint256)", +"d561ef2b": "setMinBuyableAmount(uint256)", +"d562a121": "calcTokens(uint256)", +"d562de0b": "investor_insert(address,uint256)", +"d562deef": "getAffiliateFee()", +"d5630f71": "AlpenCash()", +"d5635444": "getCoupon(string)", +"d5656ccf": "getWager()", +"d5666b5f": "versionBase(bytes32,bytes32,address)", +"d5667d8a": "updateUSDWEI(uint256)", +"d5668a92": "_checkTransactions(address)", +"d5670f59": "VisualChainToken()", +"d567c0e1": "cashBackWeight(address)", +"d5687efd": "WhitelistSetDay(address,uint8,uint256)", +"d5698726": "LogSetPicosPerEther(uint256)", +"d56a0a88": "bipedaljoe()", +"d56a4555": "setLink(uint256[2])", +"d56a62cf": "getPurchases(address,uint256)", +"d56a9314": "transfer_m(address,uint256,string)", +"d56b2889": "finish()", +"d56b7577": "BM_ICO()", +"d56b7746": "mintTokenCollection(string)", +"d56bd142": "getPayments()", +"d56cd796": "addNewCourse(int128,string,string,string,string)", +"d56d229d": "nftContract()", +"d56de6ed": "adminAllowance()", +"d56e3068": "getTotalDonated()", +"d56ea1b0": "pausePending()", +"d56efabf": "LockableToken()", +"d56f279f": "resignOwnMembership()", +"d5708d5a": "setMinAmount(address,uint256)", +"d571829e": "mintTokensToEralyInvestors()", +"d571a9a9": "Hawaii()", +"d571dbac": "getHeadInfo()", +"d571e645": "validStoreBuff()", +"d571edb0": "getExchangeGroupsLength()", +"d572056e": "testItem(bytes)", +"d5722518": "setUintsOwnerCount(address,address,uint256,bool)", +"d5723bf7": "finishGame(uint256,uint256)", +"d572fd99": "getPlayerCardsNumber()", +"d574bcdf": "reLoadXname(uint256,bytes32)", +"d575af74": "getSubscriptionServiceId(bytes32)", +"d575f332": "updateCampaign(address)", +"d5762230": "overStakeAgeBurn()", +"d5767fb6": "_emitCapabilityAdded(address,bytes4,uint8)", +"d576dc58": "TOKEN_SALE_LIMIT()", +"d5775f5c": "getCurrentSellPrice()", +"d5778d37": "preIcoTokens()", +"d5778efa": "STASHToken()", +"d5778f07": "transferAdvocatedTAOLogos(address,address,address)", +"d5779b7f": "imageUploadComplete(address[16],uint256)", +"d577ab70": "authorizeEscrowService(address)", +"d577d785": "setJPYC(address)", +"d57869d4": "findTrustedContract(address,address)", +"d578ec6c": "uploadData(bytes32[100])", +"d578f434": "BONUS_PCT_IN_VREO_SALE_PHASE_2()", +"d579f9e8": "changeBinary(uint256)", +"d579fd44": "approveNextOwner(address)", +"d57a0577": "TEAM_BONUS_PER_CENT()", +"d57a12f5": "testCheckSigs()", +"d57a9e4f": "LATER_AUCTIONS_INITIAL_PERCENTAGE()", +"d57ad588": "hashToSign_(bytes32)", +"d57b8932": "leaseBlock(uint256,uint256,uint256,bytes32,bytes32,bytes32,bytes32)", +"d57bde79": "highestBid()", +"d57c00de": "PayForServiceETH()", +"d57c1ea2": "addIssue(uint256)", +"d57c25f8": "UnderratedToken()", +"d57f62ff": "getPeriodLockedBalanceFor(uint256,address)", +"d5812ae1": "positionPrice()", +"d5813323": "traded(bytes32)", +"d583644b": "upgradeStrength(uint256)", +"d5838ca7": "addPublicKey(address)", +"d5847d33": "conversionRatesContract()", +"d585b852": "DAOToken()", +"d586bd4e": "donateP3D()", +"d586d2e4": "cancelRequest(uint256,uint256)", +"d586e30f": "calcNextReward()", +"d587dbf9": "change_specific_addy(address,uint256)", +"d588acc4": "claimMiningReward()", +"d588b892": "testCount(uint256)", +"d588d4d8": "hasHash(bytes10,uint8)", +"d5893bb2": "tradeEventEnabled()", +"d58b8282": "roundFiveTime()", +"d58b82bb": "getCampaignDailyPrice(address)", +"d58bf09a": "redeem(bytes32,address,bool[4])", +"d58c4b85": "siteAccount()", +"d58d1566": "subsidyHalvingInterval()", +"d58e1758": "totalConvertLotsByAddress(address)", +"d59070f8": "mintCopieExecutoire(bytes32)", +"d5909149": "CerberusNetwork()", +"d590bf49": "deleteCase(uint256)", +"d590df4a": "setFirstPeriodCap(uint256)", +"d591221f": "testTransfer()", +"d59138ef": "markReleased()", +"d59167f6": "claimComputation(bytes,bytes32)", +"d591d777": "finanVestingStages()", +"d592c243": "Issuance(address,uint256,uint256,uint256)", +"d592f5fd": "reserveFullMintAllowance()", +"d593c953": "revenueShareIdentifierList(address)", +"d5949bf3": "RegistroBlockchain()", +"d595c331": "burnSupply(uint256)", +"d5969f2b": "grantEnable()", +"d596c862": "toggleRedeemActive()", +"d59768a3": "updateAddress()", +"d597b634": "ETC()", +"d597b8c8": "getOffer(bytes32)", +"d597c6bb": "_generateSpaceship(uint16,address)", +"d598aef8": "TESTToken()", +"d598b2c5": "getTopCompanyStartBlock()", +"d598cae5": "ACTIVE_LOAN_CANCELED_BY_LENDER_STATUS()", +"d598d2ab": "Reward(address,address,uint256,string,uint256)", +"d598d4c9": "service()", +"d5992ef5": "isSuited(uint8,uint8)", +"d5996502": "TheMLMDemo()", +"d59aec08": "notesOf(address)", +"d59b5d4e": "getDocumentIdWithContentHash(string)", +"d59ba0df": "setDistributor(address,bool)", +"d59cf17f": "WeAPOWH()", +"d59e31ed": "totalETHSold()", +"d59e6461": "addRoot(bytes32)", +"d59f1844": "content_intro()", +"d59f1f3f": "proposalsByShareholder(address,uint256)", +"d59f2827": "isTokenOwner(uint256,address)", +"d59f37e0": "verifyCanRemoveOrderById(uint32)", +"d59f4e68": "setPaintingArtist(uint256,string)", +"d59f5c6e": "OmegaNode()", +"d59f9cc7": "getFullAddressList()", +"d59fde06": "CredoIco(address,uint256,uint256)", +"d5a056d8": "AddOrigin(address)", +"d5a18e4c": "setMany(address,uint256,uint256[],uint256[])", +"d5a2040e": "AKM()", +"d5a31956": "commissionArt(uint256,uint256)", +"d5a34dfb": "VPC0x()", +"d5a3b734": "dataSourceAddress()", +"d5a41695": "fetchVoteNumForCandidateBySnapshotBlock(address,uint256)", +"d5a4726b": "sumICO2()", +"d5a4a3c6": "findRecentBet(address)", +"d5a506d0": "regionExists(uint16)", +"d5a53dec": "ACTION_SELL_OFFER_ACCEPTED()", +"d5a5825d": "currentEtherBalance()", +"d5a632b5": "addPartnerSaleWallet(address)", +"d5a683c0": "addDividends(uint256)", +"d5a6c97a": "setWhitelistModerator(address,uint8)", +"d5a73fdd": "getVestedAmount(address)", +"d5a7b500": "softCapTriggered()", +"d5a81428": "sellPriceInWei()", +"d5a841f9": "setFaucetThresholdSecs(uint256)", +"d5a8487f": "getSquareWins(uint256,uint256)", +"d5a849e9": "getRewardBalance(address)", +"d5a8c0d9": "Ghcwchain(uint256,string,string)", +"d5a9f356": "testTemp3()", +"d5aa1a26": "getRouteSize()", +"d5aa1aca": "setmmVaultAddr(address)", +"d5aa7803": "isGuessesOpen()", +"d5aaadd1": "finishMintingRequestSetup()", +"d5ab20a7": "removeNFBTNY(address,uint256)", +"d5ab7f30": "crowdsaleSuccessful()", +"d5abaa27": "JoinTheFray(address)", +"d5abeb01": "maxSupply()", +"d5acdeb2": "allocateCorporateToken(address,uint256)", +"d5aceaac": "closeBattleboard(uint16)", +"d5ad2e00": "m_wcStored()", +"d5ad3ad0": "setServiceController(address)", +"d5ad3cda": "removeWalletsFromWhitelist(address[])", +"d5ae1085": "updateNextOrderPrice(address,address,uint256,uint256)", +"d5ae79ea": "processCollision()", +"d5af8f24": "createAndSellAllAmountBuyEth(address,address,address,uint256,address,uint256)", +"d5afd6bc": "startOperation()", +"d5b014f8": "MoonTrail()", +"d5b01c99": "existIdAtCurrentVersion(bytes32)", +"d5b0c0d5": "numberOf(bytes16)", +"d5b1402c": "ViralTokenSale()", +"d5b235d0": "test_claimShares_emptyRewardPool_isTranscoder()", +"d5b2a01a": "ownerFee()", +"d5b2c102": "sendCoin(bytes32,bytes32,uint256)", +"d5b36845": "stage3Bonus()", +"d5b36eeb": "TEHToken()", +"d5b3b317": "minutestotal()", +"d5b40406": "signUpForAirdrops()", +"d5b42496": "enableShowValue(bool)", +"d5b4ea20": "USDcRaised()", +"d5b5dc49": "companyReserve()", +"d5b61da0": "PRE_SALE_MIN_ETHER()", +"d5b74699": "library1function()", +"d5b85b2d": "setBAAU(bytes32,address,address,uint256)", +"d5b89bc8": "Issuance(address,uint256,uint256)", +"d5b8a884": "ASStokenICO(address)", +"d5b9df87": "LEADER_FEE()", +"d5ba4d21": "changeHold(address,uint256,uint8,uint256,bool)", +"d5ba5f82": "getBattleCard(address)", +"d5bab53d": "xtestTransferToken()", +"d5bb7f67": "updateFeatures(uint256)", +"d5bc0a07": "LYBTToken(uint256,string,uint8,string)", +"d5bcecab": "setLeagueRosterAndSaleAndTeamContractAddress(address,address,address)", +"d5bcf8ef": "setGameRunning(bool)", +"d5bd3443": "newOption(address,uint256,bool)", +"d5bd57a1": "getCardsDetails()", +"d5bde837": "registerPoA(string,bytes32,uint64[],uint64[],address,address,string,bytes2)", +"d5be4153": "buyAd(uint256)", +"d5bec84e": "weiPixelPrice()", +"d5bee9f5": "randomAddress()", +"d5bf158a": "affiliateName(address)", +"d5bf2dbe": "setFeeParameters(uint256,uint256,uint256,uint256)", +"d5bf4da1": "eTicket()", +"d5bf5fc3": "sendBountySupplyToken(address)", +"d5c06d30": "icoEnabled()", +"d5c0c185": "canChangeBeneficiaryParams()", +"d5c14391": "getAvailableAmount(uint256)", +"d5c166d5": "getExchgComisnMulByThousand()", +"d5c21c4f": "setMinAuditPrice(address,uint256)", +"d5c2d2b6": "TEAM_INCENTIVES_AMOUNT()", +"d5c2e3ca": "destroyContract(string)", +"d5c2ee21": "hasLanguage(address,uint256,uint256)", +"d5c34755": "LogAuthCreate(address,uint256)", +"d5c4098d": "enableRenounceOwnership()", +"d5c44898": "updateLastPrice(uint256)", +"d5c469f8": "isP2SH(bytes,uint256,uint256)", +"d5c53c44": "DETEX()", +"d5c5d8e1": "yetAnotherFunction()", +"d5c60c97": "ShowInfoBool(bool)", +"d5c61301": "say(string)", +"d5c61881": "enableWithdrawl()", +"d5c655c9": "lastTaskIndex()", +"d5c7aece": "CertAdminDeleted(address)", +"d5c7bcc8": "coinIssuedEtc()", +"d5c80423": "lockDeposit(bytes32,string)", +"d5c813dc": "sellerfee()", +"d5c96b36": "gettotalCardValue()", +"d5c9712f": "getBytesLE(bytes,uint256,uint256)", +"d5c98db1": "setPropertyOwner(uint16,address)", +"d5c999f8": "getBanque()", +"d5c9b239": "getAllShops()", +"d5c9c144": "SetGasFeeReimbursed(uint256)", +"d5ca35bc": "withdraw(address,uint256,uint256,address,uint8,bytes32,bytes32)", +"d5cb4a04": "getParticipantTransactions(address,address)", +"d5cc1d49": "upload(bytes32,bytes32,bytes32,bytes32)", +"d5cc8813": "startingPriceOf()", +"d5cce45a": "showbuyPrice()", +"d5cd3243": "addUser(bytes32,bytes32,uint256)", +"d5cdd2c7": "tokenToPoint(uint256,address,uint256)", +"d5ce3389": "from()", +"d5ce44c1": "totalEthReceivedinWei()", +"d5ce6719": "AC(uint256,string,string,address)", +"d5ce6a34": "LogAddressTokenCapCalculated(uint256,uint256,string)", +"d5ce91fd": "isRegistered(address,bool)", +"d5ceecea": "ERC777DemoToken(string,string,uint256,uint256)", +"d5cef133": "requestRefund()", +"d5cf5c72": "setSoftCap(uint256)", +"d5cfa94e": "claimAdmin(string)", +"d5cfad68": "getUserCertificationDetails(string)", +"d5cfc01b": "lockAddressByKYC(address,address)", +"d5cfee3e": "playerIsRegistered(address)", +"d5d067b0": "createRequestAsPayerAction(address[],int256[],address,uint256[],uint256[],string)", +"d5d09021": "isCrowdsaleFull()", +"d5d0da83": "KingsToken(uint256)", +"d5d1b95a": "convertRegularToRewardTokens(address,uint256)", +"d5d1e770": "confirmOwnership()", +"d5d21e18": "createTokenContract()", +"d5d2f528": "setTokenCounts(uint256,uint256)", +"d5d434c9": "SocialXBounty()", +"d5d4dfad": "balanceHistoryLength(address)", +"d5d55931": "ETXCrowdsale()", +"d5d55c8a": "PurchaseConfirmed()", +"d5d5913c": "getCCH_edit_2()", +"d5d5cefa": "cancelOptionOrder(address[3],uint256[3],uint256[2],bool)", +"d5d5f469": "getDocumentIdWithIPFSdirectoryHash(string)", +"d5d66031": "Wp()", +"d5d75cad": "_changeWallet(address)", +"d5d8a751": "Gallery_MuYi_No3()", +"d5da9e82": "teamLockTransferFrom(address,address,uint256)", +"d5db3fe2": "LogTrade(address,address,uint256,uint256,uint8,uint8,uint256,int256,uint256,int256)", +"d5db72eb": "isRegistrar(address)", +"d5db9366": "cancelCollateralTransfer(uint256)", +"d5db9410": "ChangeProtectionTime(uint256,uint128)", +"d5dbb1ad": "solveBet(address,uint8,bool,uint8,bytes32,bytes32)", +"d5dbe634": "incrementTotalSupply(uint256)", +"d5dc7139": "Scratch()", +"d5dcc638": "StrongHands()", +"d5dcf127": "setAge(uint256)", +"d5dd5127": "managerNotSetInApp()", +"d5de30e0": "evMgmtInvestProject(address,uint256,address,uint256,bool)", +"d5de78bc": "getGrantBalanceOf(address)", +"d5df7559": "removeDocument(uint256)", +"d5df7bcc": "newFootballMatch(uint256)", +"d5e03fc6": "payoutParty()", +"d5e05c89": "isSpaceshipUpgradeAllowed(bytes5,uint16,uint8)", +"d5e0b616": "getAnyElementByIndex(uint256)", +"d5e0d8fc": "setCompositionPrice(uint256,uint256)", +"d5e0e131": "totalAdvisorsSupply()", +"d5e16567": "getAccountValues()", +"d5e38f60": "lpFeeBp()", +"d5e3fbb2": "payfee()", +"d5e45a83": "positionFrom(address,address,uint256)", +"d5e4a36e": "isPreSaleRunning()", +"d5e4b342": "trexdevshopWaited1Years()", +"d5e5e6e6": "preciseUnit()", +"d5e83d9c": "RisikoCoin()", +"d5e99dac": "rateLoss()", +"d5e9abfd": "mustKyc(address)", +"d5e9eb9c": "IPM()", +"d5ea36f9": "offMaintenance()", +"d5eb0cbf": "isContractPermanent(string)", +"d5ec40af": "buyToken(uint32,uint32,address)", +"d5ec7e1d": "left22(uint256)", +"d5ec8d82": "_estIntegerSqrt(uint64,uint64,int256)", +"d5ecc1bd": "papu()", +"d5ecf7c5": "getNumExcessTokens(uint256)", +"d5ed289d": "getClaimRate(uint256)", +"d5ed9cba": "setLandRegistry(address)", +"d5edca54": "Games(uint256,uint256)", +"d5ee739d": "tokenRateWei()", +"d5f0400e": "validClaim(bytes32,string,string,address,bytes32,bytes32,uint8)", +"d5f07396": "checkIfReferee(address)", +"d5f12812": "setSpend(address,uint256)", +"d5f17df2": "selectFight2DeathContract()", +"d5f1e8d8": "hardCapEther()", +"d5f222ee": "tally(address)", +"d5f24708": "gotake()", +"d5f37f95": "sign(uint256,uint256,address)", +"d5f39488": "deployer()", +"d5f404c7": "update_power()", +"d5f47a51": "Ethraffle_v3b()", +"d5f48e76": "cancelSynthesizingAuction(uint256)", +"d5f4f0b3": "addTokens()", +"d5f52d51": "withDrawMyBalance()", +"d5f5b788": "maxCapUSD()", +"d5f5df2a": "checkFiscal(bytes32)", +"d5f6b538": "getClaimsCountForStory(bytes12)", +"d5f72b2e": "addMany(address,uint256,uint256[],uint256[])", +"d5f7b144": "_burnToken(address,uint256)", +"d5f827e2": "TBrate()", +"d5f868b7": "removeReverseRate(address)", +"d5f87242": "assertInvalidState()", +"d5f9ac43": "transferFromTangibleAssetfund(address,uint256)", +"d5f9bdf1": "TokenCreated(address,address)", +"d5f9e6c7": "ProjectName()", +"d5fa2b00": "setAddr(bytes32,address)", +"d5fa2da5": "newEscrow(uint256)", +"d5fb1a1c": "ByteLockerShares()", +"d5fbe080": "_getEnd(int256)", +"d5fcc7b6": "setPresale(address)", +"d5fd5351": "WithdrawAddressApproved(address,address,bool)", +"d5fdb334": "getOpenGameIds()", +"d5fdfdbc": "setResult(string,string,string)", +"d5fe6062": "claimTusdProxyOwnership()", +"d5fec406": "abdicate(uint64,address)", +"d5ff0e7b": "transferToContract(address,address,uint256,bytes)", +"d5ff38ae": "migrateBasicData(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"d5ff56f8": "allowChange()", +"d600630c": "registerInstitution(string,address,address)", +"d6006e88": "send(address[],uint256[],uint256)", +"d6006e8e": "preSaleSuccess(address,uint256,uint256,uint256)", +"d600c846": "JingzhiContract()", +"d60207c7": "getLowestUnitPriceIdxFromBuy()", +"d6026ac1": "getPRewardedSumByRound(uint256,address)", +"d6030d57": "BOUNTY_CAMPAIGN_SHARE()", +"d6039a41": "totalsigs()", +"d603f872": "buyPreICO()", +"d603fd28": "sendToAddressWithTime(address,uint256,uint256)", +"d6046836": "setAllowBuy(bool)", +"d604d6a8": "getSkillRating(address,uint256,uint256,uint256,uint256)", +"d604d8d1": "checkHash(bytes32)", +"d605787b": "rng()", +"d6063225": "Ktx(uint256,string,uint8,string)", +"d606f34b": "century(address)", +"d60743b1": "read_total_number_of_user_purchases(address)", +"d6077912": "RRRToken()", +"d608b3b2": "totalCharity()", +"d609ea93": "stakingEpochDuration()", +"d609fe59": "OEO(uint256,string,string)", +"d60bf518": "Test3(address)", +"d60d7044": "_char(bytes1)", +"d60dcb5d": "Switch()", +"d60df5be": "xmr()", +"d60e1447": "supplyBezNolei()", +"d60f0e5a": "BonusWhiteList(address,address,uint256,uint256)", +"d60f2eae": "buyPBTTAgainstEther()", +"d60f6cd9": "sendNumber(uint16,address,address)", +"d60fa784": "Voicecoin()", +"d60fd1be": "Hopecoin()", +"d6103b26": "_newPepe(uint256[2],uint64,uint64,uint64,address)", +"d6106696": "withdrawal_last_voter()", +"d6106b3e": "buys(uint256)", +"d611225b": "addContract(string)", +"d61191bd": "distributeValidityBond()", +"d612be77": "dpToken()", +"d612cff5": "permissionHash(address,address,bytes32)", +"d613ac91": "buybackTypeOne()", +"d613be0a": "forceChangeContractOwnership(address)", +"d6142c5b": "createProvider(bool,string,string,string,string,uint8,bool,address)", +"d615950d": "mintUpdateToken(uint256)", +"d61647f2": "developer_string_golos(string)", +"d616fe6e": "setTxAboveLimits(address,uint256,bytes32)", +"d617ad7d": "getPatentFee(address,uint16[5])", +"d618996b": "orderEnd()", +"d6192c6c": "hodlerStakes(address)", +"d619d216": "retrieveEth()", +"d619f6b3": "sendIndividualAmount(address[],uint256[])", +"d61a4524": "setdissolveaddress(address)", +"d61bd8fb": "getAvlShares(bool)", +"d61ca7eb": "RYH()", +"d61ccf84": "RABAToken()", +"d61e7201": "updateStatus(uint256)", +"d61e9274": "SetRate(uint32)", +"d61f92a3": "getJoinAddr(uint256)", +"d61fb0bf": "dateIT()", +"d620c7c8": "LogNewContractProposal(address,address,address,uint256)", +"d620caaa": "walletFromTeam()", +"d621a4f2": "setWithdrawBankFee(uint256)", +"d621b83f": "_createKydy(uint256,uint256,uint256,uint256,address)", +"d621c878": "improvementContract()", +"d621e813": "tradeEnabled()", +"d6223305": "ReleaseableToken(uint256,uint256,address)", +"d6224a6b": "getPixelText(uint256)", +"d6233491": "getPaid(string,address)", +"d6236ad0": "MetisCoin()", +"d62457f6": "callValue()", +"d624fdb6": "approveUser(address)", +"d625a7a6": "BetAdded(uint256,address,uint256,uint256,uint256)", +"d625c654": "migrateLosingTokenRepToWinningToken()", +"d6264b75": "transferBack(uint256,address)", +"d626db79": "setPublicWhitelistAbility(bool)", +"d6271727": "processUpgrade(address,uint256)", +"d628e0a6": "WatchBalance()", +"d628ecd7": "multiValueAirDrop(address[],uint256[])", +"d6291f6f": "VitalKey()", +"d629bc12": "iNf4mation()", +"d62a13ac": "ExhaustionCoin()", +"d62a7127": "getlastid()", +"d62ac58c": "AdvisorsPartners()", +"d62b255b": "setOwner(address,string)", +"d62b6f7e": "Main()", +"d62c6523": "cancelReservedTokens(address,uint256)", +"d62d3115": "testCreate()", +"d62f0f22": "getMyRice()", +"d62f146b": "updateSkill(uint256,uint256,uint16)", +"d6300201": "getPercent(address)", +"d630bd53": "pledgeApprove(uint256)", +"d630d100": "releaseAdmPercent()", +"d630efbc": "getAllTotalPrize()", +"d63124d7": "checkMidiNotesValue(uint8[])", +"d631eed7": "withdrawEthForUser(uint256)", +"d631f6d4": "DeleteProject(string)", +"d63241a6": "EtherCheque()", +"d63249ee": "_placeBet(uint256,address,bytes)", +"d632f639": "_privateSale()", +"d632fd1d": "PIP()", +"d6349dd6": "referralDividendsOf(address)", +"d634ba22": "baseNumber()", +"d6351433": "getRichToken(uint256)", +"d635357e": "TestContract(int256,string)", +"d63547e6": "GetFreeCnt()", +"d63581de": "setPricePoints(uint64[])", +"d63587a2": "randomNum(uint256)", +"d635b69f": "preValidatePurchase(uint256)", +"d635fc63": "getReveralSupply()", +"d6362e97": "getMin()", +"d6370149": "_errorAndRefund(string,uint256,uint8)", +"d6380f37": "complete(uint256,uint256)", +"d6387a3e": "getMinersAt(uint32,uint32)", +"d638d981": "SingularityTest24()", +"d63900d5": "getTileLocation(uint16,uint16,address,address)", +"d6391a01": "Total_TokenSupply()", +"d639bf80": "Bitstocksmarket()", +"d63a1389": "mintFeeFlat()", +"d63a6ccd": "usd()", +"d63a8e11": "allowed(address)", +"d63bed4c": "_setPermissionManager(address,address,bytes32)", +"d63d4af0": "getOwnerTokens(address)", +"d63e6ce7": "increasePeriod()", +"d63e7cc1": "priceICO()", +"d63ebe92": "StepVesting(address,uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"d63eea42": "MAX_NUMBER_BETTERS()", +"d63fe1c7": "TARGET_TOTAL_SUPPLY()", +"d64196f8": "minInvestedLimit()", +"d641f3e4": "playGame(uint256,uint256,uint256,bytes32)", +"d64232c0": "option10name()", +"d6424ea7": "calculateAmount(string,uint64)", +"d6427c24": "randomPlayer()", +"d6449e15": "cancelTXwithCode(bytes32)", +"d644af34": "withdrawAndSend()", +"d644c46f": "wuxiaMasterPrice()", +"d644e356": "index(uint256,address,uint256,uint256)", +"d645ddf6": "mint(string,string,string)", +"d64637c7": "distributeDivident(uint256)", +"d6464b7c": "getSellerOfToken(uint256)", +"d6475c3a": "returnTokensForDay(uint256,uint256)", +"d647bb22": "Customcoin()", +"d647e2da": "test_set_get_RiskParameters()", +"d6481502": "setFreezingPercentage(uint8)", +"d648a647": "fundingStartBlock()", +"d648d7fd": "post(address,uint256)", +"d6495676": "emitPaymentReleased(uint256)", +"d64b12cf": "MAX_UNICORNS_TO_GIFT()", +"d64bcc1a": "releaseIcoTokens()", +"d64c2018": "setNextImagePart(uint256,uint16,uint16,uint16,uint256[])", +"d64c34fc": "getLockAmount()", +"d64d136d": "wnFromGas(uint256)", +"d64d6968": "isReferrer(address)", +"d64dc79f": "bidDkl(uint256,uint256,uint256,bytes,uint256)", +"d64e4e1b": "PKTToken()", +"d64ee8d2": "unBlockContract()", +"d64f5135": "In(address)", +"d64f86c0": "nextTransferFeeProp(uint256)", +"d64fe5ea": "getLockedWalletReleased(address)", +"d650cb2e": "forgiveMe()", +"d652818d": "ZYMToken()", +"d6528231": "FACTOR_3()", +"d6545ede": "hbtoken()", +"d6555687": "migrateUserData()", +"d655c786": "cancelOrderInternal(uint80,bool,bool)", +"d656a794": "stopForce()", +"d657ae0c": "actualTotalSupply()", +"d6582d0d": "isWeekDay(uint256)", +"d658d2e9": "hashes(bytes32)", +"d658d3ed": "setLedgerValue(string,address,address,uint256)", +"d65995ed": "attemptBeginLoanAtIndex(uint256)", +"d659afb6": "_isCooldownReady(address)", +"d659d968": "is_open()", +"d65a16c0": "isOneToken()", +"d65a4184": "tokenSaleActive()", +"d65aabc1": "t_Slava2()", +"d65ab5f2": "startGame()", +"d65b476c": "Governable()", +"d65b48fd": "ReceivedTokens(address,uint256,address,bytes)", +"d65c0035": "removeAddressFromWhitelist(uint256,address)", +"d65c8c6c": "claimDiamond(uint64,uint64)", +"d65d8876": "SitOut(address,uint256,uint256,uint256,uint256)", +"d65f86f2": "setLeed(string)", +"d6604881": "whitelistBonusLockPeriod()", +"d660521c": "depositStake(uint256,bytes)", +"d660c897": "theRichest()", +"d660ea36": "lastBlock_v1()", +"d661952a": "removePrivilegeAddress(address)", +"d6619ffb": "funds_address()", +"d661d206": "INITIAL_FOUNDER_SUPPLY()", +"d661dd31": "MULTIPLIER_DIVISOR()", +"d661f244": "getRoomName()", +"d6636307": "stateSetOver()", +"d66495cd": "getSpaceshipProductTotalSoldByModel(uint16)", +"d6649861": "tokenTransfertoACC(address,uint256)", +"d664cd89": "askMembership()", +"d6661999": "securityTokenOffering(address,uint256,uint256)", +"d6664653": "landmarkToOwner(uint256)", +"d667dcd7": "houseEdge()", +"d6680a69": "getAllIntel()", +"d6682007": "getGameNumSides(uint256)", +"d66847df": "distributeARTToken()", +"d668a461": "escapeHatch(bool)", +"d668e654": "LogTokenReceiver(address,uint256)", +"d669133f": "PotSplit(uint256)", +"d669899c": "sendLudumToSingle(address[],uint256)", +"d6699f48": "addPolicy(uint8,uint256,uint8)", +"d669e1d4": "MAX_CAP()", +"d66b0b51": "komission()", +"d66b2207": "escrowTransferInfo(address,uint256)", +"d66bd524": "reserves(address)", +"d66c7faa": "ICO_PHASE3_LIMIT()", +"d66c9cc2": "transferSenderPaysFee(address,uint256)", +"d66cac2b": "invest(uint32,uint32,uint64,uint16)", +"d66cb9e1": "renewbeginnerprotection(uint256)", +"d66d9e19": "leave()", +"d66e5726": "getWriter()", +"d66f146d": "refundPoll()", +"d66f3afa": "addEmployee(address,string,uint256[3],uint256)", +"d66fd10d": "LogVote(address)", +"d6714924": "calculateBoardScore(uint256)", +"d6721000": "addCommissionToPendingWithdrawals(uint32)", +"d6728d51": "developer_EKN()", +"d673c93b": "split(address,uint256,uint256,uint256)", +"d6740de5": "mint_for_testing()", +"d674d6a1": "RimuoviNegoziante(address)", +"d6755434": "remainingCapInWei()", +"d6757f39": "_existPlatform(bytes32)", +"d675ecbd": "addPrivateInvestor(address,uint256)", +"d67601ac": "starsRemainingToAssign()", +"d67772d3": "PennyEther()", +"d6779b01": "winningsClaimable(address)", +"d6779d6f": "isWarrantyValid(string)", +"d678724f": "getGameNumberOfEntries(uint256)", +"d6787711": "betHash()", +"d678ba48": "depositLRC()", +"d679677a": "currentTier()", +"d6798645": "set_cooldown(uint256)", +"d679c4f2": "claimDividendPercentage()", +"d67a073f": "Drain()", +"d67a10e3": "etherDelta()", +"d67a1140": "getMultiBalances(address)", +"d67a12d4": "getStrategyHiddenState(bytes32)", +"d67a1694": "getBountyChance(uint256)", +"d67a7e5f": "updateSignedDealsCountInBulk(address[],uint256[])", +"d67ae54d": "EUR(uint256)", +"d67b534e": "socialIdentityToCardId(uint256,uint256)", +"d67b9a89": "ONLY600Coin()", +"d67bf1ad": "coinBurnMkt()", +"d67bf379": "getByUser(address)", +"d67c1a7a": "finishCrowdSale()", +"d67c4497": "_approveTransfer(uint256,address,address)", +"d67c7f35": "p_update_mResaleMultipler(uint256)", +"d67c9961": "pass(uint256)", +"d67cbec9": "release(uint32,uint32,uint32,bytes20)", +"d67d0bb9": "tokenCreationMaxCap()", +"d67d3af8": "cancelRequest(address,address)", +"d67d73e0": "removeAllowedContract(address,address)", +"d67d78cd": "addCard(uint32,uint32,uint32,uint32,uint32,uint256)", +"d67f4d1b": "TittyFarmer()", +"d67fd89e": "setout(bool)", +"d6805f49": "novaTransfer(address,uint256)", +"d680914d": "SLABToken()", +"d6816cc1": "fixSpecications(uint256,bool)", +"d68199dc": "gameStats()", +"d681ffa7": "getDefinition(uint256)", +"d6820709": "beginTimeTS()", +"d6823455": "minQuanValues()", +"d682b601": "auditContract(address,bytes32,bytes,bool)", +"d6830af3": "setSettingTAOId(address)", +"d68314ea": "setReserveWeight(uint32)", +"d68352d2": "BeatTokenIcoPhase1Started()", +"d683d1a2": "markRedemptionFulfilled(bytes32)", +"d6847cd8": "getWithdrawalCoolingPeriod()", +"d68526c8": "withdrawGemmyMusic(address,uint256)", +"d68561a3": "_isOwnerOf(address,address,uint256)", +"d6858850": "AlphabetConvert(address)", +"d6872352": "sendEtherManually(address,address,uint256,uint256)", +"d6875520": "reclaimUnwantedGift()", +"d687a9b3": "_deleteAddress(bytes32)", +"d687b57e": "interSend(address,uint256)", +"d689cfe1": "_setClientPaidUpTo(address,uint256)", +"d68a9fb8": "getFreeTokensAmountOfUser(address)", +"d68c967f": "addAddressToBackEnd(address)", +"d68d961a": "ROLE_MINT()", +"d68e0ff7": "DestroyCoin(address,uint256)", +"d68e462c": "withhold(address,uint256)", +"d68e9b1e": "createGen0Token(uint8)", +"d68f30a7": "recordMoment(address,uint256,uint256)", +"d68f65f8": "SHAToken(uint256,string,string)", +"d68f6aac": "salers(uint256)", +"d68f93df": "changeBonuses(uint256[],uint256[])", +"d68fac6d": "knuckReward()", +"d68fbe5c": "testCannotGetTokensInNotInitiatedSale()", +"d6906295": "withdrawCloneTokens(address)", +"d691092a": "predictExploreReward(uint256)", +"d6914217": "getServerUserIndex(address,uint256)", +"d6916c34": "airDrop(address,uint256[],address[])", +"d6938c18": "StagebleCrowdsale()", +"d693dca2": "setAllowCnsContract(address,bytes32,address,bytes32,bool)", +"d693e17f": "internalSend(uint8,address,uint256)", +"d6940c8c": "_RemovedFromGeneration(address,uint256)", +"d69450d5": "setUUID4Bytes(bytes)", +"d6948c47": "winningTeamId()", +"d69570e2": "durationOfState(uint256)", +"d6960697": "confirmPurchase()", +"d6965ff7": "shops()", +"d696888a": "EpietherCrowdsale()", +"d697a9f1": "CooCoinToken(uint256,string,string)", +"d69932a3": "getLpBidPrice()", +"d699c00e": "transferWeiToWallet(uint256)", +"d699fe3d": "setPhase(uint256,uint256,uint256,uint256)", +"d69a0d2f": "getMostExpensiveCryptoGamer()", +"d69a1a5f": "getNextPayoutEstimation()", +"d69b6cf4": "IdolToken()", +"d69c3d30": "nextNonce()", +"d69c9275": "extraDistributionPart()", +"d69d895e": "NUM_RESERVED_COIN()", +"d69dbf63": "getIssuanceBlockTimestamp(bytes32)", +"d69dc9a5": "balance_(address)", +"d69dd156": "setInt256(int256,int256)", +"d69e37da": "doCall(address)", +"d69f13bb": "reportBenign(address,uint256)", +"d6a02bc2": "getSignedSubscribers()", +"d6a039f0": "Qbase()", +"d6a0810f": "ContractPurchased()", +"d6a0dec5": "buyTicketByOther(uint256,bytes32,bytes32,bytes32,bytes32)", +"d6a15231": "getIcedInfos(address)", +"d6a1f6a7": "breakIdUniqueness(uint256,uint256,address)", +"d6a2a596": "CrowdSale(address,uint256,uint256)", +"d6a30fb4": "start_quiz_quest(string,string)", +"d6a39db0": "lockUp(bool)", +"d6a3b623": "HONORABLE_LOSS_BONUS()", +"d6a3bc16": "finalReserveWallet()", +"d6a3f374": "dividendRate()", +"d6a43a3e": "setPermissionById(uint8,bytes32,bool)", +"d6a45623": "setAuctionsEnabled(bool)", +"d6a527eb": "share1()", +"d6a55e10": "sub_arbits(address,address,uint256)", +"d6a595ac": "payto2()", +"d6a5e546": "emergencyRefundContract()", +"d6a619e3": "transferIfPuritanical(address)", +"d6a62445": "confirmReturnToken(bytes32,string,bytes32,bytes32,uint256,uint256,uint256,uint256,uint256)", +"d6a6a520": "undoUpgrade()", +"d6a6da3e": "angelInvestorsTokens()", +"d6a75d82": "winningsClaimable()", +"d6a78004": "burnRemaining()", +"d6a83613": "bytes20ToString(bytes20,bytes20)", +"d6a90bcf": "tokenMultisigWallet()", +"d6a9c807": "_createDog(uint256,uint256,uint256,uint256,address,uint8,uint256,bool)", +"d6a9de51": "getSeller(uint256)", +"d6a9e9d1": "teamPercentage()", +"d6aab015": "getBonusPool()", +"d6abe110": "tokenDetails()", +"d6ac2394": "payoutInvestor(uint256)", +"d6ad00a9": "DOJC()", +"d6ad5e5e": "MIN_ACCEPTED_VALUE()", +"d6ae5f29": "getUsedReserveSupply()", +"d6aefb61": "setBatchTransfer(address,address,bool)", +"d6af9411": "Rouleth()", +"d6afc9b1": "getProfile()", +"d6b0f363": "OpusToken(address)", +"d6b0f484": "disableWhitelist()", +"d6b1deac": "KTOCrowdsale()", +"d6b1e4a9": "buyMinersWithEther(uint64)", +"d6b224f2": "getNextActiveBuyDetails(bytes32,uint64)", +"d6b2b242": "Realize(uint256)", +"d6b2e2ba": "PARSEC_CREDITS_PER_ETHER()", +"d6b33f59": "getNextActiveSellDetails(bytes32,uint64)", +"d6b44859": "scheduleUndoIt(uint256)", +"d6b4ec12": "getDailyWithdrawalLimit()", +"d6b52d9a": "partnerETHRewardsPercent()", +"d6b53175": "UpdatePoolState(uint8)", +"d6b5983d": "checkAmount(address,uint256)", +"d6b5abc9": "weiToPonzi(uint256,uint256)", +"d6b645bc": "react(address)", +"d6b6f9f1": "secondXRChangeBlock()", +"d6b74865": "watcher()", +"d6b7c81d": "BountyIssued(address,uint256)", +"d6b867e6": "exchange(uint256,address,uint256)", +"d6b8746d": "getConversionManager()", +"d6b8ae26": "jexp(uint256,uint256,uint256)", +"d6b8ec66": "presaleEth()", +"d6b92187": "_syncLockedDepositsAmount(bytes32)", +"d6b93d43": "fillBuy(address[8],uint256[6],uint8,bytes32,bytes32)", +"d6b94aba": "TTT(string,string,uint8,uint256)", +"d6bacb0e": "getTxRoot(bytes32)", +"d6bafa0c": "ECommercePaymentSystem()", +"d6bb0ad5": "CrowdsaleGummy(address,address)", +"d6bb358e": "LuckyBaby()", +"d6bb9eff": "getMartialCardTypeIdList(uint256)", +"d6bc1b39": "setPrices(bool,uint256)", +"d6bc1e57": "fromWei(address,address,uint256)", +"d6bd603c": "getBalance(address,address,address)", +"d6bd64fc": "test_get_expired()", +"d6bd8727": "getUrl()", +"d6be178d": "rateStage2()", +"d6be6bd5": "birth(bytes32)", +"d6bea5fd": "rangeToProposalID(uint256)", +"d6bec803": "setExpiredAndWithdraw(address)", +"d6beebf7": "buyTokens_ETH(address,uint256,uint256,bytes8)", +"d6bf28e4": "_sendMonsterPrize(uint256,address)", +"d6bf7530": "getEthDepositAddress()", +"d6bfc2d4": "oykooshi()", +"d6c0ceab": "changeBountyDeadline(uint256,uint256)", +"d6c12f88": "pricingPlan()", +"d6c1869b": "s33(bytes1)", +"d6c19fe0": "build(bytes,uint256,uint256,address)", +"d6c1be92": "gameEarnings()", +"d6c242d6": "approveViewer(uint256,address)", +"d6c2479a": "donationsAddress()", +"d6c3453c": "addTrancheRateAndTokens(uint256,uint256,uint256)", +"d6c54bf7": "destroyTokens(address,address,uint256)", +"d6c5a41e": "tier3End()", +"d6c5d823": "getScientificData(uint256)", +"d6c6f48e": "mintAgents()", +"d6c75abf": "RiskPrices(address[],uint128[])", +"d6c7b4ad": "receiver1()", +"d6c7b65b": "addInfo(address,address,uint256,string)", +"d6c8976b": "changeTokenController(address)", +"d6c8f93c": "getCooldownIndex(uint256)", +"d6c9d27a": "addCountry(uint256,uint256)", +"d6ca8ccb": "disown(bytes20)", +"d6cb56e6": "FishCoin()", +"d6cb9ec2": "viewContractState()", +"d6ccb332": "FED(uint256,string,uint8,string)", +"d6ccf7a7": "addTokenTime(uint256,uint256)", +"d6cd4a02": "listAgents()", +"d6cd9473": "renounceWhitelisted()", +"d6cf18e7": "createPiranhaTokens()", +"d6cf5297": "oracleItSetNetwork()", +"d6cfece1": "preBonus()", +"d6d02c51": "whois(string)", +"d6d0be9f": "getProductData(uint256)", +"d6d13ac0": "Split(bytes32,uint8)", +"d6d14171": "initialTimestamp()", +"d6d1b8bb": "TCLRToken()", +"d6d1f369": "Test4(uint256)", +"d6d1fc2a": "SoSoCoin()", +"d6d21dfd": "who()", +"d6d22fa4": "MetaCoin()", +"d6d25008": "coldStoreLast()", +"d6d30a51": "increaseJackpot(uint256)", +"d6d3286c": "geProposalInfo(uint256)", +"d6d329b9": "ships(uint64)", +"d6d34c7c": "coOwner()", +"d6d3e19c": "DigitalKeyCoinKO()", +"d6d4136a": "checkPos()", +"d6d5c8d5": "DEFROST_MONTHS()", +"d6d65f3d": "getCurrentMilestoneIndex()", +"d6d6945e": "doPurchase(address,uint256,uint256)", +"d6d707a6": "BaseStoreToken()", +"d6d76ed5": "status(address,bytes32)", +"d6d76fb7": "ArtCertificate(address,bytes32,string,string,string,string,string,address)", +"d6d7d525": "get(bytes)", +"d6d80f0b": "withdrawal_party_a_gets()", +"d6d86646": "UpdatePolicyState(address,string,string,uint8)", +"d6d902c4": "claimThroneFor(bytes,address)", +"d6d9266a": "setNewUseIndex()", +"d6d98ffc": "CosmicExperiencePoints()", +"d6da0805": "registerName(bytes32)", +"d6dad4cb": "BCFLeague(address,uint256,uint256,uint256,uint256)", +"d6db71e9": "allowRefund(address)", +"d6db85af": "fracExp(uint256,uint256,uint256,uint256)", +"d6db8ab6": "dividendPayouts(uint256)", +"d6dbf1c2": "getPOOL_edit_9()", +"d6dd1f0f": "ConnectLeaf(uint256,uint256)", +"d6dda33d": "isPremine()", +"d6ddbd2d": "purchaseAdv(uint256,uint256,string,string)", +"d6ddd21b": "vestingStartTimestamp()", +"d6de8dc4": "getPlayBlockNumber()", +"d6dfb77a": "getIndexToken(uint256,uint256)", +"d6e0bf29": "OwnerDeposit()", +"d6e0d73c": "mintA()", +"d6e20a56": "confirmKYC(address)", +"d6e2bcb5": "SwordMaster()", +"d6e325ae": "joinClub()", +"d6e38114": "addBet(address)", +"d6e3bb94": "addAudit(address,address)", +"d6e3dd77": "balancesImporter3()", +"d6e4ddc5": "ownerOf(address[16],uint256)", +"d6e5fe98": "setStakeRequirements(uint128,uint128)", +"d6e67215": "newCajutel()", +"d6e78eb0": "setGasMin(uint256)", +"d6e871ff": "loser(address,uint256)", +"d6e898ad": "vest2team(address,address)", +"d6e89cf0": "setTransferStatus(uint256)", +"d6e8a0b0": "incrementBid(uint256)", +"d6e95f77": "isSellable()", +"d6e9b019": "getDisputeData()", +"d6ea53b1": "changePayer(address)", +"d6ea5a0e": "distributionEntryCount()", +"d6ea8c90": "decimalOddsForOutcome(uint8)", +"d6eab9f2": "setHostFee(uint256)", +"d6eac4cd": "initTokenGrants()", +"d6eafd08": "scheduleCall(address,bytes,bytes,uint8,uint256[4])", +"d6eb1bbf": "authorised(address)", +"d6eb748c": "setRelation(address,address)", +"d6ec0065": "CHN()", +"d6ecb38a": "firstAddressFromDeployer(address)", +"d6ecff50": "Identified()", +"d6ed8f52": "addAirdropList(address,uint256)", +"d6edb047": "addAllocationPartOne(uint256,uint256)", +"d6ef25d5": "addVersion(uint64[3],address,bytes)", +"d6ef3de2": "Stocks()", +"d6ef7af0": "withdrawRewards(address,uint256)", +"d6efb030": "sendEthToContract(address)", +"d6efc8eb": "marketBuyOrders(uint256,bytes[])", +"d6effa2b": "ICOwei()", +"d6f0b484": "serverEndGame(uint32,uint8,uint16,uint256,int256,bytes32,bytes32,uint256,address,address,bytes)", +"d6f12a6a": "refundT4T()", +"d6f15469": "setBuyEnabled(bool)", +"d6f22e69": "getChecksumPairCount()", +"d6f327cc": "swapCardForReward(address,uint8)", +"d6f35eb4": "setMinAmountSale(uint256)", +"d6f3c45f": "tokenCrowdsaleCap()", +"d6f42038": "PhoneToAddress()", +"d6f4472d": "BTCS_PORTION_MAX()", +"d6f4c235": "setInstructor(string,uint256,string)", +"d6f4e56e": "allTokensSold()", +"d6f50ed6": "registrarApp(bytes32,address,bytes32[])", +"d6f5792d": "isCurrentAccountReader(address)", +"d6f5988e": "getInfoMarkTokens(address)", +"d6f5c939": "tie()", +"d6f6b6e7": "closeFailedVotingAndWithdraw()", +"d6f7ddf9": "topUp(address,uint256)", +"d6f8307f": "requesters(address)", +"d6f8560d": "withdraw_eth()", +"d6f8ecae": "time2()", +"d6fa3efa": "requiredTimeBetweenDraws()", +"d6fb1678": "mineableSupply()", +"d6fb69b9": "_sendWinnerJackpot(address)", +"d6fbf202": "startingPrice()", +"d6fc2e62": "rateProjectSecondParty(bytes32,uint8)", +"d6fd1fe9": "saleAction()", +"d6fd8822": "threeTimes(address,uint256)", +"d6fe3d6d": "afterForkRescueContractBalance()", +"d6fea306": "weiICOMaximum()", +"d6febde8": "buy(uint256,uint256)", +"d6feecde": "ret_len()", +"d700071a": "minorPartnerAddress()", +"d7003222": "unitCost()", +"d700ed39": "isStarterClaimed(address)", +"d70108a6": "getCmd_control()", +"d702087f": "setSecretSigner(address)", +"d7020b0c": "setarg_3(uint256)", +"d7020d2a": "approveEscrow(bytes16,address,address,uint256)", +"d702b63d": "for_longterm()", +"d702db81": "UserRetireHodl(uint256)", +"d702e364": "setPreICOSoldAmount(uint256,uint256)", +"d7052e17": "GotTokens(address,uint256,uint256)", +"d705763d": "Tset(uint256,string,uint8,string)", +"d705d6d7": "MainSale(address,uint256,uint256,uint256)", +"d70657ac": "getBalanceHolder()", +"d7067dc5": "crowdSalePaused()", +"d70695bb": "swarmRedistribution(address,uint256)", +"d706df8c": "BioStem()", +"d7074aaf": "GetCard(uint32)", +"d70754ec": "node()", +"d7079ee7": "startPublicsale(uint256,uint256)", +"d707d466": "allocToMember(address,uint256)", +"d7081e03": "transferAmount(address,uint256)", +"d7085e05": "SafeSend(address)", +"d70907b0": "freezeWithTimestamp(address,uint256)", +"d70925b4": "teamEthTransferComplete()", +"d70948b5": "_create_drug(bytes32,address,uint256,uint256)", +"d7098154": "claimPrize(uint256)", +"d70afa96": "FEE_ADMIN()", +"d70b6342": "minInvEth()", +"d70cf105": "moveBalance(address,address,uint256)", +"d70d2e26": "DetherTx()", +"d70d37e6": "OptedIn(address,address)", +"d70d532b": "provideAccess(address,uint8)", +"d70d9254": "isBetClosed()", +"d70d9604": "Sales()", +"d70dbf7d": "Aequitas()", +"d70e0f90": "disableAuto()", +"d70e62eb": "lowLimit()", +"d70ed38a": "withdraw(bytes32,uint256,address,address,uint256,uint256,bytes32,bytes,bytes,bytes32)", +"d70efa86": "_inRateFallEffectLimit(uint256,uint256)", +"d70fe207": "cancelOrdersOnOption(uint256,uint256)", +"d710999d": "SiliconValleyCoin()", +"d7109dda": "getCurrentSaleDay()", +"d710e2f0": "sendAllToOwner(address)", +"d710eaac": "NewWallet(address,address,address)", +"d71186b9": "Fund_Contract()", +"d7121f4b": "HolikopterToken()", +"d7123dff": "_createBuilding(uint256,uint256,uint256,uint256,uint256,uint256,address,bool)", +"d712800f": "setLockValue(address,uint256,string)", +"d712d06d": "tokenDestroyed(address,uint256,string)", +"d712eb4a": "voteWeight()", +"d7130651": "getCity(uint256)", +"d7131e5f": "createToken(uint256,address,string,string)", +"d71331c2": "getCountPlayerByTrackId(bytes32)", +"d715c8b2": "ownerHistoryCount(uint256)", +"d716222c": "is_owner(uint256,address)", +"d716e9ca": "getTotalInvoices()", +"d71710e0": "countAttributeTypes()", +"d717b05e": "exchangeLimit()", +"d71801d4": "gallerySix()", +"d7182850": "ownerTokensAllocated()", +"d7186f2b": "KNTTToken()", +"d718e763": "FinalizableCrowdsale(address,address)", +"d719213e": "preBuyPrice1()", +"d719843f": "getVendingStepPrice(uint256)", +"d71a0d7c": "HolahopxToken()", +"d71c14aa": "_isAOContentUsageType(bytes32)", +"d71c4028": "DRPCrowdsale(address,address,uint256)", +"d71cdd78": "BONUS_HI_QTY()", +"d71cf1e4": "getFee(uint256,address,address,address,address)", +"d71d3b3c": "CrowdSalePreICO()", +"d71d6cc5": "blendbacktest(uint32[],bytes32[],bytes32[],uint64[],bytes32)", +"d71d9e8a": "buyFlower(uint256)", +"d71db8aa": "getBonusPerShare(address)", +"d71df760": "oraclize_newRandomDSQuery(uint256,uint256,uint256)", +"d71e58f8": "admin_set_exchange_rate(uint256[])", +"d71e8296": "canIWithdraw()", +"d71e930c": "teamAddressTwo()", +"d71eb6ab": "recursive_store(uint32,uint256)", +"d71f1bd6": "LottesyAddress()", +"d71fcbe6": "BaseBountyContract(address)", +"d7203294": "ZeroXEth()", +"d7206124": "setInvestorLock(bool)", +"d721b0af": "batchExchange(address[],uint256[])", +"d721c760": "IssueAssigneeLoaded(bytes32,string)", +"d7228bb5": "doSucceedingTransferFrom()", +"d7237e45": "invitedByReferalBonus()", +"d723879c": "icoOver2()", +"d723b7c6": "rewardAtRound(uint256)", +"d723bb73": "fetchVoteInfoForVoterBySnapshotBlock(address,uint256)", +"d72473f3": "Added(uint256,string,address,uint256,bool)", +"d72503ba": "buyCat(uint256)", +"d725a9f0": "crowdSaleaddress()", +"d725f10d": "curse(address,address)", +"d7260cba": "refundGame(uint256)", +"d726755b": "moveFloor(uint256)", +"d726f7c7": "mainCoinSentToEther()", +"d7276479": "battlesOwner()", +"d727d64b": "disputeSettledTerminate(bytes32,address,uint8,address,uint8,bool,address)", +"d7289cb4": "FundsReturned(address,uint256)", +"d728b6db": "getCatOfferPrices()", +"d728cc72": "novaCoinAddress()", +"d7290181": "emptyWrongToken(address)", +"d7299009": "isCustomerHasACCfromWL(address)", +"d7299ef7": "pausePresale(bool)", +"d72ad259": "unlockFunds(address)", +"d72ad623": "getReferrerReward()", +"d72b11bd": "reserveWallet()", +"d72b6d3b": "CREATION_LIMIT()", +"d72bdc53": "initialize(address,string,string,uint8,uint256)", +"d72c83c0": "SmokeExchangeCoinCrowdsale(uint256,uint256,address,uint256,uint256,uint256,address)", +"d72c9391": "confirmTransactionSig()", +"d72d04db": "addGame(address)", +"d72d8dd6": "numRegistries()", +"d72dec33": "changeVaccinHistory(address)", +"d72e2b78": "soldTokensWithoutBonus()", +"d72e3de1": "createCustomReservation(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"d72e4167": "getCompte_38()", +"d72eabb8": "minimalToken()", +"d72f7958": "fortune_break_current()", +"d73019e9": "icoStartDate()", +"d7303eaf": "nicole()", +"d7304b09": "cleanupOdd()", +"d730bfe2": "RabbitCoin()", +"d7311963": "m_controller()", +"d7315d60": "totaldeposited()", +"d731a779": "removeTRA(address)", +"d732a3fa": "newRound(uint256,bytes32)", +"d732d30e": "getGamblingPartyInfo(uint256)", +"d732d955": "decrease()", +"d73478f8": "userToNumTowns(bytes32)", +"d735140d": "fourthTokenExchangeRate()", +"d7353371": "PeerLicensing()", +"d7354b49": "getBirthDay()", +"d735875d": "Start_quiz_g(string,string)", +"d735dc92": "multiAirdrop(address[],uint256[])", +"d735fa25": "wholeSaleValueLeft()", +"d7365f9b": "_purchaseMake(uint256)", +"d737035d": "holdersBonus(uint8)", +"d73792a9": "FEE_DENOMINATOR()", +"d7379999": "permissionAt(uint8,int256)", +"d737c2b0": "setContractInfo(bytes32,address,bytes20)", +"d737d0c7": "msgSender()", +"d7385abd": "placeBet(int8,int8,uint32,uint256)", +"d7397a72": "setUrl(address,uint256,string)", +"d739aaf8": "getGameInfoById(uint256)", +"d73a24fc": "canBeWithdrawn()", +"d73a2901": "setManagedVote(uint256,uint152,bool)", +"d73b0cf2": "buyerFundRelease(uint256)", +"d73b1dc9": "decreaseAllowance(address,address,uint256)", +"d73b3a67": "withdrawal_Eth(uint256)", +"d73c277c": "storageName()", +"d73cbc6b": "testLen()", +"d73cbcba": "daCall()", +"d73cedd4": "SPECTRUMZ()", +"d73dd623": "increaseApproval(address,uint256)", +"d73e0c89": "getBookCount()", +"d73ec78d": "_checkCancelAvailability(uint256,uint256,uint256)", +"d73f0b25": "lookupCampaignPart1(uint256)", +"d73f3408": "SimpleMultiSig(uint256,address[])", +"d73fe0aa": "getShares()", +"d73ff0db": "preSaleBfPlatform()", +"d740547e": "mintBonusTokensForGames(uint256)", +"d740766e": "testNoTokenTransferIfNotApproved()", +"d741e2f9": "pip()", +"d743015a": "createAssetPack(bytes32,uint256[],bytes32[],uint256,string)", +"d743ca38": "newWinner(uint256,address,uint256,uint256,uint256)", +"d7441753": "getTypicalItemById(string,uint256)", +"d7447c8c": "addCandidate(address,address,bytes32)", +"d744aec8": "getTokenBalanceInContract(address)", +"d744f2a3": "wantMyToken(uint256)", +"d744f330": "IdClaveChain(address)", +"d744f47c": "validateMessage(string,bytes32,uint8,bytes32,bytes32)", +"d744fcb8": "ClaimFeesFromSharesBought(uint256)", +"d74543f0": "communityusersCap()", +"d7463573": "getOpeningTime()", +"d746a38b": "getMicroModuleByIdPart1(uint256)", +"d7471ad2": "nemocoin()", +"d7480aa4": "AuctusEtherVesting(address,uint256,uint256,uint256)", +"d748d1f6": "revokeEditorRights(address)", +"d749eaab": "newPrimera(address,address)", +"d74a960e": "BGFTToken(uint256,string,string)", +"d74a99d4": "create(uint256,string,uint8,string)", +"d74ae98e": "redeemShip(uint256)", +"d74afaa1": "newowner()", +"d74b2722": "setRefunder(address)", +"d74be848": "maskSender(address)", +"d74c894e": "setSecurityWallet(address)", +"d74d763e": "setUCCoinPerEther(uint256)", +"d74d7e79": "calculateRewardAt(uint256)", +"d74e0d9e": "SetBanker(uint8,address)", +"d74ea11e": "addMockPendingWinner(address,uint256)", +"d74f8e9a": "getLastPayments(uint256)", +"d74f8edd": "MAX_OWNER_COUNT()", +"d7504385": "validateToAddress(address)", +"d7508a55": "prepareAuctionForNonOGChain()", +"d7517caa": "getPresaleStatus()", +"d751b8de": "Request(uint16[],string,address,uint32[],uint256)", +"d7520298": "SetfirstTTaxAmount(uint256)", +"d7522582": "isCurrentTierCapReached()", +"d752dd8e": "AFSBToken()", +"d75318f8": "SecretCoin()", +"d75320b1": "_subtractFromMintPool(uint256)", +"d7533595": "keccak_f(uint256[25])", +"d7533751": "UnvestedSkyeCrypto(uint256,string,string)", +"d75352e1": "marginCall()", +"d75446fe": "etherGet()", +"d7546da7": "Commitment(address,address,address)", +"d754a6bc": "adminResetEmail(address,address,string)", +"d754f0ac": "LOCKOUT_PERIOD()", +"d754f3d5": "currentEraIndex()", +"d75528a5": "addSpecial(uint256,uint256,uint256)", +"d7554a68": "addUser(address,string,string)", +"d7557f18": "closeCampaign()", +"d755cc4a": "buyGOP(address,string,uint256,uint256,uint256)", +"d755e021": "getPlayerShipBattleById(uint64)", +"d7560f2b": "numRewardsUsed(address)", +"d7575592": "addr_teamPartToken()", +"d757579e": "XxxTokenSale()", +"d7578295": "Cashpayz()", +"d75b2b18": "takeCollateral(address)", +"d75b363f": "userRewardCount(address,address)", +"d75b5d9d": "RAFEND()", +"d75b80cc": "a_incognita(uint256)", +"d75d93f6": "registerMeOnToken(address,uint256,string)", +"d75de4ab": "isAddressInWhitelist(address,address)", +"d75e30cf": "drawFee()", +"d75e662f": "OverpayRefund(address,uint256)", +"d75e7afd": "calDivs(address,uint256)", +"d75e87ef": "PersonalInfoAdded(address,string,string,string,string,string,string,string)", +"d75ebde2": "joinGameFromBalance(uint256)", +"d75f0dd6": "SixtusToken()", +"d75fabb0": "RewardOffer(address,address,bytes32,uint256,uint256,uint128,uint256)", +"d7604a78": "modifyWhitelist(address,uint256,uint256,uint256,bool)", +"d7625c88": "hasMigrated(address)", +"d762755d": "minimumContributionWeiByOneInvestor()", +"d7638b73": "phase2Cap()", +"d763f92d": "FintechChain()", +"d7642ae2": "COIN_COST_ICO_TIER_3()", +"d7643e18": "protoCount()", +"d7651471": "Notes()", +"d7655b98": "OmixToken(uint256)", +"d7669119": "NewPrice(uint256,string)", +"d767aee0": "bbb()", +"d767e0d6": "SoldToCustomer(string,string)", +"d767ee4d": "updateLogic(uint256)", +"d7682701": "_cancelPermissions(address,address[])", +"d768729d": "getRecentDiary()", +"d7688d31": "destEthFoundationDev()", +"d7689460": "CryptoRex()", +"d768d95b": "finaliseContract()", +"d768d95e": "fetchVoteMainInfoForVoterBySnapshotBlock(address,uint256)", +"d768dd4b": "Stage3Allocation()", +"d769ae1b": "SLCAdvancedToken(uint256,string,string)", +"d769f32a": "mulXY(uint256,uint256,uint256)", +"d76a0cb8": "HybridBlock()", +"d76a130a": "TokenCDCQ(uint256,string,string)", +"d76a69e2": "Fund(address,address,address,address,address,address,address,address,address[])", +"d76b6095": "phase1Rate()", +"d76bce7c": "dropEth(address[],uint256[])", +"d76d6ee0": "query(bytes32,bytes2,int256)", +"d76dc2eb": "LOCKAMOUNT1()", +"d76dc656": "GDCAcc02()", +"d76dddd3": "unfreezeTime()", +"d76e5765": "getUserIpfsFromId(uint256)", +"d76f288f": "metaBurnHash(address,uint256,uint256,uint256)", +"d76f94aa": "toAlphabet(uint8[])", +"d7717750": "tokenLogic()", +"d7723231": "getIcoPurchase(address)", +"d772ddc0": "setProcessorAddress(address)", +"d7730236": "maxEthRaised()", +"d7734855": "getDiff(uint256,uint256)", +"d77371e0": "GoodDayToken()", +"d7744b9f": "getReferee(uint256)", +"d774c038": "multisend(address[],address)", +"d775db2a": "testThrowsSaleWalletIncorrectMultisig()", +"d7760500": "partnersRelease()", +"d7768c47": "prepare(bytes)", +"d77727de": "seeOwner(uint256)", +"d7777c29": "startPreICOStage1()", +"d77844f6": "isLimitationPeriodActive()", +"d77849c7": "tokenTakeback(address,uint256)", +"d778610e": "updateStateWithPrivateSale(uint256,uint256,uint256)", +"d7787f33": "setUpgradeContract(address,address)", +"d7789a9f": "unsetEndorsement(address,uint256)", +"d778c911": "price3()", +"d7790c11": "waipaytoken()", +"d7796915": "checkWithdrawValueFX(uint256)", +"d779ca24": "payoutBonusesToHolders()", +"d77a39c9": "addPresaleTokens(address[],uint256[],uint256)", +"d77a80a8": "lastFunder()", +"d77a86a0": "sendTo(address,uint64)", +"d77ac32d": "discountSum(uint256)", +"d77b0ff7": "keyAtIndexHasNext(uint256)", +"d77bd1ae": "ProposalAdded(uint256,address,string)", +"d77bf0cf": "CONFIG_PRICE()", +"d77c96f8": "mainICOThirdWeekEndTime()", +"d77d0012": "getBankPercent()", +"d77d3f79": "KoaStandardToken(uint256,string,uint8,string)", +"d77da4f4": "withdrawToTeam(uint256)", +"d77e2f55": "pendingEtherForCroupier()", +"d77e8986": "isExistsEscrow(bytes16,address,address,uint256)", +"d77ec4a4": "executeWithdrawTransaction(uint256)", +"d77fc50f": "checkZeroValue(uint256)", +"d77ff9ea": "eventCardRangeMin()", +"d7800fa2": "PurchaseRegistered(bytes32,address,uint256)", +"d7815ba4": "shareholdersHolding1y()", +"d7816f45": "transferlocked()", +"d781be46": "endDatetime()", +"d781d0f4": "YaoToken(uint256,string,string)", +"d781f3f4": "FootScoutCrowdsale()", +"d781fbf9": "removeERC223(uint256,address,uint256)", +"d78235cf": "setconfigurationEtherPrice(uint256)", +"d78276c6": "withdrawERC20(uint256)", +"d782cc54": "setNewBonusLevel(uint256,uint256)", +"d782d647": "createdTokens(uint256)", +"d7837ec9": "withdrawNonTop(uint256)", +"d783aacf": "ItalyToken()", +"d783b53b": "addSupporter(address)", +"d784601a": "myEthBalanceOfNoFee()", +"d784d426": "setImplementation(address)", +"d78506ce": "RoyaltysOwing(address)", +"d785c19c": "worldCupResultPart1()", +"d785e5c9": "m_isCirculating()", +"d78724d6": "getUserContractCount(address)", +"d7872745": "GumToken()", +"d788a945": "_isLongitude(int256)", +"d7892b6a": "changePeaceRelayAddr(address)", +"d789479d": "celtic_cross()", +"d78996d8": "getUtilizationAndAnnualBorrowRate(uint256,uint256)", +"d789b4c1": "uintMax(uint256)", +"d78b16a1": "emitTokens(uint256)", +"d78c15d9": "isPromoted()", +"d78c20ff": "voteApprove(uint256)", +"d78cb1b2": "buyXgoldTokens(address)", +"d78d610b": "getRecipients()", +"d78db648": "multStore(int256)", +"d78e1bb1": "teamPot_()", +"d78ed508": "getShipProductStartPriceByModel(uint16)", +"d78efa67": "addrecruit(uint256,uint256)", +"d7901260": "closePreICOPrivate()", +"d7901645": "GetDappinfo(string)", +"d790dce7": "endOfSaleFullWithdrawal()", +"d79185d7": "StartGuess_wis(string,string)", +"d791de63": "unlock(address[])", +"d791ed7a": "BaoBaoToken(uint256,string,string)", +"d792b356": "teamTokenAllocation(uint256)", +"d793f7a9": "preICOamountBonusMultipierInPercent(uint256)", +"d7942050": "Setuppresale(uint256,uint256)", +"d79521e8": "getPokemonDetails(uint256)", +"d7955eaf": "Santal()", +"d7959cf9": "ipfs()", +"d7963f94": "changeOwners(address)", +"d7982a6c": "unlockEscrow()", +"d7984cff": "CappedAndBurnableToken(uint256)", +"d79875eb": "sell(uint256,uint256)", +"d7988c98": "makeGrant(address,uint256,uint256,uint256,uint8)", +"d7989a93": "advancedTokensPerEth()", +"d79941d8": "getQueryRandomCallbackGas()", +"d79964c3": "addDeprecation(uint256,address,address,address,uint256,address)", +"d79b5bc6": "DonationSentButNotMatched(address,uint256)", +"d79bd499": "retrieveBalance()", +"d79c1f7f": "batchReclaimExpiredSwaps(bytes32,bytes32[])", +"d79cb6fd": "buyScams()", +"d79d5c7a": "COMPANY_TOKENS_PERCENT()", +"d79d63be": "getCardPrice()", +"d79d8e6c": "set(bytes32,address,bytes32)", +"d79e1e7d": "sumElements(uint64[])", +"d79e3755": "totalPromo()", +"d79e5de8": "HeliumToken()", +"d79e7894": "isAfterICO()", +"d79f5678": "DazzioCoin()", +"d7a084e0": "isWhiteListGame(address)", +"d7a08641": "checkCanRelease(bool,uint256,uint256)", +"d7a10acb": "balances2(uint256)", +"d7a1192d": "STAGE3_TIME_END()", +"d7a14a05": "totalAmountOfEarlyPurchases()", +"d7a15951": "winnerReward(address,uint256)", +"d7a17187": "ico2Raise()", +"d7a1cfe1": "addFriend(address)", +"d7a23fd4": "getActivityCount(uint256)", +"d7a42b54": "isEntity(uint256)", +"d7a4a09d": "detectJanuary(uint8)", +"d7a58658": "changeHouseedge(uint8)", +"d7a5afcf": "holderPartnershipsTokens()", +"d7a5f278": "slashInvalidUsername(bytes,uint256)", +"d7a5fdee": "DGPTokenOldContract()", +"d7a66ebe": "readContent()", +"d7a71868": "setManualPrice(uint256)", +"d7a78db8": "freeze(uint256)", +"d7a8560f": "invoicesStackCount()", +"d7aa6d74": "ShitCloneFarmer()", +"d7aa8273": "getTransactionInfo(uint256)", +"d7aa89b8": "storageOracle()", +"d7aae0e6": "executeProposal(uint256,address)", +"d7ab2770": "fetchGiven(address,bytes32)", +"d7ac79ba": "deleteHeir(address)", +"d7ad28ec": "GSMulti(uint256,uint256)", +"d7ad4931": "buyNow(bytes32)", +"d7ae339b": "ForecastChainToken()", +"d7ae76b6": "DING()", +"d7af26f8": "getPlayersBalances()", +"d7b03000": "resetCards()", +"d7b0a358": "shiggidyToken()", +"d7b0ca65": "last50plusblokhack()", +"d7b0e692": "set_new_admin(address)", +"d7b11125": "pwr(uint64,uint64)", +"d7b12454": "checkContract(address)", +"d7b12f38": "PRICE_STAGE_TWO_BONUS()", +"d7b15a88": "getLockedFundsLastSpending()", +"d7b1b9c4": "foundationTokensAllocated()", +"d7b1bb22": "cadastrar(bytes32,uint8,bytes32,bytes32,int256)", +"d7b2aae6": "setContactInfo(string)", +"d7b2f360": "getEncounterDetails()", +"d7b32f5f": "GetPrivateSale()", +"d7b33f66": "updatePercentToTakeAsSeed(uint256)", +"d7b33f94": "PRE_ICO_AMOUNT()", +"d7b40107": "auctionByAssetId(uint256)", +"d7b4750c": "getFunder(uint256)", +"d7b4a7f6": "MinerOneCrowdsale(address)", +"d7b4c9b1": "lookupKittyDetails1(uint256)", +"d7b53081": "closeSaleAnyway()", +"d7b5507d": "blockchaincertified()", +"d7b701b6": "SarahCoin()", +"d7b7024d": "approvedWithdrawAddresses(bytes32)", +"d7b7913b": "f3(uint256)", +"d7b7961c": "getPairHash(address,address)", +"d7b84f68": "moveDataContractBalanceToWorld()", +"d7b8cdf4": "MinimumContributionChanged(uint256)", +"d7b8de00": "setMaxCollectable(uint256)", +"d7b91bcc": "buyTokensICO()", +"d7b96d4e": "locker()", +"d7b97db1": "setDistributionTime(uint256)", +"d7b9cc24": "setCasino(address)", +"d7ba30b2": "rateAirDrop()", +"d7ba42fc": "addActionAccount(address)", +"d7ba95ca": "share2()", +"d7baa041": "PublicLayer()", +"d7bb913f": "accountTokensPurchased(address)", +"d7bb99ba": "contribute()", +"d7bbce2a": "setOrCacheDesignatedReportStake(uint256)", +"d7bc23af": "newParameters(int256,uint256,uint256,uint256)", +"d7bd6d0d": "addExchangeAccounts(address,address)", +"d7bd8987": "testTransfering()", +"d7bdaaa6": "WLMWallet()", +"d7bdc3fa": "addVolumeDiscount(uint256,uint8)", +"d7be503f": "_tokePerEth()", +"d7be708c": "BoulePreSale(address,uint256,uint256,uint256,address)", +"d7be8ceb": "performFetch()", +"d7bea56a": "totalExcessEth()", +"d7bfc8c5": "BabyDragon()", +"d7c01c3e": "SetTakePot(uint256)", +"d7c0302e": "numOfCitizensWhoReceivedDrops()", +"d7c06439": "AriumToken()", +"d7c06919": "getAuctions()", +"d7c0d42d": "ControlledToken(uint256,string,uint8,string)", +"d7c0f72b": "getTitulaire_Compte_5()", +"d7c23572": "historyTimesPlayed(address)", +"d7c23578": "addSig(bytes32,bytes32,bytes32,uint8)", +"d7c26adb": "oraclize_setProof(bytes1)", +"d7c2a887": "MANAGEMENT_FEE_RATE()", +"d7c35657": "EthsqrGate()", +"d7c39cc6": "totalSellingItem()", +"d7c482ef": "Defroze(address,bool)", +"d7c48e2b": "preseller()", +"d7c4e7ac": "HarlleriumCoin()", +"d7c4f9d3": "SignatureAdded(string,string,uint256)", +"d7c5b986": "LogContribution(uint8,address,uint256)", +"d7c61e7b": "CreateSaleAvgPrice(uint256,uint256,uint256,uint256,uint64,address)", +"d7c7159c": "buyWithKYCData(bytes,uint8,bytes32,bytes32)", +"d7c74279": "deployChildren(address)", +"d7c8112d": "WithdrawAllFunds(uint256)", +"d7c81b55": "gameId()", +"d7c81fdc": "MSCCStandardToken(uint256,string,uint8,string)", +"d7c8843b": "getEggsSinceLastHatch(address)", +"d7c8e90c": "voteAmendment(uint256)", +"d7c8f959": "CreateEmployee(address,uint32,uint32,uint16)", +"d7c94efd": "teamFee()", +"d7c97fb4": "erc721Contract()", +"d7c9a0e3": "getMyMoney()", +"d7ca01b5": "confirm(address,uint256)", +"d7ca20e6": "HashStore(uint256)", +"d7ca3a90": "CelebrityMarket(address)", +"d7ca7cc5": "changeLockingPeriod(uint256)", +"d7ca9949": "totalSoldTokens()", +"d7cb55a2": "AToken()", +"d7cbac05": "BONUS_ICO_STAGE1_PRE_SALE1()", +"d7cbbb73": "getAllCardsAddress()", +"d7cc43bf": "aSetStart(uint256)", +"d7cc8362": "isLatestMajorTree(bytes32,bytes32)", +"d7ccc2c3": "getLastPayment()", +"d7cd6c13": "burnFundAccount(address,uint256)", +"d7cd7209": "newGroup(address,bytes32,address[])", +"d7ce330b": "Deco()", +"d7cea877": "monthStr(uint256)", +"d7cee31e": "houseAddress()", +"d7cf1d20": "HDT_Token()", +"d7cf61d7": "assertSignedByBoth(uint256,bytes32,uint8,bytes32,bytes32)", +"d7cf7bcb": "purchaseSafe(uint256,uint256)", +"d7cff986": "submitAnswerCommitment(bytes32,bytes32,uint256,address)", +"d7d0afa4": "_fetchCreatedOrdersForMerchant(address)", +"d7d12297": "taskTotalBalance()", +"d7d15059": "functionName()", +"d7d1b48c": "_setWingsValue12(uint256)", +"d7d1bdbd": "getUnsoldOwner()", +"d7d23155": "owner_linkage()", +"d7d29315": "drawReuslt(uint256,address[],address[],uint256,uint256,uint256)", +"d7d319e4": "CWCreturnQuery()", +"d7d3c4d5": "pvpContenderRemoved(uint256)", +"d7d40523": "HardwareWallet()", +"d7d43b41": "MoedaToken()", +"d7d49532": "lastBlock_a9()", +"d7d5878d": "revokeSchedule(address,address)", +"d7d7442f": "updateThreshold(uint256)", +"d7d7be34": "oraclize_query(string,bytes[1])", +"d7d88043": "endSaleDate()", +"d7d8cdd5": "addTRA(address)", +"d7d90fb1": "ClearCLevelSignature()", +"d7d96a12": "StarToken()", +"d7d9fef0": "scheduleTimelock(address,uint256,uint256)", +"d7dae83c": "active_withdraw(address)", +"d7dbb88b": "getn2Exception(bytes32)", +"d7dbdbe3": "setVicepresidenteDeMesa(bytes32,uint256,bytes32)", +"d7dc6203": "calculateInterest(address,uint256)", +"d7dcaa19": "BuToken()", +"d7dccb1e": "EthSplit(address[],address)", +"d7dd2ae3": "ValidateCitySnapshotInternal(address,uint256)", +"d7dd8652": "refundCrowdsale()", +"d7dde189": "StartupToken()", +"d7de57c6": "challengeWithFutureCustody(address,uint256,bytes32[],uint256[],bytes32[])", +"d7de9c6e": "setOracleQueryString(string)", +"d7df7ef9": "_createWonder(address)", +"d7dfa0dd": "logic()", +"d7e07d5f": "destTokensReserve()", +"d7e0b6e3": "registerUser(address,bytes32)", +"d7e0d83d": "setPrvd(address)", +"d7e0e776": "getBalanceOfInstance()", +"d7e11e9d": "AddTicket(bytes)", +"d7e25c36": "isCapReached()", +"d7e2f000": "preallocationsWhitelist()", +"d7e30832": "TankTransfer(address)", +"d7e31d67": "setRewardChance(uint256)", +"d7e3aab2": "VestedMultisigWallet(address[],uint256,uint256)", +"d7e44b89": "splitPay(address[],uint256,address)", +"d7e4e1f7": "setSail(uint16,uint16,bool)", +"d7e5c07d": "allocateTokens(uint256,uint256,address)", +"d7e64c00": "investorCount()", +"d7e7088a": "setUpgradeAgent(address)", +"d7e751ff": "tokenWithdraw(uint256)", +"d7e8015a": "FuckToken(uint256,string,uint8,string)", +"d7e84fbf": "builder()", +"d7e8553a": "_deleteValidator(address)", +"d7e9ec6e": "RemovedBlackList(address)", +"d7ea39c6": "referralDone()", +"d7ea977b": "V1ChainToken()", +"d7ea97e2": "setBTHFoundationWallet(address)", +"d7ead1de": "right74(uint256)", +"d7eae6db": "setUnPauseEmergence()", +"d7eaef90": "LGTToken()", +"d7ebf53d": "countActiveCastle()", +"d7ec1fac": "CrowdSaleTokenSoldout()", +"d7ecb5e3": "MINI_GAME_BETWEEN_TIME()", +"d7ecba0c": "numBarriersPerBoard()", +"d7ecc129": "supplyTo(address,uint256)", +"d7ed3fb1": "get_participant_topl_address(address)", +"d7ed7453": "redeemWinnings(uint256)", +"d7edddb2": "withdrawAdministratorMoney(uint256)", +"d7edf88c": "replenishEth()", +"d7ef1356": "best_adjustment(bool)", +"d7ef4a04": "CreateCredoIco(address,uint256)", +"d7efbf34": "transition()", +"d7f08eed": "unlistSubName(bytes32)", +"d7f0d86b": "attackUnit(uint256,uint256)", +"d7f0df73": "Betcash(uint256,string,uint8,string)", +"d7f0f01b": "fund(uint8,uint8,uint8)", +"d7f31eb9": "forward(address,uint256,bytes)", +"d7f3c770": "Mesut()", +"d7f42ee2": "getBBLibVersion()", +"d7f56ef7": "partnershipsTokenAddress()", +"d7f59fd0": "tgeSettingsBlocksPerStage()", +"d7f5b43e": "setCapacityByIndex(uint256,uint256)", +"d7f6f81c": "getProviderBadge(address)", +"d7f746ce": "tickingBomb()", +"d7f7582c": "totalCapitalization()", +"d7f7f3aa": "markTransferTokens(address,uint256)", +"d7f8a053": "TokenRate(uint256)", +"d7f9d655": "Divies()", +"d7fa1007": "setHash(bytes32,bytes32)", +"d7fa445e": "claimBidReward(uint256)", +"d7fb4f1d": "endTime_()", +"d7fb5ef5": "angelSupply()", +"d7fb7427": "transferNewCoin(address,uint256)", +"d7fb8dc0": "messageForReason(uint8)", +"d7fc1b9b": "register(string,string,bool)", +"d7fc23a2": "createNewAsset(string,string,uint256)", +"d7fc98c3": "subscribeIndividual(bool)", +"d7fd00b0": "TEAMS_PER_ENTRY()", +"d7fd0e77": "requestTime()", +"d7fe270e": "multipleTokensSend(address[],uint256[])", +"d7febcb9": "TestUserBitFlag(address,uint256)", +"d7ff4d7a": "WODECESHIBI(uint256,string,uint8,string)", +"d7ffbbaa": "setInformation(string)", +"d8013c4e": "addNote(bytes32,bytes20,string,string)", +"d80162fc": "setRecommendStatus(bool)", +"d8018c42": "getReleaseTimes(address)", +"d801aa84": "isWalletFromUser(string)", +"d8020a18": "marketingPercent()", +"d80326a9": "VentanaToken()", +"d80364ba": "LogRegister(address,string)", +"d8047a07": "RobotChain()", +"d80528ae": "stats()", +"d8055812": "votesDecline()", +"d8058712": "UnicornAccessControl(address)", +"d8063ea6": "addDelegate(address,address,string,address,uint256)", +"d8070c40": "IcoPrice()", +"d807a688": "wper(uint256,uint256)", +"d8085306": "mintTokensForSecondStage()", +"d8085f78": "ownerCanClaimCard(address,address,address[3],uint256)", +"d8085fee": "multiMerge(address[])", +"d80866da": "isValidZ(uint16)", +"d8090cbf": "resetReclaim()", +"d809d248": "startNextGame()", +"d80a5c3b": "MyContribution()", +"d80ad1ed": "getSponsorshipProportionalAmount(address,uint256,uint256)", +"d80aea31": "_setCreatedBlockOnRevealsPhase(uint256,address,bool)", +"d80b1a68": "createAndEndowC1(uint256,uint256)", +"d80b2056": "emptyWrongEther()", +"d80cc340": "retainBalance()", +"d80d3025": "changeBonusSystem(uint256[],uint256[])", +"d80d9c55": "changeSecondsInBlock(uint256)", +"d80e821c": "reevaluateICO(uint256)", +"d80e8700": "CurrentTime()", +"d80ffb20": "drawNumber()", +"d8104e19": "GetMyEarning()", +"d810f298": "computeSettlementAmount()", +"d81111ab": "BuyTokens()", +"d8112523": "sendIncentive()", +"d811b100": "getHouseAddressOne()", +"d811b7ca": "transferToOtherBucketContract(address)", +"d811f09e": "ownershipTransferAllowed()", +"d811fcf0": "farmer()", +"d81230c8": "shareactive()", +"d812d961": "getSanName(uint256)", +"d812f2b0": "setDelegadoDeEscuela(bytes32,uint256,uint256)", +"d8132807": "_getMinAuctionStartPrice()", +"d8134a23": "removeAcceptedToken(address)", +"d813b4b9": "setArtIdt(string,string)", +"d8145062": "squirrelmasterReq()", +"d8148166": "DistributionMint(address,uint256)", +"d81494ba": "blacklist_addys(address[])", +"d8149fe7": "dive1(address)", +"d814ebed": "TruUpgradeableToken(address)", +"d8152cbc": "createBalanceSnapshot()", +"d815fa30": "ERC20Token(uint256,string,string,uint256)", +"d816187f": "PreIcoWallet()", +"d8162db7": "lockedUntilBlock()", +"d8174150": "MAX_PRESALES_EXTENSION()", +"d8175101": "ownerHasCardSimple(address,address)", +"d81849b8": "additionalTokenRate()", +"d818eb63": "Fundraiser(address,address,uint256,uint256,uint256)", +"d818ecee": "setDisputed(address,string)", +"d81a91e9": "get_party2()", +"d81ab0c1": "invoke(uint256,address,address,bytes)", +"d81ad101": "IMPACT_REGISTRY_ADDRESS()", +"d81b1020": "setForceContract(address)", +"d81c2232": "icoPhase2TimeBonusInPercentage()", +"d81c6741": "removeAddressFromBonuslist(address)", +"d81d5062": "relayBuyerCancel(bytes16,address,address,uint256,uint16,uint128,uint8,bytes32,bytes32)", +"d81d8f89": "getSalaryTokensTotalValue(address)", +"d81dd9f7": "destroyGame(uint256)", +"d81dfe30": "LOCKED_TIME()", +"d81e8423": "get(address,address)", +"d81efdc4": "euroCentsInOneEther()", +"d81f53fd": "EtherId()", +"d81f84b7": "getAddr(uint256)", +"d81f9830": "BONUS_WINDOW_2_END_TIME()", +"d8207301": "MyWishCrowdsale(uint256,uint256,uint256)", +"d820ab95": "secondStageReserve()", +"d8211b0d": "BENZCoin()", +"d821b9f9": "initialAllocations(address)", +"d8220323": "setLoto(address)", +"d82277cc": "createInvestment(address,uint256)", +"d823eec9": "TEAM_TOKEN_CAP()", +"d825b510": "addDisagree(bytes32)", +"d825ebc3": "calculateMinting(uint256)", +"d826505d": "isEthNoEnc(uint16)", +"d8267fef": "letItRain(address[],uint256[])", +"d826853e": "sellKeys(uint256,uint256,string)", +"d826f88f": "reset()", +"d826fdf1": "checkRefundExistanceByOwner()", +"d8270dce": "creationTime()", +"d82745c8": "withdrawCooldown(address)", +"d828435d": "getNonce(address,address)", +"d8291e97": "CHELSCOIN()", +"d8294ede": "minimumTimeout()", +"d82974f8": "moveUnsoldTokensToFoundation()", +"d829f1e0": "blendWithOthers(address,uint256,uint256,uint256)", +"d82a6d56": "isOBR()", +"d82b394f": "createShip(uint256)", +"d82beb9e": "sender_enode()", +"d82c6df4": "inactivate()", +"d82ce857": "getPI_edit_26()", +"d82e3962": "calculateReward(address)", +"d82ed7eb": "unwhitelistAddressPresale(address)", +"d82f6a3f": "maxWeiInvestment()", +"d82f94a3": "deleteMinter(address)", +"d82fa3f1": "doInvest(address)", +"d831a158": "ownerCtuContract()", +"d831b714": "withdrawDeklaBalance(address,bytes)", +"d832d0c8": "isFoundation(address)", +"d833590f": "totalSupplyPretty()", +"d833c736": "tripleRoomMax()", +"d833dbe9": "preSaleRate()", +"d834e619": "min(uint256[])", +"d834f1e8": "setConfiguration(string,string,uint256)", +"d8353b75": "vestingDateEnd()", +"d83616b2": "TokenSaleLockTransfer(uint256,uint256,uint256)", +"d83623dd": "startDistribution()", +"d83671b7": "addLock(address,bool)", +"d83678ac": "tradeToken()", +"d8367d41": "startIncomeDistribution()", +"d836b12d": "getInvestorTokenPercentage(address,uint256)", +"d836f06a": "VestingKYCSetted(address,uint256)", +"d836f794": "sellKebabs()", +"d836fbe8": "changeHatchEscapeCaller(address)", +"d8377b20": "buyAndSetDividendPercentage(address,uint8)", +"d8381df0": "createCastle(uint256,string,uint64,uint64,uint64,uint64,uint64,uint64)", +"d8389dc5": "hash(bytes32)", +"d8392c92": "WithCoin()", +"d83a223a": "changeFounderWalletAddress(address)", +"d83a7f67": "getDepositAddress(address)", +"d83a8d11": "testProposing()", +"d83aabbe": "getWagerCount()", +"d83c68b9": "Pilendthereum(uint256,string,string)", +"d83cb681": "getMixer(bytes32,uint256)", +"d83d2afc": "leftoverWeiAmount(address)", +"d83edd70": "refundEth(address)", +"d83f24a2": "multiMerge(address[],uint256[])", +"d83fcfa3": "TMN()", +"d8412808": "HazzaTokenInterface()", +"d84201bf": "buy5()", +"d8420e3a": "_isValidWithCompositions(uint256[],uint256)", +"d8436663": "destroyIBTCToken(address,uint256)", +"d8439165": "upgradePonyResult(uint8,uint256)", +"d843dcbb": "ELF()", +"d843e40a": "getRoundNum()", +"d843e721": "convertToATK(uint256)", +"d844a0fa": "TierionNetworkToken()", +"d845a4b3": "request(uint256)", +"d8460e8c": "Menu09()", +"d8464746": "getEyesValue(uint256)", +"d847e48f": "BlingTokenSale()", +"d8485ed6": "FCOIN1519Token(uint256,string,string)", +"d84891da": "EM122()", +"d8489a81": "MaxDistribPublicSupply_()", +"d848dee7": "setDeprecated(bool)", +"d8493983": "GroverBucks()", +"d849eeba": "gotResult()", +"d84acf20": "restoreAllTempTokens(uint256)", +"d84bd737": "xcc()", +"d84cb6ad": "ETH_Rate_Factor()", +"d84d2a47": "spreadMultiplier()", +"d84d95ba": "confirmMultipleTransactions(uint256,uint256)", +"d84dbdc3": "verifyInvestor(address)", +"d84f93cb": "priceOfOfficalCardSold()", +"d84fdbed": "getSponsorships(address,address,bool)", +"d850288b": "etherlist_top()", +"d8507a8d": "unfrezee()", +"d851eb5d": "betPlaced(address,uint256)", +"d8523fc2": "askForMatch(uint256)", +"d8526677": "MintMasterTransferred(address,address)", +"d852748c": "totalPoolOptions()", +"d8528af0": "allowedSpenders(address)", +"d85349f7": "cliffDuration()", +"d8542d51": "oldTokenAddress()", +"d8550112": "putServerAddress(string,address,uint256)", +"d855c059": "setExtraConfig(uint256,uint256,uint256,uint256,uint256)", +"d85633ec": "releaseOwnership()", +"d8567213": "chargeAll(uint256)", +"d856cbae": "ICOMinTresholdReached(uint256,string)", +"d8574e16": "addressD()", +"d857561d": "enableWithdrawal()", +"d8578d14": "showPlayerSafeById(uint256,uint256)", +"d857eba6": "getTagAt(uint256)", +"d8583895": "getNumberOfDeposits()", +"d85874b9": "badgerAmount()", +"d8589be3": "CoinFlipper()", +"d858b5c8": "order_sell(uint256,uint256)", +"d858ebf4": "createVisaOffering(uint256,bytes32,bytes32,uint256,uint256,bytes32)", +"d8590f93": "clearingPrice(address,bytes32)", +"d8592d79": "closeWormhole()", +"d85a82f6": "processDIVD()", +"d85b07e0": "stopIcoAndBurn()", +"d85b228e": "testCreateGame(string,string,bool)", +"d85b559f": "startSelection()", +"d85ba798": "getCutieId(bytes)", +"d85bd526": "running()", +"d85c8966": "ownerTransfer(address,uint256)", +"d85d3d27": "mint(string)", +"d85d656f": "getSMPTokensAmountPerWei(uint256)", +"d85d6d41": "finishLocking()", +"d85e2d20": "b(address,uint256)", +"d85e5486": "privateCap()", +"d85e88db": "item(address,uint256,bool,bytes)", +"d85edab6": "m_investors(uint256)", +"d85f4450": "numberOfWins()", +"d860ced1": "TIER1END()", +"d86123e1": "setMany(address[])", +"d8615e5b": "transferAndPay(address,uint256,bytes)", +"d86202cb": "getUserProductAtIndex(bytes32,uint256)", +"d8627542": "intialSupply()", +"d862b611": "extraMint()", +"d8632388": "allPlayCount()", +"d8632ae3": "sign(uint8,bytes32,bytes32)", +"d863f7f4": "DigiPeso()", +"d86491fc": "testReentracy()", +"d864c322": "changeAccountStorage(address)", +"d864e740": "committee()", +"d8650f49": "tokenGenerationLock()", +"d865897c": "_getHashKey(address,uint256)", +"d865a374": "instruct_1()", +"d865ae9b": "hasRole(address,bytes32,bytes32)", +"d865dc4f": "tokensSoldCount()", +"d8674554": "tokenTransfertoKYC(address,uint256)", +"d867bb25": "getONG(bytes32)", +"d8682e69": "returnTimeLeft()", +"d86892a7": "setSellerGuarantee(uint256)", +"d868c718": "scheduleFight()", +"d8690c22": "isAvailableLockSlot(address,uint256)", +"d8692f17": "calcMerkleDefault(bytes32[],uint256,uint256,bytes32)", +"d869c681": "issuedTokenBalance()", +"d869d86d": "getAmountsForChangeWeight(address,address,uint256)", +"d86afbbb": "giveItem(address,uint256)", +"d86b2982": "numbersCount()", +"d86b3721": "getblock()", +"d86b8739": "redeemedTokens()", +"d86bc1b0": "cancelByAdmin(uint256[])", +"d86c31e5": "BOXSToken(address,address,int256)", +"d86c5bf7": "angelWheelFinanceSupply()", +"d86df333": "deleteAccounts(address,address,address[])", +"d86e1850": "AuditBalances()", +"d86e762d": "getTotalAmountRaised()", +"d86e79c3": "createFixedPeriodVpfFactory(string,bytes32,uint256,uint256,int256[],uint256,uint256,uint256)", +"d86eb3b7": "reservedTokensAddress()", +"d86ec25a": "setNotaryParcel(uint256)", +"d86f26f2": "BigBucksToken()", +"d86f8ccd": "getAccountLockState(address)", +"d86fb89d": "updateRoundsInformation(uint256)", +"d871e94b": "tokenClaimWaitingPeriod()", +"d8730ef2": "getMaxCommunityTokens()", +"d8737d8a": "buyEthUnit(uint256,uint256)", +"d873f0d6": "tokenSaleMin()", +"d874082a": "fundtransfer()", +"d8743fad": "weiMinContribution()", +"d87522ae": "pauseEnd()", +"d8754716": "createNewTankHull()", +"d87574e0": "airDropPot_()", +"d87624ba": "buyGrimReapersAgainstEther()", +"d87692d9": "transferAllAndCall(address,bytes)", +"d876c9c0": "SECOND_AUCTIONS_INITIAL_PERCENTAGE()", +"d8772e79": "get_transaction_count()", +"d8774d99": "restrict(bool)", +"d8783b04": "PRICE_MULTIPLIER_ICO6()", +"d8787fde": "nextContract()", +"d8788e68": "getTokensForSaleCap()", +"d879380d": "timeoutRegistration()", +"d879914a": "getBidsLength()", +"d879e911": "JORDAN()", +"d87a253b": "registerNameXnameFromDapp(address,bytes32,bool)", +"d87adaa0": "registerPubKey(address,bytes)", +"d87b5c29": "getSpawnCount(uint32,int256)", +"d87bc4cd": "WEGC()", +"d87bca3f": "VictorieumToken()", +"d87be21b": "lastBlock_a4Hash_uint256()", +"d87c3df5": "applyBonus(uint256)", +"d87c5df6": "assignTokensWallet(address,address,uint256)", +"d87c5fb9": "balanceOfBuyer(address)", +"d87c9478": "getStageAverageBonus(uint8)", +"d87ce037": "round1Cap()", +"d87d2a66": "ETH_CRWDTOKEN()", +"d87d2b8d": "BuyMOYTokens()", +"d87d9a66": "get_account_balance_eth(address)", +"d87ddccc": "WithdrawEvent(string)", +"d87e568a": "setHWCDeposit(address,uint256)", +"d87f8da5": "cancelAuction(uint256,bytes)", +"d880285e": "sPeriodEndDate()", +"d880610c": "appendKeyValue(string,address)", +"d88080ed": "ERC20Standard(uint256,string,string,uint256)", +"d880b0b0": "LogChangePCWallet(address)", +"d8819e0a": "maxTrainerLevel()", +"d8822727": "CarDeregistered(uint256)", +"d882ad5e": "Valeriumcoin()", +"d883e789": "PayWins(address)", +"d8844241": "getTotalCategories()", +"d884a322": "betMaxAmount()", +"d886daa2": "revokeAccessDeposit(address,address)", +"d8879dd8": "isValidString(string,string,uint256)", +"d8879fdc": "deleteBio(bytes3)", +"d887ac35": "mUpgradeCostFactor()", +"d8887efc": "withdrawForTrexdevshop()", +"d88905fa": "sanMint(string,string)", +"d8894bb5": "fraction()", +"d88a3af9": "register(address,string,string,uint256,string,string,bytes32,address,address)", +"d88ae250": "setProjectsContractAddress(address)", +"d88b0815": "numberOfCrySolObjects()", +"d88b2da2": "_registerReferral(string,address)", +"d88b8676": "addTrustedAccount(address)", +"d88b9732": "BUXCOIN()", +"d88bfbad": "ContractDisabledBlock()", +"d88c271e": "isWhitelistedUser(address)", +"d88c5237": "VenusCoin()", +"d88cdbd6": "setMe(uint256)", +"d88d8b38": "registerToken(uint256,bytes,uint256)", +"d88dc1c6": "winner_announced(address,uint256)", +"d88e92a7": "OmegaProtocol()", +"d8909e74": "withdrawMyDeposit(uint256)", +"d8910b70": "getTransferProxy(uint32,int256)", +"d89135cd": "totalBurned()", +"d8915fc5": "DCAssetBackend(bytes32,bytes32)", +"d8916bb9": "etherToWei(uint256)", +"d89397b1": "btcsBuyRecipient(address)", +"d893b9f1": "soldTokensPreSale()", +"d894e937": "setSomeValue(string)", +"d894f861": "costFunds()", +"d895530c": "getCurrentCandidateForPrize()", +"d8959512": "getConnectorBalance(address)", +"d8966ad3": "getTombByOwner(address)", +"d896dd64": "setStatus(uint256,uint8)", +"d89739b1": "Marketplace(address)", +"d897833e": "setSaleStatus(bool)", +"d898e1b9": "_depositEther()", +"d899299e": "realUnicornAddress()", +"d899d312": "Testimony()", +"d899e112": "target3()", +"d89ab6d3": "YouCollectCoins()", +"d89b465c": "getUnitAttackIncreases(address,address,uint256)", +"d89b8057": "setOscar(address)", +"d89b908d": "checkFundingCap()", +"d89bcaaa": "BATsPerEth()", +"d89cca38": "assignLawyer(string)", +"d89d4404": "_payEther(uint256)", +"d89dc0ad": "MarketOpen(address)", +"d89ea0f5": "setClearingPriceComponent(address)", +"d89edecf": "returnAmountPlusInterest(uint256)", +"d89ef018": "addUsersWhitelistA(address[])", +"d89f9719": "getOrderOtherArguments()", +"d89fb919": "episodePurchase(uint256,address,uint256)", +"d89fda34": "Fish()", +"d89fec58": "aboutCurrentPack()", +"d8a0aa6c": "getPositionById(address)", +"d8a119b9": "ownerSetVisible(string,string)", +"d8a140f9": "peony()", +"d8a1e70a": "widthrawDev()", +"d8a2848d": "setPaymentEscrow(address)", +"d8a351de": "_getDefaultPartitions(address)", +"d8a3daa0": "createEntry(uint256,uint256[])", +"d8a3f0bf": "getFactoryPrice()", +"d8a489d9": "pauseTournament()", +"d8a506f3": "thirdStageDiscountPriceOfTokenInWei()", +"d8a52178": "ContractManager()", +"d8a54360": "totalRemaining()", +"d8a5cca1": "Finalised(address,uint256)", +"d8a6021c": "transferTreasury(address)", +"d8a7233e": "addBook(string,string)", +"d8a74c7c": "getGamblingPartySummarizeInfo(uint256)", +"d8a74f3b": "ThrowError()", +"d8a79d87": "wolf3Balance()", +"d8a865f6": "getElementAt(uint256)", +"d8a8e03a": "move(uint256,address)", +"d8a9e45e": "getProductContractUser(address)", +"d8aa9f85": "totalForOutcome(uint8)", +"d8ab8274": "getStates()", +"d8ab9208": "addressByIndex(uint256)", +"d8aba1c6": "partFees()", +"d8ac1bb3": "buyTokensReferral(address,string)", +"d8ac26c0": "ForksTestContract()", +"d8ac289f": "frozenWallet4y()", +"d8ac5b4e": "tokensPerCents_gte5kUsd()", +"d8ad1c5c": "getCapAmount()", +"d8ae6139": "WavesPay()", +"d8aeedf5": "freezingBalanceOf(address)", +"d8afc2fe": "getAdminVariables()", +"d8afd392": "advisorySupply()", +"d8b0403a": "Bithemoth(address,address)", +"d8b0b499": "country()", +"d8b11d54": "AddItemExtra(uint32,uint16,uint256,uint16,uint16,string,address)", +"d8b120c1": "getMeshPointByName(int256,string)", +"d8b163d0": "eventsAdmin()", +"d8b29324": "unlockAmount(string,uint8)", +"d8b3315f": "public_withdraw(uint256)", +"d8b3a2eb": "isOdd(uint256)", +"d8b3ad77": "setDateTimeLib(address)", +"d8b3d69a": "getVendorApplicationScoringTrack(string,uint256)", +"d8b3e417": "USD20TestToken()", +"d8b4e580": "uploadBalances(address[],uint256[])", +"d8b50a63": "addAction(string,uint256)", +"d8b5cf43": "beneficiary_modify(address)", +"d8b66ae1": "sendTokens(address[],uint256[])", +"d8b79543": "FxxkToken()", +"d8b86753": "getOrderCount(address)", +"d8b964e6": "approved(address)", +"d8b98118": "CRLperEther()", +"d8b98fca": "AirDrop(address)", +"d8b9a2a0": "addContract(address,address,uint256)", +"d8b9a7e8": "CLC(uint256,string,string)", +"d8ba6de2": "Endorsements()", +"d8ba8ce3": "setNextDiscountTTMTokenId6(uint64)", +"d8baa905": "getAreaEvaluation(address,uint256,address)", +"d8bad5bd": "userLoans(address,uint256)", +"d8bbae03": "getTransferValueFor(address)", +"d8bd4761": "createCurrency(string,string,uint8,uint256)", +"d8be2838": "unSuspend(address)", +"d8be30fc": "getUserMessage(address)", +"d8bea898": "addReferredInvestor(string,address)", +"d8bf0568": "level1Bonus()", +"d8bf0ef8": "finishBurning()", +"d8bf1773": "calculatePoohBuySimple(uint256)", +"d8bf63b7": "START_BLOCK_NUMBER()", +"d8c02572": "Gallery_MuYi_No2()", +"d8c1c3c2": "getNumberOfTx(uint256)", +"d8c1fad1": "StakeIt()", +"d8c251b5": "isNotRegistered(address)", +"d8c26129": "foundationWithdraw()", +"d8c2c1c1": "getcoeffcient(address,uint256)", +"d8c2c878": "PlexCoin(uint256,string,uint8,string)", +"d8c30700": "getCurrentCap()", +"d8c34127": "isKnownSignature(string)", +"d8c35273": "getHumanNumber()", +"d8c37ecd": "calculateMarketPixelPrice(address[16],uint256)", +"d8c3c1ed": "finalizeIto(uint256,uint256,uint256)", +"d8c42e42": "doublePrice(uint256)", +"d8c4661c": "getNID()", +"d8c4c34e": "KaraOmToken()", +"d8c4cd7d": "saveStudent(uint256,string,string,address,address)", +"d8c57892": "getDecision(bytes32)", +"d8c5c6f8": "disapproveInternal()", +"d8c65cbb": "_setEyesValue4(uint256)", +"d8c681a7": "BaoFengChengCoin(uint256,string,string)", +"d8c6bd6f": "checkMine(uint256)", +"d8c90762": "addTrustedIssuer(address,string)", +"d8c929a8": "getCurrentRoundRewards()", +"d8c9334b": "TextChanged(bytes32,string,string)", +"d8c94cd5": "_addToken(address,uint256)", +"d8c97f34": "transferFromVest(uint256)", +"d8ca713a": "getStringMember()", +"d8ca8a55": "distributeIQTTokenBatch(uint256)", +"d8cb2d4a": "STOCoin()", +"d8cb4aa3": "bonus(address)", +"d8cb52d3": "getFreeRabbit(uint32,uint256,uint8,bytes32,bytes32)", +"d8cba0ba": "transferWallet(address)", +"d8cba7a2": "phase3Cap()", +"d8cbce53": "calculateDividendsFor(address)", +"d8cc3c5e": "get_milestone_information(uint256,address)", +"d8ccd0f3": "free(uint256)", +"d8cdac0d": "window0StartTime()", +"d8cecc7b": "MdedicalChainCoin()", +"d8cf9184": "getServerCreationFee()", +"d8cfd15a": "LogB(bytes32)", +"d8cff716": "NBAT101(address,address,address,address,address)", +"d8d07637": "poll(uint32)", +"d8d0819f": "CoinVilla()", +"d8d1d507": "whiteListContracts(address)", +"d8d1efea": "releaseTimeSecond()", +"d8d34c89": "ManualTransfer(address,uint256)", +"d8d3b1a4": "TIER1()", +"d8d40cee": "gameNumber()", +"d8d45d13": "setShipping(string)", +"d8d4a75e": "AUD_Omnidollar()", +"d8d4ec02": "checkVesting(address)", +"d8d5740c": "XMLYToken()", +"d8d5a200": "payBountyManager()", +"d8d736c5": "_makeDepositForPeriod(bytes32,uint256,uint256)", +"d8d777f2": "_attack(uint32,uint8,uint64)", +"d8d8e2f2": "test_23_assertGasUsage200Boards()", +"d8d9159d": "pr0coinAddress()", +"d8da3bc0": "getCurrentPotSize()", +"d8da708f": "preico_enddate()", +"d8db583f": "getFreelancerSkills(address,address)", +"d8dbb475": "JSONpath_string(string,string)", +"d8dbb712": "OfferCancel_internal(uint8,bool)", +"d8dbe4c9": "setContractManager(address)", +"d8dd2b79": "emitTransferFeeRateUpdated(uint256)", +"d8de5a41": "splTransferFrom(address,address,uint256,uint256,uint256)", +"d8df44fd": "maxTimeBonus()", +"d8df5dc1": "lockAmount()", +"d8df9aad": "setDayWithdrawCount(uint256)", +"d8e09dac": "setTrustee(address,bool)", +"d8e1b9ba": "explore2(uint256,address,bool)", +"d8e20e2c": "brickPrice()", +"d8e223b5": "issueMedal(address)", +"d8e2e392": "admin_set_isRequireData(bool)", +"d8e30740": "ETH_RECEIVED_CAP()", +"d8e3c1c8": "buyPlatinum(uint256,uint256,uint8,bytes32,bytes32)", +"d8e3c33f": "gridToIndex(uint256,uint256)", +"d8e476ab": "icoPhaseDiscountPercentage2()", +"d8e4ab0d": "isOmegaContract()", +"d8e4f9d9": "teamTwo()", +"d8e5ae6a": "Etheramid()", +"d8e5c048": "scheduleCall(address,uint256,uint256)", +"d8e5c797": "concat(string,string,string,string)", +"d8e5e64e": "getAsAddressOrZero(bytes32)", +"d8e60616": "OFNOG()", +"d8e6b249": "findPossibleDelegatorsOf(address)", +"d8e71b35": "ico3receivedTotal()", +"d8e74ed7": "monsterStrength()", +"d8e86854": "setPrices(uint256,uint256,uint256,uint256)", +"d8e8752a": "resetUsedToday(uint8,uint8)", +"d8e8b177": "interestOf(address)", +"d8e9602b": "tierCap(uint256)", +"d8e963b3": "PRE_ICO_END_TIME()", +"d8e97a56": "averageTimestamp()", +"d8eb3a98": "withdrawAuctionBalance()", +"d8eb6af3": "redeemEthers(address,uint256)", +"d8ebfe5a": "interaddmoney(address,uint256,uint256)", +"d8ec55ed": "meh()", +"d8ec696f": "__address1__()", +"d8edbd79": "ZTToken()", +"d8ee2ff4": "_buys(uint256,uint256)", +"d8ee796f": "founderAllocatedTime()", +"d8eea572": "getMinInt64()", +"d8eebd8d": "spentBalance()", +"d8eef28b": "ordersFor(uint256,uint256)", +"d8f012c6": "StatelessFactory(string,string,string)", +"d8f06b52": "closeAfterWhitelisted(address)", +"d8f0b9c4": "amountToBeneficiary()", +"d8f0c358": "getSetupParametersCount()", +"d8f163ab": "totalTokensDistributed()", +"d8f248b8": "getForge(uint256)", +"d8f2cd12": "onceSetOwners()", +"d8f2f09f": "china()", +"d8f306a1": "setAvailableToken(uint256)", +"d8f342be": "getBTCETH(uint256)", +"d8f3790f": "ethBalance(address)", +"d8f42fca": "SzeToken(address,address)", +"d8f45fdb": "LICToken()", +"d8f5d098": "privateUnlock(address)", +"d8f6d596": "getSale(uint256)", +"d8f6dcf2": "getTaskById(bytes32)", +"d8f71809": "MAX_COMMISION()", +"d8f9659b": "withdrawnTokens(address[],address)", +"d8f9d144": "changeOwner(string,address)", +"d8f9e51b": "EkoBeerCoin()", +"d8fa191b": "setProviderDetailFields(uint256,bool,bool,uint256)", +"d8faefc9": "fixDistribution(uint8,uint256)", +"d8fbbf31": "removeContractFromWhiteList(address,uint256)", +"d8fbe994": "transferFromAndCall(address,address,uint256)", +"d8fbff9f": "createDroneFromVault()", +"d8fce0d4": "pinchVillain(uint256,uint256)", +"d8fcfd6b": "convertRealTo256(int128)", +"d8fd1ed9": "creatorReward()", +"d8fd2043": "getSkullyById(uint256)", +"d8fd7ae3": "subtractAllowed(address,address,uint256)", +"d8fe1558": "BaseICOTokenWithBonus(uint256)", +"d8fe511f": "tithes()", +"d8fed39e": "tokenSoftcap()", +"d90025d1": "DIVIDEND_FUND_FRAC_TOP()", +"d900a6ae": "hgtSold()", +"d901402b": "getCommitHash(address,uint256)", +"d9019530": "request(address,uint32)", +"d901b98c": "test_1_generationAcrossBlocks_increaseBlocksBy100()", +"d902ac2e": "insert_data()", +"d9037441": "setEthFundDeposit(address)", +"d9037522": "removeVoter(address,string)", +"d903c5ae": "minimumTDEContributionInWei()", +"d904094e": "ownerCancelArmyMarketplace(uint256)", +"d9057007": "supportsInterface(address,bytes4)", +"d9067fbd": "initCongress(address)", +"d9076129": "secondBonusPercent()", +"d907e02e": "_cancelBet(uint256)", +"d9082962": "totalRefunded()", +"d9089b11": "_processDividends(uint256)", +"d9099f67": "endPreICOStage3()", +"d90a28c0": "fullProfit()", +"d90a8224": "getNumberOfSuccessfulDeals()", +"d90a88cd": "getContentReplies(uint256,uint256)", +"d90b02aa": "left80(uint256)", +"d90b4958": "completeProject(bytes32)", +"d90c1759": "dayFor(uint256)", +"d90c2861": "Albertheijn()", +"d90cdfb4": "getCanvasInfo(uint32)", +"d90d5b58": "copyright(address)", +"d90d870b": "adminSetPercent(uint256)", +"d9106264": "clearAuth(string)", +"d910c805": "MAX_POWERBALL_NUMBER()", +"d9114476": "addAudit(bytes32,uint256,bytes32)", +"d912d248": "transfertOwnership(address)", +"d912ebb2": "tokensIssuedIco()", +"d9134c46": "isGlobalConstraintRegistered(int256,address,int256,address)", +"d9135493": "AdPotato()", +"d913dea2": "UsdRateSet(uint256)", +"d9144448": "upgradeProposal(address,address,address,uint256)", +"d9144712": "numberClaimToken()", +"d914cd4b": "addPool(address)", +"d915562b": "isControlled()", +"d9159f60": "sealedBy()", +"d915cdbd": "investBalances(address)", +"d916d8fd": "getPlayersCountByGame(uint256)", +"d916ec32": "getEmissionProviders()", +"d917863e": "addExchangeTestAccounts(address,address)", +"d9178993": "maxPeriodDuration()", +"d917deb5": "Donate()", +"d91921ed": "addBalance(uint256)", +"d9194d2c": "toggleTransferable(bool)", +"d9194fcb": "setCEO(address,bytes)", +"d91aee02": "getTotalGamesParticipated()", +"d91c98d3": "startingBlock()", +"d91ca13e": "EquinoxCoin()", +"d91d81c6": "preIcoEndAt()", +"d91dc952": "timeLock(address,uint256)", +"d91e1c63": "totalGambles()", +"d91e24c2": "TIMEToken(address,uint256)", +"d91f3f33": "BookERC20EthV1Dec()", +"d91f68a2": "currentMessageNumber()", +"d92126fc": "NewFees(uint256,uint256,uint256)", +"d9214848": "CONFIGURE(bytes32,bytes32)", +"d921eb78": "isRefund()", +"d9226ced": "_setMaxAssets(uint256)", +"d922aa30": "core(uint256,address,uint256)", +"d922b6ab": "stage_1_tokens_scaled()", +"d922cd12": "InsightChainToken()", +"d922d5c8": "TimeLockedController(address)", +"d922f603": "Purpose()", +"d923a0be": "setLoyaltyWallet(address)", +"d923c99e": "getRecordByRow(uint256)", +"d9244bf9": "maximumHodlDuration()", +"d9246bec": "activateICO(uint256)", +"d9249e7e": "PuppiesCore()", +"d924c660": "shift_right(uint32,uint32)", +"d9269cb4": "at_permille(uint256)", +"d92782ac": "sumICOStage5()", +"d927b5ad": "addDistributionPeriod()", +"d928a3d8": "_getSchellingRoundSupply()", +"d928e32e": "ERC20Basic(string,string,uint8,uint256)", +"d9296e45": "totalWeiFunded()", +"d92c4f7c": "AirContactToken(uint256,string,uint8,string)", +"d92ca5b4": "tokensTeam()", +"d92cb5b0": "WinRound(address)", +"d92d5bb3": "ADSToken()", +"d92d7056": "option20name()", +"d92da722": "processBuyRequestFiat(string,uint256,address,uint256,uint256)", +"d92da8f8": "bountySupplyRemaining()", +"d92dc325": "MintAndTransferToken(address,uint256,bytes32)", +"d92ebe46": "createDAO(address,uint256,uint256,uint256,string,string,uint8)", +"d92ec71b": "addDeal(uint256,string,string,uint256,bytes32,string)", +"d92ed48d": "rebalanceBuckets()", +"d92fb5e9": "newClaimer()", +"d9300e30": "checkIfAllALCDistributed()", +"d9305ba7": "LOG_OwnerDeposit(uint256)", +"d930a90b": "testFailMoveBalanceDueToInsufficientFunds()", +"d93112e3": "totalEarlyStage()", +"d9326337": "PiaoPiaoToken()", +"d932b248": "AssetISR()", +"d932ed92": "MarriageCertificates()", +"d933b5f2": "SLABSToken()", +"d933c1fb": "XYOracleBonus()", +"d933dac7": "view26()", +"d9357438": "getInfoByAddr(address)", +"d9359419": "payoutERC20(string)", +"d935bac3": "test1Vote()", +"d935c8b4": "totalEthSales()", +"d935e0a7": "BBCC(uint256,string,uint8,string)", +"d936547e": "whitelisted(address)", +"d9368ba2": "getUserOptState(address,address)", +"d93761fb": "transferSKM()", +"d937ed44": "grantVestedEDEXContract()", +"d9386789": "coreTeamMemberTwo()", +"d9386c9f": "cofounderVUPDestination()", +"d939727d": "setMaxTokenNumbers()", +"d939c960": "fundRecipient()", +"d93a0a8e": "newClassPlayer(uint256,uint256,uint32,uint32,uint32,uint32,uint32,uint32,uint32)", +"d93a64a2": "updateDebris(bytes32,uint8,bytes32,address)", +"d93b4451": "Authorise(bytes16,address,address)", +"d93b4ee7": "disableLogic(address)", +"d93d6ad0": "isKeyHolder(address)", +"d93da7f0": "ROUND_5_PRESALE_BONUS()", +"d93dbeff": "calculateLevel(bytes8,bytes5)", +"d93debd5": "registerDappAddress(address)", +"d93e5aeb": "count_next_address(address,uint256)", +"d93e7573": "disown(bytes32)", +"d93eeb5c": "safeTransferManyFrom(address,address,uint256[],bytes)", +"d93ef85f": "Photos()", +"d93fabfa": "addSeller(address)", +"d94073d4": "PT()", +"d94085cc": "FindMyFish_EnterBarcode(bytes32)", +"d9409bc5": "WFCC()", +"d940c3ee": "processPayroll(address,uint256)", +"d94123b8": "channel_api()", +"d94178c2": "getvalue(string)", +"d9417b6a": "balanceWosPoolToWosSystem()", +"d9417d69": "wikiRemoveTokenFrom(address,uint256)", +"d941c4ad": "prepare(bytes32)", +"d94288de": "totalFeatures()", +"d94389bd": "__char(bytes1)", +"d94395e2": "lastCitizenPaid()", +"d943c8b6": "oldHolders(address)", +"d9441f14": "playerMsgs(uint256)", +"d944534a": "generate(uint256,address,string)", +"d944c749": "ADVISOR_FOUR()", +"d945799f": "removeLockFund(address)", +"d94585bd": "proveAndClaim(bytes,bytes,bytes)", +"d9468475": "findRecentInterest(address)", +"d946af8f": "addNodeAddress(uint256,address)", +"d9474ad7": "unlockedProvider(address)", +"d9479692": "contract_name()", +"d947c8d1": "transferSketch(address,uint256)", +"d947e234": "offerGuardianVend(uint256,uint256)", +"d948d468": "forward(bytes)", +"d94929fe": "setTokenSaleRounds(uint256[5],uint256[5],uint256[5],uint256[5],uint256[5],uint256[5])", +"d94a0a7d": "findNextwaitPairBetIDs(uint256,uint256)", +"d94a75bc": "MELON_CONTRACT()", +"d94acc0a": "distributeVSN(address[],uint256)", +"d94b9843": "toContractAddr()", +"d94c7c29": "updateTokPerLockRate(uint256)", +"d94ca0f9": "approvePrimordialTokenAndCall(address,uint256,bytes)", +"d94d0316": "timeIncrease()", +"d94d0787": "EthlyteToken()", +"d94fd026": "applyPixelChange(uint256,uint256,uint256,uint256,uint256[])", +"d94fe832": "idOf(address)", +"d95030cb": "ticketTransfers(uint256,uint256)", +"d9506c5f": "startSettle(bytes,uint8[2],bytes32[2],bytes32[2])", +"d950aec6": "splitWinnings(uint256)", +"d950c432": "multiFreezeWithTimestamp(address[],uint256[])", +"d950cc3c": "getUserCap()", +"d9510215": "withdraws()", +"d9515238": "forward_funds(uint256)", +"d951d39a": "tokensIssuedForBonusRangeThree()", +"d951d7ec": "updateMIN_BET(uint256,uint256)", +"d951e357": "bonusFourthWeek()", +"d9520c9a": "allTokenOwnerOnStart()", +"d9527fa7": "buyShares()", +"d95374ce": "pendingJackpotForHouse()", +"d95402e7": "Redeem()", +"d95405f2": "lockTokenDays(address,uint256,uint256)", +"d95425e6": "TXwithCode(bytes32)", +"d95431cd": "lookupFeaturedSprites(uint256)", +"d9548e53": "isExpired(uint256)", +"d954a949": "setDeal(address,bool,uint256,uint256,uint256)", +"d954af09": "revealBid(bytes32,uint256,address,address,address,uint256,uint256)", +"d954bd4a": "ICO_TIER_LAST()", +"d954cbcb": "amountInvested()", +"d95514a8": "Regulator()", +"d955ec17": "setMiniumInputEther(uint256)", +"d95660be": "timeNow()", +"d956634f": "claimTokensAndRefund()", +"d9573c1a": "taxEth(uint256,address)", +"d9575ec5": "registerNameXID(string,uint256,bool,uint8)", +"d95808f0": "lastBlock_f3()", +"d9583497": "acceptFulfillment(uint256,uint256)", +"d9592676": "packKey(uint8,uint128)", +"d9597016": "multisetCustomGasPrice(uint256[],address[])", +"d95983c3": "Destroy(address,address,uint256)", +"d959868a": "total_no_of_CTD()", +"d959cbd2": "fMul(uint256,uint256)", +"d959e244": "left25(uint256)", +"d95a0aa5": "setDirectMintLimit(uint256)", +"d95a2d42": "lendGovernmentMoney(address)", +"d95a820f": "LogStartPreICO()", +"d95ab72d": "getMemberWallet(address)", +"d95ace6f": "checkSigned(bytes32,uint8,bytes32,bytes32)", +"d95b6371": "isOperatorFor(address,address)", +"d95c6092": "StartreasureToken(uint256,string,uint8,string)", +"d95efb98": "genesisAddress(address)", +"d95ffc08": "myEthBalance()", +"d9606ca1": "WINE(uint256,string,string)", +"d96073cf": "swap(uint256,uint256)", +"d960924d": "dtAddEthBalance(address,uint256)", +"d960ede1": "sectionPrice(uint256)", +"d96152c3": "executeRuling(uint256,uint256)", +"d961de44": "domainConnector(bytes32)", +"d9629e06": "casinoGames(uint256)", +"d962a68b": "buyTokensByUSD(address,uint256)", +"d962c51e": "redeemByTranche(bytes32,uint256,bytes)", +"d962dd99": "setCompte_43(string)", +"d9637826": "safe_sub(uint256,uint256)", +"d964f28a": "TokenAiNetworkToken(address,address)", +"d9652cb1": "startTimestampOfBonusPeriod()", +"d965ea00": "getMemberLength()", +"d9663f6a": "START_PREICO_TIMESTAMP()", +"d966cfc3": "totalAllocatedToAdvisors()", +"d967f752": "rentMachine(address,uint256,uint256,uint256)", +"d968595f": "isValidProposal(uint256)", +"d968dab1": "chipBalanceOf(address,address)", +"d9696054": "readInfoList(address,uint256,uint256)", +"d969b919": "Etherplanet()", +"d969ead4": "countpro(uint256)", +"d96a094a": "buy(uint256)", +"d96a22b8": "windowBonusStep1()", +"d96a8687": "XMPToken()", +"d96aee49": "MultipleConstructorTest()", +"d96bcd8f": "randomTargetAssign()", +"d96bfbb3": "resetUser(uint256,address)", +"d96c0991": "quitFromAirdrops()", +"d96c26c9": "submitTransaction(address,uint256,bytes,bytes,bytes)", +"d96c30a4": "checkTime(address,uint256)", +"d96c550a": "_preValidatePurchase(address,uint256,uint8)", +"d96cb018": "icoCap()", +"d96cc905": "toB32(uint256,uint256,bytes,address)", +"d96d7ea2": "PRE_EXECUTION_GAS()", +"d96db2ec": "OfferToRealm(uint256,uint256)", +"d96de4ce": "AdminDrawError()", +"d96e1f76": "icoStatus()", +"d96e5565": "testThrowsRetractNotRetractable()", +"d96ed505": "minGasPrice()", +"d97036c2": "ARM1Token()", +"d9703dac": "getResoMethod()", +"d97049bb": "regs(uint256)", +"d97095f3": "AST()", +"d970c19b": "raiseCoinsSeeded(address,uint32,uint256,uint256)", +"d9710278": "TwoFucksToken()", +"d9719e56": "CROWDSALE_SHARE()", +"d971da94": "priceUSDcETH()", +"d972bc59": "setICO_Contract(address)", +"d972e8ad": "getTranche(uint256)", +"d972ea3e": "dragon()", +"d9740383": "SAWJewelleryChain()", +"d9741bd9": "PinMoToken()", +"d975767b": "eLitecoin()", +"d975f3b7": "withdr(uint256)", +"d977076e": "getExtraBets()", +"d9779fbe": "currentTokenSupply()", +"d977a59c": "getCurrentRateByStage()", +"d977b282": "getValue(address,address,uint256)", +"d9784223": "getEscrowAndHash(bytes16,address,address,uint256,uint16)", +"d9785451": "timerMax()", +"d9787517": "getTotalPossibleTokens(address)", +"d978a0d3": "setFinancialOfficer(address)", +"d9795f66": "usersNTD()", +"d9797076": "CoinBroSupply()", +"d979e906": "getXNKPurchased()", +"d979f5aa": "setHolder(address)", +"d97a9c39": "resetContent(string,address,string,string,string,uint256,uint256)", +"d97b0a6e": "Workcoin()", +"d97b14f0": "sendAdvisory(address,uint256)", +"d97c5be5": "losePooling()", +"d97cec3f": "transferMultiSameValue(address[],uint256)", +"d97cf075": "onlyBouncerExecuteCall(address,uint256,uint256,bytes)", +"d97d4f52": "FOUNDERS_LOCK_DATES(uint256)", +"d97dec19": "transferAll(address,address,uint256,address,uint256,uint256,address)", +"d97e38d6": "getApprovedBuyerForIndex(address,uint256)", +"d97fc929": "CommitSolutionHash(bytes32)", +"d9803cb2": "addOfficer(address)", +"d9823996": "withdraw(uint152,address,uint256)", +"d982466d": "getPlayerAwardByRndNo(uint256,address)", +"d98299a0": "RedBlue()", +"d9829cbc": "getRewardAndPrepareWithdraw()", +"d982a84e": "citadelAddress()", +"d9844e25": "hexAddress(bytes32)", +"d9852ca9": "nbDispute()", +"d985f122": "RelayToolsTest()", +"d9875c93": "stageNow()", +"d988a0f9": "Payoutnextrefund()", +"d989f5f2": "productOwners(address,uint256)", +"d98a977d": "TestWorldSnapshotInternal(uint256)", +"d98ae811": "transferDay(uint16,address)", +"d98b094c": "communityPeriodsNumber()", +"d98b2fbf": "getOverviewsCounter(uint256)", +"d98b43f7": "removeOracleAddress()", +"d98b9bb5": "placeBid(address,uint256)", +"d98bce37": "batchBurnAssets(uint256[])", +"d98bf529": "LimitTop()", +"d98c08b5": "CryptaurDepositoryTest()", +"d98c1524": "getPortfolio(bytes32,address)", +"d98d011d": "getCandidateKey(bytes,bytes,bytes,bytes)", +"d98de8a5": "isCrydrViewRegistered(string)", +"d98e14bd": "STAT_COUNT()", +"d98e2997": "addMiningToken(address,uint256)", +"d98f47fe": "recieveEscrowTransfer(address,uint256)", +"d98f4ea2": "sumICOStage7USD()", +"d98f6088": "blockDelay()", +"d9901ce4": "DappToken(uint256)", +"d991c58f": "mintMaster()", +"d99202c5": "STCDRListing()", +"d9923a16": "Account_timePayout(address)", +"d992aa70": "createBounty(string,uint256[])", +"d992bd5b": "testResultNotZero()", +"d9934a8c": "holdAddress4()", +"d993693c": "LOTTYcoin()", +"d9946793": "shareHolderBalanceOfAtTime(address,uint256)", +"d9946a79": "PERSONAL_CAP()", +"d9948af7": "sumICOStage1USD()", +"d9964d92": "getResourceName(uint16)", +"d9967889": "BalanceOf(address)", +"d9969061": "prove(bytes32,uint256)", +"d9971e92": "reject(uint64,string)", +"d99727cc": "removeBonus(uint8)", +"d9972b96": "isAuthorized(address,bytes4)", +"d997598b": "HoChiMinh()", +"d997933f": "canBreedWith(uint40,uint40)", +"d997a153": "transferBatchIdempotent(address[],uint256[],bool)", +"d997ccb3": "payMe()", +"d9987c07": "ReturnToOwner(address,uint256)", +"d998d0d5": "chunkNr()", +"d99929db": "getAssetIdTypeSequenceId(uint256)", +"d99969df": "DUNE_BUGGY()", +"d999741e": "grantFoundationToken()", +"d999b17e": "CROWDSALE_PHASE_3_START()", +"d999f132": "optionDescription(uint256)", +"d99a8dc3": "submit(string)", +"d99a9d20": "_setTransferFeeProp(uint256)", +"d99bb9f7": "removeOwnership()", +"d99c6c76": "_invest(address)", +"d99d83e3": "txsPerHour(uint256)", +"d99dbdbe": "changeBookState(uint256,uint256)", +"d99dd314": "companyTimeLock()", +"d99f8bd8": "VarnixToken()", +"d99fe20d": "dexTestApprove(address,address,uint256)", +"d9a0b299": "deactivateClaim()", +"d9a18f6d": "totalTokensForSaleDuringICO1()", +"d9a19a7a": "MMOTOKEN()", +"d9a2a083": "TeamWalletUpdated(address,address)", +"d9a2fff5": "airDropPercent()", +"d9a3988d": "LogPollApproved(bytes32)", +"d9a3c199": "testSaleToken()", +"d9a457fe": "endRound(address)", +"d9a4ad8b": "shouldHadBalance(address)", +"d9a4cc33": "_finalizeSale(bool)", +"d9a50120": "SaniCoin()", +"d9a52ab3": "getForkMigrationPercentageBonusDivisor()", +"d9a569f5": "OfferPlay(address,uint8,uint8)", +"d9a57382": "propertyIdToEscrow(uint256)", +"d9a5b0a7": "testHighestTranchNotExact()", +"d9a6c6db": "FactbarDeed()", +"d9a6cf81": "transferableUntil()", +"d9a6e2de": "VST(string,string,uint8,uint256)", +"d9a7556f": "indexThreads()", +"d9a8748c": "fundAccount()", +"d9a8e212": "GOLDQ()", +"d9a96c92": "LegalToken()", +"d9a96f9b": "saleManagerAddress()", +"d9aa1881": "tokenDestroyed()", +"d9aa5543": "newDoc(bytes32,uint256,string)", +"d9ab1ec9": "smallCount()", +"d9aba9ce": "getProduct(address)", +"d9abedb4": "take_fees_eth_dev()", +"d9ac03a6": "getCurrentCertificateNonce(address,address)", +"d9ac9a88": "getAuctionTotal()", +"d9aea707": "modifyCeo(address)", +"d9af3691": "verifyCertificate(address,uint256)", +"d9afa38b": "payDividends(address,uint256)", +"d9b02ddf": "setGeneral(uint32,uint8,uint8,uint16,uint16,uint16,uint16,uint32[4],uint32[4],uint8)", +"d9b058bd": "setOraclizeGasprice(uint256)", +"d9b158b1": "angelInvestorsWallet()", +"d9b238ea": "test_insert_findWithHintNotTightBound(int256)", +"d9b25a24": "proxyBuyTokens(address)", +"d9b36043": "TJFucks()", +"d9b4abf5": "marketplace_controller_v2()", +"d9b5134c": "getTotalExchanged(address)", +"d9b5618c": "TimeBroker()", +"d9b596c7": "generateRand()", +"d9b5b5ca": "exponential(uint256,uint256)", +"d9b5c4a5": "nodeRegistry()", +"d9b627dd": "CancelledByBuyer(bytes32)", +"d9b6aec4": "allInvestments()", +"d9b6b197": "tempAdvisorsTeam()", +"d9b7d154": "applyForTask(uint256)", +"d9b7d41b": "createFootballer()", +"d9ba32fc": "getWhitelistStatus(address)", +"d9ba8ea4": "finishLastRound()", +"d9bb57c6": "removeGameManually(address,address)", +"d9bb6102": "HealthCashMock()", +"d9bc9873": "getCanvasPaintedPixelsCount(uint32)", +"d9bcc65b": "setSeedContract(address)", +"d9bccfd6": "getWarrantyPrice(address,uint256,uint256,uint256)", +"d9bd0799": "clearPeriods()", +"d9bd2468": "getToken(uint256,address)", +"d9bdc10c": "getPlayerHasGetFree(address,address)", +"d9bdd6fa": "createCDPLeveragedAllDai()", +"d9be976c": "GainmersTOKEN(uint256,uint256,address)", +"d9bf3187": "setOutcome(int256,uint8,bytes32,bytes32)", +"d9bf8238": "setWinery(address,bool)", +"d9bfa73e": "orderEpoch(address,address)", +"d9c01911": "mintIdentityToken()", +"d9c090a0": "updateRoleName(address,bytes32)", +"d9c1a344": "balanceTotalOf(address)", +"d9c1ac25": "transferAllERC20Token(address,uint256)", +"d9c24acb": "_unlockedAmount(uint256)", +"d9c263f8": "purchaseWithEth(uint256,uint256,uint256,address,bytes)", +"d9c27cc6": "setPep(address)", +"d9c3193d": "setSpaceshipPrice(uint16,uint256)", +"d9c397f6": "gmtFund()", +"d9c39fca": "setSilverContractAddress(address)", +"d9c3d3c9": "checkReturn()", +"d9c4870e": "beneficiaryAddress()", +"d9c522ec": "daiRate()", +"d9c52d27": "getDiscountTrancheEnd(uint8)", +"d9c55ce1": "fill()", +"d9c57bcc": "importExchangeSale(uint256,address,uint256)", +"d9c67404": "getMerkleRoot(bytes)", +"d9c682a7": "borrowerReturnFiatPerEthRate()", +"d9c6925e": "AccountIsNotFrozenForReturn(address)", +"d9c693cb": "emergencyLock()", +"d9c7041b": "ownbalance()", +"d9c76d61": "coolHero()", +"d9c779ce": "_buyP3D(uint256)", +"d9c7ddfa": "_updateBurnRate()", +"d9c850f4": "getItemKindCount()", +"d9c88e14": "ownerWithdraw(address,uint256)", +"d9c97699": "__callback(bytes32,string,uint256)", +"d9ca0b7f": "transferRoutingCode(bytes32,address)", +"d9caa3d2": "submit(bytes32)", +"d9caaada": "minPreContribution()", +"d9caed12": "withdraw(address,address,uint256)", +"d9cba1a1": "MulTraToken()", +"d9ccf695": "strayToken()", +"d9cd6046": "BuyTicketSeed()", +"d9cd9273": "Arycoin(address,uint256,uint256,uint256)", +"d9cd98b0": "withdrawDevFees(address)", +"d9ce2451": "setLeaf2(uint256,uint256)", +"d9cea519": "getDealInfo(uint32,uint64,uint64,uint64)", +"d9cfc182": "getHighestPriceAt(uint256)", +"d9cff93a": "last_result(address,address)", +"d9d0b091": "AddMarking(bytes32,bytes32,int256,uint256)", +"d9d14d37": "numOfMiningTimes()", +"d9d1ceaa": "draw(uint256,bytes32[])", +"d9d1d4bb": "getCompte_28()", +"d9d1e0e5": "createBlock(uint256,uint256,bytes32,bytes32,bytes32,bytes32)", +"d9d1f5d9": "removePendingExplore(uint256,uint256)", +"d9d210b8": "changeHelper(address,bool)", +"d9d2d058": "Splitter()", +"d9d34ce1": "isForkingMarketFinalized()", +"d9d3cc78": "seriesByName()", +"d9d578e5": "airDropSetup(address,uint32,uint256)", +"d9d60b52": "getGameState(address)", +"d9d61655": "getOwnedTokens(address)", +"d9d61a10": "GetUserSafesLength(address)", +"d9d73887": "Diana()", +"d9d770bb": "_triggerPVEStart(uint256)", +"d9d84531": "getRemainingKingdoms()", +"d9d8b2ee": "creationInvestmenting()", +"d9d958ec": "setUint8(uint8,uint8)", +"d9da0142": "cancelEscrow(bytes20)", +"d9da2738": "changeOfficialAddressIfNecessary(address)", +"d9da486a": "initialEcologyAccount(uint8)", +"d9da76de": "DailyMint()", +"d9daa497": "getStageTargetAmount(uint256)", +"d9daae78": "CCH_Seaport_1()", +"d9dac92c": "acceptDiscipleVend(uint256)", +"d9dad80d": "ownerOf(uint256,uint256)", +"d9db1f55": "deprecate(string,string,string)", +"d9db3c73": "revealVoteOnSpecialProposal(bytes32,bool,bytes32)", +"d9db9d89": "globalSupplyAfterPercentageLogic()", +"d9dbd382": "FUTX()", +"d9dc7fcd": "EVM()", +"d9ddafb3": "exchangeTransfer(address,uint256)", +"d9de1e98": "HuuumanStandardToken(uint256,string,uint8,string)", +"d9def89a": "buyShitClones()", +"d9df2878": "CryptoCollectorContract()", +"d9e0dc59": "getLocation(address)", +"d9e19a91": "setAccountValue(uint16,uint8,uint8,int64)", +"d9e34038": "ODCToken()", +"d9e39e50": "getTransferDetails(address)", +"d9e4fa6a": "setUsdPerKEther(uint256)", +"d9e50186": "setWeiMin(uint256)", +"d9e55f7a": "getAllowedToMine(address)", +"d9e5a50b": "getSnakemasterReq()", +"d9e68b44": "left100(uint256)", +"d9e73095": "MiracleToken()", +"d9e79c72": "admin_dividend(uint256)", +"d9e7c8ca": "createRace(uint256,uint256,uint256)", +"d9e7ee1c": "new_game(uint256,uint256)", +"d9e8843f": "payRent(uint256)", +"d9e947f3": "kickOutMember(address)", +"d9e95a98": "addVoter(address,string)", +"d9e9c745": "decreaseShardBalance(address,uint256)", +"d9ea1b47": "Raffle_Finished()", +"d9ea372b": "myfichain()", +"d9ea9bfa": "createBtcAddressHex(uint256,int256,uint256,int256)", +"d9eac337": "MegaWattContract()", +"d9ead22b": "accountForClose(uint256)", +"d9eb547b": "extractCLNfromMarketMaker(address,uint256)", +"d9eb5947": "flatFee()", +"d9ec0508": "testThrowTransferNotEnabled()", +"d9ec3018": "submitSpendLimit(uint256)", +"d9ecad7b": "breed(uint256,uint256)", +"d9ece4c7": "changeMaximumContributionForPrivatePhase(uint256)", +"d9ee369a": "withdrawDifferentToken(address,bool)", +"d9ef1ee3": "insert(string,uint256)", +"d9ef58a5": "thisAddr()", +"d9f00023": "SBGToken()", +"d9f01878": "centralMinter()", +"d9f02210": "StarbaseMarketingCampaign()", +"d9f0354d": "buildMilestone(uint256,uint256,uint256)", +"d9f035aa": "cardList(uint256)", +"d9f0cf04": "createAuctionWhenPaused(address,address,uint256,uint256,uint256,uint256)", +"d9f165dc": "updateFactory(address)", +"d9f1a1a9": "PublicBallot(address,string,string)", +"d9f2ac8a": "decr()", +"d9f300ce": "referedRateBonus()", +"d9f38388": "RequirementChanged(uint256,bytes32)", +"d9f3afff": "addCurrency(string,uint8)", +"d9f47e41": "totalDevelopmentFundBalance()", +"d9f4ecbb": "lastProfit()", +"d9f4f56e": "_ethRefund()", +"d9f58923": "GlobalConstraintRegistrar()", +"d9f69e4e": "addUserWhoBuy(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"d9f754a3": "LogSetWithdrawLimit(address,uint256)", +"d9f7e285": "returnExcedent(uint256,address)", +"d9f7eacf": "removeGains(address,uint256)", +"d9f80c65": "setMinInvesment(uint256)", +"d9f81b83": "timeWithoutUpdate()", +"d9f861b1": "getFreelancerInvoices(address,uint8)", +"d9f884bf": "BIONICCOIN()", +"d9f8a3c3": "lastTransactionReceivedInWei()", +"d9f8a4e2": "calcCurrentTokenPrice()", +"d9fa1e78": "PractiParlezCrowdSale()", +"d9fa8c54": "unClaimedToken(address)", +"d9fa9335": "houseKeeping()", +"d9facbe0": "isObserver(address)", +"d9facc80": "MerchantWallet(address,string,address)", +"d9fb6963": "stateSetLocked()", +"d9fb7413": "lockTimeLeft()", +"d9fc4b61": "safeTransferFrom(address,address,address,uint256)", +"d9fc8026": "getPubKeyArr(bytes32,uint256,uint256[])", +"d9fca769": "setWinner(address)", +"d9fcb31f": "comm_channel()", +"d9fdd155": "isLegendaryPart(uint256,uint256)", +"d9fe0137": "_transfer_byProxy(address,address,uint256,bytes)", +"d9fe1045": "MidasDiscountToken()", +"d9fe60f3": "DTHPool(address,address,uint256,string,string,string)", +"d9feb8ce": "loserTwo()", +"d9feeeb6": "fillMyOrder(uint256)", +"d9fefb93": "getData_34()", +"d9fefbf8": "addData(uint256,uint256,bytes32)", +"d9fefd6c": "bountyTokenTimelock()", +"d9ff4ad8": "burnFrom(address,uint256,bytes)", +"d9ff8e9d": "setWalletOut2(address)", +"d9ff8ffc": "BetAnB()", +"d9ff94b7": "setRegionPurchasedAt(uint256,uint256)", +"da00586b": "houseKeep()", +"da00a1f4": "setGetFree(bool)", +"da0225db": "belongsTo(address,uint256)", +"da0239a6": "remainingSupply()", +"da025051": "freelancePlayer(address)", +"da02b6cf": "computeWinner(address,uint256,uint256,address,uint256,uint256,uint256)", +"da02f5f3": "updateIsVerified(address,bool)", +"da0321cd": "addresses()", +"da037fd1": "confirmPerfectReception()", +"da040c0f": "purchasingAllowed()", +"da04197e": "Duration(uint256)", +"da04f82b": "addUserManager(address)", +"da05277e": "ImpactRegistry(address)", +"da05f535": "RefundCrowdsaleFactory(address)", +"da062d68": "ExCToken11()", +"da06d96c": "_tokensToEthereum(uint256)", +"da074874": "getRemainingEthAvailable()", +"da0774ad": "getCallFeeScalar(uint256,uint256)", +"da081204": "littAdmins()", +"da08c5a3": "setTransferWhitelist(address)", +"da09118e": "addTokenGrant(address,uint256,uint128,uint16,uint16)", +"da09c72c": "devAddr()", +"da0a599e": "EjariRules()", +"da0a5fe0": "TestToken(string,string,uint256)", +"da0b0682": "beginGame()", +"da0b0c36": "getNumDesignatedReportNoShows()", +"da0bba7b": "changeOraclizeConfig(bytes32)", +"da0bba90": "sendPrize(address[],uint256[],uint64)", +"da0d76f8": "betContractDOWN()", +"da0e1451": "distributionForRefers(uint256,uint256,uint256)", +"da0ef68b": "ICO_END_DATE()", +"da0f039d": "MaxTotalSupply()", +"da0f3877": "postFreezeDevCATDestination()", +"da0f57d0": "confirmWithdraw(uint256)", +"da0fab61": "BlockContract()", +"da1070da": "newEscrow(address,address,bytes32)", +"da11f709": "bank1()", +"da122e02": "Fishbank(address,address,address)", +"da128527": "finalizeUpdateState()", +"da12e9ef": "TokenHolder(address,uint256)", +"da13610c": "rewarding(address)", +"da1441cd": "KudosBank(uint256)", +"da147d32": "tradeTracker()", +"da14c723": "setCustomBuyer(address,uint256)", +"da14e3b2": "transferAndFreezeTokens(address,uint256)", +"da16241b": "Platopay()", +"da17835f": "FermionToken()", +"da178cb0": "plot()", +"da17c21b": "BlockchainMoneyEngine(uint256,string,string)", +"da18bcef": "getMin(uint256[])", +"da1919b3": "mintFor(address,uint256)", +"da1a13ce": "fitsTokensForSaleCap(uint256)", +"da1aaa59": "_withdraw(address)", +"da1ad97f": "clearHpbNodeCache()", +"da1b2d9d": "comDrop(uint256,uint256,uint256,uint256)", +"da1b4359": "uploadFinish()", +"da1b620b": "getTarget(string)", +"da1b95a6": "DAO(address,address,bytes32,bytes32,address,address,address)", +"da1bd8ab": "setupTrustedAccounts()", +"da1d7711": "createHive()", +"da1eb542": "ceil1(int256,int256)", +"da1edb38": "shareLastTen(uint256,uint256)", +"da1ee417": "MoveChain(uint256,string,uint8,string)", +"da1f149c": "SECURRO()", +"da1f6433": "AtomUX()", +"da1fe7d5": "configureDomain(string,uint256,uint256)", +"da1ff555": "cliffTeamTokensRelease()", +"da2216ef": "getContractCreatedTimeById(bytes32)", +"da2242b8": "createActivity(uint256,string,uint256,uint256)", +"da228f9c": "bountyTokensCreated()", +"da22ec07": "storing()", +"da233128": "getCrowdsaleContract()", +"da23c057": "editAd(uint256,string,string,string,string,bool,bytes32,bytes2,uint8,bytes4)", +"da23d18b": "updateOnSaleSupply(uint256)", +"da2424ae": "setPI_edit_22(string)", +"da24b08c": "UsdPerKEtherUpdated(uint256,uint256)", +"da257cb4": "setMinRevenue(uint256)", +"da25c0cd": "ThisExternalAssembly()", +"da25de3c": "remainingBalance()", +"da262f58": "setTokenInfo(string,string)", +"da26358a": "unregisterVendor()", +"da26663a": "getPrice(uint32)", +"da26c241": "approvePauseChange(bool)", +"da26d0b9": "addAuction(uint256,address,uint128,uint128,uint64,uint64)", +"da26ebc2": "getPayeeCount()", +"da26f7f6": "CIFR()", +"da274488": "getMotd()", +"da27ab1f": "getFreeShitClone()", +"da27cb0f": "Lottery(string,uint256,uint256)", +"da280fe5": "resetHasAutoVote()", +"da284dcc": "expirationTime()", +"da28c81a": "updateKYClist(address[])", +"da293136": "TestCrowdsaleController(uint256,address,uint256)", +"da2a97d8": "GetCurrentNumbers()", +"da2aa615": "addRandomFight2Death(address,uint256)", +"da2b2589": "GenExtWeightList(uint8)", +"da2b7416": "testBitsAndFailIndexOOB()", +"da2bbfc7": "setTokenURIBase(string)", +"da2c0460": "gameGiftOnceAmount()", +"da2d7b70": "userSubscriptionsLength(address)", +"da2d8720": "payJackpot2()", +"da2d8c88": "updateRestrictedStockSendTime(address,uint256)", +"da2dcea6": "returnTokenMulti(address[])", +"da302fc3": "lighthouseLib()", +"da306946": "ShareDATA(string)", +"da30d418": "cancelDist()", +"da311588": "getCoin(uint256)", +"da31cf2a": "getStageEtherRaised()", +"da323c94": "getSketch(uint256)", +"da328377": "ownerSetStakeCommence(uint256)", +"da333ca6": "payOut(uint256)", +"da337465": "getPenguinsByOwner(address)", +"da34b7f3": "_transfer(uint256)", +"da35762a": "getPI_edit_16()", +"da359dc8": "setBytes(bytes)", +"da35a26f": "initialize(uint256,address)", +"da35d581": "DaoHubAccount()", +"da3678df": "transferTokenByContract(uint256,address)", +"da36d217": "lockupTok(address,uint256)", +"da36fd03": "FundingAccepted(address,uint256,uint256)", +"da374157": "changePopulous(address)", +"da38abb3": "randomGen(address)", +"da38daba": "getLeftCoordinate(bytes1)", +"da38f805": "TaskToken()", +"da38fe31": "ConsentDirectory()", +"da392f06": "availableNow()", +"da397985": "CBOToken()", +"da3986e4": "getTAOIds(uint256,uint256)", +"da3b6b35": "totalHashRate()", +"da3c300d": "currentFee()", +"da3cbf96": "getShipClass(uint32)", +"da3cd674": "GetDChainDOTHash(bytes32,uint8)", +"da3d18e8": "PlusUltra()", +"da3d23a9": "GetEnd()", +"da3d454c": "borrowAllowed(address,address,uint256)", +"da3d7d7f": "reconfigure(uint256,uint256)", +"da3e0fd1": "getAuctionsById(uint32[])", +"da3e3397": "approveToken(address,address,uint256)", +"da3f8c38": "Amethycoin()", +"da3fb6f7": "mainSaleRateP2()", +"da4077b9": "finishHim()", +"da421df5": "pageFiles(uint256,uint256)", +"da42eea5": "setRedeemWallet(address)", +"da440a1d": "wallcoinToken()", +"da446958": "totalTokensCap()", +"da4493f6": "activationTime()", +"da44d275": "viewWinners()", +"da44e034": "maximumTokensForForth()", +"da46098c": "setAllowance(address,address,uint256)", +"da465d3f": "saleSharesAvail()", +"da46a73c": "setGameOperator(address)", +"da46e48e": "setGLA(uint32)", +"da46e6c4": "transferFeeIncurred(uint256)", +"da46eda1": "setBlockDotDifficulty(uint256)", +"da46fe62": "ethereumToTokens(uint256,uint256)", +"da4751c0": "setMinPrivateSaleCompanyBuy(uint256)", +"da4778c2": "delayHours()", +"da4793ac": "setMaxSecurityGuardDelay(uint256)", +"da47d856": "getService(bytes32)", +"da481ce0": "DemeterCrowdsale(uint256,uint256,uint256,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"da489997": "addAsset(address,address)", +"da49613c": "ownedfunction()", +"da498084": "addTokenHolder(address)", +"da499f6f": "SupportAddOn(uint256,address,uint256)", +"da49cdb5": "getLostTokens(address)", +"da4a22dc": "MXN_Omnidollar()", +"da4a76c0": "becomeGameSponsor()", +"da4a77aa": "isRatifier(address)", +"da4a8ef6": "SettingsSet(address,uint256,uint256)", +"da4b5e29": "contains()", +"da4d0756": "vehicleExist(address,string)", +"da4d2615": "Gomblot()", +"da4f2899": "isUserInGroup(bytes32,address)", +"da5136b8": "setWhitelistAddress(address,address)", +"da5140fc": "lockTokensForAddress(address,uint256,uint256)", +"da5196e0": "getmemreqdetails(uint256,uint256)", +"da51bbd9": "luckyPendingIndex()", +"da51f168": "GetDayReward()", +"da5269a6": "getListOfConsents()", +"da5341a8": "issueMaxNomins()", +"da53462c": "initialize(address,address,uint256,uint256,uint256,uint256,address,address,uint256)", +"da535758": "lockUp(address,uint256,uint256,uint256)", +"da547dcf": "preIcoHardcap()", +"da548e29": "priceExpirationBlockNumber()", +"da5520cd": "HeroNodeToken()", +"da57736f": "stageThree()", +"da5950a4": "tokenBought(uint256,uint256)", +"da5a9366": "getAppBase(bytes32)", +"da5abf5d": "payment_returned(uint256)", +"da5b1f5c": "buy50()", +"da5c0a7c": "testDisown()", +"da5c5b55": "noVotes(uint256,address)", +"da5c7ec2": "WNCT()", +"da5da3b9": "initializeTokenSaleWithToken(uint256,uint256,uint256,uint256,address,address)", +"da5db748": "firstRelease()", +"da5e4489": "resetListing(string)", +"da5e9c62": "whitelistDayMaxStake(uint8)", +"da5ea40c": "computeMerkle(bytes32,uint256,bytes32[])", +"da5f3ac1": "GAME_END()", +"da5f838d": "weisRaised()", +"da5fa890": "_addManager(address)", +"da60278a": "receivable(address)", +"da60d7e8": "BOARD_2()", +"da62a246": "rewardsTokenSupply()", +"da640668": "checkNameOccupied(bytes32)", +"da6443ad": "addAddressToWhitelist(address,address)", +"da649c63": "startSalePhase(uint256,uint256)", +"da652b4a": "summBilborough()", +"da6585ff": "calcSrcQty(uint256,uint256,uint256,uint256)", +"da658f22": "birthPerHundred()", +"da66cb3e": "secondRoundICOTokensLimit()", +"da67ac42": "MIPCoinToken()", +"da682aeb": "onApprove(address,address,uint256)", +"da6838ff": "getIfBonus()", +"da683c63": "Token(string,bytes32)", +"da68d47d": "licenseNFT()", +"da69f1c8": "arrayTest(address[])", +"da6aabbe": "set_sale_address(address,string)", +"da6b31b9": "testErrorTransferToNullAuthority()", +"da6babca": "setNextPrice(uint256,uint256)", +"da6c5832": "CROSAIR_MAX_PRICE()", +"da6d8ca4": "LotteryRecharge()", +"da6dfea7": "setRate(address[],address[],uint256[],uint256[],bool)", +"da6e11a5": "approveFactoryContract(address,bool)", +"da6efb01": "winAddressOf()", +"da6f76b5": "updateEpisode(string,uint256)", +"da70db17": "HireGoToken()", +"da710422": "getTokenAmountForWei(uint256)", +"da7150b9": "Qwidex(address,address,address,uint256,uint256,uint256)", +"da721672": "checkFloatingSupply(address,uint256,bool,uint256)", +"da72c1e8": "adminTransfer(address,address,uint256)", +"da7360df": "paymentInternal(bytes32,uint256[],uint256)", +"da73630e": "addTeam(address,string)", +"da737613": "placeBet(bytes22)", +"da73f0f9": "conversion_rate()", +"da748b10": "pausedUntil()", +"da74c5a1": "citiesSold()", +"da74ce27": "tokenCapForFourthMainStage()", +"da7545d0": "titleCount()", +"da756ba7": "BEAT()", +"da75b901": "deployStepTwo()", +"da76d5cd": "withdrawBalance(uint256)", +"da7855a3": "reclaimLocalNodeFee()", +"da78d655": "owner1OK()", +"da7911e1": "getOrderListLengthFactor()", +"da79a9fc": "setTxAsSpent(bytes32,bytes32,uint256)", +"da7bd3e9": "getVestingScheduleEntry(address,uint256)", +"da7c0ad4": "SaleScheduled(uint256,uint256)", +"da7c6a42": "registrations(bytes32)", +"da7ccce9": "test_oneValidEqInt1()", +"da7d0082": "isCertification(address,bytes32)", +"da7d249f": "UnsetBlockForSale(uint256,uint256,address)", +"da7d57f9": "startRareRaffle(uint256,uint256)", +"da7d7827": "getSubscriptions(address,string)", +"da7d86fd": "softDelete(bytes32)", +"da7e019e": "AlterContactName(address,bytes32)", +"da7e6fdf": "TokenDrop(address[],uint256[])", +"da7eadd4": "totalAffiliateDDT()", +"da7fc24f": "setBackend(address)", +"da7fc7c5": "payoutCompleted()", +"da7fd1f0": "gemmyMusicSupply()", +"da7ffbd4": "generateRandomSpell(uint8[14],uint32)", +"da801f20": "approveAndCall(address,uint256,address,address,bytes32,uint256,uint256,uint256)", +"da81b09b": "lastPeriodStarDate()", +"da8267e3": "hasDirectorAccess(address)", +"da82a035": "sweepCommission()", +"da8300d2": "initialEnemyCombination()", +"da832237": "SMALLEST_TOKEN()", +"da834ac4": "getPayoutNumerator(uint256)", +"da83a649": "onlyAdmin(bool)", +"da850601": "MKYCToken()", +"da8567cb": "AldiyoCoin()", +"da857f2c": "reduceLastWeekStake(address,uint256)", +"da85868e": "fifthExchangeRate()", +"da883e6a": "addItems(uint256[],uint256[],address)", +"da88a831": "updateBaseTokensPerEther(uint256)", +"da89970b": "hasntStarted()", +"da8a01a5": "CROWD_WEEK2_BONUS()", +"da8a46e0": "listUserRecastsFrom(address,bytes32,uint256,bool)", +"da8ad6b6": "getTAO(address)", +"da8c229e": "controllers(address)", +"da8d2f35": "ChannelDeleted(address,address)", +"da8e2890": "payNihilum()", +"da8e44d8": "registerColor(string,uint256)", +"da8ee786": "transferFromContract(uint256)", +"da8f410a": "ApprovedToken()", +"da8f54d8": "testVali(address,uint256)", +"da8f9fe5": "DetailedERC20(uint256,string,string,uint8)", +"da8fb7cd": "ASSToken(uint256,string,uint8,string)", +"da8fbf2a": "pauseMinting()", +"da909b09": "setExchanger(address)", +"da91254c": "whoAmI()", +"da918f76": "placeBlock(uint16,uint16)", +"da9287d1": "acceptHybridization(uint256,uint256)", +"da9332bb": "addCompanyURL(string,string)", +"da93d0d1": "setPrice()", +"da93dfcf": "give(address,bytes32,address)", +"da93f938": "maxAppeals()", +"da942ab3": "issueTokensExternal(address,uint256)", +"da94e770": "YBVToken()", +"da9534b4": "Stex()", +"da9590cb": "addPublicSaleWallet(address)", +"da95ebf7": "requestWithdrawal(address,uint256)", +"da96bbcd": "publicEventTokens()", +"da977038": "volumeBasedBonus(uint256)", +"da979b8d": "SpecialRate(address,address,uint256,uint256)", +"da98655e": "getNullAddress()", +"da9893dd": "Resource(address,string,string,string)", +"da9ab565": "changeId(string)", +"da9ad094": "changeParameter(uint32,uint32)", +"da9b3cb4": "getGameBid(uint256,uint256)", +"da9b90c4": "TOKEN_FIRST_DISCOUNT_MULTIPLIER()", +"da9bca21": "numActiveMembers()", +"da9bdbfc": "CKCoin()", +"da9bf54c": "icoPhaseDiscountPercentage4()", +"da9c2697": "GaillardTokenSale()", +"da9c273d": "cancelInvoice(uint256)", +"da9c6a46": "getReplyCount(uint256)", +"da9c87fa": "changePayRate(uint256)", +"da9d0f6b": "withdrawCustom(uint256,address)", +"da9d56d7": "getBidIds()", +"da9d95bc": "commonWithdraw(address,uint256)", +"da9da572": "tryAirdrop()", +"da9dd8bf": "isAddressVerified(address)", +"da9e13aa": "getProviderSales(address)", +"da9eadac": "remit(address,uint256,bytes)", +"da9eeaeb": "PetroNetworkToken()", +"da9f40b8": "setAssetFileLink(string)", +"da9f4875": "freezeTokens()", +"da9f6918": "MultiSigWallet(address[],uint256,uint256)", +"da9f7550": "requestRandom()", +"da9f84a6": "rerollValue(uint256)", +"daa08539": "mintShares(address,uint64)", +"daa0ab0e": "majorityForTeam()", +"daa0f79f": "LEGAL_EXPENSES_ADDR_1()", +"daa147f3": "redeemLevAndFeeByStaker()", +"daa170ca": "difficultyBalance()", +"daa17f49": "marketplaceAddress()", +"daa1d7d4": "maximumPercentageOfDaysSupply()", +"daa21e0e": "testBitSetSuccess()", +"daa232ac": "_bonusRatio1()", +"daa283c8": "__callback(bytes,string)", +"daa3a163": "isUpgradeable()", +"daa44bf8": "getInStreamOf(address)", +"daa45281": "_addTo(address,uint256)", +"daa4cf88": "getCurrentStageIndex()", +"daa50ee0": "DSTMultisig()", +"daa5f48b": "findbit(uint256)", +"daa69c9e": "killDividentContract(uint256)", +"daa6f417": "howMuchTokensAvailableForExchangeFromStock()", +"daa7370f": "onFailure()", +"daa86216": "getAllowedContractsCount()", +"daa89fef": "issueNewHeldCoins(address,uint256)", +"daa94ab1": "frozenAccountProfit(address)", +"daa9604d": "byPonzi(address)", +"daaa50c9": "transferWithCustomReservingNet(address,uint256,uint256)", +"daaa6b5d": "setReleasedAddress(address,address)", +"daaadd8e": "arr(address,address)", +"daab88a6": "createEngine(uint256)", +"daac1f64": "reqfee()", +"daac518a": "playerTokenAddress()", +"daacb24f": "right42(uint256)", +"daad98f4": "socibit()", +"daae717c": "setIndividualMinCap(uint256)", +"daae7e98": "setCompte_20(string)", +"daaf3d2e": "attack(uint256,uint256,address)", +"daafe0a5": "setPrice(uint32)", +"dab0537b": "change_p2(uint256)", +"dab09999": "returnMyEthBalance(address)", +"dab122de": "dInit(address,address,bool)", +"dab12beb": "SmartSweep()", +"dab23f7c": "__callback(bytes32)", +"dab306b1": "votingFee()", +"dab30ccc": "addBonusPeriod(uint64,uint64,uint256,uint8,uint256,uint8)", +"dab3ed63": "withdrawMyInvestmentsBack()", +"dab41935": "TootyrToken()", +"dab43e6d": "PreSale3DAPP(address)", +"dab46553": "removeOracle()", +"dab4c65e": "totalDowSold()", +"dab4cb87": "gameValue()", +"dab4d1c1": "PixelPrice(uint16,uint16,address,uint256)", +"dab5cec2": "setExtraTokensPercent(uint256)", +"dab5f340": "setRoot(bytes32)", +"dab5fdc4": "DOWN_totalBets()", +"dab680dc": "getGlobalInfo()", +"dab78820": "ERC20Rescue(address,uint256)", +"dab80075": "Signature(address,string,string)", +"dab80d6f": "addSponsor(address)", +"dab8194f": "enableGame(address)", +"dab8263a": "weiPerToken()", +"dab83b9a": "selltokens0()", +"dab88ad7": "VI6()", +"dab8a18b": "specialTransfer(address,uint256,uint256)", +"dab8c01a": "Zorro01Token()", +"dab8ef38": "addRooms(string,uint256)", +"dab8fa73": "setPackage(string,uint64[3])", +"dab91e87": "linkToMasterWallet(address)", +"dab93a93": "PolarisDEX(address,address,address,uint256,uint256,uint256)", +"dab951ba": "arrayFunc(int256[10])", +"dab9938e": "setIcoBeginDate(uint256)", +"dab9afa4": "Test12Address()", +"dabb0531": "getCharacter(uint256)", +"dabb37d4": "Lakshmi(uint256,string,string)", +"dabb624b": "rate_ETHUSD()", +"dabb6360": "percentage_of_three()", +"dabb6778": "vestingTeamWallet()", +"dabbbd0b": "sharesChainToken()", +"dabbd2bd": "removePlayerFromServer(uint256)", +"dabbd670": "team2Token()", +"dabc0c37": "isPassOwner(bytes32,address)", +"dabc706e": "getProposalCost()", +"dabd2719": "setDiscount(uint256)", +"dabd2eb2": "changePrice(bytes32,uint256)", +"dabd5d65": "addDays(uint256)", +"dabdc1f2": "ChangeActiveDigger(address)", +"dabecd8d": "_newBid(bytes32)", +"dabed8be": "Update_UserWinningHistory_Data(uint32,uint32)", +"dabf7dc8": "PayoutDividendEarly(uint256,bool)", +"dabf7ec4": "helper(uint256)", +"dabf8246": "EventAuction(address,uint256,uint256,uint256,uint256,uint256)", +"dac00420": "maxHalvings()", +"dac05adc": "test_1_ensureVoteWorks_increaseBlocksBy100()", +"dac1182e": "signBBODocument(bytes,bytes)", +"dac17430": "lastVoteTime()", +"dac194f1": "setAutoInvest()", +"dac1e5e5": "_computePVPReward(uint256,uint256)", +"dac32ba9": "modifyPolicyTo(address,uint8,uint8)", +"dac34674": "setNextGameSettings(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"dac3ab88": "getCurrencyHash(uint256)", +"dac3f6d2": "queryFusionData_ext(uint256)", +"dac47a71": "SetGiftTime(uint256)", +"dac4fcdb": "getNewCustomPrice(address,address)", +"dac54b8a": "returnHoldings(address,uint256,uint256)", +"dac54daa": "OPLTest()", +"dac5b8ae": "TokenSale(address,uint256,uint256,uint256)", +"dac645bd": "getBUI(bytes32,uint256)", +"dac649c8": "NEWC()", +"dac6af5e": "SWIFTH(address,address[],address)", +"dac796bb": "getInvestorBalance(address,address)", +"dac7c858": "TOKEN_TRANSFER_PROXY_ADDR()", +"dac84ee4": "moveToReceiver(address,address,uint256)", +"dac8df25": "DEVELOPER_CUT()", +"dac90466": "_error(bytes32)", +"dac9555d": "allocate_slot(address)", +"dac9882a": "offChainAddresesValidCount()", +"daca5ce0": "bonusTokensPercent()", +"dacaeb07": "pledge(bool,uint256)", +"dacc8e11": "getTPrice(uint256)", +"dacd06fc": "KongQiCoin()", +"dacd4472": "PixoArenaFounderToken()", +"dacdbb93": "removeAccountSearch(address)", +"dace4557": "setUnlockTime(uint256)", +"dacef51b": "payincount()", +"dacf18c7": "getDeathCoin()", +"dacf9483": "getUIntValueConverted(bytes32,uint8,uint256)", +"dacfa06f": "manualDraw()", +"dad0128d": "calculateAdjustedFiguresForBattle(address[3],address[3])", +"dad03cb0": "returnError()", +"dad13822": "setMonsterClassSiteSet(uint256,uint256)", +"dad22781": "AdvancedArtificialIntelligenceSafetyDefense()", +"dad24541": "PresaleToken()", +"dad2771d": "signReceipt(uint256,int256)", +"dad30cfc": "test_transfer_to_contract_with_fallback()", +"dad38294": "PowTokenHashedBase()", +"dad39151": "multiApprove(address,address[],uint256[])", +"dad52c72": "_itemCancelMarkets(uint256)", +"dad59f35": "raisedEthers()", +"dad5c2e3": "validAstroCount()", +"dad5c3ee": "chainyShortLink(uint256,string)", +"dad5fda3": "vester()", +"dad6b482": "userHasPositveBalance(address)", +"dad72332": "claimUnsold()", +"dad788d9": "isJobExpired(uint256)", +"dad7ad9e": "aix()", +"dad7c095": "transferWithAllowance(address,address,address,uint256)", +"dad7e4d2": "Aaa()", +"dad86b45": "teamETHUnlock3()", +"dad90035": "withdrawalRequests()", +"dad901be": "callWithdraw()", +"dad950f4": "InvestorPart()", +"dad98b52": "MonsterBitToken()", +"dad99119": "ddf()", +"dad99989": "burnCoins(address)", +"dad9a423": "setDuesIn(uint256)", +"dada85c3": "setAirdropOn(uint8)", +"dadad8fe": "addNewStreetName(string)", +"dadb20be": "ChangeTokenName(address)", +"dadc89eb": "setPreIcoDates(uint256,uint256)", +"dadcb23a": "getRevenueFactor(uint256)", +"dadcb460": "bumpPointer()", +"dadce8b0": "setExpiration(uint64)", +"dadd9e8e": "withdraw_some_amount(address,uint256)", +"daddff33": "claimController()", +"daded88e": "addMessageRequest(address,address[],string)", +"dae072d9": "GameWon(address,uint256)", +"dae1bd84": "AddChip(address,uint32)", +"dae1ddd2": "check_period(address,address)", +"dae1f17a": "getShopOwner(string)", +"dae21454": "toEthereumSignedMessage(string)", +"dae37abc": "cancelParticipation()", +"dae37fac": "spendAvailable()", +"dae392ee": "softFundingGoal()", +"dae3f7e2": "Gralaxious()", +"dae595e5": "getAuctionStart(address,address)", +"dae611c4": "lockUnlockMatchGPForBetting(uint256,bool)", +"dae6f081": "setScrapMinStartPrice(uint256)", +"dae79483": "getMemsize()", +"dae7e05d": "_bonusAll(uint256)", +"dae8865c": "ETHERCToken()", +"dae89f18": "coordinatorAccountIndex(uint256)", +"dae8af77": "getFeeWindowId(uint256)", +"dae9c31b": "ProofPresale()", +"dae9e379": "getFundBalance()", +"daea85c5": "approve(address)", +"daeab905": "issueReceipts(address,uint256)", +"daeb1c98": "PlusToken()", +"daeb860d": "versionAddresses(bytes32,bytes32)", +"daec4582": "AuctionEnded(address,uint256)", +"daec75f3": "buyXwithdraw(bytes32,uint256)", +"daec8128": "mintTokensForFounders()", +"daecc910": "getCKOwner(uint256)", +"daed6726": "ETHCollected()", +"daee4dd6": "readCheck(address,uint256)", +"daee9e35": "level2Bonus()", +"daeed3a6": "rateFinalStage2()", +"daef0e92": "stopCurrentGame(uint256)", +"daef4df8": "addCar(string,address,uint256,uint256,uint256)", +"daef569f": "insChainTokenLedger()", +"daf017a9": "GetRocket(uint32)", +"daf059c6": "createGuess(uint16,uint64,uint64,uint16)", +"daf13a47": "reserveLockup()", +"daf161e2": "getThirdAdmin()", +"daf1af19": "Current_balance()", +"daf1db09": "readyForFinish()", +"daf22f4d": "identify(bytes32)", +"daf32370": "getPurchaseAddress(uint256)", +"daf47ba3": "incGenLabFace(uint256)", +"daf488b1": "setReferrerPercent(uint256)", +"daf49451": "BINGToken()", +"daf4f66e": "isLimitEnabled()", +"daf64aa5": "getCompanyDetails(uint256)", +"daf69093": "BLOCKCHAIN_DEPOSIT_BETA_1M()", +"daf6ca30": "saleContract()", +"daf6e5ae": "DeepBrain()", +"daf760d0": "getData_6()", +"daf7f103": "_error(uint256)", +"daf8f438": "startRedeeming()", +"daf9812f": "updateBincentiveErrand(address)", +"daf9a535": "getData_20()", +"dafa1d2d": "burn(string)", +"dafa55a1": "creatureIndexToOwner(uint256)", +"dafae408": "checkThreshold(uint256)", +"dafaf94a": "getOracle(bytes32)", +"dafba12f": "setMAGContractAddress(address)", +"dafc5608": "TransferFeeRateConfirmed(uint256,address,uint256)", +"dafc64c4": "ERC223MintableTokenFactory(address)", +"dafd54a6": "ExaEUR()", +"dafd70c9": "RESERVED_UTILITY_GROUP()", +"dafea207": "smax256(int256,int256)", +"daff0093": "setReference(address,address,bytes32)", +"db00345d": "BookToken()", +"db006a75": "redeem(uint256)", +"db00758a": "getSGNTokenManager()", +"db00b848": "_performGeneric(bytes,address)", +"db00d1a9": "_preValidateCancellation()", +"db0251e9": "contributeMsgValue()", +"db035918": "deployForeignBridge(address)", +"db041965": "fightBetaMonster()", +"db0436c2": "RUNEToken()", +"db04a0ee": "getOrganizerActivationStatus(uint256)", +"db04aef4": "getHoldersLength()", +"db051653": "setEtherFeePercent(uint256)", +"db054134": "mintForReportingParticipant(uint256)", +"db059dfb": "createSsp(address,uint256,string)", +"db05ccfc": "setValue(address,uint256,uint256,uint256)", +"db060e1a": "RESERVED_TOKENS_FOR_FINANCIAL_INSTITUTION()", +"db068e0e": "setExchangeRate(uint256)", +"db06f0c2": "doPresaleMinting(address,uint256,uint256)", +"db078f08": "toggleKey(address,bool)", +"db0827e9": "ashcashToken()", +"db0834cf": "lockedAllocation()", +"db08444a": "toUint(int256,string)", +"db087ad5": "getCurrentPricePerWei()", +"db08ccec": "enjinTeamAddress()", +"db0a087c": "getTypeName()", +"db0aa668": "Bittwatt()", +"db0ad29c": "SocialMediaMarketToken(uint256)", +"db0c154a": "hitCharacter(uint16,uint16,uint8)", +"db0c9a02": "marketSell(uint256)", +"db0d5175": "getTransfer(address)", +"db0d7ce5": "LotteryRoundCreated(address,string)", +"db0db014": "dividendsForAmountAndTime(uint256,uint256)", +"db0dd71e": "addAbility(string,bool,uint8,uint8,uint8,uint256,uint256)", +"db0e127a": "openDoor()", +"db0e16f1": "emergencyERC20Drain(address,uint256)", +"db0ec968": "transfer(address,uint16[])", +"db0edd08": "PubKeyHashAdded(bytes20,uint8)", +"db0fb107": "updateSafeSender(address)", +"db107371": "DecentrEx(address,address,address,uint256,uint256,uint256)", +"db11040f": "LogRegError(address,string)", +"db112977": "Project_Info(uint256)", +"db11ead1": "markContribution()", +"db1227da": "initGameReferred(address,uint8)", +"db122ad4": "committeeJoinVotes(address)", +"db123b1a": "ZRX_ASSET_DATA()", +"db12630a": "fundariaCap()", +"db12999b": "airdropTokens(address,address[],bool)", +"db1366bf": "buyExchangeRate()", +"db136b1e": "createAsset(address,uint256)", +"db15520d": "TPTContributors()", +"db15b72d": "getDInfo(bytes32)", +"db165a76": "createLand(address,uint256)", +"db16d0fe": "optionExist(uint256,uint256)", +"db171211": "returnToSender()", +"db171754": "vestedAddress()", +"db180b2b": "LOCKAMOUNT2()", +"db18c972": "play4(address,uint256)", +"db18f962": "updateSplitandSend()", +"db192761": "Clockpay()", +"db1a71ae": "trackable_likes(address)", +"db1b569f": "previousSender()", +"db1bdd1d": "TheTokenG()", +"db1c45f9": "getAllGames()", +"db1c53e2": "isTransferedUser(address)", +"db1d0fd5": "alpha()", +"db1d68b5": "countryWinnerID()", +"db1eeb51": "MizeCoin()", +"db1f6689": "authorContentByIndex(uint256)", +"db201648": "AppicsFund()", +"db21fc9c": "gettimeback()", +"db22032f": "rentalTimeRemaining()", +"db2307b6": "changeRecvEthStatus(bool)", +"db230b52": "viewScore(address)", +"db239951": "cbAddresses(address)", +"db23c5d7": "icoRuleAdd(uint256,uint256,uint256,uint256)", +"db23f7e3": "veztUserArrayIdentifier(address)", +"db246fda": "withdrawalTimeOf(address)", +"db248091": "assignBonus(address,uint256)", +"db25b407": "listActive()", +"db25c328": "joinToProvider(uint256,address)", +"db25e637": "Strikes(address[])", +"db264a36": "s10(bytes1)", +"db27b0bc": "addUInt(uint256,uint256)", +"db27b8dd": "vestingManager()", +"db299492": "IGFC(uint256,string,uint8,string)", +"db29fd6e": "increaseDistrictCoke(uint256,uint256)", +"db29fe12": "addShareholder(address)", +"db2a0cb7": "HumanStandardTokenFactory()", +"db2ac8d8": "WINTOKENADDRESS()", +"db2becb0": "getWalletFeeSignatures()", +"db2c4e2d": "complexScaleObsTest(address)", +"db2d10a5": "PreICOTokenPushed(address,uint256)", +"db2d5841": "batchRelease(address[])", +"db2e21bc": "emergencyWithdraw()", +"db2ea20e": "arrayTestMulti(address[],address[],uint256[])", +"db2ea5c0": "_callERC165SupportsInterface(address,bytes4)", +"db2f1d83": "TalkCrypto()", +"db3119bb": "manageLink(uint256,uint256)", +"db318833": "_ecAdd(uint256,uint256,uint256,uint256,uint256,uint256)", +"db31dd17": "removeAddressFromWhitelist(address,string)", +"db31fb03": "excessEth(address)", +"db3268d8": "getBU(bytes32)", +"db32be98": "refundICO()", +"db330794": "addToVestMap(address,uint256,uint256,uint256,uint256)", +"db3359f0": "makeNonFungible(uint256,address)", +"db35132c": "WithdrawEther(address,uint256)", +"db3543f5": "setFoundation(address)", +"db35a03d": "allowedSpenders()", +"db36c2e5": "destroyOldCoins(address,uint256)", +"db37ceec": "maxEthContribution()", +"db37e42f": "multisetProofType(uint256[],address[])", +"db383bf2": "MyNewToken()", +"db38b877": "testRsplit()", +"db395d2e": "bonusPercentForWeiAmount(uint256)", +"db39a8e8": "getTokenTransferInsByAddress(address,address,uint256)", +"db39ceac": "MyBalance2(address,address)", +"db3b73db": "getPlatformName()", +"db3c1b94": "EtmPerBtc()", +"db3d8421": "getTotalAngelCardSeries()", +"db3e7f4f": "forgeTokens(address,uint256)", +"db3fab84": "Hamza_Ahmed_Coin()", +"db3fd0b8": "usedReserveSupply()", +"db403747": "mintForYear(address,uint256)", +"db40e896": "stopExchange()", +"db40ed24": "WeGoldToken()", +"db412f39": "preSaleDelivery(address,uint256)", +"db420fe3": "serverAddress()", +"db422e0b": "sendTokensAndRefund(address)", +"db447c04": "getPurchaseDetail(uint256,uint256,address)", +"db45479b": "closeChannel(uint256,address,bytes32,uint256,bytes32,bytes)", +"db456f77": "extraReceiverByIndex(uint256)", +"db45a30f": "buyPlanet(uint256)", +"db475044": "SHITcoin()", +"db478d08": "levelTwoBonus()", +"db47b9c9": "isTokenSupported(address,address)", +"db480704": "HCTToken()", +"db4844f3": "setRequestFailed(uint256)", +"db491d49": "ContributionReward()", +"db491de9": "daysToUnfreeze(address,address)", +"db491e80": "getNote(uint256,uint256)", +"db4ad99f": "constructUserIdentity(address,string,uint32,string,string,bytes32,bytes32,uint8)", +"db4bb866": "bitskiToken()", +"db4bd421": "trackable_record(address,uint256)", +"db4c528b": "increasePositionOnBehalfOf(address,bytes32,uint256)", +"db4cacec": "Other()", +"db4ce763": "DTRExpensiveWallet(uint256)", +"db4cf8e6": "getAccountAddress(uint256)", +"db4d1296": "confirmAdminTx(uint256)", +"db4e1df5": "setBTTSToken(address)", +"db4ecbc1": "CONTRACT_ADDRESS()", +"db518db2": "withdrawFor(address,uint256)", +"db51d62b": "OpenTime()", +"db52e130": "saveString(string)", +"db530222": "nextEndTime()", +"db536d2f": "getDefaultKey(address)", +"db5370c3": "EEAcoin(address)", +"db543fdc": "adviserAndBounty()", +"db5517b0": "snapshots(address,uint256)", +"db5549d8": "TokenBurn(address,uint256,bool)", +"db55bd2d": "authoriseNextAction()", +"db56702b": "firstWeekEndTime()", +"db56c29d": "Billionstrader()", +"db56d26c": "ChangeFiliate(address)", +"db57c429": "createPromoGameItem(address,string,uint256,uint256)", +"db5861ed": "ULA(uint256,string,string)", +"db589907": "setCosts(uint256,uint256)", +"db589bbe": "getInternalDrawings(uint256)", +"db59190d": "C1(uint256)", +"db59c052": "getFreeTokens(uint32,bytes32,bytes32,uint8)", +"db5a2778": "adminAddCountry(string)", +"db5ad407": "setData(bytes32,uint256,uint256,uint256,uint8[])", +"db5b4183": "oracleOutcomes(bytes,address)", +"db5b5799": "setClientSupply(address,uint256)", +"db5b7635": "TokenMacroansyPower()", +"db5c92a7": "getTokensInUSD(uint256)", +"db5c9442": "TRIAL()", +"db5cf9de": "getSpaceshipProductClassByModel(uint16)", +"db5d855b": "getReceiptId(address,address,uint256)", +"db5df447": "redemptionPriceCalculate(uint256)", +"db5eef61": "PredictionMarket()", +"db5f2f31": "calcExchangeRate()", +"db5f5d7c": "usedAPI()", +"db606931": "pointRootNode(address)", +"db618c08": "TestAuditor()", +"db623bd5": "ErrorSendingETH(address,uint256)", +"db624887": "W()", +"db62df0e": "likeTrack(address,bytes32)", +"db6380ec": "tokenCapForMainICO()", +"db638e51": "resetUserRefBalance(address,address)", +"db63e149": "EmployeeWallet(string)", +"db641ab4": "Game_balance_in_Ethers()", +"db642bce": "GoddessToken()", +"db6648c0": "collateralisation(address)", +"db66ef59": "getPublicKeyN()", +"db6727c1": "myBitFoundationPercentage()", +"db680e3d": "getMeterInfoByMonth(uint8,uint256)", +"db681e1d": "GameScored(bytes32,int256,int256,uint256)", +"db681e54": "getGenerationForCall(bytes32)", +"db681e9f": "sendRefund(uint256)", +"db6997ae": "getCitiesData(uint256[])", +"db6a3652": "addOrder(address,uint256)", +"db6aef35": "amountOfWorkpointQueue()", +"db6bb289": "Zygoma()", +"db6bbeb2": "abx_token()", +"db6be534": "end_ts()", +"db6be871": "getAmountByCoupon(bytes32)", +"db6bed22": "addPresaleWallets(address[],uint256[])", +"db6c1831": "bonusSystem(bytes5,uint256)", +"db6c709c": "updateExchangeRates(uint256,uint256)", +"db6c71d6": "rspContract(address,uint256)", +"db6c7286": "CTokenGB()", +"db6c9416": "AgoraToken()", +"db6f1e74": "getUser(uint32)", +"db6f7537": "getPOOL_edit_22()", +"db6f9deb": "rewarded(uint256,address)", +"db6fcf01": "is_destroyed(uint256)", +"db7057fb": "rngId()", +"db714efe": "getBlocks(uint256,uint256)", +"db71c776": "setRateIcoPreICO(uint256)", +"db71d8b6": "FEE_SELECT_LRC()", +"db723e73": "personalMincap()", +"db72496f": "cancelSubscription(uint256,uint256)", +"db737c78": "getToken(uint256,bool)", +"db73bfce": "gameInfo()", +"db7400a5": "createAppInstance(bytes32,bytes)", +"db747f21": "setOraGasLimit(uint256)", +"db74847d": "distributeTratok(address[],uint256[])", +"db74c27a": "backRedPillTokenOwner()", +"db75dd5f": "AQBToken()", +"db76790f": "setAdvisorWallet(address)", +"db76e9c2": "setMemberLevel(address)", +"db77032d": "RATE_SALESTAGE4()", +"db775041": "donation(bytes32,uint256)", +"db775410": "setTypedJackpotWinner(address,uint256)", +"db7757cf": "valueRaised()", +"db78d0ce": "getAirdropAtSnapshot(address)", +"db78f5ef": "withdrawOnBehalf(uint256,string,uint256,uint8,bytes32,bytes32)", +"db79a65f": "resetUserWhiteListAmount()", +"db79e673": "getTradeOfferRecipientItems(uint256)", +"db7a0855": "MZToken()", +"db7a2f42": "projectAgent()", +"db7a4605": "getWallets()", +"db7a80f8": "getContributionUSD(address)", +"db7b87ff": "init(address,uint256,bytes32,uint256,uint256,uint256,bool,bool,address)", +"db7bc073": "refundWhenNotClosed(address)", +"db7ca38a": "XaurmProxyContract()", +"db7d2665": "FundTransfer(address,uint256,address)", +"db7d9065": "assignedAmountToCooperativePartner()", +"db7ed9e7": "addAssessorToPool(address)", +"db7ef562": "_2_nation()", +"db7ef7c6": "verifyEscrowVendor(uint256,address)", +"db7f1e6b": "getInitialEnemyCombination()", +"db7fea95": "WALLET_T8EX_RESERVED()", +"db803a86": "post(string,address[])", +"db80813f": "set(bytes32)", +"db80a787": "emitCourtUpdated(address)", +"db80fbc9": "balanceOfLockup()", +"db82967c": "createUsingProxy(address,bytes)", +"db8298f3": "_commissionTarget()", +"db833e3a": "sellShares(bytes32,uint8,uint256,uint256)", +"db83694c": "getSaleInfo()", +"db8374ee": "buyOracleFor(bytes,address,address)", +"db83d02f": "VREO_SALE_CLOSING_TIME()", +"db84252c": "tokenCreator()", +"db852ee7": "pieceSold(address,address,uint256)", +"db856759": "depositOldTokensFor(address,uint256,address)", +"db856f28": "_updateCard(address,uint256)", +"db85bd78": "registerTraderAccount(address)", +"db86d850": "transferGoo(address,uint256)", +"db87cbcc": "GetPermissionsList(address,address)", +"db88176f": "getQuestion(uint256)", +"db8850bc": "_merge(uint256,uint256)", +"db886f23": "Marketing()", +"db89c044": "reputationOf(address)", +"db89edb2": "BitDailyBot()", +"db8a61d4": "APP_BASES_NAMESPACE()", +"db8b6ccf": "addSubjectMatter(string)", +"db8b7fae": "transform(address)", +"db8bcec4": "MAX_TIME_RANGE_COUNT()", +"db8cee5e": "_generateRandomDna(uint256)", +"db8cfa5a": "HAVtoUSD(uint256)", +"db8d55f1": "getFees()", +"db8d7c39": "disableRestriction()", +"db8e9043": "SetOutRate(uint256)", +"db8ecf34": "registerFreelancer(string,string,bytes32,uint256,uint256,uint256[],string,string,bool,string,uint256,uint8,uint256[],uint256[],string)", +"db8ed8a7": "withdraw_a_bit(uint256)", +"db8ee692": "_price_tokn_ICO()", +"db8f0301": "getAEth(uint256,uint256)", +"db8f2f75": "EthStorageContract(address,address,address[],uint256,uint256,string,string,uint8)", +"db8f5a35": "feesAndBountySupplyRemaining()", +"db8f7fb5": "preDiscountPercentage()", +"db9078b4": "CheckGenChip(uint32)", +"db9090a7": "devTokenWithdraw(uint256)", +"db91095e": "LVXToken()", +"db91774c": "setMinValue(uint256)", +"db9254a5": "_buy(address,uint256,uint256)", +"db9311c2": "getBlocksToNextRound()", +"db93f375": "startTokenVotes(address[],uint256,uint256,uint256,address[])", +"db946a11": "PlayStationChain()", +"db958f18": "FootCoin(uint256,string,string)", +"db95937d": "orderContractorProposal(uint256)", +"db967d05": "endOfPhase3()", +"db97c24d": "uzziToken()", +"db98abd8": "testThrowCancelSellOrderTwice()", +"db98d73f": "setRecordAddress(address)", +"db99800c": "fetchCreatedOrdersForMerchant(address)", +"db9a21bb": "CreateRZM(address,uint256)", +"db9abbd4": "arr(bytes32,bytes32)", +"db9b6775": "testMintThis(int256)", +"db9b7170": "setApproval(address,bool)", +"db9cc410": "createAsset(string,uint256)", +"db9cc99d": "AuctionCancelled(uint256,uint256)", +"db9cd8d3": "tab()", +"db9d28d5": "numDigits(uint256)", +"db9d5d31": "AdminRemoved(address,address)", +"db9dfb35": "newTeamOnEnd(uint16,uint64,uint64,uint64)", +"db9f16a8": "takeOffItem(uint256,uint8)", +"dba01cfe": "distributePENT(address[],uint256,uint256)", +"dba07858": "_removeFromList(address[],address)", +"dba0e9bb": "ethertoteDevelopmentWallet()", +"dba1a5f9": "allocateFunds()", +"dba1ac3d": "getEnforceRevisions(bytes20)", +"dba21586": "ProofOfTrevonJames()", +"dba21657": "askForEther(uint256)", +"dba22cb0": "transferPlanet(address,uint256,uint256,uint256)", +"dba232e3": "POPToken()", +"dba2a570": "_tune(uint256,uint256)", +"dba2d875": "forcedRefund()", +"dba31911": "bookSpaVisit(uint256)", +"dba33c03": "saleTokensCents()", +"dba3e704": "setMinimumContribution(uint256)", +"dba4c85c": "GetWithdrawBalance(address)", +"dba56cb8": "buyTokensFromContract(address,uint256)", +"dba5e917": "SelfDestruct()", +"dba6f7be": "verifyCreateSig(address,uint256,uint256,bytes32,bytes)", +"dba72a4e": "ICONIQ_SALE_OPENING_TIME()", +"dba7ef7d": "Bookie(address,address)", +"dba86ab6": "claimCardboard(uint64)", +"dba8be6e": "chickenTokenDelegator()", +"dba989ca": "_bonusTime2()", +"dba9a8a2": "setTrCut(uint256)", +"dba9daab": "pickBigWinner()", +"dbaaa2dd": "MIN_CONTRIBUTION_PRESALE()", +"dbaab3e1": "setMarketingAdmin(address)", +"dbaad1e5": "ownerDied()", +"dbab2f97": "merge(address[],bytes32,bytes32,int256,int256)", +"dbab7f1b": "UserInfoContract()", +"dbac248b": "MannaCoin()", +"dbac4cbf": "GetContractStateTerminatedSecDep()", +"dbac7806": "milestone()", +"dbacc237": "holderOf(uint256)", +"dbad21af": "tickets1kprice()", +"dbaea636": "UVPToken()", +"dbaec0fd": "createPattern(bytes32,string,address,string)", +"dbaf023d": "LogoVote()", +"dbaf2145": "requestWithdrawal()", +"dbaf5ce7": "changeRatesToken(uint8,uint256)", +"dbaf7247": "getValueByIndex(uint256)", +"dbafd0f2": "getTotalSeconds()", +"dbafdbb6": "setBalanceLimit(address,uint256)", +"dbb094ef": "Crowdsale(address,uint256,address,address)", +"dbb173d9": "test_updateKey_decreaseNoHint(int256)", +"dbb183c2": "setAuthorizedLogicContractAddress(address)", +"dbb24554": "updatePriceDenominator(uint256)", +"dbb34667": "getDsoStake(uint256)", +"dbb3cef3": "developer_update_Terms_of_service(string)", +"dbb47d77": "claimPlayerWinnings()", +"dbb56384": "encodeUtxoPosition(uint256,uint256,uint256)", +"dbb57a4b": "transferOne(address,uint256)", +"dbb61238": "maxDelay(uint256)", +"dbb62f24": "setDataMining(address)", +"dbb633f1": "ownerWithdrawalDate()", +"dbb72f67": "nullify(address)", +"dbb80e42": "allTokensLength()", +"dbb82429": "_randByRange(uint256,uint256)", +"dbb833df": "investWithoutId()", +"dbb8a305": "getBetName(uint256)", +"dbb98cae": "limit7()", +"dbb9deda": "goNext()", +"dbbabdfe": "getnum(uint256)", +"dbbb119c": "addMaster(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint32,uint32)", +"dbbb206f": "buy(address,address,address,address,address)", +"dbbbe8df": "transferByCrowdsale(address,uint256)", +"dbbc6fcc": "isPayableEnabled()", +"dbbc853b": "tokenURISuffix()", +"dbbd3a71": "addClaim(address,bytes32,string,string,address,uint256)", +"dbbd4865": "isEarlyBirdsStage()", +"dbbd78da": "getAccountNickname(address)", +"dbbd7934": "findItem(address[],address)", +"dbbd9a04": "ALLOC_MAX_PRE()", +"dbbdad8c": "generateReleaseTokensSchemaHash(address,address,uint256,bytes32)", +"dbbdae63": "updateSeller(address)", +"dbbdf083": "register(uint256,address)", +"dbbe2ff9": "setCirculationShares(string)", +"dbbf01b2": "setAddUsers(address,address,string,string,uint256)", +"dbbfcd7c": "getCOR()", +"dbc02821": "XTVNetworkContractAddress()", +"dbc0c085": "teamMultisig()", +"dbc139be": "LogMigration(address,uint256)", +"dbc1f226": "suicide(address)", +"dbc27799": "pendingNewRound()", +"dbc2783d": "DoNotDeployThisGetTheRightOneCosParityPutsThisOnTop()", +"dbc2d042": "consumerAddress()", +"dbc2ef49": "getNotUsedToken_()", +"dbc38940": "executeTxn(uint256)", +"dbc45228": "newProposal(address,uint256,bytes,bytes)", +"dbc488e2": "ESlotsCrowdsale(address)", +"dbc53c07": "read(uint16,uint16)", +"dbc56297": "claim(address,bytes32,bytes32,uint8,bytes32,bytes32)", +"dbc57971": "getIcoStatus()", +"dbc5d002": "sendQuery(string,uint256,uint256)", +"dbc65f85": "preBuyPrice2()", +"dbc69521": "totContribution()", +"dbc7464b": "getEquippedItemId(address,uint256)", +"dbc837c5": "insurer()", +"dbc8817d": "GOLDENRATIO()", +"dbc91396": "cancelOrder(uint128)", +"dbc91ed1": "subset(string,uint256,uint256)", +"dbc933bc": "p_withdrawDevHoldings()", +"dbc9ef42": "_removeAuction(uint40)", +"dbca1207": "getLastSeed()", +"dbcbaca4": "investorInfo(address)", +"dbcbb362": "setTransperRun(uint256)", +"dbcc4658": "getSmartContractByPosition(uint256)", +"dbcc6caf": "second_release(uint256)", +"dbccb926": "CreatedToken(address,uint256)", +"dbcd258d": "blocksPerHour()", +"dbce1ff7": "referralRateInviter()", +"dbceb005": "split(uint256)", +"dbcf0531": "ContractFullfilled(address,int256)", +"dbcf194a": "GetInventoryCount(address)", +"dbd01de1": "cluster()", +"dbd05767": "RBA()", +"dbd0e1b6": "getSeller()", +"dbd16774": "IGMathsContract()", +"dbd19619": "round_earnings(uint256)", +"dbd1be77": "getDrone(uint256)", +"dbd1df92": "setTitulaire_Compte_1(uint256)", +"dbd229ff": "totalSupplyMarket()", +"dbd2a4c5": "promoterInfo()", +"dbd2ac60": "distributeCallback(uint256,uint256)", +"dbd3100e": "getBuilding()", +"dbd3313e": "PizzaPoll()", +"dbd3c372": "safeMulticastTransfer(address[],uint256[],uint256[],bytes)", +"dbd3cd62": "withdrawPayment(uint256)", +"dbd3d021": "findNextSecond(uint256,bytes2)", +"dbd42da5": "ranked()", +"dbd4a422": "synthetixState()", +"dbd4a8ea": "setBase(address,uint64,bool)", +"dbd54b62": "setMasterAuth(address)", +"dbd55fb3": "ACTION()", +"dbd594bb": "FoundsTransferd(address,uint256)", +"dbd5ef6d": "setFeeConfig(uint256,uint256,uint256,uint256)", +"dbd64ae9": "closeSale3()", +"dbd6da8c": "isUidSet(string)", +"dbd6f5c1": "allocationAddress()", +"dbd760ca": "PriceThreeDisable()", +"dbd7fd13": "saleMilk()", +"dbd84659": "receiveTokenByClientAccount(string,uint256,address)", +"dbd848e3": "ICO_Ended()", +"dbd8987c": "contractFeePercentage()", +"dbd8c25f": "BasicTokenImpl()", +"dbd91792": "multiowned()", +"dbd9a4d4": "setAllowances()", +"dbdb8b56": "eosGAS()", +"dbdb96c2": "updated_policy_payload()", +"dbdbbb28": "getRoundBonusRate()", +"dbdc275d": "createB()", +"dbdd5ae6": "actOnBehalf(bytes,uint256,uint8,bytes32,bytes32)", +"dbdd5d74": "swapsFor(address)", +"dbddcdb7": "getScouponBalances(address)", +"dbde1988": "transferFromWithoutReward(address,address,uint256)", +"dbde2f19": "min(uint8,uint8)", +"dbdef054": "setFinalizeAgent()", +"dbdf7fce": "resetCounter()", +"dbdf8538": "_emitWorkStarted(uint256,uint256)", +"dbdff2c1": "getRandomNumber()", +"dbe01790": "getAllHpbNodes()", +"dbe1053d": "sendEthBackToUsers()", +"dbe201c7": "getAllBidsByAdslot(uint256)", +"dbe2bc84": "_suspendMarket(address)", +"dbe2c85b": "checkFiscalVerify(bytes32)", +"dbe2e296": "pushToPot()", +"dbe3010c": "WINNER_SHARE()", +"dbe3071a": "Kitchen()", +"dbe3117a": "tier2Timestamp()", +"dbe35007": "getAuctionsLength()", +"dbe3e92f": "provenanceOf(address)", +"dbe54524": "set_CWC_Address(address)", +"dbe55e56": "platformAddress()", +"dbe587b9": "CashPokerProPreICO()", +"dbe5bab5": "getOpenOrders()", +"dbe5ca78": "POAP()", +"dbe5fe9d": "setMaxCoinSides(uint8)", +"dbe6c02f": "isOwnerOrOperator(address,address)", +"dbe705ea": "fetchCreatedOrdersForMerchantByAdmin(address)", +"dbe7e3bd": "claimed(uint256)", +"dbe992af": "updateEntry(uint256,address,uint256)", +"dbe9eebf": "getPricePointsLength()", +"dbea52d8": "lotteryPrice()", +"dbeab275": "createRoutingCode(bytes32)", +"dbeabd21": "getPplsAddr(uint32)", +"dbecc372": "Example(uint256)", +"dbecfb25": "koth_v1b()", +"dbed1e88": "getUnlockTime(address)", +"dbed3a30": "GamePoolAddress()", +"dbedf9e4": "TB01()", +"dbee0dea": "releaseTimeLock()", +"dbeea819": "tokenGrantees(uint256)", +"dbef0790": "returnUnsoldTokens(address)", +"dbefe789": "NUM_OF_PHASE()", +"dbf14295": "claimSilver(uint64,uint64,uint64,uint64,uint64,uint64)", +"dbf14dd9": "buyfloaksAgainstEther()", +"dbf1b00b": "claimBeer()", +"dbf1bfee": "ballotFee()", +"dbf1ede3": "_getLogTokenContract(uint256)", +"dbf1f780": "_hasEntryForCompetition(address,uint256)", +"dbf1fe48": "calculateTokensFromWei(uint256,uint256)", +"dbf27e0c": "updateConstitutionPoll(address)", +"dbf2c9da": "isValidAuthority(address)", +"dbf2f3c2": "get_reward(address)", +"dbf323dd": "DEDToken()", +"dbf35430": "ownedOwnershipTransferred()", +"dbf44530": "isWhite(address,address)", +"dbf45aa3": "EthBank()", +"dbf4c54c": "batchTransfer(address[],address[],uint256)", +"dbf502c0": "getCentsPerETH()", +"dbf517a2": "_connectModule()", +"dbf53a0e": "StandardTokenMock(address,uint256)", +"dbf552aa": "LOG_InvestorEntrance(address,uint256,uint256)", +"dbf5b91b": "setSafeGas(uint256)", +"dbf5eb1c": "closeTokenSale(address)", +"dbf63340": "availableSynthCount()", +"dbf675c9": "bonusAddresses(address)", +"dbf724c7": "setReceiver2(address)", +"dbf76c03": "bountyOfflineWallet()", +"dbf79dcd": "StatusCow(address,uint256)", +"dbf7dc0c": "getEntityList(bytes32[],uint8[])", +"dbf81cc6": "foundersTokensAddress()", +"dbf8d2fa": "sendTips()", +"dbf98f6a": "totalSupplyBonds()", +"dbfa5863": "_endDate()", +"dbfa6226": "interfaceInstances(uint256)", +"dbfa980b": "Slogan(string)", +"dbfab65b": "AvalonToken()", +"dbfb129e": "ChecksumDatabase(string,string,string)", +"dbfb18e7": "GoblinChainToken()", +"dbfc74cb": "ORACLIZEGASPRICE()", +"dbfccd16": "ethersplay(uint8)", +"dbfdb6e5": "getIcoTokensAmount(uint256,uint256,address)", +"dbfdef01": "TechnoEng()", +"dbfe791b": "confirmed(bytes32)", +"dbfeb17f": "eth_cap()", +"dbfec8b7": "CHEXToken(address,uint256,uint256)", +"dbfef710": "getDefaultRequiredGas()", +"dbff4182": "seedCoins(address,uint32,string,uint256)", +"dc00adef": "buyLand(bytes32,int256[],int256[],address)", +"dc00b602": "EllipseMarketMaker(address,address,address)", +"dc00e43b": "BananaBasket()", +"dc012626": "ballotOf(address)", +"dc015851": "minimumContributionPhase4()", +"dc01bd0c": "calculateAmountForDAI(uint256)", +"dc021628": "setFund()", +"dc02511e": "addPermittedContracts(address[])", +"dc02f456": "decodeTransfer(bytes)", +"dc042405": "getNames(address[],address)", +"dc048cf2": "withdraw(uint256,string)", +"dc0527de": "NDEX()", +"dc06269f": "showWhaleAddr()", +"dc06b859": "numMarketMakers()", +"dc06d8f8": "lnTest(uint256,uint256)", +"dc06e754": "_setRspTokenAddress(address)", +"dc070657": "changeBeneficiary(address)", +"dc08a80b": "safeToAdd(int256,int256)", +"dc08b611": "EXAC()", +"dc08e2c5": "getVIPOwner(uint256)", +"dc08e5ff": "getStockCount()", +"dc09426c": "GetGameInfo()", +"dc09996c": "escrowDatabase(address,uint256)", +"dc09d8fd": "showInvestorsComission()", +"dc0b3564": "players()", +"dc0b48c1": "startPubTrade()", +"dc0ba228": "change(bytes,uint256[])", +"dc0bd011": "collectDonations()", +"dc0bd38e": "appendDecryptedBids(uint256[],uint256[],uint256[],address[],address,uint256[],uint256[],uint256[])", +"dc0bd75f": "arr(address,uint256,uint256)", +"dc0c1a27": "numberOfMajorEvents()", +"dc0c7735": "isPreSaleTokenSet()", +"dc0d3dff": "funders(uint256)", +"dc0d4cb6": "merculetContract()", +"dc0eb1a3": "PredictTheFutureChallenge()", +"dc0f5ffc": "get_candidate_pic(uint8)", +"dc11a496": "changeAdmin(address,bool)", +"dc11b386": "getDailyTarget(uint256,uint256)", +"dc11be24": "smallSize()", +"dc126e63": "unlockVestedTokens(address)", +"dc1279d4": "getPureFromGene(uint256[2])", +"dc129870": "Loom()", +"dc12a805": "right57(uint256)", +"dc12abb5": "setPresaleDates(uint256,uint256)", +"dc132be8": "getAmountofTotalParticipants()", +"dc13352a": "TeamSupply()", +"dc135226": "getValueFromDollars(uint256)", +"dc13f85f": "getMaxPriceSale()", +"dc14af38": "setIncrEth(uint256)", +"dc1542aa": "testSafeAdd()", +"dc154918": "_computeTournamentContenderCut(uint256)", +"dc154a19": "buyAndSetDivPercentage(uint256,address,uint8,string)", +"dc15c635": "getdeptinfo(uint256,address)", +"dc165652": "bountyTokensVault()", +"dc1790e3": "getdeptreqdetails(uint256,address)", +"dc17c9ca": "getTokenOwner(address)", +"dc17e808": "getPaidOrderByIndex(uint256)", +"dc183d64": "setBridgeValidatorsImplementation(address)", +"dc184e70": "reserveAccount()", +"dc190074": "setsafemode(uint256)", +"dc19266f": "Total_of_Players()", +"dc199335": "checkIdentifier(string)", +"dc1997ea": "landlord()", +"dc1abb6e": "MAX_AUDIT_TIME()", +"dc1b93cb": "COREXCoin()", +"dc1bba17": "getTxAmountMCW(bytes32)", +"dc1bebe6": "creditExecutedFundsLessFees(uint128,uint256,uint256)", +"dc1c1389": "acceptOfferForCity(uint256,uint16,uint256)", +"dc1cb47b": "priceTLP2()", +"dc1d672d": "mQueue(uint256)", +"dc1d70c3": "presaleBonusLock()", +"dc1d83b3": "changeTelephone(address)", +"dc1df3f6": "myTokens(address)", +"dc1eab83": "standardSale()", +"dc1fb5a5": "community()", +"dc1fca7e": "dateSaleStarted()", +"dc1fdff0": "commissionSum()", +"dc201838": "QuickPrice()", +"dc206e5f": "oraclize_query(uint256,string,string[])", +"dc20d6e7": "updateRandomNumber(uint256)", +"dc20f957": "assetIncome(bytes32)", +"dc21b3de": "preIcoBonus(uint256,uint256)", +"dc22aca5": "GalaxiumCoin()", +"dc22cb6a": "series(uint256)", +"dc22eba6": "register(uint256,uint256,uint256,uint256,uint256)", +"dc2424fc": "setPositionPrice(uint256)", +"dc242e38": "calTotalSupply(uint256)", +"dc2811cd": "KDOU()", +"dc2816b7": "AddNewChip(uint32,uint8,uint8,uint8)", +"dc28d0c9": "tokenToValue(address,uint256)", +"dc298682": "createCategory(string)", +"dc29a89e": "concatBytes(bytes,bytes,bytes,bytes,bytes,bytes,bytes)", +"dc29da22": "getNodeHash(address)", +"dc29ec37": "tokenReserve(address,uint256)", +"dc29f1de": "topUp()", +"dc2a3056": "setTripleRoomMax(uint256)", +"dc2a60f6": "isReadOnly()", +"dc2af3de": "getCEOAddress()", +"dc2b32e6": "getWeiInvested(address)", +"dc2ba357": "SetupQDA(string,string,uint256,uint256,uint256,address,address,uint256)", +"dc2c928a": "pausePlayerContracts(uint256,uint256)", +"dc2cf3f5": "timeElapsed()", +"dc2d46f8": "getWeiAmount()", +"dc2df955": "get_project_information(uint256)", +"dc2e47c8": "save4(address,bytes,string)", +"dc2e7b33": "cal(uint256,uint256)", +"dc2ebcbc": "whitelistMainSaleAddressMany(address[],bool)", +"dc2f56cf": "transferAgreement(bytes32,address)", +"dc2f7867": "setMaxLength(uint256)", +"dc2f8744": "bounties(uint256)", +"dc2f8a38": "setResult(uint256,uint8,int8)", +"dc30685e": "gas4Token()", +"dc3080f2": "spentAllowance(address,address)", +"dc30e253": "doFinalizeSale(uint256,uint256)", +"dc30f912": "addTokenization(string,string,uint8)", +"dc3134ae": "getIslandBattleStats(uint256)", +"dc31adee": "releaseMarketingTokens()", +"dc31e06c": "NEKOCOIN()", +"dc31e473": "opmAddress()", +"dc322802": "stage2Bonus()", +"dc32c72f": "secondReserveTimeLock()", +"dc340a76": "dataControlDelOwner(address,address)", +"dc3496d7": "allHashTypes(uint256)", +"dc35213f": "change(address,uint256[])", +"dc35a6bd": "LOWER_PRICE_RESET_PERCENTAGE()", +"dc35a900": "createOffer(uint256,uint256,uint256)", +"dc35ea16": "bonusInPhase1()", +"dc371e54": "deleteName(bytes32)", +"dc376392": "ETCCoin()", +"dc3774b3": "availableBalances(address)", +"dc382cbf": "sumAcceptedContrib()", +"dc391176": "delayedPayments()", +"dc39537a": "AVAILABLE_BONUS2_SUPPLY()", +"dc39d06d": "transferAnyERC20Token(address,uint256)", +"dc39e5fe": "removeOperationType(uint32)", +"dc3a1cad": "setIBalances2(uint256[],uint256[])", +"dc3a8372": "controllerApproval(address,uint256)", +"dc3a9433": "lockedFundsPercent()", +"dc3ab866": "checkEarnings(address)", +"dc3acebe": "getApp(address)", +"dc3c39aa": "TCDC()", +"dc3ccfdd": "transfer_tokens_from_contract(address,uint256)", +"dc3d1a2a": "addNewEmployeeWallet(address,address)", +"dc3d2b5c": "MiniMeIrrVesDivToken(address,address,uint256,string,uint8,string,bool)", +"dc3d4203": "createPatient(bytes32,bytes32,uint256,uint256,uint256,bytes32,uint256)", +"dc3d6305": "_transferFromAllArgs(address,address,uint256,address)", +"dc3da6e9": "IcoAddressSet(address)", +"dc3ecbb4": "debug_wei()", +"dc3ef685": "feePromille()", +"dc3f65d3": "createdByMe()", +"dc3f7536": "AdamToken()", +"dc40af1f": "oneTimeTickets(address)", +"dc414448": "_addToParticipants(address)", +"dc415804": "setFiscal(bytes32,uint256,uint256,uint256)", +"dc419fd8": "cancelOrder(bool,uint256)", +"dc41e726": "IndoJek()", +"dc420fd2": "withdrawPayoutFromBet(uint256)", +"dc4243f1": "setSalaryToken(address,address,address,uint256)", +"dc441754": "addDocument(bytes32,string,string,uint256,uint256)", +"dc44bb1c": "createEscrowFrom(address,address,uint256,uint256)", +"dc454c13": "EDROP()", +"dc45b93a": "contributorsCompleteCount()", +"dc45bfb3": "buyPack(uint256)", +"dc45d08e": "getEtherBalance(address)", +"dc45e27f": "getBonusBalanceByType(uint256,uint256,bytes1)", +"dc460933": "assignRole(address,bytes32,address)", +"dc46a76d": "getIdeasSinceLastDeploy(address)", +"dc46c813": "TwoExRush()", +"dc46d984": "numGamesCanceled()", +"dc47b3c1": "numberOfTokenIds()", +"dc47e5b7": "approveAndCall(address,address,address,uint256,uint256,uint256,uint256,bytes,bytes)", +"dc489c9b": "setAirdropper(address)", +"dc493790": "advisoryWallet()", +"dc4a307c": "createCommonAuction(uint256,string)", +"dc4b3115": "thirdPriceTime()", +"dc4baedd": "checkVerify(address)", +"dc4bc06e": "getUserCategory(address)", +"dc4c4005": "RemoveUser(address,address)", +"dc4d2ccd": "DiscountPercentToken(uint256,string,string)", +"dc4ece27": "BONUS_3_DAYS()", +"dc4ee13f": "overallTakenEther()", +"dc4f63cc": "cap_max()", +"dc502d64": "ethToBeDistributed()", +"dc50af26": "against()", +"dc51fba8": "SetherFinalized()", +"dc52696f": "tokenSupplyChanged()", +"dc52c514": "batchCreateDrawings()", +"dc533342": "reconciliationDateSet()", +"dc53903b": "fundsReceived(uint256)", +"dc540979": "POFOMO()", +"dc5418b1": "view32()", +"dc541eb7": "SelfllerySale()", +"dc542a79": "isMaximumGoalReached()", +"dc542c0f": "ALIToken()", +"dc547301": "setCurrentSupply(uint256)", +"dc54d919": "long_tokens(uint256)", +"dc555090": "updateTime()", +"dc555766": "createWithdraw(address,uint256)", +"dc566787": "topdownAndCashout(address,uint256)", +"dc570aad": "setPermission(address,string,bool)", +"dc57726f": "TokenGenerationEnabled()", +"dc57c1ef": "CopyrightToken(uint256,string,string)", +"dc57c323": "nextInputProfit()", +"dc57d553": "epochLast()", +"dc583801": "doubleyour5()", +"dc585713": "EtherFundMeIssueTokensCrowdfunding(string,string,string,uint256,uint256,uint256,address,address,string,string,uint256,uint256,uint256,uint256)", +"dc5936f0": "addCountry(bytes2)", +"dc596304": "NineLTDevToken()", +"dc597b47": "getAnimals(uint8)", +"dc5a2199": "ICO_WALLET()", +"dc5aa474": "lastBlock_f2Hash_uint256()", +"dc5acb90": "getOrThrow(string)", +"dc5b041b": "validationPassed(address)", +"dc5b0662": "getIndexByShip(uint256)", +"dc5b87cf": "getPartnerAllocation(uint256)", +"dc5bc461": "RadToken()", +"dc5bcafb": "UnicornToken(address)", +"dc5bf961": "totalTokensLocked()", +"dc5c3e06": "setFundraiseLimits(uint256,uint256)", +"dc5c9677": "changeSellerProposedValue(uint256)", +"dc5d184f": "setID(uint256)", +"dc5d9bfe": "migrationStep(uint256)", +"dc5df3fd": "ExperimentalPreICO(address,uint256,uint256,uint256,uint256,uint256,address)", +"dc5dff36": "LottoComplete(address,uint256,uint256)", +"dc5fced4": "totalRake()", +"dc5fe025": "forward(address,bytes,uint256)", +"dc5fe349": "releaseManyStakes(uint256[],address[],address[],uint256[])", +"dc602df2": "tokenValueMultiplier()", +"dc6037d1": "setbaseconfig(uint256,uint256,uint256,uint256,uint256)", +"dc60457c": "publicIssue(address,uint256)", +"dc6055dd": "BOUNTY_WALLET()", +"dc61164d": "getMySperm()", +"dc61456c": "cooAddCro(address)", +"dc622bcc": "setTokensAllocation(address,uint256,address[],uint256[])", +"dc62da61": "checkGameListed(address)", +"dc63a62c": "getFileListHead()", +"dc63f0be": "getSatOwed(address)", +"dc646367": "endSale(bool)", +"dc64752d": "collectsAccountDividends(address)", +"dc659907": "useModule(address)", +"dc661aaa": "mainICOFirstWeekEndTime()", +"dc6668db": "make_anonymous_withdraw(uint256)", +"dc667d0c": "getCountriesCount()", +"dc669dd4": "EndorToken()", +"dc689d3c": "getBaseDenomination()", +"dc693ca7": "totalWeiAmountSale1()", +"dc69a2d6": "tearDown(uint256)", +"dc69aa23": "SudanGoldCoinCrowdsale(uint256,uint256,uint256,address)", +"dc6b1cbd": "setUser(address,address,uint256,uint256)", +"dc6b7fb4": "LockedAccountThresholdUsdUpdated(uint256,uint256)", +"dc6b9b29": "notesLength()", +"dc6bbdf5": "totalContributionInWei()", +"dc6bc372": "TokenChangerBNT(address,address)", +"dc6bfbb5": "nextBallotId()", +"dc6c0cdd": "Share()", +"dc6c3ee4": "setMaxTokenCap(uint256)", +"dc6dd152": "playerRollDice(uint256)", +"dc6e7262": "refundTransactionByMediatorFee(uint256)", +"dc6e9cf9": "_MINIMUM_TARGET()", +"dc6f39a3": "TriggerCooldown()", +"dc6ff38e": "MAIN_MAX_CAP()", +"dc7049bf": "annualManagementFee()", +"dc706a3a": "VictusToken()", +"dc70ab02": "setTotalExecutedPerDay(uint256,uint256)", +"dc718791": "changeRules(uint256,uint256,uint256,uint256,uint256)", +"dc71db43": "worldCupResultPart2()", +"dc720528": "AgriChainProduction()", +"dc726205": "rates(bytes32)", +"dc730c50": "initialSingleWithdraw(uint256)", +"dc73e49c": "swapToken()", +"dc7454dd": "amountReleased()", +"dc74665e": "totalLeaderboards()", +"dc75f2db": "multiowned(address[],uint256)", +"dc760edf": "hardCapCrowdSale()", +"dc76dc8d": "applyForCertification(string,string,string,uint256)", +"dc76fabc": "getSpotPrice()", +"dc77e5e1": "serviceTokensBurn(address)", +"dc787bba": "getCountTempHolders()", +"dc799f88": "BaseCertoChainContract()", +"dc79b176": "getUserGroup(address)", +"dc79c2ef": "addUser(bytes32,bytes32,bytes32,bytes32,bytes32)", +"dc79d069": "investorSupply()", +"dc7abeb3": "OPENSOURCE_TOKENS()", +"dc7ac1ba": "lendVault()", +"dc7b808e": "callLibSet(uint256)", +"dc7bbd72": "hasThreeStepWithdraw()", +"dc7cbfab": "priceCounter()", +"dc7df9d8": "testToUint(int256,bytes)", +"dc7e5762": "goNextPeriod()", +"dc7e88e8": "amountOfBooked(address)", +"dc7fc898": "bankermasterReq()", +"dc80035d": "setFoo(uint256)", +"dc801db6": "MyYLCToken(uint256,string,uint8,string)", +"dc80aaee": "DeltaToken()", +"dc81e2b8": "DarenHui()", +"dc82697c": "getContractValue()", +"dc835df5": "Sense()", +"dc8369ce": "myStakesOnCountry(uint256)", +"dc8452cd": "required()", +"dc845934": "getPlayerBetResult(uint256)", +"dc846d95": "Own()", +"dc84e79e": "raisedPreSaleUSD()", +"dc851b02": "itcERC20()", +"dc85561b": "firstRoomAvailable(string,uint256[])", +"dc85b996": "window1EndTime()", +"dc8650de": "_removeFreezer(address)", +"dc86e6f0": "baseUnit(bytes32)", +"dc87cfbf": "executeTransaction(uint256,bytes)", +"dc885527": "burnUnmintedTokens(uint256)", +"dc88e838": "getOAR()", +"dc8a0f65": "change_game_dice(string)", +"dc8b0203": "clearApprovalAndTransfer(address,address,uint256)", +"dc8bc70d": "finalizeSale(address)", +"dc8c06d8": "addEmployerFeedback(address,uint256,address,string,uint8)", +"dc8d1095": "simpleSubmit(uint256)", +"dc8d2696": "inboxSize(address)", +"dc8d26ad": "changeICODates(uint8,uint256,uint256)", +"dc8ee41e": "coldWallet1()", +"dc8f2ae0": "addExplicitPosition(uint32,int64[2])", +"dc8fbb44": "deathData_f12()", +"dc903eb7": "addChunk5ToWhiteList()", +"dc904e69": "waveCap3()", +"dc90e42f": "restrictedStockOf(address)", +"dc91868f": "backTo(address)", +"dc91b634": "Ticketh()", +"dc91ea68": "PayerStringUpdated(string)", +"dc92beec": "setManyWhitelist(address[])", +"dc93f7c9": "feePayedPerReserve(address)", +"dc94b4a4": "doPay(bytes32,uint256,uint256)", +"dc94e45d": "setDistrito(uint256)", +"dc9513c1": "JustifyClaimWithWitness(uint8)", +"dc951fdc": "totalOverthrows()", +"dc9564d5": "buy(uint256,string,address,address,address,address)", +"dc9590f0": "_START_TARGET()", +"dc965479": "FooContractCall(address)", +"dc97a4f9": "getTotalUnPayedDividendsAmount()", +"dc97d962": "getInt(bytes32)", +"dc97e366": "stageIndex()", +"dc9861db": "updateMeDao(address)", +"dc988b40": "allowWorkerToContribute(address,address,address)", +"dc992aa0": "minUSD()", +"dc998901": "SaveData()", +"dc9a1535": "isPublic()", +"dc9a190e": "isAllowedTrade(address)", +"dc9a1df3": "SafecontractsTREXToken()", +"dc9ac994": "iconiqSaleOngoing()", +"dc9ae17d": "burn(bytes,address,uint256)", +"dc9b6d68": "getTimeSinceLastEvent(address)", +"dc9bb7db": "noKing()", +"dc9c6e15": "_myinitialSupply()", +"dc9d625b": "setMaintainance(bool)", +"dc9deea3": "amountPurchasedWithDecimals()", +"dc9deeff": "setPresellPrice(uint256)", +"dc9e7a87": "TransferedERC20(address,address,uint256)", +"dc9e9ba0": "allowStart()", +"dc9eb903": "Tbond1()", +"dc9ebff7": "getTotalInvestedEther()", +"dc9f0622": "transferManual(address,uint256,string)", +"dca0b866": "TwoPersonContract(address,address,bytes32)", +"dca0f3ef": "getEntryFeePaid(address)", +"dca27d5e": "setV_R4(uint256)", +"dca44b39": "setPerOneEther(uint256)", +"dca5f188": "AddressBook()", +"dca5f6b0": "jurors(address)", +"dca60034": "isMapped(string)", +"dca6058c": "canSetTransferable()", +"dca67e5d": "_createResident(string,string)", +"dca6f378": "withdrawTokensFromPool(uint96)", +"dca703d0": "LogSetQuestionFee(address,uint256)", +"dca73e6b": "getMyStores()", +"dca7bcbe": "getWords()", +"dca80bc6": "EtheremonRankBattle(address,address,address)", +"dca92eb5": "terminateLiquidation()", +"dca95419": "recoverSigner(bytes32,string)", +"dca9fd5b": "editStatus(uint256,string,uint256,uint256,int8)", +"dcaa5620": "findNextWeekday(uint256,bytes)", +"dcaabed7": "getLastDeedByAddress(string)", +"dcabf93f": "refundstate()", +"dcac652e": "setOwnerShare(address,uint256)", +"dcac69c3": "inheritedPure(uint256,uint256)", +"dcace702": "getClientLastPaidRate(address)", +"dcacf19a": "finalizeAndRestart(address)", +"dcae2cb4": "getWinningPrize(uint256)", +"dcaee066": "setStakeDisbursementAddress(address)", +"dcaeea15": "setadmin()", +"dcaf391e": "totalAirDropToken()", +"dcafa43e": "SaxoToken()", +"dcafaec2": "setCostToCreateGame(uint256)", +"dcafee05": "killBalance()", +"dcb01759": "salesEth(address)", +"dcb032ce": "addNodeGroup(string)", +"dcb04503": "testConcatStorage33Bytes()", +"dcb0a094": "tokenSetBurnFeeProp(address,address,uint256)", +"dcb12421": "isSoftcapOn()", +"dcb1c012": "ChowSale()", +"dcb27883": "CallAborted(address,bytes32)", +"dcb31b82": "isConfig()", +"dcb35d06": "getTransactionApproveCount(uint256)", +"dcb36063": "crowdsaleMinter()", +"dcb3ff58": "updateDividendBalance(uint256,address,address,uint256)", +"dcb46e38": "setWorstCaseRateFactor(uint256)", +"dcb4775e": "tokenPartner()", +"dcb4876f": "removeAddresses(bytes32[])", +"dcb5930a": "ratingContractAddress()", +"dcb6af48": "calcAverageICOPhaseKeyPrice(uint256)", +"dcb7e083": "teamTokensInitial()", +"dcb7f86f": "getWinningPayoutDistributionHashFromFork()", +"dcb814ef": "presaleWhitelistDiscount()", +"dcb951de": "pushDividends(address)", +"dcb9528e": "getBiddingInfo(address)", +"dcb9d457": "updateClientOfContractorManagers(uint256,uint256)", +"dcba03da": "MINEA()", +"dcbab608": "initialize(uint256,uint256,uint256,uint256,uint256)", +"dcbac60c": "winPrizes(uint256)", +"dcbad97b": "setEndIcoMainICO(uint256)", +"dcbc1288": "m_SMR()", +"dcbc1c05": "Deposit(address,address,uint256,uint256)", +"dcbc84ab": "coinsIssuedMkt()", +"dcbda04c": "setCrowdsaleInterface(address)", +"dcbe7cf1": "addInsuranceProduct(uint256,uint256,uint256,string,string,bytes32)", +"dcbf16d4": "Normal(uint8)", +"dcbfa406": "sendVirtTokens(address,uint256)", +"dcbfa4b7": "addSkills(bytes32[])", +"dcbfe3d5": "clearRequests(bytes32)", +"dcc0ccf3": "Dao(address)", +"dcc0e622": "setTokensForCrowdSale(uint256)", +"dcc1fd02": "angelSaled()", +"dcc23730": "setCurrency(uint256)", +"dcc279c8": "setHalted(bool)", +"dcc33e0b": "updateOperationalAddress(address)", +"dcc42e9b": "cards_blue_total()", +"dcc439cf": "updatePlayersGooFromPurchase(address,uint256)", +"dcc5237b": "FlatPricing(uint256)", +"dcc53305": "getMail(uint256)", +"dcc60128": "getProjects()", +"dcc6131c": "checkBalance(uint256[],address)", +"dcc66b4b": "addRelationshipBindingWineryOperation(bytes32,uint256,bytes32,int256)", +"dcc66cc2": "getDelegate(uint256)", +"dcc6762c": "withdrawalInitiate()", +"dcc6e7ad": "refundEth(uint256)", +"dcc71ed4": "AdvisorsAndFounders(address,uint256)", +"dcc76a92": "Ranking()", +"dcc7f6b0": "Ethen(address)", +"dcc819c8": "computeCntrAmountUsingUnpacked(uint256,uint16,int8)", +"dcc8592c": "KOCMOCToken()", +"dcc8a508": "partnerBonus(uint8)", +"dcc9a58c": "testCreateGame(string,string,bool,string,address,string)", +"dccb0c89": "test_1_someTest()", +"dccb37f1": "initialTokenBalance()", +"dccb5afb": "_emitTimeAdded(uint256,uint256)", +"dccb70a7": "setEnableAllTransfers(bool)", +"dccb98da": "SparkToken()", +"dccbb14b": "payInterests()", +"dccbfa2a": "minInvestedCap()", +"dccc6c94": "fireCloseProposalEvent(address,uint256)", +"dcccb41d": "setTransferAddress(string,address)", +"dccd4315": "startingAt()", +"dccdc893": "setNewWhiteList(address)", +"dcceaaa8": "sendShipmentTo(address,uint256)", +"dccee5b2": "posibleDividendsOf(address)", +"dccf77ce": "setCurrentBlock()", +"dccfbb62": "overthrow(bytes23)", +"dcd0fa9e": "get_arbits_min_contribution(address)", +"dcd1e670": "checkAmount(uint256)", +"dcd320a0": "bouncyCoinToken()", +"dcd3c2e5": "QLALA()", +"dcd4090b": "getStage3Start()", +"dcd4eb14": "addNewTicket(uint256,bytes32,uint256,uint256,uint256,bytes32,string)", +"dcd58e2f": "FUTURE_ME_ADDRESS()", +"dcd65479": "numPeriods()", +"dcd6561d": "currentSaleSold()", +"dcd7dd2e": "setKYCLevel(address,uint8)", +"dcd8023c": "TokenBranch(uint256,uint8)", +"dcd84f2a": "UserDestroy(address)", +"dcd93691": "retrieveOnFail()", +"dcd9c289": "getBAA(bytes32,address)", +"dcda0c8f": "requestDiplomaByNr(uint256)", +"dcda2385": "TransferSellAgentCreators(address,uint256)", +"dcda4554": "dazoToken()", +"dcda4bf3": "mOwner()", +"dcdaa35b": "mintAmount2()", +"dcdb622b": "MessageSet(string,uint256,uint256,address)", +"dcdbbe37": "lockTransferFor(address,uint256)", +"dcdc055a": "doBuy(address,uint256)", +"dcdc7254": "admin_set_shopStorePrice(uint256)", +"dcdc7dd0": "mint(address,uint256,bytes,bytes)", +"dcdd6d38": "getHolderAddresses(bytes32)", +"dcdd9af2": "DEX(address,address,address,uint256,uint256,uint256)", +"dcdda6d7": "teamUnfreeze()", +"dcde0019": "disapprove()", +"dcde835e": "NewSale(uint256,uint256,uint256,uint256)", +"dcdea898": "MintToken(address,uint256)", +"dce0b4e4": "creationFee()", +"dce11375": "emitter()", +"dce1d3c6": "addTokenPendingToken()", +"dce23e97": "getPriceValue(bytes32)", +"dce293a7": "minLength(uint256)", +"dce2b4c1": "getMarkup(uint256)", +"dce2f2dd": "Vouched(address,bytes32)", +"dce388b6": "payeePartsToSell()", +"dce4a447": "at(address)", +"dce4ae87": "DigixConfiguration()", +"dce4b34e": "submitAnswerByArbitrator(address,bytes32,bytes32,address)", +"dce4fa38": "IcoTokens()", +"dce57755": "getBlockLength()", +"dce579d1": "extendIco(uint256)", +"dce59311": "didOwnerEndCrowdsale()", +"dce59c00": "addPayee(address)", +"dce5c5a9": "norsefirePrice()", +"dce5c757": "cool()", +"dce5f277": "investorsAddress(uint256)", +"dce6417d": "DebitCoinToken(string,string,uint8)", +"dce722dd": "getJobSkills(uint256)", +"dce77d84": "getCurrentRate(address)", +"dce85216": "moveUnsoldTokens()", +"dce98784": "NiewGold()", +"dce9f6c3": "SuperConductToken()", +"dcea0a64": "ADX()", +"dcea7113": "buyOutPrice()", +"dcea80a5": "exchangeIEO()", +"dceacb93": "_createNewBadge(address,uint256)", +"dceaf74c": "youAre(address)", +"dceb3e7d": "getConfirmations(bytes32,address)", +"dcebb122": "extendSale(uint56)", +"dcec5ecc": "calcNewEmployeePoolOptions(uint256)", +"dcec7204": "EtherNeo()", +"dced2f1a": "currentCharId()", +"dceda27b": "getRegularCarSupply(uint256)", +"dcede2c3": "testIsSameSign()", +"dcedeeed": "claimIfNeededThenSteal(uint256,uint256,address,uint8,bytes32,bytes32,uint256,uint256)", +"dceeeae8": "ServiceController(address,address,address,address)", +"dcef8165": "CoinBirdDEX()", +"dcefa538": "buyTokens(address,address,uint256)", +"dcefcb8e": "extractCallData(bytes)", +"dcf00b6e": "getAccreditationActive(bytes32,bytes32)", +"dcf1579c": "thirdBonusPercent()", +"dcf1a9ef": "commissionBalance()", +"dcf1df05": "showValue(address,address)", +"dcf219f2": "setLootboxFee(uint256)", +"dcf34a91": "SpendingUnblockedEvent(address)", +"dcf3fb2a": "revoke(address,address)", +"dcf537b1": "multiply7(int256)", +"dcf63591": "course()", +"dcf6a592": "isGreaterThan(uint256,uint256)", +"dcf72c10": "buyTo(address)", +"dcf73856": "generateGroups()", +"dcf7bb5c": "changeTarget(address)", +"dcf7c0d0": "TokenTrader(address,uint256,address,uint256,uint256,uint256,bool,bool)", +"dcf7c2f9": "asset(uint8,string,bytes)", +"dcf8045e": "tiersInitialized()", +"dcf8113e": "campaignEndedSuccessfully()", +"dcf86587": "_transferWallet(address)", +"dcf8f13a": "getCurrentItemPrice(uint256)", +"dcf90793": "IcoWallet()", +"dcf91ea9": "MoftakToken()", +"dcf946c2": "getAllParentIds(bytes32)", +"dcf97439": "revealX(uint256,uint256)", +"dcf988d6": "GetFeeBalance(uint256)", +"dcf9bbec": "hasVerifiedAttributeIndex(address,uint256)", +"dcf9e836": "setProviderLimits(address,uint256,uint256)", +"dcfa6ac4": "buyChamp(uint256,address)", +"dcfa9222": "transferAccessTo(address,address)", +"dcfa9cc0": "testProxyCall()", +"dcfac095": "CPX(uint256,string,string,address)", +"dcfc3b46": "getAdIdByUser(address,uint256)", +"dcfc4430": "groomAddr()", +"dcfcda2b": "changeEscrow(address)", +"dcfda779": "allowCrowdsaleAddress(address)", +"dcfe63a9": "finishPrivateSale()", +"dcfe64e9": "SHA256()", +"dcfe8eb4": "SetIPR(string,string,address,string,string,uint256,string,string)", +"dcff2f76": "createAndJoinCDP()", +"dcff5581": "NewFeeAddress(address)", +"dcfff171": "setDelegadoDeDistrito(bytes32)", +"dd001254": "nameToTokenId(string)", +"dd00182b": "dogeAddress()", +"dd004ca8": "_endEdit()", +"dd009f48": "recursiveCeil(uint256,uint256,uint256)", +"dd00a9dc": "close(uint256,uint256,bytes)", +"dd00b605": "normalCheck()", +"dd012a15": "setIt(uint256)", +"dd01f781": "goToWork(uint256)", +"dd01f9e4": "LogNeededBalance(uint256)", +"dd022727": "getGameByIndex(uint256,bool)", +"dd029560": "CoreLayer()", +"dd02e30d": "isValidTxPaymentForKWh(bytes32)", +"dd03447f": "DiamondCash()", +"dd052519": "withdrawAllPlayers()", +"dd05db9a": "amountPerRelease()", +"dd0669d4": "getZCount(uint8,uint8)", +"dd0702d6": "changeTeamPoolForFrozenTokens(address)", +"dd083f20": "teamPart()", +"dd0860a8": "IsOwner(address)", +"dd08b5c9": "disableRedemption()", +"dd090981": "setName(uint256,uint256,bytes32)", +"dd09de33": "soldTokensOnIco()", +"dd09e13c": "totalRegistrationBonusAmount()", +"dd0a1019": "isReserveGenerated()", +"dd0ac8ac": "HoldCrowdsale(uint256,uint256,uint256,uint256,uint256,address,uint256,uint256,uint256,uint256,address)", +"dd0b1af5": "setMythexTokenAddress(address)", +"dd0b281e": "start(address)", +"dd0b7ffe": "setBuyNowPrice(uint256)", +"dd0c189c": "updateFirstExhangeRate(uint256)", +"dd0c42ab": "updateRequiredEntries(uint16)", +"dd0cf15d": "sendFund()", +"dd0cf7d4": "stopGuess(uint32,bool)", +"dd0d74ff": "IssueBank(address)", +"dd0e2373": "voterAddresses(uint256)", +"dd0e3902": "setData_6(string)", +"dd0e7832": "transferWithChange(uint256,address,address,address,uint256,uint256,bytes,bytes,bytes)", +"dd0f0808": "genEvent()", +"dd0f5a9a": "presalePiEnd()", +"dd0fa641": "winning_bets_total()", +"dd100efa": "getIcoEnded()", +"dd10d97e": "getPlayerWaiting()", +"dd11247e": "totalTickets()", +"dd114c22": "publish(address,uint256,address,uint256)", +"dd1219fd": "powerSwitch(bool)", +"dd12b51f": "getPermissionCheck()", +"dd137b5d": "toBase58(uint256,uint8)", +"dd13e20a": "forgeWeaponRarity(uint256,uint256,uint256,uint256)", +"dd13fd5f": "_acceptContribution(address,uint256,uint8)", +"dd14ab79": "updateTimestamp(bytes32,uint256)", +"dd151d1e": "pushAddressArray(bytes32,address)", +"dd155f3f": "removeAddress(uint256,address[])", +"dd15b66c": "MyWill(address,string,string,string,address,uint256,uint256)", +"dd15f993": "depositUSD(address,uint256)", +"dd16d981": "isCampaignValid(bytes32)", +"dd16fe09": "getCashBackObject(uint256)", +"dd17e151": "sendabr(uint256)", +"dd17eaec": "setMultipleRates(bytes32[],uint256[])", +"dd18b250": "getIdArray(address,address,string,string)", +"dd192de7": "affiliatesAddress()", +"dd193e7b": "addPerSell(uint16,uint256,bool)", +"dd1956b0": "InfiniviToken()", +"dd1a293a": "burnTokensFrom(address,uint256,uint256)", +"dd1a56a7": "WellnessToken()", +"dd1a5f0d": "_grandPVPLoserReward(uint256)", +"dd1a68c1": "report(uint16,uint16,uint8)", +"dd1aa549": "PARTNERS_WALLET()", +"dd1b1928": "getInputSize(uint256)", +"dd1b6137": "push(uint256,uint256)", +"dd1b7a0f": "nonFungibleContract()", +"dd1b89c6": "freezeExists(uint256)", +"dd1b9c4a": "POOL_FEE()", +"dd1bb3d1": "confiscateBalance(address)", +"dd1bb6f5": "TokenICOGAT()", +"dd1c35bc": "recycle(uint256)", +"dd1cdf84": "keybasePubURL(string)", +"dd1d5e64": "incGenLabFight(uint256)", +"dd1dbc3a": "calcUnMaskedEarnings(uint256)", +"dd1dc0ad": "RequestSale()", +"dd1dffb7": "getFundsCollected()", +"dd1e2651": "getUserKey(uint256)", +"dd1e4e11": "_getRandom(uint256)", +"dd1ee3d7": "whaleAddress()", +"dd1eee44": "couponTokenSaleAddr()", +"dd1f969b": "PURCHASE_AMOUNT_RATE_REFERENCE()", +"dd1fc642": "_approvedFor(address,address,uint256)", +"dd20a53e": "createTournament(uint256)", +"dd215410": "getWinnersIndex(uint256)", +"dd217ce1": "getAddusers()", +"dd218ff2": "addPreIcoPurchaseInfo(uint256,uint256)", +"dd21f395": "t_3rd_StageEnd()", +"dd22148f": "investedSumOnPreIco()", +"dd228801": "setAffiliateRate(uint256,uint256)", +"dd234dc7": "PixelBought(uint256,bytes32,uint256,address,address)", +"dd23795f": "bobMakesEthDeposit(bytes32,address,bytes20,uint64)", +"dd238603": "unsetWhitelist(address)", +"dd2407d3": "sendOnlyHash(bytes32)", +"dd242fa4": "staff_4()", +"dd253cd0": "setTransferMinimumFee(uint8)", +"dd2594af": "changeTokenApproves(uint256)", +"dd27efa0": "_packPVPData()", +"dd27fcad": "EternalCoin(uint256,string,string)", +"dd280c7a": "requestDetachmentOnPause(uint256)", +"dd288173": "doStore(uint256,uint256,bytes32)", +"dd28d12b": "ZILINGGOSupply()", +"dd28d14d": "getMembersInGroup(uint256)", +"dd294142": "institutionTimeLock()", +"dd2a07a0": "LCS()", +"dd2ac276": "genToLuck(uint256,uint256)", +"dd2ad311": "scheduleCall(bytes,uint256)", +"dd2bcae0": "DeviceIsDeactivated(address)", +"dd2c4d3d": "AdoptionRequestCancelled(bytes5)", +"dd2c888e": "balanceHistory(address,uint256)", +"dd2d2a12": "minimum(uint256,uint256)", +"dd2d4ea0": "tokensMain()", +"dd2e0ac0": "unlockToken(uint256)", +"dd2f4ebd": "getNumberOfGames()", +"dd300c6d": "getSettingChangeConfirmationCount(uint256)", +"dd301057": "noOfTiers()", +"dd3032bc": "RoundCHardCap()", +"dd30651f": "activateUser(address,uint256)", +"dd3129a9": "calculateAllBuyBackSum()", +"dd31f462": "clearDebt()", +"dd321018": "levelItemClass()", +"dd324fe7": "PieceStandardToken(uint256,string,uint8,string)", +"dd3260fc": "checkOpenTimer()", +"dd32858e": "withdrawWinner()", +"dd34abd3": "transferDirectorA(address)", +"dd34c9a3": "capFlex()", +"dd34dab8": "startTimeOfSaleLot4()", +"dd34e129": "PriceTest()", +"dd34e7be": "Vault(address,uint256,uint256)", +"dd365b8b": "pwn()", +"dd36b59c": "getPlanetOwner(uint256)", +"dd36e18b": "ContractStatus()", +"dd37ad1f": "calculateValueMantisseTrick(int256,uint64)", +"dd37be12": "mod(uint32,uint32)", +"dd3840ef": "PRIVATEPLACEMENT()", +"dd386239": "manuallySetNumRewardsAvailableForChildAddress(address,uint256)", +"dd397e03": "preIcoTarget()", +"dd3b014c": "getLatestVersion(bytes32)", +"dd3bd008": "getReadyTime()", +"dd3c407f": "_set7()", +"dd3ccd84": "percentForHelpCoin()", +"dd3d0bee": "changelp18(address)", +"dd3e5f47": "_sharesValid(uint256,uint256)", +"dd3ef6a6": "deathData_v12()", +"dd3f2893": "_processTokensPurchase(address,uint256)", +"dd3f8608": "FloatGameToken(bytes32,address)", +"dd3f9526": "_controller()", +"dd3fa136": "ship(string)", +"dd3ff4f6": "sendFeeToWallet(address,address)", +"dd413da0": "Vendi(uint256)", +"dd4198f4": "getScore(uint8,bytes32)", +"dd41cc2f": "getQuestionCount()", +"dd41e1c7": "redeemFrom(address,uint256,string)", +"dd420fc5": "auditorComment()", +"dd4253f7": "MeosunToken()", +"dd42c228": "totalLockedFund()", +"dd42faf7": "window3TokenExchangeRate()", +"dd4314b2": "unique_players()", +"dd443c7b": "cancelMarkets(uint256)", +"dd449a83": "allower()", +"dd44a15c": "allocateTokensForContributor(address)", +"dd450d4e": "transferFromBankToAccount(bytes32,uint256)", +"dd457c7f": "balancesSet()", +"dd45e247": "getUserListSize()", +"dd462e2d": "withdrawAmountHashing(uint256,uint256)", +"dd467064": "lock(uint256)", +"dd473d2b": "withdraw_all()", +"dd47fe15": "sendToTarget(address,address,address,address,uint256)", +"dd48087f": "balanceOfContract(address)", +"dd486c35": "ownerWantMyEther()", +"dd489e44": "setSystemStartingPriceMin(uint256)", +"dd48d911": "totalSellOrders()", +"dd49756e": "depositTokens(uint256)", +"dd49f1c8": "BooMToken()", +"dd4a055b": "buySale(uint8,address)", +"dd4a8361": "setWhitelistEntries(address[],bool)", +"dd4a8f61": "contractorManager()", +"dd4aac73": "SELLER_STEP_2_GET_PASS()", +"dd4aeb92": "manageMinting(bool)", +"dd4bc101": "weightOf(address)", +"dd4bd4b7": "getProjectMilestoneStartWindow(bytes32)", +"dd4c97a0": "approveNode(address)", +"dd4dfb62": "kUnit()", +"dd4e6993": "leerGat()", +"dd4e8823": "poiLockup()", +"dd4f1f2a": "multipleHomocide()", +"dd4f5f0f": "withdrawBBO()", +"dd4f8f74": "roundStartTime()", +"dd506e09": "changeRound()", +"dd50e9d4": "clearSummonNum()", +"dd510361": "setTransformTarget_pool(address,uint256)", +"dd5108d1": "addressToTotalDonationAmount(address)", +"dd510e98": "newLockUpAddress(address)", +"dd515cdb": "checkVotingForStartPayment()", +"dd51faa2": "setGas(uint256)", +"dd523559": "devuelveAddressUsuario(bytes32)", +"dd5244b4": "testTryProxyCallWithValue()", +"dd53c301": "mintContract(address,address,uint256)", +"dd54291b": "tokenCap()", +"dd54a62f": "content(string)", +"dd54cc0c": "advBtyWallet()", +"dd550958": "getOwnerAddress(uint256)", +"dd55f11b": "deleteCitizen(uint256)", +"dd55fba0": "createSecondPromoCollectible(uint256,address,uint256,address)", +"dd563726": "GoingGems(uint256,address)", +"dd565e76": "pushDecoration(uint256)", +"dd57d5c5": "setTrust(address)", +"dd585e7b": "newincomelog(uint256,string)", +"dd5891b3": "join(address,string,string)", +"dd58f5d9": "isIcoFinish()", +"dd592a32": "topUpAmount()", +"dd595328": "untransform(uint16)", +"dd59c954": "mintBatch(bytes32,bytes32,bytes32,bytes32,bytes32,address)", +"dd5a4efd": "GameRefunded(uint256,uint256,uint256)", +"dd5a612c": "getCashPrior()", +"dd5a7f40": "getContractCreationTxGasprice()", +"dd5ac448": "payoutReferrer()", +"dd5b23df": "transferBond(address,uint256)", +"dd5b29b7": "toB32(uint256,bytes)", +"dd5c2678": "KappyKoin()", +"dd5ca673": "setMintRequestStringMap(uint256,int256,string,string)", +"dd5cba71": "CHXTokenSale()", +"dd5dcd52": "findActiveRange(address)", +"dd5dd552": "_cancelOrder(address)", +"dd5dd8f2": "timeGap()", +"dd5ddfe8": "setPermission(address,uint8)", +"dd5df59c": "nonEtherBuy(address,uint256)", +"dd5e403c": "IcoFund()", +"dd5e5cb5": "changeMaxDrawingTime(uint256)", +"dd5e8410": "jackpotMedium()", +"dd5ea752": "burnAndConvertToQUA(uint256)", +"dd5f63fd": "niceguy3()", +"dd5f9a22": "STSTEST5()", +"dd604fcb": "EgyptianPound()", +"dd60b394": "giveFreezePermission(address[],bool)", +"dd60c898": "participantsCount()", +"dd611e8d": "Setter(uint256)", +"dd616a45": "ZeroCap()", +"dd62b1a0": "LalaToken()", +"dd62ed3e": "allowance(address,address)", +"dd62f6f3": "getPayoutDistributionHash()", +"dd63133a": "onPurchase(uint16,uint16,uint8,address,uint256)", +"dd6350a0": "withdrawContributed()", +"dd63f7d0": "functionReturningValue(bytes32)", +"dd644f72": "basisPointsRate()", +"dd66111d": "gameRoundEnd()", +"dd67a360": "OrderLifeCycle()", +"dd681e51": "ecosystemGrantsReserveWallet()", +"dd68b386": "TransactionRefundedAfterExpiry(uint256,uint256)", +"dd6996a3": "LOL3()", +"dd6ad764": "withdraw(uint8,address)", +"dd6afdfe": "Chou(uint8)", +"dd6b2fc6": "isBarCodeData(bytes32)", +"dd6b996d": "endDividendPool()", +"dd6c1394": "GazeCoinCrowdsaleWhitelist()", +"dd6e66d0": "tokenHoldersTotal(address)", +"dd6e8e6a": "_markRedemptionFulfilled(bytes32)", +"dd6ed59a": "initSubPayees(bytes32,address[],int256[])", +"dd6f0f19": "ApplicationIsInDevelopment()", +"dd719d2c": "airDrop(address,address,address[],uint256[])", +"dd7202d8": "getQuantum(uint256)", +"dd722127": "adminRemove(address,string)", +"dd7221e8": "LogPause(bool)", +"dd727ea6": "runJackpot()", +"dd729530": "add_shield(uint16)", +"dd72ae4e": "availableICO_w1()", +"dd73d17b": "getComment(address,address)", +"dd751310": "isRegisteredPublicKey(uint256)", +"dd75e7ff": "getENow()", +"dd75ecce": "getVestingAmount(address,uint256)", +"dd76d2fa": "setIdArray(address,uint256,string,string,address[])", +"dd787875": "setupSale(uint256,uint256,address)", +"dd791ce5": "tokenDec()", +"dd796b07": "indexOfCardAddress(address)", +"dd79cc6a": "secretBidCount()", +"dd79e33e": "splitIdentifiers(string)", +"dd7a1722": "accountLocked()", +"dd7aabc8": "_transferHelper(address,uint256)", +"dd7b3e97": "buyoutsEnabledFromTimestamp()", +"dd7b3f26": "bytes32ToBytes(bytes32,bytes32)", +"dd7bff82": "removeCandidates()", +"dd7d168a": "getEthBullet(string)", +"dd7d6bb0": "getLpAskPrice()", +"dd7db870": "addFreeVineyard(address)", +"dd7dde04": "maxTeamSize()", +"dd7e11be": "InternationalPaymentToken()", +"dd7eba7a": "ValentineRegistry()", +"dd7f2225": "MiCarsICO()", +"dd7f88ee": "date_start()", +"dd80f2a6": "Vibrancier()", +"dd817963": "lastBlock_f0Hash_uint256()", +"dd819721": "setNFTbyTokenId(uint256,string,bool)", +"dd838808": "endMigrationPeriod()", +"dd83a303": "cancelMortgage(uint256)", +"dd83c825": "backersAddresses()", +"dd8432fe": "getRemainingTokensForSale()", +"dd847dfe": "get_contract_money()", +"dd84acaa": "addressesAllowed(address)", +"dd859739": "SetBeneficiary(string,string,string,string,string,string,string,string,string,string,address,string)", +"dd85b1dd": "setServiceProvider(address)", +"dd85b82e": "EthealWhitelist(address)", +"dd8617ca": "payether(address,uint256)", +"dd86210a": "medalSymbol()", +"dd864883": "changeApprovalCore(address,uint256,uint256)", +"dd86f719": "COMMUNITY_BOUNTY_HOLDER()", +"dd87c9f0": "exeStatus()", +"dd897767": "isRealWorldPlayerMintingEnabled(uint128)", +"dd898fa2": "MinterStorePoolCrowdsale()", +"dd89daa5": "getBBFarmID(bytes4)", +"dd8a0c56": "vacate(address)", +"dd8ad12a": "executeAppReturn(bytes32)", +"dd8b0ff6": "rmax(uint128,uint128)", +"dd8bd8cb": "Patient(address)", +"dd8bf1f5": "setDistrict0xNetworkToken(address)", +"dd8c8855": "addWarehouse(uint256,uint256,bytes32)", +"dd8d11e2": "isValidSubscription(bytes32)", +"dd8d149d": "tokenCrowdsaleRate()", +"dd8d1cef": "totalUserCampaigns(address)", +"dd8d4c40": "getCallers()", +"dd8e668c": "FUND_FRAC_BOT()", +"dd8ee602": "log(bytes,uint256)", +"dd8ef66b": "cancelTrade(address)", +"dd8f3195": "HyperChipsToken()", +"dd8fee14": "regulator()", +"dd905097": "organisationWallet()", +"dd90c403": "getAccountFeed(address,uint256,uint256)", +"dd9180ea": "tokenReservationAllocated()", +"dd91f1f5": "toggleAuthorization(address,address,bytes32)", +"dd924594": "distributeAirdrop(address[],uint256[])", +"dd92a8b0": "confirmSell(uint256)", +"dd932c5b": "voteEnd(uint256)", +"dd93890b": "setMeta(uint256,bytes32,bytes32)", +"dd939155": "recordUpdate(address,uint256,int256,bool)", +"dd93c74a": "setInactivityReleasePeriod(uint256)", +"dd946033": "right81(uint256)", +"dd952089": "getTaxDataSignatures()", +"dd9546b1": "minInvestments()", +"dd9555f1": "withdrawBidForCollectible(uint256,uint256,int256)", +"dd955c44": "sellEth(address,uint256)", +"dd955d4c": "rawTransfer(address,bytes32)", +"dd9568b0": "messageInfo(uint256)", +"dd96440e": "DDD()", +"dd967b0b": "refundLoan()", +"dd9815a2": "claimPlayerProfit()", +"dd982bdf": "FaceBookCoin()", +"dd999ade": "cleanUpRounding()", +"dd9a76ff": "pay(address,address,uint256,uint256)", +"dd9a9e2c": "CORReserveAccount()", +"dd9bc47e": "finish(address,address)", +"dd9bf998": "authorizeTradingAccounts(uint256)", +"dd9bfb04": "bakanceOfBeer(address)", +"dd9cfc4b": "tokenSalesByAsset(address,uint256)", +"dd9d687e": "namehash(bytes32)", +"dd9dd688": "calcStopPrice()", +"dd9e3848": "NewHolder(address)", +"dd9e4094": "makeMemChange1(uint256,uint256,uint256,int256)", +"dd9e7b1b": "max_raised_amount()", +"dd9ea299": "getLastDepositId()", +"dda0268d": "queryBetUnit()", +"dda0c1d6": "adminAmendBallot(uint32,string,uint256,uint256)", +"dda0e4ba": "finishAllGames()", +"dda0f1bb": "sendToTicker()", +"dda13903": "GoldOwner()", +"dda2d923": "setIcoAddress(address,address)", +"dda3342b": "ReplicatorFactory()", +"dda342bb": "list(address,uint256,uint256)", +"dda38380": "CFTRAD()", +"dda3baff": "showlevel(address)", +"dda44b10": "buyRecipient(address,uint8,bytes32,bytes32)", +"dda477fd": "walletTransfer(address)", +"dda4fa8f": "setReserveWallet(address)", +"dda5062c": "userIds()", +"dda51424": "right80(uint256)", +"dda55b18": "GxTraders(address)", +"dda5d5cb": "saosao2()", +"dda5d799": "PRT()", +"dda6020b": "freezeMintUntil()", +"dda61c00": "getIsSecurityWalletReg(address)", +"dda63359": "setSellToContract(bool)", +"dda69410": "add(address,uint16,uint8,uint8)", +"dda6abb8": "sendToVestingContract()", +"dda6c3ce": "checkWinning(uint256)", +"dda6c7cf": "setActiveUserListLength(uint256)", +"dda72292": "BONUS_TIER_6_LIMIT()", +"dda81c15": "TIER_4_BUYIN()", +"dda89912": "setExchangeDetails(bytes32,bytes32)", +"dda943d6": "maxSet()", +"dda9939c": "Store(address[])", +"dda9f1a3": "HODLRegistration()", +"ddaa26ad": "START_TIME()", +"ddaa4c48": "granularPreallocate(address,uint256,uint256)", +"ddaa7e02": "GetTickSize3(uint256)", +"ddaaff27": "generateSection()", +"ddac6654": "validUntil()", +"ddad2ffe": "newNode(address)", +"ddad3ca1": "tokenMaxCap()", +"ddae2e26": "__save128(uint256[])", +"ddafaf4d": "reclaimNtvuEther(uint8)", +"ddb0fdc0": "addAvailablePack(uint256,bytes4)", +"ddb12a35": "countPayOrder()", +"ddb141c2": "execute_transfer(uint256)", +"ddb1bdc8": "credit(address,uint256,uint256)", +"ddb1ede9": "canceledBookingfc(uint256)", +"ddb22537": "withdrawDeadBids()", +"ddb25d71": "GBPproxy()", +"ddb31cea": "TEAM_TOKENS_LOCK_PERIOD()", +"ddb4897a": "NitroCoins()", +"ddb49f98": "SpiceNinja()", +"ddb5b3ac": "SellTokens()", +"ddb62333": "readTaskState(string)", +"ddb6af4c": "setTimeStamp(uint256,uint256)", +"ddb6e116": "vote(uint16)", +"ddb72188": "chAirDropLimit(uint256)", +"ddb792a0": "admin_from_To_transfer(address,address,uint256)", +"ddb863be": "multiPartySend(address[],uint256[],bytes)", +"ddb8b099": "itemNameOf(uint256)", +"ddb8f090": "GlobalTransfersUnlocked(bool)", +"ddb9341b": "SetBuildingDataArray(uint256[])", +"ddb9769c": "_settingsApplied()", +"ddba8c45": "verifyEscrow(uint256,address,address)", +"ddbb4ab4": "_bytes32ArrayToString(bytes32[])", +"ddbbc35c": "searchByName(string)", +"ddbcb5cb": "registerAs(address,bytes32,address)", +"ddbcb5fa": "MIN_AMOUNT()", +"ddbcf3a1": "ensNode()", +"ddbdf242": "traders()", +"ddbe7c41": "NeverEndingApp()", +"ddbe8f09": "voteEnd()", +"ddbe92d3": "setBondFundAddress(address)", +"ddbf5856": "completeLottery()", +"ddbf5c8f": "checkFee(uint256,uint256)", +"ddbfbdbf": "ETHERKUN()", +"ddbfd63e": "AddGoods(uint32,uint32,uint256,uint32,uint32,uint32,uint32,uint8,uint8,uint8)", +"ddc002e8": "TokenSold(address,uint256,uint256,bool,bool)", +"ddc0db14": "AmountBonusPricing(uint256[])", +"ddc12019": "_triggerCooldown()", +"ddc23059": "SchemeRegistrar()", +"ddc23ddd": "erc165InterfaceSupported_NoCache(address,bytes4)", +"ddc33450": "MNLTGUNE()", +"ddc35950": "setOwner(uint32,address)", +"ddc3e344": "_sellPutToClose(uint256,uint256,uint256,uint256,address)", +"ddc4aacf": "token4Gas()", +"ddc53c2c": "lastFreeBlock()", +"ddc541dd": "publisher(address)", +"ddc63262": "harvest(uint256)", +"ddc645f8": "CollateralReturned(uint256)", +"ddc6a171": "allowance(address,uint256)", +"ddc6f83e": "setIdent(string)", +"ddc6ffaa": "SecuredLedgerToken()", +"ddc86af6": "extractById(int128)", +"ddc8bb54": "PriceOf1000TokensInUSD()", +"ddc8d7a6": "_removePauser(address)", +"ddc983f2": "bonusEnds50()", +"ddca15de": "ServiceContract()", +"ddca337e": "SetMaxChequeValue(uint256)", +"ddca3f43": "fee()", +"ddcb1a94": "serviceBurn(uint256)", +"ddcbf794": "addScore(uint256,uint256)", +"ddcd3681": "getRemainingTrialDrops(address,address)", +"ddcd7ee9": "lastJson()", +"ddcd8763": "requestBuywithETH()", +"ddcd887b": "testMiddleTranchNotExact()", +"ddceafa9": "recovery()", +"ddcfa217": "newRecurringBillingContract(address)", +"ddd1002e": "LogStart()", +"ddd113f4": "numMarriages()", +"ddd1527b": "transferFromOwner(uint256)", +"ddd1b67e": "getCurrentMonth()", +"ddd35de8": "tokensPerBTC()", +"ddd41ef6": "transferDirector(address)", +"ddd505f6": "addTransaction(address,uint256,uint256,string,uint256,bytes)", +"ddd53cc5": "setupICOPrices(uint256,uint256,uint256,uint256)", +"ddd57872": "setTimeStamp(string)", +"ddd5e1b2": "claim(uint256,address)", +"ddd5e68b": "transferEthersToOwner(uint256)", +"ddd641b0": "tierName(uint256)", +"ddd6d79a": "remainingWithdraw()", +"ddd7c879": "claimWei(uint256)", +"ddd81f82": "registerProxy()", +"ddd83259": "_normalDistribution(uint256,uint256)", +"ddd85dd8": "Freda()", +"ddd9537d": "getUsdEthExchangeRate()", +"ddda66db": "setMerchantWallet(address)", +"dddac167": "VotingFinished(uint256,uint256)", +"dddaf901": "wcapToken()", +"dddb983b": "testFailCreateWithParentsForeignNotInUse1()", +"dddbb753": "getAdsCount()", +"dddd3594": "ConsentDirective(address,uint256)", +"dddd3de8": "getvalid()", +"dddf31f1": "lastClaims(address)", +"dddf33cc": "offerCatForSale(uint256,uint256)", +"dddfb2f2": "buyEIT()", +"dddff84c": "StandardCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"dde0523f": "changeVisitCosts(uint256,uint256,uint256,uint256,uint256,uint256)", +"dde05a67": "TinaCoin()", +"dde070e8": "getClaimAmount(address)", +"dde0d085": "mathTransfer(address[],uint256)", +"dde107c2": "stampIndextotransactions(uint256)", +"dde1589c": "icoTokensPrice()", +"dde26ec9": "createGrant(address,uint256,uint256)", +"dde27e29": "distributeTokens2(address[],uint256[])", +"dde2b332": "setTransferFrozen(bool)", +"dde2fc22": "DLCToken()", +"dde37357": "MultiOwner(address[],uint256)", +"dde3ae6d": "changeAssetOwner(address)", +"dde41aa9": "canonizedRegistry()", +"dde42067": "paidTokensOf(address)", +"dde43cba": "REVISION()", +"dde49979": "unlockFor(address)", +"dde4a70b": "getSell(uint256)", +"dde4dc8e": "Show_Patient(uint256,uint256)", +"dde4f41a": "releaseMultiWithStage(address[],address[])", +"dde5a65d": "purchase(address,address)", +"dde68e2e": "refundETHToCustomer(address,uint256)", +"dde6b340": "calculateLoanerInterest(uint256)", +"dde6e256": "getCarProduct(uint32)", +"dde6f449": "GlobfoneCoin()", +"dde6f484": "setMainAccount(uint256,address)", +"dde7af32": "warriorGold()", +"dde82c2d": "coinsRemaining()", +"dde8535f": "getMemberStatus(address)", +"dde8b7ac": "setFeeAbsMaxGlobal(uint256)", +"dde8c8d6": "getUserVote(uint256,uint160,bool)", +"dde8dab2": "BEERCOIN()", +"dde9394c": "returnOwners()", +"ddea6df3": "isHumanToken(address)", +"ddeae033": "claimFor(address)", +"ddeae8ca": "markDone(uint16)", +"ddeb5094": "pause(bool,bool)", +"ddeb63b5": "setEscrowAddress(address)", +"ddec280e": "fetchAssetPrice(address)", +"ddec60d9": "Parents()", +"ddecc5d9": "getTradingTime()", +"dded49cb": "setadmin(address)", +"dded5dd8": "isAdminForGame(uint256,address)", +"ddedfc19": "TheLightToken()", +"ddeed1a4": "projectFailed(uint16)", +"ddef6421": "adventureContract()", +"ddef880f": "getDeepInfo(uint256)", +"ddef8f29": "HOTTO()", +"ddefdb90": "fillOrKill(address[5],uint256[6],uint256,uint8,bytes32,bytes32)", +"ddf0432f": "startPresale(address,uint256)", +"ddf063c8": "collectedEth()", +"ddf08ebc": "checkCaptain(address,uint32)", +"ddf09e89": "NelsonChenTestToken()", +"ddf0c070": "addBalances(address[],uint256[])", +"ddf187b0": "dogFight()", +"ddf1be5f": "setIII_R1(uint256)", +"ddf252ad": "Transfer(address,address,uint256)", +"ddf25ce9": "renExBalancesContract()", +"ddf27259": "LogCertificationDbUnRegistered(address)", +"ddf29872": "teamvalue()", +"ddf2d8cd": "setDesignatedReportReceivedTime(uint256)", +"ddf31394": "lockToken(address,uint16)", +"ddf33cc7": "TEAM_TOKENS1()", +"ddf34ab0": "getAgreedCompletionDate(bytes16,address,address,uint256,uint256)", +"ddf41bf4": "migrateHolders(uint256)", +"ddf4a032": "changeSettings(uint256,uint64,uint8,uint8,uint8,uint8)", +"ddf4b011": "TIME_UPDATE(bytes32)", +"ddf5cc29": "ActivationWithdrawal(address[2],uint256[8],uint256)", +"ddf6e5a0": "GEN_0_LIMIT()", +"ddf7e1a7": "tokenToTokenSwapInput(uint256,uint256,uint256,uint256,address)", +"ddf9d613": "getCustomBuyerLimit(address,address)", +"ddfa3a60": "getCrystalWeights()", +"ddfa53e4": "hardcapInWei()", +"ddfafa96": "getRates(address,uint256)", +"ddfb8b9b": "Start_quiz_qz(string,string)", +"ddfc50df": "setByte(bytes1,bytes8,bytes32)", +"ddfd72f8": "setHashByWriter(bytes32,address,bytes32)", +"ddff0346": "_getFechHpbBallotAddrInterface()", +"de002aa6": "pushWork(uint256)", +"de0099a3": "heldTokens(address)", +"de009e7f": "offerToChannel(address,uint256)", +"de00a094": "controlled()", +"de0123bf": "AddMultipleAddresseseToWhitelist(address[])", +"de01ec28": "setStateMigrated()", +"de024515": "DEMT()", +"de02ae96": "bytes32ToBytes(bytes32[],bytes32)", +"de02f1fc": "PER_ACCOUNT_ADDITIONAL_TOKENS()", +"de0498d3": "Date_Started()", +"de05905b": "doSetName(bytes32)", +"de06b7f4": "doTakerPayment()", +"de06ef49": "whaleStartTime()", +"de07a886": "DEFROST_MONTH_IN_MINUTES()", +"de080401": "SethTokenPurchase(address,address,uint256,uint256)", +"de089aee": "userMaximumPurchaseAmountNg(address)", +"de08a6d8": "metaTransfer(address,uint256,bytes,uint256,uint256)", +"de08c364": "removeAdminister(address)", +"de08f188": "storageStep()", +"de090b25": "LockInExpiry()", +"de0a1c5d": "changeVuePayETHDestinationAddress(address)", +"de0a7cc6": "purchasedTicket(address)", +"de0b18f2": "getAssetAttachment(uint256)", +"de0b5af2": "BONUS_COEFF()", +"de0bffc2": "GlobaLiquids()", +"de0cf58b": "callerAllocationStartBlock()", +"de0d0802": "getWeightAndUpdate(address)", +"de0d50e4": "incGen0PresaleCount()", +"de0d7083": "Alter_MediatedTransaction(uint256,bool)", +"de0e9a3e": "unwrap(uint256)", +"de0f2b49": "setCertifierStatus(address,bool)", +"de0f725d": "removeContract(address,address)", +"de0fe922": "addHashType(string)", +"de0ff7c5": "getEther()", +"de1079b3": "vestFromTime()", +"de10f04b": "eraseNode(bytes32[])", +"de117fb1": "buyDirector(uint256)", +"de11823a": "GoldAllocation(uint256,uint256)", +"de11892b": "isAuthorized(address,bytes32)", +"de11c94a": "factoryContract()", +"de121554": "addLike(uint256,bool)", +"de12b52c": "getTopBlock()", +"de12b839": "GetPie()", +"de13bec6": "getApiByName(string)", +"de1446e8": "view54()", +"de14bbf7": "randomGen(uint256,uint256)", +"de14c818": "approvePayment(uint256)", +"de14d323": "confirmAlice(uint256)", +"de14e54d": "setActivity(address,bool)", +"de150d5d": "throwSlammer(bytes32,bytes32,bytes32)", +"de154352": "getBlocksTillMattew()", +"de154761": "upgradeManager()", +"de1565fe": "MainnetProtocol()", +"de1682a5": "PTLC()", +"de170570": "getTiers()", +"de176643": "_advisorsSupply()", +"de179108": "allSaleCompleted()", +"de17dfa9": "setCryptaurToken(address)", +"de1881a8": "processingFee()", +"de18af92": "getEmployerInvoices(address,uint8)", +"de18bec6": "BeneficiaryChange(address)", +"de18dd18": "refuseSale(address[])", +"de192a20": "ARChain(uint256,string,string)", +"de1955df": "reclaimByReceiver(address,bytes32)", +"de1ac2fd": "checkOperator(address)", +"de1b0486": "withdrawFrom(address)", +"de1b27f5": "SALE_ALLOCATION()", +"de1bee1b": "dogexSupply()", +"de1c237f": "getarg_2_input()", +"de1c78fb": "batch_send(address[],uint256)", +"de1c7f70": "getEns(address)", +"de1c977a": "testPreDistribute()", +"de1e46e6": "placeBet(uint256,uint256,uint8,int256)", +"de1e8de8": "MINIMAL_INVESTMENT()", +"de1eb2d0": "withdrawQuantity()", +"de1f892a": "adjust_ERC223Transfer(bool)", +"de1ff163": "isCurrentOrPastAccountReader(address,address)", +"de2037a7": "createSensor(uint256,uint256,uint256)", +"de20555f": "getGoldStatusCustodianverify(address)", +"de20bc92": "Stake()", +"de2111e2": "got()", +"de217625": "setAssets(address[])", +"de2184bf": "voting(address,uint256,string)", +"de21cd78": "allItems(uint256,uint256)", +"de21dc6f": "fundit(address)", +"de2237d3": "getVotersLength()", +"de223f63": "transferPauseOperator(address)", +"de242ff4": "allowance()", +"de24d3ba": "WEBCOIN()", +"de255778": "relocationActive()", +"de26bbb2": "percentage(uint256,uint8)", +"de271ee0": "depositAngelInvestmentEth()", +"de272835": "advisorIssue(address,uint256)", +"de2831f2": "getRemainingBonus()", +"de283b21": "current_transferred()", +"de28431c": "priceLastUpdate()", +"de287359": "acl()", +"de28ba54": "MorpheusTokenFAKE()", +"de28fc1d": "icoSender()", +"de2904de": "CapUpdated(uint256,bytes32,uint256)", +"de292789": "getResult()", +"de2994c4": "unfreezingTimestamp()", +"de2a4a43": "RLLToken(uint256,string,string,address)", +"de2a9778": "createProxy(address,address,uint256,uint256,uint256,uint256,uint256,address,uint256,string,uint8,string,bool)", +"de2b2cd2": "changeDonor(address)", +"de2b4473": "setSaleDepositsAllowed(bool)", +"de2c1d09": "SendERC20ToDex(address)", +"de2c1e85": "_packWarriorCommonData(uint256,uint256)", +"de2c75ee": "getIncidentByUUId(bytes32)", +"de2e6136": "sendGift(address)", +"de2ed893": "totalDonations()", +"de2f827e": "saveChickenOf(address)", +"de301e8c": "getRTEBonusTokenVaultBalance()", +"de3039d2": "findPrecedingPrice(uint256)", +"de306341": "createMineForToken(uint256,uint256,uint256,uint256,uint256)", +"de31482a": "tokenHasDistributed()", +"de318242": "Mani()", +"de326c1e": "movePatentData(uint16[],address[],uint256[],bool[],uint256[],uint256[],uint256[])", +"de329396": "ownerSetMaxProfit(uint256)", +"de32abd1": "mulExp(uint256,uint256)", +"de33d8d8": "Print(string,address)", +"de341661": "unpause_2()", +"de346a40": "whiteListERC20(address)", +"de34bacd": "cardPrice()", +"de35a696": "Child(string,address)", +"de35be81": "submitSellOrder(bytes32,uint256,uint256)", +"de377015": "maxIcoTokensSold()", +"de37ca12": "MyFirstSmartContract()", +"de37e977": "thisTokenBalance()", +"de38460b": "nextSaleAgent()", +"de3849be": "owner_AirdropUpdateToken(address[],uint256)", +"de385438": "calculateEmission(uint256,uint256)", +"de38a5f4": "verifyKYC(bytes32,bytes32,bytes32,bytes32,bytes32)", +"de38c771": "setFundingAmount(uint256)", +"de38eb3a": "MAX_TIMEOUT()", +"de3989f5": "CalledA()", +"de39acea": "get32(bytes,uint256)", +"de3a8511": "teamKeepingSupply()", +"de3ab731": "evaluateAfterQuery(bool,uint256)", +"de3b5061": "updateBuyType(address,address,int256)", +"de3b653a": "IsReleaseToken()", +"de3bcb97": "takeAll()", +"de3bec59": "baseowner()", +"de3d0290": "gwtoken(uint256,string,uint8,string)", +"de3dac84": "freezeAccount(uint256)", +"de3e3492": "setRebase(uint256)", +"de3ea04a": "SAGAToken()", +"de3f18e2": "winningTeam()", +"de3f26eb": "oracleRegistryContract()", +"de3fbdee": "addRate(uint256,uint256)", +"de400629": "createListingWithSender(address,bytes32,uint256,address)", +"de4125b0": "addWineryOperationEndorsement(string,uint256,bool,string,string)", +"de4138de": "getCurrentStateId()", +"de41e1a1": "assignOwner(address[],uint256,address)", +"de42dcc9": "LuckCashToken(uint256)", +"de42f045": "auditTimeoutInBlocks()", +"de43844b": "fixedExp(int256)", +"de44a17e": "setNewModifier(address)", +"de44bf01": "getCreateUniverseParentUniverseValue()", +"de459c9b": "RATE_SALESTAGE6()", +"de469071": "hashBetSum()", +"de47864c": "testSafeAdd(uint256,uint256)", +"de47e0bf": "withdrawBaseETH()", +"de48ff52": "updateState(int128,uint128,uint8,bytes32,bytes32,bool)", +"de494190": "getCommentIdByAd(uint256,uint256)", +"de49bd54": "BurnTokensAndSetAmountForNewBlockchain(address)", +"de4b3262": "setBasePrice(uint256)", +"de4b3a73": "defaultText()", +"de4b4073": "devSend()", +"de4b45fa": "finalizeReclaim()", +"de4b51eb": "setTrustedAddress(address,address,bool)", +"de4c0574": "migrateAllowancesFromLegacyRep(address[],address[])", +"de4cd094": "convertToDecimal(uint256)", +"de4d51a5": "setSaleType_Airdrop(uint8,uint8,uint32,uint8,int256,uint256,int256)", +"de4f4d2b": "totalEthHandled()", +"de4f9383": "transferEtherFrom(address,address,uint256)", +"de5007ff": "sweepMsg()", +"de50f2fe": "KycClaveChain(address)", +"de5101af": "timestampToDate(uint256)", +"de51f57e": "setValueStep3(uint256)", +"de52ccbe": "NGX()", +"de530bbb": "EMISSION_FOR_SALESTAGE4()", +"de534744": "tokenDistribution(address,uint256)", +"de563b89": "removeRatio()", +"de56a245": "editionOptionalCommission(uint256)", +"de571e48": "getCollectedAmount()", +"de575a02": "dismissRoom(uint256)", +"de576c8a": "CREATED_STAR5()", +"de5785d5": "feesAvailableForWithdraw()", +"de578a90": "ApodTokenContract()", +"de57e8b4": "releaseEscrow(bytes16,address,address,uint256)", +"de583ed3": "_improveCard(uint256,uint256,uint256)", +"de5866f9": "s19(bytes1)", +"de589fa9": "TokenLongExercised(address[2],uint256[8],uint8,bytes32[2],uint256,uint256)", +"de58d156": "createAsset(string,string,string)", +"de5990ca": "INTREPID_VOUCHER_LIMIT()", +"de59a5cb": "SaleClockAuction(address,address,address,uint256,uint256)", +"de5ac86d": "createWager(bytes32)", +"de5b71f7": "distributeReward(address,uint256,uint256)", +"de5b9987": "getUnitDefenseMultiplier(address,address,uint256)", +"de5b9e4f": "BitMEDSmartToken()", +"de5bb5a2": "nEdits()", +"de5c995e": "Y2_lockedTokenReleaseTime()", +"de5cb7ed": "DutchAuctionPoD()", +"de5cf247": "giveTokens(address,address,uint256,string)", +"de5d953a": "logSingleIndex(bytes,bytes,uint256)", +"de5da0cf": "nextGiftId()", +"de5dc6c8": "tokenCapped()", +"de5dead6": "reduceInventories(uint256,uint256,uint256,uint16)", +"de5e21df": "timerStart()", +"de5e7ac4": "getOutcome(address)", +"de5eaa83": "donate(uint8,bytes32,bytes32)", +"de5eeb6e": "preICOAddress()", +"de5f3ec6": "buy10Price()", +"de5f5517": "lad(bytes32)", +"de5f72fd": "faucet()", +"de5f9866": "getTokensLeft()", +"de605ecc": "changeSettings(uint256,uint256,uint32)", +"de60a67d": "maxCapIco()", +"de620676": "_sellprice()", +"de622de4": "tgeStarted()", +"de62319c": "IQT_CONTRACT_ADDRESS()", +"de625d1f": "totalReceivedWei()", +"de628e3b": "tokensCalculator(uint256,uint256,uint256,uint256)", +"de629235": "getCertificationDocumentAtIndex(address,uint256)", +"de637901": "poptxs(address,uint256)", +"de63a530": "setAddressAndFunctionIdVoteRules(address,address,bytes4,bool,uint256[5])", +"de63dc35": "setPartnerFromPreICOAffiliate(address[],bytes32[],uint256[])", +"de640e19": "Investment(uint256)", +"de642b5a": "cbdc(uint256,string,string)", +"de644ebd": "firstMintRound0For(address[],uint256[],uint8[])", +"de648b87": "setSKLContractAddress(address)", +"de656b71": "BecomeSnailmaster()", +"de658979": "_updateCompany(bytes32,bytes32)", +"de6595b2": "WhitelistedUpdated(uint256,bool)", +"de65da20": "purchaseGame()", +"de661217": "left75(uint256)", +"de667e70": "setBuyer(uint256,address)", +"de66b5f7": "unidentifiedSaleLimit()", +"de66ed0d": "getTargetReporterGasCosts()", +"de6746a5": "founders(address)", +"de6764ba": "Swanroll()", +"de67fd05": "deleteLayer(uint256)", +"de683a7d": "change(address,uint256,address)", +"de68c43f": "noFee(address,address,uint256)", +"de6a1b19": "landmarkPoolTotal()", +"de6a9d83": "CheckResultCalled(bytes32,address)", +"de6ab39c": "INITIALSUPPLY()", +"de6b8a2e": "getOrderLength(address)", +"de6b978d": "POA20(string,string,uint8)", +"de6baccb": "transferWithLock(address,uint256,uint256)", +"de6bd0e8": "redistributeEthForAddresses(uint256,address[])", +"de6c4f4b": "reset(address,address,address,address,address,address,address)", +"de6ca3f0": "_setCommit(uint256,address,bytes32)", +"de6cdd2e": "getExchangeInfo(bytes32)", +"de6eb4be": "NBAONLINE()", +"de6ed7dc": "GoldIssueBurnFee(string)", +"de6ef007": "amountTokensPerEth()", +"de6f24bb": "sendMessage(address,string)", +"de7086f6": "TemplateToken()", +"de70b36c": "RevokeViewingPrivelege(address)", +"de718e3f": "initialWeiRais(uint256)", +"de71c467": "presentObject(bytes,bytes32)", +"de71d56b": "getStandartComponent(uint256,uint256)", +"de72a01d": "Agt()", +"de72b83d": "totalBountyAmount()", +"de72cab0": "finishBonusPeriod()", +"de733397": "allowClaiming()", +"de7337a1": "changeFloor(uint256)", +"de7383e0": "handleTokensReceived()", +"de742c2d": "getFreeAlien()", +"de74880c": "platformUnfreeze()", +"de74e57b": "listings(uint256)", +"de750f6f": "getNine(uint256)", +"de753fe5": "PrecioUnidadPase()", +"de758458": "IPFSProxy(address[],uint256,uint256)", +"de75c36e": "addressMasterNodes()", +"de763a40": "getEtherFeeForPriceInCandy()", +"de77229f": "MinterOwnershipTransferred(address,address)", +"de77743d": "needsbeneficiary(uint256)", +"de7874f3": "plyr_(uint256)", +"de78be15": "onSoftCapReached(uint256)", +"de78e78a": "tokenLaunched()", +"de78ed85": "actual_balance(address)", +"de795edd": "prova()", +"de79fb92": "UKTTokenVoting(uint256,bytes32[],address[],uint256[])", +"de7a5956": "getWinnerTeam()", +"de7ae335": "WithdrawDividendsAndCouponsTo(address)", +"de7b1a77": "finalizeTokenSaleManager()", +"de7b24b8": "ICOFailed(uint256,uint256,string)", +"de7b89bd": "GetUserExtraData1(address)", +"de7bea74": "getThreshold(uint8)", +"de7c2ed2": "TEAM_VESTING_DURATION()", +"de7c99c3": "releasePrivateBonusTokens(address[],uint256[])", +"de7cb327": "Proof()", +"de7d4fc4": "getGameNumber()", +"de7dd576": "etherPriceInPoundPences()", +"de7ea691": "getRandom(uint8,uint256)", +"de7fe3e7": "getItemInfo(uint256)", +"de803198": "setFunderSmartToken(address)", +"de80344d": "startStage(uint256,uint256,uint256,uint256)", +"de80b0a5": "promo()", +"de812733": "createBaby(uint256,uint256,uint256,uint256)", +"de81333e": "claimHeldBalance()", +"de815e61": "FourArt(address,address,address,address,address,address,address,address,address,address,address)", +"de81aaaa": "hardCapUSD()", +"de821a35": "_updateGenerationSeasonFlag(uint256,uint8)", +"de8248fb": "FEE_PERMILLE()", +"de824f93": "TimeLeft()", +"de82b54d": "cancelSellToConsumer(address)", +"de82efb4": "gimme()", +"de831ee7": "changeMinTransfer(uint256)", +"de840f11": "NassauToken()", +"de850c71": "dequeueAlternately()", +"de852afe": "revokeAccessDeploy(address)", +"de854065": "Portfolio(address)", +"de85a4a9": "tokenIssuedMkt()", +"de85c040": "GetMyRound()", +"de866db1": "buyContract()", +"de86ba28": "_addMintedTotallyByBridge(uint256,address)", +"de874962": "EOS_Silver()", +"de8801e5": "presaleStart()", +"de887bba": "getSecretBet(address)", +"de889d50": "refundWallet(address)", +"de88a342": "payDividends()", +"de894d3a": "_transferDividends(address,address,uint256)", +"de8a1c2e": "OMIToken()", +"de8a6fa2": "baseEthCapPerAddress()", +"de8b1d5c": "createCustomPresale(uint256,uint256,uint256,address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"de8b888e": "freezeTokenTransfers()", +"de8ba6d1": "getAndDel(bytes32)", +"de8bb64f": "TEFC()", +"de8bf3b6": "noRoundMiniGame()", +"de8c85ea": "operationToken()", +"de8f246c": "setStartTimestamp(uint32)", +"de8f50a1": "verify(bytes,bytes,bytes)", +"de8f55af": "dailyDistribution()", +"de8fa431": "getSize()", +"de901104": "setLLV_edit_15(string)", +"de9122f7": "wipeAttributes(string,bytes32[])", +"de917978": "SafecontractsTREXFund()", +"de91af7b": "totalPoolCap()", +"de91bb10": "CardManger()", +"de92af4b": "LongBought(address[2],uint256[3],uint256)", +"de931662": "callToken()", +"de934416": "balancePrivate(address)", +"de934d86": "BOT_ELEMENT_1()", +"de9364f4": "testFailBurnGuyWithoutTrust()", +"de940c29": "renounceOwnershipForever(uint8)", +"de942e62": "getLLV_edit_6()", +"de944520": "getBurnAmountApproval(address,address)", +"de9476dd": "addNewAirdrop(string,uint256,uint256,address,uint256)", +"de94b800": "backToken(address,uint256)", +"de957cf4": "setChunkSize(uint256)", +"de9652b1": "getcoinSortinglength()", +"de96587e": "removeAmbassador(address)", +"de96e823": "StarbaseCrowdsale(address)", +"de981f1b": "getContract(uint8)", +"de98bc4f": "LogMintingStopped()", +"de990bda": "etherMaximum()", +"de995b90": "sendOwnershipFrom(address,address,uint256)", +"de998dd0": "_affiliateProgramIsActive()", +"de9a1bdb": "MyToken(string,string,uint8,uint256)", +"de9b33f9": "getWithdrawNonce(bytes32)", +"de9b9364": "max_investment_eth()", +"de9d0e85": "_setPendingAnchor(address,uint256)", +"de9daf91": "setEmissionLimit(uint256)", +"de9db5d3": "projectShare()", +"de9eade3": "totalInitialAddresses()", +"de9ee13e": "calculateMaximumPayment(address,address)", +"de9f28e4": "getJobTotalSkills(uint256)", +"de9f4248": "identities()", +"de9f57f5": "LogBroker(address)", +"dea011f5": "updateService(address,address)", +"dea01b3e": "removeOneSecret(bytes32)", +"dea06188": "NumberOfBlockAlreadyMined()", +"dea09ef3": "takeFee(address,address,address,uint256,uint256)", +"dea0a837": "SetParticipantURL(address,address,string)", +"dea0cbd7": "viewMaxGasPrice()", +"dea19cda": "_fetchOrderByIdWithWithPayer(string,address)", +"dea1bd69": "setValidity(uint256)", +"dea216af": "nestedSecond(uint256)", +"dea2356c": "setInvestorGain(uint256)", +"dea37fb0": "Force()", +"dea3ce27": "setEligibleForReimburse(bool)", +"dea4267b": "addCourse(string,string,string,string,string)", +"dea5408f": "paymentSizeB()", +"dea5de80": "phase_4_Time()", +"dea6aec7": "getTargetSupply()", +"dea7b768": "submitBallotNoPk(bytes32)", +"dea89056": "holdMax()", +"dea8d6b6": "testCannotSetPresaleTokensAfterSaleStarts()", +"dea90acf": "getEmergencyTransferSignersCount(address)", +"dea95ff8": "setRoundNum(uint256)", +"dea97078": "getPendingTransactionsSellerAddresses()", +"dea9b464": "depositCollateral(bytes32,uint256)", +"dea9c72b": "getLatestPreReleaseTree(bytes32,uint32,uint32,uint32)", +"dea9ecd6": "DeanCoin(uint256,string,uint8,string)", +"deaa0d0a": "withdrawal1()", +"deaa59df": "setWallet(address)", +"deab5a78": "TEGTY()", +"deac4659": "inArray(address)", +"deaca58e": "settlvlement(address,uint256,address,string,string)", +"dead98f6": "part_to_vehicle(uint256,string,uint256)", +"dead9f93": "setParams(uint256,uint256,address,address)", +"deadc3dc": "currentStepIndexByDate()", +"deae5d4d": "networkPlaceholder()", +"deaf5a5e": "transferDocument(bytes32,address)", +"deb06c3a": "gameActive(uint256)", +"deb077b9": "nextSaleId()", +"deb081df": "getIslands()", +"deb0e09b": "getVotingDuration()", +"deb209f6": "isProviderValid(uint256)", +"deb2432b": "zecId()", +"deb27fc5": "getDragonTypes(uint256)", +"deb2e0b9": "MedNet()", +"deb36e32": "startVesting()", +"deb41f8d": "setTuple(uint256,uint256,bytes32)", +"deb43874": "Heritable(uint256)", +"deb52738": "finaliseFirstPhase()", +"deb53ab4": "BeneficiaryStake(uint256)", +"deb5d6c2": "inviterReg()", +"deb60627": "MhpCoin()", +"deb6930c": "PriceTicker()", +"deb77083": "stage2Bounty()", +"deb775a7": "tokenEmission(uint256,uint256)", +"deb80111": "transfer_asset(address,uint256)", +"deb80d66": "ProvidencePresale()", +"deb83bcc": "crowdsaleEndLockTime()", +"deb931a2": "getOwner(bytes32)", +"deb93b5b": "balanceOfOn()", +"deb979ac": "mktValueupdated(uint256)", +"deba5e95": "addCandidate(address,bytes32,string)", +"debad25e": "TeslaTest()", +"debad27f": "getProducts(uint256)", +"debaeb0e": "bonusLevel1PercentModifier()", +"debbc6eb": "btcRelay()", +"debc74f6": "buyRateZeroQuantity(uint256)", +"debc94ff": "Buckcoin()", +"debcbdcf": "preSaleStartdate()", +"debd122e": "setUp(uint256)", +"debe1c69": "setAccountingParams(uint256,uint256,uint256)", +"debe9768": "mintTokensLockedMultiple(uint256,int256,address[],uint256[],uint256[])", +"debf5b9f": "phase_4_rate()", +"debfbade": "calcNextNumShareholders(address,address,uint256)", +"dec0257d": "deleteContract(bytes32)", +"dec04b9b": "testNow()", +"dec10357": "currentCandyTotalSupply()", +"dec18b46": "second_withdrawal(uint256)", +"dec22b07": "forceExecuteRandomQuery()", +"dec24118": "lastCallBlock()", +"dec26d55": "LifeSet_003()", +"dec32ae8": "byTokens()", +"dec4b436": "subAttack(uint256,uint256)", +"dec57e94": "QTUM()", +"dec5cf53": "Exile()", +"dec6bc91": "EthernautsPreSale()", +"dec6c2d8": "updatedDistributee(address,uint256)", +"dec74ae9": "eurId()", +"dec7542f": "changePermission(address,address,bytes32,bool)", +"dec7ee57": "convert2Platinum(uint256)", +"dec7fa11": "minimumTokenAmount()", +"dec8f52e": "getVested(address)", +"dec96e7b": "setTitulaire_Compte_3(uint256)", +"dec9ba44": "createBet()", +"deca15db": "calcQueryCost(uint256,uint256)", +"deca6e76": "adminsInitialized()", +"decadbcc": "mainstreetCrowdfund()", +"decb3a90": "winAmount()", +"decb4803": "Tipcoin()", +"decbd169": "createPet(uint8,string)", +"decd8785": "addPartnerAddress(address)", +"decd8a25": "MINI_GAME_PRIZE_CRYSTAL()", +"decde7c0": "GetCert(uint32)", +"decdffbb": "_emitJobRatingGiven(address,address,uint256,uint8)", +"dece296f": "RET_DIV()", +"dece2e67": "releaseFundsSeller()", +"dece3355": "MinePoS(address,uint256)", +"decebbce": "getFunds(address)", +"decf1e64": "minimumPledgeAmount()", +"decfe0d4": "destroyEnabled()", +"ded04fe9": "testFailCreateNewRevisionNotOwner()", +"ded05da5": "changeIcoAddress(address)", +"ded1588c": "OwnerWithdrawTokens(address,address,uint256)", +"ded1c11b": "startFinalStage1()", +"ded1d0b8": "createMiniTicket(address,uint256)", +"ded1e438": "checkRatio(uint256,uint256)", +"ded1e4de": "DisputeResolver(address[],address)", +"ded1e7e3": "innerGreet()", +"ded1f580": "Unregister(address,bool)", +"ded24016": "getDynamicArrayElement(uint256)", +"ded2d0f4": "awardToken(address,uint256)", +"ded30375": "setectoken(address)", +"ded317a8": "minCapUSD()", +"ded37745": "maybeAnotherTime(uint256)", +"ded4980f": "withdrawInvestmentsBeneficiary(address,address)", +"ded54a4c": "stitch(uint256,uint256,bool)", +"ded5bc6c": "getBdpImageStorage(address[16])", +"ded5bd14": "setApp(string,uint256,address)", +"ded78d3d": "trade(address,uint256,address,uint256,uint256,address,uint8,bytes32,bytes32,uint256)", +"ded8454a": "addressToBytes(address)", +"ded8f76d": "_sort(uint256,uint256)", +"ded94688": "showOwner()", +"ded9b075": "getAllDepositesCount()", +"deda0b5a": "mockSetResult(string)", +"deda20de": "doPurchaseFor(address)", +"deda2f9d": "triggerStealManually(uint32)", +"dedb7e25": "_ifEvenThenOddTooFlags(uint256)", +"dedc440f": "getEscuela(uint256,uint256)", +"deddab12": "withdrawalToken(uint256)", +"dede12a4": "startWeekOne()", +"dedeb3ca": "referralRateInvitee()", +"dedf141e": "setDates(uint256,uint256)", +"dedfb567": "multiFreezeAccount(address[],uint256)", +"dee023e2": "transferAllArgsNoAllowance(address,address,uint256)", +"dee1bfbe": "totalLendingFiatAmount()", +"dee1cfd8": "icoStartTimestampStage()", +"dee1f2af": "addToken(address,uint256,uint256)", +"dee2596b": "changeBonusTokenAddress(address)", +"dee2b058": "setCapacity(uint256,uint256)", +"dee2fedd": "setproduct(uint256,uint256,string,string)", +"dee3a226": "finalizeSto()", +"dee3efb2": "getWorkerPoolByIndex(uint256)", +"dee4b246": "buyTokens(uint64,uint256,uint8,bytes32,bytes32)", +"dee5216e": "applyRuntimeUpdate(address,address,uint64,uint64)", +"dee54b68": "WalletAddressUpdated(address,address)", +"dee555bf": "discountRateIco()", +"dee5a9e7": "PRICE_STAGE_THREE_BONUS()", +"dee6e5a4": "toggleKYC(address,bool)", +"dee73dbb": "AcceptedOwnership(address)", +"dee751ce": "createHoldToken(address,uint256)", +"dee7e59b": "LogWithdrawTokens(address,uint256)", +"dee81a13": "Local()", +"dee846c5": "updateJoinedCrowdsales(address)", +"dee8575c": "getNumBits(uint256)", +"dee86dfb": "marketIdeas()", +"dee8bd51": "ReleaseICO()", +"dee9f53f": "idOf(uint256)", +"deeb2efe": "getShifters(address,uint256)", +"deeb7124": "MDAToken()", +"deebeac9": "transferToken(address)", +"deec053d": "getMarketCachedIndex(uint256)", +"deec4c20": "getCardsInfo(uint256)", +"deecb187": "KyberNetworkProxy(address)", +"deed18e2": "isReadyToFinalize()", +"deed2be0": "getDailyPlayers()", +"deed4b80": "isFirstLockTimeEnd()", +"deee9adb": "setPOOL_edit_10(string)", +"deef6c99": "ZigguratToken(uint256,string,uint8,string)", +"def04570": "TheFrozenDeadShitCoin()", +"def0defa": "getOwnerHistoryCountOf(bytes32)", +"def18101": "currentBid()", +"def1a2da": "vc3Wallet4Pct()", +"def2489b": "convert(address)", +"def2be48": "getBAAAU(bytes32,address,address,address)", +"def4ba32": "utrTestToken()", +"def51dc2": "CIC()", +"def59575": "manualyAddReferral(address,uint256)", +"def59ea5": "addMember(address,address,uint256)", +"def5bbd0": "strConcats(string,string,string,string,string)", +"def7eb44": "maxChangeFee()", +"def843ef": "createOfAthleteCard(string,address,uint256,uint256,uint256)", +"def86cbb": "modifyWhitelist(address[],address[])", +"def871ef": "AirDrop(uint256)", +"def8ecf4": "removeBuyOrder(uint256)", +"def9176c": "team1Balance()", +"def92c69": "MAX_BALANCE()", +"def98a72": "recipientExtraMIT()", +"def9c7e2": "_escrowStakeOwnerPaymentEarning(address,bytes32,uint256,uint256,address,bool)", +"defa92ee": "depositDividends()", +"defaa5f2": "_transferEthereum(uint256,uint256,uint256)", +"defafa37": "setRefundTimelock(uint256)", +"defb9584": "PROMO_CREATION_LIMIT()", +"defbc073": "weiUnlocked()", +"defc876e": "removeAddressFromCaller(address)", +"defc8ae9": "BuyOffer(address,address,uint256,uint256,uint256,uint256)", +"defce6d8": "FlagAddress(address)", +"defe2883": "totalSupplyByAsset(bytes32)", +"defe2c47": "_checkRecommend(bool,uint256)", +"defefe96": "payCompoundTerm(uint256,uint8,uint8)", +"deff30c6": "sellTokens(address)", +"deff3a37": "purchaseReject(address)", +"deff41c1": "m_owner()", +"deff5757": "setPartnersRelease(uint256)", +"deff71b8": "setAllFlagPairs(bool[2][])", +"deff7f2f": "CrowdFundings()", +"deffbaee": "addOwnershipChest(address,uint256)", +"df000ff7": "acceptParityOwnership()", +"df013fab": "setDelegadoDeEscuela(bytes32,bytes32,uint256,uint256)", +"df018dbd": "process(address,address,address,string,string)", +"df022cbc": "hello1()", +"df034586": "lockCount(address)", +"df034cd0": "updater()", +"df034db8": "aCASATest()", +"df037443": "timeoutX()", +"df0441cc": "_checkUnlock(address)", +"df054797": "securityAudit()", +"df0584af": "ClimateCoinAddress()", +"df065d78": "TEST_PLAYER()", +"df06c1d8": "plotsOwned(address,uint256)", +"df06f906": "numBets()", +"df0795aa": "setKycProvider(address)", +"df08ce62": "give(address[],uint256[])", +"df09176b": "ActualizePrice(uint256,uint256,uint256,uint256)", +"df0969dc": "clearPlayerPrize(address)", +"df09921f": "institutionAllocation()", +"df0a2bda": "refundIgnoredBids(uint256)", +"df0a8589": "dealAmount()", +"df0ad3de": "upgradeabilityAdmin()", +"df0b1344": "SchmeckleTokenSale()", +"df0b52c8": "keyAddress()", +"df0bcf4d": "setAvatar(uint256)", +"df0c428c": "releaseAdvisorsTeamTokens()", +"df0c7a55": "nextPrice(uint16)", +"df0cd37b": "Etheremojis()", +"df0d05d9": "EmporioExchage()", +"df0d1078": "volumeType1()", +"df0da20e": "BONUS_WINDOW_1_END_TIME()", +"df0efbf5": "rateForSale(uint256)", +"df0f093b": "purchasePeriod()", +"df0f26f9": "getBalanceAddr(uint256)", +"df0f3227": "DurationAltered(uint256)", +"df0f3c19": "getGameCountdown()", +"df0f3e1c": "isFalse(bool,string)", +"df109ee1": "AuctionManager()", +"df10dd6e": "checkSubAvailability(bytes32)", +"df117c47": "updateSuperPrivilegeParams(uint256,uint256)", +"df11d258": "witness(bytes32,bytes32,bytes32,bytes32,uint8,bytes32,bytes32)", +"df12b94e": "investBalance()", +"df133cf9": "minesPrice(uint256)", +"df1340a0": "QTR_Token()", +"df13569d": "FACTOR_6()", +"df13994e": "callback(bytes32)", +"df143fb7": "HackerGold(address)", +"df148cdb": "setPonziAddress(address)", +"df155488": "startLockTime()", +"df15c37e": "getWinners()", +"df15f87e": "FiatRaisedUpdated(address,uint256)", +"df1614cf": "setLendFee(uint256)", +"df1673e9": "CHINESE_EXCHANGE_4()", +"df175e9b": "newCampaign(address,uint256,uint256)", +"df17c4b1": "delegateTransferAndCall(uint256,uint256,address,uint256,bytes,uint8,bytes32,bytes32)", +"df181831": "staff_1()", +"df1836ca": "referrerAndOwnerPercent()", +"df18e215": "updateTokenStore(address)", +"df190048": "getAdPrice(uint256)", +"df19b71c": "digitToNumber(uint8)", +"df19df5d": "ownerOperationsLength(address)", +"df1a5aab": "reservedTokensClaimStage()", +"df1abf83": "revertTokensByKYC(address)", +"df1b817e": "setupCutie(uint40,uint16)", +"df1c455c": "unallocated()", +"df1cd2b5": "volumeBonusesTokens(address)", +"df1cf293": "addAuction(uint32,uint256,uint256,uint256)", +"df1d4559": "setFOUNDATION_POOL_ADDR(address)", +"df1dbbc9": "ShareToken()", +"df1dd826": "trade(uint256)", +"df1e36c6": "unlockDeposit(string,address)", +"df1ead82": "disinvest()", +"df1ec3ea": "BesideERC20(uint256,string,string)", +"df1f4a6e": "getTimestring(uint256)", +"df1fc781": "KickicoCrowdsale(address,address,address,address,address,address,address,address,address)", +"df201a46": "simple()", +"df203ff7": "depositGasCost()", +"df20b119": "balanceEthCrowd(address)", +"df20c021": "addNewChannelAndRankofuser(address,string,int256)", +"df20d738": "BokkyPooBahsEtherRefundablePrize()", +"df221223": "setWeiExchangeRate(uint256)", +"df22bf83": "canUseTokens(address,uint256)", +"df23128f": "adjustTranche(uint256)", +"df234815": "tokensAvailableAtTierInternal(uint8,uint256,uint256)", +"df2436b3": "isExistByBytes(bytes32)", +"df247c5d": "CareerXonToken(uint256,uint256,uint256,uint256)", +"df25322d": "getFundReceiver()", +"df25ecf8": "DSTContract(string,string)", +"df25ee23": "getIndexId(address,bytes)", +"df25f3f0": "minPerTx()", +"df26ca08": "emitError(uint256)", +"df28aef7": "withdrawLiquidatePool(uint256)", +"df28d6fa": "Dex2(address)", +"df294588": "get_Gains(address,address)", +"df294cad": "allocateNominalToken(address,uint256)", +"df295080": "changeAbstractStorage(address)", +"df29b982": "emergencyWithdrawERC20(address,uint256)", +"df29dfc4": "get_start_time()", +"df2a201b": "setSystemOraGasLimit(uint256)", +"df2a2753": "LDGToken()", +"df2a29da": "getDenominationToken()", +"df2a6e4f": "kscBatchSellByOtherCoin(address,address[],uint256[],uint256,uint256[],string)", +"df2b1cf8": "toBytes(uint256,uint256)", +"df2b1f28": "tokenSetTransferFeeReceiver(address,address,address,address)", +"df2bf12b": "totalBatchOf(bytes32)", +"df2c05a9": "UbermenschPrefundToken(address)", +"df2c7fc1": "AuctionFinished(address,uint256,uint256,uint256,uint64,uint256,address)", +"df2cdbed": "_setBidState(bytes32,uint8)", +"df2d33d5": "isBreakingCap(uint256)", +"df2d44af": "EthLongExercised(address[2],uint256[7],uint8,bytes32[2],uint256,uint256)", +"df2df29a": "CEO_Signature()", +"df2dfb20": "canIBuy()", +"df2e5c0f": "changePricePerUnicorn(uint256)", +"df2f0a4a": "getDecisionBlockNumber(uint256,uint256)", +"df2fbae6": "totalAvaliableSupply()", +"df300b46": "getThing(bytes32[])", +"df305680": "clearProposalLocked(address)", +"df30e592": "isValidContributorId(uint256)", +"df31566e": "setUInt(string,uint256)", +"df3164c6": "Release()", +"df31b589": "bonusForPreICO()", +"df320b29": "refundBet(bytes32)", +"df32754b": "owned()", +"df32dc5c": "withdrawEarning(uint256)", +"df331545": "reservedOperationalExpenses()", +"df334093": "acceptingDeposits()", +"df342d66": "setSubcontractAddressAndDataPattern(uint256,address,uint256,uint256,uint256,uint256,bytes,bytes)", +"df36318a": "exchangeStart()", +"df3864d5": "ticketsSold(uint256)", +"df390d63": "encodeData(uint128,uint256,uint24,uint40)", +"df3959f5": "setInitializeUniverseValue()", +"df3a4fa1": "maxSubdivisions()", +"df3a635a": "removeDeed(address,uint256)", +"df3a6b10": "testMemberAddedEvent()", +"df3aa1fc": "FTXToken(address)", +"df3b75f0": "test_standardCampaignDeploymentAndUse()", +"df3be668": "productLimits(bytes32)", +"df3be9e8": "ERCFW()", +"df3c211b": "calculateVestedTokens(uint256,uint256,uint256,uint256,uint256)", +"df3c3a30": "mintLocked()", +"df3c5a42": "supplyICOContract(address)", +"df3c8620": "num_challenges()", +"df3cc390": "setUsdRate(uint256)", +"df3e0a1d": "completeEscrow(uint256)", +"df3f5974": "readPublicRecord(bytes32,bytes32)", +"df3fb59e": "DSPRegistryReplaced(address,address)", +"df40503c": "getRemainCoins()", +"df40a089": "setDrawAddress(address,address)", +"df41765e": "circulatingTokensFromSale()", +"df418fbf": "returnBytes1(bytes)", +"df41d979": "ico_distribution(address,uint256)", +"df426401": "founderTokenUnlockPhase2()", +"df428e3b": "createChildUniverse(uint256[],bool)", +"df42dfa9": "initialARXSupplyInWei()", +"df42e80e": "Asset()", +"df43b699": "setInvoiceCancelled(address,address,uint256)", +"df43b830": "absolutCBD()", +"df444df1": "createEscrowBySeller(address,uint256)", +"df459426": "parse_signature(bytes32,bytes,bytes)", +"df4604b3": "submitOrVote(bytes32)", +"df462098": "setNextCommonTTMTokenId7(uint64)", +"df463ed3": "buyService(uint64,uint64)", +"df47a924": "DiaToken()", +"df482ad5": "privateFundSupply()", +"df483622": "addLotteryParticipant(address,uint256)", +"df487962": "FibokenCreated(uint8,address,uint256)", +"df48a2b0": "setReinvestmentAddress(address)", +"df49804a": "mtv()", +"df49dfe3": "updateTransferMinimumFee(uint8)", +"df4a2ecc": "hasNext()", +"df4aaf04": "COIN_SUPPLY_ICO_TIER_2()", +"df4adb94": "getOutcomeByIndex(uint256)", +"df4b2970": "getRabbitMother(uint32)", +"df4b3351": "collectEtherBack(address)", +"df4bcf58": "isMigrationAgent()", +"df4bd18d": "setPriceAndRate(uint256,uint256)", +"df4bef32": "searchInList(address)", +"df4c2164": "mintableAddress()", +"df4c98b5": "createRentAuction(uint256,uint256,uint256,uint256,uint256)", +"df4cbb96": "commitProposal(bytes32,string)", +"df4d17dc": "initToken(address)", +"df4dfa7f": "PRE_ICO_TOKENS_AMOUNT()", +"df4e79fa": "VESTED_TOKENS()", +"df4ebd9d": "buyWanCoin(address)", +"df4ec249": "step3()", +"df4f0088": "guardVillain(uint256,uint256)", +"df4f011c": "licenseIds(uint256)", +"df4f5a72": "refunder()", +"df4fc373": "SetIPR(string,string,address,string,string,uint256,address)", +"df4fcf8e": "newFeePercentageIsSet(uint256)", +"df5055e6": "adminVer()", +"df506768": "payTeam(address)", +"df506801": "preSaleThirdCap()", +"df50a8c1": "updateFundraiser(address,bool)", +"df50afa4": "setAllowTransfers(bool)", +"df51d46b": "setUnlockEarlier(uint256)", +"df520efc": "pricePerTokenInWei()", +"df52f321": "CinociCoin(uint256,string,string)", +"df53623f": "_unlockContract()", +"df5483ad": "setImageWidth(uint256,uint16)", +"df54c659": "TransferredFoundersTokens(address,uint256)", +"df55b41a": "owner(string)", +"df55f529": "UNLOCK_TEN_PERCENT_PERIOD()", +"df565ca2": "rateRatioCVSThreshold()", +"df571e33": "postSoftRate()", +"df57904a": "GoodfieldNewRetail(uint256,string,string)", +"df57a6ec": "_generateRandomDna(string)", +"df57b742": "getReverse(bytes32)", +"df58471d": "increaseFundingGoal(uint256)", +"df58d236": "WipedAccount(address,uint256)", +"df590d89": "KnowHowChain()", +"df591e82": "goForward()", +"df59cbeb": "OwnedUpgradeabilityProxy()", +"df5a1417": "PLAYERWIN()", +"df5b588c": "PublishWinnersScoreThres(uint16)", +"df5cc291": "get4(bytes,uint256)", +"df5cf723": "delegation()", +"df5d3e89": "subBuy(bytes32,bytes32,address)", +"df5d3ec7": "setSaleEnd(uint32)", +"df5dd1a5": "addOracle(address)", +"df5dd98f": "refFeeVal()", +"df5e3569": "hasBet(uint256)", +"df5f0603": "retrieveEth(uint256)", +"df5f53f1": "checkWithdrawal(address,address,address,uint8,bytes32,bytes32,uint8,bytes32,bytes32)", +"df603769": "reconcile(uint256,address[],int256[],uint8[],bytes32[],bytes32[])", +"df61f51b": "TokensIssued(address,uint256,uint256,uint256)", +"df6378e9": "getAuctionAddress(uint256)", +"df63d908": "testYBool()", +"df63e659": "deleteAllMessages()", +"df642cad": "setCost(uint8,uint256,uint32)", +"df65d1ef": "getLuckBoyAddrList()", +"df66fc14": "sendTokenTeamAdvisor(address)", +"df67184a": "getRequiredBalance(uint256)", +"df673d35": "SISA_token()", +"df67ae3d": "GetStuffList(address)", +"df67d82d": "minETH()", +"df68a516": "viable_print(int256,uint256,uint256,uint64)", +"df68c1a2": "canTransfer()", +"df68fd99": "popElementWithPos(uint256)", +"df6a000d": "safe_withdraw(uint256)", +"df6a6002": "fourthMonthEnd()", +"df6a6b38": "redeemed(address,uint256)", +"df6ab3d5": "masssend(address[],uint256[])", +"df6abd34": "icoHardcap()", +"df6adc2a": "JackpotWinner()", +"df6af2f8": "setpatient(string,string,uint256,uint256)", +"df6af7d1": "getUnclaimedBuyerFunds(address,address,address,uint256)", +"df6afed9": "replaceArtwork(uint16)", +"df6b1ebb": "analyzeCondition(uint8)", +"df6c13c3": "getMinFunding()", +"df6c7cf4": "changeAssembly(uint256,uint64[],uint64[])", +"df6cf923": "IXTPayment()", +"df6d3afa": "setAngelHolder(address)", +"df6d4843": "getMaxLimit()", +"df6da6f9": "tokenSellData(address)", +"df6e1331": "drawGame(uint256,string)", +"df6e7a5f": "setTokenDelegation(address,address)", +"df6ee5f2": "lend(bytes32,bytes,address,uint256,bytes)", +"df6ee6b7": "addStage(uint256,uint256,uint256,uint256,uint256,uint256)", +"df6f023d": "reLoadCore(uint256,uint256,uint256,uint256)", +"df700074": "setadmin(address,address)", +"df706f77": "JTrex()", +"df708f01": "setMainContract(address,address)", +"df70ab71": "increasePositionOnBehalfOfRecurse(address,address,bytes32,uint256)", +"df70f3b5": "Jumanji()", +"df713abd": "get_time_locked_contract_size(address)", +"df7447dd": "createTicker(uint256)", +"df7458cd": "addReply(bytes32,string,uint256,address)", +"df745d28": "releaseBatch(address[])", +"df752519": "MANHATTANPROXY1STST()", +"df75574a": "buyItem3()", +"df755a98": "prPercent()", +"df75f3fb": "setPreSaleDurance(uint256)", +"df761fff": "TokensClaimedEvent(address,uint256,uint256,uint256)", +"df76d18d": "RegisterIP(bytes32,string)", +"df775a93": "skipInitBecauseIAmNotOg(address,address,uint256,uint256,uint256,uint256,bytes8,uint256)", +"df776689": "BasicIterator()", +"df77a290": "OddsAndEvens()", +"df77e074": "GetBetInfo(uint8,uint256,address)", +"df77eb1e": "transferHomeViaRelay(address,uint256)", +"df78c1dd": "payIn(uint256)", +"df79d8fa": "initialInvestorAccount(uint8)", +"df7ae3d8": "debugVal()", +"df7b70ab": "writesExercised(bytes32,address)", +"df7be446": "_removeNFToken(address,uint256)", +"df7bf704": "matchResult()", +"df7c5fca": "checkPeriodic()", +"df7cc70d": "ethUnPause()", +"df7cec28": "cancelBid(bytes32)", +"df7dbd70": "prTokens()", +"df7dfef7": "deleteAction(uint256)", +"df7efed8": "WeiinEth()", +"df8011b2": "HOWL()", +"df8089ef": "setAdministrator(address)", +"df811d7d": "numberOfPlayersInCurrentRound()", +"df816206": "getGiftIdsByRecipient(address)", +"df817e54": "checkPreIcoStatus()", +"df821cf7": "BIDCOIN()", +"df833a1a": "createGato(uint256)", +"df8344fe": "allAllowancesForManyAccounts(address[],address,address[])", +"df84807a": "templateIdOf(uint256)", +"df851f03": "calcNextPrice(uint256)", +"df8713ed": "addPot(uint256)", +"df88126f": "lockedInBets()", +"df8812c7": "addStageAmount(uint256)", +"df88401c": "KillahyToken()", +"df885536": "nxtAddr()", +"df888f4e": "AO()", +"df88f5b8": "setNotConstant()", +"df88fb44": "exchangeByPet(uint256,uint256,address)", +"df8b7771": "initialiseValues()", +"df8bb140": "cancelCampaign(bytes32)", +"df8d52a9": "get_comp(uint256,uint256)", +"df8d66e4": "addPlatform(bytes32)", +"df8dc370": "Reservation(address,address[])", +"df8de3e7": "claimTokens(address)", +"df8e03b1": "BasicWhitelist()", +"df8e739d": "bitzToken()", +"df8e9261": "_testItem()", +"df8f4376": "calcSTQAmount(uint256)", +"df8f4eb7": "originalTotalSupply()", +"df8f7971": "ProfileOwner()", +"df8f8a81": "setETCLockingAddr(address)", +"df90061b": "onSaleTokens()", +"df90c98d": "whiteListEndTime()", +"df90f719": "mln()", +"df91f2ab": "SggCoin()", +"df9204b6": "powerStatus()", +"df922744": "ScamSeal()", +"df922f3a": "changeCommission(uint256)", +"df93c9aa": "testrevert()", +"df957b04": "_couldWithdrawFromHolder(address,uint256)", +"df958553": "burnForGateway(address,string,uint64,uint64)", +"df9669e0": "setCrowdsaleEndDate(uint32)", +"df969bc0": "ADVISOR_TWO()", +"df96a336": "Bitkeun()", +"df979b92": "setIncreaseTotalWinningStake(bool)", +"df98ba00": "m_opNum()", +"df98ef33": "getResource(bytes,uint256,bytes)", +"df990c33": "becomeOwlmaster()", +"df9933e5": "SetPwd(bytes32)", +"df998f59": "checkSertificate(address,address)", +"df99f8bf": "TradeToken()", +"df9a4f56": "registerAuditor(address)", +"df9abaa0": "smallUintFunc(uint8,uint256)", +"df9b0774": "SwapResumed(uint256)", +"df9b2931": "FANBASE()", +"df9b3bae": "ZperToken(address,uint256,uint256)", +"df9b5fe9": "ALH3()", +"df9d3580": "accountBuyLimit()", +"df9e33e8": "getForeverRose()", +"df9f3139": "out4Done()", +"df9f92fb": "Scan(address[],uint256[])", +"dfa0ca14": "swapProject(uint256)", +"dfa13498": "LeasedBlock(uint256,uint256,uint256,uint256,bytes32,bytes32,bytes32,bytes32,address)", +"dfa15809": "databaseAddress()", +"dfa15b58": "RESERVED_OTHERS_SIDE()", +"dfa22fed": "buyFromOwner(string)", +"dfa24e8e": "sendEther(address,uint256,uint256)", +"dfa38fea": "NANI(address)", +"dfa4591c": "removeLogicVersion(uint256)", +"dfa54594": "getStandartRobot(uint256)", +"dfa5a25d": "purchaseCoffee()", +"dfa6bc72": "LoggedPhaseICO(uint256,uint256,uint256,string,string,uint8,bool,bool)", +"dfa72237": "innerPlayerFlight(uint256,uint16,uint256)", +"dfa78bf5": "savior()", +"dfa8be5f": "hackEducated(address)", +"dfa93d64": "relayContractAddress()", +"dfa9b440": "addAddressToWhiteList(address[])", +"dfaa3136": "addToMap(uint256[])", +"dfadb43c": "candyLandSaleAddress()", +"dfae7dc1": "vestingWhitelister()", +"dfaeaf67": "ThrowProxy(address)", +"dfaf3658": "closeCdp(address,uint256,uint256)", +"dfaf734a": "lastReleaseTime()", +"dfafaa72": "sendTo(address,uint256,address)", +"dfafb31d": "QUANTH()", +"dfafcf7e": "isMinion(address)", +"dfafe10f": "addParticipant(address)", +"dfb01c8f": "BCC()", +"dfb03cf7": "put(address,address)", +"dfb06d85": "AgentContract(address,address,address,uint256,uint256)", +"dfb0fb28": "ANGEL_ADDRESS()", +"dfb1913d": "withdrawFor(address[],uint256[])", +"dfb1abc0": "distributeReservedTokens(address,uint256)", +"dfb1c0e5": "buyToKen(uint256)", +"dfb259de": "SmartPoolToken(uint256,address)", +"dfb2866d": "priceFactor()", +"dfb29935": "sendHash(string)", +"dfb30c14": "getPlayerSpaceshipModelById(uint256)", +"dfb3557b": "BNB_MIN_CONTRIB()", +"dfb36b0b": "villagePrice()", +"dfb41e7c": "getForecast(bytes32,uint8,uint256)", +"dfb4a12e": "updateCandidateInfo(address)", +"dfb4ae3a": "WHOM()", +"dfb4b2f0": "deadline_status()", +"dfb59249": "EthRental()", +"dfb5a995": "countStureq()", +"dfb5f420": "Crowdsale(address,uint256,uint256,uint256)", +"dfb685cb": "BIT()", +"dfb69cb2": "colors(uint8)", +"dfb6c468": "transferCoinvest(address)", +"dfb873fb": "getPrizeByToken(uint256)", +"dfb87be1": "setEndRate(uint256)", +"dfb8a38d": "getTokenPackPrice()", +"dfb8c6c2": "battleContractAddressCanBeUpdated()", +"dfb9560c": "right24(uint256)", +"dfb9bdca": "exchange(address,address[],uint256[],uint256)", +"dfba3be1": "pvpFinished(uint256[],uint256)", +"dfba9570": "removeStaff(string)", +"dfba9798": "withdrawMytoken(uint256)", +"dfbb3036": "currentRoundInformation()", +"dfbb4021": "checkGrid(uint8)", +"dfbb70c9": "timeOfLastIncrease()", +"dfbc3de1": "applyMember()", +"dfbcb8d9": "transferCard(address,address,address)", +"dfbd5c69": "EggsRedeemed(address,uint256)", +"dfbd6150": "subowner()", +"dfbd9973": "pageByAccount(address,uint256,uint256,uint256)", +"dfbde5a7": "FedCoup()", +"dfbe0587": "sellPorftolio(uint256,uint256)", +"dfbebd07": "licenseExpirationTime(uint256)", +"dfbec00e": "requestTopic(string)", +"dfbed623": "updateCaller(address,bool)", +"dfbef8de": "AllowExchanger(address)", +"dfbf53ae": "winner()", +"dfc027ef": "replayAnser(uint256,uint256[])", +"dfc0bedb": "setCode(uint256)", +"dfc10ea8": "callerAllocationEndBlock()", +"dfc119b0": "testRfind()", +"dfc28653": "NucleusVisionTokenUnlocked()", +"dfc2a146": "ORACON(uint256,uint256)", +"dfc366e8": "tenthousandths()", +"dfc3a987": "cntMembers()", +"dfc42f7c": "OmegaContract()", +"dfc4a516": "doApprove(address,address,uint256)", +"dfc6fbaa": "presaleBalanceOf(address)", +"dfc6ffc6": "CharlieCoin()", +"dfc74cb4": "testPlaceBet()", +"dfc75b9c": "sendJigouByOwner(address,uint256)", +"dfc765dc": "getMatchers_by_index(uint256)", +"dfc78bdc": "ProposalTallied(uint256,bool,uint256)", +"dfc7d488": "getTransactionFee(uint256)", +"dfc86d56": "UsdToEtherConvert(uint256)", +"dfc89632": "PresidentElections()", +"dfc8bff1": "updateLock(uint256)", +"dfca2f53": "LookAtPrizes()", +"dfca685a": "unlockPrivate()", +"dfca8fd2": "contributeForMakers(address)", +"dfcb4157": "saleAfterRefundPeriod()", +"dfcb737f": "allocateMarket_CommunitTokens()", +"dfcbb794": "TrustFund(address,uint256,address)", +"dfcbc298": "CancelBuyOrder(bytes32,address,uint256,uint256,address)", +"dfcc4b86": "ConcludeChallenge(uint256)", +"dfcc525d": "info_SeeTINAmotleyLine(uint256)", +"dfccdef5": "collectedETH()", +"dfcdc7f2": "regReferrer(address)", +"dfcdde5e": "calcAmount()", +"dfce5a7a": "changeGrantsController(address)", +"dfce791a": "counterWagerAndDeposit(uint256)", +"dfce8ac3": "fipsLegacyRegister(bytes20,address,bytes)", +"dfceb5ba": "refund_and_die()", +"dfcefd7e": "indexOf(uint64[],uint64,bool)", +"dfd0163e": "voteNoLockBatchByAdmin(address[],address[],uint256[])", +"dfd024c1": "allocateInvestors()", +"dfd0c510": "ICOReward()", +"dfd142c1": "IncreaseWithdrawalAmount(uint256)", +"dfd17111": "ConstructZCashClue(bytes32)", +"dfd17f2b": "buyInBatch(uint256,uint256,uint256[],uint256)", +"dfd1be58": "platformFundingPerEpoch()", +"dfd200c5": "setRunning(bool)", +"dfd2c96d": "updateHouse(address,address)", +"dfd2ddec": "setForeignBridgeProxyOwner(address)", +"dfd4715e": "setDAdmin(bytes32,address)", +"dfd4e0f6": "setPrivateSaleHalt(bool)", +"dfd50f52": "contestants(uint256)", +"dfd51b4c": "updateIris(bytes32,address)", +"dfd52b74": "_getIcoAddr()", +"dfd5d3b0": "creditMcAddress()", +"dfd5dd6b": "ranksCount()", +"dfd6a9d5": "getPoolTotalStakeQspWei(uint256)", +"dfd6e6c5": "getIcoPhaseOneThreeDayIndex(uint256)", +"dfd80665": "whitelistAgent()", +"dfd84c13": "sendGain()", +"dfd8d516": "IsThisInternal()", +"dfd92f8a": "registerProduct()", +"dfd94849": "addNewSpinner(uint256)", +"dfd9e184": "droneIndexToApproved(uint256)", +"dfdadcb9": "isValidPurchase()", +"dfdadec6": "AlphaCarToken()", +"dfdb27da": "FoundGameCoin()", +"dfdb5f17": "doBurn(address,uint256)", +"dfdc349d": "getLestCommonMul(uint256,uint256)", +"dfdc99c7": "setKpopCelebContractAddress(address,address)", +"dfdce77b": "setScrapPercent(uint8)", +"dfdd3997": "maxETHAutoContributions()", +"dfdd4293": "voidCaller(address,address)", +"dfde567f": "processAR(uint256)", +"dfdfb261": "addEsgoTX(address,uint256,uint256,uint256,uint256)", +"dfe0f0ca": "transferWithSender(address,address,uint256)", +"dfe1304c": "HumanStandardToken123(uint256,string,uint8,string)", +"dfe138a6": "rewardPerUnit()", +"dfe1b17e": "dequeueOrder()", +"dfe1dcf6": "adminSendEthtoAddContract()", +"dfe1f357": "checkHash(address,uint256,address,uint256,uint256,uint256)", +"dfe2de30": "boughtTime(address)", +"dfe333bd": "copiesSold(uint256)", +"dfe33748": "TokensAreFrozen()", +"dfe346d0": "NicksTastyToken()", +"dfe3a52b": "CUTOFF_PRESALE_TWO()", +"dfe3e746": "setMasterNode(address)", +"dfe4858a": "constuctor()", +"dfe4c261": "approveTransaction(uint256,uint256,string)", +"dfe525a2": "addHandler(address,address,string,string)", +"dfe5ef48": "issue(address,uint256,uint256)", +"dfe64599": "getAllHpbNodesExt()", +"dfe699b1": "SetApplicant(string,string,string,int256,string)", +"dfe6af85": "testThrow_testablePayoutCaseShouldBeFailure()", +"dfe6d366": "gamblers()", +"dfe71183": "createCDPLeveraged()", +"dfe71486": "displayuserdetails(address)", +"dfe81a26": "GnarlyTimes()", +"dfe921cb": "lifeReserveTimeLock()", +"dfea6ec2": "placeBetWithInviter(uint256,uint256,uint256,uint8,bytes32,bytes32,address)", +"dfea8483": "Countout()", +"dfeade00": "AceEquityToken(uint256,string,string,uint8)", +"dfeb1719": "getNotaire()", +"dfeb1fd3": "getUserVotes(address,string,string)", +"dfeb34b6": "stakeFailOverRestrictionLifted()", +"dfeb3c49": "getNonces(address,address)", +"dfebb4ee": "viewMostRelevantClauses()", +"dfec375e": "calcCurPointsForAcct(address)", +"dfedff20": "getTwit(address,uint256)", +"dfee01d8": "mUpgradeSpeedup()", +"dfee2bad": "phaseReleaseAmount()", +"dfee6348": "COMMUNITY_PLUS_PRIORITY_SALE_CAP_ETH()", +"dfef54a3": "TihoToken(uint256,string,uint8,string)", +"dfef58a6": "registration(bytes32,uint256,address)", +"dfef5f69": "mintingStartTime()", +"dfefaf3f": "secureUnapprove(address)", +"dff0259f": "donationSum()", +"dff05de4": "pctDIDOwned(address,address)", +"dff114dd": "investedCrowdsaleTokenOf(address)", +"dff18fe0": "provideTeamHolderToken(address)", +"dff1ab15": "checkProposalCode(uint256,address)", +"dff2db71": "binaryAddress()", +"dff3f3b9": "ownerWithdrawal(uint256)", +"dff3f83e": "resolveRawDelegation(bytes32,uint256)", +"dff44b2f": "divorce()", +"dff4a5e8": "getRestaurant(address)", +"dff53231": "love()", +"dff538e6": "_currentDay()", +"dff5f5cb": "updateStartPhase(uint256)", +"dff649dc": "NameChanged(address,uint256,string,string,uint256)", +"dff675c2": "getDelivery()", +"dff79905": "LogTokenRemover(address,uint256)", +"dff90b5b": "sendFees()", +"dffa771f": "_setWeaponValue9(uint256)", +"dffb0bd1": "getPlayerTotalDividend(address)", +"dffbbef5": "stopDistribution()", +"dffbd9de": "TokenAdded(address,address)", +"dffcf9a7": "transferableHavvens(address)", +"dffd5e57": "buyToken(bytes32)", +"dffd6054": "changeGameAddress(address)", +"dffd722f": "totalEarn()", +"dffd9b8e": "CEO_TEAM_SHARE()", +"dffdc75d": "forward(address,bytes,uint256,bool)", +"dffe0a63": "getStatGames()", +"dffeadd0": "main()", +"dfff2f79": "autoReinvestFor(address)", +"dfffcbdb": "triggered(uint256)", +"e0004f43": "batchTransferTokenS(address,address[],uint256[])", +"e000eec3": "createPixel(uint24,uint32)", +"e0018f2f": "showPlayerSeasonScores(address,int8)", +"e001ddf1": "teamTokensCurrent()", +"e0020f1a": "tokensPerEthPublicSale()", +"e0024ae3": "_mine(uint256,address)", +"e002a486": "changeForwardTo(address)", +"e002f2ee": "cpCap()", +"e0031b1d": "GetDOTDelegatedRevoker(bytes32,uint8)", +"e003604e": "close(address,uint32,uint192,bytes)", +"e0036d1d": "verifyPosition(uint16,uint8,uint64)", +"e0041396": "slice(bytes,uint256,uint256)", +"e0046553": "ownerSetSpreadPremium(uint256)", +"e004b76f": "PermissionRemoved(address)", +"e004fe97": "CarRegistry(string)", +"e004feb0": "testFailMintGuyWhenStopped(int256)", +"e0056019": "setLand(uint8,uint8,uint8,bool,uint8[])", +"e0063224": "vouchers(bytes32,uint256)", +"e0068052": "division(uint256,uint256)", +"e00686e4": "rewardPerBlockPerAddress()", +"e006997c": "authenticate(string,bytes)", +"e007b330": "sterilize(uint256[])", +"e0081b8c": "approve(bytes32,bytes32,uint256)", +"e00824bb": "payCreator()", +"e0089ce7": "UCtestCoin(uint256,string,uint8,string)", +"e008cdf3": "SBSCoin()", +"e00a1e8b": "addToSendAllowed(address)", +"e00a7fc5": "transferFromOwn(address,uint256)", +"e00ab6dd": "private_setminBet(uint256)", +"e00ac9a3": "thirdTime()", +"e00bc0f4": "setIsContainerForMarket(bool)", +"e00bc7fb": "vota_un_candidato(address)", +"e00be2a9": "getErc20Rate(string)", +"e00cb0bc": "etherReceivedPrivate()", +"e00d0aed": "TalosToken()", +"e00d0f3d": "updateCandidateAddrByIndex(uint256,address,address)", +"e00d7e5c": "ExampleToken()", +"e00dd161": "currentId()", +"e00f882c": "numberOfExchInEstateNasAlice(address,uint256)", +"e00fb7b7": "getInvited(uint32)", +"e00fe2eb": "getText()", +"e01060f8": "transferOwnership(uint8[],bytes32[],bytes32[],uint256,address[])", +"e010c686": "newProposal(uint256,uint256,bytes32)", +"e011171d": "setDOwner(bytes32,address)", +"e0117441": "setRegistrationPrice(uint256)", +"e011ac87": "amountLeft()", +"e01330bb": "testMul(uint256,uint256,uint256)", +"e014a39f": "weiRaisedIncludingFiatCurrencyRaised()", +"e014a83f": "takeToken(address,uint256,string)", +"e01546a8": "fromFraction(int256,int256)", +"e01567cf": "ethBioxRate1()", +"e015c62a": "calculatePrice(uint256,uint256,uint256)", +"e015d863": "variation()", +"e016603f": "createMultipleShows(uint256[])", +"e0179e6c": "etherValue(uint256)", +"e0180115": "culcurateBonusRate()", +"e0182436": "cancelEscrow(uint256)", +"e0187d18": "third_partner_address()", +"e018c36c": "buyFirstPackFromReferral(address,bool)", +"e0192072": "Rescue(address,address,uint256)", +"e0195a53": "maxRandom(uint256,address,uint256)", +"e01964d0": "sterile(uint256)", +"e019ac29": "setKycCertifier(address)", +"e01a38c6": "ecrecoverSigner(bytes32,bytes,uint256)", +"e01a6ace": "vote_Candidate_name(bytes32[])", +"e01ac5a4": "giveReward(bytes32,address,uint8)", +"e01b1b10": "ICODays()", +"e01bb918": "_withdrawAll(uint256,address)", +"e01bc60b": "totalCustomBuyersMapping()", +"e01c6d4e": "cashin()", +"e01c979a": "GuneToken()", +"e01cd37a": "cancelSellingToken(address)", +"e01cdfaa": "getEmployeeInfoById(uint256)", +"e01cff84": "getTransferringForCount(address)", +"e01d1f3d": "MultiSigWallet(address[],uint256,uint256,string)", +"e01dd67b": "AMBASSADOR_THREE()", +"e01e0618": "feeDiv(uint256,uint256)", +"e01e92d2": "abs(int128)", +"e01ea00c": "getDarknodesFromEpochs(address,uint256,bool)", +"e01ef1f8": "addInventory(bytes32,string,string,string,string,uint256,uint256)", +"e01fff13": "familyContract()", +"e0201e07": "Eclipse()", +"e0204585": "get_bet(address,address)", +"e020b8a3": "contract_date()", +"e02163e7": "etherContributionOf(address)", +"e021b8cb": "useWeapon(uint8,uint8,uint8,uint8,uint8[176])", +"e021deff": "meta(address)", +"e022040c": "setReceiver5()", +"e02243ee": "buyInternal(address,uint256)", +"e023094f": "createDroid(uint256,string,uint256,uint256,uint256)", +"e023f90e": "getCity(uint16)", +"e02426c1": "getSignatureHash(bytes4,uint256)", +"e024ec5a": "getFmmsDetail(bytes32)", +"e0256835": "balancesCrowd(address)", +"e02584bf": "listPairForReserve(address,address,bool,bool,bool)", +"e025a666": "rewardPercentageDivisor()", +"e027034d": "isWithinIEO()", +"e028222f": "CreateABet(address,uint256)", +"e028ff3b": "lotteryGiveHuntMinimalNumber()", +"e0299621": "GBIToken(uint256,string,string)", +"e02b8b29": "HardcapToken()", +"e02ba030": "excess_token()", +"e02bc1c6": "bidDeposit(bytes32)", +"e02bcd3e": "getLendTokenBalance()", +"e02c3b5d": "getAllLeftLeg()", +"e02c7e1f": "timelockAllocationAddress(address,uint32)", +"e02c85a4": "_checklottery(uint32,uint32)", +"e02cec51": "refund(address[])", +"e02d1c0e": "tradeStarttime(uint256)", +"e02d306f": "getUNTSQM()", +"e02df495": "MAX_ETHER_24H()", +"e02f8d33": "PRICE_STAGE_THREE()", +"e02f9027": "iTime()", +"e02fab06": "anubisToken()", +"e0300fc4": "unregisterFor(address,bytes32,address,uint256,uint256,uint256)", +"e0303a2e": "getFirstTwoOutputs(bytes)", +"e0304542": "oddEven(uint8)", +"e0307e94": "gcsp(uint256)", +"e030bbd5": "tokenToPointByMetaMask(uint256,uint256)", +"e030dfb9": "emergency(bytes32,bytes1)", +"e03179b4": "LogContribution(uint256,uint256)", +"e031d6f0": "isICOFinished()", +"e0328c5f": "setRecovery()", +"e0328c80": "hasRedeemed(address,address,uint256)", +"e033192c": "gettransferableStartTime()", +"e03335b4": "_calculatePricePerPixel(uint256)", +"e033f73c": "executeApplication(address)", +"e0340a05": "Maya_Preferred()", +"e035e1ac": "thirdBonusEnds()", +"e03652c2": "isTransactionPending()", +"e0376e74": "LOG_EmergencyWithdrawalSucceeded(address,uint256)", +"e037a71c": "withdrawLimit(address,uint8)", +"e03827d2": "left70(uint256)", +"e0389a47": "removeAccountMilestone(address)", +"e038c75a": "circulating_supply()", +"e0391b6f": "trackable_dislikes(address)", +"e03992fd": "nextForkUrl()", +"e039967c": "migrateTransfer(address,address,uint256,uint256)", +"e039e4a1": "getOwner(uint8,uint8)", +"e039f224": "isFork()", +"e03b3044": "setAyantDroitEconomique_Compte_7(uint256)", +"e03bc7e1": "_registerDevice(address,bytes32,bytes32,bytes32)", +"e03c151e": "LogSetSTOContract(address,address,address,uint256,uint256)", +"e03c1c4b": "setLineStartTime(uint256,uint256)", +"e03c639c": "addPreSaleWallet(address)", +"e03cca4d": "setChallengeFormulaContract(address)", +"e03d890b": "_addTokenToAllTokensEnumeration(uint256)", +"e03e09a8": "_createAuction(address,address,uint256,uint256,uint256)", +"e03ec01d": "getTargetWallet(address)", +"e0401918": "SMRToken()", +"e0402d26": "validDoHash(bytes32)", +"e04093d6": "updateOracleWithENS()", +"e040c164": "createT513(uint256,uint256,address)", +"e040f3e1": "_humanSender(address)", +"e0412a54": "setBonusRound2(uint256)", +"e0429b6c": "ShinySquirrels()", +"e042ad58": "operationWallet()", +"e0443e92": "LogCreate(address,address,uint256,uint256)", +"e0446273": "messageIsEmpty(string)", +"e044c2de": "newLoan(bytes,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"e044c47f": "playerRollDice()", +"e0453376": "hasFourYearWithdraw()", +"e0457049": "trustedInput()", +"e0457884": "betResolution(uint8,uint8,uint8,bool)", +"e0462547": "setEndPreSale(uint256)", +"e0462d0a": "coreTeamMemberOne()", +"e046c4dc": "Delete()", +"e046f06f": "deathData_a1()", +"e0470e02": "matureDragon(uint256)", +"e0472e36": "swapProposal(uint256)", +"e0475e27": "holderMarketingTokens()", +"e048d0fc": "voteCancelCurrent()", +"e0495a64": "getNormalBuyers()", +"e04a1942": "test_fourValidEqUint()", +"e04a2525": "NoahDividend(address)", +"e04a8c08": "Sold()", +"e04ac09e": "BountyIssued(uint256)", +"e04c130b": "token_transferFrom(address,address,address,uint256)", +"e04c1830": "findNextHour(uint256,bytes2)", +"e04cd07c": "BOLTH(address,address[],address)", +"e04d5105": "calculateSeedBuySimple(uint256)", +"e04f31e9": "forward(address,uint256,bytes,bool)", +"e04fac0c": "aVideoCost()", +"e0504910": "buyWithTokens(address)", +"e050674c": "_deliverWhitelistBonus(address)", +"e0522012": "getAdjustedPotAsFixedPointForGameId(uint256,bool)", +"e052a587": "isNotExpired(uint256,uint256)", +"e052f0c8": "setParams(string,string,string,string,uint256,address,uint256)", +"e053178a": "XCPlugin()", +"e0539225": "preicoPrice()", +"e054057d": "LogBuy(uint256,address,uint256)", +"e0540d85": "CDreamingICO()", +"e054c029": "changejp2(address)", +"e055bba4": "turnId()", +"e056989a": "OfferUpdated(uint256,bytes,uint256,address)", +"e056c1eb": "isGlobalPause()", +"e056f2ff": "takerFeeRateE4()", +"e0576665": "addLen(string)", +"e0585ce8": "BetcoinICO()", +"e058cc59": "setMemeTemplate(string)", +"e0591ddc": "gizerItemsContract()", +"e059c868": "private_UpdateGameBarLimit(uint256,uint256)", +"e05a48cd": "unregisterVendor(address,address)", +"e05b4c5f": "GetReferredAt(uint256)", +"e05b5456": "ChenToken(address,address)", +"e05bac82": "amountReceivedFromExchange(uint256)", +"e05c5a83": "sellerOf(uint256)", +"e05cb6f4": "Mitrav()", +"e05d769e": "expirationSeconds()", +"e05e3028": "getCommunityManagement(uint256)", +"e05e91e0": "returnUint64(uint64)", +"e05ea744": "frost()", +"e05ee7a4": "RATEotu()", +"e05f149e": "getTotalRuns()", +"e05f7d67": "setPCoinContractAddress(address,address)", +"e05fad90": "decode(bytes,uint256,uint256)", +"e0607290": "confirmChangeOracle()", +"e06174e4": "settings()", +"e0619859": "At(uint256,bytes32)", +"e061ddca": "getSensorAddress()", +"e0623632": "UNSOLD_ADDRESS()", +"e062aff8": "startTimeNumber()", +"e06309bb": "ValueOwners()", +"e06375c8": "_fDist()", +"e063a439": "_computeFee(uint128)", +"e06452d0": "Completed()", +"e064bc82": "setFoundersTokensWalletSlave(address)", +"e064c1ec": "denyChanges()", +"e065029e": "PokemonPow()", +"e0655fe5": "changeBuyFee(uint256)", +"e06572ec": "sell(address,uint256[],uint256[],bool)", +"e065914c": "isPersonalLock(address)", +"e065e388": "NewBOP(address)", +"e067ea46": "Etherep(address,uint256,address,uint256)", +"e067f631": "intervalUpdate()", +"e06868e2": "numberOfBet()", +"e06902fa": "ito()", +"e06a09ec": "calculateInterestIndex(uint256,uint256,uint256,uint256)", +"e06a60ff": "HumanityCard()", +"e06aa145": "TokenBurned(address,uint256,uint256,uint256)", +"e06abd36": "updateMAX_AMOUNT(uint256,uint256)", +"e06af204": "BetlyCoin()", +"e06b5837": "getCanSellUnit(address,address,uint256)", +"e06b7e39": "getInitOrInput()", +"e06b850c": "testIntParserTwoDecimal()", +"e06c0fd2": "SatoshiToken()", +"e06c5808": "burnFromAddress(uint256)", +"e06d8de9": "acquisitionsLockEndingAt()", +"e06e0051": "withdrowETH()", +"e06e0e22": "postRelayedCall(bytes,bool,uint256,bytes32)", +"e06e0e43": "overLimit()", +"e06e3873": "encrypt(uint256[])", +"e06e6b20": "Like(bytes32,bytes32,uint256)", +"e06e82b2": "teamNIMFAAddress()", +"e06e9d22": "addCustomerTokenAmount(address,uint256)", +"e06ec0bb": "isListing()", +"e06f3d38": "ownerA()", +"e06fa13d": "ETCL()", +"e06fa68e": "updateAfter(uint256)", +"e06fc6d4": "mainsaleRemaining()", +"e0709589": "blink_block()", +"e0715a86": "unlocksCount()", +"e071681d": "setManyAccountsVerified(address[])", +"e071c0ca": "transferVaultOwnership(address)", +"e072830c": "FUNDING_ETH_HARD_CAP()", +"e0728801": "ANV()", +"e072bd10": "getPlayerInventory(address)", +"e073ef69": "pubKeyToBitcoinAddress(bytes,bool)", +"e0741187": "createBreedingAuction(uint256,uint256,uint256,uint256)", +"e074278d": "setOwnerAddr(address)", +"e074b027": "hasExecuted(uint256)", +"e074bb47": "removePermission(address)", +"e074ee55": "getPeriodsToPay(bytes32,address,uint256)", +"e0755792": "Permission(bytes32,address[],bytes4[])", +"e0755b35": "WePOW()", +"e076c0ae": "queryNow()", +"e0772f6a": "CROWDSALE_TOKEN_IN_WEI()", +"e0775be1": "create(address,address,address,address,address,address,address)", +"e0778211": "_releasableAmount(address,uint256)", +"e077ca97": "fx()", +"e078c549": "getNumberOfTokensToIssue(uint256)", +"e07959bd": "setGainsRate(uint256)", +"e079e334": "getNewCoinFee()", +"e079e7e5": "addStock(string,uint256,uint256,uint256,uint8)", +"e07a2671": "migrationSetPlayer(bytes32,uint256,bytes32,address,uint256,uint256,uint256)", +"e07a31c7": "getWinningCount(uint256,uint256)", +"e07a5d29": "CLRCoin()", +"e07be247": "createSellENS(string,uint256)", +"e07c80fb": "getKindAddress()", +"e07ccdeb": "totalPartnerWithdrawSupply()", +"e07cd936": "ArtcoinPlaceholder(address,address)", +"e07d4f6b": "saveCarDataTransaction(address,address)", +"e07f0b66": "SendMessage(uint256,string,address)", +"e07f0f13": "ZhangPeiPei(uint256,string,uint8,string)", +"e07f0f5e": "transferToken(address[],uint256[])", +"e07f3dd6": "go(uint8)", +"e07fa3c1": "withdrawFund()", +"e080241c": "setNFTDetached(uint256)", +"e080b60c": "apiCallsContractAddress()", +"e0812c75": "migrateInvestorFromHost(address,address)", +"e0813e25": "getRandomInt(uint256)", +"e0813e5e": "updateTokensPerEthOnce(uint256)", +"e08155dd": "ICO_PERCENTAGE_4()", +"e0815ca9": "findNextMinute(uint256,bytes2)", +"e0818669": "lps()", +"e081b569": "DiceOnline()", +"e081fdfe": "availableBalanceOf(uint256,uint256)", +"e082707c": "_uintToString(uint256)", +"e0832cf6": "getWinCount(address)", +"e0834ea4": "WatchBalanceInEther()", +"e083a1b5": "_createEstate(int256[],int256[],address,string)", +"e083d4c8": "dividendBalanceOf(address)", +"e084a819": "prepareCrowdsale()", +"e08503ec": "calculateNextPrice(uint256)", +"e085448f": "FIRST_USER_CUT()", +"e085942a": "getSubjectMattersSize()", +"e085c539": "getPlayerScore(address)", +"e085f82b": "rejectCertificate(address)", +"e086141d": "Assigned(address,uint256)", +"e0862fd7": "getNumBadBets(uint256)", +"e086e5ec": "withdrawETH()", +"e0873c06": "reissueAsset(bytes32,uint256)", +"e08761f5": "dtValidateCitySnapshot(address,uint256)", +"e087cd55": "withdrawIncentives()", +"e0882af8": "airDrop(address,address[],uint256[])", +"e0886f90": "at(uint256)", +"e088747b": "withdraw(address,uint256,string)", +"e088a96b": "claimerUnset()", +"e08a5f9e": "startPresaleDate()", +"e08ac014": "unlockPeriodNum()", +"e08b63ad": "getAddTokenNonce()", +"e08bc3fe": "parseInt(bytes)", +"e08d28d3": "maxInvestmentICO()", +"e08d8497": "ICO_LEVEL_2()", +"e08e433a": "transferTime()", +"e08ed5f9": "withdrawBid(int256,int256,int256)", +"e090318c": "setFacts()", +"e090ebab": "VUO()", +"e0911183": "devTeamAutoBuy(uint256,uint256)", +"e091de56": "MDA()", +"e091f453": "setDividend(uint256)", +"e0929b95": "claimFreeFirstCard(address)", +"e092e85f": "getStakedBalanceUnOrdered(uint256,bytes32)", +"e093a157": "abs(uint256,uint256)", +"e09413ba": "totalDistributedAirdrop()", +"e0945a80": "wbcoin()", +"e0950ddf": "getBet(uint256,address)", +"e095f814": "etherToToken(uint256)", +"e0963ced": "LinkEyeStandardToken(uint256,string,uint8,string)", +"e09678fd": "setIcoContract(address)", +"e097e7b9": "sendTokensBack()", +"e098161b": "getRareCoinAddress()", +"e09874c0": "setPlayConfigs(uint256,uint256,uint256)", +"e0987873": "BurnedAllRemainedTokens()", +"e098c76d": "optionPoolTotalMax()", +"e09adc70": "ethToTokenRate()", +"e09ca60c": "secureApprove(bytes32,uint256)", +"e09ceada": "_newAuction(uint256,uint256,uint256)", +"e09cffcf": "SingularityTest18()", +"e09d0b75": "compareLeaf(uint256,uint256,uint256,uint256)", +"e09dbfa4": "checkPatternExistance(bytes32)", +"e09dd024": "FNCTToken()", +"e09ded57": "lengthOfCommonPrefix3232(bytes32,bytes32)", +"e09e9490": "releasePendingTransfer()", +"e09ea701": "BaseMonoretoCrowdsale(uint256,uint256,uint256)", +"e09ee57f": "feePercentageMax()", +"e09ef83e": "promoCutieCreatedCount()", +"e09f0020": "subCreditScore(uint256,string)", +"e09f310a": "get_iconiq_presale_open(address)", +"e09f6f49": "successAtBlock()", +"e0a09c1f": "Crowdsale(address,address)", +"e0a0f50d": "setSlaveWalletPercent(uint256)", +"e0a1a292": "addressAdvisors()", +"e0a1be53": "updateTargetedMoneyReached()", +"e0a1ca6e": "winningChance()", +"e0a1fdad": "unset(bytes12)", +"e0a21739": "setBlackFundsWallet(address)", +"e0a27b2c": "withdrawWinnings(uint256,uint256)", +"e0a29e23": "owner_freeze_start()", +"e0a3bff7": "RollCount()", +"e0a3e7ec": "computeDeferBlock()", +"e0a49f14": "setMatchOutcome(uint256,string)", +"e0a4aacb": "ExacoreContract(uint256,string,string)", +"e0a53397": "createSingle(uint256)", +"e0a550fc": "closeMainSaleICO()", +"e0a60ea3": "BITTOToken()", +"e0a62339": "getSha256_UInt(uint256,uint256)", +"e0a668b4": "setVesting(address,uint256,uint256)", +"e0a70811": "restart(bytes20,bytes)", +"e0a73a93": "premium()", +"e0a7527d": "updateCABoxToken(address)", +"e0a7b2c3": "startChallenge()", +"e0a802ba": "scanInputs(bytes,uint256,uint256)", +"e0a827c6": "RxI()", +"e0a8299f": "galleryTwo()", +"e0a82ea8": "setMinBetPerRoll(uint256)", +"e0a8aa72": "channelOpened(uint64)", +"e0a8f6f5": "cancelProposal(uint256)", +"e0aa5654": "getCountReadyPlayerByTrackId(bytes32)", +"e0abdf66": "setBlockTimestamp(uint256)", +"e0ac2b72": "HaHaChainToken()", +"e0ac50cb": "isTreasureBox(address)", +"e0ac61bb": "changeOwnerSharePerThousandForMating(uint256)", +"e0acac7f": "withdrawSum()", +"e0ad411d": "assets(bytes)", +"e0ae751f": "setAuthorizedContract(string,address,bool)", +"e0ae96e9": "din()", +"e0b1cccb": "updateBalance(address,uint256)", +"e0b1cecd": "DataToken()", +"e0b30178": "OVCLockAllocation(uint256,address,address,address)", +"e0b3198c": "serverPort()", +"e0b34ef1": "_setERC820compatibility(bool)", +"e0b3c49c": "acceptTermsAndJoinDXF()", +"e0b3cc90": "priceOf(uint32)", +"e0b438ef": "removeNameByOwner(string)", +"e0b45487": "_setValidator(address)", +"e0b490f7": "getAccountId(address)", +"e0b4cf0a": "setMinMaxBet(uint256,uint256)", +"e0b6cddd": "LLV_311_EDIT_2()", +"e0b78225": "RemoveTrustedContractAddress(address,address)", +"e0b86c53": "decreaseLock(uint256,uint256,address)", +"e0b999a1": "getAmount(address,uint256)", +"e0b9e83d": "update(address,address,address,uint256,uint256,address)", +"e0bab523": "for_rewards()", +"e0bb933b": "getDragon(uint256)", +"e0bc6c44": "claimInsurance(bytes32)", +"e0bc6dea": "removeTransferableAddress(address)", +"e0bd3015": "getClaimableBalance()", +"e0bd53be": "sellTokensForZec(string,address,uint256,uint256)", +"e0bd7d15": "addContributor(address,uint256)", +"e0bede59": "firstPeriodSupply()", +"e0bfa1f7": "removeUtilityHolder(address)", +"e0bfe9ad": "MAX_TOKENS_RESERVE()", +"e0c012ff": "modifyairdrop(uint256,uint256)", +"e0c104ad": "DONC()", +"e0c2bc77": "CDEos(uint256,string,uint8,string)", +"e0c2dcbd": "last_win_wei()", +"e0c4cea8": "GrowToken()", +"e0c5f3a0": "add256(uint256,uint256)", +"e0c6046c": "donateToProject(uint16)", +"e0c6190d": "checkTime()", +"e0c63902": "Ok()", +"e0c67b9c": "ROKToken()", +"e0c68158": "changeIssuanceAddress(address)", +"e0c68db0": "shr(uint32,uint8)", +"e0c6d1ed": "migrateForInvestor()", +"e0c78337": "XITOToken(address)", +"e0c7c117": "Randao()", +"e0c82651": "RWToken()", +"e0cb3aa0": "buyWithLimit(uint256,uint256)", +"e0cbbde7": "makeCode(uint256,string)", +"e0cbc2cb": "changeInGameAmount(uint256)", +"e0cbf845": "testAddLocked()", +"e0cc4e1b": "LifCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"e0cd34f6": "getBlockBuildFee(uint256)", +"e0cd6eff": "board_size()", +"e0ce0b79": "processSeason(uint32)", +"e0ce72cb": "_fConfig()", +"e0ceb25b": "fairsaleProtection()", +"e0cec919": "setDailySupply(uint256)", +"e0cee23f": "SuccessfullyTransferedFromCompanyInventory(address,uint256,bytes32)", +"e0cf1316": "_transferPlayer(address,address,uint256)", +"e0cf17a5": "totalStoredDDT()", +"e0cf1e4c": "removeMembers(bytes32,address[])", +"e0cf715d": "EtherTrend()", +"e0cf72e1": "ERC20Token(uint256,string,string)", +"e0cfc05c": "testThrowsRetractLatestRevisionDoesntHaveAdditionalRevisions()", +"e0cfde22": "setRestrictedParticipationCap(address[],uint256)", +"e0d05c51": "MemoireClement()", +"e0d1ba52": "Rate_Eth()", +"e0d2771d": "MINIMUMINVESTMENTPRESALE()", +"e0d29d38": "STARTING_POOH()", +"e0d3558e": "GetBoosterData(uint256)", +"e0d370ac": "site()", +"e0d4ea37": "getSeed(uint256)", +"e0d4ea7e": "addDestructionProposal(string)", +"e0d54970": "getInstructions()", +"e0d5af94": "ownerWithdrawAll()", +"e0d669d8": "tradesLock(address)", +"e0d6d530": "setContracts()", +"e0d751da": "returnBets()", +"e0d77ff6": "hasBeenBooted(uint32)", +"e0d79d38": "addcertifieddata(string,string,string)", +"e0d872b7": "getSideServices()", +"e0d9bc7b": "sybmol()", +"e0da260c": "widthdraw(uint256)", +"e0da4abd": "getDefaultExchangeRate()", +"e0db6781": "offerDraw(bytes32)", +"e0db874d": "moneyBack(address)", +"e0dba60f": "setController(address,bool)", +"e0dbbea2": "search(uint256,bytes32)", +"e0dc892c": "GiftHasBeenSent()", +"e0dcf2d8": "processInitialDistribution()", +"e0dd31da": "MDCSToken(uint256,string,uint8,string)", +"e0dda563": "GetContractStagePreMoveIn()", +"e0ddaa0e": "MAX_TOKEN_BUYIN()", +"e0dec0c0": "contractValue()", +"e0df51bb": "test_oneValidAndInvalidEqAddress()", +"e0df53b9": "LotteryRoundStarted(bytes32,bytes32,uint256,string)", +"e0df5b6f": "setTokenURI(string)", +"e0dfd0a6": "GIFTCOIN()", +"e0e04685": "setOldContract(address)", +"e0e081d7": "marketStatus()", +"e0e0e2d3": "random(uint8)", +"e0e1104d": "tierWhitelist(uint256)", +"e0e11a14": "newVowIdFlag(address,uint256,uint256)", +"e0e1593c": "decayedPriceFrom(uint256,uint256)", +"e0e16f91": "TestContract(address,uint256)", +"e0e1a7f0": "testSHA3()", +"e0e267e5": "minimumWei()", +"e0e29ac1": "SLMICO(address)", +"e0e32504": "isDaySixtyChecked()", +"e0e34e06": "getGlobalConstraintParameters(address,int256,address)", +"e0e3671c": "checkOwner(address)", +"e0e3b9d7": "ImmutableShares()", +"e0e3ba5a": "getLosesShare(address)", +"e0e3feae": "skimALittleOffTheTop(uint256)", +"e0e40349": "name(address,bytes32)", +"e0e4704e": "RequestDetachmentOnPause(uint256)", +"e0e4731a": "TokenGoalReached()", +"e0e4c438": "sendInternally(address,uint256,uint256)", +"e0e58009": "BookingPoC(address,address,uint256)", +"e0e5fffd": "preSale4()", +"e0e69937": "setDefaultVestingParameters(uint256,uint256,uint256,uint256,bool)", +"e0e6d6cb": "requireValidIndex(uint256,uint256)", +"e0e7127a": "getContractOwnerAddress()", +"e0e722b7": "MAX_ALLOWED_STAGE_3()", +"e0e81ccb": "getCurrentSchellingRoundID()", +"e0e848c0": "checkDone()", +"e0e84e81": "changeCompanyWalletAddress(address)", +"e0e85fe8": "StatEventA(string,address)", +"e0e8823c": "withdrawDai(uint256,address)", +"e0e8a555": "KAL3Token()", +"e0e9b349": "getReportRegistrationFee()", +"e0ea129e": "militaryToken()", +"e0eb3035": "registerAudits(bytes32[],bytes,bool)", +"e0eb60b2": "initialSpinners(uint256)", +"e0eb6613": "PresalePool(address,uint256[],uint256)", +"e0eb9449": "mateAnimal(uint256,uint256,string,string)", +"e0ebd259": "discountValue()", +"e0ebdbff": "getAuditRequestor(uint256)", +"e0ec289a": "creditsExchanged()", +"e0ed78d1": "setRouletteRules(address)", +"e0ee74e9": "changeActualQueue(address)", +"e0ee94e9": "PocketCoin()", +"e0eef0b9": "BOOKIE_POOL_COMMISSION()", +"e0efdaf9": "softCapTokensAmount()", +"e0f0497d": "currentTokenSaleId()", +"e0f06352": "testIsContractAddress()", +"e0f20a65": "etherLock()", +"e0f31fae": "isDoneReporting(address)", +"e0f32198": "runSweepStake()", +"e0f3691d": "thisEther()", +"e0f426fa": "numMCApplied()", +"e0f47580": "withdrawCommisionToAddress(address,uint256)", +"e0f4a1a2": "minimumPRETDEContributionInWei()", +"e0f4ed01": "parcelEth()", +"e0f50bac": "senderWithdrawal(uint256)", +"e0f609d4": "unsafeIsEncrypted()", +"e0f6cc07": "isChain(string)", +"e0f74cde": "BONUS_TIMES_VALUES(uint256)", +"e0f76121": "GlobalCryptoShares()", +"e0f771c9": "Bithumb(uint256,string,string)", +"e0f7b44d": "PreTgeExperty()", +"e0f898e4": "totalTokenLossValue()", +"e0f8c670": "getFirstPaymentAmount()", +"e0f8da97": "sponsoredBonusToken()", +"e0f9210b": "batchDistributeReward(address[],uint256[],uint256)", +"e0faf0a8": "getOnSaleIds()", +"e0fb8459": "recevedEthFromExchange(address,uint256)", +"e0fce922": "deliver(address,uint256,uint256)", +"e0fd59bf": "disableAdminForever()", +"e0fddf81": "setemployee(address,string,uint256)", +"e0fdf336": "finalReserveTimeLock()", +"e0fe01f4": "makePrediction(int8,string)", +"e0fe075e": "payoutReady()", +"e0fe42be": "existsPriceOnAssetPair(address,address)", +"e0fe4a84": "updateStrategyCategory(bytes15,uint256)", +"e0fe6d07": "SideBridge(uint256,address[])", +"e0fe9ccf": "WaltonTokenLocker()", +"e0ff5b8b": "getBook(uint256)", +"e0ff5d2f": "setMaxRacers(uint8)", +"e0ffa0da": "lastBlock_f13()", +"e0ffe8e3": "newOrder(string,string,uint256,uint256,string,string,string)", +"e1005556": "allowTransferWhitelist()", +"e1017332": "sellPaused()", +"e1021b53": "getLuckyRecordSize()", +"e10289b8": "addContributor(uint256,address,uint256)", +"e102baab": "setTokenController(address)", +"e102d950": "getNameHash()", +"e1036f86": "tax_distributed()", +"e103f176": "transfer_master(address,address,uint256)", +"e1041d86": "__throw()", +"e106fae9": "lottoLowestNumber()", +"e106fb4b": "stringToBytes(string)", +"e1082335": "to(bytes32,address)", +"e1089240": "Csts()", +"e108d2d6": "setMintAdminApproval(address,address,address)", +"e1094ff6": "DGZTokensSold(address,uint256)", +"e1097249": "initStage()", +"e109ef24": "setTokenOperatorApprovals(address,address,bool,bool)", +"e10a70b7": "LogRedeemVIBE(address,uint256,uint256,uint256)", +"e10aa985": "Elyxr()", +"e10b650b": "winnerWithdraw()", +"e10bcc2a": "startMilestone(bytes32,uint256,address,uint32)", +"e10be707": "changeGoodBye(string)", +"e10c7bb5": "EventStore()", +"e10d29ee": "queue()", +"e10d416f": "enablePurchasing(bool)", +"e10d4c0b": "isSaler(address)", +"e10e274a": "CrazyEarning()", +"e10e5dce": "_build(bytes)", +"e10e66e6": "changeWeiPerToken(uint256)", +"e10e8ffe": "doOraclize()", +"e10e95c9": "fundingEnabled()", +"e10eda7a": "IOCFundIndex()", +"e10f1b06": "isTournament(address)", +"e10fb98f": "testMul()", +"e1103422": "retractRewards()", +"e11074cb": "initFund()", +"e1108706": "rfind()", +"e1112648": "record(bytes)", +"e1115aa5": "addUserRewards(uint256,uint256,address)", +"e1134799": "claimDaoStakeSupply(address)", +"e11398e8": "burnLeftovers()", +"e113c6fd": "ICO_SINCE()", +"e11443cb": "UWNToken(uint256,string,string,address)", +"e1152343": "payout(uint256)", +"e11527d4": "linkedContract()", +"e11583b7": "TokenOPSSaleAddress()", +"e116b17e": "getKudosLeftForProject(address,address)", +"e1175a79": "getMyTickets(string,address)", +"e117e6f9": "MyToken(uint256,string,uint8,string,uint256,uint8,uint256,string,string,string,string,string,string,string)", +"e1181c73": "faucetLif()", +"e1187e2e": "getCollectibleWithMeta(uint256)", +"e118eda4": "featuredSpritesLength()", +"e118fba2": "redeemPurchases()", +"e119f8bb": "migrateMarketInFromNibling()", +"e11a5a4f": "allocateStartBlock()", +"e11aa56d": "getDeedTimestampByAddress(string,uint256)", +"e11b09e0": "softCapCompleted()", +"e11b53af": "getContributionsCount()", +"e11dba54": "messagesLength()", +"e11df80d": "batchVipWithLock(address[],uint256[],bool)", +"e11e1b0c": "escrowBalance()", +"e11efa06": "getProgress(uint256)", +"e11f493e": "reentrancy()", +"e11f6398": "MAXIMUM_PERCENT()", +"e11fe9ec": "hasItem(uint256,uint256)", +"e12073a0": "getAllDetails(address)", +"e12097b7": "getCurrSale()", +"e121c102": "incentives(uint256)", +"e1221400": "getCoinInfo(string)", +"e1226164": "getFamilyById(address)", +"e122c028": "totalLBSold_GENERAL_2()", +"e122f1b2": "GoldenCurrencyToken()", +"e123182b": "purchase(bytes32,uint256)", +"e1248d52": "DYLC_ERC20Token()", +"e124e37b": "add_allowedAddress(address,address)", +"e124f899": "toPool()", +"e1252b9b": "make_anonymous_registration(uint256,uint256)", +"e1254fba": "getDeposit(address)", +"e125501f": "refundParticipants(uint256)", +"e125f88b": "aoccoin()", +"e1266042": "setTakeOwnershipFeePercents(uint256)", +"e126eb7d": "referralCodeFromAddress(address)", +"e1270b6e": "approval(address,address)", +"e1281280": "setAddressUIntMapping(address,uint256)", +"e12849b2": "getMineGenesis()", +"e1287520": "getBets(uint256,uint256)", +"e128f0d6": "getTogetherDate()", +"e12925a9": "setUnownedNickname(uint256,string)", +"e129330b": "factorContributed()", +"e129c99d": "notaryBookSize()", +"e129f783": "NameRegistered(address,bytes32)", +"e12a3bbe": "icoAllocation(uint256)", +"e12a894e": "CbdStandardToken(uint256,string,uint8,string)", +"e12badcf": "PlatformInformation()", +"e12bcd68": "relayerName()", +"e12bceeb": "performEqual(address,address[],uint256)", +"e12cbb3c": "SIGNAL_DELAY()", +"e12cbb9e": "updateOrderBatch(bool[],uint32[],uint128[],uint128[],uint32[],int256)", +"e12ed13c": "currentBlock()", +"e12ee8d7": "totalAmountRaked()", +"e12f3a61": "getClaimableAmount(address)", +"e12f670f": "DiscourzeToken()", +"e13044fb": "changeEth_to_usd(uint256)", +"e13062c2": "getInvoices(address,uint256[])", +"e1313dfb": "additionalInfo(uint256)", +"e13245b1": "getCommunityBallotsEnabled()", +"e13251b9": "listAssetsFrom(uint256,bytes32,uint256,bool)", +"e132db41": "checkRate()", +"e1332ab9": "setParameter(string,string)", +"e13380e9": "EmClassic()", +"e133ad53": "extendCost(uint256)", +"e1345b02": "SMARTGold()", +"e134c9ff": "shutdownMarket(address,bytes32)", +"e134e33d": "reason()", +"e1351c05": "pay_coin()", +"e1370365": "makeLogFill(address,address,address,address,address,uint256,uint256,uint256,uint256,uint256)", +"e137047b": "RESELLING_LOCK_UP_PERIOD()", +"e1376da2": "updateFirstActiveGamble(uint256)", +"e137cdd9": "totalTokenCreationCap()", +"e138efb2": "setAllowStart(bool)", +"e139bbd8": "getBalance1(address,address)", +"e139e569": "getPriceAndTime()", +"e13a7716": "testReturn()", +"e13aba48": "testBurn()", +"e13bd03c": "delCashier(address,address)", +"e13c6b39": "externalContribution(address,uint256)", +"e13da09f": "HARJToken(string,uint8,string)", +"e13dc28b": "testValidTransfers()", +"e13e2ecf": "dev_issueTo(address,uint256)", +"e13ec1fa": "RoundChanged(uint256)", +"e13efb79": "getReferenceHash(bytes32)", +"e13fafdb": "marketCoins()", +"e13fe91c": "REALPlaceHolderMock(address,address,address)", +"e1404b41": "setNewMembers(address,address,uint256,uint256)", +"e1419546": "makeLiquid()", +"e1421a45": "makeIntString(string,uint256,string)", +"e142967e": "addClaim(uint32,int256,string,string,bytes)", +"e1437b00": "calculateCurrentMarketPixelPrice(address[16])", +"e143b3a1": "createNewEscrow(address,address,address)", +"e1444721": "minGoalReached(uint256,string)", +"e1472d88": "increaseBalance(address)", +"e1479d07": "megoAddress()", +"e1479ebe": "is_registered(bytes32)", +"e1482188": "showCollectedFee()", +"e1486ea8": "getContest(uint32)", +"e1489191": "commission()", +"e148bae9": "assignClientIfNotAssigned(address)", +"e148fe28": "transferTokensFromReserveAddress(address,uint256)", +"e1496d16": "TEAM_NAMES(uint256)", +"e149f036": "ownedTokens(address,uint256)", +"e149fbfa": "ShapeshiftBotSolo(string)", +"e14a147e": "addPokemon(string,address,uint256)", +"e14acc04": "getCanLoanAmount()", +"e14b238a": "EITToken()", +"e14b7571": "stage_3_price()", +"e14b983e": "LevelToken()", +"e14c4675": "rateForMainICO()", +"e14c5e17": "setcreatorAddr(address)", +"e14ca10e": "oraclizeCallbackGasLimit()", +"e14df8b7": "subDepotEth(address,uint256)", +"e14e1ba7": "_getTokenAmountWithReferal(uint256,uint8)", +"e14e5ca4": "BETHER()", +"e14ed045": "getContributionOf(address)", +"e14f08d5": "renounceTokenOwnership()", +"e14f680f": "sendAll()", +"e151fb62": "_updateMetadata(uint256,string)", +"e153591c": "FairyFarmer()", +"e1538b32": "gasPayback()", +"e1539c53": "claim(bytes32,string,string)", +"e153af40": "RiyazToken()", +"e153b74e": "tokenFallback(address,uint48,bytes)", +"e154179e": "addToTrusted(string)", +"e1541b7d": "testDiacritcs()", +"e1541bc3": "setTdeIssuer(address)", +"e154d17d": "heldTokens(address,uint256)", +"e155999e": "getFreeCrocs()", +"e155b66c": "ConvnertToSecret(uint8,string)", +"e15618b9": "founderWithdrawablePhase4()", +"e1567997": "kscBatchTransferToBounty(address,address[],uint256[],uint256,uint256[],string)", +"e1568024": "totalAmountOfCrowdsalePurchasesWithoutBonus()", +"e1569f6b": "testThrowsSetNotRetractableNotOwner()", +"e15746af": "TJCUToken(uint256,string,uint8,string)", +"e157819a": "distributeCOMIKETCOIN(address[],uint256)", +"e1587aae": "maxFinneyPerSaleLessThan()", +"e158a24e": "ethTransfertoACC(uint256)", +"e1590ed7": "mainEtherReceived()", +"e15a307c": "killAndRefund()", +"e15cba26": "_pay(bytes32,address,uint256,uint256,uint256)", +"e15d051f": "adminUnsigned(address)", +"e15e9d47": "depositFlag(address,uint256,uint256)", +"e15f3ec2": "Sent(address,address,int256)", +"e1606013": "issueCert(uint256,bytes)", +"e160a1d6": "manaPerEth()", +"e160e146": "createContractToken(string)", +"e161c3bf": "getPercentage(uint256)", +"e1621b04": "getDatePosted(uint256)", +"e163698a": "setTokenForPublicSale(uint256)", +"e16385fc": "destroyTokens(uint256,address)", +"e163b75b": "settleBet(bytes20,bytes20,bytes32)", +"e164483f": "numberOfBlocksToStartGame()", +"e164ac50": "teamPercent()", +"e1654fad": "roundIn(uint256,string)", +"e1661eff": "getClaim(address,address,bytes32)", +"e1661ff2": "Later(address)", +"e1662aa6": "saveMsgByUser(string,string)", +"e166b756": "ownerMethod()", +"e166bebd": "BINOToken()", +"e1674588": "getTokenURIs(uint256,bool)", +"e1675421": "changeFsTKAuthority(address)", +"e167dbca": "exchangeTokens()", +"e168a31a": "getOwnedArea(address)", +"e168ae8a": "_isPreICO()", +"e168c3ec": "votes()", +"e16b924d": "sellBonds(uint256,bool)", +"e16ba8c6": "privateSale1Hardcap()", +"e16bd3b7": "getSales(address)", +"e16c7d5e": "signedApprove(address,address,address,uint256,uint256,uint256,bytes,address)", +"e16c7d98": "getContract(bytes32)", +"e16c8053": "setTransfer(uint256,uint256)", +"e16c8d4b": "viewMyShares(bool)", +"e16c93e5": "Swarm(address,address,uint256)", +"e16dbb2f": "Multiplication(uint256,uint256)", +"e16dd936": "getVestingSchedule(address,address)", +"e16e2843": "setdividendFee(uint8)", +"e16e9340": "getAddressArrayIndex(bytes32,uint256)", +"e16e93aa": "DU30Token(string,uint8,string)", +"e16f374c": "getHarborLocation(uint16,uint16)", +"e16f5fe9": "DeathFactor_iv()", +"e16fb2f9": "recordInvestment(address,uint256,uint256)", +"e16fe580": "CalcHash(bytes)", +"e1703521": "setPriceMoreThanOneETH(bool)", +"e170dd81": "MintingSale(address)", +"e1725c92": "decimalPlaces()", +"e1726faa": "pushDividendPayment(uint256,uint256,uint256)", +"e1727807": "splitPot()", +"e1727fc6": "contractDeployedTime()", +"e172a57e": "updateGenerationStopTime(uint256,uint8)", +"e172dac8": "ethOdinRate1()", +"e1733234": "get_all_activity(uint256,address)", +"e173b0d0": "reserveAll()", +"e17463c2": "changelp5(address)", +"e174f106": "ManualMigration(address)", +"e1757a3c": "TIMEOUTBLOCKS()", +"e1758bd8": "nativeToken()", +"e175c86a": "getInviteInfo()", +"e1765073": "getPath(uint256)", +"e17682eb": "StablePrice(uint8)", +"e177246e": "setDelay(uint256)", +"e17755c4": "zrxTokenContract()", +"e177573c": "setHatchTime(uint64,uint256)", +"e177644a": "TimeStamp()", +"e177b18b": "minCoordinatorCount()", +"e177b707": "Valdela()", +"e177bb9b": "registerCode(string)", +"e17928ba": "BOBOTOKEN()", +"e17a3ccf": "paused_4()", +"e17a5894": "yoobaTeamAddress()", +"e17a7c70": "stage3_start()", +"e17b25af": "setMetadataAddress(address)", +"e17b3054": "creatorOwner(address)", +"e17b35ed": "isMint(address)", +"e17bf87a": "testRewardBB(bytes32)", +"e17cb777": "rewardRetweet(address)", +"e17e1274": "testTransferToRejectAuthority()", +"e17e1a86": "SetupWWC(string,string,uint256,uint256,uint256,address,address,uint256)", +"e17e7a20": "setTotalStaked(uint256)", +"e17fc704": "canMintFoundation(uint256)", +"e17fe6a0": "getCreatorReward()", +"e17fec26": "Unregistered(bytes32)", +"e180819e": "setBuyTime(uint256)", +"e18099e1": "ethTokenRate()", +"e180dbbd": "isEarlyBird(address,address)", +"e180e23b": "Annexe_CPS_6()", +"e182e27a": "fastHatchingPrice()", +"e182fd01": "tokensBankPartners()", +"e184c9be": "expiry()", +"e1851b83": "getMaximumFundsInEuroCents()", +"e1859169": "communityContributionQuota()", +"e185a890": "widthdrawRefunds(address)", +"e185b24c": "emptyIndex(address[])", +"e1863b19": "MultisigWalletMock(address[],uint256,uint256)", +"e186fb27": "checkcitizendetails(uint256,string,string,string,string)", +"e1878925": "isDeregisterable(address)", +"e187a550": "logCall(uint256,uint256)", +"e187eaf7": "addMoreTime(uint256,uint16)", +"e1883433": "withdrawEther(uint64)", +"e189dba1": "sellIssuerTokens(uint256)", +"e18a9134": "getLockProducts(uint256)", +"e18af2b8": "PHPCoin(uint256,string,string)", +"e18b170e": "tune(uint256,uint256,uint256,uint256,uint256)", +"e18b7fcf": "receiveFee()", +"e18c52ae": "testControlTransferNotTransferable()", +"e18c8cf9": "etherInWei()", +"e18d38ce": "getPlayerName(address)", +"e18d9bba": "getUSDAmountByWeis(uint256)", +"e18dc0f6": "pricingStrategyAddress()", +"e18e34d5": "setPayoutFee(uint256)", +"e18ed57b": "_calculateTax(uint256)", +"e18f1355": "TestERC20Token(uint256,string,uint8,string)", +"e18faad8": "_adduserdayget(address,address,uint256,uint256)", +"e18fb814": "setFixPrice(uint256)", +"e18fe709": "AirRewardTotalSupply()", +"e190264f": "newCampaignAccount(uint256)", +"e1909035": "GetCompetitionResults(uint32,bool)", +"e190d1b5": "claimFreeCrab()", +"e1911d70": "METADATA_URL()", +"e19136a4": "urbitAdminAddress()", +"e191548d": "AnimecardCore()", +"e192c4e0": "investor_Refund()", +"e193289f": "setVotingHelper(address)", +"e1938b14": "oraclizeSetWinner()", +"e193b735": "tokensDonated()", +"e1948e44": "ethRateExpiration()", +"e194e369": "getFamedStarByName(string)", +"e19593e5": "cashout(uint256,address,address,address,uint256,bytes,bytes)", +"e195d096": "tokenReserved()", +"e195f2ec": "howManyFees()", +"e1980d15": "setBuyAuctionAddress(address)", +"e199b7e4": "getMasterAdress()", +"e199c8a8": "SafiraToken()", +"e19a7bc8": "stopMigration()", +"e19ab767": "totalDistrictSupply()", +"e19aca85": "takeDividends(address)", +"e19bb964": "priceIncreasingRatio()", +"e19bc813": "bonusesCount()", +"e19bc8e5": "initPrivateIco(uint256,uint256,uint256,uint256,uint256)", +"e19d36ff": "removeAsset(bytes32,address)", +"e19eaf79": "blocknumber(address)", +"e19f1c55": "EstatePurchased(uint256,address,uint256)", +"e19fb933": "MentalHealthLifeToken(uint256)", +"e19fd3c5": "determinePurchase()", +"e1a05087": "getImpactUnmatchedValue(string)", +"e1a05344": "createSaddle6(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"e1a1cd8d": "crowdfundEndDate()", +"e1a27ad3": "needsAdministration()", +"e1a283d6": "mintingPaused()", +"e1a29a3f": "setVariationAddress(address,address)", +"e1a2c446": "lockRewardTokenMany(address[])", +"e1a382f4": "ZTHToken(uint256,string,string,uint8)", +"e1a3e55c": "buy(string,address)", +"e1a44749": "setOptions(uint256)", +"e1a566f4": "challengeExists(string)", +"e1a57611": "tokenReceivers(uint32)", +"e1a58a74": "flowerContract()", +"e1a63c14": "PixelMap()", +"e1a67cd3": "overrideTokenHolder(address,uint256)", +"e1a69d88": "level_1_amount()", +"e1a6ddcd": "isValidContribution()", +"e1a6df9e": "FLIGHT_NUMBER()", +"e1a6e625": "TradingStart(uint256)", +"e1a6f014": "offer(uint256,address,uint256,address,uint256,bool)", +"e1a7739c": "getExercisePeriodDeadline()", +"e1a8af8a": "getWinnerPrize(uint256)", +"e1a9109d": "setSeedPrice(uint256)", +"e1a9a2b1": "endRound(uint256,uint256)", +"e1a9f9b9": "_buyCallToClose(uint256,uint256,uint256,uint256,address)", +"e1aa1098": "GuardaRegistro(string)", +"e1aa1bcc": "refundDeadline()", +"e1aa60dc": "lastBlock_v3()", +"e1aa7e95": "createNewUser(bytes32,bytes,address)", +"e1ab5860": "declarePublicOfferingPlan(uint256,uint256)", +"e1ab690e": "ANRToken()", +"e1ab7cda": "OnetVN()", +"e1aba68e": "newProposal(address,string)", +"e1abf819": "GetWinner(bytes32,address,bytes32,address)", +"e1ac48ad": "saleableTokens()", +"e1aca6fb": "quickSort(uint256,uint256)", +"e1ad1162": "transfer(address,uint256,bool)", +"e1ad7699": "setPayload(string)", +"e1ad84a0": "GetFixedPrice(uint256)", +"e1addfbb": "priceOfreservations(address)", +"e1ae91b3": "TestToken(address,uint256,uint256)", +"e1af0121": "associationOf(address)", +"e1af915d": "changeGenes(uint40,uint256)", +"e1afb08c": "unlock(bytes16)", +"e1b0513b": "withdrawGame()", +"e1b0d4b2": "setTransactionsAllowed(bool)", +"e1b10970": "moveFactory(uint8,uint8)", +"e1b27e6b": "COO()", +"e1b3f338": "undoPending(address)", +"e1b40a76": "ipfsAddress()", +"e1b41513": "LIVEToken()", +"e1b4d6cb": "HOTCRYPTO()", +"e1b5265a": "PutForExchange(address,uint256)", +"e1b53078": "makerAffiliateFee()", +"e1b54285": "endDateOfVipPlacement()", +"e1b5989d": "FastLoan()", +"e1b5ce0f": "buy(uint256,string,string)", +"e1b7535f": "getDepositor()", +"e1b7abda": "HOST_SHARE()", +"e1b8347b": "testFundsAreTransferrableAfterSale()", +"e1b84ac3": "_storeSettingCreation(address,uint8,string,address,address,string)", +"e1b8708f": "OwnerChanged(address,address,bytes32)", +"e1b92b21": "LogOmegaEggSale(address,uint256)", +"e1b9dc08": "setCallbackGasLimit(uint256,uint256)", +"e1b9dea4": "Globglogabgalab()", +"e1b9ed9d": "_buyTokens(address,uint256,uint16)", +"e1ba84a9": "testFallbackThenAdd()", +"e1baa2a0": "ownerAngelTransfer(address,uint64)", +"e1baa9cb": "CNT_Common()", +"e1baed1a": "hireBountyHunter(uint256)", +"e1bc048e": "clones_to_create_one_idea()", +"e1bc3003": "reveal(bytes,string)", +"e1bccc7f": "FccToken()", +"e1bd5af9": "contractHolderAddress()", +"e1bdc3c9": "addAddressMappingProposal(address,address)", +"e1be7467": "bounties()", +"e1bedf2a": "AlarmTester(address)", +"e1bf34e9": "transferToKnownContract(address,uint256,bytes32[])", +"e1bf4f50": "upgradeM5Logic(address)", +"e1bf50c8": "_transferChamp(address,address,uint256)", +"e1bfc31e": "acceptOp()", +"e1c0669d": "getJobSponsorshipId(address,address,uint256)", +"e1c093da": "getMinerBlock()", +"e1c1451a": "tokensIssuedMkt()", +"e1c18c42": "setEarned_money(uint256)", +"e1c1b939": "verifyTransaction(bytes32,uint256,address,address,uint256,address,address,uint256,bytes,bytes)", +"e1c33523": "xpaFundDeposit()", +"e1c3aedc": "updateRewardVaultContract(address)", +"e1c3bac6": "stakeMaxAge()", +"e1c3fb91": "_hasClosed()", +"e1c49dde": "previousRounds()", +"e1c4a6a6": "getIsRemoved(bytes32)", +"e1c4c9fe": "remainingReward()", +"e1c52dc6": "Confirmation(address,bytes32)", +"e1c5d838": "createOrgan(string)", +"e1c621c0": "_rewardTokens(address,uint256)", +"e1c66292": "Create(uint32,address)", +"e1c68f31": "findFloorKey(uint256)", +"e1c6b14b": "addToOtherMap(uint256,uint256)", +"e1c70b29": "_createPow(string,address,uint256,uint256,uint256)", +"e1c7392a": "init()", +"e1c7f06a": "AddSharedAccount(bytes32,bytes32,bytes32,address)", +"e1c80391": "setArtcoin(address,address,address)", +"e1c941b0": "batchSendWebGiftToken(address[],uint256)", +"e1c95bb9": "updateThresholdNewTokenPair(uint256)", +"e1c9ccaa": "ShopalToken()", +"e1ca1b7d": "FilmoljupciCoin()", +"e1ca6f6f": "distribute_100_tokens_to_many(address[])", +"e1ca8b57": "setNewPriceFuncAddress(address)", +"e1caa0c7": "createAndCall(string,bytes)", +"e1cb0e52": "getVal()", +"e1cb5515": "newArticle(string,string,string,address)", +"e1cba8d2": "TUBECOINcontract()", +"e1cd5fc0": "PROJECTOPERATION_SUPPLY()", +"e1cda468": "createRequestFromBytes(bytes)", +"e1ce95c8": "summon10SkinAppearance(uint256)", +"e1cf0b3b": "refundAllPlayers()", +"e1d001eb": "mintAllowance(int256)", +"e1d03d11": "setUnlockedAddress(address)", +"e1d07058": "_modifySpendLimit(uint256)", +"e1d10d85": "getMyTickets()", +"e1d10f79": "calluseraddress(address)", +"e1d1e8ef": "getCurrentUnitPrice()", +"e1d2d3e4": "SocialMedia()", +"e1d2f649": "restartAuction(uint256,uint256,uint256)", +"e1d30979": "wolkInc()", +"e1d35155": "ProudofYourCoin()", +"e1d4efc4": "YHT()", +"e1d5988e": "discount(uint256,uint256,uint256,uint256,uint256)", +"e1d5e8eb": "rollDices(uint256)", +"e1d5ec4c": "seedShare()", +"e1d6aceb": "transferWithComment(address,uint256,string)", +"e1d6e166": "getContracts(address,uint256)", +"e1d76c8e": "getBlocksByOwnerDesc(uint256,uint256,address)", +"e1d7ce2c": "EthCentsUpdated(uint256)", +"e1d7fadc": "disqualifyHopeful(uint256)", +"e1d81736": "addUser(uint256)", +"e1d8501d": "getUSDAmount(uint256,uint256)", +"e1d94d94": "ownerChangeSlogan(string)", +"e1d9627f": "ReputationChanged(address,int32,int32)", +"e1da4135": "bountyFundAddress()", +"e1da4f85": "setStartStage2(uint256)", +"e1da5637": "setPercentWeiJackpot(uint256)", +"e1dace1a": "rewiewToken()", +"e1dad94c": "recountUsersBalance()", +"e1db206c": "limitTier1()", +"e1db8e7e": "getCreatedPayoutNumerators()", +"e1db8ff2": "mineForMany(address[],address[],uint8[],bytes32[],bytes32[])", +"e1dbc281": "changeBank(uint256)", +"e1dc7792": "OptedOut(address,address)", +"e1dcafa3": "setDefaultReputationReward(uint256)", +"e1dcf3de": "NewBooking(address,uint256,uint8,uint256)", +"e1de02f3": "_exit(address)", +"e1de373f": "addPlayerName(string)", +"e1df4517": "WealthChainToken()", +"e1df507c": "calculateAmounts(uint256)", +"e1df7f60": "startstopICO(bool)", +"e1e073b6": "amountTokenIssued()", +"e1e09299": "addUserRole(address,uint8)", +"e1e158a5": "MIN_DEPOSIT()", +"e1e1f977": "parseTx(address[4],uint256[3],uint32[4])", +"e1e29558": "completeTask(uint256)", +"e1e2ccd2": "sellDrugs()", +"e1e3f915": "parameterizer()", +"e1e46351": "mvpLaunchedAt()", +"e1e46f24": "tokenRate2()", +"e1e471eb": "BankingPayToken()", +"e1e4d737": "setTokenFront(address)", +"e1e5c093": "controlSum()", +"e1e7c320": "getGamesPlayerBids(uint256,address)", +"e1e85c4b": "splitProfit(uint256)", +"e1e867e5": "getFees(uint256,uint256,address)", +"e1e87c28": "refundToBuyers()", +"e1e87f40": "LogDividend(address,uint256,uint256)", +"e1e87f60": "_getBid(address,uint256,uint256)", +"e1e902af": "transferToLock(address,uint256,string)", +"e1e93604": "atomicMatch_(address[14],uint256[14],uint8[6],bytes,bytes,bytes,bytes,bytes,bytes,uint8[2],bytes32[5])", +"e1e9e249": "encodeAddress(address,address)", +"e1ea0a57": "TOKKA()", +"e1ea5e05": "token_fallback(address,address,uint256,bytes)", +"e1eac4a8": "get_bountyHunter(address,address)", +"e1eae0b4": "fullUnitsStaked(address)", +"e1eb5f87": "NewPrice()", +"e1ebdb6d": "setWhitelistA(address,address)", +"e1ec12c7": "TopPlayerToken()", +"e1ed7fcb": "setBagMultiplier(uint256,uint256)", +"e1edd8ec": "getSupplyAgent(address)", +"e1eddc6d": "_rand(uint256)", +"e1ee9284": "getOwnCard(address)", +"e1ee9a3d": "isPreIcoDate()", +"e1ef42b1": "Total_Investors()", +"e1efda6d": "airaSend(address,address,uint256)", +"e1f0ae1b": "NexoToken()", +"e1f0c376": "gameDuration()", +"e1f11822": "carnumOf(address)", +"e1f16616": "invcoinSentToEther()", +"e1f21c67": "approve(address,address,uint256)", +"e1f4895a": "getCostToken()", +"e1f4a9b1": "set_pre_kyc_bonus_denominator(uint256)", +"e1f51aca": "listTokenByRank()", +"e1f5760b": "horsesRemaining(uint256)", +"e1f57846": "com_fee_transaction(address,address,address,uint256,uint256)", +"e1f5eb3f": "convertTokens(uint256,address)", +"e1f5ebc5": "_projectAddNew(address,uint256)", +"e1f6452e": "AggiungiNegoziante(address,bool)", +"e1f69952": "voteSvp02(bool)", +"e1f7d0e1": "PRE_SALE_END()", +"e1f7ec5a": "getStored()", +"e1f82d60": "publicReservedToken()", +"e1f86887": "getPortfolioTable()", +"e1f87904": "getNextDouble(address)", +"e1f8922e": "transferName(address,string)", +"e1f8926b": "depositEthPool(uint256)", +"e1fa70ef": "endCloseSale()", +"e1fa7638": "attack(uint256,uint256)", +"e1fa78e9": "AgriChainLabelInt()", +"e1fa82d0": "transferFromFlower(address,address,uint256)", +"e1fa8b02": "distribute(uint256,address)", +"e1fa8e84": "register(bytes32)", +"e1fac58d": "lockedBalanceOfByDate(address,uint256)", +"e1fb070e": "MtTaborToken()", +"e1fbeaed": "CUCUX()", +"e1fcad6a": "_equipUpOne(address,uint256)", +"e1fcb86d": "YouTube()", +"e1fd3d4e": "emergencySetDOwner(bytes32,address)", +"e1fd632f": "EDU_KYC_BONUS()", +"e1fdb4b4": "refundBet(uint256)", +"e1ff98f2": "getTotalCounter()", +"e1ffdecb": "tokensPerTranche()", +"e20056e6": "replaceOwner(address,address)", +"e200cee8": "setBossWannaCryInterface(address)", +"e201be98": "airDropToken()", +"e201d466": "MultiToken(uint256,string,uint256,string,string,uint256)", +"e2021f66": "getAttack(bytes32,bytes32,uint256)", +"e2022d3a": "storeNewVesting(address,address,address,string,uint256)", +"e202e1eb": "contractPartOne(uint256)", +"e20314ed": "trade(uint256[10],address[4],uint256[6],bytes32[4])", +"e2034834": "RemoveRocketForSale(uint32)", +"e203f335": "leafPrice()", +"e2045452": "setUsername(address,string)", +"e2045b5e": "getBadgeInfo(uint256)", +"e2047589": "assertEq(address,address,bytes32)", +"e204ce12": "transferExtra(address,uint256,uint256)", +"e2056c46": "ExtraBalToken()", +"e2059fdf": "showIssueDetail(address,bytes32)", +"e2069734": "destroyRemainingTokens()", +"e2087a44": "receiveApprovalTest(address,uint256,address,bytes)", +"e209bf22": "addMeme(string,string)", +"e20a4bcd": "recoverAddressFromCooperativeSettleSignature(bytes32,address,uint256,address,uint256,bytes)", +"e20a5ac2": "bonusFourthWeekPeriod()", +"e20a9ae9": "Tesoro()", +"e20acc79": "changeInterval()", +"e20b7d3c": "checkPoolAddressTierCap(uint8,uint256)", +"e20bbd8d": "RecoveryWithTenant()", +"e20bc67b": "autoUnlock(address)", +"e20bce0a": "lowTimeBonusValue()", +"e20c6d3d": "getMessageData()", +"e20ccec3": "pending()", +"e20cfc4a": "payedDividendsUSD()", +"e20d35ad": "CellBlocksToken()", +"e20dc05b": "globalOperator()", +"e20de6eb": "addrLockedFunds()", +"e20e1dc3": "createProxy(address[],uint256)", +"e20e36a0": "ExchangeAdapterBase(address,address)", +"e20e54a5": "getMHTHoldersNumber()", +"e20ff6f7": "fetchCurrentSatoshiState()", +"e2101509": "getSketchesWithHolder(address)", +"e211003d": "processOffChainPurchase(address,uint256)", +"e2119c80": "computeRealCap(uint256,uint256)", +"e2121de1": "withdrawAny()", +"e2130d1e": "unlockTeamTokens()", +"e21316ea": "mortal(address)", +"e213beb7": "transferCoOwnership(address)", +"e213e10a": "_createMeme(uint256,string,address,uint256)", +"e2153231": "SahilToken()", +"e2155c14": "galleassMint(address,uint256)", +"e21608be": "ReserveToken()", +"e2164700": "currentRewardNum()", +"e216bf4d": "SetBlockForSale(uint256,uint256,uint256,address)", +"e2172000": "left63(uint256)", +"e2179b8e": "g()", +"e21827a1": "unmintedTokens()", +"e218519c": "getref()", +"e2187e6e": "endTimeLockedTokensTeam()", +"e2188190": "CROWD_WAVE3_PERIOD()", +"e219aa11": "GetEscrowETHBalance()", +"e219b9e1": "rebateOneFenmu_()", +"e21a430b": "publicRelease()", +"e21aaa0f": "_getShipPrice(uint256,uint256)", +"e21ac8a1": "AvatechToken()", +"e21b0b95": "updateGlobalMinContribution(uint256)", +"e21b63b2": "setNewMint()", +"e21b9d08": "m_changeable()", +"e21be4f4": "CBMTToken()", +"e21c4783": "isPermitted(address,bytes32)", +"e21e221b": "ContributionRegistration(address)", +"e21f37ce": "message()", +"e21f44f4": "PoolCreated(uint8,uint256,uint256)", +"e21f8e56": "get_game_fees()", +"e21fd9fc": "_owns(address,uint256)", +"e2202a4d": "jester()", +"e2211592": "TWO_DAYS()", +"e2217114": "forwardEther(uint256)", +"e2217d5c": "payeth()", +"e2219773": "webGiftOnceMaxAmount()", +"e221d5d5": "getDukeNickName(string)", +"e222b00c": "blocksPerPayPeriod()", +"e22325ad": "transferBase(bytes32,address)", +"e2233ada": "smartDoor(address[])", +"e223b547": "calcFixedReward(uint256)", +"e223cb37": "AddBill(uint256,uint256,uint256,bool)", +"e223ed87": "getPetValue(uint256)", +"e223facb": "USER_GAME_WITH_TOKEN(uint256)", +"e224179e": "icoOverride()", +"e22497e4": "removeFromPublicSaleWhitelist(address[])", +"e225c56b": "KudosToken()", +"e225e588": "TNCN()", +"e226a1b6": "getAddressStatus(address)", +"e226cdec": "sellOffline(address,address,uint256)", +"e226ed22": "balanceOfERC20(uint256,address)", +"e227b5d1": "ETHContributed(address)", +"e228647f": "olty_6()", +"e228a6f4": "withdraw(uint256,uint8,uint16)", +"e228d627": "nextTokenAddress()", +"e228ecb4": "lockBalance()", +"e22938bd": "ShareManager()", +"e22955c6": "MultiplyContract(address,uint256,uint256,uint256,uint256,uint256)", +"e2298591": "xIPFSPublicKey()", +"e22a3af8": "canClaimTokens()", +"e22a6231": "addCandidate(address,string,string)", +"e22a9877": "getHWCAddress(address)", +"e22aa47a": "lockTokensForCs(address,address,address)", +"e22ad518": "startNextPremiumSale()", +"e22ae31d": "FrameCoin()", +"e22b0c46": "verify(uint256,uint256,uint8,bytes,bytes)", +"e22b3fb4": "changeOwner(bytes)", +"e22b94e8": "ForceCryptoInvestmentCoin()", +"e22baa56": "nonZero(uint256)", +"e22bda35": "eventVenue()", +"e22c6128": "getIncome(address)", +"e22d1581": "saleEnd2()", +"e22e8046": "getLunckyIndex()", +"e22ed995": "createStudent(string,string,string,uint32,bytes1)", +"e22f8dc9": "buy_lovelock(string,string,string,uint256)", +"e22fb860": "CJXToken()", +"e22fcd08": "useItems(uint32,uint256,address,uint256)", +"e23000a0": "buyBackPrice()", +"e2301d02": "subApproval(address,uint256)", +"e2306253": "o1Address()", +"e230dfbd": "setETHUSD(uint256)", +"e230e246": "cutFor(address,uint256,uint256,uint256)", +"e2311a78": "Payperblock()", +"e2313d1f": "ClaimOrichalcum()", +"e231bff0": "redeemed()", +"e2322c73": "firstPeriodWindows()", +"e2326909": "addCourse(string,string,string,uint256,uint8,uint8,uint16,uint8,uint8)", +"e2331332": "AortaToken()", +"e2332120": "secondUnlockTime()", +"e233ee0d": "publicFillOrder(bytes32,uint256,bytes32)", +"e2356efd": "holdTokensOnStage()", +"e235847a": "addSourceForTimeline(uint256,uint256,string,bool)", +"e235ca59": "revealsCount(uint256)", +"e236de22": "distributorWallet()", +"e2376be1": "sendMon(address,address,uint64)", +"e2387bb6": "AuctionHouse()", +"e238c7ed": "setAllowanceAdmin(address,address,uint256)", +"e238def9": "getReleasedBalance()", +"e23941bc": "testDepositWithdraw()", +"e239421d": "Lotthereum(uint256,uint256,uint256,uint256,bytes32)", +"e239ccba": "Disco()", +"e23a15b5": "logSigned(string,bytes16)", +"e23a4916": "getMainLockup()", +"e23a7785": "approveAndBuy(uint256,address,uint256,bool)", +"e23a845a": "getExpirationTime()", +"e23c5063": "getAttributeValue(address,bytes32)", +"e23caa06": "getLotteryDetailsA(int256)", +"e23cbad1": "getArkData(uint256)", +"e23d0996": "getDBallotID(bytes32,uint256)", +"e23d0b23": "week2Price()", +"e23da75a": "setTokenApproval(uint256,address)", +"e23e231f": "TOKENS_NOT_FOR_SALE()", +"e23e3229": "investorIndex()", +"e23eaae6": "SmogToken()", +"e23eb0c5": "_calculateFEE2Distribute()", +"e23f5e49": "checkLucky(address,uint256,uint256)", +"e23f61f6": "isCurrentOrPastAdmin(address,address)", +"e23fc908": "_setBurnFeeAbs(uint256)", +"e2418c15": "throwsWhenNetworkPlaceholderIsBad()", +"e241c1d9": "deriveKey(uint256,uint256,uint256)", +"e241e9c5": "_getUt(address)", +"e2420bd2": "setTwitterBot(address)", +"e242df57": "MiracleTeleToken(uint256)", +"e242fbbb": "addHuman(string,uint8)", +"e244054a": "trade(bool,bytes,uint256,uint256)", +"e2442441": "VpaxContract()", +"e24459ce": "rakugoPresaleAddress()", +"e2449c13": "createSqr(uint256,address,uint256,uint256)", +"e244fe89": "addToCommunitySaleWhitelist(address[])", +"e2454522": "verify(uint8,bytes32,bytes32)", +"e2457f50": "changeZS(address,address,uint256,uint256)", +"e24613ea": "getNexOrdertUser(address,address,uint256,address)", +"e2466cb6": "invalidateAnnouncement(uint256)", +"e24670eb": "EthToCentsUpdated(uint256)", +"e246ddba": "icoFinishTime()", +"e246f71a": "EventAddManager(address,address)", +"e247a2e2": "updateVolume(uint256)", +"e248b435": "setCCH_edit_15(string)", +"e2496d5b": "tokensWeiRaised()", +"e2499b98": "stakedContentById(bytes32)", +"e249a575": "setTermsNumber(uint256)", +"e24a1d1e": "deauthoriseMaker(address)", +"e24a5042": "transmuted(uint256)", +"e24b4403": "_emitDeposited(address,uint256,address)", +"e24b7721": "addressLeskiw()", +"e24c36d0": "flushEra()", +"e24cddd6": "getCartLength(address)", +"e24cf226": "closeEscrow(uint256)", +"e24f8313": "addReputation(address,uint256)", +"e24fe110": "Decentralized()", +"e24fed00": "assertEq(bytes,bytes,string)", +"e2506eab": "setEMAValue(uint256)", +"e250ecfe": "Cogenero(uint256,uint256,uint256,address)", +"e251e358": "preIcoSoftCap()", +"e25209b6": "roundOneLimit()", +"e253c21d": "ZBCToken()", +"e253dd6b": "setBonusRound4(uint256)", +"e2542f03": "updatePurchasePossible(bool)", +"e2550156": "smallBlind()", +"e25520a7": "LocklistAddressdisable(address)", +"e2558086": "calculateLandmarkPrice(uint256)", +"e255d5ad": "maxBuyRateInPrecision()", +"e25665da": "earlyBackersPoolAddress()", +"e256888f": "PERCENTAGE_PRECISION()", +"e2573266": "withdrawRC()", +"e2575e48": "_isMultiple(uint256)", +"e2576998": "changeMaxCoefPartnerForEmission(uint256)", +"e2583070": "balanceImportsComplete()", +"e25876d3": "weiToFinney(uint256)", +"e258a0f0": "createItem(string,uint256,uint256,uint256[6])", +"e258aa02": "createPromoRegion(address,string,uint256)", +"e258be32": "removeBookSigner(bytes16,address)", +"e259501e": "contributorsWallet()", +"e2595235": "addPack(uint8,uint128,uint256)", +"e259d074": "endauctionother(uint256)", +"e25a2a99": "updateTier(uint256,uint256,uint256)", +"e25a51b6": "setCompositeReputation(string,uint32)", +"e25ade5f": "issueTokens(address,uint256,uint256,bool)", +"e25b5cbd": "STAKE_APR()", +"e25bc771": "_transferCard(address,uint256,uint256)", +"e25bd409": "receivePositionOwnership(address,bytes32)", +"e25c80d0": "_currentIcoPhaseMinimum()", +"e25c9c33": "getBadgeLevel(bytes32,uint256)", +"e25d4dac": "mintFund(address,uint256)", +"e25f0a98": "requestedForMigrationAt()", +"e25f71ac": "isRoundAwarded()", +"e25fe175": "step()", +"e2616387": "MPY(uint256,uint256)", +"e26176d9": "FundRanking(address)", +"e261fc63": "UserRank(address)", +"e2621a66": "HPBToken(address)", +"e26259a4": "updateMyHns(string,address)", +"e264172c": "drainETH()", +"e26422fe": "DaysToDestroy()", +"e2646a9f": "getICOStage()", +"e2649caf": "voteToFreezeFund()", +"e264a2f4": "KIN_PER_USD()", +"e264fc07": "_buyFillet(address,uint256,bytes)", +"e2651539": "priceCreatingChannel()", +"e26534bf": "whaleExchangeRate()", +"e2659324": "require_email(bool)", +"e265c5e2": "getTotalTokenWithdrawByAddress(address)", +"e2664254": "priceDivisor(uint256,uint256)", +"e26659da": "getAllBaller()", +"e26693ac": "stakeDice()", +"e266e5ad": "Mystical()", +"e267761f": "unmintedGBT()", +"e267dd9b": "addAgent(uint256,uint256,uint256,address)", +"e26814d8": "withdrawCoins(address,uint256)", +"e26835ce": "giveToken(address)", +"e2684f08": "_isPaused()", +"e268ea6b": "SOFT_CAP_T()", +"e269053a": "getNumberOfAssets()", +"e2693180": "DHANACOIN()", +"e269f929": "recoverRevokeHash(bytes,bytes,uint256)", +"e26a687f": "BP_IMMORTAL()", +"e26ba086": "getTargetInvalidMarketsDivisor()", +"e26bc039": "numRegisteredModules()", +"e26c2da9": "TerraToken()", +"e26c551e": "publishConditions(string)", +"e26c8434": "AdminStartDraw(string,bytes)", +"e26dee0e": "IcoExt()", +"e26e7b50": "calculateCritMassRewards(uint256)", +"e26e8d84": "FillSellOrder(address,address,uint256,uint256,uint256,uint256,uint256)", +"e26f0342": "ArrayTypesTest(uint256[10])", +"e26f21bf": "setHoldPercentage(uint256)", +"e26fdc12": "equipDown(uint256)", +"e27008c2": "_createRareCard(address,uint256,uint256,uint256,uint256)", +"e270398a": "emitJobPosted(uint256,address,uint256,uint256,uint256,bytes32,bool)", +"e270bc81": "resumeICO(address)", +"e270f88c": "_getFreezeTime(uint256)", +"e27131f9": "MintCoin()", +"e2725161": "calculateOdds(uint8)", +"e2726e94": "minSumICOStage4USD()", +"e272b892": "pauseContract(bool)", +"e2734c93": "getPlayerBalance(address)", +"e273f117": "SetServiceProviderFee(address,uint256)", +"e2740b4e": "getTradesRoot()", +"e2749799": "GBank(uint256)", +"e274a3e7": "Papergold()", +"e274fa4e": "BitcoinXL()", +"e274fd24": "eventContract()", +"e2757a50": "PepFarmer()", +"e275a016": "check_data(string)", +"e275f296": "transferFromMulti(address[],address[],uint256[])", +"e27671ff": "hillpayout()", +"e276729d": "getPeriodStarted(uint256)", +"e276c799": "getx()", +"e2775da5": "getMartialOwner()", +"e2776ab8": "CryptoPhoenixes(address)", +"e2786d65": "refundSplitMembers()", +"e278c0f2": "setInvestorsFee(uint256)", +"e278d283": "getLineUpEnable_pool(address)", +"e278fe6f": "closeRound()", +"e2790853": "OX()", +"e27929b6": "addRecord(bytes32,string,string)", +"e27a8aca": "addWhiteListedInvestor(address,string)", +"e27a9c74": "setOwnerName(uint256,string)", +"e27b73f0": "issueWithExternalFoundation(address,uint256,bytes32)", +"e27c5b17": "testSlice()", +"e27da9c6": "current_tier()", +"e27e3fd3": "CancelGame()", +"e27ecfcc": "LogStartDate(uint256,uint256)", +"e27f0236": "agingBalanceOf(address,uint256)", +"e27f1692": "Bitsonatoken()", +"e27f3853": "timeFreezeTeamTokens()", +"e27fe50f": "startAuctions(bytes32[])", +"e280b58f": "tokenIssuedLockUp()", +"e280d66b": "updateWonNums(uint256,uint256)", +"e2812256": "Monarch()", +"e281d7e4": "CryptoSlotsGame()", +"e282348c": "w_Founders()", +"e282726b": "reserveAddr()", +"e282938d": "founderLockEndTime()", +"e282969e": "getPerson(uint256,bool)", +"e282cda6": "calculateBucketId(bytes32[])", +"e283d1ec": "registerEscrow(string,string)", +"e2842d79": "getAllUsers()", +"e28435c4": "ownerETHCashout(address)", +"e284cbfa": "getAllAdIdsByCat(uint256)", +"e284f217": "distributeToAll(uint256)", +"e2861c8d": "cashOutProfit()", +"e2865b4d": "growCost()", +"e2868c54": "Airdrop2(uint256)", +"e2869853": "RefID(string,string)", +"e2869f70": "setCrowdsaleAndVesting(address,address,address)", +"e2877e04": "transferFactoryResourceAmount(uint16,address,uint256)", +"e287adf4": "addSig(address,bytes32)", +"e2889c82": "setTimeLimit(uint256)", +"e2894a8a": "OwnerAnnounce(string)", +"e2896598": "leaderTimestamp()", +"e289fcb6": "contractActive()", +"e28a5e63": "sellDeadline1()", +"e28ab336": "MAX_INVEST_SHARE()", +"e28b0d9a": "updateFundingEndBlock(uint256)", +"e28b2b76": "ipoPlatform()", +"e28b7555": "CapiterContract()", +"e28d717b": "transferETH()", +"e28d8c4b": "claimBonusTokens()", +"e28deda5": "sweepTokenAmount(address,uint256)", +"e28e6b3a": "masterTotalEarning()", +"e28fa27d": "setHardcap(uint256)", +"e28fed1e": "userRescues(address)", +"e29121de": "ADVISOR_TOKENS()", +"e2912367": "_getValuePartByPercent(uint256,uint256)", +"e292c740": "setLargeInvestorWei(uint256)", +"e2935edb": "getUpgradeCardList(address)", +"e2948c21": "marketingTeamTokens()", +"e29532c1": "getDataFromCode(string)", +"e2954a14": "purchaseSeconds()", +"e29581aa": "getNodes()", +"e2958974": "read_transfer_config()", +"e295c9d6": "getActiveBanners()", +"e297273a": "getBlockHashOrZero(uint256)", +"e298287f": "senderAddressIsSecretContract(address)", +"e2982c21": "payments(address)", +"e2985596": "angelCardDataContract()", +"e298d85c": "discountBlock()", +"e2996879": "HuoNiu()", +"e299beb3": "SimpleIndex()", +"e29a2e89": "publishMessage(string,string,string)", +"e29a82d3": "BigFishRoll()", +"e29bfe13": "submitWithdrawTransaction(address,uint256)", +"e29c6a7b": "addYearToken()", +"e29caee2": "currentStageTokensRate()", +"e29e1345": "amountPerDay()", +"e29e1864": "PresaleCapChanged(address,uint256)", +"e29e3a4c": "artistsArtworkCount()", +"e29e436a": "setWorldCupTeamDesc(uint256,string)", +"e29eb836": "totalCollected()", +"e29f5182": "byte32ToString(bytes32)", +"e29f610d": "end1Timestamp()", +"e29f99f0": "tokenAdd()", +"e29f9da6": "_getrand09()", +"e29fa4b4": "setOriginalOwner(uint256,address,address)", +"e29fb547": "scheduleCall(bytes4,uint256,uint256,uint8,uint256)", +"e2a034dd": "participantsFirst(uint256)", +"e2a0d56d": "FundsBurned(uint256)", +"e2a27ca8": "_setBorderValue14(uint256)", +"e2a288c0": "placeCoin(uint16,uint16)", +"e2a2adc2": "divisionRoundedUp(uint256,uint256)", +"e2a3382f": "holdedOf(address)", +"e2a376ec": "addContributor(address,uint256,uint256,uint256,uint256)", +"e2a38a4b": "removeTokens(address,address,uint256)", +"e2a4853a": "setUint(bytes32,uint256)", +"e2a51b8f": "amountOfParticipants()", +"e2a5c39f": "revealPeriodStartedTimestamp(bytes32)", +"e2a71f12": "accountDelete()", +"e2a8215b": "purchaseTokens(address,uint256,address)", +"e2a9ba05": "getBoosterDuration(uint256)", +"e2a9bb53": "CreateBattleCards(uint256,uint256,uint256,uint256,uint256,uint256,uint256,bool)", +"e2a9ca4c": "disableTokenTransfer()", +"e2aa2dcf": "CryptoPeopleName()", +"e2aa6003": "gameResult(uint256,uint256,uint256,bool,uint256,uint256)", +"e2aa6c66": "createPasswordChallenge(bytes20,bytes32)", +"e2aa99ab": "startCrowdsaleY2(address)", +"e2aafa21": "inWhitelist(address)", +"e2ab691d": "lock(address,uint256,uint256)", +"e2acf75d": "auctionCancel(bytes32)", +"e2ad0699": "addCertification(address,bytes32,bytes,bytes32)", +"e2ae0c79": "setParentID(uint256,uint16)", +"e2ae9de0": "deleteArrayUint(bytes32,uint256)", +"e2b05077": "getSaleDate(bytes,uint256)", +"e2b0caef": "when()", +"e2b13fa0": "ManagerPermissionRevokedEvent(address,string)", +"e2b178a0": "getAuthority()", +"e2b202bf": "deleteUint(bytes32)", +"e2b20a72": "SecretToken()", +"e2b2579b": "isClean(address)", +"e2b26323": "proceedToNewStage(int256)", +"e2b375a9": "transferOwnership2(address)", +"e2b43e23": "setDepositInterface(address)", +"e2b4b30d": "getvaluejoinlist_odd(uint256)", +"e2b4f4b5": "lockedTeamUFT()", +"e2b770b4": "updateUSDMonthlySalaries(address,uint256,uint256)", +"e2b7713f": "Midel()", +"e2b863cf": "calculatePayout(bytes32,uint256)", +"e2b8766c": "testFailTransferNotTransferable()", +"e2b91318": "createOptionAndUnderwrite(bool,address,uint128,uint128,address,uint64,uint256)", +"e2b9e186": "name_()", +"e2b9e322": "bondsOutstanding(address)", +"e2ba53f0": "winnerName()", +"e2ba600e": "starting_giveaway()", +"e2ba6ce8": "m_KYCProvider()", +"e2bbb158": "deposit(uint256,uint256)", +"e2bc1971": "getGamblerGameIds(address)", +"e2bca77e": "calculatePrizeAmount(uint256,uint256,uint256)", +"e2bd505b": "setTitulaire_Compte_2(uint256)", +"e2bd8e43": "CodysToken()", +"e2c03ace": "itemsCount()", +"e2c14bdd": "getMapping(bytes32)", +"e2c1f02c": "buySuperDragon()", +"e2c1f7d7": "firstCapEndingBlock()", +"e2c20836": "updateAndGetHodlTotalValue()", +"e2c2ae5a": "isBuyPrice(uint16)", +"e2c2d72c": "setChallengeScienceContract(address)", +"e2c31be6": "icssale(address)", +"e2c345e2": "originalContract()", +"e2c38eaf": "findProductIndexById(uint256)", +"e2c3941a": "DOG_Token()", +"e2c3f9a8": "RATE_PUBLIC_SALE()", +"e2c41dbc": "depositFunds()", +"e2c516be": "icoReceivedWei()", +"e2c518fa": "lastMovement(address)", +"e2c5449e": "chanceNo()", +"e2c61114": "setImportFee(address,uint256)", +"e2c6d41c": "council()", +"e2c718d8": "right20(uint256)", +"e2c76bb0": "SpeculateCoin()", +"e2c7f7ae": "majorOwnerShares()", +"e2c86092": "ifoodCommunity()", +"e2c8a8ad": "contributorPoolMintQuota()", +"e2c8dd34": "dividendsWallet()", +"e2c8e54a": "senderIsPosition(address,address)", +"e2c8f7c8": "ARIWallet()", +"e2c92a52": "distribute(address,uint256,uint256)", +"e2c9b07d": "ChangeBillLeasingInfo(uint256,uint256,uint256,bool)", +"e2c9bc9e": "GenesisTransfersCount()", +"e2ca01f0": "addNewOrUpdateHolder(uint256,bytes32,bytes32,bytes32)", +"e2ca481c": "swaps(address,bytes20)", +"e2cbb9b7": "evCreatedToken(address,uint256,address,uint256)", +"e2cc20bd": "dealerHit()", +"e2cc7a51": "signingPrefix()", +"e2cdd42a": "vote(uint256,address,bool)", +"e2ce7e67": "read_i16_array()", +"e2cf8b0d": "createBundle()", +"e2d07a33": "QYKToken()", +"e2d0d519": "sendOwnership(address,uint256)", +"e2d17ab1": "checkGoals()", +"e2d1da31": "createBuildingOmni(uint32,uint8,uint8,uint8,uint8,uint8,address,bool)", +"e2d2a868": "autoRefundCrowdsaleContributor(address)", +"e2d2dcca": "removeMemberAcct(address)", +"e2d2e219": "dividendsPerShare()", +"e2d31df4": "getTeamPerfitAmuont()", +"e2d45f7b": "transferMultipleDelegated(address,address[],uint256[],uint256,uint256,uint256,bytes)", +"e2d56060": "balanceInWei()", +"e2d5d11b": "revealCap(uint256,uint256)", +"e2d6eddc": "get_row_col(uint256,uint256,uint256)", +"e2d7a7c0": "setAttrCustom(uint256,uint256,uint256,uint256)", +"e2d7c64c": "darknodeRegisteredAt(address)", +"e2d84e23": "getLink()", +"e2daeb9c": "NICTO()", +"e2dbbf62": "changeIcoDiscountLevels(uint256,uint256)", +"e2dc35e0": "transferFund(address,uint256)", +"e2dc5da5": "finishMintingTokens()", +"e2dc7763": "freeze(address[],bool)", +"e2dc9aa1": "addTransaction(string,uint64,string)", +"e2dea715": "getMinerId(address)", +"e2deaa81": "set_reference(uint256,uint256,uint256)", +"e2deb962": "signUp(uint256,bytes32)", +"e2dede94": "getNode(uint256,uint256)", +"e2df0463": "changeTrancheAdmin(address)", +"e2df15d6": "setRewardClosed(uint256)", +"e2df20d1": "setAvailable(bool)", +"e2df2472": "Aurum()", +"e2df6c6f": "getBonus3(uint256)", +"e2e0c049": "UpdateSellAgent(address)", +"e2e15f2e": "Reward()", +"e2e1ff4d": "getBallotsNum(address)", +"e2e267fc": "SintToken(uint256)", +"e2e29ffe": "assertThat(bool)", +"e2e2e5cf": "UpdateMinBalance(uint256)", +"e2e39498": "_verifySignature(bytes,bytes,bytes)", +"e2e51348": "LogContractCreated(address,uint256)", +"e2e54288": "getCertificationList(bytes32,bytes32)", +"e2e5bd42": "setBetBasic(uint256)", +"e2e5fade": "presaleSales()", +"e2e616bb": "whiteListEnabled()", +"e2e68372": "IAM_PER_ETH_PRE_SALE_RATE()", +"e2e686d0": "safeAdd32(uint32,uint32)", +"e2e71098": "_FCTOKEN(uint256,string,uint8,string)", +"e2e794c3": "setPremiumMultiplier(uint8)", +"e2e79a02": "level2(address,address)", +"e2e7ab3a": "setEthlanceInvoiceContract(address)", +"e2e831cf": "genders(uint8)", +"e2e8b978": "sizeOfUint(uint16)", +"e2e9e6e8": "updateMaxMinComparables(uint256,uint256,uint256)", +"e2eb3336": "_performPurchase(uint256,uint256,address,uint256,address)", +"e2eb91cc": "removeAddressFromOwners(address)", +"e2ec6ec3": "addAddressesToWhitelist(address[])", +"e2ecb311": "createEscrow(address,uint256,uint256)", +"e2ecef03": "boleno()", +"e2edf7be": "usd2FokenByStage(uint256,uint16)", +"e2edfc20": "collectAirDropTokenBack(uint256)", +"e2ee2e89": "isPlayerInRound(uint256,address)", +"e2ee9941": "tap(bytes20)", +"e2ef9241": "FawnCoin()", +"e2f0a05a": "TokenCLC(uint256,string,uint8,string)", +"e2f1d298": "_addGroupToMember(address,bytes32)", +"e2f23224": "isEnableBuySell()", +"e2f273bd": "updateAdmin(address)", +"e2f2eb27": "NUMBER_OF_BOOSTERS()", +"e2f31829": "updateStatus(uint256,uint256)", +"e2f35f17": "teamAccountAddress()", +"e2f36034": "calculateRevenueAtBlock(uint256)", +"e2f45eba": "PrettyGirl(uint256,string,string)", +"e2f60706": "specialPurchase()", +"e2f60c26": "getMintAuditApproval(address,address)", +"e2f779f3": "withdrawTokensFromCustody(address,uint256,address,address)", +"e2f77ae2": "setPriceInExoTokens(uint256,uint32)", +"e2f8a017": "payInstallment(uint256)", +"e2f8b790": "buyBlueStarEgg(uint256,uint16)", +"e2f8fa16": "getPendingTaxData()", +"e2f8feb2": "internal_tester(int256)", +"e2f90632": "notTooLongSinceUpdated()", +"e2fa5398": "pack(uint16,uint64,uint64)", +"e2fa5fb1": "secondDiscountCap()", +"e2fa6f90": "_removeTokenFromOwnersList(address,uint256)", +"e2fa9ee0": "openShop(uint256)", +"e2faf044": "createDAO(address,uint256,uint256,uint256)", +"e2fb3d4a": "setReferralSmartContract(address)", +"e2fc2691": "upvotePost(bytes32)", +"e2fc421d": "crowdsaleStartTime()", +"e2fc5d19": "setConfirmations(bytes32,bool,bool)", +"e2fc6f68": "beneficiaryBalance()", +"e2fd38e9": "startEvent()", +"e2fd3c08": "OmVPNToken()", +"e2fdcc17": "escrow()", +"e2fdf807": "purchasableTokens()", +"e2fecdf3": "copy(bytes,uint256,uint256,uint256)", +"e2ffe3f3": "storageToUint(string)", +"e3004b57": "depositToken(address,bytes)", +"e30081a0": "setAddress(address)", +"e3038aaf": "calcOrderToMsAmount(uint256)", +"e303a92b": "drawLottery(uint256)", +"e303cccd": "sellKun(uint256)", +"e303e81e": "authorizeForTier(uint256,address[])", +"e30443bc": "setBalance(address,uint256)", +"e3049b6f": "getFighters(uint32)", +"e3049ded": "AllyNetworkToken()", +"e305044f": "disableServiceMode()", +"e3059cef": "recover(uint8,bytes32,bytes32,address)", +"e305c210": "getPositionFromBattleboard(uint16,uint8)", +"e30637d6": "REFF_TOKENS()", +"e30651b4": "COMMUNITY_CAPPED_VALUE()", +"e3069e4d": "HTX()", +"e306d361": "setUnits(address)", +"e306f779": "EIP712_DOMAIN_HASH()", +"e308262a": "kycPassed(address,address)", +"e3083fb5": "removeFromContribution(uint256)", +"e308700f": "thresholdEtherLimitForSeedRound()", +"e308c213": "getBag(uint256)", +"e30922fc": "isGameLocked(address)", +"e309396b": "addSchema(string,string)", +"e3098986": "totalSold_()", +"e309aa15": "RefundSent(address,uint256)", +"e309d1b5": "tierTwoRate()", +"e309f318": "spermlordAddress()", +"e30addb4": "set_property_layout(uint256,string,string,string)", +"e30b407e": "payWinningGladiator(uint256,uint256)", +"e30bd740": "reverse(address)", +"e30c36f1": "bubbleSort(uint256[])", +"e30c3978": "pendingOwner()", +"e30c7b0a": "TronXtended(uint256,uint256)", +"e30ca7cb": "getBalanceOfContractInSzabo()", +"e30cfa40": "isExecuted(uint256,uint256)", +"e30d1625": "stateUpdate(uint256,uint256,uint256,uint256,uint256,uint256,bytes)", +"e30dd27a": "EpsBonus()", +"e30dfb94": "callAndFailWithoutReason()", +"e30e3334": "BonusTokens()", +"e30f4e2b": "addMultipleAddressesToWhitelist(address[])", +"e30f4f84": "addWhiteBacker(address)", +"e30f7c8b": "startAirdrop(address[],uint256)", +"e30fe37a": "setQueryAddress(address)", +"e310c2ca": "emissionPay(uint256)", +"e312e00f": "approve(address,uint256,bytes,string)", +"e3140c51": "PCHAIN()", +"e31418be": "rateMap(uint256)", +"e3142e90": "logInitialReporterTransferred(address,address,address,address)", +"e31430c0": "acceptEscrow(address,address,uint256)", +"e314d852": "mintWithMemo(string,address,uint256)", +"e3153827": "reading_card_reversed_at(uint8)", +"e316bd56": "hashMsg(bytes32,address,bytes32,address,uint256,bytes32,string)", +"e316e9c0": "Issue(uint256,address,uint256,uint256)", +"e31743d7": "setTransferBlocked(bool)", +"e31870dc": "mlDevelopers()", +"e318a74c": "RACEFORETH()", +"e318b52b": "swapOwner(address,address,address)", +"e318de73": "getString(address,bytes32)", +"e3199044": "setGoalsPlayed(uint256,uint256,uint256,bool)", +"e319b0e2": "advisorsUnlockedAfterCliff()", +"e31a0292": "getostToken()", +"e31a7c01": "triggerTransfer(address,address,uint256)", +"e31a8116": "getMinPrice()", +"e31a9d92": "lastID()", +"e31b1aae": "ChangeInterest(uint256,uint256,uint256,bool)", +"e31bfa00": "next_id()", +"e31c60e3": "Request(address,uint256)", +"e31c71c4": "safeToSub(uint256,uint256)", +"e31d3460": "addused(uint256)", +"e31d3938": "MINT_INTERVAL_SEC()", +"e31e0c46": "set_end_block(uint256)", +"e31e2d6d": "func_0A93()", +"e31e450d": "checkBoard(uint256)", +"e31f28ef": "getTransferInfoTime(address,uint256)", +"e31f3e0c": "startUpgradePoll(address)", +"e31f4263": "theCamp()", +"e31ff6c2": "recordOffChainContribute(uint256,address,uint256)", +"e3206975": "bet_MAX()", +"e321045a": "_storeSettingDeprecation(uint256,address,address,address,uint256,address)", +"e321192b": "addTransaction(address,uint256,uint256,string,bytes)", +"e3218219": "DungeonTokenAuction(uint256)", +"e321adb3": "_canTransfer(uint256,address)", +"e3224ac3": "piecesOwned(address)", +"e32381b6": "kscMintTo(address,uint256,string)", +"e32497c4": "getArtefactsIds()", +"e3252a76": "oraclize_randomDS_proofVerify__sessionKeyValidity(bytes,uint256)", +"e32540b4": "OptionTransfer(address,address,uint256,uint256)", +"e3256429": "COMPANY_RESERVE_FOR()", +"e325fb4b": "bonusCap()", +"e326acbf": "uintFloor(uint256,uint256,uint256)", +"e326e6ad": "DEFAULT_PRESALES_DURATION()", +"e32754a0": "MyFreeCoin112(uint256,string,uint8,string)", +"e327a46f": "breakdown(uint256)", +"e3280126": "addOrder(string,bool)", +"e328cc5c": "getActiveArbiters()", +"e328ef67": "INDInflationVesting()", +"e3296684": "transferToPie(uint256)", +"e329e871": "endTime1()", +"e32a29bb": "burnClosedTokenMultiple(bytes32[])", +"e32aa56a": "acceptLastMilestone(bytes32)", +"e32ae93b": "getQueueOpening()", +"e32af410": "CSClosed(bool)", +"e32b349a": "JCB()", +"e32b6325": "releaseForIco(address,uint256)", +"e32c5f01": "managePID(uint256,uint256)", +"e32c65f2": "tokensPerWei15()", +"e32cb7fc": "decimalPlace()", +"e32d264e": "addDefaultOperatorByTranche(bytes32,address)", +"e32d5cf8": "setApprovals(address,address,uint256)", +"e32d76de": "validBeneficiary(address)", +"e32e68ec": "isNewSchool(uint256)", +"e32e9f22": "setDeploymentReward(uint256)", +"e32ecd18": "LEXT()", +"e32ef3c5": "refereesCount(address)", +"e33051dd": "setGasPriceLimit(address)", +"e3306a6f": "CurrentStatus()", +"e330a737": "setCrowdsaleCloseTimerFor(uint256)", +"e332dfe9": "Token0901(uint256,string,string)", +"e333f969": "setUserAllocMax(address,uint256)", +"e3343501": "_playRealOdds(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"e3349637": "addshop(uint256,string,string,string)", +"e334cd92": "getAstrosLength()", +"e334f32e": "encodeString(string)", +"e3350d7c": "setValidKYC()", +"e3353f3e": "increaseBlockTarget()", +"e335b5e9": "allocateSupply()", +"e335e1f8": "LogFundsLocked(address,uint256,uint256)", +"e33607da": "saleMarket()", +"e336e01d": "saleQuantity()", +"e33734fd": "changeProposalDeposit(uint256)", +"e337db6e": "NANJCOIN()", +"e337dd35": "SendingBounty(bytes32,uint256)", +"e337eca6": "TalkBounty(bytes32)", +"e3380b7e": "joinPillarCore(uint256,uint256,uint8)", +"e3386a98": "trustedToken()", +"e338a490": "DEVELOPER_FEE_FRAC_BOT()", +"e3393a6d": "voting(string)", +"e3396d2f": "updatePlayersCoin(address)", +"e339886c": "ADDR_WITHDRAWAL1()", +"e3399538": "ArithValue()", +"e33a9ab7": "createOffer(uint16,uint256)", +"e33b7de3": "totalReleased()", +"e33b8707": "append(uint256)", +"e33ba574": "hashSecret(bool,bytes32)", +"e33bb62a": "BRDCoin()", +"e33c7ae2": "scheduleTransaction(uint256,uint256,bytes)", +"e33c9755": "getActionIds(bool,bool,bool)", +"e33d27e4": "complete_sell_exchange(uint256)", +"e33d28d7": "vestBalanceOf(address)", +"e33dafbf": "emitters(bytes4)", +"e33e59d8": "getInsuranceContracts()", +"e33e5c5e": "getAddressUInt8(bytes32,bytes32)", +"e33f6aaf": "getOnBurnAmountValue()", +"e3407276": "bigModExp(uint256[6])", +"e340c2fb": "bidETHIncrement()", +"e340d0d6": "renewDec(uint256,uint256)", +"e3419202": "redits()", +"e341eaa4": "sign(uint256,bytes32)", +"e342c2e6": "investorWhiteList()", +"e343fea6": "contractPays()", +"e344606b": "hashtagCommission()", +"e34486f8": "isActivePoll()", +"e344ce6b": "updateWhiteLists(address[],bool[])", +"e3450e13": "lastPlayer()", +"e34514ba": "getVirtualBalance(address)", +"e345514c": "CreateTokenToTax(address,uint256)", +"e345f098": "showLastBidder()", +"e34639cb": "AllocatedCappedCrowdsale(uint256,address,address,uint256,uint256,uint256,uint256,address,address,address,address,uint256)", +"e3464b1b": "Drop()", +"e346b380": "totalPreSale()", +"e346f79e": "submitTokens(address)", +"e3470882": "markFirstSaleComplete()", +"e347a773": "shares(bytes32,bytes32)", +"e348270d": "killMePlease()", +"e3489a4f": "setII_R1(uint256)", +"e3495569": "MAX_DISCOUNT()", +"e3499381": "checkPlayerPayout(address)", +"e349c313": "addPlayerToBoard(bytes32,bytes32)", +"e349c7df": "settleUncle(bytes32,bytes32)", +"e349cb12": "change_name(string)", +"e349f108": "jokerAddress()", +"e34a90a7": "distributeBounty()", +"e34ac873": "avatarTransferState()", +"e34ad653": "EmissiveToken(address,string,uint8,string,string)", +"e34b7983": "doPremine()", +"e34c3896": "FundUpdated(uint256)", +"e34c8dbf": "distributionDate()", +"e34da795": "claimTokens4mBTC(address,uint256)", +"e34dd755": "CrowdsaleAddress()", +"e34e1700": "StarlightToken()", +"e34e32c0": "assignOwnership(address)", +"e34e5786": "test_testableStandardCampaignPayoutToBeneficiary()", +"e34e7889": "unlistDomain(string)", +"e34e7cda": "maxRoundDelta()", +"e34f2a9e": "fundingStartTimestamp()", +"e34f7137": "_performApprove(address,uint256,address)", +"e34f947d": "repairCar(bytes17,string,string,uint256)", +"e34f9dcc": "GCOXPACToken(string,string,uint8,uint256)", +"e34ffcb8": "changeMinAmount(uint256)", +"e3500b48": "setResolver()", +"e35060d9": "RequestEthereumCollect(address)", +"e350b490": "gameToWinner(uint256)", +"e3524d36": "getCurrentDiscountPercent()", +"e3528455": "burnPrimordialTokenFrom(address,uint256)", +"e3530e9c": "spendFromMultisig(bytes32,uint256,address)", +"e3539dcc": "LogReceivedETH(address,uint256,uint256)", +"e3546ac5": "isRatio()", +"e354a3f2": "freezeAccount(address,bool,string)", +"e35501be": "activate_admin_commission()", +"e3552808": "RoboToken(uint256)", +"e35568cb": "getAvailableTokens()", +"e355cd4a": "SharkPool()", +"e35694c0": "callFunction(address,address,uint256,bytes32)", +"e3577e71": "setPaymentSettings(string,string)", +"e3579ea5": "publish(string,string,address,uint256)", +"e3583870": "replaceDecomissioned(address)", +"e358b0e1": "withdrawPreICOEth()", +"e358d75a": "getFairymasterReq()", +"e3599c21": "updateGame(uint8,uint8[],uint32,uint8,uint8)", +"e359cbbb": "hasEnoughBalance(address,uint256)", +"e35b37fe": "TRANSFER_COST()", +"e35b8717": "GolixTokenDistribution(uint256,uint256,uint256,address,address,address)", +"e35b9699": "Namek()", +"e35c606b": "JiggsR()", +"e35c96d4": "NextToken(address)", +"e35ca326": "cancelOrder(uint80,bool)", +"e35d1a86": "sendFundsToOwner(address,uint256)", +"e35d3590": "AddSocialAccount(bytes32,bytes32,bytes32)", +"e35d75a9": "tokensToEthereum_3(uint256,uint256)", +"e35e6078": "tokenPerUsdDenominator()", +"e35e6e0c": "setPrice(uint16,uint16,uint8,bytes32,uint256)", +"e35f0254": "numberOfProposals(string)", +"e35f4db3": "developer_edit_text_amount(string)", +"e3602077": "withdrawInWei(address,uint256)", +"e360736e": "getHistory(string)", +"e360a49e": "latestUpdate()", +"e361112a": "isPaying()", +"e3611578": "testFooKill()", +"e36255e2": "_checkGeneralRequirements(uint256,uint8,uint8)", +"e3625dee": "REFERPAYToken()", +"e362bc9a": "confiscateDeposit()", +"e362efdc": "getTotalPayout()", +"e362f168": "CoinAdvisorPreIco(address,address,uint256,uint256)", +"e362fcaa": "Creditors(address)", +"e3637435": "supportAccount()", +"e3643106": "getLatest(uint256,uint256)", +"e364bd01": "KEOS()", +"e3650781": "setGasForGR(uint256)", +"e3651ef3": "fetchRecentSubmittals()", +"e3659e69": "CNIFCrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"e365fd7f": "setMiniPoolEdit_8(string)", +"e3661586": "confirmManager()", +"e3669d7c": "Ballot(string,bytes32[])", +"e3677664": "transferPiece(uint256,address)", +"e3685ef7": "PocketMoneyContract()", +"e3686b49": "PopeCoin(uint256,string,uint8,string,address)", +"e3688d7a": "maxNumMC()", +"e3692473": "setMockedDate(uint256)", +"e3699763": "_addAddress(address)", +"e36a0e6e": "hasPermissionFrom(address)", +"e36af50d": "betsKeys()", +"e36b0b37": "stopSale()", +"e36b9b9f": "addMemberById(uint256,address,address)", +"e36ba174": "updateMaxCapEthOnce(uint256)", +"e36c2072": "countCourses()", +"e36c3f70": "BENEFITToken(uint256,uint256,uint256,uint256,uint256)", +"e36d036c": "mintPresale(uint256,address)", +"e36d3844": "CardCreated(address,uint256,uint256,uint256)", +"e36d392c": "DeliverInfo(uint64,uint256,uint256,uint256,uint256,bytes32,uint64,bytes32)", +"e36d3a43": "SENDING_BLOCK()", +"e36db785": "creditor()", +"e36dd1f9": "withdrawalMoneyBack()", +"e36e1051": "setcardsalemoney(uint256,uint256)", +"e36e5d18": "showTopsPlayer()", +"e36f3177": "maxIssuingSupply()", +"e36f3e7c": "getAddressDescription(address)", +"e3710599": "SendTokens(string)", +"e371817e": "calculateTokenAmount(uint256,address)", +"e371c0e6": "transferPermissions(address,uint256)", +"e371cdd4": "luke(uint256,string,string)", +"e371dfdb": "allFamily(uint256,address)", +"e372d0eb": "ownersOfArea(uint256,uint256,uint256,uint256)", +"e37362ab": "NRB_Main()", +"e37426d4": "StopCrowdsale()", +"e374e8d4": "isMyWalletLocked_Receive()", +"e375dfed": "StarbaseCrowdsale(address,address)", +"e377ac31": "legal()", +"e3787c61": "TestContract(string)", +"e3788da6": "ExternalAccountsBase()", +"e378f045": "window0TokenCreationCap()", +"e37a012f": "fireEventOnTokenTransfer(address,uint256)", +"e37a7fff": "newPlayer(uint256,uint256)", +"e37aa618": "distributeValue()", +"e37aca99": "BOXICOIN()", +"e37b346d": "redistribution()", +"e37b71ce": "getFundTX(address,uint256)", +"e37bddc3": "changeEnd(uint256)", +"e37c6cf8": "redeemDisavowedTokens(address)", +"e37c8613": "balanceOfPendingToken(address)", +"e37ccac7": "getSuperseded(address)", +"e37cd202": "getBonusRate(uint256)", +"e37d46bd": "myDivs()", +"e37d4fed": "withdrawToFounders(uint256)", +"e37d883a": "NumbersToken()", +"e37e26cc": "_buyFromMarket(uint256,bool,uint256)", +"e37e60d1": "testControlRetractNotOwner()", +"e37e7d1a": "init(address,uint256[],uint256,uint8)", +"e380575a": "presaleFundsRaisedInWei()", +"e380ae96": "setNow(uint256)", +"e380b7bd": "balanceOfToken(address,uint256)", +"e38138a2": "startPurchaseTokens()", +"e3814b19": "fromUint(uint256)", +"e38180ec": "addToPayeeBalance(address,address,uint256)", +"e381a8d9": "StegoCoin()", +"e38296e4": "changeDelegate(address)", +"e382b854": "_setPackedTimestamp(bytes20,uint256)", +"e382c3e6": "getPeriodBonus()", +"e382fe45": "deathData_v4()", +"e383da38": "totalAffiliateTokensSent()", +"e3843f6e": "myLoseShare()", +"e3844a61": "isBetPossible(bool)", +"e3848e5b": "thing(string,string,string)", +"e385b43a": "DistributionNextPos()", +"e385f7d2": "SendResult(uint64,bytes18,bytes32,bytes11)", +"e3873ad7": "setDepositBankFee(uint256)", +"e3877391": "DDJETHToken()", +"e3877acd": "frozenDaysForAdvisor()", +"e38787aa": "internalBurnTokens(address,uint256)", +"e387d31a": "estateRegistry()", +"e388cbb9": "swpFundDeposit()", +"e389b63f": "transfer(address,uint256,bytes,string,uint256)", +"e38bc1f0": "timeThatFinishGuaranteedPeriod()", +"e38c35b6": "getLockedUserBalance(bytes32)", +"e38c4585": "JointICOContractAddress()", +"e38c9825": "maxgame()", +"e38cc06b": "testDiv()", +"e38d0fbd": "FirstTradingEcosystem()", +"e38d6b5c": "maxPrice()", +"e38d7e99": "_next_id()", +"e38da1a1": "storeDoi(bytes32,bytes32)", +"e38e2cfb": "step(uint16)", +"e38f4861": "initLock()", +"e38fbdf6": "addBoundary(address)", +"e38ff5dc": "updateInvestor()", +"e39062f5": "MDTKAirdrop(address,address)", +"e3906b3d": "mintNextCard()", +"e390e263": "disableWhiteListForever()", +"e3914699": "dEthereumlotteryNetWinners(address)", +"e391a7c4": "revokeSignaturePreSigned(bytes,bytes,uint256)", +"e391b3d1": "ssword(string)", +"e391bda5": "transferImpl(address,address,uint256)", +"e39253e6": "SampleToken(uint256,string,uint8,string)", +"e392a521": "indexPrice(uint8)", +"e3945eba": "planetLife(uint256,uint256,uint256)", +"e395983a": "bountyTokensBatch(address[],uint256[])", +"e39608af": "ETUToken(string,string,uint256,uint256)", +"e3961174": "tokensCreationCap()", +"e3964b8c": "ERC20Token(string,string,uint8,uint256,address)", +"e3967d6a": "currentTimeBonus()", +"e3967eed": "totalUserNumber()", +"e396bd60": "LogEscrowWeiReq(uint256)", +"e396da73": "checkProof(bytes32,bytes32[],uint256)", +"e3973b5a": "NiteshToken()", +"e397dfd1": "updatetoken(uint256,string,string,uint256)", +"e39898d1": "checkSaleValid()", +"e399331b": "coinAllocation()", +"e3994993": "addDiary(string)", +"e399cb0d": "initializeCappedFundraiser(uint256)", +"e399daab": "zoomraffleFee()", +"e39a686c": "ChainBackedOption()", +"e39b2284": "ZEONPrivateSale(address,address,address,uint256,uint256)", +"e39b40d8": "_createCard(string,uint256,address,address,bool)", +"e39bbf68": "dividedBy(uint256,uint256)", +"e39bdfab": "getCutie(uint40)", +"e39c6d80": "batchTransfer(address,uint256[],uint256[])", +"e39c742a": "_caluLocktime(uint8)", +"e39cbe80": "senderAdminAndSaleNotFinal()", +"e39d2a98": "nextCommonTTMTokenId2()", +"e39dcc21": "blah()", +"e39ebde9": "FOLIToken()", +"e39fa059": "queryRandomCallback(bytes32,string,bytes)", +"e39fbd88": "tokensDispensed()", +"e39fff72": "Divs()", +"e3a0a148": "giveOwnership(address)", +"e3a0de36": "admin(string,string,string,string)", +"e3a12480": "getBalance(uint8)", +"e3a135b9": "_bid(uint256,uint256,uint256,uint256,address)", +"e3a199d6": "testThrowCreateNewRevisionNotUpdatable()", +"e3a2a327": "SmartCityCrowdsale(address,address,address,uint256)", +"e3a37ea2": "newIndex(bytes32)", +"e3a47b00": "standing()", +"e3a531a3": "setSaleAuctionContractAddress(address)", +"e3a5f6f8": "_receiveToken(address,address,uint256)", +"e3a70ec1": "max_goal_amount()", +"e3a71e32": "deliverBonusTokens(address[])", +"e3a75485": "TORUE()", +"e3a797f1": "getCandidateMemberInfo(uint256)", +"e3a79840": "finishPresale(uint256,uint256)", +"e3a7f45a": "ecrecoverWrapper(bytes32,uint8,bytes32,bytes32)", +"e3a83290": "SALE_address()", +"e3a861a4": "setCrydrView(address,string)", +"e3a87f8b": "secondPrivateReleaseTime()", +"e3a8b13a": "core(uint256,uint256,address,uint256,string,uint256)", +"e3a8b345": "emptyContract()", +"e3a8e29c": "addBorrower(address)", +"e3a8e50b": "Subscription(bytes,address,bytes)", +"e3a94e9f": "addPacksToStandardSale(uint32[])", +"e3a96cbd": "getDispute(uint256)", +"e3a9744b": "mintTokens(int256,uint256,address,bool)", +"e3a97893": "secondPresaleEnd()", +"e3a99d2b": "updata(uint256,uint256)", +"e3a9b508": "EnableDisableTokenProxy()", +"e3a9db1a": "depositsOf(address)", +"e3aa018e": "setRank(address,uint256)", +"e3aa3c6e": "initialBonuslistTokens()", +"e3aa3fbb": "startEscrow(string,uint256,uint64)", +"e3aa62b1": "responsavel()", +"e3aae11b": "isStartGame()", +"e3ab8492": "requestGWAPrice(string)", +"e3abeaf3": "setAllowedTransferTo(address,bool)", +"e3ac3880": "backupfarmItems(address[],uint256[])", +"e3ac5d26": "prize()", +"e3ac8e16": "setFinalizationTime(uint256)", +"e3acc49a": "catIndexToPriceException(uint256)", +"e3adf4ea": "ChangeICOEnd(uint256)", +"e3ae1667": "commRate()", +"e3ae85f0": "winReward()", +"e3aec30c": "ballotStarted()", +"e3aeedc4": "lastMintedTokens()", +"e3aef2bd": "checkUnlockedTokensData()", +"e3af2ed9": "TWToken()", +"e3b0073e": "getVoteCounter(uint256,uint256)", +"e3b08f56": "concatYearMonth(uint16,uint8)", +"e3b09a85": "HungrCoin()", +"e3b10447": "GITToken()", +"e3b2594f": "fundingCap()", +"e3b26a8c": "SocialNetwork()", +"e3b3847c": "SubmitProofOfOwnership(bytes32)", +"e3b3932a": "bookKeeper()", +"e3b45ab7": "MIN_TOKEN_AMOUNT()", +"e3b460c9": "hookOperator()", +"e3b49a03": "rollSystem(uint256)", +"e3b55276": "AdminBuyForSomeone(uint16,address)", +"e3b5a153": "lastEpochTX()", +"e3b6040e": "amountSlicesCount()", +"e3b61135": "reinvestProfit()", +"e3b62158": "TokenVault(address)", +"e3b71ded": "setMaxContributionCrowdsaleAddress(address)", +"e3b7b668": "_setMaxDailyPerUser(uint256)", +"e3ba3398": "importTokens(address)", +"e3ba80d0": "purchaseImpl(uint16,uint64,address)", +"e3bab7ce": "buildInternalSalt(uint128,address,address,address,uint256,uint64)", +"e3bb01ac": "viewCancelledList(address)", +"e3bb3445": "releaseSupply(uint256,uint256)", +"e3bbab85": "test_smallDeviationPermitted()", +"e3bbb4f1": "MAX_GAS_PRICE()", +"e3bc2bb5": "newPassword(string,uint256)", +"e3bd9638": "getContract(address,address,uint256)", +"e3bea282": "callnotchecked()", +"e3bfdcfe": "pollBurnInc()", +"e3c04c32": "getNota(uint256)", +"e3c08adf": "getPlayerLAff(uint256)", +"e3c10714": "setMinContrib(uint256)", +"e3c2e4b9": "_setCreatedBlockOnCommitsPhase(uint256,address,bool)", +"e3c33a9b": "hasRole(string)", +"e3c3b200": "proposeWithFeeRecipient(address,address,bytes)", +"e3c3ec92": "BONUS_REWARD()", +"e3c3f180": "_setPurchasePremiumRate(uint128)", +"e3c4b1ae": "minSumICOStage2USD()", +"e3c517a9": "lockFlag()", +"e3c5862b": "setCAO(uint256,uint256,uint256,uint256,uint256,uint256)", +"e3c5a852": "buyTickets(uint256[],uint256,uint256)", +"e3c5d11a": "MIN_BUY_TOKENS()", +"e3c6e66d": "discountedIcoStartBlock()", +"e3c73d32": "minimumPriceCount()", +"e3c79a20": "enterOnBehalfOf(uint256[],uint256,address)", +"e3c82106": "becomeDuke(string,string)", +"e3ca12c6": "sendtoB(uint256)", +"e3cafbb0": "TOKEN_EARLYSUPPORTERS()", +"e3cb0cf0": "maxTransferPerTimeframe()", +"e3cb49f9": "setBlockingState(address,uint256,uint256)", +"e3cb8563": "playToken()", +"e3cbe744": "updatePlayersCoinByOut(address)", +"e3cc3570": "mintMigrationTokens(int256,address,uint256)", +"e3cc65e2": "getInvestorsLength()", +"e3cc83cf": "withdrawWhenFinished(address)", +"e3ccb809": "voteOnProposal(bool)", +"e3cd30f6": "getBuilding(uint8[176],uint8,uint8)", +"e3cd7c03": "getPass(address)", +"e3ce9714": "proxyWithdraw(address,uint256,uint8,bytes32,bytes32)", +"e3ceb06d": "YesNo(bytes32,address,string,address,uint256)", +"e3cee57b": "calLast5RoundProfitForRead(uint256)", +"e3cf1ad3": "changeRegistrationStatus(address,uint256)", +"e3cf6644": "sendKmPards()", +"e3cfef60": "timeRemaining()", +"e3cff634": "test(uint32)", +"e3d021d5": "purchaseTicket(uint16[])", +"e3d0252b": "defaultTriggerTime()", +"e3d0799c": "PLATFORM_FEE_PER_10000()", +"e3d0be5c": "EARLY_INV_BONUS()", +"e3d1072c": "Giveafuck()", +"e3d13592": "newTechSupport()", +"e3d1afd4": "TestToken(uint256,string,string,address)", +"e3d1e6d6": "hasProof(bytes32)", +"e3d2a98c": "setCurrentFundingGoal(uint256)", +"e3d2c1bf": "presaleTokensPerDollar()", +"e3d33fc9": "transferCount()", +"e3d36a98": "Credit(address)", +"e3d3f4cd": "bidGift(uint256,address)", +"e3d4187f": "Buy(address,uint256)", +"e3d51a0f": "repayBorrowInternal(uint256)", +"e3d5d88b": "getServerBuildingName(uint256,uint8,uint8)", +"e3d5e6a3": "year2Unlock()", +"e3d670d7": "balance(address)", +"e3d6ce2b": "addFiatTransaction(string,int256)", +"e3d6e4a3": "setFundsCreditBitContract(address)", +"e3d74457": "releaseTimeFirst()", +"e3d7f159": "FIRST_TIER_DISCOUNT()", +"e3d86998": "declareNewerVersion()", +"e3d91ebf": "bonusPoolsOf(address)", +"e3d9e8ea": "drawnArbiter(address,uint256)", +"e3da41b5": "sortWinningNumbers(uint8[5])", +"e3da5399": "left90(uint256)", +"e3da9f8f": "tranchesOf(address)", +"e3dac959": "makeTapTop()", +"e3db17b8": "updateContract(address)", +"e3db6670": "isHardCapTokensReached()", +"e3dbaff1": "tokensSpent()", +"e3dbda67": "setArtistsControlAddress(uint256,address,address)", +"e3dcd2c8": "maxPaymentInEther()", +"e3dd164e": "setNewTokenImporter(address)", +"e3de18b2": "withdrawMyClosedDeposits()", +"e3dea4b7": "setMcrAmountForGas(uint256)", +"e3debbbe": "getSubscriptionServiceID(bytes32)", +"e3e06c45": "PayPayCoin()", +"e3e10762": "calculateIdeaBuySimple(uint256)", +"e3e1dcb3": "getRouteNameByIndex(uint256)", +"e3e2342f": "callTokenHolderTribunal(string)", +"e3e28bab": "setTimes(uint256[],uint256[])", +"e3e2b1ba": "add_number(uint256)", +"e3e4001b": "buyWithReward(address)", +"e3e42b0c": "ZenAD()", +"e3e4a1b4": "burnUserTokens(uint256)", +"e3e4b9fb": "claimJob(uint256)", +"e3e5075c": "depositBattleValue(address)", +"e3e532a2": "setInstantToken(address)", +"e3e5439c": "specDWallet()", +"e3e54ac2": "CarDeregistrationFaled(uint256)", +"e3e5c9c1": "WhiteListBonusTokensEmitted(address,uint256)", +"e3e7399e": "addWinner(address,bytes4,uint256)", +"e3e7519c": "getTokenPriceforDapp()", +"e3e77055": "MultipleTokenVesting(uint256,uint256,uint256,address,uint256)", +"e3e7903f": "updateScore(address)", +"e3e7b439": "cryptoWillToken()", +"e3e7c665": "makeMoney()", +"e3e7d4f4": "leaderboardEntries(uint256)", +"e3e88734": "SigUser(address)", +"e3e9800d": "_cancelSellOfferInternal(uint32,bool)", +"e3e98cad": "COSSToken()", +"e3e9bc3f": "becomeSponsor()", +"e3e9cb4c": "Birth(address,uint256)", +"e3ea6496": "newCarProductID()", +"e3ea67d4": "STARTING_TURTLES()", +"e3eba060": "allowedToSpend(address,address)", +"e3ec0251": "subtraction()", +"e3ec0666": "clearJackpotParticipants()", +"e3ec5046": "DECIMALCOUNT()", +"e3ec7584": "showTokensUnfreezeDate(address)", +"e3ecbd7e": "isEditionEnabled(uint256)", +"e3ed14db": "getDiamond(uint256)", +"e3ed48a4": "getTokenScope(uint256)", +"e3edbfd3": "getAmountDue(address)", +"e3f037d8": "FlightDelayUnderwrite(address)", +"e3f0920a": "coinMaster()", +"e3f0b761": "walletF()", +"e3f0dd48": "getMult(bytes32,bytes32,uint256)", +"e3f10188": "updateFlagCount(address,address,uint256)", +"e3f16a61": "GRPlaceholder(address,address)", +"e3f25f01": "_delegateforward(address)", +"e3f2e4a4": "ante()", +"e3f310c7": "priceToSpend(uint256)", +"e3f38dd6": "GetSignVersion(string,address,uint256)", +"e3f4937f": "outOverRoundId()", +"e3f4ffdc": "GeezerToken()", +"e3f5009f": "payWithMileagePoint(uint256)", +"e3f508f5": "setLeaf(uint256,uint256)", +"e3f52c99": "warrior()", +"e3f563f6": "generateCompoundTerms(uint256)", +"e3f596a4": "ownerPrice()", +"e3f61948": "getStartIndex(uint64)", +"e3f688d3": "ThingschainToken(address)", +"e3f6b544": "member()", +"e3f7faaf": "calculatePrice(uint256,uint16)", +"e3f954be": "buyICOTokens()", +"e3f96400": "getTotalOwnerAccounts()", +"e3f9ba0e": "returnEth()", +"e3f9cd17": "lockTokenForExchange(address)", +"e3fa5882": "tryWithdraw(uint256)", +"e3fc03a8": "Guess(address,uint256,int256,int256,uint256)", +"e3fc43b2": "ended(bool)", +"e3fcbac1": "getSharesPercentage(address)", +"e3fcf122": "_sctc(uint256,uint256,uint256,uint256,address)", +"e3fe0317": "_setAllocationFee(bytes32,uint256)", +"e3fe48a1": "loadWhiteList(address[],bytes32[])", +"e3fe6a9e": "sehrRaised()", +"e3fe9740": "icoThresholdReached()", +"e3ff2f05": "weiExchangeRate()", +"e3ff9ac2": "MACHToken()", +"e3ffc9a3": "sendEtherToOwner()", +"e3ffcb84": "loserOf(uint256,uint256)", +"e3ffefe3": "ZeroReturnProfit()", +"e4002b30": "commitEuro()", +"e4007949": "buyRegistration()", +"e4019e07": "BOB()", +"e40205d6": "roundEndTime()", +"e4020804": "isHealthy()", +"e4024194": "returnedData()", +"e4027126": "mSumRawSpeed()", +"e40418a0": "trustedContractAddr()", +"e4043b37": "updateProduct(uint256,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"e4048049": "createBool(bytes32,bool)", +"e4062df5": "SkychainToken()", +"e4063140": "getAllActivity(uint256)", +"e40652e3": "creatUserPurchase(address,string)", +"e4065c4c": "Alias()", +"e406bb4b": "minedTokenCount()", +"e407ccb9": "Repayment(uint256)", +"e40819af": "lastTokenCreated()", +"e4083daf": "create_game_invite(bytes32,address,uint32,uint32,uint8,uint16,uint8,address,uint256)", +"e408de80": "buyInWithAllBalanced()", +"e40906ed": "getBorrowBasicInfo(uint256)", +"e4098655": "getCallCalledAtBlock(bytes32)", +"e409edf1": "chooseWinnerDeadline()", +"e40a72d4": "_internalToken()", +"e40a7545": "collectBuyFee(uint256,address)", +"e40a955c": "grantTeamTokens(address)", +"e40b4523": "activateVault(address,uint256,uint256,uint256,uint256)", +"e40c231e": "StoneToken()", +"e40cc359": "getListParamsUnOrdered(uint256)", +"e40d3692": "contributedAmountOf(address)", +"e40d835e": "getPositionIdFromNonce(uint256)", +"e40d8fc3": "addICOEndDate(uint256)", +"e40dd35b": "isGameApproved(address)", +"e40e56d3": "regular_coins()", +"e40e8457": "requestBurnerContract()", +"e4105ed5": "setToken(uint8,address)", +"e4109df8": "MAGTOKEN()", +"e410a0c6": "setup(address,uint16)", +"e4115a8c": "ApcrdaZebichain()", +"e4120220": "getTokenTrust(address)", +"e412828a": "Shark()", +"e412c526": "set_pre_kyc_bonus_numerator(address,uint256)", +"e415f4ee": "_addDai(uint256,address)", +"e4160e48": "admin_active_withdrawable()", +"e4165e15": "ownerDeactivateToken()", +"e416d173": "PreICO(uint256,uint256,address,address,uint256)", +"e416f6b4": "_startRound()", +"e416faa0": "getBetNum()", +"e4171746": "major_partner_address()", +"e417291b": "undelegateDAOTokens(uint256)", +"e41763f2": "setTokenFeeDeposit(address,uint256)", +"e41765de": "addBotAddress(address)", +"e417c38c": "Reward(address,uint256,uint256,uint256)", +"e417c62c": "ProofFund(address)", +"e4187d02": "multiplyDecimal(uint256,uint256)", +"e418f592": "receiveToken(address,uint256,bytes)", +"e419f189": "multiAccessIsOwner(address)", +"e41adb25": "PoolPreICO()", +"e41b1d28": "noAccountedWithdraw()", +"e41c02c9": "determineFirstPeriodOutcome(uint256)", +"e41cc093": "getItemStore(bytes12)", +"e41d0944": "acceptDonate()", +"e41d65e0": "payWinnerManually()", +"e41eaa41": "fakeNow()", +"e41ee46a": "MAX_QUANTITY()", +"e41f7dc1": "ethPriceProvider()", +"e41fb842": "comunityMintedTokens()", +"e420264a": "g(uint256)", +"e420a904": "FirstToken()", +"e420dcc5": "tokenDrian()", +"e4218416": "redemptionPayouts(uint256)", +"e422d6b8": "createRareCard(uint256,uint256,uint256)", +"e422ebe9": "getBot()", +"e422f311": "secondWeekEndTime()", +"e422f699": "toBE(uint256)", +"e4232069": "MAX_INPUT_USERS_COUNT()", +"e4246ad2": "canContractExchange(address)", +"e4246ba0": "setPaymentContract(uint8,address)", +"e424ddbd": "allocateFoundersTokens(uint256)", +"e4251361": "getTodayInvestment()", +"e4254585": "MFNToken()", +"e4274453": "PUBLIC_CROWDSALE_SOFT_CAP()", +"e4277f78": "backToOldOwner()", +"e427a197": "previousMinters(address)", +"e428ad8a": "ReferralReward(uint256)", +"e428fd5f": "takeBackMoney()", +"e42996d1": "redeemCoinsToICO(uint256)", +"e429bd8b": "getUsableAmount(address,address)", +"e429cef1": "addAuditor(address)", +"e42a4556": "KKTokenNew()", +"e42a8bc9": "dAddBallot(bytes32,uint256,uint256)", +"e42a9156": "AppleproToken()", +"e42a96e7": "escrowContract()", +"e42b0193": "test_insert_findWithHintNextIncreased(int256)", +"e42bb93f": "StarUniteChain(uint256,string,uint8,string)", +"e42bff66": "mintBadge(address,uint256)", +"e42c04f4": "Cryptshopper()", +"e42c08f2": "tokenBalanceOf(address)", +"e42c1337": "getSalary(string)", +"e42c1b76": "BountyActivated(uint256,address)", +"e42cb9f3": "statement()", +"e42d5be0": "getPaymentOf(address)", +"e42d674d": "refundIco()", +"e42d6efa": "unregisterUsers(address[])", +"e42d70ba": "safeAddCheck(uint256,uint256)", +"e42def21": "CryptoHill()", +"e42f4cc0": "addPersonalInfo(address,string,string,string,string,string,string,string)", +"e4309307": "fortifyClaims(uint16[],uint256,bool)", +"e430bb5b": "getFreeCoins()", +"e4310205": "addMastercardUser(address)", +"e431af36": "_addMember(address,uint256)", +"e431d241": "validateAndRegisterClaim(address,bytes32,uint8,bytes32,bytes32)", +"e4322464": "MatchBettingFactory(address)", +"e43252d7": "addToWhitelist(address)", +"e432f0e5": "queryOracle(string)", +"e4330545": "dump()", +"e433bb3a": "HAVY()", +"e4340e6a": "Wallet5()", +"e435f2c9": "takeOwnershipMultiple(uint256[])", +"e4360fc8": "getFileListElement(bytes)", +"e43650b6": "changeILFManager(address,bytes32)", +"e436a3f7": "getRoot2_16(uint256)", +"e436bdf3": "Draws(uint256)", +"e4372d0f": "setRestrictedAcct(address,uint256)", +"e437d1a7": "unRedeem(uint256)", +"e437d815": "getDsitributeMulti(address[],uint256[])", +"e438ff55": "changeINAWallet(address)", +"e43926fb": "refundTokenToCustomer(address,uint256)", +"e439501e": "AntmineToken()", +"e4397db1": "getBetsState()", +"e43a0bb2": "pullFunds()", +"e43a8897": "DonatedBanner()", +"e43aa5ff": "Medban()", +"e43ac447": "DirectConnectionFactory()", +"e43ae642": "deleteDIDHolderWhenBalanceZero(address)", +"e43b72b4": "discountedInvestors(address)", +"e43ba0bd": "isStrategy(bytes15)", +"e43bb0f6": "link(uint256,address,address)", +"e43bc1e9": "functionName3(bytes32)", +"e43c74a4": "BRoyalCoin()", +"e43cd900": "PoolBounty()", +"e43d68ce": "GetBanker(uint8)", +"e43dfebf": "burningTokens()", +"e43f696e": "setWhiteList(address[],bool)", +"e43f8424": "burnGoldTokens(address,uint256)", +"e4403507": "tokenContractBalance()", +"e4415d98": "investorDividends(address,address)", +"e44171b1": "Arina_amount_judgment(uint8,uint256)", +"e4424c9e": "createNew(bytes32,address)", +"e443253a": "DataFromSetting(uint8)", +"e443348e": "ONE_TOKEN()", +"e4440a86": "marketWallet()", +"e4444feb": "removeAllowedAddress(address,address)", +"e444504c": "nextClaim()", +"e44451ba": "removeAddressFromAdminlist(address)", +"e444a2e1": "_birthPerson(string,string,uint64,bool,bool)", +"e44501c4": "inactive_dividend(address)", +"e4454fdc": "GetMaxStageEthAmount()", +"e44591f0": "isNonFungible(uint256)", +"e4480dd8": "withdrawl(uint256)", +"e448ee26": "joinChallenge(uint256)", +"e4492fcd": "TokensPerETH()", +"e4495b15": "confirmSetIssuer()", +"e449c52a": "getStr(string)", +"e449de9f": "prevContract()", +"e44a94d3": "minContributionPresale()", +"e44ac1e4": "addLock(address[])", +"e44b974f": "placeBet(uint8,uint256,uint256,uint8,bytes32,bytes32)", +"e44bc43f": "stepOneRate()", +"e44c333a": "DreamTeam()", +"e44c96c9": "addInitialOwners(address[])", +"e44caea6": "balances3(uint256)", +"e44d3084": "testFailure()", +"e44d311b": "ticketPrices(uint256)", +"e44d6f04": "beatTeamWallet()", +"e44dbb75": "addAddressListItem(uint256,address)", +"e44ddaf5": "healthAndMana(uint256)", +"e44de421": "buyTokenFrom(address,address,uint256)", +"e44f777c": "returnETHforUnqualifiedBuyers(uint256,uint256)", +"e450056c": "tokenPartition(uint256)", +"e4503da4": "startPhaseMaximumcontribution()", +"e4504f62": "dogCore()", +"e451197a": "OrdoCoin()", +"e451ecfa": "swapTokenValueForCredits(address,address,uint256,address,string,uint256,uint8,address)", +"e45285cf": "setAIRDROPBounce(uint256)", +"e4536316": "removeARA(address)", +"e4536b84": "BalanceReader()", +"e453877e": "_approveTransfer(uint256)", +"e4538c6c": "addUndergraduateTo(address,string,string,string,uint8,uint8,uint8,uint8,uint8,uint8,uint32,uint32)", +"e454158c": "futureSaleAllocation()", +"e4543410": "setIncrementPercentage(uint256)", +"e4547443": "releaseTimeLock(address,uint256)", +"e4547f98": "documentExists(bytes)", +"e45499c1": "updatePriceOfToken(uint256)", +"e4556549": "get_session_balance(address,uint32,uint32)", +"e4556f2d": "MaturityPrice(uint256,uint32,bool,bool,bool)", +"e455d26c": "getCurrentNeedsCount()", +"e455fce7": "extractOversightAddressesIndexLength()", +"e4560388": "endTimeMain()", +"e45648ac": "exchangeOldVersion()", +"e4564a4a": "returnAddressBonuses()", +"e4569c4e": "eeeeeeeeeeee()", +"e4578590": "SplitPaymentMock(address[],uint256[])", +"e457deda": "FindSlug()", +"e457e1e5": "charge(uint256)", +"e458c754": "whitelists(uint8,address)", +"e45a4fb4": "isMultipleOf(uint256,uint256)", +"e45a93cc": "GIT()", +"e45aa608": "tokensForfortis()", +"e45ab391": "Technology5G(address)", +"e45b1d1b": "openClosedToken()", +"e45b7388": "subscribers_TO_HATCH_1CraigGrant()", +"e45b8134": "transfersFrozen()", +"e45bc0ae": "dollcoin()", +"e45be8eb": "minPrice()", +"e45bf7a6": "forwardTo()", +"e45c1879": "getAuctionsCount()", +"e45c210c": "LogFunderInitialized(address,string,uint256)", +"e45c47b9": "SetPermissionsList(address,address,uint8)", +"e45ce7e3": "refillTxFeeMinimum()", +"e45ceec1": "getUnreadMessages(address)", +"e45d0550": "getAddressArray(address,string,string)", +"e45d4717": "withdrawLogic(bytes32,uint256,uint256,uint256[])", +"e45da0be": "freezeAddress()", +"e45dbabd": "addAddressesToWhitelist(uint256,address[])", +"e45ebe93": "checkVoteStatus()", +"e45ef4ad": "bobClaimsPayment(bytes32,uint256,address,address,bytes20)", +"e45fc71f": "getPeriodCycle(uint256)", +"e460382c": "importBalanceBatch(address[])", +"e4614066": "MelonToken(address,address,uint256,uint256)", +"e46164c5": "waitingForPayout()", +"e4626c8f": "like(address,uint256)", +"e462c888": "createEscrowByBuyer(address,uint256)", +"e463b659": "EtownCoinTest(uint256,string,uint8,string)", +"e463fa6b": "AddWhitelist(address)", +"e464dcc8": "userHasLuckyStone(address)", +"e4651465": "addEthTeller(address,uint256)", +"e46523f2": "_isNeighbor(uint8,uint8)", +"e46537ba": "JJCOIN()", +"e465c465": "like(address)", +"e46617b6": "releaseMultiAccounts(address[],address)", +"e4662939": "CLBToken()", +"e46638e6": "canTransfer(address,address,uint256)", +"e46694e8": "lastStakePriceUSCents()", +"e46751e3": "exp(int256)", +"e467f7e0": "mint(address[],uint256[])", +"e4682f00": "cancelSpendLimit(uint256)", +"e4683a79": "refund(bytes32,bytes32)", +"e4684d8f": "AXNETToken()", +"e468688e": "addTotalSupply(uint256)", +"e46871f1": "governingLaw()", +"e468cb72": "FUTM()", +"e468dc16": "Testokenmaking()", +"e4690a0b": "popRequest()", +"e469185a": "updateReserveRatio(uint8)", +"e4693e98": "endFundingTime()", +"e4698ee7": "start5Phase2020()", +"e46a5c21": "getArmyBattles(uint256)", +"e46c2cc4": "bytarr28(bytes28[])", +"e46d1939": "napoleonXAdministrator()", +"e46d6cb1": "canChangeRecoveryAddress(uint256)", +"e46da1b9": "MeiJiuToken(uint256,string,uint8,string)", +"e46dcfeb": "initWallet(address[],uint256,uint256)", +"e46dea92": "BlockChainPay()", +"e46f20dc": "getTransferHash(address,uint256,address,address,uint256,uint256)", +"e46f9ecf": "enableCodeExport()", +"e46fbe76": "burnSomeEther()", +"e46feb2c": "orgy1f(string,string)", +"e4706e3a": "TokenRateChange(uint256)", +"e470ddf8": "totalKittiesBurned()", +"e47112bd": "sendTokens()", +"e471a5b9": "putIntoPackage(uint256,uint256,address)", +"e471d770": "StopTheFakesPromo()", +"e472311b": "handleHTLCUpdateTx(address,bytes32,bytes32)", +"e4723828": "TestMath()", +"e4725ba1": "accept(bytes32)", +"e4745970": "transfer(uint256,address,string)", +"e474777e": "applyForCertification(string,string,bool,string,address,string,string)", +"e474f97a": "setPreicoAddress(address,uint256)", +"e4752159": "DigitusToken()", +"e475222e": "activeGames()", +"e476137b": "windUp()", +"e476af5c": "revokeAttributeSigned(address,uint8,bytes32,bytes32,bytes32,bytes)", +"e476cb86": "_mintTokens(address,uint256)", +"e4772ae3": "getDailyCount(address)", +"e4779d73": "register_user(address)", +"e4788384": "CancelAuction(address,uint256,uint256,uint256,uint64,uint256,address)", +"e478b578": "ProofofConcept()", +"e47a192e": "FactomIssued()", +"e47a6a9f": "disbursementPeriod()", +"e47bc32b": "ShanHuCoin()", +"e47c0c20": "GetCityData(address)", +"e47c5902": "ecverify(bytes32,bytes)", +"e47c66ca": "removePanelist(address,address)", +"e47ca4eb": "LogNewAnswer(bytes32,bytes32,bytes32,address,uint256,uint256,bool)", +"e47cb18f": "PointToken(uint256,string,string,uint256)", +"e47d8085": "isCurrentUser(address)", +"e47d914a": "fechVoteInfoForVoter()", +"e47da59e": "consumeTicket(address,string,uint256)", +"e47dace5": "totalLenderBalance()", +"e47dea1d": "setWithdraw(address)", +"e47e1c0b": "getAssetIds()", +"e47e7e66": "ask(uint256)", +"e47ea649": "isICOfinalized()", +"e47f0d64": "list_products()", +"e47f18d0": "CryptoTorchToken()", +"e47ffb64": "setSoft_Cap(uint256)", +"e480ba6a": "isDailySettlementOnGoing()", +"e4818a5d": "totalUnreleasedTokens()", +"e4818e4b": "secondPeriod()", +"e481c884": "ACFWallet()", +"e481ebf0": "getOwnedActiveEntry(uint256)", +"e48225ce": "startStakingAt(uint256)", +"e4828367": "buyEther(uint256)", +"e48341db": "getUpdateCount(bytes32)", +"e4845c2f": "Sperm()", +"e4849b32": "sell(uint256)", +"e4852b9b": "transferAccount(address)", +"e4860339": "tokens(address)", +"e486387a": "ReferenceToken(string,string,uint256)", +"e486869b": "setstoredaddress(address,address)", +"e487624b": "EarnedGNS(address,uint256)", +"e487c88b": "CROWDSALE_UNVERIFIED_USER_CAP()", +"e487e87b": "activateICOStatus()", +"e487eb58": "getOwner(bytes20)", +"e487fdb6": "participant1SentTokensCount()", +"e4881813": "cat()", +"e489c5ff": "haltIco()", +"e489d510": "MAX_TOKEN_SUPPLY()", +"e489fc68": "NdexSupply()", +"e48a1d60": "assertPaymentIndexInRange(uint256)", +"e48a4a29": "mayjaKill()", +"e48c09fe": "getFiltersLength()", +"e48c3c5c": "lockInDays()", +"e48cf65f": "_setClassViewValue2(uint256)", +"e48d81a8": "multisigwallet()", +"e48db5d4": "ProofVote(address)", +"e48e0d69": "ownerRetrieveTokenDetails()", +"e48e603f": "right54(uint256)", +"e49013b3": "jigoutuihuan(address,uint256)", +"e490c513": "getEntityState(bytes32)", +"e49168f3": "whichEpoch(uint256)", +"e4917fd2": "provenAddresseList(address[],bool)", +"e491936f": "getDisputeTX(uint256)", +"e49280cb": "close(address,uint256)", +"e492814f": "play(address)", +"e4928550": "daylimit()", +"e4929aa4": "FCC(address)", +"e4932abe": "INC()", +"e493ef8c": "Q()", +"e4942930": "SetMinLot(uint256)", +"e4952ddb": "transferDataOwnership(address)", +"e495f08e": "getHouseInfo(bytes32)", +"e495faf4": "bonusesPayed()", +"e496f510": "oraclize_query(uint256,string,bytes[3],uint256)", +"e497718e": "receiveLoan(address)", +"e497e88e": "XDCE()", +"e4983e27": "HEOContract()", +"e498922f": "getExp(uint256)", +"e498b98f": "setRedeemRequestLimit(uint256)", +"e498f5de": "FrozenFunds(address,bool,uint256)", +"e4995a1d": "ProdTokensale()", +"e4997dc5": "removeBlackList(address)", +"e4998173": "blockHalving(uint256)", +"e499f542": "distribute_reward(uint256,uint256)", +"e49b4c64": "ownerModAdmin(address,bool)", +"e49b606c": "claimWinnings(bytes32)", +"e49c9529": "underwrite(uint256,uint256[6],bytes)", +"e49cb2fb": "withdrawERC20Tokens(address,uint256)", +"e49cc6a9": "getUserBalancesLastBet()", +"e49dcee9": "fixTokens()", +"e49f6e91": "editContact(address,string)", +"e49fdaa8": "setClaimLimit(address,address,uint256)", +"e4a008a0": "cancelEthOffer()", +"e4a05c1f": "_nibblesToTraverse(bytes,bytes,uint256)", +"e4a0c124": "QCSTToken()", +"e4a0d386": "ethToBeClaimed()", +"e4a13fa4": "getICOAddress(uint8)", +"e4a1d868": "deposit_token(address,uint256)", +"e4a27ba0": "_play()", +"e4a2a8af": "getOwnerClientDetails()", +"e4a2ac62": "getCompactData(address)", +"e4a2c6d6": "loadProfit()", +"e4a30116": "initialize(uint256,uint256)", +"e4a30200": "BRV(uint256,string,string)", +"e4a358d7": "getPrefix(uint32)", +"e4a36a77": "getBondRemainingToBePaidOut()", +"e4a41c7f": "becomeFriendsWithMe()", +"e4a46a99": "howManyEthersToBecomeOwner()", +"e4a682d8": "InvestorToken()", +"e4a6e85a": "CoinStorage()", +"e4a72b13": "bZxContractAddress()", +"e4a77d29": "setInitialVaribles(uint256,uint256,uint256,address,address,address)", +"e4a7f363": "NewSymbol(string,uint8)", +"e4a86349": "getSubscribersCount()", +"e4a8de44": "quater1()", +"e4a9b286": "getVestingDuration(address,address)", +"e4aa0741": "AmericoTokenToken()", +"e4aa2436": "SouthAfricanRandsToken()", +"e4aa533e": "guess(bytes32)", +"e4aa6c5c": "MHCBC()", +"e4aa8140": "MAX_WEI()", +"e4aa82d7": "test_addAndGetVersion()", +"e4aa8da9": "checkReceiptProof(bytes,uint256,bytes,bytes)", +"e4abae32": "respond(uint256,address,address,bool,bool)", +"e4abf00e": "UnFrozenAddress(address)", +"e4ac3206": "withdrawIQT(uint256)", +"e4acecf3": "SALE0_END()", +"e4ad9a18": "takeTokens(address,uint256)", +"e4ada9fa": "setFeeForFirstArtWorkChangeRequest(uint256)", +"e4adc325": "UBS()", +"e4adc4f0": "ownerTransferWeiThirdWallet(uint256)", +"e4ae2e88": "enableEdition(uint256)", +"e4ae7d77": "getResolver(string)", +"e4af29fc": "accountCount()", +"e4af5f30": "getMinMaxBet()", +"e4af8331": "func_02E5()", +"e4b0a97b": "test_doubleVotingAgainst()", +"e4b0d3e6": "preRelayedCall(address,address,bytes,uint256)", +"e4b1443b": "KIK_ADDRESS()", +"e4b19e98": "amountRefunded()", +"e4b1e977": "hadd(uint128,uint128)", +"e4b1f93a": "isValidPurchase(uint256,uint256)", +"e4b1fe54": "totalGas()", +"e4b203ef": "sealed()", +"e4b34274": "round4StartTime()", +"e4b3c517": "crowdsaleContinue()", +"e4b42498": "AfrFballCoinXToken()", +"e4b503ec": "MinAmountByBetChanged(uint256)", +"e4b50cb8": "getToken(uint256)", +"e4b50ee8": "setRaiseRatio(uint256)", +"e4b541f3": "currentDevFees()", +"e4b5553c": "AddPromoter(address)", +"e4b5762a": "setPriceFeed(uint256,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"e4b5ddeb": "addInvestorAtID(uint8)", +"e4b5e557": "CPWAToken()", +"e4b64da9": "sellOrders(address)", +"e4b6ac4c": "bonus2StartETH()", +"e4b6f799": "withdrawDai()", +"e4b6fbe2": "getApproveSpenderValue()", +"e4b73ac9": "foundersWallet3()", +"e4b74590": "distance(uint256,uint256,uint256)", +"e4b7b1b0": "Payroll(address,address)", +"e4b7fb73": "getRemainingSupply()", +"e4b8ebb7": "powercoin()", +"e4b90ed2": "reclaimInternal(address)", +"e4ba3969": "supportRecord(uint256)", +"e4bb7160": "adjustInflationRate()", +"e4bbb4b0": "POLY()", +"e4bc01b4": "FooMintableToken()", +"e4bd6695": "create(string,string,uint8,address,uint256)", +"e4bd9ebd": "calcId(uint256)", +"e4bdaa61": "buy(uint16,address)", +"e4be5159": "queryChild()", +"e4be782a": "createSecurityToken(string,string,uint256,uint8,address,uint256,address,uint256,uint8,uint256,uint8)", +"e4bf56b8": "getPastGamesLength()", +"e4bf6195": "changeGroupInfo(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"e4bff515": "_pointToResolverAndResolve(int256,bytes32,address)", +"e4c01bbb": "LogSetSymbol(string)", +"e4c05a7d": "checkEngineerQuest(address)", +"e4c0aaf4": "changeGovernor(address)", +"e4c14a34": "Tx(address,address,uint256,string)", +"e4c19408": "startPreIco(uint256,uint256)", +"e4c21cf2": "CheckSoftCap()", +"e4c28308": "buyPortfolio(address,uint256,uint256)", +"e4c2db06": "getPreviousFile(bytes)", +"e4c487c9": "Betsicbo()", +"e4c53f04": "setCreationCurator(address)", +"e4c5ff46": "manualMint(address,uint256)", +"e4c60492": "RANGESTART_8()", +"e4c82881": "change_tokenReward(uint256)", +"e4c92731": "FAST()", +"e4ca784b": "isPoliceNode(address)", +"e4cb30ad": "getCharacter(address,uint256)", +"e4cc1161": "seedWithGasLimit(uint256)", +"e4cc18be": "finishMint()", +"e4cc98a5": "dividendPeriod()", +"e4cd7d96": "OX_ORG()", +"e4cdf3cc": "takeBack(uint256,uint256,bytes32,uint8,bytes32,bytes32)", +"e4ce25ac": "roundEthShares()", +"e4ce6ccf": "deed(bytes32)", +"e4cecd32": "cf_request(uint256,uint256)", +"e4cf77bb": "GoodBoyPoints(uint256,string,string)", +"e4cfcbf7": "setChainNext(address)", +"e4cfe9eb": "callerAllocationPeriod()", +"e4cff610": "process_merge_mint_ious(address)", +"e4d0f41d": "setAuthorized(address,address,bool)", +"e4d13625": "pauseActivity(uint16)", +"e4d1b2cc": "allocatedToken()", +"e4d2fecf": "isListening(address,address)", +"e4d433e8": "startDealForUser(bytes32,address,address,uint256,uint256,bool)", +"e4d534cb": "feewallet()", +"e4d5a558": "updateAndSafeTransferFrom(address,uint256,string,bytes)", +"e4d609cc": "addRequester(address)", +"e4d6d778": "getused(address)", +"e4d74f2e": "BCBcyCoin()", +"e4d75c9d": "setVestingAddress(address)", +"e4d76d3b": "ATN(uint256)", +"e4d7a3d4": "getAllClients()", +"e4d7c28c": "decision()", +"e4d8dead": "setChild(uint256,string)", +"e4d91372": "setlevel(address)", +"e4d9d212": "isPVPListener()", +"e4d9de94": "getInfo(uint8)", +"e4d9e130": "CrowdsaleToken()", +"e4da3860": "XfinityAsset()", +"e4db2230": "addCard(uint256,uint256,address)", +"e4db2ceb": "auth(string)", +"e4db4dc1": "CheckEligibility(address,string,string)", +"e4db6062": "GivethBridge(address,address,uint256,uint256,address,uint256)", +"e4db915e": "citadelBuy(uint256,address)", +"e4dbc385": "assertEq12(bytes12,bytes12)", +"e4dbf719": "FlightDelayLedger(address)", +"e4dc2aa4": "totalSupply(address)", +"e4dc3d8b": "raisedSale1USD()", +"e4dcb06b": "open(string)", +"e4dd7794": "fundingPaused()", +"e4de6ec6": "AyeshaCoin()", +"e4deb007": "setNextSaleAgent(address)", +"e4dec825": "setAllowContributionFlag(bool)", +"e4dedc7f": "DeleteContract()", +"e4df2531": "topBalance()", +"e4e075cc": "_getPlayerInfoByAddress(address)", +"e4e0bd1f": "PointPowerCoin()", +"e4e0c030": "makePayment(bytes32,uint8,bytes32,bytes32,uint256,uint8,uint256,bool)", +"e4e103dc": "rewardUser(address,uint256)", +"e4e1aae6": "BlockChainShopCoin()", +"e4e1bd53": "DisableTransfers(address)", +"e4e1f29b": "discountStep()", +"e4e1f6c5": "compare(address)", +"e4e1f7af": "mintTokensMultiple(uint256,int256,address[],uint256[])", +"e4e299f7": "zero_out(uint256)", +"e4e2bfe4": "canFinalize(uint256)", +"e4e2ca59": "supportsEIP20Interface(bytes4)", +"e4e2d2ae": "changeScore(uint256,uint256)", +"e4e3466a": "AIToken()", +"e4e4c8c0": "eMTV()", +"e4e57b9e": "sellTokens(address,uint256,uint256)", +"e4e609de": "LogBuyCoins(address,uint256,string)", +"e4e663a9": "getStatLotteries()", +"e4e6de18": "setPaoContactAddress(address)", +"e4e713e0": "DTCC_ILOW_6()", +"e4e76c16": "setCryptoSoulContract(address)", +"e4e790b8": "withdraw_GIC(uint256)", +"e4e80c49": "SpudToRotator(uint256)", +"e4e85963": "tokenRemainPreSale()", +"e4e985a8": "getKycProvider()", +"e4e9bcca": "setEthPriceProvider(address)", +"e4ea58a5": "withdrawInviteRewardToOrder()", +"e4eab468": "getWarrantyPrice(address,string,uint256,uint256,uint256)", +"e4eacd70": "curentBallotId()", +"e4eaee4c": "setBool(bool,bool)", +"e4eba2ef": "supplylimit()", +"e4ec3762": "onChain(address)", +"e4ec404c": "AG()", +"e4edf852": "transferManagement(address)", +"e4ee07b7": "UtlToken(address,address,address,address,address,address)", +"e4ef2cef": "link(address,string)", +"e4ef3eaa": "SetEvaluate(address,uint8,uint8)", +"e4f02750": "listGlobalAuditDocumentsFrom(bytes32,uint256,bool)", +"e4f06100": "adminSetDiv(uint256)", +"e4f20fb2": "mintPresale(address,uint256)", +"e4f2487a": "salePhase()", +"e4f26633": "betStage(uint256,uint256[])", +"e4f37374": "pixels(uint32)", +"e4f3f47f": "BuyCurrentTypeOfAsset(uint256)", +"e4f4c554": "AddressDefault()", +"e4f627fe": "keysCount()", +"e4f6973f": "BIPOOH_DAO_32()", +"e4f7a076": "set3RoundTime(uint256)", +"e4f7de93": "isIcoComplete()", +"e4f84173": "defValue()", +"e4f843f9": "deprecateTurretSubtype(uint8)", +"e4f896e8": "proclaimAllInactive()", +"e4f8b908": "_payout(address)", +"e4f8c6fb": "YettaCrowdSale()", +"e4f95226": "getLastInvestors()", +"e4fa8fc3": "hash_of(address)", +"e4fab06f": "delegatedFwd(address,bytes)", +"e4fae421": "ALLOC_ECOSYSTEM()", +"e4fc6b6d": "distribute()", +"e4fcf329": "setBonusRate(uint256)", +"e4fe8eb1": "getUserBigPromoBonus(address)", +"e4ff0f18": "rocketshipReachedDestination()", +"e4fffb3a": "updateMaxTokensToDistribute(uint256)", +"e50007b9": "TerminateEmployee(address,address,uint32,uint8)", +"e5002347": "setLimitMaxCrowdsale(uint256,string)", +"e5002a05": "whitelistAddress()", +"e5027880": "fortyEndTime()", +"e50278a6": "sellAllAmountPayEth(address,address,address,uint256)", +"e5033268": "endPreICOTimestamp()", +"e5033ee4": "maxBridgeHeight()", +"e503f70d": "newArticle(string,string,string)", +"e5042271": "setNick(string,string)", +"e5043632": "ElectronicHealthRecordToken(uint256,string,uint8,string)", +"e5045002": "setSecurityWalletAddr(address)", +"e504862b": "assertEq30(bytes30,bytes30)", +"e5065522": "updatePermissions(address,uint256)", +"e506b9b7": "joule()", +"e5071024": "setSemaphoreExternalNulllifier()", +"e5071b8e": "incrementCount()", +"e5075f4f": "ezpzToken()", +"e507d6dd": "getPlanActiveTime()", +"e507e7a4": "brandAccountsLength()", +"e508202d": "triggerLibraryEvent()", +"e5098e85": "eliminarEntidades(uint256)", +"e509b9a0": "initiateTransfer(string,string,uint256,uint256)", +"e509cac5": "_changeTokenAddress(address)", +"e50a32a9": "PriorityQueue()", +"e50a3bb1": "oraclize_query(string,string[],uint256)", +"e50ab759": "contractIndex(bytes32)", +"e50beffb": "voteStart(uint256)", +"e50d0473": "SetRank(uint8,address,uint16)", +"e50d2da1": "setSuperInvestor(address)", +"e50d8a8a": "deauthorizeMintRequester(address)", +"e50dce71": "testControllerApproveSetsAllowance()", +"e50dd26a": "contractTokenWithdraw(uint256,address)", +"e50dd478": "isFiscal()", +"e50e2f65": "EARLYADOPTERS()", +"e50ff8e9": "TestSportsG()", +"e5104307": "IsPlayer(address)", +"e5106ae9": "isValidNodalblockJson(string)", +"e51073f4": "withDrawInWei(uint256)", +"e510989a": "setNewDepositCommission(uint256)", +"e5113280": "RecipientStringUpdated(string)", +"e513575a": "getGblockWithOffsetFromCurrent(uint8)", +"e5135ae3": "CSZ_ERC20()", +"e515a4d1": "gen0Limit()", +"e515cd38": "deliver(address)", +"e516f4dd": "LogOwnerChange(address,address)", +"e5173942": "PRE_SALE_SOFT_CAP()", +"e517fd54": "getBonusPercents(uint256)", +"e5189e2a": "minSumICOStage3USD()", +"e5193c48": "withdrawGalacticTokens(address)", +"e51949fb": "getMinAuditPriceSum()", +"e51a3b40": "mul(uint8,uint8)", +"e51a7826": "buyCore(uint256,uint256,uint256,bytes32)", +"e51ace16": "record(string)", +"e51bfd9a": "selfHybridizationPrice()", +"e51c3257": "isTokenRateCalculated()", +"e51d2093": "getSaleFee()", +"e51d5c33": "Bitstraq_Token()", +"e51dc14a": "setMinBidDifferenceInSzabo(uint256)", +"e51dfd90": "cancelSellOrder(uint256,uint256)", +"e51e3c61": "transferReserveFundTokens(address,uint256)", +"e51e88bd": "MintingManagerApproved(address)", +"e51f2c68": "change(address,uint256)", +"e51f95cc": "init_crowdsale(address)", +"e51fcfa2": "LLV_311_EDIT_4()", +"e51ff1fc": "iterateOverThings()", +"e520f09e": "tokensToMintInHold()", +"e520fc7e": "treasure()", +"e5212deb": "_buyIcoToken(uint256)", +"e521357c": "LocalsValidation()", +"e521889c": "distributePrizes(uint256,uint8)", +"e5225381": "collect()", +"e52269c2": "Ooredoo()", +"e523757e": "Cashback(address,uint256)", +"e524d618": "UBetCoin()", +"e5254036": "changeNameOperation()", +"e5258557": "setMigrateFeesDueToFork(bool)", +"e525af22": "TOAB()", +"e525c3d8": "dTRIGGER_NEXTWEEK_TIMESTAMP()", +"e5260958": "Defraycoin()", +"e5269bbf": "limitDefaultType()", +"e526d7a0": "getTeamAddress(bytes32)", +"e527217b": "Object(string,string)", +"e52858c6": "token_b()", +"e5286c80": "token1stContract()", +"e5291ac5": "getVMParameters(uint256)", +"e52b6a56": "getAmountBonus(uint256,uint256)", +"e52bb742": "getGenre(uint256)", +"e52c0f24": "changeICOStartBlock(uint256)", +"e52c17a8": "test_increaseTimeBy800000_timecheck()", +"e52c66c1": "getTotalLosses()", +"e52c9da1": "giveaway(address,uint256,uint8)", +"e52d0404": "addressOfIndex(uint32)", +"e52d0659": "setPriceForBasePart(uint256)", +"e52e9f15": "isAddressLocked(address)", +"e52eb288": "buyFuel(address)", +"e52eb764": "updateVIPBoard()", +"e52efbf1": "getCompte_4()", +"e52f64ce": "releaseMany(address[])", +"e530db1c": "pool_percentage()", +"e531a9b8": "numOfUntransferableEcTokens(address)", +"e53229c7": "zasxzasxqa()", +"e5333b5e": "close_next_bucket()", +"e534155d": "holder()", +"e534a34b": "addThing(uint256,uint256,uint256,uint256,bytes32)", +"e534bf4f": "sha(bytes32)", +"e534c676": "getRefillPercFor(string)", +"e5357b02": "ReturnCode(uint8)", +"e535ed35": "closeChannel(bytes,bytes,bytes)", +"e5362206": "hdiv(uint128,uint128)", +"e5362667": "getTotalTokenCount()", +"e5363ab8": "initialise(address,uint256,uint256,uint256,uint256,uint256,string,uint8,string)", +"e536a41f": "USD20Crowdsale()", +"e536c723": "lowestContribution()", +"e536f869": "pai_add(string,string)", +"e53767bd": "denied(address,address)", +"e537a195": "getSeatAvatarUrl(uint256)", +"e537ceb9": "userOddsCycle(address)", +"e53831ed": "setSomeValue(uint256)", +"e5390e05": "thirdPeriodOfICO()", +"e53910a2": "TestNetReputationToken()", +"e5393f25": "GetSoftwareCount()", +"e53a22ac": "addSubMilestone(uint16,string,string,uint64,bool)", +"e53a8a5f": "GRAPE()", +"e53a8cf4": "getTokensLeft(string)", +"e53ae072": "PUCOINToken(address,uint256)", +"e53b373e": "TimeBankChain()", +"e53c4548": "transferOwner(address,uint256)", +"e53c9a5f": "cf_confirm(uint256,uint256)", +"e53cacba": "listOutEmployees()", +"e53cf8c9": "XBornID()", +"e53cfed9": "setupMiniGame()", +"e53d4988": "WLLToken()", +"e53e04a5": "refillGas()", +"e53eb53d": "amountToSeedNextRound(uint256,uint256)", +"e53ecb79": "allocatedBalance()", +"e5408eae": "TEAM_RESERVE()", +"e5411525": "crowdsaleStartTimestamp()", +"e54135ac": "updateExchangeRates(uint256)", +"e54280e7": "setBZxContract(address)", +"e542e7a3": "updateEtherCost(uint256)", +"e542e7c5": "newIdAuctionEntity()", +"e54384f9": "removeEntryManual(uint256,address)", +"e5438f5e": "FLiK(uint256,string,string,uint256,uint256)", +"e5449600": "unFreezeUser(address)", +"e544b52c": "setNextRules(uint256,uint256,uint256,uint256)", +"e545f941": "releaseToken(address)", +"e546299b": "activatePass(bytes32)", +"e5463032": "getWLAddress()", +"e546bb0c": "apiAddress()", +"e546d9c4": "removeTeam(address)", +"e548799c": "registerCrowdsale(address,address,uint256[8])", +"e548cf13": "betOnColumn(bool,bool,bool)", +"e548f086": "ETHOfCrySolObjects()", +"e549053f": "AnotherStorage(address)", +"e549114b": "stageOneCap()", +"e54919e6": "hasInitCard2()", +"e5494be1": "unlock2Y()", +"e5499e55": "LWFToken()", +"e549ec26": "safeDrain()", +"e54a29bb": "getRegisteredUser(address)", +"e54a9646": "netAddress()", +"e54aae13": "getMarketTopLevels()", +"e54c495a": "majorityReward()", +"e54c4f98": "getRefundValue(address)", +"e54d4051": "receiveInteger(bytes,uint256,uint16)", +"e54d62e9": "simDuration(bytes)", +"e54d8ccb": "Mappings()", +"e54ebe61": "updateBalance(uint256,bool)", +"e5514c9d": "MAX_PRESALE_TOKENS_SOLD()", +"e55156b5": "setFee(address,uint256)", +"e5515b55": "updateAssignedAudits(uint256)", +"e55186a1": "getUnit()", +"e551bff0": "PokerPayoutValue()", +"e5520228": "getEarningsRate()", +"e55219c6": "Chromium()", +"e5522a5b": "getClassMintCount(uint32)", +"e5533790": "setBiddingComponent(address)", +"e554482e": "arrayLength()", +"e554a5ff": "closeBid(address,uint256)", +"e554af57": "BAJIDOR(uint256,string,uint8,string)", +"e5553b33": "GenChip(uint32)", +"e555c1a3": "sellMyTokens()", +"e5568317": "setDeliveryAddress(string)", +"e556a08c": "validateToken(address,bool)", +"e557498b": "reFund(address,uint256)", +"e5575e61": "getTheLengthOfUserFreeze(address)", +"e557a18e": "activateHedge(address,uint256)", +"e557bb4e": "places(uint256)", +"e55834cb": "write(string,uint256)", +"e5583c59": "executeTxn(address,uint256,uint256)", +"e5589756": "Debug(string,address,uint256)", +"e5593b4d": "allocateTeamAndPartnerTokens(address,address)", +"e559afd9": "addToWhitelist(address,address[])", +"e559c724": "TEAM_VESTING_PERIOD()", +"e55a07b6": "setTiers(bytes32[],uint256[],uint256[],uint256[],uint256[],uint256[],bool[],bool[])", +"e55a07c2": "tokenSaleClosed()", +"e55a6ef6": "votingPeriodStartTime()", +"e55a7afb": "Gemmes()", +"e55ae4e8": "getPlayer(uint256)", +"e55b4aa8": "getBalloonCosts()", +"e55b55ce": "getPreSaleTokensAvailable()", +"e55b69b3": "startPostIco(uint256)", +"e55b8b62": "getPeerTokens(address)", +"e55c6d07": "getStartDateOfCampaign(bytes32)", +"e55db48e": "roundId_()", +"e55ed42e": "_phxToken(address)", +"e55f98f3": "Log1(uint128,string)", +"e55fae77": "setUpdatePeriod(uint256)", +"e56044c8": "incMemberBadRep(address,uint256)", +"e5604559": "UserUpgraded(address,uint256,uint256,uint256,uint256)", +"e560bf2e": "setOraclizeGasCost(uint256)", +"e5612b3b": "finishDistribute()", +"e5612d0e": "transferPaillier(string,address)", +"e561f28a": "cityIndexToApproved(uint256)", +"e562dfd9": "openRound()", +"e562f0ec": "setKYCRequiredToSendTokens(bool)", +"e5637956": "MIN_INVESTED_ETH()", +"e563d541": "delFrException(address)", +"e564bd4d": "accFoundation()", +"e564f88e": "tokensToIssue()", +"e564fd25": "setNotary(address,bool)", +"e56556a9": "getPlayerID(address)", +"e5656f9c": "updateMsgSenderBonusDrops(uint256)", +"e565b387": "FOUNDATION_POOL_ADDR_VEST()", +"e565beeb": "softMtcTransfer(address,uint256)", +"e565fd1b": "SetStorage(address,address)", +"e56646ae": "SmartPonzi()", +"e5664f65": "prePreSalePeriod()", +"e5665b57": "_softcap()", +"e566be4e": "EthRelief(address)", +"e566dfc6": "_handleFunds(uint256,uint256,address,uint256)", +"e567756f": "setDevelopmentAuditPromotionWallet(address)", +"e56860c3": "fundingLock()", +"e5689afa": "updateStorage(uint256,uint256)", +"e56988dd": "latestBidTime()", +"e569c1d4": "getMintOwner()", +"e56a9973": "marketCells()", +"e56adb5f": "IsWhite(address)", +"e56b3e68": "mediate(uint256)", +"e56b9dce": "GetPrize(uint256)", +"e56bb194": "calculateMyPercents()", +"e56c10a0": "ONTExchangeRate()", +"e56c174b": "getRate(address,address,uint256)", +"e56c38b1": "modify_uint(uint256)", +"e56c8155": "initialiseMultisig(address,uint256)", +"e56c8552": "spinTheWheel(address)", +"e56d3fea": "developer_add_address_for_B(address)", +"e56e4776": "avgSalesToCount()", +"e56e56b2": "sellCard(address,uint256,uint256,uint256,uint256)", +"e56e60f6": "SingularityTest12()", +"e56ee3c1": "cityPrice()", +"e56f3815": "isKnownOnly()", +"e5700ddf": "jack_winner()", +"e5702701": "minSellRateInPrecision()", +"e57053cd": "airdropWinTime()", +"e5707fa2": "teamContact()", +"e570be18": "DVIPBackend(address,address)", +"e5714ea3": "insertCLNtoMarketMaker(address,uint256)", +"e571c35e": "ReverseRegistrar(address,bytes32)", +"e571fd2d": "addPrescription(uint256,string)", +"e5720f2d": "getCredibilityScoreOfClaim(bytes12,bytes12)", +"e5723b6d": "buyerApprove(address,uint256,bytes32)", +"e572dee5": "bountyTokens(address,uint256)", +"e5731b77": "UnpackRevocation(bytes)", +"e5734c57": "setPhase1DurationInHours(uint256)", +"e574015c": "auditSupply()", +"e57405e2": "EMISSION_FOR_TEAM()", +"e575c5cb": "assertOnlyTo(uint256)", +"e575df72": "getUserStatus(uint256,address)", +"e576038f": "addNewSampleType(string,uint256)", +"e5760520": "bountyWallet()", +"e5766e84": "initPayoutTable()", +"e5769ab9": "getLastPresser()", +"e5775515": "getUserWallet(string)", +"e577d2c2": "updateEthToTokenOrderWHint(uint32,uint128,uint128,uint32,int256)", +"e5781b71": "SatFix(int256,int256,int256)", +"e5782fd5": "setFeeStructure(uint256,uint256,uint256)", +"e5789f5f": "getTotalLevelValue()", +"e5791c3e": "mustHoldFor()", +"e5796716": "restrictTransfert()", +"e579ebeb": "chAirDropFshare(uint256)", +"e57a68da": "StephenHawking()", +"e57ac748": "resolveDisputeSeller(string,address)", +"e57b921d": "_createNumber(string,uint256)", +"e57bc079": "DrawAddr()", +"e57c09bc": "contentById(bytes32)", +"e57c78ec": "unregisterPresale(address)", +"e57c8d1b": "dummyAgent()", +"e57d4adb": "approvedOrders(bytes32)", +"e57d880a": "externalPurchase(address,string,uint256,uint256,uint256)", +"e57e31fa": "approveSubmission(address,address)", +"e57e5741": "onXon()", +"e57e6593": "createClaim(string,string,address,uint256,string)", +"e57ea16d": "checkValueSent(bytes,bytes20,uint256)", +"e57ebc0f": "FRPToken()", +"e57f5a1d": "removeFromStud(uint256)", +"e58018c5": "openSaleEndTime()", +"e5807e06": "unfreezeBoughtTokens(address)", +"e580b2b0": "presaleEnded()", +"e580f47b": "lotteryId()", +"e580f6ab": "createGame(uint8)", +"e581002e": "strategybacktest(uint32[],bytes32[],bytes32[],uint64[],bytes32)", +"e5815b33": "JohanNygren()", +"e58172b1": "cardCost()", +"e5820af7": "pushtx(address,uint256)", +"e582645e": "isTokenSaleRunning()", +"e582b7e0": "lastBidAmount()", +"e582dd31": "stored()", +"e58306f9": "adminMint(address,uint256)", +"e5834b4d": "setShareactive(bool)", +"e5839836": "isFrozen(address)", +"e585f69f": "TokenResolver()", +"e587fb71": "setTreasureBox(address,bool)", +"e588a2bb": "ChannelWithdraw(address,address,uint32,uint192)", +"e5893cbe": "Register(address,bool)", +"e58a6509": "SMTfund()", +"e58ae45b": "migratePhraseData(uint256,uint256,uint256,uint256,uint256)", +"e58b0eb1": "WinkelERC20()", +"e58b5ab2": "setFinishedTx()", +"e58b69f2": "getCompte_6()", +"e58ba9e4": "stealCardWithSocialIdentity(uint256,uint256)", +"e58c68bc": "MAX_GEN0_GIRLS()", +"e58c8c5c": "checkParticipantStatus(address)", +"e58ca07e": "IntegratedMoney()", +"e58cd3cb": "setTokenCapInUnits(uint256)", +"e58d116b": "addConfirmation(bytes32)", +"e58d478e": "btcAddrPubKeyUncompr(bytes32,int256,bytes32,int256)", +"e58dd55a": "endThirdBonus()", +"e58dede7": "_tokenAllocator()", +"e58eda1b": "ARTWORK_AUCTION_DURATION()", +"e58ef8a8": "executeTransfer(address,address,uint256)", +"e58f0289": "MANGGAHTOKEN()", +"e58f2623": "getLotteryData()", +"e58fc54c": "withdrawForeignTokens(address)", +"e58fdd04": "isFeed(address)", +"e5910f04": "setCourceSale(uint256)", +"e591253c": "refundPreICO()", +"e59160e3": "nomin()", +"e591fa26": "getProjectFeedbackWindow(bytes32)", +"e5920ab5": "getNoVotes()", +"e592172e": "test_twoInvalidEqString()", +"e5926ddc": "getSaleLength()", +"e592f95a": "getRewardWinnings(address,uint256)", +"e593428f": "PURCHASE(bytes32,uint256)", +"e5949b5d": "channels(uint256)", +"e594ad35": "assignCore()", +"e5962195": "blocked(address)", +"e596d811": "approveBatchTransfer(address)", +"e597a27f": "getNumberOfBlocksRemainingToWin()", +"e597f402": "create(bytes1,bytes32,bytes)", +"e59843ec": "allowAutoInvest(address)", +"e5994905": "transferTokenFrom(address,address,address,uint256)", +"e59997c9": "getFmmsDetail(uint256)", +"e599a767": "GGG()", +"e59a29a6": "getStakePerDraw()", +"e59af25b": "buy_spice_melange()", +"e59b0e14": "testIsNull(bytes)", +"e59bcf52": "subLockValue(address,uint256)", +"e59c4fa3": "smallUintFunc(int256,uint8,uint256)", +"e59c5e56": "Filled(address,uint256,address,address,uint256,address,uint256,uint256)", +"e59c9ada": "getBonuses(uint256)", +"e59cef17": "RaisedFunds()", +"e59cf926": "FOUNDER_ADDRESS3()", +"e59d2b7f": "unfreezeTeamWalletBlock()", +"e59d4912": "setOracleInterval(uint256)", +"e59d843a": "Replicator(bytes,uint256,uint256,address)", +"e59de295": "setItemPerPage(uint16)", +"e59de3a5": "drawToken(address)", +"e59e1ca6": "getBrickBuilders(uint256)", +"e59e6759": "ZXZX(uint256)", +"e59eee2e": "PRE_ICO_MIN_DEPOSIT()", +"e59f611f": "InputLimit(uint256)", +"e59ff828": "createOrder(uint32,uint32,uint256,bool)", +"e5a01e69": "getWeaponNumber()", +"e5a07419": "sellDividendPercentEth()", +"e5a078a7": "cancelRegistration()", +"e5a17818": "cancelSeller(bytes32,uint256)", +"e5a1eac2": "setSellDividendPercentageFee(uint8,uint256,uint256)", +"e5a23e7e": "changeBirthSettings(uint256,uint8,uint8)", +"e5a252b1": "playerTempReward()", +"e5a27038": "Pluton(uint256,string,uint8,string)", +"e5a284f8": "roundFourBlock()", +"e5a31c5d": "canGrantVestedTokens(address,address)", +"e5a3363c": "luckyVoters(uint256)", +"e5a34f97": "getFullround()", +"e5a3c0ad": "addPrivateSaleTokens(address,uint256)", +"e5a3c771": "expiredLockPeriod()", +"e5a4bed3": "getInterest()", +"e5a512af": "refund_with_close_position(address[],address,uint256[])", +"e5a5fbc8": "crowdsaleInProgress()", +"e5a62ffc": "Tile()", +"e5a64de6": "CompraUnidadesPases(uint16,uint8)", +"e5a6b10f": "currency()", +"e5a6fadd": "ReinsureSeveralDeaths(bool)", +"e5a70ef7": "feeMultiplier()", +"e5a71eb6": "Itterator9000Ultra()", +"e5a749e8": "needSurvive(bytes32)", +"e5a7b51f": "parentChange(address,uint256)", +"e5a82fe7": "REXEN(address)", +"e5a85478": "getUserTXCount()", +"e5a912c7": "xdest()", +"e5a93dd8": "inCirculation()", +"e5a9d6b0": "get_registrant(bytes32)", +"e5aa3d58": "i()", +"e5ab8be0": "isCollaboratorOrOwner(address,uint256)", +"e5ac7291": "lockAccounts(address[],uint256)", +"e5ac808e": "checkProof(bytes32,bytes32,bytes32[],uint256)", +"e5ace862": "getPoolMinStakeTimeInBlocks(uint256)", +"e5aceac5": "getWorlCupByID(uint256)", +"e5ae7721": "submitPayment(bytes32,bytes32[],uint256,uint256,uint8)", +"e5af0e89": "setNewTokenURI(string)", +"e5af18c5": "score(bytes32)", +"e5af350e": "reloadWhiteByName(uint256)", +"e5af3a35": "throwsSaleWalletIncorrectMultisig()", +"e5af48d8": "isApproved(address,address,uint256)", +"e5af8d92": "iiinoTokenAddress()", +"e5afe3e6": "tokenPrices(uint256)", +"e5b02393": "addSaler(address)", +"e5b02447": "findTopNValues(uint256[],uint256)", +"e5b0ee4d": "changeVestingPeriod(uint256)", +"e5b2169f": "Registry(string)", +"e5b28c07": "weeksFromEndPlusMonth()", +"e5b2a58d": "SinoeCoin()", +"e5b4003b": "grantPoolRole(address)", +"e5b5019a": "MAX_UINT()", +"e5b598d9": "hasChampSomethingOn(uint256,uint8)", +"e5b5a527": "giveStellarReward()", +"e5b5fe72": "Put(address)", +"e5b6b4fb": "Securities_5()", +"e5b6eac4": "teamUnlock2()", +"e5b73e08": "payer(address)", +"e5b754fb": "Redeem(address,uint256,uint256)", +"e5b7ec88": "setVoteCut(uint256)", +"e5b82bba": "dayTokenFees()", +"e5b8d6e0": "withdrawTokenRefund(uint256)", +"e5b9a74c": "submit(address,string,string,string)", +"e5ba08e5": "_baseDebt(uint256,uint256,uint256,uint256)", +"e5ba0b8a": "sellOffer(uint256,uint256,address,bytes32)", +"e5bb6575": "blockUser(address,address)", +"e5bb9fb9": "cancelTx(uint8)", +"e5bc7be0": "replaceModuleHandler(address)", +"e5bcb303": "getAccessorPurpose(address)", +"e5bf1b75": "getElectionId(string)", +"e5bf93b9": "balanceEther(uint256)", +"e5c0de3e": "Labereon()", +"e5c0fa69": "torchDividendsOf(address)", +"e5c19b2d": "set(int256)", +"e5c2205e": "_calculateTokens(uint256,uint8,uint256)", +"e5c31ddc": "rejectTransfer(uint256,uint256)", +"e5c361b0": "totalTokensICO4()", +"e5c389cd": "setConfig(uint256,uint256,uint256,uint256)", +"e5c42fd1": "addStakeholder(address)", +"e5c46869": "refPercentage()", +"e5c46944": "MultiSigWallet(address[],uint256)", +"e5c5dabb": "CSCResourceFactory()", +"e5c60091": "highest_bid()", +"e5c60d0b": "INVESTMENT_FUND_TOKENS_SUPPLY()", +"e5c6258d": "withdrawCrowdsaleTokens(address,uint256)", +"e5c774de": "houseEdgeDivisor()", +"e5c7bc6c": "treesOnSale(uint256)", +"e5c7e509": "testThrowTransferDisableNotEnabled()", +"e5c8b03d": "renounceSigner()", +"e5c8eb2f": "mytesttokenToken()", +"e5c91047": "addMeByRC(address)", +"e5c92020": "freezeFrom(address,uint256,uint256,uint256)", +"e5c98b86": "RoundSet(uint64,address)", +"e5c9c2ed": "_initialize(address,address)", +"e5ce8200": "withdrawForMkt(address)", +"e5cf2297": "amountOwed(address)", +"e5cf45b0": "FruitionToken()", +"e5cfd1bc": "player3Timestamp()", +"e5d00bee": "initiateCrabPartData()", +"e5d00f1f": "checkDepositQuest(address)", +"e5d02cd0": "PriceReturn(uint256,uint128)", +"e5d0713b": "maxGamesPerBlock()", +"e5d0c1bd": "LATToken()", +"e5d17171": "skl()", +"e5d2ce2f": "setCategory(uint256)", +"e5d3d9d7": "getBuyArray(address)", +"e5d4610f": "generatorTransfer(address,uint256)", +"e5d5876d": "_sell(uint256)", +"e5d5c898": "isSuperior(bytes32[],bytes32[])", +"e5d607f3": "SocialLendingToken(uint256,string,string,uint256)", +"e5d71cfe": "rewardLottery(bool)", +"e5d787f2": "moreTokenPerEtherForPresaleRound()", +"e5d8011f": "getCurrentTokenAmountForOneBtc()", +"e5d8103e": "setTotalBonuses(uint256)", +"e5d824a7": "addData(uint256)", +"e5d8f1ca": "removeAmount()", +"e5d90d94": "LuckchemyToken()", +"e5d9dac4": "assetTransfer(address,uint256)", +"e5da2717": "BOBToken()", +"e5dada63": "_pushRoomNight(address,uint256,bool)", +"e5db1a68": "bytes32Func(bytes32)", +"e5db2612": "addPrivatePurchaser(address,uint256,uint256,uint256)", +"e5db7a20": "mainnetAccountDict(address)", +"e5db9b49": "getJobInvoices(uint256,uint8)", +"e5dc476f": "getVideoGameCurrentPrice(uint256)", +"e5dc67d6": "setGameCloneFee(uint256)", +"e5dcc824": "getInfo1(address,address)", +"e5dd05ab": "primaryLedgerCount(string)", +"e5dd90a5": "HumanStandardToken(uint256,string,uint8,string)", +"e5ddb19d": "_applyLevelBonus(int256,uint256)", +"e5de0b89": "EGGS_TO_HATCH_1FALCON()", +"e5de2925": "endPreSales()", +"e5df3dd0": "unfrozen(address,uint256)", +"e5df669f": "recoverAddr(bytes32,uint8,bytes32,bytes32)", +"e5df7b10": "getBoughtTokens()", +"e5dfbe78": "setCreateDividendPercent(uint256)", +"e5e04a33": "SendResult(uint64,uint64)", +"e5e123f1": "funeral(bytes32,int256)", +"e5e1a202": "endTimeOne()", +"e5e231dd": "pauseTokens()", +"e5e288e5": "sendTransaction(address,uint256,bytes)", +"e5e2fd7b": "balanceTreasury()", +"e5e38fc7": "test_twoTrueAndFalseAssert()", +"e5e3ac4f": "removeAssociatedAddressDelegated(address,address,uint8,bytes32,bytes32,uint256)", +"e5e41a63": "publishOption(uint256,uint256)", +"e5e45b16": "notifyTempBreach(int256)", +"e5e4807f": "setPriceToPreSale()", +"e5e51bd7": "getOrderTokenCompletedAmount(uint256,address)", +"e5e53493": "requestKinTokenOwnershipTransfer(address)", +"e5e5cfac": "Altcoin()", +"e5e5dff1": "cancelBounty(uint256)", +"e5e5e5d6": "emitGenericProposal(string)", +"e5e6a0aa": "ticketTransfereesAmount(address)", +"e5e75fee": "fountainContractAddress()", +"e5e792de": "_pro(address,uint256)", +"e5e7a136": "CEO_SHARE()", +"e5e7b82b": "ethEurRate()", +"e5e7c276": "isData()", +"e5e7fa53": "div(uint96,uint96)", +"e5e88590": "unholdSubscription(uint256)", +"e5e9a9bb": "registerUsers(address[])", +"e5ea1201": "changeTicketType(uint256,string,uint256)", +"e5eab096": "setDomain(string)", +"e5eabf14": "playInternal(address,uint256,uint256,address,uint256)", +"e5eb9d7a": "SilverMoon()", +"e5ec8df3": "calcTimedQuotaByPower(uint256,uint256,uint256,uint256)", +"e5ed1d59": "startGame(uint256)", +"e5ed31cb": "updateBytes32(bytes32,bytes32)", +"e5ed44c2": "Koplak()", +"e5ed78bb": "setDateStart(uint256)", +"e5ee8dae": "publicGetElementOffer(uint256,uint256,uint256)", +"e5eee9be": "longJudge(uint256,address)", +"e5ef0b95": "BitRRToken()", +"e5f06556": "fillRequest(bytes32,string,uint256)", +"e5f171d6": "BLOCKCHAIN_DEPOSIT_BETA()", +"e5f2806a": "createPlayer(uint32[7],uint256,address)", +"e5f2d88f": "settotalCardValue(uint256)", +"e5f363f8": "FTTtoken()", +"e5f3b2dc": "advisorsTokensWallet()", +"e5f3e7b5": "placeBet(uint256,uint256,uint256,uint256,uint256,bytes32,bytes32)", +"e5f3fcb1": "alias_price()", +"e5f4906a": "moveTokenICO(address,uint256)", +"e5f59e7c": "setIsChargingManagementFee(bool)", +"e5f5d05b": "tokensRaisedRound()", +"e5f6186d": "maxContributionWei()", +"e5f643cf": "InvestorWhiteList()", +"e5f65c71": "initialBlockCount()", +"e5f6a908": "AddrCommunityDistribute()", +"e5f6b137": "getOutCar(string,uint256)", +"e5f6d376": "updateStatusViaTokens()", +"e5f6f252": "getUserNumEntries(address,uint256)", +"e5f6f716": "thirdChainETH()", +"e5f796fd": "CONTRIBUTION_END()", +"e5f79bee": "PRE_SALE()", +"e5f8ce92": "setPercent2(address,uint256)", +"e5f92973": "conclude()", +"e5f952d7": "rewardMathGeniuses(uint256,uint256)", +"e5f982a4": "validateChainlinkCallback(bytes32)", +"e5f9a40f": "TRHToken(address,string,string,uint256,uint256)", +"e5f9ec29": "left51(uint256)", +"e5f9f510": "BetMe(address,uint256)", +"e5fb08c0": "tokenExchangeRateMile2()", +"e5fb9211": "constructLeaf(uint256,address,uint256)", +"e5fb9332": "mintProject(string,string,string,address)", +"e5fd6364": "unregisterPublicKey(uint256)", +"e5fdac45": "presentMissingChunk(bytes)", +"e5fe3d7a": "aprovaPagamento(bool)", +"e5fe4f31": "buy(uint8,bytes32,bytes32)", +"e5fe7870": "vote(string,uint128,uint256)", +"e5ff2e8a": "mintTeamTokens()", +"e5ff7674": "restartPresale()", +"e5ffea8e": "testCalculateNeededCollateral()", +"e5ffeaf6": "fixAddress(address,bytes32)", +"e600c817": "verifyUser(string)", +"e600fd93": "getBonusPercentageByMachineMode(uint8)", +"e6025572": "ShadowBox()", +"e602af06": "confirmChangeOwnership()", +"e604cf9f": "get_all_squares()", +"e6072d5a": "BONUS_MID_QTY()", +"e607a638": "DataController(address,address)", +"e608433b": "weiForRefundPreICO(address)", +"e608ca67": "calculateSubscore(address,int16,int16)", +"e608d3e5": "marketingCap()", +"e609120a": "intercrypto_convert(uint256,string,string)", +"e609348a": "upgradeOwner(address)", +"e60a33aa": "userEndGame(uint32,int256,bytes32,bytes32,uint256,address,bytes)", +"e60a72bc": "ReferalsTokenHolder(address)", +"e60a955d": "setActive(uint256,bool)", +"e60aafab": "setIcoStatus(uint256)", +"e60b0cad": "endPreICOStage1()", +"e60b1424": "bytes32ToUint(bytes32)", +"e60b2c9a": "SALE_2WEEK_BONUS()", +"e60b7ff7": "batchTransferToken(address,address[],uint256)", +"e60c11a0": "subContractBalance(uint256,uint256)", +"e60d3caf": "updatePowerDayRate(uint256)", +"e60dbaae": "Jump()", +"e60f1ff1": "getExit(uint256)", +"e60fb021": "publishOwner()", +"e60fd342": "getCreateSharesFxpValue()", +"e6107cbb": "isBurnApproved()", +"e6108fc9": "increaseLockBalance(address,uint256)", +"e61109fd": "setFiscalVerify(uint256,uint256,uint256,bytes32)", +"e611ad32": "CourseBaseOnIdStudentFunct(uint256)", +"e6120842": "warningERASEcontract()", +"e612a4b6": "get_order(string,uint256)", +"e612c0ad": "team2()", +"e6131706": "updateTransaction(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)", +"e6131a64": "UpdateBeneficiary(address)", +"e6135ffe": "_removeIndex(uint256)", +"e6136d84": "icoBegintime()", +"e61387e0": "knc()", +"e6138b37": "TESTBRB()", +"e613d3b2": "getParentUser(address)", +"e6153d1b": "mint(string,bytes16,uint256,uint32,address)", +"e615ed91": "AragonTokenSaleTokenMock(address,uint256)", +"e61604cf": "liquidateBorrow(address,address,address,uint256)", +"e616c975": "GetAccountIsFrozenCount()", +"e6175794": "MaPToken()", +"e617f204": "setWhiteListAdmin(address,address)", +"e618f558": "TempTokensSend(address,uint256,uint256,uint256)", +"e6197f41": "setTokenSaleFinished()", +"e61a3c73": "GuDuFengCoin(uint256,string,uint8,string)", +"e61ab6c9": "accountPubPreSale()", +"e61b6557": "reserveOwner()", +"e61b762b": "cancelAllSellOrders(address,uint256,uint256)", +"e61b959e": "dev_outStream()", +"e61c51ca": "topUpGas(uint256)", +"e61c6320": "_recoverAddressFromSignature(bytes,bytes32)", +"e61ca819": "indexToAddress(uint256)", +"e61d5d50": "raisedOBR()", +"e61fde91": "BiciDevuelta()", +"e6206711": "SendEthOn()", +"e6207611": "setChests(address)", +"e6213127": "deprecate(bool,address)", +"e621350d": "getDiscountAndSupply()", +"e621b149": "softCapUSD()", +"e621b5df": "redeemEther()", +"e6229c14": "_createBid(address,uint256,address,address,bytes32,uint256,uint256)", +"e622abf8": "LOCK_END(uint256)", +"e6232ba1": "updateEndDate(uint256,uint256)", +"e6234260": "depositCollateralOnBehalfOf(address,bytes32,uint256)", +"e623a1a6": "kcck256straddadd(string,address,address)", +"e623a93b": "votesForAnswer()", +"e623c4ac": "addressInSwap(address,address)", +"e6240deb": "activityCount()", +"e62420d9": "getChild(address,uint256)", +"e62444e1": "submitJRH(uint256,uint256,bytes32,uint256,bytes32[],uint256,bytes32[])", +"e624b02a": "changeHold(address,uint256,uint256)", +"e624d199": "partnerSaleWallets(uint256)", +"e625215c": "withdrawStake(uint256,bytes)", +"e6252c0f": "deleteHpbNodeCache(address)", +"e6256509": "SPNToken()", +"e62580cb": "MYToken(uint256,string,uint8,string)", +"e6259f53": "timeArrayOf(uint256)", +"e6281254": "FundsMoved(uint256)", +"e628dbf9": "changeTiming(uint256,uint256,uint256,uint256,uint256,uint256)", +"e6293e23": "burnerAddress()", +"e629837c": "updateAndSafeTransferFrom(address,uint256,string)", +"e62a4ac9": "setBUI(bytes32,uint256,int256)", +"e62af875": "isContractOwnerLocked()", +"e62b795c": "addCourse(string,string,string,string,uint8,uint8)", +"e62bd899": "mintStart1()", +"e62c04bb": "OwnershipTransferred(address[],address[])", +"e62c2f9c": "get_location()", +"e62c9df9": "participantToEtherSpent(address)", +"e62cc611": "ETHER_HARD_CAP()", +"e62cd55c": "test_oneInvalidFalseEq()", +"e62d64f6": "withdrawableBalance()", +"e62d809d": "subdividendsOwing(address)", +"e62d909f": "TargetCreated(address)", +"e62e3c07": "getTransactionDetails(bytes)", +"e62eea47": "startSettling(bytes32)", +"e631b536": "fields(address,uint256)", +"e631e9b3": "solveIO(uint256,bytes32,bytes32,bytes32,bytes32)", +"e63227b0": "freezeGlobalTansfers()", +"e6324270": "profilParticipant(uint256)", +"e632c2f3": "totalPurchased()", +"e633cefe": "itemInfo(address,address,uint256,bytes)", +"e63466a3": "_getToken(address)", +"e6346867": "imaxChainToken()", +"e63697c8": "withdraw(uint256,address,uint256)", +"e6369e41": "Timestamp()", +"e636bc3c": "addRoyLuxList(string,string,uint256,uint256)", +"e6378d3a": "joinGame(bytes32,string)", +"e637f824": "GetPlayerDataAt(address)", +"e638d76d": "migrateDomain(bytes32,uint256)", +"e638f372": "getDIVDPayoutPercent()", +"e639481a": "getUpperBoundBlocksTillGameEnd()", +"e63988bd": "getContributorInformation(address)", +"e63a6788": "miningOnePlat()", +"e63b029d": "finishSalvage(address)", +"e63b681e": "redeemExternalToken(bytes32,address)", +"e63b6b87": "DipTokensale()", +"e63bc62d": "processProposal(uint256)", +"e63c83c1": "getTotalWithdrawn(uint64,address)", +"e63d38ed": "disperseEther(address[],uint256[])", +"e63d4957": "totalLimitUSDWEI()", +"e63da5f7": "bootstrap2()", +"e63da84c": "getBattleRandom(uint256,uint256)", +"e63df4a7": "createJobEscrow(bytes16,address,address,uint256,uint256,uint32,uint32)", +"e63edfef": "Learn()", +"e63fb7d2": "getAdText(uint256)", +"e6400bbe": "suspend()", +"e64044c0": "payoutKeys(uint256)", +"e640663a": "removeFromOwnershipAuctionTokenIDs(address,uint256)", +"e640d5a8": "PubAccepted(address)", +"e6416f4e": "sendFoo(address,uint256,bytes)", +"e641bde1": "addInvestor(address)", +"e642b7b6": "isWhitelistOnlyStatus()", +"e642b900": "Bugcoin()", +"e642b9be": "MTP_PER_ETH_PRE_SALE()", +"e643197b": "TRY_Omnidollar()", +"e643d63c": "_setProposal(uint256,string,bytes32,bytes32,bytes32,string,uint256,uint256)", +"e6441201": "set_foo(string)", +"e644d886": "ico3total()", +"e644f60b": "isFresh(string)", +"e6452f64": "TGEDeployer(uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"e6456a30": "HARDCAP_ETH_LIMIT()", +"e6458f6e": "getExternalDependencies()", +"e646350d": "getTokensAvailableForSale()", +"e6468b9f": "mCoinPerBlock()", +"e6470fbe": "updateDefaultPayment()", +"e6471555": "remForSalesBeforeStageLast()", +"e64853c4": "polls()", +"e648ce75": "setSelfClaim(bytes32,bytes)", +"e64906a4": "setTokenForPreSale(uint256)", +"e64a4e27": "updateDealConditions(uint256,uint32,uint32,bool,uint256)", +"e64acfa4": "getRealValueToReturn(uint256)", +"e64e3241": "mint(bytes32,bytes,uint256[],bytes,bytes)", +"e64f15a2": "deleteTask(bytes32)", +"e64fd8b0": "transferTokenWallet(address)", +"e650672b": "setGreenToken(address)", +"e6506873": "bookingMetadataForKey(bytes32)", +"e650ca40": "firstWeekBonusInWeek()", +"e6511ce2": "createCodeContract(string)", +"e6512ea2": "fundBounty()", +"e6514de2": "PreSaleLimit()", +"e6519a35": "getCreationTime()", +"e6527376": "OneWorldCryptoCoin()", +"e65284f1": "getRealPriceSpeed()", +"e652ca86": "LowcarbonToken()", +"e652f4cc": "getVoteCount(address)", +"e6530b97": "addArbiter(address,uint256)", +"e653d52d": "approveProxy(address,address,uint256,uint8,bytes32,bytes32,string)", +"e653d5d3": "GlobalStorageMultiId()", +"e653ec6a": "unsubscribeFromPool()", +"e6544b87": "ICORatio()", +"e65500e9": "startincreaseWithdrawalTeam()", +"e6560c94": "_saveBonus(address,uint256)", +"e6562fe1": "approveForwardedAccount(address,address,string)", +"e6569b1e": "getConID()", +"e6571176": "checkCertificate(bytes)", +"e657807b": "endIco()", +"e658d221": "claimPlotMultipleWithData(uint256[],string,string,string,string)", +"e6591f4e": "setNSFW(uint8,bool)", +"e65a0117": "earn(uint256)", +"e65a2e7f": "forceEmpty(bytes32)", +"e65af219": "PlusCoin()", +"e65b00b6": "Confirmation(address,bytes32,bool)", +"e65b1fd0": "getConsecutiveDeaths()", +"e65b490d": "_rewardWinners()", +"e65b743e": "dispatchGains()", +"e65b782f": "getCurrentTranche()", +"e65b96a7": "MyDanaToken()", +"e65b99c6": "uservalue()", +"e65bbceb": "makeAdoptionRequest(bytes5)", +"e65c1244": "holderEthers(address)", +"e65ca2fe": "Crowdsale(uint256,uint256,uint256,uint256,uint256,address)", +"e65d1522": "fromWei(uint256)", +"e65d19ca": "createInactiveEdition(uint256,bytes32,uint256,uint256,uint256,address,uint256,uint256,string,uint256)", +"e65d6b49": "getCommission()", +"e65d9717": "pushVendor(string,address,bool)", +"e65da9a2": "PROMOTION_ACCOUNT()", +"e65de3ca": "removeTitleTransfer(string)", +"e65dea55": "validate(uint256,uint256,uint256,string,string,string)", +"e65e63ed": "secondsaleclosingTime()", +"e65e73e2": "oneavl()", +"e65e95a8": "token_address(address)", +"e65f0246": "updateCountryHoldersCount(uint256,uint256)", +"e65f1d98": "bigLoop(uint256)", +"e65f2a7e": "enroll()", +"e65f5ea4": "distribute10MT(address[])", +"e6601fb4": "viewFunds(address)", +"e660c7aa": "PresaleAddress()", +"e660dd54": "compWallet()", +"e661a98f": "ecosystemtoken()", +"e661b3d5": "returnStatus(uint256)", +"e662bd25": "doTransfer(address)", +"e662e9af": "getPersonalStakes(address,address)", +"e662ff97": "sellMyTokensStocks()", +"e6634e41": "tokensPerEthAtRegularPrice()", +"e664214a": "releaseUnlocked(address,address,uint256,uint256)", +"e6642528": "BitcoinIndigo()", +"e664725b": "bn128_add(uint256[4])", +"e664755b": "withdrawAttacker()", +"e664d8e8": "showhospital(uint256)", +"e664e1e0": "getAddressTwo(address)", +"e6657008": "TicketsInGame()", +"e665dba0": "addAuthorizedExternal(address,address)", +"e66623ad": "ETbankWord()", +"e6662e2b": "UrbitToken(address,address)", +"e666767b": "getPlayerBetForCurrentPlayRound(address)", +"e6678f33": "updateReferralBonusRate(uint256)", +"e66825c3": "pricePerUnit()", +"e668a547": "SingularityTest8()", +"e668a7af": "buyFrom(address,uint256)", +"e668e1f3": "noContestTime()", +"e668e5ce": "getPlayerBetCount(string,uint256,string)", +"e6690fb1": "nextAuction(uint256)", +"e6691249": "getCompte_5()", +"e66a5e6b": "waveCap1()", +"e66a6b22": "isSigned()", +"e66aa720": "pureBalance(address)", +"e66bf416": "DLK()", +"e66c4175": "LargeCapStartTimeChanged(uint256)", +"e66c66d9": "setMonsterCreatorAddress(address)", +"e66caeb4": "payFortune(uint256)", +"e66d1b84": "countHoldAmount(address)", +"e66d4694": "gymContract()", +"e66d9874": "REQUEST_REJECTED_BY_HOST()", +"e66dda4e": "wallocked()", +"e66dde38": "startRound(bool)", +"e66e00f8": "getAdminDashboard()", +"e66f51fd": "AxieERC721Metadata()", +"e66f53b7": "curator()", +"e66f6e75": "getIsAttack()", +"e66f7bba": "oracleItQuery(uint256,string,string)", +"e670f7cd": "checkHash(string)", +"e6714f63": "eth_min()", +"e6717d3f": "setPresidenteDeMesa(bytes32,uint256,bytes32)", +"e671ac23": "getMonthClaimed(address)", +"e671f510": "onEtherandomExec(bytes32,bytes32,uint256)", +"e6722531": "checkBoosterQuest(address)", +"e672eb49": "GetBetInformation(uint256)", +"e673f646": "setContributor(address,address,bool,uint8,uint8,address)", +"e6744035": "booleanToUInt()", +"e6748da9": "setBytes(bytes32)", +"e674a0bd": "unlock(address,address)", +"e67524a3": "mintTokens(address,uint256,string)", +"e6758649": "revokeStakeholderConfirmation(uint256)", +"e676d53f": "GRAD()", +"e6774e1e": "setCapTab(uint256,uint256)", +"e6779bba": "_calculateTokensAmount(uint256)", +"e677d67d": "decode(bytes,uint256)", +"e679366f": "setExchangeTime(uint16,uint8,uint8,uint8,uint8,uint8)", +"e67ad254": "airBegintime()", +"e67bcfb6": "viewPreSaleCancelledList(address)", +"e67c4f96": "_createItem(string,address,uint256)", +"e67cdfb7": "moveOldUser(uint256)", +"e67d35c6": "UmeTravelNet()", +"e67d5b16": "SpeedJump()", +"e67e04f9": "startAcceptingDonation()", +"e67e3d56": "ethTaxRate()", +"e67e8aaf": "cliffPercent()", +"e67eed44": "getTicketOwner(int256,uint256)", +"e67f3cde": "about(address)", +"e67fcd10": "createSale(string,uint256,uint256,uint256,uint256)", +"e6807ca9": "checkBlacklist(address)", +"e68122e2": "createConsent(address,string,string)", +"e681e906": "_disableModule(bool)", +"e681f989": "saveMetaData(address,bytes32,bytes32)", +"e68215ec": "getOrganizerInforById(uint256)", +"e6821bf5": "videos(uint256)", +"e6824b0d": "REAPER_INTREPID()", +"e682c9ea": "rescindVote(bytes32)", +"e682e290": "getWhitelistStatus(address,address)", +"e682e2b2": "PingToken()", +"e6838ffa": "CbDataStandardToken(uint256,string,uint8,string)", +"e684aa5c": "amountAlreadyPaidBack()", +"e684d75d": "from_Initialisation_to_Lifecycle()", +"e685f2fe": "SilcCrowdsale(uint256,uint256,uint256,address,uint256,uint256)", +"e686b89a": "stage_2_price()", +"e6885aad": "Notary()", +"e688aab4": "changeOperative(address)", +"e688d097": "activekey(address)", +"e688f89d": "getMax(uint256)", +"e6890105": "addRefundTransaction(uint256,uint88)", +"e6891995": "KStarCoin()", +"e6891a55": "underwritePriceOf(uint256)", +"e6898a7d": "getSex(uint256[2])", +"e689928e": "seventyeight()", +"e689aa66": "isAllocated9()", +"e68a471d": "getLatestTokenPayday(address,address,address)", +"e68a555d": "UpdateUserPELOAmount(address,uint256)", +"e68a655c": "setEtherDeltaFees()", +"e68a7c3b": "getAccounts(uint256,uint256)", +"e68a9610": "releaseTokensTo(address,address)", +"e68c32b3": "cgadmin(address)", +"e68d3ae3": "escrow(uint256,string,address,uint256)", +"e68d7535": "cancelWhiteList(address[])", +"e68e64cb": "getCurrentUserReward(bool,bool)", +"e68f05fe": "SetCrowdsaleAddress()", +"e68f08a0": "MatchGetted(uint256,bool,uint256,uint256,uint256)", +"e68fb207": "makeOrder(address,address,uint256,uint256)", +"e690833a": "getPropertyRatingTuple()", +"e690d9bf": "Rollercoaster()", +"e6917e67": "tierOnePurchase()", +"e691bed4": "get_arbits(address,address)", +"e693e4d1": "neironixProfitAddress()", +"e69405fd": "_endDutchAuction(uint256,uint256)", +"e69432c8": "getMyNormalDragons()", +"e694d107": "getlastDividendPoints()", +"e694f694": "distributeLRNX(address[],uint256)", +"e69506aa": "Tokens_Per_Dollar_Denominator()", +"e6955d7c": "XYCC()", +"e6957514": "mergedMinerValidatorAddress()", +"e695c00c": "assertEq29(bytes29,bytes29,bytes32)", +"e696d10d": "processPurchase(address,address,uint256)", +"e696fb9a": "_6_friends()", +"e696fd64": "change_ico_finish(uint256)", +"e6972dbb": "readEventFromDatabase(uint64)", +"e6979b90": "multiAdd(address[],uint256[])", +"e697b5d8": "referrals(address,uint256)", +"e69852d0": "getUserNameOf(address)", +"e698816f": "getTokenIdOfCR(string)", +"e69932e5": "getFreeSeeds()", +"e6997f6d": "rootUTXOMerkleTreeHash()", +"e699e8c3": "removeDefaultOperator(address)", +"e69a2d9a": "Lent(uint256,address)", +"e69b414b": "issuedTokensAmount()", +"e69b9b65": "exchangeableTokensFromSale()", +"e69d09cf": "releasedForTransfer()", +"e69d27a8": "lifeFactor_v()", +"e69d849d": "donate(address,uint256)", +"e69e04b3": "defaultPrice()", +"e69e4640": "calculateBalance(uint256,uint256,uint256)", +"e69e9337": "PERSONAToken()", +"e69fde41": "KentraToken(uint256,uint256)", +"e69ffce8": "changeRegulator(bool)", +"e6a0525f": "getStudentID(bytes)", +"e6a1e811": "newBet(uint8)", +"e6a27cf2": "getUserEarningsInfo()", +"e6a33268": "secondRate()", +"e6a3afe8": "sendTreasuryTokens()", +"e6a43d63": "crowdsaleSoftCap()", +"e6a45026": "fetchStageIndexBySnapshotBlock(uint256)", +"e6a50d84": "getAddressFromIndex(uint256,uint8)", +"e6a5d78d": "_getMerkleRoot(bytes32,bytes32[])", +"e6a605df": "PreTgeEnable()", +"e6a6d4c8": "getExecutedTransactions()", +"e6a7638c": "eucledianDistance(uint256,uint256,uint256,uint256)", +"e6a8fe04": "evHarvest(address,uint256)", +"e6a9026b": "submitTransaction(address,uint256,string,bytes)", +"e6a9627c": "setAgentAddress(address,address)", +"e6a9b2d8": "createTAO(string,string,string,string,bytes32,address,uint256)", +"e6aa216c": "getExchangeRate()", +"e6aa96a5": "CRS()", +"e6aaae81": "tokensSoftCap()", +"e6aac98f": "currentDayTS()", +"e6ab96ed": "unstakeContent(bytes32)", +"e6abaaba": "tier_cap_2()", +"e6ac17a1": "tokens_total()", +"e6acca00": "_finishBet(address)", +"e6acf0c1": "determineOutcome(bytes32,uint8[],uint8[])", +"e6ad204e": "vestingAccounts(address,uint256)", +"e6ad5bc7": "getFrozenTimestamp(address)", +"e6adde32": "setIsHiddenMessages(bool)", +"e6ae0536": "UpdateBackedAmount(uint256)", +"e6ae1a97": "getTokenAmount(address)", +"e6ae89b4": "getPlayerInfoInRound(uint256)", +"e6ae92b0": "getItem(address,address)", +"e6ae967b": "updateOrder(bool,uint32,uint128,uint128,uint32,int256)", +"e6af2d5d": "TRICToken()", +"e6af35f0": "calculateFee()", +"e6b09e92": "setAd(string,string)", +"e6b1602f": "buyOneRabbit(uint256)", +"e6b18f52": "LongTermProjectTokensAddress()", +"e6b1c48d": "Amal()", +"e6b1e71c": "jackpot(uint256,uint256)", +"e6b35875": "getAllbetByGtype(int8)", +"e6b55ff3": "TokenEmissionEvent(address,uint256,bool)", +"e6b6f9d5": "baseDiscounts(uint256,uint256,string)", +"e6b71e45": "changeIncrease(address[],uint256[])", +"e6b827a6": "becomeSpermlord()", +"e6b950f3": "_computeCooldownRemainingTime(uint256)", +"e6b96447": "updateMaxNum(uint32)", +"e6b96fe3": "setupFund(bytes32,address,uint256,uint256,address,address,address[],address[],uint8,bytes32,bytes32)", +"e6b972f5": "userName(address)", +"e6ba54c1": "specialInfo(uint256)", +"e6bb64b4": "generateChampionTokens(address,uint256,uint256)", +"e6bb88b3": "setMinEscrow(uint256)", +"e6bbe9dd": "getMinThreshold()", +"e6bc2cc9": "Marcela_Birthday(string,string,string,string)", +"e6bc5269": "CrypexToken()", +"e6bc7d2a": "FairDistributionToken()", +"e6bcbc65": "mostSignificantBit(uint256)", +"e6bcc297": "STARTING_BANKER()", +"e6bd0eca": "newUser(address,string,uint256)", +"e6bd11b2": "availableBuyInShares()", +"e6bf3fdc": "removeFarmer(address)", +"e6bf6ca2": "check_deadline()", +"e6bf70e2": "register(bytes20,uint96,uint32,bytes32[],uint16)", +"e6c01488": "addComment(bytes32,bytes32,string)", +"e6c0459a": "right79(uint256)", +"e6c0e6d5": "discountRate()", +"e6c0e9e1": "randomDS_sessionPubKeysHash(uint256)", +"e6c160dc": "RateSetter()", +"e6c1beb4": "prepend(address)", +"e6c1d7fc": "getHedgeIndices(address)", +"e6c21c24": "isCertified(uint256,uint256)", +"e6c22a11": "district0xNetworkToken()", +"e6c25aa1": "totalPhase2Donations()", +"e6c28db4": "getPlayerSpaceshipCount(address)", +"e6c2dee8": "Vish()", +"e6c2f4fe": "SendmoneySend(uint256)", +"e6c3329d": "EthaToken()", +"e6c35a91": "batchAirDrop(address[],uint256[])", +"e6c3b4ab": "testBalanceAuth()", +"e6c4498b": "LOCKING_UNLOCK_TIME()", +"e6c4a46a": "_addRecord(bytes32,address,string,string)", +"e6c4c2c7": "admin_tokenAdd(uint256)", +"e6c50020": "callAllFromMew(uint256,address)", +"e6c52016": "setToken(address,uint256,address)", +"e6c54139": "BitmassXToken()", +"e6c57a08": "timeIncreasePerTx()", +"e6c5e94c": "setinterval(uint256,uint256)", +"e6c63912": "lastBlock_a17Hash_uint256()", +"e6c721e4": "senderDelegates(address,address)", +"e6c75c6b": "triggerEvent(string)", +"e6c7c456": "balanceOfContract()", +"e6c88b31": "auditor(uint256,bytes32)", +"e6c89d4a": "makeOfferForCityForSomeone(uint16,uint256,address)", +"e6c8fcf1": "getExpirationRequest(uint256)", +"e6c9f6ee": "shelf(string,address)", +"e6ca00b5": "_abortAllRounds()", +"e6ca0f47": "setStages()", +"e6cb9013": "safeAdd(uint256,uint256)", +"e6cbcba9": "PlusOnePonzi()", +"e6cbd74c": "TokenSold(uint256,uint256,uint256,uint256)", +"e6cbe351": "saleAuction()", +"e6cda5ff": "countDays()", +"e6ce1622": "ProcessMarkings(bytes32,uint256,uint256,uint256)", +"e6d02bf0": "unsubscribeCaller(address,address)", +"e6d04d5e": "whitelistedParticipants(uint256)", +"e6d09529": "getTTTCount()", +"e6d0a37d": "RemovePoolMember(address,string)", +"e6d0dfda": "setDiscountTime(uint256)", +"e6d1092d": "vestedTeam(uint256)", +"e6d17238": "specialWallet()", +"e6d17cfc": "_updateToken(uint256,uint256)", +"e6d18a7a": "nihilumBalanceOf(address)", +"e6d20a23": "king_of_returning_shirts()", +"e6d26bc6": "setTeamContractAddress(address,address)", +"e6d2ceab": "set_pool_percentage(uint8)", +"e6d30bf2": "finishMinting(bool,bool)", +"e6d343a5": "getTransContractLocked()", +"e6d3b85b": "getOwnershipForCloning(uint256)", +"e6d3f673": "distributeGeneratedPower(uint256)", +"e6d41b39": "isApprovedTransferer(address,uint64)", +"e6d44122": "limitPreSale()", +"e6d4d217": "addAddressToWhitelist(address,string)", +"e6d54815": "delSpecialPrice(address)", +"e6d55f3a": "buy10ktickets()", +"e6d61f70": "resetInactivityTimer()", +"e6d660dc": "UBT(uint256,string,uint8,string)", +"e6d66ac8": "sendTokens(address,address,uint256)", +"e6d76a76": "withdrawSynthetix(uint256)", +"e6d78add": "tokensPerWei5()", +"e6d7fd33": "TokenERC20(uint256)", +"e6d8a47a": "MIN_INVEST_BUY()", +"e6d8d435": "AMBASSADOR_ONE()", +"e6d944a7": "computeCurrentPrice(uint16)", +"e6d95eb8": "DSAuthorized()", +"e6d970aa": "registry(address,address,bytes32)", +"e6d9bb0f": "secondsUntilEnd()", +"e6da89cd": "addVestingForBeneficiary(address,uint256)", +"e6dab965": "startTrack(bytes32,uint256)", +"e6dad824": "withdrawFrom(uint256)", +"e6db38c7": "purchaseFromTime(uint256)", +"e6dba7e8": "EX()", +"e6dbf486": "setCLC(address)", +"e6dc3655": "_validateUrl(string)", +"e6dc85a3": "weiTotal()", +"e6dc992d": "buySquareAtAuction(uint8,uint256,address)", +"e6dd672c": "enterMainSale()", +"e6dd9a8d": "endBookings()", +"e6deb223": "addPlayerMapping(string,string,uint256,uint256)", +"e6deefa9": "deposit(address,uint16)", +"e6dff3b4": "whitelistInvestor(address,bool)", +"e6e05562": "getIslandPreviousOwners(uint256)", +"e6e08ba4": "openPreICOPrivate()", +"e6e13795": "_addEntry(bytes32)", +"e6e261b2": "getFundAllTx(uint256)", +"e6e2c041": "_removeDiscount(uint256)", +"e6e2e1cd": "VestFFTokens(uint256,uint256)", +"e6e35407": "startCoinFlip(bytes32,bytes32,bytes32)", +"e6e45ea2": "MyHumanStandardToken(uint256,string,uint8,string)", +"e6e46238": "idCount()", +"e6e5b492": "AirwayBill()", +"e6e623d5": "setTokenSymbol(address,bytes32)", +"e6e68cb3": "map(uint256,uint8)", +"e6e7237f": "claim_time_victory(uint256)", +"e6e84bf8": "Suren3Token()", +"e6e88593": "_contractStatus()", +"e6e8c692": "computeResponseFirstHalf(uint256,uint16)", +"e6e91cfc": "voidFailedPayment(uint256)", +"e6e93b14": "setbetEnd()", +"e6eb00ce": "drawingNo()", +"e6eb6867": "updateKey(bytes)", +"e6ecc9c1": "getReservedAmount(address)", +"e6ecf8a0": "CONTENT_FUND()", +"e6ed4746": "setBonus(uint8)", +"e6ed51b7": "createToken(uint256,address,address)", +"e6ed6c74": "getRabbit(uint256)", +"e6ee78bd": "approveRemoveOwnerRequest()", +"e6effbe9": "createAuction(address,uint256,uint256,uint256,uint256,address)", +"e6f02bf9": "computeBonuses(uint256)", +"e6f041c1": "testLessThan()", +"e6f0823c": "deleteNota(uint256)", +"e6f091f9": "isAccepted(address)", +"e6f0b6cf": "individualCapInWei()", +"e6f0beeb": "sort(uint8[4])", +"e6f1a189": "isCustomToken()", +"e6f3ae3c": "neighbor(uint256,uint8)", +"e6f46410": "RBC()", +"e6f47613": "multiSubWithdrawFor(address[],address[])", +"e6f4c4a7": "setOtherSettingOwner(address)", +"e6f602ff": "benTook()", +"e6f6266a": "numMinters()", +"e6f67ef2": "payOrganizer()", +"e6f6b789": "setInterfaceImplementation(string,address)", +"e6f6e19f": "emissionStage()", +"e6f7bf89": "GetOwnerAddress()", +"e6f7ec75": "populateTierRates()", +"e6f8263e": "JackpotPeriods()", +"e6f8298c": "cancelActiveLoanAtIndex(uint256)", +"e6f82ca3": "_clearBridgeTokenFee(uint256)", +"e6f859e7": "descriptions(uint256)", +"e6f9476a": "getContribPeriod()", +"e6f9f265": "areNoncesValid(bytes,uint64[],uint64[])", +"e6fafef0": "ContributionMinimumUpdated(uint256)", +"e6fb5c4a": "CHLToken()", +"e6fbf441": "transferFromSenderPaysFee(address,address,uint256)", +"e6fd2982": "initialReserve()", +"e6fd42ee": "currentHalving()", +"e6fd48bc": "startTimestamp()", +"e6fd604c": "cut()", +"e6febc9b": "investorWithdraw(uint256)", +"e6ff0853": "advisorsTokenWallet()", +"e6ffd50d": "OXGOLD()", +"e6fff409": "TetherGBP()", +"e7001b84": "setOwnedCount(address,uint256,uint256,bool)", +"e700d63a": "FeesConverted(uint256,uint256,uint256)", +"e700efc4": "MaxSupply(address,uint256,bool)", +"e701900c": "refundTransaction(bool)", +"e701a6d3": "handlePresaleTokenMany(address[],uint256[])", +"e701d051": "setMarketerRate(uint256)", +"e70265a5": "FRACTION_ETHER()", +"e7031501": "jackpotWinPercent()", +"e703e9c3": "CheckActivate()", +"e704430d": "numberOfTreasuryOfficials()", +"e70468b1": "cancelOpenBids()", +"e7046bf0": "setFx(address)", +"e704f151": "burnContributorTokens(address)", +"e7058e15": "Rollback()", +"e705a519": "SALE_1WEEK_BONUS()", +"e7062263": "checkEndorsementExists(bytes32,bytes32)", +"e706918c": "testToggleBitSuccess()", +"e7073a4c": "MarketplaceV2(address)", +"e7074de2": "FOUNDATION_TOKENS()", +"e7077a3a": "CCToken()", +"e7084b7e": "closeTimeout()", +"e7092b41": "getAllowance(address,address,address)", +"e7095e97": "mintTo(address,string,uint256,uint256)", +"e70990d7": "summon10()", +"e7099763": "client_wallet()", +"e709cd09": "ONDEONE()", +"e70addec": "right87(uint256)", +"e70b11df": "revokeAllocation(address)", +"e70b5259": "mapHeight()", +"e70b793a": "blankbreedingdata(uint256,bool)", +"e70c052a": "ethFundDepositAddress()", +"e70c3276": "HyipProfitTokenTeamAddress()", +"e70cd5ec": "destroyItemsStorage()", +"e70e690a": "set_gas_price_max(uint256)", +"e70e6ece": "BOURSETOKEN()", +"e70eb392": "claimReward(uint256,address)", +"e70f5d95": "setIV_R3(uint256)", +"e70fe5e3": "GenesisToken(address,uint256)", +"e7105795": "_raceOpened(uint256)", +"e710efc6": "regSpot(uint16,bytes32)", +"e711da27": "writeToStorage()", +"e71264fa": "addNewTokens(uint256)", +"e7127e29": "addressToTrainer(address)", +"e712b694": "comp_count()", +"e712bbad": "enterArena(uint256[4],address)", +"e71346f4": "removeAnimalIdFromCountry(uint256,uint256)", +"e7137dbf": "withdrawETH(address,address,uint256)", +"e713cda8": "returnUint32(uint32)", +"e714a028": "cancelWithdrawalRequest()", +"e7151828": "deathData_v1()", +"e7152a5c": "transferStar(address,uint256)", +"e715920f": "doBuy(address)", +"e717db5c": "CheetahCoin()", +"e717dc3d": "tax_fund()", +"e717ea61": "getCurrentAddress()", +"e718234d": "tokenLock()", +"e71897cd": "alfatokenteam()", +"e718ad01": "ReclaimPeriodChanged(uint256,uint256)", +"e718f7aa": "_Setting_Default_GameBoard(uint256)", +"e7199f82": "transferCentralBanking(address)", +"e71a02e1": "DELAY_PERIOD()", +"e71a402e": "mul_float_power(uint256,uint8,uint8,uint8)", +"e71a5577": "getNumPullRequests()", +"e71a7811": "completeOwnershipTransfer()", +"e71b49ad": "ADDR_TKG_ORG()", +"e71b7913": "expireTransfer(address)", +"e71b8b93": "bye()", +"e71bbf48": "TokenSyndicateFactory()", +"e71bdf41": "addDelegate(address)", +"e71c3b38": "LogSetRBInformationStoreAddress(address)", +"e71c9697": "placeBet(uint256,uint256,uint256)", +"e71d3ae2": "CYFR()", +"e71d77a7": "PRICE_CHANGE_TIME_STEP()", +"e71d7bf0": "testControlTransferNotEnabled()", +"e71df6d6": "acceptMembership(address,uint8,uint256)", +"e71e592b": "replaceDelegates(address[],address[])", +"e71ecf6e": "revenueShareCurrency(address)", +"e71efd18": "Mytoken(uint32,string,uint8,string,address)", +"e7201d7d": "masterOwner()", +"e720b4a7": "DEEM()", +"e720e1b3": "marmoOf(address)", +"e7211134": "createDAO(uint256,string,bytes32)", +"e7212728": "getFreeChicken()", +"e7225175": "timeoutSEC()", +"e722a522": "createContractPeriodicTable(string)", +"e7233ce7": "getAdIds()", +"e7239ed2": "getTimebasedBonusRate()", +"e723a8f9": "setFundraising(address)", +"e724529c": "freezeAccount(address,bool)", +"e7255ef9": "desiredOutcome()", +"e7271c34": "removeArts(address)", +"e7278231": "DesToken()", +"e727de55": "setEggPrice(uint128)", +"e7299675": "DroplexToken()", +"e729b416": "lockIndexes(uint256)", +"e729ebe8": "getSignatureParts(bytes)", +"e72b0e23": "CreateTUBE(address,uint256)", +"e72b6091": "extendSaleTime()", +"e72c40dc": "CoreTeamMinted(address,address,uint256,uint256)", +"e72c81cf": "demo1(address,uint256,bytes,string)", +"e72cba6e": "ICO_PHASE1_AMOUNT()", +"e72e46fd": "ImmlaIco(address,address,uint256,uint256,uint256)", +"e72eb439": "DogTestToken()", +"e72f4f2a": "s38(bytes1)", +"e72f5f63": "maxRandom()", +"e72f7a78": "finishCurrentGame()", +"e72f99ac": "deathData_a18()", +"e72fd4e1": "developerCut()", +"e72fee5d": "massTeamMsgHash()", +"e7302541": "convertOldToken(address)", +"e730e87a": "stageOneSupply()", +"e73140c1": "setPublicOfferingDate(uint256,uint256,uint256)", +"e7316a95": "_set10()", +"e731b034": "HawalaKickoffTime()", +"e731bb09": "cpn(uint256)", +"e7320f9e": "getGameMaxNumberOfBets(uint256)", +"e7326806": "transferOracle(address)", +"e7328000": "userTokenBalances(address)", +"e7329e71": "scheduleCall(bytes,bytes,uint256,uint256,uint8,uint256)", +"e732a7e1": "preAllocationsPending()", +"e7334156": "processNextDeposit(address)", +"e73471fa": "_mintNativeCoinsByErcToNativeBridge()", +"e735b48a": "updateDescription(string)", +"e735f667": "destroyChildren(uint256)", +"e7368a1f": "isOnSale(uint16,uint64)", +"e736f03c": "actived()", +"e7377ccb": "vestingMembers(address)", +"e7383c91": "ICOStarted(uint256,string)", +"e73886b0": "addLocked(address,uint256)", +"e738a7a5": "createDungeon(uint256,uint256,uint256,uint256,address)", +"e738cb69": "EventLogged(string,uint8,uint256,address)", +"e738d2b3": "claimingFee()", +"e7398fa3": "setTokenRate(address,uint256)", +"e73995cd": "setSale(uint256,uint256,uint256,address)", +"e739a4fe": "initialSeed()", +"e73a914c": "setDAO(address)", +"e73b7d77": "testControlCreateNewRevisionNotUpdatable()", +"e73b9e2f": "bridgeAmount(address)", +"e73c032b": "PRESALE_TOKENCAP()", +"e73c3c53": "pingOracle(uint256)", +"e73c6353": "Payroll(address,uint256,uint256)", +"e73c99a0": "METADOLLAR()", +"e73cba34": "getTicketRound(uint256)", +"e73cc2eb": "walletPeriodOf(address)", +"e73cf000": "EMIToken()", +"e73de430": "releaseAccount(uint8,address)", +"e73e5063": "setRewardManagerLimit(uint256)", +"e73fc0c3": "getTokenByName(string)", +"e740ce26": "DSToken()", +"e740f4fc": "card_start_first()", +"e7416f01": "lastBlock_a18Hash_uint256()", +"e7422d29": "sendBalance()", +"e742b943": "ispackagesaleSetup()", +"e742db66": "tokenTaxRate()", +"e742f18a": "Task(bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"e743892b": "escrowExpiration(bytes32)", +"e744052b": "FalconFarmer()", +"e745656b": "removeImmigration(address)", +"e7463688": "MasharibTestCoin()", +"e7477f1c": "WithdrawDeposit(uint256)", +"e74799b4": "TOKEN_MIN()", +"e747f31c": "debit(uint256,uint256)", +"e74803db": "putSaleRequest(uint256,uint256)", +"e74915d0": "distribute(address,uint256,address)", +"e74997a8": "transferInternal(string,address,string,address,string,uint256,uint256)", +"e74a19fa": "AirdropTokensHolder(address,address,address)", +"e74a48be": "reservedTokens(address,uint256)", +"e74a5847": "getGladiatorCooldown(address)", +"e74a84ea": "issueToken(address,uint256)", +"e74ab046": "increasePrice_20_January()", +"e74ac94a": "RetailLoyaltySystemToken()", +"e74b981b": "setFeeRecipient(address)", +"e74b9d11": "safeToSubtract(uint256,uint256)", +"e74ba7b3": "getMntTokensPerEth(uint256)", +"e74baeef": "Upgrade(address,bytes)", +"e74cd692": "testNextRune()", +"e74ceb77": "EGGS_TO_HATCH_1CHICKEN()", +"e74d6d1b": "getLeader(address)", +"e74e66d7": "toB32(uint256)", +"e74e6e9e": "GBMToken()", +"e74f3fbb": "claimVestedTokens()", +"e74f8eff": "firstDayTokenLimit()", +"e74ffbd5": "getPart(bytes32,uint256)", +"e750b5c0": "getProjectAddress(string)", +"e7514287": "IsGenesisAddress(address,address)", +"e7519ac0": "_setTokenName(address,uint256,string)", +"e751f271": "execute(bytes32)", +"e75235b8": "getThreshold()", +"e7528e1f": "createSubmission(string,bytes32)", +"e75303a5": "recentWinners()", +"e7530cfc": "_batch3_icosaleStartTimestamp()", +"e7542782": "Recovery(address)", +"e754a4e5": "presale2_startdate()", +"e75528cc": "buyBuilding(uint256,uint256)", +"e75539e7": "Schrodinger()", +"e7556704": "GPSToken()", +"e755aaaf": "takePoint(uint32,int256,bool)", +"e755e077": "MKToken()", +"e755e60f": "settleBetTest(uint256,bytes32)", +"e75623d8": "setDeploymentAdminsContract(address)", +"e75705c7": "submitFakeHeader()", +"e7572230": "getPrice(uint256)", +"e7574128": "abcToken()", +"e757835e": "Yotra()", +"e7579c24": "totalBuyerSupply()", +"e757c17d": "preSalePrice()", +"e75864e4": "StarsICO(uint256,uint256,uint256,address,address,address,address,uint256)", +"e758d445": "getCurrentTierInfo(address,bytes32)", +"e759dfb8": "investorsBatchSize()", +"e75a0747": "Staker()", +"e75afb65": "endCrowdfund(address)", +"e75b4642": "_decreaseAllowance(address,uint256)", +"e75b8b23": "getRecordById(uint256)", +"e75bd44a": "currentPrize(address)", +"e75bf79b": "ESEVENTYSEVEN()", +"e75bf820": "extraTokensHolder()", +"e75cdd7b": "isAddressInServer(uint256,address)", +"e75d1721": "vevcoin()", +"e75dcb19": "partnerSaleTokenPrice()", +"e75e69d6": "TryCoin()", +"e75ea9da": "preICOEndDate()", +"e75ef9b2": "trackSpend(uint256)", +"e75f02e3": "UraniumPlus()", +"e75f1634": "pearlSend(address)", +"e75f6e21": "totalMfr()", +"e7609c16": "getFarmer(address)", +"e760a11a": "attachContracts(address,address,address,address,address)", +"e760d284": "BOOKIES(uint256)", +"e760da9d": "createCP(address,string,string)", +"e760fb06": "groveAddress()", +"e7619fad": "allTokenIds()", +"e761eec6": "RecordTransfer(address,address,uint256)", +"e76240a4": "calcZWCAmountByToken(address,address,uint256)", +"e76261fb": "GetContractStateCancelledByLandlord()", +"e7637b5b": "deleteInfo(uint256,bytes32)", +"e7638445": "getRaffleTimeLeft()", +"e7651d7a": "normalProcess()", +"e7657e15": "ids()", +"e765bc5a": "thirdStageEnd()", +"e765c69a": "betOnDozen(uint256)", +"e765cb44": "auctionMinPrice()", +"e7663079": "owner_()", +"e766d79e": "CrowdsaleEndChanged(uint256,uint256)", +"e767b578": "createPlayerAndAssign(uint8,uint8,uint8,uint8,uint8,uint8,uint8,uint8,bytes,string,address)", +"e76895bf": "OwnerAdded(address,bytes32)", +"e7694493": "is_white_listed(address,uint256,bytes)", +"e7696a29": "updateWeedTotal(uint256,bool,uint16)", +"e769dfbd": "buyTransferFee()", +"e769f61f": "private_withdrawAll(address)", +"e76abcb9": "presaleBonusTier2()", +"e76b8126": "finish(address,address,address,address)", +"e76cc0d3": "failWithoutReason()", +"e76dd3ef": "returnBet(uint64)", +"e76e337d": "Honolulu()", +"e76e5ecf": "__DEBUG_BAL()", +"e76e9286": "depositPresale(address,uint256,uint256)", +"e76eabe5": "finishPreIcoAndStartIco()", +"e76ece01": "setInvestStart(uint256)", +"e76ed0e3": "DividendToken()", +"e76f0836": "getcurrNumOfCards()", +"e76f3d5a": "REFERRED_BONUS_PERMILLE()", +"e76f62cd": "Reissue(uint256)", +"e770390d": "deleteMultitoken(uint256)", +"e771066f": "marriageProof(bytes)", +"e7712a94": "MDTCrowdsale(address)", +"e7718594": "totalAccessories()", +"e771e193": "GetCountryCode(uint16)", +"e7722f9b": "isAddressInvited(address)", +"e773c82f": "bonusEnds2()", +"e773ffd5": "queryPlayerUnAwakeSkillIds(uint32[11])", +"e7740cf9": "revealPaper(string)", +"e7751e48": "ownershipAuctionCount(address)", +"e775781b": "getPopularity(bytes32)", +"e775f01f": "CAPToken()", +"e776a5b5": "wallet_address()", +"e776fa22": "AlphaconCrowdsale(bytes32[5])", +"e77772fe": "tokenFactory()", +"e777b97b": "LogRegisteredInterval(uint64,uint64)", +"e777d060": "removeProviderAdmin(address)", +"e7781f3c": "ToppedUp()", +"e77900e9": "projectMemberAddress()", +"e779a8cf": "airLimitCount()", +"e77a6daa": "tokenCalculate(uint256)", +"e77a912f": "prefilled()", +"e77aaee2": "enterRecoveryMode()", +"e77b077f": "canExchange(address)", +"e77b8d94": "ipow(int128,int64)", +"e77ba2c9": "checkIfMegaJackpotWinner()", +"e77c646d": "redeem(uint256,bytes)", +"e77cfa1c": "weiPending()", +"e77db232": "isKYCApproved(address)", +"e77dd5b3": "setSoftCapUSD(uint256)", +"e77df041": "LykkeTokenBase(address,string,uint8,string,string)", +"e77e02d3": "giveAdvisorsTokens(address,uint256)", +"e77ef21f": "drawdown()", +"e77f9906": "gameListOf(address)", +"e77ff2f6": "centralAuthority()", +"e77ff818": "privateSaleEndTime()", +"e780377e": "liquidityPoolAllocation()", +"e7804444": "allowMigrate()", +"e780f6c9": "setDestructionAddress(address)", +"e7810318": "updateInitialBonus(uint256)", +"e781d8c5": "getPC()", +"e7827e85": "unfreezeTokens(uint256)", +"e7829152": "prometh(address)", +"e782b172": "transferWithLockBatch(address[],uint256[],uint256[],uint256[])", +"e783bfb1": "totalAllocatedToTeam()", +"e7843949": "STATE_PAYOUT()", +"e784a923": "thisweek()", +"e7850f2d": "Sunny()", +"e78562c0": "dividendRecentBuyersPercentageDecreaseFactor()", +"e785bab2": "withdrawAdminRevenue()", +"e785daaf": "setUnownedPurchaseableMode(uint256,bool)", +"e786140e": "setBio(bytes3,bytes)", +"e78631fb": "changePhaseToICOweek2()", +"e78686eb": "reclaimContribution(address)", +"e78721af": "getSmartSharingByID(uint256)", +"e7873b58": "tokensBurned()", +"e787418a": "isSubmitted(uint256)", +"e787654c": "_forumIdToAddr(string)", +"e787887b": "initialRewardFraction()", +"e787b523": "CLKToken(address)", +"e788b5eb": "emitAreaSet(uint256,bytes32)", +"e78b8a37": "setPoolSize(uint16,uint32,uint16)", +"e78bfee0": "allocate(address,uint256,uint128,uint256)", +"e78c1136": "CreateLCD(address,uint256)", +"e78c219b": "takeBuy(address,uint256,uint256,address)", +"e78c3462": "betsOff(uint256)", +"e78ce8db": "getCarEarning(uint32)", +"e78ce986": "KOK()", +"e78cea92": "bridge()", +"e78d6306": "getBountyTransfers(uint256)", +"e78dd6f1": "mainSaleTokenLocked()", +"e78e3ab1": "ESOPOpened(address)", +"e78f5412": "_whichCourse(uint256)", +"e78fd9a8": "submitMint(address,uint256)", +"e78ff581": "getProposalPayloadHash(bytes32,uint256)", +"e7906208": "setA_Signature()", +"e790aa9e": "joinMountain(bytes32,address)", +"e791b66c": "Wemark()", +"e79206e6": "finishElections(uint256)", +"e7921023": "getHolderLink(address)", +"e79248ea": "setRelationFrom(uint8,address)", +"e7930d21": "DeliverToken()", +"e7933601": "getOverBalanceWEIInfo()", +"e7933d58": "setIcoPhaseAddress(address)", +"e7938b82": "minAllowedStakeInPercentage()", +"e79487da": "checkInvariant()", +"e7950ede": "logs(bytes)", +"e795c149": "FinalToken(uint256)", +"e79609e2": "getOrCacheDesignatedReportStake()", +"e7964b49": "sendeth(uint256)", +"e796570b": "isClearingPriceValidator(address)", +"e796818e": "AEFTOKEN()", +"e79695da": "WhitelistUpdate(address,bool)", +"e796a6eb": "refund(uint256,address,uint256)", +"e796c43c": "_cancelActiveAuction(uint40,address)", +"e797398f": "IsMultiFreeze(address,address[])", +"e797496b": "sigDestinationApproveAndCall()", +"e7977701": "setLotteryOptions(uint8,uint256,uint16,uint256)", +"e7979efa": "LOG_BetWon(address,uint256,uint256,bytes32)", +"e797ec1b": "enableMinting()", +"e7984a3b": "updateRewardForContributor(address,uint256,string)", +"e7986466": "setSupportedToken(address,bool)", +"e798f4eb": "webpud()", +"e7990596": "getAddressAndBalance(address)", +"e7992845": "pendingInstallments()", +"e7996f07": "removeAttribute(bytes32)", +"e799f374": "fundingMaxInWei()", +"e79a198f": "unregister()", +"e79ab547": "bulkTokenSender(address[],address[],uint256[])", +"e79b4388": "LogBidExpired(uint256)", +"e79d0860": "partnerCount()", +"e79e0a22": "getEthers(uint256)", +"e79e2bd3": "updateArea(uint256)", +"e79e770f": "EmergencySafe()", +"e79faa58": "unpause(string)", +"e79fb53c": "setUSDEtherPrice(uint256)", +"e79ffa11": "_dev()", +"e79ffa99": "getpurchasersLength()", +"e7a01215": "right2(uint256)", +"e7a01352": "adjustHardCap(uint256)", +"e7a02352": "MintDarioToken(address,int256,uint256)", +"e7a0459a": "setCatalogPlayersAddress(address)", +"e7a05f08": "isTokenSaleToken(address)", +"e7a17d83": "emitTaskCreated(uint256,uint256)", +"e7a25bfc": "JustEscrowTestCoin()", +"e7a2e28e": "fishbank()", +"e7a33822": "seal(address,uint256)", +"e7a35405": "managerAddressNumberMap(address)", +"e7a3c218": "testFail_mint_without_add_authority_to_controller()", +"e7a4581a": "getCirculationSupply()", +"e7a49c2b": "trustedTransferTokens(address,uint256)", +"e7a4d9d3": "LIQUID_TOKENS()", +"e7a60a9c": "getValidatorAtIndex(uint256)", +"e7a6e75c": "ETH_USD_rate()", +"e7a7043d": "addPrecommitmentAdjustment(address,uint256)", +"e7a83c74": "AT()", +"e7a8a5cb": "setTier(uint256)", +"e7a95a7f": "WHOLESALE_THRESHOLD()", +"e7aa3afc": "getProjectStatus()", +"e7aa8ed5": "CrowdsaleMCS()", +"e7aab290": "set_s(string)", +"e7ab4f1c": "getShareholderArray()", +"e7ac4df8": "launchInvestment(uint256)", +"e7ac81e5": "productSold(uint64,uint32,string)", +"e7acaa1e": "createJob(bytes32,address,address,uint256)", +"e7acb2b4": "ZitronSupply()", +"e7acdcd0": "deleteInvest(uint32,uint32)", +"e7aef169": "refreshInvestor(address,address,uint256)", +"e7aefd01": "allowTransfersEnabled(bool)", +"e7af4540": "ChiyouCulturalAcchain(uint256,string,uint8,string)", +"e7afae52": "WayCellToken()", +"e7b0f666": "totalPaid()", +"e7b172ed": "GAS_PRICE_LIMIT()", +"e7b1983e": "giveReward(uint256[4],uint32,uint8,bool,uint32[4])", +"e7b1a7ae": "collect_fee(string)", +"e7b1d43c": "withdrawVotingRights(uint256)", +"e7b1d6dd": "setServerStatus(string,uint256)", +"e7b2d7e5": "deprecateAndUpgrade(address)", +"e7b3387c": "getVoteCount()", +"e7b379c6": "TokensUnlocked(address,uint256)", +"e7b43c44": "changePuzzle(uint8,uint8,uint8,uint8,uint8)", +"e7b48d98": "getBurningMans()", +"e7b48f74": "get(int256,address)", +"e7b4e5ab": "entrants(uint256)", +"e7b512ec": "setAddress(bytes32,bytes32,address,bool)", +"e7b5d97d": "getMyReferralDividends()", +"e7b6135d": "getClown(uint256)", +"e7b6805b": "OriginalMyIdRepository()", +"e7b686a7": "UnpackEntity(bytes)", +"e7b69e74": "interest(uint256)", +"e7b6ff08": "beerAndHookersCap()", +"e7b70b38": "getPurchaseInfo(uint256,uint256,uint256,bool,uint256,uint256)", +"e7b7aea5": "changesp2(address)", +"e7b7c2a6": "setup(uint256,uint256,uint256,address,uint256,uint256,string,address,address)", +"e7b808ea": "getAccountFeeModifiers(address)", +"e7b83730": "tokenAmount(uint256,uint256)", +"e7b89977": "setFeeAccount2(address)", +"e7b8d977": "editionsOfType(uint256)", +"e7b94df4": "donationWallet()", +"e7b9aaef": "FIRST_VOLUME_BONUS()", +"e7b9db8d": "confirmBurning(uint256)", +"e7ba1012": "supplyController()", +"e7ba2cc8": "BelottoCrowdsale(uint256,uint256,uint256,uint256,uint256,address,address,address,address,address,address)", +"e7ba6c46": "resetReservations(address,bool)", +"e7bb22cd": "getValidClassId(uint64,address)", +"e7bb5233": "crowdsaleState()", +"e7bbda11": "heroCore()", +"e7bd85ca": "PFGC(uint256,string,string,bool)", +"e7be5617": "setOracleReference(address,address)", +"e7bf5352": "_withdraw(uint128,address,uint256,uint128)", +"e7bf7b08": "GroupCreated(uint32,uint256)", +"e7bf7dfc": "getProductPrice(uint256)", +"e7bfcf57": "HighCoin()", +"e7bfdc93": "clearLevels()", +"e7c0bd15": "SeedLog(address,bytes32,uint256)", +"e7c0dad5": "checkApprovalRatio()", +"e7c0e558": "BoomerangLiquidity(uint256,address)", +"e7c12837": "getPOOL_edit_24()", +"e7c158c6": "_setStrengthValue18(uint256)", +"e7c17972": "btcToTokens_(uint256)", +"e7c4118a": "certIssued()", +"e7c5c27f": "saleOpen(address)", +"e7c5d907": "Broker(bool)", +"e7c6229a": "publicOfferingHolder()", +"e7c6978e": "RSCCoinCrowdsale(address,address)", +"e7c77c80": "getAmountDailybyNum(uint32,uint8[4])", +"e7c8d171": "getTotalWidth(uint16,uint16)", +"e7c8dd6d": "GemsToken()", +"e7c8f61e": "enableAura(uint256,uint256)", +"e7c957c0": "MultiTransact(address,bytes32,uint256,address,bytes)", +"e7ca1343": "setReserveForCompany(address)", +"e7ca438d": "getUserDisplay(address)", +"e7cc62bd": "total_users()", +"e7cc862b": "storehouseIndex(uint256)", +"e7cc8ded": "generateLockupTokensDelegationSchemaHash(address,uint256,bytes32)", +"e7cd4a04": "addWhiteList(address)", +"e7ceaeab": "getTrackOwner(bytes32)", +"e7cf0171": "enableTokenClaiming(bool)", +"e7cf514d": "setMinOrderEthAmount(uint256)", +"e7cf548c": "getBurnCount()", +"e7cf6fcb": "changeEtherTxLimit(uint256)", +"e7cf7b34": "ICO_PRICE3()", +"e7cfafce": "getBirthMonth()", +"e7d00518": "FinishTokensale()", +"e7d0242b": "totalWeiCollected()", +"e7d03e93": "setMaxiumInputEther(uint256)", +"e7d0c552": "getRoyaltyPartners()", +"e7d0c7e7": "timeStampOfCrowdSaleStart()", +"e7d11a44": "getFutureTransByIdx(uint256)", +"e7d137ec": "balancesAddressDescription(address)", +"e7d1a024": "NewOne(address,uint256,uint256)", +"e7d2340f": "playervanity(address)", +"e7d29d8b": "withdrawExtraToken(address)", +"e7d29e38": "addHolderAddress(bytes32,address)", +"e7d2c590": "showCompany(uint256)", +"e7d2f315": "totalSupplys(address[])", +"e7d3fe6b": "mint(uint256,uint256,address)", +"e7d4761b": "unhalt_15day()", +"e7d47c2e": "selflleryManagerWallet()", +"e7d48741": "allOldUsers(uint256)", +"e7d4fd91": "getTokenControlInfo(address)", +"e7d50e5c": "FarmShare()", +"e7d53fcb": "privateSale(address)", +"e7d5a62b": "testNot()", +"e7d80c70": "getOrderCreator(bytes32)", +"e7d854af": "setWithdrawABIHash(bytes32)", +"e7d86204": "registerTeamScores(uint256[])", +"e7d87cda": "arbTokenExists(uint256)", +"e7d8c7db": "MicroToken()", +"e7da257f": "highestBidderCC()", +"e7daaa5a": "OwnerManager()", +"e7dac983": "submitClaim(uint256,uint256,uint256,uint256,uint256)", +"e7dafdb6": "transfer_token(address,address,uint256)", +"e7db6770": "startWork(uint256,bytes32,bytes32,address)", +"e7dde9a3": "_setDailyLimit(uint256)", +"e7de559c": "contrDividends(uint256[])", +"e7de72a4": "createFlag(uint16,uint256)", +"e7dee968": "KittyCore()", +"e7df2f3e": "disburseAddr()", +"e7e00d1d": "assignTestAddresses(bool)", +"e7e024ce": "janwin(uint256,uint256)", +"e7e0ca7b": "tariffIndexForAmount(uint256)", +"e7e10490": "cancelSale()", +"e7e1e69f": "commitBid(bytes32,string)", +"e7e2aa0e": "buyer_cancel()", +"e7e31d52": "setNinjaKindCount(uint8)", +"e7e31e7a": "addSpender(address)", +"e7e3411d": "fechBalanceByAddress(address[])", +"e7e3e167": "rate(address,int256)", +"e7e481c5": "BP_SPARTAN()", +"e7e52369": "firstMembershipPurchase()", +"e7e6aed1": "test_testableStandardCampaignContribution()", +"e7e766ca": "CSCRarePreSaleManager()", +"e7e7e3e8": "ETHEREMON_PROCESSOR()", +"e7e8116e": "forceTransferTokenOwnership()", +"e7e96a43": "getPOOL_edit_2()", +"e7e9e106": "rewardVote(address,address,uint256)", +"e7e9f385": "notarise(bytes32)", +"e7ea3d2d": "usernames(bytes16)", +"e7ea4406": "Civiq()", +"e7ea8065": "setNameRefer(string,address)", +"e7ea8122": "isStateInitializing()", +"e7eaaa05": "totalAvailableForSale()", +"e7eb285f": "stepEtherValue()", +"e7ebc348": "nonActivationWithdrawal(address[2],uint256[8],uint8,bytes32[2])", +"e7ec6aef": "getSigners(bytes32)", +"e7ec8182": "issueTeamTokens()", +"e7edab45": "_cancelParticipation()", +"e7ee6ad6": "rate(uint256)", +"e7ee85a5": "quickBuyPath(uint256)", +"e7eed1f7": "getCurrentPot()", +"e7efcfc2": "totalPayoutAmount()", +"e7f034c1": "getUri(address,uint256)", +"e7f0a865": "transfertokenContract(address)", +"e7f1111e": "initializeHolding(address)", +"e7f18249": "insertShareholder(address)", +"e7f1c468": "UserSold(address,uint256,uint256,uint256,uint256)", +"e7f23cb1": "getCallStack(uint256)", +"e7f35484": "NewAquarium(address)", +"e7f4037a": "demintTokens(address,uint8)", +"e7f40d35": "IntervalBytecodes()", +"e7f44523": "ReceivedLTC(address,uint256,string)", +"e7f4767c": "delimiter()", +"e7f56111": "ClaimPayout(uint8[],bytes32[],bytes32[],bytes)", +"e7f578e1": "createDoc(string,string,string)", +"e7f6edbd": "holdingTax()", +"e7f9e408": "stopTransfer()", +"e7fa443e": "unlockCashpledge(bytes32)", +"e7fa6883": "investFor24Months(address,uint256,uint256)", +"e7fa7969": "assertEq25(bytes25,bytes25)", +"e7fac728": "friendsFingersRatePerMille()", +"e7faecec": "testFailInsufficientFundsTransfers()", +"e7fb5388": "exit(string)", +"e7fb74c7": "buyItem(uint256)", +"e7fbee28": "checkIfCustodiesServedBBD(address[])", +"e7fc4b64": "ricardianVoucher(uint256,string,uint8,string,string,string,uint8,uint8)", +"e7fcde9b": "setFeeType(uint256,uint256,uint256)", +"e7fcf520": "signToResetTokenControlInfo()", +"e7fd9a13": "addEmployee(address,uint256)", +"e7fdc514": "buyFromVault(uint256,uint256,uint256)", +"e7fde97a": "_withdrawDividends(address)", +"e7ff0e38": "bountyDistributed()", +"e7ff8901": "transferWine(address,bytes32)", +"e8001e93": "sellerApprove(address,uint256,bytes32)", +"e80080d0": "cancelBurnRequest(uint256,string)", +"e80160ab": "order(bytes32)", +"e8017bb7": "getHTLCSpendingHash(int256,bytes32)", +"e801a361": "tileTimeoutTimestamp(uint256,address)", +"e8022dc9": "PLAgreements(address,address)", +"e8024468": "getHeroRequiredGoldForLevelUp(uint256)", +"e8024d75": "eNomCoin()", +"e8025d77": "changeStatus(uint256)", +"e8038e25": "TokenSale(uint256,uint256,address)", +"e803b708": "setDetails(string,uint256)", +"e803bcc6": "SetPriceIncrease(uint16)", +"e8046759": "decimals_multiplier()", +"e8055e9c": "burnExcess(uint256)", +"e8069e84": "verify(bytes32,bytes,address,address)", +"e806c603": "robottradingToken()", +"e8071f30": "exponential_decay(uint256,uint256)", +"e8078d94": "addLiquidity()", +"e8083863": "finalizeAuction(uint256)", +"e8088ca2": "GetEvaluate(bytes32,uint8)", +"e808aef7": "isIcoSuccess()", +"e808d671": "crowdsaleTokenMint()", +"e809046f": "NumeraireBackend(address[],uint256,uint256)", +"e80919d5": "mintUnderCap(uint256,uint256)", +"e80a4df7": "NotusNetwork()", +"e80b128f": "tournamentsAddr()", +"e80b7ab6": "clearArray()", +"e80bd3e5": "addCertificationDocumentToSelf(bytes32)", +"e80c4182": "ShresterToken()", +"e80d2ef8": "calculatesubscribersell(uint256)", +"e80d47dd": "USDSTEMPRICE()", +"e80d60b8": "CryptohomaToken()", +"e80db5db": "coreContract()", +"e80f23aa": "tokenApprovalWithSignature(address,address,address,uint256,uint256,uint256,bytes32,bytes)", +"e80f72c0": "getTransactionFromProposal(uint256,uint256)", +"e80fd970": "etherToSendDev()", +"e810267a": "dateEcoRelease6()", +"e8107ed4": "ElectriumToken(uint256,string,uint8,string)", +"e81140a8": "setPreICOStartTime(uint256)", +"e811f50a": "collectedFee()", +"e8125eb9": "updateContractTokenBalance()", +"e814018d": "getCrowdsaleHardCap()", +"e8141f93": "logUint(int256,uint256)", +"e8144c42": "advisorsTokensLock()", +"e8147a25": "changeMinBet(uint256)", +"e814c941": "removeParticipant(address[])", +"e815b60d": "SencToken()", +"e8168177": "lastBlock_a2()", +"e816a515": "takeFlight()", +"e816f76f": "Association(address,uint256,uint256)", +"e8171f37": "valueOfScheme(uint256)", +"e81766e8": "AgriChainDataContract()", +"e8179abf": "getStar(uint256,string,string)", +"e819172a": "TestCoin2()", +"e8197a4b": "totalSuppliedAfterLock()", +"e81a6c58": "issueRefundIfNecessary(uint256)", +"e81b34af": "_deployContract()", +"e81b3c88": "CardCount()", +"e81b53d0": "computeCost(address,bytes32,bool)", +"e81ba080": "updateMaxCap(uint256)", +"e81c17a1": "setOwnerAt(uint16,uint16,uint8,address)", +"e81c2fec": "reDistribution()", +"e81ca129": "consumeTicket(address,uint256)", +"e81cf24c": "replace(uint256,uint256)", +"e81d53cf": "arr()", +"e81d6c6f": "reserveY2()", +"e81dd181": "callSoftCap()", +"e81e0a09": "Win(address,uint8,uint256)", +"e81e1ccc": "withdrawDonation()", +"e81e935a": "summPrivateSale()", +"e81ecb4c": "received(uint64)", +"e81f0154": "pipeIndex()", +"e81f02b6": "withdrawFrom(address,address)", +"e81f35fd": "setLastTokenId(uint256)", +"e81fdd77": "restCandy()", +"e8203e38": "emitWithdrawn(address,uint256,address)", +"e820a32f": "vetoPayout(uint256,uint256)", +"e820ce4a": "setCTime(uint256)", +"e8211eeb": "setUpDistribution(address[],uint256[],uint256)", +"e8223468": "sha3clone(bytes)", +"e8227611": "setRealisation_effective(uint256)", +"e8238688": "setTokenVestingFactory(address)", +"e823b9bf": "toInt256Safe(uint256)", +"e823da03": "VKBToken()", +"e823fa20": "checkDragonStatus(uint256,uint8)", +"e8244d48": "changeHouseEdge(uint256)", +"e824b9c7": "moftakToken()", +"e827653c": "referalCount(address)", +"e827b3e2": "latestPost(address)", +"e827f7f3": "request(bytes32,string,uint256)", +"e827ff89": "HDToken99(uint256,address)", +"e82898b3": "loser()", +"e828a293": "TestyToken()", +"e82906b3": "ISCoin(address)", +"e82935da": "like(uint256)", +"e8294aad": "bonus1Ends()", +"e8297da2": "defaultLockInDuration()", +"e829945a": "buyProperty(uint16,uint256)", +"e829a171": "MIN_GET_AMOUNT_FINNEY()", +"e829d86d": "releaseAgents(address)", +"e82a7d8d": "submitAnswer(address,uint256)", +"e82aa31f": "createTeam(uint256[])", +"e82b7cb2": "proxySetCosignerAddress(address,bytes32)", +"e82bef29": "fundAddress()", +"e82c6e7b": "totalTokenSales()", +"e82c6e8a": "mintFirstTokens(address,uint256,uint256[])", +"e82cc47f": "getFundInfo(bytes32,string,address,address)", +"e82d777c": "FHCContract()", +"e82db7a0": "Batman(uint256,string,string)", +"e82ed40c": "communityContributionWithdraw(uint256)", +"e82f7dd4": "testThrowsRetractLatestRevisionNotUpdatable()", +"e83007b2": "RunLottery()", +"e83029bb": "checkbalance(address)", +"e8303659": "ETHER_CAP()", +"e8307d00": "setMinPurchase(uint256)", +"e8315742": "maxTokens()", +"e831884e": "getPhaseAtTime(uint256)", +"e832b482": "channelConfiguration(uint64)", +"e832fda3": "select_at(uint256)", +"e833bb53": "FLKDForGas()", +"e833cc12": "getNamespace(uint256)", +"e83400f6": "getBudgetOfCampaign(bytes32)", +"e83447d0": "breakLink()", +"e834a834": "claimed()", +"e834e89c": "FlexCoin()", +"e8350fae": "proclaimInactive(uint8)", +"e8358025": "isCrowdSaleFinalized()", +"e835852b": "LogQueryFeeSet(uint256,uint256)", +"e835dd27": "STAKE_MIN_AGE()", +"e837ab59": "getParticipantByAddress(address)", +"e8380983": "BChain(uint256,string,uint8,string)", +"e83851f8": "EtherAsteroid()", +"e8387af8": "_mint(int256,address,uint256)", +"e839554e": "getBasicCentsPricePer30Days()", +"e839e65e": "query2(string,string,string)", +"e83b2adf": "PTestYankeeCoin(uint256,string,string)", +"e83ba1fe": "stageFundGoalReached(uint8)", +"e83c0bba": "setEmployeeTokenAllocation(address,address,address[],uint256[])", +"e83c272c": "setTime2(address,uint256)", +"e83c460d": "TimeWeekOne()", +"e83c78d4": "toggleContractStopped()", +"e83ce1f9": "addAddressAlias(address,address)", +"e83cf468": "sendBattleTokens(address,uint256)", +"e83d1c5e": "LatestRechargeTime()", +"e83d589b": "getLLV_edit_24()", +"e83ded8e": "balanceOfLockTime(address)", +"e83dfe5a": "ConcludeChallenge(uint256,string)", +"e83e0359": "dividendsRightsFixUpdate_(address,uint256)", +"e83e34b1": "maxFees()", +"e83e92ac": "setSalesFee(uint256)", +"e83f682a": "beginContinuousSale()", +"e8400be5": "startBetting(uint32,uint32)", +"e840c116": "SocialNote()", +"e8421b94": "PlayToken()", +"e84221ef": "playBigOrSmall(uint256,uint256)", +"e8425467": "USDDecimals()", +"e8429510": "TokenForInvestor(uint256,uint256,uint256)", +"e8436936": "StatsMinted()", +"e8436ca5": "setMainCampaignStatus(bool)", +"e8443708": "PaygineHasDeployed(uint256)", +"e844ca34": "withdrawTokensToAdvisors()", +"e844cb18": "batatacoin()", +"e844d097": "addCandidate(uint256)", +"e845105c": "countriesLockEndingAt()", +"e846e7c0": "drawPeriod()", +"e846f1f4": "collectPercent(uint256)", +"e846f997": "contributionWallet()", +"e8474230": "getHybridizationFullPrice(uint256)", +"e8477bda": "setBuyMaxLimit(uint256)", +"e847ca9c": "BAXI()", +"e84818bc": "largeContribPercentage()", +"e8489626": "setProxy(address,address,bytes32)", +"e848aba2": "addWhiteListUsers(address[],uint256[],uint256[])", +"e849ec8c": "ChangeTokenContractOwner(address)", +"e84a481b": "adddotchtooffer(uint256,uint256)", +"e84b53bd": "addItemTo(address,uint256,uint256,uint256,uint256)", +"e84b69e4": "editTimer(uint8,uint256)", +"e84c9d5c": "removeWhitelister(address,address)", +"e84d2abf": "inMainSalePeriod()", +"e84d90c0": "checkDisabledStatus()", +"e84d92e8": "_getBridgeNativeFee(uint256)", +"e84f7054": "refundMyIcoInvestment()", +"e84f82f0": "emitBegin()", +"e85034a2": "walletTrade(address,uint256,address,address,uint256,uint256,bool,bytes32)", +"e85061ca": "playerAction(uint256,uint8)", +"e850899a": "StartPreSale()", +"e850a8ef": "payTo(address[])", +"e850e4c4": "GetContractStateEarlyTerminatedByLandlord()", +"e850efaf": "setRegionTax(uint16,uint8)", +"e850f3ae": "getGenerationIdForCall(bytes32)", +"e851808e": "CHARITYSEACOIN()", +"e8518341": "transferOwnershipWithHowMany(address[],uint256)", +"e8518be0": "requestReplaceOwner(address,address,string)", +"e8518dc6": "rateWithBonus()", +"e85230e9": "minETHin()", +"e85353e1": "admin_set_withdraw(address,bool)", +"e85365d5": "firstblock()", +"e8539244": "SetPayrollLocked(bool)", +"e85393d7": "WithdrawEmergency()", +"e853cda3": "checkKncArbitrageRate(uint256)", +"e853ce64": "joinTeam(uint256,uint256)", +"e854d135": "executeWill(address)", +"e854dfb4": "Order(address,uint256,uint256)", +"e854eeb3": "fciDecimals()", +"e85501d8": "revokeRequest()", +"e8554e8b": "getRaceBaseStats(uint256)", +"e855aee5": "_mint(uint256,address)", +"e8561d36": "cashBackFromProject(address,address)", +"e856528a": "mul(uint128,uint128)", +"e8580dd4": "Survey(address,uint256,string,bytes32[])", +"e85ac5b0": "ownerSetAuditor(address)", +"e85b26c0": "createClaim(address,uint256)", +"e85ca2a4": "bitcoin_multisig_vault()", +"e85dcfe8": "ScheduleTransaction(string,uint256,uint256)", +"e85de8e7": "valueInUSD()", +"e85e0bd7": "addToken(uint256,uint256,uint256)", +"e85e3d92": "LongClosed(address,uint256)", +"e85efc50": "assertEq(uint256,uint256,bytes32)", +"e85f3be6": "TOSPrivateHoldingContract()", +"e85f3fb0": "setAuthorizedSpender(address)", +"e86142b5": "orderOnSaleAuction(uint256)", +"e861c4f1": "dividendEndTime()", +"e861dc85": "VETO_PERIOD()", +"e861e34d": "minInvestInWei()", +"e861f077": "HaltStatus(bool)", +"e8625060": "testDisputedInvalidSequenceWrongWriteValue()", +"e863051c": "SmartForestCoin()", +"e86310eb": "exp(address,address,uint256)", +"e863a122": "getPercentageCW()", +"e863d8cc": "repeatedPayment(address,uint256,uint256,uint256)", +"e863f0d3": "acknowledgeOrder(uint256)", +"e8641652": "strCompare(string,string)", +"e86434ef": "startRefundPayment(uint256,uint256)", +"e864f2b6": "exchange(address,uint128)", +"e864fd27": "checkCap(uint256)", +"e8665638": "bonusVestingPeriod()", +"e866d302": "setJackpotWinCount(uint256)", +"e86701e0": "playerFlight(uint256,uint16)", +"e8672de9": "removeRatePlan(uint256)", +"e8679512": "getTransformInfo(uint32)", +"e867ecda": "setPricing(uint256)", +"e8685ba1": "getNumOfCandidates()", +"e8689bf8": "_emitUserRatingGiven(address,address,uint256)", +"e868b55e": "createReaderWriter(bytes32,address,address,bytes32)", +"e868cd17": "ManUnitedSC()", +"e86994ea": "getPropertyColors(uint16)", +"e869d45f": "registerScheme(address,bytes32,bytes4,address)", +"e86a3b8b": "WSIPrivateEquityShare()", +"e86a9b1e": "Custodian(address[],uint256,uint256,address)", +"e86afde0": "description(uint64)", +"e86ba262": "getTimeLimitForReplyOnProposal()", +"e86ba99d": "tryFinalizeProposals(uint256[],address[],bool[])", +"e86bf267": "takeCfd(uint128,address)", +"e86c6431": "isTransferManager(address)", +"e86c87d3": "func_0778()", +"e86cf04b": "TinyProxy(address,uint256)", +"e86d24ca": "getSmartSharingByHash(bytes32)", +"e86d86ea": "totalTransferWhitelistMapping()", +"e86dad29": "assetArray(uint256)", +"e86dea4a": "feeNumerator()", +"e86e3f2a": "setArrIntF1StrF2(int256[],string)", +"e86e52ec": "isBlocked(address,uint256)", +"e86f2c75": "mainSaleSecondBonus()", +"e86f6699": "isWhitelistedAddress(bytes32,uint8,bytes32,bytes32)", +"e870a88e": "setnumMax(uint16)", +"e870bec1": "logging(uint256)", +"e871614a": "getResponseUint(uint256,bytes32)", +"e871f35f": "addCourse(string,uint256,uint256,string,string)", +"e872a05e": "addrMine()", +"e873d02d": "cap2(address)", +"e8742b55": "setComment(string)", +"e87508be": "investorDeposit()", +"e8755d00": "setServiceFee(uint256,uint256)", +"e8756037": "finishExchange()", +"e8757d19": "donations()", +"e875bfbc": "getMinimumFunds()", +"e8763023": "ProofOfAwareness()", +"e876bdef": "getEtherRaised()", +"e876c273": "TotalSupplySet(uint256)", +"e876e3f1": "investorsFee()", +"e87752f4": "icsToken()", +"e8777158": "grantVested(address,address)", +"e877e541": "bankuToken()", +"e877f910": "sendToContract(address,uint256,bytes)", +"e8787040": "ElevenElevenToken()", +"e8789d88": "getEndTimeOfStage(address,uint256)", +"e878d65f": "QIUToken()", +"e879790a": "HHRFallback(address,uint256,uint256)", +"e87a0a59": "EIB()", +"e87a9d84": "phase1AccountTokensMax()", +"e87aa769": "_getShinyPurity(uint16,uint16)", +"e87b0242": "ADVISORS_LOCK_DATES(uint256)", +"e87bbdbb": "spawn(bytes32,address,address)", +"e87c05c6": "restSupply()", +"e87c0ee6": "getGameCount()", +"e87c1463": "bidTicket(uint256)", +"e87da468": "addChild(bytes32,bytes32)", +"e87df70e": "fivetimes()", +"e87e77fe": "switchAirdrop()", +"e87ea055": "checkCurrentStage()", +"e87ed8b5": "RTB2()", +"e87f41bb": "deleteInvestorTokens(address[],uint256[])", +"e87ff056": "getTeamByPosition(uint8)", +"e8801360": "soldTokensCounter()", +"e8814606": "CryptosisToken(uint256,string,string)", +"e882f844": "DINAR()", +"e883429a": "isTransferAllowedteam()", +"e8836183": "blockLock()", +"e88390aa": "coinSendDifferentValue(address,address[],uint256[])", +"e883d157": "outstandingPower()", +"e88499a9": "claimPayout()", +"e8850978": "reportMissingChunk(bytes32,uint256,uint8,bytes32,bytes32)", +"e8853e32": "getData_28()", +"e8854cfd": "getPointer(uint256)", +"e885910f": "trackCrowdsale(address)", +"e885b81f": "Bonuslist(address)", +"e8862924": "decodedLocksroot()", +"e886dade": "bulkTransfer(address,address[],uint256[])", +"e887841e": "to(uint256)", +"e8878b11": "wakeUpProxy()", +"e88810ff": "presalePiDiscount()", +"e8884aee": "_useFromDailyLimit(uint256)", +"e88885fa": "price1Of(uint256)", +"e888e445": "CatalogoOuvidorias(bytes32,uint8,bytes32,bytes32,int256)", +"e88a728f": "getAssetIdOwnerAndOIndex(uint256)", +"e88ab341": "contributorsVestTokenAllocation()", +"e88b0067": "mintInvestment(string,string,uint256,address,uint256)", +"e88b8ac6": "confirmAndCheck(bytes)", +"e88b9436": "MYR_Omnidollar()", +"e88bc2ba": "Variation(address,address)", +"e88c6a8a": "moveToken(address)", +"e88d27eb": "registerProperty(string,string,string,string,string)", +"e88d9567": "changeDepositFee(uint256)", +"e88dc5b7": "rewardPeriod()", +"e88eff06": "setUserRoles(address[],bytes32[],address[],uint8[])", +"e88f3a86": "addBonusToBlock(uint256,uint256,uint256)", +"e88f4510": "LigerToken(address,address,address,address,address)", +"e88f4c6f": "usedCoreSupply()", +"e88f97bd": "query2_fnc(uint256,string,string,string,uint256)", +"e8903656": "executeSubscription(uint256)", +"e8906a2d": "addSigners(address[])", +"e89152ac": "ItemReceived()", +"e8916af9": "addLicenseTerms(bytes32,bytes32,bool,uint256,bool,uint256)", +"e891c9db": "validateWithdrawalSignature(address,uint256,address,address,bool,uint256,uint8,bytes32,bytes32)", +"e8927fbc": "increase()", +"e8928f7a": "setMaxWei(uint256)", +"e8930efd": "Investors(address)", +"e8932ea1": "burnClosedTokenInternal(bytes32)", +"e8936b29": "liveSince()", +"e894000b": "authorizedPower()", +"e89401a1": "multihash(bytes32)", +"e894326c": "addDepositCreator(address)", +"e8944564": "test_insert_findWithHintPrevRemoved()", +"e894f117": "TokenTimelock(address,address,uint64)", +"e8959b94": "addUser(int256)", +"e8974832": "levelTwoBonus(uint256)", +"e89826ac": "addGame(string)", +"e89876d6": "POSController(address,uint256,uint256,uint256,uint256)", +"e89927ef": "voteForCandidate(string)", +"e8992d40": "additionalTotalSupply(uint256)", +"e8997dbd": "setFeesController(address)", +"e899e848": "Fastmarketnetwork()", +"e89a49e2": "setPrivateName(bytes32)", +"e89a4e92": "getFeeRatioForJS(address)", +"e89ac5dd": "OrganizeFunds()", +"e89aeaca": "redeemLand(address)", +"e89b0e1e": "addAccount(address)", +"e89b2564": "Rate5()", +"e89b3ecb": "withdrawPUB()", +"e89b5d4b": "incrementInventory(uint256,uint256)", +"e89b727c": "myTotalStakeAmount()", +"e89b9ff6": "errCounter()", +"e89bc86b": "getBooleanMapCount(string)", +"e89c9b5d": "doThrow(string)", +"e89cdff5": "setTeamName(uint256,string)", +"e89d0d17": "getTeamLeaders()", +"e89d7f23": "payDividend(uint256,uint256)", +"e89df228": "shippingService()", +"e89f0f40": "DTR()", +"e89f3477": "grip()", +"e89f38d4": "BonusToken()", +"e89f5329": "createDebt(uint256,address,uint256)", +"e89f7672": "fight(bytes32,bytes32,bytes32)", +"e89f98a2": "TokenContractChanged(address)", +"e8a01f11": "BagSold(uint256,uint256,uint256,uint256,address,address)", +"e8a0aed3": "createToken(string,string,uint8)", +"e8a0cf44": "getScannersIds()", +"e8a0d312": "issueIndividualTokens(address,uint256)", +"e8a0e3c9": "BigbomPrivateSaleList()", +"e8a12479": "CBCT()", +"e8a1c08f": "nibbleToChar(uint256)", +"e8a207ad": "freeTokensAvailable()", +"e8a21157": "setNonEtherController(address)", +"e8a21382": "calculateInstantBonusAmount(uint256,address)", +"e8a28d52": "changeAllowAllBurnTransfers(bool)", +"e8a2a5ba": "Resolved(address,uint256,uint256,bool)", +"e8a43960": "elixor()", +"e8a478ad": "round0Bonus()", +"e8a481bd": "edit(address,bytes32,bytes32,bytes32,bytes10,bytes32,bytes32,bytes32)", +"e8a4b797": "isTokenApproved(address,uint256)", +"e8a5282d": "setConfig(bytes32)", +"e8a55471": "_transfer(address,uint40)", +"e8a61357": "testInternal(uint256)", +"e8a61cc8": "refundBuyer()", +"e8a62235": "storeAction(address)", +"e8a6d7dc": "START_RATE()", +"e8a71012": "switchCrowdSaleStage()", +"e8a7228b": "hasEnoughValidSignatures(bytes,uint8[],bytes32[],bytes32[])", +"e8a748e7": "whitelistOneAddress(address)", +"e8a7be57": "MRVToken(address,address)", +"e8a7e256": "ownerTopUp()", +"e8a9594f": "rateOfEmissionPerYear()", +"e8a96b46": "getHolder(uint256)", +"e8a97ea8": "StateChanged(uint8,uint8)", +"e8aa1f5e": "makeOwnerBitmapBit(address)", +"e8aa377b": "storeHarvestOperation(string,string,uint32,uint16,uint16,string)", +"e8aa58ce": "vaultToWallet(address,uint256)", +"e8aa6b6f": "TeamtokenRelease4()", +"e8aabf9c": "ownerTransferWeiSecondWallet(uint256)", +"e8aada0c": "ViewBet(address)", +"e8aadc3f": "locationId()", +"e8ab245b": "WarriorsAssignedToBattlefield(address,address,uint256)", +"e8ac0e76": "getPropose(address)", +"e8ac764b": "twoMillionFourHundredThousand()", +"e8aca46a": "addReferral(address)", +"e8aca672": "getNodalblockURL()", +"e8acee9e": "fundPreSale()", +"e8ad1015": "__FindProjects(string)", +"e8ad2369": "getCaseAtIndex(uint256)", +"e8ad6912": "setGasForCLOUD(uint256)", +"e8ad7bcc": "secondTTax()", +"e8adf589": "getRateScale()", +"e8ae7dd2": "getCCH_edit_22()", +"e8ae8c6e": "DescriptionInt()", +"e8af214a": "fundingRemainingAvailableInEth()", +"e8afedd9": "setCommissionTarget(address)", +"e8b0a262": "ICO2Period()", +"e8b13c44": "getChainyTimestamp(string)", +"e8b1d0f3": "relayCall(address,bytes4,bytes)", +"e8b1e825": "getTokenPriceInWeiAndPhaseIdxs()", +"e8b23632": "playerRefundAll()", +"e8b3891e": "userTransferUser(address)", +"e8b3ed65": "addDoc(string,string,string,string)", +"e8b49df2": "payWithEth(uint256,address)", +"e8b4c9d7": "OPEN_PACKAGE_PRICE()", +"e8b50802": "PRESALE_END()", +"e8b5b796": "transferownership(address)", +"e8b5e51f": "invest()", +"e8b611d6": "dailySupply()", +"e8b69081": "checkActionIsAuthorisedAndReset()", +"e8b6bbe4": "feeToSeconds(uint256)", +"e8b6fa80": "claim(int256,int256,int256,int256)", +"e8b9d536": "SingularityNetToken()", +"e8ba2fc9": "FundWallet(address,address)", +"e8ba6509": "isFinished(uint256)", +"e8ba854f": "updateWallets(address,address)", +"e8ba8f8b": "fixPlayerSurname(uint256,string)", +"e8bb7143": "removePackCategory(uint256,bytes4)", +"e8bba4f6": "getDepositedOf(address)", +"e8bc0d40": "activateNextRound()", +"e8bccab3": "Neglect(address,uint256,uint256,int256)", +"e8bd09ff": "GetPlayerNumber(uint8)", +"e8bd5cc4": "NTRYPerEther()", +"e8be2e8e": "NewsContractEntity()", +"e8be3853": "setOffchainPayment(address,bool)", +"e8be73dc": "BenkiICO(address)", +"e8beef5b": "fireEventLog3Anonym()", +"e8befc0d": "getDividends(bool,address)", +"e8bfe5b8": "landmarkPriceStepNumerator()", +"e8bfebec": "ISSUE_METHOD()", +"e8c0485f": "profile(string)", +"e8c09c0d": "verificationHoldersValueMap(address)", +"e8c0a0df": "totalDepositBalance()", +"e8c23649": "referralName(string)", +"e8c28358": "calculateDispensedTokensForGasPrice(uint256)", +"e8c2cb16": "equal(string,string,string)", +"e8c32d13": "DoacaoEvento()", +"e8c3a65f": "save1(address,bytes,string)", +"e8c3e34d": "GetProperty(bytes32,uint256,uint256)", +"e8c494f1": "calcPresaleTokenSupply()", +"e8c4d328": "airDropNumber()", +"e8c4fa04": "coinIssuedGemmyMusic()", +"e8c5ff96": "jackpotLarge()", +"e8c61c4e": "actionB(uint256)", +"e8c66cac": "fundingReserve()", +"e8c67216": "getRateLimit()", +"e8c6ed14": "niceGuy()", +"e8c78934": "disableReservePurchases(address,bool)", +"e8c7df8a": "admin_token_add(uint256)", +"e8c80880": "VestingAddressChanged(address,address)", +"e8c8a52a": "reinvestDivs(uint256)", +"e8c8bb52": "_getRegistry()", +"e8c93aa9": "createProductionUnit7()", +"e8c96256": "Lesson_2(address,uint256)", +"e8c9a3e5": "withdrawnTokens(address)", +"e8c9f9de": "LocalToken(uint256,uint256,string,string,string,address,address,address)", +"e8ca1609": "startNewPayoutPeriod()", +"e8ca3bbb": "auctionsContract()", +"e8cb635b": "checkRequestSignature(bytes,bytes,uint256,bytes)", +"e8cc00ad": "withdrawOwner()", +"e8cf0aca": "depositEthersFor(address)", +"e8cf56a9": "C2L()", +"e8cf86ff": "MyTestCoin()", +"e8cf958e": "setBwMarketValidCaller(address)", +"e8cfc40d": "EtherPrice(uint256,uint8)", +"e8d03e91": "deployBoard()", +"e8d07525": "getLockerAddr(uint256)", +"e8d0affb": "addOwner(address,bool,bytes)", +"e8d0ed31": "sendInvestor(address,uint256)", +"e8d11d9c": "DavidCoin()", +"e8d1891b": "removeOracle(address,uint256)", +"e8d199ec": "BetterBitcoin()", +"e8d1e961": "lockAccount(uint256)", +"e8d320e6": "coinBalanceOf(address,uint8)", +"e8d3280f": "decrement(address)", +"e8d34f5d": "ensureCollateralBalance(uint256)", +"e8d375fe": "week_in_blocs()", +"e8d3a5a9": "joinboard(string)", +"e8d3cad5": "getDepositsLength(address)", +"e8d47923": "fAdd(uint256,uint256)", +"e8d50403": "ChangeDates(uint256,uint256,uint256,uint256)", +"e8d59fae": "PROMO_TOKEN_AMOUNT()", +"e8d663a4": "requalify(address)", +"e8d6b5aa": "TORCToken()", +"e8d6f62d": "p1Of(uint256)", +"e8d70569": "setGameAddress(uint8,address)", +"e8d83383": "whitelistMaxContribAmount()", +"e8d88bd4": "Race()", +"e8d8c3a7": "decreaseApprovalAllArgs(address,uint256,address)", +"e8d9d76a": "WCMY()", +"e8dad6d3": "getOrganizerAddress(uint256)", +"e8dc800c": "setReadings(bytes32,uint256,bool)", +"e8dca673": "throwsWhenSaleIsNotTokenController()", +"e8dcd15f": "NeuralProtocol()", +"e8ddb731": "myshowindex(address)", +"e8ddf15a": "withdrawEthBalance()", +"e8de636c": "add(bytes20,address)", +"e8df0ca1": "checkRefundPollDate()", +"e8dfa50d": "addPigment(address,uint256,uint256,uint256,uint256)", +"e8e03280": "window0EndTime()", +"e8e09563": "PresaleToken(address,address)", +"e8e0d5bf": "getConversionInfo(string)", +"e8e44248": "transferMiner(address,uint256)", +"e8e5882e": "SmartpoolVersion(address[3])", +"e8e72f75": "ownerSetPriceOracle(uint256,address)", +"e8e7426e": "Presale(address)", +"e8e7c73d": "useMonthlyAccess()", +"e8e81fe4": "setTelegram(string)", +"e8e9eeae": "getPremiumCentsPricePer30Days()", +"e8ea0675": "redeemedEscrow(bytes32)", +"e8eb2284": "amountOf(uint256)", +"e8ebf3c5": "iii()", +"e8ecea05": "getSpecialNum()", +"e8ed024e": "LoopringToken(address)", +"e8ed1cdd": "getAccountQuantity()", +"e8edb2ff": "geneticallyEngineer(string)", +"e8edc816": "spender()", +"e8ee8b44": "MIS()", +"e8ee8c75": "deleteCandidateBySnapshotBlock(address,uint256)", +"e8eecf4c": "maxTxValue()", +"e8eed374": "hashTerms(string,string)", +"e8ef51db": "getCCH_edit_15()", +"e8efc1a0": "updatedValue(bytes32)", +"e8efe846": "blocksOwners(uint256)", +"e8f00990": "calcPlayerDivs(uint256)", +"e8f04e84": "disableLotteryGiveHunt()", +"e8f09e24": "getDisableBet(uint256)", +"e8f1736c": "TakeMoney()", +"e8f1bd8c": "getNeighbourhoodOf(uint256)", +"e8f1dc9a": "_unpackMakeData(uint256)", +"e8f35f2c": "updateUSeqvol()", +"e8f38323": "getJobHunterWithdrawalAmount()", +"e8f3cd59": "getFunderContributionClaimed(address)", +"e8f4bc12": "InitUpgradeCard()", +"e8f54364": "JJ(uint256,string,string)", +"e8f5cf36": "changeWCT2Controller(address)", +"e8f62764": "feesController()", +"e8f62f46": "someMethod2(uint256,uint256,uint256)", +"e8f64680": "purchaseFor(address,bytes32,uint256)", +"e8f6bc2e": "changeAccountLevelsAddr(address)", +"e8f72850": "interactWithXYZ()", +"e8f88890": "dev_inStream()", +"e8f8a1d2": "buyBuyerTokens()", +"e8f95666": "transferPreSigned(address,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"e8fa1d51": "handleCloseChannel(address,bytes32,uint256,address,uint256,address,uint256)", +"e8fac4cd": "transfer(address,address,address,address[],uint256,uint256)", +"e8faf89c": "ETHER_MAX_CONTRIB_USA()", +"e8fb02d2": "sellFeeMilliPercent()", +"e8fbc67d": "MultisigWallet(address[],uint256,uint256)", +"e8fc0780": "_malloc(uint256)", +"e8fc451a": "init(uint256,uint256,address,uint256,uint256,uint256,uint256)", +"e8fc9273": "verify(address,string)", +"e8fc9c10": "UnicornContract(address,address,address)", +"e8fcda45": "_set8()", +"e8fe6b66": "getCode(bytes32)", +"e8fe9473": "test_threeInvalidEqUint(int256)", +"e8ff269e": "setMaxAvatarNumber(uint8)", +"e900604d": "claimTokenOwnership(address)", +"e9007d4e": "settleGame(uint256,uint256,string,uint256)", +"e9013cf7": "getFreelancerInvoicesByStatus(address,address,uint8)", +"e9024691": "recoverPreSignedHash(address,bytes4,address,uint256,uint256,uint256)", +"e9024ff5": "modifyMessage(string)", +"e90352eb": "_transferCheck(address,address,uint256)", +"e90389bd": "setWaitingTimeBuffer(uint256)", +"e90459f8": "emitError(bytes32)", +"e906c804": "_distributeBridgeFee(uint256,bool,bool)", +"e906e664": "getx2Policy(address,uint256,uint256,uint256)", +"e90799d2": "unlock4Circulate(uint256)", +"e9083a41": "drainMe()", +"e9084739": "economyBoost(uint16,uint16)", +"e9085957": "RANGESTART_1()", +"e9087eb7": "canMove(address)", +"e908a6d6": "Initialize_PlayUnit(uint256,uint256,uint256)", +"e9092bca": "weeOneEthCanBuy()", +"e90956cf": "setCurator(address)", +"e909ebfa": "addDelegate(address,address)", +"e909f2cc": "updateCancelDistFlag()", +"e90a3cf2": "addressCashwolf()", +"e90ab7fe": "lunetReserve()", +"e90acd53": "bidder(bytes32)", +"e90bcb32": "senderToProxy(address)", +"e90cb9b9": "setBurnAddress(address,address)", +"e90d2120": "etcWallet()", +"e90dae86": "TokenAUC(uint256,string,uint8,string)", +"e90dd9e2": "tokenState()", +"e90e5453": "rand(uint256,uint256,uint256)", +"e90ecfce": "EvoToken(address)", +"e90f84bd": "getETHFromTokens(uint256)", +"e9105cf1": "unblockTokens()", +"e9108538": "mintSilcToken(address,uint256)", +"e91208ad": "galleryFour()", +"e9121758": "token_holders_array(uint256)", +"e9121b12": "transferAndApply(address,uint256)", +"e9126154": "returnLoan(uint256)", +"e912ae4f": "getLastPaidTransaction()", +"e9130d4a": "test_twoInvalidEqBytes()", +"e9140274": "stakeTAOContent(uint256,uint256,bytes8,uint256,string,string,string,string,uint256,address)", +"e914575b": "endPublicIcoForTesing()", +"e9149e34": "investedWei()", +"e914d828": "TimeMoneyToken()", +"e9156cfe": "getMutation(uint32)", +"e916d0f0": "doBalance(address)", +"e916d29e": "matchBytes32Prefix(bytes32,bytes)", +"e91710aa": "DogCoinCrowdsale(uint256,uint256,uint256,uint256,address)", +"e9171abb": "airdropRecipientCount()", +"e91723b2": "aggiungi_candidato(string)", +"e9177f1b": "HTCToken()", +"e917b027": "setProjectManager(address)", +"e917f82d": "OxyCoin()", +"e918268b": "changeDrawer(address)", +"e9187ef4": "refundAction(bytes32,uint256)", +"e9198076": "fillBuyOrderPartially(uint256,uint256,uint256)", +"e919ca10": "getMyDiscount()", +"e91a08a2": "grantedParsecCredits()", +"e91a68bf": "getAllRightLeg()", +"e91b3ac5": "getMutalbeInfo()", +"e91b6987": "addNewObj(address,uint32)", +"e91bb26e": "redeemEgg(address)", +"e91c3a3e": "getStatusInfo()", +"e91cc17c": "withdrawFunder(address)", +"e91ccdc0": "allFundingProcessed()", +"e91cd09d": "thisbalanceETH()", +"e91d1ea0": "downtime()", +"e91dcba1": "MDL()", +"e91df414": "Nurucoin()", +"e91df8da": "AuctionSoldOut(uint256)", +"e91e10af": "allocationFinished()", +"e91e13a9": "CHUNK_SIZE()", +"e91f9d96": "getNftsByOwner(address)", +"e91ff7ca": "STORAGE_WALLET()", +"e921528e": "evTransfer(address,uint256,address,address,uint256)", +"e921b4f8": "buyByAddress(address)", +"e922248e": "MinterFunc(address,uint256)", +"e92254ba": "finaliseFunding()", +"e922ee6f": "removeParent(address)", +"e9233a65": "getNameIds(uint256,uint256)", +"e92340b5": "ICO_BONUS_TIME_2()", +"e923c3d6": "_setUint(bytes4,uint256)", +"e923e707": "hardCapWei()", +"e9253156": "force_deduct_fees()", +"e92565be": "settrans(bool)", +"e9262dae": "changeMinApproval(uint8)", +"e9263f9d": "ifcoinToken()", +"e9266fca": "collectRobot(uint256,uint256,uint256,uint256,uint256)", +"e92704e8": "setGason(uint32,bool)", +"e927a8c0": "changeContracts(address,address,address)", +"e927ca04": "addVesting(address,address,address,string,uint256)", +"e927da3f": "buyPackWithKitty(uint256)", +"e927ea7a": "ballotVoteCount(uint32,uint32)", +"e927f1f9": "getLeaderBoardData(address)", +"e927fc5c": "creatorAddress()", +"e9288d72": "pushToBank(address)", +"e928ad47": "createEthBidAuction(uint256,uint256,uint16)", +"e9298b97": "changePermissions(address,uint8)", +"e92a5d74": "createTimeDecayingToken(uint256,uint256,uint256,uint256,uint256,string,uint8,string,uint8)", +"e92b6818": "CONTRIB_PERIOD1_STAKE()", +"e92b7f4b": "AddVoters(string)", +"e92ba335": "airdropCountLimit1()", +"e92bb686": "_CallAborted(address,bytes32,bytes18)", +"e92bf2a8": "saveData(uint256,bytes32,uint8,bytes32,bytes32,bytes32,address,address)", +"e92c02cf": "startOpenWindow(uint256,uint256)", +"e92d5178": "bankerBeginTime()", +"e92dfb23": "LimitBalance(uint256)", +"e92e4505": "test_9b_testGoodTransfer_thenInvalid()", +"e92e4d63": "setReservingStep(uint256)", +"e92e5c34": "getVoterCount(uint256)", +"e92e5f03": "PRESALE_TOKEN_SUPPLY_LIMIT()", +"e92f2904": "Compra()", +"e92f7447": "isDayThird()", +"e92f8cfc": "MIN_BUYBACK_VALUE()", +"e92f9c1d": "getWarriorsFromIndex(uint256,uint256)", +"e92fdeaa": "ethRec(uint256,uint256,uint256)", +"e930f06f": "setToSaleWallet(address)", +"e930f3a6": "ethContractBalance()", +"e93119d9": "balanceOf(address,address,uint256)", +"e931f1ba": "secondRoundMayEnd()", +"e931fa0c": "setMonsterGene(uint64,uint256)", +"e93239d3": "outputWalletAddress()", +"e9324444": "preSaleState()", +"e93314ab": "getS()", +"e9333fab": "set_admin(address)", +"e9339de5": "Moneda(address,address,address)", +"e933cfb0": "mintCard(uint256,address)", +"e933e6eb": "checkPriceCrowdsale(uint256,uint256)", +"e9347e31": "_sellKeys(uint256,uint256,bytes32)", +"e9348532": "kncRateBlocksTrade()", +"e934ab0c": "ActualCommitteeRoom()", +"e9353cb7": "createProductionUnit3Beta()", +"e9358b01": "newENS(address)", +"e9360096": "cancelCompetition(uint256)", +"e9361d34": "ethartRevenueReward()", +"e93680d5": "_my_transfer(address,address,uint8)", +"e936e878": "disburser()", +"e9377aca": "mtEndTime()", +"e937f689": "_getElement(string,uint256)", +"e938f121": "testFunction(address,uint256,bytes)", +"e9391db9": "getBenificiary()", +"e9395679": "uintToString(uint256)", +"e93a1906": "buyFeeMilliPercent()", +"e93ab977": "bids_ignored_refunded()", +"e93b9c89": "stepVestingPercent()", +"e93ba042": "distributePrices(uint256)", +"e93ba06f": "getWhitelistAt(uint256)", +"e93c5973": "UpdateRequiredSignatures(uint256)", +"e93c980d": "tokenUnit()", +"e93d3e5f": "setNextRoundFee(uint256)", +"e93e25fe": "zilleriumToken()", +"e93e40db": "offerCollectibleForSale(uint256,uint256,uint256)", +"e93e7b26": "Stage3Deadline()", +"e93f29bd": "_setPartitionControllers(bytes32,address[])", +"e93f3f8d": "setBuyPrice(uint256,uint256)", +"e93f57b9": "capAmount()", +"e9408491": "setInitialBal(uint256)", +"e94087d6": "joinAsBroker()", +"e941fa78": "withdrawFee()", +"e94200f1": "burnAllOwnerTokens()", +"e94233f6": "oraclizeGasCost()", +"e942b516": "set(string,string)", +"e942c564": "getWei(uint256)", +"e9433ab6": "endDonations()", +"e943cc01": "powerDayEndTime()", +"e944267c": "FourArt()", +"e9445d5a": "createAudit(uint256,uint256,uint256)", +"e94479a9": "MinterRemoved(address)", +"e944a6d7": "claimSpecialResource(uint256)", +"e944f52d": "addressToBytes(address,address,address)", +"e94559b1": "ETToken()", +"e945c391": "setEndTime(uint64)", +"e945e26c": "CCH_OLI_1()", +"e946115b": "flushVault(uint256,address)", +"e946ad4a": "getUpgradesOwned(address,uint256)", +"e947962b": "pushRefIncome(address)", +"e9482aa6": "UsingANormalStruct()", +"e9485982": "canBePurchasedByETH(uint16)", +"e949fba1": "_getPurchaseToken(address,uint256)", +"e94a4db1": "isSuitableGen(uint256,uint256)", +"e94acf0e": "TinyRouter(address)", +"e94aea8a": "lastStealBlockNumber()", +"e94b6aef": "getLayEggInfo(uint32)", +"e94bc926": "cancelVoteForCandidate(address,address,uint256)", +"e94c8dc0": "NXX()", +"e94d7af6": "getCountAllBuildings(uint256,bool)", +"e94dc568": "freeBalancesOf(address)", +"e94e4bf1": "maxDailyCap()", +"e94e80fa": "playerIndexToApproved(uint256)", +"e94e83d8": "Answer(string)", +"e94f1dc6": "setWhitelistInternal(address,address,uint256)", +"e95015b9": "spawnMonster(uint256,address)", +"e9506c73": "_investAsBonusProgram(address,uint256)", +"e9512fa4": "setVotingQuestions(string,string,string)", +"e9519a6b": "FirexToken()", +"e951c35b": "NewAppleToken()", +"e9523c97": "getAllAdmins()", +"e952f74f": "airdropCount()", +"e9540395": "getRewardDivisor()", +"e9546d08": "increaseK()", +"e95502fb": "lockedShares()", +"e9556430": "SECONDS_PER_MINUTE()", +"e9559803": "getShipById(uint256)", +"e955ee03": "revertNoncsallocation(address)", +"e9560b3b": "getParticipantBalance(address)", +"e95626c5": "Lizun()", +"e95715cb": "jackpotSend()", +"e9577a11": "getHistBtcRate(uint256)", +"e95823ad": "safe(bytes32)", +"e958d15f": "partnerMessagesCount(address,address)", +"e958d1ae": "TreeContract()", +"e9592a9f": "AuctionStarted(uint64,uint64,address)", +"e9596db3": "betInfo(bytes32)", +"e95a644f": "checkIn(uint256)", +"e95ac9f7": "LBToken(address,uint256)", +"e95af01b": "identify(address,address)", +"e95b2bb8": "Ethraffle_v2b()", +"e95b4aa8": "nameOf(address,address)", +"e95bcfb1": "UVDICO()", +"e95bd5f2": "testToData(bytes)", +"e95bee59": "checkFormat(string)", +"e95d0a59": "MarbleEarth(address,address)", +"e95d716c": "FEE_SELECT_MARGIN_SPLIT()", +"e95d74e0": "set_coin_minimum_trade(string,uint256)", +"e95db6f9": "buyKey()", +"e95f206e": "MIN_WEI_AMOUNT()", +"e95f2c7d": "getMaxLoanAmount(uint256)", +"e95f6414": "dayPotExpiration()", +"e95f72e3": "ROD()", +"e95fa798": "SellerCancelDisabled(bytes32)", +"e9600f12": "release(bytes16,address,address,uint256,uint16)", +"e960127e": "set2RoundTime(uint256)", +"e960b940": "DoubleSixToken()", +"e960bb48": "balanceOfLocked(address)", +"e9616fb0": "changeFreezingAgent(address,bool)", +"e962867d": "BillionsToken()", +"e9629d7f": "phase1Cap()", +"e96309e7": "gatherOldBalanceOf(address)", +"e9639c80": "releaseTheOriginal(uint256)", +"e963f3e8": "MAX_BUYIN_GAS_PRICE()", +"e9653482": "hasValidProfile(address)", +"e966668c": "advisorset()", +"e9668128": "isTransactionsAllowed()", +"e9677b6b": "safeExecuteOrder(address,uint256,uint256,bytes,int256)", +"e967a9b7": "dataSourceCallbackExtras(uint256,uint16)", +"e967bb18": "refundAllMoney()", +"e967e60c": "placeBid(string)", +"e968ab95": "enableTokenTransferability()", +"e968d087": "shrink128(uint256)", +"e968e1ec": "setPLATPrice(uint256)", +"e9698f62": "setBurnAmountApproval(address,address,uint256)", +"e969c871": "swapTokens(address[],uint256[])", +"e96a6b38": "getSignerFlagFor(address)", +"e96b462a": "isOwner(address,bytes32)", +"e96b5e13": "SERENITY()", +"e96b8aa6": "bitwordsWithdrawalAddress()", +"e96bf86d": "lastHour()", +"e96cd01c": "SoraToken()", +"e96d01d4": "setPlayerOverrideId(uint256,uint256)", +"e96d36ac": "communityAllocating()", +"e96d6e4f": "publicKeys()", +"e96da99e": "reply(bytes32,uint256)", +"e96e5950": "getEventHash()", +"e96fefec": "resetTransferToValues()", +"e9703701": "byteToUint(bytes1)", +"e970754b": "getTxs(uint256,uint256)", +"e970e86d": "testBlockNumber()", +"e9715de9": "referralBonusPercent()", +"e97193a6": "removeAuthor(address)", +"e971c252": "issue(address[],uint256[])", +"e972261d": "calculateProfit(uint256,uint256)", +"e9733b27": "checkStakeBalance()", +"e9734172": "createWagerAndDeposit(bytes32)", +"e9739db7": "getTokenRate(uint256)", +"e973b7ba": "node_height(uint256)", +"e973f2c4": "reinvest_color(uint256,uint256,uint256)", +"e9742d23": "createGun(uint256)", +"e9748e58": "renewalsCreditAffiliatesFor()", +"e974c000": "checkIsOnlyOwner(bytes32)", +"e97758a2": "thirdRewardPeriodEndBlock()", +"e977992d": "Doubler()", +"e9779b76": "depositOldTokens(address,uint256)", +"e977a11c": "wavesAssetId()", +"e977fa76": "_forceTransfer(address,address,uint256)", +"e9794dc1": "CreateHash(uint8,string)", +"e9799993": "Wafflecoin()", +"e979af97": "pushArray(bytes32,string)", +"e979bac1": "getCustomerBankRating(string)", +"e979fed6": "ownerstake()", +"e97a4779": "evaluateProposalPreCondition(uint256)", +"e97b2190": "add_wall(uint16)", +"e97b7689": "getTotalBuyers()", +"e97b97fe": "neumark()", +"e97cf883": "calculate(uint256,uint256,uint256)", +"e97cfab4": "withdrawDivs(uint256)", +"e97d87d5": "releaseStartTime()", +"e97db66e": "setJackpot()", +"e97dcb62": "enter()", +"e97e490c": "canuse(address)", +"e97e6dca": "applyPresale()", +"e97ed99c": "TurtleFarmer()", +"e97f6313": "token_airdrop_amount_each()", +"e97fe114": "tradeModifiers(address,address)", +"e98096fc": "numberOfNames()", +"e980c2e0": "littafiContentCommit(bytes32,string,string,string,string,bool)", +"e9813f9c": "_distinctOwners(address,address)", +"e981c803": "rejectPauseChange(bool)", +"e982d5a9": "transferOwnership1(address)", +"e9835ee1": "LogAgreementAmended(address,string)", +"e9841bd8": "certifyTradeAsCounterparty(bytes32,address)", +"e98444e8": "BIMI_DAO_31_a()", +"e984d794": "setRarity(uint256,uint256)", +"e984dd74": "ZenixSupply()", +"e985e367": "saleToken()", +"e985e9c5": "isApprovedForAll(address,address)", +"e9867fe7": "_splitElement(uint256)", +"e9874106": "pricePerTicket()", +"e98799e0": "Mejasa()", +"e987cc45": "getfrom(address)", +"e9884b44": "depositClient()", +"e9886064": "_sendPrimordialTokenAndRewardDev(uint256,address)", +"e988998a": "refreeze()", +"e9892821": "isSpendableFrozenCell(address,uint256)", +"e9893c67": "awardAmount()", +"e98a0de7": "setGitHub(string)", +"e98a1439": "priceOfMultiple(uint256[])", +"e98ae339": "cancelMarginCall(bytes32)", +"e98b1679": "set_pre_kyc_bonus_denominator(address,uint256)", +"e98b7f4d": "getKitty(uint256)", +"e98bf38e": "test_insert_zeroKey()", +"e98c365b": "totalMigratedOut()", +"e98c7608": "mod9710(bytes)", +"e98cab50": "burnIndexed(uint256)", +"e98cf987": "turnOnSale()", +"e98d3112": "OwnableWithDAO()", +"e98dcba2": "approveExchange(address,address,uint256)", +"e98df8bf": "registerMeeting(address,uint256)", +"e98e130c": "GetCandidatePrincipal(uint8)", +"e98e8a64": "getKeccak(bytes32)", +"e98ebdd5": "numResponses()", +"e98f402c": "getClassCheckOwner(uint64,address)", +"e98f5708": "Dgp(address)", +"e98fe5ce": "AgriChainType()", +"e9900714": "sendIBTCToken(address,uint256)", +"e991ae55": "valid_weights(int256[],uint256,uint256,uint256[])", +"e9922f12": "getCoinInfoFromId(uint16)", +"e992a041": "_setPendingImplementation(address)", +"e992ae5a": "INCXToken()", +"e992d8d8": "KNC()", +"e992f6cd": "pos(address[],uint256)", +"e99358a5": "TeamtokenRelease2()", +"e9938919": "EnterBetsForRaz(uint256,uint256[])", +"e9938e11": "getPricePerCoin(uint80)", +"e99392c0": "localsAvatar(bytes32,address,bytes32)", +"e993a9c0": "change_flag_hash(bytes32)", +"e993c056": "SaloniToken()", +"e9947583": "addAuditorToMultiRequestAssignment(uint256,address)", +"e995064e": "changeEmployee2(address)", +"e995194f": "transfer(address,uint256,uint256,int256)", +"e99543aa": "Trash(uint256)", +"e9958314": "getRequest(uint32)", +"e9959105": "setMintHelper(address,int256)", +"e99667ad": "OwnershipTransfer(string,address,address)", +"e99671ad": "movePermission(address)", +"e996ee88": "getItemStage(uint256,bytes32)", +"e9970b6c": "isLessThan(uint256,uint256)", +"e99718d8": "addressOf(address,bytes32)", +"e9986f90": "activeStarGenome(address)", +"e9989220": "viewShareholderListing(uint256)", +"e998d2fa": "revokeVerification(address)", +"e998db2a": "directMessage(uint8,string)", +"e99a7a72": "createCeleb(string,uint256,address,uint256[6],uint256[6])", +"e99a7dca": "lastCampaignID()", +"e99b9ab7": "getProposalCreatedOn(address,uint256)", +"e99d2866": "setSeller(address)", +"e99d2db4": "universalToken()", +"e99d7333": "BlitzCrypto()", +"e99ebee2": "dist_multiple_airdrop(address[],uint256)", +"e99ed199": "getAddressLiquidatePool()", +"e9a05055": "newMerchant(address,string)", +"e9a0dd77": "cancelBid(bytes32,int32,bool)", +"e9a158a6": "currentETHPrice()", +"e9a1e689": "PreICO(uint256,uint256,uint256,uint256,address,address)", +"e9a241cc": "checkRoundsNumberToRun()", +"e9a24e24": "userlength()", +"e9a3773c": "setBotContract(address)", +"e9a3f454": "setAgriChainSeal(string)", +"e9a51c0d": "call1(uint256)", +"e9a5605d": "WheelOfFortune(uint256)", +"e9a58c40": "fun(uint256,uint256)", +"e9a59b32": "participantRoundAmount(address,address,uint256)", +"e9a5c776": "THETOKEN()", +"e9a62ba6": "MEGAMALLCOIN()", +"e9a6cce4": "getClaimKeysCount()", +"e9a6fdc3": "addressAt(bytes,uint256)", +"e9a765eb": "checkICOStatus()", +"e9a76ff7": "getInputName(uint256,uint256)", +"e9a78a1e": "decodedNonce()", +"e9a8bae6": "getArray(string)", +"e9a909a2": "setOraclizeAddrResolverI(address)", +"e9a9c1b4": "get_party1_balance()", +"e9a9c50c": "redeemTokens()", +"e9aa80b1": "contributorsAddress()", +"e9ab04a8": "hatchEgg(uint256,string)", +"e9ab1bd7": "True()", +"e9ab77e5": "getTimes()", +"e9ac31f2": "msgdata()", +"e9ac5918": "whatDidJasonSay()", +"e9ad1b38": "findAddressByEndpoint(string,int256)", +"e9ad72d7": "_canLotteryFree(address)", +"e9aeb932": "dUpgradeToPremium(bytes32)", +"e9afa7a1": "signedApprove(address,address,uint256,uint256,uint256,bytes,address)", +"e9afad38": "getTotalVesting()", +"e9b00581": "LogStartWeek(string)", +"e9b04e69": "addSourceForBudget(uint256,uint256,string,bool)", +"e9b07bbf": "transfer(address,uint256,bytes,bytes)", +"e9b0c0e1": "adminContractSecurity(address,bool,bool,bool)", +"e9b18084": "Diary(address,bytes)", +"e9b1f1ce": "updateRandomSource(uint256)", +"e9b23b8b": "updateLeaderboard(address,address)", +"e9b29a9d": "setAPI(address)", +"e9b2f0ad": "unfreezeTokens(address,uint256)", +"e9b32a3f": "HOUSE_EDGE_DIVISOR()", +"e9b3fd39": "TradeBox()", +"e9b48288": "insertMessage(string,bool)", +"e9b4a028": "payAirdrop(address[],uint256)", +"e9b54840": "viewReferral(address,uint256)", +"e9b58225": "extDestroyBot(uint256)", +"e9b5a2f7": "firstWithdraw()", +"e9b62f13": "lastBlock_f4()", +"e9b6953b": "team1Token()", +"e9b85cf4": "SimpleOwnedStorage(string)", +"e9b93569": "OwnerGetFee()", +"e9b991cc": "refundPct()", +"e9ba267e": "distributeETHP(address[])", +"e9ba2e9b": "Storage(uint256)", +"e9ba77fb": "receiveToken()", +"e9ba8698": "TheBillionCoinCash()", +"e9bacc1a": "freeBalances(address)", +"e9bb4aac": "WaltonTokenLocker(string,address,address,uint256)", +"e9bb84c2": "transferEth(address,uint256)", +"e9bbc19e": "Example3(string)", +"e9bc13b8": "_createCanvasInternal(address)", +"e9bc63f7": "getSellInfo(uint256)", +"e9bc9598": "totaltransactions()", +"e9bce432": "yetAnotherTransferTo(address,uint256)", +"e9bd48b8": "VLTToken()", +"e9bd97dc": "getData_24()", +"e9bdab6a": "tips(address,bytes32)", +"e9bec833": "setCrowdsalePause(bool)", +"e9bf42b8": "existenceName(address)", +"e9c003d2": "indexOf(bytes32[],bytes32)", +"e9c1a9c4": "ProcessGame(address,address,bool,uint256)", +"e9c24166": "executeRequest(bytes32)", +"e9c26893": "setValidDurationData(uint256)", +"e9c2fbd5": "Banned(string)", +"e9c31315": "checkBetParity(uint8,address,bytes32,bytes32)", +"e9c33249": "ReceivedBTC(address,string,uint256,string)", +"e9c33dfe": "getHouseEdgeFee(uint256,uint256)", +"e9c35ea8": "universalCall(string)", +"e9c4a3ac": "dispatch()", +"e9c54384": "doesContractImplementInterface(address,bytes4)", +"e9c63b9c": "requestPeerBalance()", +"e9c64ad7": "evRecord(address,uint256,string)", +"e9c6c176": "addBlock(uint256,uint256,bytes32)", +"e9c6ed11": "withdrawNomins(uint256)", +"e9c714f2": "_acceptAdmin()", +"e9c771f2": "KBItoken()", +"e9c801e1": "refundInternal(uint256)", +"e9c9262e": "_productExists(uint256)", +"e9c93ce7": "cbtFundDeposit()", +"e9c9db5c": "ICOcontroller()", +"e9c9f4e0": "_finalizeFailure(uint32,string)", +"e9ca9b2a": "phase1StartingAt()", +"e9cac389": "onlyWhitelistedCanDoThis()", +"e9cafac2": "deleteArray()", +"e9cb364f": "lastTip(address,bytes32)", +"e9cbd678": "_resetBalanceDivis(address)", +"e9cddb1d": "EARLY_BET_INCENTIVE_COMMISSION()", +"e9ceef50": "createCanvas()", +"e9cf287a": "sellerGuaranteeEther()", +"e9cfa745": "calculateNetworkTokenBonusAmount(uint256,uint256,uint256,uint256,uint256)", +"e9cfb399": "SoupToken(string,string)", +"e9d16224": "maxFundedValue()", +"e9d1c598": "isEligibleForAirdrop(address)", +"e9d1d700": "assertFunction()", +"e9d1e422": "JZCoin()", +"e9d36c56": "transferredAmountToReceive(uint256)", +"e9d41d48": "getAuthorizationDataSource()", +"e9d56d2e": "releaseDividendsRightsForce(address,uint256)", +"e9d5d43b": "getWinnerByDrawBlockNumber(uint256)", +"e9d724e5": "changePreIcoEndDate(uint256)", +"e9d7d79a": "SRNT_per_ETH()", +"e9d7f309": "addRemainingTokens()", +"e9d862b0": "_updateTokensAvailable(uint256)", +"e9d8d3d7": "MAX_CONTRIBUTION_DURATION()", +"e9d8dbfd": "isService(address)", +"e9d979dd": "CioCoinERC21Token(uint256,string,string,uint256)", +"e9d9c4a9": "devTokenTimelock()", +"e9d9d5ec": "releaseBBT(address,uint256)", +"e9da12ab": "ATRToken()", +"e9db5d79": "Steak()", +"e9db5f5a": "addSpecialAccount(address)", +"e9db787b": "cancelStack(bytes32)", +"e9dc0614": "vote(bytes)", +"e9dc2e49": "createItem(uint256,uint256,uint256,uint256,uint32)", +"e9dc438e": "confirmAllSells()", +"e9dd7b6c": "getUID(uint256)", +"e9de432f": "testGasPrice()", +"e9de5c0f": "gen(bytes32,uint256)", +"e9de78fd": "TestRobotarCrowdsale()", +"e9deb98c": "presaleConcluded()", +"e9dff847": "withdrawMatingRequest(uint256)", +"e9e04195": "GEEKSID()", +"e9e041f3": "getTotalWeightedContribution()", +"e9e22362": "setWinPercent(uint256[])", +"e9e2990e": "bankManager()", +"e9e2c786": "returnMessage(uint256)", +"e9e30746": "withdrawBankroll(address,uint256)", +"e9e30997": "awardMiniGameAirdrop()", +"e9e32bfb": "firstLevelPrice()", +"e9e3b1cf": "checkAuthenticity(string)", +"e9e43eef": "getLLV_edit_10()", +"e9e44349": "hashLicenseTerms(bytes32,bytes32)", +"e9e48842": "token_unlock_time()", +"e9e48880": "BOUNTY_AMOUNT()", +"e9e55c71": "PRESALE_LEVEL_1()", +"e9e61da5": "updatePolicy(bytes32,address,uint256,uint256,uint256,uint256,bool)", +"e9e69a48": "getCurrentPageSize()", +"e9e7a667": "get_stake(bytes32)", +"e9e7e908": "BlockOfLifeToken(uint256,string,string)", +"e9e972d9": "fileLink()", +"e9e98e76": "WSKYCoin()", +"e9e99d81": "getChannelFeed(address,uint256,uint256,uint256)", +"e9e9b5bc": "setIntF1F2(int256,int256)", +"e9ea666b": "test_remove_singleNode()", +"e9eaa69b": "sweepToOwner()", +"e9ebeafe": "greet(bytes32)", +"e9ec42e6": "getConsistency(uint256)", +"e9ec9e8b": "renounceBurner()", +"e9ecc0cf": "getInvestorsTokens(address)", +"e9ecd32b": "RajTest()", +"e9ed8281": "getDiniRequest(uint256)", +"e9ed8667": "balanceLocks(address)", +"e9ed9b64": "setProposer(address,bool)", +"e9edd759": "CCoinToken()", +"e9edf4cd": "hardwareWallet()", +"e9ee6eeb": "transferAdmin(address,address)", +"e9ef5318": "_isValidLandID(uint8)", +"e9efdd6b": "getByFrom(uint256,uint256)", +"e9f0509f": "Commit(uint256,address,bytes32)", +"e9f0ee56": "addPrice(uint256)", +"e9f12ed3": "itemsByName(string)", +"e9f1c4c3": "f2(uint256,uint256)", +"e9f21537": "setUint(bytes32,bytes32,uint256,bool)", +"e9f29b7b": "setTokenUriPref(string)", +"e9f2dbfb": "makeCommitment(uint256,bytes32,address,address)", +"e9f3b9ee": "triggerSteal(uint32,uint256)", +"e9f4043f": "buyTokens(address,uint8)", +"e9f50b02": "_transferHelper(address,address,uint256)", +"e9f58a52": "rotate_left(uint256,uint256)", +"e9f6af47": "getZethrTokenBankroll(uint256)", +"e9f6bd0b": "numberOfDays()", +"e9f702f2": "createDiamond(string,address,string,string,string,string)", +"e9f84c5b": "ClearToken()", +"e9f88ca5": "ICHAINToken()", +"e9f89121": "getWeeklyJackpot(uint32)", +"e9f8cd70": "addTokenPair(address,address,uint256,uint256,uint256,uint256)", +"e9f90fe6": "listPokemons(address)", +"e9f998ce": "checkInventory(uint256)", +"e9f9d8e2": "unidentifyParticipant(address)", +"e9fa6277": "updateMasks(uint256,uint256,uint256,uint256)", +"e9fa65aa": "updateNextStealTime(uint32)", +"e9fad716": "itemPrice(address,address,uint256,uint256)", +"e9fad8ee": "exit()", +"e9fb078e": "setFreeTime(uint256,uint256)", +"e9fca283": "buy(uint256,bytes32)", +"e9fcc787": "buyCoinsAtICO()", +"e9fd3434": "Cedex()", +"e9fd4e1f": "setAllowCnsContract(bytes32,address,bytes32,bool)", +"e9fd74dc": "create(string,string,uint8,uint256,address,string,address)", +"e9fe799e": "registrantRemove(address)", +"e9fee16f": "refundAll(uint256)", +"e9ffd6de": "allBlockCoordinates(uint256)", +"e9ffdf28": "Erc20Dist()", +"ea00a289": "getStateofContractString()", +"ea00cdb2": "DrazenToken()", +"ea00fad4": "callSender(address,bytes4)", +"ea011db4": "isCustomerHasKYCfromWL(address)", +"ea014645": "PTYC(uint256,string,string)", +"ea020f7b": "WindToken()", +"ea0217cf": "setVotingPeriod(uint256)", +"ea02db0f": "communityPoolAddress()", +"ea03918c": "AGC(uint256,string,string)", +"ea03c115": "getFunctionType()", +"ea045f34": "CROSS_RESERVE_FTX()", +"ea048256": "PROCOIN()", +"ea049958": "stakeScale(address,uint256)", +"ea05667a": "maximumPurchaseFraction()", +"ea0570e0": "convertToBytes32(uint256)", +"ea0599c7": "buyIt()", +"ea05cd01": "addCarProduct(string,uint32,uint32,uint32,uint32,uint32,uint256,uint256)", +"ea061e77": "changeNeat(address)", +"ea06ad02": "postBuyTokens()", +"ea071ac0": "depositShares()", +"ea083b86": "contract_enabled()", +"ea08bb89": "creatureCosts(uint8)", +"ea08ec2c": "accountModifiers(address)", +"ea0930f2": "_currentTime()", +"ea0a5237": "announce(string)", +"ea0a73d2": "TokenGMCT(uint256,string,string)", +"ea0a93e2": "miningLeader()", +"ea0aee14": "BuyStockRocketEvent(address,uint32,uint32,address)", +"ea0d0015": "_bill_all_participants()", +"ea0d1027": "calculateSumToWithdraw()", +"ea0d1702": "verifyEscrowCustomer(uint256,address)", +"ea0d18b0": "CurrenXToken()", +"ea0d5dcd": "getUserStatus(address)", +"ea0d6ad2": "setErrorROFR(bytes)", +"ea0d8da4": "amountReserved()", +"ea0d98aa": "changeParticipants(uint256)", +"ea0f5449": "Transaction(bytes32,address,address,uint256,uint256)", +"ea107240": "deleteRegionData(uint256)", +"ea10b18f": "withdrawMainDivi()", +"ea10d246": "get_orders_sell_amount(address)", +"ea110eda": "setOraclizeGasLimit(uint256,uint256)", +"ea112b6c": "updateCrowdsaleAddress(address)", +"ea116243": "_setCampaign(bytes32,uint256,uint256,uint256,uint256,bool,address)", +"ea118590": "vote_proposed_address(string)", +"ea11e00e": "LogMatchingEnabled(bool)", +"ea1325be": "createTokenUri(uint8,uint8,uint64,uint64)", +"ea135eeb": "computeSha3(uint256[16],uint256[8])", +"ea14457e": "emitRecovery(address,address,address)", +"ea149ab5": "bank2Val()", +"ea14bc11": "box1Star5()", +"ea15f262": "ETHEREAL()", +"ea1642f8": "getManyBalances(address[])", +"ea16c148": "isIcoAgent(address)", +"ea16cee5": "migratestate()", +"ea177073": "nextMaxPlay()", +"ea18e3d5": "getFreeSword()", +"ea19efb5": "startVoting(bytes32)", +"ea1a20d5": "shareholdersWallet()", +"ea1a9537": "IOBSTestToken()", +"ea1b28e0": "maxStake()", +"ea1bbe35": "getIndex(string)", +"ea1bf386": "getNextSellerBOTdata(uint256)", +"ea1c0379": "maximumAllocationPerParticipant()", +"ea1c1690": "timestampToDateTime(uint256)", +"ea1c41be": "RxEALSaleContract()", +"ea1cf495": "ImagodeiToken()", +"ea1d64b8": "startPostIco()", +"ea1da8b9": "updatePresaleMinWei(uint256)", +"ea1df439": "timestampFirst()", +"ea1e4c2d": "Transaction2()", +"ea1e572b": "addOrderBasicFields(uint256,address,uint256,uint256,bytes32)", +"ea1e74ef": "withdrawEtherToIfPossible(address,uint256)", +"ea1eaecb": "buyMinersWithGem(uint64)", +"ea1ecff4": "sendByTranches(bytes32[],address,uint256[],bytes)", +"ea1f2954": "transferSnowflakeBalance(string,uint256)", +"ea1f4082": "RGXToken(string,string,uint256,uint256,uint8)", +"ea1f9b3e": "NoxonInit()", +"ea2028b7": "changeSaleHardcap(uint256)", +"ea212b1e": "withdrawRequest(address,bytes32)", +"ea217d4d": "logSaleStart(uint256,uint256)", +"ea21c6be": "find_and_or_register_user(address,address)", +"ea21d12d": "deleteUncompletableRequest(bytes32)", +"ea222fde": "getAmbientLightControlLimits(bytes32)", +"ea22ee15": "LOG_EmergencyWithdrawalVote(address,bool)", +"ea23c473": "scheduleUpgrade(address,string,string,bytes32,uint256)", +"ea2470ab": "priceLocked()", +"ea251c2f": "owner_BurnUpdateTokenFrom(address,uint256)", +"ea25415a": "getAcceptedGames()", +"ea25f24a": "TokenCreation(uint256,uint256,address)", +"ea26b575": "Eth_Collected()", +"ea273277": "setAyantDroitEconomique_Compte_8(uint256)", +"ea274a6b": "processBuy(address,uint256)", +"ea27a881": "getMinimumEndowment(uint256,uint256,uint256,uint256)", +"ea28baee": "getRealWorldPlayerRosterIndex(uint128)", +"ea295ec2": "calcRevenue(address)", +"ea29a210": "TokenVesting(address,uint256,uint256,uint256)", +"ea2a31fc": "NMK()", +"ea2a33fc": "getInitialREPSupply()", +"ea2a9599": "callThisToStart()", +"ea2bc862": "optionDescription(uint256,uint256)", +"ea2c23da": "createAccounts(uint256)", +"ea2c2f36": "doubleBonus(address)", +"ea2c4357": "newTokenUnlockPercent(uint256)", +"ea2c69d1": "Marijuaneum()", +"ea2ce651": "isTokenUpgrader()", +"ea2d4cf8": "__DeployerFunctions(address,address,uint256)", +"ea2da598": "NLToken()", +"ea2e34f2": "isTransformAgent()", +"ea2ea847": "testChallengeFinalize()", +"ea2f28d3": "countWeeks()", +"ea2f43c3": "currentIncreaseWithdrawalTeamBallot()", +"ea2f9ebe": "retrievePoolFee(uint256)", +"ea2fe1a2": "nay()", +"ea3015b8": "burnUnusedTokens()", +"ea304511": "changeParameters(uint256[],uint256[],uint256[],uint256[])", +"ea30e2e6": "XiaoMuMuToken()", +"ea316027": "creditWalletUserLMNO(address,uint256)", +"ea317f6d": "setdissolveprice(uint256)", +"ea31b291": "getCreatorByTrackId(uint256)", +"ea31c53c": "_openGameLoop()", +"ea31ccb6": "rICO(address,address,address)", +"ea31d56b": "mintTrusted(address,uint256)", +"ea326431": "Neulaut()", +"ea32a8f4": "addshares(uint256,address)", +"ea32c95e": "EMPTY_PUBLIC_KEY_ID()", +"ea3367ae": "divMasterAmt()", +"ea337cdb": "batchChangeHoldPeriod(uint256)", +"ea33dd24": "developer_increase_prices(uint256,uint256)", +"ea341309": "catsRemainingToAssign()", +"ea348da6": "FuckERsToken33()", +"ea352634": "closeChannel(bytes32,uint256,address,uint256,address,uint256,bytes,bytes)", +"ea359082": "End4()", +"ea35df16": "unlockBlock()", +"ea35e805": "calculateWinner()", +"ea364a9a": "addSingleApprovedAddress(address,address,uint8)", +"ea36ad91": "transferERCXTokenInitiation(string,address,address,uint256)", +"ea383176": "month30Allocated()", +"ea391420": "endIcoRound()", +"ea3b3a91": "recoverAddress(bytes32,uint256[3])", +"ea3b9ba1": "enter(uint256,address)", +"ea3bd5df": "purchase(uint256,uint256,address)", +"ea3c281a": "removePartner(address)", +"ea3d2827": "selectWinner(string)", +"ea3d4109": "rateIsStale(bytes4)", +"ea3d508a": "selector()", +"ea3d7e2c": "getOraclizeGas()", +"ea3d895f": "vestingBonusMultiplier()", +"ea3ebae6": "getConfigBool(bytes32)", +"ea3f190e": "devFee2(uint256)", +"ea3f6ce0": "joinGroupAndInvest(uint32,address)", +"ea4061cc": "calculateToFund(address,uint256)", +"ea4099e4": "QuantumPigBlockchain()", +"ea40c9e7": "ARCHETYPALXToken()", +"ea414b28": "setTaxWallet(address)", +"ea41bca5": "doStake(address,uint256,uint256,address,address)", +"ea42418b": "settlementContract()", +"ea428bad": "ACLYDcidTOKEN()", +"ea4354dc": "totalDividendWinners()", +"ea43671d": "watchPercent()", +"ea439e10": "transactionRawToBytes(uint256,address,address,uint256,bool,bool)", +"ea43b069": "PRIVATE_SALE_TOTAL()", +"ea43b79f": "unhaltDirectTrade()", +"ea448370": "setUserEmail(string)", +"ea454da8": "WonderDogToken(uint256,string,uint8,string)", +"ea46193e": "getEtherBalance()", +"ea46336b": "ShiversToken(uint256,string,uint8,string)", +"ea4634a7": "MarginlessCrowdsale(address)", +"ea46d7b9": "TACOS()", +"ea470d33": "voteForAnswer(uint256,address,bool)", +"ea4796b9": "revertIfReturnLessThanMinAndDie()", +"ea47cb24": "ownerAccount()", +"ea486cb1": "moderList()", +"ea490b84": "ethereumForkArbiter()", +"ea49ac03": "allScamsForSale()", +"ea4a294f": "addCard(uint256,uint256)", +"ea4a6aad": "LogQuantity(uint256,string)", +"ea4af029": "ConferenceCertification()", +"ea4afc54": "reserves(address,address)", +"ea4b466b": "admin_deposit(int256,int256)", +"ea4b9dce": "getLastBetNumber()", +"ea4ba8eb": "getOutcome(bytes)", +"ea4c4388": "createCredit(uint256,address,uint256)", +"ea4cc26d": "CryptoPayment()", +"ea4cc7eb": "divvy(uint256,address,uint256)", +"ea4ce239": "totalSale()", +"ea4dfce9": "benAddress()", +"ea4e6ded": "getListOfSupportedTokens()", +"ea4ef51f": "relockPart(address,uint256,uint256,uint256,int256)", +"ea4efa5d": "ganeshrajToken()", +"ea4f0882": "clearVolumeDiscounts()", +"ea503429": "privateSaleWallet()", +"ea5136a1": "adminUpdateSettings(address,address)", +"ea515c98": "pgoUnlockedLiquidityWallet()", +"ea51b3d6": "allocateOwnership(address)", +"ea51c343": "verifyLoanOffering(address[9],uint256[7],uint32[4],bytes32,bytes)", +"ea520b18": "totalDrop()", +"ea5213e1": "removeExternalContributor(address)", +"ea5366c1": "set_contract2address(address,address)", +"ea56a44d": "changeUpgradeMaster(address)", +"ea57712a": "SetFreeMKI(uint256)", +"ea57d818": "EmilToken()", +"ea5815f5": "getDatesForUser(address)", +"ea584ee6": "changeFreeZombiewCount(uint16)", +"ea58c644": "EUSD()", +"ea58c955": "powerDayRate()", +"ea58ca03": "DATE_01_JUN_2018()", +"ea593025": "giveKarma(uint256,string,string)", +"ea595672": "_transfer(address,address,uint32)", +"ea596a34": "EBIT()", +"ea598cb0": "wrap(uint256)", +"ea599cb3": "totalAward()", +"ea59a4e8": "GetPlayer_FromAddr(address,uint8)", +"ea5a13aa": "coindropsTokens()", +"ea5a22eb": "mintax()", +"ea5b2ae2": "checkIsWinner(uint256)", +"ea5b561f": "guardian1Vote()", +"ea5c204b": "MecStandardToken(uint256,string,uint8,string)", +"ea5c3204": "foundersAmount()", +"ea5ea470": "payFunding(uint256)", +"ea60e4ab": "Yusuf()", +"ea60e79b": "preICOLimit()", +"ea612545": "setBorrowAgreement(uint256,uint256,string)", +"ea62f24c": "unlockTeamAdvisorsPartnersTokens()", +"ea636aca": "setNinjaContract(address)", +"ea63ceb6": "allowAccount(address,bool)", +"ea64ad37": "totalUserTransfered()", +"ea64aee5": "GameBidAccepted(address,uint256,uint256,uint256,bytes,bool)", +"ea64faca": "init(string,string,address,uint256,uint256,address,uint256,address)", +"ea650378": "getTokenIDRelateWithTx(bytes32)", +"ea650c7d": "tokenToExchangeSwapOutput(uint256,uint256,uint256,uint256,address)", +"ea663631": "openTimerElapsed()", +"ea66543f": "isEmployee(address)", +"ea669a8a": "setTusdRegistry(address)", +"ea6723cd": "usdMnr()", +"ea680080": "firstAuctionsReferrer()", +"ea681932": "weiWantedOf()", +"ea6825aa": "VieToken()", +"ea6955e5": "ownerWithdrawUnspentCredits()", +"ea6a49ea": "setBetPrices(uint256[])", +"ea6b1377": "MAXTOKENSOLD()", +"ea6b8243": "switchOwnerTo(address)", +"ea6be96f": "estimateTokens(uint256)", +"ea6c1258": "setFSTKCentral(address)", +"ea6c9750": "transferToInvester()", +"ea6ca182": "addAgingTimesForPool(address,uint256)", +"ea6cc6e9": "delayedTokenAllocator()", +"ea6dee80": "addKey(address,address)", +"ea6ef2fe": "teamShare()", +"ea6f0725": "initCompoundContract(address,uint256,uint256,uint256)", +"ea6f1c4a": "sponsorLevel()", +"ea6f67e1": "SingularityTes26()", +"ea6f7f3e": "addAllValidShaHashes()", +"ea7000d6": "buyTokens(bytes32)", +"ea70b4af": "pendingCount()", +"ea70bdad": "attackTileForExistingUser(uint16,uint256,bool,bool)", +"ea726acb": "getReferrerAddr(address)", +"ea727ba2": "changeInterest(uint256[])", +"ea72d9de": "SENS_PER_ETH_BASE_RATE()", +"ea737b54": "getCompte_42()", +"ea74329c": "tokensRemainingPreCrowd()", +"ea74838a": "setControllers(address[])", +"ea7553f0": "vault_wallet()", +"ea75d311": "isBuyOrder(bytes32)", +"ea760a6b": "kkICOTest80()", +"ea760df8": "partner1_vows()", +"ea769e97": "changeTradeState(bool)", +"ea76a36f": "Mahjongcoin()", +"ea770a4c": "getNewCoinsIssued(uint256,uint256,uint256)", +"ea773d9e": "blink()", +"ea77d01a": "buyWarriorChest(uint256)", +"ea77ffd8": "consumeDiscount(uint8,uint8)", +"ea780bf2": "overloadedMethod(address,uint256,string)", +"ea782500": "curr_number()", +"ea7858f5": "player_cancelGame(uint256)", +"ea7873db": "addCompany()", +"ea794ef4": "constructWeaponTokenIdForWinner(uint256,uint256)", +"ea79dd79": "equal(bytes32,bytes32,string)", +"ea79f33d": "uniquenessIndex()", +"ea7a0142": "setRemark1(string)", +"ea7a7184": "testGetBalanceDb()", +"ea7b5df3": "pecunioTokenBalance()", +"ea7c2115": "lookupKittyDetails2(uint256)", +"ea7cabdd": "checkAllOwner(uint256[],address)", +"ea7ceaf7": "stopRefunds()", +"ea7f4d27": "right13(uint256)", +"ea7f537a": "percentOfGoal()", +"ea7f7a59": "finalizeLottery(uint256)", +"ea7f9244": "getRank08()", +"ea801802": "AviaC01n()", +"ea8037d6": "batchEscrowToTeamContract(address,uint32[])", +"ea8118ba": "Trustcoin(address)", +"ea8269f4": "balanceAddress(address,address)", +"ea82fa2a": "VestingScheduleConfirmed(address,address,uint256,uint256,uint256,uint256)", +"ea830cde": "getSendIndex(uint256)", +"ea83add4": "DoTrade(address,address,uint256,address,uint256,address)", +"ea842e65": "deleteTeam(uint256)", +"ea8466dc": "LBQ(uint256,string,string)", +"ea84a6cd": "memberShare(uint256)", +"ea84bfee": "update(address,bool)", +"ea851885": "buyStake(bool)", +"ea85b367": "create(address,int256,address,address)", +"ea85b581": "Deadpool2RottenorFresh()", +"ea85c7ac": "getOriginalSpinnerPrice(uint256)", +"ea863e62": "JorgeToken()", +"ea87003c": "setRenamingCosts(uint256)", +"ea871246": "LOW_RANGE_RATE()", +"ea87152b": "register(string,uint256)", +"ea879634": "getCode()", +"ea87a0aa": "updateItemsPrices(uint256[],uint256[])", +"ea88246d": "Transction()", +"ea885b55": "UNDERWAY_STATUS()", +"ea89c6bc": "TrackChain()", +"ea8a0a23": "PlotTerrainUpdate(uint256,uint256,address,uint256,bytes32)", +"ea8a1af0": "cancel()", +"ea8a4305": "Zigicoin()", +"ea8a66c7": "absoluteMinTimeLock()", +"ea8ab096": "XEV()", +"ea8acb67": "_transferToContract(address,address,uint256)", +"ea8af87d": "sumPreICO1()", +"ea8b03c2": "innerGuess(uint256,uint256,uint256,address)", +"ea8b3e9f": "setFlag(string,uint256)", +"ea8b4627": "playerLastScoredGame(address)", +"ea8b5ca3": "isContractExpired()", +"ea8b73df": "createEthCommunityTokenAndMint(string,uint8,string,uint8,uint256)", +"ea8c1516": "isBlockedAccount(address)", +"ea8d103f": "transferFundToAccount(address)", +"ea8dc8d0": "buyTicket(uint256,uint8)", +"ea8e84a1": "RecoveryEvent(string,address)", +"ea8eb4be": "blockingDuration()", +"ea8eee87": "updatePrivateExhangeRate(uint256)", +"ea8ef515": "airdropSameAmount(address[],uint256)", +"ea8ef6be": "getBranch()", +"ea8f6691": "mintSpecificCard(address,uint8,uint256)", +"ea903c78": "setEndStage3(uint256)", +"ea905308": "LogSaleCapReached(uint256)", +"ea90ad7e": "FAUT()", +"ea91ec69": "TokensReleased(uint256,uint256,uint256)", +"ea91f8c7": "showMyTokenBalance()", +"ea920b2b": "betSummary()", +"ea92c2d0": "usd2wei(uint256)", +"ea92dd1d": "withdaw(uint256)", +"ea932954": "withdraw_token(address,uint256)", +"ea9362de": "maxMintingTime()", +"ea93a324": "getCreateShareTokenCounter()", +"ea941538": "TradeExecute(address,address,uint256,address,uint256,address)", +"ea94c696": "distributeAmount(address[],uint256)", +"ea94eaa2": "CreateTokenByAtes(address,uint256,string)", +"ea95e4d8": "BreezeCoinICO()", +"ea961d78": "decreaseTokensMulti(address[],address,uint256[])", +"ea963a21": "ReconCongress(uint256,uint256,int256)", +"ea9707a3": "getCaptainIndexToCount(uint32)", +"ea9746a2": "FNTCrowdsale(uint256,uint256,uint256,uint256,uint256,uint256,address,uint256,address,address)", +"ea983f7f": "Alfacoin()", +"ea985057": "BountiesMinted(address,address,uint256,uint256)", +"ea98847b": "withdraw2()", +"ea988ebd": "mine1000(uint256)", +"ea98de9f": "runDividendPayment()", +"ea98e540": "proxyTransferFromToICAPWithReference(address,bytes32,uint256,string)", +"ea98fcf9": "tokenForBounty()", +"ea9960d8": "participate(bytes32[],bytes32[])", +"ea996c9c": "approvedRewardSources(address)", +"ea99e689": "withdrawFeeRate()", +"ea9a3eb5": "AFWToken()", +"ea9ac537": "emitExchangeFeeUpdated(uint256)", +"ea9ae72e": "setPosTokens(uint256)", +"ea9b4be5": "Rearden()", +"ea9b6025": "burnTimeChange()", +"ea9c2859": "CurrentGoldPercentIncrease()", +"ea9c3bb3": "ico2_startdate()", +"ea9c8e63": "addSmartContracts(address[])", +"ea9ce8fd": "redeemToken(bytes)", +"ea9e107a": "acceptRegistrarTransfer(bytes32,address,uint256)", +"ea9e372f": "withdrawImpl(address,address)", +"ea9eb855": "setWLMTPrice(uint256)", +"ea9f0c4c": "Partial20Send()", +"ea9f4968": "withinLimit(uint256)", +"ea9fa768": "newWeiController(address,address,uint256,bool)", +"eaa0e760": "automaticWithdrawLoop(uint256,uint256)", +"eaa1f9fe": "reqisterListening(address)", +"eaa26f0f": "withdrawal_delay()", +"eaa2b2f6": "kill(string)", +"eaa2f447": "BelottoCoin(address)", +"eaa37394": "create(bytes,bytes32,bool,bool,bool,bool,bool)", +"eaa382c2": "isMintingManager(address)", +"eaa40283": "getNewsContractAddress()", +"eaa4077a": "SetICOPhase(address,uint256,uint256,uint256,uint256,uint256)", +"eaa42a15": "_setSnapshotStakeAmount(uint256,address,address,uint256)", +"eaa47de2": "RickAndMortyShrimper()", +"eaa4d4c2": "tokenallowance(address,address)", +"eaa59c74": "rejectShipping(uint256,string)", +"eaa5dd76": "set_prod(uint256,uint256,string,string)", +"eaa61dc2": "changeLicenseTerms(bytes32,bytes32,bool,uint256,bool,uint256)", +"eaa61e91": "BagpackicoToken()", +"eaa643d5": "StandingOrder(address,address,uint256,uint256,uint256,string)", +"eaa8e6d8": "LifeFactor_iii()", +"eaa968cc": "closeBet()", +"eaa9b9a7": "timestamp_ack()", +"eaaad8e9": "masterKeys(address)", +"eaabd05e": "setTokenSwarmHash(address,bytes32)", +"eaac77a7": "priceTokenWeiPreICO()", +"eaac77ea": "supply_cap()", +"eaacc753": "verifyHolder(address,string)", +"eaae46e5": "clearClaims(uint32)", +"eaae7b7e": "sendable(address,uint256)", +"eaaf2489": "_registerContributors(uint256,address)", +"eaaf88c1": "setTeleportContractAddress(address)", +"eaaff394": "getListing(uint64)", +"eab07d42": "GetDayCount(uint256)", +"eab15085": "setData_9(string)", +"eab184b8": "JLCToken()", +"eab228b9": "PRE_ICO_TIER_LAST()", +"eab23779": "validateAndGetTransferFee(address,address,address,uint256)", +"eab27a7c": "getMigrateInReporterValue()", +"eab2d378": "setPauseMode(bool)", +"eab4fb18": "THIRD_PARTY_LOCKUP()", +"eab5cd84": "createHONtokens(address)", +"eab65fb2": "EmpAgreements(address)", +"eab88624": "lockMoney(address,uint256,uint256)", +"eab8d67b": "GetPlayerAt(uint256)", +"eab9eb2d": "sellGrapes()", +"eabbcb4b": "startIco(uint256,uint256,uint256,uint256)", +"eabc8b8e": "canBeBidden(uint256)", +"eabd11af": "RandomNumGenerated(uint64)", +"eabd5dd6": "superman()", +"eabd94ba": "tryUnlock()", +"eabd9e60": "BlackNWhite()", +"eabdd572": "withdrawDAI(address,uint256)", +"eabe09ad": "addr1()", +"eabe7d91": "redeemAllowed(address,address,uint256)", +"eabf1ce3": "Approved(address,address,uint256,string)", +"eabf4240": "mintableTokenAddress()", +"eabffab6": "VestingScheduleRegistered(address,address,uint256,uint256,uint256,uint256)", +"eac037b2": "tierBudget()", +"eac046ce": "AFFBToken()", +"eac116c4": "createKingdom(string,address,address,address,address)", +"eac12cae": "stage1Tokens()", +"eac1e58f": "PRICE_BTCS()", +"eac24932": "setEarlyParicipantWhitelist(address,bool)", +"eac257dc": "StandardTokenImpl()", +"eac2f8d9": "MultiOwnable(address)", +"eac34569": "redeemLottery(uint256)", +"eac38f75": "_rotateRight(bytes32)", +"eac3e799": "target1()", +"eac449d9": "revoke(address,uint256)", +"eac471a0": "cycleLength()", +"eac472bf": "p_setDevPercent(uint256,uint256)", +"eac48278": "mintToFounders()", +"eac50c47": "setOnSale(uint256,bool,uint256)", +"eac533e1": "privateSell2Token()", +"eac5426f": "setOwnTheDayContract(address)", +"eac58572": "transferDuringIntialOffer(address,uint256)", +"eac5a89d": "checkWhitelisted(bytes32,bytes)", +"eac5ab43": "verifyModule(address,bool)", +"eac60b27": "AddTag(address,string)", +"eac66cd8": "getNumberContracts()", +"eac80b2d": "changeVariables(uint256,uint256)", +"eac8221e": "previousRoundsCount()", +"eac8f5b8": "getAsset(uint256)", +"eac9d94c": "averageGen0SalePrice()", +"eaca7a0f": "setBaseTokens(address,address)", +"eacb05d8": "Total_ICOSupply()", +"eacb6c08": "addressToSubscriberCount(address)", +"eacba6c7": "setFounderUser(address)", +"eacbc236": "emitTransferToICAP(address,address,bytes32,uint256,string)", +"eacbe9ca": "removeDeal(bytes16)", +"eacc25e7": "Team_Wallet()", +"eacc501a": "setTransferFeeReceiver(address,address)", +"eacc5b3b": "safeSend(address,uint256,uint256)", +"eaccb2e8": "transferOperationsFunction(address)", +"eacccaf0": "setReward(address,uint256)", +"eacd2141": "ReasignTokens(int256,int256)", +"eacd2ff3": "addCar(string,address,uint256,uint256,uint256,bool)", +"eacde2cb": "tokenIdByIndex(uint256)", +"eace4827": "player_make_bet(uint8)", +"eaced5b7": "setSoldTokens(uint256)", +"eacf7d8a": "MAX_EXPIRE_DELAY()", +"eacfb78a": "getServerName(uint256)", +"eacfc0ae": "Authorized()", +"ead0327d": "getNickName(address)", +"ead04e44": "addressIsSplitter(address)", +"ead0f75a": "capFinalized()", +"ead17f58": "bonusWindow3EndTime()", +"ead1ed5b": "registerPayment(address,uint256,uint256)", +"ead2a439": "getUniqueAddressByIndex(uint256,address)", +"ead2bfdc": "getGamePrize(uint256)", +"ead2fba4": "setApprove(address,address,address,address,uint256)", +"ead3a1de": "QYQ(uint256,string,string,address)", +"ead3c2cf": "multiMint(int256,address[],uint256[])", +"ead490ad": "recoverLeftoversICO()", +"ead491ac": "getMarketDataByTokenIdx(uint256)", +"ead4c32c": "dividendCalculation(uint256)", +"ead4faaf": "Starmid(uint256,string,string,uint8)", +"ead50da3": "frequency()", +"ead5d359": "withdraw(address,uint256,bool)", +"ead710c4": "greet(string)", +"ead81e86": "addCourse(uint256,uint256,string,string,string)", +"ead956c1": "_orderTokens(address,uint256,uint256)", +"eada8645": "GetSchool(uint256)", +"eadb2481": "TransfersEnabled()", +"eadb6e84": "startRitual()", +"eadb6fa9": "deleteAccountsInBulk(address[])", +"eadb80b8": "ownerOfChild(address,uint256)", +"eadc56d2": "betting(uint256)", +"eadcbf39": "MFTcreator()", +"eadd2f91": "distributionTwo(address)", +"eadd94ec": "usdRaised()", +"eadd9c8d": "CabChain()", +"eadddb3c": "getRoomCount()", +"eaddf568": "WhitelistAddressRemoved(address,address)", +"eaddf7b9": "getNextImageId()", +"eadf1f39": "lastBlockRewarded()", +"eadf4672": "checkScope(address,address)", +"eadf6258": "updateRound()", +"eadf9760": "setUint(bytes32,string,uint256)", +"eae00565": "getVotesResult()", +"eae19df4": "tokenReceived()", +"eae3d479": "createItem(uint256,uint256,uint256,uint256)", +"eae445ed": "masternodeInfo(uint256)", +"eae45561": "setWhitelistedBatch(address[])", +"eae4c19f": "deployedAt()", +"eae4e5ce": "getPersonalAirdropAmount(address,address)", +"eae5a62d": "getProposedOwner()", +"eae6754a": "totalEthDeposited()", +"eae70d5e": "setprize(address,uint256)", +"eae7236f": "transferBack(uint256)", +"eae81c37": "getDeployedGames()", +"eae8675d": "getCompanyToken(uint256)", +"eae8a3d6": "setMigrate(address)", +"eae8cf88": "Zitron()", +"eae903e3": "CreatePayroll(address)", +"eae9dbec": "RESERVED_BUSINESS_GROUP()", +"eaea25ec": "blockSubsidy(uint256)", +"eaeb83a2": "User_4()", +"eaec3fc8": "addCantonEmployee(address)", +"eaec75aa": "finalizeBuyback()", +"eaecfca7": "changeBackend(address)", +"eaed2210": "TransactionCancelled(address,uint256,string,address)", +"eaefea72": "addStringTag(bytes32,bytes32)", +"eaf03fc5": "withdrawFromFeeBalance()", +"eaf0ded9": "presale_price_in_wei()", +"eaf16303": "DYC(uint256,string,string)", +"eaf18c45": "setTTMTokenAddress(address)", +"eaf214ea": "changeTxnTax(uint256)", +"eaf2402d": "_getStartIndex(uint64)", +"eaf2a5ef": "itemNum()", +"eaf39a14": "setCustomBonus(uint256)", +"eaf4170c": "implementsSaleClockAuctionListener()", +"eaf4181a": "stopPortalGunAndRick()", +"eaf4438f": "SuperEdge()", +"eaf44931": "TokenReturned(address,uint256)", +"eaf49a82": "numAnimalsXType()", +"eaf4b6df": "allocate3ProjectToken()", +"eaf5815a": "recoverAddr(bytes32,bytes)", +"eaf59375": "returnUnsoldSafe()", +"eaf626c2": "Set(bytes32,address,address,uint256)", +"eaf6d212": "getCertificateSince()", +"eaf7e325": "getNumItems()", +"eaf82213": "getContributionsForAddress(address)", +"eaf8294b": "fundTransfer(uint256)", +"eaf86db3": "isSellingState()", +"eaf8b774": "getAllbetByNum(int8,int8)", +"eaf9144a": "addWhitelister(address)", +"eaf97475": "disableAutoReinvest()", +"eaf98d23": "FEE_PERCENT()", +"eaf994b2": "mintReputation(uint256,address,address)", +"eaf9d194": "updateNameAndSymbol(string,string)", +"eafac339": "ICOendtime()", +"eafb2b7a": "setMembershipType(address,uint256)", +"eafb704f": "majorEventFunc(uint256,bytes32,bytes32)", +"eafc99a7": "frenzyContract()", +"eafde28c": "unwrapEth()", +"eafe5eec": "joinGameWithBalance(uint256)", +"eaff425a": "MIN_JURORS()", +"eaff4b37": "FundsWithdrawn(address,uint256)", +"eaffb3f9": "rebond(uint256)", +"eaffd429": "getOrganisations()", +"eb0030b3": "Paydata(address,uint256,bytes,uint256)", +"eb009642": "mapInvestors(address)", +"eb00f20e": "utilityAccount()", +"eb0166d9": "AccountBalance(string,string,uint256,string,string,uint256,uint256)", +"eb01d83b": "getBidAmount()", +"eb01f42d": "KOIOSTokenPreSale(address,uint256,uint256,uint256,uint256,address)", +"eb0207e3": "hPayMultiSig()", +"eb02c301": "getPosition(uint256)", +"eb03085b": "set_bonus_received()", +"eb0331d5": "destroyAccount()", +"eb03791b": "BastetToken()", +"eb03db73": "suicideFunds(address)", +"eb03e351": "purchased_snt(address)", +"eb03fb71": "winningValue()", +"eb045789": "ChannelSeries(address)", +"eb04c36c": "fundingRaised()", +"eb04df1d": "setRNGCallbackGasConfig(uint256,uint256)", +"eb053fad": "calc(bytes4,bytes32,uint256,address,bytes24)", +"eb05920e": "func_2(string)", +"eb05bfc0": "disableSaleOwner(address)", +"eb0616e5": "gimmePizza()", +"eb068fe5": "F0001Token()", +"eb06980f": "userAtIndex(uint256)", +"eb06e65e": "allowanceFromProxy(address,address,address)", +"eb06ec32": "rewardTaskCompletion(uint256,address)", +"eb08aa3b": "preSaleAddress()", +"eb08b304": "changeMeatProvider(address)", +"eb08dbfc": "emitBurned(address,uint256)", +"eb09ad46": "EthernautsExplore()", +"eb09b5bc": "FUNCToken(uint256,string,string)", +"eb0a70c1": "hasVersion(string)", +"eb0bfa38": "setRegionPrice(uint16,uint256)", +"eb0c9e5a": "verifySignature(address,uint256,uint8,bytes32,bytes32)", +"eb0db6ac": "setChemistryAddress(address)", +"eb0e9240": "checkNumber(uint256)", +"eb0eea61": "Securities_4()", +"eb0f2100": "sweep(uint256,address,uint256,uint8[],bytes32[],bytes32[])", +"eb0f46cc": "revokeAccessMint(address,address)", +"eb0f4b33": "numOwnershipStatuses()", +"eb0f5186": "_determineDefence(uint256)", +"eb0fb0a3": "setTokenToOwner(uint256,address,bool)", +"eb1098b8": "packLimit()", +"eb10b4bd": "getSettingDeprecation(uint256)", +"eb11dd7b": "squirrelReq()", +"eb121e2f": "update(uint256,uint256[101][])", +"eb1257c5": "create(int256,int256)", +"eb12d61e": "addSigner(address)", +"eb12fd82": "setRates(address[],address,uint256[])", +"eb12fef5": "nAddressLog()", +"eb1301a2": "addAddressToUncappedAddresses(address)", +"eb142e36": "_setUserInfo(address,uint64,uint256,address)", +"eb14367d": "layEgg(uint64)", +"eb14b353": "setGenesis(address)", +"eb14f53e": "batchTransferEther(address[],uint256[])", +"eb15d21b": "QiToken()", +"eb1635ed": "getMintingPrice(uint256)", +"eb18747a": "getGoldStatusCode(address)", +"eb18ebdf": "product4()", +"eb18fbe7": "setPreIcoEnd(uint256)", +"eb195635": "IQT_DECIMALS()", +"eb1ab91b": "AtomicSwap(address,uint256,bytes32,uint256)", +"eb1bb9d9": "hybridizationListSize()", +"eb1c6e6b": "getRiskLimits()", +"eb1cae39": "EvNewPrice(uint256,uint256)", +"eb1cfa82": "setMaxDrops(uint256)", +"eb1d380e": "callContractFunctionByAddress(address,string,address,address,uint256,uint256,bool,string,bytes32)", +"eb1d74c8": "UpdatedBonusAccount(address)", +"eb1de3e5": "ICDStopTime()", +"eb1e2cd9": "getPlayerAccountBalance(address)", +"eb1ea5be": "clearTracks()", +"eb1ebd93": "BLS_TOTAL_CAP()", +"eb1edd61": "FEE_ADDRESS()", +"eb1f9c78": "HasDelegateAuthority()", +"eb1fa690": "queryVestingRemain(uint256,uint256)", +"eb1ff845": "changeId(uint256,uint256,uint256)", +"eb222098": "ProGenTech()", +"eb229f1e": "totalSupplyFromInventory()", +"eb230b2d": "bobClaimsDeposit(bytes32,uint256,bytes32,bytes20,address,address)", +"eb239d9a": "timeAdjustNeg()", +"eb245d91": "custodianTransfer(address,address)", +"eb24ffdd": "getCountriesData(uint256[])", +"eb26df0a": "updateDiscounts(uint256[],uint256[])", +"eb28615e": "createCommunityToken(string,uint8,string,uint8)", +"eb28d249": "setMissions(uint256,uint16)", +"eb28ddcf": "_isTAOSignatureAddressValid(address,address,address,uint256)", +"eb290e12": "Mimicoin(uint256,string,string)", +"eb295b27": "getChannelId(address)", +"eb29d9ea": "transferWithEther(address,uint256)", +"eb2a783e": "canBuyExistentToken(uint256)", +"eb2a7c4a": "freeLottery(uint256)", +"eb2b381a": "toDecimals(uint256)", +"eb2b6e95": "PUNDI()", +"eb2bab77": "increasePot()", +"eb2bdbab": "getBUU(bytes32,uint256)", +"eb2bef47": "BetterAuction(address,address,address,uint256,uint256)", +"eb2c0223": "upgradeContract(address)", +"eb2c118a": "ExtTokenPurchase(address,address,uint256,uint256,uint256)", +"eb2c6a19": "setInvestorWhitelist(address,bool)", +"eb2c8408": "setOrganizationDescription(string)", +"eb2c87a4": "partner2_vows()", +"eb2cf098": "get_data_item()", +"eb2f3038": "buyout(address,uint256)", +"eb2f4817": "requestAccess()", +"eb2f8696": "_getCurrentSecret()", +"eb2ff2d2": "softCapPreSale()", +"eb3087bf": "buyFci(address,uint256)", +"eb30db7b": "trade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,string)", +"eb30f57d": "maxEthToRaise()", +"eb31f3d0": "Zoltan()", +"eb321173": "claimStake()", +"eb32cf9b": "saleExchangeRate2()", +"eb338f4e": "raiseMaxNumInterests(uint256)", +"eb343301": "registerCertWithID(bytes32,bytes,bytes32,uint256,bytes32)", +"eb34967a": "gameGeneration()", +"eb34c173": "firstAuctionsStartDate()", +"eb34fa12": "CurrentTLSNProof(address,string)", +"eb357e99": "payment_time()", +"eb35a849": "getSignerby()", +"eb36622d": "readBytes32(bytes32)", +"eb36d549": "WINR()", +"eb36f8e8": "stringToBytes64(string)", +"eb3721be": "getMarketOrder(uint256)", +"eb37df4f": "getGiftsByTemplateId(uint256)", +"eb37ec99": "seasonTopSalesRemain(uint16)", +"eb381429": "mint(int256,uint256,bytes32)", +"eb38615b": "setLiveTx(address)", +"eb39bc90": "setPropertyColors(uint16,uint256[5])", +"eb39f443": "startMintingDate()", +"eb3a2345": "setFunding(bool)", +"eb3a733f": "responseOptions(uint256)", +"eb3a867b": "LogVote(bytes32,bool,address)", +"eb3a88dc": "lockupTokens(address,uint256)", +"eb3b0ab3": "setFeeLocked(bool)", +"eb3b41be": "OrderFulfilled(uint256,uint256)", +"eb3b6891": "throwsWhenTransferingDuringSale()", +"eb3beb29": "silo()", +"eb3c8d7d": "changeMaximumValueWithoutProofOfAddress(uint256)", +"eb3cd55c": "setEveryBidFee(uint256)", +"eb3d032d": "FAPFundDeposit4()", +"eb3de344": "whitelistInvestor(address,string,string)", +"eb3f1b61": "allocateAngelWheelFinanceToken(address[],uint256[])", +"eb3f2427": "plainPay()", +"eb3fa926": "manager_()", +"eb3fee82": "setCompte_16(string)", +"eb40a9c8": "setRecommenderAllow()", +"eb41fbca": "changeTargets(uint256,uint256)", +"eb42b0cb": "payBeneficiaries()", +"eb4435a3": "Github()", +"eb4439fb": "enableVoting()", +"eb446ad8": "WHITELIST_SUPPLIER()", +"eb4475a1": "reducerunmoney(address,uint256)", +"eb44bb04": "frozenPool()", +"eb44dd5d": "preSale5Finished()", +"eb44fdd3": "getMarket(uint256)", +"eb455dc6": "sendBitcoin(string,uint256)", +"eb464316": "TOKENSALE_BLACKLIST()", +"eb46a11a": "setInvestorId(address,bytes32)", +"eb470ebf": "getTimeStamp(address)", +"eb473fc7": "alreadyAvailedOffer(address,address)", +"eb49168f": "getIntervals(bytes32,uint256)", +"eb496a80": "exploitMe(bytes8)", +"eb4999f4": "ticket1price()", +"eb4a2935": "getScribes()", +"eb4b41b2": "disableAmbassadorMode()", +"eb4b8091": "payWinners(address[20],uint256[20])", +"eb4be616": "CanBaoToken()", +"eb4c5593": "FREEZE_END()", +"eb4c5ab9": "createShapeShiftConversionPost(string,string)", +"eb4c9ae7": "claimUpdateToken()", +"eb4d0e32": "redemptionFund()", +"eb4dd8f2": "confirm(address)", +"eb4defcb": "returnCoupon(address[2],uint256[7],uint8,bytes32[2])", +"eb4df824": "getOwnItemCount(address)", +"eb4e64d6": "amendAgreement(string)", +"eb4eecec": "altarFund()", +"eb4f16b5": "addStake(uint256)", +"eb4f17e7": "saleProceedsEtherAllowStale(uint256)", +"eb4f54b2": "TokenRUSD(uint256,string,uint8,string)", +"eb4fe500": "logoVote()", +"eb502d45": "transferProxy(address,address,uint256,uint256,uint8,bytes32,bytes32)", +"eb5068f2": "exitWallet()", +"eb50849e": "setCanAcceptTokens(address,address,bool)", +"eb508932": "lastPayouts(uint256)", +"eb51e2e4": "_popularitySetting(uint256,uint8)", +"eb51e575": "getNextPrizePool()", +"eb5230d7": "ETHERFUNDME_FEE()", +"eb52835b": "nextShareTime()", +"eb52e404": "adminTrade(uint256[8],address[4],uint8[2],bytes32[4])", +"eb531996": "getConversation(address,address,uint32)", +"eb53367a": "delABaddress(string)", +"eb533750": "extLockNinja(uint256,uint16)", +"eb5392ff": "Leonardo()", +"eb53a9a3": "getInitializeNumTicksValue()", +"eb53d273": "getServerNb()", +"eb55b2a3": "replaySweep(address[],address)", +"eb56105d": "marketSize()", +"eb5625d9": "safeApprove(address,address,uint256)", +"eb5653d7": "tokenIdToApproved(uint256)", +"eb570b05": "currentSalePriceInWei()", +"eb57d309": "TenantTerminateMisrep(string)", +"eb581c8f": "ScudoCoin()", +"eb58705b": "_performTransferFromToICAPWithReference(address,bytes32,uint256,string,address)", +"eb5904c0": "setProfitDistributionContract(address)", +"eb59ec82": "setLastMint(address,uint256)", +"eb5a458e": "unregisterByList(address[])", +"eb5a662e": "getAllowance(address)", +"eb5a7033": "getPrefixedHash(address)", +"eb5ae7ad": "set_stop(bool)", +"eb5b135b": "tFinalized()", +"eb5b62b4": "BOPToken(address,uint256)", +"eb5ba3b4": "polyTokenAddress()", +"eb5ba56e": "creator_tablets_count(address)", +"eb5baebf": "MAX_SUPPLY_DECIMAL()", +"eb5bbef8": "withdrawInternal(uint256,bool)", +"eb5bdda0": "allocateAdvisorTokens(address,uint256,uint64,uint64)", +"eb5ce181": "Sample()", +"eb5dd1e3": "shouldPass()", +"eb5dd94f": "updateController(bytes32,address)", +"eb5ea1c0": "RemovePoolCoOwner(string,address)", +"eb5edde3": "bonusPreICO()", +"eb5f2cf8": "InsertCard(uint32,uint32,uint8,uint16,uint16,uint16,uint16,uint32[])", +"eb60082b": "profitsSendable()", +"eb601c70": "Vogeldubastardtoken()", +"eb605e9f": "hasPlayerWagered(address)", +"eb60764f": "getDayCount()", +"eb60c5d7": "DadsToken()", +"eb60e2c7": "setCountPlayersInPosition(uint256)", +"eb614fc7": "locked_allocation()", +"eb6157f7": "Abloxx()", +"eb6192a9": "getMTUBal(address)", +"eb62a013": "Offer(address,address,bytes32,uint256,uint256,uint128,uint256)", +"eb62df61": "acceptOffer()", +"eb639fd0": "luckyPot()", +"eb63e140": "getBuyPriceAfterTax()", +"eb63eadd": "setValue(uint256,uint256,uint256)", +"eb6443a3": "getIntelsByProvider(address)", +"eb64922b": "sendTeamTokens(address)", +"eb64d3e0": "TokenDrain(address,address,uint256)", +"eb64d5ce": "getUnitsStealingCapacity(address,uint256,uint256)", +"eb65a2c7": "crownDecimals()", +"eb663cf2": "LOOMIA_REMAINDER()", +"eb665994": "_0xBitcoinToken()", +"eb6779d4": "test_oneFalseAssert()", +"eb67cee8": "contractSize(address)", +"eb680744": "nextCheckpoint()", +"eb6855e3": "BossToken()", +"eb685867": "withdrawForFourYear()", +"eb685c47": "setTokenPrice(uint256,uint256)", +"eb68b4c7": "sellAura(uint256)", +"eb68ce95": "processRegisterUser(address,address,address)", +"eb6a145b": "extractPartsFromGene(uint256)", +"eb6b192f": "ownerByAddress(address)", +"eb6bbd78": "getUserImages(address)", +"eb6bce5e": "makeBet(uint256,uint256,uint256,uint256,uint256,bytes32,bytes32,address)", +"eb6c4bc8": "monsterIdToGeneration(uint256)", +"eb6d509e": "Test(uint8)", +"eb6d9fb5": "constructOwned()", +"eb6dc7c4": "processBurn(address,uint256)", +"eb6ecc03": "triggerTokenFallbackIfNeeded(address,address,uint256)", +"eb6ed29a": "setCanGetMoneyBack(bool)", +"eb6f80f1": "setPreferredSaleTLYperETH(uint256)", +"eb700331": "getLockTokenSupply()", +"eb70095d": "showVault()", +"eb701349": "updateHpbNode(address,bytes32,bytes32,bytes32,bytes32,bytes32,bytes32)", +"eb70696e": "YiWenTest2(uint256,string,string,uint256)", +"eb7085cb": "teamReserveTokens()", +"eb70bc86": "BountyFulfilled(uint256,address,uint256)", +"eb70e13e": "_unpackStrengthValue(uint256)", +"eb70e498": "observer()", +"eb712a48": "etherTransfer(uint256,address[])", +"eb71b7e4": "prepayProposal(address)", +"eb727714": "trustNet()", +"eb73900b": "Whitelist(address)", +"eb7402f5": "multiAccessHasConfirmed(bytes32,address)", +"eb7492d1": "testTotalSupply()", +"eb74fa0b": "BCAClubCoin(uint256,string,string)", +"eb7550d8": "manualFinishGame(uint256)", +"eb75c410": "getOffer(address)", +"eb75dc03": "TOKEN_PRESALE_CAP()", +"eb76174e": "calcProfitInvestorForRead(address,uint256)", +"eb76607d": "creationCap()", +"eb7698e2": "RaffleBitcoinBook(string,uint256)", +"eb770d0c": "setEntryFee(uint256)", +"eb780d3c": "SMILO_FOUNDATION_AMOUNT()", +"eb782d8c": "ContentSeries(address)", +"eb78a26d": "blackFundsWallet()", +"eb78a2af": "checkrespond(uint256,address)", +"eb794dd7": "addBlack(address)", +"eb795549": "safeTransfer(address,uint256,bytes)", +"eb799177": "gasOraclize()", +"eb79ec7c": "withdrawStocks()", +"eb7a10b1": "test_36_assertGasUsage2000Boards()", +"eb7a6471": "getPersonalAirdrop(address,address)", +"eb7a7241": "last_mint()", +"eb7b7006": "getRefundInfo(address)", +"eb7bb9fb": "CrowdsaleHardCapReached(uint256)", +"eb7bdc37": "withdrawSfowns(address)", +"eb7c244d": "amount5kUsdInCents()", +"eb7c6525": "ZbzStandardToken(uint256,string,uint8,string)", +"eb7c6f72": "step6()", +"eb7cdb56": "rankDown(uint256,uint256)", +"eb7db21b": "flip32(bytes32)", +"eb7ea41b": "showLastGlobalAuditTime()", +"eb7f3905": "tradeWithTips(uint256[10],address[4],uint256[10],bytes32[4])", +"eb7f4c0d": "CrowdsalePorto(address,address)", +"eb7fabd7": "getMax(uint64[])", +"eb800846": "setLLV_edit_18(string)", +"eb807339": "getRiskId(uint256)", +"eb80b3d1": "raceDistCon()", +"eb810864": "addTokensMulti(address[],address,uint256[])", +"eb8136f3": "stockTokens()", +"eb81e95a": "controllerBurn(address,bytes32,uint256)", +"eb8222eb": "spendMoney()", +"eb823572": "ProfitContainerAdapter(address,address,address)", +"eb8266b5": "addNumberToDynamicBytes(uint256)", +"eb829aef": "MPTToken(address,address,uint256,string,uint8,string)", +"eb83e2b5": "receiveApproval(address,uint32,address,bytes)", +"eb83f015": "castleContract()", +"eb845c17": "gen0AuctionDuration()", +"eb846c6f": "ReferrerReward(address,uint256)", +"eb854131": "mbtcToUsd(uint256)", +"eb8571c8": "trans(address,address,uint256)", +"eb85c61e": "GUIDEToken()", +"eb85d999": "IVE()", +"eb869b8b": "Scheduled(uint256,uint256)", +"eb87073a": "verifyImages(bytes32,uint256,uint8,uint256,bool)", +"eb87ec01": "newStatus(address)", +"eb880380": "checkCooSeed(uint32)", +"eb886568": "signatureCheckerFreezed()", +"eb88d688": "createCommitment(uint256)", +"eb88e84d": "LatiumSeller()", +"eb89022e": "endDate1()", +"eb8ac921": "test(uint256,uint256)", +"eb8b12d4": "PLATFORM_WALLET()", +"eb8ba66c": "insertStage(uint8,uint256,uint256)", +"eb8bbd28": "getTotalFunds()", +"eb8cad45": "doMarriage()", +"eb8cb983": "LogPauseICO()", +"eb8d2444": "saleIsActive()", +"eb8d3321": "start_PRIVATESALE()", +"eb8e1660": "getPlayerOption()", +"eb8eea15": "totalMainSaleTokenIssued()", +"eb8fa486": "contributionInCauldron(uint8,address)", +"eb8fb32c": "setPercentageToKill(uint8)", +"eb8fb3ec": "getConstraint(bytes32,address,address)", +"eb90450f": "getFirstBuyerAddress(uint256)", +"eb907398": "changeSoftCap(uint256,uint256)", +"eb90fff8": "blockContract()", +"eb91385a": "UnauthorizedAccess(address,bytes4)", +"eb91b5ac": "ALUXToken(uint256,string,string)", +"eb91d37e": "getCurrentPrice()", +"eb9220ab": "updateRent(uint256)", +"eb9253c0": "seize(address,uint256)", +"eb931024": "passKYC(address)", +"eb935e70": "bigbrother()", +"eb93c515": "burnUpdateToken(uint256)", +"eb944e4c": "revokeTokenGrant(address,uint256)", +"eb947f19": "ExampleResourcePool()", +"eb94eecb": "isContributionAllowed()", +"eb95264c": "consolationRewardsPercent()", +"eb95b7d5": "Bounty(address,address)", +"eb95d4e6": "purchaseTokens(uint256,address,address)", +"eb95f0bf": "getCurRoundId()", +"eb965c5e": "Orientation(bytes32[])", +"eb967a2a": "refundsClaimed()", +"eb968ac7": "change(address,int256)", +"eb96ada7": "gameUnpause()", +"eb975390": "lockedTokenTransfer(address[],uint256[])", +"eb9763ed": "transferby(address,address,uint256)", +"eb981fea": "withdrawFromToken(uint256)", +"eb987ca7": "placeBet(address,uint256,string)", +"eb98c8d6": "getGoldsSinceLastCollect(address)", +"eb990c59": "initialize(address,address,uint256,uint256)", +"eb9969a8": "getAllBalance()", +"eb9a5211": "DonationMatched(address,address,uint256)", +"eb9aec0a": "oraclizeIds(uint32)", +"eb9af834": "removePolicy(uint8,uint256)", +"eb9bc6ff": "partyCount(address)", +"eb9c9708": "SisterToken(uint256,string,string)", +"eb9df7db": "updateContractOwner(address)", +"eb9e0398": "mint(int256,uint256,address)", +"eba0184f": "issuable()", +"eba052e7": "RefreshChipUnableList(uint8)", +"eba068ce": "addBountyForHunter(address,uint256)", +"eba2a91b": "superMintBulk(address[],uint256[])", +"eba36dbd": "setAddr(uint256,address)", +"eba37aff": "nrMeasurements()", +"eba37dbd": "getAllReportersDisputeBondToken()", +"eba38402": "finishEvent(address,uint256)", +"eba3cdfe": "bundle(address,uint256)", +"eba4ae3b": "NewDungeonFloor(uint256,uint256,uint32,uint128,uint256)", +"eba56302": "tier1Total()", +"eba60632": "drawNow()", +"eba66dc9": "JOTUNSupply()", +"eba6a307": "getQuotePrice()", +"eba74c0b": "updateCodeWeight(string,uint256)", +"eba898a0": "_authenticate(string,uint256)", +"eba9a4a8": "DiamondBond()", +"ebaa32f3": "submission_stage_block_size()", +"ebaa4470": "getOwnerAuctions(address)", +"ebaac771": "write(string)", +"ebab43e4": "isPreSaleTime()", +"ebabfb0b": "volumeType6()", +"ebac0a56": "fillGoldBuyOrder(address,uint256,uint256)", +"ebad6612": "m_ETHPriceInCents()", +"ebaddea7": "unlockAccounts(address[])", +"ebadfd3d": "checkGivenAway()", +"ebae35a6": "DAOTokenCreationProxyTransferer(address,address)", +"ebae46be": "finishFunding()", +"ebae743b": "addCET6To(address,uint32,uint32)", +"ebae7bf1": "addHpbNode(address,bytes32,bytes32,bytes32)", +"ebaf0e74": "dInit(address,bool)", +"ebaf7f2f": "returnReward(uint256)", +"ebafefb1": "makeInitAccount()", +"ebb045fa": "PublicResolver(address)", +"ebb05f9c": "setItemApproveForAll(uint256,bool)", +"ebb0a856": "leastSwap()", +"ebb0e631": "dtGetCityData(address)", +"ebb11c93": "_build(address,uint256,bytes)", +"ebb1b7ed": "apiAuthorized()", +"ebb1dc21": "ERC20ByteCode()", +"ebb240ef": "ExampleUpgradeable23Token(address,uint256,bytes32,bytes32,uint256)", +"ebb31418": "disableTicker()", +"ebb32c65": "FooAbi(address)", +"ebb332be": "getFunStr()", +"ebb3fd8d": "kingdomName()", +"ebb44389": "bulkMintVested(uint256,address[],uint256[])", +"ebb4ac3c": "ForwarderFactory(address,bytes32,address)", +"ebb4f484": "ROLE_SUPERUSER()", +"ebb5a996": "setUsdLockAccountThreshold(uint256)", +"ebb5f11c": "explore(uint256,address,bool)", +"ebb689a1": "clearAll()", +"ebb6b338": "certifiedPartner()", +"ebb6c59f": "right72(uint256)", +"ebb6dc3a": "returnEther()", +"ebb71194": "withdrawFees(bytes32)", +"ebb741cb": "getChannelSize(uint256)", +"ebb75afc": "debugLog(string,uint256)", +"ebb85502": "GAME_START_TIME()", +"ebb88b97": "getABaddressByName(string)", +"ebb8c22c": "Win(address,uint256,uint256,uint256,uint256)", +"ebb940e6": "BuyBackContract()", +"ebb9ab25": "moveState(uint256,uint256)", +"ebb9b466": "phase_5_Time()", +"ebb9ba80": "calculateRewardForLevel(uint8,uint256)", +"ebba1400": "setIntegerValue(uint256)", +"ebba5184": "WuZeFoundation()", +"ebbaa1fc": "AdvancedToken()", +"ebbb76c8": "LongTermProjectTokens()", +"ebbbe00b": "testNopUnroll16(int256,int256,uint256)", +"ebbc4965": "acceptOwner()", +"ebbc9543": "_getPersonalAirdropUnlockTimestamp(address,address)", +"ebbe05d0": "setMinWeiAmount(uint256)", +"ebbf2f6a": "PixelColor(uint16,uint16,address,uint24)", +"ebbfb637": "Registered(bytes32,uint256,address)", +"ebbfb994": "startTokenSale(uint256,uint256)", +"ebbfcfef": "tomoDepositAddress()", +"ebc04649": "ChangeDatabase(address)", +"ebc16c5c": "getDrugsSinceLastCollect(address)", +"ebc1b4f1": "ForexCoin()", +"ebc20426": "minCapWei()", +"ebc26c95": "ToniToken()", +"ebc33c51": "minContrib()", +"ebc46fdb": "detachControllerForever()", +"ebc56c33": "_hardRequire(bool,bytes32)", +"ebc56eec": "set_allow_refunds(bool)", +"ebc58f62": "MSXAdvanced()", +"ebc59f32": "configPerShares()", +"ebc66bac": "Payreum()", +"ebc697d1": "testControlRestartNotOwner()", +"ebc6a661": "endICOStage2()", +"ebc6e332": "AuctionCreated(address,uint256,uint256,uint256,uint256,address)", +"ebc73e65": "setWaitingTime(uint256)", +"ebc824a2": "killItWithFire()", +"ebc8b934": "add_player(bytes32)", +"ebc97c36": "advisorsPeriodsNumber()", +"ebc98117": "getUserId(uint256)", +"ebcbee16": "totalRaisedInWei()", +"ebcc0de1": "closingPrices(address,address,uint256)", +"ebcc8eb6": "ETHCONEarlyBirdDonation(address)", +"ebcc9a31": "ICOweek2End()", +"ebccb566": "Halo3DPotPotato(address)", +"ebcd8d8a": "setStarInitialPrice(uint256)", +"ebce79ff": "enableBlacklist(address[])", +"ebcfd89e": "AGCoin()", +"ebcfd922": "playerEther()", +"ebd03c55": "changePlatPrice(uint32,uint256)", +"ebd057fa": "owner_withdrawal(uint256)", +"ebd062de": "removeOwnerAddress(address)", +"ebd0f599": "asktoken()", +"ebd3d58a": "InitPeculiumAdress(address)", +"ebd4587d": "GetCourseCode(uint256)", +"ebd46d64": "encodeTokenId(uint256,uint256)", +"ebd4d009": "TotalFloatingInt()", +"ebd56581": "bitservice()", +"ebd58975": "sub2(uint256,uint256)", +"ebd66a9c": "MAX_ALLOWED_PRE_SALE()", +"ebd7cda4": "cTime()", +"ebd83378": "get_blocks_for(uint256)", +"ebd863ac": "DccbtcToken()", +"ebd8d7a0": "getRefReservedTokens()", +"ebd8fde3": "calculatePriceIncrease(uint256)", +"ebd9954c": "tgrStageBlockLeft()", +"ebda6686": "referrerLevel3Percent()", +"ebdac090": "depositFees(uint256)", +"ebdb6063": "lastIssuance()", +"ebdb730d": "weiPerFee()", +"ebdbc7d6": "CurrentTokenOwner()", +"ebdbd65e": "update_private_room(bytes32)", +"ebdcc8ac": "testrc(bytes32,uint8,bytes32,bytes32)", +"ebdd3f77": "triggerRecoveryAddressChange(uint256,address,bool)", +"ebde0bce": "MultiUser()", +"ebde609b": "LykkeTokenErc223Base(address,string,uint8,string,string,uint256)", +"ebdf0d5d": "endianConvert32bit(uint256)", +"ebdf86ca": "add(string,string)", +"ebdfa455": "joinedCrowdsalesLen()", +"ebdfd722": "whitelistEndTime()", +"ebdfe5ad": "picops_is_verified(bool)", +"ebe010b8": "_setStakeHolder(address)", +"ebe02377": "submissionPool()", +"ebe09a93": "getGoldTransaction(string,uint256)", +"ebe14170": "EdgelessToken()", +"ebe1df4f": "LLV_v31_4()", +"ebe22b12": "unsale()", +"ebe24dfd": "deployCtorContract()", +"ebe25056": "isWarlordChest(uint256)", +"ebe29383": "initializeSomeAddress(address,address,address)", +"ebe347d1": "lastTimeWithdrawal()", +"ebe36cb0": "read_price_floor()", +"ebe41b73": "deposit(uint8)", +"ebe4c0d1": "dividendsSumForUser(address)", +"ebe4c597": "VestingRevoked(address,uint256,uint256)", +"ebe599aa": "updateAppExec(bytes32,address)", +"ebe5a4b2": "toB32(bytes,address)", +"ebe5f590": "isJobHasFreelancer(uint256)", +"ebe64f97": "draw_random_card(uint8,uint8[])", +"ebe65f60": "withdrawOffer(uint256,uint256,bytes32)", +"ebe6ba07": "deprecateInterface()", +"ebe6f3cc": "setDappTokenContractAddr(address)", +"ebe749d3": "tokenLockTime()", +"ebe74b21": "PRE_SALE_30_ETH()", +"ebe771da": "setPercent5(address,uint256)", +"ebe7e852": "calculateResult(uint256,uint256,uint256)", +"ebe87ca4": "between(address)", +"ebe89597": "validate(uint256,bytes32,address,bytes32,bytes32)", +"ebe955fe": "simFrequency(bytes)", +"ebea3815": "setDays(uint256)", +"ebea3d30": "setFixedRate()", +"ebeac0c8": "marketCapBlue()", +"ebeac2b5": "reactivate(address)", +"ebead05f": "getOrderSharesEscrowed(bytes32)", +"ebeae1ad": "DrocoinCrowdSale()", +"ebeb0838": "delFromWhiteList(address)", +"ebeb0f48": "lockTotalSupply()", +"ebeb1b5e": "transferTokenToMultisig(address,address)", +"ebeb76bb": "assignMeta(string,uint256)", +"ebec7352": "numVideos()", +"ebec7752": "usableBalanceOf(address)", +"ebed561b": "engineRunning()", +"ebed7a95": "mineral2Shares(uint256)", +"ebedef1a": "approvalFallback(address,uint256,bytes)", +"ebef28aa": "BID_DELAY_TIME()", +"ebf04917": "tranches()", +"ebf056e3": "revoke(bytes32,address,bool)", +"ebf06bcb": "spawnSite(uint256,uint256,address)", +"ebf0c717": "root()", +"ebf0da65": "erc223()", +"ebf0e5f1": "SimplePriceFeed(address,address,address)", +"ebf1356e": "minMineSize()", +"ebf1a495": "sendEthTweet(uint256,bool,string,bool,string,uint256)", +"ebf31253": "getMoneyness()", +"ebf469dc": "issue(address,uint256,string)", +"ebf5128c": "mintUnICOLeftToken(address,address,address)", +"ebf522b8": "_newJockey(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"ebf53e0e": "countAllCliDrm()", +"ebf59068": "exitOnHalt(address[],uint256[],bytes,bytes,bytes32)", +"ebf5cdfd": "jackpotGuard(uint256)", +"ebf652cc": "lockInTime1()", +"ebf6e91d": "hit(uint256)", +"ebf70010": "ChangeWhiteList(address,bool)", +"ebf701e0": "getAccountBalance(bytes32)", +"ebf76522": "selfDestroy(address,address)", +"ebf81d30": "_Withdrawal(bytes32,uint256,uint256)", +"ebf88de4": "removeHeir()", +"ebf89fa9": "withdrawPonzi(uint256)", +"ebf95043": "balanceOfMorty(address)", +"ebfa3c1b": "maxRandomRound()", +"ebfaacce": "uncappedBuyerList(address)", +"ebfb3630": "vernamCrowdsaleToken()", +"ebfd288a": "getVerifiedReceipt(bytes,bytes,bytes)", +"ebfd5b26": "addTokenTo(address,uint256,uint256,bool)", +"ebfda085": "LOOT()", +"ebfdc657": "foundersAddress()", +"ebfe0f39": "makeCoin(uint256)", +"ebfed9f2": "motionVoting(uint256)", +"ebff2602": "Withdraw(address,address,uint256,uint256,uint256)", +"ebff410d": "bonusAccountBalances(address)", +"ebff831f": "getFactories(address)", +"ebffd7e3": "getStage1Cap()", +"ec000bb5": "getPrizes()", +"ec003704": "getVestingStart(address,address)", +"ec005255": "boolToInt(bool,bool)", +"ec00d2a4": "frozenRecordsCount()", +"ec017820": "TransferToBTCoE(address,uint256)", +"ec01f75f": "initOperated(address)", +"ec0274ed": "CreateBatch(uint256,string)", +"ec0317ff": "AidCoin()", +"ec034bed": "donationAddress()", +"ec035393": "_getAllRevisionBlockNumbers(bytes20)", +"ec035aac": "bonusOver3ETH()", +"ec0373c6": "adminGetPlayerCount()", +"ec041a24": "getOrModifyBlocked(address)", +"ec0484ef": "roiEscrow(bytes32)", +"ec049219": "AtmanToken()", +"ec0493f7": "_populateTokenData(uint256,bytes16,uint256,uint32)", +"ec062ac0": "getMaxProfit()", +"ec066a4c": "ALLYToken()", +"ec0904f7": "releaseFor(address)", +"ec096f8d": "addTransaction(address,uint256,bytes)", +"ec0a0b50": "TOKENS_SUPPLY()", +"ec0a12d3": "JKToken()", +"ec0b3d21": "testThrowsIfPlaceholderIsBad()", +"ec0b3de4": "deletePetition(uint256)", +"ec0b4153": "getMoneyness(int256,uint256,uint256)", +"ec0b4207": "initCountTokens()", +"ec0b529f": "lockMinSiteTipPercentage()", +"ec0ba006": "countEgg(uint64)", +"ec0be13d": "Location()", +"ec0c6a72": "issue(bytes32,int256,string,bytes,uint256)", +"ec0cfd0b": "getProperties()", +"ec0d69e3": "train(uint256,bool,uint8)", +"ec0da0cd": "registerOptionPair(address,uint256,address,uint256,uint256)", +"ec0da330": "testSafeSub(uint256,uint256)", +"ec0de26e": "foundationTimelock()", +"ec0ea816": "breed(uint256,bool,uint256,bool,string,string)", +"ec0f1025": "testBitsOrSuccess()", +"ec0f60d9": "ICOcontributors()", +"ec1024d1": "censoredChatMessages(uint256)", +"ec10286d": "PointlessCoin(uint256,string,uint8,string,address)", +"ec109249": "RefundableAllocatedCappedCrowdsale(uint256,address,address,uint256,uint256,uint256,uint256,address,address,address,address,uint256)", +"ec112460": "_updateDistribution()", +"ec1182c2": "freezePrice()", +"ec11d0cf": "DeltaBalances()", +"ec12f1ef": "increaseMaxAvailableTokens(uint256,string,uint256)", +"ec1329c2": "makeProposal(address,uint8,uint256)", +"ec132ce3": "unconfirm(uint256)", +"ec13cc7b": "freeze(bytes32)", +"ec13df6b": "setExecutiveOfficer(address)", +"ec140a1f": "BTSJToken()", +"ec149de9": "Ethereumwhocoin()", +"ec14f974": "MAX_CARS()", +"ec1553d1": "mintCoin(address,uint256)", +"ec15afe1": "filmpaid()", +"ec15c6ba": "substring(string,uint256,uint256,uint256,uint256)", +"ec164625": "_clearTotalBonusTokensByAddress(address)", +"ec176dee": "weiToTokenFactor()", +"ec17a7a3": "addressSCICO()", +"ec17b20e": "setStartingBlock(uint256)", +"ec1847b6": "getWorkerIndex(address)", +"ec1893b4": "getProps()", +"ec18ca9c": "lastPresser()", +"ec18e2f1": "logInitialReporterRedeemed(address,address,address,uint256,uint256,uint256,uint256[])", +"ec1938a8": "AddNewSegment(address,address,uint256,uint256,uint256,string)", +"ec1ad474": "removeFromWallet(address,uint256)", +"ec1b375a": "spardosenName()", +"ec1d9bf4": "isGoldRegistry(address)", +"ec1e4861": "assignWinnings(uint256)", +"ec1e6a4f": "tearDown()", +"ec1e74a7": "commitThreshold()", +"ec204f87": "_getTokenAmount(uint256,uint8)", +"ec20b457": "addInvestor(address,uint256)", +"ec20fc35": "populationIncrease()", +"ec216c34": "checkOwnerIndex(uint256)", +"ec21a913": "setUint256(int256,uint256)", +"ec22f94f": "getRedeemableReputationVoter(bytes32,address)", +"ec238994": "trustedTransfer(address,address,address,uint256)", +"ec23ba66": "Kapitalexote()", +"ec24aa01": "startPrivateSaleStage()", +"ec25adf4": "addtokens()", +"ec271be2": "charityWalletAddress()", +"ec277ce7": "Resilience()", +"ec27bdd3": "challengingInput()", +"ec27f6d8": "LegacyRepContract()", +"ec280bf6": "moreMinFunds(uint256)", +"ec28118e": "nextDiscountTTMTokenId1()", +"ec2929fb": "divbonus()", +"ec29781e": "deliveryId()", +"ec29ff7c": "getMaxiumInputEther()", +"ec2a4062": "setOpenBlock(uint256)", +"ec2ac54e": "deposit(address,uint256,bytes32,uint256)", +"ec2af44d": "test_oneValidEqBool()", +"ec2b189c": "GetURL(address,uint256)", +"ec2b50bf": "setUserLibrary(address)", +"ec2bb963": "openPrize()", +"ec2bcd22": "addressCanContribute(address)", +"ec2c28b4": "checkBuy(uint256)", +"ec2c8fec": "getEggsOff(address)", +"ec2c9016": "getMarkets()", +"ec2cdb87": "initialSaleComplete()", +"ec2ec781": "testFailGetUnsetToken()", +"ec2efe40": "MinPayment()", +"ec2f39b4": "isICOStarted()", +"ec2f81ac": "createGroup(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"ec300fcc": "MediChainToken(uint256)", +"ec309038": "canStart()", +"ec30ad95": "EthsqrCore()", +"ec30c4e3": "getPointsToSpend()", +"ec3178f9": "getMemesByOwner(address)", +"ec322a88": "tokenlenth()", +"ec32d68f": "xrateProviders(uint256)", +"ec32e4e8": "admin_inactive_withdrawable()", +"ec332488": "openForPublicTrade()", +"ec342ad0": "BASE()", +"ec343a97": "Rate4()", +"ec35576e": "GetProfitFunds()", +"ec3575ec": "soccer()", +"ec357c64": "getIsCoinReg(string)", +"ec36196e": "toSpread()", +"ec3743f1": "setTeamFund()", +"ec37a6e4": "logReputationTokensTransferred(address,address,address,uint256)", +"ec38027e": "MadToken()", +"ec384a3e": "tokenToExchangeTransferInput(uint256,uint256,uint256,uint256,address,address)", +"ec38e855": "mintOperations(uint256)", +"ec3a0489": "PAYToken()", +"ec3a6d64": "getGoodDecision(bytes32)", +"ec3a6f73": "numRegistrants()", +"ec3adf65": "editUser(bytes32,bytes32,bytes32,bytes10,bytes32,bytes32,bytes32)", +"ec3af4a9": "getProjectKudos(address)", +"ec3bb11a": "maximumRaised()", +"ec3c155e": "ERC20TokenMock(uint256,string,uint8,string)", +"ec3d21e1": "kycPass(address)", +"ec3d45e8": "setMinParticipants(uint256)", +"ec3d5ffb": "stillAllowedReadable()", +"ec3f3636": "firstStage()", +"ec3f5d62": "withdrawRestOfBalance()", +"ec3fdf1d": "getExpiredAddressIndexes(address)", +"ec40c43d": "SmartPool(uint256,uint256,uint256)", +"ec40db16": "HedgeContract1(uint256,address,address)", +"ec412e00": "targetDiscountValue2()", +"ec42f82f": "finishIco()", +"ec439d67": "countAllUsers()", +"ec43eeb6": "getAddressOfId(uint256)", +"ec443813": "BytesToAddress(bytes)", +"ec449e67": "currentPriceInfoOf(uint256,uint256)", +"ec44acf2": "trading()", +"ec46009d": "EstateX()", +"ec4673d1": "approveWithdraw(uint256)", +"ec46bf8f": "emergency_withdraw(uint256)", +"ec47297e": "_CallCancelled(bytes32)", +"ec4754c6": "endetoken()", +"ec47a795": "getLockedStages(address)", +"ec47e7ed": "EtherWithdraw(uint256,address)", +"ec480557": "readTotalNumberOfPurchases()", +"ec486c23": "NewBToken()", +"ec4a79cf": "unlockaddress(address)", +"ec4aca2a": "bancorTradingContract()", +"ec4b48ad": "testCanDeposit(address)", +"ec4baa83": "StaticEthAvailable()", +"ec4bfdd4": "calculateOptionsComponents(uint256[9],uint32,uint32,bool)", +"ec4c76bb": "setInitialBuyoutPrice(uint256,uint256)", +"ec4cd0cf": "isSuccessful()", +"ec4d88d7": "usernames(bytes32)", +"ec4e530d": "_decodePriceData(bytes)", +"ec4eb442": "author(uint256)", +"ec4fb7a0": "totalTokensPresale()", +"ec4fd09d": "getEtherDog(uint256)", +"ec503611": "profitsSent()", +"ec505f58": "INDOCASH()", +"ec5134ca": "processStep()", +"ec51431f": "Unvault(uint256,uint256)", +"ec530de6": "countAddresses()", +"ec5325c1": "getDarknodes(address,uint256)", +"ec53589d": "FhnwCoin()", +"ec54a36a": "updateTimer(uint256)", +"ec54fa5e": "listCOFI()", +"ec556889": "proxy()", +"ec559176": "setEthBalance(address,uint256)", +"ec560828": "monarchyEndReward()", +"ec56a373": "contracts(bytes32)", +"ec56c6b0": "contracteventcount()", +"ec56eb93": "getComponentCount(uint256)", +"ec57e25b": "Magzia()", +"ec582a00": "IkuraStorage()", +"ec58b996": "encodeMessage(uint256,uint256,uint16[])", +"ec58f4b8": "addSolver(address)", +"ec591b20": "cancelSellCard(uint8)", +"ec59565f": "BinaryOptionV2(address,address,address)", +"ec597128": "addition()", +"ec5975c6": "getTokensReserve()", +"ec5a25e0": "WalletLibrary()", +"ec5aceab": "createOrder(address,address[3],uint256[5],int256)", +"ec5c71b3": "getChildIds(address,uint256,uint256)", +"ec5c9036": "Crowdsale(address,uint256,uint256)", +"ec5d9cc8": "balanceAvailableTokens(address)", +"ec5d9e58": "organisationName()", +"ec5dfaa2": "initHolders(address[],uint96[])", +"ec5dfb84": "bbBalance()", +"ec5ffac2": "minimumStake()", +"ec607f7d": "nextPeriod()", +"ec60bcf3": "burnFrom(address,address,uint256)", +"ec61c430": "YudiToken(uint256,string,string)", +"ec620eb3": "setClaimBlocks(uint256,uint256)", +"ec622892": "disableInvestment(address[])", +"ec62558d": "adminBurnToken(uint256)", +"ec62b216": "PRE_ICO_BONUS_PERCENTAGE()", +"ec647d42": "JESToken()", +"ec64f52f": "brag()", +"ec6507d7": "debug_transfer(address,address,uint256)", +"ec651551": "PVP(uint256,uint256,uint256)", +"ec653833": "totalAuctionItems()", +"ec654389": "tokenBountyAllocated()", +"ec654e38": "accident()", +"ec65b7a0": "FINALIZE(bytes32)", +"ec664694": "GooToken(uint256)", +"ec672cf6": "setAddressArray(bytes32,address[])", +"ec67abe4": "MOMCoin()", +"ec67e37a": "assignRevenueContract()", +"ec68197b": "setGameAddrt(address,bool)", +"ec688e8f": "walletNotLocked(address)", +"ec68a73d": "totalSpecies()", +"ec698a28": "__transferFromWithReference(address,address,uint256,string,address)", +"ec6a4487": "setMoneyWallet(address,address)", +"ec6acb33": "reputationClear(address,string)", +"ec6afc22": "oraclize_query(uint256,string,string[3])", +"ec6b16ca": "pMinInFp()", +"ec6b1d1e": "findAddress(bytes32)", +"ec6b393d": "subWeiRaised(uint256)", +"ec6be06e": "setBeneficiaryAddress(address)", +"ec6c18fc": "TOKEN_DECIMALS_MULTIPLIER()", +"ec6c32cd": "amendArticleItem(uint256,uint256,bytes)", +"ec6e43ae": "PRICE_CHANGE_ENDING_TIME()", +"ec6e5d09": "SellerHistory(address,address,uint256,uint256)", +"ec6e7bbf": "getTargetSite(address,uint256,uint256,uint256)", +"ec6eb411": "adjustBalance(address)", +"ec6f3a8c": "originalTokenHolder()", +"ec6f509e": "IcoStartTime()", +"ec6f772d": "addVirus(address,uint256)", +"ec704095": "getMyCrocs()", +"ec714926": "setTargetDiscountValue8(uint256)", +"ec715a31": "releaseToken()", +"ec7219a1": "growthReserveTokenSend(address,uint256)", +"ec727000": "getApprovalDB()", +"ec736b67": "validPerc(uint256)", +"ec737576": "finalizeMintUtility(address,uint256)", +"ec7380d9": "transferManually(uint256,address,address)", +"ec747b09": "getPaymentById(uint256,uint256)", +"ec74b818": "rbInformationStore()", +"ec756ee5": "getOrCacheValidityBondWallCalled()", +"ec759b80": "getOwners(uint8)", +"ec759f87": "setTemporaryVariables()", +"ec76312a": "sendInvestorIndex()", +"ec76bd65": "volumeType5()", +"ec77537b": "finalizeDispute()", +"ec77809f": "removeAssetPartOwner(bytes32,address)", +"ec77a89f": "GoldTokenLedger()", +"ec78626f": "setPOOL_edit_11(string)", +"ec788712": "toAddress(bytes,uint8)", +"ec789ef3": "sellpr0coinsAgainstEther(uint256)", +"ec796908": "tokensArray(uint256)", +"ec79efa8": "candidateETHAssets()", +"ec79f9bd": "setDisputeThresholdForFork(uint256)", +"ec7a3ab6": "calcBurnFee(uint256)", +"ec7b2843": "kvcMul(uint256,uint256)", +"ec7b642a": "setEvent(uint256)", +"ec7b8c40": "deleteFrozenAddresses(address)", +"ec7b9655": "spiritual_guidance()", +"ec7bb2ac": "setGen0Limit()", +"ec7bbcd2": "TradeAdsCoin()", +"ec7bf78d": "SetWorldSnapshot(uint256,bool,uint256,uint256,uint256)", +"ec7c06be": "doMigrate()", +"ec7c2ef7": "withdraw_excess_tokens()", +"ec7c637d": "getBalanceLimit(address)", +"ec7dd7bb": "getOrderDetails(uint256)", +"ec7de1e9": "masterOfCeremonyPending()", +"ec7df86e": "hasSDCC(address,address,uint256)", +"ec7dfb4d": "weiGoal()", +"ec7ecec5": "getPlayerState(uint256)", +"ec7f2ae7": "LogTransactionComplete(bytes32,address,uint256,bytes)", +"ec7f9906": "changeFreeAnimalsLimit(uint256)", +"ec7fea7b": "BiXuTo()", +"ec7fec8b": "defineWinner()", +"ec7ff617": "getMatchIdx()", +"ec801286": "BITHELPTOKEN()", +"ec810684": "registrationVote(address,uint256)", +"ec8120c9": "totalItemsForSale()", +"ec814f4e": "doDevelopFunds(uint256)", +"ec81aadb": "deployedTokens(uint256)", +"ec81b483": "CAP()", +"ec81e22e": "returnmoneycreator(uint8,uint256)", +"ec824ca9": "hashNumber(uint8)", +"ec82bf91": "_pay_token_commission(uint256)", +"ec82cf4e": "setDepositPpm(uint32)", +"ec841fe0": "LogTokensPerEthUpdated(uint256)", +"ec845dd8": "totalSubscription()", +"ec847fe8": "divholder()", +"ec854a04": "DogToken()", +"ec85d2f2": "regulatorStatus()", +"ec85d464": "returnAmountRaisedSoFar(uint256)", +"ec866d28": "isApproveOnly()", +"ec867b27": "isTokenVerified(address)", +"ec86e1d7": "getReleaseType(address)", +"ec86fdbd": "getOrCacheMarketCreationCost()", +"ec87543b": "lockedCZRMap(address,uint256)", +"ec875f98": "addCourses(string,address[])", +"ec881472": "Validator(string)", +"ec8861e7": "switchDelegate(bool)", +"ec88abc8": "SOVv11Token()", +"ec8909c0": "setShort(address)", +"ec89331b": "get_invester_detail(uint256)", +"ec89c8f0": "MicheleToken(uint256,string,string)", +"ec8a2c88": "investments()", +"ec8ac4d8": "buyTokens(address)", +"ec8b283c": "give(address,address,uint256)", +"ec8b8f4e": "addMinerTokens(uint64,address[],uint64[])", +"ec8be5b9": "canClaim(bytes32,uint256,address,bytes)", +"ec8cae23": "changeHolderCount(uint256)", +"ec8cb281": "openDate()", +"ec8d140b": "setLockedWalletEntity(address,address)", +"ec8d82f8": "oraclize_query(string,bytes[],uint256)", +"ec8e1afa": "interfaceInstanceCount()", +"ec8edf7a": "changeWalletAddress(address)", +"ec8f3fa5": "getWithdrawalAddress()", +"ec8f4d04": "onApprove(address,address,uint256,uint256)", +"ec8f850b": "withdrew()", +"ec8f95fc": "refCount(address)", +"ec8fb8ef": "withdrawOldTokens(address,uint256)", +"ec8fe065": "buyItem(address,uint8,uint256)", +"ec901017": "mintTokensWithTimeBasedVesting(address,uint256,uint256,uint256,uint256)", +"ec902779": "scribes(address)", +"ec9029a3": "minerToken(address,uint256)", +"ec90a79a": "recv_from_side_chain(uint256,bytes)", +"ec912d61": "markCredit(address,uint256)", +"ec91b550": "miningThree()", +"ec92b98d": "bancorErc20Eth()", +"ec933789": "ParticipantAgent(string,address)", +"ec93a081": "HelperSearchToken()", +"ec93b3f8": "GetCardType(uint8,uint8,uint8)", +"ec93cfae": "FountainOfWealth()", +"ec941ef8": "BXZToken()", +"ec94ce4b": "enabledMintTokens(bool)", +"ec9723ad": "setSalePeriod(uint256,uint256,uint256)", +"ec972a07": "lastBlock_f15()", +"ec972fb0": "timeOfLastDistribution()", +"ec973642": "enable(address,bool)", +"ec979082": "marketCount()", +"ec97cff7": "addCertificationDocument(address,bytes32)", +"ec985c99": "minfinney()", +"ec98618e": "getDial1Type(uint8)", +"ec98eefc": "createTokenContract(address,uint256)", +"ec993f3d": "changeDiscount(uint8)", +"ec9974eb": "getTotalWEIEther()", +"ec99bfe9": "setPreSaleParams(uint256,uint256,uint256,uint256)", +"ec99c60c": "getMatchFromList(uint256)", +"ec9a6e87": "setDefaultPartitions(bytes32[])", +"ec9b5cb2": "publicSaleEnd()", +"ec9be5fe": "setPotatoOwner(address)", +"ec9c677d": "checkDeck(uint256,uint8[],bytes32)", +"ec9d35aa": "transferWithCommission(address,uint256)", +"ec9d7fd2": "getAccumulatedServiceFee()", +"ec9da59e": "setMainContractAddress(address)", +"ec9e7971": "kycAdmin()", +"ec9edfc2": "addSmallInvestor(address,uint256,uint256)", +"eca001dd": "checkWhitelisted(address,uint256,uint256,uint8,bytes32,bytes32)", +"eca0290b": "rawSetAttribute(bytes32,bytes32,bytes)", +"eca058cc": "tokensForWei(uint256)", +"eca0be47": "TEAM_GROUP_WALLET()", +"eca10286": "loseNum()", +"eca1ada7": "getPlayersCount(uint256)", +"eca25f42": "TARGET_ADDRESS()", +"eca28cb7": "AleaPrivateSale(uint256,uint256,uint256,address,uint256,address)", +"eca2e604": "makeWorkStage(uint256,uint256)", +"eca38e0c": "ethSent()", +"eca3ee2c": "currentFundingAmount()", +"eca4742a": "getApprovedAddress(uint256)", +"eca49641": "TurnBasedGame(bool)", +"eca5339d": "mintExtraTokens(uint256)", +"eca5c793": "testErrorUnauthorizedNameRegister()", +"eca6e42d": "set_minimum_trade(uint256)", +"eca73f64": "currentBonus()", +"eca85419": "_getAllChildIds(bytes32)", +"eca90ffc": "LogGetEther(address,uint256,string)", +"eca95377": "generateRandom(string,uint256,uint256)", +"ecaa0e45": "OXGOLDSupply()", +"ecaaf6c8": "newIdTankHull()", +"ecab1a06": "_getExpProportion(int256)", +"ecabaf24": "NewHighestBid(uint256,address)", +"ecac7f4b": "symbolsCount()", +"ecacb3e0": "BitcoinSinhalaToken()", +"ecad17c1": "HurtleCoin()", +"ecad78a2": "paydCouponsETH(address)", +"ecaeacf6": "RESERVED_TOKENS_FOR_CYNOTRUST()", +"ecaeb904": "getDeltaMonth(uint256,uint256)", +"ecaf76b8": "minReferAmount()", +"ecb0116a": "getExitFee()", +"ecb0256b": "relayTx(bytes,int256,int256[],int256,int256,bytes,int256,int256[],int256,int256)", +"ecb071cf": "mainSaleStartdate()", +"ecb0b862": "payContract()", +"ecb14519": "payToken(address,address)", +"ecb15644": "GasFiles()", +"ecb1b31c": "TRONIC1()", +"ecb20de7": "takeBuyTokenOrder(address[3],uint256[3],uint256,uint8,bytes32,bytes32)", +"ecb389e0": "mmVaultAddr()", +"ecb39cba": "developer_edit_stake_reward_rate(string)", +"ecb3dc88": "depositCounter()", +"ecb41054": "doesUserExist(address)", +"ecb4136e": "NotAnotherPonzi()", +"ecb42795": "MANA()", +"ecb42914": "STAGE_1_MAXCAP()", +"ecb46858": "buyGolds()", +"ecb58c74": "ownerAllocate(address,uint256)", +"ecb5fff6": "DELTA()", +"ecb62e49": "defaultParameters(uint256)", +"ecb63011": "receiveApproval(address,uint256,address,uint8)", +"ecb6af21": "accountB()", +"ecb6b50c": "RAVI_ADDRESS()", +"ecb6c47a": "allStop()", +"ecb70a98": "tokensByDashTx(string)", +"ecb70fb7": "hasEnded()", +"ecb75089": "jackpotRoundNumber(uint256)", +"ecb828ea": "lastTokensIssued()", +"ecb86574": "getSum(address)", +"ecb87dc4": "cjTeamWallet()", +"ecb98714": "random_damage(uint256)", +"ecb98e3d": "getUSDAmountByTokens(uint256)", +"ecb9d6a3": "_cancelTknOffer(address)", +"ecba18c0": "closeCrowdsale(bool)", +"ecbb06c9": "setPlayerGeneralAttr(uint64,uint32,uint32,uint32,uint32)", +"ecbb596a": "DecentralizedCrowdFunding(address,uint256,string,uint256,uint256)", +"ecbbcdda": "processFundsIfAny()", +"ecbbd1ca": "calculateMaximumBurnAmount(address)", +"ecbc1481": "calcVIPBenefit(uint256,uint256)", +"ecbc3177": "shitFundAddress()", +"ecbc328d": "totalCardValue(uint256)", +"ecbc8fa7": "adjustBalance(address,int256)", +"ecbca55d": "setConversionFee(uint32)", +"ecbd15fd": "alterTokenGrant(address,uint256)", +"ecbdb633": "getDataHolders(address)", +"ecbdbb32": "balanceETH()", +"ecbdee9b": "setWeiPerSatoshi(uint256)", +"ecbee997": "getPlayerBetInfo(address)", +"ecbf171c": "setSiteRewards(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"ecbfc077": "startClaim()", +"ecc0148e": "inquire()", +"ecc06c76": "setFormula(address)", +"ecc0ee18": "fortune_setimgnme(uint256,bytes32[144],bytes32)", +"ecc137db": "getRandomAdversary(uint256,uint8)", +"ecc18582": "exitContest(uint32)", +"ecc1a0c9": "SetApplicant(uint256[])", +"ecc1caef": "founderReward()", +"ecc1cfaf": "withdrawALC(uint256)", +"ecc21830": "setBuyoutFeePercentage(uint256)", +"ecc258dd": "removeSecondAdvisorLock(address)", +"ecc2c47c": "outSdcForUser(uint256)", +"ecc2e57d": "classVariants(uint256)", +"ecc310ae": "kittyActions(uint256,uint256)", +"ecc38a1f": "REFERER_PERCENT()", +"ecc4029b": "getSpentAmount(address,address)", +"ecc46d1b": "DEBATE_PERIOD_MINUTES()", +"ecc4a6c2": "getSelled(uint256)", +"ecc54067": "TopTokenBase()", +"ecc55e4b": "setBool2(bool)", +"ecc57df4": "_fetchOrderByIdWithPayer(string,address)", +"ecc5aaaa": "startMint(uint256,bool,int256,uint256)", +"ecc7296b": "rebalanceMargin()", +"ecc72b0f": "getSentTrade(address,uint256)", +"ecc73f48": "collectedSum()", +"ecc7e7bc": "TestTokenToken()", +"ecc91c28": "addEtherBroAuction(uint256,uint128)", +"ecc91fdc": "buyCopyright(uint256,uint256,string,string)", +"ecc9665b": "maxWithoutWhitelist()", +"ecc98ce4": "ERC721_RECEIVED()", +"ecc99af0": "getNegID()", +"ecca031f": "hasVoted(uint256)", +"ecca9c2e": "getPrizeAmount()", +"eccaa8b5": "getSpellAbility(uint32)", +"eccb15bc": "SatPosition(int256,int256)", +"eccb6bd0": "addTicket(uint256,address)", +"eccbc596": "maxAttackPrizePercent()", +"eccbf4cc": "getTokenCountFor(address)", +"eccc32f2": "DD()", +"eccd162e": "Fortune(string)", +"eccd1a8d": "NEWT()", +"eccd8e0d": "getExchangeRate(uint256,uint256,uint256)", +"ecce7e63": "setWinningTeam(uint256)", +"eccf1b29": "CrystalDoubler()", +"eccf93c0": "updateCrowdsale(uint256,uint256,uint256,uint256)", +"ecd08bc3": "rap()", +"ecd0c0c3": "_token()", +"ecd13b89": "discountDivisor()", +"ecd1a83a": "getUserCoolDown(address)", +"ecd1c4a5": "availableZLT()", +"ecd22328": "weiCrowded()", +"ecd27189": "freeToUseTokens()", +"ecd370bd": "withdrawCoinToOwner(address,uint256)", +"ecd4eb74": "sendFees(uint256)", +"ecd57ec1": "setMinMaxDays(uint8,uint8)", +"ecd59d9b": "OTHERCRUISER()", +"ecd63757": "makePresale(string,address,uint256,uint256,string,string)", +"ecd747de": "getFishByPos(uint256)", +"ecd75c59": "FourWaySplit(address,address,address,address,address,address,address,address)", +"ecd79066": "getRedeemableReputationProposer(bytes32)", +"ecd7df06": "ICOweek4End()", +"ecd9297d": "withdrawAffBonus()", +"ecd9442e": "setMaxWeiAllowed(uint256)", +"ecd9c155": "transferDistributorship(address)", +"ecda10f5": "deploymentTime()", +"ecda249b": "UIWishSale(address,uint256,uint256,uint256,uint256,uint256,uint256,address,address)", +"ecda3055": "start_ICO1(uint256)", +"ecda58c2": "withdraw_3Completed()", +"ecda5fb6": "prizeFundFactor()", +"ecda6635": "owner_MIN_LIMIT()", +"ecda98dd": "start_bond(address[],address,uint256[])", +"ecdb065b": "bitNot(bytes32)", +"ecdb620d": "offlineRealmSold(uint256,address,uint256)", +"ecdc454c": "finalizeProposal(uint256,address[],bool,int256)", +"ecdc7135": "GoldeaBonusCalculator(uint256,uint256)", +"ecdd9549": "bonusOver10ETH()", +"ecdd9632": "generateOrder(address,address,address,uint256,string,string,string)", +"ecdf419a": "doCoinage()", +"ecdf5459": "awardReferralBonus(address,address,uint256)", +"ecdf6fed": "shareDividends()", +"ecdfca06": "tokensPreSale()", +"ecdfdc27": "ROLE_ADMINISTRATOR()", +"ece02921": "queryGameHistory(uint256)", +"ece0d561": "CashSaved(uint256)", +"ece11912": "getBetValue(uint256,uint256,uint256)", +"ece1d6e5": "maxRate()", +"ece1de44": "appeal(bytes32)", +"ece2064c": "setCurrentRewardTokens()", +"ece20f36": "nullify()", +"ece2ea40": "nextCapTime()", +"ece2f7e0": "getPlayersUnits(address)", +"ece35d01": "sessionDuration()", +"ece44b81": "numCollected()", +"ece4f10d": "LULUCOIN()", +"ece5ca56": "getData_33()", +"ece62017": "sTCBonus(uint256,uint256)", +"ece66346": "CryptoSagaHero(address)", +"ece67270": "countdownIsUp()", +"ece7c397": "SurveyTokenSale()", +"ece7fa5d": "registerToken(address,string,string,uint256,uint256)", +"ece84fd5": "crowdsaleFinished()", +"ece8557f": "modifyICOEndDate(uint256)", +"ece866b9": "l()", +"ece8a1d9": "baby()", +"ece8a29d": "addCourse(string,string,string,string,string,string)", +"ece9aed4": "crearJuegosPublico()", +"eceadfd1": "ONEX()", +"eceae9bf": "setRequiredGoldIncreaseFactor(uint256)", +"eceb2945": "checkProposalCode(uint256,address,uint256,bytes)", +"eceb9eef": "SweetTokenLogic(address,address,address,address[],uint256[])", +"eceba876": "getChildUniverse(bytes32)", +"ececa529": "mainFundPrecent()", +"eced0280": "getPhase()", +"eced2967": "calculateAndRegisterEarlyBonuses(uint256)", +"eced5526": "SCALE()", +"eced6c57": "extraTokensPerUnit()", +"ecedafcb": "SampleCrowdsale(uint256,uint256,uint256,uint256,uint256,address)", +"ecedf7b2": "initialisation(address,address)", +"ecee4eb1": "calculateNoOfTokensToSend(uint256)", +"eceebc3f": "setAllowTrading(bool)", +"ecef0e54": "DigixbotUsers(address)", +"ecef615b": "sellTransferFee()", +"ecf0848f": "MIN_PRESALE()", +"ecf12669": "FinToken()", +"ecf1e0fd": "addManyUsers(address[],uint256[])", +"ecf1fca0": "tradeProfileImplementation()", +"ecf1fdea": "setper(uint256,uint8,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"ecf24ec0": "Contribution(address,address,address,uint256)", +"ecf41c8c": "createOption(uint256,bytes32)", +"ecf42e5a": "ETHRLINK(address,address)", +"ecf477d5": "CrowdsaleStarted(address)", +"ecf56d82": "etherToTokens_(uint256)", +"ecf59b83": "ico3Min()", +"ecf6512f": "modify_Presale2StartDate(uint256)", +"ecf68eb8": "TokenTransferAllowed(uint256,address)", +"ecf6eb22": "setConfigAddress(bytes,address)", +"ecf6f108": "bigToken()", +"ecf6f2f8": "Bitgram()", +"ecf7105e": "etherBounty(address,uint256)", +"ecf7b873": "_airdropUnlocked(address)", +"ecf82c91": "setPixelDistributor(address)", +"ecf836ba": "updateInstance(bytes32,bytes32,bytes32)", +"ecf862cc": "stopSweepStake()", +"ecf88111": "setConfig(address,uint256,uint256,uint256)", +"ecf90824": "testegy(uint256,string,string)", +"ecf9d3e9": "getDesignatedReportPayoutHash()", +"ecf9ea1d": "expanded()", +"ecfa3292": "Forwarder(address,bytes32,address)", +"ecfb49a3": "totalPool()", +"ecfb5d17": "deleteFromWhitelist(address)", +"ecfbe70c": "withdrawERC20Token(address,address)", +"ecfc5964": "incTotalSupply(uint256)", +"ecfc7ecc": "placeBid()", +"ecfce7b4": "addProductEndorsement(string,uint256,int256,bool,string,string)", +"ecfd0a56": "account1()", +"ecfd8928": "contributorCount()", +"ecfef21a": "Mojito()", +"ecff39af": "START_WEEK_1()", +"ecff537f": "getGen0COnfig(uint32)", +"ecff58df": "countProjects()", +"ecff7531": "BankerFarmer()", +"ecffc18a": "RussianCash()", +"ed007cb6": "AggiungiMiner(address)", +"ed00b73f": "EbolaToken()", +"ed016620": "EtherToken1()", +"ed01bf29": "budget()", +"ed02a732": "doBountyairdrop(address,uint256)", +"ed02ad37": "numberOfGuesses()", +"ed02ada4": "TransferCoinsFrom(address,address,uint8)", +"ed02dded": "lossToCharity(uint256,address)", +"ed032ad2": "lastCharNoZero(string)", +"ed03a5b3": "cloneArray(uint256[],uint256)", +"ed03d0da": "withdrawShares(address)", +"ed045a3c": "doRefund(uint256,uint256,uint256)", +"ed047efd": "assignAnotherOwner1(address)", +"ed04d9f2": "getBuyingAmountRanges()", +"ed05084e": "setWinner()", +"ed05582b": "getHash(address,uint256)", +"ed05ae78": "getDepositBalance(address)", +"ed060ac1": "batchMount(address,uint256[],uint256)", +"ed0668fb": "getMyTurtles()", +"ed06a62c": "confirmBobDirectPay(uint256)", +"ed06d4dc": "KiwiTestToken()", +"ed06fb91": "PART_REWARD_CHANCE()", +"ed07e7b6": "arbifi(uint256,bool)", +"ed081329": "vote(address[])", +"ed09d19a": "get3(uint256)", +"ed0ad321": "releasedOf(address)", +"ed0b01cf": "MINERS_STAKE()", +"ed0b1cb3": "LLV_311_EDIT_1()", +"ed0bce14": "Cryptolotto1Day(address,address,address,address)", +"ed0c4123": "tokensPaid(address)", +"ed0c7091": "resignOwnership()", +"ed0cc2e1": "balancesUploaded()", +"ed0cdfdb": "MonsterAuction(address,uint256)", +"ed0e4665": "AVAILABLE_ADVISOR_SUPPLY()", +"ed0e92e5": "removeControllerContract(address)", +"ed0f22d5": "Start6()", +"ed1062ba": "CallExecuted(address,bytes32)", +"ed10e33c": "unLock()", +"ed11a690": "STARTING_TURTLE()", +"ed11d089": "Fortecoin()", +"ed129c2d": "printMarket()", +"ed12e8ef": "getVaultBalance()", +"ed1426e6": "purchasePixel(uint256,uint256,uint256)", +"ed148ea7": "testEnsFail()", +"ed149514": "setPartners(address,address)", +"ed14b6a5": "takeOver()", +"ed14d17e": "collectRevenue()", +"ed156449": "HeroCoin(address,address,address,address)", +"ed15863a": "bookWeekVisit(uint256)", +"ed15c31d": "Token10xAmin()", +"ed15c5e6": "targetDiscountValue6()", +"ed15dafd": "LBToken()", +"ed1627e9": "closeThisTurn()", +"ed17dab7": "tokensDistributedPresale()", +"ed17faa8": "setPlayerDayEthInLimit(uint256)", +"ed180443": "getUint256(int256)", +"ed185562": "presaleDeadline()", +"ed18838c": "setAutoBuy()", +"ed188f33": "cSale()", +"ed18bc3f": "Slot(address)", +"ed18ecae": "scan(address,bytes1)", +"ed18f0a7": "blue()", +"ed190746": "testSplit()", +"ed1923ee": "mediumRate()", +"ed1a9ca1": "returnsOneUnnamed(uint256,uint256)", +"ed1b71ea": "registerUser(address,address,address)", +"ed1ba837": "PensionFundRelease(address[],address,address,uint8,uint256,uint256,uint8,address)", +"ed1d4870": "changeReceiver(uint256,address)", +"ed1d840d": "getPriceForAssetAmount(address,uint256)", +"ed1ece04": "mineCard()", +"ed1eee68": "getFee(string)", +"ed1f1656": "totalaccumulated()", +"ed1f2229": "distributeForBountiesAndAdvisors()", +"ed1f9991": "getParticipantIndexAddress(uint256)", +"ed20f370": "debundleAndWithdraw(uint256)", +"ed21187a": "getInvestorsCount()", +"ed21248c": "Deposit()", +"ed214fff": "getParticipantList()", +"ed21a7e7": "Airsavecoin()", +"ed225a8a": "equipmentTrainingFeeMultiplier()", +"ed22671d": "set(bytes32,bytes32,bytes32,bytes)", +"ed22c02f": "SGEPreICO()", +"ed23378b": "getMarketCreatorMailbox()", +"ed234e20": "addCompany(address,string)", +"ed23e5b7": "requestObjectRoot(bytes32,uint256,uint8,bytes32,bytes32)", +"ed244fcd": "getAccountValues(uint16,uint8)", +"ed24e3e0": "CryptoABS()", +"ed25ba8c": "blinc_block()", +"ed25e6c2": "expand(uint32[4],uint32[26])", +"ed2648d3": "setCCH_edit_14(string)", +"ed26cae8": "contains(address,address)", +"ed26e60d": "GetReserveAmount(address)", +"ed26fc86": "SnowBall()", +"ed287795": "transferFromAndLock(address,address,uint256,uint256,uint256)", +"ed28d37f": "TokenOne()", +"ed28ef51": "addManyUsers(address[])", +"ed29211b": "claimReward(address,uint256,address)", +"ed29c12b": "MFI()", +"ed2a2d64": "nonceOf(address)", +"ed2b5a3c": "getBorrowRate(address,uint256,uint256)", +"ed2b8e0b": "getPoolRotationDelay()", +"ed2c92b1": "finalizeLastCampaign()", +"ed2cbf06": "_deliverTokens(address,uint256)", +"ed2d1d9e": "goodNightSweetPrince()", +"ed2d4a1b": "process_game()", +"ed2ddeae": "claimAllSupporterTokensByOwner(address)", +"ed2de952": "setInvestorsStorage(address)", +"ed2df26d": "getGameResult(uint256)", +"ed2e3f7e": "ChainBankToken(uint256)", +"ed2e5a97": "read(uint256)", +"ed2eb843": "withdrawEther(address,address,uint256)", +"ed2f2369": "activeStakes()", +"ed2f5b1a": "getRestoredTransactionStatus(uint256)", +"ed2fbf96": "timesno()", +"ed3058e0": "transferRight(address,bytes)", +"ed30ec8f": "_validFee(uint256,uint256)", +"ed319520": "_validateTokensLimits(uint256)", +"ed3375f5": "RSPLT_I()", +"ed338ff1": "saleEndTime()", +"ed3390ea": "findBest(uint256,uint256)", +"ed33e00c": "participantClaimCredits()", +"ed33fba7": "PitisCoin()", +"ed3411dc": "register(bytes20,uint24,uint32,bytes32[],uint16)", +"ed3437f8": "scalingFactor()", +"ed343f65": "totalDropPerUnlockedToken()", +"ed34ca2e": "ThePlat()", +"ed355b0b": "getBestInvestor()", +"ed361694": "failSafeMode()", +"ed361c17": "burningCapableAccount(address[])", +"ed3643d6": "checkSignersByName(bytes32,uint256,uint256,uint256)", +"ed36a874": "getOracleAddressByName(string)", +"ed3788c9": "futureDevelopmentPoolAddress()", +"ed3831ae": "p_count(uint256)", +"ed39eab3": "HGT()", +"ed3a2164": "PrincelyGoldenDollar()", +"ed3a865e": "raceId()", +"ed3ad43e": "finalizeDeprecation(uint256,address)", +"ed3b4eca": "setMinAmount1Round(uint256)", +"ed3d4dc1": "POWM()", +"ed3e3e0b": "update_counts(uint256)", +"ed3e46ae": "tipHash()", +"ed3f1c87": "allowAccess(address,address)", +"ed3f443f": "getMyBetRecordCount()", +"ed3fd0d7": "EVMScriptRegistryFactory()", +"ed40175d": "testFailOnFailedCall()", +"ed4080b1": "getPreminerAllocation(address,uint256)", +"ed40a8c8": "getWord()", +"ed4127df": "CANVAS_HEIGHT()", +"ed429d1b": "_amountCourse()", +"ed43191d": "DataRecordStructs(bytes32)", +"ed442e14": "getDividends()", +"ed45747f": "editCell(address,uint256)", +"ed45c9be": "getAllTheThings()", +"ed45e578": "getAttoTokensLeftForICO()", +"ed46eb52": "deleteCaller(uint256)", +"ed47ca94": "debug_verifySharesTreeSubmission(uint256[],uint256[],uint256,uint256,uint256,uint256)", +"ed49196b": "auctionleader()", +"ed498fa8": "userTokens(address)", +"ed49d2f8": "maxDelay()", +"ed4ae6b5": "isValidVoting(address)", +"ed4b1d0d": "scheduleTransaction(uint256)", +"ed4c1cdd": "xauToEur()", +"ed4c1d97": "syncToken()", +"ed4c87ac": "startProject(string,address,address,address,bytes,uint8,uint8,uint8,bool)", +"ed4dd2ab": "SECOND_TIER_DISCOUNT()", +"ed4e65fb": "noStoreIsActive()", +"ed4e73da": "signedTransferFrom(address,address,address,address,uint256,uint256,uint256,bytes,address)", +"ed4f114d": "ConversionRateChange(uint256)", +"ed4f2b33": "setup(uint8,bytes32[])", +"ed4f415e": "Holahop()", +"ed505d3e": "totalAmountOfPresalePurchasesWithoutBonus()", +"ed50dd4e": "ChiSale(address,uint256[],uint256[])", +"ed52068c": "revokeBurnDelegate(address)", +"ed526601": "greenOnFanChun()", +"ed54746e": "lastAuction()", +"ed550443": "proxyContract()", +"ed561fe5": "receiveSecurityDeposit(address)", +"ed56531a": "pause(bytes32)", +"ed5667b4": "transferOfPower(address)", +"ed5677f6": "tierThreeMin()", +"ed56de8c": "withdrawZRX(uint256)", +"ed5850b9": "register(address,uint8,bytes32[5],address)", +"ed5863f6": "agaisnt_votes()", +"ed58bad8": "setAuthorizedMinter(address,bool)", +"ed58c840": "transferGu(address,uint256)", +"ed58d5ec": "setLendingContract(address)", +"ed59313a": "setUsername(string)", +"ed598be7": "TenantMoveIn(string)", +"ed59eda1": "_addSuperInvestor(address)", +"ed5bc87b": "fundedProxy()", +"ed5c58f3": "set0xTokenProxy(address)", +"ed5d2289": "latchFciUser(uint256)", +"ed5d3f1a": "pow_10(uint256)", +"ed5d6fbc": "completion()", +"ed5da4f9": "computeReturnBonus(uint256)", +"ed5dc952": "getIsRoundOver(uint256)", +"ed5e68f9": "closeAnnualInvest()", +"ed5e7691": "CrowdCoinPreICO(address,address,address)", +"ed5e8437": "locks(bytes32)", +"ed5eafa2": "ClinicalTrial(address,address,uint256,uint256,uint256,bytes32,bytes)", +"ed5ec919": "voidTransaction(uint256)", +"ed60ade6": "bidOnSiringAuction(uint256,uint256)", +"ed611895": "ManualChangeUnholdDate(uint256,uint256)", +"ed6183bf": "isWinner(uint8,uint8[5],uint8[5])", +"ed621591": "KaratBankCoin()", +"ed621ae1": "PriceWeekFour()", +"ed621df6": "GuessNumber()", +"ed621e9a": "addWhitelistUsers(address[],uint256[])", +"ed621f0f": "YUN(uint256,string,uint8,string)", +"ed62543d": "bttsToken()", +"ed62986b": "_getBattleResult(int256,int256,int256,int256,uint256)", +"ed62cf1f": "setCanCall(address,address,bytes,bool)", +"ed62f501": "maxPendingPayouts()", +"ed6302be": "left98(uint256)", +"ed63455c": "stringContains(string,string)", +"ed644025": "X5Coins(uint256,string,string)", +"ed64b36b": "left15(uint256)", +"ed64bea4": "JamCoin()", +"ed64c08c": "clearBudget(address)", +"ed653164": "releaseEscrow(uint256)", +"ed654fd7": "logCompleteSetsSold(address,address,address,uint256)", +"ed666e96": "artsCreatedCount()", +"ed67bca3": "_finalize()", +"ed67e002": "getFreezeTime()", +"ed684cc6": "trigger(uint256)", +"ed68ece1": "newFeed(string)", +"ed68ff2c": "setRequireSignedAddress(bool,address)", +"ed6a2bc9": "LLToken(uint256,uint256,address)", +"ed6a2d35": "Blincoin()", +"ed6a897d": "teamTokensHolder()", +"ed6b2d7d": "extractTokens(address,address)", +"ed6b40c0": "PRICER_DELAY()", +"ed6b5ad5": "pauseSwap()", +"ed6bcd84": "TransactionPending(uint256,address,address,uint256,uint256)", +"ed6bd807": "phase2StartTime()", +"ed6be066": "charitySpaceToken()", +"ed6bf091": "changeEndDate(uint32)", +"ed6bfa2b": "toggleDeposit(bool)", +"ed6c3e84": "blockStart(uint64)", +"ed6cb909": "transferAddress(address)", +"ed6cd5d3": "get_recipient_balance()", +"ed6cd66d": "CreateUKGEvent(address,uint256)", +"ed6d4055": "SBIBank(address)", +"ed6d8521": "VULToken()", +"ed6d9169": "pushBounty(uint256)", +"ed6d969a": "addSegmentation(address,uint256,uint256,uint256)", +"ed6db106": "_HUNDRED()", +"ed6e7f7a": "processMutuallyAgreedJobCancellation(bytes16,address,address,uint256,uint256,uint8,bytes,bytes)", +"ed6e85c7": "installDonationContract(address)", +"ed6eba84": "getLockedUserDeposits(bytes32)", +"ed6f0792": "askOracle()", +"ed70d83c": "setRefProgram(address)", +"ed70e032": "_removeAvatar(address)", +"ed713d55": "ZerroXBToken()", +"ed71cfb3": "isDepositContract()", +"ed724103": "isRoundOneSalePeriod(uint256)", +"ed7305ea": "Enrium(uint256,string,uint8,string)", +"ed732ddb": "placeBet(uint256,uint256,string)", +"ed73b6a6": "PariMutuel()", +"ed743556": "YISSToken(address,uint256)", +"ed74de9d": "clone(address,uint256,uint256)", +"ed7510a0": "registerContributorPool(address,uint256)", +"ed7546b7": "_checkEvenIfCommBallot(bytes32)", +"ed769922": "buypr0coinsAgainstEther()", +"ed782750": "ICONIQ_TOKENS_NEEDED_PER_INVESTED_WEI()", +"ed785e29": "PresaleBREMP(address,uint256)", +"ed786cd6": "getCurrentWeek(uint256,uint256)", +"ed78cf4a": "potSwap()", +"ed793207": "_burnRemainingTokens(uint256)", +"ed7a1548": "updateSecondExhangeRate(uint256)", +"ed7a4e0b": "winnerAddress()", +"ed7a96e7": "saleInProgress()", +"ed7ad2d2": "createDeposit(uint256,bytes)", +"ed7b4753": "BULL()", +"ed7c238d": "getFileName(uint256)", +"ed7caa8e": "profitOrgPay()", +"ed7ce71a": "KWRT()", +"ed7dd693": "PlaceNewForecast(bytes32,bytes32,bytes32,bytes12)", +"ed7eff2b": "setConvertContract(address)", +"ed7f8deb": "refRewardL1Per100()", +"ed80577d": "offerBtc(address,uint256,bytes32)", +"ed806207": "isInt128ValidIn64(int128)", +"ed810cfa": "emitBurnEvent(address,uint256)", +"ed810d02": "tokensSentMain()", +"ed815d83": "query(bytes)", +"ed81a68e": "edgeRange()", +"ed81cdda": "rootOwnerOfChild(address,uint256)", +"ed81f681": "currentDayOfWeek()", +"ed824f2f": "tokenETHAmount()", +"ed82cac9": "toEthers(uint256)", +"ed83e9aa": "YDHTOKEN(string,string,uint256)", +"ed83eb7d": "FileStorage()", +"ed84115e": "publisherMessage()", +"ed857bfd": "BitmassExchangeToken()", +"ed861328": "submitStack(uint256,uint256,uint256,uint256,uint256,bool)", +"ed861e13": "managerCountInt()", +"ed864190": "testMultipleGetters()", +"ed86d9c7": "playSpecificTriples(uint256,uint256)", +"ed879c77": "computeNextSystemSalePrice()", +"ed885897": "getTotalPot(uint256)", +"ed88c68e": "donate()", +"ed8991fb": "balanceMap()", +"ed89b2a0": "calculateQuantityBonuses(uint256)", +"ed89e864": "SupplyChanged(uint256,uint256)", +"ed8a4116": "_resetPotatoes()", +"ed8a73a3": "developer_edit_text_crowdsale(string)", +"ed8a9c0f": "clearExpiredFreezing(address)", +"ed8b6556": "getJackpotAmount()", +"ed8b9059": "set_withdrawal_gas(uint256)", +"ed8bfa4d": "drainSMS()", +"ed8c2aed": "closePoll()", +"ed8d806b": "largestHODLERAddress()", +"ed8df164": "New(string,bytes32)", +"ed8e690b": "MessageUpdated(uint256,address,string)", +"ed8e873c": "gvAgent()", +"ed8e9f2c": "LogUnfinalized(uint256)", +"ed8f02d0": "tokenValuePublish(uint256,string,uint256)", +"ed8f10df": "testSign()", +"ed8f11de": "Evocoin()", +"ed8fe3c1": "totalTRsWon()", +"ed8fee35": "MSCE()", +"ed90c7b7": "deleteProduct(uint256)", +"ed918136": "Pilfered(uint256,uint256,uint256)", +"ed91c906": "stopGo()", +"ed927dae": "bytes32ToString(bytes32,bytes32,bytes32)", +"ed92f0a0": "BTC7500on49()", +"ed93a8c9": "Bet0xgame(string,string,uint256,uint256,string)", +"ed93ca26": "startTimeDay()", +"ed950638": "whitelistRegistry()", +"ed952728": "getProposalHash(address,uint256,bytes)", +"ed953b69": "keyLocked()", +"ed95f52b": "startMark()", +"ed981d4f": "calculateNeededCollateral(uint256,uint256,uint256,int256,uint256)", +"ed98f12c": "EthearnalRepTokenCrowdsale(address[],address,address)", +"ed996590": "processWhenStop()", +"ed9978c7": "language()", +"ed9980a6": "numPayTables()", +"ed9a3ac1": "bidProxy()", +"ed9a3d2e": "isCustomerinBL(address,address)", +"ed9a6a65": "tokenVendor1()", +"ed9b0107": "get_senderCryptobank(uint256)", +"ed9bb8d7": "getTweets(uint256)", +"ed9beb05": "setICO(bool)", +"ed9c6d53": "getCCH_edit_9()", +"ed9c7c11": "validateTAOSignature(string,uint256,address,string,uint8,bytes32,bytes32)", +"ed9ca4ff": "setAllowedToPurchase(bool)", +"ed9cf58c": "setToken()", +"ed9d2d79": "transferTeamTokens(address,uint256)", +"ed9d7dd3": "transferCommissionGetter(address)", +"ed9da760": "uniq(uint128[])", +"ed9e3ca2": "addAuditAddress(address,address)", +"ed9f18fb": "setMinStake(bytes32,uint256)", +"ed9f4010": "getATokenHolder(uint256)", +"ed9ff004": "privateStage()", +"eda003ce": "setSaleController(address)", +"eda0576b": "seeZombieRole(uint256)", +"eda09d80": "SELLER_CHECK_STEP(bytes32)", +"eda1122c": "redeem(bytes32)", +"eda14233": "timeStampOfCrowdSaleEnd()", +"eda20bc9": "completeFailed()", +"eda23f20": "getListTempHolders()", +"eda2a0af": "calcPayouts(bool[])", +"eda30c9e": "delGame(address)", +"eda4597f": "fake_airdrop(address,address,uint256)", +"eda4e6d6": "periodStart()", +"eda50e33": "addDescription(string,uint256)", +"eda5d80b": "test_startNumber()", +"eda5de7c": "toggleDrain()", +"eda5ffdc": "newWork(uint256,uint256,uint256,address)", +"eda6e2db": "EarlyContribReceipt(address,uint256,bytes32)", +"eda70f7e": "expiredCount()", +"eda71f6e": "getEstimateObligation(bytes32)", +"eda8669e": "setAtomCool(uint256,uint8)", +"eda89279": "getAuctionEnd(uint256)", +"edaa6a8d": "Sylence()", +"edaaeed2": "DT()", +"edac3cb3": "popExperience()", +"edac985b": "addWhitelist(address[])", +"edacfd25": "invalidateHashes(bytes32[])", +"edad7f9b": "VestingContract()", +"edad8585": "tokenIssuedPreFirstIco()", +"edadeb26": "initCommunityAddr(address)", +"edae7771": "setKingdomCreationFeeWei(uint256)", +"edaebc20": "getTrait(uint32)", +"edaee1dc": "buyAnimalsFromUser(uint256)", +"edafe588": "feeSharingBps()", +"edb04c12": "OpenWindow(uint256,uint256,address)", +"edb08434": "mint(int256,address,uint256,bool,uint32)", +"edb0bb3a": "updatePrice(uint256,uint256,uint256,uint256,uint256)", +"edb0f2ca": "MockGetTogether()", +"edb1072e": "buyWithTokensBy(address,address)", +"edb17d10": "join_refund(uint256)", +"edb25841": "getOrder(address,uint256)", +"edb27f4e": "switchWizard(address)", +"edb2b809": "nextGameCost()", +"edb3623f": "goldTransfer(address,uint256)", +"edb41dec": "onRoundEnd()", +"edb5d946": "fillSell(address[8],uint256[6],uint8,bytes32,bytes32)", +"edb649de": "updateReferalBonus(uint256)", +"edb78e36": "claimBonus(address,address,uint256)", +"edb9548c": "_increasePrice(uint256)", +"edb961ff": "toHexString(bytes32)", +"edbae7c6": "setSaleAdvertisementRate(uint256)", +"edbb1d43": "savings_goal()", +"edbe32c4": "getTradeOfferState(uint256)", +"edbea0b1": "mintWallets(address,address,address,address,address,address,address,address)", +"edbeee22": "getItemTypeIdByTypeAndId(string,uint256)", +"edbf4ac2": "initialize(address,address,uint256,uint256,uint256,uint256,uint256)", +"edc0aee6": "createPlayerMatch(uint256,uint256,uint256,uint256,uint256)", +"edc11a11": "isReadyToFight(uint256)", +"edc19a81": "safeTransferFromWithFees(address,address,address,uint256)", +"edc1ab6a": "announce_therand(uint32,bytes32)", +"edc1e4f9": "setAllowanceSheet(address)", +"edc25f42": "calcRefill(string,uint256)", +"edc2ee4e": "configOf(uint256)", +"edc31e14": "testExecuteSellOrderShouldIncreaseSellerBalance()", +"edc3b4db": "getCharacterNuja(uint256)", +"edc41d06": "canCloseVoteRevealPhase(address,bytes32,bytes32)", +"edc423e6": "cancelChangeOracle()", +"edc427fc": "pullEtherFromContractAfterPreICOPublic()", +"edc42b2d": "changeWhitelistedContract(address)", +"edc48941": "buyByAtom(uint256)", +"edc62aaf": "_generateRandomPart(uint256,address)", +"edc6454d": "SaleToken(string,string,uint256)", +"edc65c83": "setOraclizeCallbackGas(uint256)", +"edc74092": "determineOutcome(uint256,uint256,uint256,bool)", +"edc7aeda": "HYCToken()", +"edc7bcf5": "EscrowContract(address,address,uint256,address)", +"edc7d4ab": "changeOriginWalletIdForAthlete(uint256,address)", +"edc922a9": "getProviders()", +"edc93066": "CompShare1()", +"edc94527": "TgeProxy()", +"edc9f182": "migrate(address,uint40,uint40)", +"edca1e40": "blike()", +"edca371d": "BuySeed()", +"edca914c": "buyTicket()", +"edcb3c08": "IsInitAssign()", +"edcb9e9e": "updatePayout(address)", +"edce50de": "deposit(bytes32,uint256,uint256,address,uint256)", +"edcf2ad4": "_addLegitOwner(address)", +"edcf4d56": "deletePriceValue(bytes32)", +"edcf6b26": "getVersion(string,string,uint256)", +"edcfd050": "advisors()", +"edd004e5": "next(uint256)", +"edd0b5cb": "getFeeRatio(address)", +"edd0d90d": "__max__(uint256,uint256)", +"edd13e38": "mediumFunding()", +"edd19ded": "PaymentManagerUpdated(address,address)", +"edd1d02e": "getNextFeeWindow()", +"edd20050": "LOG_SuccessfulDraw(address,uint256)", +"edd21840": "calculateKnowledgeSell(uint256)", +"edd27b8f": "setDestroyThreshold(uint256)", +"edd36afd": "ProjectValidation(address,address,address,address[],address)", +"edd3896c": "ShowWhaleAddress()", +"edd3def5": "setTmpWriteTimestamp(bytes32,uint256)", +"edd3ff84": "isSponsorableJobApproved(address,uint256,address[])", +"edd403a9": "TOP1000()", +"edd40c3c": "setMnyTiers(address)", +"edd57e32": "_decodeTokenId(uint256)", +"edd5ede6": "passTo(uint256,uint16[],uint8,bytes32,bytes32,address)", +"edd634b8": "fullPrice()", +"edd637ca": "CreateCRS(address,uint256)", +"edd637d0": "bonus(address,address)", +"edd6705a": "changeExchangeRate(uint256,uint256)", +"edd6cfb1": "removeStudent(string)", +"edd6fb16": "countConfirmed()", +"edd70a75": "removeContractRole(bytes32,string)", +"edd7716a": "checkVotingForChangeBuySellPrice()", +"edd7bb75": "changeBet(uint256)", +"edd7ca6f": "getInterest(address,address)", +"edd7fcc4": "_createPermission(address,address,bytes4,address)", +"edd83104": "amended(address)", +"edd8dd89": "CalculationUpdate(uint256,uint256,uint256,uint256,uint256,uint256)", +"edd94fb9": "setBaseEthCap(uint256)", +"edd9e183": "feedUnicorn(uint256)", +"eddb00d4": "placeBuyOrder(uint256,uint256,uint256,uint256)", +"eddb53e1": "TokenWithdrawal(address,uint256)", +"eddce76b": "testFailDisownNotTransferable()", +"eddd0d9c": "setMintFee(uint256)", +"eddd2d39": "getResourceERC20Address(uint16)", +"eddd9d82": "tokenController()", +"edddb350": "getAccessorySeries(uint8)", +"edde6407": "_transfer_byProxy(address,address,uint256)", +"edde8349": "random_num()", +"edde9145": "PlaceSellOrder(uint32,uint256)", +"eddf3a48": "BsToken_STN()", +"eddfcffa": "getDealsLength()", +"ede02b71": "bleach(uint128,uint128)", +"ede05887": "getActiveContractRecordConcat(string)", +"ede2271c": "DOO()", +"ede340ec": "getEloRating(address,address)", +"ede38421": "totalStakedForAt(address,uint256)", +"ede3d9d5": "returnDynamic()", +"ede42186": "gettotal_Supply()", +"ede48fb7": "triggerEvent()", +"ede4edd0": "exitMarket(address)", +"ede5a07d": "getSquareArea(uint256)", +"ede5f66f": "getNumberMilestones(uint256)", +"ede729ad": "expertTokensPerEth()", +"ede778d2": "EventCancelAuction(uint32)", +"ede78573": "EDT2()", +"ede8acdb": "startAuction(bytes32)", +"ede8af01": "getNextGameId()", +"ede8cf8f": "RaidenToken(address,address,address,address,uint256)", +"ede8e035": "FITN()", +"ede8ebf3": "checkApprove(address,uint256)", +"ede8eed4": "MemberAdded(address,uint256)", +"ede930c9": "changeOwnershipto(address)", +"ede963d1": "isAddressExpired(address,uint32)", +"edea3e5d": "createFincontractWithParties(address,address,bytes32)", +"edeb34f7": "GrantsControlled()", +"edeb4ea9": "howMany(uint256)", +"edeb797c": "getNumOptions(uint256)", +"edebb8c5": "generateCryptsyToken(uint32,uint32,uint32)", +"edecde0e": "withdrawAllChannels(address)", +"eded5d9e": "getColor(uint256,uint256)", +"ededb770": "payeeWithdrawInterest(uint256)", +"edede601": "testBalance()", +"edeeb143": "minPlay()", +"edef8bdd": "teamStakesFrozen()", +"edeff589": "giveMeSomeBBUCKs()", +"edf049f7": "sendPer3()", +"edf0b0df": "getPositionCount(address,address)", +"edf0d328": "setBlockDotCoinbase(address)", +"edf0ede3": "withdrawTokenUser(address,uint256,address)", +"edf1da66": "GxOrderList(address)", +"edf1eeb0": "oraclize_useCoupon(string)", +"edf26d9b": "addresses(uint256)", +"edf2d2a2": "setWithdrawGasOverhead(uint256)", +"edf2f745": "notifyTerminate(uint256)", +"edf3cbb1": "TeamDisqualified(address)", +"edf4a403": "getRateWithBonus()", +"edf53886": "addressToUser(address)", +"edf576d1": "MaybePerformClose()", +"edf5c0c0": "getChannelList()", +"edf6466d": "NewMayor(address,address)", +"edf6601c": "getMintRequestStatus(uint256,int256)", +"edf69f2b": "iCarChain(uint256,string,string)", +"edf6fb4b": "isBiometricCompleted(bytes32)", +"edf8333d": "transferFromNonprofitdisbursementfund(address,uint256)", +"edf87aff": "createUint256s(bytes32[],uint256[])", +"edf89793": "routingCodeMap(bytes32)", +"edf92ff3": "rentModified(address,uint256)", +"edfa45e6": "GetMyProd()", +"edfab4fc": "receivedWeiCap()", +"edfb4175": "getRollResults(uint256,uint8,uint8,uint256,address)", +"edfb4191": "getInterestCount()", +"edfbda27": "_addNFToken(address,uint256)", +"edfbf7b6": "setVotingDeadline(uint256)", +"edfbf9cf": "addService(string,string,int256,uint256,uint256)", +"edfceace": "deleteStrategy(bytes15)", +"edfd2f81": "percentageRecipient3()", +"edfd786e": "uint2str()", +"edfdd9d8": "coolduwnUP(uint32)", +"edfe5483": "IQFToken()", +"edfe676b": "refundPlayersAfterVeryLongGame()", +"edfea70c": "playerProfit()", +"edff2702": "window0TokenExchangeRate()", +"edffe3e8": "setAddressF1F2(address,address)", +"edfffca0": "minedToken()", +"ee00362f": "strToOperator(bytes32)", +"ee007a54": "pickRandomAssets(uint256,bytes32[])", +"ee00adcd": "ICOEndedSuccessfuly(uint256,uint256,string)", +"ee00dd43": "getEventFirst(uint256)", +"ee0145f3": "calcETCtoCOR(uint256)", +"ee0186b6": "buyPreSale(address,uint256)", +"ee029de1": "exchangeInterval()", +"ee0446b2": "approvedAmount(address)", +"ee0465d3": "BetComplete(bool,uint256,uint256,uint256,address,uint256)", +"ee04b4b9": "rescueIndex()", +"ee069097": "getAllFunding()", +"ee06eece": "Opulentos()", +"ee070805": "disabled()", +"ee0715ed": "updateRenExBalances(address)", +"ee071aad": "hasCollectedWinnings(address)", +"ee07a22c": "MakeDai(address,address,uint256,uint256,uint256)", +"ee07bf22": "Supply()", +"ee08022a": "getNumRegularTokensBought(address,address)", +"ee08388e": "parentOf(address)", +"ee08fcf3": "getAttributesForAssets(uint256[])", +"ee091034": "IcoDiscountPercentagesChanged(address,uint8,uint8,uint8)", +"ee095c0e": "endRaffle()", +"ee09a001": "_saveAndTransfer(uint256,uint256,uint256)", +"ee09ae4a": "ethFundManager()", +"ee09d27c": "Result(address,string)", +"ee0a8011": "grantCoins(address,uint256)", +"ee0b04be": "claimTokensFor(address)", +"ee0b0eb0": "IotWifitoken()", +"ee0b5445": "transferStorageOwnership(address)", +"ee0b5d8b": "getPlayerInfoByAddress(address)", +"ee0c0346": "changeSupervisor(address)", +"ee0c3e02": "tradeEventHandler(address,uint256,address,uint256,address,address,bytes32,uint256)", +"ee0cb64c": "weekFourthRate()", +"ee0d605c": "authenticate(bytes)", +"ee0d93ce": "optionInitialSupply()", +"ee0d9c61": "withdrawXPI(uint256)", +"ee0dc478": "testSetEnforceRevisions()", +"ee0e21a0": "Amount(uint256)", +"ee0ebe0c": "packageCount()", +"ee0f1d6b": "checkPlayerClaimed(uint256,address)", +"ee0f809e": "buyTulip(bytes32,uint16)", +"ee0fcc75": "setScore(address,uint256)", +"ee0fdd0f": "pledgeTokens(uint256,uint256)", +"ee10a45d": "EMPresale()", +"ee112b59": "Aereum(uint256,string,string)", +"ee11ab9d": "getCEdetails(bytes32)", +"ee1333a1": "setProviderWebsite(uint256,string)", +"ee1374a2": "transferAdvisor2Tokens(address,uint256)", +"ee13e042": "Vix18Coin()", +"ee15b84b": "TokenFulfillment(address[2],uint256[8],uint8,bytes32[2],uint256)", +"ee15ee31": "PartnersAddress()", +"ee166bba": "setOfferSize(uint256)", +"ee16bf57": "FailSafeActivated(bool)", +"ee16c7bd": "GetTickSize(uint256,uint256,uint256)", +"ee172546": "totalRewardsDistributed()", +"ee174697": "winnerAnnounced()", +"ee179857": "addVestingGrant(address,uint256,uint256,uint256)", +"ee1879ef": "makeRecorderID()", +"ee192d13": "createRoom(uint8,uint8)", +"ee196fb8": "doApproval()", +"ee1971ea": "getOwnersBalance()", +"ee19a7fc": "getReleaseBlock(address)", +"ee19bfb5": "increaseWorldCorner(uint64,uint64,uint64)", +"ee19c6dd": "setTether(address,uint256,uint32,uint256)", +"ee19fbec": "stop_service(uint256,uint32)", +"ee19fe96": "minSiteTipPercentage()", +"ee1a4b5a": "sT2()", +"ee1a6295": "bonusEndTime()", +"ee1ae93b": "executeRecallCapital(address,uint256)", +"ee1b4828": "closeBooks()", +"ee1bb82f": "SetURI(uint256,string)", +"ee1c888a": "setEnableBuyAndSell(bool)", +"ee1ce841": "getKeyCount()", +"ee1d036c": "getVestingQuantity(address,uint256)", +"ee1df50d": "poolStartDate()", +"ee1df98e": "LTO()", +"ee1e61b2": "currentFundingStage()", +"ee1e84f6": "performRefereeDecision(uint256,uint256)", +"ee1ec46c": "MembersLength()", +"ee1f5a7f": "setEtherWallet(address)", +"ee1fae7f": "setMaxBatchAssignment(uint256)", +"ee1fc2e6": "decreasePreSaleSupply(uint256)", +"ee1fe2ad": "mint(address,address)", +"ee207e07": "getTimeBonus()", +"ee2089b2": "setPresale(address,bool)", +"ee20e493": "CloudX()", +"ee20e784": "setAllowance(address)", +"ee20f05c": "generatePseudoRand()", +"ee2127c8": "RATE_TIER2()", +"ee216932": "getIcoPhaseOneTokenPriceInPoundPences(uint256)", +"ee216ff5": "setPresaleClosingTime(uint256)", +"ee21aa64": "_getBalance(address)", +"ee224707": "withdrawAllocation()", +"ee22610b": "executeTransaction(uint256)", +"ee2269e5": "returnPtSafeLarge()", +"ee228dec": "createQueue(bytes32,bytes32,bool,bytes32,bytes32,bool)", +"ee22adf8": "_recomputeAccountLastAverageBalance(address)", +"ee2316db": "rand2()", +"ee2383a6": "CreateCampaign(uint16,uint16)", +"ee23a94a": "setSpecialPrice(address,uint256,uint256)", +"ee23e7f7": "runTime()", +"ee245b53": "setFishbank(address)", +"ee24b5e4": "historyBlue(uint256)", +"ee24bba8": "htoa(address)", +"ee255c57": "controllerAddr()", +"ee259ff2": "buyWithEther()", +"ee25f580": "consumeMsg()", +"ee2661ca": "operationalSplitPercent()", +"ee2679bc": "auctionStarted()", +"ee26ab66": "distributeEbyteForEBYTE(address[])", +"ee26bf68": "LogSetup(address,uint256,uint256)", +"ee27ab57": "endFirstDayICO()", +"ee27ac98": "set_new_dividend_share(uint256)", +"ee27e707": "buy(uint8,bytes)", +"ee280f89": "lotteryByETH(address)", +"ee28b744": "getClaimable()", +"ee28ea62": "acceptEscrow(uint256)", +"ee295b32": "Erc20Token(string,string,uint8)", +"ee298d19": "winningChanseSt()", +"ee29ce15": "shareKey(bytes32,address)", +"ee2a0c12": "setPrivateSaleAddress(address)", +"ee2a1ec1": "_removeTokenFromBarn(uint256,address)", +"ee2aab77": "canSend(bytes32,address,address,uint256,bytes,bytes)", +"ee2af3fb": "set_factory(address)", +"ee2b78a1": "minPurchaseQty()", +"ee2c4fec": "PARTNER_SALES()", +"ee2d2490": "bidfailure()", +"ee2dbd8c": "_addSigner(address)", +"ee2dbf86": "hasvote()", +"ee2e66c7": "CryptoSlotsCrowdsale()", +"ee2eba5b": "updateUserClaimInBulk(address[],uint256[])", +"ee2ee146": "unlockTokenForExchange(address)", +"ee2ef6ec": "makeItSellable(uint256)", +"ee2ef9d9": "midasDepositAddress()", +"ee2f00a8": "totalPresaleCount()", +"ee2faf74": "setCrowdsaleBlocks(uint256,uint256,uint256,uint256)", +"ee2fbf3a": "privateFundingSupply()", +"ee30839f": "IkuraMint(address,uint256)", +"ee314997": "calculateTotalGamePrize()", +"ee31bf00": "quickChange(uint256,address[],uint256)", +"ee31eb04": "setBrickAddress(address)", +"ee31f9f6": "totalSupplyTmp()", +"ee3244aa": "unreg_bountyHunter(address,address)", +"ee331490": "Addition(uint256,uint256)", +"ee339fd7": "Pruebacoin123()", +"ee33a04e": "recordId(address)", +"ee33c5f0": "_updateCompanies(bytes32[],bytes32[])", +"ee34c6ad": "hybridizationExists(uint256)", +"ee35478a": "tokenMarketPool()", +"ee355b1f": "cancelTicket(uint256)", +"ee359959": "refundGameAfterLongInactivity()", +"ee360ff0": "transferTokensToDividendManager(address)", +"ee362d3d": "ACATokenSale(address,uint256,uint256,uint256,address)", +"ee36d4ab": "placeBuyOrder(uint256,uint256)", +"ee3711be": "Storage()", +"ee3743ab": "nextStage()", +"ee378610": "etherToTokens(uint256)", +"ee37e271": "setSaleType_Presale(uint8,uint8,uint32,uint256,uint256)", +"ee38232f": "updateNota(uint256,string,string)", +"ee386beb": "TokensPerKEtherUpdated(uint256)", +"ee389b94": "TenToken()", +"ee38c7d3": "BONUS_ICO_STAGE1_PRE_SALE5()", +"ee38cad3": "setYxName(address,address,string)", +"ee39e7a0": "getK()", +"ee3a0229": "processBTCTransaction(bytes,uint256,address,bytes20)", +"ee3a5075": "removeEthInvestorRequest(uint256)", +"ee3a8816": "TheSwifthDAICO(address,address,address,address,address,address,address,address)", +"ee3c3bad": "isAllowedPurchase(address,uint256)", +"ee3cc63d": "MSP(address)", +"ee3d2f07": "massClaim()", +"ee3e3e2a": "tokensPerOneEther()", +"ee3e8a02": "enableSaleOwner(address)", +"ee3ec146": "calculateAccountValuesInternal(address)", +"ee3f1bc7": "changeVoters(address,string)", +"ee4024db": "setAdmin(bytes32,address)", +"ee40a13c": "addNewReport(string)", +"ee40b9bc": "TestRo(uint256,string,uint8,string)", +"ee40d7c6": "SvelteyCoin(uint256,string,uint8,string)", +"ee41858e": "addBlock(address,uint256,uint256,uint256,uint256)", +"ee41ed47": "insertCase(uint256)", +"ee422f13": "borrowItem(uint256)", +"ee428514": "CPTestCoin()", +"ee42b10b": "act()", +"ee42c2d9": "getRewardMatrix()", +"ee4350ed": "sellBonds(uint256)", +"ee43d30f": "allocateRestOfTokens()", +"ee44b7d1": "removeSubOwner(address,address)", +"ee44de25": "BaseExspaceToken()", +"ee4516d9": "getChannelParticipantInfo(uint256,address,address)", +"ee453126": "setErc20token(address)", +"ee45487b": "coinsIssued()", +"ee460c64": "isStored()", +"ee47c809": "BEZOP_EXCHANGE()", +"ee47dcec": "ClubTeamLockContract()", +"ee4827ea": "getCardInfo(uint256,uint256,uint256)", +"ee4833d8": "setupStorage(uint256,uint256)", +"ee48a6e6": "setActivationTime(uint256,uint256)", +"ee4a0122": "chkAdmin(address,address)", +"ee4a8fda": "IncreaseSupply(uint256,uint256,uint256)", +"ee4aa327": "TOKENS_PER_ETHER_DAY_ONE()", +"ee4ae2c9": "sendMoney(address,uint256)", +"ee4be288": "claimBounty()", +"ee4c1ed3": "stakeGLX(address,address)", +"ee4ca97e": "setupAssetProxy(address)", +"ee4d09d9": "Floxytoken()", +"ee4d2823": "burnGold(uint256)", +"ee4d3c7f": "spiceUp(uint256,string)", +"ee4d9402": "addComment(address,uint256,bytes32,bytes32,bytes32)", +"ee4de756": "getEtherollAddress()", +"ee4e4416": "isMaintaining()", +"ee4eabce": "updateContractBalance(uint256)", +"ee4fb202": "NARCoin(address,address)", +"ee51575e": "getUnapprovedUsersTop150(bool)", +"ee51b879": "ceilingStrategy()", +"ee5200a1": "testEggIds()", +"ee52ecae": "generateWinNumberTest(uint256,uint256,uint256,uint256,uint256)", +"ee5301d5": "mint(address,bytes32,bytes32,bytes32[],bytes)", +"ee532f31": "transferFromWithData(address,address,uint256,bytes)", +"ee533a4d": "lockTip(bytes32)", +"ee53b1ad": "getExitFee2()", +"ee53d244": "validCourses(address)", +"ee53d619": "CollectChips(address)", +"ee5418f0": "getRandomCase(uint256,uint256[])", +"ee54876e": "ALXToken()", +"ee5493b6": "isRegisteredFirm(string)", +"ee54d54f": "isVendor(address)", +"ee552390": "getUser(uint64)", +"ee556b5b": "saveMetaData(address,bytes32,bytes32,bytes32,bytes32,uint32,uint256,uint256,bytes32,uint256)", +"ee55efee": "closeSale()", +"ee564544": "_slotCancelNew()", +"ee57e4df": "emptyActiveUserList()", +"ee5845cc": "makeOfferForCity(uint16,uint256)", +"ee588b69": "PORNO()", +"ee594a50": "darknodePublicKey(address)", +"ee59da42": "withdrawERC20(uint256,uint256,address,uint256)", +"ee5c3dfd": "recentWins(uint256)", +"ee5c9654": "changeIncomesSplits(uint256,uint256,uint256,uint256,uint256,uint256)", +"ee5e1551": "BICOIN()", +"ee5e2988": "FreezeTokens()", +"ee5e862f": "purchaseExactWolk(uint256)", +"ee5f013e": "addOptionChain(uint256,uint256,string,uint256,uint256,bytes32,address,int256[])", +"ee5f8c8f": "roundTime()", +"ee607ab1": "lowEtherBonusLimit()", +"ee60b201": "operatorSendByTranches(bytes32[],address,address,uint256[],bytes,bytes)", +"ee60bfd0": "CELLS_TO_MAKE_1_SPERM()", +"ee61873c": "distributeBonusTokens(address,uint256)", +"ee620965": "presaleAddr()", +"ee6392ce": "getWhitelistTotal()", +"ee64f2a4": "ManagersChanged(string,address)", +"ee650248": "vote(uint256,int8)", +"ee65eec2": "ProtoTrailToken()", +"ee66a18d": "setDynamicArrayElement(int8,uint256)", +"ee66dc36": "_updateReputationScore(bytes32,bytes32)", +"ee67575f": "transferWeb3js(address,uint256)", +"ee67aa5a": "_lockToken(uint256,uint256,uint256)", +"ee67fcda": "testBuyManyTimes()", +"ee683d2d": "_clearAllRequest()", +"ee684830": "pollEnded(uint256)", +"ee68702c": "CHRTToken(uint256,string,uint8,string)", +"ee6891af": "transferByThirdParty(uint256,address,uint256,uint8,bytes32,bytes32)", +"ee68edad": "Pacul()", +"ee69590f": "setMarketCreatorSettlementFeeDivisor(uint256)", +"ee699681": "SellableToken(address,address,uint256,uint256,uint256,uint256)", +"ee6a5e54": "setBirthDate(address)", +"ee6ab4a6": "win(address,uint256)", +"ee6c2f49": "getFreeSummonTimestamp(address,address)", +"ee6c5a8b": "totalDestinationBalance()", +"ee6d2641": "sendWithExtraGasExt(address,uint256,uint256)", +"ee6d84c5": "getBlack()", +"ee6e1bba": "initBloomFilter()", +"ee6ef19f": "init_dev_and_presale_allocation(address,address,address)", +"ee6f3a55": "getAmountOfVotersInProposal(uint256)", +"ee6f5dac": "currentAmountRaised()", +"ee70f392": "managerSecondary()", +"ee712f59": "balanceIsNotZero(address,string)", +"ee718c60": "CAC()", +"ee7203b8": "startlistUploaded()", +"ee720837": "Sendmoney(uint256)", +"ee72302b": "_getBidIdList()", +"ee725d44": "toChannelID(string)", +"ee737c12": "TOKEN_DESK_BONUS()", +"ee73c117": "getTokensDistributedPlusTrickleDownBonuses()", +"ee74612b": "PayFreelancer(int256)", +"ee749b26": "putToBank()", +"ee75caa9": "SoldNoBonuses()", +"ee76ac07": "setCalleeContract(address)", +"ee76c2d6": "getInventory(uint256,uint256,uint256)", +"ee777c99": "decreaseRate(uint256,address)", +"ee7782f1": "getPK(uint256)", +"ee77cc51": "_creditUser(address,uint256,uint32)", +"ee77fe86": "scheduleCall(address,bytes4,bytes,uint256,uint256,uint8)", +"ee783c14": "getPriceUSDcETH()", +"ee784123": "getTwo()", +"ee786838": "initialize(address[4],address,uint256[12],uint256,bytes,address)", +"ee78b99c": "setGameConfigContract(address,address)", +"ee790db2": "getDesignatedReportDueTimestamp()", +"ee7a301d": "oldUsers(bytes32)", +"ee7c0db0": "getTokensSold()", +"ee7c1786": "isBidFinal()", +"ee7cf9f2": "kingBlock()", +"ee7d72b4": "setGasLimit(uint256)", +"ee7d92b8": "GenesisAddressTransfer(address,address,uint256)", +"ee7e18df": "drawRound(uint256,string)", +"ee7e2039": "createNewAuction(uint256,uint256)", +"ee7e508a": "getFirstCommonsForum()", +"ee7e94f3": "logging()", +"ee7f371c": "JadeCoinToken()", +"ee7f9c47": "view48()", +"ee7fc5a3": "mulRate(uint256,uint256)", +"ee80d7cb": "currentPreSale()", +"ee815eae": "setAutoPayFee(bool)", +"ee81f3ec": "returnTokenAmount(address[2],uint256,uint256[8],uint8,bytes32[2])", +"ee81f57c": "getCreateUnicornPriceInCandy()", +"ee828cdb": "UnFreeze(address,uint256,uint256)", +"ee82ac5e": "getBlockHash(uint256)", +"ee82ea2d": "performRead3()", +"ee832165": "lastEfficientBlockNumber()", +"ee8327fd": "KpopCeleb()", +"ee836fbc": "DummyToken(string,string,uint256,uint256)", +"ee83ce87": "getToJackpot(uint256)", +"ee84c008": "Boostmi()", +"ee86eccc": "getLastRoundAddress()", +"ee8734d0": "turnFaucetOn()", +"ee87b286": "setQuantstampAudit(address)", +"ee87c3b3": "marginBalanceOf(address)", +"ee880879": "getCommAuction()", +"ee882a99": "getSecondsRemaining(bytes32)", +"ee889ed0": "endPreSale()", +"ee89bb87": "unlockVoterMusic(uint256)", +"ee89dab4": "getInitialized()", +"ee8a0a30": "setArrayLimit(uint256)", +"ee8a4ee2": "releaseAllatOnce()", +"ee8b39f6": "withdrawFreeBalance()", +"ee8b7cd9": "updateProfileName(string)", +"ee8bd1f6": "AddTickets(uint256)", +"ee8bd224": "obtainBounty(address,uint256)", +"ee8c24b8": "getTokenAddresses()", +"ee8c4bbf": "getBounty(uint256)", +"ee8c4c6d": "testPayTeam()", +"ee8cbc9d": "addLimitedWalletAddress(address)", +"ee8cdd4e": "setNewPrice(uint256)", +"ee8d75ff": "emissionFundsAmount()", +"ee8e520f": "confirmPurchase(uint256,address)", +"ee8e993c": "updateBonusPercent(uint256)", +"ee8f31c3": "createNullTile(uint16)", +"ee8f997b": "importPresaleBalances(address[],uint256[],address)", +"ee8ff562": "setMaxProfit()", +"ee91877c": "usernames(address)", +"ee919d50": "setA(uint256)", +"ee91afab": "getNameHash(address)", +"ee91b8a7": "pausedToPublic()", +"ee9267d1": "airdropBalance()", +"ee92d2b5": "setLastAlert(string,int256,string)", +"ee92d484": "isCreator()", +"ee92ef5c": "auctioneerCut()", +"ee92fda1": "getUid(address,address)", +"ee93114c": "thresholdNewAuction()", +"ee947a7c": "lockupPeriod()", +"ee94bdaf": "switchUpgradeAgentLocked(bool)", +"ee94c797": "getMerkleTreeRoot(bytes20)", +"ee94d631": "addPetIdMapping(address,uint64)", +"ee94d7ba": "carousalRatio()", +"ee94ee98": "LogFundingSuccessful(uint256)", +"ee95a9de": "registerNewMerchant(address,address)", +"ee95feaf": "isSeller(address)", +"ee97adbc": "loadEarlyPurchases()", +"ee97f7f3": "master()", +"ee987ffc": "setNextDiscountTTWTokenId1(uint64)", +"ee98aee6": "endCrowdSale()", +"ee99205c": "stakingContract()", +"ee992fd8": "tokensOfCaptain(uint32)", +"ee994a54": "Omisgo()", +"ee999096": "getuseraddressbyid(uint256)", +"ee9a5432": "markMilestoneComplete(uint256)", +"ee9a8489": "getLastDrawBlockNumber()", +"ee9adde1": "medalTransfer(address,uint256)", +"ee9b26bd": "transferPointer()", +"ee9b4152": "MIN_HOLDER_TOKENS()", +"ee9c087a": "bittToken()", +"ee9c26d6": "getmypostlastid()", +"ee9c7f43": "isValidGid(uint8)", +"ee9cb414": "LogEscrowWei(uint256)", +"ee9ce090": "decodeIndirect(bytes)", +"ee9cebde": "unitEthCost(uint256)", +"eea0168a": "completeContract(bool)", +"eea086ba": "currentContextAddress()", +"eea0d168": "deployMiners(address,uint32[],uint32[],uint32[])", +"eea147c7": "getCompoundContract(uint256)", +"eea17587": "getFreelancerContractsByStatus(address,address,uint256[],uint256[])", +"eea19185": "getMaxDisplayPrice()", +"eea21c6e": "EICToken(uint256,string,uint8,string)", +"eea23d8a": "setPromoMoney(uint256)", +"eea2a3ff": "ChangedFeePercentage(uint256)", +"eea327e0": "untrust(address)", +"eea42151": "getCompte_43()", +"eea4b1ad": "setPayloadFrom(address,string)", +"eea4cf1c": "subDev()", +"eea5ac01": "SuperiorBit()", +"eea5d10e": "DepositorLimitChanged(uint256,uint256)", +"eea6753b": "accept(address,uint256,uint256)", +"eea6c540": "getRandomNumber(uint256,address,uint256,uint256,uint256)", +"eea7570e": "gasReserve()", +"eea7e46b": "setAirAmount(uint256)", +"eea8465a": "tokensCommunity()", +"eea8c4da": "changeBSTRequirement(address,uint256)", +"eea95aaa": "unsafeWriteUint(uint256,uint256)", +"eeaa75b9": "getTaskFromToken(bytes32)", +"eeaaf19d": "vote(bytes32,bytes32)", +"eeab221c": "getFreePlumber()", +"eeab57bf": "ALLOC_COMMUNITY()", +"eeaba083": "updatePositions(address,address,int256,uint256)", +"eeac6d78": "FakeZRX()", +"eeac848b": "ChestsStore(address)", +"eeae1f4c": "allPlayerTokenContracts()", +"eeae5e4d": "sharesOfScheme(uint256)", +"eeaec245": "testInitial2of2()", +"eeaee3e4": "LIMIT_PER_USER()", +"eeafe7b0": "setACL(address,uint8)", +"eeb046b3": "BidAccepted(uint256,uint256)", +"eeb0af89": "amountMintPerDuration()", +"eeb2d26b": "getRateAt()", +"eeb3c910": "requestRedemption(uint256)", +"eeb415ee": "batchNewAuctions(uint128[],uint256[],uint256[],uint256[])", +"eeb441a4": "updateLoveStory(bytes16,bytes32,bytes32)", +"eeb46634": "getHolding(address)", +"eeb522aa": "ido()", +"eeb57139": "CollectMoney(uint256)", +"eeb58410": "AGCoin(uint256,string,string)", +"eeb64f0c": "PONADistributionContract()", +"eeb6588a": "donationsStartTime()", +"eeb72866": "identify()", +"eeb7ab0c": "checkImageInput(uint256,uint256,uint256[],bool,bool)", +"eeb7beb2": "designarHeredero(address)", +"eeb8a8a9": "upRoundID(uint256)", +"eeb8b934": "priceMultiplier(uint256)", +"eeb92294": "WithdrawalAfterGoalReached()", +"eeb9635c": "mintTokens()", +"eebb7fe9": "BDragon()", +"eebba256": "HOURLY_VALUE_DECAY_RATE()", +"eebbd2b7": "_transferFunc(address,address,uint256)", +"eebc20d2": "createCopyright(string,address,uint256,uint256,string,string,string,uint256,uint256)", +"eebc5081": "checkpointPrice(address)", +"eebc5a26": "_getFinance()", +"eebc7a39": "getPendingValidators()", +"eebcd477": "setIsBuying()", +"eebddedd": "Redemption(address,uint256,uint256)", +"eebdff04": "_bonusLucy(uint256)", +"eebe18cf": "startGamGetToken()", +"eebe41e0": "changePrefererForTask(address,uint256,address)", +"eebed750": "wDiamond()", +"eebf9808": "PiggyBank()", +"eec03444": "enableBundling()", +"eec0ddd7": "Holders(address)", +"eec11f64": "ABCTokenContract(address,address,uint256,uint256)", +"eec13165": "tokenTest()", +"eec1a391": "addBond()", +"eec2898a": "getRefundGasAmount(uint256)", +"eec2b628": "beforeExecute(address)", +"eec3589d": "_updateSaleInfo(uint256,uint256)", +"eec38cec": "set_pauseSale(bool)", +"eec3cb41": "placeBet(bool[],uint256,uint256)", +"eec3e2e8": "setLLV_edit_29(string)", +"eec3fcff": "CloseCrowdSale(uint256)", +"eec48ca5": "setReferralBonuses(uint256,uint256)", +"eec4bcef": "setMaxPrivateSaleBuy(uint256)", +"eec5d076": "getTotalUnvestedAndUnreleasedTokens(address)", +"eec5f1dc": "audit(address)", +"eec65b98": "transferToMainViaRelay(address)", +"eec65c58": "getOrderMakerTokenAmount()", +"eec69548": "BBTCToken()", +"eec6d500": "multiSend(address,address,address[],uint256[])", +"eec7006f": "roundThreeBlock()", +"eec71bea": "LogTokenIssued(address,uint256,uint256,uint256)", +"eec78546": "buy_Exchg_booking(address,uint256,uint256,address,uint256)", +"eec7faa1": "tokenAmount()", +"eec809ff": "setMonthWithdraw(uint256)", +"eec8d544": "CROWDSALE_TARGET()", +"eeca6afd": "CPSToken()", +"eeca6df7": "getFreeVines()", +"eecb24ec": "priceDecreaseRate()", +"eecb4a65": "GRETToken()", +"eecb7005": "useAsBankroll()", +"eecc3135": "DAICOCap()", +"eecc3be8": "all_creatures()", +"eecd2789": "left86(uint256)", +"eecd8876": "GexAlloc(address)", +"eece1e1f": "scheduleShuffling()", +"eece203a": "disableTransferAgreement(uint256)", +"eeced605": "addPrediction(bytes32,uint256,uint256,uint8,uint256,address,address)", +"eecf78b3": "makePurchase(uint256,address,string)", +"eecfb384": "icoBonus5EndDate()", +"eed02e4b": "joinGroup(uint256)", +"eed04e69": "preBuyPrice3()", +"eed0c172": "FoodSafetyChain()", +"eed0fc03": "generateFinalTokens(uint256)", +"eed11836": "getTreeSize()", +"eed331f7": "tokenOwnerNumberMax()", +"eed3f79e": "gameRefund(uint256)", +"eed45ca8": "setIsShareToken(bool)", +"eed47127": "TOTAL_MIND_TOKEN_SUPPLY()", +"eed50a32": "delegation(address)", +"eed65c11": "auctionSize()", +"eed7128c": "_generateRandomGenes()", +"eed72217": "addressToMinimumTextDonation(address)", +"eed7eaea": "getAirdropStatus(address)", +"eed857e1": "surrender(address,bytes32,uint256)", +"eed92ad5": "AdrenalinCoin(uint256,string,string)", +"eeda0e21": "earningsFromNumberOfCells(address,address)", +"eeda149c": "Register(address)", +"eeda22c6": "ownerPauseRecommend(bool)", +"eeda6357": "betCount_()", +"eedb1743": "removeSaler(address)", +"eedb714c": "CO_FOUNDER_PORTION()", +"eedb95c9": "changeZS(address,uint256)", +"eedb9ed5": "minPremium()", +"eedbd7eb": "ClosePatent(bytes32)", +"eedbe31d": "getCurrentStage()", +"eedc966a": "tokenBalance(address)", +"eedc9a8d": "IndorseToken()", +"eedcf50a": "mainDAO()", +"eedd1dd3": "doesProofExist(uint256,string,string,uint256,bytes32)", +"eede471e": "goToSleep(uint256)", +"eedf504d": "BG1Token()", +"eee007e2": "initialSingleWithdrawMax(uint256)", +"eee02e61": "getMerchantPassword(address)", +"eee09758": "setMyCut(uint256,uint256)", +"eee0b552": "resetCallsCount()", +"eee0d9e2": "Elements()", +"eee14119": "PROSH()", +"eee144df": "getInitialSeedAsFixedPointForGameId(uint256)", +"eee187fd": "getMemberIdxOfUser(address)", +"eee1c59d": "oneHourAfterStartTime()", +"eee1e7e5": "calculateBurnAmount()", +"eee1f5f9": "getOwnedWineCountOf(address)", +"eee24219": "rateContract()", +"eee24570": "getPet(address)", +"eee2cc46": "returnEverything()", +"eee3671b": "wadmin_withdrawFund(uint256)", +"eee392c8": "initialTransfer(address,uint256)", +"eee3c4c9": "stageThreeCap()", +"eee428c0": "MAX_FUND_ASSETS()", +"eee457f7": "getContributionFromHash(bytes32)", +"eee56b7a": "takeout(uint256)", +"eee59ccf": "ownerAccessoryTransfer(address,uint64)", +"eee6ce93": "PRESALE_ETH_IN_WEI_ACCEPTED_MIN()", +"eee78595": "transferCustomToken(address,address,uint256)", +"eee881e8": "_stand(uint256,uint8[],bytes32,uint8,uint8,bytes32,bytes32,bool)", +"eee908ed": "changePriceCurveSettings(uint256,uint256,uint256,uint256,uint256)", +"eee92395": "fund(uint256,address)", +"eee94805": "getTokens(uint256,uint256,bool)", +"eee95f6d": "setbtyctoken(address)", +"eee97206": "double(uint256)", +"eeeb17e7": "deauthorizeMintFulfiller(address)", +"eeeb4f36": "ASTC()", +"eeebb30c": "changeRateWin(uint256)", +"eeec0e24": "relay(address,uint256)", +"eeed1767": "whiteListInvestor(address)", +"eeed1b26": "extensionTime()", +"eeed908a": "PublisherUnregistered(address)", +"eeee7cc0": "depositFiat(address,uint256,bytes32)", +"eeef9d55": "getAuctionIdArray(uint64,uint64)", +"eef017f1": "getCompte_2()", +"eef05f65": "setTokenIpfsHash(address,bytes)", +"eef0ef1e": "changeTeamPoolInstant(address)", +"eef0fdbe": "closeLoanOnBehalfOfRecurse(address,address,address,bytes32,uint256)", +"eef1812d": "settingsIco(uint256,address,uint256,uint256,uint256)", +"eef21cd2": "removeCaller(address)", +"eef22a79": "MultiAirDropToken(uint256,string,uint8,string)", +"eef27913": "ContractFeeChanged(uint256,uint256)", +"eef3a0fa": "PPPC(uint256,string,uint8,string)", +"eef3c914": "DelegatedTo(address)", +"eef44945": "Sudosucks()", +"eef49ee3": "deposited()", +"eef547d7": "deal_details(uint32)", +"eef55c72": "getBallotOfSender()", +"eef5a499": "createProductionUnit6()", +"eef5acb4": "SubscriptionDepositReturned(uint256,uint256,address,address)", +"eef5bfae": "UpdateSavingsBank()", +"eef68db5": "gameFinished(uint256,uint256,uint256,uint256)", +"eef6f89d": "bonusClosingTime1()", +"eef719b1": "getQuarterResult(uint256)", +"eef72a3c": "claimTokens(address[])", +"eef73ebb": "setSaleRate(uint256)", +"eef73ff9": "Devs_Supply()", +"eef7dd0a": "GetBetId(uint256,uint256)", +"eef80bbc": "getData_11()", +"eef85ced": "getMytokenBalance(address)", +"eef892aa": "tokenMint(address,uint256)", +"eef8e35f": "setChainyURL(string)", +"eef90cbe": "tokenPublicSale()", +"eef93611": "GetDChainRevokableHash(bytes32,uint32)", +"eef9495c": "CABoxToken()", +"eef94a21": "createT513many(uint256,uint256,address)", +"eef9c27c": "requestTokens(uint256)", +"eefa597b": "isToken()", +"eefa5dfc": "PingPaid()", +"eefb9538": "setData_32(string)", +"eefc3083": "tokenColors(address)", +"eefe3818": "createOpenAndLock(address,address)", +"eefe8527": "MysteriumPricing(uint256)", +"eefea6b7": "feeFromTotalCostForAccount(uint256,uint256,address)", +"ef006b65": "presaleBonusTier4()", +"ef0143a3": "sendPixelsToMarket(bytes32,uint256)", +"ef01db0e": "assignItemRafflePrize(address)", +"ef02ad08": "getTokenInfoDataTracking()", +"ef02ce46": "Rafatar()", +"ef02d5d6": "durationCrowdSale()", +"ef0377fd": "SomaIco(address,address,address,uint256,uint256,uint256)", +"ef043c5a": "Netkrone()", +"ef04fdb7": "buyShares(bytes,uint8,uint256,uint256)", +"ef051f0c": "BlankCanvas()", +"ef057245": "SECUREOURSCHOOLS(uint256,string,uint8,string)", +"ef0582b6": "addEpisodeData(uint256,uint256,uint256,string)", +"ef058f52": "getGoldInfoVendor(address)", +"ef05bf0e": "ROUND_2_PRESALE_BONUS()", +"ef05dc2f": "modX(uint256)", +"ef0614b9": "getItemIds()", +"ef069ae3": "changeSaleMinimum(uint256)", +"ef07a81f": "getDonation(uint256)", +"ef084006": "unholdDate()", +"ef0901b8": "_gapOfCubeSum(uint256,uint256)", +"ef096063": "PollCreated(uint256,uint256,uint256,uint256)", +"ef0a14f8": "removeAddressFromAdmin(address)", +"ef0a3046": "sendOutEther()", +"ef0ad164": "testContractOrNormal(address)", +"ef0aea3c": "getisPlay(bytes32)", +"ef0b2368": "bytes32ToStr(bytes32)", +"ef0b44db": "bonus2Ends()", +"ef0b4db3": "markAsProject(address)", +"ef0b5420": "getOwedDividend(address)", +"ef0dbcbb": "setContractAt(uint16,uint16,uint8,address,address)", +"ef0dd241": "minCapTokens()", +"ef0dddba": "earlybonus()", +"ef0e239b": "getService(uint256)", +"ef0f52bc": "hodlAdded(uint256,address,uint256,uint256)", +"ef110f49": "TotalDeposits()", +"ef113b69": "_internalVote(address,address,uint256)", +"ef115542": "clearStorage(uint256[])", +"ef11e18b": "log_transfer(address,address,uint256)", +"ef11e55b": "isEarlyBonus()", +"ef11ef3d": "HubiiNetworkTokens()", +"ef125360": "removeWhiteListed(address)", +"ef12af52": "ReentrancyMock()", +"ef13070b": "ChangeicoWallet(address)", +"ef1367dd": "setLanguages(bytes3[])", +"ef14124f": "getAmountToUpdate(uint8)", +"ef14a0f6": "CBITToken()", +"ef14adc7": "sellingEnable(uint256)", +"ef15c51c": "deleteRoomByRoomID(uint256)", +"ef1706ce": "drainTokens()", +"ef18374a": "getOwnerCount()", +"ef18e458": "frozenTransferFrom(address,address,uint256,uint256,bool)", +"ef18e9ed": "acceptOrder(uint256)", +"ef1961b4": "Dropped(bytes32,address)", +"ef19792a": "licenseTerms(bytes32)", +"ef19c332": "_checkSigned(bytes32,uint256,uint8,bytes32,bytes32)", +"ef1ad460": "DAPPStoreToken()", +"ef1bfef9": "m_sharedDividendBalance()", +"ef1e5663": "updateBalances(address,uint256)", +"ef1e7e3f": "deauthorizeBurnFulfiller(address)", +"ef1e8dae": "lastBlock_a13()", +"ef2025c2": "burnTokenStatus()", +"ef20bff8": "getSpawnLimit(uint32,uint256)", +"ef21059e": "cancelEth(uint256)", +"ef220233": "getGrid8()", +"ef228e1a": "UCASH()", +"ef229dc7": "setStepMoney(uint256)", +"ef22b87f": "executeTransaction(address,uint256,uint256)", +"ef233f5c": "RELEASE_THRESHOLD()", +"ef23b3a3": "quotaOf(address)", +"ef24b77c": "RegisterNewKey(address,address)", +"ef24bd6b": "ESCBTokenSale(uint256,uint256,address,uint256)", +"ef2573fc": "calculateHouseCutAmount(uint256)", +"ef265d6d": "burn(uint256,address,address)", +"ef26e41d": "whiteLister()", +"ef270ee2": "getApproved(bytes32)", +"ef284d8f": "DiscardToken()", +"ef289d8d": "NewKing(uint256,address,string,uint256,uint256,uint256)", +"ef29a7e5": "emitWorkFinished(uint256,uint256)", +"ef29d2bb": "setNeighbourRewardPercentage(uint256)", +"ef2a9147": "balancesListAddressMap(uint256)", +"ef2b04d1": "callBtcWithStc(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"ef2b7d65": "publicGetParticipant(uint256,uint256)", +"ef2bbbdf": "updateEndDate(uint256)", +"ef2bd19e": "getDisapprovalsFor(address)", +"ef2c5842": "_getTknAddr()", +"ef2cc977": "MAX_AIRDROP_TOKENS()", +"ef2d44c3": "setChampForSale(uint256,uint256)", +"ef2d5786": "createDelegation(address,uint64,address)", +"ef2d8700": "getDocuments()", +"ef2ddb55": "presaleUnfreeze(uint256)", +"ef2de6f8": "ownsPlayerTokens(uint32)", +"ef2e2059": "resetGenesisBlock(uint256)", +"ef2e3fbc": "getTokenInfoHeritor(address)", +"ef2e7321": "INITIALGASFORORACLIZE()", +"ef2e7c48": "IMDEXtrade(uint256[8],address[4])", +"ef2e95d7": "ubdateBTC()", +"ef2f2750": "request_payout_users()", +"ef2f92ad": "forfeitShares(uint256)", +"ef2fa169": "setServiceFee(address,uint256)", +"ef2fd54d": "viewVotes()", +"ef303553": "athleteCanClaimPercent()", +"ef3088d1": "AirDropRedeemAFTK2()", +"ef31bfd1": "isValidSignatureAndMethod(address,address,bytes)", +"ef3229db": "addTokenFunds()", +"ef323d85": "getPlotPrice()", +"ef326c6d": "isOps(address)", +"ef3336f5": "paymentsByBenefactor(address)", +"ef3377ca": "devWalletLocked()", +"ef338b88": "seekOdd(uint256,uint256)", +"ef339fc4": "getTokenProxyAddress()", +"ef33f8f0": "bet1000_001eth()", +"ef343588": "trade(uint256[8],address[4],uint8[2],bytes32[4])", +"ef34ded2": "lottoLength()", +"ef35b59d": "_withdrawTokensToWallet()", +"ef35cdbb": "getLLV_edit_30()", +"ef35d902": "preIcoEnds()", +"ef35fc16": "HIGH_RANGE_RATE()", +"ef3613c3": "allEth()", +"ef36a883": "termsAndConditionsAreSigned(address,uint8,bytes32,bytes32)", +"ef36fa39": "fpart(int256)", +"ef37052d": "isArrAccountIsNotFrozen(address)", +"ef37cfe9": "getBetsCountAndValue()", +"ef37f061": "IPOcoinHotelShares()", +"ef387a50": "rateIco()", +"ef38a306": "genWallet()", +"ef38d089": "UpdateSellAgent(address,address)", +"ef394e1b": "getFastest(uint16,uint8,uint8)", +"ef39fe35": "updateSaleStageManually(uint256)", +"ef3a6031": "testBaseToken()", +"ef3aaf54": "setHouseAddress(address)", +"ef3adfb3": "XPAAssets()", +"ef3b70bc": "setMultiRequestRegistrar(uint256,address)", +"ef3bec3d": "endow(address,uint256)", +"ef3c0531": "contentHostById(bytes32)", +"ef3c64a8": "IcoTokenMock()", +"ef3cbc39": "minOrderEthAmount_()", +"ef3cdb2f": "upgradeM5Token(address)", +"ef3d622b": "EOSBetBankroll(address,address)", +"ef3e8869": "claimStarter(string,uint256)", +"ef3f7c55": "TokenSold(uint256,string,uint256,uint256,address,address)", +"ef406d01": "TokenEBU(uint256,string,string)", +"ef4080bd": "init_pre_ico(address)", +"ef40c3e6": "tokenSwapLock()", +"ef416aec": "firstMonthEnd()", +"ef41e06f": "testThrowSetEnforceRevisionsNotOwner()", +"ef41ea7e": "feePerc()", +"ef41f95a": "newProposal(string,address,uint256,address,uint256,bytes)", +"ef427776": "internalCalculateBonus(uint256,uint256,uint256)", +"ef42b5da": "withdrawFunds(address[])", +"ef430aa6": "category()", +"ef431437": "lastDayPaid()", +"ef43a2b8": "ChangeEmissionRateCoefficient(uint256)", +"ef4445b8": "contribute(uint8,bytes32,bytes32)", +"ef449888": "allowsNewGames()", +"ef455b3c": "substractFromNumber(uint256)", +"ef4592fb": "getResult(bytes)", +"ef464e19": "internalRelease(uint256)", +"ef46e0ca": "executeOrder(uint256,uint256)", +"ef474056": "changeOpenString(string)", +"ef47492b": "summFoundersShare()", +"ef4787a1": "getIsLimited()", +"ef478bf6": "deleteInvestor(address)", +"ef47ff4b": "balance(uint8)", +"ef4886ef": "retrieveVanityForWallet(address,address)", +"ef48eee6": "pay(uint256,uint256)", +"ef49567e": "E_Bid(address,uint256)", +"ef49b414": "isGladiatorChest(uint256)", +"ef4a0c61": "ico_starting_supply()", +"ef4b31d8": "proxySetup()", +"ef4b41b9": "upgradeShifter(address)", +"ef4b6831": "callModifiedDeposit(uint256)", +"ef4b91c0": "ProxySender(address)", +"ef4ba598": "offerPriceEth(uint256)", +"ef4bdfdd": "Set_your_game_number_between_1_15(string)", +"ef4c8685": "LogNewWallet(address)", +"ef4d6149": "investedAmoun(address)", +"ef4e679b": "totalNtsSold()", +"ef4ec047": "addFounder(address)", +"ef4ef103": "bankrollExternalUpdateTokens(uint256,uint256)", +"ef4f0c5f": "changeExtraBets(uint256)", +"ef4f6e9c": "calcUnMaskedEarnings(uint256,uint256)", +"ef4fac01": "calcTotalTokens(uint256,uint256)", +"ef4ffee2": "Honestgamble()", +"ef50aec0": "set_taxi_driver(address)", +"ef5121b3": "appreciationRateWei()", +"ef520aba": "getall_horsesCount()", +"ef52ad21": "MintMade(uint256,uint256,uint256)", +"ef52b0dc": "RuneToken()", +"ef53030c": "thelnwaonCoin()", +"ef532a47": "addBagAndGift(uint256,address)", +"ef538593": "NeptaToken()", +"ef54801b": "getGrantBeneficiaries()", +"ef548aaf": "PLAYER_TURN_SINGLE_PERIOD()", +"ef54af8b": "TieToken(address)", +"ef551b38": "PaymentAddress(address,bytes4)", +"ef556029": "testFallbackIsCalledOnTransfer()", +"ef5793c2": "LOG_OwnerWithdraw(address,uint256)", +"ef57cbec": "BARToken()", +"ef5850c7": "stakersForPoll(bytes32)", +"ef589693": "getSMPTokensBoughtInICO()", +"ef599ba5": "getCoinBalance(bytes4,bytes32)", +"ef59f8c8": "setRaffleAddress(address,address)", +"ef5a3a88": "dividendsIndex()", +"ef5a625b": "disqualify(address)", +"ef5a80af": "ProductAdded(address,address,address,string,bool)", +"ef5a8fb5": "sellLand()", +"ef5ba9ed": "ALLOC_AIRDROP()", +"ef5c2010": "SelfPayPreSale(uint256,uint256,uint256,uint256,uint256,address,address)", +"ef5d5331": "isHashValid(bytes32)", +"ef5daf01": "_dumpToCompany()", +"ef5f937c": "OpportyToken()", +"ef5fad95": "DaWeiToken(uint256,string,string)", +"ef5fb05b": "sayHello()", +"ef5fbdb2": "stopPlaying()", +"ef5fd51b": "getKeys(uint32,int256)", +"ef61041c": "_approveAllArgs(address,uint256,address)", +"ef616584": "getPurchaseETHNum()", +"ef642054": "car_propose(uint256,uint256,uint256)", +"ef6506db": "credit(address,uint256)", +"ef660169": "withdrawRest()", +"ef660ab8": "deliverCandidate(uint256,uint256)", +"ef674e66": "isWhiteListed()", +"ef67caa0": "reservedTokensFounders()", +"ef685294": "addCascade(address,uint256)", +"ef688df5": "addFundraiser(address)", +"ef68913c": "dronesDeployed()", +"ef6957d0": "ownerSetIsClosing(uint256,bool)", +"ef69f408": "protectedTransfer(address,address,uint256)", +"ef69f7d9": "ManagerRemoved(address)", +"ef6a676d": "allowTransferToken()", +"ef6a6bcc": "LogAddressCapExceeded(address,uint256,string)", +"ef6a88de": "AbstractQuintessenceToken(uint256,uint256)", +"ef6ac0f0": "run(bytes32)", +"ef6b141a": "setStarted(bool)", +"ef6b329a": "close_down()", +"ef6c4b93": "addLimitAddress(address)", +"ef6d1cc8": "QZToken(string,string,uint8,uint256)", +"ef6d7b3b": "emitCancelled(address,uint256,uint256)", +"ef6da43c": "setIsWeiAccepted(bool,uint256)", +"ef6f1f36": "setData_25(string)", +"ef6f8e92": "Creative()", +"ef6face6": "privateContribution()", +"ef706adf": "cancelOffer(uint256)", +"ef70aebf": "endMinting()", +"ef71a1f2": "BCREWARDS(uint256,string,string)", +"ef7293d7": "SELLER_STEP_4_ACCEPT(bytes32)", +"ef739d0f": "changeCountry(uint256,bytes2)", +"ef7507c8": "testWinner(uint256)", +"ef765af8": "erc20ApproveChecking()", +"ef76c060": "HPQToken(address)", +"ef778d30": "createProject(address,string,string,bytes32)", +"ef77b601": "SHAREFIDENCE()", +"ef77ed99": "isFundingState()", +"ef78a5b2": "singleUserSignUp(address,address)", +"ef78d4fd": "period()", +"ef79a35f": "getNumberOfLocks(address)", +"ef7a4a32": "logoId()", +"ef7a5956": "BRONZE_AMOUNT_SKL()", +"ef7a5a2a": "getIudexScoreAll(address,bytes32)", +"ef7ac0e5": "enableTransfer(bool)", +"ef7c7797": "getSaleContractDepositAddressVerified(address)", +"ef7c9ecd": "preIcoTotalSupply()", +"ef7d47a5": "setMinBlockPurchaseInOneGo(uint256)", +"ef7dbc54": "listCompetitors()", +"ef7dd831": "SUPPLY_FOR_ADVISORSL()", +"ef7e1e89": "pow()", +"ef7f23a6": "numberOfBlocksBetweenSupplies()", +"ef7f2e1c": "addHashrate(address,uint256)", +"ef7f3834": "grantInitialAuthentication(address)", +"ef80027e": "Members_info(address)", +"ef802e62": "tokensRemainingStage2()", +"ef804ead": "testInequalityBytes()", +"ef80c53a": "earlyReserveBeginTime()", +"ef80f1ab": "LitmusCrowdsale()", +"ef80ff18": "tokenExchangeAddress()", +"ef816fd9": "isState(uint256,uint8)", +"ef817f2a": "EtherZaarFactory()", +"ef81eb57": "removeLastSaleOnlyNotActivated()", +"ef82c8a8": "geProposalCount()", +"ef82f95c": "setFront(address)", +"ef8322fd": "queryRoles(address)", +"ef84e27f": "getWorkpointSupportCancel()", +"ef8594be": "setPriceStep6(uint256)", +"ef85fdad": "IRC_PER_ETH_SALE()", +"ef869443": "investWithCustomerId(address,uint128)", +"ef8700e5": "tokensForDevelopment()", +"ef885772": "GCCERC20(uint256,string,string)", +"ef890cc8": "isGameFinished()", +"ef898355": "revealHiddenPosition(uint32,int64[2],bytes16)", +"ef89d6e3": "getArmorValue(uint256)", +"ef8a22ac": "mineableTokens()", +"ef8a9235": "currentStatus()", +"ef8a9c8f": "allocatedStage()", +"ef8b0e15": "processContribution(address,uint256,uint256)", +"ef8b5892": "setRoundTwoRaito(uint256)", +"ef8c1d86": "ownerWithdrawParsecs(uint256)", +"ef8c2c58": "openModifyCountdown()", +"ef8c8944": "setPlayerId(uint256)", +"ef8d4a49": "getAssetIDForTypeSequenceID(uint256,uint256)", +"ef8dcc2e": "LogTransactionConfirmed(bytes32,address,uint256)", +"ef8dd09b": "deleteEntry(bytes32)", +"ef8e8069": "smallPrice()", +"ef8ea3d0": "NewRegistration(uint256,address)", +"ef8f1229": "EMISSION_FOR_SALESTAGE3()", +"ef8fdfd8": "Bonus()", +"ef902a0c": "ShowBool(bool)", +"ef9089d6": "nextPrice()", +"ef90aa46": "givenBountyTokens()", +"ef9124e1": "TrinityToken()", +"ef9130b9": "getBetItemCount()", +"ef921826": "setMaxDuration(uint32)", +"ef922305": "DACCToken()", +"ef92742e": "ICOmint()", +"ef92b384": "saveGenCode(address,uint256)", +"ef92b701": "CFC()", +"ef940837": "payday(uint256,address,uint256)", +"ef941dca": "issueTokens(uint256,string)", +"ef943909": "PublisherAddress()", +"ef94ce1e": "addMenu(string)", +"ef9521ea": "GruffinzContact()", +"ef95aa5d": "getManifest(address,bytes32,uint256)", +"ef961367": "registerForCompetition(address,uint8,bytes32,bytes32)", +"ef982eba": "settournamentPrizeAddress(address)", +"ef984923": "transferTenuousTokenOwnership(address)", +"ef98dea3": "getAuctionManagerAddress()", +"ef99c9ef": "DACVest()", +"ef9b0214": "read_i32_array()", +"ef9b559a": "CLX()", +"ef9bfe1a": "returnInvestors()", +"ef9c3512": "falconmasterReq()", +"ef9c4446": "cancelProposeTo()", +"ef9c52ea": "maxIco()", +"ef9c79da": "getFileNum()", +"ef9cb474": "changeWorkerPoolPolicy(uint256,uint256,uint256,uint256)", +"ef9da13d": "getPeriodOwnerLockedBalance(uint256)", +"ef9e7f95": "self_readyTime()", +"ef9f6023": "PUBLICSALE_SUPPLY()", +"ef9fc1de": "DelegateChanged(address,address)", +"ef9fc50b": "addNumbers(uint256,uint256)", +"ef9fe3ac": "setCompte_8(string)", +"efa08854": "companyShare()", +"efa0a1ef": "SettankImposedMax(uint256)", +"efa0e659": "EthX()", +"efa1c34c": "destroyChannel(address)", +"efa227ca": "finish(uint16)", +"efa25196": "getDevidends()", +"efa390f6": "createNewEvent(bytes32,string,uint256,uint256,string,string)", +"efa3d586": "add(address,uint8,uint256)", +"efa3dccd": "totalDividendsPerCoin()", +"efa408de": "setReservedTokensListMultiple(address[],uint256[],uint256[],uint256[],bool[])", +"efa40c2a": "engine(string,string,address)", +"efa4f94d": "computeDeadline()", +"efa52fb3": "iterateGet(uint256)", +"efa56a1e": "use_OEM_Parts(bytes32,uint256,uint256)", +"efa5d431": "vote(address,address,uint256)", +"efa6fd63": "perTransactionRate()", +"efa726e8": "setEggLimit(uint16,uint16)", +"efa74f1f": "getTokenBySymbol(string)", +"efa7e56b": "GameEnds()", +"efa85335": "Registrar_Oraculo(address)", +"efa8d998": "GetEtherSpent(address)", +"efa94e47": "createToken(bytes32,string,string)", +"efa99ecf": "SubModuleSuspended(uint256)", +"efaa55a0": "joinGame(uint256)", +"efaa86b1": "claimTeamTokens(address)", +"efab1e50": "getInvestorDetails(address)", +"efab4b91": "_unpackIntelligenceValue(uint256)", +"efabaa89": "sortTrusted()", +"efac0fd0": "PowerEvent(address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address[],uint256[])", +"efac4db4": "add(address[],uint256)", +"efacd73b": "_createRocHunting(uint256,uint256)", +"efad6df3": "cycleLimit()", +"efada80b": "getRunDetails(uint256)", +"efada94b": "setParentPayoutDistributionHash(bytes32)", +"efae0f2f": "AIR_1()", +"efaf8e22": "isSenderRegisteredAgent(address)", +"efaf90c8": "DAYS_31()", +"efb0cdd9": "MeTooToken()", +"efb109d4": "privlocatum(string,string,uint8,uint256)", +"efb173d4": "addCompany(uint256,string)", +"efb1900d": "deleteThisContract()", +"efb20f6a": "Worldcoin1()", +"efb23d73": "getFirstHexByte(bytes1)", +"efb2bfd3": "signatureChecker()", +"efb369c7": "transferFundsByOwner(address,address)", +"efb588e4": "presaleMaxValue()", +"efb610bc": "isExternalBuyer(address)", +"efb7601d": "getExchangeRate(address)", +"efb7e8b3": "mistakenTokens()", +"efb7fa77": "unLinkFromMasterWallet(address,address)", +"efb8b6b1": "after10Seconds()", +"efb95ced": "masterRewardsPercent()", +"efb98bcf": "getRemainingTime()", +"efba9bd2": "recoverLeftovers()", +"efbb5f17": "retrait_2()", +"efbb6108": "transferStbToOwner(uint256)", +"efbbbd65": "getLambo(uint256)", +"efbbe160": "abiDecodeRegister(bytes)", +"efbc0075": "transferOwnerShipToPendingOwner()", +"efbc5469": "addTransaction(address,uint256,uint256)", +"efbcae98": "deleteMemberOfCommunity(address,uint256)", +"efbcebe5": "ObsToken()", +"efbd4bff": "priceForRect(uint256,uint256,uint256,uint256)", +"efbd863e": "setRealTokenPrice(int128)", +"efbd8a92": "setPriceFactor(uint256)", +"efbd9ec2": "changeList(address,bool)", +"efbe1c1c": "end()", +"efbe31d5": "removeHoldByAddressIndex(address,uint256)", +"efbe3894": "MakePatient()", +"efbe4262": "_removeSuperInvestor(address)", +"efbe584d": "isDEditor(bytes32,address)", +"efbe62e8": "validate(uint256,bytes)", +"efbe8fd1": "createToken(string,string,string,uint256)", +"efbec487": "payBoss(uint256)", +"efbee9b3": "_stake(address,bytes32,uint256)", +"efbf7d83": "GrowGuildToken()", +"efc018cc": "coupDetat(address)", +"efc0712c": "activateGladiator(address)", +"efc07e84": "withdrawBalanceERC20(address,uint256,address)", +"efc139cd": "SmartBooking()", +"efc1595e": "DeDice()", +"efc1ba92": "FakeMembershipRegistry(address)", +"efc1c0ab": "SimpleNameRegistry()", +"efc2fd2a": "getRefillStatFor(string)", +"efc3323c": "createEvent(bytes16,bytes16[],bytes16[],uint256[])", +"efc3d252": "GetLuckyLandIds()", +"efc4cbdd": "Fiocoin()", +"efc4f1dc": "switchSaleState()", +"efc58aea": "spawnAsset(address,uint256,uint256,uint256)", +"efc5c693": "executeSell()", +"efc63bd3": "_rawGetGlobalDelegation(address)", +"efc65b3a": "CindicatorIssued()", +"efc7285c": "mintPresaleWithBlock(address,uint256,uint256,uint256,uint256)", +"efc7652e": "getBAU2(bytes32,address,uint256)", +"efc77f3f": "LTHToken()", +"efc78401": "isSenderAllowed(address)", +"efc81a8c": "create()", +"efc82381": "FirstTimeTransfer()", +"efc8d3c6": "amountReservedRefsTokens()", +"efc927b9": "ShowEmissionRate(uint256)", +"efca0214": "HotPotToken()", +"efca2eed": "totalDistributed()", +"efca9f09": "minimumPurchaseLimit()", +"efcb6cde": "changeOwner(bytes32,bytes32,bytes32,address,string,bytes32,bytes32)", +"efcc3c7f": "getMiniPoolEdit_3()", +"efcceaae": "getGamePaused()", +"efcd1cd9": "signatureSplit(bytes)", +"efcd2ddd": "changeOracleAdd(address)", +"efcd853f": "DogezerPreICOCrowdsale(address,address,address,address)", +"efce0688": "createPrometh(address)", +"efce079e": "doQuest(uint256)", +"efce1d66": "BitEyeEx(address)", +"efce6e78": "PinkyToken()", +"efce828e": "skinCreatedNum()", +"efcee869": "vote(bool,string)", +"efcefb40": "withdrawAllFor(address[])", +"efcf095c": "viewNumberOfMemories()", +"efcf2479": "trim(string,string)", +"efcf2730": "_premint(address,uint256)", +"efcf4f41": "getPixel(uint16)", +"efcf6d68": "finanReserveTimeLock()", +"efd0c851": "getPayoutReadyState()", +"efd0f455": "getChStatus()", +"efd12624": "startPostICO()", +"efd2abec": "calculateAntBuySimple(uint256)", +"efd2fb9b": "DeltaToken1()", +"efd46e1d": "E4RowEscrow()", +"efd4d0a6": "finishedloading()", +"efd6479a": "publicGetUserInfo(address)", +"efd64af9": "getReportingWindow()", +"efd71eb0": "updateVaultWallet(address)", +"efd7313d": "setExists(bytes32,bool)", +"efd73adc": "MigrationFund()", +"efd76499": "_cancelOrder(address,uint256)", +"efd8871a": "revoke(bytes32,address)", +"efd8c379": "userXRTBalance(address)", +"efd979cb": "setMinimumEtherToAccept(uint256)", +"efd9d7e0": "KoosAlbertsToken()", +"efdc4d01": "extraReceiversLength()", +"efdc5b77": "change_nodelist(address)", +"efdcb506": "getMsgGasBefore()", +"efdcc0f8": "getTeamTokens(uint256)", +"efdcd974": "setFeeReceiver(address)", +"efde6dcf": "Rejected()", +"efde9d6e": "InitChallengeAddress(address[10],address,uint256[10])", +"efdea046": "test_3_someTest()", +"efdecd9b": "check_withdrawdao()", +"efdee94f": "deployerAddress()", +"efdff7bb": "getContractAddressById(bytes32)", +"efe08a7d": "changeAddress(address,address)", +"efe0e495": "calculateVestedTokensNumber(uint256,uint256,uint256,uint256,uint256)", +"efe1525e": "viewFeaturedLength()", +"efe213a9": "_getCurrentPeriod()", +"efe2c8a4": "setConsumerAddress(address)", +"efe37d6f": "ELTTokenImpl()", +"efe3f4f4": "determineInterfaceImplementationStatus(address,bytes4)", +"efe43338": "determineWinner(uint256)", +"efe4e0a1": "iterateThroughSwarm(address,uint256,uint256)", +"efe51cca": "state2()", +"efe6bfa3": "sellOrders(bytes32)", +"efe6c772": "MAX_PLAYERS_PER_STAGE()", +"efe79268": "PRICE_STANDARD()", +"efe7a504": "END()", +"efe7c791": "RANGESTART_5()", +"efe86dd5": "batchPunchOut(address[],uint64[])", +"efe89d5a": "tokens2owners(address)", +"efe8c94f": "_safeSub(uint256,uint256)", +"efe93036": "getListTeamByPlayType(uint256)", +"efe998b9": "ethDividendAmount()", +"efe9b08d": "dissolve(address)", +"efe9e86b": "MyPinerTokenTest3()", +"efea0172": "startIco(bool)", +"efea835a": "devfeesoutstanding()", +"efeb4ad7": "onMoneySent()", +"efeb5e58": "beneficiaries(uint256)", +"efeb5f1f": "addWallet(address)", +"efeb941d": "ICOstart()", +"efebc720": "swapEndTime()", +"efecab8a": "addSale(address,uint256)", +"efed160f": "func_0431()", +"efed7b0a": "fondPlatform()", +"efedf429": "admin_member_isWithdraw(address,bool)", +"efeecb51": "getNumberOfTokens()", +"efef39a1": "purchase(uint256)", +"efef445b": "transferDataFrom(address,address,uint256,bytes)", +"eff02ec5": "returnBorroweedEth()", +"eff134ee": "withdrawTokenOwnerReward()", +"eff14c78": "submitValue(bytes8)", +"eff24744": "getTaskAddress(bytes32)", +"eff26a3b": "checkExist(address)", +"eff35f75": "setTickTime(uint256)", +"eff38f92": "getQuestion()", +"eff3c4e7": "openForPublic()", +"eff413ad": "setGoldMigrated(address,bool,string)", +"eff5c266": "addToMemeList(string)", +"eff60f56": "LRXCOIN()", +"eff631cf": "setNewPeriod(uint256)", +"eff6be2f": "changeBaseFee(uint256)", +"eff6e83d": "getIndexOrder(uint256)", +"eff7ed65": "setExchangeRateETHToUSD(uint256,uint256)", +"eff841d1": "setReserveWeight(uint256)", +"eff867e5": "CruzeiroToken()", +"eff877e2": "calcTokenPriceInWei()", +"eff883bd": "takerSellAsset(uint256)", +"eff8e748": "discountRate(address)", +"eff91c7e": "getLatestId()", +"effa00a6": "isIQTDistributed()", +"effb8415": "set_recivers(address,uint256)", +"effbbf92": "enableDisableTokenProxy()", +"effc4c1f": "throwIfLocked()", +"effc792d": "stakeInCurrentPeriod(uint256)", +"effcd413": "wallstreet2()", +"effd88b7": "ethToWei()", +"effda074": "addFactoryToCP(address,address)", +"effe031e": "payBankRoll()", +"efff1fb9": "_collect(address,uint32,uint32,uint32)", +"efff718d": "BITBIX()", +"efff78a5": "setRule(uint16,uint256,uint256,uint256,uint256)", +"effff82f": "valueToken()", +"f0004ab4": "PRIVATESALE_TOKENCAP()", +"f0006707": "setWriteTimestamp(bytes32,uint256)", +"f000999e": "upgrade(address,address,address)", +"f0024677": "deleteTellerMods(address)", +"f0032567": "computeFare(uint16)", +"f00388f7": "give(address,uint256)", +"f003a487": "unpauseCrowdsale(address)", +"f004073a": "performAction(uint256)", +"f00423ac": "XXXcoin()", +"f0044924": "BitGemPlayToken(address,address)", +"f004b12b": "CrowdFund(uint256,uint256,address)", +"f005b1b7": "UniversalTradeCoinToken()", +"f0061866": "deleteCourse(address)", +"f006228c": "guardian3()", +"f00648b8": "withdrawCoreTeamTokens()", +"f0072795": "itemsRange(uint256,uint256)", +"f007557f": "IPXTokenBase()", +"f0075829": "isValidPubKey(bytes)", +"f0083250": "canImplementInterfaceForAddress(address,bytes32)", +"f0086703": "setNextMilestone(uint256,uint256)", +"f008be46": "currentTierDiscountPercentage()", +"f009347d": "KudosProxy(address)", +"f00989a8": "FOUNDING_TEAM()", +"f00aac7f": "ArrayRR()", +"f00ac1da": "Login()", +"f00acc47": "prepareRoll(uint256,uint256)", +"f00c67fc": "Bounty0xEscrow()", +"f00c7669": "lastBlock_v2()", +"f00c9e67": "testStoresChallengeOwner()", +"f00d2823": "TokenMinted(uint256)", +"f00d4b5d": "changeOwner(address,address)", +"f00d7326": "isSenderInvestor(address,address[])", +"f00db260": "underwriter()", +"f00e4129": "EmergencyFundingReleaseApproved()", +"f00e6a2a": "getTarget()", +"f00e6f0a": "getResultData(uint8)", +"f00e8651": "createRequest(address[2],address,uint256[11],uint256,bytes)", +"f00f087f": "operationsPercent()", +"f00f7b33": "loseOdd()", +"f00f9b4d": "transferForMining(address)", +"f00ff174": "verifyWithdraw(bytes32,bytes32)", +"f0109f84": "valueAirDrop()", +"f010b6e5": "wipeBlackListedTrueUSD(address)", +"f011a7af": "claimProfit()", +"f011e270": "_payoutWinner(uint256,uint256,uint256,uint256)", +"f0123bc2": "dtStart()", +"f0137edf": "tokensFor1EthP3()", +"f013e0e1": "setWhitelist(address[],uint256[])", +"f0141d84": "getDecimals()", +"f0144a91": "dataset_md5checksum()", +"f0149751": "getTotal(bytes32)", +"f0149b9d": "ZenswapNetwork()", +"f01551f6": "difficultyAdjustmentPeriod()", +"f015bc93": "PRESALE_ADDRESS()", +"f0163621": "changeDomain(uint256,uint256,address)", +"f0163a82": "getNobleBalance()", +"f0173703": "ROLE_ORACLE()", +"f0174a25": "initMetadataDisable()", +"f018f741": "isPresidenteDeMesa(bytes32)", +"f019bd5e": "_generateOrder(address,address,address,uint256,string,string,string)", +"f019c267": "decreaseApproval(address,address,uint256)", +"f019c5da": "expReward()", +"f019c941": "SLAV()", +"f01b896f": "ambi2()", +"f01cc531": "setMonarchyRewards(uint256,uint256)", +"f01dbd03": "rewardAddressesSet()", +"f01de8c3": "getNextBattleTime(uint64)", +"f01e0648": "Voted(address,address,bool)", +"f01e341b": "addPostOnUser(address,address)", +"f01e66ec": "getAvgPrice()", +"f01eddda": "claimMyApis()", +"f01ee2cf": "sendERC20Tweet(uint256,string,string,string,string)", +"f01f20df": "burnPercentage()", +"f01fe692": "create(uint256,address)", +"f020044f": "gameActive()", +"f02011a8": "StatusContributionMock()", +"f0204007": "allocateTokens(uint256)", +"f0206a0d": "DayToken(string,string,uint256,uint8,bool,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"f0207fb1": "_commission()", +"f020bfe1": "McCringleToken()", +"f020d093": "applyInsurance(bytes32)", +"f020f279": "balanceWinPoolForSecondStage()", +"f02137c8": "updateTicketPrice(uint256)", +"f02152ab": "sponsorOpinion(uint256,uint8,bool)", +"f02175c7": "checkNewOwnerArgs(uint256,uint256,uint256)", +"f0217c32": "changeSaleBlocks(uint256,uint256,uint256)", +"f0217ce5": "permit(bytes32,bytes32,bytes32)", +"f02286c1": "topUpLuck(uint256)", +"f022a694": "ToxbtcToken()", +"f022a867": "unholdMntp(address,uint256)", +"f022d9f6": "setContractProtection(bool)", +"f023d600": "purchase_address()", +"f0247f78": "maxQtyInFp()", +"f024a95a": "setMinimumTribute(uint256)", +"f02694f6": "SetStartVesting(uint256)", +"f027c7e0": "initOptionProgram()", +"f027d1f0": "setC4FContractOwner(address,address)", +"f0285b96": "_ownerSupply()", +"f02895e4": "ICO_ADDRESS()", +"f0296bfa": "setRefBonus(uint256,uint256)", +"f029e102": "SandwichShop()", +"f02a306e": "timeoutXEnabled()", +"f02a4463": "SkyExchange()", +"f02d7ef0": "issued(address)", +"f02dd53f": "getLand(uint256)", +"f02e0b3c": "SALE_IN_PROGRESS()", +"f02f1b6f": "getDailyLotteryParticipants(uint256)", +"f02f3a89": "oem_share()", +"f02f85c5": "timeOfLastBlock()", +"f02fc78f": "batchRegularTransfers(bytes32[],bytes32[])", +"f02fff9d": "Fcoin()", +"f0303452": "approveAll(address,uint256[])", +"f0314df0": "addTrustedContract(address)", +"f031a4d2": "TasksHandler(address,uint256,uint256,uint256,uint256)", +"f0330d54": "claimTwitterBonus()", +"f03342ad": "initiatedBy(address)", +"f0342179": "setPriceUnits(uint256)", +"f0349d5f": "setupStages()", +"f0350c04": "transfer_ownership(address)", +"f03529c3": "setMasterFeeContract(address)", +"f0356a36": "balanceOfContractFeeEth()", +"f036417f": "setTokenSymbol(address,string)", +"f0366c45": "imageExists(uint256)", +"f0369550": "getStage0Cap()", +"f036b592": "getBonusFactor(uint256,uint256)", +"f036ed56": "addResources(address,address[],bytes4[])", +"f0375c55": "SudanGoldCoinToken()", +"f038a969": "createScanner(uint256,string,uint256,uint256,uint256)", +"f038e106": "CKAOTToken()", +"f039218a": "Robycoin_test1()", +"f039d9d5": "totalPicks()", +"f03a1bc6": "addBet(address,uint256)", +"f03a5687": "reinvestDividend()", +"f03a6872": "bitmask_add(address,uint256)", +"f03aa262": "noContributors()", +"f03b0c0b": "setMultiSigWallet(address)", +"f03b7c70": "addComment(string,address,bool,uint256)", +"f03b8bf5": "UoBAMZNToken()", +"f03bcc7f": "submitAudit(address,bytes32,bool)", +"f03c0e8f": "D3JDemo(uint256,string,uint8,string)", +"f03c58ca": "test_feePoolShare_isTranscoder()", +"f03c7c6e": "pit()", +"f03c867a": "ownerDisablePayee(address)", +"f03d43ed": "updateTokenTicketPrice(uint256)", +"f03d7d2f": "transferReferralFee(address,uint256)", +"f03dc3d3": "getUsedReveralSupply()", +"f03dc4e4": "private_setMinGamePlayAmount(uint256)", +"f03dc5ef": "publicKeys(bytes32)", +"f03dd010": "WithdrawalETH(uint256)", +"f03de5fe": "buyHLPMT()", +"f03e5de5": "isDisputeActive()", +"f03e786a": "approveAndCall(bytes,address,address,address,uint256,uint256,uint256,uint256,bytes)", +"f03fbf2f": "CheckChangePlatformFlagAndAddAccountsInfo(address,address,uint256)", +"f03fed22": "nwmToken()", +"f040d973": "ERC20Token(string,string,uint8,uint256,address,address)", +"f0413191": "badge(uint8,string,bytes)", +"f04182d8": "insertProposal(address,uint256,address)", +"f0419588": "reply(uint256,uint8)", +"f0425fe1": "swappedTokens()", +"f04303e3": "setSealableProperty(address,uint256,bytes32,bytes32)", +"f0437a36": "getMyCommitmentHash(uint256)", +"f0439e0f": "removeExpiredName(string)", +"f044632f": "loikikdid()", +"f0446e02": "testFailMintNoAuth(int256)", +"f0456691": "PrevOwner()", +"f0459440": "readPermissions(address,uint256)", +"f046395a": "subscriptions(address)", +"f04646fe": "roll(bytes)", +"f04686aa": "LogOrderCreated(address,address,address)", +"f046cdec": "private_setHouseEdge(uint256)", +"f0474350": "proposalWeight(uint256)", +"f0479392": "poolAdd(uint256)", +"f047a528": "isRoundingErrorCeil(uint256,uint256,uint256)", +"f047d077": "cancelBuyNowOffer(uint256)", +"f0485328": "setAccessory(uint8,address)", +"f04893c2": "modCFOAddress(address)", +"f048b97f": "userPurchaseNumMap(address)", +"f04961ba": "getEther(uint256)", +"f04991f0": "deposit(int256)", +"f04aa255": "_transferAvailable(address,address,address)", +"f04be582": "tokentBalance(address,address)", +"f04bf0c5": "updateTrustScoreInBulk(address[],uint256[],uint256[])", +"f04cb80c": "setInvestorDataAndIssueNewToken(address,uint256,uint256,uint256)", +"f04d4d55": "deactivateLineItem()", +"f04da65b": "getShares(address)", +"f04e2b45": "_init(address)", +"f04e42cd": "allocateCoins(address[],uint256[])", +"f04e7476": "BSBCoin()", +"f04e8c6f": "payoutPeriodStart()", +"f04ed952": "typeSize(uint256)", +"f0502ff7": "tokensRequiredForAllWins()", +"f05168e6": "getAddTokenResetSignatures()", +"f052a76b": "setSpecialOffer(uint256,uint256,uint256,uint256,uint256)", +"f052d65a": "getCreature(uint256)", +"f0534e0a": "addWalletBonus(address,string)", +"f05396ac": "currentOperation()", +"f05492e0": "_getMaker(bytes32,uint8,bytes32,bytes32)", +"f054d139": "decimalsFactor()", +"f055d324": "walletBountyProgram()", +"f0560ea0": "approvedRatio(uint256,uint256,uint256,uint256)", +"f056a5c7": "declareRF(string)", +"f0575008": "Locked(bytes32,bytes32,bytes32)", +"f05764a0": "Currenttask()", +"f05834d6": "setReservedTokensListMultiple(address[],uint256[],uint256[],uint256[])", +"f05854ba": "SealToken()", +"f0586f0d": "doThrow(bool)", +"f058e6d1": "TXOsale()", +"f0591308": "getMem()", +"f0594d38": "PrizeAwarded(uint256,address,uint256)", +"f059bb6d": "buyTokensPreHook(address,uint256)", +"f059cf2b": "spentToday()", +"f05a2818": "changeMinimumBetAmount(uint256)", +"f05a64bc": "potTime()", +"f05a781d": "acceptNewOwner()", +"f05aa334": "cofounderA()", +"f05ad9f3": "communityTotal()", +"f05b854f": "LogSquareWinsUpdated(uint256,uint256,uint256)", +"f05ccd75": "onDecreaseApproval(address,address,uint256)", +"f05d16f7": "setTxFee(uint256)", +"f05d5547": "named(string)", +"f05d68c1": "_newIncomingTransaction(address,address,uint256,string)", +"f05d85d6": "atmToken()", +"f05dd6d5": "LogWinner(address,uint256)", +"f05dda57": "XeinToken()", +"f05f3e77": "developer_voting_info(string)", +"f05f45b1": "authoriseEntrants(address[])", +"f05fae68": "getStoreBalance()", +"f06067ac": "transferByLock(address,uint256,uint256,uint256)", +"f060ccb5": "escFundAddress()", +"f060f617": "setCursedContract(address)", +"f0610b5e": "unlockAllAccount()", +"f0611c44": "lockAfterMinting(uint256,uint256)", +"f06186c7": "testReality()", +"f0624097": "checkBlockEmpty(uint256,uint256)", +"f062e26b": "check_darkdao()", +"f0640355": "AddTeamAccount(address,address)", +"f0646a3c": "DART()", +"f064b971": "tryToCloseProject()", +"f065c36e": "MonopolyBank(uint256,string,uint8,string,address)", +"f0664a4f": "ownerOne()", +"f0666fba": "burnedBitcoin(address,uint256)", +"f066719f": "arbTrade(address[],uint256[],uint8[],bytes32[])", +"f066844e": "_emitAreaEvaluated(address,address,uint8,uint256)", +"f066cb83": "treeBuild(address,address)", +"f0685bf0": "TestFund()", +"f068a3a6": "setNextSmartContract(address)", +"f068dc81": "authorizeRequestorAddress(address)", +"f069629c": "generalSaleStartDate()", +"f06a1e13": "QUOTE_ASSET()", +"f06b0901": "interRefreshLock()", +"f06b53e9": "saveDividends()", +"f06b9ca6": "avgTokenBetValue()", +"f06bbf75": "EXTERNAL_QUERY_GAS_LIMIT()", +"f06c5610": "constructionTime()", +"f06d335e": "_recoverAccount(address,address)", +"f06d56ae": "ICO3Period()", +"f06ea69c": "toUint16(bytes,bytes,uint256)", +"f06ebc38": "setKv(uint256,uint256)", +"f06ef632": "fundOrderInternal(address,address,uint256)", +"f06fc103": "sendTokens(address,uint256,uint256)", +"f0704f02": "week3Price()", +"f0705249": "updateSspAbi(string)", +"f07065b3": "writeToDiary(uint256,bool)", +"f0715594": "_addAdminAccount(uint256,address)", +"f071b5fb": "LogEscrowReq(uint256)", +"f071cacb": "_setClientSupply(address,uint256,uint256)", +"f071db5a": "feesCollected()", +"f071ecc5": "AFTER_MAX_GOAL_DURATION()", +"f07227dc": "release(address[],address,uint256[])", +"f07255e3": "nextBoundaryAmount()", +"f073b277": "euroRaisedRc()", +"f07494a0": "bla()", +"f0757a91": "TOKEN_PRICE_THOUSANDTH()", +"f075f253": "QRRial()", +"f07629f8": "eventsHistory()", +"f076ba9c": "ethercrowdfund()", +"f077ae0f": "removeSample(address,uint256)", +"f07819a3": "setMesa(uint256)", +"f0782640": "getCompanyCount()", +"f0793782": "modifyHorseyDna(uint256,bytes32)", +"f0794ca6": "getRocOwnerItem(uint256)", +"f07a019d": "ownerRecoverTokens(address,address)", +"f07b454c": "divMultiplier()", +"f07b4608": "destruirContrato()", +"f07b9a04": "certAuthIssuesCerticate(address,address,uint256,string,string,string,string,uint256)", +"f07b9f20": "MapleCoin()", +"f07c0b21": "AgriChainLabel()", +"f07c44c2": "appropriate(uint256)", +"f07d0c49": "Logs(address,uint256,string)", +"f07edbf4": "maximumAdminBalance()", +"f0803358": "TSpaceCoin()", +"f080f860": "MAYA()", +"f081d9bd": "HaraKiri()", +"f081fc2e": "MAX_TOTAL_AMOUNT_GET_ETH()", +"f082650b": "setStarData(uint256,uint16,uint16,uint32,uint32,uint32,uint64,uint64)", +"f0829c37": "VeraCoin()", +"f083156c": "LYBToken(string,uint8,string)", +"f083e8f2": "addressFundFounder()", +"f0843ba9": "quickConvert(address[],uint256,uint256)", +"f085b2a1": "clearTokenLock(address)", +"f0863c08": "maxPowerUserAddress()", +"f0869641": "normal_trade_date()", +"f086965e": "changeOwner(bytes32)", +"f08697a3": "QuyDau()", +"f0876747": "KocoCoin()", +"f087d2ec": "STREAMING()", +"f088d547": "buy(address)", +"f0893de2": "maxTradingStartTime()", +"f089b7dd": "hashtag()", +"f089d566": "AdmineTeamTokens()", +"f089e2ed": "getProject(string,uint256)", +"f089e972": "currentNetfRound()", +"f08a5faa": "getSmartHash(string)", +"f08b82e6": "getTotalTokens()", +"f08c9e2e": "deathData_f2()", +"f08ccd02": "allocatePresaleTokens(address,uint256,uint64,uint64,bool,bool)", +"f08d5a25": "initialLockedValues(address,address,address,address,address,address,address,address)", +"f08e362f": "transferFunds(uint256,address)", +"f08ea4cc": "_startContract(uint256)", +"f08fa322": "investors_deliveryDate(address)", +"f090cee8": "addInvestor()", +"f091e5a2": "CoinMeet()", +"f0920a41": "wminus(uint256,uint256)", +"f0921b80": "habichnet1()", +"f09304b5": "setIntervalSchedulePresale(uint256,uint256,uint256)", +"f0932bd7": "setNextRoundLength(uint256)", +"f0933ab9": "isInActiveStage()", +"f093fd0a": "_bidEth(uint256,uint256)", +"f0942d35": "gameStatus(bytes32)", +"f0947680": "lockstatus()", +"f095ed3c": "cancelAndEndEvent(bytes32)", +"f09649ed": "getStateLength()", +"f0965328": "transferFor(address,uint256)", +"f0970566": "createDklAuction(uint256,address,uint256)", +"f097e106": "maxBuyingDate()", +"f098efb3": "ICOActive()", +"f098f8e4": "finalWindowTime()", +"f09915d4": "assign(uint256,uint256)", +"f0995961": "notarize(bytes32,uint256)", +"f099ce67": "getGladiatorDistributedRandom(uint256)", +"f099fbbd": "callBurnTokens(uint256)", +"f09a1f87": "hashOrderTyped(uint8,address,uint256,uint256,uint256,uint256)", +"f09a4016": "init(address,address)", +"f09a58f8": "internalSellTokenFromAdmin(address,uint256,bool)", +"f09a9b3c": "addGoal()", +"f09b538f": "function_3(string)", +"f09bea14": "totalCities()", +"f09bfcc2": "distributeFixed(address[],uint256)", +"f09c25e6": "playerCheckProvablyFair(uint256,bytes)", +"f09c3152": "NerdShitCoin()", +"f09c5829": "swaps(uint256)", +"f09cac98": "receiveApproval(address,uint8)", +"f09d3103": "royaltyTracking(address)", +"f09dd7c6": "withdrawAffiliateCommision()", +"f09dd844": "revealPurchaseOrder(bytes32,uint256,uint256,bytes32,address)", +"f09e34f0": "addReleaseAgent(address)", +"f09e65f1": "setAtomFath(uint256,uint64)", +"f09ea2a6": "offer(uint256,address,uint256,address)", +"f09ecf10": "Contract_Owner()", +"f0a03aa3": "ITE()", +"f0a0a299": "VIPFee()", +"f0a15f10": "TIER2_RATE()", +"f0a233d4": "SharesChainToken(address)", +"f0a279ae": "phase1EndingAt()", +"f0a2bea2": "testCheckRokBalance()", +"f0a2c430": "inGameRewardAddress()", +"f0a32e7b": "maxRefundStageDuration()", +"f0a3563c": "userClaims(address)", +"f0a3ce5d": "distributeDivs(uint256,uint256)", +"f0a3d4fd": "freezeAPI(uint256,string)", +"f0a3dfa4": "isStartTimeCorrect(uint256,uint256[])", +"f0a42aa0": "_upgradeLevel(uint256,uint16,uint16,uint16,uint16,uint16,uint16,uint16)", +"f0a43714": "whitelistSize()", +"f0a45cff": "report_death(uint256,uint256)", +"f0a71ef6": "getPrevBlock(bytes)", +"f0a72a84": "accountMaster()", +"f0a78538": "scheduleTransaction(uint256,bytes)", +"f0a7975f": "setDayQualitys(address)", +"f0aadcda": "AIMcoin()", +"f0aaf4ec": "getOptionsForModel(uint64)", +"f0abb382": "isHotWallet(address,address)", +"f0acc83a": "QCSCToken()", +"f0acd7d5": "spin()", +"f0acfea2": "piranhasTotalSupply()", +"f0ad243e": "getCoefficient(bytes2,uint256)", +"f0adcedb": "executeWinningProposal()", +"f0adda7d": "setNextVersionAddress(address)", +"f0ae03be": "robotCoin()", +"f0af0844": "addTimeUnequalledDefence(address,uint256)", +"f0af50c9": "stoppedSale()", +"f0af7e65": "cancelAgon(uint64)", +"f0afbf84": "newFutureLottery(uint256,uint256,uint256)", +"f0afd95a": "_2_education()", +"f0b01d56": "VINEYARD_ADDRESS()", +"f0b05bfd": "getGamesOfPlayer(address)", +"f0b070ca": "createAppeal(uint256)", +"f0b087c5": "getConfigUint(bytes)", +"f0b0cfa3": "readSoftwareInformation(address,address,uint256)", +"f0b1adbe": "registerEarnings(uint256)", +"f0b1b42e": "createContractPow(string,uint256,uint256,uint256)", +"f0b24181": "totalSupplySale2()", +"f0b25186": "shopKnife()", +"f0b30f69": "saveLockedERC20Tokens(address,address,uint256)", +"f0b32c69": "test_threeValidEqBytes32()", +"f0b37c04": "unauthorize(address)", +"f0b3a7ba": "hardCapToken()", +"f0b3adee": "updateRewardRate(address,uint256)", +"f0b5165f": "delayOfPreICO()", +"f0b53256": "SoftCap()", +"f0b534cb": "getApprovedVotes()", +"f0b620a2": "isPaymentCompleted(address)", +"f0b6e707": "ORDER_CANCEL(address,address,uint256)", +"f0b7e532": "withdrawTaker(address,uint256)", +"f0b80000": "PRESALE_START_DATE()", +"f0b85b19": "setDefaultLockInDuration(uint256)", +"f0b9e5ba": "onERC721Received(address,uint256,bytes)", +"f0ba23e6": "minterChangeable()", +"f0ba958c": "Error(uint8)", +"f0ba96ff": "performPayouts()", +"f0bae2c5": "doIssueDividend()", +"f0bae787": "_receiveBuyRank(address,uint256)", +"f0bbab3b": "HSHToken()", +"f0bbe08b": "phasePublicSale2_To()", +"f0bbe877": "Deployed(address,uint256,string)", +"f0bc153a": "get_contract_balance()", +"f0bc6cfb": "isReferred(address)", +"f0bc9cc5": "receivedDETreturn(address,uint256)", +"f0bcaf75": "UsingDB(address)", +"f0bd9ab5": "pushToken(address,bool)", +"f0bea8c7": "downVoteHouse(address)", +"f0bf1aea": "Paint(uint256,bytes3)", +"f0bf4df4": "setMinEnterFee(uint256)", +"f0bf611b": "transferDao(address)", +"f0bfd737": "Testtoken(uint256,string,string)", +"f0c001df": "proofType_Android()", +"f0c0546c": "closedRound()", +"f0c06aa5": "distrust(address)", +"f0c1d1c7": "setContributionPool(address)", +"f0c295fd": "seeZombieColor(uint256)", +"f0c388c7": "convertMainchain(string,string)", +"f0c413dd": "balanceOfContract(address,address,address)", +"f0c41bb2": "getChampsByOwner(address)", +"f0c45472": "modifiyEndFundingTime(uint256)", +"f0c4c04e": "extractFunds()", +"f0c4c339": "getFreezeSinceDetails()", +"f0c4fcc5": "mustToSellCourses()", +"f0c4fd0c": "isAttributesValid(uint256)", +"f0c5a46b": "periodPreITO_period()", +"f0c5a77b": "updateBurnableStatus(bool)", +"f0c69e8d": "calculateWithdrawable()", +"f0c71318": "zenOSCrowdsale()", +"f0c87852": "moveData(uint128[],address[],bool[],uint256[])", +"f0c95bc1": "setAdminVariables(uint256,uint256,uint256,uint256,uint256)", +"f0c99750": "endICOStage4()", +"f0ca618e": "Indemnisation_3()", +"f0caea2b": "SmartRoulette()", +"f0cafe0e": "tokenGNO()", +"f0cb556c": "updateLatestRevision(bytes32,bytes)", +"f0cb740a": "isJobStart(bytes)", +"f0cb8e77": "savedAddresses(address)", +"f0cbe059": "proxyTransferFromWithReference(address,address,uint256,bytes32,string)", +"f0ccc21a": "chunk5IsAdded()", +"f0cd58b7": "AuthAddr(address)", +"f0cd5c17": "cancelTx()", +"f0cd8057": "OACC()", +"f0ce6231": "XIAOZHI4()", +"f0cecafc": "privateSale2Hardcap()", +"f0cf198a": "RemoveSubscriber(address)", +"f0cfcaa8": "_getNewEstateId()", +"f0d02ce9": "AVG_BLOCKS_02W()", +"f0d07014": "allItemsForSale()", +"f0d0dd3f": "subDomainOwner(string,string)", +"f0d1c8ce": "hasTrade()", +"f0d1d021": "set_stoptransfer(bool)", +"f0d1eaaf": "getChannelById(bytes32)", +"f0d22ade": "isRepeated(int256)", +"f0d30786": "getPositionCallTimeLimit(bytes32)", +"f0d3a9df": "getBuyersCount()", +"f0d474f9": "underdogCount()", +"f0d4753e": "TOKEN_OFFERING_ALLOWANCE()", +"f0d4c92d": "setTimeBonus(uint256)", +"f0d4d1a6": "lotteryParticipants()", +"f0d504eb": "lookupKitty(uint256)", +"f0d5511c": "isArrAccountIsFrozenByDate(address)", +"f0d655f8": "_calculateTokenAmountAndRemainderBudget(uint256)", +"f0d6cc70": "endFullBonusTime()", +"f0d6ff48": "MeetOneTokenBase()", +"f0d7c9ff": "setPreviousSurplus(address[],uint256[])", +"f0d7f3eb": "auctionPause()", +"f0d85c89": "setRecovery(address)", +"f0d89e67": "LogRedeemTicket(uint256,address,string)", +"f0d8d4af": "sendTest()", +"f0d8e968": "getLastLease(uint8)", +"f0d90937": "usdAmount()", +"f0d97469": "setTokenExchange(address)", +"f0d9bb20": "yesToken()", +"f0da84f8": "getTransferable(bytes32)", +"f0daa286": "doubleXY(uint256,uint256)", +"f0daba01": "merchantIdHash()", +"f0dc4171": "collectTokens(address[],uint256[])", +"f0dce839": "IBU()", +"f0dd7a5d": "borrowBook(uint256,address,address)", +"f0dda65c": "mintTokens(address,uint256)", +"f0ddc0c6": "InjurymapCoin()", +"f0df232f": "buyMessage()", +"f0df6929": "RequireHuman()", +"f0e02bd6": "WEI_MAXIMUM_EARLYPURCHASE()", +"f0e10c0d": "play(address,uint256)", +"f0e1354c": "removeFromEggPhase(uint256)", +"f0e1691a": "addEvent(string,uint256)", +"f0e1ba2c": "priceLimit()", +"f0e1f84d": "setVotingProxy(uint32,int256,address)", +"f0e231b5": "Datenow()", +"f0e26f80": "getBattleDetails(uint256)", +"f0e3d1ba": "setEnd(bool)", +"f0e3fff8": "totalWon(address)", +"f0e40662": "getTotalAmount(uint256)", +"f0e42a1f": "getDividendTransactionLeft()", +"f0e4c4fe": "setGatewayI(address)", +"f0e53489": "integrity()", +"f0e5eeac": "ico2total()", +"f0e61771": "tokenFreezing(address,bool)", +"f0e6c2dc": "CASToken()", +"f0e769dc": "resumeSwap()", +"f0e7cf13": "adminClaimAirdropMultiple(address[])", +"f0e86f93": "ICOBlacklisted(address)", +"f0e959f9": "TokenSales(address)", +"f0ea0294": "setStage2Start(uint256)", +"f0ea433a": "sendQualifiedPartnerCommissionFee(address,uint256)", +"f0ea4bfc": "raised()", +"f0eb29fb": "_communitySupply()", +"f0eb737a": "getCurrentDiscount()", +"f0ebce5a": "getEnum()", +"f0ec03ae": "tokenWeiSold()", +"f0ec747e": "VETRA()", +"f0ec94cf": "edgePerPosition()", +"f0ecadaf": "comprueba(address,bytes32)", +"f0ecadcc": "voteSvp03(bool)", +"f0ed029e": "DebugUint(uint256)", +"f0ed14e0": "right95(uint256)", +"f0edb7cf": "admin_set_Apply_Store_Id_Fee(address)", +"f0ee7df2": "setMaxWin(uint256)", +"f0ef7621": "FishOne()", +"f0f0fe10": "ownerSetRecommendProportion(uint256)", +"f0f21344": "right27(uint256)", +"f0f2805f": "isOnSale(uint256)", +"f0f3f2c8": "getProject(uint256)", +"f0f44260": "setTreasury(address)", +"f0f46302": "shopHelmet()", +"f0f53ee4": "setBool(bytes32,bytes32,bool)", +"f0f5af8b": "calculateObtainedAMIS(uint256)", +"f0f7bd31": "LibertyToken()", +"f0f87e98": "TokenWithoutStart(string,string,uint8)", +"f0f8aff9": "getPriceForAssetAmountMulCollatRatio(address,uint256)", +"f0f8b7a5": "betX5()", +"f0f967e8": "canCall(address,address,bytes)", +"f0f9a729": "dividendsOf()", +"f0fa55a9": "setSlippage(uint256)", +"f0fb4372": "RatingStore(address,address)", +"f0fb8efd": "allowDefaultToken(address,bool)", +"f0fbc8ac": "indInflationDeposit()", +"f0fbe2e4": "addressAirdrop()", +"f0fbfd3a": "targetDiscountValue5()", +"f0fc1438": "tradeComplete(address,uint256,address,uint256,address,address,uint256,uint256)", +"f0fc6bca": "claimDividend()", +"f0fcc6bb": "pay(address,uint256,address)", +"f0fdb32f": "canStartWork()", +"f0fdc689": "setInv2(address)", +"f0fdf834": "a(uint256)", +"f0fe3d68": "metaBurnCarbonDollar(address,uint256,bytes,uint256,uint256)", +"f0fee1f7": "LogMigrate(address,address,uint256)", +"f0feef96": "closeChannel(bytes,uint256,uint8,bytes32,bytes32)", +"f0ff4840": "LuckchemyCrowdsale(address)", +"f0ff6ac4": "withdrawal(uint256,address,uint128)", +"f1001f8c": "getTotalLockedBalance(address)", +"f10143e1": "TokenToppedUp(address,uint256,uint256)", +"f101618a": "getMiniPoolEdit_8()", +"f1018c6f": "boughtNum()", +"f101b269": "appstore_share()", +"f103b433": "updateMaxSupply(uint256)", +"f104c836": "setAssetTransferGas(address,uint256)", +"f1052af5": "isRegisteredContract(address)", +"f105c981": "get_contrib_arbits_min()", +"f105e23b": "PVE_COMPENSATION()", +"f1068454": "pid()", +"f10700c2": "shouldCompleteDay()", +"f1076703": "getVerificationId(address,bytes,bytes)", +"f107941b": "buyTest(address,uint256)", +"f107b5e7": "getMaximumLimit()", +"f108a7d2": "withdraw(uint256,address,string)", +"f109517c": "delegatedTxHashesUsed(bytes32)", +"f10968ea": "assertEq(bool,bool,bytes32)", +"f10a4f0a": "WALLET_PARTNER()", +"f10a7798": "setAuth(address,address)", +"f10a9848": "currentNumberOfUpgrades()", +"f10ae2ab": "__dig_then_proxy(uint256,address,bytes)", +"f10ca95a": "close(bytes32,bytes32)", +"f10cb3da": "ObjectToken(uint256,string,uint8,string)", +"f10cb5dc": "DomainChanged(address,uint256,uint256)", +"f10ce7c4": "registration(address,string)", +"f10d1de1": "setUnbondingPeriod(uint64)", +"f10e5ceb": "getNumAdd(uint8)", +"f10ecc65": "chainlinkToken()", +"f10fae62": "setLLV_edit_21(string)", +"f10fdf5c": "getContribution()", +"f11079cf": "createType(address)", +"f110bbdf": "SetupAccounts()", +"f1112e70": "payYearlyJackpot(address)", +"f1115024": "registerBusinessOwner(bytes32,address)", +"f1115c7e": "transferMSI(address,uint256)", +"f112ddc0": "GJMI()", +"f113c854": "icoThresholdBonus1()", +"f113f700": "advisoryReserveTokens()", +"f113fccd": "trueGods()", +"f1144ce0": "HCoinToken()", +"f1145727": "buyStarterPack()", +"f1147bae": "withdrawRoyalty()", +"f1156cdf": "getCurrentVoting()", +"f115f06a": "WhiteListSet(address,bool)", +"f1160dc2": "ParticipantAuthority(string,address)", +"f116260f": "CryptoTreasure()", +"f1167e0d": "createPlayerIfNeeded(address)", +"f1168e11": "_createMobster(string,address,uint256,uint256,uint256,string)", +"f1173928": "RemovedFromGeneration(address,uint256)", +"f11745df": "totalHolder()", +"f117c924": "totalInvestedInWei()", +"f1183e21": "assertEq0(bytes,bytes,bytes32)", +"f118e465": "LogCreateVIBEX(address,uint256)", +"f118f7d6": "setDestinationMultisigWallet(address)", +"f119a48d": "toUnixtime(uint32,uint8,uint8,uint8,uint8,uint8)", +"f119ada4": "addTeam(string)", +"f119fcaa": "isMintableNFT()", +"f11a8911": "accountTxs(uint256)", +"f11a97ef": "MinerToken()", +"f11af32a": "EuroToken()", +"f11b9b46": "FRPTOKEN()", +"f11b9fc8": "emitTokens(address,uint256)", +"f11bdfa4": "_isValidHeight(uint8)", +"f11be7c1": "getTrustedContracts()", +"f11c2cec": "changeOwner(address,address,address)", +"f11c4482": "approveFromProxy(address,address,uint256)", +"f11c46f4": "How_to_interact_with_Smartcontract()", +"f11c8de8": "ZENT()", +"f11cfc56": "Vicky()", +"f11d5039": "place_holder()", +"f11d5b33": "reward(address,bytes32,uint256)", +"f11dd6ac": "viewGiveKarmaFee()", +"f11eb099": "preIcoAllocation()", +"f11ef5cf": "reserve(uint8)", +"f11f7d2d": "maximumBidAllowed()", +"f12001ae": "Testereumx()", +"f1204db6": "maximumJackpot()", +"f1208af8": "drawWeeklyWinner()", +"f120974e": "CHENDE()", +"f1215d25": "deposit(uint256,string)", +"f122ed60": "send_message(address,string)", +"f1233b79": "updateTimeBetweenGames(uint256)", +"f12479ac": "getPhase(uint8)", +"f124a300": "setPayable(bool)", +"f124eab5": "ETD()", +"f125561d": "notifyReceiver(address,address,uint256,bytes)", +"f12585f5": "getStageVolumeBoundaries(uint256)", +"f12611f1": "XID(address)", +"f1261fce": "permitTransfers()", +"f126e30f": "countUser(address)", +"f1272f35": "ICOBlaster()", +"f127328a": "totalTokenCollected()", +"f12782b2": "EPXAirDrop()", +"f127e53c": "LunchMoney()", +"f1280c23": "getCCH_edit_32()", +"f1287aef": "Ethmoji()", +"f129c5d7": "getGeneScienceAddress()", +"f12a1580": "withdrawDevReward()", +"f12a15b1": "heapify(int128[])", +"f12acca2": "upgradePonyHashing(uint256,uint256)", +"f12b3d3c": "SentFeeToPlatform(uint256)", +"f12b60f2": "TEAM_POOL_INIT()", +"f12c095b": "developer_string_A(string)", +"f12c87eb": "planetIndexToOwner(uint256)", +"f12d15c3": "transwerFunds(uint256)", +"f12d394f": "execute(uint8[],bytes32[],bytes32[],address,uint256,bytes)", +"f12ddd2b": "sendTokensToOwner(uint256)", +"f12e5eaa": "withdrawPartial(bytes32,address,uint256)", +"f12f5409": "accrueInvestorsTokens(address,address,uint256)", +"f12f6925": "NokuFlatPlan(uint256,uint256,address,address)", +"f13016d5": "internalPresale(address,uint256)", +"f1309dc0": "transferTokens(address,uint256,uint256,uint256)", +"f130da53": "GreenXToken()", +"f13101e9": "_delegate(address)", +"f1311a2e": "pgoMonthlyInternalVault()", +"f1317352": "setVCX(address,address,uint256)", +"f1317c09": "halt_purchases()", +"f1319892": "CoinifinexToken()", +"f131a7ae": "clearGame()", +"f1320af2": "exempt(address)", +"f13375bd": "addApprovedWalletAddress(address)", +"f13397b4": "EmeraldToken(string,string,uint256)", +"f133a7c6": "_update(uint256,uint256)", +"f133c38c": "testIntParserOneDecimal()", +"f1348138": "DoAirDrop(address,uint256)", +"f13497d6": "notifyCollateralNotTransfered(uint256)", +"f1349955": "externalTxs(uint256,bytes32)", +"f1352e78": "rewardPlayers(address[],uint256[])", +"f136a874": "approvedAddresses(address)", +"f137005f": "EOCHToken()", +"f13707b3": "adminGetPlayer(uint256)", +"f1378efa": "QuanYToken()", +"f137c236": "DSNCOIN()", +"f137d1a3": "getVestedAmount(uint256,uint256)", +"f13837f6": "ALPToken()", +"f1388f14": "mtrx()", +"f1388f46": "set_value()", +"f138fca5": "resetKoth()", +"f1395f3f": "tokensForDevteam()", +"f1398db1": "MbbToken()", +"f13a38a6": "getConstant()", +"f13ab647": "doMakerPayment(address)", +"f13ad3bf": "RemoveAllHeaders()", +"f13b68e8": "getPurchaseableMode(uint256)", +"f13b8d66": "removePerformer(address)", +"f13ba6a9": "_calcPhase()", +"f13c310c": "_createPlayer(string,uint256)", +"f13c7f57": "returnAllBalance()", +"f13c8fef": "weiTokensRaised()", +"f13c9b2b": "gcFundAmount()", +"f13ca4b8": "setEtherAmount()", +"f13cc606": "buyNOS(uint256)", +"f13d111f": "reverse(uint8[])", +"f13d22c1": "getModuleByName(string)", +"f13dc2e2": "watermark()", +"f13fc23b": "FINX()", +"f14053ad": "minVal()", +"f140b8ea": "getSentTransfer(uint256)", +"f141d076": "DURATION_DECREASE_PER_ETHER()", +"f14210a6": "withdrawETH(uint256)", +"f1437bd0": "setFrom(address)", +"f143e6db": "clearRequest(uint256)", +"f143ffe9": "ProfToken()", +"f14467fb": "ViewMyPrivateKeys(string)", +"f1448e10": "requestExecution(bytes)", +"f1455328": "CappedCrowdsale(uint256,uint256)", +"f145761c": "StartedGame(uint256,uint256)", +"f145cae9": "updateStoreFee(uint256)", +"f145ff23": "getDistributedTokens()", +"f1469382": "updateRates(uint256,uint256)", +"f147decc": "buscarAssinatura(string)", +"f147df3b": "get_king_address(address)", +"f1496070": "getAuctionArray(uint64,uint64)", +"f14ae17d": "isPresalePurchase(address)", +"f14b1c01": "upgradeFactory(uint256)", +"f14bd85d": "resignFromGroup()", +"f14be97f": "setTgeAddr(address)", +"f14ca7d7": "getVestingReleaseInterval(address,uint256)", +"f14ca885": "preICOcontributors()", +"f14d147f": "tokenSaleWeiMax()", +"f14dc176": "setDestructionCurator(address)", +"f14e96f1": "getBestBid(uint256)", +"f14eb30d": "SaleClockAuction()", +"f14f58f1": "removeAsset(uint256)", +"f14faf6f": "donate(uint256)", +"f14fcbc8": "commit(bytes32)", +"f14ff5cf": "getSeatMessageUrl(uint256)", +"f1508105": "Ohni(uint256,string,uint8,string)", +"f1518627": "anotherOwner()", +"f151e4ae": "devuelveToken()", +"f1522d53": "redeemablevilsinfo(address)", +"f1533936": "BNTPrice()", +"f153d3ad": "BurnupHoldingAccessControl()", +"f15467c4": "WelCoinICO(uint256,uint256,address,address)", +"f15627a1": "mintArray(address[],uint256[])", +"f156deb2": "miningTokensOf(address)", +"f1572e7d": "getQuoteKey()", +"f15732b8": "REAL()", +"f157c54b": "operatorRedeemByTranche(bytes32,address,uint256,bytes)", +"f157ea0b": "forkAddress()", +"f158458c": "getMinimumEndowment(uint256,uint256)", +"f15886db": "addressToReceiverToAllowedSprite(address,address,uint256)", +"f1588d66": "getPurchaseAmount(address,uint256)", +"f158e478": "destroyCampaign(bytes32)", +"f159eb84": "KVCToken()", +"f159f38f": "getTracks2()", +"f15a1b59": "tokenForTeam()", +"f15a691d": "validPurchase()", +"f15a9ae8": "maxPVPContenders()", +"f15ae568": "addEntry(address)", +"f15afa50": "fpMulI(int256,int256)", +"f15b2bda": "approveMintLocked(address,uint256)", +"f15beecf": "payNode(bytes32,uint32)", +"f15bf739": "getShareholderArrayLength()", +"f15caaa9": "insertDate(uint256)", +"f15cfe33": "KRWT_Token()", +"f15d775d": "changeMedianier(address)", +"f15e3af1": "getMatchAtRoundIdAtIndex(uint256,uint256)", +"f15e5548": "PasesSocio(uint16)", +"f15f14c5": "Dividends()", +"f15f2bf0": "blockEndICO()", +"f15f56a7": "calcBingo()", +"f1608682": "updateUserDetailsInBulk(address[],uint256[],uint256[],uint256[],bool[])", +"f160d369": "updateFeeRecipient(address)", +"f1610120": "next_giveaway()", +"f1625534": "deactivateRound(uint256)", +"f16270c3": "VITTokenSale(address,uint256,uint256,uint256,uint256,address[20])", +"f162c5a1": "totalScaleStaked()", +"f1637630": "withdrawBatch(bytes32[],address)", +"f1644b6c": "getFaucets()", +"f16638ec": "UselessReserveBank()", +"f1665a48": "NewVestedToken(address,address,uint256,uint256)", +"f166dc27": "Bid(address,string,uint256)", +"f1671b56": "getWeightRange()", +"f16787bc": "readFromCards(uint256,uint256)", +"f1679095": "getTransferAddressUser(address)", +"f167d695": "sacarDoacoes()", +"f1684237": "Ownable(address)", +"f1686296": "Hodor(string)", +"f1687a8d": "tokenSellCost()", +"f1694b3d": "updateResearch(address,uint256)", +"f16b6482": "gameCountdown(address)", +"f16b9422": "_recordFailedOldOwnerTransfer(address,uint256)", +"f16bdb9c": "validate(bytes20,uint96,uint32,bytes32[],uint16)", +"f16bdba9": "isCustomerinBLFromWL(address,address)", +"f16c5e8d": "issuerGuiveToken(address,uint256)", +"f16d9aca": "khabibToken()", +"f16dfbe9": "verifyAccount(address)", +"f16e74ac": "minDividendEtherAmount()", +"f16f9b53": "signedApproveAndCall(address,address,uint256,bytes,uint256,uint256,bytes,address)", +"f16fa66a": "updateLotteryData(address)", +"f16fa954": "debug_resizeRealPrefix(uint256,uint256)", +"f1700f94": "getInfoF1(address)", +"f1703d24": "addEntity(address)", +"f170c83c": "famedStarAddress()", +"f1714e97": "preserveTokens(address,uint256)", +"f1714fcc": "AddCommitteeToMapAndArrayEvent(address)", +"f171a730": "transferEvent_(address,uint256,bool)", +"f171ba5d": "verdictExecuted(address,bool)", +"f172f58f": "getPositionOwner(bytes32)", +"f172f84f": "jockeyLevel(address)", +"f17313e6": "unFrozenAddress(address)", +"f1736d86": "m_dailyLimit()", +"f17382ae": "SUPPLY_FOR_RESERVE()", +"f1739cae": "transferProxyOwnership(address)", +"f17401de": "init_multiowned(address[],uint256)", +"f17454b0": "UserAdded(bytes20)", +"f174683a": "VTrust()", +"f174b333": "buscarDocumentoPorId(uint256)", +"f1751688": "showReportForDevice(uint16)", +"f17520e5": "changeWhitelistAdmin(address)", +"f1753550": "supportsInterface(bytes32)", +"f175e6a9": "getTwitter()", +"f1762e5d": "bnbRefundEnabled()", +"f1765b22": "acceptSale(address[])", +"f1771cf0": "BURNABLE_UP_TO()", +"f177e837": "to62Encoding(uint256)", +"f177fc4f": "PornSceneToken()", +"f1781c72": "removeLockedTime(address,uint256)", +"f1797233": "positionAtIteration(uint256)", +"f179a86e": "setEtherToTokenAllowed(bool)", +"f179c6ef": "confirmBatch(address[])", +"f179f9f1": "parsecCreditContract()", +"f17a1ff5": "BAG_TRANSFER_FEE()", +"f17a3c4b": "FTST()", +"f17b1d63": "BacCara()", +"f17b5bb0": "assertMatchingBalance(uint256,uint256)", +"f17b6d9b": "relayCMCT(address,uint256,bytes32)", +"f17ba16b": "approveByAddress(address,address,uint256)", +"f17cc54b": "TestLib()", +"f17ccd73": "DNMC()", +"f17d186c": "withdrawAllFundsFromContract()", +"f17e48ec": "adminTransfer(address,uint256)", +"f17f29d0": "getGoldDataSerial()", +"f17f3ca3": "AUCTION_WHEN_PERCENTAGE_LOGIC_STARTS()", +"f17f6f8a": "escapeCaller()", +"f1806a21": "getUnapprovedUsers()", +"f180743a": "tokensForFounder()", +"f1807e35": "removePermission(uint8)", +"f18166c2": "TRADE_REWARD()", +"f181b388": "setTotalWithdraw(uint256,address,uint256,bytes,bytes)", +"f181f396": "unspentAmounts(uint256)", +"f182dd3b": "releaseTokens4Sender(uint256)", +"f183452c": "releaseTokenByOwner(address)", +"f1835db7": "verify(bytes32,uint8,bytes32,bytes32)", +"f1838a15": "burnFeatureDeactivation()", +"f1838fe4": "getExpectedRates(address,address[],address[],uint256[])", +"f1850af8": "getTokenSymbol()", +"f1860118": "tradeExecuted(address,uint256)", +"f1861749": "nextDiscountTTMTokenId6()", +"f18697cf": "IdolCoin()", +"f186a625": "transferContentOwnership(bytes32,address,address,string)", +"f186bb79": "getPixelPrice(uint16,uint16)", +"f186c67f": "permit(address,bool)", +"f186d77e": "setStarContract(address)", +"f1870e0c": "contractFinalized()", +"f187650d": "DeskBellPresale()", +"f18771de": "NujaRegistry()", +"f1880128": "getSTMPDecimals()", +"f1880b24": "checkToken(address)", +"f18899be": "getOpenApplications()", +"f189348a": "teleportCharacter(uint32)", +"f1895e08": "__issueTokens(address,uint256)", +"f1898fda": "TOKEN_CONTROLLER_INTERFACE()", +"f18ab544": "pendingList(address)", +"f18ad6fb": "getRecord()", +"f18b7bde": "SplitDividendsAmongstOwners(uint256)", +"f18ba98c": "handleSaleCompletionCallback(uint256)", +"f18cbe08": "_byteToString(bytes32)", +"f18d03cc": "transfer(address,address,address,uint256)", +"f18d20be": "adminWithdraw()", +"f18d4dbb": "addTokenSupply(uint256)", +"f18d5a93": "TokensSent(address,uint256)", +"f18dd512": "PERSONAL_FIRST_HOUR_CAP()", +"f18df6bb": "increaseAllowanceToken(address,uint256)", +"f18e120b": "setMaxTokensPerAccount(uint256)", +"f18ecf80": "OfferToken(uint256,string,string)", +"f190a793": "companyTokenWallet()", +"f190ac5f": "mintToAddresses(address[],uint256)", +"f190b4d3": "newUserRewardPool()", +"f1914dc5": "StaticEthAvailable(uint128,uint128)", +"f191c26d": "CPT()", +"f192866a": "sellTicket(uint256)", +"f192e91c": "forfeit(bytes32)", +"f1931b9e": "LAFIN()", +"f193a3f7": "changeBank(address,address)", +"f19414d5": "admin_inactive_dividend(address)", +"f194c23f": "_getCurrentAltarRecordId()", +"f1952473": "AcoraidaMonicaWantsToKnowTheNewQuestion(string)", +"f195995c": "isValidGeneration(uint8)", +"f195f0f9": "slice2(bytes,uint256,uint256)", +"f19674f6": "PatronThreeWithdrawal()", +"f19798ab": "numRolls()", +"f1979de8": "setPixelAreaColor(uint256,uint256,uint256,uint256,uint32[])", +"f197bbdd": "deadlineOne()", +"f1991a27": "saleStartTokenCreationRate()", +"f199265f": "internalExecuteCall(address,uint256,uint256,bytes)", +"f199f56d": "roundReward()", +"f19a5810": "changeBaseTokenPrice(uint256)", +"f19ab230": "Bcoin()", +"f19ac52d": "newDepositCommission(uint256)", +"f19be31b": "btcAddrPubKeyCompr(bytes32,bytes32)", +"f19be5d5": "JackpotCore(uint256,uint256,uint256,uint256)", +"f19c020d": "returnTokensAll(address)", +"f19c78b5": "contributorsKeys()", +"f19cfeff": "RepossessionBounty(address,uint256)", +"f19d2bcd": "EOS_address()", +"f19d736e": "Prosper()", +"f19dd75b": "lspToken()", +"f19e3c9f": "LogSnapshotCreated(uint256)", +"f19e75d4": "ownerMint(uint256)", +"f19e774e": "isValidBet(uint256)", +"f19eb731": "TKT_TokenERC20(uint256,string,string)", +"f19ee2a9": "_getAsset()", +"f19efc43": "getRoundInProgress()", +"f19f3246": "rejectOwnership()", +"f19fb157": "withdrawnow()", +"f19fc6ab": "gonIIToken()", +"f19fe69b": "withdrawTokenTo(address,address)", +"f19fefbc": "Hodling(address,address,uint256)", +"f1a00a53": "unregisterListening(address)", +"f1a0a85c": "div(uint64,uint64)", +"f1a138f4": "Airdropsamount()", +"f1a252b8": "getMoneyBack()", +"f1a39bde": "indexByTokenId(uint256)", +"f1a3de09": "register_minting(address)", +"f1a5158b": "Contest()", +"f1a570b8": "DividendRecycled(uint256,address,uint256,uint256,uint256)", +"f1a5fc99": "bytesToInt(bytes)", +"f1a63733": "createBountyToken(address,uint256)", +"f1a6ed46": "ORIGIN_ETH_BRT_RATIO()", +"f1a9af89": "startPrice()", +"f1a9d749": "LRCCcoin(uint256,string,string)", +"f1aaea1c": "updateLabAddress(address)", +"f1ab36b4": "getSaleInformation()", +"f1ace1a1": "ART_DECIMALS()", +"f1ad3334": "storeETH()", +"f1ade50c": "VelesCoin()", +"f1ae5437": "changeTakeFee(uint256)", +"f1ae72a5": "minAcceptedEthAmount()", +"f1ae8c55": "startRaffle(uint256)", +"f1afc4f6": "ShareHolderController(address,address[],uint256[],address,uint256,uint256,uint256,uint256,uint256,uint256)", +"f1b0202e": "TalkToExpertPayment(address)", +"f1b07f96": "deblacklistAddress(address,address)", +"f1b12493": "IcoContract(address,address,uint256,uint256,uint256,uint256,uint256)", +"f1b234ad": "setWallet(address,address)", +"f1b2b03c": "start_ts()", +"f1b2d6a3": "getListings()", +"f1b3ea6f": "asyncDebit(address,uint256)", +"f1b3f968": "getRaceEndBlock()", +"f1b3fd80": "momentTimeOf(uint256,uint256)", +"f1b46bc8": "generateRandomCard(uint32)", +"f1b4d548": "isValidTeam(uint256[])", +"f1b50c1d": "enableTransfer()", +"f1b541c2": "startPublicSaleStage()", +"f1b5bc17": "mintAmount4()", +"f1b5c777": "contributeWasCalled()", +"f1b5d7de": "pre_prices(uint256)", +"f1b6315e": "StartRoulette(uint8)", +"f1b676a4": "ico3Ended()", +"f1b6cee5": "winPot(uint256[])", +"f1b74348": "addExisitingContributors(address[],address,uint256[])", +"f1b75173": "getLegacy(uint256)", +"f1b8a5bf": "commitPhaseMinVotes()", +"f1b9ee24": "setInactive()", +"f1bab09c": "setExtraBonus(uint256)", +"f1bab410": "manualSale(address,uint256)", +"f1bba50a": "GoldBlocksTickets()", +"f1bba6f9": "account(string)", +"f1bbc663": "tokenSaleClosedTime()", +"f1bca30f": "removeManyAdmins(address[])", +"f1bca7a4": "doCall(uint256)", +"f1bcb6e5": "createContractor(address,address,bool,address,string,string)", +"f1bd4c04": "getJackPot()", +"f1bd5978": "__address3__()", +"f1be1679": "getMarket()", +"f1be42f1": "numCharacters()", +"f1bf18db": "availableZNT()", +"f1bfb9cd": "listSingleCard()", +"f1c05831": "authoriseSale(uint256,uint256,address,uint256)", +"f1c10c24": "infoTokens(address)", +"f1c16deb": "validPurchase(address,uint256,uint256,uint256,uint256,uint256)", +"f1c21077": "PROBABILITY_DIVISOR()", +"f1c22a05": "setNewPixelPrice(uint256)", +"f1c30ec0": "reclaim(bytes)", +"f1c36ce0": "burnFromAddress(address)", +"f1c3dd3e": "fuckTest()", +"f1c41b68": "setConsensusRules(uint256[6])", +"f1c461c7": "mesasCreatedVerify()", +"f1c4d6b0": "DOG_Crowdsale()", +"f1c4ecb4": "maxCapWei()", +"f1c53a3a": "UpdateUserExtraData1(address,bytes32)", +"f1c55931": "reserveFunds(address)", +"f1c5d07b": "totalLoveBlocks()", +"f1c61958": "DIGITALCASH()", +"f1c6aeb7": "SetApplicant(string,uint32,uint256,int256,string)", +"f1c6c520": "runningauctions(uint256)", +"f1c760ae": "fixBalanceInternal(address)", +"f1c7689e": "CandyRate()", +"f1c94b45": "lastBlock_a7Hash_uint256()", +"f1c9cc11": "lockMin()", +"f1ca9410": "gen0CreatedCount()", +"f1cca8aa": "setTakerFee(uint256)", +"f1ce37d9": "eachUserWeight()", +"f1ce9595": "TIME_PERIOD_IN_SEC()", +"f1cea858": "TCLRToken(address,address,address,address,address,address)", +"f1cf5b38": "setWethContractAddress(address)", +"f1cf8d27": "addFuel(uint256,uint256,uint256,uint256,uint256)", +"f1cfb100": "remainingEscrow(bytes32)", +"f1cff4b5": "testBitsNotSetSuccess()", +"f1d02a8c": "MiningToken(string,string)", +"f1d0469e": "get_sec_by_year(uint256)", +"f1d08bfa": "setOpenForSale(bool)", +"f1d15f1f": "setLandPrice(uint256,uint256)", +"f1d1768c": "updatePresaleListMapping(address[],address,bool)", +"f1d18a42": "safediv(uint256,uint256)", +"f1d20d4d": "provider(bool,address,address,address)", +"f1d2165f": "SaleActive()", +"f1d22be0": "freezeAll(address)", +"f1d2b3c2": "Owner1()", +"f1d2b8ab": "seePurchase(uint256)", +"f1d308d5": "SingularityTest17()", +"f1d35260": "setGovernor(uint8,address)", +"f1d3a853": "PalliumCrowdsale(uint256,address)", +"f1d588c5": "setRoleManager(address)", +"f1d59443": "getUSETTotalSupply()", +"f1d61850": "confirmationPeriodOver()", +"f1d61f23": "timeLockAdvisor(address)", +"f1d71b73": "betBlueCoin()", +"f1d73540": "Quiz(string,string)", +"f1d841f1": "minAcceptedAmount()", +"f1d89857": "RequestFactory(address,address)", +"f1d91942": "setInfoUrlPrefix(string)", +"f1da588a": "PrivateCoin()", +"f1da7e63": "getMortgageRate(address)", +"f1daa1f0": "writeDefinitions(uint256,string)", +"f1daa5ba": "calculateAmountForETH(uint256)", +"f1db23dc": "totalProceeds()", +"f1dbd547": "FINAL_AML_DAYS()", +"f1dbd647": "receiveDividends(uint256,uint256)", +"f1dc24ae": "getMeshPointByCreator()", +"f1dd08b4": "transferCommissionReceiver(address)", +"f1dd6147": "buyTokensIco(address)", +"f1de75e3": "getPrefixOwner(string)", +"f1dfcddb": "testTransferGasIssue()", +"f1dffed7": "setIntValue(int256)", +"f1e02620": "setFirstTime(uint256)", +"f1e03d67": "createEscrow(bytes16,address,address,uint256,uint16,uint32,uint32,uint8,bytes32,bytes32)", +"f1e253dd": "brickIds()", +"f1e298c3": "addFee(address,uint256,address,uint256)", +"f1e2ac12": "evalParam(bytes32,uint32,address,address,bytes32,uint256[])", +"f1e2e921": "_Owned()", +"f1e328f9": "left68(uint256)", +"f1e4a540": "unsetCoordinator()", +"f1e50ce9": "saveMe()", +"f1e69009": "registerDsp(address,uint8,bytes32[5])", +"f1e6bb1c": "getVoteOptions(uint256)", +"f1e6f4cd": "right40(uint256)", +"f1e7ae1f": "modifyMemberLimits(address,uint256,uint256)", +"f1e8ace7": "decodeBillingMetadata(uint256)", +"f1e8aec4": "isStardted()", +"f1e954d8": "increaseTokenSaleAllocation()", +"f1e9951f": "getActionCount(bool,bool,bool)", +"f1e9a514": "VREO_SALE_PHASE_2_END_TIME()", +"f1ea43e7": "TCSCCoin()", +"f1ea6cbd": "creationMinCap()", +"f1ead3d6": "getAuctionsFor(address)", +"f1eae25c": "mortal()", +"f1eae64a": "openSell()", +"f1eb0ed9": "newInitialPlayerOffering(string,string,uint256,uint256,address,uint256,uint8)", +"f1ebe451": "ChooseB()", +"f1ecff08": "BastoneToken()", +"f1ed9923": "isEcoAllocated6()", +"f1eeec2e": "insureClient(address,uint64)", +"f1ef9881": "hashSecret()", +"f1ef9a08": "preicoAddresses(address)", +"f1efb76a": "getPayTo()", +"f1f05a3f": "getAttr(bytes32,uint256)", +"f1f0b290": "lockToken(bool)", +"f1f1e30f": "ethForKey(uint256)", +"f1f201e8": "getArtworkInfo(uint256)", +"f1f33565": "ENG()", +"f1f339ef": "doCheck()", +"f1f3ae31": "novaContractAddress()", +"f1f49033": "deductDeposit(address,uint256)", +"f1f4e25d": "OctaBlock()", +"f1f62f10": "isWalletLocked_Send(address)", +"f1f6d945": "webAddress()", +"f1f732cb": "BONUS_TOKENS_RESERVED()", +"f1f76438": "checkNumber(address)", +"f1f87fc9": "BitMix()", +"f1f9539f": "KittyRace(address)", +"f1fa1744": "sellpause()", +"f1fa906c": "getProjectName(uint256)", +"f1fb3ace": "minEth()", +"f1fb5219": "_calculateContribution(uint32,uint8,uint64)", +"f1fbf2a3": "calculateObtainedSBT(uint256)", +"f1fc4db4": "updateCutoff(uint24)", +"f1fd9614": "getNumData(uint256)", +"f1fe42b8": "TransactionRequest(address[3],address,uint256[11],uint256,bytes)", +"f1fea32a": "setPOOL_edit_7(string)", +"f1fec2b8": "nodePrice()", +"f1ff3d4b": "totalNumberMinted()", +"f1ff4a67": "releaseWithheldTokens(address,bool)", +"f1ff732b": "setBanker(address)", +"f1ffde45": "BasicBallot(address,string,string)", +"f20001b0": "Menu08()", +"f20151e1": "setExecutionMaxPerTx(uint256)", +"f2016a4f": "updateMinEthPerNotification(uint256)", +"f201da0d": "newChannel(address,address,uint256,uint256,uint256,address)", +"f2020275": "users()", +"f2021550": "QBankChain()", +"f2022905": "toldYouItWouldWork()", +"f20341a8": "getRemainingTarget()", +"f203af26": "registerImport(bytes8,bytes8,uint256)", +"f203c19d": "usersAddress()", +"f203c857": "getSpeaker(address)", +"f20431c8": "MyTotalNTD()", +"f2057179": "changeInstitutionOwner(string,address,address)", +"f20652a1": "nxcSold()", +"f2068bfc": "addUniqueSpinner(string,uint256,address,uint256,uint8,uint8,uint8)", +"f206cf74": "MINIMUM_ETH_SOFT_CAP()", +"f206e7c9": "fechAllVoteResultBySnapshotBlock(uint256)", +"f20717e9": "getNbTrade()", +"f207564e": "register(uint256)", +"f2080ba6": "Pong(int8)", +"f2083220": "activeTranscoderTotalStake(address,uint256)", +"f2091083": "dollaryDanToken()", +"f2097550": "bucketExists(bytes32)", +"f2097b9b": "doesAddressOwnSpinner(address,uint256)", +"f209fc1f": "purchaserWhiteList(address)", +"f20b2cf5": "getMJModel(uint256)", +"f20b4368": "AllocateMainSale(address,uint256)", +"f20b93ea": "getInvoiceAmountPaid(bytes32)", +"f20d5385": "endCrowdsalePhase2Date()", +"f20d5943": "s0(bytes1)", +"f20d5e57": "distributeToReferreal(uint256,address)", +"f20dde7b": "updateCostETH()", +"f20de9d6": "openGameLoop()", +"f20e5e35": "getAuctionDetails(uint256)", +"f20e5f51": "PeriodChanged(uint8)", +"f20eaeb8": "output()", +"f20f24ec": "pauseTokenSale()", +"f2102390": "SOFTCAP_RATE()", +"f2107f83": "getStakingInfoPayload(bytes)", +"f2108aa8": "FraCoin()", +"f2114752": "viewSecondLotOfContractState()", +"f21153d2": "withdrawSettle(bytes32,uint256,address,address,uint256,uint256,bytes32,bytes,bytes,bytes32)", +"f211c9ed": "releaseMultiByStage(address[])", +"f2125f40": "SEELE()", +"f212c216": "setSystemAuctionDuration(uint256)", +"f213159c": "depositTo(address,address,uint256)", +"f2139abf": "getBigPromoBlockInterval()", +"f213aad2": "dayWithdrawCount()", +"f2141ab9": "lossToCharity(uint256)", +"f21439b5": "envokeTokenAllocation()", +"f2147f7b": "currentPeriodPrice()", +"f21502e5": "ZTHTKNADDR()", +"f2153fae": "BNKCToken()", +"f215bc3e": "genEstKeyBlockNr(uint256)", +"f21632e1": "icoEtherReceived()", +"f2166ab1": "xpanda(uint256,string,string)", +"f216b203": "TokenSyndicate(address,uint256,uint256,uint256,uint256)", +"f216bfd6": "updateUportInfo(string)", +"f216f45d": "nextStageBonus()", +"f21711f3": "currentRating()", +"f217d6a3": "standardDailyLimit()", +"f217f15c": "doCreate(uint256,bytes)", +"f2180c61": "versionCode()", +"f2181e23": "initializeGasPriceLimitFundraiser(uint256)", +"f219fa66": "depositERC20(address,address,uint256,uint256)", +"f21a1468": "getOutcomeTokens()", +"f21aaee6": "MinerChain()", +"f21aefd2": "isDebug()", +"f21af007": "unWhitelist(address)", +"f21b1150": "test_div(uint256,uint256)", +"f21b422a": "unregisterCustodian(address,address)", +"f21b64ad": "DepositETH(uint256)", +"f21b9379": "setRoundAvailableToken(uint256,uint256)", +"f21baec7": "withdrawPreIcoFounds()", +"f21c27a7": "CTAMToken()", +"f21cdf6f": "defrost()", +"f21d5dea": "withrawAll()", +"f21ddc7a": "teamBalanceOf(address)", +"f21f537d": "startedAt()", +"f21f80d0": "setGenome(uint256,uint256)", +"f21f8236": "getRefTo(address,address)", +"f2204d35": "getWalletsFromUser()", +"f220cbe0": "GetIsPaused()", +"f2218819": "getAddressAndSharePriceOfFunds()", +"f221abef": "isReachedThreshold()", +"f221b25b": "addSponsorshipsTotalRefunded(address,uint256,uint256)", +"f221b75a": "addCET4(uint32,string,uint32,uint32,uint32,uint32)", +"f221fda0": "totalRooms(string)", +"f2225500": "FHCoin()", +"f222d0b9": "getNumberOfBets()", +"f223446c": "start_game(bytes32,uint8,uint32,uint16,address,uint256,uint8)", +"f2234f6e": "confirmAdmin()", +"f223885a": "deposit(uint256[],uint256[])", +"f2245b64": "DioToken()", +"f225138b": "littCapsuleGet(bytes32)", +"f22513a7": "withdrawLatium(uint256)", +"f225415a": "getFrozenBalanceByAddress(address,address)", +"f225ba3f": "unLockBounty(address)", +"f2260031": "lockAddress(address,bool)", +"f2263e12": "refundedFunding()", +"f2269c8e": "_createFootballerStar(uint256,uint256,uint256,uint256)", +"f2269dba": "airdropCooldownEnd()", +"f2274abb": "getReservedIsVested(address)", +"f227b198": "CreateWEE(address,uint256)", +"f229abbd": "enableBurn(bool)", +"f22a0b31": "getDays(uint256)", +"f22a598f": "changePriceUpdateTimeline(uint256)", +"f22aa38b": "getSDCCSupply()", +"f22aae52": "_memcpy(uint256,uint256,uint256)", +"f22b0c94": "setBonusOff()", +"f22b258a": "trustedMarketTransfer(address,address,uint256)", +"f22b683e": "delKycVerifiedInvestor(address)", +"f22c0f7d": "isValidTxPaymentForMCW(bytes32)", +"f22c10d7": "setShareHolders(uint256,address,uint256,bool)", +"f22c618e": "isItemStopped()", +"f22c6a7c": "STE(string,string)", +"f22c71e5": "finalizeLottery(uint16,bytes32,uint256)", +"f22c8f63": "FINANCE_CAP()", +"f22d022b": "burnIcoCoins()", +"f22dbfe6": "forLoyalty()", +"f22f264d": "setMinBalance()", +"f22ffd1d": "TLN_TOKEN_DECIMALS()", +"f23008ca": "CarBonCash()", +"f2309723": "setUserApproval(address,address,string)", +"f23103ee": "subTx(address,uint256,bytes)", +"f2316472": "transferMyTokens()", +"f2325244": "VULCAN_PROMETHEUS_MAX_CARGO()", +"f232880d": "reserveWaveTokens()", +"f232a84d": "getAmountAttempted(address)", +"f232e351": "initializeBalances()", +"f23342d8": "checkHashExists(bytes32)", +"f2335e9d": "setAvgGas(uint8,uint16)", +"f2342bba": "getBagDetails(uint256)", +"f2342cd5": "Contributor(string,address,address)", +"f234bac5": "tokenCreationCapUpdate(uint256)", +"f235bdfd": "getRetailerTotalBalances(address)", +"f235bfa4": "addAccount(address,string,uint256)", +"f236e2fb": "UTCT()", +"f2371fb3": "grantGiveableKudos(address,uint256)", +"f2371fd1": "newEmployer(bytes32)", +"f238683f": "lastKing()", +"f238dbea": "minimum_payment()", +"f2393d55": "getKebabsSincelastKebab(address)", +"f239c5dd": "crowdsaleMinted()", +"f239e528": "sendOneEtherHome()", +"f23a6e61": "onERC1155Received(address,address,uint256,uint256,bytes)", +"f23a8155": "internalInvest(address,uint256,uint256)", +"f23a8aa6": "getOwnerLink(address)", +"f23b55c3": "BB8Token()", +"f23b6fa2": "emitApprovalEvent(address,address,uint256)", +"f23b872e": "tvc()", +"f23ba8e6": "hire(address,uint256)", +"f23bc4f8": "acceptOffer(uint64)", +"f23bd5f8": "getYes(uint256)", +"f23c51cd": "setReceiverContractAddress(address)", +"f23ca012": "becomeNorsefire()", +"f23e22a7": "rescheduleTransaction(uint256,uint256)", +"f23f07f6": "getMinAuditPriceMedian()", +"f23f16e6": "appealCost(uint256,bytes)", +"f23f2cbe": "withdrawWithFee(address,uint256,uint256,bool)", +"f2405395": "STAGE_THREE_ETHRaised()", +"f2408d6b": "PIN(uint256,string,string,uint256,uint256,uint256)", +"f2409d65": "getMileagePoint(address,address)", +"f240d0f5": "feesWithdrawn()", +"f240f7c3": "dispute()", +"f24113c6": "updateProfile(bytes32,bytes32)", +"f241335d": "calculatePrice(string,uint88)", +"f2414cbd": "YASToken()", +"f24150ae": "VoxelDestroyed(uint8,uint8,uint8)", +"f2415183": "Tithe()", +"f2416f64": "oracleItCallbackAddress()", +"f242432a": "safeTransferFrom(address,address,uint256,uint256,bytes)", +"f2429b1c": "buyCryptopinions(address)", +"f2430fe5": "Plumix()", +"f243c170": "buyTokens2(address)", +"f243c2a7": "tokenIssuer()", +"f244815e": "setBuyUnfreezePeriodSeconds(uint256)", +"f245036e": "setPools(address)", +"f2451a43": "addOwnerNotations(string)", +"f2455807": "setDesignatedReporter(address)", +"f24570e0": "approvedFactories()", +"f245b9e4": "DVIP(address)", +"f245d8c6": "NewHero(address)", +"f2460172": "_removeAssetFrom(address,uint256)", +"f246080a": "addvehicles(address,string,string,string,string,string,string)", +"f246317c": "SafeTimeLock()", +"f247016c": "isVoteOngoing()", +"f2477f7c": "BLOCKREWARD()", +"f24818cb": "unholdTime()", +"f2491377": "MAX_SINGLE_ISSUED_FROM_OTHER_CURRENCIES()", +"f249cf19": "get_all_challenges()", +"f24a0faa": "balance3()", +"f24a534e": "Oracle()", +"f24a6997": "maxGasRefund()", +"f24ae640": "countAccounts()", +"f24b5779": "removeTrustedIssuer(address,string)", +"f24b6782": "updateCrowdsaleTimeline(uint256,uint256)", +"f24d2532": "changeRegistrationStatus(address,bool)", +"f24e4a15": "Purge()", +"f24e7fd9": "activateKillSwitch()", +"f24edfd6": "setWhitelistedAddressPre(address[],bool)", +"f24f9abe": "grantBonusTokens(address,uint256)", +"f24ff92c": "withdrawal(uint256,address,uint256)", +"f2505211": "oracleItQuery(uint256,string,string,string)", +"f2513ee9": "cancelMarketsWhenPaused(uint256)", +"f2518983": "reinvestEther()", +"f251bc8c": "addPack(address[],uint16)", +"f251fc8c": "totalContributors()", +"f25214e4": "CRYPTODOL()", +"f2523e7a": "setUseRegistry(bool)", +"f2529e55": "Fidget(address,address,uint256,uint256,uint256,uint256)", +"f2530d1d": "claimableDividend()", +"f2534e47": "changeCertifier(address)", +"f253e6ae": "Daric()", +"f2540e39": "_unfollow(address,address)", +"f2556289": "endDutchAuction(uint256,uint256)", +"f255c21f": "Offer(address,string,uint256,uint256)", +"f2561a43": "voteSuicide(address)", +"f25633dd": "year1Unlock()", +"f256b130": "marketingFund()", +"f256b48e": "getBalanceOfDist(bytes32)", +"f257bf3b": "getAuthorityIndex(address)", +"f2582ef5": "UserStatus(string,address,uint256)", +"f258a4ea": "investorAccounts(uint256)", +"f2590315": "ClockAuction(address,address,uint256)", +"f25a7815": "MockSale(address,bool,uint256,uint256,uint256,uint256,uint256,uint256[])", +"f25acb35": "acceptDeal(bytes16)", +"f25aed54": "accountWithUpdatePermissions()", +"f25b278b": "fetchHash(uint256)", +"f25b3f99": "blocks(uint256)", +"f25c130a": "createOnRound(uint256)", +"f25c870a": "MyERC223(string,string,uint8,uint256)", +"f25d2422": "fetchVoteInfoForCandidate(address)", +"f25dafd1": "drainAUC(uint256)", +"f25e34a9": "checkJuryVoted(address)", +"f25e7bb4": "getState(bytes20)", +"f25e9ed2": "getMaster(address)", +"f25eb5c1": "removeReverse()", +"f25ebdad": "isProxyManager(address)", +"f25ee28d": "MySecondToken()", +"f25efc49": "frozenRecords(uint256)", +"f25f4b56": "feeWallet()", +"f25fbe6f": "MetaGold()", +"f25fd5cf": "createGoldSellOrder(uint256,uint256)", +"f260ad05": "titanToken()", +"f260bd94": "validateRequestParams(address[3],address,uint256[12],uint256,bytes,uint256)", +"f261a8c0": "withdrawbymanager()", +"f2624067": "LogIncreaseCap(uint256)", +"f2624b5d": "whitelistCount()", +"f262521f": "PHASE_5_PRICE()", +"f262de8c": "add_staircase(uint16)", +"f2634485": "setGameRules(uint256,uint256,uint256,uint256)", +"f26377ed": "kittyGym()", +"f2642d0f": "decayedTransfer(address,uint256,address)", +"f2653966": "createReleaseAuction(uint256,uint256,uint256,uint256,uint256)", +"f26557d8": "AdeelaTestCoin()", +"f2659bd1": "GetCityLandNums()", +"f265d351": "rateSetter()", +"f2663a03": "TERSERAH()", +"f267035f": "BOARD_1()", +"f267215a": "_getProviderClosed(uint256)", +"f267ded5": "TokenStarted(address)", +"f268225c": "setBountyWalletAddress(address)", +"f26835d4": "tokensRemainingInHolding(address)", +"f26a058d": "U21Y()", +"f26b9834": "ENOM()", +"f26baecc": "_capLevelEth()", +"f26bb53d": "setCityPlan(address,uint256)", +"f26bbde8": "WHOMCrowdsale(address)", +"f26c159f": "freezeAccount(address)", +"f26c6aed": "newChannel(address,uint256)", +"f26cbe9a": "raiseDollarsDeducted(address,uint160,int160)", +"f26df083": "finalIntervalForTokenGen()", +"f26e5e85": "GetUpgradeCost(uint256,uint256)", +"f26e787e": "sendDelayedTransactions()", +"f26f336e": "MINING_RESERVE()", +"f26f4f61": "threshold(bytes32,address)", +"f26f6334": "setCraftingAddress(address)", +"f26fb705": "getPayoutRoundId()", +"f270bcda": "getClosingBlockNumber(uint256)", +"f2711812": "milion()", +"f27197ab": "getIsAvailable()", +"f272404d": "_approve(address,uint256,address)", +"f2729497": "numberOfFarmers()", +"f2729d8a": "getMinutes(address)", +"f272a60c": "addBagDelayed(uint256,uint256)", +"f272fe18": "Campaign(uint256,uint256,uint256,address)", +"f273515c": "Cyberminer(uint256,string,string)", +"f273fbbc": "perform_withdraw()", +"f27402e9": "bchRaised()", +"f274a828": "icoPhase3Start()", +"f274d00c": "LAWCoin(uint256,string,string,address)", +"f2759ee2": "transferDomainBackToSeller(string)", +"f2760d9c": "shareHoldersWallet()", +"f2761444": "MathUtil()", +"f2766051": "lastFinish()", +"f276e1c7": "voteResultPublish(address[],uint256[])", +"f276f36b": "getGameDataByIndex(uint256)", +"f276fdde": "onTaxTransfer(address,uint256)", +"f277010d": "percentFeeTimes100()", +"f27715b4": "updateMultiSig(address)", +"f2787d33": "feeAccountToken()", +"f278bd02": "newBooleanValue()", +"f279648b": "setConstraint(int256,bytes32,bool,bool)", +"f279fac5": "internaltransfer(address,address,uint256)", +"f27a4188": "icoSucceed()", +"f27a73ca": "frozenCell(address,uint256)", +"f27a8a99": "updateEmployeeInfo(uint256,string)", +"f27ac4d9": "decrease(address,uint256)", +"f27ae77d": "DGDIssued()", +"f27b6d8f": "Message(string,address,uint256)", +"f27b8084": "walletWebydo()", +"f27b9341": "getTeamPlayersNum()", +"f27c24ed": "startCloseSale()", +"f27c3bf6": "oneYear()", +"f27c85bc": "getQuickPromoPercent()", +"f27d0afe": "deleteArbitrator(address)", +"f27d3977": "NEOBleu()", +"f27db8c9": "getWinnerPayout()", +"f27e2ef6": "nextMineEvent()", +"f27e4b1e": "SwitchTokenTransactionsOn()", +"f27ee76c": "lastPot()", +"f27eede0": "getTotalBid(address,uint256)", +"f27f974b": "Margaret()", +"f2801fe7": "getUserInfo(address,address)", +"f28063ce": "getMemeHolders()", +"f28075af": "get_player_address(uint256)", +"f280efaf": "addressToBytes1(address)", +"f28109d1": "ConsentTemplate(string,string,uint256,string,string,string)", +"f281c386": "_percent(uint256,uint256,uint256)", +"f281e7d1": "checkManagerStatus(address)", +"f282b1df": "batchAddCandidateByIndex(uint256,address[],bytes32[])", +"f282f551": "setCrowdsaleTokenExtv1(address)", +"f2836e1c": "contributorStatement(uint256,string)", +"f28386bf": "Nexium()", +"f2853292": "ChangeOwner(address)", +"f2856a2a": "getTeamPlayers(uint256)", +"f285d98e": "unlockSecret()", +"f285f25c": "tokenMetadataHash(uint256)", +"f286c1c5": "addtoOwners(address,address)", +"f287900d": "LogContribution(address,address,uint256,uint256,uint256,uint256)", +"f2887132": "baseHourglass()", +"f288753d": "centsPerEth()", +"f2888dbb": "unstake(address)", +"f2891b3d": "assetRegistrant(bytes32)", +"f28a2f75": "_allocateUnspentRefTokens()", +"f28a7912": "quick2()", +"f28ac86a": "token(string,string,uint256)", +"f28adc4d": "Attack()", +"f28afb1e": "pushAngelInvestmentData(address,uint256)", +"f28b325d": "admin_set_shopStoreRegister(address)", +"f28b7a9c": "disbursementAmount()", +"f28b824e": "MAT_TOTAL_SUPPLY_LIMIT()", +"f28c0716": "approveDeal(bytes32)", +"f28ce253": "is_min_goal_reached()", +"f28d253d": "getDividents()", +"f28e59c9": "get_sale_owner(address)", +"f28ee00c": "permittedSender()", +"f28f0f6a": "bulkCreateLambo(uint256,address,uint64,uint256,uint256)", +"f2901ae2": "ownerSetGlobalOperator(address,bool)", +"f29143ad": "Project_ChangeOwner(uint256,address)", +"f2928eea": "CaptainPreSell()", +"f2934817": "HalalPenny()", +"f293bab5": "numberofnews()", +"f294aa26": "EndoSHARD()", +"f295206f": "_unsafeSend(address,uint256)", +"f295587e": "giveITup()", +"f29617da": "registrationDeposit(address)", +"f2965a2c": "BurnupGameCore(address)", +"f296c1f2": "buyTokens(address,uint256,uint256,string)", +"f297109d": "RESERVED_TEAM_LOCKED_SIDE()", +"f2977c97": "approve(address,bytes32,bool)", +"f298083b": "setLottery(address)", +"f2980eb2": "getPRewardLength(address)", +"f2983257": "setFeatureStatus(string,bool)", +"f29a72ff": "_addTokenToPartition(address,bytes32,uint256)", +"f29b2040": "export(address,bytes8,address,address,uint256,uint256,bytes)", +"f29c1bc2": "setIsChargingTokenTransferFee(bool)", +"f29c7870": "setRefineCost(uint256)", +"f29d2f28": "setTokenHolder(address)", +"f29f1fa2": "RecievedEth(address,uint256,uint256)", +"f29f4d0b": "lastBuyTime()", +"f29f7b1b": "remove_coin(uint256)", +"f29fdb8a": "createSeason(uint32,uint64,uint64,address[8],uint256[8],uint16[8],address[8])", +"f29fe77e": "testMintGuy(int256)", +"f2a0928d": "preICOduration()", +"f2a0a987": "GCNYToken()", +"f2a16d5a": "GetNonce(uint8)", +"f2a38dac": "setKYCAdmin(address,address)", +"f2a40db8": "accounts(uint256)", +"f2a4a82e": "item()", +"f2a5630a": "BallotUp()", +"f2a5c79c": "getViewDatas()", +"f2a6517f": "updateTokenContractAddr(address)", +"f2a69417": "cancelFoundationTransfer()", +"f2a6e605": "evenDistThresh()", +"f2a724b1": "SnoqualmieCoin(uint256,string,string)", +"f2a75fe4": "empty()", +"f2a7e624": "approvedWallet()", +"f2a9a8c7": "allowance(bytes32,bytes32)", +"f2ab3e60": "incomeOf10k()", +"f2ab59d9": "contributionTarget_()", +"f2ab9384": "sumElements(uint256[])", +"f2abd01d": "initialBeating()", +"f2ac9427": "pricesToCommit(address[])", +"f2adc939": "removeBoundary(uint256)", +"f2af0e2f": "getProviderCurrentSupply(address)", +"f2af59bf": "fourthStage()", +"f2afe985": "LEBRON()", +"f2b0318e": "_getNibbleArray(bytes)", +"f2b05c15": "getTopicCount(address)", +"f2b0a55d": "getPlotData(uint256)", +"f2b175c0": "sendTokenTeam(address,uint256)", +"f2b1be45": "setAquariumCost(uint256)", +"f2b265ca": "playGame(uint256,string,string,string)", +"f2b26d8f": "nextEtherForSale()", +"f2b29993": "getMineral(uint256)", +"f2b2f40c": "allowPurchase(uint256)", +"f2b2ff1b": "platformReferral()", +"f2b3ddfa": "getCET4ByAddr(address)", +"f2b40209": "RATE3()", +"f2b445ad": "rowround(uint256,uint256)", +"f2b45ac1": "startCrowdSale()", +"f2b45ec5": "DonQuixoteToken()", +"f2b47d52": "geneScience()", +"f2b4c1b9": "isValidDataHash(bytes32,bytes)", +"f2b559ac": "printQuotation(int256)", +"f2b6e8b6": "emitSynthetixUpdated(address)", +"f2b7a54b": "destTokensAirdrop()", +"f2b841c0": "isPlayerIdle(address,uint256)", +"f2b85515": "addNewGame(address)", +"f2b904c3": "checkBetColumn(uint8,address,bytes32,bytes32)", +"f2b9541f": "createEthCommunityToken(string,uint8,string,uint8)", +"f2b9b40f": "enableRegistration()", +"f2b9f903": "_getParticipantRoles(address,address)", +"f2b9fdb8": "supply(address,uint256)", +"f2ba18ed": "calculateVotes()", +"f2ba31ea": "Marine()", +"f2ba478d": "EtherCashPay(address,address,address,uint256,uint256,uint256)", +"f2ba810e": "PRE_SALE_30_BONUS_MIN()", +"f2baaa07": "createBet(uint32,uint256)", +"f2bb5ce1": "maxMintProofOfStake()", +"f2bbca67": "checkVotingForChangeBuySellLimits()", +"f2bbdab4": "N2C()", +"f2bc7ded": "getHowManyOwnersDecide()", +"f2bcd022": "withdrawalAddress()", +"f2bddf66": "redemptionInfo(address,uint64)", +"f2be600d": "getNumTanksType(uint256)", +"f2bea1fc": "MANAGER_SUPPLY()", +"f2bee03d": "set_sale_address(address)", +"f2bf7e7a": "TokenGAC(uint256,string,string)", +"f2bff63b": "ico_tokens()", +"f2c00979": "_emitTransferred(address,address,uint256,address)", +"f2c0cdbe": "dividendsPercent()", +"f2c0d168": "newOwner(address,address)", +"f2c1d74e": "FansToken()", +"f2c298be": "register(string)", +"f2c2dff2": "testFailSetNotRetractableNotOwner()", +"f2c340f2": "chfCentsPerToken()", +"f2c3e6d9": "requireTokenFuel()", +"f2c402b6": "todayReserved()", +"f2c44e77": "UpgradeEnabled(address)", +"f2c4c45d": "makeInvestment(address,uint256,address,address,uint256,uint256,address)", +"f2c51f9d": "DNAc()", +"f2c5925d": "setNext(bytes12)", +"f2c6bab0": "doCallNumber()", +"f2c70bda": "addInvestorIfNotExists(address)", +"f2c768e1": "Register(string,string,string,uint256,uint256,address)", +"f2c7d331": "receiveDividends(uint256)", +"f2c80435": "addToUnminted(uint256)", +"f2c816ae": "addAddressToBlacklist(address)", +"f2c8257e": "getcapname()", +"f2c8a87b": "SYC2ndEarlyPurchase()", +"f2c8b676": "FACTOR_8()", +"f2c8d247": "convertibleToken(uint16)", +"f2c9e0ed": "SkrumbleToken()", +"f2c9ecd8": "getNumber()", +"f2cba6a6": "REPUTATION_DECIMALS()", +"f2ccaed5": "getSaleContractEndBlock(address)", +"f2cd84d5": "tokenHoldersToClaim(address)", +"f2cedaa0": "destroyCoins(address,address,uint256)", +"f2cee589": "TIER1_PERCENT()", +"f2cf687a": "MAXPERWEI()", +"f2cf70e4": "setWeekly()", +"f2cfe267": "setEpochData(uint128[],uint64[],uint64[],uint256[])", +"f2d05f2b": "playerIndexToOwner(uint256)", +"f2d06540": "setBitpaintingStorage(address,address)", +"f2d15c48": "setLicenceTellerPrice(bytes2,uint256)", +"f2d213c8": "BONUSED_PURCHASES_LIMIT()", +"f2d2e1a7": "QSHU()", +"f2d2fa91": "privateSaleMaxContrAmount()", +"f2d386b9": "getjournalists()", +"f2d439d8": "PokerPayout()", +"f2d50151": "verifyRs1Hash(bytes,bytes32)", +"f2d578dc": "RHToken()", +"f2d57adf": "setClaimInterval(uint256)", +"f2d5866d": "ATTR_EXPLORABLE()", +"f2d5d56b": "pull(address,uint256)", +"f2d68ee0": "withdrawCollateralFromPool(address,uint256)", +"f2d6cd26": "CEO_Trader()", +"f2d6e0ab": "__process(bytes,address)", +"f2d701a7": "giveaway(uint256,uint256,uint256,bool,address)", +"f2d73dc6": "VoteZoneToken()", +"f2d7f637": "closePosition(bytes32,uint256,address,address,bool,bytes)", +"f2d805d5": "firstStageRaisedInWei()", +"f2d906cc": "addressFounders2()", +"f2d93fb0": "setRushTimeFloorCount(uint256)", +"f2d9f46e": "flipPayingDoublrs(bool)", +"f2da1f0a": "imageAddress(address)", +"f2da67db": "setMany(uint256,int256,uint256,bytes20,address,bytes)", +"f2da877d": "dataOfSell(address,uint256)", +"f2dabd26": "multipleMint(address[],uint256[])", +"f2dadd3d": "FundRequestPrivateSeed(uint256,address)", +"f2db5493": "VGS()", +"f2dbe0f8": "options(bytes32,address,address)", +"f2dbf12e": "personalInfo()", +"f2dc8878": "setTokenSaleAmount(address,uint256)", +"f2dd4be8": "publish(string,bytes32,uint256)", +"f2dd4e03": "getTxCon(bool,bool)", +"f2dd6585": "garanteSystemDepositInAllFunds()", +"f2ddc772": "confirm(bytes)", +"f2dddd95": "BLDAToken(uint256,string,uint8,string)", +"f2de12fc": "getFxUSDAmount(string,uint256)", +"f2dfa136": "STATUS_DEAL_WAIT_CONFIRMATION()", +"f2dfd7f5": "cancelWarranty(string,string,address)", +"f2e03ad0": "openProvider(address,bool,string,string,uint256,string,uint8,bool,address)", +"f2e09c7a": "activatePoint(uint32,int256)", +"f2e0d636": "registerSponsor(uint32,int256,bool,uint32)", +"f2e1192a": "wolkSale()", +"f2e12a39": "setRole(uint8,address)", +"f2e1b1cc": "getWinSlot(uint256)", +"f2e1be50": "GDPOracle()", +"f2e22ae0": "messageBoard(string)", +"f2e253ec": "FUTURE_ME_TOKENS()", +"f2e27b33": "signedTransferHash(address,address,address,uint256,uint256,uint256)", +"f2e28e16": "BrianexToken()", +"f2e29341": "accountQuery(address)", +"f2e2e5ea": "trustedAddressInLUT(uint256)", +"f2e34909": "PRICE_CUTOFF()", +"f2e41c0b": "birthDateOf(uint256)", +"f2e4ff30": "isValidAuction(uint256)", +"f2e552a5": "verifyUpdateTransaction(bytes32,uint256,address,uint256,address,uint256)", +"f2e55ac1": "getDestinationByIndex(uint256)", +"f2e62772": "admin_address()", +"f2e650ff": "PerpetualTestCoin()", +"f2e6e170": "addressesImported(address,uint256,uint256)", +"f2e6fecd": "Ethernational()", +"f2e7269b": "transfer_token2_toContract(address,address,uint256)", +"f2e7514c": "buyByName(string)", +"f2e79ab7": "ETHealth()", +"f2e84f24": "_byrne(uint256)", +"f2e998df": "ownerRevealOverride(uint256)", +"f2ea83e6": "executeRecursive(address,address,bytes32,int256)", +"f2eae773": "getLockedWalletAmount(address)", +"f2eaee02": "applyWait()", +"f2eb32fb": "addOffChainContribution(address,uint256,uint256,string)", +"f2eb3e34": "init1()", +"f2eb5dd3": "tokenUSDRate()", +"f2ebde57": "tryExec(address,bytes)", +"f2ec602c": "feeWithdrawn()", +"f2ec6264": "ownerAddressLUT(uint256)", +"f2ecebea": "ratePreIco()", +"f2ed2148": "newGateway()", +"f2edb7c7": "purchaseWonder(uint256)", +"f2ee8be9": "setSubmissionOpen(uint256)", +"f2eea5c1": "setupAccreditedAddress(address,uint256)", +"f2eec570": "transferredAmount(address)", +"f2eec69b": "CTOAddress()", +"f2f03877": "commit(uint256,bytes32)", +"f2f0967b": "setLifToken(address)", +"f2f18af2": "Withdraws(address,uint256)", +"f2f254c7": "getLatestMinorTree(bytes32,uint32)", +"f2f2a043": "setUserCommissionRate(uint256)", +"f2f3384e": "_getGen0Address(uint256)", +"f2f3a1d2": "Erc20Token(string,string,uint8,uint256)", +"f2f3c773": "vestInterval()", +"f2f48e20": "Update_START_PRESALE_TIMESTAMP(uint256)", +"f2f4eb26": "core()", +"f2f56ffe": "getCommit(uint256,address)", +"f2f62ac7": "TOSPrivateIncentiveContract()", +"f2f65960": "setGracePeriod(uint256)", +"f2f6861b": "WinbitTest()", +"f2f6ccda": "getBalanceFromOwner()", +"f2f6ff15": "COLOR_BLACK()", +"f2f70594": "disableMintForever()", +"f2f76549": "startExit(uint256,uint256,uint256,bytes,bytes,bytes,bytes)", +"f2f8569f": "buyAndTransfer(address,address,bytes)", +"f2f85fce": "GRAND()", +"f2f921e6": "snapshotDailyGooDepositFunding()", +"f2f977a7": "getBetsByCategory(string)", +"f2fa8f69": "TokenPolicy(address)", +"f2fb5706": "deletePersons()", +"f2fc6deb": "weiToTokensBono(uint256)", +"f2fc9100": "init(address,string,string,uint8,uint256,bool)", +"f2fd2a49": "galleryThree()", +"f2fdddf4": "setEncryptContract(address)", +"f2fde38b": "transferOwnership(address)", +"f2fdfe34": "createSpecies(uint256,string,address)", +"f2fe1a1d": "geSoftwareVersionRecordsLength()", +"f2fec913": "collectMKR(uint256)", +"f2ff0912": "getHolderAtIndex(uint256)", +"f2ffb4fc": "stopLive()", +"f30000f9": "NewCloneToken(address)", +"f300cf1d": "addUserToMeta(address,uint256)", +"f301ac65": "hashBid(address,uint256,address,address,bytes32,uint256,uint256)", +"f3022de8": "setNewContractAddress(address)", +"f3025556": "newDeveloper(address,uint64,bool)", +"f3025f10": "dataOfBuy(address)", +"f302be42": "startTokenRaffle(uint256,address,uint256)", +"f3036c24": "UTORN()", +"f30398ef": "Wishcoin()", +"f30416ca": "setSaleAuctionContractAddress(address,address)", +"f30431b5": "addAdminAccount(uint256,address)", +"f3052d26": "getCategory(uint256)", +"f30562b6": "updateRecord(string,string,string)", +"f3057ff9": "accsessAccountTransfer(address,uint256)", +"f3072020": "partner_1_name()", +"f3074b58": "withdrawSDTfromcontract()", +"f307946d": "hardCapMainSale()", +"f3083c44": "GetMyEarnings()", +"f308846f": "registeredCallbacks(address)", +"f3095511": "GetTokenPriceCents()", +"f309782b": "LescovexAddr()", +"f309caca": "icoEndOfStageB()", +"f309e3c5": "allocateUnsold()", +"f30a4a70": "getSoldToken()", +"f30a7166": "multiTransferFrom(address,address[],address[],uint256[])", +"f30ba854": "tokensPerEther_numerator()", +"f30bb8af": "GoalReached()", +"f30c0ee6": "getRank05()", +"f30c9296": "myUsableBalance()", +"f30d3ad4": "crowdSaleAmountRaised()", +"f30d4d3f": "signedTransferFromCheck(address,address,address,uint256,uint256,uint256,bytes,address)", +"f30df155": "calculateBorrowAmountWithFee(uint256)", +"f30f8508": "setReservedTokensList(address,uint256,uint256)", +"f30faff6": "SetExtra(uint256)", +"f31011ac": "ANTS_TO_COLLECT_1ANTHILL()", +"f310348e": "_removeFrom(address,uint256)", +"f3106780": "DoDividend(uint256,uint256,uint256)", +"f3107c48": "nestedFirstAnyToAny2(uint256)", +"f310a19d": "getPlayerVaultsHelper(uint256,uint256)", +"f31174ee": "inactivityReleasePeriod()", +"f3125a1f": "deposit(address,uint256,bytes,uint256)", +"f31294a4": "announcementURI()", +"f3130ba5": "setTokensSoldInPresale(uint256)", +"f3147b00": "totalICOAmount()", +"f314bf46": "setReleaseDb(address)", +"f314e2c0": "CoinExchangeToken(uint256,string,uint8,string)", +"f314e976": "parcelGzeWithoutBonus()", +"f315e81d": "getStage1End()", +"f31604c7": "setData()", +"f3161022": "convertToEther(uint256)", +"f3164eb6": "transferAndFrozen(address,uint256)", +"f31660e9": "getOrganisationsSize()", +"f3169506": "readPurchaseAtIndex(uint256)", +"f316ea78": "buyOrderTotal()", +"f317b85b": "ownerAddressNumberMap(address)", +"f3181001": "founderAndTeamSent()", +"f3182d6c": "setFeeRate(address,uint256,uint256)", +"f31887e6": "tokenTransferByAdmin(address,uint256)", +"f318c75f": "dvipAddress()", +"f318cc4a": "invite(uint256,uint256,uint256)", +"f3191443": "toggleMigrationStatus()", +"f3199e98": "setMinWeiForDInit(uint256)", +"f319a899": "NameProvider(address)", +"f31a044d": "test_bytes(bytes,bytes)", +"f31a18a5": "endICOStage7()", +"f31b4e89": "updateEpisode(uint256,string,uint256)", +"f31bac4d": "SwitchLoanOwner(address,uint256)", +"f31bebaf": "BugBountyOneBreaker()", +"f31df3f8": "AddItem(uint32,uint16,uint256,uint16,uint16,string)", +"f31e3e84": "AML()", +"f31e731e": "attack(address,bytes32,uint256)", +"f31ed9e6": "DescartesToken()", +"f31fe982": "endGround(uint256)", +"f3200a1c": "change_symbol(string)", +"f3201424": "register(address,address,address)", +"f3203dc0": "MultisigsChanged(address,address)", +"f3205c93": "isUserBanned()", +"f320d963": "assertEq(string,string)", +"f320f858": "setRandomAddress(address,address)", +"f32106f0": "TemplateToken(uint256,string,uint8,string)", +"f32113d5": "setBgxWalletAddress(address)", +"f3214652": "NHSToken()", +"f321653a": "setCommunityBallotStatus(bool)", +"f3217345": "getShowText()", +"f32188a5": "reinvest(address,bool)", +"f3221c7f": "hasHash(address,bytes32)", +"f322770c": "LogWhitelistAdd(address,uint256,address)", +"f3227dc4": "cancelDeal(string)", +"f322a1cf": "BlueChainToken()", +"f322c755": "daoManager()", +"f32306d2": "registerNameXID(string,uint256)", +"f3236460": "closeUp()", +"f323a061": "lottoQueue()", +"f3269716": "year()", +"f326be05": "Centaure()", +"f3278191": "BuyFST(address,uint256,uint256,uint256)", +"f32784cd": "getGratitudeOf(address,uint256)", +"f327b7fc": "isNotZero(address,string)", +"f3283fba": "setMultisig(address)", +"f3290290": "createIncident(bytes32,bytes32,uint256,uint256,bytes32,uint256,uint256,uint256,bytes32)", +"f32a547c": "getBuy(uint256)", +"f32a72eb": "airDropMembers(address)", +"f32a9f77": "ReceiveEther(address,uint256)", +"f32b85e8": "timeScale()", +"f32d61eb": "setDevTokensPercent(uint256)", +"f32e8038": "setPercentIncrease(uint256,uint256,uint256)", +"f32eca11": "revokeAccessDeposit(address)", +"f32efd3c": "recoverUser(address,address,uint256,uint8,bytes32,bytes32)", +"f32f6a23": "olympus()", +"f32fc856": "Wanchain()", +"f32fe995": "left96(uint256)", +"f3302a4d": "ChangeTransferStatus(bool)", +"f3305ae2": "setName(bytes32,address)", +"f331020c": "GAMEPAUSED()", +"f3310628": "allocateTokensInternal(address)", +"f33146af": "test_twoTrueAsserts()", +"f3316ef5": "countStudentRequest()", +"f3318fed": "ThrowsInConstructor(bool)", +"f3319243": "decimalFraction(uint256,uint256)", +"f331de4c": "addShare(address,uint256,uint256,uint256)", +"f332511f": "getTxcode(uint256)", +"f33261ac": "stageCount()", +"f33280b2": "etherLimit()", +"f332a245": "unbanToken(address)", +"f3332d1c": "burnTokensExp(uint256,uint256)", +"f3333e7f": "etherProceedsAccount()", +"f33376c6": "createNext(address,string)", +"f333fe08": "getCertificate(bytes32)", +"f3358ac4": "getNum(uint256)", +"f33670aa": "sharesAddress()", +"f336bc7e": "maxDecreasePct()", +"f336e80a": "setMaximumVotingWindow(uint256)", +"f3372898": "dtrade(address,uint8,uint8,uint256[],address[],bytes32[])", +"f337616c": "PETER()", +"f337a0bb": "getLLV_edit_4()", +"f337c2e1": "calculateNextEtherValue(uint256)", +"f33801e0": "setCoachPrice(uint256,uint256)", +"f3382694": "isCamp()", +"f3388e75": "timelockController()", +"f338c984": "initialBountyAmount()", +"f3391998": "hasHash(uint256)", +"f339292f": "mintingStopped()", +"f3396905": "lockedNowBalanceOf(address)", +"f339c504": "lockBalance(uint256)", +"f33aa95d": "setIsTransferEnabled(bool)", +"f33ae7fd": "auctionOf(uint256)", +"f33b1ea5": "rewardUsers(uint256,address[],uint256[])", +"f33d0f3a": "requiredBet()", +"f33d9a52": "get_data_benefited(address,string)", +"f33dc1fa": "founderTokensAllocated()", +"f33f8f26": "setpubprize(uint256)", +"f33f9522": "readCoin(uint256)", +"f33ffc16": "addSpecialBonusConditions(address,uint256,uint256)", +"f34080b3": "MIN_INVESTMENT_ICO_PHASE_TWO_POUNDS()", +"f3408110": "transferWithFee(address,address,uint256)", +"f340fa01": "deposit(address)", +"f3412942": "accountLevelsAddr()", +"f34186c8": "endEthGet()", +"f341cae8": "setEmergencyAccount(bytes32,bytes32)", +"f341d3ba": "bandwidthFactor()", +"f3433ff2": "callbackTime()", +"f3436873": "totalAxiesRewarded()", +"f3436c85": "TKXToken()", +"f343ccbd": "CrystalSkull()", +"f3444701": "newTankType()", +"f344f4fa": "HARDCAPPED_SUPPLY()", +"f345d06b": "getTileHp(uint16,uint8)", +"f3463272": "signupFee()", +"f3465181": "preSeedAllocation()", +"f3466b47": "setTotalCollected(uint256)", +"f346fd74": "TraceChain()", +"f34839d1": "C50()", +"f3492915": "confirmSpendLimit(uint256)", +"f34969d1": "minimumFundingCHF()", +"f349e3e3": "own(address)", +"f34a5e85": "MercuryToken()", +"f34b95b3": "register(string,address,bytes32)", +"f34c7010": "commitSecurity(address,uint256,uint256)", +"f34d22d0": "getQuickPromoRemainingBlocks()", +"f34df94e": "Version(string,address,address,bool)", +"f34e2699": "isPresaleFinalized()", +"f34e3723": "release(string)", +"f34e4c60": "currNumOfBattleCards()", +"f34ed4e6": "RanDAOPlus(address)", +"f34f43f6": "getRepTokenAddress()", +"f34f5f45": "Election(string)", +"f3512ce0": "multiLock(address[])", +"f351d166": "_depositEscrow(uint256)", +"f3522656": "getRejections(uint256)", +"f352c45c": "createChallenge(string,string,uint256,uint256)", +"f353108b": "fechVoteResultForCandidate(address,uint256)", +"f353ae48": "goodluck()", +"f354040c": "SpreadToken()", +"f3541901": "execute(address,bytes,uint256,uint256)", +"f3548cd3": "getBagCount()", +"f354e2c3": "_getSeason()", +"f355b92d": "BuyTokens(address)", +"f356d6cc": "getPI_edit_18()", +"f356e8de": "placeNewSurvey(bytes32,uint256,uint32,uint256)", +"f3574a20": "TokenTransacted(address,address,bytes32,address,uint256,address)", +"f3576220": "withdrawls()", +"f3582373": "getTokenAddressesLength()", +"f3586fb9": "_isAuthorized(address,uint256)", +"f35898bd": "PreviousPayout()", +"f358b3de": "REKTMultiSigWallet()", +"f359671c": "withdrawWithReference(address,uint256,string)", +"f359b03c": "recalcBonuses()", +"f359d66d": "driverCount()", +"f35a8796": "removeHouseHold(uint256)", +"f35b3b51": "Bullioncoin()", +"f35b6068": "selectWinningNumber()", +"f35ba5d3": "acceptCeoOwnership()", +"f35c172e": "getSecondHexByte(bytes1)", +"f35d606c": "ETFToken(address[],uint256[],uint256)", +"f35dad40": "totalRedeemed()", +"f35e3945": "SRHCoin(uint256,string,string)", +"f35e4a6e": "setStartBlock(uint256)", +"f360234c": "compare(uint256,uint256)", +"f3604e54": "advisorsKey()", +"f36089ec": "getConversionRate()", +"f3608b57": "_getEthToUsdPrice(uint256)", +"f360c183": "setNonce(uint256)", +"f360e22f": "celebrityCount()", +"f3611719": "confirmFriendship(string)", +"f3616a90": "UpdateHOLDer(address,address)", +"f362b9af": "StartNewMiner()", +"f362d78f": "testBitNotEqualSuccess()", +"f3634033": "token_b_amount()", +"f363441f": "getCreatorDotBalance()", +"f363449f": "reservationSupply()", +"f3635a02": "vc2Wallet4Pct()", +"f3637d51": "setPayLock(bool)", +"f3647597": "setGrantVestedEDEXContract(address)", +"f364e7f4": "_investAsEarlybird(address,uint256)", +"f36631e7": "createHero(uint16,address)", +"f3667517": "getMinter()", +"f3669ec9": "hopefuls(uint256)", +"f36706cb": "SENSToken(address,address,uint256,uint256)", +"f3678cd3": "updateOffChainTokens(uint256)", +"f36a1fd9": "_allowBuyDirect()", +"f36a4bd3": "ReceivingContractTokenFallbackFailed(address,address,uint256)", +"f36b135d": "PRICE_EXPONENT()", +"f36c0810": "RANDOM_BYTES_COUNT()", +"f36c83f0": "getPuppy(uint256)", +"f36d1b8e": "SignStopDividend()", +"f36d1e4e": "setRewards(uint256,uint256,uint256)", +"f36d29e7": "triggerTansferEvent(address,address,uint256)", +"f36db900": "gameStarterDividendPercentage()", +"f36e20db": "getStage1Start()", +"f36e8dea": "MedicalCannabis()", +"f36f235d": "getLedger()", +"f36fd108": "editTitle(uint256,string)", +"f370031e": "BetOnATeam(address,uint256,uint256)", +"f3701da2": "build(address)", +"f3702b82": "setBonusPattern(uint256[],uint256[])", +"f3703a69": "LogGrantCreated(bytes32,uint256)", +"f3706bb7": "killTransaction(bytes32,bytes32,string,string)", +"f370ff51": "LogTokenPurchase(address,address,uint256,uint256)", +"f371475a": "initialiGnSupply()", +"f371ec49": "pausedB()", +"f3737ffd": "setDiscount(uint256[],uint256[])", +"f3746947": "giveBirth(uint256,uint256[2],uint256[2])", +"f3746ff7": "advisorReserve()", +"f375bcaa": "failedTimestampSeconds()", +"f37633f9": "Internet()", +"f376daa8": "MMX(uint256,string,string)", +"f3773466": "endIcoRoundManually()", +"f377f5b7": "setAirdropTotalSupply(uint256)", +"f3781697": "HubiiCrowdsale(address,uint256,uint256)", +"f3784dec": "withdrawFailed(address)", +"f378ff76": "random(uint32,uint32)", +"f3791477": "OLD_TOKEN()", +"f3794914": "mintParticularPart(uint8[4],address)", +"f37a7d4d": "boosters()", +"f37a9c1c": "ALLOW_BETA()", +"f37b0427": "CryptrustToken()", +"f37b437b": "scheduleCall(address,bytes,uint256,uint256,uint8,uint256,uint256)", +"f37b74ca": "authorizePayment(string,bytes32,address,address,uint256,uint256)", +"f37b916a": "tokenCreateUtcTimeInSec()", +"f37bdaac": "transferSig(bytes32,uint256,address)", +"f37bf1be": "getParticipateName(uint256)", +"f37cc477": "calcOutput(uint256,uint256)", +"f37d11cc": "canTransferFrom(address,address,uint256)", +"f37e592d": "shopStoreId(address)", +"f37e741e": "projectWeight(uint256)", +"f37f8345": "getTokenRates(address,address[])", +"f37fda1b": "setUser(address,address,bool)", +"f37fdaf5": "calculateProfitPercent(uint256)", +"f37ff01b": "getLLV_edit_13()", +"f380729d": "claimB2()", +"f3813163": "proxyTakeEtherBack(address)", +"f3817b23": "getWizzPandaCountOf(uint256)", +"f381a3e2": "FuelingToDate(uint256)", +"f381f2a5": "minimumCap()", +"f38323bb": "bountyDurationInBlocks()", +"f383c7b3": "setCrowdsaleStart(uint256)", +"f383d6b9": "OwnerValidatorImpl()", +"f384632c": "updateContestTeam(uint32,uint32,uint8[],uint32[])", +"f384764c": "oraclize_query(string,bytes[2])", +"f3850fda": "receiveTokens(uint256,uint256)", +"f385d890": "cnt_registrations()", +"f3868555": "orderEthOf(address)", +"f386b8fd": "TestToken2()", +"f3873e7b": "PublicBattle()", +"f38780e2": "winnerPaid()", +"f388b046": "currentTask()", +"f388ef80": "updateXPLPerEther(uint256)", +"f389057f": "_setMouthValue5(uint256)", +"f3898a97": "convert(address[],uint256,uint256)", +"f38a6163": "IncMainSupply(uint256)", +"f38a8262": "grantPermission(address,bytes32)", +"f38ad578": "setSecondWinner(address[])", +"f38afbf7": "setModuleEnable(string,uint256)", +"f38b0585": "withdrawAdvisorFunds()", +"f38b0600": "fireEventLog3()", +"f38b2ef0": "testTheFirstMultiplier()", +"f38d5cb9": "_getHash(address,address,address,address)", +"f38db3d8": "setRunningInternal(bool)", +"f38e5ca2": "getBlobStoreFromFullBlobId(bytes32)", +"f38fb65b": "revertCall()", +"f3905b82": "ibaMultisig()", +"f390cae4": "ADDR_TKG_TECH_FUND()", +"f390e4b4": "getResidentNumber()", +"f3913e69": "tokenTransferFrom(address,address,address,uint256)", +"f391f074": "accountIdForAddress(address,address)", +"f3922cde": "addExceptAddress(address)", +"f39259d0": "_batch2_icosaleStartTimestamp()", +"f393b3b0": "_DataRegistered(bytes32)", +"f393f022": "icoStartP5()", +"f3942753": "addTxToCustomerRegistry(address,bytes32,uint256,uint256)", +"f3945ca0": "addEndorsement(bytes32,bytes32)", +"f39460c4": "setCheckMinContribution(bool)", +"f3956a71": "isMEH()", +"f396282d": "signupVerify(bytes32,bytes32)", +"f396cd66": "weiAmountShare()", +"f396e81b": "SALES_DURATION()", +"f397884b": "preIcoOpeningTime()", +"f3983e44": "createAmountFromTmedForAddress(uint256,address,address)", +"f398dc28": "aprovarUsuario(address,uint256)", +"f398faaa": "getRank09()", +"f3993d11": "batchTransferFrom(address,address,uint256[])", +"f39981e1": "burnStake(address)", +"f3998918": "getPreSaleTokenAmount(uint256)", +"f39992e4": "Blackwood()", +"f399c7e6": "startGame(address,uint256)", +"f39afaba": "GCV()", +"f39b1e74": "CQMVValueCirculateAssets()", +"f39b5b9b": "ethToTokenSwapInput(uint256,uint256)", +"f39b7fb1": "get_dati_articolo(bytes,bytes,bytes10)", +"f39bfb52": "giveBountyTokens(address,uint256)", +"f39c2197": "numberOfPartners()", +"f39cce01": "convertLotIdsByAddress(address)", +"f39d359b": "initDemoc(string)", +"f39d9f19": "CSES1()", +"f39e6e1e": "OwnerAddition(address)", +"f39e9fa6": "setERC223Activated(bool)", +"f39ec1f7": "lookup(bytes32)", +"f39f421e": "FIBKAD()", +"f3a04af4": "PUBLIC_TOKENS()", +"f3a133a9": "setStartAt(uint256)", +"f3a16c3e": "tokenCreationCapWithOutBonus()", +"f3a1b4b2": "setCrowdsaleStartandDuration(uint256,uint256)", +"f3a1d297": "addToken(address,string,string,uint8,string)", +"f3a1f828": "EventRandomLedgerRequested(address,uint256,uint256,uint8,address)", +"f3a247cb": "ZooToken(uint256)", +"f3a27963": "unpauseMints()", +"f3a3abc6": "setWhitelistTransfer(address,address,bool)", +"f3a3bef4": "innerScope()", +"f3a3de38": "EMACCrowdsale(uint256,uint256,uint256,address)", +"f3a44fe1": "withdrawForWorkshop()", +"f3a49f90": "sendOwner()", +"f3a504f2": "funded()", +"f3a53cd8": "ICOWIZARD(string,string,uint8,uint256)", +"f3a5626b": "addPurchased(bytes32,uint256)", +"f3a5644d": "crowdsaleEndedTime()", +"f3a5950e": "testHighestTranch()", +"f3a5f262": "setMemberTier(address,uint256)", +"f3a60cb4": "unLockAddrOwner(address)", +"f3a670cd": "Redeemed(address,uint256,uint256)", +"f3a67ad2": "subAccountBalance(address,uint256)", +"f3a8041f": "Crowdsale(address,uint256,uint256,uint256,uint256,uint256)", +"f3a87492": "AntiFakeLabelToken(address,uint256)", +"f3a8bcaa": "_logGameGiftInfo(address)", +"f3a9bf03": "verifyImage(address,string)", +"f3aa4420": "_grandTournamentBooty(uint256,uint256,uint256,uint256)", +"f3aa67ad": "buyTokensOraclePayIn(address,uint256)", +"f3ab7ea9": "seeker()", +"f3ac2732": "confirmed(uint256)", +"f3ac3df5": "prizeFund()", +"f3ac9ee4": "parseOpenTx(address[11],uint256[10],uint32[4],bool,bytes)", +"f3acc06b": "retrait_1()", +"f3acc477": "addTotalEtherValue()", +"f3ad0dd8": "multiTransferToken(address[],uint256[])", +"f3adcc46": "getMinerHashRateCurrentHalving()", +"f3ae2415": "isManager(address)", +"f3ae5acd": "LastExtractTime()", +"f3aee9f9": "tokensUnlockPeriod()", +"f3afe129": "hourPotExpiration()", +"f3aff181": "collectBagHolderFund(uint256)", +"f3b07bb1": "maxEthPerTransaction()", +"f3b15ffd": "test_insert_containsId()", +"f3b16265": "onDraw()", +"f3b303cd": "AdvanceToken()", +"f3b35100": "voteOf(address)", +"f3b3a9fa": "maxReserve()", +"f3b423d5": "updateReloadAmount(uint256)", +"f3b42c40": "isOnSaleAny3(uint256,uint256,uint256)", +"f3b4735e": "lotteryAddresses(uint256)", +"f3b4eccb": "ChallengeFund()", +"f3b50c04": "rescind()", +"f3b55007": "TDx(uint256,string,uint8,string)", +"f3b5678f": "ETHER_MAX_CONTRIB()", +"f3b585cc": "nSteps()", +"f3b5a5af": "bonusForEveryone()", +"f3b600ec": "_allocateTokens(address,uint256,uint256)", +"f3b6a748": "unpauseFrom(uint256)", +"f3b75ee3": "totalCommunityFundMinted()", +"f3b77f30": "close(bytes,bytes)", +"f3b849d6": "_allocateReferralTokens(address,uint256)", +"f3b8b2a9": "weiBuysHowManySeconds(uint256)", +"f3b978c1": "checkProof(bytes32[],bytes32[])", +"f3ba138e": "MineLevel(uint256)", +"f3baa092": "RemoveRequestEvent(address,address)", +"f3bb9741": "commitmentCampaign(uint256,bytes32)", +"f3bbc84c": "tierNum()", +"f3bd27a4": "secondStageMinting()", +"f3bda50a": "getSetNewTerrainPrice(uint256,uint256,bytes32)", +"f3bdc228": "destroyBlackFunds(address)", +"f3bdea04": "burnICACOIN(uint256)", +"f3bdf8ba": "requestEthereumLastMarket(address,string)", +"f3be07eb": "getDefaultTranches(address)", +"f3be1e35": "VIVAToken(uint256)", +"f3becb59": "C(address)", +"f3bf6b73": "proposalChecked(address,uint256,uint256)", +"f3bf78e7": "setBAAAU(bytes32,address,address,address,uint256)", +"f3bf93a0": "forceReleaseAdmin(bytes32)", +"f3bfddb7": "getById(string)", +"f3bfe75e": "BeatTokenIcoFinalized()", +"f3c0efe9": "tokenToTokenTransferOutput(uint256,uint256,uint256,uint256,address,address)", +"f3c156f3": "purchaseDigitalArtSellingItem(uint256)", +"f3c15f49": "getLiability()", +"f3c16e54": "Resolve(bytes32)", +"f3c1c7c0": "LogCoinsEmited(address,uint256)", +"f3c20de0": "tokens(uint16)", +"f3c274a6": "isPut()", +"f3c37bd5": "Verifier(address,uint256,uint8)", +"f3c505c2": "updateInventories(uint256,uint256,uint256,uint16)", +"f3c50ce0": "CobeFriendCore()", +"f3c51c84": "_EnvoisTokens(uint256,uint256)", +"f3c537c5": "fint8(int8)", +"f3c64850": "amendedEarlyPurchaseIndexes(uint256)", +"f3c6a223": "Bifrost1Token()", +"f3c74496": "logWorkerStatement(string)", +"f3c78091": "AcceptingDepositsChanged(bool)", +"f3c7d275": "prenup(string,string,string,string,string,address,address)", +"f3c7e538": "set_successful_verifier(address)", +"f3c85eba": "compound(uint256,uint256,uint256)", +"f3c8f3ef": "startListing()", +"f3c8ffaa": "endPreICOStage()", +"f3c957f2": "haltCommitPeriod(address,bytes32,bytes32)", +"f3c95c60": "isValidUser(address)", +"f3c9a5cc": "CrowdsaleController(uint256,address,address,bytes32)", +"f3ca062a": "setLevel(uint256,uint8,uint8,uint16)", +"f3ca29b1": "ownerDailyWithdrawal()", +"f3ca2b54": "test_twoValidEqString()", +"f3ca5679": "Fund(address,string,address,uint256,uint256,address,address,address,address,address[],address[])", +"f3ca7425": "exercisePriceOf(uint256)", +"f3ca824c": "setStartCloseSale(uint256)", +"f3caad03": "isCitizen(address)", +"f3cb1805": "bidOnBreedingAuction(uint40,uint40)", +"f3cb4aae": "confirmBusiness(address)", +"f3cb8c31": "addEmployee(address)", +"f3cbc040": "checkVerify(bytes32,uint256,uint256,uint256)", +"f3cbe7b5": "exchangeableTokensFromStock()", +"f3cc2436": "maxPoolTotal()", +"f3cc6860": "setHash(bytes32,uint256,bytes32)", +"f3cca49a": "restoreUnsoldTokens(address)", +"f3cca5b4": "crowdSaleSoldAmount()", +"f3cca85a": "getInputAddress()", +"f3ccaac0": "image()", +"f3ccb401": "DistributeAirdropMultiple(address[],uint256)", +"f3ccc2f2": "buscarDocumentoPorQM(string)", +"f3cd1c28": "setTransfersAllowed(bool)", +"f3cd543f": "sendBoughtTokens(address,uint256)", +"f3ce2bc6": "_updateSaleAvgHistory(uint256,uint256)", +"f3ce40eb": "setSchellingRoundSupply(uint256)", +"f3ce782e": "LongBought(address[2],uint256[5],uint256)", +"f3cee129": "getOwnerServer()", +"f3cee64d": "setCmd(uint256)", +"f3d1dfee": "calcSeason(uint16)", +"f3d2f17b": "getData_22()", +"f3d2f824": "setXQU(string)", +"f3d305b4": "getBoostedProposalsCount(address)", +"f3d3402a": "changeBountyData(uint256,string)", +"f3d38a7b": "setBTBAddress(string)", +"f3d3d448": "setControllerAddress(address)", +"f3d3fce7": "settleLend(bytes,bytes,address,uint256,bytes,bytes,bytes,bytes)", +"f3d448d2": "countryInfo(uint256)", +"f3d47d1b": "transferAllFrom(address,uint256[])", +"f3d490db": "transferByPartition(bytes32,address,uint256,bytes)", +"f3d4b942": "emergencyFreeze()", +"f3d544d2": "FRTToken(uint256,string,string)", +"f3d6b54e": "setAirdropPrize(uint256,uint256)", +"f3d6cb29": "setLLV_edit_34(string)", +"f3d791ea": "submitTrade(address,uint256,address,bytes)", +"f3d79244": "frozenProfitDate(address)", +"f3d7bf1d": "privateStageTokensSold()", +"f3d7c6f7": "claimPrivateTokens(address[],uint256[])", +"f3d7e464": "EARLY_CONTRIBUTOR_VESTING_PERIOD()", +"f3d838a0": "Copyright()", +"f3d89c49": "setAutoCreationFee(uint256)", +"f3d91708": "isEligibleForUpgrade(address)", +"f3d97a25": "cancelTrade(address,address,uint256,uint256,uint256)", +"f3d9bc65": "sendBountyTokens(address,uint256)", +"f3d9eeec": "CourseChanged(uint256,uint256)", +"f3db09b8": "invoice(bytes32,address,address,uint256,uint256,uint256,uint64,uint64)", +"f3db4f2b": "retrievePieceFromEscrow(uint256)", +"f3dbaf0d": "removeVestingAdmin(address)", +"f3dd3d8a": "newCurrency(string,string,uint8)", +"f3ddb946": "bets_total()", +"f3de56de": "createNewSociety(string)", +"f3df0bbe": "startNewBallot(bytes32,bool,bytes32[])", +"f3df29b6": "periodITO_endTime()", +"f3e1cb63": "rsVerifyPublic(bytes32,uint256[2],uint256[],uint256[],uint256[],uint256[])", +"f3e1efbf": "validation_inviter(address)", +"f3e238d2": "StrongKek()", +"f3e2aa83": "requestReclaimEther()", +"f3e3c629": "testBalanceOfStartsAtZero()", +"f3e41a99": "addRound()", +"f3e4877c": "distribution(address[],uint256)", +"f3e4cac4": "_getTokenPrice()", +"f3e5c15e": "screenstate()", +"f3e62640": "buyToken(uint256,address,uint256)", +"f3e664c9": "setSaasApiProfitAddress(address)", +"f3e68264": "getSignerOfBalanceHash(address,uint8,uint256,bytes)", +"f3e71756": "checkTickets()", +"f3e84c4c": "FundingClosed()", +"f3e84cf3": "createNewRevision(bytes32,bytes)", +"f3e94596": "LogReferral(address,address,uint256)", +"f3ea1241": "releaseFirst()", +"f3ea4c68": "set_symbol(string)", +"f3eac094": "defaultAuctionPrice()", +"f3eb2445": "SimpleToken(string,string,uint256,address)", +"f3ec3f4a": "whitelistPreSaleAddressMany(address[],bool)", +"f3ecda21": "ITSM()", +"f3ece9f4": "addBlockList(address)", +"f3ed064a": "bonus01End()", +"f3edf112": "changeHelper(address)", +"f3ee6305": "removeCertificationDocument(address,bytes32)", +"f3eeb84b": "lastBlock_f9Hash_uint256()", +"f3eef981": "_init(uint40,uint40)", +"f3f10da7": "Balance(string,uint256,address)", +"f3f11048": "ethAddressPublicKey(bytes32,int256,bytes32,int256)", +"f3f16a15": "voted(address,bool)", +"f3f18615": "verifyTrustedSender(uint256,address,uint256,uint8,bytes32,bytes32)", +"f3f1b5a7": "CongressOwned()", +"f3f1d909": "redeemCoin(uint256,address,bool)", +"f3f1e4ea": "MenglaToken(address)", +"f3f2e656": "setAttributeSigned(address,uint8,bytes32,bytes32,string,bytes,uint256)", +"f3f2f0bc": "beneficiary2()", +"f3f31853": "getPayTable(uint16)", +"f3f43703": "pendingWithdrawals(address)", +"f3f458f8": "cycleCount_()", +"f3f480d9": "challengePeriod()", +"f3f4aef3": "getUserIDAndInviterEarnings()", +"f3f52865": "getPersonalStakeAmounts(address,address)", +"f3f6f0d7": "lastIndex()", +"f3f70674": "oracle_call(uint256)", +"f3f7650d": "fetchOrdersForMerchant(address)", +"f3f79a97": "setDebtIncreasingFactor(uint256)", +"f3f9240b": "investAs(address)", +"f3f969a0": "setRegisteredAuthority(string,address,bool)", +"f3f9c004": "reffalPool()", +"f3fa1e7b": "bulkApproveTransfers(uint256[])", +"f3fa2c37": "getUpdateHash(uint256,uint256,uint256,uint256)", +"f3fac412": "_calcEndTime(uint256)", +"f3fb9a02": "setInfo(uint256,uint256)", +"f3fbabb5": "setDedicatedProxy(address)", +"f3fbfc60": "SFTSEV()", +"f3fc536d": "revokeConfirmation(bytes32)", +"f3fc7fb2": "Ordient()", +"f3fce3b5": "setC4FContractProviderCompleted(address,bool)", +"f3fd826f": "transferFromTokens(address,address,address[],uint256[])", +"f3fde261": "onTransition(bytes32)", +"f3fe12c9": "claim(string)", +"f3fe5bc2": "totalWitdrowedToken()", +"f3fef3a3": "withdraw(address,uint256)", +"f3ff10bf": "UseQuantity(int32)", +"f4009d99": "changeMainStartTime(uint256)", +"f400a3d7": "finishDate()", +"f400d37b": "yesVoteSum()", +"f400fde4": "amount1()", +"f4010db0": "deleteTile(uint16)", +"f4016ac3": "setInitialState(address)", +"f4016b17": "destroyBPESOToken(address,uint256)", +"f4025568": "approveCertificate(uint256)", +"f4029e92": "getMonsterReturn(uint64)", +"f40314f4": "tokenCurrentStage()", +"f4044697": "xrateProviders()", +"f404d1e2": "transferAndCall(address,uint256,bytes,string)", +"f404df8e": "_getExpectedRate(address,address,uint256)", +"f405311b": "Made(address,address,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"f405a275": "EventJoinedBattle(address,uint256)", +"f4064471": "messagePreSignedHashing(bytes8,address,address,uint256,uint256,uint256,uint8)", +"f4071928": "mintAuditApproval(address,address,uint256)", +"f407c81d": "tokenNoByAddress(address)", +"f408ebe9": "dev_reset()", +"f409a609": "internalMintToken(uint256)", +"f409ab66": "getDepositedCount()", +"f409e633": "SetENGDevAddress(address,address)", +"f40a049d": "triple(uint256)", +"f40a9112": "whaleIncreaseLimit()", +"f40c0843": "subscribe(address,uint8,bytes32)", +"f40d71f1": "releaseTokens(address,uint256)", +"f40d8d8f": "updateAllowance()", +"f40e0b6e": "coinsToSell()", +"f40e28f2": "createGen0Auction(uint256,uint256,uint256,uint256,address)", +"f40e8d8b": "retryWinner(uint256)", +"f40ea5cb": "setReservePricing(uint256)", +"f40ebcf3": "setBalanceOfValueFor(address,uint256)", +"f40ef739": "preIcoEndsAt()", +"f41017fc": "finalize(uint24)", +"f410a26b": "receive(address,uint8,uint32[])", +"f410aa39": "_issueByPartition(bytes32,address,address,uint256,bytes,bytes)", +"f4116381": "setFiscal(bytes32)", +"f411fb21": "freezeWithdraw(address,uint256,bool)", +"f41293c7": "getIndexForTeamId(uint32,uint32)", +"f412af91": "getOuvidoriaEndpoint(address)", +"f41377ca": "setFoundationAddress(address)", +"f41440d9": "setCreator(address,address)", +"f414cccb": "removeFreezableAddresses(address[])", +"f4156757": "TeamPoolAddress()", +"f415ed14": "slash(bytes32)", +"f4162530": "nodeFee()", +"f4163340": "isFailed()", +"f416d2cb": "emitTokensSince()", +"f417614a": "validateAndReturnContribution()", +"f418b153": "replaceMarketingToken(uint256,uint256,uint128)", +"f418cf4e": "recordSenderIfNecessary()", +"f4199bb8": "initializeWhitelist(address[])", +"f4199fb7": "ayy()", +"f419c69d": "_createPony(uint256,uint256,uint256,uint256,address)", +"f41a12c8": "_takeOwnership(address,uint256)", +"f41b536e": "getRecipientString()", +"f41bc988": "isPartyA(address)", +"f41bfa9e": "mint(int256,uint256,string)", +"f41c1c93": "setAnswerFee(uint256)", +"f41c639e": "sendMsg()", +"f41d0b0c": "getInfluencer(string)", +"f41d1a82": "partner1_name()", +"f41d97fc": "getPriceOfTokenInLastAuction(address)", +"f41db329": "addAuction(uint40,uint40,uint128,uint40)", +"f41dc25f": "totalWeiLose()", +"f41e3494": "hasFailed(uint256)", +"f41e60c5": "enableTransfers(bool)", +"f41e8fc8": "periodAmount()", +"f41f4b10": "retrieveHouseTake()", +"f41fa999": "TTest()", +"f4201c3c": "isVIP(address)", +"f4206706": "withdrawEthers(uint256)", +"f420977d": "noOfTokenAlocatedForSeedRound()", +"f420c5b1": "getCloneWallets(uint8)", +"f420d9d2": "setNumRewardsAvailableForAddress(address,address)", +"f4217648": "setWhitelist(address[])", +"f421e02b": "testCantFinalizeWithIncorrectCap()", +"f42206d1": "HouseEdgeUpdate(uint256)", +"f422878a": "addressIsStakeDiceGameContract(address)", +"f42355a4": "isSaleInitialized()", +"f4239eec": "affiliatePercent()", +"f4246be4": "addToBundle(bytes32,bytes32)", +"f4250f75": "AgriChainPrevData()", +"f42541be": "promoToonsMinted()", +"f42598f0": "get_mintable()", +"f4268e46": "g17token()", +"f426ceee": "award(bytes32,uint256,address,bool,uint256)", +"f426d8ac": "withinHomeLimit(uint256)", +"f426f03a": "setFrequency(uint256)", +"f427211c": "getTime2(address)", +"f4279d1f": "updateEthUSDOracle()", +"f42a2c42": "removeAssetListing(uint256)", +"f42aa287": "getBlobStore(bytes12)", +"f42ac1de": "minQuorum(uint256)", +"f42b1ae0": "unPauseGame()", +"f42b9999": "icoMinInvest()", +"f42c051e": "submitTokenToEthOrderWHint(uint128,uint128,uint32,int256)", +"f42c0f02": "MARKETING_SHARE()", +"f42c56c2": "cbrt(uint256)", +"f42ca2ee": "sub_32(uint32,uint32)", +"f42d1d30": "creditorAmounts(uint256)", +"f42eb765": "getAgreement(bytes32)", +"f42ef9ec": "emitWithrawalRequestEvent(address,address)", +"f42f0c7d": "lengthOfCommonPrefix32(bytes32,bytes)", +"f430511a": "setMaxAddresses(int32)", +"f43098af": "resetTokenOwnership()", +"f4320f00": "getProjectUnusedTokens()", +"f4325417": "App(address,string,uint256,string)", +"f4325d67": "reserveToken()", +"f43313b6": "assertEq31(bytes31,bytes31,bytes32)", +"f433262f": "updateFromRegistry()", +"f4338e89": "getAllTeamCosts()", +"f433e12e": "marketingTokenWallet()", +"f4347267": "getX(bytes)", +"f434e028": "PreICOProxyBuyer(address,uint256,uint256,uint256)", +"f4351908": "InitialRateChange(uint256,uint256)", +"f4351e15": "addAndMintPlayers(uint128[],bool[],uint256,uint256,uint256)", +"f43532ac": "changeWaveVoteContract(address,string)", +"f435d012": "setUnitJadeStealingIncreases(address,address,uint256,uint256,bool)", +"f435f5a7": "lock(address)", +"f436de14": "setAllowanceValue(uint256)", +"f437019c": "stop_service(uint256)", +"f437bc59": "host()", +"f437d6bc": "objectShield()", +"f4381136": "DeferredPresaleTokenPurchase(address,address,uint256,uint256)", +"f4385912": "getPlayerId(uint256)", +"f4385eaf": "KPISToken()", +"f4387d86": "arbitrateApproveMilestone(uint256)", +"f4395dbc": "bitmcoinToken()", +"f4399f2d": "MDIToken()", +"f43a72b0": "setactive(bool)", +"f43abdf3": "getCrowdsaleUserCap()", +"f43acb52": "checkLottery(uint256)", +"f43b1620": "addUserAuto()", +"f43b4808": "viewPassword(uint256)", +"f43b7a76": "AdmineAdvisorTokens()", +"f43bac53": "poolFeeIncurred(uint256)", +"f43e34b2": "unFreezeAll(address)", +"f43e3918": "MELON()", +"f43e98c7": "refunding()", +"f43f523a": "mod(uint256,uint256)", +"f43fd7e0": "_handleTrainingFailure(uint256,uint256,uint256)", +"f4412803": "currentTotalAirDrop()", +"f44191f0": "getAccessoryByIndex(address,uint256)", +"f441b1c8": "currentAmount()", +"f4424cac": "getNumberOfLogEntries()", +"f44349dd": "angelTokenSupply()", +"f44376a2": "preFixed(address,uint256)", +"f443ea83": "MindHacker()", +"f444c136": "createDklAuction(uint256,address,uint16,uint256)", +"f444ea30": "allowBack()", +"f4451628": "buyHSShop(uint256)", +"f44544b3": "fundPos()", +"f4462d04": "periodicity()", +"f44637ba": "addBurner(address)", +"f4463fb7": "emergencySelfDestruct()", +"f44667a6": "tokensAmount(address,address)", +"f446c1d0": "A()", +"f449619e": "collectPrize(uint256)", +"f449958d": "deliverManagementTokens(address)", +"f449c3cb": "_presaleSupply()", +"f449ffe4": "setPresaleRate(uint256)", +"f44a06b9": "endIcoSaleRound1()", +"f44a6ca9": "addProduct(address)", +"f44b43f8": "approveAmount(uint256,address,uint256)", +"f44b54ca": "functionName1(bytes32)", +"f44b79b3": "withdrawalAll()", +"f44bd811": "TRCERC20(uint256,string,string)", +"f44dc562": "_addKey(address,uint256)", +"f44e1351": "setEpisodeManager(address)", +"f44f13d8": "assert2()", +"f44f8be9": "sendNegReq(uint256,uint256,uint256,string)", +"f44ff712": "blockHeight()", +"f450096f": "updateOraclizeGas(uint256,uint256)", +"f4500eb5": "ETHERCFeeModifiers()", +"f4508082": "_price_token()", +"f4509fc2": "LOCKED_1Y_DATE()", +"f450b574": "_mixer()", +"f450cfee": "disablePrivileged()", +"f450d53a": "allFinalised()", +"f450e5f8": "TOKENS_SOLD_LIMIT()", +"f4510455": "STQPreICO2TestHelper(address,address[])", +"f4514ca6": "buySome(uint256,uint256,uint256,uint256,uint256)", +"f4519035": "betOdd()", +"f452b69c": "getCommandTokens()", +"f452f32d": "getByTo(uint256,uint256)", +"f45346dc": "deposit(address,uint256,address)", +"f45392fb": "getReportingWindowByMarketEndTime(uint256,bool)", +"f453c827": "getAddressField3()", +"f4544255": "refer(address,address)", +"f454c32c": "teamReserveTokensDistributed()", +"f4559619": "newOwnerTemp()", +"f4560403": "Zero()", +"f456106d": "ProdCToken()", +"f4572664": "changeMinimumPurchaseAmount(uint256)", +"f457361a": "paidversion()", +"f457547a": "spreadPercent()", +"f457688d": "can_i_jump()", +"f4577298": "EthGet()", +"f457ee5a": "donation(address)", +"f45811bd": "Voyager()", +"f4586cba": "setVestingRevokeDate(address,address,uint256)", +"f4591074": "finishInvite()", +"f45934b6": "cards_gold_total()", +"f45984fd": "TOKEN_UNIT_RATIO()", +"f459ce60": "btycbuy(uint256)", +"f459eb61": "generateKeccak256(bytes)", +"f459f517": "dividendsPoolAddress()", +"f45a729c": "getEtherValue(uint256)", +"f45b106a": "increaseMonthlyTransactionVolumeReceiving(uint256)", +"f45b4fba": "setPersonalBonus(address,uint256,address,uint256)", +"f45b96a0": "financePeriodsCount()", +"f45c85e5": "currentOwnerFeePercent()", +"f45ce8d7": "setAddressKYC(address,bool)", +"f45dae6e": "parseLoanOfferRates(uint256[7],uint32[4])", +"f45e29bb": "hashCoin()", +"f45e8dc4": "buyWarlordChest(uint256)", +"f45eb5b4": "_generateRandomhashNumber(string)", +"f45ef033": "nextReduceSupply()", +"f45efe88": "stage1Bounty()", +"f45f74f8": "VerityToken()", +"f460473e": "fillArray()", +"f460590b": "updateSigner(address,bool)", +"f460c5e4": "listItem(uint256,uint256,uint8)", +"f460e5d0": "setRamenContract(address)", +"f461847c": "DatGirl()", +"f4619e71": "NokuCustomERC20Service(address)", +"f461db0e": "teamAllocatedTime()", +"f461db4a": "getdoc(uint256)", +"f4623d44": "getStorage(address,uint256,uint256,bytes)", +"f4623e0b": "addBalance(address,address,uint256,uint256)", +"f462671e": "isAuthDisabled(uint256,uint256)", +"f46332e0": "test_claimShare_emptyFeeAndRewardPools()", +"f4635674": "countryOwnersOf()", +"f4637003": "transferChildren(address)", +"f463be37": "setSecondAddressBalance(address)", +"f463edd1": "createDocument(uint256)", +"f464e64e": "premiumPacks(uint256)", +"f464e7db": "sellToken(address,uint256)", +"f4656219": "PRICE_RATE_FOURTH()", +"f4660ff5": "timeVault()", +"f4662f71": "canUnshelf(string,address)", +"f466f106": "addHouseHold(uint256,uint256,uint256)", +"f4674b89": "withdrawByAdmin(address,uint256,address)", +"f4686b42": "GxAdminOperations(address)", +"f468e9b3": "inICO()", +"f469707f": "addToGoldList(address)", +"f46b5321": "calculatePoolAmount(uint256)", +"f46b986a": "secondExtendedBonusSalesEnds()", +"f46bbc09": "thirdStageTokenRate()", +"f46c0f29": "compensate(uint256)", +"f46c50dc": "doFail()", +"f46c858a": "addAdvisor(address)", +"f46d1982": "setup(address,uint256)", +"f46d91f4": "TokenBurn(uint256)", +"f46da084": "createName(string,string,string,string,bytes32)", +"f46de44a": "Etherumchain()", +"f46eccc4": "minters(address)", +"f46f16c2": "MARKET()", +"f46ff44f": "dollarToEtherRatio()", +"f4700d3e": "lpMaxVolume()", +"f4703d26": "numbersCountMax()", +"f47073f4": "setTotalIncomeFeePercent(uint256)", +"f470fd5e": "BLU()", +"f47125f5": "StableICO()", +"f471e626": "disapproveByC(uint256,string)", +"f47279d2": "capRemaining()", +"f47289e1": "_ecDouble(uint256,uint256,uint256)", +"f472d615": "enableIco()", +"f472e136": "fraction(int64,int64)", +"f4734818": "_random(uint256,uint256,uint256,uint256,uint256)", +"f4736429": "changeUnicornRanchAddress(address)", +"f473c484": "BatchDetachAssets(uint256[10])", +"f4749624": "dist_list_set(address[],uint256[])", +"f474b6b2": "aboutWorker(address)", +"f4752806": "convert2PeonyToken(uint256)", +"f4757a49": "HighestBidIncreased(address,uint256)", +"f47599db": "WLMTBounce()", +"f4773d26": "AESSignatum(uint256,string,string)", +"f47760ac": "forceGame(uint256,uint256)", +"f47795f3": "CommonTokensale(address,address,address)", +"f477a6b7": "depositEthers()", +"f477c2b9": "setColdWalletAddress(address)", +"f4784b37": "placeCube(uint256,uint256,uint256,uint256,uint256)", +"f478cef1": "leader_2()", +"f47a6e84": "getReleased()", +"f47aa124": "AutoSplitCurator(address)", +"f47b7740": "information()", +"f47c84c5": "MAX_TOKENS()", +"f47cd133": "AMBASSADOR_FOUR()", +"f47ce310": "getRoomCurrentSet(uint256)", +"f47efbca": "getMemberLinks(address)", +"f47f5921": "exerciseOption(address[3],uint256[3])", +"f4807a4d": "downTickTest(address,uint256)", +"f4812eb9": "tokenIdToPrice(uint256)", +"f4814444": "_withdrawBalance()", +"f481d2d0": "BaseFareCalculator()", +"f4833360": "getTeamInfoByID(uint256)", +"f48339e4": "MintingEnded()", +"f4835aea": "postHardRate()", +"f4838452": "loseWager(address,uint256,uint256,bool,uint256)", +"f484e827": "slashSmallUsername(bytes)", +"f48513ed": "setFundOnContract(bool)", +"f4869726": "buyWithSignedAddress(uint128,uint8,bytes32,bytes32)", +"f487404f": "oldOwner()", +"f487c403": "DataStore(string)", +"f487e4b6": "SendERC20ToAsset(address)", +"f4880b22": "transferStatus()", +"f489faf9": "addAddressToBonuslist(address)", +"f48a3f2b": "PlazaToken(uint256,string,string)", +"f48aa044": "upgradeEthCost(uint256)", +"f48b4391": "SBToken(address,address)", +"f48be22b": "initialiseAllocations()", +"f48c157d": "createGame(string,bytes32[])", +"f48c2afa": "PVCCrowdsale(uint256,address,address)", +"f48c3054": "proxyPayment(address)", +"f48c4633": "disableRefunds()", +"f48d11af": "removeFromVIPList(address[])", +"f48d1c5e": "totalDisposed()", +"f48d371c": "create(uint256,uint256,int256,address,address)", +"f48d60ca": "hasOwner(uint256)", +"f48e20f2": "getCreateFeeWindowUniverseValue()", +"f48e5f27": "infoWithdraw1()", +"f48e9c33": "ETPotatoPresale(address,uint256,uint256)", +"f48edf0c": "partner(address,address)", +"f48f378d": "KuyyomToken()", +"f48f3ced": "HFCoin(string,string)", +"f4903ca0": "newContract(string,address[],string,bytes32,uint256)", +"f4914919": "incrementContinuityNumber(uint32)", +"f4915f5f": "BHM()", +"f4916f05": "VoteSvp002(address,uint256,uint256)", +"f49259b7": "UpgradeableToken(address)", +"f49296ae": "WasHere()", +"f4929cc5": "initPair(address)", +"f492a72f": "signUp(address[],uint256[],string)", +"f493c848": "transferMultiply(address[],uint256[])", +"f49501f3": "soldOnCurrentSale()", +"f4954387": "setHalt(bool)", +"f49627be": "Technology4G()", +"f4970e71": "approveWithdrawal(address,uint256)", +"f49727bd": "getSkillEvaluation(address,uint256,uint256,uint256,address)", +"f497463a": "setVariables(uint256,uint256,uint256,uint256)", +"f49808ea": "addEthForPayment()", +"f4993bbd": "executeEmergencyWithdrawal()", +"f499a349": "NewPrefixPrice(uint256,uint256)", +"f49a5504": "permittedInvestors(address)", +"f49a616c": "updateFeePayoutAddress(address,address)", +"f49a66fd": "_pushLandId(uint256,uint256)", +"f49b728e": "setAllResourceERC20Addresses(address)", +"f49b8e10": "BelezaNetwork()", +"f49bb5a8": "numberPlateExist(address,string)", +"f49bbb23": "getUserClientsCount(address)", +"f49bff7b": "getBounty()", +"f49d1d19": "viewSellOffersAtExchangeMacroansy(address,bool)", +"f49dec70": "buyPepeAffiliated(uint256,address)", +"f49e8135": "calculateTokenBuySimple(uint256)", +"f49eee20": "priceFactorB()", +"f49f0974": "proxyList()", +"f49fc563": "SULTANS()", +"f4a011be": "transferWithReserving(address,uint256)", +"f4a05f8f": "_transferAsset(uint256,address,bool)", +"f4a1585b": "setNextCycle()", +"f4a222e9": "icoRaisedETH()", +"f4a32ef8": "bonusTokensSold()", +"f4a43448": "getEstateSize(uint256)", +"f4a475cb": "t_ImmlaTokenDepository()", +"f4a4b8c7": "OfferUnHold(uint256,bytes,bool,address)", +"f4a67395": "showAddresses()", +"f4a6ef99": "logBytes(bytes32)", +"f4a81d08": "getKudosGiven(address)", +"f4a8619a": "prep(address,uint8)", +"f4a8a699": "_mint_with_uri(address,uint256,string)", +"f4a8cbc0": "tokensToWei(uint256,uint256)", +"f4a92020": "rawApprove(address,bytes32)", +"f4a972de": "softEthTransfer(address,uint256)", +"f4a9c919": "startThinking()", +"f4a9df62": "annul(address)", +"f4aa1291": "withdrawFundsAdvanced(address,uint256,uint256)", +"f4aa956c": "preIcoIsRunning()", +"f4aac034": "charityFraction()", +"f4ab2928": "isContractPaused()", +"f4ab2b19": "releaseAllOldBalanceOf(address[])", +"f4ab4d1d": "_getPetAura(uint256)", +"f4ab9adf": "addVoter(address)", +"f4ac6560": "batchVipWtihLock(address[],uint256[],bool)", +"f4acc2ed": "setContractAdmin(address,bool)", +"f4accda5": "order(uint256,uint256,address)", +"f4ace1a5": "processContribution(address,uint256)", +"f4ad2212": "EthereumEmerald()", +"f4ad8e37": "listings(uint64)", +"f4ae0d2f": "getTechBonus1(uint256)", +"f4ae2164": "EDToken()", +"f4ae67a1": "setTargetDiscountValue9(uint256)", +"f4af9146": "setDefaultTranche(bytes32[])", +"f4afbdca": "assets_explorer_controller()", +"f4b0ce03": "NewIssue(address,uint256,bytes)", +"f4b103d4": "SimpleStorage(uint256)", +"f4b186a7": "setProfitOwner(address)", +"f4b272db": "licenseAttributes(uint256)", +"f4b28747": "CaptainToken()", +"f4b2dfea": "Matching_Finneys()", +"f4b2f5b6": "maxTokenSupplyICO1()", +"f4b43268": "phrase()", +"f4b432b8": "validUser(string)", +"f4b489e7": "upgraded(address)", +"f4b4d77e": "cutOf(uint256)", +"f4b5cbc4": "setCrowdSale(address)", +"f4b74ae9": "updateBestInvestor(address,uint256)", +"f4b79379": "generalRate()", +"f4b86c48": "isMarketplace()", +"f4b95676": "IsReady()", +"f4b96570": "greet_omar(uint256)", +"f4b97c4c": "insertNode(bytes32,bytes32,bytes32)", +"f4b9fa75": "dai()", +"f4ba89f9": "escrow_fee_numerator()", +"f4bbd5d4": "getDealByNumber(uint256)", +"f4bbfd6a": "scheduleCall(bytes,bytes)", +"f4bd0bcf": "isConditionMet()", +"f4bd0eb2": "getSplit(uint256,uint256,uint256,uint256)", +"f4bd65a7": "_updatePhaseTimes()", +"f4bd9429": "unassignOwner(address,address)", +"f4bead6e": "percentageToToteLiquidatorWallet()", +"f4bebac2": "winner_bids()", +"f4bffad6": "bonusForMainICO()", +"f4c06c8e": "removeConfirm(bytes)", +"f4c140b2": "setArtistFees(uint256)", +"f4c28ea3": "lowerLimitForToday()", +"f4c2ebdd": "createLandAndAuction(address,uint256,address,uint256,uint256)", +"f4c38aa1": "initLending(address,uint256,uint256)", +"f4c3b4d7": "transferable(uint256)", +"f4c3f3f7": "fetchAllDataForCustomer(address)", +"f4c52644": "requestRefundDonator()", +"f4c5ab7c": "validateCallGas(uint256,uint256)", +"f4c679db": "Gidnist(address)", +"f4c6f423": "requestWarranty(string,address,uint256,uint256)", +"f4c7f92c": "newRubesUntilPayout()", +"f4c84d19": "update(string,string)", +"f4c91807": "calculateCurrentPrice_(address[7],uint256[7],uint8,uint8,uint8,bytes,bytes,bytes)", +"f4c97199": "updateNextGamePotSplit(uint256)", +"f4c99177": "setBlocksPerPayPeriod(uint256)", +"f4c9b1fd": "campaignState()", +"f4caee88": "isParticipating(address)", +"f4cb09cf": "setAmbassadors(address,bool)", +"f4cb290b": "editMemeInfo(uint256,string,string,string,string)", +"f4cb4ae3": "tokenCreationMaxPrivateSale()", +"f4ccbc4f": "getWithdrawals(address,address)", +"f4ce66e0": "extractUint(bytes,uint256,uint256)", +"f4ce7c1c": "purchaseWithEther(uint256)", +"f4ce7d4a": "ChannelContractAddressChanged(address,address)", +"f4cebdc2": "HeroCore()", +"f4cee3b5": "jasontestToken()", +"f4d0b2a5": "RefundInvestorsBallot(address)", +"f4d0b67f": "SetTime(uint256)", +"f4d176e1": "mapMaster()", +"f4d21515": "submitQuery(uint256)", +"f4d218f9": "lastBlockClaimed()", +"f4d22b02": "transferMoreETH(address,uint256)", +"f4d24fea": "setItem(uint8,uint8,uint256)", +"f4d26fec": "upgradable()", +"f4d28ab0": "Update_START_PREICO_TIMESTAMP(uint256)", +"f4d2cac3": "setBonusSale(uint256)", +"f4d3e94f": "weiRaisedInPresale()", +"f4d44b72": "getBoardsCount()", +"f4d48c0d": "channelParticipant(uint64,uint64)", +"f4d56a51": "isIdValid(bytes16)", +"f4d5d6ce": "seriesBSupply()", +"f4d64745": "HgcToken()", +"f4d76b60": "postValidatePurchase(address,uint256)", +"f4d7b725": "GasPrice()", +"f4d87f8a": "WW3Token()", +"f4d92886": "test_shutDownVersion()", +"f4d94699": "EndowmentRetriever()", +"f4d957a5": "test_validProxyFundTransfer()", +"f4da6a54": "AUTHORSIGHASH()", +"f4da834c": "cancelAuctionToBuy(uint256)", +"f4daa98c": "BitcoinFuture()", +"f4dadc61": "locks(uint256)", +"f4dae266": "total_wei_given()", +"f4dafe71": "update_hash(bytes32)", +"f4db9ad1": "bountyOnlineTokens()", +"f4dba182": "take(uint256,uint256[])", +"f4dbeb9d": "getCredRanksByContents(address,uint256[])", +"f4dc2d21": "Deed(uint256)", +"f4dd0fe9": "ico1Max()", +"f4ddca3c": "shortenBonusPreIco(uint256)", +"f4ddff1c": "_teamID()", +"f4de8dfe": "generateUID(uint256,uint256,uint256,uint32)", +"f4def44b": "getStaff(uint256)", +"f4df1fb2": "themedSpinners(uint256)", +"f4df80ee": "subUserTokens(address,uint256)", +"f4e0f412": "exec(address,uint256)", +"f4e1358a": "transfer_enabled()", +"f4e2d68b": "ltcBalance()", +"f4e340ac": "RedFoo()", +"f4e36afd": "findThroneByNameHash(uint256)", +"f4e3be2d": "getSpawnProxy(uint32)", +"f4e42844": "ResetTransferState()", +"f4e50a4d": "getSupportedTokenByIndex(uint256)", +"f4e62c34": "OrigoToken()", +"f4e68486": "weiICOMinimum()", +"f4e6a70d": "addAnimalType(uint128,uint8)", +"f4e6d3f9": "calculateLockedPercentage(uint8)", +"f4e733c3": "lifeTime()", +"f4e75b79": "OwnershipTransferProposed(address,address)", +"f4e76a46": "getBalanace(bytes32,address)", +"f4e83593": "Volunteertimedollartocken()", +"f4e96093": "IntimateShoppe(uint256,uint256,uint256,address,address,address,address,uint256,uint8)", +"f4e9c944": "PRE_ICO_START_TIME()", +"f4ea7263": "Take_share_team_AES()", +"f4ea77f3": "coinPool()", +"f4ea95b9": "validateReleaseVersion(uint32[3])", +"f4eb20da": "SNC()", +"f4eb6889": "description1()", +"f4ebed78": "currentReward(uint64)", +"f4ec186d": "MoonCoin()", +"f4ec593d": "ICOCrowdsale(uint256,uint256,address,address)", +"f4ed0f46": "editionSize()", +"f4ed216c": "removeExchangePartnerTargetAddress(address)", +"f4ed660f": "testIfElse()", +"f4eda76a": "traitIdxToName(uint256)", +"f4eda996": "extractEntry(address[],uint256[])", +"f4edb15b": "narcosByOwner(address)", +"f4ee82ee": "TOKEN_SECOND_DISCOUNT_MULTIPLIER()", +"f4ee9efe": "mintPartOfEmission(address,uint256,uint256)", +"f4eef932": "deptcheckapproval(string)", +"f4efa24c": "getConsensusDetails(address)", +"f4f0b6e5": "investorDate(address)", +"f4f0dafd": "T0XToken()", +"f4f0fc21": "raiseCap(uint256,uint256)", +"f4f22662": "setPersonalBonus(address,uint8)", +"f4f27042": "open(address,address,uint256)", +"f4f3122e": "startSale(uint256,uint256)", +"f4f3b97c": "updateSubjectMatter(uint256,string)", +"f4f3bdc1": "minus(uint256,uint256)", +"f4f3c8a4": "comment()", +"f4f42246": "percentageCut()", +"f4f4d237": "getById(uint256)", +"f4f572ae": "CMO_Signature()", +"f4f59992": "m_analytics()", +"f4f5b30f": "unitTestGetAvailableReward(uint256,uint256)", +"f4f5e1c1": "SHARE_BOUNTY()", +"f4f61563": "setInviteeCount(address,uint256)", +"f4f6d6fe": "weiMinSale()", +"f4f724b3": "getEmployerJobsByStatus(address,address,uint8)", +"f4f7c6c2": "disagreeWithdraw(uint256)", +"f4f864f0": "STARBITToken(address)", +"f4f87730": "create_token(uint256)", +"f4f94a40": "ownerSetRandomGenerateMethod(uint256)", +"f4f96d29": "smartWallet()", +"f4f98ad5": "commit(uint256)", +"f4f996d5": "WandtChain(uint256,string,uint8,string)", +"f4fa6c1d": "blockheight()", +"f4fa8603": "fabricTokenSafe()", +"f4fab748": "end2Timestamp()", +"f4fb6789": "tknfwdToken()", +"f4fb7d4e": "m_nonEtherController()", +"f4fba1bc": "executeProof(bytes32[],uint256)", +"f4fc3570": "disableController(address)", +"f4fc5d13": "RevealBet(string)", +"f4fd326c": "SuperCarbonCoinToken()", +"f4fde3b6": "sendMoneyOwner()", +"f4feccbb": "LogUserUnRegistered(address)", +"f4ff56f4": "ProposalCloned(uint256,uint256,uint256,string,bytes32)", +"f4ff78bf": "changeMaster(address)", +"f4ffa7a9": "getMountTokenIds(uint256,address)", +"f50059b6": "reconcileDividend(address)", +"f500a0a3": "VeritasToken()", +"f5012d4b": "sendOtherTokens(address,uint256)", +"f5015000": "setMaxCharacters(uint16)", +"f5018d1c": "IronHands2()", +"f501af70": "OpenLongevityPresale()", +"f501d8b8": "transferFromICO(address,uint256)", +"f5023de9": "founder2Wallet()", +"f50249fc": "totalSupplyMax()", +"f502cdc0": "distributeNIM(address[],uint256,uint256)", +"f5037b2a": "addressLength(address,address)", +"f503a994": "leaveTeam(uint256,uint256)", +"f5042801": "setAsRefunded(address,uint256,uint256)", +"f504b089": "memberKeys(uint256)", +"f504e0da": "load_level(uint16)", +"f504efa7": "popHatch()", +"f50522ca": "setNote(uint256,bytes32,string,string)", +"f5059560": "makeProject(string,uint256,uint256)", +"f505a299": "getLLV_edit_32()", +"f505a92d": "reserveFor(address,uint256)", +"f505eb6e": "WolkDestroyed(address,uint256)", +"f505f5f7": "quicksort_core(uint256[],uint256,uint256)", +"f506d7e5": "getCompte_31()", +"f506fc54": "acceptValentineRequest(address)", +"f5074f41": "destroyAndSend(address)", +"f5088730": "copy(uint256,uint256,uint256)", +"f509078f": "isForAuction(uint256)", +"f5093ab4": "UpdateState(uint8,uint8)", +"f509b627": "confirm(address,uint224,uint32,address)", +"f509c554": "PIPSCHAIN()", +"f50a2644": "canCompleteContribution(address)", +"f50aac53": "register(address,string,uint8,string)", +"f50ab247": "StopGame()", +"f50ab7b0": "updateCoupleImageIPFShash(bytes)", +"f50acfa0": "transferToParent(address,address,uint256,uint256,bytes)", +"f50b486d": "getTokenIdsIndex(uint256)", +"f50b5308": "PRICE_MULTIPLIER_ICO1()", +"f50b769e": "lastEditionOf(uint256)", +"f50bab3f": "distributeCRTM(address[],uint256,uint256)", +"f50ca46a": "hasICOFinished()", +"f50d3914": "resetFoundationtList()", +"f50e3ac8": "_getAllInterest()", +"f50ebd21": "OHGLuangPrabang()", +"f50ecf0b": "basicIncomeLimit()", +"f50f1ba9": "_getRevisionTimestamp(bytes32,uint256)", +"f50fc02e": "flipsLost()", +"f510371a": "deleteOperation(bytes32)", +"f510c329": "EmitTransactionDetails(address,uint256,uint256,uint256,string,string,string)", +"f510c32b": "setRateWaiForCentPerToken(uint256)", +"f510ccd3": "CancelAuction()", +"f51119db": "checkAuditor()", +"f5112373": "testFloatArray()", +"f5112f87": "welcomeBonus()", +"f512106a": "testStringKeyValue()", +"f5122232": "LogAccess(address,bytes32,address,bytes4,bool)", +"f513a671": "soldItems()", +"f5143b1c": "HNContract()", +"f514e92c": "TARGET_DURATION_BETTING_BLOCK()", +"f514f0f9": "STAGE_THREE_TIME_END()", +"f5156fba": "CECToken(uint256,string,string)", +"f5166eea": "reservedTokensLockedPeriod()", +"f516e9ec": "ethDeltaDepositAddress()", +"f5173120": "TOKEN_FIFTH_PRICE_RATE()", +"f518e66d": "_addStakeholder(address)", +"f5194ae2": "MainToken()", +"f5195b62": "c_dateTo()", +"f5196002": "getBOPCount()", +"f519618f": "addMultipleTier2Members(address[])", +"f51b793a": "get_appuration(uint8)", +"f51c2907": "affiliatThreshold2()", +"f51c755b": "testConcatMemory33Bytes()", +"f51cbc72": "Level()", +"f51d0c6f": "_awardForRecommender(bool,uint256,uint256)", +"f51d1399": "reduceBalance(address,address,uint256)", +"f51d401f": "getStageStartTime(int256)", +"f51d4cb1": "getCurrentVUPRate()", +"f51d61ff": "Thanatos()", +"f51d7d5f": "getTitle(address)", +"f51dcaa7": "AVGONE()", +"f51e181a": "scale()", +"f51f4738": "setCompleted(bool)", +"f51f5e78": "addPlayer(bytes32,bytes32,bytes6)", +"f51f96dd": "salePrice()", +"f51fb6a1": "leftInTier()", +"f5207c31": "businessPlannedPeriodDuration()", +"f5218ec2": "increaseRepAvailableForExtraBondPayouts(uint256)", +"f522ec0e": "_refundTokens(address)", +"f52343f4": "flipExecutionSwitchTo(bool)", +"f5235a46": "withdrawFoundersTeamAndAdvisors()", +"f5238546": "stopInvest()", +"f5238660": "totalMarketingFundMinted()", +"f524613f": "freeze(address,uint256,uint8)", +"f5251269": "ETHDividends()", +"f5254af8": "startPriceForHLPMT()", +"f5258aee": "ContractAdded(address,uint256)", +"f525cb68": "poolCount()", +"f525dcf1": "setLockFund(address,uint256)", +"f52706c9": "setMinResalePercentage(uint256)", +"f527c856": "TOKENS_PER_KETHER()", +"f527dd6c": "_emitSkillSet(uint256,uint256,uint256,bytes32)", +"f5292748": "_stakeContent(address,bytes32,uint256,uint256,bytes8,uint256,uint256)", +"f5298aca": "burn(address,uint256,uint256)", +"f529d448": "changeBalance(address,uint256)", +"f52a41f3": "mintOWL(address,uint256)", +"f52ad690": "badgeUnFreeze()", +"f52ae24b": "transmute(address,uint256)", +"f52b8d1f": "tokenReserved1Deposit()", +"f52bbc2d": "withdraw(address,address,uint256,uint256,address)", +"f52bd7cb": "addSwap(bytes5,bytes5,bytes32,bytes32,bytes12,bytes32,bytes32,bytes12)", +"f52c456f": "_createClown(uint256,uint256,uint256,uint256,address)", +"f52f2526": "exerciseOption(uint256)", +"f52f77b2": "createEntity(address,address)", +"f52fa89b": "evolveGeneration(uint16)", +"f52ff1da": "SDT(address)", +"f530259e": "isBlacklistDestroyer(address)", +"f5308c7d": "removeTransferLock()", +"f5318389": "setEmbassyCtrl(address)", +"f531aff2": "THINK_TANK_FUND_TOKENS()", +"f531cc63": "LogCreateEVN(address,uint256)", +"f531dbbf": "TOKEN_SWAP_DURATION_HOURS()", +"f5323da4": "phase_5_bonus()", +"f532e888": "getBookForUser(uint256)", +"f5336737": "BFTcoin()", +"f5341b4e": "UserTipped(address,bytes32,uint256,bytes32,bool)", +"f5343752": "exchangeEnabled()", +"f534b022": "burnleftToken()", +"f534d187": "girlBasicToken()", +"f5357102": "tohash(address,address,uint256)", +"f536c61a": "deleteAllChildren()", +"f5370884": "WithdrawalVotedEvent(uint256,address,uint256,uint256)", +"f5376e49": "TestingToken(uint256)", +"f53773dc": "withdrawBattleValue(uint256)", +"f5383f3a": "getFoundationStatus(address)", +"f5385345": "acceptOwnershipOffer()", +"f5397b5d": "initiate(bytes32,address,address,bytes32,uint256,uint256)", +"f53995ff": "setIncludeAuctions(bool)", +"f53a93f8": "MyFinalizableCrowdsale(address)", +"f53b0b3a": "_regularDonationsTotal()", +"f53b396b": "SimpleTokenCoin()", +"f53b8ded": "mintPreSaleTokens(address[],uint256[],uint256[])", +"f53bc835": "setMaxBuy(uint256)", +"f53bde25": "RATE_PRIVATE()", +"f53c5c87": "setTileContract(uint16,uint16,uint8,address)", +"f53d0a8e": "administrator()", +"f53d9d58": "AddLiquidity(uint256)", +"f53da97e": "currentSalePhase()", +"f53f43d9": "setcapname(string)", +"f53fb0cb": "isCollectionAllowedAt(bytes8,bytes8,uint256)", +"f53fbaf6": "send_ETH_from_contract(address)", +"f53fd201": "_modifyPixelColor(uint24,uint32,address)", +"f54011f5": "blockExternalTransfer()", +"f54095a7": "standart()", +"f5414023": "claimReward(bytes32)", +"f5419108": "view46()", +"f541c812": "releaseReward(address,uint256)", +"f543d3c6": "Stockfinex(uint256,string,uint8,string)", +"f544cf4f": "decayedPriceOfCard(uint256)", +"f545118b": "subdividendsOf(address)", +"f54575d6": "addAdvisor(address,uint256)", +"f54580cc": "card_blue_minamount()", +"f5459d6b": "INVESTOR1()", +"f5462105": "isFundedMax()", +"f546232d": "ComputeMyEggs(address)", +"f5465992": "totalTokenBalance(address)", +"f5470d7b": "itemType()", +"f5486860": "nextPrizeTime()", +"f548a578": "removeBurnupGame(address)", +"f549dd0e": "Vitamin()", +"f54a2ddc": "setRefundable(address,uint256)", +"f54b384d": "withdrawBuildingTokens(address)", +"f54cc2d0": "mintTokensForServices()", +"f54d28ae": "OPSPoolAddress()", +"f54d41db": "updateInventories(uint256,uint256[],uint16)", +"f54da8ee": "addWasteType(string)", +"f54dbf4c": "Emission(address,uint256)", +"f54dd191": "Flag()", +"f54dd974": "setResourceERC20Address(uint16,address)", +"f54e3977": "BTML()", +"f54e7a40": "offlineTransaction(address,uint256)", +"f550cb45": "rank(address,uint256)", +"f551924c": "testpidgeon()", +"f5519e8d": "WanChainToken()", +"f55206a5": "validatePurchase(address)", +"f5521bf1": "loanDuration()", +"f5529d3f": "ESIT()", +"f552b2ba": "threads(uint256)", +"f552d91b": "tokenToTokenTransferInput(uint256,uint256,uint256,uint256,address,address)", +"f5537ede": "transferToken(address,address,uint256)", +"f5539407": "getInvestorInforAddr(uint16)", +"f554567f": "getTeller(address)", +"f554e8cc": "officialHold()", +"f554e934": "TOKEN_COMPANY_OWNED()", +"f55523e7": "fiat_contract()", +"f5552b42": "wotDay(uint256)", +"f5556d78": "Vegas()", +"f555b815": "rate2()", +"f5562753": "getClaimAmountForBlock(uint256)", +"f5582870": "CENTS()", +"f559417c": "finalizebackup()", +"f559468c": "initiallyLockedAmount(address)", +"f5596659": "HoloWhitelist()", +"f5597e21": "addProperty(string,string,uint64,uint64,uint64)", +"f55ab987": "penalizeInactiveJuror(address,uint256,uint256[])", +"f55b23c0": "externalLeave()", +"f55b39a3": "PetCore()", +"f55b8fc9": "setraisedAmount(uint256)", +"f55bddcc": "NFTAuctionBase()", +"f55befee": "TOURNAMENT_TOKENS_PERCENT()", +"f55c9f60": "developerReserve()", +"f55ecf06": "setExchangeRate(uint256,uint256)", +"f55f41f9": "Version(string,address,address,address,address,address)", +"f560783d": "getLastProfit()", +"f560aa57": "setTokenPrices(uint256[],uint256[])", +"f560d415": "privateSalePrice()", +"f5610668": "currNumOfCards()", +"f56142b3": "burnPrivate(uint256,uint256,uint256)", +"f561e2f9": "refundTransactionFee(uint256)", +"f5620ed6": "addItemTo(address,uint256,uint256,uint256,string)", +"f562db76": "wct1()", +"f56311d7": "getMntpMigration(uint256)", +"f5632ab4": "receivedEth()", +"f563424e": "fetchBilateral(address,bytes32)", +"f564ae65": "getRemainingCount(uint32)", +"f564bb8c": "getNodeIdx(string)", +"f564dca9": "setUrls(string,string)", +"f564ea7e": "get_bank_data(address)", +"f5653a79": "_presentValue(uint256)", +"f56585de": "transferOtherTokens(address)", +"f56589d5": "PupToken()", +"f56613e4": "lockBetInfo()", +"f5663819": "minContributionETH()", +"f566c1b5": "_normalizeDecimals(uint256,uint256)", +"f5672f92": "garbageCollect()", +"f567a72a": "listMultipleItems(uint256[],uint256[],uint256,address)", +"f568006f": "generateBalanceHash(address,uint8,uint256)", +"f5681f9d": "Deposited(address,address,uint256,uint256)", +"f5685061": "startPreICOnow()", +"f56898fe": "getCompte_40()", +"f5689a80": "TOKEN_CREATED_MIN()", +"f5691b07": "_bidDkl(uint256,uint256)", +"f569626d": "sanTTTCost()", +"f569a2fc": "withdraw1(address)", +"f56a5176": "getMostRecentAuctionStart()", +"f56b8a46": "TEAM_BONUS_PERCENT()", +"f56c66b1": "parseInt128(string)", +"f56d7abe": "PaceCoin()", +"f56e0609": "WorldCup(bytes32,bytes32,bytes32)", +"f56e4cb1": "blockTokens()", +"f56e8421": "currentSquirrelOwner()", +"f56eba15": "SGEToken()", +"f56f516f": "isValid(bytes32[])", +"f5710cc5": "setInitialBalance(uint256)", +"f5716958": "updateSplits(uint256,uint256,uint256,uint256)", +"f571da7f": "confirmAssessor()", +"f5720769": "setDrawer(address)", +"f57213d8": "subsafe(uint256,uint256)", +"f57271cd": "LogEnded(bool)", +"f5727f5c": "chainLedger()", +"f572ae2e": "toggleInPlayJoining()", +"f573864f": "PrandexBountyToken()", +"f5738bcd": "setInstructions(string)", +"f5743c4c": "incrementNonce(address)", +"f574c691": "KCoinToken()", +"f5751524": "unfixTokenPriceInWei()", +"f575c810": "finishPrivateSaleAndStartPreSale(address,uint256,uint256,uint256)", +"f57688b6": "communityVesting4Years()", +"f576f722": "getCurrentTierInfo()", +"f577990d": "passoverEndTime()", +"f577a5d0": "publicTokens()", +"f578fd7c": "applyForToken()", +"f578fd85": "assertEq0(bytes,bytes)", +"f57a1ccc": "f4(uint256,uint256)", +"f57ac2df": "World2()", +"f57ad503": "resetRole(address)", +"f57ad6ea": "deposit_token(uint256)", +"f57ae7b9": "buildId2(address,address,address,uint256,bytes)", +"f57be85d": "ownerActivateToken()", +"f57d74d8": "blaze()", +"f57d76d5": "RestrictedShares(string,string,uint256,uint256)", +"f57db6e1": "signLoan(address)", +"f57e2368": "bonusAvailable()", +"f57e63e2": "eventEnded()", +"f57ee77b": "getRoundId()", +"f57fc26a": "lccxTeamTokensVesting()", +"f5804c35": "test_someTest()", +"f5811447": "createAuction()", +"f5812687": "distributeTokenFunds(address,address,uint256)", +"f5813085": "getTotalTokensByAddress(address)", +"f5818d94": "EtherModifierPandee()", +"f581ec95": "FIRST_VOLUME_EXTRA_BONUS()", +"f581f1ef": "setPicopsCertifier(address)", +"f5820ac6": "unPauseAllTransactions()", +"f5823b0b": "parseOrder(bytes,address,address)", +"f582d293": "buyEnabled()", +"f582fe70": "PundiXToken()", +"f58339c1": "_generateGuardianSale(uint256,uint256,uint256,uint256,uint256)", +"f5836761": "DGBLY()", +"f58431fd": "Citizen(address)", +"f584bf09": "Softcap()", +"f58589ff": "setAirdrop(uint256,uint256,uint256,uint256,uint256)", +"f58590e9": "ReturnChametz(address,uint256,uint256)", +"f5866066": "setStringValue(bytes32,string)", +"f5868e49": "Administrable(address)", +"f586c6d9": "getPoolAddress()", +"f586df65": "checkMembership(bytes32,bytes32,uint64,bytes)", +"f5877bdb": "maintaining()", +"f5878d40": "maxSCount()", +"f587c53f": "_generateGene(uint64,uint64,uint256,uint256)", +"f58951d1": "approve_reject_deleteCertificate(uint256)", +"f589cbbe": "addPick(uint256)", +"f58a1adb": "setup(uint256,uint256,uint256,address,uint256,uint256,bytes,address,address)", +"f58a535f": "phasePublicSale2_From()", +"f58adfe5": "CharityReservesSupply()", +"f58b4554": "userPayout()", +"f58bb0c9": "dealInitialCards()", +"f58c251c": "sentinel()", +"f58d3321": "usersCanUnFreeze(bool)", +"f58e2327": "foundationTokenHolder()", +"f58edbca": "ISBParentsCoin()", +"f58fc2f2": "LimorToken()", +"f58fef8e": "Destroy()", +"f590aacc": "preBuy()", +"f5923a6e": "withdrawEth(address,address,uint256)", +"f5933f66": "changeFlagArraySize(uint256)", +"f5938baf": "getRemainingBlocks()", +"f593efec": "briqcoin()", +"f594ba7b": "assignManagement(address)", +"f594f13f": "votedFor(address)", +"f595f1cc": "pendingFees(address,uint256)", +"f5963aa5": "isJson(string)", +"f5965d55": "windowOf(uint256)", +"f5967a2f": "holdPeriod()", +"f596d10a": "parseSignature(bytes)", +"f597a499": "UserDatabase(uint256)", +"f597d097": "streamerContractMaxAmount()", +"f597f97d": "fractionalBits(int256)", +"f59823cf": "Congress(uint256,uint256,int256)", +"f598e201": "finishDividend()", +"f5991a05": "sellCoins()", +"f59ae82c": "getTokenPurchase(address)", +"f59da238": "MBDCToken(uint256,string,string,uint8)", +"f59db647": "precommitmentAdjusted()", +"f59dfdfb": "feed(uint256)", +"f59e0894": "sendSecond(address,uint256)", +"f59e38b7": "balanceOfToken(address,address)", +"f59e754c": "setAuctionFee(uint256)", +"f59ed863": "privateSaleDate()", +"f59f5e65": "createWheelBetHash(uint256,uint256,uint256)", +"f59f99ee": "createNextGeneration()", +"f59faf9e": "GrainToken()", +"f5a0ea6c": "createMatch(uint256,uint256)", +"f5a1c96d": "nextFeesPerMillion()", +"f5a1f5b4": "setNewOwner(address)", +"f5a23083": "listMOT()", +"f5a23af0": "myColorIs()", +"f5a2d3c7": "DomainSale(address)", +"f5a30cee": "individualMaxCap()", +"f5a332f6": "endICO(uint256)", +"f5a486f3": "issueResolved(bytes32,string)", +"f5a5438e": "dist_airdrop(address,uint256)", +"f5a647aa": "sendTokensToSevenAddresses(address,address,address,address,address,address,address,uint256)", +"f5a79767": "getAmount(address)", +"f5a7ffeb": "dontPanic()", +"f5a8ea09": "viewClaimedThisPool()", +"f5a908f0": "getOraclePrice(string)", +"f5a91ef7": "getEmailAddressOwner(string)", +"f5a956d8": "swap(uint256[],uint256,uint256)", +"f5a98558": "restrictionRemoved()", +"f5a9e21f": "canUpdateCompanyPreferences(string,address)", +"f5aa0200": "makeClaim()", +"f5aa19b7": "reclaimUnclaimed()", +"f5aab219": "currentIcoRate()", +"f5ab16cc": "rewardTokens(address)", +"f5ab4c62": "participationEndTimestamp()", +"f5ab69c8": "thirdPlacePot()", +"f5ab865a": "tokensAirdrop()", +"f5ac0b6b": "BasketFactory(address,address,uint256)", +"f5ac481d": "leaveTeam(uint256,address,uint256,uint256)", +"f5ac6319": "_raised()", +"f5ac9db6": "tradeable()", +"f5ad9034": "TokenTranchePricing(uint256[])", +"f5adad57": "BdpControllerHelper(bytes8)", +"f5aec88c": "getUserTokenBalance(address)", +"f5af374b": "withdrawEth(address,uint256[],uint256[])", +"f5af4035": "sellTokensForEth(address,uint256)", +"f5af6289": "EAI_TokenERC20(uint256,string,string)", +"f5af6621": "getEscapeRequest(uint32)", +"f5af6de6": "firstStageEnd()", +"f5affc60": "claimHash(bytes32)", +"f5b01fd7": "TruCrowdSale(uint256,uint256,address,address,uint256,uint256)", +"f5b0f72d": "Ethername()", +"f5b12540": "STATE_NOT_STARTED()", +"f5b33d0a": "MicroDex()", +"f5b3beba": "OverAllPerSell()", +"f5b41aaa": "set_iconiq_token_amount(address,uint256)", +"f5b45714": "currentKing()", +"f5b490d5": "roundLockAmount()", +"f5b4f3c1": "WFC(string,string,uint8,uint256)", +"f5b53e17": "getInt256()", +"f5b53fc1": "checkMonsterAttack(uint16,uint8,uint8)", +"f5b56c56": "highestBindingBid()", +"f5b57a8d": "transferFeeDenum()", +"f5b5af16": "closePlayerGame(bytes32)", +"f5b5bfb9": "provideDividend(uint256)", +"f5b61230": "escapeHatchDestination()", +"f5b85ad8": "RoundToken()", +"f5b944eb": "ROLE_MANAGER()", +"f5b9644c": "PRE_ICO_RATE()", +"f5babff2": "convertBytesToBytes32(bytes)", +"f5bade66": "setDeposit(uint256)", +"f5bae6b6": "equal(int256,int256,string)", +"f5bb02b2": "ICODepositContract()", +"f5bb5aac": "TokenStore(uint256,address)", +"f5bbc6d5": "isArbiter(address)", +"f5bd48c4": "totalLotsByAddress(address)", +"f5bd4931": "transferFlower(address,uint256)", +"f5bd8f5f": "_isTrue(address)", +"f5bdeca1": "SetGasLimit(uint256)", +"f5be3193": "totalIssued()", +"f5bea782": "userWithdrawPendingTransactions()", +"f5bee4e6": "priceTokenToCoin()", +"f5bf6d63": "totalIssuerSupply()", +"f5bf7413": "close(address,address,uint256)", +"f5bf7e3d": "registerDINs(address,uint256)", +"f5c15237": "isPlatformManager(address)", +"f5c217da": "lastSaleTimestamp()", +"f5c233f1": "transferAndLock(address,uint256,uint256,uint256)", +"f5c256ca": "sendPrepaidERC20Tweet(uint256,string,string,uint256)", +"f5c3f206": "setApprovers(string,string,address[])", +"f5c4201f": "denyTransfer(address)", +"f5c454ca": "ProjectDescriptionUpdated(address,string,bytes32)", +"f5c476f9": "totalLockedTokens()", +"f5c4ceda": "SimpleConstructorArray(uint256[3],uint256[3])", +"f5c57382": "nameOf(address)", +"f5c5906e": "setBlockRoot(uint256,uint256,bytes32)", +"f5c5ad83": "decrementCounter()", +"f5c60309": "YuChainToken()", +"f5c6ca08": "sendTokens(uint256)", +"f5c6cd0a": "GlobexSciICO()", +"f5c6cf05": "changeTokenForSale(uint256)", +"f5c758c4": "getKycApproved(uint256)", +"f5c86d2a": "ledgerTransfer(address,address,uint256)", +"f5c87d20": "setAdminPayout(uint8)", +"f5c89f83": "StartMiningByIdArray(uint256[])", +"f5c8d71b": "forceMove(address,address,uint256)", +"f5c901db": "ck()", +"f5c91f5a": "init(address,uint256,uint256,uint256,uint256,uint256)", +"f5c972ac": "setUserInfo(address,uint256,uint256)", +"f5c98aff": "GreeterB(bytes)", +"f5c99ae9": "createToken(string,string,uint256,uint256,uint256,uint256)", +"f5c9d5f1": "refundPart(address)", +"f5ca6cd4": "TOKEN_SALE_ALLOCATION()", +"f5caccad": "gatherCollateral()", +"f5cb0daa": "queryWaitingTimeBuffer()", +"f5cb3dff": "getAddressFromData(bytes)", +"f5cb911d": "divideByNumber(uint256)", +"f5cbf6cc": "construtor(uint256)", +"f5cc4056": "BSMinting()", +"f5cce54d": "preSaleCoinCap()", +"f5ce0d5b": "onRemoval(string,uint256)", +"f5cf673b": "setClaimer(address,address)", +"f5d00ccf": "NewPatent(bytes32)", +"f5d05f7e": "foundationVestedPayment()", +"f5d09857": "createDungeon(uint256,uint256,uint256,uint256,uint256,address)", +"f5d09ff7": "bancorETHToken()", +"f5d17f10": "get_term_deposit_end_date()", +"f5d1d299": "setProviderTitle(bytes32)", +"f5d241d3": "update(uint80,address,uint32,uint32,uint32,uint256)", +"f5d36a57": "quorumVersion()", +"f5d3c79a": "setReinvest(bool)", +"f5d50f86": "balanceAsSupporter()", +"f5d5edc4": "deployService(bytes32,address)", +"f5d60a51": "accessPolicy()", +"f5d60acd": "EtherTakeAfterSoftcap()", +"f5d67a20": "currentCrowdsale()", +"f5d6fa14": "whichPrice(uint256)", +"f5d72a28": "setTakeRewardsPeriod(uint256)", +"f5d73261": "transferAnyTokens(address,uint256)", +"f5d78625": "getPersonalInfo(address)", +"f5d82b6b": "add(address,uint256)", +"f5d9356e": "newKrakenPriceTicker(string)", +"f5d97789": "changeBinaryAddress(address)", +"f5d9d3fd": "formated_data_url()", +"f5da16e9": "RECHToken()", +"f5da210c": "getClientData(address)", +"f5dabc58": "transferDistributePxl(address,uint256,bool,string)", +"f5db370f": "setSanityRates(address[],uint256[])", +"f5db8bc7": "depositedETH(address)", +"f5db9820": "firstTarget()", +"f5dd7650": "_computeTournamentBeneficiaryFee(uint256)", +"f5ddff92": "getReputationUpdateLogEntry(uint256)", +"f5df1d10": "getCollectibleTypeBalance(address,uint256,uint256)", +"f5df1f1d": "PresalePool(uint256,uint256,uint256,address[])", +"f5df6618": "newUser(string,string,string)", +"f5e1713e": "sale_state()", +"f5e27f5f": "emperor()", +"f5e3394f": "getUnicornGenByte(uint256,uint256,bytes1)", +"f5e33a9d": "createPot(string)", +"f5e3542b": "lookup()", +"f5e37d57": "_doTradeForEth(address,uint256,address,uint256)", +"f5e47f96": "getTicketsByAddress(address)", +"f5e493aa": "getCrowdsaleTierList(address,bytes32)", +"f5e53f2b": "register(bytes7)", +"f5e736ed": "tacoPoolTotal()", +"f5e7b8e3": "setScoringThreshold(uint256)", +"f5e7ce99": "canPerform(address,address,bytes4)", +"f5e7ef7a": "getCountCities()", +"f5e82554": "executeFill(address,address[5],uint256[8],uint256,uint8,bytes32,bytes32)", +"f5e8e8a9": "NASRToken()", +"f5e998f7": "FuckCoin()", +"f5ea15d3": "setContracts(address[16])", +"f5ea25f0": "setTokenAcceptanceRate(address,uint256)", +"f5eacece": "create2()", +"f5eb2313": "UrlHint()", +"f5eb42d1": "ExecLog(address,bytes32,uint256,bytes32,bytes32,uint256)", +"f5eb8890": "balanceUser(address)", +"f5ec2eed": "companyName()", +"f5ec8685": "claimAfter45days()", +"f5ece00a": "cryptoChallenge()", +"f5edc92f": "subwooferUSBToken()", +"f5ee3348": "setLive(bool)", +"f5eeaea3": "openChannel(address,uint256,uint8)", +"f5eed98d": "publisherCount()", +"f5ef98ea": "setDeathBlock(uint256)", +"f5efbd2d": "addModule(address,bytes,uint256,uint256)", +"f5f06acc": "airDropTokens()", +"f5f0f1e9": "firstBuyPrice()", +"f5f23b52": "makeTradable(uint8)", +"f5f2669b": "isAddressNotEmpty(address)", +"f5f2b62f": "nextSale()", +"f5f2de34": "ethReceived()", +"f5f3e58f": "preSale1()", +"f5f4123f": "_createAvatar(address,string,uint256)", +"f5f56b7a": "seasonRefAccounts(uint16)", +"f5f5ba72": "getContractName()", +"f5f5bb3b": "hashBid(address,uint256,address,bytes32,bytes32,uint256,uint256)", +"f5f5c622": "setDErc20(bytes32,address)", +"f5f5f123": "changeMaximumContributionForPublicPhase(uint256)", +"f5f6ea26": "EthOne()", +"f5f83a61": "transferManyLandToEstate(int256[],int256[],uint256)", +"f5fb17f2": "offerPieceForSaleByAddress(address,uint256)", +"f5fb1b74": "buyname(string)", +"f5fb22ca": "claimMobsterFunds()", +"f5fb9137": "donate_step()", +"f5fc20c6": "canUse(uint256)", +"f5fc32c8": "getAllot(bytes32,uint8)", +"f5fc3d47": "giftToken(address,address,uint256)", +"f5fc58c4": "totalLosts()", +"f5fd118e": "coordinatorSetAgreeForEmission(uint256)", +"f5fd1936": "countZTKChecks()", +"f5fd2108": "ethToBeDistributedSet()", +"f5fd9343": "Reco()", +"f5fda5da": "test_35_assertGasUsage1400Boards()", +"f5fda8cd": "testPublic()", +"f5ff3dc7": "setOraclizeWinnerTimeOffset(uint8)", +"f5ff5c76": "agent()", +"f5ff8977": "renameArtwork(uint256,string)", +"f60203c6": "createUser(uint256,uint64,uint64)", +"f602467e": "FundWithdrawal(address,uint256,bool)", +"f602c312": "erc20Store()", +"f602e325": "reserveAdress()", +"f6030aeb": "mint(address,uint256,int256)", +"f60381a1": "stra2cbor(string[])", +"f603fa92": "toggleAttachedEnforement(bool)", +"f60436cd": "reduceTime()", +"f604498a": "getClientSupply(address,uint256,uint256)", +"f604620a": "getTicketsAtAdress(address)", +"f604e6a6": "withdrawXNK(address)", +"f6054027": "IFLTSidechain()", +"f605ef93": "LongBought(address[2],uint256[5],uint8,bytes32[3],uint256)", +"f606b648": "transferTokensFromSpecialAddress(address,address,uint256)", +"f60744d5": "verifySignature(bytes32,uint256,uint256,uint8,bytes32,bytes32)", +"f607e88a": "_tokenPurchase()", +"f6089e12": "melt(uint256[],uint256[])", +"f60957c0": "HowLongIsDisputeStillRunning(uint256)", +"f609a1a1": "extraMintArray(address[])", +"f609bad6": "newDaoRulesProposal(uint256,uint256,uint256,uint256,uint256,bool,address,uint256)", +"f609bf42": "getSecondsTimeLocked(bytes4)", +"f60a696d": "migrateUsers(address[10])", +"f60b0714": "EscrowContract(address,address,uint256,uint256)", +"f60b9406": "vestingStartUnixTimestamp()", +"f60ba338": "setOpenTime(uint256)", +"f60bb720": "receiveFees()", +"f60ca60d": "project()", +"f60ca6b6": "distory()", +"f60cdcf6": "totalPlayers()", +"f60daa71": "dutchAuctionToCraft()", +"f60e28f7": "checkUserAndInitIfNecessary(address,address)", +"f60edb0e": "proposedController()", +"f60f1ccb": "useregister(address,string)", +"f60f49bb": "PayToken()", +"f6105254": "CryptoSagaArenaVer1(address,address,address,address,address,address,uint32,uint256,uint32,uint256,bool)", +"f610e52a": "acceptInvite(bytes)", +"f612a62d": "getSaleContractIsFinalised(address)", +"f613f7a0": "mintUsingSignature(uint256,uint8,bytes32,bytes32)", +"f6142990": "altDeposited(address)", +"f614fd72": "assertEq24(bytes24,bytes24)", +"f6150d17": "payedAmount()", +"f6151ff6": "transferTokenTo()", +"f6153ccd": "totalDeposit()", +"f615e369": "selectDeliverer(uint256)", +"f615ed54": "subSeconds(uint256,uint256)", +"f616b7b7": "report(string)", +"f616ce3c": "candy()", +"f616f29f": "transferEthFeeAndRefund(uint256,uint256,uint256,address)", +"f6174b90": "transferCheques(address,address,uint256,uint256)", +"f617642b": "getlevellen(uint256)", +"f617a0e9": "BoSenCoin_Test(uint256,string,uint8,string)", +"f6187006": "crowdSaleIsRunning()", +"f618c39f": "PartiallyForgived(address,address,uint256)", +"f619304a": "getSellOrdersBlackMarket()", +"f61a3e2b": "roundWithdraw(uint256)", +"f61a7f6f": "fixSaleCompleted()", +"f61ac3a4": "checkForReceivedTokens()", +"f61adfdd": "UnitedfansToken(address)", +"f61b7483": "M5Logic()", +"f61b9aed": "transferFrom(address,address,uint256,bool,uint256)", +"f61c266b": "getExpiry()", +"f61c6c4b": "LobsterFarm()", +"f61ca773": "transferWithPurpose(address,uint256,bytes)", +"f61ca87a": "setUserValue(bytes20,uint256,uint256)", +"f61cd7de": "callerTokenAmountAtBlock(uint256)", +"f61d9afc": "Errors()", +"f61eab7a": "getExtension(uint256)", +"f61ed985": "Kill(uint256)", +"f61f019d": "GitBitToken()", +"f61f35dd": "FOG()", +"f61f54c2": "SendEtherToFund(uint256)", +"f61ff377": "AccountFilledWithBonus(address,uint256,int256)", +"f6205042": "storeClaimSeed()", +"f622a105": "createDApp(bytes32,uint32)", +"f622cc82": "declareWinningOutcome(uint8)", +"f6232556": "Security_GetNumberOfAttemptsToConnectBankAccountToANewOwnerAddress()", +"f6233016": "DomenoToken()", +"f623d7a7": "TrustlessTransactions_Log(uint256)", +"f625ca7d": "lengthOf_addressAndDataPattern_to_voteRulesHash(address,address)", +"f625ee28": "startMasterCopyCountdown(address)", +"f625f472": "MultiownedControlled(address[],uint256,address)", +"f6261a0f": "_isValidWithdrawLimits(uint256,uint256,uint256)", +"f62732b8": "index(address,address[])", +"f627fe6c": "returnSomething()", +"f6281a9b": "getTierWhitelist(uint256)", +"f62847f4": "TerrionFund()", +"f6288422": "commission_system()", +"f628e8e8": "startDonations()", +"f62a92fa": "testRevertTx()", +"f62bc2dc": "ICTA()", +"f62cce34": "_clearRecordHierarchy(uint256,bytes32[],bytes32)", +"f62cec27": "setStartPreICO(uint256)", +"f62de0c3": "weiPerUSD()", +"f62e037c": "BETTING_CLOSES()", +"f62eded9": "buyStar(uint256,uint256)", +"f62ee1af": "burnFrom(address,uint32)", +"f62eec09": "rejectLastDeliverable(bytes32)", +"f62f47ab": "UDF_PORTION()", +"f62f9dbb": "tokenRatios(uint256)", +"f63051ff": "FXTOKEN(address,uint256)", +"f630a468": "setAtomIsRent(uint256,uint128)", +"f630e0f5": "submitTransaction(address,uint256,bytes,bytes,bytes,uint256)", +"f6310813": "transferDoc(uint256,address,address)", +"f631345b": "setlargeBonusStopTime(uint256)", +"f6326fb3": "depositETH()", +"f633adc1": "getRegister(int256,string)", +"f6340be4": "updateProvision(address,uint32,uint256,uint256)", +"f634bd29": "sec_addr()", +"f635052f": "colorPrice()", +"f635d160": "setPOOL_edit_20(string)", +"f635f50c": "minedTokenStartTime()", +"f6360d37": "requestDiploma(uint256)", +"f6366b9f": "OwnerTokensAllocated(uint256)", +"f6368f8a": "transfer(address,uint256,bytes,string)", +"f636931e": "PineapplePoints()", +"f6373296": "applySettings(uint256,uint256,uint256,uint256)", +"f637b7da": "collectedWei()", +"f637d950": "getAssetInfo(uint256)", +"f63841e4": "featurePrice()", +"f6384cb8": "sendReferallFundBalance(address,uint256)", +"f63850d0": "GanaTokenPublicSale(address,address,address,uint256,uint256)", +"f639365d": "testSetGet()", +"f63a43c0": "TokensPurchased(address,uint16,uint256,uint256,uint256,uint256,uint256)", +"f63a5d22": "divideDecimalRoundPrecise(uint256,uint256)", +"f63b1f7c": "GoldenLightCoin(uint256,string,uint8,string)", +"f63c2659": "PriceCalculator(uint256)", +"f63c533c": "Cost()", +"f63c5532": "incrementStat(uint256,uint256)", +"f63cb8a3": "requireTokenFuel(address[])", +"f63da25b": "Emailer()", +"f63df2e9": "createStandardToken(address,uint256)", +"f63ef744": "sendCharityETH(bytes)", +"f63f0e62": "turnOffCanUpdateNextGameInitalMinBetSize()", +"f640b81e": "test_oneInvalidEqBytes32Message()", +"f640d508": "transferToken(address,uint256,address)", +"f6413e46": "getFaucetAmountValue()", +"f6418b0b": "buyLandForEth()", +"f641d753": "changeElementName(uint256,string)", +"f6420e15": "tc()", +"f6432b8c": "publishLawyersInAttendance(string)", +"f6436a7c": "BONUS_ICO_PERIOD_TWO()", +"f643cf3d": "NEToken(address,uint256,uint256,uint256)", +"f64402c4": "setVicepresidenteDeMesa(bytes32)", +"f6444bcc": "isDeploying()", +"f6446614": "withDrawToPoolOwner(uint256)", +"f6448391": "getAllERC20(uint256)", +"f644c926": "SarmayehaaToken()", +"f6454620": "add_certifications(string,string)", +"f645496e": "giveawayFee()", +"f645835b": "beneficiaryAddresses(address)", +"f6458c6a": "toZ1(uint256[3],uint256)", +"f6460964": "teamKeepingPerEpoch()", +"f64623f1": "getBalanceB(bytes)", +"f646286b": "getPlayerShipOwnerById(uint64)", +"f6469342": "_setPackedBlockNumber(bytes32,uint256)", +"f64820f9": "addAttendant(string)", +"f6486cad": "burnReserveFees(address)", +"f6487e4e": "rejectCampaign(address,string)", +"f648f20b": "agencyWallet()", +"f64ab21a": "getOnMintAmountValue(int256)", +"f64b5c16": "distDay()", +"f64bfaba": "getBuyers()", +"f64c08b1": "onThrone()", +"f64ccca6": "payToken(address,address,uint256,uint256)", +"f64cd26b": "gcmp(uint256,uint256)", +"f64e167e": "getTextCount()", +"f64efacb": "icoHardCapInWei()", +"f64fca2e": "getNodeId(bytes)", +"f64fe563": "asyncSend(address,uint256,uint256)", +"f64ffde4": "getAccountPendingValue(address)", +"f6503662": "safeApprove(address,uint256,uint256)", +"f65045df": "totalClosedBID()", +"f6508be6": "tokensPerWei(uint256)", +"f651bf44": "move_to(uint16)", +"f652076b": "_getTokensAmount(uint256,uint256)", +"f652badb": "bitSSAToken()", +"f653279c": "TOKENS_FOUNDERS()", +"f653d286": "toggleTokenSaleOnHold()", +"f6560449": "evaluateProposalMetricEnd(uint256)", +"f65625ae": "changeWinnerPrizeMoneyForRaz(uint256,uint256)", +"f6577774": "BonusCrowdsaleImpl(uint256,uint256,uint256,address)", +"f6585116": "bytesFunc(bytes)", +"f658b1d5": "calculateContribution(uint256)", +"f659a45f": "airdropTokens(address,uint256)", +"f65bed0d": "initNewGame(uint8[16])", +"f65bffc3": "checkDividend(address)", +"f65c4d42": "Participate(uint256)", +"f65d1488": "setMarketingProfitAddress(address)", +"f65d226f": "getTotalBetAmount(bytes32,bytes32)", +"f65d6d4f": "MAX_MINT_NUMBER()", +"f65e2761": "RandomNumberGuessed(uint256,address)", +"f65e8d4d": "potMembers()", +"f65f5eeb": "choose(bytes32,bool)", +"f6618bab": "getBuyRequestsLength()", +"f661b886": "testCanTransfer()", +"f661e767": "villainIndexToApproved(uint256)", +"f6621121": "setSlammerTime(address)", +"f6623552": "getWalletBonuses(address)", +"f6626856": "LTT()", +"f662a12a": "oraclize_randomDS_proofVerify__returnCode(bytes32,string,bytes)", +"f662b881": "commitmentOf(address)", +"f662f291": "getInit(address,address)", +"f66302a2": "releaseMe(uint256)", +"f6631c64": "PPBC_Ether_Claim()", +"f6644c5a": "STARTING_FAIRY()", +"f6648d4c": "publishMixerType(bytes32)", +"f66597c2": "listTrophy(uint256,uint256,uint256,uint256)", +"f665a541": "coinsAdded(address)", +"f6660246": "fundOrderInternal(address,uint256)", +"f666323e": "UUIDProvider()", +"f669052a": "maxTokensToMint()", +"f66a79a0": "secondaryWallet()", +"f66afcac": "isTheAO(address,address,address)", +"f66b48da": "getHorseData(uint256)", +"f66bf229": "minBuyAmount()", +"f66c3af1": "getAddTokenApproveSignatures()", +"f66c6691": "shortTimeLock()", +"f66c75e5": "refund(bytes20,address)", +"f66cce0e": "adjustKPIs(uint256,uint256)", +"f66d0076": "getNumberOfCE()", +"f66d1f65": "releaseToEarlyInvestors(address,uint256)", +"f66d278e": "AgriChainDescriptionInt()", +"f66d685a": "lockInsolventTransfers()", +"f66e86bb": "withdrawGasPayback()", +"f66f0bd9": "MingYuanToken(uint256,string,uint8,string)", +"f66f2449": "THANKSTEST4()", +"f66f640e": "pregnantZodiacs()", +"f66f83f6": "latestSeriesForUser()", +"f67028be": "trade(uint256,uint256,bool,bool)", +"f67187ac": "lookup(string)", +"f671cae4": "setIcoThirdWeekRate(uint256)", +"f671f5b3": "deleteEntireGlofile()", +"f6724a55": "totalAmountInvested()", +"f6729bf2": "canChangeLocked()", +"f672c1aa": "totalBountyCount()", +"f672e4d8": "changeAdminUser(address)", +"f6731d62": "intCallWithArray(int256,uint8[4])", +"f673745a": "edoPerWei_()", +"f674cfe5": "VOLUME_60()", +"f674d799": "removeManyFromWhitelist(address[])", +"f67501f7": "changePet(uint256,uint256,uint256,uint256)", +"f6757cff": "getEmployeeInfo(uint256)", +"f6761151": "Withdraw(address)", +"f676d539": "get_dati_lotto(bytes)", +"f6774660": "calculateNumDIDToIssue(uint256,uint256)", +"f677cf0d": "isDistributed()", +"f678142a": "ethLandSaleOpen()", +"f6783518": "KYCToken()", +"f678462f": "termsAndConditions()", +"f6785de7": "newPayOutPercentageIsSet(uint256)", +"f678cf02": "setRelation(uint8,address)", +"f6791858": "tgeStartTime()", +"f679791d": "playerRoll(uint256,uint256,address)", +"f67a1d37": "BlockChainChallenge()", +"f67a7782": "periodOne()", +"f67a81ea": "Bigba()", +"f67abd87": "entryDetails(uint256)", +"f67b3047": "setItemActive(address,address,string,bool)", +"f67d5a8d": "sendDividendsWithRefBonus(address,uint256,uint256)", +"f67e3d0d": "howManyShips()", +"f67e8db2": "getEthToTokenOrderList()", +"f67f83a8": "updateFileds(uint256,uint256)", +"f67ff0af": "_llTransferFrom(address,address,address,uint256)", +"f68009b9": "getRoundBetAmount(uint256,uint256,uint256)", +"f68016b7": "gasLimit()", +"f68036f0": "FaucetManager()", +"f6805019": "addMeeting(string,uint256,uint256,uint256,uint256,uint256)", +"f6806074": "withdrawBonds(uint256)", +"f680b106": "RateEth()", +"f6814165": "castToInt(uint256)", +"f681f6e7": "capitalRaised()", +"f68297f3": "emergy_withdraw(address)", +"f6832c4a": "DO()", +"f683b247": "openSecret(bytes32,bytes32,string)", +"f68445dd": "myContract2()", +"f685e618": "_crownUnFreeze(uint256)", +"f685f942": "ZNCoin()", +"f685f9ad": "Moac()", +"f6860955": "emitAborted()", +"f686640b": "getCrabsOfOwner(address)", +"f686f019": "getCompte_9()", +"f686fa10": "verifyBBODocument(bytes,bytes)", +"f6879623": "addBountyReward(uint256)", +"f688bb2b": "setAirDrop(uint256,uint256,uint256,uint256)", +"f68975a9": "Total_Savers()", +"f68abb25": "approveToFight(uint256,uint256)", +"f68c021b": "EtherXeum()", +"f68c5b6a": "equalBytes32ToBytes(bytes32,bytes)", +"f68ce40b": "turtlemasterReq()", +"f68da9a0": "AthenaLabsICO(uint256,uint256[7],uint256,address,address[3])", +"f68dcd2b": "MHTHolders(uint256)", +"f68e63e3": "PRICE_MUL()", +"f68f1a0c": "recoverETH_SendbyMistake()", +"f68f8e42": "dataSourceGetGroupResult(uint256)", +"f6903c9c": "processEndOfYear(uint256)", +"f691b30b": "lockReleaseDate6Month()", +"f691e362": "EtherDOGEICO()", +"f692715c": "getGameResult(uint64)", +"f6928070": "numberOfGames()", +"f6933c7d": "isICOActive()", +"f693de1d": "signUpForTournament(uint32[])", +"f694211c": "Composed(uint256,address,uint256[5],uint256[5],string,string)", +"f6946940": "jack_pot()", +"f694b761": "createPool(string,address,uint256,uint256,uint256,uint256,uint256,uint256)", +"f694c4be": "NSEToken()", +"f6950d5f": "LIFEWORLD()", +"f6951038": "testCreateWithParentsForeign1()", +"f696c4ed": "fightAgon(uint64,uint64,uint256,uint256)", +"f6973532": "setAddOwnerRequest(address)", +"f6978685": "HashnodeTestCoin_new()", +"f697a0ed": "ppb(uint256,uint256)", +"f697ddb2": "firstAddress()", +"f69871e9": "WithConstructorArguments(uint256,bytes32)", +"f6988b79": "getDeveloperReservedLockInfo(uint256)", +"f698bceb": "getMintable()", +"f698da25": "domainSeparator()", +"f698e626": "WrapReadTokenData()", +"f699ad94": "setupFundingInfo(uint256,uint256)", +"f69a3c7b": "termsAndConditionsAreSigned(uint8,bytes32,bytes32)", +"f69a6982": "getVirtualTradesSummed(bytes32,uint256)", +"f69adce6": "dinoToken()", +"f69b9dd8": "safeWithdrawalTokens(uint256)", +"f69ba02c": "toB32(address,uint256)", +"f69bbf16": "setContributions(address,uint256,bool)", +"f69bf03b": "issuePartnerTokens(uint256)", +"f69c3b24": "registerEarlyContrib(address,uint256,bytes32)", +"f69d03c9": "ETCWalletCreated(address)", +"f69d5f0e": "icoPhases(uint256)", +"f69da37e": "toRefer()", +"f69e672e": "modifyContactManual(uint256,address,string)", +"f69e739e": "voteForCandidate(uint256,address,address)", +"f69e8384": "ceoRemoveCoo(address)", +"f69e98d7": "bite(uint256,uint256)", +"f69f1027": "PRESALE_WEI_GOAL()", +"f69f18a6": "timesIsOver(address)", +"f69f190c": "getWorkerStatus(address)", +"f69f64f7": "setInfo(uint256)", +"f69f7cab": "createTokenVault(uint32)", +"f69f8a5c": "approvedBuyerForIndex(uint256)", +"f6a01234": "TokenStorage(uint256,address)", +"f6a03ebf": "setStart(uint256)", +"f6a08ced": "OracleBitfinex()", +"f6a0be88": "NCRCoin()", +"f6a0e8a4": "DTCC_ILOW_7()", +"f6a10249": "TransferedEth(address,uint256)", +"f6a12b48": "MatchmakerPrevails(address,address,uint256,uint256,uint256)", +"f6a14bf7": "getNumberOfTokensForTheTeam()", +"f6a176ae": "fpMul(uint256,uint256)", +"f6a25127": "test_set_label()", +"f6a29b81": "EntropyTxDetails(address,string,uint256)", +"f6a30e3e": "minTicket()", +"f6a31715": "Revocation(address,uint256)", +"f6a31b9c": "transferManagerContract()", +"f6a33253": "changeRatio(uint256)", +"f6a3b1dd": "totalHardcap()", +"f6a3d24e": "exists(address)", +"f6a3e8c8": "lockInfo(address,uint64)", +"f6a46c2e": "settleBaseDeliveries()", +"f6a47e9a": "MongoliaNationalToken()", +"f6a5546a": "testBilibirdaToken()", +"f6a56bcf": "TianLianCoin(uint256,uint256)", +"f6a58558": "withdrawRemainingRtc()", +"f6a5b13e": "m_beneficiary()", +"f6a5fa30": "subShares(uint256)", +"f6a60d89": "resumeCrowdsale()", +"f6a74ed7": "removeController(address)", +"f6a84013": "totalMEATonsSupply()", +"f6a8aea7": "financialStrategy()", +"f6a92de9": "mycontracts(uint32,address)", +"f6a94ecb": "notifyOfArbitrationRequest(bytes32,address,uint256)", +"f6ab4243": "buyCastle(uint256,uint256,uint256)", +"f6ac54dd": "checkRegPeriod(bytes32)", +"f6ac6684": "getStringZero(uint256,uint256)", +"f6ad660b": "f3(uint256,uint256)", +"f6ada1ad": "rewardDaysLeft()", +"f6adab61": "delayOfICO1()", +"f6af18f5": "montly_pay()", +"f6af2718": "Quantastic()", +"f6afad47": "getDatabase(uint256)", +"f6afe805": "PRE_SALE_GMRP_TOKEN_CAP()", +"f6b09195": "preicoTokensPerEth()", +"f6b098f8": "nextAttackTimestamp()", +"f6b10854": "safeWithdrawAll()", +"f6b12f28": "gameOwner()", +"f6b15fe6": "getProfit(uint256,uint256)", +"f6b19c74": "drain(uint256)", +"f6b2b334": "upgradeTo(address,uint256)", +"f6b2c3b6": "VendTitle(uint256)", +"f6b39b3c": "ContractTotalMined()", +"f6b3e080": "roundOneRate()", +"f6b44d03": "validFactories()", +"f6b4c691": "getPendingCratesForUser(address)", +"f6b4dfb4": "contractAddress()", +"f6b5460f": "withdrawTrackOf(string)", +"f6b55a93": "hotWalletAddress()", +"f6b63224": "_getHpbNodesInterface()", +"f6b69697": "importPreviousWinners(uint256[],address[],uint256[])", +"f6b6daf1": "supportedTokens(uint256,uint256)", +"f6b70702": "LightComplexAirdrop()", +"f6b781a1": "Bolton()", +"f6b87500": "internalCalc(int256,int256)", +"f6b911bc": "burn(address,address,uint256)", +"f6b91944": "walletLists()", +"f6b924f8": "EventAuction(address,uint32,uint256,uint256,uint256,uint256)", +"f6b94cb4": "negotiate(uint32)", +"f6b9571a": "remove_owner(address)", +"f6b97131": "redemptionCount(address)", +"f6b9d05d": "bountyAllocation()", +"f6b9fd79": "STARTING_VINES()", +"f6ba13a5": "lastBlockNumberInRound()", +"f6ba3b6c": "addThing(string,string,bytes32,string)", +"f6bb3cc4": "deleteString(bytes32)", +"f6bd5893": "getGas(uint256)", +"f6be4776": "CannabizToken()", +"f6be71d1": "setDuration(uint256)", +"f6bea5dd": "LOCKEDiN()", +"f6bed059": "mixer()", +"f6bf0edd": "removecantonEmployee(address)", +"f6bf44b6": "getPoolStakeCount(uint256)", +"f6bffff8": "_createTombWithData(address,string)", +"f6c05625": "isValidNumber(uint8)", +"f6c0736b": "register_token(address,string)", +"f6c0d6a3": "_getChainLength(uint256)", +"f6c1acdf": "proofFor(string)", +"f6c1db4c": "GetChequeInfoByHash(uint256)", +"f6c28241": "BuyForFriend(address,address,uint256,uint256,uint256)", +"f6c3f6cd": "readUserPurchaseAtIndex(address,uint256)", +"f6c42713": "changeExpiredLimit(uint256)", +"f6c50d8b": "_ownersTokens()", +"f6c536a0": "sendBonusMany(address[],uint256[])", +"f6c5c80d": "cleanUp()", +"f6c6b731": "activeFirstRound()", +"f6c7430e": "JAPACHELOR()", +"f6c8f62e": "TransferBack(address,uint256,uint256)", +"f6c976d2": "test_1_assertGasUsage50Boards()", +"f6c98dd7": "WikiToken()", +"f6c99dad": "SETUP()", +"f6c9e930": "approveSender(address,address,bool,uint256,uint256)", +"f6ca75d8": "AkonCoin()", +"f6cabaa0": "burnedToDate()", +"f6cb86db": "whitelistTransferPrimordialTokenFrom(address,address,uint256)", +"f6cbcab0": "mintParts(int256,uint16,address)", +"f6cbea50": "ErrorReturningEth(address,uint256)", +"f6cc7d60": "setUnitDefenseIncreases(address,address,uint256,uint256,bool)", +"f6cdf281": "returnPtSafeMedium()", +"f6ceecc4": "TokenAdminContract(address,address[],uint256,uint256)", +"f6cf3a7d": "setDeveloperCut(uint256)", +"f6cf4570": "BoughtBlock(uint256,uint256,uint256,address,bytes32,bytes32,bytes32,bytes32)", +"f6cf5411": "startTimePreIco()", +"f6d024c6": "test_add(uint256,uint256)", +"f6d0bf2f": "GetContractBalance()", +"f6d2eb65": "_validateQualityConsensus(bytes32,bytes32)", +"f6d2ff9d": "setFreelancer(address,address,bool,string,uint256,uint8,uint256[],uint256[],string)", +"f6d339e4": "setAddress(bytes32,string,address)", +"f6d361cc": "ENTRY_FEE()", +"f6d3aebc": "get_salary()", +"f6d3d52d": "RatesChanged(address,uint32,uint32)", +"f6d3df65": "ownerStartsCrowdsale(uint256)", +"f6d4a265": "addLacks(uint16[],int64[],uint16[],int256,int64[],int256,int64[],uint8[])", +"f6d51638": "getRocIdToTokenId(uint256)", +"f6d5959b": "getActionStatus(uint256)", +"f6d68fca": "balanceWinPoolForThirdStage()", +"f6d6d5aa": "claimableToken()", +"f6d72acd": "setVoter(uint256,address,uint256)", +"f6d860d1": "approveUserKYCAndSetReferrer(address,address)", +"f6d89563": "airdropTotalCurrent()", +"f6d956df": "buy(uint8,uint256,uint256)", +"f6da1c0a": "getPriceSMPTokensPerWei()", +"f6dab356": "getGPSEndTime()", +"f6db2bac": "LOG_BetLost(address,uint256)", +"f6db6e50": "ponziToWei(uint256,uint256)", +"f6dbc252": "MOREToken()", +"f6dcb32c": "sendRewardTokens()", +"f6dd0187": "getSubject(uint256)", +"f6ddac74": "updateLocation(string,string)", +"f6ddcee5": "_generate_seed(uint256)", +"f6de4b81": "_doVote(address,uint256,uint256)", +"f6df0d50": "setFrozenAccountICO(bool)", +"f6df26d2": "kickOutCommunity(address,uint256)", +"f6dfafe1": "getShareHolder(uint256)", +"f6dfcff7": "getCooldownEndTime(uint40)", +"f6dfdad1": "getContractInformation()", +"f6e158b9": "getPickedAssetsAndFinalSeed(bytes32[],uint256[],uint256,uint256)", +"f6e212ea": "addCrystal(address,uint256)", +"f6e4641f": "purchaseFor(address)", +"f6e4a3dd": "tradeBalances(address,uint256,address,uint256,address,address,uint256)", +"f6e5c6a4": "totalWeiDonated()", +"f6e5e112": "startingEtherValue()", +"f6e5e298": "setScientificData(uint256,string)", +"f6e66c17": "totalAwards()", +"f6e681a9": "IkuraApproval(address,address,uint256)", +"f6e72981": "mintManyTo(address,string,uint256[],uint256[])", +"f6e7b785": "tdeStarted()", +"f6e7f69d": "test_insert_findWithHintPrevRemoved(int256)", +"f6e87f81": "SkillChainToken()", +"f6e898b0": "getIcedAddresses()", +"f6e9b85c": "doSetCanCreateGrants(address,bool)", +"f6ea1a3f": "CryptoSpin(address)", +"f6ea6252": "MINER_END_PRICE()", +"f6eb1337": "TokenBought(address,uint256,uint256,uint256,uint256)", +"f6eb13b3": "VietnamToken(uint256,string,uint8,string)", +"f6eb58de": "TransferManagerRevoked(address)", +"f6ebe41a": "defaultURIStart()", +"f6ec91d5": "developerAccount()", +"f6ecb9ee": "getprizemoney(address)", +"f6ecd724": "init(address,uint256,bytes32,uint256,uint256,uint256,uint256,bool,bool,address)", +"f6ecebf2": "LeagueAdministrator()", +"f6ed4b71": "getBasketDetails(address)", +"f6ed5342": "updateEscrow(uint64,uint256)", +"f6ed860e": "cancelGoldSellOrder()", +"f6ed8fe7": "grantsUnlock()", +"f6ee2d8d": "developersTokensWallet()", +"f6ee439f": "registerAssetComment(int256,string,string,uint256)", +"f6ee87b8": "_0xEtherToken()", +"f6ee8c59": "FirstBonus()", +"f6eeb89c": "addBid(string,string,uint256,address)", +"f6eeff1e": "punkNoLongerForSale(uint256)", +"f6ef97ff": "transferEthToWallet(uint256)", +"f6efcb7a": "setKeyData(bytes32,bytes32,bytes32)", +"f6f0fa8d": "teamReleased()", +"f6f10a26": "topUpWithEtherAndTokensForHolders(address,uint256)", +"f6f15ec9": "Larbaoui()", +"f6f17bba": "distributePreSoldShares()", +"f6f1995d": "onlyOwnerSetBountyWallet(address)", +"f6f3144d": "GetEthBalance(address)", +"f6f32cc4": "CICToken(string,string)", +"f6f36028": "Score()", +"f6f36641": "setV_R5(uint256)", +"f6f3973f": "fundIco()", +"f6f494c9": "getTermsContract(bytes32)", +"f6f505c4": "RaffleResult(uint256,uint256,address,uint256,uint256,uint256,uint256,uint256,uint256,address,address,bytes32)", +"f6f54833": "HighEndTreasureChain()", +"f6f55ada": "TokenDistributed(address,uint256)", +"f6f5eb59": "transferableStartTime()", +"f6f5f567": "SMPAcquired(address,uint256,uint256)", +"f6f65f1a": "ASTRN_TOKEN()", +"f6f6edd4": "issuerDecimals()", +"f6f6fc74": "holderTeamTokens()", +"f6f7301e": "getById(int128)", +"f6f82ecb": "massChangeRegistrationStatusForSilverWhiteList(address[],bool)", +"f6f844e4": "setOp(bytes32)", +"f6f8ca07": "burnPXL(address,uint256)", +"f6f91737": "MAX_FREE_REFERRAL_PACKS()", +"f6f94a85": "ScaleFactor()", +"f6f94b47": "MiningPayout(address,uint256,uint256)", +"f6f96d91": "rateOfEther()", +"f6f98e34": "calcReleaseToken(address,uint256,uint256)", +"f6fb2c72": "buyGuardian(uint256,uint256,uint256)", +"f6fb4c9a": "_createFilm(string,address,uint256)", +"f6fb6ecf": "buildHouse()", +"f6fbc06a": "getWeiInvested(address,address)", +"f6fc8160": "addSeed(uint256)", +"f6fc96ad": "mainsale()", +"f6fcbee1": "getArrayUint(bytes32)", +"f6fcc14e": "agTechWallet()", +"f6fe3a01": "getUint256Min(int256)", +"f6fee732": "getAccountNote(address)", +"f7008156": "_haveEveryoneDeposited()", +"f700abf1": "addBudget(uint256,uint256)", +"f700ead9": "withdrawTokenMulti(address[],uint256[])", +"f702dd8a": "hkchain(uint256,string,string)", +"f703601e": "safe_add(uint256,uint256)", +"f703e773": "changeLifeExpectancy(uint256)", +"f7044bae": "getShareHolderCount()", +"f7048161": "checkRefundSignature(uint8,bytes,address)", +"f704b57a": "Bitconnect()", +"f704cb98": "addInvitation(address,address,uint256,address,string)", +"f70532fe": "getContractsOf(address,uint256)", +"f705fb87": "preICOend()", +"f7066121": "lastJackpotRound()", +"f706b476": "set_pauseUET(bool)", +"f706b814": "PARSEC_CREDIT_DECIMALS()", +"f7073490": "buyLink()", +"f7074919": "seenHereA()", +"f70794ea": "acceptHelp(uint256)", +"f707a308": "tierTwoMin()", +"f7086dd1": "SmigesToken()", +"f70904b4": "sale1Accepting()", +"f7095d9d": "updateTentativeWinningChildUniverse(bytes32)", +"f709dd51": "getTrademark()", +"f70ad595": "team_release_epoch()", +"f70b0a07": "setTrustedLateCloser(address,bool)", +"f70b13c5": "vestedTokens(uint64)", +"f70bbb9a": "getProposalExternalToken(bytes32,address)", +"f70bbdaf": "create(string,string,uint32,int256,string,address)", +"f70bdba7": "AdidasCoin()", +"f70c92de": "GOSHUIN()", +"f70ccc6e": "MaptPricing()", +"f70d7629": "_verifyOwnershipOfTokens(uint256,address,uint256)", +"f70dbb77": "isPresalePeriod()", +"f70dd1fe": "isAllocated6()", +"f70eabff": "addTeamAndAdvisorsAllocation(address,uint256)", +"f70f1821": "weeksFromEnd()", +"f70fa221": "getInitializeCashValue()", +"f71143ca": "isSaleLive()", +"f712d7ff": "testFailControllerTransferFromWithoutApproval()", +"f712f3e8": "implementsERC165Interface(address,bytes4)", +"f7138eaf": "createArtworkAuction(string,string,uint32)", +"f71441a5": "maxGoal()", +"f7146269": "testGetRandomDragon(uint256)", +"f7149220": "RNG()", +"f714a96e": "myCompany()", +"f714bf3d": "overflowOwner()", +"f714de9c": "MultiAccess()", +"f7160766": "getCompte_13()", +"f716171c": "createTrade(uint16,address,address,uint256,uint16,uint32)", +"f7164029": "upgradePrefixPreSignedFirst(uint8,bytes)", +"f716b7bf": "initInvesters()", +"f716c400": "getCrowdsaleUniqueBuyers()", +"f716fe43": "s37(bytes1)", +"f717442a": "previousPriceOf(uint256)", +"f717c310": "freezeTransfersSince(uint256,string)", +"f71868da": "Ethereumcapital()", +"f719254d": "cancelEthToTokenOrder(uint32)", +"f719e111": "useOraclize()", +"f719edfb": "firstPublish()", +"f71ad40e": "icoCapInWei()", +"f71b041c": "refundUser(bytes32,uint8,uint256,uint256)", +"f71b382c": "PIEXTREAM()", +"f71be837": "sign(address)", +"f71c60bd": "AMBASSADOR_FIVE()", +"f71cc3a5": "setUserStatus(address,uint256)", +"f71db383": "setArbitrationContractAddress(address)", +"f71dcb10": "CreatedMTP(address,uint256)", +"f71f7a25": "set(bytes32,bytes32)", +"f71f9c38": "SupplyChanged(uint256)", +"f72047ff": "_enableRefunds(address)", +"f72084b2": "foundationShare()", +"f720a453": "senderStake()", +"f720d563": "endAttack(address,bool,uint256,uint256,uint256,uint256,uint256,uint256[])", +"f720ef08": "setTokenAiNetworkToken(address)", +"f720f3d2": "tokensToEther(uint256,uint256)", +"f720f80b": "isMaster(address)", +"f7213db6": "orderFills(bytes32)", +"f72457af": "CertifierDb()", +"f7253071": "lastBlock_f0()", +"f725839f": "multiGenerate(address,address[],bytes)", +"f7260d3e": "receiver()", +"f7265042": "getUsersShipsIds()", +"f726af40": "MilestoneAmountRaised()", +"f726f715": "distributeFunds(uint256)", +"f727550e": "determineOutcome(uint256)", +"f72755fe": "getRequest(int256)", +"f72758e7": "getBracketDataMiddleTeamIds(uint8)", +"f72860ca": "modifyCustomer(string,string)", +"f7286888": "getPhaseNumber()", +"f72918ef": "addVoterVote(address)", +"f729688e": "_hasFlags(uint256,uint256)", +"f729b216": "moreTokenPerEtherForSeedRound()", +"f729cf0d": "getJob(bytes32)", +"f72a244d": "handleAllowance(string,uint256)", +"f72ae72c": "remainingTokenForSale()", +"f72b7ab9": "SbloccaConto(address)", +"f72c436f": "isHuman(address)", +"f72c75a5": "delegateVestingContractOwner(address)", +"f72d2c22": "BONUS_HI()", +"f72d3b15": "LamboPresale(uint256,uint256,uint256,address)", +"f72d50a9": "getPOOL_edit_4()", +"f72d53ba": "getNumMatches()", +"f72db5a3": "getLLV_edit_8()", +"f72e460a": "getBUUU(bytes32,uint256,uint256)", +"f72e695b": "setPoolCut(uint256)", +"f72f30e1": "Vesting(address)", +"f72f34db": "getDCountedBasicBallotsN(bytes32)", +"f72f6826": "ChangeEnd(uint256)", +"f72fc599": "_isThereAnOnGoingTapProposal()", +"f73052e8": "totalSoldCount()", +"f73079a6": "Auto(address,string)", +"f73089b9": "sale2Stopped()", +"f7309f29": "testLedgerUnderPayback()", +"f731c3bd": "lotteries(uint32)", +"f731d33c": "ApzCoin()", +"f7326286": "getARInvIndexTable()", +"f73294b8": "isValidatorAlreadyVoted(address,address)", +"f732eb66": "getPayoutDenominator()", +"f7342cd3": "SGF()", +"f7362152": "testThrow_testableContributionCaseExpectFailure()", +"f73770e7": "is_contract_paused()", +"f737f274": "getBuyDemand(uint256)", +"f73857cc": "deauthorizeAddress(address)", +"f738e5ca": "ownerTakeProfit()", +"f739a501": "snapShot(uint256,address)", +"f739ba2f": "picops_withdraw_excess()", +"f739c261": "legendary()", +"f739ed4c": "id_for_user_version(uint256,uint256)", +"f73a590c": "distributed_team()", +"f73b5541": "bulkWhitelist(address[])", +"f73baf62": "proxy_initialization()", +"f73c30e3": "getESOP()", +"f73c8dfd": "pvpQueueSize()", +"f73cc97c": "AddDOT(bytes)", +"f73d05db": "getSha()", +"f73d594c": "ERC20Base()", +"f73e05dd": "RetrieveCommissions()", +"f73f4ebc": "processBuyRequest(string,address,uint256,uint256,bool)", +"f74034df": "purchaseGen0Token(uint256)", +"f7407178": "get_banlance(address)", +"f740fbc9": "test_validPerc()", +"f74100e3": "getBits(bytes)", +"f741b602": "denyInvestor(address)", +"f742048b": "NlvToken(uint256,string,string)", +"f7426b62": "unlock(bytes32,bytes,uint256[],bytes,bytes,bytes,uint256[],bytes,bytes)", +"f74279b0": "totalEarning()", +"f7434ea9": "arbitrationCost(bytes)", +"f7437384": "NucleusVisionAllocation()", +"f743d334": "BancorBuy()", +"f744538d": "submitClearingPrice(address,bytes32,uint256)", +"f7448a31": "transferERC20(address,uint256)", +"f745630f": "update(uint256,string)", +"f746e28d": "fundSchool(uint256)", +"f746f365": "icoSoldCap()", +"f746fcdb": "presaleMade(string,uint256)", +"f74715cb": "ApproveERC20(address)", +"f7474d00": "payEther()", +"f74758ef": "safeSendCard(uint256,address)", +"f7477435": "TokensWorldCoin()", +"f747a5eb": "auctionBid(bytes32)", +"f747b744": "investFromWallet(uint256)", +"f749013e": "dateStartContract()", +"f7493c6a": "UpdatePremiumLimit(uint256,uint256)", +"f749bdc1": "BUYER_CHECK_STEP(bytes32)", +"f749d980": "LastExecuted()", +"f74a4e63": "transferToMint(uint256)", +"f74b766a": "createBet(uint256,uint256,uint256,bool,string)", +"f74c67b3": "getAddressKYCState(address)", +"f74c753f": "dontReturn()", +"f74d73ec": "issueSertificate(address,address)", +"f74deae3": "MultiSigWallet(address,string,uint256,uint256,string)", +"f74e8655": "setWhitelistAgent(address,bool)", +"f74e9bde": "pwr(uint256,uint256)", +"f74f4702": "changeRequiredMajor(uint256,bool,bytes)", +"f74fbb47": "StateChanged(bool)", +"f74fc598": "listSharesForSale(uint256,uint256)", +"f750aaa6": "withdrawEverything(address)", +"f75165c6": "right22(uint256)", +"f751758b": "getCurrentTokenPrice()", +"f751b26a": "unclaimedRoyalty()", +"f751c2f5": "MAC()", +"f751cd8f": "drop()", +"f752644c": "aelfCommunityMultisig()", +"f752fdc3": "wdivide(uint256,uint256)", +"f75316b4": "CobinhoodToken()", +"f754f766": "setBonus(uint8,uint8,uint8,uint8)", +"f7553098": "voteForOutcome(int256,uint256)", +"f755a76e": "createBoard(bytes32)", +"f755a98b": "setCrowdsaleEndBlock(uint256)", +"f75640b3": "crowdsaleCanceled()", +"f7566b49": "getBet(address)", +"f756b574": "getDropAmount()", +"f7572cf3": "newCampaign(address,uint256)", +"f757342c": "setRewardWasSent(address)", +"f758ff59": "SentDeveloperFee(uint256,uint256)", +"f759c480": "balanceOfrun(address)", +"f759e298": "getNumberOfBlocksPerKick()", +"f75a275b": "reservedLPT()", +"f75b8d3c": "getExpiredCratesForUser(address)", +"f75beacf": "HuaTuo()", +"f75ccbf0": "checkErrors(bytes32)", +"f75cf7d5": "IndecoinBounty()", +"f75d34bb": "ICOChanged(address)", +"f75e5d85": "selfDestruct(uint8,bytes32,bytes32)", +"f75eb240": "removeCallSpenderWhitelist(address)", +"f75ec528": "getSpaceInfo(uint256)", +"f75fa5e1": "xorReduce(bytes32[],uint256)", +"f75fb878": "preICOwei()", +"f75fdcaa": "cancelMilestone(uint256)", +"f760d2a2": "_incrementBlockStats(bytes16,uint8)", +"f761720a": "isEquiped(address,uint256)", +"f7618a40": "LIMIT_PROMO()", +"f7620435": "inquire_length(uint256)", +"f7627da2": "startUnlimitedSale(uint256)", +"f7628949": "B2ANDcoin()", +"f762e147": "addAsset(uint256,uint256,bytes)", +"f7637bec": "AccountReaderRemoved(address,address)", +"f764531d": "saleStartAtBlock()", +"f7647f36": "acceptPurchase(uint256,uint256)", +"f764e8a0": "partPos()", +"f764eb93": "LogDepositForDividend(uint256,uint256)", +"f765088f": "UpdateClientAddress(address)", +"f7654176": "split()", +"f76543e9": "hasOpening()", +"f7658e0f": "bonusDecreaseDay()", +"f765b6b1": "getEventInfo(bytes32)", +"f765e6e4": "return_pause()", +"f765ec6f": "lastBlock_a11Hash_uint256()", +"f766658d": "finalizePreIcoDate()", +"f76692a6": "dtTestCitySnapshot(address,uint256)", +"f766cd3e": "minInvestorCap()", +"f766eca7": "EtherDeltaApproveToken(address,uint256)", +"f7670b0c": "updateAuth(address,address,bool)", +"f7678fda": "setNewRegister(string,string,uint256)", +"f767fdcf": "KRYPT()", +"f767fe97": "MarketingAddr()", +"f7682aa5": "CURVE_CUTOFF_DURATION()", +"f7683b37": "ETTCE()", +"f768402a": "addProduct(address,string,string,uint256,string)", +"f768923a": "ignite()", +"f768f0f5": "setTrustValue(uint256,uint256)", +"f769aeb2": "getNextPoliceAssignment()", +"f76a24e6": "isTesting(uint16)", +"f76aae2f": "addVerifiedAddress(address)", +"f76b8c5e": "destinationOf(uint256)", +"f76bd7d1": "disableIssuance()", +"f76bf292": "StormToken(address)", +"f76bf757": "registerPage(bytes8,string,bytes32,string)", +"f76c0f4e": "updateFlipTokenRewardAmount(uint256)", +"f76c1ea5": "setReceiptLiablity(address,address)", +"f76c84eb": "manualChangeMonth(uint256)", +"f76c906b": "mCurrentSnapshotId()", +"f76ce123": "ERC20Template()", +"f76cf4bf": "BiToro()", +"f76d270e": "_setTokenBudget(address,uint256)", +"f76d3569": "auditorDelegate()", +"f76e8d29": "createSplitAgreement(address,address,address)", +"f76e9183": "VitalSkin()", +"f76f8d78": "SYMBOL()", +"f76f950e": "uint2str(uint256)", +"f76ffe7a": "startMintingData()", +"f77014da": "setGVE(uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32,uint32)", +"f7701b47": "downloadPriceInWei()", +"f7701ce8": "batchDistribute(address[],uint256)", +"f770a865": "FaradCryptoken()", +"f770c96f": "TDESupply()", +"f771bc6b": "minerSaleCount()", +"f772547b": "addressToSubscriptions(address,uint256)", +"f77267ea": "sendTokensToWorkers(uint8,uint8)", +"f77282ab": "finalizeAuction()", +"f773a3fb": "maxAssignedRequests()", +"f773ab80": "isPVPProvider()", +"f773c770": "TMSYToken(address,address)", +"f77404e5": "totalCommonWithdrawSupply()", +"f7745f88": "BudCoin()", +"f7746e36": "cars(uint256)", +"f7749e32": "rocketTimeUntilMoon(uint256)", +"f7750bd5": "startEthGetToken()", +"f7759c84": "maxTokenSupplyPreICO()", +"f7768580": "EventTransferAction(address,address,uint32,uint8)", +"f7770906": "buy_energy_core(address,uint32,uint32,uint64,uint32,uint64)", +"f778f32b": "addAlgo(uint256)", +"f7791010": "approveWriter(uint256,address)", +"f779a68d": "_deposit(address,address,uint256,bytes)", +"f779abf7": "DaoUpgraded(address)", +"f77a0923": "BitcoinProcessor(address)", +"f77a490d": "setMinPurchaseInWei(uint256)", +"f77aa0ad": "changeRedTeamAddress(address)", +"f77abd74": "getMatchPointsGroups(uint256,uint192)", +"f77b1856": "getAddTokenData()", +"f77b6f61": "getCRhashOfCRTokenId(address,uint256)", +"f77c1dc6": "unknownInvestors(uint256)", +"f77c4791": "controller()", +"f77c4ff9": "_firstRoundFight()", +"f77ca208": "managerIsPaused()", +"f77d62f0": "roundNumber_()", +"f77da6d5": "claimImmediateTokens(address)", +"f77dc854": "setHookableTokenAddress(address)", +"f77dff06": "joinPillarWithEarnings(uint256,uint8,uint256)", +"f77e4d8b": "test_YayIsNotOverSixtyPercent()", +"f77e8b83": "addPlayer(string)", +"f77f29b1": "getFeeWindow()", +"f77f2f2e": "setRewardStatus(address,bool)", +"f7800e69": "fundVault()", +"f780259e": "totalPrayers()", +"f780d867": "add_coin(string,string,address,uint8)", +"f7815fae": "getIntField2()", +"f782b2ea": "_confirm(address)", +"f784cae5": "Fetish()", +"f784dd61": "RealeaseTime()", +"f78525a1": "getFaucetByName(string)", +"f785ef72": "decimals_()", +"f785f03d": "setMigrating(bool)", +"f7860bb1": "addToBounty()", +"f7862ec2": "feeWindowBurn(address,uint256)", +"f7868884": "FOUNDERS_REWARD()", +"f786bb62": "Hiken(uint256,string,uint8,string)", +"f786becd": "MAJOR_VERSION()", +"f786cb82": "updateLemontokensRemainingToDrop()", +"f7870c5b": "Unlock(address,uint256,uint256)", +"f7888aec": "balanceOf(address,address)", +"f7892887": "phase_1_Time()", +"f7899d9e": "_buyCommonTTM(uint256,uint256,address,address)", +"f78a706a": "extraEmission(uint256)", +"f78a7a55": "createBurnRequest(address,uint256,string)", +"f78c6b54": "donations(bytes32,uint256)", +"f78cc9cf": "getTokenNextPrice(uint256)", +"f78d1c6a": "managePID(uint256)", +"f78d5494": "approveNewMintRequest()", +"f78dd0c1": "MovieCoin(uint256,uint256)", +"f78e4210": "test_oneValidEqAddress()", +"f78ed322": "regNameWOwner(string,address,address)", +"f78fa141": "_uintToSPDStr(uint256)", +"f78fadc6": "HXC()", +"f78fe0e9": "stand(uint8[],bytes32,uint8[])", +"f7903871": "RevTokens()", +"f7908f00": "verifyTransaction()", +"f79098f4": "getEditionLimits(uint256)", +"f793595a": "ThreeAT()", +"f7935969": "getRank(address,uint256)", +"f793fb64": "valInt()", +"f794062e": "isListed(address)", +"f79480f8": "lastBlock_f19Hash_uint256()", +"f794e7f2": "addDefenceParts(uint8[])", +"f794eb58": "getBonusRate()", +"f7963e8a": "testNewCounterValueIszero()", +"f7966eef": "changeReputation(address,int32)", +"f7969147": "currentBurned()", +"f796e06f": "calculateAndRegisterBonuses(uint256)", +"f79710fd": "extraTokens(address,address,uint256)", +"f797ac0e": "addSellingItem(uint256,uint256,uint256)", +"f797b617": "buyInvestorPack(uint256)", +"f797f7b6": "ETH_SIGN_TYPED_DATA_ARGHASH()", +"f7981bdd": "indSeed()", +"f7982243": "addRecipient(address,uint256)", +"f7987a03": "applySetMaxFeeWithdrawal()", +"f798abce": "teamLockAddr()", +"f79915ce": "kkTestICO91()", +"f7992d85": "eta()", +"f7996163": "joinSinceOf(uint256)", +"f79a2b84": "setFirstMile(address,address)", +"f79a3c25": "voteForDisable()", +"f79a97fc": "isSpentTxPaymentForMCW(bytes32)", +"f79acad3": "approveInvestorsInBulk(address[])", +"f79b22e0": "betOnATeam(uint256)", +"f79cfaea": "STLToken(string,string,uint8,uint256)", +"f79d0a8b": "callSomeFunctionViaInner1()", +"f79d6687": "removeTokenTime(uint256)", +"f79dcf8d": "earliest_buy_time()", +"f79e2b32": "inListAsOf(address,uint256)", +"f79ea94d": "VoipToken()", +"f79ebd7f": "tokenPriceDenom()", +"f79ed94b": "reserveAddress()", +"f79f528b": "getMinAuctionValue()", +"f79fc70d": "testBaseStoreTokenUsingDeployedContract()", +"f7a01b93": "StateMachine()", +"f7a06a88": "setSellerGuarantee(bool,uint256)", +"f7a0715f": "DoneToken()", +"f7a084c0": "AIRDROP_START_AT()", +"f7a0b2da": "updatePeloExtenstionContract(address)", +"f7a0ee1c": "maxtokens()", +"f7a0fa0a": "getShareDistribution(bytes)", +"f7a268c4": "freezeAccount(address,bool,bool)", +"f7a33598": "round(uint256[4])", +"f7a34573": "setAction(string,uint256)", +"f7a40e99": "moveERC721Tokens(address,address,uint256)", +"f7a4c45c": "calculateSaleReturn(uint256,uint256,uint8,uint256)", +"f7a6a046": "backOrenCoinOwner()", +"f7a7408b": "BuyLevel()", +"f7a7ec12": "fund_color(address,address,uint256,uint256,uint256)", +"f7a80784": "addProduct(string,uint8)", +"f7a8b34d": "planetName(uint256,uint256,uint256)", +"f7a919be": "createRegion(address[16],address,uint256,uint256,uint256,uint256)", +"f7a9a152": "count_users()", +"f7aa4e0e": "MithrilArrows()", +"f7aad9ed": "amendBalances(address[])", +"f7ab6ec6": "getOfferingByProposal(address,uint8)", +"f7abab9e": "tokenTotalSupply()", +"f7ac5611": "pushStatus(string,uint256,uint256,int8)", +"f7ac9c2e": "approvePreSignedHashing(address,address,uint256,uint256,uint256)", +"f7ad51ce": "cardsKeys()", +"f7ad7d8f": "getAllowedAmountByTeam()", +"f7ad906f": "contractTransfer(address,address,uint256)", +"f7adc48f": "test3(uint256)", +"f7ae24ae": "FundWithdrawal(address,uint256)", +"f7ae9421": "checkInvestorBalance(address)", +"f7aeea14": "removeGlobalConstraint(address,int256,address)", +"f7af21c9": "cancelCrowdsale()", +"f7af630b": "GetBindTokensAccountEvent(address,string)", +"f7b09d33": "giveReserveFund(address,uint256)", +"f7b14066": "setup(uint256,uint256,uint256,uint256,uint256,uint8,uint256,uint256,uint256,uint256)", +"f7b188a5": "unPause()", +"f7b22fa2": "getCurrentBeneficiaryCap()", +"f7b28073": "moleculartechnology()", +"f7b2a7be": "rewardAmount()", +"f7b3ae2f": "getSwapData(bytes32)", +"f7b42d08": "set_price_and_sell(uint256,uint256)", +"f7b43abf": "PRESALE_ICO_PORTION()", +"f7b47870": "setPublicOfferingHolder(address)", +"f7b4b087": "purchaseFirstTokens(uint256)", +"f7b4feec": "FaucetsToken()", +"f7b53431": "feesTaken()", +"f7b54065": "getInvestmentCurrentValue(address)", +"f7b578ee": "LiveCoin()", +"f7b6302e": "getInvestorTokensPurchase(address,uint256)", +"f7b75258": "withdrawlsEnabled()", +"f7b77a21": "MasternodeRegistered(address,uint256)", +"f7b822db": "setDEditor(bytes32,address,bool)", +"f7b89a3e": "getTotalCosts()", +"f7b8a600": "payAltCoin(bytes32,uint256,bytes)", +"f7b8eeb7": "getWhale(uint256)", +"f7b92f34": "CandidToken()", +"f7b95d35": "setRNGCallbackGas(uint256)", +"f7ba8896": "random(uint256,uint256,address)", +"f7bada53": "randomChoiceFromticketPool()", +"f7bbd1c1": "setMinAcceptEther(uint256)", +"f7bc2003": "releaseApprove(bytes32,uint8,bytes32,bytes32)", +"f7bc39bf": "owns(address)", +"f7bd2361": "LookAtBalance()", +"f7c0085b": "changeRandomOrgAPIKey(string)", +"f7c00e2f": "presaleWeiRaised()", +"f7c07442": "getReferrals(address[])", +"f7c0f4c6": "calculateRates()", +"f7c0fa4a": "requireCorrectReceipt(uint256)", +"f7c15df9": "_addExtraGasLimit()", +"f7c2b38c": "seconds_left()", +"f7c360e0": "fee_claimer()", +"f7c38052": "createBuyOrder(address,uint256,uint8[],address[5][],uint256[6][],uint256[],uint8[],bytes32[],bytes32[])", +"f7c3b210": "ENCKToken(uint256,string,uint8,string)", +"f7c3ee7a": "immortality()", +"f7c42ac8": "onChainIdentities(address)", +"f7c45aa4": "sld(address,uint256,string)", +"f7c46a73": "totalhospital()", +"f7c58b62": "weiPerEther()", +"f7c5f4b6": "getPreICOBonus()", +"f7c618c1": "rewardToken()", +"f7c68ffb": "isReleasedOnce()", +"f7c824f1": "CombineCard(uint32)", +"f7c8a091": "forPresale()", +"f7c8af48": "destroyItem(uint256)", +"f7c8d634": "tab(bytes32)", +"f7c9a7be": "drawTertiaryCWinners(uint256)", +"f7c9afa2": "onlyOwnerGetAdvWallet()", +"f7c9f1da": "setPonziPriceinWei(uint256)", +"f7c9f74a": "insert_contribution(address,uint256)", +"f7cab847": "getRule(bytes32)", +"f7cb5709": "CoinsLimitUnalterableInteger()", +"f7cb789a": "roundDuration()", +"f7cb8e66": "testIt()", +"f7cbcb8f": "withdrawCrowdsaleOsherCoins()", +"f7cc8c13": "MobSquads2()", +"f7cc8f40": "nbBackerWithMoreOrEqualTen()", +"f7cdf47c": "ETHEREUM()", +"f7ce25bb": "cardAndChecklistIdsForOwner(address)", +"f7ce4479": "setCommunityAddress(address)", +"f7cf0aa1": "updateMinBet(uint256)", +"f7cf9a1c": "Create(address,uint256,address,string)", +"f7cfd902": "removalBlackList(address)", +"f7d08eae": "distributeReserveSupply(uint256,address)", +"f7d0e04b": "setReputation(address)", +"f7d4c7e3": "getBracketDataFinals()", +"f7d518b5": "StartNewGame(string,string,string)", +"f7d5e485": "airdropToken(address[],uint256)", +"f7d6dbe5": "UpgradeProposals()", +"f7d7477b": "sumAmounts(uint256[])", +"f7d8417d": "MYRED(uint256,string,uint8,string)", +"f7d871df": "NucleusVisionAirDropTokensMinted(address,uint256)", +"f7d8c883": "breedWithAuto(uint256,uint256)", +"f7d9078e": "mintToSpecialFund(address)", +"f7d91cd4": "allocateReserveCompanyTokens()", +"f7d97577": "setPrice(uint256,uint256)", +"f7d978a2": "changeEntryFee(uint256)", +"f7d9a5ae": "BtcToken()", +"f7dadf7d": "setBurnFormula(address)", +"f7daef72": "getIndexBatchByUsername(bytes20[])", +"f7db7348": "preapprove(address,uint256,uint256,uint16)", +"f7dba1dc": "nullifyProduct(bytes32)", +"f7dc0455": "transferInitialAllocation(address,uint256)", +"f7dc909b": "createNewEvent(bytes32,string,string,uint256,string,string)", +"f7dd2e28": "BAG_TRANSFER_MINIMUM_AMOUNT_OF_BUYS()", +"f7ddfb4b": "meltingContract()", +"f7decfd1": "blacklistSwitch()", +"f7defe8c": "pickTheWinner()", +"f7df8f87": "vestingFounderAddress()", +"f7e0bc92": "COLOR_CUSTOM()", +"f7e0e743": "removeFirstAdvisorLock(address)", +"f7e23677": "catAttributes(uint256,uint256)", +"f7e23778": "PresaleEnd(uint256)", +"f7e28f8b": "weiRaisedAfterDiscountRounds()", +"f7e2ed66": "mOnTransfer(address,address,uint256)", +"f7e2ff00": "userWithdrawalStartTime()", +"f7e3c068": "PrestigeUp()", +"f7e3f00e": "PUBLIC_SALES_2_RATE()", +"f7e42647": "updateTrustRank(uint256)", +"f7e498f6": "verifyProof(bytes32,bytes,bytes,uint256,bytes32[])", +"f7e4a4a9": "hardCapPreSale()", +"f7e502cb": "HALToken()", +"f7e5951e": "_calcRemainReward()", +"f7e6af80": "_getOwner()", +"f7e74e65": "updateEmployee(uint256,uint256,string)", +"f7e77e44": "releaseMyVestedTokens()", +"f7e78e78": "verifyDeal(bytes32,bytes)", +"f7e7d6d8": "Noscam()", +"f7e80582": "enableAutoReinvest(uint256)", +"f7e83aee": "verify(bytes,bytes)", +"f7e95364": "updateGuMasks(uint256,uint256,uint256)", +"f7e98d15": "YELLOWLAMBO()", +"f7ea7a3d": "setTotalSupply(uint256)", +"f7ead092": "totalWinAmount()", +"f7eaec4f": "removeAgent(address,uint256)", +"f7eb4017": "findAddressByEndpoint(int256,string)", +"f7ebc39a": "isTransferAllowed(address,address,uint256)", +"f7ec221e": "authorizedToDraw()", +"f7ec2f35": "isContract()", +"f7ec7b51": "create_new_deal(uint32,uint256,uint32)", +"f7ecc428": "mintForInvestor(address,uint256)", +"f7ed6031": "getRoundDividendShare()", +"f7ed71d0": "left40(uint256)", +"f7edbbe6": "nextLapId()", +"f7ee503e": "editTicketPrice(uint256)", +"f7efd150": "create(address,address,string,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,address)", +"f7efd408": "votesIter(uint256)", +"f7f03516": "EasyHashingCoin()", +"f7f15304": "ARCD_FUND()", +"f7f1962e": "firstAuctionsInitialDuration()", +"f7f20cb3": "getTournaments()", +"f7f2210c": "openBetIndex()", +"f7f2741c": "AFTCoin()", +"f7f32916": "computeTokenWithBonus(uint256)", +"f7f33c54": "CriptaliaRewards()", +"f7f3815c": "setOperation(address)", +"f7f3ad16": "FixBet51()", +"f7f3da3b": "TestContractOne()", +"f7f4b9d4": "saleEnd1()", +"f7f50faa": "chunksAlreadyVested()", +"f7f5886e": "initializeS4FE(address)", +"f7f59411": "purchaseExistent(uint256)", +"f7f59b0f": "LogCustomerVerified(address,address,uint8)", +"f7f6d4da": "GreenEarthEconomyFund()", +"f7f74b56": "closeVoring()", +"f7f7915d": "setNextRoundFee(uint32)", +"f7f8303b": "product1_sell()", +"f7f87361": "DepositProxy(address,address)", +"f7f8aae9": "SudoEnabled(bool)", +"f7f9cb1c": "wrappedContract()", +"f7fad9fc": "UpdateState(uint256)", +"f7fb07b0": "getCurrentRate()", +"f7fb4801": "firstRoundWMEnd()", +"f7fc1bd6": "PROMETHEUS_SHIP_PRICE()", +"f7fc7783": "SanityPricing(address)", +"f7fc8a91": "haveShelf(string)", +"f7fca4f4": "setFeeFormula(address)", +"f7fca8d3": "ratePublicSale()", +"f7fce4da": "raffle_addr()", +"f7fd2e19": "TCoin()", +"f7fd3d01": "releaseCarbonDollar(uint256)", +"f7fe2e32": "newBurnableOpenPayment(address,uint256,uint256,string,string)", +"f7fe3477": "assertEq(bool,bool)", +"f7fe6f39": "fibo()", +"f7feeb31": "amendEntry(uint256,bytes32,bytes32,bytes32,bytes16,bytes1,bytes16,bytes32,bytes32)", +"f7ff50e2": "transaction_count()", +"f7ffaa5b": "ExTokeA()", +"f7ffbd85": "amountRemaining()", +"f7ffc366": "executeRulingB(uint256)", +"f80176ab": "GetEthereum(address,uint256)", +"f8018a79": "prepend(address,address)", +"f801fae9": "_fCancelDist()", +"f802075f": "requiredEndowment()", +"f8024d10": "getMemberAtIndex(uint256)", +"f80334ae": "selfDestruction()", +"f803bef0": "forceUpdateWinners(address[])", +"f803f97e": "transferAUTOtokens5(address[])", +"f8058bdf": "_CROWDSALE_PAUSED()", +"f805b300": "SALE_4WEEK_BONUS()", +"f8065ed6": "setStopMatchBetting()", +"f8083bab": "simulatedWithdrawal(address,address)", +"f8085c58": "updateStakerRanking(address)", +"f80979d6": "isPreSalePeriod(uint256)", +"f809c826": "managerToFunds(address)", +"f80af907": "roundThreeAmount()", +"f80b3564": "returnAddress(bytes32,uint8,bytes32[2])", +"f80b3cfa": "checkBetLowhigh(uint8)", +"f80bb2a7": "activateSubRound(uint256)", +"f80bbedc": "ethToToken(uint256,uint256)", +"f80d6e90": "GPHToken()", +"f80d9e58": "PVE_BATTLE()", +"f80db825": "AffiliateCoinMultiSigWallet()", +"f80dfdc2": "getTmpWriteTimestamp(bytes32)", +"f80e77d2": "updateETHNZD(uint256)", +"f80ea517": "getDealerInfo(string)", +"f80eba7c": "getTrapid(uint256,uint8)", +"f80f44f3": "right97(uint256)", +"f80f4ea8": "mintAdminApproval(address,address,uint256)", +"f80f5d4a": "EightteenToken()", +"f80f5dd5": "addWhitelist(address)", +"f80f96f6": "returnGanaBeforeSale(address)", +"f80fb7ae": "addCET4To(address,uint32,uint32)", +"f81126a7": "periodICOStage3()", +"f8115814": "TOKToken()", +"f8115891": "getSatTokensOwed(address)", +"f8125093": "set_devcon_map()", +"f8129cd2": "send(address,address[],uint256[])", +"f812f423": "advanceEndTime(uint256)", +"f8132b66": "lockCycle()", +"f813f027": "requestedTokens()", +"f813fcfa": "changeFooIntArrayDynamicSize(uint256)", +"f8140a7e": "standardFee()", +"f814530b": "_allocateETH(uint8,bool)", +"f8147d67": "callTest(uint256,address)", +"f81501f8": "smartContractPriceIsSet(uint256)", +"f815a842": "_getETHBalance()", +"f815e6ab": "kdtFundDeposit()", +"f816f0aa": "gameCancelled(uint256)", +"f8185a13": "getBatches(address)", +"f818d723": "transferPower(address)", +"f8193547": "transferAndExecute(address,uint256,string,string)", +"f81a1860": "killOnUnsupportedFork()", +"f81a95db": "setReferrerFee(uint256)", +"f81b1998": "StopTransferGuard(address[])", +"f81bfa3f": "killThisContract()", +"f81d0292": "setParentAddress(address,address)", +"f81d087d": "prepareLottery()", +"f81d29df": "GambangCoin()", +"f81dc03f": "QuizwinToken()", +"f81de228": "getInvestorPacksAvailable()", +"f81dee03": "set_koef(uint256)", +"f81e8775": "resolveAddress(address)", +"f81ed6ae": "updateStart(uint256)", +"f81f8101": "initializedTime()", +"f81f8bf6": "burnReputation(uint256,address,bytes32)", +"f81ff8e7": "CurrentCoinPrice()", +"f8201a32": "requestLoan(uint128,address,address,address,uint256,uint64,bytes)", +"f821a17c": "getVotingNetworkDetails()", +"f821c423": "sendAirdrops(address[],uint256[])", +"f822372e": "Lab51TestToken()", +"f8225a05": "_setTransferFeeAbs(uint256)", +"f8226dbf": "TC(uint256,string,string)", +"f822841e": "PropertySet(address,bytes32,bytes32)", +"f8228f14": "assignSpartansToBattle(uint256)", +"f8229eba": "addAuthByCode(string,string,string)", +"f8241d7e": "updateAddresses(bytes32[],address[])", +"f8242c32": "addChallenge(address)", +"f824384a": "addInvestorAtID(uint256)", +"f8247299": "getIudexScoreAll(address,address)", +"f8256121": "publicResolver()", +"f8264772": "getTokenss()", +"f828500d": "isValidMessageLength(string)", +"f828c3fa": "scheduleCall(address,bytes4,bytes32,uint256)", +"f828edbe": "excludeWallet(address,bool)", +"f829d1a0": "walletSplitPercentage()", +"f82a4707": "secondsBetweenMints()", +"f82a7496": "giveMeCDP(uint256)", +"f82ab2ec": "PRIVATE_SALE_PRICE()", +"f82b2c31": "confirmByC(uint256,string)", +"f82bffa0": "get_merkle_proof(uint256)", +"f82c09a3": "PresentToCEO()", +"f82c2301": "resignFromCommunity()", +"f82c50f1": "log(uint256)", +"f82de7b0": "mineBlocks(uint256)", +"f82e4a4f": "Cointum(address,address,address,uint256,uint256,uint256)", +"f82ec3e6": "Norm()", +"f82edc1b": "unSign(address,address)", +"f82f396f": "sha(string,string)", +"f82f7a4b": "startDepositExit(uint256,address,uint256)", +"f82fb363": "icoController(address)", +"f82fe152": "PLAYER_METADATA()", +"f83064c7": "transferMintship(address)", +"f830c325": "updateToken(string,string)", +"f830d489": "depositExit(uint256,bytes32,bytes,bytes)", +"f83186f5": "HoryouToken()", +"f831aee6": "kingdomCreationFeeInFinney()", +"f831e962": "getWebStats()", +"f831ebab": "freezeTokens(address,uint256,uint256)", +"f831fe32": "updateApp(string,address,uint256,bool)", +"f833061b": "RESELLING_LOCKUP_PERIOD()", +"f8333e0e": "Aramco()", +"f8339005": "getSaddle(uint256)", +"f833f984": "OSEToken()", +"f8341fca": "BezantToken(string)", +"f8347242": "betsNum()", +"f834db41": "getBeneficiaryManage()", +"f834e212": "setGamePrize(uint256,uint256)", +"f8351daf": "winningCard()", +"f8354a82": "nextArenaTime()", +"f835a686": "setSaleEnd()", +"f835eb1b": "New(string,uint256,uint256,string,string)", +"f83629e0": "EBLCreation(uint256,string,string)", +"f83761e5": "setBAU2(bytes32,address,uint256,uint256)", +"f837e7c1": "battleAdd(uint256)", +"f838b0e9": "get_allowance_expires(address,address)", +"f838ea1a": "setDefaultMaxJump()", +"f838f6dd": "AssignBurnFees(address,uint256)", +"f8392303": "changeTicketMag(uint256)", +"f839407b": "setRateRoundSeed(uint256)", +"f83944ab": "LogEggAcquisition(address,uint256)", +"f839686d": "STSTEST7()", +"f839dc62": "pauseWork(uint256)", +"f839eb1a": "Referral(uint256,address,address,address)", +"f83a4c8a": "claimBet(uint8,uint8)", +"f83a768d": "addDiceRoll(uint256,uint256)", +"f83b5dce": "ec()", +"f83c4f82": "enableCirculation()", +"f83c6f64": "MIATOKEN()", +"f83ce05d": "deauthorizeBurnRequester(address)", +"f83d08ba": "lock()", +"f83d14e6": "buySketch(uint256)", +"f83d69db": "intMin(int256)", +"f83d96c1": "InsuranceAgent()", +"f83e3f5a": "SetProjectName(string)", +"f83e5793": "caged()", +"f83e9a20": "lock_period()", +"f83eb5dc": "forcedRefund(address)", +"f83fcdea": "setPrice(uint256,uint256,address)", +"f84038b1": "getMinimumContribution()", +"f8407634": "checkFunderAccount(address,address)", +"f8408a8d": "Funding_Setting_cashback_time_start()", +"f843545c": "active_payable()", +"f843b1b6": "singleWithdraw()", +"f843d4ec": "setEthereumBalance(uint256,bool)", +"f843dad6": "phaseTwoEnd()", +"f843ea4d": "updatePhaseSupplyAndBalance(uint256)", +"f843ebb1": "runTests(address,address)", +"f844a9f4": "requestArbitration(bytes32,uint256,address,address)", +"f84501e0": "prosperaTokenAddress()", +"f84564f6": "RGTOKEN()", +"f845862f": "newUser(bytes32)", +"f8465534": "removeFromSendAllowed(address)", +"f8469646": "slice(address[],uint256,uint256)", +"f847b16d": "INAToken()", +"f848091a": "claimERC20(address,address,uint256)", +"f8482ca5": "Payroll()", +"f848d541": "withdrawLimit()", +"f84907d7": "tokens_backed(address)", +"f849acb8": "overrideLock(bool)", +"f84a0e74": "BSWCValueCirculateAssets()", +"f84a6519": "requiredDownPayment()", +"f84ad0fb": "ProvideWorkOrder(address,address,address,address,address,uint128)", +"f84af7f3": "isAssetIdOwnerOrApproved(address,uint256)", +"f84b2f51": "disqualified()", +"f84b624e": "ProjectCoin()", +"f84b903e": "distributed()", +"f84bcb11": "setEtherReceivers(address,address[])", +"f84ce165": "setEndStage1(uint256)", +"f84dcb1e": "CFToken()", +"f84ddf0b": "lastTokenId()", +"f84f30c4": "_isCorrectBuyin(uint256)", +"f84f420b": "getRandomNumber(address,uint256)", +"f84fce56": "isDraw()", +"f850a136": "get_lose_coefs()", +"f850a7a4": "_addUser(address,address)", +"f850b7f8": "ERC20YSLToken()", +"f851019a": "BONUS_50_100()", +"f8515cfc": "destroyFactory()", +"f8515eca": "Operable(address[])", +"f8516c6c": "groupPolicyInstance()", +"f851a440": "admin()", +"f8524236": "DeleteImage(uint256)", +"f852b976": "_updateState()", +"f853343d": "addStakeAD(uint256,address)", +"f8536b94": "participated(uint256,address)", +"f8538662": "signup(bytes32,bytes32)", +"f853ee49": "rateUSD()", +"f8542f5e": "getCopaCoreAddress()", +"f8548bea": "quarterFirst()", +"f8548e36": "transfer(uint256,address,uint256)", +"f854d74c": "withdrawCommunityTokens(address,uint256)", +"f856d605": "tokensPerEther()", +"f8570b01": "_newEpoch(uint256)", +"f85771b2": "removeManager(address,address)", +"f8579af8": "test_percPoints()", +"f8588593": "isSuperContract(address,address)", +"f85905ac": "testEqualityUint(int256)", +"f85a253f": "setTEx(address)", +"f85a3dea": "totalAmountOfEarlyPurchasesWithBonus()", +"f85aefba": "testBitsSetFailIndexOOB()", +"f85b2160": "recoverFailedLock()", +"f85c6b3b": "_safeGasCall(address,bytes)", +"f85cb0b5": "Start2()", +"f85cd33e": "timelockTokens()", +"f85d9cc7": "setReviveFee(uint256)", +"f85daa38": "authorityContractAddress()", +"f85e4854": "tokenIssuedPreSecondIco()", +"f85ef43b": "modifyPolicyAttribute(uint8,uint256,uint8)", +"f85f0972": "FoxicoPool(uint256,uint256,address)", +"f85f3b7f": "defaultIcoDeadline()", +"f85f8a3a": "BiTianToken()", +"f8605230": "getNewTeamPositionAndCheck(uint16,uint8,uint64)", +"f860a6d8": "withdrawlBalance()", +"f860e64a": "Lottery(uint256,uint256,uint256)", +"f8615d24": "getBio(address,bytes3)", +"f861d2bf": "MIRC()", +"f86282da": "doStateChanges()", +"f862d780": "addIn(address)", +"f862f6f4": "cap_nuru()", +"f86325ed": "BASE_PRICE()", +"f8635ece": "openSession()", +"f86418e5": "_privateSaleTransferFromOwner(address,uint256)", +"f864bc65": "lastBlock_a5Hash_uint256()", +"f864ca14": "withdrawToWallet(uint256)", +"f864e729": "getAvailableTokenForUser(address)", +"f8651d56": "Prether()", +"f868061e": "setICOExchangeRate(uint256)", +"f8688ddd": "setTargetFeePeriodDuration(uint256)", +"f869b11a": "declareVictor(uint256,uint256)", +"f869b3ff": "AdvisorsFund()", +"f86a3529": "totalStages()", +"f86a3eeb": "MyGaoguans()", +"f86a6334": "setCampaignStartDateById(bytes32,uint256)", +"f86abfd9": "mainSaleRateP4()", +"f86ae8b2": "TokenSaleStop()", +"f86b0669": "burner_addr()", +"f86b5ebc": "DANSSold()", +"f86c4354": "GovcTechnicalGases()", +"f86c8ed3": "blocksUntilNewPotentialWinner()", +"f86ccd41": "amountDeposited()", +"f86cd33d": "noThrowCall(address,bytes4)", +"f86da6ed": "checkTotalBets()", +"f86db133": "forwardWithRevert(address,uint256,bytes)", +"f86e898c": "hasMinCreatedOn(address,uint256,uint256)", +"f8702fe1": "calcFees(uint256,string,uint256)", +"f870849d": "GetBankerPrincipal(uint8)", +"f871cca9": "_check(uint8)", +"f871e0e1": "DutchAuction(address,address,address)", +"f8721a4e": "calcReturnValue(uint256,uint256)", +"f8721f1e": "nAlarms()", +"f8725493": "GCA1()", +"f872bec0": "sn()", +"f872c9dd": "Vote(address,string,uint256)", +"f872f047": "testControlMixItemStoreNotRegistered()", +"f8732d3e": "goodLuck(address,uint256)", +"f8737bc0": "nextUnlockTime()", +"f87394d6": "DonateEther()", +"f873d7e6": "initializeTrueUSD(uint256)", +"f8742a14": "hivePerUSD()", +"f87482e1": "changeMigrate(address)", +"f875c421": "delegateReferalTokens(address,uint88)", +"f876101c": "setConstantsContract(address)", +"f876250a": "getNumClonesInWild(uint256)", +"f876fe1a": "availableHavvens(address)", +"f8779524": "addNewGame(string,int8)", +"f87876c5": "resignFromMatch(uint256)", +"f8788382": "payService(uint256,uint32,string,uint64,uint64,uint64,uint64,uint64,uint64)", +"f8789e1a": "_createUnitHelper(uint256,address)", +"f878fcc2": "migrationAllowed()", +"f87aa82f": "_setBuyPrice(uint256)", +"f87aad3e": "SetAllLock(bool)", +"f87aba30": "placeBet(uint256,uint256,uint256,bool)", +"f87c77c0": "getVirtualChannel(bytes32)", +"f87d7236": "addCapFreeAddress(address)", +"f87e7446": "Houton()", +"f87eac7f": "lastBlock_v15()", +"f87f31c3": "mintMiniICOTokens(address,uint256)", +"f87f44b9": "setWebsite(string)", +"f87ffb74": "gameIdCntr()", +"f88001d4": "reopenSale()", +"f8801631": "getTotalDonateWEIInfo()", +"f8806544": "getBioLanguages(address)", +"f880f920": "calcMax()", +"f8811c36": "registerNewAccount(address)", +"f8811efd": "mintMonster(address,uint256)", +"f88218e0": "claimPheonix(address)", +"f8823353": "_isListed(address,address)", +"f88339a5": "CBOPToken(address)", +"f8833efd": "probabilities(uint256)", +"f88351d9": "getDividendsBalance(address)", +"f88371e8": "balancesLocked1Y()", +"f883dfb5": "initializeLevel()", +"f8840c38": "TopforceCoin(uint256,string,uint8,string)", +"f88489a6": "getBidIdsByToken(address)", +"f884e54a": "giveCat(bytes5,address)", +"f88573c8": "Administration()", +"f885eaf2": "returnAllowedTime()", +"f88607e4": "ICO_PRICE2()", +"f88649a1": "getLastWinner()", +"f8868778": "change(uint256[])", +"f886cbda": "reado()", +"f886e9b6": "removeRelation(address)", +"f8887cd3": "TransferToken(address,address,address,address,uint256)", +"f8895cc8": "schema()", +"f8896ea6": "Interim()", +"f8897945": "min()", +"f889ac54": "JP_sum()", +"f88a067f": "registerHotel(string)", +"f88a742b": "insertStage(uint8,uint256,uint256,uint256)", +"f88b07a3": "SoldToken()", +"f88b1f38": "balances6(uint256)", +"f88bf15a": "removeLiquidity(uint256,uint256,uint256,uint256)", +"f88bfe3e": "getCountStages()", +"f88cc87c": "decline(bytes32,bytes32)", +"f88cf827": "getVendorProducts(address,uint256,uint256,uint256,uint256,uint256,bool)", +"f88d2047": "cancelOrder(uint256,bool)", +"f88d6732": "dice(uint256)", +"f88d88e4": "address_book(bytes32)", +"f88e0b09": "getTransferValueValue()", +"f88e9fbf": "divide(uint256,uint256)", +"f88edaf2": "mMultiSigWallet()", +"f89005e7": "depositWithReference(string)", +"f8900ddd": "godAddress()", +"f89037a9": "TureTreasureChain()", +"f8907491": "isCollectionAllowed(bytes8,bytes8)", +"f890e286": "oracleOf(address)", +"f8910119": "AuctionStarted(uint256,uint256)", +"f8910241": "_getTokenAmountForBuyer(uint256,bool)", +"f892ee05": "subDevTwo()", +"f894d398": "withdraw_asset(uint32,address,uint256)", +"f894d957": "signedApproveCheck(address,address,uint256,uint256,uint256,bytes32,address)", +"f895436a": "setLotteryParameters(uint256,uint256,uint256,uint256,bool)", +"f8956a67": "getBonus(address,address,uint256)", +"f896503a": "getConfigAddress(bytes32)", +"f896680c": "testInitialEtherBalanceShouldBeZero()", +"f8975cd9": "ZanteCoin()", +"f8976385": "RokToken()", +"f897ae8c": "numEmptyIndexes()", +"f897c998": "lastSaleTime()", +"f897ebbc": "setDelegatedFromOperation()", +"f8981789": "setCompliance(address)", +"f8984677": "_calculateMinimumprice()", +"f898e574": "incentiveDistributionDate()", +"f898f8ab": "Escapable(address,address)", +"f8995981": "ABAS()", +"f899b607": "FxdCoin()", +"f899e9f3": "annihilateShares(address,uint256)", +"f89a053b": "setAccountFeeModifiers(address,uint256,uint256)", +"f89a5100": "RGP()", +"f89a77b1": "removeValidator(address,bool)", +"f89be593": "softcap()", +"f89ca001": "revealMove(bytes32,uint256,bytes32)", +"f89e4df3": "saleMilk(uint256,uint256)", +"f89e6512": "CMDCrowdsale()", +"f89ea906": "_refundExcess(address,uint256)", +"f89eae17": "testStop()", +"f89f0e44": "getMyDividendTokens()", +"f89f2a65": "addExchanger(address)", +"f89f3834": "getAccountChartDetailsByEntityId(address)", +"f89f74bf": "MATCHES_PER_ROUND()", +"f89f7cb3": "updateDrawPeriod(uint256)", +"f89fdabc": "TokenTransferContract(address,address)", +"f8a05d13": "transferLd(address,uint256,string)", +"f8a09cd0": "settlementDetails(uint64)", +"f8a0cdee": "addUserRewardPayouts(address,uint256)", +"f8a17d7f": "League(address,uint256)", +"f8a21631": "PrivateCoinSupply()", +"f8a321e1": "checkInvestorContribution(address)", +"f8a34b26": "presale(address,uint256)", +"f8a35b35": "maximumSubscription()", +"f8a39a6e": "test_twoTrueAssertNoMessage()", +"f8a3ce82": "resetSession()", +"f8a40b7d": "requestSetWithdrawalLimit(address,uint256,string)", +"f8a46568": "HashnodeProCoin()", +"f8a47213": "VnixNetwork()", +"f8a4cc33": "withdrawPoly(uint256)", +"f8a4e608": "verifiedKYCAddresses(address)", +"f8a5399a": "settleExtraToken(address)", +"f8a56efd": "balanceOfRaws(address)", +"f8a5a8dd": "getTranchesLength()", +"f8a6172e": "receiveToken(address,uint256,address,bytes)", +"f8a6c595": "constructor(address)", +"f8a6fca8": "confirmImperfectReception(uint256)", +"f8a777f5": "batchCreateInternalDrawings()", +"f8a8fd6d": "test()", +"f8a9972a": "selectWinner20()", +"f8a9c6ae": "golix()", +"f8aa0a59": "updatebalance()", +"f8aa836b": "THRESHOLD2()", +"f8aabbd9": "makeTJs(address)", +"f8ab02dd": "isRefAvailable(address)", +"f8ab745e": "validTransfer(uint256)", +"f8abb93d": "hasVotedOnUpgradePoll(uint8,address)", +"f8abe7f2": "testSandwichOrder(uint256,address)", +"f8ac6570": "tokensBoughtInEarlybird()", +"f8ad69a8": "HetherToken()", +"f8adb686": "earlyBackerSupplyRemaining()", +"f8adccdb": "doPartnerShares(uint256)", +"f8aed03a": "btcsPortionTotal()", +"f8af2514": "IsItConstantinople()", +"f8af56b7": "_finish()", +"f8af9e6f": "setAdv(uint256,string,string)", +"f8b096bb": "setupRegion(uint256,uint256,uint256[],bool,uint8[128])", +"f8b0c0b6": "getTransferStat()", +"f8b10464": "pause_PRIVATESALE()", +"f8b11853": "getGenerationStartAt(uint256)", +"f8b14500": "EmissionProvider(address,address,address,uint256,uint256,uint256,uint256)", +"f8b1db8f": "donationBoxes(bytes32)", +"f8b28c26": "getSecretByHash(bytes32)", +"f8b2cb4f": "getBalance(address)", +"f8b2e259": "lowCapWei()", +"f8b332ad": "onpayInstallment(uint256,address,uint256)", +"f8b367c1": "categoryCap(uint256)", +"f8b3d3b1": "receiveInitialFunds()", +"f8b42f78": "getOrderBookKeys(uint256)", +"f8b45b06": "totalsData()", +"f8b4ab7a": "updateTotalSupply(uint256,uint256)", +"f8b4cfc6": "lock(uint8,uint256)", +"f8b4e080": "changeRateOfToken(uint256)", +"f8b542c8": "_0xPeriheliaToken()", +"f8b608a1": "addTournamentContender(address,uint256[])", +"f8b71c64": "rewardTo(address,uint256)", +"f8b746dd": "BdpEntryPoint(address[16],bytes8)", +"f8b89dfb": "setStep(uint8)", +"f8b91abe": "renounceManager()", +"f8b991e8": "firstRewardPeriodEndBlock()", +"f8ba7317": "sealManualMigration()", +"f8ba8e6a": "getAllowanceAmount(address)", +"f8bb201c": "setCroupier(address)", +"f8bb801d": "getTxIds(uint256,uint256,bool,bool)", +"f8bb9160": "TIGER()", +"f8bbca99": "multivestBuy(address,uint256,uint256)", +"f8bc0505": "left76(uint256)", +"f8bc8548": "getPOOL_edit_31()", +"f8bd4498": "AMOUNT_BASETEAM()", +"f8bd526e": "setCoinageContract(address)", +"f8bd71c7": "unstop()", +"f8bdbb60": "assertEq10(bytes10,bytes10)", +"f8bdc610": "_preProcessProposal(bytes32)", +"f8bdc9dd": "get_shares()", +"f8bf77ae": "managedContracts(uint256,address)", +"f8bfb34c": "getBorderValue(uint256)", +"f8c1c186": "isSale()", +"f8c206b0": "killFaucet(address,address,string,address)", +"f8c25c48": "changeCreatorBalance(uint256)", +"f8c28ce0": "releaseOperation()", +"f8c32ccb": "APG()", +"f8c34050": "priceIncrease()", +"f8c3a293": "ADVISORS_AND_PARTNERS_PER_CENT()", +"f8c439dc": "ETH_EUR()", +"f8c46eff": "FinalizableToken(string,string,uint8,uint256)", +"f8c4892f": "transferProxy(address,address,uint256,uint256,uint8,bytes32,bytes32,string)", +"f8c4ab92": "getNewCumulativeAllowance()", +"f8c52125": "deriveMarketCreatorFeeAmount(uint256)", +"f8c587ac": "paper()", +"f8c5e217": "getSellRatio()", +"f8c64800": "signTwo()", +"f8c65bae": "Bgc(uint256,string,string)", +"f8c75351": "transferViaProxy(address,address,address,uint256)", +"f8c80d26": "privateCreation()", +"f8c8282b": "transfer_storage_ownership(address)", +"f8c8765e": "initialize(address,address,address,address)", +"f8c8de10": "stringToUint8(string)", +"f8c95160": "tokenEmission5(address,uint256,address,uint256,address,uint256,address,uint256,address,uint256)", +"f8ca3e22": "CustomCrowdsale(uint256,uint256,uint256,uint256,address,address)", +"f8ca9442": "getBalance_in_token()", +"f8cbd580": "freezeIndex(uint256)", +"f8cc1055": "transferCallership(address,uint256)", +"f8ccb027": "AdminTransferred(address,address)", +"f8ccbd38": "validPurchaseForManual()", +"f8ce3164": "accumulatedFee()", +"f8ce5894": "updatePrizePool(address)", +"f8cf0e1c": "unlockAddr(address)", +"f8d09593": "Kikicoin(uint256,string,string)", +"f8d1f5f0": "setProvider(uint8,address)", +"f8d29219": "fundingStartUnixTimestamp()", +"f8d29f8a": "hasProfilePicture(address,address)", +"f8d3277d": "removeFromWhitelist(address,address)", +"f8d3a26a": "QuasaCoinExchanger()", +"f8d3afa4": "numberOfTransactions()", +"f8d3e256": "publicLockEnd()", +"f8d420a1": "cancelGame(uint32)", +"f8d50542": "addToWhitelist(address[],uint256[])", +"f8d506e1": "TCNYCoin()", +"f8d578f0": "registerContribution(bytes32,address,uint256)", +"f8d599eb": "appendContribution(address,uint256)", +"f8d609b2": "assert_ex(bool)", +"f8d67506": "Shop(uint256,address)", +"f8d6b70a": "setAyantDroitEconomique_Compte_5(uint256)", +"f8d7f790": "COMMUNITY()", +"f8d86bbc": "setNewEndtime(address,uint256,uint256,uint256)", +"f8d93136": "Savings(uint256,uint256)", +"f8d95520": "extUnlockNinja(uint256,uint16)", +"f8d970b6": "checkTemplateRequirements(bytes32,bytes32,bool,uint8)", +"f8d988d6": "toExchange(address)", +"f8daa0ee": "transferGroupCommune(uint256,address)", +"f8dad3db": "MAXIMUMINVESTMENTSALLOWED()", +"f8db188b": "MeetToken()", +"f8db5d07": "unlockKyc(address)", +"f8db71b5": "getStatusContract(address)", +"f8dc11cc": "soldTokenInPublicsale()", +"f8dc5dd9": "removeOwner(address,address,uint256)", +"f8dcbddb": "setStep(uint256)", +"f8dcc3e0": "getLinkStatus(bytes32,address)", +"f8dcc9a9": "potato()", +"f8dd1764": "ClearToken(address,address,address,address,address)", +"f8ddd288": "s31(bytes1)", +"f8de2dfd": "destroyCoins(address,uint256)", +"f8dea17f": "startraffle()", +"f8df084d": "ZUR()", +"f8dfaa1e": "ret_img(uint256)", +"f8e0cc1c": "getPI_edit_32()", +"f8e1badd": "getCrowdsalePrice()", +"f8e1ec40": "CTOcoin()", +"f8e217c4": "getDivBalance(address)", +"f8e29885": "get_game_balance()", +"f8e2d041": "maxNumberMembers()", +"f8e2d4f9": "settleBetVerifi(uint256[],bytes32)", +"f8e2dc6a": "rangeOfBets(uint256,uint256)", +"f8e39177": "intrepidShipMinted()", +"f8e3aa92": "sendNugget(address,uint256)", +"f8e43382": "icoRunningStatus()", +"f8e4500a": "getTokenIssued(address)", +"f8e48488": "returnDevelopersCut(uint256)", +"f8e4ed5f": "escrowDecision(uint256,uint256,address)", +"f8e5521a": "getBlockHashOddOrEven(uint256)", +"f8e58024": "colors()", +"f8e65295": "storeIt(string)", +"f8e6a8cf": "payETH(address)", +"f8e6b331": "jtest()", +"f8e7577d": "FIBToken()", +"f8e76cc0": "_exists(uint256)", +"f8e8b93d": "setTrueUSD(address)", +"f8e8e035": "COSHACNYToken(address)", +"f8ea5daf": "withdrawalEnabled()", +"f8eac151": "Multiply(uint256,uint256)", +"f8ead7cf": "getUserAverageDividendRate(address)", +"f8eb5fc5": "getSalePrice(uint256)", +"f8ebabcd": "_setPixelBlockPrice(uint256,uint256,uint256)", +"f8ebf282": "changeHSShopPrice(uint256,uint256)", +"f8ec4bf2": "setAllowTransactions(bool)", +"f8ec4cd5": "withdrawBidForCollectible(uint256,uint256)", +"f8ec6911": "buyback()", +"f8ec7e83": "test_updateKey_zeroNewKey()", +"f8ecb558": "getFishByAddress(address)", +"f8ed0dfb": "setBuff(uint256,uint8,uint32)", +"f8eee5d6": "returnPaidBackBlock(uint256)", +"f8ef13f4": "EthbetToken()", +"f8ef9a3d": "getPaymentLog(uint256)", +"f8efaf2b": "partner_2_name()", +"f8efc03e": "approveWhitelisted(uint256)", +"f8eff67c": "takeInvest()", +"f8f079bb": "reserveAllocation()", +"f8f122ba": "numCompletedRequests()", +"f8f1939d": "PRESALE_TOKEN_CAP()", +"f8f1d927": "multiERC20TransferTightlyPacked(address,bytes32[])", +"f8f1f151": "testToAddress(bytes)", +"f8f2d5e4": "preIcoTokensCount()", +"f8f32de6": "revealAssertion(uint128,uint256,uint256,uint256,string)", +"f8f46b5f": "getCurrentMinerAddress()", +"f8f53ce7": "nestedSecondAnyToAny(uint256)", +"f8f5cefd": "updateNextMemberPayment(address,uint256,uint256)", +"f8f63375": "YXLToken()", +"f8f6773b": "calculatePurchaseBonus(uint256)", +"f8f6882e": "LavaWallet()", +"f8f6e080": "UnclaimedDividendTransfer(uint256,uint256)", +"f8f7312d": "ChangeBurnBoundsEvent(uint256,uint256)", +"f8f73808": "create(address[],uint256)", +"f8f8a912": "GetBalance()", +"f8f9271c": "changeRegistrationStatusForSilverWhiteList(address,bool)", +"f8f9456c": "CrowdsaleFactory(address)", +"f8f96a55": "lastBlock_v6Hash_uint256()", +"f8f9be36": "settlementRegistration(uint64)", +"f8f9da28": "borrowRatePerBlock()", +"f8fb1d0f": "countUsers()", +"f8fb1f07": "sponsorsOf(uint256)", +"f8fb3366": "stopPreSale()", +"f8fb491f": "setSaleAddress(address)", +"f8fb4ab7": "NBAT001(address,address,address,address,address)", +"f8fbdbb6": "getChkLockedTokens(address,uint256)", +"f8fc16ef": "minWeiToAccept()", +"f8fc6fcd": "QNBAI()", +"f8fc94aa": "refundTransactionAfterExpiryFee(uint256)", +"f8fd72ac": "getCompte_44()", +"f8fdebd3": "weiMaxCap()", +"f8fe2cb0": "toDepositCommitmentRecord(address,address,uint256,uint256,uint256)", +"f8fe2f9d": "KyberGenesisToken(address)", +"f8fe63b0": "getERC721Id(uint256,address)", +"f8ff612e": "WithdrawToHolder(address,uint256)", +"f8ffe42a": "SetCoefRew(uint256)", +"f900592a": "ToggleTransferAllowance(bool)", +"f900b5d6": "getUserTotalPaid(address,address)", +"f9010d19": "joinEvent()", +"f901a18f": "setSale(uint256,uint256)", +"f9020e33": "saleStatus()", +"f9039f33": "update_current_rate(uint256,string)", +"f904b9ff": "GXDHRPToken()", +"f9059832": "isSaleEnded()", +"f906a440": "getInvoice(string)", +"f9079685": "SPCoin()", +"f9081ba2": "safeContract()", +"f908326b": "payRewardForAddress(address,address)", +"f90836df": "_transferFundkeeper(address)", +"f9084729": "pvt_plmt_token_generated()", +"f9094303": "finishVoting()", +"f909640c": "InitialPriceDisable()", +"f909d60d": "getMinimumGasLimit()", +"f90a2f30": "usedNonce(address,uint256)", +"f90b2bfe": "dissolve(uint256)", +"f90b2e74": "setInitialTime()", +"f90c3f27": "FUNDING_PERIOD()", +"f90ce548": "SmartDeposit()", +"f90cf0a4": "Land(address)", +"f90ddee2": "tokenBurners(address)", +"f90e292c": "stage3Start()", +"f90f11b7": "withdrawNVTfromGame(uint256,uint256)", +"f90f3278": "resetUsername(string)", +"f90f4560": "placeBet()", +"f90f4a30": "Matthew()", +"f90fa5dd": "sendTokensToAdvisorsLock(address)", +"f910feaa": "safeTransfer()", +"f912e58c": "setPreCrowdsaleAddress(address)", +"f912ed00": "lockMe()", +"f913a879": "getBidsNum(address)", +"f913b919": "setAssetLevel(uint16,uint256)", +"f9146b2f": "newRefPayStation(address)", +"f9153fbc": "changeHouse(address)", +"f9154476": "__redeemAmount(address)", +"f915cf42": "MINIMUM_BET_VALUE()", +"f9163e64": "lockUpAmountStrOf(address,address)", +"f9172266": "setOldSeelToken(address)", +"f9174551": "cooperativeSettle(address,address,uint256,address,address,uint256,bytes,bytes)", +"f9177aad": "CreateFBL(address,uint256)", +"f9190fcc": "smartSponsor(address)", +"f9191b18": "revealVotes(address,bytes32,bytes32,address[],uint256[],uint256[])", +"f9195a30": "doFunding(bytes32,string,address,uint256,address)", +"f91a545b": "getLossTokenAmount()", +"f91a792e": "decryptHand(string,uint256,uint256,uint256)", +"f91b853b": "upgradeFrom2To3()", +"f91bb05a": "withdrawForeignTokensTo(address,address)", +"f91bcd76": "getMintForReportingParticipantAmountValue()", +"f91c022b": "secondTokenCap()", +"f91c26a5": "dLogN()", +"f91c339e": "calculateTxHash(address,address[],uint256[])", +"f91cb3d6": "proposalAvatar(bytes32)", +"f91d4db7": "TokenTracker(uint256)", +"f91e89db": "maxMonsterHit()", +"f91f681f": "targetFromBits(uint32)", +"f91f87f2": "tokenDistributionDuration()", +"f9215676": "paymentsByCustomer(uint128)", +"f921991c": "transferTokensWithOffsetAndLimit(uint256,uint256)", +"f922501a": "CRYPTOBULL()", +"f9226daf": "LogWithdrawal(address,uint256,uint256)", +"f922da7e": "addTokensToCampaign(bytes32,uint256)", +"f922f216": "disableERC20()", +"f923058c": "get_total_supply()", +"f923b8aa": "setBCY(uint256)", +"f9244a9b": "sendToMinter(uint256)", +"f9249fbf": "initiateTeamVesting(address)", +"f924c276": "fechStageIndexBySnapshotBlock(uint256)", +"f92561f3": "lambosBuildCount()", +"f9261d3f": "setProviderDetails(address,string,string,string,uint8,address)", +"f9268170": "setEdgePerPosition(uint256)", +"f926ac20": "totalInWei()", +"f9271fd3": "changeFundAddress(address)", +"f928655b": "transferA2B(address,address)", +"f92883a2": "mint(address,uint256,uint256,uint256,uint256)", +"f9297a40": "getPrice(bytes,int256)", +"f92a373b": "payForOption(address,address,address,uint256)", +"f92a69ec": "createPolicy(address,uint256,uint8,bytes32,bytes32)", +"f92a73d7": "ICONIQ_SALE_CLOSING_TIME()", +"f92a7595": "fxpMul(int256,int256,int256)", +"f92a79ff": "getExecutor(bytes)", +"f92a9de5": "developmentFunds()", +"f92abed9": "GetEvaluate(uint32,uint8)", +"f92ad219": "initialize(address,uint256,uint256,uint256,uint256)", +"f92b359a": "instrumentManifest()", +"f92b9dc7": "TVThreshold()", +"f92bb8c9": "getConfigUint(bytes32)", +"f92c33f7": "EventLuckyNumberRevealed(address,uint256,uint256,address)", +"f92c45b7": "reservedAmount()", +"f92c6bb6": "getGuessStatus(uint256,uint256)", +"f92c9b47": "TOKENS_FUTURE()", +"f92caf3a": "UploadIMG()", +"f92cd2b2": "airdropTokensBatch(address[],uint256[])", +"f92ec991": "preEtherReceived()", +"f92fff12": "requestEtherToUSD(bool,uint256,uint256)", +"f9307837": "setMaxcap(uint256)", +"f930a3d2": "presaleMint(address,uint256,uint256)", +"f9319a88": "SECOND_TIER_RATE()", +"f931eaef": "untokenizeProperty(string)", +"f931edb4": "ClaimedTokens(address,address,uint256)", +"f93231ba": "GetAskingTokenMutiplier()", +"f932380e": "RoyalPanties(uint256,string,string)", +"f9323a32": "_selling()", +"f9324c5f": "EarlyBird(bool)", +"f9327b9f": "preSaleDeadline()", +"f933b844": "_addToVesting(address,address,uint256,uint256)", +"f9355dca": "functionFour()", +"f93589ce": "didWin(bytes)", +"f935ae8b": "requestExchangeRate(string,string)", +"f935fd94": "WeiTransfer(address,uint256)", +"f937a6eb": "setLockup_investors(address,uint256,uint256)", +"f938075c": "weiToRecoverPreICO(address)", +"f9391d24": "AllPayAuction()", +"f939499d": "backupfarmSingle(address,address,uint256)", +"f9394c10": "getCarrotCredits()", +"f93a2109": "ADT()", +"f93a8d96": "EtheeraCrowdsale(uint256,address)", +"f93acbe9": "SubBankerProfit(uint8,uint256)", +"f93af357": "updateSigners(address,bool)", +"f93b4466": "LudumToken(address,address,address,address)", +"f93ca568": "ActualQueue()", +"f93d029a": "sendICOByOwner(address,uint256)", +"f93de2c3": "updateMinimumQuota(uint256)", +"f93e2d31": "adminEditCity(uint16,string,uint256,address)", +"f93e6715": "freeUntilDate()", +"f93ee24c": "addMinerTokens(uint32,address[],uint32[])", +"f93f1391": "getPokemonBetTimes(uint256)", +"f93f1b02": "incByTwo()", +"f93f7ab5": "saleRateFirstDay()", +"f93f9a76": "WhitelistUpdated(address,bool)", +"f93fc97b": "test_updateKey_increaseNoHint(int256)", +"f940e385": "withdraw(address,address)", +"f9419088": "mintNonFungible(uint256,address[])", +"f941c01a": "getOwnerToken()", +"f942be1c": "endDayOneTime()", +"f9432517": "transferLimit()", +"f94497fe": "testCreateWithParentsForeign0()", +"f944f4c7": "removeUser()", +"f9454f3f": "register(address,uint256,uint256)", +"f9455301": "setHoldTime(uint256)", +"f945b274": "jackpotTokenEthRate()", +"f945ba2d": "avatarFee()", +"f945e8b2": "getCurrentRound(uint256,uint256)", +"f946372c": "TOKENS_SALE_HARD_CAP()", +"f946d61c": "logReputationTokensTransferredCalled()", +"f94789bf": "KungfuToken()", +"f948d276": "changeShare(address,uint256)", +"f948e51a": "implementation2()", +"f949116d": "ICDCap()", +"f94a3223": "submitCro(bytes32,bytes32)", +"f94a360d": "MAXIMUM_BET_SIZE()", +"f94aa8bf": "BliBliToken(address,uint256)", +"f94b97c9": "IntoQueue(address,address)", +"f94c12cb": "cancelPendingChange()", +"f94c81c3": "RobotTradingToken(address)", +"f94c9e13": "getChannelInfo(address,address)", +"f94d2d44": "formatNumber(uint24,uint256)", +"f94d71a0": "unregisterObserver(address)", +"f94d7a10": "setTransferFromWhiteList(address,bool)", +"f94df54f": "importersBanksLetterOfCredit()", +"f94df678": "getAuthorizedEditAgents()", +"f94df97f": "Lotery(uint256,uint256,uint256,uint256,address,uint256)", +"f94e08d0": "queryWaitingTime()", +"f94e45de": "Scaltinof()", +"f94f04e4": "sendPresaleTokens(address,uint256)", +"f94f1e9a": "LifePasswordAI()", +"f94f6910": "POINTS_TO_LEVEL()", +"f9500927": "eth_amount_judgment(uint8)", +"f950db2b": "unfreezeUpgrade()", +"f951410d": "setBcouponTransferCost(uint256)", +"f9514ec9": "ApprovedBy(address)", +"f9515f1b": "addGroup(address)", +"f951f856": "getPeriodTotalReceived(uint256)", +"f952279e": "cancelOffer(bytes32)", +"f952f938": "CreateCreature(uint256,address)", +"f953927e": "openRoom(uint256,uint256,address)", +"f95440ba": "decimalPoints(bytes32)", +"f954501f": "validRouletteBetData(bytes,uint256)", +"f95547fa": "getGameFees(uint256)", +"f9565aec": "NewTokenGrant(address,address,uint256,uint256)", +"f9566392": "WeightedSubmission()", +"f956a1b5": "EthereumPinkToken()", +"f956c139": "getMatchIndex(uint256)", +"f956ecde": "invalidatePurchase(uint256)", +"f956fc52": "didWithdrawCollateral(bytes32,address,uint256)", +"f957417e": "activateToken()", +"f957ddba": "withdrawAllFrom(address)", +"f958530f": "bountyTransferToken(address[],uint256[])", +"f9586eaa": "setScouponAllocationFactor(uint256)", +"f9587219": "SetPetCardDataContact(address)", +"f9589eb3": "onceOuttime()", +"f95918eb": "indexOfUserInfo(uint256)", +"f959300b": "calculateSetupAllowedUntil(uint256)", +"f959fe4b": "admin_set_dividend(address,bool)", +"f95a5504": "buyandearn(uint256)", +"f95a77e5": "MALCoin(uint256,string,string)", +"f95a78fd": "milestone(uint64)", +"f95af64c": "freezeUpdateTokenAccount(address,bool)", +"f95af865": "selfWithdrawBalance()", +"f95afe2c": "getPortion(uint256)", +"f95b4309": "get_selected_player()", +"f95b5a58": "getInitialAnswer(uint256)", +"f95b5e0d": "mintTokensWithReferal(address,address,uint256)", +"f95bbc9c": "activeValueBonus()", +"f95c1a73": "allocationForESCBbyStage()", +"f95e0a54": "update(uint256,string,string)", +"f95e6306": "processInterval()", +"f95fbf67": "registerBarcode(bytes32,string,string,string,string,string,string)", +"f95fe2e7": "AddNewChallenge(uint256,uint256,uint256,uint256,bool)", +"f9609f08": "deposit(address,address)", +"f9614ac5": "content(string,address,uint256)", +"f9616bfa": "AidEvaCoin()", +"f9618364": "DGDb_Auction(address,address,address,address,uint256)", +"f9619147": "InbestDistribution(uint256,address)", +"f9639d80": "getCanAcceptAmount(address)", +"f963aac6": "CONFIG_MAX_PLAYERS()", +"f96512cc": "createPerDay()", +"f9654378": "TokenWithValidityPeriod(string,string,uint8,uint256,address,string,address)", +"f965e32e": "changeValue(uint256)", +"f9660347": "fetchAllBlocks()", +"f9662c8f": "returnInterest(uint256)", +"f966ade7": "repayLoan()", +"f9672443": "getMyEntityParents(uint256)", +"f9672820": "distributeARTTokenBatch(uint256)", +"f9676db4": "purchaseWithDai(uint256,uint256,uint256,uint256,address,bytes)", +"f96777d4": "payJackpotToWinner(address,uint256)", +"f9677e22": "computeSecret(uint256,address,address)", +"f96803d3": "getJobInvoicesByStatus(address,uint256,uint8)", +"f9683828": "coinback(uint256)", +"f968adbe": "maxPerTx()", +"f968f493": "unlockTokens()", +"f96a181e": "getContact(address)", +"f96abf0c": "deleteCrowdsaleContract(address)", +"f96b636d": "GILLIONTOKEN()", +"f96c166c": "isInPresalePhase()", +"f96cecc1": "returnAmount(address,uint256,bytes32)", +"f96d1c94": "closeStage()", +"f96ddf7a": "getSigner(bytes32,uint8,bytes32,bytes32)", +"f96eb003": "migrateManual(address)", +"f96f143e": "RELEASE_GAS_FEES()", +"f96f2fa1": "Shareable(address[],uint256)", +"f9706844": "recommendFundToPlayer(uint256,address,uint256)", +"f970bbfc": "removeDiscountStruct(uint256)", +"f97110a3": "getDeployedBlogs()", +"f9715458": "minActivatedToken()", +"f9718fc8": "returnTokens()", +"f971b054": "StoxSmartToken()", +"f972e2bf": "dateTransferable()", +"f974a1a2": "PURCHASE_AMOUNT_UNIT()", +"f974ae3c": "PrivateSaleExchangeRate(uint256)", +"f975a024": "openNonceId()", +"f975f3a2": "INITIAL_TOKEN_SUPPLY()", +"f976104f": "revokeDelegate(address,address,bytes32,address)", +"f976c371": "ZLHToken()", +"f9778d0d": "fixPlayerCountryId(uint256,uint256)", +"f9781eae": "test_curators()", +"f9782191": "fifth()", +"f978e842": "_addAdmin(address)", +"f97944e0": "CREATE_AMOUNT()", +"f9794660": "finneyToWei(uint256)", +"f9795a95": "minSlippageFactorInBps()", +"f979764d": "blockDotNumber()", +"f97a02fa": "inActive()", +"f97a9d38": "bonusSubscription()", +"f97b392a": "unregisterEmployee(address)", +"f97b65da": "closeShortPosition()", +"f97b7390": "getCurrentDiscountTrancheIndex()", +"f97bf9e4": "close(address,uint256,uint256,bytes)", +"f97c72b1": "_onBall(uint8,uint8,uint8,uint8,uint8[3][3][31])", +"f97cebed": "BellaStandardToken(uint256,string,uint8,string)", +"f97d0591": "parseTimestamp(uint256)", +"f97d8aee": "WriteBond(uint256,address,address)", +"f97e17d9": "payRate()", +"f97ea6fc": "getIndicesWithClaimableTokensForSellers(address,address,address,uint256)", +"f97f8e17": "takeOrder(address,address[5],uint256[8],bytes32,uint8,bytes32,bytes32)", +"f97fa1bd": "FrozenTokenEvent(address,uint256)", +"f98038ee": "howManyDicks()", +"f980a012": "mainSaleRateP1()", +"f980e52d": "clam()", +"f98139be": "getCensuredByCount(uint16)", +"f98157bd": "GetDeadline()", +"f9819884": "toggleDeathConfirmationByProxy()", +"f981aaca": "addDeal(uint256,string,string,uint256,string,bytes32)", +"f981f0c0": "_getAddress(address,bytes32)", +"f9820cc1": "Nothing()", +"f983c0fa": "run1()", +"f98456d2": "unenableTransfers()", +"f9854bfc": "creditsBalanceOf(address)", +"f985779c": "sin(uint16)", +"f985f5fc": "authorized_createCard(uint256,uint256,address,address)", +"f9869165": "ELIPSToken()", +"f9870705": "getProject(address)", +"f98765b2": "BotRemoved(address)", +"f988279c": "isAce(uint8)", +"f9888687": "raiseethamount()", +"f9889f78": "batchTransferFixedAmount(address,address[],uint256)", +"f988da4a": "TopsToken(uint256,string,uint8,string)", +"f9892c28": "ProofOfStableCoin()", +"f98a4eca": "executeVote(uint256)", +"f98b19f4": "publishBatch(uint16,uint16,string,string,bytes3)", +"f98b26a9": "submitProposal(address,uint256,uint256)", +"f98bbc60": "commit(address,bytes32,bytes,bytes32,uint8,bytes32,bytes32)", +"f98c48c1": "setData_18(string)", +"f98cbf76": "closeEXORImports()", +"f98d28bb": "priorityWallet()", +"f98d7c75": "SALE_STAKE()", +"f98dbad0": "hashCompareWithLengthCheck(string)", +"f98e09a6": "listResources()", +"f98e17a7": "PerSellOver(uint16[])", +"f98e87ba": "hashedParameters()", +"f98eaa9c": "ClaimTokens(address,address,uint256)", +"f98f5b92": "setWhitelister(address)", +"f9900bbb": "reinvestGameDividend()", +"f99031a7": "isWhiteList(address)", +"f9907274": "allTokenAddress()", +"f9909915": "bulkStoreHeader(bytes,int256,bytes,int256)", +"f990b73b": "end_crowdsale()", +"f991a43f": "currentTadpoleOwner()", +"f992905d": "deployContracts(uint256,address)", +"f9937c2b": "getCertificateKeys()", +"f9938192": "reenduser()", +"f993bef3": "postDeadline()", +"f993d955": "BTC_SUISSE_TIER_3()", +"f9943133": "MeltingContract()", +"f99450b9": "getEOSIO_USERNAME(uint256)", +"f994789a": "proposeRewardsWithdrawal(address)", +"f994bffa": "addCard(string,string,uint8,string,string)", +"f99514e2": "noInputReturn()", +"f9952ecf": "changeBoat(address)", +"f9953de5": "addOrg(string)", +"f9956289": "PRESALE_OPENING_TIME()", +"f99638a5": "bTest()", +"f9965dbf": "giveBounty(address[],uint256)", +"f996c697": "THRESHOLD1()", +"f9974d9d": "calculateWineSellSimple(uint256)", +"f9977329": "CROWDSALE_AMOUNT()", +"f997e136": "safeAdd(int256,int256)", +"f997f0c1": "_minHouseEdge()", +"f997f7eb": "ojiletoken()", +"f998393c": "Icostart()", +"f9983a12": "GetMyInvestmentBalance()", +"f9991f33": "AddProject(uint256,address)", +"f999ad04": "CreatePCC(address,uint256)", +"f999eead": "donateToDivs()", +"f99b7f0b": "getAllMatches(uint256)", +"f99ca1ee": "productionOf(address)", +"f99ca808": "totalDonationsWithBonuses()", +"f99cc96e": "tokenMaxSupply()", +"f99d18eb": "VIUREFoundersTokenSale(uint256,uint256,address)", +"f99d948f": "gameExpirationTime()", +"f99e574b": "BCEK(uint256,string,string)", +"f99ebb71": "testFailUpdateLatestRevisionEnforceRevisions()", +"f99ec32c": "lastFreezeSeq(uint8)", +"f99ee846": "KEACoin(uint256,uint256)", +"f99f128c": "make_initial_deposit(uint256)", +"f99f977c": "bountyPercentOfTotal()", +"f99fc046": "dEthereumlotteryNet()", +"f99fddae": "isValidUser(address,uint256)", +"f99ff180": "readMail(uint256,bytes16)", +"f99ff4df": "paged(uint256,uint256)", +"f9a01e94": "mintReward(address,uint256,uint256,uint256,uint256,uint256)", +"f9a075dc": "releaseETH(uint256)", +"f9a0fcc7": "RequestEthereum(address,address)", +"f9a191c8": "giveDirectoryTokenAllowance(uint256,address,uint256)", +"f9a2916f": "getInitiated()", +"f9a2cbd5": "INTREPID_SHIP_LIMIT()", +"f9a32246": "_transferFromToICAPWithReference(address,bytes32,uint256,string,address)", +"f9a329a6": "toVault()", +"f9a381e2": "CurrentToken()", +"f9a3e07d": "getObjInfoWithBp(uint64)", +"f9a42b8b": "_updateSpaceshipPrice(uint256)", +"f9a56fd8": "GamersCoin1()", +"f9a57ae4": "notDistributedAmount()", +"f9a596dd": "validatePrograms(uint256[])", +"f9a6da0c": "pks()", +"f9a794ad": "EtherLovers()", +"f9a7a2ef": "named(bytes)", +"f9a7c906": "setBonusTokenRateLevelTwo(uint256)", +"f9a86856": "maxWeiSMSVerified()", +"f9a87d4f": "buyAllAmountBuyEth(address,address,uint256,address,uint256)", +"f9a8b0ba": "latchTotalFci(uint256)", +"f9a8b611": "moveUnsold(address)", +"f9a8c5b9": "teamSum()", +"f9a8e898": "slashReservedUsername(bytes,bytes32[])", +"f9a8f797": "setLatestContract(address)", +"f9a94d43": "finalisePreSale()", +"f9a94ecd": "SellTokenToRaj()", +"f9ab21e2": "indexOf(uint32[],uint32,bool)", +"f9ac71bf": "allowNorthPoleMinting()", +"f9add1b9": "ourLastWinner()", +"f9ae77ff": "supportNewPurge(address,address,uint256)", +"f9aef74e": "PureGold()", +"f9b04f72": "reinvestByProxy(address)", +"f9b07b9b": "TeikhosBounty()", +"f9b16430": "HonestisNetworkETHpreICO()", +"f9b18e72": "RentableProvider(string,string)", +"f9b207f6": "Teepee()", +"f9b220f4": "modify_uint8(uint8)", +"f9b290b6": "PDPCointoken()", +"f9b2b19a": "getCns()", +"f9b2d1ee": "buyForFriend(address)", +"f9b2ec8e": "MinStarIndexAvailable()", +"f9b35ca3": "seed_traded_token()", +"f9b3e7f0": "hashAccountId(string)", +"f9b41139": "getBoxCount(uint16)", +"f9b4257d": "newXcat(bytes32,address,string,uint256,string,uint256,uint256)", +"f9b4d63a": "ownerOff(address)", +"f9b5c633": "ICONClassicToken()", +"f9b646db": "isTokenType(address,uint256)", +"f9b6b0c4": "create(address,uint256,uint256,uint256,uint256)", +"f9b71e73": "tankImposedMax()", +"f9b7fb56": "MarketboardListingBuyback(address,uint256)", +"f9b83323": "getNumberOfChecks()", +"f9b8659f": "detach(uint32,int256)", +"f9b87d40": "setKeys(uint32,bytes32,bytes32,uint32)", +"f9b8d639": "getMemberBonus(address)", +"f9b9a626": "getTotalWithdraws()", +"f9ba134d": "subtractAmount(address,uint256,uint256)", +"f9baa6ec": "freezingAgent(address)", +"f9bacc1c": "totalBonuses()", +"f9bb656b": "crowdSaleState()", +"f9bb84f5": "areWeekdaysOpen(uint256[],uint256[],uint256,uint256)", +"f9bbcc6d": "setMinVoteWeightK(uint256)", +"f9bcb4b1": "symbolLocked()", +"f9bd9338": "onFrozenAccount(address,bool)", +"f9be029f": "disableWhitelistAddress(address)", +"f9be437a": "UpdateTokenAddress(address)", +"f9befdef": "ownerSetGasLimit(uint256)", +"f9bfc71b": "mulUIntValue(bytes32,uint256)", +"f9bffc0f": "phID_()", +"f9c113cb": "ReadContent(string)", +"f9c12dda": "collectAll(uint8)", +"f9c1437e": "test5_searchAcrossNodes()", +"f9c15f94": "sendStableReward(address,address,uint256)", +"f9c1a197": "TransferEthToAddr(address,uint256)", +"f9c29e66": "hashOrder_(address[7],uint256[7],uint8,uint8,uint8,bytes,bytes,bytes)", +"f9c38ebf": "APTest1()", +"f9c397f8": "VoteInOrganizationScheme()", +"f9c3a68e": "setminimumAmount(uint256)", +"f9c447a9": "PurchasedTokens(address,uint256)", +"f9c4fb94": "addallbuy(address[],uint256[],address,uint256)", +"f9c58926": "_emitJobOfferPosted(uint256,address,uint256,uint256,uint256)", +"f9c5e0aa": "updateAttribute(bytes32,bytes32)", +"f9c6046a": "setForDutchSale(uint256,uint256,uint256)", +"f9c638ea": "globalMin()", +"f9c71f79": "isEquipedAny3(address,uint256,uint256,uint256)", +"f9c78097": "betToken(address)", +"f9c809fe": "addTip(address,bytes32,uint256)", +"f9c811f1": "regWL(address,uint256)", +"f9c8dec3": "KYC_ROLE()", +"f9c926c1": "has(address,address)", +"f9c935cf": "discountValue5()", +"f9c9b9de": "ExperimentalToken()", +"f9cb1b48": "getTotalInvestment()", +"f9cb6d7a": "reservedTokensAreDistributed()", +"f9cbcef0": "setStages(uint32[],uint8[],uint32[])", +"f9cbec43": "transferLandToEstate(int256,int256,uint256)", +"f9cc0605": "getAvailable()", +"f9cc2e66": "setPlatformFeePer10000(uint256)", +"f9cc6fce": "TestIOTACoin()", +"f9cd3ceb": "oracleFee()", +"f9cdbc4e": "paySmartContract(bytes32,uint256[])", +"f9ce67dd": "compareToIgnoreCase(string,string)", +"f9ce733b": "Pets()", +"f9ce7813": "transfer(address,address,uint256,address)", +"f9cee7b5": "totalScammedQuantity()", +"f9d09126": "updateTopicAssetClass(bytes15,bytes15)", +"f9d0fed4": "allowanceProvider()", +"f9d13bf0": "validate(address[4],address,uint256[12],uint256,uint256)", +"f9d176b4": "setManualWithdraw(bool)", +"f9d20590": "distributeFinancialAward(bytes12,int256,bytes12)", +"f9d38868": "exy()", +"f9d3b4e9": "obol()", +"f9d429ee": "NO_BATTLE_LOG()", +"f9d49797": "whitelistMaxWei(address)", +"f9d53ac8": "addPaper(address)", +"f9d593c8": "setNAVAdmin(address,address)", +"f9d5b4bb": "LogContribution(address,uint256,uint256,uint8,uint8)", +"f9d5e08b": "adminUsrCount()", +"f9d630a1": "TUI_ALLOCATION()", +"f9d6de48": "WALLET_LB_COMMUNITY()", +"f9d70200": "buyCrystal(uint256,uint256)", +"f9d75f25": "editDailyLimit(uint256)", +"f9d7f0fc": "CSES2()", +"f9d80dcd": "getInstanceImplementation(bytes32)", +"f9d8241c": "renterExists(address)", +"f9dbe5e9": "_updateStage(uint256,uint256)", +"f9dc0793": "getCustomerBankName(string)", +"f9dc5d43": "getAllPayment(uint256)", +"f9dca989": "becomeOwner()", +"f9dcef27": "cityPoolCutPercentage()", +"f9df65eb": "nullified()", +"f9df6c33": "calculateTokensAmount(uint256,bool)", +"f9df816a": "changeWhitelistPrivateStatuses(address[],bool)", +"f9dfa4a3": "setMaximumEtherToAccept(uint256)", +"f9dfb361": "preSaleStartBlock()", +"f9dfcfcc": "transferContract(address,address,address)", +"f9dfd0a5": "Token(address,string,string,uint8,uint256)", +"f9dfea54": "relockGroup(uint256)", +"f9dfecb9": "preICOTokens(uint256,uint256)", +"f9e0093d": "multiWithdraw(address[])", +"f9e05ed9": "sha(uint128)", +"f9e13de4": "doMigration(uint256,uint256)", +"f9e19fa5": "resetState()", +"f9e1ceda": "getBalancePercentRate()", +"f9e24dc2": "balanceOfMineral()", +"f9e27106": "investmentEntryCost()", +"f9e37733": "_createUnicorn(address)", +"f9e3c1e9": "setNextAddr(address)", +"f9e40a21": "allWon()", +"f9e4fb34": "fundTransferIn(address,address,uint256)", +"f9e51b1d": "withdraw(uint128,string,uint32)", +"f9e54282": "dropUsername(bytes32)", +"f9e68952": "createDrone()", +"f9e73764": "airdropExecute(address,address[],uint256)", +"f9e84395": "unexempt(address)", +"f9e856ae": "oldE4RecycleBin()", +"f9e8ad7c": "isPreIcoStage()", +"f9e9d34a": "getUserRefBalance(address,address)", +"f9ea3a18": "getHTLCSpendingData(uint256,int256,bytes32)", +"f9ea8839": "AlphaMarketCoinExchanger(address[],address)", +"f9eab09f": "setChickenHunt(address)", +"f9eb4ee2": "APPROVAL(address,address)", +"f9eba935": "debit(string,uint256)", +"f9ebdc8b": "isConfirmed(bytes32,address,address)", +"f9ec2edb": "startNewBoss()", +"f9eec610": "next(string,string,string,string,string,string)", +"f9eee901": "setClaimTreshold(uint256)", +"f9ef04be": "free(address,bytes32,uint256)", +"f9ef2c7d": "HTC()", +"f9ef33ff": "walletOEM()", +"f9ef66f5": "getRoundWinnings(address,uint256)", +"f9f03556": "ERC20(uint256,string,string)", +"f9f0507f": "timeLockedStart()", +"f9f14f6a": "library14function()", +"f9f16ef2": "numberOfTokens()", +"f9f20540": "setInvestTokenLimit(uint256)", +"f9f22d6c": "createNamespace(string,address)", +"f9f286f9": "setMultisigMain(address)", +"f9f2c161": "setGod(address)", +"f9f2c93c": "santaClaus()", +"f9f2ecb6": "getExtendAddr(address)", +"f9f39a9c": "initialize_bannable(address)", +"f9f411d8": "userTokens(address,uint256)", +"f9f447eb": "getCallDataHash(bytes32)", +"f9f53be0": "ChangeAmountPrice(uint256)", +"f9f5e8c8": "changeToCoin(address,address,uint256)", +"f9f71423": "increasePlayersGooProduction(uint256)", +"f9f73135": "get_heap(uint256)", +"f9f7d9de": "TOTAL_PERCRENTS()", +"f9f81a73": "setAccountCoords(string)", +"f9f86baf": "airdrop(address[],uint256[],uint8)", +"f9f8b586": "JMToken()", +"f9f8bdb7": "currentRate()", +"f9f8f895": "switchOn()", +"f9f90a60": "durationInBlocks()", +"f9f92be4": "blacklist(address)", +"f9f94bc6": "bioUnlock(bytes32,uint8,bytes32,bytes32)", +"f9fae4f7": "TOKEN_CREATION_CAP()", +"f9fafb59": "LogBidFinal(address,uint256,uint256,uint256)", +"f9fb12ad": "TestXRPCoin()", +"f9fb3c95": "transferBonus(address,uint256)", +"f9fb452f": "productID()", +"f9fbd554": "test(string)", +"f9fc0d07": "processRewards()", +"f9fc4816": "withdrawAmountETH(uint256)", +"f9fd41d8": "setRevolution(address)", +"f9fd5250": "DOW_MON()", +"f9fef3b3": "withMod(uint256)", +"f9ff1378": "solicitaDevolucao()", +"f9ffabca": "NewAdmin(address,address)", +"fa003b2e": "SCCAIToken(address,address)", +"fa006d87": "newPlaySeed(address)", +"fa009e36": "xxx7Coin()", +"fa0196eb": "OsherCoinAward(uint256)", +"fa01dc06": "revoked(address)", +"fa01dd3c": "BRTToken()", +"fa02955f": "registerMeOnEther(string)", +"fa02c4b7": "approveTransfer(address,uint256)", +"fa02dcc1": "TankWithdrawAll()", +"fa030ef1": "baba()", +"fa03446c": "tokensFromEther()", +"fa036370": "Athereum()", +"fa043b0f": "checkSig(bytes32,bytes32,uint8,bytes32,bytes32,address)", +"fa044862": "requireOk(bytes1)", +"fa048a18": "addHpbNode(address,bytes32,bytes32)", +"fa05064e": "setBountyDistributionContract(address)", +"fa058795": "logAdr(address)", +"fa061d48": "isReadyToSynthesize(uint256)", +"fa066fbd": "AccountGasLimitReached()", +"fa07153a": "commitVote(uint256,bytes32,uint256)", +"fa097028": "_burnRemainingTokens()", +"fa09cb30": "PatCoin()", +"fa09e630": "withdrawAll(address)", +"fa0a6cfe": "AFEBToken()", +"fa0a8f26": "calculateNextPrice(uint256,uint8)", +"fa0b5e55": "registerUser(address,uint256)", +"fa0b6211": "hasRoundEnded()", +"fa0bad28": "onholdBalance()", +"fa0bc8e1": "ownerOfSocialIdentity(uint256,uint256)", +"fa0c3034": "GenoPay()", +"fa0c498e": "refundJobSponsorships(uint256,uint256)", +"fa0c76c5": "calcUserDivsAvailable(address)", +"fa0cdc81": "getManifestById(bytes32)", +"fa0d5b52": "BerryLakeCoin()", +"fa0d80fc": "icoDenominatorPrice()", +"fa0ff39f": "setDummy(uint256)", +"fa1026dd": "getCommitment(address)", +"fa107a41": "Cajutel(uint256,string,string,address,address,address,uint256,uint256)", +"fa113488": "setCMTForGas(uint256)", +"fa113773": "BlackSeaCoin()", +"fa1152f3": "MoregainCoin(uint256,string,string)", +"fa11c471": "holdsValidLicense(address)", +"fa12d782": "openGame()", +"fa130b68": "developer_edit_text_price(string)", +"fa133fdb": "massTransferTokens(address[],uint256)", +"fa13af97": "InServiceToken()", +"fa140e3d": "MitToken()", +"fa1456a9": "transferKROContractOwnership(address,string)", +"fa147e5e": "remainingTokensAndCost()", +"fa14df6b": "getChangeRecipientFee()", +"fa169ec8": "getHashDigest(string)", +"fa16ab6c": "Platform()", +"fa16c53b": "DiscrashCredit()", +"fa17a19d": "forceStand()", +"fa188644": "whitelist5Addresses(address[5])", +"fa188df2": "addMinter(address,address)", +"fa1896f4": "getOneTokenInWei()", +"fa18dd2b": "isSetupMode()", +"fa193a6e": "Voter()", +"fa198656": "roundingPercent(uint256,uint256,uint256)", +"fa1a5f59": "soldAmount()", +"fa1acb5c": "_startTime()", +"fa1ad09e": "fundTransferOut(address,address,uint256)", +"fa1b3eb8": "gamesOf(address)", +"fa1ba1e1": "burn(uint256,bool,uint256,uint256)", +"fa1bde89": "test_set_get_OraclizeCallback()", +"fa1c594e": "disableRegistryUpdate(bool)", +"fa1ca37e": "_transferCeo(address)", +"fa1cee57": "approveKNCRateRange(uint256)", +"fa1d9cf8": "getZoneTeller(bytes2,bytes16)", +"fa1db1e7": "SendResult(uint64,bytes32,bytes32)", +"fa1e4fcb": "holdoverBalance()", +"fa1eae3c": "newSchellingRound(bool)", +"fa1f919f": "pre_enddate()", +"fa2073ad": "getAnswerCounts()", +"fa208cc5": "KickTheCoin()", +"fa20e77d": "burntTokens()", +"fa212d37": "getCurrentMaximalDeposit()", +"fa2299ee": "soldSupply()", +"fa23023b": "lockSales()", +"fa233620": "RENTALTOKEN(uint256,string,string)", +"fa24e7a0": "xyjtoken(uint256,string,string)", +"fa255179": "getCheckResultMessage()", +"fa25fd57": "settleOrder(uint256,uint256)", +"fa26db7e": "setMinAllowedReservingPercentage(uint256)", +"fa26fe32": "delivery(string)", +"fa27e070": "removeProxyForSender(address,address)", +"fa28a6b6": "checkTrainingPrice(uint256,bool)", +"fa28ba0d": "validateReleaseLockfileURI(string)", +"fa29141b": "minSellAmount()", +"fa292c44": "BitcoinPower()", +"fa2a68d2": "QToken()", +"fa2a8997": "isReleased()", +"fa2a9be6": "createPoll(bytes,uint16,uint256,uint256)", +"fa2acd87": "G(uint64[16],uint256,uint256,uint256,uint256,uint64,uint64)", +"fa2af9da": "platformWallet()", +"fa2b579d": "at_percentile(uint256)", +"fa2b76e2": "tokenReserved2()", +"fa2c7f9b": "getLender(uint256)", +"fa2cac28": "rejectEthTransactionRequest()", +"fa2cc19e": "calculate_price(uint256,uint256)", +"fa2d7efa": "AdlasToken()", +"fa2d84b6": "addBlacklistAddress(address,address)", +"fa2dedec": "SATS_TO_TOKENS()", +"fa2e9db8": "sunsetWithdrawDate()", +"fa2f29b6": "claimEOSclassicFor(address)", +"fa2f3e9a": "numAccountsInfo()", +"fa2f7a8f": "renounceContract()", +"fa307fcb": "sendMultipleMessages(address[],string,string,uint256)", +"fa309571": "delegateGetTokens(address,uint256)", +"fa30b251": "buyTicket(string)", +"fa314c67": "newAtomFee()", +"fa31b371": "deletePublicKey(bytes32,address)", +"fa31e684": "releaseTokensSaleCount()", +"fa3276bc": "isModifiedInRound(address,address,uint64)", +"fa332152": "giftSendIndex()", +"fa33bcf3": "isInList(address)", +"fa34b345": "walletsDelegate()", +"fa34b37b": "bonusPreviousOwner(uint256,uint256,uint256)", +"fa34da5e": "getTarget(bytes32,bytes4)", +"fa352dec": "tokensToEthereum_(uint256,uint256)", +"fa3559f7": "attestToContract(uint256,bool,string)", +"fa355d1c": "_distributeFloatWalletToken(uint256)", +"fa358c24": "refundPaused()", +"fa35a310": "Contributed(address,uint256,uint256)", +"fa35aa94": "deathData_f10()", +"fa36316e": "setFiatPerEthRate(uint256)", +"fa368e6d": "isWMSale()", +"fa369e66": "batchTransfer(bytes32[])", +"fa3754ca": "getCurrentDiscountRate()", +"fa37668f": "createContract(bytes32,bytes20,bytes20,uint256,uint256,uint256)", +"fa391c64": "isCompleted()", +"fa3a0f78": "getCreateMarketController()", +"fa3a3a7e": "DemoPreSale(uint256,uint256,address,address,address,uint256,uint256,uint256)", +"fa3b8f2c": "AdvertisementPayout(uint256)", +"fa3c6320": "intercrypto_recover()", +"fa3c8251": "TimeDecayingTokenEnvironment(uint256)", +"fa3c9bbc": "getHostRoomLists(address,address)", +"fa3e9b45": "setCreditDao(address)", +"fa3ed04d": "getDArbitraryData(bytes32,bytes)", +"fa3f1e99": "testBlobStoreRegistered()", +"fa3f5acf": "sendMsg(string,string)", +"fa3f998c": "redeem_deposit(uint256)", +"fa3fa196": "transferCreator(address)", +"fa404e34": "revokePoolRole(address)", +"fa407c19": "NRCToken()", +"fa40ce34": "addAllowedContracts(address[])", +"fa4125f7": "activateNextRound(uint256)", +"fa41fd32": "lastCallstopPreICO()", +"fa42f3e5": "map_address(string)", +"fa448f7a": "_handleAffiliate(address,uint256,uint256,uint256)", +"fa45858e": "changeSellPOPPrice(uint256,uint256)", +"fa45aa00": "executeWithdrawal()", +"fa461f33": "setValueStep2(uint256)", +"fa462e95": "mintStepPrice()", +"fa46b8b4": "SellRateChanged(uint256,uint256)", +"fa472bad": "SkillCoinTest()", +"fa47c564": "confirmERC20(bytes32)", +"fa48b4bf": "mintEtherBro()", +"fa48dfcd": "setLockup_jiedians(address,uint256,uint256)", +"fa49841d": "ownerAdmin()", +"fa49a13a": "Vulgus()", +"fa4a2e36": "ShyneTokens(uint256,string,string)", +"fa4a80f1": "Matrioska()", +"fa4ac15d": "withdrawAffVault(uint256,string)", +"fa4bb165": "setRoundNumber(uint256)", +"fa4c4271": "reClaimIFS(address)", +"fa4c5dc0": "addMessage(string,uint8,uint8,uint8)", +"fa4d0c3c": "lockDeadline()", +"fa4d300d": "ICOSplit()", +"fa4d3698": "setOwners(address[])", +"fa4de094": "KPOP_ARENA_CONTRACT_ADDRESS()", +"fa4e5e5a": "notify(uint8,string,string)", +"fa4f34a0": "GetChallengeTimings(uint256)", +"fa4f5511": "campaignUrl()", +"fa4f96c4": "ActivatedEvent(bool,bool)", +"fa4fb369": "addPreSaleTokens(address,uint256)", +"fa4feb65": "icoTokens()", +"fa5007cc": "getHold(uint256,bytes6)", +"fa502cf7": "addBidToStack()", +"fa5064be": "submitProposal(uint256,uint256,uint256,uint8,uint64,string)", +"fa5083fe": "getMaximumBetRate()", +"fa508d3e": "dnnToken()", +"fa509eda": "nextonetogetpaid()", +"fa509ff7": "collected_eth()", +"fa50b335": "IS_TIER_CONTRACT_MAGIC_NUMBER()", +"fa518054": "_addToWhitelist(address)", +"fa51a2bf": "setSupplyLock(bool)", +"fa51ae86": "RATE_CORNERSTONE()", +"fa5201e1": "LuckToken(uint256,string,string)", +"fa5252e4": "pbWinner()", +"fa52bcb3": "ICSTCrowSale()", +"fa52c7d8": "validators(address)", +"fa52caf6": "HECoin(address)", +"fa53bb1b": "setauctionother(uint256)", +"fa544161": "getOwner(address)", +"fa550659": "approvalForAll()", +"fa552d8e": "withdrawSale1()", +"fa556996": "TimeClock(string,uint256,uint256,uint256,uint256)", +"fa55afe2": "setABIHashForMod(bytes32,bytes)", +"fa55f4d4": "modifyEligibility(uint256)", +"fa566ddd": "doAllowance(address,address)", +"fa56780d": "getPurseContributions(uint256,uint256)", +"fa57e2ab": "resolved(bytes32,bytes32,uint256)", +"fa57ff82": "ownerSetJackpotToken(address,uint256,uint256,uint256)", +"fa58f510": "getFeeMake(uint256)", +"fa5919a8": "DAOSecurity(address,address,bytes32,uint256,uint256,uint128)", +"fa59d199": "removeHash(string)", +"fa5a1db6": "save(uint256,uint256,uint256)", +"fa5b344e": "assignSubMember(address,uint256)", +"fa5ba0f9": "stepPrice()", +"fa5bbcd2": "crowdsaleCreators(address)", +"fa5bc660": "offerDiscipleVend(uint256,uint256)", +"fa5be8f8": "setBonus(uint256,uint256,uint256)", +"fa5bfc1e": "claimedRewardHook(uint256,address,address,uint256)", +"fa5c0c70": "getSaleOrder(uint256)", +"fa5c5857": "createStakingContract(uint256,bool)", +"fa5cd179": "join_address(uint256)", +"fa5cdc2b": "OLTestSynatax()", +"fa5da441": "incrementedIndexOfName(string)", +"fa5e288c": "ABBC()", +"fa5ed321": "_pointToResolverAndResolve(bytes32,address)", +"fa5ef276": "getVotedData(address,uint256,address)", +"fa5f090b": "SmartIdeaTokenERC20(uint256,string,string)", +"fa5f2d80": "AOG(address,address,address,address,address,address,address)", +"fa607442": "timeOneSession()", +"fa608890": "withdrawRemainingRewards(uint256)", +"fa60a16e": "serviceAddressOf(address,uint256)", +"fa60fb0b": "getTxRoot(uint256)", +"fa6140dd": "weekPotLeader()", +"fa6171e4": "superMint(address,uint256)", +"fa62a1ff": "revokeAdminStatus(address)", +"fa640427": "setPermissionsProvider(address)", +"fa64dffa": "getDestQty(address,address,uint256,uint256)", +"fa65d336": "hasFreePlaces()", +"fa6669b7": "updateAccountData(uint256,uint16,bytes32,uint256,uint16,bytes32)", +"fa667907": "changeOwnerSharePerThousandForBuying(uint256)", +"fa66be4e": "countryLengthOf()", +"fa66e143": "employeeSignsToESOP()", +"fa671e5f": "deathData_v19()", +"fa671f6b": "validPurchaseIco(uint256)", +"fa6799f2": "revokeVesting(address,uint256)", +"fa67ae5a": "setBlockDelay(uint256)", +"fa67ba6f": "getSecondsTimeLockedByTx(uint256)", +"fa6878a7": "setBAB(bytes32,address,bytes)", +"fa68829a": "UnKoin()", +"fa68b4ce": "lookupISO3116_1_alpha_3(bytes)", +"fa691a26": "totalRoundsPassed()", +"fa695dd7": "createItem(string,uint256,uint256,bool,bool,string,uint256)", +"fa696d98": "ART_FOUNDATION_ADDRESS()", +"fa69ede9": "setNewRatesBase(uint256)", +"fa6a0712": "setOwnerPrice(uint128)", +"fa6ab63b": "getTokenSum()", +"fa6ac98e": "test_0_testBasicTxProposal()", +"fa6ad04c": "PRCT_BOUNTY()", +"fa6b129d": "tokenGenerationEvent(address)", +"fa6b535d": "deleteContact(bytes32,address)", +"fa6bdbf8": "_transfer(address,address,uint256,bytes)", +"fa6d373c": "LeaderHash()", +"fa6d8f1f": "callAndReward_1(string,string,uint256)", +"fa6e01a2": "ARTCToken()", +"fa6e5776": "haveExtension(string)", +"fa6ec547": "registeredAddress(address,bool)", +"fa6f3522": "EthimalFounderEggs()", +"fa6f3936": "isModerator(address)", +"fa6fc037": "prepareToBreed(uint256,bool,uint256,bool,uint256)", +"fa6fcc50": "_startBetBlock()", +"fa70466e": "getMonsters(uint16)", +"fa70f6da": "STRATToken()", +"fa712f71": "isBattleboardLive(uint16)", +"fa713023": "IEICrowdsale(uint256,uint256,uint256)", +"fa725ea3": "requireValidAddress(address)", +"fa7299f7": "getOwnerVirusLength(address)", +"fa729b5b": "CNY_Omnidollar()", +"fa72c53e": "providerFeePerEth()", +"fa73af0b": "GRANT_BATCH_SIZE()", +"fa73cb37": "ptxToken()", +"fa73f074": "useAddr()", +"fa76b253": "getAddressForAccount(string)", +"fa779bd6": "checkBalanceTier(address)", +"fa77c074": "shaThree(string)", +"fa785263": "checkRemoveOwnerArgs(uint256,uint256,uint256)", +"fa785928": "_revealBid(bytes32,address,uint256,address,bytes32,bytes32,uint256,uint256)", +"fa7860da": "etherHardCap()", +"fa78b172": "drawSecondaryWinners()", +"fa796124": "BitLumensCrowdsale(address,address)", +"fa796fa1": "CryptoZoo(address,address,address)", +"fa7a6cd3": "developer_string_symbol(string)", +"fa7ae620": "cryptaurReserveFund()", +"fa7af6fe": "investInternal(address,address)", +"fa7c31af": "withdrawCommunity(uint256)", +"fa7ca492": "preICOStats()", +"fa7d68f1": "getAccountInfo(uint256,uint256)", +"fa7e4eaa": "BELIBELA()", +"fa7e8f7c": "EtradeMarketsCoin()", +"fa7f6b96": "tokensLocked(address,uint256)", +"fa80918b": "computeNodeId(bytes,bytes)", +"fa81b200": "masterOfCeremony()", +"fa825185": "getChargers()", +"fa82b674": "ETHContract()", +"fa82e9fc": "organizer1()", +"fa83c01b": "setStopSendWebGift(bool)", +"fa848fb0": "startDayOneTime()", +"fa849243": "targetDiscountValue1()", +"fa85d33e": "istransferAllowed()", +"fa878e8f": "TOKEN_RATE_10_PERCENT_BONUS()", +"fa885329": "setTableSize(uint256)", +"fa885868": "addPreminer(address,address,uint256,uint256)", +"fa888c74": "callIt(uint256)", +"fa89401a": "refund(address)", +"fa894c08": "balanceWosPoolForSecondStage()", +"fa89ae7d": "ownerTransferEth(address,uint256)", +"fa8a3c1c": "rateC()", +"fa8a975d": "forcedTransferAll(address,address)", +"fa8ad6b9": "unsetIsRentByAtom(uint256)", +"fa8b72ff": "setBountyTokensWallet(address)", +"fa8b9a4b": "GetApplicant(uint256)", +"fa8dc33a": "checkRecordExists(bytes)", +"fa8ec0b2": "_transfer(address,address,uint256,string,uint256)", +"fa8edab6": "checkBalance(address,address,uint256,uint256)", +"fa8fc08d": "GxCoin(address)", +"fa8fd2b5": "LockRequestable()", +"fa90693b": "isBlockRedeemed(uint256)", +"fa912743": "feesStrategy()", +"fa922e66": "pickaxe()", +"fa923d10": "FutureCoin()", +"fa92fb6e": "IssueRejected(uint256)", +"fa93019c": "getBlocks(uint8,uint8)", +"fa93185f": "LockedDayRemoved(address,uint256,uint256)", +"fa93f883": "getMinute(uint256)", +"fa967415": "nextUpgradeMaster()", +"fa968eea": "minBetAmount()", +"fa96a49e": "totalSupplyUpgraded()", +"fa9768c9": "getOnMintAmountValue()", +"fa9789cf": "trainKitty(uint256)", +"fa984da8": "SujiToken()", +"fa985a2f": "p_update_mNewPlotDevPercent(uint256)", +"fa9907ad": "pay500Winners(uint256)", +"fa99d7ae": "enterDungeon(uint256[4],uint32)", +"fa9a4c35": "getPOOL_edit_21()", +"fa9acb05": "addressInArray(address,address)", +"fa9aecfb": "isUnowned(uint256)", +"fa9af30f": "getGoldXchgRate()", +"fa9b44b7": "PendingETHs(address[])", +"fa9ba8b4": "FunFaceToken()", +"fa9ce7e7": "moveTokensFromStockToExchange(uint256)", +"fa9d2352": "hasRequiredStateChanges()", +"fa9df423": "setShp(address)", +"fa9e6f11": "Exafire()", +"fa9e82cf": "uploadStartlist(uint256[])", +"fa9f117f": "setNextRoundMaxDonors(uint256)", +"fa9f245c": "CappedToken(uint256)", +"fa9fd8b2": "incremental(uint256,uint256)", +"faa06c06": "GetCityName(address)", +"faa0a264": "burnToken()", +"faa10f43": "require(bool)", +"faa1a8ff": "getOwnedBot(address,uint256)", +"faa3981a": "boolMemoryArray(bool)", +"faa458f4": "submittedHashes(bytes32,uint256,uint256)", +"faa51485": "isValidTraderAddress(address)", +"faa5369d": "getBorrowingItem(uint256)", +"faa5c564": "register(uint256,uint256,uint256)", +"faa5ca93": "erc20Buy(address,uint256,string,string)", +"faa5d0ea": "updAmountBonusEnabled(bool)", +"faa5e124": "ref_percent()", +"faa5e74a": "TokenPurchaseWithGuarantee(address,address,uint256,uint256)", +"faa62d3f": "setPercentageToLock(uint256)", +"faa679bf": "TraceToken()", +"faa7fc61": "bustRange()", +"faaa4d22": "distributePCY(address[],uint256,uint256)", +"faaa58da": "RemovePauser(address)", +"faaad90f": "getBlocksUntilNextRound()", +"faaad91d": "convertToPrimordial(uint256)", +"faab806f": "emergencyStopSale(address)", +"faab9d39": "setRegistrar(address)", +"faabc195": "updateContract(uint256,address,uint256)", +"faac90ec": "StorageFactory()", +"faacf0fd": "toChar(bytes1)", +"faad4a49": "setDividends(uint256,uint256)", +"faad6eb5": "updateAgent(address,bool)", +"faadb14a": "getCustomerTxPaymentKWh(address,bytes32)", +"faae4c17": "usernamesToAddresses(bytes32)", +"faaebd29": "Fight_Results(uint256,address,address,uint128,uint128,uint32,uint256,uint32,uint256,uint8)", +"faaf027b": "getAddressTokenSaleId(address,address)", +"faaf1921": "updateEthToCentsRateCycleStarted()", +"faaf71e6": "checkSoftCapOk()", +"faafa08f": "CatICO(address)", +"fab0568c": "GIFTToken(uint256,string,uint8,string)", +"fab14b36": "saleBalance()", +"fab18075": "numLots()", +"fab2c469": "getSlots()", +"fab2cb36": "totalSharesIssued()", +"fab2e425": "GAMESPLAYED()", +"fab2f86b": "stopVoting()", +"fab37154": "setMintAddress(address)", +"fab3be9a": "WETCToken()", +"fab3ebb1": "NULL_ENCRYPTION_ALGORITHM_DESCRIPTION_URI_SET_ID()", +"fab4087a": "parse(bytes)", +"fab425e7": "external_to_internal_block_number(uint256)", +"fab43cb1": "getPongAddress()", +"fab4969f": "amountRaisedPhase()", +"fab4cb39": "getWarrantyPrice(string,uint256,uint256,uint256)", +"fab55a49": "addr_forge()", +"fab57a21": "truebitAddress()", +"fab5ccb1": "submitBlock(bytes32,bytes)", +"fab67bb6": "hasNotEnded()", +"fab825c6": "setCanvasName(uint32,string)", +"fab88d39": "STS(uint256,string,uint8,string)", +"fab8cbe4": "splitTokensBeforeDistribution(uint256)", +"fab93805": "ballotLog(bytes32[2])", +"fab9b243": "isUpgradable(address,address,string)", +"fab9caaf": "JungleScratch(address)", +"fab9f0c4": "DigiWillToken()", +"faba1f16": "_createPow(string,address,uint256,uint256,uint256,uint256)", +"fabacf0d": "Yetxkd1601()", +"fabae696": "updatefxFee(uint256)", +"fabb25fa": "x_constructor(address)", +"fabb7952": "setPaintingName(uint256,string)", +"fabbdc5b": "COIN_COST_ICO_TIER_2()", +"fabc1cbc": "unpause(uint256)", +"fabcc880": "update(uint256,int256[2],uint256[2],int256,bytes32,address,uint256,uint256,uint256[3])", +"fabde80c": "coinBalance(address)", +"fabe1416": "canClaimToken()", +"fabec44a": "getCurrentVersion()", +"fabee62d": "taxTo(address)", +"fabefafe": "computePayout(uint256,address)", +"fabf00c3": "NewGrant(address,address,uint256)", +"fabf5ea5": "maxInvestedLimit()", +"fabf657a": "approveAddress(address)", +"fabfbefb": "lastPayoutIndex()", +"fac08874": "BPTestCoin()", +"fac20ab8": "getGameWinner(uint256)", +"fac2548b": "updateMember(address,uint256,bool,string)", +"fac28349": "setInvite(address,uint256,uint256)", +"fac2b5f8": "setEplay(address)", +"fac333ac": "ids(uint256)", +"fac34ff6": "throwFoo()", +"fac3a4db": "changeWithdrawableNetfRe(uint256)", +"fac3c1f4": "setOracleName(address,string)", +"fac416ab": "PriceThreeEnable()", +"fac50e4c": "StgTwobonusEnds()", +"fac5235b": "teamTokensAllocated()", +"fac52bfd": "my_name()", +"fac57fc9": "hasUpgraded(address)", +"fac5bb92": "getPreRelease(bytes32)", +"fac5fbc7": "ContractDisabled(uint256)", +"fac647cc": "testLongerJson()", +"fac65256": "wavesTokens()", +"fac66f01": "getConditions(uint256,uint256)", +"fac67cf6": "updateVIPRank(address)", +"fac6a8a2": "withdrawExchangesToken()", +"fac6fb16": "getVoteStatusFromProposal(uint256,address)", +"fac6fe0c": "level_6_percent()", +"fac78d83": "tierModifiable(uint256)", +"fac7abe3": "latestAuctionIndices(address,address)", +"fac7b20a": "maxCapTokenTotal()", +"fac8a800": "isTeller(address)", +"fac952c5": "getLastWithdraw()", +"fac97122": "ownerSetJackpotAddress(address)", +"fac9d2c7": "Blockkonnect()", +"faca7cfa": "prevBalance()", +"facaa838": "IsEscrowActive()", +"facb2195": "setIntF1(int256)", +"facbf93b": "totalBlocks()", +"facc7905": "unLockTime()", +"facce5bb": "wingsTokenRewards()", +"facd0934": "BONUS_250_500()", +"facd743b": "isValidator(address)", +"face030b": "SpinTheWheel(address)", +"face873f": "getAllActiveSales()", +"face9e8e": "hash_sha256(string,uint256)", +"facef32a": "IGI()", +"facf55e6": "getMyClones()", +"fad09ab3": "closeProvider(address)", +"fad09c3c": "DemoContract()", +"fad15673": "UmkaToken(string,string,uint8,uint256)", +"fad18e7b": "registerNameXaddrFromDapp(address,bytes32,address,bool,uint8)", +"fad239ac": "PermTokenTest()", +"fad356f8": "testTransferFromSelf()", +"fad35818": "calcInviterBenefit(uint256)", +"fad3f8f7": "maxPreSale()", +"fad4b99a": "updateChannelMinimum(address,uint256)", +"fad4e1f2": "getIDMapping(uint256,uint256)", +"fad5a2af": "isClosedAndValid()", +"fad6049b": "_transferFrom(uint256,address,uint256)", +"fad60615": "roundProfitByAddr(address,uint256)", +"fad774ee": "BONUS_LEVEL_2()", +"fad7ed8c": "_A_tokenSaleCompleted()", +"fad8200e": "userToNumCelebs(address)", +"fad88be7": "VOISE()", +"fad8b32a": "revokeOperator(address)", +"fad9100c": "FOMOed()", +"fad992ea": "claimINRDividends()", +"fad9aba3": "dust()", +"fad9bf9e": "storeBlockWithFeeAndRecipient(bytes,int256,int256,bytes,int256,int256)", +"fada2c18": "transferBond(uint256)", +"fada4b76": "quater3()", +"fada5da1": "collectEth()", +"fadc0700": "InitiateMakes()", +"fadc342e": "_checkRevenueFactor(uint256,uint256,uint256,uint256)", +"fadc51cf": "isAlpha(bytes1)", +"fadc554b": "updateNonClosingBalanceProof(uint256,address,address,bytes32,uint256,bytes32,bytes,bytes)", +"fadcd861": "createMarriage(string,string,string,string)", +"fadcf13c": "startBounty()", +"fadd3235": "gameEndBlock()", +"fadda208": "getMemberAdresse(uint256)", +"fadeb59c": "getListingDB(uint8)", +"fadf4cb2": "batchAssignTokens(address[],uint256[],bool[])", +"fadf4f3b": "GECToken(address,uint256)", +"fadf617b": "reveal(int128,string)", +"fadf87b1": "testGetBitsSuccess()", +"fae14192": "changeFeePercentage(uint256)", +"fae17e21": "createBid(uint256,address,address,address,uint256,uint256)", +"fae21f0a": "initBank()", +"fae24454": "removeFromManagementWhitelist(address)", +"fae25444": "getNumberOfOffers()", +"fae29ee8": "setWebInfo(string,string)", +"fae2dd4b": "myName()", +"fae429af": "NinjaCoinNC()", +"fae4a213": "buyWithAddressAndFunction(address,bytes4)", +"fae53222": "addPlayerGeneral(address,uint32,uint32,uint8)", +"fae59753": "transferOwnershipMessage(address)", +"fae6edcf": "getI2()", +"fae72303": "totalWeiRaisedDuringPhase3()", +"fae73549": "Burnt_Token()", +"fae8529a": "maxprice()", +"fae860db": "transferToLockedBalance(address,uint256,uint256,uint256,uint256,uint256,uint256)", +"fae8c29e": "setPromoPause()", +"fae8f9a2": "setInitialParent(int256,int256,int256,int256,int256,int256)", +"fae92612": "setMarketAddress(address)", +"fae95a71": "participationPresaleHistory(address)", +"fae9c6b3": "preICOTokenRemaining()", +"fae9d06d": "calculateTxFee(uint256,address)", +"faea1878": "cooRemoveCro(address)", +"faea624c": "VestTokens(address,uint256,uint256,uint256,bool,string,uint256)", +"faea9129": "Syndicate()", +"faed08a9": "reLoadXname(uint256)", +"faed1922": "purchaseWhaleCard()", +"faed77ab": "wipeAndFree(address,bytes32,uint256,uint256)", +"faed86ab": "strConcats(string,string,string,string)", +"faede6a1": "Y2_lockedTokenAmount()", +"faee13b9": "set(int8)", +"faee4402": "donateToWhale(uint256)", +"faee4a10": "initialBankroll()", +"faef2ad2": "getCategoryHash(address)", +"faeff650": "phase1TokenPriceInEth()", +"faf0952b": "testThrowRestartNotOwner()", +"faf21148": "ValoremICO()", +"faf236c7": "emitTokensFor(address,uint256,uint256,uint256)", +"faf27bca": "greeter(string)", +"faf3d174": "upgradeStart(address)", +"faf42125": "setTokenURIAffixes(string,string)", +"faf5115f": "setBank(address,address)", +"faf81ba5": "applyBonus(uint256,uint256)", +"faf87b8a": "payoutEF()", +"faf880ad": "SoftcapReached(address,uint256)", +"faf924cf": "proof()", +"faf95e3d": "PayForServiceETHEvent(address,uint256)", +"faf9859c": "NIU(uint256,string,uint8,string)", +"faf9b5cf": "mintSendTokens()", +"faf9f330": "accrueTeamTokens(address,address,uint256)", +"fafa4c82": "defaultTransferGas()", +"fafa8e1a": "removeDat(string)", +"fafaacfa": "hasConfirmed(bytes32,address,uint256)", +"fafb2330": "setPayout(uint256,uint256)", +"fafb3c7a": "giftCar(address,uint256,bool)", +"fafb76dd": "getOffsetIndex()", +"fafb9334": "roll_normal(address,uint256,uint256,bytes32,bytes32,bytes,bytes32,uint256)", +"fafbb62b": "create(string,string,uint8,uint256,address,string,address,address)", +"fafbb9a3": "getNextPayoutTime()", +"fafbcc08": "IBNZDEVELOPERSERC20_Crowdsale()", +"fafc56d9": "setStepTwoRate(uint256)", +"fafcdc34": "dist(address)", +"fafd2efb": "cashoutable(address,address)", +"fafd4bba": "RESERVED_TOKENS_FOR_CRYPTO_EXCHANGES()", +"fafd6bcb": "isConfirmedBy(bytes,address)", +"fafdb3af": "PlayerBalance(uint8,uint256,uint256)", +"fafe029f": "getWtotalTransCnt(uint8)", +"fafe0902": "gift_ClaimTINAmotleyLine(uint256)", +"fafe805e": "BLOCK_PER_PHASE()", +"fafe8845": "StateChanged(uint256,uint8)", +"faff50a8": "rootNode()", +"faff660e": "isPrivate()", +"fb007107": "CanMint(bool)", +"fb00cc67": "search_winner_bid_address(uint8)", +"fb00fec6": "getStatusForRootHash(bytes32)", +"fb0101c4": "getUserSpaceIds(uint256)", +"fb01badd": "companyShares()", +"fb01f4b1": "developerPrizeClaim()", +"fb02191c": "addRepo(bytes32,string)", +"fb03735e": "contractTokenReward()", +"fb03eaea": "getDisputeThresholdForFork()", +"fb048705": "itemOf(uint256)", +"fb04f22c": "secondReleaseDone()", +"fb054439": "canBearWith(uint256,uint256)", +"fb05594f": "STARTING_SHRIMP()", +"fb062a84": "offerOptionsToEmployeeOnlyExtra(address,uint32,uint32,uint32)", +"fb064161": "advisorsAllocation()", +"fb06603c": "modifyToken(address,uint256,string,string,string,string,bool)", +"fb070d0d": "CatFarmer()", +"fb0720dc": "icoStartP1()", +"fb072d2a": "random(uint256,uint8)", +"fb07ac86": "realPriceOracle()", +"fb083fdc": "EtherDelta()", +"fb088558": "contributeWithoutVesting()", +"fb08937c": "tokenTransfer(address,address,address,uint256)", +"fb08f3a1": "whitelistRequired()", +"fb08fdaa": "replaceContract(address)", +"fb099c84": "newInvestor()", +"fb09b1ac": "testBalanceOfReflectsTransfer()", +"fb09c964": "getXQU()", +"fb09db11": "setActiveWhitelist()", +"fb0a0344": "mockBuy()", +"fb0a2e3c": "buyerDecimals()", +"fb0a3867": "updateClientAddress()", +"fb0a8c62": "addGenerator()", +"fb0b0220": "outFromPool(uint256)", +"fb0b02cd": "destroyBucket(bytes32)", +"fb0b6b6d": "confirmTransactionByMediator(uint256)", +"fb0c0782": "buy2(uint256)", +"fb0c1faa": "LearnX()", +"fb0cf7ab": "getStagePrice(uint8)", +"fb0d7e43": "initialBonus()", +"fb0f6f42": "s1(bytes1)", +"fb0f9363": "getAuctions(address)", +"fb0f97a8": "depositToken(address,address,uint256)", +"fb0fcd8c": "triggerRselfdestructRefund()", +"fb101581": "transferToCharity(address)", +"fb10b0d3": "currentMaximumSalePercentage()", +"fb114f57": "oraclize_query(uint256,string,string[3],uint256)", +"fb11613e": "getGamesByDay(uint256)", +"fb1161f1": "bountyCap()", +"fb1291c3": "getPixels(bytes32)", +"fb12ee85": "amountOfOpenRFQs()", +"fb13a707": "changeVestingWhitelister(address)", +"fb13bfae": "getFreezeInfo(address)", +"fb1478e5": "changeSaleEndBlock(uint256)", +"fb14cbca": "check(bytes32,uint256,address,uint32,uint32,bytes32[])", +"fb14f058": "addVestingAdmin(address)", +"fb15e737": "boolToBytes32(bool,bool)", +"fb1641d6": "rejectGame(address,uint256)", +"fb1669ca": "setBalance(uint256)", +"fb1684f9": "lockTextKey(string,uint256)", +"fb171eac": "witdrawToken(address,uint256)", +"fb173712": "SetRate(address,address,uint256,uint256)", +"fb176b69": "paleyer1show(uint8,uint8,uint8,uint8,uint8)", +"fb17905f": "DemolishByCredits(uint256,uint256)", +"fb18962d": "setSoftwareTokensPercent(uint256)", +"fb1ace34": "notarize(bytes)", +"fb1ae783": "getWinnerTeam(uint256)", +"fb1bc4d7": "PsExToken()", +"fb1c3461": "_calculatePercent(uint256,uint256)", +"fb1ce13a": "TestEOSCoin()", +"fb1ce2ea": "NotifyMe(address,uint256)", +"fb1d8201": "addClaim(uint32,string,string,bytes)", +"fb1d9eea": "transferFundsTokens(address,address,uint256)", +"fb1db11f": "updateEarlyParticipantWhitelist(address,address,uint256)", +"fb1de995": "solveTask(uint256,uint256,uint256,int256,uint256,int256)", +"fb1e3804": "FULL_TOKEN_AMOUNT()", +"fb1e61ca": "getRequest(bytes32)", +"fb1f41f9": "info_OwnerTINAmotleyLine(uint256)", +"fb1fad50": "halt(uint256)", +"fb1fdc2e": "lengthNotEqual(address[],uint256,string)", +"fb2004f2": "BCOExtendedToken(address,string,string,uint256,uint256)", +"fb203f90": "ShopereumTokensPerEther()", +"fb20b70d": "setBonusDate2(uint256)", +"fb20d071": "registerVestingSchedule(address,address,uint256,uint256,uint256,uint256,uint256)", +"fb20d98f": "deleteEditor(address)", +"fb20dc80": "setPriceForVerification(uint256)", +"fb213549": "confirmApplication(address)", +"fb21364b": "allocate2ProjectToken()", +"fb214f4c": "presetGymTrainer()", +"fb218f5f": "storeData(string)", +"fb21eefd": "fwdData(address,bytes)", +"fb222d48": "extractVaultTokens(address,address)", +"fb236bba": "_deleteOffer(uint256)", +"fb237eb2": "isUserWhitelisted(address)", +"fb23bbb1": "BONUS_WINDOW_3_END_TIME()", +"fb241406": "RedPen()", +"fb25b62c": "LineToken()", +"fb2643c0": "DragonKing(address,address,uint8,uint8,uint8,uint16[],uint16[])", +"fb26c00f": "Treasury(address)", +"fb26c3f8": "minimumPresaleWeiDeposit()", +"fb26e2d8": "tgrStartBlock()", +"fb274654": "offerCollectibleForSaleToAddress(uint256,uint256,int256,uint256,address)", +"fb277a24": "testMintInvalid(int256)", +"fb27961c": "softCapAmount()", +"fb279ef3": "tip(uint256,address,uint256)", +"fb282a17": "distributeCallback(uint256,address[])", +"fb282f92": "solveGame(uint256,uint256)", +"fb283111": "setRunSwitch(bool)", +"fb2861ff": "MINTTIME()", +"fb2898e4": "startSaleDepo(uint256)", +"fb28be72": "SetupQPY(string,string,uint256,uint256,uint256,address,address,uint256)", +"fb293a34": "backGamePlayerCoinOwner()", +"fb29aa97": "getNumLoveItems()", +"fb2c95b6": "PlayX3()", +"fb2cb34e": "transferPaused()", +"fb2dfa45": "getKitties()", +"fb2e0078": "withdrawalFunds(bool)", +"fb2e3240": "setDOwnerFromClaim(bytes32,address)", +"fb2ee901": "getBattleFee()", +"fb2eff20": "PhoenixFund()", +"fb2f3a8a": "MAX_BOUNTY_SUPPLY()", +"fb2f5064": "getPendingTokens(address)", +"fb2fbf49": "registerEOSAddress(string)", +"fb305569": "UbiqIssued()", +"fb30d070": "setNewAge(int256)", +"fb31a6cc": "executeOffer(address)", +"fb31b262": "VuePayTokenSale()", +"fb31ff37": "getFullRecord(bytes32)", +"fb3220fe": "addNodalblockData(string)", +"fb3296ea": "transferFromNA(address,uint256)", +"fb32ade3": "releaseLockedTokensFor(address)", +"fb32aedb": "voteB()", +"fb32f4f5": "ARK_FLAGGER_1_00()", +"fb3458d1": "extractElementsFromGene(uint256)", +"fb346eab": "totalSpent()", +"fb34d075": "channelCloseTimeout(uint64)", +"fb34fc6f": "WatchNextBlockReward()", +"fb350502": "calculateWalletTokens()", +"fb35370b": "transferDari(address,address,uint256)", +"fb3551ff": "getAgent(address)", +"fb357f74": "EBLLToken(address,uint256)", +"fb35a4ba": "KKToken(uint256,string,uint8,string)", +"fb35b4e4": "totalDeployments()", +"fb35d545": "unlockDate4()", +"fb3650c2": "grab(address[],uint256[])", +"fb368e8f": "getServiceName(bytes32)", +"fb36eba1": "createCard(address,uint16,uint16)", +"fb36fae4": "setJpycContactAddress(address)", +"fb37baa1": "whitelistUserForTransfers(address)", +"fb386216": "getSeatAddress(uint256)", +"fb38ec94": "founder3()", +"fb3918d7": "fillReserve()", +"fb3979f0": "updateAccountChartAgainstExistingEntity(address,uint256,uint256,uint256)", +"fb3a1fb2": "getReleaseDb()", +"fb3a3ff3": "HODLERAddress(address)", +"fb3ab12b": "setEndSale(uint256)", +"fb3b11af": "CWCCToken()", +"fb3ba9b3": "LogNewBlacklistedAddress(address,address)", +"fb3bc400": "myProfitsReceived()", +"fb3c0d70": "transferFromToken(address,address,address,uint256)", +"fb3d8b6e": "SiringClockAuction(address,address,uint256,uint256)", +"fb3dc0b3": "Leader(string,address,bytes32)", +"fb3ea59b": "acceptBatched(address[],bool)", +"fb3ed5c7": "airdropSupply()", +"fb3f1fd6": "nextroundblocksbeforenewpay()", +"fb3f4d29": "tokenApprove(address,address,uint256)", +"fb3f71c8": "addContract(address,uint256,string)", +"fb3fd6a1": "m_bIsLock()", +"fb402c26": "BuyTokensWithTokens(address,address,uint256,uint256)", +"fb40340d": "totalNormalTokenGenerated()", +"fb40c22a": "getAllCases()", +"fb4101c0": "reward(address,bytes32)", +"fb43b2a2": "approveBreeding(address,uint40)", +"fb43d9f4": "getTotalValue(address[],uint256[],address)", +"fb441663": "claimExit(address[],uint256[],bytes,bytes,bytes32)", +"fb4460dd": "getVoterStakes(address,uint256)", +"fb45d080": "pieBalanceOf(address)", +"fb468340": "getTotalMember()", +"fb46d4c5": "tweet(string)", +"fb46d5b1": "awardCyclePrize()", +"fb46f492": "emissionMas(address[],uint256[],bytes32[],uint256[])", +"fb470a92": "FlukeCoins()", +"fb471ce5": "ERC223Transfer_enabled()", +"fb47a067": "_getRevisionBlockNumber(bytes20,uint256)", +"fb486250": "confirmOwner(uint8)", +"fb486c7b": "setGivenName(uint256,string)", +"fb48ca1d": "NewSuggestion(address,string,uint256)", +"fb48cf0e": "getVoter(uint256,uint32)", +"fb490695": "griefCost()", +"fb497ad2": "stage_1_TokensSold()", +"fb49dc4a": "AEFFTOKEN()", +"fb4a18a2": "setCrowdfundPayout(address,uint256)", +"fb4a6cde": "StarbaseEarlyPurchase()", +"fb4a86bc": "amountToBeRaised(bytes32)", +"fb4aa0a1": "fundReceiver()", +"fb4b7693": "sendSeedAndHash(string)", +"fb4cd8e2": "numBidders()", +"fb4ce0a9": "addAssetsOwner(address)", +"fb4da5b7": "pay(address,string)", +"fb4fbcd8": "getClaimTradingProceedsWaitTime()", +"fb4fd984": "requestPrize(bytes32,uint8,bytes32,bytes32)", +"fb50aec5": "getVendorApplicationStatus(string)", +"fb51a1ea": "read_total_purchased_today(address)", +"fb5209bf": "trickleUp(address)", +"fb524c32": "GetMaximumBet()", +"fb5274e5": "generateWinners()", +"fb54047c": "getCustomExtraData(bytes32,uint256,bytes32)", +"fb557c8c": "PrideToken()", +"fb5589b4": "memCopy(uint256,uint256,uint256)", +"fb55d09d": "EtherGames()", +"fb55ed2a": "transferBlocToUser(address)", +"fb58674d": "Npole()", +"fb598f87": "createPost(uint256,uint256)", +"fb5a3282": "restFinish(address)", +"fb5b82d0": "setCollector(address)", +"fb5bd32b": "withdrawDevBalance()", +"fb5d5729": "getPongvalTransactional()", +"fb5d5999": "getDepositary_function_control()", +"fb5d7376": "step4()", +"fb5e6a76": "WithdrawMulti(uint256,address[])", +"fb5f39dd": "offlineSell(address,uint256)", +"fb5f8a13": "changeAddressKnight(address)", +"fb5fef42": "distributeALCToken()", +"fb6021ae": "ICO(string,string,uint8,uint256)", +"fb60938f": "getSumAmountOfSuccessfulDeals()", +"fb6139b5": "setServerFee(string,uint256)", +"fb6168ac": "BUY_ME()", +"fb621f14": "getSecurityTokenAddress(string)", +"fb6287d2": "setWalletAddresses(address,address,address)", +"fb62e083": "addWhiteListed(address)", +"fb632ef9": "transferrableBalanceOf(address)", +"fb63c4fc": "MESSAGE_PRICE()", +"fb63e4b1": "CEZA(uint256,string,string)", +"fb640453": "_getTotalBmcDaysAmount(uint256,uint256)", +"fb644a14": "Force(address)", +"fb64e072": "recordTransfer(address,address,uint256,uint256)", +"fb64e6b1": "icoAddr()", +"fb656067": "genesisCallerAddress()", +"fb659c3a": "addArticleItem(uint256,bytes)", +"fb65a1a3": "teamdistr(address,uint256)", +"fb65a3cb": "createCampaign(bytes32,uint256,address)", +"fb65e4b1": "Contribution()", +"fb674cf4": "emissionEnabled()", +"fb67983c": "fuckingClaim1(bytes,bytes)", +"fb687c24": "refundMethodABI()", +"fb68a3be": "printTokens(uint256)", +"fb68aa89": "hasInitCard1()", +"fb690dcc": "donated(address)", +"fb6a53d2": "multiBurn(uint256[])", +"fb6aeb42": "PRE_PUBLIC_LOCKUP_PERIOD()", +"fb6b18c0": "totalAirDrop()", +"fb6b3857": "transfer_to_session(uint32,uint32,uint64)", +"fb6b4afd": "getWeaponModel(uint256)", +"fb6bbbce": "Crowdsale()", +"fb6c2b6f": "stopMarket(uint32)", +"fb6cae8e": "NetkillerToken(uint256,string,string,uint256)", +"fb6d0e8f": "pullShares(address)", +"fb6e155f": "availableVolume(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32)", +"fb6e6558": "holderNumber(address)", +"fb6f6875": "deleteHotel(address)", +"fb6f71a3": "setCharity(address)", +"fb6f93a4": "setEthUsdRate(uint256)", +"fb6f9579": "Increase()", +"fb702ed1": "multiDistribute(uint256[])", +"fb7043ea": "isRefundPossible()", +"fb709d2e": "charities(uint256)", +"fb70f765": "foundationTokenSupply()", +"fb70ff96": "increasePieceCount(uint256)", +"fb71807f": "setUser(string,string,bytes32,uint256,uint256,uint256[],string,string)", +"fb719113": "deathData_f17()", +"fb7248cb": "playerGuess(address,int16)", +"fb72d24e": "shift_right(uint64,uint256)", +"fb72fdfe": "setTotalAllowed(address,uint256)", +"fb73a593": "modifyAllLevelCaps(uint256[],uint256)", +"fb741504": "IndividualCapCrowdsale(uint256,uint256)", +"fb7450be": "setBtcToken(address)", +"fb74da7e": "setTentativeWinningPayoutDistributionHash(bytes32)", +"fb74e6f7": "ADVISOR_STAKE_FOUR()", +"fb756f97": "Tokenomicx()", +"fb75b2c7": "rewardWallet()", +"fb77269e": "periodITO_period()", +"fb77378a": "SCOOP()", +"fb775b46": "giver()", +"fb77eae2": "startTimeSaleWithBonus()", +"fb78eb53": "Oncology()", +"fb78f85c": "mgrCount()", +"fb791b0b": "withdrawOrder(uint256)", +"fb794281": "gas_amount()", +"fb79e70f": "superNovaSupply()", +"fb7a2c1f": "addQuestion(string,uint256,uint256,string)", +"fb7a5f4f": "getEndBlock()", +"fb7a809c": "buyStageDataRecord(uint256,uint256,uint256,uint256,uint256,uint256)", +"fb7ae31e": "getCurrentRoundLeft()", +"fb7baf70": "initRegistMatch(uint8,uint8,uint8,uint256)", +"fb7c0a3f": "doBuy(uint256)", +"fb7cb850": "setMaxMerge(uint8)", +"fb7cf694": "buyPriceInWei()", +"fb7e54eb": "vcx()", +"fb7e7456": "endOfLockProjectToken()", +"fb7f21eb": "logo()", +"fb80d66f": "SQR_TOKEN_MULTIPLIER()", +"fb80fe9e": "test(uint256,address)", +"fb81299b": "setAllMarketsFinalized(bool)", +"fb815503": "withdrawWin()", +"fb81563b": "SpaceImpulseERC20()", +"fb84da41": "createSketch(string,string)", +"fb850fab": "newCampaign(uint32,uint256)", +"fb8621df": "push(bytes32,string,bytes)", +"fb8632b8": "availableEmission()", +"fb867165": "getSaveData(address)", +"fb86a404": "hardCap()", +"fb87bf7b": "LLX()", +"fb87d5ea": "TransactionRequest(address[4],address,uint256[11],uint256,bytes)", +"fb87eb0b": "setRefundsActive(bool)", +"fb88e7c1": "updateBestPromouter(address,uint256)", +"fb890a17": "YUPToken(address,address,address,address,address)", +"fb89fb28": "yield7Day()", +"fb8a5bf8": "H2OC()", +"fb8a5f1c": "createTransaction(address,uint256,bytes32,address,address)", +"fb8b0197": "claimReceivables(address[])", +"fb8bc297": "getInvestorPackPrice()", +"fb8c7420": "GetRandomNumber()", +"fb8dd3bb": "createEvent(bytes32,bytes32[],address,uint256,uint256,uint256,uint256)", +"fb8e4f1a": "BountyChanged(uint256)", +"fb8e7870": "buyKebabs()", +"fb8e82b4": "min(uint32,uint32)", +"fb9073eb": "reLoadXname(bytes32,uint256)", +"fb913d14": "sendByTranche(bytes32,address,uint256,bytes)", +"fb920ad1": "reclaimAndBurn(address,uint256)", +"fb92488b": "ChangePrice(uint256)", +"fb92507d": "daytime(uint256)", +"fb92e4fb": "_isGoodAddress(address)", +"fb932108": "distribute(address,uint256)", +"fb950559": "getAffiliation(address)", +"fb950a7f": "addGrantableAllocation(address,uint256,bool)", +"fb95adeb": "testFailBlockhashInsuffiecientFee()", +"fb95d9e7": "addConfigEntryAddr(bytes32,address)", +"fb961571": "ICOStartBlockChanged(uint256)", +"fb969b0a": "bootstrap()", +"fb9734fc": "confirmProposal(address,bytes32,uint256)", +"fb979ba2": "ROUND_1_PRESALE_BONUS()", +"fb97b61f": "lpAskVolume()", +"fb98a409": "skinContract()", +"fb990288": "_newInterest(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"fb9a0c58": "startRefundProcess(uint256)", +"fb9a2ce2": "getSellPosition(bytes32,uint256)", +"fb9a4595": "GitHubBounty()", +"fb9ab10b": "EpsToken()", +"fb9b4ab8": "createrAddress()", +"fb9ba033": "checkAllowedAddressForMinting(address,address)", +"fb9ba7bc": "removeAccreditedInvestor(address)", +"fb9bbeaf": "RaiSed()", +"fb9c7303": "completeInvestment()", +"fb9ca16b": "MarianaKey(uint256,string,uint8,string)", +"fb9cb15d": "numChipsMinted()", +"fb9dd851": "getGameInfoByIndex(uint256)", +"fb9ded46": "totalWeiRaisedDuringICO3()", +"fb9e1270": "investmentIdLastAttemptedToSettle()", +"fb9ec0a8": "assignPersiansToBattle(uint256)", +"fb9efcf0": "setCustodianForeign(address)", +"fba06849": "fipsPublishDataMulti(bytes20[],bytes)", +"fba07791": "fiatCost()", +"fba0aa5b": "txFeeSentInWei()", +"fba0ce5e": "setLinkedIn(string)", +"fba12c17": "minerLockAddress()", +"fba13bd0": "depositBalanceOf(address)", +"fba17fc9": "Flye()", +"fba246de": "DepositETH()", +"fba26207": "setUint64(int64,uint64)", +"fba2a2d2": "setPeriod(uint16)", +"fba2b18b": "_getplayersurplus()", +"fba2fb66": "newPolicy(bytes32,bytes32,uint256,uint256,uint8,bytes32)", +"fba36b31": "payWithRef(address)", +"fba4734f": "withdrawEthereum(uint256)", +"fba4abb2": "payoutBalanceCheck(address,uint256)", +"fba52ff1": "getInvestorClaimedTokens(address)", +"fba5de1c": "cancelGetTogether()", +"fba5ee24": "getSinistre_effectif()", +"fba5f1f6": "weaponModels(uint256)", +"fba6651c": "getCommunityTaxes(uint256)", +"fba6748c": "getMaxPrivateSaleBuy()", +"fba6e51b": "_getFinalAddress(uint256[],address[],uint256)", +"fba70381": "adventureByToken(address,uint256,uint256,uint256,uint64,uint64)", +"fba71fe9": "periodICOStage6()", +"fba74490": "PoseidonQuark()", +"fba779f6": "armyHelicoptersCount(uint256)", +"fba79777": "test1cash()", +"fba7c1ab": "addMake(string,address,uint256,uint256)", +"fba7cc79": "getIsActive()", +"fba83066": "topSalesRatio(uint16)", +"fba84b2a": "LjwStandardToken()", +"fba90629": "totalSupplyPrivateSale()", +"fba906c5": "HiroyukiCoin()", +"fba939f8": "_goal()", +"fba9ce40": "donateToDev()", +"fba9cea9": "someAction(address)", +"fba9dbbb": "chnageSpecialFeeTake(uint256,address,uint256,uint256)", +"fba9ecac": "getFreeBanker()", +"fbaa0ece": "weekTwoRate()", +"fbaa6050": "getApprovalRequirement(bytes4)", +"fbaa89d3": "LogBidRemoved(address,uint256)", +"fbabc444": "PeaceChainToken(uint256,string,string)", +"fbabdb06": "disapprove(address,uint256)", +"fbac3951": "isBlocked(address)", +"fbac7d1d": "setCampaign(bytes32,uint256,uint256,uint256,uint256,bool,address)", +"fbac89f6": "unlock(bool)", +"fbacc43f": "getBases()", +"fbad8983": "sendyum(address)", +"fbae5e7d": "Investors(uint256)", +"fbaeac89": "newOwnerAPI()", +"fbaf094a": "provider(address)", +"fbaf12a7": "_removeBlacklistedUser(address)", +"fbb0eb8b": "mintingNonce()", +"fbb11f29": "setTokenGbi(address)", +"fbb1c5c4": "XBCOMMUNITY()", +"fbb26d00": "releaseBasicAccount()", +"fbb39f6e": "offerTrade(uint256,uint256)", +"fbb4d51b": "OverseasReturneesUnion()", +"fbb4dc6b": "secondMonthEnd()", +"fbb4f0e3": "NuToken()", +"fbb58c5c": "STARTING_FALCON()", +"fbb5d52d": "sellCoinsToICO(uint256)", +"fbb5f682": "KUNTEStandardToken(uint256,string,uint8,string)", +"fbb6272d": "tokens(uint32)", +"fbb65708": "freedWinPoolForSecondStage()", +"fbb78719": "private_setmaxBet(uint256)", +"fbb8932a": "getSeatMessage(uint256)", +"fbbb75c5": "getClaimedOwners()", +"fbbc3448": "getWrefundIndex(uint8)", +"fbbcb4de": "GointoMigration(address)", +"fbbd6545": "pushHatch(address,uint32,uint16,uint16)", +"fbbdb68c": "hiddenOwner()", +"fbbdbf22": "_setTimes()", +"fbbe20a9": "breeding(uint256,uint256)", +"fbbe7887": "NewBOP(address,address,uint256,uint8,uint256,string)", +"fbbedf5c": "ERC20Token(string,string,uint8,uint256)", +"fbbf119b": "BTCCCoin()", +"fbbf93a0": "getDetails()", +"fbbfa45e": "destory(address)", +"fbbfe830": "refundTokenHolder()", +"fbc00b4a": "GACC()", +"fbc032ab": "GCFcoinF(uint256,string,string)", +"fbc09b26": "m_totalDatasetCount()", +"fbc34d1c": "artistsArtworkCount(address)", +"fbc3d0ef": "frozenReserveTeamWallet()", +"fbc402fc": "updateDarknodeBond(address,uint256)", +"fbc44458": "setTransferAuthorizations(address)", +"fbc449a7": "FirstContract()", +"fbc47e56": "tokenListContract()", +"fbc4f981": "ReceivedBTC(address,uint256,string)", +"fbc53c8e": "Arascacoin(uint256,string,string)", +"fbc5db95": "lowestAskTime()", +"fbc6c0f0": "firstChipBonus()", +"fbc6d0ff": "confirmTransactionWithSignatures(bytes32,uint8[],bytes32[])", +"fbc6d545": "ADST()", +"fbc7ad3e": "finishedLoading()", +"fbc805ee": "changeMaximumContributionForAllPhases(uint256)", +"fbc80af6": "FakeNewsToken()", +"fbc8aafe": "delegateExecute(address)", +"fbc94bd1": "icoFinishInternal(uint256)", +"fbc94f24": "changeTokenPrice(uint256)", +"fbc990d0": "_removeMember(address)", +"fbc9c601": "requestAccess(address,int256,address)", +"fbca1c9d": "get_charge()", +"fbca6ba6": "maintenance(uint256)", +"fbcbc0f1": "getAccount(address)", +"fbcc3775": "isMyWalletLocked_Send()", +"fbccc2b1": "setBoolF1UintF1StrF2Intf3(bool,uint256,string,int256)", +"fbcebd02": "delegatedRefund(address)", +"fbcece85": "freeTokens(address,uint256)", +"fbceff0e": "WangWangCoin(uint256,string,uint8,string)", +"fbcf1594": "UNLOCK_TEAM_2()", +"fbcfa0d7": "createCard(string,uint256,address,address,bool)", +"fbd06cb6": "s42(bytes1)", +"fbd0c5d7": "SaleClockAuction(address,address,uint256)", +"fbd0e7df": "Reimburse()", +"fbd15163": "lengthMessages()", +"fbd18b58": "setBlockBalance(uint256,uint256,uint256)", +"fbd1df54": "TotalCount()", +"fbd1eb7b": "deployAgentWallet()", +"fbd22407": "EscrowRaj()", +"fbd275f8": "randomGen(address,uint8)", +"fbd2dbad": "previousDelegates(uint256)", +"fbd395f8": "pauseToken(uint256)", +"fbd3c51a": "left83(uint256)", +"fbd3d51b": "setMasterAddress(address,address)", +"fbd4200c": "base_token_is_seeded()", +"fbd42e0f": "releaseLockedTokens()", +"fbd4e0f0": "chkdrawadm(address)", +"fbd54a63": "sendAmount(address[],uint256)", +"fbd59425": "ETLToken()", +"fbd668a9": "setMaxProfit(uint256)", +"fbd6d77e": "addCoordinator(address)", +"fbd6fdde": "reLoadCore(uint256,uint256)", +"fbd70768": "___setProxyOwner(address)", +"fbd7b853": "setTokenSupplyLimit(uint256)", +"fbd7c5f1": "priceT3()", +"fbd7d081": "TOKEN_HODL_3M()", +"fbd81564": "logger(string)", +"fbd902f2": "_distributeTokenToPurchaser(address,address,uint256)", +"fbd95a39": "sendToAddress(address,address,uint256)", +"fbd9c625": "changeAddressPaladin(address)", +"fbd9c902": "vendi()", +"fbda68e2": "numberOfMessages()", +"fbdafaf9": "getInvestorAtIndex(uint256)", +"fbdb70fb": "KRWT()", +"fbdbad3c": "lastCompletedMigration()", +"fbdc03fe": "nettingContractsByAddress(address,address)", +"fbdc562a": "setCanChange(bool)", +"fbdd3982": "s17(bytes1)", +"fbdd7852": "Ownership()", +"fbdd8508": "PriceAccepted(uint256,uint256)", +"fbdda15a": "isTrustedContractAddress(address)", +"fbde47f6": "FEE_RANGE()", +"fbde5b64": "gameLength()", +"fbde8ad4": "pStartBlock()", +"fbde8d75": "manualWithdrawTokens(uint256)", +"fbdeecab": "endTimePreIco()", +"fbdf0378": "getAllChildren(bytes32)", +"fbdf45c8": "ZoosCoinToken()", +"fbe00e8e": "receiveEtherFromGameAddress()", +"fbe04e1c": "boolFunc(bool,bool,bool)", +"fbe0508c": "toggleActive(bool)", +"fbe093dc": "targetFeePeriodDurationSeconds()", +"fbe0fa4b": "checkDivsMgView(address)", +"fbe2e125": "addBet(uint256,uint8,uint256,bool)", +"fbe334f8": "getNumFulfillments(uint256)", +"fbe3462c": "minBuyRateInPrecision()", +"fbe3549c": "addWeight()", +"fbe38ffb": "canEscapeTo(uint32,int256,uint32)", +"fbe3bb40": "TSTOraclzAPI()", +"fbe3e1a2": "_setCap(uint256,string)", +"fbe413e4": "createMember(address,bytes20,uint64)", +"fbe45b48": "unitPLATCost(uint256)", +"fbe5ce0a": "removeOwner(address,address)", +"fbe5d87e": "getTotalCollected()", +"fbe6529f": "findOldest()", +"fbe6a9b2": "winners_count()", +"fbe7913f": "Accept_Payment()", +"fbe89965": "GoldenCoinToken()", +"fbe8dab9": "getProfitForDay(uint256,uint256)", +"fbe9bb6d": "_isValidDepositCountry(uint256,uint256,uint256)", +"fbeaa807": "RefundSent(uint256,address,uint256)", +"fbeaaed2": "VersionedAgreementControll()", +"fbeac9c9": "setRefBonus(address,uint256)", +"fbeaebc6": "murder()", +"fbeb89dd": "tournamentContract()", +"fbebc9af": "getPixelAuthor(uint32,uint32)", +"fbec4769": "MatchpoolAdministrator()", +"fbec51bc": "requestRedemption(address)", +"fbec6f21": "gold()", +"fbec9121": "maxRandom(uint256)", +"fbece99f": "abortive(uint256,uint256)", +"fbee7b58": "giftIsFrom()", +"fbeecb47": "safeTransferByContract(address,address,uint256)", +"fbeee7e4": "isPeriodClosed(uint256)", +"fbef0195": "_calcDelta(uint256,uint256,uint256,uint256)", +"fbef957b": "ada()", +"fbf05e69": "GasLog(string,uint256,uint256)", +"fbf0ade1": "setOwnerFee(uint256)", +"fbf0f7da": "buildOutAddress()", +"fbf184c6": "getBankermasterReq()", +"fbf1a44b": "holyBountyFundDeposit()", +"fbf1f78a": "unapprove(address)", +"fbf22dea": "issueSoftcapToken(address,address,uint256)", +"fbf2360c": "isMessageEnabled()", +"fbf2dd6a": "depositTokensForAccount(address,address,address,uint256)", +"fbf350e2": "TokenBBBasic()", +"fbf3c88d": "getSignedPublicEncKey(address)", +"fbf405b0": "pinakion()", +"fbf42072": "CashPoints1()", +"fbf44a1b": "setOraclizeGas(uint256)", +"fbf552db": "hint()", +"fbf561fe": "developer_add_address_for_A(address)", +"fbf58b3e": "transfer(string,address)", +"fbf69367": "FuleexToken()", +"fbf788d6": "cash(address,uint256,uint8,bytes32,bytes32)", +"fbf7980f": "setChainsAddresses(address,int256)", +"fbf7ba65": "claimExploreItem(uint256)", +"fbf7e985": "ExaUSD()", +"fbf80773": "isUserRoot(address)", +"fbf82d31": "WorldWideCoin()", +"fbf9180e": "getLastAuditTime(address)", +"fbf92322": "getPoolSizeQspWei(uint256)", +"fbf94ce1": "GlaidexToken()", +"fbf9dab7": "getBetters()", +"fbf9dc12": "GoldBank()", +"fbfa49a8": "icoWithdraw()", +"fbfa4b7f": "requestsCount()", +"fbfa77cf": "vault()", +"fbfb76c4": "GUAEX(uint256,string,string)", +"fbfb77d7": "setArquivo(bytes)", +"fbfb7e70": "market_WithdrawForSale(uint256)", +"fbfb8b02": "createMintRequest()", +"fbfbb62e": "BASE_CLB_TO_ETH_RATE()", +"fbfc1653": "XBLToken()", +"fbfca20b": "_Send_Bettings_to_Winner(uint256,uint256)", +"fbfd1da4": "getKeccak256Uint(uint256,uint256)", +"fbfd45f5": "PRE_SALE_START_2()", +"fbfd90cb": "finishBurningByCreator()", +"fbff728f": "HodboCrowdsale()", +"fbffb355": "testBitsEqualFailIndexOOB()", +"fc00234e": "icoStage()", +"fc006216": "MODICOIN()", +"fc01157c": "firstCrowdSaleEndDate()", +"fc017495": "EmployeeOptionsExercised(address,address,uint32,bool)", +"fc018c05": "makePublic()", +"fc01987b": "setLockAccount(address)", +"fc01abbe": "stringToBytes32(string,string)", +"fc01ce83": "increaseClaimsBalance(address,address,uint256)", +"fc01dfbb": "mintUpto(address,uint256)", +"fc0262e0": "CpublicGold()", +"fc02c1df": "assertExpectations()", +"fc03441c": "allDecimals()", +"fc034bd8": "getPoolOwners()", +"fc036d7c": "SECURITY()", +"fc037776": "assertEq31(bytes31,bytes31)", +"fc03c7ec": "setLockend1(uint256)", +"fc03fb11": "MacBookOracle()", +"fc043830": "getNetworkFee()", +"fc043cad": "setPullPaymode()", +"fc04771a": "RT()", +"fc04a2ec": "_getOriginAddressHash(address,address,string)", +"fc04c0c4": "partnerTransfer(uint256,bytes32,address,uint256)", +"fc04c62e": "offerAsSacrificeFromVault(address)", +"fc05a6fc": "getPeopleBeforeMe(address,address)", +"fc06013a": "updateTokenEmission(uint256,uint256,uint256,uint256)", +"fc0656c9": "candyTokenAddress()", +"fc06a877": "createApp(string,uint256,string)", +"fc06d2a6": "sunrise()", +"fc078bd4": "GDCAcc05()", +"fc0808e5": "bet_MIN()", +"fc091b71": "MitCoin()", +"fc09ff9e": "submitTransaction(address,string,string,uint8[],bytes32[],bytes32[])", +"fc0a39b7": "isJackpot(bytes32,uint256)", +"fc0c3460": "CryptoSoft()", +"fc0c38a7": "Dsocial()", +"fc0c50fe": "getCallPtr()", +"fc0c546a": "token()", +"fc0d0117": "masterWallet()", +"fc0dce74": "ATL(address)", +"fc0e3d90": "getStake()", +"fc0e4262": "___AllBalance()", +"fc0e64de": "setInitialGasForOraclize(uint256)", +"fc0e74d1": "shutdown()", +"fc0ea853": "processWithITG(address,uint256)", +"fc0f392d": "activateSafeMode()", +"fc100eb2": "inxToken()", +"fc10655e": "actual_feedin()", +"fc10881a": "CXCoin()", +"fc108f70": "GamblerPerAddress(address)", +"fc10d4d5": "getFeeRecipientById(uint256)", +"fc11f71c": "setInstructor(address,address,uint256,bytes16,bytes16)", +"fc122892": "deleteOpenAction(string,address,string)", +"fc12c7da": "blocknumbersOf(uint256)", +"fc12dfc7": "weiDelivered()", +"fc13440c": "HealthCharityToken(uint256,string,uint8,string)", +"fc136941": "EmergencyWithdrawalProposed()", +"fc13a76a": "testFailAddForeignChildNotInUse()", +"fc14230f": "wei2euroCents(uint256)", +"fc143f2b": "defrostOwner()", +"fc14a47c": "CTBToken()", +"fc14ed71": "updateForSale(uint256)", +"fc157b13": "getOrganFunction(uint256)", +"fc15dcef": "resAmount()", +"fc1711f2": "setWeight(uint256)", +"fc176c4c": "getAdsCountByUser(address)", +"fc177bd6": "resetArray()", +"fc178f2a": "MoonTokenERC20(uint256,string,string)", +"fc17ce26": "Panthercoin()", +"fc17d2ac": "setFunctionEightPrice(uint256)", +"fc184fff": "addPhenomenon(string,string,string,uint8)", +"fc190261": "getIntervalsForWindow(uint256,uint256,uint256,uint256,int256)", +"fc190d6e": "newUpdate(string,bool)", +"fc192fb0": "setMinimumWithdrawal(uint256)", +"fc196cf3": "getNoInvestor()", +"fc1a1110": "currentLiquidInDeal()", +"fc1a142d": "adPriceHour()", +"fc1a3f0a": "decreaseTokenLock(address,uint256)", +"fc1adfdf": "invest(address,uint256,uint256,uint256)", +"fc1b8a7e": "richestPlayer()", +"fc1b9286": "rewardActivityEnd()", +"fc1c01b2": "setCrowdsaleParams(uint256,uint256,uint256)", +"fc1c2180": "setHotWalletAddress(address)", +"fc1c32fa": "fundariaBonusFundAddress()", +"fc1c5218": "RemoveOpenOrder(uint32)", +"fc1c9620": "depositOrWithdraw(address)", +"fc1da46a": "parcipateCrowdsaleAll()", +"fc1dfdf1": "extraData1FromHash(string)", +"fc1e1a32": "NetfBalance()", +"fc1e2ce9": "getGameAmounts(uint256)", +"fc1eb4d1": "withdrawPoly()", +"fc1ed437": "initialAmount()", +"fc1f2a70": "Add(uint256,string,string)", +"fc1f2d46": "setAllowTransferWhitelist(bool)", +"fc1f5c9c": "personalSegmentHash(string,uint256,bytes32)", +"fc1f5e53": "resetTimeLockValue(address)", +"fc1f7652": "_isBoardMember(address)", +"fc200a55": "mintWithTimeLock(address,uint256,uint256)", +"fc201122": "_setOwner(address)", +"fc204334": "sendAwardToLastOne()", +"fc207c8f": "periodAt(uint256)", +"fc21fa40": "getAmountByCurrency(uint256)", +"fc223410": "doBet(uint256[],uint256[],uint256[],uint256)", +"fc22545c": "getPreICOFundersCount()", +"fc22a9f8": "initialIssuance()", +"fc22d0e5": "migrate(address,uint256,uint256)", +"fc23466d": "search_data()", +"fc235fb8": "timeWaitApply4Redeem(address)", +"fc236188": "setData_7(string)", +"fc23f5b1": "getAddressByID(uint256)", +"fc248fd6": "RegisterNode(bytes32)", +"fc24e589": "badgeTotalSupply()", +"fc2525ab": "get(address,string)", +"fc252b94": "_getBuyPrice()", +"fc257baa": "traderWithdrawalSignals(address,address)", +"fc2584a2": "fillOrMarket(address)", +"fc26088e": "K_INITIAL_SUPPLY()", +"fc2615d5": "getRemainTime()", +"fc2634b7": "callURL(string,string,string)", +"fc26d522": "tip_total()", +"fc26fe01": "setairDropManagerLimit(uint256)", +"fc27ea83": "defaultAmount()", +"fc281217": "TokenInformation(address)", +"fc284d07": "earlyBackers(uint256)", +"fc28bc8f": "staffContract()", +"fc2b8b7b": "initTokenSupply(uint256)", +"fc2b8cc3": "quit()", +"fc2bd7ae": "sendtoMultiWallets(address[],uint256[])", +"fc2c1ddb": "setItemAvailable(uint256,bool)", +"fc2c3e08": "getIteration()", +"fc2d2b69": "SmartBondsToken()", +"fc2d64e3": "getProviderData(address)", +"fc2df281": "withdrawICOEth()", +"fc2e5bf2": "OfferOnHold(uint256,bool,address)", +"fc2ea8a5": "airdropAmount()", +"fc2f5e67": "recoveryAllowed()", +"fc300522": "getCallFee(bytes32)", +"fc303ef1": "destroyBottle()", +"fc3087f8": "withdrawAll2()", +"fc314e31": "tokenDetails(uint256)", +"fc317cbe": "mainSaleDate()", +"fc322d73": "challengers(bytes32)", +"fc324642": "__createNewToken(address,string,uint256,uint256,uint256,uint256)", +"fc325efd": "getItemByIndex(uint256)", +"fc3280c2": "getDegreeAtIndex(uint256)", +"fc32f09c": "MyShareToken()", +"fc331ebb": "transfererc20(address,address,uint256)", +"fc334e8c": "reveal(bytes32,bytes32)", +"fc335bb5": "OrmeCash()", +"fc337f5a": "getFreeCat()", +"fc342947": "renewFeatured(uint256)", +"fc34b908": "TOTAL_BONUS_SUPPLY_ETH()", +"fc366a2a": "RETZE()", +"fc36cc9d": "setCoolHero(uint32)", +"fc36e15b": "vote(string)", +"fc37987b": "buyRate()", +"fc380d96": "addBonusTokens(uint256,uint256)", +"fc384b7c": "executeStackholderTransaction(uint256)", +"fc385d51": "changeRelease6m(address)", +"fc3880ae": "priceWithBonus()", +"fc38ce19": "validPurchaseTokens(uint256)", +"fc38d4a4": "upgradeAgility(uint256,uint256)", +"fc395c90": "AddBillModerator(address)", +"fc3b7379": "lastBlock_a18()", +"fc3c28af": "devPercent()", +"fc3c8561": "testDistribute(uint256,address[],uint8[])", +"fc3d9f9f": "calcUnMaskedKeyEarnings(uint256,uint256)", +"fc3daf81": "_CalcDiv()", +"fc3f162b": "unregisterAuditor(address)", +"fc3fc168": "DIVIDEND()", +"fc3fc4ed": "getAuctionInfo(uint256)", +"fc4116bb": "p_update_mResalePlotTaxPercent(uint256)", +"fc416159": "coreERC()", +"fc429e6a": "transfer_from_session(uint32,uint32,uint64)", +"fc42b58f": "getTransferFee(address,uint256)", +"fc4333cd": "clean()", +"fc434891": "unWhitelistAddresses(address[])", +"fc43bbfb": "setWhitelistAddress(address,uint256)", +"fc442ec3": "getFlavor()", +"fc44e41b": "RANDOMFACTToken()", +"fc44fd28": "payBalanceToReturnWallet()", +"fc450ae6": "MummyAccountWithdraw()", +"fc45c822": "getDividends(address,address)", +"fc470105": "TestcoinToken()", +"fc47b9d2": "brulerDe(address,uint256)", +"fc47fcf5": "total_devidend()", +"fc48b653": "authorizedTransfer(address,address,uint256)", +"fc49926f": "getCountdowns()", +"fc4a089c": "newPermission(bytes32,address[],bytes4[])", +"fc4a4a1e": "StartTime()", +"fc4b01ff": "addTicketsToDraw(uint256,uint8,uint8)", +"fc4b2473": "ALC_CONTRACT_ADDRESS()", +"fc4bd9d7": "throwIfSetPresaleTokensAfterSaleStarts()", +"fc4c0daa": "_agent()", +"fc4d20f5": "addMonsterObj(uint32,address,string)", +"fc4d705b": "COLOR_GOLD()", +"fc4db64e": "SendAmount(address,address,uint256)", +"fc504655": "getPriceInWei()", +"fc512b92": "postCrowdsaleWithdraw(uint256)", +"fc515d93": "approvedAddressSize()", +"fc51b9c5": "cancelOrder(address[3],uint256[5],int256,int256)", +"fc51daef": "getCurrentRoundWinner()", +"fc523f7a": "settte(uint256,address)", +"fc525c75": "Ammbr(string,string,uint8)", +"fc52be0a": "getLatestTokenAllocation(address,address)", +"fc52cc1d": "incPreSell(address,uint256)", +"fc52f2eb": "DogRacingToken()", +"fc5378bb": "getEmployeeInfoById(address)", +"fc539a4a": "getInstances(bytes32)", +"fc53c821": "getMembersLength()", +"fc53f958": "ADMIN_ALLOWANCE()", +"fc53fe51": "_authorizePayment(address,uint128)", +"fc548f08": "changeArbitrator(address)", +"fc55c8d6": "buyPixel(uint256,bytes32)", +"fc55ea9d": "removeCustomer(string)", +"fc56200e": "JCFv1(uint256,string,string,uint8)", +"fc563658": "getNumber(uint256)", +"fc578323": "getProposalProposedBy(bytes32,bytes32)", +"fc57fadf": "IsValidAddress(address)", +"fc58452e": "castVote(bytes32,uint16)", +"fc58edea": "FoundationAddressFreezeTime()", +"fc58fc49": "setUser(address,address,string,uint256)", +"fc59116d": "setTokenTypes(uint16,uint16,uint16)", +"fc591ce5": "AddForm46(uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"fc5a0152": "div256(uint256,uint256)", +"fc5ab1c6": "_unlockOther(address)", +"fc5b57a6": "removeStackholder(address)", +"fc5b652a": "LogNeumarksBurned(address,uint256,uint256)", +"fc5be8ec": "bonuscalico(uint256)", +"fc5c0cde": "allTimeDiscount(uint256)", +"fc5d9244": "totalBonusTokens()", +"fc5e2cce": "calculatWithdrawForPeriod(uint8,uint256,uint256)", +"fc5eb846": "currentHunterNumber()", +"fc5f3e1d": "ATEC_Token()", +"fc5faa82": "ProWalletToken()", +"fc5fc345": "getPlayerIds()", +"fc5fc8ae": "preICOEnds()", +"fc601902": "_isAdmin()", +"fc608e17": "getAllocatedTokenCount(address,address)", +"fc60bb36": "_removeGroupFromMember(address,bytes32)", +"fc60e82c": "calculatePrize(uint256,uint256,uint256,uint256)", +"fc612a8d": "priceUpdater()", +"fc623ef8": "hashToSign(bytes32)", +"fc632647": "MNToken(uint256,string,uint8,string)", +"fc63977a": "getAddressFromUsername(bytes32)", +"fc63d4fb": "order(bool,uint32,uint128)", +"fc63dad6": "getLastBuyer(bytes32,uint8)", +"fc65169a": "phase4Duration()", +"fc65b3ac": "all_team_accounts()", +"fc65ee05": "marginCallOnBehalfOfRecurse(address,address,bytes32,uint256)", +"fc65f812": "_currentPrice(uint256)", +"fc6634b9": "setSellPrice(uint256)", +"fc673c4f": "operatorBurn(address,uint256,bytes,bytes)", +"fc676652": "Embassy(address,address)", +"fc67af2d": "withdrawCommunityBalance()", +"fc68521a": "f(address)", +"fc687311": "betOn(int8)", +"fc688e87": "logAccount(address,uint256)", +"fc6a0ca6": "changeTeamSize(uint8)", +"fc6a3ff7": "ticketsOwnedByUser(address)", +"fc6b72b6": "bringCat(uint256)", +"fc6c403b": "getMySalePrice(bytes32)", +"fc6d0dd0": "getLightingWithdraw(address,address,bytes32,bytes32,uint256,uint32)", +"fc6d1892": "setArrUintField1(uint256[])", +"fc6def15": "decider()", +"fc6e33ee": "MAX_SALE_DURATION()", +"fc6ef5a5": "getUserTokenLocalBalance(address)", +"fc6f46a0": "addTether(address,string,uint256,uint32,string)", +"fc6f9468": "adminAddress()", +"fc6fadec": "LoggedReward(uint256,string,uint8,string,bool,bool)", +"fc700dc0": "createBucketLender(bytes32,address,address,address,uint32[7],address[],address[])", +"fc70b462": "viewReputation(address)", +"fc722b2b": "trustedDarknodeRegistry()", +"fc72c1ef": "ERC20Base(uint256)", +"fc735e99": "verify()", +"fc7368fa": "reopenBet(uint256)", +"fc73c86e": "getInvestments(address)", +"fc73ec00": "changeDividend(uint256)", +"fc741c7c": "makerFee()", +"fc749323": "NTC()", +"fc74dadd": "delegateProxy(address,bytes)", +"fc74f55c": "IexecHubAccessor(address)", +"fc753ce3": "NAME_ARK()", +"fc756c69": "createship(uint256,address)", +"fc7596a8": "GoldBoxToken()", +"fc763176": "agreeAmendmentJUR(address)", +"fc76501a": "preIco1Raise()", +"fc76687c": "jinglesOnSale(uint256)", +"fc77060d": "withdrawEtherHomeExternal()", +"fc772c8b": "reclaim(address)", +"fc773166": "GCoin()", +"fc78b430": "delegateVote(address,address,uint256)", +"fc792719": "hasBeenClaimed()", +"fc794183": "timesfucky()", +"fc79c8eb": "TBCoin()", +"fc7ae9f5": "presaleMaxContribution(address)", +"fc7b78b1": "changeVestingAgent(address)", +"fc7b9c18": "totalDebt()", +"fc7ba686": "affiliatesCutOutof100()", +"fc7c1c80": "getParentB(uint256)", +"fc7c41af": "doDisown()", +"fc7cb268": "PoSToken()", +"fc7d07ce": "AllocateFounderTokens()", +"fc7d2b3a": "EtherOcrend()", +"fc7d6518": "getLockSdc()", +"fc7e061f": "convertPresaleTokens(address,uint256,uint256,string)", +"fc7e286d": "deposits(address)", +"fc7e4768": "saleMinShares()", +"fc7e9c6f": "nextIndex()", +"fc7f1a88": "increaseBurnApproval(address,uint256)", +"fc7f7957": "callMeMaybe()", +"fc7fcae1": "extractFund(uint256)", +"fc800df4": "getBuyerbyaddress(address,address)", +"fc818684": "burnFromContract(uint256)", +"fc8234cb": "_unpause()", +"fc82d0f7": "currentIterationSupplyLimit()", +"fc836563": "SendTokens()", +"fc845834": "GoldenCoin()", +"fc860e96": "emissionTime()", +"fc862027": "setNameTAOLookupAddress(address)", +"fc86a7a5": "getTokenSoldPrice(uint256)", +"fc87790f": "addToWithoutFee(address)", +"fc8791c0": "change_p1(uint256)", +"fc87c766": "addressCap(address)", +"fc880be0": "SetCommissionValue(uint256)", +"fc882dff": "ownerHashed()", +"fc88ee77": "optionExerciseOf(address)", +"fc891b97": "MosesToken()", +"fc892cfe": "setup_token()", +"fc89aff6": "submitVerifiedUsers(address[])", +"fc89f349": "ORZToken()", +"fc8aaa76": "disableManualEmission(bytes32)", +"fc8ad37c": "changeParameters(uint256,uint256,uint256)", +"fc8b4a90": "checkDuplicateMatchId(address,uint256,uint256)", +"fc8bbb6d": "AddresstoAsciiString(address)", +"fc8c2f0d": "AlphaMarketTeamBountyWallet(address[],address)", +"fc8cddf2": "ARCADIA()", +"fc8d4f4f": "getShareHoldersInfo(uint256)", +"fc8dae84": "AllAmericanCoin()", +"fc8f3a94": "_getPayTo()", +"fc8f616e": "XXX()", +"fc8fc6f7": "KittyCoins()", +"fc9017a8": "sendMessage(address,string,bool,uint256,bytes32)", +"fc906720": "setSiringWithId(uint256,uint32)", +"fc906897": "StageDistributed(uint8,uint256)", +"fc909fc7": "EtherGrand()", +"fc912461": "_setControllers(address[])", +"fc914949": "ValidContractRemoved(address,address,uint256)", +"fc91a274": "getAmountByToken(bytes32,string,address)", +"fc91e03d": "EtherDeltaWithdraw(uint256)", +"fc94dd18": "verifyHumanStandardToken(address)", +"fc959d9a": "getMin(uint32[])", +"fc961664": "setPI_edit_7(string)", +"fc966d45": "uintToStr(uint256)", +"fc970859": "PacBall()", +"fc976827": "TOTAL_TOKEN_AMOUNT()", +"fc9774c1": "dividendShares(address)", +"fc989bbb": "addStockProfitInternal(uint256)", +"fc98f71e": "developerLock()", +"fc99342e": "create_table()", +"fc9937e5": "orders_sell_total()", +"fc996557": "goldContract()", +"fc998981": "sendBountyBalance(address[],uint256[])", +"fc9bfaa6": "externalCallFlag()", +"fc9c473d": "limitPerHolder()", +"fc9c8d39": "caller()", +"fc9dab52": "soldSale()", +"fc9dc608": "setRoundTime(uint256,uint256)", +"fc9e53df": "setNextRegistrar(address)", +"fc9ede65": "getPropertyBecomePublic(uint16)", +"fc9ee045": "getMaximalDeposit(uint256)", +"fc9f8cae": "_isApprovedPack()", +"fc9ffe02": "getWalletList()", +"fca062d3": "blockBeforeChange()", +"fca10682": "randomGen(uint256,uint256,uint256)", +"fca129a3": "finalizeDescription()", +"fca16c3b": "getBuyPrice(uint256,uint256,uint256)", +"fca2452b": "change_b(address)", +"fca2d9f5": "senttest()", +"fca2efd5": "DocnotaPresale(address,address)", +"fca346af": "SetupCrowdSale()", +"fca3644a": "verifyMessage(uint8,uint256,bytes32[4])", +"fca3b5aa": "setMinter(address)", +"fca495f0": "receivePurchase(uint256)", +"fca5d057": "migrateTokensV1(address,uint256)", +"fca5d21f": "playSlot()", +"fca5e61e": "drugs(uint256)", +"fca64947": "setMetaBet(uint256)", +"fca69afa": "CYCLE_CAP()", +"fca6d4e2": "LogAccess(address)", +"fca76c26": "lockMaxSupply()", +"fca7820b": "_setReserveFactor(uint256)", +"fca7c355": "MUSTToken(address,string,string,uint256,uint256)", +"fca7cdba": "pgoMonthlyPresaleVault()", +"fca865dd": "aSetProportion(uint16)", +"fca981f6": "setStepFunctions()", +"fca9bb5f": "FACTOR_1()", +"fcaa7664": "getStage()", +"fcaa96fa": "withdrawForThreeStep()", +"fcac1c77": "DragonKing(address,address,address,address,uint8,uint8,uint8,uint16[],uint16[])", +"fcad399f": "TheFlashToken(uint256,string,string)", +"fcad8cf3": "RentOffice()", +"fcae08e1": "fundTokens()", +"fcae4484": "unsubscribe()", +"fcae8c06": "takeMoney()", +"fcaf343e": "getUnsoldTokensAmount()", +"fcb0339e": "icoMinCap()", +"fcb0368c": "BuyToken(uint256)", +"fcb0a7ad": "getMinAuditPrice(address)", +"fcb0e55c": "_validGenes(uint256)", +"fcb163c7": "ExecuteOptions(address,uint256,string,uint8)", +"fcb1804d": "getRateAndTimeRemaining(uint256,uint256,uint256,uint256)", +"fcb1b62d": "arbiterAcceptCount()", +"fcb1cba0": "GetQuota()", +"fcb2931b": "LockupContract(address,address,address)", +"fcb2acd5": "_preValidatePurchase(address,uint256)", +"fcb2cafc": "verifyAddress(address)", +"fcb300e6": "_activate()", +"fcb36ce2": "buyCalcAndPayout(address,uint256,uint256,uint256,uint256,bool)", +"fcb3a3a3": "setCrowdsaleMinter(address)", +"fcb5bc29": "startPhase2()", +"fcb5ced3": "saveToCW()", +"fcb5d44d": "doExchange(uint256)", +"fcb6323a": "unclaim(address[])", +"fcb71ea9": "balanceOfHolder(address)", +"fcb750cf": "REFUND_DIVISION_RATE()", +"fcb806ac": "ReserveManager()", +"fcb80d16": "getCurrentFgcCap()", +"fcb899d7": "LEGAL_EXPENSES_ADDR()", +"fcb8b1e1": "NewHardCap(uint256)", +"fcb927aa": "addPublisher(string,bytes,address,address[],uint256[],address,uint32[])", +"fcb941c9": "setGenomeContractAddress(address,address)", +"fcb94dbb": "toBytes(address,address)", +"fcb9b505": "updateBeneficiary(address,uint256)", +"fcbc1bc4": "Standard23TokenMock(address,uint256)", +"fcbcf436": "clearSums()", +"fcbd06aa": "supportersMap(address)", +"fcbd2731": "transferToProxy(uint256)", +"fcbe0f5f": "BRD()", +"fcbeaaa7": "buyTile(uint16,uint16,uint8)", +"fcbf3131": "private_setBankAddress(address)", +"fcbf323a": "ScienceToken()", +"fcc01cce": "getExpectedAmount(bytes32)", +"fcc101ba": "getCommunityDescription(uint256)", +"fcc11241": "addOrder(uint256,uint256,uint256,uint256,uint256,uint8)", +"fcc15c8e": "Strike(uint16,uint32,uint16,uint8)", +"fcc1cc9b": "removeLockMultiple(address[])", +"fcc21e56": "withdrawToTeam()", +"fcc29ae8": "setMaxContributor(uint256)", +"fcc2a69b": "BankuNetwork()", +"fcc34e89": "migrateCrowdsale(address)", +"fcc36c49": "refuseInvestment()", +"fcc47803": "removeSpecialOffer(address)", +"fcc4a54c": "getDeedIds()", +"fcc4dec9": "refound(uint256)", +"fcc550c6": "CreateCCM(address,uint256)", +"fcc5b5ad": "investContracts(uint256)", +"fcc60b6a": "isInited()", +"fcc648f6": "withdrawEtherToReserveEscrow()", +"fcc6b5d5": "fillTheirOrder(address)", +"fcc73637": "updateExchangeRate(uint256,uint256)", +"fcc8221f": "getfromsun(address,uint256,uint256)", +"fcc830be": "getMyRickAndMorty()", +"fcc89710": "LogTokenSaleInitialized(address,address,uint256,uint256,uint256)", +"fcc9b48c": "isIcoFailed()", +"fcca4040": "tokenCapReached()", +"fcca8949": "p_setDevPercent_out(uint256,uint256)", +"fccc2813": "BURN_ADDRESS()", +"fcccc68f": "LoveBite()", +"fcce0492": "AdminTransferredOwnership(address,address)", +"fcce2622": "challengeAnswer(uint256,bytes)", +"fcceea26": "communitySupply()", +"fccf5a68": "SmartBinding()", +"fccf6e67": "newOrdersContract(address)", +"fccf82a4": "endDateOfPreSale()", +"fcd0a747": "RICTToken()", +"fcd10753": "_getProviderSupply(uint256,uint256,uint256)", +"fcd13382": "OsherCoinPresaleAward(uint256)", +"fcd13d65": "setContractRegistry(address)", +"fcd14456": "teamVestingPeriod()", +"fcd24400": "lookupCampaignPart2(uint256)", +"fcd307c4": "processReferral(address,address,uint256)", +"fcd3533c": "burn(uint256,address)", +"fcd41502": "requiredMajorityPercent()", +"fcd41c1f": "officialAddress()", +"fcd45807": "isTokenRegisteredBySymbol(string)", +"fcd47e79": "getnowcardcount()", +"fcd51a4e": "_setIntelligenceValue16(uint256)", +"fcd58363": "refundCancelledGame(uint32,uint32[])", +"fcd6e339": "giveBlockReward()", +"fcd6ec11": "HELLO()", +"fcd735dd": "transferVesting(address,uint256,uint256,uint256)", +"fcd778da": "setCardsAddress(address,address)", +"fcd792f4": "nextAvailableId(uint256)", +"fcd830c4": "setCCH_edit_28(string)", +"fcd8c9d4": "_goldTotalSupply()", +"fcd92992": "resync()", +"fcd936b1": "Simple()", +"fcd9da44": "setParameters(uint256,uint256,uint256,uint256)", +"fcd9f4ce": "withdraw(bytes32,string,string)", +"fcda4ded": "showBankAmount()", +"fcdb2c04": "getMyGameInfo()", +"fcddd056": "payIn()", +"fcde22fa": "_eachPrize(uint32,uint256,uint8,uint32,uint256)", +"fcde2ff6": "getPI_edit_23()", +"fcde6831": "addTokens(address[],bytes32[],uint256[],uint256)", +"fcde6ebe": "createSalesTierConfigMap()", +"fcde7b69": "TokenFRT(address)", +"fcde9925": "proposalOwner(uint256)", +"fcdf350b": "EGGS_TO_HATCH_1FAIRY()", +"fcdf9750": "createDispute()", +"fce14069": "partnerBonusPercent()", +"fce1cc35": "setInt(int256,int8,int16,int32,int256)", +"fce1ccca": "voting()", +"fce1e3e9": "setPatentFees(uint256[9])", +"fce20190": "_refund(uint256,uint256,uint256,uint256)", +"fce22c4c": "generatePseudoRand(bytes32)", +"fce266cb": "artworksFactory(address)", +"fce33f01": "withdrawLimit(address)", +"fce3b91e": "IdolToken1()", +"fce3bbb5": "setSelling(bool)", +"fce44634": "isValidHashType(uint8)", +"fce48558": "countryOf(uint256)", +"fce4c128": "checkInvestmentRequired(uint16,bool)", +"fce4f84f": "sellToConsumer(address,uint256,uint256)", +"fce59d0c": "MangoRepo()", +"fce6d586": "LogClaim(address,uint256)", +"fce78e5e": "TurtleToken(uint256,string,string)", +"fce846e8": "getExtraBonus()", +"fce87fb0": "tokenUriPrefix()", +"fce897e5": "payBid(address,uint256,bytes)", +"fce908ad": "whitelistTx(address,address)", +"fce927f3": "issueReservedTokens(uint256)", +"fce9fbff": "minWeiPerContributor()", +"fce9fdd9": "MPYCreation(address,uint256)", +"fceb9852": "isToOffChainAddresses(address[])", +"fcec617a": "conflictEndFine()", +"fcec962e": "adminWithdraw(address,uint256,uint256)", +"fceca4a0": "VICOXToken(uint256,address)", +"fcecbb61": "getReceipt(bytes32)", +"fced4a86": "CryptoHuntIco(uint256,uint256,address,address)", +"fced5694": "FOUNDER1_STAKE()", +"fced6ad2": "KARMAtoken()", +"fcee45f4": "getFee(uint256)", +"fcef09d6": "BlipCompetition(address)", +"fcef56a4": "createBar()", +"fcefe706": "getOutputIndex(uint256)", +"fcf07c6b": "foundationAddress()", +"fcf0f55b": "eventOracles(bytes32,uint256)", +"fcf23a92": "LogOwnerChanged(address,address)", +"fcf23d63": "getMatchInfoList03()", +"fcf2f85f": "requiredDevSignatures()", +"fcf32769": "adminWithdraw(address[4],uint256[5],uint8,bytes32,bytes32)", +"fcf3438c": "setSmsCertifier(address)", +"fcf36918": "doCall(bytes32)", +"fcf40170": "cleanWallets()", +"fcf4333a": "updateHashrate(address)", +"fcf43ce2": "setValidTransferAddress(address)", +"fcf4b576": "getVaultAccess(address)", +"fcf516aa": "VuePayToken()", +"fcf5462e": "SuperUltraUltraCoin()", +"fcf56577": "setRequesterLock(bool)", +"fcf7e73d": "addBeneficiary(address,uint256,uint256,uint256,uint256,bool,string)", +"fcf7fe50": "push(address,uint256,uint256,bool)", +"fcf84962": "InvestAddEvent(address,uint256)", +"fcf8566e": "unsoldCleanUp()", +"fcf911e7": "delAddressValue(bytes32)", +"fcf9c44d": "soldUET(address,uint256,bytes32)", +"fcfa2bfe": "SALES_START()", +"fcfa63e3": "getResourceAddress(string)", +"fcfbc962": "Unset(string,string,address)", +"fcfc1577": "masterFns(bytes32)", +"fcfc208e": "unclockAddressDuringITO(address,address)", +"fcfd3a4c": "PreICO(address)", +"fcfdaa52": "successfulTime()", +"fcfdbc23": "perform_withdraw(address)", +"fcfdcf8a": "removeOpenMakeOrder(address,address)", +"fcfdeba8": "changeGameEnable(uint256)", +"fcfdf7c5": "decApprove(address,address,uint256)", +"fcfe2247": "setContributionDates(uint256,uint256)", +"fcfe6af1": "transfer(address,uint256,address,address,uint256,uint8,bytes32,bytes32)", +"fcff1eaf": "increaseGasSpent(bytes32,uint128)", +"fcff5ed6": "createChannelDelegate(address,address,uint192)", +"fcffb14e": "getNormalPayout(uint256)", +"fcfff16f": "open()", +"fd004f2d": "IRONtoken()", +"fd01249c": "createGen0Auction(uint256,uint256)", +"fd01d4a1": "ownerDivRate()", +"fd0326b4": "m_nextSale()", +"fd036052": "modPass(uint256,uint256,string,string,string)", +"fd037bc5": "changeIsPayableEnabled()", +"fd03846e": "setCreditBondContract(address)", +"fd03c006": "agreeCount()", +"fd03d762": "resumeWork(uint256)", +"fd03e721": "referraltokencontract()", +"fd049319": "distribute1BTCO(address[])", +"fd04a902": "totaletherstransacted()", +"fd04b606": "getMarketMarginPremium(uint256)", +"fd05ddfc": "CCCRCoin()", +"fd062d3b": "handleFees(uint256,address,address)", +"fd06c6a9": "issuePass(address,bytes32,uint8)", +"fd070667": "tournamentResult(uint32[3][11][32])", +"fd074c28": "removeWeapon(uint8[176],uint8,uint8)", +"fd074e8e": "checkIfMissionCompleted()", +"fd0801c1": "appendNumToString(string,uint256)", +"fd080993": "submit(bytes32,bytes32,bytes32)", +"fd083748": "isGason(uint64)", +"fd084b16": "etherPartition(uint256)", +"fd085b41": "minSaleAmount()", +"fd08921b": "getYear()", +"fd090e47": "DEPOSIT_PERIOD()", +"fd0998de": "Totalbalance()", +"fd09b6f0": "JNDToken()", +"fd09d013": "CROWDSALE_ALLOCATION()", +"fd0a7f3e": "grantGrantableAllocations()", +"fd0aeb34": "EderCoin()", +"fd0b9dc2": "verifyWithdrawUpdate(bytes32,bytes32,uint256,uint256)", +"fd0bb752": "getBonusReceived()", +"fd0c1edb": "_setVault(address)", +"fd0c2a76": "Crowdsale(uint256,uint256,uint256,address,address)", +"fd0c78c2": "secondaryOperator()", +"fd0cdcdb": "withdrawRemaining(address)", +"fd0cfa91": "baseFeeDivisor()", +"fd0d1322": "WETCC()", +"fd0dd4d0": "btnSupply()", +"fd0e4695": "_canceloffer(address)", +"fd0edbd6": "refundSeller(address,address,uint256)", +"fd0f267b": "deathData_v0()", +"fd0f5a81": "updateWEIAmount(uint256)", +"fd1075d0": "setTokenRewardRate(uint256)", +"fd1094a9": "JaiHoToken()", +"fd12c1cb": "ethFnkRate2()", +"fd1343f1": "ESOPAndCompanySet(address,address)", +"fd138223": "remainingBountySupply()", +"fd13a7ce": "isPurchaseWithinCap(uint256,uint256)", +"fd14492a": "DinoTokenSale()", +"fd14ecfe": "balanceOfSPS()", +"fd15e091": "changeSymbolName(string)", +"fd17f289": "teamTokenSupply()", +"fd186de6": "StoToken(address,address)", +"fd18b484": "VitaToken()", +"fd19368a": "isEditionAvailable(uint8)", +"fd1a0a55": "JINGJING()", +"fd1aaa72": "sendToOwnerBalance(address,uint256)", +"fd1af169": "canSend(address,address,uint256,bytes)", +"fd1bd9b0": "getAmountLeft()", +"fd1c50e0": "sellAtIndex(uint256,uint256)", +"fd1c66da": "getCertificateIssued()", +"fd1ccaf3": "HideraNetwork(uint256,string,string)", +"fd1dc137": "settoken(address,bool)", +"fd1e582d": "ownertransfer(address,uint256)", +"fd1e5e7a": "getOrCacheDesignatedReportNoShowBond()", +"fd1f4ba5": "setAgenda(string)", +"fd1fb2fa": "rateB()", +"fd1fc4a0": "airDrop(address[],uint256)", +"fd203906": "getCarState(string)", +"fd208ca7": "endprivateIco(bool)", +"fd214edd": "collect(uint64,address[],address[],address)", +"fd221031": "tap()", +"fd221889": "priceFactorA()", +"fd222745": "melonport()", +"fd225cfd": "CoCoCoin()", +"fd228c0b": "isMintAgent(address)", +"fd22a6cf": "openGames(uint256)", +"fd23022a": "Orocoin()", +"fd232b59": "getEscrowPayments(uint256)", +"fd241e2b": "mintWithLocked(address,uint256,uint256)", +"fd2457d7": "clearStorage(bytes32[])", +"fd253492": "leadingHitCount()", +"fd255683": "getAddressValue(string)", +"fd260dfc": "getCertificationDbStatus(address)", +"fd263390": "setBank(address,bool)", +"fd26c460": "set_game(string,string)", +"fd275dd5": "TokenFreezerRules(address)", +"fd277399": "isService(bytes32)", +"fd27b51e": "getMarketSize()", +"fd27ce93": "checkRelease(address,uint256)", +"fd27d1d3": "getBlockPrice(uint256)", +"fd282afe": "batchSingleAmount(address[],uint256)", +"fd28392a": "changeSweepAccount(address)", +"fd289797": "_canSynthesizeWithViaAuction(uint256,uint256)", +"fd28feb3": "createInitialItems()", +"fd2994f7": "totalPointsPerToken()", +"fd2b4f23": "TheTestCompany()", +"fd2b6b19": "crowdSaleEnded()", +"fd2b863d": "produceUnitSeconds()", +"fd2c3abb": "targetDiscountValue8()", +"fd2c80ae": "updateInterval()", +"fd2ce18e": "getPayloadFrom(address)", +"fd2cee78": "pollEnded(bytes32)", +"fd2cf77a": "COLOR_BLUE()", +"fd2d39c5": "positionOf(address)", +"fd2db3f4": "countTotalInvestorsInCrowdsale()", +"fd2dba2f": "largeRate()", +"fd2e9caf": "PendingETH()", +"fd2ecc3f": "_setLastDate(uint256)", +"fd2edd76": "TOTAL_LOCKS()", +"fd306ca7": "transferProfitToHouse()", +"fd30929a": "disable(address[])", +"fd32649f": "cleanLog()", +"fd32f088": "calVoteResultByIndex(uint256)", +"fd330b26": "Total_Gamblers()", +"fd338726": "updatePlayerRewards(address,address)", +"fd339d18": "testAuthorityTryAuthUnauthorized()", +"fd345fc2": "totalNominees()", +"fd34d443": "kyberSwap(uint256,address,address,bytes32)", +"fd34e22e": "addrToForumId(address)", +"fd35c16d": "createLibra(bytes32[],bytes16[],uint256[])", +"fd35e71b": "entryPayoutDue(uint256)", +"fd367f7d": "toggleFeatured()", +"fd36c3f9": "burnFromAdmin(uint256)", +"fd37f1d0": "setInv1(address)", +"fd38af55": "testDebugClock()", +"fd39b40b": "GameScored(bytes32,int256,int256)", +"fd39ba59": "totalPreICOSupply()", +"fd3a77db": "acceptManagership()", +"fd3ab282": "q()", +"fd3acb5c": "getRoundOfSixteenResult(uint256)", +"fd3b34e6": "AddEntity(bytes)", +"fd3bbba5": "openOrCloseSale(bool)", +"fd3c1391": "flushShareNext()", +"fd3c1c43": "wolkAddress()", +"fd3c4277": "BattleDromeICO()", +"fd3c4cbf": "bidERC20(uint256,uint256)", +"fd3c88bd": "MultiVault(address,uint256)", +"fd3c9144": "intervalTime()", +"fd3cabc0": "_triggerPVEFinish(uint256)", +"fd3cb5d1": "doCommunityMinting(address,uint256,int256)", +"fd3d0dbf": "ioxis()", +"fd3d8cdc": "registerNameXID(string,bool)", +"fd3e2d86": "EpayToken(uint256,string,string,uint8)", +"fd3e50a7": "deliver()", +"fd3e6a0a": "transfers(address,address,uint256)", +"fd3ecae6": "changeExtendedTime(uint256)", +"fd3eefe9": "getAvailableAmount(string)", +"fd3f1a04": "unapprove(uint256)", +"fd3f2f66": "changePrivateContribution(uint256)", +"fd408767": "fireEventLog4()", +"fd40a1e9": "addMarketItem(bytes16,bytes16,bytes16[])", +"fd413596": "addBulk(address[])", +"fd41477f": "previligedLock(address,uint256)", +"fd414a29": "TOKEN_RATE_20_PERCENT_BONUS()", +"fd425dd5": "initCopper()", +"fd42657a": "_currentOwner()", +"fd426e40": "remainingTokensVIPs()", +"fd4446f3": "ICOSALE_JOINTTOKENS()", +"fd460302": "internalPresaleVesting(address,uint256,uint256,uint256,uint256,uint256)", +"fd4649ae": "UpdateUserPELOBonus(address,uint256)", +"fd46544a": "deleteAllBioTranslations()", +"fd467473": "setupFundingRate(uint256,uint256)", +"fd468aaa": "setPeriods(uint8)", +"fd473852": "TaiChiCoin()", +"fd475875": "newInversor(address,address)", +"fd475fa2": "requestAddAdmin(address,string)", +"fd478ca9": "getNumParticipants()", +"fd47eda6": "getMarketInterestRate(uint256)", +"fd48cc45": "challenge(bytes32,uint256,string)", +"fd4931a3": "getUintUsername(address,address)", +"fd4a343d": "extraMint(uint256)", +"fd4ad523": "recentlyEndedGames(uint256)", +"fd4b9d4d": "smalobox()", +"fd4bd17b": "calculateWineBuySimple(uint256)", +"fd4c5c9f": "MIN_LEADER_FRAC_BOT()", +"fd4c8c30": "PlayX20()", +"fd4d603c": "PS_PRICE()", +"fd4dabef": "solved(uint256,bytes32[])", +"fd4dbdf2": "T20coin(uint256,string,uint8,string)", +"fd4e165e": "RiceFarmer()", +"fd4e4d75": "addressA()", +"fd4eeb8f": "isOMICrowdsaleContract()", +"fd4f4125": "totalEtherHasBeenReceived()", +"fd4faee0": "Chain1()", +"fd4ff437": "addWhitelistBulk(address[],uint256[])", +"fd50299a": "addFeedback(address,uint256,address,string,uint8)", +"fd507f75": "airdropMultiple(address[])", +"fd50b005": "buyForWhitelisted()", +"fd52b3cd": "olumla()", +"fd52bdd5": "TweetherToken()", +"fd530c17": "Deposit(bytes20,uint256)", +"fd531e93": "getCertificate(address)", +"fd535203": "refundEther(uint256)", +"fd53e7b4": "admin_active_withdraw(address)", +"fd54fab8": "calculateBonusTokensAmount(uint256,uint256)", +"fd554229": "getGidOfRarity(uint8,uint8)", +"fd55714d": "getTotalCampaignsByCountry(string)", +"fd557d39": "queryCost()", +"fd56317d": "ANMvesting()", +"fd56d4c8": "getControlInfoPerToken(uint256)", +"fd577343": "setDefaultOperator(address)", +"fd57e9f9": "deleteElement()", +"fd57ee6d": "timelock(address,uint256,uint256)", +"fd58e63a": "setBonusMultiplier(uint256)", +"fd5a6019": "testUser(address)", +"fd5a60e1": "killDragon(uint256)", +"fd5c0663": "distributeBalanceToInvestors()", +"fd5c40ea": "ELIX_ADDRESS()", +"fd5c6694": "createGennezise(uint32)", +"fd5cb32c": "ItemBought(address,uint256,uint256,uint256,uint256)", +"fd5d173b": "MAX_NUM_OZT_TOKENS()", +"fd5d3e01": "getContractOrigin()", +"fd5eddf3": "supplyTokens(uint256)", +"fd5f1e03": "getParticipantLockedAmount(address,address,bytes32)", +"fd5f7256": "adminRetrieveContractConfig2()", +"fd5fde65": "mintTimeLockedTokens(address,uint256,uint256)", +"fd600107": "BONUS_TIER2()", +"fd600408": "tpe()", +"fd607594": "min_payment()", +"fd609b91": "DelVoteMemberCandidate(uint256)", +"fd60e1a8": "getReferralCounts()", +"fd6133a6": "updateTokensAvailable()", +"fd6180cb": "tokenDividendsOf(address)", +"fd619dce": "sigBountyProgramAddress()", +"fd61a725": "getMinimumReportingFeeDivisor()", +"fd626a86": "sellKWHAgainstEther(uint256)", +"fd6273a3": "ERC20KKToken()", +"fd6358ce": "setPricingStrategy(uint256,uint256,uint256,uint256,uint256,uint256)", +"fd636975": "addWeight(address,uint256)", +"fd637f02": "TEAM2()", +"fd63f640": "getLLV_edit_5()", +"fd645193": "RegistrationBonus(address)", +"fd64eccb": "isForwarder()", +"fd651d2c": "TransferBy(address,address,uint256)", +"fd655073": "balancesForWithdraw(address)", +"fd6673f5": "getNumberOfPlayers()", +"fd669810": "close(address,address,uint8,uint256)", +"fd67db81": "getCharity(uint256)", +"fd68610f": "getEtherBack()", +"fd6887af": "queenPrestige()", +"fd68a422": "returnmoneycreator(uint8,uint128)", +"fd68e463": "FeitebiToken(uint256,uint8,string,string)", +"fd68f377": "ethyclos()", +"fd69f3c2": "getMarketCount()", +"fd6aad25": "indexOf(address)", +"fd6b7ef8": "safeWithdrawal()", +"fd6ba459": "mintCard(address,uint8[14])", +"fd6bb46c": "addWeb(string)", +"fd6dd889": "marketTokenCreated()", +"fd6e1b50": "reportBenign(address)", +"fd6e3bfe": "setNFTAddress(address,address)", +"fd6ecb7b": "getReceiptDetails(bytes)", +"fd6efe80": "DiscCoin()", +"fd6f4137": "getAdvocate(address)", +"fd6f5270": "CouponDeposit(address[2],uint256[7],uint8,bytes32[2],uint256)", +"fd6f5430": "setContent(string,bytes32)", +"fd70813b": "setTermsAndConditions(string)", +"fd70b40d": "HashToken(address)", +"fd70f406": "citiesCount()", +"fd71b579": "LockMechanism(address,uint256)", +"fd720090": "right86(uint256)", +"fd7230d6": "create(uint256,bytes)", +"fd72a11a": "TorusCoin(uint256,address)", +"fd72e22a": "operationsWallet()", +"fd735602": "executeN()", +"fd7394ae": "IndividualityToken()", +"fd743f2b": "Coke()", +"fd747c0b": "rsaVerify(bytes,bytes,uint256,bytes)", +"fd74a151": "ETH_FUND_DEPOSIT()", +"fd7560ca": "distributeEarningsBasedOnScore(address,address)", +"fd75b8d4": "calculateGrantClaim(address)", +"fd7611c7": "withdrawContractTokens(address)", +"fd764e68": "transfer(uint256,address,address[],uint256[],uint8[],bytes32[],bytes32[])", +"fd777d9e": "teste1()", +"fd77905c": "setColorMetadata(uint256,string)", +"fd7801df": "getCitationLength()", +"fd782de5": "Proxy()", +"fd7903a0": "getTeamFromLeaderboard(uint16,uint8)", +"fd790923": "keyImageUsedUpdate(uint256[2])", +"fd791031": "gamesFund()", +"fd793c76": "btg()", +"fd79c2a9": "ContractName()", +"fd7a1b00": "forbidDeploy(address)", +"fd7ab1ad": "chiudi_votazioni()", +"fd7ac203": "TestToken()", +"fd7af387": "canTransferBetweenUsers()", +"fd7afee8": "insertData(uint256,string,string)", +"fd7c074f": "changeReceivingAddress(address)", +"fd7c460d": "ciberLottery()", +"fd7caf4d": "loyaltyCap()", +"fd7d7948": "getTranformedId(uint64)", +"fd7e1bee": "freezeTime()", +"fd7f611e": "createCompany(string)", +"fd7fc0e0": "invest(uint32)", +"fd7fe115": "grantAccess(address,bool)", +"fd7feb35": "cancelWonderSale(uint256)", +"fd7ffdb8": "recordSystemOnSaleToken(uint256)", +"fd8055d2": "updateBOTBillingInfo(uint256,string,address,string,string,uint256)", +"fd809759": "getYearIdx()", +"fd810eb3": "logAccess(bytes32,string)", +"fd8113e9": "checkprevowner(address)", +"fd812e7c": "revealHash(uint256,uint256,bytes4)", +"fd814dbd": "GameXToken()", +"fd8258bd": "canIssue(address,address,address,uint256)", +"fd82902d": "MeowCoin()", +"fd82a59f": "advisorsTokensVault()", +"fd83915e": "changeOwnership(bytes32,address)", +"fd83da09": "lastSaleDate(uint256)", +"fd83f3e3": "QueueUserMayBeDeliveryDroneCotnrol()", +"fd842125": "ricardianVoucher()", +"fd854148": "periodDuration(uint256)", +"fd85b1a7": "openChannel(uint256)", +"fd8663d2": "setBuyBackFund(address)", +"fd86e49d": "token_is_active(address)", +"fd872458": "PK(address,uint8,bytes32)", +"fd874a7b": "blockedTimeForBountyTokens()", +"fd87f2cb": "ADXProxy()", +"fd8828eb": "rawSetPrice(bytes32,uint256)", +"fd89a9b5": "enableImpairedTokenContract(address,bool)", +"fd89d17f": "THIRD_SUPPLY()", +"fd8ac8d0": "capDay2()", +"fd8acc42": "buyAuction(uint256)", +"fd8ae24b": "getTimeLeftInQ1()", +"fd8b09c2": "ENBToken()", +"fd8bb681": "earlyBackerList(uint256)", +"fd8bcf6d": "requestCancelationTime()", +"fd8be237": "CrowdsaleToken(string,string,uint256)", +"fd8c46e7": "distributeTokensToShareholders(address,uint256)", +"fd8c6fe4": "RexToken(uint256,address,address)", +"fd8d4bff": "MoyOpenDistribution()", +"fd902d1e": "setCutoffs(uint256)", +"fd904207": "OPTCToken()", +"fd906c0f": "createClone(address,string,string,string,address,uint256)", +"fd906ec9": "participate(bytes1[64])", +"fd909594": "icoGoal()", +"fd90a668": "allowManuallyMintTokens()", +"fd911997": "make(uint256,address,address,bytes32,bytes32,uint256,uint256)", +"fd9133f3": "LOCKTokenCOIN()", +"fd9168a9": "setRef(uint256)", +"fd9177b5": "LogMoveMade(uint256,uint8,uint8,uint8,uint8)", +"fd922a42": "server()", +"fd923a9e": "setCentsExchangeRate(uint256)", +"fd925795": "pvt_plmt_remaining_in_Wei()", +"fd9304cd": "minInvestmentValue()", +"fd93236b": "bankerEndTime()", +"fd9393c3": "init(uint256,string,string)", +"fd93bdb1": "changeRestricted(address)", +"fd94c80b": "priEtherReceived()", +"fd958695": "isAlphaNumeric(bytes1)", +"fd97a008": "autoDividendsFor(address)", +"fd97c61a": "getgamecardcount()", +"fd97d3c1": "giveCrypto()", +"fd9923ce": "asmTransfer(address,address,uint256)", +"fd994513": "executeVote(uint256[])", +"fd99a746": "transactionsCount()", +"fd99c012": "USDTUBESupply()", +"fd99c6a4": "upgradeCar(uint32,uint8)", +"fd9a4e61": "transferTokens(uint256)", +"fd9b41ff": "getCurrentFieldBalanceAndTarget()", +"fd9b8763": "Multiplier()", +"fd9be522": "withdrawFee(address,uint256)", +"fd9bf0a4": "_setPermissions(address,address[])", +"fd9bf3aa": "mint(address,int256)", +"fd9e2120": "initPara(uint256,uint256,uint256,uint256,address,uint256,uint256)", +"fd9e5fbf": "setTimeStaked(uint256,address)", +"fd9e8ff7": "Shard()", +"fd9f12b0": "isYellow()", +"fd9f6856": "lastDepositor()", +"fd9f9b87": "isOption(address)", +"fda0078f": "AKTestEther1(address,address,address,uint256,uint256,uint256)", +"fda03476": "luckySevenBets()", +"fda08958": "isServer(address)", +"fda0c61d": "setupWhitelist(address)", +"fda237f8": "genesisToken()", +"fda263e8": "timeEnd()", +"fda27af2": "claimSiteToken(uint8,uint256)", +"fda49eb4": "treasurer()", +"fda69fae": "getInt(string)", +"fda76eef": "RewardsGiftToken()", +"fda78599": "ecoSystemWallet()", +"fda79925": "complianceAddress()", +"fda80435": "c_MinInvestment()", +"fda86c95": "internalRevokeCert(bytes32,bytes,bytes32,bool,uint256)", +"fda92d3e": "ErrorMsg(string)", +"fda962d3": "totalGenesisRecipients()", +"fda9aafe": "WyzonCredit()", +"fdaa2632": "UploadURL(uint256,string)", +"fdaa94de": "deleteAddr(address,bytes)", +"fdaacf1b": "transferOwnerMoney(address)", +"fdab1b7b": "getCurrentAuctionPrice(address,address,uint256)", +"fdab5627": "_approveCertificate(uint256,bool)", +"fdac0025": "cups(bytes32)", +"fdac3a20": "set_eth(uint256)", +"fdac9ff7": "setAttributeValue(address,bytes32,uint256)", +"fdacbecd": "geteths(address)", +"fdacd576": "setCompleted(uint256)", +"fdad711d": "setFinalPayoutDistributionHash(bytes32)", +"fdade29f": "BuyBooster()", +"fdae3b70": "proofOfSms()", +"fdae6a92": "setTokenFeeMake(address,uint256)", +"fdae8a4c": "isAddressInBlackList(string,address)", +"fdaed331": "getTransferedUser(uint256)", +"fdaed778": "testConcatStorage32Bytes()", +"fdaf150c": "abc_initNetwork()", +"fdaf22e8": "minutos()", +"fdb04023": "closeVirtualChannel(bytes32,bytes32)", +"fdb31d10": "_createToken(string,bytes5,string,string,string,string,string,address,uint256)", +"fdb357be": "getVotingForCount(address)", +"fdb39c40": "userNameHashTaken(bytes32)", +"fdb406cb": "outstandingTokens(address)", +"fdb473b1": "unsetMyName()", +"fdb4dbe0": "totalEgg()", +"fdb5a03e": "reinvest()", +"fdb7b065": "marketDataOracle()", +"fdb7d435": "TEC(uint256,string,string)", +"fdb837e8": "GetTotalClicks()", +"fdb89360": "ParkCoin(uint256,string,string)", +"fdb914e2": "capPreSale()", +"fdb986cc": "NiobiumToken()", +"fdbab5f5": "PUBLICSALE_ENDTIMESTAMP()", +"fdbaf779": "internalBuyTokens(address,address)", +"fdbb16fd": "setEthPercent(uint256)", +"fdbb5aee": "ChannelNewBalance(address,address,uint256,uint256)", +"fdbb9fdb": "UNJUST(string,string,uint256,uint256,bool)", +"fdbc368a": "_ensureNewUser()", +"fdbc4006": "getCandidateList()", +"fdbc6530": "updaterAddress()", +"fdbc938d": "BlessingChainAlliance()", +"fdbd2534": "acceptCoinSale()", +"fdbd8dd8": "investInternal(address,uint256)", +"fdbd956d": "oraclize_query(uint256,string,bytes[],uint256)", +"fdbda9a7": "parentChange(address)", +"fdbdc112": "backersIndex(uint256)", +"fdbf0765": "hash(bytes20,uint96,uint32,bytes32[],uint16)", +"fdbf17d0": "computeFinalStake(uint256)", +"fdc03ca2": "enterContract()", +"fdc0713b": "getMinAuditPriceCount()", +"fdc193a4": "test3Fails()", +"fdc202f1": "Ticket(string,uint256)", +"fdc24095": "returnMasterNodes(address,uint256)", +"fdc272fe": "getTokenVolumebasedBonusRateForPhase3(uint256)", +"fdc292ea": "token(address,address)", +"fdc35112": "LogBuy(address,uint256,uint256)", +"fdc37c85": "securityCheckURI()", +"fdc3d8d7": "nextTaskId()", +"fdc40466": "maxInterestTime_()", +"fdc4741b": "addRecToQueue(address,uint256)", +"fdc487a7": "FundWithdrawl(address,address,uint256)", +"fdc4b338": "authorizeExtension(uint256,bool,string)", +"fdc4c3eb": "reservedWithdraw()", +"fdc5bf2c": "releaseToBuyer()", +"fdc61dd1": "coinAddress()", +"fdc63c5c": "aprobarMensaje(uint256,uint8,string)", +"fdc65c8c": "stakingBonusTokens()", +"fdc69291": "_adjustSupply(address,uint256)", +"fdc89f73": "toPowerOfThreeHalves(uint256)", +"fdc967e5": "jDallyCoin()", +"fdc98399": "getCurrentBuyerRateInPermilles(bool)", +"fdc99064": "unregisterNotary(address)", +"fdc9d0f4": "Telegram()", +"fdc9e72d": "_ownMint(uint256)", +"fdcb6068": "accessManager()", +"fdcb7539": "contruibuteData(bytes)", +"fdcbd0ec": "_deleteMinion(uint32,uint8,uint64)", +"fdcbd9b0": "GatewayStatusUpdated(bool)", +"fdcc6be3": "claimedPreICO(address)", +"fdccf45e": "computeCurrentPriceImpl(uint16,uint64)", +"fdcd0a18": "isRefundsEnabled()", +"fdcd649e": "EthAnte()", +"fdcd86ab": "addBets(bytes32)", +"fdce7f5e": "JinglesOpened(address,address,uint256)", +"fdce8e02": "checkHash1(address,uint256,address,uint256,uint256,uint256)", +"fdce9565": "determineWinner(uint256[7][],uint256[7][])", +"fdcea342": "fixPlayerMiddlename(uint256,string)", +"fdced779": "KozzProjectToken()", +"fdcf154c": "SODCOIN()", +"fdcf6f16": "getTopCompanyAtIndex(uint256)", +"fdd0298e": "PresaleAdded(address,uint256,uint256)", +"fdd080a4": "activateSaleContract(address)", +"fdd12c5e": "r(address,address)", +"fdd1a4e9": "externalCheckSign(bytes32,bytes,address)", +"fdd245ee": "referralLinkMinimum()", +"fdd2f2b0": "TIME_MULTIPLIER()", +"fdd3a879": "quick()", +"fdd3af8f": "fillTrade(address,uint256,address,uint256,uint256,uint256,uint8,bytes32,bytes32)", +"fdd3c1a1": "distributeTimelockedTokens(address,uint256,uint256)", +"fdd3e3ff": "_removeAuction(uint256)", +"fdd3ea94": "submitPeerReview()", +"fdd42e29": "TokenOTBC(uint256,string,uint8,string)", +"fdd4fd69": "penaltyDisbursalAddress()", +"fdd5828f": "massPay(address[],uint256)", +"fdd6a803": "readowners()", +"fdd6df8c": "mul2Require(uint256)", +"fdd7d87b": "decline(address,address)", +"fdd868df": "getTracks(uint256,uint256)", +"fdd8a733": "TokenCoinExchanger()", +"fdd8ed02": "BetPlaced(uint256,uint256,address,uint256)", +"fdd96ae0": "compensateContributors(uint256,uint256)", +"fdda3d8a": "setVicepresidenteDeMesa(bytes32,uint256,uint256,uint256)", +"fddaf68a": "getTipperPercentage(uint256,uint256)", +"fddb4683": "ERC20(string,string,uint256)", +"fddb7ef0": "mainSaleBonuses(uint256)", +"fddbcca5": "pause_4()", +"fddc4686": "getOwnedAssetsLength()", +"fddc5545": "BitHaus()", +"fddcbd09": "burnByCreator(address,uint256)", +"fddcc148": "iterator()", +"fdddb3ae": "Athena()", +"fddf0fc0": "ethRaised()", +"fddf16b7": "INTERFACE_SIGNATURE_ERC721()", +"fddf4e3b": "_packCombinedParams(int256,int256,int256,int256,int256)", +"fddfec78": "allowTransfer(address,address)", +"fde045b9": "HODLaddress()", +"fde07212": "Betting()", +"fde074c8": "betAddrsCount_()", +"fde0a64d": "admin_inactive_payable()", +"fde1276a": "removeDiscount(address)", +"fde17733": "demiseCEO(address)", +"fde1ee44": "addAttestation(string,bool,address)", +"fde20b6c": "tipPercentageLocked()", +"fde34dc4": "finalize(uint256,uint256,bytes32)", +"fde3cbd6": "NucleusVisionCoreToken()", +"fde440bb": "setPayoutNumeratorsValue(uint256[])", +"fde45344": "untrustContract(address)", +"fde46b03": "_set1()", +"fde4b39d": "updateStages()", +"fde4d9bf": "setAutoPrice()", +"fde5ca7d": "calcDevReward(uint256)", +"fde5e124": "t_Andrey2()", +"fde63e96": "CreateSpecialPlayer(bytes32,uint8,uint8,uint256,uint256,address)", +"fde6adb1": "placeBet(uint256,uint256,uint256,uint256)", +"fde7c834": "increase_bounty(address)", +"fde83a34": "tokensForTeam()", +"fde90733": "isRequestingEscapeTo(uint32,uint32)", +"fde9683d": "ICO_DAYS()", +"fde99668": "removeOrder(bytes32)", +"fde9ba41": "transfer(bytes,address,uint256)", +"fde9cded": "whichAuction(uint256)", +"fde9e506": "calcDividendsSum(address)", +"fdea8e0b": "presale()", +"fdeb49b0": "allocationsLength()", +"fded813c": "getInvoiceBalance(bytes32)", +"fdeddab2": "windUpContract(uint64)", +"fdee38a9": "ETH_TLD_NODE()", +"fdee4ff9": "setExpectedReturn(uint256)", +"fdee579c": "MINfinney()", +"fdee5c22": "THAWING_DURATION()", +"fdee60e9": "peloExtenstion()", +"fdee69f4": "calResult()", +"fdef9106": "hasPermission(address,address,bytes32,bytes)", +"fdf061f0": "adminWithdrawBalance()", +"fdf0d8e0": "get_account_balance_token(address)", +"fdf1a434": "updateMinInvestmentForIco(uint256)", +"fdf1aba0": "check1(uint256,uint256)", +"fdf31b39": "incrementTasksCompleted(address)", +"fdf372ad": "niceguy2()", +"fdf3b97f": "calculateVestedTokens(uint256,uint256,uint256,uint256)", +"fdf3fa53": "RemoveCategory(uint256)", +"fdf54c98": "SocialNode()", +"fdf55523": "numRefCredits(address,bool)", +"fdf56d57": "voteElection(uint256)", +"fdf58814": "getLLV_edit_3()", +"fdf62f05": "createEngine(uint256,string,uint256,uint256,uint256,uint256)", +"fdf6393c": "removeExistingDiscount(address)", +"fdf762bb": "TEAM_AND_ANGEL_SUPPLY()", +"fdf78f70": "unlockStatus(address)", +"fdf7983a": "safeTransferChild(address,address,uint256,bytes)", +"fdf8e11c": "getTotalAngels()", +"fdf97cb2": "trustee()", +"fdfa571e": "getDrawStatus(uint32)", +"fdfac8e5": "BMC()", +"fdfcb425": "activate(address,uint256,uint256,uint256,bool,bool)", +"fdfd5b43": "determineWinnerScript()", +"fdfecb0c": "isEcoAllocated12()", +"fdff31ed": "getPairSellLoyaltyPerc(address,address)", +"fdff6b30": "testInitialBalanceUsingNewContract()", +"fdff85b4": "CONFIG_RETURN()", +"fdff9b4d": "managers(address)", +"fe0030d9": "IRPToken()", +"fe00344a": "AuctionCompleted(uint256,uint256,address)", +"fe006839": "INITIAL_SUPPLLY()", +"fe00779e": "removeBountyAddresses(address[])", +"fe007eeb": "SmartRouletteTokenDividend()", +"fe00b3a3": "kosacafToken()", +"fe0149a0": "ZQCToken()", +"fe01ee96": "Clearing(address,uint256)", +"fe01f1ff": "TokenTester()", +"fe01ff62": "verifyTx(uint256[2],uint256[2],uint256[2][2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2],uint256[2])", +"fe02739c": "releaseJackpot()", +"fe029156": "swap(address,address,uint256,uint256)", +"fe038093": "createTeams()", +"fe04a5bc": "senderMIT()", +"fe04cb1d": "setStatusPrice(uint256)", +"fe052bc6": "minimumInvestmentInWei()", +"fe05e8b1": "assertFact(uint256,string)", +"fe05f7c2": "destroyforeth(uint256)", +"fe063351": "newCustomer(address,string)", +"fe06a915": "totalMTPAllocated()", +"fe082a21": "SFEscrow()", +"fe085775": "PresaleAllocation(address,uint256,uint256)", +"fe08e5fe": "setGalleryTwoPrice(uint256)", +"fe0904e6": "minerDifficulty()", +"fe094708": "Map(address,address,uint256,uint256)", +"fe098371": "findFrozenCell(address,uint128,uint128)", +"fe0a2c30": "returnArrayBytes1(uint8)", +"fe0a5ab0": "BLOCKS_BUCKET_SIZE()", +"fe0ba34e": "placeSellRequest(uint256,uint256,uint256)", +"fe0c32ae": "INEX()", +"fe0c4085": "vestingEnded(address)", +"fe0d94c1": "execute(uint256)", +"fe0dadd7": "teamTwoTotalPlayers()", +"fe0f2fab": "ChangeClaimAddress(address,address)", +"fe10d836": "setTokensToBeClaimed()", +"fe110116": "transferToPool()", +"fe12aeec": "SalesAgentAppointed(address,address)", +"fe1391ad": "generateFixtures()", +"fe13a823": "computeResponseFirstHalf(uint16)", +"fe13b118": "beginDutchAuction(uint256,uint256)", +"fe13baf7": "_encodeTokenId(int256,int256)", +"fe1439b4": "setCTO(address)", +"fe14b085": "walletUserCount()", +"fe164a5b": "setWhitelistThresholdBalance(uint256)", +"fe168eef": "_isNoNeedInCountryLimitChange(uint256,uint256,uint256,uint256,uint256,uint256,uint256)", +"fe16e862": "transactionsOnForHolderUpdate(address,uint256)", +"fe16ed13": "getNDay(uint256)", +"fe173b97": "gasPrice()", +"fe1798a7": "randomAttack()", +"fe1829b6": "extendPublicSaleDiscountEndTime(uint256)", +"fe1865cd": "setCompte_26(string)", +"fe188184": "lastWinner()", +"fe18d6e6": "convertToEth(uint256)", +"fe18f82a": "getReceivedFunds(address)", +"fe192f1e": "parseIntRound(string,uint256)", +"fe195767": "distributeEPAL(address[])", +"fe19f495": "VESTING_CLIFF_DURATION()", +"fe1b0a5c": "setHardCap(address)", +"fe1b588f": "CoinExchange()", +"fe1b602a": "getPVPCycles(uint32[])", +"fe1b6f8f": "getVendorName(address)", +"fe1bae83": "callforhelp(uint256)", +"fe1c5aac": "SetParticipantURI(address,address,string)", +"fe1c91fa": "performWithdrawAccounting(uint256,address)", +"fe1cdbb8": "Module(address)", +"fe1ce5d7": "checkOwner(address,address)", +"fe1d2295": "BankWithdrawal(address,uint256)", +"fe1d470d": "calculateDiceProfit(uint256,uint256)", +"fe1da528": "tokensByEurTx(string)", +"fe1dcbb1": "AuthorizeOperator(address,address,bool)", +"fe1e079e": "getNumAnimalsXPlayer(address)", +"fe1ebb04": "augmintReserves()", +"fe1f06ea": "IQIAN(uint256,string,uint8,string)", +"fe1f11f1": "getNbits(bytes)", +"fe1f6a0b": "createGame(bytes32,address)", +"fe1fd352": "validEmitBuff()", +"fe211279": "testPrintableToken()", +"fe213712": "USER_GET_PRIZE()", +"fe21f306": "chainlinkOracleAddress()", +"fe229b61": "_softRequire(bool,bytes32)", +"fe229f7c": "RecToken()", +"fe22fcd8": "issuanceLastModified(address)", +"fe230675": "hasRecord(address)", +"fe23583d": "fechVoteResultForCandidate(address)", +"fe23b262": "currentPreICObalance()", +"fe23baea": "setHashByWriter(address,bytes32,address,bytes32)", +"fe23c6d1": "BetWon(address,uint256)", +"fe2450c1": "challengeRewardsPercent()", +"fe2506a4": "buyFromBal(uint256,uint256,bytes32)", +"fe2545dc": "purchaseFromVault(uint256)", +"fe25e00a": "arbiter()", +"fe26063f": "getTradeAndHash(uint16,address,address)", +"fe261ab0": "boolToUInt(bool,bool)", +"fe2622a5": "AgriChainDocuments()", +"fe2644c6": "creator_fee()", +"fe26cdeb": "And(bytes32,bytes32)", +"fe26da0c": "publicGetState()", +"fe26f16f": "withdrawABIHash()", +"fe275280": "Silver()", +"fe277aba": "chAllowAirdrop(bool)", +"fe280f2b": "roundInfo(uint32,uint32)", +"fe2830d3": "PausableCrowdsaleImplPaused(uint256,uint256,uint256,address)", +"fe28d1d8": "CROWD_WAVE2_BONUS()", +"fe29fc12": "CategoryCapSet(uint256,uint256)", +"fe2a4e62": "lockAndDistributeTokens(address,uint256,uint256,uint256)", +"fe2b6246": "updateMaxMinComparables(uint256,uint256,uint256,uint256)", +"fe2c6198": "price(string)", +"fe2ca553": "setBalances(uint256,uint256)", +"fe2cce6f": "PaylessMinisplit()", +"fe2cec21": "NeobitToken()", +"fe2d8933": "preIcoInvestors(address)", +"fe2da970": "getUserByUsername(bytes32)", +"fe2dac15": "LogNewQuestion(bytes32,address,uint256,string,bytes32,address,uint32,uint32,uint256,uint256)", +"fe2dc64b": "finalizeProposalVoteResults(bytes32,bytes32)", +"fe2e306b": "playe2Bid()", +"fe2e5db4": "SwapyExchange(address,address)", +"fe2edc1e": "retrieveFinished()", +"fe2fdf0b": "determineAllocation(address[],uint256[])", +"fe2ff4cf": "TokenSold(address,uint256)", +"fe31da3b": "disapproveByB(uint256,string)", +"fe32a6a7": "pushICO(uint256)", +"fe32c448": "TokenHolder(address)", +"fe332a0c": "backDARFtokenOwner()", +"fe33ada9": "isExistFounder(address)", +"fe34e486": "getStatus(bytes16)", +"fe353a5e": "checkWithdrawValueForAddressFX(address,uint256)", +"fe353d28": "_computeNextGen0Price(uint256)", +"fe35530c": "setUserWithdrawalAccount(address)", +"fe35804e": "createLottery(uint256,uint256)", +"fe37f21a": "changelp17(address)", +"fe389e09": "removeContract()", +"fe38ed66": "MarketManager()", +"fe396c71": "mintEarlySupportersTokens(address,uint256)", +"fe399121": "referrerEarnings_()", +"fe3b24b1": "createBBODocument(bytes32,uint256)", +"fe3c333b": "getActiveJudgmentByParty(address)", +"fe3c458e": "addContract(bytes32,address,bytes32)", +"fe3c51df": "getTeamId(string)", +"fe3c5d80": "becomeSnailmaster()", +"fe3c6ad4": "addclip(address,string,string,string)", +"fe3c9b6b": "setIcoEndTime(uint256)", +"fe3ce632": "lookup(bytes4,bytes)", +"fe3d002b": "AllocateAngelTokens(address,address,uint256)", +"fe3d07e4": "decrementInventory(uint256,uint256)", +"fe3d2236": "Oracle_ChangePeriod()", +"fe3e0efd": "TestERC20Token(string,string,uint256)", +"fe3ead72": "interreducemoney(address,uint256)", +"fe415139": "ProdPublicSale()", +"fe4170bc": "setDepositLock(bool)", +"fe417fa5": "claimTokens(address,uint256)", +"fe41b2da": "setInitialValidators(address[])", +"fe4215f7": "read_recast_config()", +"fe4259e3": "isMntpMigrated(address)", +"fe42cb2d": "setTokenExpectedFee(address,uint256,uint256,address)", +"fe42da15": "deleted(string,string,address,uint256)", +"fe435f6b": "getLLV_edit_33()", +"fe43be3f": "startDestruction()", +"fe442478": "sendFromContract(address,address,uint256)", +"fe44a664": "generateWithdrawalHash(string,uint256,address,uint256)", +"fe44d401": "MoncionToken()", +"fe4520ad": "_getOwnerTokens(address)", +"fe45c996": "reVerifiPost(uint256,bool,bool)", +"fe460201": "getTermsAndConditions()", +"fe4667e9": "getMaxLossAfterTrade(address,uint256,uint256,int256,int256)", +"fe47a2ad": "multiRequestAudit(string,uint256,uint256)", +"fe47a8a7": "totalFunding()", +"fe47c806": "processFunding(address,uint256,uint256)", +"fe47d34f": "USC(uint256,string,string)", +"fe49a9be": "ethGiven(address)", +"fe49ba1c": "getUnlockIdentifier(uint256,address,address)", +"fe49dd5f": "halveEntryPrice()", +"fe49e949": "requestChangeInsuranceFees(uint80,uint80,uint80,uint80,uint256,uint80,uint80,uint256)", +"fe4a3ac9": "setExecPrice(uint256)", +"fe4a3e5c": "TokenrateUpd(uint256,uint256)", +"fe4b84df": "initialize(uint256)", +"fe4c39fe": "setMaxArenaOneDay(uint256)", +"fe4c6b08": "_deliverTokens(address,uint256,uint256,uint256)", +"fe4caa64": "isAborted()", +"fe4cee66": "numberOfPartitions()", +"fe4d2a02": "_setupStages()", +"fe4d62f9": "getMiningKing()", +"fe4dd8d9": "getTokenApproval(uint256)", +"fe4e4a84": "exchangeIsRegistered(address)", +"fe4e6bf9": "queueMint(address,uint256,uint256)", +"fe4ee216": "transferTips(address,uint256,address,uint256,uint8,bytes32,bytes32)", +"fe4f7e11": "KangenToken()", +"fe501c6f": "ChannelSettled(uint256)", +"fe50cc72": "getGreeting()", +"fe50ce60": "getBloodlineFromParents(bytes32,bytes32)", +"fe51717a": "releasePause()", +"fe51c588": "changeFactoryAdmin(address)", +"fe52ee70": "setStartingTokensAmount(uint256)", +"fe530027": "trusteeWithdraw(uint256)", +"fe536ebe": "setPreferredSaleStartAndEndTime(uint256,uint256)", +"fe537a82": "upgradeTarget()", +"fe549815": "pendingTokenBalance()", +"fe54b5fc": "kyberHash()", +"fe553250": "adminTransferWorldBalance(uint256)", +"fe556cf0": "CirculationSupply()", +"fe55932a": "setName(uint256,string)", +"fe562ee6": "moveBlockValue(address,uint8,uint8,uint8,uint8,uint256)", +"fe5675cc": "toNext()", +"fe56e232": "setManagementFee(uint256)", +"fe56f5a0": "setEntranceFee(uint256)", +"fe5709c2": "getSlotWeight(uint256,uint256)", +"fe5709cd": "createPainting(uint256)", +"fe575a87": "isBlacklisted(address)", +"fe5815a6": "hasFinished()", +"fe58d3a3": "timeLimitEnable()", +"fe599559": "updateEthToUsdExchangeRate(uint256)", +"fe5a4e2d": "contractorReleaseFunds(bytes16,address,address,uint256,uint256)", +"fe5aa8e0": "getUserIndexOnToken(address,address)", +"fe5ba303": "reservesPerUnitToken()", +"fe5d5868": "XZBX()", +"fe5daae6": "_queAmount(uint256)", +"fe5e1853": "totalBet()", +"fe5e7e3e": "endICO14()", +"fe5f1dc4": "PRESALEPLUSCROWDSALE_EVE()", +"fe5f2e88": "refund(string)", +"fe5ff154": "recruitHeroFee()", +"fe602c65": "is_proposal_supported()", +"fe60d12c": "reserved()", +"fe60ed81": "changeUserGroup(address,uint256)", +"fe6129d5": "setPromoBonus(address,uint256)", +"fe61303b": "createGuardianSale(uint256,uint256,uint256,uint256,uint256,uint256)", +"fe6214c4": "LDTCrowdsale()", +"fe62a0a6": "transferFromPretgefund(address,uint256)", +"fe63300a": "registerExternalBill(uint256,address,address,uint256,uint256,uint256)", +"fe637e5e": "getScoreChange(int256,int256)", +"fe63d701": "removeQueueElement(uint256)", +"fe647394": "setTeamProfitAddress(address)", +"fe64d6ff": "changeAddress(address)", +"fe65066e": "setUsdMnr(uint256)", +"fe65bb65": "cashHistory()", +"fe669c26": "addPhase(uint256,uint256,uint256,uint256)", +"fe675deb": "Exchange(address,address,address,address,bytes32,uint256,address)", +"fe675f13": "toggleFieldActivation(string)", +"fe67a189": "finalizedTime()", +"fe67a54b": "endAuction()", +"fe687b2b": "teamc()", +"fe68b528": "getExchangeInformation(address)", +"fe68e285": "toNextStage()", +"fe68f73b": "getTargetBudget(uint256,uint256)", +"fe69c926": "onFrozenToken(address,uint256,uint256)", +"fe69dacd": "validDraws(address,uint256,uint256[])", +"fe6a0cd6": "hasNextSeedHashB()", +"fe6ad6c6": "isNotarized(bytes32)", +"fe6bca8f": "AllTest7()", +"fe6c19a4": "HelixexToken()", +"fe6cf9ee": "Krypticion()", +"fe6d4305": "ALC_DECIMALS()", +"fe6dcdba": "top()", +"fe6e0441": "minimalWeiTLP1()", +"fe6f0d82": "testConstructorEvent()", +"fe6f1b05": "percentDivider()", +"fe6f2a60": "matches(bytes32,bytes32)", +"fe6fef44": "setTokenQuota(uint256)", +"fe7009f2": "getSupplier(address)", +"fe704c1f": "RWQToken(uint256)", +"fe70a123": "KilledTokens(address)", +"fe70f417": "getNewForkReputationGoal()", +"fe71aec5": "LittleCactus()", +"fe71be6e": "monarchToken()", +"fe72277d": "addHashType(bytes32)", +"fe7279b1": "setTokenTransferFeeReceiver(address,address,address,address)", +"fe72ac7f": "newPrice(uint256)", +"fe72e717": "toDie(bytes)", +"fe72f3be": "addMember(string,string,string,uint256,string,string,uint256,string)", +"fe73bf21": "developer_edit_text_Exchanges_links(string)", +"fe73e3ec": "preliminaryGameResult(uint64)", +"fe73f74c": "withdrawTokenFromTAR(address,uint256)", +"fe742c6a": "millionInCents()", +"fe74f05b": "assertEq(int256,int256)", +"fe757fb5": "lastClaimPrice()", +"fe758a1e": "_timelimitCal(address)", +"fe75dff6": "GcoinProto()", +"fe75ff54": "runLottery(uint256)", +"fe76fbe3": "setStageOpeningTime(uint8,uint32)", +"fe777bcd": "etherForSale()", +"fe77adda": "reloadTickets(uint256,uint256,uint256)", +"fe77f5e5": "getCostToNextLevel(uint256)", +"fe7805f2": "MultiSigWallet()", +"fe786c5f": "prependUnderscore(string)", +"fe79bfd0": "giftCode(string,address)", +"fe7b0007": "calculateClaimable(address)", +"fe7baf8e": "RemoveAuthorityAddress(address)", +"fe7bf05e": "deathData_v6()", +"fe7c550f": "fibos(uint256)", +"fe7ccb79": "CCN()", +"fe7cd999": "registerForICO(address[],uint8)", +"fe7d1587": "canCall(address,address,address,address,bytes4)", +"fe7d8740": "getFreelancerContracts(address,uint256[],uint256[])", +"fe7e187f": "add_kycer(address)", +"fe7eba06": "getCurrencyLength(uint256)", +"fe7f0d14": "DST_BOUNTY()", +"fe800489": "totalUnitsLeft()", +"fe802d7f": "isMHTHolder(address)", +"fe8190ce": "test_v1()", +"fe8252f3": "withdrawlEnabled()", +"fe830334": "initToken(string,string,uint8,address,uint256,bool)", +"fe8311db": "sendLimitTokensToPartner(uint256)", +"fe8312c1": "validateWallet(address,bool,string)", +"fe836931": "freezeAmount()", +"fe8370bb": "NinjaCoin()", +"fe84bff5": "getTransferValue(uint256)", +"fe84c5ec": "fixedExpUnsafe(uint256,uint8)", +"fe853650": "getRandomHashesLength()", +"fe856722": "gasPrc()", +"fe859472": "PractiParlezToken()", +"fe86338c": "cancelOrderList(bytes32[],uint64[])", +"fe86de13": "testTrade(address,uint256,address,uint256,uint256,uint256,address,uint8,bytes32,bytes32,uint256,address,bool)", +"fe8705d5": "throwOnIncompatibleContract()", +"fe87ee28": "endRC()", +"fe8806f5": "removeRequest(address,address)", +"fe882fe2": "getValueAndBox(address)", +"fe88fc00": "balancsHolder(address)", +"fe892327": "DML_TOTAL_SUPPLY()", +"fe8925f4": "interestFeePercent()", +"fe89960f": "getFreeToken(string,address,uint256,bytes32,bytes32,uint8)", +"fe89a6c1": "MAX_ALLOWED_STAGE_1()", +"fe8a7458": "_isLowercaseLetter(bytes1)", +"fe8b2707": "depositedEtherGeneric(address,bytes4,address)", +"fe8b6642": "setEnforceRevisions(bytes32)", +"fe8beb71": "getVersionFor(address)", +"fe8cbe18": "LogBidWithdrawn(address,uint256,uint256)", +"fe8d640c": "setifoodCommunityAddress(address)", +"fe8d8c77": "setShouldGateGuard(bool)", +"fe8e6a63": "quarryCities(uint256)", +"fe8e77c7": "getGameIdByWalletUser(address)", +"fe8e992f": "unpackAllocation(bytes32)", +"fe8f4763": "ROYBOITokenIToken()", +"fe8f4bbe": "freedWinPoolToWinSystem()", +"fe8fb49f": "setLastMaxInvestments(uint256)", +"fe908b7a": "pay(bytes32,address,address,uint256,uint256,bytes)", +"fe90f3df": "WPAYCoin()", +"fe91d37f": "semanticVersionHash(uint16[3])", +"fe92049d": "submitAnswerByArbitrator(bytes32,bytes32,address)", +"fe925e80": "createLoan(address,address,address,uint256,string,uint256,uint256,uint256,uint256,uint256,uint256)", +"fe937fa4": "setEndMintDate(uint256)", +"fe949159": "sendMessageToChannel(string,string)", +"fe94e504": "setColor(uint8,string)", +"fe95112c": "faythe()", +"fe95a5ce": "hat()", +"fe95cbdd": "getAgentsWithService(uint256)", +"fe95ec9c": "popcnt32(uint32)", +"fe968ade": "putStcWithBto(uint256,uint256,bytes32,uint256,uint256,uint256,uint256,bytes32,bytes32,uint8)", +"fe972054": "create(string,string,uint8,uint256,address,uint256,uint256,uint256)", +"fe972f11": "_toMill(uint256)", +"fe97bcf4": "RandomNumberGenerated(uint256,uint8)", +"fe97e481": "maxCap_MInt()", +"fe97ee88": "hasPhone(address)", +"fe98184d": "trustedUniverseTransfer(address,address,uint256)", +"fe985cb9": "buyin(address)", +"fe98f1d1": "testCantFinalizeIfNotMultisig()", +"fe99049a": "transferFrom(address,address,uint256,uint256)", +"fe992c98": "balanceOfAll(address)", +"fe996956": "PMET(uint256,string,string)", +"fe99ad5a": "transferMinter(address)", +"fe9a3664": "supportList(address)", +"fe9afc5a": "LastUser()", +"fe9b7f2f": "maxAmountETH()", +"fe9bb2da": "setCSCFactoryERC721(address)", +"fe9bf404": "createManager(address,address)", +"fe9c3c28": "purchaseHalted()", +"fe9cc7f4": "VebEX()", +"fe9ccc1e": "maxBetWei()", +"fe9d2828": "getPI_edit_11()", +"fe9d7121": "StorageEther(address,address,address[],uint256,string,string,uint8)", +"fe9d744d": "buyBulkRegularCar(address,uint256[],address)", +"fe9d9303": "burn(uint256,bytes)", +"fe9e1c0f": "buyTokens_Vault(address,uint256,bytes8)", +"fe9fa16f": "testThrowExecuteSellOrderTwice()", +"fe9fab4d": "setPrices(string)", +"fe9fbb80": "isAuthorized(address)", +"fea0029d": "getEmissionType()", +"fea1377d": "USD_HARD_CAP()", +"fea22ae4": "newMinimumTokens(uint256)", +"fea277dc": "withdrawERC721(address,uint256,address,address)", +"fea2920e": "createNewDraw()", +"fea3afb6": "Update_UserPlayHistory_Data(uint32,uint32)", +"fea45621": "changeTotsupp(uint256)", +"fea5d7b1": "mgmtIssueBountyToken(address,uint256)", +"fea5d9e0": "lengthEqual(uint256[],uint256,string)", +"fea708f6": "totalPeriods()", +"fea78df4": "buyGold(uint256,uint256,uint8,bytes32,bytes32)", +"fea7bcfb": "additional(uint256)", +"fea8ae97": "MakerWithdrewERC20Token(address,uint256)", +"fea9b572": "MAX_NUMBER()", +"feaa29d8": "insertProfitHere()", +"feaa4cf3": "updateIntention(uint256,string,string,string)", +"feaaa476": "BurnToken(address[])", +"feac36d7": "insert(bytes32,bytes32)", +"feaceab4": "addPayment(string,address,string,uint256,uint256)", +"fead0097": "setTotalUnvestedAndUnreleasedTokens(address,uint256)", +"fead83a4": "redeemContingencyFundsBal()", +"feadce9c": "servicePause()", +"feadfdbd": "getTimeFromPrize()", +"feaea586": "recoverToken(address,address)", +"feaed589": "releasedMarketingTokens()", +"feaf0872": "getTokenTransferCount()", +"feaf1fe1": "registerToBlacklist(address)", +"feaf653d": "sendEth(address[],uint256)", +"feafb79b": "foundationAddr()", +"feb03fe1": "_handleProductionIncrease(address,uint256)", +"feb088ab": "openingTimePeriodTwo()", +"feb2432a": "addMediator(address)", +"feb272e4": "noDuplicates(bytes)", +"feb27ac9": "Proof_of_Tacos()", +"feb2a20c": "apiAccessDisabled()", +"feb31939": "attack(address,uint256,uint256[])", +"feb371cd": "VUP_TOKEN_SUPPLY_TIER2()", +"feb4ad89": "addEarlyPurchases()", +"feb4c708": "nextIdentityAccount()", +"feb50430": "getLevitatingKittens(bytes32,uint64)", +"feb5d106": "getBPCount()", +"feb7267b": "deleteMintable(address)", +"feb7d2fb": "KoniosToken(uint256,string,string)", +"feb80ee4": "stakeFromTokenContract(address,uint256)", +"feb99390": "add(uint128,uint128)", +"feba95fb": "purchaseFor(uint128,address)", +"febb0f7e": "bar()", +"febb1315": "gasLimitInWei()", +"febb5407": "currentLiquidity(address)", +"febc14b1": "roundCounter()", +"febc2980": "calculateWinnersCount(uint256)", +"febc8c39": "feeAffiliate()", +"febc9dec": "stringEquals(string,string)", +"febdb9b8": "rewardWinner()", +"febe4909": "approve(uint256,address)", +"febe8129": "destrcut()", +"febec059": "GetCurrentTypeSaleCount(uint256)", +"febefd61": "startAuctionsAndBid(bytes32[],bytes32)", +"fec07cb2": "calculateTally(address,uint256)", +"fec0cc19": "setIcoPhase4(uint256,uint256)", +"fec1aa12": "codetokenIndexToApproved(uint256)", +"fec1c41f": "AddNewBooster(uint256,int256,uint256,uint256,uint256,uint256,uint256)", +"fec2e27b": "acceptManagement(string)", +"fec320f4": "ListPairsForReserve(address,address,address,bool)", +"fec35182": "Crowdsale(address,uint256,uint256,uint256,uint256,address,address)", +"fec3e941": "MintAndTransferIAC(address,uint256,bytes32)", +"fec3fbe2": "functionTwo(uint256,uint256,uint256,uint256)", +"fec5438c": "costToCallOraclizeInWei()", +"fec568d4": "TransactionCompleted(uint128,uint256,uint256,string)", +"fec5c5f7": "FINX2Token()", +"fec5d3b0": "BTCRate()", +"fec5f0d2": "applyForGladiatorBattle(uint256,uint256,uint8[2])", +"fec69a87": "OneStandardToken(uint256,string,uint8,string)", +"fec6c66e": "applyFromCertificate(string,string,string,uint256)", +"fec74d31": "eolBlockNumber()", +"fec7c0a2": "FRPRUPEES()", +"fec7fc8e": "isSigned(bytes16,address)", +"fec84aac": "LogUserAddedToWhiteList(address)", +"fec850c3": "tokenSetBurnFeeReceiver(address,address,address,address)", +"fec86fb5": "userdynamicprofis()", +"fec8db83": "C3_TokenCreate(uint256,string,string)", +"fec966df": "countSmartSharingContract()", +"fec97c03": "finishFundraiser(uint256)", +"fec9cd77": "allowanceToBurn(address,address)", +"fec9dc1f": "updateNewToken(address,address)", +"fecab4bf": "vreoSaleOngoing()", +"fecadafd": "pushAtom(uint64,uint8,uint8,uint8,uint32,uint64,uint64,uint128,uint128,uint32)", +"fecc36c0": "fun(int256)", +"fecca5a5": "checkMyDonation()", +"fecd3486": "getTulip(uint256)", +"fecd817c": "cancelBuy()", +"fece5543": "mock_remove(address,address)", +"fecf9959": "withdrawTokens(uint256,address,uint256)", +"fed03118": "getTDETokenExchangeRate(uint256)", +"fed0827e": "RoseCoin()", +"fed09b2f": "isFemaleSale()", +"fed0b877": "distributeAirdropMulti(address[],uint256[])", +"fed0d2a1": "sellMultiplier()", +"fed1c977": "blockTransfering()", +"fed1cec2": "addWinners(uint256)", +"fed2063c": "mintDataStream(address,uint256,bytes32,bytes32,uint256)", +"fed23223": "sellFirst(uint256)", +"fed26772": "zeroFeeTransferByowner(address,address,uint256)", +"fed39929": "productOwner(string)", +"fed3a300": "right89(uint256)", +"fed3b141": "Coinbase(uint256)", +"fed3f18d": "admin_inactive_withdraw(address)", +"fed4614b": "funeral(bytes,int256)", +"fed4de76": "addAuthorizeRole(string,string,string)", +"fed503cd": "transferCoinInStages(address,address,uint256,uint256)", +"fed73b54": "getPlayerIdOfIndex(uint256,uint256)", +"fed7bb07": "getSeedAmountForGameId(uint256)", +"fed82ef3": "setSanityBounds(uint256)", +"fed8a53b": "callbackInsertApproveAndDistribute(uint256,address[],uint256[])", +"fed8b30a": "canSettleOrder(uint256,uint256)", +"fed8f40f": "invalidateMail(uint256)", +"fed9981e": "setDemocAdminEmergency(bytes32,address)", +"fed9d44f": "ARBITRARY_VALUATION_IN_ETH()", +"feda1045": "slaveWallet()", +"feda38bc": "setCrowdsaleOpen(bool)", +"fedabacf": "claimPrepaid(uint256,uint256,uint256,string,uint256)", +"fedb6dfd": "TACTICALCRUISER_FTL_SPEED()", +"fedbceba": "getRankLandLimit(uint256)", +"fedc2a28": "_rewardWinners(string,uint8,address[])", +"fedce093": "TheNextBlock()", +"fedda73b": "HC8ICO()", +"fedda89c": "claimVesting()", +"feddb41c": "peculOld()", +"feddd053": "updateStakers()", +"fede04c3": "reject(uint32,int256)", +"fede5cc6": "issueInternal(address,uint256,bool)", +"fedeac70": "handleQuickCloseChannel(address,bytes32,address,uint256,address,uint256,uint256)", +"fedf1ed8": "getCompte_21()", +"fedfd535": "Config()", +"fedfe46c": "vote(address,uint256,uint256,uint256)", +"fedffec0": "currentReferralPercent()", +"fee01177": "getTopics()", +"fee0596f": "createContractCompany(string)", +"fee13823": "ChargeTreasure()", +"fee1396b": "registerNewRecord(bytes32)", +"fee160be": "CarFare(uint16,uint16)", +"fee16841": "showDeposit(address)", +"fee21471": "getDayIndex_(uint256)", +"fee24454": "sendNowLastCount()", +"fee2cb05": "R2()", +"fee3154c": "setTransferWhitelist(address,address,bool)", +"fee35ff8": "newInvest(uint256,address,uint256)", +"fee4f41e": "signUp(string,address)", +"fee4f84d": "CryptopusToken()", +"fee692a3": "getAutomatedReportDisputeDueTimestamp()", +"fee6d28c": "addSnapshot(string)", +"fee7e35d": "tokenURISafe(uint256)", +"fee8775b": "Ping(address)", +"fee87e3b": "addresstoBytes(address)", +"fee99898": "getFee(address,address)", +"fee99e93": "HPAToken(uint256,string,uint8,string)", +"fee9aa44": "calculateRewardForAddress(address,address)", +"fee9ca13": "continueSale()", +"feea01b9": "create(bytes16,uint64,bytes)", +"feea799b": "rejectTransaction(uint256,bytes)", +"feec6fc1": "Tegchain(uint256,string,string)", +"feec756c": "updateRecipient(address)", +"feec7680": "changeFeesAddress(address)", +"feed5561": "getContributorsCount()", +"feed58ff": "setBackgroundColors(bytes3[])", +"feeda367": "addMarketTo()", +"feee8139": "setColors(uint32[],uint8[])", +"feefee1b": "firstExchangeRatePeriod()", +"fef038e8": "piggyBank(address)", +"fef10b95": "poolReward()", +"fef1dc7d": "seekerValue()", +"fef28cac": "Yudhacoin()", +"fef2cc97": "getPreAuthorizedAmount(address,address)", +"fef429e9": "linkClaimedTo(address)", +"fef47e38": "CREATE_NAME_ROLE()", +"fef4b969": "refundFromSeveral(uint256,address[])", +"fef5ae43": "enterCurrentRound()", +"fef5b185": "updateUserEducation(string,uint256,string,uint16)", +"fef5f1e7": "validateRequestParams(address[4],address,uint256[12],uint256,bytes,uint256)", +"fef636a8": "stage2Start()", +"fef64e37": "packedToStartTime(uint256)", +"fef7d5a8": "findEmptyBenefactorIndex()", +"fef8383e": "gameOpponent()", +"fef88502": "hommie()", +"fef9b5ae": "changeminpublicsale(uint256)", +"fef9cfe1": "setAvailableAfterStart(uint256)", +"fefa69a0": "batchCancelOrders()", +"fefa7d1c": "isLockup(address)", +"fefa7e41": "countDrugs()", +"fefa9bb1": "addReferrer(address)", +"fefaa293": "reservedTokensTeam()", +"fefaa626": "gameFinishedTime()", +"fefacee1": "MediatorFees()", +"fefb130e": "srb(uint256)", +"fefb8dc3": "publishPost(string,string)", +"fefb94a5": "PFAToken()", +"fefba6dd": "transferAnyERC223Token(address,uint256)", +"fefc38fd": "startActivated()", +"fefc7089": "AVAILABLE_RESERVE_SUPPLY()", +"fefc8b41": "test_insert_findWithHintNotTightBound()", +"fefd336c": "getSettingValues()", +"fefd41b9": "balanceOfRick(address)", +"fefd51b2": "getBrick(uint256)", +"fefd6e9a": "allocateEqual(address[],uint256)", +"feff0506": "addListing(string,string,uint256,address)", +"feffd402": "fetchVoteMainInfo()", +"ff00c592": "setNumRewardsAvailableForAddress(uint256,address)", +"ff01f11a": "finalUnpaused()", +"ff01ff08": "setGameVars(uint256,uint256,uint256,uint256,uint256)", +"ff01ffa8": "refundCrowdsaleContributor()", +"ff02326f": "MoonDustDividends()", +"ff025819": "numberOfActiveProposals(bytes32)", +"ff026158": "setSale(uint256,address)", +"ff044add": "oldCratesSold()", +"ff056949": "decreaseBalance(address,uint256)", +"ff05a9f0": "giftPlot(uint256,uint256,address)", +"ff05edd8": "inflateSupply(uint256)", +"ff069b4c": "getPetbyTileId(uint16,uint8)", +"ff06bb57": "setEthInCents(uint256)", +"ff07061b": "LUC()", +"ff08d2b0": "PayMiners()", +"ff09068f": "SMRTCoin()", +"ff0935b1": "checkFeeSchedule(address)", +"ff0938a7": "isPause()", +"ff097659": "getServerInfo(uint256)", +"ff09ff99": "purchaseCity(uint256)", +"ff0a22db": "_shareProfit(uint256,uint256,address)", +"ff0b3fc5": "intervalLength()", +"ff0b9c90": "createCheckpoint()", +"ff0bfc91": "mayGenerateAddr()", +"ff0c5a4b": "ContributionReceived(bytes32,address,address,uint256,uint256)", +"ff0cd868": "ShareEstateToken()", +"ff0ec23e": "setEditionName(uint8,string)", +"ff0efd6c": "submitDistance(uint256[])", +"ff0f27de": "setIDChain(address,address)", +"ff0f2e80": "getNumOrdersByPayee()", +"ff0f2f71": "setTTCAddress(address)", +"ff102896": "tokenRedemption(address,string)", +"ff10dc66": "quickTrade(address,address,uint256)", +"ff11e1db": "collectEther()", +"ff12128a": "step(int256,bool)", +"ff125c8a": "transferAllowed(address,address,uint256)", +"ff13c6c6": "RefundLoaded(uint256)", +"ff1401cc": "OdinCoin(address)", +"ff163aca": "AcquinomToken(address)", +"ff176844": "ThanosXToken()", +"ff1780ec": "rescueToken(address[],uint256[])", +"ff178834": "testApproveWillModifyAllowance()", +"ff17bc98": "burnOwnerTokens()", +"ff184b5d": "EthPerToken()", +"ff18539b": "setDepositCreator(address)", +"ff186b2e": "ethPrice()", +"ff190061": "balanceOfActiveToken(address)", +"ff192bc8": "isFreeze(address)", +"ff197bc3": "presaleTokenSold()", +"ff1ad781": "deadbids(address)", +"ff1ad7fa": "claimRewardBy(address,uint256,string)", +"ff1b01a6": "bet1000(uint256)", +"ff1b4341": "easyPropose(address,uint256,uint256)", +"ff1b636d": "Admin()", +"ff1c52d8": "Queue(bytes32,bytes32,bool,bytes32,address)", +"ff1c559e": "ChampionGameFinished(uint256,address,uint256,uint256)", +"ff1ca005": "supportComponent(uint16,uint256)", +"ff1d20b5": "getSecondStageWallet()", +"ff1d2712": "versionIndex()", +"ff1d83ae": "getTokenGranteesLength()", +"ff1d91b4": "ccStartTime()", +"ff1d9dd4": "updatePoolContract(address)", +"ff1e28a4": "createStamp(address,uint256)", +"ff1f7046": "requiresAuction(string)", +"ff1fd974": "getPayAmount(address,address,uint256)", +"ff2073d7": "fundRaiser()", +"ff208fa5": "test_insert_findWithHintNextAtPosition(int256)", +"ff213498": "FlowingHair()", +"ff21984a": "testMintAuth(int256)", +"ff21f27f": "issueToken(uint256,uint256,uint256,uint256)", +"ff22028b": "requireOwnerUnlockedAmount(uint256)", +"ff2258cb": "diffYears(uint256,uint256)", +"ff2263b7": "firstRoundStartTimestamp()", +"ff2311a4": "GetPatient()", +"ff238839": "showDelegateMsgSender(address)", +"ff23c7f2": "createArtefact(uint256,string,uint256,uint256,uint256)", +"ff23e1eb": "ShalloToken()", +"ff249bb0": "getTokenPacksAvailable()", +"ff25af24": "migrateAccount(bytes32,bytes32,uint256,uint256,address)", +"ff25e16d": "getLogErrorArguments()", +"ff25f859": "KIN_FOUNDATION_ADDRESS()", +"ff262ea5": "construct(uint256)", +"ff266d26": "reopen(address)", +"ff272ad4": "__toDecimals(uint256)", +"ff27848a": "GoldToken(address)", +"ff27c476": "shiftBitsRight(bytes,uint256)", +"ff27cbda": "getPI_edit_4()", +"ff28bcc2": "increaseReward()", +"ff28cdaf": "WCT(address)", +"ff28d625": "releaseEarning(bytes32,bytes32,bytes32,bool,address,address)", +"ff29507d": "fundingStopBlock()", +"ff299a63": "BTCUToken(uint256,string,uint8,string)", +"ff29bc95": "assignBalance(address,uint256,uint256)", +"ff29c104": "getTotalLeaderboards()", +"ff2a3776": "claimAllUnsold()", +"ff2b0571": "doFreeExtension(bytes32)", +"ff2b247f": "addNewTicket(uint256,bytes32,uint256,uint256,uint256)", +"ff2b350d": "acceptGiftTokens(address)", +"ff2d4b71": "addDoctor(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint32,uint32)", +"ff2eff94": "Cow()", +"ff2f7a35": "getDeed(bytes32)", +"ff30feef": "walletTranslate()", +"ff31e930": "prizePoolAddress()", +"ff31f9e6": "getSecurityDepositRegistry()", +"ff332ab7": "getTokenDetails()", +"ff34ef7d": "PrimaToken()", +"ff359cb8": "RATE_SALESTAGE2()", +"ff36cf59": "contributeETH(address)", +"ff377705": "getNumEntries(address,address,uint256)", +"ff37839b": "getTxt(uint256)", +"ff37d31d": "escrowDeed(uint64)", +"ff394153": "transferEthersToDividendManager(uint256)", +"ff39ae55": "EthereumExtreme()", +"ff3a5eea": "isIco()", +"ff3a91d9": "getOwnerPicture(bytes32)", +"ff3adc83": "GazeCoinCrowdsale()", +"ff3af97f": "setBonusToken(address,uint256,uint256,uint256,address,uint256,uint256,uint256)", +"ff3bf1f4": "sitePercent_()", +"ff3c1a8f": "getTitle()", +"ff3c9472": "adduser(string,string,address)", +"ff3d1be0": "stopPreIco_step1()", +"ff3d398c": "buyTokensByAtes(address,uint256,string)", +"ff3e51c8": "ZULICC()", +"ff3e8ba1": "_transferDirect(uint256,uint256,uint256,bytes32)", +"ff3ef460": "_userOwnsToken(address,uint256)", +"ff3f427c": "createMobsterWithOwner(string,address,uint256,uint256,uint256,string)", +"ff3fb765": "testUpdateCase()", +"ff4039ea": "getDelegate(uint32)", +"ff40807b": "getAccumulator()", +"ff40fcf6": "buyBBC(address)", +"ff414b64": "getBalanceERC20(address)", +"ff41f5cc": "HUT34_RETAIN()", +"ff423357": "withdrawAmount(uint256,address)", +"ff429fc8": "getCooldown(uint16)", +"ff42fd41": "getTotalLockedAmounts(address)", +"ff4329ee": "receiveCashback(address)", +"ff4408ee": "stopCrowding()", +"ff46f210": "isUnfrozenAccount(address)", +"ff470507": "VaultbankVotingToken()", +"ff48fd9c": "mintGreen(address,uint256)", +"ff49b26e": "createEvent(uint256,uint256,uint8,uint32,address,uint256,uint8)", +"ff49b8ef": "KyberWhiteList(address)", +"ff4a6638": "followTrader(bytes,address,bytes32,uint256,address,uint256)", +"ff4a7a7c": "Blin()", +"ff4ab29c": "setMarketFees(uint256)", +"ff4b6fea": "_shiftLeft(bytes32,uint256)", +"ff4b9b95": "clearCandidateCache()", +"ff4bd173": "dealBuyContract(uint256,uint256,string,uint256,uint256,string)", +"ff4bf170": "TechieCoin()", +"ff4c9fa5": "getCurrentPriceForToken(uint256)", +"ff4cfa5e": "onSignUp(string,uint256)", +"ff4d7404": "sell(uint8,string,uint256,uint256,uint32)", +"ff4dddc4": "tokensInWeiSold()", +"ff4ea29e": "migrateTokens(address[])", +"ff4f03a9": "developeo()", +"ff507efa": "Consulteth(uint256,uint256)", +"ff508d76": "renderWeb()", +"ff50abdc": "totalDeposited()", +"ff50fcb6": "usedIcoSupply()", +"ff510ad8": "isOnTrade(uint256)", +"ff51d18c": "getFlightConnections(uint16)", +"ff523cb2": "oraclizeQueryGas(uint256)", +"ff53c5a3": "refundInvestor(address)", +"ff552482": "GennovaToken()", +"ff556ecb": "releaseUnicorn(uint256)", +"ff55da1c": "assertOnlySpecifiedCaller(address,bytes32)", +"ff55e2ee": "setCasinoAddress(address)", +"ff5639c4": "optInFromClassic()", +"ff56b59a": "start6Phase2025()", +"ff56b65a": "getTxPaymentKWh(bytes32)", +"ff5732a5": "calculateTokenGet(uint256,uint256,uint256,bool,bytes32)", +"ff574213": "YeekFormula()", +"ff584597": "setGameResult(bytes32,int256,int256)", +"ff585caf": "callback(uint256)", +"ff592125": "issuedNum()", +"ff596069": "computeAddressBonus(uint16)", +"ff597790": "getSold(uint256)", +"ff598a06": "betTotalGasprice_()", +"ff59f3cc": "theCyberGatekeeper()", +"ff5a478b": "finalizeTge()", +"ff5a47bd": "generateSeedB()", +"ff5b98b8": "setAvgReportingGasPrice(uint256)", +"ff5bc8a7": "getSaleContractTokensLimit(address)", +"ff5ce378": "_addTokenTo(address,uint256)", +"ff5d2c39": "to62Encoding(uint256,uint256)", +"ff5de44b": "getStockBalance(address,address,uint256)", +"ff5e51b3": "VTOSToken(uint256,string,string)", +"ff5e7d4d": "lockedFundsSeconds()", +"ff5f1346": "forSell()", +"ff5f8b4b": "takeOwnership(uint256,address)", +"ff5fcf01": "initializeNewSale(uint256,uint256,address,address)", +"ff5feb3e": "getVoterVotesCount(address)", +"ff5ff81f": "LastWillContractOraclize(address,address[],uint8[],uint256)", +"ff600081": "getValuePerMicroKey()", +"ff60af84": "setNewMinDeposite(uint256)", +"ff60cdf6": "get1TokenSellPrice()", +"ff615b87": "SECOND_PHASE_PRICE_FACTOR()", +"ff61ad09": "getRoomBalance(uint256)", +"ff62d2cf": "rewardAdjustmentPeriod()", +"ff630748": "setStepLimits(uint256,uint256)", +"ff6307f8": "angelFoundationShareDenominator()", +"ff6387ad": "setconfigurationTokenPrice(uint256)", +"ff6395a4": "assigned_bids()", +"ff63ac3b": "_getTime()", +"ff6417c1": "paidAddress(uint256)", +"ff6477be": "getScam(uint256)", +"ff64d469": "weR()", +"ff65226c": "canBuy()", +"ff655320": "withdrawFirst()", +"ff65e44a": "purchaseBronze()", +"ff668cbe": "donacionTeleton()", +"ff66a305": "setBountyManager(address)", +"ff67577a": "Appoint_Mediator(uint256)", +"ff67c9f5": "getRequirementTime(address)", +"ff6867c0": "startAndSetStopTime(uint256)", +"ff69ac36": "currentTokenAmount()", +"ff69e2bc": "CurrentPrice()", +"ff69f35e": "CryptoEmojis()", +"ff6a6df7": "MultiValidator()", +"ff6c33e6": "TOKEN_OWNER()", +"ff6c8b87": "MPGame(uint8)", +"ff6d24b1": "SedPOWToken()", +"ff6d6f63": "BCTToken(uint256,string,string)", +"ff6f0d54": "TipSmart()", +"ff6f2914": "foundersRewardsAccount()", +"ff7070eb": "_processIncomingEther(address,uint256)", +"ff70bd9c": "PirateNinjaCoin(string,uint8,string,uint256,uint256)", +"ff70c4d1": "getBuyerAddress(uint16,uint16)", +"ff70e8d9": "STAKE_MULTIPLIER()", +"ff70fa49": "setDeveloper(address)", +"ff71c6b0": "WALLET_T8EX_COMMUNITY()", +"ff722b08": "getSkillTypeCnt()", +"ff72c845": "bat()", +"ff739e40": "minEnterFee()", +"ff73d2d8": "getIsRevenuePaid(address,uint256)", +"ff74927b": "strConcat(string,string)", +"ff74c0b8": "subTotalInvoiced(address,uint256,uint256)", +"ff74e915": "NewContent(string)", +"ff75567b": "participant2SentEtherCount()", +"ff757d59": "kittenContract()", +"ff776f55": "regist(address)", +"ff77898a": "numberOfContractors()", +"ff7835bf": "SmartCoinCash()", +"ff78461c": "initSilver()", +"ff786f2d": "LogTradeError(address,address,uint256,uint256,uint16)", +"ff7885e8": "withdraw(address,address,address)", +"ff78d5ed": "mdtComparable()", +"ff78e48b": "setIsParentOf(bool)", +"ff79d600": "BATAGOR()", +"ff7b5730": "getSCF()", +"ff7c9329": "setMintingCompleted()", +"ff7c977f": "admin_dividend(int256,int256)", +"ff7e17b6": "endTimeTLP1()", +"ff7e5abd": "vestingIsCompleted(address,uint256)", +"ff7f5f2a": "EtherizationUtils2()", +"ff8028b3": "megaCandyToken()", +"ff80b69a": "minPresaleAmount()", +"ff81c554": "coinMinted()", +"ff81fb91": "unhint(int256,bytes32)", +"ff82b174": "getUserBigPromoBonus(address,address)", +"ff83ce17": "ManagerSet(address,bool)", +"ff83f562": "acceptOwnership(string)", +"ff840553": "roundid()", +"ff8489df": "tokensForFinalize()", +"ff848eaf": "newDeal(uint256,uint256,uint256,uint256)", +"ff84990c": "MRDSCoinToken()", +"ff84d49f": "setMiniPoolEdit_3(string)", +"ff84ed36": "Identity(address,address)", +"ff855ac3": "withdrawTokens1(uint256)", +"ff85bd39": "Free()", +"ff85fba2": "forceStart()", +"ff862839": "modifyairdrop(uint256)", +"ff8872c2": "accountEthAmount(address)", +"ff895a62": "deActivate()", +"ff897dbd": "updateMinAmount(uint256)", +"ff89a720": "ECCToken(uint256,string,string)", +"ff8bfffc": "sendEthTweet(uint256,bool,string,bool,string,string,string)", +"ff8cffc1": "returnBorrowerPaidLate(uint256)", +"ff8ed0f7": "Map(address,uint256)", +"ff8ee507": "EthernalLoveParent()", +"ff8f7551": "FINCO()", +"ff8f9b9f": "LOL10()", +"ff8f9de7": "BuyRTCtokens()", +"ff8fa0dd": "transferFromWithData(address,address,uint256,bytes32)", +"ff8fec7f": "setHashByProvider(bytes32,bytes32)", +"ff9151dd": "retrait_4()", +"ff91b949": "nonPublicSupply()", +"ff91bb45": "castVote(address,uint256)", +"ff92eb2c": "selleth(uint256)", +"ff938f4a": "addClientAuthority(address)", +"ff93a512": "createEvent(uint256,uint256,uint256,uint256,uint256,uint256,address[])", +"ff947525": "isShutDown()", +"ff94e502": "getIdByIndex(uint256)", +"ff950e90": "batchSpawnAsset(address[],uint256[],uint256[],uint256)", +"ff95a8d2": "grantFounderTeamToken()", +"ff96b467": "setLockup_contributors(address,uint256,uint256)", +"ff97278f": "_timeLimit(uint256)", +"ff981099": "getVotes(uint256)", +"ff9852bf": "balanceOwed(address)", +"ff989a0d": "safeDecrement(uint256,uint256)", +"ff9913e8": "allow(address)", +"ff992ef5": "addInvestorList(address,uint256)", +"ff993272": "bonus10end()", +"ff993a18": "ChangeBuyRate(uint256)", +"ff9a6773": "DexToken(address,address,address,uint256,uint256,uint256)", +"ff9b3acf": "house()", +"ff9c1c5c": "preICODataInitialized()", +"ff9c8437": "releaseStake(uint256,address,address,uint256)", +"ff9e1b38": "addUndergraduate(uint32,string,string,string,uint8,uint8,uint8,uint8,uint8,uint16,uint32,uint32)", +"ff9e3948": "phase_3_remaining_tokens()", +"ff9e7fe1": "MaxPowerCoin()", +"ff9f0e5c": "updateToken()", +"ff9f3055": "generateDna(uint256[])", +"ff9f633f": "lockedAddresses(address,uint256)", +"ffa05698": "get_back()", +"ffa08cb7": "checkPendingWithdrawal()", +"ffa094fb": "highestBidIsCC()", +"ffa1a2f1": "deleteMark()", +"ffa1ad74": "VERSION()", +"ffa230b0": "totalCharitySent()", +"ffa2548a": "LifeSet_008()", +"ffa2f5c2": "coindropsStatus()", +"ffa309e4": "currentFiscalYear()", +"ffa32d1c": "DST_ADVISERS()", +"ffa34f7c": "isFreezing(address)", +"ffa39d27": "ElectricCoin()", +"ffa39d3f": "_isAuthorized(address,bytes4)", +"ffa40a4c": "pregnantPandas()", +"ffa49c6a": "expiryEpoch()", +"ffa59501": "votesRemaining(uint64,uint64,uint8)", +"ffa61f69": "AllowSuccess(address,address)", +"ffa640d8": "tradeContract()", +"ffa651b6": "setEngineerInterface(address)", +"ffa67f6c": "crowdsaleUnpause()", +"ffa68839": "initDate()", +"ffa696d3": "exits(bytes32)", +"ffa6ae80": "isIdRegistered(bytes16)", +"ffa72707": "startBuying(uint256)", +"ffa82f78": "advisorsTokenAmount()", +"ffa89a00": "permissionToChange(address,address,uint256)", +"ffa8acde": "StrongHold()", +"ffa8c44a": "MINSALESCAP()", +"ffa90f7f": "redeemFrom(address,uint256,bytes,bytes)", +"ffa97aca": "getInvoice(address,bytes32)", +"ffaa3608": "voteFor()", +"ffaa67d4": "deployVesting(address,string,uint256,bool,bool,bool,address)", +"ffaa9c22": "setAllSupply(uint256)", +"ffaad6a5": "depositTo(address,uint256)", +"ffab0959": "backersRedeemed()", +"ffab3269": "EthRefunded(address,uint256)", +"ffab7dcd": "setPlayerGeneralDt(uint64,uint32)", +"ffab984d": "preIcoBuyPrice()", +"ffacade4": "setFilter(uint256,address)", +"fface4a3": "rowQuiter()", +"ffacf300": "doCrowdsaleMinting(address,uint256,int256)", +"ffad4fc1": "batchLock(address[],uint256)", +"ffad75eb": "finishICO(bool)", +"ffae15ba": "e()", +"ffae2c5b": "getAuthority(uint256)", +"ffae399e": "shouldRevert(bool)", +"ffaef25e": "addDataResponse(address,address,string)", +"ffaf78c2": "_createPiranha(string,address,uint256,uint8,uint256,uint8)", +"ffaf862f": "getProductWeiRaised(address)", +"ffb00df1": "TOKENS_LOCKED_2Y_TOTAL()", +"ffb05c6f": "minRequiredBlockQueueTime()", +"ffb0885d": "forceTransfer(address,uint256)", +"ffb171fb": "verifyBalanceProof(address,uint256,bytes)", +"ffb1a06d": "priceIsStale()", +"ffb1a6cb": "getWins(address)", +"ffb24446": "setMaxTicket(uint256)", +"ffb2c479": "process(uint256)", +"ffb2d35d": "allowRefund()", +"ffb308ef": "writeDocument(uint128,uint16,uint256,bytes32[],string,string,string)", +"ffb31c62": "BetterAuction()", +"ffb3401d": "SimpleAuction(uint256,address)", +"ffb38e84": "_setMinter(address,bool)", +"ffb391fe": "HM(uint256)", +"ffb40152": "contract_verified()", +"ffb4c857": "_confirmAndCheck(bytes32)", +"ffb4e44d": "get_participant(address,address)", +"ffb54a99": "tradingOpen()", +"ffb58247": "Ektcoin(uint256,uint256)", +"ffb5fc2a": "changeDeDeNetwork(address)", +"ffb747f0": "updateBatches(address,address,uint256)", +"ffb7bfba": "watchProposal(uint256)", +"ffb87173": "pixelPrice()", +"ffb92678": "commFoundAddr()", +"ffba376c": "unfreezeTokens()", +"ffbac044": "KickCommitteeFromMapAndArrayEvent(address)", +"ffbafdfe": "updateState(uint256,uint8)", +"ffbb62a3": "withdrawCoins()", +"ffbc9bd0": "canSubmit()", +"ffbd26ce": "addReinforcedWhitelist(address[])", +"ffbd400b": "boolToUInt(bool)", +"ffbd4dd5": "checkCertificate(string)", +"ffbd6f72": "splice(uint8[],uint256,uint256)", +"ffbd73d0": "OSUniEDUSupply()", +"ffbd8c37": "buyBNNTokens()", +"ffbfd19e": "accUserReward()", +"ffbfd38b": "FooStdToken()", +"ffc0060e": "QingFengCabve(uint256,string,uint8,string)", +"ffc0483d": "CoreAddress()", +"ffc0d035": "hgtDecimals()", +"ffc1b038": "blacklistInvestor(address)", +"ffc31215": "getStore(string)", +"ffc3a769": "transfer(address[],uint256[])", +"ffc3f1f2": "HyperToken()", +"ffc42904": "MarketContract()", +"ffc48c61": "buyerAddressTransfer(string,address,address)", +"ffc4bbb3": "FirstLevelCost()", +"ffc52a1f": "registerByList(address[],uint256[])", +"ffc54ea4": "setTokenActive(uint256,bool)", +"ffc6ff1e": "closeSubmission()", +"ffc797e4": "setLowerBondPrice(uint256,uint256)", +"ffc85dc5": "finalizeDeposits()", +"ffc8bcd7": "getRefToById(address,address,uint256)", +"ffc8c4cb": "totalConsume()", +"ffc9152e": "isRefunded(address)", +"ffc92376": "subEmployerTotalInvoiced(address,address,uint256)", +"ffc9896b": "getUserData(address)", +"ffca2968": "ExternalSaleSha3(uint8,bytes32,address,uint256,uint256)", +"ffcab3e9": "getValidDurationSignatures()", +"ffcad44e": "getGroupFileCount(string)", +"ffcb1edb": "getDividendTokenSupply()", +"ffcb39c2": "tier0(address)", +"ffcbb5df": "printStats()", +"ffcc7bbf": "getUserAtIndex(uint256)", +"ffcc8484": "nextroundERCtradeactive()", +"ffcce369": "changeIPFSHash(string)", +"ffcd64e5": "_issueByTranche(bytes32,address,address,uint256,bytes,bytes)", +"ffcdcb51": "AhooleeTokenPreSale(uint256,uint256,address,address,uint256,uint256,uint256,uint256,uint256)", +"ffcecf09": "PRE_SALE_START_3()", +"ffcf1ade": "logPromiseCanceled(uint256)", +"ffcf21a9": "eventOracles(bytes,uint256)", +"ffd10e07": "enterPool(address)", +"ffd19e8c": "isAlreadyProcessed(uint256)", +"ffd40b56": "allocatorBalance(address)", +"ffd4185c": "QuantumXICO()", +"ffd45f16": "calculateTokenCount(uint256,uint256)", +"ffd479bb": "setBaseInfo(uint256,bool,bool)", +"ffd48b73": "buyInternal(address,uint256,uint256)", +"ffd48f40": "setDelegadoDeDistritoVerify(bytes32)", +"ffd4e0e2": "getTotalIcoTokens()", +"ffd4e799": "HTJToken()", +"ffd4f4b2": "withdrawTokensFromContract(uint256)", +"ffd571ca": "ethersContributed()", +"ffd68462": "readCheckList(address,uint256,uint256)", +"ffd6a052": "ChangeAdminWalletAddress(uint256,address)", +"ffd71e13": "loadCoreAddress(address)", +"ffd740df": "removeNode(uint256)", +"ffd7b5e6": "investWithCustomerId(address,string)", +"ffd85b68": "setControllerDelegate(address)", +"ffd864d3": "chief()", +"ffd9ca40": "register(bytes20,uint64,bytes)", +"ffda0a37": "settleInterest()", +"ffdaa1b8": "TokenWithdraw(address,uint256,address,uint256)", +"ffdab909": "removeEntry(uint256)", +"ffdb0eb3": "getXRateProviderLength()", +"ffdcf095": "transferWithNarrative(address,uint256,string)", +"ffdd108b": "addEvent(uint256,string)", +"ffdd5cf1": "getInfo(address)", +"ffde0c74": "getGameState(uint256)", +"ffde8eae": "dismissBunner(address)", +"ffe0a9f2": "contractSymbolUpdate(string,bool)", +"ffe0fa66": "CarRegistry()", +"ffe189ef": "prev(uint80)", +"ffe280ee": "setWeight(uint256,uint256,bytes)", +"ffe2d77e": "directorLock()", +"ffe302d1": "setPlz(string)", +"ffe34512": "getNumChannels(address)", +"ffe3acc7": "changeGeneralSaleStartDate(uint256)", +"ffe3c6fd": "zKill()", +"ffe45b14": "getHTLCInvalidationTimeoutExtension(uint256,int256,bytes32,bytes32)", +"ffe48c76": "getBCDTRateForCurrentRound()", +"ffe4914a": "hdivide(uint256,uint256)", +"ffe496f2": "setMarginSpend(uint256)", +"ffe4fe4c": "roundFor(uint256)", +"ffe55303": "unfreezeCreditScore(uint256,string)", +"ffe5725f": "create(address,address,uint256)", +"ffe575b1": "Daxther()", +"ffe57c16": "byuoutActive()", +"ffe619df": "buyPixelToken(uint24,uint256,uint24)", +"ffe648d4": "releaseAllOnceLock(address)", +"ffe6bbd8": "myEarnings()", +"ffe8ee35": "SetDivTime(uint256)", +"ffe90ba6": "offsetIndex()", +"ffe94af0": "burnPass(bytes32,address)", +"ffe99ca7": "getCitiesStrings(uint256[])", +"ffea632b": "initialize(address,address,uint8,address)", +"ffeb7d75": "setUpgradeMaster(address)", +"ffec34e3": "TokenMintPoD(int256)", +"ffecf516": "addBot(address)", +"ffed6ed7": "buyAd(uint8,uint8)", +"ffeddd49": "addPolicy(bytes32,uint32,uint32,uint256,string)", +"ffee7c97": "getBookLength()", +"ffeea273": "withdrawWallet2()", +"ffeeac82": "info_Name()", +"ffeecfaa": "Log1(address,bytes32,uint256,string,string,uint256,bytes1)", +"ffef2b00": "SortCompetitionScores(uint32)", +"ffef8f88": "Share(uint256)", +"ffef9b3c": "_checkMaxRoundSupply(uint256)", +"fff04a87": "test_invalidBalanceNotZero()", +"fff07241": "playerExist(address)", +"fff10aba": "getEventsHistory()", +"fff28137": "reclaimToken()", +"fff311b1": "ownerSetjackpotContract(address)", +"fff35670": "icoLaunchTimestamp()", +"fff3a01b": "transfer(address,string,uint256)", +"fff3ad33": "getAddTokenDataTracking()", +"fff3c457": "readMessages(uint256)", +"fff43b4e": "_setBurnPool(uint256)", +"fff57ba3": "withdrawSettle(bytes32,bytes32,bytes32)", +"fff57fe1": "claimableOCDividend(address,address)", +"fff6a540": "LongBCoin(uint256,string,uint8,string)", +"fff6fb54": "TTOH()", +"fff78f9c": "doThrow()", +"fff7a97e": "addWallet(address,address)", +"fff83edf": "founderAmounts(uint256)", +"fff85d49": "addChunk1ToWhiteList()", +"fff8d42b": "phase2StartingAt()", +"fff93ec3": "setLandingPage(string)", +"fff95ce3": "getIsPoop()", +"fff9627d": "PRESALE_VAULT_START()", +"fff9d5b9": "confirmProofOfWork(uint256)", +"fffa932b": "withdrowTo(address)", +"fffa9d0c": "setGood(bytes32,uint256,uint256)", +"fffb5183": "initialize(uint256,address,uint256)", +"fffcde7c": "EOSINT()", +"fffce84f": "bountyFreeze(address,bool)", +"fffd52c6": "reading()", +"fffda870": "lastHorseSex()", +"fffdbe2c": "frozenTokensSupply()", +"fffe088d": "saleAddress()", +"fffeb1ca": "externalCheckSignBool(bytes32,bytes,address)", +"ffff6b04": "vestingSchedule(address)", +"ffffce47": "exchangeRateOracle()" +} \ No newline at end of file diff --git a/signer/fourbyte/abi.go b/signer/fourbyte/abi.go new file mode 100644 index 000000000000..585eae1cd848 --- /dev/null +++ b/signer/fourbyte/abi.go @@ -0,0 +1,164 @@ +// Copyright 2019 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 fourbyte + +import ( + "bytes" + "encoding/json" + "fmt" + "regexp" + "strings" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" +) + +// decodedCallData is an internal type to represent a method call parsed according +// to an ABI method signature. +type decodedCallData struct { + signature string + name string + inputs []decodedArgument +} + +// decodedArgument is an internal type to represent an argument parsed according +// to an ABI method signature. +type decodedArgument struct { + soltype abi.Argument + value interface{} +} + +// String implements stringer interface, tries to use the underlying value-type +func (arg decodedArgument) String() string { + var value string + switch val := arg.value.(type) { + case fmt.Stringer: + value = val.String() + default: + value = fmt.Sprintf("%v", val) + } + return fmt.Sprintf("%v: %v", arg.soltype.Type.String(), value) +} + +// String implements stringer interface for decodedCallData +func (cd decodedCallData) String() string { + args := make([]string, len(cd.inputs)) + for i, arg := range cd.inputs { + args[i] = arg.String() + } + return fmt.Sprintf("%s(%s)", cd.name, strings.Join(args, ",")) +} + +// verifySelector checks whether the ABI encoded data blob matches the requested +// function signature. +func verifySelector(selector string, calldata []byte) (*decodedCallData, error) { + // Parse the selector into an ABI JSON spec + abidata, err := parseSelector(selector) + if err != nil { + return nil, err + } + // Parse the call data according to the requested selector + return parseCallData(calldata, string(abidata)) +} + +// selectorRegexp is used to validate that a 4byte database selector corresponds +// to a valid ABI function declaration. +// +// Note, although uppercase letters are not part of the ABI spec, this regexp +// still accepts it as the general format is valid. It will be rejected later +// by the type checker. +var selectorRegexp = regexp.MustCompile(`^([^\)]+)\(([A-Za-z0-9,\[\]]*)\)`) + +// parseSelector converts a method selector into an ABI JSON spec. The returned +// data is a valid JSON string which can be consumed by the standard abi package. +func parseSelector(selector string) ([]byte, error) { + // Define a tiny fake ABI struct for JSON marshalling + type fakeArg struct { + Type string `json:"type"` + } + type fakeABI struct { + Name string `json:"name"` + Type string `json:"type"` + Inputs []fakeArg `json:"inputs"` + } + // Validate the selector and extract it's components + groups := selectorRegexp.FindStringSubmatch(selector) + if len(groups) != 3 { + return nil, fmt.Errorf("invalid selector %s (%v matches)", selector, len(groups)) + } + name := groups[1] + args := groups[2] + + // Reassemble the fake ABI and constuct the JSON + arguments := make([]fakeArg, 0) + if len(args) > 0 { + for _, arg := range strings.Split(args, ",") { + arguments = append(arguments, fakeArg{arg}) + } + } + return json.Marshal([]fakeABI{{name, "function", arguments}}) +} + +// parseCallData matches the provided call data against the ABI definition and +// returns a struct containing the actual go-typed values. +func parseCallData(calldata []byte, abidata string) (*decodedCallData, error) { + // Validate the call data that it has the 4byte prefix and the rest divisible by 32 bytes + if len(calldata) < 4 { + return nil, fmt.Errorf("invalid call data, incomplete method signature (%d bytes < 4)", len(calldata)) + } + sigdata := calldata[:4] + + argdata := calldata[4:] + if len(argdata)%32 != 0 { + return nil, fmt.Errorf("invalid call data; length should be a multiple of 32 bytes (was %d)", len(argdata)) + } + // Validate the called method and upack the call data accordingly + abispec, err := abi.JSON(strings.NewReader(abidata)) + if err != nil { + return nil, fmt.Errorf("invalid method signature (%s): %v", abidata, err) + } + method, err := abispec.MethodById(sigdata) + if err != nil { + return nil, err + } + values, err := method.Inputs.UnpackValues(argdata) + if err != nil { + return nil, err + } + // Everything valid, assemble the call infos for the signer + decoded := decodedCallData{signature: method.Sig(), name: method.RawName} + for i := 0; i < len(method.Inputs); i++ { + decoded.inputs = append(decoded.inputs, decodedArgument{ + soltype: method.Inputs[i], + value: values[i], + }) + } + // We're finished decoding the data. At this point, we encode the decoded data + // to see if it matches with the original data. If we didn't do that, it would + // be possible to stuff extra data into the arguments, which is not detected + // by merely decoding the data. + encoded, err := method.Inputs.PackValues(values) + if err != nil { + return nil, err + } + if !bytes.Equal(encoded, argdata) { + was := common.Bytes2Hex(encoded) + exp := common.Bytes2Hex(argdata) + return nil, fmt.Errorf("WARNING: Supplied data is stuffed with extra data. \nWant %s\nHave %s\nfor method %v", exp, was, method.Sig()) + } + return &decoded, nil +} diff --git a/signer/fourbyte/abi_test.go b/signer/fourbyte/abi_test.go new file mode 100644 index 000000000000..314c12735b8c --- /dev/null +++ b/signer/fourbyte/abi_test.go @@ -0,0 +1,174 @@ +// Copyright 2019 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 fourbyte + +import ( + "math/big" + "reflect" + "strings" + "testing" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" +) + +func verify(t *testing.T, jsondata, calldata string, exp []interface{}) { + abispec, err := abi.JSON(strings.NewReader(jsondata)) + if err != nil { + t.Fatal(err) + } + cd := common.Hex2Bytes(calldata) + sigdata, argdata := cd[:4], cd[4:] + method, err := abispec.MethodById(sigdata) + if err != nil { + t.Fatal(err) + } + data, err := method.Inputs.UnpackValues(argdata) + if err != nil { + t.Fatal(err) + } + if len(data) != len(exp) { + t.Fatalf("Mismatched length, expected %d, got %d", len(exp), len(data)) + } + for i, elem := range data { + if !reflect.DeepEqual(elem, exp[i]) { + t.Fatalf("Unpack error, arg %d, got %v, want %v", i, elem, exp[i]) + } + } +} + +func TestNewUnpacker(t *testing.T) { + type unpackTest struct { + jsondata string + calldata string + exp []interface{} + } + testcases := []unpackTest{ + { // https://solidity.readthedocs.io/en/develop/abi-spec.html#use-of-dynamic-types + `[{"type":"function","name":"f", "inputs":[{"type":"uint256"},{"type":"uint32[]"},{"type":"bytes10"},{"type":"bytes"}]}]`, + // 0x123, [0x456, 0x789], "1234567890", "Hello, world!" + "8be65246" + "00000000000000000000000000000000000000000000000000000000000001230000000000000000000000000000000000000000000000000000000000000080313233343536373839300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004560000000000000000000000000000000000000000000000000000000000000789000000000000000000000000000000000000000000000000000000000000000d48656c6c6f2c20776f726c642100000000000000000000000000000000000000", + []interface{}{ + big.NewInt(0x123), + []uint32{0x456, 0x789}, + [10]byte{49, 50, 51, 52, 53, 54, 55, 56, 57, 48}, + common.Hex2Bytes("48656c6c6f2c20776f726c6421"), + }, + }, { // https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#examples + `[{"type":"function","name":"sam","inputs":[{"type":"bytes"},{"type":"bool"},{"type":"uint256[]"}]}]`, + // "dave", true and [1,2,3] + "a5643bf20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", + []interface{}{ + []byte{0x64, 0x61, 0x76, 0x65}, + true, + []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}, + }, + }, { + `[{"type":"function","name":"send","inputs":[{"type":"uint256"}]}]`, + "a52c101e0000000000000000000000000000000000000000000000000000000000000012", + []interface{}{big.NewInt(0x12)}, + }, { + `[{"type":"function","name":"compareAndApprove","inputs":[{"type":"address"},{"type":"uint256"},{"type":"uint256"}]}]`, + "751e107900000000000000000000000000000133700000deadbeef00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", + []interface{}{ + common.HexToAddress("0x00000133700000deadbeef000000000000000000"), + new(big.Int).SetBytes([]byte{0x00}), + big.NewInt(0x1), + }, + }, + } + for _, c := range testcases { + verify(t, c.jsondata, c.calldata, c.exp) + } +} + +func TestCalldataDecoding(t *testing.T) { + // send(uint256) : a52c101e + // compareAndApprove(address,uint256,uint256) : 751e1079 + // issue(address[],uint256) : 42958b54 + jsondata := ` +[ + {"type":"function","name":"send","inputs":[{"name":"a","type":"uint256"}]}, + {"type":"function","name":"compareAndApprove","inputs":[{"name":"a","type":"address"},{"name":"a","type":"uint256"},{"name":"a","type":"uint256"}]}, + {"type":"function","name":"issue","inputs":[{"name":"a","type":"address[]"},{"name":"a","type":"uint256"}]}, + {"type":"function","name":"sam","inputs":[{"name":"a","type":"bytes"},{"name":"a","type":"bool"},{"name":"a","type":"uint256[]"}]} +]` + // Expected failures + for i, hexdata := range []string{ + "a52c101e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000042", + "a52c101e000000000000000000000000000000000000000000000000000000000000001200", + "a52c101e00000000000000000000000000000000000000000000000000000000000000", + "a52c101e", + "a52c10", + "", + // Too short + "751e10790000000000000000000000000000000000000000000000000000000000000012", + "751e1079FFffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + // Not valid multiple of 32 + "deadbeef00000000000000000000000000000000000000000000000000000000000000", + // Too short 'issue' + "42958b5400000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000042", + // Too short compareAndApprove + "a52c101e00ff0000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000042", + // From https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI + // contains a bool with illegal values + "a5643bf20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", + } { + _, err := parseCallData(common.Hex2Bytes(hexdata), jsondata) + if err == nil { + t.Errorf("test %d: expected decoding to fail: %s", i, hexdata) + } + } + // Expected success + for i, hexdata := range []string{ + // From https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI + "a5643bf20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", + "a52c101e0000000000000000000000000000000000000000000000000000000000000012", + "a52c101eFFffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "751e1079000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "42958b54" + + // start of dynamic type + "0000000000000000000000000000000000000000000000000000000000000040" + + // uint256 + "0000000000000000000000000000000000000000000000000000000000000001" + + // length of array + "0000000000000000000000000000000000000000000000000000000000000002" + + // array values + "000000000000000000000000000000000000000000000000000000000000dead" + + "000000000000000000000000000000000000000000000000000000000000beef", + } { + _, err := parseCallData(common.Hex2Bytes(hexdata), jsondata) + if err != nil { + t.Errorf("test %d: unexpected failure on input %s:\n %v (%d bytes) ", i, hexdata, err, len(common.Hex2Bytes(hexdata))) + } + } +} + +func TestMaliciousABIStrings(t *testing.T) { + tests := []string{ + "func(uint256,uint256,[]uint256)", + "func(uint256,uint256,uint256,)", + "func(,uint256,uint256,uint256)", + } + data := common.Hex2Bytes("4401a6e40000000000000000000000000000000000000000000000000000000000000012") + for i, tt := range tests { + _, err := verifySelector(tt, data) + if err == nil { + t.Errorf("test %d: expected error for selector '%v'", i, tt) + } + } +} diff --git a/signer/fourbyte/fourbyte.go b/signer/fourbyte/fourbyte.go new file mode 100644 index 000000000000..01988dcab0fe --- /dev/null +++ b/signer/fourbyte/fourbyte.go @@ -0,0 +1,144 @@ +// Copyright 2019 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 . + +//go:generate go-bindata -nometadata -nocompress -o 4byte.go -pkg fourbyte 4byte.json +//go:generate gofmt -s -w 4byte.go +//go:generate sh -c "sed 's#var __4byteJson#//nolint:misspell\\\n&#' 4byte.go > 4byte.go.tmp && mv 4byte.go.tmp 4byte.go" + +// Package fourbyte contains the 4byte database. +package fourbyte + +import ( + "encoding/hex" + "encoding/json" + "fmt" + "io/ioutil" + "os" +) + +// Database is a 4byte database with the possibility of maintaining an immutable +// set (embedded) into the process and a mutable set (loaded and written to file). +type Database struct { + embedded map[string]string + custom map[string]string + customPath string +} + +// newEmpty exists for testing purposes. +func newEmpty() *Database { + return &Database{ + embedded: make(map[string]string), + custom: make(map[string]string), + } +} + +// New loads the standard signature database embedded in the package. +func New() (*Database, error) { + return NewWithFile("") +} + +// NewFromFile loads signature database from file, and errors if the file is not +// valid JSON. The constructor does no other validation of contents. This method +// does not load the embedded 4byte database. +// +// The provided path will be used to write new values into if they are submitted +// via the API. +func NewFromFile(path string) (*Database, error) { + raw, err := os.Open(path) + if err != nil { + return nil, err + } + defer raw.Close() + + db := newEmpty() + if err := json.NewDecoder(raw).Decode(&db.embedded); err != nil { + return nil, err + } + return db, nil +} + +// NewWithFile loads both the standard signature database (embedded resource +// file) as well as a custom database. The latter will be used to write new +// values into if they are submitted via the API. +func NewWithFile(path string) (*Database, error) { + db := &Database{make(map[string]string), make(map[string]string), path} + db.customPath = path + + blob, err := Asset("4byte.json") + if err != nil { + return nil, err + } + if err := json.Unmarshal(blob, &db.embedded); err != nil { + return nil, err + } + // Custom file may not exist. Will be created during save, if needed. + if _, err := os.Stat(path); err == nil { + if blob, err = ioutil.ReadFile(path); err != nil { + return nil, err + } + if err := json.Unmarshal(blob, &db.custom); err != nil { + return nil, err + } + } + return db, nil +} + +// Size returns the number of 4byte entries in the embedded and custom datasets. +func (db *Database) Size() (int, int) { + return len(db.embedded), len(db.custom) +} + +// Selector checks the given 4byte ID against the known ABI methods. +// +// This method does not validate the match, it's assumed the caller will do. +func (db *Database) Selector(id []byte) (string, error) { + if len(id) < 4 { + return "", fmt.Errorf("expected 4-byte id, got %d", len(id)) + } + sig := hex.EncodeToString(id[:4]) + if selector, exists := db.embedded[sig]; exists { + return selector, nil + } + if selector, exists := db.custom[sig]; exists { + return selector, nil + } + return "", fmt.Errorf("signature %v not found", sig) +} + +// AddSelector inserts a new 4byte entry into the database. If custom database +// saving is enabled, the new dataset is also persisted to disk. +// +// Node, this method does _not_ validate the correctness of the data. It assumes +// the caller has already done so. +func (db *Database) AddSelector(selector string, data []byte) error { + // If the selector is already known, skip duplicating it + if len(data) < 4 { + return nil + } + if _, err := db.Selector(data[:4]); err == nil { + return nil + } + // Inject the custom selector into the database and persist if needed + db.custom[hex.EncodeToString(data[:4])] = selector + if db.customPath == "" { + return nil + } + blob, err := json.Marshal(db.custom) + if err != nil { + return err + } + return ioutil.WriteFile(db.customPath, blob, 0600) +} diff --git a/signer/fourbyte/fourbyte_test.go b/signer/fourbyte/fourbyte_test.go new file mode 100644 index 000000000000..cdbd7ef73d5e --- /dev/null +++ b/signer/fourbyte/fourbyte_test.go @@ -0,0 +1,91 @@ +// Copyright 2019 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 fourbyte + +import ( + "fmt" + "io/ioutil" + "strings" + "testing" + + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/common" +) + +// Tests that all the selectors contained in the 4byte database are valid. +func TestEmbeddedDatabase(t *testing.T) { + db, err := New() + if err != nil { + t.Fatal(err) + } + for id, selector := range db.embedded { + abistring, err := parseSelector(selector) + if err != nil { + t.Errorf("Failed to convert selector to ABI: %v", err) + continue + } + abistruct, err := abi.JSON(strings.NewReader(string(abistring))) + if err != nil { + t.Errorf("Failed to parse ABI: %v", err) + continue + } + m, err := abistruct.MethodById(common.Hex2Bytes(id)) + if err != nil { + t.Errorf("Failed to get method by id (%s): %v", id, err) + continue + } + if m.Sig() != selector { + t.Errorf("Selector mismatch: have %v, want %v", m.Sig(), selector) + } + } +} + +// Tests that custom 4byte datasets can be handled too. +func TestCustomDatabase(t *testing.T) { + // Create a new custom 4byte database with no embedded component + tmpdir, err := ioutil.TempDir("", "signer-4byte-test") + if err != nil { + t.Fatal(err) + } + filename := fmt.Sprintf("%s/4byte_custom.json", tmpdir) + + db, err := NewWithFile(filename) + if err != nil { + t.Fatal(err) + } + db.embedded = make(map[string]string) + + // Ensure the database is empty, insert and verify + calldata := common.Hex2Bytes("a52c101edeadbeef") + if _, err = db.Selector(calldata); err == nil { + t.Fatalf("Should not find a match on empty database") + } + if err = db.AddSelector("send(uint256)", calldata); err != nil { + t.Fatalf("Failed to save file: %v", err) + } + if _, err = db.Selector(calldata); err != nil { + t.Fatalf("Failed to find a match for abi signature: %v", err) + } + // Check that the file as persisted to disk by creating a new instance + db2, err := NewFromFile(filename) + if err != nil { + t.Fatalf("Failed to create new abidb: %v", err) + } + if _, err = db2.Selector(calldata); err != nil { + t.Fatalf("Failed to find a match for persisted abi signature: %v", err) + } +} diff --git a/signer/fourbyte/validation.go b/signer/fourbyte/validation.go new file mode 100644 index 000000000000..4d042d240f67 --- /dev/null +++ b/signer/fourbyte/validation.go @@ -0,0 +1,117 @@ +// Copyright 2019 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 fourbyte + +import ( + "bytes" + "errors" + "fmt" + "math/big" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/signer/core" +) + +// ValidateTransaction does a number of checks on the supplied transaction, and +// returns either a list of warnings, or an error (indicating that the transaction +// should be immediately rejected). +func (db *Database) ValidateTransaction(selector *string, tx *core.SendTxArgs) (*core.ValidationMessages, error) { + messages := new(core.ValidationMessages) + + // Prevent accidental erroneous usage of both 'input' and 'data' (show stopper) + if tx.Data != nil && tx.Input != nil && !bytes.Equal(*tx.Data, *tx.Input) { + return nil, errors.New(`ambiguous request: both "data" and "input" are set and are not identical`) + } + // Place data on 'data', and nil 'input' + var data []byte + if tx.Input != nil { + tx.Data = tx.Input + tx.Input = nil + } + if tx.Data != nil { + data = *tx.Data + } + // Contract creation doesn't validate call data, handle first + if tx.To == nil { + // Contract creation should contain sufficient data to deploy a contract. A + // typical error is omitting sender due to some quirk in the javascript call + // e.g. https://github.com/ethereum/go-ethereum/issues/16106. + if len(data) == 0 { + // Prevent sending ether into black hole (show stopper) + if tx.Value.ToInt().Cmp(big.NewInt(0)) > 0 { + return nil, errors.New("transaction will create a contract with value but empty code") + } + // No value submitted at least, critically Warn, but don't blow up + messages.Crit("Transaction will create a contract with empty code") + } else if len(data) < 40 { // arbitrary heuristic limit + messages.Warn(fmt.Sprintf("Transaction will create a contract, but the payload is suspiciously small (%d bytes)", len(data))) + } + // Method selector should be nil for contract creation + if selector != nil { + messages.Warn("Transaction will create a contract, but method selector supplied, indicating an intent to call a method") + } + return messages, nil + } + // Not a contract creation, validate as a plain transaction + if !tx.To.ValidChecksum() { + messages.Warn("Invalid checksum on recipient address") + } + if bytes.Equal(tx.To.Address().Bytes(), common.Address{}.Bytes()) { + messages.Crit("Transaction recipient is the zero address") + } + // Semantic fields validated, try to make heads or tails of the call data + db.validateCallData(selector, data, messages) + return messages, nil +} + +// validateCallData checks if the ABI call-data + method selector (if given) can +// be parsed and seems to match. +func (db *Database) validateCallData(selector *string, data []byte, messages *core.ValidationMessages) { + // If the data is empty, we have a plain value transfer, nothing more to do + if len(data) == 0 { + return + } + // Validate the call data that it has the 4byte prefix and the rest divisible by 32 bytes + if len(data) < 4 { + messages.Warn("Transaction data is not valid ABI (missing the 4 byte call prefix)") + return + } + if n := len(data) - 4; n%32 != 0 { + messages.Warn(fmt.Sprintf("Transaction data is not valid ABI (length should be a multiple of 32 (was %d))", n)) + } + // If a custom method selector was provided, validate with that + if selector != nil { + if info, err := verifySelector(*selector, data); err != nil { + messages.Warn(fmt.Sprintf("Transaction contains data, but provided ABI signature could not be matched: %v", err)) + } else { + messages.Info(info.String()) + db.AddSelector(*selector, data[:4]) + } + return + } + // No method selector was provided, check the database for embedded ones + embedded, err := db.Selector(data[:4]) + if err != nil { + messages.Warn(fmt.Sprintf("Transaction contains data, but the ABI signature could not be found: %v", err)) + return + } + if info, err := verifySelector(embedded, data); err != nil { + messages.Warn(fmt.Sprintf("Transaction contains data, but provided ABI signature could not be varified: %v", err)) + } else { + messages.Info(info.String()) + } +} diff --git a/signer/fourbyte/validation_test.go b/signer/fourbyte/validation_test.go new file mode 100644 index 000000000000..0e98cd88e4b4 --- /dev/null +++ b/signer/fourbyte/validation_test.go @@ -0,0 +1,137 @@ +// Copyright 2019 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 fourbyte + +import ( + "math/big" + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/signer/core" +) + +func mixAddr(a string) (*common.MixedcaseAddress, error) { + return common.NewMixedcaseAddressFromString(a) +} +func toHexBig(h string) hexutil.Big { + b := big.NewInt(0).SetBytes(common.FromHex(h)) + return hexutil.Big(*b) +} +func toHexUint(h string) hexutil.Uint64 { + b := big.NewInt(0).SetBytes(common.FromHex(h)) + return hexutil.Uint64(b.Uint64()) +} +func dummyTxArgs(t txtestcase) *core.SendTxArgs { + to, _ := mixAddr(t.to) + from, _ := mixAddr(t.from) + n := toHexUint(t.n) + gas := toHexUint(t.g) + gasPrice := toHexBig(t.gp) + value := toHexBig(t.value) + var ( + data, input *hexutil.Bytes + ) + if t.d != "" { + a := hexutil.Bytes(common.FromHex(t.d)) + data = &a + } + if t.i != "" { + a := hexutil.Bytes(common.FromHex(t.i)) + input = &a + + } + return &core.SendTxArgs{ + From: *from, + To: to, + Value: value, + Nonce: n, + GasPrice: gasPrice, + Gas: gas, + Data: data, + Input: input, + } +} + +type txtestcase struct { + from, to, n, g, gp, value, d, i string + expectErr bool + numMessages int +} + +func TestTransactionValidation(t *testing.T) { + var ( + // use empty db, there are other tests for the abi-specific stuff + db = newEmpty() + ) + testcases := []txtestcase{ + // Invalid to checksum + {from: "000000000000000000000000000000000000dead", to: "000000000000000000000000000000000000dead", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 1}, + // valid 0x000000000000000000000000000000000000dEaD + {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 0}, + // conflicting input and data + {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x01", i: "0x02", expectErr: true}, + // Data can't be parsed + {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x0102", numMessages: 1}, + // Data (on Input) can't be parsed + {from: "000000000000000000000000000000000000dead", to: "0x000000000000000000000000000000000000dEaD", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", i: "0x0102", numMessages: 1}, + // Send to 0 + {from: "000000000000000000000000000000000000dead", to: "0x0000000000000000000000000000000000000000", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", numMessages: 1}, + // Create empty contract (no value) + {from: "000000000000000000000000000000000000dead", to: "", + n: "0x01", g: "0x20", gp: "0x40", value: "0x00", numMessages: 1}, + // Create empty contract (with value) + {from: "000000000000000000000000000000000000dead", to: "", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", expectErr: true}, + // Small payload for create + {from: "000000000000000000000000000000000000dead", to: "", + n: "0x01", g: "0x20", gp: "0x40", value: "0x01", d: "0x01", numMessages: 1}, + } + for i, test := range testcases { + msgs, err := db.ValidateTransaction(nil, dummyTxArgs(test)) + if err == nil && test.expectErr { + t.Errorf("Test %d, expected error", i) + for _, msg := range msgs.Messages { + t.Logf("* %s: %s", msg.Typ, msg.Message) + } + } + if err != nil && !test.expectErr { + t.Errorf("Test %d, unexpected error: %v", i, err) + } + if err == nil { + got := len(msgs.Messages) + if got != test.numMessages { + for _, msg := range msgs.Messages { + t.Logf("* %s: %s", msg.Typ, msg.Message) + } + t.Errorf("Test %d, expected %d messages, got %d", i, test.numMessages, got) + } else { + //Debug printout, remove later + for _, msg := range msgs.Messages { + t.Logf("* [%d] %s: %s", i, msg.Typ, msg.Message) + } + t.Log() + } + } + } +} diff --git a/signer/rules/deps/bindata.go b/signer/rules/deps/bindata.go index 0b27f451726d..401dfca5a993 100644 --- a/signer/rules/deps/bindata.go +++ b/signer/rules/deps/bindata.go @@ -1,8 +1,6 @@ -// Code generated by go-bindata. +// Package deps Code generated by go-bindata. (@generated) DO NOT EDIT. // sources: // bignumber.js -// DO NOT EDIT! - package deps import ( @@ -20,7 +18,7 @@ import ( 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) + return nil, fmt.Errorf("read %q: %v", name, err) } var buf bytes.Buffer @@ -28,7 +26,7 @@ func bindataRead(data []byte, name string) ([]byte, error) { clErr := gz.Close() if err != nil { - return nil, fmt.Errorf("Read %q: %v", name, err) + return nil, fmt.Errorf("read %q: %v", name, err) } if clErr != nil { return nil, err @@ -49,21 +47,32 @@ type bindataFileInfo struct { modTime time.Time } +// Name return file name func (fi bindataFileInfo) Name() string { return fi.name } + +// Size return file size func (fi bindataFileInfo) Size() int64 { return fi.size } + +// Mode return file mode func (fi bindataFileInfo) Mode() os.FileMode { return fi.mode } + +// ModTime return file modify time func (fi bindataFileInfo) ModTime() time.Time { return fi.modTime } + +// IsDir return file whether a directory func (fi bindataFileInfo) IsDir() bool { - return false + return fi.mode&os.ModeDir != 0 } + +// Sys return file is sys mode func (fi bindataFileInfo) Sys() interface{} { return nil } diff --git a/signer/rules/rules.go b/signer/rules/rules.go index 466b99dbe4dc..cb375a62ad11 100644 --- a/signer/rules/rules.go +++ b/signer/rules/rules.go @@ -1,18 +1,18 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// 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 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. // -// go-ethereum is distributed in the hope that it will be useful, +// 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 General Public License for more details. +// GNU Lesser 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 . +// You should have received a copy of the GNU Lesser General Public License +// along with the go-ethereum library. If not, see . package rules @@ -22,12 +22,11 @@ import ( "os" "strings" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/internal/ethapi" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/signer/core" - "github.com/nebulaai/nbai-node/signer/rules/deps" - "github.com/nebulaai/nbai-node/signer/storage" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/signer/core" + "github.com/ethereum/go-ethereum/signer/rules/deps" + "github.com/ethereum/go-ethereum/signer/storage" "github.com/robertkrimen/otto" ) @@ -42,29 +41,30 @@ func consoleOutput(call otto.FunctionCall) otto.Value { for _, argument := range call.ArgumentList { output = append(output, fmt.Sprintf("%v", argument)) } - fmt.Fprintln(os.Stdout, strings.Join(output, " ")) + fmt.Fprintln(os.Stderr, strings.Join(output, " ")) return otto.Value{} } -// rulesetUI provides an implementation of SignerUI that evaluates a javascript +// rulesetUI provides an implementation of UIClientAPI that evaluates a javascript // file for each defined UI-method type rulesetUI struct { - next core.SignerUI // The next handler, for manual processing - storage storage.Storage - credentials storage.Storage - jsRules string // The rules to use + next core.UIClientAPI // The next handler, for manual processing + storage storage.Storage + jsRules string // The rules to use } -func NewRuleEvaluator(next core.SignerUI, jsbackend, credentialsBackend storage.Storage) (*rulesetUI, error) { +func NewRuleEvaluator(next core.UIClientAPI, jsbackend storage.Storage) (*rulesetUI, error) { c := &rulesetUI{ - next: next, - storage: jsbackend, - credentials: credentialsBackend, - jsRules: "", + next: next, + storage: jsbackend, + jsRules: "", } return c, nil } +func (r *rulesetUI) RegisterUIServer(api *core.UIServerAPI) { + // TODO, make it possible to query from js +} func (r *rulesetUI) Init(javascriptRules string) error { r.jsRules = javascriptRules @@ -74,12 +74,28 @@ func (r *rulesetUI) execute(jsfunc string, jsarg interface{}) (otto.Value, error // Instantiate a fresh vm engine every time vm := otto.New() + // Set the native callbacks consoleObj, _ := vm.Get("console") consoleObj.Object().Set("log", consoleOutput) consoleObj.Object().Set("error", consoleOutput) - vm.Set("storage", r.storage) + vm.Set("storage", struct{}{}) + storageObj, _ := vm.Get("storage") + storageObj.Object().Set("put", func(call otto.FunctionCall) otto.Value { + key, val := call.Argument(0).String(), call.Argument(1).String() + if val == "" { + r.storage.Del(key) + } else { + r.storage.Put(key, val) + } + return otto.NullValue() + }) + storageObj.Object().Set("get", func(call otto.FunctionCall) otto.Value { + goval, _ := r.storage.Get(call.Argument(0).String()) + jsval, _ := otto.ToValue(goval) + return jsval + }) // Load bootstrap libraries script, err := vm.Compile("bignumber.js", BigNumber_JS) if err != nil { @@ -136,7 +152,7 @@ func (r *rulesetUI) checkApproval(jsfunc string, jsarg []byte, err error) (bool, log.Info("Op rejected") return false, nil } - return false, fmt.Errorf("Unknown response") + return false, fmt.Errorf("unknown response") } func (r *rulesetUI) ApproveTx(request *core.SignTxRequest) (core.SignTxResponse, error) { @@ -150,18 +166,12 @@ func (r *rulesetUI) ApproveTx(request *core.SignTxRequest) (core.SignTxResponse, if approved { return core.SignTxResponse{ Transaction: request.Transaction, - Approved: true, - Password: r.lookupPassword(request.Transaction.From.Address()), - }, + Approved: true}, nil } return core.SignTxResponse{Approved: false}, err } -func (r *rulesetUI) lookupPassword(address common.Address) string { - return r.credentials.Get(strings.ToLower(address.String())) -} - func (r *rulesetUI) ApproveSignData(request *core.SignDataRequest) (core.SignDataResponse, error) { jsonreq, err := json.Marshal(request) approved, err := r.checkApproval("ApproveSignData", jsonreq, err) @@ -170,28 +180,9 @@ func (r *rulesetUI) ApproveSignData(request *core.SignDataRequest) (core.SignDat return r.next.ApproveSignData(request) } if approved { - return core.SignDataResponse{Approved: true, Password: r.lookupPassword(request.Address.Address())}, nil - } - return core.SignDataResponse{Approved: false, Password: ""}, err -} - -func (r *rulesetUI) ApproveExport(request *core.ExportRequest) (core.ExportResponse, error) { - jsonreq, err := json.Marshal(request) - approved, err := r.checkApproval("ApproveExport", jsonreq, err) - if err != nil { - log.Info("Rule-based approval error, going to manual", "error", err) - return r.next.ApproveExport(request) - } - if approved { - return core.ExportResponse{Approved: true}, nil + return core.SignDataResponse{Approved: true}, nil } - return core.ExportResponse{Approved: false}, err -} - -func (r *rulesetUI) ApproveImport(request *core.ImportRequest) (core.ImportResponse, error) { - // This cannot be handled by rules, requires setting a password - // dispatch to next - return r.next.ApproveImport(request) + return core.SignDataResponse{Approved: false}, err } // OnInputRequired not handled by rules diff --git a/signer/rules/rules_test.go b/signer/rules/rules_test.go index 02e03c8bedbf..c030ed47ceb1 100644 --- a/signer/rules/rules_test.go +++ b/signer/rules/rules_test.go @@ -1,19 +1,19 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// 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 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. // -// go-ethereum is distributed in the hope that it will be useful, +// 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 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 . +// 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 rules import ( @@ -22,13 +22,13 @@ import ( "strings" "testing" - "github.com/nebulaai/nbai-node/accounts" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/internal/ethapi" - "github.com/nebulaai/nbai-node/signer/core" - "github.com/nebulaai/nbai-node/signer/storage" + "github.com/ethereum/go-ethereum/accounts" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/internal/ethapi" + "github.com/ethereum/go-ethereum/signer/core" + "github.com/ethereum/go-ethereum/signer/storage" ) const JS = ` @@ -77,28 +77,18 @@ type alwaysDenyUI struct{} func (alwaysDenyUI) OnInputRequired(info core.UserInputRequest) (core.UserInputResponse, error) { return core.UserInputResponse{}, nil } - -func (alwaysDenyUI) OnSignerStartup(info core.StartupInfo) { +func (alwaysDenyUI) RegisterUIServer(api *core.UIServerAPI) { } -func (alwaysDenyUI) OnMasterPassword(request *core.PasswordRequest) (core.PasswordResponse, error) { - return core.PasswordResponse{}, nil +func (alwaysDenyUI) OnSignerStartup(info core.StartupInfo) { } func (alwaysDenyUI) ApproveTx(request *core.SignTxRequest) (core.SignTxResponse, error) { - return core.SignTxResponse{Transaction: request.Transaction, Approved: false, Password: ""}, nil + return core.SignTxResponse{Transaction: request.Transaction, Approved: false}, nil } func (alwaysDenyUI) ApproveSignData(request *core.SignDataRequest) (core.SignDataResponse, error) { - return core.SignDataResponse{Approved: false, Password: ""}, nil -} - -func (alwaysDenyUI) ApproveExport(request *core.ExportRequest) (core.ExportResponse, error) { - return core.ExportResponse{Approved: false}, nil -} - -func (alwaysDenyUI) ApproveImport(request *core.ImportRequest) (core.ImportResponse, error) { - return core.ImportResponse{Approved: false, OldPassword: "", NewPassword: ""}, nil + return core.SignDataResponse{Approved: false}, nil } func (alwaysDenyUI) ApproveListing(request *core.ListRequest) (core.ListResponse, error) { @@ -106,7 +96,7 @@ func (alwaysDenyUI) ApproveListing(request *core.ListRequest) (core.ListResponse } func (alwaysDenyUI) ApproveNewAccount(request *core.NewAccountRequest) (core.NewAccountResponse, error) { - return core.NewAccountResponse{Approved: false, Password: ""}, nil + return core.NewAccountResponse{Approved: false}, nil } func (alwaysDenyUI) ShowError(message string) { @@ -122,7 +112,7 @@ func (alwaysDenyUI) OnApprovedTx(tx ethapi.SignTransactionResult) { } func initRuleEngine(js string) (*rulesetUI, error) { - r, err := NewRuleEvaluator(&alwaysDenyUI{}, storage.NewEphemeralStorage(), storage.NewEphemeralStorage()) + r, err := NewRuleEvaluator(&alwaysDenyUI{}, storage.NewEphemeralStorage()) if err != nil { return nil, fmt.Errorf("failed to create js engine: %v", err) } @@ -133,11 +123,11 @@ func initRuleEngine(js string) (*rulesetUI, error) { } func TestListRequest(t *testing.T) { - accs := make([]core.Account, 5) + accs := make([]accounts.Account, 5) for i := range accs { addr := fmt.Sprintf("000000000000000000000000000000000000000%x", i) - acc := core.Account{ + acc := accounts.Account{ Address: common.BytesToAddress(common.Hex2Bytes(addr)), URL: accounts.URL{Scheme: "test", Path: fmt.Sprintf("acc-%d", i)}, } @@ -188,7 +178,7 @@ func TestSignTxRequest(t *testing.T) { t.Error(err) return } - fmt.Printf("to %v", to.Address().String()) + t.Logf("to %v", to.Address().String()) resp, err := r.ApproveTx(&core.SignTxRequest{ Transaction: core.SendTxArgs{ From: *from, @@ -208,6 +198,10 @@ type dummyUI struct { calls []string } +func (d *dummyUI) RegisterUIServer(api *core.UIServerAPI) { + panic("implement me") +} + func (d *dummyUI) OnInputRequired(info core.UserInputRequest) (core.UserInputResponse, error) { d.calls = append(d.calls, "OnInputRequired") return core.UserInputResponse{}, nil @@ -223,16 +217,6 @@ func (d *dummyUI) ApproveSignData(request *core.SignDataRequest) (core.SignDataR return core.SignDataResponse{}, core.ErrRequestDenied } -func (d *dummyUI) ApproveExport(request *core.ExportRequest) (core.ExportResponse, error) { - d.calls = append(d.calls, "ApproveExport") - return core.ExportResponse{}, core.ErrRequestDenied -} - -func (d *dummyUI) ApproveImport(request *core.ImportRequest) (core.ImportResponse, error) { - d.calls = append(d.calls, "ApproveImport") - return core.ImportResponse{}, core.ErrRequestDenied -} - func (d *dummyUI) ApproveListing(request *core.ListRequest) (core.ListResponse, error) { d.calls = append(d.calls, "ApproveListing") return core.ListResponse{}, core.ErrRequestDenied @@ -255,10 +239,6 @@ func (d *dummyUI) OnApprovedTx(tx ethapi.SignTransactionResult) { d.calls = append(d.calls, "OnApprovedTx") } -func (d *dummyUI) OnMasterPassword(request *core.PasswordRequest) (core.PasswordResponse, error) { - return core.PasswordResponse{}, nil -} - func (d *dummyUI) OnSignerStartup(info core.StartupInfo) { } @@ -268,8 +248,7 @@ func TestForwarding(t *testing.T) { js := "" ui := &dummyUI{make([]string, 0)} jsBackend := storage.NewEphemeralStorage() - credBackend := storage.NewEphemeralStorage() - r, err := NewRuleEvaluator(ui, jsBackend, credBackend) + r, err := NewRuleEvaluator(ui, jsBackend) if err != nil { t.Fatalf("Failed to create js engine: %v", err) } @@ -278,17 +257,15 @@ func TestForwarding(t *testing.T) { } r.ApproveSignData(nil) r.ApproveTx(nil) - r.ApproveImport(nil) r.ApproveNewAccount(nil) r.ApproveListing(nil) - r.ApproveExport(nil) r.ShowError("test") r.ShowInfo("test") //This one is not forwarded r.OnApprovedTx(ethapi.SignTransactionResult{}) - expCalls := 8 + expCalls := 6 if len(ui.calls) != expCalls { t.Errorf("Expected %d forwarded calls, got %d: %s", expCalls, len(ui.calls), strings.Join(ui.calls, ",")) @@ -317,30 +294,30 @@ func TestMissingFunc(t *testing.T) { if approved { t.Errorf("Expected missing method to cause non-approval") } - fmt.Printf("Err %v", err) + t.Logf("Err %v", err) } func TestStorage(t *testing.T) { js := ` function testStorage(){ - storage.Put("mykey", "myvalue") - a = storage.Get("mykey") + storage.put("mykey", "myvalue") + a = storage.get("mykey") - storage.Put("mykey", ["a", "list"]) // Should result in "a,list" - a += storage.Get("mykey") + storage.put("mykey", ["a", "list"]) // Should result in "a,list" + a += storage.get("mykey") - storage.Put("mykey", {"an": "object"}) // Should result in "[object Object]" - a += storage.Get("mykey") + storage.put("mykey", {"an": "object"}) // Should result in "[object Object]" + a += storage.get("mykey") - storage.Put("mykey", JSON.stringify({"an": "object"})) // Should result in '{"an":"object"}' - a += storage.Get("mykey") + storage.put("mykey", JSON.stringify({"an": "object"})) // Should result in '{"an":"object"}' + a += storage.get("mykey") - a += storage.Get("missingkey") //Missing keys should result in empty string - storage.Put("","missing key==noop") // Can't store with 0-length key - a += storage.Get("") // Should result in '' + a += storage.get("missingkey") //Missing keys should result in empty string + storage.put("","missing key==noop") // Can't store with 0-length key + a += storage.get("") // Should result in '' var b = new BigNumber(2) var c = new BigNumber(16)//"0xf0",16) @@ -360,7 +337,6 @@ func TestStorage(t *testing.T) { if err != nil { t.Errorf("Unexpected error %v", err) } - retval, err := v.ToString() if err != nil { @@ -370,7 +346,7 @@ func TestStorage(t *testing.T) { if retval != exp { t.Errorf("Unexpected data, expected '%v', got '%v'", exp, retval) } - fmt.Printf("Err %v", err) + t.Logf("Err %v", err) } @@ -392,7 +368,7 @@ const ExampleTxWindow = ` var windowstart = new Date().getTime() - window; var txs = []; - var stored = storage.Get('txs'); + var stored = storage.get('txs'); if(stored != ""){ txs = JSON.parse(stored) @@ -437,19 +413,18 @@ const ExampleTxWindow = ` var value = big(resp.tx.value) var txs = [] // Load stored transactions - var stored = storage.Get('txs'); + var stored = storage.get('txs'); if(stored != ""){ txs = JSON.parse(stored) } // Add this to the storage txs.push({tstamp: new Date().getTime(), value: value}); - storage.Put("txs", JSON.stringify(txs)); + storage.put("txs", JSON.stringify(txs)); } ` func dummyTx(value hexutil.Big) *core.SignTxRequest { - to, _ := mixAddr("000000000000000000000000000000000000dead") from, _ := mixAddr("000000000000000000000000000000000000dead") n := hexutil.Uint64(3) @@ -471,28 +446,27 @@ func dummyTx(value hexutil.Big) *core.SignTxRequest { Meta: core.Metadata{Remote: "remoteip", Local: "localip", Scheme: "inproc"}, } } -func dummyTxWithV(value uint64) *core.SignTxRequest { +func dummyTxWithV(value uint64) *core.SignTxRequest { v := big.NewInt(0).SetUint64(value) h := hexutil.Big(*v) return dummyTx(h) } + func dummySigned(value *big.Int) *types.Transaction { to := common.HexToAddress("000000000000000000000000000000000000dead") gas := uint64(21000) gasPrice := big.NewInt(2000000) data := make([]byte, 0) return types.NewTransaction(3, to, value, gas, gasPrice, data) - } -func TestLimitWindow(t *testing.T) { +func TestLimitWindow(t *testing.T) { r, err := initRuleEngine(ExampleTxWindow) if err != nil { t.Errorf("Couldn't create evaluator %v", err) return } - // 0.3 ether: 429D069189E0000 wei v := big.NewInt(0).SetBytes(common.Hex2Bytes("0429D069189E0000")) h := hexutil.Big(*v) @@ -519,7 +493,6 @@ func TestLimitWindow(t *testing.T) { if resp.Approved { t.Errorf("Expected check to resolve to 'Reject'") } - } // dontCallMe is used as a next-handler that does not want to be called - it invokes test failure @@ -532,11 +505,10 @@ func (d *dontCallMe) OnInputRequired(info core.UserInputRequest) (core.UserInput return core.UserInputResponse{}, nil } -func (d *dontCallMe) OnSignerStartup(info core.StartupInfo) { +func (d *dontCallMe) RegisterUIServer(api *core.UIServerAPI) { } -func (d *dontCallMe) OnMasterPassword(request *core.PasswordRequest) (core.PasswordResponse, error) { - return core.PasswordResponse{}, nil +func (d *dontCallMe) OnSignerStartup(info core.StartupInfo) { } func (d *dontCallMe) ApproveTx(request *core.SignTxRequest) (core.SignTxResponse, error) { @@ -549,16 +521,6 @@ func (d *dontCallMe) ApproveSignData(request *core.SignDataRequest) (core.SignDa return core.SignDataResponse{}, core.ErrRequestDenied } -func (d *dontCallMe) ApproveExport(request *core.ExportRequest) (core.ExportResponse, error) { - d.t.Fatalf("Did not expect next-handler to be called") - return core.ExportResponse{}, core.ErrRequestDenied -} - -func (d *dontCallMe) ApproveImport(request *core.ImportRequest) (core.ImportResponse, error) { - d.t.Fatalf("Did not expect next-handler to be called") - return core.ImportResponse{}, core.ErrRequestDenied -} - func (d *dontCallMe) ApproveListing(request *core.ListRequest) (core.ListResponse, error) { d.t.Fatalf("Did not expect next-handler to be called") return core.ListResponse{}, core.ErrRequestDenied @@ -601,7 +563,7 @@ func TestContextIsCleared(t *testing.T) { } ` ui := &dontCallMe{t} - r, err := NewRuleEvaluator(ui, storage.NewEphemeralStorage(), storage.NewEphemeralStorage()) + r, err := NewRuleEvaluator(ui, storage.NewEphemeralStorage()) if err != nil { t.Fatalf("Failed to create js engine: %v", err) } @@ -624,7 +586,7 @@ func TestSignData(t *testing.T) { function ApproveSignData(r){ if( r.address.toLowerCase() == "0x694267f14675d7e1b9494fd8d72fefe1755710fa") { - if(r.message.indexOf("bazonk") >= 0){ + if(r.messages[0].value.indexOf("bazonk") >= 0){ return "Approve" } return "Reject" @@ -636,18 +598,25 @@ function ApproveSignData(r){ t.Errorf("Couldn't create evaluator %v", err) return } - message := []byte("baz bazonk foo") - hash, msg := core.SignHash(message) - raw := hexutil.Bytes(message) + message := "baz bazonk foo" + hash, rawdata := accounts.TextAndHash([]byte(message)) addr, _ := mixAddr("0x694267f14675d7e1b9494fd8d72fefe1755710fa") - fmt.Printf("address %v %v\n", addr.String(), addr.Original()) + t.Logf("address %v %v\n", addr.String(), addr.Original()) + + nvt := []*core.NameValueType{ + { + Name: "message", + Typ: "text/plain", + Value: message, + }, + } resp, err := r.ApproveSignData(&core.SignDataRequest{ - Address: *addr, - Message: msg, - Hash: hash, - Meta: core.Metadata{Remote: "remoteip", Local: "localip", Scheme: "inproc"}, - Rawdata: raw, + Address: *addr, + Messages: nvt, + Hash: hash, + Meta: core.Metadata{Remote: "remoteip", Local: "localip", Scheme: "inproc"}, + Rawdata: []byte(rawdata), }) if err != nil { t.Fatalf("Unexpected error %v", err) diff --git a/signer/storage/aes_gcm_storage.go b/signer/storage/aes_gcm_storage.go index 8bfad812eeb0..8c5e147ac6d2 100644 --- a/signer/storage/aes_gcm_storage.go +++ b/signer/storage/aes_gcm_storage.go @@ -1,19 +1,18 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// 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 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. // -// go-ethereum is distributed in the hope that it will be useful, +// 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 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 . +// 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 @@ -26,7 +25,7 @@ import ( "io/ioutil" "os" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/log" ) type storedCredential struct { @@ -53,7 +52,7 @@ func NewAESEncryptedStorage(filename string, key []byte) *AESEncryptedStorage { } } -// Put stores a value by key. 0-length keys results in no-op +// Put stores a value by key. 0-length keys results in noop. func (s *AESEncryptedStorage) Put(key, value string) { if len(key) == 0 { return @@ -75,27 +74,41 @@ func (s *AESEncryptedStorage) Put(key, value string) { } } -// Get returns the previously stored value, or the empty string if it does not exist or key is of 0-length -func (s *AESEncryptedStorage) Get(key string) string { +// Get returns the previously stored value, or an error if it does not exist or +// key is of 0-length. +func (s *AESEncryptedStorage) Get(key string) (string, error) { if len(key) == 0 { - return "" + return "", ErrZeroKey } data, err := s.readEncryptedStorage() if err != nil { log.Warn("Failed to read encrypted storage", "err", err, "file", s.filename) - return "" + return "", err } encrypted, exist := data[key] if !exist { log.Warn("Key does not exist", "key", key) - return "" + return "", ErrNotFound } entry, err := decrypt(s.key, encrypted.Iv, encrypted.CipherText, []byte(key)) if err != nil { log.Warn("Failed to decrypt key", "key", key) - return "" + return "", err + } + return string(entry), nil +} + +// Del removes a key-value pair. If the key doesn't exist, the method is a noop. +func (s *AESEncryptedStorage) Del(key string) { + data, err := s.readEncryptedStorage() + if err != nil { + log.Warn("Failed to read encrypted storage", "err", err, "file", s.filename) + return + } + delete(data, key) + if err = s.writeEncryptedStorage(data); err != nil { + log.Warn("Failed to write entry", "err", err) } - return string(entry) } // readEncryptedStorage reads the file with encrypted creds diff --git a/signer/storage/aes_gcm_storage_test.go b/signer/storage/aes_gcm_storage_test.go index 64007a5be3f6..664ef1299405 100644 --- a/signer/storage/aes_gcm_storage_test.go +++ b/signer/storage/aes_gcm_storage_test.go @@ -1,19 +1,19 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// 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 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. // -// go-ethereum is distributed in the hope that it will be useful, +// 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 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 . +// 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 ( @@ -23,8 +23,8 @@ import ( "io/ioutil" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" "github.com/mattn/go-colorable" ) @@ -38,13 +38,13 @@ func TestEncryption(t *testing.T) { if err != nil { t.Fatal(err) } - fmt.Printf("Ciphertext %x, nonce %x\n", c, iv) + t.Logf("Ciphertext %x, nonce %x\n", c, iv) p, err := decrypt(key, iv, c, nil) if err != nil { t.Fatal(err) } - fmt.Printf("Plaintext %v\n", string(p)) + t.Logf("Plaintext %v\n", string(p)) if !bytes.Equal(plaintext, p) { t.Errorf("Failed: expected plaintext recovery, got %v expected %v", string(plaintext), string(p)) } @@ -110,8 +110,8 @@ func TestEnd2End(t *testing.T) { } s1.Put("bazonk", "foobar") - if v := s2.Get("bazonk"); v != "foobar" { - t.Errorf("Expected bazonk->foobar, got '%v'", v) + if v, err := s2.Get("bazonk"); v != "foobar" || err != nil { + t.Errorf("Expected bazonk->foobar (nil error), got '%v' (%v error)", v, err) } } @@ -154,11 +154,11 @@ func TestSwappedKeys(t *testing.T) { } } swap() - if v := s1.Get("k1"); v != "" { + if v, _ := s1.Get("k1"); v != "" { t.Errorf("swapped value should return empty") } swap() - if v := s1.Get("k1"); v != "v1" { + if v, _ := s1.Get("k1"); v != "v1" { t.Errorf("double-swapped value should work fine") } } diff --git a/signer/storage/storage.go b/signer/storage/storage.go index 60f4e3892a31..33c0d66f9b8b 100644 --- a/signer/storage/storage.go +++ b/signer/storage/storage.go @@ -1,57 +1,72 @@ // Copyright 2018 The go-ethereum Authors -// This file is part of go-ethereum. +// This file is part of the go-ethereum library. // -// 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 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. // -// go-ethereum is distributed in the hope that it will be useful, +// 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 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 . +// 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 ( - "fmt" +import "errors" + +var ( + // ErrZeroKey is returned if an attempt was made to inset a 0-length key. + ErrZeroKey = errors.New("0-length key") + + // ErrNotFound is returned if an unknown key is attempted to be retrieved. + ErrNotFound = errors.New("not found") ) type Storage interface { - // Put stores a value by key. 0-length keys results in no-op + // Put stores a value by key. 0-length keys results in noop. Put(key, value string) - // Get returns the previously stored value, or the empty string if it does not exist or key is of 0-length - Get(key string) string + + // Get returns the previously stored value, or an error if the key is 0-length + // or unknown. + Get(key string) (string, error) + + // Del removes a key-value pair. If the key doesn't exist, the method is a noop. + Del(key string) } // EphemeralStorage is an in-memory storage that does // not persist values to disk. Mainly used for testing type EphemeralStorage struct { - data map[string]string - namespace string + data map[string]string } +// Put stores a value by key. 0-length keys results in noop. func (s *EphemeralStorage) Put(key, value string) { if len(key) == 0 { return } - fmt.Printf("storage: put %v -> %v\n", key, value) s.data[key] = value } -func (s *EphemeralStorage) Get(key string) string { +// Get returns the previously stored value, or an error if the key is 0-length +// or unknown. +func (s *EphemeralStorage) Get(key string) (string, error) { if len(key) == 0 { - return "" + return "", ErrZeroKey } - fmt.Printf("storage: get %v\n", key) - if v, exist := s.data[key]; exist { - return v + if v, ok := s.data[key]; ok { + return v, nil } - return "" + return "", ErrNotFound +} + +// Del removes a key-value pair. If the key doesn't exist, the method is a noop. +func (s *EphemeralStorage) Del(key string) { + delete(s.data, key) } func NewEphemeralStorage() Storage { @@ -60,3 +75,12 @@ func NewEphemeralStorage() Storage { } return s } + +// NoStorage is a dummy construct which doesn't remember anything you tell it +type NoStorage struct{} + +func (s *NoStorage) Put(key, value string) {} +func (s *NoStorage) Del(key string) {} +func (s *NoStorage) Get(key string) (string, error) { + return "", errors.New("missing key, I probably forgot") +} diff --git a/swarm/AUTHORS b/swarm/AUTHORS deleted file mode 100644 index f7232f07ce74..000000000000 --- a/swarm/AUTHORS +++ /dev/null @@ -1,35 +0,0 @@ -# Core team members - -Viktor Trón - @zelig -Louis Holbrook - @nolash -Lewis Marshall - @lmars -Anton Evangelatov - @nonsense -Janoš Guljaš - @janos -Balint Gabor - @gbalint -Elad Nachmias - @justelad -Daniel A. Nagy - @nagydani -Aron Fischer - @homotopycolimit -Fabio Barone - @holisticode -Zahoor Mohamed - @jmozah -Zsolt Felföldi - @zsfelfoldi - -# External contributors - -Kiel Barry -Gary Rong -Jared Wasinger -Leon Stanko -Javier Peletier [epiclabs.io] -Bartek Borkowski [tungsten-labs.com] -Shane Howley [mainframe.com] -Doug Leonard [mainframe.com] -Ivan Daniluk [status.im] -Felix Lange [EF] -Martin Holst Swende [EF] -Guillaume Ballet [EF] -ligi [EF] -Christopher Dro [blick-labs.com] -Sergii Bomko [ledgerleopard.com] -Domino Valdano -Rafael Matias -Coogan Brennan \ No newline at end of file diff --git a/swarm/OWNERS b/swarm/OWNERS deleted file mode 100644 index 4b9ca96ebe62..000000000000 --- a/swarm/OWNERS +++ /dev/null @@ -1,25 +0,0 @@ -# Ownership by go packages - -swarm -├── api ─────────────────── ethersphere -├── bmt ─────────────────── @zelig -├── dev ─────────────────── @lmars -├── fuse ────────────────── @jmozah, @holisticode -├── grafana_dashboards ──── @nonsense -├── metrics ─────────────── @nonsense, @holisticode -├── network ─────────────── ethersphere -│ ├── bitvector ───────── @zelig, @janos, @gbalint -│ ├── priorityqueue ───── @zelig, @janos, @gbalint -│ ├── simulations ─────── @zelig -│ └── stream ──────────── @janos, @zelig, @gbalint, @holisticode, @justelad -│ ├── intervals ───── @janos -│ └── testing ─────── @zelig -├── pot ─────────────────── @zelig -├── pss ─────────────────── @nolash, @zelig, @nonsense -├── services ────────────── @zelig -├── state ───────────────── @justelad -├── storage ─────────────── ethersphere -│ ├── encryption ──────── @gbalint, @zelig, @nagydani -│ ├── mock ────────────── @janos -│ └── feed ────────────── @nolash, @jpeletier -└── testutil ────────────── @lmars \ No newline at end of file diff --git a/swarm/README.md b/swarm/README.md index 91e23e7d244f..265883181306 100644 --- a/swarm/README.md +++ b/swarm/README.md @@ -1,244 +1,7 @@ -## Swarm +# Swarm -[https://swarm.ethereum.org](https://swarm.ethereum.org) +https://swarm.ethereum.org Swarm is a distributed storage platform and content distribution service, a native base layer service of the ethereum web3 stack. The primary objective of Swarm is to provide a decentralized and redundant store for dapp code and data as well as block chain and state data. Swarm is also set out to provide various base layer services for web3, including node-to-node messaging, media streaming, decentralised database services and scalable state-channel infrastructure for decentralised service economies. -[![Travis](https://travis-ci.org/ethereum/go-ethereum.svg?branch=master)](https://travis-ci.org/ethereum/go-ethereum) -[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ethersphere/orange-lounge?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -## Table of Contents - -* [Building the source](#building-the-source) -* [Running Swarm](#running-swarm) -* [Documentation](#documentation) -* [Developers Guide](#developers-guide) - * [Go Environment](#development-environment) - * [Vendored Dependencies](#vendored-dependencies) - * [Testing](#testing) - * [Profiling Swarm](#profiling-swarm) - * [Metrics and Instrumentation in Swarm](#metrics-and-instrumentation-in-swarm) -* [Public Gateways](#public-gateways) -* [Swarm Dapps](#swarm-dapps) -* [Contributing](#contributing) -* [License](#license) - -## Building the source - -Building Swarm requires Go (version 1.10 or later). - - go get -d github.com/nebulaai/nbai-node - - go install github.com/nebulaai/nbai-node/cmd/swarm - -## Running Swarm - -Going through all the possible command line flags is out of scope here, but we've enumerated a few common parameter combos to get you up to speed quickly on how you can run your own Swarm node. - -To run Swarm you need an Ethereum account. You can create a new account by running the following command: - - geth account new - -You will be prompted for a password: - - Your new account is locked with a password. Please give a password. Do not forget this password. - Passphrase: - Repeat passphrase: - -Once you have specified the password, the output will be the Ethereum address representing that account. For example: - - Address: {2f1cd699b0bf461dcfbf0098ad8f5587b038f0f1} - -Using this account, connect to Swarm with - - swarm --bzzaccount - - # in our example - - swarm --bzzaccount 2f1cd699b0bf461dcfbf0098ad8f5587b038f0f1 - - -### Verifying that your local Swarm node is running - -When running, Swarm is accessible through an HTTP API on port 8500. - -Confirm that it is up and running by pointing your browser to http://localhost:8500 - -### Ethereum Name Service resolution - -The Ethereum Name Service is the Ethereum equivalent of DNS in the classic web. In order to use ENS to resolve names to Swarm content hashes (e.g. `bzz://theswarm.eth`), `swarm` has to connect to a `geth` instance, which is synced with the Ethereum mainnet. This is done using the `--ens-api` flag. - - swarm --bzzaccount \ - --ens-api '$HOME/.ethereum/geth.ipc' - - # in our example - - swarm --bzzaccount 2f1cd699b0bf461dcfbf0098ad8f5587b038f0f1 \ - --ens-api '$HOME/.ethereum/geth.ipc' - -For more information on usage, features or command line flags, please consult the Documentation. - - -## Documentation - -Swarm documentation can be found at [https://swarm-guide.readthedocs.io](https://swarm-guide.readthedocs.io). - - -## Developers Guide - -### Go Environment - -We assume that you have Go v1.10 installed, and `GOPATH` is set. - -You must have your working copy under `$GOPATH/src/github.com/nebulaai/nbai-node`. - -Most likely you will be working from your fork of `go-ethereum`, let's say from `github.com/nirname/go-ethereum`. Clone or move your fork into the right place: - -``` -git clone git@github.com:nirname/go-ethereum.git $GOPATH/src/github.com/nebulaai/nbai-node -``` - - -### Vendored Dependencies - -All dependencies are tracked in the `vendor` directory. We use `govendor` to manage them. - -If you want to add a new dependency, run `govendor fetch `, then commit the result. - -If you want to update all dependencies to their latest upstream version, run `govendor fetch +v`. - - -### Testing - -This section explains how to run unit, integration, and end-to-end tests in your development sandbox. - -Testing one library: - -``` -go test -v -cpu 4 ./swarm/api -``` - -Note: Using options -cpu (number of cores allowed) and -v (logging even if no error) is recommended. - -Testing only some methods: - -``` -go test -v -cpu 4 ./eth -run TestMethod -``` - -Note: here all tests with prefix TestMethod will be run, so if you got TestMethod, TestMethod1, then both! - -Running benchmarks: - -``` -go test -v -cpu 4 -bench . -run BenchmarkJoin -``` - - -### Profiling Swarm - -This section explains how to add Go `pprof` profiler to Swarm - -If `swarm` is started with the `--pprof` option, a debugging HTTP server is made available on port 6060. - -You can bring up http://localhost:6060/debug/pprof to see the heap, running routines etc. - -By clicking full goroutine stack dump (clicking http://localhost:6060/debug/pprof/goroutine?debug=2) you can generate trace that is useful for debugging. - - -### Metrics and Instrumentation in Swarm - -This section explains how to visualize and use existing Swarm metrics and how to instrument Swarm with a new metric. - -Swarm metrics system is based on the `go-metrics` library. - -The most common types of measurements we use in Swarm are `counters` and `resetting timers`. Consult the `go-metrics` documentation for full reference of available types. - -``` -# incrementing a counter -metrics.GetOrRegisterCounter("network.stream.received_chunks", nil).Inc(1) - -# measuring latency with a resetting timer -start := time.Now() -t := metrics.GetOrRegisterResettingTimer("http.request.GET.time"), nil) -... -t := UpdateSince(start) -``` - -#### Visualizing metrics - -Swarm supports an InfluxDB exporter. Consult the help section to learn about the command line arguments used to configure it: - -``` -swarm --help | grep metrics -``` - -We use Grafana and InfluxDB to visualise metrics reported by Swarm. We keep our Grafana dashboards under version control at `./swarm/grafana_dashboards`. You could use them or design your own. - -We have built a tool to help with automatic start of Grafana and InfluxDB and provisioning of dashboards at https://github.com/nonsense/stateth , which requires that you have Docker installed. - -Once you have `stateth` installed, and you have Docker running locally, you have to: - -1. Run `stateth` and keep it running in the background -``` -stateth --rm --grafana-dashboards-folder $GOPATH/src/github.com/nebulaai/nbai-node/swarm/grafana_dashboards --influxdb-database metrics -``` - -2. Run `swarm` with at least the following params: -``` ---metrics \ ---metrics.influxdb.export \ ---metrics.influxdb.endpoint "http://localhost:8086" \ ---metrics.influxdb.username "admin" \ ---metrics.influxdb.password "admin" \ ---metrics.influxdb.database "metrics" -``` - -3. Open Grafana at http://localhost:3000 and view the dashboards to gain insight into Swarm. - - -## Public Gateways - -Swarm offers a local HTTP proxy API that Dapps can use to interact with Swarm. The Ethereum Foundation is hosting a public gateway, which allows free access so that people can try Swarm without running their own node. - -The Swarm public gateways are temporary and users should not rely on their existence for production services. - -The Swarm public gateway can be found at https://swarm-gateways.net and is always running the latest `stable` Swarm release. - -## Swarm Dapps - -You can find a few reference Swarm decentralised applications at: https://swarm-gateways.net/bzz:/swarmapps.eth - -Their source code can be found at: https://github.com/ethersphere/swarm-dapps - -## Contributing - -Thank you for considering to help out with the source code! We welcome contributions from -anyone on the internet, and are grateful for even the smallest of fixes! - -If you'd like to contribute to Swarm, please fork, fix, commit and send a pull request -for the maintainers to review and merge into the main code base. If you wish to submit more -complex changes though, please check up with the core devs first on [our Swarm gitter channel](https://gitter.im/ethersphere/orange-lounge) -to ensure those changes are in line with the general philosophy of the project and/or get some -early feedback which can make both your efforts much lighter as well as our review and merge -procedures quick and simple. - -Please make sure your contributions adhere to our coding guidelines: - - * Code must adhere to the official Go [formatting](https://golang.org/doc/effective_go.html#formatting) guidelines (i.e. uses [gofmt](https://golang.org/cmd/gofmt/)). - * Code must be documented adhering to the official Go [commentary](https://golang.org/doc/effective_go.html#commentary) guidelines. - * Pull requests need to be based on and opened against the `master` branch. - * [Code review guidelines](https://github.com/ethereum/go-ethereum/wiki/Code-Review-Guidelines). - * Commit messages should be prefixed with the package(s) they modify. - * E.g. "swarm/fuse: ignore default manifest entry" - - -## License - -The go-ethereum library (i.e. all code outside of the `cmd` directory) is licensed under the -[GNU Lesser General Public License v3.0](https://www.gnu.org/licenses/lgpl-3.0.en.html), also -included in our repository in the `COPYING.LESSER` file. - -The go-ethereum binaries (i.e. all code inside of the `cmd` directory) is licensed under the -[GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.en.html), also included -in our repository in the `COPYING` file. +**Note**: The codebase has been moved to [ethersphere/swarm](https://github.com/ethersphere/swarm) diff --git a/swarm/api/act.go b/swarm/api/act.go deleted file mode 100644 index 9f237a0c8ad4..000000000000 --- a/swarm/api/act.go +++ /dev/null @@ -1,538 +0,0 @@ -package api - -import ( - "context" - "crypto/ecdsa" - "crypto/rand" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "io" - "strings" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/crypto/ecies" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/sctx" - "github.com/nebulaai/nbai-node/swarm/storage" - "golang.org/x/crypto/scrypt" - "golang.org/x/crypto/sha3" - cli "gopkg.in/urfave/cli.v1" -) - -var ( - ErrDecrypt = errors.New("cant decrypt - forbidden") - ErrUnknownAccessType = errors.New("unknown access type (or not implemented)") - ErrDecryptDomainForbidden = errors.New("decryption request domain forbidden - can only decrypt on localhost") - AllowedDecryptDomains = []string{ - "localhost", - "127.0.0.1", - } -) - -const EMPTY_CREDENTIALS = "" - -type AccessEntry struct { - Type AccessType - Publisher string - Salt []byte - Act string - KdfParams *KdfParams -} - -type DecryptFunc func(*ManifestEntry) error - -func (a *AccessEntry) MarshalJSON() (out []byte, err error) { - - return json.Marshal(struct { - Type AccessType `json:"type,omitempty"` - Publisher string `json:"publisher,omitempty"` - Salt string `json:"salt,omitempty"` - Act string `json:"act,omitempty"` - KdfParams *KdfParams `json:"kdf_params,omitempty"` - }{ - Type: a.Type, - Publisher: a.Publisher, - Salt: hex.EncodeToString(a.Salt), - Act: a.Act, - KdfParams: a.KdfParams, - }) - -} - -func (a *AccessEntry) UnmarshalJSON(value []byte) error { - v := struct { - Type AccessType `json:"type,omitempty"` - Publisher string `json:"publisher,omitempty"` - Salt string `json:"salt,omitempty"` - Act string `json:"act,omitempty"` - KdfParams *KdfParams `json:"kdf_params,omitempty"` - }{} - - err := json.Unmarshal(value, &v) - if err != nil { - return err - } - a.Act = v.Act - a.KdfParams = v.KdfParams - a.Publisher = v.Publisher - a.Salt, err = hex.DecodeString(v.Salt) - if err != nil { - return err - } - if len(a.Salt) != 32 { - return errors.New("salt should be 32 bytes long") - } - a.Type = v.Type - return nil -} - -type KdfParams struct { - N int `json:"n"` - P int `json:"p"` - R int `json:"r"` -} - -type AccessType string - -const AccessTypePass = AccessType("pass") -const AccessTypePK = AccessType("pk") -const AccessTypeACT = AccessType("act") - -// NewAccessEntryPassword creates a manifest AccessEntry in order to create an ACT protected by a password -func NewAccessEntryPassword(salt []byte, kdfParams *KdfParams) (*AccessEntry, error) { - if len(salt) != 32 { - return nil, fmt.Errorf("salt should be 32 bytes long") - } - return &AccessEntry{ - Type: AccessTypePass, - Salt: salt, - KdfParams: kdfParams, - }, nil -} - -// NewAccessEntryPK creates a manifest AccessEntry in order to create an ACT protected by a pair of Elliptic Curve keys -func NewAccessEntryPK(publisher string, salt []byte) (*AccessEntry, error) { - if len(publisher) != 66 { - return nil, fmt.Errorf("publisher should be 66 characters long, got %d", len(publisher)) - } - if len(salt) != 32 { - return nil, fmt.Errorf("salt should be 32 bytes long") - } - return &AccessEntry{ - Type: AccessTypePK, - Publisher: publisher, - Salt: salt, - }, nil -} - -// NewAccessEntryACT creates a manifest AccessEntry in order to create an ACT protected by a combination of EC keys and passwords -func NewAccessEntryACT(publisher string, salt []byte, act string) (*AccessEntry, error) { - if len(salt) != 32 { - return nil, fmt.Errorf("salt should be 32 bytes long") - } - if len(publisher) != 66 { - return nil, fmt.Errorf("publisher should be 66 characters long") - } - - return &AccessEntry{ - Type: AccessTypeACT, - Publisher: publisher, - Salt: salt, - Act: act, - KdfParams: DefaultKdfParams, - }, nil -} - -// NOOPDecrypt is a generic decrypt function that is passed into the API in places where real ACT decryption capabilities are -// either unwanted, or alternatively, cannot be implemented in the immediate scope -func NOOPDecrypt(*ManifestEntry) error { - return nil -} - -var DefaultKdfParams = NewKdfParams(262144, 1, 8) - -// NewKdfParams returns a KdfParams struct with the given scrypt params -func NewKdfParams(n, p, r int) *KdfParams { - - return &KdfParams{ - N: n, - P: p, - R: r, - } -} - -// NewSessionKeyPassword creates a session key based on a shared secret (password) and the given salt -// and kdf parameters in the access entry -func NewSessionKeyPassword(password string, accessEntry *AccessEntry) ([]byte, error) { - if accessEntry.Type != AccessTypePass && accessEntry.Type != AccessTypeACT { - return nil, errors.New("incorrect access entry type") - - } - return sessionKeyPassword(password, accessEntry.Salt, accessEntry.KdfParams) -} - -func sessionKeyPassword(password string, salt []byte, kdfParams *KdfParams) ([]byte, error) { - return scrypt.Key( - []byte(password), - salt, - kdfParams.N, - kdfParams.R, - kdfParams.P, - 32, - ) -} - -// NewSessionKeyPK creates a new ACT Session Key using an ECDH shared secret for the given key pair and the given salt value -func NewSessionKeyPK(private *ecdsa.PrivateKey, public *ecdsa.PublicKey, salt []byte) ([]byte, error) { - granteePubEcies := ecies.ImportECDSAPublic(public) - privateKey := ecies.ImportECDSA(private) - - bytes, err := privateKey.GenerateShared(granteePubEcies, 16, 16) - if err != nil { - return nil, err - } - bytes = append(salt, bytes...) - sessionKey := crypto.Keccak256(bytes) - return sessionKey, nil -} - -func (a *API) doDecrypt(ctx context.Context, credentials string, pk *ecdsa.PrivateKey) DecryptFunc { - return func(m *ManifestEntry) error { - if m.Access == nil { - return nil - } - - allowed := false - requestDomain := sctx.GetHost(ctx) - for _, v := range AllowedDecryptDomains { - if strings.Contains(requestDomain, v) { - allowed = true - } - } - - if !allowed { - return ErrDecryptDomainForbidden - } - - switch m.Access.Type { - case "pass": - if credentials != "" { - key, err := NewSessionKeyPassword(credentials, m.Access) - if err != nil { - return err - } - - ref, err := hex.DecodeString(m.Hash) - if err != nil { - return err - } - - enc := NewRefEncryption(len(ref) - 8) - decodedRef, err := enc.Decrypt(ref, key) - if err != nil { - return ErrDecrypt - } - - m.Hash = hex.EncodeToString(decodedRef) - m.Access = nil - return nil - } - return ErrDecrypt - case "pk": - publisherBytes, err := hex.DecodeString(m.Access.Publisher) - if err != nil { - return ErrDecrypt - } - publisher, err := crypto.DecompressPubkey(publisherBytes) - if err != nil { - return ErrDecrypt - } - key, err := NewSessionKeyPK(pk, publisher, m.Access.Salt) - if err != nil { - return ErrDecrypt - } - ref, err := hex.DecodeString(m.Hash) - if err != nil { - return err - } - - enc := NewRefEncryption(len(ref) - 8) - decodedRef, err := enc.Decrypt(ref, key) - if err != nil { - return ErrDecrypt - } - - m.Hash = hex.EncodeToString(decodedRef) - m.Access = nil - return nil - case "act": - var ( - sessionKey []byte - err error - ) - - publisherBytes, err := hex.DecodeString(m.Access.Publisher) - if err != nil { - return ErrDecrypt - } - publisher, err := crypto.DecompressPubkey(publisherBytes) - if err != nil { - return ErrDecrypt - } - - sessionKey, err = NewSessionKeyPK(pk, publisher, m.Access.Salt) - if err != nil { - return ErrDecrypt - } - - found, ciphertext, decryptionKey, err := a.getACTDecryptionKey(ctx, storage.Address(common.Hex2Bytes(m.Access.Act)), sessionKey) - if err != nil { - return err - } - if !found { - // try to fall back to password - if credentials != "" { - sessionKey, err = NewSessionKeyPassword(credentials, m.Access) - if err != nil { - return err - } - found, ciphertext, decryptionKey, err = a.getACTDecryptionKey(ctx, storage.Address(common.Hex2Bytes(m.Access.Act)), sessionKey) - if err != nil { - return err - } - if !found { - return ErrDecrypt - } - } else { - return ErrDecrypt - } - } - enc := NewRefEncryption(len(ciphertext) - 8) - decodedRef, err := enc.Decrypt(ciphertext, decryptionKey) - if err != nil { - return ErrDecrypt - } - - ref, err := hex.DecodeString(m.Hash) - if err != nil { - return err - } - - enc = NewRefEncryption(len(ref) - 8) - decodedMainRef, err := enc.Decrypt(ref, decodedRef) - if err != nil { - return ErrDecrypt - } - m.Hash = hex.EncodeToString(decodedMainRef) - m.Access = nil - return nil - } - return ErrUnknownAccessType - } -} - -func (a *API) getACTDecryptionKey(ctx context.Context, actManifestAddress storage.Address, sessionKey []byte) (found bool, ciphertext, decryptionKey []byte, err error) { - hasher := sha3.NewLegacyKeccak256() - hasher.Write(append(sessionKey, 0)) - lookupKey := hasher.Sum(nil) - hasher.Reset() - - hasher.Write(append(sessionKey, 1)) - accessKeyDecryptionKey := hasher.Sum(nil) - hasher.Reset() - - lk := hex.EncodeToString(lookupKey) - list, err := a.GetManifestList(ctx, NOOPDecrypt, actManifestAddress, lk) - if err != nil { - return false, nil, nil, err - } - for _, v := range list.Entries { - if v.Path == lk { - cipherTextBytes, err := hex.DecodeString(v.Hash) - if err != nil { - return false, nil, nil, err - } - return true, cipherTextBytes, accessKeyDecryptionKey, nil - } - } - return false, nil, nil, nil -} - -func GenerateAccessControlManifest(ctx *cli.Context, ref string, accessKey []byte, ae *AccessEntry) (*Manifest, error) { - refBytes, err := hex.DecodeString(ref) - if err != nil { - return nil, err - } - // encrypt ref with accessKey - enc := NewRefEncryption(len(refBytes)) - encrypted, err := enc.Encrypt(refBytes, accessKey) - if err != nil { - return nil, err - } - - m := &Manifest{ - Entries: []ManifestEntry{ - { - Hash: hex.EncodeToString(encrypted), - ContentType: ManifestType, - ModTime: time.Now(), - Access: ae, - }, - }, - } - - return m, nil -} - -// DoPK is a helper function to the CLI API that handles the entire business logic for -// creating a session key and access entry given the cli context, ec keys and salt -func DoPK(ctx *cli.Context, privateKey *ecdsa.PrivateKey, granteePublicKey string, salt []byte) (sessionKey []byte, ae *AccessEntry, err error) { - if granteePublicKey == "" { - return nil, nil, errors.New("need a grantee Public Key") - } - b, err := hex.DecodeString(granteePublicKey) - if err != nil { - log.Error("error decoding grantee public key", "err", err) - return nil, nil, err - } - - granteePub, err := crypto.DecompressPubkey(b) - if err != nil { - log.Error("error decompressing grantee public key", "err", err) - return nil, nil, err - } - - sessionKey, err = NewSessionKeyPK(privateKey, granteePub, salt) - if err != nil { - log.Error("error getting session key", "err", err) - return nil, nil, err - } - - ae, err = NewAccessEntryPK(hex.EncodeToString(crypto.CompressPubkey(&privateKey.PublicKey)), salt) - if err != nil { - log.Error("error generating access entry", "err", err) - return nil, nil, err - } - - return sessionKey, ae, nil -} - -// DoACT is a helper function to the CLI API that handles the entire business logic for -// creating a access key, access entry and ACT manifest (including uploading it) given the cli context, ec keys, password grantees and salt -func DoACT(ctx *cli.Context, privateKey *ecdsa.PrivateKey, salt []byte, grantees []string, encryptPasswords []string) (accessKey []byte, ae *AccessEntry, actManifest *Manifest, err error) { - if len(grantees) == 0 && len(encryptPasswords) == 0 { - return nil, nil, nil, errors.New("did not get any grantee public keys or any encryption passwords") - } - - publisherPub := hex.EncodeToString(crypto.CompressPubkey(&privateKey.PublicKey)) - grantees = append(grantees, publisherPub) - - accessKey = make([]byte, 32) - if _, err := io.ReadFull(rand.Reader, salt); err != nil { - panic("reading from crypto/rand failed: " + err.Error()) - } - if _, err := io.ReadFull(rand.Reader, accessKey); err != nil { - panic("reading from crypto/rand failed: " + err.Error()) - } - - lookupPathEncryptedAccessKeyMap := make(map[string]string) - i := 0 - for _, v := range grantees { - i++ - if v == "" { - return nil, nil, nil, errors.New("need a grantee Public Key") - } - b, err := hex.DecodeString(v) - if err != nil { - log.Error("error decoding grantee public key", "err", err) - return nil, nil, nil, err - } - - granteePub, err := crypto.DecompressPubkey(b) - if err != nil { - log.Error("error decompressing grantee public key", "err", err) - return nil, nil, nil, err - } - sessionKey, err := NewSessionKeyPK(privateKey, granteePub, salt) - if err != nil { - return nil, nil, nil, err - } - - hasher := sha3.NewLegacyKeccak256() - hasher.Write(append(sessionKey, 0)) - lookupKey := hasher.Sum(nil) - - hasher.Reset() - hasher.Write(append(sessionKey, 1)) - - accessKeyEncryptionKey := hasher.Sum(nil) - - enc := NewRefEncryption(len(accessKey)) - encryptedAccessKey, err := enc.Encrypt(accessKey, accessKeyEncryptionKey) - if err != nil { - return nil, nil, nil, err - } - lookupPathEncryptedAccessKeyMap[hex.EncodeToString(lookupKey)] = hex.EncodeToString(encryptedAccessKey) - } - - for _, pass := range encryptPasswords { - sessionKey, err := sessionKeyPassword(pass, salt, DefaultKdfParams) - if err != nil { - return nil, nil, nil, err - } - hasher := sha3.NewLegacyKeccak256() - hasher.Write(append(sessionKey, 0)) - lookupKey := hasher.Sum(nil) - - hasher.Reset() - hasher.Write(append(sessionKey, 1)) - - accessKeyEncryptionKey := hasher.Sum(nil) - - enc := NewRefEncryption(len(accessKey)) - encryptedAccessKey, err := enc.Encrypt(accessKey, accessKeyEncryptionKey) - if err != nil { - return nil, nil, nil, err - } - lookupPathEncryptedAccessKeyMap[hex.EncodeToString(lookupKey)] = hex.EncodeToString(encryptedAccessKey) - } - - m := &Manifest{ - Entries: []ManifestEntry{}, - } - - for k, v := range lookupPathEncryptedAccessKeyMap { - m.Entries = append(m.Entries, ManifestEntry{ - Path: k, - Hash: v, - ContentType: "text/plain", - }) - } - - ae, err = NewAccessEntryACT(hex.EncodeToString(crypto.CompressPubkey(&privateKey.PublicKey)), salt, "") - if err != nil { - return nil, nil, nil, err - } - - return accessKey, ae, m, nil -} - -// DoPassword is a helper function to the CLI API that handles the entire business logic for -// creating a session key and an access entry given the cli context, password and salt. -// By default - DefaultKdfParams are used as the scrypt params -func DoPassword(ctx *cli.Context, password string, salt []byte) (sessionKey []byte, ae *AccessEntry, err error) { - ae, err = NewAccessEntryPassword(salt, DefaultKdfParams) - if err != nil { - return nil, nil, err - } - - sessionKey, err = NewSessionKeyPassword(password, ae) - if err != nil { - return nil, nil, err - } - return sessionKey, ae, nil -} diff --git a/swarm/api/api.go b/swarm/api/api.go deleted file mode 100644 index f0a54f17a5b6..000000000000 --- a/swarm/api/api.go +++ /dev/null @@ -1,1017 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -//go:generate mimegen --types=./../../cmd/swarm/mimegen/mime.types --package=api --out=gen_mime.go -//go:generate gofmt -s -w gen_mime.go - -import ( - "archive/tar" - "context" - "crypto/ecdsa" - "encoding/hex" - "errors" - "fmt" - "io" - "math/big" - "net/http" - "path" - "strings" - - "bytes" - "mime" - "path/filepath" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/contracts/ens" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/spancontext" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/storage/feed" - "github.com/nebulaai/nbai-node/swarm/storage/feed/lookup" - - opentracing "github.com/opentracing/opentracing-go" -) - -var ( - apiResolveCount = metrics.NewRegisteredCounter("api.resolve.count", nil) - apiResolveFail = metrics.NewRegisteredCounter("api.resolve.fail", nil) - apiPutCount = metrics.NewRegisteredCounter("api.put.count", nil) - apiPutFail = metrics.NewRegisteredCounter("api.put.fail", nil) - apiGetCount = metrics.NewRegisteredCounter("api.get.count", nil) - apiGetNotFound = metrics.NewRegisteredCounter("api.get.notfound", nil) - apiGetHTTP300 = metrics.NewRegisteredCounter("api.get.http.300", nil) - apiManifestUpdateCount = metrics.NewRegisteredCounter("api.manifestupdate.count", nil) - apiManifestUpdateFail = metrics.NewRegisteredCounter("api.manifestupdate.fail", nil) - apiManifestListCount = metrics.NewRegisteredCounter("api.manifestlist.count", nil) - apiManifestListFail = metrics.NewRegisteredCounter("api.manifestlist.fail", nil) - apiDeleteCount = metrics.NewRegisteredCounter("api.delete.count", nil) - apiDeleteFail = metrics.NewRegisteredCounter("api.delete.fail", nil) - apiGetTarCount = metrics.NewRegisteredCounter("api.gettar.count", nil) - apiGetTarFail = metrics.NewRegisteredCounter("api.gettar.fail", nil) - apiUploadTarCount = metrics.NewRegisteredCounter("api.uploadtar.count", nil) - apiUploadTarFail = metrics.NewRegisteredCounter("api.uploadtar.fail", nil) - apiModifyCount = metrics.NewRegisteredCounter("api.modify.count", nil) - apiModifyFail = metrics.NewRegisteredCounter("api.modify.fail", nil) - apiAddFileCount = metrics.NewRegisteredCounter("api.addfile.count", nil) - apiAddFileFail = metrics.NewRegisteredCounter("api.addfile.fail", nil) - apiRmFileCount = metrics.NewRegisteredCounter("api.removefile.count", nil) - apiRmFileFail = metrics.NewRegisteredCounter("api.removefile.fail", nil) - apiAppendFileCount = metrics.NewRegisteredCounter("api.appendfile.count", nil) - apiAppendFileFail = metrics.NewRegisteredCounter("api.appendfile.fail", nil) - apiGetInvalid = metrics.NewRegisteredCounter("api.get.invalid", nil) -) - -// Resolver interface resolve a domain name to a hash using ENS -type Resolver interface { - Resolve(string) (common.Hash, error) -} - -// ResolveValidator is used to validate the contained Resolver -type ResolveValidator interface { - Resolver - Owner(node [32]byte) (common.Address, error) - HeaderByNumber(context.Context, *big.Int) (*types.Header, error) -} - -// NoResolverError is returned by MultiResolver.Resolve if no resolver -// can be found for the address. -type NoResolverError struct { - TLD string -} - -// NewNoResolverError creates a NoResolverError for the given top level domain -func NewNoResolverError(tld string) *NoResolverError { - return &NoResolverError{TLD: tld} -} - -// Error NoResolverError implements error -func (e *NoResolverError) Error() string { - if e.TLD == "" { - return "no ENS resolver" - } - return fmt.Sprintf("no ENS endpoint configured to resolve .%s TLD names", e.TLD) -} - -// MultiResolver is used to resolve URL addresses based on their TLDs. -// Each TLD can have multiple resolvers, and the resolution from the -// first one in the sequence will be returned. -type MultiResolver struct { - resolvers map[string][]ResolveValidator - nameHash func(string) common.Hash -} - -// MultiResolverOption sets options for MultiResolver and is used as -// arguments for its constructor. -type MultiResolverOption func(*MultiResolver) - -// MultiResolverOptionWithResolver adds a Resolver to a list of resolvers -// for a specific TLD. If TLD is an empty string, the resolver will be added -// to the list of default resolver, the ones that will be used for resolution -// of addresses which do not have their TLD resolver specified. -func MultiResolverOptionWithResolver(r ResolveValidator, tld string) MultiResolverOption { - return func(m *MultiResolver) { - m.resolvers[tld] = append(m.resolvers[tld], r) - } -} - -// NewMultiResolver creates a new instance of MultiResolver. -func NewMultiResolver(opts ...MultiResolverOption) (m *MultiResolver) { - m = &MultiResolver{ - resolvers: make(map[string][]ResolveValidator), - nameHash: ens.EnsNode, - } - for _, o := range opts { - o(m) - } - return m -} - -// Resolve resolves address by choosing a Resolver by TLD. -// If there are more default Resolvers, or for a specific TLD, -// the Hash from the first one which does not return error -// will be returned. -func (m *MultiResolver) Resolve(addr string) (h common.Hash, err error) { - rs, err := m.getResolveValidator(addr) - if err != nil { - return h, err - } - for _, r := range rs { - h, err = r.Resolve(addr) - if err == nil { - return - } - } - return -} - -// getResolveValidator uses the hostname to retrieve the resolver associated with the top level domain -func (m *MultiResolver) getResolveValidator(name string) ([]ResolveValidator, error) { - rs := m.resolvers[""] - tld := path.Ext(name) - if tld != "" { - tld = tld[1:] - rstld, ok := m.resolvers[tld] - if ok { - return rstld, nil - } - } - if len(rs) == 0 { - return rs, NewNoResolverError(tld) - } - return rs, nil -} - -/* -API implements webserver/file system related content storage and retrieval -on top of the FileStore -it is the public interface of the FileStore which is included in the ethereum stack -*/ -type API struct { - feed *feed.Handler - fileStore *storage.FileStore - dns Resolver - Decryptor func(context.Context, string) DecryptFunc -} - -// NewAPI the api constructor initialises a new API instance. -func NewAPI(fileStore *storage.FileStore, dns Resolver, feedHandler *feed.Handler, pk *ecdsa.PrivateKey) (self *API) { - self = &API{ - fileStore: fileStore, - dns: dns, - feed: feedHandler, - Decryptor: func(ctx context.Context, credentials string) DecryptFunc { - return self.doDecrypt(ctx, credentials, pk) - }, - } - return -} - -// Retrieve FileStore reader API -func (a *API) Retrieve(ctx context.Context, addr storage.Address) (reader storage.LazySectionReader, isEncrypted bool) { - return a.fileStore.Retrieve(ctx, addr) -} - -// Store wraps the Store API call of the embedded FileStore -func (a *API) Store(ctx context.Context, data io.Reader, size int64, toEncrypt bool) (addr storage.Address, wait func(ctx context.Context) error, err error) { - log.Debug("api.store", "size", size) - return a.fileStore.Store(ctx, data, size, toEncrypt) -} - -// Resolve a name into a content-addressed hash -// where address could be an ENS name, or a content addressed hash -func (a *API) Resolve(ctx context.Context, address string) (storage.Address, error) { - // if DNS is not configured, return an error - if a.dns == nil { - if hashMatcher.MatchString(address) { - return common.Hex2Bytes(address), nil - } - apiResolveFail.Inc(1) - return nil, fmt.Errorf("no DNS to resolve name: %q", address) - } - // try and resolve the address - resolved, err := a.dns.Resolve(address) - if err != nil { - if hashMatcher.MatchString(address) { - return common.Hex2Bytes(address), nil - } - return nil, err - } - return resolved[:], nil -} - -// Resolve resolves a URI to an Address using the MultiResolver. -func (a *API) ResolveURI(ctx context.Context, uri *URI, credentials string) (storage.Address, error) { - apiResolveCount.Inc(1) - log.Trace("resolving", "uri", uri.Addr) - - var sp opentracing.Span - ctx, sp = spancontext.StartSpan( - ctx, - "api.resolve") - defer sp.Finish() - - // if the URI is immutable, check if the address looks like a hash - if uri.Immutable() { - key := uri.Address() - if key == nil { - return nil, fmt.Errorf("immutable address not a content hash: %q", uri.Addr) - } - return key, nil - } - - addr, err := a.Resolve(ctx, uri.Addr) - if err != nil { - return nil, err - } - - if uri.Path == "" { - return addr, nil - } - walker, err := a.NewManifestWalker(ctx, addr, a.Decryptor(ctx, credentials), nil) - if err != nil { - return nil, err - } - var entry *ManifestEntry - walker.Walk(func(e *ManifestEntry) error { - // if the entry matches the path, set entry and stop - // the walk - if e.Path == uri.Path { - entry = e - // return an error to cancel the walk - return errors.New("found") - } - // ignore non-manifest files - if e.ContentType != ManifestType { - return nil - } - // if the manifest's path is a prefix of the - // requested path, recurse into it by returning - // nil and continuing the walk - if strings.HasPrefix(uri.Path, e.Path) { - return nil - } - return ErrSkipManifest - }) - if entry == nil { - return nil, errors.New("not found") - } - addr = storage.Address(common.Hex2Bytes(entry.Hash)) - return addr, nil -} - -// Put provides singleton manifest creation on top of FileStore store -func (a *API) Put(ctx context.Context, content string, contentType string, toEncrypt bool) (k storage.Address, wait func(context.Context) error, err error) { - apiPutCount.Inc(1) - r := strings.NewReader(content) - key, waitContent, err := a.fileStore.Store(ctx, r, int64(len(content)), toEncrypt) - if err != nil { - apiPutFail.Inc(1) - return nil, nil, err - } - manifest := fmt.Sprintf(`{"entries":[{"hash":"%v","contentType":"%s"}]}`, key, contentType) - r = strings.NewReader(manifest) - key, waitManifest, err := a.fileStore.Store(ctx, r, int64(len(manifest)), toEncrypt) - if err != nil { - apiPutFail.Inc(1) - return nil, nil, err - } - return key, func(ctx context.Context) error { - err := waitContent(ctx) - if err != nil { - return err - } - return waitManifest(ctx) - }, nil -} - -// Get uses iterative manifest retrieval and prefix matching -// to resolve basePath to content using FileStore retrieve -// it returns a section reader, mimeType, status, the key of the actual content and an error -func (a *API) Get(ctx context.Context, decrypt DecryptFunc, manifestAddr storage.Address, path string) (reader storage.LazySectionReader, mimeType string, status int, contentAddr storage.Address, err error) { - log.Debug("api.get", "key", manifestAddr, "path", path) - apiGetCount.Inc(1) - trie, err := loadManifest(ctx, a.fileStore, manifestAddr, nil, decrypt) - if err != nil { - apiGetNotFound.Inc(1) - status = http.StatusNotFound - return nil, "", http.StatusNotFound, nil, err - } - - log.Debug("trie getting entry", "key", manifestAddr, "path", path) - entry, _ := trie.getEntry(path) - - if entry != nil { - log.Debug("trie got entry", "key", manifestAddr, "path", path, "entry.Hash", entry.Hash) - - if entry.ContentType == ManifestType { - log.Debug("entry is manifest", "key", manifestAddr, "new key", entry.Hash) - adr, err := hex.DecodeString(entry.Hash) - if err != nil { - return nil, "", 0, nil, err - } - return a.Get(ctx, decrypt, adr, entry.Path) - } - - // we need to do some extra work if this is a Swarm feed manifest - if entry.ContentType == FeedContentType { - if entry.Feed == nil { - return reader, mimeType, status, nil, fmt.Errorf("Cannot decode Feed in manifest") - } - _, err := a.feed.Lookup(ctx, feed.NewQueryLatest(entry.Feed, lookup.NoClue)) - if err != nil { - apiGetNotFound.Inc(1) - status = http.StatusNotFound - log.Debug(fmt.Sprintf("get feed update content error: %v", err)) - return reader, mimeType, status, nil, err - } - // get the data of the update - _, contentAddr, err := a.feed.GetContent(entry.Feed) - if err != nil { - apiGetNotFound.Inc(1) - status = http.StatusNotFound - log.Warn(fmt.Sprintf("get feed update content error: %v", err)) - return reader, mimeType, status, nil, err - } - - // extract content hash - if len(contentAddr) != storage.AddressLength { - apiGetInvalid.Inc(1) - status = http.StatusUnprocessableEntity - errorMessage := fmt.Sprintf("invalid swarm hash in feed update. Expected %d bytes. Got %d", storage.AddressLength, len(contentAddr)) - log.Warn(errorMessage) - return reader, mimeType, status, nil, errors.New(errorMessage) - } - manifestAddr = storage.Address(contentAddr) - log.Trace("feed update contains swarm hash", "key", manifestAddr) - - // get the manifest the swarm hash points to - trie, err := loadManifest(ctx, a.fileStore, manifestAddr, nil, NOOPDecrypt) - if err != nil { - apiGetNotFound.Inc(1) - status = http.StatusNotFound - log.Warn(fmt.Sprintf("loadManifestTrie (feed update) error: %v", err)) - return reader, mimeType, status, nil, err - } - - // finally, get the manifest entry - // it will always be the entry on path "" - entry, _ = trie.getEntry(path) - if entry == nil { - status = http.StatusNotFound - apiGetNotFound.Inc(1) - err = fmt.Errorf("manifest (feed update) entry for '%s' not found", path) - log.Trace("manifest (feed update) entry not found", "key", manifestAddr, "path", path) - return reader, mimeType, status, nil, err - } - } - - // regardless of feed update manifests or normal manifests we will converge at this point - // get the key the manifest entry points to and serve it if it's unambiguous - contentAddr = common.Hex2Bytes(entry.Hash) - status = entry.Status - if status == http.StatusMultipleChoices { - apiGetHTTP300.Inc(1) - return nil, entry.ContentType, status, contentAddr, err - } - mimeType = entry.ContentType - log.Debug("content lookup key", "key", contentAddr, "mimetype", mimeType) - reader, _ = a.fileStore.Retrieve(ctx, contentAddr) - } else { - // no entry found - status = http.StatusNotFound - apiGetNotFound.Inc(1) - err = fmt.Errorf("Not found: could not find resource '%s'", path) - log.Trace("manifest entry not found", "key", contentAddr, "path", path) - } - return -} - -func (a *API) Delete(ctx context.Context, addr string, path string) (storage.Address, error) { - apiDeleteCount.Inc(1) - uri, err := Parse("bzz:/" + addr) - if err != nil { - apiDeleteFail.Inc(1) - return nil, err - } - key, err := a.ResolveURI(ctx, uri, EMPTY_CREDENTIALS) - - if err != nil { - return nil, err - } - newKey, err := a.UpdateManifest(ctx, key, func(mw *ManifestWriter) error { - log.Debug(fmt.Sprintf("removing %s from manifest %s", path, key.Log())) - return mw.RemoveEntry(path) - }) - if err != nil { - apiDeleteFail.Inc(1) - return nil, err - } - - return newKey, nil -} - -// GetDirectoryTar fetches a requested directory as a tarstream -// it returns an io.Reader and an error. Do not forget to Close() the returned ReadCloser -func (a *API) GetDirectoryTar(ctx context.Context, decrypt DecryptFunc, uri *URI) (io.ReadCloser, error) { - apiGetTarCount.Inc(1) - addr, err := a.Resolve(ctx, uri.Addr) - if err != nil { - return nil, err - } - walker, err := a.NewManifestWalker(ctx, addr, decrypt, nil) - if err != nil { - apiGetTarFail.Inc(1) - return nil, err - } - - piper, pipew := io.Pipe() - - tw := tar.NewWriter(pipew) - - go func() { - err := walker.Walk(func(entry *ManifestEntry) error { - // ignore manifests (walk will recurse into them) - if entry.ContentType == ManifestType { - return nil - } - - // retrieve the entry's key and size - reader, _ := a.Retrieve(ctx, storage.Address(common.Hex2Bytes(entry.Hash))) - size, err := reader.Size(ctx, nil) - if err != nil { - return err - } - - // write a tar header for the entry - hdr := &tar.Header{ - Name: entry.Path, - Mode: entry.Mode, - Size: size, - ModTime: entry.ModTime, - Xattrs: map[string]string{ - "user.swarm.content-type": entry.ContentType, - }, - } - - if err := tw.WriteHeader(hdr); err != nil { - return err - } - - // copy the file into the tar stream - n, err := io.Copy(tw, io.LimitReader(reader, hdr.Size)) - if err != nil { - return err - } else if n != size { - return fmt.Errorf("error writing %s: expected %d bytes but sent %d", entry.Path, size, n) - } - - return nil - }) - // close tar writer before closing pipew - // to flush remaining data to pipew - // regardless of error value - tw.Close() - if err != nil { - apiGetTarFail.Inc(1) - pipew.CloseWithError(err) - } else { - pipew.Close() - } - }() - - return piper, nil -} - -// GetManifestList lists the manifest entries for the specified address and prefix -// and returns it as a ManifestList -func (a *API) GetManifestList(ctx context.Context, decryptor DecryptFunc, addr storage.Address, prefix string) (list ManifestList, err error) { - apiManifestListCount.Inc(1) - walker, err := a.NewManifestWalker(ctx, addr, decryptor, nil) - if err != nil { - apiManifestListFail.Inc(1) - return ManifestList{}, err - } - - err = walker.Walk(func(entry *ManifestEntry) error { - // handle non-manifest files - if entry.ContentType != ManifestType { - // ignore the file if it doesn't have the specified prefix - if !strings.HasPrefix(entry.Path, prefix) { - return nil - } - - // if the path after the prefix contains a slash, add a - // common prefix to the list, otherwise add the entry - suffix := strings.TrimPrefix(entry.Path, prefix) - if index := strings.Index(suffix, "/"); index > -1 { - list.CommonPrefixes = append(list.CommonPrefixes, prefix+suffix[:index+1]) - return nil - } - if entry.Path == "" { - entry.Path = "/" - } - list.Entries = append(list.Entries, entry) - return nil - } - - // if the manifest's path is a prefix of the specified prefix - // then just recurse into the manifest by returning nil and - // continuing the walk - if strings.HasPrefix(prefix, entry.Path) { - return nil - } - - // if the manifest's path has the specified prefix, then if the - // path after the prefix contains a slash, add a common prefix - // to the list and skip the manifest, otherwise recurse into - // the manifest by returning nil and continuing the walk - if strings.HasPrefix(entry.Path, prefix) { - suffix := strings.TrimPrefix(entry.Path, prefix) - if index := strings.Index(suffix, "/"); index > -1 { - list.CommonPrefixes = append(list.CommonPrefixes, prefix+suffix[:index+1]) - return ErrSkipManifest - } - return nil - } - - // the manifest neither has the prefix or needs recursing in to - // so just skip it - return ErrSkipManifest - }) - - if err != nil { - apiManifestListFail.Inc(1) - return ManifestList{}, err - } - - return list, nil -} - -func (a *API) UpdateManifest(ctx context.Context, addr storage.Address, update func(mw *ManifestWriter) error) (storage.Address, error) { - apiManifestUpdateCount.Inc(1) - mw, err := a.NewManifestWriter(ctx, addr, nil) - if err != nil { - apiManifestUpdateFail.Inc(1) - return nil, err - } - - if err := update(mw); err != nil { - apiManifestUpdateFail.Inc(1) - return nil, err - } - - addr, err = mw.Store() - if err != nil { - apiManifestUpdateFail.Inc(1) - return nil, err - } - log.Debug(fmt.Sprintf("generated manifest %s", addr)) - return addr, nil -} - -// Modify loads manifest and checks the content hash before recalculating and storing the manifest. -func (a *API) Modify(ctx context.Context, addr storage.Address, path, contentHash, contentType string) (storage.Address, error) { - apiModifyCount.Inc(1) - quitC := make(chan bool) - trie, err := loadManifest(ctx, a.fileStore, addr, quitC, NOOPDecrypt) - if err != nil { - apiModifyFail.Inc(1) - return nil, err - } - if contentHash != "" { - entry := newManifestTrieEntry(&ManifestEntry{ - Path: path, - ContentType: contentType, - }, nil) - entry.Hash = contentHash - trie.addEntry(entry, quitC) - } else { - trie.deleteEntry(path, quitC) - } - - if err := trie.recalcAndStore(); err != nil { - apiModifyFail.Inc(1) - return nil, err - } - return trie.ref, nil -} - -// AddFile creates a new manifest entry, adds it to swarm, then adds a file to swarm. -func (a *API) AddFile(ctx context.Context, mhash, path, fname string, content []byte, nameresolver bool) (storage.Address, string, error) { - apiAddFileCount.Inc(1) - - uri, err := Parse("bzz:/" + mhash) - if err != nil { - apiAddFileFail.Inc(1) - return nil, "", err - } - mkey, err := a.ResolveURI(ctx, uri, EMPTY_CREDENTIALS) - if err != nil { - apiAddFileFail.Inc(1) - return nil, "", err - } - - // trim the root dir we added - if path[:1] == "/" { - path = path[1:] - } - - entry := &ManifestEntry{ - Path: filepath.Join(path, fname), - ContentType: mime.TypeByExtension(filepath.Ext(fname)), - Mode: 0700, - Size: int64(len(content)), - ModTime: time.Now(), - } - - mw, err := a.NewManifestWriter(ctx, mkey, nil) - if err != nil { - apiAddFileFail.Inc(1) - return nil, "", err - } - - fkey, err := mw.AddEntry(ctx, bytes.NewReader(content), entry) - if err != nil { - apiAddFileFail.Inc(1) - return nil, "", err - } - - newMkey, err := mw.Store() - if err != nil { - apiAddFileFail.Inc(1) - return nil, "", err - - } - - return fkey, newMkey.String(), nil -} - -func (a *API) UploadTar(ctx context.Context, bodyReader io.ReadCloser, manifestPath, defaultPath string, mw *ManifestWriter) (storage.Address, error) { - apiUploadTarCount.Inc(1) - var contentKey storage.Address - tr := tar.NewReader(bodyReader) - defer bodyReader.Close() - var defaultPathFound bool - for { - hdr, err := tr.Next() - if err == io.EOF { - break - } else if err != nil { - apiUploadTarFail.Inc(1) - return nil, fmt.Errorf("error reading tar stream: %s", err) - } - - // only store regular files - if !hdr.FileInfo().Mode().IsRegular() { - continue - } - - // add the entry under the path from the request - manifestPath := path.Join(manifestPath, hdr.Name) - contentType := hdr.Xattrs["user.swarm.content-type"] - if contentType == "" { - contentType = mime.TypeByExtension(filepath.Ext(hdr.Name)) - } - //DetectContentType("") - entry := &ManifestEntry{ - Path: manifestPath, - ContentType: contentType, - Mode: hdr.Mode, - Size: hdr.Size, - ModTime: hdr.ModTime, - } - contentKey, err = mw.AddEntry(ctx, tr, entry) - if err != nil { - apiUploadTarFail.Inc(1) - return nil, fmt.Errorf("error adding manifest entry from tar stream: %s", err) - } - if hdr.Name == defaultPath { - contentType := hdr.Xattrs["user.swarm.content-type"] - if contentType == "" { - contentType = mime.TypeByExtension(filepath.Ext(hdr.Name)) - } - - entry := &ManifestEntry{ - Hash: contentKey.Hex(), - Path: "", // default entry - ContentType: contentType, - Mode: hdr.Mode, - Size: hdr.Size, - ModTime: hdr.ModTime, - } - contentKey, err = mw.AddEntry(ctx, nil, entry) - if err != nil { - apiUploadTarFail.Inc(1) - return nil, fmt.Errorf("error adding default manifest entry from tar stream: %s", err) - } - defaultPathFound = true - } - } - if defaultPath != "" && !defaultPathFound { - return contentKey, fmt.Errorf("default path %q not found", defaultPath) - } - return contentKey, nil -} - -// RemoveFile removes a file entry in a manifest. -func (a *API) RemoveFile(ctx context.Context, mhash string, path string, fname string, nameresolver bool) (string, error) { - apiRmFileCount.Inc(1) - - uri, err := Parse("bzz:/" + mhash) - if err != nil { - apiRmFileFail.Inc(1) - return "", err - } - mkey, err := a.ResolveURI(ctx, uri, EMPTY_CREDENTIALS) - if err != nil { - apiRmFileFail.Inc(1) - return "", err - } - - // trim the root dir we added - if path[:1] == "/" { - path = path[1:] - } - - mw, err := a.NewManifestWriter(ctx, mkey, nil) - if err != nil { - apiRmFileFail.Inc(1) - return "", err - } - - err = mw.RemoveEntry(filepath.Join(path, fname)) - if err != nil { - apiRmFileFail.Inc(1) - return "", err - } - - newMkey, err := mw.Store() - if err != nil { - apiRmFileFail.Inc(1) - return "", err - - } - - return newMkey.String(), nil -} - -// AppendFile removes old manifest, appends file entry to new manifest and adds it to Swarm. -func (a *API) AppendFile(ctx context.Context, mhash, path, fname string, existingSize int64, content []byte, oldAddr storage.Address, offset int64, addSize int64, nameresolver bool) (storage.Address, string, error) { - apiAppendFileCount.Inc(1) - - buffSize := offset + addSize - if buffSize < existingSize { - buffSize = existingSize - } - - buf := make([]byte, buffSize) - - oldReader, _ := a.Retrieve(ctx, oldAddr) - io.ReadAtLeast(oldReader, buf, int(offset)) - - newReader := bytes.NewReader(content) - io.ReadAtLeast(newReader, buf[offset:], int(addSize)) - - if buffSize < existingSize { - io.ReadAtLeast(oldReader, buf[addSize:], int(buffSize)) - } - - combinedReader := bytes.NewReader(buf) - totalSize := int64(len(buf)) - - // TODO(jmozah): to append using pyramid chunker when it is ready - //oldReader := a.Retrieve(oldKey) - //newReader := bytes.NewReader(content) - //combinedReader := io.MultiReader(oldReader, newReader) - - uri, err := Parse("bzz:/" + mhash) - if err != nil { - apiAppendFileFail.Inc(1) - return nil, "", err - } - mkey, err := a.ResolveURI(ctx, uri, EMPTY_CREDENTIALS) - if err != nil { - apiAppendFileFail.Inc(1) - return nil, "", err - } - - // trim the root dir we added - if path[:1] == "/" { - path = path[1:] - } - - mw, err := a.NewManifestWriter(ctx, mkey, nil) - if err != nil { - apiAppendFileFail.Inc(1) - return nil, "", err - } - - err = mw.RemoveEntry(filepath.Join(path, fname)) - if err != nil { - apiAppendFileFail.Inc(1) - return nil, "", err - } - - entry := &ManifestEntry{ - Path: filepath.Join(path, fname), - ContentType: mime.TypeByExtension(filepath.Ext(fname)), - Mode: 0700, - Size: totalSize, - ModTime: time.Now(), - } - - fkey, err := mw.AddEntry(ctx, io.Reader(combinedReader), entry) - if err != nil { - apiAppendFileFail.Inc(1) - return nil, "", err - } - - newMkey, err := mw.Store() - if err != nil { - apiAppendFileFail.Inc(1) - return nil, "", err - - } - - return fkey, newMkey.String(), nil -} - -// BuildDirectoryTree used by swarmfs_unix -func (a *API) BuildDirectoryTree(ctx context.Context, mhash string, nameresolver bool) (addr storage.Address, manifestEntryMap map[string]*manifestTrieEntry, err error) { - - uri, err := Parse("bzz:/" + mhash) - if err != nil { - return nil, nil, err - } - addr, err = a.Resolve(ctx, uri.Addr) - if err != nil { - return nil, nil, err - } - - quitC := make(chan bool) - rootTrie, err := loadManifest(ctx, a.fileStore, addr, quitC, NOOPDecrypt) - if err != nil { - return nil, nil, fmt.Errorf("can't load manifest %v: %v", addr.String(), err) - } - - manifestEntryMap = map[string]*manifestTrieEntry{} - err = rootTrie.listWithPrefix(uri.Path, quitC, func(entry *manifestTrieEntry, suffix string) { - manifestEntryMap[suffix] = entry - }) - - if err != nil { - return nil, nil, fmt.Errorf("list with prefix failed %v: %v", addr.String(), err) - } - return addr, manifestEntryMap, nil -} - -// FeedsLookup finds Swarm feeds updates at specific points in time, or the latest update -func (a *API) FeedsLookup(ctx context.Context, query *feed.Query) ([]byte, error) { - _, err := a.feed.Lookup(ctx, query) - if err != nil { - return nil, err - } - var data []byte - _, data, err = a.feed.GetContent(&query.Feed) - if err != nil { - return nil, err - } - return data, nil -} - -// FeedsNewRequest creates a Request object to update a specific feed -func (a *API) FeedsNewRequest(ctx context.Context, feed *feed.Feed) (*feed.Request, error) { - return a.feed.NewRequest(ctx, feed) -} - -// FeedsUpdate publishes a new update on the given feed -func (a *API) FeedsUpdate(ctx context.Context, request *feed.Request) (storage.Address, error) { - return a.feed.Update(ctx, request) -} - -// ErrCannotLoadFeedManifest is returned when looking up a feeds manifest fails -var ErrCannotLoadFeedManifest = errors.New("Cannot load feed manifest") - -// ErrNotAFeedManifest is returned when the address provided returned something other than a valid manifest -var ErrNotAFeedManifest = errors.New("Not a feed manifest") - -// ResolveFeedManifest retrieves the Swarm feed manifest for the given address, and returns the referenced Feed. -func (a *API) ResolveFeedManifest(ctx context.Context, addr storage.Address) (*feed.Feed, error) { - trie, err := loadManifest(ctx, a.fileStore, addr, nil, NOOPDecrypt) - if err != nil { - return nil, ErrCannotLoadFeedManifest - } - - entry, _ := trie.getEntry("") - if entry.ContentType != FeedContentType { - return nil, ErrNotAFeedManifest - } - - return entry.Feed, nil -} - -// ErrCannotResolveFeedURI is returned when the ENS resolver is not able to translate a name to a Swarm feed -var ErrCannotResolveFeedURI = errors.New("Cannot resolve Feed URI") - -// ErrCannotResolveFeed is returned when values provided are not enough or invalid to recreate a -// feed out of them. -var ErrCannotResolveFeed = errors.New("Cannot resolve Feed") - -// ResolveFeed attempts to extract feed information out of the manifest, if provided -// If not, it attempts to extract the feed out of a set of key-value pairs -func (a *API) ResolveFeed(ctx context.Context, uri *URI, values feed.Values) (*feed.Feed, error) { - var fd *feed.Feed - var err error - if uri.Addr != "" { - // resolve the content key. - manifestAddr := uri.Address() - if manifestAddr == nil { - manifestAddr, err = a.Resolve(ctx, uri.Addr) - if err != nil { - return nil, ErrCannotResolveFeedURI - } - } - - // get the Swarm feed from the manifest - fd, err = a.ResolveFeedManifest(ctx, manifestAddr) - if err != nil { - return nil, err - } - log.Debug("handle.get.feed: resolved", "manifestkey", manifestAddr, "feed", fd.Hex()) - } else { - var f feed.Feed - if err := f.FromValues(values); err != nil { - return nil, ErrCannotResolveFeed - - } - fd = &f - } - return fd, nil -} - -// MimeOctetStream default value of http Content-Type header -const MimeOctetStream = "application/octet-stream" - -// DetectContentType by file file extension, or fallback to content sniff -func DetectContentType(fileName string, f io.ReadSeeker) (string, error) { - ctype := mime.TypeByExtension(filepath.Ext(fileName)) - if ctype != "" { - return ctype, nil - } - - // save/rollback to get content probe from begin of file - currentPosition, err := f.Seek(0, io.SeekCurrent) - if err != nil { - return MimeOctetStream, fmt.Errorf("seeker can't seek, %s", err) - } - - // read a chunk to decide between utf-8 text and binary - var buf [512]byte - n, _ := f.Read(buf[:]) - ctype = http.DetectContentType(buf[:n]) - - _, err = f.Seek(currentPosition, io.SeekStart) // rewind to output whole file - if err != nil { - return MimeOctetStream, fmt.Errorf("seeker can't seek, %s", err) - } - - return ctype, nil -} diff --git a/swarm/api/api_test.go b/swarm/api/api_test.go deleted file mode 100644 index bf546acd1891..000000000000 --- a/swarm/api/api_test.go +++ /dev/null @@ -1,502 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "bytes" - "context" - "errors" - "flag" - "fmt" - "io" - "io/ioutil" - "math/big" - "os" - "testing" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/swarm/sctx" - "github.com/nebulaai/nbai-node/swarm/storage" -) - -func init() { - loglevel := flag.Int("loglevel", 2, "loglevel") - flag.Parse() - log.Root().SetHandler(log.CallerFileHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(os.Stderr, log.TerminalFormat(true))))) -} - -func testAPI(t *testing.T, f func(*API, bool)) { - datadir, err := ioutil.TempDir("", "bzz-test") - if err != nil { - t.Fatalf("unable to create temp dir: %v", err) - } - defer os.RemoveAll(datadir) - fileStore, err := storage.NewLocalFileStore(datadir, make([]byte, 32)) - if err != nil { - return - } - api := NewAPI(fileStore, nil, nil, nil) - f(api, false) - f(api, true) -} - -type testResponse struct { - reader storage.LazySectionReader - *Response -} - -func checkResponse(t *testing.T, resp *testResponse, exp *Response) { - - if resp.MimeType != exp.MimeType { - t.Errorf("incorrect mimeType. expected '%s', got '%s'", exp.MimeType, resp.MimeType) - } - if resp.Status != exp.Status { - t.Errorf("incorrect status. expected '%d', got '%d'", exp.Status, resp.Status) - } - if resp.Size != exp.Size { - t.Errorf("incorrect size. expected '%d', got '%d'", exp.Size, resp.Size) - } - if resp.reader != nil { - content := make([]byte, resp.Size) - read, _ := resp.reader.Read(content) - if int64(read) != exp.Size { - t.Errorf("incorrect content length. expected '%d...', got '%d...'", read, exp.Size) - } - resp.Content = string(content) - } - if resp.Content != exp.Content { - // if !bytes.Equal(resp.Content, exp.Content) - t.Errorf("incorrect content. expected '%s...', got '%s...'", string(exp.Content), string(resp.Content)) - } -} - -// func expResponse(content []byte, mimeType string, status int) *Response { -func expResponse(content string, mimeType string, status int) *Response { - log.Trace(fmt.Sprintf("expected content (%v): %v ", len(content), content)) - return &Response{mimeType, status, int64(len(content)), content} -} - -func testGet(t *testing.T, api *API, bzzhash, path string) *testResponse { - addr := storage.Address(common.Hex2Bytes(bzzhash)) - reader, mimeType, status, _, err := api.Get(context.TODO(), NOOPDecrypt, addr, path) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - quitC := make(chan bool) - size, err := reader.Size(context.TODO(), quitC) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - log.Trace(fmt.Sprintf("reader size: %v ", size)) - s := make([]byte, size) - _, err = reader.Read(s) - if err != io.EOF { - t.Fatalf("unexpected error: %v", err) - } - reader.Seek(0, 0) - return &testResponse{reader, &Response{mimeType, status, size, string(s)}} - // return &testResponse{reader, &Response{mimeType, status, reader.Size(), nil}} -} - -func TestApiPut(t *testing.T) { - testAPI(t, func(api *API, toEncrypt bool) { - content := "hello" - exp := expResponse(content, "text/plain", 0) - ctx := context.TODO() - addr, wait, err := api.Put(ctx, content, exp.MimeType, toEncrypt) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - err = wait(ctx) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - resp := testGet(t, api, addr.Hex(), "") - checkResponse(t, resp, exp) - }) -} - -// testResolver implements the Resolver interface and either returns the given -// hash if it is set, or returns a "name not found" error -type testResolveValidator struct { - hash *common.Hash -} - -func newTestResolveValidator(addr string) *testResolveValidator { - r := &testResolveValidator{} - if addr != "" { - hash := common.HexToHash(addr) - r.hash = &hash - } - return r -} - -func (t *testResolveValidator) Resolve(addr string) (common.Hash, error) { - if t.hash == nil { - return common.Hash{}, fmt.Errorf("DNS name not found: %q", addr) - } - return *t.hash, nil -} - -func (t *testResolveValidator) Owner(node [32]byte) (addr common.Address, err error) { - return -} -func (t *testResolveValidator) HeaderByNumber(context.Context, *big.Int) (header *types.Header, err error) { - return -} - -// TestAPIResolve tests resolving URIs which can either contain content hashes -// or ENS names -func TestAPIResolve(t *testing.T) { - ensAddr := "swarm.eth" - hashAddr := "1111111111111111111111111111111111111111111111111111111111111111" - resolvedAddr := "2222222222222222222222222222222222222222222222222222222222222222" - doesResolve := newTestResolveValidator(resolvedAddr) - doesntResolve := newTestResolveValidator("") - - type test struct { - desc string - dns Resolver - addr string - immutable bool - result string - expectErr error - } - - tests := []*test{ - { - desc: "DNS not configured, hash address, returns hash address", - dns: nil, - addr: hashAddr, - result: hashAddr, - }, - { - desc: "DNS not configured, ENS address, returns error", - dns: nil, - addr: ensAddr, - expectErr: errors.New(`no DNS to resolve name: "swarm.eth"`), - }, - { - desc: "DNS configured, hash address, hash resolves, returns resolved address", - dns: doesResolve, - addr: hashAddr, - result: resolvedAddr, - }, - { - desc: "DNS configured, immutable hash address, hash resolves, returns hash address", - dns: doesResolve, - addr: hashAddr, - immutable: true, - result: hashAddr, - }, - { - desc: "DNS configured, hash address, hash doesn't resolve, returns hash address", - dns: doesntResolve, - addr: hashAddr, - result: hashAddr, - }, - { - desc: "DNS configured, ENS address, name resolves, returns resolved address", - dns: doesResolve, - addr: ensAddr, - result: resolvedAddr, - }, - { - desc: "DNS configured, immutable ENS address, name resolves, returns error", - dns: doesResolve, - addr: ensAddr, - immutable: true, - expectErr: errors.New(`immutable address not a content hash: "swarm.eth"`), - }, - { - desc: "DNS configured, ENS address, name doesn't resolve, returns error", - dns: doesntResolve, - addr: ensAddr, - expectErr: errors.New(`DNS name not found: "swarm.eth"`), - }, - } - for _, x := range tests { - t.Run(x.desc, func(t *testing.T) { - api := &API{dns: x.dns} - uri := &URI{Addr: x.addr, Scheme: "bzz"} - if x.immutable { - uri.Scheme = "bzz-immutable" - } - res, err := api.ResolveURI(context.TODO(), uri, "") - if err == nil { - if x.expectErr != nil { - t.Fatalf("expected error %q, got result %q", x.expectErr, res) - } - if res.String() != x.result { - t.Fatalf("expected result %q, got %q", x.result, res) - } - } else { - if x.expectErr == nil { - t.Fatalf("expected no error, got %q", err) - } - if err.Error() != x.expectErr.Error() { - t.Fatalf("expected error %q, got %q", x.expectErr, err) - } - } - }) - } -} - -func TestMultiResolver(t *testing.T) { - doesntResolve := newTestResolveValidator("") - - ethAddr := "swarm.eth" - ethHash := "0x2222222222222222222222222222222222222222222222222222222222222222" - ethResolve := newTestResolveValidator(ethHash) - - testAddr := "swarm.test" - testHash := "0x1111111111111111111111111111111111111111111111111111111111111111" - testResolve := newTestResolveValidator(testHash) - - tests := []struct { - desc string - r Resolver - addr string - result string - err error - }{ - { - desc: "No resolvers, returns error", - r: NewMultiResolver(), - err: NewNoResolverError(""), - }, - { - desc: "One default resolver, returns resolved address", - r: NewMultiResolver(MultiResolverOptionWithResolver(ethResolve, "")), - addr: ethAddr, - result: ethHash, - }, - { - desc: "Two default resolvers, returns resolved address", - r: NewMultiResolver( - MultiResolverOptionWithResolver(ethResolve, ""), - MultiResolverOptionWithResolver(ethResolve, ""), - ), - addr: ethAddr, - result: ethHash, - }, - { - desc: "Two default resolvers, first doesn't resolve, returns resolved address", - r: NewMultiResolver( - MultiResolverOptionWithResolver(doesntResolve, ""), - MultiResolverOptionWithResolver(ethResolve, ""), - ), - addr: ethAddr, - result: ethHash, - }, - { - desc: "Default resolver doesn't resolve, tld resolver resolve, returns resolved address", - r: NewMultiResolver( - MultiResolverOptionWithResolver(doesntResolve, ""), - MultiResolverOptionWithResolver(ethResolve, "eth"), - ), - addr: ethAddr, - result: ethHash, - }, - { - desc: "Three TLD resolvers, third resolves, returns resolved address", - r: NewMultiResolver( - MultiResolverOptionWithResolver(doesntResolve, "eth"), - MultiResolverOptionWithResolver(doesntResolve, "eth"), - MultiResolverOptionWithResolver(ethResolve, "eth"), - ), - addr: ethAddr, - result: ethHash, - }, - { - desc: "One TLD resolver doesn't resolve, returns error", - r: NewMultiResolver( - MultiResolverOptionWithResolver(doesntResolve, ""), - MultiResolverOptionWithResolver(ethResolve, "eth"), - ), - addr: ethAddr, - result: ethHash, - }, - { - desc: "One defautl and one TLD resolver, all doesn't resolve, returns error", - r: NewMultiResolver( - MultiResolverOptionWithResolver(doesntResolve, ""), - MultiResolverOptionWithResolver(doesntResolve, "eth"), - ), - addr: ethAddr, - result: ethHash, - err: errors.New(`DNS name not found: "swarm.eth"`), - }, - { - desc: "Two TLD resolvers, both resolve, returns resolved address", - r: NewMultiResolver( - MultiResolverOptionWithResolver(ethResolve, "eth"), - MultiResolverOptionWithResolver(testResolve, "test"), - ), - addr: testAddr, - result: testHash, - }, - { - desc: "One TLD resolver, no default resolver, returns error for different TLD", - r: NewMultiResolver( - MultiResolverOptionWithResolver(ethResolve, "eth"), - ), - addr: testAddr, - err: NewNoResolverError("test"), - }, - } - for _, x := range tests { - t.Run(x.desc, func(t *testing.T) { - res, err := x.r.Resolve(x.addr) - if err == nil { - if x.err != nil { - t.Fatalf("expected error %q, got result %q", x.err, res.Hex()) - } - if res.Hex() != x.result { - t.Fatalf("expected result %q, got %q", x.result, res.Hex()) - } - } else { - if x.err == nil { - t.Fatalf("expected no error, got %q", err) - } - if err.Error() != x.err.Error() { - t.Fatalf("expected error %q, got %q", x.err, err) - } - } - }) - } -} - -func TestDecryptOriginForbidden(t *testing.T) { - ctx := context.TODO() - ctx = sctx.SetHost(ctx, "swarm-gateways.net") - - me := &ManifestEntry{ - Access: &AccessEntry{Type: AccessTypePass}, - } - - api := NewAPI(nil, nil, nil, nil) - - f := api.Decryptor(ctx, "") - err := f(me) - if err != ErrDecryptDomainForbidden { - t.Fatalf("should fail with ErrDecryptDomainForbidden, got %v", err) - } -} - -func TestDecryptOrigin(t *testing.T) { - for _, v := range []struct { - host string - expectError error - }{ - { - host: "localhost", - expectError: ErrDecrypt, - }, - { - host: "127.0.0.1", - expectError: ErrDecrypt, - }, - { - host: "swarm-gateways.net", - expectError: ErrDecryptDomainForbidden, - }, - } { - ctx := context.TODO() - ctx = sctx.SetHost(ctx, v.host) - - me := &ManifestEntry{ - Access: &AccessEntry{Type: AccessTypePass}, - } - - api := NewAPI(nil, nil, nil, nil) - - f := api.Decryptor(ctx, "") - err := f(me) - if err != v.expectError { - t.Fatalf("should fail with %v, got %v", v.expectError, err) - } - } -} - -func TestDetectContentType(t *testing.T) { - for _, tc := range []struct { - file string - content string - expectedContentType string - }{ - { - file: "file-with-correct-css.css", - content: "body {background-color: orange}", - expectedContentType: "text/css; charset=utf-8", - }, - { - file: "empty-file.css", - content: "", - expectedContentType: "text/css; charset=utf-8", - }, - { - file: "empty-file.pdf", - content: "", - expectedContentType: "application/pdf", - }, - { - file: "empty-file.md", - content: "", - expectedContentType: "text/markdown; charset=utf-8", - }, - { - file: "empty-file-with-unknown-content.strangeext", - content: "", - expectedContentType: "text/plain; charset=utf-8", - }, - { - file: "file-with-unknown-extension-and-content.strangeext", - content: "Lorem Ipsum", - expectedContentType: "text/plain; charset=utf-8", - }, - { - file: "file-no-extension", - content: "Lorem Ipsum", - expectedContentType: "text/plain; charset=utf-8", - }, - { - file: "file-no-extension-no-content", - content: "", - expectedContentType: "text/plain; charset=utf-8", - }, - { - file: "css-file-with-html-inside.css", - content: "", - expectedContentType: "text/css; charset=utf-8", - }, - } { - t.Run(tc.file, func(t *testing.T) { - detected, err := DetectContentType(tc.file, bytes.NewReader([]byte(tc.content))) - if err != nil { - t.Fatal(err) - } - - if detected != tc.expectedContentType { - t.Fatalf("File: %s, Expected mime type %s, got %s", tc.file, tc.expectedContentType, detected) - } - - }) - } -} diff --git a/swarm/api/client/client.go b/swarm/api/client/client.go deleted file mode 100644 index dac87758d81f..000000000000 --- a/swarm/api/client/client.go +++ /dev/null @@ -1,797 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package client - -import ( - "archive/tar" - "bytes" - "context" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "mime/multipart" - "net/http" - "net/http/httptrace" - "net/textproto" - "net/url" - "os" - "path/filepath" - "regexp" - "strconv" - "strings" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/swarm/api" - "github.com/nebulaai/nbai-node/swarm/spancontext" - "github.com/nebulaai/nbai-node/swarm/storage/feed" - "github.com/pborman/uuid" -) - -var ( - ErrUnauthorized = errors.New("unauthorized") -) - -func NewClient(gateway string) *Client { - return &Client{ - Gateway: gateway, - } -} - -// Client wraps interaction with a swarm HTTP gateway. -type Client struct { - Gateway string -} - -// UploadRaw uploads raw data to swarm and returns the resulting hash. If toEncrypt is true it -// uploads encrypted data -func (c *Client) UploadRaw(r io.Reader, size int64, toEncrypt bool) (string, error) { - if size <= 0 { - return "", errors.New("data size must be greater than zero") - } - addr := "" - if toEncrypt { - addr = "encrypt" - } - req, err := http.NewRequest("POST", c.Gateway+"/bzz-raw:/"+addr, r) - if err != nil { - return "", err - } - req.ContentLength = size - res, err := http.DefaultClient.Do(req) - if err != nil { - return "", err - } - defer res.Body.Close() - if res.StatusCode != http.StatusOK { - return "", fmt.Errorf("unexpected HTTP status: %s", res.Status) - } - data, err := ioutil.ReadAll(res.Body) - if err != nil { - return "", err - } - return string(data), nil -} - -// DownloadRaw downloads raw data from swarm and it returns a ReadCloser and a bool whether the -// content was encrypted -func (c *Client) DownloadRaw(hash string) (io.ReadCloser, bool, error) { - uri := c.Gateway + "/bzz-raw:/" + hash - res, err := http.DefaultClient.Get(uri) - if err != nil { - return nil, false, err - } - if res.StatusCode != http.StatusOK { - res.Body.Close() - return nil, false, fmt.Errorf("unexpected HTTP status: %s", res.Status) - } - isEncrypted := (res.Header.Get("X-Decrypted") == "true") - return res.Body, isEncrypted, nil -} - -// File represents a file in a swarm manifest and is used for uploading and -// downloading content to and from swarm -type File struct { - io.ReadCloser - api.ManifestEntry -} - -// Open opens a local file which can then be passed to client.Upload to upload -// it to swarm -func Open(path string) (*File, error) { - f, err := os.Open(path) - if err != nil { - return nil, err - } - stat, err := f.Stat() - if err != nil { - f.Close() - return nil, err - } - - contentType, err := api.DetectContentType(f.Name(), f) - if err != nil { - return nil, err - } - - return &File{ - ReadCloser: f, - ManifestEntry: api.ManifestEntry{ - ContentType: contentType, - Mode: int64(stat.Mode()), - Size: stat.Size(), - ModTime: stat.ModTime(), - }, - }, nil -} - -// Upload uploads a file to swarm and either adds it to an existing manifest -// (if the manifest argument is non-empty) or creates a new manifest containing -// the file, returning the resulting manifest hash (the file will then be -// available at bzz://) -func (c *Client) Upload(file *File, manifest string, toEncrypt bool) (string, error) { - if file.Size <= 0 { - return "", errors.New("file size must be greater than zero") - } - return c.TarUpload(manifest, &FileUploader{file}, "", toEncrypt) -} - -// Download downloads a file with the given path from the swarm manifest with -// the given hash (i.e. it gets bzz://) -func (c *Client) Download(hash, path string) (*File, error) { - uri := c.Gateway + "/bzz:/" + hash + "/" + path - res, err := http.DefaultClient.Get(uri) - if err != nil { - return nil, err - } - if res.StatusCode != http.StatusOK { - res.Body.Close() - return nil, fmt.Errorf("unexpected HTTP status: %s", res.Status) - } - return &File{ - ReadCloser: res.Body, - ManifestEntry: api.ManifestEntry{ - ContentType: res.Header.Get("Content-Type"), - Size: res.ContentLength, - }, - }, nil -} - -// UploadDirectory uploads a directory tree to swarm and either adds the files -// to an existing manifest (if the manifest argument is non-empty) or creates a -// new manifest, returning the resulting manifest hash (files from the -// directory will then be available at bzz://path/to/file), with -// the file specified in defaultPath being uploaded to the root of the manifest -// (i.e. bzz://) -func (c *Client) UploadDirectory(dir, defaultPath, manifest string, toEncrypt bool) (string, error) { - stat, err := os.Stat(dir) - if err != nil { - return "", err - } else if !stat.IsDir() { - return "", fmt.Errorf("not a directory: %s", dir) - } - if defaultPath != "" { - if _, err := os.Stat(filepath.Join(dir, defaultPath)); err != nil { - if os.IsNotExist(err) { - return "", fmt.Errorf("the default path %q was not found in the upload directory %q", defaultPath, dir) - } - return "", fmt.Errorf("default path: %v", err) - } - } - return c.TarUpload(manifest, &DirectoryUploader{dir}, defaultPath, toEncrypt) -} - -// DownloadDirectory downloads the files contained in a swarm manifest under -// the given path into a local directory (existing files will be overwritten) -func (c *Client) DownloadDirectory(hash, path, destDir, credentials string) error { - stat, err := os.Stat(destDir) - if err != nil { - return err - } else if !stat.IsDir() { - return fmt.Errorf("not a directory: %s", destDir) - } - - uri := c.Gateway + "/bzz:/" + hash + "/" + path - req, err := http.NewRequest("GET", uri, nil) - if err != nil { - return err - } - if credentials != "" { - req.SetBasicAuth("", credentials) - } - req.Header.Set("Accept", "application/x-tar") - res, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer res.Body.Close() - switch res.StatusCode { - case http.StatusOK: - case http.StatusUnauthorized: - return ErrUnauthorized - default: - return fmt.Errorf("unexpected HTTP status: %s", res.Status) - } - tr := tar.NewReader(res.Body) - for { - hdr, err := tr.Next() - if err == io.EOF { - return nil - } else if err != nil { - return err - } - // ignore the default path file - if hdr.Name == "" { - continue - } - - dstPath := filepath.Join(destDir, filepath.Clean(strings.TrimPrefix(hdr.Name, path))) - if err := os.MkdirAll(filepath.Dir(dstPath), 0755); err != nil { - return err - } - var mode os.FileMode = 0644 - if hdr.Mode > 0 { - mode = os.FileMode(hdr.Mode) - } - dst, err := os.OpenFile(dstPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, mode) - if err != nil { - return err - } - n, err := io.Copy(dst, tr) - dst.Close() - if err != nil { - return err - } else if n != hdr.Size { - return fmt.Errorf("expected %s to be %d bytes but got %d", hdr.Name, hdr.Size, n) - } - } -} - -// DownloadFile downloads a single file into the destination directory -// if the manifest entry does not specify a file name - it will fallback -// to the hash of the file as a filename -func (c *Client) DownloadFile(hash, path, dest, credentials string) error { - hasDestinationFilename := false - if stat, err := os.Stat(dest); err == nil { - hasDestinationFilename = !stat.IsDir() - } else { - if os.IsNotExist(err) { - // does not exist - should be created - hasDestinationFilename = true - } else { - return fmt.Errorf("could not stat path: %v", err) - } - } - - manifestList, err := c.List(hash, path, credentials) - if err != nil { - return err - } - - switch len(manifestList.Entries) { - case 0: - return fmt.Errorf("could not find path requested at manifest address. make sure the path you've specified is correct") - case 1: - //continue - default: - return fmt.Errorf("got too many matches for this path") - } - - uri := c.Gateway + "/bzz:/" + hash + "/" + path - req, err := http.NewRequest("GET", uri, nil) - if err != nil { - return err - } - if credentials != "" { - req.SetBasicAuth("", credentials) - } - res, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer res.Body.Close() - switch res.StatusCode { - case http.StatusOK: - case http.StatusUnauthorized: - return ErrUnauthorized - default: - return fmt.Errorf("unexpected HTTP status: expected 200 OK, got %d", res.StatusCode) - } - filename := "" - if hasDestinationFilename { - filename = dest - } else { - // try to assert - re := regexp.MustCompile("[^/]+$") //everything after last slash - - if results := re.FindAllString(path, -1); len(results) > 0 { - filename = results[len(results)-1] - } else { - if entry := manifestList.Entries[0]; entry.Path != "" && entry.Path != "/" { - filename = entry.Path - } else { - // assume hash as name if there's nothing from the command line - filename = hash - } - } - filename = filepath.Join(dest, filename) - } - filePath, err := filepath.Abs(filename) - if err != nil { - return err - } - - if err := os.MkdirAll(filepath.Dir(filePath), 0777); err != nil { - return err - } - - dst, err := os.Create(filename) - if err != nil { - return err - } - defer dst.Close() - - _, err = io.Copy(dst, res.Body) - return err -} - -// UploadManifest uploads the given manifest to swarm -func (c *Client) UploadManifest(m *api.Manifest, toEncrypt bool) (string, error) { - data, err := json.Marshal(m) - if err != nil { - return "", err - } - return c.UploadRaw(bytes.NewReader(data), int64(len(data)), toEncrypt) -} - -// DownloadManifest downloads a swarm manifest -func (c *Client) DownloadManifest(hash string) (*api.Manifest, bool, error) { - res, isEncrypted, err := c.DownloadRaw(hash) - if err != nil { - return nil, isEncrypted, err - } - defer res.Close() - var manifest api.Manifest - if err := json.NewDecoder(res).Decode(&manifest); err != nil { - return nil, isEncrypted, err - } - return &manifest, isEncrypted, nil -} - -// List list files in a swarm manifest which have the given prefix, grouping -// common prefixes using "/" as a delimiter. -// -// For example, if the manifest represents the following directory structure: -// -// file1.txt -// file2.txt -// dir1/file3.txt -// dir1/dir2/file4.txt -// -// Then: -// -// - a prefix of "" would return [dir1/, file1.txt, file2.txt] -// - a prefix of "file" would return [file1.txt, file2.txt] -// - a prefix of "dir1/" would return [dir1/dir2/, dir1/file3.txt] -// -// where entries ending with "/" are common prefixes. -func (c *Client) List(hash, prefix, credentials string) (*api.ManifestList, error) { - req, err := http.NewRequest(http.MethodGet, c.Gateway+"/bzz-list:/"+hash+"/"+prefix, nil) - if err != nil { - return nil, err - } - if credentials != "" { - req.SetBasicAuth("", credentials) - } - res, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer res.Body.Close() - switch res.StatusCode { - case http.StatusOK: - case http.StatusUnauthorized: - return nil, ErrUnauthorized - default: - return nil, fmt.Errorf("unexpected HTTP status: %s", res.Status) - } - var list api.ManifestList - if err := json.NewDecoder(res.Body).Decode(&list); err != nil { - return nil, err - } - return &list, nil -} - -// Uploader uploads files to swarm using a provided UploadFn -type Uploader interface { - Upload(UploadFn) error -} - -type UploaderFunc func(UploadFn) error - -func (u UploaderFunc) Upload(upload UploadFn) error { - return u(upload) -} - -// DirectoryUploader uploads all files in a directory, optionally uploading -// a file to the default path -type DirectoryUploader struct { - Dir string -} - -// Upload performs the upload of the directory and default path -func (d *DirectoryUploader) Upload(upload UploadFn) error { - return filepath.Walk(d.Dir, func(path string, f os.FileInfo, err error) error { - if err != nil { - return err - } - if f.IsDir() { - return nil - } - file, err := Open(path) - if err != nil { - return err - } - relPath, err := filepath.Rel(d.Dir, path) - if err != nil { - return err - } - file.Path = filepath.ToSlash(relPath) - return upload(file) - }) -} - -// FileUploader uploads a single file -type FileUploader struct { - File *File -} - -// Upload performs the upload of the file -func (f *FileUploader) Upload(upload UploadFn) error { - return upload(f.File) -} - -// UploadFn is the type of function passed to an Uploader to perform the upload -// of a single file (for example, a directory uploader would call a provided -// UploadFn for each file in the directory tree) -type UploadFn func(file *File) error - -// TarUpload uses the given Uploader to upload files to swarm as a tar stream, -// returning the resulting manifest hash -func (c *Client) TarUpload(hash string, uploader Uploader, defaultPath string, toEncrypt bool) (string, error) { - ctx, sp := spancontext.StartSpan(context.Background(), "api.client.tarupload") - defer sp.Finish() - - var tn time.Time - - reqR, reqW := io.Pipe() - defer reqR.Close() - addr := hash - - // If there is a hash already (a manifest), then that manifest will determine if the upload has - // to be encrypted or not. If there is no manifest then the toEncrypt parameter decides if - // there is encryption or not. - if hash == "" && toEncrypt { - // This is the built-in address for the encrypted upload endpoint - addr = "encrypt" - } - req, err := http.NewRequest("POST", c.Gateway+"/bzz:/"+addr, reqR) - if err != nil { - return "", err - } - - trace := GetClientTrace("swarm api client - upload tar", "api.client.uploadtar", uuid.New()[:8], &tn) - - req = req.WithContext(httptrace.WithClientTrace(ctx, trace)) - transport := http.DefaultTransport - - req.Header.Set("Content-Type", "application/x-tar") - if defaultPath != "" { - q := req.URL.Query() - q.Set("defaultpath", defaultPath) - req.URL.RawQuery = q.Encode() - } - - // use 'Expect: 100-continue' so we don't send the request body if - // the server refuses the request - req.Header.Set("Expect", "100-continue") - - tw := tar.NewWriter(reqW) - - // define an UploadFn which adds files to the tar stream - uploadFn := func(file *File) error { - hdr := &tar.Header{ - Name: file.Path, - Mode: file.Mode, - Size: file.Size, - ModTime: file.ModTime, - Xattrs: map[string]string{ - "user.swarm.content-type": file.ContentType, - }, - } - if err := tw.WriteHeader(hdr); err != nil { - return err - } - _, err = io.Copy(tw, file) - return err - } - - // run the upload in a goroutine so we can send the request headers and - // wait for a '100 Continue' response before sending the tar stream - go func() { - err := uploader.Upload(uploadFn) - if err == nil { - err = tw.Close() - } - reqW.CloseWithError(err) - }() - tn = time.Now() - res, err := transport.RoundTrip(req) - if err != nil { - return "", err - } - defer res.Body.Close() - if res.StatusCode != http.StatusOK { - return "", fmt.Errorf("unexpected HTTP status: %s", res.Status) - } - data, err := ioutil.ReadAll(res.Body) - if err != nil { - return "", err - } - return string(data), nil -} - -// MultipartUpload uses the given Uploader to upload files to swarm as a -// multipart form, returning the resulting manifest hash -func (c *Client) MultipartUpload(hash string, uploader Uploader) (string, error) { - reqR, reqW := io.Pipe() - defer reqR.Close() - req, err := http.NewRequest("POST", c.Gateway+"/bzz:/"+hash, reqR) - if err != nil { - return "", err - } - - // use 'Expect: 100-continue' so we don't send the request body if - // the server refuses the request - req.Header.Set("Expect", "100-continue") - - mw := multipart.NewWriter(reqW) - req.Header.Set("Content-Type", fmt.Sprintf("multipart/form-data; boundary=%q", mw.Boundary())) - - // define an UploadFn which adds files to the multipart form - uploadFn := func(file *File) error { - hdr := make(textproto.MIMEHeader) - hdr.Set("Content-Disposition", fmt.Sprintf("form-data; name=%q", file.Path)) - hdr.Set("Content-Type", file.ContentType) - hdr.Set("Content-Length", strconv.FormatInt(file.Size, 10)) - w, err := mw.CreatePart(hdr) - if err != nil { - return err - } - _, err = io.Copy(w, file) - return err - } - - // run the upload in a goroutine so we can send the request headers and - // wait for a '100 Continue' response before sending the multipart form - go func() { - err := uploader.Upload(uploadFn) - if err == nil { - err = mw.Close() - } - reqW.CloseWithError(err) - }() - - res, err := http.DefaultClient.Do(req) - if err != nil { - return "", err - } - defer res.Body.Close() - if res.StatusCode != http.StatusOK { - return "", fmt.Errorf("unexpected HTTP status: %s", res.Status) - } - data, err := ioutil.ReadAll(res.Body) - if err != nil { - return "", err - } - return string(data), nil -} - -// ErrNoFeedUpdatesFound is returned when Swarm cannot find updates of the given feed -var ErrNoFeedUpdatesFound = errors.New("No updates found for this feed") - -// CreateFeedWithManifest creates a feed manifest, initializing it with the provided -// data -// Returns the resulting feed manifest address that you can use to include in an ENS Resolver (setContent) -// or reference future updates (Client.UpdateFeed) -func (c *Client) CreateFeedWithManifest(request *feed.Request) (string, error) { - responseStream, err := c.updateFeed(request, true) - if err != nil { - return "", err - } - defer responseStream.Close() - - body, err := ioutil.ReadAll(responseStream) - if err != nil { - return "", err - } - - var manifestAddress string - if err = json.Unmarshal(body, &manifestAddress); err != nil { - return "", err - } - return manifestAddress, nil -} - -// UpdateFeed allows you to set a new version of your content -func (c *Client) UpdateFeed(request *feed.Request) error { - _, err := c.updateFeed(request, false) - return err -} - -func (c *Client) updateFeed(request *feed.Request, createManifest bool) (io.ReadCloser, error) { - URL, err := url.Parse(c.Gateway) - if err != nil { - return nil, err - } - URL.Path = "/bzz-feed:/" - values := URL.Query() - body := request.AppendValues(values) - if createManifest { - values.Set("manifest", "1") - } - URL.RawQuery = values.Encode() - - req, err := http.NewRequest("POST", URL.String(), bytes.NewBuffer(body)) - if err != nil { - return nil, err - } - - res, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - - return res.Body, nil -} - -// QueryFeed returns a byte stream with the raw content of the feed update -// manifestAddressOrDomain is the address you obtained in CreateFeedWithManifest or an ENS domain whose Resolver -// points to that address -func (c *Client) QueryFeed(query *feed.Query, manifestAddressOrDomain string) (io.ReadCloser, error) { - return c.queryFeed(query, manifestAddressOrDomain, false) -} - -// queryFeed returns a byte stream with the raw content of the feed update -// manifestAddressOrDomain is the address you obtained in CreateFeedWithManifest or an ENS domain whose Resolver -// points to that address -// meta set to true will instruct the node return feed metainformation instead -func (c *Client) queryFeed(query *feed.Query, manifestAddressOrDomain string, meta bool) (io.ReadCloser, error) { - URL, err := url.Parse(c.Gateway) - if err != nil { - return nil, err - } - URL.Path = "/bzz-feed:/" + manifestAddressOrDomain - values := URL.Query() - if query != nil { - query.AppendValues(values) //adds query parameters - } - if meta { - values.Set("meta", "1") - } - URL.RawQuery = values.Encode() - res, err := http.Get(URL.String()) - if err != nil { - return nil, err - } - - if res.StatusCode != http.StatusOK { - if res.StatusCode == http.StatusNotFound { - return nil, ErrNoFeedUpdatesFound - } - errorMessageBytes, err := ioutil.ReadAll(res.Body) - var errorMessage string - if err != nil { - errorMessage = "cannot retrieve error message: " + err.Error() - } else { - errorMessage = string(errorMessageBytes) - } - return nil, fmt.Errorf("Error retrieving feed updates: %s", errorMessage) - } - - return res.Body, nil -} - -// GetFeedRequest returns a structure that describes the referenced feed status -// manifestAddressOrDomain is the address you obtained in CreateFeedWithManifest or an ENS domain whose Resolver -// points to that address -func (c *Client) GetFeedRequest(query *feed.Query, manifestAddressOrDomain string) (*feed.Request, error) { - - responseStream, err := c.queryFeed(query, manifestAddressOrDomain, true) - if err != nil { - return nil, err - } - defer responseStream.Close() - - body, err := ioutil.ReadAll(responseStream) - if err != nil { - return nil, err - } - - var metadata feed.Request - if err := metadata.UnmarshalJSON(body); err != nil { - return nil, err - } - return &metadata, nil -} - -func GetClientTrace(traceMsg, metricPrefix, ruid string, tn *time.Time) *httptrace.ClientTrace { - trace := &httptrace.ClientTrace{ - GetConn: func(_ string) { - log.Trace(traceMsg+" - http get", "event", "GetConn", "ruid", ruid) - metrics.GetOrRegisterResettingTimer(metricPrefix+".getconn", nil).Update(time.Since(*tn)) - }, - GotConn: func(_ httptrace.GotConnInfo) { - log.Trace(traceMsg+" - http get", "event", "GotConn", "ruid", ruid) - metrics.GetOrRegisterResettingTimer(metricPrefix+".gotconn", nil).Update(time.Since(*tn)) - }, - PutIdleConn: func(err error) { - log.Trace(traceMsg+" - http get", "event", "PutIdleConn", "ruid", ruid, "err", err) - metrics.GetOrRegisterResettingTimer(metricPrefix+".putidle", nil).Update(time.Since(*tn)) - }, - GotFirstResponseByte: func() { - log.Trace(traceMsg+" - http get", "event", "GotFirstResponseByte", "ruid", ruid) - metrics.GetOrRegisterResettingTimer(metricPrefix+".firstbyte", nil).Update(time.Since(*tn)) - }, - Got100Continue: func() { - log.Trace(traceMsg, "event", "Got100Continue", "ruid", ruid) - metrics.GetOrRegisterResettingTimer(metricPrefix+".got100continue", nil).Update(time.Since(*tn)) - }, - DNSStart: func(_ httptrace.DNSStartInfo) { - log.Trace(traceMsg, "event", "DNSStart", "ruid", ruid) - metrics.GetOrRegisterResettingTimer(metricPrefix+".dnsstart", nil).Update(time.Since(*tn)) - }, - DNSDone: func(_ httptrace.DNSDoneInfo) { - log.Trace(traceMsg, "event", "DNSDone", "ruid", ruid) - metrics.GetOrRegisterResettingTimer(metricPrefix+".dnsdone", nil).Update(time.Since(*tn)) - }, - ConnectStart: func(network, addr string) { - log.Trace(traceMsg, "event", "ConnectStart", "ruid", ruid, "network", network, "addr", addr) - metrics.GetOrRegisterResettingTimer(metricPrefix+".connectstart", nil).Update(time.Since(*tn)) - }, - ConnectDone: func(network, addr string, err error) { - log.Trace(traceMsg, "event", "ConnectDone", "ruid", ruid, "network", network, "addr", addr, "err", err) - metrics.GetOrRegisterResettingTimer(metricPrefix+".connectdone", nil).Update(time.Since(*tn)) - }, - WroteHeaders: func() { - log.Trace(traceMsg, "event", "WroteHeaders(request)", "ruid", ruid) - metrics.GetOrRegisterResettingTimer(metricPrefix+".wroteheaders", nil).Update(time.Since(*tn)) - }, - Wait100Continue: func() { - log.Trace(traceMsg, "event", "Wait100Continue", "ruid", ruid) - metrics.GetOrRegisterResettingTimer(metricPrefix+".wait100continue", nil).Update(time.Since(*tn)) - }, - WroteRequest: func(_ httptrace.WroteRequestInfo) { - log.Trace(traceMsg, "event", "WroteRequest", "ruid", ruid) - metrics.GetOrRegisterResettingTimer(metricPrefix+".wroterequest", nil).Update(time.Since(*tn)) - }, - } - return trace -} diff --git a/swarm/api/client/client_test.go b/swarm/api/client/client_test.go deleted file mode 100644 index 6b732e407c3e..000000000000 --- a/swarm/api/client/client_test.go +++ /dev/null @@ -1,589 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package client - -import ( - "bytes" - "io/ioutil" - "os" - "path/filepath" - "reflect" - "sort" - "testing" - - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/storage/feed/lookup" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/swarm/api" - swarmhttp "github.com/nebulaai/nbai-node/swarm/api/http" - "github.com/nebulaai/nbai-node/swarm/storage/feed" -) - -func serverFunc(api *api.API) swarmhttp.TestServer { - return swarmhttp.NewServer(api, "") -} - -// TestClientUploadDownloadRaw test uploading and downloading raw data to swarm -func TestClientUploadDownloadRaw(t *testing.T) { - testClientUploadDownloadRaw(false, t) -} -func TestClientUploadDownloadRawEncrypted(t *testing.T) { - testClientUploadDownloadRaw(true, t) -} - -func testClientUploadDownloadRaw(toEncrypt bool, t *testing.T) { - srv := swarmhttp.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - client := NewClient(srv.URL) - - // upload some raw data - data := []byte("foo123") - hash, err := client.UploadRaw(bytes.NewReader(data), int64(len(data)), toEncrypt) - if err != nil { - t.Fatal(err) - } - - // check we can download the same data - res, isEncrypted, err := client.DownloadRaw(hash) - if err != nil { - t.Fatal(err) - } - if isEncrypted != toEncrypt { - t.Fatalf("Expected encyption status %v got %v", toEncrypt, isEncrypted) - } - defer res.Close() - gotData, err := ioutil.ReadAll(res) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(gotData, data) { - t.Fatalf("expected downloaded data to be %q, got %q", data, gotData) - } -} - -// TestClientUploadDownloadFiles test uploading and downloading files to swarm -// manifests -func TestClientUploadDownloadFiles(t *testing.T) { - testClientUploadDownloadFiles(false, t) -} - -func TestClientUploadDownloadFilesEncrypted(t *testing.T) { - testClientUploadDownloadFiles(true, t) -} - -func testClientUploadDownloadFiles(toEncrypt bool, t *testing.T) { - srv := swarmhttp.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - client := NewClient(srv.URL) - upload := func(manifest, path string, data []byte) string { - file := &File{ - ReadCloser: ioutil.NopCloser(bytes.NewReader(data)), - ManifestEntry: api.ManifestEntry{ - Path: path, - ContentType: "text/plain", - Size: int64(len(data)), - }, - } - hash, err := client.Upload(file, manifest, toEncrypt) - if err != nil { - t.Fatal(err) - } - return hash - } - checkDownload := func(manifest, path string, expected []byte) { - file, err := client.Download(manifest, path) - if err != nil { - t.Fatal(err) - } - defer file.Close() - if file.Size != int64(len(expected)) { - t.Fatalf("expected downloaded file to be %d bytes, got %d", len(expected), file.Size) - } - 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 { - t.Fatal(err) - } - if !bytes.Equal(data, expected) { - t.Fatalf("expected downloaded data to be %q, got %q", expected, data) - } - } - - // upload a file to the root of a manifest - rootData := []byte("some-data") - rootHash := upload("", "", rootData) - - // check we can download the root file - checkDownload(rootHash, "", rootData) - - // upload another file to the same manifest - otherData := []byte("some-other-data") - newHash := upload(rootHash, "some/other/path", otherData) - - // check we can download both files from the new manifest - checkDownload(newHash, "", rootData) - checkDownload(newHash, "some/other/path", otherData) - - // replace the root file with different data - newHash = upload(newHash, "", otherData) - - // check both files have the other data - checkDownload(newHash, "", otherData) - checkDownload(newHash, "some/other/path", otherData) -} - -var testDirFiles = []string{ - "file1.txt", - "file2.txt", - "dir1/file3.txt", - "dir1/file4.txt", - "dir2/file5.txt", - "dir2/dir3/file6.txt", - "dir2/dir4/file7.txt", - "dir2/dir4/file8.txt", -} - -func newTestDirectory(t *testing.T) string { - dir, err := ioutil.TempDir("", "swarm-client-test") - if err != nil { - t.Fatal(err) - } - - for _, file := range testDirFiles { - path := filepath.Join(dir, file) - if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { - os.RemoveAll(dir) - t.Fatalf("error creating dir for %s: %s", path, err) - } - if err := ioutil.WriteFile(path, []byte(file), 0644); err != nil { - os.RemoveAll(dir) - t.Fatalf("error writing file %s: %s", path, err) - } - } - - return dir -} - -// TestClientUploadDownloadDirectory tests uploading and downloading a -// directory of files to a swarm manifest -func TestClientUploadDownloadDirectory(t *testing.T) { - srv := swarmhttp.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - dir := newTestDirectory(t) - defer os.RemoveAll(dir) - - // upload the directory - client := NewClient(srv.URL) - defaultPath := testDirFiles[0] - hash, err := client.UploadDirectory(dir, defaultPath, "", false) - if err != nil { - t.Fatalf("error uploading directory: %s", err) - } - - // check we can download the individual files - checkDownloadFile := func(path string, expected []byte) { - file, err := client.Download(hash, path) - if err != nil { - t.Fatal(err) - } - defer file.Close() - data, err := ioutil.ReadAll(file) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(data, expected) { - t.Fatalf("expected data to be %q, got %q", expected, data) - } - } - for _, file := range testDirFiles { - checkDownloadFile(file, []byte(file)) - } - - // check we can download the default path - checkDownloadFile("", []byte(testDirFiles[0])) - - // check we can download the directory - tmp, err := ioutil.TempDir("", "swarm-client-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(tmp) - if err := client.DownloadDirectory(hash, "", tmp, ""); err != nil { - t.Fatal(err) - } - for _, file := range testDirFiles { - data, err := ioutil.ReadFile(filepath.Join(tmp, file)) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(data, []byte(file)) { - t.Fatalf("expected data to be %q, got %q", file, data) - } - } -} - -// TestClientFileList tests listing files in a swarm manifest -func TestClientFileList(t *testing.T) { - testClientFileList(false, t) -} - -func TestClientFileListEncrypted(t *testing.T) { - testClientFileList(true, t) -} - -func testClientFileList(toEncrypt bool, t *testing.T) { - srv := swarmhttp.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - dir := newTestDirectory(t) - defer os.RemoveAll(dir) - - client := NewClient(srv.URL) - hash, err := client.UploadDirectory(dir, "", "", toEncrypt) - if err != nil { - t.Fatalf("error uploading directory: %s", err) - } - - ls := func(prefix string) []string { - list, err := client.List(hash, prefix, "") - if err != nil { - t.Fatal(err) - } - paths := make([]string, 0, len(list.CommonPrefixes)+len(list.Entries)) - paths = append(paths, list.CommonPrefixes...) - for _, entry := range list.Entries { - paths = append(paths, entry.Path) - } - sort.Strings(paths) - return paths - } - - tests := map[string][]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) - if !reflect.DeepEqual(actual, expected) { - t.Fatalf("expected prefix %q to return %v, got %v", prefix, expected, actual) - } - } -} - -// TestClientMultipartUpload tests uploading files to swarm using a multipart -// upload -func TestClientMultipartUpload(t *testing.T) { - srv := swarmhttp.NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - // define an uploader which uploads testDirFiles with some data - data := []byte("some-data") - uploader := UploaderFunc(func(upload UploadFn) error { - for _, name := range testDirFiles { - file := &File{ - ReadCloser: ioutil.NopCloser(bytes.NewReader(data)), - ManifestEntry: api.ManifestEntry{ - Path: name, - ContentType: "text/plain", - Size: int64(len(data)), - }, - } - if err := upload(file); err != nil { - return err - } - } - return nil - }) - - // upload the files as a multipart upload - client := NewClient(srv.URL) - hash, err := client.MultipartUpload("", uploader) - if err != nil { - t.Fatal(err) - } - - // check we can download the individual files - checkDownloadFile := func(path string) { - file, err := client.Download(hash, path) - if err != nil { - t.Fatal(err) - } - defer file.Close() - gotData, err := ioutil.ReadAll(file) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(gotData, data) { - t.Fatalf("expected data to be %q, got %q", data, gotData) - } - } - for _, file := range testDirFiles { - checkDownloadFile(file) - } -} - -func newTestSigner() (*feed.GenericSigner, error) { - privKey, err := crypto.HexToECDSA("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") - if err != nil { - return nil, err - } - return feed.NewGenericSigner(privKey), nil -} - -// Test the transparent resolving of feed updates with bzz:// scheme -// -// First upload data to bzz:, and store the Swarm hash to the resulting manifest in a feed update. -// This effectively uses a feed to store a pointer to content rather than the content itself -// Retrieving the update with the Swarm hash should return the manifest pointing directly to the data -// and raw retrieve of that hash should return the data -func TestClientBzzWithFeed(t *testing.T) { - - signer, _ := newTestSigner() - - // Initialize a Swarm test server - srv := swarmhttp.NewTestSwarmServer(t, serverFunc, nil) - swarmClient := NewClient(srv.URL) - defer srv.Close() - - // put together some data for our test: - dataBytes := []byte(` - // - // Create some data our manifest will point to. Data that could be very big and wouldn't fit in a feed update. - // So what we are going to do is upload it to Swarm bzz:// and obtain a **manifest hash** pointing to it: - // - // MANIFEST HASH --> DATA - // - // Then, we store that **manifest hash** into a Swarm Feed update. Once we have done this, - // we can use the **feed manifest hash** in bzz:// instead, this way: bzz://feed-manifest-hash. - // - // FEED MANIFEST HASH --> MANIFEST HASH --> DATA - // - // Given that we can update the feed at any time with a new **manifest hash** but the **feed manifest hash** - // stays constant, we have effectively created a fixed address to changing content. (Applause) - // - // FEED MANIFEST HASH (the same) --> MANIFEST HASH(2) --> DATA(2) - // - `) - - // Create a virtual File out of memory containing the above data - f := &File{ - ReadCloser: ioutil.NopCloser(bytes.NewReader(dataBytes)), - ManifestEntry: api.ManifestEntry{ - ContentType: "text/plain", - Mode: 0660, - Size: int64(len(dataBytes)), - }, - } - - // upload data to bzz:// and retrieve the content-addressed manifest hash, hex-encoded. - manifestAddressHex, err := swarmClient.Upload(f, "", false) - if err != nil { - t.Fatalf("Error creating manifest: %s", err) - } - - // convert the hex-encoded manifest hash to a 32-byte slice - manifestAddress := common.FromHex(manifestAddressHex) - - if len(manifestAddress) != storage.AddressLength { - t.Fatalf("Something went wrong. Got a hash of an unexpected length. Expected %d bytes. Got %d", storage.AddressLength, len(manifestAddress)) - } - - // Now create a **feed manifest**. For that, we need a topic: - topic, _ := feed.NewTopic("interesting topic indeed", nil) - - // Build a feed request to update data - request := feed.NewFirstRequest(topic) - - // Put the 32-byte address of the manifest into the feed update - request.SetData(manifestAddress) - - // Sign the update - if err := request.Sign(signer); err != nil { - t.Fatalf("Error signing update: %s", err) - } - - // Publish the update and at the same time request a **feed manifest** to be created - feedManifestAddressHex, err := swarmClient.CreateFeedWithManifest(request) - if err != nil { - t.Fatalf("Error creating feed manifest: %s", err) - } - - // Check we have received the exact **feed manifest** to be expected - // given the topic and user signing the updates: - correctFeedManifestAddrHex := "747c402e5b9dc715a25a4393147512167bab018a007fad7cdcd9adc7fce1ced2" - if feedManifestAddressHex != correctFeedManifestAddrHex { - t.Fatalf("Response feed manifest mismatch, expected '%s', got '%s'", correctFeedManifestAddrHex, feedManifestAddressHex) - } - - // Check we get a not found error when trying to get feed updates with a made-up manifest - _, err = swarmClient.QueryFeed(nil, "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb") - if err != ErrNoFeedUpdatesFound { - t.Fatalf("Expected to receive ErrNoFeedUpdatesFound error. Got: %s", err) - } - - // If we query the feed directly we should get **manifest hash** back: - reader, err := swarmClient.QueryFeed(nil, correctFeedManifestAddrHex) - if err != nil { - t.Fatalf("Error retrieving feed updates: %s", err) - } - defer reader.Close() - gotData, err := ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err) - } - - //Check that indeed the **manifest hash** is retrieved - if !bytes.Equal(manifestAddress, gotData) { - t.Fatalf("Expected: %v, got %v", manifestAddress, gotData) - } - - // Now the final test we were looking for: Use bzz:// and that should resolve all manifests - // and return the original data directly: - f, err = swarmClient.Download(feedManifestAddressHex, "") - if err != nil { - t.Fatal(err) - } - gotData, err = ioutil.ReadAll(f) - if err != nil { - t.Fatal(err) - } - - // Check that we get back the original data: - if !bytes.Equal(dataBytes, gotData) { - t.Fatalf("Expected: %v, got %v", manifestAddress, gotData) - } -} - -// TestClientCreateUpdateFeed will check that feeds can be created and updated via the HTTP client. -func TestClientCreateUpdateFeed(t *testing.T) { - - signer, _ := newTestSigner() - - srv := swarmhttp.NewTestSwarmServer(t, serverFunc, nil) - client := NewClient(srv.URL) - defer srv.Close() - - // set raw data for the feed update - databytes := []byte("En un lugar de La Mancha, de cuyo nombre no quiero acordarme...") - - // our feed topic name - topic, _ := feed.NewTopic("El Quijote", nil) - createRequest := feed.NewFirstRequest(topic) - - createRequest.SetData(databytes) - if err := createRequest.Sign(signer); err != nil { - t.Fatalf("Error signing update: %s", err) - } - - feedManifestHash, err := client.CreateFeedWithManifest(createRequest) - if err != nil { - t.Fatal(err) - } - - correctManifestAddrHex := "0e9b645ebc3da167b1d56399adc3276f7a08229301b72a03336be0e7d4b71882" - if feedManifestHash != correctManifestAddrHex { - t.Fatalf("Response feed manifest mismatch, expected '%s', got '%s'", correctManifestAddrHex, feedManifestHash) - } - - reader, err := client.QueryFeed(nil, correctManifestAddrHex) - if err != nil { - t.Fatalf("Error retrieving feed updates: %s", err) - } - defer reader.Close() - gotData, err := ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(databytes, gotData) { - t.Fatalf("Expected: %v, got %v", databytes, gotData) - } - - // define different data - databytes = []byte("... no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero ...") - - updateRequest, err := client.GetFeedRequest(nil, correctManifestAddrHex) - if err != nil { - t.Fatalf("Error retrieving update request template: %s", err) - } - - updateRequest.SetData(databytes) - if err := updateRequest.Sign(signer); err != nil { - t.Fatalf("Error signing update: %s", err) - } - - if err = client.UpdateFeed(updateRequest); err != nil { - t.Fatalf("Error updating feed: %s", err) - } - - reader, err = client.QueryFeed(nil, correctManifestAddrHex) - if err != nil { - t.Fatalf("Error retrieving feed updates: %s", err) - } - defer reader.Close() - gotData, err = ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(databytes, gotData) { - t.Fatalf("Expected: %v, got %v", databytes, gotData) - } - - // now try retrieving feed updates without a manifest - - fd := &feed.Feed{ - Topic: topic, - User: signer.Address(), - } - - lookupParams := feed.NewQueryLatest(fd, lookup.NoClue) - reader, err = client.QueryFeed(lookupParams, "") - if err != nil { - t.Fatalf("Error retrieving feed updates: %s", err) - } - defer reader.Close() - gotData, err = ioutil.ReadAll(reader) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(databytes, gotData) { - t.Fatalf("Expected: %v, got %v", databytes, gotData) - } -} diff --git a/swarm/api/config.go b/swarm/api/config.go deleted file mode 100644 index 7a4a89b895ee..000000000000 --- a/swarm/api/config.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "crypto/ecdsa" - "fmt" - "os" - "path/filepath" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/contracts/ens" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/pss" - "github.com/nebulaai/nbai-node/swarm/services/swap" - "github.com/nebulaai/nbai-node/swarm/storage" -) - -const ( - DefaultHTTPListenAddr = "127.0.0.1" - DefaultHTTPPort = "8500" -) - -// separate bzz directories -// allow several bzz nodes running in parallel -type Config struct { - // serialised/persisted fields - *storage.FileStoreParams - *storage.LocalStoreParams - *network.HiveParams - Swap *swap.LocalProfile - Pss *pss.PssParams - //*network.SyncParams - Contract common.Address - EnsRoot common.Address - EnsAPIs []string - Path string - ListenAddr string - Port string - PublicKey string - BzzKey string - NodeID string - NetworkID uint64 - SwapEnabled bool - SyncEnabled bool - SyncingSkipCheck bool - DeliverySkipCheck bool - MaxStreamPeerServers int - LightNodeEnabled bool - SyncUpdateDelay time.Duration - SwapAPI string - Cors string - BzzAccount string - privateKey *ecdsa.PrivateKey -} - -//create a default config with all parameters to set to defaults -func NewConfig() (c *Config) { - - c = &Config{ - LocalStoreParams: storage.NewDefaultLocalStoreParams(), - FileStoreParams: storage.NewFileStoreParams(), - HiveParams: network.NewHiveParams(), - //SyncParams: network.NewDefaultSyncParams(), - Swap: swap.NewDefaultSwapParams(), - Pss: pss.NewPssParams(), - ListenAddr: DefaultHTTPListenAddr, - Port: DefaultHTTPPort, - Path: node.DefaultDataDir(), - EnsAPIs: nil, - EnsRoot: ens.TestNetAddress, - NetworkID: network.DefaultNetworkID, - SwapEnabled: false, - SyncEnabled: true, - SyncingSkipCheck: false, - MaxStreamPeerServers: 10000, - DeliverySkipCheck: true, - SyncUpdateDelay: 15 * time.Second, - SwapAPI: "", - } - - return -} - -//some config params need to be initialized after the complete -//config building phase is completed (e.g. due to overriding flags) -func (c *Config) Init(prvKey *ecdsa.PrivateKey) { - - address := crypto.PubkeyToAddress(prvKey.PublicKey) - c.Path = filepath.Join(c.Path, "bzz-"+common.Bytes2Hex(address.Bytes())) - err := os.MkdirAll(c.Path, os.ModePerm) - if err != nil { - log.Error(fmt.Sprintf("Error creating root swarm data directory: %v", err)) - return - } - - pubkey := crypto.FromECDSAPub(&prvKey.PublicKey) - pubkeyhex := common.ToHex(pubkey) - keyhex := crypto.Keccak256Hash(pubkey).Hex() - - c.PublicKey = pubkeyhex - c.BzzKey = keyhex - c.NodeID = enode.PubkeyToIDV4(&prvKey.PublicKey).String() - - if c.SwapEnabled { - c.Swap.Init(c.Contract, prvKey) - } - - c.privateKey = prvKey - c.LocalStoreParams.Init(c.Path) - c.LocalStoreParams.BaseKey = common.FromHex(keyhex) - - c.Pss = c.Pss.WithPrivateKey(c.privateKey) -} - -func (c *Config) ShiftPrivateKey() (privKey *ecdsa.PrivateKey) { - if c.privateKey != nil { - privKey = c.privateKey - c.privateKey = nil - } - return privKey -} diff --git a/swarm/api/config_test.go b/swarm/api/config_test.go deleted file mode 100644 index 2683737ee3a1..000000000000 --- a/swarm/api/config_test.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "reflect" - "testing" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" -) - -func TestConfig(t *testing.T) { - - var hexprvkey = "65138b2aa745041b372153550584587da326ab440576b2a1191dd95cee30039c" - - prvkey, err := crypto.HexToECDSA(hexprvkey) - if err != nil { - t.Fatalf("failed to load private key: %v", err) - } - - one := NewConfig() - two := NewConfig() - - one.LocalStoreParams = two.LocalStoreParams - if equal := reflect.DeepEqual(one, two); !equal { - t.Fatal("Two default configs are not equal") - } - - one.Init(prvkey) - - //the init function should set the following fields - if one.BzzKey == "" { - t.Fatal("Expected BzzKey to be set") - } - if one.PublicKey == "" { - t.Fatal("Expected PublicKey to be set") - } - if one.Swap.PayProfile.Beneficiary == (common.Address{}) && one.SwapEnabled { - t.Fatal("Failed to correctly initialize SwapParams") - } - if one.ChunkDbPath == one.Path { - t.Fatal("Failed to correctly initialize StoreParams") - } -} diff --git a/swarm/api/encrypt.go b/swarm/api/encrypt.go deleted file mode 100644 index 83c5c72c059b..000000000000 --- a/swarm/api/encrypt.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "encoding/binary" - "errors" - - "github.com/nebulaai/nbai-node/swarm/storage/encryption" - "golang.org/x/crypto/sha3" -) - -type RefEncryption struct { - refSize int - span []byte -} - -func NewRefEncryption(refSize int) *RefEncryption { - span := make([]byte, 8) - binary.LittleEndian.PutUint64(span, uint64(refSize)) - return &RefEncryption{ - refSize: refSize, - span: span, - } -} - -func (re *RefEncryption) Encrypt(ref []byte, key []byte) ([]byte, error) { - spanEncryption := encryption.New(key, 0, uint32(re.refSize/32), sha3.NewLegacyKeccak256) - encryptedSpan, err := spanEncryption.Encrypt(re.span) - if err != nil { - return nil, err - } - dataEncryption := encryption.New(key, re.refSize, 0, sha3.NewLegacyKeccak256) - encryptedData, err := dataEncryption.Encrypt(ref) - if err != nil { - return nil, err - } - encryptedRef := make([]byte, len(ref)+8) - copy(encryptedRef[:8], encryptedSpan) - copy(encryptedRef[8:], encryptedData) - - return encryptedRef, nil -} - -func (re *RefEncryption) Decrypt(ref []byte, key []byte) ([]byte, error) { - spanEncryption := encryption.New(key, 0, uint32(re.refSize/32), sha3.NewLegacyKeccak256) - decryptedSpan, err := spanEncryption.Decrypt(ref[:8]) - if err != nil { - return nil, err - } - - size := binary.LittleEndian.Uint64(decryptedSpan) - if size != uint64(len(ref)-8) { - return nil, errors.New("invalid span in encrypted reference") - } - - dataEncryption := encryption.New(key, re.refSize, 0, sha3.NewLegacyKeccak256) - decryptedRef, err := dataEncryption.Decrypt(ref[8:]) - if err != nil { - return nil, err - } - - return decryptedRef, nil -} diff --git a/swarm/api/filesystem.go b/swarm/api/filesystem.go deleted file mode 100644 index 619982451b1a..000000000000 --- a/swarm/api/filesystem.go +++ /dev/null @@ -1,292 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "bufio" - "context" - "fmt" - "io" - "os" - "path" - "path/filepath" - "sync" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/storage" -) - -const maxParallelFiles = 5 - -type FileSystem struct { - api *API -} - -func NewFileSystem(api *API) *FileSystem { - return &FileSystem{api} -} - -// Upload replicates a local directory as a manifest file and uploads it -// using FileStore store -// This function waits the chunks to be stored. -// TODO: localpath should point to a manifest -// -// DEPRECATED: Use the HTTP API instead -func (fs *FileSystem) Upload(lpath, index string, toEncrypt bool) (string, error) { - var list []*manifestTrieEntry - localpath, err := filepath.Abs(filepath.Clean(lpath)) - if err != nil { - return "", err - } - - f, err := os.Open(localpath) - if err != nil { - return "", err - } - stat, err := f.Stat() - if err != nil { - return "", err - } - - var start int - if stat.IsDir() { - start = len(localpath) - log.Debug(fmt.Sprintf("uploading '%s'", localpath)) - err = filepath.Walk(localpath, func(path string, info os.FileInfo, err error) error { - if (err == nil) && !info.IsDir() { - if len(path) <= start { - return fmt.Errorf("Path is too short") - } - if path[:start] != localpath { - return fmt.Errorf("Path prefix of '%s' does not match localpath '%s'", path, localpath) - } - entry := newManifestTrieEntry(&ManifestEntry{Path: filepath.ToSlash(path)}, nil) - list = append(list, entry) - } - return err - }) - if err != nil { - return "", err - } - } else { - dir := filepath.Dir(localpath) - start = len(dir) - if len(localpath) <= start { - return "", fmt.Errorf("Path is too short") - } - if localpath[:start] != dir { - return "", fmt.Errorf("Path prefix of '%s' does not match dir '%s'", localpath, dir) - } - entry := newManifestTrieEntry(&ManifestEntry{Path: filepath.ToSlash(localpath)}, nil) - list = append(list, entry) - } - - errors := make([]error, len(list)) - sem := make(chan bool, maxParallelFiles) - defer close(sem) - - for i, entry := range list { - sem <- true - go func(i int, entry *manifestTrieEntry) { - defer func() { <-sem }() - - f, err := os.Open(entry.Path) - if err != nil { - errors[i] = err - return - } - defer f.Close() - - stat, err := f.Stat() - if err != nil { - errors[i] = err - return - } - - var hash storage.Address - var wait func(context.Context) error - ctx := context.TODO() - hash, wait, err = fs.api.fileStore.Store(ctx, f, stat.Size(), toEncrypt) - if err != nil { - errors[i] = err - return - } - if hash != nil { - list[i].Hash = hash.Hex() - } - if err := wait(ctx); err != nil { - errors[i] = err - return - } - - list[i].ContentType, err = DetectContentType(f.Name(), f) - if err != nil { - errors[i] = err - return - } - - }(i, entry) - } - for i := 0; i < cap(sem); i++ { - sem <- true - } - - trie := &manifestTrie{ - fileStore: fs.api.fileStore, - } - quitC := make(chan bool) - for i, entry := range list { - if errors[i] != nil { - return "", errors[i] - } - entry.Path = RegularSlashes(entry.Path[start:]) - if entry.Path == index { - ientry := newManifestTrieEntry(&ManifestEntry{ - ContentType: entry.ContentType, - }, nil) - ientry.Hash = entry.Hash - trie.addEntry(ientry, quitC) - } - trie.addEntry(entry, quitC) - } - - err2 := trie.recalcAndStore() - var hs string - if err2 == nil { - hs = trie.ref.Hex() - } - return hs, err2 -} - -// Download replicates the manifest basePath structure on the local filesystem -// under localpath -// -// DEPRECATED: Use the HTTP API instead -func (fs *FileSystem) Download(bzzpath, localpath string) error { - lpath, err := filepath.Abs(filepath.Clean(localpath)) - if err != nil { - return err - } - err = os.MkdirAll(lpath, os.ModePerm) - if err != nil { - return err - } - - //resolving host and port - uri, err := Parse(path.Join("bzz:/", bzzpath)) - if err != nil { - return err - } - addr, err := fs.api.Resolve(context.TODO(), uri.Addr) - if err != nil { - return err - } - path := uri.Path - - if len(path) > 0 { - path += "/" - } - - quitC := make(chan bool) - trie, err := loadManifest(context.TODO(), fs.api.fileStore, addr, quitC, NOOPDecrypt) - if err != nil { - log.Warn(fmt.Sprintf("fs.Download: loadManifestTrie error: %v", err)) - return err - } - - type downloadListEntry struct { - addr storage.Address - path string - } - - var list []*downloadListEntry - var mde error - - prevPath := lpath - err = trie.listWithPrefix(path, quitC, func(entry *manifestTrieEntry, suffix string) { - log.Trace(fmt.Sprintf("fs.Download: %#v", entry)) - - addr = common.Hex2Bytes(entry.Hash) - path := lpath + "/" + suffix - dir := filepath.Dir(path) - if dir != prevPath { - mde = os.MkdirAll(dir, os.ModePerm) - prevPath = dir - } - if (mde == nil) && (path != dir+"/") { - list = append(list, &downloadListEntry{addr: addr, path: path}) - } - }) - if err != nil { - return err - } - - wg := sync.WaitGroup{} - errC := make(chan error) - done := make(chan bool, maxParallelFiles) - for i, entry := range list { - select { - case done <- true: - wg.Add(1) - case <-quitC: - return fmt.Errorf("aborted") - } - go func(i int, entry *downloadListEntry) { - defer wg.Done() - err := retrieveToFile(quitC, fs.api.fileStore, entry.addr, entry.path) - if err != nil { - select { - case errC <- err: - case <-quitC: - } - return - } - <-done - }(i, entry) - } - go func() { - wg.Wait() - close(errC) - }() - select { - case err = <-errC: - return err - case <-quitC: - return fmt.Errorf("aborted") - } -} - -func retrieveToFile(quitC chan bool, fileStore *storage.FileStore, addr storage.Address, path string) error { - f, err := os.Create(path) // TODO: basePath separators - if err != nil { - return err - } - reader, _ := fileStore.Retrieve(context.TODO(), addr) - writer := bufio.NewWriter(f) - size, err := reader.Size(context.TODO(), quitC) - if err != nil { - return err - } - if _, err = io.CopyN(writer, reader, size); err != nil { - return err - } - if err := writer.Flush(); err != nil { - return err - } - return f.Close() -} diff --git a/swarm/api/filesystem_test.go b/swarm/api/filesystem_test.go deleted file mode 100644 index cce04895c2b3..000000000000 --- a/swarm/api/filesystem_test.go +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "bytes" - "context" - "io/ioutil" - "os" - "path/filepath" - "testing" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/swarm/storage" -) - -var testDownloadDir, _ = ioutil.TempDir(os.TempDir(), "bzz-test") - -func testFileSystem(t *testing.T, f func(*FileSystem, bool)) { - testAPI(t, func(api *API, toEncrypt bool) { - f(NewFileSystem(api), toEncrypt) - }) -} - -func readPath(t *testing.T, parts ...string) string { - file := filepath.Join(parts...) - content, err := ioutil.ReadFile(file) - - if err != nil { - t.Fatalf("unexpected error reading '%v': %v", file, err) - } - return string(content) -} - -func TestApiDirUpload0(t *testing.T) { - testFileSystem(t, func(fs *FileSystem, toEncrypt bool) { - api := fs.api - bzzhash, err := fs.Upload(filepath.Join("testdata", "test0"), "", toEncrypt) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - content := readPath(t, "testdata", "test0", "index.html") - resp := testGet(t, api, bzzhash, "index.html") - exp := expResponse(content, "text/html; charset=utf-8", 0) - checkResponse(t, resp, exp) - - content = readPath(t, "testdata", "test0", "index.css") - resp = testGet(t, api, bzzhash, "index.css") - exp = expResponse(content, "text/css; charset=utf-8", 0) - checkResponse(t, resp, exp) - - addr := storage.Address(common.Hex2Bytes(bzzhash)) - _, _, _, _, err = api.Get(context.TODO(), NOOPDecrypt, addr, "") - if err == nil { - t.Fatalf("expected error: %v", err) - } - - downloadDir := filepath.Join(testDownloadDir, "test0") - defer os.RemoveAll(downloadDir) - err = fs.Download(bzzhash, downloadDir) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - newbzzhash, err := fs.Upload(downloadDir, "", toEncrypt) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - // TODO: currently the hash is not deterministic in the encrypted case - if !toEncrypt && bzzhash != newbzzhash { - t.Fatalf("download %v reuploaded has incorrect hash, expected %v, got %v", downloadDir, bzzhash, newbzzhash) - } - }) -} - -func TestApiDirUploadModify(t *testing.T) { - testFileSystem(t, func(fs *FileSystem, toEncrypt bool) { - api := fs.api - bzzhash, err := fs.Upload(filepath.Join("testdata", "test0"), "", toEncrypt) - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - - addr := storage.Address(common.Hex2Bytes(bzzhash)) - addr, err = api.Modify(context.TODO(), addr, "index.html", "", "") - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - index, err := ioutil.ReadFile(filepath.Join("testdata", "test0", "index.html")) - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - ctx := context.TODO() - hash, wait, err := api.Store(ctx, bytes.NewReader(index), int64(len(index)), toEncrypt) - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - err = wait(ctx) - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - addr, err = api.Modify(context.TODO(), addr, "index2.html", hash.Hex(), "text/html; charset=utf-8") - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - addr, err = api.Modify(context.TODO(), addr, "img/logo.png", hash.Hex(), "text/html; charset=utf-8") - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - bzzhash = addr.Hex() - - content := readPath(t, "testdata", "test0", "index.html") - resp := testGet(t, api, bzzhash, "index2.html") - exp := expResponse(content, "text/html; charset=utf-8", 0) - checkResponse(t, resp, exp) - - resp = testGet(t, api, bzzhash, "img/logo.png") - exp = expResponse(content, "text/html; charset=utf-8", 0) - checkResponse(t, resp, exp) - - content = readPath(t, "testdata", "test0", "index.css") - resp = testGet(t, api, bzzhash, "index.css") - exp = expResponse(content, "text/css; charset=utf-8", 0) - checkResponse(t, resp, exp) - - _, _, _, _, err = api.Get(context.TODO(), nil, addr, "") - if err == nil { - t.Errorf("expected error: %v", err) - } - }) -} - -func TestApiDirUploadWithRootFile(t *testing.T) { - testFileSystem(t, func(fs *FileSystem, toEncrypt bool) { - api := fs.api - bzzhash, err := fs.Upload(filepath.Join("testdata", "test0"), "index.html", toEncrypt) - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - - content := readPath(t, "testdata", "test0", "index.html") - resp := testGet(t, api, bzzhash, "") - exp := expResponse(content, "text/html; charset=utf-8", 0) - checkResponse(t, resp, exp) - }) -} - -func TestApiFileUpload(t *testing.T) { - testFileSystem(t, func(fs *FileSystem, toEncrypt bool) { - api := fs.api - bzzhash, err := fs.Upload(filepath.Join("testdata", "test0", "index.html"), "", toEncrypt) - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - - content := readPath(t, "testdata", "test0", "index.html") - resp := testGet(t, api, bzzhash, "index.html") - exp := expResponse(content, "text/html; charset=utf-8", 0) - checkResponse(t, resp, exp) - }) -} - -func TestApiFileUploadWithRootFile(t *testing.T) { - testFileSystem(t, func(fs *FileSystem, toEncrypt bool) { - api := fs.api - bzzhash, err := fs.Upload(filepath.Join("testdata", "test0", "index.html"), "index.html", toEncrypt) - if err != nil { - t.Errorf("unexpected error: %v", err) - return - } - - content := readPath(t, "testdata", "test0", "index.html") - resp := testGet(t, api, bzzhash, "") - exp := expResponse(content, "text/html; charset=utf-8", 0) - checkResponse(t, resp, exp) - }) -} diff --git a/swarm/api/gen_mime.go b/swarm/api/gen_mime.go deleted file mode 100644 index 109edeb506c5..000000000000 --- a/swarm/api/gen_mime.go +++ /dev/null @@ -1,1201 +0,0 @@ -// Code generated by github.com/ethereum/go-ethereum/cmd/swarm/mimegen. DO NOT EDIT. - -package api - -import "mime" - -func init() { - var mimeTypes = map[string]string{ - ".a2l": "application/A2L", - ".aml": "application/AML", - ".ez": "application/andrew-inset", - ".atf": "application/ATF", - ".atfx": "application/ATFX", - ".atxml": "application/ATXML", - ".atom": "application/atom+xml", - ".atomcat": "application/atomcat+xml", - ".atomdeleted": "application/atomdeleted+xml", - ".atomsvc": "application/atomsvc+xml", - ".apxml": "application/auth-policy+xml", - ".xdd": "application/bacnet-xdd+zip", - ".xcs": "application/calendar+xml", - ".cbor": "application/cbor", - ".ccmp": "application/ccmp+xml", - ".ccxml": "application/ccxml+xml", - ".cdfx": "application/CDFX+XML", - ".cdmia": "application/cdmi-capability", - ".cdmic": "application/cdmi-container", - ".cdmid": "application/cdmi-domain", - ".cdmio": "application/cdmi-object", - ".cdmiq": "application/cdmi-queue", - ".cea": "application/CEA", - ".cellml": "application/cellml+xml", - ".cml": "application/cellml+xml", - ".clue": "application/clue_info+xml", - ".cmsc": "application/cms", - ".cpl": "application/cpl+xml", - ".csrattrs": "application/csrattrs", - ".mpd": "application/dash+xml", - ".mpdd": "application/dashdelta", - ".davmount": "application/davmount+xml", - ".dcd": "application/DCD", - ".dcm": "application/dicom", - ".dii": "application/DII", - ".dit": "application/DIT", - ".xmls": "application/dskpp+xml", - ".dssc": "application/dssc+der", - ".xdssc": "application/dssc+xml", - ".dvc": "application/dvcs", - ".es": "application/ecmascript", - ".efi": "application/efi", - ".emma": "application/emma+xml", - ".emotionml": "application/emotionml+xml", - ".epub": "application/epub+zip", - ".exi": "application/exi", - ".finf": "application/fastinfoset", - ".fdt": "application/fdt+xml", - ".pfr": "application/font-tdpfr", - ".geojson": "application/geo+json", - ".gml": "application/gml+xml", - ".gz": "application/gzip", - ".tgz": "application/gzip", - ".stk": "application/hyperstudio", - ".ink": "application/inkml+xml", - ".inkml": "application/inkml+xml", - ".ipfix": "application/ipfix", - ".its": "application/its+xml", - ".js": "application/javascript", - ".jrd": "application/jrd+json", - ".json": "application/json", - ".json-patch": "application/json-patch+json", - ".jsonld": "application/ld+json", - ".lgr": "application/lgr+xml", - ".wlnk": "application/link-format", - ".lostxml": "application/lost+xml", - ".lostsyncxml": "application/lostsync+xml", - ".lxf": "application/LXF", - ".hqx": "application/mac-binhex40", - ".mads": "application/mads+xml", - ".mrc": "application/marc", - ".mrcx": "application/marcxml+xml", - ".nb": "application/mathematica", - ".ma": "application/mathematica", - ".mb": "application/mathematica", - ".mml": "application/mathml+xml", - ".mbox": "application/mbox", - ".meta4": "application/metalink4+xml", - ".mets": "application/mets+xml", - ".mf4": "application/MF4", - ".mods": "application/mods+xml", - ".m21": "application/mp21", - ".mp21": "application/mp21", - ".doc": "application/msword", - ".mxf": "application/mxf", - ".nq": "application/n-quads", - ".nt": "application/n-triples", - ".orq": "application/ocsp-request", - ".ors": "application/ocsp-response", - ".bin": "application/octet-stream", - ".lha": "application/octet-stream", - ".lzh": "application/octet-stream", - ".exe": "application/octet-stream", - ".class": "application/octet-stream", - ".so": "application/octet-stream", - ".dll": "application/octet-stream", - ".img": "application/octet-stream", - ".iso": "application/octet-stream", - ".oda": "application/oda", - ".odx": "application/ODX", - ".opf": "application/oebps-package+xml", - ".ogx": "application/ogg", - ".oxps": "application/oxps", - ".relo": "application/p2p-overlay+xml", - ".pdf": "application/pdf", - ".pdx": "application/PDX", - ".pgp": "application/pgp-encrypted", - ".sig": "application/pgp-signature", - ".p10": "application/pkcs10", - ".p12": "application/pkcs12", - ".pfx": "application/pkcs12", - ".p7m": "application/pkcs7-mime", - ".p7c": "application/pkcs7-mime", - ".p7s": "application/pkcs7-signature", - ".p8": "application/pkcs8", - ".cer": "application/pkix-cert", - ".crl": "application/pkix-crl", - ".pkipath": "application/pkix-pkipath", - ".pki": "application/pkixcmp", - ".pls": "application/pls+xml", - ".ps": "application/postscript", - ".eps": "application/postscript", - ".ai": "application/postscript", - ".provx": "application/provenance+xml", - ".cw": "application/prs.cww", - ".cww": "application/prs.cww", - ".hpub": "application/prs.hpub+zip", - ".rnd": "application/prs.nprend", - ".rct": "application/prs.nprend", - ".rdf-crypt": "application/prs.rdf-xml-crypt", - ".xsf": "application/prs.xsf+xml", - ".pskcxml": "application/pskc+xml", - ".rdf": "application/rdf+xml", - ".rif": "application/reginfo+xml", - ".rnc": "application/relax-ng-compact-syntax", - ".rld": "application/resource-lists-diff+xml", - ".rl": "application/resource-lists+xml", - ".rfcxml": "application/rfc+xml", - ".rs": "application/rls-services+xml", - ".gbr": "application/rpki-ghostbusters", - ".mft": "application/rpki-manifest", - ".roa": "application/rpki-roa", - ".rtf": "application/rtf", - ".scim": "application/scim+json", - ".scq": "application/scvp-cv-request", - ".scs": "application/scvp-cv-response", - ".spq": "application/scvp-vp-request", - ".spp": "application/scvp-vp-response", - ".sdp": "application/sdp", - ".soc": "application/sgml-open-catalog", - ".shf": "application/shf+xml", - ".siv": "application/sieve", - ".sieve": "application/sieve", - ".cl": "application/simple-filter+xml", - ".smil": "application/smil+xml", - ".smi": "application/smil+xml", - ".sml": "application/smil+xml", - ".rq": "application/sparql-query", - ".srx": "application/sparql-results+xml", - ".sql": "application/sql", - ".gram": "application/srgs", - ".grxml": "application/srgs+xml", - ".sru": "application/sru+xml", - ".ssml": "application/ssml+xml", - ".tau": "application/tamp-apex-update", - ".auc": "application/tamp-apex-update-confirm", - ".tcu": "application/tamp-community-update", - ".cuc": "application/tamp-community-update-confirm", - ".ter": "application/tamp-error", - ".tsa": "application/tamp-sequence-adjust", - ".sac": "application/tamp-sequence-adjust-confirm", - ".tur": "application/tamp-update", - ".tuc": "application/tamp-update-confirm", - ".tei": "application/tei+xml", - ".teiCorpus": "application/tei+xml", - ".odd": "application/tei+xml", - ".tfi": "application/thraud+xml", - ".tsq": "application/timestamp-query", - ".tsr": "application/timestamp-reply", - ".tsd": "application/timestamped-data", - ".trig": "application/trig", - ".ttml": "application/ttml+xml", - ".gsheet": "application/urc-grpsheet+xml", - ".rsheet": "application/urc-ressheet+xml", - ".td": "application/urc-targetdesc+xml", - ".uis": "application/urc-uisocketdesc+xml", - ".plb": "application/vnd.3gpp.pic-bw-large", - ".psb": "application/vnd.3gpp.pic-bw-small", - ".pvb": "application/vnd.3gpp.pic-bw-var", - ".sms": "application/vnd.3gpp2.sms", - ".tcap": "application/vnd.3gpp2.tcap", - ".imgcal": "application/vnd.3lightssoftware.imagescal", - ".pwn": "application/vnd.3M.Post-it-Notes", - ".aso": "application/vnd.accpac.simply.aso", - ".imp": "application/vnd.accpac.simply.imp", - ".acu": "application/vnd.acucobol", - ".atc": "application/vnd.acucorp", - ".acutc": "application/vnd.acucorp", - ".swf": "application/vnd.adobe.flash.movie", - ".fcdt": "application/vnd.adobe.formscentral.fcdt", - ".fxp": "application/vnd.adobe.fxp", - ".fxpl": "application/vnd.adobe.fxp", - ".xdp": "application/vnd.adobe.xdp+xml", - ".xfdf": "application/vnd.adobe.xfdf", - ".ahead": "application/vnd.ahead.space", - ".azf": "application/vnd.airzip.filesecure.azf", - ".azs": "application/vnd.airzip.filesecure.azs", - ".azw3": "application/vnd.amazon.mobi8-ebook", - ".acc": "application/vnd.americandynamics.acc", - ".ami": "application/vnd.amiga.ami", - ".apkg": "application/vnd.anki", - ".cii": "application/vnd.anser-web-certificate-issue-initiation", - ".fti": "application/vnd.anser-web-funds-transfer-initiation", - ".dist": "application/vnd.apple.installer+xml", - ".distz": "application/vnd.apple.installer+xml", - ".pkg": "application/vnd.apple.installer+xml", - ".mpkg": "application/vnd.apple.installer+xml", - ".m3u8": "application/vnd.apple.mpegurl", - ".swi": "application/vnd.aristanetworks.swi", - ".iota": "application/vnd.astraea-software.iota", - ".aep": "application/vnd.audiograph", - ".package": "application/vnd.autopackage", - ".bmml": "application/vnd.balsamiq.bmml+xml", - ".bmpr": "application/vnd.balsamiq.bmpr", - ".mpm": "application/vnd.blueice.multipass", - ".ep": "application/vnd.bluetooth.ep.oob", - ".le": "application/vnd.bluetooth.le.oob", - ".bmi": "application/vnd.bmi", - ".rep": "application/vnd.businessobjects", - ".tlclient": "application/vnd.cendio.thinlinc.clientconf", - ".cdxml": "application/vnd.chemdraw+xml", - ".pgn": "application/vnd.chess-pgn", - ".mmd": "application/vnd.chipnuts.karaoke-mmd", - ".cdy": "application/vnd.cinderella", - ".csl": "application/vnd.citationstyles.style+xml", - ".cla": "application/vnd.claymore", - ".rp9": "application/vnd.cloanto.rp9", - ".c4g": "application/vnd.clonk.c4group", - ".c4d": "application/vnd.clonk.c4group", - ".c4f": "application/vnd.clonk.c4group", - ".c4p": "application/vnd.clonk.c4group", - ".c4u": "application/vnd.clonk.c4group", - ".c11amc": "application/vnd.cluetrust.cartomobile-config", - ".c11amz": "application/vnd.cluetrust.cartomobile-config-pkg", - ".coffee": "application/vnd.coffeescript", - ".cbz": "application/vnd.comicbook+zip", - ".ica": "application/vnd.commerce-battelle", - ".icf": "application/vnd.commerce-battelle", - ".icd": "application/vnd.commerce-battelle", - ".ic0": "application/vnd.commerce-battelle", - ".ic1": "application/vnd.commerce-battelle", - ".ic2": "application/vnd.commerce-battelle", - ".ic3": "application/vnd.commerce-battelle", - ".ic4": "application/vnd.commerce-battelle", - ".ic5": "application/vnd.commerce-battelle", - ".ic6": "application/vnd.commerce-battelle", - ".ic7": "application/vnd.commerce-battelle", - ".ic8": "application/vnd.commerce-battelle", - ".csp": "application/vnd.commonspace", - ".cst": "application/vnd.commonspace", - ".cdbcmsg": "application/vnd.contact.cmsg", - ".ign": "application/vnd.coreos.ignition+json", - ".ignition": "application/vnd.coreos.ignition+json", - ".cmc": "application/vnd.cosmocaller", - ".clkx": "application/vnd.crick.clicker", - ".clkk": "application/vnd.crick.clicker.keyboard", - ".clkp": "application/vnd.crick.clicker.palette", - ".clkt": "application/vnd.crick.clicker.template", - ".clkw": "application/vnd.crick.clicker.wordbank", - ".wbs": "application/vnd.criticaltools.wbs+xml", - ".pml": "application/vnd.ctc-posml", - ".ppd": "application/vnd.cups-ppd", - ".curl": "application/vnd.curl", - ".dart": "application/vnd.dart", - ".rdz": "application/vnd.data-vision.rdz", - ".deb": "application/vnd.debian.binary-package", - ".udeb": "application/vnd.debian.binary-package", - ".uvf": "application/vnd.dece.data", - ".uvvf": "application/vnd.dece.data", - ".uvd": "application/vnd.dece.data", - ".uvvd": "application/vnd.dece.data", - ".uvt": "application/vnd.dece.ttml+xml", - ".uvvt": "application/vnd.dece.ttml+xml", - ".uvx": "application/vnd.dece.unspecified", - ".uvvx": "application/vnd.dece.unspecified", - ".uvz": "application/vnd.dece.zip", - ".uvvz": "application/vnd.dece.zip", - ".fe_launch": "application/vnd.denovo.fcselayout-link", - ".dsm": "application/vnd.desmume.movie", - ".dna": "application/vnd.dna", - ".docjson": "application/vnd.document+json", - ".scld": "application/vnd.doremir.scorecloud-binary-document", - ".dpg": "application/vnd.dpgraph", - ".mwc": "application/vnd.dpgraph", - ".dpgraph": "application/vnd.dpgraph", - ".dfac": "application/vnd.dreamfactory", - ".fla": "application/vnd.dtg.local.flash", - ".ait": "application/vnd.dvb.ait", - ".svc": "application/vnd.dvb.service", - ".geo": "application/vnd.dynageo", - ".dzr": "application/vnd.dzr", - ".mag": "application/vnd.ecowin.chart", - ".nml": "application/vnd.enliven", - ".esf": "application/vnd.epson.esf", - ".msf": "application/vnd.epson.msf", - ".qam": "application/vnd.epson.quickanime", - ".slt": "application/vnd.epson.salt", - ".ssf": "application/vnd.epson.ssf", - ".qcall": "application/vnd.ericsson.quickcall", - ".qca": "application/vnd.ericsson.quickcall", - ".espass": "application/vnd.espass-espass+zip", - ".es3": "application/vnd.eszigno3+xml", - ".et3": "application/vnd.eszigno3+xml", - ".asice": "application/vnd.etsi.asic-e+zip", - ".sce": "application/vnd.etsi.asic-e+zip", - ".asics": "application/vnd.etsi.asic-s+zip", - ".tst": "application/vnd.etsi.timestamp-token", - ".ez2": "application/vnd.ezpix-album", - ".ez3": "application/vnd.ezpix-package", - ".dim": "application/vnd.fastcopy-disk-image", - ".fdf": "application/vnd.fdf", - ".msd": "application/vnd.fdsn.mseed", - ".mseed": "application/vnd.fdsn.mseed", - ".seed": "application/vnd.fdsn.seed", - ".dataless": "application/vnd.fdsn.seed", - ".zfc": "application/vnd.filmit.zfc", - ".gph": "application/vnd.FloGraphIt", - ".ftc": "application/vnd.fluxtime.clip", - ".sfd": "application/vnd.font-fontforge-sfd", - ".fm": "application/vnd.framemaker", - ".fnc": "application/vnd.frogans.fnc", - ".ltf": "application/vnd.frogans.ltf", - ".fsc": "application/vnd.fsc.weblaunch", - ".oas": "application/vnd.fujitsu.oasys", - ".oa2": "application/vnd.fujitsu.oasys2", - ".oa3": "application/vnd.fujitsu.oasys3", - ".fg5": "application/vnd.fujitsu.oasysgp", - ".bh2": "application/vnd.fujitsu.oasysprs", - ".ddd": "application/vnd.fujixerox.ddd", - ".xdw": "application/vnd.fujixerox.docuworks", - ".xbd": "application/vnd.fujixerox.docuworks.binder", - ".xct": "application/vnd.fujixerox.docuworks.container", - ".fzs": "application/vnd.fuzzysheet", - ".txd": "application/vnd.genomatix.tuxedo", - ".g3": "application/vnd.geocube+xml", - ".g³": "application/vnd.geocube+xml", - ".ggb": "application/vnd.geogebra.file", - ".ggt": "application/vnd.geogebra.tool", - ".gex": "application/vnd.geometry-explorer", - ".gre": "application/vnd.geometry-explorer", - ".gxt": "application/vnd.geonext", - ".g2w": "application/vnd.geoplan", - ".g3w": "application/vnd.geospace", - ".gmx": "application/vnd.gmx", - ".kml": "application/vnd.google-earth.kml+xml", - ".kmz": "application/vnd.google-earth.kmz", - ".gqf": "application/vnd.grafeq", - ".gqs": "application/vnd.grafeq", - ".gac": "application/vnd.groove-account", - ".ghf": "application/vnd.groove-help", - ".gim": "application/vnd.groove-identity-message", - ".grv": "application/vnd.groove-injector", - ".gtm": "application/vnd.groove-tool-message", - ".tpl": "application/vnd.groove-tool-template", - ".vcg": "application/vnd.groove-vcard", - ".hal": "application/vnd.hal+xml", - ".zmm": "application/vnd.HandHeld-Entertainment+xml", - ".hbci": "application/vnd.hbci", - ".hbc": "application/vnd.hbci", - ".kom": "application/vnd.hbci", - ".upa": "application/vnd.hbci", - ".pkd": "application/vnd.hbci", - ".bpd": "application/vnd.hbci", - ".hdt": "application/vnd.hdt", - ".les": "application/vnd.hhe.lesson-player", - ".hpgl": "application/vnd.hp-HPGL", - ".hpi": "application/vnd.hp-hpid", - ".hpid": "application/vnd.hp-hpid", - ".hps": "application/vnd.hp-hps", - ".jlt": "application/vnd.hp-jlyt", - ".pcl": "application/vnd.hp-PCL", - ".sfd-hdstx": "application/vnd.hydrostatix.sof-data", - ".x3d": "application/vnd.hzn-3d-crossword", - ".emm": "application/vnd.ibm.electronic-media", - ".mpy": "application/vnd.ibm.MiniPay", - ".list3820": "application/vnd.ibm.modcap", - ".listafp": "application/vnd.ibm.modcap", - ".afp": "application/vnd.ibm.modcap", - ".pseg3820": "application/vnd.ibm.modcap", - ".irm": "application/vnd.ibm.rights-management", - ".sc": "application/vnd.ibm.secure-container", - ".icc": "application/vnd.iccprofile", - ".icm": "application/vnd.iccprofile", - ".1905.1": "application/vnd.ieee.1905", - ".igl": "application/vnd.igloader", - ".imf": "application/vnd.imagemeter.folder+zip", - ".imi": "application/vnd.imagemeter.image+zip", - ".ivp": "application/vnd.immervision-ivp", - ".ivu": "application/vnd.immervision-ivu", - ".imscc": "application/vnd.ims.imsccv1p1", - ".igm": "application/vnd.insors.igm", - ".xpw": "application/vnd.intercon.formnet", - ".xpx": "application/vnd.intercon.formnet", - ".i2g": "application/vnd.intergeo", - ".qbo": "application/vnd.intu.qbo", - ".qfx": "application/vnd.intu.qfx", - ".rcprofile": "application/vnd.ipunplugged.rcprofile", - ".irp": "application/vnd.irepository.package+xml", - ".xpr": "application/vnd.is-xpr", - ".fcs": "application/vnd.isac.fcs", - ".jam": "application/vnd.jam", - ".rms": "application/vnd.jcp.javame.midlet-rms", - ".jisp": "application/vnd.jisp", - ".joda": "application/vnd.joost.joda-archive", - ".ktz": "application/vnd.kahootz", - ".ktr": "application/vnd.kahootz", - ".karbon": "application/vnd.kde.karbon", - ".chrt": "application/vnd.kde.kchart", - ".kfo": "application/vnd.kde.kformula", - ".flw": "application/vnd.kde.kivio", - ".kon": "application/vnd.kde.kontour", - ".kpr": "application/vnd.kde.kpresenter", - ".kpt": "application/vnd.kde.kpresenter", - ".ksp": "application/vnd.kde.kspread", - ".kwd": "application/vnd.kde.kword", - ".kwt": "application/vnd.kde.kword", - ".htke": "application/vnd.kenameaapp", - ".kia": "application/vnd.kidspiration", - ".kne": "application/vnd.Kinar", - ".knp": "application/vnd.Kinar", - ".sdf": "application/vnd.Kinar", - ".skp": "application/vnd.koan", - ".skd": "application/vnd.koan", - ".skm": "application/vnd.koan", - ".skt": "application/vnd.koan", - ".sse": "application/vnd.kodak-descriptor", - ".lasjson": "application/vnd.las.las+json", - ".lasxml": "application/vnd.las.las+xml", - ".lbd": "application/vnd.llamagraphics.life-balance.desktop", - ".lbe": "application/vnd.llamagraphics.life-balance.exchange+xml", - ".123": "application/vnd.lotus-1-2-3", - ".wk4": "application/vnd.lotus-1-2-3", - ".wk3": "application/vnd.lotus-1-2-3", - ".wk1": "application/vnd.lotus-1-2-3", - ".apr": "application/vnd.lotus-approach", - ".vew": "application/vnd.lotus-approach", - ".prz": "application/vnd.lotus-freelance", - ".pre": "application/vnd.lotus-freelance", - ".nsf": "application/vnd.lotus-notes", - ".ntf": "application/vnd.lotus-notes", - ".ndl": "application/vnd.lotus-notes", - ".ns4": "application/vnd.lotus-notes", - ".ns3": "application/vnd.lotus-notes", - ".ns2": "application/vnd.lotus-notes", - ".nsh": "application/vnd.lotus-notes", - ".nsg": "application/vnd.lotus-notes", - ".or3": "application/vnd.lotus-organizer", - ".or2": "application/vnd.lotus-organizer", - ".org": "application/vnd.lotus-organizer", - ".scm": "application/vnd.lotus-screencam", - ".lwp": "application/vnd.lotus-wordpro", - ".sam": "application/vnd.lotus-wordpro", - ".portpkg": "application/vnd.macports.portpkg", - ".mvt": "application/vnd.mapbox-vector-tile", - ".mdc": "application/vnd.marlin.drm.mdcf", - ".mmdb": "application/vnd.maxmind.maxmind-db", - ".mcd": "application/vnd.mcd", - ".mc1": "application/vnd.medcalcdata", - ".cdkey": "application/vnd.mediastation.cdkey", - ".mwf": "application/vnd.MFER", - ".mfm": "application/vnd.mfmp", - ".flo": "application/vnd.micrografx.flo", - ".igx": "application/vnd.micrografx.igx", - ".mif": "application/vnd.mif", - ".daf": "application/vnd.Mobius.DAF", - ".dis": "application/vnd.Mobius.DIS", - ".mbk": "application/vnd.Mobius.MBK", - ".mqy": "application/vnd.Mobius.MQY", - ".msl": "application/vnd.Mobius.MSL", - ".plc": "application/vnd.Mobius.PLC", - ".txf": "application/vnd.Mobius.TXF", - ".mpn": "application/vnd.mophun.application", - ".mpc": "application/vnd.mophun.certificate", - ".xul": "application/vnd.mozilla.xul+xml", - ".3mf": "application/vnd.ms-3mfdocument", - ".cil": "application/vnd.ms-artgalry", - ".asf": "application/vnd.ms-asf", - ".cab": "application/vnd.ms-cab-compressed", - ".xls": "application/vnd.ms-excel", - ".xlm": "application/vnd.ms-excel", - ".xla": "application/vnd.ms-excel", - ".xlc": "application/vnd.ms-excel", - ".xlt": "application/vnd.ms-excel", - ".xlw": "application/vnd.ms-excel", - ".xltm": "application/vnd.ms-excel.template.macroEnabled.12", - ".xlam": "application/vnd.ms-excel.addin.macroEnabled.12", - ".xlsb": "application/vnd.ms-excel.sheet.binary.macroEnabled.12", - ".xlsm": "application/vnd.ms-excel.sheet.macroEnabled.12", - ".eot": "application/vnd.ms-fontobject", - ".chm": "application/vnd.ms-htmlhelp", - ".ims": "application/vnd.ms-ims", - ".lrm": "application/vnd.ms-lrm", - ".thmx": "application/vnd.ms-officetheme", - ".ppt": "application/vnd.ms-powerpoint", - ".pps": "application/vnd.ms-powerpoint", - ".pot": "application/vnd.ms-powerpoint", - ".ppam": "application/vnd.ms-powerpoint.addin.macroEnabled.12", - ".pptm": "application/vnd.ms-powerpoint.presentation.macroEnabled.12", - ".sldm": "application/vnd.ms-powerpoint.slide.macroEnabled.12", - ".ppsm": "application/vnd.ms-powerpoint.slideshow.macroEnabled.12", - ".potm": "application/vnd.ms-powerpoint.template.macroEnabled.12", - ".mpp": "application/vnd.ms-project", - ".mpt": "application/vnd.ms-project", - ".tnef": "application/vnd.ms-tnef", - ".tnf": "application/vnd.ms-tnef", - ".docm": "application/vnd.ms-word.document.macroEnabled.12", - ".dotm": "application/vnd.ms-word.template.macroEnabled.12", - ".wcm": "application/vnd.ms-works", - ".wdb": "application/vnd.ms-works", - ".wks": "application/vnd.ms-works", - ".wps": "application/vnd.ms-works", - ".wpl": "application/vnd.ms-wpl", - ".xps": "application/vnd.ms-xpsdocument", - ".msa": "application/vnd.msa-disk-image", - ".mseq": "application/vnd.mseq", - ".crtr": "application/vnd.multiad.creator", - ".cif": "application/vnd.multiad.creator.cif", - ".mus": "application/vnd.musician", - ".msty": "application/vnd.muvee.style", - ".taglet": "application/vnd.mynfc", - ".entity": "application/vnd.nervana", - ".request": "application/vnd.nervana", - ".bkm": "application/vnd.nervana", - ".kcm": "application/vnd.nervana", - ".nitf": "application/vnd.nitf", - ".nlu": "application/vnd.neurolanguage.nlu", - ".nds": "application/vnd.nintendo.nitro.rom", - ".sfc": "application/vnd.nintendo.snes.rom", - ".smc": "application/vnd.nintendo.snes.rom", - ".nnd": "application/vnd.noblenet-directory", - ".nns": "application/vnd.noblenet-sealer", - ".nnw": "application/vnd.noblenet-web", - ".ac": "application/vnd.nokia.n-gage.ac+xml", - ".ngdat": "application/vnd.nokia.n-gage.data", - ".n-gage": "application/vnd.nokia.n-gage.symbian.install", - ".rpst": "application/vnd.nokia.radio-preset", - ".rpss": "application/vnd.nokia.radio-presets", - ".edm": "application/vnd.novadigm.EDM", - ".edx": "application/vnd.novadigm.EDX", - ".ext": "application/vnd.novadigm.EXT", - ".odc": "application/vnd.oasis.opendocument.chart", - ".otc": "application/vnd.oasis.opendocument.chart-template", - ".odb": "application/vnd.oasis.opendocument.database", - ".odf": "application/vnd.oasis.opendocument.formula", - ".odg": "application/vnd.oasis.opendocument.graphics", - ".otg": "application/vnd.oasis.opendocument.graphics-template", - ".odi": "application/vnd.oasis.opendocument.image", - ".oti": "application/vnd.oasis.opendocument.image-template", - ".odp": "application/vnd.oasis.opendocument.presentation", - ".otp": "application/vnd.oasis.opendocument.presentation-template", - ".ods": "application/vnd.oasis.opendocument.spreadsheet", - ".ots": "application/vnd.oasis.opendocument.spreadsheet-template", - ".odt": "application/vnd.oasis.opendocument.text", - ".odm": "application/vnd.oasis.opendocument.text-master", - ".ott": "application/vnd.oasis.opendocument.text-template", - ".oth": "application/vnd.oasis.opendocument.text-web", - ".xo": "application/vnd.olpc-sugar", - ".dd2": "application/vnd.oma.dd2+xml", - ".tam": "application/vnd.onepager", - ".tamp": "application/vnd.onepagertamp", - ".tamx": "application/vnd.onepagertamx", - ".tat": "application/vnd.onepagertat", - ".tatp": "application/vnd.onepagertatp", - ".tatx": "application/vnd.onepagertatx", - ".obgx": "application/vnd.openblox.game+xml", - ".obg": "application/vnd.openblox.game-binary", - ".oeb": "application/vnd.openeye.oeb", - ".oxt": "application/vnd.openofficeorg.extension", - ".osm": "application/vnd.openstreetmap.data+xml", - ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation", - ".sldx": "application/vnd.openxmlformats-officedocument.presentationml.slide", - ".ppsx": "application/vnd.openxmlformats-officedocument.presentationml.slideshow", - ".potx": "application/vnd.openxmlformats-officedocument.presentationml.template", - ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", - ".xltx": "application/vnd.openxmlformats-officedocument.spreadsheetml.template", - ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document", - ".dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template", - ".ndc": "application/vnd.osa.netdeploy", - ".mgp": "application/vnd.osgeo.mapguide.package", - ".dp": "application/vnd.osgi.dp", - ".esa": "application/vnd.osgi.subsystem", - ".oxlicg": "application/vnd.oxli.countgraph", - ".prc": "application/vnd.palm", - ".pdb": "application/vnd.palm", - ".pqa": "application/vnd.palm", - ".oprc": "application/vnd.palm", - ".plp": "application/vnd.panoply", - ".paw": "application/vnd.pawaafile", - ".str": "application/vnd.pg.format", - ".ei6": "application/vnd.pg.osasli", - ".pil": "application/vnd.piaccess.application-license", - ".efif": "application/vnd.picsel", - ".wg": "application/vnd.pmi.widget", - ".plf": "application/vnd.pocketlearn", - ".pbd": "application/vnd.powerbuilder6", - ".preminet": "application/vnd.preminet", - ".box": "application/vnd.previewsystems.box", - ".vbox": "application/vnd.previewsystems.box", - ".mgz": "application/vnd.proteus.magazine", - ".qps": "application/vnd.publishare-delta-tree", - ".ptid": "application/vnd.pvi.ptid1", - ".bar": "application/vnd.qualcomm.brew-app-res", - ".qxd": "application/vnd.Quark.QuarkXPress", - ".qxt": "application/vnd.Quark.QuarkXPress", - ".qwd": "application/vnd.Quark.QuarkXPress", - ".qwt": "application/vnd.Quark.QuarkXPress", - ".qxl": "application/vnd.Quark.QuarkXPress", - ".qxb": "application/vnd.Quark.QuarkXPress", - ".quox": "application/vnd.quobject-quoxdocument", - ".quiz": "application/vnd.quobject-quoxdocument", - ".tree": "application/vnd.rainstor.data", - ".rar": "application/vnd.rar", - ".bed": "application/vnd.realvnc.bed", - ".mxl": "application/vnd.recordare.musicxml", - ".cryptonote": "application/vnd.rig.cryptonote", - ".link66": "application/vnd.route66.link66+xml", - ".st": "application/vnd.sailingtracker.track", - ".scd": "application/vnd.scribus", - ".sla": "application/vnd.scribus", - ".slaz": "application/vnd.scribus", - ".s3df": "application/vnd.sealed.3df", - ".scsf": "application/vnd.sealed.csf", - ".sdoc": "application/vnd.sealed.doc", - ".sdo": "application/vnd.sealed.doc", - ".s1w": "application/vnd.sealed.doc", - ".seml": "application/vnd.sealed.eml", - ".sem": "application/vnd.sealed.eml", - ".smht": "application/vnd.sealed.mht", - ".smh": "application/vnd.sealed.mht", - ".sppt": "application/vnd.sealed.ppt", - ".s1p": "application/vnd.sealed.ppt", - ".stif": "application/vnd.sealed.tiff", - ".sxls": "application/vnd.sealed.xls", - ".sxl": "application/vnd.sealed.xls", - ".s1e": "application/vnd.sealed.xls", - ".stml": "application/vnd.sealedmedia.softseal.html", - ".s1h": "application/vnd.sealedmedia.softseal.html", - ".spdf": "application/vnd.sealedmedia.softseal.pdf", - ".spd": "application/vnd.sealedmedia.softseal.pdf", - ".s1a": "application/vnd.sealedmedia.softseal.pdf", - ".see": "application/vnd.seemail", - ".sema": "application/vnd.sema", - ".semd": "application/vnd.semd", - ".semf": "application/vnd.semf", - ".ifm": "application/vnd.shana.informed.formdata", - ".itp": "application/vnd.shana.informed.formtemplate", - ".iif": "application/vnd.shana.informed.interchange", - ".ipk": "application/vnd.shana.informed.package", - ".twd": "application/vnd.SimTech-MindMapper", - ".twds": "application/vnd.SimTech-MindMapper", - ".mmf": "application/vnd.smaf", - ".notebook": "application/vnd.smart.notebook", - ".teacher": "application/vnd.smart.teacher", - ".fo": "application/vnd.software602.filler.form+xml", - ".zfo": "application/vnd.software602.filler.form-xml-zip", - ".sdkm": "application/vnd.solent.sdkm+xml", - ".sdkd": "application/vnd.solent.sdkm+xml", - ".dxp": "application/vnd.spotfire.dxp", - ".sfs": "application/vnd.spotfire.sfs", - ".smzip": "application/vnd.stepmania.package", - ".sm": "application/vnd.stepmania.stepchart", - ".wadl": "application/vnd.sun.wadl+xml", - ".sus": "application/vnd.sus-calendar", - ".susp": "application/vnd.sus-calendar", - ".xsm": "application/vnd.syncml+xml", - ".bdm": "application/vnd.syncml.dm+wbxml", - ".xdm": "application/vnd.syncml.dm+xml", - ".ddf": "application/vnd.syncml.dmddf+xml", - ".tao": "application/vnd.tao.intent-module-archive", - ".pcap": "application/vnd.tcpdump.pcap", - ".cap": "application/vnd.tcpdump.pcap", - ".dmp": "application/vnd.tcpdump.pcap", - ".qvd": "application/vnd.theqvd", - ".vfr": "application/vnd.tml", - ".viaframe": "application/vnd.tml", - ".tmo": "application/vnd.tmobile-livetv", - ".tpt": "application/vnd.trid.tpt", - ".mxs": "application/vnd.triscape.mxs", - ".tra": "application/vnd.trueapp", - ".ufdl": "application/vnd.ufdl", - ".ufd": "application/vnd.ufdl", - ".frm": "application/vnd.ufdl", - ".utz": "application/vnd.uiq.theme", - ".umj": "application/vnd.umajin", - ".unityweb": "application/vnd.unity", - ".uoml": "application/vnd.uoml+xml", - ".uo": "application/vnd.uoml+xml", - ".urim": "application/vnd.uri-map", - ".urimap": "application/vnd.uri-map", - ".vmt": "application/vnd.valve.source.material", - ".vcx": "application/vnd.vcx", - ".mxi": "application/vnd.vd-study", - ".study-inter": "application/vnd.vd-study", - ".model-inter": "application/vnd.vd-study", - ".vwx": "application/vnd.vectorworks", - ".vsc": "application/vnd.vidsoft.vidconference", - ".vsd": "application/vnd.visio", - ".vst": "application/vnd.visio", - ".vsw": "application/vnd.visio", - ".vss": "application/vnd.visio", - ".vis": "application/vnd.visionary", - ".vsf": "application/vnd.vsf", - ".sic": "application/vnd.wap.sic", - ".slc": "application/vnd.wap.slc", - ".wbxml": "application/vnd.wap.wbxml", - ".wmlc": "application/vnd.wap.wmlc", - ".wmlsc": "application/vnd.wap.wmlscriptc", - ".wtb": "application/vnd.webturbo", - ".p2p": "application/vnd.wfa.p2p", - ".wsc": "application/vnd.wfa.wsc", - ".wmc": "application/vnd.wmc", - ".m": "application/vnd.wolfram.mathematica.package", - ".nbp": "application/vnd.wolfram.player", - ".wpd": "application/vnd.wordperfect", - ".wqd": "application/vnd.wqd", - ".stf": "application/vnd.wt.stf", - ".wv": "application/vnd.wv.csp+wbxml", - ".xar": "application/vnd.xara", - ".xfdl": "application/vnd.xfdl", - ".xfd": "application/vnd.xfdl", - ".cpkg": "application/vnd.xmpie.cpkg", - ".dpkg": "application/vnd.xmpie.dpkg", - ".ppkg": "application/vnd.xmpie.ppkg", - ".xlim": "application/vnd.xmpie.xlim", - ".hvd": "application/vnd.yamaha.hv-dic", - ".hvs": "application/vnd.yamaha.hv-script", - ".hvp": "application/vnd.yamaha.hv-voice", - ".osf": "application/vnd.yamaha.openscoreformat", - ".saf": "application/vnd.yamaha.smaf-audio", - ".spf": "application/vnd.yamaha.smaf-phrase", - ".yme": "application/vnd.yaoweme", - ".cmp": "application/vnd.yellowriver-custom-menu", - ".zir": "application/vnd.zul", - ".zirz": "application/vnd.zul", - ".zaz": "application/vnd.zzazz.deck+xml", - ".vxml": "application/voicexml+xml", - ".wif": "application/watcherinfo+xml", - ".wgt": "application/widget", - ".wsdl": "application/wsdl+xml", - ".wspolicy": "application/wspolicy+xml", - ".xav": "application/xcap-att+xml", - ".xca": "application/xcap-caps+xml", - ".xdf": "application/xcap-diff+xml", - ".xel": "application/xcap-el+xml", - ".xer": "application/xcap-error+xml", - ".xns": "application/xcap-ns+xml", - ".xhtml": "application/xhtml+xml", - ".xhtm": "application/xhtml+xml", - ".xht": "application/xhtml+xml", - ".dtd": "application/xml-dtd", - ".xop": "application/xop+xml", - ".xsl": "application/xslt+xml", - ".xslt": "application/xslt+xml", - ".mxml": "application/xv+xml", - ".xhvml": "application/xv+xml", - ".xvml": "application/xv+xml", - ".xvm": "application/xv+xml", - ".yang": "application/yang", - ".yin": "application/yin+xml", - ".zip": "application/zip", - ".726": "audio/32kadpcm", - ".ac3": "audio/ac3", - ".amr": "audio/AMR", - ".awb": "audio/AMR-WB", - ".acn": "audio/asc", - ".aal": "audio/ATRAC-ADVANCED-LOSSLESS", - ".atx": "audio/ATRAC-X", - ".at3": "audio/ATRAC3", - ".aa3": "audio/ATRAC3", - ".omg": "audio/ATRAC3", - ".au": "audio/basic", - ".snd": "audio/basic", - ".dls": "audio/dls", - ".evc": "audio/EVRC", - ".evb": "audio/EVRCB", - ".enw": "audio/EVRCNW", - ".evw": "audio/EVRCWB", - ".lbc": "audio/iLBC", - ".l16": "audio/L16", - ".mxmf": "audio/mobile-xmf", - ".m4a": "audio/mp4", - ".mp3": "audio/mpeg", - ".mpga": "audio/mpeg", - ".mp1": "audio/mpeg", - ".mp2": "audio/mpeg", - ".oga": "audio/ogg", - ".ogg": "audio/ogg", - ".opus": "audio/ogg", - ".spx": "audio/ogg", - ".sid": "audio/prs.sid", - ".psid": "audio/prs.sid", - ".qcp": "audio/qcelp", - ".smv": "audio/SMV", - ".koz": "audio/vnd.audikoz", - ".uva": "audio/vnd.dece.audio", - ".uvva": "audio/vnd.dece.audio", - ".eol": "audio/vnd.digital-winds", - ".mlp": "audio/vnd.dolby.mlp", - ".dts": "audio/vnd.dts", - ".dtshd": "audio/vnd.dts.hd", - ".plj": "audio/vnd.everad.plj", - ".lvp": "audio/vnd.lucent.voice", - ".pya": "audio/vnd.ms-playready.media.pya", - ".vbk": "audio/vnd.nortel.vbk", - ".ecelp4800": "audio/vnd.nuera.ecelp4800", - ".ecelp7470": "audio/vnd.nuera.ecelp7470", - ".ecelp9600": "audio/vnd.nuera.ecelp9600", - ".rip": "audio/vnd.rip", - ".smp3": "audio/vnd.sealedmedia.softseal.mpeg", - ".smp": "audio/vnd.sealedmedia.softseal.mpeg", - ".s1m": "audio/vnd.sealedmedia.softseal.mpeg", - ".ttc": "font/collection", - ".otf": "font/otf", - ".ttf": "font/ttf", - ".woff": "font/woff", - ".woff2": "font/woff2", - ".bmp": "image/bmp", - ".dib": "image/bmp", - ".cgm": "image/cgm", - ".drle": "image/dicom-rle", - ".emf": "image/emf", - ".fits": "image/fits", - ".fit": "image/fits", - ".fts": "image/fits", - ".gif": "image/gif", - ".ief": "image/ief", - ".jls": "image/jls", - ".jp2": "image/jp2", - ".jpg2": "image/jp2", - ".jpg": "image/jpeg", - ".jpeg": "image/jpeg", - ".jpe": "image/jpeg", - ".jfif": "image/jpeg", - ".jpm": "image/jpm", - ".jpgm": "image/jpm", - ".jpx": "image/jpx", - ".jpf": "image/jpx", - ".ktx": "image/ktx", - ".png": "image/png", - ".btif": "image/prs.btif", - ".btf": "image/prs.btif", - ".pti": "image/prs.pti", - ".svg": "image/svg+xml", - ".svgz": "image/svg+xml", - ".t38": "image/t38", - ".tiff": "image/tiff", - ".tif": "image/tiff", - ".tfx": "image/tiff-fx", - ".psd": "image/vnd.adobe.photoshop", - ".azv": "image/vnd.airzip.accelerator.azv", - ".uvi": "image/vnd.dece.graphic", - ".uvvi": "image/vnd.dece.graphic", - ".uvg": "image/vnd.dece.graphic", - ".uvvg": "image/vnd.dece.graphic", - ".djvu": "image/vnd.djvu", - ".djv": "image/vnd.djvu", - ".dwg": "image/vnd.dwg", - ".dxf": "image/vnd.dxf", - ".fbs": "image/vnd.fastbidsheet", - ".fpx": "image/vnd.fpx", - ".fst": "image/vnd.fst", - ".mmr": "image/vnd.fujixerox.edmics-mmr", - ".rlc": "image/vnd.fujixerox.edmics-rlc", - ".pgb": "image/vnd.globalgraphics.pgb", - ".ico": "image/vnd.microsoft.icon", - ".apng": "image/vnd.mozilla.apng", - ".mdi": "image/vnd.ms-modi", - ".hdr": "image/vnd.radiance", - ".rgbe": "image/vnd.radiance", - ".xyze": "image/vnd.radiance", - ".spng": "image/vnd.sealed.png", - ".spn": "image/vnd.sealed.png", - ".s1n": "image/vnd.sealed.png", - ".sgif": "image/vnd.sealedmedia.softseal.gif", - ".sgi": "image/vnd.sealedmedia.softseal.gif", - ".s1g": "image/vnd.sealedmedia.softseal.gif", - ".sjpg": "image/vnd.sealedmedia.softseal.jpg", - ".sjp": "image/vnd.sealedmedia.softseal.jpg", - ".s1j": "image/vnd.sealedmedia.softseal.jpg", - ".tap": "image/vnd.tencent.tap", - ".vtf": "image/vnd.valve.source.texture", - ".wbmp": "image/vnd.wap.wbmp", - ".xif": "image/vnd.xiff", - ".pcx": "image/vnd.zbrush.pcx", - ".wmf": "image/wmf", - ".u8msg": "message/global", - ".u8dsn": "message/global-delivery-status", - ".u8mdn": "message/global-disposition-notification", - ".u8hdr": "message/global-headers", - ".eml": "message/rfc822", - ".mail": "message/rfc822", - ".art": "message/rfc822", - ".gltf": "model/gltf+json", - ".igs": "model/iges", - ".iges": "model/iges", - ".msh": "model/mesh", - ".mesh": "model/mesh", - ".silo": "model/mesh", - ".dae": "model/vnd.collada+xml", - ".dwf": "model/vnd.dwf", - ".gdl": "model/vnd.gdl", - ".gsm": "model/vnd.gdl", - ".win": "model/vnd.gdl", - ".dor": "model/vnd.gdl", - ".lmp": "model/vnd.gdl", - ".rsm": "model/vnd.gdl", - ".msm": "model/vnd.gdl", - ".ism": "model/vnd.gdl", - ".gtw": "model/vnd.gtw", - ".moml": "model/vnd.moml+xml", - ".mts": "model/vnd.mts", - ".ogex": "model/vnd.opengex", - ".x_b": "model/vnd.parasolid.transmit.binary", - ".xmt_bin": "model/vnd.parasolid.transmit.binary", - ".x_t": "model/vnd.parasolid.transmit.text", - ".xmt_txt": "model/vnd.parasolid.transmit.text", - ".bsp": "model/vnd.valve.source.compiled-map", - ".vtu": "model/vnd.vtu", - ".wrl": "model/vrml", - ".vrml": "model/vrml", - ".x3db": "model/x3d+xml", - ".x3dv": "model/x3d-vrml", - ".x3dvz": "model/x3d-vrml", - ".bmed": "multipart/vnd.bint.med-plus", - ".vpm": "multipart/voice-message", - ".appcache": "text/cache-manifest", - ".manifest": "text/cache-manifest", - ".ics": "text/calendar", - ".ifb": "text/calendar", - ".css": "text/css", - ".csv": "text/csv", - ".csvs": "text/csv-schema", - ".soa": "text/dns", - ".zone": "text/dns", - ".html": "text/html", - ".htm": "text/html", - ".cnd": "text/jcr-cnd", - ".markdown": "text/markdown", - ".md": "text/markdown", - ".miz": "text/mizar", - ".n3": "text/n3", - ".txt": "text/plain", - ".asc": "text/plain", - ".text": "text/plain", - ".pm": "text/plain", - ".el": "text/plain", - ".c": "text/plain", - ".h": "text/plain", - ".cc": "text/plain", - ".hh": "text/plain", - ".cxx": "text/plain", - ".hxx": "text/plain", - ".f90": "text/plain", - ".conf": "text/plain", - ".log": "text/plain", - ".provn": "text/provenance-notation", - ".rst": "text/prs.fallenstein.rst", - ".tag": "text/prs.lines.tag", - ".dsc": "text/prs.lines.tag", - ".rtx": "text/richtext", - ".sgml": "text/sgml", - ".sgm": "text/sgml", - ".tsv": "text/tab-separated-values", - ".t": "text/troff", - ".tr": "text/troff", - ".roff": "text/troff", - ".ttl": "text/turtle", - ".uris": "text/uri-list", - ".uri": "text/uri-list", - ".vcf": "text/vcard", - ".vcard": "text/vcard", - ".a": "text/vnd.a", - ".abc": "text/vnd.abc", - ".ascii": "text/vnd.ascii-art", - ".copyright": "text/vnd.debian.copyright", - ".dms": "text/vnd.DMClientScript", - ".sub": "text/vnd.dvb.subtitle", - ".jtd": "text/vnd.esmertec.theme-descriptor", - ".fly": "text/vnd.fly", - ".flx": "text/vnd.fmi.flexstor", - ".gv": "text/vnd.graphviz", - ".dot": "text/vnd.graphviz", - ".3dml": "text/vnd.in3d.3dml", - ".3dm": "text/vnd.in3d.3dml", - ".spot": "text/vnd.in3d.spot", - ".spo": "text/vnd.in3d.spot", - ".mpf": "text/vnd.ms-mediapackage", - ".ccc": "text/vnd.net2phone.commcenter.command", - ".uric": "text/vnd.si.uricatalogue", - ".jad": "text/vnd.sun.j2me.app-descriptor", - ".ts": "text/vnd.trolltech.linguist", - ".si": "text/vnd.wap.si", - ".sl": "text/vnd.wap.sl", - ".wml": "text/vnd.wap.wml", - ".wmls": "text/vnd.wap.wmlscript", - ".xml": "text/xml", - ".xsd": "text/xml", - ".rng": "text/xml", - ".ent": "text/xml-external-parsed-entity", - ".3gp": "video/3gpp", - ".3gpp": "video/3gpp", - ".3g2": "video/3gpp2", - ".3gpp2": "video/3gpp2", - ".m4s": "video/iso.segment", - ".mj2": "video/mj2", - ".mjp2": "video/mj2", - ".mp4": "video/mp4", - ".mpg4": "video/mp4", - ".m4v": "video/mp4", - ".mpeg": "video/mpeg", - ".mpg": "video/mpeg", - ".mpe": "video/mpeg", - ".m1v": "video/mpeg", - ".m2v": "video/mpeg", - ".ogv": "video/ogg", - ".mov": "video/quicktime", - ".qt": "video/quicktime", - ".uvh": "video/vnd.dece.hd", - ".uvvh": "video/vnd.dece.hd", - ".uvm": "video/vnd.dece.mobile", - ".uvvm": "video/vnd.dece.mobile", - ".uvu": "video/vnd.dece.mp4", - ".uvvu": "video/vnd.dece.mp4", - ".uvp": "video/vnd.dece.pd", - ".uvvp": "video/vnd.dece.pd", - ".uvs": "video/vnd.dece.sd", - ".uvvs": "video/vnd.dece.sd", - ".uvv": "video/vnd.dece.video", - ".uvvv": "video/vnd.dece.video", - ".dvb": "video/vnd.dvb.file", - ".fvt": "video/vnd.fvt", - ".mxu": "video/vnd.mpegurl", - ".m4u": "video/vnd.mpegurl", - ".pyv": "video/vnd.ms-playready.media.pyv", - ".nim": "video/vnd.nokia.interleaved-multimedia", - ".bik": "video/vnd.radgamettools.bink", - ".bk2": "video/vnd.radgamettools.bink", - ".smk": "video/vnd.radgamettools.smacker", - ".smpg": "video/vnd.sealed.mpeg1", - ".s11": "video/vnd.sealed.mpeg1", - ".s14": "video/vnd.sealed.mpeg4", - ".sswf": "video/vnd.sealed.swf", - ".ssw": "video/vnd.sealed.swf", - ".smov": "video/vnd.sealedmedia.softseal.mov", - ".smo": "video/vnd.sealedmedia.softseal.mov", - ".s1q": "video/vnd.sealedmedia.softseal.mov", - ".viv": "video/vnd.vivo", - ".cpt": "application/mac-compactpro", - ".metalink": "application/metalink+xml", - ".owx": "application/owl+xml", - ".rss": "application/rss+xml", - ".apk": "application/vnd.android.package-archive", - ".dd": "application/vnd.oma.dd+xml", - ".dcf": "application/vnd.oma.drm.content", - ".o4a": "application/vnd.oma.drm.dcf", - ".o4v": "application/vnd.oma.drm.dcf", - ".dm": "application/vnd.oma.drm.message", - ".drc": "application/vnd.oma.drm.rights+wbxml", - ".dr": "application/vnd.oma.drm.rights+xml", - ".sxc": "application/vnd.sun.xml.calc", - ".stc": "application/vnd.sun.xml.calc.template", - ".sxd": "application/vnd.sun.xml.draw", - ".std": "application/vnd.sun.xml.draw.template", - ".sxi": "application/vnd.sun.xml.impress", - ".sti": "application/vnd.sun.xml.impress.template", - ".sxm": "application/vnd.sun.xml.math", - ".sxw": "application/vnd.sun.xml.writer", - ".sxg": "application/vnd.sun.xml.writer.global", - ".stw": "application/vnd.sun.xml.writer.template", - ".sis": "application/vnd.symbian.install", - ".mms": "application/vnd.wap.mms-message", - ".anx": "application/x-annodex", - ".bcpio": "application/x-bcpio", - ".torrent": "application/x-bittorrent", - ".bz2": "application/x-bzip2", - ".vcd": "application/x-cdlink", - ".crx": "application/x-chrome-extension", - ".cpio": "application/x-cpio", - ".csh": "application/x-csh", - ".dcr": "application/x-director", - ".dir": "application/x-director", - ".dxr": "application/x-director", - ".dvi": "application/x-dvi", - ".spl": "application/x-futuresplash", - ".gtar": "application/x-gtar", - ".hdf": "application/x-hdf", - ".jar": "application/x-java-archive", - ".jnlp": "application/x-java-jnlp-file", - ".pack": "application/x-java-pack200", - ".kil": "application/x-killustrator", - ".latex": "application/x-latex", - ".nc": "application/x-netcdf", - ".cdf": "application/x-netcdf", - ".pl": "application/x-perl", - ".rpm": "application/x-rpm", - ".sh": "application/x-sh", - ".shar": "application/x-shar", - ".sit": "application/x-stuffit", - ".sv4cpio": "application/x-sv4cpio", - ".sv4crc": "application/x-sv4crc", - ".tar": "application/x-tar", - ".tcl": "application/x-tcl", - ".tex": "application/x-tex", - ".texinfo": "application/x-texinfo", - ".texi": "application/x-texinfo", - ".man": "application/x-troff-man", - ".1": "application/x-troff-man", - ".2": "application/x-troff-man", - ".3": "application/x-troff-man", - ".4": "application/x-troff-man", - ".5": "application/x-troff-man", - ".6": "application/x-troff-man", - ".7": "application/x-troff-man", - ".8": "application/x-troff-man", - ".me": "application/x-troff-me", - ".ms": "application/x-troff-ms", - ".ustar": "application/x-ustar", - ".src": "application/x-wais-source", - ".xpi": "application/x-xpinstall", - ".xspf": "application/x-xspf+xml", - ".xz": "application/x-xz", - ".mid": "audio/midi", - ".midi": "audio/midi", - ".kar": "audio/midi", - ".aif": "audio/x-aiff", - ".aiff": "audio/x-aiff", - ".aifc": "audio/x-aiff", - ".axa": "audio/x-annodex", - ".flac": "audio/x-flac", - ".mka": "audio/x-matroska", - ".mod": "audio/x-mod", - ".ult": "audio/x-mod", - ".uni": "audio/x-mod", - ".m15": "audio/x-mod", - ".mtm": "audio/x-mod", - ".669": "audio/x-mod", - ".med": "audio/x-mod", - ".m3u": "audio/x-mpegurl", - ".wax": "audio/x-ms-wax", - ".wma": "audio/x-ms-wma", - ".ram": "audio/x-pn-realaudio", - ".rm": "audio/x-pn-realaudio", - ".ra": "audio/x-realaudio", - ".s3m": "audio/x-s3m", - ".stm": "audio/x-stm", - ".wav": "audio/x-wav", - ".xyz": "chemical/x-xyz", - ".webp": "image/webp", - ".ras": "image/x-cmu-raster", - ".pnm": "image/x-portable-anymap", - ".pbm": "image/x-portable-bitmap", - ".pgm": "image/x-portable-graymap", - ".ppm": "image/x-portable-pixmap", - ".rgb": "image/x-rgb", - ".tga": "image/x-targa", - ".xbm": "image/x-xbitmap", - ".xpm": "image/x-xpixmap", - ".xwd": "image/x-xwindowdump", - ".sandboxed": "text/html-sandboxed", - ".pod": "text/x-pod", - ".etx": "text/x-setext", - ".webm": "video/webm", - ".axv": "video/x-annodex", - ".flv": "video/x-flv", - ".fxm": "video/x-javafx", - ".mkv": "video/x-matroska", - ".mk3d": "video/x-matroska-3d", - ".asx": "video/x-ms-asf", - ".wm": "video/x-ms-wm", - ".wmv": "video/x-ms-wmv", - ".wmx": "video/x-ms-wmx", - ".wvx": "video/x-ms-wvx", - ".avi": "video/x-msvideo", - ".movie": "video/x-sgi-movie", - ".ice": "x-conference/x-cooltalk", - ".sisx": "x-epoc/x-sisx-app", - } - for ext, name := range mimeTypes { - if err := mime.AddExtensionType(ext, name); err != nil { - panic(err) - } - } -} diff --git a/swarm/api/http/middleware.go b/swarm/api/http/middleware.go deleted file mode 100644 index 555c531047a4..000000000000 --- a/swarm/api/http/middleware.go +++ /dev/null @@ -1,113 +0,0 @@ -package http - -import ( - "fmt" - "net/http" - "runtime/debug" - "strings" - "time" - - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/swarm/api" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/sctx" - "github.com/nebulaai/nbai-node/swarm/spancontext" - "github.com/pborman/uuid" -) - -// Adapt chains h (main request handler) main handler to adapters (middleware handlers) -// Please note that the order of execution for `adapters` is FIFO (adapters[0] will be executed first) -func Adapt(h http.Handler, adapters ...Adapter) http.Handler { - for i := range adapters { - adapter := adapters[len(adapters)-1-i] - h = adapter(h) - } - return h -} - -type Adapter func(http.Handler) http.Handler - -func SetRequestID(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - r = r.WithContext(SetRUID(r.Context(), uuid.New()[:8])) - metrics.GetOrRegisterCounter(fmt.Sprintf("http.request.%s", r.Method), nil).Inc(1) - log.Info("created ruid for request", "ruid", GetRUID(r.Context()), "method", r.Method, "url", r.RequestURI) - - h.ServeHTTP(w, r) - }) -} - -func SetRequestHost(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - r = r.WithContext(sctx.SetHost(r.Context(), r.Host)) - log.Info("setting request host", "ruid", GetRUID(r.Context()), "host", sctx.GetHost(r.Context())) - - h.ServeHTTP(w, r) - }) -} - -func ParseURI(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - uri, err := api.Parse(strings.TrimLeft(r.URL.Path, "/")) - if err != nil { - w.WriteHeader(http.StatusBadRequest) - respondError(w, r, fmt.Sprintf("invalid URI %q", r.URL.Path), http.StatusBadRequest) - return - } - if uri.Addr != "" && strings.HasPrefix(uri.Addr, "0x") { - uri.Addr = strings.TrimPrefix(uri.Addr, "0x") - - msg := fmt.Sprintf(`The requested hash seems to be prefixed with '0x'. You will be redirected to the correct URL within 5 seconds.
- Please click here if your browser does not redirect you within 5 seconds.`, "/"+uri.String()) - w.WriteHeader(http.StatusNotFound) - w.Write([]byte(msg)) - return - } - - ctx := r.Context() - r = r.WithContext(SetURI(ctx, uri)) - log.Debug("parsed request path", "ruid", GetRUID(r.Context()), "method", r.Method, "uri.Addr", uri.Addr, "uri.Path", uri.Path, "uri.Scheme", uri.Scheme) - - h.ServeHTTP(w, r) - }) -} - -func InitLoggingResponseWriter(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - tn := time.Now() - - writer := newLoggingResponseWriter(w) - h.ServeHTTP(writer, r) - - ts := time.Since(tn) - log.Info("request served", "ruid", GetRUID(r.Context()), "code", writer.statusCode, "time", ts) - metrics.GetOrRegisterResettingTimer(fmt.Sprintf("http.request.%s.time", r.Method), nil).Update(ts) - metrics.GetOrRegisterResettingTimer(fmt.Sprintf("http.request.%s.%d.time", r.Method, writer.statusCode), nil).Update(ts) - }) -} - -func InstrumentOpenTracing(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - uri := GetURI(r.Context()) - if uri == nil || r.Method == "" || (uri != nil && uri.Scheme == "") { - h.ServeHTTP(w, r) // soft fail - return - } - spanName := fmt.Sprintf("http.%s.%s", r.Method, uri.Scheme) - ctx, sp := spancontext.StartSpan(r.Context(), spanName) - - defer sp.Finish() - h.ServeHTTP(w, r.WithContext(ctx)) - }) -} - -func RecoverPanic(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - defer func() { - if err := recover(); err != nil { - log.Error("panic recovery!", "stack trace", string(debug.Stack()), "url", r.URL.String(), "headers", r.Header) - } - }() - h.ServeHTTP(w, r) - }) -} diff --git a/swarm/api/http/response.go b/swarm/api/http/response.go deleted file mode 100644 index 728a76163860..000000000000 --- a/swarm/api/http/response.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package http - -import ( - "encoding/json" - "fmt" - "html/template" - "net/http" - "strings" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/swarm/api" -) - -var ( - htmlCounter = metrics.NewRegisteredCounter("api.http.errorpage.html.count", nil) - jsonCounter = metrics.NewRegisteredCounter("api.http.errorpage.json.count", nil) - plaintextCounter = metrics.NewRegisteredCounter("api.http.errorpage.plaintext.count", nil) -) - -type ResponseParams struct { - Msg template.HTML - Code int - Timestamp string - template *template.Template - Details template.HTML -} - -// ShowMultipleChoices 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) { - log.Debug("ShowMultipleChoices", "ruid", GetRUID(r.Context()), "uri", GetURI(r.Context())) - msg := "" - if list.Entries == nil { - respondError(w, r, "Could not resolve", http.StatusInternalServerError) - return - } - requestUri := strings.TrimPrefix(r.RequestURI, "/") - - uri, err := api.Parse(requestUri) - if err != nil { - respondError(w, r, "Bad Request", http.StatusBadRequest) - } - - uri.Scheme = "bzz-list" - msg += fmt.Sprintf("Disambiguation:
Your request may refer to multiple choices.
Click here if your browser does not redirect you within 5 seconds.
", "/"+uri.String()) - respondTemplate(w, r, "error", msg, http.StatusMultipleChoices) -} - -func respondTemplate(w http.ResponseWriter, r *http.Request, templateName, msg string, code int) { - log.Debug("respondTemplate", "ruid", GetRUID(r.Context()), "uri", GetURI(r.Context())) - respond(w, r, &ResponseParams{ - Code: code, - Msg: template.HTML(msg), - Timestamp: time.Now().Format(time.RFC1123), - template: TemplatesMap[templateName], - }) -} - -func respondError(w http.ResponseWriter, r *http.Request, msg string, code int) { - log.Info("respondError", "ruid", GetRUID(r.Context()), "uri", GetURI(r.Context()), "code", code) - respondTemplate(w, r, "error", msg, code) -} - -func respond(w http.ResponseWriter, r *http.Request, params *ResponseParams) { - w.WriteHeader(params.Code) - - if params.Code >= 400 { - w.Header().Del("Cache-Control") - w.Header().Del("ETag") - } - - acceptHeader := r.Header.Get("Accept") - // this cannot be in a switch since an Accept header can have multiple values: "Accept: */*, text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8" - if strings.Contains(acceptHeader, "application/json") { - if err := respondJSON(w, r, params); err != nil { - respondError(w, r, "Internal server error", http.StatusInternalServerError) - } - } else if strings.Contains(acceptHeader, "text/html") { - respondHTML(w, r, params) - } else { - respondPlaintext(w, r, params) //returns nice errors for curl - } -} - -func respondHTML(w http.ResponseWriter, r *http.Request, params *ResponseParams) { - htmlCounter.Inc(1) - log.Info("respondHTML", "ruid", GetRUID(r.Context()), "code", params.Code) - err := params.template.Execute(w, params) - if err != nil { - log.Error(err.Error()) - } -} - -func respondJSON(w http.ResponseWriter, r *http.Request, params *ResponseParams) error { - jsonCounter.Inc(1) - log.Info("respondJSON", "ruid", GetRUID(r.Context()), "code", params.Code) - w.Header().Set("Content-Type", "application/json") - return json.NewEncoder(w).Encode(params) -} - -func respondPlaintext(w http.ResponseWriter, r *http.Request, params *ResponseParams) error { - plaintextCounter.Inc(1) - log.Info("respondPlaintext", "ruid", GetRUID(r.Context()), "code", params.Code) - w.Header().Set("Content-Type", "text/plain") - strToWrite := "Code: " + fmt.Sprintf("%d", params.Code) + "\n" - strToWrite += "Message: " + string(params.Msg) + "\n" - strToWrite += "Timestamp: " + params.Timestamp + "\n" - _, err := w.Write([]byte(strToWrite)) - return err -} diff --git a/swarm/api/http/response_test.go b/swarm/api/http/response_test.go deleted file mode 100644 index 486c19ab0eed..000000000000 --- a/swarm/api/http/response_test.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package http - -import ( - "encoding/json" - "io/ioutil" - "net/http" - "strings" - "testing" - - "golang.org/x/net/html" -) - -func TestError(t *testing.T) { - srv := NewTestSwarmServer(t, serverFunc, nil) - 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 != 404 && !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 := NewTestSwarmServer(t, serverFunc, nil) - 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 := NewTestSwarmServer(t, serverFunc, nil) - 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 != 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 Test500PageWith0xHashPrefix(t *testing.T) { - srv := NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - var resp *http.Response - var respbody []byte - - url := srv.URL + "/bzz:/0xthisShouldFailWith500CodeAndAHelpfulMessage" - 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 { - t.Fatalf("Invalid Status Code received, expected 404, got %d", resp.StatusCode) - } - - if !strings.Contains(string(respbody), "The requested hash seems to be prefixed with") { - t.Fatalf("Did not receive the expected error message") - } - - _, 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 := NewTestSwarmServer(t, serverFunc, nil) - 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 != 404 { - t.Fatalf("Invalid Status Code received, expected 404, 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/roundtripper.go b/swarm/api/http/roundtripper.go deleted file mode 100644 index ea399e9c4e40..000000000000 --- a/swarm/api/http/roundtripper.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package http - -import ( - "fmt" - "net/http" - - "github.com/nebulaai/nbai-node/swarm/log" -) - -/* -http roundtripper to register for bzz url scheme -see https://github.com/ethereum/go-ethereum/issues/2040 -Usage: - -import ( - "github.com/ethereum/go-ethereum/common/httpclient" - "github.com/ethereum/go-ethereum/swarm/api/http" -) -client := httpclient.New() -// for (private) swarm proxy running locally -client.RegisterScheme("bzz", &http.RoundTripper{Port: port}) -client.RegisterScheme("bzz-immutable", &http.RoundTripper{Port: port}) -client.RegisterScheme("bzz-raw", &http.RoundTripper{Port: port}) - -The port you give the Roundtripper is the port the swarm proxy is listening on. -If Host is left empty, localhost is assumed. - -Using a public gateway, the above few lines gives you the leanest -bzz-scheme aware read-only http client. You really only ever need this -if you need go-native swarm access to bzz addresses. -*/ - -type RoundTripper struct { - Host string - Port string -} - -func (self *RoundTripper) RoundTrip(req *http.Request) (resp *http.Response, err error) { - host := self.Host - if len(host) == 0 { - host = "localhost" - } - url := fmt.Sprintf("http://%s:%s/%s:/%s/%s", host, self.Port, req.Proto, req.URL.Host, req.URL.Path) - log.Info(fmt.Sprintf("roundtripper: proxying request '%s' to '%s'", req.RequestURI, url)) - reqProxy, err := http.NewRequest(req.Method, url, req.Body) - if err != nil { - return nil, err - } - return http.DefaultClient.Do(reqProxy) -} diff --git a/swarm/api/http/roundtripper_test.go b/swarm/api/http/roundtripper_test.go deleted file mode 100644 index f99c4f35e058..000000000000 --- a/swarm/api/http/roundtripper_test.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package http - -import ( - "io/ioutil" - "net" - "net/http" - "net/http/httptest" - "strings" - "testing" - "time" -) - -func TestRoundTripper(t *testing.T) { - serveMux := http.NewServeMux() - serveMux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - if r.Method == "GET" { - w.Header().Set("Content-Type", "text/plain") - http.ServeContent(w, r, "", time.Unix(0, 0), strings.NewReader(r.RequestURI)) - } else { - http.Error(w, "Method "+r.Method+" is not supported.", http.StatusMethodNotAllowed) - } - }) - - srv := httptest.NewServer(serveMux) - defer srv.Close() - - host, port, _ := net.SplitHostPort(srv.Listener.Addr().String()) - rt := &RoundTripper{Host: host, Port: port} - trans := &http.Transport{} - trans.RegisterProtocol("bzz", rt) - client := &http.Client{Transport: trans} - resp, err := client.Get("bzz://test.com/path") - if err != nil { - t.Errorf("expected no error, got %v", err) - return - } - - defer func() { - if resp != nil { - resp.Body.Close() - } - }() - - content, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Errorf("expected no error, got %v", err) - return - } - if string(content) != "/HTTP/1.1:/test.com/path" { - t.Errorf("incorrect response from http server: expected '%v', got '%v'", "/HTTP/1.1:/test.com/path", string(content)) - } - -} diff --git a/swarm/api/http/sctx.go b/swarm/api/http/sctx.go deleted file mode 100644 index 7ca5a2ad9edf..000000000000 --- a/swarm/api/http/sctx.go +++ /dev/null @@ -1,34 +0,0 @@ -package http - -import ( - "context" - - "github.com/nebulaai/nbai-node/swarm/api" - "github.com/nebulaai/nbai-node/swarm/sctx" -) - -type uriKey struct{} - -func GetRUID(ctx context.Context) string { - v, ok := ctx.Value(sctx.HTTPRequestIDKey{}).(string) - if ok { - return v - } - return "xxxxxxxx" -} - -func SetRUID(ctx context.Context, ruid string) context.Context { - return context.WithValue(ctx, sctx.HTTPRequestIDKey{}, ruid) -} - -func GetURI(ctx context.Context) *api.URI { - v, ok := ctx.Value(uriKey{}).(*api.URI) - if ok { - return v - } - return nil -} - -func SetURI(ctx context.Context, uri *api.URI) context.Context { - return context.WithValue(ctx, uriKey{}, uri) -} diff --git a/swarm/api/http/server.go b/swarm/api/http/server.go deleted file mode 100644 index 950cd76cc7af..000000000000 --- a/swarm/api/http/server.go +++ /dev/null @@ -1,887 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -/* -A simple http server interface to Swarm -*/ -package http - -import ( - "bufio" - "bytes" - "encoding/json" - "fmt" - "io" - "io/ioutil" - "mime" - "mime/multipart" - "net/http" - "os" - "path" - "strconv" - "strings" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/swarm/api" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/storage/feed" - "github.com/rs/cors" -) - -var ( - postRawCount = metrics.NewRegisteredCounter("api.http.post.raw.count", nil) - postRawFail = metrics.NewRegisteredCounter("api.http.post.raw.fail", nil) - postFilesCount = metrics.NewRegisteredCounter("api.http.post.files.count", nil) - postFilesFail = metrics.NewRegisteredCounter("api.http.post.files.fail", nil) - deleteCount = metrics.NewRegisteredCounter("api.http.delete.count", nil) - deleteFail = metrics.NewRegisteredCounter("api.http.delete.fail", nil) - getCount = metrics.NewRegisteredCounter("api.http.get.count", nil) - getFail = metrics.NewRegisteredCounter("api.http.get.fail", nil) - getFileCount = metrics.NewRegisteredCounter("api.http.get.file.count", nil) - getFileNotFound = metrics.NewRegisteredCounter("api.http.get.file.notfound", nil) - getFileFail = metrics.NewRegisteredCounter("api.http.get.file.fail", nil) - getListCount = metrics.NewRegisteredCounter("api.http.get.list.count", nil) - getListFail = metrics.NewRegisteredCounter("api.http.get.list.fail", nil) -) - -type methodHandler map[string]http.Handler - -func (m methodHandler) ServeHTTP(rw http.ResponseWriter, r *http.Request) { - v, ok := m[r.Method] - if ok { - v.ServeHTTP(rw, r) - return - } - rw.WriteHeader(http.StatusMethodNotAllowed) -} - -func NewServer(api *api.API, corsString string) *Server { - var allowedOrigins []string - for _, domain := range strings.Split(corsString, ",") { - allowedOrigins = append(allowedOrigins, strings.TrimSpace(domain)) - } - c := cors.New(cors.Options{ - AllowedOrigins: allowedOrigins, - AllowedMethods: []string{http.MethodPost, http.MethodGet, http.MethodDelete, http.MethodPatch, http.MethodPut}, - MaxAge: 600, - AllowedHeaders: []string{"*"}, - }) - - server := &Server{api: api} - - defaultMiddlewares := []Adapter{ - RecoverPanic, - SetRequestID, - SetRequestHost, - InitLoggingResponseWriter, - ParseURI, - InstrumentOpenTracing, - } - - mux := http.NewServeMux() - mux.Handle("/bzz:/", methodHandler{ - "GET": Adapt( - http.HandlerFunc(server.HandleBzzGet), - defaultMiddlewares..., - ), - "POST": Adapt( - http.HandlerFunc(server.HandlePostFiles), - defaultMiddlewares..., - ), - "DELETE": Adapt( - http.HandlerFunc(server.HandleDelete), - defaultMiddlewares..., - ), - }) - mux.Handle("/bzz-raw:/", methodHandler{ - "GET": Adapt( - http.HandlerFunc(server.HandleGet), - defaultMiddlewares..., - ), - "POST": Adapt( - http.HandlerFunc(server.HandlePostRaw), - defaultMiddlewares..., - ), - }) - mux.Handle("/bzz-immutable:/", methodHandler{ - "GET": Adapt( - http.HandlerFunc(server.HandleBzzGet), - defaultMiddlewares..., - ), - }) - mux.Handle("/bzz-hash:/", methodHandler{ - "GET": Adapt( - http.HandlerFunc(server.HandleGet), - defaultMiddlewares..., - ), - }) - mux.Handle("/bzz-list:/", methodHandler{ - "GET": Adapt( - http.HandlerFunc(server.HandleGetList), - defaultMiddlewares..., - ), - }) - mux.Handle("/bzz-feed:/", methodHandler{ - "GET": Adapt( - http.HandlerFunc(server.HandleGetFeed), - defaultMiddlewares..., - ), - "POST": Adapt( - http.HandlerFunc(server.HandlePostFeed), - defaultMiddlewares..., - ), - }) - - mux.Handle("/", methodHandler{ - "GET": Adapt( - http.HandlerFunc(server.HandleRootPaths), - SetRequestID, - InitLoggingResponseWriter, - ), - }) - server.Handler = c.Handler(mux) - - return server -} - -func (s *Server) ListenAndServe(addr string) error { - s.listenAddr = addr - return http.ListenAndServe(addr, s) -} - -// browser API for registering bzz url scheme handlers: -// https://developer.mozilla.org/en/docs/Web-based_protocol_handlers -// electron (chromium) api for registering bzz url scheme handlers: -// https://github.com/atom/electron/blob/master/docs/api/protocol.md -type Server struct { - http.Handler - api *api.API - listenAddr string -} - -func (s *Server) HandleBzzGet(w http.ResponseWriter, r *http.Request) { - log.Debug("handleBzzGet", "ruid", GetRUID(r.Context()), "uri", r.RequestURI) - if r.Header.Get("Accept") == "application/x-tar" { - uri := GetURI(r.Context()) - _, credentials, _ := r.BasicAuth() - reader, err := s.api.GetDirectoryTar(r.Context(), s.api.Decryptor(r.Context(), credentials), uri) - if err != nil { - if isDecryptError(err) { - w.Header().Set("WWW-Authenticate", fmt.Sprintf("Basic realm=%q", uri.Address().String())) - respondError(w, r, err.Error(), http.StatusUnauthorized) - return - } - respondError(w, r, fmt.Sprintf("Had an error building the tarball: %v", err), http.StatusInternalServerError) - return - } - defer reader.Close() - - w.Header().Set("Content-Type", "application/x-tar") - - fileName := uri.Addr - if found := path.Base(uri.Path); found != "" && found != "." && found != "/" { - fileName = found - } - w.Header().Set("Content-Disposition", fmt.Sprintf("inline; filename=\"%s.tar\"", fileName)) - - w.WriteHeader(http.StatusOK) - io.Copy(w, reader) - return - } - - s.HandleGetFile(w, r) -} - -func (s *Server) HandleRootPaths(w http.ResponseWriter, r *http.Request) { - switch r.RequestURI { - case "/": - respondTemplate(w, r, "landing-page", "Swarm: Please request a valid ENS or swarm hash with the appropriate bzz scheme", 200) - return - case "/robots.txt": - w.Header().Set("Last-Modified", time.Now().Format(http.TimeFormat)) - fmt.Fprintf(w, "User-agent: *\nDisallow: /") - case "/favicon.ico": - w.WriteHeader(http.StatusOK) - w.Write(faviconBytes) - default: - respondError(w, r, "Not Found", http.StatusNotFound) - } -} - -// HandlePostRaw handles a POST request to a raw bzz-raw:/ URI, stores the request -// body in swarm and returns the resulting storage address as a text/plain response -func (s *Server) HandlePostRaw(w http.ResponseWriter, r *http.Request) { - ruid := GetRUID(r.Context()) - log.Debug("handle.post.raw", "ruid", ruid) - - postRawCount.Inc(1) - - toEncrypt := false - uri := GetURI(r.Context()) - if uri.Addr == "encrypt" { - toEncrypt = true - } - - if uri.Path != "" { - postRawFail.Inc(1) - respondError(w, r, "raw POST request cannot contain a path", http.StatusBadRequest) - return - } - - if uri.Addr != "" && uri.Addr != "encrypt" { - postRawFail.Inc(1) - respondError(w, r, "raw POST request addr can only be empty or \"encrypt\"", http.StatusBadRequest) - return - } - - if r.Header.Get("Content-Length") == "" { - postRawFail.Inc(1) - respondError(w, r, "missing Content-Length header in request", http.StatusBadRequest) - return - } - - addr, _, err := s.api.Store(r.Context(), r.Body, r.ContentLength, toEncrypt) - if err != nil { - postRawFail.Inc(1) - respondError(w, r, err.Error(), http.StatusInternalServerError) - return - } - - log.Debug("stored content", "ruid", ruid, "key", addr) - - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(http.StatusOK) - fmt.Fprint(w, addr) -} - -// HandlePostFiles handles a POST request to -// bzz:// which contains either a single file or multiple files -// (either a tar archive or multipart form), adds those files either to an -// existing manifest or to a new manifest under and returns the -// resulting manifest hash as a text/plain response -func (s *Server) HandlePostFiles(w http.ResponseWriter, r *http.Request) { - ruid := GetRUID(r.Context()) - log.Debug("handle.post.files", "ruid", ruid) - postFilesCount.Inc(1) - - contentType, params, err := mime.ParseMediaType(r.Header.Get("Content-Type")) - if err != nil { - postFilesFail.Inc(1) - respondError(w, r, err.Error(), http.StatusBadRequest) - return - } - - toEncrypt := false - uri := GetURI(r.Context()) - if uri.Addr == "encrypt" { - toEncrypt = true - } - - var addr storage.Address - if uri.Addr != "" && uri.Addr != "encrypt" { - addr, err = s.api.Resolve(r.Context(), uri.Addr) - if err != nil { - postFilesFail.Inc(1) - respondError(w, r, fmt.Sprintf("cannot resolve %s: %s", uri.Addr, err), http.StatusInternalServerError) - return - } - log.Debug("resolved key", "ruid", ruid, "key", addr) - } else { - addr, err = s.api.NewManifest(r.Context(), toEncrypt) - if err != nil { - postFilesFail.Inc(1) - respondError(w, r, err.Error(), http.StatusInternalServerError) - return - } - log.Debug("new manifest", "ruid", ruid, "key", addr) - } - - newAddr, err := s.api.UpdateManifest(r.Context(), addr, func(mw *api.ManifestWriter) error { - switch contentType { - case "application/x-tar": - _, err := s.handleTarUpload(r, mw) - if err != nil { - respondError(w, r, fmt.Sprintf("error uploading tarball: %v", err), http.StatusInternalServerError) - return err - } - return nil - case "multipart/form-data": - return s.handleMultipartUpload(r, params["boundary"], mw) - - default: - return s.handleDirectUpload(r, mw) - } - }) - if err != nil { - postFilesFail.Inc(1) - respondError(w, r, fmt.Sprintf("cannot create manifest: %s", err), http.StatusInternalServerError) - return - } - - log.Debug("stored content", "ruid", ruid, "key", newAddr) - - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(http.StatusOK) - fmt.Fprint(w, newAddr) -} - -func (s *Server) handleTarUpload(r *http.Request, mw *api.ManifestWriter) (storage.Address, error) { - log.Debug("handle.tar.upload", "ruid", GetRUID(r.Context())) - - defaultPath := r.URL.Query().Get("defaultpath") - - key, err := s.api.UploadTar(r.Context(), r.Body, GetURI(r.Context()).Path, defaultPath, mw) - if err != nil { - return nil, err - } - return key, nil -} - -func (s *Server) handleMultipartUpload(r *http.Request, boundary string, mw *api.ManifestWriter) error { - ruid := GetRUID(r.Context()) - log.Debug("handle.multipart.upload", "ruid", ruid) - mr := multipart.NewReader(r.Body, boundary) - for { - part, err := mr.NextPart() - if err == io.EOF { - return nil - } else if err != nil { - return fmt.Errorf("error reading multipart form: %s", err) - } - - var size int64 - var reader io.Reader - if contentLength := part.Header.Get("Content-Length"); contentLength != "" { - size, err = strconv.ParseInt(contentLength, 10, 64) - if err != nil { - return fmt.Errorf("error parsing multipart content length: %s", err) - } - reader = part - } else { - // copy the part to a tmp file to get its size - tmp, err := ioutil.TempFile("", "swarm-multipart") - if err != nil { - return err - } - defer os.Remove(tmp.Name()) - defer tmp.Close() - size, err = io.Copy(tmp, part) - if err != nil { - return fmt.Errorf("error copying multipart content: %s", err) - } - if _, err := tmp.Seek(0, io.SeekStart); err != nil { - return fmt.Errorf("error copying multipart content: %s", err) - } - reader = tmp - } - - // add the entry under the path from the request - name := part.FileName() - if name == "" { - name = part.FormName() - } - uri := GetURI(r.Context()) - path := path.Join(uri.Path, name) - entry := &api.ManifestEntry{ - Path: path, - ContentType: part.Header.Get("Content-Type"), - Size: size, - } - log.Debug("adding path to new manifest", "ruid", ruid, "bytes", entry.Size, "path", entry.Path) - contentKey, err := mw.AddEntry(r.Context(), reader, entry) - if err != nil { - return fmt.Errorf("error adding manifest entry from multipart form: %s", err) - } - log.Debug("stored content", "ruid", ruid, "key", contentKey) - } -} - -func (s *Server) handleDirectUpload(r *http.Request, mw *api.ManifestWriter) error { - ruid := GetRUID(r.Context()) - log.Debug("handle.direct.upload", "ruid", ruid) - key, err := mw.AddEntry(r.Context(), r.Body, &api.ManifestEntry{ - Path: GetURI(r.Context()).Path, - ContentType: r.Header.Get("Content-Type"), - Mode: 0644, - Size: r.ContentLength, - }) - if err != nil { - return err - } - log.Debug("stored content", "ruid", ruid, "key", key) - return nil -} - -// HandleDelete handles a DELETE request to bzz://, removes -// from and returns the resulting manifest hash as a -// text/plain response -func (s *Server) HandleDelete(w http.ResponseWriter, r *http.Request) { - ruid := GetRUID(r.Context()) - uri := GetURI(r.Context()) - log.Debug("handle.delete", "ruid", ruid) - deleteCount.Inc(1) - newKey, err := s.api.Delete(r.Context(), uri.Addr, uri.Path) - if err != nil { - deleteFail.Inc(1) - respondError(w, r, fmt.Sprintf("could not delete from manifest: %v", err), http.StatusInternalServerError) - return - } - - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(http.StatusOK) - fmt.Fprint(w, newKey) -} - -// Handles feed manifest creation and feed updates -// The POST request admits a JSON structure as defined in the feeds package: `feed.updateRequestJSON` -// The requests can be to a) create a feed manifest, b) update a feed or c) both a+b: create a feed manifest and publish a first update -func (s *Server) HandlePostFeed(w http.ResponseWriter, r *http.Request) { - ruid := GetRUID(r.Context()) - uri := GetURI(r.Context()) - log.Debug("handle.post.feed", "ruid", ruid) - var err error - - // Creation and update must send feed.updateRequestJSON JSON structure - body, err := ioutil.ReadAll(r.Body) - if err != nil { - respondError(w, r, err.Error(), http.StatusInternalServerError) - return - } - - fd, err := s.api.ResolveFeed(r.Context(), uri, r.URL.Query()) - if err != nil { // couldn't parse query string or retrieve manifest - getFail.Inc(1) - httpStatus := http.StatusBadRequest - if err == api.ErrCannotLoadFeedManifest || err == api.ErrCannotResolveFeedURI { - httpStatus = http.StatusNotFound - } - respondError(w, r, fmt.Sprintf("cannot retrieve feed from manifest: %s", err), httpStatus) - return - } - - var updateRequest feed.Request - updateRequest.Feed = *fd - query := r.URL.Query() - - if err := updateRequest.FromValues(query, body); err != nil { // decodes request from query parameters - respondError(w, r, err.Error(), http.StatusBadRequest) - return - } - - switch { - case updateRequest.IsUpdate(): - // Verify that the signature is intact and that the signer is authorized - // to update this feed - // Check this early, to avoid creating a feed and then not being able to set its first update. - if err = updateRequest.Verify(); err != nil { - respondError(w, r, err.Error(), http.StatusForbidden) - return - } - _, err = s.api.FeedsUpdate(r.Context(), &updateRequest) - if err != nil { - respondError(w, r, err.Error(), http.StatusInternalServerError) - return - } - fallthrough - case query.Get("manifest") == "1": - // we create a manifest so we can retrieve feed updates with bzz:// later - // this manifest has a special "feed type" manifest, and saves the - // feed identification used to retrieve feed updates later - m, err := s.api.NewFeedManifest(r.Context(), &updateRequest.Feed) - if err != nil { - respondError(w, r, fmt.Sprintf("failed to create feed manifest: %v", err), http.StatusInternalServerError) - return - } - // the key to the manifest will be passed back to the client - // the client can access the feed directly through its Feed member - // the manifest key can be set as content in the resolver of the ENS name - outdata, err := json.Marshal(m) - if err != nil { - respondError(w, r, fmt.Sprintf("failed to create json response: %s", err), http.StatusInternalServerError) - return - } - fmt.Fprint(w, string(outdata)) - - w.Header().Add("Content-type", "application/json") - default: - respondError(w, r, "Missing signature in feed update request", http.StatusBadRequest) - } -} - -// HandleGetFeed retrieves Swarm feeds updates: -// bzz-feed:// - get latest feed update, given a manifest address -// - or - -// specify user + topic (optional), subtopic name (optional) directly, without manifest: -// bzz-feed://?user=0x...&topic=0x...&name=subtopic name -// topic defaults to 0x000... if not specified. -// name defaults to empty string if not specified. -// thus, empty name and topic refers to the user's default feed. -// -// Optional parameters: -// time=xx - get the latest update before time (in epoch seconds) -// hint.time=xx - hint the lookup algorithm looking for updates at around that time -// hint.level=xx - hint the lookup algorithm looking for updates at around this frequency level -// meta=1 - get feed metadata and status information instead of performing a feed query -// NOTE: meta=1 will be deprecated in the near future -func (s *Server) HandleGetFeed(w http.ResponseWriter, r *http.Request) { - ruid := GetRUID(r.Context()) - uri := GetURI(r.Context()) - log.Debug("handle.get.feed", "ruid", ruid) - var err error - - fd, err := s.api.ResolveFeed(r.Context(), uri, r.URL.Query()) - if err != nil { // couldn't parse query string or retrieve manifest - getFail.Inc(1) - httpStatus := http.StatusBadRequest - if err == api.ErrCannotLoadFeedManifest || err == api.ErrCannotResolveFeedURI { - httpStatus = http.StatusNotFound - } - respondError(w, r, fmt.Sprintf("cannot retrieve feed information from manifest: %s", err), httpStatus) - return - } - - // determine if the query specifies period and version or it is a metadata query - if r.URL.Query().Get("meta") == "1" { - unsignedUpdateRequest, err := s.api.FeedsNewRequest(r.Context(), fd) - if err != nil { - getFail.Inc(1) - respondError(w, r, fmt.Sprintf("cannot retrieve feed metadata for feed=%s: %s", fd.Hex(), err), http.StatusNotFound) - return - } - rawResponse, err := unsignedUpdateRequest.MarshalJSON() - if err != nil { - respondError(w, r, fmt.Sprintf("cannot encode unsigned feed update request: %v", err), http.StatusInternalServerError) - return - } - w.Header().Add("Content-type", "application/json") - w.WriteHeader(http.StatusOK) - fmt.Fprint(w, string(rawResponse)) - return - } - - lookupParams := &feed.Query{Feed: *fd} - if err = lookupParams.FromValues(r.URL.Query()); err != nil { // parse period, version - respondError(w, r, fmt.Sprintf("invalid feed update request:%s", err), http.StatusBadRequest) - return - } - - data, err := s.api.FeedsLookup(r.Context(), lookupParams) - - // any error from the switch statement will end up here - if err != nil { - code, err2 := s.translateFeedError(w, r, "feed lookup fail", err) - respondError(w, r, err2.Error(), code) - return - } - - // All ok, serve the retrieved update - log.Debug("Found update", "feed", fd.Hex(), "ruid", ruid) - w.Header().Set("Content-Type", api.MimeOctetStream) - http.ServeContent(w, r, "", time.Now(), bytes.NewReader(data)) -} - -func (s *Server) translateFeedError(w http.ResponseWriter, r *http.Request, supErr string, err error) (int, error) { - code := 0 - defaultErr := fmt.Errorf("%s: %v", supErr, err) - rsrcErr, ok := err.(*feed.Error) - if !ok && rsrcErr != nil { - code = rsrcErr.Code() - } - switch code { - case storage.ErrInvalidValue: - return http.StatusBadRequest, defaultErr - case storage.ErrNotFound, storage.ErrNotSynced, storage.ErrNothingToReturn, storage.ErrInit: - return http.StatusNotFound, defaultErr - case storage.ErrUnauthorized, storage.ErrInvalidSignature: - return http.StatusUnauthorized, defaultErr - case storage.ErrDataOverflow: - return http.StatusRequestEntityTooLarge, defaultErr - } - - return http.StatusInternalServerError, defaultErr -} - -// HandleGet handles a GET request to -// - bzz-raw:// and responds with the raw content stored at the -// given storage key -// - bzz-hash:// and responds with the hash of the content stored -// at the given storage key as a text/plain response -func (s *Server) HandleGet(w http.ResponseWriter, r *http.Request) { - ruid := GetRUID(r.Context()) - uri := GetURI(r.Context()) - log.Debug("handle.get", "ruid", ruid, "uri", uri) - getCount.Inc(1) - _, pass, _ := r.BasicAuth() - - addr, err := s.api.ResolveURI(r.Context(), uri, pass) - if err != nil { - getFail.Inc(1) - respondError(w, r, fmt.Sprintf("cannot resolve %s: %s", uri.Addr, err), http.StatusNotFound) - return - } - w.Header().Set("Cache-Control", "max-age=2147483648, immutable") // url was of type bzz:///path, so we are sure it is immutable. - - log.Debug("handle.get: resolved", "ruid", ruid, "key", addr) - - // if path is set, interpret as a manifest and return the - // raw entry at the given path - - etag := common.Bytes2Hex(addr) - noneMatchEtag := r.Header.Get("If-None-Match") - w.Header().Set("ETag", fmt.Sprintf("%q", etag)) // set etag to manifest key or raw entry key. - if noneMatchEtag != "" { - if bytes.Equal(storage.Address(common.Hex2Bytes(noneMatchEtag)), addr) { - w.WriteHeader(http.StatusNotModified) - return - } - } - - // check the root chunk exists by retrieving the file's size - reader, isEncrypted := s.api.Retrieve(r.Context(), addr) - if _, err := reader.Size(r.Context(), nil); err != nil { - getFail.Inc(1) - respondError(w, r, fmt.Sprintf("root chunk not found %s: %s", addr, err), http.StatusNotFound) - return - } - - w.Header().Set("X-Decrypted", fmt.Sprintf("%v", isEncrypted)) - - switch { - case uri.Raw(): - // allow the request to overwrite the content type using a query - // parameter - if typ := r.URL.Query().Get("content_type"); typ != "" { - w.Header().Set("Content-Type", typ) - } - http.ServeContent(w, r, "", time.Now(), reader) - case uri.Hash(): - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(http.StatusOK) - fmt.Fprint(w, addr) - } -} - -// HandleGetList handles a GET request to bzz-list:// and returns -// a list of all files contained in under grouped into -// common prefixes using "/" as a delimiter -func (s *Server) HandleGetList(w http.ResponseWriter, r *http.Request) { - ruid := GetRUID(r.Context()) - uri := GetURI(r.Context()) - _, credentials, _ := r.BasicAuth() - log.Debug("handle.get.list", "ruid", ruid, "uri", uri) - getListCount.Inc(1) - - // ensure the root path has a trailing slash so that relative URLs work - if uri.Path == "" && !strings.HasSuffix(r.URL.Path, "/") { - http.Redirect(w, r, r.URL.Path+"/", http.StatusMovedPermanently) - return - } - - addr, err := s.api.Resolve(r.Context(), uri.Addr) - if err != nil { - getListFail.Inc(1) - respondError(w, r, fmt.Sprintf("cannot resolve %s: %s", uri.Addr, err), http.StatusNotFound) - return - } - log.Debug("handle.get.list: resolved", "ruid", ruid, "key", addr) - - list, err := s.api.GetManifestList(r.Context(), s.api.Decryptor(r.Context(), credentials), addr, uri.Path) - if err != nil { - getListFail.Inc(1) - if isDecryptError(err) { - w.Header().Set("WWW-Authenticate", fmt.Sprintf("Basic realm=%q", addr.String())) - respondError(w, r, err.Error(), http.StatusUnauthorized) - return - } - respondError(w, r, err.Error(), http.StatusInternalServerError) - 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 := TemplatesMap["bzz-list"].Execute(w, &htmlListData{ - URI: &api.URI{ - Scheme: "bzz", - Addr: uri.Addr, - Path: uri.Path, - }, - List: &list, - }) - if err != nil { - getListFail.Inc(1) - log.Error(fmt.Sprintf("error rendering list HTML: %s", err)) - } - return - } - - w.Header().Set("Content-Type", "application/json") - json.NewEncoder(w).Encode(&list) -} - -// 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 *http.Request) { - ruid := GetRUID(r.Context()) - uri := GetURI(r.Context()) - _, credentials, _ := r.BasicAuth() - log.Debug("handle.get.file", "ruid", ruid, "uri", r.RequestURI) - getFileCount.Inc(1) - - // ensure the root path has a trailing slash so that relative URLs work - if uri.Path == "" && !strings.HasSuffix(r.URL.Path, "/") { - http.Redirect(w, r, r.URL.Path+"/", http.StatusMovedPermanently) - return - } - var err error - manifestAddr := uri.Address() - - if manifestAddr == nil { - manifestAddr, err = s.api.Resolve(r.Context(), uri.Addr) - if err != nil { - getFileFail.Inc(1) - respondError(w, r, fmt.Sprintf("cannot resolve %s: %s", uri.Addr, err), http.StatusNotFound) - return - } - } else { - w.Header().Set("Cache-Control", "max-age=2147483648, immutable") // url was of type bzz:///path, so we are sure it is immutable. - } - - log.Debug("handle.get.file: resolved", "ruid", ruid, "key", manifestAddr) - - reader, contentType, status, contentKey, err := s.api.Get(r.Context(), s.api.Decryptor(r.Context(), credentials), manifestAddr, uri.Path) - - etag := common.Bytes2Hex(contentKey) - noneMatchEtag := r.Header.Get("If-None-Match") - w.Header().Set("ETag", fmt.Sprintf("%q", etag)) // set etag to actual content key. - if noneMatchEtag != "" { - if bytes.Equal(storage.Address(common.Hex2Bytes(noneMatchEtag)), contentKey) { - w.WriteHeader(http.StatusNotModified) - return - } - } - - if err != nil { - if isDecryptError(err) { - w.Header().Set("WWW-Authenticate", fmt.Sprintf("Basic realm=%q", manifestAddr)) - respondError(w, r, err.Error(), http.StatusUnauthorized) - return - } - - switch status { - case http.StatusNotFound: - getFileNotFound.Inc(1) - respondError(w, r, err.Error(), http.StatusNotFound) - default: - getFileFail.Inc(1) - respondError(w, r, err.Error(), http.StatusInternalServerError) - } - 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.api.GetManifestList(r.Context(), s.api.Decryptor(r.Context(), credentials), manifestAddr, uri.Path) - if err != nil { - getFileFail.Inc(1) - if isDecryptError(err) { - w.Header().Set("WWW-Authenticate", fmt.Sprintf("Basic realm=%q", manifestAddr)) - respondError(w, r, err.Error(), http.StatusUnauthorized) - return - } - respondError(w, r, err.Error(), http.StatusInternalServerError) - return - } - - log.Debug(fmt.Sprintf("Multiple choices! --> %v", list), "ruid", ruid) - //show a nice page links to available entries - ShowMultipleChoices(w, r, list) - return - } - - // check the root chunk exists by retrieving the file's size - if _, err := reader.Size(r.Context(), nil); err != nil { - getFileNotFound.Inc(1) - respondError(w, r, fmt.Sprintf("file not found %s: %s", uri, err), http.StatusNotFound) - return - } - - if contentType != "" { - w.Header().Set("Content-Type", contentType) - } - - fileName := uri.Addr - if found := path.Base(uri.Path); found != "" && found != "." && found != "/" { - fileName = found - } - w.Header().Set("Content-Disposition", fmt.Sprintf("inline; filename=\"%s\"", fileName)) - - http.ServeContent(w, r, fileName, time.Now(), newBufferedReadSeeker(reader, getFileBufferSize)) -} - -// The size of buffer used for bufio.Reader on LazyChunkReader passed to -// http.ServeContent in HandleGetFile. -// Warning: This value influences the number of chunk requests and chunker join goroutines -// per file request. -// Recommended value is 4 times the io.Copy default buffer value which is 32kB. -const getFileBufferSize = 4 * 32 * 1024 - -// bufferedReadSeeker wraps bufio.Reader to expose Seek method -// from the provied io.ReadSeeker in newBufferedReadSeeker. -type bufferedReadSeeker struct { - r io.Reader - s io.Seeker -} - -// newBufferedReadSeeker creates a new instance of bufferedReadSeeker, -// out of io.ReadSeeker. Argument `size` is the size of the read buffer. -func newBufferedReadSeeker(readSeeker io.ReadSeeker, size int) bufferedReadSeeker { - return bufferedReadSeeker{ - r: bufio.NewReaderSize(readSeeker, size), - s: readSeeker, - } -} - -func (b bufferedReadSeeker) Read(p []byte) (n int, err error) { - return b.r.Read(p) -} - -func (b bufferedReadSeeker) Seek(offset int64, whence int) (int64, error) { - return b.s.Seek(offset, whence) -} - -type loggingResponseWriter struct { - http.ResponseWriter - statusCode int -} - -func newLoggingResponseWriter(w http.ResponseWriter) *loggingResponseWriter { - return &loggingResponseWriter{w, http.StatusOK} -} - -func (lrw *loggingResponseWriter) WriteHeader(code int) { - lrw.statusCode = code - lrw.ResponseWriter.WriteHeader(code) -} - -func isDecryptError(err error) bool { - return strings.Contains(err.Error(), api.ErrDecrypt.Error()) -} diff --git a/swarm/api/http/server_test.go b/swarm/api/http/server_test.go deleted file mode 100644 index c85c1949d8f0..000000000000 --- a/swarm/api/http/server_test.go +++ /dev/null @@ -1,1313 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package http - -import ( - "archive/tar" - "bytes" - "context" - "encoding/json" - "errors" - "flag" - "fmt" - "io" - "io/ioutil" - "math/big" - "mime/multipart" - "net/http" - "net/url" - "os" - "path" - "strconv" - "strings" - "testing" - "time" - - "github.com/nebulaai/nbai-node/swarm/storage/feed/lookup" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/swarm/api" - swarm "github.com/nebulaai/nbai-node/swarm/api/client" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/storage/feed" - "github.com/nebulaai/nbai-node/swarm/testutil" -) - -func init() { - loglevel := flag.Int("loglevel", 2, "loglevel") - flag.Parse() - log.Root().SetHandler(log.CallerFileHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(os.Stderr, log.TerminalFormat(true))))) -} - -func serverFunc(api *api.API) TestServer { - return NewServer(api, "") -} - -func newTestSigner() (*feed.GenericSigner, error) { - privKey, err := crypto.HexToECDSA("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") - if err != nil { - return nil, err - } - return feed.NewGenericSigner(privKey), nil -} - -// Test the transparent resolving of feed updates with bzz:// scheme -// -// First upload data to bzz:, and store the Swarm hash to the resulting manifest in a feed update. -// This effectively uses a feed to store a pointer to content rather than the content itself -// Retrieving the update with the Swarm hash should return the manifest pointing directly to the data -// and raw retrieve of that hash should return the data -func TestBzzWithFeed(t *testing.T) { - - signer, _ := newTestSigner() - - // Initialize Swarm test server - srv := NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - // put together some data for our test: - dataBytes := []byte(` - // - // Create some data our manifest will point to. Data that could be very big and wouldn't fit in a feed update. - // So what we are going to do is upload it to Swarm bzz:// and obtain a **manifest hash** pointing to it: - // - // MANIFEST HASH --> DATA - // - // Then, we store that **manifest hash** into a Swarm Feed update. Once we have done this, - // we can use the **feed manifest hash** in bzz:// instead, this way: bzz://feed-manifest-hash. - // - // FEED MANIFEST HASH --> MANIFEST HASH --> DATA - // - // Given that we can update the feed at any time with a new **manifest hash** but the **feed manifest hash** - // stays constant, we have effectively created a fixed address to changing content. (Applause) - // - // FEED MANIFEST HASH (the same) --> MANIFEST HASH(2) --> DATA(2) ... - // - `) - - // POST data to bzz and get back a content-addressed **manifest hash** pointing to it. - resp, err := http.Post(fmt.Sprintf("%s/bzz:/", srv.URL), "text/plain", bytes.NewReader([]byte(dataBytes))) - if err != nil { - t.Fatal(err) - } - - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - manifestAddressHex, err := ioutil.ReadAll(resp.Body) - - if err != nil { - t.Fatal(err) - } - - manifestAddress := common.FromHex(string(manifestAddressHex)) - - log.Info("added data", "manifest", string(manifestAddressHex)) - - // At this point we have uploaded the data and have a manifest pointing to it - // Now store that manifest address in a feed update. - // We also want a feed manifest, so we can use it to refer to the feed. - - // First, create a topic for our feed: - topic, _ := feed.NewTopic("interesting topic indeed", nil) - - // Create a feed update request: - updateRequest := feed.NewFirstRequest(topic) - - // Store the **manifest address** as data into the feed update. - updateRequest.SetData(manifestAddress) - - // Sign the update - if err := updateRequest.Sign(signer); err != nil { - t.Fatal(err) - } - log.Info("added data", "data", common.ToHex(manifestAddress)) - - // Build the feed update http request: - feedUpdateURL, err := url.Parse(fmt.Sprintf("%s/bzz-feed:/", srv.URL)) - if err != nil { - t.Fatal(err) - } - query := feedUpdateURL.Query() - body := updateRequest.AppendValues(query) // this adds all query parameters and returns the data to be posted - query.Set("manifest", "1") // indicate we want a feed manifest back - feedUpdateURL.RawQuery = query.Encode() - - // submit the feed update request to Swarm - resp, err = http.Post(feedUpdateURL.String(), "application/octet-stream", bytes.NewReader(body)) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - - feedManifestAddressHex, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - feedManifestAddress := &storage.Address{} - err = json.Unmarshal(feedManifestAddressHex, feedManifestAddress) - if err != nil { - t.Fatalf("data %s could not be unmarshaled: %v", feedManifestAddressHex, err) - } - - correctManifestAddrHex := "747c402e5b9dc715a25a4393147512167bab018a007fad7cdcd9adc7fce1ced2" - if feedManifestAddress.Hex() != correctManifestAddrHex { - t.Fatalf("Response feed manifest address mismatch, expected '%s', got '%s'", correctManifestAddrHex, feedManifestAddress.Hex()) - } - - // get bzz manifest transparent feed update resolve - getBzzURL := fmt.Sprintf("%s/bzz:/%s", srv.URL, feedManifestAddress) - resp, err = http.Get(getBzzURL) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - retrievedData, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(retrievedData, []byte(dataBytes)) { - t.Fatalf("retrieved data mismatch, expected %x, got %x", dataBytes, retrievedData) - } -} - -// Test Swarm feeds using the raw update methods -func TestBzzFeed(t *testing.T) { - srv := NewTestSwarmServer(t, serverFunc, nil) - signer, _ := newTestSigner() - - defer srv.Close() - - // data of update 1 - update1Data := testutil.RandomBytes(1, 666) - update1Timestamp := srv.CurrentTime - //data for update 2 - update2Data := []byte("foo") - - topic, _ := feed.NewTopic("foo.eth", nil) - updateRequest := feed.NewFirstRequest(topic) - updateRequest.SetData(update1Data) - - if err := updateRequest.Sign(signer); err != nil { - t.Fatal(err) - } - - // creates feed and sets update 1 - testUrl, err := url.Parse(fmt.Sprintf("%s/bzz-feed:/", srv.URL)) - if err != nil { - t.Fatal(err) - } - urlQuery := testUrl.Query() - body := updateRequest.AppendValues(urlQuery) // this adds all query parameters - urlQuery.Set("manifest", "1") // indicate we want a manifest back - testUrl.RawQuery = urlQuery.Encode() - - resp, err := http.Post(testUrl.String(), "application/octet-stream", bytes.NewReader(body)) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - rsrcResp := &storage.Address{} - err = json.Unmarshal(b, rsrcResp) - if err != nil { - t.Fatalf("data %s could not be unmarshaled: %v", b, err) - } - - correctManifestAddrHex := "bb056a5264c295c2b0f613c8409b9c87ce9d71576ace02458160df4cc894210b" - if rsrcResp.Hex() != correctManifestAddrHex { - t.Fatalf("Response feed manifest mismatch, expected '%s', got '%s'", correctManifestAddrHex, rsrcResp.Hex()) - } - - // get the manifest - testRawUrl := fmt.Sprintf("%s/bzz-raw:/%s", srv.URL, rsrcResp) - resp, err = http.Get(testRawUrl) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - manifest := &api.Manifest{} - err = json.Unmarshal(b, manifest) - if err != nil { - t.Fatal(err) - } - if len(manifest.Entries) != 1 { - t.Fatalf("Manifest has %d entries", len(manifest.Entries)) - } - correctFeedHex := "0x666f6f2e65746800000000000000000000000000000000000000000000000000c96aaa54e2d44c299564da76e1cd3184a2386b8d" - if manifest.Entries[0].Feed.Hex() != correctFeedHex { - t.Fatalf("Expected manifest Feed '%s', got '%s'", correctFeedHex, manifest.Entries[0].Feed.Hex()) - } - - // take the chance to have bzz: crash on resolving a feed update that does not contain - // a swarm hash: - testBzzUrl := fmt.Sprintf("%s/bzz:/%s", srv.URL, rsrcResp) - resp, err = http.Get(testBzzUrl) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode == http.StatusOK { - t.Fatal("Expected error status since feed update does not contain a Swarm hash. Received 200 OK") - } - _, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - - // get non-existent name, should fail - testBzzResUrl := fmt.Sprintf("%s/bzz-feed:/bar", srv.URL) - resp, err = http.Get(testBzzResUrl) - if err != nil { - t.Fatal(err) - } - - if resp.StatusCode != http.StatusNotFound { - t.Fatalf("Expected get non-existent feed manifest to fail with StatusNotFound (404), got %d", resp.StatusCode) - } - - resp.Body.Close() - - // get latest update through bzz-feed directly - log.Info("get update latest = 1.1", "addr", correctManifestAddrHex) - testBzzResUrl = fmt.Sprintf("%s/bzz-feed:/%s", srv.URL, correctManifestAddrHex) - resp, err = http.Get(testBzzResUrl) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(update1Data, b) { - t.Fatalf("Expected body '%x', got '%x'", update1Data, b) - } - - // update 2 - // Move the clock ahead 1 second - srv.CurrentTime++ - log.Info("update 2") - - // 1.- get metadata about this feed - testBzzResUrl = fmt.Sprintf("%s/bzz-feed:/%s/", srv.URL, correctManifestAddrHex) - resp, err = http.Get(testBzzResUrl + "?meta=1") - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("Get feed metadata returned %s", resp.Status) - } - b, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - updateRequest = &feed.Request{} - if err = updateRequest.UnmarshalJSON(b); err != nil { - t.Fatalf("Error decoding feed metadata: %s", err) - } - updateRequest.SetData(update2Data) - if err = updateRequest.Sign(signer); err != nil { - t.Fatal(err) - } - testUrl, err = url.Parse(fmt.Sprintf("%s/bzz-feed:/", srv.URL)) - if err != nil { - t.Fatal(err) - } - urlQuery = testUrl.Query() - body = updateRequest.AppendValues(urlQuery) // this adds all query parameters - goodQueryParameters := urlQuery.Encode() // save the query parameters for a second attempt - - // create bad query parameters in which the signature is missing - urlQuery.Del("signature") - testUrl.RawQuery = urlQuery.Encode() - - // 1st attempt with bad query parameters in which the signature is missing - resp, err = http.Post(testUrl.String(), "application/octet-stream", bytes.NewReader(body)) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - expectedCode := http.StatusBadRequest - if resp.StatusCode != expectedCode { - t.Fatalf("Update returned %s. Expected %d", resp.Status, expectedCode) - } - - // 2nd attempt with bad query parameters in which the signature is of incorrect length - urlQuery.Set("signature", "0xabcd") // should be 130 hex chars - resp, err = http.Post(testUrl.String(), "application/octet-stream", bytes.NewReader(body)) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - expectedCode = http.StatusBadRequest - if resp.StatusCode != expectedCode { - t.Fatalf("Update returned %s. Expected %d", resp.Status, expectedCode) - } - - // 3rd attempt, with good query parameters: - testUrl.RawQuery = goodQueryParameters - resp, err = http.Post(testUrl.String(), "application/octet-stream", bytes.NewReader(body)) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - expectedCode = http.StatusOK - if resp.StatusCode != expectedCode { - t.Fatalf("Update returned %s. Expected %d", resp.Status, expectedCode) - } - - // get latest update through bzz-feed directly - log.Info("get update 1.2") - testBzzResUrl = fmt.Sprintf("%s/bzz-feed:/%s", srv.URL, correctManifestAddrHex) - resp, err = http.Get(testBzzResUrl) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(update2Data, b) { - t.Fatalf("Expected body '%x', got '%x'", update2Data, b) - } - - // test manifest-less queries - log.Info("get first update in update1Timestamp via direct query") - query := feed.NewQuery(&updateRequest.Feed, update1Timestamp, lookup.NoClue) - - urlq, err := url.Parse(fmt.Sprintf("%s/bzz-feed:/", srv.URL)) - if err != nil { - t.Fatal(err) - } - - values := urlq.Query() - query.AppendValues(values) // this adds feed query parameters - urlq.RawQuery = values.Encode() - resp, err = http.Get(urlq.String()) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(update1Data, b) { - t.Fatalf("Expected body '%x', got '%x'", update1Data, b) - } - -} - -func TestBzzGetPath(t *testing.T) { - testBzzGetPath(false, t) - testBzzGetPath(true, t) -} - -func testBzzGetPath(encrypted bool, t *testing.T) { - var err error - - testmanifest := []string{ - `{"entries":[{"path":"b","hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","contentType":"","status":0},{"path":"c","hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","contentType":"","status":0}]}`, - `{"entries":[{"path":"a","hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","contentType":"","status":0},{"path":"b/","hash":"","contentType":"application/bzz-manifest+json","status":0}]}`, - `{"entries":[{"path":"a/","hash":"","contentType":"application/bzz-manifest+json","status":0}]}`, - } - - testrequests := make(map[string]int) - testrequests["/"] = 2 - testrequests["/a/"] = 1 - testrequests["/a/b/"] = 0 - testrequests["/x"] = 0 - testrequests[""] = 0 - - expectedfailrequests := []string{"", "/x"} - - reader := [3]*bytes.Reader{} - - addr := [3]storage.Address{} - - srv := NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - for i, mf := range testmanifest { - reader[i] = bytes.NewReader([]byte(mf)) - var wait func(context.Context) error - ctx := context.TODO() - addr[i], wait, err = srv.FileStore.Store(ctx, reader[i], int64(len(mf)), encrypted) - if err != nil { - t.Fatal(err) - } - for j := i + 1; j < len(testmanifest); j++ { - testmanifest[j] = strings.Replace(testmanifest[j], fmt.Sprintf("", i), addr[i].Hex(), -1) - } - err = wait(ctx) - if err != nil { - t.Fatal(err) - } - } - - rootRef := addr[2].Hex() - - _, err = http.Get(srv.URL + "/bzz-raw:/" + rootRef + "/a") - if err != nil { - t.Fatalf("Failed to connect to proxy: %v", err) - } - - for k, v := range testrequests { - var resp *http.Response - var respbody []byte - - url := srv.URL + "/bzz-raw:/" - if k != "" { - url += rootRef + "/" + k[1:] + "?content_type=text/plain" - } - 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 err != nil { - t.Fatalf("Error while reading response body: %v", err) - } - - if string(respbody) != testmanifest[v] { - isexpectedfailrequest := false - - for _, r := range expectedfailrequests { - if k == r { - isexpectedfailrequest = true - } - } - if !isexpectedfailrequest { - t.Fatalf("Response body does not match, expected: %v, got %v", testmanifest[v], string(respbody)) - } - } - } - - for k, v := range testrequests { - var resp *http.Response - var respbody []byte - - url := srv.URL + "/bzz-hash:/" - if k != "" { - url += rootRef + "/" + k[1:] - } - 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 err != nil { - t.Fatalf("Read request body: %v", err) - } - - if string(respbody) != addr[v].Hex() { - isexpectedfailrequest := false - - for _, r := range expectedfailrequests { - if k == r { - isexpectedfailrequest = true - } - } - if !isexpectedfailrequest { - t.Fatalf("Response body does not match, expected: %v, got %v", addr[v], string(respbody)) - } - } - } - - ref := addr[2].Hex() - - for _, c := range []struct { - path string - json string - pageFragments []string - }{ - { - path: "/", - json: `{"common_prefixes":["a/"]}`, - pageFragments: []string{ - fmt.Sprintf("Swarm index of bzz:/%s/", ref), - `a/`, - }, - }, - { - path: "/a/", - json: `{"common_prefixes":["a/b/"],"entries":[{"hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","path":"a/a","mod_time":"0001-01-01T00:00:00Z"}]}`, - pageFragments: []string{ - fmt.Sprintf("Swarm index of bzz:/%s/a/", ref), - `b/`, - fmt.Sprintf(`a`, ref), - }, - }, - { - path: "/a/b/", - json: `{"entries":[{"hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","path":"a/b/b","mod_time":"0001-01-01T00:00:00Z"},{"hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","path":"a/b/c","mod_time":"0001-01-01T00:00:00Z"}]}`, - pageFragments: []string{ - fmt.Sprintf("Swarm index of bzz:/%s/a/b/", ref), - fmt.Sprintf(`b`, ref), - fmt.Sprintf(`c`, ref), - }, - }, - { - path: "/x", - }, - { - path: "", - }, - } { - k := c.path - url := srv.URL + "/bzz-list:/" - if k != "" { - url += rootRef + "/" + k[1:] - } - t.Run("json list "+c.path, func(t *testing.T) { - resp, err := http.Get(url) - if err != nil { - t.Fatalf("HTTP request: %v", err) - } - defer resp.Body.Close() - respbody, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatalf("Read response body: %v", err) - } - - body := strings.TrimSpace(string(respbody)) - if body != c.json { - isexpectedfailrequest := false - - for _, r := range expectedfailrequests { - if k == r { - isexpectedfailrequest = true - } - } - if !isexpectedfailrequest { - t.Errorf("Response list body %q does not match, expected: %v, got %v", k, c.json, body) - } - } - }) - t.Run("html list "+c.path, func(t *testing.T) { - req, err := http.NewRequest(http.MethodGet, url, nil) - if err != nil { - t.Fatalf("New request: %v", err) - } - req.Header.Set("Accept", "text/html") - resp, err := http.DefaultClient.Do(req) - if err != nil { - t.Fatalf("HTTP request: %v", err) - } - defer resp.Body.Close() - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatalf("Read response body: %v", err) - } - - body := string(b) - - for _, f := range c.pageFragments { - if !strings.Contains(body, f) { - isexpectedfailrequest := false - - for _, r := range expectedfailrequests { - if k == r { - isexpectedfailrequest = true - } - } - if !isexpectedfailrequest { - t.Errorf("Response list body %q does not contain %q: body %q", k, f, body) - } - } - } - }) - } - - nonhashtests := []string{ - srv.URL + "/bzz:/name", - srv.URL + "/bzz-immutable:/nonhash", - srv.URL + "/bzz-raw:/nonhash", - srv.URL + "/bzz-list:/nonhash", - srv.URL + "/bzz-hash:/nonhash", - } - - nonhashresponses := []string{ - `cannot resolve name: no DNS to resolve name: "name"`, - `cannot resolve nonhash: no DNS to resolve name: "nonhash"`, - `cannot resolve nonhash: no DNS to resolve name: "nonhash"`, - `cannot resolve nonhash: no DNS to resolve name: "nonhash"`, - `cannot resolve nonhash: no DNS to resolve name: "nonhash"`, - } - - for i, url := range nonhashtests { - var resp *http.Response - var respbody []byte - - 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 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)) - } - } -} - -func TestBzzTar(t *testing.T) { - testBzzTar(false, t) - testBzzTar(true, t) -} - -func testBzzTar(encrypted bool, t *testing.T) { - srv := NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - fileNames := []string{"tmp1.txt", "tmp2.lock", "tmp3.rtf"} - fileContents := []string{"tmp1textfilevalue", "tmp2lockfilelocked", "tmp3isjustaplaintextfile"} - - buf := &bytes.Buffer{} - tw := tar.NewWriter(buf) - defer tw.Close() - - for i, v := range fileNames { - size := int64(len(fileContents[i])) - hdr := &tar.Header{ - Name: v, - Mode: 0644, - Size: size, - ModTime: time.Now(), - Xattrs: map[string]string{ - "user.swarm.content-type": "text/plain", - }, - } - if err := tw.WriteHeader(hdr); err != nil { - t.Fatal(err) - } - - // copy the file into the tar stream - n, err := io.Copy(tw, bytes.NewBufferString(fileContents[i])) - if err != nil { - t.Fatal(err) - } else if n != size { - t.Fatal("size mismatch") - } - } - - //post tar stream - url := srv.URL + "/bzz:/" - if encrypted { - url = url + "encrypt" - } - req, err := http.NewRequest("POST", url, buf) - if err != nil { - t.Fatal(err) - } - req.Header.Add("Content-Type", "application/x-tar") - client := &http.Client{} - resp2, err := client.Do(req) - if err != nil { - t.Fatal(err) - } - if resp2.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp2.Status) - } - swarmHash, err := ioutil.ReadAll(resp2.Body) - resp2.Body.Close() - if err != nil { - t.Fatal(err) - } - - // now do a GET to get a tarball back - req, err = http.NewRequest("GET", fmt.Sprintf(srv.URL+"/bzz:/%s", string(swarmHash)), nil) - if err != nil { - t.Fatal(err) - } - req.Header.Add("Accept", "application/x-tar") - resp2, err = client.Do(req) - if err != nil { - t.Fatal(err) - } - defer resp2.Body.Close() - - if h := resp2.Header.Get("Content-Type"); h != "application/x-tar" { - t.Fatalf("Content-Type header expected: application/x-tar, got: %s", h) - } - - expectedFileName := string(swarmHash) + ".tar" - expectedContentDisposition := fmt.Sprintf("inline; filename=\"%s\"", expectedFileName) - if h := resp2.Header.Get("Content-Disposition"); h != expectedContentDisposition { - t.Fatalf("Content-Disposition header expected: %s, got: %s", expectedContentDisposition, h) - } - - file, err := ioutil.TempFile("", "swarm-downloaded-tarball") - if err != nil { - t.Fatal(err) - } - defer os.Remove(file.Name()) - _, err = io.Copy(file, resp2.Body) - if err != nil { - t.Fatalf("error getting tarball: %v", err) - } - file.Sync() - file.Close() - - tarFileHandle, err := os.Open(file.Name()) - if err != nil { - t.Fatal(err) - } - tr := tar.NewReader(tarFileHandle) - - for { - hdr, err := tr.Next() - if err == io.EOF { - break - } else if err != nil { - t.Fatalf("error reading tar stream: %s", err) - } - bb := make([]byte, hdr.Size) - _, err = tr.Read(bb) - if err != nil && err != io.EOF { - t.Fatal(err) - } - passed := false - for i, v := range fileNames { - if v == hdr.Name { - if string(bb) == fileContents[i] { - passed = true - break - } - } - } - if !passed { - t.Fatalf("file %s did not pass content assertion", hdr.Name) - } - } -} - -// 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) { - testBzzRootRedirect(false, t) -} -func TestBzzRootRedirectEncrypted(t *testing.T) { - testBzzRootRedirect(true, t) -} - -func testBzzRootRedirect(toEncrypt bool, t *testing.T) { - srv := NewTestSwarmServer(t, serverFunc, nil) - 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, "", toEncrypt) - 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) - } -} - -func TestMethodsNotAllowed(t *testing.T) { - srv := NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - databytes := "bar" - for _, c := range []struct { - url string - code int - }{ - { - url: fmt.Sprintf("%s/bzz-list:/", srv.URL), - code: http.StatusMethodNotAllowed, - }, { - url: fmt.Sprintf("%s/bzz-hash:/", srv.URL), - code: http.StatusMethodNotAllowed, - }, - { - url: fmt.Sprintf("%s/bzz-immutable:/", srv.URL), - code: http.StatusMethodNotAllowed, - }, - } { - res, _ := http.Post(c.url, "text/plain", bytes.NewReader([]byte(databytes))) - if res.StatusCode != c.code { - t.Fatalf("should have failed. requested url: %s, expected code %d, got %d", c.url, c.code, res.StatusCode) - } - } - -} - -func httpDo(httpMethod string, url string, reqBody io.Reader, headers map[string]string, verbose bool, t *testing.T) (*http.Response, string) { - // Build the Request - req, err := http.NewRequest(httpMethod, url, reqBody) - if err != nil { - t.Fatal(err) - } - for key, value := range headers { - req.Header.Set(key, value) - } - if verbose { - t.Log(req.Method, req.URL, req.Header, req.Body) - } - - // Send Request out - httpClient := &http.Client{} - res, err := httpClient.Do(req) - if err != nil { - t.Fatal(err) - } - - // Read the HTTP Body - buffer, err := ioutil.ReadAll(res.Body) - if err != nil { - t.Fatal(err) - } - defer res.Body.Close() - body := string(buffer) - - return res, body -} - -func TestGet(t *testing.T) { - srv := NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - for _, testCase := range []struct { - uri string - method string - headers map[string]string - expectedStatusCode int - assertResponseBody string - verbose bool - }{ - { - uri: fmt.Sprintf("%s/", srv.URL), - method: "GET", - headers: map[string]string{"Accept": "text/html"}, - expectedStatusCode: http.StatusOK, - assertResponseBody: "Swarm: Serverless Hosting Incentivised Peer-To-Peer Storage And Content Distribution", - verbose: false, - }, - { - uri: fmt.Sprintf("%s/", srv.URL), - method: "GET", - headers: map[string]string{"Accept": "application/json"}, - expectedStatusCode: http.StatusOK, - assertResponseBody: "Swarm: Please request a valid ENS or swarm hash with the appropriate bzz scheme", - verbose: false, - }, - { - uri: fmt.Sprintf("%s/robots.txt", srv.URL), - method: "GET", - headers: map[string]string{"Accept": "text/html"}, - expectedStatusCode: http.StatusOK, - assertResponseBody: "User-agent: *\nDisallow: /", - verbose: false, - }, - { - uri: fmt.Sprintf("%s/nonexistent_path", srv.URL), - method: "GET", - headers: map[string]string{}, - expectedStatusCode: http.StatusNotFound, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz:asdf/", srv.URL), - method: "GET", - headers: map[string]string{}, - expectedStatusCode: http.StatusNotFound, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/tbz2/", srv.URL), - method: "GET", - headers: map[string]string{}, - expectedStatusCode: http.StatusNotFound, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz-rack:/", srv.URL), - method: "GET", - headers: map[string]string{}, - expectedStatusCode: http.StatusNotFound, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz-ls", srv.URL), - method: "GET", - headers: map[string]string{}, - expectedStatusCode: http.StatusNotFound, - verbose: false, - }} { - t.Run("GET "+testCase.uri, func(t *testing.T) { - res, body := httpDo(testCase.method, testCase.uri, nil, testCase.headers, testCase.verbose, t) - if res.StatusCode != testCase.expectedStatusCode { - t.Fatalf("expected status code %d but got %d", testCase.expectedStatusCode, res.StatusCode) - } - if testCase.assertResponseBody != "" && !strings.Contains(body, testCase.assertResponseBody) { - t.Fatalf("expected response to be: %s but got: %s", testCase.assertResponseBody, body) - } - }) - } -} - -func TestModify(t *testing.T) { - srv := NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - swarmClient := 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 := swarmClient.Upload(file, "", false) - if err != nil { - t.Fatal(err) - } - - for _, testCase := range []struct { - uri string - method string - headers map[string]string - requestBody []byte - expectedStatusCode int - assertResponseBody string - assertResponseHeaders map[string]string - verbose bool - }{ - { - uri: fmt.Sprintf("%s/bzz:/%s", srv.URL, hash), - method: "DELETE", - headers: map[string]string{}, - expectedStatusCode: http.StatusOK, - assertResponseBody: "8b634aea26eec353ac0ecbec20c94f44d6f8d11f38d4578a4c207a84c74ef731", - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz:/%s", srv.URL, hash), - method: "PUT", - headers: map[string]string{}, - expectedStatusCode: http.StatusMethodNotAllowed, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz-raw:/%s", srv.URL, hash), - method: "PUT", - headers: map[string]string{}, - expectedStatusCode: http.StatusMethodNotAllowed, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz:/%s", srv.URL, hash), - method: "PATCH", - headers: map[string]string{}, - expectedStatusCode: http.StatusMethodNotAllowed, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz-raw:/", srv.URL), - method: "POST", - headers: map[string]string{}, - requestBody: []byte("POSTdata"), - expectedStatusCode: http.StatusOK, - assertResponseHeaders: map[string]string{"Content-Length": "64"}, - verbose: false, - }, - { - uri: fmt.Sprintf("%s/bzz-raw:/encrypt", srv.URL), - method: "POST", - headers: map[string]string{}, - requestBody: []byte("POSTdata"), - expectedStatusCode: http.StatusOK, - assertResponseHeaders: map[string]string{"Content-Length": "128"}, - verbose: false, - }, - } { - t.Run(testCase.method+" "+testCase.uri, func(t *testing.T) { - reqBody := bytes.NewReader(testCase.requestBody) - res, body := httpDo(testCase.method, testCase.uri, reqBody, testCase.headers, testCase.verbose, t) - - if res.StatusCode != testCase.expectedStatusCode { - t.Fatalf("expected status code %d but got %d, %s", testCase.expectedStatusCode, res.StatusCode, body) - } - if testCase.assertResponseBody != "" && !strings.Contains(body, testCase.assertResponseBody) { - t.Log(body) - t.Fatalf("expected response %s but got %s", testCase.assertResponseBody, body) - } - for key, value := range testCase.assertResponseHeaders { - if res.Header.Get(key) != value { - t.Logf("expected %s=%s in HTTP response header but got %s", key, value, res.Header.Get(key)) - } - } - }) - } -} - -func TestMultiPartUpload(t *testing.T) { - // POST /bzz:/ Content-Type: multipart/form-data - verbose := false - // Setup Swarm - srv := NewTestSwarmServer(t, serverFunc, nil) - defer srv.Close() - - url := fmt.Sprintf("%s/bzz:/", srv.URL) - - buf := new(bytes.Buffer) - form := multipart.NewWriter(buf) - form.WriteField("name", "John Doe") - file1, _ := form.CreateFormFile("cv", "cv.txt") - file1.Write([]byte("John Doe's Credentials")) - file2, _ := form.CreateFormFile("profile_picture", "profile.jpg") - file2.Write([]byte("imaginethisisjpegdata")) - form.Close() - - headers := map[string]string{ - "Content-Type": form.FormDataContentType(), - "Content-Length": strconv.Itoa(buf.Len()), - } - res, body := httpDo("POST", url, buf, headers, verbose, t) - - if res.StatusCode != http.StatusOK { - t.Fatalf("expected POST multipart/form-data to return 200, but it returned %d", res.StatusCode) - } - if len(body) != 64 { - t.Fatalf("expected POST multipart/form-data to return a 64 char manifest but the answer was %d chars long", len(body)) - } -} - -// TestBzzGetFileWithResolver tests fetching a file using a mocked ENS resolver -func TestBzzGetFileWithResolver(t *testing.T) { - resolver := newTestResolveValidator("") - srv := NewTestSwarmServer(t, serverFunc, resolver) - defer srv.Close() - fileNames := []string{"dir1/tmp1.txt", "dir2/tmp2.lock", "dir3/tmp3.rtf"} - fileContents := []string{"tmp1textfilevalue", "tmp2lockfilelocked", "tmp3isjustaplaintextfile"} - - buf := &bytes.Buffer{} - tw := tar.NewWriter(buf) - - for i, v := range fileNames { - size := len(fileContents[i]) - hdr := &tar.Header{ - Name: v, - Mode: 0644, - Size: int64(size), - ModTime: time.Now(), - Xattrs: map[string]string{ - "user.swarm.content-type": "text/plain", - }, - } - if err := tw.WriteHeader(hdr); err != nil { - t.Fatal(err) - } - - // copy the file into the tar stream - n, err := io.WriteString(tw, fileContents[i]) - if err != nil { - t.Fatal(err) - } else if n != size { - t.Fatal("size mismatch") - } - } - - if err := tw.Close(); err != nil { - t.Fatal(err) - } - - //post tar stream - url := srv.URL + "/bzz:/" - - req, err := http.NewRequest("POST", url, buf) - if err != nil { - t.Fatal(err) - } - req.Header.Add("Content-Type", "application/x-tar") - client := &http.Client{} - serverResponse, err := client.Do(req) - if err != nil { - t.Fatal(err) - } - if serverResponse.StatusCode != http.StatusOK { - t.Fatalf("err %s", serverResponse.Status) - } - swarmHash, err := ioutil.ReadAll(serverResponse.Body) - serverResponse.Body.Close() - if err != nil { - t.Fatal(err) - } - // set the resolved hash to be the swarm hash of what we've just uploaded - hash := common.HexToHash(string(swarmHash)) - resolver.hash = &hash - for _, v := range []struct { - addr string - path string - expectedStatusCode int - expectedContentType string - expectedFileName string - }{ - { - addr: string(swarmHash), - path: fileNames[0], - expectedStatusCode: http.StatusOK, - expectedContentType: "text/plain", - expectedFileName: path.Base(fileNames[0]), - }, - { - addr: "somebogusensname", - path: fileNames[0], - expectedStatusCode: http.StatusOK, - expectedContentType: "text/plain", - expectedFileName: path.Base(fileNames[0]), - }, - } { - req, err := http.NewRequest("GET", fmt.Sprintf(srv.URL+"/bzz:/%s/%s", v.addr, v.path), nil) - if err != nil { - t.Fatal(err) - } - serverResponse, err := client.Do(req) - if err != nil { - t.Fatal(err) - } - defer serverResponse.Body.Close() - if serverResponse.StatusCode != v.expectedStatusCode { - t.Fatalf("expected %d, got %d", v.expectedStatusCode, serverResponse.StatusCode) - } - - if h := serverResponse.Header.Get("Content-Type"); h != v.expectedContentType { - t.Fatalf("Content-Type header expected: %s, got %s", v.expectedContentType, h) - } - - expectedContentDisposition := fmt.Sprintf("inline; filename=\"%s\"", v.expectedFileName) - if h := serverResponse.Header.Get("Content-Disposition"); h != expectedContentDisposition { - t.Fatalf("Content-Disposition header expected: %s, got: %s", expectedContentDisposition, h) - } - - } -} - -// testResolver implements the Resolver interface and either returns the given -// hash if it is set, or returns a "name not found" error -type testResolveValidator struct { - hash *common.Hash -} - -func newTestResolveValidator(addr string) *testResolveValidator { - r := &testResolveValidator{} - if addr != "" { - hash := common.HexToHash(addr) - r.hash = &hash - } - return r -} - -func (t *testResolveValidator) Resolve(addr string) (common.Hash, error) { - if t.hash == nil { - return common.Hash{}, fmt.Errorf("DNS name not found: %q", addr) - } - return *t.hash, nil -} - -func (t *testResolveValidator) Owner(node [32]byte) (addr common.Address, err error) { - return -} -func (t *testResolveValidator) HeaderByNumber(context.Context, *big.Int) (header *types.Header, err error) { - return -} diff --git a/swarm/api/http/templates.go b/swarm/api/http/templates.go deleted file mode 100644 index 19e7f44784c7..000000000000 --- a/swarm/api/http/templates.go +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package http - -import ( - "encoding/hex" - "fmt" - "html/template" - "path" - - "github.com/nebulaai/nbai-node/swarm/api" -) - -type htmlListData struct { - URI *api.URI - List *api.ManifestList -} - -var TemplatesMap = make(map[string]*template.Template) -var faviconBytes []byte - -func init() { - for _, v := range []struct { - templateName string - partial string - funcs template.FuncMap - }{ - { - templateName: "error", - partial: errorResponse, - }, - { - templateName: "bzz-list", - partial: bzzList, - funcs: template.FuncMap{ - "basename": path.Base, - "leaflink": leafLink, - }, - }, - { - templateName: "landing-page", - partial: landing, - }, - } { - TemplatesMap[v.templateName] = template.Must(template.New(v.templateName).Funcs(v.funcs).Parse(baseTemplate + css + v.partial + logo)) - } - - bytes, err := hex.DecodeString(favicon) - if err != nil { - panic(err) - } - faviconBytes = bytes -} - -func leafLink(URI api.URI, manifestEntry api.ManifestEntry) string { - return fmt.Sprintf("/bzz:/%s/%s", URI.Addr, manifestEntry.Path) -} - -const bzzList = `{{ define "content" }} -

Swarm index of {{ .URI }}

-
- - - - - - - - - - - {{ range .List.CommonPrefixes }} - - - - - - {{ end }} - {{ range .List.Entries }} - - - - - - {{ end }} -
PathTypeSize
- {{ basename . }}/ - DIR-
- {{ basename .Path }} - {{ .ContentType }}{{ .Size }}
-
- - {{ end }}` - -const errorResponse = `{{ define "content" }} -
- - -
-

{{.Msg}}

-
- -
-
Error code: {{.Code}}
-
- - -
-{{ end }}` - -const landing = `{{ define "content" }} - - - -
- - - - - -
- -{{ end }}` - -const baseTemplate = ` - - - - - - - - - {{ template "content" . }} - - -` - -const css = `{{ define "css" }} -html { - font-size: 18px; - font-size: 1.13rem; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; - font-family: Helvetica, Arial, sans-serif; -} - -body { - background: #f6f6f6; - color: #333; -} - -a, a:visited, a:active { - color: darkorange; -} - -a.normal-link, a.normal-link:active { color: #0000EE; } -a.normal-link:visited { color: #551A8B; } - -table { - border-collapse: separate; -} - -td { - padding: 3px 10px; -} - - -.container { - max-width: 600px; - margin: 40px auto 40px; - text-align: center; -} - -.separate-block { - margin: 40px 0; - word-wrap: break-word; -} - -.footer { - font-size: 12px; - font-size: 0.75rem; - text-align: center; -} - -.orange { - color: #ffa500; -} - -.top-space { - margin-top: 20px; - margin-bottom: 20px; -} - -/* SVG Logos, editable */ - -.searchbar { - padding: 20px 20px 0; -} - -.logo { - margin: 100px 80px 0; -} - -.logo a img { - max-width: 140px; -} - -/* Tablet < 600p*/ - -@media only screen and (max-width: 600px) {} - -/* Mobile phone < 360p*/ - -@media only screen and (max-width: 360px) { - h1 { - font-size: 20px; - font-size: 1.5rem; - } - h2 { - font-size: 0.88rem; - margin: 0; - } - .logo { - margin: 50px 40px 0; - } - .footer { - font-size: 0.63rem; - text-align: center; - } -} - -input[type=text] { - width: 100%; - box-sizing: border-box; - border: 2px solid #777; - border-radius: 2px; - font-size: 16px; - padding: 12px 20px 12px 20px; - transition: border 250ms ease-in-out; -} - -input[type=text]:focus { - border: 2px solid #ffce73; -} - -.button { - background-color: #ffa500; - margin: 20px 0; - border: none; - border-radius: 2px; - color: #222; - padding: 15px 32px; - text-align: center; - text-decoration: none; - display: inline-block; - font-size: 16px; -} -{{ end }}` - -const logo = `{{ define "logo" }} - -{{ end }}` - -const favicon = `000001000400101000000000200068040000460000002020000000002000a8100000ae0400003030000000002000a825000056150000404000000000200028420000fe3a000028000000100000002000000001002000000000004004000000000000000000000000000000000000ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017e7e7e0362626263545454c548484849ffffff01ffffff01ffffff01ffffff01646464375b5b5bbf4545457758585809ffffff01ffffff01ffffff0164646443626262cf626262ff535353ff454545ff454545b74949492b6868681d626262a5626262fd5c5c5cff464646ff454545dd47474755ffffff01ffffff013f3f3feb565656ff636363ff535353ff464646ff3f3f3fff373737ab393939894d4d4dff626262ff5c5c5cff464646ff424242ff3a3a3af7ffffff01ffffff01383838e9353535ff424242ff474747ff383838ff353535ff363636ab35353587363636ff3a3a3aff4a4a4aff3b3b3bff353535ff363636f5ffffff01ffffff01383838e9303030ff181818ff131313ff232323ff343434ff363636ab35353587343434ff202020ff101010ff1d1d1dff303030ff373737f5ffffff01ffffff01232323c50c0c0cff0d0d0dff131313ff171717ff171717ff2929298b2727276b0f0f0ffd0d0d0dff101010ff171717ff161616ff232323d9ffffff01ffffff014d4d4d030f0f0f650c0c0ce7131313ff161616d51d1d1d4b63636363464646691717173b0d0d0dc50f0f0fff161616ef171717752e2e2e07ffffff01ffffff01ffffff01ffffff011d1d1d0f1515155360606045626262cf636363ff464646ff454545d3484848491414144d24242417ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013c3c3c374f4f4fff636363ff636363ff464646ff464646ff3f3f3fff3c3c3c41ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013636363d353535ff3c3c3cff575757ff363636ff181818ff282828ff37373747ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013636363d363636ff303030ff181818ff292929ff131313ef17171771696969136565653bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01323232371e1e1eff0d0d0dff0c0c0cff363636ff363636a3ffffff0185858515606060ff4747476bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01111111450d0d0dd10c0c0cff1b1b1bff2a2a2a993e3e3e0b30303085292929ff37373787ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636030e0e0e671616166b45454505323232432e2e2ed9151515c31d1d1d2dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014e4e4e05ffffff01ffffff01ffffff01ffffff010000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff28000000200000004000000001002000000000008010000000000000000000000000000000000000ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017272721b646464a54646466f72727205ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0168686845575757b74f4f4f39ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017e7e7e0b6262627d616161f3636363ff424242ff444444d74f4f4f49ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff016c6c6c27636363b5616161ff555555ff434343ff464646a35858581dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff016666665d616161e3626262ff636363ff636363ff444444ff464646ff434343ff454545b95252522bffffff01ffffff01ffffff01ffffff016c6c6c1363636393616161fb636363ff636363ff555555ff464646ff464646ff444444f5464646836666660bffffff01ffffff01ffffff01ffffff01ffffff016a6a6a3f626262c9616161ff636363ff636363ff636363ff636363ff444444ff464646ff464646ff464646ff434343fb48484897545454135b5b5b036868686f616161ef626262ff636363ff636363ff636363ff555555ff464646ff464646ff464646ff454545ff444444e54a4a4a5fffffff01ffffff01ffffff01ffffff013b3b3bd7505050ff646464ff636363ff636363ff636363ff636363ff444444ff464646ff464646ff464646ff454545ff3a3a3aff33333357313131113c3c3cff5a5a5aff646464ff636363ff636363ff636363ff555555ff464646ff464646ff464646ff464646ff424242ff383838f1ffffff01ffffff01ffffff01ffffff013a3a3ad5353535ff3a3a3aff575757ff646464ff626262ff636363ff444444ff464646ff464646ff3d3d3dff353535ff363636ff3636365535353511363636ff343434ff434343ff606060ff636363ff636363ff555555ff464646ff464646ff444444ff393939ff353535ff373737edffffff01ffffff01ffffff01ffffff013a3a3ad5363636ff363636ff343434ff3f3f3fff5d5d5dff646464ff444444ff404040ff363636ff353535ff363636ff363636ff3636365535353511363636ff363636ff363636ff343434ff4a4a4aff636363ff555555ff454545ff3c3c3cff353535ff363636ff363636ff373737edffffff01ffffff01ffffff01ffffff013a3a3ad5363636ff363636ff363636ff363636ff353535ff3f3f3fff363636ff353535ff363636ff363636ff363636ff363636ff3636365535353511363636ff363636ff363636ff363636ff353535ff383838ff3a3a3aff373737ff353535ff363636ff363636ff363636ff373737edffffff01ffffff01ffffff01ffffff013a3a3ad5363636ff363636ff363636ff323232ff181818ff0e0e0eff171717ff282828ff373737ff363636ff363636ff363636ff3636365535353511363636ff363636ff353535ff373737ff292929ff0f0f0fff111111ff1b1b1bff2f2f2fff373737ff363636ff363636ff373737edffffff01ffffff01ffffff01ffffff013a3a3ad5363636ff363636ff1e1e1eff0b0b0bff0d0d0dff0f0f0fff171717ff161616ff191919ff2c2c2cff373737ff363636ff3636365535353511363636ff373737ff2f2f2fff141414ff0b0b0bff0d0d0dff131313ff171717ff151515ff1f1f1fff333333ff363636ff373737edffffff01ffffff01ffffff01ffffff013b3b3bd5252525ff0d0d0dff0c0c0cff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff151515ff1c1c1cff313131ff3535355734343411333333ff1a1a1aff0b0b0bff0d0d0dff0d0d0dff0d0d0dff131313ff171717ff171717ff171717ff161616ff242424ff373737efffffff01ffffff01ffffff01ffffff012020205d0b0b0be50b0b0bff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff131313ff161616b73333331f3b3b3b05111111970a0a0afb0d0d0dff0d0d0dff0d0d0dff0d0d0dff131313ff171717ff171717ff171717ff161616ff141414f51c1c1c7fffffff01ffffff01ffffff01ffffff01ffffff014d4d4d0b1212127f0a0a0af50d0d0dff0d0d0dff0f0f0fff171717ff171717ff151515ff151515d522222249ffffff017373731b51515121ffffff011d1d1d2b101010b50a0a0aff0d0d0dff0d0d0dff131313ff171717ff171717ff131313ff181818a12e2e2e1dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff012c2c2c1b0f0f0fa10a0a0afd0f0f0fff161616ff141414e91b1b1b69656565057878780b6363637b626262f3464646f7454545896969690fffffff011c1c1c470c0c0cd30b0b0bff131313ff141414ff151515c32a2a2a37ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff011d1d1d35111111bd1a1a1a8d2f2f2f11ffffff0166666659616161e1626262ff646464ff474747ff454545ff444444e9494949677b7b7b054040400517171769131313cd24242455ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0169696939626262c7616161ff636363ff636363ff646464ff474747ff464646ff464646ff444444ff454545d14e4e4e45ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01424242615e5e5eff636363ff636363ff636363ff636363ff646464ff474747ff464646ff464646ff464646ff464646ff434343ff3f3f3f77ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0136363679343434ff494949ff636363ff636363ff636363ff646464ff474747ff464646ff464646ff474747ff3d3d3dff353535ff3a3a3a8dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0136363679363636ff353535ff363636ff505050ff646464ff636363ff474747ff484848ff2f2f2fff1c1c1cff323232ff363636ff3a3a3a8dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0136363679363636ff363636ff363636ff353535ff3a3a3aff5a5a5aff393939ff0f0f0fff040404ff111111ff151515ff232323ff3535358fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0136363679363636ff363636ff363636ff363636ff323232ff171717ff2a2a2aff0c0c0cff030303ff111111ff141414fb171717992e2e2e17a3a3a305ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0136363679363636ff363636ff363636ff1f1f1fff0b0b0bff0d0d0dff363636ff383838ff242424ff121212bf2a2a2a2dffffff01ffffff018484842b636363bf6d6d6d2fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0136363679373737ff252525ff0d0d0dff0c0c0cff0d0d0dff0d0d0dff373737ff363636ff353535ff39393949ffffff01ffffff01ffffff0186868629646464ff656565fb6464649b55555505ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff012e2e2e650e0e0eff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0c0c0cff353535ff363636ff353535ff37373749ffffff01ffffff01ffffff0185858529656565ff525252ff353535ff4b4b4b0fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff011c1c1c430d0d0dcf0b0b0bff0d0d0dff0d0d0dff0d0d0dff171717ff282828ff363636ff37373749ffffff01ffffff01ffffff0144444459363636ff353535ff353535ff4e4e4e0fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0162626203161616630b0b0be70c0c0cff0d0d0dff171717ff161616ff171717ed3737372fffffff013e3e3e2b303030b72a2a2aff151515ff262626ff363636ff4b4b4b0fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013636360d101010850a0a0af7141414f91717178f45454511ffffff014c4c4c252c2c2cdb303030ff2d2d2dff151515ff131313ff1b1b1bad5a5a5a07ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff012b2b2b2121212127ffffff01ffffff01ffffff01ffffff0161616109313131752b2b2bf1131313cd26262641ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014e4e4e1359595903ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000028000000300000006000000001002000000000008025000000000000000000000000000000000000ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0173737357545454997c7c7c11ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0176767663515151916c6c6c0dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017676762d636363bb636363ff4d4d4dff434343eb4f4f4f6d7f7f7f05ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0176767635616161c3626262ff494949ff424242e94f4f4f6392929203ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017e7e7e19626262955f5f5ffd626262ff666666ff4f4f4fff464646ff424242ff434343d75a5a5a49ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017777771d6464649f5f5f5fff636363ff656565ff4b4b4bff464646ff424242ff444444d158585841ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff018585850966666677606060ef626262ff636363ff636363ff666666ff4f4f4fff464646ff464646ff464646ff414141ff464646b75d5d5d2dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff018989890d6868687f5f5f5ff5626262ff636363ff636363ff656565ff4b4b4bff464646ff464646ff464646ff404040ff484848b160606027ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff016a6a6a55626262df606060ff636363ff636363ff636363ff636363ff666666ff4f4f4fff464646ff464646ff464646ff464646ff454545ff424242fd484848956a6a6a17ffffff01ffffff01ffffff01ffffff01ffffff016969695f606060e3606060ff636363ff636363ff636363ff636363ff656565ff4b4b4bff464646ff464646ff464646ff464646ff454545ff414141f94a4a4a8d65656513ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff016e6e6e3b656565c15f5f5fff636363ff636363ff636363ff636363ff636363ff636363ff666666ff4f4f4fff464646ff464646ff464646ff464646ff464646ff464646ff444444ff424242ed52525277ffffff01ffffff016c6c6c37676767c95f5f5fff636363ff636363ff636363ff636363ff636363ff636363ff656565ff4b4b4bff464646ff464646ff464646ff464646ff464646ff464646ff434343ff444444e94d4d4d6dffffff01ffffff01ffffff01ffffff01ffffff01ffffff013c3c3cc5454545ff646464ff646464ff636363ff636363ff636363ff636363ff636363ff666666ff4f4f4fff464646ff464646ff464646ff464646ff464646ff464646ff474747ff424242ff333333fb34343409ffffff0131313199494949ff656565ff646464ff636363ff636363ff636363ff636363ff636363ff656565ff4b4b4bff464646ff464646ff464646ff464646ff464646ff464646ff474747ff414141ff373737ebffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf333333ff343434ff4f4f4fff666666ff636363ff636363ff636363ff636363ff666666ff4f4f4fff464646ff464646ff464646ff464646ff474747ff444444ff383838ff343434ff363636f737373707ffffff0135353597343434ff343434ff525252ff666666ff636363ff636363ff636363ff636363ff656565ff4b4b4bff464646ff464646ff464646ff464646ff474747ff444444ff383838ff343434ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf343434ff363636ff333333ff383838ff585858ff676767ff636363ff636363ff666666ff4f4f4fff464646ff464646ff474747ff464646ff3b3b3bff343434ff363636ff363636ff363636f737373707ffffff0135353597363636ff363636ff333333ff383838ff5a5a5aff666666ff636363ff636363ff656565ff4b4b4bff464646ff464646ff474747ff454545ff3a3a3aff343434ff363636ff363636ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf343434ff363636ff363636ff363636ff323232ff3d3d3dff5d5d5dff666666ff666666ff4f4f4fff464646ff474747ff3e3e3eff353535ff353535ff363636ff363636ff363636ff363636f737373707ffffff0135353597363636ff363636ff363636ff363636ff313131ff3f3f3fff5f5f5fff666666ff656565ff4b4b4bff464646ff474747ff3d3d3dff353535ff353535ff363636ff363636ff363636ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf343434ff363636ff363636ff363636ff363636ff353535ff323232ff444444ff676767ff525252ff404040ff363636ff353535ff363636ff363636ff363636ff363636ff363636ff363636f737373707ffffff0135353597363636ff363636ff363636ff363636ff363636ff353535ff323232ff464646ff676767ff4e4e4eff404040ff363636ff353535ff363636ff363636ff363636ff363636ff363636ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf343434ff363636ff363636ff363636ff363636ff363636ff353535ff383838ff2d2d2dff2b2b2bff373737ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636f737373707ffffff0135353597363636ff363636ff363636ff363636ff363636ff363636ff363636ff383838ff2c2c2cff2a2a2aff373737ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf343434ff363636ff363636ff363636ff353535ff383838ff343434ff171717ff090909ff151515ff171717ff2d2d2dff383838ff363636ff363636ff363636ff363636ff363636ff363636f737373707ffffff0135353597363636ff363636ff363636ff363636ff353535ff383838ff333333ff151515ff090909ff151515ff181818ff2f2f2fff383838ff363636ff363636ff363636ff363636ff363636ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf343434ff363636ff363636ff373737ff373737ff1f1f1fff090909ff0c0c0cff0c0c0cff171717ff171717ff141414ff1b1b1bff323232ff383838ff363636ff363636ff363636ff363636f737373707ffffff0135353597363636ff363636ff363636ff373737ff373737ff1d1d1dff0a0a0aff0c0c0cff0c0c0cff171717ff171717ff141414ff1c1c1cff333333ff383838ff353535ff363636ff363636ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf343434ff363636ff393939ff272727ff0c0c0cff0b0b0bff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff161616ff141414ff202020ff353535ff373737ff363636ff363636f737373707ffffff0135353597363636ff363636ff383838ff252525ff0b0b0bff0b0b0bff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff161616ff141414ff222222ff363636ff373737ff363636ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040bf383838ff2d2d2dff101010ff0a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff161616ff141414ff262626ff373737ff373737f737373707ffffff0136363697393939ff2b2b2bff0f0f0fff0a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff161616ff151515ff272727ff383838ff393939e3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013a3a3abd131313ff090909ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff171717ff171717ff151515ff171717ff262626fb38383807ffffff012a2a2a97121212ff090909ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff171717ff171717ff151515ff161616ff2a2a2ae7ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015f5f5f0b1616167b090909ef0a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff171717ff171717ff0f0f0fff181818b74040402dffffff01ffffff014646461118181883080808f30b0b0bff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff171717ff161616ff101010ff181818b141414127ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014d4d4d171212129b090909fd0c0c0cff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff111111ff141414d335353547ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013838381d131313a5060606ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff171717ff171717ff111111ff181818cd2e2e2e3dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01333333310f0f0fbb070707ff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff141414ff121212e72424246d86868603ffffff01ffffff017373732b656565b9464646c95e5e5e3bffffff01ffffff01ffffff01323232370e0e0ec3080808ff0d0d0dff0d0d0dff0c0c0cff171717ff171717ff171717ff121212ff161616e525252563ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff012525254d0e0e0ed9090909ff0c0c0cff171717ff151515ff121212f91d1d1d894d4d4d13ffffff01ffffff0178787815656565935f5f5ffb646464ff484848ff404040ff454545a96a6a6a1fffffff01ffffff01ffffff011b1b1b570e0e0edf080808ff0d0d0dff171717ff151515ff0f0f0ff3212121815656560dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01636363071a1a1a710a0a0aed0f0f0fff1b1b1bad2f2f2f23ffffff01ffffff018d8d8d0566666675616161eb616161ff636363ff646464ff484848ff464646ff454545ff424242f54c4c4c856262620fffffff01ffffff014040400b21212179080808f10f0f0fff1b1b1ba15757571dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014141411740404037ffffff01ffffff01ffffff016a6a6a4d616161db606060ff636363ff636363ff636363ff646464ff484848ff464646ff464646ff464646ff434343ff434343e751515167ffffff01ffffff01ffffff014646461d30303033ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0176767631616161c35f5f5fff636363ff636363ff636363ff636363ff636363ff646464ff484848ff464646ff464646ff464646ff464646ff464646ff424242ff454545d158585841ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015252527f636363ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff646464ff484848ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff434343ff454545a1ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01313131b53b3b3bff5b5b5bff676767ff636363ff636363ff636363ff636363ff636363ff646464ff484848ff464646ff464646ff464646ff464646ff464646ff474747ff444444ff393939ff383838d3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff323232ff404040ff616161ff656565ff626262ff636363ff636363ff646464ff484848ff464646ff464646ff454545ff494949ff474747ff3b3b3bff343434ff353535ff3a3a3ad3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff363636ff353535ff323232ff484848ff656565ff646464ff636363ff646464ff484848ff464646ff474747ff494949ff242424ff282828ff383838ff363636ff363636ff3a3a3ad3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff363636ff363636ff363636ff343434ff343434ff515151ff666666ff656565ff484848ff4b4b4bff323232ff070707ff040404ff151515ff181818ff2f2f2fff383838ff3a3a3ad3ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff363636ff363636ff363636ff363636ff363636ff333333ff383838ff5f5f5fff3c3c3cff0f0f0fff020202ff050505ff050505ff171717ff171717ff141414ff1c1c1cff323232d7ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff363636ff363636ff363636ff363636ff353535ff383838ff343434ff161616ff2a2a2aff0c0c0cff020202ff050505ff050505ff171717ff171717ff101010ff161616bf2e2e2e35ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff363636ff363636ff363636ff373737ff383838ff1f1f1fff0a0a0aff0c0c0cff373737ff3a3a3aff262626ff060606ff040404ff121212ff151515dd30303051ffffff01ffffff01ffffff018787872d6b6b6b47ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff363636ff363636ff393939ff272727ff0d0d0dff0b0b0bff0d0d0dff0d0d0dff373737ff363636ff373737ff383838ff1c1c1cf92020207568686807ffffff01ffffff01ffffff01ffffff018686863d5f5f5fff676767af77777721ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01363636b3363636ff393939ff2e2e2eff101010ff0a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff373737ff363636ff363636ff353535ff373737ebffffff01ffffff01ffffff01ffffff01ffffff01ffffff018686863d626262ff666666ff646464f76969698d9494940fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01383838b5333333ff161616ff090909ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff373737ff363636ff363636ff363636ff353535ebffffff01ffffff01ffffff01ffffff01ffffff01ffffff018686863d626262ff676767ff6b6b6bff555555ff3a3a3a93ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0125252589030303ff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff333333ff383838ff353535ff363636ff353535ebffffff01ffffff01ffffff01ffffff01ffffff01ffffff018585853d666666ff5f5f5fff3c3c3cff313131ff3a3a3a93ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff012d2d2d3f0e0e0ecb080808ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff141414ff222222ff363636ff373737ff353535ebffffff01ffffff01ffffff01ffffff01ffffff01ffffff0177777741414141ff313131ff363636ff353535ff3a3a3a93ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff011e1e1e5f0a0a0ae50a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff171717ff161616ff151515ff282828ff353535f3ffffff01ffffff01ffffff01ffffff016e6e6e0b37373781242424f1191919ff333333ff383838ff343434ff3a3a3a93ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015a5a5a0d1919197f0a0a0af30b0b0bff0d0d0dff0d0d0dff171717ff171717ff161616ff0f0f0ffb24242489ffffff01ffffff01ffffff013e3e3e5d2d2d2de52e2e2eff2b2b2bff151515ff141414ff212121ff363636ff3b3b3b95ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013636361b111111a3080808ff0c0c0cff181818ff0f0f0fff171717b545454525ffffff01ffffff017f7f7f05363636c7282828ff313131ff313131ff2b2b2bff151515ff171717ff161616ff0c0c0cfb3434346bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01303030350f0f0fc7121212d337373741ffffff01ffffff01ffffff01ffffff01ffffff016b6b6b0b3a3a3a7d2c2c2cf12f2f2fff2b2b2bff151515ff101010ff171717bb4646462dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01515151193535359b242424ff131313d72828284bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014e4e4e2b59595905ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff000000000000ffff28000000400000008000000001002000000000000042000000000000000000000000000000000000ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0176767635666666914e4e4e457c7c7c09ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff018080801569696989545454696c6c6c0bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff018484840d70707061616161d5606060fb3d3d3ddf4e4e4e9172727213ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017070704d626262b35f5f5ffb464646f1454545a16a6a6a33ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017676760f67676753646464cf5e5e5eff656565ff626262ff414141ff404040ff444444e54b4b4b7b69696919ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01979797036c6c6c45676767a95d5d5dff616161ff626262ff484848ff424242ff3e3e3efd4e4e4e8958585831ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017e7e7e2b616161a75f5f5fef616161ff636363ff656565ff626262ff424242ff464646ff444444ff414141fd434343b961616153ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017777771969696981606060e7606060ff636363ff636363ff626262ff484848ff464646ff454545ff424242fd414141d95656566569696911ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01858585056e6e6e29656565995f5f5ff1616161ff636363ff636363ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff444444ff3f3f3fff484848af5353534b86868607ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01797979216a6a6a6f616161ed5e5e5eff636363ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff464646ff3e3e3eff474747d75151515762626213ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01838383036f6f6f755f5f5fd3606060ff626262ff636363ff636363ff636363ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff464646ff454545ff434343ff404040e94e4e4e8d5f5f5f1bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff018f8f8f056b6b6b45616161c95f5f5ff7616161ff636363ff636363ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff464646ff464646ff444444ff424242f1434343b16666662dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017070700f6969695f626262d35e5e5eff626262ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff404040ff444444f14d4d4d776a6a6a23ffffff01ffffff01ffffff01ffffff017b7b7b096c6c6c39636363c15f5f5ffb626262ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff434343ff414141f54a4a4aa35b5b5b2d70707007ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0171717143676767a7616161f3616161ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff444444ff414141f7474747cd54545447ffffff01ffffff015b5b5b096b6b6b99646464e1606060ff626262ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff444444ff424242ff414141d552525277ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01404040b33b3b3bff5c5c5cff656565ff646464ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff474747ff454545ff3a3a3aff313131ad34343407ffffff012e2e2e25383838ff535353ff656565ff656565ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff474747ff464646ff3b3b3bff3a3a3ae9ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9313131ff363636ff484848ff636363ff676767ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff404040ff363636ff343434ff353535a537373705ffffff0135353521333333ff333333ff434343ff5c5c5cff686868ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff484848ff414141ff393939ff313131ff3c3c3cdbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff323232ff353535ff4b4b4bff636363ff656565ff636363ff626262ff636363ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff464646ff474747ff464646ff414141ff363636ff343434ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff333333ff313131ff484848ff5e5e5eff666666ff646464ff626262ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff464646ff464646ff474747ff424242ff3a3a3aff343434ff353535ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff343434ff333333ff3d3d3dff555555ff686868ff656565ff626262ff636363ff656565ff626262ff424242ff464646ff464646ff464646ff484848ff444444ff393939ff353535ff353535ff363636ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff353535ff323232ff363636ff515151ff646464ff656565ff636363ff636363ff636363ff626262ff484848ff464646ff464646ff464646ff484848ff454545ff3d3d3dff353535ff343434ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff363636ff363636ff343434ff303030ff3f3f3fff575757ff666666ff656565ff646464ff626262ff424242ff464646ff474747ff454545ff3a3a3aff343434ff353535ff363636ff363636ff363636ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff363636ff363636ff363636ff303030ff373737ff535353ff636363ff656565ff636363ff626262ff484848ff464646ff474747ff454545ff3e3e3eff353535ff343434ff363636ff363636ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff363636ff363636ff363636ff363636ff333333ff333333ff484848ff606060ff696969ff626262ff434343ff474747ff3e3e3eff363636ff353535ff353535ff363636ff363636ff363636ff363636ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff363636ff363636ff363636ff353535ff343434ff333333ff3e3e3eff5d5d5dff686868ff626262ff484848ff474747ff424242ff373737ff353535ff353535ff363636ff363636ff363636ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff323232ff323232ff505050ff616161ff3d3d3dff373737ff343434ff353535ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff343434ff313131ff434343ff606060ff464646ff383838ff343434ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff3a3a3aff2b2b2bff1e1e1eff2d2d2dff383838ff373737ff353535ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff393939ff323232ff1c1c1cff262626ff373737ff383838ff353535ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff363636ff363636ff363636ff353535ff373737ff383838ff303030ff191919ff080808ff101010ff141414ff1a1a1aff303030ff383838ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff363636ff363636ff363636ff353535ff363636ff383838ff363636ff1d1d1dff0b0b0bff0c0c0cff141414ff181818ff292929ff373737ff373737ff363636ff363636ff363636ff363636ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff363636ff363636ff353535ff393939ff363636ff222222ff0c0c0cff0a0a0aff0c0c0cff121212ff171717ff151515ff161616ff212121ff353535ff393939ff363636ff363636ff363636ff363636ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff363636ff363636ff353535ff383838ff3a3a3aff262626ff121212ff0a0a0aff0c0c0cff0f0f0fff171717ff151515ff151515ff1e1e1eff2f2f2fff3a3a3aff363636ff363636ff363636ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff363636ff363636ff363636ff383838ff363636ff262626ff0d0d0dff090909ff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff141414ff151515ff232323ff353535ff383838ff363636ff353535ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff353535ff383838ff383838ff292929ff131313ff080808ff0c0c0cff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff151515ff131313ff202020ff313131ff383838ff363636ff363636ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9343434ff353535ff363636ff3a3a3aff2e2e2eff131313ff0a0a0aff0b0b0bff0d0d0dff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff171717ff161616ff141414ff1a1a1aff2a2a2aff393939ff373737ff363636ff363636ff363636a537373705ffffff0135353521363636ff363636ff363636ff3a3a3aff313131ff1c1c1cff0a0a0aff0a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff161616ff151515ff161616ff282828ff363636ff383838ff363636ff333333ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444a9353535ff383838ff313131ff151515ff080808ff0b0b0bff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff171717ff171717ff171717ff161616ff131313ff1b1b1bff2d2d2dff373737ff373737ff363636a537373705ffffff0134343421363636ff383838ff333333ff1e1e1eff090909ff0a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff171717ff171717ff171717ff131313ff171717ff2a2a2aff363636ff353535ff3d3d3ddbffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01444444af353535ff1e1e1eff0d0d0dff0a0a0aff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff151515ff151515ff222222ff333333ff353535ad30303007ffffff0134343423373737ff282828ff0d0d0dff0a0a0aff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff151515ff141414ff1b1b1bff2e2e2eff3e3e3ee1ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013e3e3e6f0f0f0fd5040404ff0b0b0bff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff101010ff0e0e0ee72f2f2f7347474703ffffff013b3b3b13141414cd050505f70a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff121212ff0c0c0cf12a2a2aa5ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015f5f5f052020202b1a1a1aa1080808f1070707ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff141414ff0c0c0cff212121af2a2a2a496d6d6d07ffffff01ffffff01ffffff01333333231d1d1d730b0b0beb060606ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff171717ff171717ff171717ff171717ff151515ff0e0e0eff181818d72626265546464615ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014d4d4d29121212af080808ef0a0a0aff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff171717ff171717ff171717ff141414ff121212f9141414b93b3b3b4fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0138383819151515890a0a0ae5080808ff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff171717ff171717ff161616ff101010fb151515d72c2c2c614444440dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0133333311262626510f0f0fd7050505ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff121212ff171717ff171717ff171717ff171717ff171717ff101010ff141414e7242424733a3a3a19ffffff01ffffff01ffffff01878787097272725f4d4d4d736a6a6a11ffffff01ffffff01ffffff016060600524242445191919ad040404ff0a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff171717ff171717ff171717ff111111ff0e0e0efd242424873232322dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015c5c5c0d2525255f090909d7080808fb0b0b0bff0d0d0dff0c0c0cff121212ff171717ff171717ff161616ff121212ff121212df2121218965656511ffffff01ffffff01ffffff018080800d6767674b646464d1606060ff454545ff464646df4f4f4f6165656517ffffff01ffffff01ffffff01ffffff012d2d2d4b101010b5060606fb0a0a0aff0d0d0dff0d0d0dff0f0f0fff171717ff171717ff161616ff131313ff101010ef2020209d4242422dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff012c2c2c2d1f1f1f83080808fb080808ff0d0d0dff121212ff171717ff141414ff0f0f0ff91e1e1eb12c2c2c354d4d4d09ffffff01ffffff01ffffff0178787825646464a75f5f5feb616161ff656565ff4a4a4aff414141ff424242f3414141bd69696937ffffff01ffffff01ffffff01ffffff0142424219171717710d0d0de3060606ff0c0c0cff0f0f0fff171717ff151515ff0d0d0dff171717c3292929575656560dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013737372d1212129d080808ef0d0d0dff121212f5191919bf2e2e2e3d70707003ffffff01ffffff018c8c8c037676762564646497606060ed606060ff636363ff636363ff656565ff4a4a4aff444444ff464646ff444444ff404040f74a4a4aad5555553162626207ffffff01ffffff01ffffff014040401125252589090909dd0a0a0aff121212ff141414c738383869ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015b5b5b0b1f1f1f591d1d1daf292929673f3f3f19ffffff01ffffff01ffffff01ffffff016d6d6d715f5f5fcd606060ff626262ff636363ff636363ff636363ff656565ff4a4a4aff444444ff464646ff464646ff454545ff434343ff414141db4f4f4f857b7b7b11ffffff01ffffff01ffffff0153535307222222331d1d1da91b1b1b8d4141412365656503ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff017c7c7c0f6868685d636363cb5e5e5eff626262ff636363ff636363ff636363ff636363ff636363ff656565ff4a4a4aff444444ff464646ff464646ff464646ff464646ff464646ff404040ff454545e14c4c4c6b69696917ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0177777733626262a3606060f3616161ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff4a4a4aff444444ff464646ff464646ff464646ff464646ff464646ff464646ff444444ff424242f9454545b55d5d5d49ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014b4b4b0f5e5e5e85626262ff626262ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff4a4a4aff444444ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff444444ff414141ff454545a16464641dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0132323225333333cf4e4e4eff646464ff666666ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff4a4a4aff444444ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff474747ff404040ff303030e35757573bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd313131ff363636ff515151ff636363ff656565ff636363ff636363ff636363ff636363ff636363ff636363ff656565ff4a4a4aff444444ff464646ff464646ff464646ff464646ff464646ff464646ff464646ff414141ff373737ff343434ff323232e159595939ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff343434ff333333ff3c3c3cff5b5b5bff686868ff636363ff626262ff636363ff636363ff636363ff656565ff4a4a4aff444444ff464646ff464646ff454545ff464646ff4c4c4cff454545ff393939ff353535ff353535ff353535ff323232e159595939ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff363636ff353535ff313131ff3f3f3fff5d5d5dff666666ff646464ff626262ff636363ff656565ff4a4a4aff444444ff454545ff474747ff4a4a4aff404040ff212121ff2f2f2fff373737ff373737ff353535ff363636ff323232e159595939ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff363636ff363636ff353535ff333333ff363636ff484848ff646464ff676767ff626262ff656565ff4a4a4aff444444ff4b4b4bff4a4a4aff262626ff0b0b0bff090909ff171717ff252525ff353535ff393939ff363636ff323232e159595939ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff363636ff363636ff363636ff363636ff363636ff323232ff363636ff4c4c4cff646464ff676767ff4d4d4dff484848ff2c2c2cff0b0b0bff020202ff040404ff0b0b0bff171717ff141414ff161616ff282828ff353535ff343434e359595939ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff363636ff363636ff363636ff363636ff363636ff363636ff343434ff323232ff3f3f3fff5f5f5fff3a3a3aff161616ff030303ff030303ff050505ff040404ff0b0b0bff171717ff171717ff161616ff151515ff1a1a1aff242424e55555553bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff363636ff363636ff363636ff363636ff363636ff353535ff363636ff383838ff2e2e2eff191919ff262626ff111111ff030303ff030303ff050505ff040404ff0b0b0bff171717ff171717ff151515ff111111f9121212cd272727557d7d7d09ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff363636ff363636ff363636ff363636ff363636ff383838ff373737ff242424ff0b0b0bff0a0a0aff393939ff393939ff222222ff080808ff020202ff030303ff0b0b0bff181818ff0f0f0fff151515f32424247935353525ffffff01ffffff01ffffff01a3a3a30fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff363636ff363636ff363636ff383838ff373737ff272727ff0c0c0cff090909ff0c0c0cff0e0e0eff373737ff363636ff3a3a3aff393939ff1e1e1eff080808ff080808ff0f0f0feb232323914040401dffffff01ffffff01ffffff01ffffff01ffffff018282825d626262c36d6d6d4d8d8d8d09ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff363636ff353535ff363636ff3a3a3aff2f2f2fff131313ff0b0b0bff0b0b0bff0d0d0dff0c0c0cff0e0e0eff373737ff363636ff353535ff363636ff393939ff303030ff1c1c1cc92626264d68686807ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01868686515e5e5eff646464e9696969957878781fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723363636cd363636ff373737ff383838ff313131ff161616ff090909ff0b0b0bff0d0d0dff0d0d0dff0d0d0dff0c0c0cff0e0e0eff373737ff363636ff363636ff363636ff353535ff353535ff3c3c3c8fffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0186868651616161ff676767ff646464ff656565f16a6a6a7d7f7f7f25ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0137373723353535cd393939ff373737ff1f1f1fff0d0d0dff0a0a0aff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff0e0e0eff373737ff363636ff363636ff363636ff363636ff353535ff37373791ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0186868651616161ff676767ff666666ff676767ff686868f9555555cd55555511ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0134343425323232cf212121ff0e0e0eff090909ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff0e0e0eff383838ff363636ff363636ff363636ff363636ff353535ff37373791ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0186868651616161ff686868ff696969ff5f5f5fff3d3d3dff303030ff4848481dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01474747132323238f020202ff080808ff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff0c0c0cff2e2e2eff393939ff363636ff353535ff363636ff353535ff37373791ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0185858551666666ff676767ff494949ff353535ff323232ff353535ff4e4e4e1bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0130303045101010af080808f70a0a0aff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff0d0d0dff131313ff1c1c1cff303030ff373737ff363636ff353535ff37373791ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0181818151494949ff363636ff313131ff363636ff353535ff363636ff4e4e4e1bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff0141414113191919690f0f0fdb060606ff0c0c0cff0d0d0dff0d0d0dff0d0d0dff0d0d0dff0c0c0cff0d0d0dff171717ff151515ff161616ff222222ff363636ff383838ff37373791ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff014d4d4d53272727c1242424ff373737ff373737ff353535ff353535ff363636ff4e4e4e1bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01626262091c1c1c830b0b0bd7090909ff0c0c0cff0d0d0dff0d0d0dff0c0c0cff0d0d0dff171717ff171717ff171717ff141414ff151515ff202020ff35353595ffffff01ffffff01ffffff01ffffff017474740540404049343434af2a2a2aff262626ff101010ff191919ff2e2e2eff373737ff363636ff363636ff4e4e4e1bffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015a5a5a073636362d141414a7080808f5080808ff0d0d0dff0c0c0cff0d0d0dff171717ff171717ff171717ff151515ff0e0e0efb1b1b1bbb3d3d3d29ffffff01ffffff01ffffff0151515119393939892a2a2ae92d2d2dff323232ff282828ff141414ff151515ff151515ff1f1f1fff343434ff393939ff4949491dffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff013636362f111111b5070707f30a0a0aff0d0d0dff171717ff141414ff111111f5111111c74343433d70707005ffffff01ffffff017c7c7c034e4e4e632a2a2af7292929ff323232ff313131ff323232ff282828ff141414ff171717ff171717ff151515ff0e0e0efd222222e153535315ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff012d2d2d151f1f1f590e0e0edb040404ff0f0f0fff171717e7262626673f3f3f1dffffff01ffffff01ffffff01ffffff01ffffff01444444293535358b2d2d2deb2b2b2bff313131ff323232ff282828ff141414ff171717ff121212ff0d0d0dff2222229d2626263dbebebe03ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01505050112626266f1d1d1d7f36363617ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01616161213333339d2c2c2ce92f2f2fff282828ff111111ff111111f7191919ab3c3c3c41ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015151510b3b3b3b43383838c51f1f1fff141414d71e1e1e654f4f4f13ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff015858580b4d4d4d4159595909ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff01ffffff010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000` diff --git a/swarm/api/http/test_server.go b/swarm/api/http/test_server.go deleted file mode 100644 index 902b8b604e1d..000000000000 --- a/swarm/api/http/test_server.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package http - -import ( - "io/ioutil" - "net/http" - "net/http/httptest" - "os" - "testing" - - "github.com/nebulaai/nbai-node/swarm/api" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/storage/feed" -) - -type TestServer interface { - ServeHTTP(http.ResponseWriter, *http.Request) -} - -func NewTestSwarmServer(t *testing.T, serverFunc func(*api.API) TestServer, resolver api.Resolver) *TestSwarmServer { - dir, err := ioutil.TempDir("", "swarm-storage-test") - if err != nil { - t.Fatal(err) - } - storeparams := storage.NewDefaultLocalStoreParams() - storeparams.DbCapacity = 5000000 - storeparams.CacheCapacity = 5000 - storeparams.Init(dir) - localStore, err := storage.NewLocalStore(storeparams, nil) - if err != nil { - os.RemoveAll(dir) - t.Fatal(err) - } - fileStore := storage.NewFileStore(localStore, storage.NewFileStoreParams()) - - // Swarm feeds test setup - feedsDir, err := ioutil.TempDir("", "swarm-feeds-test") - if err != nil { - t.Fatal(err) - } - - rhparams := &feed.HandlerParams{} - rh, err := feed.NewTestHandler(feedsDir, rhparams) - if err != nil { - t.Fatal(err) - } - - a := api.NewAPI(fileStore, resolver, rh.Handler, nil) - srv := httptest.NewServer(serverFunc(a)) - tss := &TestSwarmServer{ - Server: srv, - FileStore: fileStore, - dir: dir, - Hasher: storage.MakeHashFunc(storage.DefaultHash)(), - cleanup: func() { - srv.Close() - rh.Close() - os.RemoveAll(dir) - os.RemoveAll(feedsDir) - }, - CurrentTime: 42, - } - feed.TimestampProvider = tss - return tss -} - -type TestSwarmServer struct { - *httptest.Server - Hasher storage.SwarmHash - FileStore *storage.FileStore - dir string - cleanup func() - CurrentTime uint64 -} - -func (t *TestSwarmServer) Close() { - t.cleanup() -} - -func (t *TestSwarmServer) Now() feed.Timestamp { - return feed.Timestamp{Time: t.CurrentTime} -} diff --git a/swarm/api/manifest.go b/swarm/api/manifest.go deleted file mode 100644 index 2c34d02dd1b0..000000000000 --- a/swarm/api/manifest.go +++ /dev/null @@ -1,585 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "bytes" - "context" - "encoding/json" - "errors" - "fmt" - "io" - "net/http" - "strings" - "time" - - "github.com/nebulaai/nbai-node/swarm/storage/feed" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/storage" -) - -const ( - ManifestType = "application/bzz-manifest+json" - FeedContentType = "application/bzz-feed" - - manifestSizeLimit = 5 * 1024 * 1024 -) - -// Manifest represents a swarm manifest -type Manifest struct { - Entries []ManifestEntry `json:"entries,omitempty"` -} - -// ManifestEntry represents an entry in a swarm manifest -type ManifestEntry struct { - Hash string `json:"hash,omitempty"` - Path string `json:"path,omitempty"` - ContentType string `json:"contentType,omitempty"` - Mode int64 `json:"mode,omitempty"` - Size int64 `json:"size,omitempty"` - ModTime time.Time `json:"mod_time,omitempty"` - Status int `json:"status,omitempty"` - Access *AccessEntry `json:"access,omitempty"` - Feed *feed.Feed `json:"feed,omitempty"` -} - -// ManifestList represents the result of listing files in a manifest -type ManifestList struct { - CommonPrefixes []string `json:"common_prefixes,omitempty"` - Entries []*ManifestEntry `json:"entries,omitempty"` -} - -// NewManifest creates and stores a new, empty manifest -func (a *API) NewManifest(ctx context.Context, toEncrypt bool) (storage.Address, error) { - var manifest Manifest - data, err := json.Marshal(&manifest) - if err != nil { - return nil, err - } - addr, wait, err := a.Store(ctx, bytes.NewReader(data), int64(len(data)), toEncrypt) - if err != nil { - return nil, err - } - err = wait(ctx) - return addr, err -} - -// Manifest hack for supporting Swarm feeds from the bzz: scheme -// see swarm/api/api.go:API.Get() for more information -func (a *API) NewFeedManifest(ctx context.Context, feed *feed.Feed) (storage.Address, error) { - var manifest Manifest - entry := ManifestEntry{ - Feed: feed, - ContentType: FeedContentType, - } - manifest.Entries = append(manifest.Entries, entry) - data, err := json.Marshal(&manifest) - if err != nil { - return nil, err - } - addr, wait, err := a.Store(ctx, bytes.NewReader(data), int64(len(data)), false) - if err != nil { - return nil, err - } - err = wait(ctx) - return addr, err -} - -// ManifestWriter is used to add and remove entries from an underlying manifest -type ManifestWriter struct { - api *API - trie *manifestTrie - quitC chan bool -} - -func (a *API) NewManifestWriter(ctx context.Context, addr storage.Address, quitC chan bool) (*ManifestWriter, error) { - trie, err := loadManifest(ctx, a.fileStore, addr, quitC, NOOPDecrypt) - if err != nil { - return nil, fmt.Errorf("error loading manifest %s: %s", addr, err) - } - return &ManifestWriter{a, trie, quitC}, nil -} - -// AddEntry stores the given data and adds the resulting address to the manifest -func (m *ManifestWriter) AddEntry(ctx context.Context, data io.Reader, e *ManifestEntry) (addr storage.Address, err error) { - entry := newManifestTrieEntry(e, nil) - if data != nil { - var wait func(context.Context) error - addr, wait, err = m.api.Store(ctx, data, e.Size, m.trie.encrypted) - if err != nil { - return nil, err - } - err = wait(ctx) - if err != nil { - return nil, err - } - entry.Hash = addr.Hex() - } - if entry.Hash == "" { - return addr, errors.New("missing entry hash") - } - m.trie.addEntry(entry, m.quitC) - return addr, nil -} - -// RemoveEntry removes the given path from the manifest -func (m *ManifestWriter) RemoveEntry(path string) error { - m.trie.deleteEntry(path, m.quitC) - return nil -} - -// Store stores the manifest, returning the resulting storage address -func (m *ManifestWriter) Store() (storage.Address, error) { - return m.trie.ref, m.trie.recalcAndStore() -} - -// ManifestWalker is used to recursively walk the entries in the manifest and -// all of its submanifests -type ManifestWalker struct { - api *API - trie *manifestTrie - quitC chan bool -} - -func (a *API) NewManifestWalker(ctx context.Context, addr storage.Address, decrypt DecryptFunc, quitC chan bool) (*ManifestWalker, error) { - trie, err := loadManifest(ctx, a.fileStore, addr, quitC, decrypt) - if err != nil { - return nil, fmt.Errorf("error loading manifest %s: %s", addr, err) - } - return &ManifestWalker{a, trie, quitC}, nil -} - -// ErrSkipManifest is used as a return value from WalkFn to indicate that the -// manifest should be skipped -var ErrSkipManifest = errors.New("skip this manifest") - -// WalkFn is the type of function called for each entry visited by a recursive -// manifest walk -type WalkFn func(entry *ManifestEntry) error - -// Walk recursively walks the manifest calling walkFn for each entry in the -// manifest, including submanifests -func (m *ManifestWalker) Walk(walkFn WalkFn) error { - return m.walk(m.trie, "", walkFn) -} - -func (m *ManifestWalker) walk(trie *manifestTrie, prefix string, walkFn WalkFn) error { - for _, entry := range &trie.entries { - if entry == nil { - continue - } - entry.Path = prefix + entry.Path - err := walkFn(&entry.ManifestEntry) - if err != nil { - if entry.ContentType == ManifestType && err == ErrSkipManifest { - continue - } - return err - } - if entry.ContentType != ManifestType { - continue - } - if err := trie.loadSubTrie(entry, nil); err != nil { - return err - } - if err := m.walk(entry.subtrie, entry.Path, walkFn); err != nil { - return err - } - } - return nil -} - -type manifestTrie struct { - fileStore *storage.FileStore - entries [257]*manifestTrieEntry // indexed by first character of basePath, entries[256] is the empty basePath entry - ref storage.Address // if ref != nil, it is stored - encrypted bool - decrypt DecryptFunc -} - -func newManifestTrieEntry(entry *ManifestEntry, subtrie *manifestTrie) *manifestTrieEntry { - return &manifestTrieEntry{ - ManifestEntry: *entry, - subtrie: subtrie, - } -} - -type manifestTrieEntry struct { - ManifestEntry - - subtrie *manifestTrie -} - -func loadManifest(ctx context.Context, fileStore *storage.FileStore, addr storage.Address, quitC chan bool, decrypt DecryptFunc) (trie *manifestTrie, err error) { // non-recursive, subtrees are downloaded on-demand - log.Trace("manifest lookup", "addr", addr) - // retrieve manifest via FileStore - manifestReader, isEncrypted := fileStore.Retrieve(ctx, addr) - log.Trace("reader retrieved", "addr", addr) - return readManifest(manifestReader, addr, fileStore, isEncrypted, quitC, decrypt) -} - -func readManifest(mr storage.LazySectionReader, addr storage.Address, fileStore *storage.FileStore, isEncrypted bool, quitC chan bool, decrypt DecryptFunc) (trie *manifestTrie, err error) { // non-recursive, subtrees are downloaded on-demand - - // TODO check size for oversized manifests - size, err := mr.Size(mr.Context(), quitC) - if err != nil { // size == 0 - // can't determine size means we don't have the root chunk - log.Trace("manifest not found", "addr", addr) - err = fmt.Errorf("Manifest not Found") - return - } - if size > manifestSizeLimit { - log.Warn("manifest exceeds size limit", "addr", addr, "size", size, "limit", manifestSizeLimit) - err = fmt.Errorf("Manifest size of %v bytes exceeds the %v byte limit", size, manifestSizeLimit) - return - } - manifestData := make([]byte, size) - read, err := mr.Read(manifestData) - if int64(read) < size { - log.Trace("manifest not found", "addr", addr) - if err == nil { - err = fmt.Errorf("Manifest retrieval cut short: read %v, expect %v", read, size) - } - return - } - - log.Debug("manifest retrieved", "addr", addr) - var man struct { - Entries []*manifestTrieEntry `json:"entries"` - } - err = json.Unmarshal(manifestData, &man) - if err != nil { - err = fmt.Errorf("Manifest %v is malformed: %v", addr.Log(), err) - log.Trace("malformed manifest", "addr", addr) - return - } - - log.Trace("manifest entries", "addr", addr, "len", len(man.Entries)) - - trie = &manifestTrie{ - fileStore: fileStore, - encrypted: isEncrypted, - decrypt: decrypt, - } - for _, entry := range man.Entries { - err = trie.addEntry(entry, quitC) - if err != nil { - return - } - } - return -} - -func (mt *manifestTrie) addEntry(entry *manifestTrieEntry, quitC chan bool) error { - mt.ref = nil // trie modified, hash needs to be re-calculated on demand - - if entry.ManifestEntry.Access != nil { - if mt.decrypt == nil { - return errors.New("dont have decryptor") - } - - err := mt.decrypt(&entry.ManifestEntry) - if err != nil { - return err - } - } - - if len(entry.Path) == 0 { - mt.entries[256] = entry - return nil - } - - b := entry.Path[0] - oldentry := mt.entries[b] - if (oldentry == nil) || (oldentry.Path == entry.Path && oldentry.ContentType != ManifestType) { - mt.entries[b] = entry - return nil - } - - cpl := 0 - for (len(entry.Path) > cpl) && (len(oldentry.Path) > cpl) && (entry.Path[cpl] == oldentry.Path[cpl]) { - cpl++ - } - - if (oldentry.ContentType == ManifestType) && (cpl == len(oldentry.Path)) { - if mt.loadSubTrie(oldentry, quitC) != nil { - return nil - } - entry.Path = entry.Path[cpl:] - oldentry.subtrie.addEntry(entry, quitC) - oldentry.Hash = "" - return nil - } - - commonPrefix := entry.Path[:cpl] - - subtrie := &manifestTrie{ - fileStore: mt.fileStore, - encrypted: mt.encrypted, - } - entry.Path = entry.Path[cpl:] - oldentry.Path = oldentry.Path[cpl:] - subtrie.addEntry(entry, quitC) - subtrie.addEntry(oldentry, quitC) - - mt.entries[b] = newManifestTrieEntry(&ManifestEntry{ - Path: commonPrefix, - ContentType: ManifestType, - }, subtrie) - return nil -} - -func (mt *manifestTrie) getCountLast() (cnt int, entry *manifestTrieEntry) { - for _, e := range &mt.entries { - if e != nil { - cnt++ - entry = e - } - } - return -} - -func (mt *manifestTrie) deleteEntry(path string, quitC chan bool) { - mt.ref = nil // trie modified, hash needs to be re-calculated on demand - - if len(path) == 0 { - mt.entries[256] = nil - return - } - - b := path[0] - entry := mt.entries[b] - if entry == nil { - return - } - if entry.Path == path { - mt.entries[b] = nil - return - } - - epl := len(entry.Path) - if (entry.ContentType == ManifestType) && (len(path) >= epl) && (path[:epl] == entry.Path) { - if mt.loadSubTrie(entry, quitC) != nil { - return - } - entry.subtrie.deleteEntry(path[epl:], quitC) - entry.Hash = "" - // remove subtree if it has less than 2 elements - cnt, lastentry := entry.subtrie.getCountLast() - if cnt < 2 { - if lastentry != nil { - lastentry.Path = entry.Path + lastentry.Path - } - mt.entries[b] = lastentry - } - } -} - -func (mt *manifestTrie) recalcAndStore() error { - if mt.ref != nil { - return nil - } - - var buffer bytes.Buffer - buffer.WriteString(`{"entries":[`) - - list := &Manifest{} - for _, entry := range &mt.entries { - if entry != nil { - if entry.Hash == "" { // TODO: paralellize - err := entry.subtrie.recalcAndStore() - if err != nil { - return err - } - entry.Hash = entry.subtrie.ref.Hex() - } - list.Entries = append(list.Entries, entry.ManifestEntry) - } - - } - - manifest, err := json.Marshal(list) - if err != nil { - return err - } - - sr := bytes.NewReader(manifest) - ctx := context.TODO() - addr, wait, err2 := mt.fileStore.Store(ctx, sr, int64(len(manifest)), mt.encrypted) - if err2 != nil { - return err2 - } - err2 = wait(ctx) - mt.ref = addr - return err2 -} - -func (mt *manifestTrie) loadSubTrie(entry *manifestTrieEntry, quitC chan bool) (err error) { - if entry.ManifestEntry.Access != nil { - if mt.decrypt == nil { - return errors.New("dont have decryptor") - } - - err := mt.decrypt(&entry.ManifestEntry) - if err != nil { - return err - } - } - - if entry.subtrie == nil { - hash := common.Hex2Bytes(entry.Hash) - entry.subtrie, err = loadManifest(context.TODO(), mt.fileStore, hash, quitC, mt.decrypt) - entry.Hash = "" // might not match, should be recalculated - } - return -} - -func (mt *manifestTrie) listWithPrefixInt(prefix, rp string, quitC chan bool, cb func(entry *manifestTrieEntry, suffix string)) error { - plen := len(prefix) - var start, stop int - if plen == 0 { - start = 0 - stop = 256 - } else { - start = int(prefix[0]) - stop = start - } - - for i := start; i <= stop; i++ { - select { - case <-quitC: - return fmt.Errorf("aborted") - default: - } - entry := mt.entries[i] - if entry != nil { - epl := len(entry.Path) - if entry.ContentType == ManifestType { - l := plen - if epl < l { - l = epl - } - if prefix[:l] == entry.Path[:l] { - err := mt.loadSubTrie(entry, quitC) - if err != nil { - return err - } - err = entry.subtrie.listWithPrefixInt(prefix[l:], rp+entry.Path[l:], quitC, cb) - if err != nil { - return err - } - } - } else { - if (epl >= plen) && (prefix == entry.Path[:plen]) { - cb(entry, rp+entry.Path[plen:]) - } - } - } - } - return nil -} - -func (mt *manifestTrie) listWithPrefix(prefix string, quitC chan bool, cb func(entry *manifestTrieEntry, suffix string)) (err error) { - return mt.listWithPrefixInt(prefix, "", quitC, cb) -} - -func (mt *manifestTrie) findPrefixOf(path string, quitC chan bool) (entry *manifestTrieEntry, pos int) { - log.Trace(fmt.Sprintf("findPrefixOf(%s)", path)) - - if len(path) == 0 { - return mt.entries[256], 0 - } - - //see if first char is in manifest entries - b := path[0] - entry = mt.entries[b] - if entry == nil { - return mt.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 { - if entry.Path[:len(path)] == path { - if entry.ContentType == ManifestType { - err := mt.loadSubTrie(entry, quitC) - if err == nil && entry.subtrie != nil { - subentries := entry.subtrie.entries - for i := 0; i < len(subentries); i++ { - sub := subentries[i] - if sub != nil && sub.Path == "" { - return sub, len(path) - } - } - } - 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)) - //the subentry is a manifest, load subtrie - if entry.ContentType == ManifestType && (strings.Contains(entry.Path, path) || strings.Contains(path, entry.Path)) { - err := mt.loadSubTrie(entry, quitC) - if err != nil { - return nil, 0 - } - 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 - } - } - } - return nil, 0 -} - -// file system manifest always contains regularized paths -// no leading or trailing slashes, only single slashes inside -func RegularSlashes(path string) (res string) { - for i := 0; i < len(path); i++ { - if (path[i] != '/') || ((i > 0) && (path[i-1] != '/')) { - res = res + path[i:i+1] - } - } - if (len(res) > 0) && (res[len(res)-1] == '/') { - res = res[:len(res)-1] - } - return -} - -func (mt *manifestTrie) getEntry(spath string) (entry *manifestTrieEntry, fullpath string) { - path := RegularSlashes(spath) - var pos int - quitC := make(chan bool) - entry, pos = mt.findPrefixOf(path, quitC) - return entry, path[:pos] -} diff --git a/swarm/api/manifest_test.go b/swarm/api/manifest_test.go deleted file mode 100644 index d5bd3b8f8a5b..000000000000 --- a/swarm/api/manifest_test.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "strings" - "testing" - - "github.com/nebulaai/nbai-node/swarm/storage" -) - -func manifest(paths ...string) (manifestReader storage.LazySectionReader) { - var entries []string - for _, path := range paths { - entry := fmt.Sprintf(`{"path":"%s"}`, path) - entries = append(entries, entry) - } - manifest := fmt.Sprintf(`{"entries":[%s]}`, strings.Join(entries, ",")) - return &storage.LazyTestSectionReader{ - SectionReader: io.NewSectionReader(strings.NewReader(manifest), 0, int64(len(manifest))), - } -} - -func testGetEntry(t *testing.T, path, match string, multiple bool, paths ...string) *manifestTrie { - quitC := make(chan bool) - fileStore := storage.NewFileStore(nil, storage.NewFileStoreParams()) - ref := make([]byte, fileStore.HashSize()) - trie, err := readManifest(manifest(paths...), ref, fileStore, false, quitC, NOOPDecrypt) - if err != nil { - t.Errorf("unexpected error making manifest: %v", err) - } - checkEntry(t, path, match, multiple, trie) - return trie -} - -func checkEntry(t *testing.T, path, match string, multiple bool, trie *manifestTrie) { - entry, fullpath := trie.getEntry(path) - if match == "-" && entry != nil { - t.Errorf("expected no match for '%s', got '%s'", path, fullpath) - } else if entry == nil { - if match != "-" { - t.Errorf("expected entry '%s' to match '%s', got no match", match, path) - } - } else if fullpath != match { - t.Errorf("incorrect entry retrieved for '%s'. expected path '%v', got '%s'", path, match, fullpath) - } - - if multiple && entry.Status != http.StatusMultipleChoices { - t.Errorf("Expected %d Multiple Choices Status for path %s, match %s, got %d", http.StatusMultipleChoices, path, match, entry.Status) - } else if !multiple && entry != nil && entry.Status == http.StatusMultipleChoices { - t.Errorf("Were not expecting %d Multiple Choices Status for path %s, match %s, but got it", http.StatusMultipleChoices, path, match) - } -} - -func TestGetEntry(t *testing.T) { - // file system manifest always contains regularized paths - testGetEntry(t, "a", "a", false, "a") - testGetEntry(t, "b", "-", false, "a") - testGetEntry(t, "/a//", "a", false, "a") - // fallback - testGetEntry(t, "/a", "", false, "") - testGetEntry(t, "/a/b", "a/b", false, "a/b") - // longest/deepest math - testGetEntry(t, "read", "read", true, "readme.md", "readit.md") - testGetEntry(t, "rf", "-", false, "readme.md", "readit.md") - testGetEntry(t, "readme", "readme", false, "readme.md") - testGetEntry(t, "readme", "-", false, "readit.md") - testGetEntry(t, "readme.md", "readme.md", false, "readme.md") - testGetEntry(t, "readme.md", "-", false, "readit.md") - testGetEntry(t, "readmeAmd", "-", false, "readit.md") - testGetEntry(t, "readme.mdffff", "-", false, "readme.md") - testGetEntry(t, "ab", "ab", true, "ab/cefg", "ab/cedh", "ab/kkkkkk") - testGetEntry(t, "ab/ce", "ab/ce", true, "ab/cefg", "ab/cedh", "ab/ceuuuuuuuuuu") - testGetEntry(t, "abc", "abc", true, "abcd", "abczzzzef", "abc/def", "abc/e/g") - testGetEntry(t, "a/b", "a/b", true, "a", "a/bc", "a/ba", "a/b/c") - testGetEntry(t, "a/b", "a/b", false, "a", "a/b", "a/bb", "a/b/c") - testGetEntry(t, "//a//b//", "a/b", false, "a", "a/b", "a/bb", "a/b/c") -} - -func TestExactMatch(t *testing.T) { - quitC := make(chan bool) - mf := manifest("shouldBeExactMatch.css", "shouldBeExactMatch.css.map") - fileStore := storage.NewFileStore(nil, storage.NewFileStoreParams()) - ref := make([]byte, fileStore.HashSize()) - trie, err := readManifest(mf, ref, fileStore, false, quitC, nil) - if err != nil { - t.Errorf("unexpected error making manifest: %v", err) - } - entry, _ := trie.getEntry("shouldBeExactMatch.css") - if entry.Path != "" { - t.Errorf("Expected entry to match %s, got: %s", "shouldBeExactMatch.css", entry.Path) - } - if entry.Status == http.StatusMultipleChoices { - t.Errorf("Got status %d, which is unexepcted", http.StatusMultipleChoices) - } -} - -func TestDeleteEntry(t *testing.T) { - -} - -// TestAddFileWithManifestPath tests that adding an entry at a path which -// already exists as a manifest just adds the entry to the manifest rather -// than replacing the manifest with the entry -func TestAddFileWithManifestPath(t *testing.T) { - // create a manifest containing "ab" and "ac" - manifest, _ := json.Marshal(&Manifest{ - Entries: []ManifestEntry{ - {Path: "ab", Hash: "ab"}, - {Path: "ac", Hash: "ac"}, - }, - }) - reader := &storage.LazyTestSectionReader{ - SectionReader: io.NewSectionReader(bytes.NewReader(manifest), 0, int64(len(manifest))), - } - fileStore := storage.NewFileStore(nil, storage.NewFileStoreParams()) - ref := make([]byte, fileStore.HashSize()) - trie, err := readManifest(reader, ref, fileStore, false, nil, NOOPDecrypt) - if err != nil { - t.Fatal(err) - } - checkEntry(t, "ab", "ab", false, trie) - checkEntry(t, "ac", "ac", false, trie) - - // now add path "a" and check we can still get "ab" and "ac" - entry := &manifestTrieEntry{} - entry.Path = "a" - entry.Hash = "a" - trie.addEntry(entry, nil) - checkEntry(t, "ab", "ab", false, trie) - checkEntry(t, "ac", "ac", false, trie) - checkEntry(t, "a", "a", false, trie) -} - -// TestReadManifestOverSizeLimit creates a manifest reader with data longer then -// manifestSizeLimit and checks if readManifest function will return the exact error -// message. -// The manifest data is not in json-encoded format, preventing possbile -// successful parsing attempts if limit check fails. -func TestReadManifestOverSizeLimit(t *testing.T) { - manifest := make([]byte, manifestSizeLimit+1) - reader := &storage.LazyTestSectionReader{ - SectionReader: io.NewSectionReader(bytes.NewReader(manifest), 0, int64(len(manifest))), - } - _, err := readManifest(reader, storage.Address{}, nil, false, nil, NOOPDecrypt) - if err == nil { - t.Fatal("got no error from readManifest") - } - // Error message is part of the http response body - // which justifies exact string validation. - got := err.Error() - want := fmt.Sprintf("Manifest size of %v bytes exceeds the %v byte limit", len(manifest), manifestSizeLimit) - if got != want { - t.Fatalf("got error mesage %q, expected %q", got, want) - } -} diff --git a/swarm/api/storage.go b/swarm/api/storage.go deleted file mode 100644 index cf8ac90206c3..000000000000 --- a/swarm/api/storage.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "context" - "path" - - "github.com/nebulaai/nbai-node/swarm/storage" -) - -type Response struct { - MimeType string - Status int - Size int64 - // Content []byte - Content string -} - -// implements a service -// -// DEPRECATED: Use the HTTP API instead -type Storage struct { - api *API -} - -func NewStorage(api *API) *Storage { - return &Storage{api} -} - -// Put uploads the content to the swarm with a simple manifest speficying -// its content type -// -// DEPRECATED: Use the HTTP API instead -func (s *Storage) Put(ctx context.Context, content string, contentType string, toEncrypt bool) (storage.Address, func(context.Context) error, error) { - return s.api.Put(ctx, content, contentType, toEncrypt) -} - -// Get retrieves the content from bzzpath and reads the response in full -// It returns the Response object, which serialises containing the -// response body as the value of the Content field -// NOTE: if error is non-nil, sResponse may still have partial content -// the actual size of which is given in len(resp.Content), while the expected -// size is resp.Size -// -// DEPRECATED: Use the HTTP API instead -func (s *Storage) Get(ctx context.Context, bzzpath string) (*Response, error) { - uri, err := Parse(path.Join("bzz:/", bzzpath)) - if err != nil { - return nil, err - } - addr, err := s.api.Resolve(ctx, uri.Addr) - if err != nil { - return nil, err - } - reader, mimeType, status, _, err := s.api.Get(ctx, nil, addr, uri.Path) - if err != nil { - return nil, err - } - quitC := make(chan bool) - expsize, err := reader.Size(ctx, quitC) - if err != nil { - return nil, err - } - body := make([]byte, expsize) - size, err := reader.Read(body) - if int64(size) == expsize { - err = nil - } - return &Response{mimeType, status, expsize, string(body[:size])}, err -} diff --git a/swarm/api/storage_test.go b/swarm/api/storage_test.go deleted file mode 100644 index ef96972b68a6..000000000000 --- a/swarm/api/storage_test.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "context" - "testing" -) - -func testStorage(t *testing.T, f func(*Storage, bool)) { - testAPI(t, func(api *API, toEncrypt bool) { - f(NewStorage(api), toEncrypt) - }) -} - -func TestStoragePutGet(t *testing.T) { - testStorage(t, func(api *Storage, toEncrypt bool) { - content := "hello" - exp := expResponse(content, "text/plain", 0) - // exp := expResponse([]byte(content), "text/plain", 0) - ctx := context.TODO() - bzzkey, wait, err := api.Put(ctx, content, exp.MimeType, toEncrypt) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - err = wait(ctx) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - bzzhash := bzzkey.Hex() - // to check put against the API#Get - resp0 := testGet(t, api.api, bzzhash, "") - checkResponse(t, resp0, exp) - - // check storage#Get - resp, err := api.Get(context.TODO(), bzzhash) - if err != nil { - t.Fatalf("unexpected error: %v", err) - } - checkResponse(t, &testResponse{nil, resp}, exp) - }) -} diff --git a/swarm/api/testapi.go b/swarm/api/testapi.go deleted file mode 100644 index dbb04399c822..000000000000 --- a/swarm/api/testapi.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "github.com/nebulaai/nbai-node/swarm/network" -) - -type Control struct { - api *API - hive *network.Hive -} - -func NewControl(api *API, hive *network.Hive) *Control { - return &Control{api, hive} -} - -func (c *Control) Hive() string { - return c.hive.String() -} diff --git a/swarm/api/testdata/test0/img/logo.png b/swarm/api/testdata/test0/img/logo.png deleted file mode 100644 index 9557f960535d..000000000000 Binary files a/swarm/api/testdata/test0/img/logo.png and /dev/null differ diff --git a/swarm/api/testdata/test0/index.css b/swarm/api/testdata/test0/index.css deleted file mode 100644 index 693b13a37c7e..000000000000 --- a/swarm/api/testdata/test0/index.css +++ /dev/null @@ -1,9 +0,0 @@ -h1 { - color: black; - font-size: 12px; - background-color: orange; - border: 4px solid black; -} -body { - background-color: orange -} diff --git a/swarm/api/testdata/test0/index.html b/swarm/api/testdata/test0/index.html deleted file mode 100644 index 321e910d7a28..000000000000 --- a/swarm/api/testdata/test0/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - -

Swarm Test

- Ethereum logo - - \ No newline at end of file diff --git a/swarm/api/uri.go b/swarm/api/uri.go deleted file mode 100644 index 4ea0d8bace57..000000000000 --- a/swarm/api/uri.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "fmt" - "net/url" - "regexp" - "strings" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/swarm/storage" -) - -//matches hex swarm hashes -// TODO: this is bad, it should not be hardcoded how long is a hash -var hashMatcher = regexp.MustCompile("^([0-9A-Fa-f]{64})([0-9A-Fa-f]{64})?$") - -// URI is a reference to content stored in swarm. -type URI struct { - // Scheme has one of the following values: - // - // * bzz - an entry in a swarm manifest - // * bzz-raw - raw swarm content - // * bzz-immutable - immutable URI of an entry in a swarm manifest - // (address is not resolved) - // * bzz-list - list of all files contained in a swarm manifest - // - Scheme string - - // Addr is either a hexadecimal storage address or it an address which - // resolves to a storage address - Addr string - - // addr stores the parsed storage address - addr storage.Address - - // Path is the path to the content within a swarm manifest - Path string -} - -func (u *URI) MarshalJSON() (out []byte, err error) { - return []byte(`"` + u.String() + `"`), nil -} - -func (u *URI) UnmarshalJSON(value []byte) error { - uri, err := Parse(string(value)) - if err != nil { - return err - } - *u = *uri - return nil -} - -// Parse parses rawuri into a URI struct, where rawuri is expected to have one -// of the following formats: -// -// * :/ -// * :/ -// * :// -// * :// -// * :// -// * :/// -// -// with scheme one of bzz, bzz-raw, bzz-immutable, bzz-list or bzz-hash -func Parse(rawuri string) (*URI, error) { - u, err := url.Parse(rawuri) - if err != nil { - return nil, err - } - uri := &URI{Scheme: u.Scheme} - - // check the scheme is valid - switch uri.Scheme { - case "bzz", "bzz-raw", "bzz-immutable", "bzz-list", "bzz-hash", "bzz-feed": - default: - return nil, fmt.Errorf("unknown scheme %q", u.Scheme) - } - - // handle URIs like bzz:/// where the addr and path - // have already been split by url.Parse - if u.Host != "" { - uri.Addr = u.Host - uri.Path = strings.TrimLeft(u.Path, "/") - return uri, nil - } - - // URI is like bzz:// so split the addr and path from - // the raw path (which will be //) - parts := strings.SplitN(strings.TrimLeft(u.Path, "/"), "/", 2) - uri.Addr = parts[0] - if len(parts) == 2 { - uri.Path = parts[1] - } - return uri, nil -} -func (u *URI) Feed() bool { - return u.Scheme == "bzz-feed" -} - -func (u *URI) Raw() bool { - return u.Scheme == "bzz-raw" -} - -func (u *URI) Immutable() bool { - return u.Scheme == "bzz-immutable" -} - -func (u *URI) List() bool { - return u.Scheme == "bzz-list" -} - -func (u *URI) Hash() bool { - return u.Scheme == "bzz-hash" -} - -func (u *URI) String() string { - return u.Scheme + ":/" + u.Addr + "/" + u.Path -} - -func (u *URI) Address() storage.Address { - if u.addr != nil { - return u.addr - } - if hashMatcher.MatchString(u.Addr) { - u.addr = common.Hex2Bytes(u.Addr) - return u.addr - } - return nil -} diff --git a/swarm/api/uri_test.go b/swarm/api/uri_test.go deleted file mode 100644 index 8b7a05781aa1..000000000000 --- a/swarm/api/uri_test.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package api - -import ( - "bytes" - "reflect" - "testing" - - "github.com/nebulaai/nbai-node/swarm/storage" -) - -func TestParseURI(t *testing.T) { - type test struct { - uri string - expectURI *URI - expectErr bool - expectRaw bool - expectImmutable bool - expectList bool - expectHash bool - expectValidKey bool - expectAddr storage.Address - } - tests := []test{ - { - uri: "", - expectErr: true, - }, - { - uri: "foo", - expectErr: true, - }, - { - uri: "bzz", - expectErr: true, - }, - { - uri: "bzz:", - expectURI: &URI{Scheme: "bzz"}, - }, - { - uri: "bzz-immutable:", - expectURI: &URI{Scheme: "bzz-immutable"}, - expectImmutable: true, - }, - { - uri: "bzz-raw:", - expectURI: &URI{Scheme: "bzz-raw"}, - expectRaw: true, - }, - { - uri: "bzz:/", - expectURI: &URI{Scheme: "bzz"}, - }, - { - uri: "bzz:/abc123", - expectURI: &URI{Scheme: "bzz", Addr: "abc123"}, - }, - { - uri: "bzz:/abc123/path/to/entry", - expectURI: &URI{Scheme: "bzz", Addr: "abc123", Path: "path/to/entry"}, - }, - { - uri: "bzz-raw:/", - expectURI: &URI{Scheme: "bzz-raw"}, - expectRaw: true, - }, - { - uri: "bzz-raw:/abc123", - expectURI: &URI{Scheme: "bzz-raw", Addr: "abc123"}, - expectRaw: true, - }, - { - uri: "bzz-raw:/abc123/path/to/entry", - expectURI: &URI{Scheme: "bzz-raw", Addr: "abc123", Path: "path/to/entry"}, - expectRaw: true, - }, - { - uri: "bzz://", - expectURI: &URI{Scheme: "bzz"}, - }, - { - uri: "bzz://abc123", - expectURI: &URI{Scheme: "bzz", Addr: "abc123"}, - }, - { - uri: "bzz://abc123/path/to/entry", - expectURI: &URI{Scheme: "bzz", Addr: "abc123", Path: "path/to/entry"}, - }, - { - uri: "bzz-hash:", - expectURI: &URI{Scheme: "bzz-hash"}, - expectHash: true, - }, - { - uri: "bzz-hash:/", - expectURI: &URI{Scheme: "bzz-hash"}, - expectHash: true, - }, - { - uri: "bzz-list:", - expectURI: &URI{Scheme: "bzz-list"}, - expectList: true, - }, - { - uri: "bzz-list:/", - expectURI: &URI{Scheme: "bzz-list"}, - expectList: true, - }, - { - uri: "bzz-raw://4378d19c26590f1a818ed7d6a62c3809e149b0999cab5ce5f26233b3b423bf8c", - expectURI: &URI{Scheme: "bzz-raw", - Addr: "4378d19c26590f1a818ed7d6a62c3809e149b0999cab5ce5f26233b3b423bf8c", - }, - expectValidKey: true, - expectRaw: true, - expectAddr: storage.Address{67, 120, 209, 156, 38, 89, 15, 26, - 129, 142, 215, 214, 166, 44, 56, 9, - 225, 73, 176, 153, 156, 171, 92, 229, - 242, 98, 51, 179, 180, 35, 191, 140, - }, - }, - } - for _, x := range tests { - actual, err := Parse(x.uri) - if x.expectErr { - if err == nil { - t.Fatalf("expected %s to error", x.uri) - } - continue - } - if err != nil { - t.Fatalf("error parsing %s: %s", x.uri, err) - } - if !reflect.DeepEqual(actual, x.expectURI) { - t.Fatalf("expected %s to return %#v, got %#v", x.uri, x.expectURI, actual) - } - if actual.Raw() != x.expectRaw { - t.Fatalf("expected %s raw to be %t, got %t", x.uri, x.expectRaw, actual.Raw()) - } - if actual.Immutable() != x.expectImmutable { - t.Fatalf("expected %s immutable to be %t, got %t", x.uri, x.expectImmutable, actual.Immutable()) - } - if actual.List() != x.expectList { - t.Fatalf("expected %s list to be %t, got %t", x.uri, x.expectList, actual.List()) - } - if actual.Hash() != x.expectHash { - t.Fatalf("expected %s hash to be %t, got %t", x.uri, x.expectHash, actual.Hash()) - } - if x.expectValidKey { - if actual.Address() == nil { - t.Fatalf("expected %s to return a valid key, got nil", x.uri) - } else { - if !bytes.Equal(x.expectAddr, actual.Address()) { - t.Fatalf("expected %s to be decoded to %v", x.expectURI.Addr, x.expectAddr) - } - } - } - } -} diff --git a/swarm/bmt/bmt.go b/swarm/bmt/bmt.go deleted file mode 100644 index 18eab5a2bcb8..000000000000 --- a/swarm/bmt/bmt.go +++ /dev/null @@ -1,690 +0,0 @@ -// Copyright 2018 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 used for swarm chunk hash -package bmt - -import ( - "fmt" - "hash" - "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). -Chunks with data shorter than the fixed size are hashed as if they had zero padding. - -BMT hash 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 to the size of the base hash (called the resolution -of the BMT hash), Using Keccak256 SHA3 hash is 32 bytes, 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 - that is simple to understand -* Hasher is optimized for speed taking advantage of concurrency with minimalistic - control structure to coordinate the concurrent routines - - BMT Hasher implements the following interfaces - * standard golang hash.Hash - synchronous, reusable - * SwarmHash - SumWithSpan provided - * io.Writer - synchronous left-to-right datawriter - * AsyncWriter - concurrent section writes and asynchronous Sum call -*/ - -const ( - // PoolSize 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 - PoolSize = 8 -) - -// BaseHasherFunc is a hash.Hash constructor function used for the base hash of the BMT. -// implemented by Keccak256 SHA3 sha3.NewLegacyKeccak256 -type BaseHasherFunc func() hash.Hash - -// Hasher a reusable hasher for fixed maximum size chunks representing a BMT -// - implements the hash.Hash interface -// - reuses a pool of trees for amortised memory allocation and resource control -// - supports order-agnostic concurrent segment writes and section (double segment) writes -// as well as sequential read and write -// - the same hasher instance must not be called concurrently on more than one chunk -// - the same hasher instance is synchronously reuseable -// - Sum gives back the tree to the pool and guaranteed to leave -// the tree and itself in a state reusable for hashing a new chunk -// - generates and verifies segment inclusion proofs (TODO:) -type Hasher struct { - pool *TreePool // BMT resource pool - bmt *tree // prebuilt BMT resource for flowcontrol and proofs -} - -// New creates a reusable BMT Hasher that -// pulls a new tree from a resource pool for hashing each chunk -func New(p *TreePool) *Hasher { - return &Hasher{ - pool: p, - } -} - -// TreePool provides a pool of trees used as resources by the BMT Hasher. -// A tree popped from the pool is guaranteed to have a clean state ready -// for hashing a new chunk. -type TreePool struct { - lock sync.Mutex - c chan *tree // the channel to obtain a resource from the pool - hasher BaseHasherFunc // base hasher to use for the BMT levels - SegmentSize int // size of leaf segments, stipulated to be = hash size - SegmentCount int // the number of segments on the base level of the BMT - Capacity int // pool capacity, controls concurrency - Depth int // depth of the bmt trees = int(log2(segmentCount))+1 - Size int // the total length of the data (count * size) - count int // current count of (ever) allocated resources - zerohashes [][]byte // lookup table for predictable padding subtrees for all levels -} - -// NewTreePool creates a tree pool with hasher, segment size, segment count and capacity -// on Hasher.getTree it reuses free trees or creates a new one if capacity is not reached -func NewTreePool(hasher BaseHasherFunc, segmentCount, capacity int) *TreePool { - // initialises the zerohashes lookup table - depth := calculateDepthFor(segmentCount) - segmentSize := hasher().Size() - zerohashes := make([][]byte, depth+1) - zeros := make([]byte, segmentSize) - zerohashes[0] = zeros - h := hasher() - for i := 1; i < depth+1; i++ { - zeros = doSum(h, nil, zeros, zeros) - zerohashes[i] = zeros - } - return &TreePool{ - c: make(chan *tree, capacity), - hasher: hasher, - SegmentSize: segmentSize, - SegmentCount: segmentCount, - Capacity: capacity, - Size: segmentCount * segmentSize, - Depth: depth, - zerohashes: zerohashes, - } -} - -// Drain drains the pool until it has no more than n resources -func (p *TreePool) Drain(n int) { - p.lock.Lock() - defer p.lock.Unlock() - for len(p.c) > n { - <-p.c - p.count-- - } -} - -// Reserve is blocking until it returns an available tree -// it reuses free trees or creates a new one if size is not reached -// TODO: should use a context here -func (p *TreePool) reserve() *tree { - p.lock.Lock() - defer p.lock.Unlock() - var t *tree - if p.count == p.Capacity { - return <-p.c - } - select { - case t = <-p.c: - default: - t = newTree(p.SegmentSize, p.Depth, p.hasher) - p.count++ - } - return t -} - -// release gives back a tree to the pool. -// this tree is guaranteed to be in reusable state -func (p *TreePool) release(t *tree) { - p.c <- t // can never fail ... -} - -// tree is a reusable control structure representing a BMT -// organised in a binary tree -// Hasher uses a TreePool to obtain a tree for each chunk hash -// the tree is 'locked' while not in the pool -type tree struct { - leaves []*node // leaf nodes of the tree, other nodes accessible via parent links - cursor int // index of rightmost currently open segment - offset int // offset (cursor position) within currently open segment - section []byte // the rightmost open section (double segment) - result chan []byte // result channel - span []byte // The span of the data subsumed under the chunk -} - -// node is a reuseable segment hasher representing a node in a BMT -type node struct { - isLeft bool // whether it is left side of the parent double segment - parent *node // pointer to parent node in the BMT - state int32 // atomic increment impl concurrent boolean toggle - left, right []byte // this is where the two children sections are written - hasher hash.Hash // preconstructed hasher on nodes -} - -// newNode constructs a segment hasher node in the BMT (used by newTree) -func newNode(index int, parent *node, hasher hash.Hash) *node { - return &node{ - parent: parent, - isLeft: index%2 == 0, - hasher: hasher, - } -} - -// Draw draws the BMT (badly) -func (t *tree) draw(hash []byte) string { - var left, right []string - var anc []*node - for i, n := range t.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 = t.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 a tree by building up the nodes of a BMT -// - segment size is stipulated to be the size of the hash -func newTree(segmentSize, depth int, hashfunc func() hash.Hash) *tree { - n := newNode(0, nil, hashfunc()) - prevlevel := []*node{n} - // iterate over levels and creates 2^(depth-level) nodes - // the 0 level is on double segment sections so we start at depth - 2 since - count := 2 - for level := depth - 2; level >= 0; level-- { - nodes := make([]*node, count) - for i := 0; i < count; i++ { - parent := prevlevel[i/2] - var hasher hash.Hash - if level == 0 { - hasher = hashfunc() - } - nodes[i] = newNode(i, parent, hasher) - } - prevlevel = nodes - count *= 2 - } - // the datanode level is the nodes on the last level - return &tree{ - leaves: prevlevel, - result: make(chan []byte), - section: make([]byte, 2*segmentSize), - } -} - -// methods needed to implement hash.Hash - -// Size returns the size -func (h *Hasher) Size() int { - return h.pool.SegmentSize -} - -// BlockSize returns the block size -func (h *Hasher) BlockSize() int { - return 2 * h.pool.SegmentSize -} - -// Sum returns the BMT root hash of the buffer -// using Sum presupposes sequential synchronous writes (io.Writer interface) -// hash.Hash interface Sum method appends the byte slice to the underlying -// data before it calculates and returns the hash of the chunk -// caller must make sure Sum is not called concurrently with Write, writeSection -func (h *Hasher) Sum(b []byte) (s []byte) { - t := h.getTree() - // write the last section with final flag set to true - go h.writeSection(t.cursor, t.section, true, true) - // wait for the result - s = <-t.result - span := t.span - // release the tree resource back to the pool - h.releaseTree() - // b + sha3(span + BMT(pure_chunk)) - if len(span) == 0 { - return append(b, s...) - } - return doSum(h.pool.hasher(), b, span, s) -} - -// methods needed to implement the SwarmHash and the io.Writer interfaces - -// Write calls sequentially add to the buffer to be hashed, -// with every full segment calls writeSection in a go routine -func (h *Hasher) Write(b []byte) (int, error) { - l := len(b) - if l == 0 || l > h.pool.Size { - return 0, nil - } - t := h.getTree() - secsize := 2 * h.pool.SegmentSize - // calculate length of missing bit to complete current open section - smax := secsize - t.offset - // if at the beginning of chunk or middle of the section - if t.offset < secsize { - // fill up current segment from buffer - copy(t.section[t.offset:], b) - // if input buffer consumed and open section not complete, then - // advance offset and return - if smax == 0 { - smax = secsize - } - if l <= smax { - t.offset += l - return l, nil - } - } else { - // if end of a section - if t.cursor == h.pool.SegmentCount*2 { - return 0, nil - } - } - // read full sections and the last possibly partial section from the input buffer - for smax < l { - // section complete; push to tree asynchronously - go h.writeSection(t.cursor, t.section, true, false) - // reset section - t.section = make([]byte, secsize) - // copy from input buffer at smax to right half of section - copy(t.section, b[smax:]) - // advance cursor - t.cursor++ - // smax here represents successive offsets in the input buffer - smax += secsize - } - t.offset = l - smax + secsize - return l, nil -} - -// Reset needs to be called before writing to the hasher -func (h *Hasher) Reset() { - h.releaseTree() -} - -// methods needed to implement 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 length of the data subsumed under the hash, i.e., span -func (h *Hasher) ResetWithLength(span []byte) { - h.Reset() - h.getTree().span = span -} - -// releaseTree gives back the Tree to the pool whereby it unlocks -// it resets tree, segment and index -func (h *Hasher) releaseTree() { - t := h.bmt - if t == nil { - return - } - h.bmt = nil - go func() { - t.cursor = 0 - t.offset = 0 - t.span = nil - t.section = make([]byte, h.pool.SegmentSize*2) - select { - case <-t.result: - default: - } - h.pool.release(t) - }() -} - -// NewAsyncWriter extends Hasher with an interface for concurrent segment/section writes -func (h *Hasher) NewAsyncWriter(double bool) *AsyncHasher { - secsize := h.pool.SegmentSize - if double { - secsize *= 2 - } - write := func(i int, section []byte, final bool) { - h.writeSection(i, section, double, final) - } - return &AsyncHasher{ - Hasher: h, - double: double, - secsize: secsize, - write: write, - } -} - -// SectionWriter is an asynchronous segment/section writer interface -type SectionWriter interface { - Reset() // standard init to be called before reuse - Write(index int, data []byte) // write into section of index - Sum(b []byte, length int, span []byte) []byte // returns the hash of the buffer - SectionSize() int // size of the async section unit to use -} - -// AsyncHasher extends BMT Hasher with an asynchronous segment/section writer interface -// AsyncHasher is unsafe and does not check indexes and section data lengths -// it must be used with the right indexes and length and the right number of sections -// -// behaviour is undefined if -// * non-final sections are shorter or longer than secsize -// * if final section does not match length -// * write a section with index that is higher than length/secsize -// * set length in Sum call when length/secsize < maxsec -// -// * if Sum() is not called on a Hasher that is fully written -// a process will block, can be terminated with Reset -// * it will not leak processes if not all sections are written but it blocks -// and keeps the resource which can be released calling Reset() -type AsyncHasher struct { - *Hasher // extends the Hasher - mtx sync.Mutex // to lock the cursor access - double bool // whether to use double segments (call Hasher.writeSection) - secsize int // size of base section (size of hash or double) - write func(i int, section []byte, final bool) -} - -// methods needed to implement AsyncWriter - -// SectionSize returns the size of async section unit to use -func (sw *AsyncHasher) SectionSize() int { - return sw.secsize -} - -// Write writes the i-th section of the BMT base -// this function can and is meant to be called concurrently -// it sets max segment threadsafely -func (sw *AsyncHasher) Write(i int, section []byte) { - sw.mtx.Lock() - defer sw.mtx.Unlock() - t := sw.getTree() - // cursor keeps track of the rightmost section written so far - // if index is lower than cursor then just write non-final section as is - if i < t.cursor { - // if index is not the rightmost, safe to write section - go sw.write(i, section, false) - return - } - // if there is a previous rightmost section safe to write section - if t.offset > 0 { - if i == t.cursor { - // i==cursor implies cursor was set by Hash call so we can write section as final one - // since it can be shorter, first we copy it to the padded buffer - t.section = make([]byte, sw.secsize) - copy(t.section, section) - go sw.write(i, t.section, true) - return - } - // the rightmost section just changed, so we write the previous one as non-final - go sw.write(t.cursor, t.section, false) - } - // set i as the index of the righmost section written so far - // set t.offset to cursor*secsize+1 - t.cursor = i - t.offset = i*sw.secsize + 1 - t.section = make([]byte, sw.secsize) - copy(t.section, section) -} - -// Sum can be called any time once the length and the span is known -// potentially even before all segments have been written -// in such cases Sum will block until all segments are present and -// the hash for the length can be calculated. -// -// b: digest is appended to b -// length: known length of the input (unsafe; undefined if out of range) -// meta: metadata to hash together with BMT root for the final digest -// e.g., span for protection against existential forgery -func (sw *AsyncHasher) Sum(b []byte, length int, meta []byte) (s []byte) { - sw.mtx.Lock() - t := sw.getTree() - if length == 0 { - sw.mtx.Unlock() - s = sw.pool.zerohashes[sw.pool.Depth] - } else { - // for non-zero input the rightmost section is written to the tree asynchronously - // if the actual last section has been written (t.cursor == length/t.secsize) - maxsec := (length - 1) / sw.secsize - if t.offset > 0 { - go sw.write(t.cursor, t.section, maxsec == t.cursor) - } - // set cursor to maxsec so final section is written when it arrives - t.cursor = maxsec - t.offset = length - result := t.result - sw.mtx.Unlock() - // wait for the result or reset - s = <-result - } - // relesase the tree back to the pool - sw.releaseTree() - // if no meta is given just append digest to b - if len(meta) == 0 { - return append(b, s...) - } - // hash together meta and BMT root hash using the pools - return doSum(sw.pool.hasher(), b, meta, s) -} - -// writeSection writes the hash of i-th section into level 1 node of the BMT tree -func (h *Hasher) writeSection(i int, section []byte, double bool, final bool) { - // select the leaf node for the section - var n *node - var isLeft bool - var hasher hash.Hash - var level int - t := h.getTree() - if double { - level++ - n = t.leaves[i] - hasher = n.hasher - isLeft = n.isLeft - n = n.parent - // hash the section - section = doSum(hasher, nil, section) - } else { - n = t.leaves[i/2] - hasher = n.hasher - isLeft = i%2 == 0 - } - // write hash into parent node - if final { - // for the last segment use writeFinalNode - h.writeFinalNode(level, n, hasher, isLeft, section) - } else { - h.writeNode(n, hasher, isLeft, section) - } -} - -// writeNode pushes the data to the node -// if it is the first of 2 sisters written, the routine terminates -// if it is the second, it calculates the hash and writes it -// to the parent node recursively -// since hashing the parent is synchronous the same hasher can be used -func (h *Hasher) writeNode(n *node, bh hash.Hash, isLeft bool, s []byte) { - level := 1 - for { - // at the root of the bmt just write the result to the result channel - if n == nil { - h.getTree().result <- s - return - } - // otherwise assign child hash to left or right segment - if isLeft { - n.left = s - } else { - n.right = s - } - // the child-thread first arriving will terminate - if n.toggle() { - return - } - // the thread coming second now can be sure both left and right children are written - // so it calculates the hash of left|right and pushes it to the parent - s = doSum(bh, nil, n.left, n.right) - isLeft = n.isLeft - n = n.parent - level++ - } -} - -// writeFinalNode is following the path starting from the final datasegment to the -// BMT root via parents -// for unbalanced trees it fills in the missing right sister nodes using -// the pool's lookup table for BMT subtree root hashes for all-zero sections -// otherwise behaves like `writeNode` -func (h *Hasher) writeFinalNode(level int, n *node, bh hash.Hash, isLeft bool, s []byte) { - - for { - // at the root of the bmt just write the result to the result channel - if n == nil { - if s != nil { - h.getTree().result <- s - } - return - } - var noHash bool - if isLeft { - // coming from left sister branch - // when the final section's path is going via left child node - // we include an all-zero subtree hash for the right level and toggle the node. - n.right = h.pool.zerohashes[level] - if s != nil { - n.left = s - // if a left final node carries a hash, it must be the first (and only thread) - // so the toggle is already in passive state no need no call - // yet thread needs to carry on pushing hash to parent - noHash = false - } else { - // if again first thread then propagate nil and calculate no hash - noHash = n.toggle() - } - } else { - // right sister branch - if s != nil { - // if hash was pushed from right child node, write right segment change state - n.right = s - // if toggle is true, we arrived first so no hashing just push nil to parent - noHash = n.toggle() - - } else { - // if s is nil, then thread arrived first at previous node and here there will be two, - // so no need to do anything and keep s = nil for parent - noHash = true - } - } - // the child-thread first arriving will just continue resetting s to nil - // the second thread now can be sure both left and right children are written - // it calculates the hash of left|right and pushes it to the parent - if noHash { - s = nil - } else { - s = doSum(bh, nil, n.left, n.right) - } - // iterate to parent - isLeft = n.isLeft - n = n.parent - level++ - } -} - -// getTree obtains a BMT resource by reserving one from the pool and assigns it to the bmt field -func (h *Hasher) getTree() *tree { - if h.bmt != nil { - return h.bmt - } - t := h.pool.reserve() - h.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 (n *node) toggle() bool { - return atomic.AddInt32(&n.state, 1)%2 == 1 -} - -// calculates the hash of the data using hash.Hash -func doSum(h hash.Hash, b []byte, data ...[]byte) []byte { - h.Reset() - for _, v := range data { - h.Write(v) - } - return h.Sum(b) -} - -// hashstr is a pretty printer for bytes used in tree.draw -func hashstr(b []byte) string { - end := len(b) - if end > 4 { - end = 4 - } - return fmt.Sprintf("%x", b[:end]) -} - -// calculateDepthFor calculates the depth (number of levels) in the BMT tree -func calculateDepthFor(n int) (d int) { - c := 2 - for ; c < n; c *= 2 { - d++ - } - return d + 1 -} diff --git a/swarm/bmt/bmt_r.go b/swarm/bmt/bmt_r.go deleted file mode 100644 index 0cb6c146f5d7..000000000000 --- a/swarm/bmt/bmt_r.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package bmt is a 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. -// There is extra check on reference hasher correctness in bmt_test.go -// * TestRefHasher -// * testBMTHasherCorrectness function -package bmt - -import ( - "hash" -) - -// RefHasher is the non-optimized easy-to-read reference implementation of BMT -type RefHasher struct { - maxDataLength int // c * hashSize, where c = 2 ^ ceil(log2(count)), where count = ceil(length / hashSize) - sectionLength int // 2 * hashSize - hasher hash.Hash // base hash func (Keccak256 SHA3) -} - -// NewRefHasher returns a new RefHasher -func NewRefHasher(hasher BaseHasherFunc, count int) *RefHasher { - h := hasher() - hashsize := h.Size() - c := 2 - for ; c < count; c *= 2 { - } - return &RefHasher{ - sectionLength: 2 * hashsize, - maxDataLength: c * hashsize, - hasher: h, - } -} - -// Hash returns the BMT hash of the byte slice -// implements the SwarmHash interface -func (rh *RefHasher) Hash(data []byte) []byte { - // if data is shorter than the base length (maxDataLength), we provide padding with zeros - d := make([]byte, rh.maxDataLength) - length := len(data) - if length > rh.maxDataLength { - length = rh.maxDataLength - } - copy(d, data[:length]) - return rh.hash(d, rh.maxDataLength) -} - -// data has length maxDataLength = segmentSize * 2^k -// hash calls itself recursively on both halves of the given slice -// concatenates the results, and returns the hash of that -// if the length of d is 2 * segmentSize then just returns the hash of that section -func (rh *RefHasher) hash(data []byte, length int) []byte { - var section []byte - if length == rh.sectionLength { - // section contains two data segments (d) - section = data - } else { - // section contains hashes of left and right BMT subtreea - // to be calculated by calling hash recursively on left and right half of d - length /= 2 - section = append(rh.hash(data[:length], length), rh.hash(data[length:], length)...) - } - rh.hasher.Reset() - rh.hasher.Write(section) - return rh.hasher.Sum(nil) -} diff --git a/swarm/bmt/bmt_test.go b/swarm/bmt/bmt_test.go deleted file mode 100644 index 63b96f416002..000000000000 --- a/swarm/bmt/bmt_test.go +++ /dev/null @@ -1,583 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package bmt - -import ( - "bytes" - "encoding/binary" - "fmt" - "math/rand" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/nebulaai/nbai-node/swarm/testutil" - "golang.org/x/crypto/sha3" -) - -// the actual data length generated (could be longer than max datalength of the BMT) -const BufferSize = 4128 - -const ( - // segmentCount is the maximum number of segments of the underlying chunk - // Should be equal to max-chunk-data-size / hash-size - // Currently set to 128 == 4096 (default chunk size) / 32 (sha3.keccak256 size) - segmentCount = 128 -) - -var counts = []int{1, 2, 3, 4, 5, 8, 9, 15, 16, 17, 32, 37, 42, 53, 63, 64, 65, 111, 127, 128} - -// calculates the Keccak256 SHA3 hash of the data -func sha3hash(data ...[]byte) []byte { - h := sha3.NewLegacyKeccak256() - return doSum(h, nil, data...) -} - -// TestRefHasher tests that the RefHasher computes the expected BMT hash for -// some small data lengths -func TestRefHasher(t *testing.T) { - // the test struct is used to specify the expected BMT hash for - // segment counts between from and to and lengths from 1 to datalength - type test struct { - from int - to int - expected func([]byte) []byte - } - - var tests []*test - // all lengths in [0,64] should be: - // - // sha3hash(data) - // - tests = append(tests, &test{ - from: 1, - to: 2, - expected: func(d []byte) []byte { - data := make([]byte, 64) - copy(data, d) - return sha3hash(data) - }, - }) - - // all lengths in [3,4] should be: - // - // sha3hash( - // sha3hash(data[:64]) - // sha3hash(data[64:]) - // ) - // - tests = append(tests, &test{ - from: 3, - to: 4, - expected: func(d []byte) []byte { - data := make([]byte, 128) - copy(data, d) - return sha3hash(sha3hash(data[:64]), sha3hash(data[64:])) - }, - }) - - // all segmentCounts in [5,8] should be: - // - // sha3hash( - // sha3hash( - // sha3hash(data[:64]) - // sha3hash(data[64:128]) - // ) - // sha3hash( - // sha3hash(data[128:192]) - // sha3hash(data[192:]) - // ) - // ) - // - tests = append(tests, &test{ - from: 5, - to: 8, - expected: func(d []byte) []byte { - data := make([]byte, 256) - copy(data, d) - return sha3hash(sha3hash(sha3hash(data[:64]), sha3hash(data[64:128])), sha3hash(sha3hash(data[128:192]), sha3hash(data[192:]))) - }, - }) - - // run the tests - for i, x := range tests { - for segmentCount := x.from; segmentCount <= x.to; segmentCount++ { - for length := 1; length <= segmentCount*32; length++ { - t.Run(fmt.Sprintf("%d_segments_%d_bytes", segmentCount, length), func(t *testing.T) { - data := testutil.RandomBytes(i, length) - expected := x.expected(data) - actual := NewRefHasher(sha3.NewLegacyKeccak256, segmentCount).Hash(data) - if !bytes.Equal(actual, expected) { - t.Fatalf("expected %x, got %x", expected, actual) - } - }) - } - } - } -} - -// tests if hasher responds with correct hash comparing the reference implementation return value -func TestHasherEmptyData(t *testing.T) { - hasher := sha3.NewLegacyKeccak256 - var data []byte - for _, count := range counts { - t.Run(fmt.Sprintf("%d_segments", count), func(t *testing.T) { - pool := NewTreePool(hasher, count, PoolSize) - defer pool.Drain(0) - bmt := New(pool) - rbmt := NewRefHasher(hasher, count) - refHash := rbmt.Hash(data) - expHash := syncHash(bmt, nil, data) - if !bytes.Equal(expHash, refHash) { - t.Fatalf("hash mismatch with reference. expected %x, got %x", refHash, expHash) - } - }) - } -} - -// tests sequential write with entire max size written in one go -func TestSyncHasherCorrectness(t *testing.T) { - data := testutil.RandomBytes(1, BufferSize) - hasher := sha3.NewLegacyKeccak256 - size := hasher().Size() - - var err error - for _, count := range counts { - t.Run(fmt.Sprintf("segments_%v", count), func(t *testing.T) { - max := count * size - var incr int - capacity := 1 - pool := NewTreePool(hasher, count, capacity) - defer pool.Drain(0) - for n := 0; n <= max; n += incr { - incr = 1 + rand.Intn(5) - bmt := New(pool) - err = testHasherCorrectness(bmt, hasher, data, n, count) - if err != nil { - t.Fatal(err) - } - } - }) - } -} - -// tests order-neutral concurrent writes with entire max size written in one go -func TestAsyncCorrectness(t *testing.T) { - data := testutil.RandomBytes(1, BufferSize) - hasher := sha3.NewLegacyKeccak256 - size := hasher().Size() - whs := []whenHash{first, last, random} - - for _, double := range []bool{false, true} { - for _, wh := range whs { - for _, count := range counts { - t.Run(fmt.Sprintf("double_%v_hash_when_%v_segments_%v", double, wh, count), func(t *testing.T) { - max := count * size - var incr int - capacity := 1 - pool := NewTreePool(hasher, count, capacity) - defer pool.Drain(0) - for n := 1; n <= max; n += incr { - incr = 1 + rand.Intn(5) - bmt := New(pool) - d := data[:n] - rbmt := NewRefHasher(hasher, count) - exp := rbmt.Hash(d) - got := syncHash(bmt, nil, d) - if !bytes.Equal(got, exp) { - t.Fatalf("wrong sync hash for datalength %v: expected %x (ref), got %x", n, exp, got) - } - sw := bmt.NewAsyncWriter(double) - got = asyncHashRandom(sw, nil, d, wh) - if !bytes.Equal(got, exp) { - t.Fatalf("wrong async hash for datalength %v: expected %x, got %x", n, exp, got) - } - } - }) - } - } - } -} - -// Tests that the BMT hasher can be synchronously reused with poolsizes 1 and PoolSize -func TestHasherReuse(t *testing.T) { - t.Run(fmt.Sprintf("poolsize_%d", 1), func(t *testing.T) { - testHasherReuse(1, t) - }) - t.Run(fmt.Sprintf("poolsize_%d", PoolSize), func(t *testing.T) { - testHasherReuse(PoolSize, t) - }) -} - -// tests if bmt reuse is not corrupting result -func testHasherReuse(poolsize int, t *testing.T) { - hasher := sha3.NewLegacyKeccak256 - pool := NewTreePool(hasher, segmentCount, poolsize) - defer pool.Drain(0) - bmt := New(pool) - - for i := 0; i < 100; i++ { - data := testutil.RandomBytes(1, BufferSize) - n := rand.Intn(bmt.Size()) - err := testHasherCorrectness(bmt, hasher, data, n, segmentCount) - if err != nil { - t.Fatal(err) - } - } -} - -// Tests if pool can be cleanly reused even in concurrent use by several hasher -func TestBMTConcurrentUse(t *testing.T) { - hasher := sha3.NewLegacyKeccak256 - pool := NewTreePool(hasher, segmentCount, PoolSize) - defer pool.Drain(0) - cycles := 100 - errc := make(chan error) - - for i := 0; i < cycles; i++ { - go func() { - bmt := New(pool) - data := testutil.RandomBytes(1, BufferSize) - n := rand.Intn(bmt.Size()) - errc <- testHasherCorrectness(bmt, hasher, data, n, 128) - }() - } -LOOP: - for { - select { - case <-time.NewTimer(5 * time.Second).C: - t.Fatal("timed out") - case err := <-errc: - if err != nil { - t.Fatal(err) - } - cycles-- - if cycles == 0 { - break LOOP - } - } - } -} - -// Tests BMT Hasher io.Writer interface is working correctly -// even multiple short random write buffers -func TestBMTWriterBuffers(t *testing.T) { - hasher := sha3.NewLegacyKeccak256 - - for _, count := range counts { - t.Run(fmt.Sprintf("%d_segments", count), func(t *testing.T) { - errc := make(chan error) - pool := NewTreePool(hasher, count, PoolSize) - defer pool.Drain(0) - n := count * 32 - bmt := New(pool) - data := testutil.RandomBytes(1, n) - rbmt := NewRefHasher(hasher, count) - refHash := rbmt.Hash(data) - expHash := syncHash(bmt, nil, data) - if !bytes.Equal(expHash, refHash) { - t.Fatalf("hash mismatch with reference. expected %x, got %x", refHash, expHash) - } - attempts := 10 - f := func() error { - bmt := New(pool) - bmt.Reset() - var buflen int - for offset := 0; offset < n; offset += buflen { - buflen = rand.Intn(n-offset) + 1 - read, err := bmt.Write(data[offset : offset+buflen]) - if err != nil { - return err - } - if read != buflen { - return fmt.Errorf("incorrect read. expected %v bytes, got %v", buflen, read) - } - } - hash := bmt.Sum(nil) - if !bytes.Equal(hash, expHash) { - return fmt.Errorf("hash mismatch. expected %x, got %x", hash, expHash) - } - return nil - } - - for j := 0; j < attempts; j++ { - go func() { - errc <- f() - }() - } - timeout := time.NewTimer(2 * time.Second) - for { - select { - case err := <-errc: - if err != nil { - t.Fatal(err) - } - attempts-- - if attempts == 0 { - return - } - case <-timeout.C: - t.Fatalf("timeout") - } - } - }) - } -} - -// helper function that compares reference and optimised implementations on -// correctness -func testHasherCorrectness(bmt *Hasher, hasher BaseHasherFunc, d []byte, n, count int) (err error) { - span := make([]byte, 8) - if len(d) < n { - n = len(d) - } - binary.BigEndian.PutUint64(span, uint64(n)) - data := d[:n] - rbmt := NewRefHasher(hasher, count) - exp := sha3hash(span, rbmt.Hash(data)) - got := syncHash(bmt, span, data) - if !bytes.Equal(got, exp) { - return fmt.Errorf("wrong hash: expected %x, got %x", exp, got) - } - return err -} - -// -func BenchmarkBMT(t *testing.B) { - for size := 4096; size >= 128; size /= 2 { - t.Run(fmt.Sprintf("%v_size_%v", "SHA3", size), func(t *testing.B) { - benchmarkSHA3(t, size) - }) - t.Run(fmt.Sprintf("%v_size_%v", "Baseline", size), func(t *testing.B) { - benchmarkBMTBaseline(t, size) - }) - t.Run(fmt.Sprintf("%v_size_%v", "REF", size), func(t *testing.B) { - benchmarkRefHasher(t, size) - }) - t.Run(fmt.Sprintf("%v_size_%v", "BMT", size), func(t *testing.B) { - benchmarkBMT(t, size) - }) - } -} - -type whenHash = int - -const ( - first whenHash = iota - last - random -) - -func BenchmarkBMTAsync(t *testing.B) { - whs := []whenHash{first, last, random} - for size := 4096; size >= 128; size /= 2 { - for _, wh := range whs { - for _, double := range []bool{false, true} { - t.Run(fmt.Sprintf("double_%v_hash_when_%v_size_%v", double, wh, size), func(t *testing.B) { - benchmarkBMTAsync(t, size, wh, double) - }) - } - } - } -} - -func BenchmarkPool(t *testing.B) { - caps := []int{1, PoolSize} - for size := 4096; size >= 128; size /= 2 { - for _, c := range caps { - t.Run(fmt.Sprintf("poolsize_%v_size_%v", c, size), func(t *testing.B) { - benchmarkPool(t, c, size) - }) - } - } -} - -// benchmarks simple sha3 hash on chunks -func benchmarkSHA3(t *testing.B, n int) { - data := testutil.RandomBytes(1, n) - hasher := sha3.NewLegacyKeccak256 - h := hasher() - - t.ReportAllocs() - t.ResetTimer() - for i := 0; i < t.N; i++ { - doSum(h, nil, data) - } -} - -// 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 PoolSize 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(t *testing.B, n int) { - hasher := sha3.NewLegacyKeccak256 - hashSize := hasher().Size() - data := testutil.RandomBytes(1, hashSize) - - t.ReportAllocs() - t.ResetTimer() - for i := 0; i < t.N; i++ { - count := int32((n-1)/hashSize + 1) - wg := sync.WaitGroup{} - wg.Add(PoolSize) - var i int32 - for j := 0; j < PoolSize; j++ { - go func() { - defer wg.Done() - h := hasher() - for atomic.AddInt32(&i, 1) < count { - doSum(h, nil, data) - } - }() - } - wg.Wait() - } -} - -// benchmarks BMT Hasher -func benchmarkBMT(t *testing.B, n int) { - data := testutil.RandomBytes(1, n) - hasher := sha3.NewLegacyKeccak256 - pool := NewTreePool(hasher, segmentCount, PoolSize) - bmt := New(pool) - - t.ReportAllocs() - t.ResetTimer() - for i := 0; i < t.N; i++ { - syncHash(bmt, nil, data) - } -} - -// benchmarks BMT hasher with asynchronous concurrent segment/section writes -func benchmarkBMTAsync(t *testing.B, n int, wh whenHash, double bool) { - data := testutil.RandomBytes(1, n) - hasher := sha3.NewLegacyKeccak256 - pool := NewTreePool(hasher, segmentCount, PoolSize) - bmt := New(pool).NewAsyncWriter(double) - idxs, segments := splitAndShuffle(bmt.SectionSize(), data) - rand.Shuffle(len(idxs), func(i int, j int) { - idxs[i], idxs[j] = idxs[j], idxs[i] - }) - - t.ReportAllocs() - t.ResetTimer() - for i := 0; i < t.N; i++ { - asyncHash(bmt, nil, n, wh, idxs, segments) - } -} - -// benchmarks 100 concurrent bmt hashes with pool capacity -func benchmarkPool(t *testing.B, poolsize, n int) { - data := testutil.RandomBytes(1, n) - hasher := sha3.NewLegacyKeccak256 - pool := NewTreePool(hasher, segmentCount, poolsize) - cycles := 100 - - t.ReportAllocs() - t.ResetTimer() - wg := sync.WaitGroup{} - for i := 0; i < t.N; i++ { - wg.Add(cycles) - for j := 0; j < cycles; j++ { - go func() { - defer wg.Done() - bmt := New(pool) - syncHash(bmt, nil, data) - }() - } - wg.Wait() - } -} - -// benchmarks the reference hasher -func benchmarkRefHasher(t *testing.B, n int) { - data := testutil.RandomBytes(1, n) - hasher := sha3.NewLegacyKeccak256 - rbmt := NewRefHasher(hasher, 128) - - t.ReportAllocs() - t.ResetTimer() - for i := 0; i < t.N; i++ { - rbmt.Hash(data) - } -} - -// Hash hashes the data and the span using the bmt hasher -func syncHash(h *Hasher, span, data []byte) []byte { - h.ResetWithLength(span) - h.Write(data) - return h.Sum(nil) -} - -func splitAndShuffle(secsize int, data []byte) (idxs []int, segments [][]byte) { - l := len(data) - n := l / secsize - if l%secsize > 0 { - n++ - } - for i := 0; i < n; i++ { - idxs = append(idxs, i) - end := (i + 1) * secsize - if end > l { - end = l - } - section := data[i*secsize : end] - segments = append(segments, section) - } - rand.Shuffle(n, func(i int, j int) { - idxs[i], idxs[j] = idxs[j], idxs[i] - }) - return idxs, segments -} - -// splits the input data performs a random shuffle to mock async section writes -func asyncHashRandom(bmt SectionWriter, span []byte, data []byte, wh whenHash) (s []byte) { - idxs, segments := splitAndShuffle(bmt.SectionSize(), data) - return asyncHash(bmt, span, len(data), wh, idxs, segments) -} - -// mock for async section writes for BMT SectionWriter -// requires a permutation (a random shuffle) of list of all indexes of segments -// and writes them in order to the appropriate section -// the Sum function is called according to the wh parameter (first, last, random [relative to segment writes]) -func asyncHash(bmt SectionWriter, span []byte, l int, wh whenHash, idxs []int, segments [][]byte) (s []byte) { - bmt.Reset() - if l == 0 { - return bmt.Sum(nil, l, span) - } - c := make(chan []byte, 1) - hashf := func() { - c <- bmt.Sum(nil, l, span) - } - maxsize := len(idxs) - var r int - if wh == random { - r = rand.Intn(maxsize) - } - for i, idx := range idxs { - bmt.Write(idx, segments[idx]) - if (wh == first || wh == random) && i == r { - go hashf() - } - } - if wh == last { - return bmt.Sum(nil, l, span) - } - return <-c -} diff --git a/swarm/chunk/chunk.go b/swarm/chunk/chunk.go deleted file mode 100644 index 1449efccd0ef..000000000000 --- a/swarm/chunk/chunk.go +++ /dev/null @@ -1,5 +0,0 @@ -package chunk - -const ( - DefaultSize = 4096 -) diff --git a/swarm/dev/.dockerignore b/swarm/dev/.dockerignore deleted file mode 100644 index f9e69b37f369..000000000000 --- a/swarm/dev/.dockerignore +++ /dev/null @@ -1,2 +0,0 @@ -bin/* -cluster/* diff --git a/swarm/dev/.gitignore b/swarm/dev/.gitignore deleted file mode 100644 index f9e69b37f369..000000000000 --- a/swarm/dev/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -bin/* -cluster/* diff --git a/swarm/dev/Dockerfile b/swarm/dev/Dockerfile deleted file mode 100644 index 728bdab1fb30..000000000000 --- a/swarm/dev/Dockerfile +++ /dev/null @@ -1,42 +0,0 @@ -FROM ubuntu:xenial - -# install build + test dependencies -RUN apt-get update && \ - apt-get install --yes --no-install-recommends \ - ca-certificates \ - curl \ - fuse \ - g++ \ - gcc \ - git \ - iproute2 \ - iputils-ping \ - less \ - libc6-dev \ - make \ - pkg-config \ - && \ - apt-get clean - -# install Go -ENV GO_VERSION 1.8.1 -RUN curl -fSLo golang.tar.gz "https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz" && \ - tar -xzf golang.tar.gz -C /usr/local && \ - rm golang.tar.gz -ENV GOPATH /go -ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH - -# install docker CLI -RUN curl -fSLo docker.tar.gz https://get.docker.com/builds/Linux/x86_64/docker-17.04.0-ce.tgz && \ - tar -xzf docker.tar.gz -C /usr/local/bin --strip-components=1 docker/docker && \ - rm docker.tar.gz - -# install jq -RUN curl -fSLo /usr/local/bin/jq https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 && \ - chmod +x /usr/local/bin/jq - -# install govendor -RUN go get -u github.com/kardianos/govendor - -# add custom bashrc -ADD bashrc /root/.bashrc diff --git a/swarm/dev/Makefile b/swarm/dev/Makefile deleted file mode 100644 index 0028dd04da3d..000000000000 --- a/swarm/dev/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -.PHONY: build cluster test - -default: build - -build: - go build -o bin/swarm github.com/nebulaai/nbai-node/cmd/swarm - go build -o bin/geth github.com/nebulaai/nbai-node/cmd/geth - go build -o bin/bootnode github.com/nebulaai/nbai-node/cmd/bootnode - -cluster: build - scripts/boot-cluster.sh - -test: - go test -v github.com/nebulaai/nbai-node/swarm/... diff --git a/swarm/dev/README.md b/swarm/dev/README.md deleted file mode 100644 index 81e3b53585e9..000000000000 --- a/swarm/dev/README.md +++ /dev/null @@ -1,20 +0,0 @@ -Swarm development environment -============================= - -The Swarm development environment is a Linux bash shell which can be run in a -Docker container and provides a predictable build and test environment. - -### Start the Docker container - -Run the `run.sh` script to build the Docker image and run it, you will then be -at a bash prompt inside the `swarm/dev` directory. - -### Build binaries - -Run `make` to build the `swarm`, `geth` and `bootnode` binaries into the -`swarm/dev/bin` directory. - -### Boot a cluster - -Run `make cluster` to start a 3 node Swarm cluster, or run -`scripts/boot-cluster.sh --size N` to boot a cluster of size N. diff --git a/swarm/dev/bashrc b/swarm/dev/bashrc deleted file mode 100644 index 0e5f97238f51..000000000000 --- a/swarm/dev/bashrc +++ /dev/null @@ -1,21 +0,0 @@ -export ROOT="${GOPATH}/src/github.com/nebulaai/nbai-node" -export PATH="${ROOT}/swarm/dev/bin:${PATH}" - -cd "${ROOT}/swarm/dev" - -cat <&2 <&2 - exit 1 - fi - name="$2" - shift 2 - ;; - -d | --docker-args) - if [[ -z "$2" ]]; then - echo "ERROR: --docker-args flag requires an argument" >&2 - exit 1 - fi - docker_args="$2" - shift 2 - ;; - *) - break - ;; - esac - done - - if [[ $# -ne 0 ]]; then - usage - echo "ERROR: invalid arguments" >&2 - exit 1 - fi -} - -build_image() { - docker build --tag "${name}" "${ROOT}/swarm/dev" -} - -run_image() { - exec docker run \ - --privileged \ - --interactive \ - --tty \ - --rm \ - --hostname "${name}" \ - --name "${name}" \ - --volume "${ROOT}:/go/src/github.com/nebulaai/nbai-node" \ - --volume "/var/run/docker.sock:/var/run/docker.sock" \ - ${docker_args} \ - "${name}" \ - /bin/bash -} - -main "$@" diff --git a/swarm/dev/scripts/boot-cluster.sh b/swarm/dev/scripts/boot-cluster.sh deleted file mode 100755 index 98ae3c8023f0..000000000000 --- a/swarm/dev/scripts/boot-cluster.sh +++ /dev/null @@ -1,288 +0,0 @@ -#!/bin/bash -# -# A script to boot a dev swarm cluster on a Linux host (typically in a Docker -# container started with swarm/dev/run.sh). -# -# The cluster contains a bootnode, a geth node and multiple swarm nodes, with -# each node having its own data directory in a base directory passed with the -# --dir flag (default is swarm/dev/cluster). -# -# To avoid using different ports for each node and to make networking more -# realistic, each node gets its own network namespace with IPs assigned from -# the 192.168.33.0/24 subnet: -# -# bootnode: 192.168.33.2 -# geth: 192.168.33.3 -# swarm: 192.168.33.10{1,2,...,n} - -set -e - -ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" -source "${ROOT}/swarm/dev/scripts/util.sh" - -# DEFAULT_BASE_DIR is the default base directory to store node data -DEFAULT_BASE_DIR="${ROOT}/swarm/dev/cluster" - -# DEFAULT_CLUSTER_SIZE is the default swarm cluster size -DEFAULT_CLUSTER_SIZE=3 - -# Linux bridge configuration for connecting the node network namespaces -BRIDGE_NAME="swarmbr0" -BRIDGE_IP="192.168.33.1" - -# static bootnode configuration -BOOTNODE_IP="192.168.33.2" -BOOTNODE_PORT="30301" -BOOTNODE_KEY="32078f313bea771848db70745225c52c00981589ad6b5b49163f0f5ee852617d" -BOOTNODE_PUBKEY="760c4460e5336ac9bbd87952a3c7ec4363fc0a97bd31c86430806e287b437fd1b01abc6e1db640cf3106b520344af1d58b00b57823db3e1407cbc433e1b6d04d" -BOOTNODE_URL="enode://${BOOTNODE_PUBKEY}@${BOOTNODE_IP}:${BOOTNODE_PORT}" - -# static geth configuration -GETH_IP="192.168.33.3" -GETH_RPC_PORT="8545" -GETH_RPC_URL="http://${GETH_IP}:${GETH_RPC_PORT}" - -usage() { - cat >&2 < "${key_file}" - - local args=( - --addr "${BOOTNODE_IP}:${BOOTNODE_PORT}" - --nodekey "${key_file}" - --verbosity "6" - ) - - start_node "bootnode" "${BOOTNODE_IP}" "$(which bootnode)" ${args[@]} -} - -# start_geth_node starts a geth node with --datadir pointing at /geth -# and a single, unlocked account with password "geth" -start_geth_node() { - local dir="${base_dir}/geth" - mkdir -p "${dir}" - - local password="geth" - echo "${password}" > "${dir}/password" - - # create an account if necessary - if [[ ! -e "${dir}/keystore" ]]; then - info "creating geth account" - create_account "${dir}" "${password}" - fi - - # get the account address - local address="$(jq --raw-output '.address' ${dir}/keystore/*)" - if [[ -z "${address}" ]]; then - fail "failed to get geth account address" - fi - - local args=( - --datadir "${dir}" - --networkid "321" - --bootnodes "${BOOTNODE_URL}" - --unlock "${address}" - --password "${dir}/password" - --rpc - --rpcaddr "${GETH_IP}" - --rpcport "${GETH_RPC_PORT}" - --verbosity "6" - ) - - start_node "geth" "${GETH_IP}" "$(which geth)" ${args[@]} -} - -start_swarm_nodes() { - for i in $(seq 1 ${cluster_size}); do - start_swarm_node "${i}" - done -} - -# start_swarm_node starts a swarm node with a name like "swarmNN" (where NN is -# a zero-padded integer like "07"), --datadir pointing at / -# (e.g. /swarm07) and a single account with as the password -start_swarm_node() { - local num=$1 - local name="swarm$(printf '%02d' ${num})" - local ip="192.168.33.1$(printf '%02d' ${num})" - - local dir="${base_dir}/${name}" - mkdir -p "${dir}" - - local password="${name}" - echo "${password}" > "${dir}/password" - - # create an account if necessary - if [[ ! -e "${dir}/keystore" ]]; then - info "creating account for ${name}" - create_account "${dir}" "${password}" - fi - - # get the account address - local address="$(jq --raw-output '.address' ${dir}/keystore/*)" - if [[ -z "${address}" ]]; then - fail "failed to get swarm account address" - fi - - local args=( - --bootnodes "${BOOTNODE_URL}" - --datadir "${dir}" - --identity "${name}" - --ens-api "${GETH_RPC_URL}" - --bzznetworkid "321" - --bzzaccount "${address}" - --password "${dir}/password" - --verbosity "6" - ) - - start_node "${name}" "${ip}" "$(which swarm)" ${args[@]} -} - -# start_node runs the node command as a daemon in a network namespace -start_node() { - local name="$1" - local ip="$2" - local path="$3" - local cmd_args=${@:4} - - info "starting ${name} with IP ${ip}" - - create_node_network "${name}" "${ip}" - - # add a marker to the log file - cat >> "${log_dir}/${name}.log" <>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -Starting ${name} node - $(date) ->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> - -EOF - - # run the command in the network namespace using start-stop-daemon to - # daemonise the process, sending all output to the log file - local daemon_args=( - --start - --background - --no-close - --make-pidfile - --pidfile "${pid_dir}/${name}.pid" - --exec "${path}" - ) - if ! ip netns exec "${name}" start-stop-daemon ${daemon_args[@]} -- $cmd_args &>> "${log_dir}/${name}.log"; then - fail "could not start ${name}, check ${log_dir}/${name}.log" - fi -} - -# create_node_network creates a network namespace and connects it to the Linux -# bridge using a veth pair -create_node_network() { - local name="$1" - local ip="$2" - - # create the namespace - ip netns add "${name}" - - # create the veth pair - local veth0="veth${name}0" - local veth1="veth${name}1" - ip link add name "${veth0}" type veth peer name "${veth1}" - - # add one end to the bridge - ip link set dev "${veth0}" master "${BRIDGE_NAME}" - ip link set dev "${veth0}" up - - # add the other end to the namespace, rename it eth0 and give it the ip - ip link set dev "${veth1}" netns "${name}" - ip netns exec "${name}" ip link set dev "${veth1}" name "eth0" - ip netns exec "${name}" ip link set dev "eth0" up - ip netns exec "${name}" ip address add "${ip}/24" dev "eth0" -} - -create_account() { - local dir=$1 - local password=$2 - - geth --datadir "${dir}" --password /dev/stdin account new <<< "${password}" -} - -main "$@" diff --git a/swarm/dev/scripts/random-uploads.sh b/swarm/dev/scripts/random-uploads.sh deleted file mode 100755 index 563a51befcf9..000000000000 --- a/swarm/dev/scripts/random-uploads.sh +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash -# -# A script to upload random data to a swarm cluster. -# -# Example: -# -# random-uploads.sh --addr 192.168.33.101:8500 --size 40k --count 1000 - -set -e - -ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" -source "${ROOT}/swarm/dev/scripts/util.sh" - -DEFAULT_ADDR="localhost:8500" -DEFAULT_UPLOAD_SIZE="40k" -DEFAULT_UPLOAD_COUNT="1000" - -usage() { - cat >&2 </dev/null -} - -parse_args() { - while true; do - case "$1" in - -h | --help) - usage - exit 0 - ;; - -a | --addr) - if [[ -z "$2" ]]; then - fail "--addr flag requires an argument" - fi - addr="$2" - shift 2 - ;; - -s | --size) - if [[ -z "$2" ]]; then - fail "--size flag requires an argument" - fi - upload_size="$2" - shift 2 - ;; - -c | --count) - if [[ -z "$2" ]]; then - fail "--count flag requires an argument" - fi - upload_count="$2" - shift 2 - ;; - *) - break - ;; - esac - done - - if [[ $# -ne 0 ]]; then - usage - fail "ERROR: invalid arguments: $@" - fi -} - -main "$@" diff --git a/swarm/dev/scripts/stop-cluster.sh b/swarm/dev/scripts/stop-cluster.sh deleted file mode 100755 index 89cb7b0c9ab7..000000000000 --- a/swarm/dev/scripts/stop-cluster.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/bash -# -# A script to shutdown a dev swarm cluster. - -set -e - -ROOT="$(cd "$(dirname "$0")/../../.." && pwd)" -source "${ROOT}/swarm/dev/scripts/util.sh" - -DEFAULT_BASE_DIR="${ROOT}/swarm/dev/cluster" - -usage() { - cat >&2 </dev/null; then - ip link delete dev "veth${name}0" - fi -} - -delete_network() { - if ip link show "swarmbr0" &>/dev/null; then - ip link delete dev "swarmbr0" - fi -} - -main "$@" diff --git a/swarm/dev/scripts/util.sh b/swarm/dev/scripts/util.sh deleted file mode 100644 index f17a12e420d0..000000000000 --- a/swarm/dev/scripts/util.sh +++ /dev/null @@ -1,53 +0,0 @@ -# shared shell functions - -info() { - local msg="$@" - local timestamp="$(date +%H:%M:%S)" - say "===> ${timestamp} ${msg}" "green" -} - -warn() { - local msg="$@" - local timestamp=$(date +%H:%M:%S) - say "===> ${timestamp} WARN: ${msg}" "yellow" >&2 -} - -fail() { - local msg="$@" - say "ERROR: ${msg}" "red" >&2 - exit 1 -} - -# say prints the given message to STDOUT, using the optional color if -# STDOUT is a terminal. -# -# usage: -# -# say "foo" - prints "foo" -# say "bar" "red" - prints "bar" in red -# say "baz" "green" - prints "baz" in green -# say "qux" "red" | tee - prints "qux" with no colour -# -say() { - local msg=$1 - local color=$2 - - if [[ -n "${color}" ]] && [[ -t 1 ]]; then - case "${color}" in - red) - echo -e "\033[1;31m${msg}\033[0m" - ;; - green) - echo -e "\033[1;32m${msg}\033[0m" - ;; - yellow) - echo -e "\033[1;33m${msg}\033[0m" - ;; - *) - echo "${msg}" - ;; - esac - else - echo "${msg}" - fi -} diff --git a/swarm/docker/Dockerfile b/swarm/docker/Dockerfile deleted file mode 100644 index 1ee4e9734217..000000000000 --- a/swarm/docker/Dockerfile +++ /dev/null @@ -1,23 +0,0 @@ -FROM golang:1.11-alpine as builder - -ARG VERSION - -RUN apk add --update git gcc g++ linux-headers -RUN mkdir -p $GOPATH/src/github.com/ethereum && \ - cd $GOPATH/src/github.com/ethereum && \ - git clone https://github.com/ethersphere/go-ethereum && \ - cd $GOPATH/src/github.com/ethereum/go-ethereum && \ - git checkout ${VERSION} && \ - go install -ldflags "-X main.gitCommit=${VERSION}" ./cmd/swarm && \ - go install -ldflags "-X main.gitCommit=${VERSION}" ./cmd/swarm/swarm-smoke && \ - go install -ldflags "-X main.gitCommit=${VERSION}" ./cmd/geth && \ - cp $GOPATH/bin/swarm /swarm && cp $GOPATH/bin/geth /geth && cp $GOPATH/bin/swarm-smoke /swarm-smoke - - -# Release image with the required binaries and scripts -FROM alpine:3.8 -WORKDIR / -COPY --from=builder /swarm /geth /swarm-smoke / -ADD run.sh /run.sh -ADD run-smoke.sh /run-smoke.sh -ENTRYPOINT ["/run.sh"] diff --git a/swarm/docker/run-smoke.sh b/swarm/docker/run-smoke.sh deleted file mode 100755 index ba57a7ecd654..000000000000 --- a/swarm/docker/run-smoke.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -set -o errexit -set -o pipefail -set -o nounset - -/swarm-smoke $@ 2>&1 || true diff --git a/swarm/docker/run.sh b/swarm/docker/run.sh deleted file mode 100755 index 3e613b56d95d..000000000000 --- a/swarm/docker/run.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -set -o errexit -set -o pipefail -set -o nounset - -PASSWORD=${PASSWORD:-} -DATADIR=${DATADIR:-/root/.ethereum/} - -if [ "$PASSWORD" == "" ]; then echo "Password must be set, in order to use swarm non-interactively." && exit 1; fi - -echo $PASSWORD > /password - -KEYFILE=`find $DATADIR | grep UTC | head -n 1` || true -if [ ! -f "$KEYFILE" ]; then echo "No keyfile found. Generating..." && /geth --datadir $DATADIR --password /password account new; fi -KEYFILE=`find $DATADIR | grep UTC | head -n 1` || true -if [ ! -f "$KEYFILE" ]; then echo "Could not find nor generate a BZZ keyfile." && exit 1; else echo "Found keyfile $KEYFILE"; fi - -VERSION=`/swarm version` -echo "Running Swarm:" -echo $VERSION - -export BZZACCOUNT="`echo -n $KEYFILE | tail -c 40`" || true -if [ "$BZZACCOUNT" == "" ]; then echo "Could not parse BZZACCOUNT from keyfile." && exit 1; fi - -exec /swarm --bzzaccount=$BZZACCOUNT --password /password --datadir $DATADIR $@ 2>&1 diff --git a/swarm/fuse/fuse_dir.go b/swarm/fuse/fuse_dir.go deleted file mode 100644 index c2ab176a0a7f..000000000000 --- a/swarm/fuse/fuse_dir.go +++ /dev/null @@ -1,161 +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 . - -// +build linux darwin freebsd - -package fuse - -import ( - "os" - "path/filepath" - "sync" - - "bazil.org/fuse" - "bazil.org/fuse/fs" - "github.com/nebulaai/nbai-node/swarm/log" - "golang.org/x/net/context" -) - -var ( - _ fs.Node = (*SwarmDir)(nil) - _ fs.NodeRequestLookuper = (*SwarmDir)(nil) - _ fs.HandleReadDirAller = (*SwarmDir)(nil) - _ fs.NodeCreater = (*SwarmDir)(nil) - _ fs.NodeRemover = (*SwarmDir)(nil) - _ fs.NodeMkdirer = (*SwarmDir)(nil) -) - -type SwarmDir struct { - inode uint64 - name string - path string - directories []*SwarmDir - files []*SwarmFile - - mountInfo *MountInfo - lock *sync.RWMutex -} - -func NewSwarmDir(fullpath string, minfo *MountInfo) *SwarmDir { - log.Debug("swarmfs", "NewSwarmDir", fullpath) - newdir := &SwarmDir{ - inode: NewInode(), - name: filepath.Base(fullpath), - path: fullpath, - directories: []*SwarmDir{}, - files: []*SwarmFile{}, - mountInfo: minfo, - lock: &sync.RWMutex{}, - } - return newdir -} - -func (sd *SwarmDir) Attr(ctx context.Context, a *fuse.Attr) error { - sd.lock.RLock() - defer sd.lock.RUnlock() - a.Inode = sd.inode - a.Mode = os.ModeDir | 0700 - a.Uid = uint32(os.Getuid()) - a.Gid = uint32(os.Getegid()) - return nil -} - -func (sd *SwarmDir) Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse.LookupResponse) (fs.Node, error) { - log.Debug("swarmfs", "Lookup", req.Name) - for _, n := range sd.files { - if n.name == req.Name { - return n, nil - } - } - for _, n := range sd.directories { - if n.name == req.Name { - return n, nil - } - } - return nil, fuse.ENOENT -} - -func (sd *SwarmDir) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) { - log.Debug("swarmfs ReadDirAll") - var children []fuse.Dirent - for _, file := range sd.files { - children = append(children, fuse.Dirent{Inode: file.inode, Type: fuse.DT_File, Name: file.name}) - } - for _, dir := range sd.directories { - children = append(children, fuse.Dirent{Inode: dir.inode, Type: fuse.DT_Dir, Name: dir.name}) - } - return children, nil -} - -func (sd *SwarmDir) Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (fs.Node, fs.Handle, error) { - log.Debug("swarmfs Create", "path", sd.path, "req.Name", req.Name) - - newFile := NewSwarmFile(sd.path, req.Name, sd.mountInfo) - newFile.fileSize = 0 // 0 means, file is not in swarm yet and it is just created - - sd.lock.Lock() - defer sd.lock.Unlock() - sd.files = append(sd.files, newFile) - - return newFile, newFile, nil -} - -func (sd *SwarmDir) Remove(ctx context.Context, req *fuse.RemoveRequest) error { - log.Debug("swarmfs Remove", "path", sd.path, "req.Name", req.Name) - - if req.Dir && sd.directories != nil { - newDirs := []*SwarmDir{} - for _, dir := range sd.directories { - if dir.name == req.Name { - removeDirectoryFromSwarm(dir) - } else { - newDirs = append(newDirs, dir) - } - } - if len(sd.directories) > len(newDirs) { - sd.lock.Lock() - defer sd.lock.Unlock() - sd.directories = newDirs - } - return nil - } else if !req.Dir && sd.files != nil { - newFiles := []*SwarmFile{} - for _, f := range sd.files { - if f.name == req.Name { - removeFileFromSwarm(f) - } else { - newFiles = append(newFiles, f) - } - } - if len(sd.files) > len(newFiles) { - sd.lock.Lock() - defer sd.lock.Unlock() - sd.files = newFiles - } - return nil - } - return fuse.ENOENT -} - -func (sd *SwarmDir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, error) { - log.Debug("swarmfs Mkdir", "path", sd.path, "req.Name", req.Name) - newDir := NewSwarmDir(filepath.Join(sd.path, req.Name), sd.mountInfo) - sd.lock.Lock() - defer sd.lock.Unlock() - sd.directories = append(sd.directories, newDir) - - return newDir, nil -} diff --git a/swarm/fuse/fuse_file.go b/swarm/fuse/fuse_file.go deleted file mode 100644 index 7f0229318e4f..000000000000 --- a/swarm/fuse/fuse_file.go +++ /dev/null @@ -1,146 +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 . - -// +build linux darwin freebsd - -package fuse - -import ( - "errors" - "io" - "os" - "sync" - - "bazil.org/fuse" - "bazil.org/fuse/fs" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/storage" - "golang.org/x/net/context" -) - -const ( - MaxAppendFileSize = 10485760 // 10Mb -) - -var ( - errInvalidOffset = errors.New("Invalid offset during write") - errFileSizeMaxLimixReached = errors.New("File size exceeded max limit") -) - -var ( - _ fs.Node = (*SwarmFile)(nil) - _ fs.HandleReader = (*SwarmFile)(nil) - _ fs.HandleWriter = (*SwarmFile)(nil) -) - -type SwarmFile struct { - inode uint64 - name string - path string - addr storage.Address - fileSize int64 - reader storage.LazySectionReader - - mountInfo *MountInfo - lock *sync.RWMutex -} - -func NewSwarmFile(path, fname string, minfo *MountInfo) *SwarmFile { - newFile := &SwarmFile{ - inode: NewInode(), - name: fname, - path: path, - addr: nil, - fileSize: -1, // -1 means , file already exists in swarm and you need to just get the size from swarm - reader: nil, - - mountInfo: minfo, - lock: &sync.RWMutex{}, - } - return newFile -} - -func (sf *SwarmFile) Attr(ctx context.Context, a *fuse.Attr) error { - log.Debug("swarmfs Attr", "path", sf.path) - sf.lock.Lock() - defer sf.lock.Unlock() - a.Inode = sf.inode - //TODO: need to get permission as argument - a.Mode = 0700 - a.Uid = uint32(os.Getuid()) - a.Gid = uint32(os.Getegid()) - - if sf.fileSize == -1 { - reader, _ := sf.mountInfo.swarmApi.Retrieve(ctx, sf.addr) - quitC := make(chan bool) - size, err := reader.Size(ctx, quitC) - if err != nil { - log.Error("Couldnt get size of file %s : %v", sf.path, err) - return err - } - sf.fileSize = size - log.Trace("swarmfs Attr", "size", size) - close(quitC) - } - a.Size = uint64(sf.fileSize) - return nil -} - -func (sf *SwarmFile) Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error { - log.Debug("swarmfs Read", "path", sf.path, "req.String", req.String()) - sf.lock.RLock() - defer sf.lock.RUnlock() - if sf.reader == nil { - sf.reader, _ = sf.mountInfo.swarmApi.Retrieve(ctx, sf.addr) - } - buf := make([]byte, req.Size) - n, err := sf.reader.ReadAt(buf, req.Offset) - if err == io.ErrUnexpectedEOF || err == io.EOF { - err = nil - } - resp.Data = buf[:n] - sf.reader = nil - - return err -} - -func (sf *SwarmFile) Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error { - log.Debug("swarmfs Write", "path", sf.path, "req.String", req.String()) - if sf.fileSize == 0 && req.Offset == 0 { - // A new file is created - err := addFileToSwarm(sf, req.Data, len(req.Data)) - if err != nil { - return err - } - resp.Size = len(req.Data) - } else if req.Offset <= sf.fileSize { - totalSize := sf.fileSize + int64(len(req.Data)) - if totalSize > MaxAppendFileSize { - log.Warn("swarmfs Append file size reached (%v) : (%v)", sf.fileSize, len(req.Data)) - return errFileSizeMaxLimixReached - } - - err := appendToExistingFileInSwarm(sf, req.Data, req.Offset, int64(len(req.Data))) - if err != nil { - return err - } - resp.Size = len(req.Data) - } else { - log.Warn("swarmfs Invalid write request size(%v) : off(%v)", sf.fileSize, req.Offset) - return errInvalidOffset - } - return nil -} diff --git a/swarm/fuse/fuse_root.go b/swarm/fuse/fuse_root.go deleted file mode 100644 index b2262d1c5a0d..000000000000 --- a/swarm/fuse/fuse_root.go +++ /dev/null @@ -1,35 +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 . - -// +build linux darwin freebsd - -package fuse - -import ( - "bazil.org/fuse/fs" -) - -var ( - _ fs.Node = (*SwarmDir)(nil) -) - -type SwarmRoot struct { - root *SwarmDir -} - -func (filesystem *SwarmRoot) Root() (fs.Node, error) { - return filesystem.root, nil -} diff --git a/swarm/fuse/swarmfs.go b/swarm/fuse/swarmfs.go deleted file mode 100644 index 08c627e542d9..000000000000 --- a/swarm/fuse/swarmfs.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package fuse - -import ( - "sync" - "time" - - "github.com/nebulaai/nbai-node/swarm/api" -) - -const ( - Swarmfs_Version = "0.1" - mountTimeout = time.Second * 5 - unmountTimeout = time.Second * 10 - maxFuseMounts = 5 -) - -var ( - swarmfs *SwarmFS // Swarm file system singleton - swarmfsLock sync.Once - - inode uint64 = 1 // global inode - inodeLock sync.RWMutex -) - -type SwarmFS struct { - swarmApi *api.API - activeMounts map[string]*MountInfo - swarmFsLock *sync.RWMutex -} - -func NewSwarmFS(api *api.API) *SwarmFS { - swarmfsLock.Do(func() { - swarmfs = &SwarmFS{ - swarmApi: api, - swarmFsLock: &sync.RWMutex{}, - activeMounts: map[string]*MountInfo{}, - } - }) - return swarmfs - -} - -// 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 -} diff --git a/swarm/fuse/swarmfs_fallback.go b/swarm/fuse/swarmfs_fallback.go deleted file mode 100644 index 4864c8689c27..000000000000 --- a/swarm/fuse/swarmfs_fallback.go +++ /dev/null @@ -1,51 +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 . - -// +build !linux,!darwin,!freebsd - -package fuse - -import ( - "errors" -) - -var errNoFUSE = errors.New("FUSE is not supported on this platform") - -func isFUSEUnsupportedError(err error) bool { - return err == errNoFUSE -} - -type MountInfo struct { - MountPoint string - StartManifest string - LatestManifest string -} - -func (self *SwarmFS) Mount(mhash, mountpoint string) (*MountInfo, error) { - return nil, errNoFUSE -} - -func (self *SwarmFS) Unmount(mountpoint string) (bool, error) { - return false, errNoFUSE -} - -func (self *SwarmFS) Listmounts() ([]*MountInfo, error) { - return nil, errNoFUSE -} - -func (self *SwarmFS) Stop() error { - return nil -} diff --git a/swarm/fuse/swarmfs_test.go b/swarm/fuse/swarmfs_test.go deleted file mode 100644 index db457edd1f0d..000000000000 --- a/swarm/fuse/swarmfs_test.go +++ /dev/null @@ -1,1671 +0,0 @@ -// Copyright 2018 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 . - -// +build linux darwin freebsd - -package fuse - -import ( - "bytes" - "flag" - "fmt" - "io" - "io/ioutil" - "math/rand" - "os" - "path/filepath" - "testing" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/swarm/api" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/testutil" - colorable "github.com/mattn/go-colorable" -) - -var ( - loglevel = flag.Int("loglevel", 4, "verbosity of logs") - rawlog = flag.Bool("rawlog", false, "turn off terminal formatting in logs") - longrunning = flag.Bool("longrunning", false, "do run long-running tests") -) - -func init() { - flag.Parse() - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(!*rawlog)))) -} - -type fileInfo struct { - perm uint64 - uid int - gid int - contents []byte -} - -//create files from the map of name and content provided and upload them to swarm via api -func createTestFilesAndUploadToSwarm(t *testing.T, api *api.API, files map[string]fileInfo, uploadDir string, toEncrypt bool) string { - - //iterate the map - for fname, finfo := range files { - actualPath := filepath.Join(uploadDir, fname) - filePath := filepath.Dir(actualPath) - - //create directory - err := os.MkdirAll(filePath, 0777) - if err != nil { - t.Fatalf("Error creating directory '%v' : %v", filePath, err) - } - - //create file - fd, err1 := os.OpenFile(actualPath, os.O_RDWR|os.O_CREATE, os.FileMode(finfo.perm)) - if err1 != nil { - t.Fatalf("Error creating file %v: %v", actualPath, err1) - } - - //write content to file - _, err = fd.Write(finfo.contents) - if err != nil { - t.Fatalf("Error writing to file '%v' : %v", filePath, err) - } - /* - Note @holisticode: It's not clear why the Chown command was added to the test suite. - Some files are initialized with different permissions in the individual test, - resulting in errors on Chown which were not checked. - After adding the checks tests would fail. - - What's then the reason to have this check in the first place? - Disabling for now - - err = fd.Chown(finfo.uid, finfo.gid) - if err != nil { - t.Fatalf("Error chown file '%v' : %v", filePath, err) - } - */ - err = fd.Chmod(os.FileMode(finfo.perm)) - if err != nil { - t.Fatalf("Error chmod file '%v' : %v", filePath, err) - } - err = fd.Sync() - if err != nil { - t.Fatalf("Error sync file '%v' : %v", filePath, err) - } - err = fd.Close() - if err != nil { - t.Fatalf("Error closing file '%v' : %v", filePath, err) - } - } - - //upload directory to swarm and return hash - bzzhash, err := Upload(uploadDir, "", api, toEncrypt) - if err != nil { - t.Fatalf("Error uploading directory %v: %vm encryption: %v", uploadDir, err, toEncrypt) - } - - return bzzhash -} - -//mount a swarm hash as a directory on files system via FUSE -func mountDir(t *testing.T, api *api.API, files map[string]fileInfo, bzzHash string, mountDir string) *SwarmFS { - swarmfs := NewSwarmFS(api) - _, err := swarmfs.Mount(bzzHash, mountDir) - if isFUSEUnsupportedError(err) { - t.Skip("FUSE not supported:", err) - } else if err != nil { - t.Fatalf("Error mounting hash %v: %v", bzzHash, err) - } - - //check directory is mounted - found := false - mi := swarmfs.Listmounts() - for _, minfo := range mi { - minfo.lock.RLock() - if minfo.MountPoint == mountDir { - if minfo.StartManifest != bzzHash || - minfo.LatestManifest != bzzHash || - minfo.fuseConnection == nil { - minfo.lock.RUnlock() - t.Fatalf("Error mounting: exp(%s): act(%s)", bzzHash, minfo.StartManifest) - } - found = true - } - minfo.lock.RUnlock() - } - - // Test listMounts - if !found { - t.Fatalf("Error getting mounts information for %v: %v", mountDir, err) - } - - // Check if file and their attributes are as expected - compareGeneratedFileWithFileInMount(t, files, mountDir) - - return swarmfs -} - -// Check if file and their attributes are as expected -func compareGeneratedFileWithFileInMount(t *testing.T, files map[string]fileInfo, mountDir string) { - err := filepath.Walk(mountDir, func(path string, f os.FileInfo, err error) error { - if f.IsDir() { - return nil - } - fname := path[len(mountDir)+1:] - if _, ok := files[fname]; !ok { - t.Fatalf(" file %v present in mount dir and is not expected", fname) - } - return nil - }) - if err != nil { - t.Fatalf("Error walking dir %v", mountDir) - } - - for fname, finfo := range files { - destinationFile := filepath.Join(mountDir, fname) - - dfinfo, err := os.Stat(destinationFile) - if err != nil { - t.Fatalf("Destination file %v missing in mount: %v", fname, err) - } - - if int64(len(finfo.contents)) != dfinfo.Size() { - t.Fatalf("file %v Size mismatch source (%v) vs destination(%v)", fname, int64(len(finfo.contents)), dfinfo.Size()) - } - - if dfinfo.Mode().Perm().String() != "-rwx------" { - t.Fatalf("file %v Permission mismatch source (-rwx------) vs destination(%v)", fname, dfinfo.Mode().Perm()) - } - - fileContents, err := ioutil.ReadFile(filepath.Join(mountDir, fname)) - if err != nil { - t.Fatalf("Could not readfile %v : %v", fname, err) - } - if !bytes.Equal(fileContents, finfo.contents) { - t.Fatalf("File %v contents mismatch: %v , %v", fname, fileContents, finfo.contents) - } - // TODO: check uid and gid - } -} - -//check mounted file with provided content -func checkFile(t *testing.T, testMountDir, fname string, contents []byte) { - destinationFile := filepath.Join(testMountDir, fname) - dfinfo, err1 := os.Stat(destinationFile) - if err1 != nil { - t.Fatalf("Could not stat file %v", destinationFile) - } - if dfinfo.Size() != int64(len(contents)) { - t.Fatalf("Mismatch in size actual(%v) vs expected(%v)", dfinfo.Size(), int64(len(contents))) - } - - fd, err2 := os.OpenFile(destinationFile, os.O_RDONLY, os.FileMode(0665)) - if err2 != nil { - t.Fatalf("Could not open file %v", destinationFile) - } - newcontent := make([]byte, len(contents)) - _, err := fd.Read(newcontent) - if err != nil { - t.Fatalf("Could not read from file %v", err) - } - err = fd.Close() - if err != nil { - t.Fatalf("Could not close file %v", err) - } - - if !bytes.Equal(contents, newcontent) { - t.Fatalf("File content mismatch expected (%v): received (%v) ", contents, newcontent) - } -} - -func isDirEmpty(name string) bool { - f, err := os.Open(name) - if err != nil { - return false - } - defer f.Close() - - _, err = f.Readdirnames(1) - - return err == io.EOF -} - -type testAPI struct { - api *api.API -} - -type testData struct { - testDir string - testUploadDir string - testMountDir string - bzzHash string - files map[string]fileInfo - toEncrypt bool - swarmfs *SwarmFS -} - -//create the root dir of a test -func (ta *testAPI) initSubtest(name string) (*testData, error) { - var err error - d := &testData{} - d.testDir, err = ioutil.TempDir(os.TempDir(), name) - if err != nil { - return nil, fmt.Errorf("Couldn't create test dir: %v", err) - } - return d, nil -} - -//upload data and mount directory -func (ta *testAPI) uploadAndMount(dat *testData, t *testing.T) (*testData, error) { - //create upload dir - err := os.MkdirAll(dat.testUploadDir, 0777) - if err != nil { - return nil, fmt.Errorf("Couldn't create upload dir: %v", err) - } - //create mount dir - err = os.MkdirAll(dat.testMountDir, 0777) - if err != nil { - return nil, fmt.Errorf("Couldn't create mount dir: %v", err) - } - //upload the file - dat.bzzHash = createTestFilesAndUploadToSwarm(t, ta.api, dat.files, dat.testUploadDir, dat.toEncrypt) - log.Debug("Created test files and uploaded to Swarm") - //mount the directory - dat.swarmfs = mountDir(t, ta.api, dat.files, dat.bzzHash, dat.testMountDir) - log.Debug("Mounted swarm fs") - return dat, nil -} - -//add a directory to the test directory tree -func addDir(root string, name string) (string, error) { - d := filepath.Join(root, name) - err := os.MkdirAll(d, 0777) - if err != nil { - return "", fmt.Errorf("Couldn't create dir inside test dir: %v", err) - } - return d, nil -} - -func (ta *testAPI) mountListAndUnmountEncrypted(t *testing.T) { - log.Debug("Starting mountListAndUnmountEncrypted test") - ta.mountListAndUnmount(t, true) - log.Debug("Test mountListAndUnmountEncrypted terminated") -} - -func (ta *testAPI) mountListAndUnmountNonEncrypted(t *testing.T) { - log.Debug("Starting mountListAndUnmountNonEncrypted test") - ta.mountListAndUnmount(t, false) - log.Debug("Test mountListAndUnmountNonEncrypted terminated") -} - -//mount a directory unmount and check the directory is empty afterwards -func (ta *testAPI) mountListAndUnmount(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("mountListAndUnmount") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "testUploadDir") - dat.testMountDir = filepath.Join(dat.testDir, "testMountDir") - dat.files = make(map[string]fileInfo) - - dat.files["1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - dat.files["2.txt"] = fileInfo{0711, 333, 444, testutil.RandomBytes(2, 10)} - dat.files["3.txt"] = fileInfo{0622, 333, 444, testutil.RandomBytes(3, 100)} - dat.files["4.txt"] = fileInfo{0533, 333, 444, testutil.RandomBytes(4, 1024)} - dat.files["5.txt"] = fileInfo{0544, 333, 444, testutil.RandomBytes(5, 10)} - dat.files["6.txt"] = fileInfo{0555, 333, 444, testutil.RandomBytes(6, 10)} - dat.files["7.txt"] = fileInfo{0666, 333, 444, testutil.RandomBytes(7, 10)} - dat.files["8.txt"] = fileInfo{0777, 333, 333, testutil.RandomBytes(8, 10)} - dat.files["11.txt"] = fileInfo{0777, 333, 444, testutil.RandomBytes(9, 10)} - dat.files["111.txt"] = fileInfo{0777, 333, 444, testutil.RandomBytes(10, 10)} - dat.files["two/2.txt"] = fileInfo{0777, 333, 444, testutil.RandomBytes(11, 10)} - dat.files["two/2/2.txt"] = fileInfo{0777, 333, 444, testutil.RandomBytes(12, 10)} - dat.files["two/2./2.txt"] = fileInfo{0777, 444, 444, testutil.RandomBytes(13, 10)} - dat.files["twice/2.txt"] = fileInfo{0777, 444, 333, testutil.RandomBytes(14, 200)} - dat.files["one/two/three/four/five/six/seven/eight/nine/10.txt"] = fileInfo{0777, 333, 444, testutil.RandomBytes(15, 10240)} - dat.files["one/two/three/four/five/six/six"] = fileInfo{0777, 333, 444, testutil.RandomBytes(16, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - // Check unmount - _, err = dat.swarmfs.Unmount(dat.testMountDir) - if err != nil { - t.Fatalf("could not unmount %v", dat.bzzHash) - } - log.Debug("Unmount successful") - if !isDirEmpty(dat.testMountDir) { - t.Fatalf("unmount didnt work for %v", dat.testMountDir) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) maxMountsEncrypted(t *testing.T) { - log.Debug("Starting maxMountsEncrypted test") - ta.runMaxMounts(t, true) - log.Debug("Test maxMountsEncrypted terminated") -} - -func (ta *testAPI) maxMountsNonEncrypted(t *testing.T) { - log.Debug("Starting maxMountsNonEncrypted test") - ta.runMaxMounts(t, false) - log.Debug("Test maxMountsNonEncrypted terminated") -} - -//mount several different directories until the maximum has been reached -func (ta *testAPI) runMaxMounts(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("runMaxMounts") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "max-upload1") - dat.testMountDir = filepath.Join(dat.testDir, "max-mount1") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - dat.testUploadDir = filepath.Join(dat.testDir, "max-upload2") - dat.testMountDir = filepath.Join(dat.testDir, "max-mount2") - dat.files["2.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - - dat.testUploadDir = filepath.Join(dat.testDir, "max-upload3") - dat.testMountDir = filepath.Join(dat.testDir, "max-mount3") - dat.files["3.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - - dat.testUploadDir = filepath.Join(dat.testDir, "max-upload4") - dat.testMountDir = filepath.Join(dat.testDir, "max-mount4") - dat.files["4.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - - dat.testUploadDir = filepath.Join(dat.testDir, "max-upload5") - dat.testMountDir = filepath.Join(dat.testDir, "max-mount5") - dat.files["5.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - - //now try an additional mount, should fail due to max mounts reached - testUploadDir6 := filepath.Join(dat.testDir, "max-upload6") - err = os.MkdirAll(testUploadDir6, 0777) - if err != nil { - t.Fatalf("Couldn't create upload dir 6: %v", err) - } - dat.files["6.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - testMountDir6 := filepath.Join(dat.testDir, "max-mount6") - err = os.MkdirAll(testMountDir6, 0777) - if err != nil { - t.Fatalf("Couldn't create mount dir 5: %v", err) - } - bzzHash6 := createTestFilesAndUploadToSwarm(t, ta.api, dat.files, testUploadDir6, toEncrypt) - log.Debug("Created test files and uploaded to swarm with uploadDir6") - _, err = dat.swarmfs.Mount(bzzHash6, testMountDir6) - if err == nil { - t.Fatalf("Expected this mount to fail due to exceeding max number of allowed mounts, but succeeded. %v", bzzHash6) - } - log.Debug("Maximum mount reached, additional mount failed. Correct.") -} - -func (ta *testAPI) remountEncrypted(t *testing.T) { - log.Debug("Starting remountEncrypted test") - ta.remount(t, true) - log.Debug("Test remountEncrypted terminated") -} -func (ta *testAPI) remountNonEncrypted(t *testing.T) { - log.Debug("Starting remountNonEncrypted test") - ta.remount(t, false) - log.Debug("Test remountNonEncrypted terminated") -} - -//test remounting same hash second time and different hash in already mounted point -func (ta *testAPI) remount(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("remount") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "remount-upload1") - dat.testMountDir = filepath.Join(dat.testDir, "remount-mount1") - dat.files = make(map[string]fileInfo) - - dat.files["1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // try mounting the same hash second time - testMountDir2, err2 := addDir(dat.testDir, "remount-mount2") - if err2 != nil { - t.Fatalf("Error creating second mount dir: %v", err2) - } - _, err2 = dat.swarmfs.Mount(dat.bzzHash, testMountDir2) - if err2 != nil { - t.Fatalf("Error mounting hash second time on different dir %v", dat.bzzHash) - } - - // mount a different hash in already mounted point - dat.files["2.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - testUploadDir2, err3 := addDir(dat.testDir, "remount-upload2") - if err3 != nil { - t.Fatalf("Error creating second upload dir: %v", err3) - } - bzzHash2 := createTestFilesAndUploadToSwarm(t, ta.api, dat.files, testUploadDir2, toEncrypt) - _, err = swarmfs.Mount(bzzHash2, dat.testMountDir) - if err == nil { - t.Fatalf("Error mounting hash %v", bzzHash2) - } - log.Debug("Mount on existing mount point failed. Correct.") - - // mount nonexistent hash - failDir, err3 := addDir(dat.testDir, "remount-fail") - if err3 != nil { - t.Fatalf("Error creating remount dir: %v", bzzHash2) - } - failHash := "0xfea11223344" - _, err = swarmfs.Mount(failHash, failDir) - if err == nil { - t.Fatalf("Expected this mount to fail due to non existing hash. But succeeded %v", failHash) - } - log.Debug("Nonexistent hash hasn't been mounted. Correct.") -} - -func (ta *testAPI) unmountEncrypted(t *testing.T) { - log.Debug("Starting unmountEncrypted test") - ta.unmount(t, true) - log.Debug("Test unmountEncrypted terminated") -} - -func (ta *testAPI) unmountNonEncrypted(t *testing.T) { - log.Debug("Starting unmountNonEncrypted test") - ta.unmount(t, false) - log.Debug("Test unmountNonEncrypted terminated") -} - -//mount then unmount and check that it has been unmounted -func (ta *testAPI) unmount(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("unmount") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "ex-upload1") - dat.testMountDir = filepath.Join(dat.testDir, "ex-mount1") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - _, err = dat.swarmfs.Unmount(dat.testMountDir) - if err != nil { - t.Fatalf("could not unmount %v", dat.bzzHash) - } - log.Debug("Unmounted Dir") - - mi := swarmfs.Listmounts() - log.Debug("Going to list mounts") - for _, minfo := range mi { - log.Debug("Mount point in list: ", "point", minfo.MountPoint) - if minfo.MountPoint == dat.testMountDir { - t.Fatalf("mount state not cleaned up in unmount case %v", dat.testMountDir) - } - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) unmountWhenResourceBusyEncrypted(t *testing.T) { - log.Debug("Starting unmountWhenResourceBusyEncrypted test") - ta.unmountWhenResourceBusy(t, true) - log.Debug("Test unmountWhenResourceBusyEncrypted terminated") -} -func (ta *testAPI) unmountWhenResourceBusyNonEncrypted(t *testing.T) { - log.Debug("Starting unmountWhenResourceBusyNonEncrypted test") - ta.unmountWhenResourceBusy(t, false) - log.Debug("Test unmountWhenResourceBusyNonEncrypted terminated") -} - -//unmount while a resource is busy; should fail -func (ta *testAPI) unmountWhenResourceBusy(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("unmountWhenResourceBusy") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "ex-upload1") - dat.testMountDir = filepath.Join(dat.testDir, "ex-mount1") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - //create a file in the mounted directory, then try to unmount - should fail - actualPath := filepath.Join(dat.testMountDir, "2.txt") - //d, err := os.OpenFile(actualPath, os.O_RDWR, os.FileMode(0700)) - d, err := os.Create(actualPath) - if err != nil { - t.Fatalf("Couldn't create new file: %v", err) - } - //we need to manually close the file before mount for this test - //but let's defer too in case of errors - defer d.Close() - _, err = d.Write(testutil.RandomBytes(1, 10)) - if err != nil { - t.Fatalf("Couldn't write to file: %v", err) - } - log.Debug("Bytes written") - - _, err = dat.swarmfs.Unmount(dat.testMountDir) - if err == nil { - t.Fatalf("Expected mount to fail due to resource busy, but it succeeded...") - } - //free resources - err = d.Close() - if err != nil { - t.Fatalf("Couldn't close file! %v", dat.bzzHash) - } - log.Debug("File closed") - - //now unmount after explicitly closed file - _, err = dat.swarmfs.Unmount(dat.testMountDir) - if err != nil { - t.Fatalf("Expected mount to succeed after freeing resource, but it failed: %v", err) - } - //check if the dir is still mounted - mi := dat.swarmfs.Listmounts() - log.Debug("Going to list mounts") - for _, minfo := range mi { - log.Debug("Mount point in list: ", "point", minfo.MountPoint) - if minfo.MountPoint == dat.testMountDir { - t.Fatalf("mount state not cleaned up in unmount case %v", dat.testMountDir) - } - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) seekInMultiChunkFileEncrypted(t *testing.T) { - log.Debug("Starting seekInMultiChunkFileEncrypted test") - ta.seekInMultiChunkFile(t, true) - log.Debug("Test seekInMultiChunkFileEncrypted terminated") -} - -func (ta *testAPI) seekInMultiChunkFileNonEncrypted(t *testing.T) { - log.Debug("Starting seekInMultiChunkFileNonEncrypted test") - ta.seekInMultiChunkFile(t, false) - log.Debug("Test seekInMultiChunkFileNonEncrypted terminated") -} - -//open a file in a mounted dir and go to a certain position -func (ta *testAPI) seekInMultiChunkFile(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("seekInMultiChunkFile") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "seek-upload1") - dat.testMountDir = filepath.Join(dat.testDir, "seek-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10240)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Open the file in the mounted dir and seek the second chunk - actualPath := filepath.Join(dat.testMountDir, "1.txt") - d, err := os.OpenFile(actualPath, os.O_RDONLY, os.FileMode(0700)) - if err != nil { - t.Fatalf("Couldn't open file: %v", err) - } - log.Debug("Opened file") - defer func() { - err := d.Close() - if err != nil { - t.Fatalf("Error closing file! %v", err) - } - }() - - _, err = d.Seek(5000, 0) - if err != nil { - t.Fatalf("Error seeking in file: %v", err) - } - - contents := make([]byte, 1024) - _, err = d.Read(contents) - if err != nil { - t.Fatalf("Error reading file: %v", err) - } - log.Debug("Read contents") - finfo := dat.files["1.txt"] - - if !bytes.Equal(finfo.contents[:6024][5000:], contents) { - t.Fatalf("File seek contents mismatch") - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) createNewFileEncrypted(t *testing.T) { - log.Debug("Starting createNewFileEncrypted test") - ta.createNewFile(t, true) - log.Debug("Test createNewFileEncrypted terminated") -} - -func (ta *testAPI) createNewFileNonEncrypted(t *testing.T) { - log.Debug("Starting createNewFileNonEncrypted test") - ta.createNewFile(t, false) - log.Debug("Test createNewFileNonEncrypted terminated") -} - -//create a new file in a mounted swarm directory, -//unmount the fuse dir and then remount to see if new file is still there -func (ta *testAPI) createNewFile(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("createNewFile") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "create-upload1") - dat.testMountDir = filepath.Join(dat.testDir, "create-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - dat.files["five.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(2, 10)} - dat.files["six.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(3, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Create a new file in the root dir and check - actualPath := filepath.Join(dat.testMountDir, "2.txt") - d, err1 := os.OpenFile(actualPath, os.O_RDWR|os.O_CREATE, os.FileMode(0665)) - if err1 != nil { - t.Fatalf("Could not open file %s : %v", actualPath, err1) - } - defer d.Close() - log.Debug("Opened file") - contents := testutil.RandomBytes(1, 11) - log.Debug("content read") - _, err = d.Write(contents) - if err != nil { - t.Fatalf("Couldn't write contents: %v", err) - } - log.Debug("content written") - err = d.Close() - if err != nil { - t.Fatalf("Couldn't close file: %v", err) - } - log.Debug("file closed") - - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("Directory unmounted") - - testMountDir2, err3 := addDir(dat.testDir, "create-mount2") - if err3 != nil { - t.Fatalf("Error creating mount dir2: %v", err3) - } - // mount again and see if things are okay - dat.files["2.txt"] = fileInfo{0700, 333, 444, contents} - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, testMountDir2) - log.Debug("Directory mounted again") - - checkFile(t, testMountDir2, "2.txt", contents) - _, err2 = dat.swarmfs.Unmount(testMountDir2) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) createNewFileInsideDirectoryEncrypted(t *testing.T) { - log.Debug("Starting createNewFileInsideDirectoryEncrypted test") - ta.createNewFileInsideDirectory(t, true) - log.Debug("Test createNewFileInsideDirectoryEncrypted terminated") -} - -func (ta *testAPI) createNewFileInsideDirectoryNonEncrypted(t *testing.T) { - log.Debug("Starting createNewFileInsideDirectoryNonEncrypted test") - ta.createNewFileInsideDirectory(t, false) - log.Debug("Test createNewFileInsideDirectoryNonEncrypted terminated") -} - -//create a new file inside a directory inside the mount -func (ta *testAPI) createNewFileInsideDirectory(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("createNewFileInsideDirectory") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "createinsidedir-upload") - dat.testMountDir = filepath.Join(dat.testDir, "createinsidedir-mount") - dat.files = make(map[string]fileInfo) - dat.files["one/1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Create a new file inside a existing dir and check - dirToCreate := filepath.Join(dat.testMountDir, "one") - actualPath := filepath.Join(dirToCreate, "2.txt") - d, err1 := os.OpenFile(actualPath, os.O_RDWR|os.O_CREATE, os.FileMode(0665)) - if err1 != nil { - t.Fatalf("Could not create file %s : %v", actualPath, err1) - } - defer d.Close() - log.Debug("File opened") - contents := testutil.RandomBytes(1, 11) - log.Debug("Content read") - _, err = d.Write(contents) - if err != nil { - t.Fatalf("Error writing random bytes into file %v", err) - } - log.Debug("Content written") - err = d.Close() - if err != nil { - t.Fatalf("Error closing file %v", err) - } - log.Debug("File closed") - - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("Directory unmounted") - - testMountDir2, err3 := addDir(dat.testDir, "createinsidedir-mount2") - if err3 != nil { - t.Fatalf("Error creating mount dir2: %v", err3) - } - // mount again and see if things are okay - dat.files["one/2.txt"] = fileInfo{0700, 333, 444, contents} - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, testMountDir2) - log.Debug("Directory mounted again") - - checkFile(t, testMountDir2, "one/2.txt", contents) - _, err = dat.swarmfs.Unmount(testMountDir2) - if err != nil { - t.Fatalf("could not unmount %v", dat.bzzHash) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) createNewFileInsideNewDirectoryEncrypted(t *testing.T) { - log.Debug("Starting createNewFileInsideNewDirectoryEncrypted test") - ta.createNewFileInsideNewDirectory(t, true) - log.Debug("Test createNewFileInsideNewDirectoryEncrypted terminated") -} - -func (ta *testAPI) createNewFileInsideNewDirectoryNonEncrypted(t *testing.T) { - log.Debug("Starting createNewFileInsideNewDirectoryNonEncrypted test") - ta.createNewFileInsideNewDirectory(t, false) - log.Debug("Test createNewFileInsideNewDirectoryNonEncrypted terminated") -} - -//create a new directory in mount and a new file -func (ta *testAPI) createNewFileInsideNewDirectory(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("createNewFileInsideNewDirectory") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "createinsidenewdir-upload") - dat.testMountDir = filepath.Join(dat.testDir, "createinsidenewdir-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Create a new file inside a existing dir and check - dirToCreate, err2 := addDir(dat.testMountDir, "one") - if err2 != nil { - t.Fatalf("Error creating mount dir2: %v", err2) - } - actualPath := filepath.Join(dirToCreate, "2.txt") - d, err1 := os.OpenFile(actualPath, os.O_RDWR|os.O_CREATE, os.FileMode(0665)) - if err1 != nil { - t.Fatalf("Could not create file %s : %v", actualPath, err1) - } - defer d.Close() - log.Debug("File opened") - contents := testutil.RandomBytes(1, 11) - log.Debug("content read") - _, err = d.Write(contents) - if err != nil { - t.Fatalf("Error writing to file: %v", err) - } - log.Debug("content written") - err = d.Close() - if err != nil { - t.Fatalf("Error closing file: %v", err) - } - log.Debug("File closed") - - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("Directory unmounted") - - // mount again and see if things are okay - dat.files["one/2.txt"] = fileInfo{0700, 333, 444, contents} - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, dat.testMountDir) - log.Debug("Directory mounted again") - - checkFile(t, dat.testMountDir, "one/2.txt", contents) - _, err2 = dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) removeExistingFileEncrypted(t *testing.T) { - log.Debug("Starting removeExistingFileEncrypted test") - ta.removeExistingFile(t, true) - log.Debug("Test removeExistingFileEncrypted terminated") -} - -func (ta *testAPI) removeExistingFileNonEncrypted(t *testing.T) { - log.Debug("Starting removeExistingFileNonEncrypted test") - ta.removeExistingFile(t, false) - log.Debug("Test removeExistingFileNonEncrypted terminated") -} - -//remove existing file in mount -func (ta *testAPI) removeExistingFile(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("removeExistingFile") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "remove-upload") - dat.testMountDir = filepath.Join(dat.testDir, "remove-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - dat.files["five.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(2, 10)} - dat.files["six.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(3, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Remove a file in the root dir and check - actualPath := filepath.Join(dat.testMountDir, "five.txt") - err = os.Remove(actualPath) - if err != nil { - t.Fatalf("Error removing file! %v", err) - } - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("Directory unmounted") - - // mount again and see if things are okay - delete(dat.files, "five.txt") - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, dat.testMountDir) - _, err = os.Stat(actualPath) - if err == nil { - t.Fatal("Expected file to not be present in re-mount after removal, but it is there") - } - _, err2 = dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) removeExistingFileInsideDirEncrypted(t *testing.T) { - log.Debug("Starting removeExistingFileInsideDirEncrypted test") - ta.removeExistingFileInsideDir(t, true) - log.Debug("Test removeExistingFileInsideDirEncrypted terminated") -} - -func (ta *testAPI) removeExistingFileInsideDirNonEncrypted(t *testing.T) { - log.Debug("Starting removeExistingFileInsideDirNonEncrypted test") - ta.removeExistingFileInsideDir(t, false) - log.Debug("Test removeExistingFileInsideDirNonEncrypted terminated") -} - -//remove a file inside a directory inside a mount -func (ta *testAPI) removeExistingFileInsideDir(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("removeExistingFileInsideDir") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "remove-upload") - dat.testMountDir = filepath.Join(dat.testDir, "remove-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - dat.files["one/five.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(2, 10)} - dat.files["one/six.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(3, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Remove a file in the root dir and check - actualPath := filepath.Join(dat.testMountDir, "one") - actualPath = filepath.Join(actualPath, "five.txt") - err = os.Remove(actualPath) - if err != nil { - t.Fatalf("Error removing file! %v", err) - } - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("Directory unmounted") - - // mount again and see if things are okay - delete(dat.files, "one/five.txt") - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, dat.testMountDir) - _, err = os.Stat(actualPath) - if err == nil { - t.Fatal("Expected file to not be present in re-mount after removal, but it is there") - } - - okPath := filepath.Join(dat.testMountDir, "one") - okPath = filepath.Join(okPath, "six.txt") - _, err = os.Stat(okPath) - if err != nil { - t.Fatal("Expected file to be present in re-mount after removal, but it is not there") - } - _, err2 = dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) removeNewlyAddedFileEncrypted(t *testing.T) { - log.Debug("Starting removeNewlyAddedFileEncrypted test") - ta.removeNewlyAddedFile(t, true) - log.Debug("Test removeNewlyAddedFileEncrypted terminated") -} - -func (ta *testAPI) removeNewlyAddedFileNonEncrypted(t *testing.T) { - log.Debug("Starting removeNewlyAddedFileNonEncrypted test") - ta.removeNewlyAddedFile(t, false) - log.Debug("Test removeNewlyAddedFileNonEncrypted terminated") -} - -//add a file in mount and then remove it; on remount file should not be there -func (ta *testAPI) removeNewlyAddedFile(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("removeNewlyAddedFile") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "removenew-upload") - dat.testMountDir = filepath.Join(dat.testDir, "removenew-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - dat.files["five.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(2, 10)} - dat.files["six.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(3, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Add a a new file and remove it - dirToCreate := filepath.Join(dat.testMountDir, "one") - err = os.MkdirAll(dirToCreate, os.FileMode(0665)) - if err != nil { - t.Fatalf("Error creating dir in mounted dir: %v", err) - } - actualPath := filepath.Join(dirToCreate, "2.txt") - d, err1 := os.OpenFile(actualPath, os.O_RDWR|os.O_CREATE, os.FileMode(0665)) - if err1 != nil { - t.Fatalf("Could not create file %s : %v", actualPath, err1) - } - defer d.Close() - log.Debug("file opened") - contents := testutil.RandomBytes(1, 11) - log.Debug("content read") - _, err = d.Write(contents) - if err != nil { - t.Fatalf("Error writing random bytes to file: %v", err) - } - log.Debug("content written") - err = d.Close() - if err != nil { - t.Fatalf("Error closing file: %v", err) - } - log.Debug("file closed") - - checkFile(t, dat.testMountDir, "one/2.txt", contents) - log.Debug("file checked") - - err = os.Remove(actualPath) - if err != nil { - t.Fatalf("Error removing file: %v", err) - } - log.Debug("file removed") - - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("Directory unmounted") - - testMountDir2, err3 := addDir(dat.testDir, "removenew-mount2") - if err3 != nil { - t.Fatalf("Error creating mount dir2: %v", err3) - } - // mount again and see if things are okay - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, testMountDir2) - log.Debug("Directory mounted again") - - if dat.bzzHash != mi.LatestManifest { - t.Fatalf("same contents different hash orig(%v): new(%v)", dat.bzzHash, mi.LatestManifest) - } - _, err2 = dat.swarmfs.Unmount(testMountDir2) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) addNewFileAndModifyContentsEncrypted(t *testing.T) { - log.Debug("Starting addNewFileAndModifyContentsEncrypted test") - ta.addNewFileAndModifyContents(t, true) - log.Debug("Test addNewFileAndModifyContentsEncrypted terminated") -} - -func (ta *testAPI) addNewFileAndModifyContentsNonEncrypted(t *testing.T) { - log.Debug("Starting addNewFileAndModifyContentsNonEncrypted test") - ta.addNewFileAndModifyContents(t, false) - log.Debug("Test addNewFileAndModifyContentsNonEncrypted terminated") -} - -//add a new file and modify content; remount and check the modified file is intact -func (ta *testAPI) addNewFileAndModifyContents(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("addNewFileAndModifyContents") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "modifyfile-upload") - dat.testMountDir = filepath.Join(dat.testDir, "modifyfile-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - dat.files["five.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(2, 10)} - dat.files["six.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(3, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - // Create a new file in the root dir - actualPath := filepath.Join(dat.testMountDir, "2.txt") - d, err1 := os.OpenFile(actualPath, os.O_RDWR|os.O_CREATE, os.FileMode(0665)) - if err1 != nil { - t.Fatalf("Could not create file %s : %v", actualPath, err1) - } - defer d.Close() - //write some random data into the file - log.Debug("file opened") - line1 := []byte("Line 1") - _, err = rand.Read(line1) - if err != nil { - t.Fatalf("Error writing random bytes to byte array: %v", err) - } - log.Debug("line read") - _, err = d.Write(line1) - if err != nil { - t.Fatalf("Error writing random bytes to file: %v", err) - } - log.Debug("line written") - err = d.Close() - if err != nil { - t.Fatalf("Error closing file: %v", err) - } - log.Debug("file closed") - - //unmount the hash on the mounted dir - mi1, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - log.Debug("Directory unmounted") - - //mount on a different dir to see if modified file is correct - testMountDir2, err3 := addDir(dat.testDir, "modifyfile-mount2") - if err3 != nil { - t.Fatalf("Error creating mount dir2: %v", err3) - } - dat.files["2.txt"] = fileInfo{0700, 333, 444, line1} - _ = mountDir(t, ta.api, dat.files, mi1.LatestManifest, testMountDir2) - log.Debug("Directory mounted again") - - checkFile(t, testMountDir2, "2.txt", line1) - log.Debug("file checked") - - //unmount second dir - mi2, err4 := dat.swarmfs.Unmount(testMountDir2) - if err4 != nil { - t.Fatalf("Could not unmount %v", err4) - } - log.Debug("Directory unmounted again") - - //mount again on original dir and modify the file - //let's clean up the mounted dir first: remove... - err = os.RemoveAll(dat.testMountDir) - if err != nil { - t.Fatalf("Error cleaning up mount dir: %v", err) - } - //...and re-create - err = os.MkdirAll(dat.testMountDir, 0777) - if err != nil { - t.Fatalf("Error re-creating mount dir: %v", err) - } - //now remount - _ = mountDir(t, ta.api, dat.files, mi2.LatestManifest, dat.testMountDir) - log.Debug("Directory mounted yet again") - - //open the file.... - fd, err5 := os.OpenFile(actualPath, os.O_RDWR|os.O_APPEND, os.FileMode(0665)) - if err5 != nil { - t.Fatalf("Could not create file %s : %v", actualPath, err5) - } - defer fd.Close() - log.Debug("file opened") - //...and modify something - line2 := []byte("Line 2") - _, err = rand.Read(line2) - if err != nil { - t.Fatalf("Error modifying random bytes to byte array: %v", err) - } - log.Debug("line read") - _, err = fd.Seek(int64(len(line1)), 0) - if err != nil { - t.Fatalf("Error seeking position for modification: %v", err) - } - _, err = fd.Write(line2) - if err != nil { - t.Fatalf("Error modifying file: %v", err) - } - log.Debug("line written") - err = fd.Close() - if err != nil { - t.Fatalf("Error closing modified file; %v", err) - } - log.Debug("file closed") - - //unmount the modified directory - mi3, err6 := dat.swarmfs.Unmount(dat.testMountDir) - if err6 != nil { - t.Fatalf("Could not unmount %v", err6) - } - log.Debug("Directory unmounted yet again") - - //now remount on a different dir and check that the modified file is ok - testMountDir4, err7 := addDir(dat.testDir, "modifyfile-mount4") - if err7 != nil { - t.Fatalf("Could not unmount %v", err7) - } - b := [][]byte{line1, line2} - line1and2 := bytes.Join(b, []byte("")) - dat.files["2.txt"] = fileInfo{0700, 333, 444, line1and2} - _ = mountDir(t, ta.api, dat.files, mi3.LatestManifest, testMountDir4) - log.Debug("Directory mounted final time") - - checkFile(t, testMountDir4, "2.txt", line1and2) - _, err = dat.swarmfs.Unmount(testMountDir4) - if err != nil { - t.Fatalf("Could not unmount %v", err) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) removeEmptyDirEncrypted(t *testing.T) { - log.Debug("Starting removeEmptyDirEncrypted test") - ta.removeEmptyDir(t, true) - log.Debug("Test removeEmptyDirEncrypted terminated") -} - -func (ta *testAPI) removeEmptyDirNonEncrypted(t *testing.T) { - log.Debug("Starting removeEmptyDirNonEncrypted test") - ta.removeEmptyDir(t, false) - log.Debug("Test removeEmptyDirNonEncrypted terminated") -} - -//remove an empty dir inside mount -func (ta *testAPI) removeEmptyDir(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("removeEmptyDir") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "rmdir-upload") - dat.testMountDir = filepath.Join(dat.testDir, "rmdir-mount") - dat.files = make(map[string]fileInfo) - dat.files["1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - dat.files["five.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(2, 10)} - dat.files["six.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(3, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - _, err2 := addDir(dat.testMountDir, "newdir") - if err2 != nil { - t.Fatalf("Could not unmount %v", err2) - } - mi, err := dat.swarmfs.Unmount(dat.testMountDir) - if err != nil { - t.Fatalf("Could not unmount %v", err) - } - log.Debug("Directory unmounted") - //by just adding an empty dir, the hash doesn't change; test this - if dat.bzzHash != mi.LatestManifest { - t.Fatalf("same contents different hash orig(%v): new(%v)", dat.bzzHash, mi.LatestManifest) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) removeDirWhichHasFilesEncrypted(t *testing.T) { - log.Debug("Starting removeDirWhichHasFilesEncrypted test") - ta.removeDirWhichHasFiles(t, true) - log.Debug("Test removeDirWhichHasFilesEncrypted terminated") -} -func (ta *testAPI) removeDirWhichHasFilesNonEncrypted(t *testing.T) { - log.Debug("Starting removeDirWhichHasFilesNonEncrypted test") - ta.removeDirWhichHasFiles(t, false) - log.Debug("Test removeDirWhichHasFilesNonEncrypted terminated") -} - -//remove a directory with a file; check on remount file isn't there -func (ta *testAPI) removeDirWhichHasFiles(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("removeDirWhichHasFiles") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "rmdir-upload") - dat.testMountDir = filepath.Join(dat.testDir, "rmdir-mount") - dat.files = make(map[string]fileInfo) - dat.files["one/1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - dat.files["two/five.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(2, 10)} - dat.files["two/six.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(3, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - //delete a directory inside the mounted dir with all its files - dirPath := filepath.Join(dat.testMountDir, "two") - err = os.RemoveAll(dirPath) - if err != nil { - t.Fatalf("Error removing directory in mounted dir: %v", err) - } - - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v ", err2) - } - log.Debug("Directory unmounted") - - //we deleted files in the OS, so let's delete them also in the files map - delete(dat.files, "two/five.txt") - delete(dat.files, "two/six.txt") - - // mount again and see if deleted files have been deleted indeed - testMountDir2, err3 := addDir(dat.testDir, "remount-mount2") - if err3 != nil { - t.Fatalf("Could not unmount %v", err3) - } - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, testMountDir2) - log.Debug("Directory mounted") - actualPath := filepath.Join(dirPath, "five.txt") - _, err = os.Stat(actualPath) - if err == nil { - t.Fatal("Expected file to not be present in re-mount after removal, but it is there") - } - _, err = os.Stat(dirPath) - if err == nil { - t.Fatal("Expected file to not be present in re-mount after removal, but it is there") - } - _, err = dat.swarmfs.Unmount(testMountDir2) - if err != nil { - t.Fatalf("Could not unmount %v", err) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) removeDirWhichHasSubDirsEncrypted(t *testing.T) { - log.Debug("Starting removeDirWhichHasSubDirsEncrypted test") - ta.removeDirWhichHasSubDirs(t, true) - log.Debug("Test removeDirWhichHasSubDirsEncrypted terminated") -} - -func (ta *testAPI) removeDirWhichHasSubDirsNonEncrypted(t *testing.T) { - log.Debug("Starting removeDirWhichHasSubDirsNonEncrypted test") - ta.removeDirWhichHasSubDirs(t, false) - log.Debug("Test removeDirWhichHasSubDirsNonEncrypted terminated") -} - -//remove a directory with subdirectories inside mount; on remount check they are not there -func (ta *testAPI) removeDirWhichHasSubDirs(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("removeDirWhichHasSubDirs") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "rmsubdir-upload") - dat.testMountDir = filepath.Join(dat.testDir, "rmsubdir-mount") - dat.files = make(map[string]fileInfo) - dat.files["one/1.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(1, 10)} - dat.files["two/three/2.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(2, 10)} - dat.files["two/three/3.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(3, 10)} - dat.files["two/four/5.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(4, 10)} - dat.files["two/four/6.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(5, 10)} - dat.files["two/four/six/7.txt"] = fileInfo{0700, 333, 444, testutil.RandomBytes(6, 10)} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - dirPath := filepath.Join(dat.testMountDir, "two") - err = os.RemoveAll(dirPath) - if err != nil { - t.Fatalf("Error removing directory in mounted dir: %v", err) - } - - //delete a directory inside the mounted dir with all its files - mi, err2 := dat.swarmfs.Unmount(dat.testMountDir) - if err2 != nil { - t.Fatalf("Could not unmount %v ", err2) - } - log.Debug("Directory unmounted") - - //we deleted files in the OS, so let's delete them also in the files map - delete(dat.files, "two/three/2.txt") - delete(dat.files, "two/three/3.txt") - delete(dat.files, "two/four/5.txt") - delete(dat.files, "two/four/6.txt") - delete(dat.files, "two/four/six/7.txt") - - // mount again and see if things are okay - testMountDir2, err3 := addDir(dat.testDir, "remount-mount2") - if err3 != nil { - t.Fatalf("Could not unmount %v", err3) - } - _ = mountDir(t, ta.api, dat.files, mi.LatestManifest, testMountDir2) - log.Debug("Directory mounted again") - actualPath := filepath.Join(dirPath, "three") - actualPath = filepath.Join(actualPath, "2.txt") - _, err = os.Stat(actualPath) - if err == nil { - t.Fatal("Expected file to not be present in re-mount after removal, but it is there") - } - actualPath = filepath.Join(dirPath, "four") - _, err = os.Stat(actualPath) - if err == nil { - t.Fatal("Expected file to not be present in re-mount after removal, but it is there") - } - _, err = os.Stat(dirPath) - if err == nil { - t.Fatal("Expected file to not be present in re-mount after removal, but it is there") - } - _, err = dat.swarmfs.Unmount(testMountDir2) - if err != nil { - t.Fatalf("Could not unmount %v", err) - } - log.Debug("subtest terminated") -} - -func (ta *testAPI) appendFileContentsToEndEncrypted(t *testing.T) { - log.Debug("Starting appendFileContentsToEndEncrypted test") - ta.appendFileContentsToEnd(t, true) - log.Debug("Test appendFileContentsToEndEncrypted terminated") -} - -func (ta *testAPI) appendFileContentsToEndNonEncrypted(t *testing.T) { - log.Debug("Starting appendFileContentsToEndNonEncrypted test") - ta.appendFileContentsToEnd(t, false) - log.Debug("Test appendFileContentsToEndNonEncrypted terminated") -} - -//append contents to the end of a file; remount and check it's intact -func (ta *testAPI) appendFileContentsToEnd(t *testing.T, toEncrypt bool) { - dat, err := ta.initSubtest("appendFileContentsToEnd") - if err != nil { - t.Fatalf("Couldn't initialize subtest dirs: %v", err) - } - defer os.RemoveAll(dat.testDir) - - dat.toEncrypt = toEncrypt - dat.testUploadDir = filepath.Join(dat.testDir, "appendlargefile-upload") - dat.testMountDir = filepath.Join(dat.testDir, "appendlargefile-mount") - dat.files = make(map[string]fileInfo) - - line1 := testutil.RandomBytes(1, 10) - - dat.files["1.txt"] = fileInfo{0700, 333, 444, line1} - - dat, err = ta.uploadAndMount(dat, t) - if err != nil { - t.Fatalf("Error during upload of files to swarm / mount of swarm dir: %v", err) - } - defer dat.swarmfs.Stop() - - actualPath := filepath.Join(dat.testMountDir, "1.txt") - fd, err4 := os.OpenFile(actualPath, os.O_RDWR|os.O_APPEND, os.FileMode(0665)) - if err4 != nil { - t.Fatalf("Could not create file %s : %v", actualPath, err4) - } - defer fd.Close() - log.Debug("file opened") - line2 := testutil.RandomBytes(1, 5) - log.Debug("line read") - _, err = fd.Seek(int64(len(line1)), 0) - if err != nil { - t.Fatalf("Error searching for position to append: %v", err) - } - _, err = fd.Write(line2) - if err != nil { - t.Fatalf("Error appending: %v", err) - } - log.Debug("line written") - err = fd.Close() - if err != nil { - t.Fatalf("Error closing file: %v", err) - } - log.Debug("file closed") - - mi1, err5 := dat.swarmfs.Unmount(dat.testMountDir) - if err5 != nil { - t.Fatalf("Could not unmount %v ", err5) - } - log.Debug("Directory unmounted") - - // mount again and see if appended file is correct - b := [][]byte{line1, line2} - line1and2 := bytes.Join(b, []byte("")) - dat.files["1.txt"] = fileInfo{0700, 333, 444, line1and2} - testMountDir2, err6 := addDir(dat.testDir, "remount-mount2") - if err6 != nil { - t.Fatalf("Could not unmount %v", err6) - } - _ = mountDir(t, ta.api, dat.files, mi1.LatestManifest, testMountDir2) - log.Debug("Directory mounted") - - checkFile(t, testMountDir2, "1.txt", line1and2) - - _, err = dat.swarmfs.Unmount(testMountDir2) - if err != nil { - t.Fatalf("Could not unmount %v", err) - } - log.Debug("subtest terminated") -} - -//run all the tests -func TestFUSE(t *testing.T) { - t.Skip("disable fuse tests until they are stable") - //create a data directory for swarm - datadir, err := ioutil.TempDir("", "fuse") - if err != nil { - t.Fatalf("unable to create temp dir: %v", err) - } - defer os.RemoveAll(datadir) - - fileStore, err := storage.NewLocalFileStore(datadir, make([]byte, 32)) - if err != nil { - t.Fatal(err) - } - ta := &testAPI{api: api.NewAPI(fileStore, nil, nil, nil)} - - //run a short suite of tests - //approx time: 28s - t.Run("mountListAndUnmountEncrypted", ta.mountListAndUnmountEncrypted) - t.Run("remountEncrypted", ta.remountEncrypted) - t.Run("unmountWhenResourceBusyNonEncrypted", ta.unmountWhenResourceBusyNonEncrypted) - t.Run("removeExistingFileEncrypted", ta.removeExistingFileEncrypted) - t.Run("addNewFileAndModifyContentsNonEncrypted", ta.addNewFileAndModifyContentsNonEncrypted) - t.Run("removeDirWhichHasFilesNonEncrypted", ta.removeDirWhichHasFilesNonEncrypted) - t.Run("appendFileContentsToEndEncrypted", ta.appendFileContentsToEndEncrypted) - - //provide longrunning flag to execute all tests - //approx time with longrunning: 140s - if *longrunning { - t.Run("mountListAndUnmountNonEncrypted", ta.mountListAndUnmountNonEncrypted) - t.Run("maxMountsEncrypted", ta.maxMountsEncrypted) - t.Run("maxMountsNonEncrypted", ta.maxMountsNonEncrypted) - t.Run("remountNonEncrypted", ta.remountNonEncrypted) - t.Run("unmountEncrypted", ta.unmountEncrypted) - t.Run("unmountNonEncrypted", ta.unmountNonEncrypted) - t.Run("unmountWhenResourceBusyEncrypted", ta.unmountWhenResourceBusyEncrypted) - t.Run("unmountWhenResourceBusyNonEncrypted", ta.unmountWhenResourceBusyNonEncrypted) - t.Run("seekInMultiChunkFileEncrypted", ta.seekInMultiChunkFileEncrypted) - t.Run("seekInMultiChunkFileNonEncrypted", ta.seekInMultiChunkFileNonEncrypted) - t.Run("createNewFileEncrypted", ta.createNewFileEncrypted) - t.Run("createNewFileNonEncrypted", ta.createNewFileNonEncrypted) - t.Run("createNewFileInsideDirectoryEncrypted", ta.createNewFileInsideDirectoryEncrypted) - t.Run("createNewFileInsideDirectoryNonEncrypted", ta.createNewFileInsideDirectoryNonEncrypted) - t.Run("createNewFileInsideNewDirectoryEncrypted", ta.createNewFileInsideNewDirectoryEncrypted) - t.Run("createNewFileInsideNewDirectoryNonEncrypted", ta.createNewFileInsideNewDirectoryNonEncrypted) - t.Run("removeExistingFileNonEncrypted", ta.removeExistingFileNonEncrypted) - t.Run("removeExistingFileInsideDirEncrypted", ta.removeExistingFileInsideDirEncrypted) - t.Run("removeExistingFileInsideDirNonEncrypted", ta.removeExistingFileInsideDirNonEncrypted) - t.Run("removeNewlyAddedFileEncrypted", ta.removeNewlyAddedFileEncrypted) - t.Run("removeNewlyAddedFileNonEncrypted", ta.removeNewlyAddedFileNonEncrypted) - t.Run("addNewFileAndModifyContentsEncrypted", ta.addNewFileAndModifyContentsEncrypted) - t.Run("removeEmptyDirEncrypted", ta.removeEmptyDirEncrypted) - t.Run("removeEmptyDirNonEncrypted", ta.removeEmptyDirNonEncrypted) - t.Run("removeDirWhichHasFilesEncrypted", ta.removeDirWhichHasFilesEncrypted) - t.Run("removeDirWhichHasSubDirsEncrypted", ta.removeDirWhichHasSubDirsEncrypted) - t.Run("removeDirWhichHasSubDirsNonEncrypted", ta.removeDirWhichHasSubDirsNonEncrypted) - t.Run("appendFileContentsToEndNonEncrypted", ta.appendFileContentsToEndNonEncrypted) - } -} - -func Upload(uploadDir, index string, a *api.API, toEncrypt bool) (hash string, err error) { - fs := api.NewFileSystem(a) - hash, err = fs.Upload(uploadDir, index, toEncrypt) - return hash, err -} diff --git a/swarm/fuse/swarmfs_unix.go b/swarm/fuse/swarmfs_unix.go deleted file mode 100644 index 6438da0d5696..000000000000 --- a/swarm/fuse/swarmfs_unix.go +++ /dev/null @@ -1,285 +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 . - -// +build linux darwin freebsd - -package fuse - -import ( - "context" - "errors" - "fmt" - "os" - "path/filepath" - "strings" - "sync" - "time" - - "bazil.org/fuse" - "bazil.org/fuse/fs" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/swarm/api" - "github.com/nebulaai/nbai-node/swarm/log" -) - -var ( - errEmptyMountPoint = errors.New("need non-empty mount point") - errNoRelativeMountPoint = errors.New("invalid path for mount point (need absolute path)") - errMaxMountCount = errors.New("max FUSE mount count reached") - errMountTimeout = errors.New("mount timeout") - errAlreadyMounted = errors.New("mount point is already serving") -) - -func isFUSEUnsupportedError(err error) bool { - if perr, ok := err.(*os.PathError); ok { - return perr.Op == "open" && perr.Path == "/dev/fuse" - } - return err == fuse.ErrOSXFUSENotFound -} - -// MountInfo contains information about every active mount -type MountInfo struct { - MountPoint string - StartManifest string - LatestManifest string - rootDir *SwarmDir - fuseConnection *fuse.Conn - swarmApi *api.API - lock *sync.RWMutex - serveClose chan struct{} -} - -func NewMountInfo(mhash, mpoint string, sapi *api.API) *MountInfo { - log.Debug("swarmfs NewMountInfo", "hash", mhash, "mount point", mpoint) - newMountInfo := &MountInfo{ - MountPoint: mpoint, - StartManifest: mhash, - LatestManifest: mhash, - rootDir: nil, - fuseConnection: nil, - swarmApi: sapi, - lock: &sync.RWMutex{}, - serveClose: make(chan struct{}), - } - return newMountInfo -} - -func (swarmfs *SwarmFS) Mount(mhash, mountpoint string) (*MountInfo, error) { - log.Info("swarmfs", "mounting hash", mhash, "mount point", mountpoint) - if mountpoint == "" { - return nil, errEmptyMountPoint - } - if !strings.HasPrefix(mountpoint, "/") { - return nil, errNoRelativeMountPoint - } - cleanedMountPoint, err := filepath.Abs(filepath.Clean(mountpoint)) - if err != nil { - return nil, err - } - log.Trace("swarmfs mount", "cleanedMountPoint", cleanedMountPoint) - - swarmfs.swarmFsLock.Lock() - defer swarmfs.swarmFsLock.Unlock() - - noOfActiveMounts := len(swarmfs.activeMounts) - log.Debug("swarmfs mount", "# active mounts", noOfActiveMounts) - if noOfActiveMounts >= maxFuseMounts { - return nil, errMaxMountCount - } - - if _, ok := swarmfs.activeMounts[cleanedMountPoint]; ok { - return nil, errAlreadyMounted - } - - log.Trace("swarmfs mount: getting manifest tree") - _, manifestEntryMap, err := swarmfs.swarmApi.BuildDirectoryTree(context.TODO(), mhash, true) - if err != nil { - return nil, err - } - - log.Trace("swarmfs mount: building mount info") - mi := NewMountInfo(mhash, cleanedMountPoint, swarmfs.swarmApi) - - dirTree := map[string]*SwarmDir{} - rootDir := NewSwarmDir("/", mi) - log.Trace("swarmfs mount", "rootDir", rootDir) - mi.rootDir = rootDir - - log.Trace("swarmfs mount: traversing manifest map") - for suffix, entry := range manifestEntryMap { - if suffix == "" { //empty suffix means that the file has no name - i.e. this is the default entry in a manifest. Since we cannot have files without a name, let us ignore this entry - log.Warn("Manifest has an empty-path (default) entry which will be ignored in FUSE mount.") - continue - } - addr := common.Hex2Bytes(entry.Hash) - fullpath := "/" + suffix - basepath := filepath.Dir(fullpath) - parentDir := rootDir - dirUntilNow := "" - paths := strings.Split(basepath, "/") - for i := range paths { - if paths[i] != "" { - thisDir := paths[i] - dirUntilNow = dirUntilNow + "/" + thisDir - - if _, ok := dirTree[dirUntilNow]; !ok { - dirTree[dirUntilNow] = NewSwarmDir(dirUntilNow, mi) - parentDir.directories = append(parentDir.directories, dirTree[dirUntilNow]) - parentDir = dirTree[dirUntilNow] - - } else { - parentDir = dirTree[dirUntilNow] - } - } - } - thisFile := NewSwarmFile(basepath, filepath.Base(fullpath), mi) - thisFile.addr = addr - - parentDir.files = append(parentDir.files, thisFile) - } - - fconn, err := fuse.Mount(cleanedMountPoint, fuse.FSName("swarmfs"), fuse.VolumeName(mhash)) - if isFUSEUnsupportedError(err) { - log.Error("swarmfs error - FUSE not installed", "mountpoint", cleanedMountPoint, "err", err) - return nil, err - } else if err != nil { - fuse.Unmount(cleanedMountPoint) - log.Error("swarmfs error mounting swarm manifest", "mountpoint", cleanedMountPoint, "err", err) - return nil, err - } - mi.fuseConnection = fconn - - serverr := make(chan error, 1) - go func() { - log.Info("swarmfs", "serving hash", mhash, "at", cleanedMountPoint) - filesys := &SwarmRoot{root: rootDir} - //start serving the actual file system; see note below - if err := fs.Serve(fconn, filesys); err != nil { - log.Warn("swarmfs could not serve the requested hash", "error", err) - serverr <- err - } - mi.serveClose <- struct{}{} - }() - - /* - IMPORTANT NOTE: the fs.Serve function is blocking; - Serve builds up the actual fuse file system by calling the - Attr functions on each SwarmFile, creating the file inodes; - specifically calling the swarm's LazySectionReader.Size() to set the file size. - - This can take some time, and it appears that if we access the fuse file system - too early, we can bring the tests to deadlock. The assumption so far is that - at this point, the fuse driver didn't finish to initialize the file system. - - Accessing files too early not only deadlocks the tests, but locks the access - of the fuse file completely, resulting in blocked resources at OS system level. - Even a simple `ls /tmp/testDir/testMountDir` could deadlock in a shell. - - Workaround so far is to wait some time to give the OS enough time to initialize - the fuse file system. During tests, this seemed to address the issue. - - HOWEVER IT SHOULD BE NOTED THAT THIS MAY ONLY BE AN EFFECT, - AND THE DEADLOCK CAUSED BY SOMETHING ELSE BLOCKING ACCESS DUE TO SOME RACE CONDITION - (caused in the bazil.org library and/or the SwarmRoot, SwarmDir and SwarmFile implementations) - */ - time.Sleep(2 * time.Second) - - timer := time.NewTimer(mountTimeout) - defer timer.Stop() - // Check if the mount process has an error to report. - select { - case <-timer.C: - log.Warn("swarmfs timed out mounting over FUSE", "mountpoint", cleanedMountPoint, "err", err) - err := fuse.Unmount(cleanedMountPoint) - if err != nil { - return nil, err - } - return nil, errMountTimeout - case err := <-serverr: - log.Warn("swarmfs error serving over FUSE", "mountpoint", cleanedMountPoint, "err", err) - err = fuse.Unmount(cleanedMountPoint) - return nil, err - - case <-fconn.Ready: - //this signals that the actual mount point from the fuse.Mount call is ready; - //it does not signal though that the file system from fs.Serve is actually fully built up - if err := fconn.MountError; err != nil { - log.Error("Mounting error from fuse driver: ", "err", err) - return nil, err - } - log.Info("swarmfs now served over FUSE", "manifest", mhash, "mountpoint", cleanedMountPoint) - } - - timer.Stop() - swarmfs.activeMounts[cleanedMountPoint] = mi - return mi, nil -} - -func (swarmfs *SwarmFS) Unmount(mountpoint string) (*MountInfo, error) { - swarmfs.swarmFsLock.Lock() - defer swarmfs.swarmFsLock.Unlock() - - cleanedMountPoint, err := filepath.Abs(filepath.Clean(mountpoint)) - if err != nil { - return nil, err - } - - mountInfo := swarmfs.activeMounts[cleanedMountPoint] - - if mountInfo == nil || mountInfo.MountPoint != cleanedMountPoint { - return nil, fmt.Errorf("swarmfs %s is not mounted", cleanedMountPoint) - } - err = fuse.Unmount(cleanedMountPoint) - if err != nil { - err1 := externalUnmount(cleanedMountPoint) - if err1 != nil { - errStr := fmt.Sprintf("swarmfs unmount error: %v", err) - log.Warn(errStr) - return nil, err1 - } - } - - err = mountInfo.fuseConnection.Close() - if err != nil { - return nil, err - } - delete(swarmfs.activeMounts, cleanedMountPoint) - - <-mountInfo.serveClose - - succString := fmt.Sprintf("swarmfs unmounting %v succeeded", cleanedMountPoint) - log.Info(succString) - - return mountInfo, nil -} - -func (swarmfs *SwarmFS) Listmounts() []*MountInfo { - swarmfs.swarmFsLock.RLock() - defer swarmfs.swarmFsLock.RUnlock() - rows := make([]*MountInfo, 0, len(swarmfs.activeMounts)) - for _, mi := range swarmfs.activeMounts { - rows = append(rows, mi) - } - return rows -} - -func (swarmfs *SwarmFS) Stop() bool { - for mp := range swarmfs.activeMounts { - mountInfo := swarmfs.activeMounts[mp] - swarmfs.Unmount(mountInfo.MountPoint) - } - return true -} diff --git a/swarm/fuse/swarmfs_util.go b/swarm/fuse/swarmfs_util.go deleted file mode 100644 index ba237a3a7809..000000000000 --- a/swarm/fuse/swarmfs_util.go +++ /dev/null @@ -1,121 +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 . - -// +build linux darwin freebsd - -package fuse - -import ( - "context" - "fmt" - "os/exec" - "runtime" - - "github.com/nebulaai/nbai-node/swarm/log" -) - -func externalUnmount(mountPoint string) error { - ctx, cancel := context.WithTimeout(context.Background(), unmountTimeout) - defer cancel() - - // Try generic umount. - if err := exec.CommandContext(ctx, "umount", mountPoint).Run(); err == nil { - return nil - } - // Try FUSE-specific commands if umount didn't work. - switch runtime.GOOS { - case "darwin": - return exec.CommandContext(ctx, "diskutil", "umount", mountPoint).Run() - case "linux": - return exec.CommandContext(ctx, "fusermount", "-u", mountPoint).Run() - default: - return fmt.Errorf("swarmfs unmount: unimplemented") - } -} - -func addFileToSwarm(sf *SwarmFile, content []byte, size int) error { - fkey, mhash, err := sf.mountInfo.swarmApi.AddFile(context.TODO(), sf.mountInfo.LatestManifest, sf.path, sf.name, content, true) - if err != nil { - return err - } - - sf.lock.Lock() - defer sf.lock.Unlock() - sf.addr = fkey - sf.fileSize = int64(size) - - sf.mountInfo.lock.Lock() - defer sf.mountInfo.lock.Unlock() - sf.mountInfo.LatestManifest = mhash - - log.Info("swarmfs added new file:", "fname", sf.name, "new Manifest hash", mhash) - return nil -} - -func removeFileFromSwarm(sf *SwarmFile) error { - mkey, err := sf.mountInfo.swarmApi.RemoveFile(context.TODO(), sf.mountInfo.LatestManifest, sf.path, sf.name, true) - if err != nil { - return err - } - - sf.mountInfo.lock.Lock() - defer sf.mountInfo.lock.Unlock() - sf.mountInfo.LatestManifest = mkey - - log.Info("swarmfs removed file:", "fname", sf.name, "new Manifest hash", mkey) - return nil -} - -func removeDirectoryFromSwarm(sd *SwarmDir) error { - if len(sd.directories) == 0 && len(sd.files) == 0 { - return nil - } - - for _, d := range sd.directories { - err := removeDirectoryFromSwarm(d) - if err != nil { - return err - } - } - - for _, f := range sd.files { - err := removeFileFromSwarm(f) - if err != nil { - return err - } - } - - return nil -} - -func appendToExistingFileInSwarm(sf *SwarmFile, content []byte, offset int64, length int64) error { - fkey, mhash, err := sf.mountInfo.swarmApi.AppendFile(context.TODO(), sf.mountInfo.LatestManifest, sf.path, sf.name, sf.fileSize, content, sf.addr, offset, length, true) - if err != nil { - return err - } - - sf.lock.Lock() - defer sf.lock.Unlock() - sf.addr = fkey - sf.fileSize = sf.fileSize + int64(len(content)) - - sf.mountInfo.lock.Lock() - defer sf.mountInfo.lock.Unlock() - sf.mountInfo.LatestManifest = mhash - - log.Info("swarmfs appended file:", "fname", sf.name, "new Manifest hash", mhash) - return nil -} diff --git a/swarm/log/log.go b/swarm/log/log.go deleted file mode 100644 index 1b578f73d5e3..000000000000 --- a/swarm/log/log.go +++ /dev/null @@ -1,48 +0,0 @@ -package log - -import ( - l "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" -) - -const ( - // CallDepth is set to 1 in order to influence to reported line number of - // the log message with 1 skipped stack frame of calling l.Output() - CallDepth = 1 -) - -// Warn is a convenient alias for log.Warn with stats -func Warn(msg string, ctx ...interface{}) { - metrics.GetOrRegisterCounter("warn", nil).Inc(1) - l.Output(msg, l.LvlWarn, CallDepth, ctx...) -} - -// Error is a convenient alias for log.Error with stats -func Error(msg string, ctx ...interface{}) { - metrics.GetOrRegisterCounter("error", nil).Inc(1) - l.Output(msg, l.LvlError, CallDepth, ctx...) -} - -// Crit is a convenient alias for log.Crit with stats -func Crit(msg string, ctx ...interface{}) { - metrics.GetOrRegisterCounter("crit", nil).Inc(1) - l.Output(msg, l.LvlCrit, CallDepth, ctx...) -} - -// Info is a convenient alias for log.Info with stats -func Info(msg string, ctx ...interface{}) { - metrics.GetOrRegisterCounter("info", nil).Inc(1) - l.Output(msg, l.LvlInfo, CallDepth, ctx...) -} - -// Debug is a convenient alias for log.Debug with stats -func Debug(msg string, ctx ...interface{}) { - metrics.GetOrRegisterCounter("debug", nil).Inc(1) - l.Output(msg, l.LvlDebug, CallDepth, ctx...) -} - -// Trace is a convenient alias for log.Trace with stats -func Trace(msg string, ctx ...interface{}) { - metrics.GetOrRegisterCounter("trace", nil).Inc(1) - l.Output(msg, l.LvlTrace, CallDepth, ctx...) -} diff --git a/swarm/metrics/flags.go b/swarm/metrics/flags.go deleted file mode 100644 index 39d4e1606c82..000000000000 --- a/swarm/metrics/flags.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2018 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 metrics - -import ( - "time" - - "github.com/nebulaai/nbai-node/cmd/utils" - gethmetrics "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/metrics/influxdb" - "github.com/nebulaai/nbai-node/swarm/log" - "gopkg.in/urfave/cli.v1" -) - -var ( - MetricsEnableInfluxDBExportFlag = cli.BoolFlag{ - Name: "metrics.influxdb.export", - Usage: "Enable metrics export/push to an external InfluxDB database", - } - MetricsInfluxDBEndpointFlag = cli.StringFlag{ - Name: "metrics.influxdb.endpoint", - Usage: "Metrics InfluxDB endpoint", - Value: "http://127.0.0.1:8086", - } - MetricsInfluxDBDatabaseFlag = cli.StringFlag{ - Name: "metrics.influxdb.database", - Usage: "Metrics InfluxDB database", - Value: "metrics", - } - MetricsInfluxDBUsernameFlag = cli.StringFlag{ - Name: "metrics.influxdb.username", - Usage: "Metrics InfluxDB username", - Value: "", - } - MetricsInfluxDBPasswordFlag = cli.StringFlag{ - Name: "metrics.influxdb.password", - Usage: "Metrics InfluxDB password", - Value: "", - } - // The `host` tag is part of every measurement sent to InfluxDB. Queries on tags are faster in InfluxDB. - // It is used so that we can group all nodes and average a measurement across all of them, but also so - // that we can select a specific node and inspect its measurements. - // https://docs.influxdata.com/influxdb/v1.4/concepts/key_concepts/#tag-key - MetricsInfluxDBHostTagFlag = cli.StringFlag{ - Name: "metrics.influxdb.host.tag", - Usage: "Metrics InfluxDB `host` tag attached to all measurements", - Value: "localhost", - } -) - -// Flags holds all command-line flags required for metrics collection. -var Flags = []cli.Flag{ - utils.MetricsEnabledFlag, - MetricsEnableInfluxDBExportFlag, - MetricsInfluxDBEndpointFlag, - MetricsInfluxDBDatabaseFlag, - MetricsInfluxDBUsernameFlag, - MetricsInfluxDBPasswordFlag, - MetricsInfluxDBHostTagFlag, -} - -func Setup(ctx *cli.Context) { - if gethmetrics.Enabled { - log.Info("Enabling swarm metrics collection") - var ( - enableExport = ctx.GlobalBool(MetricsEnableInfluxDBExportFlag.Name) - endpoint = ctx.GlobalString(MetricsInfluxDBEndpointFlag.Name) - database = ctx.GlobalString(MetricsInfluxDBDatabaseFlag.Name) - username = ctx.GlobalString(MetricsInfluxDBUsernameFlag.Name) - password = ctx.GlobalString(MetricsInfluxDBPasswordFlag.Name) - hosttag = ctx.GlobalString(MetricsInfluxDBHostTagFlag.Name) - ) - - // Start system runtime metrics collection - go gethmetrics.CollectProcessMetrics(2 * time.Second) - - if enableExport { - log.Info("Enabling swarm metrics export to InfluxDB") - go influxdb.InfluxDBWithTags(gethmetrics.DefaultRegistry, 10*time.Second, endpoint, database, username, password, "swarm.", map[string]string{ - "host": hosttag, - }) - } - } -} diff --git a/swarm/network/README.md b/swarm/network/README.md deleted file mode 100644 index 684ad0c8c017..000000000000 --- a/swarm/network/README.md +++ /dev/null @@ -1,152 +0,0 @@ -## Streaming - -Streaming is a new protocol of the swarm bzz bundle of protocols. -This protocol provides the basic logic for chunk-based data flow. -It implements simple retrieve requests and delivery using priority queue. -A data exchange stream is a directional flow of chunks between peers. -The source of datachunks is the upstream, the receiver is called the -downstream peer. Each streaming protocol defines an outgoing streamer -and an incoming streamer, the former installing on the upstream, -the latter on the downstream peer. - -Subscribe on StreamerPeer launches an incoming streamer that sends -a subscribe msg upstream. The streamer on the upstream peer -handles the subscribe msg by installing the relevant outgoing streamer -. The modules now engage in a process of upstream sending a sequence of hashes of -chunks downstream (OfferedHashesMsg). The downstream peer evaluates which hashes are needed -and get it delivered by sending back a msg (WantedHashesMsg). - -Historical syncing is supported - currently not the right abstraction -- -state kept across sessions by saving a series of intervals after their last -batch actually arrived. - -Live streaming is also supported, by starting session from the first item -after the subscription. - -Provable data exchange. In case a stream represents a swarm document's data layer -or higher level chunks, streaming up to a certain index is always provable. It saves on -sending intermediate chunks. - -Using the streamer logic, various stream types are easy to implement: - -* light node requests: - * url lookup with offset - * document download - * document upload -* syncing - * live session syncing - * historical syncing -* simple retrieve requests and deliveries -* swarm feeds streams -* receipting for finger pointing - -## Syncing - -Syncing is the process that makes sure storer nodes end up storing all and only the chunks that are requested from them. - -### Requirements - -- eventual consistency: so each chunk historical should be syncable -- since the same chunk can and will arrive from many peers, (network traffic should be -optimised, only one transfer of data per chunk) -- explicit request deliveries should be prioritised higher than recent chunks received -during the ongoing session which in turn should be higher than historical chunks. -- insured chunks should get receipted for finger pointing litigation, the receipts storage -should be organised efficiently, upstream peer should also be able to find these -receipts for a deleted chunk easily to refute their challenge. -- syncing should be resilient to cut connections, metadata should be persisted that -keep track of syncing state across sessions, historical syncing state should survive restart -- extra data structures to support syncing should be kept at minimum -- syncing is not organized separately for chunk types (Swarm feed updates v regular content chunk) -- various types of streams should have common logic abstracted - -Syncing is now entirely mediated by the localstore, ie., no processes or memory leaks due to network contention. -When a new chunk is stored, its chunk hash is index by proximity bin - -peers syncronise by getting the chunks closer to the downstream peer than to the upstream one. -Consequently peers just sync all stored items for the kad bin the receiving peer falls into. -The special case of nearest neighbour sets is handled by the downstream peer -indicating they want to sync all kademlia bins with proximity equal to or higher -than their depth. - -This sync state represents the initial state of a sync connection session. -Retrieval is dictated by downstream peers simply using a special streamer protocol. - -Syncing chunks created during the session by the upstream peer is called live session syncing -while syncing of earlier chunks is historical syncing. - -Once the relevant chunk is retrieved, downstream peer looks up all hash segments in its localstore -and sends to the upstream peer a message with a a bitvector to indicate -missing chunks (e.g., for chunk `k`, hash with chunk internal index which case ) -new items. In turn upstream peer sends the relevant chunk data alongside their index. - -On sending chunks there is a priority queue system. If during looking up hashes in its localstore, -downstream peer hits on an open request then a retrieve request is sent immediately to the upstream peer indicating -that no extra round of checks is needed. If another peers syncer hits the same open request, it is slightly unsafe to not ask -that peer too: if the first one disconnects before delivering or fails to deliver and therefore gets -disconnected, we should still be able to continue with the other. The minimum redundant traffic coming from such simultaneous -eventualities should be sufficiently rare not to warrant more complex treatment. - -Session syncing involves downstream peer to request a new state on a bin from upstream. -using the new state, the range (of chunks) between the previous state and the new one are retrieved -and chunks are requested identical to the historical case. After receiving all the missing chunks -from the new hashes, downstream peer will request a new range. If this happens before upstream peer updates a new state, -we say that session syncing is live or the two peers are in sync. In general the time interval passed since downstream peer request up to the current session cursor is a good indication of a permanent (probably increasing) lag. - -If there is no historical backlog, and downstream peer has an acceptable 'last synced' tag, then it is said to be fully synced with the upstream peer. -If a peer is fully synced with all its storer peers, it can advertise itself as globally fully synced. - -The downstream peer persists the record of the last synced offset. When the two peers disconnect and -reconnect syncing can start from there. -This situation however can also happen while historical syncing is not yet complete. -Effectively this means that the peer needs to persist a record of an arbitrary array of offset ranges covered. - -### Delivery requests - -once the appropriate ranges of the hashstream are retrieved and buffered, downstream peer just scans the hashes, looks them up in localstore, if not found, create a request entry. -The range is referenced by the chunk index. Alongside the name (indicating the stream, e.g., content chunks for bin 6) and the range -downstream peer sends a 128 long bitvector indicating which chunks are needed. -Newly created requests are satisfied bound together in a waitgroup which when done, will promptt sending the next one. -to be able to do check and storage concurrently, we keep a buffer of one, we start with two batches of hashes. -If there is nothing to give, upstream peers SetNextBatch is blocking. Subscription ends with an unsubscribe. which removes the syncer from the map. - -Canceling requests (for instance the late chunks of an erasure batch) should be a chan closed -on the request - -Simple request is also a subscribe -different streaming protocols are different p2p protocols with same message types. -the constructor is the Run function itself. which takes a streamerpeer as argument - - -### provable streams - -The swarm hash over the hash stream has many advantages. It implements a provable data transfer -and provide efficient storage for receipts in the form of inclusion proofs useable for finger pointing litigation. -When challenged on a missing chunk, upstream peer will provide an inclusion proof of a chunk hash against the state of the -sync stream. In order to be able to generate such an inclusion proof, upstream peer needs to store the hash index (counting consecutive hash-size segments) alongside the chunk data and preserve it even when the chunk data is deleted until the chunk is no longer insured. -if there is no valid insurance on the files the entry may be deleted. -As long as the chunk is preserved, no takeover proof will be needed since the node can respond to any challenge. -However, once the node needs to delete an insured chunk for capacity reasons, a receipt should be available to -refute the challenge by finger pointing to a downstream peer. -As part of the deletion protocol then, hashes of insured chunks to be removed are pushed to an infinite stream for every bin. - -Downstream peer on the other hand needs to make sure that they can only be finger pointed about a chunk they did receive and store. -For this the check of a state should be exhaustive. If historical syncing finishes on one state, all hashes before are covered, no -surprises. In other words historical syncing this process is self verifying. With session syncing however, it is not enough to check going back covering the range from old offset to new. Continuity (i.e., that the new state is extension of the old) needs to be verified: after downstream peer reads the range into a buffer, it appends the buffer the last known state at the last known offset and verifies the resulting hash matches -the latest state. Past intervals of historical syncing are checked via the session root. -Upstream peer signs the states, downstream peers can use as handover proofs. -Downstream peers sign off on a state together with an initial offset. - -Once historical syncing is complete and the session does not lag, downstream peer only preserves the latest upstream state and store the signed version. - -Upstream peer needs to keep the latest takeover states: each deleted chunk's hash should be covered by takeover proof of at least one peer. If historical syncing is complete, upstream peer typically will store only the latest takeover proof from downstream peer. -Crucially, the structure is totally independent of the number of peers in the bin, so it scales extremely well. - -## implementation - -The simplest protocol just involves upstream peer to prefix the key with the kademlia proximity order (say 0-15 or 0-31) -and simply iterate on index per bin when syncing with a peer. - -priority queues are used for sending chunks so that user triggered requests should be responded to first, session syncing second, and historical with lower priority. -The request on chunks remains implemented as a dataless entry in the memory store. -The lifecycle of this object should be more carefully thought through, ie., when it fails to retrieve it should be removed. diff --git a/swarm/network/bitvector/bitvector.go b/swarm/network/bitvector/bitvector.go deleted file mode 100644 index 958328502329..000000000000 --- a/swarm/network/bitvector/bitvector.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2018 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 bitvector - -import ( - "errors" -) - -var errInvalidLength = errors.New("invalid length") - -type BitVector struct { - len int - b []byte -} - -func New(l int) (bv *BitVector, err error) { - return NewFromBytes(make([]byte, l/8+1), l) -} - -func NewFromBytes(b []byte, l int) (bv *BitVector, err error) { - if l <= 0 { - return nil, errInvalidLength - } - if len(b)*8 < l { - return nil, errInvalidLength - } - return &BitVector{ - len: l, - b: b, - }, nil -} - -func (bv *BitVector) Get(i int) bool { - bi := i / 8 - return bv.b[bi]&(0x1<. - -package bitvector - -import "testing" - -func TestBitvectorNew(t *testing.T) { - _, err := New(0) - if err != errInvalidLength { - t.Errorf("expected err %v, got %v", errInvalidLength, err) - } - - _, err = NewFromBytes(nil, 0) - if err != errInvalidLength { - t.Errorf("expected err %v, got %v", errInvalidLength, err) - } - - _, err = NewFromBytes([]byte{0}, 9) - if err != errInvalidLength { - t.Errorf("expected err %v, got %v", errInvalidLength, err) - } - - _, err = NewFromBytes(make([]byte, 8), 8) - if err != nil { - t.Error(err) - } -} - -func TestBitvectorGetSet(t *testing.T) { - for _, length := range []int{ - 1, - 2, - 4, - 8, - 9, - 15, - 16, - } { - bv, err := New(length) - if err != nil { - t.Errorf("error for length %v: %v", length, err) - } - - for i := 0; i < length; i++ { - if bv.Get(i) { - t.Errorf("expected false for element on index %v", i) - } - } - - func() { - defer func() { - if err := recover(); err == nil { - t.Errorf("expecting panic") - } - }() - bv.Get(length + 8) - }() - - for i := 0; i < length; i++ { - bv.Set(i, true) - for j := 0; j < length; j++ { - if j == i { - if !bv.Get(j) { - t.Errorf("element on index %v is not set to true", i) - } - } else { - if bv.Get(j) { - t.Errorf("element on index %v is not false", i) - } - } - } - - bv.Set(i, false) - - if bv.Get(i) { - t.Errorf("element on index %v is not set to false", i) - } - } - } -} - -func TestBitvectorNewFromBytesGet(t *testing.T) { - bv, err := NewFromBytes([]byte{8}, 8) - if err != nil { - t.Error(err) - } - if !bv.Get(3) { - t.Fatalf("element 3 is not set to true: state %08b", bv.b[0]) - } -} diff --git a/swarm/network/common.go b/swarm/network/common.go deleted file mode 100644 index 15b2e2060437..000000000000 --- a/swarm/network/common.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2018 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 network - -import ( - "fmt" - "strings" -) - -func LogAddrs(nns [][]byte) string { - var nnsa []string - for _, nn := range nns { - nnsa = append(nnsa, fmt.Sprintf("%08x", nn[:4])) - } - return strings.Join(nnsa, ", ") -} diff --git a/swarm/network/discovery.go b/swarm/network/discovery.go deleted file mode 100644 index 75cd3def662f..000000000000 --- a/swarm/network/discovery.go +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "context" - "fmt" - "sync" - - "github.com/nebulaai/nbai-node/swarm/pot" -) - -// discovery bzz extension for requesting and relaying node address records - -// Peer wraps BzzPeer and embeds Kademlia overlay connectivity driver -type Peer struct { - *BzzPeer - kad *Kademlia - sentPeers bool // whether we already sent peer closer to this address - mtx sync.RWMutex // - peers map[string]bool // tracks node records sent to the peer - depth uint8 // the proximity order advertised by remote as depth of saturation -} - -// NewPeer constructs a discovery peer -func NewPeer(p *BzzPeer, kad *Kademlia) *Peer { - d := &Peer{ - kad: kad, - BzzPeer: p, - peers: make(map[string]bool), - } - // record remote as seen so we never send a peer its own record - d.seen(p.BzzAddr) - return d -} - -// HandleMsg is the message handler that delegates incoming messages -func (d *Peer) HandleMsg(ctx context.Context, msg interface{}) error { - switch msg := msg.(type) { - - case *peersMsg: - return d.handlePeersMsg(msg) - - case *subPeersMsg: - return d.handleSubPeersMsg(msg) - - default: - return fmt.Errorf("unknown message type: %T", msg) - } -} - -// NotifyDepth sends a message to all connections if depth of saturation is changed -func NotifyDepth(depth uint8, kad *Kademlia) { - f := func(val *Peer, po int) bool { - val.NotifyDepth(depth) - return true - } - kad.EachConn(nil, 255, f) -} - -// NotifyPeer informs all peers about a newly added node -func NotifyPeer(p *BzzAddr, k *Kademlia) { - f := func(val *Peer, po int) bool { - val.NotifyPeer(p, uint8(po)) - return true - } - k.EachConn(p.Address(), 255, f) -} - -// NotifyPeer notifies the remote node (recipient) about a peer if -// the peer's PO is within the recipients advertised depth -// OR the peer is closer to the recipient than self -// unless already notified during the connection session -func (d *Peer) NotifyPeer(a *BzzAddr, po uint8) { - // immediately return - if (po < d.getDepth() && pot.ProxCmp(d.kad.BaseAddr(), d, a) != 1) || d.seen(a) { - return - } - resp := &peersMsg{ - Peers: []*BzzAddr{a}, - } - go d.Send(context.TODO(), resp) -} - -// NotifyDepth sends a subPeers Msg to the receiver notifying them about -// a change in the depth of saturation -func (d *Peer) NotifyDepth(po uint8) { - go d.Send(context.TODO(), &subPeersMsg{Depth: po}) -} - -/* -peersMsg is the message to pass peer information -It is always a response to a peersRequestMsg - -The encoding of a peer address is identical the devp2p base protocol peers -messages: [IP, Port, NodeID], -Note that a node's FileStore address is not the NodeID but the hash of the NodeID. - -TODO: -To mitigate against spurious peers messages, requests should be remembered -and correctness of responses should be checked - -If the proxBin of peers in the response is incorrect the sender should be -disconnected -*/ - -// peersMsg encapsulates an array of peer addresses -// used for communicating about known peers -// relevant for bootstrapping connectivity and updating peersets -type peersMsg struct { - Peers []*BzzAddr -} - -// String pretty prints a peersMsg -func (msg peersMsg) String() string { - return fmt.Sprintf("%T: %v", msg, msg.Peers) -} - -// handlePeersMsg called by the protocol when receiving peerset (for target address) -// list of nodes ([]PeerAddr in peersMsg) is added to the overlay db using the -// Register interface method -func (d *Peer) handlePeersMsg(msg *peersMsg) error { - // register all addresses - if len(msg.Peers) == 0 { - return nil - } - - for _, a := range msg.Peers { - d.seen(a) - NotifyPeer(a, d.kad) - } - return d.kad.Register(msg.Peers...) -} - -// subPeers msg is communicating the depth of the overlay table of a peer -type subPeersMsg struct { - Depth uint8 -} - -// String returns the pretty printer -func (msg subPeersMsg) String() string { - return fmt.Sprintf("%T: request peers > PO%02d. ", msg, msg.Depth) -} - -func (d *Peer) handleSubPeersMsg(msg *subPeersMsg) error { - if !d.sentPeers { - d.setDepth(msg.Depth) - var peers []*BzzAddr - d.kad.EachConn(d.Over(), 255, func(p *Peer, po int) bool { - if pob, _ := Pof(d, d.kad.BaseAddr(), 0); pob > po { - return false - } - if !d.seen(p.BzzAddr) { - peers = append(peers, p.BzzAddr) - } - return true - }) - if len(peers) > 0 { - go d.Send(context.TODO(), &peersMsg{Peers: peers}) - } - } - d.sentPeers = true - return nil -} - -// seen takes an peer address and checks if it was sent to a peer already -// if not, marks the peer as sent -func (d *Peer) seen(p *BzzAddr) bool { - d.mtx.Lock() - defer d.mtx.Unlock() - k := string(p.Address()) - if d.peers[k] { - return true - } - d.peers[k] = true - return false -} - -func (d *Peer) getDepth() uint8 { - d.mtx.RLock() - defer d.mtx.RUnlock() - return d.depth -} - -func (d *Peer) setDepth(depth uint8) { - d.mtx.Lock() - defer d.mtx.Unlock() - d.depth = depth -} diff --git a/swarm/network/discovery_test.go b/swarm/network/discovery_test.go deleted file mode 100644 index 9a6a2995479b..000000000000 --- a/swarm/network/discovery_test.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "testing" - - p2ptest "github.com/nebulaai/nbai-node/p2p/testing" -) - -/*** - * - * - after connect, that outgoing subpeersmsg is sent - * - */ -func TestDiscovery(t *testing.T) { - params := NewHiveParams() - s, pp := newHiveTester(t, params, 1, nil) - - node := s.Nodes[0] - raddr := NewAddr(node) - pp.Register(raddr) - - // start the hive and wait for the connection - pp.Start(s.Server) - defer pp.Stop() - - // send subPeersMsg to the peer - err := s.TestExchanges(p2ptest.Exchange{ - Label: "outgoing subPeersMsg", - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &subPeersMsg{Depth: 0}, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} diff --git a/swarm/network/fetcher.go b/swarm/network/fetcher.go deleted file mode 100644 index b20bfc1a2d2f..000000000000 --- a/swarm/network/fetcher.go +++ /dev/null @@ -1,315 +0,0 @@ -// Copyright 2018 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 network - -import ( - "context" - "sync" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/swarm/storage" -) - -var searchTimeout = 1 * time.Second - -// Time to consider peer to be skipped. -// Also used in stream delivery. -var RequestTimeout = 10 * time.Second - -var maxHopCount uint8 = 20 // maximum number of forwarded requests (hops), to make sure requests are not forwarded forever in peer loops - -type RequestFunc func(context.Context, *Request) (*enode.ID, chan struct{}, error) - -// Fetcher is created when a chunk is not found locally. It starts a request handler loop once and -// keeps it alive until all active requests are completed. This can happen: -// 1. either because the chunk is delivered -// 2. or becuse the requestor cancelled/timed out -// Fetcher self destroys itself after it is completed. -// TODO: cancel all forward requests after termination -type Fetcher struct { - protoRequestFunc RequestFunc // request function fetcher calls to issue retrieve request for a chunk - addr storage.Address // the address of the chunk to be fetched - offerC chan *enode.ID // channel of sources (peer node id strings) - requestC chan uint8 // channel for incoming requests (with the hopCount value in it) - skipCheck bool -} - -type Request struct { - Addr storage.Address // chunk address - Source *enode.ID // nodeID of peer to request from (can be nil) - SkipCheck bool // whether to offer the chunk first or deliver directly - peersToSkip *sync.Map // peers not to request chunk from (only makes sense if source is nil) - HopCount uint8 // number of forwarded requests (hops) -} - -// NewRequest returns a new instance of Request based on chunk address skip check and -// a map of peers to skip. -func NewRequest(addr storage.Address, skipCheck bool, peersToSkip *sync.Map) *Request { - return &Request{ - Addr: addr, - SkipCheck: skipCheck, - peersToSkip: peersToSkip, - } -} - -// SkipPeer returns if the peer with nodeID should not be requested to deliver a chunk. -// Peers to skip are kept per Request and for a time period of RequestTimeout. -// This function is used in stream package in Delivery.RequestFromPeers to optimize -// requests for chunks. -func (r *Request) SkipPeer(nodeID string) bool { - val, ok := r.peersToSkip.Load(nodeID) - if !ok { - return false - } - t, ok := val.(time.Time) - if ok && time.Now().After(t.Add(RequestTimeout)) { - // deadine expired - r.peersToSkip.Delete(nodeID) - return false - } - return true -} - -// FetcherFactory is initialised with a request function and can create fetchers -type FetcherFactory struct { - request RequestFunc - skipCheck bool -} - -// NewFetcherFactory takes a request function and skip check parameter and creates a FetcherFactory -func NewFetcherFactory(request RequestFunc, skipCheck bool) *FetcherFactory { - return &FetcherFactory{ - request: request, - skipCheck: skipCheck, - } -} - -// New contructs a new Fetcher, for the given chunk. All peers in peersToSkip are not requested to -// deliver the given chunk. peersToSkip should always contain the peers which are actively requesting -// this chunk, to make sure we don't request back the chunks from them. -// The created Fetcher is started and returned. -func (f *FetcherFactory) New(ctx context.Context, source storage.Address, peersToSkip *sync.Map) storage.NetFetcher { - fetcher := NewFetcher(source, f.request, f.skipCheck) - go fetcher.run(ctx, peersToSkip) - return fetcher -} - -// NewFetcher creates a new Fetcher for the given chunk address using the given request function. -func NewFetcher(addr storage.Address, rf RequestFunc, skipCheck bool) *Fetcher { - return &Fetcher{ - addr: addr, - protoRequestFunc: rf, - offerC: make(chan *enode.ID), - requestC: make(chan uint8), - skipCheck: skipCheck, - } -} - -// Offer is called when an upstream peer offers the chunk via syncing as part of `OfferedHashesMsg` and the node does not have the chunk locally. -func (f *Fetcher) Offer(ctx context.Context, source *enode.ID) { - // First we need to have this select to make sure that we return if context is done - select { - case <-ctx.Done(): - return - default: - } - - // This select alone would not guarantee that we return of context is done, it could potentially - // push to offerC instead if offerC is available (see number 2 in https://golang.org/ref/spec#Select_statements) - select { - case f.offerC <- source: - case <-ctx.Done(): - } -} - -// Request is called when an upstream peer request the chunk as part of `RetrieveRequestMsg`, or from a local request through FileStore, and the node does not have the chunk locally. -func (f *Fetcher) Request(ctx context.Context, hopCount uint8) { - // First we need to have this select to make sure that we return if context is done - select { - case <-ctx.Done(): - return - default: - } - - if hopCount >= maxHopCount { - log.Debug("fetcher request hop count limit reached", "hops", hopCount) - return - } - - // This select alone would not guarantee that we return of context is done, it could potentially - // push to offerC instead if offerC is available (see number 2 in https://golang.org/ref/spec#Select_statements) - select { - case f.requestC <- hopCount + 1: - case <-ctx.Done(): - } -} - -// start prepares the Fetcher -// it keeps the Fetcher alive within the lifecycle of the passed context -func (f *Fetcher) run(ctx context.Context, peers *sync.Map) { - var ( - doRequest bool // determines if retrieval is initiated in the current iteration - wait *time.Timer // timer for search timeout - waitC <-chan time.Time // timer channel - sources []*enode.ID // known sources, ie. peers that offered the chunk - requested bool // true if the chunk was actually requested - hopCount uint8 - ) - gone := make(chan *enode.ID) // channel to signal that a peer we requested from disconnected - - // loop that keeps the fetching process alive - // after every request a timer is set. If this goes off we request again from another peer - // note that the previous request is still alive and has the chance to deliver, so - // rerequesting extends the search. ie., - // if a peer we requested from is gone we issue a new request, so the number of active - // requests never decreases - for { - select { - - // incoming offer - case source := <-f.offerC: - log.Trace("new source", "peer addr", source, "request addr", f.addr) - // 1) the chunk is offered by a syncing peer - // add to known sources - sources = append(sources, source) - // launch a request to the source iff the chunk was requested (not just expected because its offered by a syncing peer) - doRequest = requested - - // incoming request - case hopCount = <-f.requestC: - log.Trace("new request", "request addr", f.addr) - // 2) chunk is requested, set requested flag - // launch a request iff none been launched yet - doRequest = !requested - requested = true - - // peer we requested from is gone. fall back to another - // and remove the peer from the peers map - case id := <-gone: - log.Trace("peer gone", "peer id", id.String(), "request addr", f.addr) - peers.Delete(id.String()) - doRequest = requested - - // search timeout: too much time passed since the last request, - // extend the search to a new peer if we can find one - case <-waitC: - log.Trace("search timed out: rerequesting", "request addr", f.addr) - doRequest = requested - - // all Fetcher context closed, can quit - case <-ctx.Done(): - log.Trace("terminate fetcher", "request addr", f.addr) - // TODO: send cancelations to all peers left over in peers map (i.e., those we requested from) - return - } - - // need to issue a new request - if doRequest { - var err error - sources, err = f.doRequest(ctx, gone, peers, sources, hopCount) - if err != nil { - log.Info("unable to request", "request addr", f.addr, "err", err) - } - } - - // if wait channel is not set, set it to a timer - if requested { - if wait == nil { - wait = time.NewTimer(searchTimeout) - defer wait.Stop() - waitC = wait.C - } else { - // stop the timer and drain the channel if it was not drained earlier - if !wait.Stop() { - select { - case <-wait.C: - default: - } - } - // reset the timer to go off after searchTimeout - wait.Reset(searchTimeout) - } - } - doRequest = false - } -} - -// doRequest attempts at finding a peer to request the chunk from -// * first it tries to request explicitly from peers that are known to have offered the chunk -// * if there are no such peers (available) it tries to request it from a peer closest to the chunk address -// excluding those in the peersToSkip map -// * if no such peer is found an error is returned -// -// if a request is successful, -// * the peer's address is added to the set of peers to skip -// * the peer's address is removed from prospective sources, and -// * a go routine is started that reports on the gone channel if the peer is disconnected (or terminated their streamer) -func (f *Fetcher) doRequest(ctx context.Context, gone chan *enode.ID, peersToSkip *sync.Map, sources []*enode.ID, hopCount uint8) ([]*enode.ID, error) { - var i int - var sourceID *enode.ID - var quit chan struct{} - - req := &Request{ - Addr: f.addr, - SkipCheck: f.skipCheck, - peersToSkip: peersToSkip, - HopCount: hopCount, - } - - foundSource := false - // iterate over known sources - for i = 0; i < len(sources); i++ { - req.Source = sources[i] - var err error - sourceID, quit, err = f.protoRequestFunc(ctx, req) - if err == nil { - // remove the peer from known sources - // Note: we can modify the source although we are looping on it, because we break from the loop immediately - sources = append(sources[:i], sources[i+1:]...) - foundSource = true - break - } - } - - // if there are no known sources, or none available, we try request from a closest node - if !foundSource { - req.Source = nil - var err error - sourceID, quit, err = f.protoRequestFunc(ctx, req) - if err != nil { - // if no peers found to request from - return sources, err - } - } - // add peer to the set of peers to skip from now - peersToSkip.Store(sourceID.String(), time.Now()) - - // if the quit channel is closed, it indicates that the source peer we requested from - // disconnected or terminated its streamer - // here start a go routine that watches this channel and reports the source peer on the gone channel - // this go routine quits if the fetcher global context is done to prevent process leak - go func() { - select { - case <-quit: - gone <- sourceID - case <-ctx.Done(): - } - }() - return sources, nil -} diff --git a/swarm/network/fetcher_test.go b/swarm/network/fetcher_test.go deleted file mode 100644 index 250c942b9532..000000000000 --- a/swarm/network/fetcher_test.go +++ /dev/null @@ -1,487 +0,0 @@ -// Copyright 2018 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 network - -import ( - "context" - "sync" - "testing" - "time" - - "github.com/nebulaai/nbai-node/p2p/enode" -) - -var requestedPeerID = enode.HexID("3431c3939e1ee2a6345e976a8234f9870152d64879f30bc272a074f6859e75e8") -var sourcePeerID = enode.HexID("99d8594b52298567d2ca3f4c441a5ba0140ee9245e26460d01102a52773c73b9") - -// mockRequester pushes every request to the requestC channel when its doRequest function is called -type mockRequester struct { - // requests []Request - requestC chan *Request // when a request is coming it is pushed to requestC - waitTimes []time.Duration // with waitTimes[i] you can define how much to wait on the ith request (optional) - count int //counts the number of requests - quitC chan struct{} -} - -func newMockRequester(waitTimes ...time.Duration) *mockRequester { - return &mockRequester{ - requestC: make(chan *Request), - waitTimes: waitTimes, - quitC: make(chan struct{}), - } -} - -func (m *mockRequester) doRequest(ctx context.Context, request *Request) (*enode.ID, chan struct{}, error) { - waitTime := time.Duration(0) - if m.count < len(m.waitTimes) { - waitTime = m.waitTimes[m.count] - m.count++ - } - time.Sleep(waitTime) - m.requestC <- request - - // if there is a Source in the request use that, if not use the global requestedPeerId - source := request.Source - if source == nil { - source = &requestedPeerID - } - return source, m.quitC, nil -} - -// TestFetcherSingleRequest creates a Fetcher using mockRequester, and run it with a sample set of peers to skip. -// mockRequester pushes a Request on a channel every time the request function is called. Using -// this channel we test if calling Fetcher.Request calls the request function, and whether it uses -// the correct peers to skip which we provided for the fetcher.run function. -func TestFetcherSingleRequest(t *testing.T) { - requester := newMockRequester() - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - peers := []string{"a", "b", "c", "d"} - peersToSkip := &sync.Map{} - for _, p := range peers { - peersToSkip.Store(p, time.Now()) - } - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - go fetcher.run(ctx, peersToSkip) - - rctx := context.Background() - fetcher.Request(rctx, 0) - - select { - case request := <-requester.requestC: - // request should contain all peers from peersToSkip provided to the fetcher - for _, p := range peers { - if _, ok := request.peersToSkip.Load(p); !ok { - t.Fatalf("request.peersToSkip misses peer") - } - } - - // source peer should be also added to peersToSkip eventually - time.Sleep(100 * time.Millisecond) - if _, ok := request.peersToSkip.Load(requestedPeerID.String()); !ok { - t.Fatalf("request.peersToSkip does not contain peer returned by the request function") - } - - // hopCount in the forwarded request should be incremented - if request.HopCount != 1 { - t.Fatalf("Expected request.HopCount 1 got %v", request.HopCount) - } - - // fetch should trigger a request, if it doesn't happen in time, test should fail - case <-time.After(200 * time.Millisecond): - t.Fatalf("fetch timeout") - } -} - -// TestCancelStopsFetcher tests that a cancelled fetcher does not initiate further requests even if its fetch function is called -func TestFetcherCancelStopsFetcher(t *testing.T) { - requester := newMockRequester() - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - peersToSkip := &sync.Map{} - - ctx, cancel := context.WithCancel(context.Background()) - - // we start the fetcher, and then we immediately cancel the context - go fetcher.run(ctx, peersToSkip) - cancel() - - rctx, rcancel := context.WithTimeout(ctx, 100*time.Millisecond) - defer rcancel() - // we call Request with an active context - fetcher.Request(rctx, 0) - - // fetcher should not initiate request, we can only check by waiting a bit and making sure no request is happening - select { - case <-requester.requestC: - t.Fatalf("cancelled fetcher initiated request") - case <-time.After(200 * time.Millisecond): - } -} - -// TestFetchCancelStopsRequest tests that calling a Request function with a cancelled context does not initiate a request -func TestFetcherCancelStopsRequest(t *testing.T) { - requester := newMockRequester(100 * time.Millisecond) - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - peersToSkip := &sync.Map{} - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // we start the fetcher with an active context - go fetcher.run(ctx, peersToSkip) - - rctx, rcancel := context.WithCancel(context.Background()) - rcancel() - - // we call Request with a cancelled context - fetcher.Request(rctx, 0) - - // fetcher should not initiate request, we can only check by waiting a bit and making sure no request is happening - select { - case <-requester.requestC: - t.Fatalf("cancelled fetch function initiated request") - case <-time.After(200 * time.Millisecond): - } - - // if there is another Request with active context, there should be a request, because the fetcher itself is not cancelled - rctx = context.Background() - fetcher.Request(rctx, 0) - - select { - case <-requester.requestC: - case <-time.After(200 * time.Millisecond): - t.Fatalf("expected request") - } -} - -// TestOfferUsesSource tests Fetcher Offer behavior. -// In this case there should be 1 (and only one) request initiated from the source peer, and the -// source nodeid should appear in the peersToSkip map. -func TestFetcherOfferUsesSource(t *testing.T) { - requester := newMockRequester(100 * time.Millisecond) - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - peersToSkip := &sync.Map{} - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // start the fetcher - go fetcher.run(ctx, peersToSkip) - - rctx := context.Background() - // call the Offer function with the source peer - fetcher.Offer(rctx, &sourcePeerID) - - // fetcher should not initiate request - select { - case <-requester.requestC: - t.Fatalf("fetcher initiated request") - case <-time.After(200 * time.Millisecond): - } - - // call Request after the Offer - rctx = context.Background() - fetcher.Request(rctx, 0) - - // there should be exactly 1 request coming from fetcher - var request *Request - select { - case request = <-requester.requestC: - if *request.Source != sourcePeerID { - t.Fatalf("Expected source id %v got %v", sourcePeerID, request.Source) - } - case <-time.After(200 * time.Millisecond): - t.Fatalf("fetcher did not initiate request") - } - - select { - case <-requester.requestC: - t.Fatalf("Fetcher number of requests expected 1 got 2") - case <-time.After(200 * time.Millisecond): - } - - // source peer should be added to peersToSkip eventually - time.Sleep(100 * time.Millisecond) - if _, ok := request.peersToSkip.Load(sourcePeerID.String()); !ok { - t.Fatalf("SourcePeerId not added to peersToSkip") - } -} - -func TestFetcherOfferAfterRequestUsesSourceFromContext(t *testing.T) { - requester := newMockRequester(100 * time.Millisecond) - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - peersToSkip := &sync.Map{} - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // start the fetcher - go fetcher.run(ctx, peersToSkip) - - // call Request first - rctx := context.Background() - fetcher.Request(rctx, 0) - - // there should be a request coming from fetcher - var request *Request - select { - case request = <-requester.requestC: - if request.Source != nil { - t.Fatalf("Incorrect source peer id, expected nil got %v", request.Source) - } - case <-time.After(200 * time.Millisecond): - t.Fatalf("fetcher did not initiate request") - } - - // after the Request call Offer - fetcher.Offer(context.Background(), &sourcePeerID) - - // there should be a request coming from fetcher - select { - case request = <-requester.requestC: - if *request.Source != sourcePeerID { - t.Fatalf("Incorrect source peer id, expected %v got %v", sourcePeerID, request.Source) - } - case <-time.After(200 * time.Millisecond): - t.Fatalf("fetcher did not initiate request") - } - - // source peer should be added to peersToSkip eventually - time.Sleep(100 * time.Millisecond) - if _, ok := request.peersToSkip.Load(sourcePeerID.String()); !ok { - t.Fatalf("SourcePeerId not added to peersToSkip") - } -} - -// TestFetcherRetryOnTimeout tests that fetch retries after searchTimeOut has passed -func TestFetcherRetryOnTimeout(t *testing.T) { - requester := newMockRequester() - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - peersToSkip := &sync.Map{} - - // set searchTimeOut to low value so the test is quicker - defer func(t time.Duration) { - searchTimeout = t - }(searchTimeout) - searchTimeout = 250 * time.Millisecond - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - // start the fetcher - go fetcher.run(ctx, peersToSkip) - - // call the fetch function with an active context - rctx := context.Background() - fetcher.Request(rctx, 0) - - // after 100ms the first request should be initiated - time.Sleep(100 * time.Millisecond) - - select { - case <-requester.requestC: - default: - t.Fatalf("fetch did not initiate request") - } - - // after another 100ms no new request should be initiated, because search timeout is 250ms - time.Sleep(100 * time.Millisecond) - - select { - case <-requester.requestC: - t.Fatalf("unexpected request from fetcher") - default: - } - - // after another 300ms search timeout is over, there should be a new request - time.Sleep(300 * time.Millisecond) - - select { - case <-requester.requestC: - default: - t.Fatalf("fetch did not retry request") - } -} - -// TestFetcherFactory creates a FetcherFactory and checks if the factory really creates and starts -// a Fetcher when it return a fetch function. We test the fetching functionality just by checking if -// a request is initiated when the fetch function is called -func TestFetcherFactory(t *testing.T) { - requester := newMockRequester(100 * time.Millisecond) - addr := make([]byte, 32) - fetcherFactory := NewFetcherFactory(requester.doRequest, false) - - peersToSkip := &sync.Map{} - - fetcher := fetcherFactory.New(context.Background(), addr, peersToSkip) - - fetcher.Request(context.Background(), 0) - - // check if the created fetchFunction really starts a fetcher and initiates a request - select { - case <-requester.requestC: - case <-time.After(200 * time.Millisecond): - t.Fatalf("fetch timeout") - } - -} - -func TestFetcherRequestQuitRetriesRequest(t *testing.T) { - requester := newMockRequester() - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - // make sure searchTimeout is long so it is sure the request is not retried because of timeout - defer func(t time.Duration) { - searchTimeout = t - }(searchTimeout) - searchTimeout = 10 * time.Second - - peersToSkip := &sync.Map{} - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - go fetcher.run(ctx, peersToSkip) - - rctx := context.Background() - fetcher.Request(rctx, 0) - - select { - case <-requester.requestC: - case <-time.After(200 * time.Millisecond): - t.Fatalf("request is not initiated") - } - - close(requester.quitC) - - select { - case <-requester.requestC: - case <-time.After(200 * time.Millisecond): - t.Fatalf("request is not initiated after failed request") - } -} - -// TestRequestSkipPeer checks if PeerSkip function will skip provided peer -// and not skip unknown one. -func TestRequestSkipPeer(t *testing.T) { - addr := make([]byte, 32) - peers := []enode.ID{ - enode.HexID("3431c3939e1ee2a6345e976a8234f9870152d64879f30bc272a074f6859e75e8"), - enode.HexID("99d8594b52298567d2ca3f4c441a5ba0140ee9245e26460d01102a52773c73b9"), - } - - peersToSkip := new(sync.Map) - peersToSkip.Store(peers[0].String(), time.Now()) - r := NewRequest(addr, false, peersToSkip) - - if !r.SkipPeer(peers[0].String()) { - t.Errorf("peer not skipped") - } - - if r.SkipPeer(peers[1].String()) { - t.Errorf("peer skipped") - } -} - -// TestRequestSkipPeerExpired checks if a peer to skip is not skipped -// after RequestTimeout has passed. -func TestRequestSkipPeerExpired(t *testing.T) { - addr := make([]byte, 32) - peer := enode.HexID("3431c3939e1ee2a6345e976a8234f9870152d64879f30bc272a074f6859e75e8") - - // set RequestTimeout to a low value and reset it after the test - defer func(t time.Duration) { RequestTimeout = t }(RequestTimeout) - RequestTimeout = 250 * time.Millisecond - - peersToSkip := new(sync.Map) - peersToSkip.Store(peer.String(), time.Now()) - r := NewRequest(addr, false, peersToSkip) - - if !r.SkipPeer(peer.String()) { - t.Errorf("peer not skipped") - } - - time.Sleep(500 * time.Millisecond) - - if r.SkipPeer(peer.String()) { - t.Errorf("peer skipped") - } -} - -// TestRequestSkipPeerPermanent checks if a peer to skip is not skipped -// after RequestTimeout is not skipped if it is set for a permanent skipping -// by value to peersToSkip map is not time.Duration. -func TestRequestSkipPeerPermanent(t *testing.T) { - addr := make([]byte, 32) - peer := enode.HexID("3431c3939e1ee2a6345e976a8234f9870152d64879f30bc272a074f6859e75e8") - - // set RequestTimeout to a low value and reset it after the test - defer func(t time.Duration) { RequestTimeout = t }(RequestTimeout) - RequestTimeout = 250 * time.Millisecond - - peersToSkip := new(sync.Map) - peersToSkip.Store(peer.String(), true) - r := NewRequest(addr, false, peersToSkip) - - if !r.SkipPeer(peer.String()) { - t.Errorf("peer not skipped") - } - - time.Sleep(500 * time.Millisecond) - - if !r.SkipPeer(peer.String()) { - t.Errorf("peer not skipped") - } -} - -func TestFetcherMaxHopCount(t *testing.T) { - requester := newMockRequester() - addr := make([]byte, 32) - fetcher := NewFetcher(addr, requester.doRequest, true) - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - peersToSkip := &sync.Map{} - - go fetcher.run(ctx, peersToSkip) - - rctx := context.Background() - fetcher.Request(rctx, maxHopCount) - - // if hopCount is already at max no request should be initiated - select { - case <-requester.requestC: - t.Fatalf("cancelled fetcher initiated request") - case <-time.After(200 * time.Millisecond): - } -} diff --git a/swarm/network/hive.go b/swarm/network/hive.go deleted file mode 100644 index 5a45d9773c79..000000000000 --- a/swarm/network/hive.go +++ /dev/null @@ -1,244 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "fmt" - "sync" - "time" - - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/state" -) - -/* -Hive is the logistic manager of the swarm - -When the hive is started, a forever loop is launched that -asks the kademlia nodetable -to suggest peers to bootstrap connectivity -*/ - -// HiveParams holds the config options to hive -type HiveParams struct { - Discovery bool // if want discovery of not - PeersBroadcastSetSize uint8 // how many peers to use when relaying - MaxPeersPerRequest uint8 // max size for peer address batches - KeepAliveInterval time.Duration -} - -// NewHiveParams returns hive config with only the -func NewHiveParams() *HiveParams { - return &HiveParams{ - Discovery: true, - PeersBroadcastSetSize: 3, - MaxPeersPerRequest: 5, - KeepAliveInterval: 500 * time.Millisecond, - } -} - -// Hive manages network connections of the swarm node -type Hive struct { - *HiveParams // settings - *Kademlia // the overlay connectiviy driver - Store state.Store // storage interface to save peers across sessions - addPeer func(*enode.Node) // server callback to connect to a peer - // bookkeeping - lock sync.Mutex - peers map[enode.ID]*BzzPeer - ticker *time.Ticker -} - -// NewHive constructs a new hive -// HiveParams: config parameters -// Kademlia: connectivity driver using a network topology -// StateStore: to save peers across sessions -func NewHive(params *HiveParams, kad *Kademlia, store state.Store) *Hive { - return &Hive{ - HiveParams: params, - Kademlia: kad, - Store: store, - peers: make(map[enode.ID]*BzzPeer), - } -} - -// Start stars the hive, receives p2p.Server only at startup -// server is used to connect to a peer based on its NodeID or enode URL -// these are called on the p2p.Server which runs on the node -func (h *Hive) Start(server *p2p.Server) error { - log.Info("Starting hive", "baseaddr", fmt.Sprintf("%x", h.BaseAddr()[:4])) - // if state store is specified, load peers to prepopulate the overlay address book - if h.Store != nil { - log.Info("Detected an existing store. trying to load peers") - if err := h.loadPeers(); err != nil { - log.Error(fmt.Sprintf("%08x hive encoutered an error trying to load peers", h.BaseAddr()[:4])) - return err - } - } - // assigns the p2p.Server#AddPeer function to connect to peers - h.addPeer = server.AddPeer - // ticker to keep the hive alive - h.ticker = time.NewTicker(h.KeepAliveInterval) - // this loop is doing bootstrapping and maintains a healthy table - go h.connect() - return nil -} - -// Stop terminates the updateloop and saves the peers -func (h *Hive) Stop() error { - log.Info(fmt.Sprintf("%08x hive stopping, saving peers", h.BaseAddr()[:4])) - h.ticker.Stop() - if h.Store != nil { - if err := h.savePeers(); err != nil { - return fmt.Errorf("could not save peers to persistence store: %v", err) - } - if err := h.Store.Close(); err != nil { - return fmt.Errorf("could not close file handle to persistence store: %v", err) - } - } - log.Info(fmt.Sprintf("%08x hive stopped, dropping peers", h.BaseAddr()[:4])) - h.EachConn(nil, 255, func(p *Peer, _ int) bool { - log.Info(fmt.Sprintf("%08x dropping peer %08x", h.BaseAddr()[:4], p.Address()[:4])) - p.Drop(nil) - return true - }) - - log.Info(fmt.Sprintf("%08x all peers dropped", h.BaseAddr()[:4])) - return nil -} - -// connect is a forever loop -// at each iteration, ask the overlay driver to suggest the most preferred peer to connect to -// as well as advertises saturation depth if needed -func (h *Hive) connect() { - for range h.ticker.C { - - addr, depth, changed := h.SuggestPeer() - if h.Discovery && changed { - NotifyDepth(uint8(depth), h.Kademlia) - } - if addr == nil { - continue - } - - log.Trace(fmt.Sprintf("%08x hive connect() suggested %08x", h.BaseAddr()[:4], addr.Address()[:4])) - under, err := enode.ParseV4(string(addr.Under())) - if err != nil { - log.Warn(fmt.Sprintf("%08x unable to connect to bee %08x: invalid node URL: %v", h.BaseAddr()[:4], addr.Address()[:4], err)) - continue - } - log.Trace(fmt.Sprintf("%08x attempt to connect to bee %08x", h.BaseAddr()[:4], addr.Address()[:4])) - h.addPeer(under) - } -} - -// Run protocol run function -func (h *Hive) Run(p *BzzPeer) error { - h.trackPeer(p) - defer h.untrackPeer(p) - - dp := NewPeer(p, h.Kademlia) - depth, changed := h.On(dp) - // if we want discovery, advertise change of depth - if h.Discovery { - if changed { - // if depth changed, send to all peers - NotifyDepth(depth, h.Kademlia) - } else { - // otherwise just send depth to new peer - dp.NotifyDepth(depth) - } - NotifyPeer(p.BzzAddr, h.Kademlia) - } - defer h.Off(dp) - return dp.Run(dp.HandleMsg) -} - -func (h *Hive) trackPeer(p *BzzPeer) { - h.lock.Lock() - h.peers[p.ID()] = p - h.lock.Unlock() -} - -func (h *Hive) untrackPeer(p *BzzPeer) { - h.lock.Lock() - delete(h.peers, p.ID()) - h.lock.Unlock() -} - -// NodeInfo function is used by the p2p.server RPC interface to display -// protocol specific node information -func (h *Hive) NodeInfo() interface{} { - return h.String() -} - -// PeerInfo function is used by the p2p.server RPC interface to display -// protocol specific information any connected peer referred to by their NodeID -func (h *Hive) PeerInfo(id enode.ID) interface{} { - h.lock.Lock() - p := h.peers[id] - h.lock.Unlock() - - if p == nil { - return nil - } - addr := NewAddr(p.Node()) - return struct { - OAddr hexutil.Bytes - UAddr hexutil.Bytes - }{ - OAddr: addr.OAddr, - UAddr: addr.UAddr, - } -} - -// loadPeers, savePeer implement persistence callback/ -func (h *Hive) loadPeers() error { - var as []*BzzAddr - err := h.Store.Get("peers", &as) - if err != nil { - if err == state.ErrNotFound { - log.Info(fmt.Sprintf("hive %08x: no persisted peers found", h.BaseAddr()[:4])) - return nil - } - return err - } - log.Info(fmt.Sprintf("hive %08x: peers loaded", h.BaseAddr()[:4])) - - return h.Register(as...) -} - -// savePeers, savePeer implement persistence callback/ -func (h *Hive) savePeers() error { - var peers []*BzzAddr - h.Kademlia.EachAddr(nil, 256, func(pa *BzzAddr, i int) bool { - if pa == nil { - log.Warn(fmt.Sprintf("empty addr: %v", i)) - return true - } - log.Trace("saving peer", "peer", pa) - peers = append(peers, pa) - return true - }) - if err := h.Store.Put("peers", peers); err != nil { - return fmt.Errorf("could not save peers: %v", err) - } - return nil -} diff --git a/swarm/network/hive_test.go b/swarm/network/hive_test.go deleted file mode 100644 index f3867629afc1..000000000000 --- a/swarm/network/hive_test.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "io/ioutil" - "log" - "os" - "testing" - - p2ptest "github.com/nebulaai/nbai-node/p2p/testing" - "github.com/nebulaai/nbai-node/swarm/state" -) - -func newHiveTester(t *testing.T, params *HiveParams, n int, store state.Store) (*bzzTester, *Hive) { - // setup - addr := RandomAddr() // tested peers peer address - to := NewKademlia(addr.OAddr, NewKadParams()) - pp := NewHive(params, to, store) // hive - - return newBzzBaseTester(t, n, addr, DiscoverySpec, pp.Run), pp -} - -func TestRegisterAndConnect(t *testing.T) { - params := NewHiveParams() - s, pp := newHiveTester(t, params, 1, nil) - - node := s.Nodes[0] - raddr := NewAddr(node) - pp.Register(raddr) - - // start the hive and wait for the connection - err := pp.Start(s.Server) - if err != nil { - t.Fatal(err) - } - defer pp.Stop() - // retrieve and broadcast - err = s.TestDisconnected(&p2ptest.Disconnect{ - Peer: s.Nodes[0].ID(), - Error: nil, - }) - - if err == nil || err.Error() != "timed out waiting for peers to disconnect" { - t.Fatalf("expected peer to connect") - } -} - -func TestHiveStatePersistance(t *testing.T) { - log.SetOutput(os.Stdout) - - dir, err := ioutil.TempDir("", "hive_test_store") - if err != nil { - panic(err) - } - defer os.RemoveAll(dir) - - store, err := state.NewDBStore(dir) //start the hive with an empty dbstore - if err != nil { - t.Fatal(err) - } - - params := NewHiveParams() - s, pp := newHiveTester(t, params, 5, store) - - peers := make(map[string]bool) - for _, node := range s.Nodes { - raddr := NewAddr(node) - pp.Register(raddr) - peers[raddr.String()] = true - } - - // start the hive and wait for the connection - err = pp.Start(s.Server) - if err != nil { - t.Fatal(err) - } - pp.Stop() - store.Close() - - persistedStore, err := state.NewDBStore(dir) //start the hive with an empty dbstore - if err != nil { - t.Fatal(err) - } - - s1, pp := newHiveTester(t, params, 1, persistedStore) - - //start the hive and wait for the connection - - pp.Start(s1.Server) - i := 0 - pp.Kademlia.EachAddr(nil, 256, func(addr *BzzAddr, po int) bool { - delete(peers, addr.String()) - i++ - return true - }) - if i != 5 { - t.Errorf("invalid number of entries: got %v, want %v", i, 5) - } - if len(peers) != 0 { - t.Fatalf("%d peers left over: %v", len(peers), peers) - } -} diff --git a/swarm/network/kademlia.go b/swarm/network/kademlia.go deleted file mode 100644 index 6f0dec3e70cc..000000000000 --- a/swarm/network/kademlia.go +++ /dev/null @@ -1,761 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "bytes" - "fmt" - "math/rand" - "strings" - "sync" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/pot" -) - -/* - -Taking the proximity order relative to a fix point x classifies the points in -the space (n byte long byte sequences) into bins. Items in each are at -most half as distant from x as items in the previous bin. Given a sample of -uniformly distributed items (a hash function over arbitrary sequence) the -proximity scale maps onto series of subsets with cardinalities on a negative -exponential scale. - -It also has the property that any two item belonging to the same bin are at -most half as distant from each other as they are from x. - -If we think of random sample of items in the bins as connections in a network of -interconnected nodes then relative proximity can serve as the basis for local -decisions for graph traversal where the task is to find a route between two -points. Since in every hop, the finite distance halves, there is -a guaranteed constant maximum limit on the number of hops needed to reach one -node from the other. -*/ - -var Pof = pot.DefaultPof(256) - -// KadParams holds the config params for Kademlia -type KadParams struct { - // adjustable parameters - MaxProxDisplay int // number of rows the table shows - NeighbourhoodSize int // nearest neighbour core minimum cardinality - MinBinSize int // minimum number of peers in a row - MaxBinSize int // maximum number of peers in a row before pruning - RetryInterval int64 // initial interval before a peer is first redialed - RetryExponent int // exponent to multiply retry intervals with - MaxRetries int // maximum number of redial attempts - // function to sanction or prevent suggesting a peer - Reachable func(*BzzAddr) bool `json:"-"` -} - -// NewKadParams returns a params struct with default values -func NewKadParams() *KadParams { - return &KadParams{ - MaxProxDisplay: 16, - NeighbourhoodSize: 2, - MinBinSize: 2, - MaxBinSize: 4, - RetryInterval: 4200000000, // 4.2 sec - MaxRetries: 42, - RetryExponent: 2, - } -} - -// Kademlia is a table of live peers and a db of known peers (node records) -type Kademlia struct { - lock sync.RWMutex - *KadParams // Kademlia configuration parameters - base []byte // immutable baseaddress of the table - addrs *pot.Pot // pots container for known peer addresses - conns *pot.Pot // pots container for live peer connections - depth uint8 // stores the last current depth of saturation - nDepth int // stores the last neighbourhood depth - nDepthC chan int // returned by DepthC function to signal neighbourhood depth change - addrCountC chan int // returned by AddrCountC function to signal peer count change -} - -// NewKademlia creates a Kademlia table for base address addr -// with parameters as in params -// if params is nil, it uses default values -func NewKademlia(addr []byte, params *KadParams) *Kademlia { - if params == nil { - params = NewKadParams() - } - return &Kademlia{ - base: addr, - KadParams: params, - addrs: pot.NewPot(nil, 0), - conns: pot.NewPot(nil, 0), - } -} - -// entry represents a Kademlia table entry (an extension of BzzAddr) -type entry struct { - *BzzAddr - conn *Peer - seenAt time.Time - retries int -} - -// newEntry creates a kademlia peer from a *Peer -func newEntry(p *BzzAddr) *entry { - return &entry{ - BzzAddr: p, - seenAt: time.Now(), - } -} - -// Label is a short tag for the entry for debug -func Label(e *entry) string { - return fmt.Sprintf("%s (%d)", e.Hex()[:4], e.retries) -} - -// Hex is the hexadecimal serialisation of the entry address -func (e *entry) Hex() string { - return fmt.Sprintf("%x", e.Address()) -} - -// Register enters each address as kademlia peer record into the -// database of known peer addresses -func (k *Kademlia) Register(peers ...*BzzAddr) error { - k.lock.Lock() - defer k.lock.Unlock() - var known, size int - for _, p := range peers { - // error if self received, peer should know better - // and should be punished for this - if bytes.Equal(p.Address(), k.base) { - return fmt.Errorf("add peers: %x is self", k.base) - } - var found bool - k.addrs, _, found, _ = pot.Swap(k.addrs, p, Pof, func(v pot.Val) pot.Val { - // if not found - if v == nil { - // insert new offline peer into conns - return newEntry(p) - } - // found among known peers, do nothing - return v - }) - if found { - known++ - } - size++ - } - // send new address count value only if there are new addresses - if k.addrCountC != nil && size-known > 0 { - k.addrCountC <- k.addrs.Size() - } - - k.sendNeighbourhoodDepthChange() - return nil -} - -// SuggestPeer returns a known peer for the lowest proximity bin for the -// lowest bincount below depth -// naturally if there is an empty row it returns a peer for that -func (k *Kademlia) SuggestPeer() (a *BzzAddr, o int, want bool) { - k.lock.Lock() - defer k.lock.Unlock() - minsize := k.MinBinSize - depth := depthForPot(k.conns, k.NeighbourhoodSize, k.base) - // if there is a callable neighbour within the current proxBin, connect - // this makes sure nearest neighbour set is fully connected - var ppo int - k.addrs.EachNeighbour(k.base, Pof, func(val pot.Val, po int) bool { - if po < depth { - return false - } - e := val.(*entry) - c := k.callable(e) - if c { - a = e.BzzAddr - } - ppo = po - return !c - }) - if a != nil { - log.Trace(fmt.Sprintf("%08x candidate nearest neighbour found: %v (%v)", k.BaseAddr()[:4], a, ppo)) - return a, 0, false - } - - var bpo []int - prev := -1 - k.conns.EachBin(k.base, Pof, 0, func(po, size int, f func(func(val pot.Val) bool) bool) bool { - prev++ - for ; prev < po; prev++ { - bpo = append(bpo, prev) - minsize = 0 - } - if size < minsize { - bpo = append(bpo, po) - minsize = size - } - return size > 0 && po < depth - }) - // all buckets are full, ie., minsize == k.MinBinSize - if len(bpo) == 0 { - return nil, 0, false - } - // as long as we got candidate peers to connect to - // dont ask for new peers (want = false) - // try to select a candidate peer - // find the first callable peer - nxt := bpo[0] - k.addrs.EachBin(k.base, Pof, nxt, func(po, _ int, f func(func(pot.Val) bool) bool) bool { - // for each bin (up until depth) we find callable candidate peers - if po >= depth { - return false - } - return f(func(val pot.Val) bool { - e := val.(*entry) - c := k.callable(e) - if c { - a = e.BzzAddr - } - return !c - }) - }) - // found a candidate - if a != nil { - return a, 0, false - } - // no candidate peer found, request for the short bin - var changed bool - if uint8(nxt) < k.depth { - k.depth = uint8(nxt) - changed = true - } - return a, nxt, changed -} - -// On inserts the peer as a kademlia peer into the live peers -func (k *Kademlia) On(p *Peer) (uint8, bool) { - k.lock.Lock() - defer k.lock.Unlock() - var ins bool - k.conns, _, _, _ = pot.Swap(k.conns, p, Pof, func(v pot.Val) pot.Val { - // if not found live - if v == nil { - ins = true - // insert new online peer into conns - return p - } - // found among live peers, do nothing - return v - }) - if ins && !p.BzzPeer.LightNode { - a := newEntry(p.BzzAddr) - a.conn = p - // insert new online peer into addrs - k.addrs, _, _, _ = pot.Swap(k.addrs, p, Pof, func(v pot.Val) pot.Val { - return a - }) - // send new address count value only if the peer is inserted - if k.addrCountC != nil { - k.addrCountC <- k.addrs.Size() - } - } - log.Trace(k.string()) - // calculate if depth of saturation changed - depth := uint8(k.saturation()) - var changed bool - if depth != k.depth { - changed = true - k.depth = depth - } - k.sendNeighbourhoodDepthChange() - return k.depth, changed -} - -// NeighbourhoodDepthC returns the channel that sends a new kademlia -// neighbourhood depth on each change. -// Not receiving from the returned channel will block On function -// when the neighbourhood depth is changed. -// TODO: Why is this exported, and if it should be; why can't we have more subscribers than one? -func (k *Kademlia) NeighbourhoodDepthC() <-chan int { - k.lock.Lock() - defer k.lock.Unlock() - if k.nDepthC == nil { - k.nDepthC = make(chan int) - } - return k.nDepthC -} - -// sendNeighbourhoodDepthChange sends new neighbourhood depth to k.nDepth channel -// if it is initialized. -func (k *Kademlia) sendNeighbourhoodDepthChange() { - // nDepthC is initialized when NeighbourhoodDepthC is called and returned by it. - // It provides signaling of neighbourhood depth change. - // This part of the code is sending new neighbourhood depth to nDepthC if that condition is met. - if k.nDepthC != nil { - nDepth := depthForPot(k.conns, k.NeighbourhoodSize, k.base) - if nDepth != k.nDepth { - k.nDepth = nDepth - k.nDepthC <- nDepth - } - } -} - -// AddrCountC returns the channel that sends a new -// address count value on each change. -// Not receiving from the returned channel will block Register function -// when address count value changes. -func (k *Kademlia) AddrCountC() <-chan int { - if k.addrCountC == nil { - k.addrCountC = make(chan int) - } - return k.addrCountC -} - -// Off removes a peer from among live peers -func (k *Kademlia) Off(p *Peer) { - k.lock.Lock() - defer k.lock.Unlock() - var del bool - if !p.BzzPeer.LightNode { - k.addrs, _, _, _ = pot.Swap(k.addrs, p, Pof, func(v pot.Val) pot.Val { - // v cannot be nil, must check otherwise we overwrite entry - if v == nil { - panic(fmt.Sprintf("connected peer not found %v", p)) - } - del = true - return newEntry(p.BzzAddr) - }) - } else { - del = true - } - - if del { - k.conns, _, _, _ = pot.Swap(k.conns, p, Pof, func(_ pot.Val) pot.Val { - // v cannot be nil, but no need to check - return nil - }) - // send new address count value only if the peer is deleted - if k.addrCountC != nil { - k.addrCountC <- k.addrs.Size() - } - k.sendNeighbourhoodDepthChange() - } -} - -// EachConn is an iterator with args (base, po, f) applies f to each live peer -// that has proximity order po or less as measured from the base -// if base is nil, kademlia base address is used -func (k *Kademlia) EachConn(base []byte, o int, f func(*Peer, int) bool) { - k.lock.RLock() - defer k.lock.RUnlock() - k.eachConn(base, o, f) -} - -func (k *Kademlia) eachConn(base []byte, o int, f func(*Peer, int) bool) { - if len(base) == 0 { - base = k.base - } - k.conns.EachNeighbour(base, Pof, func(val pot.Val, po int) bool { - if po > o { - return true - } - return f(val.(*Peer), po) - }) -} - -// EachAddr called with (base, po, f) is an iterator applying f to each known peer -// that has proximity order o or less as measured from the base -// if base is nil, kademlia base address is used -func (k *Kademlia) EachAddr(base []byte, o int, f func(*BzzAddr, int) bool) { - k.lock.RLock() - defer k.lock.RUnlock() - k.eachAddr(base, o, f) -} - -func (k *Kademlia) eachAddr(base []byte, o int, f func(*BzzAddr, int) bool) { - if len(base) == 0 { - base = k.base - } - k.addrs.EachNeighbour(base, Pof, func(val pot.Val, po int) bool { - if po > o { - return true - } - return f(val.(*entry).BzzAddr, po) - }) -} - -func (k *Kademlia) NeighbourhoodDepth() (depth int) { - k.lock.RLock() - defer k.lock.RUnlock() - return depthForPot(k.conns, k.NeighbourhoodSize, k.base) -} - -// depthForPot returns the proximity order that defines the distance of -// the nearest neighbour set with cardinality >= NeighbourhoodSize -// if there is altogether less than NeighbourhoodSize peers it returns 0 -// caller must hold the lock -func depthForPot(p *pot.Pot, neighbourhoodSize int, pivotAddr []byte) (depth int) { - if p.Size() <= neighbourhoodSize { - return 0 - } - - // total number of peers in iteration - var size int - - // determining the depth is a two-step process - // first we find the proximity bin of the shallowest of the NeighbourhoodSize peers - // the numeric value of depth cannot be higher than this - var maxDepth int - - f := func(v pot.Val, i int) bool { - // po == 256 means that addr is the pivot address(self) - if i == 256 { - return true - } - size++ - - // this means we have all nn-peers. - // depth is by default set to the bin of the farthest nn-peer - if size == neighbourhoodSize { - maxDepth = i - return false - } - - return true - } - p.EachNeighbour(pivotAddr, Pof, f) - - // the second step is to test for empty bins in order from shallowest to deepest - // if an empty bin is found, this will be the actual depth - // we stop iterating if we hit the maxDepth determined in the first step - p.EachBin(pivotAddr, Pof, 0, func(po int, _ int, f func(func(pot.Val) bool) bool) bool { - if po == depth { - if maxDepth == depth { - return false - } - depth++ - return true - } - return false - }) - - return depth -} - -// callable decides if an address entry represents a callable peer -func (k *Kademlia) callable(e *entry) bool { - // not callable if peer is live or exceeded maxRetries - if e.conn != nil || e.retries > k.MaxRetries { - return false - } - // calculate the allowed number of retries based on time lapsed since last seen - timeAgo := int64(time.Since(e.seenAt)) - div := int64(k.RetryExponent) - div += (150000 - rand.Int63n(300000)) * div / 1000000 - var retries int - for delta := timeAgo; delta > k.RetryInterval; delta /= div { - retries++ - } - // this is never called concurrently, so safe to increment - // peer can be retried again - if retries < e.retries { - log.Trace(fmt.Sprintf("%08x: %v long time since last try (at %v) needed before retry %v, wait only warrants %v", k.BaseAddr()[:4], e, timeAgo, e.retries, retries)) - return false - } - // function to sanction or prevent suggesting a peer - if k.Reachable != nil && !k.Reachable(e.BzzAddr) { - log.Trace(fmt.Sprintf("%08x: peer %v is temporarily not callable", k.BaseAddr()[:4], e)) - return false - } - e.retries++ - log.Trace(fmt.Sprintf("%08x: peer %v is callable", k.BaseAddr()[:4], e)) - - return true -} - -// BaseAddr return the kademlia base address -func (k *Kademlia) BaseAddr() []byte { - return k.base -} - -// String returns kademlia table + kaddb table displayed with ascii -func (k *Kademlia) String() string { - k.lock.RLock() - defer k.lock.RUnlock() - return k.string() -} - -// string returns kademlia table + kaddb table displayed with ascii -// caller must hold the lock -func (k *Kademlia) string() string { - wsrow := " " - var rows []string - - rows = append(rows, "=========================================================================") - rows = append(rows, fmt.Sprintf("%v KΛÐΞMLIΛ hive: queen's address: %x", time.Now().UTC().Format(time.UnixDate), k.BaseAddr()[:3])) - rows = append(rows, fmt.Sprintf("population: %d (%d), NeighbourhoodSize: %d, MinBinSize: %d, MaxBinSize: %d", k.conns.Size(), k.addrs.Size(), k.NeighbourhoodSize, k.MinBinSize, k.MaxBinSize)) - - liverows := make([]string, k.MaxProxDisplay) - peersrows := make([]string, k.MaxProxDisplay) - - depth := depthForPot(k.conns, k.NeighbourhoodSize, k.base) - rest := k.conns.Size() - k.conns.EachBin(k.base, Pof, 0, func(po, size int, f func(func(val pot.Val) bool) bool) bool { - var rowlen int - if po >= k.MaxProxDisplay { - po = k.MaxProxDisplay - 1 - } - row := []string{fmt.Sprintf("%2d", size)} - rest -= size - f(func(val pot.Val) bool { - e := val.(*Peer) - row = append(row, fmt.Sprintf("%x", e.Address()[:2])) - rowlen++ - return rowlen < 4 - }) - r := strings.Join(row, " ") - r = r + wsrow - liverows[po] = r[:31] - return true - }) - - k.addrs.EachBin(k.base, Pof, 0, func(po, size int, f func(func(val pot.Val) bool) bool) bool { - var rowlen int - if po >= k.MaxProxDisplay { - po = k.MaxProxDisplay - 1 - } - if size < 0 { - panic("wtf") - } - row := []string{fmt.Sprintf("%2d", size)} - // we are displaying live peers too - f(func(val pot.Val) bool { - e := val.(*entry) - row = append(row, Label(e)) - rowlen++ - return rowlen < 4 - }) - peersrows[po] = strings.Join(row, " ") - return true - }) - - for i := 0; i < k.MaxProxDisplay; i++ { - if i == depth { - rows = append(rows, fmt.Sprintf("============ DEPTH: %d ==========================================", i)) - } - left := liverows[i] - right := peersrows[i] - if len(left) == 0 { - left = " 0 " - } - if len(right) == 0 { - right = " 0" - } - rows = append(rows, fmt.Sprintf("%03d %v | %v", i, left, right)) - } - rows = append(rows, "=========================================================================") - return "\n" + strings.Join(rows, "\n") -} - -// PeerPot keeps info about expected nearest neighbours -// used for testing only -// TODO move to separate testing tools file -type PeerPot struct { - NNSet [][]byte -} - -// NewPeerPotMap creates a map of pot record of *BzzAddr with keys -// as hexadecimal representations of the address. -// the NeighbourhoodSize of the passed kademlia is used -// used for testing only -// TODO move to separate testing tools file -func NewPeerPotMap(neighbourhoodSize int, addrs [][]byte) map[string]*PeerPot { - - // create a table of all nodes for health check - np := pot.NewPot(nil, 0) - for _, addr := range addrs { - np, _, _ = pot.Add(np, addr, Pof) - } - ppmap := make(map[string]*PeerPot) - - // generate an allknowing source of truth for connections - // for every kademlia passed - for i, a := range addrs { - - // actual kademlia depth - depth := depthForPot(np, neighbourhoodSize, a) - - // all nn-peers - var nns [][]byte - - // iterate through the neighbours, going from the deepest to the shallowest - np.EachNeighbour(a, Pof, func(val pot.Val, po int) bool { - addr := val.([]byte) - // po == 256 means that addr is the pivot address(self) - // we do not include self in the map - if po == 256 { - return true - } - // append any neighbors found - // a neighbor is any peer in or deeper than the depth - if po >= depth { - nns = append(nns, addr) - return true - } - return false - }) - - log.Trace(fmt.Sprintf("%x PeerPotMap NNS: %s", addrs[i][:4], LogAddrs(nns))) - ppmap[common.Bytes2Hex(a)] = &PeerPot{ - NNSet: nns, - } - } - return ppmap -} - -// saturation iterates through all peers and -// returns the smallest po value in which the node has less than n peers -// if the iterator reaches depth, then value for depth is returned -// TODO move to separate testing tools file -// TODO this function will stop at the first bin with less than MinBinSize peers, even if there are empty bins between that bin and the depth. This may not be correct behavior -func (k *Kademlia) saturation() int { - prev := -1 - k.addrs.EachBin(k.base, Pof, 0, func(po, size int, f func(func(val pot.Val) bool) bool) bool { - prev++ - return prev == po && size >= k.MinBinSize - }) - // TODO evaluate whether this check cannot just as well be done within the eachbin - depth := depthForPot(k.conns, k.NeighbourhoodSize, k.base) - if depth < prev { - return depth - } - return prev -} - -// knowNeighbours tests if all neighbours in the peerpot -// are found among the peers known to the kademlia -// It is used in Healthy function for testing only -// TODO move to separate testing tools file -func (k *Kademlia) knowNeighbours(addrs [][]byte) (got bool, n int, missing [][]byte) { - pm := make(map[string]bool) - depth := depthForPot(k.conns, k.NeighbourhoodSize, k.base) - // create a map with all peers at depth and deeper known in the kademlia - k.eachAddr(nil, 255, func(p *BzzAddr, po int) bool { - // in order deepest to shallowest compared to the kademlia base address - // all bins (except self) are included (0 <= bin <= 255) - if po < depth { - return false - } - pk := common.Bytes2Hex(p.Address()) - pm[pk] = true - return true - }) - - // iterate through nearest neighbors in the peerpot map - // if we can't find the neighbor in the map we created above - // then we don't know all our neighbors - // (which sadly is all too common in modern society) - var gots int - var culprits [][]byte - for _, p := range addrs { - pk := common.Bytes2Hex(p) - if pm[pk] { - gots++ - } else { - log.Trace(fmt.Sprintf("%08x: known nearest neighbour %s not found", k.base, pk)) - culprits = append(culprits, p) - } - } - return gots == len(addrs), gots, culprits -} - -// connectedNeighbours tests if all neighbours in the peerpot -// are currently connected in the kademlia -// It is used in Healthy function for testing only -func (k *Kademlia) connectedNeighbours(peers [][]byte) (got bool, n int, missing [][]byte) { - pm := make(map[string]bool) - - // create a map with all peers at depth and deeper that are connected in the kademlia - // in order deepest to shallowest compared to the kademlia base address - // all bins (except self) are included (0 <= bin <= 255) - depth := depthForPot(k.conns, k.NeighbourhoodSize, k.base) - k.eachConn(nil, 255, func(p *Peer, po int) bool { - if po < depth { - return false - } - pk := common.Bytes2Hex(p.Address()) - pm[pk] = true - return true - }) - - // iterate through nearest neighbors in the peerpot map - // if we can't find the neighbor in the map we created above - // then we don't know all our neighbors - var gots int - var culprits [][]byte - for _, p := range peers { - pk := common.Bytes2Hex(p) - if pm[pk] { - gots++ - } else { - log.Trace(fmt.Sprintf("%08x: ExpNN: %s not found", k.base, pk)) - culprits = append(culprits, p) - } - } - return gots == len(peers), gots, culprits -} - -// Health state of the Kademlia -// used for testing only -type Health struct { - KnowNN bool // whether node knows all its neighbours - CountKnowNN int // amount of neighbors known - MissingKnowNN [][]byte // which neighbours we should have known but we don't - ConnectNN bool // whether node is connected to all its neighbours - CountConnectNN int // amount of neighbours connected to - MissingConnectNN [][]byte // which neighbours we should have been connected to but we're not - Saturated bool // whether we are connected to all the peers we would have liked to - Hive string -} - -// Healthy reports the health state of the kademlia connectivity -// -// The PeerPot argument provides an all-knowing view of the network -// The resulting Health object is a result of comparisons between -// what is the actual composition of the kademlia in question (the receiver), and -// what SHOULD it have been when we take all we know about the network into consideration. -// -// used for testing only -func (k *Kademlia) Healthy(pp *PeerPot) *Health { - k.lock.RLock() - defer k.lock.RUnlock() - gotnn, countgotnn, culpritsgotnn := k.connectedNeighbours(pp.NNSet) - knownn, countknownn, culpritsknownn := k.knowNeighbours(pp.NNSet) - depth := depthForPot(k.conns, k.NeighbourhoodSize, k.base) - saturated := k.saturation() < depth - log.Trace(fmt.Sprintf("%08x: healthy: knowNNs: %v, gotNNs: %v, saturated: %v\n", k.base, knownn, gotnn, saturated)) - return &Health{ - KnowNN: knownn, - CountKnowNN: countknownn, - MissingKnowNN: culpritsknownn, - ConnectNN: gotnn, - CountConnectNN: countgotnn, - MissingConnectNN: culpritsgotnn, - Saturated: saturated, - Hive: k.string(), - } -} diff --git a/swarm/network/kademlia_test.go b/swarm/network/kademlia_test.go deleted file mode 100644 index 492c665cccae..000000000000 --- a/swarm/network/kademlia_test.go +++ /dev/null @@ -1,890 +0,0 @@ -// Copyright 2018 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 network - -import ( - "bytes" - "fmt" - "os" - "testing" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/protocols" - "github.com/nebulaai/nbai-node/swarm/pot" -) - -func init() { - h := log.LvlFilterHandler(log.LvlWarn, log.StreamHandler(os.Stderr, log.TerminalFormat(true))) - log.Root().SetHandler(h) -} - -func testKadPeerAddr(s string) *BzzAddr { - a := pot.NewAddressFromString(s) - return &BzzAddr{OAddr: a, UAddr: a} -} - -func newTestKademliaParams() *KadParams { - params := NewKadParams() - // TODO why is this 1? - params.MinBinSize = 1 - params.NeighbourhoodSize = 2 - return params -} - -func newTestKademlia(b string) *Kademlia { - base := pot.NewAddressFromString(b) - return NewKademlia(base, newTestKademliaParams()) -} - -func newTestKadPeer(k *Kademlia, s string, lightNode bool) *Peer { - return NewPeer(&BzzPeer{BzzAddr: testKadPeerAddr(s), LightNode: lightNode}, k) -} - -func On(k *Kademlia, ons ...string) { - for _, s := range ons { - k.On(newTestKadPeer(k, s, false)) - } -} - -func Off(k *Kademlia, offs ...string) { - for _, s := range offs { - k.Off(newTestKadPeer(k, s, false)) - } -} - -func Register(k *Kademlia, regs ...string) { - var as []*BzzAddr - for _, s := range regs { - as = append(as, testKadPeerAddr(s)) - } - err := k.Register(as...) - if err != nil { - panic(err.Error()) - } -} - -// tests the validity of neighborhood depth calculations -// -// in particular, it tests that if there are one or more consecutive -// empty bins above the farthest "nearest neighbor-peer" then -// the depth should be set at the farthest of those empty bins -// -// TODO: Make test adapt to change in NeighbourhoodSize -func TestNeighbourhoodDepth(t *testing.T) { - baseAddressBytes := RandomAddr().OAddr - kad := NewKademlia(baseAddressBytes, NewKadParams()) - - baseAddress := pot.NewAddressFromBytes(baseAddressBytes) - - // generate the peers - var peers []*Peer - for i := 0; i < 7; i++ { - addr := pot.RandomAddressAt(baseAddress, i) - peers = append(peers, newTestDiscoveryPeer(addr, kad)) - } - var sevenPeers []*Peer - for i := 0; i < 2; i++ { - addr := pot.RandomAddressAt(baseAddress, 7) - sevenPeers = append(sevenPeers, newTestDiscoveryPeer(addr, kad)) - } - - testNum := 0 - // first try with empty kademlia - depth := kad.NeighbourhoodDepth() - if depth != 0 { - t.Fatalf("%d expected depth 0, was %d", testNum, depth) - } - testNum++ - - // add one peer on 7 - kad.On(sevenPeers[0]) - depth = kad.NeighbourhoodDepth() - if depth != 0 { - t.Fatalf("%d expected depth 0, was %d", testNum, depth) - } - testNum++ - - // add a second on 7 - kad.On(sevenPeers[1]) - depth = kad.NeighbourhoodDepth() - if depth != 0 { - t.Fatalf("%d expected depth 0, was %d", testNum, depth) - } - testNum++ - - // add from 0 to 6 - for i, p := range peers { - kad.On(p) - depth = kad.NeighbourhoodDepth() - if depth != i+1 { - t.Fatalf("%d.%d expected depth %d, was %d", i+1, testNum, i, depth) - } - } - testNum++ - - kad.Off(sevenPeers[1]) - depth = kad.NeighbourhoodDepth() - if depth != 6 { - t.Fatalf("%d expected depth 6, was %d", testNum, depth) - } - testNum++ - - kad.Off(peers[4]) - depth = kad.NeighbourhoodDepth() - if depth != 4 { - t.Fatalf("%d expected depth 4, was %d", testNum, depth) - } - testNum++ - - kad.Off(peers[3]) - depth = kad.NeighbourhoodDepth() - if depth != 3 { - t.Fatalf("%d expected depth 3, was %d", testNum, depth) - } - testNum++ -} - -// TestHealthStrict tests the simplest definition of health -// Which means whether we are connected to all neighbors we know of -func TestHealthStrict(t *testing.T) { - - // base address is all zeros - // no peers - // unhealthy (and lonely) - k := newTestKademlia("11111111") - assertHealth(t, k, false, false) - - // know one peer but not connected - // unhealthy - Register(k, "11100000") - log.Trace(k.String()) - assertHealth(t, k, false, false) - - // know one peer and connected - // healthy - On(k, "11100000") - assertHealth(t, k, true, false) - - // know two peers, only one connected - // unhealthy - Register(k, "11111100") - log.Trace(k.String()) - assertHealth(t, k, false, false) - - // know two peers and connected to both - // healthy - On(k, "11111100") - assertHealth(t, k, true, false) - - // know three peers, connected to the two deepest - // healthy - Register(k, "00000000") - log.Trace(k.String()) - assertHealth(t, k, true, false) - - // know three peers, connected to all three - // healthy - On(k, "00000000") - assertHealth(t, k, true, false) - - // add fourth peer deeper than current depth - // unhealthy - Register(k, "11110000") - log.Trace(k.String()) - assertHealth(t, k, false, false) - - // connected to three deepest peers - // healthy - On(k, "11110000") - assertHealth(t, k, true, false) - - // add additional peer in same bin as deepest peer - // unhealthy - Register(k, "11111101") - log.Trace(k.String()) - assertHealth(t, k, false, false) - - // four deepest of five peers connected - // healthy - On(k, "11111101") - assertHealth(t, k, true, false) -} - -func assertHealth(t *testing.T, k *Kademlia, expectHealthy bool, expectSaturation bool) { - t.Helper() - kid := common.Bytes2Hex(k.BaseAddr()) - addrs := [][]byte{k.BaseAddr()} - k.EachAddr(nil, 255, func(addr *BzzAddr, po int) bool { - addrs = append(addrs, addr.Address()) - return true - }) - - pp := NewPeerPotMap(k.NeighbourhoodSize, addrs) - healthParams := k.Healthy(pp[kid]) - - // definition of health, all conditions but be true: - // - we at least know one peer - // - we know all neighbors - // - we are connected to all known neighbors - health := healthParams.KnowNN && healthParams.ConnectNN && healthParams.CountKnowNN > 0 - if expectHealthy != health { - t.Fatalf("expected kademlia health %v, is %v\n%v", expectHealthy, health, k.String()) - } -} - -func testSuggestPeer(k *Kademlia, expAddr string, expPo int, expWant bool) error { - addr, o, want := k.SuggestPeer() - log.Trace("suggestpeer return", "a", addr, "o", o, "want", want) - if binStr(addr) != expAddr { - return fmt.Errorf("incorrect peer address suggested. expected %v, got %v", expAddr, binStr(addr)) - } - if o != expPo { - return fmt.Errorf("incorrect prox order suggested. expected %v, got %v", expPo, o) - } - if want != expWant { - return fmt.Errorf("expected SuggestPeer to want peers: %v", expWant) - } - return nil -} - -func binStr(a *BzzAddr) string { - if a == nil { - return "" - } - return pot.ToBin(a.Address())[:8] -} - -// TODO explain why this bug occurred and how it should have been mitigated -func TestSuggestPeerBug(t *testing.T) { - // 2 row gap, unsaturated proxbin, no callables -> want PO 0 - k := newTestKademlia("00000000") - On(k, - "10000000", "11000000", - "01000000", - - "00010000", "00011000", - ) - Off(k, - "01000000", - ) - err := testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatal(err.Error()) - } -} - -func TestSuggestPeerFindPeers(t *testing.T) { - t.Skip("The SuggestPeers implementation seems to have weaknesses exposed by the change in the new depth calculation. The results are no longer predictable") - - testnum := 0 - // test 0 - // 2 row gap, unsaturated proxbin, no callables -> want PO 0 - k := newTestKademlia("00000000") - On(k, "00100000") - err := testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 1 - // 2 row gap, saturated proxbin, no callables -> want PO 0 - On(k, "00010000") - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 2 - // 1 row gap (1 less), saturated proxbin, no callables -> want PO 1 - On(k, "10000000") - err = testSuggestPeer(k, "", 1, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 3 - // no gap (1 less), saturated proxbin, no callables -> do not want more - On(k, "01000000", "00100001") - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 4 - // oversaturated proxbin, > do not want more - On(k, "00100001") - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 5 - // reintroduce gap, disconnected peer callable - Off(k, "01000000") - log.Trace(k.String()) - err = testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 6 - // second time disconnected peer not callable - // with reasonably set Interval - log.Trace("foo") - log.Trace(k.String()) - err = testSuggestPeer(k, "", 1, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 6 - // on and off again, peer callable again - On(k, "01000000") - Off(k, "01000000") - log.Trace(k.String()) - err = testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 7 - // new closer peer appears, it is immediately wanted - On(k, "01000000") - Register(k, "00010001") - err = testSuggestPeer(k, "00010001", 0, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 8 - // PO1 disconnects - On(k, "00010001") - log.Info(k.String()) - Off(k, "01000000") - log.Info(k.String()) - // second time, gap filling - err = testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 9 - On(k, "01000000") - log.Info(k.String()) - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 10 - k.MinBinSize = 2 - log.Info(k.String()) - err = testSuggestPeer(k, "", 0, true) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 11 - Register(k, "01000001") - log.Info(k.String()) - err = testSuggestPeer(k, "01000001", 0, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 12 - On(k, "10000001") - log.Trace(fmt.Sprintf("Kad:\n%v", k.String())) - err = testSuggestPeer(k, "", 1, true) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 13 - On(k, "01000001") - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 14 - k.MinBinSize = 3 - Register(k, "10000010") - err = testSuggestPeer(k, "10000010", 0, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 15 - On(k, "10000010") - err = testSuggestPeer(k, "", 1, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 16 - On(k, "01000010") - err = testSuggestPeer(k, "", 2, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 17 - On(k, "00100010") - err = testSuggestPeer(k, "", 3, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - - // test 18 - On(k, "00010010") - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatalf("%d %v", testnum, err.Error()) - } - testnum++ - -} - -// a node should stay in the address book if it's removed from the kademlia -func TestOffEffectingAddressBookNormalNode(t *testing.T) { - k := newTestKademlia("00000000") - // peer added to kademlia - k.On(newTestKadPeer(k, "01000000", false)) - // peer should be in the address book - if k.addrs.Size() != 1 { - t.Fatal("known peer addresses should contain 1 entry") - } - // peer should be among live connections - if k.conns.Size() != 1 { - t.Fatal("live peers should contain 1 entry") - } - // remove peer from kademlia - k.Off(newTestKadPeer(k, "01000000", false)) - // peer should be in the address book - if k.addrs.Size() != 1 { - t.Fatal("known peer addresses should contain 1 entry") - } - // peer should not be among live connections - if k.conns.Size() != 0 { - t.Fatal("live peers should contain 0 entry") - } -} - -// a light node should not be in the address book -func TestOffEffectingAddressBookLightNode(t *testing.T) { - k := newTestKademlia("00000000") - // light node peer added to kademlia - k.On(newTestKadPeer(k, "01000000", true)) - // peer should not be in the address book - if k.addrs.Size() != 0 { - t.Fatal("known peer addresses should contain 0 entry") - } - // peer should be among live connections - if k.conns.Size() != 1 { - t.Fatal("live peers should contain 1 entry") - } - // remove peer from kademlia - k.Off(newTestKadPeer(k, "01000000", true)) - // peer should not be in the address book - if k.addrs.Size() != 0 { - t.Fatal("known peer addresses should contain 0 entry") - } - // peer should not be among live connections - if k.conns.Size() != 0 { - t.Fatal("live peers should contain 0 entry") - } -} - -func TestSuggestPeerRetries(t *testing.T) { - k := newTestKademlia("00000000") - k.RetryInterval = int64(300 * time.Millisecond) // cycle - k.MaxRetries = 50 - k.RetryExponent = 2 - sleep := func(n int) { - ts := k.RetryInterval - for i := 1; i < n; i++ { - ts *= int64(k.RetryExponent) - } - time.Sleep(time.Duration(ts)) - } - - Register(k, "01000000") - On(k, "00000001", "00000010") - err := testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - sleep(1) - err = testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - sleep(1) - err = testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - sleep(2) - err = testSuggestPeer(k, "01000000", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - - sleep(2) - err = testSuggestPeer(k, "", 0, false) - if err != nil { - t.Fatal(err.Error()) - } - -} - -func TestKademliaHiveString(t *testing.T) { - k := newTestKademlia("00000000") - On(k, "01000000", "00100000") - Register(k, "10000000", "10000001") - k.MaxProxDisplay = 8 - h := k.String() - expH := "\n=========================================================================\nMon Feb 27 12:10:28 UTC 2017 KΛÐΞMLIΛ hive: queen's address: 000000\npopulation: 2 (4), NeighbourhoodSize: 2, MinBinSize: 1, MaxBinSize: 4\n============ DEPTH: 0 ==========================================\n000 0 | 2 8100 (0) 8000 (0)\n001 1 4000 | 1 4000 (0)\n002 1 2000 | 1 2000 (0)\n003 0 | 0\n004 0 | 0\n005 0 | 0\n006 0 | 0\n007 0 | 0\n=========================================================================" - if expH[104:] != h[104:] { - t.Fatalf("incorrect hive output. expected %v, got %v", expH, h) - } -} - -// testKademliaCase constructs the kademlia and PeerPot map to validate -// the SuggestPeer and Healthy methods for provided hex-encoded addresses. -// Argument pivotAddr is the address of the kademlia. -func testKademliaCase(t *testing.T, pivotAddr string, addrs ...string) { - - t.Skip("this test relies on SuggestPeer which is now not reliable. See description in TestSuggestPeerFindPeers") - addr := common.Hex2Bytes(pivotAddr) - var byteAddrs [][]byte - for _, ahex := range addrs { - byteAddrs = append(byteAddrs, common.Hex2Bytes(ahex)) - } - - k := NewKademlia(addr, NewKadParams()) - - // our pivot kademlia is the last one in the array - for _, a := range byteAddrs { - if bytes.Equal(a, addr) { - continue - } - p := &BzzAddr{OAddr: a, UAddr: a} - if err := k.Register(p); err != nil { - t.Fatalf("a %x addr %x: %v", a, addr, err) - } - } - - ppmap := NewPeerPotMap(k.NeighbourhoodSize, byteAddrs) - - pp := ppmap[pivotAddr] - - for { - a, _, _ := k.SuggestPeer() - if a == nil { - break - } - k.On(NewPeer(&BzzPeer{BzzAddr: a}, k)) - } - - h := k.Healthy(pp) - if !(h.ConnectNN && h.KnowNN && h.CountKnowNN > 0) { - t.Fatalf("not healthy: %#v\n%v", h, k.String()) - } -} - -/* -The regression test for the following invalid kademlia edge case. - -Addresses used in this test are discovered as part of the simulation network -in higher level tests for streaming. They were generated randomly. - -========================================================================= -Mon Apr 9 12:18:24 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 7efef1 -population: 9 (49), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4 -000 2 d7e5 ec56 | 18 ec56 (0) d7e5 (0) d9e0 (0) c735 (0) -001 2 18f1 3176 | 14 18f1 (0) 10bb (0) 10d1 (0) 0421 (0) -002 2 52aa 47cd | 11 52aa (0) 51d9 (0) 5161 (0) 5130 (0) -003 1 646e | 1 646e (0) -004 0 | 3 769c (0) 76d1 (0) 7656 (0) -============ DEPTH: 5 ========================================== -005 1 7a48 | 1 7a48 (0) -006 1 7cbd | 1 7cbd (0) -007 0 | 0 -008 0 | 0 -009 0 | 0 -010 0 | 0 -011 0 | 0 -012 0 | 0 -013 0 | 0 -014 0 | 0 -015 0 | 0 -========================================================================= -*/ -func TestKademliaCase1(t *testing.T) { - testKademliaCase(t, - "7efef1c41d77f843ad167be95f6660567eb8a4a59f39240000cce2e0d65baf8e", - "ec560e6a4806aa37f147ee83687f3cf044d9953e61eedb8c34b6d50d9e2c5623", - "646e9540c84f6a2f9cf6585d45a4c219573b4fd1b64a3c9a1386fc5cf98c0d4d", - "18f13c5fba653781019025ab10e8d2fdc916d6448729268afe9e928ffcdbb8e8", - "317617acf99b4ffddda8a736f8fc6c6ede0bf690bc23d834123823e6d03e2f69", - "d7e52d9647a5d1c27a68c3ee65d543be3947ae4b68537b236d71ef9cb15fb9ab", - "7a48f75f8ca60487ae42d6f92b785581b40b91f2da551ae73d5eae46640e02e8", - "7cbd42350bde8e18ae5b955b5450f8e2cef3419f92fbf5598160c60fd78619f0", - "52aa3ddec61f4d48dd505a2385403c634f6ad06ee1d99c5c90a5ba6006f9af9c", - "47cdb6fa93eeb8bc91a417ff4e3b14a9c2ea85137462e2f575fae97f0c4be60d", - "5161943eb42e2a03e715fe8afa1009ff5200060c870ead6ab103f63f26cb107f", - "a38eaa1255f76bf883ca0830c86e8c4bb7eed259a8348aae9b03f21f90105bee", - "b2522bdf1ab26f324e75424fdf6e493b47e8a27687fe76347607b344fc010075", - "5bd7213964efb2580b91d02ac31ef126838abeba342f5dbdbe8d4d03562671a2", - "0b531adb82744768b694d7f94f73d4f0c9de591266108daeb8c74066bfc9c9ca", - "28501f59f70e888d399570145ed884353e017443c675aa12731ada7c87ea14f7", - "4a45f1fc63e1a9cb9dfa44c98da2f3d20c2923e5d75ff60b2db9d1bdb0c54d51", - "b193431ee35cd32de95805e7c1c749450c47486595aae7195ea6b6019a64fd61", - "baebf36a1e35a7ed834e1c72faf44ba16c159fa47d3289ceb3ca35fefa8739b5", - "a3659bd32e05fa36c8d20dbaaed8362bf1a8a7bd116aed62d8a43a2efbdf513f", - "10d1b50881a4770ebebdd0a75589dabb931e6716747b0f65fd6b080b88c4fdb6", - "3c76b8ca5c7ce6a03320646826213f59229626bf5b9d25da0c3ec0662dcb8ff3", - "4d72a04ddeb851a68cd197ef9a92a3e2ff01fbbff638e64929dd1a9c2e150112", - "c7353d320987956075b5bc1668571c7a36c800d5598fdc4832ec6569561e15d1", - "d9e0c7c90878c20ab7639d5954756f54775404b3483407fe1b483635182734f6", - "8fca67216b7939c0824fb06c5279901a94da41da9482b000f56df9906736ee75", - "460719d7f7aa7d7438f0eaf30333484fa3bd0f233632c10ba89e6e46dd3604be", - "0421d92c8a1c79ed5d01305a3d25aaf22a8f5f9e3d4bc80da47ee16ce20465fe", - "3441d9d9c0f05820a1bb6459fc7d8ef266a1bd929e7db939a10f544efe8261ea", - "ab198a66c293586746758468c610e5d3914d4ce629147eff6dd55a31f863ff8f", - "3a1c8c16b0763f3d2c35269f454ff779d1255e954d2deaf6c040fb3f0bcdc945", - "5561c0ea3b203e173b11e6aa9d0e621a4e10b1d8b178b8fe375220806557b823", - "7656caccdc79cd8d7ce66d415cc96a718e8271c62fb35746bfc2b49faf3eebf3", - "5130594fd54c1652cf2debde2c4204573ed76555d1e26757fe345b409af1544a", - "76d1e83c71ca246d042e37ff1db181f2776265fbcfdc890ce230bfa617c9c2f0", - "89580231962624c53968c1b0095b4a2732b2a2640a19fdd7d21fd064fcc0a5ef", - "3d10d001fff44680c7417dd66ecf2e984f0baa20a9bbcea348583ba5ff210c4f", - "43754e323f0f3a1155b1852bd6edd55da86b8c4cfe3df8b33733fca50fc202b8", - "a9e7b1bb763ae6452ddcacd174993f82977d81a85206bb2ae3c842e2d8e19b4c", - "10bb07da7bc7c7757f74149eff167d528a94a253cdc694a863f4d50054c00b6d", - "28f0bc1b44658548d6e05dd16d4c2fe77f1da5d48b6774bc4263b045725d0c19", - "835fbbf1d16ba7347b6e2fc552d6e982148d29c624ea20383850df3c810fa8fc", - "8e236c56a77d7f46e41e80f7092b1a68cd8e92f6156365f41813ad1ca2c6b6f3", - "51d9c857e9238c49186e37b4eccf17a82de3d5739f026f6043798ab531456e73", - "bbddf7db6a682225301f36a9fd5b0d0121d2951753e1681295f3465352ad511f", - "2690a910c33ee37b91eb6c4e0731d1d345e2dc3b46d308503a6e85bbc242c69e", - "769ce86aa90b518b7ed382f9fdacfbed93574e18dc98fe6c342e4f9f409c2d5a", - "ba3bebec689ce51d3e12776c45f80d25164fdfb694a8122d908081aaa2e7122c", - "3a51f4146ea90a815d0d283d1ceb20b928d8b4d45875e892696986a3c0d8fb9b", - "81968a2d8fb39114342ee1da85254ec51e0608d7f0f6997c2a8354c260a71009", - ) -} - -/* -The regression test for the following invalid kademlia edge case. - -Addresses used in this test are discovered as part of the simulation network -in higher level tests for streaming. They were generated randomly. - -========================================================================= -Mon Apr 9 18:43:48 UTC 2018 KΛÐΞMLIΛ hive: queen's address: bc7f3b -population: 9 (49), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4 -000 2 0f49 67ff | 28 0f49 (0) 0211 (0) 07b2 (0) 0703 (0) -001 2 e84b f3a4 | 13 f3a4 (0) e84b (0) e58b (0) e60b (0) -002 1 8dba | 1 8dba (0) -003 2 a008 ad72 | 2 ad72 (0) a008 (0) -004 0 | 3 b61f (0) b27f (0) b027 (0) -============ DEPTH: 5 ========================================== -005 1 ba19 | 1 ba19 (0) -006 0 | 0 -007 1 bdd6 | 1 bdd6 (0) -008 0 | 0 -009 0 | 0 -010 0 | 0 -011 0 | 0 -012 0 | 0 -013 0 | 0 -014 0 | 0 -015 0 | 0 -========================================================================= -*/ -func TestKademliaCase2(t *testing.T) { - testKademliaCase(t, - "bc7f3b6a4a7e3c91b100ca6680b6c06ff407972b88956324ca853295893e0237", "67ffb61d3aa27449d277016188f35f19e2321fbda5008c68cf6303faa080534f", "600cd54c842eadac1729c04abfc369bc244572ca76117105b9dd910283b82730", "d955a05409650de151218557425105a8aa2867bb6a0e0462fa1cf90abcf87ad6", "7a6b726de45abdf7bb3e5fd9fb0dc8932270ca4dedef92238c80c05bcdb570e3", "263e99424ebfdb652adb4e3dcd27d59e11bb7ae1c057b3ef6f390d0228006254", "ba195d1a53aafde68e661c64d39db8c2a73505bf336125c15c3560de3b48b7ed", "3458c762169937115f67cabc35a6c384ed70293a8aec37b077a6c1b8e02d510e", "4ef4dc2e28ac6efdba57e134ac24dd4e0be68b9d54f7006515eb9509105f700c", "2a8782b79b0c24b9714dfd2c8ff1932bebc08aa6520b4eaeaa59ff781238890c", "625d02e960506f4524e9cdeac85b33faf3ea437fceadbd478b62b78720cf24fc", "e051a36a8c8637f520ba259c9ed3fadaf740dadc6a04c3f0e21778ebd4cd6ac4", "e34bc014fa2504f707bb3d904872b56c2fa250bee3cb19a147a0418541f1bd90", "28036dc79add95799916893890add5d8972f3b95325a509d6ded3d448f4dc652", "1b013c407794fa2e4c955d8f51cbc6bd78588a174b6548246b291281304b5409", "34f71b68698e1534095ff23ee9c35bf64c7f12b8463e7c6f6b19c25cf03928b4", "c712c6e9bbb7076832972a95890e340b94ed735935c3c0bb788e61f011b59479", "a008d5becdcda4b9dbfdaafc3cec586cf61dcf2d4b713b6168fff02e3b9f0b08", "29de15555cdbebaab214009e416ee92f947dcec5dab9894129f50f1b17138f34", "5df9449f700bd4b5a23688b68b293f2e92fa6ca524c93bc6bb9936efba9d9ada", "3ab0168a5f87fedc6a39b53c628256ac87a98670d8691bbdaaecec22418d13a2", "1ee299b2d2a74a568494130e6869e66d57982d345c482a0e0eeb285ac219ae3b", "e0e0e3b860cea9b7a74cf1b0675cc632dc64e80a02f20bbc5e96e2e8bb670606", "dc1ba6f169b0fcdcca021dcebaf39fe5d4875e7e69b854fad65687c1d7719ec0", "d321f73e42fcfb1d3a303eddf018ca5dffdcfd5567cd5ec1212f045f6a07e47d", "070320c3da7b542e5ca8aaf6a0a53d2bb5113ed264ab1db2dceee17c729edcb1", "17d314d65fdd136b50d182d2c8f5edf16e7838c2be8cf2c00abe4b406dbcd1d8", "e60b99e0a06f7d2d99d84085f67cdf8cc22a9ae22c339365d80f90289834a2b4", "02115771e18932e1f67a45f11f5bf743c5dae97fbc477d34d35c996012420eac", "3102a40eb2e5060353dd19bf61eeec8782dd1bebfcb57f4c796912252b591827", "8dbaf231062f2dc7ddaba5f9c7761b0c21292be51bf8c2ef503f31d4a2f63f79", "b02787b713c83a9f9183216310f04251994e04c2763a9024731562e8978e7cc4", "b27fe6cd33989e10909ce794c4b0b88feae286b614a59d49a3444c1a7b51ea82", "07b2d2c94fdc6fd148fe23be2ed9eff54f5e12548f29ed8416e6860fc894466f", "e58bf9f451ef62ac44ff0a9bb0610ec0fd14d423235954f0d3695e83017cbfc4", "bdd600b91bb79d1ee0053b854de308cfaa7e2abce575ea6815a0a7b3449609c2", "0f49c93c1edc7999920b21977cedd51a763940dac32e319feb9c1df2da0f3071", "7cbf0297cd41acf655cd6f960d7aaf61479edb4189d5c001cbc730861f0deb41", "79265193778d87ad626a5f59397bc075872d7302a12634ce2451a767d0a82da2", "2fe7d705f7c370b9243dbaafe007d555ff58d218822fca49d347b12a0282457c", "e84bc0c83d05e55a0080eed41dda5a795da4b9313a4da697142e69a65834cbb3", "cc4d278bd9aa0e9fb3cd8d2e0d68fb791aab5de4b120b845c409effbed47a180", "1a2317a8646cd4b6d3c4aa4cc25f676533abb689cf180787db216880a1239ad8", "cbafd6568cf8e99076208e6b6843f5808a7087897c67aad0c54694669398f889", "7b7c8357255fc37b4dae0e1af61589035fd39ff627e0938c6b3da8b4e4ec5d23", "2b8d782c1f5bac46c922cf439f6aa79f91e9ba5ffc0020d58455188a2075b334", "b61f45af2306705740742e76197a119235584ced01ef3f7cf3d4370f6c557cd1", "2775612e7cdae2780bf494c370bdcbe69c55e4a1363b1dc79ea0135e61221cce", "f3a49bb22f40885e961299abfa697a7df690a79f067bf3a4847a3ad48d826c9f", "ad724ac218dc133c0aadf4618eae21fdd0c2f3787af279846b49e2b4f97ff167", - ) -} - -/* -The regression test for the following invalid kademlia edge case. - -Addresses used in this test are discovered as part of the simulation network -in higher level tests for streaming. They were generated randomly. - -========================================================================= -Mon Apr 9 19:04:35 UTC 2018 KΛÐΞMLIΛ hive: queen's address: b4822e -population: 8 (49), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4 -000 2 786c 774b | 29 774b (0) 786c (0) 7a79 (0) 7d2f (0) -001 2 d9de cf19 | 10 cf19 (0) d9de (0) d2ff (0) d2a2 (0) -002 2 8ca1 8d74 | 5 8d74 (0) 8ca1 (0) 9793 (0) 9f51 (0) -003 0 | 0 -004 0 | 3 bfac (0) bcbb (0) bde9 (0) -005 0 | 0 -============ DEPTH: 6 ========================================== -006 1 b660 | 1 b660 (0) -007 0 | 0 -008 1 b450 | 1 b450 (0) -009 0 | 0 -010 0 | 0 -011 0 | 0 -012 0 | 0 -013 0 | 0 -014 0 | 0 -015 0 | 0 -========================================================================= -*/ -func TestKademliaCase3(t *testing.T) { - testKademliaCase(t, - "b4822e874a01b94ac3a35c821e6db131e785c2fcbb3556e84b36102caf09b091", "2ecf54ea38d58f9cfc3862e54e5854a7c506fbc640e0b38e46d7d45a19794999", "442374092be50fc7392e8dd3f6fab3158ff7f14f26ff98060aed9b2eecf0b97d", "b450a4a67fcfa3b976cf023d8f1f15052b727f712198ce901630efe2f95db191", "9a7291638eb1c989a6dd6661a42c735b23ac6605b5d3e428aa5ffe650e892c85", "67f62eeab9804cfcac02b25ebeab9113d1b9d03dd5200b1c5a324cc0163e722f", "2e4a0e4b53bca4a9d7e2734150e9f579f29a255ade18a268461b20d026c9ee90", "30dd79c5fcdaa1b106f6960c45c9fde7c046aa3d931088d98c52ab759d0b2ac4", "97936fb5a581e59753c54fa5feec493714f2218245f61f97a62eafd4699433e4", "3a2899b6e129e3e193f6e2aefb82589c948c246d2ec1d4272af32ef3b2660f44", "f0e2a8aa88e67269e9952431ef12e5b29b7f41a1871fbfc38567fad95655d607", "7fa12b3f3c5f8383bfc644b958f72a486969733fa097d8952b3eb4f7b4f73192", "360c167aad5fc992656d6010ec45fdce5bcd492ad9608bc515e2be70d4e430c1", "fe21bc969b3d8e5a64a6484a829c1e04208f26f3cd4de6afcbc172a5bd17f1f1", "b660a1f40141d7ccd282fe5bd9838744119bd1cb3780498b5173578cc5ad308f", "44dcb3370e76680e2fba8cd986ad45ff0b77ca45680ee8d950e47922c4af6226", "8ca126923d17fccb689647307b89f38aa14e2a7b9ebcf3c1e31ccf3d2291a3bc", "f0ae19ae9ce6329327cbf42baf090e084c196b0877d8c7b69997e0123be23ef8", "d2a2a217385158e3e1e348883a14bc423e57daa12077e8c49797d16121ea0810", "f5467ccd85bb4ebe768527db520a210459969a5f1fae6e07b43f519799f0b224", "68be5fd9f9d142a5099e3609011fe3bab7bb992c595999e31e0b3d1668dfb3cf", "4d49a8a476e4934afc6b5c36db9bece3ed1804f20b952da5a21b2b0de766aa73", "ea7155745ef3fb2d099513887a2ba279333ced65c65facbd890ce58bd3fce772", "cf19f51f4e848053d289ac95a9138cdd23fc3077ae913cd58cda8cc7a521b2e1", "590b1cd41c7e6144e76b5cd515a3a4d0a4317624620a3f1685f43ae68bdcd890", "d2ffe0626b5f94a7e00fa0b506e7455a3d9399c15800db108d5e715ef5f6e346", "69630878c50a91f6c2edd23a706bfa0b50bd5661672a37d67bab38e6bca3b698", "445e9067079899bb5faafaca915ae6c0f6b1b730a5a628835dd827636f7feb1e", "6461c77491f1c4825958949f23c153e6e1759a5be53abbcee17c9da3867f3141", "23a235f4083771ccc207771daceda700b525a59ab586788d4f6892e69e34a6e2", "bde99f79ef41a81607ddcf92b9f95dcbc6c3537e91e8bf740e193dc73b19485e", "177957c0e5f0fbd12b88022a91768095d193830986caec8d888097d3ff4310b8", "bcbbdbaa4cdf8352422072f332e05111b732354a35c4d7c617ce1fc3b8b42a5a", "774b6717fdfb0d1629fb9d4c04a9ca40079ae2955d7f82e897477055ed017abb", "16443bf625be6d39ecaa6f114e5d2c1d47a64bfd3c13808d94b55b6b6acef2ee", "8d7495d9008066505ed00ce8198af82bfa5a6b4c08768b4c9fb3aa4eb0b0cca2", "15800849a53349508cb382959527f6c3cf1a46158ff1e6e2316b7dea7967e35f", "7a792f0f4a2b731781d1b244b2a57947f1a2e32900a1c0793449f9f7ae18a7b7", "5e517c2832c9deaa7df77c7bad4d20fd6eda2b7815e155e68bc48238fac1416f", "9f51a14f0019c72bd1d472706d8c80a18c1873c6a0663e754b60eae8094483d7", "7d2fabb565122521d22ba99fed9e5be6a458fbc93156d54db27d97a00b8c3a97", "786c9e412a7db4ec278891fa534caa9a1d1a028c631c6f3aeb9c4d96ad895c36", "3bd6341d40641c2632a5a0cd7a63553a04e251efd7195897a1d27e02a7a8bfde", "31efd1f5fb57b8cff0318d77a1a9e8d67e1d1c8d18ce90f99c3a240dff48cdc8", "d9de3e1156ce1380150948acbcfecd99c96e7f4b0bc97745f4681593d017f74f", "427a2201e09f9583cd990c03b81b58148c297d474a3b50f498d83b1c7a9414cd", "bfaca11596d3dec406a9fcf5d97536516dfe7f0e3b12078428a7e1700e25218a", "351c4770a097248a650008152d0cab5825d048bef770da7f3364f59d1e721bc0", "ee00f205d1486b2be7381d962bd2867263758e880529e4e2bfedfa613bbc0e71", "6aa3b6418d89e3348e4859c823ef4d6d7cd46aa7f7e77aba586c4214d760d8f8", - ) -} - -/* -The regression test for the following invalid kademlia edge case. - -Addresses used in this test are discovered as part of the simulation network -in higher level tests for streaming. They were generated randomly. - -========================================================================= -Mon Apr 9 19:16:25 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 9a90fe -population: 8 (49), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4 -000 2 72ef 4e6c | 24 0b1e (0) 0d66 (0) 17f5 (0) 17e8 (0) -001 2 fc2b fa47 | 13 fa47 (0) fc2b (0) fffd (0) ecef (0) -002 2 b847 afa8 | 6 afa8 (0) ad77 (0) bb7c (0) b847 (0) -003 0 | 0 -004 0 | 4 91fc (0) 957d (0) 9482 (0) 949a (0) -============ DEPTH: 5 ========================================== -005 1 9ccf | 1 9ccf (0) -006 0 | 0 -007 1 9bb2 | 1 9bb2 (0) -008 0 | 0 -009 0 | 0 -010 0 | 0 -011 0 | 0 -012 0 | 0 -013 0 | 0 -014 0 | 0 -015 0 | 0 -========================================================================= -*/ -func TestKademliaCase4(t *testing.T) { - testKademliaCase(t, - "9a90fe3506277244549064b8c3276abb06284a199d9063a97331947f2b7da7f4", - "c19359eddef24b7be1a833b4475f212cd944263627a53f9ef4837d106c247730", "fc2b6fef99ef947f7e57c3df376891769e2a2fd83d2b8e634e0fc1e91eaa080c", "ecefc0e1a8ea7bb4b48c469e077401fce175dd75294255b96c4e54f6a2950a55", "bb7ce598efc056bba343cc2614aa3f67a575557561290b44c73a63f8f433f9f7", "55fbee6ca52dfd7f0be0db969ee8e524b654ab4f0cce7c05d83887d7d2a15460", "afa852b6b319998c6a283cc0c82d2f5b8e9410075d7700f3012761f1cfbd0f76", "36c370cfb63f2087971ba6e58d7585b04e16b8f0da335efb91554c2dd8fe191c", "6be41e029985edebc901fb77fc4fb65516b6d85086e2a98bfa3159c99391e585", "dd3cfc72ea553e7d2b28f0037a65646b30955b929d29ba4c40f4a2a811248e77", "da3a8f18e09c7b0ca235c4e33e1441a5188f1df023138bf207753ee63e768f7d", "de9e3ab4dc572d54a2d4b878329fd832bb51a149f4ce167316eeb177b61e7e01", "4e6c1ecde6ed917706257fe020a1d02d2e9d87fca4c85f0f7b132491008c5032", "72ef04b77a070e13463b3529dd312bcacfb7a12d20dc597f5ec3de0501e9b834", "3fef57186675d524ab8bb1f54ba8cb68610babca1247c0c46dbb60aed003c69d", "1d8e6b71f7a052865d6558d4ba44ad5fab7b908cc1badf5766822e1c20d0d823", "6be2f2b4ffa173014d4ec7df157d289744a2bda54bb876b264ccfa898a0da315", "b0ba3fff8643f9985c744327b0c4c869763509fd5da2de9a80a4a0a082021255", "9ccf40b9406ba2e6567101fb9b4e5334a9ec74263eff47267da266ba45e6c158", "d7347f02c180a448e60f73931845062ce00048750b584790278e9c93ef31ad81", "b68c6359a22b3bee6fecb8804311cfd816648ea31d530c9fb48e477e029d707a", "0d668a18ad7c2820214df6df95a6c855ce19fb1cb765f8ca620e45db76686d37", "3fbd2663bff65533246f1fabb9f38086854c6218aeb3dc9ac6ac73d4f0988f91", "949aa5719ca846052bfaa1b38c97b6eca3df3e24c0e0630042c6bccafbb4cdb5", "77b8a2b917bef5d54f3792183b014cca7798f713ff14fe0b2ac79b4c9f6f996d", "17e853cbd8dc00cba3cd9ffeb36f26a9f41a0eb92f80b62c2cda16771c935388", "5f682ed7a8cf2f98387c3def7c97f9f05ae39e39d393eeca3cf621268d6347f8", "ad77487eaf11fd8084ba4517a51766eb0e5b77dd3492dfa79aa3a2802fb29d20", "d247cfcacf9a8200ebaddf639f8c926ab0a001abe682f40df3785e80ed124e91", "195589442e11907eede1ee6524157f1125f68399f3170c835ff81c603b069f6c", "5b5ca0a67f3c54e7d3a6a862ef56168ec9ed1f4945e6c24de6d336b2be2e6f8c", "56430e4caa253015f1f998dce4a48a88af1953f68e94eca14f53074ae9c3e467", "0b1eed6a5bf612d1d8e08f5c546f3d12e838568fd3aa43ed4c537f10c65545d6", "7058db19a56dfff01988ac4a62e1310597f9c8d7ebde6890dadabf047d722d39", "b847380d6888ff7cd11402d086b19eccc40950b52c9d67e73cb4f8462f5df078", "df6c048419a2290ab546d527e9eeba349e7f7e1759bafe4adac507ce60ef9670", "91fc5b4b24fc3fbfea7f9a3d0f0437cb5733c0c2345d8bdffd7048d6e3b8a37b", "957d8ea51b37523952b6f5ae95462fcd4aed1483ef32cc80b69580aaeee03606", "efa82e4e91ad9ab781977400e9ac0bb9de7389aaedebdae979b73d1d3b8d72b0", "7400c9f3f3fc0cc6fe8cc37ab24b9771f44e9f78be913f73cd35fc4be030d6bd", "9bb28f4122d61f7bb56fe27ef706159fb802fef0f5de9dfa32c9c5b3183235f1", "40a8de6e98953498b806614532ea4abf8b99ad7f9719fb68203a6eae2efa5b2a", "412de0b218b8f7dcacc9205cd16ffb4eca5b838f46a2f4f9f534026061a47308", "17f56ecad51075080680ad9faa0fd8946b824d3296ddb20be07f9809fe8d1c5a", "fffd4e7ae885a41948a342b6647955a7ec8a8039039f510cff467ef597675457", "35e78e11b5ac46a29dd04ab0043136c3291f4ca56cb949ace33111ed56395463", "94824fc80230af82077c83bfc01dc9675b1f9d3d538b1e5f41c21ac753598691", "fa470ae314ca3fce493f21b423eef2a49522e09126f6f2326fa3c9cac0b344f7", "7078860b5b621b21ac7b95f9fc4739c8235ce5066a8b9bd7d938146a34fa88ec", "eea53560f0428bfd2eca4f86a5ce9dec5ff1309129a975d73465c1c9e9da71d1", - ) -} - -/* -The regression test for the following invalid kademlia edge case. - -Addresses used in this test are discovered as part of the simulation network -in higher level tests for streaming. They were generated randomly. - -========================================================================= -Mon Apr 9 19:25:18 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 5dd5c7 -population: 13 (49), NeighbourhoodSize: 2, MinBinSize: 2, MaxBinSize: 4 -000 2 e528 fad0 | 22 fad0 (0) e528 (0) e3bb (0) ed13 (0) -001 3 3f30 18e0 1dd3 | 7 3f30 (0) 23db (0) 10b6 (0) 18e0 (0) -002 4 7c54 7804 61e4 60f9 | 10 61e4 (0) 60f9 (0) 636c (0) 7186 (0) -003 2 40ae 4bae | 5 4bae (0) 4d5c (0) 403a (0) 40ae (0) -004 0 | 0 -005 0 | 3 5808 (0) 5a0e (0) 5bdb (0) -============ DEPTH: 6 ========================================== -006 2 5f14 5f61 | 2 5f14 (0) 5f61 (0) -007 0 | 0 -008 0 | 0 -009 0 | 0 -010 0 | 0 -011 0 | 0 -012 0 | 0 -013 0 | 0 -014 0 | 0 -015 0 | 0 -========================================================================= -*/ -func TestKademliaCase5(t *testing.T) { - testKademliaCase(t, - "5dd5c77dd9006a800478fcebb02d48d4036389e7d3c8f6a83b97dbad13f4c0a9", - "78fafa0809929a1279ece089a51d12457c2d8416dff859aeb2ccc24bb50df5ec", "1dd39b1257e745f147cbbc3cadd609ccd6207c41056dbc4254bba5d2527d3ee5", "5f61dd66d4d94aec8fcc3ce0e7885c7edf30c43143fa730e2841c5d28e3cd081", "8aa8b0472cb351d967e575ad05c4b9f393e76c4b01ef4b3a54aac5283b78abc9", "4502f385152a915b438a6726ce3ea9342e7a6db91a23c2f6bee83a885ed7eb82", "718677a504249db47525e959ef1784bed167e1c46f1e0275b9c7b588e28a3758", "7c54c6ed1f8376323896ed3a4e048866410de189e9599dd89bf312ca4adb96b5", "18e03bd3378126c09e799a497150da5c24c895aedc84b6f0dbae41fc4bac081a", "23db76ac9e6e58d9f5395ca78252513a7b4118b4155f8462d3d5eec62486cadc", "40ae0e8f065e96c7adb7fa39505136401f01780481e678d718b7f6dbb2c906ec", "c1539998b8bae19d339d6bbb691f4e9daeb0e86847545229e80fe0dffe716e92", "ed139d73a2699e205574c08722ca9f030ad2d866c662f1112a276b91421c3cb9", "5bdb19584b7a36d09ca689422ef7e6bb681b8f2558a6b2177a8f7c812f631022", "636c9de7fe234ffc15d67a504c69702c719f626c17461d3f2918e924cd9d69e2", "de4455413ff9335c440d52458c6544191bd58a16d85f700c1de53b62773064ea", "de1963310849527acabc7885b6e345a56406a8f23e35e436b6d9725e69a79a83", "a80a50a467f561210a114cba6c7fb1489ed43a14d61a9edd70e2eb15c31f074d", "7804f12b8d8e6e4b375b242058242068a3809385e05df0e64973cde805cf729c", "60f9aa320c02c6f2e6370aa740cf7cea38083fa95fca8c99552cda52935c1520", "d8da963602390f6c002c00ce62a84b514edfce9ebde035b277a957264bb54d21", "8463d93256e026fe436abad44697152b9a56ac8e06a0583d318e9571b83d073c", "9a3f78fcefb9a05e40a23de55f6153d7a8b9d973ede43a380bf46bb3b3847de1", "e3bb576f4b3760b9ca6bff59326f4ebfc4a669d263fb7d67ab9797adea54ed13", "4d5cdbd6dcca5bdf819a0fe8d175dc55cc96f088d37462acd5ea14bc6296bdbe", "5a0ed28de7b5258c727cb85447071c74c00a5fbba9e6bc0393bc51944d04ab2a", "61e4ddb479c283c638f4edec24353b6cc7a3a13b930824aad016b0996ca93c47", "7e3610868acf714836cafaaa7b8c009a9ac6e3a6d443e5586cf661530a204ee2", "d74b244d4345d2c86e30a097105e4fb133d53c578320285132a952cdaa64416e", "cfeed57d0f935bfab89e3f630a7c97e0b1605f0724d85a008bbfb92cb47863a8", "580837af95055670e20d494978f60c7f1458dc4b9e389fc7aa4982b2aca3bce3", "df55c0c49e6c8a83d82dfa1c307d3bf6a20e18721c80d8ec4f1f68dc0a137ced", "5f149c51ce581ba32a285439a806c063ced01ccd4211cd024e6a615b8f216f95", "1eb76b00aeb127b10dd1b7cd4c3edeb4d812b5a658f0feb13e85c4d2b7c6fe06", "7a56ba7c3fb7cbfb5561a46a75d95d7722096b45771ec16e6fa7bbfab0b35dfe", "4bae85ad88c28470f0015246d530adc0cd1778bdd5145c3c6b538ee50c4e04bd", "afd1892e2a7145c99ec0ebe9ded0d3fec21089b277a68d47f45961ec5e39e7e0", "953138885d7b36b0ef79e46030f8e61fd7037fbe5ce9e0a94d728e8c8d7eab86", "de761613ef305e4f628cb6bf97d7b7dc69a9d513dc233630792de97bcda777a6", "3f3087280063d09504c084bbf7fdf984347a72b50d097fd5b086ffabb5b3fb4c", "7d18a94bb1ebfdef4d3e454d2db8cb772f30ca57920dd1e402184a9e598581a0", "a7d6fbdc9126d9f10d10617f49fb9f5474ffe1b229f76b7dd27cebba30eccb5d", "fad0246303618353d1387ec10c09ee991eb6180697ed3470ed9a6b377695203d", "1cf66e09ea51ee5c23df26615a9e7420be2ac8063f28f60a3bc86020e94fe6f3", "8269cdaa153da7c358b0b940791af74d7c651cd4d3f5ed13acfe6d0f2c539e7f", "90d52eaaa60e74bf1c79106113f2599471a902d7b1c39ac1f55b20604f453c09", "9788fd0c09190a3f3d0541f68073a2f44c2fcc45bb97558a7c319f36c25a75b3", "10b68fc44157ecfdae238ee6c1ce0333f906ad04d1a4cb1505c8e35c3c87fbb0", "e5284117fdf3757920475c786e0004cb00ba0932163659a89b36651a01e57394", "403ad51d911e113dcd5f9ff58c94f6d278886a2a4da64c3ceca2083282c92de3", - ) -} - -func newTestDiscoveryPeer(addr pot.Address, kad *Kademlia) *Peer { - rw := &p2p.MsgPipeRW{} - p := p2p.NewPeer(enode.ID{}, "foo", []p2p.Cap{}) - pp := protocols.NewPeer(p, rw, &protocols.Spec{}) - bp := &BzzPeer{ - Peer: pp, - BzzAddr: &BzzAddr{ - OAddr: addr.Bytes(), - UAddr: []byte(fmt.Sprintf("%x", addr[:])), - }, - } - return NewPeer(bp, kad) -} diff --git a/swarm/network/networkid_test.go b/swarm/network/networkid_test.go deleted file mode 100644 index a534e394ab62..000000000000 --- a/swarm/network/networkid_test.go +++ /dev/null @@ -1,264 +0,0 @@ -// Copyright 2018 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 network - -import ( - "bytes" - "context" - "flag" - "fmt" - "math/rand" - "strings" - "testing" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/rpc" -) - -var ( - currentNetworkID int - cnt int - nodeMap map[int][]enode.ID - kademlias map[enode.ID]*Kademlia -) - -const ( - NumberOfNets = 4 - MaxTimeout = 6 -) - -func init() { - flag.Parse() - rand.Seed(time.Now().Unix()) -} - -/* -Run the network ID test. -The test creates one simulations.Network instance, -a number of nodes, then connects nodes with each other in this network. - -Each node gets a network ID assigned according to the number of networks. -Having more network IDs is just arbitrary in order to exclude -false positives. - -Nodes should only connect with other nodes with the same network ID. -After the setup phase, the test checks on each node if it has the -expected node connections (excluding those not sharing the network ID). -*/ -func TestNetworkID(t *testing.T) { - log.Debug("Start test") - //arbitrarily set the number of nodes. It could be any number - numNodes := 24 - //the nodeMap maps all nodes (slice value) with the same network ID (key) - nodeMap = make(map[int][]enode.ID) - //set up the network and connect nodes - net, err := setupNetwork(numNodes) - if err != nil { - t.Fatalf("Error setting up network: %v", err) - } - defer func() { - //shutdown the snapshot network - log.Trace("Shutting down network") - net.Shutdown() - }() - //let's sleep to ensure all nodes are connected - time.Sleep(1 * time.Second) - //for each group sharing the same network ID... - for _, netIDGroup := range nodeMap { - log.Trace("netIDGroup size", "size", len(netIDGroup)) - //...check that their size of the kademlia is of the expected size - //the assumption is that it should be the size of the group minus 1 (the node itself) - for _, node := range netIDGroup { - if kademlias[node].addrs.Size() != len(netIDGroup)-1 { - t.Fatalf("Kademlia size has not expected peer size. Kademlia size: %d, expected size: %d", kademlias[node].addrs.Size(), len(netIDGroup)-1) - } - kademlias[node].EachAddr(nil, 0, func(addr *BzzAddr, _ int) bool { - found := false - for _, nd := range netIDGroup { - if bytes.Equal(kademlias[nd].BaseAddr(), addr.Address()) { - found = true - } - } - if !found { - t.Fatalf("Expected node not found for node %s", node.String()) - } - return true - }) - } - } - log.Info("Test terminated successfully") -} - -// setup simulated network with bzz/discovery and pss services. -// connects nodes in a circle -// if allowRaw is set, omission of builtin pss encryption is enabled (see PssParams) -func setupNetwork(numnodes int) (net *simulations.Network, err error) { - log.Debug("Setting up network") - quitC := make(chan struct{}) - errc := make(chan error) - nodes := make([]*simulations.Node, numnodes) - if numnodes < 16 { - return nil, fmt.Errorf("Minimum sixteen nodes in network") - } - adapter := adapters.NewSimAdapter(newServices()) - //create the network - net = simulations.NewNetwork(adapter, &simulations.NetworkConfig{ - ID: "NetworkIdTestNet", - DefaultService: "bzz", - }) - log.Debug("Creating networks and nodes") - - var connCount int - - //create nodes and connect them to each other - for i := 0; i < numnodes; i++ { - log.Trace("iteration: ", "i", i) - nodeconf := adapters.RandomNodeConfig() - nodes[i], err = net.NewNodeWithConfig(nodeconf) - if err != nil { - return nil, fmt.Errorf("error creating node %d: %v", i, err) - } - err = net.Start(nodes[i].ID()) - if err != nil { - return nil, fmt.Errorf("error starting node %d: %v", i, err) - } - client, err := nodes[i].Client() - if err != nil { - return nil, fmt.Errorf("create node %d rpc client fail: %v", i, err) - } - //now setup and start event watching in order to know when we can upload - ctx, watchCancel := context.WithTimeout(context.Background(), MaxTimeout*time.Second) - defer watchCancel() - watchSubscriptionEvents(ctx, nodes[i].ID(), client, errc, quitC) - //on every iteration we connect to all previous ones - for k := i - 1; k >= 0; k-- { - connCount++ - log.Debug(fmt.Sprintf("Connecting node %d with node %d; connection count is %d", i, k, connCount)) - err = net.Connect(nodes[i].ID(), nodes[k].ID()) - if err != nil { - if !strings.Contains(err.Error(), "already connected") { - return nil, fmt.Errorf("error connecting nodes: %v", err) - } - } - } - } - //now wait until the number of expected subscriptions has been finished - //`watchSubscriptionEvents` will write with a `nil` value to errc - for err := range errc { - if err != nil { - return nil, err - } - //`nil` received, decrement count - connCount-- - log.Trace("count down", "cnt", connCount) - //all subscriptions received - if connCount == 0 { - close(quitC) - break - } - } - log.Debug("Network setup phase terminated") - return net, nil -} - -func newServices() adapters.Services { - kademlias = make(map[enode.ID]*Kademlia) - kademlia := func(id enode.ID) *Kademlia { - if k, ok := kademlias[id]; ok { - return k - } - params := NewKadParams() - params.NeighbourhoodSize = 2 - params.MaxBinSize = 3 - params.MinBinSize = 1 - params.MaxRetries = 1000 - params.RetryExponent = 2 - params.RetryInterval = 1000000 - kademlias[id] = NewKademlia(id[:], params) - return kademlias[id] - } - return adapters.Services{ - "bzz": func(ctx *adapters.ServiceContext) (node.Service, error) { - addr := NewAddr(ctx.Config.Node()) - hp := NewHiveParams() - hp.Discovery = false - cnt++ - //assign the network ID - currentNetworkID = cnt % NumberOfNets - if ok := nodeMap[currentNetworkID]; ok == nil { - nodeMap[currentNetworkID] = make([]enode.ID, 0) - } - //add this node to the group sharing the same network ID - nodeMap[currentNetworkID] = append(nodeMap[currentNetworkID], ctx.Config.ID) - log.Debug("current network ID:", "id", currentNetworkID) - config := &BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - NetworkID: uint64(currentNetworkID), - } - return NewBzz(config, kademlia(ctx.Config.ID), nil, nil, nil), nil - }, - } -} - -func watchSubscriptionEvents(ctx context.Context, id enode.ID, client *rpc.Client, errc chan error, quitC chan struct{}) { - events := make(chan *p2p.PeerEvent) - sub, err := client.Subscribe(context.Background(), "admin", events, "peerEvents") - if err != nil { - log.Error(err.Error()) - errc <- fmt.Errorf("error getting peer events for node %v: %s", id, err) - return - } - go func() { - defer func() { - sub.Unsubscribe() - log.Trace("watch subscription events: unsubscribe", "id", id) - }() - - for { - select { - case <-quitC: - return - case <-ctx.Done(): - select { - case errc <- ctx.Err(): - case <-quitC: - } - return - case e := <-events: - if e.Type == p2p.PeerEventTypeAdd { - errc <- nil - } - case err := <-sub.Err(): - if err != nil { - select { - case errc <- fmt.Errorf("error getting peer events for node %v: %v", id, err): - case <-quitC: - } - return - } - } - } - }() -} diff --git a/swarm/network/priorityqueue/priorityqueue.go b/swarm/network/priorityqueue/priorityqueue.go deleted file mode 100644 index b8bb895115ec..000000000000 --- a/swarm/network/priorityqueue/priorityqueue.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2018 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 priority_queue implement a channel based priority queue -// over arbitrary types. It provides an -// an autopop loop applying a function to the items always respecting -// their priority. The structure is only quasi consistent ie., if a lower -// priority item is autopopped, it is guaranteed that there was a point -// when no higher priority item was present, ie. it is not guaranteed -// that there was any point where the lower priority item was present -// but the higher was not - -package priorityqueue - -import ( - "context" - "errors" - - "github.com/nebulaai/nbai-node/log" -) - -var ( - ErrContention = errors.New("contention") - - errBadPriority = errors.New("bad priority") - - wakey = struct{}{} -) - -// PriorityQueue is the basic structure -type PriorityQueue struct { - Queues []chan interface{} - wakeup chan struct{} -} - -// New is the constructor for PriorityQueue -func New(n int, l int) *PriorityQueue { - var queues = make([]chan interface{}, n) - for i := range queues { - queues[i] = make(chan interface{}, l) - } - return &PriorityQueue{ - Queues: queues, - wakeup: make(chan struct{}, 1), - } -} - -// Run is a forever loop popping items from the queues -func (pq *PriorityQueue) Run(ctx context.Context, f func(interface{})) { - top := len(pq.Queues) - 1 - p := top -READ: - for { - q := pq.Queues[p] - select { - case <-ctx.Done(): - return - case x := <-q: - log.Trace("priority.queue f(x)", "p", p, "len(Queues[p])", len(pq.Queues[p])) - f(x) - p = top - default: - if p > 0 { - p-- - log.Trace("priority.queue p > 0", "p", p) - continue READ - } - p = top - select { - case <-ctx.Done(): - return - case <-pq.wakeup: - log.Trace("priority.queue wakeup", "p", p) - } - } - } -} - -// Push pushes an item to the appropriate queue specified in the priority argument -// if context is given it waits until either the item is pushed or the Context aborts -func (pq *PriorityQueue) Push(x interface{}, p int) error { - if p < 0 || p >= len(pq.Queues) { - return errBadPriority - } - log.Trace("priority.queue push", "p", p, "len(Queues[p])", len(pq.Queues[p])) - select { - case pq.Queues[p] <- x: - default: - return ErrContention - } - select { - case pq.wakeup <- wakey: - default: - } - return nil -} diff --git a/swarm/network/priorityqueue/priorityqueue_test.go b/swarm/network/priorityqueue/priorityqueue_test.go deleted file mode 100644 index ed8b575c2013..000000000000 --- a/swarm/network/priorityqueue/priorityqueue_test.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2018 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 priorityqueue - -import ( - "context" - "sync" - "testing" -) - -func TestPriorityQueue(t *testing.T) { - var results []string - wg := sync.WaitGroup{} - pq := New(3, 2) - wg.Add(1) - go pq.Run(context.Background(), func(v interface{}) { - results = append(results, v.(string)) - wg.Done() - }) - pq.Push("2.0", 2) - wg.Wait() - if results[0] != "2.0" { - t.Errorf("expected first result %q, got %q", "2.0", results[0]) - } - -Loop: - for i, tc := range []struct { - priorities []int - values []string - results []string - errors []error - }{ - { - priorities: []int{0}, - values: []string{""}, - results: []string{""}, - }, - { - priorities: []int{0, 1}, - values: []string{"0.0", "1.0"}, - results: []string{"1.0", "0.0"}, - }, - { - priorities: []int{1, 0}, - values: []string{"1.0", "0.0"}, - results: []string{"1.0", "0.0"}, - }, - { - priorities: []int{0, 1, 1}, - values: []string{"0.0", "1.0", "1.1"}, - results: []string{"1.0", "1.1", "0.0"}, - }, - { - priorities: []int{0, 0, 0}, - values: []string{"0.0", "0.0", "0.1"}, - errors: []error{nil, nil, ErrContention}, - }, - } { - var results []string - wg := sync.WaitGroup{} - pq := New(3, 2) - wg.Add(len(tc.values)) - for j, value := range tc.values { - err := pq.Push(value, tc.priorities[j]) - if tc.errors != nil && err != tc.errors[j] { - t.Errorf("expected push error %v, got %v", tc.errors[j], err) - continue Loop - } - if err != nil { - continue Loop - } - } - go pq.Run(context.Background(), func(v interface{}) { - results = append(results, v.(string)) - wg.Done() - }) - wg.Wait() - for k, result := range tc.results { - if results[k] != result { - t.Errorf("test case %v: expected %v element %q, got %q", i, k, result, results[k]) - } - } - } -} diff --git a/swarm/network/protocol.go b/swarm/network/protocol.go deleted file mode 100644 index d001f3bc7568..000000000000 --- a/swarm/network/protocol.go +++ /dev/null @@ -1,381 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "context" - "errors" - "fmt" - "net" - "sync" - "time" - - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/protocols" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/state" -) - -const ( - DefaultNetworkID = 3 - // timeout for waiting - bzzHandshakeTimeout = 3000 * time.Millisecond -) - -// BzzSpec is the spec of the generic swarm handshake -var BzzSpec = &protocols.Spec{ - Name: "bzz", - Version: 8, - MaxMsgSize: 10 * 1024 * 1024, - Messages: []interface{}{ - HandshakeMsg{}, - }, -} - -// DiscoverySpec is the spec for the bzz discovery subprotocols -var DiscoverySpec = &protocols.Spec{ - Name: "hive", - Version: 8, - MaxMsgSize: 10 * 1024 * 1024, - Messages: []interface{}{ - peersMsg{}, - subPeersMsg{}, - }, -} - -// BzzConfig captures the config params used by the hive -type BzzConfig struct { - OverlayAddr []byte // base address of the overlay network - UnderlayAddr []byte // node's underlay address - HiveParams *HiveParams - NetworkID uint64 - LightNode bool -} - -// Bzz is the swarm protocol bundle -type Bzz struct { - *Hive - NetworkID uint64 - LightNode bool - localAddr *BzzAddr - mtx sync.Mutex - handshakes map[enode.ID]*HandshakeMsg - streamerSpec *protocols.Spec - streamerRun func(*BzzPeer) error -} - -// NewBzz is the swarm protocol constructor -// arguments -// * bzz config -// * overlay driver -// * peer store -func NewBzz(config *BzzConfig, kad *Kademlia, store state.Store, streamerSpec *protocols.Spec, streamerRun func(*BzzPeer) error) *Bzz { - return &Bzz{ - Hive: NewHive(config.HiveParams, kad, store), - NetworkID: config.NetworkID, - LightNode: config.LightNode, - localAddr: &BzzAddr{config.OverlayAddr, config.UnderlayAddr}, - handshakes: make(map[enode.ID]*HandshakeMsg), - streamerRun: streamerRun, - streamerSpec: streamerSpec, - } -} - -// UpdateLocalAddr updates underlayaddress of the running node -func (b *Bzz) UpdateLocalAddr(byteaddr []byte) *BzzAddr { - b.localAddr = b.localAddr.Update(&BzzAddr{ - UAddr: byteaddr, - OAddr: b.localAddr.OAddr, - }) - return b.localAddr -} - -// NodeInfo returns the node's overlay address -func (b *Bzz) NodeInfo() interface{} { - return b.localAddr.Address() -} - -// Protocols return the protocols swarm offers -// Bzz implements the node.Service interface -// * handshake/hive -// * discovery -func (b *Bzz) Protocols() []p2p.Protocol { - protocol := []p2p.Protocol{ - { - Name: BzzSpec.Name, - Version: BzzSpec.Version, - Length: BzzSpec.Length(), - Run: b.runBzz, - NodeInfo: b.NodeInfo, - }, - { - Name: DiscoverySpec.Name, - Version: DiscoverySpec.Version, - Length: DiscoverySpec.Length(), - Run: b.RunProtocol(DiscoverySpec, b.Hive.Run), - NodeInfo: b.Hive.NodeInfo, - PeerInfo: b.Hive.PeerInfo, - }, - } - if b.streamerSpec != nil && b.streamerRun != nil { - protocol = append(protocol, p2p.Protocol{ - Name: b.streamerSpec.Name, - Version: b.streamerSpec.Version, - Length: b.streamerSpec.Length(), - Run: b.RunProtocol(b.streamerSpec, b.streamerRun), - }) - } - return protocol -} - -// APIs returns the APIs offered by bzz -// * hive -// Bzz implements the node.Service interface -func (b *Bzz) APIs() []rpc.API { - return []rpc.API{{ - Namespace: "hive", - Version: "3.0", - Service: b.Hive, - }} -} - -// RunProtocol is a wrapper for swarm subprotocols -// returns a p2p protocol run function that can be assigned to p2p.Protocol#Run field -// arguments: -// * p2p protocol spec -// * run function taking BzzPeer as argument -// this run function is meant to block for the duration of the protocol session -// on return the session is terminated and the peer is disconnected -// the protocol waits for the bzz handshake is negotiated -// the overlay address on the BzzPeer is set from the remote handshake -func (b *Bzz) RunProtocol(spec *protocols.Spec, run func(*BzzPeer) error) func(*p2p.Peer, p2p.MsgReadWriter) error { - return func(p *p2p.Peer, rw p2p.MsgReadWriter) error { - // wait for the bzz protocol to perform the handshake - handshake, _ := b.GetHandshake(p.ID()) - defer b.removeHandshake(p.ID()) - select { - case <-handshake.done: - case <-time.After(bzzHandshakeTimeout): - return fmt.Errorf("%08x: %s protocol timeout waiting for handshake on %08x", b.BaseAddr()[:4], spec.Name, p.ID().Bytes()[:4]) - } - if handshake.err != nil { - return fmt.Errorf("%08x: %s protocol closed: %v", b.BaseAddr()[:4], spec.Name, handshake.err) - } - // the handshake has succeeded so construct the BzzPeer and run the protocol - peer := &BzzPeer{ - Peer: protocols.NewPeer(p, rw, spec), - BzzAddr: handshake.peerAddr, - lastActive: time.Now(), - LightNode: handshake.LightNode, - } - - log.Debug("peer created", "addr", handshake.peerAddr.String()) - - return run(peer) - } -} - -// performHandshake implements the negotiation of the bzz handshake -// shared among swarm subprotocols -func (b *Bzz) performHandshake(p *protocols.Peer, handshake *HandshakeMsg) error { - ctx, cancel := context.WithTimeout(context.Background(), bzzHandshakeTimeout) - defer func() { - close(handshake.done) - cancel() - }() - rsh, err := p.Handshake(ctx, handshake, b.checkHandshake) - if err != nil { - handshake.err = err - return err - } - handshake.peerAddr = rsh.(*HandshakeMsg).Addr - handshake.LightNode = rsh.(*HandshakeMsg).LightNode - return nil -} - -// runBzz is the p2p protocol run function for the bzz base protocol -// that negotiates the bzz handshake -func (b *Bzz) runBzz(p *p2p.Peer, rw p2p.MsgReadWriter) error { - handshake, _ := b.GetHandshake(p.ID()) - if !<-handshake.init { - return fmt.Errorf("%08x: bzz already started on peer %08x", b.localAddr.Over()[:4], p.ID().Bytes()[:4]) - } - close(handshake.init) - defer b.removeHandshake(p.ID()) - peer := protocols.NewPeer(p, rw, BzzSpec) - err := b.performHandshake(peer, handshake) - if err != nil { - log.Warn(fmt.Sprintf("%08x: handshake failed with remote peer %08x: %v", b.localAddr.Over()[:4], p.ID().Bytes()[:4], err)) - - return err - } - // fail if we get another handshake - msg, err := rw.ReadMsg() - if err != nil { - return err - } - msg.Discard() - return errors.New("received multiple handshakes") -} - -// BzzPeer is the bzz protocol view of a protocols.Peer (itself an extension of p2p.Peer) -// implements the Peer interface and all interfaces Peer implements: Addr, OverlayPeer -type BzzPeer struct { - *protocols.Peer // represents the connection for online peers - *BzzAddr // remote address -> implements Addr interface = protocols.Peer - lastActive time.Time // time is updated whenever mutexes are releasing - LightNode bool -} - -func NewBzzPeer(p *protocols.Peer) *BzzPeer { - return &BzzPeer{Peer: p, BzzAddr: NewAddr(p.Node())} -} - -// ID returns the peer's underlay node identifier. -func (p *BzzPeer) ID() enode.ID { - // This is here to resolve a method tie: both protocols.Peer and BzzAddr are embedded - // into the struct and provide ID(). The protocols.Peer version is faster, ensure it - // gets used. - return p.Peer.ID() -} - -/* - Handshake - -* Version: 8 byte integer version of the protocol -* NetworkID: 8 byte integer network identifier -* Addr: the address advertised by the node including underlay and overlay connecctions -*/ -type HandshakeMsg struct { - Version uint64 - NetworkID uint64 - Addr *BzzAddr - LightNode bool - - // peerAddr is the address received in the peer handshake - peerAddr *BzzAddr - - init chan bool - done chan struct{} - err error -} - -// String pretty prints the handshake -func (bh *HandshakeMsg) String() string { - return fmt.Sprintf("Handshake: Version: %v, NetworkID: %v, Addr: %v, LightNode: %v, peerAddr: %v", bh.Version, bh.NetworkID, bh.Addr, bh.LightNode, bh.peerAddr) -} - -// Perform initiates the handshake and validates the remote handshake message -func (b *Bzz) checkHandshake(hs interface{}) error { - rhs := hs.(*HandshakeMsg) - if rhs.NetworkID != b.NetworkID { - return fmt.Errorf("network id mismatch %d (!= %d)", rhs.NetworkID, b.NetworkID) - } - if rhs.Version != uint64(BzzSpec.Version) { - return fmt.Errorf("version mismatch %d (!= %d)", rhs.Version, BzzSpec.Version) - } - return nil -} - -// removeHandshake removes handshake for peer with peerID -// from the bzz handshake store -func (b *Bzz) removeHandshake(peerID enode.ID) { - b.mtx.Lock() - defer b.mtx.Unlock() - delete(b.handshakes, peerID) -} - -// GetHandshake returns the bzz handhake that the remote peer with peerID sent -func (b *Bzz) GetHandshake(peerID enode.ID) (*HandshakeMsg, bool) { - b.mtx.Lock() - defer b.mtx.Unlock() - handshake, found := b.handshakes[peerID] - if !found { - handshake = &HandshakeMsg{ - Version: uint64(BzzSpec.Version), - NetworkID: b.NetworkID, - Addr: b.localAddr, - LightNode: b.LightNode, - init: make(chan bool, 1), - done: make(chan struct{}), - } - // when handhsake is first created for a remote peer - // it is initialised with the init - handshake.init <- true - b.handshakes[peerID] = handshake - } - - return handshake, found -} - -// BzzAddr implements the PeerAddr interface -type BzzAddr struct { - OAddr []byte - UAddr []byte -} - -// Address implements OverlayPeer interface to be used in Overlay. -func (a *BzzAddr) Address() []byte { - return a.OAddr -} - -// Over returns the overlay address. -func (a *BzzAddr) Over() []byte { - return a.OAddr -} - -// Under returns the underlay address. -func (a *BzzAddr) Under() []byte { - return a.UAddr -} - -// ID returns the node identifier in the underlay. -func (a *BzzAddr) ID() enode.ID { - n, err := enode.ParseV4(string(a.UAddr)) - if err != nil { - return enode.ID{} - } - return n.ID() -} - -// Update updates the underlay address of a peer record -func (a *BzzAddr) Update(na *BzzAddr) *BzzAddr { - return &BzzAddr{a.OAddr, na.UAddr} -} - -// String pretty prints the address -func (a *BzzAddr) String() string { - return fmt.Sprintf("%x <%s>", a.OAddr, a.UAddr) -} - -// RandomAddr is a utility method generating an address from a public key -func RandomAddr() *BzzAddr { - key, err := crypto.GenerateKey() - if err != nil { - panic("unable to generate key") - } - node := enode.NewV4(&key.PublicKey, net.IP{127, 0, 0, 1}, 30332, 30332) - return NewAddr(node) -} - -// NewAddr constucts a BzzAddr from a node record. -func NewAddr(node *enode.Node) *BzzAddr { - return &BzzAddr{OAddr: node.ID().Bytes(), UAddr: []byte(node.String())} -} diff --git a/swarm/network/protocol_test.go b/swarm/network/protocol_test.go deleted file mode 100644 index 41dae470b08f..000000000000 --- a/swarm/network/protocol_test.go +++ /dev/null @@ -1,245 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package network - -import ( - "flag" - "fmt" - "os" - "testing" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/protocols" - p2ptest "github.com/nebulaai/nbai-node/p2p/testing" -) - -const ( - TestProtocolVersion = 8 - TestProtocolNetworkID = 3 -) - -var ( - loglevel = flag.Int("loglevel", 2, "verbosity of logs") -) - -func init() { - flag.Parse() - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(os.Stderr, log.TerminalFormat(true)))) -} - -func HandshakeMsgExchange(lhs, rhs *HandshakeMsg, id enode.ID) []p2ptest.Exchange { - return []p2ptest.Exchange{ - { - Expects: []p2ptest.Expect{ - { - Code: 0, - Msg: lhs, - Peer: id, - }, - }, - }, - { - Triggers: []p2ptest.Trigger{ - { - Code: 0, - Msg: rhs, - Peer: id, - }, - }, - }, - } -} - -func newBzzBaseTester(t *testing.T, n int, addr *BzzAddr, spec *protocols.Spec, run func(*BzzPeer) error) *bzzTester { - cs := make(map[string]chan bool) - - srv := func(p *BzzPeer) error { - defer func() { - if cs[p.ID().String()] != nil { - close(cs[p.ID().String()]) - } - }() - return run(p) - } - - protocol := func(p *p2p.Peer, rw p2p.MsgReadWriter) error { - return srv(&BzzPeer{Peer: protocols.NewPeer(p, rw, spec), BzzAddr: NewAddr(p.Node())}) - } - - s := p2ptest.NewProtocolTester(t, addr.ID(), n, protocol) - - for _, node := range s.Nodes { - cs[node.ID().String()] = make(chan bool) - } - - return &bzzTester{ - addr: addr, - ProtocolTester: s, - cs: cs, - } -} - -type bzzTester struct { - *p2ptest.ProtocolTester - addr *BzzAddr - cs map[string]chan bool - bzz *Bzz -} - -func newBzz(addr *BzzAddr, lightNode bool) *Bzz { - config := &BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: NewHiveParams(), - NetworkID: DefaultNetworkID, - LightNode: lightNode, - } - kad := NewKademlia(addr.OAddr, NewKadParams()) - bzz := NewBzz(config, kad, nil, nil, nil) - return bzz -} - -func newBzzHandshakeTester(t *testing.T, n int, addr *BzzAddr, lightNode bool) *bzzTester { - bzz := newBzz(addr, lightNode) - pt := p2ptest.NewProtocolTester(t, addr.ID(), n, bzz.runBzz) - - return &bzzTester{ - addr: addr, - ProtocolTester: pt, - bzz: bzz, - } -} - -// should test handshakes in one exchange? parallelisation -func (s *bzzTester) testHandshake(lhs, rhs *HandshakeMsg, disconnects ...*p2ptest.Disconnect) error { - if err := s.TestExchanges(HandshakeMsgExchange(lhs, rhs, rhs.Addr.ID())...); err != nil { - return err - } - - if len(disconnects) > 0 { - return s.TestDisconnected(disconnects...) - } - - // If we don't expect disconnect, ensure peers remain connected - err := s.TestDisconnected(&p2ptest.Disconnect{ - Peer: s.Nodes[0].ID(), - Error: nil, - }) - - if err == nil { - return fmt.Errorf("Unexpected peer disconnect") - } - - if err.Error() != "timed out waiting for peers to disconnect" { - return err - } - - return nil -} - -func correctBzzHandshake(addr *BzzAddr, lightNode bool) *HandshakeMsg { - return &HandshakeMsg{ - Version: TestProtocolVersion, - NetworkID: TestProtocolNetworkID, - Addr: addr, - LightNode: lightNode, - } -} - -func TestBzzHandshakeNetworkIDMismatch(t *testing.T) { - lightNode := false - addr := RandomAddr() - s := newBzzHandshakeTester(t, 1, addr, lightNode) - node := s.Nodes[0] - - err := s.testHandshake( - correctBzzHandshake(addr, lightNode), - &HandshakeMsg{Version: TestProtocolVersion, NetworkID: 321, Addr: NewAddr(node)}, - &p2ptest.Disconnect{Peer: node.ID(), Error: fmt.Errorf("Handshake error: Message handler error: (msg code 0): network id mismatch 321 (!= 3)")}, - ) - - if err != nil { - t.Fatal(err) - } -} - -func TestBzzHandshakeVersionMismatch(t *testing.T) { - lightNode := false - addr := RandomAddr() - s := newBzzHandshakeTester(t, 1, addr, lightNode) - node := s.Nodes[0] - - err := s.testHandshake( - correctBzzHandshake(addr, lightNode), - &HandshakeMsg{Version: 0, NetworkID: TestProtocolNetworkID, Addr: NewAddr(node)}, - &p2ptest.Disconnect{Peer: node.ID(), Error: fmt.Errorf("Handshake error: Message handler error: (msg code 0): version mismatch 0 (!= %d)", TestProtocolVersion)}, - ) - - if err != nil { - t.Fatal(err) - } -} - -func TestBzzHandshakeSuccess(t *testing.T) { - lightNode := false - addr := RandomAddr() - s := newBzzHandshakeTester(t, 1, addr, lightNode) - node := s.Nodes[0] - - err := s.testHandshake( - correctBzzHandshake(addr, lightNode), - &HandshakeMsg{Version: TestProtocolVersion, NetworkID: TestProtocolNetworkID, Addr: NewAddr(node)}, - ) - - if err != nil { - t.Fatal(err) - } -} - -func TestBzzHandshakeLightNode(t *testing.T) { - var lightNodeTests = []struct { - name string - lightNode bool - }{ - {"on", true}, - {"off", false}, - } - - for _, test := range lightNodeTests { - t.Run(test.name, func(t *testing.T) { - randomAddr := RandomAddr() - pt := newBzzHandshakeTester(t, 1, randomAddr, false) - node := pt.Nodes[0] - addr := NewAddr(node) - - err := pt.testHandshake( - correctBzzHandshake(randomAddr, false), - &HandshakeMsg{Version: TestProtocolVersion, NetworkID: TestProtocolNetworkID, Addr: addr, LightNode: test.lightNode}, - ) - - if err != nil { - t.Fatal(err) - } - - if pt.bzz.handshakes[node.ID()].LightNode != test.lightNode { - t.Fatalf("peer LightNode flag is %v, should be %v", pt.bzz.handshakes[node.ID()].LightNode, test.lightNode) - } - }) - } -} diff --git a/swarm/network/simulation/bucket.go b/swarm/network/simulation/bucket.go deleted file mode 100644 index 4134e7b9e122..000000000000 --- a/swarm/network/simulation/bucket.go +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright 2018 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 simulation - -import "github.com/nebulaai/nbai-node/p2p/enode" - -// BucketKey is the type that should be used for keys in simulation buckets. -type BucketKey string - -// NodeItem returns an item set in ServiceFunc function for a particular node. -func (s *Simulation) NodeItem(id enode.ID, key interface{}) (value interface{}, ok bool) { - s.mu.Lock() - defer s.mu.Unlock() - - if _, ok := s.buckets[id]; !ok { - return nil, false - } - return s.buckets[id].Load(key) -} - -// SetNodeItem sets a new item associated with the node with provided NodeID. -// Buckets should be used to avoid managing separate simulation global state. -func (s *Simulation) SetNodeItem(id enode.ID, key interface{}, value interface{}) { - s.mu.Lock() - defer s.mu.Unlock() - - s.buckets[id].Store(key, value) -} - -// NodesItems returns a map of items from all nodes that are all set under the -// same BucketKey. -func (s *Simulation) NodesItems(key interface{}) (values map[enode.ID]interface{}) { - s.mu.RLock() - defer s.mu.RUnlock() - - ids := s.NodeIDs() - values = make(map[enode.ID]interface{}, len(ids)) - for _, id := range ids { - if _, ok := s.buckets[id]; !ok { - continue - } - if v, ok := s.buckets[id].Load(key); ok { - values[id] = v - } - } - return values -} - -// UpNodesItems returns a map of items with the same BucketKey from all nodes that are up. -func (s *Simulation) UpNodesItems(key interface{}) (values map[enode.ID]interface{}) { - s.mu.RLock() - defer s.mu.RUnlock() - - ids := s.UpNodeIDs() - values = make(map[enode.ID]interface{}) - for _, id := range ids { - if _, ok := s.buckets[id]; !ok { - continue - } - if v, ok := s.buckets[id].Load(key); ok { - values[id] = v - } - } - return values -} diff --git a/swarm/network/simulation/bucket_test.go b/swarm/network/simulation/bucket_test.go deleted file mode 100644 index eb39955c6436..000000000000 --- a/swarm/network/simulation/bucket_test.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2018 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 simulation - -import ( - "sync" - "testing" - - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" -) - -// TestServiceBucket tests all bucket functionality using subtests. -// It constructs a simulation of two nodes by adding items to their buckets -// in ServiceFunc constructor, then by SetNodeItem. Testing UpNodesItems -// is done by stopping one node and validating availability of its items. -func TestServiceBucket(t *testing.T) { - testKey := "Key" - testValue := "Value" - - sim := New(map[string]ServiceFunc{ - "noop": func(ctx *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) { - b.Store(testKey, testValue+ctx.Config.ID.String()) - return newNoopService(), nil, nil - }, - }) - defer sim.Close() - - id1, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - id2, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - t.Run("ServiceFunc bucket Store", func(t *testing.T) { - v, ok := sim.NodeItem(id1, testKey) - if !ok { - t.Fatal("bucket item not found") - } - s, ok := v.(string) - if !ok { - t.Fatal("bucket item value is not string") - } - if s != testValue+id1.String() { - t.Fatalf("expected %q, got %q", testValue+id1.String(), s) - } - - v, ok = sim.NodeItem(id2, testKey) - if !ok { - t.Fatal("bucket item not found") - } - s, ok = v.(string) - if !ok { - t.Fatal("bucket item value is not string") - } - if s != testValue+id2.String() { - t.Fatalf("expected %q, got %q", testValue+id2.String(), s) - } - }) - - customKey := "anotherKey" - customValue := "anotherValue" - - t.Run("SetNodeItem", func(t *testing.T) { - sim.SetNodeItem(id1, customKey, customValue) - - v, ok := sim.NodeItem(id1, customKey) - if !ok { - t.Fatal("bucket item not found") - } - s, ok := v.(string) - if !ok { - t.Fatal("bucket item value is not string") - } - if s != customValue { - t.Fatalf("expected %q, got %q", customValue, s) - } - - _, ok = sim.NodeItem(id2, customKey) - if ok { - t.Fatal("bucket item should not be found") - } - }) - - if err := sim.StopNode(id2); err != nil { - t.Fatal(err) - } - - t.Run("UpNodesItems", func(t *testing.T) { - items := sim.UpNodesItems(testKey) - - v, ok := items[id1] - if !ok { - t.Errorf("node 1 item not found") - } - s, ok := v.(string) - if !ok { - t.Fatal("node 1 item value is not string") - } - if s != testValue+id1.String() { - t.Fatalf("expected %q, got %q", testValue+id1.String(), s) - } - - _, ok = items[id2] - if ok { - t.Errorf("node 2 item should not be found") - } - }) - - t.Run("NodeItems", func(t *testing.T) { - items := sim.NodesItems(testKey) - - v, ok := items[id1] - if !ok { - t.Errorf("node 1 item not found") - } - s, ok := v.(string) - if !ok { - t.Fatal("node 1 item value is not string") - } - if s != testValue+id1.String() { - t.Fatalf("expected %q, got %q", testValue+id1.String(), s) - } - - v, ok = items[id2] - if !ok { - t.Errorf("node 2 item not found") - } - s, ok = v.(string) - if !ok { - t.Fatal("node 1 item value is not string") - } - if s != testValue+id2.String() { - t.Fatalf("expected %q, got %q", testValue+id2.String(), s) - } - }) -} diff --git a/swarm/network/simulation/events.go b/swarm/network/simulation/events.go deleted file mode 100644 index 56e9da4a2878..000000000000 --- a/swarm/network/simulation/events.go +++ /dev/null @@ -1,217 +0,0 @@ -// Copyright 2018 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 simulation - -import ( - "context" - "sync" - - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations" -) - -// PeerEvent is the type of the channel returned by Simulation.PeerEvents. -type PeerEvent struct { - // NodeID is the ID of node that the event is caught on. - NodeID enode.ID - // PeerID is the ID of the peer node that the event is caught on. - PeerID enode.ID - // Event is the event that is caught. - Event *simulations.Event - // Error is the error that may have happened during event watching. - Error error -} - -// PeerEventsFilter defines a filter on PeerEvents to exclude messages with -// defined properties. Use PeerEventsFilter methods to set required options. -type PeerEventsFilter struct { - eventType simulations.EventType - - connUp *bool - - msgReceive *bool - protocol *string - msgCode *uint64 -} - -// NewPeerEventsFilter returns a new PeerEventsFilter instance. -func NewPeerEventsFilter() *PeerEventsFilter { - return &PeerEventsFilter{} -} - -// Connect sets the filter to events when two nodes connect. -func (f *PeerEventsFilter) Connect() *PeerEventsFilter { - f.eventType = simulations.EventTypeConn - b := true - f.connUp = &b - return f -} - -// Drop sets the filter to events when two nodes disconnect. -func (f *PeerEventsFilter) Drop() *PeerEventsFilter { - f.eventType = simulations.EventTypeConn - b := false - f.connUp = &b - return f -} - -// ReceivedMessages sets the filter to only messages that are received. -func (f *PeerEventsFilter) ReceivedMessages() *PeerEventsFilter { - f.eventType = simulations.EventTypeMsg - b := true - f.msgReceive = &b - return f -} - -// SentMessages sets the filter to only messages that are sent. -func (f *PeerEventsFilter) SentMessages() *PeerEventsFilter { - f.eventType = simulations.EventTypeMsg - b := false - f.msgReceive = &b - return f -} - -// Protocol sets the filter to only one message protocol. -func (f *PeerEventsFilter) Protocol(p string) *PeerEventsFilter { - f.eventType = simulations.EventTypeMsg - f.protocol = &p - return f -} - -// MsgCode sets the filter to only one msg code. -func (f *PeerEventsFilter) MsgCode(c uint64) *PeerEventsFilter { - f.eventType = simulations.EventTypeMsg - f.msgCode = &c - return f -} - -// PeerEvents returns a channel of events that are captured by admin peerEvents -// subscription nodes with provided NodeIDs. Additional filters can be set to ignore -// events that are not relevant. -func (s *Simulation) PeerEvents(ctx context.Context, ids []enode.ID, filters ...*PeerEventsFilter) <-chan PeerEvent { - eventC := make(chan PeerEvent) - - // wait group to make sure all subscriptions to admin peerEvents are established - // before this function returns. - var subsWG sync.WaitGroup - for _, id := range ids { - s.shutdownWG.Add(1) - subsWG.Add(1) - go func(id enode.ID) { - defer s.shutdownWG.Done() - - events := make(chan *simulations.Event) - sub := s.Net.Events().Subscribe(events) - defer sub.Unsubscribe() - - subsWG.Done() - - for { - select { - case <-ctx.Done(): - if err := ctx.Err(); err != nil { - select { - case eventC <- PeerEvent{NodeID: id, Error: err}: - case <-s.Done(): - } - } - return - case <-s.Done(): - return - case e := <-events: - // ignore control events - if e.Control { - continue - } - match := len(filters) == 0 // if there are no filters match all events - for _, f := range filters { - if f.eventType == simulations.EventTypeConn && e.Conn != nil { - if *f.connUp != e.Conn.Up { - continue - } - // all connection filter parameters matched, break the loop - match = true - break - } - if f.eventType == simulations.EventTypeMsg && e.Msg != nil { - if f.msgReceive != nil && *f.msgReceive != e.Msg.Received { - continue - } - if f.protocol != nil && *f.protocol != e.Msg.Protocol { - continue - } - if f.msgCode != nil && *f.msgCode != e.Msg.Code { - continue - } - // all message filter parameters matched, break the loop - match = true - break - } - } - var peerID enode.ID - switch e.Type { - case simulations.EventTypeConn: - peerID = e.Conn.One - if peerID == id { - peerID = e.Conn.Other - } - case simulations.EventTypeMsg: - peerID = e.Msg.One - if peerID == id { - peerID = e.Msg.Other - } - } - if match { - select { - case eventC <- PeerEvent{NodeID: id, PeerID: peerID, Event: e}: - case <-ctx.Done(): - if err := ctx.Err(); err != nil { - select { - case eventC <- PeerEvent{NodeID: id, PeerID: peerID, Error: err}: - case <-s.Done(): - } - } - return - case <-s.Done(): - return - } - } - case err := <-sub.Err(): - if err != nil { - select { - case eventC <- PeerEvent{NodeID: id, Error: err}: - case <-ctx.Done(): - if err := ctx.Err(); err != nil { - select { - case eventC <- PeerEvent{NodeID: id, Error: err}: - case <-s.Done(): - } - } - return - case <-s.Done(): - return - } - } - } - } - }(id) - } - - // wait all subscriptions - subsWG.Wait() - return eventC -} diff --git a/swarm/network/simulation/events_test.go b/swarm/network/simulation/events_test.go deleted file mode 100644 index 529844816f4a..000000000000 --- a/swarm/network/simulation/events_test.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2018 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 simulation - -import ( - "context" - "sync" - "testing" - "time" -) - -// TestPeerEvents creates simulation, adds two nodes, -// register for peer events, connects nodes in a chain -// and waits for the number of connection events to -// be received. -func TestPeerEvents(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - _, err := sim.AddNodes(2) - if err != nil { - t.Fatal(err) - } - - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - events := sim.PeerEvents(ctx, sim.NodeIDs()) - - // two nodes -> two connection events - expectedEventCount := 2 - - var wg sync.WaitGroup - wg.Add(expectedEventCount) - - go func() { - for e := range events { - if e.Error != nil { - if e.Error == context.Canceled { - return - } - t.Error(e.Error) - continue - } - wg.Done() - } - }() - - err = sim.Net.ConnectNodesChain(sim.NodeIDs()) - if err != nil { - t.Fatal(err) - } - - wg.Wait() -} - -func TestPeerEventsTimeout(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - _, err := sim.AddNodes(2) - if err != nil { - t.Fatal(err) - } - - ctx, cancel := context.WithTimeout(context.Background(), 100*time.Millisecond) - defer cancel() - events := sim.PeerEvents(ctx, sim.NodeIDs()) - - done := make(chan struct{}) - errC := make(chan error) - go func() { - for e := range events { - if e.Error == context.Canceled { - return - } - if e.Error == context.DeadlineExceeded { - close(done) - return - } else { - errC <- e.Error - } - } - }() - - select { - case <-time.After(time.Second): - t.Fatal("no context deadline received") - case err := <-errC: - t.Fatal(err) - case <-done: - // all good, context deadline detected - } -} diff --git a/swarm/network/simulation/example_test.go b/swarm/network/simulation/example_test.go deleted file mode 100644 index 8033857f636b..000000000000 --- a/swarm/network/simulation/example_test.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright 2018 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 simulation_test - -import ( - "context" - "fmt" - "sync" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/network/simulation" -) - -// Every node can have a Kademlia associated using the node bucket under -// BucketKeyKademlia key. This allows to use WaitTillHealthy to block until -// all nodes have the their Kademlias healthy. -func ExampleSimulation_WaitTillHealthy() { - - sim := simulation.New(map[string]simulation.ServiceFunc{ - "bzz": func(ctx *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) { - addr := network.NewAddr(ctx.Config.Node()) - hp := network.NewHiveParams() - hp.Discovery = false - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - // store kademlia in node's bucket under BucketKeyKademlia - // so that it can be found by WaitTillHealthy method. - b.Store(simulation.BucketKeyKademlia, kad) - return network.NewBzz(config, kad, nil, nil, nil), nil, nil - }, - }) - defer sim.Close() - - _, err := sim.AddNodesAndConnectRing(10) - if err != nil { - // handle error properly... - panic(err) - } - - ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) - defer cancel() - ill, err := sim.WaitTillHealthy(ctx) - if err != nil { - // inspect the latest detected not healthy kademlias - for id, kad := range ill { - fmt.Println("Node", id) - fmt.Println(kad.String()) - } - // handle error... - } - - // continue with the test - -} - -// Watch all peer events in the simulation network, buy receiving from a channel. -func ExampleSimulation_PeerEvents() { - sim := simulation.New(nil) - defer sim.Close() - - events := sim.PeerEvents(context.Background(), sim.NodeIDs()) - - go func() { - for e := range events { - if e.Error != nil { - log.Error("peer event", "err", e.Error) - continue - } - log.Info("peer event", "node", e.NodeID, "peer", e.PeerID, "type", e.Event.Type) - } - }() -} - -// Detect when a nodes drop a peer. -func ExampleSimulation_PeerEvents_disconnections() { - sim := simulation.New(nil) - defer sim.Close() - - disconnections := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - simulation.NewPeerEventsFilter().Drop(), - ) - - go func() { - for d := range disconnections { - if d.Error != nil { - log.Error("peer drop", "err", d.Error) - continue - } - log.Warn("peer drop", "node", d.NodeID, "peer", d.PeerID) - } - }() -} - -// Watch multiple types of events or messages. In this case, they differ only -// by MsgCode, but filters can be set for different types or protocols, too. -func ExampleSimulation_PeerEvents_multipleFilters() { - sim := simulation.New(nil) - defer sim.Close() - - msgs := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - // Watch when bzz messages 1 and 4 are received. - simulation.NewPeerEventsFilter().ReceivedMessages().Protocol("bzz").MsgCode(1), - simulation.NewPeerEventsFilter().ReceivedMessages().Protocol("bzz").MsgCode(4), - ) - - go func() { - for m := range msgs { - if m.Error != nil { - log.Error("bzz message", "err", m.Error) - continue - } - log.Info("bzz message", "node", m.NodeID, "peer", m.PeerID) - } - }() -} diff --git a/swarm/network/simulation/http.go b/swarm/network/simulation/http.go deleted file mode 100644 index 4dcdd5bf4ce3..000000000000 --- a/swarm/network/simulation/http.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2018 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 simulation - -import ( - "fmt" - "net/http" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/simulations" -) - -// Package defaults. -var ( - DefaultHTTPSimAddr = ":8888" -) - -//WithServer implements the builder pattern constructor for Simulation to -//start with a HTTP server -func (s *Simulation) WithServer(addr string) *Simulation { - //assign default addr if nothing provided - if addr == "" { - addr = DefaultHTTPSimAddr - } - log.Info(fmt.Sprintf("Initializing simulation server on %s...", addr)) - //initialize the HTTP server - s.handler = simulations.NewServer(s.Net) - s.runC = make(chan struct{}) - //add swarm specific routes to the HTTP server - s.addSimulationRoutes() - s.httpSrv = &http.Server{ - Addr: addr, - Handler: s.handler, - } - go func() { - err := s.httpSrv.ListenAndServe() - if err != nil { - log.Error("Error starting the HTTP server", "error", err) - } - }() - return s -} - -//register additional HTTP routes -func (s *Simulation) addSimulationRoutes() { - s.handler.POST("/runsim", s.RunSimulation) -} - -// RunSimulation is the actual POST endpoint runner -func (s *Simulation) RunSimulation(w http.ResponseWriter, req *http.Request) { - log.Debug("RunSimulation endpoint running") - s.runC <- struct{}{} - w.WriteHeader(http.StatusOK) -} diff --git a/swarm/network/simulation/http_test.go b/swarm/network/simulation/http_test.go deleted file mode 100644 index f26a7bd33bea..000000000000 --- a/swarm/network/simulation/http_test.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2018 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 simulation - -import ( - "context" - "fmt" - "net/http" - "sync" - "testing" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" -) - -func TestSimulationWithHTTPServer(t *testing.T) { - log.Debug("Init simulation") - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) - defer cancel() - - sim := New( - map[string]ServiceFunc{ - "noop": func(_ *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) { - return newNoopService(), nil, nil - }, - }).WithServer(DefaultHTTPSimAddr) - defer sim.Close() - log.Debug("Done.") - - _, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - log.Debug("Starting sim round and let it time out...") - //first test that running without sending to the channel will actually - //block the simulation, so let it time out - result := sim.Run(ctx, func(ctx context.Context, sim *Simulation) error { - log.Debug("Just start the sim without any action and wait for the timeout") - //ensure with a Sleep that simulation doesn't terminate before the timeout - time.Sleep(2 * time.Second) - return nil - }) - - if result.Error != nil { - if result.Error.Error() == "context deadline exceeded" { - log.Debug("Expected timeout error received") - } else { - t.Fatal(result.Error) - } - } - - //now run it again and send the expected signal on the waiting channel, - //then close the simulation - log.Debug("Starting sim round and wait for frontend signal...") - //this time the timeout should be long enough so that it doesn't kick in too early - ctx, cancel2 := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel2() - errC := make(chan error, 1) - go triggerSimulationRun(t, errC) - result = sim.Run(ctx, func(ctx context.Context, sim *Simulation) error { - log.Debug("This run waits for the run signal from `frontend`...") - //ensure with a Sleep that simulation doesn't terminate before the signal is received - time.Sleep(2 * time.Second) - return nil - }) - if result.Error != nil { - t.Fatal(result.Error) - } - if err := <-errC; err != nil { - t.Fatal(err) - } - log.Debug("Test terminated successfully") -} - -func triggerSimulationRun(t *testing.T, errC chan error) { - //We need to first wait for the sim HTTP server to start running... - time.Sleep(2 * time.Second) - //then we can send the signal - - log.Debug("Sending run signal to simulation: POST /runsim...") - resp, err := http.Post(fmt.Sprintf("http://localhost%s/runsim", DefaultHTTPSimAddr), "application/json", nil) - if err != nil { - errC <- fmt.Errorf("Request failed: %v", err) - return - } - log.Debug("Signal sent") - if resp.StatusCode != http.StatusOK { - errC <- fmt.Errorf("err %s", resp.Status) - return - } - errC <- resp.Body.Close() -} diff --git a/swarm/network/simulation/kademlia.go b/swarm/network/simulation/kademlia.go deleted file mode 100644 index 390a291c1bfc..000000000000 --- a/swarm/network/simulation/kademlia.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2018 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 simulation - -import ( - "context" - "encoding/hex" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/swarm/network" -) - -// BucketKeyKademlia is the key to be used for storing the kademlia -// instance for particular node, usually inside the ServiceFunc function. -var BucketKeyKademlia BucketKey = "kademlia" - -// WaitTillHealthy is blocking until the health of all kademlias is true. -// If error is not nil, a map of kademlia that was found not healthy is returned. -// TODO: Check correctness since change in kademlia depth calculation logic -func (s *Simulation) WaitTillHealthy(ctx context.Context) (ill map[enode.ID]*network.Kademlia, err error) { - // Prepare PeerPot map for checking Kademlia health - var ppmap map[string]*network.PeerPot - kademlias := s.kademlias() - addrs := make([][]byte, 0, len(kademlias)) - // TODO verify that all kademlias have same params - for _, k := range kademlias { - addrs = append(addrs, k.BaseAddr()) - } - ppmap = network.NewPeerPotMap(s.neighbourhoodSize, addrs) - - // Wait for healthy Kademlia on every node before checking files - ticker := time.NewTicker(200 * time.Millisecond) - defer ticker.Stop() - - ill = make(map[enode.ID]*network.Kademlia) - for { - select { - case <-ctx.Done(): - return ill, ctx.Err() - case <-ticker.C: - for k := range ill { - delete(ill, k) - } - log.Debug("kademlia health check", "addr count", len(addrs)) - for id, k := range kademlias { - //PeerPot for this node - addr := common.Bytes2Hex(k.BaseAddr()) - pp := ppmap[addr] - //call Healthy RPC - h := k.Healthy(pp) - //print info - log.Debug(k.String()) - log.Debug("kademlia", "connectNN", h.ConnectNN, "knowNN", h.KnowNN) - log.Debug("kademlia", "health", h.ConnectNN && h.KnowNN, "addr", hex.EncodeToString(k.BaseAddr()), "node", id) - log.Debug("kademlia", "ill condition", !h.ConnectNN, "addr", hex.EncodeToString(k.BaseAddr()), "node", id) - if !h.ConnectNN { - ill[id] = k - } - } - if len(ill) == 0 { - return nil, nil - } - } - } -} - -// kademlias returns all Kademlia instances that are set -// in simulation bucket. -func (s *Simulation) kademlias() (ks map[enode.ID]*network.Kademlia) { - items := s.UpNodesItems(BucketKeyKademlia) - ks = make(map[enode.ID]*network.Kademlia, len(items)) - for id, v := range items { - k, ok := v.(*network.Kademlia) - if !ok { - continue - } - ks[id] = k - } - return ks -} diff --git a/swarm/network/simulation/kademlia_test.go b/swarm/network/simulation/kademlia_test.go deleted file mode 100644 index 72011446e3aa..000000000000 --- a/swarm/network/simulation/kademlia_test.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2018 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 simulation - -import ( - "context" - "sync" - "testing" - "time" - - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/swarm/network" -) - -func TestWaitTillHealthy(t *testing.T) { - t.Skip("WaitTillHealthy depends on discovery, which relies on a reliable SuggestPeer, which is not reliable") - - sim := New(map[string]ServiceFunc{ - "bzz": func(ctx *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) { - addr := network.NewAddr(ctx.Config.Node()) - hp := network.NewHiveParams() - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - // store kademlia in node's bucket under BucketKeyKademlia - // so that it can be found by WaitTillHealthy method. - b.Store(BucketKeyKademlia, kad) - return network.NewBzz(config, kad, nil, nil, nil), nil, nil - }, - }) - defer sim.Close() - - _, err := sim.AddNodesAndConnectRing(10) - if err != nil { - t.Fatal(err) - } - - ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) - defer cancel() - ill, err := sim.WaitTillHealthy(ctx) - if err != nil { - for id, kad := range ill { - t.Log("Node", id) - t.Log(kad.String()) - } - if err != nil { - t.Fatal(err) - } - } -} diff --git a/swarm/network/simulation/node.go b/swarm/network/simulation/node.go deleted file mode 100644 index 91b3b1a1f100..000000000000 --- a/swarm/network/simulation/node.go +++ /dev/null @@ -1,309 +0,0 @@ -// Copyright 2018 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 simulation - -import ( - "encoding/json" - "errors" - "io/ioutil" - "math/rand" - "os" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" -) - -// NodeIDs returns NodeIDs for all nodes in the network. -func (s *Simulation) NodeIDs() (ids []enode.ID) { - nodes := s.Net.GetNodes() - ids = make([]enode.ID, len(nodes)) - for i, node := range nodes { - ids[i] = node.ID() - } - return ids -} - -// UpNodeIDs returns NodeIDs for nodes that are up in the network. -func (s *Simulation) UpNodeIDs() (ids []enode.ID) { - nodes := s.Net.GetNodes() - for _, node := range nodes { - if node.Up { - ids = append(ids, node.ID()) - } - } - return ids -} - -// DownNodeIDs returns NodeIDs for nodes that are stopped in the network. -func (s *Simulation) DownNodeIDs() (ids []enode.ID) { - nodes := s.Net.GetNodes() - for _, node := range nodes { - if !node.Up { - ids = append(ids, node.ID()) - } - } - return ids -} - -// AddNodeOption defines the option that can be passed -// to Simulation.AddNode method. -type AddNodeOption func(*adapters.NodeConfig) - -// AddNodeWithMsgEvents sets the EnableMsgEvents option -// to NodeConfig. -func AddNodeWithMsgEvents(enable bool) AddNodeOption { - return func(o *adapters.NodeConfig) { - o.EnableMsgEvents = enable - } -} - -// AddNodeWithService specifies a service that should be -// started on a node. This option can be repeated as variadic -// argument toe AddNode and other add node related methods. -// If AddNodeWithService is not specified, all services will be started. -func AddNodeWithService(serviceName string) AddNodeOption { - return func(o *adapters.NodeConfig) { - o.Services = append(o.Services, serviceName) - } -} - -// AddNode creates a new node with random configuration, -// applies provided options to the config and adds the node to network. -// By default all services will be started on a node. If one or more -// AddNodeWithService option are provided, only specified services will be started. -func (s *Simulation) AddNode(opts ...AddNodeOption) (id enode.ID, err error) { - conf := adapters.RandomNodeConfig() - for _, o := range opts { - o(conf) - } - if len(conf.Services) == 0 { - conf.Services = s.serviceNames - } - node, err := s.Net.NewNodeWithConfig(conf) - if err != nil { - return id, err - } - return node.ID(), s.Net.Start(node.ID()) -} - -// AddNodes creates new nodes with random configurations, -// applies provided options to the config and adds nodes to network. -func (s *Simulation) AddNodes(count int, opts ...AddNodeOption) (ids []enode.ID, err error) { - ids = make([]enode.ID, 0, count) - for i := 0; i < count; i++ { - id, err := s.AddNode(opts...) - if err != nil { - return nil, err - } - ids = append(ids, id) - } - return ids, nil -} - -// AddNodesAndConnectFull is a helpper method that combines -// AddNodes and ConnectNodesFull. Only new nodes will be connected. -func (s *Simulation) AddNodesAndConnectFull(count int, opts ...AddNodeOption) (ids []enode.ID, err error) { - if count < 2 { - return nil, errors.New("count of nodes must be at least 2") - } - ids, err = s.AddNodes(count, opts...) - if err != nil { - return nil, err - } - err = s.Net.ConnectNodesFull(ids) - if err != nil { - return nil, err - } - return ids, nil -} - -// AddNodesAndConnectChain is a helpper method that combines -// AddNodes and ConnectNodesChain. The chain will be continued from the last -// added node, if there is one in simulation using ConnectToLastNode method. -func (s *Simulation) AddNodesAndConnectChain(count int, opts ...AddNodeOption) (ids []enode.ID, err error) { - if count < 2 { - return nil, errors.New("count of nodes must be at least 2") - } - id, err := s.AddNode(opts...) - if err != nil { - return nil, err - } - err = s.Net.ConnectToLastNode(id) - if err != nil { - return nil, err - } - ids, err = s.AddNodes(count-1, opts...) - if err != nil { - return nil, err - } - ids = append([]enode.ID{id}, ids...) - err = s.Net.ConnectNodesChain(ids) - if err != nil { - return nil, err - } - return ids, nil -} - -// AddNodesAndConnectRing is a helpper method that combines -// AddNodes and ConnectNodesRing. -func (s *Simulation) AddNodesAndConnectRing(count int, opts ...AddNodeOption) (ids []enode.ID, err error) { - if count < 2 { - return nil, errors.New("count of nodes must be at least 2") - } - ids, err = s.AddNodes(count, opts...) - if err != nil { - return nil, err - } - err = s.Net.ConnectNodesRing(ids) - if err != nil { - return nil, err - } - return ids, nil -} - -// AddNodesAndConnectStar is a helpper method that combines -// AddNodes and ConnectNodesStar. -func (s *Simulation) AddNodesAndConnectStar(count int, opts ...AddNodeOption) (ids []enode.ID, err error) { - if count < 2 { - return nil, errors.New("count of nodes must be at least 2") - } - ids, err = s.AddNodes(count, opts...) - if err != nil { - return nil, err - } - err = s.Net.ConnectNodesStar(ids[1:], ids[0]) - if err != nil { - return nil, err - } - return ids, nil -} - -// UploadSnapshot uploads a snapshot to the simulation -// This method tries to open the json file provided, applies the config to all nodes -// and then loads the snapshot into the Simulation network -func (s *Simulation) UploadSnapshot(snapshotFile string, opts ...AddNodeOption) error { - f, err := os.Open(snapshotFile) - if err != nil { - return err - } - defer func() { - err := f.Close() - if err != nil { - log.Error("Error closing snapshot file", "err", err) - } - }() - jsonbyte, err := ioutil.ReadAll(f) - if err != nil { - return err - } - var snap simulations.Snapshot - err = json.Unmarshal(jsonbyte, &snap) - if err != nil { - return err - } - - //the snapshot probably has the property EnableMsgEvents not set - //just in case, set it to true! - //(we need this to wait for messages before uploading) - for _, n := range snap.Nodes { - n.Node.Config.EnableMsgEvents = true - n.Node.Config.Services = s.serviceNames - for _, o := range opts { - o(n.Node.Config) - } - } - - log.Info("Waiting for p2p connections to be established...") - - //now we can load the snapshot - err = s.Net.Load(&snap) - if err != nil { - return err - } - log.Info("Snapshot loaded") - return nil -} - -// StartNode starts a node by NodeID. -func (s *Simulation) StartNode(id enode.ID) (err error) { - return s.Net.Start(id) -} - -// StartRandomNode starts a random node. -func (s *Simulation) StartRandomNode() (id enode.ID, err error) { - n := s.Net.GetRandomDownNode() - if n == nil { - return id, ErrNodeNotFound - } - return n.ID(), s.Net.Start(n.ID()) -} - -// StartRandomNodes starts random nodes. -func (s *Simulation) StartRandomNodes(count int) (ids []enode.ID, err error) { - ids = make([]enode.ID, 0, count) - for i := 0; i < count; i++ { - n := s.Net.GetRandomDownNode() - if n == nil { - return nil, ErrNodeNotFound - } - err = s.Net.Start(n.ID()) - if err != nil { - return nil, err - } - ids = append(ids, n.ID()) - } - return ids, nil -} - -// StopNode stops a node by NodeID. -func (s *Simulation) StopNode(id enode.ID) (err error) { - return s.Net.Stop(id) -} - -// StopRandomNode stops a random node. -func (s *Simulation) StopRandomNode() (id enode.ID, err error) { - n := s.Net.GetRandomUpNode() - if n == nil { - return id, ErrNodeNotFound - } - return n.ID(), s.Net.Stop(n.ID()) -} - -// StopRandomNodes stops random nodes. -func (s *Simulation) StopRandomNodes(count int) (ids []enode.ID, err error) { - ids = make([]enode.ID, 0, count) - for i := 0; i < count; i++ { - n := s.Net.GetRandomUpNode() - if n == nil { - return nil, ErrNodeNotFound - } - err = s.Net.Stop(n.ID()) - if err != nil { - return nil, err - } - ids = append(ids, n.ID()) - } - return ids, nil -} - -// seed the random generator for Simulation.randomNode. -func init() { - rand.Seed(time.Now().UnixNano()) -} diff --git a/swarm/network/simulation/node_test.go b/swarm/network/simulation/node_test.go deleted file mode 100644 index 70b6357330dd..000000000000 --- a/swarm/network/simulation/node_test.go +++ /dev/null @@ -1,459 +0,0 @@ -// Copyright 2018 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 simulation - -import ( - "context" - "fmt" - "sync" - "testing" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/swarm/network" -) - -func TestUpDownNodeIDs(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - ids, err := sim.AddNodes(10) - if err != nil { - t.Fatal(err) - } - - gotIDs := sim.NodeIDs() - - if !equalNodeIDs(ids, gotIDs) { - t.Error("returned nodes are not equal to added ones") - } - - stoppedIDs, err := sim.StopRandomNodes(3) - if err != nil { - t.Fatal(err) - } - - gotIDs = sim.UpNodeIDs() - - for _, id := range gotIDs { - if !sim.Net.GetNode(id).Up { - t.Errorf("node %s should not be down", id) - } - } - - if !equalNodeIDs(ids, append(gotIDs, stoppedIDs...)) { - t.Error("returned nodes are not equal to added ones") - } - - gotIDs = sim.DownNodeIDs() - - for _, id := range gotIDs { - if sim.Net.GetNode(id).Up { - t.Errorf("node %s should not be up", id) - } - } - - if !equalNodeIDs(stoppedIDs, gotIDs) { - t.Error("returned nodes are not equal to the stopped ones") - } -} - -func equalNodeIDs(one, other []enode.ID) bool { - if len(one) != len(other) { - return false - } - var count int - for _, a := range one { - var found bool - for _, b := range other { - if a == b { - found = true - break - } - } - if found { - count++ - } else { - return false - } - } - return count == len(one) -} - -func TestAddNode(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - id, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - n := sim.Net.GetNode(id) - if n == nil { - t.Fatal("node not found") - } - - if !n.Up { - t.Error("node not started") - } -} - -func TestAddNodeWithMsgEvents(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - id, err := sim.AddNode(AddNodeWithMsgEvents(true)) - if err != nil { - t.Fatal(err) - } - - if !sim.Net.GetNode(id).Config.EnableMsgEvents { - t.Error("EnableMsgEvents is false") - } - - id, err = sim.AddNode(AddNodeWithMsgEvents(false)) - if err != nil { - t.Fatal(err) - } - - if sim.Net.GetNode(id).Config.EnableMsgEvents { - t.Error("EnableMsgEvents is true") - } -} - -func TestAddNodeWithService(t *testing.T) { - sim := New(map[string]ServiceFunc{ - "noop1": noopServiceFunc, - "noop2": noopServiceFunc, - }) - defer sim.Close() - - id, err := sim.AddNode(AddNodeWithService("noop1")) - if err != nil { - t.Fatal(err) - } - - n := sim.Net.GetNode(id).Node.(*adapters.SimNode) - if n.Service("noop1") == nil { - t.Error("service noop1 not found on node") - } - if n.Service("noop2") != nil { - t.Error("service noop2 should not be found on node") - } -} - -func TestAddNodeMultipleServices(t *testing.T) { - sim := New(map[string]ServiceFunc{ - "noop1": noopServiceFunc, - "noop2": noopService2Func, - }) - defer sim.Close() - - id, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - n := sim.Net.GetNode(id).Node.(*adapters.SimNode) - if n.Service("noop1") == nil { - t.Error("service noop1 not found on node") - } - if n.Service("noop2") == nil { - t.Error("service noop2 not found on node") - } -} - -func TestAddNodeDuplicateServiceError(t *testing.T) { - sim := New(map[string]ServiceFunc{ - "noop1": noopServiceFunc, - "noop2": noopServiceFunc, - }) - defer sim.Close() - - wantErr := "duplicate service: *simulation.noopService" - _, err := sim.AddNode() - if err.Error() != wantErr { - t.Errorf("got error %q, want %q", err, wantErr) - } -} - -func TestAddNodes(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - nodesCount := 12 - - ids, err := sim.AddNodes(nodesCount) - if err != nil { - t.Fatal(err) - } - - count := len(ids) - if count != nodesCount { - t.Errorf("expected %v nodes, got %v", nodesCount, count) - } - - count = len(sim.Net.GetNodes()) - if count != nodesCount { - t.Errorf("expected %v nodes, got %v", nodesCount, count) - } -} - -func TestAddNodesAndConnectFull(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - n := 12 - - ids, err := sim.AddNodesAndConnectFull(n) - if err != nil { - t.Fatal(err) - } - - simulations.VerifyFull(t, sim.Net, ids) -} - -func TestAddNodesAndConnectChain(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - _, err := sim.AddNodesAndConnectChain(12) - if err != nil { - t.Fatal(err) - } - - // add another set of nodes to test - // if two chains are connected - _, err = sim.AddNodesAndConnectChain(7) - if err != nil { - t.Fatal(err) - } - - simulations.VerifyChain(t, sim.Net, sim.UpNodeIDs()) -} - -func TestAddNodesAndConnectRing(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - ids, err := sim.AddNodesAndConnectRing(12) - if err != nil { - t.Fatal(err) - } - - simulations.VerifyRing(t, sim.Net, ids) -} - -func TestAddNodesAndConnectStar(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - ids, err := sim.AddNodesAndConnectStar(12) - if err != nil { - t.Fatal(err) - } - - simulations.VerifyStar(t, sim.Net, ids, 0) -} - -//To test that uploading a snapshot works -func TestUploadSnapshot(t *testing.T) { - log.Debug("Creating simulation") - s := New(map[string]ServiceFunc{ - "bzz": func(ctx *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) { - addr := network.NewAddr(ctx.Config.Node()) - hp := network.NewHiveParams() - hp.Discovery = false - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - return network.NewBzz(config, kad, nil, nil, nil), nil, nil - }, - }) - defer s.Close() - - nodeCount := 16 - log.Debug("Uploading snapshot") - err := s.UploadSnapshot(fmt.Sprintf("../stream/testing/snapshot_%d.json", nodeCount)) - if err != nil { - t.Fatalf("Error uploading snapshot to simulation network: %v", err) - } - - ctx := context.Background() - log.Debug("Starting simulation...") - s.Run(ctx, func(ctx context.Context, sim *Simulation) error { - log.Debug("Checking") - nodes := sim.UpNodeIDs() - if len(nodes) != nodeCount { - t.Fatal("Simulation network node number doesn't match snapshot node number") - } - return nil - }) - log.Debug("Done.") -} - -func TestStartStopNode(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - id, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - n := sim.Net.GetNode(id) - if n == nil { - t.Fatal("node not found") - } - if !n.Up { - t.Error("node not started") - } - - err = sim.StopNode(id) - if err != nil { - t.Fatal(err) - } - if n.Up { - t.Error("node not stopped") - } - - // Sleep here to ensure that Network.watchPeerEvents defer function - // has set the `node.Up = false` before we start the node again. - // p2p/simulations/network.go:215 - // - // The same node is stopped and started again, and upon start - // watchPeerEvents is started in a goroutine. If the node is stopped - // and then very quickly started, that goroutine may be scheduled later - // then start and force `node.Up = false` in its defer function. - // This will make this test unreliable. - time.Sleep(time.Second) - - err = sim.StartNode(id) - if err != nil { - t.Fatal(err) - } - if !n.Up { - t.Error("node not started") - } -} - -func TestStartStopRandomNode(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - _, err := sim.AddNodes(3) - if err != nil { - t.Fatal(err) - } - - id, err := sim.StopRandomNode() - if err != nil { - t.Fatal(err) - } - - n := sim.Net.GetNode(id) - if n == nil { - t.Fatal("node not found") - } - if n.Up { - t.Error("node not stopped") - } - - id2, err := sim.StopRandomNode() - if err != nil { - t.Fatal(err) - } - - // Sleep here to ensure that Network.watchPeerEvents defer function - // has set the `node.Up = false` before we start the node again. - // p2p/simulations/network.go:215 - // - // The same node is stopped and started again, and upon start - // watchPeerEvents is started in a goroutine. If the node is stopped - // and then very quickly started, that goroutine may be scheduled later - // then start and force `node.Up = false` in its defer function. - // This will make this test unreliable. - time.Sleep(time.Second) - - idStarted, err := sim.StartRandomNode() - if err != nil { - t.Fatal(err) - } - - if idStarted != id && idStarted != id2 { - t.Error("unexpected started node ID") - } -} - -func TestStartStopRandomNodes(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - _, err := sim.AddNodes(10) - if err != nil { - t.Fatal(err) - } - - ids, err := sim.StopRandomNodes(3) - if err != nil { - t.Fatal(err) - } - - for _, id := range ids { - n := sim.Net.GetNode(id) - if n == nil { - t.Fatal("node not found") - } - if n.Up { - t.Error("node not stopped") - } - } - - // Sleep here to ensure that Network.watchPeerEvents defer function - // has set the `node.Up = false` before we start the node again. - // p2p/simulations/network.go:215 - // - // The same node is stopped and started again, and upon start - // watchPeerEvents is started in a goroutine. If the node is stopped - // and then very quickly started, that goroutine may be scheduled later - // then start and force `node.Up = false` in its defer function. - // This will make this test unreliable. - time.Sleep(time.Second) - - ids, err = sim.StartRandomNodes(2) - if err != nil { - t.Fatal(err) - } - - for _, id := range ids { - n := sim.Net.GetNode(id) - if n == nil { - t.Fatal("node not found") - } - if !n.Up { - t.Error("node not started") - } - } -} diff --git a/swarm/network/simulation/service.go b/swarm/network/simulation/service.go deleted file mode 100644 index 7a3416ed9de1..000000000000 --- a/swarm/network/simulation/service.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2018 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 simulation - -import ( - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" -) - -// Service returns a single Service by name on a particular node -// with provided id. -func (s *Simulation) Service(name string, id enode.ID) node.Service { - simNode, ok := s.Net.GetNode(id).Node.(*adapters.SimNode) - if !ok { - return nil - } - services := simNode.ServiceMap() - if len(services) == 0 { - return nil - } - return services[name] -} - -// RandomService returns a single Service by name on a -// randomly chosen node that is up. -func (s *Simulation) RandomService(name string) node.Service { - n := s.Net.GetRandomUpNode().Node.(*adapters.SimNode) - if n == nil { - return nil - } - return n.Service(name) -} - -// Services returns all services with a provided name -// from nodes that are up. -func (s *Simulation) Services(name string) (services map[enode.ID]node.Service) { - nodes := s.Net.GetNodes() - services = make(map[enode.ID]node.Service) - for _, node := range nodes { - if !node.Up { - continue - } - simNode, ok := node.Node.(*adapters.SimNode) - if !ok { - continue - } - services[node.ID()] = simNode.Service(name) - } - return services -} diff --git a/swarm/network/simulation/service_test.go b/swarm/network/simulation/service_test.go deleted file mode 100644 index 23b0d86f243f..000000000000 --- a/swarm/network/simulation/service_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2018 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 simulation - -import ( - "testing" -) - -func TestService(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - id, err := sim.AddNode() - if err != nil { - t.Fatal(err) - } - - _, ok := sim.Service("noop", id).(*noopService) - if !ok { - t.Fatalf("service is not of %T type", &noopService{}) - } - - _, ok = sim.RandomService("noop").(*noopService) - if !ok { - t.Fatalf("service is not of %T type", &noopService{}) - } - - _, ok = sim.Services("noop")[id].(*noopService) - if !ok { - t.Fatalf("service is not of %T type", &noopService{}) - } -} diff --git a/swarm/network/simulation/simulation.go b/swarm/network/simulation/simulation.go deleted file mode 100644 index a55968e22379..000000000000 --- a/swarm/network/simulation/simulation.go +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright 2018 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 simulation - -import ( - "context" - "errors" - "net/http" - "sync" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/swarm/network" -) - -// Common errors that are returned by functions in this package. -var ( - ErrNodeNotFound = errors.New("node not found") -) - -// Simulation provides methods on network, nodes and services -// to manage them. -type Simulation struct { - // Net is exposed as a way to access lower level functionalities - // of p2p/simulations.Network. - Net *simulations.Network - - serviceNames []string - cleanupFuncs []func() - buckets map[enode.ID]*sync.Map - shutdownWG sync.WaitGroup - done chan struct{} - mu sync.RWMutex - neighbourhoodSize int - - httpSrv *http.Server //attach a HTTP server via SimulationOptions - handler *simulations.Server //HTTP handler for the server - runC chan struct{} //channel where frontend signals it is ready -} - -// ServiceFunc is used in New to declare new service constructor. -// The first argument provides ServiceContext from the adapters package -// giving for example the access to NodeID. Second argument is the sync.Map -// where all "global" state related to the service should be kept. -// All cleanups needed for constructed service and any other constructed -// objects should ne provided in a single returned cleanup function. -// Returned cleanup function will be called by Close function -// after network shutdown. -type ServiceFunc func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) - -// New creates a new simulation instance -// Services map must have unique keys as service names and -// every ServiceFunc must return a node.Service of the unique type. -// This restriction is required by node.Node.Start() function -// which is used to start node.Service returned by ServiceFunc. -func New(services map[string]ServiceFunc) (s *Simulation) { - s = &Simulation{ - buckets: make(map[enode.ID]*sync.Map), - done: make(chan struct{}), - neighbourhoodSize: network.NewKadParams().NeighbourhoodSize, - } - - adapterServices := make(map[string]adapters.ServiceFunc, len(services)) - for name, serviceFunc := range services { - // Scope this variables correctly - // as they will be in the adapterServices[name] function accessed later. - name, serviceFunc := name, serviceFunc - s.serviceNames = append(s.serviceNames, name) - adapterServices[name] = func(ctx *adapters.ServiceContext) (node.Service, error) { - b := new(sync.Map) - service, cleanup, err := serviceFunc(ctx, b) - if err != nil { - return nil, err - } - s.mu.Lock() - defer s.mu.Unlock() - if cleanup != nil { - s.cleanupFuncs = append(s.cleanupFuncs, cleanup) - } - s.buckets[ctx.Config.ID] = b - return service, nil - } - } - - s.Net = simulations.NewNetwork( - adapters.NewTCPAdapter(adapterServices), - &simulations.NetworkConfig{ID: "0"}, - ) - - return s -} - -// RunFunc is the function that will be called -// on Simulation.Run method call. -type RunFunc func(context.Context, *Simulation) error - -// Result is the returned value of Simulation.Run method. -type Result struct { - Duration time.Duration - Error error -} - -// Run calls the RunFunc function while taking care of -// cancellation provided through the Context. -func (s *Simulation) Run(ctx context.Context, f RunFunc) (r Result) { - //if the option is set to run a HTTP server with the simulation, - //init the server and start it - start := time.Now() - if s.httpSrv != nil { - log.Info("Waiting for frontend to be ready...(send POST /runsim to HTTP server)") - //wait for the frontend to connect - select { - case <-s.runC: - case <-ctx.Done(): - return Result{ - Duration: time.Since(start), - Error: ctx.Err(), - } - } - log.Info("Received signal from frontend - starting simulation run.") - } - errc := make(chan error) - quit := make(chan struct{}) - defer close(quit) - go func() { - select { - case errc <- f(ctx, s): - case <-quit: - } - }() - var err error - select { - case <-ctx.Done(): - err = ctx.Err() - case err = <-errc: - } - return Result{ - Duration: time.Since(start), - Error: err, - } -} - -// Maximal number of parallel calls to cleanup functions on -// Simulation.Close. -var maxParallelCleanups = 10 - -// Close calls all cleanup functions that are returned by -// ServiceFunc, waits for all of them to finish and other -// functions that explicitly block shutdownWG -// (like Simulation.PeerEvents) and shuts down the network -// at the end. It is used to clean all resources from the -// simulation. -func (s *Simulation) Close() { - close(s.done) - - sem := make(chan struct{}, maxParallelCleanups) - s.mu.RLock() - cleanupFuncs := make([]func(), len(s.cleanupFuncs)) - for i, f := range s.cleanupFuncs { - if f != nil { - cleanupFuncs[i] = f - } - } - s.mu.RUnlock() - var cleanupWG sync.WaitGroup - for _, cleanup := range cleanupFuncs { - cleanupWG.Add(1) - sem <- struct{}{} - go func(cleanup func()) { - defer cleanupWG.Done() - defer func() { <-sem }() - - cleanup() - }(cleanup) - } - cleanupWG.Wait() - - if s.httpSrv != nil { - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) - defer cancel() - err := s.httpSrv.Shutdown(ctx) - if err != nil { - log.Error("Error shutting down HTTP server!", "err", err) - } - close(s.runC) - } - - s.shutdownWG.Wait() - s.Net.Shutdown() -} - -// Done returns a channel that is closed when the simulation -// is closed by Close method. It is useful for signaling termination -// of all possible goroutines that are created within the test. -func (s *Simulation) Done() <-chan struct{} { - return s.done -} diff --git a/swarm/network/simulation/simulation_test.go b/swarm/network/simulation/simulation_test.go deleted file mode 100644 index 591abb263e37..000000000000 --- a/swarm/network/simulation/simulation_test.go +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright 2018 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 simulation - -import ( - "context" - "errors" - "flag" - "sync" - "testing" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/mattn/go-colorable" -) - -var ( - loglevel = flag.Int("loglevel", 2, "verbosity of logs") -) - -func init() { - flag.Parse() - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) -} - -// TestRun tests if Run method calls RunFunc and if it handles context properly. -func TestRun(t *testing.T) { - sim := New(noopServiceFuncMap) - defer sim.Close() - - t.Run("call", func(t *testing.T) { - expect := "something" - var got string - r := sim.Run(context.Background(), func(ctx context.Context, sim *Simulation) error { - got = expect - return nil - }) - - if r.Error != nil { - t.Errorf("unexpected error: %v", r.Error) - } - if got != expect { - t.Errorf("expected %q, got %q", expect, got) - } - }) - - t.Run("cancellation", func(t *testing.T) { - ctx, cancel := context.WithTimeout(context.Background(), 50*time.Millisecond) - defer cancel() - - r := sim.Run(ctx, func(ctx context.Context, sim *Simulation) error { - time.Sleep(time.Second) - return nil - }) - - if r.Error != context.DeadlineExceeded { - t.Errorf("unexpected error: %v", r.Error) - } - }) - - t.Run("context value and duration", func(t *testing.T) { - ctx := context.WithValue(context.Background(), "hey", "there") - sleep := 50 * time.Millisecond - - r := sim.Run(ctx, func(ctx context.Context, sim *Simulation) error { - if ctx.Value("hey") != "there" { - return errors.New("expected context value not passed") - } - time.Sleep(sleep) - return nil - }) - - if r.Error != nil { - t.Errorf("unexpected error: %v", r.Error) - } - if r.Duration < sleep { - t.Errorf("reported run duration less then expected: %s", r.Duration) - } - }) -} - -// TestClose tests are Close method triggers all close functions and are all nodes not up anymore. -func TestClose(t *testing.T) { - var mu sync.Mutex - var cleanupCount int - - sleep := 50 * time.Millisecond - - sim := New(map[string]ServiceFunc{ - "noop": func(ctx *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) { - return newNoopService(), func() { - time.Sleep(sleep) - mu.Lock() - defer mu.Unlock() - cleanupCount++ - }, nil - }, - }) - - nodeCount := 30 - - _, err := sim.AddNodes(nodeCount) - if err != nil { - t.Fatal(err) - } - - var upNodeCount int - for _, n := range sim.Net.GetNodes() { - if n.Up { - upNodeCount++ - } - } - if upNodeCount != nodeCount { - t.Errorf("all nodes should be up, insted only %v are up", upNodeCount) - } - - sim.Close() - - if cleanupCount != nodeCount { - t.Errorf("number of cleanups expected %v, got %v", nodeCount, cleanupCount) - } - - upNodeCount = 0 - for _, n := range sim.Net.GetNodes() { - if n.Up { - upNodeCount++ - } - } - if upNodeCount != 0 { - t.Errorf("all nodes should be down, insted %v are up", upNodeCount) - } -} - -// TestDone checks if Close method triggers the closing of done channel. -func TestDone(t *testing.T) { - sim := New(noopServiceFuncMap) - sleep := 50 * time.Millisecond - timeout := 2 * time.Second - - start := time.Now() - go func() { - time.Sleep(sleep) - sim.Close() - }() - - select { - case <-time.After(timeout): - t.Error("done channel closing timed out") - case <-sim.Done(): - if d := time.Since(start); d < sleep { - t.Errorf("done channel closed sooner then expected: %s", d) - } - } -} - -// a helper map for usual services that do not do anything -var noopServiceFuncMap = map[string]ServiceFunc{ - "noop": noopServiceFunc, -} - -// a helper function for most basic noop service -func noopServiceFunc(_ *adapters.ServiceContext, _ *sync.Map) (node.Service, func(), error) { - return newNoopService(), nil, nil -} - -func newNoopService() node.Service { - return &noopService{} -} - -// a helper function for most basic Noop service -// of a different type then NoopService to test -// multiple services on one node. -func noopService2Func(_ *adapters.ServiceContext, _ *sync.Map) (node.Service, func(), error) { - return new(noopService2), nil, nil -} - -// NoopService2 is the service that does not do anything -// but implements node.Service interface. -type noopService2 struct { - simulations.NoopService -} - -type noopService struct { - simulations.NoopService -} diff --git a/swarm/network/simulations/discovery/discovery.go b/swarm/network/simulations/discovery/discovery.go deleted file mode 100644 index a6ff5fd45e67..000000000000 --- a/swarm/network/simulations/discovery/discovery.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2018 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 discovery diff --git a/swarm/network/simulations/discovery/discovery_test.go b/swarm/network/simulations/discovery/discovery_test.go deleted file mode 100644 index 505354f983be..000000000000 --- a/swarm/network/simulations/discovery/discovery_test.go +++ /dev/null @@ -1,599 +0,0 @@ -// Copyright 2018 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 discovery - -import ( - "context" - "encoding/json" - "errors" - "flag" - "fmt" - "io/ioutil" - "math/rand" - "os" - "path" - "strings" - "sync" - "testing" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/state" - colorable "github.com/mattn/go-colorable" -) - -// serviceName is used with the exec adapter so the exec'd binary knows which -// service to execute -const serviceName = "discovery" -const testNeighbourhoodSize = 2 -const discoveryPersistenceDatadir = "discovery_persistence_test_store" - -var discoveryPersistencePath = path.Join(os.TempDir(), discoveryPersistenceDatadir) -var discoveryEnabled = true -var persistenceEnabled = false - -var services = adapters.Services{ - serviceName: newService, -} - -func cleanDbStores() error { - entries, err := ioutil.ReadDir(os.TempDir()) - if err != nil { - return err - } - - for _, f := range entries { - if strings.HasPrefix(f.Name(), discoveryPersistenceDatadir) { - os.RemoveAll(path.Join(os.TempDir(), f.Name())) - } - } - return nil - -} - -func getDbStore(nodeID string) (*state.DBStore, error) { - if _, err := os.Stat(discoveryPersistencePath + "_" + nodeID); os.IsNotExist(err) { - log.Info(fmt.Sprintf("directory for nodeID %s does not exist. creating...", nodeID)) - ioutil.TempDir("", discoveryPersistencePath+"_"+nodeID) - } - log.Info(fmt.Sprintf("opening storage directory for nodeID %s", nodeID)) - store, err := state.NewDBStore(discoveryPersistencePath + "_" + nodeID) - if err != nil { - return nil, err - } - return store, nil -} - -var ( - nodeCount = flag.Int("nodes", 10, "number of nodes to create (default 10)") - initCount = flag.Int("conns", 1, "number of originally connected peers (default 1)") - snapshotFile = flag.String("snapshot", "", "path to create snapshot file in") - loglevel = flag.Int("loglevel", 3, "verbosity of logs") - rawlog = flag.Bool("rawlog", false, "remove terminal formatting from logs") - serviceOverride = flag.String("services", "", "remove or add services to the node snapshot; prefix with \"+\" to add, \"-\" to remove; example: +pss,-discovery") -) - -func init() { - flag.Parse() - // register the discovery service which will run as a devp2p - // protocol when using the exec adapter - adapters.RegisterServices(services) - - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(!*rawlog)))) -} - -// Benchmarks to test the average time it takes for an N-node ring -// to full a healthy kademlia topology -func BenchmarkDiscovery_8_1(b *testing.B) { benchmarkDiscovery(b, 8, 1) } -func BenchmarkDiscovery_16_1(b *testing.B) { benchmarkDiscovery(b, 16, 1) } -func BenchmarkDiscovery_32_1(b *testing.B) { benchmarkDiscovery(b, 32, 1) } -func BenchmarkDiscovery_64_1(b *testing.B) { benchmarkDiscovery(b, 64, 1) } -func BenchmarkDiscovery_128_1(b *testing.B) { benchmarkDiscovery(b, 128, 1) } -func BenchmarkDiscovery_256_1(b *testing.B) { benchmarkDiscovery(b, 256, 1) } - -func BenchmarkDiscovery_8_2(b *testing.B) { benchmarkDiscovery(b, 8, 2) } -func BenchmarkDiscovery_16_2(b *testing.B) { benchmarkDiscovery(b, 16, 2) } -func BenchmarkDiscovery_32_2(b *testing.B) { benchmarkDiscovery(b, 32, 2) } -func BenchmarkDiscovery_64_2(b *testing.B) { benchmarkDiscovery(b, 64, 2) } -func BenchmarkDiscovery_128_2(b *testing.B) { benchmarkDiscovery(b, 128, 2) } -func BenchmarkDiscovery_256_2(b *testing.B) { benchmarkDiscovery(b, 256, 2) } - -func BenchmarkDiscovery_8_4(b *testing.B) { benchmarkDiscovery(b, 8, 4) } -func BenchmarkDiscovery_16_4(b *testing.B) { benchmarkDiscovery(b, 16, 4) } -func BenchmarkDiscovery_32_4(b *testing.B) { benchmarkDiscovery(b, 32, 4) } -func BenchmarkDiscovery_64_4(b *testing.B) { benchmarkDiscovery(b, 64, 4) } -func BenchmarkDiscovery_128_4(b *testing.B) { benchmarkDiscovery(b, 128, 4) } -func BenchmarkDiscovery_256_4(b *testing.B) { benchmarkDiscovery(b, 256, 4) } - -func TestDiscoverySimulationExecAdapter(t *testing.T) { - testDiscoverySimulationExecAdapter(t, *nodeCount, *initCount) -} - -func testDiscoverySimulationExecAdapter(t *testing.T, nodes, conns int) { - baseDir, err := ioutil.TempDir("", "swarm-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(baseDir) - testDiscoverySimulation(t, nodes, conns, adapters.NewExecAdapter(baseDir)) -} - -func TestDiscoverySimulationSimAdapter(t *testing.T) { - testDiscoverySimulationSimAdapter(t, *nodeCount, *initCount) -} - -func TestDiscoveryPersistenceSimulationSimAdapter(t *testing.T) { - testDiscoveryPersistenceSimulationSimAdapter(t, *nodeCount, *initCount) -} - -func testDiscoveryPersistenceSimulationSimAdapter(t *testing.T, nodes, conns int) { - testDiscoveryPersistenceSimulation(t, nodes, conns, adapters.NewSimAdapter(services)) -} - -func testDiscoverySimulationSimAdapter(t *testing.T, nodes, conns int) { - testDiscoverySimulation(t, nodes, conns, adapters.NewSimAdapter(services)) -} - -func testDiscoverySimulation(t *testing.T, nodes, conns int, adapter adapters.NodeAdapter) { - t.Skip("discovery tests depend on suggestpeer, which is unreliable after kademlia depth change.") - startedAt := time.Now() - result, err := discoverySimulation(nodes, conns, adapter) - if err != nil { - t.Fatalf("Setting up simulation failed: %v", err) - } - if result.Error != nil { - t.Fatalf("Simulation failed: %s", result.Error) - } - t.Logf("Simulation with %d nodes passed in %s", nodes, result.FinishedAt.Sub(result.StartedAt)) - var min, max time.Duration - var sum int - for _, pass := range result.Passes { - duration := pass.Sub(result.StartedAt) - if sum == 0 || duration < min { - min = duration - } - if duration > max { - max = duration - } - sum += int(duration.Nanoseconds()) - } - t.Logf("Min: %s, Max: %s, Average: %s", min, max, time.Duration(sum/len(result.Passes))*time.Nanosecond) - finishedAt := time.Now() - t.Logf("Setup: %s, shutdown: %s", result.StartedAt.Sub(startedAt), finishedAt.Sub(result.FinishedAt)) -} - -func testDiscoveryPersistenceSimulation(t *testing.T, nodes, conns int, adapter adapters.NodeAdapter) map[int][]byte { - t.Skip("discovery tests depend on suggestpeer, which is unreliable after kademlia depth change.") - persistenceEnabled = true - discoveryEnabled = true - - result, err := discoveryPersistenceSimulation(nodes, conns, adapter) - - if err != nil { - t.Fatalf("Setting up simulation failed: %v", err) - } - if result.Error != nil { - t.Fatalf("Simulation failed: %s", result.Error) - } - t.Logf("Simulation with %d nodes passed in %s", nodes, result.FinishedAt.Sub(result.StartedAt)) - // set the discovery and persistence flags again to default so other - // tests will not be affected - discoveryEnabled = true - persistenceEnabled = false - return nil -} - -func benchmarkDiscovery(b *testing.B, nodes, conns int) { - for i := 0; i < b.N; i++ { - result, err := discoverySimulation(nodes, conns, adapters.NewSimAdapter(services)) - if err != nil { - b.Fatalf("setting up simulation failed: %v", err) - } - if result.Error != nil { - b.Logf("simulation failed: %s", result.Error) - } - } -} - -func discoverySimulation(nodes, conns int, adapter adapters.NodeAdapter) (*simulations.StepResult, error) { - // create network - net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ - ID: "0", - DefaultService: serviceName, - }) - defer net.Shutdown() - trigger := make(chan enode.ID) - ids := make([]enode.ID, nodes) - for i := 0; i < nodes; i++ { - conf := adapters.RandomNodeConfig() - node, err := net.NewNodeWithConfig(conf) - if err != nil { - return nil, fmt.Errorf("error starting node: %s", err) - } - if err := net.Start(node.ID()); err != nil { - return nil, fmt.Errorf("error starting node %s: %s", node.ID().TerminalString(), err) - } - if err := triggerChecks(trigger, net, node.ID()); err != nil { - return nil, fmt.Errorf("error triggering checks for node %s: %s", node.ID().TerminalString(), err) - } - ids[i] = node.ID() - } - - // run a simulation which connects the 10 nodes in a ring and waits - // for full peer discovery - var addrs [][]byte - action := func(ctx context.Context) error { - return nil - } - wg := sync.WaitGroup{} - for i := range ids { - // collect the overlay addresses, to - addrs = append(addrs, ids[i].Bytes()) - for j := 0; j < conns; j++ { - var k int - if j == 0 { - k = (i + 1) % len(ids) - } else { - k = rand.Intn(len(ids)) - } - wg.Add(1) - go func(i, k int) { - defer wg.Done() - net.Connect(ids[i], ids[k]) - }(i, k) - } - } - wg.Wait() - log.Debug(fmt.Sprintf("nodes: %v", len(addrs))) - // construct the peer pot, so that kademlia health can be checked - ppmap := network.NewPeerPotMap(network.NewKadParams().NeighbourhoodSize, addrs) - check := func(ctx context.Context, id enode.ID) (bool, error) { - select { - case <-ctx.Done(): - return false, ctx.Err() - default: - } - - node := net.GetNode(id) - if node == nil { - return false, fmt.Errorf("unknown node: %s", id) - } - client, err := node.Client() - if err != nil { - return false, fmt.Errorf("error getting node client: %s", err) - } - - healthy := &network.Health{} - if err := client.Call(&healthy, "hive_healthy", ppmap); err != nil { - return false, fmt.Errorf("error getting node health: %s", err) - } - log.Info(fmt.Sprintf("node %4s healthy: connected nearest neighbours: %v, know nearest neighbours: %v,\n\n%v", id, healthy.ConnectNN, healthy.KnowNN, healthy.Hive)) - return healthy.KnowNN && healthy.ConnectNN, nil - } - - // 64 nodes ~ 1min - // 128 nodes ~ - timeout := 300 * time.Second - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - result := simulations.NewSimulation(net).Run(ctx, &simulations.Step{ - Action: action, - Trigger: trigger, - Expect: &simulations.Expectation{ - Nodes: ids, - Check: check, - }, - }) - if result.Error != nil { - return result, nil - } - - if *snapshotFile != "" { - var err error - var snap *simulations.Snapshot - if len(*serviceOverride) > 0 { - var addServices []string - var removeServices []string - for _, osvc := range strings.Split(*serviceOverride, ",") { - if strings.Index(osvc, "+") == 0 { - addServices = append(addServices, osvc[1:]) - } else if strings.Index(osvc, "-") == 0 { - removeServices = append(removeServices, osvc[1:]) - } else { - panic("stick to the rules, you know what they are") - } - } - snap, err = net.SnapshotWithServices(addServices, removeServices) - } else { - snap, err = net.Snapshot() - } - - if err != nil { - return nil, errors.New("no shapshot dude") - } - jsonsnapshot, err := json.Marshal(snap) - if err != nil { - return nil, fmt.Errorf("corrupt json snapshot: %v", err) - } - log.Info("writing snapshot", "file", *snapshotFile) - err = ioutil.WriteFile(*snapshotFile, jsonsnapshot, 0755) - if err != nil { - return nil, err - } - } - return result, nil -} - -func discoveryPersistenceSimulation(nodes, conns int, adapter adapters.NodeAdapter) (*simulations.StepResult, error) { - cleanDbStores() - defer cleanDbStores() - - // create network - net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ - ID: "0", - DefaultService: serviceName, - }) - defer net.Shutdown() - trigger := make(chan enode.ID) - ids := make([]enode.ID, nodes) - var addrs [][]byte - - for i := 0; i < nodes; i++ { - conf := adapters.RandomNodeConfig() - node, err := net.NewNodeWithConfig(conf) - if err != nil { - panic(err) - } - if err != nil { - return nil, fmt.Errorf("error starting node: %s", err) - } - if err := net.Start(node.ID()); err != nil { - return nil, fmt.Errorf("error starting node %s: %s", node.ID().TerminalString(), err) - } - if err := triggerChecks(trigger, net, node.ID()); err != nil { - return nil, fmt.Errorf("error triggering checks for node %s: %s", node.ID().TerminalString(), err) - } - // TODO we shouldn't be equating underaddr and overaddr like this, as they are not the same in production - ids[i] = node.ID() - a := ids[i].Bytes() - - addrs = append(addrs, a) - } - - // run a simulation which connects the 10 nodes in a ring and waits - // for full peer discovery - - var restartTime time.Time - - action := func(ctx context.Context) error { - ticker := time.NewTicker(500 * time.Millisecond) - - for range ticker.C { - isHealthy := true - for _, id := range ids { - //call Healthy RPC - node := net.GetNode(id) - if node == nil { - return fmt.Errorf("unknown node: %s", id) - } - client, err := node.Client() - if err != nil { - return fmt.Errorf("error getting node client: %s", err) - } - healthy := &network.Health{} - addr := id.String() - ppmap := network.NewPeerPotMap(network.NewKadParams().NeighbourhoodSize, addrs) - if err := client.Call(&healthy, "hive_healthy", ppmap); err != nil { - return fmt.Errorf("error getting node health: %s", err) - } - - log.Info(fmt.Sprintf("NODE: %s, IS HEALTHY: %t", addr, healthy.ConnectNN && healthy.KnowNN && healthy.CountKnowNN > 0)) - var nodeStr string - if err := client.Call(&nodeStr, "hive_string"); err != nil { - return fmt.Errorf("error getting node string %s", err) - } - log.Info(nodeStr) - for _, a := range addrs { - log.Info(common.Bytes2Hex(a)) - } - if !healthy.ConnectNN || healthy.CountKnowNN == 0 { - isHealthy = false - break - } - } - if isHealthy { - break - } - } - ticker.Stop() - - log.Info("reached healthy kademlia. starting to shutdown nodes.") - shutdownStarted := time.Now() - // stop all ids, then start them again - for _, id := range ids { - node := net.GetNode(id) - - if err := net.Stop(node.ID()); err != nil { - return fmt.Errorf("error stopping node %s: %s", node.ID().TerminalString(), err) - } - } - log.Info(fmt.Sprintf("shutting down nodes took: %s", time.Since(shutdownStarted))) - persistenceEnabled = true - discoveryEnabled = false - restartTime = time.Now() - for _, id := range ids { - node := net.GetNode(id) - if err := net.Start(node.ID()); err != nil { - return fmt.Errorf("error starting node %s: %s", node.ID().TerminalString(), err) - } - if err := triggerChecks(trigger, net, node.ID()); err != nil { - return fmt.Errorf("error triggering checks for node %s: %s", node.ID().TerminalString(), err) - } - } - - log.Info(fmt.Sprintf("restarting nodes took: %s", time.Since(restartTime))) - - return nil - } - //connects in a chain - wg := sync.WaitGroup{} - //connects in a ring - for i := range ids { - for j := 1; j <= conns; j++ { - k := (i + j) % len(ids) - if k == i { - k = (k + 1) % len(ids) - } - wg.Add(1) - go func(i, k int) { - defer wg.Done() - net.Connect(ids[i], ids[k]) - }(i, k) - } - } - wg.Wait() - log.Debug(fmt.Sprintf("nodes: %v", len(addrs))) - // construct the peer pot, so that kademlia health can be checked - check := func(ctx context.Context, id enode.ID) (bool, error) { - select { - case <-ctx.Done(): - return false, ctx.Err() - default: - } - - node := net.GetNode(id) - if node == nil { - return false, fmt.Errorf("unknown node: %s", id) - } - client, err := node.Client() - if err != nil { - return false, fmt.Errorf("error getting node client: %s", err) - } - healthy := &network.Health{} - ppmap := network.NewPeerPotMap(network.NewKadParams().NeighbourhoodSize, addrs) - - if err := client.Call(&healthy, "hive_healthy", ppmap); err != nil { - return false, fmt.Errorf("error getting node health: %s", err) - } - log.Info(fmt.Sprintf("node %4s healthy: got nearest neighbours: %v, know nearest neighbours: %v", id, healthy.ConnectNN, healthy.KnowNN)) - - return healthy.KnowNN && healthy.ConnectNN, nil - } - - // 64 nodes ~ 1min - // 128 nodes ~ - timeout := 300 * time.Second - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - result := simulations.NewSimulation(net).Run(ctx, &simulations.Step{ - Action: action, - Trigger: trigger, - Expect: &simulations.Expectation{ - Nodes: ids, - Check: check, - }, - }) - if result.Error != nil { - return result, nil - } - - return result, nil -} - -// triggerChecks triggers a simulation step check whenever a peer is added or -// removed from the given node, and also every second to avoid a race between -// peer events and kademlia becoming healthy -func triggerChecks(trigger chan enode.ID, net *simulations.Network, id enode.ID) error { - node := net.GetNode(id) - if node == nil { - return fmt.Errorf("unknown node: %s", id) - } - client, err := node.Client() - if err != nil { - return 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 func() { - defer sub.Unsubscribe() - - tick := time.NewTicker(time.Second) - defer tick.Stop() - - for { - select { - case <-events: - trigger <- id - case <-tick.C: - trigger <- id - case err := <-sub.Err(): - if err != nil { - log.Error(fmt.Sprintf("error getting peer events for node %v", id), "err", err) - } - return - } - } - }() - return nil -} - -func newService(ctx *adapters.ServiceContext) (node.Service, error) { - addr := network.NewAddr(ctx.Config.Node()) - - kp := network.NewKadParams() - kp.NeighbourhoodSize = testNeighbourhoodSize - - if ctx.Config.Reachable != nil { - kp.Reachable = func(o *network.BzzAddr) bool { - return ctx.Config.Reachable(o.ID()) - } - } - kad := network.NewKademlia(addr.Over(), kp) - hp := network.NewHiveParams() - hp.KeepAliveInterval = time.Duration(200) * time.Millisecond - hp.Discovery = discoveryEnabled - - log.Info(fmt.Sprintf("discovery for nodeID %s is %t", ctx.Config.ID.String(), hp.Discovery)) - - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - - if persistenceEnabled { - log.Info(fmt.Sprintf("persistence enabled for nodeID %s", ctx.Config.ID.String())) - store, err := getDbStore(ctx.Config.ID.String()) - if err != nil { - return nil, err - } - return network.NewBzz(config, kad, store, nil, nil), nil - } - - return network.NewBzz(config, kad, nil, nil, nil), nil -} diff --git a/swarm/network/simulations/discovery/snapshot.json b/swarm/network/simulations/discovery/snapshot.json deleted file mode 100755 index f7f400eb67a2..000000000000 --- a/swarm/network/simulations/discovery/snapshot.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}},{"node":{"config":null,"up":false}}],"conns":[{"one":"c04a0c47cb0c522ecf28d8841e93721e73f58790b30e92382816a4b453be2988","other":"d9283e5247a18d6564b3581217e9f4d9c93a4359944894c00bb2b22c690faadc","up":true},{"one":"dd99c11abe2abae112d64d902b96fe0c75243ea67eca759a2769058a30cc0e77","other":"c04a0c47cb0c522ecf28d8841e93721e73f58790b30e92382816a4b453be2988","up":true},{"one":"4f5dad2aa4f26ac5a23d4fbcc807296b474eab77761db6594debd60ef4287aed","other":"dd99c11abe2abae112d64d902b96fe0c75243ea67eca759a2769058a30cc0e77","up":true},{"one":"4f47f4e176d1c9f78d9a7e19723689ffe2a0603004a3d4506a2349e55a56fc17","other":"4f5dad2aa4f26ac5a23d4fbcc807296b474eab77761db6594debd60ef4287aed","up":true},{"one":"20b6a1be2cb8f966151682350e029d4f8da8ee92de10a2a1cb1727d110acebfa","other":"4f47f4e176d1c9f78d9a7e19723689ffe2a0603004a3d4506a2349e55a56fc17","up":true},{"one":"50cb92e77710582fa9cbee7a54cf25c95fd27d8d54b13ba5520a50139c309a22","other":"20b6a1be2cb8f966151682350e029d4f8da8ee92de10a2a1cb1727d110acebfa","up":true},{"one":"319dc901f99940f1339c540bc36fbabb10a96d326b13b9d7f53e7496980e2996","other":"50cb92e77710582fa9cbee7a54cf25c95fd27d8d54b13ba5520a50139c309a22","up":true},{"one":"dc285b6436a8bfd4d2e586d478b18d3fe7b705ce0b4fb27a651adcf6d27984f1","other":"319dc901f99940f1339c540bc36fbabb10a96d326b13b9d7f53e7496980e2996","up":true},{"one":"974dbe511377280f945a53a194b4bb397875b10b1ecb119a92425bbb16db68f1","other":"dc285b6436a8bfd4d2e586d478b18d3fe7b705ce0b4fb27a651adcf6d27984f1","up":true},{"one":"d9283e5247a18d6564b3581217e9f4d9c93a4359944894c00bb2b22c690faadc","other":"974dbe511377280f945a53a194b4bb397875b10b1ecb119a92425bbb16db68f1","up":true}]} \ No newline at end of file diff --git a/swarm/network/simulations/overlay.go b/swarm/network/simulations/overlay.go deleted file mode 100644 index 406e29426d66..000000000000 --- a/swarm/network/simulations/overlay.go +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright 2018 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 . - -// You can run this simulation using -// -// go run ./swarm/network/simulations/overlay.go -package main - -import ( - "flag" - "fmt" - "net/http" - "runtime" - "sync" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/state" - colorable "github.com/mattn/go-colorable" -) - -var ( - noDiscovery = flag.Bool("no-discovery", false, "disable discovery (useful if you want to load a snapshot)") - vmodule = flag.String("vmodule", "", "log filters for logger via Vmodule") - verbosity = flag.Int("verbosity", 0, "log filters for logger via Vmodule") - httpSimPort = 8888 -) - -func init() { - flag.Parse() - //initialize the logger - //this is a demonstration on how to use Vmodule for filtering logs - //provide -vmodule as param, and comma-separated values, e.g.: - //-vmodule overlay_test.go=4,simulations=3 - //above examples sets overlay_test.go logs to level 4, while packages ending with "simulations" to 3 - if *vmodule != "" { - //only enable the pattern matching handler if the flag has been provided - glogger := log.NewGlogHandler(log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true))) - if *verbosity > 0 { - glogger.Verbosity(log.Lvl(*verbosity)) - } - glogger.Vmodule(*vmodule) - log.Root().SetHandler(glogger) - } -} - -type Simulation struct { - mtx sync.Mutex - stores map[enode.ID]state.Store -} - -func NewSimulation() *Simulation { - return &Simulation{ - stores: make(map[enode.ID]state.Store), - } -} - -func (s *Simulation) NewService(ctx *adapters.ServiceContext) (node.Service, error) { - node := ctx.Config.Node() - s.mtx.Lock() - store, ok := s.stores[node.ID()] - if !ok { - store = state.NewInmemoryStore() - s.stores[node.ID()] = store - } - s.mtx.Unlock() - - addr := network.NewAddr(node) - - kp := network.NewKadParams() - kp.NeighbourhoodSize = 2 - kp.MaxBinSize = 4 - kp.MinBinSize = 1 - kp.MaxRetries = 1000 - kp.RetryExponent = 2 - kp.RetryInterval = 1000000 - kad := network.NewKademlia(addr.Over(), kp) - hp := network.NewHiveParams() - hp.Discovery = !*noDiscovery - hp.KeepAliveInterval = 300 * time.Millisecond - - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - - return network.NewBzz(config, kad, store, nil, nil), nil -} - -//create the simulation network -func newSimulationNetwork() *simulations.Network { - - s := NewSimulation() - services := adapters.Services{ - "overlay": s.NewService, - } - adapter := adapters.NewSimAdapter(services) - simNetwork := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ - DefaultService: "overlay", - }) - return simNetwork -} - -//return a new http server -func newOverlaySim(sim *simulations.Network) *simulations.Server { - return simulations.NewServer(sim) -} - -// var server -func main() { - //cpu optimization - runtime.GOMAXPROCS(runtime.NumCPU()) - //run the sim - runOverlaySim() -} - -func runOverlaySim() { - //create the simulation network - net := newSimulationNetwork() - //create a http server with it - sim := newOverlaySim(net) - log.Info(fmt.Sprintf("starting simulation server on 0.0.0.0:%d...", httpSimPort)) - //start the HTTP server - http.ListenAndServe(fmt.Sprintf(":%d", httpSimPort), sim) -} diff --git a/swarm/network/simulations/overlay_test.go b/swarm/network/simulations/overlay_test.go deleted file mode 100644 index f40822a019be..000000000000 --- a/swarm/network/simulations/overlay_test.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2018 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 ( - "context" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/url" - "testing" - "time" - - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/swarm/log" -) - -var ( - nodeCount = 16 -) - -//This test is used to test the overlay simulation. -//As the simulation is executed via a main, it is easily missed on changes -//An automated test will prevent that -//The test just connects to the simulations, starts the network, -//starts the mocker, gets the number of nodes, and stops it again. -//It also provides a documentation on the steps needed by frontends -//to use the simulations -func TestOverlaySim(t *testing.T) { - t.Skip("Test is flaky, see: https://github.com/ethersphere/go-ethereum/issues/592") - //start the simulation - log.Info("Start simulation backend") - //get the simulation networ; needed to subscribe for up events - net := newSimulationNetwork() - //create the overlay simulation - sim := newOverlaySim(net) - //create a http test server with it - srv := httptest.NewServer(sim) - defer srv.Close() - - log.Debug("Http simulation server started. Start simulation network") - //start the simulation network (initialization of simulation) - resp, err := http.Post(srv.URL+"/start", "application/json", nil) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("Expected Status Code %d, got %d", http.StatusOK, resp.StatusCode) - } - - log.Debug("Start mocker") - //start the mocker, needs a node count and an ID - resp, err = http.PostForm(srv.URL+"/mocker/start", - url.Values{ - "node-count": {fmt.Sprintf("%d", nodeCount)}, - "mocker-type": {simulations.GetMockerList()[0]}, - }) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - reason, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - t.Fatalf("Expected Status Code %d, got %d, response body %s", http.StatusOK, resp.StatusCode, string(reason)) - } - - //variables needed to wait for nodes being up - var upCount int - trigger := make(chan enode.ID) - - //wait for all nodes to be up - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - - //start watching node up events... - go watchSimEvents(net, ctx, trigger) - - //...and wait until all expected up events (nodeCount) have been received -LOOP: - for { - select { - case <-trigger: - //new node up event received, increase counter - upCount++ - //all expected node up events received - if upCount == nodeCount { - break LOOP - } - case <-ctx.Done(): - t.Fatalf("Timed out waiting for up events") - } - - } - - //at this point we can query the server - log.Info("Get number of nodes") - //get the number of nodes - resp, err = http.Get(srv.URL + "/nodes") - if err != nil { - t.Fatal(err) - } - - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } - - //unmarshal number of nodes from JSON response - var nodesArr []simulations.Node - err = json.Unmarshal(b, &nodesArr) - if err != nil { - t.Fatal(err) - } - - //check if number of nodes received is same as sent - if len(nodesArr) != nodeCount { - t.Fatal(fmt.Errorf("Expected %d number of nodes, got %d", nodeCount, len(nodesArr))) - } - - //need to let it run for a little while, otherwise stopping it immediately can crash due running nodes - //wanting to connect to already stopped nodes - time.Sleep(1 * time.Second) - - log.Info("Stop the network") - //stop the network - resp, err = http.Post(srv.URL+"/stop", "application/json", nil) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - - log.Info("Reset the network") - //reset the network (removes all nodes and connections) - resp, err = http.Post(srv.URL+"/reset", "application/json", nil) - if err != nil { - t.Fatal(err) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } -} - -//watch for events so we know when all nodes are up -func watchSimEvents(net *simulations.Network, ctx context.Context, trigger chan enode.ID) { - events := make(chan *simulations.Event) - sub := net.Events().Subscribe(events) - defer sub.Unsubscribe() - - for { - select { - case ev := <-events: - //only catch node up events - if ev.Type == simulations.EventTypeNode { - if ev.Node.Up { - log.Debug("got node up event", "event", ev, "node", ev.Node.Config.ID) - select { - case trigger <- ev.Node.Config.ID: - case <-ctx.Done(): - return - } - } - } - case <-ctx.Done(): - return - } - } -} diff --git a/swarm/network/stream/common_test.go b/swarm/network/stream/common_test.go deleted file mode 100644 index 3dc7864e8219..000000000000 --- a/swarm/network/stream/common_test.go +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright 2018 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 stream - -import ( - "context" - "errors" - "flag" - "fmt" - "io" - "io/ioutil" - "math/rand" - "os" - "strings" - "sync/atomic" - "testing" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/enode" - p2ptest "github.com/nebulaai/nbai-node/p2p/testing" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/network/simulation" - "github.com/nebulaai/nbai-node/swarm/state" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/testutil" - colorable "github.com/mattn/go-colorable" -) - -var ( - loglevel = flag.Int("loglevel", 2, "verbosity of logs") - nodes = flag.Int("nodes", 0, "number of nodes") - chunks = flag.Int("chunks", 0, "number of chunks") - useMockStore = flag.Bool("mockstore", false, "disabled mock store (default: enabled)") - longrunning = flag.Bool("longrunning", false, "do run long-running tests") - - bucketKeyDB = simulation.BucketKey("db") - bucketKeyStore = simulation.BucketKey("store") - bucketKeyFileStore = simulation.BucketKey("filestore") - bucketKeyNetStore = simulation.BucketKey("netstore") - bucketKeyDelivery = simulation.BucketKey("delivery") - bucketKeyRegistry = simulation.BucketKey("registry") - - chunkSize = 4096 - pof = network.Pof -) - -func init() { - flag.Parse() - rand.Seed(time.Now().UnixNano()) - - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) -} - -func newStreamerTester(t *testing.T, registryOptions *RegistryOptions) (*p2ptest.ProtocolTester, *Registry, *storage.LocalStore, func(), error) { - // setup - addr := network.RandomAddr() // tested peers peer address - to := network.NewKademlia(addr.OAddr, network.NewKadParams()) - - // temp datadir - datadir, err := ioutil.TempDir("", "streamer") - if err != nil { - return nil, nil, nil, func() {}, err - } - removeDataDir := func() { - os.RemoveAll(datadir) - } - - params := storage.NewDefaultLocalStoreParams() - params.Init(datadir) - params.BaseKey = addr.Over() - - localStore, err := storage.NewTestLocalStoreForAddr(params) - if err != nil { - return nil, nil, nil, removeDataDir, err - } - - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, nil, removeDataDir, err - } - - delivery := NewDelivery(to, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New - streamer := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), registryOptions, nil) - teardown := func() { - streamer.Close() - removeDataDir() - } - protocolTester := p2ptest.NewProtocolTester(t, addr.ID(), 1, streamer.runProtocol) - - err = waitForPeers(streamer, 1*time.Second, 1) - if err != nil { - return nil, nil, nil, nil, errors.New("timeout: peer is not created") - } - - return protocolTester, streamer, localStore, teardown, nil -} - -func waitForPeers(streamer *Registry, timeout time.Duration, expectedPeers int) error { - ticker := time.NewTicker(10 * time.Millisecond) - timeoutTimer := time.NewTimer(timeout) - for { - select { - case <-ticker.C: - if streamer.peersCount() >= expectedPeers { - return nil - } - case <-timeoutTimer.C: - return errors.New("timeout") - } - } -} - -type roundRobinStore struct { - index uint32 - stores []storage.ChunkStore -} - -func newRoundRobinStore(stores ...storage.ChunkStore) *roundRobinStore { - return &roundRobinStore{ - stores: stores, - } -} - -func (rrs *roundRobinStore) Get(ctx context.Context, addr storage.Address) (storage.Chunk, error) { - return nil, errors.New("get not well defined on round robin store") -} - -func (rrs *roundRobinStore) Put(ctx context.Context, chunk storage.Chunk) error { - i := atomic.AddUint32(&rrs.index, 1) - idx := int(i) % len(rrs.stores) - return rrs.stores[idx].Put(ctx, chunk) -} - -func (rrs *roundRobinStore) Close() { - for _, store := range rrs.stores { - store.Close() - } -} - -func readAll(fileStore *storage.FileStore, hash []byte) (int64, error) { - r, _ := fileStore.Retrieve(context.TODO(), hash) - buf := make([]byte, 1024) - var n int - var total int64 - var err error - for (total == 0 || n > 0) && err == nil { - n, err = r.ReadAt(buf, total) - total += int64(n) - } - if err != nil && err != io.EOF { - return total, err - } - return total, nil -} - -func uploadFilesToNodes(sim *simulation.Simulation) ([]storage.Address, []string, error) { - nodes := sim.UpNodeIDs() - nodeCnt := len(nodes) - log.Debug(fmt.Sprintf("Uploading %d files to nodes", nodeCnt)) - //array holding generated files - rfiles := make([]string, nodeCnt) - //array holding the root hashes of the files - rootAddrs := make([]storage.Address, nodeCnt) - - var err error - //for every node, generate a file and upload - for i, id := range nodes { - item, ok := sim.NodeItem(id, bucketKeyFileStore) - if !ok { - return nil, nil, fmt.Errorf("Error accessing localstore") - } - fileStore := item.(*storage.FileStore) - //generate a file - rfiles[i], err = generateRandomFile() - if err != nil { - return nil, nil, err - } - //store it (upload it) on the FileStore - ctx := context.TODO() - rk, wait, err := fileStore.Store(ctx, strings.NewReader(rfiles[i]), int64(len(rfiles[i])), false) - log.Debug("Uploaded random string file to node") - if err != nil { - return nil, nil, err - } - err = wait(ctx) - if err != nil { - return nil, nil, err - } - rootAddrs[i] = rk - } - return rootAddrs, rfiles, nil -} - -//generate a random file (string) -func generateRandomFile() (string, error) { - //generate a random file size between minFileSize and maxFileSize - fileSize := rand.Intn(maxFileSize-minFileSize) + minFileSize - log.Debug(fmt.Sprintf("Generated file with filesize %d kB", fileSize)) - b := testutil.RandomBytes(1, fileSize*1024) - return string(b), nil -} - -//create a local store for the given node -func createTestLocalStorageForID(id enode.ID, addr *network.BzzAddr) (storage.ChunkStore, string, error) { - var datadir string - var err error - datadir, err = ioutil.TempDir("", fmt.Sprintf("syncer-test-%s", id.TerminalString())) - if err != nil { - return nil, "", err - } - var store storage.ChunkStore - params := storage.NewDefaultLocalStoreParams() - params.ChunkDbPath = datadir - params.BaseKey = addr.Over() - store, err = storage.NewTestLocalStoreForAddr(params) - if err != nil { - os.RemoveAll(datadir) - return nil, "", err - } - return store, datadir, nil -} diff --git a/swarm/network/stream/delivery.go b/swarm/network/stream/delivery.go deleted file mode 100644 index ab9af5454b6b..000000000000 --- a/swarm/network/stream/delivery.go +++ /dev/null @@ -1,281 +0,0 @@ -// Copyright 2018 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 stream - -import ( - "context" - "errors" - "fmt" - - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/spancontext" - "github.com/nebulaai/nbai-node/swarm/storage" - opentracing "github.com/opentracing/opentracing-go" -) - -const ( - swarmChunkServerStreamName = "RETRIEVE_REQUEST" - deliveryCap = 32 -) - -var ( - processReceivedChunksCount = metrics.NewRegisteredCounter("network.stream.received_chunks.count", nil) - handleRetrieveRequestMsgCount = metrics.NewRegisteredCounter("network.stream.handle_retrieve_request_msg.count", nil) - retrieveChunkFail = metrics.NewRegisteredCounter("network.stream.retrieve_chunks_fail.count", nil) - - requestFromPeersCount = metrics.NewRegisteredCounter("network.stream.request_from_peers.count", nil) - requestFromPeersEachCount = metrics.NewRegisteredCounter("network.stream.request_from_peers_each.count", nil) -) - -type Delivery struct { - chunkStore storage.SyncChunkStore - kad *network.Kademlia - getPeer func(enode.ID) *Peer -} - -func NewDelivery(kad *network.Kademlia, chunkStore storage.SyncChunkStore) *Delivery { - return &Delivery{ - chunkStore: chunkStore, - kad: kad, - } -} - -// SwarmChunkServer implements Server -type SwarmChunkServer struct { - deliveryC chan []byte - batchC chan []byte - chunkStore storage.ChunkStore - currentLen uint64 - quit chan struct{} -} - -// NewSwarmChunkServer is SwarmChunkServer constructor -func NewSwarmChunkServer(chunkStore storage.ChunkStore) *SwarmChunkServer { - s := &SwarmChunkServer{ - deliveryC: make(chan []byte, deliveryCap), - batchC: make(chan []byte), - chunkStore: chunkStore, - quit: make(chan struct{}), - } - go s.processDeliveries() - return s -} - -// processDeliveries handles delivered chunk hashes -func (s *SwarmChunkServer) processDeliveries() { - var hashes []byte - var batchC chan []byte - for { - select { - case <-s.quit: - return - case hash := <-s.deliveryC: - hashes = append(hashes, hash...) - batchC = s.batchC - case batchC <- hashes: - hashes = nil - batchC = nil - } - } -} - -// SessionIndex returns zero in all cases for SwarmChunkServer. -func (s *SwarmChunkServer) SessionIndex() (uint64, error) { - return 0, nil -} - -// SetNextBatch -func (s *SwarmChunkServer) SetNextBatch(_, _ uint64) (hashes []byte, from uint64, to uint64, proof *HandoverProof, err error) { - select { - case hashes = <-s.batchC: - case <-s.quit: - return - } - - from = s.currentLen - s.currentLen += uint64(len(hashes)) - to = s.currentLen - return -} - -// Close needs to be called on a stream server -func (s *SwarmChunkServer) Close() { - close(s.quit) -} - -// GetData retrives chunk data from db store -func (s *SwarmChunkServer) GetData(ctx context.Context, key []byte) ([]byte, error) { - chunk, err := s.chunkStore.Get(ctx, storage.Address(key)) - if err != nil { - return nil, err - } - return chunk.Data(), nil -} - -// RetrieveRequestMsg is the protocol msg for chunk retrieve requests -type RetrieveRequestMsg struct { - Addr storage.Address - SkipCheck bool - HopCount uint8 -} - -func (d *Delivery) handleRetrieveRequestMsg(ctx context.Context, sp *Peer, req *RetrieveRequestMsg) error { - log.Trace("received request", "peer", sp.ID(), "hash", req.Addr) - handleRetrieveRequestMsgCount.Inc(1) - - var osp opentracing.Span - ctx, osp = spancontext.StartSpan( - ctx, - "retrieve.request") - defer osp.Finish() - - s, err := sp.getServer(NewStream(swarmChunkServerStreamName, "", true)) - if err != nil { - return err - } - streamer := s.Server.(*SwarmChunkServer) - - var cancel func() - // TODO: do something with this hardcoded timeout, maybe use TTL in the future - ctx = context.WithValue(ctx, "peer", sp.ID().String()) - ctx = context.WithValue(ctx, "hopcount", req.HopCount) - ctx, cancel = context.WithTimeout(ctx, network.RequestTimeout) - - go func() { - select { - case <-ctx.Done(): - case <-streamer.quit: - } - cancel() - }() - - go func() { - chunk, err := d.chunkStore.Get(ctx, req.Addr) - if err != nil { - retrieveChunkFail.Inc(1) - log.Debug("ChunkStore.Get can not retrieve chunk", "peer", sp.ID().String(), "addr", req.Addr, "hopcount", req.HopCount, "err", err) - return - } - if req.SkipCheck { - syncing := false - err = sp.Deliver(ctx, chunk, s.priority, syncing) - if err != nil { - log.Warn("ERROR in handleRetrieveRequestMsg", "err", err) - } - return - } - select { - case streamer.deliveryC <- chunk.Address()[:]: - case <-streamer.quit: - } - - }() - - return nil -} - -//Chunk delivery always uses the same message type.... -type ChunkDeliveryMsg struct { - Addr storage.Address - SData []byte // the stored chunk Data (incl size) - peer *Peer // set in handleChunkDeliveryMsg -} - -//...but swap accounting needs to disambiguate if it is a delivery for syncing or for retrieval -//as it decides based on message type if it needs to account for this message or not - -//defines a chunk delivery for retrieval (with accounting) -type ChunkDeliveryMsgRetrieval ChunkDeliveryMsg - -//defines a chunk delivery for syncing (without accounting) -type ChunkDeliveryMsgSyncing ChunkDeliveryMsg - -// TODO: Fix context SNAFU -func (d *Delivery) handleChunkDeliveryMsg(ctx context.Context, sp *Peer, req *ChunkDeliveryMsg) error { - var osp opentracing.Span - ctx, osp = spancontext.StartSpan( - ctx, - "chunk.delivery") - defer osp.Finish() - - processReceivedChunksCount.Inc(1) - - go func() { - req.peer = sp - err := d.chunkStore.Put(ctx, storage.NewChunk(req.Addr, req.SData)) - if err != nil { - if err == storage.ErrChunkInvalid { - // we removed this log because it spams the logs - // TODO: Enable this log line - // log.Warn("invalid chunk delivered", "peer", sp.ID(), "chunk", req.Addr, ) - req.peer.Drop(err) - } - } - }() - return nil -} - -// RequestFromPeers sends a chunk retrieve request to -func (d *Delivery) RequestFromPeers(ctx context.Context, req *network.Request) (*enode.ID, chan struct{}, error) { - requestFromPeersCount.Inc(1) - var sp *Peer - spID := req.Source - - if spID != nil { - sp = d.getPeer(*spID) - if sp == nil { - return nil, nil, fmt.Errorf("source peer %v not found", spID.String()) - } - } else { - d.kad.EachConn(req.Addr[:], 255, func(p *network.Peer, po int) bool { - id := p.ID() - if p.LightNode { - // skip light nodes - return true - } - if req.SkipPeer(id.String()) { - log.Trace("Delivery.RequestFromPeers: skip peer", "peer id", id) - return true - } - sp = d.getPeer(id) - if sp == nil { - //log.Warn("Delivery.RequestFromPeers: peer not found", "id", id) - return true - } - spID = &id - return false - }) - if sp == nil { - return nil, nil, errors.New("no peer found") - } - } - - err := sp.SendPriority(ctx, &RetrieveRequestMsg{ - Addr: req.Addr, - SkipCheck: req.SkipCheck, - HopCount: req.HopCount, - }, Top) - if err != nil { - return nil, nil, err - } - requestFromPeersEachCount.Inc(1) - - return spID, sp.quit, nil -} diff --git a/swarm/network/stream/delivery_test.go b/swarm/network/stream/delivery_test.go deleted file mode 100644 index 85c9497fdd2d..000000000000 --- a/swarm/network/stream/delivery_test.go +++ /dev/null @@ -1,795 +0,0 @@ -// Copyright 2018 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 stream - -import ( - "bytes" - "context" - "errors" - "fmt" - "os" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/protocols" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - p2ptest "github.com/nebulaai/nbai-node/p2p/testing" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/network" - pq "github.com/nebulaai/nbai-node/swarm/network/priorityqueue" - "github.com/nebulaai/nbai-node/swarm/network/simulation" - "github.com/nebulaai/nbai-node/swarm/state" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/testutil" -) - -//Tests initializing a retrieve request -func TestStreamerRetrieveRequest(t *testing.T) { - regOpts := &RegistryOptions{ - Retrieval: RetrievalClientOnly, - Syncing: SyncingDisabled, - } - tester, streamer, _, teardown, err := newStreamerTester(t, regOpts) - defer teardown() - if err != nil { - t.Fatal(err) - } - - node := tester.Nodes[0] - - ctx := context.Background() - req := network.NewRequest( - storage.Address(hash0[:]), - true, - &sync.Map{}, - ) - streamer.delivery.RequestFromPeers(ctx, req) - - stream := NewStream(swarmChunkServerStreamName, "", true) - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "RetrieveRequestMsg", - Expects: []p2ptest.Expect{ - { //start expecting a subscription for RETRIEVE_REQUEST due to `RetrievalClientOnly` - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: nil, - Priority: Top, - }, - Peer: node.ID(), - }, - { //expect a retrieve request message for the given hash - Code: 5, - Msg: &RetrieveRequestMsg{ - Addr: hash0[:], - SkipCheck: true, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } -} - -//Test requesting a chunk from a peer then issuing a "empty" OfferedHashesMsg (no hashes available yet) -//Should time out as the peer does not have the chunk (no syncing happened previously) -func TestStreamerUpstreamRetrieveRequestMsgExchangeWithoutStore(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, &RegistryOptions{ - Retrieval: RetrievalEnabled, - Syncing: SyncingDisabled, //do no syncing - }) - defer teardown() - if err != nil { - t.Fatal(err) - } - - node := tester.Nodes[0] - - chunk := storage.NewChunk(storage.Address(hash0[:]), nil) - - peer := streamer.getPeer(node.ID()) - - stream := NewStream(swarmChunkServerStreamName, "", true) - //simulate pre-subscription to RETRIEVE_REQUEST stream on peer - peer.handleSubscribeMsg(context.TODO(), &SubscribeMsg{ - Stream: stream, - History: nil, - Priority: Top, - }) - - //test the exchange - err = tester.TestExchanges(p2ptest.Exchange{ - Expects: []p2ptest.Expect{ - { //first expect a subscription to the RETRIEVE_REQUEST stream - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: nil, - Priority: Top, - }, - Peer: node.ID(), - }, - }, - }, p2ptest.Exchange{ - Label: "RetrieveRequestMsg", - Triggers: []p2ptest.Trigger{ - { //then the actual RETRIEVE_REQUEST.... - Code: 5, - Msg: &RetrieveRequestMsg{ - Addr: chunk.Address()[:], - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { //to which the peer responds with offered hashes - Code: 1, - Msg: &OfferedHashesMsg{ - HandoverProof: nil, - Hashes: nil, - From: 0, - To: 0, - }, - Peer: node.ID(), - }, - }, - }) - - //should fail with a timeout as the peer we are requesting - //the chunk from does not have the chunk - expectedError := `exchange #1 "RetrieveRequestMsg": timed out` - if err == nil || err.Error() != expectedError { - t.Fatalf("Expected error %v, got %v", expectedError, err) - } -} - -// upstream request server receives a retrieve Request and responds with -// offered hashes or delivery if skipHash is set to true -func TestStreamerUpstreamRetrieveRequestMsgExchange(t *testing.T) { - tester, streamer, localStore, teardown, err := newStreamerTester(t, &RegistryOptions{ - Retrieval: RetrievalEnabled, - Syncing: SyncingDisabled, - }) - defer teardown() - if err != nil { - t.Fatal(err) - } - - node := tester.Nodes[0] - - peer := streamer.getPeer(node.ID()) - - stream := NewStream(swarmChunkServerStreamName, "", true) - - peer.handleSubscribeMsg(context.TODO(), &SubscribeMsg{ - Stream: stream, - History: nil, - Priority: Top, - }) - - hash := storage.Address(hash0[:]) - chunk := storage.NewChunk(hash, hash) - err = localStore.Put(context.TODO(), chunk) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Expects: []p2ptest.Expect{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: nil, - Priority: Top, - }, - Peer: node.ID(), - }, - }, - }, p2ptest.Exchange{ - Label: "RetrieveRequestMsg", - Triggers: []p2ptest.Trigger{ - { - Code: 5, - Msg: &RetrieveRequestMsg{ - Addr: hash, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: hash, - From: 0, - // TODO: why is this 32??? - To: 32, - Stream: stream, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - - hash = storage.Address(hash1[:]) - chunk = storage.NewChunk(hash, hash1[:]) - err = localStore.Put(context.TODO(), chunk) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "RetrieveRequestMsg", - Triggers: []p2ptest.Trigger{ - { - Code: 5, - Msg: &RetrieveRequestMsg{ - Addr: hash, - SkipCheck: true, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 6, - Msg: &ChunkDeliveryMsg{ - Addr: hash, - SData: hash, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} - -// if there is one peer in the Kademlia, RequestFromPeers should return it -func TestRequestFromPeers(t *testing.T) { - dummyPeerID := enode.HexID("3431c3939e1ee2a6345e976a8234f9870152d64879f30bc272a074f6859e75e8") - - addr := network.RandomAddr() - to := network.NewKademlia(addr.OAddr, network.NewKadParams()) - delivery := NewDelivery(to, nil) - protocolsPeer := protocols.NewPeer(p2p.NewPeer(dummyPeerID, "dummy", nil), nil, nil) - peer := network.NewPeer(&network.BzzPeer{ - BzzAddr: network.RandomAddr(), - LightNode: false, - Peer: protocolsPeer, - }, to) - to.On(peer) - r := NewRegistry(addr.ID(), delivery, nil, nil, nil, nil) - - // an empty priorityQueue has to be created to prevent a goroutine being called after the test has finished - sp := &Peer{ - Peer: protocolsPeer, - pq: pq.New(int(PriorityQueue), PriorityQueueCap), - streamer: r, - } - r.setPeer(sp) - req := network.NewRequest( - storage.Address(hash0[:]), - true, - &sync.Map{}, - ) - ctx := context.Background() - id, _, err := delivery.RequestFromPeers(ctx, req) - - if err != nil { - t.Fatal(err) - } - if *id != dummyPeerID { - t.Fatalf("Expected an id, got %v", id) - } -} - -// RequestFromPeers should not return light nodes -func TestRequestFromPeersWithLightNode(t *testing.T) { - dummyPeerID := enode.HexID("3431c3939e1ee2a6345e976a8234f9870152d64879f30bc272a074f6859e75e8") - - addr := network.RandomAddr() - to := network.NewKademlia(addr.OAddr, network.NewKadParams()) - delivery := NewDelivery(to, nil) - - protocolsPeer := protocols.NewPeer(p2p.NewPeer(dummyPeerID, "dummy", nil), nil, nil) - // setting up a lightnode - peer := network.NewPeer(&network.BzzPeer{ - BzzAddr: network.RandomAddr(), - LightNode: true, - Peer: protocolsPeer, - }, to) - to.On(peer) - r := NewRegistry(addr.ID(), delivery, nil, nil, nil, nil) - // an empty priorityQueue has to be created to prevent a goroutine being called after the test has finished - sp := &Peer{ - Peer: protocolsPeer, - pq: pq.New(int(PriorityQueue), PriorityQueueCap), - streamer: r, - } - r.setPeer(sp) - - req := network.NewRequest( - storage.Address(hash0[:]), - true, - &sync.Map{}, - ) - - ctx := context.Background() - // making a request which should return with "no peer found" - _, _, err := delivery.RequestFromPeers(ctx, req) - - expectedError := "no peer found" - if err.Error() != expectedError { - t.Fatalf("expected '%v', got %v", expectedError, err) - } -} - -func TestStreamerDownstreamChunkDeliveryMsgExchange(t *testing.T) { - tester, streamer, localStore, teardown, err := newStreamerTester(t, &RegistryOptions{ - Retrieval: RetrievalDisabled, - Syncing: SyncingDisabled, - }) - defer teardown() - if err != nil { - t.Fatal(err) - } - - streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) { - return &testClient{ - t: t, - }, nil - }) - - node := tester.Nodes[0] - - //subscribe to custom stream - stream := NewStream("foo", "", true) - err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - chunkKey := hash0[:] - chunkData := hash1[:] - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Expects: []p2ptest.Expect{ - { //first expect subscription to the custom stream... - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - }, - p2ptest.Exchange{ - Label: "ChunkDelivery message", - Triggers: []p2ptest.Trigger{ - { //...then trigger a chunk delivery for the given chunk from peer in order for - //local node to get the chunk delivered - Code: 6, - Msg: &ChunkDeliveryMsg{ - Addr: chunkKey, - SData: chunkData, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) - defer cancel() - - // wait for the chunk to get stored - storedChunk, err := localStore.Get(ctx, chunkKey) - for err != nil { - select { - case <-ctx.Done(): - t.Fatalf("Chunk is not in localstore after timeout, err: %v", err) - default: - } - storedChunk, err = localStore.Get(ctx, chunkKey) - time.Sleep(50 * time.Millisecond) - } - - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - if !bytes.Equal(storedChunk.Data(), chunkData) { - t.Fatal("Retrieved chunk has different data than original") - } - -} - -func TestDeliveryFromNodes(t *testing.T) { - testDeliveryFromNodes(t, 2, dataChunkCount, true) - testDeliveryFromNodes(t, 2, dataChunkCount, false) - testDeliveryFromNodes(t, 4, dataChunkCount, true) - testDeliveryFromNodes(t, 4, dataChunkCount, false) - testDeliveryFromNodes(t, 8, dataChunkCount, true) - testDeliveryFromNodes(t, 8, dataChunkCount, false) - testDeliveryFromNodes(t, 16, dataChunkCount, true) - testDeliveryFromNodes(t, 16, dataChunkCount, false) -} - -func testDeliveryFromNodes(t *testing.T, nodes, chunkCount int, skipCheck bool) { - sim := simulation.New(map[string]simulation.ServiceFunc{ - "streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - node := ctx.Config.Node() - addr := network.NewAddr(node) - store, datadir, err := createTestLocalStorageForID(node.ID(), addr) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - cleanup = func() { - os.RemoveAll(datadir) - store.Close() - } - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - SkipCheck: skipCheck, - Syncing: SyncingDisabled, - Retrieval: RetrievalEnabled, - }, nil) - bucket.Store(bucketKeyRegistry, r) - - fileStore := storage.NewFileStore(netStore, storage.NewFileStoreParams()) - bucket.Store(bucketKeyFileStore, fileStore) - - return r, cleanup, nil - - }, - }) - defer sim.Close() - - log.Info("Adding nodes to simulation") - _, err := sim.AddNodesAndConnectChain(nodes) - if err != nil { - t.Fatal(err) - } - - log.Info("Starting simulation") - ctx := context.Background() - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) (err error) { - nodeIDs := sim.UpNodeIDs() - //determine the pivot node to be the first node of the simulation - pivot := nodeIDs[0] - - //distribute chunks of a random file into Stores of nodes 1 to nodes - //we will do this by creating a file store with an underlying round-robin store: - //the file store will create a hash for the uploaded file, but every chunk will be - //distributed to different nodes via round-robin scheduling - log.Debug("Writing file to round-robin file store") - //to do this, we create an array for chunkstores (length minus one, the pivot node) - stores := make([]storage.ChunkStore, len(nodeIDs)-1) - //we then need to get all stores from the sim.... - lStores := sim.NodesItems(bucketKeyStore) - i := 0 - //...iterate the buckets... - for id, bucketVal := range lStores { - //...and remove the one which is the pivot node - if id == pivot { - continue - } - //the other ones are added to the array... - stores[i] = bucketVal.(storage.ChunkStore) - i++ - } - //...which then gets passed to the round-robin file store - roundRobinFileStore := storage.NewFileStore(newRoundRobinStore(stores...), storage.NewFileStoreParams()) - //now we can actually upload a (random) file to the round-robin store - size := chunkCount * chunkSize - log.Debug("Storing data to file store") - fileHash, wait, err := roundRobinFileStore.Store(ctx, testutil.RandomReader(1, size), int64(size), false) - // wait until all chunks stored - if err != nil { - return err - } - err = wait(ctx) - if err != nil { - return err - } - - log.Debug("Waiting for kademlia") - // TODO this does not seem to be correct usage of the function, as the simulation may have no kademlias - if _, err := sim.WaitTillHealthy(ctx); err != nil { - return err - } - - //get the pivot node's filestore - item, ok := sim.NodeItem(pivot, bucketKeyFileStore) - if !ok { - return fmt.Errorf("No filestore") - } - pivotFileStore := item.(*storage.FileStore) - log.Debug("Starting retrieval routine") - retErrC := make(chan error) - go func() { - // start the retrieval on the pivot node - this will spawn retrieve requests for missing chunks - // we must wait for the peer connections to have started before requesting - n, err := readAll(pivotFileStore, fileHash) - log.Info(fmt.Sprintf("retrieved %v", fileHash), "read", n, "err", err) - retErrC <- err - }() - - log.Debug("Watching for disconnections") - disconnections := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - simulation.NewPeerEventsFilter().Drop(), - ) - - var disconnected atomic.Value - go func() { - for d := range disconnections { - if d.Error != nil { - log.Error("peer drop", "node", d.NodeID, "peer", d.PeerID) - disconnected.Store(true) - } - } - }() - defer func() { - if err != nil { - if yes, ok := disconnected.Load().(bool); ok && yes { - err = errors.New("disconnect events received") - } - } - }() - - //finally check that the pivot node gets all chunks via the root hash - log.Debug("Check retrieval") - success := true - var total int64 - total, err = readAll(pivotFileStore, fileHash) - if err != nil { - return err - } - log.Info(fmt.Sprintf("check if %08x is available locally: number of bytes read %v/%v (error: %v)", fileHash, total, size, err)) - if err != nil || total != int64(size) { - success = false - } - - if !success { - return fmt.Errorf("Test failed, chunks not available on all nodes") - } - if err := <-retErrC; err != nil { - t.Fatalf("requesting chunks: %v", err) - } - log.Debug("Test terminated successfully") - return nil - }) - if result.Error != nil { - t.Fatal(result.Error) - } -} - -func BenchmarkDeliveryFromNodesWithoutCheck(b *testing.B) { - for chunks := 32; chunks <= 128; chunks *= 2 { - for i := 2; i < 32; i *= 2 { - b.Run( - fmt.Sprintf("nodes=%v,chunks=%v", i, chunks), - func(b *testing.B) { - benchmarkDeliveryFromNodes(b, i, chunks, true) - }, - ) - } - } -} - -func BenchmarkDeliveryFromNodesWithCheck(b *testing.B) { - for chunks := 32; chunks <= 128; chunks *= 2 { - for i := 2; i < 32; i *= 2 { - b.Run( - fmt.Sprintf("nodes=%v,chunks=%v", i, chunks), - func(b *testing.B) { - benchmarkDeliveryFromNodes(b, i, chunks, false) - }, - ) - } - } -} - -func benchmarkDeliveryFromNodes(b *testing.B, nodes, chunkCount int, skipCheck bool) { - sim := simulation.New(map[string]simulation.ServiceFunc{ - "streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - node := ctx.Config.Node() - addr := network.NewAddr(node) - store, datadir, err := createTestLocalStorageForID(node.ID(), addr) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - cleanup = func() { - os.RemoveAll(datadir) - store.Close() - } - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - SkipCheck: skipCheck, - Syncing: SyncingDisabled, - Retrieval: RetrievalDisabled, - SyncUpdateDelay: 0, - }, nil) - - fileStore := storage.NewFileStore(netStore, storage.NewFileStoreParams()) - bucket.Store(bucketKeyFileStore, fileStore) - - return r, cleanup, nil - - }, - }) - defer sim.Close() - - log.Info("Initializing test config") - _, err := sim.AddNodesAndConnectChain(nodes) - if err != nil { - b.Fatal(err) - } - - ctx := context.Background() - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) (err error) { - nodeIDs := sim.UpNodeIDs() - node := nodeIDs[len(nodeIDs)-1] - - item, ok := sim.NodeItem(node, bucketKeyFileStore) - if !ok { - b.Fatal("No filestore") - } - remoteFileStore := item.(*storage.FileStore) - - pivotNode := nodeIDs[0] - item, ok = sim.NodeItem(pivotNode, bucketKeyNetStore) - if !ok { - b.Fatal("No filestore") - } - netStore := item.(*storage.NetStore) - - if _, err := sim.WaitTillHealthy(ctx); err != nil { - return err - } - - disconnections := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - simulation.NewPeerEventsFilter().Drop(), - ) - - var disconnected atomic.Value - go func() { - for d := range disconnections { - if d.Error != nil { - log.Error("peer drop", "node", d.NodeID, "peer", d.PeerID) - disconnected.Store(true) - } - } - }() - defer func() { - if err != nil { - if yes, ok := disconnected.Load().(bool); ok && yes { - err = errors.New("disconnect events received") - } - } - }() - // benchmark loop - b.ResetTimer() - b.StopTimer() - Loop: - for i := 0; i < b.N; i++ { - // uploading chunkCount random chunks to the last node - hashes := make([]storage.Address, chunkCount) - for i := 0; i < chunkCount; i++ { - // create actual size real chunks - ctx := context.TODO() - hash, wait, err := remoteFileStore.Store(ctx, testutil.RandomReader(i, chunkSize), int64(chunkSize), false) - if err != nil { - b.Fatalf("expected no error. got %v", err) - } - // wait until all chunks stored - err = wait(ctx) - if err != nil { - b.Fatalf("expected no error. got %v", err) - } - // collect the hashes - hashes[i] = hash - } - // now benchmark the actual retrieval - // netstore.Get is called for each hash in a go routine and errors are collected - b.StartTimer() - errs := make(chan error) - for _, hash := range hashes { - go func(h storage.Address) { - _, err := netStore.Get(ctx, h) - log.Warn("test check netstore get", "hash", h, "err", err) - errs <- err - }(hash) - } - // count and report retrieval errors - // if there are misses then chunk timeout is too low for the distance and volume (?) - var total, misses int - for err := range errs { - if err != nil { - log.Warn(err.Error()) - misses++ - } - total++ - if total == chunkCount { - break - } - } - b.StopTimer() - - if misses > 0 { - err = fmt.Errorf("%v chunk not found out of %v", misses, total) - break Loop - } - } - if err != nil { - b.Fatal(err) - } - return nil - }) - if result.Error != nil { - b.Fatal(result.Error) - } - -} diff --git a/swarm/network/stream/intervals/dbstore_test.go b/swarm/network/stream/intervals/dbstore_test.go deleted file mode 100644 index ddb6183846c7..000000000000 --- a/swarm/network/stream/intervals/dbstore_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2018 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 intervals - -import ( - "io/ioutil" - "os" - "testing" - - "github.com/nebulaai/nbai-node/swarm/state" -) - -// TestDBStore tests basic functionality of DBStore. -func TestDBStore(t *testing.T) { - dir, err := ioutil.TempDir("", "intervals_test_db_store") - if err != nil { - panic(err) - } - defer os.RemoveAll(dir) - - store, err := state.NewDBStore(dir) - if err != nil { - t.Fatal(err) - } - defer store.Close() - - testStore(t, store) -} diff --git a/swarm/network/stream/intervals/intervals.go b/swarm/network/stream/intervals/intervals.go deleted file mode 100644 index 562c3df9ae49..000000000000 --- a/swarm/network/stream/intervals/intervals.go +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2018 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 intervals - -import ( - "bytes" - "fmt" - "strconv" - "sync" -) - -// Intervals store a list of intervals. Its purpose is to provide -// methods to add new intervals and retrieve missing intervals that -// need to be added. -// It may be used in synchronization of streaming data to persist -// retrieved data ranges between sessions. -type Intervals struct { - start uint64 - ranges [][2]uint64 - mu sync.RWMutex -} - -// New creates a new instance of Intervals. -// Start argument limits the lower bound of intervals. -// No range bellow start bound will be added by Add method or -// returned by Next method. This limit may be used for -// tracking "live" synchronization, where the sync session -// starts from a specific value, and if "live" sync intervals -// need to be merged with historical ones, it can be safely done. -func NewIntervals(start uint64) *Intervals { - return &Intervals{ - start: start, - } -} - -// Add adds a new range to intervals. Range start and end are values -// are both inclusive. -func (i *Intervals) Add(start, end uint64) { - i.mu.Lock() - defer i.mu.Unlock() - - i.add(start, end) -} - -func (i *Intervals) add(start, end uint64) { - if start < i.start { - start = i.start - } - if end < i.start { - return - } - minStartJ := -1 - maxEndJ := -1 - j := 0 - for ; j < len(i.ranges); j++ { - if minStartJ < 0 { - if (start <= i.ranges[j][0] && end+1 >= i.ranges[j][0]) || (start <= i.ranges[j][1]+1 && end+1 >= i.ranges[j][1]) { - if i.ranges[j][0] < start { - start = i.ranges[j][0] - } - minStartJ = j - } - } - if (start <= i.ranges[j][1] && end+1 >= i.ranges[j][1]) || (start <= i.ranges[j][0] && end+1 >= i.ranges[j][0]) { - if i.ranges[j][1] > end { - end = i.ranges[j][1] - } - maxEndJ = j - } - if end+1 <= i.ranges[j][0] { - break - } - } - if minStartJ < 0 && maxEndJ < 0 { - i.ranges = append(i.ranges[:j], append([][2]uint64{{start, end}}, i.ranges[j:]...)...) - return - } - if minStartJ >= 0 { - i.ranges[minStartJ][0] = start - } - if maxEndJ >= 0 { - i.ranges[maxEndJ][1] = end - } - if minStartJ >= 0 && maxEndJ >= 0 && minStartJ != maxEndJ { - i.ranges[maxEndJ][0] = start - i.ranges = append(i.ranges[:minStartJ], i.ranges[maxEndJ:]...) - } -} - -// Merge adds all the intervals from the m Interval to current one. -func (i *Intervals) Merge(m *Intervals) { - m.mu.RLock() - defer m.mu.RUnlock() - i.mu.Lock() - defer i.mu.Unlock() - - for _, r := range m.ranges { - i.add(r[0], r[1]) - } -} - -// Next returns the first range interval that is not fulfilled. Returned -// start and end values are both inclusive, meaning that the whole range -// including start and end need to be added in order to full the gap -// in intervals. -// Returned value for end is 0 if the next interval is after the whole -// range that is stored in Intervals. Zero end value represents no limit -// on the next interval length. -func (i *Intervals) Next() (start, end uint64) { - i.mu.RLock() - defer i.mu.RUnlock() - - l := len(i.ranges) - if l == 0 { - return i.start, 0 - } - if i.ranges[0][0] != i.start { - return i.start, i.ranges[0][0] - 1 - } - if l == 1 { - return i.ranges[0][1] + 1, 0 - } - return i.ranges[0][1] + 1, i.ranges[1][0] - 1 -} - -// Last returns the value that is at the end of the last interval. -func (i *Intervals) Last() (end uint64) { - i.mu.RLock() - defer i.mu.RUnlock() - - l := len(i.ranges) - if l == 0 { - return 0 - } - return i.ranges[l-1][1] -} - -// String returns a descriptive representation of range intervals -// in [] notation, as a list of two element vectors. -func (i *Intervals) String() string { - return fmt.Sprint(i.ranges) -} - -// MarshalBinary encodes Intervals parameters into a semicolon separated list. -// The first element in the list is base36-encoded start value. The following -// elements are two base36-encoded value ranges separated by comma. -func (i *Intervals) MarshalBinary() (data []byte, err error) { - d := make([][]byte, len(i.ranges)+1) - d[0] = []byte(strconv.FormatUint(i.start, 36)) - for j := range i.ranges { - r := i.ranges[j] - d[j+1] = []byte(strconv.FormatUint(r[0], 36) + "," + strconv.FormatUint(r[1], 36)) - } - return bytes.Join(d, []byte(";")), nil -} - -// UnmarshalBinary decodes data according to the Intervals.MarshalBinary format. -func (i *Intervals) UnmarshalBinary(data []byte) (err error) { - d := bytes.Split(data, []byte(";")) - l := len(d) - if l == 0 { - return nil - } - if l >= 1 { - i.start, err = strconv.ParseUint(string(d[0]), 36, 64) - if err != nil { - return err - } - } - if l == 1 { - return nil - } - - i.ranges = make([][2]uint64, 0, l-1) - for j := 1; j < l; j++ { - r := bytes.SplitN(d[j], []byte(","), 2) - if len(r) < 2 { - return fmt.Errorf("range %d has less then 2 elements", j) - } - start, err := strconv.ParseUint(string(r[0]), 36, 64) - if err != nil { - return fmt.Errorf("parsing the first element in range %d: %v", j, err) - } - end, err := strconv.ParseUint(string(r[1]), 36, 64) - if err != nil { - return fmt.Errorf("parsing the second element in range %d: %v", j, err) - } - i.ranges = append(i.ranges, [2]uint64{start, end}) - } - - return nil -} diff --git a/swarm/network/stream/intervals/intervals_test.go b/swarm/network/stream/intervals/intervals_test.go deleted file mode 100644 index b5212f0d917f..000000000000 --- a/swarm/network/stream/intervals/intervals_test.go +++ /dev/null @@ -1,395 +0,0 @@ -// Copyright 2018 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 intervals - -import "testing" - -// Test tests Interval methods Add, Next and Last for various -// initial state. -func Test(t *testing.T) { - for i, tc := range []struct { - startLimit uint64 - initial [][2]uint64 - start uint64 - end uint64 - expected string - nextStart uint64 - nextEnd uint64 - last uint64 - }{ - { - initial: nil, - start: 0, - end: 0, - expected: "[[0 0]]", - nextStart: 1, - nextEnd: 0, - last: 0, - }, - { - initial: nil, - start: 0, - end: 10, - expected: "[[0 10]]", - nextStart: 11, - nextEnd: 0, - last: 10, - }, - { - initial: nil, - start: 5, - end: 15, - expected: "[[5 15]]", - nextStart: 0, - nextEnd: 4, - last: 15, - }, - { - initial: [][2]uint64{{0, 0}}, - start: 0, - end: 0, - expected: "[[0 0]]", - nextStart: 1, - nextEnd: 0, - last: 0, - }, - { - initial: [][2]uint64{{0, 0}}, - start: 5, - end: 15, - expected: "[[0 0] [5 15]]", - nextStart: 1, - nextEnd: 4, - last: 15, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 5, - end: 15, - expected: "[[5 15]]", - nextStart: 0, - nextEnd: 4, - last: 15, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 5, - end: 20, - expected: "[[5 20]]", - nextStart: 0, - nextEnd: 4, - last: 20, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 10, - end: 20, - expected: "[[5 20]]", - nextStart: 0, - nextEnd: 4, - last: 20, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 0, - end: 20, - expected: "[[0 20]]", - nextStart: 21, - nextEnd: 0, - last: 20, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 2, - end: 10, - expected: "[[2 15]]", - nextStart: 0, - nextEnd: 1, - last: 15, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 2, - end: 4, - expected: "[[2 15]]", - nextStart: 0, - nextEnd: 1, - last: 15, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 2, - end: 5, - expected: "[[2 15]]", - nextStart: 0, - nextEnd: 1, - last: 15, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 2, - end: 3, - expected: "[[2 3] [5 15]]", - nextStart: 0, - nextEnd: 1, - last: 15, - }, - { - initial: [][2]uint64{{5, 15}}, - start: 2, - end: 4, - expected: "[[2 15]]", - nextStart: 0, - nextEnd: 1, - last: 15, - }, - { - initial: [][2]uint64{{0, 1}, {5, 15}}, - start: 2, - end: 4, - expected: "[[0 15]]", - nextStart: 16, - nextEnd: 0, - last: 15, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}}, - start: 2, - end: 10, - expected: "[[0 10] [15 20]]", - nextStart: 11, - nextEnd: 14, - last: 20, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}}, - start: 8, - end: 18, - expected: "[[0 5] [8 20]]", - nextStart: 6, - nextEnd: 7, - last: 20, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}}, - start: 2, - end: 17, - expected: "[[0 20]]", - nextStart: 21, - nextEnd: 0, - last: 20, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}}, - start: 2, - end: 25, - expected: "[[0 25]]", - nextStart: 26, - nextEnd: 0, - last: 25, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}}, - start: 5, - end: 14, - expected: "[[0 20]]", - nextStart: 21, - nextEnd: 0, - last: 20, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}}, - start: 6, - end: 14, - expected: "[[0 20]]", - nextStart: 21, - nextEnd: 0, - last: 20, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}, {30, 40}}, - start: 6, - end: 29, - expected: "[[0 40]]", - nextStart: 41, - nextEnd: 0, - last: 40, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}}, - start: 3, - end: 55, - expected: "[[0 60]]", - nextStart: 61, - nextEnd: 0, - last: 60, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}}, - start: 21, - end: 49, - expected: "[[0 5] [15 60]]", - nextStart: 6, - nextEnd: 14, - last: 60, - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}}, - start: 0, - end: 100, - expected: "[[0 100]]", - nextStart: 101, - nextEnd: 0, - last: 100, - }, - { - startLimit: 100, - initial: nil, - start: 0, - end: 0, - expected: "[]", - nextStart: 100, - nextEnd: 0, - last: 0, - }, - { - startLimit: 100, - initial: nil, - start: 20, - end: 30, - expected: "[]", - nextStart: 100, - nextEnd: 0, - last: 0, - }, - { - startLimit: 100, - initial: nil, - start: 50, - end: 100, - expected: "[[100 100]]", - nextStart: 101, - nextEnd: 0, - last: 100, - }, - { - startLimit: 100, - initial: nil, - start: 50, - end: 110, - expected: "[[100 110]]", - nextStart: 111, - nextEnd: 0, - last: 110, - }, - { - startLimit: 100, - initial: nil, - start: 120, - end: 130, - expected: "[[120 130]]", - nextStart: 100, - nextEnd: 119, - last: 130, - }, - { - startLimit: 100, - initial: nil, - start: 120, - end: 130, - expected: "[[120 130]]", - nextStart: 100, - nextEnd: 119, - last: 130, - }, - } { - intervals := NewIntervals(tc.startLimit) - intervals.ranges = tc.initial - intervals.Add(tc.start, tc.end) - got := intervals.String() - if got != tc.expected { - t.Errorf("interval #%d: expected %s, got %s", i, tc.expected, got) - } - nextStart, nextEnd := intervals.Next() - if nextStart != tc.nextStart { - t.Errorf("interval #%d, expected next start %d, got %d", i, tc.nextStart, nextStart) - } - if nextEnd != tc.nextEnd { - t.Errorf("interval #%d, expected next end %d, got %d", i, tc.nextEnd, nextEnd) - } - last := intervals.Last() - if last != tc.last { - t.Errorf("interval #%d, expected last %d, got %d", i, tc.last, last) - } - } -} - -func TestMerge(t *testing.T) { - for i, tc := range []struct { - initial [][2]uint64 - merge [][2]uint64 - expected string - }{ - { - initial: nil, - merge: nil, - expected: "[]", - }, - { - initial: [][2]uint64{{10, 20}}, - merge: nil, - expected: "[[10 20]]", - }, - { - initial: nil, - merge: [][2]uint64{{15, 25}}, - expected: "[[15 25]]", - }, - { - initial: [][2]uint64{{0, 100}}, - merge: [][2]uint64{{150, 250}}, - expected: "[[0 100] [150 250]]", - }, - { - initial: [][2]uint64{{0, 100}}, - merge: [][2]uint64{{101, 250}}, - expected: "[[0 250]]", - }, - { - initial: [][2]uint64{{0, 10}, {30, 40}}, - merge: [][2]uint64{{20, 25}, {41, 50}}, - expected: "[[0 10] [20 25] [30 50]]", - }, - { - initial: [][2]uint64{{0, 5}, {15, 20}, {30, 40}, {50, 60}}, - merge: [][2]uint64{{6, 25}}, - expected: "[[0 25] [30 40] [50 60]]", - }, - } { - intervals := NewIntervals(0) - intervals.ranges = tc.initial - m := NewIntervals(0) - m.ranges = tc.merge - - intervals.Merge(m) - - got := intervals.String() - if got != tc.expected { - t.Errorf("interval #%d: expected %s, got %s", i, tc.expected, got) - } - } -} diff --git a/swarm/network/stream/intervals/store_test.go b/swarm/network/stream/intervals/store_test.go deleted file mode 100644 index 38dca6055f8f..000000000000 --- a/swarm/network/stream/intervals/store_test.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2018 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 intervals - -import ( - "testing" - - "github.com/nebulaai/nbai-node/swarm/state" -) - -// TestInmemoryStore tests basic functionality of InmemoryStore. -func TestInmemoryStore(t *testing.T) { - testStore(t, state.NewInmemoryStore()) -} - -// testStore is a helper function to test various Store implementations. -func testStore(t *testing.T, s state.Store) { - key1 := "key1" - i1 := NewIntervals(0) - i1.Add(10, 20) - if err := s.Put(key1, i1); err != nil { - t.Fatal(err) - } - i := &Intervals{} - err := s.Get(key1, i) - if err != nil { - t.Fatal(err) - } - if i.String() != i1.String() { - t.Errorf("expected interval %s, got %s", i1, i) - } - - key2 := "key2" - i2 := NewIntervals(0) - i2.Add(10, 20) - if err := s.Put(key2, i2); err != nil { - t.Fatal(err) - } - err = s.Get(key2, i) - if err != nil { - t.Fatal(err) - } - if i.String() != i2.String() { - t.Errorf("expected interval %s, got %s", i2, i) - } - - if err := s.Delete(key1); err != nil { - t.Fatal(err) - } - if err := s.Get(key1, i); err != state.ErrNotFound { - t.Errorf("expected error %v, got %s", state.ErrNotFound, err) - } - if err := s.Get(key2, i); err != nil { - t.Errorf("expected error %v, got %s", nil, err) - } - - if err := s.Delete(key2); err != nil { - t.Fatal(err) - } - if err := s.Get(key2, i); err != state.ErrNotFound { - t.Errorf("expected error %v, got %s", state.ErrNotFound, err) - } -} diff --git a/swarm/network/stream/intervals_test.go b/swarm/network/stream/intervals_test.go deleted file mode 100644 index 95f52a5ab95c..000000000000 --- a/swarm/network/stream/intervals_test.go +++ /dev/null @@ -1,398 +0,0 @@ -// Copyright 2018 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 stream - -import ( - "context" - "encoding/binary" - "errors" - "fmt" - "os" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/network/simulation" - "github.com/nebulaai/nbai-node/swarm/state" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/testutil" -) - -func TestIntervalsLive(t *testing.T) { - testIntervals(t, true, nil, false) - testIntervals(t, true, nil, true) -} - -func TestIntervalsHistory(t *testing.T) { - testIntervals(t, false, NewRange(9, 26), false) - testIntervals(t, false, NewRange(9, 26), true) -} - -func TestIntervalsLiveAndHistory(t *testing.T) { - testIntervals(t, true, NewRange(9, 26), false) - testIntervals(t, true, NewRange(9, 26), true) -} - -func testIntervals(t *testing.T, live bool, history *Range, skipCheck bool) { - - nodes := 2 - chunkCount := dataChunkCount - externalStreamName := "externalStream" - externalStreamSessionAt := uint64(50) - externalStreamMaxKeys := uint64(100) - - sim := simulation.New(map[string]simulation.ServiceFunc{ - "intervalsStreamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - n := ctx.Config.Node() - addr := network.NewAddr(n) - store, datadir, err := createTestLocalStorageForID(n.ID(), addr) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - cleanup = func() { - store.Close() - os.RemoveAll(datadir) - } - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - Retrieval: RetrievalDisabled, - Syncing: SyncingRegisterOnly, - SkipCheck: skipCheck, - }, nil) - bucket.Store(bucketKeyRegistry, r) - - r.RegisterClientFunc(externalStreamName, func(p *Peer, t string, live bool) (Client, error) { - return newTestExternalClient(netStore), nil - }) - r.RegisterServerFunc(externalStreamName, func(p *Peer, t string, live bool) (Server, error) { - return newTestExternalServer(t, externalStreamSessionAt, externalStreamMaxKeys, nil), nil - }) - - fileStore := storage.NewFileStore(localStore, storage.NewFileStoreParams()) - bucket.Store(bucketKeyFileStore, fileStore) - - return r, cleanup, nil - - }, - }) - defer sim.Close() - - log.Info("Adding nodes to simulation") - _, err := sim.AddNodesAndConnectChain(nodes) - if err != nil { - t.Fatal(err) - } - - ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) - defer cancel() - - if _, err := sim.WaitTillHealthy(ctx); err != nil { - t.Fatal(err) - } - - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) (err error) { - nodeIDs := sim.UpNodeIDs() - storer := nodeIDs[0] - checker := nodeIDs[1] - - item, ok := sim.NodeItem(storer, bucketKeyFileStore) - if !ok { - return fmt.Errorf("No filestore") - } - fileStore := item.(*storage.FileStore) - - size := chunkCount * chunkSize - - _, wait, err := fileStore.Store(ctx, testutil.RandomReader(1, size), int64(size), false) - if err != nil { - log.Error("Store error: %v", "err", err) - t.Fatal(err) - } - err = wait(ctx) - if err != nil { - log.Error("Wait error: %v", "err", err) - t.Fatal(err) - } - - item, ok = sim.NodeItem(checker, bucketKeyRegistry) - if !ok { - return fmt.Errorf("No registry") - } - registry := item.(*Registry) - - liveErrC := make(chan error) - historyErrC := make(chan error) - - log.Debug("Watching for disconnections") - disconnections := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - simulation.NewPeerEventsFilter().Drop(), - ) - - err = registry.Subscribe(storer, NewStream(externalStreamName, "", live), history, Top) - if err != nil { - return err - } - - var disconnected atomic.Value - go func() { - for d := range disconnections { - if d.Error != nil { - log.Error("peer drop", "node", d.NodeID, "peer", d.PeerID) - disconnected.Store(true) - } - } - }() - defer func() { - if err != nil { - if yes, ok := disconnected.Load().(bool); ok && yes { - err = errors.New("disconnect events received") - } - } - }() - - go func() { - if !live { - close(liveErrC) - return - } - - var err error - defer func() { - liveErrC <- err - }() - - // live stream - var liveHashesChan chan []byte - liveHashesChan, err = getHashes(ctx, registry, storer, NewStream(externalStreamName, "", true)) - if err != nil { - log.Error("get hashes", "err", err) - return - } - i := externalStreamSessionAt - - // we have subscribed, enable notifications - err = enableNotifications(registry, storer, NewStream(externalStreamName, "", true)) - if err != nil { - return - } - - for { - select { - case hash := <-liveHashesChan: - h := binary.BigEndian.Uint64(hash) - if h != i { - err = fmt.Errorf("expected live hash %d, got %d", i, h) - return - } - i++ - if i > externalStreamMaxKeys { - return - } - case <-ctx.Done(): - return - } - } - }() - - go func() { - if live && history == nil { - close(historyErrC) - return - } - - var err error - defer func() { - historyErrC <- err - }() - - // history stream - var historyHashesChan chan []byte - historyHashesChan, err = getHashes(ctx, registry, storer, NewStream(externalStreamName, "", false)) - if err != nil { - log.Error("get hashes", "err", err) - return - } - - var i uint64 - historyTo := externalStreamMaxKeys - if history != nil { - i = history.From - if history.To != 0 { - historyTo = history.To - } - } - - // we have subscribed, enable notifications - err = enableNotifications(registry, storer, NewStream(externalStreamName, "", false)) - if err != nil { - return - } - - for { - select { - case hash := <-historyHashesChan: - h := binary.BigEndian.Uint64(hash) - if h != i { - err = fmt.Errorf("expected history hash %d, got %d", i, h) - return - } - i++ - if i > historyTo { - return - } - case <-ctx.Done(): - return - } - } - }() - - if err := <-liveErrC; err != nil { - return err - } - if err := <-historyErrC; err != nil { - return err - } - - return nil - }) - - if result.Error != nil { - t.Fatal(result.Error) - } -} - -func getHashes(ctx context.Context, r *Registry, peerID enode.ID, s Stream) (chan []byte, error) { - peer := r.getPeer(peerID) - - client, err := peer.getClient(ctx, s) - if err != nil { - return nil, err - } - - c := client.Client.(*testExternalClient) - - return c.hashes, nil -} - -func enableNotifications(r *Registry, peerID enode.ID, s Stream) error { - peer := r.getPeer(peerID) - - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - client, err := peer.getClient(ctx, s) - if err != nil { - return err - } - - close(client.Client.(*testExternalClient).enableNotificationsC) - - return nil -} - -type testExternalClient struct { - hashes chan []byte - store storage.SyncChunkStore - enableNotificationsC chan struct{} -} - -func newTestExternalClient(store storage.SyncChunkStore) *testExternalClient { - return &testExternalClient{ - hashes: make(chan []byte), - store: store, - enableNotificationsC: make(chan struct{}), - } -} - -func (c *testExternalClient) NeedData(ctx context.Context, hash []byte) func(context.Context) error { - wait := c.store.FetchFunc(ctx, storage.Address(hash)) - if wait == nil { - return nil - } - select { - case c.hashes <- hash: - case <-ctx.Done(): - log.Warn("testExternalClient NeedData context", "err", ctx.Err()) - return func(_ context.Context) error { - return ctx.Err() - } - } - return wait -} - -func (c *testExternalClient) BatchDone(Stream, uint64, []byte, []byte) func() (*TakeoverProof, error) { - return nil -} - -func (c *testExternalClient) Close() {} - -type testExternalServer struct { - t string - keyFunc func(key []byte, index uint64) - sessionAt uint64 - maxKeys uint64 -} - -func newTestExternalServer(t string, sessionAt, maxKeys uint64, keyFunc func(key []byte, index uint64)) *testExternalServer { - if keyFunc == nil { - keyFunc = binary.BigEndian.PutUint64 - } - return &testExternalServer{ - t: t, - keyFunc: keyFunc, - sessionAt: sessionAt, - maxKeys: maxKeys, - } -} - -func (s *testExternalServer) SessionIndex() (uint64, error) { - return s.sessionAt, nil -} - -func (s *testExternalServer) SetNextBatch(from uint64, to uint64) ([]byte, uint64, uint64, *HandoverProof, error) { - if to > s.maxKeys { - to = s.maxKeys - } - b := make([]byte, HashSize*(to-from+1)) - for i := from; i <= to; i++ { - s.keyFunc(b[(i-from)*HashSize:(i-from+1)*HashSize], i) - } - return b, from, to, nil, nil -} - -func (s *testExternalServer) GetData(context.Context, []byte) ([]byte, error) { - return make([]byte, 4096), nil -} - -func (s *testExternalServer) Close() {} diff --git a/swarm/network/stream/lightnode_test.go b/swarm/network/stream/lightnode_test.go deleted file mode 100644 index 8d955434a0cd..000000000000 --- a/swarm/network/stream/lightnode_test.go +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright 2018 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 stream - -import ( - "testing" - - p2ptest "github.com/nebulaai/nbai-node/p2p/testing" -) - -// This test checks the default behavior of the server, that is -// when it is serving Retrieve requests. -func TestLigthnodeRetrieveRequestWithRetrieve(t *testing.T) { - registryOptions := &RegistryOptions{ - Retrieval: RetrievalClientOnly, - Syncing: SyncingDisabled, - } - tester, _, _, teardown, err := newStreamerTester(t, registryOptions) - defer teardown() - if err != nil { - t.Fatal(err) - } - - node := tester.Nodes[0] - - stream := NewStream(swarmChunkServerStreamName, "", false) - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "SubscribeMsg", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - }, - Peer: node.ID(), - }, - }, - }) - if err != nil { - t.Fatalf("Got %v", err) - } - - err = tester.TestDisconnected(&p2ptest.Disconnect{Peer: node.ID()}) - if err == nil || err.Error() != "timed out waiting for peers to disconnect" { - t.Fatalf("Expected no disconnect, got %v", err) - } -} - -// This test checks the Lightnode behavior of server, when serving Retrieve -// requests are disabled -func TestLigthnodeRetrieveRequestWithoutRetrieve(t *testing.T) { - registryOptions := &RegistryOptions{ - Retrieval: RetrievalDisabled, - Syncing: SyncingDisabled, - } - tester, _, _, teardown, err := newStreamerTester(t, registryOptions) - defer teardown() - if err != nil { - t.Fatal(err) - } - - node := tester.Nodes[0] - - stream := NewStream(swarmChunkServerStreamName, "", false) - - err = tester.TestExchanges( - p2ptest.Exchange{ - Label: "SubscribeMsg", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 7, - Msg: &SubscribeErrorMsg{ - Error: "stream RETRIEVE_REQUEST not registered", - }, - Peer: node.ID(), - }, - }, - }) - if err != nil { - t.Fatalf("Got %v", err) - } -} - -// This test checks the default behavior of the server, that is -// when syncing is enabled. -func TestLigthnodeRequestSubscriptionWithSync(t *testing.T) { - registryOptions := &RegistryOptions{ - Retrieval: RetrievalDisabled, - Syncing: SyncingRegisterOnly, - } - tester, _, _, teardown, err := newStreamerTester(t, registryOptions) - defer teardown() - if err != nil { - t.Fatal(err) - } - - node := tester.Nodes[0] - - syncStream := NewStream("SYNC", FormatSyncBinKey(1), false) - - err = tester.TestExchanges( - p2ptest.Exchange{ - Label: "RequestSubscription", - Triggers: []p2ptest.Trigger{ - { - Code: 8, - Msg: &RequestSubscriptionMsg{ - Stream: syncStream, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: syncStream, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatalf("Got %v", err) - } -} - -// This test checks the Lightnode behavior of the server, that is -// when syncing is disabled. -func TestLigthnodeRequestSubscriptionWithoutSync(t *testing.T) { - registryOptions := &RegistryOptions{ - Retrieval: RetrievalDisabled, - Syncing: SyncingDisabled, - } - tester, _, _, teardown, err := newStreamerTester(t, registryOptions) - defer teardown() - if err != nil { - t.Fatal(err) - } - - node := tester.Nodes[0] - - syncStream := NewStream("SYNC", FormatSyncBinKey(1), false) - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "RequestSubscription", - Triggers: []p2ptest.Trigger{ - { - Code: 8, - Msg: &RequestSubscriptionMsg{ - Stream: syncStream, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 7, - Msg: &SubscribeErrorMsg{ - Error: "stream SYNC not registered", - }, - Peer: node.ID(), - }, - }, - }, p2ptest.Exchange{ - Label: "RequestSubscription", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: syncStream, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 7, - Msg: &SubscribeErrorMsg{ - Error: "stream SYNC not registered", - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatalf("Got %v", err) - } -} diff --git a/swarm/network/stream/messages.go b/swarm/network/stream/messages.go deleted file mode 100644 index b1625b3319e6..000000000000 --- a/swarm/network/stream/messages.go +++ /dev/null @@ -1,405 +0,0 @@ -// Copyright 2018 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 stream - -import ( - "context" - "fmt" - "time" - - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/swarm/log" - bv "github.com/nebulaai/nbai-node/swarm/network/bitvector" - "github.com/nebulaai/nbai-node/swarm/spancontext" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/opentracing/opentracing-go" -) - -var syncBatchTimeout = 30 * time.Second - -// Stream defines a unique stream identifier. -type Stream struct { - // Name is used for Client and Server functions identification. - Name string - // Key is the name of specific stream data. - Key string - // Live defines whether the stream delivers only new data - // for the specific stream. - Live bool -} - -func NewStream(name string, key string, live bool) Stream { - return Stream{ - Name: name, - Key: key, - Live: live, - } -} - -// String return a stream id based on all Stream fields. -func (s Stream) String() string { - t := "h" - if s.Live { - t = "l" - } - return fmt.Sprintf("%s|%s|%s", s.Name, s.Key, t) -} - -// SubcribeMsg is the protocol msg for requesting a stream(section) -type SubscribeMsg struct { - Stream Stream - History *Range `rlp:"nil"` - Priority uint8 // delivered on priority channel -} - -// RequestSubscriptionMsg is the protocol msg for a node to request subscription to a -// specific stream -type RequestSubscriptionMsg struct { - Stream Stream - History *Range `rlp:"nil"` - Priority uint8 // delivered on priority channel -} - -func (p *Peer) handleRequestSubscription(ctx context.Context, req *RequestSubscriptionMsg) (err error) { - log.Debug(fmt.Sprintf("handleRequestSubscription: streamer %s to subscribe to %s with stream %s", p.streamer.addr, p.ID(), req.Stream)) - if err = p.streamer.Subscribe(p.ID(), req.Stream, req.History, req.Priority); err != nil { - // The error will be sent as a subscribe error message - // and will not be returned as it will prevent any new message - // exchange between peers over p2p. Instead, error will be returned - // only if there is one from sending subscribe error message. - err = p.Send(ctx, SubscribeErrorMsg{ - Error: err.Error(), - }) - } - return err -} - -func (p *Peer) handleSubscribeMsg(ctx context.Context, req *SubscribeMsg) (err error) { - metrics.GetOrRegisterCounter("peer.handlesubscribemsg", nil).Inc(1) - - defer func() { - if err != nil { - // The error will be sent as a subscribe error message - // and will not be returned as it will prevent any new message - // exchange between peers over p2p. Instead, error will be returned - // only if there is one from sending subscribe error message. - err = p.Send(context.TODO(), SubscribeErrorMsg{ - Error: err.Error(), - }) - } - }() - - log.Debug("received subscription", "from", p.streamer.addr, "peer", p.ID(), "stream", req.Stream, "history", req.History) - - f, err := p.streamer.GetServerFunc(req.Stream.Name) - if err != nil { - return err - } - - s, err := f(p, req.Stream.Key, req.Stream.Live) - if err != nil { - return err - } - os, err := p.setServer(req.Stream, s, req.Priority) - if err != nil { - return err - } - - var from uint64 - var to uint64 - if !req.Stream.Live && req.History != nil { - from = req.History.From - to = req.History.To - } - - go func() { - if err := p.SendOfferedHashes(os, from, to); err != nil { - log.Warn("SendOfferedHashes error", "peer", p.ID().TerminalString(), "err", err) - } - }() - - if req.Stream.Live && req.History != nil { - // subscribe to the history stream - s, err := f(p, req.Stream.Key, false) - if err != nil { - return err - } - - os, err := p.setServer(getHistoryStream(req.Stream), s, getHistoryPriority(req.Priority)) - if err != nil { - return err - } - go func() { - if err := p.SendOfferedHashes(os, req.History.From, req.History.To); err != nil { - log.Warn("SendOfferedHashes error", "peer", p.ID().TerminalString(), "err", err) - } - }() - } - - return nil -} - -type SubscribeErrorMsg struct { - Error string -} - -func (p *Peer) handleSubscribeErrorMsg(req *SubscribeErrorMsg) (err error) { - //TODO the error should be channeled to whoever calls the subscribe - return fmt.Errorf("subscribe to peer %s: %v", p.ID(), req.Error) -} - -type UnsubscribeMsg struct { - Stream Stream -} - -func (p *Peer) handleUnsubscribeMsg(req *UnsubscribeMsg) error { - return p.removeServer(req.Stream) -} - -type QuitMsg struct { - Stream Stream -} - -func (p *Peer) handleQuitMsg(req *QuitMsg) error { - return p.removeClient(req.Stream) -} - -// OfferedHashesMsg is the protocol msg for offering to hand over a -// stream section -type OfferedHashesMsg struct { - Stream Stream // name of Stream - From, To uint64 // peer and db-specific entry count - Hashes []byte // stream of hashes (128) - *HandoverProof // HandoverProof -} - -// String pretty prints OfferedHashesMsg -func (m OfferedHashesMsg) String() string { - return fmt.Sprintf("Stream '%v' [%v-%v] (%v)", m.Stream, m.From, m.To, len(m.Hashes)/HashSize) -} - -// handleOfferedHashesMsg protocol msg handler calls the incoming streamer interface -// Filter method -func (p *Peer) handleOfferedHashesMsg(ctx context.Context, req *OfferedHashesMsg) error { - metrics.GetOrRegisterCounter("peer.handleofferedhashes", nil).Inc(1) - - var sp opentracing.Span - ctx, sp = spancontext.StartSpan( - ctx, - "handle.offered.hashes") - defer sp.Finish() - - c, _, err := p.getOrSetClient(req.Stream, req.From, req.To) - if err != nil { - return err - } - - hashes := req.Hashes - lenHashes := len(hashes) - if lenHashes%HashSize != 0 { - return fmt.Errorf("error invalid hashes length (len: %v)", lenHashes) - } - - want, err := bv.New(lenHashes / HashSize) - if err != nil { - return fmt.Errorf("error initiaising bitvector of length %v: %v", lenHashes/HashSize, err) - } - - ctr := 0 - errC := make(chan error) - ctx, cancel := context.WithTimeout(ctx, syncBatchTimeout) - - ctx = context.WithValue(ctx, "source", p.ID().String()) - for i := 0; i < lenHashes; i += HashSize { - hash := hashes[i : i+HashSize] - - if wait := c.NeedData(ctx, hash); wait != nil { - ctr++ - want.Set(i/HashSize, true) - // create request and wait until the chunk data arrives and is stored - go func(w func(context.Context) error) { - select { - case errC <- w(ctx): - case <-ctx.Done(): - } - }(wait) - } - } - - go func() { - defer cancel() - for i := 0; i < ctr; i++ { - select { - case err := <-errC: - if err != nil { - log.Debug("client.handleOfferedHashesMsg() error waiting for chunk, dropping peer", "peer", p.ID(), "err", err) - p.Drop(err) - return - } - case <-ctx.Done(): - log.Debug("client.handleOfferedHashesMsg() context done", "ctx.Err()", ctx.Err()) - return - case <-c.quit: - log.Debug("client.handleOfferedHashesMsg() quit") - return - } - } - select { - case c.next <- c.batchDone(p, req, hashes): - case <-c.quit: - log.Debug("client.handleOfferedHashesMsg() quit") - case <-ctx.Done(): - log.Debug("client.handleOfferedHashesMsg() context done", "ctx.Err()", ctx.Err()) - } - }() - // only send wantedKeysMsg if all missing chunks of the previous batch arrived - // except - if c.stream.Live { - c.sessionAt = req.From - } - from, to := c.nextBatch(req.To + 1) - log.Trace("set next batch", "peer", p.ID(), "stream", req.Stream, "from", req.From, "to", req.To, "addr", p.streamer.addr) - if from == to { - return nil - } - - msg := &WantedHashesMsg{ - Stream: req.Stream, - Want: want.Bytes(), - From: from, - To: to, - } - go func() { - log.Trace("sending want batch", "peer", p.ID(), "stream", msg.Stream, "from", msg.From, "to", msg.To) - select { - case err := <-c.next: - if err != nil { - log.Warn("c.next error dropping peer", "err", err) - p.Drop(err) - return - } - case <-c.quit: - log.Debug("client.handleOfferedHashesMsg() quit") - return - case <-ctx.Done(): - log.Debug("client.handleOfferedHashesMsg() context done", "ctx.Err()", ctx.Err()) - return - } - log.Trace("sending want batch", "peer", p.ID(), "stream", msg.Stream, "from", msg.From, "to", msg.To) - err := p.SendPriority(ctx, msg, c.priority) - if err != nil { - log.Warn("SendPriority error", "err", err) - } - }() - return nil -} - -// WantedHashesMsg is the protocol msg data for signaling which hashes -// offered in OfferedHashesMsg downstream peer actually wants sent over -type WantedHashesMsg struct { - Stream Stream - Want []byte // bitvector indicating which keys of the batch needed - From, To uint64 // next interval offset - empty if not to be continued -} - -// String pretty prints WantedHashesMsg -func (m WantedHashesMsg) String() string { - return fmt.Sprintf("Stream '%v', Want: %x, Next: [%v-%v]", m.Stream, m.Want, m.From, m.To) -} - -// handleWantedHashesMsg protocol msg handler -// * sends the next batch of unsynced keys -// * sends the actual data chunks as per WantedHashesMsg -func (p *Peer) handleWantedHashesMsg(ctx context.Context, req *WantedHashesMsg) error { - metrics.GetOrRegisterCounter("peer.handlewantedhashesmsg", nil).Inc(1) - - log.Trace("received wanted batch", "peer", p.ID(), "stream", req.Stream, "from", req.From, "to", req.To) - s, err := p.getServer(req.Stream) - if err != nil { - return err - } - hashes := s.currentBatch - // launch in go routine since GetBatch blocks until new hashes arrive - go func() { - if err := p.SendOfferedHashes(s, req.From, req.To); err != nil { - log.Warn("SendOfferedHashes error", "peer", p.ID().TerminalString(), "err", err) - } - }() - // go p.SendOfferedHashes(s, req.From, req.To) - l := len(hashes) / HashSize - - log.Trace("wanted batch length", "peer", p.ID(), "stream", req.Stream, "from", req.From, "to", req.To, "lenhashes", len(hashes), "l", l) - want, err := bv.NewFromBytes(req.Want, l) - if err != nil { - return fmt.Errorf("error initiaising bitvector of length %v: %v", l, err) - } - for i := 0; i < l; i++ { - if want.Get(i) { - metrics.GetOrRegisterCounter("peer.handlewantedhashesmsg.actualget", nil).Inc(1) - - hash := hashes[i*HashSize : (i+1)*HashSize] - data, err := s.GetData(ctx, hash) - if err != nil { - return fmt.Errorf("handleWantedHashesMsg get data %x: %v", hash, err) - } - chunk := storage.NewChunk(hash, data) - syncing := true - if err := p.Deliver(ctx, chunk, s.priority, syncing); err != nil { - return err - } - } - } - return nil -} - -// Handover represents a statement that the upstream peer hands over the stream section -type Handover struct { - Stream Stream // name of stream - Start, End uint64 // index of hashes - Root []byte // Root hash for indexed segment inclusion proofs -} - -// HandoverProof represents a signed statement that the upstream peer handed over the stream section -type HandoverProof struct { - Sig []byte // Sign(Hash(Serialisation(Handover))) - *Handover -} - -// Takeover represents a statement that downstream peer took over (stored all data) -// handed over -type Takeover Handover - -// TakeoverProof represents a signed statement that the downstream peer took over -// the stream section -type TakeoverProof struct { - Sig []byte // Sign(Hash(Serialisation(Takeover))) - *Takeover -} - -// TakeoverProofMsg is the protocol msg sent by downstream peer -type TakeoverProofMsg TakeoverProof - -// String pretty prints TakeoverProofMsg -func (m TakeoverProofMsg) String() string { - return fmt.Sprintf("Stream: '%v' [%v-%v], Root: %x, Sig: %x", m.Stream, m.Start, m.End, m.Root, m.Sig) -} - -func (p *Peer) handleTakeoverProofMsg(ctx context.Context, req *TakeoverProofMsg) error { - _, err := p.getServer(req.Stream) - // store the strongest takeoverproof for the stream in streamer - return err -} diff --git a/swarm/network/stream/peer.go b/swarm/network/stream/peer.go deleted file mode 100644 index 4f6b5449822b..000000000000 --- a/swarm/network/stream/peer.go +++ /dev/null @@ -1,420 +0,0 @@ -// Copyright 2018 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 stream - -import ( - "context" - "errors" - "fmt" - "sync" - "time" - - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/p2p/protocols" - "github.com/nebulaai/nbai-node/swarm/log" - pq "github.com/nebulaai/nbai-node/swarm/network/priorityqueue" - "github.com/nebulaai/nbai-node/swarm/network/stream/intervals" - "github.com/nebulaai/nbai-node/swarm/spancontext" - "github.com/nebulaai/nbai-node/swarm/state" - "github.com/nebulaai/nbai-node/swarm/storage" - opentracing "github.com/opentracing/opentracing-go" -) - -type notFoundError struct { - t string - s Stream -} - -func newNotFoundError(t string, s Stream) *notFoundError { - return ¬FoundError{t: t, s: s} -} - -func (e *notFoundError) Error() string { - return fmt.Sprintf("%s not found for stream %q", e.t, e.s) -} - -// ErrMaxPeerServers will be returned if peer server limit is reached. -// It will be sent in the SubscribeErrorMsg. -var ErrMaxPeerServers = errors.New("max peer servers") - -// Peer is the Peer extension for the streaming protocol -type Peer struct { - *protocols.Peer - streamer *Registry - pq *pq.PriorityQueue - serverMu sync.RWMutex - clientMu sync.RWMutex // protects both clients and clientParams - servers map[Stream]*server - clients map[Stream]*client - // clientParams map keeps required client arguments - // that are set on Registry.Subscribe and used - // on creating a new client in offered hashes handler. - clientParams map[Stream]*clientParams - quit chan struct{} -} - -type WrappedPriorityMsg struct { - Context context.Context - Msg interface{} -} - -// NewPeer is the constructor for Peer -func NewPeer(peer *protocols.Peer, streamer *Registry) *Peer { - p := &Peer{ - Peer: peer, - pq: pq.New(int(PriorityQueue), PriorityQueueCap), - streamer: streamer, - servers: make(map[Stream]*server), - clients: make(map[Stream]*client), - clientParams: make(map[Stream]*clientParams), - quit: make(chan struct{}), - } - ctx, cancel := context.WithCancel(context.Background()) - go p.pq.Run(ctx, func(i interface{}) { - wmsg := i.(WrappedPriorityMsg) - err := p.Send(wmsg.Context, wmsg.Msg) - if err != nil { - log.Error("Message send error, dropping peer", "peer", p.ID(), "err", err) - p.Drop(err) - } - }) - - // basic monitoring for pq contention - go func(pq *pq.PriorityQueue) { - ticker := time.NewTicker(5 * time.Second) - defer ticker.Stop() - for { - select { - case <-ticker.C: - var len_maxi int - var cap_maxi int - for k := range pq.Queues { - if len_maxi < len(pq.Queues[k]) { - len_maxi = len(pq.Queues[k]) - } - - if cap_maxi < cap(pq.Queues[k]) { - cap_maxi = cap(pq.Queues[k]) - } - } - - metrics.GetOrRegisterGauge(fmt.Sprintf("pq_len_%s", p.ID().TerminalString()), nil).Update(int64(len_maxi)) - metrics.GetOrRegisterGauge(fmt.Sprintf("pq_cap_%s", p.ID().TerminalString()), nil).Update(int64(cap_maxi)) - case <-p.quit: - return - } - } - }(p.pq) - - go func() { - <-p.quit - cancel() - }() - return p -} - -// Deliver sends a storeRequestMsg protocol message to the peer -// Depending on the `syncing` parameter we send different message types -func (p *Peer) Deliver(ctx context.Context, chunk storage.Chunk, priority uint8, syncing bool) error { - var sp opentracing.Span - var msg interface{} - - spanName := "send.chunk.delivery" - - //we send different types of messages if delivery is for syncing or retrievals, - //even if handling and content of the message are the same, - //because swap accounting decides which messages need accounting based on the message type - if syncing { - msg = &ChunkDeliveryMsgSyncing{ - Addr: chunk.Address(), - SData: chunk.Data(), - } - spanName += ".syncing" - } else { - msg = &ChunkDeliveryMsgRetrieval{ - Addr: chunk.Address(), - SData: chunk.Data(), - } - spanName += ".retrieval" - } - ctx, sp = spancontext.StartSpan( - ctx, - spanName) - defer sp.Finish() - - return p.SendPriority(ctx, msg, priority) -} - -// SendPriority sends message to the peer using the outgoing priority queue -func (p *Peer) SendPriority(ctx context.Context, msg interface{}, priority uint8) error { - defer metrics.GetOrRegisterResettingTimer(fmt.Sprintf("peer.sendpriority_t.%d", priority), nil).UpdateSince(time.Now()) - metrics.GetOrRegisterCounter(fmt.Sprintf("peer.sendpriority.%d", priority), nil).Inc(1) - wmsg := WrappedPriorityMsg{ - Context: ctx, - Msg: msg, - } - err := p.pq.Push(wmsg, int(priority)) - if err == pq.ErrContention { - log.Warn("dropping peer on priority queue contention", "peer", p.ID()) - p.Drop(err) - } - return err -} - -// SendOfferedHashes sends OfferedHashesMsg protocol msg -func (p *Peer) SendOfferedHashes(s *server, f, t uint64) error { - var sp opentracing.Span - ctx, sp := spancontext.StartSpan( - context.TODO(), - "send.offered.hashes") - defer sp.Finish() - - hashes, from, to, proof, err := s.setNextBatch(f, t) - if err != nil { - return err - } - // true only when quitting - if len(hashes) == 0 { - return nil - } - if proof == nil { - proof = &HandoverProof{ - Handover: &Handover{}, - } - } - s.currentBatch = hashes - msg := &OfferedHashesMsg{ - HandoverProof: proof, - Hashes: hashes, - From: from, - To: to, - Stream: s.stream, - } - log.Trace("Swarm syncer offer batch", "peer", p.ID(), "stream", s.stream, "len", len(hashes), "from", from, "to", to) - return p.SendPriority(ctx, msg, s.priority) -} - -func (p *Peer) getServer(s Stream) (*server, error) { - p.serverMu.RLock() - defer p.serverMu.RUnlock() - - server := p.servers[s] - if server == nil { - return nil, newNotFoundError("server", s) - } - return server, nil -} - -func (p *Peer) setServer(s Stream, o Server, priority uint8) (*server, error) { - p.serverMu.Lock() - defer p.serverMu.Unlock() - - if p.servers[s] != nil { - return nil, fmt.Errorf("server %s already registered", s) - } - - if p.streamer.maxPeerServers > 0 && len(p.servers) >= p.streamer.maxPeerServers { - return nil, ErrMaxPeerServers - } - - sessionIndex, err := o.SessionIndex() - if err != nil { - return nil, err - } - os := &server{ - Server: o, - stream: s, - priority: priority, - sessionIndex: sessionIndex, - } - p.servers[s] = os - return os, nil -} - -func (p *Peer) removeServer(s Stream) error { - p.serverMu.Lock() - defer p.serverMu.Unlock() - - server, ok := p.servers[s] - if !ok { - return newNotFoundError("server", s) - } - server.Close() - delete(p.servers, s) - return nil -} - -func (p *Peer) getClient(ctx context.Context, s Stream) (c *client, err error) { - var params *clientParams - func() { - p.clientMu.RLock() - defer p.clientMu.RUnlock() - - c = p.clients[s] - if c != nil { - return - } - params = p.clientParams[s] - }() - if c != nil { - return c, nil - } - - if params != nil { - //debug.PrintStack() - if err := params.waitClient(ctx); err != nil { - return nil, err - } - } - - p.clientMu.RLock() - defer p.clientMu.RUnlock() - - c = p.clients[s] - if c != nil { - return c, nil - } - return nil, newNotFoundError("client", s) -} - -func (p *Peer) getOrSetClient(s Stream, from, to uint64) (c *client, created bool, err error) { - p.clientMu.Lock() - defer p.clientMu.Unlock() - - c = p.clients[s] - if c != nil { - return c, false, nil - } - - f, err := p.streamer.GetClientFunc(s.Name) - if err != nil { - return nil, false, err - } - - is, err := f(p, s.Key, s.Live) - if err != nil { - return nil, false, err - } - - cp, err := p.getClientParams(s) - if err != nil { - return nil, false, err - } - defer func() { - if err == nil { - if err := p.removeClientParams(s); err != nil { - log.Error("stream set client: remove client params", "stream", s, "peer", p, "err", err) - } - } - }() - - intervalsKey := peerStreamIntervalsKey(p, s) - if s.Live { - // try to find previous history and live intervals and merge live into history - historyKey := peerStreamIntervalsKey(p, NewStream(s.Name, s.Key, false)) - historyIntervals := &intervals.Intervals{} - err := p.streamer.intervalsStore.Get(historyKey, historyIntervals) - switch err { - case nil: - liveIntervals := &intervals.Intervals{} - err := p.streamer.intervalsStore.Get(intervalsKey, liveIntervals) - switch err { - case nil: - historyIntervals.Merge(liveIntervals) - if err := p.streamer.intervalsStore.Put(historyKey, historyIntervals); err != nil { - log.Error("stream set client: put history intervals", "stream", s, "peer", p, "err", err) - } - case state.ErrNotFound: - default: - log.Error("stream set client: get live intervals", "stream", s, "peer", p, "err", err) - } - case state.ErrNotFound: - default: - log.Error("stream set client: get history intervals", "stream", s, "peer", p, "err", err) - } - } - - if err := p.streamer.intervalsStore.Put(intervalsKey, intervals.NewIntervals(from)); err != nil { - return nil, false, err - } - - next := make(chan error, 1) - c = &client{ - Client: is, - stream: s, - priority: cp.priority, - to: cp.to, - next: next, - quit: make(chan struct{}), - intervalsStore: p.streamer.intervalsStore, - intervalsKey: intervalsKey, - } - p.clients[s] = c - cp.clientCreated() // unblock all possible getClient calls that are waiting - next <- nil // this is to allow wantedKeysMsg before first batch arrives - return c, true, nil -} - -func (p *Peer) removeClient(s Stream) error { - p.clientMu.Lock() - defer p.clientMu.Unlock() - - client, ok := p.clients[s] - if !ok { - return newNotFoundError("client", s) - } - client.close() - delete(p.clients, s) - return nil -} - -func (p *Peer) setClientParams(s Stream, params *clientParams) error { - p.clientMu.Lock() - defer p.clientMu.Unlock() - - if p.clients[s] != nil { - return fmt.Errorf("client %s already exists", s) - } - if p.clientParams[s] != nil { - return fmt.Errorf("client params %s already set", s) - } - p.clientParams[s] = params - return nil -} - -func (p *Peer) getClientParams(s Stream) (*clientParams, error) { - params := p.clientParams[s] - if params == nil { - return nil, fmt.Errorf("client params '%v' not provided to peer %v", s, p.ID()) - } - return params, nil -} - -func (p *Peer) removeClientParams(s Stream) error { - _, ok := p.clientParams[s] - if !ok { - return newNotFoundError("client params", s) - } - delete(p.clientParams, s) - return nil -} - -func (p *Peer) close() { - for _, s := range p.servers { - s.Close() - } -} diff --git a/swarm/network/stream/snapshot_retrieval_test.go b/swarm/network/stream/snapshot_retrieval_test.go deleted file mode 100644 index 78f1492e5912..000000000000 --- a/swarm/network/stream/snapshot_retrieval_test.go +++ /dev/null @@ -1,328 +0,0 @@ -// Copyright 2018 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 stream - -import ( - "context" - "fmt" - "os" - "sync" - "testing" - "time" - - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/network/simulation" - "github.com/nebulaai/nbai-node/swarm/state" - "github.com/nebulaai/nbai-node/swarm/storage" -) - -//constants for random file generation -const ( - minFileSize = 2 - maxFileSize = 40 -) - -//This test is a retrieval test for nodes. -//A configurable number of nodes can be -//provided to the test. -//Files are uploaded to nodes, other nodes try to retrieve the file -//Number of nodes can be provided via commandline too. -func TestFileRetrieval(t *testing.T) { - if *nodes != 0 { - err := runFileRetrievalTest(*nodes) - if err != nil { - t.Fatal(err) - } - } else { - nodeCnt := []int{16} - //if the `longrunning` flag has been provided - //run more test combinations - if *longrunning { - nodeCnt = append(nodeCnt, 32, 64, 128) - } - for _, n := range nodeCnt { - err := runFileRetrievalTest(n) - if err != nil { - t.Fatal(err) - } - } - } -} - -//This test is a retrieval test for nodes. -//One node is randomly selected to be the pivot node. -//A configurable number of chunks and nodes can be -//provided to the test, the number of chunks is uploaded -//to the pivot node and other nodes try to retrieve the chunk(s). -//Number of chunks and nodes can be provided via commandline too. -func TestRetrieval(t *testing.T) { - //if nodes/chunks have been provided via commandline, - //run the tests with these values - if *nodes != 0 && *chunks != 0 { - err := runRetrievalTest(*chunks, *nodes) - if err != nil { - t.Fatal(err) - } - } else { - var nodeCnt []int - var chnkCnt []int - //if the `longrunning` flag has been provided - //run more test combinations - if *longrunning { - nodeCnt = []int{16, 32, 128} - chnkCnt = []int{4, 32, 256} - } else { - //default test - nodeCnt = []int{16} - chnkCnt = []int{32} - } - for _, n := range nodeCnt { - for _, c := range chnkCnt { - err := runRetrievalTest(c, n) - if err != nil { - t.Fatal(err) - } - } - } - } -} - -var retrievalSimServiceMap = map[string]simulation.ServiceFunc{ - "streamer": retrievalStreamerFunc, -} - -func retrievalStreamerFunc(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - n := ctx.Config.Node() - addr := network.NewAddr(n) - store, datadir, err := createTestLocalStorageForID(n.ID(), addr) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - Retrieval: RetrievalEnabled, - Syncing: SyncingAutoSubscribe, - SyncUpdateDelay: 3 * time.Second, - }, nil) - - fileStore := storage.NewFileStore(netStore, storage.NewFileStoreParams()) - bucket.Store(bucketKeyFileStore, fileStore) - - cleanup = func() { - os.RemoveAll(datadir) - netStore.Close() - r.Close() - } - - return r, cleanup, nil -} - -/* -The test loads a snapshot file to construct the swarm network, -assuming that the snapshot file identifies a healthy -kademlia network. Nevertheless a health check runs in the -simulation's `action` function. - -The snapshot should have 'streamer' in its service list. -*/ -func runFileRetrievalTest(nodeCount int) error { - sim := simulation.New(retrievalSimServiceMap) - defer sim.Close() - - log.Info("Initializing test config") - - conf := &synctestConfig{} - //map of discover ID to indexes of chunks expected at that ID - conf.idToChunksMap = make(map[enode.ID][]int) - //map of overlay address to discover ID - conf.addrToIDMap = make(map[string]enode.ID) - //array where the generated chunk hashes will be stored - conf.hashes = make([]storage.Address, 0) - - err := sim.UploadSnapshot(fmt.Sprintf("testing/snapshot_%d.json", nodeCount)) - if err != nil { - return err - } - - ctx, cancelSimRun := context.WithTimeout(context.Background(), 1*time.Minute) - defer cancelSimRun() - - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - nodeIDs := sim.UpNodeIDs() - for _, n := range nodeIDs { - //get the kademlia overlay address from this ID - a := n.Bytes() - //append it to the array of all overlay addresses - conf.addrs = append(conf.addrs, a) - //the proximity calculation is on overlay addr, - //the p2p/simulations check func triggers on enode.ID, - //so we need to know which overlay addr maps to which nodeID - conf.addrToIDMap[string(a)] = n - } - - //an array for the random files - var randomFiles []string - //channel to signal when the upload has finished - //uploadFinished := make(chan struct{}) - //channel to trigger new node checks - - conf.hashes, randomFiles, err = uploadFilesToNodes(sim) - if err != nil { - return err - } - if _, err := sim.WaitTillHealthy(ctx); err != nil { - return err - } - - // File retrieval check is repeated until all uploaded files are retrieved from all nodes - // or until the timeout is reached. - REPEAT: - for { - for _, id := range nodeIDs { - //for each expected file, check if it is in the local store - item, ok := sim.NodeItem(id, bucketKeyFileStore) - if !ok { - return fmt.Errorf("No filestore") - } - fileStore := item.(*storage.FileStore) - //check all chunks - for i, hash := range conf.hashes { - reader, _ := fileStore.Retrieve(context.TODO(), hash) - //check that we can read the file size and that it corresponds to the generated file size - if s, err := reader.Size(ctx, nil); err != nil || s != int64(len(randomFiles[i])) { - log.Debug("Retrieve error", "err", err, "hash", hash, "nodeId", id) - time.Sleep(500 * time.Millisecond) - continue REPEAT - } - log.Debug(fmt.Sprintf("File with root hash %x successfully retrieved", hash)) - } - } - return nil - } - }) - - if result.Error != nil { - return result.Error - } - - return nil -} - -/* -The test generates the given number of chunks. - -The test loads a snapshot file to construct the swarm network, -assuming that the snapshot file identifies a healthy -kademlia network. Nevertheless a health check runs in the -simulation's `action` function. - -The snapshot should have 'streamer' in its service list. -*/ -func runRetrievalTest(chunkCount int, nodeCount int) error { - sim := simulation.New(retrievalSimServiceMap) - defer sim.Close() - - conf := &synctestConfig{} - //map of discover ID to indexes of chunks expected at that ID - conf.idToChunksMap = make(map[enode.ID][]int) - //map of overlay address to discover ID - conf.addrToIDMap = make(map[string]enode.ID) - //array where the generated chunk hashes will be stored - conf.hashes = make([]storage.Address, 0) - - err := sim.UploadSnapshot(fmt.Sprintf("testing/snapshot_%d.json", nodeCount)) - if err != nil { - return err - } - - ctx := context.Background() - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - nodeIDs := sim.UpNodeIDs() - for _, n := range nodeIDs { - //get the kademlia overlay address from this ID - a := n.Bytes() - //append it to the array of all overlay addresses - conf.addrs = append(conf.addrs, a) - //the proximity calculation is on overlay addr, - //the p2p/simulations check func triggers on enode.ID, - //so we need to know which overlay addr maps to which nodeID - conf.addrToIDMap[string(a)] = n - } - - //this is the node selected for upload - node := sim.Net.GetRandomUpNode() - item, ok := sim.NodeItem(node.ID(), bucketKeyStore) - if !ok { - return fmt.Errorf("No localstore") - } - lstore := item.(*storage.LocalStore) - conf.hashes, err = uploadFileToSingleNodeStore(node.ID(), chunkCount, lstore) - if err != nil { - return err - } - if _, err := sim.WaitTillHealthy(ctx); err != nil { - return err - } - - // File retrieval check is repeated until all uploaded files are retrieved from all nodes - // or until the timeout is reached. - REPEAT: - for { - for _, id := range nodeIDs { - //for each expected chunk, check if it is in the local store - //check on the node's FileStore (netstore) - item, ok := sim.NodeItem(id, bucketKeyFileStore) - if !ok { - return fmt.Errorf("No filestore") - } - fileStore := item.(*storage.FileStore) - //check all chunks - for _, hash := range conf.hashes { - reader, _ := fileStore.Retrieve(context.TODO(), hash) - //check that we can read the chunk size and that it corresponds to the generated chunk size - if s, err := reader.Size(ctx, nil); err != nil || s != int64(chunkSize) { - log.Debug("Retrieve error", "err", err, "hash", hash, "nodeId", id, "size", s) - time.Sleep(500 * time.Millisecond) - continue REPEAT - } - log.Debug(fmt.Sprintf("Chunk with root hash %x successfully retrieved", hash)) - } - } - // all nodes and files found, exit loop and return without error - return nil - } - }) - - if result.Error != nil { - return result.Error - } - - return nil -} diff --git a/swarm/network/stream/snapshot_sync_test.go b/swarm/network/stream/snapshot_sync_test.go deleted file mode 100644 index 7fdad26d9e9f..000000000000 --- a/swarm/network/stream/snapshot_sync_test.go +++ /dev/null @@ -1,345 +0,0 @@ -// Copyright 2018 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 stream - -import ( - "context" - "fmt" - "os" - "runtime" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/network/simulation" - "github.com/nebulaai/nbai-node/swarm/pot" - "github.com/nebulaai/nbai-node/swarm/state" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/storage/mock" - mockmem "github.com/nebulaai/nbai-node/swarm/storage/mock/mem" - "github.com/nebulaai/nbai-node/swarm/testutil" -) - -const MaxTimeout = 600 - -type synctestConfig struct { - addrs [][]byte - hashes []storage.Address - idToChunksMap map[enode.ID][]int - //chunksToNodesMap map[string][]int - addrToIDMap map[string]enode.ID -} - -const ( - // EventTypeNode is the type of event emitted when a node is either - // created, started or stopped - EventTypeChunkCreated simulations.EventType = "chunkCreated" - EventTypeChunkOffered simulations.EventType = "chunkOffered" - EventTypeChunkWanted simulations.EventType = "chunkWanted" - EventTypeChunkDelivered simulations.EventType = "chunkDelivered" - EventTypeChunkArrived simulations.EventType = "chunkArrived" - EventTypeSimTerminated simulations.EventType = "simTerminated" -) - -// Tests in this file should not request chunks from peers. -// This function will panic indicating that there is a problem if request has been made. -func dummyRequestFromPeers(_ context.Context, req *network.Request) (*enode.ID, chan struct{}, error) { - panic(fmt.Sprintf("unexpected request: address %s, source %s", req.Addr.String(), req.Source.String())) -} - -//This test is a syncing test for nodes. -//One node is randomly selected to be the pivot node. -//A configurable number of chunks and nodes can be -//provided to the test, the number of chunks is uploaded -//to the pivot node, and we check that nodes get the chunks -//they are expected to store based on the syncing protocol. -//Number of chunks and nodes can be provided via commandline too. -func TestSyncingViaGlobalSync(t *testing.T) { - if runtime.GOOS == "darwin" && os.Getenv("TRAVIS") == "true" { - t.Skip("Flaky on mac on travis") - } - //if nodes/chunks have been provided via commandline, - //run the tests with these values - if *nodes != 0 && *chunks != 0 { - log.Info(fmt.Sprintf("Running test with %d chunks and %d nodes...", *chunks, *nodes)) - testSyncingViaGlobalSync(t, *chunks, *nodes) - } else { - var nodeCnt []int - var chnkCnt []int - //if the `longrunning` flag has been provided - //run more test combinations - if *longrunning { - chnkCnt = []int{1, 8, 32, 256, 1024} - nodeCnt = []int{16, 32, 64, 128, 256} - } else { - //default test - chnkCnt = []int{4, 32} - nodeCnt = []int{32, 16} - } - for _, chnk := range chnkCnt { - for _, n := range nodeCnt { - log.Info(fmt.Sprintf("Long running test with %d chunks and %d nodes...", chnk, n)) - testSyncingViaGlobalSync(t, chnk, n) - } - } - } -} - -var simServiceMap = map[string]simulation.ServiceFunc{ - "streamer": streamerFunc, -} - -func streamerFunc(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - n := ctx.Config.Node() - addr := network.NewAddr(n) - store, datadir, err := createTestLocalStorageForID(n.ID(), addr) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(dummyRequestFromPeers, true).New - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - Retrieval: RetrievalDisabled, - Syncing: SyncingAutoSubscribe, - SyncUpdateDelay: 3 * time.Second, - }, nil) - - bucket.Store(bucketKeyRegistry, r) - - cleanup = func() { - os.RemoveAll(datadir) - netStore.Close() - r.Close() - } - - return r, cleanup, nil - -} - -func testSyncingViaGlobalSync(t *testing.T, chunkCount int, nodeCount int) { - sim := simulation.New(simServiceMap) - defer sim.Close() - - log.Info("Initializing test config") - - conf := &synctestConfig{} - //map of discover ID to indexes of chunks expected at that ID - conf.idToChunksMap = make(map[enode.ID][]int) - //map of overlay address to discover ID - conf.addrToIDMap = make(map[string]enode.ID) - //array where the generated chunk hashes will be stored - conf.hashes = make([]storage.Address, 0) - - err := sim.UploadSnapshot(fmt.Sprintf("testing/snapshot_%d.json", nodeCount)) - if err != nil { - t.Fatal(err) - } - - ctx, cancelSimRun := context.WithTimeout(context.Background(), 2*time.Minute) - defer cancelSimRun() - - if _, err := sim.WaitTillHealthy(ctx); err != nil { - t.Fatal(err) - } - - disconnections := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - simulation.NewPeerEventsFilter().Drop(), - ) - - var disconnected atomic.Value - go func() { - for d := range disconnections { - if d.Error != nil { - log.Error("peer drop", "node", d.NodeID, "peer", d.PeerID) - disconnected.Store(true) - } - } - }() - - result := runSim(conf, ctx, sim, chunkCount) - - if result.Error != nil { - t.Fatal(result.Error) - } - if yes, ok := disconnected.Load().(bool); ok && yes { - t.Fatal("disconnect events received") - } - log.Info("Simulation ended") -} - -func runSim(conf *synctestConfig, ctx context.Context, sim *simulation.Simulation, chunkCount int) simulation.Result { - - return sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - nodeIDs := sim.UpNodeIDs() - for _, n := range nodeIDs { - //get the kademlia overlay address from this ID - a := n.Bytes() - //append it to the array of all overlay addresses - conf.addrs = append(conf.addrs, a) - //the proximity calculation is on overlay addr, - //the p2p/simulations check func triggers on enode.ID, - //so we need to know which overlay addr maps to which nodeID - conf.addrToIDMap[string(a)] = n - } - - //get the node at that index - //this is the node selected for upload - node := sim.Net.GetRandomUpNode() - item, ok := sim.NodeItem(node.ID(), bucketKeyStore) - if !ok { - return fmt.Errorf("No localstore") - } - lstore := item.(*storage.LocalStore) - hashes, err := uploadFileToSingleNodeStore(node.ID(), chunkCount, lstore) - if err != nil { - return err - } - for _, h := range hashes { - evt := &simulations.Event{ - Type: EventTypeChunkCreated, - Node: sim.Net.GetNode(node.ID()), - Data: h.String(), - } - sim.Net.Events().Send(evt) - } - conf.hashes = append(conf.hashes, hashes...) - mapKeysToNodes(conf) - - // File retrieval check is repeated until all uploaded files are retrieved from all nodes - // or until the timeout is reached. - var globalStore mock.GlobalStorer - if *useMockStore { - globalStore = mockmem.NewGlobalStore() - } - REPEAT: - for { - for _, id := range nodeIDs { - //for each expected chunk, check if it is in the local store - localChunks := conf.idToChunksMap[id] - for _, ch := range localChunks { - //get the real chunk by the index in the index array - chunk := conf.hashes[ch] - log.Trace(fmt.Sprintf("node has chunk: %s:", chunk)) - //check if the expected chunk is indeed in the localstore - var err error - if *useMockStore { - //use the globalStore if the mockStore should be used; in that case, - //the complete localStore stack is bypassed for getting the chunk - _, err = globalStore.Get(common.BytesToAddress(id.Bytes()), chunk) - } else { - //use the actual localstore - item, ok := sim.NodeItem(id, bucketKeyStore) - if !ok { - return fmt.Errorf("Error accessing localstore") - } - lstore := item.(*storage.LocalStore) - _, err = lstore.Get(ctx, chunk) - } - if err != nil { - log.Debug(fmt.Sprintf("Chunk %s NOT found for id %s", chunk, id)) - // Do not get crazy with logging the warn message - time.Sleep(500 * time.Millisecond) - continue REPEAT - } - evt := &simulations.Event{ - Type: EventTypeChunkArrived, - Node: sim.Net.GetNode(id), - Data: chunk.String(), - } - sim.Net.Events().Send(evt) - log.Debug(fmt.Sprintf("Chunk %s IS FOUND for id %s", chunk, id)) - } - } - return nil - } - }) -} - -//map chunk keys to addresses which are responsible -func mapKeysToNodes(conf *synctestConfig) { - nodemap := make(map[string][]int) - //build a pot for chunk hashes - np := pot.NewPot(nil, 0) - indexmap := make(map[string]int) - for i, a := range conf.addrs { - indexmap[string(a)] = i - np, _, _ = pot.Add(np, a, pof) - } - - ppmap := network.NewPeerPotMap(network.NewKadParams().NeighbourhoodSize, conf.addrs) - - //for each address, run EachNeighbour on the chunk hashes pot to identify closest nodes - log.Trace(fmt.Sprintf("Generated hash chunk(s): %v", conf.hashes)) - for i := 0; i < len(conf.hashes); i++ { - var a []byte - np.EachNeighbour([]byte(conf.hashes[i]), pof, func(val pot.Val, po int) bool { - // take the first address - a = val.([]byte) - return false - }) - - nns := ppmap[common.Bytes2Hex(a)].NNSet - nns = append(nns, a) - - for _, p := range nns { - nodemap[string(p)] = append(nodemap[string(p)], i) - } - } - for addr, chunks := range nodemap { - //this selects which chunks are expected to be found with the given node - conf.idToChunksMap[conf.addrToIDMap[addr]] = chunks - } - log.Debug(fmt.Sprintf("Map of expected chunks by ID: %v", conf.idToChunksMap)) -} - -//upload a file(chunks) to a single local node store -func uploadFileToSingleNodeStore(id enode.ID, chunkCount int, lstore *storage.LocalStore) ([]storage.Address, error) { - log.Debug(fmt.Sprintf("Uploading to node id: %s", id)) - fileStore := storage.NewFileStore(lstore, storage.NewFileStoreParams()) - size := chunkSize - var rootAddrs []storage.Address - for i := 0; i < chunkCount; i++ { - rk, wait, err := fileStore.Store(context.TODO(), testutil.RandomReader(i, size), int64(size), false) - if err != nil { - return nil, err - } - err = wait(context.TODO()) - if err != nil { - return nil, err - } - rootAddrs = append(rootAddrs, (rk)) - } - - return rootAddrs, nil -} diff --git a/swarm/network/stream/stream.go b/swarm/network/stream/stream.go deleted file mode 100644 index 80bf4e4d5223..000000000000 --- a/swarm/network/stream/stream.go +++ /dev/null @@ -1,931 +0,0 @@ -// Copyright 2018 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 stream - -import ( - "context" - "errors" - "fmt" - "math" - "reflect" - "sync" - "time" - - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/protocols" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/network/stream/intervals" - "github.com/nebulaai/nbai-node/swarm/state" - "github.com/nebulaai/nbai-node/swarm/storage" -) - -const ( - Low uint8 = iota - Mid - High - Top - PriorityQueue = 4 // number of priority queues - Low, Mid, High, Top - PriorityQueueCap = 4096 // queue capacity - HashSize = 32 -) - -// Enumerate options for syncing and retrieval -type SyncingOption int -type RetrievalOption int - -// Syncing options -const ( - // Syncing disabled - SyncingDisabled SyncingOption = iota - // Register the client and the server but not subscribe - SyncingRegisterOnly - // Both client and server funcs are registered, subscribe sent automatically - SyncingAutoSubscribe -) - -const ( - // Retrieval disabled. Used mostly for tests to isolate syncing features (i.e. syncing only) - RetrievalDisabled RetrievalOption = iota - // Only the client side of the retrieve request is registered. - // (light nodes do not serve retrieve requests) - // once the client is registered, subscription to retrieve request stream is always sent - RetrievalClientOnly - // Both client and server funcs are registered, subscribe sent automatically - RetrievalEnabled -) - -// subscriptionFunc is used to determine what to do in order to perform subscriptions -// usually we would start to really subscribe to nodes, but for tests other functionality may be needed -// (see TestRequestPeerSubscriptions in streamer_test.go) -var subscriptionFunc func(r *Registry, p *network.Peer, bin uint8, subs map[enode.ID]map[Stream]struct{}) bool = doRequestSubscription - -// Registry registry for outgoing and incoming streamer constructors -type Registry struct { - addr enode.ID - api *API - skipCheck bool - clientMu sync.RWMutex - serverMu sync.RWMutex - peersMu sync.RWMutex - serverFuncs map[string]func(*Peer, string, bool) (Server, error) - clientFuncs map[string]func(*Peer, string, bool) (Client, error) - peers map[enode.ID]*Peer - delivery *Delivery - intervalsStore state.Store - autoRetrieval bool // automatically subscribe to retrieve request stream - maxPeerServers int - spec *protocols.Spec //this protocol's spec - balance protocols.Balance //implements protocols.Balance, for accounting - prices protocols.Prices //implements protocols.Prices, provides prices to accounting -} - -// RegistryOptions holds optional values for NewRegistry constructor. -type RegistryOptions struct { - SkipCheck bool - Syncing SyncingOption // Defines syncing behavior - Retrieval RetrievalOption // Defines retrieval behavior - SyncUpdateDelay time.Duration - MaxPeerServers int // The limit of servers for each peer in registry -} - -// NewRegistry is Streamer constructor -func NewRegistry(localID enode.ID, delivery *Delivery, syncChunkStore storage.SyncChunkStore, intervalsStore state.Store, options *RegistryOptions, balance protocols.Balance) *Registry { - if options == nil { - options = &RegistryOptions{} - } - if options.SyncUpdateDelay <= 0 { - options.SyncUpdateDelay = 15 * time.Second - } - // check if retrieval has been disabled - retrieval := options.Retrieval != RetrievalDisabled - - streamer := &Registry{ - addr: localID, - skipCheck: options.SkipCheck, - serverFuncs: make(map[string]func(*Peer, string, bool) (Server, error)), - clientFuncs: make(map[string]func(*Peer, string, bool) (Client, error)), - peers: make(map[enode.ID]*Peer), - delivery: delivery, - intervalsStore: intervalsStore, - autoRetrieval: retrieval, - maxPeerServers: options.MaxPeerServers, - balance: balance, - } - - streamer.setupSpec() - - streamer.api = NewAPI(streamer) - delivery.getPeer = streamer.getPeer - - // if retrieval is enabled, register the server func, so that retrieve requests will be served (non-light nodes only) - if options.Retrieval == RetrievalEnabled { - streamer.RegisterServerFunc(swarmChunkServerStreamName, func(_ *Peer, _ string, live bool) (Server, error) { - if !live { - return nil, errors.New("only live retrieval requests supported") - } - return NewSwarmChunkServer(delivery.chunkStore), nil - }) - } - - // if retrieval is not disabled, register the client func (both light nodes and normal nodes can issue retrieve requests) - if options.Retrieval != RetrievalDisabled { - streamer.RegisterClientFunc(swarmChunkServerStreamName, func(p *Peer, t string, live bool) (Client, error) { - return NewSwarmSyncerClient(p, syncChunkStore, NewStream(swarmChunkServerStreamName, t, live)) - }) - } - - // If syncing is not disabled, the syncing functions are registered (both client and server) - if options.Syncing != SyncingDisabled { - RegisterSwarmSyncerServer(streamer, syncChunkStore) - RegisterSwarmSyncerClient(streamer, syncChunkStore) - } - - // if syncing is set to automatically subscribe to the syncing stream, start the subscription process - if options.Syncing == SyncingAutoSubscribe { - // latestIntC function ensures that - // - receiving from the in chan is not blocked by processing inside the for loop - // - the latest int value is delivered to the loop after the processing is done - // In context of NeighbourhoodDepthC: - // after the syncing is done updating inside the loop, we do not need to update on the intermediate - // depth changes, only to the latest one - latestIntC := func(in <-chan int) <-chan int { - out := make(chan int, 1) - - go func() { - defer close(out) - - for i := range in { - select { - case <-out: - default: - } - out <- i - } - }() - - return out - } - - go func() { - // wait for kademlia table to be healthy - time.Sleep(options.SyncUpdateDelay) - - kad := streamer.delivery.kad - depthC := latestIntC(kad.NeighbourhoodDepthC()) - addressBookSizeC := latestIntC(kad.AddrCountC()) - - // initial requests for syncing subscription to peers - streamer.updateSyncing() - - for depth := range depthC { - log.Debug("Kademlia neighbourhood depth change", "depth", depth) - - // Prevent too early sync subscriptions by waiting until there are no - // new peers connecting. Sync streams updating will be done after no - // peers are connected for at least SyncUpdateDelay period. - timer := time.NewTimer(options.SyncUpdateDelay) - // Hard limit to sync update delay, preventing long delays - // on a very dynamic network - maxTimer := time.NewTimer(3 * time.Minute) - loop: - for { - select { - case <-maxTimer.C: - // force syncing update when a hard timeout is reached - log.Trace("Sync subscriptions update on hard timeout") - // request for syncing subscription to new peers - streamer.updateSyncing() - break loop - case <-timer.C: - // start syncing as no new peers has been added to kademlia - // for some time - log.Trace("Sync subscriptions update") - // request for syncing subscription to new peers - streamer.updateSyncing() - break loop - case size := <-addressBookSizeC: - log.Trace("Kademlia address book size changed on depth change", "size", size) - // new peers has been added to kademlia, - // reset the timer to prevent early sync subscriptions - if !timer.Stop() { - <-timer.C - } - timer.Reset(options.SyncUpdateDelay) - } - } - timer.Stop() - maxTimer.Stop() - } - }() - } - - return streamer -} - -// This is an accounted protocol, therefore we need to provide a pricing Hook to the spec -// For simulations to be able to run multiple nodes and not override the hook's balance, -// we need to construct a spec instance per node instance -func (r *Registry) setupSpec() { - // first create the "bare" spec - r.createSpec() - // now create the pricing object - r.createPriceOracle() - // if balance is nil, this node has been started without swap support (swapEnabled flag is false) - if r.balance != nil && !reflect.ValueOf(r.balance).IsNil() { - // swap is enabled, so setup the hook - r.spec.Hook = protocols.NewAccounting(r.balance, r.prices) - } -} - -// RegisterClient registers an incoming streamer constructor -func (r *Registry) RegisterClientFunc(stream string, f func(*Peer, string, bool) (Client, error)) { - r.clientMu.Lock() - defer r.clientMu.Unlock() - - r.clientFuncs[stream] = f -} - -// RegisterServer registers an outgoing streamer constructor -func (r *Registry) RegisterServerFunc(stream string, f func(*Peer, string, bool) (Server, error)) { - r.serverMu.Lock() - defer r.serverMu.Unlock() - - r.serverFuncs[stream] = f -} - -// GetClient accessor for incoming streamer constructors -func (r *Registry) GetClientFunc(stream string) (func(*Peer, string, bool) (Client, error), error) { - r.clientMu.RLock() - defer r.clientMu.RUnlock() - - f := r.clientFuncs[stream] - if f == nil { - return nil, fmt.Errorf("stream %v not registered", stream) - } - return f, nil -} - -// GetServer accessor for incoming streamer constructors -func (r *Registry) GetServerFunc(stream string) (func(*Peer, string, bool) (Server, error), error) { - r.serverMu.RLock() - defer r.serverMu.RUnlock() - - f := r.serverFuncs[stream] - if f == nil { - return nil, fmt.Errorf("stream %v not registered", stream) - } - return f, nil -} - -func (r *Registry) RequestSubscription(peerId enode.ID, s Stream, h *Range, prio uint8) error { - // check if the stream is registered - if _, err := r.GetServerFunc(s.Name); err != nil { - return err - } - - peer := r.getPeer(peerId) - if peer == nil { - return fmt.Errorf("peer not found %v", peerId) - } - - if _, err := peer.getServer(s); err != nil { - if e, ok := err.(*notFoundError); ok && e.t == "server" { - // request subscription only if the server for this stream is not created - log.Debug("RequestSubscription ", "peer", peerId, "stream", s, "history", h) - return peer.Send(context.TODO(), &RequestSubscriptionMsg{ - Stream: s, - History: h, - Priority: prio, - }) - } - return err - } - log.Trace("RequestSubscription: already subscribed", "peer", peerId, "stream", s, "history", h) - return nil -} - -// Subscribe initiates the streamer -func (r *Registry) Subscribe(peerId enode.ID, s Stream, h *Range, priority uint8) error { - // check if the stream is registered - if _, err := r.GetClientFunc(s.Name); err != nil { - return err - } - - peer := r.getPeer(peerId) - if peer == nil { - return fmt.Errorf("peer not found %v", peerId) - } - - var to uint64 - if !s.Live && h != nil { - to = h.To - } - - err := peer.setClientParams(s, newClientParams(priority, to)) - if err != nil { - return err - } - if s.Live && h != nil { - if err := peer.setClientParams( - getHistoryStream(s), - newClientParams(getHistoryPriority(priority), h.To), - ); err != nil { - return err - } - } - - msg := &SubscribeMsg{ - Stream: s, - History: h, - Priority: priority, - } - log.Debug("Subscribe ", "peer", peerId, "stream", s, "history", h) - - return peer.SendPriority(context.TODO(), msg, priority) -} - -func (r *Registry) Unsubscribe(peerId enode.ID, s Stream) error { - peer := r.getPeer(peerId) - if peer == nil { - return fmt.Errorf("peer not found %v", peerId) - } - - msg := &UnsubscribeMsg{ - Stream: s, - } - log.Debug("Unsubscribe ", "peer", peerId, "stream", s) - - if err := peer.Send(context.TODO(), msg); err != nil { - return err - } - return peer.removeClient(s) -} - -// Quit sends the QuitMsg to the peer to remove the -// stream peer client and terminate the streaming. -func (r *Registry) Quit(peerId enode.ID, s Stream) error { - peer := r.getPeer(peerId) - if peer == nil { - log.Debug("stream quit: peer not found", "peer", peerId, "stream", s) - // if the peer is not found, abort the request - return nil - } - - msg := &QuitMsg{ - Stream: s, - } - log.Debug("Quit ", "peer", peerId, "stream", s) - - return peer.Send(context.TODO(), msg) -} - -func (r *Registry) Close() error { - return r.intervalsStore.Close() -} - -func (r *Registry) getPeer(peerId enode.ID) *Peer { - r.peersMu.RLock() - defer r.peersMu.RUnlock() - - return r.peers[peerId] -} - -func (r *Registry) setPeer(peer *Peer) { - r.peersMu.Lock() - r.peers[peer.ID()] = peer - metrics.GetOrRegisterGauge("registry.peers", nil).Update(int64(len(r.peers))) - r.peersMu.Unlock() -} - -func (r *Registry) deletePeer(peer *Peer) { - r.peersMu.Lock() - delete(r.peers, peer.ID()) - metrics.GetOrRegisterGauge("registry.peers", nil).Update(int64(len(r.peers))) - r.peersMu.Unlock() -} - -func (r *Registry) peersCount() (c int) { - r.peersMu.Lock() - c = len(r.peers) - r.peersMu.Unlock() - return -} - -// Run protocol run function -func (r *Registry) Run(p *network.BzzPeer) error { - sp := NewPeer(p.Peer, r) - r.setPeer(sp) - defer r.deletePeer(sp) - defer close(sp.quit) - defer sp.close() - - if r.autoRetrieval && !p.LightNode { - err := r.Subscribe(p.ID(), NewStream(swarmChunkServerStreamName, "", true), nil, Top) - if err != nil { - return err - } - } - - return sp.Run(sp.HandleMsg) -} - -// updateSyncing subscribes to SYNC streams by iterating over the -// kademlia connections and bins. If there are existing SYNC streams -// and they are no longer required after iteration, request to Quit -// them will be send to appropriate peers. -func (r *Registry) updateSyncing() { - kad := r.delivery.kad - // map of all SYNC streams for all peers - // used at the and of the function to remove servers - // that are not needed anymore - subs := make(map[enode.ID]map[Stream]struct{}) - r.peersMu.RLock() - for id, peer := range r.peers { - peer.serverMu.RLock() - for stream := range peer.servers { - if stream.Name == "SYNC" { - if _, ok := subs[id]; !ok { - subs[id] = make(map[Stream]struct{}) - } - subs[id][stream] = struct{}{} - } - } - peer.serverMu.RUnlock() - } - r.peersMu.RUnlock() - - // start requesting subscriptions from peers - r.requestPeerSubscriptions(kad, subs) - - // remove SYNC servers that do not need to be subscribed - for id, streams := range subs { - if len(streams) == 0 { - continue - } - peer := r.getPeer(id) - if peer == nil { - continue - } - for stream := range streams { - log.Debug("Remove sync server", "peer", id, "stream", stream) - err := r.Quit(peer.ID(), stream) - if err != nil && err != p2p.ErrShuttingDown { - log.Error("quit", "err", err, "peer", peer.ID(), "stream", stream) - } - } - } -} - -// requestPeerSubscriptions calls on each live peer in the kademlia table -// and sends a `RequestSubscription` to peers according to their bin -// and their relationship with kademlia's depth. -// Also check `TestRequestPeerSubscriptions` in order to understand the -// expected behavior. -// The function expects: -// * the kademlia -// * a map of subscriptions -// * the actual function to subscribe -// (in case of the test, it doesn't do real subscriptions) -func (r *Registry) requestPeerSubscriptions(kad *network.Kademlia, subs map[enode.ID]map[Stream]struct{}) { - - var startPo int - var endPo int - var ok bool - - // kademlia's depth - kadDepth := kad.NeighbourhoodDepth() - // request subscriptions for all nodes and bins - // nil as base takes the node's base; we need to pass 255 as `EachConn` runs - // from deepest bins backwards - kad.EachConn(nil, 255, func(p *network.Peer, po int) bool { - //if the peer's bin is shallower than the kademlia depth, - //only the peer's bin should be subscribed - if po < kadDepth { - startPo = po - endPo = po - } else { - //if the peer's bin is equal or deeper than the kademlia depth, - //each bin from the depth up to k.MaxProxDisplay should be subscribed - startPo = kadDepth - endPo = kad.MaxProxDisplay - } - - for bin := startPo; bin <= endPo; bin++ { - //do the actual subscription - ok = subscriptionFunc(r, p, uint8(bin), subs) - } - return ok - }) -} - -// doRequestSubscription sends the actual RequestSubscription to the peer -func doRequestSubscription(r *Registry, p *network.Peer, bin uint8, subs map[enode.ID]map[Stream]struct{}) bool { - log.Debug("Requesting subscription by registry:", "registry", r.addr, "peer", p.ID(), "bin", bin) - // bin is always less then 256 and it is safe to convert it to type uint8 - stream := NewStream("SYNC", FormatSyncBinKey(bin), true) - if streams, ok := subs[p.ID()]; ok { - // delete live and history streams from the map, so that it won't be removed with a Quit request - delete(streams, stream) - delete(streams, getHistoryStream(stream)) - } - err := r.RequestSubscription(p.ID(), stream, NewRange(0, 0), High) - if err != nil { - log.Debug("Request subscription", "err", err, "peer", p.ID(), "stream", stream) - return false - } - return true -} - -func (r *Registry) runProtocol(p *p2p.Peer, rw p2p.MsgReadWriter) error { - peer := protocols.NewPeer(p, rw, r.spec) - bp := network.NewBzzPeer(peer) - np := network.NewPeer(bp, r.delivery.kad) - r.delivery.kad.On(np) - defer r.delivery.kad.Off(np) - return r.Run(bp) -} - -// HandleMsg is the message handler that delegates incoming messages -func (p *Peer) HandleMsg(ctx context.Context, msg interface{}) error { - switch msg := msg.(type) { - - case *SubscribeMsg: - return p.handleSubscribeMsg(ctx, msg) - - case *SubscribeErrorMsg: - return p.handleSubscribeErrorMsg(msg) - - case *UnsubscribeMsg: - return p.handleUnsubscribeMsg(msg) - - case *OfferedHashesMsg: - return p.handleOfferedHashesMsg(ctx, msg) - - case *TakeoverProofMsg: - return p.handleTakeoverProofMsg(ctx, msg) - - case *WantedHashesMsg: - return p.handleWantedHashesMsg(ctx, msg) - - case *ChunkDeliveryMsgRetrieval: - // handling chunk delivery is the same for retrieval and syncing, so let's cast the msg - return p.streamer.delivery.handleChunkDeliveryMsg(ctx, p, ((*ChunkDeliveryMsg)(msg))) - - case *ChunkDeliveryMsgSyncing: - // handling chunk delivery is the same for retrieval and syncing, so let's cast the msg - return p.streamer.delivery.handleChunkDeliveryMsg(ctx, p, ((*ChunkDeliveryMsg)(msg))) - - case *RetrieveRequestMsg: - return p.streamer.delivery.handleRetrieveRequestMsg(ctx, p, msg) - - case *RequestSubscriptionMsg: - return p.handleRequestSubscription(ctx, msg) - - case *QuitMsg: - return p.handleQuitMsg(msg) - - default: - return fmt.Errorf("unknown message type: %T", msg) - } -} - -type server struct { - Server - stream Stream - priority uint8 - currentBatch []byte - sessionIndex uint64 -} - -// setNextBatch adjusts passed interval based on session index and whether -// stream is live or history. It calls Server SetNextBatch with adjusted -// interval and returns batch hashes and their interval. -func (s *server) setNextBatch(from, to uint64) ([]byte, uint64, uint64, *HandoverProof, error) { - if s.stream.Live { - if from == 0 { - from = s.sessionIndex - } - if to <= from || from >= s.sessionIndex { - to = math.MaxUint64 - } - } else { - if (to < from && to != 0) || from > s.sessionIndex { - return nil, 0, 0, nil, nil - } - if to == 0 || to > s.sessionIndex { - to = s.sessionIndex - } - } - return s.SetNextBatch(from, to) -} - -// Server interface for outgoing peer Streamer -type Server interface { - // SessionIndex is called when a server is initialized - // to get the current cursor state of the stream data. - // Based on this index, live and history stream intervals - // will be adjusted before calling SetNextBatch. - SessionIndex() (uint64, error) - SetNextBatch(uint64, uint64) (hashes []byte, from uint64, to uint64, proof *HandoverProof, err error) - GetData(context.Context, []byte) ([]byte, error) - Close() -} - -type client struct { - Client - stream Stream - priority uint8 - sessionAt uint64 - to uint64 - next chan error - quit chan struct{} - - intervalsKey string - intervalsStore state.Store -} - -func peerStreamIntervalsKey(p *Peer, s Stream) string { - return p.ID().String() + s.String() -} - -func (c client) AddInterval(start, end uint64) (err error) { - i := &intervals.Intervals{} - err = c.intervalsStore.Get(c.intervalsKey, i) - if err != nil { - return err - } - i.Add(start, end) - return c.intervalsStore.Put(c.intervalsKey, i) -} - -func (c client) NextInterval() (start, end uint64, err error) { - i := &intervals.Intervals{} - err = c.intervalsStore.Get(c.intervalsKey, i) - if err != nil { - return 0, 0, err - } - start, end = i.Next() - return start, end, nil -} - -// Client interface for incoming peer Streamer -type Client interface { - NeedData(context.Context, []byte) func(context.Context) error - BatchDone(Stream, uint64, []byte, []byte) func() (*TakeoverProof, error) - Close() -} - -func (c *client) nextBatch(from uint64) (nextFrom uint64, nextTo uint64) { - if c.to > 0 && from >= c.to { - return 0, 0 - } - if c.stream.Live { - return from, 0 - } else if from >= c.sessionAt { - if c.to > 0 { - return from, c.to - } - return from, math.MaxUint64 - } - nextFrom, nextTo, err := c.NextInterval() - if err != nil { - log.Error("next intervals", "stream", c.stream) - return - } - if nextTo > c.to { - nextTo = c.to - } - if nextTo == 0 { - nextTo = c.sessionAt - } - return -} - -func (c *client) batchDone(p *Peer, req *OfferedHashesMsg, hashes []byte) error { - if tf := c.BatchDone(req.Stream, req.From, hashes, req.Root); tf != nil { - tp, err := tf() - if err != nil { - return err - } - if err := p.SendPriority(context.TODO(), tp, c.priority); err != nil { - return err - } - if c.to > 0 && tp.Takeover.End >= c.to { - return p.streamer.Unsubscribe(p.Peer.ID(), req.Stream) - } - return nil - } - // TODO: make a test case for testing if the interval is added when the batch is done - if err := c.AddInterval(req.From, req.To); err != nil { - return err - } - return nil -} - -func (c *client) close() { - select { - case <-c.quit: - default: - close(c.quit) - } - c.Close() -} - -// clientParams store parameters for the new client -// between a subscription and initial offered hashes request handling. -type clientParams struct { - priority uint8 - to uint64 - // signal when the client is created - clientCreatedC chan struct{} -} - -func newClientParams(priority uint8, to uint64) *clientParams { - return &clientParams{ - priority: priority, - to: to, - clientCreatedC: make(chan struct{}), - } -} - -func (c *clientParams) waitClient(ctx context.Context) error { - select { - case <-ctx.Done(): - return ctx.Err() - case <-c.clientCreatedC: - return nil - } -} - -func (c *clientParams) clientCreated() { - close(c.clientCreatedC) -} - -// GetSpec returns the streamer spec to callers -// This used to be a global variable but for simulations with -// multiple nodes its fields (notably the Hook) would be overwritten -func (r *Registry) GetSpec() *protocols.Spec { - return r.spec -} - -func (r *Registry) createSpec() { - // Spec is the spec of the streamer protocol - var spec = &protocols.Spec{ - Name: "stream", - Version: 8, - MaxMsgSize: 10 * 1024 * 1024, - Messages: []interface{}{ - UnsubscribeMsg{}, - OfferedHashesMsg{}, - WantedHashesMsg{}, - TakeoverProofMsg{}, - SubscribeMsg{}, - RetrieveRequestMsg{}, - ChunkDeliveryMsgRetrieval{}, - SubscribeErrorMsg{}, - RequestSubscriptionMsg{}, - QuitMsg{}, - ChunkDeliveryMsgSyncing{}, - }, - } - r.spec = spec -} - -// An accountable message needs some meta information attached to it -// in order to evaluate the correct price -type StreamerPrices struct { - priceMatrix map[reflect.Type]*protocols.Price - registry *Registry -} - -// Price implements the accounting interface and returns the price for a specific message -func (sp *StreamerPrices) Price(msg interface{}) *protocols.Price { - t := reflect.TypeOf(msg).Elem() - return sp.priceMatrix[t] -} - -// Instead of hardcoding the price, get it -// through a function - it could be quite complex in the future -func (sp *StreamerPrices) getRetrieveRequestMsgPrice() uint64 { - return uint64(1) -} - -// Instead of hardcoding the price, get it -// through a function - it could be quite complex in the future -func (sp *StreamerPrices) getChunkDeliveryMsgRetrievalPrice() uint64 { - return uint64(1) -} - -// createPriceOracle sets up a matrix which can be queried to get -// the price for a message via the Price method -func (r *Registry) createPriceOracle() { - sp := &StreamerPrices{ - registry: r, - } - sp.priceMatrix = map[reflect.Type]*protocols.Price{ - reflect.TypeOf(ChunkDeliveryMsgRetrieval{}): { - Value: sp.getChunkDeliveryMsgRetrievalPrice(), // arbitrary price for now - PerByte: true, - Payer: protocols.Receiver, - }, - reflect.TypeOf(RetrieveRequestMsg{}): { - Value: sp.getRetrieveRequestMsgPrice(), // arbitrary price for now - PerByte: false, - Payer: protocols.Sender, - }, - } - r.prices = sp -} - -func (r *Registry) Protocols() []p2p.Protocol { - return []p2p.Protocol{ - { - Name: r.spec.Name, - Version: r.spec.Version, - Length: r.spec.Length(), - Run: r.runProtocol, - }, - } -} - -func (r *Registry) APIs() []rpc.API { - return []rpc.API{ - { - Namespace: "stream", - Version: "3.0", - Service: r.api, - Public: true, - }, - } -} - -func (r *Registry) Start(server *p2p.Server) error { - log.Info("Streamer started") - return nil -} - -func (r *Registry) Stop() error { - return nil -} - -type Range struct { - From, To uint64 -} - -func NewRange(from, to uint64) *Range { - return &Range{ - From: from, - To: to, - } -} - -func (r *Range) String() string { - return fmt.Sprintf("%v-%v", r.From, r.To) -} - -func getHistoryPriority(priority uint8) uint8 { - if priority == 0 { - return 0 - } - return priority - 1 -} - -func getHistoryStream(s Stream) Stream { - return NewStream(s.Name, s.Key, false) -} - -type API struct { - streamer *Registry -} - -func NewAPI(r *Registry) *API { - return &API{ - streamer: r, - } -} - -func (api *API) SubscribeStream(peerId enode.ID, s Stream, history *Range, priority uint8) error { - return api.streamer.Subscribe(peerId, s, history, priority) -} - -func (api *API) UnsubscribeStream(peerId enode.ID, s Stream) error { - return api.streamer.Unsubscribe(peerId, s) -} diff --git a/swarm/network/stream/streamer_test.go b/swarm/network/stream/streamer_test.go deleted file mode 100644 index 97a82b54240e..000000000000 --- a/swarm/network/stream/streamer_test.go +++ /dev/null @@ -1,1116 +0,0 @@ -// Copyright 2018 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 stream - -import ( - "bytes" - "context" - "errors" - "fmt" - "strconv" - "testing" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p/enode" - p2ptest "github.com/nebulaai/nbai-node/p2p/testing" - "github.com/nebulaai/nbai-node/swarm/network" - "golang.org/x/crypto/sha3" -) - -func TestStreamerSubscribe(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - stream := NewStream("foo", "", true) - err = streamer.Subscribe(tester.Nodes[0].ID(), stream, NewRange(0, 0), Top) - if err == nil || err.Error() != "stream foo not registered" { - t.Fatalf("Expected error %v, got %v", "stream foo not registered", err) - } -} - -func TestStreamerRequestSubscription(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - stream := NewStream("foo", "", false) - err = streamer.RequestSubscription(tester.Nodes[0].ID(), stream, &Range{}, Top) - if err == nil || err.Error() != "stream foo not registered" { - t.Fatalf("Expected error %v, got %v", "stream foo not registered", err) - } -} - -var ( - hash0 = sha3.Sum256([]byte{0}) - hash1 = sha3.Sum256([]byte{1}) - hash2 = sha3.Sum256([]byte{2}) - hashesTmp = append(hash0[:], hash1[:]...) - hashes = append(hashesTmp, hash2[:]...) - corruptHashes = append(hashes[:40]) -) - -type testClient struct { - t string - wait0 chan bool - wait2 chan bool - batchDone chan bool - receivedHashes map[string][]byte -} - -func newTestClient(t string) *testClient { - return &testClient{ - t: t, - wait0: make(chan bool), - wait2: make(chan bool), - batchDone: make(chan bool), - receivedHashes: make(map[string][]byte), - } -} - -func (self *testClient) NeedData(ctx context.Context, hash []byte) func(context.Context) error { - self.receivedHashes[string(hash)] = hash - if bytes.Equal(hash, hash0[:]) { - return func(context.Context) error { - <-self.wait0 - return nil - } - } else if bytes.Equal(hash, hash2[:]) { - return func(context.Context) error { - <-self.wait2 - return nil - } - } - return nil -} - -func (self *testClient) BatchDone(Stream, uint64, []byte, []byte) func() (*TakeoverProof, error) { - close(self.batchDone) - return nil -} - -func (self *testClient) Close() {} - -type testServer struct { - t string - sessionIndex uint64 -} - -func newTestServer(t string, sessionIndex uint64) *testServer { - return &testServer{ - t: t, - sessionIndex: sessionIndex, - } -} - -func (s *testServer) SessionIndex() (uint64, error) { - return s.sessionIndex, nil -} - -func (self *testServer) SetNextBatch(from uint64, to uint64) ([]byte, uint64, uint64, *HandoverProof, error) { - return make([]byte, HashSize), from + 1, to + 1, nil, nil -} - -func (self *testServer) GetData(context.Context, []byte) ([]byte, error) { - return nil, nil -} - -func (self *testServer) Close() { -} - -func TestStreamerDownstreamSubscribeUnsubscribeMsgExchange(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) { - return newTestClient(t), nil - }) - - node := tester.Nodes[0] - - stream := NewStream("foo", "", true) - err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - err = tester.TestExchanges( - p2ptest.Exchange{ - Label: "Subscribe message", - Expects: []p2ptest.Expect{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - }, - // trigger OfferedHashesMsg to actually create the client - p2ptest.Exchange{ - Label: "OfferedHashes message", - Triggers: []p2ptest.Trigger{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: hashes, - From: 5, - To: 8, - Stream: stream, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 2, - Msg: &WantedHashesMsg{ - Stream: stream, - Want: []byte{5}, - From: 9, - To: 0, - }, - Peer: node.ID(), - }, - }, - }, - ) - if err != nil { - t.Fatal(err) - } - - err = streamer.Unsubscribe(node.ID(), stream) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Unsubscribe message", - Expects: []p2ptest.Expect{ - { - Code: 0, - Msg: &UnsubscribeMsg{ - Stream: stream, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} - -func TestStreamerUpstreamSubscribeUnsubscribeMsgExchange(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - stream := NewStream("foo", "", false) - - streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { - return newTestServer(t, 10), nil - }) - - node := tester.Nodes[0] - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: stream, - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: make([]byte, HashSize), - From: 6, - To: 9, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "unsubscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 0, - Msg: &UnsubscribeMsg{ - Stream: stream, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} - -func TestStreamerUpstreamSubscribeUnsubscribeMsgExchangeLive(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - stream := NewStream("foo", "", true) - - streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { - return newTestServer(t, 0), nil - }) - - node := tester.Nodes[0] - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: stream, - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: make([]byte, HashSize), - From: 1, - To: 0, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "unsubscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 0, - Msg: &UnsubscribeMsg{ - Stream: stream, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} - -func TestStreamerUpstreamSubscribeErrorMsgExchange(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { - return newTestServer(t, 0), nil - }) - - stream := NewStream("bar", "", true) - - node := tester.Nodes[0] - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 7, - Msg: &SubscribeErrorMsg{ - Error: "stream bar not registered", - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} - -func TestStreamerUpstreamSubscribeLiveAndHistory(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - stream := NewStream("foo", "", true) - - streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { - return newTestServer(t, 10), nil - }) - - node := tester.Nodes[0] - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: NewStream("foo", "", false), - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: make([]byte, HashSize), - From: 6, - To: 9, - }, - Peer: node.ID(), - }, - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: stream, - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - From: 11, - To: 0, - Hashes: make([]byte, HashSize), - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} - -func TestStreamerDownstreamCorruptHashesMsgExchange(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - stream := NewStream("foo", "", true) - - var tc *testClient - - streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) { - tc = newTestClient(t) - return tc, nil - }) - - node := tester.Nodes[0] - - err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Expects: []p2ptest.Expect{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - }, - p2ptest.Exchange{ - Label: "Corrupt offered hash message", - Triggers: []p2ptest.Trigger{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: corruptHashes, - From: 5, - To: 8, - Stream: stream, - }, - Peer: node.ID(), - }, - }, - }) - if err != nil { - t.Fatal(err) - } - - expectedError := errors.New("Message handler error: (msg code 1): error invalid hashes length (len: 40)") - if err := tester.TestDisconnected(&p2ptest.Disconnect{Peer: node.ID(), Error: expectedError}); err != nil { - t.Fatal(err) - } -} - -func TestStreamerDownstreamOfferedHashesMsgExchange(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - stream := NewStream("foo", "", true) - - var tc *testClient - - streamer.RegisterClientFunc("foo", func(p *Peer, t string, live bool) (Client, error) { - tc = newTestClient(t) - return tc, nil - }) - - node := tester.Nodes[0] - - err = streamer.Subscribe(node.ID(), stream, NewRange(5, 8), Top) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Expects: []p2ptest.Expect{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - }, - p2ptest.Exchange{ - Label: "WantedHashes message", - Triggers: []p2ptest.Trigger{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: hashes, - From: 5, - To: 8, - Stream: stream, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 2, - Msg: &WantedHashesMsg{ - Stream: stream, - Want: []byte{5}, - From: 9, - To: 0, - }, - Peer: node.ID(), - }, - }, - }) - if err != nil { - t.Fatal(err) - } - - if len(tc.receivedHashes) != 3 { - t.Fatalf("Expected number of received hashes %v, got %v", 3, len(tc.receivedHashes)) - } - - close(tc.wait0) - - timeout := time.NewTimer(100 * time.Millisecond) - defer timeout.Stop() - - select { - case <-tc.batchDone: - t.Fatal("batch done early") - case <-timeout.C: - } - - close(tc.wait2) - - timeout2 := time.NewTimer(10000 * time.Millisecond) - defer timeout2.Stop() - - select { - case <-tc.batchDone: - case <-timeout2.C: - t.Fatal("timeout waiting batchdone call") - } - -} - -func TestStreamerRequestSubscriptionQuitMsgExchange(t *testing.T) { - tester, streamer, _, teardown, err := newStreamerTester(t, nil) - defer teardown() - if err != nil { - t.Fatal(err) - } - - streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { - return newTestServer(t, 10), nil - }) - - node := tester.Nodes[0] - - stream := NewStream("foo", "", true) - err = streamer.RequestSubscription(node.ID(), stream, NewRange(5, 8), Top) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - err = tester.TestExchanges( - p2ptest.Exchange{ - Label: "RequestSubscription message", - Expects: []p2ptest.Expect{ - { - Code: 8, - Msg: &RequestSubscriptionMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - }, - p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - History: NewRange(5, 8), - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: NewStream("foo", "", false), - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: make([]byte, HashSize), - From: 6, - To: 9, - }, - Peer: node.ID(), - }, - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: stream, - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - From: 11, - To: 0, - Hashes: make([]byte, HashSize), - }, - Peer: node.ID(), - }, - }, - }, - ) - if err != nil { - t.Fatal(err) - } - - err = streamer.Quit(node.ID(), stream) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Quit message", - Expects: []p2ptest.Expect{ - { - Code: 9, - Msg: &QuitMsg{ - Stream: stream, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - - historyStream := getHistoryStream(stream) - - err = streamer.Quit(node.ID(), historyStream) - if err != nil { - t.Fatalf("Expected no error, got %v", err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Quit message", - Expects: []p2ptest.Expect{ - { - Code: 9, - Msg: &QuitMsg{ - Stream: historyStream, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } -} - -// TestMaxPeerServersWithUnsubscribe creates a registry with a limited -// number of stream servers, and performs a test with subscriptions and -// unsubscriptions, checking if unsubscriptions will remove streams, -// leaving place for new streams. -func TestMaxPeerServersWithUnsubscribe(t *testing.T) { - var maxPeerServers = 6 - tester, streamer, _, teardown, err := newStreamerTester(t, &RegistryOptions{ - Retrieval: RetrievalDisabled, - Syncing: SyncingDisabled, - MaxPeerServers: maxPeerServers, - }) - defer teardown() - if err != nil { - t.Fatal(err) - } - - streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { - return newTestServer(t, 0), nil - }) - - node := tester.Nodes[0] - - for i := 0; i < maxPeerServers+10; i++ { - stream := NewStream("foo", strconv.Itoa(i), true) - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: stream, - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: make([]byte, HashSize), - From: 1, - To: 0, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "unsubscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 0, - Msg: &UnsubscribeMsg{ - Stream: stream, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - } -} - -// TestMaxPeerServersWithoutUnsubscribe creates a registry with a limited -// number of stream servers, and performs subscriptions to detect subscriptions -// error message exchange. -func TestMaxPeerServersWithoutUnsubscribe(t *testing.T) { - var maxPeerServers = 6 - tester, streamer, _, teardown, err := newStreamerTester(t, &RegistryOptions{ - MaxPeerServers: maxPeerServers, - }) - defer teardown() - if err != nil { - t.Fatal(err) - } - - streamer.RegisterServerFunc("foo", func(p *Peer, t string, live bool) (Server, error) { - return newTestServer(t, 0), nil - }) - - node := tester.Nodes[0] - - for i := 0; i < maxPeerServers+10; i++ { - stream := NewStream("foo", strconv.Itoa(i), true) - - if i >= maxPeerServers { - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 7, - Msg: &SubscribeErrorMsg{ - Error: ErrMaxPeerServers.Error(), - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - continue - } - - err = tester.TestExchanges(p2ptest.Exchange{ - Label: "Subscribe message", - Triggers: []p2ptest.Trigger{ - { - Code: 4, - Msg: &SubscribeMsg{ - Stream: stream, - Priority: Top, - }, - Peer: node.ID(), - }, - }, - Expects: []p2ptest.Expect{ - { - Code: 1, - Msg: &OfferedHashesMsg{ - Stream: stream, - HandoverProof: &HandoverProof{ - Handover: &Handover{}, - }, - Hashes: make([]byte, HashSize), - From: 1, - To: 0, - }, - Peer: node.ID(), - }, - }, - }) - - if err != nil { - t.Fatal(err) - } - } -} - -//TestHasPriceImplementation is to check that the Registry has a -//`Price` interface implementation -func TestHasPriceImplementation(t *testing.T) { - _, r, _, teardown, err := newStreamerTester(t, &RegistryOptions{ - Retrieval: RetrievalDisabled, - Syncing: SyncingDisabled, - }) - defer teardown() - if err != nil { - t.Fatal(err) - } - - if r.prices == nil { - t.Fatal("No prices implementation available for the stream protocol") - } - - pricesInstance, ok := r.prices.(*StreamerPrices) - if !ok { - t.Fatal("`Registry` does not have the expected Prices instance") - } - price := pricesInstance.Price(&ChunkDeliveryMsgRetrieval{}) - if price == nil || price.Value == 0 || price.Value != pricesInstance.getChunkDeliveryMsgRetrievalPrice() { - t.Fatal("No prices set for chunk delivery msg") - } - - price = pricesInstance.Price(&RetrieveRequestMsg{}) - if price == nil || price.Value == 0 || price.Value != pricesInstance.getRetrieveRequestMsgPrice() { - t.Fatal("No prices set for chunk delivery msg") - } -} - -/* -TestRequestPeerSubscriptions is a unit test for stream's pull sync subscriptions. - -The test does: - * assign each connected peer to a bin map - * build up a known kademlia in advance - * run the EachConn function, which returns supposed subscription bins - * store all supposed bins per peer in a map - * check that all peers have the expected subscriptions - -This kad table and its peers are copied from network.TestKademliaCase1, -it represents an edge case but for the purpose of testing the -syncing subscriptions it is just fine. - -Addresses used in this test are discovered as part of the simulation network -in higher level tests for streaming. They were generated randomly. - -The resulting kademlia looks like this: -========================================================================= -Fri Dec 21 20:02:39 UTC 2018 KΛÐΞMLIΛ hive: queen's address: 7efef1 -population: 12 (12), MinProxBinSize: 2, MinBinSize: 2, MaxBinSize: 4 -000 2 8196 835f | 2 8196 (0) 835f (0) -001 2 2690 28f0 | 2 2690 (0) 28f0 (0) -002 2 4d72 4a45 | 2 4d72 (0) 4a45 (0) -003 1 646e | 1 646e (0) -004 3 769c 76d1 7656 | 3 769c (0) 76d1 (0) 7656 (0) -============ DEPTH: 5 ========================================== -005 1 7a48 | 1 7a48 (0) -006 1 7cbd | 1 7cbd (0) -007 0 | 0 -008 0 | 0 -009 0 | 0 -010 0 | 0 -011 0 | 0 -012 0 | 0 -013 0 | 0 -014 0 | 0 -015 0 | 0 -========================================================================= -*/ -func TestRequestPeerSubscriptions(t *testing.T) { - // the pivot address; this is the actual kademlia node - pivotAddr := "7efef1c41d77f843ad167be95f6660567eb8a4a59f39240000cce2e0d65baf8e" - - // a map of bin number to addresses from the given kademlia - binMap := make(map[int][]string) - binMap[0] = []string{ - "835fbbf1d16ba7347b6e2fc552d6e982148d29c624ea20383850df3c810fa8fc", - "81968a2d8fb39114342ee1da85254ec51e0608d7f0f6997c2a8354c260a71009", - } - binMap[1] = []string{ - "28f0bc1b44658548d6e05dd16d4c2fe77f1da5d48b6774bc4263b045725d0c19", - "2690a910c33ee37b91eb6c4e0731d1d345e2dc3b46d308503a6e85bbc242c69e", - } - binMap[2] = []string{ - "4a45f1fc63e1a9cb9dfa44c98da2f3d20c2923e5d75ff60b2db9d1bdb0c54d51", - "4d72a04ddeb851a68cd197ef9a92a3e2ff01fbbff638e64929dd1a9c2e150112", - } - binMap[3] = []string{ - "646e9540c84f6a2f9cf6585d45a4c219573b4fd1b64a3c9a1386fc5cf98c0d4d", - } - binMap[4] = []string{ - "7656caccdc79cd8d7ce66d415cc96a718e8271c62fb35746bfc2b49faf3eebf3", - "76d1e83c71ca246d042e37ff1db181f2776265fbcfdc890ce230bfa617c9c2f0", - "769ce86aa90b518b7ed382f9fdacfbed93574e18dc98fe6c342e4f9f409c2d5a", - } - binMap[5] = []string{ - "7a48f75f8ca60487ae42d6f92b785581b40b91f2da551ae73d5eae46640e02e8", - } - binMap[6] = []string{ - "7cbd42350bde8e18ae5b955b5450f8e2cef3419f92fbf5598160c60fd78619f0", - } - - // create the pivot's kademlia - addr := common.FromHex(pivotAddr) - k := network.NewKademlia(addr, network.NewKadParams()) - - // construct the peers and the kademlia - for _, binaddrs := range binMap { - for _, a := range binaddrs { - addr := common.FromHex(a) - k.On(network.NewPeer(&network.BzzPeer{BzzAddr: &network.BzzAddr{OAddr: addr}}, k)) - } - } - - // TODO: check kad table is same - // currently k.String() prints date so it will never be the same :) - // --> implement JSON representation of kad table - log.Debug(k.String()) - - // simulate that we would do subscriptions: just store the bin numbers - fakeSubscriptions := make(map[string][]int) - //after the test, we need to reset the subscriptionFunc to the default - defer func() { subscriptionFunc = doRequestSubscription }() - // define the function which should run for each connection - // instead of doing real subscriptions, we just store the bin numbers - subscriptionFunc = func(r *Registry, p *network.Peer, bin uint8, subs map[enode.ID]map[Stream]struct{}) bool { - // get the peer ID - peerstr := fmt.Sprintf("%x", p.Over()) - // create the array of bins per peer - if _, ok := fakeSubscriptions[peerstr]; !ok { - fakeSubscriptions[peerstr] = make([]int, 0) - } - // store the (fake) bin subscription - log.Debug(fmt.Sprintf("Adding fake subscription for peer %s with bin %d", peerstr, bin)) - fakeSubscriptions[peerstr] = append(fakeSubscriptions[peerstr], int(bin)) - return true - } - // create just a simple Registry object in order to be able to call... - r := &Registry{} - r.requestPeerSubscriptions(k, nil) - // calculate the kademlia depth - kdepth := k.NeighbourhoodDepth() - - // now, check that all peers have the expected (fake) subscriptions - // iterate the bin map - for bin, peers := range binMap { - // for every peer... - for _, peer := range peers { - // ...get its (fake) subscriptions - fakeSubsForPeer := fakeSubscriptions[peer] - // if the peer's bin is shallower than the kademlia depth... - if bin < kdepth { - // (iterate all (fake) subscriptions) - for _, subbin := range fakeSubsForPeer { - // ...only the peer's bin should be "subscribed" - // (and thus have only one subscription) - if subbin != bin || len(fakeSubsForPeer) != 1 { - t.Fatalf("Did not get expected subscription for bin < depth; bin of peer %s: %d, subscription: %d", peer, bin, subbin) - } - } - } else { //if the peer's bin is equal or higher than the kademlia depth... - // (iterate all (fake) subscriptions) - for i, subbin := range fakeSubsForPeer { - // ...each bin from the peer's bin number up to k.MaxProxDisplay should be "subscribed" - // as we start from depth we can use the iteration index to check - if subbin != i+kdepth { - t.Fatalf("Did not get expected subscription for bin > depth; bin of peer %s: %d, subscription: %d", peer, bin, subbin) - } - // the last "subscription" should be k.MaxProxDisplay - if i == len(fakeSubsForPeer)-1 && subbin != k.MaxProxDisplay { - t.Fatalf("Expected last subscription to be: %d, but is: %d", k.MaxProxDisplay, subbin) - } - } - } - } - } - - // print some output - for p, subs := range fakeSubscriptions { - log.Debug(fmt.Sprintf("Peer %s has the following fake subscriptions: ", p)) - for _, bin := range subs { - log.Debug(fmt.Sprintf("%d,", bin)) - } - } -} diff --git a/swarm/network/stream/syncer.go b/swarm/network/stream/syncer.go deleted file mode 100644 index 131f58afea4a..000000000000 --- a/swarm/network/stream/syncer.go +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright 2018 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 stream - -import ( - "context" - "strconv" - "time" - - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/storage" -) - -const ( - BatchSize = 128 -) - -// SwarmSyncerServer implements an Server for history syncing on bins -// offered streams: -// * live request delivery with or without checkback -// * (live/non-live historical) chunk syncing per proximity bin -type SwarmSyncerServer struct { - po uint8 - store storage.SyncChunkStore - quit chan struct{} -} - -// NewSwarmSyncerServer is constructor for SwarmSyncerServer -func NewSwarmSyncerServer(po uint8, syncChunkStore storage.SyncChunkStore) (*SwarmSyncerServer, error) { - return &SwarmSyncerServer{ - po: po, - store: syncChunkStore, - quit: make(chan struct{}), - }, nil -} - -func RegisterSwarmSyncerServer(streamer *Registry, syncChunkStore storage.SyncChunkStore) { - streamer.RegisterServerFunc("SYNC", func(_ *Peer, t string, _ bool) (Server, error) { - po, err := ParseSyncBinKey(t) - if err != nil { - return nil, err - } - return NewSwarmSyncerServer(po, syncChunkStore) - }) - // streamer.RegisterServerFunc(stream, func(p *Peer) (Server, error) { - // return NewOutgoingProvableSwarmSyncer(po, db) - // }) -} - -// Close needs to be called on a stream server -func (s *SwarmSyncerServer) Close() { - close(s.quit) -} - -// GetData retrieves the actual chunk from netstore -func (s *SwarmSyncerServer) GetData(ctx context.Context, key []byte) ([]byte, error) { - chunk, err := s.store.Get(ctx, storage.Address(key)) - if err != nil { - return nil, err - } - return chunk.Data(), nil -} - -// SessionIndex returns current storage bin (po) index. -func (s *SwarmSyncerServer) SessionIndex() (uint64, error) { - return s.store.BinIndex(s.po), nil -} - -// GetBatch retrieves the next batch of hashes from the dbstore -func (s *SwarmSyncerServer) SetNextBatch(from, to uint64) ([]byte, uint64, uint64, *HandoverProof, error) { - var batch []byte - i := 0 - - var ticker *time.Ticker - defer func() { - if ticker != nil { - ticker.Stop() - } - }() - var wait bool - for { - if wait { - if ticker == nil { - ticker = time.NewTicker(1000 * time.Millisecond) - } - select { - case <-ticker.C: - case <-s.quit: - return nil, 0, 0, nil, nil - } - } - - metrics.GetOrRegisterCounter("syncer.setnextbatch.iterator", nil).Inc(1) - err := s.store.Iterator(from, to, s.po, func(key storage.Address, idx uint64) bool { - batch = append(batch, key[:]...) - i++ - to = idx - return i < BatchSize - }) - if err != nil { - return nil, 0, 0, nil, err - } - if len(batch) > 0 { - break - } - wait = true - } - - log.Trace("Swarm syncer offer batch", "po", s.po, "len", i, "from", from, "to", to, "current store count", s.store.BinIndex(s.po)) - return batch, from, to, nil, nil -} - -// SwarmSyncerClient -type SwarmSyncerClient struct { - store storage.SyncChunkStore - peer *Peer - stream Stream -} - -// NewSwarmSyncerClient is a contructor for provable data exchange syncer -func NewSwarmSyncerClient(p *Peer, store storage.SyncChunkStore, stream Stream) (*SwarmSyncerClient, error) { - return &SwarmSyncerClient{ - store: store, - peer: p, - stream: stream, - }, nil -} - -// // NewIncomingProvableSwarmSyncer is a contructor for provable data exchange syncer -// func NewIncomingProvableSwarmSyncer(po int, priority int, index uint64, sessionAt uint64, intervals []uint64, sessionRoot storage.Address, chunker *storage.PyramidChunker, store storage.ChunkStore, p Peer) *SwarmSyncerClient { -// retrieveC := make(storage.Chunk, chunksCap) -// RunChunkRequestor(p, retrieveC) -// storeC := make(storage.Chunk, chunksCap) -// RunChunkStorer(store, storeC) -// s := &SwarmSyncerClient{ -// po: po, -// priority: priority, -// sessionAt: sessionAt, -// start: index, -// end: index, -// nextC: make(chan struct{}, 1), -// intervals: intervals, -// sessionRoot: sessionRoot, -// sessionReader: chunker.Join(sessionRoot, retrieveC), -// retrieveC: retrieveC, -// storeC: storeC, -// } -// return s -// } - -// // StartSyncing is called on the Peer to start the syncing process -// // the idea is that it is called only after kademlia is close to healthy -// func StartSyncing(s *Streamer, peerId enode.ID, po uint8, nn bool) { -// lastPO := po -// if nn { -// lastPO = maxPO -// } -// -// for i := po; i <= lastPO; i++ { -// s.Subscribe(peerId, "SYNC", newSyncLabel("LIVE", po), 0, 0, High, true) -// s.Subscribe(peerId, "SYNC", newSyncLabel("HISTORY", po), 0, 0, Mid, false) -// } -// } - -// RegisterSwarmSyncerClient registers the client constructor function for -// to handle incoming sync streams -func RegisterSwarmSyncerClient(streamer *Registry, store storage.SyncChunkStore) { - streamer.RegisterClientFunc("SYNC", func(p *Peer, t string, live bool) (Client, error) { - return NewSwarmSyncerClient(p, store, NewStream("SYNC", t, live)) - }) -} - -// NeedData -func (s *SwarmSyncerClient) NeedData(ctx context.Context, key []byte) (wait func(context.Context) error) { - return s.store.FetchFunc(ctx, key) -} - -// BatchDone -func (s *SwarmSyncerClient) BatchDone(stream Stream, from uint64, hashes []byte, root []byte) func() (*TakeoverProof, error) { - // TODO: reenable this with putter/getter refactored code - // if s.chunker != nil { - // return func() (*TakeoverProof, error) { return s.TakeoverProof(stream, from, hashes, root) } - // } - return nil -} - -func (s *SwarmSyncerClient) Close() {} - -// base for parsing and formating sync bin key -// it must be 2 <= base <= 36 -const syncBinKeyBase = 36 - -// FormatSyncBinKey returns a string representation of -// Kademlia bin number to be used as key for SYNC stream. -func FormatSyncBinKey(bin uint8) string { - return strconv.FormatUint(uint64(bin), syncBinKeyBase) -} - -// ParseSyncBinKey parses the string representation -// and returns the Kademlia bin number. -func ParseSyncBinKey(s string) (uint8, error) { - bin, err := strconv.ParseUint(s, syncBinKeyBase, 8) - if err != nil { - return 0, err - } - return uint8(bin), nil -} diff --git a/swarm/network/stream/syncer_test.go b/swarm/network/stream/syncer_test.go deleted file mode 100644 index da01c3e965be..000000000000 --- a/swarm/network/stream/syncer_test.go +++ /dev/null @@ -1,412 +0,0 @@ -// Copyright 2018 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 stream - -import ( - "context" - "errors" - "fmt" - "io/ioutil" - "math" - "os" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/network/simulation" - "github.com/nebulaai/nbai-node/swarm/state" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/storage/mock" - mockmem "github.com/nebulaai/nbai-node/swarm/storage/mock/mem" - "github.com/nebulaai/nbai-node/swarm/testutil" -) - -const dataChunkCount = 200 - -func TestSyncerSimulation(t *testing.T) { - testSyncBetweenNodes(t, 2, dataChunkCount, true, 1) - testSyncBetweenNodes(t, 4, dataChunkCount, true, 1) - testSyncBetweenNodes(t, 8, dataChunkCount, true, 1) - testSyncBetweenNodes(t, 16, dataChunkCount, true, 1) -} - -func createMockStore(globalStore mock.GlobalStorer, id enode.ID, addr *network.BzzAddr) (lstore storage.ChunkStore, datadir string, err error) { - address := common.BytesToAddress(id.Bytes()) - mockStore := globalStore.NewNodeStore(address) - params := storage.NewDefaultLocalStoreParams() - - datadir, err = ioutil.TempDir("", "localMockStore-"+id.TerminalString()) - if err != nil { - return nil, "", err - } - params.Init(datadir) - params.BaseKey = addr.Over() - lstore, err = storage.NewLocalStore(params, mockStore) - if err != nil { - return nil, "", err - } - return lstore, datadir, nil -} - -func testSyncBetweenNodes(t *testing.T, nodes, chunkCount int, skipCheck bool, po uint8) { - - sim := simulation.New(map[string]simulation.ServiceFunc{ - "streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - var store storage.ChunkStore - var datadir string - - node := ctx.Config.Node() - addr := network.NewAddr(node) - //hack to put addresses in same space - addr.OAddr[0] = byte(0) - - if *useMockStore { - store, datadir, err = createMockStore(mockmem.NewGlobalStore(), node.ID(), addr) - } else { - store, datadir, err = createTestLocalStorageForID(node.ID(), addr) - } - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - cleanup = func() { - store.Close() - os.RemoveAll(datadir) - } - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyDB, netStore) - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New - - bucket.Store(bucketKeyDelivery, delivery) - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - Retrieval: RetrievalDisabled, - Syncing: SyncingAutoSubscribe, - SkipCheck: skipCheck, - }, nil) - - fileStore := storage.NewFileStore(netStore, storage.NewFileStoreParams()) - bucket.Store(bucketKeyFileStore, fileStore) - - return r, cleanup, nil - - }, - }) - defer sim.Close() - - // create context for simulation run - timeout := 30 * time.Second - ctx, cancel := context.WithTimeout(context.Background(), timeout) - // defer cancel should come before defer simulation teardown - defer cancel() - - _, err := sim.AddNodesAndConnectChain(nodes) - if err != nil { - t.Fatal(err) - } - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) (err error) { - nodeIDs := sim.UpNodeIDs() - - nodeIndex := make(map[enode.ID]int) - for i, id := range nodeIDs { - nodeIndex[id] = i - } - - disconnections := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - simulation.NewPeerEventsFilter().Drop(), - ) - - var disconnected atomic.Value - go func() { - for d := range disconnections { - if d.Error != nil { - log.Error("peer drop", "node", d.NodeID, "peer", d.PeerID) - disconnected.Store(true) - } - } - }() - defer func() { - if err != nil { - if yes, ok := disconnected.Load().(bool); ok && yes { - err = errors.New("disconnect events received") - } - } - }() - - // each node Subscribes to each other's swarmChunkServerStreamName - for j := 0; j < nodes-1; j++ { - id := nodeIDs[j] - client, err := sim.Net.GetNode(id).Client() - if err != nil { - t.Fatal(err) - } - sid := nodeIDs[j+1] - client.CallContext(ctx, nil, "stream_subscribeStream", sid, NewStream("SYNC", FormatSyncBinKey(1), false), NewRange(0, 0), Top) - if err != nil { - return err - } - if j > 0 || nodes == 2 { - item, ok := sim.NodeItem(nodeIDs[j], bucketKeyFileStore) - if !ok { - return fmt.Errorf("No filestore") - } - fileStore := item.(*storage.FileStore) - size := chunkCount * chunkSize - _, wait, err := fileStore.Store(ctx, testutil.RandomReader(j, size), int64(size), false) - if err != nil { - t.Fatal(err.Error()) - } - wait(ctx) - } - } - // here we distribute chunks of a random file into stores 1...nodes - if _, err := sim.WaitTillHealthy(ctx); err != nil { - return err - } - - // collect hashes in po 1 bin for each node - hashes := make([][]storage.Address, nodes) - totalHashes := 0 - hashCounts := make([]int, nodes) - for i := nodes - 1; i >= 0; i-- { - if i < nodes-1 { - hashCounts[i] = hashCounts[i+1] - } - item, ok := sim.NodeItem(nodeIDs[i], bucketKeyDB) - if !ok { - return fmt.Errorf("No DB") - } - netStore := item.(*storage.NetStore) - netStore.Iterator(0, math.MaxUint64, po, func(addr storage.Address, index uint64) bool { - hashes[i] = append(hashes[i], addr) - totalHashes++ - hashCounts[i]++ - return true - }) - } - var total, found int - for _, node := range nodeIDs { - i := nodeIndex[node] - - for j := i; j < nodes; j++ { - total += len(hashes[j]) - for _, key := range hashes[j] { - item, ok := sim.NodeItem(nodeIDs[j], bucketKeyDB) - if !ok { - return fmt.Errorf("No DB") - } - db := item.(*storage.NetStore) - _, err := db.Get(ctx, key) - if err == nil { - found++ - } - } - } - log.Debug("sync check", "node", node, "index", i, "bin", po, "found", found, "total", total) - } - if total == found && total > 0 { - return nil - } - return fmt.Errorf("Total not equallying found: total is %d", total) - }) - - if result.Error != nil { - t.Fatal(result.Error) - } -} - -//TestSameVersionID just checks that if the version is not changed, -//then streamer peers see each other -func TestSameVersionID(t *testing.T) { - //test version ID - v := uint(1) - sim := simulation.New(map[string]simulation.ServiceFunc{ - "streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - var store storage.ChunkStore - var datadir string - - node := ctx.Config.Node() - addr := network.NewAddr(node) - - store, datadir, err = createTestLocalStorageForID(node.ID(), addr) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - cleanup = func() { - store.Close() - os.RemoveAll(datadir) - } - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyDB, netStore) - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New - - bucket.Store(bucketKeyDelivery, delivery) - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - Retrieval: RetrievalDisabled, - Syncing: SyncingAutoSubscribe, - }, nil) - //assign to each node the same version ID - r.spec.Version = v - - bucket.Store(bucketKeyRegistry, r) - - return r, cleanup, nil - - }, - }) - defer sim.Close() - - //connect just two nodes - log.Info("Adding nodes to simulation") - _, err := sim.AddNodesAndConnectChain(2) - if err != nil { - t.Fatal(err) - } - - log.Info("Starting simulation") - ctx := context.Background() - //make sure they have time to connect - time.Sleep(200 * time.Millisecond) - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - //get the pivot node's filestore - nodes := sim.UpNodeIDs() - - item, ok := sim.NodeItem(nodes[0], bucketKeyRegistry) - if !ok { - return fmt.Errorf("No filestore") - } - registry := item.(*Registry) - - //the peers should connect, thus getting the peer should not return nil - if registry.getPeer(nodes[1]) == nil { - t.Fatal("Expected the peer to not be nil, but it is") - } - return nil - }) - if result.Error != nil { - t.Fatal(result.Error) - } - log.Info("Simulation ended") -} - -//TestDifferentVersionID proves that if the streamer protocol version doesn't match, -//then the peers are not connected at streamer level -func TestDifferentVersionID(t *testing.T) { - //create a variable to hold the version ID - v := uint(0) - sim := simulation.New(map[string]simulation.ServiceFunc{ - "streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - var store storage.ChunkStore - var datadir string - - node := ctx.Config.Node() - addr := network.NewAddr(node) - - store, datadir, err = createTestLocalStorageForID(node.ID(), addr) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - cleanup = func() { - store.Close() - os.RemoveAll(datadir) - } - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyDB, netStore) - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, true).New - - bucket.Store(bucketKeyDelivery, delivery) - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - Retrieval: RetrievalDisabled, - Syncing: SyncingAutoSubscribe, - }, nil) - - //increase the version ID for each node - v++ - r.spec.Version = v - - bucket.Store(bucketKeyRegistry, r) - - return r, cleanup, nil - - }, - }) - defer sim.Close() - - //connect the nodes - log.Info("Adding nodes to simulation") - _, err := sim.AddNodesAndConnectChain(2) - if err != nil { - t.Fatal(err) - } - - log.Info("Starting simulation") - ctx := context.Background() - //make sure they have time to connect - time.Sleep(200 * time.Millisecond) - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - //get the pivot node's filestore - nodes := sim.UpNodeIDs() - - item, ok := sim.NodeItem(nodes[0], bucketKeyRegistry) - if !ok { - return fmt.Errorf("No filestore") - } - registry := item.(*Registry) - - //getting the other peer should fail due to the different version numbers - if registry.getPeer(nodes[1]) != nil { - t.Fatal("Expected the peer to be nil, but it is not") - } - return nil - }) - if result.Error != nil { - t.Fatal(result.Error) - } - log.Info("Simulation ended") - -} diff --git a/swarm/network/stream/testing/snapshot_128.json b/swarm/network/stream/testing/snapshot_128.json deleted file mode 100644 index 9b5eb501d3ac..000000000000 --- a/swarm/network/stream/testing/snapshot_128.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","private_key":"73015943fd2c673001da6bf6658a12a22e057fc545ac0ebc78421f90f1370093","name":"node_a9e0b763852706722dc904b494293f9399c0fa32255890aa720285b8160335bb618f36b68a81b875a805384179f600defef474d486b4ea04b003ef6477ab7907","services":["streamer"],"enable_msg_events":true,"port":63042},"up":true}},{"node":{"config":{"id":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","private_key":"89cbfe6d806f2aeaee6a59667df3c3059ff7531bb33d64661586b004fcb6b831","name":"node_87e696a354d249493217dc4e0190082f30e09616873803efa376871d4b34f86f0eeb4643d4822d8a0fbcdedb27cd6ba5438e98943d358d960c4835e82261c93e","services":["streamer"],"enable_msg_events":true,"port":63043},"up":true}},{"node":{"config":{"id":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","private_key":"ff2ac479a33dc7fff5f87e4bb3078dfbcbb1567b76e35792faf104a383ebf896","name":"node_18bb6572965f4263c5a4d59a73027abc57a46122125ee58d871e95c993e6a1e8230438ce696a5f8880a08749837268b54319f7b0aa254c1a5bd453a8e9bcf84f","services":["streamer"],"enable_msg_events":true,"port":63044},"up":true}},{"node":{"config":{"id":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","private_key":"4800e21ac6431c61873444c525e207b48bb7a09ba2793b482ba6cf8cce81e353","name":"node_3103510e00a3f49a5e715719049fc8c9c67a2373a548f326458aeb6d9c75ed92b94373638fd075def0209113b4e85d972c23f064539f7b041596184e40d7f9a2","services":["streamer"],"enable_msg_events":true,"port":63045},"up":true}},{"node":{"config":{"id":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","private_key":"7e26b011ae2eabac951145e7840169b1f279577c06c40b4ba3a62da3ddb58de5","name":"node_077d2d032874e5ce70e9b928b7fe72c0326ba92394e16245e31d48b5731d3d32bfd86acf40825decff54bcd735e9ebfd94eba677c418ea7007baec9db4af676d","services":["streamer"],"enable_msg_events":true,"port":63046},"up":true}},{"node":{"config":{"id":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","private_key":"1fbf6b44eeb20ef012046cf8b7d3400ef3e586586aaf1cf6a2e5115ff5e3d868","name":"node_d90a81a583c82d626b92f27244f027da4a0ae76e6d3bdc1de0af7be01798f1fb04b34ce60c6d8651a39d7a70915438a4aa63e5adf844a9f7e38dbf0b1dba754d","services":["streamer"],"enable_msg_events":true,"port":63047},"up":true}},{"node":{"config":{"id":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","private_key":"f32eafbb366e4b7655d302a06aac2e62ff8f4b9c07bb18175e58e534193b8554","name":"node_31ac37862416c0e229c4a088ec179f23bdd1bf12dd464eb11c630ad531d7c3438671862e5458e2f6fbb32b857f857e6b8c17e5d93eb29a0e78bb5a65d7eb648c","services":["streamer"],"enable_msg_events":true,"port":63048},"up":true}},{"node":{"config":{"id":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","private_key":"6a809d9de0380db0b8bae8769cf41f9b05576137d0e2eefa69b7ddd921c6ac77","name":"node_1e3c83cabbe6852c987ae521b7fcb33185cf855c59b6235ebb8e57a6f860ccc159ddc01b4a21d251c8faca4559ceb271e046a51493ba148c0d3aed97ad208969","services":["streamer"],"enable_msg_events":true,"port":63049},"up":true}},{"node":{"config":{"id":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","private_key":"f23b80b698ec97210ddaa65807a07cee7b411018ddd96c9d700e92a83120cf9e","name":"node_2fdb4382c4bc2950948a8cff13a7df65627bc0b20661cae20fd29acab166c97701594ee3151d75c006ba86d1d68b624b1d1f78e3d1e2fc297844956ef82208a8","services":["streamer"],"enable_msg_events":true,"port":63050},"up":true}},{"node":{"config":{"id":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","private_key":"d2d74e454118a6e150810c74080ee7707b92b4575e7fe13c8887caf521cc734d","name":"node_87fce129511a1be2777052d24b606acdfe7067f4e874ab04674a68664b378ea208975f7269a72af889d3d23cd930b6a181afa2cdef3f9f9491f715bd96ad8dc0","services":["streamer"],"enable_msg_events":true,"port":63051},"up":true}},{"node":{"config":{"id":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","private_key":"cdc72a1d2e475117e77abccdee1816e4d84fb059d712b717e8bd063239b6fd58","name":"node_c773af3af01ee8ab9fa8d06987baf4f10c394fdd386d69b7a7362f4b68fd6fc082337d3b33a19d584c5801a3e9198225d7b61f6629e34ce823be70908339f4c7","services":["streamer"],"enable_msg_events":true,"port":63052},"up":true}},{"node":{"config":{"id":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","private_key":"b1b2452fe8ea070ff3b181fdc538144e1231f0c6f467713712662375dc6c4bb1","name":"node_56b25623ac935f3a8aac1e2603a6bd15ace1e5714671954b47f2cab960cf47922828f415105602408d0a732a893ebeea6f9afab7f889bb235c81589548d09391","services":["streamer"],"enable_msg_events":true,"port":63053},"up":true}},{"node":{"config":{"id":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","private_key":"e87535b0ec914ff93ea21f722eff61dd6cfea4f5542f68aab0af93c58e2afc25","name":"node_09b60de1e85bb6f7d2caf5b1ab58204d7d04531ece300dcd7bcc9157b8b3ef2a182758808a0eec6056034f29f52caadb7c690f498c1c8832ff7a6a9ecff308bd","services":["streamer"],"enable_msg_events":true,"port":63054},"up":true}},{"node":{"config":{"id":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","private_key":"3ae9a961f597c04b695a6d25fd0e6e47b131854f55f89d8ac25cce7411aa4107","name":"node_f2ea93f43be9d0c3fa21f1496dc13c778977a6afdcba24c8b146de7dca2cdde62a5b792aab969e5b4b6c56f63066b336580d911f206049cc24cac32a25fc4306","services":["streamer"],"enable_msg_events":true,"port":63055},"up":true}},{"node":{"config":{"id":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","private_key":"1676fda16b41e3ec275f0d30ad691055248be71252ad15422b9c0260671aaf4c","name":"node_872cdbb6d74fb55fd2d51877ef7804bdd2eeb6de0297eb2ce18b67e52379b147d54a46d2385ec9293eb21736bed4191d92c5c75e8e81fc5a6c691970e019f570","services":["streamer"],"enable_msg_events":true,"port":63056},"up":true}},{"node":{"config":{"id":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","private_key":"6c989b24f2387e5a639effc8cd15b6d60c587fd14615496c9463d1f1a7ff6ad5","name":"node_da3e0fd71eb96ba2cab7f920d32f5425d1aad41d00765fdffb0b215d9dd5b60e2bc5929eafebee5b2b5a11aec164e141beff19d828aac7d1fabd3ffb0bfb8450","services":["streamer"],"enable_msg_events":true,"port":63057},"up":true}},{"node":{"config":{"id":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","private_key":"a1befe78e67ca8b4972ba564c3bd03ad2ca6b996ded22166468d7a268a4c77d3","name":"node_489660042a8867d90a16ebb013968db26ca3edfc70f53320f511e35b3703eed09fbd787be5c06726a570a54aa15d129cd10db741523adf297929f909be4a0c71","services":["streamer"],"enable_msg_events":true,"port":63058},"up":true}},{"node":{"config":{"id":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","private_key":"6b9ad7d1da45cff60c3bdcac68f0af30e0a6e0e30e4ad73731c00368e9b0254a","name":"node_4448a59bde9edb93edcdb4a77f3e2277b9c01ffea45496ee0533eb5192955a08a0f982e25cf772e0dae68735a55b7acd221f6ba7b134f1e999087bee182330e8","services":["streamer"],"enable_msg_events":true,"port":63059},"up":true}},{"node":{"config":{"id":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","private_key":"157e46312708757a331443dd95e1a0c012502430f4a8f8756f0aeaf35bde1f6d","name":"node_73319a301ad3cf0ec09549d817c9523d61b74abb0cad87b737d41d900321e52722a84355f6f87bc7a5f848818c89a021bb0f3e5994f67c9a7b5bbfc98188a376","services":["streamer"],"enable_msg_events":true,"port":63060},"up":true}},{"node":{"config":{"id":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","private_key":"11148e1d9812b7bb8870b7960332ba4b32ea6aa43a57f9a27c30c2fafb609570","name":"node_caad8529d498a4a1e1ba7573689a913500bd409345ef8e3656abca748269eb73b919282f7f2eb0087f81f7bc52c367657ac8be0cdac65d2490c7c50c874444b7","services":["streamer"],"enable_msg_events":true,"port":63061},"up":true}},{"node":{"config":{"id":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","private_key":"896c3ee65d71ddcbf6030b920c0bf7748971170583e45fa2e33c19b3222e3945","name":"node_44462055ba68fdef337dd19d8123aace9a12284c13bc97687416b6b4ca0c94234ba7db6823651fc021d6ac1539e0c5321e763a7a12c9e7c8a583aac5369817d8","services":["streamer"],"enable_msg_events":true,"port":63062},"up":true}},{"node":{"config":{"id":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","private_key":"043c2adc5bdb3449b2f770e1207eac21128e77e89c9e1fe8876cecf1792f8b24","name":"node_ecbdca037cd7892752345b48b4219478b1b334f83ce7140fcc72eb71784436b690ce7a41b03e013cefc19d64a34a20cfef1b9e2b535d938bcdcb39fe63645a42","services":["streamer"],"enable_msg_events":true,"port":63063},"up":true}},{"node":{"config":{"id":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","private_key":"88f2cc06ba260e7c09cdd93e48c55c000d7a988ef65ccfc5331d1eac3c66d7b1","name":"node_51ba4faf0988717a37dcddc0a60a70ead33bde310184fc450f9ca73c67f931e6767ad5930bcf409e5aeb613a9ff7a03e47de6fc13b33d8af0b87b38822ae6888","services":["streamer"],"enable_msg_events":true,"port":63064},"up":true}},{"node":{"config":{"id":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","private_key":"8c64fc376a830b9237a1d1609a24e18396eb82cd6cd64b8ff572c9f946aaab2c","name":"node_750ca601f07d65f426f6ea5f34e06238f9d7a931f022f9b0ebc811943d3725500cb3c6f00c8d05eb8d5b353c6534136dff38b9a8d3d4dc5bf49cd96875704d07","services":["streamer"],"enable_msg_events":true,"port":63065},"up":true}},{"node":{"config":{"id":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","private_key":"545e42fc4dfd38b62f1481fe46895a3cb9c6632930c8df8358d66a3988e6fe72","name":"node_41994605708232b4ca7448c3bc0760a7b86bf26d442091e5ce6e92eac94925721d7e0eca04bdd03bb1bba1ef92deeccd4bf1b7c6c3318b7e8d031965c6646761","services":["streamer"],"enable_msg_events":true,"port":63066},"up":true}},{"node":{"config":{"id":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","private_key":"3e5b24d432307724a3e619c479ad5c87a93c6ee96d2b6ab0dad17da7e84eea55","name":"node_28afc20d8f4779b285bb14870062dbb54796ec77623302e51bc1bafed9e2c35751c8469ffc482718e059875dfa2226195ed10999e251498cba3a444896cb67db","services":["streamer"],"enable_msg_events":true,"port":63067},"up":true}},{"node":{"config":{"id":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","private_key":"cab0eaf666548a84a7ceb4a34a29b7079c66b0df29e7fd315e851e02a8c9a5ed","name":"node_805d784527be4e32e84ddf045baee1ccf348cdf8288de3aae1a5379f762576b957525ef358d9b42c68a93394017880adc09bb2b1b5e01102dc7e4240baf2af95","services":["streamer"],"enable_msg_events":true,"port":63068},"up":true}},{"node":{"config":{"id":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","private_key":"8c48ba58bc5ac8c0f3f0295c73df1572e80465f15a97f1c5537735474b11da89","name":"node_9c6dcfef0e128dbfeca58b8ac625b08fb447b0d579bd3f18bc0e2be60d1ec2274595d0554ddba0ca7eb660099d3ea146d8076792b46c93841d2ecf8cf608f5ba","services":["streamer"],"enable_msg_events":true,"port":63069},"up":true}},{"node":{"config":{"id":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","private_key":"0939af4a1ac3398bd818e5ac35e1003530a80a0abba5bf4c586664ab0b15a391","name":"node_6ce3a68cb1e2924ad97f22006094c709a3dd8b4ca1546fbb037f841a9e5ac62def242015dbf6221bda610153db064edcbb58a78a35a06077b8c02bf5b2a33c04","services":["streamer"],"enable_msg_events":true,"port":63070},"up":true}},{"node":{"config":{"id":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","private_key":"bfdc13ed4844405928ae3f67e209353779af203143a9f43fd8d1fc899ddd56a7","name":"node_178d5ce398a7114a63a0c953a59932e769891420f6b1544f08c082cd37b531b66757652d279b3036b03b04f8d46eceb0b46fb95646c6668e2921af75c06c3d97","services":["streamer"],"enable_msg_events":true,"port":63071},"up":true}},{"node":{"config":{"id":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","private_key":"d52f5bca67f434e20d72348971b791cb18def6182b002a3342c721ed06e9ad84","name":"node_59730132a01ba848a3c050bb6234bca9a72deba33716960fc3ec89b186bfcd313b9bbf049939d5805ff98db2c53a9421ce6ec97d8b4cdbaea53ba264d80d0734","services":["streamer"],"enable_msg_events":true,"port":63072},"up":true}},{"node":{"config":{"id":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","private_key":"7d5751c36a856dbc2403a058a432e1f2bd142ae438444db9febdaa22480dd404","name":"node_93987e431a0058f2e942ccf8d3486d249cd2734d6494131b343e2c3a8fdd86cfcb12d0aaaf8fcb911ad3cdd682cc82118198195a7fdc915ab7853223f012eab6","services":["streamer"],"enable_msg_events":true,"port":63073},"up":true}},{"node":{"config":{"id":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","private_key":"5cb8cc7f27d0f0e28e9ca55b592a38839058155cfce8528b5a464f98025eb54d","name":"node_665c3288c14dc1c17d85d17d634910f42183482c7e77c47e68f9b4f475b93e8c152246b9e34781606315ff6ef0f8360342500d15e4a2d67d9df6b72f30af64a7","services":["streamer"],"enable_msg_events":true,"port":63074},"up":true}},{"node":{"config":{"id":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","private_key":"3901f39cd02354a635723259be3a5e7c28de3f7406c889fc9353d3adb22b9d82","name":"node_562119edffe8270f6f7a5ad9b13d4c65d643e52a2331d1fee16f7e9b5567f44cfea62df3e8965a22cf08db8fa918f0a0bcae8da2936677e6d25bc88ed85ed2f1","services":["streamer"],"enable_msg_events":true,"port":63075},"up":true}},{"node":{"config":{"id":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","private_key":"4e740dfca715720a19f56d32d6b9783810e1d6da09425e01dfbe3b55714416c0","name":"node_2502fc8ee0ccda79ad1dbd9c7cec625da85980b9116bdd56dc367d508039e25e5f65183293006e5b0df72fa9037a48bd2b133a757940d3587ff77ae2392e3eaf","services":["streamer"],"enable_msg_events":true,"port":63076},"up":true}},{"node":{"config":{"id":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","private_key":"765219c4fea7ac80a0c5d26a096829226933310ad22d889ee19eb23915363fda","name":"node_e9f7e58fda4b504275441d51929fbc98214abdc9ed552c7aa94c600a85d4e791d60c032304b29ae028adccec94984fc9a3d705a81462632f50ef45024eb0f64e","services":["streamer"],"enable_msg_events":true,"port":63077},"up":true}},{"node":{"config":{"id":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","private_key":"edf1f1608ee4b7c320472a071f2d60d53c7b74e58fba190b5353e92056f30751","name":"node_9e6c1c6e871638182c4b54ac89352ef5c2bca0a99424a1369013e7c182883da0e8d7ab96b3c8254c31fa315b941d8ddee153157626821fc78c2cae951c1c9053","services":["streamer"],"enable_msg_events":true,"port":63078},"up":true}},{"node":{"config":{"id":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","private_key":"16e405179555f907062a85c408713f0fa46a5f1f6714c99272bb705ae226b2a5","name":"node_bfef26733f5196a11484bcc28d88776e747189ae7cec883ff39a27cfeee6d9d1efb34560c9f8e75eec43fc069a2ce5f0c78107a36cc8a569d37bd5306aecf23a","services":["streamer"],"enable_msg_events":true,"port":63079},"up":true}},{"node":{"config":{"id":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","private_key":"8337241aad3fa93ccc78bab1ff15a2aa218fbd7d026bffe74b7dadd8e6aa787f","name":"node_f6a07a1d361a4671e997d5eaadae61736291aff3896cb69f06bbc19bf7536dd152e0b15422b2fd9f8a9d2f9a251c9a07d0140319900e2cc9f25a59025c7dc91f","services":["streamer"],"enable_msg_events":true,"port":63080},"up":true}},{"node":{"config":{"id":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","private_key":"af0eb33b99b22cff74cc8137b4bb9477f8f47c895a61807279436daefaf9cac8","name":"node_08900197e74e285a5a8a9cc53fbd420bb35043ab27eb2d9eab22615e736a093abfa235c17f667dcc791cb50b9022082eafd9fba030194cc84f0358b769adc85b","services":["streamer"],"enable_msg_events":true,"port":63081},"up":true}},{"node":{"config":{"id":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","private_key":"3c9a377e5ae9212adee118e04b3cd9cead5b4830ee51492dffbec8f015b5b757","name":"node_afb5754b4748b7ac5628e32b242c90aab0e2fc7da58d8d5c8c775d13d8a6fd32240f1b89021587858168cbe7b3ea7ad07807728655eae0a9907060494a7c99ca","services":["streamer"],"enable_msg_events":true,"port":63082},"up":true}},{"node":{"config":{"id":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","private_key":"5ccc64d0c951c9f50f0f7053504f54f965e22a22fb06b0bd14f206d72d822fa6","name":"node_8f625a4e4f4fd980c796d3aa535e58a39722492480cf6982d43fab02de63a5b4c1b5c7cd8402171dd792bb5d9c3e2bdd38176c061dbe3e5b0592af1339e3fd82","services":["streamer"],"enable_msg_events":true,"port":63083},"up":true}},{"node":{"config":{"id":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","private_key":"f44a9e23990fd65de4da61711cb5a720a4474421ea0a653c7ce5ed76149b335d","name":"node_ab3814579882e9fd8d464f4f3c8a421be37822ba7f42c5f5e787e81125ec032f9ccf90a138c0b57f0a813b55b583f80d66284f795e2c82d80d2869e1fc770be5","services":["streamer"],"enable_msg_events":true,"port":63084},"up":true}},{"node":{"config":{"id":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","private_key":"4fd7ee5ba8003bb9b914612e6283cf5738550412c71e4475e07eb8bef32e96a4","name":"node_670949178a5fad22da03af1e206c814a797c0e9eb4e3371f83612f121e5b56e767706a3ae36628cd0c86dd7bd1586ca4df57e2de27b28a31284ecf9176d330e5","services":["streamer"],"enable_msg_events":true,"port":63085},"up":true}},{"node":{"config":{"id":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","private_key":"d0df7b482eb60b2f1ed4c2562768f60fe5ee8997e542bc9c7310db55391553d4","name":"node_fd12c5c96df6ee76dd7beb9e4e4768dda4d2c498851b6435f13ca0175980d0e4a4ff1c002e4daf41a995f118500604764f88496fb9b2c22e28308d8649b525ce","services":["streamer"],"enable_msg_events":true,"port":63086},"up":true}},{"node":{"config":{"id":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","private_key":"7771ce12670dba4c28198f6df284ad58c9ca877a25ceb912ec3af5ac83f6e143","name":"node_ed1ab28230ed533abf25633508d54f32bbff78a10c7a15fad5c2320cda9d9669c6d0e15689d8885400e64cbcd81730456f8f4bd5c98681d2cd8a8d4e1daec553","services":["streamer"],"enable_msg_events":true,"port":63087},"up":true}},{"node":{"config":{"id":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","private_key":"97cc28baaa8c94c905d348295eb19ef607599d22742989105d03eff39a5d6d51","name":"node_a05a18161c2d01a0f122548c66509dd1fcf3ee52975035bc79fb059e9613b743a16cd6f5ac54090e68f51bcf76ff21fb3805ba3197a96b4236afb80f791df802","services":["streamer"],"enable_msg_events":true,"port":63088},"up":true}},{"node":{"config":{"id":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","private_key":"9f191333ec4b20a2380317b819e71ffc234e63e85ec57548c407e1740c07f41f","name":"node_c89dbada7195464e732671ac6fff014cacfb4c879b63b6b84e7c1bce367522f759bd06e504b15f43a1735c6322356747fa5c4951882d4fd6cdf6f7cf13726719","services":["streamer"],"enable_msg_events":true,"port":63089},"up":true}},{"node":{"config":{"id":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","private_key":"9b597a8aa9ae03a20ec963fd3eeaca13823d7efd28a70c4c44ebfa6e147bb24a","name":"node_51302ef7b50922398ad802e917390bb4a3c24c877f2c2bcb7fcb34de9feca22673a2c594639914fe46a28837ffadfd03bb673afbc856aff5e59caf8e76082482","services":["streamer"],"enable_msg_events":true,"port":63090},"up":true}},{"node":{"config":{"id":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","private_key":"342dbb181da6045ae41eacef680b93f58765c7c5d65713f25f8b0627863c7983","name":"node_a40391285d1a97f1fb368b20c8e4d02be1bdebc0db41f00f99aac2f01893dc12256cd5a711117a981fbb3f9dfea18c19cf3603e925dbd67c4032b22b41eab8d5","services":["streamer"],"enable_msg_events":true,"port":63091},"up":true}},{"node":{"config":{"id":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","private_key":"af173c26c979843230716c1a7f4aade4f9a19a23e2ee665d0a0ecae0f793188e","name":"node_e0420ba2a293315d810928a0e09a507c6aaf93977ba2c7598e9b83723b4a66682398ea17542c26767c7ff0f4ca09c537d3cc10dad283f079f1de73e25e87cb5c","services":["streamer"],"enable_msg_events":true,"port":63092},"up":true}},{"node":{"config":{"id":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","private_key":"4598804bbccfa26a362afa9773f283bfbc0ab7660240791e38f7ba858e45280d","name":"node_33e3ab7108ced43102003c3b3192b194100f32b6bcb67bb772ea9696e35721196699cf01e443f7cdf8076ad83aaf7468b75c71d03efb95f4c07cf0742ea9af81","services":["streamer"],"enable_msg_events":true,"port":63093},"up":true}},{"node":{"config":{"id":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","private_key":"253935f834190e90b6bf0646618d2992233bf386ea31a58770e1926cb063050c","name":"node_cbed12dcab0aa04a96ec7e25bc2ee03b337c7b2006391baa7d2aff042c17ec70b82c5fb2dc916d085a7948541719d329f9b528b67ec6adb1ac2cc594d4ef1e42","services":["streamer"],"enable_msg_events":true,"port":63094},"up":true}},{"node":{"config":{"id":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","private_key":"f6d280904f13397798c441bffafc78ab98461c9d84f01f4b9b73de50d5595fd0","name":"node_03d2d77c008b5fa1063b1abc3152b879a529fe4fdb2dc174d6d85312264a38ee4cc49b342507a10fff1a4b0730f1ef8e008b0897d97bfd6f70050adb124d3596","services":["streamer"],"enable_msg_events":true,"port":63095},"up":true}},{"node":{"config":{"id":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","private_key":"5237d9097b72efee4e45c4d3d14e320e49ded470809478f3ccf6a9a7cf732d74","name":"node_f0299035cbddfdf7a78e5e3a400aaedf2d719d04e907ac0f9f067525e2f9bb913d985308a3a0d05467a64adf58c68a615c6327acf716c23631d0e829903f8b34","services":["streamer"],"enable_msg_events":true,"port":63096},"up":true}},{"node":{"config":{"id":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","private_key":"a8d169922df4dcd07e1f102e3eae5692eb87b1f368124cb5c65fcca22f9743aa","name":"node_276256790c9317d09ff7802f4ad0a85840fe62527390ce1790e1e3186e8b3f04acfaa41dcd02303d333423678a4037e4f4854676e79ced3232a3dbd772cc2680","services":["streamer"],"enable_msg_events":true,"port":63097},"up":true}},{"node":{"config":{"id":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","private_key":"8b927156a8aa7b6cc711c9c2ce3016cab2e9d1ce220e9792207cc5b40fca3047","name":"node_155805f787600f9f9518cf8836f491885b64868bfe0023975bcd12776925a424fb5aa3199dc178e83294e97f347a373d05d2422578a08eeeb2d15a178d28964f","services":["streamer"],"enable_msg_events":true,"port":63098},"up":true}},{"node":{"config":{"id":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","private_key":"d2b8d940f626faf3204dd38721f5528e1c9db4b5d0cc28d0d627c7d191c1f21f","name":"node_4de606aa7e722197b918c5f7f0db86a3081d48e89d21428b04f19c3ff3755eac0bddbff5fad8bda94b9e57f58fba2fecdbabbf710f7afb381bf4f1a4fe55cd93","services":["streamer"],"enable_msg_events":true,"port":63099},"up":true}},{"node":{"config":{"id":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","private_key":"1cd1a1e084096aa4f8f9933b0871657638dad24b3f47d18c9eb0007595ce46f1","name":"node_82a774be7146766585d2bec6b69b7803aa956f492a53d8ed5f071becdbbc617562885d8430f0afd505210aab7b032428fbea32c82dffbd12d9ccba776ef4729b","services":["streamer"],"enable_msg_events":true,"port":63100},"up":true}},{"node":{"config":{"id":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","private_key":"8ec23f2c16d923996d6bd74aa374cb6e5a69fab748ea8efa538d01a12ac62e16","name":"node_340420ee18d55913f790d0fcc2305b40b1e7bef2eddb79dda57801690aeeead693ebd1a9ff8557671f5ae136b3e65733306924bd00444cbc6e7c6235e5a2c77f","services":["streamer"],"enable_msg_events":true,"port":63101},"up":true}},{"node":{"config":{"id":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","private_key":"b7a9a55daea83c1d769fe68e820de46f4a8df4c425ea7ab98a44cb7ad3c7963e","name":"node_7a509686ebce91778fe22e834a94ab03f92457d41385099ba657fe62c7469a9669bddb9a3d7b0150efa1d2f40c69bc786c7f4ede1cf8b19411eea1d23cb7d56c","services":["streamer"],"enable_msg_events":true,"port":63102},"up":true}},{"node":{"config":{"id":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","private_key":"c1478fa3ebc5b2bd2a32567455e71e73a1787b1c8c6571fd94ee0d487d5fea4d","name":"node_816e91fa8ff68ba067a89390ef61e7f23211e5e05049daa103ad1ff84b94fbcf535a6f6b515fb571939f5656869767c608513808800baba7e5d2b5f3a17a9691","services":["streamer"],"enable_msg_events":true,"port":63103},"up":true}},{"node":{"config":{"id":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","private_key":"bb118c1ce93cddc4fb540863d575d6ae584ebc2f2e2f221c9622cc105e7fd7b9","name":"node_77327983685f39f006806170fe351063a58ff1bd8dedc222d538e86cfd18abdfefd548328f25fc5afde8170aa5c35311353019468f2b439c331837ddfbb25a52","services":["streamer"],"enable_msg_events":true,"port":63104},"up":true}},{"node":{"config":{"id":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","private_key":"7cbe501dc7bdd1bafc62c5c56af215559b06aef4ed398d4a3acdb78f3c84a735","name":"node_7a18392b8338108a996196ee190a93a1b9954c8e05a062c421da513a1828dfa739e7b224878c0670cf74bbc743c7ca7ee8cfee6b6a602fe1f4a82ecfbd38c2f4","services":["streamer"],"enable_msg_events":true,"port":63105},"up":true}},{"node":{"config":{"id":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","private_key":"e853260ddb20771587ed33007ef55b07368a08f79ea0a64cf9830ab69498238f","name":"node_e7bb63c5187ee85d965fed5cb33d1678c0e090b4e4c3f3d859755565db18046cb60025453bdebf136373c416a2e6e56be063bca6c9257b7b175dcf966e274205","services":["streamer"],"enable_msg_events":true,"port":63106},"up":true}},{"node":{"config":{"id":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","private_key":"23c3dd23f790b16480c58305ab528346a7046dddd1d9f5c699a4963bfb926fb3","name":"node_545850cb90787d49c579b1ed54a753ebd00eaafe3f1bd04d57266e4912fb1cdd654446ef054a973a583ce8dfc6cc130b6f90e63bcf75372fc21c445f8e1e6005","services":["streamer"],"enable_msg_events":true,"port":63107},"up":true}},{"node":{"config":{"id":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","private_key":"e0f2a273dc23035aaf88bb97d7f5ccf57ee6304b184e7d61183556b28040076b","name":"node_86b84ddf64d301f6a9c4504c59eb4031d3167fb74101abea3b694845a009dc522be7b2e2720097ceea9f36058e160f42a2a438a33034929a5c1a7793c7ccef7b","services":["streamer"],"enable_msg_events":true,"port":63108},"up":true}},{"node":{"config":{"id":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","private_key":"dacac1dfd252a4ad8878c023bd34aa1bc81b63d66d70c8ba9aafcfa8425bb253","name":"node_bf1e6eeb8b229f63b49213db499b71dcfe0ae45ee3f14685c7cbfa3f0a2150e52a89c853f4cd8c7a92e6e5f6083044efddfa17391662e3cff6290da679520404","services":["streamer"],"enable_msg_events":true,"port":63109},"up":true}},{"node":{"config":{"id":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","private_key":"57a2dcb70aa306ae204744fce4dd4b4ad9b02516e080dca195604406e240627c","name":"node_a58a2dd3f5ee2471f0ddd555ffcc45d86e2d8c325585e3fe55eee878b8a626faccce73679d32811fc5d068c153e671673f4cd020f3c7fb37bc6fd9646931646a","services":["streamer"],"enable_msg_events":true,"port":63110},"up":true}},{"node":{"config":{"id":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","private_key":"4314dbd43bea3cdbe75a24ef256ee0dca9008f5133f8b1d6c9adf9a84210c2e1","name":"node_896c74ca4cc4cbb9d2b6606d0ebfd6427952c2e16aedbf36933fa3d01f1c505fcd663f3d01c0cf096bef9cfd0bae4595ec7c221cfc362e19a5b7c60614a9658b","services":["streamer"],"enable_msg_events":true,"port":63111},"up":true}},{"node":{"config":{"id":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","private_key":"2b4bd5ee9da5de0932418460699900ba0e40139dc910b087c586210e52816b77","name":"node_1e0a46ff50fb6d9a2c218a851763ff86c42e4d61dddffb7188481febc0f3180bc8f31973d336b2a6e25802acd4fed6d905d89c6d4d7d8080fb12741f9c5ab7e6","services":["streamer"],"enable_msg_events":true,"port":63112},"up":true}},{"node":{"config":{"id":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","private_key":"dd2b5c2e466c7276ff4c6c1a641ac204a34ddcb145523ab175701ba31faf44de","name":"node_b2bea653b6ec9629c6f934be72fccf30acf836698e21e81dd8085f070ba8259ba43eee43c342738a4b782f5fbddd44caa28f56dffc08237ca7567c965ac3beca","services":["streamer"],"enable_msg_events":true,"port":63113},"up":true}},{"node":{"config":{"id":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","private_key":"17f5b5341d575c1cfe673efd9957ca29a50fa23c028c5f5f7561b23e7dc92e04","name":"node_5771bef7f50439f9b81d2a7bf7060b1ad4b38675d8f6abbac3cc4c215fb0cb5dd07f6873545b42218337556925566025476e2915b7b98e662a3dcd28bebf0eb4","services":["streamer"],"enable_msg_events":true,"port":63114},"up":true}},{"node":{"config":{"id":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","private_key":"eeb9367b7cabbd3e4076edb5fb97cc2fba7445cf37f523685f2b24e617d718c3","name":"node_0e8c1a6b70524c4fdc492c74348bac4ccd5d140bd41352607e8cfba45561afb1e6e12f3e2fcf03c1778c9ae5ae19cb9218ee2d613983768f54e3f54e69bb6600","services":["streamer"],"enable_msg_events":true,"port":63115},"up":true}},{"node":{"config":{"id":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","private_key":"a9a6414dc37916ed5794a644a51d6cc1c23c27d707b2dfb9957f9ee28af64e60","name":"node_d71c50805f284ed3a759e2e81f220fbc73d6d0a7a261b4c9e7878c3da143cfc07afa83e1635b6a45530f71a60b9f17c485a2fd6617c6c2bff82bacc71c208087","services":["streamer"],"enable_msg_events":true,"port":63116},"up":true}},{"node":{"config":{"id":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","private_key":"29c714e8c1983b179cad17ffaa617cfbdd50272b496803b4a602afdb05d78117","name":"node_06472c89def07fa73188d253cf1acddc2be984842f3a234edb3db95449ba74928ab1395eca1b8978987769863afffb488fc27c9ac723aa24837b66c12f38d735","services":["streamer"],"enable_msg_events":true,"port":63117},"up":true}},{"node":{"config":{"id":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","private_key":"f00cf99cd4b64e4242b7c878a4ce70044f1fe91966dd723b940e3a312f1b9f63","name":"node_eb097186ff58d96a7ead7a7f9c05a44075d84537bd4fd3f82857bf2c45bee1c6dece434a7707cde69e96f02366859cab4c991fdb7615e113a868d4b9c7524a45","services":["streamer"],"enable_msg_events":true,"port":63118},"up":true}},{"node":{"config":{"id":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","private_key":"d089b29e9ea18a2cf17256e0e06c907164f712564fbebce476b40f67e39bcc73","name":"node_57bfbde13c71e035c96513870aa8215198f78806e7cdb01c54fbdb392de2c40386d768d6fdc4c68534a67e531867ca74d8ca4dcf34ff7f7f64ec35edee3e5f68","services":["streamer"],"enable_msg_events":true,"port":63119},"up":true}},{"node":{"config":{"id":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","private_key":"219f34180d582584fdc64b9b7712bb15e490bcb2eaa2f4d2847f838196c6afe0","name":"node_5b4de68680c5d1a75cccd5e7a82319c031f5d61d79cbb6532e1254ab81c833c3fafb54390cca7a770e84690c490fcba90482b35321870f8506335a2f57cc052e","services":["streamer"],"enable_msg_events":true,"port":63120},"up":true}},{"node":{"config":{"id":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","private_key":"223faa782246247751eeb3191f8823874455005721e6738d5f5b5b631cda858b","name":"node_cd0e9a45b45f9a67417fcde29d9f92c45ca4db46eebbfe47dcf6999e23e549e4205f42ada8e3fcd00e2fb5f832bb92a27a59b43c4a5909148d81399c2e8ce492","services":["streamer"],"enable_msg_events":true,"port":63121},"up":true}},{"node":{"config":{"id":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","private_key":"2e3b422e1762ce5c22bc9cd6fa78cfb62f3ada7732d7e0b16d91ecc5f5ab9047","name":"node_5d917ffc9d70a38670941ce206aa7ea1b9ea65c1d783f14ebdf7c7afa6ca8b237112aaa9b1a3f757132093a604ef378280c5bdef02c2688049a91a412c399bfe","services":["streamer"],"enable_msg_events":true,"port":63122},"up":true}},{"node":{"config":{"id":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","private_key":"a3f487830e9fd87b5b404bc91d0f49d866cddfa869d32c08853273b9a2eaea7b","name":"node_26cf4ea45b9a76daab82a57126f9c6f8726d2eb973e205ab4ab69c8b8be11a32a7eb5c3807e952cd428ce5ddd88f143d4fc9ff8c3de3d159855675afce715615","services":["streamer"],"enable_msg_events":true,"port":63123},"up":true}},{"node":{"config":{"id":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","private_key":"9a3fe8b50af54e2b6ea84f05b832426f911dd557e1e874bb291075981a46baa7","name":"node_20f171ab01a814a2856a6cbe7929269f18f6329914289515e2cb9d078ac14ebdae457789dd638c6415b062799114570f556147d4bf9ac850f00b6d0762765ac1","services":["streamer"],"enable_msg_events":true,"port":63124},"up":true}},{"node":{"config":{"id":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","private_key":"8e83e239128a2ef402e58ceaffa0fe2d59d913588d12536ba4e7a88bac14ab5a","name":"node_f0b2f1e8d46be656109adb18c60677ac9eb8fce7f42e15d9dbb25f94b4e426064780eaf32b79954b9bb72ea89953175da8de35380aaba18931cca374a7de2b11","services":["streamer"],"enable_msg_events":true,"port":63125},"up":true}},{"node":{"config":{"id":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","private_key":"81b194e85dff3ff43272bbf73e58a6dac8a9e3ad125f7ba3e71cb5de5341a975","name":"node_a6ca1d5340f2d7021f541c81cf9aea519675462c8443bb6ddd93919962561b8f5a8431c3ec7e7e7d46c600b653e9a0638d2bb07cf4e29516bf9c4d3653f451b0","services":["streamer"],"enable_msg_events":true,"port":63126},"up":true}},{"node":{"config":{"id":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","private_key":"b4ec9b24f6a962422bb63d20e415a5dc2f85168297e8abed3cb20e3fc0d70e25","name":"node_d8cfadac10473b31a4560c711636a05615f13054388065344642ff1d04246fb62eafeec06805264eafead111ed8134e11a8e21f42a0eb950c23b142e627bd8cb","services":["streamer"],"enable_msg_events":true,"port":63127},"up":true}},{"node":{"config":{"id":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","private_key":"cd0667c4d17b56321858cceaca611f1c46758fa276d3d991f3a9fbb0c686af3a","name":"node_49eb706cd7e95ad78502a508487d88b818861d94334aee36b2acef5c25cfff5c0efc2df9dc5dbb18acd4003d5cc0c843d3b40363adf2f62a14c04d814268fdee","services":["streamer"],"enable_msg_events":true,"port":63128},"up":true}},{"node":{"config":{"id":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","private_key":"4556340931a4e95daa2043706f516eba3744d2ba4340bcb95358b58c95534090","name":"node_c93cb2df7ba6de8009872f5f7565891040d42e3b193ef1cdb321a0c167cc8fb8138900982bb8f6918fbaefac6e02dda01ee40f7a6beba1990dd44abe03cc3d01","services":["streamer"],"enable_msg_events":true,"port":63129},"up":true}},{"node":{"config":{"id":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","private_key":"f1b36e9da20cfc2416f02f9194a0522b426be8679b6478118962624b4963af27","name":"node_3e9c0bbd146d8b1040b4f379eecf802c27c4d0a70e64a9fb2e941a7edab9b00396b0b67fc5c891652743cdba3b342973ed49615b32da54b925954a799240431c","services":["streamer"],"enable_msg_events":true,"port":63130},"up":true}},{"node":{"config":{"id":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","private_key":"7f720ab5ccb4e3dbca347ff7104c677d8215261910d8e8e2ade703020d566842","name":"node_b38213eaa5b419de787b70073ad8c7c819e48c5f76dec1507b54f1d7cb027211facbe7a170ac50212abe130935e8947d5a19d6b13790114e71cc18357902a889","services":["streamer"],"enable_msg_events":true,"port":63131},"up":true}},{"node":{"config":{"id":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","private_key":"1a4d1e1d6e198ac61f91d9ccba4212fdd32e9075df2fda41caa11a0a25e694f0","name":"node_20bdc859d58d8bf419df64fd6ee1d4363c1d5f403af3abef2720d7d3933924672e12e23e5d76b28e0f6726acf58bdc5eb258cba635e327cbd0b564523305da75","services":["streamer"],"enable_msg_events":true,"port":63132},"up":true}},{"node":{"config":{"id":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","private_key":"9fc5b25f84b416e8224c296213b062e1dec7eb7074402a494a23cc1c70ef394b","name":"node_c6d1404873174254c0f15f25804da9a9d90db9c11c5cc895fab613b4deb7820f1733680b4ba9e4b61a664642ed6ee9ff012e13a0619c64ae067be6bab26962c6","services":["streamer"],"enable_msg_events":true,"port":63133},"up":true}},{"node":{"config":{"id":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","private_key":"43a6ff2fe67bdd16cdd0a4e7ba3eb8188632a796b90d34b477fcb5e0f5ba0b43","name":"node_f04c3ae9fe957a14c249acf3ea2e8407d04d108fc01e75f6d52aaf5073b3450025012d138a75b857473eea4d20e57c99b92bff9041f269d995543d7c67a92ec6","services":["streamer"],"enable_msg_events":true,"port":63134},"up":true}},{"node":{"config":{"id":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","private_key":"9202da3ce5dfea8df87f9f6145867414b45131634f70cd32dffffeb8975e0e86","name":"node_8e8de10fb3f53bd3a48455ebfa0a38ea5bd28c607e65506b263ece53a24d2361c2af7d7cd207e45b11bf71a3c33fa325fc8fd40a18b9c73019cce219c757c7ef","services":["streamer"],"enable_msg_events":true,"port":63135},"up":true}},{"node":{"config":{"id":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","private_key":"6f53e22eece8ebd80ce64720dacf85c36c8aa737fe54d05c884ae9ad693144fb","name":"node_cdd86dea7dde96ff7cc1e3248fd17d107c83f2cc7ce2111c41530448962763309e91a05b5dad4663d0e02db59ed4129ab0c3e1eedc42c654e39d29f99038063b","services":["streamer"],"enable_msg_events":true,"port":63136},"up":true}},{"node":{"config":{"id":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","private_key":"ba12a0d7056bd5d7f8b80a1e30c126d8641ec4a20b2e8c9b890764785350cb7f","name":"node_da15d60a4b9a8816ce24c20f6c941c51229c1fb5e070b8b29be2977c2f7b41f8f17e4b6efe75f465e7935ded1ba17472f046eac73393db7197018fa86d11c31f","services":["streamer"],"enable_msg_events":true,"port":63137},"up":true}},{"node":{"config":{"id":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","private_key":"f68a07d7241789486ffebae385ee73f2b9050d22612e9770a1aad1870e347556","name":"node_03e478a3aae82e06e215e40272a420037a61442d11c49c367a5ee6a21868d29a17ea8b9284f013d020c4740f296a6a22bc64d33d1c2807f9ab8dc48c0cfec18a","services":["streamer"],"enable_msg_events":true,"port":63138},"up":true}},{"node":{"config":{"id":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","private_key":"f9fa950ad709b5c36e36f5f49a4260ab81e08145d8c10611a2d46e1395ac87f6","name":"node_3df030a522a157e36f6b369aab048b9287792743a411a47073c4f9ef7686528f39bf7bf91c48e4d46afe180c8d08430b012bd216d50876baa3b1e7bc17cb55ef","services":["streamer"],"enable_msg_events":true,"port":63139},"up":true}},{"node":{"config":{"id":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","private_key":"27eb2337ccaec369a786c3e86e92bfc20b6bd03e70244b7d1266e783f087a16f","name":"node_4bd17847bdf60ea93a670a84a0ff8fe028d35228e814d6ebc0ae4fa586ddef03cd79390d541d28ca3c05a7241ffe92ac182e63c251176b40db8fe05fefaa82be","services":["streamer"],"enable_msg_events":true,"port":63140},"up":true}},{"node":{"config":{"id":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","private_key":"dc23bae09e0ef5811f615cd80fa3c264a5011f501f3fa6f91cf6772a408ba5b3","name":"node_f8052e328014f39157036f3dcecdb23419c0959473a88282605f10add681ef5cbfb1e926b522f98b8401272113b677a67225874d1afb0bff4b11140cc071de44","services":["streamer"],"enable_msg_events":true,"port":63141},"up":true}},{"node":{"config":{"id":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","private_key":"f37b323598ac406038a1fba2fb8acf1ac7899c6606f263470141e3d8f364c70a","name":"node_3274b5f48e6929e2305e980b558a4ca3c7cf800b75a6445ea2875cb379e127f3e793e9450a11e927682aa91b8af52e9560dece633833e0f207a8a8a38b7b9c54","services":["streamer"],"enable_msg_events":true,"port":63142},"up":true}},{"node":{"config":{"id":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","private_key":"fa14be3b746acd18c44299337f26807c3f0034349cc7eb6ad398a32061e68e12","name":"node_e59940a6dfe35a6214e2e3daba9ad94e630004cd8f029e13a6649a56dc528ff94bc09d8d21a2f14a56b4ff759b60ebf3d27c1029862c183b8416fa3e950bdb55","services":["streamer"],"enable_msg_events":true,"port":63143},"up":true}},{"node":{"config":{"id":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","private_key":"67c3621e70643b370db5377452ca3a8bfe78a01172983da0ba5fb979ce341bd1","name":"node_f7637cdd5ef26de40b9055c1df91a45725670c8df11ae934c0d99d2547c3eb4c42a16dbb2e75bcaf4b1b9347c48db65f549a0623179a08dd8cbad92f5bca08cf","services":["streamer"],"enable_msg_events":true,"port":63144},"up":true}},{"node":{"config":{"id":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","private_key":"e4e774ffb3fee42b1fb038f560cbb7ef3f4ec4f12d077fd90c38de877841eddd","name":"node_fa897ba112f34839064c6871a4c9504c5d709eff5095a137c6a42726d58eb623af976cb96cc30db67e6ac9347c769f032aa4ebda884285a057059040c008ad3e","services":["streamer"],"enable_msg_events":true,"port":63145},"up":true}},{"node":{"config":{"id":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","private_key":"9fdcb97101ee0351d72b1cb7b832fc95f339a434e9d1e146af4062d0d43a88c6","name":"node_5d96577324edf1b5a1626999925982af1e0ba7bed8edcc3f740ba434f4b003cbbe2d632cad327c76e5b490d08c091c4a7b473353ab59139493657eb9525b8be2","services":["streamer"],"enable_msg_events":true,"port":63146},"up":true}},{"node":{"config":{"id":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","private_key":"05ba41be88727fe8ceb3dd01ae6314f6eb66de9c223da829a6cb0fcb9633dbc7","name":"node_b09af9e5552e72f918174963dad58a4492d3afa120f78e43820df7bff7fae9f6b52bc6c8c73d3a9af91d20134f4ff1b037db2ef0bc3d8c495a771d63de678bc0","services":["streamer"],"enable_msg_events":true,"port":63147},"up":true}},{"node":{"config":{"id":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","private_key":"4f458de05e760aece8dffaa29333d3a51382cceb7bb8265be7a25ea65cfaf2d2","name":"node_1955bedf0bc9044b13a2c16158087123197c74147c86aa3b9389d308a364e80edbc573bcc836d8a262a77f3c9233ebddb1b82eca83cd0a0e4bda6564c443bb70","services":["streamer"],"enable_msg_events":true,"port":63148},"up":true}},{"node":{"config":{"id":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","private_key":"c2adb7237525d3d280b964361432cfe1d2863e3011b4b83167648da04a8b22fb","name":"node_5984a296b49bfba30315501ce2ae88ed0392ab2959ac4e7e6b9a29090f344b9dd13873ca137e8317c402cd2e14a61965d5707065b8ded46c41a054731933719f","services":["streamer"],"enable_msg_events":true,"port":63149},"up":true}},{"node":{"config":{"id":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","private_key":"43223de0a2e5b61580a85a150f19528acd484002efde9df5041f8b93b5d9f0e9","name":"node_9c3be147f9fe0fa34e553d9e4332969086ea7fa65294b61ca35c9f731f6b81d0b70cdcfe2ba52b6cea3c0de14b7ea40031b5cc40661c4bb821147894130d7bf5","services":["streamer"],"enable_msg_events":true,"port":63150},"up":true}},{"node":{"config":{"id":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","private_key":"863d1cfaeee0df7e89ff906a00c0165a9e579fda9f82bc3fd9b694a593e37139","name":"node_ce1309c8505b446363ae37cd3b1ee3e03ced537bed20aca5d8c4be2133917c408845ef5d0f65876974be2803dfb824827cf5c5a2d050d6ef26cdabcbf3a2dc31","services":["streamer"],"enable_msg_events":true,"port":63151},"up":true}},{"node":{"config":{"id":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","private_key":"f8f2976509e8c27362fc450e79db0e7b99ee036277d5a1c860f265be28b6525c","name":"node_3e7820bb15c07f515bd63791b66136723dcc9878b3145fe0f238f6b41e3f2f7565ae55ef24f08ae461950ce1ae0c8a80fe5e4fd4f2f88c4acf4a2c94640df239","services":["streamer"],"enable_msg_events":true,"port":63152},"up":true}},{"node":{"config":{"id":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","private_key":"eac78f03be8f9529f9c85dceadffbc6ff39de01456bab5c864f9ea5a4198ee23","name":"node_dafb58b2fc8a14f2b23b7df33d28aa7847a08f80e9c21a654d4c97d928e1afe6585644d27f22442cf70d229c32783be6a03c0920be153fc4d9f3b273dfa90ec3","services":["streamer"],"enable_msg_events":true,"port":63153},"up":true}},{"node":{"config":{"id":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","private_key":"6488421507de8fcdef9f2e89a73b5e9182ec8c0cb7d564e630dfe38ebcd732a1","name":"node_622646c74fdbae39ba191dbafff4906fb683fe0b0f2c303d080f5577a070876c41c8d3786ae7b953e5f682b8ec647727550d47302229ebb9f82bed24cea61132","services":["streamer"],"enable_msg_events":true,"port":63154},"up":true}},{"node":{"config":{"id":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","private_key":"7f547289aa8ba8dade535a2e50bfc2111536e7149162e360ea5e4db15c12d42a","name":"node_2d6d55edd34c0d9a0130b4806e409bbe18cdda5c2b221cf46136718ec20ffc9d8e92838d78aff92fbcc85f5d081da361dd1e3d7f3d4e1ea57877d6bb7aa0b6f7","services":["streamer"],"enable_msg_events":true,"port":63155},"up":true}},{"node":{"config":{"id":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","private_key":"f3d8d6aa0db8c604198cf9a317b45fb96b8407cb029951d7ef06042abedf5e1f","name":"node_f62bd19b0fd052207743ce53c3d48a3a71e9219b75e41a9497a43e6368e559d5487ff1ab644f2df4106b500583e4344515f73187eec773115deb977b4ebc3514","services":["streamer"],"enable_msg_events":true,"port":63156},"up":true}},{"node":{"config":{"id":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","private_key":"cc5627eea1858ac168bbf1e34a3bb3410ade5b379cde7f67601bbe359506e76d","name":"node_a1b2d0c6f24f5924c61e057fc65b994d9a6755560d740018b4c9ad0bb69212ec69974e22cb037dfeb7ea90a4493997f4c94029870bcc5fd47013b51ca0a26b5d","services":["streamer"],"enable_msg_events":true,"port":63157},"up":true}},{"node":{"config":{"id":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","private_key":"77d99b72e19bbe2da2d6d931653dc7b541dfe27092b944936562bafddd6114fa","name":"node_188bf77c9c1e45f009efe7aefdb040bdb47763980fe7eb0851295d657fa2a8978efbd2997c1dc30f4f0874eecf9ca9550487cf41da237b84d071963d35b6baff","services":["streamer"],"enable_msg_events":true,"port":63158},"up":true}},{"node":{"config":{"id":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","private_key":"e6874592c3f2d2fa94b126d565cec571767e64ef9067970a9f8d1f8ce7e88d0f","name":"node_f06ec3a90d34300f9fa2d48aea0c6b5f2f01f7833ffb0fad30e7f57e3916e344f3a4f9efe38e222443b8b00d3c7f5221c672491a129e4958e574afc283bd45b1","services":["streamer"],"enable_msg_events":true,"port":63159},"up":true}},{"node":{"config":{"id":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","private_key":"d733b22563798aae07facf0a489367c7cf0d6d3ebf786992b6ae98696d295cd2","name":"node_3c6faa2e75a1699ddadd0e21fd35d3d6215715cfdc2dc89961cfd66773d2541776e785f3ebc833a70e3d1017a4edc571a5d5d9f9fbfc3fa0a8588f6c5023c164","services":["streamer"],"enable_msg_events":true,"port":63160},"up":true}},{"node":{"config":{"id":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","private_key":"145ffd39a00647c0142f3bce7ba2f21f4e168663488e0683b4c8cc72afa7b02b","name":"node_56e8f792ec9a75ec9e91d472b8a4b023655dd68c2a448a33397b125fe3584a5efa1b492e47077b24acfe0396b73e1cb564a6a6b2aee1b457781dfaf6d43fcaed","services":["streamer"],"enable_msg_events":true,"port":63161},"up":true}},{"node":{"config":{"id":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","private_key":"83fa451e08386b0966a5b8ec4b56c861bc367f0cbaa7e6e3a8c20564dbc0f1af","name":"node_3572a22097a313b3adef95a7b6cc679f8d1201a156d764e61a9fbc63d123fb4826f7125402fb6569beed359e1c1e5e6cb6993a75975da6cd4ce15669a2eea758","services":["streamer"],"enable_msg_events":true,"port":63162},"up":true}},{"node":{"config":{"id":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","private_key":"2057ae928cb89d7759bda21739956c8527bf11bb02571ee2e9bda07702779aae","name":"node_e3f2e777a96b2137b3104b84d5d827d484eac9ee1b585430e09f790d7e26978da12802325927c3c483bc19973e09cd3f70c513c34798e5da650f8d2f0c8c5c47","services":["streamer"],"enable_msg_events":true,"port":63163},"up":true}},{"node":{"config":{"id":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","private_key":"4fb682db9263cc8ae4d32757a0837296654120fc17593b9d0c3219a307193655","name":"node_1480f62d85ea32226d9f77ccd31780b3e704fb60618a588ae85dcd1c0e84e878c5fc092adfb306e8ebc7abba9ec429cb2447754502ef847cf931467f31fa50b2","services":["streamer"],"enable_msg_events":true,"port":63164},"up":true}},{"node":{"config":{"id":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","private_key":"7f212e2fa6d29b93f32d27a27b02eab5b9aa946ba044f1a20bada9f7db133907","name":"node_3540d888c3207d6df233afd1164ff9dde2551730862772547e04f7311de364968e113f38a7dea1ab0916a7f8307017de5b49578fa4ebcc39651e541fde51be48","services":["streamer"],"enable_msg_events":true,"port":63165},"up":true}},{"node":{"config":{"id":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","private_key":"d209b8a302d27579c28dd86104e2eab3c74101ff06bb17200388b614ec3f05ff","name":"node_077bcadade93e0d361e94f76dff464d61912bc067ce2ce17ebcabd757cca201cd64624ea809d99dd8ecb749d40528db9b3eb503ef5ec05e8845044cfaef720dc","services":["streamer"],"enable_msg_events":true,"port":63166},"up":true}},{"node":{"config":{"id":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","private_key":"f0317274abc992d76728cf9a59b6dfd16b1422fea0c0089a47f0cbffbce53c34","name":"node_73be4d2291c68ca4554a86fa170f7595210e1b6bbbeef3c1d5623a2b5d03a8fd6e26caa26afc639c20c8a351a89dad1086f91734f09afab62d28ec17b700fa01","services":["streamer"],"enable_msg_events":true,"port":63167},"up":true}},{"node":{"config":{"id":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","private_key":"8d5bfe9aaf70d634b185efff991adfde6d80ee5d1c60e68eb1a105c17a4e03af","name":"node_a5cdff211813e17fadd43ec55a6cf4e97e6ca0c3b2cef0db58923b27d36207fd1a77146efb6093bd94d7eb89cc77d8c735fc64ab098839efc74a00b5e8687555","services":["streamer"],"enable_msg_events":true,"port":63168},"up":true}},{"node":{"config":{"id":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","private_key":"bd99f18955320e921a98f8103d8b4c1713d800d49c0a7bc946cb52fdf79e03d4","name":"node_27fb8fcda1986644f985d68430c399f0299644b00b234c355362721081d12f9eb7686eea8f92eabda1d342bf56255e51c07b200c6233f95ac009f15b874eee97","services":["streamer"],"enable_msg_events":true,"port":63169},"up":true}}],"conns":[{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","other":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","up":true},{"one":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","other":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","up":true},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":true},{"one":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","up":true},{"one":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","other":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","up":true},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":true},{"one":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","up":true},{"one":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","other":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","up":true},{"one":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","up":true},{"one":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","other":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","up":true},{"one":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","other":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","up":true},{"one":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","up":true},{"one":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","up":true},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","up":true},{"one":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","up":true},{"one":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","other":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","up":true},{"one":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","other":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","up":true},{"one":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","other":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","up":true},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","up":true},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","up":true},{"one":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","other":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","up":true},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","up":true},{"one":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","other":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","other":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","up":true},{"one":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","other":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","up":true},{"one":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","up":true},{"one":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","up":true},{"one":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","other":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","up":true},{"one":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","other":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","up":true},{"one":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":true},{"one":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":true},{"one":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","up":true},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","up":true},{"one":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","other":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","up":true},{"one":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":true},{"one":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","other":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","up":true},{"one":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","up":true},{"one":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","other":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","up":true},{"one":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":true},{"one":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","other":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","up":true},{"one":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","other":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","other":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","other":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","up":true},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","up":true},{"one":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","other":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","up":true},{"one":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","other":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","up":true},{"one":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":true},{"one":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","other":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","up":true},{"one":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","other":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","other":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","up":true},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","other":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","up":true},{"one":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","other":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","up":true},{"one":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","other":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","up":true},{"one":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","up":true},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","up":true},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","up":true},{"one":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","other":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","up":true},{"one":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":true},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","other":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","up":true},{"one":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","other":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","up":true},{"one":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","other":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","other":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","up":true},{"one":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","up":true},{"one":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":true},{"one":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","up":true},{"one":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","other":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","up":true},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","other":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","up":true},{"one":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","other":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","up":true},{"one":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","other":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":true},{"one":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","other":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":true},{"one":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","other":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","other":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","other":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","up":true},{"one":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","other":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","up":true},{"one":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","up":true},{"one":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","other":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","up":true},{"one":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","other":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","up":true},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","up":true},{"one":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","up":true},{"one":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","up":true},{"one":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","other":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","up":true},{"one":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","other":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","up":true},{"one":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","other":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","up":true},{"one":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","other":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","up":true},{"one":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","other":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","up":true},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","up":true},{"one":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","up":true},{"one":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","up":true},{"one":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","up":true},{"one":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","other":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","other":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","up":true},{"one":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","other":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","up":true},{"one":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","other":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","up":true},{"one":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","other":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","other":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":true},{"one":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","other":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","up":true},{"one":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","other":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","up":true},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"c35893ea35ab764005fd81ee10d1a9ab3f361e044aa53e28ee64effca928d09d","up":true},{"one":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","other":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","up":true},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"1385e97b879da9021aba65b2df36b91650aafb354a09c5be8a9532d1eb7d472b","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":true},{"one":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","other":"e39e8092c97b53dbeaf5ca73d95c71e8e41a2906aaa377fe0c1b23752c8c7423","up":true},{"one":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":true},{"one":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","other":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","up":true},{"one":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","other":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","up":true},{"one":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":true},{"one":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"c7fd88864731e6b79acf436a76908b91c61ba07680699c2cda316179c3719e8a","other":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":true},{"one":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"609958921d9107eaae6f3141e94f12b3a28fec203eb0e5b674ed8268934becc7","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","up":true},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":true},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","up":true},{"one":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","up":true},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"740bebf4546e2ed32b2bd277555685e3be071aca4b1990c7c095e12e24fa4699","up":true},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"30a0ef4bf1f66ab4d02a027a24ba1f9b288ea93e86a5ceab64e1985aa4efcbd0","up":true},{"one":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","other":"2feed66b03b7b057e1a64a3f877ad9c28ada96e30b98a78393b54ea31b98f4fa","up":true},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","other":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":true},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","up":true},{"one":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","other":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","other":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","up":true},{"one":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","other":"87e0232acc7127ea47604a5bfe84d80e38292902502c2a714e0f96d8090eb4fe","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","up":true},{"one":"1ea89c3f15b82385c5df8810ec7cbd30e8e4a4e05c1ddf5dbe7102edaa07afd2","other":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":true},{"one":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"11a60d43d627470df1c1ebdc404093f6ae83c75b3a95469316b89a0185eeaa86","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"6cf1d30b063cf8352795a92c6af26c154fc44be06c69ea9fd4d9f6dcc626eda1","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":true},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","up":true},{"one":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","other":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"b1bf7a0572c1efcf034bf42f54f7334743c59f77b67225aa3c7d93552074ab56","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"ca9721b51497c5d570738eadc37c79fc8d5525749defb98c252371793c2a6f5c","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":true},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","up":true},{"one":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","other":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","up":true},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","up":true},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"60ad041deb8cf72f0d2b29accb204a7e1838347b250e105ac72a0a4f17dc5f47","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"d79838c419be793292a24feaf1b9d26c67f0c5afe15bae85689420de3436ad95","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"40871cbc7eff896f15e558e2c638ac980fd89c718881cd110a086c3397b564c0","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"83bc840da4e1f9201f0e85db2c44364f06c188fedef30fd2f72cbde70f6cfdb9","other":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","up":true},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":true},{"one":"004710b2e2194a8cd11292efe8b6f81bec4c1b673a9c8a45b7b5391f5f049895","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":true},{"one":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"ea51459c5ac142391297bb73aa26501eae65bc6f661b534a91a344de8dba2f4f","up":true},{"one":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"b9e5006b90bffae809136ad57e36b784b18e35f7491c47319807f6869d624465","up":true},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"7692399f01177f2a8976d4c393a6813c53820e5f4edf54934414d1bcdfb8392c","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":true},{"one":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","other":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","up":true},{"one":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","other":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":true},{"one":"8230e499c9c01cb6e5717336f3a88b6a8c1010081712fbfab96c301e23044d14","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","up":true},{"one":"bf7b0b9825b9c878f7730014c7458fc52ee3490c98ee5ae2f647a8d73e4464f3","other":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","up":true},{"one":"3d3acee3657d98168e2f4e6463947646560b5ad1ca24b4a8a97e4284c39b02e1","other":"4124e83515480818c250a3ca2d8a7b159c890983c35165ee531d2e15066c7203","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"aa19fb3565a2677828b1384f483e3eb7ea112940d21d0aaa7b16139c753c69d7","up":true},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":true},{"one":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","other":"1943c1442da29872e77e4cfd282e9a81490c613e99cbe4503e470b7f23ce75fb","up":false},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","up":true},{"one":"3e4fbab650cbd539383f7e26128c0aaa770f12c4a1fa44d553de9dda073f0cb2","other":"314e1e8a8d9ae18d0b5510341a6fab0f8654a7263a5db895480aca606b6a9859","up":true},{"one":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"f29ff736fb944f8f8339a4e10f69ee72f108ed1d68b5a80d06a814b0807e8686","up":true},{"one":"1ab1591431f8ba2a5aa1110ff97926cbf80d080ded09192dcae0c4bfeaea1ec0","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","up":true},{"one":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":true},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"d192c64e09879b5107507e193fea23b0244a574e0d66e444f7a325de32c123fd","up":true},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"6640a8343b810399525545ee1545a50e3c76548f776c83d55465071cb55a00b1","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":false},{"one":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"f99503dc6a4ace3317320d8454b3ac1a5977f508ae810c4d506001ed0126838b","up":true},{"one":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","other":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":true},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","up":true},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"f80e1ce23869c7da4453f06521fa320632057194c9f9b3dcdd777cc1f06603eb","up":true},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"2aef8c4da4e38b6a885785e406912cef6087344b4be9e135e2c597468b003315","up":true},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"93868ef90fc89dff185d7e59dba34b3e9449ab0336fff12c64ff4ecc3f033b78","up":false},{"one":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","other":"83119770a801a40f0f4015ce8a8cc6cfa6dbc211deaee193c5db05130002f9a7","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":true},{"one":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","other":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":false},{"one":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":false},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"db596f4ff3f8c25835f9f10176e87a8823eaf1d39a513882f1ceab931dabfed9","up":true},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"d382e36db7f13180cca7b169e8511c9b920bb481a340d8a61dd9e4969a5605b6","up":false},{"one":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","other":"6c1f82c3a7bc3274cfdac710caec4fc814c9f5a6797674457414dd94be577a9b","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"e3c3f763b77a0bb72932d5d3dfca016e28d27b1c377690d2b074881b1a2a3259","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"7f620d306e05bac0f07838b7de6a2db69aa6494df3db09f26624ed167318a75a","up":false},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"a8ba308efec0ed318d68bd3561a41fbb0af84383e3f5333e2642ac9d60005ab9","up":true},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","up":true},{"one":"d3864c160e6d8fcb3f540b864e6ee11d91ca708f2cbe1e5fd04beb2b6c1d8930","other":"811d75e7ee506a20ed40f8451066f5d9f6d63c5774004aa26bd30540137ffd30","up":true},{"one":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","other":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","up":false},{"one":"0400b7958d9f0270dbe3146b80fa821dbae8b0cf70d11c9a3d3d14b14012fe4a","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":false},{"one":"f07c1ee0f9cadf2971a0cb0022d1c67fa82c79f63cb98769b31ccfb04d05c0a8","other":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","up":false},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":false},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"a12e73ee9cf7369825c1423608ce079cf70df75d0f0bbc56d07d484169fca26d","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","up":true},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"311fc84bce90b1bc1d1983c78e45b1e82a703cdb7cfbe54d51e9bc40cfe04103","up":true},{"one":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","other":"44540a152f9fc924f10fefc013059d9ad228e74f921a67866ef28758f1886320","up":true},{"one":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","other":"a60b45dbab9c1de18783fed9eed8af6dabafbc33fdc5b3fef1ef4569bc6c70d9","up":false},{"one":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","other":"6ac71d55e984abe323c74ea85ac1aed1b06e56632c07c389e780268274a23810","up":true},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"d68e095e77246c3c08df2eaec294965bca2d01fa2819d9cd06c6ef8730c59ab4","up":false},{"one":"feb3455336b26365b81dfc8cba2a390690ce996e07fcb7f1226720d263205adf","other":"f3a1438cfc8b09a3a9c1fc8455ead9041e9532ef3e9a77ffee8e5ef62af2670c","up":false},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":false},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"7628bcf64532ca3ec293d26f60791a2a62542b2f5f3f1c782799075383ccde00","up":true},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"b22078d9b5f3d57dec3fb1796599d5f04fcb32d4288939431ecea8516be76b58","up":true},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"fba89f80c35e5f6ffbe6e5521f2011caec985d820fe42759ef1aaa36d4902f37","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"fa62b685ae8a9aac669d245102ce68b030f0f270d95d7c88969bfdc9978f9070","up":true},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":true},{"one":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":true},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"5d6da3260504f8063af24960ac901bdc0c54a126b82d415656a083c496c8b6b8","up":false},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":true},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","up":false},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"f836b3ca82f75bc0901d83b2c02e24174bee78c5eab9b55af9c492406942637a","up":true},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":true},{"one":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","other":"d7f956d0f6445202699bf63700da408237fdcecd27e2e8ad969e51d7e8e61483","up":false},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"c243003b111259b3cdfdd4acc3610ac8da65bf58288d51133d03e680a42d7034","up":true},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","up":true},{"one":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","other":"cac97c7026184a2d6ba2b17fcd0c5440bec538961af836a60f2fadb78a310a77","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","up":false},{"one":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":true},{"one":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":true},{"one":"97a5959b95662f6e820a1b011a7e87568e0efd2257a73bf91868c98c46e5a571","other":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","up":true},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":false},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"3f1ee2912d5446e4cdf7a42582f2e30a24bcddd6422a9b6a61f287da256d0bde","up":false},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":false},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","other":"981be0d21bdb11ac807dc29937c6a3ac2ae3c2f45269c0edc21172d5550f4da9","up":true},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":false},{"one":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":false},{"one":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","other":"57dfed651ba7f0ab6f9e1d5d2d4ae18fee51a200f50925a88c861982bb4769cb","up":false},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"8fe212fc9af12821f59b5f364f86f78b545be501933b926fc47b6d7deafca941","up":false},{"one":"8ec663c22eff8ed185b8194c1240ff58df131c5f310df0a91b9790ec166e4346","other":"8e317152297d5d048ca4512f733e63e48c3dc66910bad541d33f3cfc76828cb9","up":false},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","up":false},{"one":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":false},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"d55213d3dc27542a780472564a4a8c1ce47668e05710be178baf3238ca8886b6","up":false},{"one":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","other":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","up":false},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","up":false},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"5b36b0ab4872865a4f86f2aa137ba8bb4273090e57fde30ec27a58acb158c22f","up":false},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"d9169f80683a2552475d60e6982f70c6605f9b40300f2b60895aa21cdc42db89","up":false},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":false},{"one":"f2b809e97d3c3a652c4ddce19ca12b01c1de25f2ce007d561fd5606e85540d64","other":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","up":false},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":false},{"one":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","other":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","up":false},{"one":"8bf59dc9ce97e6e2f2be364380aca38f98ddec248e730422f581f5bb56171e34","other":"8c5b95bf1743e2d8a97210c5b64b6732f3615c4369fa3a52e426f93e168ae16f","up":false},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","up":false},{"one":"d87f983aefd8f732c29718a95f4dfc54a10640d5c9fdd73b772c3c30df269d88","other":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","up":false},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"e5cd769dbcc429587e3a92b192575965c0ac18e88c9a54b9f75936d929c43c62","up":false},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"6838b88ff71c5419d3fd22a4c007a7b822405b1842d53427a9c075d093c13047","up":false},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"92e2f8ec301e5858f7168b785040955d28bffae0c98e5d3f59ff9fa8636fe423","up":false},{"one":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","other":"9cbc96aad8fbdde0c2f084f3cef79b56c150ec7fc30dcc2d8535efe9b337f4c2","up":false},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"e4254cda903275296f17b47e5dcabbf16d1fa7432b64e0e6e0562fcd89de534d","up":false},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"4309c2d963d91e65f7e8e8ab42df52e75f8d377d4eb07d1a048c0082af4f501e","up":false},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":false},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"931a36980ca0788616cb1c9851f6069e44d94671a2a056e12a7d7cafe597dee5","up":false},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"7e65067fa5db52d40c0a162432200ca6d0d3917b25cad15ce498fa6b5375bc8d","up":false},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"6e8315dc552c8112dcb01e9302b5e47fef7fbdc81fbe7a1d0b27e0cf80a65ca4","up":false},{"one":"6632a8b23d42dfc55a103d625a3644f0067abaae554eb75a78b1094ad7b24c16","other":"61207f4fc13c899b88e9b727eb202a8bab00868bd07d945100b2e56dbcd67683","up":false},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"06db6e244213745e02175cca1101e72799c09236838affd8a020a05e5b88e2bd","up":false},{"one":"6a57cd355d641d1506957a988d93b2d3f9a613a7354c24130ad97dbc4c8296ce","other":"6aef7e94602e6e74ab4cdb57668fb751fa20807751f786d0232870da0ae32cfd","up":false},{"one":"96e99adfb8d8d5386d57334975f9525de0abd4418e528f2a8c1a61cc21871423","other":"96b723de0840f656c914674ad20204da830c04d4d6956c32e20154cbcc40f9ef","up":false},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"e0ac6b34d04bc036026767288a8f0f96720f4a3efa5b52b3b86439fba562bcf4","up":false},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"425959a8050805baa98c05ccd640261edd3f26e6cf3205b4a79d2b086c070339","up":false},{"one":"48a19dea03eb8068e8925407c582a0913fd24127a4f76b38360171c5b0b0c545","other":"500f2135db1adafe22d8a62af63f1659d6f4538f490ee8151e9db970fa24389b","up":false},{"one":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","other":"1f2a162a4e78c8935ed17eee206a8512ef37e126bb7ad9ff744f7b46c4b19aee","up":false},{"one":"78bfaf122d10ee5e5304fdd247434c02b32de577bb410dc04d8ffe1906294fdb","other":"7c766b57273777cc67f74870560449c9542cfec734b58b167aef99e09aeae962","up":false},{"one":"a3fcef8ff8bc702c6452b0c4a7b899dfc551bb8293b17f2f6133cc78d66581d8","other":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","up":false},{"one":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","other":"4ae614490d8739205773d16c8027c46b67d93bd336c33071d8707fea6ac1acf3","up":false},{"one":"7bcfc9285f6a2ce0d3c3cc4455c026a00e96ed6363016e09ed62ec03a2c9f681","other":"7f5f9f955e368c906746d42953e30e781a8eb73428af5aa608af96af9bf4f60a","up":false},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":false},{"one":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","other":"ebf9a6425b47a78df1c99fe4d62a48c26d2f4ef966a8592802d5b5e95e6c12eb","up":false},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"18f6cc40773a42ddad3e3e6c5fd865a652cbb42e9054f0e46dfaed17a41d4f4f","up":false},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"aec520f507eedd5d752b6ba8a0b509f14105e5e457eef0b6537015e39569762b","up":false},{"one":"954a22c6fd7d63fce47d8685d32bb892bcc0feab4209d5dc7c3601efc28e7d6d","other":"9f9700ca395f36c84a38838c11f6889d00015d97aac7943c27cf74393e3fc22f","up":false},{"one":"ea9490f17813e0e5f39e8065f4c3954163f3bca6e80afca7a2c76d5ca3116e53","other":"ec3b5ea0bc43c1ef1ae2744ea747887dc58ef3526ea8601856f1e18e7f01a197","up":false},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"4778cff42bfc5ecf6a87e7a4e5a632839d30b8fb10e62f81eb75d915e6f457ae","up":false},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"42365cb134e329e7205559838f924affea893c832ea9d86c4e1b19ec2c6ce5b1","up":false},{"one":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","other":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","up":false},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"237b54aa7ef077972fc65fb222ce70df0129f8c8d4d35505fcbdc281bb7d28ce","up":false},{"one":"dc2ae81b708a14f8b6e134986075835994c71d284b9bd9fa19d2efa73346f35e","other":"d80b59b187b7765439b0e4c940f766ae71a903f599ac41a84d972e8703f7c9ff","up":false},{"one":"059a2d0e5db2c0204c10b66ef04bacc96d64453073efeee81ba7e30d43061a61","other":"265040d12d0b79c8609232060b3ddd6ac16fb895b52bb7f3fee5c6e8b63a4d79","up":false},{"one":"a2504bc38c94b7912bfafc42c7a4531cd27775473071e7a26173c4db932bf9ec","other":"ac23190ee9ee30dd793bf3edef355450522d3f56973ab6b1acbb6dfd9d64137a","up":false},{"one":"2a2bcb40404a427a50538ad9d1bfff1c5b1a7673990cbd20d830787fd96a00e5","other":"2dc2914f76ec9b291b2085bea6d2e0f6d45beb55bba5e3a90059b96e83010318","up":false},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"53eaa90913134a5bdaa780d18bcd33e85b1932d9b15bcc1096fc4658ea5ea7f8","up":false},{"one":"48274a353dee6c042537c999f89ccdddd7a9c139fa8b824750496bd7cf2726b2","other":"436c8c2a56cbc03310237c646c7226f8e4bd672f68251ac8cc9678d3126e7aa8","up":false}]} \ No newline at end of file diff --git a/swarm/network/stream/testing/snapshot_16.json b/swarm/network/stream/testing/snapshot_16.json deleted file mode 100644 index e818da05257c..000000000000 --- a/swarm/network/stream/testing/snapshot_16.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"a3790562c8209b7e96e7abef9ad28de2e470a01927234e4848966e0cd15652e9","private_key":"3ff3a0c7dc8b63cac9255233d84cccad53d61f8c9e47539329c07e4f248fc6dd","name":"node_279f0a191892115b8db4e2689cc5e1bc19019e8f5228f4f093f35c48fa2f606fd00a2ec5cf0fa4657ad3606e14643c3be8d49350ad2673f2ad12e17c0174b0d8","services":["streamer"],"enable_msg_events":true,"port":62851},"up":true}},{"node":{"config":{"id":"4ce65548fc8490c02e4c6c0549be7329a8a05c090d62870ad1075e52e204a3b5","private_key":"1ab5fd3f1885661af1829b42683ca1379ca90b1b2c5a0132027346c74001a154","name":"node_2c3d17a3b019d9d32922f06aef03ac03f67777e382f0b86c6e4dac07e590f2dbf4cbd1cc7ed136b52bba897e7163dee926caa627111db6d948581ad1b2edbc3f","services":["streamer"],"enable_msg_events":true,"port":62852},"up":true}},{"node":{"config":{"id":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","private_key":"a90fea5197ac84a162db7a06ec739e075ee334026e792d83a3269526888c8b5d","name":"node_6e327c2d9d3ffdae707ed067d15b83ad0ea81b96bb2a07331436f01c1e194ed90f630ef0eb6511f4849ede30c403e3c4ff3c2cb8021317de97f3ed5b1d990f49","services":["streamer"],"enable_msg_events":true,"port":62853},"up":true}},{"node":{"config":{"id":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","private_key":"76b6f09c28f5568e7724e9850116bdbd6356152fefedc4b0a9747361d712964b","name":"node_9aa1df8ddddd035e81ffc950f063714c3b6be24013108f8b99c32c25fc3a8582904f68c73fe63ebfb96143a12ab398f36c4070a3055c039491ca2f20be6774c2","services":["streamer"],"enable_msg_events":true,"port":62854},"up":true}},{"node":{"config":{"id":"fb555885b96d5742a10e688bd7c1bb842f0434c319bf076d07f545e4c0550601","private_key":"f7e7d60abb7d43d973131804e684ec99e77e81bf38165dda29f3ae026eb169f1","name":"node_a1226991909b92dd4f22150b798e2b6312ffc62bad7a47d250e811c7e60cf5ceb6a87998f295e0bd392c0f5c15213115000781e498dd7eae79b67c7e7e19cf81","services":["streamer"],"enable_msg_events":true,"port":62855},"up":true}},{"node":{"config":{"id":"f64d3106d2bb99e69e26c07de168f7fceaf85672859f7c1c038fd4dd6b6d7588","private_key":"f88cd88c2c219d13b699ba7c7cf9adf16fc10be5d8e1f35b2ea260e7987ab76e","name":"node_1dcbfc79418f9a665e3154e07663b296ce086e54c23458b7113a011dca62e635245cab144d392716e5e90b60336b60927270b72bb4a1c5c85fbf959060fb3ee4","services":["streamer"],"enable_msg_events":true,"port":62856},"up":true}},{"node":{"config":{"id":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","private_key":"8fa1673a72b2ab000a4a7c8ad4540484d5286b69c93a5c608ef0977f783b7c4c","name":"node_571afb6ce94d28cb7d5cd49b3af35d2b1e44c917a9d3d207ab6c7ae960eb625377334e62317f6c69b3004e2eef92682649df828f4a645a75309ee7014ee4a940","services":["streamer"],"enable_msg_events":true,"port":62857},"up":true}},{"node":{"config":{"id":"615c7fcf7a80635e42719c0ae1fb924ba703ee39e021898be56b81ef0f575f62","private_key":"daa9c74fbb0b897acdf20f1b955a608b086ce5b45dc8e2b76a44f277d25e3377","name":"node_f1e669bb6e5b89c04e07e3dcdc445d498ac54c8ab2e9a62e622a492b6f9781bfa27f75ef7448d06caa28d9afa40c1c089066358cbcca40018bc0f903eab9508e","services":["streamer"],"enable_msg_events":true,"port":62858},"up":true}},{"node":{"config":{"id":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","private_key":"eb94b600be5949e3ca545e81b4d0a5fff3ae9f51f63c722d10f5098f9e1a883a","name":"node_526d25e0aa47e64d8f681255348a3d3c94fc68bedcb7111532f4ed50d47ef064b1e97e3a6bcd13ac8eaf44ce676b22d2b343a94dfa38b48cf964bfc3f338d4bd","services":["streamer"],"enable_msg_events":true,"port":62859},"up":true}},{"node":{"config":{"id":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","private_key":"4e5d074bc46efbd0d18310e6a74e72e98b92080329d9c4e2b5ae99eb2fcfaf89","name":"node_fa81c440829adcbb3eba9196dc8255e319a976e53db0aceedcda25c2605f21b8778bf8c89e08744f7455c909568855f2a5be7bc88646796d21598ddda810390a","services":["streamer"],"enable_msg_events":true,"port":62860},"up":true}},{"node":{"config":{"id":"6d8b6881d36bc5f4a4a82f5d707807af2eef2eaf4527eb6b16f62cd75a92bb8c","private_key":"73c752d26f3438acdc54e9eaae6b1194d3706c65932939a593f1c8c5d451daf6","name":"node_5702eeccd7cb8c18dd25e5700919a544fb5e15fd53c5d4b56226021a9031a2206a694eb3b7334e4bd24fc510f7c1ea4f7a98e17e3394b4bd8d356a4d048b47dc","services":["streamer"],"enable_msg_events":true,"port":62861},"up":true}},{"node":{"config":{"id":"55cc9bd08390eec7bc050924e3011b251c6c4e088ac2adda27493064b75f0ab8","private_key":"2e6321d9dda81fc0f863f09868b280dea3300105cf9d224294aa138caf10b4a6","name":"node_6311f5a830849b47094d84129fd987fcd3d511d000bf0a8b888c9a457545950fdae6ae10a2a85b47721a1d1ece8c1c62d866a26577380048d30f205c4e7cd7e8","services":["streamer"],"enable_msg_events":true,"port":62862},"up":true}},{"node":{"config":{"id":"a873e971042dfd5aaeb56d7d9089e35bc8dd410451a66740ebe7ea0752870120","private_key":"200b7caaf8a33b8ea47947eb842fb8d8aac90951c70bb2f555f902380eb7f1ee","name":"node_dbef367277df652c8d3380efcf5f9d445d77fa6e7957b50b2467f90b7190e70d4eb4febbbffa6b3fc2b04bbf74dc7191e2b98923c3a62ecb80ba5336195994c7","services":["streamer"],"enable_msg_events":true,"port":62863},"up":true}},{"node":{"config":{"id":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","private_key":"b58a24805bb0c417e5666f2bf3f3342b8359d3c0d30a631c0104fcdfb6d0809b","name":"node_a4cdf723b3d7ead36bcb1bba582c8758271d5f08651694e1def0ae2ceca079d4fca81730a84a14749a81bc3ea41a66f1320788310823de5d1ceecd608ed5b88e","services":["streamer"],"enable_msg_events":true,"port":62864},"up":true}},{"node":{"config":{"id":"fc373cf4e892501073ed87b98231f0d001e6db70a1a08148035fbdfa2dffb3d3","private_key":"422d3b2c1b37b851ad524c8f26700fb5eec0d9a2fff1cb157ae931baa52d9521","name":"node_67cc8be0fd092c82e53efc53c418db257eff1135ad0058fd10e3eb77b205cb3e6fa87dfed4ec008c371f77546d4c117d8c34734bfe594da4c96fc08e0d2ede32","services":["streamer"],"enable_msg_events":true,"port":62865},"up":true}},{"node":{"config":{"id":"af99d46c187735ff037e1264f2dbca2985694d906de0e2c9e52d5513a6feb331","private_key":"7871010c8b88b9594c71b9f43aecfefdca39da348e31f47ef2645c20c100d072","name":"node_4da7d1c9577afb52a5fe1de9f99824ceff314828c581caed8a3a33168df699d7b3befb4e888419264a9eeb3c9e5e9dac468e01edd71eb6f0ef41d15f7651042d","services":["streamer"],"enable_msg_events":true,"port":62866},"up":true}}],"conns":[{"one":"af99d46c187735ff037e1264f2dbca2985694d906de0e2c9e52d5513a6feb331","other":"a3790562c8209b7e96e7abef9ad28de2e470a01927234e4848966e0cd15652e9","up":true},{"one":"f64d3106d2bb99e69e26c07de168f7fceaf85672859f7c1c038fd4dd6b6d7588","other":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","up":true},{"one":"a3790562c8209b7e96e7abef9ad28de2e470a01927234e4848966e0cd15652e9","other":"4ce65548fc8490c02e4c6c0549be7329a8a05c090d62870ad1075e52e204a3b5","up":true},{"one":"4ce65548fc8490c02e4c6c0549be7329a8a05c090d62870ad1075e52e204a3b5","other":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","up":true},{"one":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","other":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","up":true},{"one":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","other":"fb555885b96d5742a10e688bd7c1bb842f0434c319bf076d07f545e4c0550601","up":true},{"one":"fb555885b96d5742a10e688bd7c1bb842f0434c319bf076d07f545e4c0550601","other":"f64d3106d2bb99e69e26c07de168f7fceaf85672859f7c1c038fd4dd6b6d7588","up":true},{"one":"6d8b6881d36bc5f4a4a82f5d707807af2eef2eaf4527eb6b16f62cd75a92bb8c","other":"55cc9bd08390eec7bc050924e3011b251c6c4e088ac2adda27493064b75f0ab8","up":true},{"one":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","other":"615c7fcf7a80635e42719c0ae1fb924ba703ee39e021898be56b81ef0f575f62","up":true},{"one":"615c7fcf7a80635e42719c0ae1fb924ba703ee39e021898be56b81ef0f575f62","other":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","up":true},{"one":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","other":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","up":true},{"one":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","other":"6d8b6881d36bc5f4a4a82f5d707807af2eef2eaf4527eb6b16f62cd75a92bb8c","up":true},{"one":"a873e971042dfd5aaeb56d7d9089e35bc8dd410451a66740ebe7ea0752870120","other":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","up":true},{"one":"55cc9bd08390eec7bc050924e3011b251c6c4e088ac2adda27493064b75f0ab8","other":"a873e971042dfd5aaeb56d7d9089e35bc8dd410451a66740ebe7ea0752870120","up":true},{"one":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","other":"fc373cf4e892501073ed87b98231f0d001e6db70a1a08148035fbdfa2dffb3d3","up":true},{"one":"fc373cf4e892501073ed87b98231f0d001e6db70a1a08148035fbdfa2dffb3d3","other":"af99d46c187735ff037e1264f2dbca2985694d906de0e2c9e52d5513a6feb331","up":true},{"one":"a3790562c8209b7e96e7abef9ad28de2e470a01927234e4848966e0cd15652e9","other":"a873e971042dfd5aaeb56d7d9089e35bc8dd410451a66740ebe7ea0752870120","up":true},{"one":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","other":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","up":true},{"one":"fb555885b96d5742a10e688bd7c1bb842f0434c319bf076d07f545e4c0550601","other":"fc373cf4e892501073ed87b98231f0d001e6db70a1a08148035fbdfa2dffb3d3","up":true},{"one":"a873e971042dfd5aaeb56d7d9089e35bc8dd410451a66740ebe7ea0752870120","other":"af99d46c187735ff037e1264f2dbca2985694d906de0e2c9e52d5513a6feb331","up":true},{"one":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","other":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","up":true},{"one":"af99d46c187735ff037e1264f2dbca2985694d906de0e2c9e52d5513a6feb331","other":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","up":true},{"one":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","other":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","up":true},{"one":"f64d3106d2bb99e69e26c07de168f7fceaf85672859f7c1c038fd4dd6b6d7588","other":"fc373cf4e892501073ed87b98231f0d001e6db70a1a08148035fbdfa2dffb3d3","up":true},{"one":"a3790562c8209b7e96e7abef9ad28de2e470a01927234e4848966e0cd15652e9","other":"f64d3106d2bb99e69e26c07de168f7fceaf85672859f7c1c038fd4dd6b6d7588","up":true},{"one":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","other":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","up":true},{"one":"fb555885b96d5742a10e688bd7c1bb842f0434c319bf076d07f545e4c0550601","other":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","up":true},{"one":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","other":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","up":true},{"one":"af99d46c187735ff037e1264f2dbca2985694d906de0e2c9e52d5513a6feb331","other":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","up":true},{"one":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","other":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","up":true},{"one":"a873e971042dfd5aaeb56d7d9089e35bc8dd410451a66740ebe7ea0752870120","other":"f64d3106d2bb99e69e26c07de168f7fceaf85672859f7c1c038fd4dd6b6d7588","up":true},{"one":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","other":"6d8b6881d36bc5f4a4a82f5d707807af2eef2eaf4527eb6b16f62cd75a92bb8c","up":true},{"one":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","other":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","up":true},{"one":"55cc9bd08390eec7bc050924e3011b251c6c4e088ac2adda27493064b75f0ab8","other":"4ce65548fc8490c02e4c6c0549be7329a8a05c090d62870ad1075e52e204a3b5","up":true},{"one":"615c7fcf7a80635e42719c0ae1fb924ba703ee39e021898be56b81ef0f575f62","other":"6d8b6881d36bc5f4a4a82f5d707807af2eef2eaf4527eb6b16f62cd75a92bb8c","up":true},{"one":"a3790562c8209b7e96e7abef9ad28de2e470a01927234e4848966e0cd15652e9","other":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","up":true},{"one":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","other":"af99d46c187735ff037e1264f2dbca2985694d906de0e2c9e52d5513a6feb331","up":true},{"one":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","other":"55cc9bd08390eec7bc050924e3011b251c6c4e088ac2adda27493064b75f0ab8","up":true},{"one":"615c7fcf7a80635e42719c0ae1fb924ba703ee39e021898be56b81ef0f575f62","other":"55cc9bd08390eec7bc050924e3011b251c6c4e088ac2adda27493064b75f0ab8","up":true},{"one":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","other":"9121c3fea7ccc99775fb5ade460f7a0cb76003231d13d44ed3e4f3cca1947227","up":true},{"one":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","other":"f64d3106d2bb99e69e26c07de168f7fceaf85672859f7c1c038fd4dd6b6d7588","up":true},{"one":"6d8b6881d36bc5f4a4a82f5d707807af2eef2eaf4527eb6b16f62cd75a92bb8c","other":"4ce65548fc8490c02e4c6c0549be7329a8a05c090d62870ad1075e52e204a3b5","up":true},{"one":"fc373cf4e892501073ed87b98231f0d001e6db70a1a08148035fbdfa2dffb3d3","other":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","up":true},{"one":"3c4287b7722f71eb03a3d54fb6b18aeb0bf8495cffbe8c103fe90229f08392ca","other":"4ce65548fc8490c02e4c6c0549be7329a8a05c090d62870ad1075e52e204a3b5","up":true},{"one":"615c7fcf7a80635e42719c0ae1fb924ba703ee39e021898be56b81ef0f575f62","other":"4ce65548fc8490c02e4c6c0549be7329a8a05c090d62870ad1075e52e204a3b5","up":true},{"one":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","other":"9fcdef2b818e8a4fcc07fedb706d9f88cc59703230af4f52043c84f9bd37cc57","up":true},{"one":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","other":"a3790562c8209b7e96e7abef9ad28de2e470a01927234e4848966e0cd15652e9","up":true},{"one":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","other":"91129c7135bff2b7cb1e1162bdd5399192790bdb4fc2eaa5b4cea53fe7a69d8c","up":true},{"one":"8bf97ec29b6b3ca638ed82fa30d03d0d8309c9e8f1db2071f4a37de805327108","other":"fb555885b96d5742a10e688bd7c1bb842f0434c319bf076d07f545e4c0550601","up":true},{"one":"84842bc52628c0bed88539ee40f211de307b3e728ab5c0ca78032b86028b49db","other":"fb555885b96d5742a10e688bd7c1bb842f0434c319bf076d07f545e4c0550601","up":true}]} \ No newline at end of file diff --git a/swarm/network/stream/testing/snapshot_256.json b/swarm/network/stream/testing/snapshot_256.json deleted file mode 100644 index df5f7f4e6e8e..000000000000 --- a/swarm/network/stream/testing/snapshot_256.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","private_key":"859f1f6b352bfdd6f8b7a7a80ef60a7fa41a514a091d5c19d0ea7ab44c24c614","name":"node_57fb1bb32bb2b1a87e44c6a7557e9c47c2032d107bcb0e34acd9ffd54d5d3df5701232db16f62f7549ba2721021898b03160b1dc5201e79606648c1dbc4a373b","services":["streamer"],"enable_msg_events":true,"port":63226},"up":true}},{"node":{"config":{"id":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","private_key":"681d7bb10f2022ae6f74a5afa7e0d42dfa6efd2e55abe22a395db640b6f5c70b","name":"node_7f357b8d81bc2e5c6fcb081f23a42b3e2439f050d45c45851994a268d1c71fcb1f39f8c3f75ce921d3fbf80fc0e73f0b9609d72001dc4a6b65b526d312a4f43a","services":["streamer"],"enable_msg_events":true,"port":63227},"up":true}},{"node":{"config":{"id":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","private_key":"fe0d4b827c015eddc1928a6f9691bb26ba2100a6232168890d11ebc7f7222891","name":"node_cb94a8270d0050378116b5815ff17dafbe20f5303839c4fd57b981d4687a4b145e4bccec7e9af9b9475005930148ffbfa97781a0762c8e9f352dc95565fc8732","services":["streamer"],"enable_msg_events":true,"port":63228},"up":true}},{"node":{"config":{"id":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","private_key":"0172e330c8b3ba8151689716c455034d43e9600eafceaffa6c9b162c36920109","name":"node_76cbf9fc0f3517fb615fa96104780218e85d064ee5a1d518f3b78f4dbebf144df38c427445fdd6c9b436489c00ff9497d747a8fd70f380f95601d59e52e021e8","services":["streamer"],"enable_msg_events":true,"port":63229},"up":true}},{"node":{"config":{"id":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","private_key":"2e9b4ad5021be5fdbcdd374c9569d467f370261662cb56e23b98ff5588c8d99d","name":"node_e023a51c5bd26e1754d6461345143e94baeac799947579ec7adeccd105de39f85afbceeb5037cfc0b820b9f4446433f034d9e7de7326d45df5a967a8099dbb10","services":["streamer"],"enable_msg_events":true,"port":63230},"up":true}},{"node":{"config":{"id":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","private_key":"059dc1a60c68b91d75f771391bae103fb3d7dc30c5dfdc9498980591bc09e0df","name":"node_68cc8b9a995eef6170abf88bd5fedca06ffcc8d75f247f6041c13e7dfd292727ebda1ff86b776e33b6634355c55e0f8c22fcdb5f9a6e2f22fe1af7854c3b4273","services":["streamer"],"enable_msg_events":true,"port":63231},"up":true}},{"node":{"config":{"id":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","private_key":"bf0aa2cb855d1702f8353aaf7cf03b846cbe1bdc6a0b66b18dfa8f03ab7dee43","name":"node_54b3c57a4adf4dbaf31b85ed1b8dccd6249faa16dd96dd230189f47f57970caeed36627cc8e1b0794707418d580f5bd6001c07be6a79216695f1253db24926bb","services":["streamer"],"enable_msg_events":true,"port":63232},"up":true}},{"node":{"config":{"id":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","private_key":"8b9685b4c43d0de26290fc8646737787fe8ff7e6c32c082060380b41fe2c5f3c","name":"node_df4c3505e09e1baa88470117b964e758c94f77a4546489ab5ab7f4aebfdce424729ace8867475715fb68f05c66c9674a5767549e266c4fadd1c703ddd735908f","services":["streamer"],"enable_msg_events":true,"port":63233},"up":true}},{"node":{"config":{"id":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","private_key":"a5bf3b5b166cc21128321759e5be62f691455e382d8ed35e48805cbb2d884a97","name":"node_24662a43944228e4ff74736bcf0a0a4f79c87ecfdb739225b2fc45110c11bfc38aaf2d09d98e5817477848e553f187ac5408bdb864518dfa7f5df542768828db","services":["streamer"],"enable_msg_events":true,"port":63234},"up":true}},{"node":{"config":{"id":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","private_key":"b64868a78b7e20e3914999f841765a445e99246e67a0d8706639a2e940c1dfef","name":"node_27d9048707a89f1a61e44fdae523c0128f2a7050308bd3cfefa6c3e03040a0e22f11ab41275f22b8706e6695ab93320e2af35179d772581db5f49f960750f2f7","services":["streamer"],"enable_msg_events":true,"port":63235},"up":true}},{"node":{"config":{"id":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","private_key":"f72fdd8aca59748c35831f451f405cbd0aa950ce62699f1f7c9c10d76cf1e588","name":"node_ea57884dd42aec5a76eab43483bf7c4ae2c19eebf365013731de64494d10a3b4cfe34c86c79437f9012bc8cf6bd761435eefadec17600f4b9e4bc234532d6282","services":["streamer"],"enable_msg_events":true,"port":63236},"up":true}},{"node":{"config":{"id":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","private_key":"9a8b5a154d6b376a8d8a1c5357272f164206a01554ae4fcdf479ffa3e80ec4a6","name":"node_3b570117addeec03c2694baf28e246f91907268fe665c6c90356120332794258ee57a60853c19e9fe25d042ca42a5be7fe0797d84199174de8132f1ef4a9349b","services":["streamer"],"enable_msg_events":true,"port":63237},"up":true}},{"node":{"config":{"id":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","private_key":"5007a8f6bdeaf7620240976e1d41aca23e841378ec3a157b199d5fea27b1e0c7","name":"node_0cacda5560faff9d20e29a0625d3cd340ec075f198a50ab8b79338cee0e0db84c7c7e71042fd8c8f73e507b570de5d26c39473136b575f0167625a1168309ec5","services":["streamer"],"enable_msg_events":true,"port":63238},"up":true}},{"node":{"config":{"id":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","private_key":"a7d2d7f12b632dd6c409c8e7cd5da6f2009d1ed9d27eff101c0e850934695ee6","name":"node_88d5c5fe61ee1e6fa5878e0eaa13bdabaa0ec3d38a5d25b95a467da7627424f25fb5d30535aa0a5ad01c16fe2598dbf570b78cc152a7f4ef66d46fc9ae43592f","services":["streamer"],"enable_msg_events":true,"port":63239},"up":true}},{"node":{"config":{"id":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","private_key":"9e7d9771bc8ee20b1bf0743ba1e8cf1501c54606fcf9e174930cf61de03ba696","name":"node_80d997b87856099d844187d3d1fa40846ded652a62c1611b35919c2543915b64ff62476636488556f678e436ea26fcc40db7c6b6bbcb78f590d61c1ff0e424b5","services":["streamer"],"enable_msg_events":true,"port":63240},"up":true}},{"node":{"config":{"id":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","private_key":"f28a26c4cb4589d2ffe6731d30ce96e197684de24e886f252b6cda9eb4bca962","name":"node_6bf9fb6a25521c16c2ebeb6203d046d7dd40f29cc2ddb067c0222ef56d7012d2ee5d037f71f6668ea56767610b2a54c144aed74b7f68d06993cbd52fa1dc7630","services":["streamer"],"enable_msg_events":true,"port":63241},"up":true}},{"node":{"config":{"id":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","private_key":"03c65c150995cc6ea4d0a925bbeb304f8b289d695855b69197bd9284c537e8e5","name":"node_23f9bdc82efbf57d3d40a1f2617d0311678fb4a3d6a50cb7e608c649bb618124a76c7ffd17387de963e1cd28d2bd5a61c98613f6e009a8a2a90d989827b35de0","services":["streamer"],"enable_msg_events":true,"port":63242},"up":true}},{"node":{"config":{"id":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","private_key":"0af9f76e6251f7612eb7fde7f20ebf9dc8334ae1139a6e2dd068a97a896860ba","name":"node_f6ca39b3ad803e99f4e4e9cf759fff6abdf06e6972bdbe524f6eb930c669d6f0e9b91f3de9df394b0d661b068273861391bdbac948ad911351c48cf02f874db6","services":["streamer"],"enable_msg_events":true,"port":63243},"up":true}},{"node":{"config":{"id":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","private_key":"1058a6e2e08d811ed1ab6b6eb927323ad28292591a70269330779d52491c6d64","name":"node_385168340139236a0e0f537fa693122db9fa02a377c96f31aae54718e92624fc0288164877e63616651565e055c53f7074ab2fdd18a837da6faf644941305bf0","services":["streamer"],"enable_msg_events":true,"port":63244},"up":true}},{"node":{"config":{"id":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","private_key":"85e1a2673b4ec4f876778b6fb175fae0e36e9e6456c8d8fa2a11bca2dcc8b376","name":"node_9194a3a4c8f3235203e48bdb10902d958d26c342805ea6365af9711213536509719d917c694f9a4fbdde6889a4c92299a5301f0275bda4dbcd2541b5bff5b271","services":["streamer"],"enable_msg_events":true,"port":63245},"up":true}},{"node":{"config":{"id":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","private_key":"54906c0600d9da9afc0e64bb94c7902ff60042840c9143900f2ae8fe9ba69c63","name":"node_c2705ee7238ef9305e4da196653cde707649435a1e8b5b797d164e5ca06184a77af5bd7fa938c995fdfcbce724fa7eca3d908ee34891ab62cc6dfd411c3fa1da","services":["streamer"],"enable_msg_events":true,"port":63246},"up":true}},{"node":{"config":{"id":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","private_key":"b798233dd61ca3bf4bcf5729b06de9bee5447b3c0c4f604eb12e856ff1363492","name":"node_bf4ff51cc3d9a9d8cefd7e346ce1384d06450228a6086fe12fb0c60fec54bb6478f090bb638fbdbf8f41f7bc6420cd8a5c8b1b8566229b6851167375ef412f46","services":["streamer"],"enable_msg_events":true,"port":63247},"up":true}},{"node":{"config":{"id":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","private_key":"529b3a0af71a5e49aeaa2a7ec622d5a1fb3a920fa64f8d200af8f96f0c2d5d21","name":"node_f33d1f3e460574706ac1c7fc9ebb4683b173496ce3e80017d1c3521bca03d5a41a9c7a6cde8347d2238917b7cc58cab000ce7ccf6bb408561015a2ecbe613408","services":["streamer"],"enable_msg_events":true,"port":63248},"up":true}},{"node":{"config":{"id":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","private_key":"d6dd6c5f414a03e6e909bb7447653cbdc2b5adf6bcb2a4643c2cc7572e574a11","name":"node_083e67bb19e30d14e4df6d2483367d6659d9b56744d53d9cf7fd15954c327e1bc88a5d0db8833634e1dad7209164451f8934b59f76b5990059261abfd650519a","services":["streamer"],"enable_msg_events":true,"port":63249},"up":true}},{"node":{"config":{"id":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","private_key":"ad02d38ce01c0291ad949b92338b10b0427a30de149df0a3c7457c2b2340a963","name":"node_0c14dd51a56130c51009e3ce47c96b2afef26b7e86cfca65d8a9bae1abef13b3a7a192b422d894c39e24ab00be412d166a3571cc259ff4462d4ad8925a153766","services":["streamer"],"enable_msg_events":true,"port":63250},"up":true}},{"node":{"config":{"id":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","private_key":"5f33ccc756728e5919332381312dc8eb9f6009e9a407654eb70b995c12338ee7","name":"node_855bdf057f4a6b095e2000ada199447b5b4f2f8d78d2ecbaa0ff1fbf761788870ee999266ad3b26efa02be1a46a4d92ac0debb85a2ceab3442394ee7d99e5355","services":["streamer"],"enable_msg_events":true,"port":63251},"up":true}},{"node":{"config":{"id":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","private_key":"7645086a0c4af854131d0ff4a95ef3a1d8ed9bb6620c934708a2b4f317c6f964","name":"node_b53078000796f1cdb04dfeac424d5e3e37e30f00bd5bebf9a9ea0525c62917612b3a8f508df6bea59e3c7e4cd1aa530841f9a8af54e44f5617a13dee2c6ff007","services":["streamer"],"enable_msg_events":true,"port":63252},"up":true}},{"node":{"config":{"id":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","private_key":"96bc72358e15d649f871e17f6fbb7ddec911aaeb3b5bbd55929512756cee6a67","name":"node_5526d86ba9df651091d88460a9bedb9cedb957d452a635e1db46b9fed78082022adec0047cd7485956a4ecbb0e18107595de0de3c35242527cd302bf74a19260","services":["streamer"],"enable_msg_events":true,"port":63253},"up":true}},{"node":{"config":{"id":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","private_key":"3348eec47933810a23d583715b1a18b2a8332e8cd45bdc57bcc5232c6b5c0164","name":"node_a7378ee34876af17c6cd94a69b6b741ec7891ff5375bc4241d48608d047455ed48e6baae80ee88d4710c69ae615cf195cee26c94b54de1bb935628ce1e3a723a","services":["streamer"],"enable_msg_events":true,"port":63254},"up":true}},{"node":{"config":{"id":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","private_key":"553bb09d30fcd504ead604d830aeb0e3d0a5edfa58c94ec3da1508184f7c059c","name":"node_3e488a7208ce0e097ce47fc6651a13e95cae137d1a054a09b04d2f59d45faa2594a8c3b395e77ad1a3c2edcd827dda73c0c97dbaa6d9519a79184a0aca01ac4b","services":["streamer"],"enable_msg_events":true,"port":63255},"up":true}},{"node":{"config":{"id":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","private_key":"60b600c6cca2712771a98d797a46fbeb7be68a054d94d8eaabb8ecac6d3520a2","name":"node_07f25fdeab2b44b2e92fc80fca7de9e4a8547d27a98a54593b3395c270a9ff3f2a5da62a2e8531ce86359f0cdc5b6513b773dfd64cce1b83e47065d9760a2c7e","services":["streamer"],"enable_msg_events":true,"port":63256},"up":true}},{"node":{"config":{"id":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","private_key":"4bb86dfcc439dc83032e6189165d986a8f315558aa7fe1b6bb2f91e521a837b8","name":"node_0f9f7e2dce4ca266c3ac0ec3a8854200b54487f5308e3db418461aeb5f67c81d332619b6441b468e480941e63100ed1b263e7adc20689dc3dcda578bfca538fa","services":["streamer"],"enable_msg_events":true,"port":63257},"up":true}},{"node":{"config":{"id":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","private_key":"ff9eae2bb1fe93a164f54d3ac907b4c4ec79fa41eece5a44aeb70c083ad80ce6","name":"node_a1560ce7c1f1d5972f027a8e9cff820611d84764aa067434a75b63887bc4268a259101486d34b7fe83dd735e799789986cd3e9b156c86ede598bd86af4454924","services":["streamer"],"enable_msg_events":true,"port":63258},"up":true}},{"node":{"config":{"id":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","private_key":"f23f43541bab9bd56083d663c140d382c5a9461060c285f1c1b1c6621d8e2e1b","name":"node_e06a789a7f6988e1ba5e8358b6cd4292555c7f9f7f0dda6fc01cc26d24e49a8c1ad694423ad74aec6d80f4b99e2bedc49b6a5f2670744cedee3a3e1848e6dd07","services":["streamer"],"enable_msg_events":true,"port":63259},"up":true}},{"node":{"config":{"id":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","private_key":"e3853d7bcb9111bc645eaaec38093b38a0b16e80774deb42bbf5431e78e9ae9a","name":"node_57b47f692f4d69a5d2c9c193680eb4ccb5a6c574662df0138504a549f3ea74f20c5b866ac4d9e76c4b49c83f5fd692ead928ea20dfcf643a11a1c1e841c0ec42","services":["streamer"],"enable_msg_events":true,"port":63260},"up":true}},{"node":{"config":{"id":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","private_key":"cf8c79a1a70472ac10e1dcd59e8a498cce13cc78f13a28a1b31ef8070e8201af","name":"node_2ddd49fae11d8bd2e7e75a481be267fa846f51cc1160bc326aeea51c542323ff444909de11e2731e835140bc0b1b32020e1e73fa652511a381222bf0aebc4081","services":["streamer"],"enable_msg_events":true,"port":63261},"up":true}},{"node":{"config":{"id":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","private_key":"872f89492c87094f84d4db636ac19e5c87ac57cce008931d2db6d7aca72dc552","name":"node_420b9c90584651c5a3fe3c16aa377444a321dca934f8a097d01a616554067feabebf2fdc8d2a25797f29a8fef30d5e2c82f8e85b20f509a880367b9b0ccdea47","services":["streamer"],"enable_msg_events":true,"port":63262},"up":true}},{"node":{"config":{"id":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","private_key":"9c7cd9b75a3b821c0ec74e08d8727fa6ce5aa184479038762b1ae4f3c07b3782","name":"node_5bf29c02f07faf7ae8e46389e1b98df4f5e88c9316b5151685e6ae7b4e622cf171ff09f996aaa8ad846643b3bfcbd1ad96cdc249afccce439bb5c55246b95801","services":["streamer"],"enable_msg_events":true,"port":63263},"up":true}},{"node":{"config":{"id":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","private_key":"ea03297fa8e550df89d0595b3026c5367bd7b0076c7a9fd5c6071f0944373202","name":"node_e3c8a97a2d95dd543f9e2b41d9dce6256e284296f866f4f92e9925f8c7519dea23fd6d1a11153b93c10d6a32295e7b9bcc16024e690e4a0dc84fd25ee0f31b2c","services":["streamer"],"enable_msg_events":true,"port":63264},"up":true}},{"node":{"config":{"id":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","private_key":"dc424f98922ec5d19a5a8d5ee2acaf077778ed0fd92db276f88bda3cc4fdb5a6","name":"node_7aaf7817b93aa6d2f50513791f9ad7629a901ed0dcb151189f44763f83423446b20ec79a48fa260cd9bc2907d5f0ad06b2c4c5e6d812f3d8876c8020ebe41019","services":["streamer"],"enable_msg_events":true,"port":63265},"up":true}},{"node":{"config":{"id":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","private_key":"baad13cad07e0edde7209f5e70451c82d07d1c4d4bd5ad6f85acefd48d14a253","name":"node_062e0ca43a1885c4a7ab2a5169790f9081e3e9a2dfa286b8cc592d5ccbf13d7a82b72d23361a19026d04fcf41b752ea320d98359d770aedfcee626e21c3494b3","services":["streamer"],"enable_msg_events":true,"port":63266},"up":true}},{"node":{"config":{"id":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","private_key":"613f528e83e5bfe55db16791b917891c139ea8ab7599058a204c7836f71feb95","name":"node_f9ffe87c52ff4c22bd9696af32e0a9d34bb81fb84d9d8bf5aafe2ef9696e7b3d6460bf2a93aecb066133f53416bde841a02d6967bd06e3d4a714f3b2c123a947","services":["streamer"],"enable_msg_events":true,"port":63267},"up":true}},{"node":{"config":{"id":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","private_key":"873d0f70715479bbed36c4b74c9391b723fce386d150bbbd613d33eaf08cf257","name":"node_bcf8e831821a5bca359fb824c7dc4d66906de82f3663a0a853d96880a8ca0bdddcceb1b66dd1f13f75ee20fde50fc9de545bc25767f228baee910e0dbfa8cc27","services":["streamer"],"enable_msg_events":true,"port":63268},"up":true}},{"node":{"config":{"id":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","private_key":"48e7cd643d45488597f25de324e8b7553c26e1cf8e8d44261d610ee9041c898d","name":"node_3d2df188704eeac09c8b291bf275a73888199a231c832c51dbc3d746968d4b51a7d5eae0c7c9b8c8e19f5e28d38c375e01abefa343f31dbe221deb837ab8a0df","services":["streamer"],"enable_msg_events":true,"port":63269},"up":true}},{"node":{"config":{"id":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","private_key":"f88a54bfc74bebed6bc8bf6d7b98aad4ea4f8b8aea6cb1514aecf398bee41960","name":"node_8f88c7ec044f758f29bd8d12a5170bd973aec8f6cddbf512b910c4b75a0fec09c5e198bcd65622037f897759db68da2328b4a7ca93585dc9cb62e46d2a6c0864","services":["streamer"],"enable_msg_events":true,"port":63270},"up":true}},{"node":{"config":{"id":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","private_key":"a5b02d5d5ff64f5330758019a5ba0583f2b74b423be4695b4ffd94231ffd58c8","name":"node_4314b0b04331973ed29a58843951f144ac3d09bd5d57b6cd9aaff9b73a7b2ec81e344a3e4ece462bd2081b837a06310e787ef3bb889dabad46fe7efd394c8342","services":["streamer"],"enable_msg_events":true,"port":63271},"up":true}},{"node":{"config":{"id":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","private_key":"9e96b56ea6abe86960b688d477b9c689309a7f304c5e4bd108459144e68448c4","name":"node_3612863ce0456c91785a829bf5c9d2b2fb97dda083a1847e5a4ebaa6fce1260faf4d1eb374c2225431a82774163835fb59c8cb0fa9fc0969eab5410c71109cc2","services":["streamer"],"enable_msg_events":true,"port":63272},"up":true}},{"node":{"config":{"id":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","private_key":"5bec215e5024e8ce65d46fbf9b69e1718c1173478f8654d2ef451b6217ac6db3","name":"node_2ac522ebfa49d37f86c6270ad4cdad0e766493f0e463b18c9906c70fbd2e5c6ff6b0d5879de6e3894418370636963a78b0c0cf087a8684c2ca30c9c736e49228","services":["streamer"],"enable_msg_events":true,"port":63273},"up":true}},{"node":{"config":{"id":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","private_key":"00dd6637412fc5209eeee1423b4eae49fbba97d8d5c37c9ae6819f7afc53569e","name":"node_62666b24d1026345349edb6a878cdc27d6fee8254e83f79a298ce2805260d97aa46423deae440f86ced5cd99b30e970c8e1ea1046752b17d8c80dc68d9a49b60","services":["streamer"],"enable_msg_events":true,"port":63274},"up":true}},{"node":{"config":{"id":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","private_key":"88ceb50dc965b4e3279c8e7729db14ea34238126f1ab694c621d5ab9183acb52","name":"node_9ce6b9decb69d66075993e903a0727ec109a04335634616097c0e60b08f94f764634fa00891b1070f6ea1ce896bc7d11d3aea92a00f281f902d960894cef296f","services":["streamer"],"enable_msg_events":true,"port":63275},"up":true}},{"node":{"config":{"id":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","private_key":"638176a3cb343c140131c887892f37f9ad69e9c87c0a256dbbf2fbf8dd2a6b08","name":"node_b870935867183bbfb84add16b9f56c02c834b7042fc24ce6bcb2a7f174e6d2239357a00be4272c1ef05c7f9baf5a9f16b53bc18328a9b7aca8540c2916805b57","services":["streamer"],"enable_msg_events":true,"port":63276},"up":true}},{"node":{"config":{"id":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","private_key":"4da9834c8665dcfed17ee5eb89c5bfa3c0d1cc4340088a4038f746dae4cc23e6","name":"node_c83985973a9564ade7d90aa54911ac57077600676a1d27292d98e058bf1315887bad84ccd708cb7f52a695a1405fb7d491d7ca2ae9caa3ff58a5ad78ce4dc9d9","services":["streamer"],"enable_msg_events":true,"port":63277},"up":true}},{"node":{"config":{"id":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","private_key":"05eb5751d81653e8ce409be43c9da42ff90f90c6e68981e69cd03a867d93b800","name":"node_acb4088c27ee2ee130ece3506596432afdb9e9757ec11ebdd35c5a6e87239545c48466913a646980104c8fd7a9a335e177f04efffe9dc952dfd7cd5c1bb9aac6","services":["streamer"],"enable_msg_events":true,"port":63278},"up":true}},{"node":{"config":{"id":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","private_key":"846035be661387d6163b5472ea225ecc9d3851349f480fb901d2e31bb8ffe858","name":"node_b4fd11306b1416a9bcf4719578976188e104b8c5028b9abd3214d257446b97b70a22e6c00934d80caddde15e8e4d16af03bb399583047983fba373d8313226b7","services":["streamer"],"enable_msg_events":true,"port":63279},"up":true}},{"node":{"config":{"id":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","private_key":"b34c69cee56a834b8a36ae964f1847d1825821a21d104396039175a8dce5ac73","name":"node_7b35c856916eb3fc1b1f451667e240b95aff8f4731cc0f6743740923081ff1ddf2eec81bdccf4691a7bcc053d23eacfc15809c384a73448f618317bf605bd1cd","services":["streamer"],"enable_msg_events":true,"port":63280},"up":true}},{"node":{"config":{"id":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","private_key":"3d1ea95ac16f7d903cb8630a8c06052560a974b0abd3410d9f8b2968e7cf653d","name":"node_2ab9513899c3c829b6284e56bf2b9862dd0156ec052b58615dba77d450dac642e534ec36ae5d3234262aff54e19f99856e908b9d8c1da660a7834a445610715b","services":["streamer"],"enable_msg_events":true,"port":63281},"up":true}},{"node":{"config":{"id":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","private_key":"70a577ae497edece947ef065da29014e45dcc1d942969597600a64b55e8bf718","name":"node_e087230634f556b818a416b66ba3f1d1dbe3e0dd0698bbb26fa86a2499acd169466f564dc18adf2f9be4d1ada0e86c11549754097601e10aff4f3a57ddffa24a","services":["streamer"],"enable_msg_events":true,"port":63282},"up":true}},{"node":{"config":{"id":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","private_key":"28ee397105a113c5c4e7d7cb1b3dd17b6db66c3cd8f3b621df0271e544fb446c","name":"node_66beee3968dbcf3addc6feaf070a4e3e82b5bb164fb72f40add89f732c12e8d0a31a7ee1f1e24a4674e4dfc9a4912b02c17ce3c224d257d78b7156544d6507dc","services":["streamer"],"enable_msg_events":true,"port":63283},"up":true}},{"node":{"config":{"id":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","private_key":"b6feae1f667895ada3116380a2cabb0c702b44b24d45415edd143d27dfe5643d","name":"node_a08e47137bf611dfbd20308a22bdd3ca00121386f121d6d712ade86e9a1601a4237766887cd91c8516e20b6e323d2ef49c1c7e177a0afb4c813f0f344daf779b","services":["streamer"],"enable_msg_events":true,"port":63284},"up":true}},{"node":{"config":{"id":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","private_key":"a643e845285aa039d6f84cb124b618bac45c970fe0b15fdbbbdef834300b4857","name":"node_990b1db3ab1390219e8866d39fa4441bb5bb89ad786b3e255771869fcd08906dcf63f34007481769c7462edbcc665acc0a552e3733360b8d8c310c9321a5550f","services":["streamer"],"enable_msg_events":true,"port":63285},"up":true}},{"node":{"config":{"id":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","private_key":"1b31bc34d4ea49b0c1df457ad06513d0f47c56ab106b0f0ac97c43ccdc64db31","name":"node_7865b82e44add2cea6ebcbaba9c152184331a2940fe73f6f9bb940bda8a59ab4cf4760894b9cadcaa54e36fbb712ad619346a49a85e32cdf2b53cda1ac1e0658","services":["streamer"],"enable_msg_events":true,"port":63286},"up":true}},{"node":{"config":{"id":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","private_key":"b380737ac46f320eb5884ca8a60e1693caba904545b68396e33fb92cd19aa18e","name":"node_292c78c8e41606e98428096bc6f4609a7aa48e5c4d17eecc64d65faae4a7270b0c15f0cd74274015688ea0a9aff34f215c29118222e362a29c8d637963973a55","services":["streamer"],"enable_msg_events":true,"port":63287},"up":true}},{"node":{"config":{"id":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","private_key":"d18c1536cd7d9771bc9b64595184285ed499519ef810b3f013fca2fc01018048","name":"node_ee36d1d5dd69fd30242d7da2e941b34ade5581c7164fcc43288ecfc52937a98f1b31ade5d1e4dbf611cbe1c7875b2840c89435081cde471c271d7bc60e9ef211","services":["streamer"],"enable_msg_events":true,"port":63288},"up":true}},{"node":{"config":{"id":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","private_key":"186743aa8dc07042c40bb95b2efe30149139f3c2ea4a4bd193d3be68e8f4485a","name":"node_bd1a7c63fca9e1fcc67d7fd62670beefe2bce483cf1dc1233ee85eb90db607917cd9a5d7170b10e80b925a20e2af2c54d286b01805ac34967410859f4f03da09","services":["streamer"],"enable_msg_events":true,"port":63289},"up":true}},{"node":{"config":{"id":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","private_key":"2e960819700f3330b00d2d58461403843026ffc7629b2514568c6b571fc99488","name":"node_9db1f94d74a00d1e5e2a391f1bcddf16b6d0670a2c6d91d946d38112c58634444b6fea8e8c05ab4b73bacdd62a0b575f6fb8729978edc216c7842b177b9f9cd9","services":["streamer"],"enable_msg_events":true,"port":63290},"up":true}},{"node":{"config":{"id":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","private_key":"50c27493a6d9ddee175040dafa1f40c6ad503b55590479001ec085212c5cc08b","name":"node_934a5fe1b91c1891ef4df7f67c027e0eb115d4c2ca4a1b76a135ebd4315c4fb835d6625223194e6a134407b38b0d3928fbc7bc924a3c6a538989a6cf200bf4bd","services":["streamer"],"enable_msg_events":true,"port":63291},"up":true}},{"node":{"config":{"id":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","private_key":"4c67752b215e2cfc06120964f06976fce2a1dba599c0f32c0f4393b9d77ef872","name":"node_485825745d97654cbb92a14e0cd1078691d3c28f4d82b1046284b676a42b44ca58eb43474e45e415d3bd3f3c383f9a1a3365821ed7ba6a9f2603b29d58031dc7","services":["streamer"],"enable_msg_events":true,"port":63292},"up":true}},{"node":{"config":{"id":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","private_key":"21acc46816414d3a1d76bca30d2c2e1e55d420e9ce704d0720696f7f7fa0bf33","name":"node_5bae82d4832092c17bd11474f7748015b8b69b896ab8f683a7c0024fc98740cecbb9e31c6275269f9000e5bfe51d7f45cd5dcd4433e0c87b5741685b40fe3983","services":["streamer"],"enable_msg_events":true,"port":63293},"up":true}},{"node":{"config":{"id":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","private_key":"4542e37f43858e396004d8d8801bae1905d2496a3ab44f75cc29bd2c2a472f94","name":"node_732393b99c490c76fa45e3e404ee095f2fa445fcc123af7ac8ab1d2fdd7cf2483f5b82bb818bd8a82b1a3b73e63bcc2c83d8f24d9aad9afe36503735e7967be7","services":["streamer"],"enable_msg_events":true,"port":63294},"up":true}},{"node":{"config":{"id":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","private_key":"a8e588af7acfd6024b3d71be7be630345ca80708a69214fd31e3b4485f039c90","name":"node_4de378164d77a28c90cf162dd1b465e0282ee17aa7d3bb3179252466f72da33a36c9f298f7c9498e38dba4018e7ce3e5fe631c83842cd9059e23a7fece366d87","services":["streamer"],"enable_msg_events":true,"port":63295},"up":true}},{"node":{"config":{"id":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","private_key":"e3d1a9d4621d7f77d9c2fa224f0d8c8211c2bf461554a1d50afa8f34a82a4754","name":"node_155e4879643a472420012e040a87dbff776fc1976814c0c6cd0d5e157f0d0baac04aa7f2535786c09acc2700547383d2119b64a6f62115f1aff1708738844d8c","services":["streamer"],"enable_msg_events":true,"port":63296},"up":true}},{"node":{"config":{"id":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","private_key":"6522d077629e8c313d832a7a87e5dce9e989618cd1eff1b1eb3c8b63756159e5","name":"node_81288bb0584b7ffc1546043e052e1df10fd5371b35dedd0bb42ec5b30ce69b741b2f7857af5984d4754b39d7253575fde9298504999b78380ef602d391c4bb1d","services":["streamer"],"enable_msg_events":true,"port":63297},"up":true}},{"node":{"config":{"id":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","private_key":"f90016392c8768d222055de5cd1c3a512d3c46b7c7be34a93cbd016aea9ce753","name":"node_109556abac422a912ecffec0d8796f8f16e92e8f95cecf72dc89e97a8bf1fd37aad3c66aa3cf134acade6d065c31821f977171d5c5463305b57ce3eee99a7ab4","services":["streamer"],"enable_msg_events":true,"port":63298},"up":true}},{"node":{"config":{"id":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","private_key":"49f3b1f88009b94bc7beef8d891816672e9075f3015f5954a9ae9d13c8c07290","name":"node_759f46661056bcbb30c7706c9fb87e22a30feb523bd53ae5d18db043efa45b49a2b8982abebdd598fe0912a05896390ec2eabe5e160cbafc0771990708ad8c28","services":["streamer"],"enable_msg_events":true,"port":63299},"up":true}},{"node":{"config":{"id":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","private_key":"65f5fa03f2989a02e37bb664102504038f14adb483b2116b07355296346912f7","name":"node_baa5924e1547c177011285d292aa161a15e5ff282da2cd0afb83c9caffb07bdbb3662c227fa7b26e6dc8be9b8863e647eb5f8ce81640532f8f5c9a7f36557e63","services":["streamer"],"enable_msg_events":true,"port":63300},"up":true}},{"node":{"config":{"id":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","private_key":"87514536801d0d46fcca5c10334c9a6a34ad982fbbcf65b2f881e99a0c8ab27e","name":"node_deb7af800cd20a647335f0feff5bfb3e182f99f4c2d1ade10da36ecfdbac3b5fba4e8f0a4595443fe395b44af3a95617669850944655def85d57cc81c5682a3b","services":["streamer"],"enable_msg_events":true,"port":63301},"up":true}},{"node":{"config":{"id":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","private_key":"c69b71039aa3f28c158e5e639d35069ee66cc88565ae886e75651d88fae8aacf","name":"node_17917fa4da06068b587c17899569dcc768b9cd2c27117a4ed67aab26a7e70cf8d32b881db258061ffd89a332a3b29bfd963d8e171a06c3e208ba0de1c42a2b39","services":["streamer"],"enable_msg_events":true,"port":63302},"up":true}},{"node":{"config":{"id":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","private_key":"76998bb1133735934b6d8cbebf029318feaf9b103165cd460a4a9ae04ad26c5d","name":"node_032b9bf2f59f15571821611d3ee541aa748c86d47fbe5f049fd0069be53e5d7c41991d82957e9c727654c3aa73ec94997c03d8a6c1d2007c9bb1a703f6215158","services":["streamer"],"enable_msg_events":true,"port":63303},"up":true}},{"node":{"config":{"id":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","private_key":"424a19356346001136b4df8a6119a510d526b508d0378eb5b67ffbc471757c08","name":"node_be026dfb24847cac2d00f483104edad06ca8ecb9e1229c479ef5650c7b427cd5dc34a1cf06172c17c9d0406ce17009712e82446394743d4cd9bbc41c537ebc14","services":["streamer"],"enable_msg_events":true,"port":63304},"up":true}},{"node":{"config":{"id":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","private_key":"06aade0419624ec355a3e8e47144b1efd1853293246628e0d3ce856bf3bb64be","name":"node_389b5c1a805f87427e6d647ec5488342a3f7d700615943d5ad98ca5c111f33c7ee007970b4d3e475892095c0d5a79b7ed52d12598398818159000d4b9b719126","services":["streamer"],"enable_msg_events":true,"port":63305},"up":true}},{"node":{"config":{"id":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","private_key":"903c726d393f3a34e861aee6a1b42ea078da78c23d1dcdbd0fd8c30e80b65bf1","name":"node_c57ea182bdb42ba9b0870b5c870e467f52693e5c0df752fb6eb0dfbacce7763f73caee10db40f4fd90f19f504ee586eaf9da41f5ee93ee515d885fec99374116","services":["streamer"],"enable_msg_events":true,"port":63306},"up":true}},{"node":{"config":{"id":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","private_key":"29f2f00196b61b834638899c2e440c57b99668fbd93d7eed220c4556a76cf89e","name":"node_2ac93c31937ca205d61cc5c2a1b9037871cac55e9b306b999b28e19566b3316f6539455e014840ea50c2db8a7c97d78804d3a2dcd7cd9c1f32ace0d36e5dd339","services":["streamer"],"enable_msg_events":true,"port":63307},"up":true}},{"node":{"config":{"id":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","private_key":"682a2f9130cdf75915282000edc627563ea4e9de499ddc8d55efad472a94091b","name":"node_ca1aff0d847c6fdacb623ad9078a0885b3208614fea20d5ff11779779b486bf5e9c794aacf848d3c2d58cfcc1eda8356df82f5fbdd0a5236beffe8e6042848c4","services":["streamer"],"enable_msg_events":true,"port":63308},"up":true}},{"node":{"config":{"id":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","private_key":"d1b4b3adc1b17a79626152a1c7362bddd7c47886990759955595a1de27f7b70b","name":"node_2e409baefbd821485a151993356730e5989810d581e68190fbaa142799c9335bcf98310ad188fed10ae6eb6e2e789730393e509962ec5c0fef0342d72ed088d9","services":["streamer"],"enable_msg_events":true,"port":63309},"up":true}},{"node":{"config":{"id":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","private_key":"34a5057b2a2c507010da7a091827d28ddba4f59c9b5f15f7cb7bf0578e4141c3","name":"node_7b5c0e81c7f4e3ae29d745f6028cfa10b29a16a9c261b65fb8dd05d6eccc634612ad5d3029c8e9f39863a2cdb2682c25f090139bf5c4950e25647e39dcb40e63","services":["streamer"],"enable_msg_events":true,"port":63310},"up":true}},{"node":{"config":{"id":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","private_key":"7b608c298477c4687c50adba466567e19c08492da2684417c129d730caef7594","name":"node_663535b22018a4ef0b151572ef286fa66c22c6e9b2913a69c4a735d4b0149bdf6c84bd83d710f8aa2627e8993b7f020750fbc6f56a3365ce4c840e2b3de1a6c1","services":["streamer"],"enable_msg_events":true,"port":63311},"up":true}},{"node":{"config":{"id":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","private_key":"d9d17f1baee1ccba3fea764f5f5797475ebb9f206d735105ba8fa2c32fe02f0d","name":"node_7b1e20217f594f87350542df31ff5ae8a635679bac7962d49c97e02190c644b673d03e7eba2626b45ca7ebf98d8a972dadbba02c18a8d2cbfc3e7a4cced5b4b7","services":["streamer"],"enable_msg_events":true,"port":63312},"up":true}},{"node":{"config":{"id":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","private_key":"cea9931b34475ad432aecae3d385d895f0ab3e93cdf1d9fdbb356753ec9c7a59","name":"node_84abcbc7b5598ecfd91ceace0927921a5a3404fdb274fc2a2549abbede5f8e4f62c15688a4dc9a2d80262c45970c88898da245c6eb779f327a81d53a17bbc74c","services":["streamer"],"enable_msg_events":true,"port":63313},"up":true}},{"node":{"config":{"id":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","private_key":"362c6622af8998cc3c5cf88ad71f308b632f8f7d0e8ea7ae341f8c8ad44cda5e","name":"node_eab86c521f8f1ac67c015ab713f1236a08b0200757a96bf87ab8301e7967ae62361f0e14da14ca294fc8cb3b4726b52f4773101e21b032977c6a647241b59c73","services":["streamer"],"enable_msg_events":true,"port":63314},"up":true}},{"node":{"config":{"id":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","private_key":"9b28fbe1dfa137bce975e179d3acfe046e5d148e1f9b1aeb16bdbc2cf7abd071","name":"node_e6779e3bbecf81dde8b27d652ed2726c45c205db0d0405c4580014a4c91d739830276f77079108c98ac516ffa00194e77a0795f7140bdf36069b6475e58213f9","services":["streamer"],"enable_msg_events":true,"port":63315},"up":true}},{"node":{"config":{"id":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","private_key":"85e559f97ba5553b0773479fed666bd92a928924af8164f41e92e8acfd51e896","name":"node_9133b0b3c8f680286eae90c3beebc3099a13de38775a3ff2abdeced62d05eb2ced5ac85eac0870156be03101024da5e1d9fbf3e1066ddb3f088221e64149acec","services":["streamer"],"enable_msg_events":true,"port":63316},"up":true}},{"node":{"config":{"id":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","private_key":"652705ca7c47c641c033e01212d96759539f317508df53dcf7397dcee0e20422","name":"node_e1ecad3beeb6c19dce551e4a603c7b440b4498c44e298dc67bfaf4ed2c75bbea95df48b1cd1318e2ccb962cbae7c30ff258e73f8c3fc6b7e9ae7a47f7cf8e53c","services":["streamer"],"enable_msg_events":true,"port":63317},"up":true}},{"node":{"config":{"id":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","private_key":"2578458d6da6ee18aceaf48f57a0f211f9b0a0a49149cc71356d1ccb989b55d8","name":"node_1d0244a13affe60996fe3cf51ba624adc746de0c7ea68ec5a31311a36077c5b5495e3d95c9642875db44c7ecae6ffed22e45f2e2d024d486760be2af9f4cf2cd","services":["streamer"],"enable_msg_events":true,"port":63318},"up":true}},{"node":{"config":{"id":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","private_key":"35b91179894d9195f220f768d849bcef7b2752c1d63a4d373be189c4e35b68a4","name":"node_d9bbcdfd949010e6b2cbf6d0f34b27593ae410bdc1838876aeca35679571fe431d040a5ab085c0a77f111688bebed891da3587277cd794702437cb20d6aa4256","services":["streamer"],"enable_msg_events":true,"port":63319},"up":true}},{"node":{"config":{"id":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","private_key":"62fbe89ba6bc5d8f608f65baf5a0a87c9cffd1f428ecacaadcc777a117a88fa2","name":"node_0a4eec7b0e05da799aca5b36d9e2530f2a89d1426b1fcb7d8f9a662df8a8b5b763767a20db3c9c63e0bd13c2a6e16d3ba8f03baf84f5e5d24917b3f211d9bcfc","services":["streamer"],"enable_msg_events":true,"port":63320},"up":true}},{"node":{"config":{"id":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","private_key":"85b477146d09b052deacbb0f7cc22f61fe3093095e7677ce89c086db68c8c939","name":"node_9bbbfac8be4a000f51a4ce8d024d2595b5d491afec0138922dddfde5ef62c664040c2e9304cc6b7bc688233b5d0c4644b8c8793227c078285a3ab894ef0497a3","services":["streamer"],"enable_msg_events":true,"port":63321},"up":true}},{"node":{"config":{"id":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","private_key":"b3caf8e1271504098be33349fd983395e57f6cc7f4c0d74df8dec7643c0cd09b","name":"node_016f8f4619a16a07fbde5a18e362158d696e4d9f104a77787f26e32a25cd7d278256f8e0db865c488a99511ec27a5eddd5ebbd1c1397fa7f8db111062e5fe959","services":["streamer"],"enable_msg_events":true,"port":63322},"up":true}},{"node":{"config":{"id":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","private_key":"a61a6a7469d5c9abf20daf3df75109b9139cf36c1194d9bc00046d1359c44823","name":"node_7acddc7fb6ac587b7e343804c768e4291cd28dd2b2b9207dea6ee82360d848a52d84f94e4c49e9c421f4f90e2d24f6291e2358783ab0230e6ecde82e69b4ac52","services":["streamer"],"enable_msg_events":true,"port":63323},"up":true}},{"node":{"config":{"id":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","private_key":"629bf1b9c1de816ee9d1abd91d2cef359ce96216dc1d798c7f246ecc5bba8ed4","name":"node_9b59b76dc61223c7b37083b0ebdda22d3599563b3e3986f5db9d5b12f8c806cbdeb2345454efe957cbfa11eea9c7896aefd9a461210524805452ca100a9ea431","services":["streamer"],"enable_msg_events":true,"port":63324},"up":true}},{"node":{"config":{"id":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","private_key":"880c61b8c84f87c55e85aa9b07944500eed52b76b64b6d15c93d8e7c23000042","name":"node_e2e0419a41bdfc5bd76deae2ddce6ac865f886d764c9bd18799b79fa3b2b6ba66d765d26da2037e98317e1d7e8232a61e63c1d0cfa98c9137424151b46e07171","services":["streamer"],"enable_msg_events":true,"port":63325},"up":true}},{"node":{"config":{"id":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","private_key":"dc74709b0972c1ec957a2c056059ce117c9291997ea47107228e80d28af70acd","name":"node_5df58ba12334a1b4f983d642fe435901261767cd81f8f37c43e359f5584664e4d287e8c2275995604a3b3a4823418e35cd899a3db2a7db31570e19512f375481","services":["streamer"],"enable_msg_events":true,"port":63326},"up":true}},{"node":{"config":{"id":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","private_key":"52e14edd67adc3154d0d5a91f91e042773a79af41c5cce9120e2dc03318a7fdd","name":"node_5e86f39cf8338ba098a85d41e601a303fde311662b216ad32a2b7bfaf2b2b6dd1af3775784b39f2d85ac5fac96f05f3abdd8a2bd28ba16d939725fd6a33ae1b6","services":["streamer"],"enable_msg_events":true,"port":63327},"up":true}},{"node":{"config":{"id":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","private_key":"ba201a301c109cac7dc4f762066312478f6a3b92b80495c19d238b8e728e3f63","name":"node_df54af3bae257d437c5657905484e0d72e9560c46f8ba6b3437730234e05259b404cca40b0831e911605ff8a68a19e8fd7e958069ec8b40595928892f4fa220c","services":["streamer"],"enable_msg_events":true,"port":63328},"up":true}},{"node":{"config":{"id":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","private_key":"4f8dbb09790674afc8ae90210897ff3196d82a7d8cacd67ab970ab02fd61136e","name":"node_4ee37acec2178ef120166265aaa2b64b09b315fb53861405ef46f2503c273eb9692e9cb4c2e67a8652254d430fd6e02dd3fe4cded20bb231a9fb834d292b0b24","services":["streamer"],"enable_msg_events":true,"port":63329},"up":true}},{"node":{"config":{"id":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","private_key":"fd9060fd74b7db28d5b02541febcaab4e1706cb1ae50b22d20a7f619fbc774cb","name":"node_abd8f5a4d700c06ec00684b23d2d25c4df1a9554fcfc57b0ddc3fa476e6a699ba75e1213449f900803f83ab8194c6746664b547202047f35b8b3e216c7147bf8","services":["streamer"],"enable_msg_events":true,"port":63330},"up":true}},{"node":{"config":{"id":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","private_key":"3034bb94560e7e8d146cf275664f91426fbeadbea78cc96662a0e762f5491d3c","name":"node_cb321c9b0fe2eb3617b8e2461aab170a9dad2c9b04a10eead4e37e551197ea0a7500eb1cb7b155efe1886486ef3d252d8ff0d309f2906a1126ca011d037da70a","services":["streamer"],"enable_msg_events":true,"port":63331},"up":true}},{"node":{"config":{"id":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","private_key":"1e3e9ddcbac955dd113066c5a41e5b3b16da5cd7bfa036ee1066ff3ceb69d7c9","name":"node_c665a6b1b7ad39b86bd4b1fe38b7ee95a0fbb1db15e91381ec9e5a235e33b69ffdc92c60dafd74b7b4dafca1b000e9274bf045abe5b93b1a9c2b31ae071a9898","services":["streamer"],"enable_msg_events":true,"port":63332},"up":true}},{"node":{"config":{"id":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","private_key":"9dcf01557c9cd252eba6d06bab3e12ad039e64f5d33b732bae4afdee4f4c63af","name":"node_53df9cce9b0169e58ced53a123d1d8f6e8fdcfb4c2d781ecbb91bb7c8eba36946dd9d21c749259769825d8a6b3faa6bb87c8c6085a522f8a3e376061f59144d9","services":["streamer"],"enable_msg_events":true,"port":63333},"up":true}},{"node":{"config":{"id":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","private_key":"290d07cdf29c35f369b7053b54ad174e4db589026d3d4b0553bcccc0a0e4145d","name":"node_d7a319f69013b8375e64d19f015547462c84565b882337998f9e669c5fadd3d2ecf6374109903003e09f5d453424b5c7fdf52163d2cc8084cf81f94844946b63","services":["streamer"],"enable_msg_events":true,"port":63334},"up":true}},{"node":{"config":{"id":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","private_key":"2a549958a13f2e346b477edf55e1056a1c7c1051b3cb277aba17bd7db522aba6","name":"node_f38a9d792173a29c61389f5d84c005d78eac6e750659aad42e2d6df883f04eb3126b2c38fac95076eeed455b2031aaf694143922aa93a2d50412a2454dc56e28","services":["streamer"],"enable_msg_events":true,"port":63335},"up":true}},{"node":{"config":{"id":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","private_key":"72cba007b6bddfa0e57451e0f28d74cd7936955babeefb16b4c3de62400c8ef2","name":"node_4f5ab12b9c5127c16739ad0d4f51adce90ba6736cd096eb185ea632789f4b26f1ebabdea4fd3b39dda5409ece6c2d92fd469cf4aecf9d29453e3e042c19b893b","services":["streamer"],"enable_msg_events":true,"port":63336},"up":true}},{"node":{"config":{"id":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","private_key":"5a603b46da0d4b5d7b48ca9ee9f08ca4cde411e8e279454ac25624f0a81580d5","name":"node_11d560045536e9d1b0b1b9e8944e00f0ca7f1e6788c9fdb51061820bbb3008ead92bb7836621bf58da7035c87a28328faecb4cb2e3cdb9d7fa4f45790e6bf352","services":["streamer"],"enable_msg_events":true,"port":63337},"up":true}},{"node":{"config":{"id":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","private_key":"955c0d00b5c9a641e3e9958a032163ac01fd30e25660ec50db255cf9349573cf","name":"node_94088fe273f76e62ca4e43c095ad12215b4ae4c59942328b3985416fb19bbda0cacc143a49eff3fb644ad53a19d3f043260e43dbb70a0aa9c15829c21cecd3c7","services":["streamer"],"enable_msg_events":true,"port":63338},"up":true}},{"node":{"config":{"id":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","private_key":"3a0fa647e1aa93088fd931cceb89e4426c10861ebbddde0f14a58e2a3969c252","name":"node_535f93057d46c4aae0902546550880be0b5ba67dca12350117d471d67f4f2b3f7bdff29bdc918767974c465df8fa1afa6bd6c29c0a36d51f71c4183673d906f3","services":["streamer"],"enable_msg_events":true,"port":63339},"up":true}},{"node":{"config":{"id":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","private_key":"22c2b405d07e440cdef6e1e9d93738f3bf3add71f54493b68b2fa368c3187755","name":"node_7ac5b07eb555af3bb4ca3f0f4b45204d43cc3798c244435909b97d9a32fc3abf0b50666e260e046bce826a7a102a92d389f8f39c5311e83bb34beddac29d50e3","services":["streamer"],"enable_msg_events":true,"port":63340},"up":true}},{"node":{"config":{"id":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","private_key":"98f9b63dc3d1c346c60957731df1731c8b5f7cbfa63ec1e4de06d1b9f70f7597","name":"node_1944f98d4db32c56a5efda5a79aa5f276bfab1e084d6611fec0e735b8bc0f45b457cdb74a23fc83b2377821fa8316123c9877acd6db7c41058ca5d3cfedaecf9","services":["streamer"],"enable_msg_events":true,"port":63341},"up":true}},{"node":{"config":{"id":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","private_key":"fef764b306a01b333cb965c1faf6970b6bf206dd19c10f666d0188e532d27a7c","name":"node_1c2f7ce55a6e38487f3b3fe6083a79f914cd6d7e4aee8f5d56b4a61b3eb584e128c56998db0e13e775edee3adacf54f09960a041dab3daa80a4f8a3b42760c1c","services":["streamer"],"enable_msg_events":true,"port":63342},"up":true}},{"node":{"config":{"id":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","private_key":"aa54e42fb6be9a738ce973816a814b29759c40f5ae5c57ef972c8957be9d1cdf","name":"node_6ab6ec15635b2fda22542c99df0a3313ad4583ba0fb3f31b8f314e3ecad446d3fb0fdfcd2be9b08374b1a7e049fb68e69e8dacdd13f1df5007a656f6b11adc5b","services":["streamer"],"enable_msg_events":true,"port":63343},"up":true}},{"node":{"config":{"id":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","private_key":"c0a44ebed32208583420c7444e83ac3526001946e4f7f6b561c24d98f96cc0a6","name":"node_74d84cfdaf32cd4cc67771f29878f1365120bd65cc14848008d5386a81f495bf88eb4132fa38a2cc109ae1e7f02c9b97597ab9d1a9c19c945e710ab9df07cdcd","services":["streamer"],"enable_msg_events":true,"port":63344},"up":true}},{"node":{"config":{"id":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","private_key":"d38eae2be9d262c3b37bbd8afb82bc0cd431e4c484ae92747ad064e4138e9f33","name":"node_6b4e376e9c94242b6d42688c22aa9ab418cb6dfb1cbca1c69de0feceec8d3af29fb005017aaa6e503cc0c03cf0dc5bcab55e01cd6f64b9efa02ed87c03020003","services":["streamer"],"enable_msg_events":true,"port":63345},"up":true}},{"node":{"config":{"id":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","private_key":"e345c696901db291ce988a19c0ad31ca0a38628ebc03c0bc87307d2c8f031346","name":"node_92d6ef729992f0de886076e5f8cdc42cbbd70b29e79c25e0b3d22b6575d3d2508d47b42f581e335455483d43625bce4e55f88cab9ff2073ee8dab746357864fd","services":["streamer"],"enable_msg_events":true,"port":63346},"up":true}},{"node":{"config":{"id":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","private_key":"7149ecac9f7173c182b233a94bfcf854714955592618e1d9500c622a08fc3faf","name":"node_57cd4c0048b459192ee46e19ec7df777e600f256e0dc8c3019431eb7bec3c020b9504ec7aea3dba8188658ca5b830ec40af6a8540ce10e04badc6c695d009271","services":["streamer"],"enable_msg_events":true,"port":63347},"up":true}},{"node":{"config":{"id":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","private_key":"cf6da8ba09884f084c279f1f25340712041f3c36c9b6be1c0fec270bdf17a875","name":"node_831cde5b651ba327b059da4c7f84b184bdd6bb99c6690ae816affe25d42c6c3dbe5b59e2b6bf23e9d0f6c485bd341ea57ba1a8220d18b0a40e156b77d84f79ef","services":["streamer"],"enable_msg_events":true,"port":63348},"up":true}},{"node":{"config":{"id":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","private_key":"2acdb11a79e469d5e7e20a391253ad6909ecab541c9931d5f7422de792574b6b","name":"node_71f89efcf939294bb94ac669c8afd00def58c8dfad519c226adfa068692d588ef797116d42aa146b9d34f3be35ec7c014022640ab3c0f1f9034e44ab1a26e246","services":["streamer"],"enable_msg_events":true,"port":63349},"up":true}},{"node":{"config":{"id":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","private_key":"63cfea5298455b0cf7952a47db686e5c91ca2f2e16610167e5c15337e67feeab","name":"node_4ff66e9b5d3fd345990bd7605bdc222b78946f0c13b72bf80352812b2426d8f1d36c93e6c8713566004615e8a78ecab12ab0cfba254c0967eeecf8875b25bdae","services":["streamer"],"enable_msg_events":true,"port":63350},"up":true}},{"node":{"config":{"id":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","private_key":"28315ffa74cadce008f22997503621aee7c6df8dd478536421715a17ebb97a74","name":"node_9bd4f0adb9a966cc5ba632f1b540fe9cd6c8e39fe1a041b315697679cfb04b735952062ce057d456677cc34a84301f26bb727a4ab2646fee734f80a22c620746","services":["streamer"],"enable_msg_events":true,"port":63351},"up":true}},{"node":{"config":{"id":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","private_key":"1177b8e7b7ed31f6a54030f8b4341593d3a1d72aae40f9156861650da1746f2e","name":"node_58cfb20d3da3641e0ad529b9edbd4b590a8d1dc9d1ed7b44ed3187dba9260bd7c732fc10981f5b9bffd31d362cb05150173618aa36138984431d94a323a9b313","services":["streamer"],"enable_msg_events":true,"port":63352},"up":true}},{"node":{"config":{"id":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","private_key":"d007b46d1a1f6a2d085b54b2073f46bebdad50a651920b7083908d388be5e5ef","name":"node_094f9d0fd3bacb17ac67a2edb8ed394fbbd1c8d478233d3269cf217e7b788e21042374936b885bf23ee4f9e03babbe4e08db283dfc2a6e052a8a5ba133717dd5","services":["streamer"],"enable_msg_events":true,"port":63353},"up":true}},{"node":{"config":{"id":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","private_key":"260581578bd37f4523054c95aee9f6b4beea4ed6b39edfb8b9506264d93337d7","name":"node_7646d08b3e24183e3814de130235c41eb88a5a2abff23eaff3c91954ad3ef55fe27da422dac5b894312276bf1a2f1aebb8b636a8d4a0c93d9b016d441df3fa19","services":["streamer"],"enable_msg_events":true,"port":63354},"up":true}},{"node":{"config":{"id":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","private_key":"49be559b16c8e23e2031acd1d93ffd182c0f09e54f7893335d04febec1b48e99","name":"node_9b618ad34d0dfe0fccbd5b8af365cbcdbb43e802df5f23e91c20d21f3ead6169d52bf0db7e5e111abef630c9853419fb33a88cf111d8507b8708208b5d65e35e","services":["streamer"],"enable_msg_events":true,"port":63355},"up":true}},{"node":{"config":{"id":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","private_key":"7b742610b213ed9b0492c97d62574eafc92dd73cb24ba74c4f1023fb4d8843ae","name":"node_4a030ebcb1a59230759d25a3c87daed22906b520d55a78eab2083bb52358ddc3a5d2d7c3265e6c54a990bf32d0dacb85905a4173d72ac18fcd74c43ecb8635c5","services":["streamer"],"enable_msg_events":true,"port":63356},"up":true}},{"node":{"config":{"id":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","private_key":"c90aa4ff988d9d5aa9ed033d3c8076c073ebcdcb0131604299ca721f38d363ad","name":"node_e0f78c59a61f2a953553cd5742c58f4a82e38e35ac7eaa237a6ffc9fb0a3a26a2d1d1afae249e611d1320f2cb25804bdbdfb6d77336449716b0f4beb3298b8aa","services":["streamer"],"enable_msg_events":true,"port":63357},"up":true}},{"node":{"config":{"id":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","private_key":"77bd908de80bb222465d000554b9467681aef696c9e1a81e51dba688310dc7af","name":"node_84dfd4e4d9f1204893f190eacc4c3999e175c433f70de86e335d27477c097a0552f211a21764f01a708da4c9e9e6552191a61d3e48f41d0e84f01e7ae3beb34e","services":["streamer"],"enable_msg_events":true,"port":63358},"up":true}},{"node":{"config":{"id":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","private_key":"529ac85f80c2ef25f0cca3417a1745d3573eef2b8cd611eab45c6bf857c87158","name":"node_ba21a373781966135d6225adae024a3f3e421b852f72f8b0569cb92fcff87c33f7e5b799a509b8eff6ec6dc46a9b17d5bae1e91ec7c54c0c712d893d54b140fa","services":["streamer"],"enable_msg_events":true,"port":63359},"up":true}},{"node":{"config":{"id":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","private_key":"46d69d2cb90a6ff16facb7994569557da8b0c76f74d238381a2a53cadbd1d8de","name":"node_fd4968df03d767a223bf7e4dbe26b5c27048298df40e81cad50b344fb3e6837965f2646dab7ffb2891a5c507343ed84bb8bbe403287b51dae538d58fcb6e7623","services":["streamer"],"enable_msg_events":true,"port":63360},"up":true}},{"node":{"config":{"id":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","private_key":"668577a2160c0a19ddd60a032636f42ef4b0f8d7f8b15129b39bc693b04951b3","name":"node_07c63ca5d0309e30d1ab12e7fc142e6d37904b552639cfa97850161491f28f20d87e0304be29357bcfc2ff52fc52fd0d4f6e6011ebb239cced8b5c8dad7abf45","services":["streamer"],"enable_msg_events":true,"port":63361},"up":true}},{"node":{"config":{"id":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","private_key":"ccd33f1981701e030d7880879453393ccb90b02d71fc85a89d82f903d1a81066","name":"node_920a301186bdf665a721676ece7c180413369ea6eff7537f42049d9eb409f28cc864099590116e885f57368959fb2cff7003697d9b1515e68bf3fa7aee0278ef","services":["streamer"],"enable_msg_events":true,"port":63362},"up":true}},{"node":{"config":{"id":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","private_key":"1859e8cc62440d9e1d1c35f842b8bab336798e87932bc4f2456c327fdc777a7d","name":"node_89a5b92a9ca045f12c35a70084e6f41f9775a25d6f105f8c9349c7b5e107179d8a96bdbb113b2680edf5183e9a42fd64bd7b29d0dc7797c583b833f869313699","services":["streamer"],"enable_msg_events":true,"port":63363},"up":true}},{"node":{"config":{"id":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","private_key":"45dad25ea664452913d4fb09debe8987c94b88ef752b058a7bf352f144a9c6ea","name":"node_beec648d79437a5d7b4140ced45d82d035c6f64f9c67c58386703811d97c3846787eaf274d2298df809475f0b7519df696563cb8e9a5fb0a9cc419ab13fa8d41","services":["streamer"],"enable_msg_events":true,"port":63364},"up":true}},{"node":{"config":{"id":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","private_key":"042b5ccd68b8dd6c125ecd889c304299fa18c22841c95b5fae01a22fa98ce96d","name":"node_c73d088ade8756c74832c73542bcdb3e52f670f7a74ad3a7eac2a9e3ece6bd081f782a8e1d3f9a40b9aa9201509110f37fc57fcb10ee1ef3ef07b7eab019782e","services":["streamer"],"enable_msg_events":true,"port":63365},"up":true}},{"node":{"config":{"id":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","private_key":"1a8c7f2f97bcaa5711578ec1de04829d7735f81ba5761087e79a977405ec1801","name":"node_62dab8b21640e1b44dea452dd7e7de93f27a44840da72d56b11aa96e8463f3a4bb15e75a954d19fc897ae0030b16181d271b79d8198b7cffcddaa9ffcfdcce73","services":["streamer"],"enable_msg_events":true,"port":63366},"up":true}},{"node":{"config":{"id":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","private_key":"d7a4980a0fc96842e8e570863a3b8e078baefe4ca8ab2ddf85c7c5d8f541fabb","name":"node_9e621c3eb534855ca292efa27a3fbc89b4f05c80a4bc65bcff2f14ff28ef43cbe14137d2fddc6fe2658bb06947d918476b479dde71469b8680e5d8a7a01619b5","services":["streamer"],"enable_msg_events":true,"port":63367},"up":true}},{"node":{"config":{"id":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","private_key":"d2e98b0004a9b7bdb030d5e729716e7065aa1a8c48efacf471718bc5da8ec990","name":"node_afe5b217dc512eee45575c189826ee5640d11a0ac9e8e4b03e9e62e6cf6df9de500bc8a36cb7d82a2280ce184409164f1772cc5c9e59ad04361522d2b8c364e0","services":["streamer"],"enable_msg_events":true,"port":63368},"up":true}},{"node":{"config":{"id":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","private_key":"bd3302dac250b294208d6ed14b0a14a6d60d75be1f68ce5cd1e250a47032fb3d","name":"node_db8ba71afeaea1f2964e8978a6eceeb9efa3958424424022213c8193443f8d5afd18490afa954c76360c681404809c7cfaf7e4ebd8bd1a42d403f7f1915b0d29","services":["streamer"],"enable_msg_events":true,"port":63369},"up":true}},{"node":{"config":{"id":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","private_key":"f5832a55177daebfda3bcaf8b5ebc11eb44f4d5207b8384fd35999944d2fcab0","name":"node_2f1967b4410ea2ea8fbaf46771ba82c2846d00aecdb6f873aceae33ab38f72d0a2c2dc6046d3034f514efd090d42011d48e9ab0cb4e3caa2b49a96ef732215a1","services":["streamer"],"enable_msg_events":true,"port":63370},"up":true}},{"node":{"config":{"id":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","private_key":"8285330088dc95f441c68f12765ee99f065fc41f665b54a257172d9b4ff6e017","name":"node_a99852c5bf08ea4713af9cade5343d1259bfb90401aca7fcff18c58cd56a98804dd16c61fea71039c0ac31b9bbbb9dc5aeaf0c2f074d3365e88d17031802d636","services":["streamer"],"enable_msg_events":true,"port":63371},"up":true}},{"node":{"config":{"id":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","private_key":"96a76a56912e05cbd480fde154743a65f4bdaba5395cf685c22681fa403807b3","name":"node_4e68553db7be307b8379e8bec383b5c92e4b23debcefca575d24504e2062618f74c26e60e0d9e47f096997a7f841e2c32c994124f495ef3352ef964b33fd3a51","services":["streamer"],"enable_msg_events":true,"port":63372},"up":true}},{"node":{"config":{"id":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","private_key":"bf0a6c406d390baa5a33fc469dd8b3ec25e406364bafa8ad3d9b422dd58b4a87","name":"node_a608a746f46d4b2e9267c65283380d6d6cb8885a64428fb77df9934bcf4dd1723587ee7c8f4a642dce266a12a6a4cf4e5c6db7fa1024158425a6753e7ab7264c","services":["streamer"],"enable_msg_events":true,"port":63373},"up":true}},{"node":{"config":{"id":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","private_key":"4010f083fe123b4e1e1091a054b7af104d76038c1313c71470b38aa16a05688b","name":"node_fde7705f5013c3b6b76a35505c1e3d57c033a337f2a71e912ec3a3d2da8e113bd7c36d94908357e9f7654660621f647ad8c66b0126dfe91dbfa3b8c7bd2183d3","services":["streamer"],"enable_msg_events":true,"port":63374},"up":true}},{"node":{"config":{"id":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","private_key":"e2894e5fef7fae6c4a6969fdf39bb99e8fb16849881a5a7d45cfde92ab16232f","name":"node_3dfd733dde9414af916625ab981777ff1ad7ca0f6d1e4e7d9e2739969e21182fd13d85e281868653e7325b20069356b11524b54143c47fd3955a911cf7325ad4","services":["streamer"],"enable_msg_events":true,"port":63375},"up":true}},{"node":{"config":{"id":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","private_key":"1273dc5cdf253e8042d52ca10f80d25481d40b5cc80b37b3e128edafde8fabec","name":"node_5142eea687de4248b2184e9896b245563117648e7a156255d9a7ae730313d5d383db3be1125b5accd7e743c2a5d8c3289ec559ef7cbb803b9e82cd49bb213d9f","services":["streamer"],"enable_msg_events":true,"port":63376},"up":true}},{"node":{"config":{"id":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","private_key":"082369e49a61588917d594d0a90c2d53968db7910a1fa9a978da33f53d8f5166","name":"node_b597c9ba4da20c49fc4ba019571321d2579588636cdaceb9f225706574970adbf4771dcf186b1decd4e14cd5d257e30a36ca829829598c1775902201ad9793e2","services":["streamer"],"enable_msg_events":true,"port":63377},"up":true}},{"node":{"config":{"id":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","private_key":"5ac4501287d61d0083f3143a6184fca450c07d149279fdb3a19ae3dbcf456732","name":"node_72e30d4562673c5c8fb03709d93f73322747858d723b7eb5ef2fbb88e0331252946b7e93ffe434fcb599c4fff57800afb29e6c60a719f18f49dba541c3591c6e","services":["streamer"],"enable_msg_events":true,"port":63378},"up":true}},{"node":{"config":{"id":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","private_key":"cbc289ddf69a20e78f479b1587fe2955c2ee7a0bc7a743ce61c13c07139b33c1","name":"node_eaca77d20c4ad6b87649eba21b750a4b1a2c575e06bc42679d18fce16fea15212e9a7408c16f3b24d8dfd1e397314637e72e292845d09534a39035bd9203ee9e","services":["streamer"],"enable_msg_events":true,"port":63379},"up":true}},{"node":{"config":{"id":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","private_key":"dce8d0367de94896d0c24049979fda6a48f77b8e98974d66472666a5a4365865","name":"node_d3105ede6c21bc643d523afcd1309a5dcf03f70797a92f167c3a19f86ae98882fe1a9d4094d7a3dee4a0833b8075b6c3e9aaa7f4879dc47bb388c3ae85522288","services":["streamer"],"enable_msg_events":true,"port":63380},"up":true}},{"node":{"config":{"id":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","private_key":"138e8952e22f78dbf4ea1aad84cc393a1553192402f5cb23a8d15459d9254240","name":"node_6f60ef501b41f9049419b033ae8d793a18067bdcd60347537b0dc3873bdd9a2d10d24909cca7c39781765746128c2165596f6537a94f58279523faee71f9c51d","services":["streamer"],"enable_msg_events":true,"port":63381},"up":true}},{"node":{"config":{"id":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","private_key":"b50b26bf10abf56d51a891c4449915de09ce392d6c5a8170ae5ea5eb3a082d8f","name":"node_453779010ed7c59761da47ccd8869d3fa8349795e57edb9eea416c0712301ea622c7683858e309d19ab137ddb0edef161d0d00a361abeecf0628c3ffabc629ea","services":["streamer"],"enable_msg_events":true,"port":63382},"up":true}},{"node":{"config":{"id":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","private_key":"269797dfe5cc0dab8d44b114878dd8ec081d6551214db901b361817184a58bcc","name":"node_e2a27dcdee1f89fa362a85c4397840cd8be4ad8d1b9ccb23188c303bcab7619f38772f71385922d090390973b62fb8249efc103f71bc761041bcb3880ec0b935","services":["streamer"],"enable_msg_events":true,"port":63383},"up":true}},{"node":{"config":{"id":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","private_key":"09082c0128f28346808a35b0b607d4e7d6c9ab7e894b5166958bb2eba5f4c0b3","name":"node_97981f4b825620985b746c85824d7a4d307ee25d60a72c2b7de4b1d4f3b1c002652adc3045842d350f849789e410a0357a0b42fa637a1b4fc9d39e44f8a674d7","services":["streamer"],"enable_msg_events":true,"port":63384},"up":true}},{"node":{"config":{"id":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","private_key":"ca130a8083cac47d964d46dbbded845892b326aa4fa12489d21578f9f018d45b","name":"node_fe62314839c93d2f6e3aee984d5f0b321897c6f39e66800d3de8b773baf6f19e0a03cae025df512aea8d5f1b667b6dbb15c192a90a76d3031c14e33e5c16c4f7","services":["streamer"],"enable_msg_events":true,"port":63385},"up":true}},{"node":{"config":{"id":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","private_key":"5d649fb189f6b462f678a083e7ad8d874c6bdeaafe0817cf4b361448024d9428","name":"node_c903c5ee3d9cd65bea3ea777e39282c33e1349d945411fb2f16321bf582c2f400956a98fbafe5873fc5f6f6a9a051df5da7e94cbd340f935abe80f91e79ef875","services":["streamer"],"enable_msg_events":true,"port":63386},"up":true}},{"node":{"config":{"id":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","private_key":"74fcb757f856401d62426a3e62cff6870099b0b261afb281d8d9e7dcf355a87b","name":"node_5420da16f7ed5de6b498dbc9a83b7e92e1f9900a6d04ef7351a0bfdfd442b98a5634f28fcea32ba3f3166d21c8ff5a39be70895b32acbdf7592d1d616a345a21","services":["streamer"],"enable_msg_events":true,"port":63387},"up":true}},{"node":{"config":{"id":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","private_key":"3e1263efdc899dcd32f1fd206de2370195ae82fccb81eb354dd9cb52fc5994e6","name":"node_f54335964d9b4eb9813eb05f40ef1c523bbf0faac5a04c4737467d590fb6b55c7fa1fc5d4d32c5491d8766b9be6fdfd3ebdb25c5ffe1719f36c86ddf87ae3a85","services":["streamer"],"enable_msg_events":true,"port":63388},"up":true}},{"node":{"config":{"id":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","private_key":"a7cb8f80391de65478acf12a59fd0a0e9c5f04f0e4bc1da34b9acd35c586fe98","name":"node_40bdac599b00e9c41ad6476ee415c33d9c17c5aa672692c2404e523b29dc315da929a86874bed87fd9009871805d1dbf3098e7a817193e3b08a6eee66346da79","services":["streamer"],"enable_msg_events":true,"port":63389},"up":true}},{"node":{"config":{"id":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","private_key":"dbbe33233150cc109e4ec1b6d6bf5f14bb573d87551440db2407ec75821b4ee6","name":"node_b26f7c0113a5ae885f7c0e608aea7022a9c8bfc40c5643e60b2ba7343ff09c5be0bc08be34dde3c6b85fea192a46d4764770c12cbaa233df4231a1b99627ef9d","services":["streamer"],"enable_msg_events":true,"port":63390},"up":true}},{"node":{"config":{"id":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","private_key":"1058ecb8bc4354469a7fbef819dd8efc60c72db3101ff2f4d3d8089876ae94d1","name":"node_829b074b70d757da6aa00f7bace3cf1b5d2d4eeadb7f370c1a85374a01a70b54ac53d747267e386f3b41e6d790fecdd6e74b8f89745501ee82439a66ea54443a","services":["streamer"],"enable_msg_events":true,"port":63391},"up":true}},{"node":{"config":{"id":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","private_key":"7a22f9270103c5214bec5fccac665913b7e9ba442667ca7ca7f1bead2d44e594","name":"node_302c37f28c69fdcf00b39ce0c0223de0d94cebc2c0b068315b95b76b5432573ead0656569441029ba9054d8d3d959fd8735e73913af5ce3f1132f8271fd437ef","services":["streamer"],"enable_msg_events":true,"port":63392},"up":true}},{"node":{"config":{"id":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","private_key":"32e05e400e6938d31aa93e7666905a5a12e2b4b706354eae5f34259cf6880e60","name":"node_4e95fb8943ef6502fa470870a7ace4ca11e18589bd2073167543a922317b35e40b5068934d07e56c8fdd23354dfad51fd2899db854f189841f02b5914cd97749","services":["streamer"],"enable_msg_events":true,"port":63393},"up":true}},{"node":{"config":{"id":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","private_key":"f6b0641261c3c0741d61572a591e72180deb8ba2c9922ea5db694c5b372aef6f","name":"node_807340e5fdf6c21a56ef2fd158c32e92201206ca85fcc147165a408f7a735964afd47c397e663610ac53870ae722c0317291732b0422f8aeedae783d9c730218","services":["streamer"],"enable_msg_events":true,"port":63394},"up":true}},{"node":{"config":{"id":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","private_key":"5809952239bc91701c49a3ca4362fe2f96294405e789a467c4899d1dc94f88ff","name":"node_c9cd9dfb9f90a7948ac5a42c7bd63263f2eef6e1d85547559f7d2ecbf5f9cd1eab051b8e9e661b573c275d84091a44e73f6fc6bcc91dcdb674bd5d939190fc01","services":["streamer"],"enable_msg_events":true,"port":63395},"up":true}},{"node":{"config":{"id":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","private_key":"284f36dbabbb181f068bce762670de591bac534570ddba3da4c91381188cc3a8","name":"node_1bc1d6155ba35d29ea16938994e08df76ebd8f16bd180bd6a9b9d8798d0745889fe72d641dd78bd8ec13526929f7eb5aaa6a388430fa69033d6db581e53c6422","services":["streamer"],"enable_msg_events":true,"port":63396},"up":true}},{"node":{"config":{"id":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","private_key":"c1b4e417ecbce61a39ecf4a30b86e303e82534bd890eea7c30b6ab4d0bdca861","name":"node_e267e71c2dcdbe5a500b23444d2d4037ea15afba8f4f2b1c0e54a274450404fbee6fa5439f7cddf4ba1aa28fa93e434b01c239add58e30a5423ca3a481584d6b","services":["streamer"],"enable_msg_events":true,"port":63397},"up":true}},{"node":{"config":{"id":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","private_key":"eda1f1637d46610c0a885d4e08d8d4e776868f98be4dca745ebfadda65f2a81b","name":"node_e98a08e8e3544727f5ee27f4465375a67ffba490fcdbfe7bfdc909f6b68bd279f776c65d38c2ccfc33079f852f76349c94d68fc6989c0d981f22333f036a4bb5","services":["streamer"],"enable_msg_events":true,"port":63398},"up":true}},{"node":{"config":{"id":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","private_key":"51d301cb37e7206eeee2847d753aa67cbf0513b6e7cd41022003c2e7b3ef5581","name":"node_cb310c0e86aa455d7c9af6394ae38561c901da30a51d7ccb7e66a09d9a8f192ae8caeff106043426d56397088f141c4e01e3b98f1ee583ffc7318b5f730f3ac7","services":["streamer"],"enable_msg_events":true,"port":63399},"up":true}},{"node":{"config":{"id":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","private_key":"30d23072d68ccfe357cba2b3294b9584b591e8c7898031f7c4dbaaadfdd05e1b","name":"node_1090e9d89cb278a30063a5396d9ba795d3bbc237c76915a6fb7d23aa1822c8535d2fccc44cc8cd2acec68444c0bf1bdf5195ebb9f3cad8dac3d94a4d9c0e5309","services":["streamer"],"enable_msg_events":true,"port":63400},"up":true}},{"node":{"config":{"id":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","private_key":"90d8283793c2eb15b76d7d9e492b3c3e7136115c74bf027ad9985179380a82b8","name":"node_4b784f072b7c96c30612767425f552e30e45157e70139dfbe0ae4ff86dc31601adec60f8a3ad9747b02b5219073d8813af9b09d59eaf7ddb7ee24856aff6fa8f","services":["streamer"],"enable_msg_events":true,"port":63401},"up":true}},{"node":{"config":{"id":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","private_key":"b9111f0cf5ecf0a5dd7683f07c58f581a175bfbdf307224db008d7792e30c6a3","name":"node_22010c9829626a6892258b09cb3f3edc3f21382fb487b5dbf0dd20e198e37e26134aab850e30337f398d1491b5126839aeb1953ec144bc19aeb889c832f67c6a","services":["streamer"],"enable_msg_events":true,"port":63402},"up":true}},{"node":{"config":{"id":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","private_key":"7652297b6b2c9a5339f9d375aac2c9b81f0274e3949b4033e513c02802f040bd","name":"node_043fe7085e8c90c18270f84dba5fab138e50216a1cf8d81a3794d156fad7fc81d1422aff169b244b13f91d73eebb5de464f97b1b93b3ad2a58959cff19238842","services":["streamer"],"enable_msg_events":true,"port":63403},"up":true}},{"node":{"config":{"id":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","private_key":"7971b1a36d0caacd64acbd61a149d41c05102d757fc313f2c49c6b2185bc22d9","name":"node_329145e75496cecb5f5c8f00313a52ddd8c0e8cd27ef1b2bc1b2b56e4d4089aaf5a7a3c4d9a40bdb92483fa05bd24d1cd0fd51883e30439dffa0fc855e1a7cd0","services":["streamer"],"enable_msg_events":true,"port":63404},"up":true}},{"node":{"config":{"id":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","private_key":"62692081cdf8e04e73d8942c5fb423f153ea6d32d16fc0e3b05c10927bcc42c3","name":"node_2a63d875e715c2a43302d32d86d30c7d7faed46c08a67bf488762637216b99dd87333a66df6d9f3a57df863b1f1a219ddbeebb9f3e92e523bd08540a195448ca","services":["streamer"],"enable_msg_events":true,"port":63405},"up":true}},{"node":{"config":{"id":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","private_key":"bff5d02d0e187260b2ac19e027a5a8c72d358aa420a1dd22dcc8d34a921a81f7","name":"node_0deda014fa3c0bc8f37d853e1448f95f56f97048c28797d72258fd3ba2f1f776ae11566197466596356cd172847ab02a89f4cf047e58383249fb2a4cd69b6206","services":["streamer"],"enable_msg_events":true,"port":63406},"up":true}},{"node":{"config":{"id":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","private_key":"e2478cb11c2e4c83e5be5962e0a2e9dd367bc4bed98c7bcd08c211f35010b4f8","name":"node_c332fe1f9b6e25f72c7150631ffa6e0929ff6eeab5d17aa45eaf669bdde869cf404505ae990a529aa3ca797cd0a96f31cc41431a5d4a163132be566f91623c08","services":["streamer"],"enable_msg_events":true,"port":63407},"up":true}},{"node":{"config":{"id":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","private_key":"c4dc5aeb69312070307af3c8a24d468a0284733f29b07b5407e0819cb054fbdf","name":"node_5566111b7f14d8ec83ba6456488f3fc5c7e2c86bf406dead33b814e1ee9b569d34015a4d88226b7e28fff7784395c086d106287cbbc80acfe75b05cd6e12903d","services":["streamer"],"enable_msg_events":true,"port":63408},"up":true}},{"node":{"config":{"id":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","private_key":"6832f6f7e27fc6e2c9745c44ea7004ffd4f6bd869b779e15ac0a4a2ffade7999","name":"node_b4a5efa9028b2d196855393892f79993c2812d02b758f98813ddf82c5d943faf6d66eff811cc5a51936c118f4c768c0d13b54902095e040c602761e63c08655e","services":["streamer"],"enable_msg_events":true,"port":63409},"up":true}},{"node":{"config":{"id":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","private_key":"3362a08daff495b41e00fcb4786a68fff7a58eda86b6f6cb61bef90aaa604daa","name":"node_adfba6d883cacbb141cd8c59ee04d7e5d520f1ce31a81e5db2d8b2380bf801c1fe4b265a66b71f9643d13a41cb1f6fb4b83399be786da4b6e171b6784bc56e49","services":["streamer"],"enable_msg_events":true,"port":63410},"up":true}},{"node":{"config":{"id":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","private_key":"1d18aaec8f9b90606b18283e8527016a8122999804aa11d280ab2bb37f14a948","name":"node_2bfba66ec9d63e928d77d455f2e10a14d6213e515099d5db14fa44a8bfc147eb0fa7afa9aaccdc86453c6903b55556059a2e13dd61fc494127d4a3ec173bf9ea","services":["streamer"],"enable_msg_events":true,"port":63411},"up":true}},{"node":{"config":{"id":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","private_key":"757285cfa33b746d1bf24044430d43f5ff7401cef2452217ac9fe5fbce629acb","name":"node_0b7e1e5acabcde503ad827e45724402406114a513f81040a379b0f82df2eab4456b348b27936369c49e3c264d971c6a9e2c2217fdbc5e5b93ac6fc219957834d","services":["streamer"],"enable_msg_events":true,"port":63412},"up":true}},{"node":{"config":{"id":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","private_key":"cc0bf84e41ddcab9146ec892653a911dce5007786d77ec7a32e490fea0a29687","name":"node_7554993f6efd8d9016ff525ae73c41ee2e0dbd4970c563ba9b61a99c1c8943b433c4b7d48450f6e0fbc9ac198d907698093de20e6c1f7755520fb1e1cbee4eb4","services":["streamer"],"enable_msg_events":true,"port":63413},"up":true}},{"node":{"config":{"id":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","private_key":"d1add26924dcfc37eefccd6271759a9b0a2052607f3698be305e1c9bcb47ea66","name":"node_4fe37f2dfb03707c90a6fe91dbcfd7497db70ffc20043091d50e1cee573210c144e8749340f2c3cb70fe8fc51b317d49e8734dc51ce64b3cdccdd639ae35d1ae","services":["streamer"],"enable_msg_events":true,"port":63414},"up":true}},{"node":{"config":{"id":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","private_key":"fb8563b48e2c07948cc2347d50c953b2b4bcd79a535c2ac597d8f8c7f1ffa8e6","name":"node_a7507aa5665e165ab2e2a07def272f0677f9d6d35bb82268a34214384e7d8ef7635a299368752e63cfd02d4e60231076baf23cfa10d17492e55181b391ecf335","services":["streamer"],"enable_msg_events":true,"port":63415},"up":true}},{"node":{"config":{"id":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","private_key":"f7b5d2c9faba98230f0e0bbd82106d1fb949413a7940eec52e71e9c5c7266d3e","name":"node_7e2b0b4f3b55e97bd7241b984ad117af33bf3baacd22b3ed503a8a59f75828df745fb3ce3be4276d83eb484e64d9aa251103fa994ef119eaddb97a3503b9f292","services":["streamer"],"enable_msg_events":true,"port":63416},"up":true}},{"node":{"config":{"id":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","private_key":"61a9bec441ae9ada2f3ed71874596db20f2807e921453ec39145770056e3cee5","name":"node_460531928a4b084686343c8464b37c3452bb3566045698d08a4692864de5581a9eb1dc632329e7d3ccb73ec31ee7693787d69df8458efaba9a7105d87ee2e053","services":["streamer"],"enable_msg_events":true,"port":63417},"up":true}},{"node":{"config":{"id":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","private_key":"56e11a31d85d33461e13dd635ea6c0d0be892feb3ccc9dadc327bbd855401d2c","name":"node_70ee3c7e02a123f78345d41c386e413f06b51f1ab346c2c472891eed7dd26a1f14e213a0f4f2d872859b9b535936a6d9b072d2604456f76221a422710411822f","services":["streamer"],"enable_msg_events":true,"port":63418},"up":true}},{"node":{"config":{"id":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","private_key":"6df50913c97d23ce9e4ed894465ae4eb0f562d595e46d694b47e72d31c8bc8fd","name":"node_049a2b0ab4d49789dbbe1837e2d2ee5220a9401729ea87ab29385b24d79cdce255c3d2b5de6484d49ca6ce07bd41832598260c0a8c290e01d133d77f066f2f99","services":["streamer"],"enable_msg_events":true,"port":63419},"up":true}},{"node":{"config":{"id":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","private_key":"164a5b537bdf9173b59b281a68d7da48819c2367e5b5faa1c94c74453a413015","name":"node_1f6d803a4ca186463772850ca0901fb920af7e74fdd2480c3c368fa707838ee91bbcfb57d5e3510c802b9b85f2d954f04c9b675414274bdaebae6488dcf94c10","services":["streamer"],"enable_msg_events":true,"port":63420},"up":true}},{"node":{"config":{"id":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","private_key":"0b14673d7790bcbb1b3f0d042dd9b22953002e6dd901486b6f203063bb8b5a79","name":"node_979838eaefcff456cf1cd9c47ea46854704f5757d8d7ab907019bc422b01af4d62252579bf045d143fab491b0bab823190e2782a457fbf51aa99ae17ec9e145f","services":["streamer"],"enable_msg_events":true,"port":63421},"up":true}},{"node":{"config":{"id":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","private_key":"5d6c015866ee2afba25f1435274fb61e0b11b93829309bccad6cb662e5a4c8fb","name":"node_ed6c793eb4565aa9d883a76fad6c97ad0b878b9ef0235e11e89db1af25a9653205f725c6ea258b84bde134f1a6437c6d109b859d17509e5016c4ab98be59032a","services":["streamer"],"enable_msg_events":true,"port":63422},"up":true}},{"node":{"config":{"id":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","private_key":"acbf964dfcd41c86715a5ecb9c03818b577cbb0755692cde879ff1e4b09e5df6","name":"node_6c143960dbe3ba4c95e8debc1fda5f420a2a673eb46f7ff7d9a30f4cd2067e67ef8926bf17f0c99b16c79b6dc066b52409a11d47117d4fda4211636b1b74f96c","services":["streamer"],"enable_msg_events":true,"port":63423},"up":true}},{"node":{"config":{"id":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","private_key":"0b325cafe8524b8c126e860a6295fdeff6cf26da5e8eb426b86b25ba049c942b","name":"node_7bbb3f3ed51cf84c077806fbd6d3578e105bc32aa6043da188793f066ad6df383a9f7cc0bd3124f4c887704bd188d480ce264fcdf178905bbda3b270927ea138","services":["streamer"],"enable_msg_events":true,"port":63424},"up":true}},{"node":{"config":{"id":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","private_key":"e03e1d397bdd121257b1cd781c14847cf220f23fa837a4ba7b48f7b0b51cdc3c","name":"node_2b70e5ffcc0bb1c4f8acc09dd1016e67c9c96c92d091ad481efbb71bd8b2a5a5869c6d668617a9b2cbfe91baf5edfe150c3824c84d90899a974099071d171441","services":["streamer"],"enable_msg_events":true,"port":63425},"up":true}},{"node":{"config":{"id":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","private_key":"8e1b0bcbebda90c6f0ba8edadd9133b28b77e49b584580e1219654aeeb9e3a2c","name":"node_f5c1215a84a56d52f92ca0dc3a32df98c98a9c2ea2e9a34560210c16de1b440d20d043c8c25955dda8c22e55e92ddb49fd82e8b9b84072aabaa755a229bb19f4","services":["streamer"],"enable_msg_events":true,"port":63426},"up":true}},{"node":{"config":{"id":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","private_key":"ec0e383740a40976e4b9195b6a89e9497e9562729d196b3febbfea319be5dbcb","name":"node_8c6d77833bf1a98beabe7a92d985d13d52fb2e50768719ffbc6fce21ea676802a074b6e620b3ef80e12fad04f94a3c288d91df9716a6cfae09ef073b9dc1f2cb","services":["streamer"],"enable_msg_events":true,"port":63427},"up":true}},{"node":{"config":{"id":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","private_key":"a8c69a5c41f2362bc5de8589f3686f3c59b02b58cb7139ba2325f1a7ff62c39e","name":"node_b3316f4fd7dec218a52331f25d17a2faf0f2a417808d7dbb80038154abfbcd2d78da074837b648cff28675f4aa0d65ddb7d15abf3d7e0391d401e313a3ef24a2","services":["streamer"],"enable_msg_events":true,"port":63428},"up":true}},{"node":{"config":{"id":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","private_key":"65ded6c2ad477ee077e81c1aa90fba5d4e0d794ea8dd5241a1545869c895185e","name":"node_60725e8d0e9333636e598dd666f459b4be898d9abc095ee2c1db289673e7e969b50e2093956fef5a2f1d23e2040159bbabaaeab17fc6dbbac3f6acab766e9e60","services":["streamer"],"enable_msg_events":true,"port":63429},"up":true}},{"node":{"config":{"id":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","private_key":"9e522b8e7f94aa50d51d7ac396a12701677f86d0f9ad7111b329ba8229880db1","name":"node_48a5e01e06e297dc1c640ac9601171495bd70fea461c60e7e6e2532695e45fcf68183c2e58b5e6931a6c1c094f5331efbd7f2d93d5f84efdec5a35afa2124438","services":["streamer"],"enable_msg_events":true,"port":63430},"up":true}},{"node":{"config":{"id":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","private_key":"2325b0e86e0abaef149e6063ff789995d1f6d863de595a5abcebffdad494ebb9","name":"node_5dc69635f6d573c824ea83b18593a47f9f21a6f91ce18d2bf977c97d21f8d2a8ce88829244d12a07d949bbd52fe8a2035bc89685fe1bdd4ee20d766d75d3deee","services":["streamer"],"enable_msg_events":true,"port":63431},"up":true}},{"node":{"config":{"id":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","private_key":"dbdf629720f7cd6d4a8e26a5bb6da882212d6cbf43ddcda4712539c3db89bbf5","name":"node_ae4e21e1587a8475afd299e00ca7085c7bf2a44c2c64a3068f12223d9202b0125094385319034691ec26b497ec9cf18fe8c0839224bac1b84279410241cef979","services":["streamer"],"enable_msg_events":true,"port":63432},"up":true}},{"node":{"config":{"id":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","private_key":"315e74a348a3f8e172319c29da33577435f6415466e8cc289af2dc7e142987d7","name":"node_0b30b36e155db04c448b662c4df695068b2331cdbe2772aae5fda84159e977515a5ff2e156bc225a9281fef2383926ba8cb11e9c1846fb40db241e524ac14e29","services":["streamer"],"enable_msg_events":true,"port":63433},"up":true}},{"node":{"config":{"id":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","private_key":"510061145b0b868f1fb7e83b850d0901227724f4559e912c0561ac310308ea80","name":"node_17a79cb279306b6bbd35219278f6bba03111079d6c4fadcd3c5e57b09678e111bda5f8e36ca3d223e51e255d6e857363b7741e438b32ec6e6c0dc1b224071081","services":["streamer"],"enable_msg_events":true,"port":63434},"up":true}},{"node":{"config":{"id":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","private_key":"b4c3b4d3b3fb735ed7f1b4dbfa53fb08ca505f7570d376ca8ff9ba10c108fea8","name":"node_617595a230e0a74a3db3b47cd27b941e02bdee9a84cdfa8eaa63a55941eb5caa79e20fb69726a4d46a0e5aeed24039f8c5a20679a692df0bc140f42558ca9a2b","services":["streamer"],"enable_msg_events":true,"port":63435},"up":true}},{"node":{"config":{"id":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","private_key":"0ceaf25d118fd30dfa73bfe157c4bfdbdd7bcdc44e699e71e2e397eff0988045","name":"node_7808fb798d22e78fb1d39b87ddf99a503f820993bc64149eca9e81d9d58fc1adea60d8de14a4f06cb89f3190c0ef0c5e182621a14c9361ccb7e0cee667599cc3","services":["streamer"],"enable_msg_events":true,"port":63436},"up":true}},{"node":{"config":{"id":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","private_key":"b8dcd04f9dd7c7d9522112f1d10c32738ce2283cb755c14b83b3e7d8d645c4f1","name":"node_f039df8a3206e6e17eee8e95010038c450cb4cc0b5580ed5795d4c21802e1e9d360f4528bdca794f457932b1d6a818862ec847357a861c488332ef6d9480daa6","services":["streamer"],"enable_msg_events":true,"port":63437},"up":true}},{"node":{"config":{"id":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","private_key":"e0f1d278d1346984b7b19789e39ae0ee607d17f0fc7538e8dc8537b44c09e142","name":"node_ce0a09bb6fe4c9c93c3dbd800ca9c9ac0714f26a8f8dac2149b6ce7a9011912a5621ea2e45de35c4d31dfe5add00558fdba5dd21acf2d81ba391e82b5b3a5804","services":["streamer"],"enable_msg_events":true,"port":63438},"up":true}},{"node":{"config":{"id":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","private_key":"6c9376463118cd8a2c68423af478150a6e0a1b811b922aa7d35974ec65943ad1","name":"node_b2538d4edfa736bfe2cc21326a44ce62f716b3480eac93584a2233b69c98883a2bb255f246218a58cecab1d0d176e6d1fbba9782fd70d4603e01742299b9ea9c","services":["streamer"],"enable_msg_events":true,"port":63439},"up":true}},{"node":{"config":{"id":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","private_key":"d391fbaa56954f68499674edef05d07d58c5512ae18166b141c961a4dea175fa","name":"node_aa9a94d6e4eaaed20113c21752c224e3a052abd3769bd6e832759dbaf5154a943cf094eacdcb0727c2fe51a11bd7fc0793d7d5e3312b0aba89d428a00e1fde0c","services":["streamer"],"enable_msg_events":true,"port":63440},"up":true}},{"node":{"config":{"id":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","private_key":"199542f222419c9f399da0655278169815321c4420c8e39a377faf1446b6da1f","name":"node_65e954e60837bda10654480b227fa3bcc6e63356c52079002a27e836cd82ae2934ba77da60080e4b9f2d9324b982b24959bfd9624302e6c330408381054b43e9","services":["streamer"],"enable_msg_events":true,"port":63441},"up":true}},{"node":{"config":{"id":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","private_key":"ff50f9bc8f6ce42cff12b697c1d4880461773518aaf5f25e5c8a03a8af128fa5","name":"node_8ca3b63cb84f1e9883d82809a9b6777ec1029ecda96fe93b4d494ee9cbefcad13f381b3e480136e542e01054fe1ede66c65db84a0009871ce49383db461c8438","services":["streamer"],"enable_msg_events":true,"port":63442},"up":true}},{"node":{"config":{"id":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","private_key":"2c15cd49d4a7fc8bf1acbb4f86987efe85c77ba2712f82531bf893084ef4654a","name":"node_caaf695c76cf7c047d3f3bfe019d01618e4871cee8ff3f347913da815bbcde145771486f916a44d03f59ea9bc217f169fd0c0765fda3f9b9b28d02a522e180b4","services":["streamer"],"enable_msg_events":true,"port":63443},"up":true}},{"node":{"config":{"id":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","private_key":"4c9c04de05a7a437923df855213efcc8c9489ba08352e267097b6bca9e840fba","name":"node_b080891d4ba6d3ab224984360597f9c555bd1367630f5420bfaf230419a05b2be58bebf1554e53eb4c0da81cfb66d4f7697dd65143f11841ff62d8a0d82b6b67","services":["streamer"],"enable_msg_events":true,"port":63444},"up":true}},{"node":{"config":{"id":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","private_key":"5b756c056cbcd8e0a9a926f6ebf3360d7587152f836459cd22eafd76c3984af8","name":"node_2ca05ffc0ad771e1e045a47f1c0a79ce374a25e3c0e53c2a80d67e7479677003f62880251a83a5074f1c9651d828f1ff7e352935a9df141c1eb75a0c59b00a8b","services":["streamer"],"enable_msg_events":true,"port":63445},"up":true}},{"node":{"config":{"id":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","private_key":"fd26d9072de53e5f0a3d88d7c32e80650d289f661906c9837a7a0a003f3520ac","name":"node_8d4920d6e3a6717699b5a3af068cbdfc16858d7e393d158d41b1b5f345b47129eef89e1d055386c518f400b134678c21590f0317dea3436d4cef60f45455cf12","services":["streamer"],"enable_msg_events":true,"port":63446},"up":true}},{"node":{"config":{"id":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","private_key":"3e2d345fa05f2ec2c8c4ae80fa808f0acaa098d08a2a0e7be1a2749f7d01f0e7","name":"node_b6a998dea59194cc60ce97c7c9702368411889cb6905516b23f41cc5116fba8d0f237d418318eb0c333cad18003c0e9a6bd8c99080520771f2bad640e2e5ec1c","services":["streamer"],"enable_msg_events":true,"port":63447},"up":true}},{"node":{"config":{"id":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","private_key":"69afb2f43d398d53995f3880ed20e91b1d92307e4f7b40cc63a785ebe01f5e9c","name":"node_ff6f94005d1df7677600069764855c1c2aa0543cbe9f480f8feefec76c49d9e2c7bb2d8e38c89e9430f53f8b593d93f143c45985a56a5a32c736128214c95eda","services":["streamer"],"enable_msg_events":true,"port":63448},"up":true}},{"node":{"config":{"id":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","private_key":"30cd694a144038e53930a6b5e32f95f2c9caa886829d241c282f385107d7b824","name":"node_315b8a1711f680c2eaa607e35ef7a9e19c2b61721af8a7e08f1325dde1fe33cf1f47b3cc4acf12d541631041cf1b42754875fd1c9b66ee32797b72b9f7711256","services":["streamer"],"enable_msg_events":true,"port":63449},"up":true}},{"node":{"config":{"id":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","private_key":"c1480926443179b2e410d0303830b51d36dcce107b45da1494d87d2bcfb4f2dc","name":"node_396c703d27bfdddf91761f134cbf665fe61e0b3a5d24036a4105a625f72e8c28b821e9200f20d6e8f8b3ed6b95bda6b8accdd840c2f786720b7431e3af2af981","services":["streamer"],"enable_msg_events":true,"port":63450},"up":true}},{"node":{"config":{"id":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","private_key":"e91e000d37d0a336fb7eaab8ca7baa4db177108f2140ee86f7bef5959b617e13","name":"node_cd8815d66aee8bd488d4e5e25f0cc9c71cc65349f701ea26b1d6cd9c039d16fcb473dbf270a3b33187720ccf4b0ce4f78a6d6edd05f4fe804772d5b6ec45bbd3","services":["streamer"],"enable_msg_events":true,"port":63451},"up":true}},{"node":{"config":{"id":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","private_key":"991b1ea8ca82edeaa0c2d410b9cc297064d8d6668b9c8fb3277a6e7a934bbdcc","name":"node_7174eca109a1f717653918224c8cfe1b7fbd666405196760913593401eb79f2c7e41003b01f5a458940695b27a4673443c7621a169db7fd968994e552995dbbb","services":["streamer"],"enable_msg_events":true,"port":63452},"up":true}},{"node":{"config":{"id":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","private_key":"0c19513041b301f0745e678aa627a44b7cc58099c6616d5fed0f4e4774c5378e","name":"node_59b53f8a562bee519276e0eeccfcf8c975d3102f5d0cccf5abcce291a8a5bb817c04604f123686177a50a03b9d7559ac469962d0159d1d93e4ce58a304d04b55","services":["streamer"],"enable_msg_events":true,"port":63453},"up":true}},{"node":{"config":{"id":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","private_key":"c4406e8f5a2cc5a62bb4c36a3c52cd7831b3a82f06cc18e2286589a6e76a68eb","name":"node_f915e2398aa5d4370de87504dd76c21a7d0be2581c2ab55b7a47743f1bbaef36384eaacec22760f1e914ceac9d96a10c3d66eb27475ef444e77fee979e6e88cb","services":["streamer"],"enable_msg_events":true,"port":63454},"up":true}},{"node":{"config":{"id":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","private_key":"770f973cf2fda14f46f1e91ae608e0b87e0f06b2f8935bba64a43c6998737b9d","name":"node_1b6cad4f9851cc584c5d1405f976bb51a52e27ef4525847df543dcca65ca5eb1ef229dcc68ccbaaf00ab1e044cb5990dd213c805bdb4adcceb6fa70b5c61fdb4","services":["streamer"],"enable_msg_events":true,"port":63455},"up":true}},{"node":{"config":{"id":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","private_key":"2e741e89b7e631818e4edeaee9d795f912805724f2eaaa83e73a3a9e660da435","name":"node_ae2a996d3b562cb47a564934037949da83b1bfe194c23754f3dbe2372ec27654f4f3b6cb7f394570f308025589c065870477667e5560dbe5a8ea1625740699cf","services":["streamer"],"enable_msg_events":true,"port":63456},"up":true}},{"node":{"config":{"id":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","private_key":"c8d2153c48467773449a0c055a3527062b7ed043e491b6a81c6285b5bea823fe","name":"node_ddaf3f8478501cda872c056c72063eb64d5b871fc5fff70704872802289dd2d348f73bc342b7f148a90cfaae2448ebf16fea196be9df891dc71a57fb410d59dd","services":["streamer"],"enable_msg_events":true,"port":63457},"up":true}},{"node":{"config":{"id":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","private_key":"784f624bd696dc1d6afb5bb977c5e6e76ab280e55c95949a68349a62fcc32c70","name":"node_5eccdbcb15ef42dc96abcbcd8b8db75d9230de10e3c650620737f6cc04ba4fdbf59ded5daa801901c191be186c329ebcd37ba83bcf794064ad4e11bf10d3f775","services":["streamer"],"enable_msg_events":true,"port":63458},"up":true}},{"node":{"config":{"id":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","private_key":"f4e049b715346f2e7ac1e31341d0df32e7ba9ae1ab6d9165b7407873add289cd","name":"node_8dd8ad560af84bec579cadb33d51711aa61b6ed22705010336df5a71a94591173b25e869457429c4a199b205fce8e73530e28203e18b971c2001715e610f152a","services":["streamer"],"enable_msg_events":true,"port":63459},"up":true}},{"node":{"config":{"id":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","private_key":"98e1264b7003ea79b1e799c87cb3c8e1aab2ea2e68531cf41f093c4b9f6a98a2","name":"node_28d3232c43de54ffdaf08f97b334c012738648b04e2876c7e751a2e352aaf4d550d6efa976c5a8edbfa8e88b9d04a0fca492b81c3756ef673ab74d34182ca711","services":["streamer"],"enable_msg_events":true,"port":63460},"up":true}},{"node":{"config":{"id":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","private_key":"357e1ab3ea555b0928cf10ec54d8842dc9c0b24a90fbe32ad1a819c018b0c26a","name":"node_be514f5f17f3177235acb24112b578edf0e373c469073226e547d18080905fd062d572be18e943f13bf9fcf5871e89ceb630a1b848a0e370ef8ef8c6d997a363","services":["streamer"],"enable_msg_events":true,"port":63461},"up":true}},{"node":{"config":{"id":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","private_key":"ad08dbea349545a36c8160aa460902c7d2744218b8ff5b8af229a17675560755","name":"node_66d0c5da973d9dd65350ae1ec63776872cdb7ded6afb6f51ae82259f6fd35e884375d15de290625f02ed2e5cdc3f591decb45e5fc64d5b0f835a216fd196f5a3","services":["streamer"],"enable_msg_events":true,"port":63462},"up":true}},{"node":{"config":{"id":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","private_key":"8e27f11572dc1832939cc80ada2ce9604fb91d0633410f87cd7bf68e4629b32d","name":"node_2f360209383d6de4ebd3b4abaf77796520b8654270b03f2151eac4a01b4417d7e0668c1f9ad30c20ff49aa8a0ab33dba5e6095619d1cf04b7af841722ab773da","services":["streamer"],"enable_msg_events":true,"port":63463},"up":true}},{"node":{"config":{"id":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","private_key":"4a7cb437d9c60831cf5e8c6d02e0f62205c1a2de83d9879d1d82ecb6e9b99031","name":"node_b35f418c7935cc54278e90978c3ef1521ab91daeaf9f1ebc1cd25211611ade091cac4e1f009d71059279d507322a4536501980ac0dd44caddc52fd4c593879f7","services":["streamer"],"enable_msg_events":true,"port":63464},"up":true}},{"node":{"config":{"id":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","private_key":"18216d0babc8a162ed03e1c866e0e90d0ea5fd5c2c2ea3f411886de38bf58640","name":"node_fe8ac5d33cd8ab6a1dad9567cdfb89b431a5c4f4a584fc608b92e7dfd06f70988e71e2f11f9fda9ee797c9ffba83bc085939fdf2522dde39f28202be92650566","services":["streamer"],"enable_msg_events":true,"port":63465},"up":true}},{"node":{"config":{"id":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","private_key":"bb317b572ed4481d33b6a67a267264366929dc0e2c12ade71a203b8b3159be03","name":"node_352407b42726dcd1aacc46a912ed8124b8b6a3da4e33dab742e40aa2452953d35dc8f42eddc76695ae2317e9f15dde2cd21be4ce826934695ad1847455661d1b","services":["streamer"],"enable_msg_events":true,"port":63466},"up":true}},{"node":{"config":{"id":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","private_key":"bd9c51ff7ece28d9a9808386358197110aa9a2a7d4715cd033a94c4d1d54ee76","name":"node_b137cf2291b530a39516d882200848e7f27a2710e0839b4d25b4f367bea6a0c3aaef8c7c7851c00a2945adcd819ea0508610afc1f453b8bc512b7b4d4faacdf3","services":["streamer"],"enable_msg_events":true,"port":63467},"up":true}},{"node":{"config":{"id":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","private_key":"6113b0494786bde04defd28e36030dad5b4368563b7b6b63c08475c18980a380","name":"node_1b063741c76fe65e62b4eae42751319d0cce66f22dde9f1cf83d6cca249a0e65bc7f6f22597697362fadd226222fb3847f8e146961969d1b4c9f7e475389cd8e","services":["streamer"],"enable_msg_events":true,"port":63468},"up":true}},{"node":{"config":{"id":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","private_key":"9875ab2bbcb806524e7fca84b6aba663cbbbec2d533a47e2df6f3fc85e1d8e55","name":"node_657d5370319128d24d925b41065eb619409d63ec6280975d78877a4028287463f6442f5206dd703569a05b2b542ad8bbb99803da265408208d6356a26d283d08","services":["streamer"],"enable_msg_events":true,"port":63469},"up":true}},{"node":{"config":{"id":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","private_key":"43de756eb52b963762bf62085de3293461cb2c53dd70baced6e3c86981545add","name":"node_a127faa19dcb7da585983d36a8e9d3e9a44a6db68507b60c70da71011f44ce377944802f39cd65f5a705cd8249ac1ef7ed8fd699349098f3f8e23b37592c80ae","services":["streamer"],"enable_msg_events":true,"port":63470},"up":true}},{"node":{"config":{"id":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","private_key":"af731618471023aff01cd45c69001d7fa95752c4d42c68df95eab820bb70bff5","name":"node_2e42f845d0393d1682add54ee30b60a953ed283e75d347bc6719ae0e91f6676282e7960f1fd52e5803d6b341fb3582c724b4f9cfd7bce9ce85f13ca480c7e72e","services":["streamer"],"enable_msg_events":true,"port":63471},"up":true}},{"node":{"config":{"id":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","private_key":"3444df2021104f7c577b25a23c3fc0231efb2cae1375cbae67db5602cbbe13d9","name":"node_6b01079463ec2f649db8634cb7a596261c79a8f714d954c772528e0547b017f8ce405e4a0ea9d32270848180e0f77b8c0b022cf95c85e777626edd4d24ea21d2","services":["streamer"],"enable_msg_events":true,"port":63472},"up":true}},{"node":{"config":{"id":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","private_key":"638383a2262ab3e1cb5a1cdf134fb5a0077f21e3bf90118cc03311db43b1cf0a","name":"node_2245f3bf1a3b4e92f912affc75f757cf648b20474c11ffe947884f216b8f24f9dcb6e6a0358a4061b8517478ec15027e185b2f05a777573b4940375bf4aaf2be","services":["streamer"],"enable_msg_events":true,"port":63473},"up":true}},{"node":{"config":{"id":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","private_key":"269f2cacd5854ad6634cd178738e910a093dbfb55bcf42ecd1f1d621f5829499","name":"node_d4b7c787981abec24353c7d496661692233797e3758189bf909a69fe87935bf6da0940daa4f12e81f20c5e88f70b472113688b71a0ae2f91a73ee0e6ff4c8591","services":["streamer"],"enable_msg_events":true,"port":63474},"up":true}},{"node":{"config":{"id":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","private_key":"1f5c7e0be8cb7bacb5c28bf9283884761fcbe8c6b353b5c821d204938da6aab3","name":"node_9c30ad8c85adc7bb52ddcfab2e661cc3a854a689eaa59128d35129d02cd5b0f8da4a44cdd33934a8e2c8fab1760c16d6f2e1c5eb227dc819e85624e63343c069","services":["streamer"],"enable_msg_events":true,"port":63475},"up":true}},{"node":{"config":{"id":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","private_key":"975ccce3cea6896e2dc7fb2fb8399b56deea3eac98f96dfe331602f06386ebe2","name":"node_c8b0dba45104fc7c7dff3ce078a0d3f5ade6198bb4656e2bee8076387929133e5ef2bd293b130a9d4f6a6974ca17e8b4a8f406d1219880f1e0f99c65c63af5a4","services":["streamer"],"enable_msg_events":true,"port":63476},"up":true}},{"node":{"config":{"id":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","private_key":"381480a705e57052adb222beb50053c41122d1c2c10b111a16abfc01e2314d28","name":"node_ff1e34fd51953ed641b431aa657da21cb4c81d23e4eaa13c9cce526f1f1b34593d41f9b87a0e10387fe400c623638677c0efab15dbd1014a0ccc11f9ec92c417","services":["streamer"],"enable_msg_events":true,"port":63477},"up":true}},{"node":{"config":{"id":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","private_key":"22c94340e76bf6f9d70e933f2b3cc96d24f64282bc3d4a61621712e78500fead","name":"node_a78f18691e0dbf3c08fe9d7dec188e6a05a93833432fb99eb2b3924ab0bde7a44db2a102a65544bbdc4fb61bc3a3d569230d9843a335bf619167fb045d78ab3c","services":["streamer"],"enable_msg_events":true,"port":63478},"up":true}},{"node":{"config":{"id":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","private_key":"9b0568309c2ef3f512d43d9016f801f55741346b5f56da355dfe5dc54d652821","name":"node_e67e495385e7cacfe659b40d1ba94d4b1ff55eada70a4d9740a9e452fbf221672bd0a897b940e2a6bed71e2a16867fe45bf0ea0015435ac6d815690e263b1899","services":["streamer"],"enable_msg_events":true,"port":63479},"up":true}},{"node":{"config":{"id":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","private_key":"8ee8a33f33bc96603d61297c73e11d545ac229d887345e12f9fe834c7532e648","name":"node_aacff366e601e072a2113add9020e19b6612f3e85b6e607fdc8cc1b6991f43be0b1f835ed3dc41d1f2b3e0caf7fac252c8eb4c150667d48207fa92ea5f0a7455","services":["streamer"],"enable_msg_events":true,"port":63480},"up":true}},{"node":{"config":{"id":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","private_key":"105fa3b2d400eefda08235ac7c0db7af48667dd5a51b8d001d39e06753e93872","name":"node_2f903b2fd4f9432b7d91b5c3e4c7ee3cb9c56fe7efc4baff0edd06fc75e4b7492f2c3c929755746df59c9f95d437a12ba40ac138d08f5bc7aa091f49f3b852c2","services":["streamer"],"enable_msg_events":true,"port":63481},"up":true}}],"conns":[{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":false},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":false},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","up":true},{"one":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":false},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":false},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":true},{"one":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","up":true},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":true},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":false},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","up":false},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":false},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","up":false},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":false},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","other":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":false},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":false},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":false},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":false},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":false},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":false},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":false},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","other":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":false},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":false},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":false},{"one":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":true},{"one":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":true},{"one":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","up":false},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":false},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":true},{"one":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":false},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":false},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":false},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":false},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":false},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":false},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":true},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","up":false},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","other":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","up":true},{"one":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":false},{"one":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":false},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":false},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":false},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":false},{"one":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":false},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":true},{"one":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":false},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":false},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":false},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","other":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":false},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":false},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":false},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":true},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":false},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","up":false},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":false},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":false},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":false},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":false},{"one":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":false},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","up":true},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":false},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":false},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","up":false},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","up":false},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":false},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":false},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":true},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","up":true},{"one":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":false},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","up":true},{"one":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","other":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","up":true},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","up":false},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":false},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":false},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","up":true},{"one":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","other":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","up":true},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":true},{"one":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":false},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":true},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":false},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":false},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":false},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":false},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","up":true},{"one":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","other":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":false},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":true},{"one":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","up":true},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":false},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":false},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":true},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":false},{"one":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":false},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":true},{"one":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","up":true},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":false},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":false},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":false},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":false},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":false},{"one":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":false},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":false},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":false},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":false},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":false},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":false},{"one":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":false},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","other":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","up":true},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","other":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":false},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":false},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":false},{"one":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":false},{"one":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":true},{"one":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","other":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":false},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":false},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":false},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":true},{"one":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","other":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","up":true},{"one":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":true},{"one":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":false},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":false},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":false},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","up":false},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","other":"00c83e87900972472e247a13acd65450a014a4edf0ab1548199699edeb50886c","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","up":true},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":true},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":true},{"one":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","other":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","other":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","up":true},{"one":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","up":true},{"one":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":false},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","other":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":false},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":true},{"one":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"b40da884b5e0ab429b3608ce6030c0f7f542d008713ed1a444c70d9c00989ecf","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":true},{"one":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":true},{"one":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":true},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","up":true},{"one":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":true},{"one":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":false},{"one":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","other":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","up":true},{"one":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","other":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","up":false},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"d2ac9af919a7bfea9d0acd11bc63874beb8c7213941128ba7e7741c7e79e871f","up":true},{"one":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":false},{"one":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","other":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":false},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":true},{"one":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","up":false},{"one":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":false},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":true},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":true},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"57ee6d3d13e021ae5bb1a7e82c4cbdfeb02164d4305c0b4619a5ea3184d19354","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":true},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"b7aa334a49788734068ac73e4b11bc554776217500c24eb76a85fe02f55ef037","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","other":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"17a00226ac9b2bb0f83e9add9c0ca1bcc830a30e36b1462007fbe261090f7a9a","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":false},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":true},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"aa7876d43dd0ce40f421f68c0d13c8c718d7a7a5e7c567dd20d87d19934cdc05","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","up":true},{"one":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","up":false},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"91088ea79cd8f27da8879760dd21c363aa9be1135437c2b87464426874b597e5","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":true},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"69d8801f9f19fec51b636cc27fca2c93e67dac8f3650aea35259d01293d5c9e6","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":true},{"one":"bd39cdc673c4184193347f0efd74bb894f7f36a994c154ffe3dadcd456efe460","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":false},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":true},{"one":"c7fa3f5dd856ac0cd8fc3f2933180cfe1e605b31c630731f3e0a00d392f4097a","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":true},{"one":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","up":true},{"one":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","other":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","up":true},{"one":"0bc30a547e60dc358f1b431b8f44d46471c19de546723da15e5ec3d3afd2ddf8","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","up":true},{"one":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":false},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":false},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":true},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":true},{"one":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"2a7d1316da51fc5e1378366a543a73fc40db1eb7355b3e199ee237cc1db81abf","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":true},{"one":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"48ec978577e2dbf0448ab119a3821be5d25dbf5a295fd4f695b9311429538a26","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":false},{"one":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"8ea97f6abd40d70717688c5dd38daf6f6b12005df21ae397dfb700fbfe3447ac","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":true},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":false},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":false},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"f1b97eeabc889cdb4f67c699fdb30ad896abe08e603b154abdf5e122bb1e49ce","up":true},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":true},{"one":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","up":false},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","other":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"208e648a32b59b77c2abbeac0402c8d009485a19dd4a04a216cd91d0c6713929","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","up":true},{"one":"2224bdce114e9e87621ab44d1a54b11e7714f30ba695c8353a9573adfcf822fa","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":true},{"one":"510c70916948815cd32759c451515bb024e38e0db8bb128710396978dc705a67","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":false},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","up":true},{"one":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":true},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"802f9e88535e40c179cb5f7d2a16500696e2af2115d3f7ca0cac5c2f634109c2","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","other":"8a5439adf9987f8e0df052b5c32599dba0a25d3e45dce4cafdf2d2ddfdae2f42","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","up":false},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"89efed66fb192f1530bad978261c660cf18473bc2ad4dcb6c3336afefe8aebf2","other":"8d3c0c717a2ead135c414b69841ade94e126eb0a89132a2c6f531728c62a9180","up":true},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":false},{"one":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"f0b803dcfec89e1d68739ca05cf0c9c04e80a2b1cd47496a83168a71184fd4cf","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":true},{"one":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"a9dfced37b98d1dfabb96e5c68f0744c615385328aa469af16fbcf8f28d2062d","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","other":"05a4778e1be7da949c1a7bffa3408020b66b4ee3c98e1f62e35d212c77e83ada","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":true},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":true},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":false},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"3054ce9b542ef2af36ab2b5d4590f2b9794107bbbe55cac109ecd5dfe56d8c32","up":false},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":false},{"one":"3c5ae3bb462b109222b4a1ac1cf9b04508fcd53a2d13796880965e99e0216ee8","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":false},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","up":true},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":true},{"one":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"d0443f24523af0eec6c20b21d84b2d54cb0ba8d4d1a205b41328bb22e8d3cd63","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"d3bd76f9b178b34e0a97bd0130c61a8dfa2097fcbc667f6e4f4eb77227425693","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"fd44f2616755aad3efacba9ecf1d92d0ab986ba679007f735c8bcf3c6b94c150","other":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","up":false},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":true},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":false},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":false},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":true},{"one":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","other":"d90b75bd11ea3243e097f2318bd95a35590c9f113324ffa1f94cd701a5d3eb32","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","up":true},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"e2554d1bf145ec0e7027ca8e8ba0c85fc697bc4b54e36a6cdc53f1efa37a6634","up":true},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e3d8cbd8840509034f081859422bc599750fa4f040d2f90302b9513b433847f8","up":true},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":true},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":true},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":false},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":true},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":true},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","up":true},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":true},{"one":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":true},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","up":true},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":false},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":true},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"f1ad1843560ead294e9d60c9bfc99d8a827f2cfe557e0f9fe7ebf82aec56926d","up":true},{"one":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":true},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":true},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","up":true},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":true},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","other":"d96e430326c7fc91fcd19c4e85b472a41ba24317ff09e5bd8eb2bd7a306499be","up":true},{"one":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":false},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"56bbd975ff675f73b566b447e894d311b8631438163b625436685b019a15213b","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"3ff80089a2ef377b1844881300b3e85041b16f0e7508b01e59a0e76b63c8244e","up":true},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"baafd0d5d03e5072341e9e3e69b8c48041cd6a9ca3da56a1a4934084db6e22bd","up":true},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","up":true},{"one":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"4b8acc021ddea1fff036b4b0e5939c38507ef792490701f7b341e4ff10a78567","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":false},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":false},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":true},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":true},{"one":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","other":"f054c2c66725837bdf1d64602f9d1627d83a3c970d9bcabda7f4d390cd40a438","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":true},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":false},{"one":"0ad654954ad9b21c75831389c89574a7871a6ba8e1d54c92cf26c64c33148b42","other":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","up":true},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":true},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"14e40f9abe8b2c845f2fc62a8f4347ff3630918cd62a33af7788e4bf599cfb96","up":true},{"one":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":false},{"one":"43fbbefa7ed5fb3b496c126bf54a77b7cc65b40c67facbf9605fafbe4e0397ad","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":false},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","up":true},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":true},{"one":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"fd3fcb327e1988c4786dad45a6e325b2fa9ef07ee62721aa5cdafd5529bd125d","up":true},{"one":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","up":true},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":false},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","up":true},{"one":"d56025bb110210216fdc8f86ad205607c6fb4744d3d444931aa17512a854356a","other":"c4090ec37cddfca2dfae52d85993a635cf47547c917e5c69190e24a48db7cafd","up":false},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":true},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":true},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"d60644fb69edf1d360a5b3d480030df97600a3d94a189da98b58c43758c98331","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"8ee7f2d5c359bd5c37ec03d4e02ef8084768e12d094a7cd27cb5def6738b61c5","up":true},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":false},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":true},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"a105c9ec1789d99c59f23257f63e048c0c923e3748d35e6108c8c0a8d10e6ec1","up":false},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","up":true},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":true},{"one":"523768400c5056078f368a95723448fae6747917fb3a9c642930ebfd979d9e05","other":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","up":false},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":false},{"one":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":false},{"one":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","other":"cba44046d693629a872a22812ebcc9919ddd8148ec7085b23bbb828f258b48f2","up":true},{"one":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","other":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","up":true},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"7e4585b52254f6081e19191e737fd1898528a0af77e3d752a081d29b92ac13a5","up":false},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","up":true},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":false},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":true},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":false},{"one":"cf771ee06f5ab9cfb00084a5ee8929d15e434f2ffbc4ba4289cb2471104146fb","other":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","up":false},{"one":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":true},{"one":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","other":"4b70964ce2916bb056cec6da31283f4eb3cdf774b86f3ba36b13f56fec18c6db","up":false},{"one":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":true},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":true},{"one":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"bb3198bb61f3dc96365a99b7141c0b85720614de4640afa76458d27484e1353a","up":false},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":true},{"one":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":false},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":false},{"one":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","other":"f293658b2837cd41cfb4f9eaa18d0025fc5877bcec701a97df914882f4bfe43e","up":false},{"one":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","other":"853bc86aad69d6b5ae27f27b7979f504a3d1033000a4fa164f563357414f2fcd","up":false},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","up":true},{"one":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":false},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":false},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"d66f440d86e43ad7e153ed9f101bd1632e64ddd2e75791fcd3fe819bd190e665","up":false},{"one":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"09d15d7dac32cbd6f9b5b292e6bcb5082d95d24edbb8ddef871890409aab60e7","other":"0d97827f6ea850c310c312598ebe1a92ceae08d1e055ca170f1e305f836ba398","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":true},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"3ab20836f88aab49491e82cfd1f1e8a59b5794cf91644b663d40cb22c5460be4","up":false},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"f97e87f80e6db30609a0811bef5cc7a5884326abed5cc970f3ce580476d0935c","up":false},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":false},{"one":"cbd3dc416cd646687d2cc0373bdd79f44d77f5ee775e298a083d8c62be248f3c","other":"ca8c1a36e8c6998028b7cf45086f6478a622f00878bcd2643bcb021efc8cf50b","up":false},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"6923d78400f277fe29c35ba38a416edd7c960cc75d94c35aa3446b4d5e2f6c3b","up":true},{"one":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":false},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":false},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","up":false},{"one":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":false},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":true},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"c95a481b19583fc85e9b079fa0b5cf51eb46e71b9f57fc6df2e3b78389d8de2f","up":false},{"one":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","other":"bbcbaf233465acdcce94920a2a643c20772074af094a33ffb96cc915e30ffd8a","up":false},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"03059077d3fadf62794756f6947fc32ed00d82162dbe3e6ebcd32952bd421321","up":false},{"one":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":false},{"one":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":true},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"574101500f64e9a1bfbf31f4f379a60a0ea9bee449af1cd29962214dd960b3c6","up":false},{"one":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":false},{"one":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":false},{"one":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","other":"d7c1b747ad01a39ca048916de03c0288d80aede0c968c392a9656f616903ffd3","up":true},{"one":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":false},{"one":"398bb8a4dfcbf50a93de93688331fed42454d4941b367c569e9bc568d18fbc00","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":false},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"6caa4a84138eeb4cbe5573edf4c2381edf01bd386c57f527dde377983301a563","up":true},{"one":"bf6b5c5f8d8b6beab2d82c1ba9616309fa7a3052050e31e5f46ecac4636fd10e","other":"beb777c02dda420daeecd9fafbaadcd2592ed51e9a8a5c5dd7abe43743a88001","up":false},{"one":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":false},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":false},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"d717377aed09d9b0d4f072abd13f49d3e4f64fd8ec40aa45a47d10fdc716e225","up":false},{"one":"85642219f8bb8ce048cfce5aecddc8acd035afa035a0137c354f5b6fc3e3889d","other":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","up":true},{"one":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"98aa8f9e3f434905222090453f2b0a97b7d60a252e0ecd519451645e0e685319","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"df52d5de0f5e69e7e4c9e0ffcec1f9df86d38044bb57e5a0cb18bde354ecb66d","up":false},{"one":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":true},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"1af6b4d9b354555f37c5be62feb691dfa76a531404ed4de5ad2b905c84fc37fa","up":false},{"one":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":false},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"34e48bd6562a308ccf6a4a0257f253e908e97d16defe2f1a31e046d5558a4769","up":false},{"one":"0fa02bedceaa28618f48f319d38b657a356099ac98734f402c4c846a4c35b678","other":"0c728c174a25e11bc171d7d35eaaa3974859a4dbf7a64e1d9c9da6b3ad63b21a","up":false},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"1587ed904df26ed711e2235fea41e5812a7d33ce5dab2ebb4e88515b18f43d6e","up":false},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":false},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":false},{"one":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","other":"e1909ff70b17f666d74c73e8d9803df1e6e20733e4aeecdc78e444b6632d92c9","up":false},{"one":"949386e823234d1afdf2a2134630a8028868bdcdf26443da4db22ece78871899","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":false},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","up":false},{"one":"41b2b713dba3a11683ad83d1cb4beb9ff4f5aaf49f2ad1ac2247c84a85d40a56","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":false},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":false},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"4bf8d8c5550940df9712d758be4711014366af3ea6b5988c5c8610f331f37042","up":false},{"one":"67ee67b8f4d3ee50d8cdd027ba96e4b2f8ef9017bac217bd5a2d9dca35325519","other":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","up":false},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"307c36a947f5c4c597075d8346a5db6133fbd2c14da099f85c1d2b7d6d8331f2","up":false},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":false},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":false},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"0c1956cad397c9cb93524cb23fbfab99df2a79780ae596b93c77fd9db06f7f7a","up":true},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"3388123bad3bf1debf51c5921c09d06f7627d05f6115af39d92dbe9b2f2313dc","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":false},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":false},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":false},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":true},{"one":"d0b76e826a6eaeabdc060a0588bd1becc1901b60a8eb4e8adbe61107883a2987","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":false},{"one":"63de4cd08e00a3dbc071adafe1d1ca255cc6d672e3c5aa6596ab60ed5cc82c5e","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"308528d445007e189c31e695f2bc74af3debab473f57bffd866c601155ffc3d3","up":false},{"one":"8ae89e105f03ff1bacbf53e47ac7bd9af66e0fbc0decb1c11bc60778cf97476a","other":"ffb73c715498775efa3d82de417a4469c66a155ca1149fec7a1ca0a227eab4f3","up":false},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"1fabca181afff59bda173b8de38b04169f9b299880bf72674fdc8abd1f546e9c","up":false},{"one":"0f65210e727ede01a854c3c8d256adced79866c368d0d51fb3ade9c390b02318","other":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","up":false},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"37347d159418873210a3dcfa60c0f6ca50f9007ce6f0126eeea6918bda08b2de","up":false},{"one":"0ca9d19acb9c459358eb69ddaad98dca0b4c13b14cf1610716ed4f84dd972563","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":false},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":false},{"one":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":false},{"one":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":false},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":false},{"one":"5caea6ca046c5e2d3c9e2389600c36d3feba80a455944842c2eb55c5b144318a","other":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","up":false},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":false},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":false},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"2cab6becfcdafacbc9e5387c79bc70dcb9c16e1789b404edf57e05354f05679d","up":false},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","up":true},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","up":false},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"b45fd6b4ce2541816834066dcc1cee4bfb343ec965db53eda986e6b037513460","up":true},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":false},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":false},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":false},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"581ab9df0d109d94291331b68cbbf8bc700d969b2f9e43d0717f88f5409fb815","up":false},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"de1d3e466a171aef4bd47b6546d25c12a1f3120f0a5f68d377dc01362b408a2e","up":false},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"c914c96fb6c0ecd51e043f0395c7c63595ccd990c94d9ee241b14da352aa8773","up":false},{"one":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":false},{"one":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":false},{"one":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":false},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"1953df7e29813b00b0137118623b6ce34113d17d4f9aaa608b81f2ee58ea3fe3","up":false},{"one":"d1bc26382a2c66d93f96f82baa6324a62a1a5574b7a7078b579c452429e61cae","other":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","up":false},{"one":"d07c2c3d684684a3178bac8f4578d1447117f604bc475efe108dce5621643846","other":"d35c12f352b5e8603b6e354434de8310e35f9901af563a3ec775bfa00b806f23","up":false},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":true},{"one":"5c9be78d69b28013fe73a16d07240b540f3399e041c92fc263a94632b1ed255d","other":"57657e7b7d2642c6e5daefd27000d0da41982491486fd1aee57d0f99f072a471","up":false},{"one":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":false},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","up":true},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"3799c5f3ebaad70130fcf00bb8131c78951a8f4bbd67ad2bdadfff4a8f667143","up":false},{"one":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","other":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","up":false},{"one":"f2f5e82cf81f07f8cf82c7171c5ee5a42b7963619fafd4295137357cea1b7bb0","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":false},{"one":"5062d74876fdf425a8e576ed5e56d9719a2e506f45219fc10c48ed44d2f0360b","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","up":true},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":false},{"one":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","other":"dad35b937a6501fcd7483467d81296a6c8541def88d0ce45a702a1d1725bf567","up":false},{"one":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","other":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","up":false},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"1a8ecbde88be22a9bbb5f3ef19be5377923d655fd9cd838f9d08a442614742c3","up":false},{"one":"a1f1f5ce0313b3f63ec10fd5c19aa91fc56309ff599e08e19ed15e43c115950e","other":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","up":false},{"one":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","other":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","up":false},{"one":"715b38eca0c630aad73e5f7d65453c6666f459994e3cc4bba586af75d78e8fe4","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":false},{"one":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","other":"36589cecb182e45d3e9f35e2405ed9a8bccc452028b903d30728ce099323fd5b","up":false},{"one":"3ef6bb1dcd37360fe4a463b70add6cd4ba112a293112911b2304ab05b4c1b543","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":false},{"one":"e56cd20d7e387065be2d52a5c3ea1682765c9378521709887c6e29cbf24b43e0","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":false},{"one":"507060be030344850df6fc76719d503254b38d96d77eb25f49ca9d955944b10a","other":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","up":false},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":false},{"one":"c9114dc588a9d7ba73e41a943d08c528f3a4e811dc8b216cd4ab58171d0f642c","other":"af8fb611627063b408d2b96c1ab68fafb223a86d947de3dac3a59649cd13e0cf","up":false},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":true},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":true},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":false},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":true},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"e5d23024ad9e5dc8915f8d31428e9b3d62f1c4843e276451f17ebb766d06b456","up":false},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":false},{"one":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":false},{"one":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","other":"2cb18a6dd5643091b3b41538bb32dc414785fcf180a5c51f10c8bbcdbc6a7847","up":false},{"one":"9a09aa168f7f4ebd90652d6900ace1ba88b8785290b2687783d4a23e9bdb90ee","other":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","up":false},{"one":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","other":"0daf815b74975070a8ef053b82b2f4fa7919d4888d472f7c57d7b60c7b56e056","up":false},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","up":false},{"one":"910da662d9444f160ff5d934ef667f1f3aaba1fc3275e6ba152f9aa7e85bb24d","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":false},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","up":false},{"one":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":false},{"one":"99eb314acf9de2b6f7085da247a552125e61c97c6b54388a21c0474d717e3590","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":false},{"one":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","other":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"e54d69f3bb061c62dede6e5a8704700bf9b8063edead7c755c9586f4d96754f1","up":false},{"one":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","other":"24f87fd89a8aabaee05033a0a3eefc01ccbb5bbc6a53d615ef34f646a46b0156","up":true},{"one":"eee15b5c5ffcbd0aa56877a6a45aaa323367614180d3e5cf7b4aeefa789d8317","other":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","up":false},{"one":"5a67bff220db75aa2266742614cf15025b9c06aa733c805d0372f10882c292a1","other":"539980a9bfc5ce74bc35d81cc264f4c0d529a75df0c870b9e0b9ce45650a9f29","up":false},{"one":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":false},{"one":"0a3fe6516edff33cde6afc46c6174a8562f17454b6f3ad41be8c12ebf1b0a07d","other":"b04931ea8428258af41286377042ca4ef7b2f507ef3ba14512b36a043a184253","up":true},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"efbb3dd3b0fb3daf4a8a7091d400d834fd9532ce0c3dbebb60d391559d64acb1","up":true},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","up":true},{"one":"6f1c48453e1bfb9c474d7f888d8c437c75db569e2c900867c4eaf3e6504847aa","other":"7ec4083eca4749caa706ac08afc0c91cdcec42f18e4d360f18695a79de362115","up":false},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"ec785af2fb66c0af4c7d6ac750e337a5a8a795a22022cafa8a43df7fba11d9e1","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":false},{"one":"4dc43c820a6c34797152a558339bf468aa48c64e1e54c6158d5ea333a8f3dce8","other":"48df69314a57a6ab2fc31108104aae2242ad2a941d2f87119a151250344aee02","up":false},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"992959c1dabb655a57cbadfeb18436f21226a56968ff0c9926a69b86692cf289","up":false},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"42d6afeae77ae9e99c6bb727126dde5e1338b5421cafe2787251bd19d2b54d3a","up":false},{"one":"e7243f48530c3f040827c02fdc67642c7a0569138337a498517d4fb4d38f10af","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":false},{"one":"47a8e9918ad3b957a888540a497fe46dc4b64a1d1f1f8e1bacefdf6813d91d70","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":false},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":false},{"one":"5e3efcd12d75bb47f842261d24f509018dfa5687e3195e1d1bb2bc602cc9c291","other":"5b308b25cfe30d0b68784dc73be464dfa85a8e49ddd6f6271ff0ee2b63798928","up":false},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":false},{"one":"ce7128ea0b68755aea6e2dd5d5da1100a1e29ebc2d34ce02c0d025a4a700ea15","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":false},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":false},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"c301dfd7e7510fa72b94531ead6c51cceeea230a004a91f9fb472fb19b39bc06","up":false},{"one":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","other":"ebc9b288de5534f762a4ab0e6522955a8f83ad15b662426e45956a820401d0a0","up":true},{"one":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","other":"1a85e13e2ad82c8ffa10ad52b382947e638036120188ae611fb1fb333cb5232b","up":false},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":true},{"one":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","other":"e4e95f8381568c1cba7e8f64dd710554b923241a1c988dddb42a2cd96434705f","up":false},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"36070b5229906c010f3d756c6b9501f80757fdba261e38ea2a294b5047f67739","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"1dfcaab676a9d9a83c7f076449aa0d8446770ec0960655e1202fd7ee426383eb","up":false},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":false},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":true},{"one":"44b7013bcd5e0bd36ed526602614f13a91c9fcfa8613312ae22d9c87377a5949","other":"413b15ae74e38b8610dd5edd52e05630f8acfa4139a1b361775afa8e748ebbfc","up":false},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"2737567dbc8dbfa2a23fbd4264d1bf7cd126b54f1bc3aefdf4170bb80bc4c5a7","up":false},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"efdd79da474a0784c7421ed246f6f8db721bd3551ad6e3793070c432181679f3","up":false},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"86113f8a7d4304ffe158ccc0e94af9194cddbb27604ccc08dd2adbea9878be2f","up":false},{"one":"96419a246f5ca44f2796d91ccc55b3ac477e1754e74d202cdd133e6b5b96051b","other":"9f4c2e7b1c80175a9d7d85c983d9ee406e5d7ba644b0f8e85196c8bc7cbcbf71","up":false},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"b30eed51a958a822528b126471cf7088424a7913a5e89d6aaf989c968a0c4be9","up":true},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"6701b38360d0a72ddc355c17385af34b7ed9eeec00bc3867e162b5571af69e3f","up":false},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","up":false},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","up":true},{"one":"1ea1653a07ce2e07a40018f3a5e8dce0258177e95696a78c57ea3eecc26e6949","other":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","up":false},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":false},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"83d0ffd43e2469b9c3498862d0186e413cc4d205f7854bf9dd73c4d74379217c","up":false},{"one":"e4d6b7889d454cd01ee933f9ae28221702495d79acbd10458082ce90c09fb691","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":false},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"c60e0a8c32d6842453792124d495af30721e79f29947938135f35b341c433ef4","up":false},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"d455034d04322ce766b48f825dcac69ea9b0f749bd5cb8ab2c4e3a18b1c70ef8","up":true},{"one":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","other":"c3d8b4ee532f606e460666e45569c7f54baf4acc69e1ed027af4d7f11e194dae","up":false},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"a0c98f72caba5cb7a4009937ff949b745b2330ed8b1a71ce70f4e59d50459449","up":false},{"one":"b3910e693ef69c37cdfc9f831f04fa8549797edd16ac316a95fe5f9fde3ab3a2","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":true},{"one":"7299df5ce4d90e2e7bfae929fc3fca7175b8899681e626041d8e5721b2ce8e9f","other":"07a6873c7eadb651196a76ab30241cc1c984549c5086f1c3bb1be7bd493346be","up":false},{"one":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","other":"efc128ce65a388db303d97f1f1844f2050f8d0a95820e8859865490ee273b0ce","up":false},{"one":"1daa2b253dc95a37bc9d238e1ac71be213d6f725b3bbb84c5c93f512e2ee501a","other":"ecff394703253e8778a1501c97b3a6a170e3d9d2b3fd8aa83443dec0edf19896","up":false},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"4bbc289546fd7ade8b214daa4e8a23139a85d7e46d70a557025339f6fbbee87e","up":false},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"71bfc67cadc7f06e638f2c87b0e25a4cec35b6655adb27f72b37774125bd38d3","up":false},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","up":true},{"one":"9b87fdd4d96b82263003c90346fc097008ff681bd246227a35eff3b431d6342e","other":"9918da1c179414f75c8d27103c3297a3bf5ccc62ae0bb13859611046536a5959","up":false},{"one":"8434ffb624f336f300f8c4f3315edcaeb99b7f542c8b3c2c972aa6bc210d1302","other":"802e9fa524f1a6a27fdcebf7f25ab28a5c043439b7844b1fc34da8242b6017a0","up":false},{"one":"98bc7e8a4941b065b98f6611935fab096dd4e0bdfd38a9f2ca4b63f2851e2704","other":"940415ad0c47373416bdaea50ed36062a47feb2e09537401f86893f337824ad8","up":false},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"ee3f23e7e62f9af2906703eb9a1dd51a8c2ab3a9ca79c460e08085e565806eb3","up":false},{"one":"8d853eca48be257b7444327d61cf588218da71c688be9847ee9987d54eaed1ab","other":"86d32fe2816f5523698b81c638eaeca28efb3bc4775cdfb4679e0f99bec8a703","up":false},{"one":"e9fa1a8529dddce276f66c78223ca06ceb02fac95ea6e18b5118a0417b370a09","other":"ee527dffd4bae1880e3c5ddcba2e2fb1706c4d40804e102c9f3d514137ab073e","up":false},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"a3f2a0d3dff1914624ae113dd0dfef72175f03ded5cba89ebf75e350c4651525","up":false},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"384305aff56982a885d643f2b7289c5f35658ad5c36a76c1d97030af60ed975f","up":true},{"one":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":false},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"f2b24713b8f8bcab21081bd17d11d859dd5ffb21c9baddd971fdf2d4b51c1ac6","up":false},{"one":"fc881a3a0da605c7781ba6b122f0507f303fa998185a351976aeae89f4ef8b8b","other":"f6a64941b0561dbbfb387a5d448e40eec0493f1c0c1fae4dcd314a1a51f6b02d","up":false},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"d777e45233aa4d8b723f6a6aa9cbf5de4c0b19f6fd00af6d538b67ec01b74ab5","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"3baa42389305677f589107a8ef58e129ab29d0e16820df4ce2195113eeb0f295","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"15ecfd0ece9d43df1cb05bf2cf319c9d954557f3c269f7b0cd7f3edb6c89e581","up":false},{"one":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","other":"60bc3e01e8aace7338d7a326ea7945b5b9d829ae83c5c70dc69fe919b9a31481","up":false},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":false},{"one":"ebe8037a1344f9b599cca1aca404861c4194529ab7cb23b3f7a081f615427575","other":"a1b6a1a989455f9f1955276a0b3b5b4c19726acf8fa3f7218fab420036fa988f","up":false},{"one":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":false},{"one":"a478f5caa8ae441d8e933f636ff6c1166753c0b443742e20434619044a85081d","other":"e850535d4bce69008b1ac52bfc95a9ed7cde04fbe849a5ade3dbb9fa13a67c9a","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a3174cb06f0ed08c640fc23d2840e002f537a07a93ad464beacd92c140a78a9e","up":true},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":true},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","up":true},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"0536088e14b81899b914cfcebd2a3c3ddbbbef905ffb69375613d4853667be18","up":false},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"e31eb44ccf3beb2579ad10ba30c0adb12deeccc54f9c477d30fe6fd8308c1010","up":true},{"one":"9bc3cc7ff18f1eccd36948e6831ce14d0223a27b233d5b839b8662e16f9fb435","other":"175873005cd8b0db7da431cc6cc077615a5c79a88c4698a1ae61f3bea212996f","up":false},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"4c97be06dae9d63322656fea7bf0de266346b61674f95d1eaff0f14618623b5b","up":false},{"one":"44c8c26204fe5a0a48c62466be8079a60b445b4381422242584d8e1918cde748","other":"464b80305ce1b2094c1294c41aa842aeee31680ac90230dfcf26a3606a07f9a6","up":false},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"294066bf056b1530308d096871b08a046086abcbc7ed7a0a97d9fb46cccd6003","up":false},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"b820b318a3a12a7a7f45d06fff7f5d7e3ca2ca8097c396c1d76c735e1c915cc0","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"11a0676648caea71425ae79a55acd71a0f2fdea70bb0dafbb53ac1b8e1249af0","up":false},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"10b16d53d16acc9fcc9d2321bec7cf6ab7600bf11da955dd4f628d0bb92d99ce","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"1d5b85468d868cec2f1be5f1c7dc89b33f61d27ab04e750a556b1e3aaf3f7c15","up":false},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"0020768d96fca0cf47a9632ca25ff794c996042f07a7242ec7c70fbc75e0e45e","up":false},{"one":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","other":"020f57c369b6521552f7498e444aed21ac57832ed3ffaa7b45f607793ea1a86c","up":false},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"e4697202e563f447c9c93f498365f4dc95d14633ed40387b934c485dc3aac575","up":false},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"3a182b774ac0fa9d6ea04720cae972bae0cbb9d9673891abab8ae17e463e582f","up":true},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"1254b1e5c9e80b367520bfefc35cf32a60aff56c48315107c4b07aa1a7866af9","up":false},{"one":"a75dd3af0823e79d336f78762b8d12e55429736f363e540c2c99a8b7bbc535d6","other":"e40694edf0f70c242ad2058bd94fdac0676c19ef93043829e03f7c8a7a23f179","up":false},{"one":"caa321a50e80a5ab3d73f717008f4601f57a21efa873e4f1cc4d6f356fbafdae","other":"3227103897adafbe4fe3aad206bab8253bb802bd980a0c6188500be89e656edd","up":true},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"e6b7994917b34a1a760a48cca74f592aef94f8afd91686b5db8d0389ded09281","up":true},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":false},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"78109d560f529ec24cc69b69eef6055548225c2965e8c23cf8c0650d2d3dfd2e","up":false},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"7aef1625409f479ee1abad565f8d7e73b17714e77f54d1ac1b2fe80382a058cc","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"77bc5628edeafaced10f1f3727a4f579bc69e457720127686d2754bf9803a446","up":true},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"65a670260af4f38603757fba904cde5dc8f1d3240ad5ec6bca3153a4bebc147a","up":true},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"2c4eb13e3d02c91e043130f04f9e248c3d1eb9ac7578b3825fabcb30884fd3b0","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"2e3b4fb6298c357d2a4cfcdb2fcc0be2cbae0a11219e4cac2d0c01de3925dd52","up":false},{"one":"3d17891f506b4c968758f1d58eb35ca883fdd61ae9ad34ec2c076b506c124229","other":"293f6e407f98ce24090e5ed53fe606bbb272b61a3eec3859203ea54d16991e88","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"2f1f2c4c25b97fcd8fbe79506e748b7c0df5b3bc15b884701df127e49548844e","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"ac62fbb8e18ecc4bb4e6f5d4a999bc86815803106d451200457b29730619353a","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"a9365c4cb8daf8bb018a6ec9bb03e9c75eb1955b26d8847b868db8e302a7aff5","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"2c16611229217e96e69d3d4a06f7d44d7cc26e511a816db0362eb52bca1ce3e0","up":false},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"76a5d17fde4e1c671e0338548501da39332c8ef59329d999b0fb6ff704060591","up":false},{"one":"38d707dcfe1a9d09c03b606dd4db89e6ced004c12f61d8b573b5c9f742f512bb","other":"7239f6fcd537b5d59b85071c962d4958806800de127b172c167c2b814cec4d84","up":false},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a0e4e6ba6dda0b76cd43f93e7c7b3923e5223d3cb144715f2f38045e5923f99b","up":false},{"one":"1dfde87c7820c28cd673e6da6fa8c9b73542de6b5acfd99dd1316a22af5eb163","other":"167bc81f7d26f99ceeeda814de5bbfa75f8f2a61575570596bc5a3c618f5d230","up":false},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a011c924104e072ec415cf72255167582e5d3f189f541066ba88b3ae0041b508","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"92d565b13068e8b9af102af40e1112a00b91e398ef0c42a292e88d406c55b4f2","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"93f88beedce7f9581ecc05615ba15fb313006a32a159adf169f2e02ecc697598","up":false},{"one":"22206b3ddff20a245a900b7bfbf2f400709c2670f0c49713be25eb57136e9f1b","other":"2f230166de0362acabe4258a19fe19d493912e0e0613674a6cc963cf48b376f1","up":false},{"one":"a6bdbd75f03fa311700a17ff4054ebf2855f05ab3f2f4af82cad573d91417a83","other":"a077a6f8832a5d7d2146d9b08de0c9f4ae3515a3f87f2751592e1158adb04155","up":false},{"one":"985f1b6d642a9fb71302fe325b3f39aaaf3c1c7ecd3fedb308c3753f7dd4e235","other":"97474907a03344503279f1d86695233962b6d36e597b6e41b11c941c2ca2dc46","up":false}]} \ No newline at end of file diff --git a/swarm/network/stream/testing/snapshot_32.json b/swarm/network/stream/testing/snapshot_32.json deleted file mode 100644 index 55bd2f22d6e8..000000000000 --- a/swarm/network/stream/testing/snapshot_32.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","private_key":"b571efd8e722db149f98412648275074a828e5137b46722413039489eb617b36","name":"node_d2a392e9e7383b895587a7d6eea4a157de20caa9e2c62b4da5a8ff3186d129fee1330ddf3d180b1f59e1aa83686cd163222e38c84a84a0f60139968d6a56cbca","services":["streamer"],"enable_msg_events":true,"port":61468},"up":true}},{"node":{"config":{"id":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","private_key":"fbd2e7bb8b511ed0878fc14a5923105866ab2c3bdf5ee2c52c1a2bc7c00a185e","name":"node_6c0b3b7c1c08bb558d92f0172fb8bfabe52a4bf8348b2f82e50c6d492a595dd0677b4559d7d2cd5a6e51ecdaf9a0f898f154730b87a8d9b265c6a54f9f6802a7","services":["streamer"],"enable_msg_events":true,"port":61469},"up":true}},{"node":{"config":{"id":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","private_key":"60a362da222a74d3d81ed679549417d55a92c79b8e0aab1bf05eb2d01f82c0b2","name":"node_dc63b83b488b7b505d5b2a60680b7dc87b1c5b61509e8030ebc67512ba72c0f616c1594946878dfb29e79f351d7134306778a74d5f5b7d5e08dbdb6dd6ade359","services":["streamer"],"enable_msg_events":true,"port":61470},"up":true}},{"node":{"config":{"id":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","private_key":"00625fb0f90ed61656987faecdd0690f0a97c88e33f6e339fa3a8f4bfc1e640f","name":"node_eaa3ad48682b08d9c91907a79e82938c1b30108745b276788c830dfcb0c0e752134369d751230e95fb7ab9777c38dcd105ad123ec5cc86ef6dbdd11fe31aea93","services":["streamer"],"enable_msg_events":true,"port":61471},"up":true}},{"node":{"config":{"id":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","private_key":"fbb38d0ed3ef4726052fdec97ddd7eb3a3feb3d2fd5ea6cffe8ff97b621958ce","name":"node_331084cce2884ad912d5a20467c68fc261a02d6df0b60ff5b1427edc0885eab66a4f0f7e7fc9c676e994842f8126a3b34dbde91243f26bed6a0ba14babed56cc","services":["streamer"],"enable_msg_events":true,"port":61472},"up":true}},{"node":{"config":{"id":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","private_key":"b5c12698375aa5215df48003ed13c94e00e6bee1a0b05277237d40f0fcfc625e","name":"node_e00f9a5611008d54bbbfe6a1cf402e011c92f540b47a82b7795508d1b857eee4a522e26c8351ddf6e303d353ee35afecbf9f54d7aae36e6736174473ac4caf73","services":["streamer"],"enable_msg_events":true,"port":61473},"up":true}},{"node":{"config":{"id":"231cf4ad6466edcff849ba5f44069f51267dfda535d31a4d7241f5d83c1a521a","private_key":"90e044c682c33ed90f5f5cac9b8181ee978d2cc9d3d3f545140858d324f1d7e1","name":"node_e4b7b3bbeda388842ecb3688c041fe58bbd7e4566818a58b679e96215553dbf8569032a3ae941b3f8bb3e75886852d245bda5abf0c3cf70f532c38235e1a2175","services":["streamer"],"enable_msg_events":true,"port":61474},"up":true}},{"node":{"config":{"id":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","private_key":"2371e6ff2ecc4144ee61efa958488eed6c1f739e81f27bf775db1e9b66e89054","name":"node_0679dbbb51fa0283bcba387daa2180955d402a0ed42155095fcaffb96dbfd6b4b1bb0ed2ccf11cd990dfed4a3b320ee3f64286116a7b617a35989a448c367119","services":["streamer"],"enable_msg_events":true,"port":61475},"up":true}},{"node":{"config":{"id":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","private_key":"87a3816c95159c72a7ad1b466ae9a095f12c7db210fcddd8dbaaa697220f88bb","name":"node_a197cd9e7e2d19287745f486582b7242c991f36183e8b2bf4983d7a9b9026e9884e3295183f376cd796b814fdf352b1c8c5c609a0e5f5d5155ab925d4b6fdeb9","services":["streamer"],"enable_msg_events":true,"port":61476},"up":true}},{"node":{"config":{"id":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","private_key":"6729988ebc04b9398883c068277630ff0de16f16e3f67114380acfdb0d1b530b","name":"node_eb11498b8cebc767d535481938c664359c6c84674da4d8fac729df64e288248bb020477ad4422cf1b7cea844db5ee12bb5cea82ac6e89a338d8ca1073e061f4c","services":["streamer"],"enable_msg_events":true,"port":61477},"up":true}},{"node":{"config":{"id":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","private_key":"208068d7a920e42db04340bf473f822d4d663f5139d664c4375294dd61b1dff3","name":"node_d3b5df108f35a82e569016a06fefadb52797dafb505de1981f6678e2156574893a169b0adcc595377267dec0b7d620b5b50c7e7696c39eecee2c3e5f7bf71d18","services":["streamer"],"enable_msg_events":true,"port":61478},"up":true}},{"node":{"config":{"id":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","private_key":"b3a7fa29c4cbf15e8fbbf289ab9876b438bc80092284efedde8e8d41ac76ad78","name":"node_1be1903b1104bfae07438fb888993cb3e812fc38c8f26af2e68bff9f1758e9a69b29be3636ee24060c09ce900bad2004681e1083792b2a6e532bbfc07a3a0459","services":["streamer"],"enable_msg_events":true,"port":61479},"up":true}},{"node":{"config":{"id":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","private_key":"91b7188a3178bda6cd2991a615801d744f4963a3de963adb8afb3f12d02cbc0d","name":"node_26a6b8d30e0a8954bd9a0424b817ff79fec2e0521c1313c8262be9a3b9a0d1ee7f109be78d65ca9eb811a1634a813f4ba609887fd3c0085628b2a8ebd3426031","services":["streamer"],"enable_msg_events":true,"port":61480},"up":true}},{"node":{"config":{"id":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","private_key":"235b967cd72cdb90b423f2b5604e9157f660b253cd2df62369f204f45c3c4d7e","name":"node_255c353a7585ab1bab41bcca409383dcdff5837bdcd7cebece1b6896fc06d0f65346ba618dc057c77734439612cb8cc3fd8aa068eb7569f0ad9e9e172daea678","services":["streamer"],"enable_msg_events":true,"port":61481},"up":true}},{"node":{"config":{"id":"59a3ef9ba5d0a0137eab9442657cbaaae5bfcd6e77f9678b1b2616d44e442caf","private_key":"f97bf73ba53833e4f4c44023e87cef8ef7aeae380553e4a5a4f3215748646a27","name":"node_c88ceea7f4d5148de8e2d71ffefc5c336cc62d322eb4371e457cbb97573b6323d200ff7678f94ef481c7b9daca3a9a7bab1e658d51fa279d433e19305df57814","services":["streamer"],"enable_msg_events":true,"port":61482},"up":true}},{"node":{"config":{"id":"35b6e31caedb996b4a87a6b12b9a29eaacb4aba4c334543ba84b26d6bcbd65f0","private_key":"c4c2ee3b5792dc5d86b51c4e13c813df452094ff2f6296403d801adb1f75a500","name":"node_4299205173b81c2822767a53cb4728fd5c0e1602d5976ee5db63b8118e489e4645ccdad399d9367e9b87b0a1f39e7988db86af687fe8cfff35d618b19d64b1a9","services":["streamer"],"enable_msg_events":true,"port":61483},"up":true}},{"node":{"config":{"id":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","private_key":"b39dd34865d2f02c1d4c5ef2ca635ef5be43c4b2318b133d281b02dacd8f5420","name":"node_5ed2923d11037da9799d933ea62cd23ce1aacec66a83a6d3a7e420ea0c66ec00af37977a78374df12dc0facb426d0c39cf306bea15abaf40f9072eacc4cf40fe","services":["streamer"],"enable_msg_events":true,"port":61484},"up":true}},{"node":{"config":{"id":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","private_key":"a93bc07ea3d259a03c75a6777e9401f062a8064f6837fda8a1abd518774a75ac","name":"node_66ce6e2c75f429c4bc7de6f1c785258686cfd66867336a1030830bbcc78bf642f4d1920ab5fc68953b70b7aca02ec518515d48d20397ed207ccbeb88c36e7057","services":["streamer"],"enable_msg_events":true,"port":61485},"up":true}},{"node":{"config":{"id":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","private_key":"787adc2aab8500ce6ca1768040b4c81511e7982f525c0280830f8c32486a6fa0","name":"node_cf7d1a8ec1c3e68e862ef18947098ccbf6238fa7f85ee0018b7ac63b5387d6a9dbf194e3aad7edd1fda63ea63f2f5b8692ff885084adfd1f7b6613593960afc4","services":["streamer"],"enable_msg_events":true,"port":61486},"up":true}},{"node":{"config":{"id":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","private_key":"6a830e44eac33e88e29c9119fef789abd89503a44ae8b8dd64c0a26046df4bf7","name":"node_a54b9c0cbc07e65b216f78bc0f56cd7003896641f1aa361fdc11e0bc208ee6bc876a455e89dee8abf67c259c7b6a82e7ac0d6d06cc304ee05fbc26783c09863a","services":["streamer"],"enable_msg_events":true,"port":61487},"up":true}},{"node":{"config":{"id":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","private_key":"71341041894a268f86cf62e8e80605911c19f38266bc49358c54f9955b4bd984","name":"node_82bd5207dec292f911ff7dbcd242bf8962ab256057b1173dba2d71cd8cc77d41f38bf8d9a4eed83edeeb0e6f5bfabe8c7cae9490cc17dca1f454b9ad1b76224b","services":["streamer"],"enable_msg_events":true,"port":61488},"up":true}},{"node":{"config":{"id":"24a154986fbc308c5f2e3fba99f3263743b669ad88ffdd2252cce5fe0c02c279","private_key":"1a7bf17688ee55a634ddbf081213180f5a6e171a4b04679f50a949e88287591f","name":"node_61cbdddf6163152f5f8bbe3c710eeb9afb22dbec78d8f7eb3fd45ba44493b9387765527f059a10e694842786959c501303b1e62d3454c84870c14e0f36a58b0a","services":["streamer"],"enable_msg_events":true,"port":61489},"up":true}},{"node":{"config":{"id":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","private_key":"87d1292398bace7bdd961dc2e1f028d405eeafebf90ef8d8f4b411fdfd74d767","name":"node_74d5d4ec7fdc749d9148b1a338b643e0a06abe03720b1d20b505da1ff1585b09d2cf7053293544fae1409cf26a27144870125787a473a73a1c4ca98509dc67ca","services":["streamer"],"enable_msg_events":true,"port":61490},"up":true}},{"node":{"config":{"id":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","private_key":"1d65bea3808741aeabc5293fcb863c594c7ec07c955b3f23e28d2ef4b0b6e578","name":"node_12934e06d8821c5e149d944ee7a831428dc6c9eee8705f3b21046fdadc2864a9ffe2bdad60a4ba5a34d7a79c22631d52b62d511e81971b6b98896acae9427e94","services":["streamer"],"enable_msg_events":true,"port":61491},"up":true}},{"node":{"config":{"id":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","private_key":"f067299a421cd124f8652427793dc41c8a5e6bf1dc2c4de59ef396ca08e80256","name":"node_e0e0e90fa669023a1a9c564727cc657ce564c23e05b1c2b61f6bfbd5eb03feb75d34b029886e3426e1bbe4a49398794dfefa0557b7db57c15700c69c0e038029","services":["streamer"],"enable_msg_events":true,"port":61492},"up":true}},{"node":{"config":{"id":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","private_key":"5f76a5630d4f1979d6d03dfb0c8836de7852e4ad14536f4b999e565b599027b8","name":"node_1149e4bcd71c75b14ba7492587fa77e4a4de14e5c580a165ad8835258d1afcb15e65d02257ad8884b0e47be061d3129d8e3af90cbe4a1a96f828a1f84e0d72c6","services":["streamer"],"enable_msg_events":true,"port":61493},"up":true}},{"node":{"config":{"id":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","private_key":"0e4febbd0bb937f5992d0e640d5b599a0dfc3b40740d7a0a5fd16423dfcc87fb","name":"node_695e5706cece9d923c19a147283b772dd1ffa79e8d08506d2ed897d89545ffbdac1a130bd7ceeb82a2a57f2b4a613aa6e7264911b909fb9bff27cd435b802687","services":["streamer"],"enable_msg_events":true,"port":61494},"up":true}},{"node":{"config":{"id":"8f7dc84801ba8da80761fe1e0d2fe72a48e45fa753cc8bbe930bf9277a219432","private_key":"54d714717b902eb733a693d473a4b4b243318a9fd68d1b8abe98eabcbaa8c015","name":"node_e28c769630f19e79966bc354bb38313522778e4f06cd0872db8bd3afd7651882eba7b0403d82701cd063cbaee4ba0ba4a97c0c488fb44e8c8b72368d6881fdcf","services":["streamer"],"enable_msg_events":true,"port":61495},"up":true}},{"node":{"config":{"id":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","private_key":"43e07e3593646f9ec6c3b630daa34ba80dc37bc0f5c57e3f3097f3503de413dc","name":"node_2b1d1ec3ee35fa63571f46a2781d5fb14379319da2d67e482c24b27bacc2b792cd61a2c1138b8ba27673b1c08588064fdf9c73c80f0278e4f0ba133d78127337","services":["streamer"],"enable_msg_events":true,"port":61496},"up":true}},{"node":{"config":{"id":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","private_key":"ef8ebfc1df0b19885db4b08df697c11a86c2442bce48d5f6f807b7e8dec70e04","name":"node_b5e3b3cc7ac15224ff10cf8974ceaf7ad2ebb18ab9505bbb342c42e6ca65fe3541c14e1ee10ac3a0e7a0d87c29e25114e0c0d957d5dbbadf6136805be3046b4c","services":["streamer"],"enable_msg_events":true,"port":61497},"up":true}},{"node":{"config":{"id":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","private_key":"1cb586254c20e9a6f4cc428f878dcfbcc8257f00c21efa88519de7a425cb5e4f","name":"node_fb6e36b9de5eef05780efcf16113fc9098a699ac525bd970dc5b6a92f596da6ffca044e434b97cd712a4035c38dd3ab08488042519f6269bc5057853b643bbcc","services":["streamer"],"enable_msg_events":true,"port":61498},"up":true}},{"node":{"config":{"id":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","private_key":"2621e61b3b896a37c2b4ee05a264bb685f4a70c3caf8a162eee28dd6e64fa2fd","name":"node_aca2af376ef1c983514f75cd717c0852e9d4321e705517196fab4fafe109c1f3581866e1865d41977f8c23a31ec7fa218c11db0c87eb4bb96390025a96386f9a","services":["streamer"],"enable_msg_events":true,"port":61499},"up":true}}],"conns":[{"one":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","other":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","up":true},{"one":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","other":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","up":true},{"one":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","other":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","up":true},{"one":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","other":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","up":true},{"one":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","other":"231cf4ad6466edcff849ba5f44069f51267dfda535d31a4d7241f5d83c1a521a","up":true},{"one":"231cf4ad6466edcff849ba5f44069f51267dfda535d31a4d7241f5d83c1a521a","other":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","up":true},{"one":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","other":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","up":true},{"one":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","other":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","up":true},{"one":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","other":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","up":true},{"one":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","other":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","up":true},{"one":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","other":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","up":true},{"one":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","other":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","up":true},{"one":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","other":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","up":true},{"one":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","other":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","up":true},{"one":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","other":"59a3ef9ba5d0a0137eab9442657cbaaae5bfcd6e77f9678b1b2616d44e442caf","up":true},{"one":"59a3ef9ba5d0a0137eab9442657cbaaae5bfcd6e77f9678b1b2616d44e442caf","other":"35b6e31caedb996b4a87a6b12b9a29eaacb4aba4c334543ba84b26d6bcbd65f0","up":true},{"one":"35b6e31caedb996b4a87a6b12b9a29eaacb4aba4c334543ba84b26d6bcbd65f0","other":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","up":true},{"one":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","other":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","up":true},{"one":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","other":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","up":true},{"one":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","other":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","up":true},{"one":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","other":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","up":true},{"one":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","other":"24a154986fbc308c5f2e3fba99f3263743b669ad88ffdd2252cce5fe0c02c279","up":true},{"one":"24a154986fbc308c5f2e3fba99f3263743b669ad88ffdd2252cce5fe0c02c279","other":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","up":true},{"one":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","other":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","up":true},{"one":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","other":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","up":true},{"one":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","other":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","up":true},{"one":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","other":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","up":true},{"one":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","other":"8f7dc84801ba8da80761fe1e0d2fe72a48e45fa753cc8bbe930bf9277a219432","up":true},{"one":"8f7dc84801ba8da80761fe1e0d2fe72a48e45fa753cc8bbe930bf9277a219432","other":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","up":true},{"one":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","other":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","up":true},{"one":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","other":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","up":true},{"one":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","other":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","up":true},{"one":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","other":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","up":true},{"one":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","other":"35b6e31caedb996b4a87a6b12b9a29eaacb4aba4c334543ba84b26d6bcbd65f0","up":true},{"one":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","other":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","up":true},{"one":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","other":"8f7dc84801ba8da80761fe1e0d2fe72a48e45fa753cc8bbe930bf9277a219432","up":true},{"one":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","other":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","up":true},{"one":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","other":"8f7dc84801ba8da80761fe1e0d2fe72a48e45fa753cc8bbe930bf9277a219432","up":true},{"one":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","other":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","up":true},{"one":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","other":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","up":true},{"one":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","other":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","up":true},{"one":"35b6e31caedb996b4a87a6b12b9a29eaacb4aba4c334543ba84b26d6bcbd65f0","other":"231cf4ad6466edcff849ba5f44069f51267dfda535d31a4d7241f5d83c1a521a","up":true},{"one":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","other":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","up":true},{"one":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","other":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","up":true},{"one":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","other":"59a3ef9ba5d0a0137eab9442657cbaaae5bfcd6e77f9678b1b2616d44e442caf","up":true},{"one":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","other":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","up":true},{"one":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","other":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","up":true},{"one":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","other":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","up":true},{"one":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","other":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","up":true},{"one":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","other":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","up":true},{"one":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","other":"231cf4ad6466edcff849ba5f44069f51267dfda535d31a4d7241f5d83c1a521a","up":true},{"one":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","other":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","up":true},{"one":"35b6e31caedb996b4a87a6b12b9a29eaacb4aba4c334543ba84b26d6bcbd65f0","other":"24a154986fbc308c5f2e3fba99f3263743b669ad88ffdd2252cce5fe0c02c279","up":true},{"one":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","other":"8f7dc84801ba8da80761fe1e0d2fe72a48e45fa753cc8bbe930bf9277a219432","up":true},{"one":"231cf4ad6466edcff849ba5f44069f51267dfda535d31a4d7241f5d83c1a521a","other":"24a154986fbc308c5f2e3fba99f3263743b669ad88ffdd2252cce5fe0c02c279","up":true},{"one":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","other":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","up":true},{"one":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","other":"59a3ef9ba5d0a0137eab9442657cbaaae5bfcd6e77f9678b1b2616d44e442caf","up":true},{"one":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","other":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","up":true},{"one":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","other":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","up":true},{"one":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","other":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","up":true},{"one":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","other":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","up":true},{"one":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","other":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","up":true},{"one":"24a154986fbc308c5f2e3fba99f3263743b669ad88ffdd2252cce5fe0c02c279","other":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","up":true},{"one":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","other":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","up":true},{"one":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","other":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","up":true},{"one":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","other":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","up":true},{"one":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","other":"59a3ef9ba5d0a0137eab9442657cbaaae5bfcd6e77f9678b1b2616d44e442caf","up":true},{"one":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","other":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","up":true},{"one":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","other":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","up":true},{"one":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","other":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","up":true},{"one":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","other":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","up":true},{"one":"231cf4ad6466edcff849ba5f44069f51267dfda535d31a4d7241f5d83c1a521a","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","other":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","up":true},{"one":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","other":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","up":true},{"one":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","other":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","up":true},{"one":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","other":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","up":true},{"one":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","other":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","up":true},{"one":"24a154986fbc308c5f2e3fba99f3263743b669ad88ffdd2252cce5fe0c02c279","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","other":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","up":true},{"one":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","other":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","up":true},{"one":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","other":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","up":true},{"one":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","other":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","up":true},{"one":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"59a3ef9ba5d0a0137eab9442657cbaaae5bfcd6e77f9678b1b2616d44e442caf","other":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","up":true},{"one":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","other":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","up":true},{"one":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","other":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","up":true},{"one":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","other":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","up":true},{"one":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","other":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","up":true},{"one":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","other":"8e5f934e6d0f0bf34425c3db2db405d238f6512cf132926ebd0b596fc721fbe4","up":true},{"one":"d668b8cc215cdbc92be719a33623494090ae0fb1a80f53bde0315b1a8fb3d139","other":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","up":true},{"one":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","other":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","up":true},{"one":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","other":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","up":true},{"one":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","other":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","up":true},{"one":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","other":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","up":true},{"one":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","other":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","up":true},{"one":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","other":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","up":true},{"one":"7514001adcdeb5c9a0e88fb54082e96a5c162430dfc56b6da858607880366ff5","other":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","up":true},{"one":"484875287058e78ed92396e00f34e75f907a1f42d5597b9e8c30afcbe50c1810","other":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","up":true},{"one":"5ec7e6ffb44f67eccc35adbf0923755cd5b6a8abcdd371db9b1be555780ca5a1","other":"391e49ed641480c2c40febdb23263264c83b2b6cdf3400f6526f7939c0245c17","up":true},{"one":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","other":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","up":true},{"one":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","other":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","up":true},{"one":"8f7dc84801ba8da80761fe1e0d2fe72a48e45fa753cc8bbe930bf9277a219432","other":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","up":true},{"one":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","other":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","up":true},{"one":"914839ec95b100922429a3616522daffc51c1a4c39b297d1d8cec591567b4ccc","other":"8d0984a32d4b044065588b4bbe48531a30881bb869399c81b90b349e57f07ffc","up":true},{"one":"d5355c5eced7ca0b210934d2e4f11ae09bec1c62246548ea092dc29e9987171f","other":"de95f5a58a8880b9e98f71c687afa472882244c012439719b6b066930355c993","up":true},{"one":"e7ac9c3a8ca80703b3499a376d57e2a9523b3bd3c5cf35b7a450f0af44680686","other":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","up":true},{"one":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","other":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","up":true},{"one":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","other":"7b889ec7b0674ca8f6508a35d920149f1826d410b796e52bfa72306b1fafbae4","up":true},{"one":"d514861e573828617604db5b88f407b152409308657454f99fc2820b44a45088","other":"dab5098cf929579a87e26d30f9a8b001ad3158afe0f6231c50e58f33c6d62207","up":true},{"one":"930de56c1ea44a1b39f2f99f6780ce284042d59238adb1047167c6329be4a291","other":"bfb02423df06888f87e8fbde52c2373020896f2a3dea69ecd2efa89c1aa298ac","up":true},{"one":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","other":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","up":true},{"one":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","other":"a1b5ab3013c0031a169e72847a4509e83b994086fdd82b07fb6ca0d7cfe9d537","up":true},{"one":"9756cdaac61a9ec4d346e352862ddbdb627f56b5bab132a31348359f62652824","other":"a82935d4ce212895fad97829cc8e04bd1ae1c53323af4e6d8e2c673b7dfaabb9","up":true},{"one":"c71983aed3779037757e433a4f916be40f5199e89861a3998ccdd7e5e76f69b4","other":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","up":true},{"one":"a4e6f50a17347a8475d6b704484b06869d9625993761acbde6a0ae5ac0b40762","other":"b412abec3dd5145d9236498056db35e50e0e90697016c757724c15a2e9b187af","up":true},{"one":"d81271c644a75f0bf9d785319aded8b7a0e9323f85e81e94ef951e8c66251e75","other":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","up":true},{"one":"deeef9d38d9afb206ee7e6447e80befaf387c2af476a7e0c60c55c73dd36450d","other":"d19a0c646122e8d0b8148da1f64b3cb781fe974687a071e5a8522e9a22bc6646","up":true},{"one":"a0ca706ab2ba950ff9bb92123c66c95132a63b9c93975b9b6e0d485937dd8f65","other":"b17b568780b3a029d4292a742890d41be6a71031b15e6276792a77a9746f0699","up":true}]} \ No newline at end of file diff --git a/swarm/network/stream/testing/snapshot_64.json b/swarm/network/stream/testing/snapshot_64.json deleted file mode 100644 index 8785c9e087db..000000000000 --- a/swarm/network/stream/testing/snapshot_64.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","private_key":"0736b1ccd6a1d7c513e312d29a8afa6e1231954e17a66886d0bbcf0dc191b170","name":"node_a48a667469a1344cb70f269b21fb3ca9e83823226749fd9c232be1b86ab9427888f2ecb20ddfa56da361463a061e192570f2f8da3fa967c473320ca85e382c53","services":["streamer"],"enable_msg_events":true,"port":62976},"up":true}},{"node":{"config":{"id":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","private_key":"edcc0061564101058d0caf2a7dd7cd178a2fd7f5de93263f1b2abac25ce28360","name":"node_8f6fb4a5baf715e001b060ce72378829279ce06a3247bd4a6faa3c725ee1b949570373e4231de82981020563e704297e77172506101b1444fcacfcc5f211827e","services":["streamer"],"enable_msg_events":true,"port":62977},"up":true}},{"node":{"config":{"id":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","private_key":"911635b150029a2a56d4a5b647162774df1ff5e6946c727ba21e3e8cad2c41ce","name":"node_e7b1563d6e089e030983b075b590abb8a3205e9bce953f562b755ba150a3edc2dc3377259d96c05cc7363a23aed613711ca049e26253fd9273ac4c0483087015","services":["streamer"],"enable_msg_events":true,"port":62978},"up":true}},{"node":{"config":{"id":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","private_key":"4bd5083735663222c8e8948125c8f606952ef887a4a07888d39d8aa6af0568e8","name":"node_d0718ce0dafea66ee16c79626e020355273cdd062c0fceb122e391c4ca6e4e408a1b0e8230c4ade5bc95803916bdd6d98c99d2b6ea70c32e17fa1f2c98741a90","services":["streamer"],"enable_msg_events":true,"port":62979},"up":true}},{"node":{"config":{"id":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","private_key":"8cb2a950934e687c8aea0a72114b26989bccfcdf508f584a549d05091aef2c3f","name":"node_af3f9dc00ce3cc156000f16a06c55c123ccdfabed89c9aee4478ff439b6f52a89d0501cff626d36b7f1852737955f7a036b25cf259580e8f46a3e0e44340b539","services":["streamer"],"enable_msg_events":true,"port":62980},"up":true}},{"node":{"config":{"id":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","private_key":"3c147cdf4e85087a9c0e37ff5d96de7d977ce3d3711090f64d2c3bea39790167","name":"node_95c3ca2362de2eb0ac8efdd243918ed216f5d124bc6f5b9d83a6ee1aaf8a0fbdbd70ca1710d1ed825d6871f13a15954725f1aa1b27b48307844c0bc27baec0db","services":["streamer"],"enable_msg_events":true,"port":62981},"up":true}},{"node":{"config":{"id":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","private_key":"fb505af88aa3fc8134b3ad647d78f182e0aee007261c066024d9fdda0bd9d297","name":"node_c73f8fe9f54b89634cb0e8e332407a3a90cbbd347c0abc93823db13a7a39c46e7bd30d3f557316d92dd731cfc686afc308448682ff06c77246e3fb02b9a025ba","services":["streamer"],"enable_msg_events":true,"port":62982},"up":true}},{"node":{"config":{"id":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","private_key":"833d044f5a00d0018f8b2a7d4d825831f351dbe3f3e7074d96103c3597bb0a37","name":"node_9529ff2b0692ad2608b55ec8ec0d1c9ccb8ee300412d99d389009162a76f7eec28d1090cbfb571aa8396b365074770b17106bfa3354857878dff164f42686142","services":["streamer"],"enable_msg_events":true,"port":62983},"up":true}},{"node":{"config":{"id":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","private_key":"f08b159c68739d221adc0060225f8feb89dc3aa1f016cef59508d2787a4232a9","name":"node_5b456e429f7adae30366206e681ba46439a3372fec3806f666425cb3f12983c0b427e089fb163b70e6a56220b1529ee392ff701bc2f4621d51e23aa6305150e8","services":["streamer"],"enable_msg_events":true,"port":62984},"up":true}},{"node":{"config":{"id":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","private_key":"bbadcfc9e554aabf08f9cdea8f1174f4f47b85c5a615efa6f0d5a4db7e6e9f67","name":"node_5e92b025cc087c8823423c287f274a32a3dc0065afdf189475ba96b0da7b785cd493b7f2a7f3bb8195c73025bfbb402cbb4e0f6ae0d5e0caab223193cf6f2e5c","services":["streamer"],"enable_msg_events":true,"port":62985},"up":true}},{"node":{"config":{"id":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","private_key":"91980cc1a6aa75dabe27a4bed1a4a2299ed286387f066d12c1a05ab514245966","name":"node_f6e4b1dc1fa95ceae2b932b178afdc2dd515832a191e0f49c916d5a04548d58ef9f8c1dda3fbc93a45e6d82517e6a573310b7bfb14bc38c57000aec9ff010391","services":["streamer"],"enable_msg_events":true,"port":62986},"up":true}},{"node":{"config":{"id":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","private_key":"9f2513f57cafcbb35e549fae622387037b8da11772eef7bbb45d44f81712155b","name":"node_707a9ae4bc8b37fff43dc3ba83ecb735bd428b720a751a11112452eec1ca49c09139bc437666add2823dd205e45cc793f8657c66ccbc6911cc60771d4512e038","services":["streamer"],"enable_msg_events":true,"port":62987},"up":true}},{"node":{"config":{"id":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","private_key":"a198f5ac31e6bef23d8f266075f8363ce66698d0f8b1193072f813b2a1717236","name":"node_78216c6660fff0b96e38084941a2f237996732118033bf842e5f9e533b22b36c2da996df28e866424311b7b6414d4627db1f22a235ae777f7de34d9696043ecb","services":["streamer"],"enable_msg_events":true,"port":62988},"up":true}},{"node":{"config":{"id":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","private_key":"9f8eddf3160bc4b13285e9587f6736c82305632b55fe833a12f1f821c0f311e4","name":"node_d472383c453e6b0f1a632010bdd6c42a9668d328a8f8071e0407069f6fe413e2a0fd0551a09cc56ee5245d472e39a7b6295491dd256ae42e200a257f297743e3","services":["streamer"],"enable_msg_events":true,"port":62989},"up":true}},{"node":{"config":{"id":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","private_key":"601ed94a775c7129de2ddd82e23249e13176478817e5376a1c18389de0016283","name":"node_351ceaf2e95e098a8e15e81c82073b523f641848326d1bbd379f40f886b50ce2c377c4e3a2dfc2662d6f25ac04dede41063a075cf00be1cf36f95b0267717ab8","services":["streamer"],"enable_msg_events":true,"port":62990},"up":true}},{"node":{"config":{"id":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","private_key":"dd64b8659254425a4553501bcc275b1dc0a6c7bc79a538f780716cd64d46a8c2","name":"node_8da9cdb3c78776ed230497b21d4ac172f0ce73e921dfddd483da7bc6bbcd1951dd78fd5f70a0acbad855b2984e4c4bdb408c4bc25cab40684fe5a4408ec7ab9c","services":["streamer"],"enable_msg_events":true,"port":62991},"up":true}},{"node":{"config":{"id":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","private_key":"7216dc13943bfd0a8c2e93d621a44a2dd4baab7b68fa87be06f2e649f533f72c","name":"node_0a45a0aa4b4eee71b2828c794281d698019667288cf51311ffae7d8ea895f8ae29f7958dbfcda8763d9d8e9c097dccc5f92ac9d09fb4ccbde178d7f5ebda4d35","services":["streamer"],"enable_msg_events":true,"port":62992},"up":true}},{"node":{"config":{"id":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","private_key":"01a2779483d6e089da8b3943f81cff48c8bfd1bd7d0281bceb152e41a7f5acb7","name":"node_f70c92be150cb3f65f6bd904c8c161bfb0cea717bab0b24da63714de83e0872c8c369960ada1629607a1e166a19b6cfa887603e4868e7912ae5512744e8cc1c0","services":["streamer"],"enable_msg_events":true,"port":62993},"up":true}},{"node":{"config":{"id":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","private_key":"2954d35fce94938f074043b9f9dd87157a6730bdd8e3a1b6f19b8a55ad1505df","name":"node_d563716fbe2068cc940f7b12dc2bacb345c95f01e78e3b1f0105a441f300fdb00cc72e677aec102360fb904b63055d8581555f5b74b8f2392706569d8357c53f","services":["streamer"],"enable_msg_events":true,"port":62994},"up":true}},{"node":{"config":{"id":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","private_key":"6f87c529d5b17354bd3ba6b59d6ff3a0f71550a41d949d702e27f50957cfc3ba","name":"node_46bb2acc087482d40ab2ccbb387723158411ff4931423414e4d09891be8a31d11929e939e4be94b0cc355c49883e1835785ba1955d865f78748c2a0a2f6eee0a","services":["streamer"],"enable_msg_events":true,"port":62995},"up":true}},{"node":{"config":{"id":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","private_key":"ea386dc625e681a5d5d7c4e8ede4b3ffb8f2f13061c65acdde2750e2a19ef417","name":"node_8da75cb4e63d968a7999ca4b49572b5ae592a91fa442d44bb7c42fb4b174a365e1affa1dbc45b2a0406444505f178100768e7783831f2886d53e7d1b8a3a7291","services":["streamer"],"enable_msg_events":true,"port":62996},"up":true}},{"node":{"config":{"id":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","private_key":"e9b9261c569da5418d3aeabf28dff1faada23ae1a3a1552035aefe56bdf3136d","name":"node_6d1af44ab259cc080a14c07bf5efabfd70cb847fe338f016c00138c84bddf6a6ce94047d1bffcfc7e9bc772dd7a080468a84655d5351d0056f97f13358b91547","services":["streamer"],"enable_msg_events":true,"port":62997},"up":true}},{"node":{"config":{"id":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","private_key":"19334395c71250dd3eeeef4eb4032e2769839d57cd6080f2f51e1de3630789fe","name":"node_0dcef49b94fdcff024d706030fd4f513d0c6ad5f00b06a8b67abc454bbe5c2c74e939d491c0700e47ecee5cd7c7084603f62e626c34b454868b8f22d8c2dfb10","services":["streamer"],"enable_msg_events":true,"port":62998},"up":true}},{"node":{"config":{"id":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","private_key":"d587a8503da404e7a74e24d731daf63b9585ae41b555035979da013ab723b4b8","name":"node_e7d4478b412ef497741943736946a3b0679d21ae0c4cbdde6809c7236dcf1a40291088d872e469f06da19ed4ef77b9844aee7066c40fcd45b0931aff847de1d7","services":["streamer"],"enable_msg_events":true,"port":62999},"up":true}},{"node":{"config":{"id":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","private_key":"724511e7e57416a6b4627079b0b9079fb4fd5649dd018d7f3a64dbf6a1dd9adc","name":"node_7722d7d06c66afb0642d5f9ae0b22ed812c632f2d62ce64315da40eb003feb3fae1b337c10df21d297beabe51b3879f2c0a725f08ee78a8e09c75f86bd0e2092","services":["streamer"],"enable_msg_events":true,"port":63000},"up":true}},{"node":{"config":{"id":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","private_key":"922f3ca85ccc577429654b566f1561a301bbad054e4f3a8f312db841329899c9","name":"node_e479930845e1dac2d5908894548cc06c132fc5820810c6f46d9adc2bc252dd40b64642a3b2005ad3688d2637c43967f570bd153db9ee6742e1b23dbfb72537fa","services":["streamer"],"enable_msg_events":true,"port":63001},"up":true}},{"node":{"config":{"id":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","private_key":"c94a8e8e535d7431b0610ebfaa70d76c37bf6fbcaaa83ec4be0bed5527780670","name":"node_61b32cded1b5ea3e2ca545a55c84251daaaacf51e6fed98fbdf4c5b6b91a554081e1e577aaaaaa4f911780f92703c1d715695d86c1be641b0bd1794f4107c2be","services":["streamer"],"enable_msg_events":true,"port":63002},"up":true}},{"node":{"config":{"id":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","private_key":"7a1378d2cad0ac18e37694b3ec5c08580aa1887916e98030c66accf6197f615b","name":"node_9e51eb48f59886e70eb8d02e1c0c4423de3f0ce79c7a62bfd91bc2048cf643f40a91e2d2a1a8a19a9e4ba4a96aed0965aefcd941c068208abe8bf5029eb27d55","services":["streamer"],"enable_msg_events":true,"port":63003},"up":true}},{"node":{"config":{"id":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","private_key":"6e834fb9046bc38179a4c8be1cd4c2c540df1f73aa208e9794701234202211ca","name":"node_7a1f97c41c9efd7a2903af78f72d02cfff3631dc6260d3ceb2364c2a8e06965710e8feae6aa9f99b48b2475da10b2f9581c76d47b4cd2bfee09c43dcb5e3e5d9","services":["streamer"],"enable_msg_events":true,"port":63004},"up":true}},{"node":{"config":{"id":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","private_key":"819e80fcd487bf15502fff3d31651efcd9b5e7d5e18ca4d836ce53736bf23d11","name":"node_7a45fa46f161fae3ef9013e9ab81145f4a76fa6ae22160424d6dc111acbd477ce43d4c10db89cb7451c97ea1fbd78428997d01fd17e1851f8b559b404ede6da7","services":["streamer"],"enable_msg_events":true,"port":63005},"up":true}},{"node":{"config":{"id":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","private_key":"c2fff99bd9d70ab2149a1ace8ad0dc26b4b78cbfd60fe9215e0f69885e0cede6","name":"node_07138ce506125910af81bd1bae11c22bfab9a81e1e057cc3d84769475c5da9873eb3f11edc6aca83ef486bfb63eba15a6233676d29d93ac9e774f10cd42c8cbd","services":["streamer"],"enable_msg_events":true,"port":63006},"up":true}},{"node":{"config":{"id":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","private_key":"5d8862df181e186646d6fa8accaceed89b18a384ce5e63de34ecd1bd80d7f0c9","name":"node_f360c6599a0911337c7b96365fda1b2f64890bdb4483bb7e86bca15484f24c4efc0d1f6f56aa0c4fa5c205e6c1dbbf20d2ca3c2f8734f703fe6d672fa76a0d45","services":["streamer"],"enable_msg_events":true,"port":63007},"up":true}},{"node":{"config":{"id":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","private_key":"411b4485e7f793c1db7387d9e8f179d02d939de2702166248953f8f0813cb5f0","name":"node_f5272b71c228eb14b9e0e221deefc0a91353a5f17d01475f57fad54bb8e50e375f58019c7200a9ca45b0f1da6538708c61242e478d917499871df7a9d5857f1a","services":["streamer"],"enable_msg_events":true,"port":63008},"up":true}},{"node":{"config":{"id":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","private_key":"9b1297e565c13eeb81e2b19c31f635253081d34a65eb1ebf889f30635e4eccea","name":"node_e53cfad611bc38a1090d28e4cc58e4738ccaa83a00bf5447cd30ec70e492dea5811b67e79b9ca8856e79801741a675c6f54eb7a1c39e95ab735164855eae0fb7","services":["streamer"],"enable_msg_events":true,"port":63009},"up":true}},{"node":{"config":{"id":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","private_key":"eb698ae5696bf1cef4f4e6cb8ef2eb5e79cd298fcb55e0449bbaab6d048e09b6","name":"node_4f1a219f31e135208bf4caa314a14d8d48a5682941793431539efb5666b06bb5e3e9cb29b019ca414fb32961460556f2d99a04b12dc8ecbf05f43efe108803f5","services":["streamer"],"enable_msg_events":true,"port":63010},"up":true}},{"node":{"config":{"id":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","private_key":"cc474d341e32e674a1c1d607789df8bb6097ab392eace2d366da2496c5413cef","name":"node_25c64a52c298035be2184243082b5eba8a3a5d55c5334cea76e177d722945c8bf014a4ce9ef2ed76dc17a44234c97697337c6e001261533e72cc8266ee0e2fe4","services":["streamer"],"enable_msg_events":true,"port":63011},"up":true}},{"node":{"config":{"id":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","private_key":"4ec4a7d75323558dd822f09ab9f992afd016604bc77aec05f89cfdae6f50611b","name":"node_1691538e4cc41441c18fc92969c0c59f51da063814e8c45311605405284293503ee1570722cc7ae12f9cd63b899afaf5b3e66ca012115996074e8aaa71fda48c","services":["streamer"],"enable_msg_events":true,"port":63012},"up":true}},{"node":{"config":{"id":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","private_key":"b049d01349524a669db50fd817ef70811ea5cb5517adaa016f4ae426184188e8","name":"node_8e1a66c9029330c25b9abe95a11878f41cef1a32b567a931ffa781c2f70a1336efa03ba1a66dac0080304803c1239be443991a251f24d0e9c2e26aebeb5437f8","services":["streamer"],"enable_msg_events":true,"port":63013},"up":true}},{"node":{"config":{"id":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","private_key":"9eb7b1e41bd77e46a9746723ab4367fcdb9950d5f99c32bb1efddc9b5c60daf7","name":"node_c8e9cc707ce2a278371d1b4f64714cdae425b7c3606d18af6588dacaca35c7a171a07629247af351e667d2ddd9e71598f862125c827cc869c463cf87e4daeed0","services":["streamer"],"enable_msg_events":true,"port":63014},"up":true}},{"node":{"config":{"id":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","private_key":"229b6c150e858a0e81d1c720a9697bda4c9f26e531d85db8837ca5d1a24ff8dd","name":"node_43b91c24dd7fd217a76f00ab97920e4223bd2ee085abe7ac34e915e8676400e1643d3bbb4a864c8a6df1298bf229cabd1bdc9879eafdcbcab064708e8266e88d","services":["streamer"],"enable_msg_events":true,"port":63015},"up":true}},{"node":{"config":{"id":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","private_key":"ab42d800bd5b0bcaedd3009d4805e827ca6c41f54fb7fd38cc021f9c72bf3aed","name":"node_14136fa967f2d4825845ba4a43a5921d8fcf03f9c71c5595037e000b2ef6ff0a5eaad0980aea0a170cafda3529f982aea1107f58aa42485550c9480e86f5e9f3","services":["streamer"],"enable_msg_events":true,"port":63016},"up":true}},{"node":{"config":{"id":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","private_key":"15e0330ce9f82833faa08bbacae92d3eff516eeb4bfd1be0b7d8ecc8a311d8a8","name":"node_39d0aa13a6d7e709c9b914cb16f007c3f16af40532afa47c8cf9abf6d604d4380883103c995ec696ca593c4dc9bf0290979b965c9c6ade7c616d3973c5f0b1f0","services":["streamer"],"enable_msg_events":true,"port":63017},"up":true}},{"node":{"config":{"id":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","private_key":"a2ffbdb8b486d91c6d2b579b5ae3f1a8f09feaf0451b375d8985f0ddea952926","name":"node_e73af1e2a834ee132564dd2e983c877b3ae230808d2b42da2ec91472eee6ee6595c439800ce980186b4b0d9a56b96babf747006c07b07513543eead8e102fff7","services":["streamer"],"enable_msg_events":true,"port":63018},"up":true}},{"node":{"config":{"id":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","private_key":"48bdb744f1c9b25e7b2170b88fb956619976670186b82382029c84f3ef780930","name":"node_c0f2f1409cf83d7a777f6af95931181eb5a36b14a156f444075071c896fc5b435638ead23c65a242105db527c809e2c46f7805c862c0eb5d444749ddf22a5060","services":["streamer"],"enable_msg_events":true,"port":63019},"up":true}},{"node":{"config":{"id":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","private_key":"49376794edff5cc56583fc3ce9e6987e0210c537f798bfc00cd523927052bbf2","name":"node_e021950ce89ce2bd79649aad2ed504789636b09870d0652fefa5e16631cb32a5d41c6cc4a540b7a0fca6bc3d5adf9b372a22cf714adc7b3e9b968d4c840017d4","services":["streamer"],"enable_msg_events":true,"port":63020},"up":true}},{"node":{"config":{"id":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","private_key":"b59aef84a0b7166aab7dc4edd8bfc66f56b77097cbbb4e937277ecd23c051473","name":"node_16bd57b6590df0c69c440d178da8359b0a3e00b9c5362155eae42709bdc4d0488e437fa7e8396d5b429cebe356ebd1407039b21eefa8d9164b357845132edb28","services":["streamer"],"enable_msg_events":true,"port":63021},"up":true}},{"node":{"config":{"id":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","private_key":"961cb451a05a1f043539e0417e0c612286d8a86116a4bd3ac4f301444bc0abc7","name":"node_393eb8d2acf9244f1cdc220711c00d8fa7619394893643bc32e1ee0f821e5a2afed07badbdf97d710843c4ea6de3f74c113ad4c548afd23534d6dea5c37c6d9d","services":["streamer"],"enable_msg_events":true,"port":63022},"up":true}},{"node":{"config":{"id":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","private_key":"a56a9d4ff921fba9e03ecffbd71d75f97cc9b7c5f389cf54b9bf66e689bb60b5","name":"node_62b8e67a4ca956c1cf2ba7a538d39bfe8bccf747fe65be48c88270ad44ee7711c0e9a43bb3821feffc492dba9b58397768c755810121add9c980c9a2c696feb0","services":["streamer"],"enable_msg_events":true,"port":63023},"up":true}},{"node":{"config":{"id":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","private_key":"f80db180b4c58031447688bd4b5f9d32cfee3dc85506153782a0368873110317","name":"node_17c7eb5833687a98087daadda564e54b1c770f946efb7efd69370a9caf6e6939e408f04a3fa1aa042d9463992a711786e504072fae56d007d696851696fc5643","services":["streamer"],"enable_msg_events":true,"port":63024},"up":true}},{"node":{"config":{"id":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","private_key":"5750e8b20da0147e055f965d6ba4ee434812f658663383ebfe7e88f13fdf59ab","name":"node_f5efffc8e894cecc065f6892ad2a846c8fc4982d1c8c7fc729421d5108d519c501cc9f2f7a0046ec08d47cf2369753aaf287dfc3ef7ecd34d24d294efb933658","services":["streamer"],"enable_msg_events":true,"port":63025},"up":true}},{"node":{"config":{"id":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","private_key":"f841751579683b856a59eb75f3493a4b3e39183d8818a2638559100bb6f5e66a","name":"node_7c273dd4218e9e5b92e19d250832a424ff2ac5482ad70953746de780100669eb143247e15ccfca14cce9a49a003c82be71ca034a2900bed4c89fb10bdbfcc7c3","services":["streamer"],"enable_msg_events":true,"port":63026},"up":true}},{"node":{"config":{"id":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","private_key":"be9f2207e4e7a93758129c0d6fa34877b685210cf0e8f8d233e5425d8fa461f9","name":"node_8959c5cf825ebab14efeacf2807ad9498256a9e89a2ef00690c9ee23a3e934e111c52a5ddcc791b93f49424ac008095d8cb0da6905dfdeb62309fc4f6672e59e","services":["streamer"],"enable_msg_events":true,"port":63027},"up":true}},{"node":{"config":{"id":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","private_key":"4a245ec64e442d4cad2468d96914df5728633c568ed3d063990ac8932be63222","name":"node_dcf2401cbc26f3db27bb85c24984b1d755b3503fe400c139a0bedbe5de24db3f27c8f4f40adc1880b6142d20e67a40f3d45d36ba7fce122ffa44703e65622198","services":["streamer"],"enable_msg_events":true,"port":63028},"up":true}},{"node":{"config":{"id":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","private_key":"1771927f1f06912915f5498e857816fd8f73b2bde10f88ba4a856684bcc2a6fa","name":"node_38b3adde25c6407f29c2a721f1f5c082cc94ddad09fc5afda2bbb2309212a9b54b1553731a65ec8b58769fc11d488169c8000ee15fe8966bd44a3879e0c9e534","services":["streamer"],"enable_msg_events":true,"port":63029},"up":true}},{"node":{"config":{"id":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","private_key":"986bc0252067c4c3ace80099cbc843d6f16f7483719e9ecf7a3a0f876a461ee8","name":"node_6593097e880701f3d0573df7bff9ba7af40f4f83b828bfc11bdabea62fb94ed39c8233d8d40275c2af9ceddae44514e029a546fe9df73abbd3821d37933aba49","services":["streamer"],"enable_msg_events":true,"port":63030},"up":true}},{"node":{"config":{"id":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","private_key":"39848c3aa21a67751f95ffc8938b36264eeee342816d41b37816f2164e59858e","name":"node_578666c4113e196a7c738fdbae0bd68ade450283eb835efd06591798f1893f7f7d9cde0691faff670b5ae24e58cbc2f549d2196f244dddc00e82852c38e8539e","services":["streamer"],"enable_msg_events":true,"port":63031},"up":true}},{"node":{"config":{"id":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","private_key":"d5dee04f1435fa7ab6d65e89de8c4c6bf156111bfb9ee5de0ab617cc3be19681","name":"node_e1082b4577aa370a5171b7602282208697dcead854f0c82acb5628d179fa5990a0fc85c5343a47177aab81c7fa6c1be8a27a3484acddc353582ddeb61892ef94","services":["streamer"],"enable_msg_events":true,"port":63032},"up":true}},{"node":{"config":{"id":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","private_key":"044a1acc0d565f7080db7b625baefe8a5f7aef9009a7bcd338fc31a02d704d8c","name":"node_a4fbd2ffc25d2c3bd37beecd637dda5983cb5817ecb6da62aec16ea59aaf7e71966649211461564ba808174361898a1d2265f1a42e94434bc00d5d3e04b67a8a","services":["streamer"],"enable_msg_events":true,"port":63033},"up":true}},{"node":{"config":{"id":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","private_key":"8be74288552caed392476d39780f806f2c21b50a9990c5a3a5ed37397b218a6d","name":"node_eb08a7774ca5252237d059a8bbad68044c83b2c332024be98bdc0c58508867a80cd34cb4162bd55a47fecc93301c8b2a7a1edbfd807ebb5623499cac80ea42de","services":["streamer"],"enable_msg_events":true,"port":63034},"up":true}},{"node":{"config":{"id":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","private_key":"e644c54ce52ddb2788fc683264f175a24485082eb88ebe0a83c94ecce77d7175","name":"node_6eeb951b8f6d5ac519132910222777d5a409325e6c64d89708a00e55cb0fe85889aac1baa724e29fa7f064323b164a9c40c5114a65736e3dd16f0336283d9c7b","services":["streamer"],"enable_msg_events":true,"port":63035},"up":true}},{"node":{"config":{"id":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","private_key":"77445377572b915c2e3802f70fc9eae8d29e767f54f80a29701ae5d1fe0c8677","name":"node_6419279b600da3e2ee8d0b2a5b0319bc6cd496086955b49a8d2168fd4c35d5688291bc9313076b1b8e070f25dc593788d72b8f8c1d2ad828741a45deea35e58d","services":["streamer"],"enable_msg_events":true,"port":63036},"up":true}},{"node":{"config":{"id":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","private_key":"f6b20f29a1cdcad8f8bd88acc4f6ffba7b3027e46ab60784e2c2b77edb3d3630","name":"node_032b1ce6881413b7ade1918e56691c7acd9f24111f47792ca50c33e570afba433caa132ad2326d03f9c0544fdc09fa0ca65f61de9fe61d6dd92c5d25a8df69af","services":["streamer"],"enable_msg_events":true,"port":63037},"up":true}},{"node":{"config":{"id":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","private_key":"25bb03224302b9c89585681c4bb30dc9d95fe417e5c0f13627154083cda7492b","name":"node_86d55ece15e6bb4da7601f6587654505f760ee2b87abdb115091eefa93f61cf29fd695601bb8c6ae2c76400de24b8bca9ca32b50e4b849ae76f5320b03276bfc","services":["streamer"],"enable_msg_events":true,"port":63038},"up":true}},{"node":{"config":{"id":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","private_key":"a4eb160b838f392946a844b9fbc36006c459ff6f9ef46a832d000f17f2aa834c","name":"node_31cbd7c029d69715e59f31bccf362cd76e0a87839f1f63c6623be437d2af227a38f12c5fb9c659cc543976833caf22a52f5191c7c465a9ba36ac4235c12add72","services":["streamer"],"enable_msg_events":true,"port":63039},"up":true}}],"conns":[{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","other":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","up":true},{"one":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","other":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","up":true},{"one":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","other":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","up":true},{"one":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","other":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","up":true},{"one":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","other":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","up":true},{"one":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","other":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","up":true},{"one":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","other":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","up":true},{"one":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","other":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","up":true},{"one":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","other":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","up":true},{"one":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","other":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","up":true},{"one":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","other":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","up":true},{"one":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","other":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","up":true},{"one":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","other":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","up":true},{"one":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","other":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","up":true},{"one":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","other":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","up":true},{"one":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","other":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","up":true},{"one":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","other":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","up":true},{"one":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","other":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","up":true},{"one":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","other":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","up":true},{"one":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","other":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","up":true},{"one":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","other":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","up":true},{"one":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","other":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","up":true},{"one":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","other":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","up":true},{"one":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","other":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","up":true},{"one":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","other":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","other":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","up":true},{"one":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","other":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","up":true},{"one":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","other":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","up":true},{"one":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","other":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","up":true},{"one":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","other":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","up":true},{"one":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","other":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","up":true},{"one":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","other":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","up":true},{"one":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","other":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","up":true},{"one":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","other":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","up":true},{"one":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","other":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","up":true},{"one":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","other":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","up":true},{"one":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","other":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","up":true},{"one":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","other":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","up":true},{"one":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","other":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","up":true},{"one":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","other":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","up":true},{"one":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","other":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","up":true},{"one":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","other":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","other":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","other":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","up":true},{"one":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","other":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","up":true},{"one":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","other":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","up":true},{"one":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","other":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","up":true},{"one":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","other":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","up":true},{"one":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","other":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","up":true},{"one":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","other":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","up":true},{"one":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","other":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","up":true},{"one":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","other":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","other":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","up":true},{"one":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","other":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","up":true},{"one":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","other":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","up":true},{"one":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","other":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","up":true},{"one":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","other":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","up":true},{"one":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","other":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","up":true},{"one":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","other":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","up":true},{"one":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","other":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","up":true},{"one":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","other":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","up":true},{"one":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","other":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","up":true},{"one":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","other":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","up":true},{"one":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","other":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","up":true},{"one":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","up":true},{"one":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","other":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","up":true},{"one":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","other":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","up":true},{"one":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","up":true},{"one":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","other":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","up":true},{"one":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","up":true},{"one":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","other":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","up":true},{"one":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","other":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","up":true},{"one":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","other":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","up":true},{"one":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","other":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","up":true},{"one":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","other":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","up":true},{"one":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","up":true},{"one":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","other":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","up":true},{"one":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","other":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","other":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","up":true},{"one":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","other":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","up":true},{"one":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","other":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","up":true},{"one":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","other":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","up":true},{"one":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","other":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","up":true},{"one":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","other":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","up":true},{"one":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","up":true},{"one":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","other":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","up":true},{"one":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","other":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","up":true},{"one":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","other":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","up":true},{"one":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","other":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","up":true},{"one":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","up":true},{"one":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","other":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","up":true},{"one":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","up":true},{"one":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","other":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","up":true},{"one":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","other":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","up":true},{"one":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","other":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","up":true},{"one":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","other":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","up":true},{"one":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","other":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","up":true},{"one":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","other":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","up":true},{"one":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","other":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","up":true},{"one":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","other":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","up":true},{"one":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","other":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","up":true},{"one":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","other":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","up":true},{"one":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","other":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","up":true},{"one":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","other":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","up":true},{"one":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","other":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","up":true},{"one":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","other":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","up":true},{"one":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","other":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","up":true},{"one":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","other":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","up":true},{"one":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","other":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","up":true},{"one":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","other":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","up":true},{"one":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","other":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","up":true},{"one":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","other":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","up":true},{"one":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","up":true},{"one":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","other":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","up":true},{"one":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","other":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","up":true},{"one":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","other":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","up":true},{"one":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","other":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","up":true},{"one":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","other":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","up":true},{"one":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","other":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","up":true},{"one":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","other":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","up":true},{"one":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","other":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","up":true},{"one":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","up":true},{"one":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","other":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","up":true},{"one":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","other":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","up":true},{"one":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","other":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","up":true},{"one":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","other":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","up":true},{"one":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","other":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","up":true},{"one":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","up":true},{"one":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","other":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","up":true},{"one":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","other":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","up":true},{"one":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","other":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","up":true},{"one":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","other":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","up":true},{"one":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","other":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","up":true},{"one":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","other":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","up":true},{"one":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","other":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","up":true},{"one":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","other":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","up":true},{"one":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","other":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","up":true},{"one":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","other":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","up":true},{"one":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","other":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","up":true},{"one":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","other":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","up":true},{"one":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","other":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","up":true},{"one":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","other":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","up":true},{"one":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","other":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","up":true},{"one":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","other":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","up":true},{"one":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","other":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","up":true},{"one":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","other":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","up":true},{"one":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","other":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","up":true},{"one":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","other":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","up":true},{"one":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","other":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","up":true},{"one":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","other":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","up":true},{"one":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"9f2d72c6e30ec363bdcf9ecf28fcf5553f98357680d8530581fcd815389005ec","other":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","up":true},{"one":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","other":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","up":true},{"one":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","other":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","up":true},{"one":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","other":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","up":true},{"one":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","up":true},{"one":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","other":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","up":true},{"one":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","other":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","up":true},{"one":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","other":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","up":true},{"one":"66230e0bec41cfcf3667d7ddc7312888ae4887e8430c57dedafcdbadb6c12364","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","other":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","up":true},{"one":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","other":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","up":true},{"one":"72f779e91460990aee45e99b0565246a2620d4939cc3ab0fe021fefe71aae761","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","other":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","up":true},{"one":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","other":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","up":true},{"one":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","other":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","up":true},{"one":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","other":"634c2562544e0979530cc4dba918c849f24f85c87813e592c54e1f6d8d73bb6f","up":true},{"one":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","other":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","up":true},{"one":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","other":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","up":true},{"one":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","other":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","up":true},{"one":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","other":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"83870b048b374ed527d4b25256900d4b53fad11d900b54e366f9e3fe7ae50079","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"56ac3ac4cc04e94c93d986a0ed9da8b68d97f13c8b5ec35d56703592fc05bc43","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","up":true},{"one":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","other":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","up":true},{"one":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","other":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","up":true},{"one":"d8d872ef5b1632eabca51f1d2755fa5a3f16dc487d4d8be960930ee4462a2633","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","other":"dbc536e11d371786bf8c61eec755d2cb22242c27e8edd7985dae612a9d2cac05","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","up":true},{"one":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"3c93b64143bf1bf130545806917472f3ca16ad6f223f0388f445ddc353140042","other":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","up":true},{"one":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","other":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","up":true},{"one":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","other":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","up":true},{"one":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"1087495bf04e6967257f84b8e5de084e2000b9d748216e31c9f33fc9caedb715","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","up":true},{"one":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","other":"b4bee8054b3b7bc3ef0748937602699173983a764814e85f173916fd70f1e3ed","up":true},{"one":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","other":"9ecf217e2076c229f6d15bfe29df85aa129f1fb12d2a8307907327b5fe2f80c5","up":true},{"one":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","other":"544ad921e03de7d1d656038e23452dd3a9c7ef041520f17f8318326ecc58683b","up":true},{"one":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","other":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","up":true},{"one":"29077dd2f4869b69ffc3ed40e82e4ef051292c3461888b5faf7b4c4b14d4928f","other":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","up":true},{"one":"c0f0bec8a3506280df599d57abc414d007696967381b9690bcf63a093586307c","other":"df9ad5c2cd2375a5a227841841a47876765f6552a8b2cb9fa8cdedaeca2371ed","up":true},{"one":"a070c42951b523531f065cb8376eb8ca0c431b473ce9ebc44a3fc383f1f878b3","other":"be6906254ba2d3748ff8ce2ebbabaa03bad1c92d2eadc1ab6470548cb8d7c524","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","up":true},{"one":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"d10e58907f84eef0dfcfd3c81457b60eef9b1ea5b9a462e22f0c4e643a6e7140","up":true},{"one":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","other":"f03f47bf8f6241cbda878f301783e30cac333e8cea3d6bf9bc2be3b7fc2cf1c3","up":true},{"one":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","other":"6c4bdfe4650525d5efc1a4ca8d92ebbea33b1877bfac69656e81adbbad4f286a","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","other":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","up":true},{"one":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","other":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","up":true},{"one":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","other":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","up":true},{"one":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","other":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","up":true},{"one":"30d80772ad22d78f8a4e948a06677b5676aadb8a9c040f3ffb59a7e608e0929e","other":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","up":true},{"one":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","other":"61c24980b9ef4ee7fc33c51310f981a8e74e4276509a545a3f471370082dab4b","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"51db0d8fefeedfab3394f8f398b6d8f4540b24bc6cbd8e66bc5a7480db0228f5","other":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"f066d5d314253a872ab27df90d85ba5824da06032f92ce8bf20020b61971e199","up":true},{"one":"ada8540c63062347d3162850cf2a4820a20ed96514fb01b95d995bbfff97a212","other":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","up":true},{"one":"be9f880ccfd8dd0f5fde587c4e9fbdcb2d3551df0c4504d9938d4301a9276e72","other":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","up":true},{"one":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","other":"9dc2c4166fa9410d7be67cbb5ac572aa42a9a78c2efe5ea601ddd37c356196da","up":true},{"one":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","other":"1abcab4e898966c42c11d1a92b1c1911fc779089c5a20ea1ddf005f76632b171","up":true},{"one":"de9eff7b7b80323f544746b9596e7da6b43b91e6c6d0660ad38df1e877ab8f99","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","other":"f0ee0274e24a7cc3d1b0d38cd46d205ccbf791d0cc038d022f2a0c50ae6a5cd5","up":true},{"one":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","other":"1be4ba2f068e060a0aabac445094f1dc8b22fe1e5575c98df8d8783aa3d95177","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","up":true},{"one":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","other":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"5d056a38c3a7c3bfcd431b767662903454f41429d2e03b9b30273e5b1b8e5c97","up":true},{"one":"ce614a2fd326ce57b0ead5750d0a08f3c7dd94e1d2935861697e3df4652a22b6","other":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","up":true},{"one":"358eef3cf9964bf89e056afe0f4b46ce85bcb079bab922a4ae9dfa555001abfc","other":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"14645ab9b2ebbf4436466df07ff28e68b92774c6b5a0d311a174765e350c7089","up":true},{"one":"dfe389ee7fe03c809d7a4afa1f04dde9ab9a50d8c6ca5bf2489debb2e8329541","other":"fbbe14109dc4fa8251e852a181f3663b4245c93b737fa9c4921a53ed9949019d","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"36c28c0237be6b2131280452c3113affcae28f6c7066811a8e1ee1a0a01decc3","up":true},{"one":"3ff43d13b6ee84b128db4215c47c73909f6616039b87ca70abdd2108e29dddfb","other":"3ea2554db02021f0413529426d7a7b0ac9abe80643993f6d80fdfff93a765c40","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"e3c20117761e1b3c3d7c3d133e1bf68e594ee25950cd4311a8d964923c4164da","up":true},{"one":"332f7b60a1fbb6cd1e251dc68d1093b7f0bb05c1eefce5e61f124dff9445f14d","other":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"77687d9e478a52555674f12aa654ad931a3ee83920b9cdc8fecc03653ed7e386","up":true},{"one":"68d45eec895b91f081026e86ed164092dad8d4087918cd50c6f77767d9577f6d","other":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"23e4f18d302b6a545530b89eca007c141c751cdcde471bc3378bf72fd68b91c6","up":true},{"one":"cfa6cfc1f856e69430370d5c52130519502c7a9e4fb14c7c8d9b309612a3c1bb","other":"c678643c5249eb90385aad201d6756f9f364024938d4c9f59f4aa51d64d48bd7","up":true},{"one":"37debce0cbe19a2ab88f15dffa390df392938e7060970b93eae968a8c2497650","other":"2f4492429ab2ecd080a36451153990587de2458ebd9421fb989d8e27d4a88422","up":true},{"one":"c6c479f1c83f5158eb77d57e6321d5ed062964870775f51254461010c8882c10","other":"e5eea2a0ac0175a0ad41239d8e36e537ce7d428d6b44e23e8e33ff0be11bac72","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"5cdc4493f01d6ebec3070b028275bd94ede61db21a4f5d3b282a366d1d3484b8","up":true},{"one":"44b1544b5795a1c77094832bae47c84eb38482b1e1aaefbaecacbc7ef9d10e3e","other":"577b9ea47bc00cde25b11ca03861df0ccfaad8ce281500efede88d25e012b1e3","up":true},{"one":"7a56b4203ee1cad781b23d2a78694f63eb7dfe6d9ac24fc181e6a63516c9efa5","other":"0d48477e33d7cfc4a7660048e4b1ece9f37e9759e96e6f1f47a86de091b0ee97","up":true},{"one":"3c38aba43a15a61b680fa767353cce7e4165cbc996968f990001d7595ff243c8","other":"2d831f78c7d670e4e1f19a47c80ec2df144da210ff3aaa00ca6c4990e4da0922","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"5c3ca7f91551934bbfa4020433d7b19e40d04d9291c2b26686ef85225f872bbf","up":true},{"one":"43900b2a084097a0ddf8bf4d0375624f731bd14c85300007c87269986a12eb3b","other":"bfa0a02816da29b40215fb3c26de9360505e4c69fca55086324f0e35de7486a5","up":false},{"one":"7a1f03dc26ef21a5bd1673eb8418af7a7cbcb2ab1654882ebdcda2d1e6ad4836","other":"76933265c3d872b2d20e7a961f3f4e858afe11aee773b5caf678553e56ad3537","up":true}]} \ No newline at end of file diff --git a/swarm/network/stream/visualized_snapshot_sync_sim_test.go b/swarm/network/stream/visualized_snapshot_sync_sim_test.go deleted file mode 100644 index fccc6382cde5..000000000000 --- a/swarm/network/stream/visualized_snapshot_sync_sim_test.go +++ /dev/null @@ -1,389 +0,0 @@ -// Copyright 2018 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 . - -// +build withserver - -package stream - -import ( - "bytes" - "context" - "errors" - "fmt" - "io" - "os" - "sync" - "testing" - "time" - - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/protocols" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/network/simulation" - "github.com/nebulaai/nbai-node/swarm/state" - "github.com/nebulaai/nbai-node/swarm/storage" -) - -/* -The tests in this file need to be executed with - - -tags=withserver - -Also, they will stall if executed stand-alone, because they wait -for the visualization frontend to send a POST /runsim message. -*/ - -//setup the sim, evaluate nodeCount and chunkCount and create the sim -func setupSim(serviceMap map[string]simulation.ServiceFunc) (int, int, *simulation.Simulation) { - nodeCount := *nodes - chunkCount := *chunks - - if nodeCount == 0 || chunkCount == 0 { - nodeCount = 32 - chunkCount = 1 - } - - //setup the simulation with server, which means the sim won't run - //until it receives a POST /runsim from the frontend - sim := simulation.New(serviceMap).WithServer(":8888") - return nodeCount, chunkCount, sim -} - -//watch for disconnections and wait for healthy -func watchSim(sim *simulation.Simulation) (context.Context, context.CancelFunc) { - ctx, cancelSimRun := context.WithTimeout(context.Background(), 1*time.Minute) - - if _, err := sim.WaitTillHealthy(ctx); err != nil { - panic(err) - } - - disconnections := sim.PeerEvents( - context.Background(), - sim.NodeIDs(), - simulation.NewPeerEventsFilter().Drop(), - ) - - go func() { - for d := range disconnections { - log.Error("peer drop", "node", d.NodeID, "peer", d.PeerID) - panic("unexpected disconnect") - cancelSimRun() - } - }() - - return ctx, cancelSimRun -} - -//This test requests bogus hashes into the network -func TestNonExistingHashesWithServer(t *testing.T) { - - nodeCount, _, sim := setupSim(retrievalSimServiceMap) - defer sim.Close() - - err := sim.UploadSnapshot(fmt.Sprintf("testing/snapshot_%d.json", nodeCount)) - if err != nil { - panic(err) - } - - ctx, cancelSimRun := watchSim(sim) - defer cancelSimRun() - - //in order to get some meaningful visualization, it is beneficial - //to define a minimum duration of this test - testDuration := 20 * time.Second - - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - //check on the node's FileStore (netstore) - id := sim.Net.GetRandomUpNode().ID() - item, ok := sim.NodeItem(id, bucketKeyFileStore) - if !ok { - t.Fatalf("No filestore") - } - fileStore := item.(*storage.FileStore) - //create a bogus hash - fakeHash := storage.GenerateRandomChunk(1000).Address() - //try to retrieve it - will propagate RetrieveRequestMsg into the network - reader, _ := fileStore.Retrieve(context.TODO(), fakeHash) - if _, err := reader.Size(ctx, nil); err != nil { - log.Debug("expected error for non-existing chunk") - } - //sleep so that the frontend can have something to display - time.Sleep(testDuration) - - return nil - }) - if result.Error != nil { - sendSimTerminatedEvent(sim) - t.Fatal(result.Error) - } - - sendSimTerminatedEvent(sim) - -} - -//send a termination event to the frontend -func sendSimTerminatedEvent(sim *simulation.Simulation) { - evt := &simulations.Event{ - Type: EventTypeSimTerminated, - Control: false, - } - sim.Net.Events().Send(evt) -} - -//This test is the same as the snapshot sync test, -//but with a HTTP server -//It also sends some custom events so that the frontend -//can visualize messages like SendOfferedMsg, WantedHashesMsg, DeliveryMsg -func TestSnapshotSyncWithServer(t *testing.T) { - //t.Skip("temporarily disabled as simulations.WaitTillHealthy cannot be trusted") - - //define a wrapper object to be able to pass around data - wrapper := &netWrapper{} - - nodeCount := *nodes - chunkCount := *chunks - - if nodeCount == 0 || chunkCount == 0 { - nodeCount = 32 - chunkCount = 1 - } - - log.Info(fmt.Sprintf("Running the simulation with %d nodes and %d chunks", nodeCount, chunkCount)) - - sim := simulation.New(map[string]simulation.ServiceFunc{ - "streamer": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - n := ctx.Config.Node() - addr := network.NewAddr(n) - store, datadir, err := createTestLocalStorageForID(n.ID(), addr) - if err != nil { - return nil, nil, err - } - bucket.Store(bucketKeyStore, store) - localStore := store.(*storage.LocalStore) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, nil, err - } - kad := network.NewKademlia(addr.Over(), network.NewKadParams()) - delivery := NewDelivery(kad, netStore) - netStore.NewNetFetcherFunc = network.NewFetcherFactory(dummyRequestFromPeers, true).New - - r := NewRegistry(addr.ID(), delivery, netStore, state.NewInmemoryStore(), &RegistryOptions{ - Retrieval: RetrievalDisabled, - Syncing: SyncingAutoSubscribe, - SyncUpdateDelay: 3 * time.Second, - }, nil) - - tr := &testRegistry{ - Registry: r, - w: wrapper, - } - - bucket.Store(bucketKeyRegistry, tr) - - cleanup = func() { - netStore.Close() - tr.Close() - os.RemoveAll(datadir) - } - - return tr, cleanup, nil - }, - }).WithServer(":8888") //start with the HTTP server - - nodeCount, chunkCount, sim := setupSim(simServiceMap) - defer sim.Close() - - log.Info("Initializing test config") - - conf := &synctestConfig{} - //map of discover ID to indexes of chunks expected at that ID - conf.idToChunksMap = make(map[enode.ID][]int) - //map of overlay address to discover ID - conf.addrToIDMap = make(map[string]enode.ID) - //array where the generated chunk hashes will be stored - conf.hashes = make([]storage.Address, 0) - //pass the network to the wrapper object - wrapper.setNetwork(sim.Net) - err := sim.UploadSnapshot(fmt.Sprintf("testing/snapshot_%d.json", nodeCount)) - if err != nil { - panic(err) - } - - ctx, cancelSimRun := watchSim(sim) - defer cancelSimRun() - - //run the sim - result := runSim(conf, ctx, sim, chunkCount) - - //send terminated event - evt := &simulations.Event{ - Type: EventTypeSimTerminated, - Control: false, - } - go sim.Net.Events().Send(evt) - - if result.Error != nil { - panic(result.Error) - } - log.Info("Simulation ended") -} - -//testRegistry embeds registry -//it allows to replace the protocol run function -type testRegistry struct { - *Registry - w *netWrapper -} - -//Protocols replaces the protocol's run function -func (tr *testRegistry) Protocols() []p2p.Protocol { - regProto := tr.Registry.Protocols() - //set the `stream` protocol's run function with the testRegistry's one - regProto[0].Run = tr.runProto - return regProto -} - -//runProto is the new overwritten protocol's run function for this test -func (tr *testRegistry) runProto(p *p2p.Peer, rw p2p.MsgReadWriter) error { - //create a custom rw message ReadWriter - testRw := &testMsgReadWriter{ - MsgReadWriter: rw, - Peer: p, - w: tr.w, - Registry: tr.Registry, - } - //now run the actual upper layer `Registry`'s protocol function - return tr.runProtocol(p, testRw) -} - -//testMsgReadWriter is a custom rw -//it will allow us to re-use the message twice -type testMsgReadWriter struct { - *Registry - p2p.MsgReadWriter - *p2p.Peer - w *netWrapper -} - -//netWrapper wrapper object so we can pass data around -type netWrapper struct { - net *simulations.Network -} - -//set the network to the wrapper for later use (used inside the custom rw) -func (w *netWrapper) setNetwork(n *simulations.Network) { - w.net = n -} - -//get he network from the wrapper (used inside the custom rw) -func (w *netWrapper) getNetwork() *simulations.Network { - return w.net -} - -// ReadMsg reads a message from the underlying MsgReadWriter and emits a -// "message received" event -//we do this because we are interested in the Payload of the message for custom use -//in this test, but messages can only be consumed once (stream io.Reader) -func (ev *testMsgReadWriter) ReadMsg() (p2p.Msg, error) { - //read the message from the underlying rw - msg, err := ev.MsgReadWriter.ReadMsg() - if err != nil { - return msg, err - } - - //don't do anything with message codes we actually are not needing/reading - subCodes := []uint64{1, 2, 10} - found := false - for _, c := range subCodes { - if c == msg.Code { - found = true - } - } - //just return if not a msg code we are interested in - if !found { - return msg, nil - } - - //we use a io.TeeReader so that we can read the message twice - //the Payload is a io.Reader, so if we read from it, the actual protocol handler - //cannot access it anymore. - //But we need that handler to be able to consume the message as normal, - //as if we would not do anything here with that message - var buf bytes.Buffer - tee := io.TeeReader(msg.Payload, &buf) - - mcp := &p2p.Msg{ - Code: msg.Code, - Size: msg.Size, - ReceivedAt: msg.ReceivedAt, - Payload: tee, - } - //assign the copy for later use - msg.Payload = &buf - - //now let's look into the message - var wmsg protocols.WrappedMsg - err = mcp.Decode(&wmsg) - if err != nil { - log.Error(err.Error()) - return msg, err - } - //create a new message from the code - val, ok := ev.Registry.GetSpec().NewMsg(mcp.Code) - if !ok { - return msg, errors.New(fmt.Sprintf("Invalid message code: %v", msg.Code)) - } - //decode it - if err := rlp.DecodeBytes(wmsg.Payload, val); err != nil { - return msg, errors.New(fmt.Sprintf("Decoding error <= %v: %v", msg, err)) - } - //now for every message type we are interested in, create a custom event and send it - var evt *simulations.Event - switch val := val.(type) { - case *OfferedHashesMsg: - evt = &simulations.Event{ - Type: EventTypeChunkOffered, - Node: ev.w.getNetwork().GetNode(ev.ID()), - Control: false, - Data: val.Hashes, - } - case *WantedHashesMsg: - evt = &simulations.Event{ - Type: EventTypeChunkWanted, - Node: ev.w.getNetwork().GetNode(ev.ID()), - Control: false, - } - case *ChunkDeliveryMsgSyncing: - evt = &simulations.Event{ - Type: EventTypeChunkDelivered, - Node: ev.w.getNetwork().GetNode(ev.ID()), - Control: false, - Data: val.Addr.String(), - } - } - if evt != nil { - //send custom event to feed; frontend will listen to it and display - ev.w.getNetwork().Events().Send(evt) - } - return msg, nil -} diff --git a/swarm/network_test.go b/swarm/network_test.go deleted file mode 100644 index 636a44e0380f..000000000000 --- a/swarm/network_test.go +++ /dev/null @@ -1,502 +0,0 @@ -// Copyright 2018 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 swarm - -import ( - "context" - "flag" - "fmt" - "io/ioutil" - "math/rand" - "os" - "sync" - "sync/atomic" - "testing" - "time" - - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/swarm/api" - "github.com/nebulaai/nbai-node/swarm/network/simulation" - "github.com/nebulaai/nbai-node/swarm/storage" - colorable "github.com/mattn/go-colorable" -) - -var ( - loglevel = flag.Int("loglevel", 2, "verbosity of logs") - longrunning = flag.Bool("longrunning", false, "do run long-running tests") - waitKademlia = flag.Bool("waitkademlia", false, "wait for healthy kademlia before checking files availability") -) - -func init() { - rand.Seed(time.Now().UnixNano()) - - flag.Parse() - - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) -} - -// TestSwarmNetwork runs a series of test simulations with -// static and dynamic Swarm nodes in network simulation, by -// uploading files to every node and retrieving them. -func TestSwarmNetwork(t *testing.T) { - for _, tc := range []struct { - name string - steps []testSwarmNetworkStep - options *testSwarmNetworkOptions - disabled bool - }{ - { - name: "10_nodes", - steps: []testSwarmNetworkStep{ - { - nodeCount: 10, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 45 * time.Second, - }, - }, - { - name: "10_nodes_skip_check", - steps: []testSwarmNetworkStep{ - { - nodeCount: 10, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 45 * time.Second, - SkipCheck: true, - }, - }, - { - name: "50_nodes", - steps: []testSwarmNetworkStep{ - { - nodeCount: 50, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 3 * time.Minute, - }, - disabled: !*longrunning, - }, - { - name: "50_nodes_skip_check", - steps: []testSwarmNetworkStep{ - { - nodeCount: 50, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 3 * time.Minute, - SkipCheck: true, - }, - disabled: !*longrunning, - }, - { - name: "inc_node_count", - steps: []testSwarmNetworkStep{ - { - nodeCount: 2, - }, - { - nodeCount: 5, - }, - { - nodeCount: 10, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 90 * time.Second, - }, - disabled: !*longrunning, - }, - { - name: "dec_node_count", - steps: []testSwarmNetworkStep{ - { - nodeCount: 10, - }, - { - nodeCount: 6, - }, - { - nodeCount: 3, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 90 * time.Second, - }, - disabled: !*longrunning, - }, - { - name: "dec_inc_node_count", - steps: []testSwarmNetworkStep{ - { - nodeCount: 3, - }, - { - nodeCount: 1, - }, - { - nodeCount: 5, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 90 * time.Second, - }, - }, - { - name: "inc_dec_node_count", - steps: []testSwarmNetworkStep{ - { - nodeCount: 3, - }, - { - nodeCount: 5, - }, - { - nodeCount: 25, - }, - { - nodeCount: 10, - }, - { - nodeCount: 4, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 5 * time.Minute, - }, - disabled: !*longrunning, - }, - { - name: "inc_dec_node_count_skip_check", - steps: []testSwarmNetworkStep{ - { - nodeCount: 3, - }, - { - nodeCount: 5, - }, - { - nodeCount: 25, - }, - { - nodeCount: 10, - }, - { - nodeCount: 4, - }, - }, - options: &testSwarmNetworkOptions{ - Timeout: 5 * time.Minute, - SkipCheck: true, - }, - disabled: !*longrunning, - }, - } { - if tc.disabled { - continue - } - t.Run(tc.name, func(t *testing.T) { - testSwarmNetwork(t, tc.options, tc.steps...) - }) - } -} - -// testSwarmNetworkStep is the configuration -// for the state of the simulation network. -type testSwarmNetworkStep struct { - // number of swarm nodes that must be in the Up state - nodeCount int -} - -// file represents the file uploaded on a particular node. -type file struct { - addr storage.Address - data string - nodeID enode.ID -} - -// check represents a reference to a file that is retrieved -// from a particular node. -type check struct { - key string - nodeID enode.ID -} - -// testSwarmNetworkOptions contains optional parameters for running -// testSwarmNetwork. -type testSwarmNetworkOptions struct { - Timeout time.Duration - SkipCheck bool -} - -// testSwarmNetwork is a helper function used for testing different -// static and dynamic Swarm network simulations. -// It is responsible for: -// - Setting up a Swarm network simulation, and updates the number of nodes within the network on every step according to steps. -// - Uploading a unique file to every node on every step. -// - May wait for Kademlia on every node to be healthy. -// - Checking if a file is retrievable from all nodes. -func testSwarmNetwork(t *testing.T, o *testSwarmNetworkOptions, steps ...testSwarmNetworkStep) { - - if o == nil { - o = new(testSwarmNetworkOptions) - } - - sim := simulation.New(map[string]simulation.ServiceFunc{ - "swarm": func(ctx *adapters.ServiceContext, bucket *sync.Map) (s node.Service, cleanup func(), err error) { - config := api.NewConfig() - - dir, err := ioutil.TempDir("", "swarm-network-test-node") - if err != nil { - return nil, nil, err - } - cleanup = func() { - err := os.RemoveAll(dir) - if err != nil { - log.Error("cleaning up swarm temp dir", "err", err) - } - } - - config.Path = dir - - privkey, err := crypto.GenerateKey() - if err != nil { - return nil, cleanup, err - } - - config.Init(privkey) - config.DeliverySkipCheck = o.SkipCheck - config.Port = "" - - swarm, err := NewSwarm(config, nil) - if err != nil { - return nil, cleanup, err - } - bucket.Store(simulation.BucketKeyKademlia, swarm.bzz.Hive.Kademlia) - log.Info("new swarm", "bzzKey", config.BzzKey, "baseAddr", fmt.Sprintf("%x", swarm.bzz.BaseAddr())) - return swarm, cleanup, nil - }, - }) - defer sim.Close() - - ctx := context.Background() - if o.Timeout > 0 { - var cancel context.CancelFunc - ctx, cancel = context.WithTimeout(ctx, o.Timeout) - defer cancel() - } - - files := make([]file, 0) - - for i, step := range steps { - log.Debug("test sync step", "n", i+1, "nodes", step.nodeCount) - - change := step.nodeCount - len(sim.UpNodeIDs()) - - if change > 0 { - _, err := sim.AddNodesAndConnectChain(change) - if err != nil { - t.Fatal(err) - } - } else if change < 0 { - _, err := sim.StopRandomNodes(-change) - if err != nil { - t.Fatal(err) - } - } else { - t.Logf("step %v: no change in nodes", i) - continue - } - - var checkStatusM sync.Map - var nodeStatusM sync.Map - var totalFoundCount uint64 - - result := sim.Run(ctx, func(ctx context.Context, sim *simulation.Simulation) error { - nodeIDs := sim.UpNodeIDs() - rand.Shuffle(len(nodeIDs), func(i, j int) { - nodeIDs[i], nodeIDs[j] = nodeIDs[j], nodeIDs[i] - }) - for _, id := range nodeIDs { - key, data, err := uploadFile(sim.Service("swarm", id).(*Swarm)) - if err != nil { - return err - } - log.Trace("file uploaded", "node", id, "key", key.String()) - files = append(files, file{ - addr: key, - data: data, - nodeID: id, - }) - } - - if *waitKademlia { - if _, err := sim.WaitTillHealthy(ctx); err != nil { - return err - } - } - - // File retrieval check is repeated until all uploaded files are retrieved from all nodes - // or until the timeout is reached. - for { - if retrieve(sim, files, &checkStatusM, &nodeStatusM, &totalFoundCount) == 0 { - return nil - } - } - }) - - if result.Error != nil { - t.Fatal(result.Error) - } - log.Debug("done: test sync step", "n", i+1, "nodes", step.nodeCount) - } -} - -// uploadFile, uploads a short file to the swarm instance -// using the api.Put method. -func uploadFile(swarm *Swarm) (storage.Address, string, error) { - b := make([]byte, 8) - _, err := rand.Read(b) - if err != nil { - return nil, "", err - } - // File data is very short, but it is ensured that its - // uniqueness is very certain. - data := fmt.Sprintf("test content %s %x", time.Now().Round(0), b) - ctx := context.TODO() - k, wait, err := swarm.api.Put(ctx, data, "text/plain", false) - if err != nil { - return nil, "", err - } - if wait != nil { - err = wait(ctx) - } - return k, data, err -} - -// retrieve is the function that is used for checking the availability of -// uploaded files in testSwarmNetwork test helper function. -func retrieve( - sim *simulation.Simulation, - files []file, - checkStatusM *sync.Map, - nodeStatusM *sync.Map, - totalFoundCount *uint64, -) (missing uint64) { - rand.Shuffle(len(files), func(i, j int) { - files[i], files[j] = files[j], files[i] - }) - - var totalWg sync.WaitGroup - errc := make(chan error) - - nodeIDs := sim.UpNodeIDs() - - totalCheckCount := len(nodeIDs) * len(files) - - for _, id := range nodeIDs { - if _, ok := nodeStatusM.Load(id); ok { - continue - } - start := time.Now() - var checkCount uint64 - var foundCount uint64 - - totalWg.Add(1) - - var wg sync.WaitGroup - - swarm := sim.Service("swarm", id).(*Swarm) - for _, f := range files { - - checkKey := check{ - key: f.addr.String(), - nodeID: id, - } - if n, ok := checkStatusM.Load(checkKey); ok && n.(int) == 0 { - continue - } - - checkCount++ - wg.Add(1) - go func(f file, id enode.ID) { - defer wg.Done() - - log.Debug("api get: check file", "node", id.String(), "key", f.addr.String(), "total files found", atomic.LoadUint64(totalFoundCount)) - - r, _, _, _, err := swarm.api.Get(context.TODO(), api.NOOPDecrypt, f.addr, "/") - if err != nil { - errc <- fmt.Errorf("api get: node %s, key %s, kademlia %s: %v", id, f.addr, swarm.bzz.Hive, err) - return - } - d, err := ioutil.ReadAll(r) - if err != nil { - errc <- fmt.Errorf("api get: read response: node %s, key %s: kademlia %s: %v", id, f.addr, swarm.bzz.Hive, err) - return - } - data := string(d) - if data != f.data { - errc <- fmt.Errorf("file contend missmatch: node %s, key %s, expected %q, got %q", id, f.addr, f.data, data) - return - } - checkStatusM.Store(checkKey, 0) - atomic.AddUint64(&foundCount, 1) - log.Info("api get: file found", "node", id.String(), "key", f.addr.String(), "content", data, "files found", atomic.LoadUint64(&foundCount)) - }(f, id) - } - - go func(id enode.ID) { - defer totalWg.Done() - wg.Wait() - - atomic.AddUint64(totalFoundCount, foundCount) - - if foundCount == checkCount { - log.Info("all files are found for node", "id", id.String(), "duration", time.Since(start)) - nodeStatusM.Store(id, 0) - return - } - log.Debug("files missing for node", "id", id.String(), "check", checkCount, "found", foundCount) - }(id) - - } - - go func() { - totalWg.Wait() - close(errc) - }() - - var errCount int - for err := range errc { - if err != nil { - errCount++ - } - log.Warn(err.Error()) - } - - log.Info("check stats", "total check count", totalCheckCount, "total files found", atomic.LoadUint64(totalFoundCount), "total errors", errCount) - - return uint64(totalCheckCount) - atomic.LoadUint64(totalFoundCount) -} diff --git a/swarm/pot/address.go b/swarm/pot/address.go deleted file mode 100644 index d52dbb8a86b7..000000000000 --- a/swarm/pot/address.go +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package pot see doc.go -package pot - -import ( - "encoding/binary" - "fmt" - "math/rand" - "strconv" - "strings" - - "github.com/nebulaai/nbai-node/common" -) - -var ( - zerosBin = Address{}.Bin() -) - -// Address is an alias for common.Hash -type Address common.Hash - -// NewAddressFromBytes constructs an Address from a byte slice -func NewAddressFromBytes(b []byte) Address { - h := common.Hash{} - copy(h[:], b) - return Address(h) -} - -func (a Address) String() string { - return fmt.Sprintf("%x", a[:]) -} - -// MarshalJSON Address serialisation -func (a *Address) MarshalJSON() (out []byte, err error) { - return []byte(`"` + a.String() + `"`), nil -} - -// UnmarshalJSON Address deserialisation -func (a *Address) UnmarshalJSON(value []byte) error { - *a = Address(common.HexToHash(string(value[1 : len(value)-1]))) - return nil -} - -// Bin returns the string form of the binary representation of an address (only first 8 bits) -func (a Address) Bin() string { - return ToBin(a[:]) -} - -// ToBin converts a byteslice to the string binary representation -func ToBin(a []byte) string { - var bs []string - for _, b := range a { - bs = append(bs, fmt.Sprintf("%08b", b)) - } - return strings.Join(bs, "") -} - -// Bytes returns the Address as a byte slice -func (a Address) Bytes() []byte { - return a[:] -} - -// ProxCmp compares the distances a->target and b->target. -// Returns -1 if a is closer to target, 1 if b is closer to target -// and 0 if they are equal. -func ProxCmp(a, x, y interface{}) int { - return proxCmp(ToBytes(a), ToBytes(x), ToBytes(y)) -} - -func proxCmp(a, x, y []byte) int { - for i := range a { - dx := x[i] ^ a[i] - dy := y[i] ^ a[i] - if dx > dy { - return 1 - } else if dx < dy { - return -1 - } - } - return 0 -} - -// RandomAddressAt (address, prox) generates a random address -// at proximity order prox relative to address -// if prox is negative a random address is generated -func RandomAddressAt(self Address, prox int) (addr Address) { - addr = self - pos := -1 - if prox >= 0 { - pos = prox / 8 - trans := prox % 8 - transbytea := byte(0) - for j := 0; j <= trans; j++ { - transbytea |= 1 << uint8(7-j) - } - flipbyte := byte(1 << uint8(7-trans)) - transbyteb := transbytea ^ byte(255) - randbyte := byte(rand.Intn(255)) - addr[pos] = ((addr[pos] & transbytea) ^ flipbyte) | randbyte&transbyteb - } - for i := pos + 1; i < len(addr); i++ { - addr[i] = byte(rand.Intn(255)) - } - - return -} - -// RandomAddress generates a random address -func RandomAddress() Address { - return RandomAddressAt(Address{}, -1) -} - -// NewAddressFromString creates a byte slice from a string in binary representation -func NewAddressFromString(s string) []byte { - ha := [32]byte{} - - t := s + zerosBin[:len(zerosBin)-len(s)] - for i := 0; i < 4; i++ { - n, err := strconv.ParseUint(t[i*64:(i+1)*64], 2, 64) - if err != nil { - panic("wrong format: " + err.Error()) - } - binary.BigEndian.PutUint64(ha[i*8:(i+1)*8], n) - } - return ha[:] -} - -// BytesAddress is an interface for elements addressable by a byte slice -type BytesAddress interface { - Address() []byte -} - -// ToBytes turns the Val into bytes -func ToBytes(v Val) []byte { - if v == nil { - return nil - } - b, ok := v.([]byte) - if !ok { - ba, ok := v.(BytesAddress) - if !ok { - panic(fmt.Sprintf("unsupported value type %T", v)) - } - b = ba.Address() - } - return b -} - -// DefaultPof returns a proximity order comparison operator function -func DefaultPof(max int) func(one, other Val, pos int) (int, bool) { - return func(one, other Val, pos int) (int, bool) { - po, eq := proximityOrder(ToBytes(one), ToBytes(other), pos) - if po >= max { - eq = true - po = max - } - return po, eq - } -} - -// proximityOrder returns two parameters: -// 1. relative proximity order of the arguments one & other; -// 2. boolean indicating whether the full match occurred (one == other). -func proximityOrder(one, other []byte, pos int) (int, bool) { - for i := pos / 8; i < len(one); i++ { - if one[i] == other[i] { - continue - } - oxo := one[i] ^ other[i] - start := 0 - if i == pos/8 { - start = pos % 8 - } - for j := start; j < 8; j++ { - if (oxo>>uint8(7-j))&0x01 != 0 { - return i*8 + j, false - } - } - } - return len(one) * 8, true -} - -// Label displays the node's key in binary format -func Label(v Val) string { - if v == nil { - return "" - } - if s, ok := v.(fmt.Stringer); ok { - return s.String() - } - if b, ok := v.([]byte); ok { - return ToBin(b) - } - panic(fmt.Sprintf("unsupported value type %T", v)) -} diff --git a/swarm/pot/doc.go b/swarm/pot/doc.go deleted file mode 100644 index cb6faea57b3f..000000000000 --- a/swarm/pot/doc.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -/* -Package pot (proximity order tree) implements a container similar to a binary tree. -The elements are generic Val interface types. - -Each fork in the trie is itself a value. Values of the subtree contained under -a node all share the same order when compared to other elements in the tree. - -Example of proximity order is the length of the common prefix over bitvectors. -(which is equivalent to the reverse rank of order of magnitude of the MSB first X -OR distance over finite set of integers). - -Methods take a comparison operator (pof, proximity order function) to compare two -value types. The default pof assumes Val to be or project to a byte slice using -the reverse rank on the MSB first XOR logarithmic distance. - -If the address space if limited, equality is defined as the maximum proximity order. - -The container offers applicative (functional) style methods on PO trees: -* adding/removing en element -* swap (value based add/remove) -* merging two PO trees (union) - -as well as iterator accessors that respect proximity order - -When synchronicity of membership if not 100% requirement (e.g. used as a database -of network connections), applicative structures have the advantage that nodes -are immutable therefore manipulation does not need locking allowing for -concurrent retrievals. -For the use case where the entire container is supposed to allow changes by -concurrent routines, - -Pot -* retrieval, insertion and deletion by key involves log(n) pointer lookups -* for any item retrieval (defined as common prefix on the binary key) -* provide synchronous iterators respecting proximity ordering wrt any item -* provide asynchronous iterator (for parallel execution of operations) over n items -* allows cheap iteration over ranges -* asymmetric concurrent merge (union) - -Note: -* as is, union only makes sense for set representations since which of two values -with equal keys survives is random -* intersection is not implemented -* simple get accessor is not implemented (but derivable from EachNeighbour) - -Pinned value on the node implies no need to copy keys of the item type. - -Note that -* the same set of values allows for a large number of alternative -POT representations. -* values on the top are accessed faster than lower ones and the steps needed to -retrieve items has a logarithmic distribution. - -As a consequence one can organise the tree so that items that need faster access -are torwards the top. In particular for any subset where popularity has a power -distriution that is independent of proximity order (content addressed storage of -chunks), it is in principle possible to create a pot where the steps needed to -access an item is inversely proportional to its popularity. -Such organisation is not implemented as yet. - -TODO: -* overwrite-style merge -* intersection -* access frequency based optimisations - -*/ -package pot diff --git a/swarm/pot/pot.go b/swarm/pot/pot.go deleted file mode 100644 index 7e3967f3f974..000000000000 --- a/swarm/pot/pot.go +++ /dev/null @@ -1,787 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// Package pot see doc.go -package pot - -import ( - "fmt" - "sync" -) - -const ( - maxkeylen = 256 -) - -// Pot is the node type (same for root, branching node and leaf) -type Pot struct { - pin Val - bins []*Pot - size int - po int -} - -// Val is the element type for Pots -type Val interface{} - -// Pof is the proximity order comparison operator function -type Pof func(Val, Val, int) (int, bool) - -// NewPot constructor. Requires a value of type Val to pin -// and po to point to a span in the Val key -// The pinned item counts towards the size -func NewPot(v Val, po int) *Pot { - var size int - if v != nil { - size++ - } - return &Pot{ - pin: v, - po: po, - size: size, - } -} - -// Pin returns the pinned element (key) of the Pot -func (t *Pot) Pin() Val { - return t.pin -} - -// Size returns the number of values in the Pot -func (t *Pot) Size() int { - if t == nil { - return 0 - } - return t.size -} - -// Add inserts a new value into the Pot and -// returns the proximity order of v and a boolean -// indicating if the item was found -// Add called on (t, v) returns a new Pot that contains all the elements of t -// plus the value v, using the applicative add -// the second return value is the proximity order of the inserted element -// the third is boolean indicating if the item was found -func Add(t *Pot, val Val, pof Pof) (*Pot, int, bool) { - return add(t, val, pof) -} - -func (t *Pot) clone() *Pot { - return &Pot{ - pin: t.pin, - size: t.size, - po: t.po, - bins: t.bins, - } -} - -func add(t *Pot, val Val, pof Pof) (*Pot, int, bool) { - var r *Pot - if t == nil || t.pin == nil { - r = t.clone() - r.pin = val - r.size++ - return r, 0, false - } - po, found := pof(t.pin, val, t.po) - if found { - r = t.clone() - r.pin = val - return r, po, true - } - - var p *Pot - var i, j int - size := t.size - for i < len(t.bins) { - n := t.bins[i] - if n.po == po { - p, _, found = add(n, val, pof) - if !found { - size++ - } - j++ - break - } - if n.po > po { - break - } - i++ - j++ - } - if p == nil { - size++ - p = &Pot{ - pin: val, - size: 1, - po: po, - } - } - - bins := append([]*Pot{}, t.bins[:i]...) - bins = append(bins, p) - bins = append(bins, t.bins[j:]...) - r = &Pot{ - pin: t.pin, - size: size, - po: t.po, - bins: bins, - } - - return r, po, found -} - -// Remove deletes element v from the Pot t and returns three parameters: -// 1. new Pot that contains all the elements of t minus the element v; -// 2. proximity order of the removed element v; -// 3. boolean indicating whether the item was found. -func Remove(t *Pot, v Val, pof Pof) (*Pot, int, bool) { - return remove(t, v, pof) -} - -func remove(t *Pot, val Val, pof Pof) (r *Pot, po int, found bool) { - size := t.size - po, found = pof(t.pin, val, t.po) - if found { - size-- - if size == 0 { - return &Pot{}, po, true - } - i := len(t.bins) - 1 - last := t.bins[i] - r = &Pot{ - pin: last.pin, - bins: append(t.bins[:i], last.bins...), - size: size, - po: t.po, - } - return r, t.po, true - } - - var p *Pot - var i, j int - for i < len(t.bins) { - n := t.bins[i] - if n.po == po { - p, po, found = remove(n, val, pof) - if found { - size-- - } - j++ - break - } - if n.po > po { - return t, po, false - } - i++ - j++ - } - bins := t.bins[:i] - if p != nil && p.pin != nil { - bins = append(bins, p) - } - bins = append(bins, t.bins[j:]...) - r = &Pot{ - pin: t.pin, - size: size, - po: t.po, - bins: bins, - } - return r, po, found -} - -// Swap called on (k, f) looks up the item at k -// and applies the function f to the value v at k or to nil if the item is not found -// if f(v) returns nil, the element is removed -// if f(v) returns v' <> v then v' is inserted into the Pot -// if (v) == v the Pot is not changed -// it panics if Pof(f(v), k) show that v' and v are not key-equal -func Swap(t *Pot, k Val, pof Pof, f func(v Val) Val) (r *Pot, po int, found bool, change bool) { - var val Val - if t.pin == nil { - val = f(nil) - if val == nil { - return nil, 0, false, false - } - return NewPot(val, t.po), 0, false, true - } - size := t.size - po, found = pof(k, t.pin, t.po) - if found { - val = f(t.pin) - // remove element - if val == nil { - size-- - if size == 0 { - r = &Pot{ - po: t.po, - } - // return empty pot - return r, po, true, true - } - // actually remove pin, by merging last bin - i := len(t.bins) - 1 - last := t.bins[i] - r = &Pot{ - pin: last.pin, - bins: append(t.bins[:i], last.bins...), - size: size, - po: t.po, - } - return r, po, true, true - } - // element found but no change - if val == t.pin { - return t, po, true, false - } - // actually modify the pinned element, but no change in structure - r = t.clone() - r.pin = val - return r, po, true, true - } - - // recursive step - var p *Pot - n, i := t.getPos(po) - if n != nil { - p, po, found, change = Swap(n, k, pof, f) - // recursive no change - if !change { - return t, po, found, false - } - // recursive change - bins := append([]*Pot{}, t.bins[:i]...) - if p.size == 0 { - size-- - } else { - size += p.size - n.size - bins = append(bins, p) - } - i++ - if i < len(t.bins) { - bins = append(bins, t.bins[i:]...) - } - r = t.clone() - r.bins = bins - r.size = size - return r, po, found, true - } - // key does not exist - val = f(nil) - if val == nil { - // and it should not be created - return t, po, false, false - } - // otherwise check val if equal to k - if _, eq := pof(val, k, po); !eq { - panic("invalid value") - } - /// - size++ - p = &Pot{ - pin: val, - size: 1, - po: po, - } - - bins := append([]*Pot{}, t.bins[:i]...) - bins = append(bins, p) - if i < len(t.bins) { - bins = append(bins, t.bins[i:]...) - } - r = t.clone() - r.bins = bins - r.size = size - return r, po, found, true -} - -// Union called on (t0, t1, pof) returns the union of t0 and t1 -// calculates the union using the applicative union -// the second return value is the number of common elements -func Union(t0, t1 *Pot, pof Pof) (*Pot, int) { - return union(t0, t1, pof) -} - -func union(t0, t1 *Pot, pof Pof) (*Pot, int) { - if t0 == nil || t0.size == 0 { - return t1, 0 - } - if t1 == nil || t1.size == 0 { - return t0, 0 - } - var pin Val - var bins []*Pot - var mis []int - wg := &sync.WaitGroup{} - wg.Add(1) - pin0 := t0.pin - pin1 := t1.pin - bins0 := t0.bins - bins1 := t1.bins - var i0, i1 int - var common int - - po, eq := pof(pin0, pin1, 0) - - for { - l0 := len(bins0) - l1 := len(bins1) - var n0, n1 *Pot - var p0, p1 int - var a0, a1 bool - - for { - - if !a0 && i0 < l0 && bins0[i0] != nil && bins0[i0].po <= po { - n0 = bins0[i0] - p0 = n0.po - a0 = p0 == po - } else { - a0 = true - } - - if !a1 && i1 < l1 && bins1[i1] != nil && bins1[i1].po <= po { - n1 = bins1[i1] - p1 = n1.po - a1 = p1 == po - } else { - a1 = true - } - if a0 && a1 { - break - } - - switch { - case (p0 < p1 || a1) && !a0: - bins = append(bins, n0) - i0++ - n0 = nil - case (p1 < p0 || a0) && !a1: - bins = append(bins, n1) - i1++ - n1 = nil - case p1 < po: - bl := len(bins) - bins = append(bins, nil) - ml := len(mis) - mis = append(mis, 0) - // wg.Add(1) - // go func(b, m int, m0, m1 *Pot) { - // defer wg.Done() - // bins[b], mis[m] = union(m0, m1, pof) - // }(bl, ml, n0, n1) - bins[bl], mis[ml] = union(n0, n1, pof) - i0++ - i1++ - n0 = nil - n1 = nil - } - } - - if eq { - common++ - pin = pin1 - break - } - - i := i0 - if len(bins0) > i && bins0[i].po == po { - i++ - } - var size0 int - for _, n := range bins0[i:] { - size0 += n.size - } - np := &Pot{ - pin: pin0, - bins: bins0[i:], - size: size0 + 1, - po: po, - } - - bins2 := []*Pot{np} - if n0 == nil { - pin0 = pin1 - po = maxkeylen + 1 - eq = true - common-- - - } else { - bins2 = append(bins2, n0.bins...) - pin0 = pin1 - pin1 = n0.pin - po, eq = pof(pin0, pin1, n0.po) - - } - bins0 = bins1 - bins1 = bins2 - i0 = i1 - i1 = 0 - - } - - wg.Done() - wg.Wait() - for _, c := range mis { - common += c - } - n := &Pot{ - pin: pin, - bins: bins, - size: t0.size + t1.size - common, - po: t0.po, - } - return n, common -} - -// Each is a synchronous iterator over the elements of pot with function f. -func (t *Pot) Each(f func(Val) bool) bool { - return t.each(f) -} - -// each is a synchronous iterator over the elements of pot with function f. -// the iteration ends if the function return false or there are no more elements. -func (t *Pot) each(f func(Val) bool) bool { - if t == nil || t.size == 0 { - return false - } - for _, n := range t.bins { - if !n.each(f) { - return false - } - } - return f(t.pin) -} - -// eachFrom is a synchronous iterator over the elements of pot with function f, -// starting from certain proximity order po, which is passed as a second parameter. -// the iteration ends if the function return false or there are no more elements. -func (t *Pot) eachFrom(f func(Val) bool, po int) bool { - if t == nil || t.size == 0 { - return false - } - _, beg := t.getPos(po) - for i := beg; i < len(t.bins); i++ { - if !t.bins[i].each(f) { - return false - } - } - return f(t.pin) -} - -// EachBin iterates over bins of the pivot node and offers iterators to the caller on each -// subtree passing the proximity order and the size -// the iteration continues until the function's return value is false -// or there are no more subtries -func (t *Pot) EachBin(val Val, pof Pof, po int, f func(int, int, func(func(val Val) bool) bool) bool) { - t.eachBin(val, pof, po, f) -} - -func (t *Pot) eachBin(val Val, pof Pof, po int, f func(int, int, func(func(val Val) bool) bool) bool) { - if t == nil || t.size == 0 { - return - } - spr, _ := pof(t.pin, val, t.po) - _, lim := t.getPos(spr) - var size int - var n *Pot - for i := 0; i < lim; i++ { - n = t.bins[i] - size += n.size - if n.po < po { - continue - } - if !f(n.po, n.size, n.each) { - return - } - } - if lim == len(t.bins) { - if spr >= po { - f(spr, 1, func(g func(Val) bool) bool { - return g(t.pin) - }) - } - return - } - - n = t.bins[lim] - - spo := spr - if n.po == spr { - spo++ - size += n.size - } - if spr >= po { - if !f(spr, t.size-size, func(g func(Val) bool) bool { - return t.eachFrom(func(v Val) bool { - return g(v) - }, spo) - }) { - return - } - } - if n.po == spr { - n.eachBin(val, pof, po, f) - } - -} - -// EachNeighbour is a synchronous iterator over neighbours of any target val -// the order of elements retrieved reflect proximity order to the target -// TODO: add maximum proxbin to start range of iteration -func (t *Pot) EachNeighbour(val Val, pof Pof, f func(Val, int) bool) bool { - return t.eachNeighbour(val, pof, f) -} - -func (t *Pot) eachNeighbour(val Val, pof Pof, f func(Val, int) bool) bool { - if t == nil || t.size == 0 { - return false - } - var next bool - l := len(t.bins) - var n *Pot - ir := l - il := l - po, eq := pof(t.pin, val, t.po) - if !eq { - n, il = t.getPos(po) - if n != nil { - next = n.eachNeighbour(val, pof, f) - if !next { - return false - } - ir = il - } else { - ir = il - 1 - } - } - - next = f(t.pin, po) - if !next { - return false - } - - for i := l - 1; i > ir; i-- { - next = t.bins[i].each(func(v Val) bool { - return f(v, po) - }) - if !next { - return false - } - } - - for i := il - 1; i >= 0; i-- { - n := t.bins[i] - next = n.each(func(v Val) bool { - return f(v, n.po) - }) - if !next { - return false - } - } - return true -} - -// EachNeighbourAsync called on (val, max, maxPos, f, wait) is an asynchronous iterator -// over elements not closer than maxPos wrt val. -// val does not need to be match an element of the Pot, but if it does, and -// maxPos is keylength than it is included in the iteration -// Calls to f are parallelised, the order of calls is undefined. -// proximity order is respected in that there is no element in the Pot that -// is not visited if a closer node is visited. -// The iteration is finished when max number of nearest nodes is visited -// or if the entire there are no nodes not closer than maxPos that is not visited -// if wait is true, the iterator returns only if all calls to f are finished -// TODO: implement minPos for proper prox range iteration -func (t *Pot) EachNeighbourAsync(val Val, pof Pof, max int, maxPos int, f func(Val, int), wait bool) { - if max > t.size { - max = t.size - } - var wg *sync.WaitGroup - if wait { - wg = &sync.WaitGroup{} - } - t.eachNeighbourAsync(val, pof, max, maxPos, f, wg) - if wait { - wg.Wait() - } -} - -func (t *Pot) eachNeighbourAsync(val Val, pof Pof, max int, maxPos int, f func(Val, int), wg *sync.WaitGroup) (extra int) { - l := len(t.bins) - - po, eq := pof(t.pin, val, t.po) - - // if po is too close, set the pivot branch (pom) to maxPos - pom := po - if pom > maxPos { - pom = maxPos - } - n, il := t.getPos(pom) - ir := il - // if pivot branch exists and po is not too close, iterate on the pivot branch - if pom == po { - if n != nil { - - m := n.size - if max < m { - m = max - } - max -= m - - extra = n.eachNeighbourAsync(val, pof, m, maxPos, f, wg) - - } else { - if !eq { - ir-- - } - } - } else { - extra++ - max-- - if n != nil { - il++ - } - // before checking max, add up the extra elements - // on the close branches that are skipped (if po is too close) - for i := l - 1; i >= il; i-- { - s := t.bins[i] - m := s.size - if max < m { - m = max - } - max -= m - extra += m - } - } - - var m int - if pom == po { - - m, max, extra = need(1, max, extra) - if m <= 0 { - return - } - - if wg != nil { - wg.Add(1) - } - go func() { - if wg != nil { - defer wg.Done() - } - f(t.pin, po) - }() - - // otherwise iterats - for i := l - 1; i > ir; i-- { - n := t.bins[i] - - m, max, extra = need(n.size, max, extra) - if m <= 0 { - return - } - - if wg != nil { - wg.Add(m) - } - go func(pn *Pot, pm int) { - pn.each(func(v Val) bool { - if wg != nil { - defer wg.Done() - } - f(v, po) - pm-- - return pm > 0 - }) - }(n, m) - - } - } - - // iterate branches that are farther tham pom with their own po - for i := il - 1; i >= 0; i-- { - n := t.bins[i] - // the first time max is less than the size of the entire branch - // wait for the pivot thread to release extra elements - m, max, extra = need(n.size, max, extra) - if m <= 0 { - return - } - - if wg != nil { - wg.Add(m) - } - go func(pn *Pot, pm int) { - pn.each(func(v Val) bool { - if wg != nil { - defer wg.Done() - } - f(v, pn.po) - pm-- - return pm > 0 - }) - }(n, m) - - } - return max + extra -} - -// getPos called on (n) returns the forking node at PO n and its index if it exists -// otherwise nil -// caller is supposed to hold the lock -func (t *Pot) getPos(po int) (n *Pot, i int) { - for i, n = range t.bins { - if po > n.po { - continue - } - if po < n.po { - return nil, i - } - return n, i - } - return nil, len(t.bins) -} - -// need called on (m, max, extra) uses max m out of extra, and then max -// if needed, returns the adjusted counts -func need(m, max, extra int) (int, int, int) { - if m <= extra { - return m, max, extra - m - } - max += extra - m - if max <= 0 { - return m + max, 0, 0 - } - return m, max, 0 -} - -func (t *Pot) String() string { - return t.sstring("") -} - -func (t *Pot) sstring(indent string) string { - if t == nil { - return "" - } - var s string - indent += " " - s += fmt.Sprintf("%v%v (%v) %v \n", indent, t.pin, t.po, t.size) - for _, n := range t.bins { - s += fmt.Sprintf("%v%v\n", indent, n.sstring(indent)) - } - return s -} diff --git a/swarm/pot/pot_test.go b/swarm/pot/pot_test.go deleted file mode 100644 index c026804aa437..000000000000 --- a/swarm/pot/pot_test.go +++ /dev/null @@ -1,741 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . -package pot - -import ( - "errors" - "fmt" - "math/rand" - "runtime" - "sync" - "testing" - "time" - - "github.com/nebulaai/nbai-node/swarm/log" -) - -const ( - maxEachNeighbourTests = 420 - maxEachNeighbour = 420 - maxSwap = 420 - maxSwapTests = 420 -) - -// func init() { -// log.Root().SetHandler(log.LvlFilterHandler(log.LvlTrace, log.StreamHandler(os.Stderr, log.TerminalFormat(false)))) -// } - -type testAddr struct { - a []byte - i int -} - -func newTestAddr(s string, i int) *testAddr { - return &testAddr{NewAddressFromString(s), i} -} - -func (a *testAddr) Address() []byte { - return a.a -} - -func (a *testAddr) String() string { - return Label(a.a) -} - -func randomTestAddr(n int, i int) *testAddr { - v := RandomAddress().Bin()[:n] - return newTestAddr(v, i) -} - -func randomtestAddr(n int, i int) *testAddr { - v := RandomAddress().Bin()[:n] - return newTestAddr(v, i) -} - -func indexes(t *Pot) (i []int) { - t.Each(func(v Val) bool { - a := v.(*testAddr) - i = append(i, a.i) - return true - }) - return i -} - -func testAdd(t *Pot, pof Pof, j int, values ...string) (_ *Pot, n int, f bool) { - for i, val := range values { - t, n, f = Add(t, newTestAddr(val, i+j), pof) - } - return t, n, f -} - -// removing non-existing element from pot -func TestPotRemoveNonExisting(t *testing.T) { - pof := DefaultPof(8) - n := NewPot(newTestAddr("00111100", 0), 0) - n, _, _ = Remove(n, newTestAddr("00000101", 0), pof) - exp := "00111100" - got := Label(n.Pin()) - if got[:8] != exp { - t.Fatalf("incorrect pinned value. Expected %v, got %v", exp, got[:8]) - } -} - -// this test creates hierarchical pot tree, and therefore any child node will have -// child_po = parent_po + 1. -// then removes a node from the middle of the tree. -func TestPotRemoveSameBin(t *testing.T) { - pof := DefaultPof(8) - n := NewPot(newTestAddr("11111111", 0), 0) - n, _, _ = testAdd(n, pof, 1, "00000000", "01000000", "01100000", "01110000", "01111000") - n, _, _ = Remove(n, newTestAddr("01110000", 0), pof) - inds := indexes(n) - goti := n.Size() - expi := 5 - if goti != expi { - t.Fatalf("incorrect number of elements in Pot. Expected %v, got %v", expi, goti) - } - inds = indexes(n) - got := fmt.Sprintf("%v", inds) - exp := "[5 3 2 1 0]" - if got != exp { - t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) - } -} - -// this test creates a flat pot tree (all the elements are leafs of one root), -// and therefore they all have the same po. -// then removes an arbitrary element from the pot. -func TestPotRemoveDifferentBins(t *testing.T) { - pof := DefaultPof(8) - n := NewPot(newTestAddr("11111111", 0), 0) - n, _, _ = testAdd(n, pof, 1, "00000000", "10000000", "11000000", "11100000", "11110000") - n, _, _ = Remove(n, newTestAddr("11100000", 0), pof) - inds := indexes(n) - goti := n.Size() - expi := 5 - if goti != expi { - t.Fatalf("incorrect number of elements in Pot. Expected %v, got %v", expi, goti) - } - inds = indexes(n) - got := fmt.Sprintf("%v", inds) - exp := "[1 2 3 5 0]" - if got != exp { - t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) - } - n, _, _ = testAdd(n, pof, 4, "11100000") - inds = indexes(n) - got = fmt.Sprintf("%v", inds) - exp = "[1 2 3 4 5 0]" - if got != exp { - t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) - } -} - -func TestPotAdd(t *testing.T) { - pof := DefaultPof(8) - n := NewPot(newTestAddr("00111100", 0), 0) - // Pin set correctly - exp := "00111100" - got := Label(n.Pin())[:8] - if got != exp { - t.Fatalf("incorrect pinned value. Expected %v, got %v", exp, got) - } - // check size - goti := n.Size() - expi := 1 - if goti != expi { - t.Fatalf("incorrect number of elements in Pot. Expected %v, got %v", expi, goti) - } - - n, _, _ = testAdd(n, pof, 1, "01111100", "00111100", "01111100", "00011100") - // check size - goti = n.Size() - expi = 3 - if goti != expi { - t.Fatalf("incorrect number of elements in Pot. Expected %v, got %v", expi, goti) - } - inds := indexes(n) - got = fmt.Sprintf("%v", inds) - exp = "[3 4 2]" - if got != exp { - t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) - } -} - -func TestPotRemove(t *testing.T) { - pof := DefaultPof(8) - n := NewPot(newTestAddr("00111100", 0), 0) - n, _, _ = Remove(n, newTestAddr("00111100", 0), pof) - exp := "" - got := Label(n.Pin()) - if got != exp { - t.Fatalf("incorrect pinned value. Expected %v, got %v", exp, got) - } - n, _, _ = testAdd(n, pof, 1, "00000000", "01111100", "00111100", "00011100") - n, _, _ = Remove(n, newTestAddr("00111100", 0), pof) - goti := n.Size() - expi := 3 - if goti != expi { - t.Fatalf("incorrect number of elements in Pot. Expected %v, got %v", expi, goti) - } - inds := indexes(n) - got = fmt.Sprintf("%v", inds) - exp = "[2 4 1]" - if got != exp { - t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) - } - n, _, _ = Remove(n, newTestAddr("00111100", 0), pof) // remove again same element - inds = indexes(n) - got = fmt.Sprintf("%v", inds) - if got != exp { - t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) - } - n, _, _ = Remove(n, newTestAddr("00000000", 0), pof) // remove the first element - inds = indexes(n) - got = fmt.Sprintf("%v", inds) - exp = "[2 4]" - if got != exp { - t.Fatalf("incorrect indexes in iteration over Pot. Expected %v, got %v", exp, got) - } -} - -func TestPotSwap(t *testing.T) { - for i := 0; i < maxSwapTests; i++ { - alen := maxkeylen - pof := DefaultPof(alen) - max := rand.Intn(maxSwap) - - n := NewPot(nil, 0) - var m []*testAddr - var found bool - for j := 0; j < 2*max; { - v := randomtestAddr(alen, j) - n, _, found = Add(n, v, pof) - if !found { - m = append(m, v) - j++ - } - } - k := make(map[string]*testAddr) - for j := 0; j < max; { - v := randomtestAddr(alen, 1) - _, found := k[Label(v)] - if !found { - k[Label(v)] = v - j++ - } - } - for _, v := range k { - m = append(m, v) - } - f := func(v Val) Val { - tv := v.(*testAddr) - if tv.i < max { - return nil - } - tv.i = 0 - return v - } - for _, val := range m { - n, _, _, _ = Swap(n, val, pof, func(v Val) Val { - if v == nil { - return val - } - return f(v) - }) - } - sum := 0 - n.Each(func(v Val) bool { - if v == nil { - return true - } - sum++ - tv := v.(*testAddr) - if tv.i > 1 { - t.Fatalf("item value incorrect, expected 0, got %v", tv.i) - } - return true - }) - if sum != 2*max { - t.Fatalf("incorrect number of elements. expected %v, got %v", 2*max, sum) - } - if sum != n.Size() { - t.Fatalf("incorrect size. expected %v, got %v", sum, n.Size()) - } - } -} - -func checkPo(val Val, pof Pof) func(Val, int) error { - return func(v Val, po int) error { - // check the po - exp, _ := pof(val, v, 0) - if po != exp { - return fmt.Errorf("incorrect prox order for item %v in neighbour iteration for %v. Expected %v, got %v", v, val, exp, po) - } - return nil - } -} - -func checkOrder(val Val) func(Val, int) error { - po := maxkeylen - return func(v Val, p int) error { - if po < p { - return fmt.Errorf("incorrect order for item %v in neighbour iteration for %v. PO %v > %v (previous max)", v, val, p, po) - } - po = p - return nil - } -} - -func checkValues(m map[string]bool, val Val) func(Val, int) error { - return func(v Val, po int) error { - duplicate, ok := m[Label(v)] - if !ok { - return fmt.Errorf("alien value %v", v) - } - if duplicate { - return fmt.Errorf("duplicate value returned: %v", v) - } - m[Label(v)] = true - return nil - } -} - -var errNoCount = errors.New("not count") - -func testPotEachNeighbour(n *Pot, pof Pof, val Val, expCount int, fs ...func(Val, int) error) error { - var err error - var count int - n.EachNeighbour(val, pof, func(v Val, po int) bool { - for _, f := range fs { - err = f(v, po) - if err != nil { - return err.Error() == errNoCount.Error() - } - } - count++ - return count != expCount - }) - if err == nil && count < expCount { - return fmt.Errorf("not enough neighbours returned, expected %v, got %v", expCount, count) - } - return err -} - -const ( - mergeTestCount = 5 - mergeTestChoose = 5 -) - -func TestPotMergeCommon(t *testing.T) { - vs := make([]*testAddr, mergeTestCount) - for i := 0; i < maxEachNeighbourTests; i++ { - alen := maxkeylen - pof := DefaultPof(alen) - - for j := 0; j < len(vs); j++ { - vs[j] = randomtestAddr(alen, j) - } - max0 := rand.Intn(mergeTestChoose) + 1 - max1 := rand.Intn(mergeTestChoose) + 1 - n0 := NewPot(nil, 0) - n1 := NewPot(nil, 0) - log.Trace(fmt.Sprintf("round %v: %v - %v", i, max0, max1)) - m := make(map[string]bool) - var found bool - for j := 0; j < max0; { - r := rand.Intn(max0) - v := vs[r] - n0, _, found = Add(n0, v, pof) - if !found { - m[Label(v)] = false - j++ - } - } - expAdded := 0 - - for j := 0; j < max1; { - r := rand.Intn(max1) - v := vs[r] - n1, _, found = Add(n1, v, pof) - if !found { - j++ - } - _, found = m[Label(v)] - if !found { - expAdded++ - m[Label(v)] = false - } - } - if i < 6 { - continue - } - expSize := len(m) - log.Trace(fmt.Sprintf("%v-0: pin: %v, size: %v", i, n0.Pin(), max0)) - log.Trace(fmt.Sprintf("%v-1: pin: %v, size: %v", i, n1.Pin(), max1)) - log.Trace(fmt.Sprintf("%v: merged tree size: %v, newly added: %v", i, expSize, expAdded)) - n, common := Union(n0, n1, pof) - added := n1.Size() - common - size := n.Size() - - if expSize != size { - t.Fatalf("%v: incorrect number of elements in merged pot, expected %v, got %v\n%v", i, expSize, size, n) - } - if expAdded != added { - t.Fatalf("%v: incorrect number of added elements in merged pot, expected %v, got %v", i, expAdded, added) - } - if !checkDuplicates(n) { - t.Fatalf("%v: merged pot contains duplicates: \n%v", i, n) - } - for k := range m { - _, _, found = Add(n, newTestAddr(k, 0), pof) - if !found { - t.Fatalf("%v: merged pot (size:%v, added: %v) missing element %v", i, size, added, k) - } - } - } -} - -func TestPotMergeScale(t *testing.T) { - for i := 0; i < maxEachNeighbourTests; i++ { - alen := maxkeylen - pof := DefaultPof(alen) - max0 := rand.Intn(maxEachNeighbour) + 1 - max1 := rand.Intn(maxEachNeighbour) + 1 - n0 := NewPot(nil, 0) - n1 := NewPot(nil, 0) - log.Trace(fmt.Sprintf("round %v: %v - %v", i, max0, max1)) - m := make(map[string]bool) - var found bool - for j := 0; j < max0; { - v := randomtestAddr(alen, j) - n0, _, found = Add(n0, v, pof) - if !found { - m[Label(v)] = false - j++ - } - } - expAdded := 0 - - for j := 0; j < max1; { - v := randomtestAddr(alen, j) - n1, _, found = Add(n1, v, pof) - if !found { - j++ - } - _, found = m[Label(v)] - if !found { - expAdded++ - m[Label(v)] = false - } - } - if i < 6 { - continue - } - expSize := len(m) - log.Trace(fmt.Sprintf("%v-0: pin: %v, size: %v", i, n0.Pin(), max0)) - log.Trace(fmt.Sprintf("%v-1: pin: %v, size: %v", i, n1.Pin(), max1)) - log.Trace(fmt.Sprintf("%v: merged tree size: %v, newly added: %v", i, expSize, expAdded)) - n, common := Union(n0, n1, pof) - added := n1.Size() - common - size := n.Size() - - if expSize != size { - t.Fatalf("%v: incorrect number of elements in merged pot, expected %v, got %v", i, expSize, size) - } - if expAdded != added { - t.Fatalf("%v: incorrect number of added elements in merged pot, expected %v, got %v", i, expAdded, added) - } - if !checkDuplicates(n) { - t.Fatalf("%v: merged pot contains duplicates", i) - } - for k := range m { - _, _, found = Add(n, newTestAddr(k, 0), pof) - if !found { - t.Fatalf("%v: merged pot (size:%v, added: %v) missing element %v", i, size, added, k) - } - } - } -} - -func checkDuplicates(t *Pot) bool { - po := -1 - for _, c := range t.bins { - if c == nil { - return false - } - if c.po <= po || !checkDuplicates(c) { - return false - } - po = c.po - } - return true -} - -func TestPotEachNeighbourSync(t *testing.T) { - for i := 0; i < maxEachNeighbourTests; i++ { - alen := maxkeylen - pof := DefaultPof(maxkeylen) - max := rand.Intn(maxEachNeighbour/2) + maxEachNeighbour/2 - pin := randomTestAddr(alen, 0) - n := NewPot(pin, 0) - m := make(map[string]bool) - m[Label(pin)] = false - for j := 1; j <= max; j++ { - v := randomTestAddr(alen, j) - n, _, _ = Add(n, v, pof) - m[Label(v)] = false - } - - size := n.Size() - if size < 2 { - continue - } - count := rand.Intn(size/2) + size/2 - val := randomTestAddr(alen, max+1) - log.Trace(fmt.Sprintf("%v: pin: %v, size: %v, val: %v, count: %v", i, n.Pin(), size, val, count)) - err := testPotEachNeighbour(n, pof, val, count, checkPo(val, pof), checkOrder(val), checkValues(m, val)) - if err != nil { - t.Fatal(err) - } - minPoFound := alen - maxPoNotFound := 0 - for k, found := range m { - po, _ := pof(val, newTestAddr(k, 0), 0) - if found { - if po < minPoFound { - minPoFound = po - } - } else { - if po > maxPoNotFound { - maxPoNotFound = po - } - } - } - if minPoFound < maxPoNotFound { - t.Fatalf("incorrect neighbours returned: found one with PO %v < there was one not found with PO %v", minPoFound, maxPoNotFound) - } - } -} - -func TestPotEachNeighbourAsync(t *testing.T) { - for i := 0; i < maxEachNeighbourTests; i++ { - max := rand.Intn(maxEachNeighbour/2) + maxEachNeighbour/2 - alen := maxkeylen - pof := DefaultPof(alen) - n := NewPot(randomTestAddr(alen, 0), 0) - size := 1 - var found bool - for j := 1; j <= max; j++ { - v := randomTestAddr(alen, j) - n, _, found = Add(n, v, pof) - if !found { - size++ - } - } - if size != n.Size() { - t.Fatal(n) - } - if size < 2 { - continue - } - count := rand.Intn(size/2) + size/2 - val := randomTestAddr(alen, max+1) - - mu := sync.Mutex{} - m := make(map[string]bool) - maxPos := rand.Intn(alen) - log.Trace(fmt.Sprintf("%v: pin: %v, size: %v, val: %v, count: %v, maxPos: %v", i, n.Pin(), size, val, count, maxPos)) - msize := 0 - remember := func(v Val, po int) error { - if po > maxPos { - return errNoCount - } - m[Label(v)] = true - msize++ - return nil - } - if i == 0 { - continue - } - testPotEachNeighbour(n, pof, val, count, remember) - d := 0 - forget := func(v Val, po int) { - mu.Lock() - defer mu.Unlock() - d++ - delete(m, Label(v)) - } - - n.EachNeighbourAsync(val, pof, count, maxPos, forget, true) - if d != msize { - t.Fatalf("incorrect number of neighbour calls in async iterator. expected %v, got %v", msize, d) - } - if len(m) != 0 { - t.Fatalf("incorrect neighbour calls in async iterator. %v items missed:\n%v", len(m), n) - } - } -} - -func benchmarkEachNeighbourSync(t *testing.B, max, count int, d time.Duration) { - t.ReportAllocs() - alen := maxkeylen - pof := DefaultPof(alen) - pin := randomTestAddr(alen, 0) - n := NewPot(pin, 0) - var found bool - for j := 1; j <= max; { - v := randomTestAddr(alen, j) - n, _, found = Add(n, v, pof) - if !found { - j++ - } - } - t.ResetTimer() - for i := 0; i < t.N; i++ { - val := randomTestAddr(alen, max+1) - m := 0 - n.EachNeighbour(val, pof, func(v Val, po int) bool { - time.Sleep(d) - m++ - return m != count - }) - } - t.StopTimer() - stats := new(runtime.MemStats) - runtime.ReadMemStats(stats) -} - -func benchmarkEachNeighbourAsync(t *testing.B, max, count int, d time.Duration) { - t.ReportAllocs() - alen := maxkeylen - pof := DefaultPof(alen) - pin := randomTestAddr(alen, 0) - n := NewPot(pin, 0) - var found bool - for j := 1; j <= max; { - v := randomTestAddr(alen, j) - n, _, found = Add(n, v, pof) - if !found { - j++ - } - } - t.ResetTimer() - for i := 0; i < t.N; i++ { - val := randomTestAddr(alen, max+1) - n.EachNeighbourAsync(val, pof, count, alen, func(v Val, po int) { - time.Sleep(d) - }, true) - } - t.StopTimer() - stats := new(runtime.MemStats) - runtime.ReadMemStats(stats) -} - -func BenchmarkEachNeighbourSync_3_1_0(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 10, 1*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_1_0(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 10, 1*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_2_0(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 100, 1*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_2_0(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 100, 1*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_3_0(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 1000, 1*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_3_0(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 1000, 1*time.Microsecond) -} - -func BenchmarkEachNeighbourSync_3_1_1(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 10, 2*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_1_1(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 10, 2*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_2_1(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 100, 2*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_2_1(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 100, 2*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_3_1(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 1000, 2*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_3_1(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 1000, 2*time.Microsecond) -} - -func BenchmarkEachNeighbourSync_3_1_2(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 10, 4*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_1_2(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 10, 4*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_2_2(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 100, 4*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_2_2(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 100, 4*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_3_2(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 1000, 4*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_3_2(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 1000, 4*time.Microsecond) -} - -func BenchmarkEachNeighbourSync_3_1_3(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 10, 8*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_1_3(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 10, 8*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_2_3(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 100, 8*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_2_3(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 100, 8*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_3_3(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 1000, 8*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_3_3(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 1000, 8*time.Microsecond) -} - -func BenchmarkEachNeighbourSync_3_1_4(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 10, 16*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_1_4(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 10, 16*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_2_4(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 100, 16*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_2_4(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 100, 16*time.Microsecond) -} -func BenchmarkEachNeighbourSync_3_3_4(t *testing.B) { - benchmarkEachNeighbourSync(t, 1000, 1000, 16*time.Microsecond) -} -func BenchmarkEachNeighboursAsync_3_3_4(t *testing.B) { - benchmarkEachNeighbourAsync(t, 1000, 1000, 16*time.Microsecond) -} diff --git a/swarm/pss/ARCHITECTURE.md b/swarm/pss/ARCHITECTURE.md deleted file mode 100644 index 279e895ab798..000000000000 --- a/swarm/pss/ARCHITECTURE.md +++ /dev/null @@ -1,144 +0,0 @@ -# Postal Service over Swarm - -Pss provides devp2p functionality for swarm nodes without the need for a direct tcp connection between them. - -Messages are encapsulated in a devp2p message structure `PssMsg`. These capsules are forwarded from node to node using ordinary tcp devp2p until they reach their destination: The node or nodes who can successfully decrypt the message. - -| Layer | Contents | -|-----------|-----------------| -| PssMsg: | Address, Expiry | -| Envelope: | Topic | -| Payload: | e(data) | - -Routing of messages is done using swarm's own kademlia routing. Optionally routing can be turned off, forcing the message to be sent to all peers, similar to the behavior of the whisper protocol. - -Pss is intended for messages of limited size, typically a couple of Kbytes at most. The messages themselves can be anything at all; complex data structures or non-descript byte sequences. - -For the current state and roadmap of pss development please see https://github.com/ethersphere/swarm/wiki/swarm-dev-progress. - -Please report issues on https://github.com/ethersphere/go-ethereum - -Feel free to ask questions in https://gitter.im/ethersphere/pss - -## STATUS OF THIS DOCUMENT - -`pss` is under active development, and the first implementation is yet to be merged to the Ethereum main branch. Expect things to change. - -## CORE INTERFACES - -The pss core provides low level control of key handling and message exchange. - -### TOPICS - -An encrypted envelope of a pss message always contains a Topic. This is pss' way of determining which message handlers to dispatch messages to. The topic of a message is only visible for the node(s) who can decrypt the message. - -This "topic" is not like the subject of an email message, but a hash-like arbitrary 4 byte value. A valid topic can be generated using the `pss_*ToTopic` API methods. - -### IDENTITY AND ENCRYPTION - -Pss aims to achieve perfect darkness. That means that the minimum requirement for two nodes to communicate using pss is a shared secret. This secret can be an arbitrary byte slice, or a ECDSA keypair. The end recipient of a message is defined as the node that can successfully decrypt that message using stored keys. - -A node's public key is derived from the private key passed to the `pss` constructor. Pss (currently) has no PKI. - -Peer keys can manually be added to the pss node through its API calls `pss_setPeerPublicKey` and `pss_setSymmetricKey`. Keys are always coupled with a topic, and the keys will only be valid for these topics. - -### CONNECTIONS - -A "connection" in pss is a purely virtual construct. There is no mechanisms in place to ensure that the remote peer actually is there. In fact, "adding" a peer involves merely the node's opinion that the peer is there. It may issue messages to that remote peer to a directly connected peer, which in turn passes it on. But if it is not present on the network - or if there is no route to it - the message will never reach its destination through mere forwarding. - -Since pss itself never requires a confirmation from a peer of whether a message is received or not, one could argue that pss shows `UDP`-like behavior. - -It is also important to note that if the wrong (partial) address is set for a particular key/topic combination, the message may never reach that peer. The further left in the address byte slice the error lies, the less likely it is that delivery will occur. - - -### EXCHANGE - -Message exchange in `pss` *requires* end-to-end encryption. - -The API methods `pss_sendSym` and `pss_sendAsym` sends an arbitrary byte slice with a specific topic to a pss peer using the respective encryption scheme. The key passed to the send method must be associated with a topic in the pss key store prior to sending, or the send method will fail. - -Return values from the send methods do *not* indicate whether the message was successfully delivered to the pss peer. It *only* indicates whether or not the message could be passed on to the network. If the message could not be forwarded to any peers, the method will fail. - -Keep in mind that symmetric encryption is less resource-intensive than asymmetric encryption. The former should be used for nodes with high message volumes. - -## EXTENSIONS - -### HANDSHAKE - -Pss offers an optional Diffie-Hellman handshake mechanism. Handshake functionality is activated per topic, and can be deactivated per topic even while the node is running. - -Handshakes are activated in the code implementation of the node by running `SetHandshakeController()` on the pss node instance BEFORE starting the node service. The methods exposed by the HandshakeController's API gives the possibility to initiate, remove and check the state of handshakes and associated keys. - -See the `HandshakeAPI` section in `godoc` for details. - -### DEVP2P PROTOCOLS - -The `Protocol` convenience structure is provided to mimic devp2p-type protocols over pss. In theory this makes it possible to reuse protocol code written for devp2p with a minimum of effort. - -#### OUTGOING CONNECTIONS - -In order to message a peer using this layer, a `Protocol` object must first be instantiated. When this is done, peers can be added using the protocol's `AddPeer()` method. The peer's key/topic combination must be in the pss key store before the peer can be aded. - -Adding a peer in effect "runs" the protocol on that peer, and adds an internal mapping between a topic and that peer, and enables sending and receiving messages using the usual io-construct of devp2p. It does not actually *transmit* anything to the peer, it merely represents the node's opinion that a connection with the peer exists. (See CONNECTION above). - -#### INCOMING CONNECTIONS - -An incoming connection is nothing more than an actual PssMsg appearing with a certain Topic. If a Handler has been registered to that Topic, the message will be passed to it. This constitutes a "new" connection if: - -- The pss node never called AddPeer with this combination of remote peer address and topic, and - -- The pss node never received a PssMsg from this remote peer with this specific Topic before. - -If it is a "new" connection, the protocol will be "run" on the remote peer, as if the peer was added via the API. - -As with the `AddPeer()` method, the key/topic of the originating peer must exist in the pss key store. - -#### TOPICS IN DEVP2P - -The `ProtocolTopic()` method should be used to determine the correct topic to use for a pss `Protocol` instance. - -## EXAMPLES - -Coming. Please refer to the tests for now. - -## PSS INTERNALS - -Pss implements the node.Service interface. It depends on a working kademlia overlay for routing. - -### DECRYPTION - -When processing an incoming message, `pss` detects whether it is encrypted symmetrically or asymmetrically. - -When decrypting symmetrically, `pss` iterates through all stored keys, and attempts to decrypt with each key in order. - -pss keeps a *cache* of these keys. The cache will only store a certain amount of keys, and the iterator will return keys in the order of most recently used key first. Abandoned keys will be garbage collected. - -### ROUTING - -(please refer to swarm kademlia routing for an explanation of the routing algorithm used for pss) - -`pss` uses *address hinting* for routing. The address hint is an arbitrary-length MSB byte slice of the peer's swarm overlay address. It can be the whole address, part of the address, or even an empty byte slice. The slice will be matched to the MSB slice of the same length of all devp2p peers in the routing stage. - -If an empty byte slice is passed, all devp2p peers will match the address hint, and the message will be forwarded to everyone. This is equivalent to `whisper` routing, and makes it difficult to perform traffic analysis based on who messages are forwarded to. - -A node will also forward to everyone if the address hint provided is in its proximity bin, both to provide saturation to increase chances of delivery, and also for recipient obfuscation to thwart traffic analysis attacks. The recipient node(s) will always forward to all its peers. - -### CACHING - -pss implements a simple caching mechanism for messages, using the swarm FileStore for storage of the messages and generation of the digest keys used in the cache table. The caching is intended to alleviate the following: - -- save messages so that they can be delivered later if the recipient was not online at the time of sending. - -- drop an identical message to the same recipient if received within a given time interval - -- prevent backwards routing of messages - -the latter may occur if only one entry is in the receiving node's kademlia, or if the proximity of the current node recipient hinted by the address is so close that the message will be forwarded to everyone. In these cases the forwarder will be provided as the "nearest node" to the final recipient. The cache keeps the address of who the message was forwarded from, and if the cache lookup matches, the message will be dropped. - -### DEVP2P PROTOCOLS - -When implementing devp2p protocols, topics are derived from protocols' name and version. The Protocol provides a generic Handler that be passed to Pss.Register. This makes it possible to use the same message handler code for pss that is used for directly connected peers in devp2p. - -Under the hood, pss implements its own MsgReadWriter, which bridges MsgReadWriter.WriteMsg with Pss.SendRaw, and deftly adds an InjectMsg method which pipes incoming messages to appear on the MsgReadWriter.ReadMsg channel. - - diff --git a/swarm/pss/README.md b/swarm/pss/README.md deleted file mode 100644 index aea871251fe0..000000000000 --- a/swarm/pss/README.md +++ /dev/null @@ -1,318 +0,0 @@ -# Postal Services over Swarm - -`pss` enables message relay over swarm. This means nodes can send messages to each other without being directly connected with each other, while taking advantage of the efficient routing algorithms that swarm uses for transporting and storing data. - -### CONTENTS - -* Status of this document -* Core concepts -* Caveat -* Examples -* API - * Retrieve node information - * Receive messages - * Send messages using public key encryption - * Send messages using symmetric encryption - * Querying peer keys - * Handshakes - -### STATUS OF THIS DOCUMENT - -`pss` is under active development, and the first implementation is yet to be merged to the Ethereum main branch. Expect things to change. - -Details on swarm routing and encryption schemes out of scope of this document. - -Please refer to [ARCHITECTURE.md](ARCHITECTURE.md) for in-depth topics concerning `pss`. - -## CORE CONCEPTS - -Three things are required to send a `pss` message: - -1. Encryption key -2. Topic -3. Message payload - -Encryption key can be a public key or a 32 byte symmetric key. It must be coupled with a peer address in the node prior to sending. - -Topic is the initial 4 bytes of a hash value. - -Message payload is an arbitrary byte slice of data. - -Upon sending the message it is encrypted and passed on from peer to peer. Any node along the route that can successfully decrypt the message is regarded as a recipient. Recipients continue to pass on the message to their peers, to make traffic analysis attacks more difficult. - -The Address that is coupled with the encryption keys are used for routing the message. This does *not* need to be a full addresses; the network will route the message to the best of its ability with the information that is available. If *no* address is given (zero-length byte slice), routing is effectively deactivated, and the message is passed to all peers by all peers. - -## CAVEAT - -`pss` connectivity resembles UDP. This means there is no delivery guarantee for a message. Furthermore there is no strict definition of what a connection between two nodes communicating via `pss` is. Reception acknowledgements and keepalive-schemes is the responsibility of the application. - -Due to the inherent properties of the `swarm` routing algorithm, a node may receive the same message more than once. Message deduplication *cannot be guaranteed* by `pss`, and must be handled in the application layer to ensure predictable results. - -## EXAMPLES - -The code tutorial [p2p programming in go-ethereum](https://github.com/nolash/go-ethereum-p2p-demo) by [@nolash](https://github.com/nolash) provides step-by-step code examples for usage of `pss` API with `go-ethereum` nodes. - -A quite unpolished example using `javascript` is available here: [https://github.com/nolash/pss-js/tree/withcrypt](https://github.com/nolash/pss-js/tree/withcrypt) - -## API - -The `pss` API is available through IPC and Websockets. There is currently no `web3.js` implementation, as this does not support message subscription. - -For `golang` clients, please use the `rpc.Client` provided by the `go-ethereum` repository. The return values may have special types in `golang`. Please refer to `godoc` for details. - -### RETRIEVE NODE INFORMATION - -#### pss_getPublicKey - -Retrieves the public key of the node, in hex format - -``` -parameters: -none - -returns: -1. publickey (hex) -``` - -#### pss_baseAddr - -Retrieves the swarm overlay address of the node, in hex format - -``` -parameters: -none - -returns: -1. swarm overlay address (hex) -``` - -#### pss_stringToTopic - -Creates a deterministic 4 byte topic value from input, returned in hex format - -``` -parameters: -1. topic string (string) - -returns: -1. pss topic (hex) -``` - -### RECEIVE MESSAGES - -#### pss_subscribe - -Creates a subscription. Received messages with matching topic will be passed to subscription client. - -``` -parameters: -1. string("receive") -2. topic (4 bytes in hex) - -returns: -1. subscription handle `base64(byte)` `rpc.ClientSubscription` -``` - -In `golang` as special method is used: - -`rpc.Client.Subscribe(context.Context, "pss", chan pss.APIMsg, "receive", pss.Topic)` - -Incoming messages are encapsulated in an object (`pss.APIMsg` in `golang`) with the following members: - -``` -1. Msg (hex) - the message payload -2. Asymmetric (bool) - true if message used public key encryption -3. Key (string) - the encryption key used -``` - -### SEND MESSAGE USING PUBLIC KEY ENCRYPTION - -#### pss_setPeerPublicKey - -Register a peer's public key. This is done once for every topic that will be used with the peer. Address can be anything from 0 to 32 bytes inclusive of the peer's swarm overlay address. - -``` -parameters: -1. public key of peer (hex) -2. topic (4 bytes in hex) -3. address of peer (hex) - -returns: -none -``` - -#### pss_sendAsym - -Encrypts the message using the provided public key, and signs it using the node's private key. It then wraps it in an envelope containing the topic, and sends it to the network. - -``` -parameters: -1. public key of peer (hex) -2. topic (4 bytes in hex) -3. message (hex) - -returns: -none -``` - -### SEND MESSAGE USING SYMMETRIC ENCRYPTION - -#### pss_setSymmetricKey - -Register a symmetric key shared with a peer. This is done once for every topic that will be used with the peer. Address can be anything from 0 to 32 bytes inclusive of the peer's swarm overlay address. - -If the fourth parameter is false, the key will *not* be added to the list of symmetric keys used for decryption attempts. - -``` -parameters: -1. symmetric key (hex) -2. topic (4 bytes in hex) -3. address of peer (hex) -4. use for decryption (bool) - -returns: -1. symmetric key id (string) -``` - -#### pss_sendSym - -Encrypts the message using the provided symmetric key, wraps it in an envelope containing the topic, and sends it to the network. - -``` -parameters: -1. symmetric key id (string) -2. topic (4 bytes in hex) -3. message (hex) - -returns: -none -``` - -### QUERY PEER KEYS - -#### pss_GetSymmetricAddressHint - -Return the swarm overlay address associated with the peer registered with the given symmetric key and topic combination. - -``` -parameters: -1. topic (4 bytes in hex) -2. symmetric key id (string) - -returns: -1. peer address (hex) -``` - -#### pss_GetAsymmetricAddressHint - -Return the swarm overlay address associated with the peer registered with the given symmetric key and topic combination. - -``` -parameters: -1. topic (4 bytes in hex) -2. public key in hex form (string) - -returns: -1. peer address (hex) -``` - -### HANDSHAKES - -Convenience implementation of Diffie-Hellman handshakes using ephemeral symmetric keys. Peers keep separate sets of keys for incoming and outgoing communications. - -*This functionality is an optional feature in `pss`. It is compiled in by default, but can be omitted by providing the `nopsshandshake` build tag.* - -#### pss_addHandshake - -Activate handshake functionality on the specified topic. - -``` -parameters: -1. topic (4 bytes in hex) - -returns: -none -``` - -#### pss_removeHandshake - -Remove handshake functionality on the specified topic. - -``` -parameters: -1. topic (4 bytes in hex) - -returns: -none -``` - -#### pss_handshake - -Instantiate handshake with peer, refreshing symmetric encryption keys. - -If parameter 3 is false, the returned array will be empty. - -``` -parameters: -1. public key of peer in hex format (string) -2. topic (4 bytes in hex) -3. block calls until keys are received (bool) -4. flush existing incoming keys (bool) - -returns: -1. list of symmetric keys (string[]) -``` - -#### pss_getHandshakeKeys - -Get valid symmetric encryption keys for a specified peer and topic. - -parameters: -1. public key of peer in hex format (string) -2. topic (4 bytes in hex) -3. include keys for incoming messages (bool) -4. include keys for outgoing messages (bool) - -returns: -1. list of symmetric keys (string[]) - -#### pss_getHandshakeKeyCapacity - -Get amount of remaining messages the specified key is valid for. - -``` -parameters: -1. symmetric key id (string) - -returns: -1. number of messages (uint16) -``` - -#### pss_getHandshakePublicKey - -Get the peer's public key associated with the specified symmetric key. - -``` -parameters: -1. symmetric key id (string) - -returns: -1. Associated public key in hex format (string) -``` - -#### pss_releaseHandshakeKey - -Invalidate the specified key. - -Normally, the key will be kept for a grace period to allow for decryption of delayed messages. If instant removal is set, this grace period is omitted, and the key removed instantaneously. - -``` -parameters: -1. public key of peer in hex format (string) -2. topic (4 bytes in hex) -3. symmetric key id to release (string) -4. remove keys instantly (bool) - -returns: -1. whether key was successfully removed (bool) -``` diff --git a/swarm/pss/api.go b/swarm/pss/api.go deleted file mode 100644 index ed4c49bdccc8..000000000000 --- a/swarm/pss/api.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2018 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 pss - -import ( - "context" - "errors" - "fmt" - - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/swarm/log" -) - -// Wrapper for receiving pss messages when using the pss API -// providing access to sender of message -type APIMsg struct { - Msg hexutil.Bytes - Asymmetric bool - Key string -} - -// Additional public methods accessible through API for pss -type API struct { - *Pss -} - -func NewAPI(ps *Pss) *API { - return &API{Pss: ps} -} - -// Creates a new subscription for the caller. Enables external handling of incoming messages. -// -// A new handler is registered in pss for the supplied topic -// -// All incoming messages to the node matching this topic will be encapsulated in the APIMsg -// struct and sent to the subscriber -func (pssapi *API) Receive(ctx context.Context, topic Topic, raw bool, prox bool) (*rpc.Subscription, error) { - notifier, supported := rpc.NotifierFromContext(ctx) - if !supported { - return nil, fmt.Errorf("Subscribe not supported") - } - - psssub := notifier.CreateSubscription() - - hndlr := NewHandler(func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error { - apimsg := &APIMsg{ - Msg: hexutil.Bytes(msg), - Asymmetric: asymmetric, - Key: keyid, - } - if err := notifier.Notify(psssub.ID, apimsg); err != nil { - log.Warn(fmt.Sprintf("notification on pss sub topic rpc (sub %v) msg %v failed!", psssub.ID, msg)) - } - return nil - }) - if raw { - hndlr.caps.raw = true - } - if prox { - hndlr.caps.prox = true - } - - deregf := pssapi.Register(&topic, hndlr) - go func() { - defer deregf() - select { - case err := <-psssub.Err(): - log.Warn(fmt.Sprintf("caught subscription error in pss sub topic %x: %v", topic, err)) - case <-notifier.Closed(): - log.Warn(fmt.Sprintf("rpc sub notifier closed")) - } - }() - - return psssub, nil -} - -func (pssapi *API) GetAddress(topic Topic, asymmetric bool, key string) (PssAddress, error) { - var addr PssAddress - if asymmetric { - peer, ok := pssapi.Pss.pubKeyPool[key][topic] - if !ok { - return nil, fmt.Errorf("pubkey/topic pair %x/%x doesn't exist", key, topic) - } - addr = peer.address - } else { - peer, ok := pssapi.Pss.symKeyPool[key][topic] - if !ok { - return nil, fmt.Errorf("symkey/topic pair %x/%x doesn't exist", key, topic) - } - addr = peer.address - - } - return addr, nil -} - -// Retrieves the node's base address in hex form -func (pssapi *API) BaseAddr() (PssAddress, error) { - return PssAddress(pssapi.Pss.BaseAddr()), nil -} - -// Retrieves the node's public key in hex form -func (pssapi *API) GetPublicKey() (keybytes hexutil.Bytes) { - key := pssapi.Pss.PublicKey() - keybytes = crypto.FromECDSAPub(key) - return keybytes -} - -// Set Public key to associate with a particular Pss peer -func (pssapi *API) SetPeerPublicKey(pubkey hexutil.Bytes, topic Topic, addr PssAddress) error { - pk, err := crypto.UnmarshalPubkey(pubkey) - if err != nil { - return fmt.Errorf("Cannot unmarshal pubkey: %x", pubkey) - } - err = pssapi.Pss.SetPeerPublicKey(pk, topic, addr) - if err != nil { - return fmt.Errorf("Invalid key: %x", pk) - } - return nil -} - -func (pssapi *API) GetSymmetricKey(symkeyid string) (hexutil.Bytes, error) { - symkey, err := pssapi.Pss.GetSymmetricKey(symkeyid) - return hexutil.Bytes(symkey), err -} - -func (pssapi *API) GetSymmetricAddressHint(topic Topic, symkeyid string) (PssAddress, error) { - return pssapi.Pss.symKeyPool[symkeyid][topic].address, nil -} - -func (pssapi *API) GetAsymmetricAddressHint(topic Topic, pubkeyid string) (PssAddress, error) { - return pssapi.Pss.pubKeyPool[pubkeyid][topic].address, nil -} - -func (pssapi *API) StringToTopic(topicstring string) (Topic, error) { - topicbytes := BytesToTopic([]byte(topicstring)) - if topicbytes == rawTopic { - return rawTopic, errors.New("Topic string hashes to 0x00000000 and cannot be used") - } - return topicbytes, nil -} - -func (pssapi *API) SendAsym(pubkeyhex string, topic Topic, msg hexutil.Bytes) error { - if err := validateMsg(msg); err != nil { - return err - } - return pssapi.Pss.SendAsym(pubkeyhex, topic, msg[:]) -} - -func (pssapi *API) SendSym(symkeyhex string, topic Topic, msg hexutil.Bytes) error { - if err := validateMsg(msg); err != nil { - return err - } - return pssapi.Pss.SendSym(symkeyhex, topic, msg[:]) -} - -func (pssapi *API) SendRaw(addr hexutil.Bytes, topic Topic, msg hexutil.Bytes) error { - if err := validateMsg(msg); err != nil { - return err - } - return pssapi.Pss.SendRaw(PssAddress(addr), topic, msg[:]) -} - -func (pssapi *API) GetPeerTopics(pubkeyhex string) ([]Topic, error) { - topics, _, err := pssapi.Pss.GetPublickeyPeers(pubkeyhex) - return topics, err - -} - -func (pssapi *API) GetPeerAddress(pubkeyhex string, topic Topic) (PssAddress, error) { - return pssapi.Pss.getPeerAddress(pubkeyhex, topic) -} - -func validateMsg(msg []byte) error { - if len(msg) == 0 { - return errors.New("invalid message length") - } - return nil -} diff --git a/swarm/pss/client/client.go b/swarm/pss/client/client.go deleted file mode 100644 index e1a023a8b00f..000000000000 --- a/swarm/pss/client/client.go +++ /dev/null @@ -1,352 +0,0 @@ -// Copyright 2018 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 . - -// +build !noclient,!noprotocol - -package client - -import ( - "context" - "errors" - "fmt" - "sync" - "time" - - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/protocols" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/pss" -) - -const ( - handshakeRetryTimeout = 1000 - handshakeRetryCount = 3 -) - -// The pss client provides devp2p emulation over pss RPC API, -// giving access to pss methods from a different process -type Client struct { - BaseAddrHex string - - // peers - peerPool map[pss.Topic]map[string]*pssRPCRW - protos map[pss.Topic]*p2p.Protocol - - // rpc connections - rpc *rpc.Client - subs []*rpc.ClientSubscription - - // channels - topicsC chan []byte - quitC chan struct{} - - poolMu sync.Mutex -} - -// implements p2p.MsgReadWriter -type pssRPCRW struct { - *Client - topic string - msgC chan []byte - addr pss.PssAddress - pubKeyId string - lastSeen time.Time - closed bool -} - -func (c *Client) newpssRPCRW(pubkeyid string, addr pss.PssAddress, topicobj pss.Topic) (*pssRPCRW, error) { - topic := topicobj.String() - err := c.rpc.Call(nil, "pss_setPeerPublicKey", pubkeyid, topic, hexutil.Encode(addr[:])) - if err != nil { - return nil, fmt.Errorf("setpeer %s %s: %v", topic, pubkeyid, err) - } - return &pssRPCRW{ - Client: c, - topic: topic, - msgC: make(chan []byte), - addr: addr, - pubKeyId: pubkeyid, - }, nil -} - -func (rw *pssRPCRW) ReadMsg() (p2p.Msg, error) { - msg := <-rw.msgC - log.Trace("pssrpcrw read", "msg", msg) - pmsg, err := pss.ToP2pMsg(msg) - if err != nil { - return p2p.Msg{}, err - } - - return pmsg, nil -} - -// If only one message slot left -// then new is requested through handshake -// if buffer is empty, handshake request blocks until return -// after which pointer is changed to first new key in buffer -// will fail if: -// - any api calls fail -// - handshake retries are exhausted without reply, -// - send fails -func (rw *pssRPCRW) WriteMsg(msg p2p.Msg) error { - log.Trace("got writemsg pssclient", "msg", msg) - if rw.closed { - return fmt.Errorf("connection closed") - } - rlpdata := make([]byte, msg.Size) - msg.Payload.Read(rlpdata) - pmsg, err := rlp.EncodeToBytes(pss.ProtocolMsg{ - Code: msg.Code, - Size: msg.Size, - Payload: rlpdata, - }) - if err != nil { - return err - } - - // Get the keys we have - var symkeyids []string - err = rw.Client.rpc.Call(&symkeyids, "pss_getHandshakeKeys", rw.pubKeyId, rw.topic, false, true) - if err != nil { - return err - } - - // Check the capacity of the first key - var symkeycap uint16 - if len(symkeyids) > 0 { - err = rw.Client.rpc.Call(&symkeycap, "pss_getHandshakeKeyCapacity", symkeyids[0]) - if err != nil { - return err - } - } - - err = rw.Client.rpc.Call(nil, "pss_sendSym", symkeyids[0], rw.topic, hexutil.Encode(pmsg)) - if err != nil { - return err - } - - // If this is the last message it is valid for, initiate new handshake - if symkeycap == 1 { - var retries int - var sync bool - // if it's the only remaining key, make sure we don't continue until we have new ones for further writes - if len(symkeyids) == 1 { - sync = true - } - // initiate handshake - _, err := rw.handshake(retries, sync, false) - if err != nil { - log.Warn("failing", "err", err) - return err - } - } - return nil -} - -// retry and synchronicity wrapper for handshake api call -// returns first new symkeyid upon successful execution -func (rw *pssRPCRW) handshake(retries int, sync bool, flush bool) (string, error) { - - var symkeyids []string - var i int - // request new keys - // if the key buffer was depleted, make this as a blocking call and try several times before giving up - for i = 0; i < 1+retries; i++ { - log.Debug("handshake attempt pssrpcrw", "pubkeyid", rw.pubKeyId, "topic", rw.topic, "sync", sync) - err := rw.Client.rpc.Call(&symkeyids, "pss_handshake", rw.pubKeyId, rw.topic, sync, flush) - if err == nil { - var keyid string - if sync { - keyid = symkeyids[0] - } - return keyid, nil - } - if i-1+retries > 1 { - time.Sleep(time.Millisecond * handshakeRetryTimeout) - } - } - - return "", fmt.Errorf("handshake failed after %d attempts", i) -} - -// Custom constructor -// -// Provides direct access to the rpc object -func NewClient(rpcurl string) (*Client, error) { - rpcclient, err := rpc.Dial(rpcurl) - if err != nil { - return nil, err - } - - client, err := NewClientWithRPC(rpcclient) - if err != nil { - return nil, err - } - return client, nil -} - -// Main constructor -// -// The 'rpcclient' parameter allows passing a in-memory rpc client to act as the remote websocket RPC. -func NewClientWithRPC(rpcclient *rpc.Client) (*Client, error) { - client := newClient() - client.rpc = rpcclient - err := client.rpc.Call(&client.BaseAddrHex, "pss_baseAddr") - if err != nil { - return nil, fmt.Errorf("cannot get pss node baseaddress: %v", err) - } - return client, nil -} - -func newClient() (client *Client) { - client = &Client{ - quitC: make(chan struct{}), - peerPool: make(map[pss.Topic]map[string]*pssRPCRW), - protos: make(map[pss.Topic]*p2p.Protocol), - } - return -} - -// Mounts a new devp2p protcool on the pss connection -// -// the protocol is aliased as a "pss topic" -// uses normal devp2p send and incoming message handler routines from the p2p/protocols package -// -// when an incoming message is received from a peer that is not yet known to the client, -// this peer object is instantiated, and the protocol is run on it. -func (c *Client) RunProtocol(ctx context.Context, proto *p2p.Protocol) error { - topicobj := pss.BytesToTopic([]byte(fmt.Sprintf("%s:%d", proto.Name, proto.Version))) - topichex := topicobj.String() - msgC := make(chan pss.APIMsg) - c.peerPool[topicobj] = make(map[string]*pssRPCRW) - sub, err := c.rpc.Subscribe(ctx, "pss", msgC, "receive", topichex, false, false) - if err != nil { - return fmt.Errorf("pss event subscription failed: %v", err) - } - c.subs = append(c.subs, sub) - err = c.rpc.Call(nil, "pss_addHandshake", topichex) - if err != nil { - return fmt.Errorf("pss handshake activation failed: %v", err) - } - - // dispatch incoming messages - go func() { - for { - select { - case msg := <-msgC: - // we only allow sym msgs here - if msg.Asymmetric { - continue - } - // we get passed the symkeyid - // need the symkey itself to resolve to peer's pubkey - var pubkeyid string - err = c.rpc.Call(&pubkeyid, "pss_getHandshakePublicKey", msg.Key) - if err != nil || pubkeyid == "" { - log.Trace("proto err or no pubkey", "err", err, "symkeyid", msg.Key) - continue - } - // if we don't have the peer on this protocol already, create it - // this is more or less the same as AddPssPeer, less the handshake initiation - if c.peerPool[topicobj][pubkeyid] == nil { - var addrhex string - err := c.rpc.Call(&addrhex, "pss_getAddress", topichex, false, msg.Key) - if err != nil { - log.Trace(err.Error()) - continue - } - addrbytes, err := hexutil.Decode(addrhex) - if err != nil { - log.Trace(err.Error()) - break - } - addr := pss.PssAddress(addrbytes) - rw, err := c.newpssRPCRW(pubkeyid, addr, topicobj) - if err != nil { - break - } - c.peerPool[topicobj][pubkeyid] = rw - p := p2p.NewPeer(enode.ID{}, fmt.Sprintf("%v", addr), []p2p.Cap{}) - go proto.Run(p, c.peerPool[topicobj][pubkeyid]) - } - go func() { - c.peerPool[topicobj][pubkeyid].msgC <- msg.Msg - }() - case <-c.quitC: - return - } - } - }() - - c.protos[topicobj] = proto - return nil -} - -// Always call this to ensure that we exit cleanly -func (c *Client) Close() error { - for _, s := range c.subs { - s.Unsubscribe() - } - return nil -} - -// Add a pss peer (public key) and run the protocol on it -// -// client.RunProtocol with matching topic must have been -// run prior to adding the peer, or this method will -// return an error. -// -// The key must exist in the key store of the pss node -// before the peer is added. The method will return an error -// if it is not. -func (c *Client) AddPssPeer(pubkeyid string, addr []byte, spec *protocols.Spec) error { - topic := pss.ProtocolTopic(spec) - if c.peerPool[topic] == nil { - return errors.New("addpeer on unset topic") - } - if c.peerPool[topic][pubkeyid] == nil { - rw, err := c.newpssRPCRW(pubkeyid, addr, topic) - if err != nil { - return err - } - _, err = rw.handshake(handshakeRetryCount, true, true) - if err != nil { - return err - } - c.poolMu.Lock() - c.peerPool[topic][pubkeyid] = rw - c.poolMu.Unlock() - p := p2p.NewPeer(enode.ID{}, fmt.Sprintf("%v", addr), []p2p.Cap{}) - go c.protos[topic].Run(p, c.peerPool[topic][pubkeyid]) - } - return nil -} - -// Remove a pss peer -// -// TODO: underlying cleanup -func (c *Client) RemovePssPeer(pubkeyid string, spec *protocols.Spec) { - log.Debug("closing pss client peer", "pubkey", pubkeyid, "protoname", spec.Name, "protoversion", spec.Version) - c.poolMu.Lock() - defer c.poolMu.Unlock() - topic := pss.ProtocolTopic(spec) - c.peerPool[topic][pubkeyid].closed = true - delete(c.peerPool[topic], pubkeyid) -} diff --git a/swarm/pss/client/client_test.go b/swarm/pss/client/client_test.go deleted file mode 100644 index 13346ae26b4c..000000000000 --- a/swarm/pss/client/client_test.go +++ /dev/null @@ -1,303 +0,0 @@ -// Copyright 2018 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 client - -import ( - "bytes" - "context" - "flag" - "fmt" - "math/rand" - "os" - "sync" - "testing" - "time" - - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/pss" - "github.com/nebulaai/nbai-node/swarm/state" - whisper "github.com/nebulaai/nbai-node/whisper/whisperv5" -) - -type protoCtrl struct { - C chan bool - protocol *pss.Protocol - run func(*p2p.Peer, p2p.MsgReadWriter) error -} - -var ( - debugdebugflag = flag.Bool("vv", false, "veryverbose") - debugflag = flag.Bool("v", false, "verbose") - w *whisper.Whisper - wapi *whisper.PublicWhisperAPI - // custom logging - psslogmain log.Logger - pssprotocols map[string]*protoCtrl - sendLimit = uint16(256) -) - -var services = newServices() - -func init() { - flag.Parse() - rand.Seed(time.Now().Unix()) - - adapters.RegisterServices(services) - - loglevel := log.LvlInfo - if *debugflag { - loglevel = log.LvlDebug - } else if *debugdebugflag { - loglevel = log.LvlTrace - } - - psslogmain = log.New("psslog", "*") - hs := log.StreamHandler(os.Stderr, log.TerminalFormat(true)) - hf := log.LvlFilterHandler(loglevel, hs) - h := log.CallerFileHandler(hf) - log.Root().SetHandler(h) - - w = whisper.New(&whisper.DefaultConfig) - wapi = whisper.NewPublicWhisperAPI(w) - - pssprotocols = make(map[string]*protoCtrl) -} - -// ping pong exchange across one expired symkey -func TestClientHandshake(t *testing.T) { - sendLimit = 3 - - clients, err := setupNetwork(2) - if err != nil { - t.Fatal(err) - } - - lpsc, err := NewClientWithRPC(clients[0]) - if err != nil { - t.Fatal(err) - } - rpsc, err := NewClientWithRPC(clients[1]) - if err != nil { - t.Fatal(err) - } - lpssping := &pss.Ping{ - OutC: make(chan bool), - InC: make(chan bool), - Pong: false, - } - rpssping := &pss.Ping{ - OutC: make(chan bool), - InC: make(chan bool), - Pong: false, - } - lproto := pss.NewPingProtocol(lpssping) - rproto := pss.NewPingProtocol(rpssping) - - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) - defer cancel() - err = lpsc.RunProtocol(ctx, lproto) - if err != nil { - t.Fatal(err) - } - err = rpsc.RunProtocol(ctx, rproto) - if err != nil { - t.Fatal(err) - } - topic := pss.PingTopic.String() - - var loaddr string - err = clients[0].Call(&loaddr, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 1 baseaddr fail: %v", err) - } - var roaddr string - err = clients[1].Call(&roaddr, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 2 baseaddr fail: %v", err) - } - - var lpubkey string - err = clients[0].Call(&lpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 1 pubkey fail: %v", err) - } - var rpubkey string - err = clients[1].Call(&rpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 2 pubkey fail: %v", err) - } - - err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddr) - if err != nil { - t.Fatal(err) - } - err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddr) - if err != nil { - t.Fatal(err) - } - - time.Sleep(time.Second) - - roaddrbytes, err := hexutil.Decode(roaddr) - if err != nil { - t.Fatal(err) - } - err = lpsc.AddPssPeer(rpubkey, roaddrbytes, pss.PingProtocol) - if err != nil { - t.Fatal(err) - } - - time.Sleep(time.Second) - - for i := uint16(0); i <= sendLimit; i++ { - lpssping.OutC <- false - got := <-rpssping.InC - log.Warn("ok", "idx", i, "got", got) - time.Sleep(time.Second) - } - - rw := lpsc.peerPool[pss.PingTopic][rpubkey] - lpsc.RemovePssPeer(rpubkey, pss.PingProtocol) - if err := rw.WriteMsg(p2p.Msg{ - Size: 3, - Payload: bytes.NewReader([]byte("foo")), - }); err == nil { - t.Fatalf("expected error on write") - } -} - -func setupNetwork(numnodes int) (clients []*rpc.Client, err error) { - nodes := make([]*simulations.Node, numnodes) - clients = make([]*rpc.Client, numnodes) - if numnodes < 2 { - return nil, fmt.Errorf("Minimum two nodes in network") - } - adapter := adapters.NewSimAdapter(services) - net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ - ID: "0", - DefaultService: "bzz", - }) - for i := 0; i < numnodes; i++ { - nodeconf := adapters.RandomNodeConfig() - nodeconf.Services = []string{"bzz", "pss"} - nodes[i], err = net.NewNodeWithConfig(nodeconf) - if err != nil { - return nil, fmt.Errorf("error creating node 1: %v", err) - } - err = net.Start(nodes[i].ID()) - if err != nil { - return nil, fmt.Errorf("error starting node 1: %v", err) - } - if i > 0 { - err = net.Connect(nodes[i].ID(), nodes[i-1].ID()) - if err != nil { - return nil, fmt.Errorf("error connecting nodes: %v", err) - } - } - clients[i], err = nodes[i].Client() - if err != nil { - return nil, fmt.Errorf("create node 1 rpc client fail: %v", err) - } - } - if numnodes > 2 { - err = net.Connect(nodes[0].ID(), nodes[len(nodes)-1].ID()) - if err != nil { - return nil, fmt.Errorf("error connecting first and last nodes") - } - } - return clients, nil -} - -func newServices() adapters.Services { - stateStore := state.NewInmemoryStore() - kademlias := make(map[enode.ID]*network.Kademlia) - kademlia := func(id enode.ID) *network.Kademlia { - if k, ok := kademlias[id]; ok { - return k - } - params := network.NewKadParams() - params.NeighbourhoodSize = 2 - params.MaxBinSize = 3 - params.MinBinSize = 1 - params.MaxRetries = 1000 - params.RetryExponent = 2 - params.RetryInterval = 1000000 - kademlias[id] = network.NewKademlia(id[:], params) - return kademlias[id] - } - return adapters.Services{ - "pss": func(ctx *adapters.ServiceContext) (node.Service, error) { - ctxlocal, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctxlocal) - if err != nil { - return nil, err - } - privkey, err := w.GetPrivateKey(keys) - if err != nil { - return nil, err - } - psparams := pss.NewPssParams().WithPrivateKey(privkey) - pskad := kademlia(ctx.Config.ID) - ps, err := pss.NewPss(pskad, psparams) - if err != nil { - return nil, err - } - pshparams := pss.NewHandshakeParams() - pshparams.SymKeySendLimit = sendLimit - err = pss.SetHandshakeController(ps, pshparams) - if err != nil { - return nil, fmt.Errorf("handshake controller fail: %v", err) - } - return ps, nil - }, - "bzz": func(ctx *adapters.ServiceContext) (node.Service, error) { - addr := network.NewAddr(ctx.Config.Node()) - hp := network.NewHiveParams() - hp.Discovery = false - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - return network.NewBzz(config, kademlia(ctx.Config.ID), stateStore, nil, nil), nil - }, - } -} - -// copied from swarm/network/protocol_test_go -type testStore struct { - sync.Mutex - - values map[string][]byte -} - -func (t *testStore) Load(key string) ([]byte, error) { - return nil, nil -} - -func (t *testStore) Save(key string, v []byte) error { - return nil -} diff --git a/swarm/pss/client/doc.go b/swarm/pss/client/doc.go deleted file mode 100644 index 080af45a9a22..000000000000 --- a/swarm/pss/client/doc.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2018 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 abstraction for implementing pss functionality -// -// the pss client library aims to simplify usage of the p2p.protocols package over pss -// -// IO is performed using the ordinary p2p.MsgReadWriter interface, which transparently communicates with a pss node via RPC using websockets as transport layer, using methods in the PssAPI class in the swarm/pss package -// -// -// Minimal-ish usage example (requires a running pss node with websocket RPC): -// -// -// import ( -// "context" -// "fmt" -// "os" -// pss "github.com/ethereum/go-ethereum/swarm/pss/client" -// "github.com/ethereum/go-ethereum/p2p/protocols" -// "github.com/ethereum/go-ethereum/p2p" -// "github.com/ethereum/go-ethereum/swarm/pot" -// "github.com/ethereum/go-ethereum/swarm/log" -// ) -// -// type FooMsg struct { -// Bar int -// } -// -// -// func fooHandler (msg interface{}) error { -// foomsg, ok := msg.(*FooMsg) -// if ok { -// log.Debug("Yay, just got a message", "msg", foomsg) -// } -// return errors.New(fmt.Sprintf("Unknown message")) -// } -// -// spec := &protocols.Spec{ -// Name: "foo", -// Version: 1, -// MaxMsgSize: 1024, -// Messages: []interface{}{ -// FooMsg{}, -// }, -// } -// -// proto := &p2p.Protocol{ -// Name: spec.Name, -// Version: spec.Version, -// Length: uint64(len(spec.Messages)), -// Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error { -// pp := protocols.NewPeer(p, rw, spec) -// return pp.Run(fooHandler) -// }, -// } -// -// func implementation() { -// cfg := pss.NewClientConfig() -// psc := pss.NewClient(context.Background(), nil, cfg) -// err := psc.Start() -// if err != nil { -// log.Crit("can't start pss client") -// os.Exit(1) -// } -// -// log.Debug("connected to pss node", "bzz addr", psc.BaseAddr) -// -// err = psc.RunProtocol(proto) -// if err != nil { -// log.Crit("can't start protocol on pss websocket") -// os.Exit(1) -// } -// -// addr := pot.RandomAddress() // should be a real address, of course -// psc.AddPssPeer(addr, spec) -// -// // use the protocol for something -// -// psc.Stop() -// } -// -// BUG(test): TestIncoming test times out due to deadlock issues in the swarm hive -package client diff --git a/swarm/pss/doc.go b/swarm/pss/doc.go deleted file mode 100644 index 462c82aaad3d..000000000000 --- a/swarm/pss/doc.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2018 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 . - -// Pss provides devp2p functionality for swarm nodes without the need for a direct tcp connection between them. -// -// Messages are encapsulated in a devp2p message structure `PssMsg`. These capsules are forwarded from node to node using ordinary tcp devp2p until it reaches its destination: The node or nodes who can successfully decrypt the message. -// -// Routing of messages is done using swarm's own kademlia routing. Optionally routing can be turned off, forcing the message to be sent to all peers, similar to the behavior of the whisper protocol. -// -// Pss is intended for messages of limited size, typically a couple of Kbytes at most. The messages themselves can be anything at all; complex data structures or non-descript byte sequences. -// -// Documentation can be found in the README file. -// -// For the current state and roadmap of pss development please see https://github.com/ethersphere/swarm/wiki/swarm-dev-progress. -// -// Please report issues on https://github.com/ethersphere/go-ethereum -// -// Feel free to ask questions in https://gitter.im/ethersphere/pss -// -// TOPICS -// -// An encrypted envelope of a pss messages always contains a Topic. This is pss' way of determining what action to take on the message. The topic is only visible for the node(s) who can decrypt the message. -// -// This "topic" is not like the subject of an email message, but a hash-like arbitrary 4 byte value. A valid topic can be generated using the `pss_*ToTopic` API methods. -// -// IDENTITY IN PSS -// -// Pss aims to achieve perfect darkness. That means that the minimum requirement for two nodes to communicate using pss is a shared secret. This secret can be an arbitrary byte slice, or a ECDSA keypair. -// -// Peer keys can manually be added to the pss node through its API calls `pss_setPeerPublicKey` and `pss_setSymmetricKey`. Keys are always coupled with a topic, and the keys will only be valid for these topics. -// -// CONNECTIONS -// -// A "connection" in pss is a purely virtual construct. There is no mechanisms in place to ensure that the remote peer actually is there. In fact, "adding" a peer involves merely the node's opinion that the peer is there. It may issue messages to that remote peer to a directly connected peer, which in turn passes it on. But if it is not present on the network - or if there is no route to it - the message will never reach its destination through mere forwarding. -// -// When implementing the devp2p protocol stack, the "adding" of a remote peer is a prerequisite for the side actually initiating the protocol communication. Adding a peer in effect "runs" the protocol on that peer, and adds an internal mapping between a topic and that peer. It also enables sending and receiving messages using the main io-construct in devp2p - the p2p.MsgReadWriter. -// -// Under the hood, pss implements its own MsgReadWriter, which bridges MsgReadWriter.WriteMsg with Pss.SendRaw, and deftly adds an InjectMsg method which pipes incoming messages to appear on the MsgReadWriter.ReadMsg channel. -// -// An incoming connection is nothing more than an actual PssMsg appearing with a certain Topic. If a Handler har been registered to that Topic, the message will be passed to it. This constitutes a "new" connection if: -// -// - The pss node never called AddPeer with this combination of remote peer address and topic, and -// -// - The pss node never received a PssMsg from this remote peer with this specific Topic before. -// -// If it is a "new" connection, the protocol will be "run" on the remote peer, in the same manner as if it was pre-emptively added. -// -package pss diff --git a/swarm/pss/forwarding_test.go b/swarm/pss/forwarding_test.go deleted file mode 100644 index 084688439a69..000000000000 --- a/swarm/pss/forwarding_test.go +++ /dev/null @@ -1,356 +0,0 @@ -package pss - -import ( - "fmt" - "math/rand" - "testing" - "time" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/p2p" - "github.com/ethereum/go-ethereum/p2p/enode" - "github.com/ethereum/go-ethereum/p2p/protocols" - "github.com/ethereum/go-ethereum/swarm/network" - "github.com/ethereum/go-ethereum/swarm/pot" - whisper "github.com/ethereum/go-ethereum/whisper/whisperv5" -) - -type testCase struct { - name string - recipient []byte - peers []pot.Address - expected []int - exclusive bool - nFails int - success bool - errors string -} - -var testCases []testCase - -// the purpose of this test is to see that pss.forward() function correctly -// selects the peers for message forwarding, depending on the message address -// and kademlia constellation. -func TestForwardBasic(t *testing.T) { - baseAddrBytes := make([]byte, 32) - for i := 0; i < len(baseAddrBytes); i++ { - baseAddrBytes[i] = 0xFF - } - var c testCase - base := pot.NewAddressFromBytes(baseAddrBytes) - var peerAddresses []pot.Address - const depth = 10 - for i := 0; i <= depth; i++ { - // add two peers for each proximity order - a := pot.RandomAddressAt(base, i) - peerAddresses = append(peerAddresses, a) - a = pot.RandomAddressAt(base, i) - peerAddresses = append(peerAddresses, a) - } - - // skip one level, add one peer at one level deeper. - // as a result, we will have an edge case of three peers in nearest neighbours' bin. - peerAddresses = append(peerAddresses, pot.RandomAddressAt(base, depth+2)) - - kad := network.NewKademlia(base[:], network.NewKadParams()) - ps := createPss(t, kad) - addPeers(kad, peerAddresses) - - const firstNearest = depth * 2 // shallowest peer in the nearest neighbours' bin - nearestNeighbours := []int{firstNearest, firstNearest + 1, firstNearest + 2} - var all []int // indices of all the peers - for i := 0; i < len(peerAddresses); i++ { - all = append(all, i) - } - - for i := 0; i < len(peerAddresses); i++ { - // send msg directly to the known peers (recipient address == peer address) - c = testCase{ - name: fmt.Sprintf("Send direct to known, id: [%d]", i), - recipient: peerAddresses[i][:], - peers: peerAddresses, - expected: []int{i}, - exclusive: false, - } - testCases = append(testCases, c) - } - - for i := 0; i < firstNearest; i++ { - // send random messages with proximity orders, corresponding to PO of each bin, - // with one peer being closer to the recipient address - a := pot.RandomAddressAt(peerAddresses[i], 64) - c = testCase{ - name: fmt.Sprintf("Send random to each PO, id: [%d]", i), - recipient: a[:], - peers: peerAddresses, - expected: []int{i}, - exclusive: false, - } - testCases = append(testCases, c) - } - - for i := 0; i < firstNearest; i++ { - // send random messages with proximity orders, corresponding to PO of each bin, - // with random proximity relative to the recipient address - po := i / 2 - a := pot.RandomAddressAt(base, po) - c = testCase{ - name: fmt.Sprintf("Send direct to known, id: [%d]", i), - recipient: a[:], - peers: peerAddresses, - expected: []int{po * 2, po*2 + 1}, - exclusive: true, - } - testCases = append(testCases, c) - } - - for i := firstNearest; i < len(peerAddresses); i++ { - // recipient address falls into the nearest neighbours' bin - a := pot.RandomAddressAt(base, i) - c = testCase{ - name: fmt.Sprintf("recipient address falls into the nearest neighbours' bin, id: [%d]", i), - recipient: a[:], - peers: peerAddresses, - expected: nearestNeighbours, - exclusive: false, - } - testCases = append(testCases, c) - } - - // send msg with proximity order much deeper than the deepest nearest neighbour - a2 := pot.RandomAddressAt(base, 77) - c = testCase{ - name: "proximity order much deeper than the deepest nearest neighbour", - recipient: a2[:], - peers: peerAddresses, - expected: nearestNeighbours, - exclusive: false, - } - testCases = append(testCases, c) - - // test with partial addresses - const part = 12 - - for i := 0; i < firstNearest; i++ { - // send messages with partial address falling into different proximity orders - po := i / 2 - if i%8 != 0 { - c = testCase{ - name: fmt.Sprintf("partial address falling into different proximity orders, id: [%d]", i), - recipient: peerAddresses[i][:i], - peers: peerAddresses, - expected: []int{po * 2, po*2 + 1}, - exclusive: true, - } - testCases = append(testCases, c) - } - c = testCase{ - name: fmt.Sprintf("extended partial address falling into different proximity orders, id: [%d]", i), - recipient: peerAddresses[i][:part], - peers: peerAddresses, - expected: []int{po * 2, po*2 + 1}, - exclusive: true, - } - testCases = append(testCases, c) - } - - for i := firstNearest; i < len(peerAddresses); i++ { - // partial address falls into the nearest neighbours' bin - c = testCase{ - name: fmt.Sprintf("partial address falls into the nearest neighbours' bin, id: [%d]", i), - recipient: peerAddresses[i][:part], - peers: peerAddresses, - expected: nearestNeighbours, - exclusive: false, - } - testCases = append(testCases, c) - } - - // partial address with proximity order deeper than any of the nearest neighbour - a3 := pot.RandomAddressAt(base, part) - c = testCase{ - name: "partial address with proximity order deeper than any of the nearest neighbour", - recipient: a3[:part], - peers: peerAddresses, - expected: nearestNeighbours, - exclusive: false, - } - testCases = append(testCases, c) - - // special cases where partial address matches a large group of peers - - // zero bytes of address is given, msg should be delivered to all the peers - c = testCase{ - name: "zero bytes of address is given", - recipient: []byte{}, - peers: peerAddresses, - expected: all, - exclusive: false, - } - testCases = append(testCases, c) - - // luminous radius of 8 bits, proximity order 8 - indexAtPo8 := 16 - c = testCase{ - name: "luminous radius of 8 bits", - recipient: []byte{0xFF}, - peers: peerAddresses, - expected: all[indexAtPo8:], - exclusive: false, - } - testCases = append(testCases, c) - - // luminous radius of 256 bits, proximity order 8 - a4 := pot.Address{} - a4[0] = 0xFF - c = testCase{ - name: "luminous radius of 256 bits", - recipient: a4[:], - peers: peerAddresses, - expected: []int{indexAtPo8, indexAtPo8 + 1}, - exclusive: true, - } - testCases = append(testCases, c) - - // check correct behaviour in case send fails - for i := 2; i < firstNearest-3; i += 2 { - po := i / 2 - // send random messages with proximity orders, corresponding to PO of each bin, - // with different numbers of failed attempts. - // msg should be received by only one of the deeper peers. - a := pot.RandomAddressAt(base, po) - c = testCase{ - name: fmt.Sprintf("Send direct to known, id: [%d]", i), - recipient: a[:], - peers: peerAddresses, - expected: all[i+1:], - exclusive: true, - nFails: rand.Int()%3 + 2, - } - testCases = append(testCases, c) - } - - for _, c := range testCases { - testForwardMsg(t, ps, &c) - } -} - -// this function tests the forwarding of a single message. the recipient address is passed as param, -// along with addresses of all peers, and indices of those peers which are expected to receive the message. -func testForwardMsg(t *testing.T, ps *Pss, c *testCase) { - recipientAddr := c.recipient - peers := c.peers - expected := c.expected - exclusive := c.exclusive - nFails := c.nFails - tries := 0 // number of previous failed tries - - resultMap := make(map[pot.Address]int) - - defer func() { sendFunc = sendMsg }() - sendFunc = func(_ *Pss, sp *network.Peer, _ *PssMsg) bool { - if tries < nFails { - tries++ - return false - } - a := pot.NewAddressFromBytes(sp.Address()) - resultMap[a]++ - return true - } - - msg := newTestMsg(recipientAddr) - ps.forward(msg) - - // check test results - var fail bool - precision := len(recipientAddr) - if precision > 4 { - precision = 4 - } - s := fmt.Sprintf("test [%s]\nmsg address: %x..., radius: %d", c.name, recipientAddr[:precision], 8*len(recipientAddr)) - - // false negatives (expected message didn't reach peer) - if exclusive { - var cnt int - for _, i := range expected { - a := peers[i] - cnt += resultMap[a] - resultMap[a] = 0 - } - if cnt != 1 { - s += fmt.Sprintf("\n%d messages received by %d peers with indices: [%v]", cnt, len(expected), expected) - fail = true - } - } else { - for _, i := range expected { - a := peers[i] - received := resultMap[a] - if received != 1 { - s += fmt.Sprintf("\npeer number %d [%x...] received %d messages", i, a[:4], received) - fail = true - } - resultMap[a] = 0 - } - } - - // false positives (unexpected message reached peer) - for k, v := range resultMap { - if v != 0 { - // find the index of the false positive peer - var j int - for j = 0; j < len(peers); j++ { - if peers[j] == k { - break - } - } - s += fmt.Sprintf("\npeer number %d [%x...] received %d messages", j, k[:4], v) - fail = true - } - } - - if fail { - t.Fatal(s) - } -} - -func addPeers(kad *network.Kademlia, addresses []pot.Address) { - for _, a := range addresses { - p := newTestDiscoveryPeer(a, kad) - kad.On(p) - } -} - -func createPss(t *testing.T, kad *network.Kademlia) *Pss { - privKey, err := crypto.GenerateKey() - pssp := NewPssParams().WithPrivateKey(privKey) - ps, err := NewPss(kad, pssp) - if err != nil { - t.Fatal(err.Error()) - } - return ps -} - -func newTestDiscoveryPeer(addr pot.Address, kad *network.Kademlia) *network.Peer { - rw := &p2p.MsgPipeRW{} - p := p2p.NewPeer(enode.ID{}, "test", []p2p.Cap{}) - pp := protocols.NewPeer(p, rw, &protocols.Spec{}) - bp := &network.BzzPeer{ - Peer: pp, - BzzAddr: &network.BzzAddr{ - OAddr: addr.Bytes(), - UAddr: []byte(fmt.Sprintf("%x", addr[:])), - }, - } - return network.NewPeer(bp, kad) -} - -func newTestMsg(addr []byte) *PssMsg { - msg := newPssMsg(&msgParams{}) - msg.To = addr[:] - msg.Expire = uint32(time.Now().Add(time.Second * 60).Unix()) - msg.Payload = &whisper.Envelope{ - Topic: [4]byte{}, - Data: []byte("i have nothing to hide"), - } - return msg -} diff --git a/swarm/pss/handshake.go b/swarm/pss/handshake.go deleted file mode 100644 index 3145d48e8bde..000000000000 --- a/swarm/pss/handshake.go +++ /dev/null @@ -1,566 +0,0 @@ -// Copyright 2018 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 . - -// +build !nopsshandshake - -package pss - -import ( - "context" - "errors" - "fmt" - "sync" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/swarm/log" -) - -const ( - IsActiveHandshake = true -) - -var ( - ctrlSingleton *HandshakeController -) - -const ( - defaultSymKeyRequestTimeout = 1000 * 8 // max wait ms to receive a response to a handshake symkey request - defaultSymKeyExpiryTimeout = 1000 * 10 // ms to wait before allowing garbage collection of an expired symkey - defaultSymKeySendLimit = 256 // amount of messages a symkey is valid for - defaultSymKeyCapacity = 4 // max number of symkeys to store/send simultaneously -) - -// symmetric key exchange message payload -type handshakeMsg struct { - From []byte - Limit uint16 - Keys [][]byte - Request uint8 - Topic Topic -} - -// internal representation of an individual symmetric key -type handshakeKey struct { - symKeyID *string - pubKeyID *string - limit uint16 - count uint16 - expiredAt time.Time -} - -// container for all in- and outgoing keys -// for one particular peer (public key) and topic -type handshake struct { - outKeys []handshakeKey - inKeys []handshakeKey -} - -// Initialization parameters for the HandshakeController -// -// SymKeyRequestExpiry: Timeout for waiting for a handshake reply -// (default 8000 ms) -// -// SymKeySendLimit: Amount of messages symmetric keys issues by -// this node is valid for (default 256) -// -// SymKeyCapacity: Ideal (and maximum) amount of symmetric keys -// held per direction per peer (default 4) -type HandshakeParams struct { - SymKeyRequestTimeout time.Duration - SymKeyExpiryTimeout time.Duration - SymKeySendLimit uint16 - SymKeyCapacity uint8 -} - -// Sane defaults for HandshakeController initialization -func NewHandshakeParams() *HandshakeParams { - return &HandshakeParams{ - SymKeyRequestTimeout: defaultSymKeyRequestTimeout * time.Millisecond, - SymKeyExpiryTimeout: defaultSymKeyExpiryTimeout * time.Millisecond, - SymKeySendLimit: defaultSymKeySendLimit, - SymKeyCapacity: defaultSymKeyCapacity, - } -} - -// Singleton object enabling semi-automatic Diffie-Hellman -// exchange of ephemeral symmetric keys -type HandshakeController struct { - pss *Pss - keyC map[string]chan []string // adds a channel to report when a handshake succeeds - lock sync.Mutex - symKeyRequestTimeout time.Duration - symKeyExpiryTimeout time.Duration - symKeySendLimit uint16 - symKeyCapacity uint8 - symKeyIndex map[string]*handshakeKey - handshakes map[string]map[Topic]*handshake - deregisterFuncs map[Topic]func() -} - -// Attach HandshakeController to pss node -// -// Must be called before starting the pss node service -func SetHandshakeController(pss *Pss, params *HandshakeParams) error { - ctrl := &HandshakeController{ - pss: pss, - keyC: make(map[string]chan []string), - symKeyRequestTimeout: params.SymKeyRequestTimeout, - symKeyExpiryTimeout: params.SymKeyExpiryTimeout, - symKeySendLimit: params.SymKeySendLimit, - symKeyCapacity: params.SymKeyCapacity, - symKeyIndex: make(map[string]*handshakeKey), - handshakes: make(map[string]map[Topic]*handshake), - deregisterFuncs: make(map[Topic]func()), - } - api := &HandshakeAPI{ - namespace: "pss", - ctrl: ctrl, - } - pss.addAPI(rpc.API{ - Namespace: api.namespace, - Version: "0.2", - Service: api, - Public: true, - }) - ctrlSingleton = ctrl - return nil -} - -// Return all unexpired symmetric keys from store by -// peer (public key), topic and specified direction -func (ctl *HandshakeController) validKeys(pubkeyid string, topic *Topic, in bool) (validkeys []*string) { - ctl.lock.Lock() - defer ctl.lock.Unlock() - now := time.Now() - if _, ok := ctl.handshakes[pubkeyid]; !ok { - return []*string{} - } else if _, ok := ctl.handshakes[pubkeyid][*topic]; !ok { - return []*string{} - } - var keystore *[]handshakeKey - if in { - keystore = &(ctl.handshakes[pubkeyid][*topic].inKeys) - } else { - keystore = &(ctl.handshakes[pubkeyid][*topic].outKeys) - } - - for _, key := range *keystore { - if key.limit <= key.count { - ctl.releaseKey(*key.symKeyID, topic) - } else if !key.expiredAt.IsZero() && key.expiredAt.Before(now) { - ctl.releaseKey(*key.symKeyID, topic) - } else { - validkeys = append(validkeys, key.symKeyID) - } - } - return -} - -// Add all given symmetric keys with validity limits to store by -// peer (public key), topic and specified direction -func (ctl *HandshakeController) updateKeys(pubkeyid string, topic *Topic, in bool, symkeyids []string, limit uint16) { - ctl.lock.Lock() - defer ctl.lock.Unlock() - if _, ok := ctl.handshakes[pubkeyid]; !ok { - ctl.handshakes[pubkeyid] = make(map[Topic]*handshake) - - } - if ctl.handshakes[pubkeyid][*topic] == nil { - ctl.handshakes[pubkeyid][*topic] = &handshake{} - } - var keystore *[]handshakeKey - expire := time.Now() - if in { - keystore = &(ctl.handshakes[pubkeyid][*topic].inKeys) - } else { - keystore = &(ctl.handshakes[pubkeyid][*topic].outKeys) - expire = expire.Add(time.Millisecond * ctl.symKeyExpiryTimeout) - } - for _, storekey := range *keystore { - storekey.expiredAt = expire - } - for i := 0; i < len(symkeyids); i++ { - storekey := handshakeKey{ - symKeyID: &symkeyids[i], - pubKeyID: &pubkeyid, - limit: limit, - } - *keystore = append(*keystore, storekey) - ctl.pss.symKeyPool[*storekey.symKeyID][*topic].protected = true - } - for i := 0; i < len(*keystore); i++ { - ctl.symKeyIndex[*(*keystore)[i].symKeyID] = &((*keystore)[i]) - } -} - -// Expire a symmetric key, making it elegible for garbage collection -func (ctl *HandshakeController) releaseKey(symkeyid string, topic *Topic) bool { - if ctl.symKeyIndex[symkeyid] == nil { - log.Debug("no symkey", "symkeyid", symkeyid) - return false - } - ctl.symKeyIndex[symkeyid].expiredAt = time.Now() - log.Debug("handshake release", "symkeyid", symkeyid) - return true -} - -// Checks all symmetric keys in given direction(s) by -// specified peer (public key) and topic for expiry. -// Expired means: -// - expiry timestamp is set, and grace period is exceeded -// - message validity limit is reached -func (ctl *HandshakeController) cleanHandshake(pubkeyid string, topic *Topic, in bool, out bool) int { - ctl.lock.Lock() - defer ctl.lock.Unlock() - var deletecount int - var deletes []string - now := time.Now() - handshake := ctl.handshakes[pubkeyid][*topic] - log.Debug("handshake clean", "pubkey", pubkeyid, "topic", topic) - if in { - for i, key := range handshake.inKeys { - if key.expiredAt.Before(now) || (key.expiredAt.IsZero() && key.limit <= key.count) { - log.Trace("handshake in clean remove", "symkeyid", *key.symKeyID) - deletes = append(deletes, *key.symKeyID) - handshake.inKeys[deletecount] = handshake.inKeys[i] - deletecount++ - } - } - handshake.inKeys = handshake.inKeys[:len(handshake.inKeys)-deletecount] - } - if out { - deletecount = 0 - for i, key := range handshake.outKeys { - if key.expiredAt.Before(now) && (key.expiredAt.IsZero() && key.limit <= key.count) { - log.Trace("handshake out clean remove", "symkeyid", *key.symKeyID) - deletes = append(deletes, *key.symKeyID) - handshake.outKeys[deletecount] = handshake.outKeys[i] - deletecount++ - } - } - handshake.outKeys = handshake.outKeys[:len(handshake.outKeys)-deletecount] - } - for _, keyid := range deletes { - delete(ctl.symKeyIndex, keyid) - ctl.pss.symKeyPool[keyid][*topic].protected = false - } - return len(deletes) -} - -// Runs cleanHandshake() on all peers and topics -func (ctl *HandshakeController) clean() { - peerpubkeys := ctl.handshakes - for pubkeyid, peertopics := range peerpubkeys { - for topic := range peertopics { - ctl.cleanHandshake(pubkeyid, &topic, true, true) - } - } -} - -// Passed as a PssMsg handler for the topic handshake is activated on -// Handles incoming key exchange messages and -// ccunts message usage by symmetric key (expiry limit control) -// Only returns error if key handler fails -func (ctl *HandshakeController) handler(msg []byte, p *p2p.Peer, asymmetric bool, symkeyid string) error { - if !asymmetric { - if ctl.symKeyIndex[symkeyid] != nil { - if ctl.symKeyIndex[symkeyid].count >= ctl.symKeyIndex[symkeyid].limit { - return fmt.Errorf("discarding message using expired key: %s", symkeyid) - } - ctl.symKeyIndex[symkeyid].count++ - log.Trace("increment symkey recv use", "symsymkeyid", symkeyid, "count", ctl.symKeyIndex[symkeyid].count, "limit", ctl.symKeyIndex[symkeyid].limit, "receiver", common.ToHex(crypto.FromECDSAPub(ctl.pss.PublicKey()))) - } - return nil - } - keymsg := &handshakeMsg{} - err := rlp.DecodeBytes(msg, keymsg) - if err == nil { - err := ctl.handleKeys(symkeyid, keymsg) - if err != nil { - log.Error("handlekeys fail", "error", err) - } - return err - } - return nil -} - -// Handle incoming key exchange message -// Add keys received from peer to store -// and enerate and send the amount of keys requested by peer -// -// TODO: -// - flood guard -// - keylength check -// - update address hint if: -// 1) leftmost bytes in new address do not match stored -// 2) else, if new address is longer -func (ctl *HandshakeController) handleKeys(pubkeyid string, keymsg *handshakeMsg) error { - // new keys from peer - if len(keymsg.Keys) > 0 { - log.Debug("received handshake keys", "pubkeyid", pubkeyid, "from", keymsg.From, "count", len(keymsg.Keys)) - var sendsymkeyids []string - for _, key := range keymsg.Keys { - sendsymkey := make([]byte, len(key)) - copy(sendsymkey, key) - sendsymkeyid, err := ctl.pss.setSymmetricKey(sendsymkey, keymsg.Topic, PssAddress(keymsg.From), false, false) - if err != nil { - return err - } - sendsymkeyids = append(sendsymkeyids, sendsymkeyid) - } - if len(sendsymkeyids) > 0 { - ctl.updateKeys(pubkeyid, &keymsg.Topic, false, sendsymkeyids, keymsg.Limit) - - ctl.alertHandshake(pubkeyid, sendsymkeyids) - } - } - - // peer request for keys - if keymsg.Request > 0 { - _, err := ctl.sendKey(pubkeyid, &keymsg.Topic, keymsg.Request) - if err != nil { - return err - } - } - - return nil -} - -// Send key exchange to peer (public key) valid for `topic` -// Will send number of keys specified by `keycount` with -// validity limits specified in `msglimit` -// If number of valid outgoing keys is less than the ideal/max -// amount, a request is sent for the amount of keys to make up -// the difference -func (ctl *HandshakeController) sendKey(pubkeyid string, topic *Topic, keycount uint8) ([]string, error) { - - var requestcount uint8 - to := PssAddress{} - if _, ok := ctl.pss.pubKeyPool[pubkeyid]; !ok { - return []string{}, errors.New("Invalid public key") - } else if psp, ok := ctl.pss.pubKeyPool[pubkeyid][*topic]; ok { - to = psp.address - } - - recvkeys := make([][]byte, keycount) - recvkeyids := make([]string, keycount) - ctl.lock.Lock() - if _, ok := ctl.handshakes[pubkeyid]; !ok { - ctl.handshakes[pubkeyid] = make(map[Topic]*handshake) - } - ctl.lock.Unlock() - - // check if buffer is not full - outkeys := ctl.validKeys(pubkeyid, topic, false) - if len(outkeys) < int(ctl.symKeyCapacity) { - //requestcount = uint8(self.symKeyCapacity - uint8(len(outkeys))) - requestcount = ctl.symKeyCapacity - } - // return if there's nothing to be accomplished - if requestcount == 0 && keycount == 0 { - return []string{}, nil - } - - // generate new keys to send - for i := 0; i < len(recvkeyids); i++ { - var err error - recvkeyids[i], err = ctl.pss.GenerateSymmetricKey(*topic, to, true) - if err != nil { - return []string{}, fmt.Errorf("set receive symkey fail (pubkey %x topic %x): %v", pubkeyid, topic, err) - } - recvkeys[i], err = ctl.pss.GetSymmetricKey(recvkeyids[i]) - if err != nil { - return []string{}, fmt.Errorf("GET Generated outgoing symkey fail (pubkey %x topic %x): %v", pubkeyid, topic, err) - } - } - ctl.updateKeys(pubkeyid, topic, true, recvkeyids, ctl.symKeySendLimit) - - // encode and send the message - recvkeymsg := &handshakeMsg{ - From: ctl.pss.BaseAddr(), - Keys: recvkeys, - Request: requestcount, - Limit: ctl.symKeySendLimit, - Topic: *topic, - } - log.Debug("sending our symkeys", "pubkey", pubkeyid, "symkeys", recvkeyids, "limit", ctl.symKeySendLimit, "requestcount", requestcount, "keycount", len(recvkeys)) - recvkeybytes, err := rlp.EncodeToBytes(recvkeymsg) - if err != nil { - return []string{}, fmt.Errorf("rlp keymsg encode fail: %v", err) - } - // if the send fails it means this public key is not registered for this particular address AND topic - err = ctl.pss.SendAsym(pubkeyid, *topic, recvkeybytes) - if err != nil { - return []string{}, fmt.Errorf("Send symkey failed: %v", err) - } - return recvkeyids, nil -} - -// Enables callback for keys received from a key exchange request -func (ctl *HandshakeController) alertHandshake(pubkeyid string, symkeys []string) chan []string { - if len(symkeys) > 0 { - if _, ok := ctl.keyC[pubkeyid]; ok { - ctl.keyC[pubkeyid] <- symkeys - close(ctl.keyC[pubkeyid]) - delete(ctl.keyC, pubkeyid) - } - return nil - } - if _, ok := ctl.keyC[pubkeyid]; !ok { - ctl.keyC[pubkeyid] = make(chan []string) - } - return ctl.keyC[pubkeyid] -} - -type HandshakeAPI struct { - namespace string - ctrl *HandshakeController -} - -// Initiate a handshake session for a peer (public key) and topic -// combination. -// -// If `sync` is set, the call will block until keys are received from peer, -// or if the handshake request times out -// -// If `flush` is set, the max amount of keys will be sent to the peer -// regardless of how many valid keys that currently exist in the store. -// -// Returns list of symmetric key ids that can be passed to pss.GetSymmetricKey() -// for retrieval of the symmetric key bytes themselves. -// -// Fails if the incoming symmetric key store is already full (and `flush` is false), -// or if the underlying key dispatcher fails -func (api *HandshakeAPI) Handshake(pubkeyid string, topic Topic, sync bool, flush bool) (keys []string, err error) { - var hsc chan []string - var keycount uint8 - if flush { - keycount = api.ctrl.symKeyCapacity - } else { - validkeys := api.ctrl.validKeys(pubkeyid, &topic, false) - keycount = api.ctrl.symKeyCapacity - uint8(len(validkeys)) - } - if keycount == 0 { - return keys, errors.New("Incoming symmetric key store is already full") - } - if sync { - hsc = api.ctrl.alertHandshake(pubkeyid, []string{}) - } - _, err = api.ctrl.sendKey(pubkeyid, &topic, keycount) - if err != nil { - return keys, err - } - if sync { - ctx, cancel := context.WithTimeout(context.Background(), api.ctrl.symKeyRequestTimeout) - defer cancel() - select { - case keys = <-hsc: - log.Trace("sync handshake response receive", "key", keys) - case <-ctx.Done(): - return []string{}, errors.New("timeout") - } - } - return keys, nil -} - -// Activate handshake functionality on a topic -func (api *HandshakeAPI) AddHandshake(topic Topic) error { - api.ctrl.deregisterFuncs[topic] = api.ctrl.pss.Register(&topic, NewHandler(api.ctrl.handler)) - return nil -} - -// Deactivate handshake functionality on a topic -func (api *HandshakeAPI) RemoveHandshake(topic *Topic) error { - if _, ok := api.ctrl.deregisterFuncs[*topic]; ok { - api.ctrl.deregisterFuncs[*topic]() - } - return nil -} - -// Returns all valid symmetric keys in store per peer (public key) -// and topic. -// -// The `in` and `out` parameters indicate for which direction(s) -// symmetric keys will be returned. -// If both are false, no keys (and no error) will be returned. -func (api *HandshakeAPI) GetHandshakeKeys(pubkeyid string, topic Topic, in bool, out bool) (keys []string, err error) { - if in { - for _, inkey := range api.ctrl.validKeys(pubkeyid, &topic, true) { - keys = append(keys, *inkey) - } - } - if out { - for _, outkey := range api.ctrl.validKeys(pubkeyid, &topic, false) { - keys = append(keys, *outkey) - } - } - return keys, nil -} - -// Returns the amount of messages the specified symmetric key -// is still valid for under the handshake scheme -func (api *HandshakeAPI) GetHandshakeKeyCapacity(symkeyid string) (uint16, error) { - storekey := api.ctrl.symKeyIndex[symkeyid] - if storekey == nil { - return 0, fmt.Errorf("invalid symkey id %s", symkeyid) - } - return storekey.limit - storekey.count, nil -} - -// Returns the byte representation of the public key in ascii hex -// associated with the given symmetric key -func (api *HandshakeAPI) GetHandshakePublicKey(symkeyid string) (string, error) { - storekey := api.ctrl.symKeyIndex[symkeyid] - if storekey == nil { - return "", fmt.Errorf("invalid symkey id %s", symkeyid) - } - return *storekey.pubKeyID, nil -} - -// Manually expire the given symkey -// -// If `flush` is set, garbage collection will be performed before returning. -// -// Returns true on successful removal, false otherwise -func (api *HandshakeAPI) ReleaseHandshakeKey(pubkeyid string, topic Topic, symkeyid string, flush bool) (removed bool, err error) { - removed = api.ctrl.releaseKey(symkeyid, &topic) - if removed && flush { - api.ctrl.cleanHandshake(pubkeyid, &topic, true, true) - } - return -} - -// Send symmetric message under the handshake scheme -// -// Overloads the pss.SendSym() API call, adding symmetric key usage count -// for message expiry control -func (api *HandshakeAPI) SendSym(symkeyid string, topic Topic, msg hexutil.Bytes) (err error) { - err = api.ctrl.pss.SendSym(symkeyid, topic, msg[:]) - if api.ctrl.symKeyIndex[symkeyid] != nil { - if api.ctrl.symKeyIndex[symkeyid].count >= api.ctrl.symKeyIndex[symkeyid].limit { - return errors.New("attempted send with expired key") - } - api.ctrl.symKeyIndex[symkeyid].count++ - log.Trace("increment symkey send use", "symkeyid", symkeyid, "count", api.ctrl.symKeyIndex[symkeyid].count, "limit", api.ctrl.symKeyIndex[symkeyid].limit, "receiver", common.ToHex(crypto.FromECDSAPub(api.ctrl.pss.PublicKey()))) - } - return err -} diff --git a/swarm/pss/handshake_none.go b/swarm/pss/handshake_none.go deleted file mode 100644 index a09674be3971..000000000000 --- a/swarm/pss/handshake_none.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2018 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 . - -// +build nopsshandshake - -package pss - -const ( - IsActiveHandshake = false -) - -func NewHandshakeParams() interface{} { - return nil -} diff --git a/swarm/pss/handshake_test.go b/swarm/pss/handshake_test.go deleted file mode 100644 index 139c27f40e5e..000000000000 --- a/swarm/pss/handshake_test.go +++ /dev/null @@ -1,267 +0,0 @@ -// Copyright 2018 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 . - -// +build foo - -package pss - -import ( - "strconv" - "strings" - "testing" - "time" - - "github.com/nebulaai/nbai-node/swarm/log" -) - -// asymmetrical key exchange between two directly connected peers -// full address, partial address (8 bytes) and empty address -func TestHandshake(t *testing.T) { - t.Skip("handshakes are not adapted to current pss core code") - t.Run("32", testHandshake) - t.Run("8", testHandshake) - t.Run("0", testHandshake) -} - -func testHandshake(t *testing.T) { - - // how much of the address we will use - useHandshake = true - var addrsize int64 - var err error - addrsizestring := strings.Split(t.Name(), "/") - addrsize, _ = strconv.ParseInt(addrsizestring[1], 10, 0) - - // set up two nodes directly connected - // (we are not testing pss routing here) - clients, err := setupNetwork(2) - if err != nil { - t.Fatal(err) - } - - var topic string - err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42") - if err != nil { - t.Fatal(err) - } - - var loaddr string - err = clients[0].Call(&loaddr, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 1 baseaddr fail: %v", err) - } - // "0x" = 2 bytes + addrsize address bytes which in hex is 2x length - loaddr = loaddr[:2+(addrsize*2)] - var roaddr string - err = clients[1].Call(&roaddr, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 2 baseaddr fail: %v", err) - } - roaddr = roaddr[:2+(addrsize*2)] - log.Debug("addresses", "left", loaddr, "right", roaddr) - - // retrieve public key from pss instance - // set this public key reciprocally - var lpubkey string - err = clients[0].Call(&lpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 1 pubkey fail: %v", err) - } - var rpubkey string - err = clients[1].Call(&rpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 2 pubkey fail: %v", err) - } - - time.Sleep(time.Millisecond * 1000) // replace with hive healthy code - - // give each node its peer's public key - err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddr) - if err != nil { - t.Fatal(err) - } - err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddr) - if err != nil { - t.Fatal(err) - } - - // perform the handshake - // after this each side will have defaultSymKeyBufferCapacity symkeys each for in- and outgoing messages: - // L -> request 4 keys -> R - // L <- send 4 keys, request 4 keys <- R - // L -> send 4 keys -> R - // the call will fill the array with symkeys L needs for sending to R - err = clients[0].Call(nil, "pss_addHandshake", topic) - if err != nil { - t.Fatal(err) - } - err = clients[1].Call(nil, "pss_addHandshake", topic) - if err != nil { - t.Fatal(err) - } - - var lhsendsymkeyids []string - err = clients[0].Call(&lhsendsymkeyids, "pss_handshake", rpubkey, topic, true, true) - if err != nil { - t.Fatal(err) - } - - // make sure the r-node gets its keys - time.Sleep(time.Second) - - // check if we have 6 outgoing keys stored, and they match what was received from R - var lsendsymkeyids []string - err = clients[0].Call(&lsendsymkeyids, "pss_getHandshakeKeys", rpubkey, topic, false, true) - if err != nil { - t.Fatal(err) - } - m := 0 - for _, hid := range lhsendsymkeyids { - for _, lid := range lsendsymkeyids { - if lid == hid { - m++ - } - } - } - if m != defaultSymKeyCapacity { - t.Fatalf("buffer size mismatch, expected %d, have %d: %v", defaultSymKeyCapacity, m, lsendsymkeyids) - } - - // check if in- and outgoing keys on l-node and r-node match up and are in opposite categories (l recv = r send, l send = r recv) - var rsendsymkeyids []string - err = clients[1].Call(&rsendsymkeyids, "pss_getHandshakeKeys", lpubkey, topic, false, true) - if err != nil { - t.Fatal(err) - } - var lrecvsymkeyids []string - err = clients[0].Call(&lrecvsymkeyids, "pss_getHandshakeKeys", rpubkey, topic, true, false) - if err != nil { - t.Fatal(err) - } - var rrecvsymkeyids []string - err = clients[1].Call(&rrecvsymkeyids, "pss_getHandshakeKeys", lpubkey, topic, true, false) - if err != nil { - t.Fatal(err) - } - - // get outgoing symkeys in byte form from both sides - var lsendsymkeys []string - for _, id := range lsendsymkeyids { - var key string - err = clients[0].Call(&key, "pss_getSymmetricKey", id) - if err != nil { - t.Fatal(err) - } - lsendsymkeys = append(lsendsymkeys, key) - } - var rsendsymkeys []string - for _, id := range rsendsymkeyids { - var key string - err = clients[1].Call(&key, "pss_getSymmetricKey", id) - if err != nil { - t.Fatal(err) - } - rsendsymkeys = append(rsendsymkeys, key) - } - - // get incoming symkeys in byte form from both sides and compare - var lrecvsymkeys []string - for _, id := range lrecvsymkeyids { - var key string - err = clients[0].Call(&key, "pss_getSymmetricKey", id) - if err != nil { - t.Fatal(err) - } - match := false - for _, otherkey := range rsendsymkeys { - if otherkey == key { - match = true - } - } - if !match { - t.Fatalf("no match right send for left recv key %s", id) - } - lrecvsymkeys = append(lrecvsymkeys, key) - } - var rrecvsymkeys []string - for _, id := range rrecvsymkeyids { - var key string - err = clients[1].Call(&key, "pss_getSymmetricKey", id) - if err != nil { - t.Fatal(err) - } - match := false - for _, otherkey := range lsendsymkeys { - if otherkey == key { - match = true - } - } - if !match { - t.Fatalf("no match left send for right recv key %s", id) - } - rrecvsymkeys = append(rrecvsymkeys, key) - } - - // send new handshake request, should send no keys - err = clients[0].Call(nil, "pss_handshake", rpubkey, topic, false) - if err == nil { - t.Fatal("expected full symkey buffer error") - } - - // expire one key, send new handshake request - err = clients[0].Call(nil, "pss_releaseHandshakeKey", rpubkey, topic, lsendsymkeyids[0], true) - if err != nil { - t.Fatalf("release left send key %s fail: %v", lsendsymkeyids[0], err) - } - - var newlhsendkeyids []string - - // send new handshake request, should now receive one key - // check that it is not in previous right recv key array - err = clients[0].Call(&newlhsendkeyids, "pss_handshake", rpubkey, topic, true, false) - if err != nil { - t.Fatalf("handshake send fail: %v", err) - } else if len(newlhsendkeyids) != defaultSymKeyCapacity { - t.Fatalf("wrong receive count, expected 1, got %d", len(newlhsendkeyids)) - } - - var newlrecvsymkey string - err = clients[0].Call(&newlrecvsymkey, "pss_getSymmetricKey", newlhsendkeyids[0]) - if err != nil { - t.Fatal(err) - } - var rmatchsymkeyid *string - for i, id := range rrecvsymkeyids { - var key string - err = clients[1].Call(&key, "pss_getSymmetricKey", id) - if err != nil { - t.Fatal(err) - } - if newlrecvsymkey == key { - rmatchsymkeyid = &rrecvsymkeyids[i] - } - } - if rmatchsymkeyid != nil { - t.Fatalf("right sent old key id %s in second handshake", *rmatchsymkeyid) - } - - // clean the pss core keystore. Should clean the key released earlier - var cleancount int - clients[0].Call(&cleancount, "psstest_clean") - if cleancount > 1 { - t.Fatalf("pss clean count mismatch; expected 1, got %d", cleancount) - } -} diff --git a/swarm/pss/notify/notify.go b/swarm/pss/notify/notify.go deleted file mode 100644 index c24a0aa43f15..000000000000 --- a/swarm/pss/notify/notify.go +++ /dev/null @@ -1,394 +0,0 @@ -package notify - -import ( - "crypto/ecdsa" - "fmt" - "sync" - - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/pss" -) - -const ( - // sent from requester to updater to request start of notifications - MsgCodeStart = iota - - // sent from updater to requester, contains a notification plus a new symkey to replace the old - MsgCodeNotifyWithKey - - // sent from updater to requester, contains a notification - MsgCodeNotify - - // sent from requester to updater to request stop of notifications (currently unused) - MsgCodeStop - MsgCodeMax -) - -const ( - DefaultAddressLength = 1 - symKeyLength = 32 // this should be gotten from source -) - -var ( - // control topic is used before symmetric key issuance completes - controlTopic = pss.Topic{0x00, 0x00, 0x00, 0x01} -) - -// when code is MsgCodeStart, Payload is address -// when code is MsgCodeNotifyWithKey, Payload is notification | symkey -// when code is MsgCodeNotify, Payload is notification -// when code is MsgCodeStop, Payload is address -type Msg struct { - Code byte - Name []byte - Payload []byte - namestring string -} - -// NewMsg creates a new notification message object -func NewMsg(code byte, name string, payload []byte) *Msg { - return &Msg{ - Code: code, - Name: []byte(name), - Payload: payload, - namestring: name, - } -} - -// NewMsgFromPayload decodes a serialized message payload into a new notification message object -func NewMsgFromPayload(payload []byte) (*Msg, error) { - msg := &Msg{} - err := rlp.DecodeBytes(payload, msg) - if err != nil { - return nil, err - } - msg.namestring = string(msg.Name) - return msg, nil -} - -// a notifier has one sendBin entry for each address space it sends messages to -type sendBin struct { - address pss.PssAddress - symKeyId string - count int -} - -// represents a single notification service -// only subscription address bins that match the address of a notification client have entries. -type notifier struct { - bins map[string]*sendBin - topic pss.Topic // identifies the resource for pss receiver - threshold int // amount of address bytes used in bins - updateC <-chan []byte - quitC chan struct{} -} - -func (n *notifier) removeSubscription() { - n.quitC <- struct{}{} -} - -// represents an individual subscription made by a public key at a specific address/neighborhood -type subscription struct { - pubkeyId string - address pss.PssAddress - handler func(string, []byte) error -} - -// Controller is the interface to control, add and remove notification services and subscriptions -type Controller struct { - pss *pss.Pss - notifiers map[string]*notifier - subscriptions map[string]*subscription - mu sync.Mutex -} - -// NewController creates a new Controller object -func NewController(ps *pss.Pss) *Controller { - ctrl := &Controller{ - pss: ps, - notifiers: make(map[string]*notifier), - subscriptions: make(map[string]*subscription), - } - ctrl.pss.Register(&controlTopic, pss.NewHandler(ctrl.Handler)) - return ctrl -} - -// IsActive is used to check if a notification service exists for a specified id string -// Returns true if exists, false if not -func (c *Controller) IsActive(name string) bool { - c.mu.Lock() - defer c.mu.Unlock() - return c.isActive(name) -} - -func (c *Controller) isActive(name string) bool { - _, ok := c.notifiers[name] - return ok -} - -// Subscribe is used by a client to request notifications from a notification service provider -// It will create a MsgCodeStart message and send asymmetrically to the provider using its public key and routing address -// The handler function is a callback that will be called when notifications are received -// Fails if the request pss cannot be sent or if the update message could not be serialized -func (c *Controller) Subscribe(name string, pubkey *ecdsa.PublicKey, address pss.PssAddress, handler func(string, []byte) error) error { - c.mu.Lock() - defer c.mu.Unlock() - msg := NewMsg(MsgCodeStart, name, c.pss.BaseAddr()) - c.pss.SetPeerPublicKey(pubkey, controlTopic, address) - pubkeyId := hexutil.Encode(crypto.FromECDSAPub(pubkey)) - smsg, err := rlp.EncodeToBytes(msg) - if err != nil { - return err - } - err = c.pss.SendAsym(pubkeyId, controlTopic, smsg) - if err != nil { - return err - } - c.subscriptions[name] = &subscription{ - pubkeyId: pubkeyId, - address: address, - handler: handler, - } - return nil -} - -// Unsubscribe, perhaps unsurprisingly, undoes the effects of Subscribe -// Fails if the subscription does not exist, if the request pss cannot be sent or if the update message could not be serialized -func (c *Controller) Unsubscribe(name string) error { - c.mu.Lock() - defer c.mu.Unlock() - sub, ok := c.subscriptions[name] - if !ok { - return fmt.Errorf("Unknown subscription '%s'", name) - } - msg := NewMsg(MsgCodeStop, name, sub.address) - smsg, err := rlp.EncodeToBytes(msg) - if err != nil { - return err - } - err = c.pss.SendAsym(sub.pubkeyId, controlTopic, smsg) - if err != nil { - return err - } - delete(c.subscriptions, name) - return nil -} - -// NewNotifier is used by a notification service provider to create a new notification service -// It takes a name as identifier for the resource, a threshold indicating the granularity of the subscription address bin -// It then starts an event loop which listens to the supplied update channel and executes notifications on channel receives -// Fails if a notifier already is registered on the name -//func (c *Controller) NewNotifier(name string, threshold int, contentFunc func(string) ([]byte, error)) error { -func (c *Controller) NewNotifier(name string, threshold int, updateC <-chan []byte) (func(), error) { - c.mu.Lock() - if c.isActive(name) { - c.mu.Unlock() - return nil, fmt.Errorf("Notification service %s already exists in controller", name) - } - quitC := make(chan struct{}) - c.notifiers[name] = ¬ifier{ - bins: make(map[string]*sendBin), - topic: pss.BytesToTopic([]byte(name)), - threshold: threshold, - updateC: updateC, - quitC: quitC, - //contentFunc: contentFunc, - } - c.mu.Unlock() - go func() { - for { - select { - case <-quitC: - return - case data := <-updateC: - c.notify(name, data) - } - } - }() - - return c.notifiers[name].removeSubscription, nil -} - -// RemoveNotifier is used to stop a notification service. -// It cancels the event loop listening to the notification provider's update channel -func (c *Controller) RemoveNotifier(name string) error { - c.mu.Lock() - defer c.mu.Unlock() - currentNotifier, ok := c.notifiers[name] - if !ok { - return fmt.Errorf("Unknown notification service %s", name) - } - currentNotifier.removeSubscription() - delete(c.notifiers, name) - return nil -} - -// Notify is called by a notification service provider to issue a new notification -// It takes the name of the notification service and the data to be sent. -// It fails if a notifier with this name does not exist or if data could not be serialized -// Note that it does NOT fail on failure to send a message -func (c *Controller) notify(name string, data []byte) error { - c.mu.Lock() - defer c.mu.Unlock() - if !c.isActive(name) { - return fmt.Errorf("Notification service %s doesn't exist", name) - } - msg := NewMsg(MsgCodeNotify, name, data) - smsg, err := rlp.EncodeToBytes(msg) - if err != nil { - return err - } - for _, m := range c.notifiers[name].bins { - log.Debug("sending pss notify", "name", name, "addr", fmt.Sprintf("%x", m.address), "topic", fmt.Sprintf("%x", c.notifiers[name].topic), "data", data) - go func(m *sendBin) { - err = c.pss.SendSym(m.symKeyId, c.notifiers[name].topic, smsg) - if err != nil { - log.Warn("Failed to send notify to addr %x: %v", m.address, err) - } - }(m) - } - return nil -} - -// check if we already have the bin -// if we do, retrieve the symkey from it and increment the count -// if we dont make a new symkey and a new bin entry -func (c *Controller) addToBin(ntfr *notifier, address []byte) (symKeyId string, pssAddress pss.PssAddress, err error) { - - // parse the address from the message and truncate if longer than our bins threshold - if len(address) > ntfr.threshold { - address = address[:ntfr.threshold] - } - - pssAddress = pss.PssAddress(address) - hexAddress := fmt.Sprintf("%x", address) - currentBin, ok := ntfr.bins[hexAddress] - if ok { - currentBin.count++ - symKeyId = currentBin.symKeyId - } else { - symKeyId, err = c.pss.GenerateSymmetricKey(ntfr.topic, pssAddress, false) - if err != nil { - return "", nil, err - } - ntfr.bins[hexAddress] = &sendBin{ - address: address, - symKeyId: symKeyId, - count: 1, - } - } - return symKeyId, pssAddress, nil -} - -func (c *Controller) handleStartMsg(msg *Msg, keyid string) (err error) { - - keyidbytes, err := hexutil.Decode(keyid) - if err != nil { - return err - } - pubkey, err := crypto.UnmarshalPubkey(keyidbytes) - if err != nil { - return err - } - - // if name is not registered for notifications we will not react - currentNotifier, ok := c.notifiers[msg.namestring] - if !ok { - return fmt.Errorf("Subscribe attempted on unknown resource '%s'", msg.namestring) - } - - // add to or open new bin - symKeyId, pssAddress, err := c.addToBin(currentNotifier, msg.Payload) - if err != nil { - return err - } - - // add to address book for send initial notify - symkey, err := c.pss.GetSymmetricKey(symKeyId) - if err != nil { - return err - } - err = c.pss.SetPeerPublicKey(pubkey, controlTopic, pssAddress) - if err != nil { - return err - } - - // TODO this is set to zero-length byte pending decision on protocol for initial message, whether it should include message or not, and how to trigger the initial message so that current state of Swarm feed is sent upon subscription - notify := []byte{} - replyMsg := NewMsg(MsgCodeNotifyWithKey, msg.namestring, make([]byte, len(notify)+symKeyLength)) - copy(replyMsg.Payload, notify) - copy(replyMsg.Payload[len(notify):], symkey) - sReplyMsg, err := rlp.EncodeToBytes(replyMsg) - if err != nil { - return err - } - return c.pss.SendAsym(keyid, controlTopic, sReplyMsg) -} - -func (c *Controller) handleNotifyWithKeyMsg(msg *Msg) error { - symkey := msg.Payload[len(msg.Payload)-symKeyLength:] - topic := pss.BytesToTopic(msg.Name) - - // \TODO keep track of and add actual address - updaterAddr := pss.PssAddress([]byte{}) - c.pss.SetSymmetricKey(symkey, topic, updaterAddr, true) - c.pss.Register(&topic, pss.NewHandler(c.Handler)) - return c.subscriptions[msg.namestring].handler(msg.namestring, msg.Payload[:len(msg.Payload)-symKeyLength]) -} - -func (c *Controller) handleStopMsg(msg *Msg) error { - // if name is not registered for notifications we will not react - currentNotifier, ok := c.notifiers[msg.namestring] - if !ok { - return fmt.Errorf("Unsubscribe attempted on unknown resource '%s'", msg.namestring) - } - - // parse the address from the message and truncate if longer than our bins' address length threshold - address := msg.Payload - if len(msg.Payload) > currentNotifier.threshold { - address = address[:currentNotifier.threshold] - } - - // remove the entry from the bin if it exists, and remove the bin if it's the last remaining one - hexAddress := fmt.Sprintf("%x", address) - currentBin, ok := currentNotifier.bins[hexAddress] - if !ok { - return fmt.Errorf("found no active bin for address %s", hexAddress) - } - currentBin.count-- - if currentBin.count == 0 { // if no more clients in this bin, remove it - delete(currentNotifier.bins, hexAddress) - } - return nil -} - -// Handler is the pss topic handler to be used to process notification service messages -// It should be registered in the pss of both to any notification service provides and clients using the service -func (c *Controller) Handler(smsg []byte, p *p2p.Peer, asymmetric bool, keyid string) error { - c.mu.Lock() - defer c.mu.Unlock() - log.Debug("notify controller handler", "keyid", keyid) - - // see if the message is valid - msg, err := NewMsgFromPayload(smsg) - if err != nil { - return err - } - - switch msg.Code { - case MsgCodeStart: - return c.handleStartMsg(msg, keyid) - case MsgCodeNotifyWithKey: - return c.handleNotifyWithKeyMsg(msg) - case MsgCodeNotify: - return c.subscriptions[msg.namestring].handler(msg.namestring, msg.Payload) - case MsgCodeStop: - return c.handleStopMsg(msg) - } - - return fmt.Errorf("Invalid message code: %d", msg.Code) -} diff --git a/swarm/pss/notify/notify_test.go b/swarm/pss/notify/notify_test.go deleted file mode 100644 index 4065bc3dcbbd..000000000000 --- a/swarm/pss/notify/notify_test.go +++ /dev/null @@ -1,257 +0,0 @@ -package notify - -import ( - "bytes" - "context" - "flag" - "fmt" - "os" - "testing" - "time" - - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/pss" - "github.com/nebulaai/nbai-node/swarm/state" - whisper "github.com/nebulaai/nbai-node/whisper/whisperv5" -) - -var ( - loglevel = flag.Int("l", 3, "loglevel") - psses map[string]*pss.Pss - w *whisper.Whisper - wapi *whisper.PublicWhisperAPI -) - -func init() { - flag.Parse() - hs := log.StreamHandler(os.Stderr, log.TerminalFormat(true)) - hf := log.LvlFilterHandler(log.Lvl(*loglevel), hs) - h := log.CallerFileHandler(hf) - log.Root().SetHandler(h) - - w = whisper.New(&whisper.DefaultConfig) - wapi = whisper.NewPublicWhisperAPI(w) - psses = make(map[string]*pss.Pss) -} - -// Creates a client node and notifier node -// Client sends pss notifications requests -// notifier sends initial notification with symmetric key, and -// second notification symmetrically encrypted -func TestStart(t *testing.T) { - adapter := adapters.NewSimAdapter(newServices(false)) - net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ - ID: "0", - DefaultService: "bzz", - }) - leftNodeConf := adapters.RandomNodeConfig() - leftNodeConf.Services = []string{"bzz", "pss"} - leftNode, err := net.NewNodeWithConfig(leftNodeConf) - if err != nil { - t.Fatal(err) - } - err = net.Start(leftNode.ID()) - if err != nil { - t.Fatal(err) - } - - rightNodeConf := adapters.RandomNodeConfig() - rightNodeConf.Services = []string{"bzz", "pss"} - rightNode, err := net.NewNodeWithConfig(rightNodeConf) - if err != nil { - t.Fatal(err) - } - err = net.Start(rightNode.ID()) - if err != nil { - t.Fatal(err) - } - - err = net.Connect(rightNode.ID(), leftNode.ID()) - if err != nil { - t.Fatal(err) - } - - leftRpc, err := leftNode.Client() - if err != nil { - t.Fatal(err) - } - - rightRpc, err := rightNode.Client() - if err != nil { - t.Fatal(err) - } - - var leftAddr string - err = leftRpc.Call(&leftAddr, "pss_baseAddr") - if err != nil { - t.Fatal(err) - } - - var rightAddr string - err = rightRpc.Call(&rightAddr, "pss_baseAddr") - if err != nil { - t.Fatal(err) - } - - var leftPub string - err = leftRpc.Call(&leftPub, "pss_getPublicKey") - if err != nil { - t.Fatal(err) - } - - var rightPub string - err = rightRpc.Call(&rightPub, "pss_getPublicKey") - if err != nil { - t.Fatal(err) - } - - rsrcName := "foo.eth" - rsrcTopic := pss.BytesToTopic([]byte(rsrcName)) - - // wait for kademlia table to populate - time.Sleep(time.Second) - - ctx, cancel := context.WithTimeout(context.Background(), time.Second*2) - defer cancel() - rmsgC := make(chan *pss.APIMsg) - rightSub, err := rightRpc.Subscribe(ctx, "pss", rmsgC, "receive", controlTopic, false, false) - if err != nil { - t.Fatal(err) - } - defer rightSub.Unsubscribe() - - updateC := make(chan []byte) - updateMsg := []byte{} - ctrlClient := NewController(psses[rightPub]) - ctrlNotifier := NewController(psses[leftPub]) - ctrlNotifier.NewNotifier("foo.eth", 2, updateC) - - pubkeybytes, err := hexutil.Decode(leftPub) - if err != nil { - t.Fatal(err) - } - pubkey, err := crypto.UnmarshalPubkey(pubkeybytes) - if err != nil { - t.Fatal(err) - } - addrbytes, err := hexutil.Decode(leftAddr) - if err != nil { - t.Fatal(err) - } - ctrlClient.Subscribe(rsrcName, pubkey, addrbytes, func(s string, b []byte) error { - if s != "foo.eth" || !bytes.Equal(updateMsg, b) { - t.Fatalf("unexpected result in client handler: '%s':'%x'", s, b) - } - log.Info("client handler receive", "s", s, "b", b) - return nil - }) - - var inMsg *pss.APIMsg - select { - case inMsg = <-rmsgC: - case <-ctx.Done(): - t.Fatal(ctx.Err()) - } - - dMsg, err := NewMsgFromPayload(inMsg.Msg) - if err != nil { - t.Fatal(err) - } - if dMsg.namestring != rsrcName { - t.Fatalf("expected name '%s', got '%s'", rsrcName, dMsg.namestring) - } - if !bytes.Equal(dMsg.Payload[:len(updateMsg)], updateMsg) { - t.Fatalf("expected payload first %d bytes '%x', got '%x'", len(updateMsg), updateMsg, dMsg.Payload[:len(updateMsg)]) - } - if len(updateMsg)+symKeyLength != len(dMsg.Payload) { - t.Fatalf("expected payload length %d, have %d", len(updateMsg)+symKeyLength, len(dMsg.Payload)) - } - - rightSubUpdate, err := rightRpc.Subscribe(ctx, "pss", rmsgC, "receive", rsrcTopic, false, false) - if err != nil { - t.Fatal(err) - } - defer rightSubUpdate.Unsubscribe() - - updateMsg = []byte("plugh") - updateC <- updateMsg - select { - case inMsg = <-rmsgC: - case <-ctx.Done(): - log.Error("timed out waiting for msg", "topic", fmt.Sprintf("%x", rsrcTopic)) - t.Fatal(ctx.Err()) - } - dMsg, err = NewMsgFromPayload(inMsg.Msg) - if err != nil { - t.Fatal(err) - } - if dMsg.namestring != rsrcName { - t.Fatalf("expected name %s, got %s", rsrcName, dMsg.namestring) - } - if !bytes.Equal(dMsg.Payload, updateMsg) { - t.Fatalf("expected payload '%x', got '%x'", updateMsg, dMsg.Payload) - } - -} - -func newServices(allowRaw bool) adapters.Services { - stateStore := state.NewInmemoryStore() - kademlias := make(map[enode.ID]*network.Kademlia) - kademlia := func(id enode.ID) *network.Kademlia { - if k, ok := kademlias[id]; ok { - return k - } - params := network.NewKadParams() - params.NeighbourhoodSize = 2 - params.MaxBinSize = 3 - params.MinBinSize = 1 - params.MaxRetries = 1000 - params.RetryExponent = 2 - params.RetryInterval = 1000000 - kademlias[id] = network.NewKademlia(id[:], params) - return kademlias[id] - } - return adapters.Services{ - "pss": func(ctx *adapters.ServiceContext) (node.Service, error) { - ctxlocal, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctxlocal) - if err != nil { - return nil, err - } - privkey, err := w.GetPrivateKey(keys) - if err != nil { - return nil, err - } - pssp := pss.NewPssParams().WithPrivateKey(privkey) - pssp.MsgTTL = time.Second * 30 - pssp.AllowRaw = allowRaw - pskad := kademlia(ctx.Config.ID) - ps, err := pss.NewPss(pskad, pssp) - if err != nil { - return nil, err - } - //psses[common.ToHex(crypto.FromECDSAPub(&privkey.PublicKey))] = ps - psses[hexutil.Encode(crypto.FromECDSAPub(&privkey.PublicKey))] = ps - return ps, nil - }, - "bzz": func(ctx *adapters.ServiceContext) (node.Service, error) { - addr := network.NewAddr(ctx.Config.Node()) - hp := network.NewHiveParams() - hp.Discovery = false - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - return network.NewBzz(config, kademlia(ctx.Config.ID), stateStore, nil, nil), nil - }, - } -} diff --git a/swarm/pss/ping.go b/swarm/pss/ping.go deleted file mode 100644 index ffa23766c6c2..000000000000 --- a/swarm/pss/ping.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2018 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 . - -// +build !nopssprotocol,!nopssping - -package pss - -import ( - "context" - "errors" - "time" - - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/protocols" - "github.com/nebulaai/nbai-node/swarm/log" -) - -// Generic ping protocol implementation for -// pss devp2p protocol emulation -type PingMsg struct { - Created time.Time - Pong bool // set if message is pong reply -} - -type Ping struct { - Pong bool // toggle pong reply upon ping receive - OutC chan bool // trigger ping - InC chan bool // optional, report back to calling code -} - -func (p *Ping) pingHandler(ctx context.Context, msg interface{}) error { - var pingmsg *PingMsg - var ok bool - if pingmsg, ok = msg.(*PingMsg); !ok { - return errors.New("invalid msg") - } - log.Debug("ping handler", "msg", pingmsg, "outc", p.OutC) - if p.InC != nil { - p.InC <- pingmsg.Pong - } - if p.Pong && !pingmsg.Pong { - p.OutC <- true - } - return nil -} - -var PingProtocol = &protocols.Spec{ - Name: "psstest", - Version: 1, - MaxMsgSize: 1024, - Messages: []interface{}{ - PingMsg{}, - }, -} - -var PingTopic = ProtocolTopic(PingProtocol) - -func NewPingProtocol(ping *Ping) *p2p.Protocol { - return &p2p.Protocol{ - Name: PingProtocol.Name, - Version: PingProtocol.Version, - Length: uint64(PingProtocol.MaxMsgSize), - Run: func(p *p2p.Peer, rw p2p.MsgReadWriter) error { - quitC := make(chan struct{}) - pp := protocols.NewPeer(p, rw, PingProtocol) - log.Trace("running pss vprotocol", "peer", p, "outc", ping.OutC) - go func() { - for { - select { - case ispong := <-ping.OutC: - pp.Send(context.TODO(), &PingMsg{ - Created: time.Now(), - Pong: ispong, - }) - case <-quitC: - } - } - }() - err := pp.Run(ping.pingHandler) - quitC <- struct{}{} - return err - }, - } -} diff --git a/swarm/pss/protocol.go b/swarm/pss/protocol.go deleted file mode 100644 index 092ef319a9c1..000000000000 --- a/swarm/pss/protocol.go +++ /dev/null @@ -1,287 +0,0 @@ -// Copyright 2018 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 . - -// +build !nopssprotocol - -package pss - -import ( - "bytes" - "fmt" - "sync" - "time" - - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/protocols" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/swarm/log" -) - -const ( - IsActiveProtocol = true -) - -// Convenience wrapper for devp2p protocol messages for transport over pss -type ProtocolMsg struct { - Code uint64 - Size uint32 - Payload []byte - ReceivedAt time.Time -} - -// Creates a ProtocolMsg -func NewProtocolMsg(code uint64, msg interface{}) ([]byte, error) { - - rlpdata, err := rlp.EncodeToBytes(msg) - if err != nil { - return nil, err - } - - // TODO verify that nested structs cannot be used in rlp - smsg := &ProtocolMsg{ - Code: code, - Size: uint32(len(rlpdata)), - Payload: rlpdata, - } - - return rlp.EncodeToBytes(smsg) -} - -// Protocol options to be passed to a new Protocol instance -// -// The parameters specify which encryption schemes to allow -type ProtocolParams struct { - Asymmetric bool - Symmetric bool -} - -// PssReadWriter bridges pss send/receive with devp2p protocol send/receive -// -// Implements p2p.MsgReadWriter -type PssReadWriter struct { - *Pss - LastActive time.Time - rw chan p2p.Msg - spec *protocols.Spec - topic *Topic - sendFunc func(string, Topic, []byte) error - key string - closed bool -} - -// Implements p2p.MsgReader -func (prw *PssReadWriter) ReadMsg() (p2p.Msg, error) { - msg := <-prw.rw - log.Trace(fmt.Sprintf("pssrw readmsg: %v", msg)) - return msg, nil -} - -// Implements p2p.MsgWriter -func (prw *PssReadWriter) WriteMsg(msg p2p.Msg) error { - log.Trace("pssrw writemsg", "msg", msg) - if prw.closed { - return fmt.Errorf("connection closed") - } - rlpdata := make([]byte, msg.Size) - msg.Payload.Read(rlpdata) - pmsg, err := rlp.EncodeToBytes(ProtocolMsg{ - Code: msg.Code, - Size: msg.Size, - Payload: rlpdata, - }) - if err != nil { - return err - } - return prw.sendFunc(prw.key, *prw.topic, pmsg) -} - -// Injects a p2p.Msg into the MsgReadWriter, so that it appears on the associated p2p.MsgReader -func (prw *PssReadWriter) injectMsg(msg p2p.Msg) error { - log.Trace(fmt.Sprintf("pssrw injectmsg: %v", msg)) - prw.rw <- msg - return nil -} - -// Convenience object for emulation devp2p over pss -type Protocol struct { - *Pss - proto *p2p.Protocol - topic *Topic - spec *protocols.Spec - pubKeyRWPool map[string]p2p.MsgReadWriter - symKeyRWPool map[string]p2p.MsgReadWriter - Asymmetric bool - Symmetric bool - RWPoolMu sync.Mutex -} - -// Activates devp2p emulation over a specific pss topic -// -// One or both encryption schemes must be specified. If -// only one is specified, the protocol will not be valid -// for the other, and will make the message handler -// return errors -func RegisterProtocol(ps *Pss, topic *Topic, spec *protocols.Spec, targetprotocol *p2p.Protocol, options *ProtocolParams) (*Protocol, error) { - if !options.Asymmetric && !options.Symmetric { - return nil, fmt.Errorf("specify at least one of asymmetric or symmetric messaging mode") - } - pp := &Protocol{ - Pss: ps, - proto: targetprotocol, - topic: topic, - spec: spec, - pubKeyRWPool: make(map[string]p2p.MsgReadWriter), - symKeyRWPool: make(map[string]p2p.MsgReadWriter), - Asymmetric: options.Asymmetric, - Symmetric: options.Symmetric, - } - return pp, nil -} - -// Generic handler for incoming messages over devp2p emulation -// -// To be passed to pss.Register() -// -// Will run the protocol on a new incoming peer, provided that -// the encryption key of the message has a match in the internal -// pss keypool -// -// Fails if protocol is not valid for the message encryption scheme, -// if adding a new peer fails, or if the message is not a serialized -// p2p.Msg (which it always will be if it is sent from this object). -func (p *Protocol) Handle(msg []byte, peer *p2p.Peer, asymmetric bool, keyid string) error { - var vrw *PssReadWriter - if p.Asymmetric != asymmetric && p.Symmetric == !asymmetric { - return fmt.Errorf("invalid protocol encryption") - } else if (!p.isActiveSymKey(keyid, *p.topic) && !asymmetric) || - (!p.isActiveAsymKey(keyid, *p.topic) && asymmetric) { - - rw, err := p.AddPeer(peer, *p.topic, asymmetric, keyid) - if err != nil { - return err - } else if rw == nil { - return fmt.Errorf("handle called on nil MsgReadWriter for new key " + keyid) - } - vrw = rw.(*PssReadWriter) - } - - pmsg, err := ToP2pMsg(msg) - if err != nil { - return fmt.Errorf("could not decode pssmsg") - } - if asymmetric { - if p.pubKeyRWPool[keyid] == nil { - return fmt.Errorf("handle called on nil MsgReadWriter for key " + keyid) - } - vrw = p.pubKeyRWPool[keyid].(*PssReadWriter) - } else { - if p.symKeyRWPool[keyid] == nil { - return fmt.Errorf("handle called on nil MsgReadWriter for key " + keyid) - } - vrw = p.symKeyRWPool[keyid].(*PssReadWriter) - } - vrw.injectMsg(pmsg) - return nil -} - -// check if (peer) symmetric key is currently registered with this topic -func (p *Protocol) isActiveSymKey(key string, topic Topic) bool { - return p.symKeyRWPool[key] != nil -} - -// check if (peer) asymmetric key is currently registered with this topic -func (p *Protocol) isActiveAsymKey(key string, topic Topic) bool { - return p.pubKeyRWPool[key] != nil -} - -// Creates a serialized (non-buffered) version of a p2p.Msg, used in the specialized internal p2p.MsgReadwriter implementations -func ToP2pMsg(msg []byte) (p2p.Msg, error) { - payload := &ProtocolMsg{} - if err := rlp.DecodeBytes(msg, payload); err != nil { - return p2p.Msg{}, fmt.Errorf("pss protocol handler unable to decode payload as p2p message: %v", err) - } - - return p2p.Msg{ - Code: payload.Code, - Size: uint32(len(payload.Payload)), - ReceivedAt: time.Now(), - Payload: bytes.NewBuffer(payload.Payload), - }, nil -} - -// Runs an emulated pss Protocol on the specified peer, -// linked to a specific topic -// `key` and `asymmetric` specifies what encryption key -// to link the peer to. -// The key must exist in the pss store prior to adding the peer. -func (p *Protocol) AddPeer(peer *p2p.Peer, topic Topic, asymmetric bool, key string) (p2p.MsgReadWriter, error) { - rw := &PssReadWriter{ - Pss: p.Pss, - rw: make(chan p2p.Msg), - spec: p.spec, - topic: p.topic, - key: key, - } - if asymmetric { - rw.sendFunc = p.Pss.SendAsym - } else { - rw.sendFunc = p.Pss.SendSym - } - if asymmetric { - p.Pss.pubKeyPoolMu.Lock() - if _, ok := p.Pss.pubKeyPool[key]; !ok { - return nil, fmt.Errorf("asym key does not exist: %s", key) - } - p.Pss.pubKeyPoolMu.Unlock() - p.RWPoolMu.Lock() - p.pubKeyRWPool[key] = rw - p.RWPoolMu.Unlock() - } else { - p.Pss.symKeyPoolMu.Lock() - if _, ok := p.Pss.symKeyPool[key]; !ok { - return nil, fmt.Errorf("symkey does not exist: %s", key) - } - p.Pss.symKeyPoolMu.Unlock() - p.RWPoolMu.Lock() - p.symKeyRWPool[key] = rw - p.RWPoolMu.Unlock() - } - go func() { - err := p.proto.Run(peer, rw) - log.Warn(fmt.Sprintf("pss vprotocol quit on %v topic %v: %v", peer, topic, err)) - }() - return rw, nil -} - -func (p *Protocol) RemovePeer(asymmetric bool, key string) { - log.Debug("closing pss peer", "asym", asymmetric, "key", key) - p.RWPoolMu.Lock() - defer p.RWPoolMu.Unlock() - if asymmetric { - rw := p.pubKeyRWPool[key].(*PssReadWriter) - rw.closed = true - delete(p.pubKeyRWPool, key) - } else { - rw := p.symKeyRWPool[key].(*PssReadWriter) - rw.closed = true - delete(p.symKeyRWPool, key) - } -} - -// Uniform translation of protocol specifiers to topic -func ProtocolTopic(spec *protocols.Spec) Topic { - return BytesToTopic([]byte(fmt.Sprintf("%s:%d", spec.Name, spec.Version))) -} diff --git a/swarm/pss/protocol_none.go b/swarm/pss/protocol_none.go deleted file mode 100644 index c92be3f902e7..000000000000 --- a/swarm/pss/protocol_none.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2018 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 . - -// +build nopssprotocol - -package pss - -const ( - IsActiveProtocol = false -) diff --git a/swarm/pss/protocol_test.go b/swarm/pss/protocol_test.go deleted file mode 100644 index 3bc9ab358439..000000000000 --- a/swarm/pss/protocol_test.go +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2018 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 pss - -import ( - "bytes" - "context" - "fmt" - "strconv" - "strings" - "testing" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/swarm/log" -) - -type protoCtrl struct { - C chan bool - protocol *Protocol - run func(*p2p.Peer, p2p.MsgReadWriter) error -} - -// simple ping pong protocol test for the pss devp2p emulation -func TestProtocol(t *testing.T) { - t.Run("32", testProtocol) - t.Run("8", testProtocol) - t.Run("0", testProtocol) -} - -func testProtocol(t *testing.T) { - - // address hint size - var addrsize int64 - paramstring := strings.Split(t.Name(), "/") - addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0) - log.Info("protocol test", "addrsize", addrsize) - - topic := PingTopic.String() - - clients, err := setupNetwork(2, false) - if err != nil { - t.Fatal(err) - } - var loaddrhex string - err = clients[0].Call(&loaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 1 baseaddr fail: %v", err) - } - loaddrhex = loaddrhex[:2+(addrsize*2)] - var roaddrhex string - err = clients[1].Call(&roaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 2 baseaddr fail: %v", err) - } - roaddrhex = roaddrhex[:2+(addrsize*2)] - lnodeinfo := &p2p.NodeInfo{} - err = clients[0].Call(&lnodeinfo, "admin_nodeInfo") - if err != nil { - t.Fatalf("rpc nodeinfo node 11 fail: %v", err) - } - - var lpubkey string - err = clients[0].Call(&lpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 1 pubkey fail: %v", err) - } - var rpubkey string - err = clients[1].Call(&rpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 2 pubkey fail: %v", err) - } - - time.Sleep(time.Millisecond * 1000) // replace with hive healthy code - - lmsgC := make(chan APIMsg) - lctx, cancel := context.WithTimeout(context.Background(), time.Second*10) - defer cancel() - lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic, false, false) - if err != nil { - t.Fatal(err) - } - defer lsub.Unsubscribe() - rmsgC := make(chan APIMsg) - rctx, cancel := context.WithTimeout(context.Background(), time.Second*10) - defer cancel() - rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic, false, false) - if err != nil { - t.Fatal(err) - } - defer rsub.Unsubscribe() - - // set reciprocal public keys - err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddrhex) - if err != nil { - t.Fatal(err) - } - err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddrhex) - if err != nil { - t.Fatal(err) - } - - // add right peer's public key as protocol peer on left - p := p2p.NewPeer(enode.ID{}, fmt.Sprintf("%x", common.FromHex(loaddrhex)), []p2p.Cap{}) - _, err = pssprotocols[lnodeinfo.ID].protocol.AddPeer(p, PingTopic, true, rpubkey) - if err != nil { - t.Fatal(err) - } - - // sends ping asym, checks delivery - pssprotocols[lnodeinfo.ID].C <- false - select { - case <-lmsgC: - log.Debug("lnode ok") - case cerr := <-lctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - return - } - select { - case <-rmsgC: - log.Debug("rnode ok") - case cerr := <-lctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - } - - // sends ping asym, checks delivery - pssprotocols[lnodeinfo.ID].C <- false - select { - case <-lmsgC: - log.Debug("lnode ok") - case cerr := <-lctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - } - select { - case <-rmsgC: - log.Debug("rnode ok") - case cerr := <-lctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - } - rw := pssprotocols[lnodeinfo.ID].protocol.pubKeyRWPool[rpubkey] - pssprotocols[lnodeinfo.ID].protocol.RemovePeer(true, rpubkey) - if err := rw.WriteMsg(p2p.Msg{ - Size: 3, - Payload: bytes.NewReader([]byte("foo")), - }); err == nil { - t.Fatalf("expected error on write") - } -} diff --git a/swarm/pss/pss.go b/swarm/pss/pss.go deleted file mode 100644 index 1c078d03796f..000000000000 --- a/swarm/pss/pss.go +++ /dev/null @@ -1,1077 +0,0 @@ -// Copyright 2018 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 pss - -import ( - "bytes" - "context" - "crypto/ecdsa" - "crypto/rand" - "errors" - "fmt" - "hash" - "sync" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/protocols" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/pot" - "github.com/nebulaai/nbai-node/swarm/storage" - whisper "github.com/nebulaai/nbai-node/whisper/whisperv5" - "golang.org/x/crypto/sha3" -) - -const ( - defaultPaddingByteSize = 16 - DefaultMsgTTL = time.Second * 120 - defaultDigestCacheTTL = time.Second * 10 - defaultSymKeyCacheCapacity = 512 - digestLength = 32 // byte length of digest used for pss cache (currently same as swarm chunk hash) - defaultWhisperWorkTime = 3 - defaultWhisperPoW = 0.0000000001 - defaultMaxMsgSize = 1024 * 1024 - defaultCleanInterval = time.Second * 60 * 10 - defaultOutboxCapacity = 100000 - pssProtocolName = "pss" - pssVersion = 2 - hasherCount = 8 -) - -var ( - addressLength = len(pot.Address{}) -) - -// cache is used for preventing backwards routing -// will also be instrumental in flood guard mechanism -// and mailbox implementation -type pssCacheEntry struct { - expiresAt time.Time -} - -// abstraction to enable access to p2p.protocols.Peer.Send -type senderPeer interface { - Info() *p2p.PeerInfo - ID() enode.ID - Address() []byte - Send(context.Context, interface{}) error -} - -// per-key peer related information -// member `protected` prevents garbage collection of the instance -type pssPeer struct { - lastSeen time.Time - address PssAddress - protected bool -} - -// Pss configuration parameters -type PssParams struct { - MsgTTL time.Duration - CacheTTL time.Duration - privateKey *ecdsa.PrivateKey - SymKeyCacheCapacity int - AllowRaw bool // If true, enables sending and receiving messages without builtin pss encryption -} - -// Sane defaults for Pss -func NewPssParams() *PssParams { - return &PssParams{ - MsgTTL: DefaultMsgTTL, - CacheTTL: defaultDigestCacheTTL, - SymKeyCacheCapacity: defaultSymKeyCacheCapacity, - } -} - -func (params *PssParams) WithPrivateKey(privatekey *ecdsa.PrivateKey) *PssParams { - params.privateKey = privatekey - return params -} - -// Toplevel pss object, takes care of message sending, receiving, decryption and encryption, message handler dispatchers and message forwarding. -// -// Implements node.Service -type Pss struct { - *network.Kademlia // we can get the Kademlia address from this - privateKey *ecdsa.PrivateKey // pss can have it's own independent key - w *whisper.Whisper // key and encryption backend - auxAPIs []rpc.API // builtins (handshake, test) can add APIs - - // sending and forwarding - fwdPool map[string]*protocols.Peer // keep track of all peers sitting on the pssmsg routing layer - fwdPoolMu sync.RWMutex - fwdCache map[pssDigest]pssCacheEntry // checksum of unique fields from pssmsg mapped to expiry, cache to determine whether to drop msg - fwdCacheMu sync.RWMutex - cacheTTL time.Duration // how long to keep messages in fwdCache (not implemented) - msgTTL time.Duration - paddingByteSize int - capstring string - outbox chan *PssMsg - - // keys and peers - pubKeyPool map[string]map[Topic]*pssPeer // mapping of hex public keys to peer address by topic. - pubKeyPoolMu sync.RWMutex - symKeyPool map[string]map[Topic]*pssPeer // mapping of symkeyids to peer address by topic. - symKeyPoolMu sync.RWMutex - symKeyDecryptCache []*string // fast lookup of symkeys recently used for decryption; last used is on top of stack - symKeyDecryptCacheCursor int // modular cursor pointing to last used, wraps on symKeyDecryptCache array - symKeyDecryptCacheCapacity int // max amount of symkeys to keep. - - // message handling - handlers map[Topic]map[*handler]bool // topic and version based pss payload handlers. See pss.Handle() - handlersMu sync.RWMutex - hashPool sync.Pool - topicHandlerCaps map[Topic]*handlerCaps // caches capabilities of each topic's handlers (see handlerCap* consts in types.go) - - // process - quitC chan struct{} -} - -func (p *Pss) String() string { - return fmt.Sprintf("pss: addr %x, pubkey %v", p.BaseAddr(), common.ToHex(crypto.FromECDSAPub(&p.privateKey.PublicKey))) -} - -// Creates a new Pss instance. -// -// In addition to params, it takes a swarm network Kademlia -// and a FileStore storage for message cache storage. -func NewPss(k *network.Kademlia, params *PssParams) (*Pss, error) { - if params.privateKey == nil { - return nil, errors.New("missing private key for pss") - } - cap := p2p.Cap{ - Name: pssProtocolName, - Version: pssVersion, - } - ps := &Pss{ - Kademlia: k, - privateKey: params.privateKey, - w: whisper.New(&whisper.DefaultConfig), - quitC: make(chan struct{}), - - fwdPool: make(map[string]*protocols.Peer), - fwdCache: make(map[pssDigest]pssCacheEntry), - cacheTTL: params.CacheTTL, - msgTTL: params.MsgTTL, - paddingByteSize: defaultPaddingByteSize, - capstring: cap.String(), - outbox: make(chan *PssMsg, defaultOutboxCapacity), - - pubKeyPool: make(map[string]map[Topic]*pssPeer), - symKeyPool: make(map[string]map[Topic]*pssPeer), - symKeyDecryptCache: make([]*string, params.SymKeyCacheCapacity), - symKeyDecryptCacheCapacity: params.SymKeyCacheCapacity, - - handlers: make(map[Topic]map[*handler]bool), - topicHandlerCaps: make(map[Topic]*handlerCaps), - - hashPool: sync.Pool{ - New: func() interface{} { - return sha3.NewLegacyKeccak256() - }, - }, - } - - for i := 0; i < hasherCount; i++ { - hashfunc := storage.MakeHashFunc(storage.DefaultHash)() - ps.hashPool.Put(hashfunc) - } - - return ps, nil -} - -///////////////////////////////////////////////////////////////////// -// SECTION: node.Service interface -///////////////////////////////////////////////////////////////////// - -func (p *Pss) Start(srv *p2p.Server) error { - go func() { - ticker := time.NewTicker(defaultCleanInterval) - cacheTicker := time.NewTicker(p.cacheTTL) - defer ticker.Stop() - defer cacheTicker.Stop() - for { - select { - case <-cacheTicker.C: - p.cleanFwdCache() - case <-ticker.C: - p.cleanKeys() - case <-p.quitC: - return - } - } - }() - go func() { - for { - select { - case msg := <-p.outbox: - err := p.forward(msg) - if err != nil { - log.Error(err.Error()) - metrics.GetOrRegisterCounter("pss.forward.err", nil).Inc(1) - } - case <-p.quitC: - return - } - } - }() - log.Info("Started Pss") - log.Info("Loaded EC keys", "pubkey", common.ToHex(crypto.FromECDSAPub(p.PublicKey())), "secp256", common.ToHex(crypto.CompressPubkey(p.PublicKey()))) - return nil -} - -func (p *Pss) Stop() error { - log.Info("Pss shutting down") - close(p.quitC) - return nil -} - -var pssSpec = &protocols.Spec{ - Name: pssProtocolName, - Version: pssVersion, - MaxMsgSize: defaultMaxMsgSize, - Messages: []interface{}{ - PssMsg{}, - }, -} - -func (p *Pss) Protocols() []p2p.Protocol { - return []p2p.Protocol{ - { - Name: pssSpec.Name, - Version: pssSpec.Version, - Length: pssSpec.Length(), - Run: p.Run, - }, - } -} - -func (p *Pss) Run(peer *p2p.Peer, rw p2p.MsgReadWriter) error { - pp := protocols.NewPeer(peer, rw, pssSpec) - p.fwdPoolMu.Lock() - p.fwdPool[peer.Info().ID] = pp - p.fwdPoolMu.Unlock() - return pp.Run(p.handlePssMsg) -} - -func (p *Pss) APIs() []rpc.API { - apis := []rpc.API{ - { - Namespace: "pss", - Version: "1.0", - Service: NewAPI(p), - Public: true, - }, - } - apis = append(apis, p.auxAPIs...) - return apis -} - -// add API methods to the pss API -// must be run before node is started -func (p *Pss) addAPI(api rpc.API) { - p.auxAPIs = append(p.auxAPIs, api) -} - -// Returns the swarm Kademlia address of the pss node -func (p *Pss) BaseAddr() []byte { - return p.Kademlia.BaseAddr() -} - -// Returns the pss node's public key -func (p *Pss) PublicKey() *ecdsa.PublicKey { - return &p.privateKey.PublicKey -} - -///////////////////////////////////////////////////////////////////// -// SECTION: Message handling -///////////////////////////////////////////////////////////////////// - -// Links a handler function to a Topic -// -// All incoming messages with an envelope Topic matching the -// topic specified will be passed to the given Handler function. -// -// There may be an arbitrary number of handler functions per topic. -// -// Returns a deregister function which needs to be called to -// deregister the handler, -func (p *Pss) Register(topic *Topic, hndlr *handler) func() { - p.handlersMu.Lock() - defer p.handlersMu.Unlock() - handlers := p.handlers[*topic] - if handlers == nil { - handlers = make(map[*handler]bool) - p.handlers[*topic] = handlers - log.Debug("registered handler", "caps", hndlr.caps) - } - if hndlr.caps == nil { - hndlr.caps = &handlerCaps{} - } - handlers[hndlr] = true - if _, ok := p.topicHandlerCaps[*topic]; !ok { - p.topicHandlerCaps[*topic] = &handlerCaps{} - } - if hndlr.caps.raw { - p.topicHandlerCaps[*topic].raw = true - } - if hndlr.caps.prox { - p.topicHandlerCaps[*topic].prox = true - } - return func() { p.deregister(topic, hndlr) } -} -func (p *Pss) deregister(topic *Topic, hndlr *handler) { - p.handlersMu.Lock() - defer p.handlersMu.Unlock() - handlers := p.handlers[*topic] - if len(handlers) > 1 { - delete(p.handlers, *topic) - // topic caps might have changed now that a handler is gone - caps := &handlerCaps{} - for h := range handlers { - if h.caps.raw { - caps.raw = true - } - if h.caps.prox { - caps.prox = true - } - } - p.topicHandlerCaps[*topic] = caps - return - } - delete(handlers, hndlr) -} - -// get all registered handlers for respective topics -func (p *Pss) getHandlers(topic Topic) map[*handler]bool { - p.handlersMu.RLock() - defer p.handlersMu.RUnlock() - return p.handlers[topic] -} - -// Filters incoming messages for processing or forwarding. -// Check if address partially matches -// If yes, it CAN be for us, and we process it -// Only passes error to pss protocol handler if payload is not valid pssmsg -func (p *Pss) handlePssMsg(ctx context.Context, msg interface{}) error { - metrics.GetOrRegisterCounter("pss.handlepssmsg", nil).Inc(1) - pssmsg, ok := msg.(*PssMsg) - if !ok { - return fmt.Errorf("invalid message type. Expected *PssMsg, got %T ", msg) - } - log.Trace("handler", "self", label(p.Kademlia.BaseAddr()), "topic", label(pssmsg.Payload.Topic[:])) - if int64(pssmsg.Expire) < time.Now().Unix() { - metrics.GetOrRegisterCounter("pss.expire", nil).Inc(1) - log.Warn("pss filtered expired message", "from", common.ToHex(p.Kademlia.BaseAddr()), "to", common.ToHex(pssmsg.To)) - return nil - } - if p.checkFwdCache(pssmsg) { - log.Trace("pss relay block-cache match (process)", "from", common.ToHex(p.Kademlia.BaseAddr()), "to", (common.ToHex(pssmsg.To))) - return nil - } - p.addFwdCache(pssmsg) - - psstopic := Topic(pssmsg.Payload.Topic) - - // raw is simplest handler contingency to check, so check that first - var isRaw bool - if pssmsg.isRaw() { - if _, ok := p.topicHandlerCaps[psstopic]; ok { - if !p.topicHandlerCaps[psstopic].raw { - log.Debug("No handler for raw message", "topic", psstopic) - return nil - } - } - isRaw = true - } - - // check if we can be recipient: - // - no prox handler on message and partial address matches - // - prox handler on message and we are in prox regardless of partial address match - // store this result so we don't calculate again on every handler - var isProx bool - if _, ok := p.topicHandlerCaps[psstopic]; ok { - isProx = p.topicHandlerCaps[psstopic].prox - } - isRecipient := p.isSelfPossibleRecipient(pssmsg, isProx) - if !isRecipient { - log.Trace("pss was for someone else :'( ... forwarding", "pss", common.ToHex(p.BaseAddr()), "prox", isProx) - return p.enqueue(pssmsg) - } - - log.Trace("pss for us, yay! ... let's process!", "pss", common.ToHex(p.BaseAddr()), "prox", isProx, "raw", isRaw, "topic", label(pssmsg.Payload.Topic[:])) - if err := p.process(pssmsg, isRaw, isProx); err != nil { - qerr := p.enqueue(pssmsg) - if qerr != nil { - return fmt.Errorf("process fail: processerr %v, queueerr: %v", err, qerr) - } - } - return nil - -} - -// Entry point to processing a message for which the current node can be the intended recipient. -// Attempts symmetric and asymmetric decryption with stored keys. -// Dispatches message to all handlers matching the message topic -func (p *Pss) process(pssmsg *PssMsg, raw bool, prox bool) error { - metrics.GetOrRegisterCounter("pss.process", nil).Inc(1) - - var err error - var recvmsg *whisper.ReceivedMessage - var payload []byte - var from PssAddress - var asymmetric bool - var keyid string - var keyFunc func(envelope *whisper.Envelope) (*whisper.ReceivedMessage, string, PssAddress, error) - - envelope := pssmsg.Payload - psstopic := Topic(envelope.Topic) - - if raw { - payload = pssmsg.Payload.Data - } else { - if pssmsg.isSym() { - keyFunc = p.processSym - } else { - asymmetric = true - keyFunc = p.processAsym - } - - recvmsg, keyid, from, err = keyFunc(envelope) - if err != nil { - return errors.New("Decryption failed") - } - payload = recvmsg.Payload - } - - if len(pssmsg.To) < addressLength { - if err := p.enqueue(pssmsg); err != nil { - return err - } - } - p.executeHandlers(psstopic, payload, from, raw, prox, asymmetric, keyid) - - return nil - -} - -func (p *Pss) executeHandlers(topic Topic, payload []byte, from PssAddress, raw bool, prox bool, asymmetric bool, keyid string) { - handlers := p.getHandlers(topic) - peer := p2p.NewPeer(enode.ID{}, fmt.Sprintf("%x", from), []p2p.Cap{}) - for h := range handlers { - if !h.caps.raw && raw { - log.Warn("norawhandler") - continue - } - if !h.caps.prox && prox { - log.Warn("noproxhandler") - continue - } - err := (h.f)(payload, peer, asymmetric, keyid) - if err != nil { - log.Warn("Pss handler failed", "err", err) - } - } -} - -// will return false if using partial address -func (p *Pss) isSelfRecipient(msg *PssMsg) bool { - return bytes.Equal(msg.To, p.Kademlia.BaseAddr()) -} - -// test match of leftmost bytes in given message to node's Kademlia address -func (p *Pss) isSelfPossibleRecipient(msg *PssMsg, prox bool) bool { - local := p.Kademlia.BaseAddr() - - // if a partial address matches we are possible recipient regardless of prox - // if not and prox is not set, we are surely not - if bytes.Equal(msg.To, local[:len(msg.To)]) { - - return true - } else if !prox { - return false - } - - depth := p.Kademlia.NeighbourhoodDepth() - po, _ := network.Pof(p.Kademlia.BaseAddr(), msg.To, 0) - log.Trace("selfpossible", "po", po, "depth", depth) - - return depth <= po -} - -///////////////////////////////////////////////////////////////////// -// SECTION: Encryption -///////////////////////////////////////////////////////////////////// - -// Links a peer ECDSA public key to a topic -// -// This is required for asymmetric message exchange -// on the given topic -// -// The value in `address` will be used as a routing hint for the -// public key / topic association -func (p *Pss) SetPeerPublicKey(pubkey *ecdsa.PublicKey, topic Topic, address PssAddress) error { - if err := validateAddress(address); err != nil { - return err - } - pubkeybytes := crypto.FromECDSAPub(pubkey) - if len(pubkeybytes) == 0 { - return fmt.Errorf("invalid public key: %v", pubkey) - } - pubkeyid := common.ToHex(pubkeybytes) - psp := &pssPeer{ - address: address, - } - p.pubKeyPoolMu.Lock() - if _, ok := p.pubKeyPool[pubkeyid]; !ok { - p.pubKeyPool[pubkeyid] = make(map[Topic]*pssPeer) - } - p.pubKeyPool[pubkeyid][topic] = psp - p.pubKeyPoolMu.Unlock() - log.Trace("added pubkey", "pubkeyid", pubkeyid, "topic", topic, "address", address) - return nil -} - -// Automatically generate a new symkey for a topic and address hint -func (p *Pss) GenerateSymmetricKey(topic Topic, address PssAddress, addToCache bool) (string, error) { - keyid, err := p.w.GenerateSymKey() - if err != nil { - return "", err - } - p.addSymmetricKeyToPool(keyid, topic, address, addToCache, false) - return keyid, nil -} - -// Links a peer symmetric key (arbitrary byte sequence) to a topic -// -// This is required for symmetrically encrypted message exchange -// on the given topic -// -// The key is stored in the whisper backend. -// -// If addtocache is set to true, the key will be added to the cache of keys -// used to attempt symmetric decryption of incoming messages. -// -// Returns a string id that can be used to retrieve the key bytes -// from the whisper backend (see pss.GetSymmetricKey()) -func (p *Pss) SetSymmetricKey(key []byte, topic Topic, address PssAddress, addtocache bool) (string, error) { - if err := validateAddress(address); err != nil { - return "", err - } - return p.setSymmetricKey(key, topic, address, addtocache, true) -} - -func (p *Pss) setSymmetricKey(key []byte, topic Topic, address PssAddress, addtocache bool, protected bool) (string, error) { - keyid, err := p.w.AddSymKeyDirect(key) - if err != nil { - return "", err - } - p.addSymmetricKeyToPool(keyid, topic, address, addtocache, protected) - return keyid, nil -} - -// adds a symmetric key to the pss key pool, and optionally adds the key -// to the collection of keys used to attempt symmetric decryption of -// incoming messages -func (p *Pss) addSymmetricKeyToPool(keyid string, topic Topic, address PssAddress, addtocache bool, protected bool) { - psp := &pssPeer{ - address: address, - protected: protected, - } - p.symKeyPoolMu.Lock() - if _, ok := p.symKeyPool[keyid]; !ok { - p.symKeyPool[keyid] = make(map[Topic]*pssPeer) - } - p.symKeyPool[keyid][topic] = psp - p.symKeyPoolMu.Unlock() - if addtocache { - p.symKeyDecryptCacheCursor++ - p.symKeyDecryptCache[p.symKeyDecryptCacheCursor%cap(p.symKeyDecryptCache)] = &keyid - } - key, _ := p.GetSymmetricKey(keyid) - log.Trace("added symkey", "symkeyid", keyid, "symkey", common.ToHex(key), "topic", topic, "address", address, "cache", addtocache) -} - -// Returns a symmetric key byte seqyence stored in the whisper backend -// by its unique id -// -// Passes on the error value from the whisper backend -func (p *Pss) GetSymmetricKey(symkeyid string) ([]byte, error) { - symkey, err := p.w.GetSymKey(symkeyid) - if err != nil { - return nil, err - } - return symkey, nil -} - -// Returns all recorded topic and address combination for a specific public key -func (p *Pss) GetPublickeyPeers(keyid string) (topic []Topic, address []PssAddress, err error) { - p.pubKeyPoolMu.RLock() - defer p.pubKeyPoolMu.RUnlock() - for t, peer := range p.pubKeyPool[keyid] { - topic = append(topic, t) - address = append(address, peer.address) - } - - return topic, address, nil -} - -func (p *Pss) getPeerAddress(keyid string, topic Topic) (PssAddress, error) { - p.pubKeyPoolMu.RLock() - defer p.pubKeyPoolMu.RUnlock() - if peers, ok := p.pubKeyPool[keyid]; ok { - if t, ok := peers[topic]; ok { - return t.address, nil - } - } - return nil, fmt.Errorf("peer with pubkey %s, topic %x not found", keyid, topic) -} - -// Attempt to decrypt, validate and unpack a -// symmetrically encrypted message -// If successful, returns the unpacked whisper ReceivedMessage struct -// encapsulating the decrypted message, and the whisper backend id -// of the symmetric key used to decrypt the message. -// It fails if decryption of the message fails or if the message is corrupted -func (p *Pss) processSym(envelope *whisper.Envelope) (*whisper.ReceivedMessage, string, PssAddress, error) { - metrics.GetOrRegisterCounter("pss.process.sym", nil).Inc(1) - - for i := p.symKeyDecryptCacheCursor; i > p.symKeyDecryptCacheCursor-cap(p.symKeyDecryptCache) && i > 0; i-- { - symkeyid := p.symKeyDecryptCache[i%cap(p.symKeyDecryptCache)] - symkey, err := p.w.GetSymKey(*symkeyid) - if err != nil { - continue - } - recvmsg, err := envelope.OpenSymmetric(symkey) - if err != nil { - continue - } - if !recvmsg.Validate() { - return nil, "", nil, fmt.Errorf("symmetrically encrypted message has invalid signature or is corrupt") - } - p.symKeyPoolMu.Lock() - from := p.symKeyPool[*symkeyid][Topic(envelope.Topic)].address - p.symKeyPoolMu.Unlock() - p.symKeyDecryptCacheCursor++ - p.symKeyDecryptCache[p.symKeyDecryptCacheCursor%cap(p.symKeyDecryptCache)] = symkeyid - return recvmsg, *symkeyid, from, nil - } - return nil, "", nil, fmt.Errorf("could not decrypt message") -} - -// Attempt to decrypt, validate and unpack an -// asymmetrically encrypted message -// If successful, returns the unpacked whisper ReceivedMessage struct -// encapsulating the decrypted message, and the byte representation of -// the public key used to decrypt the message. -// It fails if decryption of message fails, or if the message is corrupted -func (p *Pss) processAsym(envelope *whisper.Envelope) (*whisper.ReceivedMessage, string, PssAddress, error) { - metrics.GetOrRegisterCounter("pss.process.asym", nil).Inc(1) - - recvmsg, err := envelope.OpenAsymmetric(p.privateKey) - if err != nil { - return nil, "", nil, fmt.Errorf("could not decrypt message: %s", err) - } - // check signature (if signed), strip padding - if !recvmsg.Validate() { - return nil, "", nil, fmt.Errorf("invalid message") - } - pubkeyid := common.ToHex(crypto.FromECDSAPub(recvmsg.Src)) - var from PssAddress - p.pubKeyPoolMu.Lock() - if p.pubKeyPool[pubkeyid][Topic(envelope.Topic)] != nil { - from = p.pubKeyPool[pubkeyid][Topic(envelope.Topic)].address - } - p.pubKeyPoolMu.Unlock() - return recvmsg, pubkeyid, from, nil -} - -// Symkey garbage collection -// a key is removed if: -// - it is not marked as protected -// - it is not in the incoming decryption cache -func (p *Pss) cleanKeys() (count int) { - for keyid, peertopics := range p.symKeyPool { - var expiredtopics []Topic - for topic, psp := range peertopics { - if psp.protected { - continue - } - - var match bool - for i := p.symKeyDecryptCacheCursor; i > p.symKeyDecryptCacheCursor-cap(p.symKeyDecryptCache) && i > 0; i-- { - cacheid := p.symKeyDecryptCache[i%cap(p.symKeyDecryptCache)] - if *cacheid == keyid { - match = true - } - } - if !match { - expiredtopics = append(expiredtopics, topic) - } - } - for _, topic := range expiredtopics { - p.symKeyPoolMu.Lock() - delete(p.symKeyPool[keyid], topic) - log.Trace("symkey cleanup deletion", "symkeyid", keyid, "topic", topic, "val", p.symKeyPool[keyid]) - p.symKeyPoolMu.Unlock() - count++ - } - } - return -} - -///////////////////////////////////////////////////////////////////// -// SECTION: Message sending -///////////////////////////////////////////////////////////////////// - -func (p *Pss) enqueue(msg *PssMsg) error { - select { - case p.outbox <- msg: - return nil - default: - } - - metrics.GetOrRegisterCounter("pss.enqueue.outbox.full", nil).Inc(1) - return errors.New("outbox full") -} - -// Send a raw message (any encryption is responsibility of calling client) -// -// Will fail if raw messages are disallowed -func (p *Pss) SendRaw(address PssAddress, topic Topic, msg []byte) error { - if err := validateAddress(address); err != nil { - return err - } - pssMsgParams := &msgParams{ - raw: true, - } - payload := &whisper.Envelope{ - Data: msg, - Topic: whisper.TopicType(topic), - } - pssMsg := newPssMsg(pssMsgParams) - pssMsg.To = address - pssMsg.Expire = uint32(time.Now().Add(p.msgTTL).Unix()) - pssMsg.Payload = payload - p.addFwdCache(pssMsg) - err := p.enqueue(pssMsg) - if err != nil { - return err - } - - // if we have a proxhandler on this topic - // also deliver message to ourselves - if _, ok := p.topicHandlerCaps[topic]; ok { - if p.isSelfPossibleRecipient(pssMsg, true) && p.topicHandlerCaps[topic].prox { - return p.process(pssMsg, true, true) - } - } - return nil -} - -// Send a message using symmetric encryption -// -// Fails if the key id does not match any of the stored symmetric keys -func (p *Pss) SendSym(symkeyid string, topic Topic, msg []byte) error { - symkey, err := p.GetSymmetricKey(symkeyid) - if err != nil { - return fmt.Errorf("missing valid send symkey %s: %v", symkeyid, err) - } - p.symKeyPoolMu.Lock() - psp, ok := p.symKeyPool[symkeyid][topic] - p.symKeyPoolMu.Unlock() - if !ok { - return fmt.Errorf("invalid topic '%s' for symkey '%s'", topic.String(), symkeyid) - } - return p.send(psp.address, topic, msg, false, symkey) -} - -// Send a message using asymmetric encryption -// -// Fails if the key id does not match any in of the stored public keys -func (p *Pss) SendAsym(pubkeyid string, topic Topic, msg []byte) error { - if _, err := crypto.UnmarshalPubkey(common.FromHex(pubkeyid)); err != nil { - return fmt.Errorf("Cannot unmarshal pubkey: %x", pubkeyid) - } - p.pubKeyPoolMu.Lock() - psp, ok := p.pubKeyPool[pubkeyid][topic] - p.pubKeyPoolMu.Unlock() - if !ok { - return fmt.Errorf("invalid topic '%s' for pubkey '%s'", topic.String(), pubkeyid) - } - return p.send(psp.address, topic, msg, true, common.FromHex(pubkeyid)) -} - -// Send is payload agnostic, and will accept any byte slice as payload -// It generates an whisper envelope for the specified recipient and topic, -// and wraps the message payload in it. -// TODO: Implement proper message padding -func (p *Pss) send(to []byte, topic Topic, msg []byte, asymmetric bool, key []byte) error { - metrics.GetOrRegisterCounter("pss.send", nil).Inc(1) - - if key == nil || bytes.Equal(key, []byte{}) { - return fmt.Errorf("Zero length key passed to pss send") - } - padding := make([]byte, p.paddingByteSize) - c, err := rand.Read(padding) - if err != nil { - return err - } else if c < p.paddingByteSize { - return fmt.Errorf("invalid padding length: %d", c) - } - wparams := &whisper.MessageParams{ - TTL: defaultWhisperTTL, - Src: p.privateKey, - Topic: whisper.TopicType(topic), - WorkTime: defaultWhisperWorkTime, - PoW: defaultWhisperPoW, - Payload: msg, - Padding: padding, - } - if asymmetric { - pk, err := crypto.UnmarshalPubkey(key) - if err != nil { - return fmt.Errorf("Cannot unmarshal pubkey: %x", key) - } - wparams.Dst = pk - } else { - wparams.KeySym = key - } - // set up outgoing message container, which does encryption and envelope wrapping - woutmsg, err := whisper.NewSentMessage(wparams) - if err != nil { - return fmt.Errorf("failed to generate whisper message encapsulation: %v", err) - } - // performs encryption. - // Does NOT perform / performs negligible PoW due to very low difficulty setting - // after this the message is ready for sending - envelope, err := woutmsg.Wrap(wparams) - if err != nil { - return fmt.Errorf("failed to perform whisper encryption: %v", err) - } - log.Trace("pssmsg whisper done", "env", envelope, "wparams payload", common.ToHex(wparams.Payload), "to", common.ToHex(to), "asym", asymmetric, "key", common.ToHex(key)) - - // prepare for devp2p transport - pssMsgParams := &msgParams{ - sym: !asymmetric, - } - pssMsg := newPssMsg(pssMsgParams) - pssMsg.To = to - pssMsg.Expire = uint32(time.Now().Add(p.msgTTL).Unix()) - pssMsg.Payload = envelope - err = p.enqueue(pssMsg) - if err != nil { - return err - } - if _, ok := p.topicHandlerCaps[topic]; ok { - if p.isSelfPossibleRecipient(pssMsg, true) && p.topicHandlerCaps[topic].prox { - return p.process(pssMsg, true, true) - } - } - return nil -} - -// sendFunc is a helper function that tries to send a message and returns true on success. -// It is set here for usage in production, and optionally overridden in tests. -var sendFunc func(p *Pss, sp *network.Peer, msg *PssMsg) bool = sendMsg - -// tries to send a message, returns true if successful -func sendMsg(p *Pss, sp *network.Peer, msg *PssMsg) bool { - var isPssEnabled bool - info := sp.Info() - for _, capability := range info.Caps { - if capability == p.capstring { - isPssEnabled = true - break - } - } - if !isPssEnabled { - log.Error("peer doesn't have matching pss capabilities, skipping", "peer", info.Name, "caps", info.Caps) - return false - } - - // get the protocol peer from the forwarding peer cache - p.fwdPoolMu.RLock() - pp := p.fwdPool[sp.Info().ID] - p.fwdPoolMu.RUnlock() - - err := pp.Send(context.TODO(), msg) - if err != nil { - metrics.GetOrRegisterCounter("pss.pp.send.error", nil).Inc(1) - log.Error(err.Error()) - } - - return err == nil -} - -// Forwards a pss message to the peer(s) based on recipient address according to the algorithm -// described below. The recipient address can be of any length, and the byte slice will be matched -// to the MSB slice of the peer address of the equivalent length. -// -// If the recipient address (or partial address) is within the neighbourhood depth of the forwarding -// node, then it will be forwarded to all the nearest neighbours of the forwarding node. In case of -// partial address, it should be forwarded to all the peers matching the partial address, if there -// are any; otherwise only to one peer, closest to the recipient address. In any case, if the message -// forwarding fails, the node should try to forward it to the next best peer, until the message is -// successfully forwarded to at least one peer. -func (p *Pss) forward(msg *PssMsg) error { - metrics.GetOrRegisterCounter("pss.forward", nil).Inc(1) - sent := 0 // number of successful sends - to := make([]byte, addressLength) - copy(to[:len(msg.To)], msg.To) - neighbourhoodDepth := p.Kademlia.NeighbourhoodDepth() - - // luminosity is the opposite of darkness. the more bytes are removed from the address, the higher is darkness, - // but the luminosity is less. here luminosity equals the number of bits given in the destination address. - luminosityRadius := len(msg.To) * 8 - - // proximity order function matching up to neighbourhoodDepth bits (po <= neighbourhoodDepth) - pof := pot.DefaultPof(neighbourhoodDepth) - - // soft threshold for msg broadcast - broadcastThreshold, _ := pof(to, p.BaseAddr(), 0) - if broadcastThreshold > luminosityRadius { - broadcastThreshold = luminosityRadius - } - - var onlySendOnce bool // indicates if the message should only be sent to one peer with closest address - - // if measured from the recipient address as opposed to the base address (see Kademlia.EachConn - // call below), then peers that fall in the same proximity bin as recipient address will appear - // [at least] one bit closer, but only if these additional bits are given in the recipient address. - if broadcastThreshold < luminosityRadius && broadcastThreshold < neighbourhoodDepth { - broadcastThreshold++ - onlySendOnce = true - } - - p.Kademlia.EachConn(to, addressLength*8, func(sp *network.Peer, po int) bool { - if po < broadcastThreshold && sent > 0 { - return false // stop iterating - } - if sendFunc(p, sp, msg) { - sent++ - if onlySendOnce { - return false - } - if po == addressLength*8 { - // stop iterating if successfully sent to the exact recipient (perfect match of full address) - return false - } - } - return true - }) - - // if we failed to send to anyone, re-insert message in the send-queue - if sent == 0 { - log.Debug("unable to forward to any peers") - if err := p.enqueue(msg); err != nil { - metrics.GetOrRegisterCounter("pss.forward.enqueue.error", nil).Inc(1) - log.Error(err.Error()) - return err - } - } - - // cache the message - p.addFwdCache(msg) - return nil -} - -///////////////////////////////////////////////////////////////////// -// SECTION: Caching -///////////////////////////////////////////////////////////////////// - -// cleanFwdCache is used to periodically remove expired entries from the forward cache -func (p *Pss) cleanFwdCache() { - metrics.GetOrRegisterCounter("pss.cleanfwdcache", nil).Inc(1) - p.fwdCacheMu.Lock() - defer p.fwdCacheMu.Unlock() - for k, v := range p.fwdCache { - if v.expiresAt.Before(time.Now()) { - delete(p.fwdCache, k) - } - } -} - -func label(b []byte) string { - return fmt.Sprintf("%04x", b[:2]) -} - -// add a message to the cache -func (p *Pss) addFwdCache(msg *PssMsg) error { - metrics.GetOrRegisterCounter("pss.addfwdcache", nil).Inc(1) - - var entry pssCacheEntry - var ok bool - - p.fwdCacheMu.Lock() - defer p.fwdCacheMu.Unlock() - - digest := p.digest(msg) - if entry, ok = p.fwdCache[digest]; !ok { - entry = pssCacheEntry{} - } - entry.expiresAt = time.Now().Add(p.cacheTTL) - p.fwdCache[digest] = entry - return nil -} - -// check if message is in the cache -func (p *Pss) checkFwdCache(msg *PssMsg) bool { - p.fwdCacheMu.Lock() - defer p.fwdCacheMu.Unlock() - - digest := p.digest(msg) - entry, ok := p.fwdCache[digest] - if ok { - if entry.expiresAt.After(time.Now()) { - log.Trace("unexpired cache", "digest", fmt.Sprintf("%x", digest)) - metrics.GetOrRegisterCounter("pss.checkfwdcache.unexpired", nil).Inc(1) - return true - } - metrics.GetOrRegisterCounter("pss.checkfwdcache.expired", nil).Inc(1) - } - return false -} - -// Digest of message -func (p *Pss) digest(msg *PssMsg) pssDigest { - return p.digestBytes(msg.serialize()) -} - -func (p *Pss) digestBytes(msg []byte) pssDigest { - hasher := p.hashPool.Get().(hash.Hash) - defer p.hashPool.Put(hasher) - hasher.Reset() - hasher.Write(msg) - digest := pssDigest{} - key := hasher.Sum(nil) - copy(digest[:], key[:digestLength]) - return digest -} - -func validateAddress(addr PssAddress) error { - if len(addr) > addressLength { - return errors.New("address too long") - } - return nil -} diff --git a/swarm/pss/pss_test.go b/swarm/pss/pss_test.go deleted file mode 100644 index 4fefa57f18eb..000000000000 --- a/swarm/pss/pss_test.go +++ /dev/null @@ -1,2098 +0,0 @@ -// Copyright 2018 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 pss - -import ( - "bytes" - "context" - "crypto/ecdsa" - "encoding/binary" - "encoding/hex" - "encoding/json" - "flag" - "fmt" - "io/ioutil" - "math/rand" - "os" - "strconv" - "strings" - "sync" - "testing" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/metrics/influxdb" - "github.com/nebulaai/nbai-node/node" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/protocols" - "github.com/nebulaai/nbai-node/p2p/simulations" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/pot" - "github.com/nebulaai/nbai-node/swarm/state" - whisper "github.com/nebulaai/nbai-node/whisper/whisperv5" -) - -var ( - initOnce = sync.Once{} - loglevel = flag.Int("loglevel", 2, "logging verbosity") - longrunning = flag.Bool("longrunning", false, "do run long-running tests") - w *whisper.Whisper - wapi *whisper.PublicWhisperAPI - psslogmain log.Logger - pssprotocols map[string]*protoCtrl - useHandshake bool - noopHandlerFunc = func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error { - return nil - } -) - -func init() { - flag.Parse() - rand.Seed(time.Now().Unix()) - - adapters.RegisterServices(newServices(false)) - initTest() -} - -func initTest() { - initOnce.Do( - func() { - psslogmain = log.New("psslog", "*") - hs := log.StreamHandler(os.Stderr, log.TerminalFormat(true)) - hf := log.LvlFilterHandler(log.Lvl(*loglevel), hs) - h := log.CallerFileHandler(hf) - log.Root().SetHandler(h) - - w = whisper.New(&whisper.DefaultConfig) - wapi = whisper.NewPublicWhisperAPI(w) - - pssprotocols = make(map[string]*protoCtrl) - }, - ) -} - -// test that topic conversion functions give predictable results -func TestTopic(t *testing.T) { - - api := &API{} - - topicstr := strings.Join([]string{PingProtocol.Name, strconv.Itoa(int(PingProtocol.Version))}, ":") - - // bytestotopic is the authoritative topic conversion source - topicobj := BytesToTopic([]byte(topicstr)) - - // string to topic and bytes to topic must match - topicapiobj, _ := api.StringToTopic(topicstr) - if topicobj != topicapiobj { - t.Fatalf("bytes and string topic conversion mismatch; %s != %s", topicobj, topicapiobj) - } - - // string representation of topichex - topichex := topicobj.String() - - // protocoltopic wrapper on pingtopic should be same as topicstring - // check that it matches - pingtopichex := PingTopic.String() - if topichex != pingtopichex { - t.Fatalf("protocol topic conversion mismatch; %s != %s", topichex, pingtopichex) - } - - // json marshal of topic - topicjsonout, err := topicobj.MarshalJSON() - if err != nil { - t.Fatal(err) - } - if string(topicjsonout)[1:len(topicjsonout)-1] != topichex { - t.Fatalf("topic json marshal mismatch; %s != \"%s\"", topicjsonout, topichex) - } - - // json unmarshal of topic - var topicjsonin Topic - topicjsonin.UnmarshalJSON(topicjsonout) - if topicjsonin != topicobj { - t.Fatalf("topic json unmarshal mismatch: %x != %x", topicjsonin, topicobj) - } -} - -// test bit packing of message control flags -func TestMsgParams(t *testing.T) { - var ctrl byte - ctrl |= pssControlRaw - p := newMsgParamsFromBytes([]byte{ctrl}) - m := newPssMsg(p) - if !m.isRaw() || m.isSym() { - t.Fatal("expected raw=true and sym=false") - } - ctrl |= pssControlSym - p = newMsgParamsFromBytes([]byte{ctrl}) - m = newPssMsg(p) - if !m.isRaw() || !m.isSym() { - t.Fatal("expected raw=true and sym=true") - } - ctrl &= 0xff &^ pssControlRaw - p = newMsgParamsFromBytes([]byte{ctrl}) - m = newPssMsg(p) - if m.isRaw() || !m.isSym() { - t.Fatal("expected raw=false and sym=true") - } -} - -// test if we can insert into cache, match items with cache and cache expiry -func TestCache(t *testing.T) { - var err error - to, _ := hex.DecodeString("08090a0b0c0d0e0f1011121314150001020304050607161718191a1b1c1d1e1f") - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctx) - privkey, err := w.GetPrivateKey(keys) - if err != nil { - t.Fatal(err) - } - ps := newTestPss(privkey, nil, nil) - pp := NewPssParams().WithPrivateKey(privkey) - data := []byte("foo") - datatwo := []byte("bar") - datathree := []byte("baz") - wparams := &whisper.MessageParams{ - TTL: defaultWhisperTTL, - Src: privkey, - Dst: &privkey.PublicKey, - Topic: whisper.TopicType(PingTopic), - WorkTime: defaultWhisperWorkTime, - PoW: defaultWhisperPoW, - Payload: data, - } - woutmsg, err := whisper.NewSentMessage(wparams) - env, err := woutmsg.Wrap(wparams) - msg := &PssMsg{ - Payload: env, - To: to, - } - wparams.Payload = datatwo - woutmsg, err = whisper.NewSentMessage(wparams) - envtwo, err := woutmsg.Wrap(wparams) - msgtwo := &PssMsg{ - Payload: envtwo, - To: to, - } - wparams.Payload = datathree - woutmsg, err = whisper.NewSentMessage(wparams) - envthree, err := woutmsg.Wrap(wparams) - msgthree := &PssMsg{ - Payload: envthree, - To: to, - } - - digest := ps.digest(msg) - if err != nil { - t.Fatalf("could not store cache msgone: %v", err) - } - digesttwo := ps.digest(msgtwo) - if err != nil { - t.Fatalf("could not store cache msgtwo: %v", err) - } - digestthree := ps.digest(msgthree) - if err != nil { - t.Fatalf("could not store cache msgthree: %v", err) - } - - if digest == digesttwo { - t.Fatalf("different msgs return same hash: %d", digesttwo) - } - - // check the cache - err = ps.addFwdCache(msg) - if err != nil { - t.Fatalf("write to pss expire cache failed: %v", err) - } - - if !ps.checkFwdCache(msg) { - t.Fatalf("message %v should have EXPIRE record in cache but checkCache returned false", msg) - } - - if ps.checkFwdCache(msgtwo) { - t.Fatalf("message %v should NOT have EXPIRE record in cache but checkCache returned true", msgtwo) - } - - time.Sleep(pp.CacheTTL + 1*time.Second) - err = ps.addFwdCache(msgthree) - if err != nil { - t.Fatalf("write to pss expire cache failed: %v", err) - } - - if ps.checkFwdCache(msg) { - t.Fatalf("message %v should have expired from cache but checkCache returned true", msg) - } - - if _, ok := ps.fwdCache[digestthree]; !ok { - t.Fatalf("unexpired message should be in the cache: %v", digestthree) - } - - if _, ok := ps.fwdCache[digesttwo]; ok { - t.Fatalf("expired message should have been cleared from the cache: %v", digesttwo) - } -} - -// matching of address hints; whether a message could be or is for the node -func TestAddressMatch(t *testing.T) { - - localaddr := network.RandomAddr().Over() - copy(localaddr[:8], []byte("deadbeef")) - remoteaddr := []byte("feedbeef") - kadparams := network.NewKadParams() - kad := network.NewKademlia(localaddr, kadparams) - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctx) - if err != nil { - t.Fatalf("Could not generate private key: %v", err) - } - privkey, err := w.GetPrivateKey(keys) - pssp := NewPssParams().WithPrivateKey(privkey) - ps, err := NewPss(kad, pssp) - if err != nil { - t.Fatal(err.Error()) - } - - pssmsg := &PssMsg{ - To: remoteaddr, - } - - // differ from first byte - if ps.isSelfRecipient(pssmsg) { - t.Fatalf("isSelfRecipient true but %x != %x", remoteaddr, localaddr) - } - if ps.isSelfPossibleRecipient(pssmsg, false) { - t.Fatalf("isSelfPossibleRecipient true but %x != %x", remoteaddr[:8], localaddr[:8]) - } - - // 8 first bytes same - copy(remoteaddr[:4], localaddr[:4]) - if ps.isSelfRecipient(pssmsg) { - t.Fatalf("isSelfRecipient true but %x != %x", remoteaddr, localaddr) - } - if !ps.isSelfPossibleRecipient(pssmsg, false) { - t.Fatalf("isSelfPossibleRecipient false but %x == %x", remoteaddr[:8], localaddr[:8]) - } - - // all bytes same - pssmsg.To = localaddr - if !ps.isSelfRecipient(pssmsg) { - t.Fatalf("isSelfRecipient false but %x == %x", remoteaddr, localaddr) - } - if !ps.isSelfPossibleRecipient(pssmsg, false) { - t.Fatalf("isSelfPossibleRecipient false but %x == %x", remoteaddr[:8], localaddr[:8]) - } - -} - -// test that message is handled by sender if a prox handler exists and sender is in prox of message -func TestProxShortCircuit(t *testing.T) { - - // sender node address - localAddr := network.RandomAddr().Over() - localPotAddr := pot.NewAddressFromBytes(localAddr) - - // set up kademlia - kadParams := network.NewKadParams() - kad := network.NewKademlia(localAddr, kadParams) - peerCount := kad.MinBinSize + 1 - - // set up pss - privKey, err := crypto.GenerateKey() - pssp := NewPssParams().WithPrivateKey(privKey) - ps, err := NewPss(kad, pssp) - if err != nil { - t.Fatal(err.Error()) - } - - // create kademlia peers, so we have peers both inside and outside minproxlimit - var peers []*network.Peer - proxMessageAddress := pot.RandomAddressAt(localPotAddr, peerCount).Bytes() - distantMessageAddress := pot.RandomAddressAt(localPotAddr, 0).Bytes() - - for i := 0; i < peerCount; i++ { - rw := &p2p.MsgPipeRW{} - ptpPeer := p2p.NewPeer(enode.ID{}, "wanna be with me? [ ] yes [ ] no", []p2p.Cap{}) - protoPeer := protocols.NewPeer(ptpPeer, rw, &protocols.Spec{}) - peerAddr := pot.RandomAddressAt(localPotAddr, i) - bzzPeer := &network.BzzPeer{ - Peer: protoPeer, - BzzAddr: &network.BzzAddr{ - OAddr: peerAddr.Bytes(), - UAddr: []byte(fmt.Sprintf("%x", peerAddr[:])), - }, - } - peer := network.NewPeer(bzzPeer, kad) - kad.On(peer) - peers = append(peers, peer) - } - - // register it marking prox capability - delivered := make(chan struct{}) - rawHandlerFunc := func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error { - log.Trace("in allowraw handler") - delivered <- struct{}{} - return nil - } - topic := BytesToTopic([]byte{0x2a}) - hndlrProxDereg := ps.Register(&topic, &handler{ - f: rawHandlerFunc, - caps: &handlerCaps{ - raw: true, - prox: true, - }, - }) - defer hndlrProxDereg() - - // send message too far away for sender to be in prox - // reception of this message should time out - errC := make(chan error) - go func() { - err := ps.SendRaw(distantMessageAddress, topic, []byte("foo")) - if err != nil { - errC <- err - } - }() - - ctx, cancel := context.WithTimeout(context.TODO(), time.Second) - defer cancel() - select { - case <-delivered: - t.Fatal("raw distant message delivered") - case err := <-errC: - t.Fatal(err) - case <-ctx.Done(): - } - - // send message that should be within sender prox - // this message should be delivered - go func() { - err := ps.SendRaw(proxMessageAddress, topic, []byte("bar")) - if err != nil { - errC <- err - } - }() - - ctx, cancel = context.WithTimeout(context.TODO(), time.Second) - defer cancel() - select { - case <-delivered: - case err := <-errC: - t.Fatal(err) - case <-ctx.Done(): - t.Fatal("raw timeout") - } - - // try the same prox message with sym and asym send - proxAddrPss := PssAddress(proxMessageAddress) - symKeyId, err := ps.GenerateSymmetricKey(topic, proxAddrPss, true) - go func() { - err := ps.SendSym(symKeyId, topic, []byte("baz")) - if err != nil { - errC <- err - } - }() - ctx, cancel = context.WithTimeout(context.TODO(), time.Second) - defer cancel() - select { - case <-delivered: - case err := <-errC: - t.Fatal(err) - case <-ctx.Done(): - t.Fatal("sym timeout") - } - - err = ps.SetPeerPublicKey(&privKey.PublicKey, topic, proxAddrPss) - if err != nil { - t.Fatal(err) - } - pubKeyId := hexutil.Encode(crypto.FromECDSAPub(&privKey.PublicKey)) - go func() { - err := ps.SendAsym(pubKeyId, topic, []byte("xyzzy")) - if err != nil { - errC <- err - } - }() - ctx, cancel = context.WithTimeout(context.TODO(), time.Second) - defer cancel() - select { - case <-delivered: - case err := <-errC: - t.Fatal(err) - case <-ctx.Done(): - t.Fatal("asym timeout") - } -} - -// verify that node can be set as recipient regardless of explicit message address match if minimum one handler of a topic is explicitly set to allow it -// note that in these tests we use the raw capability on handlers for convenience -func TestAddressMatchProx(t *testing.T) { - - // recipient node address - localAddr := network.RandomAddr().Over() - localPotAddr := pot.NewAddressFromBytes(localAddr) - - // set up kademlia - kadparams := network.NewKadParams() - kad := network.NewKademlia(localAddr, kadparams) - nnPeerCount := kad.MinBinSize - peerCount := nnPeerCount + 2 - - // set up pss - privKey, err := crypto.GenerateKey() - pssp := NewPssParams().WithPrivateKey(privKey) - ps, err := NewPss(kad, pssp) - if err != nil { - t.Fatal(err.Error()) - } - - // create kademlia peers, so we have peers both inside and outside minproxlimit - var peers []*network.Peer - for i := 0; i < peerCount; i++ { - rw := &p2p.MsgPipeRW{} - ptpPeer := p2p.NewPeer(enode.ID{}, "362436 call me anytime", []p2p.Cap{}) - protoPeer := protocols.NewPeer(ptpPeer, rw, &protocols.Spec{}) - peerAddr := pot.RandomAddressAt(localPotAddr, i) - bzzPeer := &network.BzzPeer{ - Peer: protoPeer, - BzzAddr: &network.BzzAddr{ - OAddr: peerAddr.Bytes(), - UAddr: []byte(fmt.Sprintf("%x", peerAddr[:])), - }, - } - peer := network.NewPeer(bzzPeer, kad) - kad.On(peer) - peers = append(peers, peer) - } - - // TODO: create a test in the network package to make a table with n peers where n-m are proxpeers - // meanwhile test regression for kademlia since we are compiling the test parameters from different packages - var proxes int - var conns int - depth := kad.NeighbourhoodDepth() - kad.EachConn(nil, peerCount, func(p *network.Peer, po int) bool { - conns++ - if po >= depth { - proxes++ - } - return true - }) - if proxes != nnPeerCount { - t.Fatalf("expected %d proxpeers, have %d", nnPeerCount, proxes) - } else if conns != peerCount { - t.Fatalf("expected %d peers total, have %d", peerCount, proxes) - } - - // remote address distances from localAddr to try and the expected outcomes if we use prox handler - remoteDistances := []int{ - 255, - nnPeerCount + 1, - nnPeerCount, - nnPeerCount - 1, - 0, - } - expects := []bool{ - true, - true, - true, - false, - false, - } - - // first the unit test on the method that calculates possible receipient using prox - for i, distance := range remoteDistances { - pssMsg := newPssMsg(&msgParams{}) - pssMsg.To = make([]byte, len(localAddr)) - copy(pssMsg.To, localAddr) - var byteIdx = distance / 8 - pssMsg.To[byteIdx] ^= 1 << uint(7-(distance%8)) - log.Trace(fmt.Sprintf("addrmatch %v", bytes.Equal(pssMsg.To, localAddr))) - if ps.isSelfPossibleRecipient(pssMsg, true) != expects[i] { - t.Fatalf("expected distance %d to be %v", distance, expects[i]) - } - } - - // we move up to higher level and test the actual message handler - // for each distance check if we are possible recipient when prox variant is used is set - - // this handler will increment a counter for every message that gets passed to the handler - var receives int - rawHandlerFunc := func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error { - log.Trace("in allowraw handler") - receives++ - return nil - } - - // register it marking prox capability - topic := BytesToTopic([]byte{0x2a}) - hndlrProxDereg := ps.Register(&topic, &handler{ - f: rawHandlerFunc, - caps: &handlerCaps{ - raw: true, - prox: true, - }, - }) - - // test the distances - var prevReceive int - for i, distance := range remoteDistances { - remotePotAddr := pot.RandomAddressAt(localPotAddr, distance) - remoteAddr := remotePotAddr.Bytes() - - var data [32]byte - rand.Read(data[:]) - pssMsg := newPssMsg(&msgParams{raw: true}) - pssMsg.To = remoteAddr - pssMsg.Expire = uint32(time.Now().Unix() + 4200) - pssMsg.Payload = &whisper.Envelope{ - Topic: whisper.TopicType(topic), - Data: data[:], - } - - log.Trace("withprox addrs", "local", localAddr, "remote", remoteAddr) - ps.handlePssMsg(context.TODO(), pssMsg) - if (!expects[i] && prevReceive != receives) || (expects[i] && prevReceive == receives) { - t.Fatalf("expected distance %d recipient %v when prox is set for handler", distance, expects[i]) - } - prevReceive = receives - } - - // now add a non prox-capable handler and test - ps.Register(&topic, &handler{ - f: rawHandlerFunc, - caps: &handlerCaps{ - raw: true, - }, - }) - receives = 0 - prevReceive = 0 - for i, distance := range remoteDistances { - remotePotAddr := pot.RandomAddressAt(localPotAddr, distance) - remoteAddr := remotePotAddr.Bytes() - - var data [32]byte - rand.Read(data[:]) - pssMsg := newPssMsg(&msgParams{raw: true}) - pssMsg.To = remoteAddr - pssMsg.Expire = uint32(time.Now().Unix() + 4200) - pssMsg.Payload = &whisper.Envelope{ - Topic: whisper.TopicType(topic), - Data: data[:], - } - - log.Trace("withprox addrs", "local", localAddr, "remote", remoteAddr) - ps.handlePssMsg(context.TODO(), pssMsg) - if (!expects[i] && prevReceive != receives) || (expects[i] && prevReceive == receives) { - t.Fatalf("expected distance %d recipient %v when prox is set for handler", distance, expects[i]) - } - prevReceive = receives - } - - // now deregister the prox capable handler, now none of the messages will be handled - hndlrProxDereg() - receives = 0 - - for _, distance := range remoteDistances { - remotePotAddr := pot.RandomAddressAt(localPotAddr, distance) - remoteAddr := remotePotAddr.Bytes() - - pssMsg := newPssMsg(&msgParams{raw: true}) - pssMsg.To = remoteAddr - pssMsg.Expire = uint32(time.Now().Unix() + 4200) - pssMsg.Payload = &whisper.Envelope{ - Topic: whisper.TopicType(topic), - Data: []byte(remotePotAddr.String()), - } - - log.Trace("noprox addrs", "local", localAddr, "remote", remoteAddr) - ps.handlePssMsg(context.TODO(), pssMsg) - if receives != 0 { - t.Fatalf("expected distance %d to not be recipient when prox is not set for handler", distance) - } - - } -} - -// verify that message queueing happens when it should, and that expired and corrupt messages are dropped -func TestMessageProcessing(t *testing.T) { - - t.Skip("Disabled due to probable faulty logic for outbox expectations") - // setup - privkey, err := crypto.GenerateKey() - if err != nil { - t.Fatal(err.Error()) - } - - addr := make([]byte, 32) - addr[0] = 0x01 - ps := newTestPss(privkey, network.NewKademlia(addr, network.NewKadParams()), NewPssParams()) - - // message should pass - msg := newPssMsg(&msgParams{}) - msg.To = addr - msg.Expire = uint32(time.Now().Add(time.Second * 60).Unix()) - msg.Payload = &whisper.Envelope{ - Topic: [4]byte{}, - Data: []byte{0x66, 0x6f, 0x6f}, - } - if err := ps.handlePssMsg(context.TODO(), msg); err != nil { - t.Fatal(err.Error()) - } - tmr := time.NewTimer(time.Millisecond * 100) - var outmsg *PssMsg - select { - case outmsg = <-ps.outbox: - case <-tmr.C: - default: - } - if outmsg != nil { - t.Fatalf("expected outbox empty after full address on msg, but had message %s", msg) - } - - // message should pass and queue due to partial length - msg.To = addr[0:1] - msg.Payload.Data = []byte{0x78, 0x79, 0x80, 0x80, 0x79} - if err := ps.handlePssMsg(context.TODO(), msg); err != nil { - t.Fatal(err.Error()) - } - tmr.Reset(time.Millisecond * 100) - outmsg = nil - select { - case outmsg = <-ps.outbox: - case <-tmr.C: - } - if outmsg == nil { - t.Fatal("expected message in outbox on encrypt fail, but empty") - } - outmsg = nil - select { - case outmsg = <-ps.outbox: - default: - } - if outmsg != nil { - t.Fatalf("expected only one queued message but also had message %v", msg) - } - - // full address mismatch should put message in queue - msg.To[0] = 0xff - if err := ps.handlePssMsg(context.TODO(), msg); err != nil { - t.Fatal(err.Error()) - } - tmr.Reset(time.Millisecond * 10) - outmsg = nil - select { - case outmsg = <-ps.outbox: - case <-tmr.C: - } - if outmsg == nil { - t.Fatal("expected message in outbox on address mismatch, but empty") - } - outmsg = nil - select { - case outmsg = <-ps.outbox: - default: - } - if outmsg != nil { - t.Fatalf("expected only one queued message but also had message %v", msg) - } - - // expired message should be dropped - msg.Expire = uint32(time.Now().Add(-time.Second).Unix()) - if err := ps.handlePssMsg(context.TODO(), msg); err != nil { - t.Fatal(err.Error()) - } - tmr.Reset(time.Millisecond * 10) - outmsg = nil - select { - case outmsg = <-ps.outbox: - case <-tmr.C: - default: - } - if outmsg != nil { - t.Fatalf("expected empty queue but have message %v", msg) - } - - // invalid message should return error - fckedupmsg := &struct { - pssMsg *PssMsg - }{ - pssMsg: &PssMsg{}, - } - if err := ps.handlePssMsg(context.TODO(), fckedupmsg); err == nil { - t.Fatalf("expected error from processMsg but error nil") - } - - // outbox full should return error - msg.Expire = uint32(time.Now().Add(time.Second * 60).Unix()) - for i := 0; i < defaultOutboxCapacity; i++ { - ps.outbox <- msg - } - msg.Payload.Data = []byte{0x62, 0x61, 0x72} - err = ps.handlePssMsg(context.TODO(), msg) - if err == nil { - t.Fatal("expected error when mailbox full, but was nil") - } -} - -// set and generate pubkeys and symkeys -func TestKeys(t *testing.T) { - // make our key and init pss with it - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - ourkeys, err := wapi.NewKeyPair(ctx) - if err != nil { - t.Fatalf("create 'our' key fail") - } - ctx, cancel2 := context.WithTimeout(context.Background(), time.Second) - defer cancel2() - theirkeys, err := wapi.NewKeyPair(ctx) - if err != nil { - t.Fatalf("create 'their' key fail") - } - ourprivkey, err := w.GetPrivateKey(ourkeys) - if err != nil { - t.Fatalf("failed to retrieve 'our' private key") - } - theirprivkey, err := w.GetPrivateKey(theirkeys) - if err != nil { - t.Fatalf("failed to retrieve 'their' private key") - } - ps := newTestPss(ourprivkey, nil, nil) - - // set up peer with mock address, mapped to mocked publicaddress and with mocked symkey - addr := make(PssAddress, 32) - copy(addr, network.RandomAddr().Over()) - outkey := network.RandomAddr().Over() - topicobj := BytesToTopic([]byte("foo:42")) - ps.SetPeerPublicKey(&theirprivkey.PublicKey, topicobj, addr) - outkeyid, err := ps.SetSymmetricKey(outkey, topicobj, addr, false) - if err != nil { - t.Fatalf("failed to set 'our' outgoing symmetric key") - } - - // make a symmetric key that we will send to peer for encrypting messages to us - inkeyid, err := ps.GenerateSymmetricKey(topicobj, addr, true) - if err != nil { - t.Fatalf("failed to set 'our' incoming symmetric key") - } - - // get the key back from whisper, check that it's still the same - outkeyback, err := ps.w.GetSymKey(outkeyid) - if err != nil { - t.Fatalf(err.Error()) - } - inkey, err := ps.w.GetSymKey(inkeyid) - if err != nil { - t.Fatalf(err.Error()) - } - if !bytes.Equal(outkeyback, outkey) { - t.Fatalf("passed outgoing symkey doesnt equal stored: %x / %x", outkey, outkeyback) - } - - t.Logf("symout: %v", outkeyback) - t.Logf("symin: %v", inkey) - - // check that the key is stored in the peerpool - psp := ps.symKeyPool[inkeyid][topicobj] - if !bytes.Equal(psp.address, addr) { - t.Fatalf("inkey address does not match; %p != %p", psp.address, addr) - } -} - -// check that we can retrieve previously added public key entires per topic and peer -func TestGetPublickeyEntries(t *testing.T) { - - privkey, err := crypto.GenerateKey() - if err != nil { - t.Fatal(err) - } - ps := newTestPss(privkey, nil, nil) - - peeraddr := network.RandomAddr().Over() - topicaddr := make(map[Topic]PssAddress) - topicaddr[Topic{0x13}] = peeraddr - topicaddr[Topic{0x2a}] = peeraddr[:16] - topicaddr[Topic{0x02, 0x9a}] = []byte{} - - remoteprivkey, err := crypto.GenerateKey() - if err != nil { - t.Fatal(err) - } - remotepubkeybytes := crypto.FromECDSAPub(&remoteprivkey.PublicKey) - remotepubkeyhex := common.ToHex(remotepubkeybytes) - - pssapi := NewAPI(ps) - - for to, a := range topicaddr { - err = pssapi.SetPeerPublicKey(remotepubkeybytes, to, a) - if err != nil { - t.Fatal(err) - } - } - - intopic, err := pssapi.GetPeerTopics(remotepubkeyhex) - if err != nil { - t.Fatal(err) - } - -OUTER: - for _, tnew := range intopic { - for torig, addr := range topicaddr { - if bytes.Equal(torig[:], tnew[:]) { - inaddr, err := pssapi.GetPeerAddress(remotepubkeyhex, torig) - if err != nil { - t.Fatal(err) - } - if !bytes.Equal(addr, inaddr) { - t.Fatalf("Address mismatch for topic %x; got %x, expected %x", torig, inaddr, addr) - } - delete(topicaddr, torig) - continue OUTER - } - } - t.Fatalf("received topic %x did not match any existing topics", tnew) - } - - if len(topicaddr) != 0 { - t.Fatalf("%d topics were not matched", len(topicaddr)) - } -} - -// forwarding should skip peers that do not have matching pss capabilities -func TestPeerCapabilityMismatch(t *testing.T) { - - // create privkey for forwarder node - privkey, err := crypto.GenerateKey() - if err != nil { - t.Fatal(err) - } - - // initialize kad - baseaddr := network.RandomAddr() - kad := network.NewKademlia((baseaddr).Over(), network.NewKadParams()) - rw := &p2p.MsgPipeRW{} - - // one peer has a mismatching version of pss - wrongpssaddr := network.RandomAddr() - wrongpsscap := p2p.Cap{ - Name: pssProtocolName, - Version: 0, - } - nid := enode.ID{0x01} - wrongpsspeer := network.NewPeer(&network.BzzPeer{ - Peer: protocols.NewPeer(p2p.NewPeer(nid, common.ToHex(wrongpssaddr.Over()), []p2p.Cap{wrongpsscap}), rw, nil), - BzzAddr: &network.BzzAddr{OAddr: wrongpssaddr.Over(), UAddr: nil}, - }, kad) - - // one peer doesn't even have pss (boo!) - nopssaddr := network.RandomAddr() - nopsscap := p2p.Cap{ - Name: "nopss", - Version: 1, - } - nid = enode.ID{0x02} - nopsspeer := network.NewPeer(&network.BzzPeer{ - Peer: protocols.NewPeer(p2p.NewPeer(nid, common.ToHex(nopssaddr.Over()), []p2p.Cap{nopsscap}), rw, nil), - BzzAddr: &network.BzzAddr{OAddr: nopssaddr.Over(), UAddr: nil}, - }, kad) - - // add peers to kademlia and activate them - // it's safe so don't check errors - kad.Register(wrongpsspeer.BzzAddr) - kad.On(wrongpsspeer) - kad.Register(nopsspeer.BzzAddr) - kad.On(nopsspeer) - - // create pss - pssmsg := &PssMsg{ - To: []byte{}, - Expire: uint32(time.Now().Add(time.Second).Unix()), - Payload: &whisper.Envelope{}, - } - ps := newTestPss(privkey, kad, nil) - - // run the forward - // it is enough that it completes; trying to send to incapable peers would create segfault - ps.forward(pssmsg) - -} - -// verifies that message handlers for raw messages only are invoked when minimum one handler for the topic exists in which raw messages are explicitly allowed -func TestRawAllow(t *testing.T) { - - // set up pss like so many times before - privKey, err := crypto.GenerateKey() - if err != nil { - t.Fatal(err) - } - baseAddr := network.RandomAddr() - kad := network.NewKademlia((baseAddr).Over(), network.NewKadParams()) - ps := newTestPss(privKey, kad, nil) - topic := BytesToTopic([]byte{0x2a}) - - // create handler innards that increments every time a message hits it - var receives int - rawHandlerFunc := func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error { - log.Trace("in allowraw handler") - receives++ - return nil - } - - // wrap this handler function with a handler without raw capability and register it - hndlrNoRaw := &handler{ - f: rawHandlerFunc, - } - ps.Register(&topic, hndlrNoRaw) - - // test it with a raw message, should be poo-poo - pssMsg := newPssMsg(&msgParams{ - raw: true, - }) - pssMsg.To = baseAddr.OAddr - pssMsg.Expire = uint32(time.Now().Unix() + 4200) - pssMsg.Payload = &whisper.Envelope{ - Topic: whisper.TopicType(topic), - } - ps.handlePssMsg(context.TODO(), pssMsg) - if receives > 0 { - t.Fatalf("Expected handler not to be executed with raw cap off") - } - - // now wrap the same handler function with raw capabilities and register it - hndlrRaw := &handler{ - f: rawHandlerFunc, - caps: &handlerCaps{ - raw: true, - }, - } - deregRawHandler := ps.Register(&topic, hndlrRaw) - - // should work now - pssMsg.Payload.Data = []byte("Raw Deal") - ps.handlePssMsg(context.TODO(), pssMsg) - if receives == 0 { - t.Fatalf("Expected handler to be executed with raw cap on") - } - - // now deregister the raw capable handler - prevReceives := receives - deregRawHandler() - - // check that raw messages fail again - pssMsg.Payload.Data = []byte("Raw Trump") - ps.handlePssMsg(context.TODO(), pssMsg) - if receives != prevReceives { - t.Fatalf("Expected handler not to be executed when raw handler is retracted") - } -} - -// BELOW HERE ARE TESTS USING THE SIMULATION FRAMEWORK - -// tests that the API layer can handle edge case values -func TestApi(t *testing.T) { - clients, err := setupNetwork(2, true) - if err != nil { - t.Fatal(err) - } - - topic := "0xdeadbeef" - - err = clients[0].Call(nil, "pss_sendRaw", "0x", topic, "0x666f6f") - if err != nil { - t.Fatal(err) - } - - err = clients[0].Call(nil, "pss_sendRaw", "0xabcdef", topic, "0x") - if err == nil { - t.Fatal("expected error on empty msg") - } - - overflowAddr := [33]byte{} - err = clients[0].Call(nil, "pss_sendRaw", hexutil.Encode(overflowAddr[:]), topic, "0x666f6f") - if err == nil { - t.Fatal("expected error on send too big address") - } -} - -// verifies that nodes can send and receive raw (verbatim) messages -func TestSendRaw(t *testing.T) { - t.Run("32", testSendRaw) - t.Run("8", testSendRaw) - t.Run("0", testSendRaw) -} - -func testSendRaw(t *testing.T) { - - var addrsize int64 - var err error - - paramstring := strings.Split(t.Name(), "/") - - addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0) - log.Info("raw send test", "addrsize", addrsize) - - clients, err := setupNetwork(2, true) - if err != nil { - t.Fatal(err) - } - - topic := "0xdeadbeef" - - var loaddrhex string - err = clients[0].Call(&loaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 1 baseaddr fail: %v", err) - } - loaddrhex = loaddrhex[:2+(addrsize*2)] - var roaddrhex string - err = clients[1].Call(&roaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 2 baseaddr fail: %v", err) - } - roaddrhex = roaddrhex[:2+(addrsize*2)] - - time.Sleep(time.Millisecond * 500) - - // at this point we've verified that symkeys are saved and match on each peer - // now try sending symmetrically encrypted message, both directions - lmsgC := make(chan APIMsg) - lctx, lcancel := context.WithTimeout(context.Background(), time.Second*10) - defer lcancel() - lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic, true, false) - log.Trace("lsub", "id", lsub) - defer lsub.Unsubscribe() - rmsgC := make(chan APIMsg) - rctx, rcancel := context.WithTimeout(context.Background(), time.Second*10) - defer rcancel() - rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic, true, false) - log.Trace("rsub", "id", rsub) - defer rsub.Unsubscribe() - - // send and verify delivery - lmsg := []byte("plugh") - err = clients[1].Call(nil, "pss_sendRaw", loaddrhex, topic, hexutil.Encode(lmsg)) - if err != nil { - t.Fatal(err) - } - select { - case recvmsg := <-lmsgC: - if !bytes.Equal(recvmsg.Msg, lmsg) { - t.Fatalf("node 1 received payload mismatch: expected %v, got %v", lmsg, recvmsg) - } - case cerr := <-lctx.Done(): - t.Fatalf("test message (left) timed out: %v", cerr) - } - rmsg := []byte("xyzzy") - err = clients[0].Call(nil, "pss_sendRaw", roaddrhex, topic, hexutil.Encode(rmsg)) - if err != nil { - t.Fatal(err) - } - select { - case recvmsg := <-rmsgC: - if !bytes.Equal(recvmsg.Msg, rmsg) { - t.Fatalf("node 2 received payload mismatch: expected %x, got %v", rmsg, recvmsg.Msg) - } - case cerr := <-rctx.Done(): - t.Fatalf("test message (right) timed out: %v", cerr) - } -} - -// send symmetrically encrypted message between two directly connected peers -func TestSendSym(t *testing.T) { - t.Run("32", testSendSym) - t.Run("8", testSendSym) - t.Run("0", testSendSym) -} - -func testSendSym(t *testing.T) { - - // address hint size - var addrsize int64 - var err error - paramstring := strings.Split(t.Name(), "/") - addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0) - log.Info("sym send test", "addrsize", addrsize) - - clients, err := setupNetwork(2, false) - if err != nil { - t.Fatal(err) - } - - var topic string - err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42") - if err != nil { - t.Fatal(err) - } - - var loaddrhex string - err = clients[0].Call(&loaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 1 baseaddr fail: %v", err) - } - loaddrhex = loaddrhex[:2+(addrsize*2)] - var roaddrhex string - err = clients[1].Call(&roaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 2 baseaddr fail: %v", err) - } - roaddrhex = roaddrhex[:2+(addrsize*2)] - - // retrieve public key from pss instance - // set this public key reciprocally - var lpubkeyhex string - err = clients[0].Call(&lpubkeyhex, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 1 pubkey fail: %v", err) - } - var rpubkeyhex string - err = clients[1].Call(&rpubkeyhex, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 2 pubkey fail: %v", err) - } - - time.Sleep(time.Millisecond * 500) - - // at this point we've verified that symkeys are saved and match on each peer - // now try sending symmetrically encrypted message, both directions - lmsgC := make(chan APIMsg) - lctx, lcancel := context.WithTimeout(context.Background(), time.Second*10) - defer lcancel() - lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic, false, false) - log.Trace("lsub", "id", lsub) - defer lsub.Unsubscribe() - rmsgC := make(chan APIMsg) - rctx, rcancel := context.WithTimeout(context.Background(), time.Second*10) - defer rcancel() - rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic, false, false) - log.Trace("rsub", "id", rsub) - defer rsub.Unsubscribe() - - lrecvkey := network.RandomAddr().Over() - rrecvkey := network.RandomAddr().Over() - - var lkeyids [2]string - var rkeyids [2]string - - // manually set reciprocal symkeys - err = clients[0].Call(&lkeyids, "psstest_setSymKeys", rpubkeyhex, lrecvkey, rrecvkey, defaultSymKeySendLimit, topic, roaddrhex) - if err != nil { - t.Fatal(err) - } - err = clients[1].Call(&rkeyids, "psstest_setSymKeys", lpubkeyhex, rrecvkey, lrecvkey, defaultSymKeySendLimit, topic, loaddrhex) - if err != nil { - t.Fatal(err) - } - - // send and verify delivery - lmsg := []byte("plugh") - err = clients[1].Call(nil, "pss_sendSym", rkeyids[1], topic, hexutil.Encode(lmsg)) - if err != nil { - t.Fatal(err) - } - select { - case recvmsg := <-lmsgC: - if !bytes.Equal(recvmsg.Msg, lmsg) { - t.Fatalf("node 1 received payload mismatch: expected %v, got %v", lmsg, recvmsg) - } - case cerr := <-lctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - } - rmsg := []byte("xyzzy") - err = clients[0].Call(nil, "pss_sendSym", lkeyids[1], topic, hexutil.Encode(rmsg)) - if err != nil { - t.Fatal(err) - } - select { - case recvmsg := <-rmsgC: - if !bytes.Equal(recvmsg.Msg, rmsg) { - t.Fatalf("node 2 received payload mismatch: expected %x, got %v", rmsg, recvmsg.Msg) - } - case cerr := <-rctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - } -} - -// send asymmetrically encrypted message between two directly connected peers -func TestSendAsym(t *testing.T) { - t.Run("32", testSendAsym) - t.Run("8", testSendAsym) - t.Run("0", testSendAsym) -} - -func testSendAsym(t *testing.T) { - - // address hint size - var addrsize int64 - var err error - paramstring := strings.Split(t.Name(), "/") - addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0) - log.Info("asym send test", "addrsize", addrsize) - - clients, err := setupNetwork(2, false) - if err != nil { - t.Fatal(err) - } - - var topic string - err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42") - if err != nil { - t.Fatal(err) - } - - time.Sleep(time.Millisecond * 250) - - var loaddrhex string - err = clients[0].Call(&loaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 1 baseaddr fail: %v", err) - } - loaddrhex = loaddrhex[:2+(addrsize*2)] - var roaddrhex string - err = clients[1].Call(&roaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 2 baseaddr fail: %v", err) - } - roaddrhex = roaddrhex[:2+(addrsize*2)] - - // retrieve public key from pss instance - // set this public key reciprocally - var lpubkey string - err = clients[0].Call(&lpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 1 pubkey fail: %v", err) - } - var rpubkey string - err = clients[1].Call(&rpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get node 2 pubkey fail: %v", err) - } - - time.Sleep(time.Millisecond * 500) // replace with hive healthy code - - lmsgC := make(chan APIMsg) - lctx, lcancel := context.WithTimeout(context.Background(), time.Second*10) - defer lcancel() - lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic, false, false) - log.Trace("lsub", "id", lsub) - defer lsub.Unsubscribe() - rmsgC := make(chan APIMsg) - rctx, rcancel := context.WithTimeout(context.Background(), time.Second*10) - defer rcancel() - rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic, false, false) - log.Trace("rsub", "id", rsub) - defer rsub.Unsubscribe() - - // store reciprocal public keys - err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddrhex) - if err != nil { - t.Fatal(err) - } - err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddrhex) - if err != nil { - t.Fatal(err) - } - - // send and verify delivery - rmsg := []byte("xyzzy") - err = clients[0].Call(nil, "pss_sendAsym", rpubkey, topic, hexutil.Encode(rmsg)) - if err != nil { - t.Fatal(err) - } - select { - case recvmsg := <-rmsgC: - if !bytes.Equal(recvmsg.Msg, rmsg) { - t.Fatalf("node 2 received payload mismatch: expected %v, got %v", rmsg, recvmsg.Msg) - } - case cerr := <-rctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - } - lmsg := []byte("plugh") - err = clients[1].Call(nil, "pss_sendAsym", lpubkey, topic, hexutil.Encode(lmsg)) - if err != nil { - t.Fatal(err) - } - select { - case recvmsg := <-lmsgC: - if !bytes.Equal(recvmsg.Msg, lmsg) { - t.Fatalf("node 1 received payload mismatch: expected %v, got %v", lmsg, recvmsg.Msg) - } - case cerr := <-lctx.Done(): - t.Fatalf("test message timed out: %v", cerr) - } -} - -type Job struct { - Msg []byte - SendNode enode.ID - RecvNode enode.ID -} - -func worker(id int, jobs <-chan Job, rpcs map[enode.ID]*rpc.Client, pubkeys map[enode.ID]string, topic string) { - for j := range jobs { - rpcs[j.SendNode].Call(nil, "pss_sendAsym", pubkeys[j.RecvNode], topic, hexutil.Encode(j.Msg)) - } -} - -func TestNetwork(t *testing.T) { - t.Run("16/1000/4/sim", testNetwork) -} - -// params in run name: -// nodes/msgs/addrbytes/adaptertype -// if adaptertype is exec uses execadapter, simadapter otherwise -func TestNetwork2000(t *testing.T) { - //enableMetrics() - - if !*longrunning { - t.Skip("run with --longrunning flag to run extensive network tests") - } - t.Run("3/2000/4/sim", testNetwork) - t.Run("4/2000/4/sim", testNetwork) - t.Run("8/2000/4/sim", testNetwork) - t.Run("16/2000/4/sim", testNetwork) -} - -func TestNetwork5000(t *testing.T) { - //enableMetrics() - - if !*longrunning { - t.Skip("run with --longrunning flag to run extensive network tests") - } - t.Run("3/5000/4/sim", testNetwork) - t.Run("4/5000/4/sim", testNetwork) - t.Run("8/5000/4/sim", testNetwork) - t.Run("16/5000/4/sim", testNetwork) -} - -func TestNetwork10000(t *testing.T) { - //enableMetrics() - - if !*longrunning { - t.Skip("run with --longrunning flag to run extensive network tests") - } - t.Run("3/10000/4/sim", testNetwork) - t.Run("4/10000/4/sim", testNetwork) - t.Run("8/10000/4/sim", testNetwork) -} - -func testNetwork(t *testing.T) { - paramstring := strings.Split(t.Name(), "/") - nodecount, _ := strconv.ParseInt(paramstring[1], 10, 0) - msgcount, _ := strconv.ParseInt(paramstring[2], 10, 0) - addrsize, _ := strconv.ParseInt(paramstring[3], 10, 0) - adapter := paramstring[4] - - log.Info("network test", "nodecount", nodecount, "msgcount", msgcount, "addrhintsize", addrsize) - - nodes := make([]enode.ID, nodecount) - bzzaddrs := make(map[enode.ID]string, nodecount) - rpcs := make(map[enode.ID]*rpc.Client, nodecount) - pubkeys := make(map[enode.ID]string, nodecount) - - sentmsgs := make([][]byte, msgcount) - recvmsgs := make([]bool, msgcount) - nodemsgcount := make(map[enode.ID]int, nodecount) - - trigger := make(chan enode.ID) - - var a adapters.NodeAdapter - if adapter == "exec" { - dirname, err := ioutil.TempDir(".", "") - if err != nil { - t.Fatal(err) - } - a = adapters.NewExecAdapter(dirname) - } else if adapter == "tcp" { - a = adapters.NewTCPAdapter(newServices(false)) - } else if adapter == "sim" { - a = adapters.NewSimAdapter(newServices(false)) - } - net := simulations.NewNetwork(a, &simulations.NetworkConfig{ - ID: "0", - }) - defer net.Shutdown() - - f, err := os.Open(fmt.Sprintf("testdata/snapshot_%d.json", nodecount)) - if err != nil { - t.Fatal(err) - } - jsonbyte, err := ioutil.ReadAll(f) - if err != nil { - t.Fatal(err) - } - var snap simulations.Snapshot - err = json.Unmarshal(jsonbyte, &snap) - if err != nil { - t.Fatal(err) - } - err = net.Load(&snap) - if err != nil { - //TODO: Fix p2p simulation framework to not crash when loading 32-nodes - //t.Fatal(err) - } - - time.Sleep(1 * time.Second) - - triggerChecks := func(trigger chan enode.ID, id enode.ID, rpcclient *rpc.Client, topic string) error { - msgC := make(chan APIMsg) - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - sub, err := rpcclient.Subscribe(ctx, "pss", msgC, "receive", topic, false, false) - if err != nil { - t.Fatal(err) - } - go func() { - defer sub.Unsubscribe() - for { - select { - case recvmsg := <-msgC: - idx, _ := binary.Uvarint(recvmsg.Msg) - if !recvmsgs[idx] { - log.Debug("msg recv", "idx", idx, "id", id) - recvmsgs[idx] = true - trigger <- id - } - case <-sub.Err(): - return - } - } - }() - return nil - } - - var topic string - for i, nod := range net.GetNodes() { - nodes[i] = nod.ID() - rpcs[nodes[i]], err = nod.Client() - if err != nil { - t.Fatal(err) - } - if topic == "" { - err = rpcs[nodes[i]].Call(&topic, "pss_stringToTopic", "foo:42") - if err != nil { - t.Fatal(err) - } - } - var pubkey string - err = rpcs[nodes[i]].Call(&pubkey, "pss_getPublicKey") - if err != nil { - t.Fatal(err) - } - pubkeys[nod.ID()] = pubkey - var addrhex string - err = rpcs[nodes[i]].Call(&addrhex, "pss_baseAddr") - if err != nil { - t.Fatal(err) - } - bzzaddrs[nodes[i]] = addrhex - err = triggerChecks(trigger, nodes[i], rpcs[nodes[i]], topic) - if err != nil { - t.Fatal(err) - } - } - - time.Sleep(1 * time.Second) - - // setup workers - jobs := make(chan Job, 10) - for w := 1; w <= 10; w++ { - go worker(w, jobs, rpcs, pubkeys, topic) - } - - time.Sleep(1 * time.Second) - - for i := 0; i < int(msgcount); i++ { - sendnodeidx := rand.Intn(int(nodecount)) - recvnodeidx := rand.Intn(int(nodecount - 1)) - if recvnodeidx >= sendnodeidx { - recvnodeidx++ - } - nodemsgcount[nodes[recvnodeidx]]++ - sentmsgs[i] = make([]byte, 8) - c := binary.PutUvarint(sentmsgs[i], uint64(i)) - if c == 0 { - t.Fatal("0 byte message") - } - if err != nil { - t.Fatal(err) - } - err = rpcs[nodes[sendnodeidx]].Call(nil, "pss_setPeerPublicKey", pubkeys[nodes[recvnodeidx]], topic, bzzaddrs[nodes[recvnodeidx]]) - if err != nil { - t.Fatal(err) - } - - jobs <- Job{ - Msg: sentmsgs[i], - SendNode: nodes[sendnodeidx], - RecvNode: nodes[recvnodeidx], - } - } - - finalmsgcount := 0 - ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) - defer cancel() -outer: - for i := 0; i < int(msgcount); i++ { - select { - case id := <-trigger: - nodemsgcount[id]-- - finalmsgcount++ - case <-ctx.Done(): - log.Warn("timeout") - break outer - } - } - - for i, msg := range recvmsgs { - if !msg { - log.Debug("missing message", "idx", i) - } - } - t.Logf("%d of %d messages received", finalmsgcount, msgcount) - - if finalmsgcount != int(msgcount) { - t.Fatalf("%d messages were not received", int(msgcount)-finalmsgcount) - } - -} - -// check that in a network of a -> b -> c -> a -// a doesn't receive a sent message twice -func TestDeduplication(t *testing.T) { - var err error - - clients, err := setupNetwork(3, false) - if err != nil { - t.Fatal(err) - } - - var addrsize = 32 - var loaddrhex string - err = clients[0].Call(&loaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 1 baseaddr fail: %v", err) - } - loaddrhex = loaddrhex[:2+(addrsize*2)] - var roaddrhex string - err = clients[1].Call(&roaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 2 baseaddr fail: %v", err) - } - roaddrhex = roaddrhex[:2+(addrsize*2)] - var xoaddrhex string - err = clients[2].Call(&xoaddrhex, "pss_baseAddr") - if err != nil { - t.Fatalf("rpc get node 3 baseaddr fail: %v", err) - } - xoaddrhex = xoaddrhex[:2+(addrsize*2)] - - log.Info("peer", "l", loaddrhex, "r", roaddrhex, "x", xoaddrhex) - - var topic string - err = clients[0].Call(&topic, "pss_stringToTopic", "foo:42") - if err != nil { - t.Fatal(err) - } - - time.Sleep(time.Millisecond * 250) - - // retrieve public key from pss instance - // set this public key reciprocally - var rpubkey string - err = clients[1].Call(&rpubkey, "pss_getPublicKey") - if err != nil { - t.Fatalf("rpc get receivenode pubkey fail: %v", err) - } - - time.Sleep(time.Millisecond * 500) // replace with hive healthy code - - rmsgC := make(chan APIMsg) - rctx, cancel := context.WithTimeout(context.Background(), time.Second*1) - defer cancel() - rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic, false, false) - log.Trace("rsub", "id", rsub) - defer rsub.Unsubscribe() - - // store public key for recipient - // zero-length address means forward to all - // we have just two peers, they will be in proxbin, and will both receive - err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, "0x") - if err != nil { - t.Fatal(err) - } - - // send and verify delivery - rmsg := []byte("xyzzy") - err = clients[0].Call(nil, "pss_sendAsym", rpubkey, topic, hexutil.Encode(rmsg)) - if err != nil { - t.Fatal(err) - } - - var receivedok bool -OUTER: - for { - select { - case <-rmsgC: - if receivedok { - t.Fatalf("duplicate message received") - } - receivedok = true - case <-rctx.Done(): - break OUTER - } - } - if !receivedok { - t.Fatalf("message did not arrive") - } -} - -// symmetric send performance with varying message sizes -func BenchmarkSymkeySend(b *testing.B) { - b.Run(fmt.Sprintf("%d", 256), benchmarkSymKeySend) - b.Run(fmt.Sprintf("%d", 1024), benchmarkSymKeySend) - b.Run(fmt.Sprintf("%d", 1024*1024), benchmarkSymKeySend) - b.Run(fmt.Sprintf("%d", 1024*1024*10), benchmarkSymKeySend) - b.Run(fmt.Sprintf("%d", 1024*1024*100), benchmarkSymKeySend) -} - -func benchmarkSymKeySend(b *testing.B) { - msgsizestring := strings.Split(b.Name(), "/") - if len(msgsizestring) != 2 { - b.Fatalf("benchmark called without msgsize param") - } - msgsize, err := strconv.ParseInt(msgsizestring[1], 10, 0) - if err != nil { - b.Fatalf("benchmark called with invalid msgsize param '%s': %v", msgsizestring[1], err) - } - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctx) - privkey, err := w.GetPrivateKey(keys) - ps := newTestPss(privkey, nil, nil) - msg := make([]byte, msgsize) - rand.Read(msg) - topic := BytesToTopic([]byte("foo")) - to := make(PssAddress, 32) - copy(to[:], network.RandomAddr().Over()) - symkeyid, err := ps.GenerateSymmetricKey(topic, to, true) - if err != nil { - b.Fatalf("could not generate symkey: %v", err) - } - symkey, err := ps.w.GetSymKey(symkeyid) - if err != nil { - b.Fatalf("could not retrieve symkey: %v", err) - } - ps.SetSymmetricKey(symkey, topic, to, false) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - ps.SendSym(symkeyid, topic, msg) - } -} - -// asymmetric send performance with varying message sizes -func BenchmarkAsymkeySend(b *testing.B) { - b.Run(fmt.Sprintf("%d", 256), benchmarkAsymKeySend) - b.Run(fmt.Sprintf("%d", 1024), benchmarkAsymKeySend) - b.Run(fmt.Sprintf("%d", 1024*1024), benchmarkAsymKeySend) - b.Run(fmt.Sprintf("%d", 1024*1024*10), benchmarkAsymKeySend) - b.Run(fmt.Sprintf("%d", 1024*1024*100), benchmarkAsymKeySend) -} - -func benchmarkAsymKeySend(b *testing.B) { - msgsizestring := strings.Split(b.Name(), "/") - if len(msgsizestring) != 2 { - b.Fatalf("benchmark called without msgsize param") - } - msgsize, err := strconv.ParseInt(msgsizestring[1], 10, 0) - if err != nil { - b.Fatalf("benchmark called with invalid msgsize param '%s': %v", msgsizestring[1], err) - } - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctx) - privkey, err := w.GetPrivateKey(keys) - ps := newTestPss(privkey, nil, nil) - msg := make([]byte, msgsize) - rand.Read(msg) - topic := BytesToTopic([]byte("foo")) - to := make(PssAddress, 32) - copy(to[:], network.RandomAddr().Over()) - ps.SetPeerPublicKey(&privkey.PublicKey, topic, to) - b.ResetTimer() - for i := 0; i < b.N; i++ { - ps.SendAsym(common.ToHex(crypto.FromECDSAPub(&privkey.PublicKey)), topic, msg) - } -} -func BenchmarkSymkeyBruteforceChangeaddr(b *testing.B) { - for i := 100; i < 100000; i = i * 10 { - for j := 32; j < 10000; j = j * 8 { - b.Run(fmt.Sprintf("%d/%d", i, j), benchmarkSymkeyBruteforceChangeaddr) - } - //b.Run(fmt.Sprintf("%d", i), benchmarkSymkeyBruteforceChangeaddr) - } -} - -// decrypt performance using symkey cache, worst case -// (decrypt key always last in cache) -func benchmarkSymkeyBruteforceChangeaddr(b *testing.B) { - keycountstring := strings.Split(b.Name(), "/") - cachesize := int64(0) - var ps *Pss - if len(keycountstring) < 2 { - b.Fatalf("benchmark called without count param") - } - keycount, err := strconv.ParseInt(keycountstring[1], 10, 0) - if err != nil { - b.Fatalf("benchmark called with invalid count param '%s': %v", keycountstring[1], err) - } - if len(keycountstring) == 3 { - cachesize, err = strconv.ParseInt(keycountstring[2], 10, 0) - if err != nil { - b.Fatalf("benchmark called with invalid cachesize '%s': %v", keycountstring[2], err) - } - } - pssmsgs := make([]*PssMsg, 0, keycount) - var keyid string - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctx) - privkey, err := w.GetPrivateKey(keys) - if cachesize > 0 { - ps = newTestPss(privkey, nil, &PssParams{SymKeyCacheCapacity: int(cachesize)}) - } else { - ps = newTestPss(privkey, nil, nil) - } - topic := BytesToTopic([]byte("foo")) - for i := 0; i < int(keycount); i++ { - to := make(PssAddress, 32) - copy(to[:], network.RandomAddr().Over()) - keyid, err = ps.GenerateSymmetricKey(topic, to, true) - if err != nil { - b.Fatalf("cant generate symkey #%d: %v", i, err) - } - symkey, err := ps.w.GetSymKey(keyid) - if err != nil { - b.Fatalf("could not retrieve symkey %s: %v", keyid, err) - } - wparams := &whisper.MessageParams{ - TTL: defaultWhisperTTL, - KeySym: symkey, - Topic: whisper.TopicType(topic), - WorkTime: defaultWhisperWorkTime, - PoW: defaultWhisperPoW, - Payload: []byte("xyzzy"), - Padding: []byte("1234567890abcdef"), - } - woutmsg, err := whisper.NewSentMessage(wparams) - if err != nil { - b.Fatalf("could not create whisper message: %v", err) - } - env, err := woutmsg.Wrap(wparams) - if err != nil { - b.Fatalf("could not generate whisper envelope: %v", err) - } - ps.Register(&topic, &handler{ - f: noopHandlerFunc, - }) - pssmsgs = append(pssmsgs, &PssMsg{ - To: to, - Payload: env, - }) - } - b.ResetTimer() - for i := 0; i < b.N; i++ { - if err := ps.process(pssmsgs[len(pssmsgs)-(i%len(pssmsgs))-1], false, false); err != nil { - b.Fatalf("pss processing failed: %v", err) - } - } -} - -func BenchmarkSymkeyBruteforceSameaddr(b *testing.B) { - for i := 100; i < 100000; i = i * 10 { - for j := 32; j < 10000; j = j * 8 { - b.Run(fmt.Sprintf("%d/%d", i, j), benchmarkSymkeyBruteforceSameaddr) - } - } -} - -// decrypt performance using symkey cache, best case -// (decrypt key always first in cache) -func benchmarkSymkeyBruteforceSameaddr(b *testing.B) { - var keyid string - var ps *Pss - cachesize := int64(0) - keycountstring := strings.Split(b.Name(), "/") - if len(keycountstring) < 2 { - b.Fatalf("benchmark called without count param") - } - keycount, err := strconv.ParseInt(keycountstring[1], 10, 0) - if err != nil { - b.Fatalf("benchmark called with invalid count param '%s': %v", keycountstring[1], err) - } - if len(keycountstring) == 3 { - cachesize, err = strconv.ParseInt(keycountstring[2], 10, 0) - if err != nil { - b.Fatalf("benchmark called with invalid cachesize '%s': %v", keycountstring[2], err) - } - } - addr := make([]PssAddress, keycount) - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctx) - privkey, err := w.GetPrivateKey(keys) - if cachesize > 0 { - ps = newTestPss(privkey, nil, &PssParams{SymKeyCacheCapacity: int(cachesize)}) - } else { - ps = newTestPss(privkey, nil, nil) - } - topic := BytesToTopic([]byte("foo")) - for i := 0; i < int(keycount); i++ { - copy(addr[i], network.RandomAddr().Over()) - keyid, err = ps.GenerateSymmetricKey(topic, addr[i], true) - if err != nil { - b.Fatalf("cant generate symkey #%d: %v", i, err) - } - - } - symkey, err := ps.w.GetSymKey(keyid) - if err != nil { - b.Fatalf("could not retrieve symkey %s: %v", keyid, err) - } - wparams := &whisper.MessageParams{ - TTL: defaultWhisperTTL, - KeySym: symkey, - Topic: whisper.TopicType(topic), - WorkTime: defaultWhisperWorkTime, - PoW: defaultWhisperPoW, - Payload: []byte("xyzzy"), - Padding: []byte("1234567890abcdef"), - } - woutmsg, err := whisper.NewSentMessage(wparams) - if err != nil { - b.Fatalf("could not create whisper message: %v", err) - } - env, err := woutmsg.Wrap(wparams) - if err != nil { - b.Fatalf("could not generate whisper envelope: %v", err) - } - ps.Register(&topic, &handler{ - f: noopHandlerFunc, - }) - pssmsg := &PssMsg{ - To: addr[len(addr)-1][:], - Payload: env, - } - for i := 0; i < b.N; i++ { - if err := ps.process(pssmsg, false, false); err != nil { - b.Fatalf("pss processing failed: %v", err) - } - } -} - -// setup simulated network with bzz/discovery and pss services. -// connects nodes in a circle -// if allowRaw is set, omission of builtin pss encryption is enabled (see PssParams) -func setupNetwork(numnodes int, allowRaw bool) (clients []*rpc.Client, err error) { - nodes := make([]*simulations.Node, numnodes) - clients = make([]*rpc.Client, numnodes) - if numnodes < 2 { - return nil, fmt.Errorf("Minimum two nodes in network") - } - adapter := adapters.NewSimAdapter(newServices(allowRaw)) - net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ - ID: "0", - DefaultService: "bzz", - }) - for i := 0; i < numnodes; i++ { - nodeconf := adapters.RandomNodeConfig() - nodeconf.Services = []string{"bzz", pssProtocolName} - nodes[i], err = net.NewNodeWithConfig(nodeconf) - if err != nil { - return nil, fmt.Errorf("error creating node 1: %v", err) - } - err = net.Start(nodes[i].ID()) - if err != nil { - return nil, fmt.Errorf("error starting node 1: %v", err) - } - if i > 0 { - err = net.Connect(nodes[i].ID(), nodes[i-1].ID()) - if err != nil { - return nil, fmt.Errorf("error connecting nodes: %v", err) - } - } - clients[i], err = nodes[i].Client() - if err != nil { - return nil, fmt.Errorf("create node 1 rpc client fail: %v", err) - } - } - if numnodes > 2 { - err = net.Connect(nodes[0].ID(), nodes[len(nodes)-1].ID()) - if err != nil { - return nil, fmt.Errorf("error connecting first and last nodes") - } - } - return clients, nil -} - -func newServices(allowRaw bool) adapters.Services { - stateStore := state.NewInmemoryStore() - kademlias := make(map[enode.ID]*network.Kademlia) - kademlia := func(id enode.ID) *network.Kademlia { - if k, ok := kademlias[id]; ok { - return k - } - params := network.NewKadParams() - params.NeighbourhoodSize = 2 - params.MaxBinSize = 3 - params.MinBinSize = 1 - params.MaxRetries = 1000 - params.RetryExponent = 2 - params.RetryInterval = 1000000 - kademlias[id] = network.NewKademlia(id[:], params) - return kademlias[id] - } - return adapters.Services{ - pssProtocolName: func(ctx *adapters.ServiceContext) (node.Service, error) { - // execadapter does not exec init() - initTest() - - ctxlocal, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - keys, err := wapi.NewKeyPair(ctxlocal) - privkey, err := w.GetPrivateKey(keys) - pssp := NewPssParams().WithPrivateKey(privkey) - pssp.AllowRaw = allowRaw - pskad := kademlia(ctx.Config.ID) - ps, err := NewPss(pskad, pssp) - if err != nil { - return nil, err - } - - ping := &Ping{ - OutC: make(chan bool), - Pong: true, - } - p2pp := NewPingProtocol(ping) - pp, err := RegisterProtocol(ps, &PingTopic, PingProtocol, p2pp, &ProtocolParams{Asymmetric: true}) - if err != nil { - return nil, err - } - if useHandshake { - SetHandshakeController(ps, NewHandshakeParams()) - } - ps.Register(&PingTopic, &handler{ - f: pp.Handle, - caps: &handlerCaps{ - raw: true, - }, - }) - ps.addAPI(rpc.API{ - Namespace: "psstest", - Version: "0.3", - Service: NewAPITest(ps), - Public: false, - }) - if err != nil { - log.Error("Couldnt register pss protocol", "err", err) - os.Exit(1) - } - pssprotocols[ctx.Config.ID.String()] = &protoCtrl{ - C: ping.OutC, - protocol: pp, - run: p2pp.Run, - } - return ps, nil - }, - "bzz": func(ctx *adapters.ServiceContext) (node.Service, error) { - addr := network.NewAddr(ctx.Config.Node()) - hp := network.NewHiveParams() - hp.Discovery = false - config := &network.BzzConfig{ - OverlayAddr: addr.Over(), - UnderlayAddr: addr.Under(), - HiveParams: hp, - } - return network.NewBzz(config, kademlia(ctx.Config.ID), stateStore, nil, nil), nil - }, - } -} - -func newTestPss(privkey *ecdsa.PrivateKey, kad *network.Kademlia, ppextra *PssParams) *Pss { - nid := enode.PubkeyToIDV4(&privkey.PublicKey) - // set up routing if kademlia is not passed to us - if kad == nil { - kp := network.NewKadParams() - kp.NeighbourhoodSize = 3 - kad = network.NewKademlia(nid[:], kp) - } - - // create pss - pp := NewPssParams().WithPrivateKey(privkey) - if ppextra != nil { - pp.SymKeyCacheCapacity = ppextra.SymKeyCacheCapacity - } - ps, err := NewPss(kad, pp) - if err != nil { - return nil - } - ps.Start(nil) - - return ps -} - -// API calls for test/development use -type APITest struct { - *Pss -} - -func NewAPITest(ps *Pss) *APITest { - return &APITest{Pss: ps} -} - -func (apitest *APITest) SetSymKeys(pubkeyid string, recvsymkey []byte, sendsymkey []byte, limit uint16, topic Topic, to hexutil.Bytes) ([2]string, error) { - - recvsymkeyid, err := apitest.SetSymmetricKey(recvsymkey, topic, PssAddress(to), true) - if err != nil { - return [2]string{}, err - } - sendsymkeyid, err := apitest.SetSymmetricKey(sendsymkey, topic, PssAddress(to), false) - if err != nil { - return [2]string{}, err - } - return [2]string{recvsymkeyid, sendsymkeyid}, nil -} - -func (apitest *APITest) Clean() (int, error) { - return apitest.Pss.cleanKeys(), nil -} - -// enableMetrics is starting InfluxDB reporter so that we collect stats when running tests locally -func enableMetrics() { - metrics.Enabled = true - go influxdb.InfluxDBWithTags(metrics.DefaultRegistry, 1*time.Second, "http://localhost:8086", "metrics", "admin", "admin", "swarm.", map[string]string{ - "host": "test", - }) -} diff --git a/swarm/pss/testdata/addpsstodiscoverytestsnapshot.pl b/swarm/pss/testdata/addpsstodiscoverytestsnapshot.pl deleted file mode 100644 index b75cc9894add..000000000000 --- a/swarm/pss/testdata/addpsstodiscoverytestsnapshot.pl +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/perl - -use JSON; - -my $f; -my $jsontext; -my $nodelist; -my $network; - -open($f, "<", $ARGV[0]) || die "cant open " . $ARGV[0]; -while (<$f>) { - $jsontext .= $_; -} -close($f); - -$network = decode_json($jsontext); -$nodelist = $network->{'nodes'}; - -for ($i = 0; $i < 0+@$nodelist; $i++) { - #my $protocollist = $$nodelist[$i]{'node'}{'info'}{'protocols'}; - #$$protocollist{'pss'} = "pss"; - my $svc = $$nodelist[$i]{'node'}{'config'}{'services'}; - pop(@$svc); - push(@$svc, "pss"); - push(@$svc, "bzz"); -} - -print encode_json($network); diff --git a/swarm/pss/testdata/addpsstodiscoverytestsnapshot.sh b/swarm/pss/testdata/addpsstodiscoverytestsnapshot.sh deleted file mode 100644 index 7d3c2849169d..000000000000 --- a/swarm/pss/testdata/addpsstodiscoverytestsnapshot.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -sed -e 's/\(\"services\"\):\["discovery\"]/\1:["pss","bzz"]/' diff --git a/swarm/pss/testdata/snapshot_128.json b/swarm/pss/testdata/snapshot_128.json deleted file mode 100644 index 7bafd358fb22..000000000000 --- a/swarm/pss/testdata/snapshot_128.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","private_key":"79eaaa1c3a9339a90cf54c511649caf683f2910588a872d2c12919355b7d5d28","name":"node01","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","private_key":"b067839f81534251ade8651e682dbd8324dfb83c7034aff4a48909e9310c990a","name":"node02","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","private_key":"4233e4c480ae197c265975cc7c83cc7b0cf1a8d67e4728bac4bcecaee63ad935","name":"node03","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","private_key":"ca0c9f1baad4f60ddeaafe287d43b4ef8ec4b96c4ef12da194074325ca6cc4ef","name":"node04","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","private_key":"b6c09a581c2a6d85a63c11e586391346fe9d9d24292de15333ae230a33c52c1e","name":"node05","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","private_key":"378e3e11e738557d2eea27e070d52c8355f8abe0c5f8607ac0792455a1d50bae","name":"node06","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","private_key":"e6710b29bb9b7f00ee1e921bd548fc7622d73a0aae3f25de7a3f3650191147a8","name":"node07","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","private_key":"2bed1cf9737dbf8239f560ab8b4e57dc47cf57a28ebd203e6fb159093fbe52c0","name":"node08","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","private_key":"3f63c3dd3bf2b5be6e9af3ce596eb65cb58a36749d0baff1759d8dc6f4da8993","name":"node09","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","private_key":"38ffbfff1b5ab2f905daabcbbc12a5e28aad826a80d0a40988a04d6653942a50","name":"node10","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","private_key":"aa2cc30f2f6e589ca122890fc95845f4a81ad7e57f2661343ff6af3d401c46f3","name":"node11","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","private_key":"5b4a4da121c72f3d0d453394e6f09fc9ddaa5a13e44acb1ef6684867b4cac14c","name":"node12","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","private_key":"98f5b9f4be5d997b66834ae619c58f54d941623dfcb9a6783bfce77fdb3f3d4b","name":"node13","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","private_key":"cbbe3c5ab5aafd2dae03deda6db9a3e7e58ffaad5c1edd37d7a13951aa733590","name":"node14","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","private_key":"62a83d45655860933bf8a2348695dd695176f3225f4ba72e70284b648130d330","name":"node15","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","private_key":"8c72a0c564073065c5300e822a476fe3dd8b373cfd0dabaf0cdb056ca0ece2f9","name":"node16","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","private_key":"b6eb72555f9952a32406b7576ac85ead5cbe9004f37b6ebe8f7c3b6e17973104","name":"node17","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","private_key":"e9bdb2a275f0f2fd6ef4266bca55fad475c5d9e4ee0db2951ae91fd629cb2029","name":"node18","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","private_key":"d9a2bcdb02288fd5844d0be689ea4286f27991bfc82c76f6050a3e3d2f0858a1","name":"node19","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","private_key":"8ee0c4634570903c3d7383adb12cd35a82bb1c9be593755bd77c90a1bd6bbdfe","name":"node20","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","private_key":"16df12116ebc93bdc671ba1351bf03b763d3e67b2c9c468e56177c80b0dcbf84","name":"node21","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","private_key":"1a78b7fedaab9310b17675717481b1331eed3fa3c77cd96addf6bf9abd778aae","name":"node22","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","private_key":"3d37e996f181b4f57d5c5a61a07f86f1869c760604dfe9166d5b3552acf1a43b","name":"node23","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","private_key":"5895ce723440eaa77daf0a8779cc52992427524e420e3ce71ce1b24f3bd4658c","name":"node24","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","private_key":"cf20ef905d7d3d1141c472afefd12332bff10edecc695e409af38086c7a1a5d1","name":"node25","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","private_key":"1a7c744024c7baee8c43425861a5a4ff2ea80533fe6549a58e61b50c93059fed","name":"node26","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","private_key":"7399aa5562abb3ca2add08c810d607ad6fed7a036622eaea561da8a5aa51c0af","name":"node27","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","private_key":"ded7b34b0c8218bfba59e8d061b50cea365a9f137b9a66064e2287ef660dc789","name":"node28","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","private_key":"39ac5498c92329fc18c4eb0ec36cca3c5270f322084a1fc42fad1be0b5f32081","name":"node29","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","private_key":"add3ad2926ebf0b30f111796475cf160bcd1f1756866dfaa19e048c6954975c9","name":"node30","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","private_key":"d5290ae40b68ae7b51fe7ce7d83ab96841aa97a3457fc1bcf70065a2d2b60c20","name":"node31","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","private_key":"ba7abd532b10496c6363f35e231ff80aef25246315302fd138dd977d5ece20e5","name":"node32","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","private_key":"e58bb287592c2b89814ed3475004f5c9b2eb226483fcb8235619b6b42747d10c","name":"node33","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","private_key":"53e9afc6c039fee226bd9a0b537355f23e93457dc0eabbdce75e4d1ad7a473e6","name":"node34","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","private_key":"079cf6730627562bbbff031d22ab1ae9e65b7747497adc327830e5d6768d6b04","name":"node35","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","private_key":"c3157fe034d3a477f697b756cd9ae1de532b0ae42bb5039f6d2bf399bb2ddbbd","name":"node36","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","private_key":"d4472d7bc821536231d70dbdb3f0a5e3fdd104dcbf5a97c9521b0778d9491680","name":"node37","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","private_key":"23c79a6a5af06f9e9cdb6f4b4e40e25eca8793ac91db22cde17e0a3851c1f48e","name":"node38","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","private_key":"0295fa1706ccdcbdc8d7943b8d2011c6f46225d85b574d2d02b4a8dec66f9a29","name":"node39","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","private_key":"34d1685a48b56e62b30247fffb44ba2b41f2d806344fe52f7dc9049a778c667f","name":"node40","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","private_key":"b6273af6a94c07db54566d0d2f93121d0ddf239921e8e46af19babd2fa9930a7","name":"node41","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","private_key":"362244251a7f1bf4bc855ff3b272b1c7c7fe5d8338af0c581fee2f49e2939ed8","name":"node42","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","private_key":"bf6cd10025d018c0abfae2c88aa7c46c3d12d612580e6b4aacdc51fd52476270","name":"node43","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","private_key":"0659e3a41adc716b493c6ad765c5b26d35c95a1edb254efc8ab967e71e3e0a16","name":"node44","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","private_key":"f6d48b4c10f3257bba2f626d48192d94a1b1de3ab1480b618a0bff07eb20396e","name":"node45","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","private_key":"4a487eb7a3b924414d988104fce6f87a70502db2d5d71dcbc1a115b37212cb06","name":"node46","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","private_key":"9e2309fa485ace73ce907035f5113e7b13e5719c819479b10fd9386a3ad5236f","name":"node47","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","private_key":"e511c730e803371042c631512a12d74b1c31a53caab237719b8fa007e4cef9ea","name":"node48","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","private_key":"bb4c6b3c0931311ef5e31087f74a1a95aa39da470737c4c1a2a730ea2cac1c76","name":"node49","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","private_key":"88c0abdb64c6dee8117b7b720d5782321ce583fcc76e6eed2ee1f6279a82ea39","name":"node50","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","private_key":"e6eef1e846329e10e247843f7cee455af8ad3579e5a1e6360aea0ecc51982759","name":"node51","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","private_key":"ffd961376b67cbfafd47d89610291ec8fc2af2c16bc31e6851f804e15b2e9cd7","name":"node52","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","private_key":"db9ca337fd3ecf30fa6c217606072c214028b8d723ce82de57cfb4f0266a653d","name":"node53","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","private_key":"40e9de0543bd2c35509ebfcf51aa5a543d9616831505b5644e982144f4971f3a","name":"node54","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","private_key":"f2806927e5ba924b002b05116a66bdd62d4eed7900e91f3e31892288bd06ebd1","name":"node55","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","private_key":"f38a84e8d30f9c12d52071b696ff7fbd355dc875cbf937d2f491f4f3e193fc8e","name":"node56","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","private_key":"a3895eb5276ca39ba15c02895c3537a6c3a7be75de7b2ee2bee1fc5b9a313240","name":"node57","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","private_key":"8135cdd3f1b3d517b1f4a11407dfcdf6a31b3dc087ddfe2224999f16ee7ca9de","name":"node58","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","private_key":"29e270aecc8603f2224bee7f11039231b7a28efc5b29deeb9d98d0af388a87d0","name":"node59","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","private_key":"04d1ab0b03908f14773c60464c51526f925e192645efc3781a7117f22bdc4835","name":"node60","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","private_key":"f7320ebd494ac4fd8d6871123b7531dee97fba428ff30994f4d3ecc3f9312001","name":"node61","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","private_key":"b71a899f42faf2bdf9824d145f6f5959178f61f05e460e888c862ba8b03b5448","name":"node62","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","private_key":"43ea846524b82ef37cdaa1546b555e1a8d7510fc0cc7f11a6e040b79a5fcf054","name":"node63","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","private_key":"0f863dee7eca46274fc2ec03645bf96424ffebbe6f5c26631051127cf730e223","name":"node64","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","private_key":"a70d3a2696371a3cdee8702bbc4b008a564f36a8570b3bef778d00e5c4bc7da6","name":"node65","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","private_key":"24cc61b4c4e59317c2927bd635bd3ad2863c0598321f0e5d60c3b534ed151558","name":"node66","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","private_key":"36459a9e26fc4c00dd4c89bdf4c86c717b9701169ad7154228b8fbfff55661d9","name":"node67","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","private_key":"b947082437b645032dfff6e9d20e2eed52aace2d5e29cc268b06898cededdabd","name":"node68","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","private_key":"5ac248334fa8c619d900ac284274784dc99fe0ae517e749c989a15bad1652ccf","name":"node69","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","private_key":"7c46fa70253c48efad70d0b3da97e5c5680b1fb430147ac6f821729a836c667d","name":"node70","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","private_key":"2d39f1bc0c0b3b7bdd1b9ef4fdfd54dd5b7db9743a16baa7c5f8b50948062e8d","name":"node71","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","private_key":"d4e45cb0946161c0f4333c4db19bdeabceb81b4db44982a776556e8da0bf3928","name":"node72","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","private_key":"df8fd4bcf5cb62281500f76bc0b09d7ac1576ffd0edadbb8d39301406ac8e0fd","name":"node73","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","private_key":"5ec7e6e237997309e30846fed2a2074e5a150ae82804f581cb4a69ea69fe0118","name":"node74","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","private_key":"06d5dc287feafe3797b6302002258d7ea058679dc501e7a05f64fabd41b1b701","name":"node75","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","private_key":"a06a77e7469d86991954524d4a1495b5aeb80bb413c0b1293479dcc8ce511108","name":"node76","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","private_key":"9e6c3d21c05d371fd69225b2eef1d1eabedad577ae026b6d8ad8f728a53d657b","name":"node77","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","private_key":"cd8b5f4a6c0d361bc118318b1f1c5e69ef7b546e5ded44742e97124cfb80c52e","name":"node78","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","private_key":"04ed808eb12d991a68104f16e8965f3e6d60ba0b0dabff4fe33b3878c63d25f7","name":"node79","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","private_key":"175d97bb42b8f0effb21274a929a499f0e49e8e6ecad97b853a164464ad20bde","name":"node80","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","private_key":"34dbf4adc051f2ab18ea18c1faaec6726857cc5e0fcb3181fb296a723d2971c7","name":"node81","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","private_key":"21c776bf36961c727b36ff521a7527764077944b7932dfb901ca6489b2e123e7","name":"node82","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","private_key":"db4ace065dad27967a83ad918dedd4b4d7b1aaa331057ca1a2033fcba3e16df6","name":"node83","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","private_key":"2642ed9d36375a48a74d6aee878a935a15e7bd219d39bbdf455b0a168c98a8b5","name":"node84","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","private_key":"c1c1f7cd104f6f7163fe144041570269558b335ae6ddbdb80c79687faf55f5bb","name":"node85","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","private_key":"89501ac0b58fa2ee82ba6ef2b45a3c0ab6d8f54f4b92da1111d97ecfedbf5fc3","name":"node86","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","private_key":"cf649d632a25375b28cc6f7821de3e0df16b52ad9e0ff8978b231e20d6ed37ee","name":"node87","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","private_key":"bceddc4ac81042ad71089e4c861518f8d018601263d1faa17238f1c326e4b317","name":"node88","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","private_key":"a870aecb16e345ef241f69348d08489eb250b113f2072ab6371dda815d799f3f","name":"node89","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","private_key":"07af0af8e7e43f2822c2c0c3d34a1742faf6e11328b6194a760e9acefb5dedc8","name":"node90","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","private_key":"683b9cd98aab26ece4c2e53dd44a1fde3ae2303f80f99dc7e7e5d4b80e5a40e2","name":"node91","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","private_key":"31b3da34d338fb902b718378f7b5ebbdcdff30e4e3d3deff8b021e3979a7c6de","name":"node92","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","private_key":"997bcdc19c47350a268aa991a33d767bb6fc29de16593e0b099e793aa1db638d","name":"node93","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","private_key":"393e54787cdfec2d8d987f785700170fbcb31fd541c9c05199cd77d3a16a6dc4","name":"node94","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","private_key":"0cd4a911f2b1193b22efc0823fc2ed9beddafb7705f5597ce6d7335aadae0e1a","name":"node95","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","private_key":"fb0590eb4eb2624363f0740cbc794f9adb8356ccbaf6650c8baca183edfde3b8","name":"node96","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","private_key":"40d4caee240073f0bfc9307eed26d4286f944f467837b7250ee206f40d2880d4","name":"node97","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","private_key":"207c5a4e99506c7afdfff66611cf0baefe929f7c8a1a7a802cb44df3fa650618","name":"node98","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","private_key":"fa964e311f099e564ffa3ff9820a9ad3a8723f738fce6da11be604636f275831","name":"node99","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","private_key":"23f2913103e5295ddfdc6485c2ea3c33bfda3e0ceea62cac5401ceabdda0668a","name":"node100","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","private_key":"f3c37d7a8e80e1e71fba834055bf934536fd9e117f496b156d46bca96632ba5c","name":"node101","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","private_key":"f4151729479b0ae76a7b853aa9d3460ee67adcedc364ac97248fb383478ba113","name":"node102","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","private_key":"482aa546e8e665988c7329424342961c10084e439d562aed129d21a8c212d007","name":"node103","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","private_key":"2641708c3c6101db41db1a7eba5ed6b54e7ebc3014cb575ed71d291a6aacfc28","name":"node104","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","private_key":"9b9c1c2253292c4de58f82fd6bba15922acfa246fa0717a869c0d651ce19e826","name":"node105","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","private_key":"7cc79c34ac4847aaba7f1e2de8d23910301dbfe606d052cce33ad0340a1f82fb","name":"node106","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","private_key":"4047502d07951bf2380ef595036f9e99db3b0f7e1229040e21da5fbc49e7d820","name":"node107","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","private_key":"02a6713184cf6e413a6ed6a6839150cad9c72d40951b265a754e56b5bdb74cbf","name":"node108","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","private_key":"12d74d71de5166524deeed2ba475f9ad46c296668af272f0ade12162bed0f50f","name":"node109","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","private_key":"4fff513c0f905a42d6d18a90ae6a78c60757490480579162c9e0760361baf184","name":"node110","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","private_key":"5db638bd9bfaf4c2e1af1f3f1dc1e89382a6a2982f303fc80504b44aac1a6264","name":"node111","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","private_key":"6caa9dcb10b84a658d4ef791909b6532395f0793f9f8bce99a3a1b985ce619b9","name":"node112","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","private_key":"63375740be7dc5d3a76a7b3249786a4c7382eaf8b648e5a39a7a850722bad29a","name":"node113","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","private_key":"110a610c6c2f1720584929baf4ab9c8490923fc7b421bd251e444b752f8f8957","name":"node114","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","private_key":"7a8380aa7312fe4859408a51876e9f44b56151086e4bc36569a8f55bfb3a007b","name":"node115","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","private_key":"1e498dce32dcdfdf4b6c691fa203e3809fddf1b19b1b1da0b1162b9037ecc303","name":"node116","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","private_key":"03de0803048f078de61e3eef039a9ecb0e761216573392a6692630f3f291cc25","name":"node117","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","private_key":"934aa39349989614a1b0a71785880e61c60bb2579a9d52b832887849de94ec24","name":"node118","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","private_key":"011d6fce7eed10fc8c5a7a9ca21769efc6581023c2c857c28d97a6ebb1c43a53","name":"node119","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","private_key":"76d98f9c684d01fe8121cf715f01457e9fc38146a717958c8bb325a3b4ea44ce","name":"node120","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","private_key":"7aa614585809bea3b748e6df2e1a8da2b201a9ae84f11c819b5669234a10f76d","name":"node121","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","private_key":"71857ed16ee507ae0dd576370348a196d43274a3895f26fb8659ec79c1ecb79c","name":"node122","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","private_key":"3e5c543d406054ba1338ea28c37198eb8153a157eb5a0aecc186dceb04e10632","name":"node123","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","private_key":"3771d716bd74a4be3b8e154d3aa3b2302700b5ca1607923f7414c147a7cf67b7","name":"node124","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","private_key":"25dc939bff90ac541a61b59e0d2b4d3b9891379de3893645f06891c5be0d5695","name":"node125","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","private_key":"e6ad803abcef9554bdff08a4f4b6a7a65dc574bf92d32ee882413c9269fd31f3","name":"node126","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","private_key":"a482a87960aae2e446cd2aeb304e7baeff9a24d2bace4d5f919b5bda00a5f0eb","name":"node127","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","private_key":"214126811a121d6fc0443ce66e59372bc72dea9e220ab6e7d6da961741590d47","name":"node128","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","up":true},{"one":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","other":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","up":true},{"one":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","other":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","up":true},{"one":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","other":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","up":true},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","up":true},{"one":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":true},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":true},{"one":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","other":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","up":true},{"one":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","other":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","other":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","up":true},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","up":true},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","up":true},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","other":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","up":true},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":true},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","up":true},{"one":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","other":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","up":true},{"one":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","other":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","other":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","up":true},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","other":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","up":true},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","up":true},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","up":true},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","up":true},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","up":true},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","up":true},{"one":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","other":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","up":true},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","other":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","up":true},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","other":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","up":true},{"one":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","other":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","up":true},{"one":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","other":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","up":true},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","up":true},{"one":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","other":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","up":true},{"one":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","other":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","up":true},{"one":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":true},{"one":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":true},{"one":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","other":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","up":true},{"one":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","other":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","up":true},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":true},{"one":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":true},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","up":true},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","up":true},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":true},{"one":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","other":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","up":true},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","other":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","up":true},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","up":true},{"one":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","other":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","up":true},{"one":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","up":true},{"one":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","other":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","up":true},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","up":true},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","up":true},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","other":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","other":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","up":true},{"one":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","up":true},{"one":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","other":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","up":true},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":true},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","up":true},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","up":true},{"one":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","other":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","up":true},{"one":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","other":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","up":true},{"one":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","other":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","up":true},{"one":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","other":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","up":true},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","up":true},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","up":true},{"one":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":true},{"one":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","other":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","up":true},{"one":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","up":true},{"one":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":true},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","up":true},{"one":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","other":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","other":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","up":true},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","other":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","up":true},{"one":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","other":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","up":true},{"one":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","up":true},{"one":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":true},{"one":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","other":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","up":true},{"one":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","other":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","up":true},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","other":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","up":true},{"one":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":true},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":true},{"one":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":true},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","up":true},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":true},{"one":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":true},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","up":true},{"one":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","up":true},{"one":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","other":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","up":true},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","up":true},{"one":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","other":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","up":true},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","up":true},{"one":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","other":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","up":true},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","up":true},{"one":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","up":true},{"one":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","other":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","up":true},{"one":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","other":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","up":true},{"one":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","up":true},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","other":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","up":true},{"one":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","other":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","up":true},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","other":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","up":true},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","up":true},{"one":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","other":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","up":true},{"one":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":true},{"one":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","up":true},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","other":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","up":true},{"one":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","other":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","up":true},{"one":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":true},{"one":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","up":true},{"one":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","other":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","up":true},{"one":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","other":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","up":true},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","other":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","up":true},{"one":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","up":true},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","up":true},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","up":true},{"one":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":true},{"one":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","other":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","up":true},{"one":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","other":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","up":true},{"one":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","other":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","up":true},{"one":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","other":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","up":true},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":true},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":true},{"one":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","other":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","up":true},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":true},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","up":true},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","other":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","up":true},{"one":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","up":true},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":true},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","up":true},{"one":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","other":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":true},{"one":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":true},{"one":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","up":true},{"one":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","other":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","up":true},{"one":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","other":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","up":true},{"one":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","other":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","up":true},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":true},{"one":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","other":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","up":true},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","other":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","up":true},{"one":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":true},{"one":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","up":true},{"one":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":true},{"one":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","up":true},{"one":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","other":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","up":true},{"one":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","up":true},{"one":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","up":true},{"one":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":true},{"one":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","up":true},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","up":true},{"one":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":true},{"one":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","other":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","up":true},{"one":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","up":true},{"one":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","other":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","up":true},{"one":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","other":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","up":true},{"one":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","up":true},{"one":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":true},{"one":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","other":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","other":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","up":true},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","up":true},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","up":true},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","other":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","up":true},{"one":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","other":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","up":true},{"one":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","up":true},{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","up":true},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","up":true},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","other":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","up":true},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":true},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","other":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","up":true},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","up":true},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","up":true},{"one":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","other":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","up":true},{"one":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","up":true},{"one":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","other":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","up":true},{"one":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","up":true},{"one":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":true},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":true},{"one":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","other":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","up":true},{"one":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","up":true},{"one":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":true},{"one":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","other":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","up":true},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","other":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":true},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","other":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","up":true},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":true},{"one":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","other":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","up":true},{"one":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","up":true},{"one":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","up":true},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","up":true},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","up":true},{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"45cdaac4c087e6b737507fa29936d09f2fbea14f49ef0ce91c18080456a7459b","other":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","up":true},{"one":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":true},{"one":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","other":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","up":true},{"one":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","up":true},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","up":true},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","other":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","up":true},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","up":true},{"one":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","other":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","up":true},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","up":true},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","up":true},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","up":true},{"one":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","up":true},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":true},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","up":true},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","up":true},{"one":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","up":true},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":true},{"one":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":true},{"one":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":true},{"one":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":true},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","up":true},{"one":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":true},{"one":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":true},{"one":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","other":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":true},{"one":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":true},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","other":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","up":true},{"one":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","other":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","up":true},{"one":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","up":true},{"one":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":true},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":true},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":true},{"one":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","other":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","up":true},{"one":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","other":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","up":true},{"one":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","other":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","up":true},{"one":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","other":"88a9b808cabfadb31c1a01b5a09eb4dc6cb7e011348f095920dd12e330ba9c0a","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","up":true},{"one":"aff775d47ebe35fbaaad26c627470abb8481558cb5a08c42a44597a98408a919","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":true},{"one":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":true},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","up":true},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","other":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","up":true},{"one":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","other":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":true},{"one":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","other":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","up":true},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","up":true},{"one":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","other":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","other":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","up":true},{"one":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","up":true},{"one":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"247dcb2c787abfa845b39cb9d7f9a6d59ea915006f250a4d760cdd8e16b3a5a6","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":true},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","up":true},{"one":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","other":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","up":true},{"one":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","up":true},{"one":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","up":true},{"one":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","other":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","up":true},{"one":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":true},{"one":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","other":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","up":true},{"one":"d6e3d3ffd3858b8284bc9495b2d90b4b1124009a4a7d7394182977a8ae39df55","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","up":true},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":false},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"20c4c3a3523960ad74538e726e1caaeda987cbc16dcd3beeb63fca6eebd31405","up":false},{"one":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","up":true},{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"07c79aaa7fa759f797b88d8c495c5bfaa12f15289c6a567bbc363fd070227830","up":true},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"0066352177d6c225842362ab424a632f569980b02ac55a13a71593af94cb8c2d","up":true},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":true},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","up":true},{"one":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":true},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","up":true},{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":false},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":true},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":false},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","up":true},{"one":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":false},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","up":true},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":false},{"one":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","other":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","up":true},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","up":true},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":true},{"one":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":true},{"one":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","other":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","other":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":false},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":true},{"one":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","other":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","up":true},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":false},{"one":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"0104c3fa3f6b9237565759debed3f1fcebfa75efba7f01e81f06a53274cdf619","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":true},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","up":true},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","other":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":true},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","up":true},{"one":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":false},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","other":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","up":true},{"one":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":true},{"one":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"6c29a1bc0f1025207b4524fadd7c8cd3dd956816fdfc57bb525c4ad3bcca9169","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":true},{"one":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":true},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":true},{"one":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":true},{"one":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":true},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","up":true},{"one":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":false},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","up":true},{"one":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","other":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","up":true},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":false},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":true},{"one":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":true},{"one":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","other":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","up":true},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":false},{"one":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","other":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","up":false},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","up":false},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":true},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":false},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"adfde69b7633188d7c5a44e51e856d023c946d4cd8fd16bf539e6d1764dd7e04","up":false},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":false},{"one":"051c8d430b54d843feb325c2b56e36524566d64f48f6c770739748409af44364","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":false},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":false},{"one":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","other":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","up":true},{"one":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","other":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","up":false},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"22b84df73059c92bf59fdad51fe574e027c7cc555dddbf363d745c1c422a89fd","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":false},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":false},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","up":true},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","up":true},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","up":true},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"ac3887308a4c3591293c43f5d5f312874b30e0dc19faa57626fdc6b830d3e433","other":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","up":true},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"776fdbabbca42ecb49cc5451b860305ec3020889b47adaa2add6ea359afe379f","up":false},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","up":false},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":false},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","up":true},{"one":"78db863d7f60eda6a275cc9f4d1696cb32f5d46de747d278aa17ecd06c791135","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":false},{"one":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","other":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","up":true},{"one":"1d531b5c8dd7bbbbf8c2db8f6984d2c9b23d5fee33876379e9d3e62a920e04b9","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":true},{"one":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","other":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","up":true},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"e884bd666b0215cfe88ee19457c67c747fb1c6815855160f1c243c149b24e923","up":false},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":false},{"one":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":true},{"one":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","other":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","up":true},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"6b7da636e8eccac658c0abf6aa8ddd74be6d4cf9c5e0333bd28d9a6d1fe43ab3","up":false},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":false},{"one":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":true},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","up":true},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":false},{"one":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","other":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","up":false},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":true},{"one":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","other":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","up":true},{"one":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","other":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","up":true},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"a93b2360b87425860185535aca8fbf3225e0c141d27690d60144689ae0f28534","up":false},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","up":false},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":false},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":false},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","up":false},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"960eb6f745966f47aadb13d488aee1187486c99e6bc78c679a6d9b3d421d8eb0","up":false},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","up":false},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":false},{"one":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","other":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","up":false},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":false},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"6b1f3a9b65ce3a168fc98dee2b14b1de6912fd02ee2609b047b2c56f6c3b53e9","up":true},{"one":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":false},{"one":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","other":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","up":true},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","up":true},{"one":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":false},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"6ad608f1087b8af40359db45e7d78e43c3465fdae5cc01a9a9ab6c149cb6fdf3","other":"69baf7ee43b360a3238ad3b175e0ad9c24967dae60c7e91d1ca7ee55167b2bdb","up":true},{"one":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":true},{"one":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","other":"e8d0bd04fa5b56fcd50cb4b1d550855c21192f1294f2954401348c8a28b455ab","up":true},{"one":"60cbf513366da3f6ee288d3572dc3971ae256b02e5492595e63c31a7b1b0d5a8","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":false},{"one":"c42f36bf6728b24721ce5ac1272a1058e202a236d276af1265a1eaa675f8fd85","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":false},{"one":"a20d591ea15722712e83fcc6c17732f2370034ef870234a0fa0b2f4aea572fd5","other":"a6cad8da6a7949d7624b7ea636fd2d72de6a9b14f899df6263ccb4b3e5351c6a","up":false},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":false},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":false},{"one":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":false},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":false},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","up":true},{"one":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":false},{"one":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","other":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","up":true},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","up":true},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"351d1ed5c4012f8870ef2acadc7c0fea2cb697f5688b92e0150c5f670661c617","up":false},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":false},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","up":false},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":false},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":true},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","up":false},{"one":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":false},{"one":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":false},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":false},{"one":"58207fc8d92e44a8274398d6105b90d763981afba7021b57be98591e7b739272","other":"6c2fd129c8493cea7634a91aae559ceb64f01cebc45ec59aebd7e709b65941be","up":true},{"one":"1030a5d27a502aeb868e7158373c48af6a85e829ee3a84f4a0b78f9a30bd5a6a","other":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","up":false},{"one":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":false},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":true},{"one":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":false},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","up":true},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":false},{"one":"1a696462de3d83ff271f30f6d66de968325e37a36877dd67b45d9cdd7e644b5b","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":false},{"one":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":true},{"one":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":false},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","up":true},{"one":"f9e4dbb28099af8ca5f28c641a51672f4c6ab54b7037f765a7172a399acb8edc","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"766b61b773ad34c6cfd30b9c2e94840d151c31ab8cbcf546943eb5821d5a8f36","up":false},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"944e8231f9f661435f1f94abfaa17862a005877487df5c5d3a566c4dbe46be3f","up":true},{"one":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","other":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","up":true},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":false},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":false},{"one":"c6edfd613f216f48a1ea05be84faa5b9a69dd97c6e5d72e0bd339ea62c1b19e1","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":false},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":false},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":true},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":false},{"one":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","other":"9dc8a0545acfdd12cb985532b9625d8860b8c87aa871f07f9c91f1599860831e","up":true},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":false},{"one":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","other":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","up":false},{"one":"d6a203c341b618c47ae53b339563b22c31dfc12d89dea7ba0c33e1812829684c","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":false},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","up":false},{"one":"7d14fd0b6c554f218249fed7709df51946baf91a3045ed99fb662c32cc97541b","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":false},{"one":"5f8eb6ff0f6ed720eaae86390757833f4b9cdfa52564457ed90c3de260ab6c30","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":false},{"one":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","other":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","up":true},{"one":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","other":"62d5162001253b3964e6772d35bc31aa372a42e87ce450d48dbb84f5d3c9e8f2","up":false},{"one":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":false},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"212479d1ab813951780af2bc09a8119dbf62e603c05c0ea26329625036f6708a","up":false},{"one":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","other":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","up":true},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":false},{"one":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":false},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":false},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"39b5d09d1227a776f8d65b7239cd03e04499e7d519e5d1ff4c4870a1a949dd91","up":false},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":false},{"one":"ede2568d60ce7a12b4380818a31d2895fcb9b815cfb5526d28b2a82ff62e0381","other":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","up":false},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":false},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","up":false},{"one":"57d3361ee59d006e1dba3e1ae9ea624444ee09f70410dff492d624d7e7786d2d","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":true},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":false},{"one":"7c992ceefe03187bce1edbf8f80ccd1cab80b3908e625a61fef21ec6d35d04a3","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":false},{"one":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":false},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"4e6eab6eb3d49b20e2f3dee169d4647ebf26d07044698ff93d51c5fc30fb4ae0","up":false},{"one":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","other":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","up":false},{"one":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":false},{"one":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","other":"8357eeaa65808f09b9a83362cb07508878becee9f843a5e1e70d025167b198ea","up":false},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"f7cd1cc174a21f190a715dad84857f563908db960f2a5943ef015caf6220a8d3","up":false},{"one":"0561b40886edc84497731c7b64acdabb63a22abe573847b78f74887afd86d71e","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":false},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"1b6168d6a369029690e836d26ffe017e26769ce504c142abf2a4a65774ecb66d","up":false},{"one":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":false},{"one":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","other":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","up":false},{"one":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","other":"0ef0bf53ddadd2c942f21e7e09d5a902d166f13920aabb2aa6652b70c423f575","up":false},{"one":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","other":"893773caa8e126430f189186956f3e80b49107ce52777972f5e8c11027c072d6","up":false},{"one":"4f7abbc51265dfe22d58f3ac5cde2c05ec56053efe79e3ebb6ece96183dcc17a","other":"5258fdc94d78bb45d6634f2672bc2eacdbc896fc5a39784ecc9d8a7dd52cb1e7","up":false},{"one":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","other":"795d813cab67300b8c59c78b6b99403c8111920ca47c1e56edfb513bc4999f3f","up":false},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","up":false},{"one":"2742110997dcb690946885e5a4aaa039f72c9f92025e62f1d371922acf5e27a7","other":"1a16e158f1d35f2573d20b05ba51a2c9cc196547038e3b7be97ddc7598e81257","up":false},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":false},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","up":false},{"one":"1f1580f6bf3df2ce7a50ec53be2511d22149fede99ca6194b611471adabfafaa","other":"746898d197934d17cd93b958ab20aaa85dba99057495048d2cabc8a996926e05","up":false},{"one":"ce12d7b26736d08eaa424a5f972a5a1fd50d05aab330340f3605dbab8007bf28","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":false},{"one":"c1c13885e3f543804e62e3b34c0d9762778866e5b8fe9d9df0caa6a64ec41428","other":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","up":false},{"one":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","other":"b26eff0d882918a40b909b2fc79489a671a9f990cc0dd3d835493bcb52a468ea","up":false},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":false},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"bb9c9f07ee2f8bc2bb0f011309f8314de7c1777a6f683f90506b180ef6f5aab4","up":false},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","up":false},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"fcf3ccf76c4699752670103e9cb98ac1294339a357876c71673f7e486d02f08b","up":false},{"one":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","other":"567206d70bc58993b08719afd9c007c562aad99437599356763b74cd4707083c","up":false},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"171f8d32719c1c3a330cdec42e47f0a5876bb2cc1cac8f13579f9cd19887c531","up":false},{"one":"816609d5b9bdb0c7bad6cbe9400fd506df8662b14ad0e0a61bc7b49482548e39","other":"a3e87b083776e34d10941832ec078fe9a7b8bae8cefe6fecdd5561549561a7f3","up":false},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"e22c1f74c4b480fdd2fbe84ad321a98230efb98fb1cdec4f79e4e50b2b0d5cc4","up":false},{"one":"66f6ff5fbc2526c1db5db491e49138362bef23032c6344ed4ead7dcb58bd1e6c","other":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","up":false},{"one":"41f407b92b1462b93400819a6af8815797b9dbc505afaf0162bbaea795205716","other":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","up":false},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":false},{"one":"016e174a29dc18857107fbebc876689b401c1174964ac6cacb31a4cb847a4d30","other":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","up":false},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"869fc21fff150ce9e1bc4512b183559433767cfc1cb7b6baae6d2a1313245ae8","up":false},{"one":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","other":"88dc5f31a2b295e8b43bc6e7abaae130061c2d44c49c95bcca3d9dd0a268324c","up":false},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"85845413850f5e38cce69548e20179b477bf383dd2b22428358715d9d72421ac","up":false},{"one":"ef40fdb37f2f89ec77833e48b1bd210b2241949b9ef8f6dca6bf6189503abb2c","other":"efdee7c9bab75e85302e3cac95ca2434af63ccb731ed24e0bda419e7a471cdde","up":false},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"74a4ffb0d717a523ec72e07cc5efe3e98d55932d6e0592ef45fe54b378e4e952","up":false},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"2c3d7e056f87daf540821a31ea8fe9377d00ed3a55ffba67b8bb716cdd9b7303","up":false},{"one":"fb211f405a7dc3a07b6d4f18522c6273ffa4e18325958eea159e33f768eae846","other":"fd54f34d1deead333014c472182bf5cb2db1d1b1ab55caa70f5dc70108622f17","up":false},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":false},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":false},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"fe9d68b6f0d0add106d4a9e132308cf5caa867624784d652f071f5d1fe87ff8b","up":false},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":false},{"one":"6421894e25e421d16eccd8858aed3354fce2d04c9d5c46d4005ee1f16944ccfd","other":"7a46bf03f327b100dc00140c97828a3b607280b6cd57220703be393ae4fdddbc","up":false},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","up":false},{"one":"b87c0ee719d0656cd325300b756f203310675021f3c508b30542deb1114ec7ac","other":"81748a1a38162f9e8613ffa562add1b75893b66199840e74c0774db92bfd7ca0","up":false},{"one":"6d307f348cc71e8a471ba662c1b5bd9d6e6930c22024f350465cccc7f2208a59","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":false},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"30c022df9209b4515213fe3fa67135c05d960afbd76f8455caa9c83ab5e493b6","up":false},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"12df4927ff743d4dd9dfb0a7d13d39012b172f6a35921aaef1547d5d02ad38fe","up":false},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"580a650c2c3e95d35e66264df6f48e28a091bacd20dc2c9828a5b563353d2052","up":false},{"one":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","other":"d48642f8008e8aa791ba89c9b3a5b8d2d7aeb7e9078caee8813777679608075c","up":false},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"cd944ad4c50c4357005ff26ef26369ba3375a1205eec532b6e51b22bf25510bc","up":false},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","up":false},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"0d90040b9d0cd742149654262198aa8dc4fc96cfdf9b84cfe833277c3e23831f","up":false},{"one":"1263f18bf8cb4f5a3335f545cdd5d42f1b84da9edf4fa7346572c2bc38c87eb3","other":"089fe22a0bd48d3120cc8171eb9d698532c17f36768dbc25f554f2c53de11ab0","up":false},{"one":"43d797cb7fced78dd7141ef452ea367d7484d5c0fec2431caebe1317c4aa6340","other":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","up":false},{"one":"4a2d15b867a620653f099d66839b80c2dd32aec95caf906f0d5c8146192edf62","other":"4067997c26042749c16f17169caac66e647b71e3557f7581dbec739d0baa2ef0","up":false},{"one":"00b98e790fb954975837ff95abb1bdc2673dd8a0ce315986cc0dda5b0cefb05d","other":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","up":false},{"one":"165d670ad20922226e1f3275abd153b6fe8d9ffe3e45e6c1fcae3f5a3d2ec35a","other":"0f19fb4d0c6cfe36f7f59c8fe54d2e169687603e1bde0fe6b3a5e864fa51f2f0","up":false},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","up":false},{"one":"160c0401bcd1b38db7b4ae82470244ac9a9923755fc475aa67eb6dedc703c223","other":"24263ec4b92f390e07193d00e5a032ea2649f560027be02878da656e37d4a1b1","up":false},{"one":"11b53fa40926ac84d75d9d698f46b9611b90194857c1397e117931a890447078","other":"13165fffc318dd5f182601384e1ac69dd591236a03e88dfd1c637ea21a01b2dd","up":false},{"one":"18b0fcbba2350241088129e8f6a07742857c3edaacd6ef1ec0861cc8e48492ce","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":false},{"one":"f84317ef488d8c1495b429b7a1fa21ea53a73e737b3c1aa890c20e38658ab148","other":"f9265e3c23cd931ad51faec142636a6a8c8bd90a23e77f5327861c81cf4dfe17","up":false},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"3547871df541d0734c374e4c42f610f235f0c923d8b2bdc88c17fadb2c8e25ea","up":false},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"9a8c60732ff0d0b7403b181cdc5bb9e6db0aa4cf5c7158c40e548fcb76726f87","up":false},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"459a945c8d6e67437bdfa0e067962b3591dfa0aa7c1177f8327ba1557bbf1569","up":false},{"one":"cb704e26ceff5b613d8211423375fe0ded4d867bc892894a70d71289f1a9c1c1","other":"d24a8781af0c8ff19eca66388e308569bcce48144e559dc4c543f5a2ab0fe7c3","up":false},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"b77832f3f26323f09b37f31d208361d77ca08cec3ff829b9451fa3f00ff61fd0","up":false},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":false},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"9835fa9db1ce53ad2a526d36050eefd2c593121df4036c269cd09e1be4746a15","up":false},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"958e075a7f22c092360d325dd0c0449e9442c398b2882009c5c3720cbcd3584f","up":false},{"one":"5f1c751641e1727871c44f0d5779b278871c77f5e05324dc91a8620bed72e627","other":"5958a4ccd5333e8bfed5f18c78d365b201ffc2b9af3afd31748adb8e4f8118bc","up":false},{"one":"9d60b67d731aee2e6ac86d17c9e6a6aa5aaeec6b6803bae5c5fbc02643f7358c","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":false},{"one":"9265383ecf776ce1da66e99e5f0a9c1af593d8e56ceef21f42aad4be7e34bc45","other":"b270e0d21a173f4717882b1c6dc942d703fe11cd6adf997b3ecd0944fcea6c7b","up":false},{"one":"8ff601de9537c9e5d79a3707a312fe893383bef000d00acee3d4552068ef6030","other":"9b240fbf12d9de7975803b09aacdbab94cd978130de62bc89497bb1056e462c0","up":false},{"one":"41cd903abdaf445bfbcc3d5f28c10aba473be8a3ddc614c7f124b0ed7f91fd1d","other":"4610c06c8f5e1e24a75d9e46a432f4c1a6b9da6c3dbd122d3d3881752d930736","up":false}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_16.json b/swarm/pss/testdata/snapshot_16.json deleted file mode 100644 index d35df9fc9b55..000000000000 --- a/swarm/pss/testdata/snapshot_16.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"88621610b5fdbf3e584724e2268a24dc41562da5cdba92357b97edc42d79ec4e","private_key":"2c268d9cf0ca43f4b0ad80f8980f4fe019e0294819f881d505e02382b472b98b","name":"node01","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","private_key":"69ac59cce230e49f10c769fc8f2b717bdadc5ffa5dcf7fae19d8cb15315fa177","name":"node02","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","private_key":"b793f9ace49ecce16c0c86b49495093f7f4c5fa0003675c9eb6efa802c8daafe","name":"node03","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","private_key":"9fecef44b474621ce2ddd57cf67df319bd0e13c27f0f6e9d060c34ef813675ea","name":"node04","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4b6e068e84fecde2bb6a48698233f0c2ae5e66b15a8bad2e0b5d499c31d48b98","private_key":"c8f4336f88c90242744e9c04fba1a55027d9ad4295b7a2b0ad99e8dae12463d3","name":"node05","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6629ec867229b28221a6118eb0e097861eb784b624578f55c3811cdf5026c1c7","private_key":"0ca52c3e4781fc413a13448abaae042dae52e2bab5772c52440bc4b2c6a5bda3","name":"node06","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","private_key":"447c97a6c211160f0fb7990812c637bd346003a484cf05c3d92816007ab3745a","name":"node07","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","private_key":"8fa6ac35409a6df21ee32da8c36f61cd007a3515d23bb350351c263c241b851a","name":"node08","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"69d329853a0624dba12949e6be7db093143976d9a5d514b80d72a9bf7fbc568c","private_key":"e4143bd79f4a55f463b623afc397fe0166a144f45c41fd8b58f816e208212819","name":"node09","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","private_key":"6a2a32adb2b5cbc66adf29d5da1123b6e345e73ed42916e9535df3058801cb92","name":"node10","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8c92cb1fcda5b67a4b928c200e2e5e324599c997202d9ea98f703239ee3fc3b1","private_key":"ae486490233b1b16e6a35461a3b90573f59362b9bbf0b8c46b65c715b0506bd7","name":"node11","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","private_key":"cbf9da4b4f44f44c0bcf69bb2134e33ddfdda7742d7f5609db74bdf4fb683cfb","name":"node12","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","private_key":"180ee0110d87d330dd416568e300cacfd4d52f8c08875ada1a6d5b4a11142b1d","name":"node13","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","private_key":"d7a364b77d55a53453e94e10d235edf4ceb248653247bded6c1df31fc88ecbca","name":"node14","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","private_key":"7eaec2f68f3b0e562a5438324aa30b9c22746af6e8139b05b21e89103f508c5a","name":"node15","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"55ce5ea5772c31de27b337f1e2cf767663c03a61b2f47b71921def1cfc3270ea","private_key":"b130fa04ab1f60d0713b9260156457f9139e819cb2f70bd87a2ea409f135f881","name":"node16","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"55ce5ea5772c31de27b337f1e2cf767663c03a61b2f47b71921def1cfc3270ea","other":"88621610b5fdbf3e584724e2268a24dc41562da5cdba92357b97edc42d79ec4e","up":true},{"one":"88621610b5fdbf3e584724e2268a24dc41562da5cdba92357b97edc42d79ec4e","other":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","up":true},{"one":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","other":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","up":true},{"one":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","other":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","up":true},{"one":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","other":"4b6e068e84fecde2bb6a48698233f0c2ae5e66b15a8bad2e0b5d499c31d48b98","up":true},{"one":"4b6e068e84fecde2bb6a48698233f0c2ae5e66b15a8bad2e0b5d499c31d48b98","other":"6629ec867229b28221a6118eb0e097861eb784b624578f55c3811cdf5026c1c7","up":true},{"one":"6629ec867229b28221a6118eb0e097861eb784b624578f55c3811cdf5026c1c7","other":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","up":true},{"one":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","other":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","up":true},{"one":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","other":"69d329853a0624dba12949e6be7db093143976d9a5d514b80d72a9bf7fbc568c","up":true},{"one":"69d329853a0624dba12949e6be7db093143976d9a5d514b80d72a9bf7fbc568c","other":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","up":true},{"one":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","other":"8c92cb1fcda5b67a4b928c200e2e5e324599c997202d9ea98f703239ee3fc3b1","up":true},{"one":"8c92cb1fcda5b67a4b928c200e2e5e324599c997202d9ea98f703239ee3fc3b1","other":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","up":true},{"one":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","other":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","up":true},{"one":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","other":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","up":true},{"one":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","other":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","up":true},{"one":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","other":"55ce5ea5772c31de27b337f1e2cf767663c03a61b2f47b71921def1cfc3270ea","up":true},{"one":"88621610b5fdbf3e584724e2268a24dc41562da5cdba92357b97edc42d79ec4e","other":"8c92cb1fcda5b67a4b928c200e2e5e324599c997202d9ea98f703239ee3fc3b1","up":true},{"one":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","other":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","up":true},{"one":"4b6e068e84fecde2bb6a48698233f0c2ae5e66b15a8bad2e0b5d499c31d48b98","other":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","up":true},{"one":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","other":"8c92cb1fcda5b67a4b928c200e2e5e324599c997202d9ea98f703239ee3fc3b1","up":true},{"one":"6629ec867229b28221a6118eb0e097861eb784b624578f55c3811cdf5026c1c7","other":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","up":true},{"one":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","other":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","up":true},{"one":"69d329853a0624dba12949e6be7db093143976d9a5d514b80d72a9bf7fbc568c","other":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","up":true},{"one":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","other":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","up":true},{"one":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","other":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","up":true},{"one":"55ce5ea5772c31de27b337f1e2cf767663c03a61b2f47b71921def1cfc3270ea","other":"6e8c4a5d6e54dda7c633ff469e8f935935250f4d0034c9058048dc643a4f811e","up":true},{"one":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","other":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","up":true},{"one":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","other":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","up":true},{"one":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","other":"4b6e068e84fecde2bb6a48698233f0c2ae5e66b15a8bad2e0b5d499c31d48b98","up":true},{"one":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","other":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","up":true},{"one":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","other":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","up":true},{"one":"88621610b5fdbf3e584724e2268a24dc41562da5cdba92357b97edc42d79ec4e","other":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","up":true},{"one":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","other":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","up":true},{"one":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","other":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","up":true},{"one":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","other":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","up":true},{"one":"4b6e068e84fecde2bb6a48698233f0c2ae5e66b15a8bad2e0b5d499c31d48b98","other":"55ce5ea5772c31de27b337f1e2cf767663c03a61b2f47b71921def1cfc3270ea","up":true},{"one":"6629ec867229b28221a6118eb0e097861eb784b624578f55c3811cdf5026c1c7","other":"69d329853a0624dba12949e6be7db093143976d9a5d514b80d72a9bf7fbc568c","up":true},{"one":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","other":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","up":true},{"one":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","other":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","up":true},{"one":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","other":"6629ec867229b28221a6118eb0e097861eb784b624578f55c3811cdf5026c1c7","up":true},{"one":"55ce5ea5772c31de27b337f1e2cf767663c03a61b2f47b71921def1cfc3270ea","other":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","up":true},{"one":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","other":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","up":true},{"one":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","other":"4b6e068e84fecde2bb6a48698233f0c2ae5e66b15a8bad2e0b5d499c31d48b98","up":true},{"one":"c7a2bf651f59149716235fa7bfb4cee835aa4bdd402ccab8c52959aa74dc6af4","other":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","up":true},{"one":"69d329853a0624dba12949e6be7db093143976d9a5d514b80d72a9bf7fbc568c","other":"5989492b2703336b42f59b2be1653a0bce76e801ef262121f627a476581af5e1","up":true},{"one":"d9b0b57a237a8386cf6cf611779d8df3f5b0f9c01719e97230c3b23bf0ab04ae","other":"55ce5ea5772c31de27b337f1e2cf767663c03a61b2f47b71921def1cfc3270ea","up":true},{"one":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","other":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","up":true},{"one":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","other":"8c92cb1fcda5b67a4b928c200e2e5e324599c997202d9ea98f703239ee3fc3b1","up":true},{"one":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","other":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","up":true},{"one":"69d329853a0624dba12949e6be7db093143976d9a5d514b80d72a9bf7fbc568c","other":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","up":true},{"one":"d33e4e6af5ba13ae448a16a4a8183ab1050fa3f983cdbf03dec5c21a5e9dd146","other":"c651a0c924fc01e9d6cd30aba6864cd93631d5d4e21ceeda7db1922f105c5ca8","up":true},{"one":"1ffdd4692bd4fd272ac6b5c2e039354869df92c0d4247abedcd8a8932b057574","other":"9cd2b6b17d2954c0a0d4a340707c71215a08c3c27b5b5b294e96ad20263ba600","up":true},{"one":"c0f23df25018045ddc4035268a9e7468f386ecad306b9ed9053cf66e2f1ab0a2","other":"c553ca20b4f7f1b1e3b71b261829c27eb1cfe6710aa0999f655a42670e6d8813","up":true}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_2.json b/swarm/pss/testdata/snapshot_2.json deleted file mode 100644 index b01ce303802a..000000000000 --- a/swarm/pss/testdata/snapshot_2.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","private_key":"e567b7d9c554e5102cdc99b6523bace02dbb8951415c8816d82ba2d2e97fa23b","name":"node01","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","private_key":"c7526db70acd02f36d3b201ef3e1d85e38c52bee6931453213dbc5edec4d0976","name":"node02","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","other":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","up":true}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_256.json b/swarm/pss/testdata/snapshot_256.json deleted file mode 100644 index 4397a7ea7d51..000000000000 --- a/swarm/pss/testdata/snapshot_256.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","private_key":"c4e98d074abce07e849be2810e5522bdacf2489125ed7577e02b4809f9619700","name":"node01","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","private_key":"d607b8638fa33ef417d88597579e00a2f93e76881193a8692b57d03b27a60ba7","name":"node02","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","private_key":"c4501aa97316685b3e707bd881c1d805e96430723fa88ffc60e1703485eff5b2","name":"node03","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","private_key":"f1fceda785676921048d116f40e4d331ab32873f4b0343fddbd372c836808f2a","name":"node04","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","private_key":"a5baeb4f2e35eedde63d573bbec157e61f0c0ba6ecc7b6cb6a42759bbc165e5b","name":"node05","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","private_key":"1b7e31744236baa89eaadd57ec870b5415111685fda883490b5a0e1dbc321210","name":"node06","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","private_key":"344f9ff7d68ca6a04e3141646044db06e5761248c64a01bb6cc2813fb7745ae4","name":"node07","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","private_key":"869c03072d8108be18544c579cca53ffe17682e3898f44baff9cc37507fc62ed","name":"node08","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","private_key":"1fe668699f54728124bbf993215de07682f072d145dd8acc428f04abd4a46f08","name":"node09","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","private_key":"a3af1294d727198fb3282659a35ae5b27f4b23b28d76e528809b68a6263fd673","name":"node10","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","private_key":"f7ad4635d864376fa4536bf23df764278d30805556cbf13e794e0ebacf389172","name":"node11","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","private_key":"237183f9e7834a03859c43be2a49bb8e4f1c9c7a5c334958f74d4ed36dfbd5a7","name":"node12","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","private_key":"7f7c361b6989c77419ac69848c9a4b06255aeb0f6115454566cde4ca544af085","name":"node13","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","private_key":"00133d03c85e03bcd54ddefc03d9060009ea78ee5ba1f6f335111f47ab8f433f","name":"node14","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","private_key":"ee3f0e3cca3720aa0727efa92a11ea9252c7fe72fe64c8814de2accbb91d049d","name":"node15","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","private_key":"470d12a7459f9fa9f1adf18e94b60340c5c442eadb1329fa871073e64d6bd7aa","name":"node16","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","private_key":"3450c9c68339a76f1f75fb1f770914dac1cfc5e0cb23d6fd703480beb3ddfd4a","name":"node17","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","private_key":"1df10df7cb050098e9713c3773a47962a6cfea944b53b12fd84563c98dc46e7a","name":"node18","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","private_key":"e699fe1e14d46a5a72d5696e397df71ac0d17abf136dc84d850b658e56881c75","name":"node19","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","private_key":"0974ab51554372614954b68ffb0fdde4a82efdc0bf4e6f802dbc3728cb4b5e47","name":"node20","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","private_key":"14ce7db5594270c24ed48fd5881d6f02b9cc6267731612c5117e4d273d3920ca","name":"node21","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","private_key":"32fa52ca7b60e6953e97635659e4a5153688636594be7f560fc5f8468fdf7022","name":"node22","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","private_key":"d28563bbfb6db23928a66e837cdfa794230537066eeb93063ebeff3f531b12ca","name":"node23","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","private_key":"137533f5c2f9257d2a60c22d205407f3cc14c52ec60fc34666b05dcb935178c7","name":"node24","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","private_key":"1dbab5393fba98797db2a32f7d2ee6ad019bbd9e26ee051313e566bb1e21a1b4","name":"node25","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","private_key":"87a7b7028ee1140af69055fb641d23473c44f238544e3cc23e2909a959d1e091","name":"node26","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","private_key":"102d3a405cf636abf7d0b4e4a1fc0a698dc0d4033c288762ce9cc975b91db032","name":"node27","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","private_key":"d8ecd7e813dbc7683f773cf38cd0e344ee9b4e308f12f557b6642eda2ef88ea1","name":"node28","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","private_key":"225f43e03ffb8a97b760538a5cb9cddb61e7a387a3e56e82160300ed8c53e073","name":"node29","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","private_key":"75acc8059053d23505c4513dbfd60777918db43c9713b3577c36836f066e31af","name":"node30","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","private_key":"d6bd6c72597f6ec178becb6cdf6520d7de3f1278f77aa42095d287f45513b1f2","name":"node31","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","private_key":"b329bd7d93dbc0fef82737292076fb91e323da4f34d22a5ee6fe311018203992","name":"node32","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","private_key":"f62b2e6c0ace2c204b4efdf62d3a9e4e41740aaa2a7aee72aa67272b08f65388","name":"node33","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","private_key":"5083c0504c95867fc5a924311192eeb35e80105fb25720516a8af8053516b87d","name":"node34","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","private_key":"52454a2b364cf029dbd0bd0f6880fd3c4a3eea2ef593277ca45c363888b025dc","name":"node35","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","private_key":"822f8bae08da0af5c00b04adc4653e9b425648c538f482224cc7406ed46694b4","name":"node36","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","private_key":"1e41a399b1b77f559bce8b0db22cabd26152fde5eab7c91576e4a2e00cbf3061","name":"node37","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","private_key":"f39163a2c0a70f6eb02436a58c6029082e040ee88271fb27deb0e9c61af2a409","name":"node38","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","private_key":"30358622050808cb05e6c497e4ab00bc0baa126282c0f0bd38a279f15161ebfa","name":"node39","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","private_key":"e96ccd329e3ce59cca1c371e0d97e891c8755d8285c414d227fe2d8dde438ada","name":"node40","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","private_key":"a8af10b8118821f3f7a1c456f857e4ddf50526337a38eddaffe15bbbb383ac32","name":"node41","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","private_key":"aea855db0ccd147bccfb6969c37e5ceb12623a95cde33c7725d51418c2a58e56","name":"node42","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","private_key":"14f5b342ec3c67c89537fc4dbaa64da24b8d7d02242eff9642b680d1923a000a","name":"node43","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","private_key":"b56fd7d35ab0d1f76d30c898f6794ff5399b2d6982c4d5afadacaf72aa535bd4","name":"node44","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","private_key":"59db345b1123f497ab8804ffed255e26dc028f68d9010314f9eebee243ee74cb","name":"node45","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","private_key":"87b0f18d2c52b3f0f6934c09421248a6d0457eab81b8dbd93840877ba7c25006","name":"node46","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","private_key":"86f6a5532361ee4f4511ef6ced21fe2e8d4e12b10d61b8d16f6805d5d6ff869c","name":"node47","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","private_key":"604cbd4183a23b452f0c9add6181effac6084e4411051850ed0bc4f1ae9a33d8","name":"node48","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","private_key":"ada9db22cbb971526fb9a1e050a039ae3bc1b898086642c093f9d2fd1b4a2e30","name":"node49","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","private_key":"c3e1cd6edffbca6121b114763c7cc8d8fce9b4444747af55b56cb111f3803b5e","name":"node50","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","private_key":"e74e4c545f1d04c35176065ee8e6610e9847ba30aa0b4ff9df3d574a9cd04bc5","name":"node51","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","private_key":"d44b65dad6f0fc7d3868207b4d13aa646925f53eef21981d7898ca8eef1f47f3","name":"node52","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","private_key":"5c0b688fe7738cf3e06e8f932ca1986d88f6c00a9f705d50335632433ad7d52a","name":"node53","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","private_key":"8d78762191955f66c6881143b2fbf367eb02b6182eb49c5f11d22381f8e34152","name":"node54","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","private_key":"296788d95df4ddf6af02ab317a50c417d36515453b5cebdae7c71f55a657c7f9","name":"node55","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","private_key":"b229e6aab9cd866a0aecbc7358eeb2986cdf2ff1bcd25ae6d3dc33ad282a03ee","name":"node56","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","private_key":"016f837cc16dfa3e8ed3519599b40bf8ee03872dbe01509e3928f5459be708d9","name":"node57","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","private_key":"fb9bd6643165414424261aa1dfdab87ad7b83e52d9bfcbaa69e1bb116f84b19a","name":"node58","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","private_key":"c761dd84c3923763ca0acfc07e4939b146d57bd6b42efd6c5e8e5c0b63dc1518","name":"node59","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","private_key":"4503d268231fe7b4f60290da3c7f7f67bc51e123b65b7fb48f8ababc2eccbf6a","name":"node60","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","private_key":"c643d7712e7aeffa425505349e837da25e2cae551f446e56a96e5b2df48f2bfe","name":"node61","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","private_key":"cc7a5a2b92089562a184b024a3782da10d925002ca1dac6c95d902ed4df95998","name":"node62","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","private_key":"31d2f152a7b173892132dcb790d697cb779cc886a67355b5907e803ec734a1e0","name":"node63","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","private_key":"f0045a14d36d5d17d8859c51edce3fd7afd083b6722cf6a3668dbd4f1db69e17","name":"node64","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","private_key":"f00404704ec4c556b0ee4cbbc1b8fec0b741d8a587b0baffa9a0ce79648f6560","name":"node65","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","private_key":"5998a146afa95186e2ecf2d1daa4376812bbcbbf22809ba0807dc5e34e5d1e9c","name":"node66","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","private_key":"542904a26056c4d86aafe32a8dbbb30ef4a31b36c81563f47a8ce22145e5da4d","name":"node67","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","private_key":"4feddb131b7fb4c20144641fd72951bf356b4ec190a8a8cb322f2d0819aaf317","name":"node68","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","private_key":"1fa8a1ef0703e81a32dd0faf6d25447a183ecb90d6994f45921c3db0e8dc3d06","name":"node69","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","private_key":"dffd7a3c7cb1c3a0d129522290be15481d609d4d268daa13364cb16e13213398","name":"node70","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","private_key":"c5ab7f8e52d35ba6f3aae971d7215e9dd234f82a3331ca904c2b6b526d2a59db","name":"node71","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","private_key":"07c9b7896ed7f5c9763b72ab6631797941cd615c3ecd431de30169fdbe89cc2a","name":"node72","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","private_key":"da65f19428056c9c512efa6c1e97a409861ab28956b2c9ed0b8a72bba67c010e","name":"node73","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","private_key":"3ea7d8647b5a7f04bdae56288940cc9dc8289c49fcc4a1a79e9d3fd9a6ceab2a","name":"node74","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","private_key":"86dd972691e02a4562fde8ab7cfa9ceb75201e42e506cf2d51c16d9d474bad2d","name":"node75","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","private_key":"cb578a8fabe87c91b214032286af35c973b3f27880dd80fcd1efb929d1dd4756","name":"node76","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","private_key":"d4921582200b69793cc182b16d32031dd9559865007b31b1011d35512379ae8a","name":"node77","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","private_key":"286143c4711912830a900f8a45b11baa1bef2b6b96e9a918484cb95aafd2164f","name":"node78","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","private_key":"48d763e65d8c5b6a83609844cf203d410e1afa134af6eb6ed22a42bbfd55ccb9","name":"node79","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","private_key":"98a9e2aaeb4c53a781d4150faa14cc0ff5f066e7be28098cbc25a0c379be18a4","name":"node80","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","private_key":"97df41163f6dfeb248b196fff24b95edb55e2b6c48c551480226459fde0ce62a","name":"node81","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","private_key":"887a82d3553c5107cd8d6220f2ac36ca2d6d499b8c82b765a17bd6295e9861d4","name":"node82","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","private_key":"b067efa25d200683b69e2fa485be6ac0a6bbc34a18796bc0b0e794d4dadf83b1","name":"node83","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","private_key":"f2b10950651367c628d1675c7a07962c0af4062b2c3c8154075cf61f9635cd67","name":"node84","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","private_key":"55f59b8404f62f76682812c128cde0b37da46140d69661f3de90af132daa04c8","name":"node85","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","private_key":"bc5bbbdd85ae3b09a493f0b43542448acf2976654a249f32bf92eff0d414866c","name":"node86","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","private_key":"f342c7683da21156a1f53ce673f78414f580cdd86eda879596d087439e4475f9","name":"node87","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","private_key":"f9550b9a11e9aece642e0e863b82852f4c5c8cb6044144627d678ce3988cda39","name":"node88","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","private_key":"111dc027f4345175a5a141eff93a8d04d82ec6d67a15d0ed0c53ae7fe954868c","name":"node89","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","private_key":"30caccc4af13ac896656ca1add341299bb51773c44f91f3105a1564abbe84f5b","name":"node90","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","private_key":"ca298279e19e3d8437a361debb136898e8bf05c7946dd3ffdef8d267f1c79049","name":"node91","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","private_key":"d513af6f8087302defbc40f0f03c63b144c07a636b7c5c970e962d445232a6f9","name":"node92","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","private_key":"e5808b0004f64868225ce7362aa1b0d787d6c8bafbf5d08aadf4a804bfa4519a","name":"node93","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","private_key":"68c381bcacc6c4396824a929cd7124a13b8032185de88ce2cc3cb75badc6a5d5","name":"node94","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","private_key":"0d0d4c6da032e6ceb496ec71883cff52efa41a9383d2b83b747d1bc6f8269a17","name":"node95","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","private_key":"53c79eca1a5cc6b186db543273722c0168564d7cecceb76d1433330101f8e62a","name":"node96","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","private_key":"cd3e3585e9c28d16a0a5c11e8efd66671e8cac68915eb6b7bae228e10e867fd8","name":"node97","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","private_key":"60f513f00eb15da948e892d69bec82991bfb0747c9d5879c6c26c2a5a6095365","name":"node98","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","private_key":"94b0c348b1ec7288d57eb195f114f38da5a6fc3f604e8f1ed76135ef26f50c6d","name":"node99","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","private_key":"a6e6ca4e3f494adc69bb1aaa01dfc3dd625d9923fa4c979ec80ee221b83a589b","name":"node100","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","private_key":"2c11691d22adc7bee004f61ad67b543d9ca22c7c65125427e310fc5c8784091f","name":"node101","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","private_key":"1ebabfc78e1b9d17e6fe38508bc354ab54be2a8bf57483b0afe7dc3530533e0f","name":"node102","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","private_key":"9b22a93b1dd1ac5ad34771c2cf183292f9ca7133b4ed8a1d0fceb889d6017170","name":"node103","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","private_key":"b4d7978eed053b73224b969ad03abd7503081764e86f7815f8b650b7ba9a34b0","name":"node104","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","private_key":"18bbd14788534b3f7490b55c2243e84c1ed1d158bd769a47fdc2d8550098ba97","name":"node105","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","private_key":"ff55b25abe67052213c916a734949cb6a98d1ad2f240183bfa1fe694cfa0937a","name":"node106","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","private_key":"406c029264f74f39f2ad851342bc311d4800fe07db744f69557ad9e3e5899aeb","name":"node107","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","private_key":"9f9be5e82bec360e52170374b35e26ab30480bf5effa10bc43527c191d1efc84","name":"node108","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","private_key":"01c46dd80b68bfbc5916277ab36142ff3033b126df71354bc7b21993be4f27b4","name":"node109","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","private_key":"d4ea8e3d466c3fadc709252e0b35240e831250311a3023363aaa2de0d4068efe","name":"node110","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","private_key":"ff786dd6bdf5a54dfd71c73ab93427d94008f2854eec2a87c96223aeaf5a2357","name":"node111","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","private_key":"81d2fd2b16f53fcb3749b3c8575a00ddf39ee32f760cc7e8365c046e364ec849","name":"node112","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","private_key":"5017533627afd71f2684b9ef264ac79ff826f1cbbfedd788d969d9ae1bb87b20","name":"node113","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","private_key":"92a91e558f70fffacaea7b5c86540ae940da57dcb660d8c3e6eb5c7b38f015f0","name":"node114","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","private_key":"91f18de340c4916711d69fea368a4248eca8a13910d576e24ff9125fbccae3a3","name":"node115","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","private_key":"f1e5638e4912ca0ccd446a27531942b75039807eea70118fad6880f5b1ad5ee7","name":"node116","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","private_key":"83bcea8f8c409f9470bca240d19fb29d9fea6cf94435ebbdf0a8faf5f1cb5ca0","name":"node117","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","private_key":"33c3e295cfb9706d4d5e081ec3c220d8c35415d7c256de99511e76474e8c906b","name":"node118","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","private_key":"af0dcfc78e50f0893cd504a3567a8515538bd85a1d3eb72809dd503690d0d274","name":"node119","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","private_key":"8c806f6fed9bc74fb07341b080bc3067c953b5d6093ef5779221924d4ead4bb8","name":"node120","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","private_key":"a1a11eedc4fe78f42dd23b093d9fbcbf1643899eca875296b0374ec0e8ab619c","name":"node121","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","private_key":"15d8362248798e68c5eda882717ee691573e5477b7f0444222fabaaf1a025a8a","name":"node122","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","private_key":"c1d6cf53ce48953f5b6bb0e0b644aaebd16b84a3910894f93c157140c88988a5","name":"node123","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","private_key":"a67b1d8e2abb33c866d215b81af3a23fe0657a9155a8e17754bc0028dcf87852","name":"node124","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","private_key":"b9da682c3a119f650ebbaccf2974166f3162ce600afd50152f95e9be3f688bd4","name":"node125","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","private_key":"a6ca067c4be7a67d6c5b14fe7e0b62a964d844462a6b26a981cb73ffcbb48e46","name":"node126","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","private_key":"08926af18a3a13a1bf786aa6946ab5bde52c531026a8561524925f1d9f0d665c","name":"node127","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","private_key":"793a4b0ec03ee3d4c1cc8fc8084366fc20e5852ecc3aa96ba2882babd7b8ff37","name":"node128","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","private_key":"9d2fd418a2966f748dd746ca5b5f0c3a82496a0a6274355c059d5f48be6870b8","name":"node129","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","private_key":"7c7cfd0cdb3cede7dc5d152c6f5a8d89941656a3e9e560cf993a319c9012f074","name":"node130","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","private_key":"457954e43019a3f3e510a0f818996c28e372410ba50490b5042068ff63f3e17d","name":"node131","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","private_key":"d45a6d15ff3a2073f6d31d9df7fe6778cac0ca1d62aeacec44341aef19924624","name":"node132","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","private_key":"c1e5c2bc35a1030f8bd3ffd9099376d32ca3029eff92b5c79055ae2454a6fd6a","name":"node133","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":false}},{"node":{"config":{"id":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","private_key":"89da1a80c7122d19de9b63637b1f1675ee7e009a5ecf1f6c51cb29b2a09cc908","name":"node134","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","private_key":"e5596012d345aff602e83361bc5fb1f7e3feee7b23782a8c7f0a1c7933ab928c","name":"node135","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","private_key":"91af9b7387bad90d696b549270c0302fbe3805efb01f311e801b317217b92cca","name":"node136","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","private_key":"af83c717380c5132acd3357ec3e29daaacfc4e4a65fd1f5b14479b78e5fb01f6","name":"node137","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","private_key":"2645348387e283c7f69d634a71ee38a65d4fc6928ecc383fb25cea4525fcdad9","name":"node138","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","private_key":"bc25724231b7bb54d17219feff13e1fe8e0486cace91c0cc6f3731a986f4a8ae","name":"node139","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","private_key":"1b90feec9d475fc13f1394c4b39d837fbd09f4c329ef5747d988b17b84967ccc","name":"node140","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","private_key":"392b881dddc671e72fc89ef71b340f19840650943cae22682d6cb6f97570c1ac","name":"node141","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","private_key":"f6541fa1eb8508dbcfde0259a988d0564c192cd25b2051e1299c32cad9ceb149","name":"node142","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","private_key":"59014852ab4f95ef336b10bb7c05d22e54eb0ea453d0f1c56638852ffac3aab0","name":"node143","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","private_key":"45d467a8320183e6e9f9fb0219c71ee08f43352c83c0b2d84da4ae4241b0173c","name":"node144","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","private_key":"3c564ae34741afc14a8ea217a734d5a8bc6d8dfcce3f4943acff14036edbf1c0","name":"node145","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","private_key":"43f552096880ddd297dd590b83f738fa13826e6120ec3d6311ac565b78a252c7","name":"node146","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","private_key":"177c7e7e8e870ff8b4b606ee3bc6f94d6fa57fd6deabefdabb250776939ef9f9","name":"node147","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","private_key":"26c019de3883a787fafed3839e768c71553ec8fe6cf607725f0e2acc80711cee","name":"node148","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","private_key":"943fd9910b9fa6cdb47ec68ec64b2faecd9a56de487fba1b7773a6dd54f94664","name":"node149","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","private_key":"f75e19af5d5e340e6a07d85042608f0500511042eb2e1ccbae8fe8569b9cbc8c","name":"node150","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","private_key":"e400c8293b9474c5aa84b48e37e1f435a53c910af98fd4e1b23ff9bd670bb51f","name":"node151","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","private_key":"f5a6a565c7c14cba96a75712373743d09ba804a9b8332a667492617dd5211abb","name":"node152","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","private_key":"4f592401cb57bcdc263bb96492ca66258130460b5fcb1a1cfafdedef3cee99f7","name":"node153","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","private_key":"97486d2d37010143a830ed6a0be6528a5611fc42962ae80e44a12c9b3399502c","name":"node154","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","private_key":"d93efde40fe67c2f412577aefbc6af1e876bde81b53c22ef6da4a5a23c8c13ad","name":"node155","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","private_key":"eaab112f5381b5b84ac9920fede88f2e04b725398e37a0b1b003442c281e32a1","name":"node156","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","private_key":"f79356978056456eb8f10bcf3c06b107a4afb4d5a8c2fc9380011a7420d59c81","name":"node157","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","private_key":"f0c66841f0adf1a9af04982fcce0c38c5012595de449dd0a8ea97ba06d5e43e9","name":"node158","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","private_key":"cc124633e255f1c6ba0beb16fb978958ed79be0e0f6ebd7968ef82b6d439fcda","name":"node159","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","private_key":"223b2c119cccb5059319a4a0305aec9c1bace6e731215f699cbd4d9a056ec777","name":"node160","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","private_key":"158d4468a6b4e7413f8b1d4112ef2b2c562e6dd26101b022ece2fa57801e6b03","name":"node161","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","private_key":"9b9249eb2418f61bc1e6a582b28e46c0d25eecf549e98414e2ca5ab1d3f5b1f7","name":"node162","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","private_key":"92f63cfcb2341c43aee585f9b965979e49d307de204dcc09b8e869f4e67640b4","name":"node163","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","private_key":"81e7d25a3c5700b592d3ea4cd85440f914f919e65f0a6e55c99ba619a519c70a","name":"node164","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","private_key":"09ab58931e7729bf23cdcb2772b3869d1aacece96070df5790f8343b70ef5e3b","name":"node165","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","private_key":"c330a5f7858f47d6653c52c88207fd10c6c87d8e77c87b9be95165f094918210","name":"node166","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","private_key":"7bbb910a655225eccc1fa6ab5abd3696725591448d5b628656692c1170f1f095","name":"node167","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","private_key":"9a0adb03a36d31dc716a280bc0b0ccdb5a891c5242f507aed5f6c370ea6bca05","name":"node168","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","private_key":"c9271845738bb80612a262956270b72e5152311e2e80fe21b3c7238f394911a7","name":"node169","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","private_key":"1710672c4d27d5363877ec9be4202445a3404d3e16ff221611f0c2d82c34af1c","name":"node170","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","private_key":"fe3ddcd5732357d3e602b35b79a21afd716fadbe7b569e44eb014dd4b944ad49","name":"node171","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","private_key":"85d961e31726c6d75913c901b5db7e115dd67338d9d89584e0c73df8f673a01c","name":"node172","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":false}},{"node":{"config":{"id":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","private_key":"ded7d4f338d0e906b79482b6a79c0a2224820bac1893e3ee083a66eaaebea363","name":"node173","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","private_key":"f2b75f511327f380d86989fed2d67129f32bb0aeafb3aba0250c8e9e5b581d16","name":"node174","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","private_key":"a9bc40abaa967e683f994c9d053b90fa4daa9602fc810cd974a8f6a3629dbd28","name":"node175","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","private_key":"fa312311679e17f36872e8c75b78bd3b730d7423c613f5d7cbcaf653d847419e","name":"node176","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","private_key":"3532d20f2d6b03b910ef2d4dc968b71d89bd0fa3c9a758fd355ec3f8c9b6b62b","name":"node177","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","private_key":"d491504fcc40f961febbbf2089616ac2a2b7cc79e5dc9c01b632ab9d226bca86","name":"node178","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","private_key":"9653af0c5c528f1079ce38ba8e44273a7eed8efe91036d0219e08121fc62ca06","name":"node179","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","private_key":"09d927a912f0daefdca0fdb594feea4e25c384ac07efb663ea46ba893d0f32f9","name":"node180","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","private_key":"b5c4da646e3485b765e530ff19f36c4753764dda9d4aa308fb8d5c3d52d9b04f","name":"node181","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","private_key":"cf80dfc2e5888e69aa7c570430d76fb7a11991c8f8bd4c8dec3e2303085624ad","name":"node182","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","private_key":"33a68fc227f5f745114937915a4678fbcd985ff8c589698f241091a32fd901b2","name":"node183","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","private_key":"ff80b3d224dd48711a8b71840a9762289dbcac4d27cb6c24878fb4dd01b7c55f","name":"node184","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","private_key":"9b8f03ec5acc438bfb8ef1d604066899d9108b46efa0136298d820aad5752cf6","name":"node185","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","private_key":"b3496c97ca4de82c4133936c457c24ece46c36d35193ff6a5cd269701841cfd4","name":"node186","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","private_key":"65f6b15bed8bfb72144314f9aa2a7364bcb356e60cdb0212a7d04a3eb9e2d3af","name":"node187","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","private_key":"fe832e4f1c7485f3906f1807544431a825ca6ff8ea89d3d87a14aba92ba4d995","name":"node188","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","private_key":"50f4adfdd5287853b06a93a0214c09ee109edc00698de65c0c0523e10e7d828b","name":"node189","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","private_key":"e40b799e72dc611e2a8f64d5b8c7ca95535499887a0eb36f5f4f3690097e0ce0","name":"node190","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","private_key":"11535d8be8b31e5bf636e9671c7be140d596984e31eb44adeb0002976fa05b97","name":"node191","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","private_key":"9870e0dfa67e07bbfca9e8eb065c1085adc82bf75d9d75fab9909f3681b654ed","name":"node192","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","private_key":"01d68cdd16950c65e5781ece848e201a6ebbd5097f74dadfd7a5fb007bbcc11d","name":"node193","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","private_key":"7d7d75371a52b4d22411fc3dec135a945466d9fcce8615dbb959ebaf62bcebac","name":"node194","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","private_key":"cdcb88f25a626c1434db6d9ee8ae5934f466813535a8b9425572a888ade1bd98","name":"node195","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","private_key":"70186f9ea20bd1f26270c4a3cc72d7fd6997f6ff1e81fa580ac396cfb8a53d96","name":"node196","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","private_key":"23e586de5f3e3d888e4b5afccbc7bbe9bc569233c4133cf8b4b6a6f722bcbcf4","name":"node197","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","private_key":"fa2860804ef40cd74e911bae08fd20f7fef5ee4d34f163dd456f566b899f18fd","name":"node198","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","private_key":"1552e3359f865f955336c9e44aa94278481ebc3fba1bbac62a7e6c95d3348d6b","name":"node199","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","private_key":"da57c89729140a0f359ddf902197cddcb6b13a00c226d1a8a0975bda02f3a495","name":"node200","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","private_key":"a71ad1e471863026826e723cb60ef8221c29ef9c115f59ec22dccfdbf13724cb","name":"node201","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","private_key":"66b7f7a02087e6dda466b0fb6d05311ce95e179b4baf6cb7dd1fc1052f066367","name":"node202","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","private_key":"f4efac8f64908b896f893bb4b4113b00734dfcbf9aa87245f1aa8e9f65b644ce","name":"node203","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","private_key":"f15da5ee626bdec9e7b303afaff488d87aff1815668f878ea6b1f270c6300ec2","name":"node204","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","private_key":"ec037812b58da37d27db08df00018a39dc06d096116acf7f56921452cf7cfc0b","name":"node205","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","private_key":"9a037c145472a92a10b90fce8fe35501e93af7b73b026641d66a53ccfd3930dd","name":"node206","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","private_key":"14480f714ca25c522c067b4bce766945c9c2e8d0b697eacf9ff286fb0c26dac9","name":"node207","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","private_key":"c756a2bbb4c7b536c169fea0b09c7834ce6ce6f687c4968e598b72606163b8f3","name":"node208","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","private_key":"a837afe73ba3598ea681339261b12f5b9f02f1ce5243d6f7d18c735562b5a485","name":"node209","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","private_key":"6dab6d6b30b7515d850f1f4e7d6fffc75064eafafd86b8754a4000153113b1de","name":"node210","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","private_key":"431d8e4e06f15988a4ea9b3c077ca2b2bfc5b8b04135fea5ad7dee050940422b","name":"node211","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","private_key":"adf12e35cb550ed5a52fb5fa25fe7a6298e71b77a2dae474ebefbf2f9b8aac69","name":"node212","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","private_key":"7a94e705247608b3fe77122138a93f8477964e4a1a5d068091ff655f6ff0acd9","name":"node213","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","private_key":"c121bd7298c0130e294b88e6bb3b99fa0db790e9760b605448356e1fd89a3e5b","name":"node214","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","private_key":"562bd811ced052733cf87caf5888571e4482ae46e14ae1585debfb6b10298249","name":"node215","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","private_key":"8ebd5353e11b993fd7941ca1a936fc21799344607325c2879687b5e90adee6db","name":"node216","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","private_key":"8234acebca52619acf23d978bbc19bf2d8cbbc933bc7e18c7903d4b047471348","name":"node217","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","private_key":"1a4a47a0b83da4f2ccd94ee24a3657f777cc93c6a58b8ec0145586ba2c161429","name":"node218","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","private_key":"5b5aede47f05e99b807a7451cec469c1f77786d45d9f55b5a797b82d76db93af","name":"node219","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","private_key":"96ada7ff2fc583b6dd41941edfff92a81778c698d3b1f9fbf4130c2f7cbbec84","name":"node220","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","private_key":"1616cc42cae550c0104204c1c7f6ed0b3f65da627bd834a2d1239d70cc5b1e77","name":"node221","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","private_key":"1d029cbabb2eaef44889598c8fa2297996a69661d29c14035424dce781deb15e","name":"node222","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","private_key":"83c0403796648d484818f74b9de3c755c56b24f69e3394e062dd55a9d7cecbc3","name":"node223","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","private_key":"3f64513ae7746b16fa9ef3978d1bdf3c87ab4842c75aa3b946385dcdb23a3430","name":"node224","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","private_key":"a9db544f2fa00dc2d658a531934db6efeec93208b76d5b6859e6f0c4abac116d","name":"node225","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","private_key":"d53b2fef355d63448b93647458df0ba5b73bc42492d376377401a568eeb4d81f","name":"node226","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","private_key":"a04acf8d5198d0e7da1a6e9228c8ac6a74542a8d91906d5e83f1db219ae25350","name":"node227","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","private_key":"d5ad27697670f66cacf3e0ffb4473ab4912ed96fba311ddc8af12ad7663adeda","name":"node228","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","private_key":"dd217caf701902c94b57e1eeccbeaeddc4a7837b56d82ae2f034935d2828d222","name":"node229","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","private_key":"69b9f99ba6c47542a17c63be200102194fe3ab24084ea1e684033e68d580b5af","name":"node230","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","private_key":"ead9e2c8c0b3993304cb0a4a0dcb3ebe7c4331a87fee7c70194a3b3690413f43","name":"node231","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","private_key":"96cf35a39c0753abb6cc71c2a23e92fc936169a0600e936611216fd8ec31e310","name":"node232","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","private_key":"12ecde7517662f6d425f22ce7ecde84688ab9ed7fd443de2f309f095857faca9","name":"node233","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","private_key":"bc558cb24210cea0443678c5a9a412b3512b5b965b14df80818039b6fe28fe06","name":"node234","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","private_key":"1f2ab03e6921c321f5f783a3105d69bb69a4c031d50195fb94324c3280d52310","name":"node235","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","private_key":"8f1333ea7bd671c671ba94c4c7c59d6b0687a5c475b21712c6a49600e71f78b5","name":"node236","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","private_key":"e7fceaf57233e8a351a5a97e433d38131867965c883d53430f8f635f0563a168","name":"node237","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","private_key":"c5c6440cb8356bd270d8ce8d543b85c784f5c049b80e951c26fbcc92cfd1669e","name":"node238","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":false}},{"node":{"config":{"id":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","private_key":"64939e66b20f857b3b5c94f6e5f72f15ae524ce46058ebf20c98e796bcc608c8","name":"node239","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","private_key":"9fa335b0c4f3fed78cb6aa4c0137589fe77d15b2127788adbca0633ef881b61c","name":"node240","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","private_key":"a36da338278d776a57dad648f8c5627834918fcaa86367e4aeaccefbb4142c1c","name":"node241","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","private_key":"dfbcc9238ce614f0a4711f04948064ddbd5b2997a19f1e62c8f9636e9961fd5d","name":"node242","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","private_key":"ea0d5ec78fdcca32a257905b595a0c7bc8f2934d088b0f4c695a76927fa9e791","name":"node243","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","private_key":"01bbc4df92bfd5efca325ff653fcab3ac6aca83696f57927d3313fdf03dadafb","name":"node244","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","private_key":"2e16fcbc5651872d962bf9cbbd32cccbef2adac9e86006e4b4e9abbe6c22d7cc","name":"node245","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","private_key":"a26a19f61e9c2c83a632e779651442713ae7026ff3889b0c2ba690ad206500cf","name":"node246","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","private_key":"fd1c4ea6d2c07317eeaebbcd485aaf9267d81f2dc547b2136eba8ed02ae2c635","name":"node247","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","private_key":"a655a637ca80f8c5354e51e46d31d79b36a8a8b44d50e2838a118ea8b33512ee","name":"node248","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","private_key":"02d1f6c1a867e9dd9cf7bff6121f3eb99e7c75866f8fb00d83782e69de6dacc5","name":"node249","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","private_key":"e0f98f6ae876455342403d6cd7ee64b21f5e5d691ed720d81e0db64529d8cd19","name":"node250","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","private_key":"53adafcbccccca52e7bbf9524234d7c6c5874e3a328d3ded48c93c7b07f34428","name":"node251","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","private_key":"b91ef086d245c3849c46234765c2d479c053b5974568062618a768ebb7014b64","name":"node252","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","private_key":"438a2cd1d35d995ba9e35fe1b4086196934e0a6087ca2ae18543512299224b1e","name":"node253","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","private_key":"1945283cb814bb48cbb80a03a2660606e5c5e023e3b8ac887baf7cc912ec5be7","name":"node254","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","private_key":"be6f375f22929e615c683dc9b07e4e2c609a06e07a849a718617c2a0c2ad49f6","name":"node255","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","private_key":"9775c9bb0b01e8a605866b96d386a1f8c3dbba2605cb9f8089c4f85fecfb6c62","name":"node256","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","up":true},{"one":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","other":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","other":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","up":true},{"one":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","up":true},{"one":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","other":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","other":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","up":true},{"one":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","up":true},{"one":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","up":true},{"one":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","up":true},{"one":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","other":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","other":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","other":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","other":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","other":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","up":true},{"one":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","up":true},{"one":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","other":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","up":true},{"one":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","other":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","other":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","up":true},{"one":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","up":true},{"one":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","other":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":true},{"one":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","up":true},{"one":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","other":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","up":true},{"one":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","up":true},{"one":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","other":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","up":true},{"one":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","up":true},{"one":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","other":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","up":true},{"one":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","other":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","up":true},{"one":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","other":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","up":true},{"one":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","other":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","up":true},{"one":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","up":true},{"one":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","other":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","other":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","up":true},{"one":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","up":true},{"one":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","other":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","up":true},{"one":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","other":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","other":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","up":true},{"one":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","other":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","other":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","other":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","up":true},{"one":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","up":true},{"one":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","other":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","up":true},{"one":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","up":true},{"one":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","other":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","other":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","other":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","other":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","up":true},{"one":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":true},{"one":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","up":true},{"one":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","other":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","other":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","up":true},{"one":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","up":true},{"one":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","other":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","up":true},{"one":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"c0d1ac430a1466a1a28cb1aa3d29573ccedb13641ac19e6e615f2a96e8f0950b","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","up":true},{"one":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","other":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","other":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","other":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","other":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","up":true},{"one":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"29ffd73eb3b36593482208f5bf1b9c82b7f1a92b06173c769db0999d924c8969","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","other":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"29fd4473f1b6c37f8268d73dd5f683a0f7eb64bd793dab2c450c10d8ab0b666d","other":"290fca7596740129fd1a3075bbf56885d8c83381f981adb0fb283799375a3bd5","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","other":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","up":true},{"one":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","other":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","up":true},{"one":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","other":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"12b9aa0addf45c714ec95fa915294c997f9d73ee4d6ac7832d18d19554ec49a5","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","other":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","up":true},{"one":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","other":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","up":true},{"one":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"4a670fe61711307f7781b3b5a8014fc0e63866efe356a25e61b2e768a7389980","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","up":true},{"one":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","other":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"2f2284537629514837d5c2296d2871d8c4c147719f0ddc28ef7c629efd44dd61","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"2a69e3897d30e0cbe9b6179a55e30eb13c658b284e1dfcfe4dca08a69434df3c","other":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","up":true},{"one":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"2af02e62ff3e40be25d22c2f745a505b895b3804a80663cb53db4edd5365c568","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","other":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"3a4a300de1009d694bebce2362ca429086ade2f551989d55ba459a68efea15af","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"5fa8a5a29a47694653a5e55fd9b76e9c4f717ecc9b7088a6ec7ee273b291d49e","other":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"2f9f266a3b660fe685de2932de82979bd221706db1e2b954a93edc6609c378d9","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"72acf53ab7dbda90ea70e78d001fe21e7ab88e4054ff0453212e33a26fbbf7f1","other":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","up":true},{"one":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","other":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","other":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","up":true},{"one":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","up":true},{"one":"72fae969e2888f7cefa40a544ea66b8c2fd161b1af3ea1f0b8a7012a36188aa1","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","other":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"4af7ccb5c14efcb279502de37f436576eede95efbe5641f12f47e99b2bd9a172","other":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","other":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"52881f1fe0b8e9044a3bc035edbbd6343b9c41d49c0f2c2ca799c2e764489b91","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"5f056f9593be46d3eba4dc8d9e0b93262cd3f00e007c13c4c011d53e7c199628","other":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"15f6bb0640c3ac8ae8ecf10d0d46cc739bb6f86b0c0cf706103aad9f3785219b","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true},{"one":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"74062d9dd73e26066fd44e4f6c696f271c9dc6860bdc5ba3fcf447f455c8cafa","other":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","other":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","up":true},{"one":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","other":"14c81fb2fb8fa5a6b47288356ab486012046d09959b9ef4814a09dc3facb4853","up":true},{"one":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","other":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","up":true},{"one":"3345e03880c377fc1fe7b6205011ce3e32525cefee5e03161105f1512893f9fb","other":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","up":true},{"one":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"c9f391b1c008fbac89791d7135d4d23c245ef6f28258d6ba4f826619da9a54d8","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"52619a523050aa8caa32448e59721a76dc3321dc92cfcb1b05f1cec5b79d424a","other":"50932e2c1f03cbc41d8d9600ce2457f3eacd82c36b61fa09bef512b104eaf8dc","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","up":true},{"one":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","other":"5fd02ea98977d976f5d47a4005300b9865b1dcdac77bf8a98a8920a89b57825c","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","up":true},{"one":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","other":"34fce2b8208c6c8ed005943b3f2cb9f8923739ce262e2040f7ffc048093ef910","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","other":"004e812995bc04f22993466df9889ca1b650bba242cf80bb070ce9564e7bedd8","up":true},{"one":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"7854fb9f0d2f016653994b9e23033f27e21a2ef186a352c8d068b75ea20beec2","other":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","up":true},{"one":"6dbd2dd8f11adebfbd3ec41289e35e4a8930da1bef5212b152deed8a8ab2f1bc","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","up":true},{"one":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","other":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","up":true},{"one":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"0ea201515867c6793cbe48350f209e69acd3829b9b16b6016d965d84fb6379c5","other":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","up":true},{"one":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","other":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"e8392bdce92a7dcfa5e3196a6e1d4e5dc4814c72e104d3e2aa1f1ab99e2a47a6","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","other":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","up":true},{"one":"458a31b8fdbc42f5e80f01118c9dc041740212c09ddfb4b137c9e7e93ae9ec51","other":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","up":true},{"one":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","other":"36485615576c68702382f614054494cc4a40b90fd66db86b9d86a6a131dcc6ac","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","other":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"13d8107c669cc27f6cbc64cef6b2bd11f72db297f2857c2de7323b92632b8231","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"2013ce63483af2990b35f9ecbe5a7653c34b24ded173753575b24451787ed8b9","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"353875d4ae2b9c5cc6cb14059bdfb9540647100c7c3334bc60db2ca2b4ddf3f5","other":"32dd86f3f5c3abe55d6b1fe352e9d1d0cc63d61cfa60b8e70b2ee9db2e28e1aa","up":true},{"one":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","up":true},{"one":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"18f9292fbe6e94ec3df4d0a896c71ed2b1771437e42d8475a7aae63c7992834d","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","other":"b79fd26ce97e98e7432029dea6bf11e48ea9e8f2385dec5c60be0cbd51bbef54","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","up":true},{"one":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","other":"b5c764a29cd142acbd83b74989e7d2232eeb2413b74c99ad5769e8e7bec568f6","up":true},{"one":"211a516fb95d093eb43f4716edeb1e6f76ed79d2aeee3393740e244970187840","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","up":true},{"one":"fed15b57e749c5f8f5fdb382eb95abe2ce0dee184c817e557122207f3729b05c","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"2279d612454ff034032a5acf5a039477a11479b9b9a93edc26b61312e8d9b156","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","other":"d5644a72a9adef667fe33fbf5af45214d1dd09331165b24e504e8f5eefb6195e","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"5110c7e54a18df6963919866e7f6c0c3a483045d5ac20fc0dfa5e1926681be7f","up":true},{"one":"1da34e756912c1f9290970e2b60d5d8a88407923c0eac8c409b75f0f470ebc36","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","other":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","up":true},{"one":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"79bd78e5e219d35b8c6f1847c4c77c99e6486db80ec19196e391d7b76232e0c0","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","up":true},{"one":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"21682cd736edfb8b451dfd9c55eb9ea3b7cf2e35cad32537f1f4800644fbf9a7","up":true},{"one":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"0210146e650132dd0ceb8cea779cafc5485822eeeb9fcc17f292af5cef6e9632","up":true},{"one":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","other":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"3e4470c3278bb723d01e1f058cf355bec8d3beca8f589cca6e835d59437591a6","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"7294223c0ab27851df8c25418acf09a28efa95fc238252af8a68390db07b77e4","other":"730749922ce3dcd8e249b988dbfb950c15473a2f6fd5cfe2a8126995fb1dc186","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","other":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","up":true},{"one":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"f048e37427d68c4134a115cc7df6a8924ea95f24e7f2435372ae331e24b5b7fd","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","other":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","up":true},{"one":"194ad126c41c487d95c83b19ed2bb053e4d2ec0605952d3a396dd4304e8e363c","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"aa504681c991c69015c7ef0469902c44fc4e900356b181aa252a1280ffbd2e3b","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"61431b36dd5e311475fd2263650f90731c07b728c1052aedf5bb98d414f07e8f","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":true},{"one":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","other":"396b256b223f346a490844895b9f1046b4790d624af1c43ecae1de318c7214a8","up":true},{"one":"f156942ef74790d1b1b5522f83d7099a4b16bc33f6f4ab2f3e1d7dc5bc6b0529","other":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"63304df8e9960f7a91a6185ce0fb69e7061f2647b9e21cce1237f087ce34a78a","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","up":true},{"one":"3d6baa9da17c330fd34a40cecf331877d4a561f6b4f711cd5adf41bd77d68748","other":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","up":true},{"one":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"f0e209f5d6f69f510986085461dde294750cf0e7c2918f01a5c1419ac629de22","up":true},{"one":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"1b1eca7b35086d8b217431c1d6a01fc07dc8bc816196a80015c9e163bed676ff","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","up":true},{"one":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"d3d254a3024a7aac01e97a5f0aff13756741867e599bc94c068f0d1d19ca8176","other":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","up":true},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","other":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","other":"79abd33d150fdbcbce6f55f3d101608b80e03ede7e4627bc06ba5c1b001538a4","up":true},{"one":"193e52ce29062ceca4f468b49655a06e7d41f6d26ff0cab42c1d896b70bb9218","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true},{"one":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"7fa47192bef70d34223a0dad181da09b55e99a1d940e8c48863aefb63c9fb733","other":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","up":true},{"one":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"df5ea72c0c257bbea9b43901a1e406bf6055a307d083367e7f1d944e65c2b3cd","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"c4844b8046d1c47f699ee1c232d945829105d45af26fba722ce4d0a937c99631","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"4b00ab74395ab00e25470c744b8d32f44152f5419b43540fec1fbbaf491f52c0","up":true},{"one":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","other":"f915fbbce2ef58a4378f62b9c749764e968da46df7bed494b35a422d0359a5dd","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"de827c6af1d3423fa60bf50ca6e12172d21a9fc39a6360e2804f83003710b534","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"a80b39cf280fa80b323370cfc37e8e3ff38de47d5de445c500f36c8cf2390b53","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"259d3874697a0c3192f973c620880b2a86567289f5222d07eb91a51867352559","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"f9243ad864859edd351592d24abdf5c9c4e37f4ffe2ae1201c45f26576ee5725","up":true},{"one":"1e4441309404b0dd8dd9e8b1fe78708b015a0b0278ce86bcdaabc7d2d691791a","other":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","other":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"31edba65e539a9a3c7107a131c4fb4b5a8e2c2d4e2db7874a0116c173961e27c","up":true},{"one":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","other":"4d447ea80bc126e57b9fc91203a310c5f4b242df5ad70d5087d16697a626e601","up":true},{"one":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"275c93677aefd92ab38f9e5b5b4d29f90e809ccaf77b088102071aba26421f3e","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"a749372cccb7001a480b9416c41305bd1d3bc417e15669ae587d4375f2bbcbf7","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","up":true},{"one":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","other":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","up":true},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"ed6570e63fc0e2e2d6290645c4339b70a0f1c14064d286b4e0ba143607bd70c8","up":true},{"one":"7851f67196b812fd6cab7d577b90e254c6f9ea33259c60b5efd91654bd8db44c","other":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","up":true},{"one":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"3f3e66f7c8fc7daae8a7a84a9c90f1ea64faa43930f36fc8f11e2d7b751f8ee9","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"def4f0b988942a8699f6b500cc2531c7dea065e3dc5bdcbeb26bca8f00e1d3a6","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","up":true},{"one":"265d7fc553fb8dc016d7c6ccc31fc372912a11e9e8da0e5822e371a91d82e857","other":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","up":true},{"one":"a485db6ec1929aaf695a84294f52905aa602584954e9ef71b4e18f7b847da31d","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","other":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","up":true},{"one":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","other":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"b8a7578a22a1e9963deaeb7e414137bee0f4590bcb93d327e9525d6dc03b81a2","up":true},{"one":"0f5e34b25f6851d0f3b572c64420de0aec01754bea0854bd7e9910b4b1cc66c3","other":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"604c6bfab4f5d16d5b786318cf8f9e0197fc18e5d8a8e6f4fd345e653d2abe17","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"1d942c85568f640497c46a9bd5a9825bc6fb05571203a3f0f14a3032602d81fc","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","up":true},{"one":"167306fb0e24ddd775c2ac0722103ce5db98bb0ef60159b91f584475d34cb5bf","other":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","up":true},{"one":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"9390ef61753fcf9dae5e585a85650287fe1f792538721a2cf767adc44c5e7ce0","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","other":"b45d1aee940e5d2c71db22e2afbe908d5967e437fbb5bd051edea86ea4ac9d30","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"88da9dccda89c111dde40318fd1e5239e77b670f5a1b88a3e9320b7350885e31","up":true},{"one":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","up":true},{"one":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"4fd6a4b99b1ba76775594673421c8eea175c114519c8554798c2c364175bbaae","other":"4cf655b03778bcb41c32664f13168dc32968354468c8aa699de52b43a2e0dc7d","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"d7abbad732948b66476e1833f0af6bb6250dbbf4ac71b9c75b4fc634b617e8d7","up":true},{"one":"9a82d22b29c88eaca2f20a62e9e63675904065e72c70ce2fbbefc0c9d2e53e90","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"42d403f4ee649ebcb94753e065391afd0b4da995a2628696afdb4b851e9f3774","other":"46c5a266dd46041a62f21946290aad736d2298277bbbb16b1efb4490d9d31fa8","up":false},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"4f90f53754ee50357491dbab7c3e6748b40133e3339920b32f4c3457f4258477","up":true},{"one":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"daa2c427e8ecc566e634908fb0d47077d8e79854bf884342c06c4bcb355e80e6","other":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","up":true},{"one":"c98d389a6d8e6eb5a1eb5a6f235857d5d939d30e51c16d80c039c9e0eb2f7eca","other":"c883e2850f0a901af58130e87c4f81d898b03be8b88b580ae7075e6c40b33d8e","up":false},{"one":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"89ee628583b6e0345ceb312c2e2cbf5ac410eb00531be903a4b94b60b639993b","up":true},{"one":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"b4c7555a38d1d4e3bd1d01bcc47a84efd6128e8cc0fd803362da8b341f984a4d","up":true},{"one":"95e0529227286d442cdeeed428614f99c19f9223426e6f6cefbef2d9d47ce96f","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":true},{"one":"8c615fbce8dd93846d810857d03235291732e4307cad0e66ffb23f053d2f0ceb","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"ca81f50b5b4921ef7f584972609e1774da124233ebde0bf8f2ca8383017c8a13","other":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","up":true},{"one":"cb69f673a54a75de300d1d1ab989caa04579504cbcaf78f03bc192c9578ec5a0","other":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"9c01d016aaf11f9e7b048ba10cea3c351d9ab5c8c66e8605f78c06772708985c","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"b310299bef4f4e84a1ecc960143e4b1bbe98cd4eb8352458c477569ca9994c20","other":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","up":true},{"one":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"4019ce1dc667d90a85021b5fbf49ad77c1de7fd3443a40a17bdfaf5175efa1e1","other":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","up":true},{"one":"9c0c7b6da33520440b181a5fcc30aa8a7576ec9c6f64acef0c9525d05a2ee393","other":"9eec5d5357732a7acd26cc8aa0bc65f6c6069aedf4f3ab4a6790c7fff6bc2695","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"670d1c31407b4f34bb955031e9a3ab7980273155080b459a082687d53a3b42a6","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"569567603f057518a9dade31f2d12c57c5dde05ee50586ef0f0a6f98f4f63660","other":"571638637156bdaf92d9c715647a1cf64e91877c2d998658b7c6cd27522271bd","up":true},{"one":"abfabc2964ce2f7b8b3702e897a8cc83fb0c009d5af9670b889db582e57ef7c1","other":"aa889f0faaec1a5b7033151ce9d3d68466b128ff81dcb7befc2ce885d9236c77","up":true},{"one":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","other":"1d9364dcc19e9c94459be42a8474207806813d55ac768ea8e74228fbd73be591","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"05e8f826e49722ce09edda07f9016688df5032bc0183589e3c94afda6dd63074","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"67831469d7f9b779df4318cda9d4310c53fdd66332af3740e654233ceb3fbcbc","up":true},{"one":"0eeed90814e9408c94e81296f7b681ac18edacda5eb611af7f69306524f188b8","other":"06aa2f43956f978abe7b8f8f78a5a8cd59decb66ec54b7c81ae50c3752798c5e","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","up":true},{"one":"043f24ce87fbd01f6f663f323ac6c156810a67b12efbec2f219ae9a882a4bd16","other":"05ec2c85c83bbb8edeeba98fd2ef4b765114f5dc36a88175f5017c09e43b7a5a","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"dc3ec6529cec19709403e473d4546ba07f7aaaaec5be7cb0618246a4c0458944","up":false},{"one":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","other":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","up":true},{"one":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","other":"237459ba37141f18b3cd40f5ec9cdaf6789fb87aa4511d489fdd98a960ef2883","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"245495250d38095106022d3fc905eb7eb6f54adb2cb0bacdda0b305974eaa50a","other":"2e4c8c371968f3a3cea2e2c1c9bc45f8a0cbed49a7a1fbade17ea34a6e5749cb","up":false},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"ddf8ffe61fdd1440ff2d50d42619d52eb125ab8aa1e8e5ce16274cc4f4728b19","up":true},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"f5dd00d94488f3387d64ccc2115cd91e5073c06de36d195a5c1a95db23cd5c68","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"759eacbb4bc23d8f6826d5ff3d38343e4143c973488525ca747e66e6002e2364","up":true},{"one":"86f71d23eb4efeeed4679be7a3d0f58f98b83d23b3e0a8b73f60f1535b51f25c","other":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"af5fcb3714f6da5fe576fed6312f59042cbaa54ac8bd86e7afcd0753743487db","up":true},{"one":"4a81ee929074bd6d9932fb4d970f5207db8680bda0e951aa72a6bd64df45108d","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","up":true},{"one":"d8b0425e4cb5134ddb2de5c05e0ae9b861bd67409c1446ca228318f79f5dd1f6","other":"dae3ea40e4e6e040a4740a614c99ec6b9e644302135cf347ea6ec9ebc87a9f21","up":true},{"one":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"99aaaa7c98113955ecc0163943317f6ec08ae755e96c25c9f79ca1f529c60587","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"99dbf361b67d6c370fd4f201b059e93da50dd88cde2e25d0bcf3c73afbf13535","other":"985c14910d922bbd1556c30620e3ab72170da6553e658dd3806d773a734a1c93","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"ecd2b502d4e9bf77369c62d1142a9fb4ab1071e751cc6971e9e381e953b0fc12","up":true},{"one":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"c64f6bca15d4ef21a37b69c8f8bdbbbfc34e2ce0fc612cbc6a937339c0ccbbdb","up":true},{"one":"5fab772fff883d04cf7e4713266fb1e98fa1746e12faeb04e87bcb37b8b61187","other":"5c5d90a825221bafb2ab726f90422c9a59f9bf97f181c0a2887db2a531798048","up":true},{"one":"bf5ac6f9b651895c8d75ab3ae7994f91981dbbcdce25a7cd718fc996da96946d","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"7ffed78e11c71eccfdddf6a8e5e367831b26a6b11e4d3b60c5b9fc50f4bcdf33","other":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","up":true},{"one":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","other":"14418557af44e33fc8d46369426c3e2fc91622cb08779b3fefce706969ec2163","up":false},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"fb93417c597050f8deeb3098475f6cf0d213926332b59c25a538c1b4e6af89c0","up":true},{"one":"e4c3fa0700516da5650f794067eb1c90ba7eaab2b65019bf34552c26f8c1d9a6","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","other":"47f95708475c9d61ff2016e7707c4a3796f6c87313bd1d2bf91aa620113ba5f8","up":false},{"one":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","other":"c7703c4697637f40a50a5d0b656c4e54010ef1277b64d251ccd0752512e246e9","up":true},{"one":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","other":"566eb2e022a83d49380a94cf17c45955f47faeede4b23f97d357e6e7d7152dae","up":true},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"ed1348b4037004b61bd4d6f9be1648112f835943a3b997b91ac931301311e007","up":true},{"one":"c3f356325eb1e61f2cfd8d80d085fb144c6887e1d710c9d133109b84b823425d","other":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"1a833a4918d6f4ebc0c39ba3bfd4e9de16bb732cbacb963ff58ad3d3198f1336","other":"1b7250dae1f2b07504b381d28084b751a26ac791a1ed842ea5746826ab85ba22","up":true},{"one":"7829673eec0b413d62bb06184e740042e252d3b68b3d1cc174bf01e32f87736f","other":"7a4118d2ce16e8258cc2cdf31c5891945e3787c46c0836fc916601584609b7db","up":true},{"one":"1e42fcbd6735744e505f12f6b0858a9fd17c0a7736a69ab0b969245a3cb1d6e4","other":"1d07520f0ace85fd72f14c881f3d6a5511902b20b6e0f78d2a261191c072ba5d","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"1d5fc65b4121cccaff0d2a853c6bbff0c10b4ec28cfc5ef5cbea8bc28bc4cbec","other":"1c982d886cbac7e6ac5e786a27ad2f8bd42908fca94358cd2838acbc20b5fd31","up":true},{"one":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":true},{"one":"1a02108d9149739be6ba85ddd1e8a3961adeec38f77fcef95ab57f8f2f39f4bb","other":"1b869ca5aec1ff0c9980b06b79084019752fd4557054e251c0091ee5d2c7d478","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"86128689b03706f9a86baf4753154afbb0c535f84089039ef5610d82fb969a6e","up":true},{"one":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"7de7eb0b73f3b02b998e592e0fc51b26c0c3ae6695d41897874d2a3d8ce3554b","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","other":"b71052b072cb98fb79151fd0c6044828e535a0547cace931183c7e4e7f227698","up":true},{"one":"9fee945c89d6bb59e77a24183c2855f4eece0b5d3266f750ea95483eae1e1871","other":"99fba7334f47bfcf21331d6179bfb2eee2ecebd1ea23fd829c542844b10ed974","up":true},{"one":"b60deba7c8676305b67af41d2de866bddd72edc0667d427e51fc3f2e91412b45","other":"b4639751d67db0b32ad1846996fed0d5c59be76b77efaec5f66e64df35eefae8","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"ceee9ac63786ad68d884f5d018248ae1b7b60f0ad434776d29bd4dfcdc0f04c1","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"c8fe626c60d6cd15912a22d2c5872f10a8f8aef5b6f6b2f1070edec6670bf8b1","up":true},{"one":"94aa6cadb94dfc04e2ae3150aeeaeb73b6fc483482156fcabdca4c6596eaa098","other":"96b6ec2cda7c9e962bbc97e7916b92d69b112265c4456d30dade806e09fea62e","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"2fd800d224f124e47038bf140ebd486f1d0ab93169c998d2dfabfd1d3ced96ed","up":true},{"one":"2a2253ec638947fe40b97489b2e2ec0df26ebc77d202276c1d208a3c802c336e","other":"2e9f7d37106b59d6f411dfa0392325d1fa279fe45c18a101e32ece6716e88946","up":false},{"one":"f3d3ba20652827b58c605a137e2f07daa5d139804eb4a9c4270129de3a0de759","other":"f1fcfc064446a432ac7a21efc386fa3d053d0ca4540fd4ddbbb253ec11f9ce94","up":true},{"one":"42c019ddad2fde0f0c7f5041eb584996976844f8b2e08e20458437578d0257ef","other":"43afd835930eac91c0c8947001dd60d8da9112c19cf3f1356589b58b48962166","up":true},{"one":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","other":"6544c4a403d9809697420ff9840ea9de0c9ba6491de28dac288db6257f2dc218","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"887482890b190505bec49838e400f3f1ecb261039ace70bd60c368be94131ee3","up":true},{"one":"388d46d6ea3fd92aa959b04d597ff1096d6133f171181c8fb54e52935b62d33c","other":"3af3bb6c4343a19e3c0f9a89697cd70a3c79c64b1e40afa59b188c5553eed567","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"d6d2d35b3819e03b39d7146c4dd1b53fb7b70681c8860464650d5eb2d09dda2c","up":true},{"one":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","other":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"0592048ae4e6a3000f36e8e1c0e1328c26c0d4bb6369d6cd867a08d847dacb9e","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"03f5f1be5c1ae35469333a5b08622372f65ef8f233746afde56d2647c5273630","up":true},{"one":"1566e3c8e2873d2fbe0f1e9eedbd2cbd5c69161a461e37a48fdfb11d448601e8","other":"0f81caba7d2f752fc670829f74565114bcf10c5b97d7f93252b467d0eee278b3","up":true},{"one":"c8f9cc1fb3ec871e2ce03157f90cfe1c3b01a503c30afdc71d0e8b27ba3a8e19","other":"c99c6a2a2fe7f4613c8d918404c956eae0a00fce544c9eeba5da640e5e958874","up":false},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"4a828523731caf47f9aa2dfa20f8a8895e9a6562b3a034574639a229a733b4a6","other":"487edf32027381256a864bc2e9bca175f7216cc1234731bd4dc90d2cbad6975d","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"77ec3a73ce1d597d307e87ea8d026baae2a7df4d288a657f240eaaaae7fdb456","up":true},{"one":"a6720426faa1ea7e2d55c1c5ad05ba2e8c534d120ebb5e1375cf769d73191708","other":"a03380e51f365445107b59009eaa9040873968cae477be5602efbbdf4a6414ec","up":true},{"one":"57d57ea21e4635857370be02618b158a2b6ed0a8236c67c47070ef41410b3cc4","other":"5571c936426702553d64564d56a909c628a8233ed436acc2a3b9f850c5c6b6f0","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"92325e52babbf2b8ae3c37beec7e440d11efed2d103befa2c4a969315a2eab56","up":true},{"one":"7dc63c8146ed092aa4c9539abd112dc3a703631e364a62fd74b192eee5778123","other":"7471be56a2f617783d5a1ae4390794ad24f453259b7c1f8f65be8f71c8bf8bf7","up":true},{"one":"ad36b802e9b01727e516879c0055e3c46b810845794f7772ad85e8062111b167","other":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"ae715a40e9bf50b4eb954c6b87efbf1a6e7abc3da6d84055e4591aadf5bad5c8","up":true},{"one":"1835f62fe3889f43ba7b4b577869ec764e96fa9a051f1301fb96795daa8b0755","other":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","up":true},{"one":"c15d13aff7f5694fb8fc2a2154846ac703064133feb632e28830777bbfc7c016","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":false},{"one":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","other":"edca23c0fccfd1ec66f4d39bb129462776b9091c2337f6afbfe8737a0ebc0d7d","up":true},{"one":"bfeca898b1755a001eb0bcf8f5ad5713a550d0597f99ef7967ea4e7add8d3e81","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true},{"one":"f644c73e2c7e29dd45506736ca4a0c2cab3f8294c01a6d5decc193cb2d19a473","other":"f5cc76a5a77d79b8f9d3dc2eb53af5f643583aa9392b361aa9578cdad81fd4a5","up":true},{"one":"185a7952985b8efef8ac8ee37283921a458a6a107cba0f7fa33da7480b05c4cf","other":"123fe1d442c7dc905a7206e712fbd9cea640295a6823b39b1945629ffa89e895","up":true},{"one":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","other":"af303f61e91621224d5968e387946d4e1dbf76d1e7ee6f8f2ae60991154d3734","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"c7230d8d56b65a66ab721a8268ed436af78210aae7d068cc2b8afe39b6e61c81","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"bc08af284ab661dcc1cb23859271590e50a09ff8af8073769c812901ea0b9080","up":true},{"one":"8163eebe696123817a6d998d7781612931df6fa2fd0293c0d0dd395d031c53f6","other":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","up":false},{"one":"7d941474f90981a03c95af4cf68be163d01a317e202ac0db82e25f46fc3db8aa","other":"7d45f1e91bcd683d870422b2f591c76f6ab07ff4b079f35c280ce46f7fc364e1","up":true},{"one":"3dca1ae488cc497fe738c630465f987b419a5bb259fdfa17fe7130e238ca3022","other":"3e85d2d3d6750f84500fcf523743e0c242943e69188cb83114adad1787e6c089","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":true},{"one":"e67d72c8c72bbc7bec1d4e936d65adbeab75d1b6cafdf2c39e38bfc723cceebf","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","other":"67a246540c1fa19a0856cf5a99480a3826fc91e125b3bf5ec1e47a2c5aff54be","up":false},{"one":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"df25c443ce1a7b63fe5d89bffcfeb49366a623525660fde8ea509a1934aa050c","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"fd2df4df8f5f7c7cce198cdff07f2adc0e68b646fcc046363d284635c68bbb93","other":"fa7483c3b8652029a3c8599ec3cc1cec5a75181c564a7f6c50094370d43036ff","up":true},{"one":"e44b5f4a563a36e50e57253dfddac4cb5a92137f615f46f638995b4b18863f3b","other":"e76a40477e69f637ff70f1bf393b1dc96a946384340b341d0be97ba01dc12660","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"e6491ee529119721d2c1ce16d220f5d055ba35978f4d7c66c4ec2e3ac36183fa","up":true},{"one":"e3c95a82f373da4522533252549c1d68b6f7621a887feb66199cfd4b7a35b6fc","other":"e787fd35b438dbae3d0283f7181fc4afbeb6f333201ad4cd1b46bf7094a6a85f","up":true},{"one":"c4632e164170d35e91fce46f660265f73795f1d840effce5ab2aae18c73003d7","other":"c63e796efdc44712403199c11c3e5ff28e5d6a4d9ecdf3e95620fbd6afb1bc2d","up":true},{"one":"ae6578693ed933e36a7f499adde340c79bdca0f5f57334dba5646bc1e4d7b717","other":"af358f626738d2e5d17060abbaf24cb0124a48c5edb8f3baeda30bea7b403dfa","up":true},{"one":"d8222a2c177f0cd17baae28327af5c13f2fb551dd01298d17855ce7f6f4f6189","other":"dc86cf92a9640712455824fc7e1eabb939f60370d1be8fff55586c4aaa8b3331","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"d68f504755b48f8d41570169dd3544ef1caea2ab1bb334f8d8c5fb27fe816f01","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"8ac85afde0c46f53269dc42863e9599cfe7ed0ca3222e3718d83ea6481947ab3","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"6d219b0ea4a1620a7ba051cc478da6df9ea443e87dde79e963ec789a5bad7459","up":true},{"one":"8c89e181c6fb18078b404d47b10c70d57d6643393505ed8ac88e63236ea224a0","other":"8ae6a3d0cc665664aed35acd396ef18f642afd2b1e1e23817174b96bedf26793","up":true},{"one":"d3fd74e6049dbeceb5b78ff4681b000da5ad8a3860d4a1070541b5f527d2cc84","other":"d6f37555e9f35a3ef3b8b4d5c18cf0702ed99c1c8b5b0a8554deddcbe542b88c","up":true},{"one":"9461928ad83c196e6a018ea2af138488346fd9c64147b544287e4473ba95ed90","other":"9294e5b39a1cd4230400e033da1ac1f79a4025adab41ce8c0e0e47dda2418cb5","up":false},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"f4e0d91ca58ed616918bf268565c2edb4176293e851b8d29cbbda55bdc608534","up":true},{"one":"6ea59b849a9754c022219146efc27fa6561e5aca8338a111847259695198267b","other":"66100e4f9d103d935164f39ea3f0332708f3825ebcf31ac6f8c9714c75a50860","up":false},{"one":"f78a54ba4b3fa75cdb542bdcd6da0d49986a5f7e7939959a51b3b48a87605654","other":"f4eee71a143722ea8288279876bf5687c1ed65eede0129e987e53f5ec76d8543","up":true},{"one":"aca1a0237ccef04bbfff4359cf12945880e485eaad810fe1bc2f2569cc42fea3","other":"adfc03118406bc5af4e3f3c6c89c3448c3fe4f9df20b15bcca9bbacf58ee5457","up":true},{"one":"baf32cface953bd22141970b691567ed375f06043fe31de354598fb4230fb0a3","other":"be0ab3ddc656568900d8e1f42394cc942464596b7565db40f6c5a0c24ee942f2","up":true}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_3.json b/swarm/pss/testdata/snapshot_3.json deleted file mode 100644 index 38ce68f34012..000000000000 --- a/swarm/pss/testdata/snapshot_3.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","private_key":"e567b7d9c554e5102cdc99b6523bace02dbb8951415c8816d82ba2d2e97fa23b","name":"node01","services":["bzz","pss"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","private_key":"c7526db70acd02f36d3b201ef3e1d85e38c52bee6931453213dbc5edec4d0976","name":"node02","services":["bzz","pss"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","private_key":"61b5728f59bc43080c3b8eb0458fb30d7723e2747355b6dc980f35f3ed431199","name":"node03","services":["bzz","pss"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","other":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","up":true},{"one":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","other":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","up":true}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_32.json b/swarm/pss/testdata/snapshot_32.json deleted file mode 100644 index c33cc6e1bbcc..000000000000 --- a/swarm/pss/testdata/snapshot_32.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","private_key":"294c55925f084f4af87c7e09716c6334a538bac3e6b7157844c0c96a9dd02b4a","name":"node01","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","private_key":"010dbe172f1240848fae9639e029301ebd297b29ad2d6936c67669d23470cee4","name":"node02","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","private_key":"7f974cee5ec96d070bf88898c24035988667ea21242a02822bccbe4ec487d126","name":"node03","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","private_key":"d7e181b51ba95fd1475314470468045205d7ddefb1bbecfda3340267062489d1","name":"node04","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","private_key":"87ed3ffe3111baec0adfd92068b47ed9e1efb642d0ff3115d7d76338f25eea76","name":"node05","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","private_key":"7dbb4fe973c714c4291ce5a8aedce9c3425a25cdecfd5fe0c7f14b55e91d6a03","name":"node06","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","private_key":"6f8900888d42ea5340f13634776acfd4a261837cdb772b9a059b23c7d425da1d","name":"node07","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","private_key":"a94698db3c1a809d255fedabcb4f3314be27cad7be63cda59bb71724d24ca0d9","name":"node08","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","private_key":"37f683b58015f6a7ce73f814fc3860318bb2048052356a215f9eff00aa6ed34b","name":"node09","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3efa59309f968ab20e053836f01e0d8b4c9e777063a73e871cab86c1fe6a0159","private_key":"b27bdea692559a2a77d497ee567e972e033d4e6e5dfb7c35948a9d231c25b0e0","name":"node10","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","private_key":"0a75e7e7dfabf4ee693bfe127221c97eb9b2f4e19d32f7bc836ba253445358d7","name":"node11","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","private_key":"1557c4754c71e6468fae0c7d0e1b5af2cf70511ed2d5d9b0bc276315a4c8f922","name":"node12","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","private_key":"d2b18f4edef23f629bc5624a36ac1d58f59207bf7de0b19220f90fc3c64b5a61","name":"node13","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"81449fb850a7c2713784bc938da3e1573d92e93dfd88199e8d877746b6c260af","private_key":"48fe56dfc63a454ab004e7a5dc7938e29694377b6bcc27d1c19d8a72349a8c2d","name":"node14","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","private_key":"9155d38d2a2bbe1e5239f9993d96a350182e3840813436e23e1f2a4a9a32b7d9","name":"node15","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","private_key":"e60772916c9d248e3a3819de52aacdd4008412aab20a457e88e764752679b8f8","name":"node16","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","private_key":"e7f27ccf343d2124211ba980dfe8ee7e774a5956268a25522347bb3be99bf38e","name":"node17","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","private_key":"0e9cb88a7d70a04f0780ea51e001aabda0830f504e29e31c69d859acce0a9019","name":"node18","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","private_key":"cf8362e06e18a783f7e20baf956d40e2ea4a204ec868f8d34909802af222e997","name":"node19","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","private_key":"9a63fae9e77f9cfdc30f4747a939ba44e85824560d98b49047bfa8f4156d426c","name":"node20","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","private_key":"748efd85864661c429fd70a74bc32f1d81685bd81927c1499dbd93993dc27cad","name":"node21","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","private_key":"fed7bc6fd67e331e642253e604215ba088daa48a1b84979699ad770c09b909dd","name":"node22","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","private_key":"c61c4e9235825e60f2d8c57169e7d1913f45b057f298ba8fb05d51515e92a902","name":"node23","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","private_key":"53704ffbabad329a9032a58cd7ec012499b0a521bb0300e1d7160d4e5d1220fd","name":"node24","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","private_key":"7098a0386bb10a213728ea65f3ca98fd25a31daf3917190f6a1889d350e09674","name":"node25","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"fbe2f731b4bcdbf8490ba7599a011f561ec6a46c95bc9a34effaf29c91085c09","private_key":"e967b2c9db78764c1ce024423c48e170b68fb6232c313a32133faf4936e2c114","name":"node26","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","private_key":"f8cf717ad5b26578e58a97eddc6074cebb814cdaf3f4144acbafcce51ccbd249","name":"node27","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","private_key":"e6573973825826d193b5093ec610c34368630376e4e13843e5f2203c3ca88fa9","name":"node28","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","private_key":"0ff9df0f439480bc31f8a3ae593af2662bad0f5bd4e0c3e87839af326929de07","name":"node29","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","private_key":"1daf1094602b9234a1651a8ba6013a807d9c0d56339c784d618e2c6705b65e23","name":"node30","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ea5ae8b639fa80db684c774d814b7e9cff0cf9622427dae35239cc84c1b7dabc","private_key":"376cc1c769c48c4a04f3f1447fe31112cdbc8d898266a338f6675906511bc9c6","name":"node31","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","private_key":"6a9a93cae21630926926ece339463ca165823f499f47d45632dbe1a49a84257c","name":"node32","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","other":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","up":true},{"one":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","other":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","up":true},{"one":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","other":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","up":true},{"one":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","other":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","up":true},{"one":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","other":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","up":true},{"one":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","other":"3efa59309f968ab20e053836f01e0d8b4c9e777063a73e871cab86c1fe6a0159","up":true},{"one":"3efa59309f968ab20e053836f01e0d8b4c9e777063a73e871cab86c1fe6a0159","other":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","up":true},{"one":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","other":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","up":true},{"one":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","other":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","up":true},{"one":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","other":"81449fb850a7c2713784bc938da3e1573d92e93dfd88199e8d877746b6c260af","up":true},{"one":"81449fb850a7c2713784bc938da3e1573d92e93dfd88199e8d877746b6c260af","other":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","up":true},{"one":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","other":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","up":true},{"one":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","other":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","up":true},{"one":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","other":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","up":true},{"one":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","other":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","up":true},{"one":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","other":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","up":true},{"one":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","other":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","up":true},{"one":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","other":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","up":true},{"one":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","other":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","up":true},{"one":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","other":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","up":true},{"one":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","other":"fbe2f731b4bcdbf8490ba7599a011f561ec6a46c95bc9a34effaf29c91085c09","up":true},{"one":"fbe2f731b4bcdbf8490ba7599a011f561ec6a46c95bc9a34effaf29c91085c09","other":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","up":true},{"one":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","other":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","up":true},{"one":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","other":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","up":true},{"one":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","other":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","up":true},{"one":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","other":"ea5ae8b639fa80db684c774d814b7e9cff0cf9622427dae35239cc84c1b7dabc","up":true},{"one":"ea5ae8b639fa80db684c774d814b7e9cff0cf9622427dae35239cc84c1b7dabc","other":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","up":true},{"one":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","other":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","up":true},{"one":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","other":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","up":true},{"one":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","other":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","up":true},{"one":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","other":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","up":true},{"one":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","other":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","up":true},{"one":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","other":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","up":true},{"one":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","other":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","up":true},{"one":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","other":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","up":true},{"one":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","other":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","up":true},{"one":"3efa59309f968ab20e053836f01e0d8b4c9e777063a73e871cab86c1fe6a0159","other":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","up":true},{"one":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","other":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","up":true},{"one":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","other":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","up":true},{"one":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","other":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","up":true},{"one":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","other":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","up":true},{"one":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","other":"ea5ae8b639fa80db684c774d814b7e9cff0cf9622427dae35239cc84c1b7dabc","up":true},{"one":"81449fb850a7c2713784bc938da3e1573d92e93dfd88199e8d877746b6c260af","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","other":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","up":true},{"one":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","other":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","up":true},{"one":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","other":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","up":true},{"one":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","other":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","up":true},{"one":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","other":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","up":true},{"one":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","other":"ea5ae8b639fa80db684c774d814b7e9cff0cf9622427dae35239cc84c1b7dabc","up":true},{"one":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","other":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","up":true},{"one":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","other":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","up":true},{"one":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","other":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","up":true},{"one":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","other":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","up":true},{"one":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","other":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","up":true},{"one":"ea5ae8b639fa80db684c774d814b7e9cff0cf9622427dae35239cc84c1b7dabc","other":"fbe2f731b4bcdbf8490ba7599a011f561ec6a46c95bc9a34effaf29c91085c09","up":true},{"one":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","other":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","up":true},{"one":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","other":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","up":true},{"one":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","other":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","up":true},{"one":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","other":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","up":true},{"one":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","other":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","up":true},{"one":"fbe2f731b4bcdbf8490ba7599a011f561ec6a46c95bc9a34effaf29c91085c09","other":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","up":true},{"one":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","other":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","up":true},{"one":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","other":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","up":true},{"one":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","other":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","up":true},{"one":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","other":"3efa59309f968ab20e053836f01e0d8b4c9e777063a73e871cab86c1fe6a0159","up":true},{"one":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","other":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","up":true},{"one":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","other":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","up":true},{"one":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","other":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","up":true},{"one":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","other":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","up":true},{"one":"3efa59309f968ab20e053836f01e0d8b4c9e777063a73e871cab86c1fe6a0159","other":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","up":true},{"one":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","other":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","up":true},{"one":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","other":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","up":true},{"one":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","other":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","up":true},{"one":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","other":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","up":true},{"one":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","other":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","up":true},{"one":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","other":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","up":true},{"one":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","other":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","up":true},{"one":"81449fb850a7c2713784bc938da3e1573d92e93dfd88199e8d877746b6c260af","other":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","up":true},{"one":"0c14562578ab9796c635d1e5b713bc966341f6e742acd4a8a93a524cadd669eb","other":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","up":true},{"one":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","other":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","up":true},{"one":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","other":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","up":true},{"one":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","other":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","up":true},{"one":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","other":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","up":true},{"one":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","other":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","up":true},{"one":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","other":"81449fb850a7c2713784bc938da3e1573d92e93dfd88199e8d877746b6c260af","up":true},{"one":"fbe2f731b4bcdbf8490ba7599a011f561ec6a46c95bc9a34effaf29c91085c09","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","other":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","up":true},{"one":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","other":"3efb0d9530c931c9e47c6ff622c8ad695cbfad216cd9a2b4268c8c3763ffaff0","up":true},{"one":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","other":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","up":true},{"one":"461dc187c3911fd12829fb3168b68135e3208771d385324434e8ca7ecf72b2e2","other":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","up":true},{"one":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","other":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","up":true},{"one":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"ea5ae8b639fa80db684c774d814b7e9cff0cf9622427dae35239cc84c1b7dabc","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","other":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","up":true},{"one":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"59b214370ca7c60bcda95a18d2b668519ef8ee53af9e4a677f1981defe79d4a7","other":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","up":true},{"one":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","other":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","up":true},{"one":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","other":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","up":true},{"one":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","other":"9ea072155528aaca8fef7a25af26134898b65aed2464dbaa397235cb96f7cd15","up":true},{"one":"3efa59309f968ab20e053836f01e0d8b4c9e777063a73e871cab86c1fe6a0159","other":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","up":true},{"one":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","other":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","up":true},{"one":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","other":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","up":true},{"one":"0a5cc796e733b06866b67ec3652e41a03a0c03707fed56b767ca5cbfe3828b35","other":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","up":true},{"one":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","other":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","up":true},{"one":"81449fb850a7c2713784bc938da3e1573d92e93dfd88199e8d877746b6c260af","other":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","up":true},{"one":"8b72d2a8665d545aae43b317a20f51af80357b290e826822309d9a1dc67a4470","other":"e9bcffd8355af43dfe4ec4415e77a92f6f6897f9c6bc78f31281346cd460cd34","up":true},{"one":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","other":"46599aa9671556263a5e5818575b8a12e7c755a44f9dac7873c1c48f33c1465e","up":true},{"one":"58ebac47c884e77049a6c9c851ffb1e74622d27be8e30117f1f775391ac27717","other":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","up":true},{"one":"fbe2f731b4bcdbf8490ba7599a011f561ec6a46c95bc9a34effaf29c91085c09","other":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","up":true},{"one":"f1e3713691f9088c72295658b7e887d83058c668495830c63c0241716c9cae80","other":"8939636008ec2eec222bd490ab86b42f9ef1fee7e41a32c70deb676920c3454a","up":true},{"one":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","other":"c3863946fb7d43a75cbe2503fa301a4a20cf65caac1dfcbe5fafa2d873a5c6e5","up":true},{"one":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","other":"c6b69d856ec8ac1822b4a1d54f8d3bc44831bcd20fbb5c8f8c67b68b33541fe9","up":true},{"one":"0b07a13f12316594013fb220a14910c9aec9446274b6e9f89da3bf1f5732624b","other":"3a268a0db7e8b31d4b362ecb598f3e549a2aa59392591b4d2f2ba37e6ceb72b3","up":true},{"one":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","other":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","up":true},{"one":"0688bd16330526285a532b2ee34a92075487d93938e2789e324ccb583af7956a","other":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","up":true},{"one":"211b73ccd445df519b8afabb07b3b590f3594f01715abca8f9cc7fade33f75ba","other":"7f25ae980b4aeac041d8bd17a8a4140f762aca78710cfd2fb41f8d91d713e4df","up":true},{"one":"55b8a5f2d199cc115b9d0978458444983137888591b0e91016cc2f75ce593a41","other":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","up":true},{"one":"175e3bbbfc70b443adf887386485a4c0171df26edaf7b44c32e430fc37b830d3","other":"02f7b6240d3c3990559d296355bb86f40162fee7a45c2e092eb90277266ecbd8","up":true},{"one":"5e883de2318b4355140edb00a60db79ddc16e0dabec47cd34e2a2b175e198711","other":"41de70b44e7b0b0670d42f0ae348bc6501cef8b4174a6c6d9986645cd5e47aaf","up":true},{"one":"de8f114621b53a5a68dfc1870600c60bf9912ad4d36458e52606ab27a6d7c3fa","other":"8564a53752aa3e7edb8e09c3ad61b765ce5abd2ad9c5cb63bfa036930d6de244","up":true},{"one":"dcf5d113ddf39e516a3871a31843da3cd7740daa2a8f4827265a3d9bfaa3b402","other":"cd92d92973dc25f623e4492a165f8a8b043e9dd959ca498aa7c6e82ec8038d54","up":true}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_4.json b/swarm/pss/testdata/snapshot_4.json deleted file mode 100644 index a64f31375ae1..000000000000 --- a/swarm/pss/testdata/snapshot_4.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","private_key":"e567b7d9c554e5102cdc99b6523bace02dbb8951415c8816d82ba2d2e97fa23b","name":"node01","services":["bzz","pss"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","private_key":"c7526db70acd02f36d3b201ef3e1d85e38c52bee6931453213dbc5edec4d0976","name":"node02","services":["bzz","pss"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","private_key":"61b5728f59bc43080c3b8eb0458fb30d7723e2747355b6dc980f35f3ed431199","name":"node03","services":["bzz","pss"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","private_key":"075b07c29ceac4ffa2a114afd67b21dfc438126bc169bf7c154be6d81d86ed38","name":"node04","services":["bzz","pss"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","other":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","up":true},{"one":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","other":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","up":true},{"one":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","other":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","up":true}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_64.json b/swarm/pss/testdata/snapshot_64.json deleted file mode 100644 index d8031614e93b..000000000000 --- a/swarm/pss/testdata/snapshot_64.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","private_key":"8f572fa1cb0643b3413cd0dfceac00a4dac9ec09af0c2d134809b6385dad35d7","name":"node01","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","private_key":"a66e079664952b1fb1028e959dd8a05a21477e2f298ea89592adc522d38e511b","name":"node02","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","private_key":"072e1cf99b52c2f1d40560809048fea86f39ae1db94bec2c9b71b0bfe092910a","name":"node03","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","private_key":"003ec9cb18f157360d7a3eb506b37ec69dbbd141bbeb7b8fae5f470b1a0768db","name":"node04","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","private_key":"fd6fc50368fbc7e848635726291264cf6ad682fb4fe785b724c8b22ea31e1e24","name":"node05","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","private_key":"da156f269cb01e7fbea5efd5f7ab6283ef0994a1ca139768f49c68e027ca76b0","name":"node06","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","private_key":"ae570046bebe22a2cd095ca2b2282cab29b2501c6f217ae3e19d96bace36c199","name":"node07","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","private_key":"dee3b946981d4b7bd055941cd6722b166efc24f28f6b26da9cd52a8f91f3a411","name":"node08","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","private_key":"b7e566b24a7c97f714c9920c4e426dd462ee171bb8fd91a3efee9bd1d28dd060","name":"node09","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","private_key":"070b030d06605c46eafadabb979d38f9d4f48cf55e24a96378f4f0bbe2806887","name":"node10","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","private_key":"4ad1a65bb55e2f6d41cc3383b1de11c79bab13723c02d4f5abaf725d6aaea3e4","name":"node11","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","private_key":"bbe3351a79ad82f8b832dc16567dd1bcc24b1897bc9bfec930f3461a61f7d652","name":"node12","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","private_key":"26e548a577ae1fcc718256e75d48d70ed406dda8798f84c967d7dfe45c6aceb5","name":"node13","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","private_key":"97ca855261319532dfa74bf6194b4302c3d2f971adbd462e3437408df6dcbe47","name":"node14","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","private_key":"a762e1b25bed356f9a9e3aed01c7a38e8f57441b6caa18874712ef1159616b57","name":"node15","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","private_key":"53407f7862d16cdfd7beb23612d5d57dda1963cf729766feb046966e15850b32","name":"node16","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","private_key":"f3ffbcce6a7f7bfe25c3ab3ba95dd0574944bb5a09eabda3da69f187c48ea747","name":"node17","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","private_key":"0fc26e702e6bf4755536ef14b178df72099f9d2e818b53ce85f5b5ff3ea6c9c8","name":"node18","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","private_key":"6f1be181439476148e13cd2c39dd8983588047ef5f966091688ce37a01f78441","name":"node19","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","private_key":"b2732f7493e1101eb17248f6a6d83b5811c49cfc13f1aa41a624d1bb3e85368f","name":"node20","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","private_key":"b573a79bddda3cee3997d5c1210e33810dfce4f43a9a47d3f41ad02352d0515e","name":"node21","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","private_key":"3e8547c0320dad0457a7c6d576c1700ac4af59504cae9178faafcd60c9830e99","name":"node22","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","private_key":"dcee5e2db10836dcd5e3bbe14845a6203eebb791ae82200732e6b21d453e0642","name":"node23","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","private_key":"e895b2d5bfbd538d231463563cec8889c8aef0fbeb77acfd3ab9bb75504d39cd","name":"node24","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","private_key":"199b03688e42fbdcdd00b6230f59bf7a0b6ac22f6088c7d398535121f867b30a","name":"node25","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","private_key":"04a50f62b3bd30de9b6a4ca7c72d0fe81f6c111ab99bbbf4bb9c21b6c8983639","name":"node26","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","private_key":"dee1658338c1840984753b1121833d17232db7a62a8ed1b4fc1268e99138385e","name":"node27","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","private_key":"9fa3a527ec0ce68f936c2dadcc080238cfd5a3a462c20462567976eaf1d52810","name":"node28","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","private_key":"26df6d28e33e4da3390df260d9bbad739c31cc494a632239633485872b1ead29","name":"node29","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","private_key":"d7549640c8223b3b3e55195e3b519a85b7af1f1fc26ebbd56c9117a639544593","name":"node30","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","private_key":"16ea03e396aba3e56e9e2d89e53b68e46e51408b090fe2b99e65591ae6cd02c0","name":"node31","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","private_key":"2f111d17fef6870e109950bfd76e7e6db0913a06d14f8f5a311a39f447e65aea","name":"node32","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","private_key":"b20e729862ae141e3134c9eb2ed703957c0fd006f041df213946d66bfe06a3a7","name":"node33","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","private_key":"d35682e43d6382cb9508e5479fc2d09bec82166746bd406cc249f655715ae986","name":"node34","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","private_key":"9d7b2568317659ec35ed53c64f5c1aa0813dde36f1f492139ffefdd91ae0717e","name":"node35","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","private_key":"1177e7fa4a1e785fc30996682cf9ecd265d86943f65d7e3cf4c25cefcd861479","name":"node36","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","private_key":"29e2a9ddf2c5b8914fcf8d3782d464b0be6252d589b2a7daa1ea6b93b205c4f4","name":"node37","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","private_key":"de7a36b57175c1b9dd9686884f73048ea29215a01fdee9f2cf5068218efdc9d6","name":"node38","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","private_key":"209fa24e0d0a335e74967ae3ca2914ea6fb1ac99b9495820e9680855fab3081f","name":"node39","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","private_key":"225e538725db916b0e7be129cbda4da08e6be4ccaef64cf870551466d2658834","name":"node40","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","private_key":"1cf5c454ae9746fb367557d4f4a4a9d22157508dd1b19223b4640a3fa9c1dce8","name":"node41","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","private_key":"e4f81e7a844611f55194d22f62b681f479dadd58596a292cbbf6ef794df1c99a","name":"node42","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","private_key":"cfea4812067444b8816b5d70ed03fe5491d28ca6012a871bcb8aebbd100f9489","name":"node43","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","private_key":"384043ea1944918b9fac6bbbd88341254533ae49e3b2ce16c1df0941b1118303","name":"node44","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","private_key":"2de5004aa7337bd0819c88121cb0e708bc072c153bf94e274d7e786288996630","name":"node45","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","private_key":"aeb73b9ba035e0d3569e9dd5780dea2994151e2b43cb74e0e297fa285ba3d794","name":"node46","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","private_key":"6f192dda3ba98c5d13e94cc2e64ed95478ee64e97b230f224237977bf04cd724","name":"node47","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"0b45cb8af78fb1af7ab55d022ed00da66393b7eea1b7a3a2f802ffeba4c79dd3","private_key":"5c3a125bd1eca6243b28fcbd20a0811d7e09ce602ca98ba5f253435d76e0e4a9","name":"node48","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","private_key":"e4c7dec3dd327bfaa41b91fb8ccdbb96156d1fe464da973445a35f61e5bc6814","name":"node49","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","private_key":"07853d60907494e01f54f879c85c5f3fec6d4d615f9553d12b3da9ea1ad7a4ec","name":"node50","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","private_key":"6de081218acdb9ac4c4b8fbf1fde5f2be3c601cbf9104c970de43c2512c5e4c3","name":"node51","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","private_key":"7b7cb0ca071a27ee059bda50862b7fed343122d2546f5ac5a49dd5b47910530a","name":"node52","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","private_key":"542108cf09fe9447bb772d25802153811dd504943271556789165c6742636520","name":"node53","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","private_key":"87ab72e1c606a3b799ef3f34d3aa14549953c570f569a7b7952bb8f460b05a56","name":"node54","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","private_key":"a568b1f02f9c9129fd2924f704b8948351325edea81e43132c857be97dc7216d","name":"node55","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","private_key":"885083158aab574e1ab94645ea978b0e98a06605b1cbbfc48450f46522476b22","name":"node56","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","private_key":"5ee85ab61759ce457c89801346b14f68f1f16d6c59b2c034a2aef87242488041","name":"node57","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","private_key":"0bc8227f073c115b1ecd2add3e0ce8f58974528279de040eeaf189abfa6bc506","name":"node58","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","private_key":"a548a32f98cf950d6811b01fd764cd17b51d7012b18e944b3bb90dc660e35817","name":"node59","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","private_key":"55c9fd7b7ce7d50376a51050ac0a0a61b4657f9392ad14509bf432758a02b102","name":"node60","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","private_key":"daa4e758bca88df487bb1bcd41e59643256d23f237f96d654010801c07240435","name":"node61","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","private_key":"0090eced227d4fcb0e639349e4164040aa3c9d858531c2df416023c416753a5d","name":"node62","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","private_key":"96f0c30375428cd6184d43806adfbc9a4600e0180b50afa6ce06bfb1581cf1e0","name":"node63","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","private_key":"4738e28b9e3f0920f9c89ac195862299c670e5b354e5bbd644395336a446166f","name":"node64","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","other":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","up":true},{"one":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","other":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","up":true},{"one":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","other":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","up":true},{"one":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","other":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","up":true},{"one":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","other":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","up":true},{"one":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","other":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","up":true},{"one":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","other":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","up":true},{"one":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","other":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","up":true},{"one":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","other":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","up":true},{"one":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","other":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","up":true},{"one":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","other":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","up":true},{"one":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","other":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","other":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","up":true},{"one":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","other":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","up":true},{"one":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","other":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","up":true},{"one":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","other":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","up":true},{"one":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","other":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","up":true},{"one":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","other":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","up":true},{"one":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","other":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","up":true},{"one":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","other":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","up":true},{"one":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","other":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","up":true},{"one":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","other":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","up":true},{"one":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","other":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","up":true},{"one":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","other":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","up":true},{"one":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","other":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","up":true},{"one":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","other":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","up":true},{"one":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","other":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","up":true},{"one":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","other":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","up":true},{"one":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","other":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","up":true},{"one":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","other":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","up":true},{"one":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","other":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","up":true},{"one":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","other":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","up":true},{"one":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","other":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","up":true},{"one":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","other":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","up":true},{"one":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","other":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","up":true},{"one":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","other":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","up":true},{"one":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","other":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","up":true},{"one":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","other":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","up":true},{"one":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","other":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","up":true},{"one":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","other":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","up":true},{"one":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","other":"0b45cb8af78fb1af7ab55d022ed00da66393b7eea1b7a3a2f802ffeba4c79dd3","up":true},{"one":"0b45cb8af78fb1af7ab55d022ed00da66393b7eea1b7a3a2f802ffeba4c79dd3","other":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","up":true},{"one":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","other":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","up":true},{"one":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","other":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","up":true},{"one":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","other":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","up":true},{"one":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","other":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","up":true},{"one":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","other":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","up":true},{"one":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","other":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","up":true},{"one":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","other":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","up":true},{"one":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","other":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","up":true},{"one":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","other":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","up":true},{"one":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","other":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","up":true},{"one":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","other":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","up":true},{"one":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","other":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","up":true},{"one":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","other":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","up":true},{"one":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","other":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","up":true},{"one":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","other":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","up":true},{"one":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","other":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","up":true},{"one":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","other":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","up":true},{"one":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","other":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","up":true},{"one":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","other":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","other":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","up":true},{"one":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","other":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","up":true},{"one":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","other":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","up":true},{"one":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","other":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","up":true},{"one":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","other":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","up":true},{"one":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","other":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","up":true},{"one":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","other":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","up":true},{"one":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","other":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","up":true},{"one":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","other":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","up":true},{"one":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","other":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","up":true},{"one":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","other":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","up":true},{"one":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","other":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","up":true},{"one":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","other":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","up":true},{"one":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","other":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","up":true},{"one":"0b45cb8af78fb1af7ab55d022ed00da66393b7eea1b7a3a2f802ffeba4c79dd3","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","other":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","up":true},{"one":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","other":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","up":true},{"one":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","other":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","up":true},{"one":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","other":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","up":true},{"one":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","other":"0b45cb8af78fb1af7ab55d022ed00da66393b7eea1b7a3a2f802ffeba4c79dd3","up":true},{"one":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","other":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","up":true},{"one":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","other":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","up":true},{"one":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","other":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","up":true},{"one":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","other":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","up":true},{"one":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","other":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","up":true},{"one":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","other":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","up":true},{"one":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","other":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","up":true},{"one":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","other":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","up":true},{"one":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","other":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","up":true},{"one":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","other":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","up":true},{"one":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","other":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","up":true},{"one":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","other":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","up":true},{"one":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","other":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","up":true},{"one":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","other":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","up":true},{"one":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","other":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","up":true},{"one":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","up":true},{"one":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","other":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","up":true},{"one":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","other":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","up":true},{"one":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","other":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","up":true},{"one":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","other":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","up":true},{"one":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","other":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","up":true},{"one":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","other":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","up":true},{"one":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","other":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","up":true},{"one":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","other":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","up":true},{"one":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","other":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","up":true},{"one":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","other":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","up":true},{"one":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","other":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","up":true},{"one":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","other":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","up":true},{"one":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","other":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","up":true},{"one":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","other":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","up":true},{"one":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","other":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","up":true},{"one":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","other":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","up":true},{"one":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","other":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","up":true},{"one":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","other":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","up":true},{"one":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","other":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","up":true},{"one":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","other":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","up":true},{"one":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","other":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","up":true},{"one":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","other":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","up":true},{"one":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","other":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","up":true},{"one":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","other":"9bb12f66006f3347790c2c4e74e5463fd6ab651768296ee41de51757b9f40b89","up":true},{"one":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","other":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","other":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","up":true},{"one":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","other":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","up":true},{"one":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","other":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","up":true},{"one":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","other":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","up":true},{"one":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","other":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","up":true},{"one":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","other":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","up":true},{"one":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","other":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","up":true},{"one":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","other":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","up":true},{"one":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","other":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","up":true},{"one":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","other":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","up":true},{"one":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","other":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","up":true},{"one":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","other":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","up":true},{"one":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","other":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","up":true},{"one":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","other":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","up":true},{"one":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","other":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","up":true},{"one":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","other":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","up":true},{"one":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","other":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","up":true},{"one":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"0b45cb8af78fb1af7ab55d022ed00da66393b7eea1b7a3a2f802ffeba4c79dd3","other":"74117e299fffce1ef7f323ea1d6fb1c509cd5581f6c53e0f5e9af8d0b83748f2","up":true},{"one":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","other":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","up":true},{"one":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","other":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","up":true},{"one":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","other":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","up":true},{"one":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","other":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","up":true},{"one":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","other":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","up":true},{"one":"7f4198ddcfb55e9f690024cc19ce4f32d5bbc8d56cfb43f806513a74e52dc277","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","other":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","up":true},{"one":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","other":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","other":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","up":true},{"one":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","other":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","up":true},{"one":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","other":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","up":true},{"one":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","other":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","up":true},{"one":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","other":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","up":true},{"one":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","other":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","up":true},{"one":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","other":"cec77f188351d24d5067de2e0cc57b48a9a5455d78bda6b7632d14a679070c3d","up":true},{"one":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","other":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","up":true},{"one":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","other":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","up":true},{"one":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","other":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","up":true},{"one":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","other":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","up":true},{"one":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","other":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","up":true},{"one":"292bb75a5407dda2ad7b642b1b790264e7ce16bbd8cd22e512eeec3d600ea520","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","other":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","up":true},{"one":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","other":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","up":true},{"one":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","other":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","up":true},{"one":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","other":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","up":true},{"one":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","other":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","up":true},{"one":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","up":true},{"one":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","other":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","up":true},{"one":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","other":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","up":true},{"one":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","up":true},{"one":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","other":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","up":true},{"one":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","other":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","up":true},{"one":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","other":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","up":true},{"one":"b52335dfb9367471204dfba231ba274815b859164e19ee872e20326d0575b88a","other":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","up":true},{"one":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","other":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","up":true},{"one":"0f5c44c74d4cc9b10d283a0099fba5f925c3455f5308d2044c377f8a5181703a","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","other":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","up":true},{"one":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","other":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","up":true},{"one":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","other":"3bc8d405359a665d3f6d64cf9ba194b7e614c2050add0a1205be7f6c3c984e1d","up":true},{"one":"0b45cb8af78fb1af7ab55d022ed00da66393b7eea1b7a3a2f802ffeba4c79dd3","other":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","up":true},{"one":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","other":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","up":true},{"one":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","other":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","up":true},{"one":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","other":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","up":true},{"one":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","other":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","up":true},{"one":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","other":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","up":true},{"one":"ab1c8bbfea9434576e15465cfbd66e8c6565345d83e248d6fcd3748e82806c95","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","other":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","up":true},{"one":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","other":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","up":true},{"one":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","other":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","up":true},{"one":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","other":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","up":true},{"one":"8c5f07bdc96c7bbd8fc7bcf5e3ba841cabfc47f910acbf416730f5e67f847b34","other":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","up":true},{"one":"e75238135f0c071ca541fb0a9569e38036c51af350a16bf4a1526f1752318059","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","other":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","up":true},{"one":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","other":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","up":true},{"one":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","other":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","up":true},{"one":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","other":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","up":true},{"one":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","other":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","up":true},{"one":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","other":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","up":true},{"one":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","other":"e0463c87b0b7deefbd521721430e0fd24683aa8b41c65f259d678d9844bd800f","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"cf69e5f8effee000dc16109a7e0d04e4e13aeb2f6c089999e555946a46e548f6","up":true},{"one":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","other":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","up":true},{"one":"9e9451cb84ec10881e16a87d84b0e4e1aa78f5e9bc49ca5244a3da414b5210da","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","up":true},{"one":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","other":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","up":true},{"one":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","other":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","up":true},{"one":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","other":"5e64f329525e17129b3f51580b399a5f09d7652a663bbaac83c8173dd9fded41","up":true},{"one":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","other":"39e710327f4176b5ed7ebc921db592a6b9197b237029faab4525a00d18470e8a","up":true},{"one":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"7fe48790180ab38e7687009847285f7af5e73b21b60cfad9d844ba8b2e7576e4","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"6a5cd611a5a8a94c82d6d3b40912909f326d4111c82983c3f719cfa3f621312f","other":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","up":true},{"one":"cee0b72bcb0a112c9aa33eb80166d279c2cc0216782a19454a086c0147b8126d","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","up":true},{"one":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","other":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","up":true},{"one":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","other":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","up":true},{"one":"1f17c9223987ccf4d9683df0664cd568164c69d2f62bad2a79ef4636623ba87a","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","other":"aa655b48b225d692184a21a2f7162950851a914f89671cc1af3e87a21b37c5e3","up":true},{"one":"5c197e623ab40c0de2c83a4ffd16930cf791e60357f162f5b2a2e865ff0cea73","other":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","up":true},{"one":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","other":"34ad9431b71cdeae0c1941b3ae680387b3cedd815f39d65034892920aa869f38","up":true},{"one":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","other":"e45d7b4870acb8a984c065cce7bd17acaf79c5ad4d477f810563315aebacd8e3","up":true},{"one":"2597463214ea0faa3db781fa8cb336da59aff43553f045a0f704ab10f5f54cf2","other":"0f988a170fdc7761b8d9814a1a7ac0cc0e98483b91841046b9948783befeed88","up":true},{"one":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","other":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","up":true},{"one":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","other":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","up":true},{"one":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","other":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","up":true},{"one":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","other":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","up":true},{"one":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","other":"903561af2459b0e46d8188121e66d8b999ad39341944eb099eff70213244c813","up":true},{"one":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","other":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","up":true},{"one":"6b336cfff0d431edce4cee0cf35ffb1e50b7a5c6e15d3d816fb1bb1cf6488f22","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"9e384d8e6d319016c2807884e0b46da4ce9fcb426efb76224ce41b5d4dae5632","other":"88b4c3d6ae6a1d4c39caef84d56f308b58e2ca0477cc5197f3f5be41c890bd7c","up":true},{"one":"b45f23d6ac8824b480f71f25abf5aa2c9db4c3a904660d391768168430355827","other":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","up":true},{"one":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"647ccb25b23a917f611a46a72b12fd457610f07143155e1f828b41fd2d3e0b58","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","up":true},{"one":"cfc872fe7f213f4ada5ec413037450ae2b141157c83998b9520ac2ddb51707bd","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"e0205da225e77fa15332864eaef1c437be306090b0489faf3f6725cb3c5b4712","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","up":true},{"one":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","other":"461c7f8f8948693dea717679ffc4bbf0eb573f4597543993e3be39d3594fdd47","up":true},{"one":"5a4fa4f4482dbaf7bbe6c3d2ae28c35187fbd0f00d1293be41719aa8e5e4a388","other":"6d29dbed992f0f0008a72978045df08a4ae1753571fdefbb676f52b5ff843433","up":true},{"one":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","other":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","up":true},{"one":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","other":"5fd664467fac65594c3dd6f89bf2a5398e28aa95d248c3a3d21abaecfebfde5d","up":true},{"one":"66d586d2f06e0b26d051d3fed949bf8f36ca3ba4c64b8230987ae0c7d29c2dfd","other":"71fe0f225ee23106cb6d6c57cdeb49ecc4ffb2b13441956eca6d94505aa2a72c","up":true},{"one":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","other":"85d645e3738c441f508671f52cde0aa7ae2032c082c86b7ca6af92598d7174d5","up":true},{"one":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","other":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","up":true},{"one":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"9045e912dc0acaf9d86ec75d98e93bc90832dbca1119641f8569a98040be940c","other":"80d0a541f041fbab580164228d09af6be9e3beec5301e998398231362298835e","up":true},{"one":"cc708e47196a6435b13b18f213f50bf075f3f97100d52d18d70052efc301c91a","other":"b2a236a2acf5cf675c521a3e87ef847933e1736c220a54cf66db4ba03f369483","up":true},{"one":"bece4d99fafdcebd22f03a4640026c55f7155ff814b295a2aec7a98d3973595a","other":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","up":true},{"one":"b04c7f907691ac51adab6fe657dd4592044ca4222ee60eb86c7851c855057a8e","other":"a416fa852bb425e00b805ffabb525ae45024403685a0e8a67815617fd1d078da","up":true},{"one":"bd5b11dfb3bf903c4cb8ce44756e41fefb5582deb79055ccc65fe7b47b2a1a41","other":"a365bf427dc109429657033f4b7b22575b6a8d955d6eaf44288725e5e47b0a86","up":true},{"one":"f0517f6a1187d0f454aaf98506fdc830e14d31259fbf195f1694078dcaa5582f","other":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","up":true},{"one":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","other":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","up":true},{"one":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","other":"eebe8082b0f6efbade062eb49f2592519524a8c3f22975ba901ed9755a9d0ead","up":true},{"one":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"113d7850e8169761d357e0ad5a262560fe6137fc6a992b3b2cedcebbe5d5f6a2","up":true},{"one":"4ff286f9e1f7d2d0a8e14a5547e03580d67dbedd1e2ca0c88ad01a2e56c0f45c","other":"5205bbd1c298864045f08fe7cc4c2409055db3ee4d790d2587c9ca3366acd977","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"1102d287c72becf1bfa8567cf43cc2051aed16a79196f9109cdedf829a2a5a2d","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"c85b39668486c5eb3ea9f312d9897bda5688c4995318e4e64a0be2ac0cb47692","up":true},{"one":"d79a1e6f3dc0e3382eaccdc1fb0f49cd66f483addcc52d767fc12f4b6754e206","other":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","up":true},{"one":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","other":"2218170def9962d400bf932ced91f3c14595062b50ef86eb4d2f7fd384fc8597","up":true},{"one":"cab41b44229682f11d6aca3d3136597524e9eb4e1640147b87f3f8c7227959f1","other":"f3a57f887ddcf1793207948374ce67da9f6a1227f253e3a90acc5b36a48ee645","up":true},{"one":"df45befed47eec3248ce3b55e9cc56f8d718fc13dcb1a03755cdc0cda89e4dcb","other":"c0d6b4950771888e9770051d341f2071fecdb09e28c289e251668327eb8ccf66","up":true}]} \ No newline at end of file diff --git a/swarm/pss/testdata/snapshot_8.json b/swarm/pss/testdata/snapshot_8.json deleted file mode 100644 index 307afe5a137b..000000000000 --- a/swarm/pss/testdata/snapshot_8.json +++ /dev/null @@ -1 +0,0 @@ -{"nodes":[{"node":{"config":{"id":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","private_key":"e567b7d9c554e5102cdc99b6523bace02dbb8951415c8816d82ba2d2e97fa23b","name":"node01","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","private_key":"c7526db70acd02f36d3b201ef3e1d85e38c52bee6931453213dbc5edec4d0976","name":"node02","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","private_key":"61b5728f59bc43080c3b8eb0458fb30d7723e2747355b6dc980f35f3ed431199","name":"node03","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","private_key":"075b07c29ceac4ffa2a114afd67b21dfc438126bc169bf7c154be6d81d86ed38","name":"node04","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"05dacbe069e452448fb7bee09b8270a0218089a6d441c461fc45d338d2b59492","private_key":"4882fdd34676c2158f7bfc761bf824fcf693736a8df294cc7e79ef1848c7bae6","name":"node05","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"3451df808a9e122ebbc6306f159ae90ccd34e5ef3e0457c501f54ac08457238a","private_key":"0470652ac57af40a43bc67b1b49699219fc35a805da167244f505d27858334c7","name":"node06","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"159c0bdb3c1638e66de52ec0c476282eb5a7b1fcf763dc33b938c5381ef5a149","private_key":"2cbf6256e92736e1b54279b79addbb830a607a71488cdd3462a44fcaa68c018e","name":"node07","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}},{"node":{"config":{"id":"dfd47d54492eac09708641a7115b1fda328e2dd8f75ced9026212d3699722f94","private_key":"e659774a5ff4f76b021bf4884ad359eadeb8ff33e843a3f76fcf4a38b0d82b35","name":"node08","services":["pss","bzz"],"enable_msg_events":false,"port":0},"up":true}}],"conns":[{"one":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","other":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","up":true},{"one":"05dacbe069e452448fb7bee09b8270a0218089a6d441c461fc45d338d2b59492","other":"3451df808a9e122ebbc6306f159ae90ccd34e5ef3e0457c501f54ac08457238a","up":true},{"one":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","other":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","up":true},{"one":"159c0bdb3c1638e66de52ec0c476282eb5a7b1fcf763dc33b938c5381ef5a149","other":"dfd47d54492eac09708641a7115b1fda328e2dd8f75ced9026212d3699722f94","up":true},{"one":"dfd47d54492eac09708641a7115b1fda328e2dd8f75ced9026212d3699722f94","other":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","up":true},{"one":"3451df808a9e122ebbc6306f159ae90ccd34e5ef3e0457c501f54ac08457238a","other":"159c0bdb3c1638e66de52ec0c476282eb5a7b1fcf763dc33b938c5381ef5a149","up":true},{"one":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","other":"05dacbe069e452448fb7bee09b8270a0218089a6d441c461fc45d338d2b59492","up":true},{"one":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","other":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","up":true},{"one":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","other":"3451df808a9e122ebbc6306f159ae90ccd34e5ef3e0457c501f54ac08457238a","up":true},{"one":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","other":"159c0bdb3c1638e66de52ec0c476282eb5a7b1fcf763dc33b938c5381ef5a149","up":true},{"one":"05dacbe069e452448fb7bee09b8270a0218089a6d441c461fc45d338d2b59492","other":"159c0bdb3c1638e66de52ec0c476282eb5a7b1fcf763dc33b938c5381ef5a149","up":true},{"one":"159c0bdb3c1638e66de52ec0c476282eb5a7b1fcf763dc33b938c5381ef5a149","other":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","up":true},{"one":"3451df808a9e122ebbc6306f159ae90ccd34e5ef3e0457c501f54ac08457238a","other":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","up":true},{"one":"dfd47d54492eac09708641a7115b1fda328e2dd8f75ced9026212d3699722f94","other":"d7768334f79d626adb433f44b703a818555e3331056036ef3f8d1282586bf044","up":true},{"one":"8a1eb78ff13df318e7f8116dffee98cd7d9905650fa53f16766b754a63f387ac","other":"dfd47d54492eac09708641a7115b1fda328e2dd8f75ced9026212d3699722f94","up":true},{"one":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","other":"05dacbe069e452448fb7bee09b8270a0218089a6d441c461fc45d338d2b59492","up":true},{"one":"73d6ad4a75069dced660fa4cb98143ee5573df7cb15d9a295acf1655e9683384","other":"05dacbe069e452448fb7bee09b8270a0218089a6d441c461fc45d338d2b59492","up":true},{"one":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","other":"159c0bdb3c1638e66de52ec0c476282eb5a7b1fcf763dc33b938c5381ef5a149","up":true},{"one":"6e8da86abb894ab35044c8c455147225df96cab498da067a118f1fb9a417f9e3","other":"3451df808a9e122ebbc6306f159ae90ccd34e5ef3e0457c501f54ac08457238a","up":true}]} \ No newline at end of file diff --git a/swarm/pss/types.go b/swarm/pss/types.go deleted file mode 100644 index f42b62b182af..000000000000 --- a/swarm/pss/types.go +++ /dev/null @@ -1,217 +0,0 @@ -// Copyright 2018 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 pss - -import ( - "encoding/json" - "fmt" - "sync" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/swarm/storage" - whisper "github.com/nebulaai/nbai-node/whisper/whisperv5" -) - -const ( - defaultWhisperTTL = 6000 -) - -const ( - pssControlSym = 1 - pssControlRaw = 1 << 1 -) - -var ( - topicHashMutex = sync.Mutex{} - topicHashFunc = storage.MakeHashFunc("SHA256")() - rawTopic = Topic{} -) - -// Topic is the PSS encapsulation of the Whisper topic type -type Topic whisper.TopicType - -func (t *Topic) String() string { - return hexutil.Encode(t[:]) -} - -// MarshalJSON implements the json.Marshaler interface -func (t Topic) MarshalJSON() (b []byte, err error) { - return json.Marshal(t.String()) -} - -// MarshalJSON implements the json.Marshaler interface -func (t *Topic) UnmarshalJSON(input []byte) error { - topicbytes, err := hexutil.Decode(string(input[1 : len(input)-1])) - if err != nil { - return err - } - copy(t[:], topicbytes) - return nil -} - -// PssAddress is an alias for []byte. It represents a variable length address -type PssAddress []byte - -// MarshalJSON implements the json.Marshaler interface -func (a PssAddress) MarshalJSON() ([]byte, error) { - return json.Marshal(hexutil.Encode(a[:])) -} - -// UnmarshalJSON implements the json.Marshaler interface -func (a *PssAddress) UnmarshalJSON(input []byte) error { - b, err := hexutil.Decode(string(input[1 : len(input)-1])) - if err != nil { - return err - } - for _, bb := range b { - *a = append(*a, bb) - } - return nil -} - -// holds the digest of a message used for caching -type pssDigest [digestLength]byte - -// conceals bitwise operations on the control flags byte -type msgParams struct { - raw bool - sym bool -} - -func newMsgParamsFromBytes(paramBytes []byte) *msgParams { - if len(paramBytes) != 1 { - return nil - } - return &msgParams{ - raw: paramBytes[0]&pssControlRaw > 0, - sym: paramBytes[0]&pssControlSym > 0, - } -} - -func (m *msgParams) Bytes() (paramBytes []byte) { - var b byte - if m.raw { - b |= pssControlRaw - } - if m.sym { - b |= pssControlSym - } - paramBytes = append(paramBytes, b) - return paramBytes -} - -// PssMsg encapsulates messages transported over pss. -type PssMsg struct { - To []byte - Control []byte - Expire uint32 - Payload *whisper.Envelope -} - -func newPssMsg(param *msgParams) *PssMsg { - return &PssMsg{ - Control: param.Bytes(), - } -} - -// message is flagged as raw / external encryption -func (msg *PssMsg) isRaw() bool { - return msg.Control[0]&pssControlRaw > 0 -} - -// message is flagged as symmetrically encrypted -func (msg *PssMsg) isSym() bool { - return msg.Control[0]&pssControlSym > 0 -} - -// serializes the message for use in cache -func (msg *PssMsg) serialize() []byte { - rlpdata, _ := rlp.EncodeToBytes(struct { - To []byte - Payload *whisper.Envelope - }{ - To: msg.To, - Payload: msg.Payload, - }) - return rlpdata -} - -// String representation of PssMsg -func (msg *PssMsg) String() string { - return fmt.Sprintf("PssMsg: Recipient: %x", common.ToHex(msg.To)) -} - -// Signature for a message handler function for a PssMsg -// Implementations of this type are passed to Pss.Register together with a topic, -type HandlerFunc func(msg []byte, p *p2p.Peer, asymmetric bool, keyid string) error - -type handlerCaps struct { - raw bool - prox bool -} - -// Handler defines code to be executed upon reception of content. -type handler struct { - f HandlerFunc - caps *handlerCaps -} - -// NewHandler returns a new message handler -func NewHandler(f HandlerFunc) *handler { - return &handler{ - f: f, - caps: &handlerCaps{}, - } -} - -// WithRaw is a chainable method that allows raw messages to be handled. -func (h *handler) WithRaw() *handler { - h.caps.raw = true - return h -} - -// WithProxBin is a chainable method that allows sending messages with full addresses to neighbourhoods using the kademlia depth as reference -func (h *handler) WithProxBin() *handler { - h.caps.prox = true - return h -} - -// the stateStore handles saving and loading PSS peers and their corresponding keys -// it is currently unimplemented -type stateStore struct { - values map[string][]byte -} - -func (store *stateStore) Load(key string) ([]byte, error) { - return nil, nil -} - -func (store *stateStore) Save(key string, v []byte) error { - return nil -} - -// BytesToTopic hashes an arbitrary length byte slice and truncates it to the length of a topic, using only the first bytes of the digest -func BytesToTopic(b []byte) Topic { - topicHashMutex.Lock() - defer topicHashMutex.Unlock() - topicHashFunc.Reset() - topicHashFunc.Write(b) - return Topic(whisper.BytesToTopic(topicHashFunc.Sum(nil))) -} diff --git a/swarm/pss/writeup.md b/swarm/pss/writeup.md deleted file mode 100644 index af731fe7fdbb..000000000000 --- a/swarm/pss/writeup.md +++ /dev/null @@ -1,125 +0,0 @@ -## PSS tests failures explanation - -This document aims to explain the changes in https://github.com/ethersphere/go-ethereum/pull/126 and how those changes affect the pss_test.go TestNetwork tests. - -### Problem - -When running the TestNetwork test, execution sometimes: - -* deadlocks -* panics -* failures with wrong result, such as: - -``` -$ go test -v ./swarm/pss -cpu 4 -run TestNetwork -``` - -``` ---- FAIL: TestNetwork (68.13s) - --- FAIL: TestNetwork/3/10/4/sim (68.13s) - pss_test.go:697: 7 of 10 messages received - pss_test.go:700: 3 messages were not received -FAIL -``` - -Moreover execution almost always deadlocks with `sim` adapter, and `sock` adapter (when buffer is low), but is mostly stable with `exec` and `tcp` adapters. - -### Findings and Fixes - -#### 1. Addressing panics - -Panics were caused due to concurrent map read/writes and unsynchronised access to shared memory by multiple goroutines. This is visible when running the test with the `-race` flag. - -``` -go test -race -v ./swarm/pss -cpu 4 -run TestNetwork - - 1 ================== - 2 WARNING: DATA RACE - 3 Read at 0x00c424d456a0 by goroutine 1089: - 4 github.com/ethereum/go-ethereum/swarm/pss.(*Pss).forward.func1() - 5 /Users/nonsense/code/src/github.com/ethereum/go-ethereum/swarm/pss/pss.go:654 +0x44f - 6 github.com/ethereum/go-ethereum/swarm/network.(*Kademlia).eachConn.func1() - 7 /Users/nonsense/code/src/github.com/ethereum/go-ethereum/swarm/network/kademlia.go:350 +0xc9 - 8 github.com/ethereum/go-ethereum/pot.(*Pot).eachNeighbour.func1() - 9 /Users/nonsense/code/src/github.com/ethereum/go-ethereum/pot/pot.go:599 +0x59 - ... - - 28 - 29 Previous write at 0x00c424d456a0 by goroutine 829: - 30 github.com/ethereum/go-ethereum/swarm/pss.(*Pss).Run() - 31 /Users/nonsense/code/src/github.com/ethereum/go-ethereum/swarm/pss/pss.go:192 +0x16a - 32 github.com/ethereum/go-ethereum/swarm/pss.(*Pss).Run-fm() - 33 /Users/nonsense/code/src/github.com/ethereum/go-ethereum/swarm/pss/pss.go:185 +0x63 - 34 github.com/ethereum/go-ethereum/p2p.(*Peer).startProtocols.func1() - 35 /Users/nonsense/code/src/github.com/ethereum/go-ethereum/p2p/peer.go:347 +0x8b - ... -``` - -##### Current solution - -Adding a mutex around all shared data. - -#### 2. Failures with wrong result - -The validation phase of the TestNetwork test is done using an RPC subscription: - -``` - ... - triggerChecks := func(trigger chan enode.ID, id enode.ID, rpcclient *rpc.Client) error { - msgC := make(chan APIMsg) - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - sub, err := rpcclient.Subscribe(ctx, "pss", msgC, "receive", hextopic) - ... -``` - -By design the RPC uses a subscription buffer with a max length. When this length is reached, the subscription is dropped. The current config value is not suitable for stress tests. - -##### Current solution - -Increase the max length of the RPC subscription buffer. - -``` -const ( - // Subscriptions are removed when the subscriber cannot keep up. - // - // This can be worked around by supplying a channel with sufficiently sized buffer, - // but this can be inconvenient and hard to explain in the docs. Another issue with - // buffered channels is that the buffer is static even though it might not be needed - // most of the time. - // - // The approach taken here is to maintain a per-subscription linked list buffer - // shrinks on demand. If the buffer reaches the size below, the subscription is - // dropped. - maxClientSubscriptionBuffer = 20000 -) -``` - -#### 3. Deadlocks - -Deadlocks are triggered when using: -* `sim` adapter - synchronous, unbuffered channel -* `sock` adapter - asynchronous, buffered channel (when using a 1K buffer) - -No deadlocks were triggered when using: -* `tcp` adapter - asynchronous, buffered channel -* `exec` adapter - asynchronous, buffered channel - -Ultimately the deadlocks happen due to blocking `pp.Send()` call at: - - // attempt to send the message - err := pp.Send(msg) - if err != nil { - log.Debug(fmt.Sprintf("%v: failed forwarding: %v", sendMsg, err)) - return true - } - - `p2p` request handling is synchronous (as discussed at https://github.com/ethersphere/go-ethereum/issues/130), `pss` is also synchronous, therefore if two nodes happen to be processing a request, while at the same time waiting for response on `pp.Send(msg)`, deadlock occurs. - - `pp.Send(msg)` is only blocking when the underlying adapter is blocking (read `sim` or `sock`) or the buffer of the connection is full. - -##### Current solution - -Make no assumption on the undelying connection, and call `pp.Send` asynchronously in a go-routine. - -Alternatively, get rid of the `sim` and `sock` adapters, and use `tcp` adapter for testing. diff --git a/swarm/sctx/sctx.go b/swarm/sctx/sctx.go deleted file mode 100644 index fb7d35b0005b..000000000000 --- a/swarm/sctx/sctx.go +++ /dev/null @@ -1,20 +0,0 @@ -package sctx - -import "context" - -type ( - HTTPRequestIDKey struct{} - requestHostKey struct{} -) - -func SetHost(ctx context.Context, domain string) context.Context { - return context.WithValue(ctx, requestHostKey{}, domain) -} - -func GetHost(ctx context.Context) string { - v, ok := ctx.Value(requestHostKey{}).(string) - if ok { - return v - } - return "" -} diff --git a/swarm/services/swap/swap.go b/swarm/services/swap/swap.go deleted file mode 100644 index 300daf199b76..000000000000 --- a/swarm/services/swap/swap.go +++ /dev/null @@ -1,301 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package swap - -import ( - "context" - "crypto/ecdsa" - "errors" - "fmt" - "math/big" - "os" - "path/filepath" - "sync" - "time" - - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/contracts/chequebook" - "github.com/nebulaai/nbai-node/contracts/chequebook/contract" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/services/swap/swap" -) - -// SwAP Swarm Accounting Protocol with -// SWAP^2 Strategies of Withholding Automatic Payments -// SWAP^3 Accreditation: payment via credit SWAP -// using chequebook pkg for delayed payments -// default parameters - -var ( - autoCashInterval = 300 * time.Second // default interval for autocash - autoCashThreshold = big.NewInt(50000000000000) // threshold that triggers autocash (wei) - autoDepositInterval = 300 * time.Second // default interval for autocash - autoDepositThreshold = big.NewInt(50000000000000) // threshold that triggers autodeposit (wei) - autoDepositBuffer = big.NewInt(100000000000000) // buffer that is surplus for fork protection etc (wei) - buyAt = big.NewInt(20000000000) // maximum chunk price host is willing to pay (wei) - sellAt = big.NewInt(20000000000) // minimum chunk price host requires (wei) - payAt = 100 // threshold that triggers payment {request} (units) - dropAt = 10000 // threshold that triggers disconnect (units) -) - -const ( - chequebookDeployRetries = 5 - chequebookDeployDelay = 1 * time.Second // delay between retries -) - -// LocalProfile combines a PayProfile with *swap.Params -type LocalProfile struct { - *swap.Params - *PayProfile -} - -// RemoteProfile combines a PayProfile with *swap.Profile -type RemoteProfile struct { - *swap.Profile - *PayProfile -} - -// PayProfile is a container for relevant chequebook and beneficiary options -type PayProfile struct { - PublicKey string // check against signature of promise - Contract common.Address // address of chequebook contract - Beneficiary common.Address // recipient address for swarm sales revenue - privateKey *ecdsa.PrivateKey - publicKey *ecdsa.PublicKey - owner common.Address - chbook *chequebook.Chequebook - lock sync.RWMutex -} - -// NewDefaultSwapParams create params with default values -func NewDefaultSwapParams() *LocalProfile { - return &LocalProfile{ - PayProfile: &PayProfile{}, - Params: &swap.Params{ - Profile: &swap.Profile{ - BuyAt: buyAt, - SellAt: sellAt, - PayAt: uint(payAt), - DropAt: uint(dropAt), - }, - Strategy: &swap.Strategy{ - AutoCashInterval: autoCashInterval, - AutoCashThreshold: autoCashThreshold, - AutoDepositInterval: autoDepositInterval, - AutoDepositThreshold: autoDepositThreshold, - AutoDepositBuffer: autoDepositBuffer, - }, - }, - } -} - -// Init this can only finally be set after all config options (file, cmd line, env vars) -// have been evaluated -func (lp *LocalProfile) Init(contract common.Address, prvkey *ecdsa.PrivateKey) { - pubkey := &prvkey.PublicKey - - lp.PayProfile = &PayProfile{ - PublicKey: common.ToHex(crypto.FromECDSAPub(pubkey)), - Contract: contract, - Beneficiary: crypto.PubkeyToAddress(*pubkey), - privateKey: prvkey, - publicKey: pubkey, - owner: crypto.PubkeyToAddress(*pubkey), - } -} - -// NewSwap constructor, parameters -// * global chequebook, assume deployed service and -// * the balance is at buffer. -// swap.Add(n) called in netstore -// n > 0 called when sending chunks = receiving retrieve requests -// OR sending cheques. -// n < 0 called when receiving chunks = receiving delivery responses -// OR receiving cheques. -func NewSwap(localProfile *LocalProfile, remoteProfile *RemoteProfile, backend chequebook.Backend, proto swap.Protocol) (swapInstance *swap.Swap, err error) { - var ( - ctx = context.TODO() - ok bool - in *chequebook.Inbox - out *chequebook.Outbox - ) - - remotekey, err := crypto.UnmarshalPubkey(common.FromHex(remoteProfile.PublicKey)) - if err != nil { - return nil, errors.New("invalid remote public key") - } - - // check if remoteProfile chequebook is valid - // insolvent chequebooks suicide so will signal as invalid - // TODO: monitoring a chequebooks events - ok, err = chequebook.ValidateCode(ctx, backend, remoteProfile.Contract) - if !ok { - log.Info(fmt.Sprintf("invalid contract %v for peer %v: %v)", remoteProfile.Contract.Hex()[:8], proto, err)) - } else { - // remoteProfile contract valid, create inbox - in, err = chequebook.NewInbox(localProfile.privateKey, remoteProfile.Contract, localProfile.Beneficiary, remotekey, backend) - if err != nil { - log.Warn(fmt.Sprintf("unable to set up inbox for chequebook contract %v for peer %v: %v)", remoteProfile.Contract.Hex()[:8], proto, err)) - } - } - - // check if localProfile chequebook contract is valid - ok, err = chequebook.ValidateCode(ctx, backend, localProfile.Contract) - if !ok { - log.Warn(fmt.Sprintf("unable to set up outbox for peer %v: chequebook contract (owner: %v): %v)", proto, localProfile.owner.Hex(), err)) - } else { - out = chequebook.NewOutbox(localProfile.Chequebook(), remoteProfile.Beneficiary) - } - - pm := swap.Payment{ - In: in, - Out: out, - Buys: out != nil, - Sells: in != nil, - } - swapInstance, err = swap.New(localProfile.Params, pm, proto) - if err != nil { - return - } - // remoteProfile profile given (first) in handshake - swapInstance.SetRemote(remoteProfile.Profile) - var buy, sell string - if swapInstance.Buys { - buy = "purchase from peer enabled at " + remoteProfile.SellAt.String() + " wei/chunk" - } else { - buy = "purchase from peer disabled" - } - if swapInstance.Sells { - sell = "selling to peer enabled at " + localProfile.SellAt.String() + " wei/chunk" - } else { - sell = "selling to peer disabled" - } - log.Warn(fmt.Sprintf("SWAP arrangement with <%v>: %v; %v)", proto, buy, sell)) - - return -} - -// Chequebook get's chequebook from the localProfile -func (lp *LocalProfile) Chequebook() *chequebook.Chequebook { - defer lp.lock.Unlock() - lp.lock.Lock() - return lp.chbook -} - -// PrivateKey accessor -func (lp *LocalProfile) PrivateKey() *ecdsa.PrivateKey { - return lp.privateKey -} - -// func (self *LocalProfile) PublicKey() *ecdsa.PublicKey { -// return self.publicKey -// } - -// SetKey set's private and public key on localProfile -func (lp *LocalProfile) SetKey(prvkey *ecdsa.PrivateKey) { - lp.privateKey = prvkey - lp.publicKey = &prvkey.PublicKey -} - -// SetChequebook wraps the chequebook initialiser and sets up autoDeposit to cover spending. -func (lp *LocalProfile) SetChequebook(ctx context.Context, backend chequebook.Backend, path string) error { - lp.lock.Lock() - swapContract := lp.Contract - lp.lock.Unlock() - - valid, err := chequebook.ValidateCode(ctx, backend, swapContract) - if err != nil { - return err - } else if valid { - return lp.newChequebookFromContract(path, backend) - } - return lp.deployChequebook(ctx, backend, path) -} - -// deployChequebook deploys the localProfile Chequebook -func (lp *LocalProfile) deployChequebook(ctx context.Context, backend chequebook.Backend, path string) error { - opts := bind.NewKeyedTransactor(lp.privateKey) - opts.Value = lp.AutoDepositBuffer - opts.Context = ctx - - log.Info(fmt.Sprintf("Deploying new chequebook (owner: %v)", opts.From.Hex())) - address, err := deployChequebookLoop(opts, backend) - if err != nil { - log.Error(fmt.Sprintf("unable to deploy new chequebook: %v", err)) - return err - } - log.Info(fmt.Sprintf("new chequebook deployed at %v (owner: %v)", address.Hex(), opts.From.Hex())) - - // need to save config at this point - lp.lock.Lock() - lp.Contract = address - err = lp.newChequebookFromContract(path, backend) - lp.lock.Unlock() - if err != nil { - log.Warn(fmt.Sprintf("error initialising cheque book (owner: %v): %v", opts.From.Hex(), err)) - } - return err -} - -// deployChequebookLoop repeatedly tries to deploy a chequebook. -func deployChequebookLoop(opts *bind.TransactOpts, backend chequebook.Backend) (addr common.Address, err error) { - var tx *types.Transaction - for try := 0; try < chequebookDeployRetries; try++ { - if try > 0 { - time.Sleep(chequebookDeployDelay) - } - if _, tx, _, err = contract.DeployChequebook(opts, backend); err != nil { - log.Warn(fmt.Sprintf("can't send chequebook deploy tx (try %d): %v", try, err)) - continue - } - if addr, err = bind.WaitDeployed(opts.Context, backend, tx); err != nil { - log.Warn(fmt.Sprintf("chequebook deploy error (try %d): %v", try, err)) - continue - } - return addr, nil - } - return addr, err -} - -// newChequebookFromContract - initialise the chequebook from a persisted json file or create a new one -// caller holds the lock -func (lp *LocalProfile) newChequebookFromContract(path string, backend chequebook.Backend) error { - hexkey := common.Bytes2Hex(lp.Contract.Bytes()) - err := os.MkdirAll(filepath.Join(path, "chequebooks"), os.ModePerm) - if err != nil { - return fmt.Errorf("unable to create directory for chequebooks: %v", err) - } - - chbookpath := filepath.Join(path, "chequebooks", hexkey+".json") - lp.chbook, err = chequebook.LoadChequebook(chbookpath, lp.privateKey, backend, true) - - if err != nil { - lp.chbook, err = chequebook.NewChequebook(chbookpath, lp.Contract, lp.privateKey, backend) - if err != nil { - log.Warn(fmt.Sprintf("unable to initialise chequebook (owner: %v): %v", lp.owner.Hex(), err)) - return fmt.Errorf("unable to initialise chequebook (owner: %v): %v", lp.owner.Hex(), err) - } - } - - lp.chbook.AutoDeposit(lp.AutoDepositInterval, lp.AutoDepositThreshold, lp.AutoDepositBuffer) - log.Info(fmt.Sprintf("auto deposit ON for %v -> %v: interval = %v, threshold = %v, buffer = %v)", crypto.PubkeyToAddress(*(lp.publicKey)).Hex()[:8], lp.Contract.Hex()[:8], lp.AutoDepositInterval, lp.AutoDepositThreshold, lp.AutoDepositBuffer)) - - return nil -} diff --git a/swarm/services/swap/swap/swap.go b/swarm/services/swap/swap/swap.go deleted file mode 100644 index dff29809a6f2..000000000000 --- a/swarm/services/swap/swap/swap.go +++ /dev/null @@ -1,252 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package swap - -import ( - "fmt" - "math/big" - "sync" - "time" - - "github.com/nebulaai/nbai-node/swarm/log" -) - -// SwAP Swarm Accounting Protocol with -// Swift Automatic Payments -// a peer to peer micropayment system - -// Profile - public swap profile -// public parameters for SWAP, serializable config struct passed in handshake -type Profile struct { - BuyAt *big.Int // accepted max price for chunk - SellAt *big.Int // offered sale price for chunk - PayAt uint // threshold that triggers payment request - DropAt uint // threshold that triggers disconnect -} - -// Strategy encapsulates parameters relating to -// automatic deposit and automatic cashing -type Strategy struct { - AutoCashInterval time.Duration // default interval for autocash - AutoCashThreshold *big.Int // threshold that triggers autocash (wei) - AutoDepositInterval time.Duration // default interval for autocash - AutoDepositThreshold *big.Int // threshold that triggers autodeposit (wei) - AutoDepositBuffer *big.Int // buffer that is surplus for fork protection etc (wei) -} - -// Params extends the public profile with private parameters relating to -// automatic deposit and automatic cashing -type Params struct { - *Profile - *Strategy -} - -// Promise - 3rd party Provable Promise of Payment -// issued by outPayment -// serializable to send with Protocol -type Promise interface{} - -// Protocol interface for the peer protocol for testing or external alternative payment -type Protocol interface { - Pay(int, Promise) // units, payment proof - Drop() - String() string -} - -// OutPayment interface for the (delayed) outgoing payment system with auto-deposit -type OutPayment interface { - Issue(amount *big.Int) (promise Promise, err error) - AutoDeposit(interval time.Duration, threshold, buffer *big.Int) - Stop() -} - -// InPayment interface for the (delayed) incoming payment system with autocash -type InPayment interface { - Receive(promise Promise) (*big.Int, error) - AutoCash(cashInterval time.Duration, maxUncashed *big.Int) - Stop() -} - -// Swap is the swarm accounting protocol instance -// * pairwise accounting and payments -type Swap struct { - lock sync.Mutex // mutex for balance access - balance int // units of chunk/retrieval request - local *Params // local peer's swap parameters - remote *Profile // remote peer's swap profile - proto Protocol // peer communication protocol - Payment -} - -// Payment handlers -type Payment struct { - Out OutPayment // outgoing payment handler - In InPayment // incoming payment handler - Buys, Sells bool -} - -// New - swap constructor -func New(local *Params, pm Payment, proto Protocol) (swap *Swap, err error) { - - swap = &Swap{ - local: local, - Payment: pm, - proto: proto, - } - - swap.SetParams(local) - - return -} - -// SetRemote - entry point for setting remote swap profile (e.g from handshake or other message) -func (swap *Swap) SetRemote(remote *Profile) { - defer swap.lock.Unlock() - swap.lock.Lock() - - swap.remote = remote - if swap.Sells && (remote.BuyAt.Sign() <= 0 || swap.local.SellAt.Sign() <= 0 || remote.BuyAt.Cmp(swap.local.SellAt) < 0) { - swap.Out.Stop() - swap.Sells = false - } - if swap.Buys && (remote.SellAt.Sign() <= 0 || swap.local.BuyAt.Sign() <= 0 || swap.local.BuyAt.Cmp(swap.remote.SellAt) < 0) { - swap.In.Stop() - swap.Buys = false - } - - log.Debug(fmt.Sprintf("<%v> remote profile set: pay at: %v, drop at: %v, buy at: %v, sell at: %v", swap.proto, remote.PayAt, remote.DropAt, remote.BuyAt, remote.SellAt)) - -} - -// SetParams - to set strategy dynamically -func (swap *Swap) SetParams(local *Params) { - defer swap.lock.Unlock() - swap.lock.Lock() - swap.local = local - swap.setParams(local) -} - -// setParams - caller holds the lock -func (swap *Swap) setParams(local *Params) { - - if swap.Sells { - swap.In.AutoCash(local.AutoCashInterval, local.AutoCashThreshold) - log.Info(fmt.Sprintf("<%v> set autocash to every %v, max uncashed limit: %v", swap.proto, local.AutoCashInterval, local.AutoCashThreshold)) - } else { - log.Info(fmt.Sprintf("<%v> autocash off (not selling)", swap.proto)) - } - if swap.Buys { - swap.Out.AutoDeposit(local.AutoDepositInterval, local.AutoDepositThreshold, local.AutoDepositBuffer) - log.Info(fmt.Sprintf("<%v> set autodeposit to every %v, pay at: %v, buffer: %v", swap.proto, local.AutoDepositInterval, local.AutoDepositThreshold, local.AutoDepositBuffer)) - } else { - log.Info(fmt.Sprintf("<%v> autodeposit off (not buying)", swap.proto)) - } -} - -// Add (n) -// n > 0 called when promised/provided n units of service -// n < 0 called when used/requested n units of service -func (swap *Swap) Add(n int) error { - defer swap.lock.Unlock() - swap.lock.Lock() - swap.balance += n - if !swap.Sells && swap.balance > 0 { - log.Trace(fmt.Sprintf("<%v> remote peer cannot have debt (balance: %v)", swap.proto, swap.balance)) - swap.proto.Drop() - return fmt.Errorf("[SWAP] <%v> remote peer cannot have debt (balance: %v)", swap.proto, swap.balance) - } - if !swap.Buys && swap.balance < 0 { - log.Trace(fmt.Sprintf("<%v> we cannot have debt (balance: %v)", swap.proto, swap.balance)) - return fmt.Errorf("[SWAP] <%v> we cannot have debt (balance: %v)", swap.proto, swap.balance) - } - if swap.balance >= int(swap.local.DropAt) { - log.Trace(fmt.Sprintf("<%v> remote peer has too much debt (balance: %v, disconnect threshold: %v)", swap.proto, swap.balance, swap.local.DropAt)) - swap.proto.Drop() - return fmt.Errorf("[SWAP] <%v> remote peer has too much debt (balance: %v, disconnect threshold: %v)", swap.proto, swap.balance, swap.local.DropAt) - } else if swap.balance <= -int(swap.remote.PayAt) { - swap.send() - } - return nil -} - -// Balance accessor -func (swap *Swap) Balance() int { - defer swap.lock.Unlock() - swap.lock.Lock() - return swap.balance -} - -// send (units) is called when payment is due -// In case of insolvency no promise is issued and sent, safe against fraud -// No return value: no error = payment is opportunistic = hang in till dropped -func (swap *Swap) send() { - if swap.local.BuyAt != nil && swap.balance < 0 { - amount := big.NewInt(int64(-swap.balance)) - amount.Mul(amount, swap.remote.SellAt) - promise, err := swap.Out.Issue(amount) - if err != nil { - log.Warn(fmt.Sprintf("<%v> cannot issue cheque (amount: %v, channel: %v): %v", swap.proto, amount, swap.Out, err)) - } else { - log.Warn(fmt.Sprintf("<%v> cheque issued (amount: %v, channel: %v)", swap.proto, amount, swap.Out)) - swap.proto.Pay(-swap.balance, promise) - swap.balance = 0 - } - } -} - -// Receive (units, promise) is called by the protocol when a payment msg is received -// returns error if promise is invalid. -func (swap *Swap) Receive(units int, promise Promise) error { - if units <= 0 { - return fmt.Errorf("invalid units: %v <= 0", units) - } - - price := new(big.Int).SetInt64(int64(units)) - price.Mul(price, swap.local.SellAt) - - amount, err := swap.In.Receive(promise) - - if err != nil { - err = fmt.Errorf("invalid promise: %v", err) - } else if price.Cmp(amount) != 0 { - // verify amount = units * unit sale price - return fmt.Errorf("invalid amount: %v = %v * %v (units sent in msg * agreed sale unit price) != %v (signed in cheque)", price, units, swap.local.SellAt, amount) - } - if err != nil { - log.Trace(fmt.Sprintf("<%v> invalid promise (amount: %v, channel: %v): %v", swap.proto, amount, swap.In, err)) - return err - } - - // credit remote peer with units - swap.Add(-units) - log.Trace(fmt.Sprintf("<%v> received promise (amount: %v, channel: %v): %v", swap.proto, amount, swap.In, promise)) - - return nil -} - -// Stop causes autocash loop to terminate. -// Called after protocol handle loop terminates. -func (swap *Swap) Stop() { - defer swap.lock.Unlock() - swap.lock.Lock() - if swap.Buys { - swap.Out.Stop() - } - if swap.Sells { - swap.In.Stop() - } -} diff --git a/swarm/services/swap/swap/swap_test.go b/swarm/services/swap/swap/swap_test.go deleted file mode 100644 index 75389fbcfe29..000000000000 --- a/swarm/services/swap/swap/swap_test.go +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package swap - -import ( - "math/big" - "testing" - "time" - - "github.com/nebulaai/nbai-node/common" -) - -type testInPayment struct { - received []*testPromise - autocashInterval time.Duration - autocashLimit *big.Int -} - -type testPromise struct { - amount *big.Int -} - -func (test *testInPayment) Receive(promise Promise) (*big.Int, error) { - p := promise.(*testPromise) - test.received = append(test.received, p) - return p.amount, nil -} - -func (test *testInPayment) AutoCash(interval time.Duration, limit *big.Int) { - test.autocashInterval = interval - test.autocashLimit = limit -} - -func (test *testInPayment) Cash() (string, error) { return "", nil } - -func (test *testInPayment) Stop() {} - -type testOutPayment struct { - deposits []*big.Int - autodepositInterval time.Duration - autodepositThreshold *big.Int - autodepositBuffer *big.Int -} - -func (test *testOutPayment) Issue(amount *big.Int) (promise Promise, err error) { - return &testPromise{amount}, nil -} - -func (test *testOutPayment) Deposit(amount *big.Int) (string, error) { - test.deposits = append(test.deposits, amount) - return "", nil -} - -func (test *testOutPayment) AutoDeposit(interval time.Duration, threshold, buffer *big.Int) { - test.autodepositInterval = interval - test.autodepositThreshold = threshold - test.autodepositBuffer = buffer -} - -func (test *testOutPayment) Stop() {} - -type testProtocol struct { - drop bool - amounts []int - promises []*testPromise -} - -func (test *testProtocol) Drop() { - test.drop = true -} - -func (test *testProtocol) String() string { - return "" -} - -func (test *testProtocol) Pay(amount int, promise Promise) { - p := promise.(*testPromise) - test.promises = append(test.promises, p) - test.amounts = append(test.amounts, amount) -} - -func TestSwap(t *testing.T) { - - strategy := &Strategy{ - AutoCashInterval: 1 * time.Second, - AutoCashThreshold: big.NewInt(20), - AutoDepositInterval: 1 * time.Second, - AutoDepositThreshold: big.NewInt(20), - AutoDepositBuffer: big.NewInt(40), - } - - local := &Params{ - Profile: &Profile{ - PayAt: 5, - DropAt: 10, - BuyAt: common.Big3, - SellAt: common.Big2, - }, - Strategy: strategy, - } - - in := &testInPayment{} - out := &testOutPayment{} - proto := &testProtocol{} - - swap, _ := New(local, Payment{In: in, Out: out, Buys: true, Sells: true}, proto) - - if in.autocashInterval != strategy.AutoCashInterval { - t.Fatalf("autocash interval not properly set, expect %v, got %v", strategy.AutoCashInterval, in.autocashInterval) - } - if out.autodepositInterval != strategy.AutoDepositInterval { - t.Fatalf("autodeposit interval not properly set, expect %v, got %v", strategy.AutoDepositInterval, out.autodepositInterval) - } - - remote := &Profile{ - PayAt: 3, - DropAt: 10, - BuyAt: common.Big2, - SellAt: common.Big3, - } - swap.SetRemote(remote) - - swap.Add(9) - if proto.drop { - t.Fatalf("not expected peer to be dropped") - } - swap.Add(1) - if !proto.drop { - t.Fatalf("expected peer to be dropped") - } - if !proto.drop { - t.Fatalf("expected peer to be dropped") - } - proto.drop = false - - swap.Receive(10, &testPromise{big.NewInt(20)}) - if swap.balance != 0 { - t.Fatalf("expected zero balance, got %v", swap.balance) - } - - if len(proto.amounts) != 0 { - t.Fatalf("expected zero balance, got %v", swap.balance) - } - - swap.Add(-2) - if len(proto.amounts) > 0 { - t.Fatalf("expected no payments yet, got %v", proto.amounts) - } - - swap.Add(-1) - if len(proto.amounts) != 1 { - t.Fatalf("expected one payment, got %v", len(proto.amounts)) - } - - if proto.amounts[0] != 3 { - t.Fatalf("expected payment for %v units, got %v", proto.amounts[0], 3) - } - - exp := new(big.Int).Mul(big.NewInt(int64(proto.amounts[0])), remote.SellAt) - if proto.promises[0].amount.Cmp(exp) != 0 { - t.Fatalf("expected payment amount %v, got %v", exp, proto.promises[0].amount) - } - - swap.SetParams(&Params{ - Profile: &Profile{ - PayAt: 5, - DropAt: 10, - BuyAt: common.Big3, - SellAt: common.Big2, - }, - Strategy: &Strategy{ - AutoCashInterval: 2 * time.Second, - AutoCashThreshold: big.NewInt(40), - AutoDepositInterval: 2 * time.Second, - AutoDepositThreshold: big.NewInt(40), - AutoDepositBuffer: big.NewInt(60), - }, - }) - -} diff --git a/swarm/shed/db.go b/swarm/shed/db.go deleted file mode 100644 index d4e5d1b2313b..000000000000 --- a/swarm/shed/db.go +++ /dev/null @@ -1,329 +0,0 @@ -// Copyright 2018 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 shed provides a simple abstraction components to compose -// more complex operations on storage data organized in fields and indexes. -// -// Only type which holds logical information about swarm storage chunks data -// and metadata is Item. This part is not generalized mostly for -// performance reasons. -package shed - -import ( - "errors" - "fmt" - "strconv" - "strings" - "time" - - "github.com/ethereum/go-ethereum/metrics" - "github.com/ethereum/go-ethereum/swarm/log" - "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" -) - -const ( - openFileLimit = 128 // The limit for LevelDB OpenFilesCacheCapacity. - writePauseWarningThrottler = 1 * time.Minute -) - -// DB provides abstractions over LevelDB in order to -// implement complex structures using fields and ordered indexes. -// It provides a schema functionality to store fields and indexes -// information about naming and types. -type DB struct { - ldb *leveldb.DB - - compTimeMeter metrics.Meter // Meter for measuring the total time spent in database compaction - compReadMeter metrics.Meter // Meter for measuring the data read during compaction - compWriteMeter metrics.Meter // Meter for measuring the data written during compaction - writeDelayNMeter metrics.Meter // Meter for measuring the write delay number due to database compaction - writeDelayMeter metrics.Meter // Meter for measuring the write delay duration due to database compaction - diskReadMeter metrics.Meter // Meter for measuring the effective amount of data read - diskWriteMeter metrics.Meter // Meter for measuring the effective amount of data written - - quitChan chan chan error // Quit channel to stop the metrics collection before closing the database -} - -// NewDB constructs a new DB and validates the schema -// if it exists in database on the given path. -// metricsPrefix is used for metrics collection for the given DB. -func NewDB(path string, metricsPrefix string) (db *DB, err error) { - ldb, err := leveldb.OpenFile(path, &opt.Options{ - OpenFilesCacheCapacity: openFileLimit, - }) - if err != nil { - return nil, err - } - db = &DB{ - ldb: ldb, - } - - if _, err = db.getSchema(); err != nil { - if err == leveldb.ErrNotFound { - // save schema with initialized default fields - if err = db.putSchema(schema{ - Fields: make(map[string]fieldSpec), - Indexes: make(map[byte]indexSpec), - }); err != nil { - return nil, err - } - } else { - return nil, err - } - } - - // Configure meters for DB - db.configure(metricsPrefix) - - // Create a quit channel for the periodic metrics collector and run it - db.quitChan = make(chan chan error) - - go db.meter(10 * time.Second) - - return db, nil -} - -// Put wraps LevelDB Put method to increment metrics counter. -func (db *DB) Put(key []byte, value []byte) (err error) { - err = db.ldb.Put(key, value, nil) - if err != nil { - metrics.GetOrRegisterCounter("DB.putFail", nil).Inc(1) - return err - } - metrics.GetOrRegisterCounter("DB.put", nil).Inc(1) - return nil -} - -// Get wraps LevelDB Get method to increment metrics counter. -func (db *DB) Get(key []byte) (value []byte, err error) { - value, err = db.ldb.Get(key, nil) - if err != nil { - if err == leveldb.ErrNotFound { - metrics.GetOrRegisterCounter("DB.getNotFound", nil).Inc(1) - } else { - metrics.GetOrRegisterCounter("DB.getFail", nil).Inc(1) - } - return nil, err - } - metrics.GetOrRegisterCounter("DB.get", nil).Inc(1) - return value, nil -} - -// Delete wraps LevelDB Delete method to increment metrics counter. -func (db *DB) Delete(key []byte) (err error) { - err = db.ldb.Delete(key, nil) - if err != nil { - metrics.GetOrRegisterCounter("DB.deleteFail", nil).Inc(1) - return err - } - metrics.GetOrRegisterCounter("DB.delete", nil).Inc(1) - return nil -} - -// NewIterator wraps LevelDB NewIterator method to increment metrics counter. -func (db *DB) NewIterator() iterator.Iterator { - metrics.GetOrRegisterCounter("DB.newiterator", nil).Inc(1) - - return db.ldb.NewIterator(nil, nil) -} - -// WriteBatch wraps LevelDB Write method to increment metrics counter. -func (db *DB) WriteBatch(batch *leveldb.Batch) (err error) { - err = db.ldb.Write(batch, nil) - if err != nil { - metrics.GetOrRegisterCounter("DB.writebatchFail", nil).Inc(1) - return err - } - metrics.GetOrRegisterCounter("DB.writebatch", nil).Inc(1) - return nil -} - -// Close closes LevelDB database. -func (db *DB) Close() (err error) { - close(db.quitChan) - return db.ldb.Close() -} - -// Configure configures the database metrics collectors -func (db *DB) configure(prefix string) { - // Initialize all the metrics collector at the requested prefix - db.compTimeMeter = metrics.NewRegisteredMeter(prefix+"compact/time", nil) - db.compReadMeter = metrics.NewRegisteredMeter(prefix+"compact/input", nil) - db.compWriteMeter = metrics.NewRegisteredMeter(prefix+"compact/output", nil) - db.diskReadMeter = metrics.NewRegisteredMeter(prefix+"disk/read", nil) - db.diskWriteMeter = metrics.NewRegisteredMeter(prefix+"disk/write", nil) - db.writeDelayMeter = metrics.NewRegisteredMeter(prefix+"compact/writedelay/duration", nil) - db.writeDelayNMeter = metrics.NewRegisteredMeter(prefix+"compact/writedelay/counter", nil) -} - -func (db *DB) meter(refresh time.Duration) { - // Create the counters to store current and previous compaction values - compactions := make([][]float64, 2) - for i := 0; i < 2; i++ { - compactions[i] = make([]float64, 3) - } - // Create storage for iostats. - var iostats [2]float64 - - // Create storage and warning log tracer for write delay. - var ( - delaystats [2]int64 - lastWritePaused time.Time - ) - - var ( - errc chan error - merr error - ) - - // Iterate ad infinitum and collect the stats - for i := 1; errc == nil && merr == nil; i++ { - // Retrieve the database stats - stats, err := db.ldb.GetProperty("leveldb.stats") - if err != nil { - log.Error("Failed to read database stats", "err", err) - merr = err - continue - } - // Find the compaction table, skip the header - lines := strings.Split(stats, "\n") - for len(lines) > 0 && strings.TrimSpace(lines[0]) != "Compactions" { - lines = lines[1:] - } - if len(lines) <= 3 { - log.Error("Compaction table not found") - merr = errors.New("compaction table not found") - continue - } - lines = lines[3:] - - // Iterate over all the table rows, and accumulate the entries - for j := 0; j < len(compactions[i%2]); j++ { - compactions[i%2][j] = 0 - } - for _, line := range lines { - parts := strings.Split(line, "|") - if len(parts) != 6 { - break - } - for idx, counter := range parts[3:] { - value, err := strconv.ParseFloat(strings.TrimSpace(counter), 64) - if err != nil { - log.Error("Compaction entry parsing failed", "err", err) - merr = err - continue - } - compactions[i%2][idx] += value - } - } - // Update all the requested meters - if db.compTimeMeter != nil { - db.compTimeMeter.Mark(int64((compactions[i%2][0] - compactions[(i-1)%2][0]) * 1000 * 1000 * 1000)) - } - if db.compReadMeter != nil { - db.compReadMeter.Mark(int64((compactions[i%2][1] - compactions[(i-1)%2][1]) * 1024 * 1024)) - } - if db.compWriteMeter != nil { - db.compWriteMeter.Mark(int64((compactions[i%2][2] - compactions[(i-1)%2][2]) * 1024 * 1024)) - } - - // Retrieve the write delay statistic - writedelay, err := db.ldb.GetProperty("leveldb.writedelay") - if err != nil { - log.Error("Failed to read database write delay statistic", "err", err) - merr = err - continue - } - var ( - delayN int64 - delayDuration string - duration time.Duration - paused bool - ) - if n, err := fmt.Sscanf(writedelay, "DelayN:%d Delay:%s Paused:%t", &delayN, &delayDuration, &paused); n != 3 || err != nil { - log.Error("Write delay statistic not found") - merr = err - continue - } - duration, err = time.ParseDuration(delayDuration) - if err != nil { - log.Error("Failed to parse delay duration", "err", err) - merr = err - continue - } - if db.writeDelayNMeter != nil { - db.writeDelayNMeter.Mark(delayN - delaystats[0]) - } - if db.writeDelayMeter != nil { - db.writeDelayMeter.Mark(duration.Nanoseconds() - delaystats[1]) - } - // If a warning that db is performing compaction has been displayed, any subsequent - // warnings will be withheld for one minute not to overwhelm the user. - if paused && delayN-delaystats[0] == 0 && duration.Nanoseconds()-delaystats[1] == 0 && - time.Now().After(lastWritePaused.Add(writePauseWarningThrottler)) { - log.Warn("Database compacting, degraded performance") - lastWritePaused = time.Now() - } - delaystats[0], delaystats[1] = delayN, duration.Nanoseconds() - - // Retrieve the database iostats. - ioStats, err := db.ldb.GetProperty("leveldb.iostats") - if err != nil { - log.Error("Failed to read database iostats", "err", err) - merr = err - continue - } - var nRead, nWrite float64 - parts := strings.Split(ioStats, " ") - if len(parts) < 2 { - log.Error("Bad syntax of ioStats", "ioStats", ioStats) - merr = fmt.Errorf("bad syntax of ioStats %s", ioStats) - continue - } - if n, err := fmt.Sscanf(parts[0], "Read(MB):%f", &nRead); n != 1 || err != nil { - log.Error("Bad syntax of read entry", "entry", parts[0]) - merr = err - continue - } - if n, err := fmt.Sscanf(parts[1], "Write(MB):%f", &nWrite); n != 1 || err != nil { - log.Error("Bad syntax of write entry", "entry", parts[1]) - merr = err - continue - } - if db.diskReadMeter != nil { - db.diskReadMeter.Mark(int64((nRead - iostats[0]) * 1024 * 1024)) - } - if db.diskWriteMeter != nil { - db.diskWriteMeter.Mark(int64((nWrite - iostats[1]) * 1024 * 1024)) - } - iostats[0], iostats[1] = nRead, nWrite - - // Sleep a bit, then repeat the stats collection - select { - case errc = <-db.quitChan: - // Quit requesting, stop hammering the database - case <-time.After(refresh): - // Timeout, gather a new set of stats - } - } - - if errc == nil { - errc = <-db.quitChan - } - errc <- merr -} diff --git a/swarm/shed/db_test.go b/swarm/shed/db_test.go deleted file mode 100644 index 65fdac4a6186..000000000000 --- a/swarm/shed/db_test.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2018 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 shed - -import ( - "io/ioutil" - "os" - "testing" -) - -// TestNewDB constructs a new DB -// and validates if the schema is initialized properly. -func TestNewDB(t *testing.T) { - db, cleanupFunc := newTestDB(t) - defer cleanupFunc() - - s, err := db.getSchema() - if err != nil { - t.Fatal(err) - } - if s.Fields == nil { - t.Error("schema fields are empty") - } - if len(s.Fields) != 0 { - t.Errorf("got schema fields length %v, want %v", len(s.Fields), 0) - } - if s.Indexes == nil { - t.Error("schema indexes are empty") - } - if len(s.Indexes) != 0 { - t.Errorf("got schema indexes length %v, want %v", len(s.Indexes), 0) - } -} - -// TestDB_persistence creates one DB, saves a field and closes that DB. -// Then, it constructs another DB and trues to retrieve the saved value. -func TestDB_persistence(t *testing.T) { - dir, err := ioutil.TempDir("", "shed-test-persistence") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - - db, err := NewDB(dir, "") - if err != nil { - t.Fatal(err) - } - stringField, err := db.NewStringField("preserve-me") - if err != nil { - t.Fatal(err) - } - want := "persistent value" - err = stringField.Put(want) - if err != nil { - t.Fatal(err) - } - err = db.Close() - if err != nil { - t.Fatal(err) - } - - db2, err := NewDB(dir, "") - if err != nil { - t.Fatal(err) - } - stringField2, err := db2.NewStringField("preserve-me") - if err != nil { - t.Fatal(err) - } - got, err := stringField2.Get() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got string %q, want %q", got, want) - } -} - -// newTestDB is a helper function that constructs a -// temporary database and returns a cleanup function that must -// be called to remove the data. -func newTestDB(t *testing.T) (db *DB, cleanupFunc func()) { - t.Helper() - - dir, err := ioutil.TempDir("", "shed-test") - if err != nil { - t.Fatal(err) - } - cleanupFunc = func() { os.RemoveAll(dir) } - db, err = NewDB(dir, "") - if err != nil { - cleanupFunc() - t.Fatal(err) - } - return db, cleanupFunc -} diff --git a/swarm/shed/example_store_test.go b/swarm/shed/example_store_test.go deleted file mode 100644 index 9a83855e70c1..000000000000 --- a/swarm/shed/example_store_test.go +++ /dev/null @@ -1,332 +0,0 @@ -// Copyright 2018 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 shed_test - -import ( - "bytes" - "context" - "encoding/binary" - "fmt" - "io/ioutil" - "log" - "os" - "time" - - "github.com/ethereum/go-ethereum/swarm/shed" - "github.com/ethereum/go-ethereum/swarm/storage" - "github.com/syndtr/goleveldb/leveldb" -) - -// Store holds fields and indexes (including their encoding functions) -// and defines operations on them by composing data from them. -// It implements storage.ChunkStore interface. -// It is just an example without any support for parallel operations -// or real world implementation. -type Store struct { - db *shed.DB - - // fields and indexes - schemaName shed.StringField - sizeCounter shed.Uint64Field - accessCounter shed.Uint64Field - retrievalIndex shed.Index - accessIndex shed.Index - gcIndex shed.Index -} - -// New returns new Store. All fields and indexes are initialized -// and possible conflicts with schema from existing database is checked -// automatically. -func New(path string) (s *Store, err error) { - db, err := shed.NewDB(path, "") - if err != nil { - return nil, err - } - s = &Store{ - db: db, - } - // Identify current storage schema by arbitrary name. - s.schemaName, err = db.NewStringField("schema-name") - if err != nil { - return nil, err - } - // Global ever incrementing index of chunk accesses. - s.accessCounter, err = db.NewUint64Field("access-counter") - if err != nil { - return nil, err - } - // Index storing actual chunk address, data and store timestamp. - s.retrievalIndex, err = db.NewIndex("Address->StoreTimestamp|Data", shed.IndexFuncs{ - EncodeKey: func(fields shed.Item) (key []byte, err error) { - return fields.Address, nil - }, - DecodeKey: func(key []byte) (e shed.Item, err error) { - e.Address = key - return e, nil - }, - EncodeValue: func(fields shed.Item) (value []byte, err error) { - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, uint64(fields.StoreTimestamp)) - value = append(b, fields.Data...) - return value, nil - }, - DecodeValue: func(keyItem shed.Item, value []byte) (e shed.Item, err error) { - e.StoreTimestamp = int64(binary.BigEndian.Uint64(value[:8])) - e.Data = value[8:] - return e, nil - }, - }) - if err != nil { - return nil, err - } - // Index storing access timestamp for a particular address. - // It is needed in order to update gc index keys for iteration order. - s.accessIndex, err = db.NewIndex("Address->AccessTimestamp", shed.IndexFuncs{ - EncodeKey: func(fields shed.Item) (key []byte, err error) { - return fields.Address, nil - }, - DecodeKey: func(key []byte) (e shed.Item, err error) { - e.Address = key - return e, nil - }, - EncodeValue: func(fields shed.Item) (value []byte, err error) { - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, uint64(fields.AccessTimestamp)) - return b, nil - }, - DecodeValue: func(keyItem shed.Item, value []byte) (e shed.Item, err error) { - e.AccessTimestamp = int64(binary.BigEndian.Uint64(value)) - return e, nil - }, - }) - if err != nil { - return nil, err - } - // Index with keys ordered by access timestamp for garbage collection prioritization. - s.gcIndex, err = db.NewIndex("AccessTimestamp|StoredTimestamp|Address->nil", shed.IndexFuncs{ - EncodeKey: func(fields shed.Item) (key []byte, err error) { - b := make([]byte, 16, 16+len(fields.Address)) - binary.BigEndian.PutUint64(b[:8], uint64(fields.AccessTimestamp)) - binary.BigEndian.PutUint64(b[8:16], uint64(fields.StoreTimestamp)) - key = append(b, fields.Address...) - return key, nil - }, - DecodeKey: func(key []byte) (e shed.Item, err error) { - e.AccessTimestamp = int64(binary.BigEndian.Uint64(key[:8])) - e.StoreTimestamp = int64(binary.BigEndian.Uint64(key[8:16])) - e.Address = key[16:] - return e, nil - }, - EncodeValue: func(fields shed.Item) (value []byte, err error) { - return nil, nil - }, - DecodeValue: func(keyItem shed.Item, value []byte) (e shed.Item, err error) { - return e, nil - }, - }) - if err != nil { - return nil, err - } - return s, nil -} - -// Put stores the chunk and sets it store timestamp. -func (s *Store) Put(_ context.Context, ch storage.Chunk) (err error) { - return s.retrievalIndex.Put(shed.Item{ - Address: ch.Address(), - Data: ch.Data(), - StoreTimestamp: time.Now().UTC().UnixNano(), - }) -} - -// Get retrieves a chunk with the provided address. -// It updates access and gc indexes by removing the previous -// items from them and adding new items as keys of index entries -// are changed. -func (s *Store) Get(_ context.Context, addr storage.Address) (c storage.Chunk, err error) { - batch := new(leveldb.Batch) - - // Get the chunk data and storage timestamp. - item, err := s.retrievalIndex.Get(shed.Item{ - Address: addr, - }) - if err != nil { - if err == leveldb.ErrNotFound { - return nil, storage.ErrChunkNotFound - } - return nil, err - } - - // Get the chunk access timestamp. - accessItem, err := s.accessIndex.Get(shed.Item{ - Address: addr, - }) - switch err { - case nil: - // Remove gc index entry if access timestamp is found. - err = s.gcIndex.DeleteInBatch(batch, shed.Item{ - Address: item.Address, - StoreTimestamp: accessItem.AccessTimestamp, - AccessTimestamp: item.StoreTimestamp, - }) - if err != nil { - return nil, err - } - case leveldb.ErrNotFound: - // Access timestamp is not found. Do not do anything. - // This is the firs get request. - default: - return nil, err - } - - // Specify new access timestamp - accessTimestamp := time.Now().UTC().UnixNano() - - // Put new access timestamp in access index. - err = s.accessIndex.PutInBatch(batch, shed.Item{ - Address: addr, - AccessTimestamp: accessTimestamp, - }) - if err != nil { - return nil, err - } - - // Put new access timestamp in gc index. - err = s.gcIndex.PutInBatch(batch, shed.Item{ - Address: item.Address, - AccessTimestamp: accessTimestamp, - StoreTimestamp: item.StoreTimestamp, - }) - if err != nil { - return nil, err - } - - // Increment access counter. - // Currently this information is not used anywhere. - _, err = s.accessCounter.IncInBatch(batch) - if err != nil { - return nil, err - } - - // Write the batch. - err = s.db.WriteBatch(batch) - if err != nil { - return nil, err - } - - // Return the chunk. - return storage.NewChunk(item.Address, item.Data), nil -} - -// CollectGarbage is an example of index iteration. -// It provides no reliable garbage collection functionality. -func (s *Store) CollectGarbage() (err error) { - const maxTrashSize = 100 - maxRounds := 10 // arbitrary number, needs to be calculated - - // Run a few gc rounds. - for roundCount := 0; roundCount < maxRounds; roundCount++ { - var garbageCount int - // New batch for a new cg round. - trash := new(leveldb.Batch) - // Iterate through all index items and break when needed. - err = s.gcIndex.Iterate(func(item shed.Item) (stop bool, err error) { - // Remove the chunk. - err = s.retrievalIndex.DeleteInBatch(trash, item) - if err != nil { - return false, err - } - // Remove the element in gc index. - err = s.gcIndex.DeleteInBatch(trash, item) - if err != nil { - return false, err - } - // Remove the relation in access index. - err = s.accessIndex.DeleteInBatch(trash, item) - if err != nil { - return false, err - } - garbageCount++ - if garbageCount >= maxTrashSize { - return true, nil - } - return false, nil - }, nil) - if err != nil { - return err - } - if garbageCount == 0 { - return nil - } - err = s.db.WriteBatch(trash) - if err != nil { - return err - } - } - return nil -} - -// GetSchema is an example of retrieveing the most simple -// string from a database field. -func (s *Store) GetSchema() (name string, err error) { - name, err = s.schemaName.Get() - if err == leveldb.ErrNotFound { - return "", nil - } - return name, err -} - -// GetSchema is an example of storing the most simple -// string in a database field. -func (s *Store) PutSchema(name string) (err error) { - return s.schemaName.Put(name) -} - -// Close closes the underlying database. -func (s *Store) Close() error { - return s.db.Close() -} - -// Example_store constructs a simple storage implementation using shed package. -func Example_store() { - dir, err := ioutil.TempDir("", "ephemeral") - if err != nil { - log.Fatal(err) - } - defer os.RemoveAll(dir) - - s, err := New(dir) - if err != nil { - log.Fatal(err) - } - defer s.Close() - - ch := storage.GenerateRandomChunk(1024) - err = s.Put(context.Background(), ch) - if err != nil { - log.Fatal(err) - } - - got, err := s.Get(context.Background(), ch.Address()) - if err != nil { - log.Fatal(err) - } - - fmt.Println(bytes.Equal(got.Data(), ch.Data())) - - //Output: true -} diff --git a/swarm/shed/field_string.go b/swarm/shed/field_string.go deleted file mode 100644 index a7e8f0c75474..000000000000 --- a/swarm/shed/field_string.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2018 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 shed - -import ( - "github.com/syndtr/goleveldb/leveldb" -) - -// StringField is the most simple field implementation -// that stores an arbitrary string under a specific LevelDB key. -type StringField struct { - db *DB - key []byte -} - -// NewStringField retruns a new Instance of StringField. -// It validates its name and type against the database schema. -func (db *DB) NewStringField(name string) (f StringField, err error) { - key, err := db.schemaFieldKey(name, "string") - if err != nil { - return f, err - } - return StringField{ - db: db, - key: key, - }, nil -} - -// Get returns a string value from database. -// If the value is not found, an empty string is returned -// an no error. -func (f StringField) Get() (val string, err error) { - b, err := f.db.Get(f.key) - if err != nil { - if err == leveldb.ErrNotFound { - return "", nil - } - return "", err - } - return string(b), nil -} - -// Put stores a string in the database. -func (f StringField) Put(val string) (err error) { - return f.db.Put(f.key, []byte(val)) -} - -// PutInBatch stores a string in a batch that can be -// saved later in database. -func (f StringField) PutInBatch(batch *leveldb.Batch, val string) { - batch.Put(f.key, []byte(val)) -} diff --git a/swarm/shed/field_string_test.go b/swarm/shed/field_string_test.go deleted file mode 100644 index 4215075bca64..000000000000 --- a/swarm/shed/field_string_test.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2018 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 shed - -import ( - "testing" - - "github.com/syndtr/goleveldb/leveldb" -) - -// TestStringField validates put and get operations -// of the StringField. -func TestStringField(t *testing.T) { - db, cleanupFunc := newTestDB(t) - defer cleanupFunc() - - simpleString, err := db.NewStringField("simple-string") - if err != nil { - t.Fatal(err) - } - - t.Run("get empty", func(t *testing.T) { - got, err := simpleString.Get() - if err != nil { - t.Fatal(err) - } - want := "" - if got != want { - t.Errorf("got string %q, want %q", got, want) - } - }) - - t.Run("put", func(t *testing.T) { - want := "simple string value" - err = simpleString.Put(want) - if err != nil { - t.Fatal(err) - } - got, err := simpleString.Get() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got string %q, want %q", got, want) - } - - t.Run("overwrite", func(t *testing.T) { - want := "overwritten string value" - err = simpleString.Put(want) - if err != nil { - t.Fatal(err) - } - got, err := simpleString.Get() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got string %q, want %q", got, want) - } - }) - }) - - t.Run("put in batch", func(t *testing.T) { - batch := new(leveldb.Batch) - want := "simple string batch value" - simpleString.PutInBatch(batch, want) - err = db.WriteBatch(batch) - if err != nil { - t.Fatal(err) - } - got, err := simpleString.Get() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got string %q, want %q", got, want) - } - - t.Run("overwrite", func(t *testing.T) { - batch := new(leveldb.Batch) - want := "overwritten string batch value" - simpleString.PutInBatch(batch, want) - err = db.WriteBatch(batch) - if err != nil { - t.Fatal(err) - } - got, err := simpleString.Get() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got string %q, want %q", got, want) - } - }) - }) -} diff --git a/swarm/shed/field_struct.go b/swarm/shed/field_struct.go deleted file mode 100644 index 90daee7fc4f7..000000000000 --- a/swarm/shed/field_struct.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2018 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 shed - -import ( - "github.com/ethereum/go-ethereum/rlp" - "github.com/syndtr/goleveldb/leveldb" -) - -// StructField is a helper to store complex structure by -// encoding it in RLP format. -type StructField struct { - db *DB - key []byte -} - -// NewStructField returns a new StructField. -// It validates its name and type against the database schema. -func (db *DB) NewStructField(name string) (f StructField, err error) { - key, err := db.schemaFieldKey(name, "struct-rlp") - if err != nil { - return f, err - } - return StructField{ - db: db, - key: key, - }, nil -} - -// Get unmarshals data from the database to a provided val. -// If the data is not found leveldb.ErrNotFound is returned. -func (f StructField) Get(val interface{}) (err error) { - b, err := f.db.Get(f.key) - if err != nil { - return err - } - return rlp.DecodeBytes(b, val) -} - -// Put marshals provided val and saves it to the database. -func (f StructField) Put(val interface{}) (err error) { - b, err := rlp.EncodeToBytes(val) - if err != nil { - return err - } - return f.db.Put(f.key, b) -} - -// PutInBatch marshals provided val and puts it into the batch. -func (f StructField) PutInBatch(batch *leveldb.Batch, val interface{}) (err error) { - b, err := rlp.EncodeToBytes(val) - if err != nil { - return err - } - batch.Put(f.key, b) - return nil -} diff --git a/swarm/shed/field_struct_test.go b/swarm/shed/field_struct_test.go deleted file mode 100644 index cc0be01863fc..000000000000 --- a/swarm/shed/field_struct_test.go +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright 2018 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 shed - -import ( - "testing" - - "github.com/syndtr/goleveldb/leveldb" -) - -// TestStructField validates put and get operations -// of the StructField. -func TestStructField(t *testing.T) { - db, cleanupFunc := newTestDB(t) - defer cleanupFunc() - - complexField, err := db.NewStructField("complex-field") - if err != nil { - t.Fatal(err) - } - - type complexStructure struct { - A string - } - - t.Run("get empty", func(t *testing.T) { - var s complexStructure - err := complexField.Get(&s) - if err != leveldb.ErrNotFound { - t.Fatalf("got error %v, want %v", err, leveldb.ErrNotFound) - } - want := "" - if s.A != want { - t.Errorf("got string %q, want %q", s.A, want) - } - }) - - t.Run("put", func(t *testing.T) { - want := complexStructure{ - A: "simple string value", - } - err = complexField.Put(want) - if err != nil { - t.Fatal(err) - } - var got complexStructure - err = complexField.Get(&got) - if err != nil { - t.Fatal(err) - } - if got.A != want.A { - t.Errorf("got string %q, want %q", got.A, want.A) - } - - t.Run("overwrite", func(t *testing.T) { - want := complexStructure{ - A: "overwritten string value", - } - err = complexField.Put(want) - if err != nil { - t.Fatal(err) - } - var got complexStructure - err = complexField.Get(&got) - if err != nil { - t.Fatal(err) - } - if got.A != want.A { - t.Errorf("got string %q, want %q", got.A, want.A) - } - }) - }) - - t.Run("put in batch", func(t *testing.T) { - batch := new(leveldb.Batch) - want := complexStructure{ - A: "simple string batch value", - } - complexField.PutInBatch(batch, want) - err = db.WriteBatch(batch) - if err != nil { - t.Fatal(err) - } - var got complexStructure - err := complexField.Get(&got) - if err != nil { - t.Fatal(err) - } - if got.A != want.A { - t.Errorf("got string %q, want %q", got, want) - } - - t.Run("overwrite", func(t *testing.T) { - batch := new(leveldb.Batch) - want := complexStructure{ - A: "overwritten string batch value", - } - complexField.PutInBatch(batch, want) - err = db.WriteBatch(batch) - if err != nil { - t.Fatal(err) - } - var got complexStructure - err := complexField.Get(&got) - if err != nil { - t.Fatal(err) - } - if got.A != want.A { - t.Errorf("got string %q, want %q", got, want) - } - }) - }) -} diff --git a/swarm/shed/field_uint64.go b/swarm/shed/field_uint64.go deleted file mode 100644 index 0417583ac315..000000000000 --- a/swarm/shed/field_uint64.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2018 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 shed - -import ( - "encoding/binary" - - "github.com/syndtr/goleveldb/leveldb" -) - -// Uint64Field provides a way to have a simple counter in the database. -// It transparently encodes uint64 type value to bytes. -type Uint64Field struct { - db *DB - key []byte -} - -// NewUint64Field returns a new Uint64Field. -// It validates its name and type against the database schema. -func (db *DB) NewUint64Field(name string) (f Uint64Field, err error) { - key, err := db.schemaFieldKey(name, "uint64") - if err != nil { - return f, err - } - return Uint64Field{ - db: db, - key: key, - }, nil -} - -// Get retrieves a uint64 value from the database. -// If the value is not found in the database a 0 value -// is returned and no error. -func (f Uint64Field) Get() (val uint64, err error) { - b, err := f.db.Get(f.key) - if err != nil { - if err == leveldb.ErrNotFound { - return 0, nil - } - return 0, err - } - return binary.BigEndian.Uint64(b), nil -} - -// Put encodes uin64 value and stores it in the database. -func (f Uint64Field) Put(val uint64) (err error) { - return f.db.Put(f.key, encodeUint64(val)) -} - -// PutInBatch stores a uint64 value in a batch -// that can be saved later in the database. -func (f Uint64Field) PutInBatch(batch *leveldb.Batch, val uint64) { - batch.Put(f.key, encodeUint64(val)) -} - -// Inc increments a uint64 value in the database. -// This operation is not goroutine save. -func (f Uint64Field) Inc() (val uint64, err error) { - val, err = f.Get() - if err != nil { - if err == leveldb.ErrNotFound { - val = 0 - } else { - return 0, err - } - } - val++ - return val, f.Put(val) -} - -// IncInBatch increments a uint64 value in the batch -// by retreiving a value from the database, not the same batch. -// This operation is not goroutine save. -func (f Uint64Field) IncInBatch(batch *leveldb.Batch) (val uint64, err error) { - val, err = f.Get() - if err != nil { - if err == leveldb.ErrNotFound { - val = 0 - } else { - return 0, err - } - } - val++ - f.PutInBatch(batch, val) - return val, nil -} - -// Dec decrements a uint64 value in the database. -// This operation is not goroutine save. -// The field is protected from overflow to a negative value. -func (f Uint64Field) Dec() (val uint64, err error) { - val, err = f.Get() - if err != nil { - if err == leveldb.ErrNotFound { - val = 0 - } else { - return 0, err - } - } - if val != 0 { - val-- - } - return val, f.Put(val) -} - -// DecInBatch decrements a uint64 value in the batch -// by retreiving a value from the database, not the same batch. -// This operation is not goroutine save. -// The field is protected from overflow to a negative value. -func (f Uint64Field) DecInBatch(batch *leveldb.Batch) (val uint64, err error) { - val, err = f.Get() - if err != nil { - if err == leveldb.ErrNotFound { - val = 0 - } else { - return 0, err - } - } - if val != 0 { - val-- - } - f.PutInBatch(batch, val) - return val, nil -} - -// encode transforms uint64 to 8 byte long -// slice in big endian encoding. -func encodeUint64(val uint64) (b []byte) { - b = make([]byte, 8) - binary.BigEndian.PutUint64(b, val) - return b -} diff --git a/swarm/shed/field_uint64_test.go b/swarm/shed/field_uint64_test.go deleted file mode 100644 index 9462b56dd184..000000000000 --- a/swarm/shed/field_uint64_test.go +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright 2018 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 shed - -import ( - "testing" - - "github.com/syndtr/goleveldb/leveldb" -) - -// TestUint64Field validates put and get operations -// of the Uint64Field. -func TestUint64Field(t *testing.T) { - db, cleanupFunc := newTestDB(t) - defer cleanupFunc() - - counter, err := db.NewUint64Field("counter") - if err != nil { - t.Fatal(err) - } - - t.Run("get empty", func(t *testing.T) { - got, err := counter.Get() - if err != nil { - t.Fatal(err) - } - var want uint64 - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } - }) - - t.Run("put", func(t *testing.T) { - var want uint64 = 42 - err = counter.Put(want) - if err != nil { - t.Fatal(err) - } - got, err := counter.Get() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } - - t.Run("overwrite", func(t *testing.T) { - var want uint64 = 84 - err = counter.Put(want) - if err != nil { - t.Fatal(err) - } - got, err := counter.Get() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } - }) - }) - - t.Run("put in batch", func(t *testing.T) { - batch := new(leveldb.Batch) - var want uint64 = 42 - counter.PutInBatch(batch, want) - err = db.WriteBatch(batch) - if err != nil { - t.Fatal(err) - } - got, err := counter.Get() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } - - t.Run("overwrite", func(t *testing.T) { - batch := new(leveldb.Batch) - var want uint64 = 84 - counter.PutInBatch(batch, want) - err = db.WriteBatch(batch) - if err != nil { - t.Fatal(err) - } - got, err := counter.Get() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } - }) - }) -} - -// TestUint64Field_Inc validates Inc operation -// of the Uint64Field. -func TestUint64Field_Inc(t *testing.T) { - db, cleanupFunc := newTestDB(t) - defer cleanupFunc() - - counter, err := db.NewUint64Field("counter") - if err != nil { - t.Fatal(err) - } - - var want uint64 = 1 - got, err := counter.Inc() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } - - want = 2 - got, err = counter.Inc() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } -} - -// TestUint64Field_IncInBatch validates IncInBatch operation -// of the Uint64Field. -func TestUint64Field_IncInBatch(t *testing.T) { - db, cleanupFunc := newTestDB(t) - defer cleanupFunc() - - counter, err := db.NewUint64Field("counter") - if err != nil { - t.Fatal(err) - } - - batch := new(leveldb.Batch) - var want uint64 = 1 - got, err := counter.IncInBatch(batch) - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } - err = db.WriteBatch(batch) - if err != nil { - t.Fatal(err) - } - got, err = counter.Get() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } - - batch2 := new(leveldb.Batch) - want = 2 - got, err = counter.IncInBatch(batch2) - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } - err = db.WriteBatch(batch2) - if err != nil { - t.Fatal(err) - } - got, err = counter.Get() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } -} - -// TestUint64Field_Dec validates Dec operation -// of the Uint64Field. -func TestUint64Field_Dec(t *testing.T) { - db, cleanupFunc := newTestDB(t) - defer cleanupFunc() - - counter, err := db.NewUint64Field("counter") - if err != nil { - t.Fatal(err) - } - - // test overflow protection - var want uint64 - got, err := counter.Dec() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } - - want = 32 - err = counter.Put(want) - if err != nil { - t.Fatal(err) - } - - want = 31 - got, err = counter.Dec() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } -} - -// TestUint64Field_DecInBatch validates DecInBatch operation -// of the Uint64Field. -func TestUint64Field_DecInBatch(t *testing.T) { - db, cleanupFunc := newTestDB(t) - defer cleanupFunc() - - counter, err := db.NewUint64Field("counter") - if err != nil { - t.Fatal(err) - } - - batch := new(leveldb.Batch) - var want uint64 - got, err := counter.DecInBatch(batch) - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } - err = db.WriteBatch(batch) - if err != nil { - t.Fatal(err) - } - got, err = counter.Get() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } - - batch2 := new(leveldb.Batch) - want = 42 - counter.PutInBatch(batch2, want) - err = db.WriteBatch(batch2) - if err != nil { - t.Fatal(err) - } - got, err = counter.Get() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } - - batch3 := new(leveldb.Batch) - want = 41 - got, err = counter.DecInBatch(batch3) - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } - err = db.WriteBatch(batch3) - if err != nil { - t.Fatal(err) - } - got, err = counter.Get() - if err != nil { - t.Fatal(err) - } - if got != want { - t.Errorf("got uint64 %v, want %v", got, want) - } -} diff --git a/swarm/shed/index.go b/swarm/shed/index.go deleted file mode 100644 index df88b1b62dc3..000000000000 --- a/swarm/shed/index.go +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright 2018 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 shed - -import ( - "bytes" - - "github.com/syndtr/goleveldb/leveldb" -) - -// Item holds fields relevant to Swarm Chunk data and metadata. -// All information required for swarm storage and operations -// on that storage must be defined here. -// This structure is logically connected to swarm storage, -// the only part of this package that is not generalized, -// mostly for performance reasons. -// -// Item is a type that is used for retrieving, storing and encoding -// chunk data and metadata. It is passed as an argument to Index encoding -// functions, get function and put function. -// But it is also returned with additional data from get function call -// and as the argument in iterator function definition. -type Item struct { - Address []byte - Data []byte - AccessTimestamp int64 - StoreTimestamp int64 - // UseMockStore is a pointer to identify - // an unset state of the field in Join function. - UseMockStore *bool -} - -// Merge is a helper method to construct a new -// Item by filling up fields with default values -// of a particular Item with values from another one. -func (i Item) Merge(i2 Item) (new Item) { - if i.Address == nil { - i.Address = i2.Address - } - if i.Data == nil { - i.Data = i2.Data - } - if i.AccessTimestamp == 0 { - i.AccessTimestamp = i2.AccessTimestamp - } - if i.StoreTimestamp == 0 { - i.StoreTimestamp = i2.StoreTimestamp - } - if i.UseMockStore == nil { - i.UseMockStore = i2.UseMockStore - } - return i -} - -// Index represents a set of LevelDB key value pairs that have common -// prefix. It holds functions for encoding and decoding keys and values -// to provide transparent actions on saved data which inclide: -// - getting a particular Item -// - saving a particular Item -// - iterating over a sorted LevelDB keys -// It implements IndexIteratorInterface interface. -type Index struct { - db *DB - prefix []byte - encodeKeyFunc func(fields Item) (key []byte, err error) - decodeKeyFunc func(key []byte) (e Item, err error) - encodeValueFunc func(fields Item) (value []byte, err error) - decodeValueFunc func(keyFields Item, value []byte) (e Item, err error) -} - -// IndexFuncs structure defines functions for encoding and decoding -// LevelDB keys and values for a specific index. -type IndexFuncs struct { - EncodeKey func(fields Item) (key []byte, err error) - DecodeKey func(key []byte) (e Item, err error) - EncodeValue func(fields Item) (value []byte, err error) - DecodeValue func(keyFields Item, value []byte) (e Item, err error) -} - -// NewIndex returns a new Index instance with defined name and -// encoding functions. The name must be unique and will be validated -// on database schema for a key prefix byte. -func (db *DB) NewIndex(name string, funcs IndexFuncs) (f Index, err error) { - id, err := db.schemaIndexPrefix(name) - if err != nil { - return f, err - } - prefix := []byte{id} - return Index{ - db: db, - prefix: prefix, - // This function adjusts Index LevelDB key - // by appending the provided index id byte. - // This is needed to avoid collisions between keys of different - // indexes as all index ids are unique. - encodeKeyFunc: func(e Item) (key []byte, err error) { - key, err = funcs.EncodeKey(e) - if err != nil { - return nil, err - } - return append(append(make([]byte, 0, len(key)+1), prefix...), key...), nil - }, - // This function reverses the encodeKeyFunc constructed key - // to transparently work with index keys without their index ids. - // It assumes that index keys are prefixed with only one byte. - decodeKeyFunc: func(key []byte) (e Item, err error) { - return funcs.DecodeKey(key[1:]) - }, - encodeValueFunc: funcs.EncodeValue, - decodeValueFunc: funcs.DecodeValue, - }, nil -} - -// Get accepts key fields represented as Item to retrieve a -// value from the index and return maximum available information -// from the index represented as another Item. -func (f Index) Get(keyFields Item) (out Item, err error) { - key, err := f.encodeKeyFunc(keyFields) - if err != nil { - return out, err - } - value, err := f.db.Get(key) - if err != nil { - return out, err - } - out, err = f.decodeValueFunc(keyFields, value) - if err != nil { - return out, err - } - return out.Merge(keyFields), nil -} - -// Put accepts Item to encode information from it -// and save it to the database. -func (f Index) Put(i Item) (err error) { - key, err := f.encodeKeyFunc(i) - if err != nil { - return err - } - value, err := f.encodeValueFunc(i) - if err != nil { - return err - } - return f.db.Put(key, value) -} - -// PutInBatch is the same as Put method, but it just -// saves the key/value pair to the batch instead -// directly to the database. -func (f Index) PutInBatch(batch *leveldb.Batch, i Item) (err error) { - key, err := f.encodeKeyFunc(i) - if err != nil { - return err - } - value, err := f.encodeValueFunc(i) - if err != nil { - return err - } - batch.Put(key, value) - return nil -} - -// Delete accepts Item to remove a key/value pair -// from the database based on its fields. -func (f Index) Delete(keyFields Item) (err error) { - key, err := f.encodeKeyFunc(keyFields) - if err != nil { - return err - } - return f.db.Delete(key) -} - -// DeleteInBatch is the same as Delete just the operation -// is performed on the batch instead on the database. -func (f Index) DeleteInBatch(batch *leveldb.Batch, keyFields Item) (err error) { - key, err := f.encodeKeyFunc(keyFields) - if err != nil { - return err - } - batch.Delete(key) - return nil -} - -// IndexIterFunc is a callback on every Item that is decoded -// by iterating on an Index keys. -// By returning a true for stop variable, iteration will -// stop, and by returning the error, that error will be -// propagated to the called iterator method on Index. -type IndexIterFunc func(item Item) (stop bool, err error) - -// IterateOptions defines optional parameters for Iterate function. -type IterateOptions struct { - // StartFrom is the Item to start the iteration from. - StartFrom *Item - // If SkipStartFromItem is true, StartFrom item will not - // be iterated on. - SkipStartFromItem bool - // Iterate over items which keys have a common prefix. - Prefix []byte -} - -// Iterate function iterates over keys of the Index. -// If IterateOptions is nil, the iterations is over all keys. -func (f Index) Iterate(fn IndexIterFunc, options *IterateOptions) (err error) { - if options == nil { - options = new(IterateOptions) - } - // construct a prefix with Index prefix and optional common key prefix - prefix := append(f.prefix, options.Prefix...) - // start from the prefix - startKey := prefix - if options.StartFrom != nil { - // start from the provided StartFrom Item key value - startKey, err = f.encodeKeyFunc(*options.StartFrom) - if err != nil { - return err - } - } - it := f.db.NewIterator() - defer it.Release() - - // move the cursor to the start key - ok := it.Seek(startKey) - if !ok { - // stop iterator if seek has failed - return it.Error() - } - if options.SkipStartFromItem && bytes.Equal(startKey, it.Key()) { - // skip the start from Item if it is the first key - // and it is explicitly configured to skip it - ok = it.Next() - } - for ; ok; ok = it.Next() { - key := it.Key() - if !bytes.HasPrefix(key, prefix) { - break - } - // create a copy of key byte slice not to share leveldb underlaying slice array - keyItem, err := f.decodeKeyFunc(append([]byte(nil), key...)) - if err != nil { - return err - } - // create a copy of value byte slice not to share leveldb underlaying slice array - valueItem, err := f.decodeValueFunc(keyItem, append([]byte(nil), it.Value()...)) - if err != nil { - return err - } - stop, err := fn(keyItem.Merge(valueItem)) - if err != nil { - return err - } - if stop { - break - } - } - return it.Error() -} - -// Count returns the number of items in index. -func (f Index) Count() (count int, err error) { - it := f.db.NewIterator() - defer it.Release() - - for ok := it.Seek(f.prefix); ok; ok = it.Next() { - key := it.Key() - if key[0] != f.prefix[0] { - break - } - count++ - } - return count, it.Error() -} - -// CountFrom returns the number of items in index keys -// starting from the key encoded from the provided Item. -func (f Index) CountFrom(start Item) (count int, err error) { - startKey, err := f.encodeKeyFunc(start) - if err != nil { - return 0, err - } - it := f.db.NewIterator() - defer it.Release() - - for ok := it.Seek(startKey); ok; ok = it.Next() { - key := it.Key() - if key[0] != f.prefix[0] { - break - } - count++ - } - return count, it.Error() -} diff --git a/swarm/shed/index_test.go b/swarm/shed/index_test.go deleted file mode 100644 index 97d7c91f439f..000000000000 --- a/swarm/shed/index_test.go +++ /dev/null @@ -1,781 +0,0 @@ -// Copyright 2018 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 shed - -import ( - "bytes" - "encoding/binary" - "fmt" - "sort" - "testing" - "time" - - "github.com/syndtr/goleveldb/leveldb" -) - -// Index functions for the index that is used in tests in this file. -var retrievalIndexFuncs = IndexFuncs{ - EncodeKey: func(fields Item) (key []byte, err error) { - return fields.Address, nil - }, - DecodeKey: func(key []byte) (e Item, err error) { - e.Address = key - return e, nil - }, - EncodeValue: func(fields Item) (value []byte, err error) { - b := make([]byte, 8) - binary.BigEndian.PutUint64(b, uint64(fields.StoreTimestamp)) - value = append(b, fields.Data...) - return value, nil - }, - DecodeValue: func(keyItem Item, value []byte) (e Item, err error) { - e.StoreTimestamp = int64(binary.BigEndian.Uint64(value[:8])) - e.Data = value[8:] - return e, nil - }, -} - -// TestIndex validates put, get and delete functions of the Index implementation. -func TestIndex(t *testing.T) { - db, cleanupFunc := newTestDB(t) - defer cleanupFunc() - - index, err := db.NewIndex("retrieval", retrievalIndexFuncs) - if err != nil { - t.Fatal(err) - } - - t.Run("put", func(t *testing.T) { - want := Item{ - Address: []byte("put-hash"), - Data: []byte("DATA"), - StoreTimestamp: time.Now().UTC().UnixNano(), - } - - err := index.Put(want) - if err != nil { - t.Fatal(err) - } - got, err := index.Get(Item{ - Address: want.Address, - }) - if err != nil { - t.Fatal(err) - } - checkItem(t, got, want) - - t.Run("overwrite", func(t *testing.T) { - want := Item{ - Address: []byte("put-hash"), - Data: []byte("New DATA"), - StoreTimestamp: time.Now().UTC().UnixNano(), - } - - err = index.Put(want) - if err != nil { - t.Fatal(err) - } - got, err := index.Get(Item{ - Address: want.Address, - }) - if err != nil { - t.Fatal(err) - } - checkItem(t, got, want) - }) - }) - - t.Run("put in batch", func(t *testing.T) { - want := Item{ - Address: []byte("put-in-batch-hash"), - Data: []byte("DATA"), - StoreTimestamp: time.Now().UTC().UnixNano(), - } - - batch := new(leveldb.Batch) - index.PutInBatch(batch, want) - err := db.WriteBatch(batch) - if err != nil { - t.Fatal(err) - } - got, err := index.Get(Item{ - Address: want.Address, - }) - if err != nil { - t.Fatal(err) - } - checkItem(t, got, want) - - t.Run("overwrite", func(t *testing.T) { - want := Item{ - Address: []byte("put-in-batch-hash"), - Data: []byte("New DATA"), - StoreTimestamp: time.Now().UTC().UnixNano(), - } - - batch := new(leveldb.Batch) - index.PutInBatch(batch, want) - db.WriteBatch(batch) - if err != nil { - t.Fatal(err) - } - got, err := index.Get(Item{ - Address: want.Address, - }) - if err != nil { - t.Fatal(err) - } - checkItem(t, got, want) - }) - }) - - t.Run("put in batch twice", func(t *testing.T) { - // ensure that the last item of items with the same db keys - // is actually saved - batch := new(leveldb.Batch) - address := []byte("put-in-batch-twice-hash") - - // put the first item - index.PutInBatch(batch, Item{ - Address: address, - Data: []byte("DATA"), - StoreTimestamp: time.Now().UTC().UnixNano(), - }) - - want := Item{ - Address: address, - Data: []byte("New DATA"), - StoreTimestamp: time.Now().UTC().UnixNano(), - } - // then put the item that will produce the same key - // but different value in the database - index.PutInBatch(batch, want) - db.WriteBatch(batch) - if err != nil { - t.Fatal(err) - } - got, err := index.Get(Item{ - Address: address, - }) - if err != nil { - t.Fatal(err) - } - checkItem(t, got, want) - }) - - t.Run("delete", func(t *testing.T) { - want := Item{ - Address: []byte("delete-hash"), - Data: []byte("DATA"), - StoreTimestamp: time.Now().UTC().UnixNano(), - } - - err := index.Put(want) - if err != nil { - t.Fatal(err) - } - got, err := index.Get(Item{ - Address: want.Address, - }) - if err != nil { - t.Fatal(err) - } - checkItem(t, got, want) - - err = index.Delete(Item{ - Address: want.Address, - }) - if err != nil { - t.Fatal(err) - } - - wantErr := leveldb.ErrNotFound - got, err = index.Get(Item{ - Address: want.Address, - }) - if err != wantErr { - t.Fatalf("got error %v, want %v", err, wantErr) - } - }) - - t.Run("delete in batch", func(t *testing.T) { - want := Item{ - Address: []byte("delete-in-batch-hash"), - Data: []byte("DATA"), - StoreTimestamp: time.Now().UTC().UnixNano(), - } - - err := index.Put(want) - if err != nil { - t.Fatal(err) - } - got, err := index.Get(Item{ - Address: want.Address, - }) - if err != nil { - t.Fatal(err) - } - checkItem(t, got, want) - - batch := new(leveldb.Batch) - index.DeleteInBatch(batch, Item{ - Address: want.Address, - }) - err = db.WriteBatch(batch) - if err != nil { - t.Fatal(err) - } - - wantErr := leveldb.ErrNotFound - got, err = index.Get(Item{ - Address: want.Address, - }) - if err != wantErr { - t.Fatalf("got error %v, want %v", err, wantErr) - } - }) -} - -// TestIndex_Iterate validates index Iterate -// functions for correctness. -func TestIndex_Iterate(t *testing.T) { - db, cleanupFunc := newTestDB(t) - defer cleanupFunc() - - index, err := db.NewIndex("retrieval", retrievalIndexFuncs) - if err != nil { - t.Fatal(err) - } - - items := []Item{ - { - Address: []byte("iterate-hash-01"), - Data: []byte("data80"), - }, - { - Address: []byte("iterate-hash-03"), - Data: []byte("data22"), - }, - { - Address: []byte("iterate-hash-05"), - Data: []byte("data41"), - }, - { - Address: []byte("iterate-hash-02"), - Data: []byte("data84"), - }, - { - Address: []byte("iterate-hash-06"), - Data: []byte("data1"), - }, - } - batch := new(leveldb.Batch) - for _, i := range items { - index.PutInBatch(batch, i) - } - err = db.WriteBatch(batch) - if err != nil { - t.Fatal(err) - } - item04 := Item{ - Address: []byte("iterate-hash-04"), - Data: []byte("data0"), - } - err = index.Put(item04) - if err != nil { - t.Fatal(err) - } - items = append(items, item04) - - sort.SliceStable(items, func(i, j int) bool { - return bytes.Compare(items[i].Address, items[j].Address) < 0 - }) - - t.Run("all", func(t *testing.T) { - var i int - err := index.Iterate(func(item Item) (stop bool, err error) { - if i > len(items)-1 { - return true, fmt.Errorf("got unexpected index item: %#v", item) - } - want := items[i] - checkItem(t, item, want) - i++ - return false, nil - }, nil) - if err != nil { - t.Fatal(err) - } - }) - - t.Run("start from", func(t *testing.T) { - startIndex := 2 - i := startIndex - err := index.Iterate(func(item Item) (stop bool, err error) { - if i > len(items)-1 { - return true, fmt.Errorf("got unexpected index item: %#v", item) - } - want := items[i] - checkItem(t, item, want) - i++ - return false, nil - }, &IterateOptions{ - StartFrom: &items[startIndex], - }) - if err != nil { - t.Fatal(err) - } - }) - - t.Run("skip start from", func(t *testing.T) { - startIndex := 2 - i := startIndex + 1 - err := index.Iterate(func(item Item) (stop bool, err error) { - if i > len(items)-1 { - return true, fmt.Errorf("got unexpected index item: %#v", item) - } - want := items[i] - checkItem(t, item, want) - i++ - return false, nil - }, &IterateOptions{ - StartFrom: &items[startIndex], - SkipStartFromItem: true, - }) - if err != nil { - t.Fatal(err) - } - }) - - t.Run("stop", func(t *testing.T) { - var i int - stopIndex := 3 - var count int - err := index.Iterate(func(item Item) (stop bool, err error) { - if i > len(items)-1 { - return true, fmt.Errorf("got unexpected index item: %#v", item) - } - want := items[i] - checkItem(t, item, want) - count++ - if i == stopIndex { - return true, nil - } - i++ - return false, nil - }, nil) - if err != nil { - t.Fatal(err) - } - wantItemsCount := stopIndex + 1 - if count != wantItemsCount { - t.Errorf("got %v items, expected %v", count, wantItemsCount) - } - }) - - t.Run("no overflow", func(t *testing.T) { - secondIndex, err := db.NewIndex("second-index", retrievalIndexFuncs) - if err != nil { - t.Fatal(err) - } - - secondItem := Item{ - Address: []byte("iterate-hash-10"), - Data: []byte("data-second"), - } - err = secondIndex.Put(secondItem) - if err != nil { - t.Fatal(err) - } - - var i int - err = index.Iterate(func(item Item) (stop bool, err error) { - if i > len(items)-1 { - return true, fmt.Errorf("got unexpected index item: %#v", item) - } - want := items[i] - checkItem(t, item, want) - i++ - return false, nil - }, nil) - if err != nil { - t.Fatal(err) - } - - i = 0 - err = secondIndex.Iterate(func(item Item) (stop bool, err error) { - if i > 1 { - return true, fmt.Errorf("got unexpected index item: %#v", item) - } - checkItem(t, item, secondItem) - i++ - return false, nil - }, nil) - if err != nil { - t.Fatal(err) - } - }) -} - -// TestIndex_Iterate_withPrefix validates index Iterate -// function for correctness. -func TestIndex_Iterate_withPrefix(t *testing.T) { - db, cleanupFunc := newTestDB(t) - defer cleanupFunc() - - index, err := db.NewIndex("retrieval", retrievalIndexFuncs) - if err != nil { - t.Fatal(err) - } - - allItems := []Item{ - {Address: []byte("want-hash-00"), Data: []byte("data80")}, - {Address: []byte("skip-hash-01"), Data: []byte("data81")}, - {Address: []byte("skip-hash-02"), Data: []byte("data82")}, - {Address: []byte("skip-hash-03"), Data: []byte("data83")}, - {Address: []byte("want-hash-04"), Data: []byte("data84")}, - {Address: []byte("want-hash-05"), Data: []byte("data85")}, - {Address: []byte("want-hash-06"), Data: []byte("data86")}, - {Address: []byte("want-hash-07"), Data: []byte("data87")}, - {Address: []byte("want-hash-08"), Data: []byte("data88")}, - {Address: []byte("want-hash-09"), Data: []byte("data89")}, - {Address: []byte("skip-hash-10"), Data: []byte("data90")}, - } - batch := new(leveldb.Batch) - for _, i := range allItems { - index.PutInBatch(batch, i) - } - err = db.WriteBatch(batch) - if err != nil { - t.Fatal(err) - } - - prefix := []byte("want") - - items := make([]Item, 0) - for _, item := range allItems { - if bytes.HasPrefix(item.Address, prefix) { - items = append(items, item) - } - } - sort.SliceStable(items, func(i, j int) bool { - return bytes.Compare(items[i].Address, items[j].Address) < 0 - }) - - t.Run("with prefix", func(t *testing.T) { - var i int - err := index.Iterate(func(item Item) (stop bool, err error) { - if i > len(items)-1 { - return true, fmt.Errorf("got unexpected index item: %#v", item) - } - want := items[i] - checkItem(t, item, want) - i++ - return false, nil - }, &IterateOptions{ - Prefix: prefix, - }) - if err != nil { - t.Fatal(err) - } - if i != len(items) { - t.Errorf("got %v items, want %v", i, len(items)) - } - }) - - t.Run("with prefix and start from", func(t *testing.T) { - startIndex := 2 - var count int - i := startIndex - err := index.Iterate(func(item Item) (stop bool, err error) { - if i > len(items)-1 { - return true, fmt.Errorf("got unexpected index item: %#v", item) - } - want := items[i] - checkItem(t, item, want) - i++ - count++ - return false, nil - }, &IterateOptions{ - StartFrom: &items[startIndex], - Prefix: prefix, - }) - if err != nil { - t.Fatal(err) - } - wantCount := len(items) - startIndex - if count != wantCount { - t.Errorf("got %v items, want %v", count, wantCount) - } - }) - - t.Run("with prefix and skip start from", func(t *testing.T) { - startIndex := 2 - var count int - i := startIndex + 1 - err := index.Iterate(func(item Item) (stop bool, err error) { - if i > len(items)-1 { - return true, fmt.Errorf("got unexpected index item: %#v", item) - } - want := items[i] - checkItem(t, item, want) - i++ - count++ - return false, nil - }, &IterateOptions{ - StartFrom: &items[startIndex], - SkipStartFromItem: true, - Prefix: prefix, - }) - if err != nil { - t.Fatal(err) - } - wantCount := len(items) - startIndex - 1 - if count != wantCount { - t.Errorf("got %v items, want %v", count, wantCount) - } - }) - - t.Run("stop", func(t *testing.T) { - var i int - stopIndex := 3 - var count int - err := index.Iterate(func(item Item) (stop bool, err error) { - if i > len(items)-1 { - return true, fmt.Errorf("got unexpected index item: %#v", item) - } - want := items[i] - checkItem(t, item, want) - count++ - if i == stopIndex { - return true, nil - } - i++ - return false, nil - }, &IterateOptions{ - Prefix: prefix, - }) - if err != nil { - t.Fatal(err) - } - wantItemsCount := stopIndex + 1 - if count != wantItemsCount { - t.Errorf("got %v items, expected %v", count, wantItemsCount) - } - }) - - t.Run("no overflow", func(t *testing.T) { - secondIndex, err := db.NewIndex("second-index", retrievalIndexFuncs) - if err != nil { - t.Fatal(err) - } - - secondItem := Item{ - Address: []byte("iterate-hash-10"), - Data: []byte("data-second"), - } - err = secondIndex.Put(secondItem) - if err != nil { - t.Fatal(err) - } - - var i int - err = index.Iterate(func(item Item) (stop bool, err error) { - if i > len(items)-1 { - return true, fmt.Errorf("got unexpected index item: %#v", item) - } - want := items[i] - checkItem(t, item, want) - i++ - return false, nil - }, &IterateOptions{ - Prefix: prefix, - }) - if err != nil { - t.Fatal(err) - } - if i != len(items) { - t.Errorf("got %v items, want %v", i, len(items)) - } - }) -} - -// TestIndex_count tests if Index.Count and Index.CountFrom -// returns the correct number of items. -func TestIndex_count(t *testing.T) { - db, cleanupFunc := newTestDB(t) - defer cleanupFunc() - - index, err := db.NewIndex("retrieval", retrievalIndexFuncs) - if err != nil { - t.Fatal(err) - } - - items := []Item{ - { - Address: []byte("iterate-hash-01"), - Data: []byte("data80"), - }, - { - Address: []byte("iterate-hash-02"), - Data: []byte("data84"), - }, - { - Address: []byte("iterate-hash-03"), - Data: []byte("data22"), - }, - { - Address: []byte("iterate-hash-04"), - Data: []byte("data41"), - }, - { - Address: []byte("iterate-hash-05"), - Data: []byte("data1"), - }, - } - batch := new(leveldb.Batch) - for _, i := range items { - index.PutInBatch(batch, i) - } - err = db.WriteBatch(batch) - if err != nil { - t.Fatal(err) - } - - t.Run("Count", func(t *testing.T) { - got, err := index.Count() - if err != nil { - t.Fatal(err) - } - - want := len(items) - if got != want { - t.Errorf("got %v items count, want %v", got, want) - } - }) - - t.Run("CountFrom", func(t *testing.T) { - got, err := index.CountFrom(Item{ - Address: items[1].Address, - }) - if err != nil { - t.Fatal(err) - } - - want := len(items) - 1 - if got != want { - t.Errorf("got %v items count, want %v", got, want) - } - }) - - // update the index with another item - t.Run("add item", func(t *testing.T) { - item04 := Item{ - Address: []byte("iterate-hash-06"), - Data: []byte("data0"), - } - err = index.Put(item04) - if err != nil { - t.Fatal(err) - } - - count := len(items) + 1 - - t.Run("Count", func(t *testing.T) { - got, err := index.Count() - if err != nil { - t.Fatal(err) - } - - want := count - if got != want { - t.Errorf("got %v items count, want %v", got, want) - } - }) - - t.Run("CountFrom", func(t *testing.T) { - got, err := index.CountFrom(Item{ - Address: items[1].Address, - }) - if err != nil { - t.Fatal(err) - } - - want := count - 1 - if got != want { - t.Errorf("got %v items count, want %v", got, want) - } - }) - }) - - // delete some items - t.Run("delete items", func(t *testing.T) { - deleteCount := 3 - - for _, item := range items[:deleteCount] { - err := index.Delete(item) - if err != nil { - t.Fatal(err) - } - } - - count := len(items) + 1 - deleteCount - - t.Run("Count", func(t *testing.T) { - got, err := index.Count() - if err != nil { - t.Fatal(err) - } - - want := count - if got != want { - t.Errorf("got %v items count, want %v", got, want) - } - }) - - t.Run("CountFrom", func(t *testing.T) { - got, err := index.CountFrom(Item{ - Address: items[deleteCount+1].Address, - }) - if err != nil { - t.Fatal(err) - } - - want := count - 1 - if got != want { - t.Errorf("got %v items count, want %v", got, want) - } - }) - }) -} - -// checkItem is a test helper function that compares if two Index items are the same. -func checkItem(t *testing.T, got, want Item) { - t.Helper() - - if !bytes.Equal(got.Address, want.Address) { - t.Errorf("got hash %q, expected %q", string(got.Address), string(want.Address)) - } - if !bytes.Equal(got.Data, want.Data) { - t.Errorf("got data %q, expected %q", string(got.Data), string(want.Data)) - } - if got.StoreTimestamp != want.StoreTimestamp { - t.Errorf("got store timestamp %v, expected %v", got.StoreTimestamp, want.StoreTimestamp) - } - if got.AccessTimestamp != want.AccessTimestamp { - t.Errorf("got access timestamp %v, expected %v", got.AccessTimestamp, want.AccessTimestamp) - } -} diff --git a/swarm/shed/schema.go b/swarm/shed/schema.go deleted file mode 100644 index cfb7c6d64269..000000000000 --- a/swarm/shed/schema.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2018 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 shed - -import ( - "encoding/json" - "errors" - "fmt" -) - -var ( - // LevelDB key value for storing the schema. - keySchema = []byte{0} - // LevelDB key prefix for all field type. - // LevelDB keys will be constructed by appending name values to this prefix. - keyPrefixFields byte = 1 - // LevelDB key prefix from which indexing keys start. - // Every index has its own key prefix and this value defines the first one. - keyPrefixIndexStart byte = 2 // Q: or maybe a higher number like 7, to have more space for potential specific perfixes -) - -// schema is used to serialize known database structure information. -type schema struct { - Fields map[string]fieldSpec `json:"fields"` // keys are field names - Indexes map[byte]indexSpec `json:"indexes"` // keys are index prefix bytes -} - -// fieldSpec holds information about a particular field. -// It does not need Name field as it is contained in the -// schema.Field map key. -type fieldSpec struct { - Type string `json:"type"` -} - -// indxSpec holds information about a particular index. -// It does not contain index type, as indexes do not have type. -type indexSpec struct { - Name string `json:"name"` -} - -// schemaFieldKey retrives the complete LevelDB key for -// a particular field form the schema definition. -func (db *DB) schemaFieldKey(name, fieldType string) (key []byte, err error) { - if name == "" { - return nil, errors.New("field name can not be blank") - } - if fieldType == "" { - return nil, errors.New("field type can not be blank") - } - s, err := db.getSchema() - if err != nil { - return nil, err - } - var found bool - for n, f := range s.Fields { - if n == name { - if f.Type != fieldType { - return nil, fmt.Errorf("field %q of type %q stored as %q in db", name, fieldType, f.Type) - } - break - } - } - if !found { - s.Fields[name] = fieldSpec{ - Type: fieldType, - } - err := db.putSchema(s) - if err != nil { - return nil, err - } - } - return append([]byte{keyPrefixFields}, []byte(name)...), nil -} - -// schemaIndexID retrieves the complete LevelDB prefix for -// a particular index. -func (db *DB) schemaIndexPrefix(name string) (id byte, err error) { - if name == "" { - return 0, errors.New("index name can not be blank") - } - s, err := db.getSchema() - if err != nil { - return 0, err - } - nextID := keyPrefixIndexStart - for i, f := range s.Indexes { - if i >= nextID { - nextID = i + 1 - } - if f.Name == name { - return i, nil - } - } - id = nextID - s.Indexes[id] = indexSpec{ - Name: name, - } - return id, db.putSchema(s) -} - -// getSchema retrieves the complete schema from -// the database. -func (db *DB) getSchema() (s schema, err error) { - b, err := db.Get(keySchema) - if err != nil { - return s, err - } - err = json.Unmarshal(b, &s) - return s, err -} - -// putSchema stores the complete schema to -// the database. -func (db *DB) putSchema(s schema) (err error) { - b, err := json.Marshal(s) - if err != nil { - return err - } - return db.Put(keySchema, b) -} diff --git a/swarm/shed/schema_test.go b/swarm/shed/schema_test.go deleted file mode 100644 index a0c1838c8bc8..000000000000 --- a/swarm/shed/schema_test.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2018 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 shed - -import ( - "bytes" - "testing" -) - -// TestDB_schemaFieldKey validates correctness of schemaFieldKey. -func TestDB_schemaFieldKey(t *testing.T) { - db, cleanupFunc := newTestDB(t) - defer cleanupFunc() - - t.Run("empty name or type", func(t *testing.T) { - _, err := db.schemaFieldKey("", "") - if err == nil { - t.Errorf("error not returned, but expected") - } - _, err = db.schemaFieldKey("", "type") - if err == nil { - t.Errorf("error not returned, but expected") - } - - _, err = db.schemaFieldKey("test", "") - if err == nil { - t.Errorf("error not returned, but expected") - } - }) - - t.Run("same field", func(t *testing.T) { - key1, err := db.schemaFieldKey("test", "undefined") - if err != nil { - t.Fatal(err) - } - - key2, err := db.schemaFieldKey("test", "undefined") - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(key1, key2) { - t.Errorf("schema keys for the same field name are not the same: %q, %q", string(key1), string(key2)) - } - }) - - t.Run("different fields", func(t *testing.T) { - key1, err := db.schemaFieldKey("test1", "undefined") - if err != nil { - t.Fatal(err) - } - - key2, err := db.schemaFieldKey("test2", "undefined") - if err != nil { - t.Fatal(err) - } - - if bytes.Equal(key1, key2) { - t.Error("schema keys for the same field name are the same, but must not be") - } - }) - - t.Run("same field name different types", func(t *testing.T) { - _, err := db.schemaFieldKey("the-field", "one-type") - if err != nil { - t.Fatal(err) - } - - _, err = db.schemaFieldKey("the-field", "another-type") - if err == nil { - t.Errorf("error not returned, but expected") - } - }) -} - -// TestDB_schemaIndexPrefix validates correctness of schemaIndexPrefix. -func TestDB_schemaIndexPrefix(t *testing.T) { - db, cleanupFunc := newTestDB(t) - defer cleanupFunc() - - t.Run("same name", func(t *testing.T) { - id1, err := db.schemaIndexPrefix("test") - if err != nil { - t.Fatal(err) - } - - id2, err := db.schemaIndexPrefix("test") - if err != nil { - t.Fatal(err) - } - - if id1 != id2 { - t.Errorf("schema keys for the same field name are not the same: %v, %v", id1, id2) - } - }) - - t.Run("different names", func(t *testing.T) { - id1, err := db.schemaIndexPrefix("test1") - if err != nil { - t.Fatal(err) - } - - id2, err := db.schemaIndexPrefix("test2") - if err != nil { - t.Fatal(err) - } - - if id1 == id2 { - t.Error("schema ids for the same index name are the same, but must not be") - } - }) -} diff --git a/swarm/spancontext/spancontext.go b/swarm/spancontext/spancontext.go deleted file mode 100644 index 2cb9f82f7c9e..000000000000 --- a/swarm/spancontext/spancontext.go +++ /dev/null @@ -1,49 +0,0 @@ -package spancontext - -import ( - "context" - - opentracing "github.com/opentracing/opentracing-go" -) - -func WithContext(ctx context.Context, sctx opentracing.SpanContext) context.Context { - return context.WithValue(ctx, "span_context", sctx) -} - -func FromContext(ctx context.Context) opentracing.SpanContext { - sctx, ok := ctx.Value("span_context").(opentracing.SpanContext) - if ok { - return sctx - } - - return nil -} - -func StartSpan(ctx context.Context, name string) (context.Context, opentracing.Span) { - tracer := opentracing.GlobalTracer() - - sctx := FromContext(ctx) - - var sp opentracing.Span - if sctx != nil { - sp = tracer.StartSpan( - name, - opentracing.ChildOf(sctx)) - } else { - sp = tracer.StartSpan(name) - } - - nctx := context.WithValue(ctx, "span_context", sp.Context()) - - return nctx, sp -} - -func StartSpanFrom(name string, sctx opentracing.SpanContext) opentracing.Span { - tracer := opentracing.GlobalTracer() - - sp := tracer.StartSpan( - name, - opentracing.ChildOf(sctx)) - - return sp -} diff --git a/swarm/state/dbstore.go b/swarm/state/dbstore.go deleted file mode 100644 index 147e34b23591..000000000000 --- a/swarm/state/dbstore.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2018 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 state - -import ( - "encoding" - "encoding/json" - "errors" - - "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -// ErrNotFound is returned when no results are returned from the database -var ErrNotFound = errors.New("ErrorNotFound") - -// Store defines methods required to get, set, delete values for different keys -// and close the underlying resources. -type Store interface { - Get(key string, i interface{}) (err error) - Put(key string, i interface{}) (err error) - Delete(key string) (err error) - Close() error -} - -// DBStore uses LevelDB to store values. -type DBStore struct { - db *leveldb.DB -} - -// NewDBStore creates a new instance of DBStore. -func NewDBStore(path string) (s *DBStore, err error) { - db, err := leveldb.OpenFile(path, nil) - if err != nil { - return nil, err - } - return &DBStore{ - db: db, - }, nil -} - -// NewInmemoryStore returns a new instance of DBStore. To be used only in tests and simulations. -func NewInmemoryStore() *DBStore { - db, err := leveldb.Open(storage.NewMemStorage(), nil) - if err != nil { - panic(err) - } - return &DBStore{ - db: db, - } -} - -// Get retrieves a persisted value for a specific key. If there is no results -// ErrNotFound is returned. The provided parameter should be either a byte slice or -// a struct that implements the encoding.BinaryUnmarshaler interface -func (s *DBStore) Get(key string, i interface{}) (err error) { - has, err := s.db.Has([]byte(key), nil) - if err != nil || !has { - return ErrNotFound - } - - data, err := s.db.Get([]byte(key), nil) - if err == leveldb.ErrNotFound { - return ErrNotFound - } - - unmarshaler, ok := i.(encoding.BinaryUnmarshaler) - if !ok { - return json.Unmarshal(data, i) - } - return unmarshaler.UnmarshalBinary(data) -} - -// Put stores an object that implements Binary for a specific key. -func (s *DBStore) Put(key string, i interface{}) (err error) { - var bytes []byte - - marshaler, ok := i.(encoding.BinaryMarshaler) - if !ok { - if bytes, err = json.Marshal(i); err != nil { - return err - } - } else { - if bytes, err = marshaler.MarshalBinary(); err != nil { - return err - } - } - - return s.db.Put([]byte(key), bytes, nil) -} - -// Delete removes entries stored under a specific key. -func (s *DBStore) Delete(key string) (err error) { - return s.db.Delete([]byte(key), nil) -} - -// Close releases the resources used by the underlying LevelDB. -func (s *DBStore) Close() error { - return s.db.Close() -} diff --git a/swarm/state/dbstore_test.go b/swarm/state/dbstore_test.go deleted file mode 100644 index f7098956d038..000000000000 --- a/swarm/state/dbstore_test.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2018 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 state - -import ( - "bytes" - "errors" - "io/ioutil" - "os" - "strings" - "testing" -) - -var ErrInvalidArraySize = errors.New("invalid byte array size") -var ErrInvalidValuePersisted = errors.New("invalid value was persisted to the db") - -type SerializingType struct { - key string - value string -} - -func (st *SerializingType) MarshalBinary() (data []byte, err error) { - d := []byte(strings.Join([]string{st.key, st.value}, ";")) - - return d, nil -} - -func (st *SerializingType) UnmarshalBinary(data []byte) (err error) { - d := bytes.Split(data, []byte(";")) - l := len(d) - if l == 0 { - return ErrInvalidArraySize - } - if l == 2 { - keyLen := len(d[0]) - st.key = string(d[0][:keyLen]) - - valLen := len(d[1]) - st.value = string(d[1][:valLen]) - } - - return nil -} - -// TestDBStore tests basic functionality of DBStore. -func TestDBStore(t *testing.T) { - dir, err := ioutil.TempDir("", "db_store_test") - if err != nil { - panic(err) - } - defer os.RemoveAll(dir) - - store, err := NewDBStore(dir) - if err != nil { - t.Fatal(err) - } - - testStore(t, store) - - store.Close() - - persistedStore, err := NewDBStore(dir) - if err != nil { - t.Fatal(err) - } - defer persistedStore.Close() - - testPersistedStore(t, persistedStore) -} - -func testStore(t *testing.T, store Store) { - ser := &SerializingType{key: "key1", value: "value1"} - jsonify := []string{"a", "b", "c"} - - err := store.Put(ser.key, ser) - if err != nil { - t.Fatal(err) - } - - err = store.Put("key2", jsonify) - if err != nil { - t.Fatal(err) - } - -} - -func testPersistedStore(t *testing.T, store Store) { - ser := &SerializingType{} - - err := store.Get("key1", ser) - if err != nil { - t.Fatal(err) - } - - if ser.key != "key1" || ser.value != "value1" { - t.Fatal(ErrInvalidValuePersisted) - } - - as := []string{} - err = store.Get("key2", &as) - if err != nil { - t.Fatal(err) - } - - if len(as) != 3 { - t.Fatalf("serialized array did not match expectation") - } - if as[0] != "a" || as[1] != "b" || as[2] != "c" { - t.Fatalf("elements serialized did not match expected values") - } -} diff --git a/swarm/storage/chunker.go b/swarm/storage/chunker.go deleted file mode 100644 index 4718a66c4d2c..000000000000 --- a/swarm/storage/chunker.go +++ /dev/null @@ -1,607 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . -package storage - -import ( - "context" - "encoding/binary" - "errors" - "fmt" - "io" - "sync" - "time" - - "github.com/nebulaai/nbai-node/metrics" - ch "github.com/nebulaai/nbai-node/swarm/chunk" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/spancontext" - opentracing "github.com/opentracing/opentracing-go" - olog "github.com/opentracing/opentracing-go/log" -) - -/* -The distributed storage implemented in this package requires fix sized chunks of content. - -Chunker is the interface to a component that is responsible for disassembling and assembling larger data. - -TreeChunker implements a Chunker based on a tree structure defined as follows: - -1 each node in the tree including the root and other branching nodes are stored as a chunk. - -2 branching nodes encode data contents that includes the size of the dataslice covered by its entire subtree under the node as well as the hash keys of all its children : -data_{i} := size(subtree_{i}) || key_{j} || key_{j+1} .... || key_{j+n-1} - -3 Leaf nodes encode an actual subslice of the input data. - -4 if data size is not more than maximum chunksize, the data is stored in a single chunk - key = hash(int64(size) + data) - -5 if data size is more than chunksize*branches^l, but no more than chunksize* - branches^(l+1), the data vector is split into slices of chunksize* - branches^l length (except the last one). - key = hash(int64(size) + key(slice0) + key(slice1) + ...) - - The underlying hash function is configurable -*/ - -/* -Tree chunker is a concrete implementation of data chunking. -This chunker works in a simple way, it builds a tree out of the document so that each node either represents a chunk of real data or a chunk of data representing an branching non-leaf node of the tree. In particular each such non-leaf chunk will represent is a concatenation of the hash of its respective children. This scheme simultaneously guarantees data integrity as well as self addressing. Abstract nodes are transparent since their represented size component is strictly greater than their maximum data size, since they encode a subtree. - -If all is well it is possible to implement this by simply composing readers so that no extra allocation or buffering is necessary for the data splitting and joining. This means that in principle there can be direct IO between : memory, file system, network socket (bzz peers storage request is read from the socket). In practice there may be need for several stages of internal buffering. -The hashing itself does use extra copies and allocation though, since it does need it. -*/ - -type ChunkerParams struct { - chunkSize int64 - hashSize int64 -} - -type SplitterParams struct { - ChunkerParams - reader io.Reader - putter Putter - addr Address -} - -type TreeSplitterParams struct { - SplitterParams - size int64 -} - -type JoinerParams struct { - ChunkerParams - addr Address - getter Getter - // TODO: there is a bug, so depth can only be 0 today, see: https://github.com/ethersphere/go-ethereum/issues/344 - depth int - ctx context.Context -} - -type TreeChunker struct { - ctx context.Context - - branches int64 - dataSize int64 - data io.Reader - // calculated - addr Address - depth 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 - jobC chan *hashJob - wg *sync.WaitGroup - putter Putter - getter Getter - errC chan error - quitC chan bool -} - -/* - Join reconstructs original content based on a root key. - When joining, the caller gets returned a Lazy SectionReader, which is - seekable and implements on-demand fetching of chunks as and where it is read. - New chunks to retrieve are coming from the getter, which the caller provides. - If an error is encountered during joining, it appears as a reader error. - The SectionReader. - As a result, partial reads from a document are possible even if other parts - are corrupt or lost. - The chunks are not meant to be validated by the chunker when joining. This - is because it is left to the DPA to decide which sources are trusted. -*/ -func TreeJoin(ctx context.Context, addr Address, getter Getter, depth int) *LazyChunkReader { - jp := &JoinerParams{ - ChunkerParams: ChunkerParams{ - chunkSize: ch.DefaultSize, - hashSize: int64(len(addr)), - }, - addr: addr, - getter: getter, - depth: depth, - ctx: ctx, - } - - return NewTreeJoiner(jp).Join(ctx) -} - -/* - When splitting, data is given as a SectionReader, and the key is a hashSize long byte slice (Key), the root hash of the entire content will fill this once processing finishes. - New chunks to store are store using the putter which the caller provides. -*/ -func TreeSplit(ctx context.Context, data io.Reader, size int64, putter Putter) (k Address, wait func(context.Context) error, err error) { - tsp := &TreeSplitterParams{ - SplitterParams: SplitterParams{ - ChunkerParams: ChunkerParams{ - chunkSize: ch.DefaultSize, - hashSize: putter.RefSize(), - }, - reader: data, - putter: putter, - }, - size: size, - } - return NewTreeSplitter(tsp).Split(ctx) -} - -func NewTreeJoiner(params *JoinerParams) *TreeChunker { - tc := &TreeChunker{} - tc.hashSize = params.hashSize - tc.branches = params.chunkSize / params.hashSize - tc.addr = params.addr - tc.getter = params.getter - tc.depth = params.depth - tc.chunkSize = params.chunkSize - tc.workerCount = 0 - tc.jobC = make(chan *hashJob, 2*ChunkProcessors) - tc.wg = &sync.WaitGroup{} - tc.errC = make(chan error) - tc.quitC = make(chan bool) - - tc.ctx = params.ctx - - return tc -} - -func NewTreeSplitter(params *TreeSplitterParams) *TreeChunker { - tc := &TreeChunker{} - tc.data = params.reader - tc.dataSize = params.size - tc.hashSize = params.hashSize - tc.branches = params.chunkSize / params.hashSize - tc.addr = params.addr - tc.chunkSize = params.chunkSize - tc.putter = params.putter - tc.workerCount = 0 - tc.jobC = make(chan *hashJob, 2*ChunkProcessors) - tc.wg = &sync.WaitGroup{} - tc.errC = make(chan error) - tc.quitC = make(chan bool) - - return tc -} - -type hashJob struct { - key Address - chunk []byte - size int64 - parentWg *sync.WaitGroup -} - -func (tc *TreeChunker) incrementWorkerCount() { - tc.workerLock.Lock() - defer tc.workerLock.Unlock() - tc.workerCount += 1 -} - -func (tc *TreeChunker) getWorkerCount() int64 { - tc.workerLock.RLock() - defer tc.workerLock.RUnlock() - return tc.workerCount -} - -func (tc *TreeChunker) decrementWorkerCount() { - tc.workerLock.Lock() - defer tc.workerLock.Unlock() - tc.workerCount -= 1 -} - -func (tc *TreeChunker) Split(ctx context.Context) (k Address, wait func(context.Context) error, err error) { - if tc.chunkSize <= 0 { - panic("chunker must be initialised") - } - - tc.runWorker(ctx) - - depth := 0 - treeSize := tc.chunkSize - - // takes lowest depth such that chunksize*HashCount^(depth+1) > size - // power series, will find the order of magnitude of the data size in base hashCount or numbers of levels of branching in the resulting tree. - for ; treeSize < tc.dataSize; treeSize *= tc.branches { - depth++ - } - - key := make([]byte, tc.hashSize) - // this waitgroup member is released after the root hash is calculated - tc.wg.Add(1) - //launch actual recursive function passing the waitgroups - go tc.split(ctx, depth, treeSize/tc.branches, key, tc.dataSize, tc.wg) - - // closes internal error channel if all subprocesses in the workgroup finished - go func() { - // waiting for all threads to finish - tc.wg.Wait() - close(tc.errC) - }() - - defer close(tc.quitC) - defer tc.putter.Close() - select { - case err := <-tc.errC: - if err != nil { - return nil, nil, err - } - case <-ctx.Done(): - return nil, nil, ctx.Err() - } - - return key, tc.putter.Wait, nil -} - -func (tc *TreeChunker) split(ctx context.Context, depth int, treeSize int64, addr Address, size int64, parentWg *sync.WaitGroup) { - - // - - for depth > 0 && size < treeSize { - treeSize /= tc.branches - depth-- - } - - if depth == 0 { - // leaf nodes -> content chunks - chunkData := make([]byte, size+8) - binary.LittleEndian.PutUint64(chunkData[0:8], uint64(size)) - var readBytes int64 - for readBytes < size { - n, err := tc.data.Read(chunkData[8+readBytes:]) - readBytes += int64(n) - if err != nil && !(err == io.EOF && readBytes == size) { - tc.errC <- err - return - } - } - select { - case tc.jobC <- &hashJob{addr, chunkData, size, parentWg}: - case <-tc.quitC: - } - return - } - // dept > 0 - // intermediate chunk containing child nodes hashes - branchCnt := (size + treeSize - 1) / treeSize - - var chunk = make([]byte, branchCnt*tc.hashSize+8) - var pos, i int64 - - binary.LittleEndian.PutUint64(chunk[0:8], uint64(size)) - - childrenWg := &sync.WaitGroup{} - var secSize int64 - for i < branchCnt { - // the last item can have shorter data - if size-pos < treeSize { - secSize = size - pos - } else { - secSize = treeSize - } - // the hash of that data - subTreeAddress := chunk[8+i*tc.hashSize : 8+(i+1)*tc.hashSize] - - childrenWg.Add(1) - tc.split(ctx, depth-1, treeSize/tc.branches, subTreeAddress, secSize, childrenWg) - - i++ - pos += treeSize - } - // wait for all the children to complete calculating their hashes and copying them onto sections of the chunk - // parentWg.Add(1) - // go func() { - childrenWg.Wait() - - worker := tc.getWorkerCount() - if int64(len(tc.jobC)) > worker && worker < ChunkProcessors { - tc.runWorker(ctx) - - } - select { - case tc.jobC <- &hashJob{addr, chunk, size, parentWg}: - case <-tc.quitC: - } -} - -func (tc *TreeChunker) runWorker(ctx context.Context) { - tc.incrementWorkerCount() - go func() { - defer tc.decrementWorkerCount() - for { - select { - - case job, ok := <-tc.jobC: - if !ok { - return - } - - h, err := tc.putter.Put(ctx, job.chunk) - if err != nil { - tc.errC <- err - return - } - copy(job.key, h) - job.parentWg.Done() - case <-tc.quitC: - return - } - } - }() -} - -// LazyChunkReader implements LazySectionReader -type LazyChunkReader struct { - ctx context.Context - addr Address // root address - chunkData ChunkData - off int64 // offset - chunkSize int64 // inherit from chunker - branches int64 // inherit from chunker - hashSize int64 // inherit from chunker - depth int - getter Getter -} - -func (tc *TreeChunker) Join(ctx context.Context) *LazyChunkReader { - return &LazyChunkReader{ - addr: tc.addr, - chunkSize: tc.chunkSize, - branches: tc.branches, - hashSize: tc.hashSize, - depth: tc.depth, - getter: tc.getter, - ctx: tc.ctx, - } -} - -func (r *LazyChunkReader) Context() context.Context { - return r.ctx -} - -// Size is meant to be called on the LazySectionReader -func (r *LazyChunkReader) Size(ctx context.Context, quitC chan bool) (n int64, err error) { - metrics.GetOrRegisterCounter("lazychunkreader.size", nil).Inc(1) - - var sp opentracing.Span - var cctx context.Context - cctx, sp = spancontext.StartSpan( - ctx, - "lcr.size") - defer sp.Finish() - - log.Debug("lazychunkreader.size", "addr", r.addr) - if r.chunkData == nil { - startTime := time.Now() - chunkData, err := r.getter.Get(cctx, Reference(r.addr)) - if err != nil { - metrics.GetOrRegisterResettingTimer("lcr.getter.get.err", nil).UpdateSince(startTime) - return 0, err - } - metrics.GetOrRegisterResettingTimer("lcr.getter.get", nil).UpdateSince(startTime) - r.chunkData = chunkData - } - - s := r.chunkData.Size() - log.Debug("lazychunkreader.size", "key", r.addr, "size", s) - - return int64(s), nil -} - -// read at can be called numerous times -// concurrent reads are allowed -// Size() needs to be called synchronously on the LazyChunkReader first -func (r *LazyChunkReader) ReadAt(b []byte, off int64) (read int, err error) { - metrics.GetOrRegisterCounter("lazychunkreader.readat", nil).Inc(1) - - var sp opentracing.Span - var cctx context.Context - cctx, sp = spancontext.StartSpan( - r.ctx, - "lcr.read") - defer sp.Finish() - - defer func() { - sp.LogFields( - olog.Int("off", int(off)), - olog.Int("read", read)) - }() - - // this is correct, a swarm doc cannot be zero length, so no EOF is expected - if len(b) == 0 { - return 0, nil - } - quitC := make(chan bool) - size, err := r.Size(cctx, quitC) - if err != nil { - log.Debug("lazychunkreader.readat.size", "size", size, "err", err) - return 0, err - } - - errC := make(chan error) - - // } - var treeSize int64 - var depth int - // calculate depth and max treeSize - treeSize = r.chunkSize - for ; treeSize < size; treeSize *= r.branches { - depth++ - } - wg := sync.WaitGroup{} - length := int64(len(b)) - for d := 0; d < r.depth; d++ { - off *= r.chunkSize - length *= r.chunkSize - } - wg.Add(1) - go r.join(b, off, off+length, depth, treeSize/r.branches, r.chunkData, &wg, errC, quitC) - go func() { - wg.Wait() - close(errC) - }() - - err = <-errC - if err != nil { - log.Debug("lazychunkreader.readat.errc", "err", err) - close(quitC) - return 0, err - } - if off+int64(len(b)) >= size { - log.Debug("lazychunkreader.readat.return at end", "size", size, "off", off) - return int(size - off), io.EOF - } - log.Debug("lazychunkreader.readat.errc", "buff", len(b)) - return len(b), nil -} - -func (r *LazyChunkReader) join(b []byte, off int64, eoff int64, depth int, treeSize int64, chunkData ChunkData, parentWg *sync.WaitGroup, errC chan error, quitC chan bool) { - defer parentWg.Done() - // find appropriate block level - for chunkData.Size() < uint64(treeSize) && depth > r.depth { - treeSize /= r.branches - depth-- - } - - // leaf chunk found - if depth == r.depth { - extra := 8 + eoff - int64(len(chunkData)) - if extra > 0 { - eoff -= extra - } - copy(b, chunkData[8+off:8+eoff]) - return // simply give back the chunks reader for content chunks - } - - // subtree - start := off / treeSize - end := (eoff + treeSize - 1) / treeSize - - // last non-leaf chunk can be shorter than default chunk size, let's not read it further then its end - currentBranches := int64(len(chunkData)-8) / r.hashSize - if end > currentBranches { - end = currentBranches - } - - wg := &sync.WaitGroup{} - defer wg.Wait() - for i := start; i < end; i++ { - soff := i * treeSize - roff := soff - seoff := soff + treeSize - - if soff < off { - soff = off - } - if seoff > eoff { - seoff = eoff - } - if depth > 1 { - wg.Wait() - } - wg.Add(1) - go func(j int64) { - childAddress := chunkData[8+j*r.hashSize : 8+(j+1)*r.hashSize] - startTime := time.Now() - chunkData, err := r.getter.Get(r.ctx, Reference(childAddress)) - if err != nil { - metrics.GetOrRegisterResettingTimer("lcr.getter.get.err", nil).UpdateSince(startTime) - log.Debug("lazychunkreader.join", "key", fmt.Sprintf("%x", childAddress), "err", err) - select { - case errC <- fmt.Errorf("chunk %v-%v not found; key: %s", off, off+treeSize, fmt.Sprintf("%x", childAddress)): - case <-quitC: - } - return - } - metrics.GetOrRegisterResettingTimer("lcr.getter.get", nil).UpdateSince(startTime) - if l := len(chunkData); l < 9 { - select { - case errC <- fmt.Errorf("chunk %v-%v incomplete; key: %s, data length %v", off, off+treeSize, fmt.Sprintf("%x", childAddress), l): - case <-quitC: - } - return - } - if soff < off { - soff = off - } - r.join(b[soff-off:seoff-off], soff-roff, seoff-roff, depth-1, treeSize/r.branches, chunkData, wg, errC, quitC) - }(i) - } //for -} - -// Read keeps a cursor so cannot be called simulateously, see ReadAt -func (r *LazyChunkReader) Read(b []byte) (read int, err error) { - log.Debug("lazychunkreader.read", "key", r.addr) - metrics.GetOrRegisterCounter("lazychunkreader.read", nil).Inc(1) - - read, err = r.ReadAt(b, r.off) - if err != nil && err != io.EOF { - log.Debug("lazychunkreader.readat", "read", read, "err", err) - metrics.GetOrRegisterCounter("lazychunkreader.read.err", nil).Inc(1) - } - - metrics.GetOrRegisterCounter("lazychunkreader.read.bytes", nil).Inc(int64(read)) - - r.off += int64(read) - return read, err -} - -// completely analogous to standard SectionReader implementation -var errWhence = errors.New("Seek: invalid whence") -var errOffset = errors.New("Seek: invalid offset") - -func (r *LazyChunkReader) Seek(offset int64, whence int) (int64, error) { - log.Debug("lazychunkreader.seek", "key", r.addr, "offset", offset) - switch whence { - default: - return 0, errWhence - case 0: - offset += 0 - case 1: - offset += r.off - case 2: - if r.chunkData == nil { //seek from the end requires rootchunk for size. call Size first - _, err := r.Size(context.TODO(), nil) - if err != nil { - return 0, fmt.Errorf("can't get size: %v", err) - } - } - offset += int64(r.chunkData.Size()) - } - - if offset < 0 { - return 0, errOffset - } - r.off = offset - return offset, nil -} diff --git a/swarm/storage/chunker_test.go b/swarm/storage/chunker_test.go deleted file mode 100644 index cfb7625e07b8..000000000000 --- a/swarm/storage/chunker_test.go +++ /dev/null @@ -1,467 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "bytes" - "context" - "encoding/binary" - "fmt" - "io" - "testing" - - "github.com/nebulaai/nbai-node/swarm/testutil" - "golang.org/x/crypto/sha3" -) - -/* -Tests TreeChunker by splitting and joining a random byte slice -*/ - -type test interface { - Fatalf(string, ...interface{}) - Logf(string, ...interface{}) -} - -type chunkerTester struct { - inputs map[uint64][]byte - t test -} - -func newTestHasherStore(store ChunkStore, hash string) *hasherStore { - return NewHasherStore(store, MakeHashFunc(hash), false) -} - -func testRandomBrokenData(n int, tester *chunkerTester) { - data := testutil.RandomReader(1, n) - brokendata := brokenLimitReader(data, n, n/2) - - buf := make([]byte, n) - _, err := brokendata.Read(buf) - if err == nil || err.Error() != "Broken reader" { - tester.t.Fatalf("Broken reader is not broken, hence broken. Returns: %v", err) - } - - data = testutil.RandomReader(2, n) - brokendata = brokenLimitReader(data, n, n/2) - - putGetter := newTestHasherStore(NewMapChunkStore(), SHA3Hash) - - expectedError := fmt.Errorf("Broken reader") - ctx := context.Background() - key, _, err := TreeSplit(ctx, brokendata, int64(n), putGetter) - if err == nil || err.Error() != expectedError.Error() { - tester.t.Fatalf("Not receiving the correct error! Expected %v, received %v", expectedError, err) - } - tester.t.Logf(" Address = %v\n", key) -} - -func testRandomData(usePyramid bool, hash string, n int, tester *chunkerTester) Address { - if tester.inputs == nil { - tester.inputs = make(map[uint64][]byte) - } - input, found := tester.inputs[uint64(n)] - var data io.Reader - if !found { - input = testutil.RandomBytes(1, n) - data = bytes.NewReader(input) - tester.inputs[uint64(n)] = input - } else { - data = io.LimitReader(bytes.NewReader(input), int64(n)) - } - - putGetter := newTestHasherStore(NewMapChunkStore(), hash) - - var addr Address - var wait func(context.Context) error - var err error - ctx := context.TODO() - if usePyramid { - addr, wait, err = PyramidSplit(ctx, data, putGetter, putGetter) - } else { - addr, wait, err = TreeSplit(ctx, data, int64(n), putGetter) - } - if err != nil { - tester.t.Fatalf(err.Error()) - } - tester.t.Logf(" Address = %v\n", addr) - err = wait(ctx) - if err != nil { - tester.t.Fatalf(err.Error()) - } - - reader := TreeJoin(ctx, addr, putGetter, 0) - output := make([]byte, n) - r, err := reader.Read(output) - if r != n || err != io.EOF { - tester.t.Fatalf("read error read: %v n = %v err = %v\n", r, n, err) - } - if input != nil { - if !bytes.Equal(output, input) { - tester.t.Fatalf("input and output mismatch\n IN: %v\nOUT: %v\n", input, output) - } - } - - // testing partial read - for i := 1; i < n; i += 10000 { - readableLength := n - i - r, err := reader.ReadAt(output, int64(i)) - if r != readableLength || err != io.EOF { - tester.t.Fatalf("readAt error with offset %v read: %v n = %v err = %v\n", i, r, readableLength, err) - } - if input != nil { - if !bytes.Equal(output[:readableLength], input[i:]) { - tester.t.Fatalf("input and output mismatch\n IN: %v\nOUT: %v\n", input[i:], output[:readableLength]) - } - } - } - - return addr -} - -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.NewLegacyKeccak256() - 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} - for i := range sizes { - n := sizes[i] - m := appendSizes[i] - - if tester.inputs == nil { - tester.inputs = make(map[uint64][]byte) - } - input, found := tester.inputs[uint64(n)] - var data io.Reader - if !found { - input = testutil.RandomBytes(i, n) - data = bytes.NewReader(input) - tester.inputs[uint64(n)] = input - } else { - data = io.LimitReader(bytes.NewReader(input), int64(n)) - } - - store := NewMapChunkStore() - putGetter := newTestHasherStore(store, SHA3Hash) - - ctx := context.TODO() - addr, wait, err := PyramidSplit(ctx, data, putGetter, putGetter) - if err != nil { - tester.t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - tester.t.Fatalf(err.Error()) - } - //create a append data stream - appendInput, found := tester.inputs[uint64(m)] - var appendData io.Reader - if !found { - appendInput = testutil.RandomBytes(i, m) - appendData = bytes.NewReader(appendInput) - tester.inputs[uint64(m)] = appendInput - } else { - appendData = io.LimitReader(bytes.NewReader(appendInput), int64(m)) - } - - putGetter = newTestHasherStore(store, SHA3Hash) - newAddr, wait, err := PyramidAppend(ctx, addr, appendData, putGetter, putGetter) - if err != nil { - tester.t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - tester.t.Fatalf(err.Error()) - } - - reader := TreeJoin(ctx, newAddr, putGetter, 0) - newOutput := make([]byte, n+m) - r, err := reader.Read(newOutput) - if r != (n + m) { - tester.t.Fatalf("read error read: %v n = %v m = %v err = %v\n", r, n, m, 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) - } - } -} - -func TestRandomData(t *testing.T) { - // This test can validate files up to a relatively short length, as tree chunker slows down drastically. - // Validation of longer files is done by TestLocalStoreAndRetrieve in swarm package. - //sizes := []int{1, 60, 83, 179, 253, 1024, 4095, 4096, 4097, 8191, 8192, 8193, 12287, 12288, 12289, 524288, 524288 + 1, 524288 + 4097, 7 * 524288, 7*524288 + 1, 7*524288 + 4097} - sizes := []int{1, 60, 83, 179, 253, 1024, 4095, 4097, 8191, 8192, 12288, 12289, 524288} - tester := &chunkerTester{t: t} - - for _, s := range sizes { - treeChunkerAddress := testRandomData(false, SHA3Hash, s, tester) - pyramidChunkerAddress := testRandomData(true, SHA3Hash, s, tester) - if treeChunkerAddress.String() != pyramidChunkerAddress.String() { - tester.t.Fatalf("tree chunker and pyramid chunker key mismatch for size %v\n TC: %v\n PC: %v\n", s, treeChunkerAddress.String(), pyramidChunkerAddress.String()) - } - } - - for _, s := range sizes { - treeChunkerAddress := testRandomData(false, BMTHash, s, tester) - pyramidChunkerAddress := testRandomData(true, BMTHash, s, tester) - if treeChunkerAddress.String() != pyramidChunkerAddress.String() { - tester.t.Fatalf("tree chunker and pyramid chunker key mismatch for size %v\n TC: %v\n PC: %v\n", s, treeChunkerAddress.String(), pyramidChunkerAddress.String()) - } - } -} - -func TestRandomBrokenData(t *testing.T) { - sizes := []int{1, 60, 83, 179, 253, 1024, 4095, 4096, 4097, 8191, 8192, 8193, 12287, 12288, 12289, 123456, 2345678} - tester := &chunkerTester{t: t} - for _, s := range sizes { - testRandomBrokenData(s, tester) - } -} - -func benchReadAll(reader LazySectionReader) { - size, _ := reader.Size(context.TODO(), nil) - output := make([]byte, 1000) - for pos := int64(0); pos < size; pos += 1000 { - reader.ReadAt(output, pos) - } -} - -func benchmarkSplitJoin(n int, t *testing.B) { - t.ReportAllocs() - for i := 0; i < t.N; i++ { - data := testutil.RandomReader(i, n) - - putGetter := newTestHasherStore(NewMapChunkStore(), SHA3Hash) - ctx := context.TODO() - key, wait, err := PyramidSplit(ctx, data, putGetter, putGetter) - if err != nil { - t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - t.Fatalf(err.Error()) - } - reader := TreeJoin(ctx, key, putGetter, 0) - benchReadAll(reader) - } -} - -func benchmarkSplitTreeSHA3(n int, t *testing.B) { - t.ReportAllocs() - for i := 0; i < t.N; i++ { - data := testutil.RandomReader(i, n) - putGetter := newTestHasherStore(&FakeChunkStore{}, SHA3Hash) - - ctx := context.Background() - _, wait, err := TreeSplit(ctx, data, int64(n), putGetter) - if err != nil { - t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - t.Fatalf(err.Error()) - } - - } -} - -func benchmarkSplitTreeBMT(n int, t *testing.B) { - t.ReportAllocs() - for i := 0; i < t.N; i++ { - data := testutil.RandomReader(i, n) - putGetter := newTestHasherStore(&FakeChunkStore{}, BMTHash) - - ctx := context.Background() - _, wait, err := TreeSplit(ctx, data, int64(n), putGetter) - if err != nil { - t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - t.Fatalf(err.Error()) - } - } -} - -func benchmarkSplitPyramidBMT(n int, t *testing.B) { - t.ReportAllocs() - for i := 0; i < t.N; i++ { - data := testutil.RandomReader(i, n) - putGetter := newTestHasherStore(&FakeChunkStore{}, BMTHash) - - ctx := context.Background() - _, wait, err := PyramidSplit(ctx, data, putGetter, putGetter) - if err != nil { - t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - t.Fatalf(err.Error()) - } - } -} - -func benchmarkSplitPyramidSHA3(n int, t *testing.B) { - t.ReportAllocs() - for i := 0; i < t.N; i++ { - data := testutil.RandomReader(i, n) - putGetter := newTestHasherStore(&FakeChunkStore{}, SHA3Hash) - - ctx := context.Background() - _, wait, err := PyramidSplit(ctx, data, putGetter, putGetter) - if err != nil { - t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - t.Fatalf(err.Error()) - } - } -} - -func benchmarkSplitAppendPyramid(n, m int, t *testing.B) { - t.ReportAllocs() - for i := 0; i < t.N; i++ { - data := testutil.RandomReader(i, n) - data1 := testutil.RandomReader(t.N+i, m) - - store := NewMapChunkStore() - putGetter := newTestHasherStore(store, SHA3Hash) - - ctx := context.Background() - key, wait, err := PyramidSplit(ctx, data, putGetter, putGetter) - if err != nil { - t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - t.Fatalf(err.Error()) - } - - putGetter = newTestHasherStore(store, SHA3Hash) - _, wait, err = PyramidAppend(ctx, key, data1, putGetter, putGetter) - if err != nil { - t.Fatalf(err.Error()) - } - err = wait(ctx) - if err != nil { - t.Fatalf(err.Error()) - } - } -} - -func BenchmarkSplitJoin_2(t *testing.B) { benchmarkSplitJoin(100, t) } -func BenchmarkSplitJoin_3(t *testing.B) { benchmarkSplitJoin(1000, t) } -func BenchmarkSplitJoin_4(t *testing.B) { benchmarkSplitJoin(10000, t) } -func BenchmarkSplitJoin_5(t *testing.B) { benchmarkSplitJoin(100000, t) } -func BenchmarkSplitJoin_6(t *testing.B) { benchmarkSplitJoin(1000000, t) } -func BenchmarkSplitJoin_7(t *testing.B) { benchmarkSplitJoin(10000000, t) } - -// func BenchmarkSplitJoin_8(t *testing.B) { benchmarkJoin(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 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) } - -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 BenchmarkSplitAppendPyramid_2(t *testing.B) { benchmarkSplitAppendPyramid(100, 1000, t) } -func BenchmarkSplitAppendPyramid_2h(t *testing.B) { benchmarkSplitAppendPyramid(500, 1000, t) } -func BenchmarkSplitAppendPyramid_3(t *testing.B) { benchmarkSplitAppendPyramid(1000, 1000, t) } -func BenchmarkSplitAppendPyramid_4(t *testing.B) { benchmarkSplitAppendPyramid(10000, 1000, t) } -func BenchmarkSplitAppendPyramid_4h(t *testing.B) { benchmarkSplitAppendPyramid(50000, 1000, t) } -func BenchmarkSplitAppendPyramid_5(t *testing.B) { benchmarkSplitAppendPyramid(1000000, 1000, t) } -func BenchmarkSplitAppendPyramid_6(t *testing.B) { benchmarkSplitAppendPyramid(1000000, 1000, t) } -func BenchmarkSplitAppendPyramid_7(t *testing.B) { benchmarkSplitAppendPyramid(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 deleted file mode 100644 index 6e09c9def375..000000000000 --- a/swarm/storage/common_test.go +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "bytes" - "context" - "flag" - "fmt" - "io" - "io/ioutil" - "os" - "sync" - "testing" - "time" - - "github.com/nebulaai/nbai-node/log" - ch "github.com/nebulaai/nbai-node/swarm/chunk" - "github.com/mattn/go-colorable" -) - -var ( - loglevel = flag.Int("loglevel", 3, "verbosity of logs") - getTimeout = 30 * time.Second -) - -func init() { - flag.Parse() - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) -} - -type brokenLimitedReader struct { - lr io.Reader - errAt int - off int - size int -} - -func brokenLimitReader(data io.Reader, size int, errAt int) *brokenLimitedReader { - return &brokenLimitedReader{ - lr: data, - errAt: errAt, - size: size, - } -} - -func newLDBStore(t *testing.T) (*LDBStore, func()) { - dir, err := ioutil.TempDir("", "bzz-storage-test") - if err != nil { - t.Fatal(err) - } - log.Trace("memstore.tempdir", "dir", dir) - - ldbparams := NewLDBStoreParams(NewDefaultStoreParams(), dir) - db, err := NewLDBStore(ldbparams) - if err != nil { - t.Fatal(err) - } - - cleanup := func() { - db.Close() - err := os.RemoveAll(dir) - if err != nil { - t.Fatal(err) - } - } - - return db, cleanup -} - -func mputRandomChunks(store ChunkStore, n int, chunksize int64) ([]Chunk, error) { - return mput(store, n, GenerateRandomChunk) -} - -func mput(store ChunkStore, n int, f func(i int64) Chunk) (hs []Chunk, err error) { - // put to localstore and wait for stored channel - // does not check delivery error state - errc := make(chan error) - ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer cancel() - for i := int64(0); i < int64(n); i++ { - chunk := f(ch.DefaultSize) - go func() { - select { - case errc <- store.Put(ctx, chunk): - case <-ctx.Done(): - } - }() - hs = append(hs, chunk) - } - - // wait for all chunks to be stored - for i := 0; i < n; i++ { - err := <-errc - if err != nil { - return nil, err - } - } - return hs, nil -} - -func mget(store ChunkStore, hs []Address, f func(h Address, chunk Chunk) error) error { - wg := sync.WaitGroup{} - wg.Add(len(hs)) - errc := make(chan error) - - for _, k := range hs { - go func(h Address) { - defer wg.Done() - // TODO: write timeout with context - chunk, err := store.Get(context.TODO(), h) - if err != nil { - errc <- err - return - } - if f != nil { - err = f(h, chunk) - if err != nil { - errc <- err - return - } - } - }(k) - } - go func() { - wg.Wait() - close(errc) - }() - var err error - select { - case err = <-errc: - case <-time.NewTimer(5 * time.Second).C: - err = fmt.Errorf("timed out after 5 seconds") - } - return err -} - -func (r *brokenLimitedReader) Read(buf []byte) (int, error) { - if r.off+len(buf) > r.errAt { - return 0, fmt.Errorf("Broken reader") - } - r.off += len(buf) - return r.lr.Read(buf) -} - -func testStoreRandom(m ChunkStore, n int, chunksize int64, t *testing.T) { - chunks, err := mputRandomChunks(m, n, chunksize) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - err = mget(m, chunkAddresses(chunks), nil) - if err != nil { - t.Fatalf("testStore failed: %v", err) - } -} - -func testStoreCorrect(m ChunkStore, n int, chunksize int64, t *testing.T) { - chunks, err := mputRandomChunks(m, n, chunksize) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } - f := func(h Address, chunk Chunk) error { - if !bytes.Equal(h, chunk.Address()) { - return fmt.Errorf("key does not match retrieved chunk Address") - } - hasher := MakeHashFunc(DefaultHash)() - data := chunk.Data() - hasher.ResetWithLength(data[:8]) - hasher.Write(data[8:]) - exp := hasher.Sum(nil) - if !bytes.Equal(h, exp) { - return fmt.Errorf("key is not hash of chunk data") - } - return nil - } - err = mget(m, chunkAddresses(chunks), f) - if err != nil { - t.Fatalf("testStore failed: %v", err) - } -} - -func benchmarkStorePut(store ChunkStore, n int, chunksize int64, b *testing.B) { - chunks := make([]Chunk, n) - i := 0 - f := func(dataSize int64) Chunk { - chunk := GenerateRandomChunk(dataSize) - chunks[i] = chunk - i++ - return chunk - } - - mput(store, n, f) - - f = func(dataSize int64) Chunk { - chunk := chunks[i] - i++ - return chunk - } - - b.ReportAllocs() - b.ResetTimer() - - for j := 0; j < b.N; j++ { - i = 0 - mput(store, n, f) - } -} - -func benchmarkStoreGet(store ChunkStore, n int, chunksize int64, b *testing.B) { - chunks, err := mputRandomChunks(store, n, chunksize) - if err != nil { - b.Fatalf("expected no error, got %v", err) - } - b.ReportAllocs() - b.ResetTimer() - addrs := chunkAddresses(chunks) - for i := 0; i < b.N; i++ { - err := mget(store, addrs, nil) - if err != nil { - b.Fatalf("mget failed: %v", err) - } - } -} - -// MapChunkStore is a very simple ChunkStore implementation to store chunks in a map in memory. -type MapChunkStore struct { - chunks map[string]Chunk - mu sync.RWMutex -} - -func NewMapChunkStore() *MapChunkStore { - return &MapChunkStore{ - chunks: make(map[string]Chunk), - } -} - -func (m *MapChunkStore) Put(_ context.Context, ch Chunk) error { - m.mu.Lock() - defer m.mu.Unlock() - m.chunks[ch.Address().Hex()] = ch - return nil -} - -func (m *MapChunkStore) Get(_ context.Context, ref Address) (Chunk, error) { - m.mu.RLock() - defer m.mu.RUnlock() - chunk := m.chunks[ref.Hex()] - if chunk == nil { - return nil, ErrChunkNotFound - } - return chunk, nil -} - -func (m *MapChunkStore) Close() { -} - -func chunkAddresses(chunks []Chunk) []Address { - addrs := make([]Address, len(chunks)) - for i, ch := range chunks { - addrs[i] = ch.Address() - } - return addrs -} diff --git a/swarm/storage/database.go b/swarm/storage/database.go deleted file mode 100644 index 080cc421e71e..000000000000 --- a/swarm/storage/database.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -// this is a clone of an earlier state of the ethereum ethdb/database -// no need for queueing/caching - -import ( - "github.com/nebulaai/nbai-node/metrics" - "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" -) - -const openFileLimit = 128 - -type LDBDatabase struct { - db *leveldb.DB -} - -func NewLDBDatabase(file string) (*LDBDatabase, error) { - // Open the db - db, err := leveldb.OpenFile(file, &opt.Options{OpenFilesCacheCapacity: openFileLimit}) - if err != nil { - return nil, err - } - - database := &LDBDatabase{db: db} - - return database, nil -} - -func (db *LDBDatabase) Put(key []byte, value []byte) error { - metrics.GetOrRegisterCounter("ldbdatabase.put", nil).Inc(1) - - return db.db.Put(key, value, nil) -} - -func (db *LDBDatabase) Get(key []byte) ([]byte, error) { - metrics.GetOrRegisterCounter("ldbdatabase.get", nil).Inc(1) - - dat, err := db.db.Get(key, nil) - if err != nil { - return nil, err - } - return dat, nil -} - -func (db *LDBDatabase) Delete(key []byte) error { - return db.db.Delete(key, nil) -} - -func (db *LDBDatabase) NewIterator() iterator.Iterator { - metrics.GetOrRegisterCounter("ldbdatabase.newiterator", nil).Inc(1) - - return db.db.NewIterator(nil, nil) -} - -func (db *LDBDatabase) Write(batch *leveldb.Batch) error { - metrics.GetOrRegisterCounter("ldbdatabase.write", nil).Inc(1) - - return db.db.Write(batch, nil) -} - -func (db *LDBDatabase) Close() { - // Close the leveldb database - db.db.Close() -} diff --git a/swarm/storage/encryption/encryption.go b/swarm/storage/encryption/encryption.go deleted file mode 100644 index 6fbdab062b33..000000000000 --- a/swarm/storage/encryption/encryption.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright 2018 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 encryption - -import ( - "crypto/rand" - "encoding/binary" - "fmt" - "hash" - "sync" -) - -const KeyLength = 32 - -type Key []byte - -type Encryption interface { - Encrypt(data []byte) ([]byte, error) - Decrypt(data []byte) ([]byte, error) -} - -type encryption struct { - key Key // the encryption key (hashSize bytes long) - keyLen int // length of the key = length of blockcipher block - padding int // encryption will pad the data upto this if > 0 - initCtr uint32 // initial counter used for counter mode blockcipher - hashFunc func() hash.Hash // hasher constructor function -} - -// New constructs a new encryptor/decryptor -func New(key Key, padding int, initCtr uint32, hashFunc func() hash.Hash) *encryption { - return &encryption{ - key: key, - keyLen: len(key), - padding: padding, - initCtr: initCtr, - hashFunc: hashFunc, - } -} - -// Encrypt encrypts the data and does padding if specified -func (e *encryption) Encrypt(data []byte) ([]byte, error) { - length := len(data) - outLength := length - isFixedPadding := e.padding > 0 - if isFixedPadding { - if length > e.padding { - return nil, fmt.Errorf("Data length longer than padding, data length %v padding %v", length, e.padding) - } - outLength = e.padding - } - out := make([]byte, outLength) - e.transform(data, out) - return out, nil -} - -// Decrypt decrypts the data, if padding was used caller must know original length and truncate -func (e *encryption) Decrypt(data []byte) ([]byte, error) { - length := len(data) - if e.padding > 0 && length != e.padding { - return nil, fmt.Errorf("Data length different than padding, data length %v padding %v", length, e.padding) - } - out := make([]byte, length) - e.transform(data, out) - return out, nil -} - -// -func (e *encryption) transform(in, out []byte) { - inLength := len(in) - wg := sync.WaitGroup{} - wg.Add((inLength-1)/e.keyLen + 1) - for i := 0; i < inLength; i += e.keyLen { - l := min(e.keyLen, inLength-i) - // call transformations per segment (asyncronously) - go func(i int, x, y []byte) { - defer wg.Done() - e.Transcrypt(i, x, y) - }(i/e.keyLen, in[i:i+l], out[i:i+l]) - } - // pad the rest if out is longer - pad(out[inLength:]) - wg.Wait() -} - -// used for segmentwise transformation -// if in is shorter than out, padding is used -func (e *encryption) Transcrypt(i int, in []byte, out []byte) { - // first hash key with counter (initial counter + i) - hasher := e.hashFunc() - hasher.Write(e.key) - - ctrBytes := make([]byte, 4) - binary.LittleEndian.PutUint32(ctrBytes, uint32(i)+e.initCtr) - hasher.Write(ctrBytes) - - ctrHash := hasher.Sum(nil) - hasher.Reset() - - // second round of hashing for selective disclosure - hasher.Write(ctrHash) - segmentKey := hasher.Sum(nil) - hasher.Reset() - - // XOR bytes uptil length of in (out must be at least as long) - inLength := len(in) - for j := 0; j < inLength; j++ { - out[j] = in[j] ^ segmentKey[j] - } - // insert padding if out is longer - pad(out[inLength:]) -} - -func pad(b []byte) { - l := len(b) - for total := 0; total < l; { - read, _ := rand.Read(b[total:]) - total += read - } -} - -// GenerateRandomKey generates a random key of length l -func GenerateRandomKey(l int) Key { - key := make([]byte, l) - var total int - for total < l { - read, _ := rand.Read(key[total:]) - total += read - } - return key -} - -func min(x, y int) int { - if x < y { - return x - } - return y -} diff --git a/swarm/storage/encryption/encryption_test.go b/swarm/storage/encryption/encryption_test.go deleted file mode 100644 index 69a701837946..000000000000 --- a/swarm/storage/encryption/encryption_test.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2018 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 encryption - -import ( - "bytes" - "testing" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/swarm/testutil" - "golang.org/x/crypto/sha3" -) - -var expectedTransformedHex = "352187af3a843decc63ceca6cb01ea39dbcf77caf0a8f705f5c30d557044ceec9392b94a79376f1e5c10cd0c0f2a98e5353bf22b3ea4fdac6677ee553dec192e3db64e179d0474e96088fb4abd2babd67de123fb398bdf84d818f7bda2c1ab60b3ea0e0569ae54aa969658eb4844e6960d2ff44d7c087ee3aaffa1c0ee5df7e50b615f7ad90190f022934ad5300c7d1809bfe71a11cc04cece5274eb97a5f20350630522c1dbb7cebaf4f97f84e03f5cfd88f2b48880b25d12f4d5e75c150f704ef6b46c72e07db2b705ac3644569dccd22fd8f964f6ef787fda63c46759af334e6f665f70eac775a7017acea49f3c7696151cb1b9434fa4ac27fb803921ffb5ec58dafa168098d7d5b97e384be3384cf5bc235c3d887fef89fe76c0065f9b8d6ad837b442340d9e797b46ef5709ea3358bc415df11e4830de986ef0f1c418ffdcc80e9a3cda9bea0ab5676c0d4240465c43ba527e3b4ea50b4f6255b510e5d25774a75449b0bd71e56c537ade4fcf0f4d63c99ae1dbb5a844971e2c19941b8facfcfc8ee3056e7cb3c7114c5357e845b52f7103cb6e00d2308c37b12baa5b769e1cc7b00fc06f2d16e70cc27a82cb9c1a4e40cb0d43907f73df2c9db44f1b51a6b0bc6d09f77ac3be14041fae3f9df2da42df43ae110904f9ecee278030185254d7c6e918a5512024d047f77a992088cb3190a6587aa54d0c7231c1cd2e455e0d4c07f74bece68e29cd8ba0190c0bcfb26d24634af5d91a81ef5d4dd3d614836ce942ddbf7bb1399317f4c03faa675f325f18324bf9433844bfe5c4cc04130c8d5c329562b7cd66e72f7355de8f5375a72202971613c32bd7f3fcdcd51080758cd1d0a46dbe8f0374381dbc359f5864250c63dde8131cbd7c98ae2b0147d6ea4bf65d1443d511b18e6d608bbb46ac036353b4c51df306a10a6f6939c38629a5c18aaf89cac04bd3ad5156e6b92011c88341cb08551bab0a89e6a46538f5af33b86121dba17e3a434c273f385cd2e8cb90bdd32747d8425d929ccbd9b0815c73325988855549a8489dfd047daf777aaa3099e54cf997175a5d9e1edfe363e3b68c70e02f6bf4fcde6a0f3f7d0e7e98bde1a72ae8b6cd27b32990680cc4a04fc467f41c5adcaddabfc71928a3f6872c360c1d765260690dd28b269864c8e380d9c92ef6b89b0094c8f9bb22608b4156381b19b920e9583c9616ce5693b4d2a6c689f02e6a91584a8e501e107403d2689dd0045269dd9946c0e969fb656a3b39d84a798831f5f9290f163eb2f97d3ae25071324e95e2256d9c1e56eb83c26397855323edc202d56ad05894333b7f0ed3c1e4734782eb8bd5477242fd80d7a89b12866f85cfae476322f032465d6b1253993033fccd4723530630ab97a1566460af9c90c9da843c229406e65f3fa578bd6bf04dee9b6153807ddadb8ceefc5c601a8ab26023c67b1ab1e8e0f29ce94c78c308005a781853e7a2e0e51738939a657c987b5e611f32f47b5ff461c52e63e0ea390515a8e1f5393dae54ea526934b5f310b76e3fa050e40718cb4c8a20e58946d6ee1879f08c52764422fe542b3240e75eccb7aa75b1f8a651e37a3bc56b0932cdae0e985948468db1f98eb4b77b82081ea25d8a762db00f7898864984bd80e2f3f35f236bf57291dec28f550769943bcfb6f884b7687589b673642ef7fe5d7d5a87d3eca5017f83ccb9a3310520474479464cb3f433440e7e2f1e28c0aef700a45848573409e7ab66e0cfd4fe5d2147ace81bc65fd8891f6245cd69246bbf5c27830e5ab882dd1d02aba34ff6ca9af88df00fd602892f02fedbdc65dedec203faf3f8ff4a97314e0ddb58b9ab756a61a562597f4088b445fcc3b28a708ca7b1485dcd791b779fbf2b3ef1ec5c6205f595fbe45a02105034147e5a146089c200a49dae33ae051a08ea5f974a21540aaeffa7f9d9e3d35478016fb27b871036eb27217a5b834b461f535752fb5f1c8dded3ae14ce3a2ef6639e2fe41939e3509e46e347a95d50b2080f1ba42c804b290ddc912c952d1cec3f2661369f738feacc0dbf1ea27429c644e45f9e26f30c341acd34c7519b2a1663e334621691e810767e9918c2c547b2e23cce915f97d26aac8d0d2fcd3edb7986ad4e2b8a852edebad534cb6c0e9f0797d3563e5409d7e068e48356c67ce519246cd9c560e881453df97cbba562018811e6cf8c327f399d1d1253ab47a19f4a0ccc7c6d86a9603e0551da310ea595d71305c4aad96819120a92cdbaf1f77ec8df9cc7c838c0d4de1e8692dd81da38268d1d71324bcffdafbe5122e4b81828e021e936d83ae8021eac592aa52cd296b5ce392c7173d622f8e07d18f59bb1b08ba15211af6703463b09b593af3c37735296816d9f2e7a369354a5374ea3955e14ca8ac56d5bfe4aef7a21bd825d6ae85530bee5d2aaaa4914981b3dfdb2e92ec2a27c83d74b59e84ff5c056f7d8945745f2efc3dcf28f288c6cd8383700fb2312f7001f24dd40015e436ae23e052fe9070ea9535b9c989898a9bda3d5382cf10e432fae6ccf0c825b3e6436edd3a9f8846e5606f8563931b5f29ba407c5236e5730225dda211a8504ec1817bc935e1fd9a532b648c502df302ed2063aed008fd5676131ac9e95998e9447b02bd29d77e38fcfd2959f2de929b31970335eb2a74348cc6918bc35b9bf749eab0fe304c946cd9e1ca284e6853c42646e60b6b39e0d3fb3c260abfc5c1b4ca3c3770f344118ca7c7f5c1ad1f123f8f369cd60afc3cdb3e9e81968c5c9fa7c8b014ffe0508dd4f0a2a976d5d1ca8fc9ad7a237d92cfe7b41413d934d6e142824b252699397e48e4bac4e91ebc10602720684bd0863773c548f9a2f9724245e47b129ecf65afd7252aac48c8a8d6fd3d888af592a01fb02dc71ed7538a700d3d16243e4621e0fcf9f8ed2b4e11c9fa9a95338bb1dac74a7d9bc4eb8cbf900b634a2a56469c00f5994e4f0934bdb947640e6d67e47d0b621aacd632bfd3c800bd7d93bd329f494a90e06ed51535831bd6e07ac1b4b11434ef3918fa9511813a002913f33f836454798b8d1787fea9a4c4743ba091ed192ed92f4d33e43a226bf9503e1a83a16dd340b3cbbf38af6db0d99201da8de529b4225f3d2fa2aad6621afc6c79ef3537720591edfc681ae6d00ede53ed724fc71b23b90d2e9b7158aaee98d626a4fe029107df2cb5f90147e07ebe423b1519d848af18af365c71bfd0665db46be493bbe99b79a188de0cf3594aef2299f0324075bdce9eb0b87bc29d62401ba4fd6ae48b1ba33261b5b845279becf38ee03e3dc5c45303321c5fac96fd02a3ad8c9e3b02127b320501333c9e6360440d1ad5e64a6239501502dde1a49c9abe33b66098458eee3d611bb06ffcd234a1b9aef4af5021cd61f0de6789f822ee116b5078aae8c129e8391d8987500d322b58edd1595dc570b57341f2df221b94a96ab7fbcf32a8ca9684196455694024623d7ed49f7d66e8dd453c0bae50e0d8b34377b22d0ece059e2c385dfc70b9089fcd27577c51f4d870b5738ee2b68c361a67809c105c7848b68860a829f29930857a9f9d40b14fd2384ac43bafdf43c0661103794c4bd07d1cfdd4681b6aeaefad53d4c1473359bcc5a83b09189352e5bb9a7498dd0effb89c35aad26954551f8b0621374b449bf515630bd3974dca982279733470fdd059aa9c3df403d8f22b38c4709c82d8f12b888e22990350490e16179caf406293cc9e65f116bafcbe96af132f679877061107a2f690a82a8cb46eea57a90abd23798c5937c6fe6b17be3f9bfa01ce117d2c268181b9095bf49f395fea07ca03838de0588c5e2db633e836d64488c1421e653ea52d810d096048c092d0da6e02fa6613890219f51a76148c8588c2487b171a28f17b7a299204874af0131725d793481333be5f08e86ca837a226850b0c1060891603bfecf9e55cddd22c0dbb28d495342d9cc3de8409f72e52a0115141cffe755c74f061c1a770428ccb0ae59536ee6fc074fbfc6cacb51a549d327527e20f8407477e60355863f1153f9ce95641198663c968874e7fdb29407bd771d94fdda8180cbb0358f5874738db705924b8cbe0cd5e1484aeb64542fe8f38667b7c34baf818c63b1e18440e9fba575254d063fd49f24ef26432f4eb323f3836972dca87473e3e9bb26dc3be236c3aae6bc8a6da567442309da0e8450e242fc9db836e2964f2c76a3b80a2c677979882dda7d7ebf62c93664018bcf4ec431fe6b403d49b3b36618b9c07c2d0d4569cb8d52223903debc72ec113955b206c34f1ae5300990ccfc0180f47d91afdb542b6312d12aeff7e19c645dc0b9fe6e3288e9539f6d5870f99882df187bfa6d24d179dfd1dac22212c8b5339f7171a3efc15b760fed8f68538bc5cbd845c2d1ab41f3a6c692820653eaef7930c02fbe6061d93805d73decdbb945572a7c44ed0241982a6e4d2d730898f82b3d9877cb7bca41cc6dcee67aa0c3d6db76f0b0a708ace0031113e48429de5d886c10e9200f68f32263a2fbf44a5992c2459fda7b8796ba796e3a0804fc25992ed2c9a5fe0580a6b809200ecde6caa0364b58be11564dcb9a616766dd7906db5636ee708b0204f38d309466d8d4a162965dd727e29f5a6c133e9b4ed5bafe803e479f9b2a7640c942c4a40b14ac7dc9828546052761a070f6404008f1ec3605836339c3da95a00b4fd81b2cabf88b51d2087d5b83e8c5b69bf96d8c72cbd278dad3bbb42b404b436f84ad688a22948adf60a81090f1e904291503c16e9f54b05fc76c881a5f95f0e732949e95d3f1bae2d3652a14fe0dda2d68879604657171856ef72637def2a96ac47d7b3fe86eb3198f5e0e626f06be86232305f2ae79ffcd2725e48208f9d8d63523f81915acc957563ab627cd6bc68c2a37d59fb0ed77a90aa9d085d6914a8ebada22a2c2d471b5163aeddd799d90fbb10ed6851ace2c4af504b7d572686700a59d6db46d5e42bb83f8e0c0ffe1dfa6582cc0b34c921ff6e85e83188d24906d5c08bb90069639e713051b3102b53e6f703e8210017878add5df68e6f2b108de279c5490e9eef5590185c4a1c744d4e00d244e1245a8805bd30407b1bc488db44870ccfd75a8af104df78efa2fb7ba31f048a263efdb3b63271fff4922bece9a71187108f65744a24f4947dc556b7440cb4fa45d296bb7f724588d1f245125b21ea063500029bd49650237f53899daf1312809552c81c5827341263cc807a29fe84746170cdfa1ff3838399a5645319bcaff674bb70efccdd88b3d3bb2f2d98111413585dc5d5bd5168f43b3f55e58972a5b2b9b3733febf02f931bd436648cb617c3794841aab961fe41277ab07812e1d3bc4ff6f4350a3e615bfba08c3b9480ef57904d3a16f7e916345202e3f93d11f7a7305170cb8c4eb9ac88ace8bbd1f377bdd5855d3162d6723d4435e84ce529b8f276a8927915ac759a0d04e5ca4a9d3da6291f0333b475df527e99fe38f7a4082662e8125936640c26dd1d17cf284ce6e2b17777a05aa0574f7793a6a062cc6f7263f7ab126b4528a17becfdec49ac0f7d8705aa1704af97fb861faa8a466161b2b5c08a5bacc79fe8500b913d65c8d3c52d1fd52d2ab2c9f52196e712455619c1cd3e0f391b274487944240e2ed8858dd0823c801094310024ae3fe4dd1cf5a2b6487b42cc5937bbafb193ee331d87e378258963d49b9da90899bbb4b88e79f78e866b0213f4719f67da7bcc2fce073c01e87c62ea3cdbcd589cfc41281f2f4c757c742d6d1e" - -var hashFunc = sha3.NewLegacyKeccak256 -var testKey Key - -func init() { - var err error - testKey, err = hexutil.Decode("0x8abf1502f557f15026716030fb6384792583daf39608a3cd02ff2f47e9bc6e49") - if err != nil { - panic(err.Error()) - } -} - -func TestEncryptDataLongerThanPadding(t *testing.T) { - enc := New(testKey, 4095, uint32(0), hashFunc) - - data := make([]byte, 4096) - - expectedError := "Data length longer than padding, data length 4096 padding 4095" - - _, err := enc.Encrypt(data) - if err == nil || err.Error() != expectedError { - t.Fatalf("Expected error \"%v\" got \"%v\"", expectedError, err) - } -} - -func TestEncryptDataZeroPadding(t *testing.T) { - enc := New(testKey, 0, uint32(0), hashFunc) - - data := make([]byte, 2048) - - encrypted, err := enc.Encrypt(data) - if err != nil { - t.Fatalf("Expected no error got %v", err) - } - if len(encrypted) != 2048 { - t.Fatalf("Encrypted data length expected \"%v\" got %v", 2048, len(encrypted)) - } -} - -func TestEncryptDataLengthEqualsPadding(t *testing.T) { - enc := New(testKey, 4096, uint32(0), hashFunc) - - data := make([]byte, 4096) - - encrypted, err := enc.Encrypt(data) - if err != nil { - t.Fatalf("Expected no error got %v", err) - } - encryptedHex := common.Bytes2Hex(encrypted) - expectedTransformed := common.Hex2Bytes(expectedTransformedHex) - - if !bytes.Equal(encrypted, expectedTransformed) { - t.Fatalf("Expected %v got %v", expectedTransformedHex, encryptedHex) - } -} - -func TestEncryptDataLengthSmallerThanPadding(t *testing.T) { - enc := New(testKey, 4096, uint32(0), hashFunc) - - data := make([]byte, 4080) - - encrypted, err := enc.Encrypt(data) - if err != nil { - t.Fatalf("Expected no error got %v", err) - } - if len(encrypted) != 4096 { - t.Fatalf("Encrypted data length expected %v got %v", 4096, len(encrypted)) - } -} - -func TestEncryptDataCounterNonZero(t *testing.T) { - // TODO -} - -func TestDecryptDataLengthNotEqualsPadding(t *testing.T) { - enc := New(testKey, 4096, uint32(0), hashFunc) - - data := make([]byte, 4097) - - expectedError := "Data length different than padding, data length 4097 padding 4096" - - _, err := enc.Decrypt(data) - if err == nil || err.Error() != expectedError { - t.Fatalf("Expected error \"%v\" got \"%v\"", expectedError, err) - } -} - -func TestEncryptDecryptIsIdentity(t *testing.T) { - testEncryptDecryptIsIdentity(t, 2048, 0, 2048, 32) - testEncryptDecryptIsIdentity(t, 4096, 0, 4096, 32) - testEncryptDecryptIsIdentity(t, 4096, 0, 1000, 32) - testEncryptDecryptIsIdentity(t, 32, 10, 32, 32) -} - -func testEncryptDecryptIsIdentity(t *testing.T, padding int, initCtr uint32, dataLength int, keyLength int) { - key := GenerateRandomKey(keyLength) - enc := New(key, padding, initCtr, hashFunc) - - data := testutil.RandomBytes(1, dataLength) - - encrypted, err := enc.Encrypt(data) - if err != nil { - t.Fatalf("Expected no error got %v", err) - } - - decrypted, err := enc.Decrypt(encrypted) - if err != nil { - t.Fatalf("Expected no error got %v", err) - } - if len(decrypted) != padding { - t.Fatalf("Expected decrypted data length %v got %v", padding, len(decrypted)) - } - - // we have to remove the extra bytes which were randomly added to fill until padding - if len(data) < padding { - decrypted = decrypted[:len(data)] - } - - if !bytes.Equal(data, decrypted) { - t.Fatalf("Expected decrypted %v got %v", common.Bytes2Hex(data), common.Bytes2Hex(decrypted)) - } -} diff --git a/swarm/storage/error.go b/swarm/storage/error.go deleted file mode 100644 index a9d0616fada6..000000000000 --- a/swarm/storage/error.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2018 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 ( - "errors" -) - -const ( - ErrInit = iota - ErrNotFound - ErrUnauthorized - ErrInvalidValue - ErrDataOverflow - ErrNothingToReturn - ErrInvalidSignature - ErrNotSynced -) - -var ( - ErrChunkNotFound = errors.New("chunk not found") - ErrChunkInvalid = errors.New("invalid chunk") -) diff --git a/swarm/storage/feed/binaryserializer.go b/swarm/storage/feed/binaryserializer.go deleted file mode 100644 index 562bb0e07ae9..000000000000 --- a/swarm/storage/feed/binaryserializer.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2018 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 feed - -import "github.com/nebulaai/nbai-node/common/hexutil" - -type binarySerializer interface { - binaryPut(serializedData []byte) error - binaryLength() int - binaryGet(serializedData []byte) error -} - -// Values interface represents a string key-value store -// useful for building query strings -type Values interface { - Get(key string) string - Set(key, value string) -} - -type valueSerializer interface { - FromValues(values Values) error - AppendValues(values Values) -} - -// Hex serializes the structure and converts it to a hex string -func Hex(bin binarySerializer) string { - b := make([]byte, bin.binaryLength()) - bin.binaryPut(b) - return hexutil.Encode(b) -} diff --git a/swarm/storage/feed/binaryserializer_test.go b/swarm/storage/feed/binaryserializer_test.go deleted file mode 100644 index 80d265198981..000000000000 --- a/swarm/storage/feed/binaryserializer_test.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "encoding/json" - "reflect" - "testing" - - "github.com/nebulaai/nbai-node/common/hexutil" -) - -// KV mocks a key value store -type KV map[string]string - -func (kv KV) Get(key string) string { - return kv[key] -} -func (kv KV) Set(key, value string) { - kv[key] = value -} - -func compareByteSliceToExpectedHex(t *testing.T, variableName string, actualValue []byte, expectedHex string) { - if hexutil.Encode(actualValue) != expectedHex { - t.Fatalf("%s: Expected %s to be %s, got %s", t.Name(), variableName, expectedHex, hexutil.Encode(actualValue)) - } -} - -func testBinarySerializerRecovery(t *testing.T, bin binarySerializer, expectedHex string) { - name := reflect.TypeOf(bin).Elem().Name() - serialized := make([]byte, bin.binaryLength()) - if err := bin.binaryPut(serialized); err != nil { - t.Fatalf("%s.binaryPut error when trying to serialize structure: %s", name, err) - } - - compareByteSliceToExpectedHex(t, name, serialized, expectedHex) - - recovered := reflect.New(reflect.TypeOf(bin).Elem()).Interface().(binarySerializer) - if err := recovered.binaryGet(serialized); err != nil { - t.Fatalf("%s.binaryGet error when trying to deserialize structure: %s", name, err) - } - - if !reflect.DeepEqual(bin, recovered) { - t.Fatalf("Expected that the recovered %s equals the marshalled %s", name, name) - } - - serializedWrongLength := make([]byte, 1) - copy(serializedWrongLength[:], serialized) - if err := recovered.binaryGet(serializedWrongLength); err == nil { - t.Fatalf("Expected %s.binaryGet to fail since data is too small", name) - } -} - -func testBinarySerializerLengthCheck(t *testing.T, bin binarySerializer) { - name := reflect.TypeOf(bin).Elem().Name() - // make a slice that is too small to contain the metadata - serialized := make([]byte, bin.binaryLength()-1) - - if err := bin.binaryPut(serialized); err == nil { - t.Fatalf("Expected %s.binaryPut to fail, since target slice is too small", name) - } -} - -func testValueSerializer(t *testing.T, v valueSerializer, expected KV) { - name := reflect.TypeOf(v).Elem().Name() - kv := make(KV) - - v.AppendValues(kv) - if !reflect.DeepEqual(expected, kv) { - expj, _ := json.Marshal(expected) - gotj, _ := json.Marshal(kv) - t.Fatalf("Expected %s.AppendValues to return %s, got %s", name, string(expj), string(gotj)) - } - - recovered := reflect.New(reflect.TypeOf(v).Elem()).Interface().(valueSerializer) - err := recovered.FromValues(kv) - if err != nil { - t.Fatal(err) - } - - if !reflect.DeepEqual(recovered, v) { - t.Fatalf("Expected recovered %s to be the same", name) - } -} diff --git a/swarm/storage/feed/cacheentry.go b/swarm/storage/feed/cacheentry.go deleted file mode 100644 index d8146c8956fb..000000000000 --- a/swarm/storage/feed/cacheentry.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "bytes" - "context" - "time" - - "github.com/nebulaai/nbai-node/swarm/storage" -) - -const ( - hasherCount = 8 - feedsHashAlgorithm = storage.SHA3Hash - defaultRetrieveTimeout = 100 * time.Millisecond -) - -// cacheEntry caches the last known update of a specific Swarm feed. -type cacheEntry struct { - Update - *bytes.Reader - lastKey storage.Address -} - -// implements storage.LazySectionReader -func (r *cacheEntry) Size(ctx context.Context, _ chan bool) (int64, error) { - return int64(len(r.Update.data)), nil -} - -//returns the feed's topic -func (r *cacheEntry) Topic() Topic { - return r.Feed.Topic -} diff --git a/swarm/storage/feed/doc.go b/swarm/storage/feed/doc.go deleted file mode 100644 index 1f07948f2119..000000000000 --- a/swarm/storage/feed/doc.go +++ /dev/null @@ -1,43 +0,0 @@ -/* -Package feeds defines Swarm Feeds. - -Swarm Feeds allows a user to build an update feed about a particular topic -without resorting to ENS on each update. -The update scheme is built on swarm chunks with chunk keys following -a predictable, versionable pattern. - -A Feed is tied to a unique identifier that is deterministically generated out of -the chosen topic. - -A Feed is defined as the series of updates of a specific user about a particular topic - -Actual data updates are also made in the form of swarm chunks. The keys -of the updates are the hash of a concatenation of properties as follows: - -updateAddr = H(Feed, Epoch ID) -where H is the SHA3 hash function -Feed is the combination of Topic and the user address -Epoch ID is a time slot. See the lookup package for more information. - -A user looking up a the latest update in a Feed only needs to know the Topic -and the other user's address. - -The Feed Update data is: -updatedata = Feed|Epoch|data - -The full update data that goes in the chunk payload is: -updatedata|sign(updatedata) - -Structure Summary: - -Request: Feed Update with signature - Update: headers + data - Header: Protocol version and reserved for future use placeholders - ID: Information about how to locate a specific update - Feed: Represents a user's series of publications about a specific Topic - Topic: Item that the updates are about - User: User who updates the Feed - Epoch: time slot where the update is stored - -*/ -package feed diff --git a/swarm/storage/feed/error.go b/swarm/storage/feed/error.go deleted file mode 100644 index 206ba3316fa1..000000000000 --- a/swarm/storage/feed/error.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "fmt" -) - -const ( - ErrInit = iota - ErrNotFound - ErrIO - ErrUnauthorized - ErrInvalidValue - ErrDataOverflow - ErrNothingToReturn - ErrCorruptData - ErrInvalidSignature - ErrNotSynced - ErrPeriodDepth - ErrCnt -) - -// Error is a the typed error object used for Swarm feeds -type Error struct { - code int - err string -} - -// Error implements the error interface -func (e *Error) Error() string { - return e.err -} - -// Code returns the error code -// Error codes are enumerated in the error.go file within the feeds package -func (e *Error) Code() int { - return e.code -} - -// NewError creates a new Swarm feeds Error object with the specified code and custom error message -func NewError(code int, s string) error { - if code < 0 || code >= ErrCnt { - panic("no such error code!") - } - r := &Error{ - err: s, - } - switch code { - case ErrNotFound, ErrIO, ErrUnauthorized, ErrInvalidValue, ErrDataOverflow, ErrNothingToReturn, ErrInvalidSignature, ErrNotSynced, ErrPeriodDepth, ErrCorruptData: - r.code = code - } - return r -} - -// NewErrorf is a convenience version of NewError that incorporates printf-style formatting -func NewErrorf(code int, format string, args ...interface{}) error { - return NewError(code, fmt.Sprintf(format, args...)) -} diff --git a/swarm/storage/feed/feed.go b/swarm/storage/feed/feed.go deleted file mode 100644 index b7283002fd92..000000000000 --- a/swarm/storage/feed/feed.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "hash" - "unsafe" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/swarm/storage" -) - -// Feed represents a particular user's stream of updates on a topic -type Feed struct { - Topic Topic `json:"topic"` - User common.Address `json:"user"` -} - -// Feed layout: -// TopicLength bytes -// userAddr common.AddressLength bytes -const feedLength = TopicLength + common.AddressLength - -// mapKey calculates a unique id for this feed. Used by the cache map in `Handler` -func (f *Feed) mapKey() uint64 { - serializedData := make([]byte, feedLength) - f.binaryPut(serializedData) - hasher := hashPool.Get().(hash.Hash) - defer hashPool.Put(hasher) - hasher.Reset() - hasher.Write(serializedData) - hash := hasher.Sum(nil) - return *(*uint64)(unsafe.Pointer(&hash[0])) -} - -// binaryPut serializes this feed instance into the provided slice -func (f *Feed) binaryPut(serializedData []byte) error { - if len(serializedData) != feedLength { - return NewErrorf(ErrInvalidValue, "Incorrect slice size to serialize feed. Expected %d, got %d", feedLength, len(serializedData)) - } - var cursor int - copy(serializedData[cursor:cursor+TopicLength], f.Topic[:TopicLength]) - cursor += TopicLength - - copy(serializedData[cursor:cursor+common.AddressLength], f.User[:]) - cursor += common.AddressLength - - return nil -} - -// binaryLength returns the expected size of this structure when serialized -func (f *Feed) binaryLength() int { - return feedLength -} - -// binaryGet restores the current instance from the information contained in the passed slice -func (f *Feed) binaryGet(serializedData []byte) error { - if len(serializedData) != feedLength { - return NewErrorf(ErrInvalidValue, "Incorrect slice size to read feed. Expected %d, got %d", feedLength, len(serializedData)) - } - - var cursor int - copy(f.Topic[:], serializedData[cursor:cursor+TopicLength]) - cursor += TopicLength - - copy(f.User[:], serializedData[cursor:cursor+common.AddressLength]) - cursor += common.AddressLength - - return nil -} - -// Hex serializes the feed to a hex string -func (f *Feed) Hex() string { - serializedData := make([]byte, feedLength) - f.binaryPut(serializedData) - return hexutil.Encode(serializedData) -} - -// FromValues deserializes this instance from a string key-value store -// useful to parse query strings -func (f *Feed) FromValues(values Values) (err error) { - topic := values.Get("topic") - if topic != "" { - if err := f.Topic.FromHex(values.Get("topic")); err != nil { - return err - } - } else { // see if the user set name and relatedcontent - name := values.Get("name") - relatedContent, _ := hexutil.Decode(values.Get("relatedcontent")) - if len(relatedContent) > 0 { - if len(relatedContent) < storage.AddressLength { - return NewErrorf(ErrInvalidValue, "relatedcontent field must be a hex-encoded byte array exactly %d bytes long", storage.AddressLength) - } - relatedContent = relatedContent[:storage.AddressLength] - } - f.Topic, err = NewTopic(name, relatedContent) - if err != nil { - return err - } - } - f.User = common.HexToAddress(values.Get("user")) - return nil -} - -// AppendValues serializes this structure into the provided string key-value store -// useful to build query strings -func (f *Feed) AppendValues(values Values) { - values.Set("topic", f.Topic.Hex()) - values.Set("user", f.User.Hex()) -} diff --git a/swarm/storage/feed/feed_test.go b/swarm/storage/feed/feed_test.go deleted file mode 100644 index 6a575594f4c4..000000000000 --- a/swarm/storage/feed/feed_test.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "testing" -) - -func getTestFeed() *Feed { - topic, _ := NewTopic("world news report, every hour", nil) - return &Feed{ - Topic: topic, - User: newCharlieSigner().Address(), - } -} - -func TestFeedSerializerDeserializer(t *testing.T) { - testBinarySerializerRecovery(t, getTestFeed(), "0x776f726c64206e657773207265706f72742c20657665727920686f7572000000876a8936a7cd0b79ef0735ad0896c1afe278781c") -} - -func TestFeedSerializerLengthCheck(t *testing.T) { - testBinarySerializerLengthCheck(t, getTestFeed()) -} diff --git a/swarm/storage/feed/handler.go b/swarm/storage/feed/handler.go deleted file mode 100644 index 181407ee454a..000000000000 --- a/swarm/storage/feed/handler.go +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright 2018 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 . - -// Handler is the API for feeds -// It enables creating, updating, syncing and retrieving feed updates and their data -package feed - -import ( - "bytes" - "context" - "fmt" - "sync" - - "github.com/nebulaai/nbai-node/swarm/storage/feed/lookup" - - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/storage" -) - -type Handler struct { - chunkStore *storage.NetStore - HashSize int - cache map[uint64]*cacheEntry - cacheLock sync.RWMutex -} - -// HandlerParams pass parameters to the Handler constructor NewHandler -// Signer and TimestampProvider are mandatory parameters -type HandlerParams struct { -} - -// hashPool contains a pool of ready hashers -var hashPool sync.Pool - -// init initializes the package and hashPool -func init() { - hashPool = sync.Pool{ - New: func() interface{} { - return storage.MakeHashFunc(feedsHashAlgorithm)() - }, - } -} - -// NewHandler creates a new Swarm feeds API -func NewHandler(params *HandlerParams) *Handler { - fh := &Handler{ - cache: make(map[uint64]*cacheEntry), - } - - for i := 0; i < hasherCount; i++ { - hashfunc := storage.MakeHashFunc(feedsHashAlgorithm)() - if fh.HashSize == 0 { - fh.HashSize = hashfunc.Size() - } - hashPool.Put(hashfunc) - } - - return fh -} - -// SetStore sets the store backend for the Swarm feeds API -func (h *Handler) SetStore(store *storage.NetStore) { - h.chunkStore = store -} - -// Validate is a chunk validation method -// If it looks like a feed update, the chunk address is checked against the userAddr of the update's signature -// It implements the storage.ChunkValidator interface -func (h *Handler) Validate(chunk storage.Chunk) bool { - if len(chunk.Data()) < minimumSignedUpdateLength { - return false - } - - // check if it is a properly formatted update chunk with - // valid signature and proof of ownership of the feed it is trying - // to update - - // First, deserialize the chunk - var r Request - if err := r.fromChunk(chunk); err != nil { - log.Debug("Invalid feed update chunk", "addr", chunk.Address(), "err", err) - return false - } - - // Verify signatures and that the signer actually owns the feed - // If it fails, it means either the signature is not valid, data is corrupted - // or someone is trying to update someone else's feed. - if err := r.Verify(); err != nil { - log.Debug("Invalid feed update signature", "err", err) - return false - } - - return true -} - -// GetContent retrieves the data payload of the last synced update of the feed -func (h *Handler) GetContent(feed *Feed) (storage.Address, []byte, error) { - if feed == nil { - return nil, nil, NewError(ErrInvalidValue, "feed is nil") - } - feedUpdate := h.get(feed) - if feedUpdate == nil { - return nil, nil, NewError(ErrNotFound, "feed update not cached") - } - return feedUpdate.lastKey, feedUpdate.data, nil -} - -// NewRequest prepares a Request structure with all the necessary information to -// just add the desired data and sign it. -// The resulting structure can then be signed and passed to Handler.Update to be verified and sent -func (h *Handler) NewRequest(ctx context.Context, feed *Feed) (request *Request, err error) { - if feed == nil { - return nil, NewError(ErrInvalidValue, "feed cannot be nil") - } - - now := TimestampProvider.Now().Time - request = new(Request) - request.Header.Version = ProtocolVersion - - query := NewQueryLatest(feed, lookup.NoClue) - - feedUpdate, err := h.Lookup(ctx, query) - if err != nil { - if err.(*Error).code != ErrNotFound { - return nil, err - } - // not finding updates means that there is a network error - // or that the feed really does not have updates - } - - request.Feed = *feed - - // if we already have an update, then find next epoch - if feedUpdate != nil { - request.Epoch = lookup.GetNextEpoch(feedUpdate.Epoch, now) - } else { - request.Epoch = lookup.GetFirstEpoch(now) - } - - return request, nil -} - -// Lookup retrieves a specific or latest feed update -// Lookup works differently depending on the configuration of `query` -// See the `query` documentation and helper functions: -// `NewQueryLatest` and `NewQuery` -func (h *Handler) Lookup(ctx context.Context, query *Query) (*cacheEntry, error) { - - timeLimit := query.TimeLimit - if timeLimit == 0 { // if time limit is set to zero, the user wants to get the latest update - timeLimit = TimestampProvider.Now().Time - } - - if query.Hint == lookup.NoClue { // try to use our cache - entry := h.get(&query.Feed) - if entry != nil && entry.Epoch.Time <= timeLimit { // avoid bad hints - query.Hint = entry.Epoch - } - } - - // we can't look for anything without a store - if h.chunkStore == nil { - return nil, NewError(ErrInit, "Call Handler.SetStore() before performing lookups") - } - - var id ID - id.Feed = query.Feed - var readCount int - - // Invoke the lookup engine. - // The callback will be called every time the lookup algorithm needs to guess - requestPtr, err := lookup.Lookup(timeLimit, query.Hint, func(epoch lookup.Epoch, now uint64) (interface{}, error) { - readCount++ - id.Epoch = epoch - ctx, cancel := context.WithTimeout(ctx, defaultRetrieveTimeout) - defer cancel() - - chunk, err := h.chunkStore.Get(ctx, id.Addr()) - if err != nil { // TODO: check for catastrophic errors other than chunk not found - return nil, nil - } - - var request Request - if err := request.fromChunk(chunk); err != nil { - return nil, nil - } - if request.Time <= timeLimit { - return &request, nil - } - return nil, nil - }) - if err != nil { - return nil, err - } - - log.Info(fmt.Sprintf("Feed lookup finished in %d lookups", readCount)) - - request, _ := requestPtr.(*Request) - if request == nil { - return nil, NewError(ErrNotFound, "no feed updates found") - } - return h.updateCache(request) - -} - -// update feed updates cache with specified content -func (h *Handler) updateCache(request *Request) (*cacheEntry, error) { - - updateAddr := request.Addr() - log.Trace("feed cache update", "topic", request.Topic.Hex(), "updateaddr", updateAddr, "epoch time", request.Epoch.Time, "epoch level", request.Epoch.Level) - - feedUpdate := h.get(&request.Feed) - if feedUpdate == nil { - feedUpdate = &cacheEntry{} - h.set(&request.Feed, feedUpdate) - } - - // update our rsrcs entry map - feedUpdate.lastKey = updateAddr - feedUpdate.Update = request.Update - feedUpdate.Reader = bytes.NewReader(feedUpdate.data) - return feedUpdate, nil -} - -// Update publishes a feed update -// Note that a feed update cannot span chunks, and thus has a MAX NET LENGTH 4096, INCLUDING update header data and signature. -// This results in a max payload of `maxUpdateDataLength` (check update.go for more details) -// An error will be returned if the total length of the chunk payload will exceed this limit. -// Update can only check if the caller is trying to overwrite the very last known version, otherwise it just puts the update -// on the network. -func (h *Handler) Update(ctx context.Context, r *Request) (updateAddr storage.Address, err error) { - - // we can't update anything without a store - if h.chunkStore == nil { - return nil, NewError(ErrInit, "Call Handler.SetStore() before updating") - } - - feedUpdate := h.get(&r.Feed) - if feedUpdate != nil && feedUpdate.Epoch.Equals(r.Epoch) { // This is the only cheap check we can do for sure - return nil, NewError(ErrInvalidValue, "A former update in this epoch is already known to exist") - } - - chunk, err := r.toChunk() // Serialize the update into a chunk. Fails if data is too big - if err != nil { - return nil, err - } - - // send the chunk - h.chunkStore.Put(ctx, chunk) - log.Trace("feed update", "updateAddr", r.idAddr, "epoch time", r.Epoch.Time, "epoch level", r.Epoch.Level, "data", chunk.Data()) - // update our feed updates map cache entry if the new update is older than the one we have, if we have it. - if feedUpdate != nil && r.Epoch.After(feedUpdate.Epoch) { - feedUpdate.Epoch = r.Epoch - feedUpdate.data = make([]byte, len(r.data)) - feedUpdate.lastKey = r.idAddr - copy(feedUpdate.data, r.data) - feedUpdate.Reader = bytes.NewReader(feedUpdate.data) - } - - return r.idAddr, nil -} - -// Retrieves the feed update cache value for the given nameHash -func (h *Handler) get(feed *Feed) *cacheEntry { - mapKey := feed.mapKey() - h.cacheLock.RLock() - defer h.cacheLock.RUnlock() - feedUpdate := h.cache[mapKey] - return feedUpdate -} - -// Sets the feed update cache value for the given feed -func (h *Handler) set(feed *Feed, feedUpdate *cacheEntry) { - mapKey := feed.mapKey() - h.cacheLock.Lock() - defer h.cacheLock.Unlock() - h.cache[mapKey] = feedUpdate -} diff --git a/swarm/storage/feed/handler_test.go b/swarm/storage/feed/handler_test.go deleted file mode 100644 index dfc1cae8e52c..000000000000 --- a/swarm/storage/feed/handler_test.go +++ /dev/null @@ -1,506 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "bytes" - "context" - "flag" - "fmt" - "io/ioutil" - "os" - "testing" - "time" - - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/swarm/chunk" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/storage/feed/lookup" -) - -var ( - loglevel = flag.Int("loglevel", 3, "loglevel") - startTime = Timestamp{ - Time: uint64(4200), - } - cleanF func() - subtopicName = "føø.bar" -) - -func init() { - flag.Parse() - log.Root().SetHandler(log.CallerFileHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(os.Stderr, log.TerminalFormat(true))))) -} - -// simulated timeProvider -type fakeTimeProvider struct { - currentTime uint64 -} - -func (f *fakeTimeProvider) Tick() { - f.currentTime++ -} - -func (f *fakeTimeProvider) Set(time uint64) { - f.currentTime = time -} - -func (f *fakeTimeProvider) FastForward(offset uint64) { - f.currentTime += offset -} - -func (f *fakeTimeProvider) Now() Timestamp { - return Timestamp{ - Time: f.currentTime, - } -} - -// make updates and retrieve them based on periods and versions -func TestFeedsHandler(t *testing.T) { - - // make fake timeProvider - clock := &fakeTimeProvider{ - currentTime: startTime.Time, // clock starts at t=4200 - } - - // signer containing private key - signer := newAliceSigner() - - feedsHandler, datadir, teardownTest, err := setupTest(clock, signer) - if err != nil { - t.Fatal(err) - } - defer teardownTest() - - // create a new feed - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - topic, _ := NewTopic("Mess with Swarm feeds code and see what ghost catches you", nil) - fd := Feed{ - Topic: topic, - User: signer.Address(), - } - - // data for updates: - updates := []string{ - "blinky", // t=4200 - "pinky", // t=4242 - "inky", // t=4284 - "clyde", // t=4285 - } - - request := NewFirstRequest(fd.Topic) // this timestamps the update at t = 4200 (start time) - chunkAddress := make(map[string]storage.Address) - data := []byte(updates[0]) - request.SetData(data) - if err := request.Sign(signer); err != nil { - t.Fatal(err) - } - chunkAddress[updates[0]], err = feedsHandler.Update(ctx, request) - if err != nil { - t.Fatal(err) - } - - // move the clock ahead 21 seconds - clock.FastForward(21) // t=4221 - - request, err = feedsHandler.NewRequest(ctx, &request.Feed) // this timestamps the update at t = 4221 - if err != nil { - t.Fatal(err) - } - if request.Epoch.Base() != 0 || request.Epoch.Level != lookup.HighestLevel-1 { - t.Fatalf("Suggested epoch BaseTime should be 0 and Epoch level should be %d", lookup.HighestLevel-1) - } - - request.Epoch.Level = lookup.HighestLevel // force level 25 instead of 24 to make it fail - data = []byte(updates[1]) - request.SetData(data) - if err := request.Sign(signer); err != nil { - t.Fatal(err) - } - chunkAddress[updates[1]], err = feedsHandler.Update(ctx, request) - if err == nil { - t.Fatal("Expected update to fail since an update in this epoch already exists") - } - - // move the clock ahead 21 seconds - clock.FastForward(21) // t=4242 - request, err = feedsHandler.NewRequest(ctx, &request.Feed) - if err != nil { - t.Fatal(err) - } - request.SetData(data) - if err := request.Sign(signer); err != nil { - t.Fatal(err) - } - chunkAddress[updates[1]], err = feedsHandler.Update(ctx, request) - if err != nil { - t.Fatal(err) - } - - // move the clock ahead 42 seconds - clock.FastForward(42) // t=4284 - request, err = feedsHandler.NewRequest(ctx, &request.Feed) - if err != nil { - t.Fatal(err) - } - data = []byte(updates[2]) - request.SetData(data) - if err := request.Sign(signer); err != nil { - t.Fatal(err) - } - chunkAddress[updates[2]], err = feedsHandler.Update(ctx, request) - if err != nil { - t.Fatal(err) - } - - // move the clock ahead 1 second - clock.FastForward(1) // t=4285 - request, err = feedsHandler.NewRequest(ctx, &request.Feed) - if err != nil { - t.Fatal(err) - } - if request.Epoch.Base() != 0 || request.Epoch.Level != 22 { - t.Fatalf("Expected epoch base time to be %d, got %d. Expected epoch level to be %d, got %d", 0, request.Epoch.Base(), 22, request.Epoch.Level) - } - data = []byte(updates[3]) - request.SetData(data) - - if err := request.Sign(signer); err != nil { - t.Fatal(err) - } - chunkAddress[updates[3]], err = feedsHandler.Update(ctx, request) - if err != nil { - t.Fatal(err) - } - - time.Sleep(time.Second) - feedsHandler.Close() - - // check we can retrieve the updates after close - clock.FastForward(2000) // t=6285 - - feedParams := &HandlerParams{} - - feedsHandler2, err := NewTestHandler(datadir, feedParams) - if err != nil { - t.Fatal(err) - } - - update2, err := feedsHandler2.Lookup(ctx, NewQueryLatest(&request.Feed, lookup.NoClue)) - if err != nil { - t.Fatal(err) - } - - // last update should be "clyde" - if !bytes.Equal(update2.data, []byte(updates[len(updates)-1])) { - t.Fatalf("feed update data was %v, expected %v", string(update2.data), updates[len(updates)-1]) - } - if update2.Level != 22 { - t.Fatalf("feed update epoch level was %d, expected 22", update2.Level) - } - if update2.Base() != 0 { - t.Fatalf("feed update epoch base time was %d, expected 0", update2.Base()) - } - log.Debug("Latest lookup", "epoch base time", update2.Base(), "epoch level", update2.Level, "data", update2.data) - - // specific point in time - update, err := feedsHandler2.Lookup(ctx, NewQuery(&request.Feed, 4284, lookup.NoClue)) - if err != nil { - t.Fatal(err) - } - // check data - if !bytes.Equal(update.data, []byte(updates[2])) { - t.Fatalf("feed update data (historical) was %v, expected %v", string(update2.data), updates[2]) - } - log.Debug("Historical lookup", "epoch base time", update2.Base(), "epoch level", update2.Level, "data", update2.data) - - // beyond the first should yield an error - update, err = feedsHandler2.Lookup(ctx, NewQuery(&request.Feed, startTime.Time-1, lookup.NoClue)) - if err == nil { - t.Fatalf("expected previous to fail, returned epoch %s data %v", update.Epoch.String(), update.data) - } - -} - -const Day = 60 * 60 * 24 -const Year = Day * 365 -const Month = Day * 30 - -func generateData(x uint64) []byte { - return []byte(fmt.Sprintf("%d", x)) -} - -func TestSparseUpdates(t *testing.T) { - - // make fake timeProvider - timeProvider := &fakeTimeProvider{ - currentTime: startTime.Time, - } - - // signer containing private key - signer := newAliceSigner() - - rh, datadir, teardownTest, err := setupTest(timeProvider, signer) - if err != nil { - t.Fatal(err) - } - defer teardownTest() - defer os.RemoveAll(datadir) - - // create a new feed - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - topic, _ := NewTopic("Very slow updates", nil) - fd := Feed{ - Topic: topic, - User: signer.Address(), - } - - // publish one update every 5 years since Unix 0 until today - today := uint64(1533799046) - var epoch lookup.Epoch - var lastUpdateTime uint64 - for T := uint64(0); T < today; T += 5 * Year { - request := NewFirstRequest(fd.Topic) - request.Epoch = lookup.GetNextEpoch(epoch, T) - request.data = generateData(T) // this generates some data that depends on T, so we can check later - request.Sign(signer) - if err != nil { - t.Fatal(err) - } - - if _, err := rh.Update(ctx, request); err != nil { - t.Fatal(err) - } - epoch = request.Epoch - lastUpdateTime = T - } - - query := NewQuery(&fd, today, lookup.NoClue) - - _, err = rh.Lookup(ctx, query) - if err != nil { - t.Fatal(err) - } - - _, content, err := rh.GetContent(&fd) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(generateData(lastUpdateTime), content) { - t.Fatalf("Expected to recover last written value %d, got %s", lastUpdateTime, string(content)) - } - - // lookup the closest update to 35*Year + 6* Month (~ June 2005): - // it should find the update we put on 35*Year, since we were updating every 5 years. - - query.TimeLimit = 35*Year + 6*Month - - _, err = rh.Lookup(ctx, query) - if err != nil { - t.Fatal(err) - } - - _, content, err = rh.GetContent(&fd) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(generateData(35*Year), content) { - t.Fatalf("Expected to recover %d, got %s", 35*Year, string(content)) - } -} - -func TestValidator(t *testing.T) { - - // make fake timeProvider - timeProvider := &fakeTimeProvider{ - currentTime: startTime.Time, - } - - // signer containing private key. Alice will be the good girl - signer := newAliceSigner() - - // set up sim timeProvider - rh, _, teardownTest, err := setupTest(timeProvider, signer) - if err != nil { - t.Fatal(err) - } - defer teardownTest() - - // create new feed - topic, _ := NewTopic(subtopicName, nil) - fd := Feed{ - Topic: topic, - User: signer.Address(), - } - mr := NewFirstRequest(fd.Topic) - - // chunk with address - data := []byte("foo") - mr.SetData(data) - if err := mr.Sign(signer); err != nil { - t.Fatalf("sign fail: %v", err) - } - - chunk, err := mr.toChunk() - if err != nil { - t.Fatal(err) - } - if !rh.Validate(chunk) { - t.Fatal("Chunk validator fail on update chunk") - } - - address := chunk.Address() - // mess with the address - address[0] = 11 - address[15] = 99 - - if rh.Validate(storage.NewChunk(address, chunk.Data())) { - t.Fatal("Expected Validate to fail with false chunk address") - } -} - -// tests that the content address validator correctly checks the data -// tests that feed update chunks are passed through content address validator -// there is some redundancy in this test as it also tests content addressed chunks, -// which should be evaluated as invalid chunks by this validator -func TestValidatorInStore(t *testing.T) { - - // make fake timeProvider - TimestampProvider = &fakeTimeProvider{ - currentTime: startTime.Time, - } - - // signer containing private key - signer := newAliceSigner() - - // set up localstore - datadir, err := ioutil.TempDir("", "storage-testfeedsvalidator") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(datadir) - - handlerParams := storage.NewDefaultLocalStoreParams() - handlerParams.Init(datadir) - store, err := storage.NewLocalStore(handlerParams, nil) - if err != nil { - t.Fatal(err) - } - - // set up Swarm feeds handler and add is as a validator to the localstore - fhParams := &HandlerParams{} - fh := NewHandler(fhParams) - store.Validators = append(store.Validators, fh) - - // create content addressed chunks, one good, one faulty - chunks := storage.GenerateRandomChunks(chunk.DefaultSize, 2) - goodChunk := chunks[0] - badChunk := storage.NewChunk(chunks[1].Address(), goodChunk.Data()) - - topic, _ := NewTopic("xyzzy", nil) - fd := Feed{ - Topic: topic, - User: signer.Address(), - } - - // create a feed update chunk with correct publickey - id := ID{ - Epoch: lookup.Epoch{Time: 42, - Level: 1, - }, - Feed: fd, - } - - updateAddr := id.Addr() - data := []byte("bar") - - r := new(Request) - r.idAddr = updateAddr - r.Update.ID = id - r.data = data - - r.Sign(signer) - - uglyChunk, err := r.toChunk() - if err != nil { - t.Fatal(err) - } - - // put the chunks in the store and check their error status - err = store.Put(context.Background(), goodChunk) - if err == nil { - t.Fatal("expected error on good content address chunk with feed update validator only, but got nil") - } - err = store.Put(context.Background(), badChunk) - if err == nil { - t.Fatal("expected error on bad content address chunk with feed update validator only, but got nil") - } - err = store.Put(context.Background(), uglyChunk) - if err != nil { - t.Fatalf("expected no error on feed update chunk with feed update validator only, but got: %s", err) - } -} - -// create rpc and feeds Handler -func setupTest(timeProvider timestampProvider, signer Signer) (fh *TestHandler, datadir string, teardown func(), err error) { - - var fsClean func() - var rpcClean func() - cleanF = func() { - if fsClean != nil { - fsClean() - } - if rpcClean != nil { - rpcClean() - } - } - - // temp datadir - datadir, err = ioutil.TempDir("", "fh") - if err != nil { - return nil, "", nil, err - } - fsClean = func() { - os.RemoveAll(datadir) - } - - TimestampProvider = timeProvider - fhParams := &HandlerParams{} - fh, err = NewTestHandler(datadir, fhParams) - return fh, datadir, cleanF, err -} - -func newAliceSigner() *GenericSigner { - privKey, _ := crypto.HexToECDSA("deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef") - return NewGenericSigner(privKey) -} - -func newBobSigner() *GenericSigner { - privKey, _ := crypto.HexToECDSA("accedeaccedeaccedeaccedeaccedeaccedeaccedeaccedeaccedeaccedecaca") - return NewGenericSigner(privKey) -} - -func newCharlieSigner() *GenericSigner { - privKey, _ := crypto.HexToECDSA("facadefacadefacadefacadefacadefacadefacadefacadefacadefacadefaca") - return NewGenericSigner(privKey) -} diff --git a/swarm/storage/feed/id.go b/swarm/storage/feed/id.go deleted file mode 100644 index 3be4d5b96242..000000000000 --- a/swarm/storage/feed/id.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "fmt" - "hash" - "strconv" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/swarm/storage/feed/lookup" - - "github.com/nebulaai/nbai-node/swarm/storage" -) - -// ID uniquely identifies an update on the network. -type ID struct { - Feed `json:"feed"` - lookup.Epoch `json:"epoch"` -} - -// ID layout: -// Feed feedLength bytes -// Epoch EpochLength -const idLength = feedLength + lookup.EpochLength - -// Addr calculates the feed update chunk address corresponding to this ID -func (u *ID) Addr() (updateAddr storage.Address) { - serializedData := make([]byte, idLength) - var cursor int - u.Feed.binaryPut(serializedData[cursor : cursor+feedLength]) - cursor += feedLength - - eid := u.Epoch.ID() - copy(serializedData[cursor:cursor+lookup.EpochLength], eid[:]) - - hasher := hashPool.Get().(hash.Hash) - defer hashPool.Put(hasher) - hasher.Reset() - hasher.Write(serializedData) - return hasher.Sum(nil) -} - -// binaryPut serializes this instance into the provided slice -func (u *ID) binaryPut(serializedData []byte) error { - if len(serializedData) != idLength { - return NewErrorf(ErrInvalidValue, "Incorrect slice size to serialize ID. Expected %d, got %d", idLength, len(serializedData)) - } - var cursor int - if err := u.Feed.binaryPut(serializedData[cursor : cursor+feedLength]); err != nil { - return err - } - cursor += feedLength - - epochBytes, err := u.Epoch.MarshalBinary() - if err != nil { - return err - } - copy(serializedData[cursor:cursor+lookup.EpochLength], epochBytes[:]) - cursor += lookup.EpochLength - - return nil -} - -// binaryLength returns the expected size of this structure when serialized -func (u *ID) binaryLength() int { - return idLength -} - -// binaryGet restores the current instance from the information contained in the passed slice -func (u *ID) binaryGet(serializedData []byte) error { - if len(serializedData) != idLength { - return NewErrorf(ErrInvalidValue, "Incorrect slice size to read ID. Expected %d, got %d", idLength, len(serializedData)) - } - - var cursor int - if err := u.Feed.binaryGet(serializedData[cursor : cursor+feedLength]); err != nil { - return err - } - cursor += feedLength - - if err := u.Epoch.UnmarshalBinary(serializedData[cursor : cursor+lookup.EpochLength]); err != nil { - return err - } - cursor += lookup.EpochLength - - return nil -} - -// FromValues deserializes this instance from a string key-value store -// useful to parse query strings -func (u *ID) FromValues(values Values) error { - level, _ := strconv.ParseUint(values.Get("level"), 10, 32) - u.Epoch.Level = uint8(level) - u.Epoch.Time, _ = strconv.ParseUint(values.Get("time"), 10, 64) - - if u.Feed.User == (common.Address{}) { - return u.Feed.FromValues(values) - } - return nil -} - -// AppendValues serializes this structure into the provided string key-value store -// useful to build query strings -func (u *ID) AppendValues(values Values) { - values.Set("level", fmt.Sprintf("%d", u.Epoch.Level)) - values.Set("time", fmt.Sprintf("%d", u.Epoch.Time)) - u.Feed.AppendValues(values) -} diff --git a/swarm/storage/feed/id_test.go b/swarm/storage/feed/id_test.go deleted file mode 100644 index 092bd6c7d7c9..000000000000 --- a/swarm/storage/feed/id_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package feed - -import ( - "testing" - - "github.com/nebulaai/nbai-node/swarm/storage/feed/lookup" -) - -func getTestID() *ID { - return &ID{ - Feed: *getTestFeed(), - Epoch: lookup.GetFirstEpoch(1000), - } -} - -func TestIDAddr(t *testing.T) { - id := getTestID() - updateAddr := id.Addr() - compareByteSliceToExpectedHex(t, "updateAddr", updateAddr, "0x8b24583ec293e085f4c78aaee66d1bc5abfb8b4233304d14a349afa57af2a783") -} - -func TestIDSerializer(t *testing.T) { - testBinarySerializerRecovery(t, getTestID(), "0x776f726c64206e657773207265706f72742c20657665727920686f7572000000876a8936a7cd0b79ef0735ad0896c1afe278781ce803000000000019") -} - -func TestIDLengthCheck(t *testing.T) { - testBinarySerializerLengthCheck(t, getTestID()) -} diff --git a/swarm/storage/feed/lookup/epoch.go b/swarm/storage/feed/lookup/epoch.go deleted file mode 100644 index bafe9547798e..000000000000 --- a/swarm/storage/feed/lookup/epoch.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2018 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 lookup - -import ( - "encoding/binary" - "errors" - "fmt" -) - -// Epoch represents a time slot at a particular frequency level -type Epoch struct { - Time uint64 `json:"time"` // Time stores the time at which the update or lookup takes place - Level uint8 `json:"level"` // Level indicates the frequency level as the exponent of a power of 2 -} - -// EpochID is a unique identifier for an Epoch, based on its level and base time. -type EpochID [8]byte - -// EpochLength stores the serialized binary length of an Epoch -const EpochLength = 8 - -// MaxTime contains the highest possible time value an Epoch can handle -const MaxTime uint64 = (1 << 56) - 1 - -// Base returns the base time of the Epoch -func (e *Epoch) Base() uint64 { - return getBaseTime(e.Time, e.Level) -} - -// ID Returns the unique identifier of this epoch -func (e *Epoch) ID() EpochID { - base := e.Base() - var id EpochID - binary.LittleEndian.PutUint64(id[:], base) - id[7] = e.Level - return id -} - -// MarshalBinary implements the encoding.BinaryMarshaller interface -func (e *Epoch) MarshalBinary() (data []byte, err error) { - b := make([]byte, 8) - binary.LittleEndian.PutUint64(b[:], e.Time) - b[7] = e.Level - return b, nil -} - -// UnmarshalBinary implements the encoding.BinaryUnmarshaller interface -func (e *Epoch) UnmarshalBinary(data []byte) error { - if len(data) != EpochLength { - return errors.New("Invalid data unmarshalling Epoch") - } - b := make([]byte, 8) - copy(b, data) - e.Level = b[7] - b[7] = 0 - e.Time = binary.LittleEndian.Uint64(b) - return nil -} - -// After returns true if this epoch occurs later or exactly at the other epoch. -func (e *Epoch) After(epoch Epoch) bool { - if e.Time == epoch.Time { - return e.Level < epoch.Level - } - return e.Time >= epoch.Time -} - -// Equals compares two epochs and returns true if they refer to the same time period. -func (e *Epoch) Equals(epoch Epoch) bool { - return e.Level == epoch.Level && e.Base() == epoch.Base() -} - -// String implements the Stringer interface. -func (e *Epoch) String() string { - return fmt.Sprintf("Epoch{Time:%d, Level:%d}", e.Time, e.Level) -} diff --git a/swarm/storage/feed/lookup/epoch_test.go b/swarm/storage/feed/lookup/epoch_test.go deleted file mode 100644 index 185f46e36b1a..000000000000 --- a/swarm/storage/feed/lookup/epoch_test.go +++ /dev/null @@ -1,57 +0,0 @@ -package lookup_test - -import ( - "testing" - - "github.com/nebulaai/nbai-node/swarm/storage/feed/lookup" -) - -func TestMarshallers(t *testing.T) { - - for i := uint64(1); i < lookup.MaxTime; i *= 3 { - e := lookup.Epoch{ - Time: i, - Level: uint8(i % 20), - } - b, err := e.MarshalBinary() - if err != nil { - t.Fatal(err) - } - var e2 lookup.Epoch - if err := e2.UnmarshalBinary(b); err != nil { - t.Fatal(err) - } - if e != e2 { - t.Fatal("Expected unmarshalled epoch to be equal to marshalled onet.Fatal(err)") - } - } - -} - -func TestAfter(t *testing.T) { - a := lookup.Epoch{ - Time: 5, - Level: 3, - } - b := lookup.Epoch{ - Time: 6, - Level: 3, - } - c := lookup.Epoch{ - Time: 6, - Level: 4, - } - - if !b.After(a) { - t.Fatal("Expected 'after' to be true, got false") - } - - if b.After(b) { - t.Fatal("Expected 'after' to be false when both epochs are identical, got true") - } - - if !b.After(c) { - t.Fatal("Expected 'after' to be true when both epochs have the same time but the level is lower in the first one, but got false") - } - -} diff --git a/swarm/storage/feed/lookup/lookup.go b/swarm/storage/feed/lookup/lookup.go deleted file mode 100644 index 2f862d81c470..000000000000 --- a/swarm/storage/feed/lookup/lookup.go +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright 2018 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 lookup defines feed lookup algorithms and provides tools to place updates -so they can be found -*/ -package lookup - -const maxuint64 = ^uint64(0) - -// LowestLevel establishes the frequency resolution of the lookup algorithm as a power of 2. -const LowestLevel uint8 = 0 // default is 0 (1 second) - -// HighestLevel sets the lowest frequency the algorithm will operate at, as a power of 2. -// 25 -> 2^25 equals to roughly one year. -const HighestLevel = 25 // default is 25 (~1 year) - -// DefaultLevel sets what level will be chosen to search when there is no hint -const DefaultLevel = HighestLevel - -//Algorithm is the function signature of a lookup algorithm -type Algorithm func(now uint64, hint Epoch, read ReadFunc) (value interface{}, err error) - -// Lookup finds the update with the highest timestamp that is smaller or equal than 'now' -// It takes a hint which should be the epoch where the last known update was -// If you don't know in what epoch the last update happened, simply submit lookup.NoClue -// read() will be called on each lookup attempt -// Returns an error only if read() returns an error -// Returns nil if an update was not found -var Lookup Algorithm = FluzCapacitorAlgorithm - -// ReadFunc is a handler called by Lookup each time it attempts to find a value -// It should return if a value is not found -// It should return if a value is found, but its timestamp is higher than "now" -// It should only return an error in case the handler wants to stop the -// lookup process entirely. -type ReadFunc func(epoch Epoch, now uint64) (interface{}, error) - -// NoClue is a hint that can be provided when the Lookup caller does not have -// a clue about where the last update may be -var NoClue = Epoch{} - -// getBaseTime returns the epoch base time of the given -// time and level -func getBaseTime(t uint64, level uint8) uint64 { - return t & (maxuint64 << level) -} - -// Hint creates a hint based only on the last known update time -func Hint(last uint64) Epoch { - return Epoch{ - Time: last, - Level: DefaultLevel, - } -} - -// GetNextLevel returns the frequency level a next update should be placed at, provided where -// the last update was and what time it is now. -// This is the first nonzero bit of the XOR of 'last' and 'now', counting from the highest significant bit -// but limited to not return a level that is smaller than the last-1 -func GetNextLevel(last Epoch, now uint64) uint8 { - // First XOR the last epoch base time with the current clock. - // This will set all the common most significant bits to zero. - mix := (last.Base() ^ now) - - // Then, make sure we stop the below loop before one level below the current, by setting - // that level's bit to 1. - // If the next level is lower than the current one, it must be exactly level-1 and not lower. - mix |= (1 << (last.Level - 1)) - - // if the last update was more than 2^highestLevel seconds ago, choose the highest level - if mix > (maxuint64 >> (64 - HighestLevel - 1)) { - return HighestLevel - } - - // set up a mask to scan for nonzero bits, starting at the highest level - mask := uint64(1 << (HighestLevel)) - - for i := uint8(HighestLevel); i > LowestLevel; i-- { - if mix&mask != 0 { // if we find a nonzero bit, this is the level the next update should be at. - return i - } - mask = mask >> 1 // move our bit one position to the right - } - return 0 -} - -// GetNextEpoch returns the epoch where the next update should be located -// according to where the previous update was -// and what time it is now. -func GetNextEpoch(last Epoch, now uint64) Epoch { - if last == NoClue { - return GetFirstEpoch(now) - } - level := GetNextLevel(last, now) - return Epoch{ - Level: level, - Time: now, - } -} - -// GetFirstEpoch returns the epoch where the first update should be located -// based on what time it is now. -func GetFirstEpoch(now uint64) Epoch { - return Epoch{Level: HighestLevel, Time: now} -} - -var worstHint = Epoch{Time: 0, Level: 63} - -// FluzCapacitorAlgorithm works by narrowing the epoch search area if an update is found -// going back and forth in time -// First, it will attempt to find an update where it should be now if the hint was -// really the last update. If that lookup fails, then the last update must be either the hint itself -// or the epochs right below. If however, that lookup succeeds, then the update must be -// that one or within the epochs right below. -// see the guide for a more graphical representation -func FluzCapacitorAlgorithm(now uint64, hint Epoch, read ReadFunc) (value interface{}, err error) { - var lastFound interface{} - var epoch Epoch - if hint == NoClue { - hint = worstHint - } - - t := now - - for { - epoch = GetNextEpoch(hint, t) - value, err = read(epoch, now) - if err != nil { - return nil, err - } - if value != nil { - lastFound = value - if epoch.Level == LowestLevel || epoch.Equals(hint) { - return value, nil - } - hint = epoch - continue - } - if epoch.Base() == hint.Base() { - if lastFound != nil { - return lastFound, nil - } - // we have reached the hint itself - if hint == worstHint { - return nil, nil - } - // check it out - value, err = read(hint, now) - if err != nil { - return nil, err - } - if value != nil { - return value, nil - } - // bad hint. - epoch = hint - hint = worstHint - } - base := epoch.Base() - if base == 0 { - return nil, nil - } - t = base - 1 - } -} diff --git a/swarm/storage/feed/lookup/lookup_test.go b/swarm/storage/feed/lookup/lookup_test.go deleted file mode 100644 index 7dab57c6e0d5..000000000000 --- a/swarm/storage/feed/lookup/lookup_test.go +++ /dev/null @@ -1,414 +0,0 @@ -// Copyright 2018 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 lookup_test - -import ( - "fmt" - "math/rand" - "testing" - - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/storage/feed/lookup" -) - -type Data struct { - Payload uint64 - Time uint64 -} - -type Store map[lookup.EpochID]*Data - -func write(store Store, epoch lookup.Epoch, value *Data) { - log.Debug("Write: %d-%d, value='%d'\n", epoch.Base(), epoch.Level, value.Payload) - store[epoch.ID()] = value -} - -func update(store Store, last lookup.Epoch, now uint64, value *Data) lookup.Epoch { - epoch := lookup.GetNextEpoch(last, now) - - write(store, epoch, value) - - return epoch -} - -const Day = 60 * 60 * 24 -const Year = Day * 365 -const Month = Day * 30 - -func makeReadFunc(store Store, counter *int) lookup.ReadFunc { - return func(epoch lookup.Epoch, now uint64) (interface{}, error) { - *counter++ - data := store[epoch.ID()] - var valueStr string - if data != nil { - valueStr = fmt.Sprintf("%d", data.Payload) - } - log.Debug("Read: %d-%d, value='%s'\n", epoch.Base(), epoch.Level, valueStr) - if data != nil && data.Time <= now { - return data, nil - } - return nil, nil - } -} - -func TestLookup(t *testing.T) { - - store := make(Store) - readCount := 0 - readFunc := makeReadFunc(store, &readCount) - - // write an update every month for 12 months 3 years ago and then silence for two years - now := uint64(1533799046) - var epoch lookup.Epoch - - var lastData *Data - for i := uint64(0); i < 12; i++ { - t := uint64(now - Year*3 + i*Month) - data := Data{ - Payload: t, //our "payload" will be the timestamp itself. - Time: t, - } - epoch = update(store, epoch, t, &data) - lastData = &data - } - - // try to get the last value - - value, err := lookup.Lookup(now, lookup.NoClue, readFunc) - if err != nil { - t.Fatal(err) - } - - readCountWithoutHint := readCount - - if value != lastData { - t.Fatalf("Expected lookup to return the last written value: %v. Got %v", lastData, value) - } - - // reset the read count for the next test - readCount = 0 - // Provide a hint to get a faster lookup. In particular, we give the exact location of the last update - value, err = lookup.Lookup(now, epoch, readFunc) - if err != nil { - t.Fatal(err) - } - - if value != lastData { - t.Fatalf("Expected lookup to return the last written value: %v. Got %v", lastData, value) - } - - if readCount > readCountWithoutHint { - t.Fatalf("Expected lookup to complete with fewer or same reads than %d since we provided a hint. Did %d reads.", readCountWithoutHint, readCount) - } - - // try to get an intermediate value - // if we look for a value in now - Year*3 + 6*Month, we should get that value - // Since the "payload" is the timestamp itself, we can check this. - - expectedTime := now - Year*3 + 6*Month - - value, err = lookup.Lookup(expectedTime, lookup.NoClue, readFunc) - if err != nil { - t.Fatal(err) - } - - data, ok := value.(*Data) - - if !ok { - t.Fatal("Expected value to contain data") - } - - if data.Time != expectedTime { - t.Fatalf("Expected value timestamp to be %d, got %d", data.Time, expectedTime) - } - -} - -func TestOneUpdateAt0(t *testing.T) { - - store := make(Store) - readCount := 0 - - readFunc := makeReadFunc(store, &readCount) - now := uint64(1533903729) - - var epoch lookup.Epoch - data := Data{ - Payload: 79, - Time: 0, - } - update(store, epoch, 0, &data) - - value, err := lookup.Lookup(now, lookup.NoClue, readFunc) - if err != nil { - t.Fatal(err) - } - if value != &data { - t.Fatalf("Expected lookup to return the last written value: %v. Got %v", data, value) - } -} - -// Tests the update is found even when a bad hint is given -func TestBadHint(t *testing.T) { - - store := make(Store) - readCount := 0 - - readFunc := makeReadFunc(store, &readCount) - now := uint64(1533903729) - - var epoch lookup.Epoch - data := Data{ - Payload: 79, - Time: 0, - } - - // place an update for t=1200 - update(store, epoch, 1200, &data) - - // come up with some evil hint - badHint := lookup.Epoch{ - Level: 18, - Time: 1200000000, - } - - value, err := lookup.Lookup(now, badHint, readFunc) - if err != nil { - t.Fatal(err) - } - if value != &data { - t.Fatalf("Expected lookup to return the last written value: %v. Got %v", data, value) - } -} - -func TestLookupFail(t *testing.T) { - - store := make(Store) - readCount := 0 - - readFunc := makeReadFunc(store, &readCount) - now := uint64(1533903729) - - // don't write anything and try to look up. - // we're testing we don't get stuck in a loop - - value, err := lookup.Lookup(now, lookup.NoClue, readFunc) - if err != nil { - t.Fatal(err) - } - if value != nil { - t.Fatal("Expected value to be nil, since the update should've failed") - } - - expectedReads := now/(1< readCountWithoutHint { - t.Fatalf("Expected lookup to complete with fewer or equal reads than %d since we provided a hint. Did %d reads.", readCountWithoutHint, readCount) - } - - for i := uint64(0); i <= 994; i++ { - T := uint64(now - 1000 + i) // update every second for the last 1000 seconds - value, err := lookup.Lookup(T, lookup.NoClue, readFunc) - if err != nil { - t.Fatal(err) - } - data, _ := value.(*Data) - if data == nil { - t.Fatalf("Expected lookup to return %d, got nil", T) - } - if data.Payload != T { - t.Fatalf("Expected lookup to return %d, got %d", T, data.Time) - } - } -} - -func TestSparseUpdates(t *testing.T) { - - store := make(Store) - readCount := 0 - readFunc := makeReadFunc(store, &readCount) - - // write an update every 5 years 3 times starting in Jan 1st 1970 and then silence - - now := uint64(1533799046) - var epoch lookup.Epoch - - var lastData *Data - for i := uint64(0); i < 5; i++ { - T := uint64(Year * 5 * i) // write an update every 5 years 3 times starting in Jan 1st 1970 and then silence - data := Data{ - Payload: T, //our "payload" will be the timestamp itself. - Time: T, - } - epoch = update(store, epoch, T, &data) - lastData = &data - } - - // try to get the last value - - value, err := lookup.Lookup(now, lookup.NoClue, readFunc) - if err != nil { - t.Fatal(err) - } - - readCountWithoutHint := readCount - - if value != lastData { - t.Fatalf("Expected lookup to return the last written value: %v. Got %v", lastData, value) - } - - // reset the read count for the next test - readCount = 0 - // Provide a hint to get a faster lookup. In particular, we give the exact location of the last update - value, err = lookup.Lookup(now, epoch, readFunc) - if err != nil { - t.Fatal(err) - } - - if value != lastData { - t.Fatalf("Expected lookup to return the last written value: %v. Got %v", lastData, value) - } - - if readCount > readCountWithoutHint { - t.Fatalf("Expected lookup to complete with fewer reads than %d since we provided a hint. Did %d reads.", readCountWithoutHint, readCount) - } - -} - -// testG will hold precooked test results -// fields are abbreviated to reduce the size of the literal below -type testG struct { - e lookup.Epoch // last - n uint64 // next level - x uint8 // expected result -} - -// test cases -var testGetNextLevelCases []testG = []testG{{e: lookup.Epoch{Time: 989875233, Level: 12}, n: 989875233, x: 11}, {e: lookup.Epoch{Time: 995807650, Level: 18}, n: 995598156, x: 19}, {e: lookup.Epoch{Time: 969167082, Level: 0}, n: 968990357, x: 18}, {e: lookup.Epoch{Time: 993087628, Level: 14}, n: 992987044, x: 20}, {e: lookup.Epoch{Time: 963364631, Level: 20}, n: 963364630, x: 19}, {e: lookup.Epoch{Time: 963497510, Level: 16}, n: 963370732, x: 18}, {e: lookup.Epoch{Time: 955421349, Level: 22}, n: 955421348, x: 21}, {e: lookup.Epoch{Time: 968220379, Level: 15}, n: 968220378, x: 14}, {e: lookup.Epoch{Time: 939129014, Level: 6}, n: 939128771, x: 11}, {e: lookup.Epoch{Time: 907847903, Level: 6}, n: 907791833, x: 18}, {e: lookup.Epoch{Time: 910835564, Level: 15}, n: 910835564, x: 14}, {e: lookup.Epoch{Time: 913578333, Level: 22}, n: 881808431, x: 25}, {e: lookup.Epoch{Time: 895818460, Level: 3}, n: 895818132, x: 9}, {e: lookup.Epoch{Time: 903843025, Level: 24}, n: 895609561, x: 23}, {e: lookup.Epoch{Time: 877889433, Level: 13}, n: 877877093, x: 15}, {e: lookup.Epoch{Time: 901450396, Level: 10}, n: 901450058, x: 9}, {e: lookup.Epoch{Time: 925179910, Level: 3}, n: 925168393, x: 16}, {e: lookup.Epoch{Time: 913485477, Level: 21}, n: 913485476, x: 20}, {e: lookup.Epoch{Time: 924462991, Level: 18}, n: 924462990, x: 17}, {e: lookup.Epoch{Time: 941175128, Level: 13}, n: 941175127, x: 12}, {e: lookup.Epoch{Time: 920126583, Level: 3}, n: 920100782, x: 19}, {e: lookup.Epoch{Time: 932403200, Level: 9}, n: 932279891, x: 17}, {e: lookup.Epoch{Time: 948284931, Level: 2}, n: 948284921, x: 9}, {e: lookup.Epoch{Time: 953540997, Level: 7}, n: 950547986, x: 22}, {e: lookup.Epoch{Time: 926639837, Level: 18}, n: 918608882, x: 24}, {e: lookup.Epoch{Time: 954637598, Level: 1}, n: 954578761, x: 17}, {e: lookup.Epoch{Time: 943482981, Level: 10}, n: 942924151, x: 19}, {e: lookup.Epoch{Time: 963580771, Level: 7}, n: 963580771, x: 6}, {e: lookup.Epoch{Time: 993744930, Level: 7}, n: 993690858, x: 16}, {e: lookup.Epoch{Time: 1018890213, Level: 12}, n: 1018890212, x: 11}, {e: lookup.Epoch{Time: 1030309411, Level: 2}, n: 1030309227, x: 9}, {e: lookup.Epoch{Time: 1063204997, Level: 20}, n: 1063204996, x: 19}, {e: lookup.Epoch{Time: 1094340832, Level: 6}, n: 1094340633, x: 7}, {e: lookup.Epoch{Time: 1077880597, Level: 10}, n: 1075914292, x: 20}, {e: lookup.Epoch{Time: 1051114957, Level: 18}, n: 1051114957, x: 17}, {e: lookup.Epoch{Time: 1045649701, Level: 22}, n: 1045649700, x: 21}, {e: lookup.Epoch{Time: 1066198885, Level: 14}, n: 1066198884, x: 13}, {e: lookup.Epoch{Time: 1053231952, Level: 1}, n: 1053210845, x: 16}, {e: lookup.Epoch{Time: 1068763404, Level: 14}, n: 1068675428, x: 18}, {e: lookup.Epoch{Time: 1039042173, Level: 15}, n: 1038973110, x: 17}, {e: lookup.Epoch{Time: 1050747636, Level: 6}, n: 1050747364, x: 9}, {e: lookup.Epoch{Time: 1030034434, Level: 23}, n: 1030034433, x: 22}, {e: lookup.Epoch{Time: 1003783425, Level: 18}, n: 1003783424, x: 17}, {e: lookup.Epoch{Time: 988163976, Level: 15}, n: 988084064, x: 17}, {e: lookup.Epoch{Time: 1007222377, Level: 15}, n: 1007222377, x: 14}, {e: lookup.Epoch{Time: 1001211375, Level: 13}, n: 1001208178, x: 14}, {e: lookup.Epoch{Time: 997623199, Level: 8}, n: 997623198, x: 7}, {e: lookup.Epoch{Time: 1026283830, Level: 10}, n: 1006681704, x: 24}, {e: lookup.Epoch{Time: 1019421907, Level: 20}, n: 1019421906, x: 19}, {e: lookup.Epoch{Time: 1043154306, Level: 16}, n: 1043108343, x: 16}, {e: lookup.Epoch{Time: 1075643767, Level: 17}, n: 1075325898, x: 18}, {e: lookup.Epoch{Time: 1043726309, Level: 20}, n: 1043726308, x: 19}, {e: lookup.Epoch{Time: 1056415324, Level: 17}, n: 1056415324, x: 16}, {e: lookup.Epoch{Time: 1088650219, Level: 13}, n: 1088650218, x: 12}, {e: lookup.Epoch{Time: 1088551662, Level: 7}, n: 1088543355, x: 13}, {e: lookup.Epoch{Time: 1069667265, Level: 6}, n: 1069667075, x: 7}, {e: lookup.Epoch{Time: 1079145970, Level: 18}, n: 1079145969, x: 17}, {e: lookup.Epoch{Time: 1083338876, Level: 7}, n: 1083338875, x: 6}, {e: lookup.Epoch{Time: 1051581086, Level: 4}, n: 1051568869, x: 14}, {e: lookup.Epoch{Time: 1028430882, Level: 4}, n: 1028430864, x: 5}, {e: lookup.Epoch{Time: 1057356462, Level: 1}, n: 1057356417, x: 5}, {e: lookup.Epoch{Time: 1033104266, Level: 0}, n: 1033097479, x: 13}, {e: lookup.Epoch{Time: 1031391367, Level: 11}, n: 1031387304, x: 14}, {e: lookup.Epoch{Time: 1049781164, Level: 15}, n: 1049781163, x: 14}, {e: lookup.Epoch{Time: 1027271628, Level: 12}, n: 1027271627, x: 11}, {e: lookup.Epoch{Time: 1057270560, Level: 23}, n: 1057270560, x: 22}, {e: lookup.Epoch{Time: 1047501317, Level: 15}, n: 1047501317, x: 14}, {e: lookup.Epoch{Time: 1058349035, Level: 11}, n: 1045175573, x: 24}, {e: lookup.Epoch{Time: 1057396147, Level: 20}, n: 1057396147, x: 19}, {e: lookup.Epoch{Time: 1048906375, Level: 18}, n: 1039616919, x: 25}, {e: lookup.Epoch{Time: 1074294831, Level: 20}, n: 1074294831, x: 19}, {e: lookup.Epoch{Time: 1088946052, Level: 1}, n: 1088917364, x: 14}, {e: lookup.Epoch{Time: 1112337595, Level: 17}, n: 1111008110, x: 22}, {e: lookup.Epoch{Time: 1099990284, Level: 5}, n: 1099968370, x: 15}, {e: lookup.Epoch{Time: 1087036441, Level: 16}, n: 1053967855, x: 25}, {e: lookup.Epoch{Time: 1069225185, Level: 8}, n: 1069224660, x: 10}, {e: lookup.Epoch{Time: 1057505479, Level: 9}, n: 1057505170, x: 14}, {e: lookup.Epoch{Time: 1072381377, Level: 12}, n: 1065950959, x: 22}, {e: lookup.Epoch{Time: 1093887139, Level: 8}, n: 1093863305, x: 14}, {e: lookup.Epoch{Time: 1082366510, Level: 24}, n: 1082366510, x: 23}, {e: lookup.Epoch{Time: 1103231132, Level: 14}, n: 1102292201, x: 22}, {e: lookup.Epoch{Time: 1094502355, Level: 3}, n: 1094324652, x: 18}, {e: lookup.Epoch{Time: 1068488344, Level: 12}, n: 1067577330, x: 19}, {e: lookup.Epoch{Time: 1050278233, Level: 12}, n: 1050278232, x: 11}, {e: lookup.Epoch{Time: 1047660768, Level: 5}, n: 1047652137, x: 17}, {e: lookup.Epoch{Time: 1060116167, Level: 11}, n: 1060114091, x: 12}, {e: lookup.Epoch{Time: 1068149392, Level: 21}, n: 1052074801, x: 24}, {e: lookup.Epoch{Time: 1081934120, Level: 6}, n: 1081933847, x: 8}, {e: lookup.Epoch{Time: 1107943693, Level: 16}, n: 1107096139, x: 25}, {e: lookup.Epoch{Time: 1131571649, Level: 9}, n: 1131570428, x: 11}, {e: lookup.Epoch{Time: 1123139367, Level: 0}, n: 1122912198, x: 20}, {e: lookup.Epoch{Time: 1121144423, Level: 6}, n: 1120568289, x: 20}, {e: lookup.Epoch{Time: 1089932411, Level: 17}, n: 1089932410, x: 16}, {e: lookup.Epoch{Time: 1104899012, Level: 22}, n: 1098978789, x: 22}, {e: lookup.Epoch{Time: 1094588059, Level: 21}, n: 1094588059, x: 20}, {e: lookup.Epoch{Time: 1114987438, Level: 24}, n: 1114987437, x: 23}, {e: lookup.Epoch{Time: 1084186305, Level: 7}, n: 1084186241, x: 6}, {e: lookup.Epoch{Time: 1058827111, Level: 8}, n: 1058826504, x: 9}, {e: lookup.Epoch{Time: 1090679810, Level: 12}, n: 1090616539, x: 17}, {e: lookup.Epoch{Time: 1084299475, Level: 23}, n: 1084299475, x: 22}} - -func TestGetNextLevel(t *testing.T) { - - // First, test well-known cases - last := lookup.Epoch{ - Time: 1533799046, - Level: 5, - } - - level := lookup.GetNextLevel(last, last.Time) - expected := uint8(4) - if level != expected { - t.Fatalf("Expected GetNextLevel to return %d for same-time updates at a nonzero level, got %d", expected, level) - } - - level = lookup.GetNextLevel(last, last.Time+(1< lookup.HighestLevel { - v = 0 - } - now = last.Time + uint64(rand.Intn(1<. - -package feed - -import ( - "fmt" - "strconv" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/swarm/storage/feed/lookup" -) - -// Query is used to specify constraints when performing an update lookup -// TimeLimit indicates an upper bound for the search. Set to 0 for "now" -type Query struct { - Feed - Hint lookup.Epoch - TimeLimit uint64 -} - -// FromValues deserializes this instance from a string key-value store -// useful to parse query strings -func (q *Query) FromValues(values Values) error { - time, _ := strconv.ParseUint(values.Get("time"), 10, 64) - q.TimeLimit = time - - level, _ := strconv.ParseUint(values.Get("hint.level"), 10, 32) - q.Hint.Level = uint8(level) - q.Hint.Time, _ = strconv.ParseUint(values.Get("hint.time"), 10, 64) - if q.Feed.User == (common.Address{}) { - return q.Feed.FromValues(values) - } - return nil -} - -// AppendValues serializes this structure into the provided string key-value store -// useful to build query strings -func (q *Query) AppendValues(values Values) { - if q.TimeLimit != 0 { - values.Set("time", fmt.Sprintf("%d", q.TimeLimit)) - } - if q.Hint.Level != 0 { - values.Set("hint.level", fmt.Sprintf("%d", q.Hint.Level)) - } - if q.Hint.Time != 0 { - values.Set("hint.time", fmt.Sprintf("%d", q.Hint.Time)) - } - q.Feed.AppendValues(values) -} - -// NewQuery constructs an Query structure to find updates on or before `time` -// if time == 0, the latest update will be looked up -func NewQuery(feed *Feed, time uint64, hint lookup.Epoch) *Query { - return &Query{ - TimeLimit: time, - Feed: *feed, - Hint: hint, - } -} - -// NewQueryLatest generates lookup parameters that look for the latest update to a feed -func NewQueryLatest(feed *Feed, hint lookup.Epoch) *Query { - return NewQuery(feed, 0, hint) -} diff --git a/swarm/storage/feed/query_test.go b/swarm/storage/feed/query_test.go deleted file mode 100644 index 9fa5e29800d5..000000000000 --- a/swarm/storage/feed/query_test.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "testing" -) - -func getTestQuery() *Query { - id := getTestID() - return &Query{ - TimeLimit: 5000, - Feed: id.Feed, - Hint: id.Epoch, - } -} - -func TestQueryValues(t *testing.T) { - var expected = KV{"hint.level": "25", "hint.time": "1000", "time": "5000", "topic": "0x776f726c64206e657773207265706f72742c20657665727920686f7572000000", "user": "0x876A8936A7Cd0b79Ef0735AD0896c1AFe278781c"} - - query := getTestQuery() - testValueSerializer(t, query, expected) - -} diff --git a/swarm/storage/feed/request.go b/swarm/storage/feed/request.go deleted file mode 100644 index 5e1d0afc3ab0..000000000000 --- a/swarm/storage/feed/request.go +++ /dev/null @@ -1,286 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "bytes" - "encoding/json" - "hash" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/storage/feed/lookup" -) - -// Request represents a request to sign or signed feed update message -type Request struct { - Update // actual content that will be put on the chunk, less signature - Signature *Signature - idAddr storage.Address // cached chunk address for the update (not serialized, for internal use) - binaryData []byte // cached serialized data (does not get serialized again!, for efficiency/internal use) -} - -// updateRequestJSON represents a JSON-serialized UpdateRequest -type updateRequestJSON struct { - ID - ProtocolVersion uint8 `json:"protocolVersion"` - Data string `json:"data,omitempty"` - Signature string `json:"signature,omitempty"` -} - -// Request layout -// Update bytes -// SignatureLength bytes -const minimumSignedUpdateLength = minimumUpdateDataLength + signatureLength - -// NewFirstRequest returns a ready to sign request to publish a first feed update -func NewFirstRequest(topic Topic) *Request { - - request := new(Request) - - // get the current time - now := TimestampProvider.Now().Time - request.Epoch = lookup.GetFirstEpoch(now) - request.Feed.Topic = topic - request.Header.Version = ProtocolVersion - - return request -} - -// SetData stores the payload data the feed update will be updated with -func (r *Request) SetData(data []byte) { - r.data = data - r.Signature = nil -} - -// IsUpdate returns true if this request models a signed update or otherwise it is a signature request -func (r *Request) IsUpdate() bool { - return r.Signature != nil -} - -// Verify checks that signatures are valid -func (r *Request) Verify() (err error) { - if len(r.data) == 0 { - return NewError(ErrInvalidValue, "Update does not contain data") - } - if r.Signature == nil { - return NewError(ErrInvalidSignature, "Missing signature field") - } - - digest, err := r.GetDigest() - if err != nil { - return err - } - - // get the address of the signer (which also checks that it's a valid signature) - r.Feed.User, err = getUserAddr(digest, *r.Signature) - if err != nil { - return err - } - - // check that the lookup information contained in the chunk matches the updateAddr (chunk search key) - // that was used to retrieve this chunk - // if this validation fails, someone forged a chunk. - if !bytes.Equal(r.idAddr, r.Addr()) { - return NewError(ErrInvalidSignature, "Signature address does not match with update user address") - } - - return nil -} - -// Sign executes the signature to validate the update message -func (r *Request) Sign(signer Signer) error { - r.Feed.User = signer.Address() - r.binaryData = nil //invalidate serialized data - digest, err := r.GetDigest() // computes digest and serializes into .binaryData - if err != nil { - return err - } - - signature, err := signer.Sign(digest) - if err != nil { - return err - } - - // Although the Signer interface returns the public address of the signer, - // recover it from the signature to see if they match - userAddr, err := getUserAddr(digest, signature) - if err != nil { - return NewError(ErrInvalidSignature, "Error verifying signature") - } - - if userAddr != signer.Address() { // sanity check to make sure the Signer is declaring the same address used to sign! - return NewError(ErrInvalidSignature, "Signer address does not match update user address") - } - - r.Signature = &signature - r.idAddr = r.Addr() - return nil -} - -// GetDigest creates the feed update digest used in signatures -// the serialized payload is cached in .binaryData -func (r *Request) GetDigest() (result common.Hash, err error) { - hasher := hashPool.Get().(hash.Hash) - defer hashPool.Put(hasher) - hasher.Reset() - dataLength := r.Update.binaryLength() - if r.binaryData == nil { - r.binaryData = make([]byte, dataLength+signatureLength) - if err := r.Update.binaryPut(r.binaryData[:dataLength]); err != nil { - return result, err - } - } - hasher.Write(r.binaryData[:dataLength]) //everything except the signature. - - return common.BytesToHash(hasher.Sum(nil)), nil -} - -// create an update chunk. -func (r *Request) toChunk() (storage.Chunk, error) { - - // Check that the update is signed and serialized - // For efficiency, data is serialized during signature and cached in - // the binaryData field when computing the signature digest in .getDigest() - if r.Signature == nil || r.binaryData == nil { - return nil, NewError(ErrInvalidSignature, "toChunk called without a valid signature or payload data. Call .Sign() first.") - } - - updateLength := r.Update.binaryLength() - - // signature is the last item in the chunk data - copy(r.binaryData[updateLength:], r.Signature[:]) - - chunk := storage.NewChunk(r.idAddr, r.binaryData) - return chunk, nil -} - -// fromChunk populates this structure from chunk data. It does not verify the signature is valid. -func (r *Request) fromChunk(chunk storage.Chunk) error { - // for update chunk layout see Request definition - - chunkdata := chunk.Data() - - //deserialize the feed update portion - if err := r.Update.binaryGet(chunkdata[:len(chunkdata)-signatureLength]); err != nil { - return err - } - - // Extract the signature - var signature *Signature - cursor := r.Update.binaryLength() - sigdata := chunkdata[cursor : cursor+signatureLength] - if len(sigdata) > 0 { - signature = &Signature{} - copy(signature[:], sigdata) - } - - r.Signature = signature - r.idAddr = chunk.Address() - r.binaryData = chunkdata - - return nil - -} - -// FromValues deserializes this instance from a string key-value store -// useful to parse query strings -func (r *Request) FromValues(values Values, data []byte) error { - signatureBytes, err := hexutil.Decode(values.Get("signature")) - if err != nil { - r.Signature = nil - } else { - if len(signatureBytes) != signatureLength { - return NewError(ErrInvalidSignature, "Incorrect signature length") - } - r.Signature = new(Signature) - copy(r.Signature[:], signatureBytes) - } - err = r.Update.FromValues(values, data) - if err != nil { - return err - } - r.idAddr = r.Addr() - return err -} - -// AppendValues serializes this structure into the provided string key-value store -// useful to build query strings -func (r *Request) AppendValues(values Values) []byte { - if r.Signature != nil { - values.Set("signature", hexutil.Encode(r.Signature[:])) - } - return r.Update.AppendValues(values) -} - -// fromJSON takes an update request JSON and populates an UpdateRequest -func (r *Request) fromJSON(j *updateRequestJSON) error { - - r.ID = j.ID - r.Header.Version = j.ProtocolVersion - - var err error - if j.Data != "" { - r.data, err = hexutil.Decode(j.Data) - if err != nil { - return NewError(ErrInvalidValue, "Cannot decode data") - } - } - - if j.Signature != "" { - sigBytes, err := hexutil.Decode(j.Signature) - if err != nil || len(sigBytes) != signatureLength { - return NewError(ErrInvalidSignature, "Cannot decode signature") - } - r.Signature = new(Signature) - r.idAddr = r.Addr() - copy(r.Signature[:], sigBytes) - } - return nil -} - -// UnmarshalJSON takes a JSON structure stored in a byte array and populates the Request object -// Implements json.Unmarshaler interface -func (r *Request) UnmarshalJSON(rawData []byte) error { - var requestJSON updateRequestJSON - if err := json.Unmarshal(rawData, &requestJSON); err != nil { - return err - } - return r.fromJSON(&requestJSON) -} - -// MarshalJSON takes an update request and encodes it as a JSON structure into a byte array -// Implements json.Marshaler interface -func (r *Request) MarshalJSON() (rawData []byte, err error) { - var signatureString, dataString string - if r.Signature != nil { - signatureString = hexutil.Encode(r.Signature[:]) - } - if r.data != nil { - dataString = hexutil.Encode(r.data) - } - - requestJSON := &updateRequestJSON{ - ID: r.ID, - ProtocolVersion: r.Header.Version, - Data: dataString, - Signature: signatureString, - } - - return json.Marshal(requestJSON) -} diff --git a/swarm/storage/feed/request_test.go b/swarm/storage/feed/request_test.go deleted file mode 100644 index d02de3039e21..000000000000 --- a/swarm/storage/feed/request_test.go +++ /dev/null @@ -1,312 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "bytes" - "encoding/binary" - "encoding/json" - "fmt" - "reflect" - "testing" - - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/storage/feed/lookup" -) - -func areEqualJSON(s1, s2 string) (bool, error) { - //credit for the trick: turtlemonvh https://gist.github.com/turtlemonvh/e4f7404e28387fadb8ad275a99596f67 - var o1 interface{} - var o2 interface{} - - err := json.Unmarshal([]byte(s1), &o1) - if err != nil { - return false, fmt.Errorf("Error mashalling string 1 :: %s", err.Error()) - } - err = json.Unmarshal([]byte(s2), &o2) - if err != nil { - return false, fmt.Errorf("Error mashalling string 2 :: %s", err.Error()) - } - - return reflect.DeepEqual(o1, o2), nil -} - -// TestEncodingDecodingUpdateRequests ensures that requests are serialized properly -// while also checking cryptographically that only the owner of a feed can update it. -func TestEncodingDecodingUpdateRequests(t *testing.T) { - - charlie := newCharlieSigner() //Charlie - bob := newBobSigner() //Bob - - // Create a feed to our good guy Charlie's name - topic, _ := NewTopic("a good topic name", nil) - firstRequest := NewFirstRequest(topic) - firstRequest.User = charlie.Address() - - // We now encode the create message to simulate we send it over the wire - messageRawData, err := firstRequest.MarshalJSON() - if err != nil { - t.Fatalf("Error encoding first feed update request: %s", err) - } - - // ... the message arrives and is decoded... - var recoveredFirstRequest Request - if err := recoveredFirstRequest.UnmarshalJSON(messageRawData); err != nil { - t.Fatalf("Error decoding first feed update request: %s", err) - } - - // ... but verification should fail because it is not signed! - if err := recoveredFirstRequest.Verify(); err == nil { - t.Fatal("Expected Verify to fail since the message is not signed") - } - - // We now assume that the feed ypdate was created and propagated. - - const expectedSignature = "0x7235b27a68372ddebcf78eba48543fa460864b0b0e99cb533fcd3664820e603312d29426dd00fb39628f5299480a69bf6e462838d78de49ce0704c754c9deb2601" - const expectedJSON = `{"feed":{"topic":"0x6120676f6f6420746f706963206e616d65000000000000000000000000000000","user":"0x876a8936a7cd0b79ef0735ad0896c1afe278781c"},"epoch":{"time":1000,"level":1},"protocolVersion":0,"data":"0x5468697320686f75722773207570646174653a20537761726d2039392e3020686173206265656e2072656c656173656421"}` - - //Put together an unsigned update request that we will serialize to send it to the signer. - data := []byte("This hour's update: Swarm 99.0 has been released!") - request := &Request{ - Update: Update{ - ID: ID{ - Epoch: lookup.Epoch{ - Time: 1000, - Level: 1, - }, - Feed: firstRequest.Update.Feed, - }, - data: data, - }, - } - - messageRawData, err = request.MarshalJSON() - if err != nil { - t.Fatalf("Error encoding update request: %s", err) - } - - equalJSON, err := areEqualJSON(string(messageRawData), expectedJSON) - if err != nil { - t.Fatalf("Error decoding update request JSON: %s", err) - } - if !equalJSON { - t.Fatalf("Received a different JSON message. Expected %s, got %s", expectedJSON, string(messageRawData)) - } - - // now the encoded message messageRawData is sent over the wire and arrives to the signer - - //Attempt to extract an UpdateRequest out of the encoded message - var recoveredRequest Request - if err := recoveredRequest.UnmarshalJSON(messageRawData); err != nil { - t.Fatalf("Error decoding update request: %s", err) - } - - //sign the request and see if it matches our predefined signature above. - if err := recoveredRequest.Sign(charlie); err != nil { - t.Fatalf("Error signing request: %s", err) - } - - compareByteSliceToExpectedHex(t, "signature", recoveredRequest.Signature[:], expectedSignature) - - // mess with the signature and see what happens. To alter the signature, we briefly decode it as JSON - // to alter the signature field. - var j updateRequestJSON - if err := json.Unmarshal([]byte(expectedJSON), &j); err != nil { - t.Fatal("Error unmarshalling test json, check expectedJSON constant") - } - j.Signature = "Certainly not a signature" - corruptMessage, _ := json.Marshal(j) // encode the message with the bad signature - var corruptRequest Request - if err = corruptRequest.UnmarshalJSON(corruptMessage); err == nil { - t.Fatal("Expected DecodeUpdateRequest to fail when trying to interpret a corrupt message with an invalid signature") - } - - // Now imagine Bob wants to create an update of his own about the same feed, - // signing a message with his private key - if err := request.Sign(bob); err != nil { - t.Fatalf("Error signing: %s", err) - } - - // Now Bob encodes the message to send it over the wire... - messageRawData, err = request.MarshalJSON() - if err != nil { - t.Fatalf("Error encoding message:%s", err) - } - - // ... the message arrives to our Swarm node and it is decoded. - recoveredRequest = Request{} - if err := recoveredRequest.UnmarshalJSON(messageRawData); err != nil { - t.Fatalf("Error decoding message:%s", err) - } - - // Before checking what happened with Bob's update, let's see what would happen if we mess - // with the signature big time to see if Verify catches it - savedSignature := *recoveredRequest.Signature // save the signature for later - binary.LittleEndian.PutUint64(recoveredRequest.Signature[5:], 556845463424) // write some random data to break the signature - if err = recoveredRequest.Verify(); err == nil { - t.Fatal("Expected Verify to fail on corrupt signature") - } - - // restore the Bob's signature from corruption - *recoveredRequest.Signature = savedSignature - - // Now the signature is not corrupt - if err = recoveredRequest.Verify(); err != nil { - t.Fatal(err) - } - - // Reuse object and sign with our friend Charlie's private key - if err := recoveredRequest.Sign(charlie); err != nil { - t.Fatalf("Error signing with the correct private key: %s", err) - } - - // And now, Verify should work since this update now belongs to Charlie - if err = recoveredRequest.Verify(); err != nil { - t.Fatalf("Error verifying that Charlie, can sign a reused request object:%s", err) - } - - // mess with the lookup key to make sure Verify fails: - recoveredRequest.Time = 77999 // this will alter the lookup key - if err = recoveredRequest.Verify(); err == nil { - t.Fatalf("Expected Verify to fail since the lookup key has been altered") - } -} - -func getTestRequest() *Request { - return &Request{ - Update: *getTestFeedUpdate(), - } -} - -func TestUpdateChunkSerializationErrorChecking(t *testing.T) { - - // Test that parseUpdate fails if the chunk is too small - var r Request - if err := r.fromChunk(storage.NewChunk(storage.ZeroAddr, make([]byte, minimumUpdateDataLength-1+signatureLength))); err == nil { - t.Fatalf("Expected request.fromChunk to fail when chunkData contains less than %d bytes", minimumUpdateDataLength) - } - - r = *getTestRequest() - - _, err := r.toChunk() - if err == nil { - t.Fatal("Expected request.toChunk to fail when there is no data") - } - r.data = []byte("Al bien hacer jamás le falta premio") // put some arbitrary length data - _, err = r.toChunk() - if err == nil { - t.Fatal("expected request.toChunk to fail when there is no signature") - } - - charlie := newCharlieSigner() - if err := r.Sign(charlie); err != nil { - t.Fatalf("error signing:%s", err) - } - - chunk, err := r.toChunk() - if err != nil { - t.Fatalf("error creating update chunk:%s", err) - } - - compareByteSliceToExpectedHex(t, "chunk", chunk.Data(), "0x0000000000000000776f726c64206e657773207265706f72742c20657665727920686f7572000000876a8936a7cd0b79ef0735ad0896c1afe278781ce803000000000019416c206269656e206861636572206a616dc3a173206c652066616c7461207072656d696f5a0ffe0bc27f207cd5b00944c8b9cee93e08b89b5ada777f123ac535189333f174a6a4ca2f43a92c4a477a49d774813c36ce8288552c58e6205b0ac35d0507eb00") - - var recovered Request - recovered.fromChunk(chunk) - if !reflect.DeepEqual(recovered, r) { - t.Fatal("Expected recovered feed update request to equal the original one") - } -} - -// check that signature address matches update signer address -func TestReverse(t *testing.T) { - - epoch := lookup.Epoch{ - Time: 7888, - Level: 6, - } - - // make fake timeProvider - timeProvider := &fakeTimeProvider{ - currentTime: startTime.Time, - } - - // signer containing private key - signer := newAliceSigner() - - // set up rpc and create feeds handler - _, _, teardownTest, err := setupTest(timeProvider, signer) - if err != nil { - t.Fatal(err) - } - defer teardownTest() - - topic, _ := NewTopic("Cervantes quotes", nil) - fd := Feed{ - Topic: topic, - User: signer.Address(), - } - - data := []byte("Donde una puerta se cierra, otra se abre") - - request := new(Request) - request.Feed = fd - request.Epoch = epoch - request.data = data - - // generate a chunk key for this request - key := request.Addr() - - if err = request.Sign(signer); err != nil { - t.Fatal(err) - } - - chunk, err := request.toChunk() - if err != nil { - t.Fatal(err) - } - - // check that we can recover the owner account from the update chunk's signature - var checkUpdate Request - if err := checkUpdate.fromChunk(chunk); err != nil { - t.Fatal(err) - } - checkdigest, err := checkUpdate.GetDigest() - if err != nil { - t.Fatal(err) - } - recoveredAddr, err := getUserAddr(checkdigest, *checkUpdate.Signature) - if err != nil { - t.Fatalf("Retrieve address from signature fail: %v", err) - } - originalAddr := crypto.PubkeyToAddress(signer.PrivKey.PublicKey) - - // check that the metadata retrieved from the chunk matches what we gave it - if recoveredAddr != originalAddr { - t.Fatalf("addresses dont match: %x != %x", originalAddr, recoveredAddr) - } - - if !bytes.Equal(key[:], chunk.Address()[:]) { - t.Fatalf("Expected chunk key '%x', was '%x'", key, chunk.Address()) - } - if epoch != checkUpdate.Epoch { - t.Fatalf("Expected epoch to be '%s', was '%s'", epoch.String(), checkUpdate.Epoch.String()) - } - if !bytes.Equal(data, checkUpdate.data) { - t.Fatalf("Expected data '%x', was '%x'", data, checkUpdate.data) - } -} diff --git a/swarm/storage/feed/sign.go b/swarm/storage/feed/sign.go deleted file mode 100644 index 278f0f8d38c4..000000000000 --- a/swarm/storage/feed/sign.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "crypto/ecdsa" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" -) - -const signatureLength = 65 - -// Signature is an alias for a static byte array with the size of a signature -type Signature [signatureLength]byte - -// Signer signs feed update payloads -type Signer interface { - Sign(common.Hash) (Signature, error) - Address() common.Address -} - -// GenericSigner implements the Signer interface -// It is the vanilla signer that probably should be used in most cases -type GenericSigner struct { - PrivKey *ecdsa.PrivateKey - address common.Address -} - -// NewGenericSigner builds a signer that will sign everything with the provided private key -func NewGenericSigner(privKey *ecdsa.PrivateKey) *GenericSigner { - return &GenericSigner{ - PrivKey: privKey, - address: crypto.PubkeyToAddress(privKey.PublicKey), - } -} - -// Sign signs the supplied data -// It wraps the ethereum crypto.Sign() method -func (s *GenericSigner) Sign(data common.Hash) (signature Signature, err error) { - signaturebytes, err := crypto.Sign(data.Bytes(), s.PrivKey) - if err != nil { - return - } - copy(signature[:], signaturebytes) - return -} - -// Address returns the public key of the signer's private key -func (s *GenericSigner) Address() common.Address { - return s.address -} - -// getUserAddr extracts the address of the feed update signer -func getUserAddr(digest common.Hash, signature Signature) (common.Address, error) { - pub, err := crypto.SigToPub(digest.Bytes(), signature[:]) - if err != nil { - return common.Address{}, err - } - return crypto.PubkeyToAddress(*pub), nil -} diff --git a/swarm/storage/feed/testutil.go b/swarm/storage/feed/testutil.go deleted file mode 100644 index 24e5a6075842..000000000000 --- a/swarm/storage/feed/testutil.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "context" - "fmt" - "path/filepath" - "sync" - - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/swarm/storage" -) - -const ( - testDbDirName = "feeds" -) - -type TestHandler struct { - *Handler -} - -func (t *TestHandler) Close() { - t.chunkStore.Close() -} - -type mockNetFetcher struct{} - -func (m *mockNetFetcher) Request(ctx context.Context, hopCount uint8) { -} -func (m *mockNetFetcher) Offer(ctx context.Context, source *enode.ID) { -} - -func newFakeNetFetcher(context.Context, storage.Address, *sync.Map) storage.NetFetcher { - return &mockNetFetcher{} -} - -// NewTestHandler creates Handler object to be used for testing purposes. -func NewTestHandler(datadir string, params *HandlerParams) (*TestHandler, error) { - path := filepath.Join(datadir, testDbDirName) - fh := NewHandler(params) - localstoreparams := storage.NewDefaultLocalStoreParams() - localstoreparams.Init(path) - localStore, err := storage.NewLocalStore(localstoreparams, nil) - if err != nil { - return nil, fmt.Errorf("localstore create fail, path %s: %v", path, err) - } - localStore.Validators = append(localStore.Validators, storage.NewContentAddressValidator(storage.MakeHashFunc(feedsHashAlgorithm))) - localStore.Validators = append(localStore.Validators, fh) - netStore, err := storage.NewNetStore(localStore, nil) - if err != nil { - return nil, err - } - netStore.NewNetFetcherFunc = newFakeNetFetcher - fh.SetStore(netStore) - return &TestHandler{fh}, nil -} diff --git a/swarm/storage/feed/timestampprovider.go b/swarm/storage/feed/timestampprovider.go deleted file mode 100644 index fb60cea9c3d6..000000000000 --- a/swarm/storage/feed/timestampprovider.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "encoding/json" - "time" -) - -// TimestampProvider sets the time source of the feeds package -var TimestampProvider timestampProvider = NewDefaultTimestampProvider() - -// Timestamp encodes a point in time as a Unix epoch -type Timestamp struct { - Time uint64 `json:"time"` // Unix epoch timestamp, in seconds -} - -// timestampProvider interface describes a source of timestamp information -type timestampProvider interface { - Now() Timestamp // returns the current timestamp information -} - -// UnmarshalJSON implements the json.Unmarshaller interface -func (t *Timestamp) UnmarshalJSON(data []byte) error { - return json.Unmarshal(data, &t.Time) -} - -// MarshalJSON implements the json.Marshaller interface -func (t *Timestamp) MarshalJSON() ([]byte, error) { - return json.Marshal(t.Time) -} - -// DefaultTimestampProvider is a TimestampProvider that uses system time -// as time source -type DefaultTimestampProvider struct { -} - -// NewDefaultTimestampProvider creates a system clock based timestamp provider -func NewDefaultTimestampProvider() *DefaultTimestampProvider { - return &DefaultTimestampProvider{} -} - -// Now returns the current time according to this provider -func (dtp *DefaultTimestampProvider) Now() Timestamp { - return Timestamp{ - Time: uint64(time.Now().Unix()), - } -} diff --git a/swarm/storage/feed/topic.go b/swarm/storage/feed/topic.go deleted file mode 100644 index ade1ee7b4268..000000000000 --- a/swarm/storage/feed/topic.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "bytes" - "encoding/json" - "fmt" - - "github.com/nebulaai/nbai-node/common/bitutil" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/swarm/storage" -) - -// TopicLength establishes the max length of a topic string -const TopicLength = storage.AddressLength - -// Topic represents what a feed is about -type Topic [TopicLength]byte - -// ErrTopicTooLong is returned when creating a topic with a name/related content too long -var ErrTopicTooLong = fmt.Errorf("Topic is too long. Max length is %d", TopicLength) - -// NewTopic creates a new topic from a provided name and "related content" byte array, -// merging the two together. -// If relatedContent or name are longer than TopicLength, they will be truncated and an error returned -// name can be an empty string -// relatedContent can be nil -func NewTopic(name string, relatedContent []byte) (topic Topic, err error) { - if relatedContent != nil { - contentLength := len(relatedContent) - if contentLength > TopicLength { - contentLength = TopicLength - err = ErrTopicTooLong - } - copy(topic[:], relatedContent[:contentLength]) - } - nameBytes := []byte(name) - nameLength := len(nameBytes) - if nameLength > TopicLength { - nameLength = TopicLength - err = ErrTopicTooLong - } - bitutil.XORBytes(topic[:], topic[:], nameBytes[:nameLength]) - return topic, err -} - -// Hex will return the topic encoded as an hex string -func (t *Topic) Hex() string { - return hexutil.Encode(t[:]) -} - -// FromHex will parse a hex string into this Topic instance -func (t *Topic) FromHex(hex string) error { - bytes, err := hexutil.Decode(hex) - if err != nil || len(bytes) != len(t) { - return NewErrorf(ErrInvalidValue, "Cannot decode topic") - } - copy(t[:], bytes) - return nil -} - -// Name will try to extract the topic name out of the Topic -func (t *Topic) Name(relatedContent []byte) string { - nameBytes := *t - if relatedContent != nil { - contentLength := len(relatedContent) - if contentLength > TopicLength { - contentLength = TopicLength - } - bitutil.XORBytes(nameBytes[:], t[:], relatedContent[:contentLength]) - } - z := bytes.IndexByte(nameBytes[:], 0) - if z < 0 { - z = TopicLength - } - return string(nameBytes[:z]) - -} - -// UnmarshalJSON implements the json.Unmarshaller interface -func (t *Topic) UnmarshalJSON(data []byte) error { - var hex string - json.Unmarshal(data, &hex) - return t.FromHex(hex) -} - -// MarshalJSON implements the json.Marshaller interface -func (t *Topic) MarshalJSON() ([]byte, error) { - return json.Marshal(t.Hex()) -} diff --git a/swarm/storage/feed/topic_test.go b/swarm/storage/feed/topic_test.go deleted file mode 100644 index 65793a3a3df2..000000000000 --- a/swarm/storage/feed/topic_test.go +++ /dev/null @@ -1,50 +0,0 @@ -package feed - -import ( - "testing" - - "github.com/nebulaai/nbai-node/common/hexutil" -) - -func TestTopic(t *testing.T) { - related, _ := hexutil.Decode("0xabcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789") - topicName := "test-topic" - topic, _ := NewTopic(topicName, related) - hex := topic.Hex() - expectedHex := "0xdfa89c750e3108f9c2aeef0123456789abcdef0123456789abcdef0123456789" - if hex != expectedHex { - t.Fatalf("Expected %s, got %s", expectedHex, hex) - } - - var topic2 Topic - topic2.FromHex(hex) - if topic2 != topic { - t.Fatal("Expected recovered topic to be equal to original one") - } - - if topic2.Name(related) != topicName { - t.Fatal("Retrieved name does not match") - } - - bytes, err := topic2.MarshalJSON() - if err != nil { - t.Fatal(err) - } - expectedJSON := `"0xdfa89c750e3108f9c2aeef0123456789abcdef0123456789abcdef0123456789"` - equal, err := areEqualJSON(expectedJSON, string(bytes)) - if err != nil { - t.Fatal(err) - } - if !equal { - t.Fatalf("Expected JSON to be %s, got %s", expectedJSON, string(bytes)) - } - - err = topic2.UnmarshalJSON(bytes) - if err != nil { - t.Fatal(err) - } - if topic2 != topic { - t.Fatal("Expected recovered topic to be equal to original one") - } - -} diff --git a/swarm/storage/feed/update.go b/swarm/storage/feed/update.go deleted file mode 100644 index 6f7f22accc51..000000000000 --- a/swarm/storage/feed/update.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "fmt" - "strconv" - - "github.com/nebulaai/nbai-node/swarm/chunk" -) - -// ProtocolVersion defines the current version of the protocol that will be included in each update message -const ProtocolVersion uint8 = 0 - -const headerLength = 8 - -// Header defines a update message header including a protocol version byte -type Header struct { - Version uint8 // Protocol version - Padding [headerLength - 1]uint8 // reserved for future use -} - -// Update encapsulates the information sent as part of a feed update -type Update struct { - Header Header // - ID // Feed Update identifying information - data []byte // actual data payload -} - -const minimumUpdateDataLength = idLength + headerLength + 1 - -//MaxUpdateDataLength indicates the maximum payload size for a feed update -const MaxUpdateDataLength = chunk.DefaultSize - signatureLength - idLength - headerLength - -// binaryPut serializes the feed update information into the given slice -func (r *Update) binaryPut(serializedData []byte) error { - datalength := len(r.data) - if datalength == 0 { - return NewError(ErrInvalidValue, "a feed update must contain data") - } - - if datalength > MaxUpdateDataLength { - return NewErrorf(ErrInvalidValue, "feed update data is too big (length=%d). Max length=%d", datalength, MaxUpdateDataLength) - } - - if len(serializedData) != r.binaryLength() { - return NewErrorf(ErrInvalidValue, "slice passed to putBinary must be of exact size. Expected %d bytes", r.binaryLength()) - } - - var cursor int - // serialize Header - serializedData[cursor] = r.Header.Version - copy(serializedData[cursor+1:headerLength], r.Header.Padding[:headerLength-1]) - cursor += headerLength - - // serialize ID - if err := r.ID.binaryPut(serializedData[cursor : cursor+idLength]); err != nil { - return err - } - cursor += idLength - - // add the data - copy(serializedData[cursor:], r.data) - cursor += datalength - - return nil -} - -// binaryLength returns the expected number of bytes this structure will take to encode -func (r *Update) binaryLength() int { - return idLength + headerLength + len(r.data) -} - -// binaryGet populates this instance from the information contained in the passed byte slice -func (r *Update) binaryGet(serializedData []byte) error { - if len(serializedData) < minimumUpdateDataLength { - return NewErrorf(ErrNothingToReturn, "chunk less than %d bytes cannot be a feed update chunk", minimumUpdateDataLength) - } - dataLength := len(serializedData) - idLength - headerLength - // at this point we can be satisfied that we have the correct data length to read - - var cursor int - - // deserialize Header - r.Header.Version = serializedData[cursor] // extract the protocol version - copy(r.Header.Padding[:headerLength-1], serializedData[cursor+1:headerLength]) // extract the padding - cursor += headerLength - - if err := r.ID.binaryGet(serializedData[cursor : cursor+idLength]); err != nil { - return err - } - cursor += idLength - - data := serializedData[cursor : cursor+dataLength] - cursor += dataLength - - // now that all checks have passed, copy data into structure - r.data = make([]byte, dataLength) - copy(r.data, data) - - return nil - -} - -// FromValues deserializes this instance from a string key-value store -// useful to parse query strings -func (r *Update) FromValues(values Values, data []byte) error { - r.data = data - version, _ := strconv.ParseUint(values.Get("protocolVersion"), 10, 32) - r.Header.Version = uint8(version) - return r.ID.FromValues(values) -} - -// AppendValues serializes this structure into the provided string key-value store -// useful to build query strings -func (r *Update) AppendValues(values Values) []byte { - r.ID.AppendValues(values) - values.Set("protocolVersion", fmt.Sprintf("%d", r.Header.Version)) - return r.data -} diff --git a/swarm/storage/feed/update_test.go b/swarm/storage/feed/update_test.go deleted file mode 100644 index 24c09b361741..000000000000 --- a/swarm/storage/feed/update_test.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2018 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 feed - -import ( - "testing" -) - -func getTestFeedUpdate() *Update { - return &Update{ - ID: *getTestID(), - data: []byte("El que lee mucho y anda mucho, ve mucho y sabe mucho"), - } -} - -func TestUpdateSerializer(t *testing.T) { - testBinarySerializerRecovery(t, getTestFeedUpdate(), "0x0000000000000000776f726c64206e657773207265706f72742c20657665727920686f7572000000876a8936a7cd0b79ef0735ad0896c1afe278781ce803000000000019456c20717565206c6565206d7563686f207920616e6461206d7563686f2c207665206d7563686f20792073616265206d7563686f") -} - -func TestUpdateLengthCheck(t *testing.T) { - testBinarySerializerLengthCheck(t, getTestFeedUpdate()) - // Test fail if update is too big - update := getTestFeedUpdate() - update.data = make([]byte, MaxUpdateDataLength+100) - serialized := make([]byte, update.binaryLength()) - if err := update.binaryPut(serialized); err == nil { - t.Fatal("Expected update.binaryPut to fail since update is too big") - } - - // test fail if data is empty or nil - update.data = nil - serialized = make([]byte, update.binaryLength()) - if err := update.binaryPut(serialized); err == nil { - t.Fatal("Expected update.binaryPut to fail since data is empty") - } -} diff --git a/swarm/storage/filestore.go b/swarm/storage/filestore.go deleted file mode 100644 index 2d8d82d95a50..000000000000 --- a/swarm/storage/filestore.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "context" - "io" -) - -/* -FileStore provides the client API entrypoints Store and Retrieve to store and retrieve -It can store anything that has a byte slice representation, so files or serialised objects etc. - -Storage: FileStore calls the Chunker to segment the input datastream of any size to a merkle hashed tree of chunks. The key of the root block is returned to the client. - -Retrieval: given the key of the root block, the FileStore retrieves the block chunks and reconstructs the original data and passes it back as a lazy reader. A lazy reader is a reader with on-demand delayed processing, i.e. the chunks needed to reconstruct a large file are only fetched and processed if that particular part of the document is actually read. - -As the chunker produces chunks, FileStore dispatches them to its own chunk store -implementation for storage or retrieval. -*/ - -const ( - defaultLDBCapacity = 5000000 // capacity for LevelDB, by default 5*10^6*4096 bytes == 20GB - defaultCacheCapacity = 10000 // capacity for in-memory chunks' cache - defaultChunkRequestsCacheCapacity = 5000000 // capacity for container holding outgoing requests for chunks. should be set to LevelDB capacity -) - -type FileStore struct { - ChunkStore - hashFunc SwarmHasher -} - -type FileStoreParams struct { - Hash string -} - -func NewFileStoreParams() *FileStoreParams { - return &FileStoreParams{ - Hash: DefaultHash, - } -} - -// for testing locally -func NewLocalFileStore(datadir string, basekey []byte) (*FileStore, error) { - params := NewDefaultLocalStoreParams() - params.Init(datadir) - localStore, err := NewLocalStore(params, nil) - if err != nil { - return nil, err - } - localStore.Validators = append(localStore.Validators, NewContentAddressValidator(MakeHashFunc(DefaultHash))) - return NewFileStore(localStore, NewFileStoreParams()), nil -} - -func NewFileStore(store ChunkStore, params *FileStoreParams) *FileStore { - hashFunc := MakeHashFunc(params.Hash) - return &FileStore{ - ChunkStore: store, - hashFunc: hashFunc, - } -} - -// Public API. Main entry point for document retrieval directly. Used by the -// FS-aware API and httpaccess -// Chunk retrieval blocks on netStore requests with a timeout so reader will -// report error if retrieval of chunks within requested range time out. -// It returns a reader with the chunk data and whether the content was encrypted -func (f *FileStore) Retrieve(ctx context.Context, addr Address) (reader *LazyChunkReader, isEncrypted bool) { - isEncrypted = len(addr) > f.hashFunc().Size() - getter := NewHasherStore(f.ChunkStore, f.hashFunc, isEncrypted) - reader = TreeJoin(ctx, addr, getter, 0) - return -} - -// Public API. Main entry point for document storage directly. Used by the -// FS-aware API and httpaccess -func (f *FileStore) Store(ctx context.Context, data io.Reader, size int64, toEncrypt bool) (addr Address, wait func(context.Context) error, err error) { - putter := NewHasherStore(f.ChunkStore, f.hashFunc, toEncrypt) - return PyramidSplit(ctx, data, putter, putter) -} - -func (f *FileStore) HashSize() int { - return f.hashFunc().Size() -} diff --git a/swarm/storage/filestore_test.go b/swarm/storage/filestore_test.go deleted file mode 100644 index 78fa5a805c7c..000000000000 --- a/swarm/storage/filestore_test.go +++ /dev/null @@ -1,175 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "bytes" - "context" - "io" - "io/ioutil" - "os" - "testing" - - "github.com/nebulaai/nbai-node/swarm/testutil" -) - -const testDataSize = 0x0001000 - -func TestFileStorerandom(t *testing.T) { - testFileStoreRandom(false, t) - testFileStoreRandom(true, t) -} - -func testFileStoreRandom(toEncrypt bool, t *testing.T) { - tdb, cleanup, err := newTestDbStore(false, false) - defer cleanup() - if err != nil { - t.Fatalf("init dbStore failed: %v", err) - } - db := tdb.LDBStore - db.setCapacity(50000) - memStore := NewMemStore(NewDefaultStoreParams(), db) - localStore := &LocalStore{ - memStore: memStore, - DbStore: db, - } - - fileStore := NewFileStore(localStore, NewFileStoreParams()) - defer os.RemoveAll("/tmp/bzz") - - slice := testutil.RandomBytes(1, testDataSize) - ctx := context.TODO() - key, wait, err := fileStore.Store(ctx, bytes.NewReader(slice), testDataSize, toEncrypt) - if err != nil { - t.Fatalf("Store error: %v", err) - } - err = wait(ctx) - if err != nil { - t.Fatalf("Store waitt error: %v", err.Error()) - } - resultReader, isEncrypted := fileStore.Retrieve(context.TODO(), key) - if isEncrypted != toEncrypt { - t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) - } - resultSlice := make([]byte, testDataSize) - n, err := resultReader.ReadAt(resultSlice, 0) - if err != io.EOF { - t.Fatalf("Retrieve error: %v", err) - } - if n != testDataSize { - t.Fatalf("Slice size error got %d, expected %d.", n, testDataSize) - } - if !bytes.Equal(slice, resultSlice) { - t.Fatalf("Comparison error.") - } - ioutil.WriteFile("/tmp/slice.bzz.16M", slice, 0666) - ioutil.WriteFile("/tmp/result.bzz.16M", resultSlice, 0666) - localStore.memStore = NewMemStore(NewDefaultStoreParams(), db) - resultReader, isEncrypted = fileStore.Retrieve(context.TODO(), key) - if isEncrypted != toEncrypt { - t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) - } - for i := range resultSlice { - resultSlice[i] = 0 - } - n, err = resultReader.ReadAt(resultSlice, 0) - if err != io.EOF { - t.Fatalf("Retrieve error after removing memStore: %v", err) - } - if n != len(slice) { - t.Fatalf("Slice size error after removing memStore got %d, expected %d.", n, len(slice)) - } - if !bytes.Equal(slice, resultSlice) { - t.Fatalf("Comparison error after removing memStore.") - } -} - -func TestFileStoreCapacity(t *testing.T) { - testFileStoreCapacity(false, t) - testFileStoreCapacity(true, t) -} - -func testFileStoreCapacity(toEncrypt bool, t *testing.T) { - tdb, cleanup, err := newTestDbStore(false, false) - defer cleanup() - if err != nil { - t.Fatalf("init dbStore failed: %v", err) - } - db := tdb.LDBStore - memStore := NewMemStore(NewDefaultStoreParams(), db) - localStore := &LocalStore{ - memStore: memStore, - DbStore: db, - } - fileStore := NewFileStore(localStore, NewFileStoreParams()) - slice := testutil.RandomBytes(1, testDataSize) - ctx := context.TODO() - key, wait, err := fileStore.Store(ctx, bytes.NewReader(slice), testDataSize, toEncrypt) - if err != nil { - t.Errorf("Store error: %v", err) - } - err = wait(ctx) - if err != nil { - t.Fatalf("Store error: %v", err) - } - resultReader, isEncrypted := fileStore.Retrieve(context.TODO(), key) - if isEncrypted != toEncrypt { - t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) - } - resultSlice := make([]byte, len(slice)) - n, err := resultReader.ReadAt(resultSlice, 0) - if err != io.EOF { - t.Fatalf("Retrieve error: %v", err) - } - if n != len(slice) { - t.Fatalf("Slice size error got %d, expected %d.", n, len(slice)) - } - if !bytes.Equal(slice, resultSlice) { - t.Fatalf("Comparison error.") - } - // Clear memStore - memStore.setCapacity(0) - // check whether it is, indeed, empty - fileStore.ChunkStore = memStore - resultReader, isEncrypted = fileStore.Retrieve(context.TODO(), key) - if isEncrypted != toEncrypt { - t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) - } - if _, err = resultReader.ReadAt(resultSlice, 0); err == nil { - t.Fatalf("Was able to read %d bytes from an empty memStore.", len(slice)) - } - // check how it works with localStore - fileStore.ChunkStore = localStore - // localStore.dbStore.setCapacity(0) - resultReader, isEncrypted = fileStore.Retrieve(context.TODO(), key) - if isEncrypted != toEncrypt { - t.Fatalf("isEncrypted expected %v got %v", toEncrypt, isEncrypted) - } - for i := range resultSlice { - resultSlice[i] = 0 - } - n, err = resultReader.ReadAt(resultSlice, 0) - if err != io.EOF { - t.Fatalf("Retrieve error after clearing memStore: %v", err) - } - if n != len(slice) { - t.Fatalf("Slice size error after clearing memStore got %d, expected %d.", n, len(slice)) - } - if !bytes.Equal(slice, resultSlice) { - t.Fatalf("Comparison error after clearing memStore.") - } -} diff --git a/swarm/storage/hasherstore.go b/swarm/storage/hasherstore.go deleted file mode 100644 index 7f250ac991b2..000000000000 --- a/swarm/storage/hasherstore.go +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright 2018 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 ( - "context" - "fmt" - "sync/atomic" - - ch "github.com/nebulaai/nbai-node/swarm/chunk" - "github.com/nebulaai/nbai-node/swarm/storage/encryption" - "golang.org/x/crypto/sha3" -) - -type hasherStore struct { - store ChunkStore - toEncrypt bool - hashFunc SwarmHasher - hashSize int // content hash size - refSize int64 // reference size (content hash + possibly encryption key) - errC chan error // global error channel - doneC chan struct{} // closed by Close() call to indicate that count is the final number of chunks - quitC chan struct{} // closed to quit unterminated routines - // nrChunks is used with atomic functions - // it is required to be at the end of the struct to ensure 64bit alignment for arm architecture - // see: https://golang.org/pkg/sync/atomic/#pkg-note-BUG - nrChunks uint64 // number of chunks to store -} - -// NewHasherStore creates a hasherStore object, which implements Putter and Getter interfaces. -// With the HasherStore you can put and get chunk data (which is just []byte) into a ChunkStore -// and the hasherStore will take core of encryption/decryption of data if necessary -func NewHasherStore(store ChunkStore, hashFunc SwarmHasher, toEncrypt bool) *hasherStore { - hashSize := hashFunc().Size() - refSize := int64(hashSize) - if toEncrypt { - refSize += encryption.KeyLength - } - - h := &hasherStore{ - store: store, - toEncrypt: toEncrypt, - hashFunc: hashFunc, - hashSize: hashSize, - refSize: refSize, - errC: make(chan error), - doneC: make(chan struct{}), - quitC: make(chan struct{}), - } - - return h -} - -// Put stores the chunkData into the ChunkStore of the hasherStore and returns the reference. -// If hasherStore has a chunkEncryption object, the data will be encrypted. -// Asynchronous function, the data will not necessarily be stored when it returns. -func (h *hasherStore) Put(ctx context.Context, chunkData ChunkData) (Reference, error) { - c := chunkData - var encryptionKey encryption.Key - if h.toEncrypt { - var err error - c, encryptionKey, err = h.encryptChunkData(chunkData) - if err != nil { - return nil, err - } - } - chunk := h.createChunk(c) - h.storeChunk(ctx, chunk) - - return Reference(append(chunk.Address(), encryptionKey...)), nil -} - -// Get returns data of the chunk with the given reference (retrieved from the ChunkStore of hasherStore). -// If the data is encrypted and the reference contains an encryption key, it will be decrypted before -// return. -func (h *hasherStore) Get(ctx context.Context, ref Reference) (ChunkData, error) { - addr, encryptionKey, err := parseReference(ref, h.hashSize) - if err != nil { - return nil, err - } - - chunk, err := h.store.Get(ctx, addr) - if err != nil { - return nil, err - } - - chunkData := ChunkData(chunk.Data()) - toDecrypt := (encryptionKey != nil) - if toDecrypt { - var err error - chunkData, err = h.decryptChunkData(chunkData, encryptionKey) - if err != nil { - return nil, err - } - } - return chunkData, nil -} - -// Close indicates that no more chunks will be put with the hasherStore, so the Wait -// function can return when all the previously put chunks has been stored. -func (h *hasherStore) Close() { - close(h.doneC) -} - -// Wait returns when -// 1) the Close() function has been called and -// 2) all the chunks which has been Put has been stored -func (h *hasherStore) Wait(ctx context.Context) error { - defer close(h.quitC) - var nrStoredChunks uint64 // number of stored chunks - var done bool - doneC := h.doneC - for { - select { - // if context is done earlier, just return with the error - case <-ctx.Done(): - return ctx.Err() - // doneC is closed if all chunks have been submitted, from then we just wait until all of them are also stored - case <-doneC: - done = true - doneC = nil - // a chunk has been stored, if err is nil, then successfully, so increase the stored chunk counter - case err := <-h.errC: - if err != nil { - return err - } - nrStoredChunks++ - } - // if all the chunks have been submitted and all of them are stored, then we can return - if done { - if nrStoredChunks >= atomic.LoadUint64(&h.nrChunks) { - return nil - } - } - } -} - -func (h *hasherStore) createHash(chunkData ChunkData) Address { - hasher := h.hashFunc() - hasher.ResetWithLength(chunkData[:8]) // 8 bytes of length - hasher.Write(chunkData[8:]) // minus 8 []byte length - return hasher.Sum(nil) -} - -func (h *hasherStore) createChunk(chunkData ChunkData) *chunk { - hash := h.createHash(chunkData) - chunk := NewChunk(hash, chunkData) - return chunk -} - -func (h *hasherStore) encryptChunkData(chunkData ChunkData) (ChunkData, encryption.Key, error) { - if len(chunkData) < 8 { - return nil, nil, fmt.Errorf("Invalid ChunkData, min length 8 got %v", len(chunkData)) - } - - key, encryptedSpan, encryptedData, err := h.encrypt(chunkData) - if err != nil { - return nil, nil, err - } - c := make(ChunkData, len(encryptedSpan)+len(encryptedData)) - copy(c[:8], encryptedSpan) - copy(c[8:], encryptedData) - return c, key, nil -} - -func (h *hasherStore) decryptChunkData(chunkData ChunkData, encryptionKey encryption.Key) (ChunkData, error) { - if len(chunkData) < 8 { - return nil, fmt.Errorf("Invalid ChunkData, min length 8 got %v", len(chunkData)) - } - - decryptedSpan, decryptedData, err := h.decrypt(chunkData, encryptionKey) - if err != nil { - return nil, err - } - - // removing extra bytes which were just added for padding - length := ChunkData(decryptedSpan).Size() - for length > ch.DefaultSize { - length = length + (ch.DefaultSize - 1) - length = length / ch.DefaultSize - length *= uint64(h.refSize) - } - - c := make(ChunkData, length+8) - copy(c[:8], decryptedSpan) - copy(c[8:], decryptedData[:length]) - - return c, nil -} - -func (h *hasherStore) RefSize() int64 { - return h.refSize -} - -func (h *hasherStore) encrypt(chunkData ChunkData) (encryption.Key, []byte, []byte, error) { - key := encryption.GenerateRandomKey(encryption.KeyLength) - encryptedSpan, err := h.newSpanEncryption(key).Encrypt(chunkData[:8]) - if err != nil { - return nil, nil, nil, err - } - encryptedData, err := h.newDataEncryption(key).Encrypt(chunkData[8:]) - if err != nil { - return nil, nil, nil, err - } - return key, encryptedSpan, encryptedData, nil -} - -func (h *hasherStore) decrypt(chunkData ChunkData, key encryption.Key) ([]byte, []byte, error) { - encryptedSpan, err := h.newSpanEncryption(key).Encrypt(chunkData[:8]) - if err != nil { - return nil, nil, err - } - encryptedData, err := h.newDataEncryption(key).Encrypt(chunkData[8:]) - if err != nil { - return nil, nil, err - } - return encryptedSpan, encryptedData, nil -} - -func (h *hasherStore) newSpanEncryption(key encryption.Key) encryption.Encryption { - return encryption.New(key, 0, uint32(ch.DefaultSize/h.refSize), sha3.NewLegacyKeccak256) -} - -func (h *hasherStore) newDataEncryption(key encryption.Key) encryption.Encryption { - return encryption.New(key, int(ch.DefaultSize), 0, sha3.NewLegacyKeccak256) -} - -func (h *hasherStore) storeChunk(ctx context.Context, chunk *chunk) { - atomic.AddUint64(&h.nrChunks, 1) - go func() { - select { - case h.errC <- h.store.Put(ctx, chunk): - case <-h.quitC: - } - }() -} - -func parseReference(ref Reference, hashSize int) (Address, encryption.Key, error) { - encryptedRefLength := hashSize + encryption.KeyLength - switch len(ref) { - case AddressLength: - return Address(ref), nil, nil - case encryptedRefLength: - encKeyIdx := len(ref) - encryption.KeyLength - return Address(ref[:encKeyIdx]), encryption.Key(ref[encKeyIdx:]), nil - default: - return nil, nil, fmt.Errorf("Invalid reference length, expected %v or %v got %v", hashSize, encryptedRefLength, len(ref)) - } -} diff --git a/swarm/storage/hasherstore_test.go b/swarm/storage/hasherstore_test.go deleted file mode 100644 index fe3257495b73..000000000000 --- a/swarm/storage/hasherstore_test.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright 2018 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 ( - "bytes" - "context" - "testing" - - "github.com/nebulaai/nbai-node/swarm/storage/encryption" - - "github.com/nebulaai/nbai-node/common" -) - -func TestHasherStore(t *testing.T) { - var tests = []struct { - chunkLength int - toEncrypt bool - }{ - {10, false}, - {100, false}, - {1000, false}, - {4096, false}, - {10, true}, - {100, true}, - {1000, true}, - {4096, true}, - } - - for _, tt := range tests { - chunkStore := NewMapChunkStore() - hasherStore := NewHasherStore(chunkStore, MakeHashFunc(DefaultHash), tt.toEncrypt) - - // Put two random chunks into the hasherStore - chunkData1 := GenerateRandomChunk(int64(tt.chunkLength)).Data() - ctx, cancel := context.WithTimeout(context.Background(), getTimeout) - defer cancel() - key1, err := hasherStore.Put(ctx, chunkData1) - if err != nil { - t.Fatalf("Expected no error got \"%v\"", err) - } - - chunkData2 := GenerateRandomChunk(int64(tt.chunkLength)).Data() - key2, err := hasherStore.Put(ctx, chunkData2) - if err != nil { - t.Fatalf("Expected no error got \"%v\"", err) - } - - hasherStore.Close() - - // Wait until chunks are really stored - err = hasherStore.Wait(ctx) - if err != nil { - t.Fatalf("Expected no error got \"%v\"", err) - } - - // Get the first chunk - retrievedChunkData1, err := hasherStore.Get(ctx, key1) - if err != nil { - t.Fatalf("Expected no error, got \"%v\"", err) - } - - // Retrieved data should be same as the original - if !bytes.Equal(chunkData1, retrievedChunkData1) { - t.Fatalf("Expected retrieved chunk data %v, got %v", common.Bytes2Hex(chunkData1), common.Bytes2Hex(retrievedChunkData1)) - } - - // Get the second chunk - retrievedChunkData2, err := hasherStore.Get(ctx, key2) - if err != nil { - t.Fatalf("Expected no error, got \"%v\"", err) - } - - // Retrieved data should be same as the original - if !bytes.Equal(chunkData2, retrievedChunkData2) { - t.Fatalf("Expected retrieved chunk data %v, got %v", common.Bytes2Hex(chunkData2), common.Bytes2Hex(retrievedChunkData2)) - } - - hash1, encryptionKey1, err := parseReference(key1, hasherStore.hashSize) - if err != nil { - t.Fatalf("Expected no error, got \"%v\"", err) - } - - if tt.toEncrypt { - if encryptionKey1 == nil { - t.Fatal("Expected non-nil encryption key, got nil") - } else if len(encryptionKey1) != encryption.KeyLength { - t.Fatalf("Expected encryption key length %v, got %v", encryption.KeyLength, len(encryptionKey1)) - } - } - if !tt.toEncrypt && encryptionKey1 != nil { - t.Fatalf("Expected nil encryption key, got key with length %v", len(encryptionKey1)) - } - - // Check if chunk data in store is encrypted or not - chunkInStore, err := chunkStore.Get(ctx, hash1) - if err != nil { - t.Fatalf("Expected no error got \"%v\"", err) - } - - chunkDataInStore := chunkInStore.Data() - - if tt.toEncrypt && bytes.Equal(chunkData1, chunkDataInStore) { - t.Fatalf("Chunk expected to be encrypted but it is stored without encryption") - } - if !tt.toEncrypt && !bytes.Equal(chunkData1, chunkDataInStore) { - t.Fatalf("Chunk expected to be not encrypted but stored content is different. Expected %v got %v", common.Bytes2Hex(chunkData1), common.Bytes2Hex(chunkDataInStore)) - } - } -} diff --git a/swarm/storage/ldbstore.go b/swarm/storage/ldbstore.go deleted file mode 100644 index 9f05aa9b3d84..000000000000 --- a/swarm/storage/ldbstore.go +++ /dev/null @@ -1,1068 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -// disk storage layer for the package bzz -// DbStore implements the ChunkStore interface and is used by the FileStore as -// persistent storage of chunks -// it implements purging based on access count allowing for external control of -// max capacity - -package storage - -import ( - "archive/tar" - "bytes" - "context" - "encoding/binary" - "encoding/hex" - "errors" - "fmt" - "io" - "io/ioutil" - "sync" - - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/rlp" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/storage/mock" - "github.com/syndtr/goleveldb/leveldb" -) - -const ( - defaultGCRatio = 10 - defaultMaxGCRound = 10000 - defaultMaxGCBatch = 5000 - - wEntryCnt = 1 << 0 - wIndexCnt = 1 << 1 - wAccessCnt = 1 << 2 -) - -var ( - dbEntryCount = metrics.NewRegisteredCounter("ldbstore.entryCnt", nil) -) - -var ( - keyIndex = byte(0) - keyAccessCnt = []byte{2} - keyEntryCnt = []byte{3} - keyDataIdx = []byte{4} - keyData = byte(6) - keyDistanceCnt = byte(7) - keySchema = []byte{8} - keyGCIdx = byte(9) // access to chunk data index, used by garbage collection in ascending order from first entry -) - -var ( - ErrDBClosed = errors.New("LDBStore closed") -) - -type LDBStoreParams struct { - *StoreParams - Path string - Po func(Address) uint8 -} - -// NewLDBStoreParams constructs LDBStoreParams with the specified values. -func NewLDBStoreParams(storeparams *StoreParams, path string) *LDBStoreParams { - return &LDBStoreParams{ - StoreParams: storeparams, - Path: path, - Po: func(k Address) (ret uint8) { return uint8(Proximity(storeparams.BaseKey, k[:])) }, - } -} - -type garbage struct { - maxRound int // maximum number of chunks to delete in one garbage collection round - maxBatch int // maximum number of chunks to delete in one db request batch - ratio int // 1/x ratio to calculate the number of chunks to gc on a low capacity db - count int // number of chunks deleted in running round - target int // number of chunks to delete in running round - batch *dbBatch // the delete batch - runC chan struct{} // struct in chan means gc is NOT running -} - -type LDBStore struct { - db *LDBDatabase - - // this should be stored in db, accessed transactionally - entryCnt uint64 // number of items in the LevelDB - accessCnt uint64 // ever-accumulating number increased every time we read/access an entry - dataIdx uint64 // similar to entryCnt, but we only increment it - capacity uint64 - bucketCnt []uint64 - - hashfunc SwarmHasher - po func(Address) uint8 - - batchesC chan struct{} - closed bool - batch *dbBatch - lock sync.RWMutex - quit chan struct{} - gc *garbage - - // Functions encodeDataFunc is used to bypass - // the default functionality of DbStore with - // mock.NodeStore for testing purposes. - encodeDataFunc func(chunk Chunk) []byte - // If getDataFunc is defined, it will be used for - // retrieving the chunk data instead from the local - // LevelDB database. - getDataFunc func(key Address) (data []byte, err error) -} - -type dbBatch struct { - *leveldb.Batch - err error - c chan struct{} -} - -func newBatch() *dbBatch { - return &dbBatch{Batch: new(leveldb.Batch), c: make(chan struct{})} -} - -// TODO: Instead of passing the distance function, just pass the address from which distances are calculated -// to avoid the appearance of a pluggable distance metric and opportunities of bugs associated with providing -// a function different from the one that is actually used. -func NewLDBStore(params *LDBStoreParams) (s *LDBStore, err error) { - s = new(LDBStore) - s.hashfunc = params.Hash - s.quit = make(chan struct{}) - - s.batchesC = make(chan struct{}, 1) - go s.writeBatches() - s.batch = newBatch() - // associate encodeData with default functionality - s.encodeDataFunc = encodeData - - s.db, err = NewLDBDatabase(params.Path) - if err != nil { - return nil, err - } - - s.po = params.Po - s.setCapacity(params.DbCapacity) - - s.bucketCnt = make([]uint64, 0x100) - for i := 0; i < 0x100; i++ { - k := make([]byte, 2) - k[0] = keyDistanceCnt - k[1] = uint8(i) - cnt, _ := s.db.Get(k) - s.bucketCnt[i] = BytesToU64(cnt) - } - data, _ := s.db.Get(keyEntryCnt) - s.entryCnt = BytesToU64(data) - data, _ = s.db.Get(keyAccessCnt) - s.accessCnt = BytesToU64(data) - data, _ = s.db.Get(keyDataIdx) - s.dataIdx = BytesToU64(data) - - // set up garbage collection - s.gc = &garbage{ - maxBatch: defaultMaxGCBatch, - maxRound: defaultMaxGCRound, - ratio: defaultGCRatio, - } - - s.gc.runC = make(chan struct{}, 1) - s.gc.runC <- struct{}{} - - return s, nil -} - -// MarkAccessed increments the access counter as a best effort for a chunk, so -// the chunk won't get garbage collected. -func (s *LDBStore) MarkAccessed(addr Address) { - s.lock.Lock() - defer s.lock.Unlock() - - if s.closed { - return - } - - proximity := s.po(addr) - s.tryAccessIdx(addr, proximity) -} - -// initialize and set values for processing of gc round -func (s *LDBStore) startGC(c int) { - - s.gc.count = 0 - // calculate the target number of deletions - if c >= s.gc.maxRound { - s.gc.target = s.gc.maxRound - } else { - s.gc.target = c / s.gc.ratio - } - s.gc.batch = newBatch() - log.Debug("startgc", "requested", c, "target", s.gc.target) -} - -// NewMockDbStore creates a new instance of DbStore with -// mockStore set to a provided value. If mockStore argument is nil, -// this function behaves exactly as NewDbStore. -func NewMockDbStore(params *LDBStoreParams, mockStore *mock.NodeStore) (s *LDBStore, err error) { - s, err = NewLDBStore(params) - if err != nil { - return nil, err - } - - // replace put and get with mock store functionality - if mockStore != nil { - s.encodeDataFunc = newMockEncodeDataFunc(mockStore) - s.getDataFunc = newMockGetDataFunc(mockStore) - } - return -} - -type dpaDBIndex struct { - Idx uint64 - Access uint64 -} - -func BytesToU64(data []byte) uint64 { - if len(data) < 8 { - return 0 - } - return binary.BigEndian.Uint64(data) -} - -func U64ToBytes(val uint64) []byte { - data := make([]byte, 8) - binary.BigEndian.PutUint64(data, val) - return data -} - -func getIndexKey(hash Address) []byte { - hashSize := len(hash) - key := make([]byte, hashSize+1) - key[0] = keyIndex - copy(key[1:], hash[:]) - return key -} - -func getDataKey(idx uint64, po uint8) []byte { - key := make([]byte, 10) - key[0] = keyData - key[1] = po - binary.BigEndian.PutUint64(key[2:], idx) - - return key -} - -func getGCIdxKey(index *dpaDBIndex) []byte { - key := make([]byte, 9) - key[0] = keyGCIdx - binary.BigEndian.PutUint64(key[1:], index.Access) - return key -} - -func getGCIdxValue(index *dpaDBIndex, po uint8, addr Address) []byte { - val := make([]byte, 41) // po = 1, index.Index = 8, Address = 32 - val[0] = po - binary.BigEndian.PutUint64(val[1:], index.Idx) - copy(val[9:], addr) - return val -} - -func parseIdxKey(key []byte) (byte, []byte) { - return key[0], key[1:] -} - -func parseGCIdxEntry(accessCnt []byte, val []byte) (index *dpaDBIndex, po uint8, addr Address) { - index = &dpaDBIndex{ - Idx: binary.BigEndian.Uint64(val[1:]), - Access: binary.BigEndian.Uint64(accessCnt), - } - po = val[0] - addr = val[9:] - return -} - -func encodeIndex(index *dpaDBIndex) []byte { - data, _ := rlp.EncodeToBytes(index) - return data -} - -func encodeData(chunk Chunk) []byte { - // Always create a new underlying array for the returned byte slice. - // The chunk.Address array may be used in the returned slice which - // may be changed later in the code or by the LevelDB, resulting - // that the Address is changed as well. - return append(append([]byte{}, chunk.Address()[:]...), chunk.Data()...) -} - -func decodeIndex(data []byte, index *dpaDBIndex) error { - dec := rlp.NewStream(bytes.NewReader(data), 0) - return dec.Decode(index) -} - -func decodeData(addr Address, data []byte) (*chunk, error) { - return NewChunk(addr, data[32:]), nil -} - -func (s *LDBStore) collectGarbage() error { - - // prevent duplicate gc from starting when one is already running - select { - case <-s.gc.runC: - default: - return nil - } - - s.lock.Lock() - entryCnt := s.entryCnt - s.lock.Unlock() - - metrics.GetOrRegisterCounter("ldbstore.collectgarbage", nil).Inc(1) - - // calculate the amount of chunks to collect and reset counter - s.startGC(int(entryCnt)) - log.Debug("collectGarbage", "target", s.gc.target, "entryCnt", entryCnt) - - var totalDeleted int - for s.gc.count < s.gc.target { - it := s.db.NewIterator() - ok := it.Seek([]byte{keyGCIdx}) - var singleIterationCount int - - // every batch needs a lock so we avoid entries changing accessidx in the meantime - s.lock.Lock() - for ; ok && (singleIterationCount < s.gc.maxBatch); ok = it.Next() { - - // quit if no more access index keys - itkey := it.Key() - if (itkey == nil) || (itkey[0] != keyGCIdx) { - break - } - - // get chunk data entry from access index - val := it.Value() - index, po, hash := parseGCIdxEntry(itkey[1:], val) - keyIdx := make([]byte, 33) - keyIdx[0] = keyIndex - copy(keyIdx[1:], hash) - - // add delete operation to batch - s.delete(s.gc.batch.Batch, index, keyIdx, po) - singleIterationCount++ - s.gc.count++ - log.Trace("garbage collect enqueued chunk for deletion", "key", hash) - - // break if target is not on max garbage batch boundary - if s.gc.count >= s.gc.target { - break - } - } - - s.writeBatch(s.gc.batch, wEntryCnt) - s.lock.Unlock() - it.Release() - log.Trace("garbage collect batch done", "batch", singleIterationCount, "total", s.gc.count) - } - - s.gc.runC <- struct{}{} - log.Debug("garbage collect done", "c", s.gc.count) - - metrics.GetOrRegisterCounter("ldbstore.collectgarbage.delete", nil).Inc(int64(totalDeleted)) - return nil -} - -// Export writes all chunks from the store to a tar archive, returning the -// number of chunks written. -func (s *LDBStore) 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{keyIndex}); ok; ok = it.Next() { - key := it.Key() - if (key == nil) || (key[0] != keyIndex) { - break - } - - var index dpaDBIndex - - hash := key[1:] - decodeIndex(it.Value(), &index) - po := s.po(hash) - datakey := getDataKey(index.Idx, po) - log.Trace("store.export", "dkey", fmt.Sprintf("%x", datakey), "dataidx", index.Idx, "po", po) - data, err := s.db.Get(datakey) - 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(hash), - 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 -} - -// of chunks read. -func (s *LDBStore) Import(in io.Reader) (int64, error) { - tr := tar.NewReader(in) - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - countC := make(chan int64) - errC := make(chan error) - var count int64 - go func() { - for { - hdr, err := tr.Next() - if err == io.EOF { - break - } else if err != nil { - select { - case errC <- err: - case <-ctx.Done(): - } - } - - if len(hdr.Name) != 64 { - log.Warn("ignoring non-chunk file", "name", hdr.Name) - continue - } - - keybytes, 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 { - select { - case errC <- err: - case <-ctx.Done(): - } - } - key := Address(keybytes) - chunk := NewChunk(key, data[32:]) - - go func() { - select { - case errC <- s.Put(ctx, chunk): - case <-ctx.Done(): - } - }() - - count++ - } - countC <- count - }() - - // wait for all chunks to be stored - i := int64(0) - var total int64 - for { - select { - case err := <-errC: - if err != nil { - return count, err - } - i++ - case total = <-countC: - case <-ctx.Done(): - return i, ctx.Err() - } - if total > 0 && i == total { - return total, nil - } - } -} - -// Cleanup iterates over the database and deletes chunks if they pass the `f` condition -func (s *LDBStore) Cleanup(f func(*chunk) bool) { - var errorsFound, removed, total int - - it := s.db.NewIterator() - defer it.Release() - for ok := it.Seek([]byte{keyIndex}); ok; ok = it.Next() { - key := it.Key() - if (key == nil) || (key[0] != keyIndex) { - break - } - total++ - var index dpaDBIndex - err := decodeIndex(it.Value(), &index) - if err != nil { - log.Warn("Cannot decode") - errorsFound++ - continue - } - hash := key[1:] - po := s.po(hash) - datakey := getDataKey(index.Idx, po) - data, err := s.db.Get(datakey) - if err != nil { - found := false - - // highest possible proximity is 255 - for po = 1; po <= 255; po++ { - datakey = getDataKey(index.Idx, po) - data, err = s.db.Get(datakey) - if err == nil { - found = true - break - } - } - - if !found { - log.Warn(fmt.Sprintf("Chunk %x found but count not be accessed with any po", key)) - errorsFound++ - continue - } - } - - ck := data[:32] - c, err := decodeData(ck, data) - if err != nil { - log.Error("decodeData error", "err", err) - continue - } - - cs := int64(binary.LittleEndian.Uint64(c.sdata[:8])) - log.Trace("chunk", "key", fmt.Sprintf("%x", key), "ck", fmt.Sprintf("%x", ck), "dkey", fmt.Sprintf("%x", datakey), "dataidx", index.Idx, "po", po, "len data", len(data), "len sdata", len(c.sdata), "size", cs) - - // if chunk is to be removed - if f(c) { - log.Warn("chunk for cleanup", "key", fmt.Sprintf("%x", key), "ck", fmt.Sprintf("%x", ck), "dkey", fmt.Sprintf("%x", datakey), "dataidx", index.Idx, "po", po, "len data", len(data), "len sdata", len(c.sdata), "size", cs) - s.deleteNow(&index, getIndexKey(key[1:]), po) - removed++ - errorsFound++ - } - } - - log.Warn(fmt.Sprintf("Found %v errors out of %v entries. Removed %v chunks.", errorsFound, total, removed)) -} - -// CleanGCIndex rebuilds the garbage collector index from scratch, while -// removing inconsistent elements, e.g., indices with missing data chunks. -// WARN: it's a pretty heavy, long running function. -func (s *LDBStore) CleanGCIndex() error { - s.lock.Lock() - defer s.lock.Unlock() - - batch := leveldb.Batch{} - - var okEntryCount uint64 - var totalEntryCount uint64 - - // throw out all gc indices, we will rebuild from cleaned index - it := s.db.NewIterator() - it.Seek([]byte{keyGCIdx}) - var gcDeletes int - for it.Valid() { - rowType, _ := parseIdxKey(it.Key()) - if rowType != keyGCIdx { - break - } - batch.Delete(it.Key()) - gcDeletes++ - it.Next() - } - log.Debug("gc", "deletes", gcDeletes) - if err := s.db.Write(&batch); err != nil { - return err - } - batch.Reset() - - it.Release() - - // corrected po index pointer values - var poPtrs [256]uint64 - - // set to true if chunk count not on 4096 iteration boundary - var doneIterating bool - - // last key index in previous iteration - lastIdxKey := []byte{keyIndex} - - // counter for debug output - var cleanBatchCount int - - // go through all key index entries - for !doneIterating { - cleanBatchCount++ - var idxs []dpaDBIndex - var chunkHashes [][]byte - var pos []uint8 - it := s.db.NewIterator() - - it.Seek(lastIdxKey) - - // 4096 is just a nice number, don't look for any hidden meaning here... - var i int - for i = 0; i < 4096; i++ { - - // this really shouldn't happen unless database is empty - // but let's keep it to be safe - if !it.Valid() { - doneIterating = true - break - } - - // if it's not keyindex anymore we're done iterating - rowType, chunkHash := parseIdxKey(it.Key()) - if rowType != keyIndex { - doneIterating = true - break - } - - // decode the retrieved index - var idx dpaDBIndex - err := decodeIndex(it.Value(), &idx) - if err != nil { - return fmt.Errorf("corrupt index: %v", err) - } - po := s.po(chunkHash) - lastIdxKey = it.Key() - - // if we don't find the data key, remove the entry - // if we find it, add to the array of new gc indices to create - dataKey := getDataKey(idx.Idx, po) - _, err = s.db.Get(dataKey) - if err != nil { - log.Warn("deleting inconsistent index (missing data)", "key", chunkHash) - batch.Delete(it.Key()) - } else { - idxs = append(idxs, idx) - chunkHashes = append(chunkHashes, chunkHash) - pos = append(pos, po) - okEntryCount++ - if idx.Idx > poPtrs[po] { - poPtrs[po] = idx.Idx - } - } - totalEntryCount++ - it.Next() - } - it.Release() - - // flush the key index corrections - err := s.db.Write(&batch) - if err != nil { - return err - } - batch.Reset() - - // add correct gc indices - for i, okIdx := range idxs { - gcIdxKey := getGCIdxKey(&okIdx) - gcIdxData := getGCIdxValue(&okIdx, pos[i], chunkHashes[i]) - batch.Put(gcIdxKey, gcIdxData) - log.Trace("clean ok", "key", chunkHashes[i], "gcKey", gcIdxKey, "gcData", gcIdxData) - } - - // flush them - err = s.db.Write(&batch) - if err != nil { - return err - } - batch.Reset() - - log.Debug("clean gc index pass", "batch", cleanBatchCount, "checked", i, "kept", len(idxs)) - } - - log.Debug("gc cleanup entries", "ok", okEntryCount, "total", totalEntryCount, "batchlen", batch.Len()) - - // lastly add updated entry count - var entryCount [8]byte - binary.BigEndian.PutUint64(entryCount[:], okEntryCount) - batch.Put(keyEntryCnt, entryCount[:]) - - // and add the new po index pointers - var poKey [2]byte - poKey[0] = keyDistanceCnt - for i, poPtr := range poPtrs { - poKey[1] = uint8(i) - if poPtr == 0 { - batch.Delete(poKey[:]) - } else { - var idxCount [8]byte - binary.BigEndian.PutUint64(idxCount[:], poPtr) - batch.Put(poKey[:], idxCount[:]) - } - } - - // if you made it this far your harddisk has survived. Congratulations - return s.db.Write(&batch) -} - -// Delete is removes a chunk and updates indices. -// Is thread safe -func (s *LDBStore) Delete(addr Address) error { - s.lock.Lock() - defer s.lock.Unlock() - - ikey := getIndexKey(addr) - - idata, err := s.db.Get(ikey) - if err != nil { - return err - } - - var idx dpaDBIndex - decodeIndex(idata, &idx) - proximity := s.po(addr) - return s.deleteNow(&idx, ikey, proximity) -} - -// executes one delete operation immediately -// see *LDBStore.delete -func (s *LDBStore) deleteNow(idx *dpaDBIndex, idxKey []byte, po uint8) error { - batch := new(leveldb.Batch) - s.delete(batch, idx, idxKey, po) - return s.db.Write(batch) -} - -// adds a delete chunk operation to the provided batch -// if called directly, decrements entrycount regardless if the chunk exists upon deletion. Risk of wrap to max uint64 -func (s *LDBStore) delete(batch *leveldb.Batch, idx *dpaDBIndex, idxKey []byte, po uint8) { - metrics.GetOrRegisterCounter("ldbstore.delete", nil).Inc(1) - - gcIdxKey := getGCIdxKey(idx) - batch.Delete(gcIdxKey) - dataKey := getDataKey(idx.Idx, po) - batch.Delete(dataKey) - batch.Delete(idxKey) - s.entryCnt-- - dbEntryCount.Dec(1) - cntKey := make([]byte, 2) - cntKey[0] = keyDistanceCnt - cntKey[1] = po - batch.Put(keyEntryCnt, U64ToBytes(s.entryCnt)) - batch.Put(cntKey, U64ToBytes(s.bucketCnt[po])) -} - -func (s *LDBStore) BinIndex(po uint8) uint64 { - s.lock.RLock() - defer s.lock.RUnlock() - return s.bucketCnt[po] -} - -// Put adds a chunk to the database, adding indices and incrementing global counters. -// If it already exists, it merely increments the access count of the existing entry. -// Is thread safe -func (s *LDBStore) Put(ctx context.Context, chunk Chunk) error { - metrics.GetOrRegisterCounter("ldbstore.put", nil).Inc(1) - log.Trace("ldbstore.put", "key", chunk.Address()) - - ikey := getIndexKey(chunk.Address()) - var index dpaDBIndex - - po := s.po(chunk.Address()) - - s.lock.Lock() - - if s.closed { - s.lock.Unlock() - return ErrDBClosed - } - batch := s.batch - - log.Trace("ldbstore.put: s.db.Get", "key", chunk.Address(), "ikey", fmt.Sprintf("%x", ikey)) - _, err := s.db.Get(ikey) - if err != nil { - s.doPut(chunk, &index, po) - } - idata := encodeIndex(&index) - s.batch.Put(ikey, idata) - - // add the access-chunkindex index for garbage collection - gcIdxKey := getGCIdxKey(&index) - gcIdxData := getGCIdxValue(&index, po, chunk.Address()) - s.batch.Put(gcIdxKey, gcIdxData) - s.lock.Unlock() - - select { - case s.batchesC <- struct{}{}: - default: - } - - select { - case <-batch.c: - return batch.err - case <-ctx.Done(): - return ctx.Err() - } -} - -// force putting into db, does not check or update necessary indices -func (s *LDBStore) doPut(chunk Chunk, index *dpaDBIndex, po uint8) { - data := s.encodeDataFunc(chunk) - dkey := getDataKey(s.dataIdx, po) - s.batch.Put(dkey, data) - index.Idx = s.dataIdx - s.bucketCnt[po] = s.dataIdx - s.entryCnt++ - dbEntryCount.Inc(1) - s.dataIdx++ - index.Access = s.accessCnt - s.accessCnt++ - cntKey := make([]byte, 2) - cntKey[0] = keyDistanceCnt - cntKey[1] = po - s.batch.Put(cntKey, U64ToBytes(s.bucketCnt[po])) -} - -func (s *LDBStore) writeBatches() { - for { - select { - case <-s.quit: - log.Debug("DbStore: quit batch write loop") - return - case <-s.batchesC: - err := s.writeCurrentBatch() - if err != nil { - log.Debug("DbStore: quit batch write loop", "err", err.Error()) - return - } - } - } - -} - -func (s *LDBStore) writeCurrentBatch() error { - s.lock.Lock() - defer s.lock.Unlock() - b := s.batch - l := b.Len() - if l == 0 { - return nil - } - s.batch = newBatch() - b.err = s.writeBatch(b, wEntryCnt|wAccessCnt|wIndexCnt) - close(b.c) - if s.entryCnt >= s.capacity { - go s.collectGarbage() - } - return nil -} - -// must be called non concurrently -func (s *LDBStore) writeBatch(b *dbBatch, wFlag uint8) error { - if wFlag&wEntryCnt > 0 { - b.Put(keyEntryCnt, U64ToBytes(s.entryCnt)) - } - if wFlag&wIndexCnt > 0 { - b.Put(keyDataIdx, U64ToBytes(s.dataIdx)) - } - if wFlag&wAccessCnt > 0 { - b.Put(keyAccessCnt, U64ToBytes(s.accessCnt)) - } - l := b.Len() - if err := s.db.Write(b.Batch); err != nil { - return fmt.Errorf("unable to write batch: %v", err) - } - log.Trace(fmt.Sprintf("batch write (%d entries)", l)) - return nil -} - -// newMockEncodeDataFunc returns a function that stores the chunk data -// to a mock store to bypass the default functionality encodeData. -// The constructed function always returns the nil data, as DbStore does -// not need to store the data, but still need to create the index. -func newMockEncodeDataFunc(mockStore *mock.NodeStore) func(chunk Chunk) []byte { - return func(chunk Chunk) []byte { - if err := mockStore.Put(chunk.Address(), encodeData(chunk)); err != nil { - log.Error(fmt.Sprintf("%T: Chunk %v put: %v", mockStore, chunk.Address().Log(), err)) - } - return chunk.Address()[:] - } -} - -// tryAccessIdx tries to find index entry. If found then increments the access -// count for garbage collection and returns the index entry and true for found, -// otherwise returns nil and false. -func (s *LDBStore) tryAccessIdx(addr Address, po uint8) (*dpaDBIndex, bool) { - ikey := getIndexKey(addr) - idata, err := s.db.Get(ikey) - if err != nil { - return nil, false - } - - index := new(dpaDBIndex) - decodeIndex(idata, index) - oldGCIdxKey := getGCIdxKey(index) - s.batch.Put(keyAccessCnt, U64ToBytes(s.accessCnt)) - index.Access = s.accessCnt - idata = encodeIndex(index) - s.accessCnt++ - s.batch.Put(ikey, idata) - newGCIdxKey := getGCIdxKey(index) - newGCIdxData := getGCIdxValue(index, po, ikey[1:]) - s.batch.Delete(oldGCIdxKey) - s.batch.Put(newGCIdxKey, newGCIdxData) - select { - case s.batchesC <- struct{}{}: - default: - } - return index, true -} - -// GetSchema is returning the current named schema of the datastore as read from LevelDB -func (s *LDBStore) GetSchema() (string, error) { - s.lock.Lock() - defer s.lock.Unlock() - - data, err := s.db.Get(keySchema) - if err != nil { - if err == leveldb.ErrNotFound { - return DbSchemaNone, nil - } - return "", err - } - - return string(data), nil -} - -// PutSchema is saving a named schema to the LevelDB datastore -func (s *LDBStore) PutSchema(schema string) error { - s.lock.Lock() - defer s.lock.Unlock() - - return s.db.Put(keySchema, []byte(schema)) -} - -// Get retrieves the chunk matching the provided key from the database. -// If the chunk entry does not exist, it returns an error -// Updates access count and is thread safe -func (s *LDBStore) Get(_ context.Context, addr Address) (chunk Chunk, err error) { - metrics.GetOrRegisterCounter("ldbstore.get", nil).Inc(1) - log.Trace("ldbstore.get", "key", addr) - - s.lock.Lock() - defer s.lock.Unlock() - return s.get(addr) -} - -// TODO: To conform with other private methods of this object indices should not be updated -func (s *LDBStore) get(addr Address) (chunk *chunk, err error) { - if s.closed { - return nil, ErrDBClosed - } - proximity := s.po(addr) - index, found := s.tryAccessIdx(addr, proximity) - if found { - var data []byte - if s.getDataFunc != nil { - // if getDataFunc is defined, use it to retrieve the chunk data - log.Trace("ldbstore.get retrieve with getDataFunc", "key", addr) - data, err = s.getDataFunc(addr) - if err != nil { - return - } - } else { - // default DbStore functionality to retrieve chunk data - datakey := getDataKey(index.Idx, proximity) - data, err = s.db.Get(datakey) - log.Trace("ldbstore.get retrieve", "key", addr, "indexkey", index.Idx, "datakey", fmt.Sprintf("%x", datakey), "proximity", proximity) - if err != nil { - log.Trace("ldbstore.get chunk found but could not be accessed", "key", addr, "err", err) - s.deleteNow(index, getIndexKey(addr), s.po(addr)) - return - } - } - - return decodeData(addr, data) - } else { - err = ErrChunkNotFound - } - - return -} - -// newMockGetFunc returns a function that reads chunk data from -// the mock database, which is used as the value for DbStore.getFunc -// to bypass the default functionality of DbStore with a mock store. -func newMockGetDataFunc(mockStore *mock.NodeStore) func(addr Address) (data []byte, err error) { - return func(addr Address) (data []byte, err error) { - data, err = mockStore.Get(addr) - if err == mock.ErrNotFound { - // preserve ErrChunkNotFound error - err = ErrChunkNotFound - } - return data, err - } -} - -func (s *LDBStore) setCapacity(c uint64) { - s.lock.Lock() - defer s.lock.Unlock() - - s.capacity = c - - for s.entryCnt > c { - s.collectGarbage() - } -} - -func (s *LDBStore) Close() { - close(s.quit) - s.lock.Lock() - s.closed = true - s.lock.Unlock() - // force writing out current batch - s.writeCurrentBatch() - close(s.batchesC) - s.db.Close() -} - -// SyncIterator(start, stop, po, f) calls f on each hash of a bin po from start to stop -func (s *LDBStore) SyncIterator(since uint64, until uint64, po uint8, f func(Address, uint64) bool) error { - metrics.GetOrRegisterCounter("ldbstore.synciterator", nil).Inc(1) - - sincekey := getDataKey(since, po) - untilkey := getDataKey(until, po) - it := s.db.NewIterator() - defer it.Release() - - for ok := it.Seek(sincekey); ok; ok = it.Next() { - metrics.GetOrRegisterCounter("ldbstore.synciterator.seek", nil).Inc(1) - - dbkey := it.Key() - if dbkey[0] != keyData || dbkey[1] != po || bytes.Compare(untilkey, dbkey) < 0 { - break - } - key := make([]byte, 32) - val := it.Value() - copy(key, val[:32]) - if !f(Address(key), binary.BigEndian.Uint64(dbkey[2:])) { - break - } - } - return it.Error() -} diff --git a/swarm/storage/ldbstore_test.go b/swarm/storage/ldbstore_test.go deleted file mode 100644 index 6af964cb5fe0..000000000000 --- a/swarm/storage/ldbstore_test.go +++ /dev/null @@ -1,794 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "bytes" - "context" - "encoding/binary" - "fmt" - "io/ioutil" - "os" - "strconv" - "strings" - "testing" - "time" - - "github.com/nebulaai/nbai-node/common" - ch "github.com/nebulaai/nbai-node/swarm/chunk" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/storage/mock/mem" - ldberrors "github.com/syndtr/goleveldb/leveldb/errors" -) - -type testDbStore struct { - *LDBStore - dir string -} - -func newTestDbStore(mock bool, trusted bool) (*testDbStore, func(), error) { - dir, err := ioutil.TempDir("", "bzz-storage-test") - if err != nil { - return nil, func() {}, err - } - - var db *LDBStore - storeparams := NewDefaultStoreParams() - params := NewLDBStoreParams(storeparams, dir) - params.Po = testPoFunc - - if mock { - globalStore := mem.NewGlobalStore() - addr := common.HexToAddress("0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed") - mockStore := globalStore.NewNodeStore(addr) - - db, err = NewMockDbStore(params, mockStore) - } else { - db, err = NewLDBStore(params) - } - - cleanup := func() { - if db != nil { - db.Close() - } - err = os.RemoveAll(dir) - if err != nil { - panic(fmt.Sprintf("db cleanup failed: %v", err)) - } - } - - return &testDbStore{db, dir}, cleanup, err -} - -func testPoFunc(k Address) (ret uint8) { - basekey := make([]byte, 32) - return uint8(Proximity(basekey, k[:])) -} - -func testDbStoreRandom(n int, chunksize int64, mock bool, t *testing.T) { - db, cleanup, err := newTestDbStore(mock, true) - defer cleanup() - if err != nil { - t.Fatalf("init dbStore failed: %v", err) - } - testStoreRandom(db, n, chunksize, t) -} - -func testDbStoreCorrect(n int, chunksize int64, mock bool, t *testing.T) { - db, cleanup, err := newTestDbStore(mock, false) - defer cleanup() - if err != nil { - t.Fatalf("init dbStore failed: %v", err) - } - testStoreCorrect(db, n, chunksize, t) -} - -func TestMarkAccessed(t *testing.T) { - db, cleanup, err := newTestDbStore(false, true) - defer cleanup() - if err != nil { - t.Fatalf("init dbStore failed: %v", err) - } - - h := GenerateRandomChunk(ch.DefaultSize) - - db.Put(context.Background(), h) - - var index dpaDBIndex - addr := h.Address() - idxk := getIndexKey(addr) - - idata, err := db.db.Get(idxk) - if err != nil { - t.Fatal(err) - } - decodeIndex(idata, &index) - - if index.Access != 0 { - t.Fatalf("Expected the access index to be %d, but it is %d", 0, index.Access) - } - - db.MarkAccessed(addr) - db.writeCurrentBatch() - - idata, err = db.db.Get(idxk) - if err != nil { - t.Fatal(err) - } - decodeIndex(idata, &index) - - if index.Access != 1 { - t.Fatalf("Expected the access index to be %d, but it is %d", 1, index.Access) - } - -} - -func TestDbStoreRandom_1(t *testing.T) { - testDbStoreRandom(1, 0, false, t) -} - -func TestDbStoreCorrect_1(t *testing.T) { - testDbStoreCorrect(1, 4096, false, t) -} - -func TestDbStoreRandom_1k(t *testing.T) { - testDbStoreRandom(1000, 0, false, t) -} - -func TestDbStoreCorrect_1k(t *testing.T) { - testDbStoreCorrect(1000, 4096, false, t) -} - -func TestMockDbStoreRandom_1(t *testing.T) { - testDbStoreRandom(1, 0, true, t) -} - -func TestMockDbStoreCorrect_1(t *testing.T) { - testDbStoreCorrect(1, 4096, true, t) -} - -func TestMockDbStoreRandom_1k(t *testing.T) { - testDbStoreRandom(1000, 0, true, t) -} - -func TestMockDbStoreCorrect_1k(t *testing.T) { - testDbStoreCorrect(1000, 4096, true, t) -} - -func testDbStoreNotFound(t *testing.T, mock bool) { - db, cleanup, err := newTestDbStore(mock, false) - defer cleanup() - if err != nil { - t.Fatalf("init dbStore failed: %v", err) - } - - _, err = db.Get(context.TODO(), ZeroAddr) - if err != ErrChunkNotFound { - t.Errorf("Expected ErrChunkNotFound, got %v", err) - } -} - -func TestDbStoreNotFound(t *testing.T) { - testDbStoreNotFound(t, false) -} -func TestMockDbStoreNotFound(t *testing.T) { - testDbStoreNotFound(t, true) -} - -func testIterator(t *testing.T, mock bool) { - var chunkcount int = 32 - var i int - var poc uint - chunkkeys := NewAddressCollection(chunkcount) - chunkkeys_results := NewAddressCollection(chunkcount) - - db, cleanup, err := newTestDbStore(mock, false) - defer cleanup() - if err != nil { - t.Fatalf("init dbStore failed: %v", err) - } - - chunks := GenerateRandomChunks(ch.DefaultSize, chunkcount) - - for i = 0; i < len(chunks); i++ { - chunkkeys[i] = chunks[i].Address() - err := db.Put(context.TODO(), chunks[i]) - if err != nil { - t.Fatalf("dbStore.Put failed: %v", err) - } - } - - for i = 0; i < len(chunkkeys); i++ { - log.Trace(fmt.Sprintf("Chunk array pos %d/%d: '%v'", i, chunkcount, chunkkeys[i])) - } - i = 0 - for poc = 0; poc <= 255; poc++ { - err := db.SyncIterator(0, uint64(chunkkeys.Len()), uint8(poc), func(k Address, n uint64) bool { - log.Trace(fmt.Sprintf("Got key %v number %d poc %d", k, n, uint8(poc))) - chunkkeys_results[n] = k - i++ - return true - }) - if err != nil { - t.Fatalf("Iterator call failed: %v", err) - } - } - - for i = 0; i < chunkcount; i++ { - if !bytes.Equal(chunkkeys[i], chunkkeys_results[i]) { - t.Fatalf("Chunk put #%d key '%v' does not match iterator's key '%v'", i, chunkkeys[i], chunkkeys_results[i]) - } - } - -} - -func TestIterator(t *testing.T) { - testIterator(t, false) -} -func TestMockIterator(t *testing.T) { - testIterator(t, true) -} - -func benchmarkDbStorePut(n int, processors int, chunksize int64, mock bool, b *testing.B) { - db, cleanup, err := newTestDbStore(mock, true) - defer cleanup() - if err != nil { - b.Fatalf("init dbStore failed: %v", err) - } - benchmarkStorePut(db, n, chunksize, b) -} - -func benchmarkDbStoreGet(n int, processors int, chunksize int64, mock bool, b *testing.B) { - db, cleanup, err := newTestDbStore(mock, true) - defer cleanup() - if err != nil { - b.Fatalf("init dbStore failed: %v", err) - } - benchmarkStoreGet(db, n, chunksize, b) -} - -func BenchmarkDbStorePut_1_500(b *testing.B) { - benchmarkDbStorePut(500, 1, 4096, false, b) -} - -func BenchmarkDbStorePut_8_500(b *testing.B) { - benchmarkDbStorePut(500, 8, 4096, false, b) -} - -func BenchmarkDbStoreGet_1_500(b *testing.B) { - benchmarkDbStoreGet(500, 1, 4096, false, b) -} - -func BenchmarkDbStoreGet_8_500(b *testing.B) { - benchmarkDbStoreGet(500, 8, 4096, false, b) -} - -func BenchmarkMockDbStorePut_1_500(b *testing.B) { - benchmarkDbStorePut(500, 1, 4096, true, b) -} - -func BenchmarkMockDbStorePut_8_500(b *testing.B) { - benchmarkDbStorePut(500, 8, 4096, true, b) -} - -func BenchmarkMockDbStoreGet_1_500(b *testing.B) { - benchmarkDbStoreGet(500, 1, 4096, true, b) -} - -func BenchmarkMockDbStoreGet_8_500(b *testing.B) { - benchmarkDbStoreGet(500, 8, 4096, true, b) -} - -// TestLDBStoreWithoutCollectGarbage tests that we can put a number of random chunks in the LevelDB store, and -// retrieve them, provided we don't hit the garbage collection -func TestLDBStoreWithoutCollectGarbage(t *testing.T) { - capacity := 50 - n := 10 - - ldb, cleanup := newLDBStore(t) - ldb.setCapacity(uint64(capacity)) - defer cleanup() - - chunks, err := mputRandomChunks(ldb, n, int64(ch.DefaultSize)) - if err != nil { - t.Fatal(err.Error()) - } - - log.Info("ldbstore", "entrycnt", ldb.entryCnt, "accesscnt", ldb.accessCnt) - - for _, ch := range chunks { - ret, err := ldb.Get(context.TODO(), ch.Address()) - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(ret.Data(), ch.Data()) { - t.Fatal("expected to get the same data back, but got smth else") - } - } - - if ldb.entryCnt != uint64(n) { - t.Fatalf("expected entryCnt to be equal to %v, but got %v", n, ldb.entryCnt) - } - - if ldb.accessCnt != uint64(2*n) { - t.Fatalf("expected accessCnt to be equal to %v, but got %v", 2*n, ldb.accessCnt) - } -} - -// TestLDBStoreCollectGarbage tests that we can put more chunks than LevelDB's capacity, and -// retrieve only some of them, because garbage collection must have partially cleared the store -// Also tests that we can delete chunks and that we can trigger garbage collection -func TestLDBStoreCollectGarbage(t *testing.T) { - - // below max ronud - initialCap := defaultMaxGCRound / 100 - cap := initialCap / 2 - t.Run(fmt.Sprintf("A/%d/%d", cap, cap*4), testLDBStoreCollectGarbage) - t.Run(fmt.Sprintf("B/%d/%d", cap, cap*4), testLDBStoreRemoveThenCollectGarbage) - - // at max round - cap = initialCap - t.Run(fmt.Sprintf("A/%d/%d", cap, cap*4), testLDBStoreCollectGarbage) - t.Run(fmt.Sprintf("B/%d/%d", cap, cap*4), testLDBStoreRemoveThenCollectGarbage) - - // more than max around, not on threshold - cap = initialCap + 500 - t.Run(fmt.Sprintf("A/%d/%d", cap, cap*4), testLDBStoreCollectGarbage) - t.Run(fmt.Sprintf("B/%d/%d", cap, cap*4), testLDBStoreRemoveThenCollectGarbage) - -} - -func testLDBStoreCollectGarbage(t *testing.T) { - params := strings.Split(t.Name(), "/") - capacity, err := strconv.Atoi(params[2]) - if err != nil { - t.Fatal(err) - } - n, err := strconv.Atoi(params[3]) - if err != nil { - t.Fatal(err) - } - - ldb, cleanup := newLDBStore(t) - ldb.setCapacity(uint64(capacity)) - defer cleanup() - - // retrieve the gc round target count for the db capacity - ldb.startGC(capacity) - roundTarget := ldb.gc.target - - // split put counts to gc target count threshold, and wait for gc to finish in between - var allChunks []Chunk - remaining := n - for remaining > 0 { - var putCount int - if remaining < roundTarget { - putCount = remaining - } else { - putCount = roundTarget - } - remaining -= putCount - chunks, err := mputRandomChunks(ldb, putCount, int64(ch.DefaultSize)) - if err != nil { - t.Fatal(err.Error()) - } - allChunks = append(allChunks, chunks...) - log.Debug("ldbstore", "entrycnt", ldb.entryCnt, "accesscnt", ldb.accessCnt, "cap", capacity, "n", n) - - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) - defer cancel() - waitGc(ctx, ldb) - } - - // attempt gets on all put chunks - var missing int - for _, ch := range allChunks { - ret, err := ldb.Get(context.TODO(), ch.Address()) - if err == ErrChunkNotFound || err == ldberrors.ErrNotFound { - missing++ - continue - } - if err != nil { - t.Fatal(err) - } - - if !bytes.Equal(ret.Data(), ch.Data()) { - t.Fatal("expected to get the same data back, but got smth else") - } - - log.Trace("got back chunk", "chunk", ret) - } - - // all surplus chunks should be missing - expectMissing := roundTarget + (((n - capacity) / roundTarget) * roundTarget) - if missing != expectMissing { - t.Fatalf("gc failure: expected to miss %v chunks, but only %v are actually missing", expectMissing, missing) - } - - log.Info("ldbstore", "total", n, "missing", missing, "entrycnt", ldb.entryCnt, "accesscnt", ldb.accessCnt) -} - -// TestLDBStoreAddRemove tests that we can put and then delete a given chunk -func TestLDBStoreAddRemove(t *testing.T) { - ldb, cleanup := newLDBStore(t) - ldb.setCapacity(200) - defer cleanup() - - n := 100 - chunks, err := mputRandomChunks(ldb, n, int64(ch.DefaultSize)) - if err != nil { - t.Fatalf(err.Error()) - } - - for i := 0; i < n; i++ { - // delete all even index chunks - if i%2 == 0 { - ldb.Delete(chunks[i].Address()) - } - } - - log.Info("ldbstore", "entrycnt", ldb.entryCnt, "accesscnt", ldb.accessCnt) - - for i := 0; i < n; i++ { - ret, err := ldb.Get(context.TODO(), chunks[i].Address()) - - if i%2 == 0 { - // expect even chunks to be missing - if err == nil { - t.Fatal("expected chunk to be missing, but got no error") - } - } else { - // expect odd chunks to be retrieved successfully - if err != nil { - t.Fatalf("expected no error, but got %s", err) - } - - if !bytes.Equal(ret.Data(), chunks[i].Data()) { - t.Fatal("expected to get the same data back, but got smth else") - } - } - } -} - -func testLDBStoreRemoveThenCollectGarbage(t *testing.T) { - - params := strings.Split(t.Name(), "/") - capacity, err := strconv.Atoi(params[2]) - if err != nil { - t.Fatal(err) - } - n, err := strconv.Atoi(params[3]) - if err != nil { - t.Fatal(err) - } - - ldb, cleanup := newLDBStore(t) - defer cleanup() - ldb.setCapacity(uint64(capacity)) - - // put capacity count number of chunks - chunks := make([]Chunk, n) - for i := 0; i < n; i++ { - c := GenerateRandomChunk(ch.DefaultSize) - chunks[i] = c - log.Trace("generate random chunk", "idx", i, "chunk", c) - } - - for i := 0; i < n; i++ { - err := ldb.Put(context.TODO(), chunks[i]) - if err != nil { - t.Fatal(err) - } - } - - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) - defer cancel() - waitGc(ctx, ldb) - - // delete all chunks - // (only count the ones actually deleted, the rest will have been gc'd) - deletes := 0 - for i := 0; i < n; i++ { - if ldb.Delete(chunks[i].Address()) == nil { - deletes++ - } - } - - log.Info("ldbstore", "entrycnt", ldb.entryCnt, "accesscnt", ldb.accessCnt) - - if ldb.entryCnt != 0 { - t.Fatalf("ldb.entrCnt expected 0 got %v", ldb.entryCnt) - } - - // the manual deletes will have increased accesscnt, so we need to add this when we verify the current count - expAccessCnt := uint64(n) - if ldb.accessCnt != expAccessCnt { - t.Fatalf("ldb.accessCnt expected %v got %v", expAccessCnt, ldb.accessCnt) - } - - // retrieve the gc round target count for the db capacity - ldb.startGC(capacity) - roundTarget := ldb.gc.target - - remaining := n - var puts int - for remaining > 0 { - var putCount int - if remaining < roundTarget { - putCount = remaining - } else { - putCount = roundTarget - } - remaining -= putCount - for putCount > 0 { - ldb.Put(context.TODO(), chunks[puts]) - log.Debug("ldbstore", "entrycnt", ldb.entryCnt, "accesscnt", ldb.accessCnt, "cap", capacity, "n", n, "puts", puts, "remaining", remaining, "roundtarget", roundTarget) - puts++ - putCount-- - } - - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) - defer cancel() - waitGc(ctx, ldb) - } - - // expect first surplus chunks to be missing, because they have the smallest access value - expectMissing := roundTarget + (((n - capacity) / roundTarget) * roundTarget) - for i := 0; i < expectMissing; i++ { - _, err := ldb.Get(context.TODO(), chunks[i].Address()) - if err == nil { - t.Fatalf("expected surplus chunk %d to be missing, but got no error", i) - } - } - - // expect last chunks to be present, as they have the largest access value - for i := expectMissing; i < n; i++ { - ret, err := ldb.Get(context.TODO(), chunks[i].Address()) - if err != nil { - t.Fatalf("chunk %v: expected no error, but got %s", i, err) - } - if !bytes.Equal(ret.Data(), chunks[i].Data()) { - t.Fatal("expected to get the same data back, but got smth else") - } - } -} - -// TestLDBStoreCollectGarbageAccessUnlikeIndex tests garbage collection where accesscount differs from indexcount -func TestLDBStoreCollectGarbageAccessUnlikeIndex(t *testing.T) { - - capacity := defaultMaxGCRound / 100 * 2 - n := capacity - 1 - - ldb, cleanup := newLDBStore(t) - ldb.setCapacity(uint64(capacity)) - defer cleanup() - - chunks, err := mputRandomChunks(ldb, n, int64(ch.DefaultSize)) - if err != nil { - t.Fatal(err.Error()) - } - log.Info("ldbstore", "entrycnt", ldb.entryCnt, "accesscnt", ldb.accessCnt) - - // set first added capacity/2 chunks to highest accesscount - for i := 0; i < capacity/2; i++ { - _, err := ldb.Get(context.TODO(), chunks[i].Address()) - if err != nil { - t.Fatalf("fail add chunk #%d - %s: %v", i, chunks[i].Address(), err) - } - } - _, err = mputRandomChunks(ldb, 2, int64(ch.DefaultSize)) - if err != nil { - t.Fatal(err.Error()) - } - - // wait for garbage collection to kick in on the responsible actor - ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) - defer cancel() - waitGc(ctx, ldb) - - var missing int - for i, ch := range chunks[2 : capacity/2] { - ret, err := ldb.Get(context.TODO(), ch.Address()) - if err == ErrChunkNotFound || err == ldberrors.ErrNotFound { - t.Fatalf("fail find chunk #%d - %s: %v", i, ch.Address(), err) - } - - if !bytes.Equal(ret.Data(), ch.Data()) { - t.Fatal("expected to get the same data back, but got smth else") - } - log.Trace("got back chunk", "chunk", ret) - } - - log.Info("ldbstore", "total", n, "missing", missing, "entrycnt", ldb.entryCnt, "accesscnt", ldb.accessCnt) -} - -func TestCleanIndex(t *testing.T) { - capacity := 5000 - n := 3 - - ldb, cleanup := newLDBStore(t) - ldb.setCapacity(uint64(capacity)) - defer cleanup() - - chunks, err := mputRandomChunks(ldb, n, 4096) - if err != nil { - t.Fatal(err) - } - - // remove the data of the first chunk - po := ldb.po(chunks[0].Address()[:]) - dataKey := make([]byte, 10) - dataKey[0] = keyData - dataKey[1] = byte(po) - // dataKey[2:10] = first chunk has storageIdx 0 on [2:10] - if _, err := ldb.db.Get(dataKey); err != nil { - t.Fatal(err) - } - if err := ldb.db.Delete(dataKey); err != nil { - t.Fatal(err) - } - - // remove the gc index row for the first chunk - gcFirstCorrectKey := make([]byte, 9) - gcFirstCorrectKey[0] = keyGCIdx - if err := ldb.db.Delete(gcFirstCorrectKey); err != nil { - t.Fatal(err) - } - - // warp the gc data of the second chunk - // this data should be correct again after the clean - gcSecondCorrectKey := make([]byte, 9) - gcSecondCorrectKey[0] = keyGCIdx - binary.BigEndian.PutUint64(gcSecondCorrectKey[1:], uint64(1)) - gcSecondCorrectVal, err := ldb.db.Get(gcSecondCorrectKey) - if err != nil { - t.Fatal(err) - } - warpedGCVal := make([]byte, len(gcSecondCorrectVal)+1) - copy(warpedGCVal[1:], gcSecondCorrectVal) - if err := ldb.db.Delete(gcSecondCorrectKey); err != nil { - t.Fatal(err) - } - if err := ldb.db.Put(gcSecondCorrectKey, warpedGCVal); err != nil { - t.Fatal(err) - } - - if err := ldb.CleanGCIndex(); err != nil { - t.Fatal(err) - } - - // the index without corresponding data should have been deleted - idxKey := make([]byte, 33) - idxKey[0] = keyIndex - copy(idxKey[1:], chunks[0].Address()) - if _, err := ldb.db.Get(idxKey); err == nil { - t.Fatalf("expected chunk 0 idx to be pruned: %v", idxKey) - } - - // the two other indices should be present - copy(idxKey[1:], chunks[1].Address()) - if _, err := ldb.db.Get(idxKey); err != nil { - t.Fatalf("expected chunk 1 idx to be present: %v", idxKey) - } - - copy(idxKey[1:], chunks[2].Address()) - if _, err := ldb.db.Get(idxKey); err != nil { - t.Fatalf("expected chunk 2 idx to be present: %v", idxKey) - } - - // first gc index should still be gone - if _, err := ldb.db.Get(gcFirstCorrectKey); err == nil { - t.Fatalf("expected gc 0 idx to be pruned: %v", idxKey) - } - - // second gc index should still be fixed - if _, err := ldb.db.Get(gcSecondCorrectKey); err != nil { - t.Fatalf("expected gc 1 idx to be present: %v", idxKey) - } - - // third gc index should be unchanged - binary.BigEndian.PutUint64(gcSecondCorrectKey[1:], uint64(2)) - if _, err := ldb.db.Get(gcSecondCorrectKey); err != nil { - t.Fatalf("expected gc 2 idx to be present: %v", idxKey) - } - - c, err := ldb.db.Get(keyEntryCnt) - if err != nil { - t.Fatalf("expected gc 2 idx to be present: %v", idxKey) - } - - // entrycount should now be one less - entryCount := binary.BigEndian.Uint64(c) - if entryCount != 2 { - t.Fatalf("expected entrycnt to be 2, was %d", c) - } - - // the chunks might accidentally be in the same bin - // if so that bin counter will now be 2 - the highest added index. - // if not, the total of them will be 3 - poBins := []uint8{ldb.po(chunks[1].Address()), ldb.po(chunks[2].Address())} - if poBins[0] == poBins[1] { - poBins = poBins[:1] - } - - var binTotal uint64 - var currentBin [2]byte - currentBin[0] = keyDistanceCnt - if len(poBins) == 1 { - currentBin[1] = poBins[0] - c, err := ldb.db.Get(currentBin[:]) - if err != nil { - t.Fatalf("expected gc 2 idx to be present: %v", idxKey) - } - binCount := binary.BigEndian.Uint64(c) - if binCount != 2 { - t.Fatalf("expected entrycnt to be 2, was %d", binCount) - } - } else { - for _, bin := range poBins { - currentBin[1] = bin - c, err := ldb.db.Get(currentBin[:]) - if err != nil { - t.Fatalf("expected gc 2 idx to be present: %v", idxKey) - } - binCount := binary.BigEndian.Uint64(c) - binTotal += binCount - - } - if binTotal != 3 { - t.Fatalf("expected sum of bin indices to be 3, was %d", binTotal) - } - } - - // check that the iterator quits properly - chunks, err = mputRandomChunks(ldb, 4100, 4096) - if err != nil { - t.Fatal(err) - } - - po = ldb.po(chunks[4099].Address()[:]) - dataKey = make([]byte, 10) - dataKey[0] = keyData - dataKey[1] = byte(po) - binary.BigEndian.PutUint64(dataKey[2:], 4099+3) - if _, err := ldb.db.Get(dataKey); err != nil { - t.Fatal(err) - } - if err := ldb.db.Delete(dataKey); err != nil { - t.Fatal(err) - } - - if err := ldb.CleanGCIndex(); err != nil { - t.Fatal(err) - } - - // entrycount should now be one less of added chunks - c, err = ldb.db.Get(keyEntryCnt) - if err != nil { - t.Fatalf("expected gc 2 idx to be present: %v", idxKey) - } - entryCount = binary.BigEndian.Uint64(c) - if entryCount != 4099+2 { - t.Fatalf("expected entrycnt to be 2, was %d", c) - } -} - -func waitGc(ctx context.Context, ldb *LDBStore) { - <-ldb.gc.runC - ldb.gc.runC <- struct{}{} -} diff --git a/swarm/storage/localstore.go b/swarm/storage/localstore.go deleted file mode 100644 index 74513d7d382c..000000000000 --- a/swarm/storage/localstore.go +++ /dev/null @@ -1,244 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "context" - "path/filepath" - "sync" - - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/storage/mock" -) - -type LocalStoreParams struct { - *StoreParams - ChunkDbPath string - Validators []ChunkValidator `toml:"-"` -} - -func NewDefaultLocalStoreParams() *LocalStoreParams { - return &LocalStoreParams{ - StoreParams: NewDefaultStoreParams(), - } -} - -//this can only finally be set after all config options (file, cmd line, env vars) -//have been evaluated -func (p *LocalStoreParams) Init(path string) { - if p.ChunkDbPath == "" { - p.ChunkDbPath = filepath.Join(path, "chunks") - } -} - -// LocalStore is a combination of inmemory db over a disk persisted db -// implements a Get/Put with fallback (caching) logic using any 2 ChunkStores -type LocalStore struct { - Validators []ChunkValidator - memStore *MemStore - DbStore *LDBStore - mu sync.Mutex -} - -// This constructor uses MemStore and DbStore as components -func NewLocalStore(params *LocalStoreParams, mockStore *mock.NodeStore) (*LocalStore, error) { - ldbparams := NewLDBStoreParams(params.StoreParams, params.ChunkDbPath) - dbStore, err := NewMockDbStore(ldbparams, mockStore) - if err != nil { - return nil, err - } - return &LocalStore{ - memStore: NewMemStore(params.StoreParams, dbStore), - DbStore: dbStore, - Validators: params.Validators, - }, nil -} - -func NewTestLocalStoreForAddr(params *LocalStoreParams) (*LocalStore, error) { - ldbparams := NewLDBStoreParams(params.StoreParams, params.ChunkDbPath) - dbStore, err := NewLDBStore(ldbparams) - if err != nil { - return nil, err - } - localStore := &LocalStore{ - memStore: NewMemStore(params.StoreParams, dbStore), - DbStore: dbStore, - Validators: params.Validators, - } - return localStore, nil -} - -// isValid returns true if chunk passes any of the LocalStore Validators. -// isValid also returns true if LocalStore has no Validators. -func (ls *LocalStore) isValid(chunk Chunk) bool { - // by default chunks are valid. if we have 0 validators, then all chunks are valid. - valid := true - - // ls.Validators contains a list of one validator per chunk type. - // if one validator succeeds, then the chunk is valid - for _, v := range ls.Validators { - if valid = v.Validate(chunk); valid { - break - } - } - return valid -} - -// Put is responsible for doing validation and storage of the chunk -// by using configured ChunkValidators, MemStore and LDBStore. -// If the chunk is not valid, its GetErrored function will -// return ErrChunkInvalid. -// This method will check if the chunk is already in the MemStore -// and it will return it if it is. If there is an error from -// the MemStore.Get, it will be returned by calling GetErrored -// on the chunk. -// This method is responsible for closing Chunk.ReqC channel -// when the chunk is stored in memstore. -// After the LDBStore.Put, it is ensured that the MemStore -// contains the chunk with the same data, but nil ReqC channel. -func (ls *LocalStore) Put(ctx context.Context, chunk Chunk) error { - if !ls.isValid(chunk) { - return ErrChunkInvalid - } - - log.Trace("localstore.put", "key", chunk.Address()) - ls.mu.Lock() - defer ls.mu.Unlock() - - _, err := ls.memStore.Get(ctx, chunk.Address()) - if err == nil { - return nil - } - if err != nil && err != ErrChunkNotFound { - return err - } - ls.memStore.Put(ctx, chunk) - err = ls.DbStore.Put(ctx, chunk) - return err -} - -// Get(chunk *Chunk) looks up a chunk in the local stores -// This method is blocking until the chunk is retrieved -// so additional timeout may be needed to wrap this call if -// ChunkStores are remote and can have long latency -func (ls *LocalStore) Get(ctx context.Context, addr Address) (chunk Chunk, err error) { - ls.mu.Lock() - defer ls.mu.Unlock() - - return ls.get(ctx, addr) -} - -func (ls *LocalStore) get(ctx context.Context, addr Address) (chunk Chunk, err error) { - chunk, err = ls.memStore.Get(ctx, addr) - - if err != nil && err != ErrChunkNotFound { - metrics.GetOrRegisterCounter("localstore.get.error", nil).Inc(1) - return nil, err - } - - if err == nil { - metrics.GetOrRegisterCounter("localstore.get.cachehit", nil).Inc(1) - go ls.DbStore.MarkAccessed(addr) - return chunk, nil - } - - metrics.GetOrRegisterCounter("localstore.get.cachemiss", nil).Inc(1) - chunk, err = ls.DbStore.Get(ctx, addr) - if err != nil { - metrics.GetOrRegisterCounter("localstore.get.error", nil).Inc(1) - return nil, err - } - - ls.memStore.Put(ctx, chunk) - return chunk, nil -} - -func (ls *LocalStore) FetchFunc(ctx context.Context, addr Address) func(context.Context) error { - ls.mu.Lock() - defer ls.mu.Unlock() - - _, err := ls.get(ctx, addr) - if err == nil { - return nil - } - return func(context.Context) error { - return err - } -} - -func (ls *LocalStore) BinIndex(po uint8) uint64 { - return ls.DbStore.BinIndex(po) -} - -func (ls *LocalStore) Iterator(from uint64, to uint64, po uint8, f func(Address, uint64) bool) error { - return ls.DbStore.SyncIterator(from, to, po, f) -} - -// Close the local store -func (ls *LocalStore) Close() { - ls.DbStore.Close() -} - -// Migrate checks the datastore schema vs the runtime schema and runs -// migrations if they don't match -func (ls *LocalStore) Migrate() error { - actualDbSchema, err := ls.DbStore.GetSchema() - if err != nil { - log.Error(err.Error()) - return err - } - - if actualDbSchema == CurrentDbSchema { - return nil - } - - log.Debug("running migrations for", "schema", actualDbSchema, "runtime-schema", CurrentDbSchema) - - if actualDbSchema == DbSchemaNone { - ls.migrateFromNoneToPurity() - actualDbSchema = DbSchemaPurity - } - - if err := ls.DbStore.PutSchema(actualDbSchema); err != nil { - return err - } - - if actualDbSchema == DbSchemaPurity { - if err := ls.migrateFromPurityToHalloween(); err != nil { - return err - } - actualDbSchema = DbSchemaHalloween - } - - if err := ls.DbStore.PutSchema(actualDbSchema); err != nil { - return err - } - return nil -} - -func (ls *LocalStore) migrateFromNoneToPurity() { - // delete chunks that are not valid, i.e. chunks that do not pass - // any of the ls.Validators - ls.DbStore.Cleanup(func(c *chunk) bool { - return !ls.isValid(c) - }) -} - -func (ls *LocalStore) migrateFromPurityToHalloween() error { - return ls.DbStore.CleanGCIndex() -} diff --git a/swarm/storage/localstore_test.go b/swarm/storage/localstore_test.go deleted file mode 100644 index ee0ad15f6641..000000000000 --- a/swarm/storage/localstore_test.go +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright 2018 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 ( - "context" - "io/ioutil" - "os" - "testing" - "time" - - ch "github.com/nebulaai/nbai-node/swarm/chunk" -) - -var ( - hashfunc = MakeHashFunc(DefaultHash) -) - -// tests that the content address validator correctly checks the data -// tests that feed update chunks are passed through content address validator -// the test checking the resouce update validator internal correctness is found in storage/feeds/handler_test.go -func TestValidator(t *testing.T) { - // set up localstore - datadir, err := ioutil.TempDir("", "storage-testvalidator") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(datadir) - - params := NewDefaultLocalStoreParams() - params.Init(datadir) - store, err := NewLocalStore(params, nil) - if err != nil { - t.Fatal(err) - } - - // check puts with no validators, both succeed - chunks := GenerateRandomChunks(259, 2) - goodChunk := chunks[0] - badChunk := chunks[1] - copy(badChunk.Data(), goodChunk.Data()) - - errs := putChunks(store, goodChunk, badChunk) - if errs[0] != nil { - t.Fatalf("expected no error on good content address chunk in spite of no validation, but got: %s", err) - } - if errs[1] != nil { - t.Fatalf("expected no error on bad content address chunk in spite of no validation, but got: %s", err) - } - - // add content address validator and check puts - // bad should fail, good should pass - store.Validators = append(store.Validators, NewContentAddressValidator(hashfunc)) - chunks = GenerateRandomChunks(ch.DefaultSize, 2) - goodChunk = chunks[0] - badChunk = chunks[1] - copy(badChunk.Data(), goodChunk.Data()) - - errs = putChunks(store, goodChunk, badChunk) - if errs[0] != nil { - t.Fatalf("expected no error on good content address chunk with content address validator only, but got: %s", err) - } - if errs[1] == nil { - t.Fatal("expected error on bad content address chunk with content address validator only, but got nil") - } - - // append a validator that always denies - // bad should fail, good should pass, - var negV boolTestValidator - store.Validators = append(store.Validators, negV) - - chunks = GenerateRandomChunks(ch.DefaultSize, 2) - goodChunk = chunks[0] - badChunk = chunks[1] - copy(badChunk.Data(), goodChunk.Data()) - - errs = putChunks(store, goodChunk, badChunk) - if errs[0] != nil { - t.Fatalf("expected no error on good content address chunk with content address validator only, but got: %s", err) - } - if errs[1] == nil { - t.Fatal("expected error on bad content address chunk with content address validator only, but got nil") - } - - // append a validator that always approves - // all shall pass - var posV boolTestValidator = true - store.Validators = append(store.Validators, posV) - - chunks = GenerateRandomChunks(ch.DefaultSize, 2) - goodChunk = chunks[0] - badChunk = chunks[1] - copy(badChunk.Data(), goodChunk.Data()) - - errs = putChunks(store, goodChunk, badChunk) - if errs[0] != nil { - t.Fatalf("expected no error on good content address chunk with content address validator only, but got: %s", err) - } - if errs[1] != nil { - t.Fatalf("expected no error on bad content address chunk in spite of no validation, but got: %s", err) - } - -} - -type boolTestValidator bool - -func (self boolTestValidator) Validate(chunk Chunk) bool { - return bool(self) -} - -// putChunks adds chunks to localstore -// It waits for receive on the stored channel -// It logs but does not fail on delivery error -func putChunks(store *LocalStore, chunks ...Chunk) []error { - i := 0 - f := func(n int64) Chunk { - chunk := chunks[i] - i++ - return chunk - } - _, errs := put(store, len(chunks), f) - return errs -} - -func put(store *LocalStore, n int, f func(i int64) Chunk) (hs []Address, errs []error) { - for i := int64(0); i < int64(n); i++ { - chunk := f(ch.DefaultSize) - err := store.Put(context.TODO(), chunk) - errs = append(errs, err) - hs = append(hs, chunk.Address()) - } - return hs, errs -} - -// TestGetFrequentlyAccessedChunkWontGetGarbageCollected tests that the most -// frequently accessed chunk is not garbage collected from LDBStore, i.e., -// from disk when we are at the capacity and garbage collector runs. For that -// we start putting random chunks into the DB while continuously accessing the -// chunk we care about then check if we can still retrieve it from disk. -func TestGetFrequentlyAccessedChunkWontGetGarbageCollected(t *testing.T) { - ldbCap := defaultGCRatio - store, cleanup := setupLocalStore(t, ldbCap) - defer cleanup() - - var chunks []Chunk - for i := 0; i < ldbCap; i++ { - chunks = append(chunks, GenerateRandomChunk(ch.DefaultSize)) - } - - mostAccessed := chunks[0].Address() - for _, chunk := range chunks { - if err := store.Put(context.Background(), chunk); err != nil { - t.Fatal(err) - } - - if _, err := store.Get(context.Background(), mostAccessed); err != nil { - t.Fatal(err) - } - // Add time for MarkAccessed() to be able to finish in a separate Goroutine - time.Sleep(1 * time.Millisecond) - } - - store.DbStore.collectGarbage() - if _, err := store.DbStore.Get(context.Background(), mostAccessed); err != nil { - t.Logf("most frequntly accessed chunk not found on disk (key: %v)", mostAccessed) - t.Fatal(err) - } - -} - -func setupLocalStore(t *testing.T, ldbCap int) (ls *LocalStore, cleanup func()) { - t.Helper() - - var err error - datadir, err := ioutil.TempDir("", "storage") - if err != nil { - t.Fatal(err) - } - - params := &LocalStoreParams{ - StoreParams: NewStoreParams(uint64(ldbCap), uint(ldbCap), nil, nil), - } - params.Init(datadir) - - store, err := NewLocalStore(params, nil) - if err != nil { - _ = os.RemoveAll(datadir) - t.Fatal(err) - } - - cleanup = func() { - store.Close() - _ = os.RemoveAll(datadir) - } - - return store, cleanup -} diff --git a/swarm/storage/memstore.go b/swarm/storage/memstore.go deleted file mode 100644 index 86e5813d1b91..000000000000 --- a/swarm/storage/memstore.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2018 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 . - -// memory storage layer for the package blockhash - -package storage - -import ( - "context" - - lru "github.com/hashicorp/golang-lru" -) - -type MemStore struct { - cache *lru.Cache - disabled bool -} - -//NewMemStore is instantiating a MemStore cache keeping all frequently requested -//chunks in the `cache` LRU cache. -func NewMemStore(params *StoreParams, _ *LDBStore) (m *MemStore) { - if params.CacheCapacity == 0 { - return &MemStore{ - disabled: true, - } - } - - c, err := lru.New(int(params.CacheCapacity)) - if err != nil { - panic(err) - } - - return &MemStore{ - cache: c, - } -} - -func (m *MemStore) Get(_ context.Context, addr Address) (Chunk, error) { - if m.disabled { - return nil, ErrChunkNotFound - } - - c, ok := m.cache.Get(string(addr)) - if !ok { - return nil, ErrChunkNotFound - } - return c.(Chunk), nil -} - -func (m *MemStore) Put(_ context.Context, c Chunk) error { - if m.disabled { - return nil - } - - m.cache.Add(string(c.Address()), c) - return nil -} - -func (m *MemStore) setCapacity(n int) { - if n <= 0 { - m.disabled = true - } else { - c, err := lru.New(n) - if err != nil { - panic(err) - } - - *m = MemStore{ - cache: c, - } - } -} - -func (s *MemStore) Close() {} diff --git a/swarm/storage/memstore_test.go b/swarm/storage/memstore_test.go deleted file mode 100644 index f619d287500d..000000000000 --- a/swarm/storage/memstore_test.go +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "context" - "testing" - - "github.com/nebulaai/nbai-node/swarm/log" -) - -func newTestMemStore() *MemStore { - storeparams := NewDefaultStoreParams() - return NewMemStore(storeparams, nil) -} - -func testMemStoreRandom(n int, chunksize int64, t *testing.T) { - m := newTestMemStore() - defer m.Close() - testStoreRandom(m, n, chunksize, t) -} - -func testMemStoreCorrect(n int, chunksize int64, t *testing.T) { - m := newTestMemStore() - defer m.Close() - testStoreCorrect(m, n, chunksize, t) -} - -func TestMemStoreRandom_1(t *testing.T) { - testMemStoreRandom(1, 0, t) -} - -func TestMemStoreCorrect_1(t *testing.T) { - testMemStoreCorrect(1, 4104, t) -} - -func TestMemStoreRandom_1k(t *testing.T) { - testMemStoreRandom(1000, 0, t) -} - -func TestMemStoreCorrect_1k(t *testing.T) { - testMemStoreCorrect(100, 4096, t) -} - -func TestMemStoreNotFound(t *testing.T) { - m := newTestMemStore() - defer m.Close() - - _, err := m.Get(context.TODO(), ZeroAddr) - if err != ErrChunkNotFound { - t.Errorf("Expected ErrChunkNotFound, got %v", err) - } -} - -func benchmarkMemStorePut(n int, processors int, chunksize int64, b *testing.B) { - m := newTestMemStore() - defer m.Close() - benchmarkStorePut(m, n, chunksize, b) -} - -func benchmarkMemStoreGet(n int, processors int, chunksize int64, b *testing.B) { - m := newTestMemStore() - defer m.Close() - benchmarkStoreGet(m, n, chunksize, b) -} - -func BenchmarkMemStorePut_1_500(b *testing.B) { - benchmarkMemStorePut(500, 1, 4096, b) -} - -func BenchmarkMemStorePut_8_500(b *testing.B) { - benchmarkMemStorePut(500, 8, 4096, b) -} - -func BenchmarkMemStoreGet_1_500(b *testing.B) { - benchmarkMemStoreGet(500, 1, 4096, b) -} - -func BenchmarkMemStoreGet_8_500(b *testing.B) { - benchmarkMemStoreGet(500, 8, 4096, b) -} - -func TestMemStoreAndLDBStore(t *testing.T) { - ldb, cleanup := newLDBStore(t) - ldb.setCapacity(4000) - defer cleanup() - - cacheCap := 200 - memStore := NewMemStore(NewStoreParams(4000, 200, nil, nil), nil) - - tests := []struct { - n int // number of chunks to push to memStore - chunkSize int64 // size of chunk (by default in Swarm - 4096) - }{ - { - n: 1, - chunkSize: 4096, - }, - { - n: 101, - chunkSize: 4096, - }, - { - n: 501, - chunkSize: 4096, - }, - { - n: 1100, - chunkSize: 4096, - }, - } - - for i, tt := range tests { - log.Info("running test", "idx", i, "tt", tt) - var chunks []Chunk - - for i := 0; i < tt.n; i++ { - c := GenerateRandomChunk(tt.chunkSize) - chunks = append(chunks, c) - } - - for i := 0; i < tt.n; i++ { - err := ldb.Put(context.TODO(), chunks[i]) - if err != nil { - t.Fatal(err) - } - err = memStore.Put(context.TODO(), chunks[i]) - if err != nil { - t.Fatal(err) - } - - if got := memStore.cache.Len(); got > cacheCap { - t.Fatalf("expected to get cache capacity less than %v, but got %v", cacheCap, got) - } - - } - - for i := 0; i < tt.n; i++ { - _, err := memStore.Get(context.TODO(), chunks[i].Address()) - if err != nil { - if err == ErrChunkNotFound { - _, err := ldb.Get(context.TODO(), chunks[i].Address()) - if err != nil { - t.Fatalf("couldn't get chunk %v from ldb, got error: %v", i, err) - } - } else { - t.Fatalf("got error from memstore: %v", err) - } - } - } - } -} diff --git a/swarm/storage/mock/db/db.go b/swarm/storage/mock/db/db.go deleted file mode 100644 index 7b9ec401bf4e..000000000000 --- a/swarm/storage/mock/db/db.go +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright 2018 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 db implements a mock store that keeps all chunk data in LevelDB database. -package db - -import ( - "archive/tar" - "bytes" - "encoding/json" - "io" - "io/ioutil" - - "github.com/syndtr/goleveldb/leveldb" - "github.com/syndtr/goleveldb/leveldb/util" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/swarm/storage/mock" -) - -// GlobalStore contains the LevelDB database that is storing -// chunk data for all swarm nodes. -// Closing the GlobalStore with Close method is required to -// release resources used by the database. -type GlobalStore struct { - db *leveldb.DB -} - -// NewGlobalStore creates a new instance of GlobalStore. -func NewGlobalStore(path string) (s *GlobalStore, err error) { - db, err := leveldb.OpenFile(path, nil) - if err != nil { - return nil, err - } - return &GlobalStore{ - db: db, - }, nil -} - -// Close releases the resources used by the underlying LevelDB. -func (s *GlobalStore) Close() error { - return s.db.Close() -} - -// NewNodeStore returns a new instance of NodeStore that retrieves and stores -// chunk data only for a node with address addr. -func (s *GlobalStore) NewNodeStore(addr common.Address) *mock.NodeStore { - return mock.NewNodeStore(addr, s) -} - -// Get returns chunk data if the chunk with key exists for node -// on address addr. -func (s *GlobalStore) Get(addr common.Address, key []byte) (data []byte, err error) { - has, err := s.db.Has(nodeDBKey(addr, key), nil) - if err != nil { - return nil, mock.ErrNotFound - } - if !has { - return nil, mock.ErrNotFound - } - data, err = s.db.Get(dataDBKey(key), nil) - if err == leveldb.ErrNotFound { - err = mock.ErrNotFound - } - return -} - -// Put saves the chunk data for node with address addr. -func (s *GlobalStore) Put(addr common.Address, key []byte, data []byte) error { - batch := new(leveldb.Batch) - batch.Put(nodeDBKey(addr, key), nil) - batch.Put(dataDBKey(key), data) - return s.db.Write(batch, nil) -} - -// Delete removes the chunk reference to node with address addr. -func (s *GlobalStore) Delete(addr common.Address, key []byte) error { - batch := new(leveldb.Batch) - batch.Delete(nodeDBKey(addr, key)) - return s.db.Write(batch, nil) -} - -// HasKey returns whether a node with addr contains the key. -func (s *GlobalStore) HasKey(addr common.Address, key []byte) bool { - has, err := s.db.Has(nodeDBKey(addr, key), nil) - if err != nil { - has = false - } - return has -} - -// Import reads tar archive from a reader that contains exported chunk data. -// It returns the number of chunks imported and an error. -func (s *GlobalStore) Import(r io.Reader) (n int, err error) { - tr := tar.NewReader(r) - - for { - hdr, err := tr.Next() - if err != nil { - if err == io.EOF { - break - } - return n, err - } - - data, err := ioutil.ReadAll(tr) - if err != nil { - return n, err - } - - var c mock.ExportedChunk - if err = json.Unmarshal(data, &c); err != nil { - return n, err - } - - batch := new(leveldb.Batch) - for _, addr := range c.Addrs { - batch.Put(nodeDBKeyHex(addr, hdr.Name), nil) - } - - batch.Put(dataDBKey(common.Hex2Bytes(hdr.Name)), c.Data) - if err = s.db.Write(batch, nil); err != nil { - return n, err - } - - n++ - } - return n, err -} - -// Export writes to a writer a tar archive with all chunk data from -// the store. It returns the number fo chunks exported and an error. -func (s *GlobalStore) Export(w io.Writer) (n int, err error) { - tw := tar.NewWriter(w) - defer tw.Close() - - buf := bytes.NewBuffer(make([]byte, 0, 1024)) - encoder := json.NewEncoder(buf) - - iter := s.db.NewIterator(util.BytesPrefix(nodeKeyPrefix), nil) - defer iter.Release() - - var currentKey string - var addrs []common.Address - - saveChunk := func(hexKey string) error { - key := common.Hex2Bytes(hexKey) - - data, err := s.db.Get(dataDBKey(key), nil) - if err != nil { - return err - } - - buf.Reset() - if err = encoder.Encode(mock.ExportedChunk{ - Addrs: addrs, - Data: data, - }); err != nil { - return err - } - - d := buf.Bytes() - hdr := &tar.Header{ - Name: hexKey, - Mode: 0644, - Size: int64(len(d)), - } - if err := tw.WriteHeader(hdr); err != nil { - return err - } - if _, err := tw.Write(d); err != nil { - return err - } - n++ - return nil - } - - for iter.Next() { - k := bytes.TrimPrefix(iter.Key(), nodeKeyPrefix) - i := bytes.Index(k, []byte("-")) - if i < 0 { - continue - } - hexKey := string(k[:i]) - - if currentKey == "" { - currentKey = hexKey - } - - if hexKey != currentKey { - if err = saveChunk(currentKey); err != nil { - return n, err - } - - addrs = addrs[:0] - } - - currentKey = hexKey - addrs = append(addrs, common.BytesToAddress(k[i:])) - } - - if len(addrs) > 0 { - if err = saveChunk(currentKey); err != nil { - return n, err - } - } - - return n, err -} - -var ( - nodeKeyPrefix = []byte("node-") - dataKeyPrefix = []byte("data-") -) - -// nodeDBKey constructs a database key for key/node mappings. -func nodeDBKey(addr common.Address, key []byte) []byte { - return nodeDBKeyHex(addr, common.Bytes2Hex(key)) -} - -// nodeDBKeyHex constructs a database key for key/node mappings -// using the hexadecimal string representation of the key. -func nodeDBKeyHex(addr common.Address, hexKey string) []byte { - return append(append(nodeKeyPrefix, []byte(hexKey+"-")...), addr[:]...) -} - -// dataDBkey constructs a database key for key/data storage. -func dataDBKey(key []byte) []byte { - return append(dataKeyPrefix, key...) -} diff --git a/swarm/storage/mock/db/db_test.go b/swarm/storage/mock/db/db_test.go deleted file mode 100644 index d185cb4705ec..000000000000 --- a/swarm/storage/mock/db/db_test.go +++ /dev/null @@ -1,75 +0,0 @@ -// +build go1.8 -// -// Copyright 2018 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 db - -import ( - "io/ioutil" - "os" - "testing" - - "github.com/nebulaai/nbai-node/swarm/storage/mock/test" -) - -// TestDBStore is running a test.MockStore tests -// using test.MockStore function. -func TestDBStore(t *testing.T) { - dir, err := ioutil.TempDir("", "mock_"+t.Name()) - if err != nil { - panic(err) - } - defer os.RemoveAll(dir) - - store, err := NewGlobalStore(dir) - if err != nil { - t.Fatal(err) - } - defer store.Close() - - test.MockStore(t, store, 100) -} - -// TestImportExport is running a test.ImportExport tests -// using test.MockStore function. -func TestImportExport(t *testing.T) { - dir1, err := ioutil.TempDir("", "mock_"+t.Name()+"_exporter") - if err != nil { - panic(err) - } - defer os.RemoveAll(dir1) - - store1, err := NewGlobalStore(dir1) - if err != nil { - t.Fatal(err) - } - defer store1.Close() - - dir2, err := ioutil.TempDir("", "mock_"+t.Name()+"_importer") - if err != nil { - panic(err) - } - defer os.RemoveAll(dir2) - - store2, err := NewGlobalStore(dir2) - if err != nil { - t.Fatal(err) - } - defer store2.Close() - - test.ImportExport(t, store1, store2, 100) -} diff --git a/swarm/storage/mock/mem/mem.go b/swarm/storage/mock/mem/mem.go deleted file mode 100644 index 0167c1928b7a..000000000000 --- a/swarm/storage/mock/mem/mem.go +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright 2018 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 mem implements a mock store that keeps all chunk data in memory. -// While it can be used for testing on smaller scales, the main purpose of this -// package is to provide the simplest reference implementation of a mock store. -package mem - -import ( - "archive/tar" - "bytes" - "encoding/json" - "io" - "io/ioutil" - "sync" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/swarm/storage/mock" -) - -// GlobalStore stores all chunk data and also keys and node addresses relations. -// It implements mock.GlobalStore interface. -type GlobalStore struct { - nodes map[string]map[common.Address]struct{} - data map[string][]byte - mu sync.Mutex -} - -// NewGlobalStore creates a new instance of GlobalStore. -func NewGlobalStore() *GlobalStore { - return &GlobalStore{ - nodes: make(map[string]map[common.Address]struct{}), - data: make(map[string][]byte), - } -} - -// NewNodeStore returns a new instance of NodeStore that retrieves and stores -// chunk data only for a node with address addr. -func (s *GlobalStore) NewNodeStore(addr common.Address) *mock.NodeStore { - return mock.NewNodeStore(addr, s) -} - -// Get returns chunk data if the chunk with key exists for node -// on address addr. -func (s *GlobalStore) Get(addr common.Address, key []byte) (data []byte, err error) { - s.mu.Lock() - defer s.mu.Unlock() - - if _, ok := s.nodes[string(key)][addr]; !ok { - return nil, mock.ErrNotFound - } - - data, ok := s.data[string(key)] - if !ok { - return nil, mock.ErrNotFound - } - return data, nil -} - -// Put saves the chunk data for node with address addr. -func (s *GlobalStore) Put(addr common.Address, key []byte, data []byte) error { - s.mu.Lock() - defer s.mu.Unlock() - - if _, ok := s.nodes[string(key)]; !ok { - s.nodes[string(key)] = make(map[common.Address]struct{}) - } - s.nodes[string(key)][addr] = struct{}{} - s.data[string(key)] = data - return nil -} - -// Delete removes the chunk data for node with address addr. -func (s *GlobalStore) Delete(addr common.Address, key []byte) error { - s.mu.Lock() - defer s.mu.Unlock() - - var count int - if _, ok := s.nodes[string(key)]; ok { - delete(s.nodes[string(key)], addr) - count = len(s.nodes[string(key)]) - } - if count == 0 { - delete(s.data, string(key)) - } - return nil -} - -// HasKey returns whether a node with addr contains the key. -func (s *GlobalStore) HasKey(addr common.Address, key []byte) bool { - s.mu.Lock() - defer s.mu.Unlock() - - _, ok := s.nodes[string(key)][addr] - return ok -} - -// Import reads tar archive from a reader that contains exported chunk data. -// It returns the number of chunks imported and an error. -func (s *GlobalStore) Import(r io.Reader) (n int, err error) { - s.mu.Lock() - defer s.mu.Unlock() - - tr := tar.NewReader(r) - - for { - hdr, err := tr.Next() - if err != nil { - if err == io.EOF { - break - } - return n, err - } - - data, err := ioutil.ReadAll(tr) - if err != nil { - return n, err - } - - var c mock.ExportedChunk - if err = json.Unmarshal(data, &c); err != nil { - return n, err - } - - addrs := make(map[common.Address]struct{}) - for _, a := range c.Addrs { - addrs[a] = struct{}{} - } - - key := string(common.Hex2Bytes(hdr.Name)) - s.nodes[key] = addrs - s.data[key] = c.Data - n++ - } - return n, err -} - -// Export writes to a writer a tar archive with all chunk data from -// the store. It returns the number of chunks exported and an error. -func (s *GlobalStore) Export(w io.Writer) (n int, err error) { - s.mu.Lock() - defer s.mu.Unlock() - - tw := tar.NewWriter(w) - defer tw.Close() - - buf := bytes.NewBuffer(make([]byte, 0, 1024)) - encoder := json.NewEncoder(buf) - for key, addrs := range s.nodes { - al := make([]common.Address, 0, len(addrs)) - for a := range addrs { - al = append(al, a) - } - - buf.Reset() - if err = encoder.Encode(mock.ExportedChunk{ - Addrs: al, - Data: s.data[key], - }); err != nil { - return n, err - } - - data := buf.Bytes() - hdr := &tar.Header{ - Name: common.Bytes2Hex([]byte(key)), - Mode: 0644, - Size: int64(len(data)), - } - if err := tw.WriteHeader(hdr); err != nil { - return n, err - } - if _, err := tw.Write(data); err != nil { - return n, err - } - n++ - } - return n, err -} diff --git a/swarm/storage/mock/mem/mem_test.go b/swarm/storage/mock/mem/mem_test.go deleted file mode 100644 index 63f23970bbd0..000000000000 --- a/swarm/storage/mock/mem/mem_test.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2018 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 mem - -import ( - "testing" - - "github.com/nebulaai/nbai-node/swarm/storage/mock/test" -) - -// TestGlobalStore is running test for a GlobalStore -// using test.MockStore function. -func TestGlobalStore(t *testing.T) { - test.MockStore(t, NewGlobalStore(), 100) -} - -// TestImportExport is running tests for importing and -// exporting data between two GlobalStores -// using test.ImportExport function. -func TestImportExport(t *testing.T) { - test.ImportExport(t, NewGlobalStore(), NewGlobalStore(), 100) -} diff --git a/swarm/storage/mock/mock.go b/swarm/storage/mock/mock.go deleted file mode 100644 index bea31b2eb711..000000000000 --- a/swarm/storage/mock/mock.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2018 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 mock defines types that are used by different implementations -// of mock storages. -// -// Implementations of mock storages are located in directories -// under this package: -// -// - db - LevelDB backend -// - mem - in memory map backend -// - rpc - RPC client that can connect to other backends -// -// Mock storages can implement Importer and Exporter interfaces -// for importing and exporting all chunk data that they contain. -// The exported file is a tar archive with all files named by -// hexadecimal representations of chunk keys and with content -// with JSON-encoded ExportedChunk structure. Exported format -// should be preserved across all mock store implementations. -package mock - -import ( - "errors" - "io" - - "github.com/nebulaai/nbai-node/common" -) - -// ErrNotFound indicates that the chunk is not found. -var ErrNotFound = errors.New("not found") - -// NodeStore holds the node address and a reference to the GlobalStore -// in order to access and store chunk data only for one node. -type NodeStore struct { - store GlobalStorer - addr common.Address -} - -// NewNodeStore creates a new instance of NodeStore that keeps -// chunk data using GlobalStorer with a provided address. -func NewNodeStore(addr common.Address, store GlobalStorer) *NodeStore { - return &NodeStore{ - store: store, - addr: addr, - } -} - -// Get returns chunk data for a key for a node that has the address -// provided on NodeStore initialization. -func (n *NodeStore) Get(key []byte) (data []byte, err error) { - return n.store.Get(n.addr, key) -} - -// Put saves chunk data for a key for a node that has the address -// provided on NodeStore initialization. -func (n *NodeStore) Put(key []byte, data []byte) error { - return n.store.Put(n.addr, key, data) -} - -// Delete removes chunk data for a key for a node that has the address -// provided on NodeStore initialization. -func (n *NodeStore) Delete(key []byte) error { - return n.store.Delete(n.addr, key) -} - -// GlobalStorer defines methods for mock db store -// that stores chunk data for all swarm nodes. -// It is used in tests to construct mock NodeStores -// for swarm nodes and to track and validate chunks. -type GlobalStorer interface { - Get(addr common.Address, key []byte) (data []byte, err error) - Put(addr common.Address, key []byte, data []byte) error - Delete(addr common.Address, key []byte) error - HasKey(addr common.Address, key []byte) bool - // NewNodeStore creates an instance of NodeStore - // to be used by a single swarm node with - // address addr. - NewNodeStore(addr common.Address) *NodeStore -} - -// Importer defines method for importing mock store data -// from an exported tar archive. -type Importer interface { - Import(r io.Reader) (n int, err error) -} - -// Exporter defines method for exporting mock store data -// to a tar archive. -type Exporter interface { - Export(w io.Writer) (n int, err error) -} - -// ExportedChunk is the structure that is saved in tar archive for -// each chunk as JSON-encoded bytes. -type ExportedChunk struct { - Data []byte `json:"d"` - Addrs []common.Address `json:"a"` -} diff --git a/swarm/storage/mock/rpc/rpc.go b/swarm/storage/mock/rpc/rpc.go deleted file mode 100644 index b14bf320602c..000000000000 --- a/swarm/storage/mock/rpc/rpc.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2018 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 implements an RPC client that connect to a centralized mock store. -// Centralazied mock store can be any other mock store implementation that is -// registered to Ethereum RPC server under mockStore name. Methods that defines -// mock.GlobalStore are the same that are used by RPC. Example: -// -// server := rpc.NewServer() -// server.RegisterName("mockStore", mem.NewGlobalStore()) -package rpc - -import ( - "fmt" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/storage/mock" -) - -// GlobalStore is rpc.Client that connects to a centralized mock store. -// Closing GlobalStore instance is required to release RPC client resources. -type GlobalStore struct { - client *rpc.Client -} - -// NewGlobalStore creates a new instance of GlobalStore. -func NewGlobalStore(client *rpc.Client) *GlobalStore { - return &GlobalStore{ - client: client, - } -} - -// Close closes RPC client. -func (s *GlobalStore) Close() error { - s.client.Close() - return nil -} - -// NewNodeStore returns a new instance of NodeStore that retrieves and stores -// chunk data only for a node with address addr. -func (s *GlobalStore) NewNodeStore(addr common.Address) *mock.NodeStore { - return mock.NewNodeStore(addr, s) -} - -// Get calls a Get method to RPC server. -func (s *GlobalStore) Get(addr common.Address, key []byte) (data []byte, err error) { - err = s.client.Call(&data, "mockStore_get", addr, key) - if err != nil && err.Error() == "not found" { - // pass the mock package value of error instead an rpc error - return data, mock.ErrNotFound - } - return data, err -} - -// Put calls a Put method to RPC server. -func (s *GlobalStore) Put(addr common.Address, key []byte, data []byte) error { - err := s.client.Call(nil, "mockStore_put", addr, key, data) - return err -} - -// Delete calls a Delete method to RPC server. -func (s *GlobalStore) Delete(addr common.Address, key []byte) error { - err := s.client.Call(nil, "mockStore_delete", addr, key) - return err -} - -// HasKey calls a HasKey method to RPC server. -func (s *GlobalStore) HasKey(addr common.Address, key []byte) bool { - var has bool - if err := s.client.Call(&has, "mockStore_hasKey", addr, key); err != nil { - log.Error(fmt.Sprintf("mock store HasKey: addr %s, key %064x: %v", addr, key, err)) - return false - } - return has -} diff --git a/swarm/storage/mock/rpc/rpc_test.go b/swarm/storage/mock/rpc/rpc_test.go deleted file mode 100644 index ffb59caad821..000000000000 --- a/swarm/storage/mock/rpc/rpc_test.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2018 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 ( - "testing" - - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/swarm/storage/mock/mem" - "github.com/nebulaai/nbai-node/swarm/storage/mock/test" -) - -// TestDBStore is running test for a GlobalStore -// using test.MockStore function. -func TestRPCStore(t *testing.T) { - serverStore := mem.NewGlobalStore() - - server := rpc.NewServer() - if err := server.RegisterName("mockStore", serverStore); err != nil { - t.Fatal(err) - } - - store := NewGlobalStore(rpc.DialInProc(server)) - defer store.Close() - - test.MockStore(t, store, 30) -} diff --git a/swarm/storage/mock/test/test.go b/swarm/storage/mock/test/test.go deleted file mode 100644 index 258516743890..000000000000 --- a/swarm/storage/mock/test/test.go +++ /dev/null @@ -1,244 +0,0 @@ -// Copyright 2018 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 test provides functions that are used for testing -// GlobalStorer implementations. -package test - -import ( - "bytes" - "fmt" - "io" - "strconv" - "testing" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/storage/mock" -) - -// MockStore creates NodeStore instances from provided GlobalStorer, -// each one with a unique address, stores different chunks on them -// and checks if they are retrievable or not on all nodes. -// Attribute n defines the number of NodeStores that will be created. -func MockStore(t *testing.T, globalStore mock.GlobalStorer, n int) { - t.Run("GlobalStore", func(t *testing.T) { - addrs := make([]common.Address, n) - for i := 0; i < n; i++ { - addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) - } - - for i, addr := range addrs { - chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...)) - data := []byte(strconv.FormatInt(int64(i)+1, 16)) - data = append(data, make([]byte, 4096-len(data))...) - globalStore.Put(addr, chunkAddr, data) - - for _, cAddr := range addrs { - cData, err := globalStore.Get(cAddr, chunkAddr) - if cAddr == addr { - if err != nil { - t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err) - } - if !bytes.Equal(data, cData) { - t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData) - } - if !globalStore.HasKey(cAddr, chunkAddr) { - t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex()) - } - } else { - if err != mock.ErrNotFound { - t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err) - } - if len(cData) > 0 { - t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData) - } - if globalStore.HasKey(cAddr, chunkAddr) { - t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex()) - } - } - } - } - t.Run("delete", func(t *testing.T) { - chunkAddr := storage.Address([]byte("1234567890abcd")) - for _, addr := range addrs { - err := globalStore.Put(addr, chunkAddr, []byte("data")) - if err != nil { - t.Fatalf("put data to store %s key %s: %v", addr.Hex(), chunkAddr.Hex(), err) - } - } - firstNodeAddr := addrs[0] - if err := globalStore.Delete(firstNodeAddr, chunkAddr); err != nil { - t.Fatalf("delete from store %s key %s: %v", firstNodeAddr.Hex(), chunkAddr.Hex(), err) - } - for i, addr := range addrs { - _, err := globalStore.Get(addr, chunkAddr) - if i == 0 { - if err != mock.ErrNotFound { - t.Errorf("get data from store %s key %s: expected mock.ErrNotFound error, got %v", addr.Hex(), chunkAddr.Hex(), err) - } - } else { - if err != nil { - t.Errorf("get data from store %s key %s: %v", addr.Hex(), chunkAddr.Hex(), err) - } - } - } - }) - }) - - t.Run("NodeStore", func(t *testing.T) { - nodes := make(map[common.Address]*mock.NodeStore) - for i := 0; i < n; i++ { - addr := common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) - nodes[addr] = globalStore.NewNodeStore(addr) - } - - i := 0 - for addr, store := range nodes { - i++ - chunkAddr := storage.Address(append(addr[:], []byte(fmt.Sprintf("%x", i))...)) - data := []byte(strconv.FormatInt(int64(i)+1, 16)) - data = append(data, make([]byte, 4096-len(data))...) - store.Put(chunkAddr, data) - - for cAddr, cStore := range nodes { - cData, err := cStore.Get(chunkAddr) - if cAddr == addr { - if err != nil { - t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err) - } - if !bytes.Equal(data, cData) { - t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData) - } - if !globalStore.HasKey(cAddr, chunkAddr) { - t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex()) - } - } else { - if err != mock.ErrNotFound { - t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err) - } - if len(cData) > 0 { - t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData) - } - if globalStore.HasKey(cAddr, chunkAddr) { - t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex()) - } - } - } - } - t.Run("delete", func(t *testing.T) { - chunkAddr := storage.Address([]byte("1234567890abcd")) - var chosenStore *mock.NodeStore - for addr, store := range nodes { - if chosenStore == nil { - chosenStore = store - } - err := store.Put(chunkAddr, []byte("data")) - if err != nil { - t.Fatalf("put data to store %s key %s: %v", addr.Hex(), chunkAddr.Hex(), err) - } - } - if err := chosenStore.Delete(chunkAddr); err != nil { - t.Fatalf("delete key %s: %v", chunkAddr.Hex(), err) - } - for addr, store := range nodes { - _, err := store.Get(chunkAddr) - if store == chosenStore { - if err != mock.ErrNotFound { - t.Errorf("get data from store %s key %s: expected mock.ErrNotFound error, got %v", addr.Hex(), chunkAddr.Hex(), err) - } - } else { - if err != nil { - t.Errorf("get data from store %s key %s: %v", addr.Hex(), chunkAddr.Hex(), err) - } - } - } - }) - }) -} - -// ImportExport saves chunks to the outStore, exports them to the tar archive, -// imports tar archive to the inStore and checks if all chunks are imported correctly. -func ImportExport(t *testing.T, outStore, inStore mock.GlobalStorer, n int) { - exporter, ok := outStore.(mock.Exporter) - if !ok { - t.Fatal("outStore does not implement mock.Exporter") - } - importer, ok := inStore.(mock.Importer) - if !ok { - t.Fatal("inStore does not implement mock.Importer") - } - addrs := make([]common.Address, n) - for i := 0; i < n; i++ { - addrs[i] = common.HexToAddress(strconv.FormatInt(int64(i)+1, 16)) - } - - for i, addr := range addrs { - chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...)) - data := []byte(strconv.FormatInt(int64(i)+1, 16)) - data = append(data, make([]byte, 4096-len(data))...) - outStore.Put(addr, chunkAddr, data) - } - - r, w := io.Pipe() - defer r.Close() - - exportErrChan := make(chan error) - go func() { - defer w.Close() - - _, err := exporter.Export(w) - exportErrChan <- err - }() - - if _, err := importer.Import(r); err != nil { - t.Fatalf("import: %v", err) - } - - if err := <-exportErrChan; err != nil { - t.Fatalf("export: %v", err) - } - - for i, addr := range addrs { - chunkAddr := storage.Address(append(addr[:], []byte(strconv.FormatInt(int64(i)+1, 16))...)) - data := []byte(strconv.FormatInt(int64(i)+1, 16)) - data = append(data, make([]byte, 4096-len(data))...) - for _, cAddr := range addrs { - cData, err := inStore.Get(cAddr, chunkAddr) - if cAddr == addr { - if err != nil { - t.Fatalf("get data from store %s key %s: %v", cAddr.Hex(), chunkAddr.Hex(), err) - } - if !bytes.Equal(data, cData) { - t.Fatalf("data on store %s: expected %x, got %x", cAddr.Hex(), data, cData) - } - if !inStore.HasKey(cAddr, chunkAddr) { - t.Fatalf("expected key %s on global store for node %s, but it was not found", chunkAddr.Hex(), cAddr.Hex()) - } - } else { - if err != mock.ErrNotFound { - t.Fatalf("expected error from store %s: %v, got %v", cAddr.Hex(), mock.ErrNotFound, err) - } - if len(cData) > 0 { - t.Fatalf("data on store %s: expected nil, got %x", cAddr.Hex(), cData) - } - if inStore.HasKey(cAddr, chunkAddr) { - t.Fatalf("not expected key %s on global store for node %s, but it was found", chunkAddr.Hex(), cAddr.Hex()) - } - } - } - } -} diff --git a/swarm/storage/netstore.go b/swarm/storage/netstore.go deleted file mode 100644 index 6485aa389c72..000000000000 --- a/swarm/storage/netstore.go +++ /dev/null @@ -1,297 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "context" - "encoding/hex" - "fmt" - "sync" - "sync/atomic" - "time" - - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/swarm/log" - lru "github.com/hashicorp/golang-lru" -) - -type ( - NewNetFetcherFunc func(ctx context.Context, addr Address, peers *sync.Map) NetFetcher -) - -type NetFetcher interface { - Request(ctx context.Context, hopCount uint8) - Offer(ctx context.Context, source *enode.ID) -} - -// NetStore is an extension of local storage -// it implements the ChunkStore interface -// on request it initiates remote cloud retrieval using a fetcher -// fetchers are unique to a chunk and are stored in fetchers LRU memory cache -// fetchFuncFactory is a factory object to create a fetch function for a specific chunk address -type NetStore struct { - mu sync.Mutex - store SyncChunkStore - fetchers *lru.Cache - NewNetFetcherFunc NewNetFetcherFunc - closeC chan struct{} -} - -var fetcherTimeout = 2 * time.Minute // timeout to cancel the fetcher even if requests are coming in - -// NewNetStore creates a new NetStore object using the given local store. newFetchFunc is a -// constructor function that can create a fetch function for a specific chunk address. -func NewNetStore(store SyncChunkStore, nnf NewNetFetcherFunc) (*NetStore, error) { - fetchers, err := lru.New(defaultChunkRequestsCacheCapacity) - if err != nil { - return nil, err - } - return &NetStore{ - store: store, - fetchers: fetchers, - NewNetFetcherFunc: nnf, - closeC: make(chan struct{}), - }, nil -} - -// Put stores a chunk in localstore, and delivers to all requestor peers using the fetcher stored in -// the fetchers cache -func (n *NetStore) Put(ctx context.Context, ch Chunk) error { - n.mu.Lock() - defer n.mu.Unlock() - - // put to the chunk to the store, there should be no error - err := n.store.Put(ctx, ch) - if err != nil { - return err - } - - // if chunk is now put in the store, check if there was an active fetcher and call deliver on it - // (this delivers the chunk to requestors via the fetcher) - if f := n.getFetcher(ch.Address()); f != nil { - f.deliver(ctx, ch) - } - return nil -} - -// Get retrieves the chunk from the NetStore DPA synchronously. -// It calls NetStore.get, and if the chunk is not in local Storage -// it calls fetch with the request, which blocks until the chunk -// arrived or context is done -func (n *NetStore) Get(rctx context.Context, ref Address) (Chunk, error) { - chunk, fetch, err := n.get(rctx, ref) - if err != nil { - return nil, err - } - if chunk != nil { - return chunk, nil - } - return fetch(rctx) -} - -func (n *NetStore) BinIndex(po uint8) uint64 { - return n.store.BinIndex(po) -} - -func (n *NetStore) Iterator(from uint64, to uint64, po uint8, f func(Address, uint64) bool) error { - return n.store.Iterator(from, to, po, f) -} - -// FetchFunc returns nil if the store contains the given address. Otherwise it returns a wait function, -// which returns after the chunk is available or the context is done -func (n *NetStore) FetchFunc(ctx context.Context, ref Address) func(context.Context) error { - chunk, fetch, _ := n.get(ctx, ref) - if chunk != nil { - return nil - } - return func(ctx context.Context) error { - _, err := fetch(ctx) - return err - } -} - -// Close chunk store -func (n *NetStore) Close() { - close(n.closeC) - n.store.Close() - // TODO: loop through fetchers to cancel them -} - -// get attempts at retrieving the chunk from LocalStore -// If it is not found then using getOrCreateFetcher: -// 1. Either there is already a fetcher to retrieve it -// 2. A new fetcher is created and saved in the fetchers cache -// From here on, all Get will hit on this fetcher until the chunk is delivered -// or all fetcher contexts are done. -// It returns a chunk, a fetcher function and an error -// If chunk is nil, the returned fetch function needs to be called with a context to return the chunk. -func (n *NetStore) get(ctx context.Context, ref Address) (Chunk, func(context.Context) (Chunk, error), error) { - n.mu.Lock() - defer n.mu.Unlock() - - chunk, err := n.store.Get(ctx, ref) - if err != nil { - if err != ErrChunkNotFound { - log.Debug("Received error from LocalStore other than ErrNotFound", "err", err) - } - // The chunk is not available in the LocalStore, let's get the fetcher for it, or create a new one - // if it doesn't exist yet - f := n.getOrCreateFetcher(ref) - // If the caller needs the chunk, it has to use the returned fetch function to get it - return nil, f.Fetch, nil - } - - return chunk, nil, nil -} - -// getOrCreateFetcher attempts at retrieving an existing fetchers -// if none exists, creates one and saves it in the fetchers cache -// caller must hold the lock -func (n *NetStore) getOrCreateFetcher(ref Address) *fetcher { - if f := n.getFetcher(ref); f != nil { - return f - } - - // no fetcher for the given address, we have to create a new one - key := hex.EncodeToString(ref) - // create the context during which fetching is kept alive - ctx, cancel := context.WithTimeout(context.Background(), fetcherTimeout) - // destroy is called when all requests finish - destroy := func() { - // remove fetcher from fetchers - n.fetchers.Remove(key) - // stop fetcher by cancelling context called when - // all requests cancelled/timedout or chunk is delivered - cancel() - } - // peers always stores all the peers which have an active request for the chunk. It is shared - // between fetcher and the NewFetchFunc function. It is needed by the NewFetchFunc because - // the peers which requested the chunk should not be requested to deliver it. - peers := &sync.Map{} - - fetcher := newFetcher(ref, n.NewNetFetcherFunc(ctx, ref, peers), destroy, peers, n.closeC) - n.fetchers.Add(key, fetcher) - - return fetcher -} - -// getFetcher retrieves the fetcher for the given address from the fetchers cache if it exists, -// otherwise it returns nil -func (n *NetStore) getFetcher(ref Address) *fetcher { - key := hex.EncodeToString(ref) - f, ok := n.fetchers.Get(key) - if ok { - return f.(*fetcher) - } - return nil -} - -// RequestsCacheLen returns the current number of outgoing requests stored in the cache -func (n *NetStore) RequestsCacheLen() int { - return n.fetchers.Len() -} - -// One fetcher object is responsible to fetch one chunk for one address, and keep track of all the -// peers who have requested it and did not receive it yet. -type fetcher struct { - addr Address // address of chunk - chunk Chunk // fetcher can set the chunk on the fetcher - deliveredC chan struct{} // chan signalling chunk delivery to requests - cancelledC chan struct{} // chan signalling the fetcher has been cancelled (removed from fetchers in NetStore) - netFetcher NetFetcher // remote fetch function to be called with a request source taken from the context - cancel func() // cleanup function for the remote fetcher to call when all upstream contexts are called - peers *sync.Map // the peers which asked for the chunk - requestCnt int32 // number of requests on this chunk. If all the requests are done (delivered or context is done) the cancel function is called - deliverOnce *sync.Once // guarantees that we only close deliveredC once -} - -// newFetcher creates a new fetcher object for the fiven addr. fetch is the function which actually -// does the retrieval (in non-test cases this is coming from the network package). cancel function is -// called either -// 1. when the chunk has been fetched all peers have been either notified or their context has been done -// 2. the chunk has not been fetched but all context from all the requests has been done -// The peers map stores all the peers which have requested chunk. -func newFetcher(addr Address, nf NetFetcher, cancel func(), peers *sync.Map, closeC chan struct{}) *fetcher { - cancelOnce := &sync.Once{} // cancel should only be called once - return &fetcher{ - addr: addr, - deliveredC: make(chan struct{}), - deliverOnce: &sync.Once{}, - cancelledC: closeC, - netFetcher: nf, - cancel: func() { - cancelOnce.Do(func() { - cancel() - }) - }, - peers: peers, - } -} - -// Fetch fetches the chunk synchronously, it is called by NetStore.Get is the chunk is not available -// locally. -func (f *fetcher) Fetch(rctx context.Context) (Chunk, error) { - atomic.AddInt32(&f.requestCnt, 1) - defer func() { - // if all the requests are done the fetcher can be cancelled - if atomic.AddInt32(&f.requestCnt, -1) == 0 { - f.cancel() - } - }() - - // The peer asking for the chunk. Store in the shared peers map, but delete after the request - // has been delivered - peer := rctx.Value("peer") - if peer != nil { - f.peers.Store(peer, time.Now()) - defer f.peers.Delete(peer) - } - - // If there is a source in the context then it is an offer, otherwise a request - sourceIF := rctx.Value("source") - - hopCount, _ := rctx.Value("hopcount").(uint8) - - if sourceIF != nil { - var source enode.ID - if err := source.UnmarshalText([]byte(sourceIF.(string))); err != nil { - return nil, err - } - f.netFetcher.Offer(rctx, &source) - } else { - f.netFetcher.Request(rctx, hopCount) - } - - // wait until either the chunk is delivered or the context is done - select { - case <-rctx.Done(): - return nil, rctx.Err() - case <-f.deliveredC: - return f.chunk, nil - case <-f.cancelledC: - return nil, fmt.Errorf("fetcher cancelled") - } -} - -// deliver is called by NetStore.Put to notify all pending requests -func (f *fetcher) deliver(ctx context.Context, ch Chunk) { - f.deliverOnce.Do(func() { - f.chunk = ch - // closing the deliveredC channel will terminate ongoing requests - close(f.deliveredC) - }) -} diff --git a/swarm/storage/netstore_test.go b/swarm/storage/netstore_test.go deleted file mode 100644 index 1c28bcc6b0aa..000000000000 --- a/swarm/storage/netstore_test.go +++ /dev/null @@ -1,688 +0,0 @@ -// Copyright 2018 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 ( - "bytes" - "context" - "crypto/rand" - "errors" - "fmt" - "io/ioutil" - "sync" - "testing" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/p2p/enode" - ch "github.com/nebulaai/nbai-node/swarm/chunk" -) - -var sourcePeerID = enode.HexID("99d8594b52298567d2ca3f4c441a5ba0140ee9245e26460d01102a52773c73b9") - -type mockNetFetcher struct { - peers *sync.Map - sources []*enode.ID - peersPerRequest [][]Address - requestCalled bool - offerCalled bool - quit <-chan struct{} - ctx context.Context - hopCounts []uint8 -} - -func (m *mockNetFetcher) Offer(ctx context.Context, source *enode.ID) { - m.offerCalled = true - m.sources = append(m.sources, source) -} - -func (m *mockNetFetcher) Request(ctx context.Context, hopCount uint8) { - m.requestCalled = true - var peers []Address - m.peers.Range(func(key interface{}, _ interface{}) bool { - peers = append(peers, common.FromHex(key.(string))) - return true - }) - m.peersPerRequest = append(m.peersPerRequest, peers) - m.hopCounts = append(m.hopCounts, hopCount) -} - -type mockNetFetchFuncFactory struct { - fetcher *mockNetFetcher -} - -func (m *mockNetFetchFuncFactory) newMockNetFetcher(ctx context.Context, _ Address, peers *sync.Map) NetFetcher { - m.fetcher.peers = peers - m.fetcher.quit = ctx.Done() - m.fetcher.ctx = ctx - return m.fetcher -} - -func mustNewNetStore(t *testing.T) *NetStore { - netStore, _ := mustNewNetStoreWithFetcher(t) - return netStore -} - -func mustNewNetStoreWithFetcher(t *testing.T) (*NetStore, *mockNetFetcher) { - t.Helper() - - datadir, err := ioutil.TempDir("", "netstore") - if err != nil { - t.Fatal(err) - } - naddr := make([]byte, 32) - params := NewDefaultLocalStoreParams() - params.Init(datadir) - params.BaseKey = naddr - localStore, err := NewTestLocalStoreForAddr(params) - if err != nil { - t.Fatal(err) - } - - fetcher := &mockNetFetcher{} - mockNetFetchFuncFactory := &mockNetFetchFuncFactory{ - fetcher: fetcher, - } - netStore, err := NewNetStore(localStore, mockNetFetchFuncFactory.newMockNetFetcher) - if err != nil { - t.Fatal(err) - } - return netStore, fetcher -} - -// TestNetStoreGetAndPut tests calling NetStore.Get which is blocked until the same chunk is Put. -// After the Put there should no active fetchers, and the context created for the fetcher should -// be cancelled. -func TestNetStoreGetAndPut(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) - defer cancel() - - c := make(chan struct{}) // this channel ensures that the gouroutine with the Put does not run earlier than the Get - putErrC := make(chan error) - go func() { - <-c // wait for the Get to be called - time.Sleep(200 * time.Millisecond) // and a little more so it is surely called - - // check if netStore created a fetcher in the Get call for the unavailable chunk - if netStore.fetchers.Len() != 1 || netStore.getFetcher(chunk.Address()) == nil { - putErrC <- errors.New("Expected netStore to use a fetcher for the Get call") - return - } - - err := netStore.Put(ctx, chunk) - if err != nil { - putErrC <- fmt.Errorf("Expected no err got %v", err) - return - } - - putErrC <- nil - }() - - close(c) - recChunk, err := netStore.Get(ctx, chunk.Address()) // this is blocked until the Put above is done - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - - if err := <-putErrC; err != nil { - t.Fatal(err) - } - // the retrieved chunk should be the same as what we Put - if !bytes.Equal(recChunk.Address(), chunk.Address()) || !bytes.Equal(recChunk.Data(), chunk.Data()) { - t.Fatalf("Different chunk received than what was put") - } - // the chunk is already available locally, so there should be no active fetchers waiting for it - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to remove the fetcher after delivery") - } - - // A fetcher was created when the Get was called (and the chunk was not available). The chunk - // was delivered with the Put call, so the fetcher should be cancelled now. - select { - case <-fetcher.ctx.Done(): - default: - t.Fatal("Expected fetcher context to be cancelled") - } - -} - -// TestNetStoreGetAndPut tests calling NetStore.Put and then NetStore.Get. -// After the Put the chunk is available locally, so the Get can just retrieve it from LocalStore, -// there is no need to create fetchers. -func TestNetStoreGetAfterPut(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) - defer cancel() - - // First we Put the chunk, so the chunk will be available locally - err := netStore.Put(ctx, chunk) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - - // Get should retrieve the chunk from LocalStore, without creating fetcher - recChunk, err := netStore.Get(ctx, chunk.Address()) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - // the retrieved chunk should be the same as what we Put - if !bytes.Equal(recChunk.Address(), chunk.Address()) || !bytes.Equal(recChunk.Data(), chunk.Data()) { - t.Fatalf("Different chunk received than what was put") - } - // no fetcher offer or request should be created for a locally available chunk - if fetcher.offerCalled || fetcher.requestCalled { - t.Fatal("NetFetcher.offerCalled or requestCalled not expected to be called") - } - // no fetchers should be created for a locally available chunk - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to not have fetcher") - } - -} - -// TestNetStoreGetTimeout tests a Get call for an unavailable chunk and waits for timeout -func TestNetStoreGetTimeout(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) - defer cancel() - - c := make(chan struct{}) // this channel ensures that the gouroutine does not run earlier than the Get - fetcherErrC := make(chan error) - go func() { - <-c // wait for the Get to be called - time.Sleep(200 * time.Millisecond) // and a little more so it is surely called - - // check if netStore created a fetcher in the Get call for the unavailable chunk - if netStore.fetchers.Len() != 1 || netStore.getFetcher(chunk.Address()) == nil { - fetcherErrC <- errors.New("Expected netStore to use a fetcher for the Get call") - return - } - - fetcherErrC <- nil - }() - - close(c) - // We call Get on this chunk, which is not in LocalStore. We don't Put it at all, so there will - // be a timeout - _, err := netStore.Get(ctx, chunk.Address()) - - // Check if the timeout happened - if err != context.DeadlineExceeded { - t.Fatalf("Expected context.DeadLineExceeded err got %v", err) - } - - if err := <-fetcherErrC; err != nil { - t.Fatal(err) - } - - // A fetcher was created, check if it has been removed after timeout - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to remove the fetcher after timeout") - } - - // Check if the fetcher context has been cancelled after the timeout - select { - case <-fetcher.ctx.Done(): - default: - t.Fatal("Expected fetcher context to be cancelled") - } -} - -// TestNetStoreGetCancel tests a Get call for an unavailable chunk, then cancels the context and checks -// the errors -func TestNetStoreGetCancel(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) - - c := make(chan struct{}) // this channel ensures that the gouroutine with the cancel does not run earlier than the Get - fetcherErrC := make(chan error, 1) - go func() { - <-c // wait for the Get to be called - time.Sleep(200 * time.Millisecond) // and a little more so it is surely called - // check if netStore created a fetcher in the Get call for the unavailable chunk - if netStore.fetchers.Len() != 1 || netStore.getFetcher(chunk.Address()) == nil { - fetcherErrC <- errors.New("Expected netStore to use a fetcher for the Get call") - return - } - - fetcherErrC <- nil - cancel() - }() - - close(c) - - // We call Get with an unavailable chunk, so it will create a fetcher and wait for delivery - _, err := netStore.Get(ctx, chunk.Address()) - - if err := <-fetcherErrC; err != nil { - t.Fatal(err) - } - - // After the context is cancelled above Get should return with an error - if err != context.Canceled { - t.Fatalf("Expected context.Canceled err got %v", err) - } - - // A fetcher was created, check if it has been removed after cancel - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to remove the fetcher after cancel") - } - - // Check if the fetcher context has been cancelled after the request context cancel - select { - case <-fetcher.ctx.Done(): - default: - t.Fatal("Expected fetcher context to be cancelled") - } -} - -// TestNetStoreMultipleGetAndPut tests four Get calls for the same unavailable chunk. The chunk is -// delivered with a Put, we have to make sure all Get calls return, and they use a single fetcher -// for the chunk retrieval -func TestNetStoreMultipleGetAndPut(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) - defer cancel() - - putErrC := make(chan error) - go func() { - // sleep to make sure Put is called after all the Get - time.Sleep(500 * time.Millisecond) - // check if netStore created exactly one fetcher for all Get calls - if netStore.fetchers.Len() != 1 { - putErrC <- errors.New("Expected netStore to use one fetcher for all Get calls") - return - } - err := netStore.Put(ctx, chunk) - if err != nil { - putErrC <- fmt.Errorf("Expected no err got %v", err) - return - } - putErrC <- nil - }() - - count := 4 - // call Get 4 times for the same unavailable chunk. The calls will be blocked until the Put above. - errC := make(chan error) - for i := 0; i < count; i++ { - go func() { - recChunk, err := netStore.Get(ctx, chunk.Address()) - if err != nil { - errC <- fmt.Errorf("Expected no err got %v", err) - } - if !bytes.Equal(recChunk.Address(), chunk.Address()) || !bytes.Equal(recChunk.Data(), chunk.Data()) { - errC <- errors.New("Different chunk received than what was put") - } - errC <- nil - }() - } - - if err := <-putErrC; err != nil { - t.Fatal(err) - } - - timeout := time.After(1 * time.Second) - - // The Get calls should return after Put, so no timeout expected - for i := 0; i < count; i++ { - select { - case err := <-errC: - if err != nil { - t.Fatal(err) - } - case <-timeout: - t.Fatalf("Timeout waiting for Get calls to return") - } - } - - // A fetcher was created, check if it has been removed after cancel - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to remove the fetcher after delivery") - } - - // A fetcher was created, check if it has been removed after delivery - select { - case <-fetcher.ctx.Done(): - default: - t.Fatal("Expected fetcher context to be cancelled") - } - -} - -// TestNetStoreFetchFuncTimeout tests a FetchFunc call for an unavailable chunk and waits for timeout -func TestNetStoreFetchFuncTimeout(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond) - defer cancel() - - // FetchFunc is called for an unavaible chunk, so the returned wait function should not be nil - wait := netStore.FetchFunc(ctx, chunk.Address()) - if wait == nil { - t.Fatal("Expected wait function to be not nil") - } - - // There should an active fetcher for the chunk after the FetchFunc call - if netStore.fetchers.Len() != 1 || netStore.getFetcher(chunk.Address()) == nil { - t.Fatalf("Expected netStore to have one fetcher for the requested chunk") - } - - // wait function should timeout because we don't deliver the chunk with a Put - err := wait(ctx) - if err != context.DeadlineExceeded { - t.Fatalf("Expected context.DeadLineExceeded err got %v", err) - } - - // the fetcher should be removed after timeout - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to remove the fetcher after timeout") - } - - // the fetcher context should be cancelled after timeout - select { - case <-fetcher.ctx.Done(): - default: - t.Fatal("Expected fetcher context to be cancelled") - } -} - -// TestNetStoreFetchFuncAfterPut tests that the FetchFunc should return nil for a locally available chunk -func TestNetStoreFetchFuncAfterPut(t *testing.T) { - netStore := mustNewNetStore(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) - defer cancel() - - // We deliver the created the chunk with a Put - err := netStore.Put(ctx, chunk) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - - // FetchFunc should return nil, because the chunk is available locally, no need to fetch it - wait := netStore.FetchFunc(ctx, chunk.Address()) - if wait != nil { - t.Fatal("Expected wait to be nil") - } - - // No fetchers should be created at all - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to not have fetcher") - } -} - -// TestNetStoreGetCallsRequest tests if Get created a request on the NetFetcher for an unavailable chunk -func TestNetStoreGetCallsRequest(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx := context.WithValue(context.Background(), "hopcount", uint8(5)) - ctx, cancel := context.WithTimeout(ctx, 200*time.Millisecond) - defer cancel() - - // We call get for a not available chunk, it will timeout because the chunk is not delivered - _, err := netStore.Get(ctx, chunk.Address()) - - if err != context.DeadlineExceeded { - t.Fatalf("Expected context.DeadlineExceeded err got %v", err) - } - - // NetStore should call NetFetcher.Request and wait for the chunk - if !fetcher.requestCalled { - t.Fatal("Expected NetFetcher.Request to be called") - } - - if fetcher.hopCounts[0] != 5 { - t.Fatalf("Expected NetFetcher.Request be called with hopCount 5, got %v", fetcher.hopCounts[0]) - } -} - -// TestNetStoreGetCallsOffer tests if Get created a request on the NetFetcher for an unavailable chunk -// in case of a source peer provided in the context. -func TestNetStoreGetCallsOffer(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - // If a source peer is added to the context, NetStore will handle it as an offer - ctx := context.WithValue(context.Background(), "source", sourcePeerID.String()) - ctx, cancel := context.WithTimeout(ctx, 200*time.Millisecond) - defer cancel() - - // We call get for a not available chunk, it will timeout because the chunk is not delivered - _, err := netStore.Get(ctx, chunk.Address()) - - if err != context.DeadlineExceeded { - t.Fatalf("Expect error %v got %v", context.DeadlineExceeded, err) - } - - // NetStore should call NetFetcher.Offer with the source peer - if !fetcher.offerCalled { - t.Fatal("Expected NetFetcher.Request to be called") - } - - if len(fetcher.sources) != 1 { - t.Fatalf("Expected fetcher sources length 1 got %v", len(fetcher.sources)) - } - - if fetcher.sources[0].String() != sourcePeerID.String() { - t.Fatalf("Expected fetcher source %v got %v", sourcePeerID, fetcher.sources[0]) - } - -} - -// TestNetStoreFetcherCountPeers tests multiple NetStore.Get calls with peer in the context. -// There is no Put call, so the Get calls timeout -func TestNetStoreFetcherCountPeers(t *testing.T) { - - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - addr := randomAddr() - peers := []string{randomAddr().Hex(), randomAddr().Hex(), randomAddr().Hex()} - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) - defer cancel() - errC := make(chan error) - nrGets := 3 - - // Call Get 3 times with a peer in context - for i := 0; i < nrGets; i++ { - peer := peers[i] - go func() { - ctx := context.WithValue(ctx, "peer", peer) - _, err := netStore.Get(ctx, addr) - errC <- err - }() - } - - // All 3 Get calls should timeout - for i := 0; i < nrGets; i++ { - err := <-errC - if err != context.DeadlineExceeded { - t.Fatalf("Expected \"%v\" error got \"%v\"", context.DeadlineExceeded, err) - } - } - - // fetcher should be closed after timeout - select { - case <-fetcher.quit: - case <-time.After(3 * time.Second): - t.Fatalf("mockNetFetcher not closed after timeout") - } - - // All 3 peers should be given to NetFetcher after the 3 Get calls - if len(fetcher.peersPerRequest) != nrGets { - t.Fatalf("Expected 3 got %v", len(fetcher.peersPerRequest)) - } - - for i, peers := range fetcher.peersPerRequest { - if len(peers) < i+1 { - t.Fatalf("Expected at least %v got %v", i+1, len(peers)) - } - } -} - -// TestNetStoreFetchFuncCalledMultipleTimes calls the wait function given by FetchFunc three times, -// and checks there is still exactly one fetcher for one chunk. Afthe chunk is delivered, it checks -// if the fetcher is closed. -func TestNetStoreFetchFuncCalledMultipleTimes(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 500*time.Millisecond) - defer cancel() - - // FetchFunc should return a non-nil wait function, because the chunk is not available - wait := netStore.FetchFunc(ctx, chunk.Address()) - if wait == nil { - t.Fatal("Expected wait function to be not nil") - } - - // There should be exactly one fetcher for the chunk - if netStore.fetchers.Len() != 1 || netStore.getFetcher(chunk.Address()) == nil { - t.Fatalf("Expected netStore to have one fetcher for the requested chunk") - } - - // Call wait three times in parallel - count := 3 - errC := make(chan error) - for i := 0; i < count; i++ { - go func() { - errC <- wait(ctx) - }() - } - - // sleep a little so the wait functions are called above - time.Sleep(100 * time.Millisecond) - - // there should be still only one fetcher, because all wait calls are for the same chunk - if netStore.fetchers.Len() != 1 || netStore.getFetcher(chunk.Address()) == nil { - t.Fatal("Expected netStore to have one fetcher for the requested chunk") - } - - // Deliver the chunk with a Put - err := netStore.Put(ctx, chunk) - if err != nil { - t.Fatalf("Expected no err got %v", err) - } - - // wait until all wait calls return (because the chunk is delivered) - for i := 0; i < count; i++ { - err := <-errC - if err != nil { - t.Fatal(err) - } - } - - // There should be no more fetchers for the delivered chunk - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to remove the fetcher after delivery") - } - - // The context for the fetcher should be cancelled after delivery - select { - case <-fetcher.ctx.Done(): - default: - t.Fatal("Expected fetcher context to be cancelled") - } -} - -// TestNetStoreFetcherLifeCycleWithTimeout is similar to TestNetStoreFetchFuncCalledMultipleTimes, -// the only difference is that we don't deilver the chunk, just wait for timeout -func TestNetStoreFetcherLifeCycleWithTimeout(t *testing.T) { - netStore, fetcher := mustNewNetStoreWithFetcher(t) - - chunk := GenerateRandomChunk(ch.DefaultSize) - - ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) - defer cancel() - - // FetchFunc should return a non-nil wait function, because the chunk is not available - wait := netStore.FetchFunc(ctx, chunk.Address()) - if wait == nil { - t.Fatal("Expected wait function to be not nil") - } - - // There should be exactly one fetcher for the chunk - if netStore.fetchers.Len() != 1 || netStore.getFetcher(chunk.Address()) == nil { - t.Fatalf("Expected netStore to have one fetcher for the requested chunk") - } - - // Call wait three times in parallel - count := 3 - errC := make(chan error) - for i := 0; i < count; i++ { - go func() { - rctx, rcancel := context.WithTimeout(context.Background(), 100*time.Millisecond) - defer rcancel() - err := wait(rctx) - if err != context.DeadlineExceeded { - errC <- fmt.Errorf("Expected err %v got %v", context.DeadlineExceeded, err) - return - } - errC <- nil - }() - } - - // wait until all wait calls timeout - for i := 0; i < count; i++ { - err := <-errC - if err != nil { - t.Fatal(err) - } - } - - // There should be no more fetchers after timeout - if netStore.fetchers.Len() != 0 { - t.Fatal("Expected netStore to remove the fetcher after delivery") - } - - // The context for the fetcher should be cancelled after timeout - select { - case <-fetcher.ctx.Done(): - default: - t.Fatal("Expected fetcher context to be cancelled") - } -} - -func randomAddr() Address { - addr := make([]byte, 32) - rand.Read(addr) - return Address(addr) -} diff --git a/swarm/storage/pyramid.go b/swarm/storage/pyramid.go deleted file mode 100644 index 6899d6f1a45b..000000000000 --- a/swarm/storage/pyramid.go +++ /dev/null @@ -1,701 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "context" - "encoding/binary" - "errors" - "io" - "io/ioutil" - "sync" - "time" - - ch "github.com/nebulaai/nbai-node/swarm/chunk" - "github.com/nebulaai/nbai-node/swarm/log" -) - -/* - 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 rootAddress of the file. - -*/ - -var ( - errLoadingTreeRootChunk = errors.New("LoadTree Error: Could not load root chunk") - errLoadingTreeChunk = errors.New("LoadTree Error: Could not load chunk") -) - -const ( - ChunkProcessors = 8 - splitTimeout = time.Minute * 5 -) - -type PyramidSplitterParams struct { - SplitterParams - getter Getter -} - -func NewPyramidSplitterParams(addr Address, reader io.Reader, putter Putter, getter Getter, chunkSize int64) *PyramidSplitterParams { - hashSize := putter.RefSize() - return &PyramidSplitterParams{ - SplitterParams: SplitterParams{ - ChunkerParams: ChunkerParams{ - chunkSize: chunkSize, - hashSize: hashSize, - }, - reader: reader, - putter: putter, - addr: addr, - }, - getter: getter, - } -} - -/* - When splitting, data is given as a SectionReader, and the key is a hashSize long byte slice (Address), the root hash of the entire content will fill this once processing finishes. - New chunks to store are store using the putter which the caller provides. -*/ -func PyramidSplit(ctx context.Context, reader io.Reader, putter Putter, getter Getter) (Address, func(context.Context) error, error) { - return NewPyramidSplitter(NewPyramidSplitterParams(nil, reader, putter, getter, ch.DefaultSize)).Split(ctx) -} - -func PyramidAppend(ctx context.Context, addr Address, reader io.Reader, putter Putter, getter Getter) (Address, func(context.Context) error, error) { - return NewPyramidSplitter(NewPyramidSplitterParams(addr, reader, putter, getter, ch.DefaultSize)).Append(ctx) -} - -// 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 Address - chunk []byte - parentWg *sync.WaitGroup -} - -type PyramidChunker struct { - chunkSize int64 - hashSize int64 - branches int64 - reader io.Reader - putter Putter - getter Getter - key Address - workerCount int64 - workerLock sync.RWMutex - jobC chan *chunkJob - wg *sync.WaitGroup - errC chan error - quitC chan bool - rootAddress []byte - chunkLevel [][]*TreeEntry -} - -func NewPyramidSplitter(params *PyramidSplitterParams) (pc *PyramidChunker) { - pc = &PyramidChunker{} - pc.reader = params.reader - pc.hashSize = params.hashSize - pc.branches = params.chunkSize / pc.hashSize - pc.chunkSize = pc.hashSize * pc.branches - pc.putter = params.putter - pc.getter = params.getter - pc.key = params.addr - pc.workerCount = 0 - pc.jobC = make(chan *chunkJob, 2*ChunkProcessors) - pc.wg = &sync.WaitGroup{} - pc.errC = make(chan error) - pc.quitC = make(chan bool) - pc.rootAddress = make([]byte, pc.hashSize) - pc.chunkLevel = make([][]*TreeEntry, pc.branches) - return -} - -func (pc *PyramidChunker) Join(addr Address, getter Getter, depth int) LazySectionReader { - return &LazyChunkReader{ - addr: addr, - depth: depth, - chunkSize: pc.chunkSize, - branches: pc.branches, - hashSize: pc.hashSize, - getter: getter, - } -} - -func (pc *PyramidChunker) incrementWorkerCount() { - pc.workerLock.Lock() - defer pc.workerLock.Unlock() - pc.workerCount += 1 -} - -func (pc *PyramidChunker) getWorkerCount() int64 { - pc.workerLock.Lock() - defer pc.workerLock.Unlock() - return pc.workerCount -} - -func (pc *PyramidChunker) decrementWorkerCount() { - pc.workerLock.Lock() - defer pc.workerLock.Unlock() - pc.workerCount -= 1 -} - -func (pc *PyramidChunker) Split(ctx context.Context) (k Address, wait func(context.Context) error, err error) { - log.Debug("pyramid.chunker: Split()") - - pc.wg.Add(1) - pc.prepareChunks(ctx, false) - - // closes internal error channel if all subprocesses in the workgroup finished - go func() { - - // waiting for all chunks to finish - pc.wg.Wait() - - //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(pc.errC) - }() - - defer close(pc.quitC) - defer pc.putter.Close() - - select { - case err := <-pc.errC: - if err != nil { - return nil, nil, err - } - case <-ctx.Done(): - _ = pc.putter.Wait(ctx) //??? - return nil, nil, ctx.Err() - } - return pc.rootAddress, pc.putter.Wait, nil - -} - -func (pc *PyramidChunker) Append(ctx context.Context) (k Address, wait func(context.Context) error, err error) { - log.Debug("pyramid.chunker: Append()") - // Load the right most unfinished tree chunks in every level - pc.loadTree(ctx) - - pc.wg.Add(1) - pc.prepareChunks(ctx, true) - - // closes internal error channel if all subprocesses in the workgroup finished - go func() { - - // waiting for all chunks to finish - pc.wg.Wait() - - close(pc.errC) - }() - - defer close(pc.quitC) - defer pc.putter.Close() - - select { - case err := <-pc.errC: - if err != nil { - return nil, nil, err - } - case <-time.NewTimer(splitTimeout).C: - } - - return pc.rootAddress, pc.putter.Wait, nil - -} - -func (pc *PyramidChunker) processor(ctx context.Context, id int64) { - defer pc.decrementWorkerCount() - for { - select { - - case job, ok := <-pc.jobC: - if !ok { - return - } - pc.processChunk(ctx, id, job) - case <-pc.quitC: - return - } - } -} - -func (pc *PyramidChunker) processChunk(ctx context.Context, id int64, job *chunkJob) { - log.Debug("pyramid.chunker: processChunk()", "id", id) - - ref, err := pc.putter.Put(ctx, job.chunk) - if err != nil { - select { - case pc.errC <- err: - case <-pc.quitC: - } - } - - // report hash of this chunk one level up (keys corresponds to the proper subslice of the parent chunk) - copy(job.key, ref) - - // send off new chunk to storage - job.parentWg.Done() -} - -func (pc *PyramidChunker) loadTree(ctx context.Context) error { - log.Debug("pyramid.chunker: loadTree()") - // Get the root chunk to get the total size - chunkData, err := pc.getter.Get(ctx, Reference(pc.key)) - if err != nil { - return errLoadingTreeRootChunk - } - chunkSize := int64(chunkData.Size()) - log.Trace("pyramid.chunker: root chunk", "chunk.Size", chunkSize, "pc.chunkSize", pc.chunkSize) - - //if data size is less than a chunk... add a parent with update as pending - if chunkSize <= pc.chunkSize { - newEntry := &TreeEntry{ - level: 0, - branchCount: 1, - subtreeSize: uint64(chunkSize), - chunk: make([]byte, pc.chunkSize+8), - key: make([]byte, pc.hashSize), - index: 0, - updatePending: true, - } - copy(newEntry.chunk[8:], pc.key) - pc.chunkLevel[0] = append(pc.chunkLevel[0], newEntry) - return nil - } - - var treeSize int64 - var depth int - treeSize = pc.chunkSize - for ; treeSize < chunkSize; treeSize *= pc.branches { - depth++ - } - log.Trace("pyramid.chunker", "depth", depth) - - // Add the root chunk entry - branchCount := int64(len(chunkData)-8) / pc.hashSize - newEntry := &TreeEntry{ - level: depth - 1, - branchCount: branchCount, - subtreeSize: uint64(chunkSize), - chunk: chunkData, - key: pc.key, - index: 0, - updatePending: true, - } - pc.chunkLevel[depth-1] = append(pc.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 pc.chunkLevel[lvl] { - branchCount = int64(len(ent.chunk)-8) / pc.hashSize - for i := int64(0); i < branchCount; i++ { - key := ent.chunk[8+(i*pc.hashSize) : 8+((i+1)*pc.hashSize)] - newChunkData, err := pc.getter.Get(ctx, Reference(key)) - if err != nil { - return errLoadingTreeChunk - } - newChunkSize := newChunkData.Size() - bewBranchCount := int64(len(newChunkData)-8) / pc.hashSize - newEntry := &TreeEntry{ - level: lvl - 1, - branchCount: bewBranchCount, - subtreeSize: newChunkSize, - chunk: newChunkData, - key: key, - index: 0, - updatePending: true, - } - pc.chunkLevel[lvl-1] = append(pc.chunkLevel[lvl-1], newEntry) - - } - - // We need to get only the right most unfinished branch.. so trim all finished branches - if int64(len(pc.chunkLevel[lvl-1])) >= pc.branches { - pc.chunkLevel[lvl-1] = nil - } - } - } - - return nil -} - -func (pc *PyramidChunker) prepareChunks(ctx context.Context, isAppend bool) { - log.Debug("pyramid.chunker: prepareChunks", "isAppend", isAppend) - defer pc.wg.Done() - - chunkWG := &sync.WaitGroup{} - - pc.incrementWorkerCount() - - go pc.processor(ctx, pc.workerCount) - - parent := NewTreeEntry(pc) - var unfinishedChunkData ChunkData - var unfinishedChunkSize uint64 - - if isAppend && len(pc.chunkLevel[0]) != 0 { - lastIndex := len(pc.chunkLevel[0]) - 1 - ent := pc.chunkLevel[0][lastIndex] - - if ent.branchCount < pc.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 - lastAddress := parent.chunk[8+lastBranch*pc.hashSize : 8+(lastBranch+1)*pc.hashSize] - - var err error - unfinishedChunkData, err = pc.getter.Get(ctx, lastAddress) - if err != nil { - pc.errC <- err - } - unfinishedChunkSize = unfinishedChunkData.Size() - if unfinishedChunkSize < uint64(pc.chunkSize) { - parent.subtreeSize = parent.subtreeSize - unfinishedChunkSize - parent.branchCount = parent.branchCount - 1 - } else { - unfinishedChunkData = nil - } - } - } - - for index := 0; ; index++ { - var err error - chunkData := make([]byte, pc.chunkSize+8) - - var readBytes int - - if unfinishedChunkData != nil { - copy(chunkData, unfinishedChunkData) - readBytes += int(unfinishedChunkSize) - unfinishedChunkData = nil - log.Trace("pyramid.chunker: found unfinished chunk", "readBytes", readBytes) - } - - var res []byte - res, err = ioutil.ReadAll(io.LimitReader(pc.reader, int64(len(chunkData)-(8+readBytes)))) - - // hack for ioutil.ReadAll: - // a successful call to ioutil.ReadAll returns err == nil, not err == EOF, whereas we - // want to propagate the io.EOF error - if len(res) == 0 && err == nil { - err = io.EOF - } - copy(chunkData[8+readBytes:], res) - - readBytes += len(res) - log.Trace("pyramid.chunker: copied all data", "readBytes", readBytes) - - if err != nil { - if err == io.EOF || err == io.ErrUnexpectedEOF { - - pc.cleanChunkLevels() - - // Check if we are appending or the chunk is the only one. - if parent.branchCount == 1 && (pc.depth() == 0 || isAppend) { - // Data is exactly one chunk.. pick the last chunk key as root - chunkWG.Wait() - lastChunksAddress := parent.chunk[8 : 8+pc.hashSize] - copy(pc.rootAddress, lastChunksAddress) - break - } - } else { - close(pc.quitC) - break - } - } - - // Data ended in chunk boundary.. just signal to start bulding tree - if readBytes == 0 { - pc.buildTree(isAppend, parent, chunkWG, true, nil) - break - } else { - pkey := pc.enqueueDataChunk(chunkData, uint64(readBytes), parent, chunkWG) - - // update tree related parent data structures - parent.subtreeSize += uint64(readBytes) - parent.branchCount++ - - // Data got exhausted... signal to send any parent tree related chunks - if int64(readBytes) < pc.chunkSize { - - pc.cleanChunkLevels() - - // only one data chunk .. so dont add any parent chunk - if parent.branchCount <= 1 { - chunkWG.Wait() - - if isAppend || pc.depth() == 0 { - // No need to build the tree if the depth is 0 - // or we are appending. - // Just use the last key. - copy(pc.rootAddress, pkey) - } else { - // We need to build the tree and and provide the lonely - // chunk key to replace the last tree chunk key. - pc.buildTree(isAppend, parent, chunkWG, true, pkey) - } - break - } - - pc.buildTree(isAppend, parent, chunkWG, true, nil) - break - } - - if parent.branchCount == pc.branches { - pc.buildTree(isAppend, parent, chunkWG, false, nil) - parent = NewTreeEntry(pc) - } - - } - - workers := pc.getWorkerCount() - if int64(len(pc.jobC)) > workers && workers < ChunkProcessors { - pc.incrementWorkerCount() - go pc.processor(ctx, pc.workerCount) - } - - } - -} - -func (pc *PyramidChunker) buildTree(isAppend bool, ent *TreeEntry, chunkWG *sync.WaitGroup, last bool, lonelyChunkKey []byte) { - chunkWG.Wait() - pc.enqueueTreeChunk(ent, chunkWG, last) - - compress := false - endLvl := pc.branches - for lvl := int64(0); lvl < pc.branches; lvl++ { - lvlCount := int64(len(pc.chunkLevel[lvl])) - if lvlCount >= pc.branches { - endLvl = lvl + 1 - compress = true - break - } - } - - if !compress && !last { - 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(pc.chunkLevel[lvl])) - if lvlCount == 1 && last { - copy(pc.rootAddress, pc.chunkLevel[lvl][0].key) - return - } - - for startCount := int64(0); startCount < lvlCount; startCount += pc.branches { - - endCount := startCount + pc.branches - if endCount > lvlCount { - endCount = lvlCount - } - - var nextLvlCount int64 - var tempEntry *TreeEntry - if len(pc.chunkLevel[lvl+1]) > 0 { - nextLvlCount = int64(len(pc.chunkLevel[lvl+1]) - 1) - tempEntry = pc.chunkLevel[lvl+1][nextLvlCount] - } - if isAppend && tempEntry != nil && tempEntry.updatePending { - updateEntry := &TreeEntry{ - level: int(lvl + 1), - branchCount: 0, - subtreeSize: 0, - chunk: make([]byte, pc.chunkSize+8), - key: make([]byte, pc.hashSize), - index: int(nextLvlCount), - updatePending: true, - } - for index := int64(0); index < lvlCount; index++ { - updateEntry.branchCount++ - updateEntry.subtreeSize += pc.chunkLevel[lvl][index].subtreeSize - copy(updateEntry.chunk[8+(index*pc.hashSize):8+((index+1)*pc.hashSize)], pc.chunkLevel[lvl][index].key[:pc.hashSize]) - } - - pc.enqueueTreeChunk(updateEntry, chunkWG, last) - - } else { - - noOfBranches := endCount - startCount - newEntry := &TreeEntry{ - level: int(lvl + 1), - branchCount: noOfBranches, - subtreeSize: 0, - chunk: make([]byte, (noOfBranches*pc.hashSize)+8), - key: make([]byte, pc.hashSize), - index: int(nextLvlCount), - updatePending: false, - } - - index := int64(0) - for i := startCount; i < endCount; i++ { - entry := pc.chunkLevel[lvl][i] - newEntry.subtreeSize += entry.subtreeSize - copy(newEntry.chunk[8+(index*pc.hashSize):8+((index+1)*pc.hashSize)], entry.key[:pc.hashSize]) - index++ - } - // Lonely chunk key is the key of the last chunk that is only one on the last branch. - // In this case, ignore the its tree chunk key and replace it with the lonely chunk key. - if lonelyChunkKey != nil { - // Overwrite the last tree chunk key with the lonely data chunk key. - copy(newEntry.chunk[int64(len(newEntry.chunk))-pc.hashSize:], lonelyChunkKey[:pc.hashSize]) - } - - pc.enqueueTreeChunk(newEntry, chunkWG, last) - - } - - } - - if !isAppend { - chunkWG.Wait() - if compress { - pc.chunkLevel[lvl] = nil - } - } - } - -} - -func (pc *PyramidChunker) enqueueTreeChunk(ent *TreeEntry, chunkWG *sync.WaitGroup, last bool) { - if ent != nil && ent.branchCount > 0 { - - // wait for data chunks to get over before processing the tree chunk - if last { - chunkWG.Wait() - } - - binary.LittleEndian.PutUint64(ent.chunk[:8], ent.subtreeSize) - ent.key = make([]byte, pc.hashSize) - chunkWG.Add(1) - select { - case pc.jobC <- &chunkJob{ent.key, ent.chunk[:ent.branchCount*pc.hashSize+8], chunkWG}: - case <-pc.quitC: - } - - // Update or append based on weather it is a new entry or being reused - if ent.updatePending { - chunkWG.Wait() - pc.chunkLevel[ent.level][ent.index] = ent - } else { - pc.chunkLevel[ent.level] = append(pc.chunkLevel[ent.level], ent) - } - - } -} - -func (pc *PyramidChunker) enqueueDataChunk(chunkData []byte, size uint64, parent *TreeEntry, chunkWG *sync.WaitGroup) Address { - binary.LittleEndian.PutUint64(chunkData[:8], size) - pkey := parent.chunk[8+parent.branchCount*pc.hashSize : 8+(parent.branchCount+1)*pc.hashSize] - - chunkWG.Add(1) - select { - case pc.jobC <- &chunkJob{pkey, chunkData[:size+8], chunkWG}: - case <-pc.quitC: - } - - return pkey - -} - -// depth returns the number of chunk levels. -// It is used to detect if there is only one data chunk -// left for the last branch. -func (pc *PyramidChunker) depth() (d int) { - for _, l := range pc.chunkLevel { - if l == nil { - return - } - d++ - } - return -} - -// cleanChunkLevels removes gaps (nil levels) between chunk levels -// that are not nil. -func (pc *PyramidChunker) cleanChunkLevels() { - for i, l := range pc.chunkLevel { - if l == nil { - pc.chunkLevel = append(pc.chunkLevel[:i], append(pc.chunkLevel[i+1:], nil)...) - } - } -} diff --git a/swarm/storage/schema.go b/swarm/storage/schema.go deleted file mode 100644 index 91847ca0f9a4..000000000000 --- a/swarm/storage/schema.go +++ /dev/null @@ -1,17 +0,0 @@ -package storage - -// The DB schema we want to use. The actual/current DB schema might differ -// until migrations are run. -const CurrentDbSchema = DbSchemaHalloween - -// There was a time when we had no schema at all. -const DbSchemaNone = "" - -// "purity" is the first formal schema of LevelDB we release together with Swarm 0.3.5 -const DbSchemaPurity = "purity" - -// "halloween" is here because we had a screw in the garbage collector index. -// Because of that we had to rebuild the GC index to get rid of erroneous -// entries and that takes a long time. This schema is used for bookkeeping, -// so rebuild index will run just once. -const DbSchemaHalloween = "halloween" diff --git a/swarm/storage/swarmhasher.go b/swarm/storage/swarmhasher.go deleted file mode 100644 index fae03f0c72fe..000000000000 --- a/swarm/storage/swarmhasher.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "hash" -) - -const ( - BMTHash = "BMT" - SHA3Hash = "SHA3" // http://golang.org/pkg/hash/#Hash - DefaultHash = BMTHash -) - -type SwarmHash interface { - hash.Hash - ResetWithLength([]byte) -} - -type HashWithLength struct { - hash.Hash -} - -func (h *HashWithLength) ResetWithLength(length []byte) { - h.Reset() - h.Write(length) -} diff --git a/swarm/storage/types.go b/swarm/storage/types.go deleted file mode 100644 index f5ba49f3a804..000000000000 --- a/swarm/storage/types.go +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package storage - -import ( - "bytes" - "context" - "crypto" - "crypto/rand" - "encoding/binary" - "fmt" - "io" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/swarm/bmt" - ch "github.com/nebulaai/nbai-node/swarm/chunk" - "golang.org/x/crypto/sha3" -) - -const MaxPO = 16 -const AddressLength = 32 - -type SwarmHasher func() SwarmHash - -type Address []byte - -// Proximity(x, y) returns the proximity order of the MSB distance between x and y -// -// The distance metric MSB(x, y) of two equal length byte sequences x an y is the -// value of the binary integer cast of the x^y, ie., x and y bitwise xor-ed. -// the binary cast is big endian: most significant bit first (=MSB). -// -// Proximity(x, y) is a discrete logarithmic scaling of the MSB distance. -// It is defined as the reverse rank of the integer part of the base 2 -// logarithm of the distance. -// It is calculated by counting the number of common leading zeros in the (MSB) -// binary representation of the x^y. -// -// (0 farthest, 255 closest, 256 self) -func Proximity(one, other []byte) (ret int) { - b := (MaxPO-1)/8 + 1 - if b > len(one) { - b = len(one) - } - m := 8 - for i := 0; i < b; i++ { - oxo := one[i] ^ other[i] - for j := 0; j < m; j++ { - if (oxo>>uint8(7-j))&0x01 != 0 { - return i*8 + j - } - } - } - return MaxPO -} - -var ZeroAddr = Address(common.Hash{}.Bytes()) - -func MakeHashFunc(hash string) SwarmHasher { - switch hash { - case "SHA256": - return func() SwarmHash { return &HashWithLength{crypto.SHA256.New()} } - case "SHA3": - return func() SwarmHash { return &HashWithLength{sha3.NewLegacyKeccak256()} } - case "BMT": - return func() SwarmHash { - hasher := sha3.NewLegacyKeccak256 - hasherSize := hasher().Size() - segmentCount := ch.DefaultSize / hasherSize - pool := bmt.NewTreePool(hasher, segmentCount, bmt.PoolSize) - return bmt.New(pool) - } - } - return nil -} - -func (a Address) Hex() string { - return fmt.Sprintf("%064x", []byte(a[:])) -} - -func (a Address) Log() string { - if len(a[:]) < 8 { - return fmt.Sprintf("%x", []byte(a[:])) - } - return fmt.Sprintf("%016x", []byte(a[:8])) -} - -func (a Address) String() string { - return fmt.Sprintf("%064x", []byte(a)) -} - -func (a Address) MarshalJSON() (out []byte, err error) { - return []byte(`"` + a.String() + `"`), nil -} - -func (a *Address) UnmarshalJSON(value []byte) error { - s := string(value) - *a = make([]byte, 32) - h := common.Hex2Bytes(s[1 : len(s)-1]) - copy(*a, h) - return nil -} - -type AddressCollection []Address - -func NewAddressCollection(l int) AddressCollection { - return make(AddressCollection, l) -} - -func (c AddressCollection) Len() int { - return len(c) -} - -func (c AddressCollection) Less(i, j int) bool { - return bytes.Compare(c[i], c[j]) == -1 -} - -func (c AddressCollection) Swap(i, j int) { - c[i], c[j] = c[j], c[i] -} - -// Chunk interface implemented by context.Contexts and data chunks -type Chunk interface { - Address() Address - Data() []byte -} - -type chunk struct { - addr Address - sdata []byte - span int64 -} - -func NewChunk(addr Address, data []byte) *chunk { - return &chunk{ - addr: addr, - sdata: data, - span: -1, - } -} - -func (c *chunk) Address() Address { - return c.addr -} - -func (c *chunk) Data() []byte { - return c.sdata -} - -// String() for pretty printing -func (self *chunk) String() string { - return fmt.Sprintf("Address: %v TreeSize: %v Chunksize: %v", self.addr.Log(), self.span, len(self.sdata)) -} - -func GenerateRandomChunk(dataSize int64) Chunk { - hasher := MakeHashFunc(DefaultHash)() - sdata := make([]byte, dataSize+8) - rand.Read(sdata[8:]) - binary.LittleEndian.PutUint64(sdata[:8], uint64(dataSize)) - hasher.ResetWithLength(sdata[:8]) - hasher.Write(sdata[8:]) - return NewChunk(hasher.Sum(nil), sdata) -} - -func GenerateRandomChunks(dataSize int64, count int) (chunks []Chunk) { - for i := 0; i < count; i++ { - ch := GenerateRandomChunk(dataSize) - chunks = append(chunks, ch) - } - return chunks -} - -// Size, Seek, Read, ReadAt -type LazySectionReader interface { - Context() context.Context - Size(context.Context, chan bool) (int64, error) - io.Seeker - io.Reader - io.ReaderAt -} - -type LazyTestSectionReader struct { - *io.SectionReader -} - -func (r *LazyTestSectionReader) Size(context.Context, chan bool) (int64, error) { - return r.SectionReader.Size(), nil -} - -func (r *LazyTestSectionReader) Context() context.Context { - return context.TODO() -} - -type StoreParams struct { - Hash SwarmHasher `toml:"-"` - DbCapacity uint64 - CacheCapacity uint - BaseKey []byte -} - -func NewDefaultStoreParams() *StoreParams { - return NewStoreParams(defaultLDBCapacity, defaultCacheCapacity, nil, nil) -} - -func NewStoreParams(ldbCap uint64, cacheCap uint, hash SwarmHasher, basekey []byte) *StoreParams { - if basekey == nil { - basekey = make([]byte, 32) - } - if hash == nil { - hash = MakeHashFunc(DefaultHash) - } - return &StoreParams{ - Hash: hash, - DbCapacity: ldbCap, - CacheCapacity: cacheCap, - BaseKey: basekey, - } -} - -type ChunkData []byte - -type Reference []byte - -// Putter is responsible to store data and create a reference for it -type Putter interface { - Put(context.Context, ChunkData) (Reference, error) - // RefSize returns the length of the Reference created by this Putter - RefSize() int64 - // Close is to indicate that no more chunk data will be Put on this Putter - Close() - // Wait returns if all data has been store and the Close() was called. - Wait(context.Context) error -} - -// Getter is an interface to retrieve a chunk's data by its reference -type Getter interface { - Get(context.Context, Reference) (ChunkData, error) -} - -// NOTE: this returns invalid data if chunk is encrypted -func (c ChunkData) Size() uint64 { - return binary.LittleEndian.Uint64(c[:8]) -} - -type ChunkValidator interface { - Validate(chunk Chunk) bool -} - -// Provides method for validation of content address in chunks -// Holds the corresponding hasher to create the address -type ContentAddressValidator struct { - Hasher SwarmHasher -} - -// Constructor -func NewContentAddressValidator(hasher SwarmHasher) *ContentAddressValidator { - return &ContentAddressValidator{ - Hasher: hasher, - } -} - -// Validate that the given key is a valid content address for the given data -func (v *ContentAddressValidator) Validate(chunk Chunk) bool { - data := chunk.Data() - if l := len(data); l < 9 || l > ch.DefaultSize+8 { - // log.Error("invalid chunk size", "chunk", addr.Hex(), "size", l) - return false - } - - hasher := v.Hasher() - hasher.ResetWithLength(data[:8]) - hasher.Write(data[8:]) - hash := hasher.Sum(nil) - - return bytes.Equal(hash, chunk.Address()) -} - -type ChunkStore interface { - Put(ctx context.Context, ch Chunk) (err error) - Get(rctx context.Context, ref Address) (ch Chunk, err error) - Close() -} - -// SyncChunkStore is a ChunkStore which supports syncing -type SyncChunkStore interface { - ChunkStore - BinIndex(po uint8) uint64 - Iterator(from uint64, to uint64, po uint8, f func(Address, uint64) bool) error - FetchFunc(ctx context.Context, ref Address) func(context.Context) error -} - -// FakeChunkStore doesn't store anything, just implements the ChunkStore interface -// It can be used to inject into a hasherStore if you don't want to actually store data just do the -// hashing -type FakeChunkStore struct { -} - -// Put doesn't store anything it is just here to implement ChunkStore -func (f *FakeChunkStore) Put(_ context.Context, ch Chunk) error { - return nil -} - -// Gut doesn't store anything it is just here to implement ChunkStore -func (f *FakeChunkStore) Get(_ context.Context, ref Address) (Chunk, error) { - panic("FakeChunkStore doesn't support Get") -} - -// Close doesn't store anything it is just here to implement ChunkStore -func (f *FakeChunkStore) Close() { -} diff --git a/swarm/storage/types_test.go b/swarm/storage/types_test.go deleted file mode 100644 index 32907bbf4903..000000000000 --- a/swarm/storage/types_test.go +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2018 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 ( - "strconv" - "testing" -) - -// TestProximity validates Proximity function with explicit -// values in a table-driven test. It is highly dependant on -// MaxPO constant and it validates cases up to MaxPO=32. -func TestProximity(t *testing.T) { - // integer from base2 encoded string - bx := func(s string) uint8 { - i, err := strconv.ParseUint(s, 2, 8) - if err != nil { - t.Fatal(err) - } - return uint8(i) - } - // adjust expected bins in respect to MaxPO - limitPO := func(po uint8) uint8 { - if po > MaxPO { - return MaxPO - } - return po - } - base := []byte{bx("00000000"), bx("00000000"), bx("00000000"), bx("00000000")} - for _, tc := range []struct { - addr []byte - po uint8 - }{ - { - addr: base, - po: MaxPO, - }, - { - addr: []byte{bx("10000000"), bx("00000000"), bx("00000000"), bx("00000000")}, - po: limitPO(0), - }, - { - addr: []byte{bx("01000000"), bx("00000000"), bx("00000000"), bx("00000000")}, - po: limitPO(1), - }, - { - addr: []byte{bx("00100000"), bx("00000000"), bx("00000000"), bx("00000000")}, - po: limitPO(2), - }, - { - addr: []byte{bx("00010000"), bx("00000000"), bx("00000000"), bx("00000000")}, - po: limitPO(3), - }, - { - addr: []byte{bx("00001000"), bx("00000000"), bx("00000000"), bx("00000000")}, - po: limitPO(4), - }, - { - addr: []byte{bx("00000100"), bx("00000000"), bx("00000000"), bx("00000000")}, - po: limitPO(5), - }, - { - addr: []byte{bx("00000010"), bx("00000000"), bx("00000000"), bx("00000000")}, - po: limitPO(6), - }, - { - addr: []byte{bx("00000001"), bx("00000000"), bx("00000000"), bx("00000000")}, - po: limitPO(7), - }, - { - addr: []byte{bx("00000000"), bx("10000000"), bx("00000000"), bx("00000000")}, - po: limitPO(8), - }, - { - addr: []byte{bx("00000000"), bx("01000000"), bx("00000000"), bx("00000000")}, - po: limitPO(9), - }, - { - addr: []byte{bx("00000000"), bx("00100000"), bx("00000000"), bx("00000000")}, - po: limitPO(10), - }, - { - addr: []byte{bx("00000000"), bx("00010000"), bx("00000000"), bx("00000000")}, - po: limitPO(11), - }, - { - addr: []byte{bx("00000000"), bx("00001000"), bx("00000000"), bx("00000000")}, - po: limitPO(12), - }, - { - addr: []byte{bx("00000000"), bx("00000100"), bx("00000000"), bx("00000000")}, - po: limitPO(13), - }, - { - addr: []byte{bx("00000000"), bx("00000010"), bx("00000000"), bx("00000000")}, - po: limitPO(14), - }, - { - addr: []byte{bx("00000000"), bx("00000001"), bx("00000000"), bx("00000000")}, - po: limitPO(15), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("10000000"), bx("00000000")}, - po: limitPO(16), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("01000000"), bx("00000000")}, - po: limitPO(17), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("00100000"), bx("00000000")}, - po: limitPO(18), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("00010000"), bx("00000000")}, - po: limitPO(19), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("00001000"), bx("00000000")}, - po: limitPO(20), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("00000100"), bx("00000000")}, - po: limitPO(21), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("00000010"), bx("00000000")}, - po: limitPO(22), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("00000001"), bx("00000000")}, - po: limitPO(23), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("00000000"), bx("10000000")}, - po: limitPO(24), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("00000000"), bx("01000000")}, - po: limitPO(25), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("00000000"), bx("00100000")}, - po: limitPO(26), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("00000000"), bx("00010000")}, - po: limitPO(27), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("00000000"), bx("00001000")}, - po: limitPO(28), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("00000000"), bx("00000100")}, - po: limitPO(29), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("00000000"), bx("00000010")}, - po: limitPO(30), - }, - { - addr: []byte{bx("00000000"), bx("00000000"), bx("00000000"), bx("00000001")}, - po: limitPO(31), - }, - } { - got := uint8(Proximity(base, tc.addr)) - if got != tc.po { - t.Errorf("got %v bin, want %v", got, tc.po) - } - } -} diff --git a/swarm/swap/swap.go b/swarm/swap/swap.go deleted file mode 100644 index 49c06348f256..000000000000 --- a/swarm/swap/swap.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2018 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 swap - -import ( - "errors" - "fmt" - "strconv" - "sync" - - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/protocols" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/state" -) - -// SwAP Swarm Accounting Protocol -// a peer to peer micropayment system -// A node maintains an individual balance with every peer -// Only messages which have a price will be accounted for -type Swap struct { - stateStore state.Store //stateStore is needed in order to keep balances across sessions - lock sync.RWMutex //lock the balances - balances map[enode.ID]int64 //map of balances for each peer -} - -// New - swap constructor -func New(stateStore state.Store) (swap *Swap) { - swap = &Swap{ - stateStore: stateStore, - balances: make(map[enode.ID]int64), - } - return -} - -//Swap implements the protocols.Balance interface -//Add is the (sole) accounting function -func (s *Swap) Add(amount int64, peer *protocols.Peer) (err error) { - s.lock.Lock() - defer s.lock.Unlock() - - //load existing balances from the state store - err = s.loadState(peer) - if err != nil && err != state.ErrNotFound { - return - } - //adjust the balance - //if amount is negative, it will decrease, otherwise increase - s.balances[peer.ID()] += amount - //save the new balance to the state store - peerBalance := s.balances[peer.ID()] - err = s.stateStore.Put(peer.ID().String(), &peerBalance) - - log.Debug(fmt.Sprintf("balance for peer %s: %s", peer.ID().String(), strconv.FormatInt(peerBalance, 10))) - return err -} - -//GetPeerBalance returns the balance for a given peer -func (swap *Swap) GetPeerBalance(peer enode.ID) (int64, error) { - swap.lock.RLock() - defer swap.lock.RUnlock() - if p, ok := swap.balances[peer]; ok { - return p, nil - } - return 0, errors.New("Peer not found") -} - -//load balances from the state store (persisted) -func (s *Swap) loadState(peer *protocols.Peer) (err error) { - var peerBalance int64 - peerID := peer.ID() - //only load if the current instance doesn't already have this peer's - //balance in memory - if _, ok := s.balances[peerID]; !ok { - err = s.stateStore.Get(peerID.String(), &peerBalance) - s.balances[peerID] = peerBalance - } - return -} - -//Clean up Swap -func (swap *Swap) Close() { - swap.stateStore.Close() -} diff --git a/swarm/swap/swap_test.go b/swarm/swap/swap_test.go deleted file mode 100644 index 5a341ac9d7a5..000000000000 --- a/swarm/swap/swap_test.go +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright 2018 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 swap - -import ( - "flag" - "fmt" - "io/ioutil" - mrand "math/rand" - "os" - "testing" - "time" - - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/protocols" - "github.com/nebulaai/nbai-node/p2p/simulations/adapters" - "github.com/nebulaai/nbai-node/swarm/state" - colorable "github.com/mattn/go-colorable" -) - -var ( - loglevel = flag.Int("loglevel", 2, "verbosity of logs") -) - -func init() { - flag.Parse() - mrand.Seed(time.Now().UnixNano()) - - log.PrintOrigins(true) - log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(colorable.NewColorableStderr(), log.TerminalFormat(true)))) -} - -//Test getting a peer's balance -func TestGetPeerBalance(t *testing.T) { - //create a test swap account - swap, testDir := createTestSwap(t) - defer os.RemoveAll(testDir) - - //test for correct value - testPeer := newDummyPeer() - swap.balances[testPeer.ID()] = 888 - b, err := swap.GetPeerBalance(testPeer.ID()) - if err != nil { - t.Fatal(err) - } - if b != 888 { - t.Fatalf("Expected peer's balance to be %d, but is %d", 888, b) - } - - //test for inexistent node - id := adapters.RandomNodeConfig().ID - _, err = swap.GetPeerBalance(id) - if err == nil { - t.Fatal("Expected call to fail, but it didn't!") - } - if err.Error() != "Peer not found" { - t.Fatalf("Expected test to fail with %s, but is %s", "Peer not found", err.Error()) - } -} - -//Test that repeated bookings do correct accounting -func TestRepeatedBookings(t *testing.T) { - //create a test swap account - swap, testDir := createTestSwap(t) - defer os.RemoveAll(testDir) - - testPeer := newDummyPeer() - amount := mrand.Intn(100) - cnt := 1 + mrand.Intn(10) - for i := 0; i < cnt; i++ { - swap.Add(int64(amount), testPeer.Peer) - } - expectedBalance := int64(cnt * amount) - realBalance := swap.balances[testPeer.ID()] - if expectedBalance != realBalance { - t.Fatal(fmt.Sprintf("After %d credits of %d, expected balance to be: %d, but is: %d", cnt, amount, expectedBalance, realBalance)) - } - - testPeer2 := newDummyPeer() - amount = mrand.Intn(100) - cnt = 1 + mrand.Intn(10) - for i := 0; i < cnt; i++ { - swap.Add(0-int64(amount), testPeer2.Peer) - } - expectedBalance = int64(0 - (cnt * amount)) - realBalance = swap.balances[testPeer2.ID()] - if expectedBalance != realBalance { - t.Fatal(fmt.Sprintf("After %d debits of %d, expected balance to be: %d, but is: %d", cnt, amount, expectedBalance, realBalance)) - } - - //mixed debits and credits - amount1 := mrand.Intn(100) - amount2 := mrand.Intn(55) - amount3 := mrand.Intn(999) - swap.Add(int64(amount1), testPeer2.Peer) - swap.Add(int64(0-amount2), testPeer2.Peer) - swap.Add(int64(0-amount3), testPeer2.Peer) - - expectedBalance = expectedBalance + int64(amount1-amount2-amount3) - realBalance = swap.balances[testPeer2.ID()] - - if expectedBalance != realBalance { - t.Fatal(fmt.Sprintf("After mixed debits and credits, expected balance to be: %d, but is: %d", expectedBalance, realBalance)) - } -} - -//try restoring a balance from state store -//this is simulated by creating a node, -//assigning it an arbitrary balance, -//then closing the state store. -//Then we re-open the state store and check that -//the balance is still the same -func TestRestoreBalanceFromStateStore(t *testing.T) { - //create a test swap account - swap, testDir := createTestSwap(t) - defer os.RemoveAll(testDir) - - testPeer := newDummyPeer() - swap.balances[testPeer.ID()] = -8888 - - tmpBalance := swap.balances[testPeer.ID()] - swap.stateStore.Put(testPeer.ID().String(), &tmpBalance) - - swap.stateStore.Close() - swap.stateStore = nil - - stateStore, err := state.NewDBStore(testDir) - if err != nil { - t.Fatal(err) - } - - var newBalance int64 - stateStore.Get(testPeer.ID().String(), &newBalance) - - //compare the balances - if tmpBalance != newBalance { - t.Fatal(fmt.Sprintf("Unexpected balance value after sending cheap message test. Expected balance: %d, balance is: %d", - tmpBalance, newBalance)) - } -} - -//create a test swap account -//creates a stateStore for persistence and a Swap account -func createTestSwap(t *testing.T) (*Swap, string) { - dir, err := ioutil.TempDir("", "swap_test_store") - if err != nil { - t.Fatal(err) - } - stateStore, err2 := state.NewDBStore(dir) - if err2 != nil { - t.Fatal(err2) - } - swap := New(stateStore) - return swap, dir -} - -type dummyPeer struct { - *protocols.Peer -} - -//creates a dummy protocols.Peer with dummy MsgReadWriter -func newDummyPeer() *dummyPeer { - id := adapters.RandomNodeConfig().ID - protoPeer := protocols.NewPeer(p2p.NewPeer(id, "testPeer", nil), nil, nil) - dummy := &dummyPeer{ - Peer: protoPeer, - } - return dummy -} diff --git a/swarm/swarm.go b/swarm/swarm.go deleted file mode 100644 index 437d6258efbf..000000000000 --- a/swarm/swarm.go +++ /dev/null @@ -1,534 +0,0 @@ -// Copyright 2018 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 swarm - -import ( - "bytes" - "context" - "crypto/ecdsa" - "fmt" - "io" - "math/big" - "net" - "path/filepath" - "strings" - "time" - "unicode" - - "github.com/nebulaai/nbai-node/accounts/abi/bind" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/contracts/chequebook" - "github.com/nebulaai/nbai-node/contracts/ens" - "github.com/nebulaai/nbai-node/ethclient" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/p2p" - "github.com/nebulaai/nbai-node/p2p/enode" - "github.com/nebulaai/nbai-node/p2p/protocols" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/swarm/api" - httpapi "github.com/nebulaai/nbai-node/swarm/api/http" - "github.com/nebulaai/nbai-node/swarm/fuse" - "github.com/nebulaai/nbai-node/swarm/log" - "github.com/nebulaai/nbai-node/swarm/network" - "github.com/nebulaai/nbai-node/swarm/network/stream" - "github.com/nebulaai/nbai-node/swarm/pss" - "github.com/nebulaai/nbai-node/swarm/state" - "github.com/nebulaai/nbai-node/swarm/storage" - "github.com/nebulaai/nbai-node/swarm/storage/feed" - "github.com/nebulaai/nbai-node/swarm/storage/mock" - "github.com/nebulaai/nbai-node/swarm/swap" - "github.com/nebulaai/nbai-node/swarm/tracing" -) - -var ( - startTime time.Time - updateGaugesPeriod = 5 * time.Second - startCounter = metrics.NewRegisteredCounter("stack,start", nil) - stopCounter = metrics.NewRegisteredCounter("stack,stop", nil) - uptimeGauge = metrics.NewRegisteredGauge("stack.uptime", nil) - requestsCacheGauge = metrics.NewRegisteredGauge("storage.cache.requests.size", nil) -) - -// the swarm stack -type Swarm struct { - config *api.Config // swarm configuration - api *api.API // high level api layer (fs/manifest) - dns api.Resolver // DNS registrar - fileStore *storage.FileStore // distributed preimage archive, the local API to the storage with document level storage/retrieval support - streamer *stream.Registry - bzz *network.Bzz // the logistic manager - backend chequebook.Backend // simple blockchain Backend - privateKey *ecdsa.PrivateKey - netStore *storage.NetStore - sfs *fuse.SwarmFS // need this to cleanup all the active mounts on node exit - ps *pss.Pss - swap *swap.Swap - stateStore *state.DBStore - accountingMetrics *protocols.AccountingMetrics - - tracerClose io.Closer -} - -// creates a new swarm service instance -// implements node.Service -// If mockStore is not nil, it will be used as the storage for chunk data. -// MockStore should be used only for testing. -func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err error) { - - if bytes.Equal(common.FromHex(config.PublicKey), storage.ZeroAddr) { - return nil, fmt.Errorf("empty public key") - } - if bytes.Equal(common.FromHex(config.BzzKey), storage.ZeroAddr) { - return nil, fmt.Errorf("empty bzz key") - } - - var backend chequebook.Backend - if config.SwapAPI != "" && config.SwapEnabled { - log.Info("connecting to SWAP API", "url", config.SwapAPI) - backend, err = ethclient.Dial(config.SwapAPI) - if err != nil { - return nil, fmt.Errorf("error connecting to SWAP API %s: %s", config.SwapAPI, err) - } - } - - self = &Swarm{ - config: config, - backend: backend, - privateKey: config.ShiftPrivateKey(), - } - log.Debug("Setting up Swarm service components") - - config.HiveParams.Discovery = true - - bzzconfig := &network.BzzConfig{ - NetworkID: config.NetworkID, - OverlayAddr: common.FromHex(config.BzzKey), - HiveParams: config.HiveParams, - LightNode: config.LightNodeEnabled, - } - - self.stateStore, err = state.NewDBStore(filepath.Join(config.Path, "state-store.db")) - if err != nil { - return - } - - // set up high level api - var resolver *api.MultiResolver - if len(config.EnsAPIs) > 0 { - opts := []api.MultiResolverOption{} - for _, c := range config.EnsAPIs { - tld, endpoint, addr := parseEnsAPIAddress(c) - r, err := newEnsClient(endpoint, addr, config, self.privateKey) - if err != nil { - return nil, err - } - opts = append(opts, api.MultiResolverOptionWithResolver(r, tld)) - - } - resolver = api.NewMultiResolver(opts...) - self.dns = resolver - } - - lstore, err := storage.NewLocalStore(config.LocalStoreParams, mockStore) - if err != nil { - return nil, err - } - - self.netStore, err = storage.NewNetStore(lstore, nil) - if err != nil { - return nil, err - } - - to := network.NewKademlia( - common.FromHex(config.BzzKey), - network.NewKadParams(), - ) - delivery := stream.NewDelivery(to, self.netStore) - self.netStore.NewNetFetcherFunc = network.NewFetcherFactory(delivery.RequestFromPeers, config.DeliverySkipCheck).New - - if config.SwapEnabled { - balancesStore, err := state.NewDBStore(filepath.Join(config.Path, "balances.db")) - if err != nil { - return nil, err - } - self.swap = swap.New(balancesStore) - self.accountingMetrics = protocols.SetupAccountingMetrics(10*time.Second, filepath.Join(config.Path, "metrics.db")) - } - - var nodeID enode.ID - if err := nodeID.UnmarshalText([]byte(config.NodeID)); err != nil { - return nil, err - } - - syncing := stream.SyncingAutoSubscribe - if !config.SyncEnabled || config.LightNodeEnabled { - syncing = stream.SyncingDisabled - } - - retrieval := stream.RetrievalEnabled - if config.LightNodeEnabled { - retrieval = stream.RetrievalClientOnly - } - - registryOptions := &stream.RegistryOptions{ - SkipCheck: config.DeliverySkipCheck, - Syncing: syncing, - Retrieval: retrieval, - SyncUpdateDelay: config.SyncUpdateDelay, - MaxPeerServers: config.MaxStreamPeerServers, - } - self.streamer = stream.NewRegistry(nodeID, delivery, self.netStore, self.stateStore, registryOptions, self.swap) - - // Swarm Hash Merklised Chunking for Arbitrary-length Document/File storage - self.fileStore = storage.NewFileStore(self.netStore, self.config.FileStoreParams) - - var feedsHandler *feed.Handler - fhParams := &feed.HandlerParams{} - - feedsHandler = feed.NewHandler(fhParams) - feedsHandler.SetStore(self.netStore) - - lstore.Validators = []storage.ChunkValidator{ - storage.NewContentAddressValidator(storage.MakeHashFunc(storage.DefaultHash)), - feedsHandler, - } - - err = lstore.Migrate() - if err != nil { - return nil, err - } - - log.Debug("Setup local storage") - - self.bzz = network.NewBzz(bzzconfig, to, self.stateStore, self.streamer.GetSpec(), self.streamer.Run) - - // Pss = postal service over swarm (devp2p over bzz) - self.ps, err = pss.NewPss(to, config.Pss) - if err != nil { - return nil, err - } - if pss.IsActiveHandshake { - pss.SetHandshakeController(self.ps, pss.NewHandshakeParams()) - } - - self.api = api.NewAPI(self.fileStore, self.dns, feedsHandler, self.privateKey) - - self.sfs = fuse.NewSwarmFS(self.api) - log.Debug("Initialized FUSE filesystem") - - return self, nil -} - -// parseEnsAPIAddress parses string according to format -// [tld:][contract-addr@]url and returns ENSClientConfig structure -// with endpoint, contract address and TLD. -func parseEnsAPIAddress(s string) (tld, endpoint string, addr common.Address) { - isAllLetterString := func(s string) bool { - for _, r := range s { - if !unicode.IsLetter(r) { - return false - } - } - return true - } - endpoint = s - if i := strings.Index(endpoint, ":"); i > 0 { - if isAllLetterString(endpoint[:i]) && len(endpoint) > i+2 && endpoint[i+1:i+3] != "//" { - tld = endpoint[:i] - endpoint = endpoint[i+1:] - } - } - if i := strings.Index(endpoint, "@"); i > 0 { - addr = common.HexToAddress(endpoint[:i]) - endpoint = endpoint[i+1:] - } - return -} - -// ensClient provides functionality for api.ResolveValidator -type ensClient struct { - *ens.ENS - *ethclient.Client -} - -// newEnsClient creates a new ENS client for that is a consumer of -// a ENS API on a specific endpoint. It is used as a helper function -// for creating multiple resolvers in NewSwarm function. -func newEnsClient(endpoint string, addr common.Address, config *api.Config, privkey *ecdsa.PrivateKey) (*ensClient, error) { - log.Info("connecting to ENS API", "url", endpoint) - client, err := rpc.Dial(endpoint) - if err != nil { - return nil, fmt.Errorf("error connecting to ENS API %s: %s", endpoint, err) - } - ethClient := ethclient.NewClient(client) - - ensRoot := config.EnsRoot - if addr != (common.Address{}) { - ensRoot = addr - } else { - a, err := detectEnsAddr(client) - if err == nil { - ensRoot = a - } else { - log.Warn(fmt.Sprintf("could not determine ENS contract address, using default %s", ensRoot), "err", err) - } - } - transactOpts := bind.NewKeyedTransactor(privkey) - dns, err := ens.NewENS(transactOpts, ensRoot, ethClient) - if err != nil { - return nil, err - } - log.Debug(fmt.Sprintf("-> Swarm Domain Name Registrar %v @ address %v", endpoint, ensRoot.Hex())) - return &ensClient{ - ENS: dns, - Client: ethClient, - }, err -} - -// detectEnsAddr determines the ENS contract address by getting both the -// version and genesis hash using the client and matching them to either -// mainnet or testnet addresses -func detectEnsAddr(client *rpc.Client) (common.Address, error) { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - - var version string - if err := client.CallContext(ctx, &version, "net_version"); err != nil { - return common.Address{}, err - } - - block, err := ethclient.NewClient(client).BlockByNumber(ctx, big.NewInt(0)) - if err != nil { - return common.Address{}, err - } - - switch { - - case version == "1" && block.Hash() == params.MainnetGenesisHash: - log.Info("using Mainnet ENS contract address", "addr", ens.MainNetAddress) - return ens.MainNetAddress, nil - - case version == "3" && block.Hash() == params.TestnetGenesisHash: - log.Info("using Testnet ENS contract address", "addr", ens.TestNetAddress) - return ens.TestNetAddress, nil - - default: - return common.Address{}, fmt.Errorf("unknown version and genesis hash: %s %s", version, block.Hash()) - } -} - -/* -Start is called when the stack is started -* starts the network kademlia hive peer management -* (starts netStore level 0 api) -* starts DPA level 1 api (chunking -> store/retrieve requests) -* (starts level 2 api) -* starts http proxy server -* registers url scheme handlers for bzz, etc -* TODO: start subservices like sword, swear, swarmdns -*/ -// implements the node.Service interface -func (self *Swarm) Start(srv *p2p.Server) error { - startTime = time.Now() - - self.tracerClose = tracing.Closer - - // update uaddr to correct enode - newaddr := self.bzz.UpdateLocalAddr([]byte(srv.Self().String())) - log.Info("Updated bzz local addr", "oaddr", fmt.Sprintf("%x", newaddr.OAddr), "uaddr", fmt.Sprintf("%s", newaddr.UAddr)) - // set chequebook - //TODO: Currently if swap is enabled and no chequebook (or inexistent) contract is provided, the node would crash. - //Once we integrate back the contracts, this check MUST be revisited - if self.config.SwapEnabled && self.config.SwapAPI != "" { - ctx := context.Background() // The initial setup has no deadline. - err := self.SetChequebook(ctx) - if err != nil { - return fmt.Errorf("Unable to set chequebook for SWAP: %v", err) - } - log.Debug(fmt.Sprintf("-> cheque book for SWAP: %v", self.config.Swap.Chequebook())) - } else { - log.Debug(fmt.Sprintf("SWAP disabled: no cheque book set")) - } - - log.Info("Starting bzz service") - - err := self.bzz.Start(srv) - if err != nil { - log.Error("bzz failed", "err", err) - return err - } - log.Info("Swarm network started", "bzzaddr", fmt.Sprintf("%x", self.bzz.Hive.BaseAddr())) - - if self.ps != nil { - self.ps.Start(srv) - } - - // start swarm http proxy server - if self.config.Port != "" { - addr := net.JoinHostPort(self.config.ListenAddr, self.config.Port) - server := httpapi.NewServer(self.api, self.config.Cors) - - if self.config.Cors != "" { - log.Debug("Swarm HTTP proxy CORS headers", "allowedOrigins", self.config.Cors) - } - - log.Debug("Starting Swarm HTTP proxy", "port", self.config.Port) - go func() { - err := server.ListenAndServe(addr) - if err != nil { - log.Error("Could not start Swarm HTTP proxy", "err", err.Error()) - } - }() - } - - self.periodicallyUpdateGauges() - - startCounter.Inc(1) - self.streamer.Start(srv) - return nil -} - -func (self *Swarm) periodicallyUpdateGauges() { - ticker := time.NewTicker(updateGaugesPeriod) - - go func() { - for range ticker.C { - self.updateGauges() - } - }() -} - -func (self *Swarm) updateGauges() { - uptimeGauge.Update(time.Since(startTime).Nanoseconds()) - requestsCacheGauge.Update(int64(self.netStore.RequestsCacheLen())) -} - -// implements the node.Service interface -// stops all component services. -func (self *Swarm) Stop() error { - if self.tracerClose != nil { - err := self.tracerClose.Close() - if err != nil { - return err - } - } - - if self.ps != nil { - self.ps.Stop() - } - if ch := self.config.Swap.Chequebook(); ch != nil { - ch.Stop() - ch.Save() - } - if self.swap != nil { - self.swap.Close() - } - if self.accountingMetrics != nil { - self.accountingMetrics.Close() - } - if self.netStore != nil { - self.netStore.Close() - } - self.sfs.Stop() - stopCounter.Inc(1) - self.streamer.Stop() - - err := self.bzz.Stop() - if self.stateStore != nil { - self.stateStore.Close() - } - return err -} - -// implements the node.Service interface -func (self *Swarm) Protocols() (protos []p2p.Protocol) { - protos = append(protos, self.bzz.Protocols()...) - - if self.ps != nil { - protos = append(protos, self.ps.Protocols()...) - } - return -} - -// implements node.Service -// APIs returns the RPC API descriptors the Swarm implementation offers -func (self *Swarm) APIs() []rpc.API { - - apis := []rpc.API{ - // public APIs - { - Namespace: "bzz", - Version: "3.0", - Service: &Info{self.config, chequebook.ContractParams}, - Public: true, - }, - // admin APIs - { - Namespace: "bzz", - Version: "3.0", - Service: api.NewControl(self.api, self.bzz.Hive), - Public: false, - }, - { - Namespace: "chequebook", - Version: chequebook.Version, - Service: chequebook.NewApi(self.config.Swap.Chequebook), - Public: false, - }, - { - Namespace: "swarmfs", - Version: fuse.Swarmfs_Version, - Service: self.sfs, - Public: false, - }, - { - Namespace: "accounting", - Version: protocols.AccountingVersion, - Service: protocols.NewAccountingApi(self.accountingMetrics), - Public: false, - }, - } - - apis = append(apis, self.bzz.APIs()...) - - if self.ps != nil { - apis = append(apis, self.ps.APIs()...) - } - - return apis -} - -// SetChequebook ensures that the local checquebook is set up on chain. -func (self *Swarm) SetChequebook(ctx context.Context) error { - err := self.config.Swap.SetChequebook(ctx, self.backend, self.config.Path) - if err != nil { - return err - } - log.Info(fmt.Sprintf("new chequebook set (%v): saving config file, resetting all connections in the hive", self.config.Swap.Contract.Hex())) - return nil -} - -// serialisable info about swarm -type Info struct { - *api.Config - *chequebook.Params -} - -func (self *Info) Info() *Info { - return self -} diff --git a/swarm/swarm_test.go b/swarm/swarm_test.go deleted file mode 100644 index 3ec98c41fccc..000000000000 --- a/swarm/swarm_test.go +++ /dev/null @@ -1,375 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package swarm - -import ( - "context" - "encoding/hex" - "io/ioutil" - "math/rand" - "os" - "path" - "runtime" - "strings" - "testing" - "time" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/rpc" - "github.com/nebulaai/nbai-node/swarm/api" -) - -// TestNewSwarm validates Swarm fields in repsect to the provided configuration. -func TestNewSwarm(t *testing.T) { - dir, err := ioutil.TempDir("", "swarm") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - - // a simple rpc endpoint for testing dialing - ipcEndpoint := path.Join(dir, "TestSwarm.ipc") - - // windows namedpipes are not on filesystem but on NPFS - if runtime.GOOS == "windows" { - b := make([]byte, 8) - rand.Read(b) - ipcEndpoint = `\\.\pipe\TestSwarm-` + hex.EncodeToString(b) - } - - _, server, err := rpc.StartIPCEndpoint(ipcEndpoint, nil) - if err != nil { - t.Error(err) - } - defer server.Stop() - - for _, tc := range []struct { - name string - configure func(*api.Config) - check func(*testing.T, *Swarm, *api.Config) - }{ - { - name: "defaults", - configure: nil, - check: func(t *testing.T, s *Swarm, config *api.Config) { - if s.config != config { - t.Error("config is not the same object") - } - if s.backend != nil { - t.Error("backend is not nil") - } - if s.privateKey == nil { - t.Error("private key is not set") - } - if !s.config.HiveParams.Discovery { - t.Error("config.HiveParams.Discovery is false, must be true regardless the configuration") - } - if s.dns != nil { - t.Error("dns initialized, but it should not be") - } - if s.netStore == nil { - t.Error("netStore not initialized") - } - if s.streamer == nil { - t.Error("streamer not initialized") - } - if s.fileStore == nil { - t.Error("fileStore not initialized") - } - if s.bzz == nil { - t.Error("bzz not initialized") - } - if s.ps == nil { - t.Error("pss not initialized") - } - if s.api == nil { - t.Error("api not initialized") - } - if s.sfs == nil { - t.Error("swarm filesystem not initialized") - } - }, - }, - { - name: "with swap", - configure: func(config *api.Config) { - config.SwapAPI = ipcEndpoint - config.SwapEnabled = true - }, - check: func(t *testing.T, s *Swarm, _ *api.Config) { - if s.backend == nil { - t.Error("backend is nil") - } - }, - }, - { - name: "with swap disabled", - configure: func(config *api.Config) { - config.SwapAPI = ipcEndpoint - config.SwapEnabled = false - }, - check: func(t *testing.T, s *Swarm, _ *api.Config) { - if s.backend != nil { - t.Error("backend is not nil") - } - }, - }, - { - name: "with swap enabled and api endpoint blank", - configure: func(config *api.Config) { - config.SwapAPI = "" - config.SwapEnabled = true - }, - check: func(t *testing.T, s *Swarm, _ *api.Config) { - if s.backend != nil { - t.Error("backend is not nil") - } - }, - }, - { - name: "ens", - configure: func(config *api.Config) { - config.EnsAPIs = []string{ - "http://127.0.0.1:8888", - } - }, - check: func(t *testing.T, s *Swarm, _ *api.Config) { - if s.dns == nil { - t.Error("dns is not initialized") - } - }, - }, - } { - t.Run(tc.name, func(t *testing.T) { - config := api.NewConfig() - - dir, err := ioutil.TempDir("", "swarm") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - - config.Path = dir - - privkey, err := crypto.GenerateKey() - if err != nil { - t.Fatal(err) - } - - config.Init(privkey) - - if tc.configure != nil { - tc.configure(config) - } - - s, err := NewSwarm(config, nil) - if err != nil { - t.Fatal(err) - } - - if tc.check != nil { - tc.check(t, s, config) - } - }) - } -} - -func TestParseEnsAPIAddress(t *testing.T) { - for _, x := range []struct { - description string - value string - tld string - endpoint string - addr common.Address - }{ - { - description: "IPC endpoint", - value: "/data/testnet/geth.ipc", - endpoint: "/data/testnet/geth.ipc", - }, - { - description: "HTTP endpoint", - value: "http://127.0.0.1:1234", - endpoint: "http://127.0.0.1:1234", - }, - { - description: "WS endpoint", - value: "ws://127.0.0.1:1234", - endpoint: "ws://127.0.0.1:1234", - }, - { - description: "IPC Endpoint and TLD", - value: "test:/data/testnet/geth.ipc", - endpoint: "/data/testnet/geth.ipc", - tld: "test", - }, - { - description: "HTTP endpoint and TLD", - value: "test:http://127.0.0.1:1234", - endpoint: "http://127.0.0.1:1234", - tld: "test", - }, - { - description: "WS endpoint and TLD", - value: "test:ws://127.0.0.1:1234", - endpoint: "ws://127.0.0.1:1234", - tld: "test", - }, - { - description: "IPC Endpoint and contract address", - value: "314159265dD8dbb310642f98f50C066173C1259b@/data/testnet/geth.ipc", - endpoint: "/data/testnet/geth.ipc", - addr: common.HexToAddress("314159265dD8dbb310642f98f50C066173C1259b"), - }, - { - description: "HTTP endpoint and contract address", - value: "314159265dD8dbb310642f98f50C066173C1259b@http://127.0.0.1:1234", - endpoint: "http://127.0.0.1:1234", - addr: common.HexToAddress("314159265dD8dbb310642f98f50C066173C1259b"), - }, - { - description: "WS endpoint and contract address", - value: "314159265dD8dbb310642f98f50C066173C1259b@ws://127.0.0.1:1234", - endpoint: "ws://127.0.0.1:1234", - addr: common.HexToAddress("314159265dD8dbb310642f98f50C066173C1259b"), - }, - { - description: "IPC Endpoint, TLD and contract address", - value: "test:314159265dD8dbb310642f98f50C066173C1259b@/data/testnet/geth.ipc", - endpoint: "/data/testnet/geth.ipc", - addr: common.HexToAddress("314159265dD8dbb310642f98f50C066173C1259b"), - tld: "test", - }, - { - description: "HTTP endpoint, TLD and contract address", - value: "eth:314159265dD8dbb310642f98f50C066173C1259b@http://127.0.0.1:1234", - endpoint: "http://127.0.0.1:1234", - addr: common.HexToAddress("314159265dD8dbb310642f98f50C066173C1259b"), - tld: "eth", - }, - { - description: "WS endpoint, TLD and contract address", - value: "eth:314159265dD8dbb310642f98f50C066173C1259b@ws://127.0.0.1:1234", - endpoint: "ws://127.0.0.1:1234", - addr: common.HexToAddress("314159265dD8dbb310642f98f50C066173C1259b"), - tld: "eth", - }, - } { - t.Run(x.description, func(t *testing.T) { - tld, endpoint, addr := parseEnsAPIAddress(x.value) - if endpoint != x.endpoint { - t.Errorf("expected Endpoint %q, got %q", x.endpoint, endpoint) - } - if addr != x.addr { - t.Errorf("expected ContractAddress %q, got %q", x.addr.String(), addr.String()) - } - if tld != x.tld { - t.Errorf("expected TLD %q, got %q", x.tld, tld) - } - }) - } -} - -// TestLocalStoreAndRetrieve runs multiple tests where different size files are uploaded -// to a single Swarm instance using API Store and checked against the content returned -// by API Retrieve function. -// -// This test is intended to validate functionality of chunker store and join functions -// and their intergartion into Swarm, without comparing results with ones produced by -// another chunker implementation, as it is done in swarm/storage tests. -func TestLocalStoreAndRetrieve(t *testing.T) { - config := api.NewConfig() - - dir, err := ioutil.TempDir("", "node") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) - - config.Path = dir - - privkey, err := crypto.GenerateKey() - if err != nil { - t.Fatal(err) - } - - config.Init(privkey) - - swarm, err := NewSwarm(config, nil) - if err != nil { - t.Fatal(err) - } - - // by default, test only the lonely chunk cases - sizes := []int{1, 60, 4097, 524288 + 1, 7*524288 + 1} - - if *longrunning { - // test broader set of cases if -longruning flag is set - sizes = append(sizes, 83, 179, 253, 1024, 4095, 4096, 8191, 8192, 8193, 12287, 12288, 12289, 123456, 2345678, 67298391, 524288, 524288+4096, 524288+4097, 7*524288, 7*524288+4096, 7*524288+4097, 128*524288+1, 128*524288, 128*524288+4096, 128*524288+4097, 816778334) - } - for _, n := range sizes { - testLocalStoreAndRetrieve(t, swarm, n, true) - testLocalStoreAndRetrieve(t, swarm, n, false) - } -} - -// testLocalStoreAndRetrieve is using a single Swarm instance, to upload -// a file of length n with optional random data using API Store function, -// and checks the output of API Retrieve function on the same instance. -// This is a regression test for issue -// https://github.com/ethersphere/go-ethereum/issues/639 -// where pyramid chunker did not split correctly files with lengths that -// are edge cases for chunk and tree parameters, depending whether there -// is a tree chunk with only one data chunk and how the compress functionality -// changed the tree. -func testLocalStoreAndRetrieve(t *testing.T, swarm *Swarm, n int, randomData bool) { - slice := make([]byte, n) - if randomData { - rand.Seed(time.Now().UnixNano()) - rand.Read(slice) - } - dataPut := string(slice) - - ctx := context.TODO() - k, wait, err := swarm.api.Store(ctx, strings.NewReader(dataPut), int64(len(dataPut)), false) - if err != nil { - t.Fatal(err) - } - if wait != nil { - err = wait(ctx) - if err != nil { - t.Fatal(err) - } - } - - r, _ := swarm.api.Retrieve(context.TODO(), k) - - d, err := ioutil.ReadAll(r) - if err != nil { - t.Fatal(err) - } - dataGet := string(d) - - if len(dataPut) != len(dataGet) { - t.Fatalf("data not matched: length expected %v, got %v", len(dataPut), len(dataGet)) - } else { - if dataPut != dataGet { - t.Fatal("data not matched") - } - } -} diff --git a/swarm/testutil/file.go b/swarm/testutil/file.go deleted file mode 100644 index 70732aa92efe..000000000000 --- a/swarm/testutil/file.go +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright 2017 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package testutil - -import ( - "bytes" - "io" - "io/ioutil" - "math/rand" - "os" - "strings" - "testing" -) - -// TempFileWithContent is a helper function that creates a temp file that contains the following string content then closes the file handle -// it returns the complete file path -func TempFileWithContent(t *testing.T, content string) string { - tempFile, err := ioutil.TempFile("", "swarm-temp-file") - if err != nil { - t.Fatal(err) - } - - _, err = io.Copy(tempFile, strings.NewReader(content)) - if err != nil { - os.RemoveAll(tempFile.Name()) - t.Fatal(err) - } - if err = tempFile.Close(); err != nil { - t.Fatal(err) - } - return tempFile.Name() -} - -// RandomBytes returns pseudo-random deterministic result -// because test fails must be reproducible -func RandomBytes(seed, length int) []byte { - b := make([]byte, length) - reader := rand.New(rand.NewSource(int64(seed))) - for n := 0; n < length; { - read, err := reader.Read(b[n:]) - if err != nil { - panic(err) - } - n += read - } - return b -} - -func RandomReader(seed, length int) *bytes.Reader { - return bytes.NewReader(RandomBytes(seed, length)) -} diff --git a/swarm/tracing/tracing.go b/swarm/tracing/tracing.go deleted file mode 100644 index 9dcdbb4f1d1e..000000000000 --- a/swarm/tracing/tracing.go +++ /dev/null @@ -1,102 +0,0 @@ -package tracing - -import ( - "io" - "os" - "strings" - "time" - - "github.com/nebulaai/nbai-node/log" - jaeger "github.com/uber/jaeger-client-go" - jaegercfg "github.com/uber/jaeger-client-go/config" - cli "gopkg.in/urfave/cli.v1" -) - -var Enabled bool = false - -// TracingEnabledFlag is the CLI flag name to use to enable trace collections. -const TracingEnabledFlag = "tracing" - -var ( - Closer io.Closer -) - -var ( - TracingFlag = cli.BoolFlag{ - Name: TracingEnabledFlag, - Usage: "Enable tracing", - } - TracingEndpointFlag = cli.StringFlag{ - Name: "tracing.endpoint", - Usage: "Tracing endpoint", - Value: "0.0.0.0:6831", - } - TracingSvcFlag = cli.StringFlag{ - Name: "tracing.svc", - Usage: "Tracing service name", - Value: "swarm", - } -) - -// Flags holds all command-line flags required for tracing collection. -var Flags = []cli.Flag{ - TracingFlag, - TracingEndpointFlag, - TracingSvcFlag, -} - -// Init enables or disables the open tracing system. -func init() { - for _, arg := range os.Args { - if flag := strings.TrimLeft(arg, "-"); flag == TracingEnabledFlag { - Enabled = true - } - } -} - -func Setup(ctx *cli.Context) { - if Enabled { - log.Info("Enabling opentracing") - var ( - endpoint = ctx.GlobalString(TracingEndpointFlag.Name) - svc = ctx.GlobalString(TracingSvcFlag.Name) - ) - - Closer = initTracer(endpoint, svc) - } -} - -func initTracer(endpoint, svc string) (closer io.Closer) { - // Sample configuration for testing. Use constant sampling to sample every trace - // and enable LogSpan to log every span via configured Logger. - cfg := jaegercfg.Configuration{ - Sampler: &jaegercfg.SamplerConfig{ - Type: jaeger.SamplerTypeConst, - Param: 1, - }, - Reporter: &jaegercfg.ReporterConfig{ - LogSpans: true, - BufferFlushInterval: 1 * time.Second, - LocalAgentHostPort: endpoint, - }, - } - - // Example logger and metrics factory. Use github.com/uber/jaeger-client-go/log - // and github.com/uber/jaeger-lib/metrics respectively to bind to real logging and metrics - // frameworks. - //jLogger := jaegerlog.StdLogger - //jMetricsFactory := metrics.NullFactory - - // Initialize tracer with a logger and a metrics factory - closer, err := cfg.InitGlobalTracer( - svc, - //jaegercfg.Logger(jLogger), - //jaegercfg.Metrics(jMetricsFactory), - //jaegercfg.Observer(rpcmetrics.NewObserver(jMetricsFactory, rpcmetrics.DefaultNameNormalizer)), - ) - if err != nil { - log.Error("Could not initialize Jaeger tracer", "err", err) - } - - return closer -} diff --git a/swarm/version/version.go b/swarm/version/version.go deleted file mode 100644 index 831080eb8b8a..000000000000 --- a/swarm/version/version.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2018 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 version - -import ( - "fmt" -) - -const ( - VersionMajor = 0 // Major version component of the current release - VersionMinor = 3 // Minor version component of the current release - VersionPatch = 9 // Patch version component of the current release - VersionMeta = "stable" // Version metadata to append to the version string -) - -// Version holds the textual version string. -var Version = func() string { - return fmt.Sprintf("%d.%d.%d", VersionMajor, VersionMinor, VersionPatch) -}() - -// VersionWithMeta holds the textual version string including the metadata. -var VersionWithMeta = func() string { - v := Version - if VersionMeta != "" { - v += "-" + VersionMeta - } - return v -}() - -// ArchiveVersion holds the textual version string used for Swarm archives. -// e.g. "0.3.0-dea1ce05" for stable releases, or -// "0.3.1-unstable-21c059b6" for unstable releases -func ArchiveVersion(gitCommit string) string { - vsn := Version - if VersionMeta != "stable" { - vsn += "-" + VersionMeta - } - if len(gitCommit) >= 8 { - vsn += "-" + gitCommit[:8] - } - return vsn -} - -func VersionWithCommit(gitCommit string) string { - vsn := Version - if len(gitCommit) >= 8 { - vsn += "-" + gitCommit[:8] - } - return vsn -} diff --git a/tests/block_test.go b/tests/block_test.go index 711a3f8695b7..3a55e4c34fba 100644 --- a/tests/block_test.go +++ b/tests/block_test.go @@ -26,27 +26,31 @@ func TestBlockchain(t *testing.T) { bt := new(testMatcher) // 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(`^bcForgedTest/bcForkUncle\.json`) - bt.skipLoad(`^bcMultiChainTest/(ChainAtoChainB_blockorder|CallContractFromNotBestBlock)`) - bt.skipLoad(`^bcTotalDifficultyTest/(lotsOfLeafs|lotsOfBranches|sideChainWithMoreTransactions)`) + // Skip random failures due to selfish mining test + bt.skipLoad(`.*bcForgedTest/bcForkUncle\.json`) + // Slow tests - bt.slow(`^bcExploitTest/DelegateCallSpam.json`) - bt.slow(`^bcExploitTest/ShanghaiLove.json`) - bt.slow(`^bcExploitTest/SuicideIssue.json`) - bt.slow(`^bcForkStressTest/`) - bt.slow(`^bcGasPricerTest/RPC_API_Test.json`) - bt.slow(`^bcWalletTest/`) - - // Still failing tests that we need to look into - //bt.fails(`^bcStateTests/suicideThenCheckBalance.json/suicideThenCheckBalance_Constantinople`, "TODO: investigate") - //bt.fails(`^bcStateTests/suicideStorageCheckVCreate2.json/suicideStorageCheckVCreate2_Constantinople`, "TODO: investigate") - //bt.fails(`^bcStateTests/suicideStorageCheckVCreate.json/suicideStorageCheckVCreate_Constantinople`, "TODO: investigate") - //bt.fails(`^bcStateTests/suicideStorageCheck.json/suicideStorageCheck_Constantinople`, "TODO: investigate") + bt.slow(`.*bcExploitTest/DelegateCallSpam.json`) + bt.slow(`.*bcExploitTest/ShanghaiLove.json`) + bt.slow(`.*bcExploitTest/SuicideIssue.json`) + bt.slow(`.*/bcForkStressTest/`) + bt.slow(`.*/bcGasPricerTest/RPC_API_Test.json`) + bt.slow(`.*/bcWalletTest/`) + + // Very slow test + bt.skipLoad(`.*/stTimeConsuming/.*`) + + // test takes a lot for time and goes easily OOM because of sha3 calculation on a huge range, + // using 4.6 TGas + bt.skipLoad(`.*randomStatetest94.json.*`) bt.walk(t, blockTestDir, func(t *testing.T, name string, test *BlockTest) { if err := bt.checkFailure(t, name, test.Run()); err != nil { t.Error(err) } }) + + // There is also a LegacyTests folder, containing blockchain tests generated + // prior to Istanbul. However, they are all derived from GeneralStateTests, + // which run natively, so there's no reason to run them here. } diff --git a/tests/block_test_util.go b/tests/block_test_util.go index 4aa8a12061ac..b5f1de3efc6e 100644 --- a/tests/block_test_util.go +++ b/tests/block_test_util.go @@ -24,18 +24,18 @@ import ( "fmt" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/consensus" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" ) // A BlockTest checks handling of entire blocks. @@ -82,7 +82,7 @@ type btHeader struct { Difficulty *big.Int GasLimit uint64 GasUsed uint64 - Timestamp *big.Int + Timestamp uint64 } type btHeaderMarshaling struct { @@ -91,7 +91,7 @@ type btHeaderMarshaling struct { Difficulty *math.HexOrDecimal256 GasLimit math.HexOrDecimal64 GasUsed math.HexOrDecimal64 - Timestamp *math.HexOrDecimal256 + Timestamp math.HexOrDecimal64 } func (t *BlockTest) Run() error { @@ -101,7 +101,7 @@ func (t *BlockTest) Run() error { } // import pre accounts & construct test genesis block & state root - db := ethdb.NewMemDatabase() + db := rawdb.NewMemoryDatabase() gblock, err := t.genesis(config).Commit(db) if err != nil { return err @@ -146,7 +146,7 @@ func (t *BlockTest) genesis(config *params.ChainConfig) *core.Genesis { return &core.Genesis{ Config: config, Nonce: t.json.Genesis.Nonce.Uint64(), - Timestamp: t.json.Genesis.Timestamp.Uint64(), + Timestamp: t.json.Genesis.Timestamp, ParentHash: t.json.Genesis.ParentHash, ExtraData: t.json.Genesis.ExtraData, GasLimit: t.json.Genesis.GasLimit, @@ -179,7 +179,7 @@ func (t *BlockTest) insertBlocks(blockchain *core.BlockChain) ([]btBlock, error) if b.BlockHeader == nil { continue // OK - block is supposed to be invalid, continue with next block } else { - return nil, fmt.Errorf("Block RLP decoding failed when expected to succeed: %v", err) + return nil, fmt.Errorf("block RLP decoding failed when expected to succeed: %v", err) } } // RLP decoding worked, try to insert into chain: @@ -189,16 +189,16 @@ func (t *BlockTest) insertBlocks(blockchain *core.BlockChain) ([]btBlock, error) if b.BlockHeader == nil { continue // OK - block is supposed to be invalid, continue with next block } else { - return nil, fmt.Errorf("Block #%v insertion into chain failed: %v", blocks[i].Number(), err) + return nil, fmt.Errorf("block #%v insertion into chain failed: %v", blocks[i].Number(), err) } } if b.BlockHeader == nil { - return nil, fmt.Errorf("Block insertion should have failed") + return nil, fmt.Errorf("block insertion should have failed") } // validate RLP decoding by checking all values against test file JSON if err = validateHeader(b.BlockHeader, cb.Header()); err != nil { - return nil, fmt.Errorf("Deserialised block header validation failed: %v", err) + return nil, fmt.Errorf("deserialised block header validation failed: %v", err) } validBlocks = append(validBlocks, b) } @@ -207,49 +207,49 @@ func (t *BlockTest) insertBlocks(blockchain *core.BlockChain) ([]btBlock, error) func validateHeader(h *btHeader, h2 *types.Header) error { if h.Bloom != h2.Bloom { - return fmt.Errorf("Bloom: want: %x have: %x", h.Bloom, h2.Bloom) + return fmt.Errorf("bloom: want: %x have: %x", h.Bloom, h2.Bloom) } if h.Coinbase != h2.Coinbase { - return fmt.Errorf("Coinbase: want: %x have: %x", h.Coinbase, h2.Coinbase) + return fmt.Errorf("coinbase: want: %x have: %x", h.Coinbase, h2.Coinbase) } if h.MixHash != h2.MixDigest { return fmt.Errorf("MixHash: want: %x have: %x", h.MixHash, h2.MixDigest) } if h.Nonce != h2.Nonce { - return fmt.Errorf("Nonce: want: %x have: %x", h.Nonce, h2.Nonce) + return fmt.Errorf("nonce: want: %x have: %x", h.Nonce, h2.Nonce) } if h.Number.Cmp(h2.Number) != 0 { - return fmt.Errorf("Number: want: %v have: %v", h.Number, h2.Number) + return fmt.Errorf("number: want: %v have: %v", h.Number, h2.Number) } if h.ParentHash != h2.ParentHash { - return fmt.Errorf("Parent hash: want: %x have: %x", h.ParentHash, h2.ParentHash) + return fmt.Errorf("parent hash: want: %x have: %x", h.ParentHash, h2.ParentHash) } if h.ReceiptTrie != h2.ReceiptHash { - return fmt.Errorf("Receipt hash: want: %x have: %x", h.ReceiptTrie, h2.ReceiptHash) + return fmt.Errorf("receipt hash: want: %x have: %x", h.ReceiptTrie, h2.ReceiptHash) } if h.TransactionsTrie != h2.TxHash { - return fmt.Errorf("Tx hash: want: %x have: %x", h.TransactionsTrie, h2.TxHash) + return fmt.Errorf("tx hash: want: %x have: %x", h.TransactionsTrie, h2.TxHash) } if h.StateRoot != h2.Root { - return fmt.Errorf("State hash: want: %x have: %x", h.StateRoot, h2.Root) + return fmt.Errorf("state hash: want: %x have: %x", h.StateRoot, h2.Root) } if h.UncleHash != h2.UncleHash { - return fmt.Errorf("Uncle hash: want: %x have: %x", h.UncleHash, h2.UncleHash) + return fmt.Errorf("uncle hash: want: %x have: %x", h.UncleHash, h2.UncleHash) } if !bytes.Equal(h.ExtraData, h2.Extra) { - return fmt.Errorf("Extra data: want: %x have: %x", h.ExtraData, h2.Extra) + return fmt.Errorf("extra data: want: %x have: %x", h.ExtraData, h2.Extra) } if h.Difficulty.Cmp(h2.Difficulty) != 0 { - return fmt.Errorf("Difficulty: want: %v have: %v", h.Difficulty, h2.Difficulty) + return fmt.Errorf("difficulty: want: %v have: %v", h.Difficulty, h2.Difficulty) } if h.GasLimit != h2.GasLimit { - return fmt.Errorf("GasLimit: want: %d have: %d", h.GasLimit, h2.GasLimit) + return fmt.Errorf("gasLimit: want: %d have: %d", h.GasLimit, h2.GasLimit) } if h.GasUsed != h2.GasUsed { - return fmt.Errorf("GasUsed: want: %d have: %d", h.GasUsed, h2.GasUsed) + return fmt.Errorf("gasUsed: want: %d have: %d", h.GasUsed, h2.GasUsed) } - if h.Timestamp.Cmp(h2.Time) != 0 { - return fmt.Errorf("Timestamp: want: %v have: %v", h.Timestamp, h2.Time) + if h.Timestamp != h2.Time { + return fmt.Errorf("timestamp: want: %v have: %v", h.Timestamp, h2.Time) } return nil } @@ -287,7 +287,7 @@ func (t *BlockTest) validateImportedHeaders(cm *core.BlockChain, validBlocks []b // be part of the longest chain until last block is imported. for b := cm.CurrentBlock(); b != nil && b.NumberU64() != 0; b = cm.GetBlockByHash(b.Header().ParentHash) { if err := validateHeader(bmap[b.Hash()].BlockHeader, b.Header()); err != nil { - return fmt.Errorf("Imported block header validation failed: %v", err) + return fmt.Errorf("imported block header validation failed: %v", err) } } return nil diff --git a/tests/difficulty_test.go b/tests/difficulty_test.go index b957a22a52ba..fde9db3ad4d3 100644 --- a/tests/difficulty_test.go +++ b/tests/difficulty_test.go @@ -20,8 +20,8 @@ import ( "math/big" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/params" ) var ( diff --git a/tests/difficulty_test_util.go b/tests/difficulty_test_util.go index a1a5c31fb655..fe6e90b027f2 100644 --- a/tests/difficulty_test_util.go +++ b/tests/difficulty_test_util.go @@ -20,28 +20,28 @@ import ( "fmt" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/consensus/ethash" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/consensus/ethash" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" ) //go:generate gencodec -type DifficultyTest -field-override difficultyTestMarshaling -out gen_difficultytest.go type DifficultyTest struct { - ParentTimestamp *big.Int `json:"parentTimestamp"` + ParentTimestamp uint64 `json:"parentTimestamp"` ParentDifficulty *big.Int `json:"parentDifficulty"` UncleHash common.Hash `json:"parentUncles"` - CurrentTimestamp *big.Int `json:"currentTimestamp"` + CurrentTimestamp uint64 `json:"currentTimestamp"` CurrentBlockNumber uint64 `json:"currentBlockNumber"` CurrentDifficulty *big.Int `json:"currentDifficulty"` } type difficultyTestMarshaling struct { - ParentTimestamp *math.HexOrDecimal256 + ParentTimestamp math.HexOrDecimal64 ParentDifficulty *math.HexOrDecimal256 - CurrentTimestamp *math.HexOrDecimal256 + CurrentTimestamp math.HexOrDecimal64 CurrentDifficulty *math.HexOrDecimal256 UncleHash common.Hash CurrentBlockNumber math.HexOrDecimal64 @@ -56,7 +56,7 @@ func (test *DifficultyTest) Run(config *params.ChainConfig) error { UncleHash: test.UncleHash, } - actual := ethash.CalcDifficulty(config, test.CurrentTimestamp.Uint64(), parent) + actual := ethash.CalcDifficulty(config, test.CurrentTimestamp, parent) exp := test.CurrentDifficulty if actual.Cmp(exp) != 0 { diff --git a/tests/gen_btheader.go b/tests/gen_btheader.go index 8440a40aa397..f2e086a7b3be 100644 --- a/tests/gen_btheader.go +++ b/tests/gen_btheader.go @@ -6,14 +6,15 @@ import ( "encoding/json" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/core/types" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core/types" ) var _ = (*btHeaderMarshaling)(nil) +// MarshalJSON marshals as JSON. func (b btHeader) MarshalJSON() ([]byte, error) { type btHeader struct { Bloom types.Bloom @@ -31,7 +32,7 @@ func (b btHeader) MarshalJSON() ([]byte, error) { Difficulty *math.HexOrDecimal256 GasLimit math.HexOrDecimal64 GasUsed math.HexOrDecimal64 - Timestamp *math.HexOrDecimal256 + Timestamp math.HexOrDecimal64 } var enc btHeader enc.Bloom = b.Bloom @@ -49,10 +50,11 @@ func (b btHeader) MarshalJSON() ([]byte, error) { enc.Difficulty = (*math.HexOrDecimal256)(b.Difficulty) enc.GasLimit = math.HexOrDecimal64(b.GasLimit) enc.GasUsed = math.HexOrDecimal64(b.GasUsed) - enc.Timestamp = (*math.HexOrDecimal256)(b.Timestamp) + enc.Timestamp = math.HexOrDecimal64(b.Timestamp) return json.Marshal(&enc) } +// UnmarshalJSON unmarshals from JSON. func (b *btHeader) UnmarshalJSON(input []byte) error { type btHeader struct { Bloom *types.Bloom @@ -70,7 +72,7 @@ func (b *btHeader) UnmarshalJSON(input []byte) error { Difficulty *math.HexOrDecimal256 GasLimit *math.HexOrDecimal64 GasUsed *math.HexOrDecimal64 - Timestamp *math.HexOrDecimal256 + Timestamp *math.HexOrDecimal64 } var dec btHeader if err := json.Unmarshal(input, &dec); err != nil { @@ -122,7 +124,7 @@ func (b *btHeader) UnmarshalJSON(input []byte) error { b.GasUsed = uint64(*dec.GasUsed) } if dec.Timestamp != nil { - b.Timestamp = (*big.Int)(dec.Timestamp) + b.Timestamp = uint64(*dec.Timestamp) } return nil } diff --git a/tests/gen_difficultytest.go b/tests/gen_difficultytest.go index 3b4839aefd51..cd15ae31b5d3 100644 --- a/tests/gen_difficultytest.go +++ b/tests/gen_difficultytest.go @@ -6,37 +6,39 @@ import ( "encoding/json" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" ) var _ = (*difficultyTestMarshaling)(nil) +// MarshalJSON marshals as JSON. func (d DifficultyTest) MarshalJSON() ([]byte, error) { type DifficultyTest struct { - ParentTimestamp *math.HexOrDecimal256 `json:"parentTimestamp"` + ParentTimestamp math.HexOrDecimal64 `json:"parentTimestamp"` ParentDifficulty *math.HexOrDecimal256 `json:"parentDifficulty"` UncleHash common.Hash `json:"parentUncles"` - CurrentTimestamp *math.HexOrDecimal256 `json:"currentTimestamp"` + CurrentTimestamp math.HexOrDecimal64 `json:"currentTimestamp"` CurrentBlockNumber math.HexOrDecimal64 `json:"currentBlockNumber"` CurrentDifficulty *math.HexOrDecimal256 `json:"currentDifficulty"` } var enc DifficultyTest - enc.ParentTimestamp = (*math.HexOrDecimal256)(d.ParentTimestamp) + enc.ParentTimestamp = math.HexOrDecimal64(d.ParentTimestamp) enc.ParentDifficulty = (*math.HexOrDecimal256)(d.ParentDifficulty) enc.UncleHash = d.UncleHash - enc.CurrentTimestamp = (*math.HexOrDecimal256)(d.CurrentTimestamp) + enc.CurrentTimestamp = math.HexOrDecimal64(d.CurrentTimestamp) enc.CurrentBlockNumber = math.HexOrDecimal64(d.CurrentBlockNumber) enc.CurrentDifficulty = (*math.HexOrDecimal256)(d.CurrentDifficulty) return json.Marshal(&enc) } +// UnmarshalJSON unmarshals from JSON. func (d *DifficultyTest) UnmarshalJSON(input []byte) error { type DifficultyTest struct { - ParentTimestamp *math.HexOrDecimal256 `json:"parentTimestamp"` + ParentTimestamp *math.HexOrDecimal64 `json:"parentTimestamp"` ParentDifficulty *math.HexOrDecimal256 `json:"parentDifficulty"` UncleHash *common.Hash `json:"parentUncles"` - CurrentTimestamp *math.HexOrDecimal256 `json:"currentTimestamp"` + CurrentTimestamp *math.HexOrDecimal64 `json:"currentTimestamp"` CurrentBlockNumber *math.HexOrDecimal64 `json:"currentBlockNumber"` CurrentDifficulty *math.HexOrDecimal256 `json:"currentDifficulty"` } @@ -45,7 +47,7 @@ func (d *DifficultyTest) UnmarshalJSON(input []byte) error { return err } if dec.ParentTimestamp != nil { - d.ParentTimestamp = (*big.Int)(dec.ParentTimestamp) + d.ParentTimestamp = uint64(*dec.ParentTimestamp) } if dec.ParentDifficulty != nil { d.ParentDifficulty = (*big.Int)(dec.ParentDifficulty) @@ -54,7 +56,7 @@ func (d *DifficultyTest) UnmarshalJSON(input []byte) error { d.UncleHash = *dec.UncleHash } if dec.CurrentTimestamp != nil { - d.CurrentTimestamp = (*big.Int)(dec.CurrentTimestamp) + d.CurrentTimestamp = uint64(*dec.CurrentTimestamp) } if dec.CurrentBlockNumber != nil { d.CurrentBlockNumber = uint64(*dec.CurrentBlockNumber) diff --git a/tests/gen_stenv.go b/tests/gen_stenv.go index 43d695716e27..1d4baf2fd79c 100644 --- a/tests/gen_stenv.go +++ b/tests/gen_stenv.go @@ -7,8 +7,8 @@ import ( "errors" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/math" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" ) var _ = (*stEnvMarshaling)(nil) diff --git a/tests/gen_sttransaction.go b/tests/gen_sttransaction.go index a38bae4e19a1..451ffcbf43a1 100644 --- a/tests/gen_sttransaction.go +++ b/tests/gen_sttransaction.go @@ -6,8 +6,8 @@ import ( "encoding/json" "math/big" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" ) var _ = (*stTransactionMarshaling)(nil) diff --git a/tests/gen_tttransaction.go b/tests/gen_tttransaction.go deleted file mode 100644 index 1219518c0474..000000000000 --- a/tests/gen_tttransaction.go +++ /dev/null @@ -1,95 +0,0 @@ -// Code generated by github.com/fjl/gencodec. DO NOT EDIT. - -package tests - -import ( - "encoding/json" - "errors" - "math/big" - - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" -) - -var _ = (*ttTransactionMarshaling)(nil) - -func (t ttTransaction) MarshalJSON() ([]byte, error) { - type ttTransaction struct { - Data hexutil.Bytes `gencodec:"required"` - GasLimit math.HexOrDecimal64 `gencodec:"required"` - GasPrice *math.HexOrDecimal256 `gencodec:"required"` - Nonce math.HexOrDecimal64 `gencodec:"required"` - Value *math.HexOrDecimal256 `gencodec:"required"` - R *math.HexOrDecimal256 `gencodec:"required"` - S *math.HexOrDecimal256 `gencodec:"required"` - V *math.HexOrDecimal256 `gencodec:"required"` - To common.Address `gencodec:"required"` - } - var enc ttTransaction - enc.Data = t.Data - enc.GasLimit = math.HexOrDecimal64(t.GasLimit) - enc.GasPrice = (*math.HexOrDecimal256)(t.GasPrice) - enc.Nonce = math.HexOrDecimal64(t.Nonce) - enc.Value = (*math.HexOrDecimal256)(t.Value) - enc.R = (*math.HexOrDecimal256)(t.R) - enc.S = (*math.HexOrDecimal256)(t.S) - enc.V = (*math.HexOrDecimal256)(t.V) - enc.To = t.To - return json.Marshal(&enc) -} - -func (t *ttTransaction) UnmarshalJSON(input []byte) error { - type ttTransaction struct { - Data *hexutil.Bytes `gencodec:"required"` - GasLimit *math.HexOrDecimal64 `gencodec:"required"` - GasPrice *math.HexOrDecimal256 `gencodec:"required"` - Nonce *math.HexOrDecimal64 `gencodec:"required"` - Value *math.HexOrDecimal256 `gencodec:"required"` - R *math.HexOrDecimal256 `gencodec:"required"` - S *math.HexOrDecimal256 `gencodec:"required"` - V *math.HexOrDecimal256 `gencodec:"required"` - To *common.Address `gencodec:"required"` - } - var dec ttTransaction - if err := json.Unmarshal(input, &dec); err != nil { - return err - } - if dec.Data == nil { - return errors.New("missing required field 'data' for ttTransaction") - } - t.Data = *dec.Data - if dec.GasLimit == nil { - return errors.New("missing required field 'gasLimit' for ttTransaction") - } - t.GasLimit = uint64(*dec.GasLimit) - if dec.GasPrice == nil { - return errors.New("missing required field 'gasPrice' for ttTransaction") - } - t.GasPrice = (*big.Int)(dec.GasPrice) - if dec.Nonce == nil { - return errors.New("missing required field 'nonce' for ttTransaction") - } - t.Nonce = uint64(*dec.Nonce) - if dec.Value == nil { - return errors.New("missing required field 'value' for ttTransaction") - } - t.Value = (*big.Int)(dec.Value) - if dec.R == nil { - return errors.New("missing required field 'r' for ttTransaction") - } - t.R = (*big.Int)(dec.R) - if dec.S == nil { - return errors.New("missing required field 's' for ttTransaction") - } - t.S = (*big.Int)(dec.S) - if dec.V == nil { - return errors.New("missing required field 'v' for ttTransaction") - } - t.V = (*big.Int)(dec.V) - if dec.To == nil { - return errors.New("missing required field 'to' for ttTransaction") - } - t.To = *dec.To - return nil -} diff --git a/tests/gen_vmexec.go b/tests/gen_vmexec.go index f8ae025f2017..a5f01cf45695 100644 --- a/tests/gen_vmexec.go +++ b/tests/gen_vmexec.go @@ -7,9 +7,9 @@ import ( "errors" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" ) var _ = (*vmExecMarshaling)(nil) diff --git a/tests/init.go b/tests/init.go index 24b61ea9b95c..a18e12bdd2d0 100644 --- a/tests/init.go +++ b/tests/init.go @@ -20,7 +20,7 @@ import ( "fmt" "math/big" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/params" ) // Forks table defines supported forks and their chain config. @@ -62,6 +62,30 @@ var Forks = map[string]*params.ChainConfig{ DAOForkBlock: big.NewInt(0), ByzantiumBlock: big.NewInt(0), ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(10000000), + }, + "ConstantinopleFix": { + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + DAOForkBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + }, + "Istanbul": { + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + DAOForkBlock: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(0), }, "FrontierToHomesteadAt5": { ChainID: big.NewInt(1), @@ -95,6 +119,27 @@ var Forks = map[string]*params.ChainConfig{ ByzantiumBlock: big.NewInt(0), ConstantinopleBlock: big.NewInt(5), }, + "ByzantiumToConstantinopleFixAt5": { + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(5), + PetersburgBlock: big.NewInt(5), + }, + "ConstantinopleFixToIstanbulAt5": { + ChainID: big.NewInt(1), + HomesteadBlock: big.NewInt(0), + EIP150Block: big.NewInt(0), + EIP155Block: big.NewInt(0), + EIP158Block: big.NewInt(0), + ByzantiumBlock: big.NewInt(0), + ConstantinopleBlock: big.NewInt(0), + PetersburgBlock: big.NewInt(0), + IstanbulBlock: big.NewInt(5), + }, } // UnsupportedForkError is returned when a test requests a fork that isn't implemented. diff --git a/tests/init_test.go b/tests/init_test.go index 6a2558c5fe67..5af3e44bff96 100644 --- a/tests/init_test.go +++ b/tests/init_test.go @@ -18,6 +18,7 @@ package tests import ( "encoding/json" + "flag" "fmt" "io" "io/ioutil" @@ -30,13 +31,25 @@ import ( "strings" "testing" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/params" ) +// Command line flags to configure the interpreters. +var ( + testEVM = flag.String("vm.evm", "", "EVM configuration") + testEWASM = flag.String("vm.ewasm", "", "EWASM configuration") +) + +func TestMain(m *testing.M) { + flag.Parse() + os.Exit(m.Run()) +} + var ( baseDir = filepath.Join(".", "testdata") blockTestDir = filepath.Join(baseDir, "BlockchainTests") stateTestDir = filepath.Join(baseDir, "GeneralStateTests") + legacyStateTestDir = filepath.Join(baseDir, "LegacyTests", "Constantinople", "GeneralStateTests") transactionTestDir = filepath.Join(baseDir, "TransactionTests") vmTestDir = filepath.Join(baseDir, "VMTests") rlpTestDir = filepath.Join(baseDir, "RLPTests") @@ -276,3 +289,14 @@ func runTestFunc(runTest interface{}, t *testing.T, name string, m reflect.Value m.MapIndex(reflect.ValueOf(key)), }) } + +func TestMatcherWhitelist(t *testing.T) { + t.Parallel() + tm := new(testMatcher) + tm.whitelist("invalid*") + tm.walk(t, rlpTestDir, func(t *testing.T, name string, test *RLPTest) { + if name[:len("invalidRLPTest.json")] != "invalidRLPTest.json" { + t.Fatalf("invalid test found: %s != invalidRLPTest.json", name) + } + }) +} diff --git a/tests/rlp_test_util.go b/tests/rlp_test_util.go index 123edc113023..9069ec55a15d 100644 --- a/tests/rlp_test_util.go +++ b/tests/rlp_test_util.go @@ -24,7 +24,7 @@ import ( "math/big" "strings" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/rlp" ) // RLPTest is the JSON structure of a single RLP test. @@ -42,9 +42,22 @@ type RLPTest struct { Out string } +// FromHex returns the bytes represented by the hexadecimal string s. +// s may be prefixed with "0x". +// This is copy-pasted from bytes.go, which does not return the error +func FromHex(s string) ([]byte, error) { + if len(s) > 1 && (s[0:2] == "0x" || s[0:2] == "0X") { + s = s[2:] + } + if len(s)%2 == 1 { + s = "0" + s + } + return hex.DecodeString(s) +} + // Run executes the test. func (t *RLPTest) Run() error { - outb, err := hex.DecodeString(t.Out) + outb, err := FromHex(t.Out) if err != nil { return fmt.Errorf("invalid hex in Out") } diff --git a/tests/solidity/bytecode.js b/tests/solidity/bytecode.js new file mode 100644 index 000000000000..8796aabfa32b --- /dev/null +++ b/tests/solidity/bytecode.js @@ -0,0 +1,6 @@ +{ + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b5061001961007a565b604051809103906000f080158015610035573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061008a565b60405161015f8061055c83390190565b6104c3806100996000396000f3fe60806040526004361061005c576000357c01000000000000000000000000000000000000000000000000000000009004806355313dea146100615780636d3d141614610078578063b9d1e5aa1461008f578063f8a8fd6d146100a6575b600080fd5b34801561006d57600080fd5b506100766100bd565b005b34801561008457600080fd5b5061008d6100bf565b005b34801561009b57600080fd5b506100a46100c4565b005b3480156100b257600080fd5b506100bb6100c6565b005b005b600080fd5bfe5b600160021a6002f35b60058110156100e3576001810190506100cf565b5060065b60058111156100fb576001810190506100e7565b5060015b6005811215610113576001810190506100ff565b5060065b600581131561012b57600181019050610117565b5060021561013857600051505b60405160208101602060048337505060405160208101602060048339505060405160208101602060048360003c50503660005b81811015610182576002815260018101905061016b565b505060008020506000602060403e6010608060106040610123612710fa506020610123600af05060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600060405180807f697353616d654164647265737328616464726573732c61646472657373290000815250601e01905060405180910390209050600033905060405182815281600482015281602482015260648101604052602081604483600088611388f1505060405182815281600482015281602482015260648101604052602081604483600088611388f250506040518281528160048201528160248201526064810160405260208160448387611388f4505060006242004290507f50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb206001026040518082815260200191505060405180910390a07f50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb206001027f50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb206001026040518082815260200191505060405180910390a13373ffffffffffffffffffffffffffffffffffffffff166001027f50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb206001027f50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb206001026040518082815260200191505060405180910390a2806001023373ffffffffffffffffffffffffffffffffffffffff166001027f50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb206001027f50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb206001026040518082815260200191505060405180910390a380600102816001023373ffffffffffffffffffffffffffffffffffffffff166001027f50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb206001027f50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb206001026040518082815260200191505060405180910390a46002fffea165627a7a723058200e51baa2b454b47fdf0ef596fa24aff8ed3a3727b7481ebd25349182ce7152a30029608060405234801561001057600080fd5b5061013f806100206000396000f3fe60806040526004361061003b576000357c010000000000000000000000000000000000000000000000000000000090048063161e715014610040575b600080fd5b34801561004c57600080fd5b506100af6004803603604081101561006357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506100c9565b604051808215151515815260200191505060405180910390f35b60008173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610108576001905061010d565b600090505b9291505056fea165627a7a72305820358f67a58c115ea636b0b8e5c4ca7a52b8192d0f3fa98a4434d6ea04596b5d0d0029", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x19 PUSH2 0x7A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 PUSH1 0x0 CREATE DUP1 ISZERO DUP1 ISZERO PUSH2 0x35 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH2 0x8A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x15F DUP1 PUSH2 0x55C DUP4 CODECOPY ADD SWAP1 JUMP JUMPDEST PUSH2 0x4C3 DUP1 PUSH2 0x99 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x5C JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV DUP1 PUSH4 0x55313DEA EQ PUSH2 0x61 JUMPI DUP1 PUSH4 0x6D3D1416 EQ PUSH2 0x78 JUMPI DUP1 PUSH4 0xB9D1E5AA EQ PUSH2 0x8F JUMPI DUP1 PUSH4 0xF8A8FD6D EQ PUSH2 0xA6 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x6D JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x76 PUSH2 0xBD JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x84 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x8D PUSH2 0xBF JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x9B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xA4 PUSH2 0xC4 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xB2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xBB PUSH2 0xC6 JUMP JUMPDEST STOP JUMPDEST STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST INVALID JUMPDEST PUSH1 0x1 PUSH1 0x2 BYTE PUSH1 0x2 RETURN JUMPDEST PUSH1 0x5 DUP2 LT ISZERO PUSH2 0xE3 JUMPI PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0xCF JUMP JUMPDEST POP PUSH1 0x6 JUMPDEST PUSH1 0x5 DUP2 GT ISZERO PUSH2 0xFB JUMPI PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0xE7 JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST PUSH1 0x5 DUP2 SLT ISZERO PUSH2 0x113 JUMPI PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0xFF JUMP JUMPDEST POP PUSH1 0x6 JUMPDEST PUSH1 0x5 DUP2 SGT ISZERO PUSH2 0x12B JUMPI PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x117 JUMP JUMPDEST POP PUSH1 0x2 ISZERO PUSH2 0x138 JUMPI PUSH1 0x0 MLOAD POP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD PUSH1 0x20 PUSH1 0x4 DUP4 CALLDATACOPY POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD PUSH1 0x20 PUSH1 0x4 DUP4 CODECOPY POP POP PUSH1 0x40 MLOAD PUSH1 0x20 DUP2 ADD PUSH1 0x20 PUSH1 0x4 DUP4 PUSH1 0x0 EXTCODECOPY POP POP CALLDATASIZE PUSH1 0x0 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x182 JUMPI PUSH1 0x2 DUP2 MSTORE PUSH1 0x1 DUP2 ADD SWAP1 POP PUSH2 0x16B JUMP JUMPDEST POP POP PUSH1 0x0 DUP1 KECCAK256 POP PUSH1 0x0 PUSH1 0x20 PUSH1 0x40 RETURNDATACOPY PUSH1 0x10 PUSH1 0x80 PUSH1 0x10 PUSH1 0x40 PUSH2 0x123 PUSH2 0x2710 STATICCALL POP PUSH1 0x20 PUSH2 0x123 PUSH1 0xA CREATE POP PUSH1 0x0 DUP1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP1 PUSH32 0x697353616D654164647265737328616464726573732C61646472657373290000 DUP2 MSTORE POP PUSH1 0x1E ADD SWAP1 POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 KECCAK256 SWAP1 POP PUSH1 0x0 CALLER SWAP1 POP PUSH1 0x40 MLOAD DUP3 DUP2 MSTORE DUP2 PUSH1 0x4 DUP3 ADD MSTORE DUP2 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x20 DUP2 PUSH1 0x44 DUP4 PUSH1 0x0 DUP9 PUSH2 0x1388 CALL POP POP PUSH1 0x40 MLOAD DUP3 DUP2 MSTORE DUP2 PUSH1 0x4 DUP3 ADD MSTORE DUP2 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x20 DUP2 PUSH1 0x44 DUP4 PUSH1 0x0 DUP9 PUSH2 0x1388 CALLCODE POP POP PUSH1 0x40 MLOAD DUP3 DUP2 MSTORE DUP2 PUSH1 0x4 DUP3 ADD MSTORE DUP2 PUSH1 0x24 DUP3 ADD MSTORE PUSH1 0x64 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x20 DUP2 PUSH1 0x44 DUP4 DUP8 PUSH2 0x1388 DELEGATECALL POP POP PUSH1 0x0 PUSH3 0x420042 SWAP1 POP PUSH32 0x50CB9FE53DAA9737B786AB3646F04D0150DC50EF4E75F59509D83667AD5ADB20 PUSH1 0x1 MUL PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG0 PUSH32 0x50CB9FE53DAA9737B786AB3646F04D0150DC50EF4E75F59509D83667AD5ADB20 PUSH1 0x1 MUL PUSH32 0x50CB9FE53DAA9737B786AB3646F04D0150DC50EF4E75F59509D83667AD5ADB20 PUSH1 0x1 MUL PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 MUL PUSH32 0x50CB9FE53DAA9737B786AB3646F04D0150DC50EF4E75F59509D83667AD5ADB20 PUSH1 0x1 MUL PUSH32 0x50CB9FE53DAA9737B786AB3646F04D0150DC50EF4E75F59509D83667AD5ADB20 PUSH1 0x1 MUL PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG2 DUP1 PUSH1 0x1 MUL CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 MUL PUSH32 0x50CB9FE53DAA9737B786AB3646F04D0150DC50EF4E75F59509D83667AD5ADB20 PUSH1 0x1 MUL PUSH32 0x50CB9FE53DAA9737B786AB3646F04D0150DC50EF4E75F59509D83667AD5ADB20 PUSH1 0x1 MUL PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 DUP1 PUSH1 0x1 MUL DUP2 PUSH1 0x1 MUL CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x1 MUL PUSH32 0x50CB9FE53DAA9737B786AB3646F04D0150DC50EF4E75F59509D83667AD5ADB20 PUSH1 0x1 MUL PUSH32 0x50CB9FE53DAA9737B786AB3646F04D0150DC50EF4E75F59509D83667AD5ADB20 PUSH1 0x1 MUL PUSH1 0x40 MLOAD DUP1 DUP3 DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG4 PUSH1 0x2 SELFDESTRUCT INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 0xe MLOAD 0xba LOG2 0xb4 SLOAD 0xb4 PUSH32 0xDF0EF596FA24AFF8ED3A3727B7481EBD25349182CE7152A30029608060405234 DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x13F DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x3B JUMPI PUSH1 0x0 CALLDATALOAD PUSH29 0x100000000000000000000000000000000000000000000000000000000 SWAP1 DIV DUP1 PUSH4 0x161E7150 EQ PUSH2 0x40 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x4C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAF PUSH1 0x4 DUP1 CALLDATASIZE SUB PUSH1 0x40 DUP2 LT ISZERO PUSH2 0x63 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 CALLDATALOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP PUSH2 0xC9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 ISZERO ISZERO ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x108 JUMPI PUSH1 0x1 SWAP1 POP PUSH2 0x10D JUMP JUMPDEST PUSH1 0x0 SWAP1 POP JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG1 PUSH6 0x627A7A723058 KECCAK256 CALLDATALOAD DUP16 PUSH8 0xA58C115EA636B0B8 0xe5 0xc4 0xca PUSH27 0x52B8192D0F3FA98A4434D6EA04596B5D0D00290000000000000000 ", + "sourceMap": "221:8828:0:-;;;263:110;8:9:-1;5:2;;;30:1;27;20:12;5:2;263:110:0;324:11;;:::i;:::-;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;324:11:0;316:5;;:19;;;;;;;;;;;;;;;;;;221:8828;;;;;;;;;;;;:::o;:::-;;;;;;;" +} diff --git a/tests/solidity/contracts/Migrations.sol b/tests/solidity/contracts/Migrations.sol new file mode 100644 index 000000000000..c378ffb02841 --- /dev/null +++ b/tests/solidity/contracts/Migrations.sol @@ -0,0 +1,23 @@ +pragma solidity >=0.4.21 <0.6.0; + +contract Migrations { + address public owner; + uint public last_completed_migration; + + constructor() public { + owner = msg.sender; + } + + modifier restricted() { + if (msg.sender == owner) _; + } + + function setCompleted(uint completed) public restricted { + last_completed_migration = completed; + } + + function upgrade(address new_address) public restricted { + Migrations upgraded = Migrations(new_address); + upgraded.setCompleted(last_completed_migration); + } +} diff --git a/tests/solidity/contracts/OpCodes.sol b/tests/solidity/contracts/OpCodes.sol new file mode 100644 index 000000000000..9e3a0ebb0202 --- /dev/null +++ b/tests/solidity/contracts/OpCodes.sol @@ -0,0 +1,322 @@ +pragma solidity >=0.4.21 <0.6.0; + +contract Test1 { + function isSameAddress(address a, address b) public returns(bool){ //Simply add the two arguments and return + if (a == b) return true; + return false; + } +} + +contract OpCodes { + + Test1 test1; + + constructor() public { //Constructor function + test1 = new Test1(); //Create new "Test1" function + } + + modifier onlyOwner(address _owner) { + require(msg.sender == _owner); + _; + } + // Add a todo to the list + function test() public { + + //simple_instructions + /*assembly { pop(sub(dup1, mul(dup1, dup1))) }*/ + + //keywords + assembly { pop(address) return(2, byte(2,1)) } + + //label_complex + /*assembly { 7 abc: 8 eq jump(abc) jumpi(eq(7, 8), abc) pop } + assembly { pop(jumpi(eq(7, 8), abc)) jump(abc) }*/ + + //functional + /*assembly { let x := 2 add(7, mul(6, x)) mul(7, 8) add =: x }*/ + + //for_statement + assembly { for { let i := 1 } lt(i, 5) { i := add(i, 1) } {} } + assembly { for { let i := 6 } gt(i, 5) { i := add(i, 1) } {} } + assembly { for { let i := 1 } slt(i, 5) { i := add(i, 1) } {} } + assembly { for { let i := 6 } sgt(i, 5) { i := add(i, 1) } {} } + + //no_opcodes_in_strict + assembly { pop(callvalue()) } + + //no_dup_swap_in_strict + /*assembly { swap1() }*/ + + //print_functional + assembly { let x := mul(sload(0x12), 7) } + + //print_if + assembly { if 2 { pop(mload(0)) }} + + //function_definitions_multiple_args + assembly { function f(a, d){ mstore(a, d) } function g(a, d) -> x, y {}} + + //sstore + assembly { function f(a, d){ sstore(a, d) } function g(a, d) -> x, y {}} + + //mstore8 + assembly { function f(a, d){ mstore8(a, d) } function g(a, d) -> x, y {}} + + //calldatacopy + assembly { + let a := mload(0x40) + let b := add(a, 32) + calldatacopy(a, 4, 32) + /*calldatacopy(b, add(4, 32), 32)*/ + /*result := add(mload(a), mload(b))*/ + } + + //codecopy + assembly { + let a := mload(0x40) + let b := add(a, 32) + codecopy(a, 4, 32) + } + + //codecopy + assembly { + let a := mload(0x40) + let b := add(a, 32) + extcodecopy(0, a, 4, 32) + } + + //for_statement + assembly { let x := calldatasize() for { let i := 0} lt(i, x) { i := add(i, 1) } { mstore(i, 2) } } + + //keccak256 + assembly { pop(keccak256(0,0)) } + + //returndatasize + assembly { let r := returndatasize } + + //returndatacopy + assembly { returndatacopy(64, 32, 0) } + //byzantium vs const Constantinople + //staticcall + assembly { pop(staticcall(10000, 0x123, 64, 0x10, 128, 0x10)) } + + /*//create2 Constantinople + assembly { pop(create2(10, 0x123, 32, 64)) }*/ + + //create Constantinople + assembly { pop(create(10, 0x123, 32)) } + + //shift Constantinople + /*assembly { pop(shl(10, 32)) } + assembly { pop(shr(10, 32)) } + assembly { pop(sar(10, 32)) }*/ + + + //not + assembly { pop( not(0x1f)) } + + //exp + assembly { pop( exp(2, 226)) } + + //mod + assembly { pop( mod(3, 9)) } + + //smod + assembly { pop( smod(3, 9)) } + + //div + assembly { pop( div(4, 2)) } + + //sdiv + assembly { pop( sdiv(4, 2)) } + + //iszero + assembly { pop(iszero(1)) } + + //and + assembly { pop(and(2,3)) } + + //or + assembly { pop(or(3,3)) } + + //xor + assembly { pop(xor(3,3)) } + + //addmod + assembly { pop(addmod(3,3,6)) } + + //mulmod + assembly { pop(mulmod(3,3,3)) } + + //signextend + assembly { pop(signextend(1, 10)) } + + //sha3 + assembly { pop(calldataload(0)) } + + //blockhash + assembly { pop(blockhash(sub(number(), 1))) } + + //balance + assembly { pop(balance(0x0)) } + + //caller + assembly { pop(caller()) } + + //codesize + assembly { pop(codesize()) } + + //extcodesize + assembly { pop(extcodesize(0x1)) } + + //origin + assembly { pop(origin()) } + + //gas + assembly { pop(gas())} + + //msize + assembly { pop(msize())} + + //pc + assembly { pop(pc())} + + //gasprice + assembly { pop(gasprice())} + + //coinbase + assembly { pop(coinbase())} + + //timestamp + assembly { pop(timestamp())} + + //number + assembly { pop(number())} + + //difficulty + assembly { pop(difficulty())} + + //gaslimit + assembly { pop(gaslimit())} + + //call + address contractAddr = address(test1); + bytes4 sig = bytes4(keccak256("isSameAddress(address,address)")); //Function signature + address a = msg.sender; + + assembly { + let x := mload(0x40) //Find empty storage location using "free memory pointer" + mstore(x,sig) //Place signature at begining of empty storage + mstore(add(x,0x04),a) // first address parameter. just after signature + mstore(add(x,0x24),a) // 2nd address parameter - first padded. add 32 bytes (not 20 bytes) + mstore(0x40,add(x,0x64)) // this is missing in other examples. Set free pointer before function call. so it is used by called function. + // new free pointer position after the output values of the called function. + + let success := call( + 5000, //5k gas + contractAddr, //To addr + 0, //No wei passed + x, // Inputs are at location x + 0x44, //Inputs size two padded, so 68 bytes + x, //Store output over input + 0x20) //Output is 32 bytes long + } + + //callcode + assembly { + let x := mload(0x40) //Find empty storage location using "free memory pointer" + mstore(x,sig) //Place signature at begining of empty storage + mstore(add(x,0x04),a) // first address parameter. just after signature + mstore(add(x,0x24),a) // 2nd address parameter - first padded. add 32 bytes (not 20 bytes) + mstore(0x40,add(x,0x64)) // this is missing in other examples. Set free pointer before function call. so it is used by called function. + // new free pointer position after the output values of the called function. + + let success := callcode( + 5000, //5k gas + contractAddr, //To addr + 0, //No wei passed + x, // Inputs are at location x + 0x44, //Inputs size two padded, so 68 bytes + x, //Store output over input + 0x20) //Output is 32 bytes long + } + + //delegatecall + assembly { + let x := mload(0x40) //Find empty storage location using "free memory pointer" + mstore(x,sig) //Place signature at begining of empty storage + mstore(add(x,0x04),a) // first address parameter. just after signature + mstore(add(x,0x24),a) // 2nd address parameter - first padded. add 32 bytes (not 20 bytes) + mstore(0x40,add(x,0x64)) // this is missing in other examples. Set free pointer before function call. so it is used by called function. + // new free pointer position after the output values of the called function. + + let success := delegatecall( + 5000, //5k gas + contractAddr, //To addr + x, // Inputs are at location x + 0x44, //Inputs size two padded, so 68 bytes + x, //Store output over input + 0x20) //Output is 32 bytes long + } + + uint256 _id = 0x420042; + + //log0 + log0( + bytes32(0x50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb20) + ); + + //log1 + log1( + bytes32(0x50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb20), + bytes32(0x50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb20) + ); + + //log2 + log2( + bytes32(0x50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb20), + bytes32(0x50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb20), + bytes32(uint256(msg.sender)) + ); + + //log3 + log3( + bytes32(0x50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb20), + bytes32(0x50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb20), + bytes32(uint256(msg.sender)), + bytes32(_id) + ); + + //log4 + log4( + bytes32(0x50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb20), + bytes32(0x50cb9fe53daa9737b786ab3646f04d0150dc50ef4e75f59509d83667ad5adb20), + bytes32(uint256(msg.sender)), + bytes32(_id), + bytes32(_id) + + ); + + //selfdestruct + assembly { selfdestruct(0x02) } + } + + function test_revert() public { + + //revert + assembly{ revert(0, 0) } + } + + function test_invalid() public { + + //revert + assembly{ invalid() } + } + + function test_stop() public { + + //revert + assembly{ stop() } + } + +} diff --git a/tests/solidity/migrations/1_initial_migration.js b/tests/solidity/migrations/1_initial_migration.js new file mode 100644 index 000000000000..ee2135d2952e --- /dev/null +++ b/tests/solidity/migrations/1_initial_migration.js @@ -0,0 +1,5 @@ +const Migrations = artifacts.require("Migrations"); + +module.exports = function(deployer) { + deployer.deploy(Migrations); +}; diff --git a/tests/solidity/migrations/2_opCodes_migration.js b/tests/solidity/migrations/2_opCodes_migration.js new file mode 100644 index 000000000000..65c6b6dc1434 --- /dev/null +++ b/tests/solidity/migrations/2_opCodes_migration.js @@ -0,0 +1,5 @@ +var OpCodes = artifacts.require("./OpCodes.sol"); + +module.exports = function(deployer) { + deployer.deploy(OpCodes); +}; diff --git a/tests/solidity/test/opCodes.js b/tests/solidity/test/opCodes.js new file mode 100644 index 000000000000..80abacef251f --- /dev/null +++ b/tests/solidity/test/opCodes.js @@ -0,0 +1,34 @@ +const TodoList = artifacts.require('./OpCodes.sol') +const assert = require('assert') +let contractInstance +const Web3 = require('web3'); +const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545')); +// const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:9545')); + +contract('OpCodes', (accounts) => { + beforeEach(async () => { + contractInstance = await TodoList.deployed() + }) + it('Should run without errors the majorit of opcodes', async () => { + await contractInstance.test() + await contractInstance.test_stop() + + }) + + it('Should throw invalid op code', async () => { + try{ + await contractInstance.test_invalid() + } + catch(error) { + console.error(error); + } + }) + + it('Should revert', async () => { + try{ + await contractInstance.test_revert() } + catch(error) { + console.error(error); + } + }) +}) diff --git a/tests/solidity/truffle-config.js b/tests/solidity/truffle-config.js new file mode 100644 index 000000000000..c06d8316ff8a --- /dev/null +++ b/tests/solidity/truffle-config.js @@ -0,0 +1,108 @@ +/** + * Use this file to configure your truffle project. It's seeded with some + * common settings for different networks and features like migrations, + * compilation and testing. Uncomment the ones you need or modify + * them to suit your project as necessary. + * + * More information about configuration can be found at: + * + * truffleframework.com/docs/advanced/configuration + * + * To deploy via Infura you'll need a wallet provider (like truffle-hdwallet-provider) + * to sign your transactions before they're sent to a remote public node. Infura API + * keys are available for free at: infura.io/register + * + * You'll also need a mnemonic - the twelve word phrase the wallet uses to generate + * public/private key pairs. If you're publishing your code to GitHub make sure you load this + * phrase from a file you've .gitignored so it doesn't accidentally become public. + * + */ + +// const HDWalletProvider = require('truffle-hdwallet-provider'); +// const infuraKey = "fj4jll3k....."; +// +// const fs = require('fs'); +// const mnemonic = fs.readFileSync(".secret").toString().trim(); + +// module.exports = { +// /** +// * Networks define how you connect to your ethereum client and let you set the +// * defaults web3 uses to send transactions. If you don't specify one truffle +// * will spin up a development blockchain for you on port 9545 when you +// * run `develop` or `test`. You can ask a truffle command to use a specific +// * network from the command line, e.g +// * +// * $ truffle test --network +// */ +// +// networks: { +// // Useful for testing. The `development` name is special - truffle uses it by default +// // if it's defined here and no other network is specified at the command line. +// // You should run a client (like ganache-cli, geth or parity) in a separate terminal +// // tab if you use this network and you must also set the `host`, `port` and `network_id` +// // options below to some value. +// // +// // development: { +// // host: "127.0.0.1", // Localhost (default: none) +// // port: 8545, // Standard Ethereum port (default: none) +// // network_id: "*", // Any network (default: none) +// // }, +// +// // Another network with more advanced options... +// // advanced: { +// // port: 8777, // Custom port +// // network_id: 1342, // Custom network +// // gas: 8500000, // Gas sent with each transaction (default: ~6700000) +// // gasPrice: 20000000000, // 20 gwei (in wei) (default: 100 gwei) +// // from:
, // Account to send txs from (default: accounts[0]) +// // websockets: true // Enable EventEmitter interface for web3 (default: false) +// // }, +// +// // Useful for deploying to a public network. +// // NB: It's important to wrap the provider as a function. +// // ropsten: { +// // provider: () => new HDWalletProvider(mnemonic, `https://ropsten.infura.io/${infuraKey}`), +// // network_id: 3, // Ropsten's id +// // gas: 5500000, // Ropsten has a lower block limit than mainnet +// // confirmations: 2, // # of confs to wait between deployments. (default: 0) +// // timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50) +// // skipDryRun: true // Skip dry run before migrations? (default: false for public nets ) +// // }, +// +// // Useful for private networks +// // private: { +// // provider: () => new HDWalletProvider(mnemonic, `https://network.io`), +// // network_id: 2111, // This network is yours, in the cloud. +// // production: true // Treats this network as if it was a public net. (default: false) +// // } +// }, +// +// // Set default mocha options here, use special reporters etc. +// mocha: { +// // timeout: 100000 +// }, +// +// // Configure your compilers +// compilers: { +// solc: { +// // version: "0.5.1", // Fetch exact version from solc-bin (default: truffle's version) +// // docker: true, // Use "0.5.1" you've installed locally with docker (default: false) +// // settings: { // See the solidity docs for advice about optimization and evmVersion +// // optimizer: { +// // enabled: false, +// // runs: 200 +// // }, +// // evmVersion: "byzantium" +// // } +// } +// } +// } +module.exports = { + networks: { + development: { + host: 'localhost', + port: 8545, + network_id: '*' + } + } +} diff --git a/tests/state_test.go b/tests/state_test.go index fc5e207f542c..f9499d4a8993 100644 --- a/tests/state_test.go +++ b/tests/state_test.go @@ -17,14 +17,13 @@ package tests import ( + "bufio" "bytes" - "flag" "fmt" "reflect" "testing" - "github.com/nebulaai/nbai-node/cmd/utils" - "github.com/nebulaai/nbai-node/core/vm" + "github.com/ethereum/go-ethereum/core/vm" ) func TestState(t *testing.T) { @@ -41,63 +40,71 @@ func TestState(t *testing.T) { st.slow(`^stStaticCall/static_Call1MB`) st.slow(`^stSystemOperationsTest/CallRecursiveBomb`) st.slow(`^stTransactionTest/Opcodes_TransactionInit`) + + // Very time consuming + st.skipLoad(`^stTimeConsuming/`) + // Broken tests: - st.skipLoad(`^stTransactionTest/OverflowGasRequire\.json`) // gasLimit > 256 bits - st.skipLoad(`^stTransactionTest/zeroSigTransa[^/]*\.json`) // EIP-86 is not supported yet // Expected failures: - st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/EIP158`, "bug in test") - st.fails(`^stRevertTest/RevertPrecompiledTouch\.json/Byzantium`, "bug in test") - st.fails(`^stRevertTest/RevertPrecompiledTouch.json/Constantinople`, "bug in test") + //st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/Byzantium/0`, "bug in test") + //st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/Byzantium/3`, "bug in test") + //st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/Constantinople/0`, "bug in test") + //st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/Constantinople/3`, "bug in test") + //st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/ConstantinopleFix/0`, "bug in test") + //st.fails(`^stRevertTest/RevertPrecompiledTouch(_storage)?\.json/ConstantinopleFix/3`, "bug in test") - 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) { - withTrace(t, test.gasLimit(subtest), func(vmconfig vm.Config) error { - _, err := test.Run(subtest, vmconfig) - return st.checkFailure(t, name, err) + // For Istanbul, older tests were moved into LegacyTests + for _, dir := range []string{ + stateTestDir, + legacyStateTestDir, + } { + st.walk(t, dir, 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) { + withTrace(t, test.gasLimit(subtest), func(vmconfig vm.Config) error { + _, err := test.Run(subtest, vmconfig) + return st.checkFailure(t, name, err) + }) }) - }) - } - }) + } + }) + } } // Transactions with gasLimit above this value will not get a VM trace on failure. const traceErrorLimit = 400000 -// The VM config for state tests that accepts --vm.* command line arguments. -var testVMConfig = func() vm.Config { - vmconfig := vm.Config{} - flag.StringVar(&vmconfig.EVMInterpreter, utils.EVMInterpreterFlag.Name, utils.EVMInterpreterFlag.Value, utils.EVMInterpreterFlag.Usage) - flag.StringVar(&vmconfig.EWASMInterpreter, utils.EWASMInterpreterFlag.Name, utils.EWASMInterpreterFlag.Value, utils.EWASMInterpreterFlag.Usage) - flag.Parse() - return vmconfig -}() - func withTrace(t *testing.T, gasLimit uint64, test func(vm.Config) error) { - err := test(testVMConfig) + // Use config from command line arguments. + config := vm.Config{EVMInterpreter: *testEVM, EWASMInterpreter: *testEWASM} + err := test(config) if err == nil { return } + + // Test failed, re-run with tracing enabled. t.Error(err) if gasLimit > traceErrorLimit { t.Log("gas limit too high for EVM trace") return } - tracer := vm.NewStructLogger(nil) - err2 := test(vm.Config{Debug: true, Tracer: tracer}) + buf := new(bytes.Buffer) + w := bufio.NewWriter(buf) + tracer := vm.NewJSONLogger(&vm.LogConfig{DisableMemory: true}, w) + config.Debug, config.Tracer = true, tracer + err2 := test(config) if !reflect.DeepEqual(err, err2) { t.Errorf("different error for second run: %v", err2) } - buf := new(bytes.Buffer) - vm.WriteTrace(buf, tracer.StructLogs()) + w.Flush() if buf.Len() == 0 { t.Log("no EVM operation logs generated") } else { t.Log("EVM operation log:\n" + buf.String()) } - t.Logf("EVM output: 0x%x", tracer.Output()) - t.Logf("EVM error: %v", tracer.Error()) + //t.Logf("EVM output: 0x%x", tracer.Output()) + //t.Logf("EVM error: %v", tracer.Error()) } diff --git a/tests/state_test_util.go b/tests/state_test_util.go index 069be25181e7..59ebcb6e1ec2 100644 --- a/tests/state_test_util.go +++ b/tests/state_test_util.go @@ -21,19 +21,21 @@ import ( "encoding/json" "fmt" "math/big" + "strconv" "strings" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" "golang.org/x/crypto/sha3" ) @@ -108,6 +110,29 @@ type stTransactionMarshaling struct { PrivateKey hexutil.Bytes } +// getVMConfig takes a fork definition and returns a chain config. +// The fork definition can be +// - a plain forkname, e.g. `Byzantium`, +// - a fork basename, and a list of EIPs to enable; e.g. `Byzantium+1884+1283`. +func getVMConfig(forkString string) (baseConfig *params.ChainConfig, eips []int, err error) { + var ( + splitForks = strings.Split(forkString, "+") + ok bool + baseName, eipsStrings = splitForks[0], splitForks[1:] + ) + if baseConfig, ok = Forks[baseName]; !ok { + return nil, nil, UnsupportedForkError{baseName} + } + for _, eip := range eipsStrings { + if eipNum, err := strconv.Atoi(eip); err != nil { + return nil, nil, fmt.Errorf("syntax error, invalid eip number %v", eipNum) + } else { + eips = append(eips, eipNum) + } + } + return baseConfig, eips, nil +} + // Subtests returns all valid subtests of the test. func (t *StateTest) Subtests() []StateSubtest { var sub []StateSubtest @@ -119,19 +144,38 @@ func (t *StateTest) Subtests() []StateSubtest { return sub } -// Run executes a specific subtest. +// Run executes a specific subtest and verifies the post-state and logs func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) (*state.StateDB, error) { - config, ok := Forks[subtest.Fork] - if !ok { - return nil, UnsupportedForkError{subtest.Fork} + statedb, root, err := t.RunNoVerify(subtest, vmconfig) + if err != nil { + return statedb, err + } + post := t.json.Post[subtest.Fork][subtest.Index] + // N.B: We need to do this in a two-step process, because the first Commit takes care + // of suicides, and we need to touch the coinbase _after_ it has potentially suicided. + if root != common.Hash(post.Root) { + return statedb, fmt.Errorf("post state root mismatch: got %x, want %x", root, post.Root) + } + 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) } + return statedb, nil +} + +// RunNoVerify runs a specific subtest and returns the statedb and post-state root +func (t *StateTest) RunNoVerify(subtest StateSubtest, vmconfig vm.Config) (*state.StateDB, common.Hash, error) { + config, eips, err := getVMConfig(subtest.Fork) + if err != nil { + return nil, common.Hash{}, UnsupportedForkError{subtest.Fork} + } + vmconfig.ExtraEips = eips block := t.genesis(config).ToBlock(nil) - statedb := MakePreState(ethdb.NewMemDatabase(), t.json.Pre) + statedb := MakePreState(rawdb.NewMemoryDatabase(), t.json.Pre) post := t.json.Post[subtest.Fork][subtest.Index] msg, err := t.json.Tx.toMessage(post) if err != nil { - return nil, err + return nil, common.Hash{}, err } context := core.NewEVMContext(msg, block.Header(), nil, &t.json.Env.Coinbase) context.GetHash = vmTestBlockHash @@ -153,15 +197,7 @@ func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) (*state.StateD statedb.AddBalance(block.Coinbase(), new(big.Int)) // And _now_ get the state root root := statedb.IntermediateRoot(config.IsEIP158(block.Number())) - // N.B: We need to do this in a two-step process, because the first Commit takes care - // of suicides, and we need to touch the coinbase _after_ it has potentially suicided. - if root != common.Hash(post.Root) { - return statedb, fmt.Errorf("post state root mismatch: got %x, want %x", root, post.Root) - } - 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) - } - return statedb, nil + return statedb, root, nil } func (t *StateTest) gasLimit(subtest StateSubtest) uint64 { diff --git a/tests/testdata b/tests/testdata deleted file mode 160000 index c02a2a17c028..000000000000 --- a/tests/testdata +++ /dev/null @@ -1 +0,0 @@ -Subproject commit c02a2a17c0288a255572b37dc7ec1fcb838b9dbf diff --git a/tests/transaction_test.go b/tests/transaction_test.go index fb9618f7c97f..0e3670d04bf7 100644 --- a/tests/transaction_test.go +++ b/tests/transaction_test.go @@ -17,36 +17,36 @@ package tests import ( - "math/big" "testing" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/params" ) func TestTransaction(t *testing.T) { t.Parallel() txt := new(testMatcher) - txt.config(`^Homestead/`, params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - }) - txt.config(`^EIP155/`, params.ChainConfig{ - HomesteadBlock: big.NewInt(0), - EIP150Block: big.NewInt(0), - EIP155Block: big.NewInt(0), - EIP158Block: big.NewInt(0), - ChainID: big.NewInt(1), - }) - 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), - }) + // These can't be parsed, invalid hex in RLP + txt.skipLoad("^ttWrongRLP/.*") + // We don't allow more than uint64 in gas amount + // This is a pseudo-consensus vulnerability, but not in practice + // because of the gas limit + txt.skipLoad("^ttGasLimit/TransactionWithGasLimitxPriceOverflow.json") + // We _do_ allow more than uint64 in gas price, as opposed to the tests + // This is also not a concern, as long as tx.Cost() uses big.Int for + // calculating the final cozt + txt.skipLoad(".*TransactionWithGasPriceOverflow.*") + + // The nonce is too large for uint64. Not a concern, it means geth won't + // accept transactions at a certain point in the distant future + txt.skipLoad("^ttNonce/TransactionWithHighNonce256.json") + // The value is larger than uint64, which according to the test is invalid. + // Geth accepts it, which is not a consensus issue since we use big.Int's + // internally to calculate the cost + txt.skipLoad("^ttValue/TransactionWithHighValueOverflow.json") txt.walk(t, transactionTestDir, func(t *testing.T, name string, test *TransactionTest) { - cfg := txt.findConfig(name) + cfg := params.MainnetChainConfig if err := txt.checkFailure(t, name, test.Run(cfg)); err != nil { t.Error(err) } diff --git a/tests/transaction_test_util.go b/tests/transaction_test_util.go index 1167a822b38a..43debae8308e 100644 --- a/tests/transaction_test_util.go +++ b/tests/transaction_test_util.go @@ -17,116 +17,95 @@ package tests import ( - "bytes" - "errors" "fmt" - "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/core/types" - "github.com/nebulaai/nbai-node/params" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rlp" ) // TransactionTest checks RLP decoding and sender derivation of transactions. type TransactionTest struct { - json ttJSON + RLP hexutil.Bytes `json:"rlp"` + Byzantium ttFork + Constantinople ttFork + Istanbul ttFork + EIP150 ttFork + EIP158 ttFork + Frontier ttFork + Homestead ttFork } -type ttJSON struct { - BlockNumber math.HexOrDecimal64 `json:"blockNumber"` - RLP hexutil.Bytes `json:"rlp"` - Sender hexutil.Bytes `json:"sender"` - Transaction *ttTransaction `json:"transaction"` -} - -//go:generate gencodec -type ttTransaction -field-override ttTransactionMarshaling -out gen_tttransaction.go - -type ttTransaction struct { - Data []byte `gencodec:"required"` - GasLimit uint64 `gencodec:"required"` - GasPrice *big.Int `gencodec:"required"` - Nonce uint64 `gencodec:"required"` - Value *big.Int `gencodec:"required"` - R *big.Int `gencodec:"required"` - S *big.Int `gencodec:"required"` - V *big.Int `gencodec:"required"` - To common.Address `gencodec:"required"` -} - -type ttTransactionMarshaling struct { - Data hexutil.Bytes - GasLimit math.HexOrDecimal64 - GasPrice *math.HexOrDecimal256 - Nonce math.HexOrDecimal64 - Value *math.HexOrDecimal256 - R *math.HexOrDecimal256 - S *math.HexOrDecimal256 - V *math.HexOrDecimal256 +type ttFork struct { + Sender common.UnprefixedAddress `json:"sender"` + Hash common.UnprefixedHash `json:"hash"` } func (tt *TransactionTest) Run(config *params.ChainConfig) error { - tx := new(types.Transaction) - if err := rlp.DecodeBytes(tt.json.RLP, tx); err != nil { - if tt.json.Transaction == nil { - return nil + + validateTx := func(rlpData hexutil.Bytes, signer types.Signer, isHomestead bool, isIstanbul bool) (*common.Address, *common.Hash, error) { + tx := new(types.Transaction) + if err := rlp.DecodeBytes(rlpData, tx); err != nil { + return nil, nil, err } - return fmt.Errorf("RLP decoding failed: %v", err) - } - // Check sender derivation. - signer := types.MakeSigner(config, new(big.Int).SetUint64(uint64(tt.json.BlockNumber))) - sender, err := types.Sender(signer, tx) - if err != nil { - return err - } - if sender != common.BytesToAddress(tt.json.Sender) { - return fmt.Errorf("Sender mismatch: got %x, want %x", sender, tt.json.Sender) - } - // Check decoded fields. - err = tt.json.Transaction.verify(signer, tx) - if tt.json.Sender == nil && err == nil { - return errors.New("field validations succeeded but should fail") - } - if tt.json.Sender != nil && err != nil { - return fmt.Errorf("field validations failed after RLP decoding: %s", err) + sender, err := types.Sender(signer, tx) + if err != nil { + return nil, nil, err + } + // Intrinsic gas + requiredGas, err := core.IntrinsicGas(tx.Data(), tx.To() == nil, isHomestead, isIstanbul) + if err != nil { + return nil, nil, err + } + if requiredGas > tx.Gas() { + return nil, nil, fmt.Errorf("insufficient gas ( %d < %d )", tx.Gas(), requiredGas) + } + h := tx.Hash() + return &sender, &h, nil } - return nil -} -func (tt *ttTransaction) verify(signer types.Signer, tx *types.Transaction) error { - if !bytes.Equal(tx.Data(), tt.Data) { - return fmt.Errorf("Tx input data mismatch: got %x want %x", tx.Data(), tt.Data) - } - if tx.Gas() != tt.GasLimit { - return fmt.Errorf("GasLimit mismatch: got %d, want %d", tx.Gas(), tt.GasLimit) - } - if tx.GasPrice().Cmp(tt.GasPrice) != 0 { - return fmt.Errorf("GasPrice mismatch: got %v, want %v", tx.GasPrice(), tt.GasPrice) - } - if tx.Nonce() != tt.Nonce { - return fmt.Errorf("Nonce mismatch: got %v, want %v", tx.Nonce(), tt.Nonce) - } - v, r, s := tx.RawSignatureValues() - if r.Cmp(tt.R) != 0 { - return fmt.Errorf("R mismatch: got %v, want %v", r, tt.R) - } - if s.Cmp(tt.S) != 0 { - return fmt.Errorf("S mismatch: got %v, want %v", s, tt.S) - } - if v.Cmp(tt.V) != 0 { - return fmt.Errorf("V mismatch: got %v, want %v", v, tt.V) - } - if tx.To() == nil { - if tt.To != (common.Address{}) { - return fmt.Errorf("To mismatch when recipient is nil (contract creation): %x", tt.To) + for _, testcase := range []struct { + name string + signer types.Signer + fork ttFork + isHomestead bool + isIstanbul bool + }{ + {"Frontier", types.FrontierSigner{}, tt.Frontier, false, false}, + {"Homestead", types.HomesteadSigner{}, tt.Homestead, true, false}, + {"EIP150", types.HomesteadSigner{}, tt.EIP150, true, false}, + {"EIP158", types.NewEIP155Signer(config.ChainID), tt.EIP158, true, false}, + {"Byzantium", types.NewEIP155Signer(config.ChainID), tt.Byzantium, true, false}, + {"Constantinople", types.NewEIP155Signer(config.ChainID), tt.Constantinople, true, false}, + {"Istanbul", types.NewEIP155Signer(config.ChainID), tt.Istanbul, true, true}, + } { + sender, txhash, err := validateTx(tt.RLP, testcase.signer, testcase.isHomestead, testcase.isIstanbul) + + if testcase.fork.Sender == (common.UnprefixedAddress{}) { + if err == nil { + return fmt.Errorf("expected error, got none (address %v)[%v]", sender.String(), testcase.name) + } + continue + } + // Should resolve the right address + if err != nil { + return fmt.Errorf("got error, expected none: %v", err) + } + if sender == nil { + return fmt.Errorf("sender was nil, should be %x", common.Address(testcase.fork.Sender)) + } + if *sender != common.Address(testcase.fork.Sender) { + return fmt.Errorf("sender mismatch: got %x, want %x", sender, testcase.fork.Sender) + } + if txhash == nil { + return fmt.Errorf("txhash was nil, should be %x", common.Hash(testcase.fork.Hash)) + } + if *txhash != common.Hash(testcase.fork.Hash) { + return fmt.Errorf("hash mismatch: got %x, want %x", *txhash, testcase.fork.Hash) } - } else if *tx.To() != tt.To { - return fmt.Errorf("To mismatch: got %x, want %x", *tx.To(), tt.To) - } - if tx.Value().Cmp(tt.Value) != 0 { - return fmt.Errorf("Value mismatch: got %x, want %x", tx.Value(), tt.Value) } return nil } diff --git a/tests/vm_test.go b/tests/vm_test.go index 3f7f6defa4a3..441483dffa4c 100644 --- a/tests/vm_test.go +++ b/tests/vm_test.go @@ -19,7 +19,7 @@ package tests import ( "testing" - "github.com/nebulaai/nbai-node/core/vm" + "github.com/ethereum/go-ethereum/core/vm" ) func TestVM(t *testing.T) { diff --git a/tests/vm_test_util.go b/tests/vm_test_util.go index 864cf4ccf9fd..91566c47e347 100644 --- a/tests/vm_test_util.go +++ b/tests/vm_test_util.go @@ -22,15 +22,15 @@ import ( "fmt" "math/big" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/hexutil" - "github.com/nebulaai/nbai-node/common/math" - "github.com/nebulaai/nbai-node/core" - "github.com/nebulaai/nbai-node/core/state" - "github.com/nebulaai/nbai-node/core/vm" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/params" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/rawdb" + "github.com/ethereum/go-ethereum/core/state" + "github.com/ethereum/go-ethereum/core/vm" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/params" ) // VMTest checks EVM execution without block or transaction context. @@ -79,7 +79,7 @@ type vmExecMarshaling struct { } func (t *VMTest) Run(vmconfig vm.Config) error { - statedb := MakePreState(ethdb.NewMemDatabase(), t.json.Pre) + statedb := MakePreState(rawdb.NewMemoryDatabase(), t.json.Pre) ret, gasRemaining, err := t.exec(statedb, vmconfig) if t.json.GasRemaining == nil { diff --git a/trie/database.go b/trie/database.go index 8cc56d35bf1a..b0fd78744492 100644 --- a/trie/database.go +++ b/trie/database.go @@ -17,17 +17,19 @@ package trie import ( + "errors" "fmt" "io" + "reflect" "sync" "time" - "github.com/allegro/bigcache" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" - "github.com/nebulaai/nbai-node/rlp" + "github.com/VictoriaMetrics/fastcache" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/ethereum/go-ethereum/rlp" ) var ( @@ -36,6 +38,11 @@ var ( memcacheCleanReadMeter = metrics.NewRegisteredMeter("trie/memcache/clean/read", nil) memcacheCleanWriteMeter = metrics.NewRegisteredMeter("trie/memcache/clean/write", nil) + memcacheDirtyHitMeter = metrics.NewRegisteredMeter("trie/memcache/dirty/hit", nil) + memcacheDirtyMissMeter = metrics.NewRegisteredMeter("trie/memcache/dirty/miss", nil) + memcacheDirtyReadMeter = metrics.NewRegisteredMeter("trie/memcache/dirty/read", nil) + memcacheDirtyWriteMeter = metrics.NewRegisteredMeter("trie/memcache/dirty/write", nil) + memcacheFlushTimeTimer = metrics.NewRegisteredResettingTimer("trie/memcache/flush/time", nil) memcacheFlushNodesMeter = metrics.NewRegisteredMeter("trie/memcache/flush/nodes", nil) memcacheFlushSizeMeter = metrics.NewRegisteredMeter("trie/memcache/flush/size", nil) @@ -55,22 +62,18 @@ var secureKeyPrefix = []byte("secure-key-") // secureKeyLength is the length of the above prefix + 32byte hash. const secureKeyLength = 11 + 32 -// DatabaseReader wraps the Get and Has method of a backing store for the trie. -type DatabaseReader interface { - // Get retrieves the value associated with key from the database. - Get(key []byte) (value []byte, err error) - - // Has retrieves whether a key is present in the database. - Has(key []byte) (bool, error) -} - // Database is an intermediate write layer between the trie data structures and // the disk database. The aim is to accumulate trie writes in-memory and only // periodically flush a couple tries to disk, garbage collecting the remainder. +// +// Note, the trie Database is **not** thread safe in its mutations, but it **is** +// thread safe in providing individual, independent node access. The rationale +// behind this split design is to provide read access to RPC handlers and sync +// servers even while the trie is executing expensive garbage collection. type Database struct { - diskdb ethdb.Database // Persistent storage for matured trie nodes + diskdb ethdb.KeyValueStore // Persistent storage for matured trie nodes - cleans *bigcache.BigCache // GC friendly memory cache of clean node RLPs + cleans *fastcache.Cache // GC friendly memory cache of clean node RLPs dirties map[common.Hash]*cachedNode // Data and references relationships of dirty nodes oldest common.Hash // Oldest tracked node, flush-list head newest common.Hash // Newest tracked node, flush-list tail @@ -86,7 +89,8 @@ type Database struct { flushnodes uint64 // Nodes flushed since last commit flushsize common.StorageSize // Data storage flushed since last commit - dirtiesSize common.StorageSize // Storage size of the dirty node cache (exc. flushlist) + dirtiesSize common.StorageSize // Storage size of the dirty node cache (exc. metadata) + childrenSize common.StorageSize // Storage size of the external children tracking preimagesSize common.StorageSize // Storage size of the preimages cache lock sync.RWMutex @@ -97,18 +101,16 @@ type Database struct { // in the same cache fields). type rawNode []byte -func (n rawNode) canUnload(uint16, uint16) bool { panic("this should never end up in a live trie") } -func (n rawNode) cache() (hashNode, bool) { panic("this should never end up in a live trie") } -func (n rawNode) fstring(ind string) string { panic("this should never end up in a live trie") } +func (n rawNode) cache() (hashNode, bool) { panic("this should never end up in a live trie") } +func (n rawNode) fstring(ind string) string { panic("this should never end up in a live trie") } // rawFullNode represents only the useful data content of a full node, with the // caches and flags stripped out to minimize its data storage. This type honors // the same RLP encoding as the original parent. type rawFullNode [17]node -func (n rawFullNode) canUnload(uint16, uint16) bool { panic("this should never end up in a live trie") } -func (n rawFullNode) cache() (hashNode, bool) { panic("this should never end up in a live trie") } -func (n rawFullNode) fstring(ind string) string { panic("this should never end up in a live trie") } +func (n rawFullNode) cache() (hashNode, bool) { panic("this should never end up in a live trie") } +func (n rawFullNode) fstring(ind string) string { panic("this should never end up in a live trie") } func (n rawFullNode) EncodeRLP(w io.Writer) error { var nodes [17]node @@ -131,9 +133,8 @@ type rawShortNode struct { Val node } -func (n rawShortNode) canUnload(uint16, uint16) bool { panic("this should never end up in a live trie") } -func (n rawShortNode) cache() (hashNode, bool) { panic("this should never end up in a live trie") } -func (n rawShortNode) fstring(ind string) string { panic("this should never end up in a live trie") } +func (n rawShortNode) cache() (hashNode, bool) { panic("this should never end up in a live trie") } +func (n rawShortNode) fstring(ind string) string { panic("this should never end up in a live trie") } // cachedNode is all the information we know about a single cached node in the // memory database write layer. @@ -148,6 +149,15 @@ type cachedNode struct { flushNext common.Hash // Next node in the flush-list } +// cachedNodeSize is the raw size of a cachedNode data structure without any +// node data included. It's an approximate size, but should be a lot better +// than not counting them. +var cachedNodeSize = int(reflect.TypeOf(cachedNode{}).Size()) + +// cachedNodeChildrenSize is the raw size of an initialized but empty external +// reference map. +const cachedNodeChildrenSize = 48 + // rlp returns the raw rlp encoded blob of the cached node, either directly from // the cache, or by regenerating it from the collapsed node. func (n *cachedNode) rlp() []byte { @@ -163,11 +173,11 @@ func (n *cachedNode) rlp() []byte { // obj returns the decoded and expanded trie node, either directly from the cache, // or by regenerating it from the rlp encoded blob. -func (n *cachedNode) obj(hash common.Hash, cachegen uint16) node { +func (n *cachedNode) obj(hash common.Hash) node { if node, ok := n.node.(rawNode); ok { - return mustDecodeNode(hash[:], node, cachegen) + return mustDecodeNode(hash[:], node) } - return expandNode(hash[:], n.node, cachegen) + return expandNode(hash[:], n.node) } // childs returns all the tracked children of this node, both the implicit ones @@ -232,16 +242,15 @@ func simplifyNode(n node) node { // expandNode traverses the node hierarchy of a collapsed storage node and converts // all fields and keys into expanded memory form. -func expandNode(hash hashNode, n node, cachegen uint16) node { +func expandNode(hash hashNode, n node) node { switch n := n.(type) { case *rawShortNode: // Short nodes need key and child expansion return &shortNode{ Key: compactToHex(n.Key), - Val: expandNode(nil, n.Val, cachegen), + Val: expandNode(nil, n.Val), flags: nodeFlag{ hash: hash, - gen: cachegen, }, } @@ -250,12 +259,11 @@ func expandNode(hash hashNode, n node, cachegen uint16) node { node := &fullNode{ flags: nodeFlag{ hash: hash, - gen: cachegen, }, } for i := 0; i < len(node.Children); i++ { if n[i] != nil { - node.Children[i] = expandNode(nil, n[i], cachegen) + node.Children[i] = expandNode(nil, n[i]) } } return node @@ -271,34 +279,30 @@ func expandNode(hash hashNode, n node, cachegen uint16) node { // NewDatabase creates a new trie database to store ephemeral trie content before // its written out to disk or garbage collected. No read cache is created, so all // data retrievals will hit the underlying disk database. -func NewDatabase(diskdb ethdb.Database) *Database { +func NewDatabase(diskdb ethdb.KeyValueStore) *Database { return NewDatabaseWithCache(diskdb, 0) } // NewDatabaseWithCache creates a new trie database to store ephemeral trie content // before its written out to disk or garbage collected. It also acts as a read cache // for nodes loaded from disk. -func NewDatabaseWithCache(diskdb ethdb.Database, cache int) *Database { - var cleans *bigcache.BigCache +func NewDatabaseWithCache(diskdb ethdb.KeyValueStore, cache int) *Database { + var cleans *fastcache.Cache if cache > 0 { - cleans, _ = bigcache.NewBigCache(bigcache.Config{ - Shards: 1024, - LifeWindow: time.Hour, - MaxEntriesInWindow: cache * 1024, - MaxEntrySize: 512, - HardMaxCacheSize: cache, - }) + cleans = fastcache.New(cache * 1024 * 1024) } return &Database{ - diskdb: diskdb, - cleans: cleans, - dirties: map[common.Hash]*cachedNode{{}: {}}, + diskdb: diskdb, + cleans: cleans, + dirties: map[common.Hash]*cachedNode{{}: { + children: make(map[common.Hash]uint16), + }}, preimages: make(map[common.Hash][]byte), } } // DiskDB retrieves the persistent storage backing the trie database. -func (db *Database) DiskDB() DatabaseReader { +func (db *Database) DiskDB() ethdb.KeyValueReader { return db.diskdb } @@ -322,6 +326,8 @@ func (db *Database) insert(hash common.Hash, blob []byte, node node) { if _, ok := db.dirties[hash]; ok { return } + memcacheDirtyWriteMeter.Mark(int64(len(blob))) + // Create the cached entry for this node entry := &cachedNode{ node: simplifyNode(node), @@ -358,13 +364,13 @@ func (db *Database) insertPreimage(hash common.Hash, preimage []byte) { // node retrieves a cached trie node from memory, or returns nil if none can be // found in the memory cache. -func (db *Database) node(hash common.Hash, cachegen uint16) node { +func (db *Database) node(hash common.Hash) node { // Retrieve the node from the clean cache if available if db.cleans != nil { - if enc, err := db.cleans.Get(string(hash[:])); err == nil && enc != nil { + if enc := db.cleans.Get(nil, hash[:]); enc != nil { memcacheCleanHitMeter.Mark(1) memcacheCleanReadMeter.Mark(int64(len(enc))) - return mustDecodeNode(hash[:], enc, cachegen) + return mustDecodeNode(hash[:], enc) } } // Retrieve the node from the dirty cache if available @@ -373,27 +379,35 @@ func (db *Database) node(hash common.Hash, cachegen uint16) node { db.lock.RUnlock() if dirty != nil { - return dirty.obj(hash, cachegen) + memcacheDirtyHitMeter.Mark(1) + memcacheDirtyReadMeter.Mark(int64(dirty.size)) + return dirty.obj(hash) } + memcacheDirtyMissMeter.Mark(1) + // Content unavailable in memory, attempt to retrieve from disk enc, err := db.diskdb.Get(hash[:]) if err != nil || enc == nil { return nil } if db.cleans != nil { - db.cleans.Set(string(hash[:]), enc) + db.cleans.Set(hash[:], enc) memcacheCleanMissMeter.Mark(1) memcacheCleanWriteMeter.Mark(int64(len(enc))) } - return mustDecodeNode(hash[:], enc, cachegen) + return mustDecodeNode(hash[:], enc) } // Node retrieves an encoded cached trie node from memory. If it cannot be found // cached, the method queries the persistent database for the content. func (db *Database) Node(hash common.Hash) ([]byte, error) { + // It doens't make sense to retrieve the metaroot + if hash == (common.Hash{}) { + return nil, errors.New("not found") + } // Retrieve the node from the clean cache if available if db.cleans != nil { - if enc, err := db.cleans.Get(string(hash[:])); err == nil && enc != nil { + if enc := db.cleans.Get(nil, hash[:]); enc != nil { memcacheCleanHitMeter.Mark(1) memcacheCleanReadMeter.Mark(int64(len(enc))) return enc, nil @@ -405,13 +419,17 @@ func (db *Database) Node(hash common.Hash) ([]byte, error) { db.lock.RUnlock() if dirty != nil { + memcacheDirtyHitMeter.Mark(1) + memcacheDirtyReadMeter.Mark(int64(dirty.size)) return dirty.rlp(), nil } + memcacheDirtyMissMeter.Mark(1) + // Content unavailable in memory, attempt to retrieve from disk enc, err := db.diskdb.Get(hash[:]) if err == nil && enc != nil { if db.cleans != nil { - db.cleans.Set(string(hash[:]), enc) + db.cleans.Set(hash[:], enc) memcacheCleanMissMeter.Mark(1) memcacheCleanWriteMeter.Mark(int64(len(enc))) } @@ -461,8 +479,8 @@ func (db *Database) Nodes() []common.Hash { // Reference adds a new reference from a parent node to a child node. func (db *Database) Reference(child common.Hash, parent common.Hash) { - db.lock.RLock() - defer db.lock.RUnlock() + db.lock.Lock() + defer db.lock.Unlock() db.reference(child, parent) } @@ -477,11 +495,15 @@ func (db *Database) reference(child common.Hash, parent common.Hash) { // If the reference already exists, only duplicate for roots if db.dirties[parent].children == nil { db.dirties[parent].children = make(map[common.Hash]uint16) + db.childrenSize += cachedNodeChildrenSize } else if _, ok = db.dirties[parent].children[child]; ok && parent != (common.Hash{}) { return } node.parents++ db.dirties[parent].children[child]++ + if db.dirties[parent].children[child] == 1 { + db.childrenSize += common.HashLength + 2 // uint16 counter + } } // Dereference removes an existing reference from a root node. @@ -518,6 +540,7 @@ func (db *Database) dereference(child common.Hash, parent common.Hash) { node.children[child]-- if node.children[child] == 0 { delete(node.children, child) + db.childrenSize -= (common.HashLength + 2) // uint16 counter } } // If the child does not exist, it's a previously committed node. @@ -552,25 +575,30 @@ func (db *Database) dereference(child common.Hash, parent common.Hash) { } delete(db.dirties, child) db.dirtiesSize -= common.StorageSize(common.HashLength + int(node.size)) + if node.children != nil { + db.childrenSize -= cachedNodeChildrenSize + } } } // Cap iteratively flushes old but still referenced trie nodes until the total // memory usage goes below the given threshold. +// +// Note, this method is a non-synchronized mutator. It is unsafe to call this +// concurrently with other mutators. func (db *Database) Cap(limit common.StorageSize) error { // Create a database batch to flush persistent data out. It is important that // outside code doesn't see an inconsistent state (referenced data removed from // memory cache during commit but not yet in persistent storage). This is ensured // by only uncaching existing data when the database write finalizes. - db.lock.RLock() - nodes, storage, start := len(db.dirties), db.dirtiesSize, time.Now() batch := db.diskdb.NewBatch() // db.dirtiesSize only contains the useful data in the cache, but when reporting // the total memory consumption, the maintenance metadata is also needed to be - // counted. For every useful node, we track 2 extra hashes as the flushlist. - size := db.dirtiesSize + common.StorageSize((len(db.dirties)-1)*2*common.HashLength) + // counted. + size := db.dirtiesSize + common.StorageSize((len(db.dirties)-1)*cachedNodeSize) + size += db.childrenSize - common.StorageSize(len(db.dirties[common.Hash{}].children)*(common.HashLength+2)) // If the preimage cache got large enough, push to disk. If it's still small // leave for later to deduplicate writes. @@ -579,12 +607,10 @@ func (db *Database) Cap(limit common.StorageSize) error { for hash, preimage := range db.preimages { if err := batch.Put(db.secureKey(hash[:]), preimage); err != nil { log.Error("Failed to commit preimage from trie database", "err", err) - db.lock.RUnlock() return err } if batch.ValueSize() > ethdb.IdealBatchSize { if err := batch.Write(); err != nil { - db.lock.RUnlock() return err } batch.Reset() @@ -597,33 +623,30 @@ func (db *Database) Cap(limit common.StorageSize) error { // Fetch the oldest referenced node and push into the batch node := db.dirties[oldest] if err := batch.Put(oldest[:], node.rlp()); err != nil { - db.lock.RUnlock() return err } // If we exceeded the ideal batch size, commit and reset if batch.ValueSize() >= ethdb.IdealBatchSize { if err := batch.Write(); err != nil { log.Error("Failed to write flush list to disk", "err", err) - db.lock.RUnlock() return err } batch.Reset() } // Iterate to the next flush item, or abort if the size cap was achieved. Size - // is the total size, including both the useful cached data (hash -> blob), as - // well as the flushlist metadata (2*hash). When flushing items from the cache, - // we need to reduce both. - size -= common.StorageSize(3*common.HashLength + int(node.size)) + // is the total size, including the useful cached data (hash -> blob), the + // cache item metadata, as well as external children mappings. + size -= common.StorageSize(common.HashLength + int(node.size) + cachedNodeSize) + if node.children != nil { + size -= common.StorageSize(cachedNodeChildrenSize + len(node.children)*(common.HashLength+2)) + } oldest = node.flushNext } // Flush out any remainder data from the last batch if err := batch.Write(); err != nil { log.Error("Failed to write flush list to disk", "err", err) - db.lock.RUnlock() return err } - db.lock.RUnlock() - // Write successful, clear out the flushed data db.lock.Lock() defer db.lock.Unlock() @@ -638,6 +661,9 @@ func (db *Database) Cap(limit common.StorageSize) error { db.oldest = node.flushNext db.dirtiesSize -= common.StorageSize(common.HashLength + int(node.size)) + if node.children != nil { + db.childrenSize -= common.StorageSize(cachedNodeChildrenSize + len(node.children)*(common.HashLength+2)) + } } if db.oldest != (common.Hash{}) { db.dirties[db.oldest].flushPrev = common.Hash{} @@ -657,16 +683,16 @@ func (db *Database) Cap(limit common.StorageSize) error { } // Commit iterates over all the children of a particular node, writes them out -// to disk, forcefully tearing down all references in both directions. +// to disk, forcefully tearing down all references in both directions. As a side +// effect, all pre-images accumulated up to this point are also written. // -// As a side effect, all pre-images accumulated up to this point are also written. +// Note, this method is a non-synchronized mutator. It is unsafe to call this +// concurrently with other mutators. func (db *Database) Commit(node common.Hash, report bool) error { // Create a database batch to flush persistent data out. It is important that // outside code doesn't see an inconsistent state (referenced data removed from // memory cache during commit but not yet in persistent storage). This is ensured // by only uncaching existing data when the database write finalizes. - db.lock.RLock() - start := time.Now() batch := db.diskdb.NewBatch() @@ -674,9 +700,9 @@ func (db *Database) Commit(node common.Hash, report bool) error { for hash, preimage := range db.preimages { if err := batch.Put(db.secureKey(hash[:]), preimage); err != nil { log.Error("Failed to commit preimage from trie database", "err", err) - db.lock.RUnlock() return err } + // If the batch is too large, flush to disk if batch.ValueSize() > ethdb.IdealBatchSize { if err := batch.Write(); err != nil { return err @@ -684,30 +710,37 @@ func (db *Database) Commit(node common.Hash, report bool) error { batch.Reset() } } + // Since we're going to replay trie node writes into the clean cache, flush out + // any batched pre-images before continuing. + if err := batch.Write(); err != nil { + return err + } + batch.Reset() + // Move the trie itself into the batch, flushing if enough data is accumulated nodes, storage := len(db.dirties), db.dirtiesSize - if err := db.commit(node, batch); err != nil { + + uncacher := &cleaner{db} + if err := db.commit(node, batch, uncacher); err != nil { log.Error("Failed to commit trie from trie database", "err", err) - db.lock.RUnlock() return err } - // Write batch ready, unlock for readers during persistence + // Trie mostly committed to disk, flush any batch leftovers if err := batch.Write(); err != nil { log.Error("Failed to write trie to disk", "err", err) - db.lock.RUnlock() return err } - db.lock.RUnlock() - - // Write successful, clear out the flushed data + // Uncache any leftovers in the last batch db.lock.Lock() defer db.lock.Unlock() + batch.Replay(uncacher) + batch.Reset() + + // Reset the storage counters and bumpd metrics db.preimages = make(map[common.Hash][]byte) db.preimagesSize = 0 - db.uncache(node) - memcacheCommitTimeTimer.Update(time.Since(start)) memcacheCommitSizeMeter.Mark(int64(storage - db.dirtiesSize)) memcacheCommitNodesMeter.Mark(int64(nodes - len(db.dirties))) @@ -727,14 +760,14 @@ func (db *Database) Commit(node common.Hash, report bool) error { } // commit is the private locked version of Commit. -func (db *Database) commit(hash common.Hash, batch ethdb.Batch) error { +func (db *Database) commit(hash common.Hash, batch ethdb.Batch, uncacher *cleaner) error { // If the node does not exist, it's a previously committed node node, ok := db.dirties[hash] if !ok { return nil } for _, child := range node.childs() { - if err := db.commit(child, batch); err != nil { + if err := db.commit(child, batch, uncacher); err != nil { return err } } @@ -746,39 +779,61 @@ func (db *Database) commit(hash common.Hash, batch ethdb.Batch) error { if err := batch.Write(); err != nil { return err } + db.lock.Lock() + batch.Replay(uncacher) batch.Reset() + db.lock.Unlock() } return nil } -// uncache is the post-processing step of a commit operation where the already -// persisted trie is removed from the cache. The reason behind the two-phase -// commit is to ensure consistent data availability while moving from memory -// to disk. -func (db *Database) uncache(hash common.Hash) { +// cleaner is a database batch replayer that takes a batch of write operations +// and cleans up the trie database from anything written to disk. +type cleaner struct { + db *Database +} + +// Put reacts to database writes and implements dirty data uncaching. This is the +// post-processing step of a commit operation where the already persisted trie is +// removed from the dirty cache and moved into the clean cache. The reason behind +// the two-phase commit is to ensure ensure data availability while moving from +// memory to disk. +func (c *cleaner) Put(key []byte, rlp []byte) error { + hash := common.BytesToHash(key) + // If the node does not exist, we're done on this path - node, ok := db.dirties[hash] + node, ok := c.db.dirties[hash] if !ok { - return + return nil } // Node still exists, remove it from the flush-list switch hash { - case db.oldest: - db.oldest = node.flushNext - db.dirties[node.flushNext].flushPrev = common.Hash{} - case db.newest: - db.newest = node.flushPrev - db.dirties[node.flushPrev].flushNext = common.Hash{} + case c.db.oldest: + c.db.oldest = node.flushNext + c.db.dirties[node.flushNext].flushPrev = common.Hash{} + case c.db.newest: + c.db.newest = node.flushPrev + c.db.dirties[node.flushPrev].flushNext = common.Hash{} default: - db.dirties[node.flushPrev].flushNext = node.flushNext - db.dirties[node.flushNext].flushPrev = node.flushPrev + c.db.dirties[node.flushPrev].flushNext = node.flushNext + c.db.dirties[node.flushNext].flushPrev = node.flushPrev } - // Uncache the node's subtries and remove the node itself too - for _, child := range node.childs() { - db.uncache(child) + // Remove the node from the dirty cache + delete(c.db.dirties, hash) + c.db.dirtiesSize -= common.StorageSize(common.HashLength + int(node.size)) + if node.children != nil { + c.db.dirtiesSize -= common.StorageSize(cachedNodeChildrenSize + len(node.children)*(common.HashLength+2)) } - delete(db.dirties, hash) - db.dirtiesSize -= common.StorageSize(common.HashLength + int(node.size)) + // Move the flushed node into the clean cache to prevent insta-reloads + if c.db.cleans != nil { + c.db.cleans.Set(hash[:], rlp) + memcacheCleanWriteMeter.Mark(int64(len(rlp))) + } + return nil +} + +func (c *cleaner) Delete(key []byte) error { + panic("not implemented") } // Size returns the current storage size of the memory cache in front of the @@ -789,49 +844,8 @@ func (db *Database) Size() (common.StorageSize, common.StorageSize) { // db.dirtiesSize only contains the useful data in the cache, but when reporting // the total memory consumption, the maintenance metadata is also needed to be - // counted. For every useful node, we track 2 extra hashes as the flushlist. - var flushlistSize = common.StorageSize((len(db.dirties) - 1) * 2 * common.HashLength) - return db.dirtiesSize + flushlistSize, db.preimagesSize -} - -// verifyIntegrity is a debug method to iterate over the entire trie stored in -// memory and check whether every node is reachable from the meta root. The goal -// is to find any errors that might cause memory leaks and or trie nodes to go -// missing. -// -// This method is extremely CPU and memory intensive, only use when must. -func (db *Database) verifyIntegrity() { - // Iterate over all the cached nodes and accumulate them into a set - reachable := map[common.Hash]struct{}{{}: {}} - - for child := range db.dirties[common.Hash{}].children { - db.accumulate(child, reachable) - } - // Find any unreachable but cached nodes - unreachable := []string{} - for hash, node := range db.dirties { - if _, ok := reachable[hash]; !ok { - unreachable = append(unreachable, fmt.Sprintf("%x: {Node: %v, Parents: %d, Prev: %x, Next: %x}", - hash, node.node, node.parents, node.flushPrev, node.flushNext)) - } - } - if len(unreachable) != 0 { - panic(fmt.Sprintf("trie cache memory leak: %v", unreachable)) - } -} - -// accumulate iterates over the trie defined by hash and accumulates all the -// cached children found in memory. -func (db *Database) accumulate(hash common.Hash, reachable map[common.Hash]struct{}) { - // Mark the node reachable if present in the memory cache - node, ok := db.dirties[hash] - if !ok { - return - } - reachable[hash] = struct{}{} - - // Iterate over all the children and accumulate them too - for _, child := range node.childs() { - db.accumulate(child, reachable) - } + // counted. + var metadataSize = common.StorageSize((len(db.dirties) - 1) * cachedNodeSize) + var metarootRefs = common.StorageSize(len(db.dirties[common.Hash{}].children) * (common.HashLength + 2)) + return db.dirtiesSize + db.childrenSize + metadataSize - metarootRefs, db.preimagesSize } diff --git a/trie/database_test.go b/trie/database_test.go new file mode 100644 index 000000000000..81c469500f98 --- /dev/null +++ b/trie/database_test.go @@ -0,0 +1,33 @@ +// Copyright 2019 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 trie + +import ( + "testing" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb/memorydb" +) + +// Tests that the trie database returns a missing trie node error if attempting +// to retrieve the meta root. +func TestDatabaseMetarootFetch(t *testing.T) { + db := NewDatabase(memorydb.New()) + if _, err := db.Node(common.Hash{}); err == nil { + t.Fatalf("metaroot retrieval succeeded") + } +} diff --git a/trie/encoding.go b/trie/encoding.go index 5f120de638ce..1955a3e664f5 100644 --- a/trie/encoding.go +++ b/trie/encoding.go @@ -52,6 +52,9 @@ func hexToCompact(hex []byte) []byte { } func compactToHex(compact []byte) []byte { + if len(compact) == 0 { + return compact + } base := keybytesToHex(compact) // delete terminator flag if base[0] < 2 { diff --git a/trie/errors.go b/trie/errors.go index 21039f440579..567b80078c06 100644 --- a/trie/errors.go +++ b/trie/errors.go @@ -19,7 +19,7 @@ package trie import ( "fmt" - "github.com/nebulaai/nbai-node/common" + "github.com/ethereum/go-ethereum/common" ) // MissingNodeError is returned by the trie functions (TryGet, TryUpdate, TryDelete) diff --git a/trie/hasher.go b/trie/hasher.go index 2ca79617f64f..54f6a9de2b6a 100644 --- a/trie/hasher.go +++ b/trie/hasher.go @@ -20,17 +20,15 @@ import ( "hash" "sync" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/rlp" "golang.org/x/crypto/sha3" ) type hasher struct { - tmp sliceBuffer - sha keccakState - cachegen uint16 - cachelimit uint16 - onleaf LeafCallback + tmp sliceBuffer + sha keccakState + onleaf LeafCallback } // keccakState wraps sha3.state. In addition to the usual hash methods, it also supports @@ -62,9 +60,9 @@ var hasherPool = sync.Pool{ }, } -func newHasher(cachegen, cachelimit uint16, onleaf LeafCallback) *hasher { +func newHasher(onleaf LeafCallback) *hasher { h := hasherPool.Get().(*hasher) - h.cachegen, h.cachelimit, h.onleaf = cachegen, cachelimit, onleaf + h.onleaf = onleaf return h } @@ -80,14 +78,13 @@ func (h *hasher) hash(n node, db *Database, force bool) (node, node, error) { if db == nil { return hash, n, nil } - if n.canUnload(h.cachegen, h.cachelimit) { - // Unload the node from cache. All of its subnodes will have a lower or equal - // cache generation number. - cacheUnloadCounter.Inc(1) - return hash, hash, nil - } if !dirty { - return hash, n, nil + switch n.(type) { + case *fullNode, *shortNode: + return hash, hash, nil + default: + return hash, n, nil + } } } // Trie not processed yet or needs storage, walk the children diff --git a/trie/iterator.go b/trie/iterator.go index 89b0e6aeaef7..8e84dee3b617 100644 --- a/trie/iterator.go +++ b/trie/iterator.go @@ -21,8 +21,8 @@ import ( "container/heap" "errors" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/rlp" ) // Iterator is a key-value trie iterator that traverses a Trie. @@ -34,7 +34,9 @@ type Iterator struct { Err error } -// NewIterator creates a new key-value iterator from a node iterator +// NewIterator creates a new key-value iterator from a node iterator. +// Note that the value returned by the iterator is raw. If the content is encoded +// (e.g. storage value is RLP-encoded), it's caller's duty to decode it. func NewIterator(it NodeIterator) *Iterator { return &Iterator{ nodeIt: it, @@ -180,7 +182,7 @@ func (it *nodeIterator) LeafBlob() []byte { func (it *nodeIterator) LeafProof() [][]byte { if len(it.stack) > 0 { if _, ok := it.stack[len(it.stack)-1].node.(valueNode); ok { - hasher := newHasher(0, 0, nil) + hasher := newHasher(nil) defer returnHasherToPool(hasher) proofs := make([][]byte, 0, len(it.stack)) diff --git a/trie/iterator_test.go b/trie/iterator_test.go index cd5a50cb1b63..88b8103fb3f2 100644 --- a/trie/iterator_test.go +++ b/trie/iterator_test.go @@ -22,8 +22,8 @@ import ( "math/rand" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/ethdb" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb/memorydb" ) func TestIterator(t *testing.T) { @@ -120,11 +120,14 @@ func TestNodeIteratorCoverage(t *testing.T) { } } } - for _, key := range db.diskdb.(*ethdb.MemDatabase).Keys() { + it := db.diskdb.NewIterator() + for it.Next() { + key := it.Key() if _, ok := hashes[common.BytesToHash(key)]; !ok { t.Errorf("state entry not reported %x", key) } } + it.Release() } type kvs struct{ k, v string } @@ -289,7 +292,7 @@ func TestIteratorContinueAfterErrorDisk(t *testing.T) { testIteratorContinueA func TestIteratorContinueAfterErrorMemonly(t *testing.T) { testIteratorContinueAfterError(t, true) } func testIteratorContinueAfterError(t *testing.T, memonly bool) { - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) tr, _ := New(common.Hash{}, triedb) @@ -309,7 +312,11 @@ func testIteratorContinueAfterError(t *testing.T, memonly bool) { if memonly { memKeys = triedb.Nodes() } else { - diskKeys = diskdb.Keys() + it := diskdb.NewIterator() + for it.Next() { + diskKeys = append(diskKeys, it.Key()) + } + it.Release() } for i := 0; i < 20; i++ { // Create trie that will load all nodes from DB. @@ -376,7 +383,7 @@ func TestIteratorContinueAfterSeekErrorMemonly(t *testing.T) { func testIteratorContinueAfterSeekError(t *testing.T, memonly bool) { // Commit test trie to db, then remove the node containing "bars". - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) ctr, _ := New(common.Hash{}, triedb) diff --git a/trie/node.go b/trie/node.go index 9be6ec609091..f4055e779a1b 100644 --- a/trie/node.go +++ b/trie/node.go @@ -21,8 +21,8 @@ import ( "io" "strings" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/rlp" ) var indices = []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "[17]"} @@ -30,7 +30,6 @@ var indices = []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b type node interface { fstring(string) string cache() (hashNode, bool) - canUnload(cachegen, cachelimit uint16) bool } type ( @@ -71,20 +70,9 @@ func (n *shortNode) copy() *shortNode { copy := *n; return © } // nodeFlag contains caching-related metadata about a node. type nodeFlag struct { hash hashNode // cached hash of the node (may be nil) - gen uint16 // cache generation counter dirty bool // whether the node has changes that must be written to the database } -// canUnload tells whether a node can be unloaded. -func (n *nodeFlag) canUnload(cachegen, cachelimit uint16) bool { - return !n.dirty && cachegen-n.gen >= cachelimit -} - -func (n *fullNode) canUnload(gen, limit uint16) bool { return n.flags.canUnload(gen, limit) } -func (n *shortNode) canUnload(gen, limit uint16) bool { return n.flags.canUnload(gen, limit) } -func (n hashNode) canUnload(uint16, uint16) bool { return false } -func (n valueNode) canUnload(uint16, uint16) bool { return false } - func (n *fullNode) cache() (hashNode, bool) { return n.flags.hash, n.flags.dirty } func (n *shortNode) cache() (hashNode, bool) { return n.flags.hash, n.flags.dirty } func (n hashNode) cache() (hashNode, bool) { return nil, true } @@ -117,8 +105,8 @@ func (n valueNode) fstring(ind string) string { return fmt.Sprintf("%x ", []byte(n)) } -func mustDecodeNode(hash, buf []byte, cachegen uint16) node { - n, err := decodeNode(hash, buf, cachegen) +func mustDecodeNode(hash, buf []byte) node { + n, err := decodeNode(hash, buf) if err != nil { panic(fmt.Sprintf("node %x: %v", hash, err)) } @@ -126,7 +114,7 @@ func mustDecodeNode(hash, buf []byte, cachegen uint16) node { } // decodeNode parses the RLP encoding of a trie node. -func decodeNode(hash, buf []byte, cachegen uint16) (node, error) { +func decodeNode(hash, buf []byte) (node, error) { if len(buf) == 0 { return nil, io.ErrUnexpectedEOF } @@ -136,22 +124,22 @@ func decodeNode(hash, buf []byte, cachegen uint16) (node, error) { } switch c, _ := rlp.CountValues(elems); c { case 2: - n, err := decodeShort(hash, elems, cachegen) + n, err := decodeShort(hash, elems) return n, wrapError(err, "short") case 17: - n, err := decodeFull(hash, elems, cachegen) + n, err := decodeFull(hash, elems) return n, wrapError(err, "full") default: return nil, fmt.Errorf("invalid number of list elements: %v", c) } } -func decodeShort(hash, elems []byte, cachegen uint16) (node, error) { +func decodeShort(hash, elems []byte) (node, error) { kbuf, rest, err := rlp.SplitString(elems) if err != nil { return nil, err } - flag := nodeFlag{hash: hash, gen: cachegen} + flag := nodeFlag{hash: hash} key := compactToHex(kbuf) if hasTerm(key) { // value node @@ -161,17 +149,17 @@ func decodeShort(hash, elems []byte, cachegen uint16) (node, error) { } return &shortNode{key, append(valueNode{}, val...), flag}, nil } - r, _, err := decodeRef(rest, cachegen) + r, _, err := decodeRef(rest) if err != nil { return nil, wrapError(err, "val") } return &shortNode{key, r, flag}, nil } -func decodeFull(hash, elems []byte, cachegen uint16) (*fullNode, error) { - n := &fullNode{flags: nodeFlag{hash: hash, gen: cachegen}} +func decodeFull(hash, elems []byte) (*fullNode, error) { + n := &fullNode{flags: nodeFlag{hash: hash}} for i := 0; i < 16; i++ { - cld, rest, err := decodeRef(elems, cachegen) + cld, rest, err := decodeRef(elems) if err != nil { return n, wrapError(err, fmt.Sprintf("[%d]", i)) } @@ -189,7 +177,7 @@ func decodeFull(hash, elems []byte, cachegen uint16) (*fullNode, error) { const hashLen = len(common.Hash{}) -func decodeRef(buf []byte, cachegen uint16) (node, []byte, error) { +func decodeRef(buf []byte) (node, []byte, error) { kind, val, rest, err := rlp.Split(buf) if err != nil { return nil, buf, err @@ -202,7 +190,7 @@ func decodeRef(buf []byte, cachegen uint16) (node, []byte, error) { err := fmt.Errorf("oversized embedded node (size is %d bytes, want size < %d)", size, hashLen) return nil, buf, err } - n, err := decodeNode(nil, buf, cachegen) + n, err := decodeNode(nil, buf) return n, rest, err case kind == rlp.String && len(val) == 0: // empty node diff --git a/trie/node_test.go b/trie/node_test.go deleted file mode 100644 index 7ad1ff9e7bd3..000000000000 --- a/trie/node_test.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2016 The go-ethereum Authors -// This file is part of the go-ethereum library. -// -// The go-ethereum library is free software: you can redistribute it and/or modify -// it under the terms of the GNU Lesser General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// The go-ethereum library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Lesser General Public License for more details. -// -// You should have received a copy of the GNU Lesser General Public License -// along with the go-ethereum library. If not, see . - -package trie - -import "testing" - -func TestCanUnload(t *testing.T) { - tests := []struct { - flag nodeFlag - cachegen, cachelimit uint16 - want bool - }{ - { - flag: nodeFlag{dirty: true, gen: 0}, - want: false, - }, - { - flag: nodeFlag{dirty: false, gen: 0}, - cachegen: 0, cachelimit: 0, - want: true, - }, - { - flag: nodeFlag{dirty: false, gen: 65534}, - cachegen: 65535, cachelimit: 1, - want: true, - }, - { - flag: nodeFlag{dirty: false, gen: 65534}, - cachegen: 0, cachelimit: 1, - want: true, - }, - { - flag: nodeFlag{dirty: false, gen: 1}, - cachegen: 65535, cachelimit: 1, - want: true, - }, - } - - for _, test := range tests { - if got := test.flag.canUnload(test.cachegen, test.cachelimit); got != test.want { - t.Errorf("%+v\n got %t, want %t", test, got, test.want) - } - } -} diff --git a/trie/proof.go b/trie/proof.go index 6f9cc61c3c83..9985e730dd37 100644 --- a/trie/proof.go +++ b/trie/proof.go @@ -20,11 +20,10 @@ import ( "bytes" "fmt" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/rlp" ) // Prove constructs a merkle proof for key. The result contains all encoded nodes @@ -34,10 +33,10 @@ import ( // If the trie does not contain a value for key, the returned proof 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, fromLevel uint, proofDb ethdb.Putter) error { +func (t *Trie) Prove(key []byte, fromLevel uint, proofDb ethdb.KeyValueWriter) error { // Collect all nodes on the path to key. key = keybytesToHex(key) - nodes := []node{} + var nodes []node tn := t.root for len(key) > 0 && tn != nil { switch n := tn.(type) { @@ -65,7 +64,7 @@ func (t *Trie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error { panic(fmt.Sprintf("%T: invalid node: %v", tn, tn)) } } - hasher := newHasher(0, 0, nil) + hasher := newHasher(nil) defer returnHasherToPool(hasher) for i, n := range nodes { @@ -81,7 +80,7 @@ func (t *Trie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error { } else { enc, _ := rlp.EncodeToBytes(n) if !ok { - hash = crypto.Keccak256(enc) + hash = hasher.makeHashNode(enc) } proofDb.Put(hash, enc) } @@ -97,14 +96,14 @@ func (t *Trie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error { // If the trie does not contain a value for key, the returned proof 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 *SecureTrie) Prove(key []byte, fromLevel uint, proofDb ethdb.Putter) error { +func (t *SecureTrie) Prove(key []byte, fromLevel uint, proofDb ethdb.KeyValueWriter) error { return t.trie.Prove(key, fromLevel, proofDb) } // 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, proofDb DatabaseReader) (value []byte, nodes int, err error) { +func VerifyProof(rootHash common.Hash, key []byte, proofDb ethdb.KeyValueReader) (value []byte, nodes int, err error) { key = keybytesToHex(key) wantHash := rootHash for i := 0; ; i++ { @@ -112,7 +111,7 @@ func VerifyProof(rootHash common.Hash, key []byte, proofDb DatabaseReader) (valu if buf == nil { return nil, i, fmt.Errorf("proof node %d (hash %064x) missing", i, wantHash) } - n, err := decodeNode(wantHash[:], buf, 0) + n, err := decodeNode(wantHash[:], buf) if err != nil { return nil, i, fmt.Errorf("bad proof node %d: %v", i, err) } diff --git a/trie/proof_test.go b/trie/proof_test.go index 7cfd5dfaf7bb..c488f342c872 100644 --- a/trie/proof_test.go +++ b/trie/proof_test.go @@ -23,9 +23,9 @@ import ( "testing" "time" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb/memorydb" ) func init() { @@ -34,18 +34,18 @@ func init() { // makeProvers creates Merkle trie provers based on different implementations to // test all variations. -func makeProvers(trie *Trie) []func(key []byte) *ethdb.MemDatabase { - var provers []func(key []byte) *ethdb.MemDatabase +func makeProvers(trie *Trie) []func(key []byte) *memorydb.Database { + var provers []func(key []byte) *memorydb.Database // Create a direct trie based Merkle prover - provers = append(provers, func(key []byte) *ethdb.MemDatabase { - proof := ethdb.NewMemDatabase() + provers = append(provers, func(key []byte) *memorydb.Database { + proof := memorydb.New() trie.Prove(key, 0, proof) return proof }) // Create a leaf iterator based Merkle prover - provers = append(provers, func(key []byte) *ethdb.MemDatabase { - proof := ethdb.NewMemDatabase() + provers = append(provers, func(key []byte) *memorydb.Database { + proof := memorydb.New() if it := NewIterator(trie.NodeIterator(key)); it.Next() && bytes.Equal(key, it.Key) { for _, p := range it.Prove() { proof.Put(crypto.Keccak256(p), p) @@ -106,9 +106,14 @@ func TestBadProof(t *testing.T) { if proof == nil { t.Fatalf("prover %d: nil proof", i) } - key := proof.Keys()[mrand.Intn(proof.Len())] + it := proof.NewIterator() + for i, d := 0, mrand.Intn(proof.Len()); i <= d; i++ { + it.Next() + } + key := it.Key() val, _ := proof.Get(key) proof.Delete(key) + it.Release() mutateByte(val) proof.Put(crypto.Keccak256(val), val) @@ -127,7 +132,7 @@ func TestMissingKeyProof(t *testing.T) { updateString(trie, "k", "v") for i, key := range []string{"a", "j", "l", "z"} { - proof := ethdb.NewMemDatabase() + proof := memorydb.New() trie.Prove([]byte(key), 0, proof) if proof.Len() != 1 { @@ -164,8 +169,8 @@ func BenchmarkProve(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { kv := vals[keys[i%len(keys)]] - proofs := ethdb.NewMemDatabase() - if trie.Prove(kv.k, 0, proofs); len(proofs.Keys()) == 0 { + proofs := memorydb.New() + if trie.Prove(kv.k, 0, proofs); proofs.Len() == 0 { b.Fatalf("zero length proof for %x", kv.k) } } @@ -175,10 +180,10 @@ func BenchmarkVerifyProof(b *testing.B) { trie, vals := randomTrie(100) root := trie.Hash() var keys []string - var proofs []*ethdb.MemDatabase + var proofs []*memorydb.Database for k := range vals { keys = append(keys, k) - proof := ethdb.NewMemDatabase() + proof := memorydb.New() trie.Prove([]byte(k), 0, proof) proofs = append(proofs, proof) } diff --git a/trie/secure_trie.go b/trie/secure_trie.go index 9f6d44e2e253..fbc591ed108a 100644 --- a/trie/secure_trie.go +++ b/trie/secure_trie.go @@ -19,8 +19,8 @@ package trie import ( "fmt" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/log" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" ) // SecureTrie wraps a trie with key hashing. In a secure trie, all @@ -51,7 +51,7 @@ type SecureTrie struct { // Loaded nodes are kept around until their 'cache generation' expires. // A new cache generation is created by each call to Commit. // cachelimit sets the number of past cache generations to keep. -func NewSecure(root common.Hash, db *Database, cachelimit uint16) (*SecureTrie, error) { +func NewSecure(root common.Hash, db *Database) (*SecureTrie, error) { if db == nil { panic("trie.NewSecure called without a database") } @@ -59,7 +59,6 @@ func NewSecure(root common.Hash, db *Database, cachelimit uint16) (*SecureTrie, if err != nil { return nil, err } - trie.SetCacheLimit(cachelimit) return &SecureTrie{trie: *trie}, nil } @@ -161,12 +160,6 @@ func (t *SecureTrie) Hash() common.Hash { return t.trie.Hash() } -// Root returns the root hash of SecureTrie. -// Deprecated: use Hash instead. -func (t *SecureTrie) Root() []byte { - return t.trie.Root() -} - // Copy returns a copy of SecureTrie. func (t *SecureTrie) Copy() *SecureTrie { cpy := *t @@ -183,7 +176,7 @@ func (t *SecureTrie) NodeIterator(start []byte) NodeIterator { // The caller must not hold onto the return value because it will become // invalid on the next call to hashKey or secKey. func (t *SecureTrie) hashKey(key []byte) []byte { - h := newHasher(0, 0, nil) + h := newHasher(nil) h.sha.Reset() h.sha.Write(key) buf := h.sha.Sum(t.hashKeyBuf[:0]) diff --git a/trie/secure_trie_test.go b/trie/secure_trie_test.go index 38b05acef0ea..fb6c38ee222b 100644 --- a/trie/secure_trie_test.go +++ b/trie/secure_trie_test.go @@ -22,22 +22,21 @@ import ( "sync" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb/memorydb" ) func newEmptySecure() *SecureTrie { - trie, _ := NewSecure(common.Hash{}, NewDatabase(ethdb.NewMemDatabase()), 0) + trie, _ := NewSecure(common.Hash{}, NewDatabase(memorydb.New())) return trie } // makeTestSecureTrie creates a large enough secure trie for testing. func makeTestSecureTrie() (*Database, *SecureTrie, map[string][]byte) { // Create an empty trie - triedb := NewDatabase(ethdb.NewMemDatabase()) - - trie, _ := NewSecure(common.Hash{}, triedb, 0) + triedb := NewDatabase(memorydb.New()) + trie, _ := NewSecure(common.Hash{}, triedb) // Fill it with some arbitrary data content := make(map[string][]byte) diff --git a/trie/sync.go b/trie/sync.go index 6f4b6e32736e..e5a0c174938b 100644 --- a/trie/sync.go +++ b/trie/sync.go @@ -20,9 +20,9 @@ import ( "errors" "fmt" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/common/prque" - "github.com/nebulaai/nbai-node/ethdb" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/prque" + "github.com/ethereum/go-ethereum/ethdb" ) // ErrNotRequested is returned by the trie sync when it's requested to process a @@ -57,14 +57,12 @@ type SyncResult struct { // persisted data items. type syncMemBatch struct { 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 } // newSyncMemBatch allocates a new memory-buffer for not-yet persisted trie nodes. func newSyncMemBatch() *syncMemBatch { return &syncMemBatch{ batch: make(map[common.Hash][]byte), - order: make([]common.Hash, 0, 256), } } @@ -72,19 +70,21 @@ func newSyncMemBatch() *syncMemBatch { // unknown trie hashes to retrieve, accepts node data associated with said hashes // and reconstructs the trie step by step until all is done. type Sync struct { - database DatabaseReader // Persistent database to check for existing entries + database ethdb.KeyValueReader // Persistent database to check for existing entries membatch *syncMemBatch // Memory buffer to avoid frequent database writes requests map[common.Hash]*request // Pending requests pertaining to a key hash queue *prque.Prque // Priority queue with the pending requests + bloom *SyncBloom // Bloom filter for fast node existence checks } // NewSync creates a new trie data download scheduler. -func NewSync(root common.Hash, database DatabaseReader, callback LeafCallback) *Sync { +func NewSync(root common.Hash, database ethdb.KeyValueReader, callback LeafCallback, bloom *SyncBloom) *Sync { ts := &Sync{ database: database, membatch: newSyncMemBatch(), requests: make(map[common.Hash]*request), queue: prque.New(nil), + bloom: bloom, } ts.AddSubTrie(root, 0, common.Hash{}, callback) return ts @@ -99,10 +99,14 @@ func (s *Sync) AddSubTrie(root common.Hash, depth int, parent common.Hash, callb if _, ok := s.membatch.batch[root]; ok { return } - key := root.Bytes() - blob, _ := s.database.Get(key) - if local, err := decodeNode(key, blob, 0); local != nil && err == nil { - return + if s.bloom.Contains(root[:]) { + // Bloom filter says this might be a duplicate, double check + blob, _ := s.database.Get(root[:]) + if local, err := decodeNode(root[:], blob); local != nil && err == nil { + return + } + // False positive, bump fault meter + bloomFaultMeter.Mark(1) } // Assemble the new sub-trie sync request req := &request{ @@ -134,8 +138,13 @@ func (s *Sync) AddRawEntry(hash common.Hash, depth int, parent common.Hash) { if _, ok := s.membatch.batch[hash]; ok { return } - if ok, _ := s.database.Has(hash.Bytes()); ok { - return + if s.bloom.Contains(hash[:]) { + // Bloom filter says this might be a duplicate, double check + if ok, _ := s.database.Has(hash[:]); ok { + return + } + // False positive, bump fault meter + bloomFaultMeter.Mark(1) } // Assemble the new sub-trie sync request req := &request{ @@ -157,7 +166,7 @@ func (s *Sync) AddRawEntry(hash common.Hash, depth int, parent common.Hash) { // Missing retrieves the known missing nodes from the trie for retrieval. func (s *Sync) Missing(max int) []common.Hash { - requests := []common.Hash{} + var requests []common.Hash for !s.queue.Empty() && (max == 0 || len(requests) < max) { requests = append(requests, s.queue.PopItem().(common.Hash)) } @@ -187,7 +196,7 @@ func (s *Sync) Process(results []SyncResult) (bool, int, error) { continue } // Decode the node data content and update the request - node, err := decodeNode(item.Hash[:], item.Data, 0) + node, err := decodeNode(item.Hash[:], item.Data) if err != nil { return committed, i, err } @@ -212,19 +221,18 @@ func (s *Sync) Process(results []SyncResult) (bool, int, error) { } // Commit flushes the data stored in the internal membatch out to persistent -// storage, returning the number of items written and any occurred error. -func (s *Sync) Commit(dbw ethdb.Putter) (int, error) { +// storage, returning any occurred error. +func (s *Sync) Commit(dbw ethdb.Batch) error { // Dump the membatch into a database dbw - for i, key := range s.membatch.order { - if err := dbw.Put(key[:], s.membatch.batch[key]); err != nil { - return i, err + for key, value := range s.membatch.batch { + if err := dbw.Put(key[:], value); err != nil { + return err } + s.bloom.Add(key[:]) } - written := len(s.membatch.order) - // Drop the membatch data and return s.membatch = newSyncMemBatch() - return written, nil + return nil } // Pending returns the number of state entries currently pending for download. @@ -254,7 +262,7 @@ func (s *Sync) children(req *request, object node) ([]*request, error) { node node depth int } - children := []child{} + var children []child switch node := (object).(type) { case *shortNode: @@ -292,8 +300,13 @@ func (s *Sync) children(req *request, object node) ([]*request, error) { if _, ok := s.membatch.batch[hash]; ok { continue } - if ok, _ := s.database.Has(node); ok { - continue + if s.bloom.Contains(node) { + // Bloom filter says this might be a duplicate, double check + if ok, _ := s.database.Has(node); ok { + continue + } + // False positive, bump fault meter + bloomFaultMeter.Mark(1) } // Locally unknown node, schedule for retrieval requests = append(requests, &request{ @@ -313,7 +326,6 @@ func (s *Sync) children(req *request, object node) ([]*request, error) { func (s *Sync) commit(req *request) (err error) { // Write the node content to the membatch s.membatch.batch[req.hash] = req.data - s.membatch.order = append(s.membatch.order, req.hash) delete(s.requests, req.hash) diff --git a/trie/sync_bloom.go b/trie/sync_bloom.go new file mode 100644 index 000000000000..2182d1c43772 --- /dev/null +++ b/trie/sync_bloom.go @@ -0,0 +1,207 @@ +// Copyright 2019 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 trie + +import ( + "encoding/binary" + "fmt" + "math" + "sync" + "sync/atomic" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/metrics" + "github.com/steakknife/bloomfilter" +) + +var ( + bloomAddMeter = metrics.NewRegisteredMeter("trie/bloom/add", nil) + bloomLoadMeter = metrics.NewRegisteredMeter("trie/bloom/load", nil) + bloomTestMeter = metrics.NewRegisteredMeter("trie/bloom/test", nil) + bloomMissMeter = metrics.NewRegisteredMeter("trie/bloom/miss", nil) + bloomFaultMeter = metrics.NewRegisteredMeter("trie/bloom/fault", nil) + bloomErrorGauge = metrics.NewRegisteredGauge("trie/bloom/error", nil) +) + +// syncBloomHasher is a wrapper around a byte blob to satisfy the interface API +// requirements of the bloom library used. It's used to convert a trie hash into +// a 64 bit mini hash. +type syncBloomHasher []byte + +func (f syncBloomHasher) Write(p []byte) (n int, err error) { panic("not implemented") } +func (f syncBloomHasher) Sum(b []byte) []byte { panic("not implemented") } +func (f syncBloomHasher) Reset() { panic("not implemented") } +func (f syncBloomHasher) BlockSize() int { panic("not implemented") } +func (f syncBloomHasher) Size() int { return 8 } +func (f syncBloomHasher) Sum64() uint64 { return binary.BigEndian.Uint64(f) } + +// SyncBloom is a bloom filter used during fast sync to quickly decide if a trie +// node already exists on disk or not. It self populates from the provided disk +// database on creation in a background thread and will only start returning live +// results once that's finished. +type SyncBloom struct { + bloom *bloomfilter.Filter + inited uint32 + closer sync.Once + closed uint32 + pend sync.WaitGroup +} + +// NewSyncBloom creates a new bloom filter of the given size (in megabytes) and +// initializes it from the database. The bloom is hard coded to use 3 filters. +func NewSyncBloom(memory uint64, database ethdb.Iteratee) *SyncBloom { + // Create the bloom filter to track known trie nodes + bloom, err := bloomfilter.New(memory*1024*1024*8, 3) + if err != nil { + panic(fmt.Sprintf("failed to create bloom: %v", err)) + } + log.Info("Allocated fast sync bloom", "size", common.StorageSize(memory*1024*1024)) + + // Assemble the fast sync bloom and init it from previous sessions + b := &SyncBloom{ + bloom: bloom, + } + b.pend.Add(2) + go func() { + defer b.pend.Done() + b.init(database) + }() + go func() { + defer b.pend.Done() + b.meter() + }() + return b +} + +// init iterates over the database, pushing every trie hash into the bloom filter. +func (b *SyncBloom) init(database ethdb.Iteratee) { + // Iterate over the database, but restart every now and again to avoid holding + // a persistent snapshot since fast sync can push a ton of data concurrently, + // bloating the disk. + // + // Note, this is fine, because everything inserted into leveldb by fast sync is + // also pushed into the bloom directly, so we're not missing anything when the + // iterator is swapped out for a new one. + it := database.NewIterator() + + var ( + start = time.Now() + swap = time.Now() + ) + for it.Next() && atomic.LoadUint32(&b.closed) == 0 { + // If the database entry is a trie node, add it to the bloom + if key := it.Key(); len(key) == common.HashLength { + b.bloom.Add(syncBloomHasher(key)) + bloomLoadMeter.Mark(1) + } + // If enough time elapsed since the last iterator swap, restart + if time.Since(swap) > 8*time.Second { + key := common.CopyBytes(it.Key()) + + it.Release() + it = database.NewIteratorWithStart(key) + + log.Info("Initializing fast sync bloom", "items", b.bloom.N(), "errorrate", b.errorRate(), "elapsed", common.PrettyDuration(time.Since(start))) + swap = time.Now() + } + } + it.Release() + + // Mark the bloom filter inited and return + log.Info("Initialized fast sync bloom", "items", b.bloom.N(), "errorrate", b.errorRate(), "elapsed", common.PrettyDuration(time.Since(start))) + atomic.StoreUint32(&b.inited, 1) +} + +// meter periodically recalculates the false positive error rate of the bloom +// filter and reports it in a metric. +func (b *SyncBloom) meter() { + for { + // Report the current error ration. No floats, lame, scale it up. + bloomErrorGauge.Update(int64(b.errorRate() * 100000)) + + // Wait one second, but check termination more frequently + for i := 0; i < 10; i++ { + if atomic.LoadUint32(&b.closed) == 1 { + return + } + time.Sleep(100 * time.Millisecond) + } + } +} + +// Close terminates any background initializer still running and releases all the +// memory allocated for the bloom. +func (b *SyncBloom) Close() error { + b.closer.Do(func() { + // Ensure the initializer is stopped + atomic.StoreUint32(&b.closed, 1) + b.pend.Wait() + + // Wipe the bloom, but mark it "uninited" just in case someone attempts an access + log.Info("Deallocated fast sync bloom", "items", b.bloom.N(), "errorrate", b.errorRate()) + + atomic.StoreUint32(&b.inited, 0) + b.bloom = nil + }) + return nil +} + +// Add inserts a new trie node hash into the bloom filter. +func (b *SyncBloom) Add(hash []byte) { + if atomic.LoadUint32(&b.closed) == 1 { + return + } + b.bloom.Add(syncBloomHasher(hash)) + bloomAddMeter.Mark(1) +} + +// Contains tests if the bloom filter contains the given hash: +// - false: the bloom definitely does not contain hash +// - true: the bloom maybe contains hash +// +// While the bloom is being initialized, any query will return true. +func (b *SyncBloom) Contains(hash []byte) bool { + bloomTestMeter.Mark(1) + if atomic.LoadUint32(&b.inited) == 0 { + // We didn't load all the trie nodes from the previous run of Geth yet. As + // such, we can't say for sure if a hash is not present for anything. Until + // the init is done, we're faking "possible presence" for everything. + return true + } + // Bloom initialized, check the real one and report any successful misses + maybe := b.bloom.Contains(syncBloomHasher(hash)) + if !maybe { + bloomMissMeter.Mark(1) + } + return maybe +} + +// errorRate calculates the probability of a random containment test returning a +// false positive. +// +// We're calculating it ourselves because the bloom library we used missed a +// parentheses in the formula and calculates it wrong. And it's discontinued... +func (b *SyncBloom) errorRate() float64 { + k := float64(b.bloom.K()) + n := float64(b.bloom.N()) + m := float64(b.bloom.M()) + + return math.Pow(1.0-math.Exp((-k)*(n+0.5)/(m-1)), k) +} diff --git a/trie/sync_test.go b/trie/sync_test.go index 8e9baa711161..6025b87fccba 100644 --- a/trie/sync_test.go +++ b/trie/sync_test.go @@ -20,14 +20,14 @@ import ( "bytes" "testing" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/ethdb" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethdb/memorydb" ) // makeTestTrie create a sample test trie to test node-wise reconstruction. func makeTestTrie() (*Database, *Trie, map[string][]byte) { // Create an empty trie - triedb := NewDatabase(ethdb.NewMemDatabase()) + triedb := NewDatabase(memorydb.New()) trie, _ := New(common.Hash{}, triedb) // Fill it with some arbitrary data @@ -88,13 +88,13 @@ func checkTrieConsistency(db *Database, root common.Hash) error { // Tests that an empty trie is not scheduled for syncing. func TestEmptySync(t *testing.T) { - dbA := NewDatabase(ethdb.NewMemDatabase()) - dbB := NewDatabase(ethdb.NewMemDatabase()) + dbA := NewDatabase(memorydb.New()) + dbB := NewDatabase(memorydb.New()) emptyA, _ := New(common.Hash{}, dbA) emptyB, _ := New(emptyRoot, dbB) for i, trie := range []*Trie{emptyA, emptyB} { - if req := NewSync(trie.Hash(), ethdb.NewMemDatabase(), nil).Missing(1); len(req) != 0 { + if req := NewSync(trie.Hash(), memorydb.New(), nil, NewSyncBloom(1, memorydb.New())).Missing(1); len(req) != 0 { t.Errorf("test %d: content requested for empty trie: %v", i, req) } } @@ -105,16 +105,16 @@ func TestEmptySync(t *testing.T) { func TestIterativeSyncIndividual(t *testing.T) { testIterativeSync(t, 1) } func TestIterativeSyncBatched(t *testing.T) { testIterativeSync(t, 100) } -func testIterativeSync(t *testing.T, batch int) { +func testIterativeSync(t *testing.T, count int) { // Create a random trie to copy srcDb, srcTrie, srcData := makeTestTrie() // Create a destination trie and sync with the scheduler - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil) + sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) - queue := append([]common.Hash{}, sched.Missing(batch)...) + queue := append([]common.Hash{}, sched.Missing(count)...) for len(queue) > 0 { results := make([]SyncResult, len(queue)) for i, hash := range queue { @@ -127,13 +127,15 @@ func testIterativeSync(t *testing.T, batch int) { if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } - if index, err := sched.Commit(diskdb); err != nil { - t.Fatalf("failed to commit data #%d: %v", index, err) + batch := diskdb.NewBatch() + if err := sched.Commit(batch); err != nil { + t.Fatalf("failed to commit data: %v", err) } - queue = append(queue[:0], sched.Missing(batch)...) + batch.Write() + queue = append(queue[:0], sched.Missing(count)...) } // Cross check that the two tries are in sync - checkTrieContents(t, triedb, srcTrie.Root(), srcData) + checkTrieContents(t, triedb, srcTrie.Hash().Bytes(), srcData) } // Tests that the trie scheduler can correctly reconstruct the state even if only @@ -143,9 +145,9 @@ func TestIterativeDelayedSync(t *testing.T) { srcDb, srcTrie, srcData := makeTestTrie() // Create a destination trie and sync with the scheduler - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil) + sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) queue := append([]common.Hash{}, sched.Missing(10000)...) for len(queue) > 0 { @@ -161,13 +163,15 @@ func TestIterativeDelayedSync(t *testing.T) { if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } - if index, err := sched.Commit(diskdb); err != nil { - t.Fatalf("failed to commit data #%d: %v", index, err) + batch := diskdb.NewBatch() + if err := sched.Commit(batch); err != nil { + t.Fatalf("failed to commit data: %v", err) } + batch.Write() queue = append(queue[len(results):], sched.Missing(10000)...) } // Cross check that the two tries are in sync - checkTrieContents(t, triedb, srcTrie.Root(), srcData) + checkTrieContents(t, triedb, srcTrie.Hash().Bytes(), srcData) } // Tests that given a root hash, a trie can sync iteratively on a single thread, @@ -176,17 +180,17 @@ func TestIterativeDelayedSync(t *testing.T) { func TestIterativeRandomSyncIndividual(t *testing.T) { testIterativeRandomSync(t, 1) } func TestIterativeRandomSyncBatched(t *testing.T) { testIterativeRandomSync(t, 100) } -func testIterativeRandomSync(t *testing.T, batch int) { +func testIterativeRandomSync(t *testing.T, count int) { // Create a random trie to copy srcDb, srcTrie, srcData := makeTestTrie() // Create a destination trie and sync with the scheduler - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil) + sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) queue := make(map[common.Hash]struct{}) - for _, hash := range sched.Missing(batch) { + for _, hash := range sched.Missing(count) { queue[hash] = struct{}{} } for len(queue) > 0 { @@ -203,16 +207,18 @@ func testIterativeRandomSync(t *testing.T, batch int) { if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } - if index, err := sched.Commit(diskdb); err != nil { - t.Fatalf("failed to commit data #%d: %v", index, err) + batch := diskdb.NewBatch() + if err := sched.Commit(batch); err != nil { + t.Fatalf("failed to commit data: %v", err) } + batch.Write() queue = make(map[common.Hash]struct{}) - for _, hash := range sched.Missing(batch) { + for _, hash := range sched.Missing(count) { queue[hash] = struct{}{} } } // Cross check that the two tries are in sync - checkTrieContents(t, triedb, srcTrie.Root(), srcData) + checkTrieContents(t, triedb, srcTrie.Hash().Bytes(), srcData) } // Tests that the trie scheduler can correctly reconstruct the state even if only @@ -222,9 +228,9 @@ func TestIterativeRandomDelayedSync(t *testing.T) { srcDb, srcTrie, srcData := makeTestTrie() // Create a destination trie and sync with the scheduler - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil) + sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) queue := make(map[common.Hash]struct{}) for _, hash := range sched.Missing(10000) { @@ -248,9 +254,11 @@ func TestIterativeRandomDelayedSync(t *testing.T) { if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } - if index, err := sched.Commit(diskdb); err != nil { - t.Fatalf("failed to commit data #%d: %v", index, err) + batch := diskdb.NewBatch() + if err := sched.Commit(batch); err != nil { + t.Fatalf("failed to commit data: %v", err) } + batch.Write() for _, result := range results { delete(queue, result.Hash) } @@ -259,7 +267,7 @@ func TestIterativeRandomDelayedSync(t *testing.T) { } } // Cross check that the two tries are in sync - checkTrieContents(t, triedb, srcTrie.Root(), srcData) + checkTrieContents(t, triedb, srcTrie.Hash().Bytes(), srcData) } // Tests that a trie sync will not request nodes multiple times, even if they @@ -269,9 +277,9 @@ func TestDuplicateAvoidanceSync(t *testing.T) { srcDb, srcTrie, srcData := makeTestTrie() // Create a destination trie and sync with the scheduler - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil) + sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) queue := append([]common.Hash{}, sched.Missing(0)...) requested := make(map[common.Hash]struct{}) @@ -293,13 +301,15 @@ func TestDuplicateAvoidanceSync(t *testing.T) { if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } - if index, err := sched.Commit(diskdb); err != nil { - t.Fatalf("failed to commit data #%d: %v", index, err) + batch := diskdb.NewBatch() + if err := sched.Commit(batch); err != nil { + t.Fatalf("failed to commit data: %v", err) } + batch.Write() queue = append(queue[:0], sched.Missing(0)...) } // Cross check that the two tries are in sync - checkTrieContents(t, triedb, srcTrie.Root(), srcData) + checkTrieContents(t, triedb, srcTrie.Hash().Bytes(), srcData) } // Tests that at any point in time during a sync, only complete sub-tries are in @@ -309,11 +319,11 @@ func TestIncompleteSync(t *testing.T) { srcDb, srcTrie, _ := makeTestTrie() // Create a destination trie and sync with the scheduler - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) - sched := NewSync(srcTrie.Hash(), diskdb, nil) + sched := NewSync(srcTrie.Hash(), diskdb, nil, NewSyncBloom(1, diskdb)) - added := []common.Hash{} + var added []common.Hash queue := append([]common.Hash{}, sched.Missing(1)...) for len(queue) > 0 { // Fetch a batch of trie nodes @@ -329,9 +339,11 @@ func TestIncompleteSync(t *testing.T) { if _, index, err := sched.Process(results); err != nil { t.Fatalf("failed to process result #%d: %v", index, err) } - if index, err := sched.Commit(diskdb); err != nil { - t.Fatalf("failed to commit data #%d: %v", index, err) + batch := diskdb.NewBatch() + if err := sched.Commit(batch); err != nil { + t.Fatalf("failed to commit data: %v", err) } + batch.Write() for _, result := range results { added = append(added, result.Hash) } diff --git a/trie/trie.go b/trie/trie.go index 007ba21f8315..920e331fd62f 100644 --- a/trie/trie.go +++ b/trie/trie.go @@ -21,10 +21,9 @@ import ( "bytes" "fmt" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/log" - "github.com/nebulaai/nbai-node/metrics" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" ) var ( @@ -35,25 +34,6 @@ var ( emptyState = crypto.Keccak256Hash(nil) ) -var ( - cacheMissCounter = metrics.NewRegisteredCounter("trie/cachemiss", nil) - cacheUnloadCounter = metrics.NewRegisteredCounter("trie/cacheunload", nil) -) - -// CacheMisses retrieves a global counter measuring the number of cache misses -// the trie had since process startup. This isn't useful for anything apart from -// trie debugging purposes. -func CacheMisses() int64 { - return cacheMissCounter.Count() -} - -// CacheUnloads retrieves a global counter measuring the number of cache unloads -// the trie did since process startup. This isn't useful for anything apart from -// trie debugging purposes. -func CacheUnloads() int64 { - return cacheUnloadCounter.Count() -} - // LeafCallback is a callback type invoked when a trie operation reaches a leaf // node. It's used by state sync and commit to allow handling external references // between account and storage tries. @@ -67,23 +47,11 @@ type LeafCallback func(leaf []byte, parent common.Hash) error type Trie struct { db *Database root node - - // Cache generation values. - // cachegen increases by one with each commit operation. - // new nodes are tagged with the current generation and unloaded - // when their generation is older than than cachegen-cachelimit. - cachegen, cachelimit uint16 -} - -// SetCacheLimit sets the number of 'cache generations' to keep. -// A cache generation is created by a call to Commit. -func (t *Trie) SetCacheLimit(l uint16) { - t.cachelimit = l } // newFlag returns the cache flag value for a newly created node. func (t *Trie) newFlag() nodeFlag { - return nodeFlag{dirty: true, gen: t.cachegen} + return nodeFlag{dirty: true} } // New creates a trie with an existing root node from db. @@ -152,14 +120,12 @@ func (t *Trie) tryGet(origNode node, key []byte, pos int) (value []byte, newnode if err == nil && didResolve { n = n.copy() n.Val = newnode - n.flags.gen = t.cachegen } return value, n, didResolve, err case *fullNode: value, newnode, didResolve, err = t.tryGet(n.Children[key[pos]], key, pos+1) if err == nil && didResolve { n = n.copy() - n.flags.gen = t.cachegen n.Children[key[pos]] = newnode } return value, n, didResolve, err @@ -428,19 +394,13 @@ func (t *Trie) resolve(n node, prefix []byte) (node, error) { } func (t *Trie) resolveHash(n hashNode, prefix []byte) (node, error) { - cacheMissCounter.Inc(1) - hash := common.BytesToHash(n) - if node := t.db.node(hash, t.cachegen); node != nil { + if node := t.db.node(hash); node != nil { return node, nil } return nil, &MissingNodeError{NodeHash: hash, Path: prefix} } -// Root returns the root hash of the trie. -// Deprecated: use Hash instead. -func (t *Trie) Root() []byte { return t.Hash().Bytes() } - // Hash returns the root hash of the trie. It does not write to the // database and can be used even if the trie doesn't have one. func (t *Trie) Hash() common.Hash { @@ -460,7 +420,6 @@ func (t *Trie) Commit(onleaf LeafCallback) (root common.Hash, err error) { return common.Hash{}, err } t.root = cached - t.cachegen++ return common.BytesToHash(hash.(hashNode)), nil } @@ -468,7 +427,7 @@ func (t *Trie) hashRoot(db *Database, onleaf LeafCallback) (node, node, error) { if t.root == nil { return hashNode(emptyRoot.Bytes()), nil, nil } - h := newHasher(t.cachegen, t.cachelimit, onleaf) + h := newHasher(onleaf) defer returnHasherToPool(h) return h.hash(t.root, db, true) } diff --git a/trie/trie_test.go b/trie/trie_test.go index 486df7a014b2..e53ac568e9c3 100644 --- a/trie/trie_test.go +++ b/trie/trie_test.go @@ -19,7 +19,6 @@ package trie import ( "bytes" "encoding/binary" - "errors" "fmt" "io/ioutil" "math/big" @@ -30,10 +29,11 @@ import ( "testing/quick" "github.com/davecgh/go-spew/spew" - "github.com/nebulaai/nbai-node/common" - "github.com/nebulaai/nbai-node/crypto" - "github.com/nebulaai/nbai-node/ethdb" - "github.com/nebulaai/nbai-node/rlp" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethdb/leveldb" + "github.com/ethereum/go-ethereum/ethdb/memorydb" + "github.com/ethereum/go-ethereum/rlp" ) func init() { @@ -43,7 +43,7 @@ func init() { // Used for testing func newEmpty() *Trie { - trie, _ := New(common.Hash{}, NewDatabase(ethdb.NewMemDatabase())) + trie, _ := New(common.Hash{}, NewDatabase(memorydb.New())) return trie } @@ -51,7 +51,7 @@ func TestEmptyTrie(t *testing.T) { var trie Trie res := trie.Hash() exp := emptyRoot - if res != common.Hash(exp) { + if res != exp { t.Errorf("expected %x got %x", exp, res) } } @@ -67,7 +67,7 @@ func TestNull(t *testing.T) { } func TestMissingRoot(t *testing.T) { - trie, err := New(common.HexToHash("0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"), NewDatabase(ethdb.NewMemDatabase())) + trie, err := New(common.HexToHash("0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"), NewDatabase(memorydb.New())) if trie != nil { t.Error("New returned non-nil trie for invalid root") } @@ -80,7 +80,7 @@ func TestMissingNodeDisk(t *testing.T) { testMissingNode(t, false) } func TestMissingNodeMemonly(t *testing.T) { testMissingNode(t, true) } func testMissingNode(t *testing.T, memonly bool) { - diskdb := ethdb.NewMemDatabase() + diskdb := memorydb.New() triedb := NewDatabase(diskdb) trie, _ := New(common.Hash{}, triedb) @@ -316,48 +316,6 @@ func TestLargeValue(t *testing.T) { trie.Hash() } -type countingDB struct { - ethdb.Database - gets map[string]int -} - -func (db *countingDB) Get(key []byte) ([]byte, error) { - db.gets[string(key)]++ - return db.Database.Get(key) -} - -// TestCacheUnload checks that decoded nodes are unloaded after a -// certain number of commit operations. -func TestCacheUnload(t *testing.T) { - // Create test trie with two branches. - trie := newEmpty() - key1 := "---------------------------------" - key2 := "---some other branch" - updateString(trie, key1, "this is the branch of key1.") - updateString(trie, key2, "this is the branch of key2.") - - root, _ := trie.Commit(nil) - trie.db.Commit(root, true) - - // Commit the trie repeatedly and access key1. - // The branch containing it is loaded from DB exactly two times: - // in the 0th and 6th iteration. - diskdb := &countingDB{Database: trie.db.diskdb, gets: make(map[string]int)} - triedb := NewDatabase(diskdb) - trie, _ = New(root, triedb) - trie.SetCacheLimit(5) - for i := 0; i < 12; i++ { - getString(trie, key1) - trie.Commit(nil) - } - // Check that it got loaded two times. - for dbkey, count := range diskdb.gets { - if count != 2 { - t.Errorf("db key %x loaded %d times, want %d times", []byte(dbkey), count, 2) - } - } -} - // randTest performs random trie operations. // Instances of this test are created by Generate. type randTest []randTestStep @@ -377,7 +335,6 @@ const ( opHash opReset opItercheckhash - opCheckCacheInvariant opMax // boundary value, not an actual op ) @@ -412,7 +369,7 @@ func (randTest) Generate(r *rand.Rand, size int) reflect.Value { } func runRandTest(rt randTest) bool { - triedb := NewDatabase(ethdb.NewMemDatabase()) + triedb := NewDatabase(memorydb.New()) tr, _ := New(common.Hash{}, triedb) values := make(map[string]string) // tracks content of the trie @@ -456,8 +413,6 @@ func runRandTest(rt randTest) bool { if tr.Hash() != checktr.Hash() { rt[i].err = fmt.Errorf("hash mismatch in opItercheckhash") } - case opCheckCacheInvariant: - rt[i].err = checkCacheInvariant(tr.root, nil, tr.cachegen, false, 0) } // Abort the test on error. if rt[i].err != nil { @@ -467,40 +422,6 @@ func runRandTest(rt randTest) bool { return true } -func checkCacheInvariant(n, parent node, parentCachegen uint16, parentDirty bool, depth int) error { - var children []node - var flag nodeFlag - switch n := n.(type) { - case *shortNode: - flag = n.flags - children = []node{n.Val} - case *fullNode: - flag = n.flags - children = n.Children[:] - default: - return nil - } - - errorf := func(format string, args ...interface{}) error { - msg := fmt.Sprintf(format, args...) - msg += fmt.Sprintf("\nat depth %d node %s", depth, spew.Sdump(n)) - msg += fmt.Sprintf("parent: %s", spew.Sdump(parent)) - return errors.New(msg) - } - if flag.gen > parentCachegen { - return errorf("cache invariant violation: %d > %d\n", flag.gen, parentCachegen) - } - if depth > 0 && !parentDirty && flag.dirty { - return errorf("cache invariant violation: %d > %d\n", flag.gen, parentCachegen) - } - for _, child := range children { - if err := checkCacheInvariant(child, n, flag.gen, flag.dirty, depth+1); err != nil { - return err - } - } - return nil -} - func TestRandom(t *testing.T) { if err := quick.Check(runRandTest, nil); err != nil { if cerr, ok := err.(*quick.CheckError); ok { @@ -540,7 +461,7 @@ func benchGet(b *testing.B, commit bool) { b.StopTimer() if commit { - ldb := trie.db.diskdb.(*ethdb.LDBDatabase) + ldb := trie.db.diskdb.(*leveldb.Database) ldb.Close() os.RemoveAll(ldb.Path()) } @@ -596,7 +517,7 @@ func tempDB() (string, *Database) { if err != nil { panic(fmt.Sprintf("can't create temporary directory: %v", err)) } - diskdb, err := ethdb.NewLDBDatabase(dir, 256, 0) + diskdb, err := leveldb.New(dir, 256, 0, "") if err != nil { panic(fmt.Sprintf("can't create temporary database: %v", err)) } @@ -614,3 +535,16 @@ func updateString(trie *Trie, k, v string) { func deleteString(trie *Trie, k string) { trie.Delete([]byte(k)) } + +func TestDecodeNode(t *testing.T) { + t.Parallel() + var ( + hash = make([]byte, 20) + elems = make([]byte, 20) + ) + for i := 0; i < 5000000; i++ { + rand.Read(hash) + rand.Read(elems) + decodeNode(hash, elems) + } +} diff --git a/vendor/bazil.org/fuse/LICENSE b/vendor/bazil.org/fuse/LICENSE deleted file mode 100644 index 4ac7cd838960..000000000000 --- a/vendor/bazil.org/fuse/LICENSE +++ /dev/null @@ -1,93 +0,0 @@ -Copyright (c) 2013-2015 Tommi Virtanen. -Copyright (c) 2009, 2011, 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. - - - -The following included software components have additional copyright -notices and license terms that may differ from the above. - - -File fuse.go: - -// Adapted from Plan 9 from User Space's src/cmd/9pfuse/fuse.c, -// which carries this notice: -// -// The files in this directory are subject to the following license. -// -// The author of this software is Russ Cox. -// -// Copyright (c) 2006 Russ Cox -// -// Permission to use, copy, modify, and distribute this software for any -// purpose without fee is hereby granted, provided that this entire notice -// is included in all copies of any software which is or includes a copy -// or modification of this software and in all copies of the supporting -// documentation for such software. -// -// THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED -// WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION OR WARRANTY -// OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS SOFTWARE OR ITS -// FITNESS FOR ANY PARTICULAR PURPOSE. - - -File fuse_kernel.go: - -// Derived from FUSE's fuse_kernel.h -/* - This file defines the kernel interface of FUSE - Copyright (C) 2001-2007 Miklos Szeredi - - - This -- and only this -- header file may also be distributed under - the terms of the BSD Licence as follows: - - Copyright (C) 2001-2007 Miklos Szeredi. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. 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. - - THIS SOFTWARE IS PROVIDED BY AUTHOR 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 AUTHOR 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/bazil.org/fuse/README.md b/vendor/bazil.org/fuse/README.md deleted file mode 100644 index 8c6d556ee38d..000000000000 --- a/vendor/bazil.org/fuse/README.md +++ /dev/null @@ -1,23 +0,0 @@ -bazil.org/fuse -- Filesystems in Go -=================================== - -`bazil.org/fuse` is a Go library for writing FUSE userspace -filesystems. - -It is a from-scratch implementation of the kernel-userspace -communication protocol, and does not use the C library from the -project called FUSE. `bazil.org/fuse` embraces Go fully for safety and -ease of programming. - -Here’s how to get going: - - go get bazil.org/fuse - -Website: http://bazil.org/fuse/ - -Github repository: https://github.com/bazil/fuse - -API docs: http://godoc.org/bazil.org/fuse - -Our thanks to Russ Cox for his fuse library, which this project is -based on. diff --git a/vendor/bazil.org/fuse/buffer.go b/vendor/bazil.org/fuse/buffer.go deleted file mode 100644 index bb1d2b77696a..000000000000 --- a/vendor/bazil.org/fuse/buffer.go +++ /dev/null @@ -1,35 +0,0 @@ -package fuse - -import "unsafe" - -// buffer provides a mechanism for constructing a message from -// multiple segments. -type buffer []byte - -// alloc allocates size bytes and returns a pointer to the new -// segment. -func (w *buffer) alloc(size uintptr) unsafe.Pointer { - s := int(size) - if len(*w)+s > cap(*w) { - old := *w - *w = make([]byte, len(*w), 2*cap(*w)+s) - copy(*w, old) - } - l := len(*w) - *w = (*w)[:l+s] - return unsafe.Pointer(&(*w)[l]) -} - -// reset clears out the contents of the buffer. -func (w *buffer) reset() { - for i := range (*w)[:cap(*w)] { - (*w)[i] = 0 - } - *w = (*w)[:0] -} - -func newBuffer(extra uintptr) buffer { - const hdrSize = unsafe.Sizeof(outHeader{}) - buf := make(buffer, hdrSize, hdrSize+extra) - return buf -} diff --git a/vendor/bazil.org/fuse/debug.go b/vendor/bazil.org/fuse/debug.go deleted file mode 100644 index be9f900d5e1a..000000000000 --- a/vendor/bazil.org/fuse/debug.go +++ /dev/null @@ -1,21 +0,0 @@ -package fuse - -import ( - "runtime" -) - -func stack() string { - buf := make([]byte, 1024) - return string(buf[:runtime.Stack(buf, false)]) -} - -func nop(msg interface{}) {} - -// Debug is called to output debug messages, including protocol -// traces. The default behavior is to do nothing. -// -// The messages have human-friendly string representations and are -// safe to marshal to JSON. -// -// Implementations must not retain msg. -var Debug func(msg interface{}) = nop diff --git a/vendor/bazil.org/fuse/error_darwin.go b/vendor/bazil.org/fuse/error_darwin.go deleted file mode 100644 index a3fb89ca29f4..000000000000 --- a/vendor/bazil.org/fuse/error_darwin.go +++ /dev/null @@ -1,17 +0,0 @@ -package fuse - -import ( - "syscall" -) - -const ( - ENOATTR = Errno(syscall.ENOATTR) -) - -const ( - errNoXattr = ENOATTR -) - -func init() { - errnoNames[errNoXattr] = "ENOATTR" -} diff --git a/vendor/bazil.org/fuse/error_freebsd.go b/vendor/bazil.org/fuse/error_freebsd.go deleted file mode 100644 index c6ea6d6e71ff..000000000000 --- a/vendor/bazil.org/fuse/error_freebsd.go +++ /dev/null @@ -1,15 +0,0 @@ -package fuse - -import "syscall" - -const ( - ENOATTR = Errno(syscall.ENOATTR) -) - -const ( - errNoXattr = ENOATTR -) - -func init() { - errnoNames[errNoXattr] = "ENOATTR" -} diff --git a/vendor/bazil.org/fuse/error_linux.go b/vendor/bazil.org/fuse/error_linux.go deleted file mode 100644 index 6f113e71ed23..000000000000 --- a/vendor/bazil.org/fuse/error_linux.go +++ /dev/null @@ -1,17 +0,0 @@ -package fuse - -import ( - "syscall" -) - -const ( - ENODATA = Errno(syscall.ENODATA) -) - -const ( - errNoXattr = ENODATA -) - -func init() { - errnoNames[errNoXattr] = "ENODATA" -} diff --git a/vendor/bazil.org/fuse/error_std.go b/vendor/bazil.org/fuse/error_std.go deleted file mode 100644 index 398f43fbf694..000000000000 --- a/vendor/bazil.org/fuse/error_std.go +++ /dev/null @@ -1,31 +0,0 @@ -package fuse - -// There is very little commonality in extended attribute errors -// across platforms. -// -// getxattr return value for "extended attribute does not exist" is -// ENOATTR on OS X, and ENODATA on Linux and apparently at least -// NetBSD. There may be a #define ENOATTR on Linux too, but the value -// is ENODATA in the actual syscalls. FreeBSD and OpenBSD have no -// ENODATA, only ENOATTR. ENOATTR is not in any of the standards, -// ENODATA exists but is only used for STREAMs. -// -// Each platform will define it a errNoXattr constant, and this file -// will enforce that it implements the right interfaces and hide the -// implementation. -// -// https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/getxattr.2.html -// http://mail-index.netbsd.org/tech-kern/2012/04/30/msg013090.html -// http://mail-index.netbsd.org/tech-kern/2012/04/30/msg013097.html -// http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html -// http://www.freebsd.org/cgi/man.cgi?query=extattr_get_file&sektion=2 -// http://nixdoc.net/man-pages/openbsd/man2/extattr_get_file.2.html - -// ErrNoXattr is a platform-independent error value meaning the -// extended attribute was not found. It can be used to respond to -// GetxattrRequest and such. -const ErrNoXattr = errNoXattr - -var _ error = ErrNoXattr -var _ Errno = ErrNoXattr -var _ ErrorNumber = ErrNoXattr diff --git a/vendor/bazil.org/fuse/fs/serve.go b/vendor/bazil.org/fuse/fs/serve.go deleted file mode 100644 index e9fc56590fd8..000000000000 --- a/vendor/bazil.org/fuse/fs/serve.go +++ /dev/null @@ -1,1568 +0,0 @@ -// FUSE service loop, for servers that wish to use it. - -package fs // import "bazil.org/fuse/fs" - -import ( - "encoding/binary" - "fmt" - "hash/fnv" - "io" - "log" - "reflect" - "runtime" - "strings" - "sync" - "time" - - "golang.org/x/net/context" -) - -import ( - "bytes" - - "bazil.org/fuse" - "bazil.org/fuse/fuseutil" -) - -const ( - attrValidTime = 1 * time.Minute - entryValidTime = 1 * time.Minute -) - -// TODO: FINISH DOCS - -// An FS is the interface required of a file system. -// -// Other FUSE requests can be handled by implementing methods from the -// FS* interfaces, for example FSStatfser. -type FS interface { - // Root is called to obtain the Node for the file system root. - Root() (Node, error) -} - -type FSStatfser interface { - // Statfs is called to obtain file system metadata. - // It should write that data to resp. - Statfs(ctx context.Context, req *fuse.StatfsRequest, resp *fuse.StatfsResponse) error -} - -type FSDestroyer interface { - // Destroy is called when the file system is shutting down. - // - // Linux only sends this request for block device backed (fuseblk) - // filesystems, to allow them to flush writes to disk before the - // unmount completes. - Destroy() -} - -type FSInodeGenerator interface { - // GenerateInode is called to pick a dynamic inode number when it - // would otherwise be 0. - // - // Not all filesystems bother tracking inodes, but FUSE requires - // the inode to be set, and fewer duplicates in general makes UNIX - // tools work better. - // - // Operations where the nodes may return 0 inodes include Getattr, - // Setattr and ReadDir. - // - // If FS does not implement FSInodeGenerator, GenerateDynamicInode - // is used. - // - // Implementing this is useful to e.g. constrain the range of - // inode values used for dynamic inodes. - GenerateInode(parentInode uint64, name string) uint64 -} - -// A Node is the interface required of a file or directory. -// See the documentation for type FS for general information -// pertaining to all methods. -// -// A Node must be usable as a map key, that is, it cannot be a -// function, map or slice. -// -// Other FUSE requests can be handled by implementing methods from the -// Node* interfaces, for example NodeOpener. -// -// Methods returning Node should take care to return the same Node -// when the result is logically the same instance. Without this, each -// Node will get a new NodeID, causing spurious cache invalidations, -// extra lookups and aliasing anomalies. This may not matter for a -// simple, read-only filesystem. -type Node interface { - // Attr fills attr with the standard metadata for the node. - // - // Fields with reasonable defaults are prepopulated. For example, - // all times are set to a fixed moment when the program started. - // - // If Inode is left as 0, a dynamic inode number is chosen. - // - // The result may be cached for the duration set in Valid. - Attr(ctx context.Context, attr *fuse.Attr) error -} - -type NodeGetattrer interface { - // Getattr obtains the standard metadata for the receiver. - // It should store that metadata in resp. - // - // If this method is not implemented, the attributes will be - // generated based on Attr(), with zero values filled in. - Getattr(ctx context.Context, req *fuse.GetattrRequest, resp *fuse.GetattrResponse) error -} - -type NodeSetattrer interface { - // Setattr sets the standard metadata for the receiver. - // - // Note, this is also used to communicate changes in the size of - // the file, outside of Writes. - // - // req.Valid is a bitmask of what fields are actually being set. - // For example, the method should not change the mode of the file - // unless req.Valid.Mode() is true. - Setattr(ctx context.Context, req *fuse.SetattrRequest, resp *fuse.SetattrResponse) error -} - -type NodeSymlinker interface { - // Symlink creates a new symbolic link in the receiver, which must be a directory. - // - // TODO is the above true about directories? - Symlink(ctx context.Context, req *fuse.SymlinkRequest) (Node, error) -} - -// This optional request will be called only for symbolic link nodes. -type NodeReadlinker interface { - // Readlink reads a symbolic link. - Readlink(ctx context.Context, req *fuse.ReadlinkRequest) (string, error) -} - -type NodeLinker interface { - // Link creates a new directory entry in the receiver based on an - // existing Node. Receiver must be a directory. - Link(ctx context.Context, req *fuse.LinkRequest, old Node) (Node, error) -} - -type NodeRemover interface { - // Remove removes the entry with the given name from - // the receiver, which must be a directory. The entry to be removed - // may correspond to a file (unlink) or to a directory (rmdir). - Remove(ctx context.Context, req *fuse.RemoveRequest) error -} - -type NodeAccesser interface { - // Access checks whether the calling context has permission for - // the given operations on the receiver. If so, Access should - // return nil. If not, Access should return EPERM. - // - // Note that this call affects the result of the access(2) system - // call but not the open(2) system call. If Access is not - // implemented, the Node behaves as if it always returns nil - // (permission granted), relying on checks in Open instead. - Access(ctx context.Context, req *fuse.AccessRequest) error -} - -type NodeStringLookuper interface { - // Lookup looks up a specific entry in the receiver, - // which must be a directory. Lookup should return a Node - // corresponding to the entry. If the name does not exist in - // the directory, Lookup should return ENOENT. - // - // Lookup need not to handle the names "." and "..". - Lookup(ctx context.Context, name string) (Node, error) -} - -type NodeRequestLookuper interface { - // Lookup looks up a specific entry in the receiver. - // See NodeStringLookuper for more. - Lookup(ctx context.Context, req *fuse.LookupRequest, resp *fuse.LookupResponse) (Node, error) -} - -type NodeMkdirer interface { - Mkdir(ctx context.Context, req *fuse.MkdirRequest) (Node, error) -} - -type NodeOpener interface { - // Open opens the receiver. After a successful open, a client - // process has a file descriptor referring to this Handle. - // - // Open can also be also called on non-files. For example, - // directories are Opened for ReadDir or fchdir(2). - // - // If this method is not implemented, the open will always - // succeed, and the Node itself will be used as the Handle. - // - // XXX note about access. XXX OpenFlags. - Open(ctx context.Context, req *fuse.OpenRequest, resp *fuse.OpenResponse) (Handle, error) -} - -type NodeCreater interface { - // Create creates a new directory entry in the receiver, which - // must be a directory. - Create(ctx context.Context, req *fuse.CreateRequest, resp *fuse.CreateResponse) (Node, Handle, error) -} - -type NodeForgetter interface { - // Forget about this node. This node will not receive further - // method calls. - // - // Forget is not necessarily seen on unmount, as all nodes are - // implicitly forgotten as part part of the unmount. - Forget() -} - -type NodeRenamer interface { - Rename(ctx context.Context, req *fuse.RenameRequest, newDir Node) error -} - -type NodeMknoder interface { - Mknod(ctx context.Context, req *fuse.MknodRequest) (Node, error) -} - -// TODO this should be on Handle not Node -type NodeFsyncer interface { - Fsync(ctx context.Context, req *fuse.FsyncRequest) error -} - -type NodeGetxattrer interface { - // Getxattr gets an extended attribute by the given name from the - // node. - // - // If there is no xattr by that name, returns fuse.ErrNoXattr. - Getxattr(ctx context.Context, req *fuse.GetxattrRequest, resp *fuse.GetxattrResponse) error -} - -type NodeListxattrer interface { - // Listxattr lists the extended attributes recorded for the node. - Listxattr(ctx context.Context, req *fuse.ListxattrRequest, resp *fuse.ListxattrResponse) error -} - -type NodeSetxattrer interface { - // Setxattr sets an extended attribute with the given name and - // value for the node. - Setxattr(ctx context.Context, req *fuse.SetxattrRequest) error -} - -type NodeRemovexattrer interface { - // Removexattr removes an extended attribute for the name. - // - // If there is no xattr by that name, returns fuse.ErrNoXattr. - Removexattr(ctx context.Context, req *fuse.RemovexattrRequest) error -} - -var startTime = time.Now() - -func nodeAttr(ctx context.Context, n Node, attr *fuse.Attr) error { - attr.Valid = attrValidTime - attr.Nlink = 1 - attr.Atime = startTime - attr.Mtime = startTime - attr.Ctime = startTime - attr.Crtime = startTime - if err := n.Attr(ctx, attr); err != nil { - return err - } - return nil -} - -// A Handle is the interface required of an opened file or directory. -// See the documentation for type FS for general information -// pertaining to all methods. -// -// Other FUSE requests can be handled by implementing methods from the -// Handle* interfaces. The most common to implement are HandleReader, -// HandleReadDirer, and HandleWriter. -// -// TODO implement methods: Getlk, Setlk, Setlkw -type Handle interface { -} - -type HandleFlusher interface { - // Flush is called each time the file or directory is closed. - // Because there can be multiple file descriptors referring to a - // single opened file, Flush can be called multiple times. - Flush(ctx context.Context, req *fuse.FlushRequest) error -} - -type HandleReadAller interface { - ReadAll(ctx context.Context) ([]byte, error) -} - -type HandleReadDirAller interface { - ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) -} - -type HandleReader interface { - // Read requests to read data from the handle. - // - // There is a page cache in the kernel that normally submits only - // page-aligned reads spanning one or more pages. However, you - // should not rely on this. To see individual requests as - // submitted by the file system clients, set OpenDirectIO. - // - // Note that reads beyond the size of the file as reported by Attr - // are not even attempted (except in OpenDirectIO mode). - Read(ctx context.Context, req *fuse.ReadRequest, resp *fuse.ReadResponse) error -} - -type HandleWriter interface { - // Write requests to write data into the handle at the given offset. - // Store the amount of data written in resp.Size. - // - // There is a writeback page cache in the kernel that normally submits - // only page-aligned writes spanning one or more pages. However, - // you should not rely on this. To see individual requests as - // submitted by the file system clients, set OpenDirectIO. - // - // Writes that grow the file are expected to update the file size - // (as seen through Attr). Note that file size changes are - // communicated also through Setattr. - Write(ctx context.Context, req *fuse.WriteRequest, resp *fuse.WriteResponse) error -} - -type HandleReleaser interface { - Release(ctx context.Context, req *fuse.ReleaseRequest) error -} - -type Config struct { - // Function to send debug log messages to. If nil, use fuse.Debug. - // Note that changing this or fuse.Debug may not affect existing - // calls to Serve. - // - // See fuse.Debug for the rules that log functions must follow. - Debug func(msg interface{}) - - // Function to put things into context for processing the request. - // The returned context must have ctx as its parent. - // - // Note that changing this may not affect existing calls to Serve. - // - // Must not retain req. - WithContext func(ctx context.Context, req fuse.Request) context.Context -} - -// New returns a new FUSE server ready to serve this kernel FUSE -// connection. -// -// Config may be nil. -func New(conn *fuse.Conn, config *Config) *Server { - s := &Server{ - conn: conn, - req: map[fuse.RequestID]*serveRequest{}, - nodeRef: map[Node]fuse.NodeID{}, - dynamicInode: GenerateDynamicInode, - } - if config != nil { - s.debug = config.Debug - s.context = config.WithContext - } - if s.debug == nil { - s.debug = fuse.Debug - } - return s -} - -type Server struct { - // set in New - conn *fuse.Conn - debug func(msg interface{}) - context func(ctx context.Context, req fuse.Request) context.Context - - // set once at Serve time - fs FS - dynamicInode func(parent uint64, name string) uint64 - - // state, protected by meta - meta sync.Mutex - req map[fuse.RequestID]*serveRequest - node []*serveNode - nodeRef map[Node]fuse.NodeID - handle []*serveHandle - freeNode []fuse.NodeID - freeHandle []fuse.HandleID - nodeGen uint64 - - // Used to ensure worker goroutines finish before Serve returns - wg sync.WaitGroup -} - -// Serve serves the FUSE connection by making calls to the methods -// of fs and the Nodes and Handles it makes available. It returns only -// when the connection has been closed or an unexpected error occurs. -func (s *Server) Serve(fs FS) error { - defer s.wg.Wait() // Wait for worker goroutines to complete before return - - s.fs = fs - if dyn, ok := fs.(FSInodeGenerator); ok { - s.dynamicInode = dyn.GenerateInode - } - - root, err := fs.Root() - if err != nil { - return fmt.Errorf("cannot obtain root node: %v", err) - } - // Recognize the root node if it's ever returned from Lookup, - // passed to Invalidate, etc. - s.nodeRef[root] = 1 - s.node = append(s.node, nil, &serveNode{ - inode: 1, - generation: s.nodeGen, - node: root, - refs: 1, - }) - s.handle = append(s.handle, nil) - - for { - req, err := s.conn.ReadRequest() - if err != nil { - if err == io.EOF { - break - } - return err - } - - s.wg.Add(1) - go func() { - defer s.wg.Done() - s.serve(req) - }() - } - return nil -} - -// Serve serves a FUSE connection with the default settings. See -// Server.Serve. -func Serve(c *fuse.Conn, fs FS) error { - server := New(c, nil) - return server.Serve(fs) -} - -type nothing struct{} - -type serveRequest struct { - Request fuse.Request - cancel func() -} - -type serveNode struct { - inode uint64 - generation uint64 - node Node - refs uint64 - - // Delay freeing the NodeID until waitgroup is done. This allows - // using the NodeID for short periods of time without holding the - // Server.meta lock. - // - // Rules: - // - // - hold Server.meta while calling wg.Add, then unlock - // - do NOT try to reacquire Server.meta - wg sync.WaitGroup -} - -func (sn *serveNode) attr(ctx context.Context, attr *fuse.Attr) error { - err := nodeAttr(ctx, sn.node, attr) - if attr.Inode == 0 { - attr.Inode = sn.inode - } - return err -} - -type serveHandle struct { - handle Handle - readData []byte - nodeID fuse.NodeID -} - -// NodeRef is deprecated. It remains here to decrease code churn on -// FUSE library users. You may remove it from your program now; -// returning the same Node values are now recognized automatically, -// without needing NodeRef. -type NodeRef struct{} - -func (c *Server) saveNode(inode uint64, node Node) (id fuse.NodeID, gen uint64) { - c.meta.Lock() - defer c.meta.Unlock() - - if id, ok := c.nodeRef[node]; ok { - sn := c.node[id] - sn.refs++ - return id, sn.generation - } - - sn := &serveNode{inode: inode, node: node, refs: 1} - if n := len(c.freeNode); n > 0 { - id = c.freeNode[n-1] - c.freeNode = c.freeNode[:n-1] - c.node[id] = sn - c.nodeGen++ - } else { - id = fuse.NodeID(len(c.node)) - c.node = append(c.node, sn) - } - sn.generation = c.nodeGen - c.nodeRef[node] = id - return id, sn.generation -} - -func (c *Server) saveHandle(handle Handle, nodeID fuse.NodeID) (id fuse.HandleID) { - c.meta.Lock() - shandle := &serveHandle{handle: handle, nodeID: nodeID} - if n := len(c.freeHandle); n > 0 { - id = c.freeHandle[n-1] - c.freeHandle = c.freeHandle[:n-1] - c.handle[id] = shandle - } else { - id = fuse.HandleID(len(c.handle)) - c.handle = append(c.handle, shandle) - } - c.meta.Unlock() - return -} - -type nodeRefcountDropBug struct { - N uint64 - Refs uint64 - Node fuse.NodeID -} - -func (n *nodeRefcountDropBug) String() string { - return fmt.Sprintf("bug: trying to drop %d of %d references to %v", n.N, n.Refs, n.Node) -} - -func (c *Server) dropNode(id fuse.NodeID, n uint64) (forget bool) { - c.meta.Lock() - defer c.meta.Unlock() - snode := c.node[id] - - if snode == nil { - // this should only happen if refcounts kernel<->us disagree - // *and* two ForgetRequests for the same node race each other; - // this indicates a bug somewhere - c.debug(nodeRefcountDropBug{N: n, Node: id}) - - // we may end up triggering Forget twice, but that's better - // than not even once, and that's the best we can do - return true - } - - if n > snode.refs { - c.debug(nodeRefcountDropBug{N: n, Refs: snode.refs, Node: id}) - n = snode.refs - } - - snode.refs -= n - if snode.refs == 0 { - snode.wg.Wait() - c.node[id] = nil - delete(c.nodeRef, snode.node) - c.freeNode = append(c.freeNode, id) - return true - } - return false -} - -func (c *Server) dropHandle(id fuse.HandleID) { - c.meta.Lock() - c.handle[id] = nil - c.freeHandle = append(c.freeHandle, id) - c.meta.Unlock() -} - -type missingHandle struct { - Handle fuse.HandleID - MaxHandle fuse.HandleID -} - -func (m missingHandle) String() string { - return fmt.Sprint("missing handle: ", m.Handle, m.MaxHandle) -} - -// Returns nil for invalid handles. -func (c *Server) getHandle(id fuse.HandleID) (shandle *serveHandle) { - c.meta.Lock() - defer c.meta.Unlock() - if id < fuse.HandleID(len(c.handle)) { - shandle = c.handle[uint(id)] - } - if shandle == nil { - c.debug(missingHandle{ - Handle: id, - MaxHandle: fuse.HandleID(len(c.handle)), - }) - } - return -} - -type request struct { - Op string - Request *fuse.Header - In interface{} `json:",omitempty"` -} - -func (r request) String() string { - return fmt.Sprintf("<- %s", r.In) -} - -type logResponseHeader struct { - ID fuse.RequestID -} - -func (m logResponseHeader) String() string { - return fmt.Sprintf("ID=%v", m.ID) -} - -type response struct { - Op string - Request logResponseHeader - Out interface{} `json:",omitempty"` - // Errno contains the errno value as a string, for example "EPERM". - Errno string `json:",omitempty"` - // Error may contain a free form error message. - Error string `json:",omitempty"` -} - -func (r response) errstr() string { - s := r.Errno - if r.Error != "" { - // prefix the errno constant to the long form message - s = s + ": " + r.Error - } - return s -} - -func (r response) String() string { - switch { - case r.Errno != "" && r.Out != nil: - return fmt.Sprintf("-> [%v] %v error=%s", r.Request, r.Out, r.errstr()) - case r.Errno != "": - return fmt.Sprintf("-> [%v] %s error=%s", r.Request, r.Op, r.errstr()) - case r.Out != nil: - // make sure (seemingly) empty values are readable - switch r.Out.(type) { - case string: - return fmt.Sprintf("-> [%v] %s %q", r.Request, r.Op, r.Out) - case []byte: - return fmt.Sprintf("-> [%v] %s [% x]", r.Request, r.Op, r.Out) - default: - return fmt.Sprintf("-> [%v] %v", r.Request, r.Out) - } - default: - return fmt.Sprintf("-> [%v] %s", r.Request, r.Op) - } -} - -type notification struct { - Op string - Node fuse.NodeID - Out interface{} `json:",omitempty"` - Err string `json:",omitempty"` -} - -func (n notification) String() string { - var buf bytes.Buffer - fmt.Fprintf(&buf, "=> %s %v", n.Op, n.Node) - if n.Out != nil { - // make sure (seemingly) empty values are readable - switch n.Out.(type) { - case string: - fmt.Fprintf(&buf, " %q", n.Out) - case []byte: - fmt.Fprintf(&buf, " [% x]", n.Out) - default: - fmt.Fprintf(&buf, " %s", n.Out) - } - } - if n.Err != "" { - fmt.Fprintf(&buf, " Err:%v", n.Err) - } - return buf.String() -} - -type logMissingNode struct { - MaxNode fuse.NodeID -} - -func opName(req fuse.Request) string { - t := reflect.Indirect(reflect.ValueOf(req)).Type() - s := t.Name() - s = strings.TrimSuffix(s, "Request") - return s -} - -type logLinkRequestOldNodeNotFound struct { - Request *fuse.Header - In *fuse.LinkRequest -} - -func (m *logLinkRequestOldNodeNotFound) String() string { - return fmt.Sprintf("In LinkRequest (request %v), node %d not found", m.Request.Hdr().ID, m.In.OldNode) -} - -type renameNewDirNodeNotFound struct { - Request *fuse.Header - In *fuse.RenameRequest -} - -func (m *renameNewDirNodeNotFound) String() string { - return fmt.Sprintf("In RenameRequest (request %v), node %d not found", m.Request.Hdr().ID, m.In.NewDir) -} - -type handlerPanickedError struct { - Request interface{} - Err interface{} -} - -var _ error = handlerPanickedError{} - -func (h handlerPanickedError) Error() string { - return fmt.Sprintf("handler panicked: %v", h.Err) -} - -var _ fuse.ErrorNumber = handlerPanickedError{} - -func (h handlerPanickedError) Errno() fuse.Errno { - if err, ok := h.Err.(fuse.ErrorNumber); ok { - return err.Errno() - } - return fuse.DefaultErrno -} - -// handlerTerminatedError happens when a handler terminates itself -// with runtime.Goexit. This is most commonly because of incorrect use -// of testing.TB.FailNow, typically via t.Fatal. -type handlerTerminatedError struct { - Request interface{} -} - -var _ error = handlerTerminatedError{} - -func (h handlerTerminatedError) Error() string { - return fmt.Sprintf("handler terminated (called runtime.Goexit)") -} - -var _ fuse.ErrorNumber = handlerTerminatedError{} - -func (h handlerTerminatedError) Errno() fuse.Errno { - return fuse.DefaultErrno -} - -type handleNotReaderError struct { - handle Handle -} - -var _ error = handleNotReaderError{} - -func (e handleNotReaderError) Error() string { - return fmt.Sprintf("handle has no Read: %T", e.handle) -} - -var _ fuse.ErrorNumber = handleNotReaderError{} - -func (e handleNotReaderError) Errno() fuse.Errno { - return fuse.ENOTSUP -} - -func initLookupResponse(s *fuse.LookupResponse) { - s.EntryValid = entryValidTime -} - -func (c *Server) serve(r fuse.Request) { - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - parentCtx := ctx - if c.context != nil { - ctx = c.context(ctx, r) - } - - req := &serveRequest{Request: r, cancel: cancel} - - c.debug(request{ - Op: opName(r), - Request: r.Hdr(), - In: r, - }) - var node Node - var snode *serveNode - c.meta.Lock() - hdr := r.Hdr() - if id := hdr.Node; id != 0 { - if id < fuse.NodeID(len(c.node)) { - snode = c.node[uint(id)] - } - if snode == nil { - c.meta.Unlock() - c.debug(response{ - Op: opName(r), - Request: logResponseHeader{ID: hdr.ID}, - Error: fuse.ESTALE.ErrnoName(), - // this is the only place that sets both Error and - // Out; not sure if i want to do that; might get rid - // of len(c.node) things altogether - Out: logMissingNode{ - MaxNode: fuse.NodeID(len(c.node)), - }, - }) - r.RespondError(fuse.ESTALE) - return - } - node = snode.node - } - if c.req[hdr.ID] != nil { - // This happens with OSXFUSE. Assume it's okay and - // that we'll never see an interrupt for this one. - // Otherwise everything wedges. TODO: Report to OSXFUSE? - // - // TODO this might have been because of missing done() calls - } else { - c.req[hdr.ID] = req - } - c.meta.Unlock() - - // Call this before responding. - // After responding is too late: we might get another request - // with the same ID and be very confused. - done := func(resp interface{}) { - msg := response{ - Op: opName(r), - Request: logResponseHeader{ID: hdr.ID}, - } - if err, ok := resp.(error); ok { - msg.Error = err.Error() - if ferr, ok := err.(fuse.ErrorNumber); ok { - errno := ferr.Errno() - msg.Errno = errno.ErrnoName() - if errno == err { - // it's just a fuse.Errno with no extra detail; - // skip the textual message for log readability - msg.Error = "" - } - } else { - msg.Errno = fuse.DefaultErrno.ErrnoName() - } - } else { - msg.Out = resp - } - c.debug(msg) - - c.meta.Lock() - delete(c.req, hdr.ID) - c.meta.Unlock() - } - - var responded bool - defer func() { - if rec := recover(); rec != nil { - const size = 1 << 16 - buf := make([]byte, size) - n := runtime.Stack(buf, false) - buf = buf[:n] - log.Printf("fuse: panic in handler for %v: %v\n%s", r, rec, buf) - err := handlerPanickedError{ - Request: r, - Err: rec, - } - done(err) - r.RespondError(err) - return - } - - if !responded { - err := handlerTerminatedError{ - Request: r, - } - done(err) - r.RespondError(err) - } - }() - - if err := c.handleRequest(ctx, node, snode, r, done); err != nil { - if err == context.Canceled { - select { - case <-parentCtx.Done(): - // We canceled the parent context because of an - // incoming interrupt request, so return EINTR - // to trigger the right behavior in the client app. - // - // Only do this when it's the parent context that was - // canceled, not a context controlled by the program - // using this library, so we don't return EINTR too - // eagerly -- it might cause busy loops. - // - // Decent write-up on role of EINTR: - // http://250bpm.com/blog:12 - err = fuse.EINTR - default: - // nothing - } - } - done(err) - r.RespondError(err) - } - - // disarm runtime.Goexit protection - responded = true -} - -// handleRequest will either a) call done(s) and r.Respond(s) OR b) return an error. -func (c *Server) handleRequest(ctx context.Context, node Node, snode *serveNode, r fuse.Request, done func(resp interface{})) error { - switch r := r.(type) { - default: - // Note: To FUSE, ENOSYS means "this server never implements this request." - // It would be inappropriate to return ENOSYS for other operations in this - // switch that might only be unavailable in some contexts, not all. - return fuse.ENOSYS - - case *fuse.StatfsRequest: - s := &fuse.StatfsResponse{} - if fs, ok := c.fs.(FSStatfser); ok { - if err := fs.Statfs(ctx, r, s); err != nil { - return err - } - } - done(s) - r.Respond(s) - return nil - - // Node operations. - case *fuse.GetattrRequest: - s := &fuse.GetattrResponse{} - if n, ok := node.(NodeGetattrer); ok { - if err := n.Getattr(ctx, r, s); err != nil { - return err - } - } else { - if err := snode.attr(ctx, &s.Attr); err != nil { - return err - } - } - done(s) - r.Respond(s) - return nil - - case *fuse.SetattrRequest: - s := &fuse.SetattrResponse{} - if n, ok := node.(NodeSetattrer); ok { - if err := n.Setattr(ctx, r, s); err != nil { - return err - } - } - - if err := snode.attr(ctx, &s.Attr); err != nil { - return err - } - done(s) - r.Respond(s) - return nil - - case *fuse.SymlinkRequest: - s := &fuse.SymlinkResponse{} - initLookupResponse(&s.LookupResponse) - n, ok := node.(NodeSymlinker) - if !ok { - return fuse.EIO // XXX or EPERM like Mkdir? - } - n2, err := n.Symlink(ctx, r) - if err != nil { - return err - } - if err := c.saveLookup(ctx, &s.LookupResponse, snode, r.NewName, n2); err != nil { - return err - } - done(s) - r.Respond(s) - return nil - - case *fuse.ReadlinkRequest: - n, ok := node.(NodeReadlinker) - if !ok { - return fuse.EIO /// XXX or EPERM? - } - target, err := n.Readlink(ctx, r) - if err != nil { - return err - } - done(target) - r.Respond(target) - return nil - - case *fuse.LinkRequest: - n, ok := node.(NodeLinker) - if !ok { - return fuse.EIO /// XXX or EPERM? - } - c.meta.Lock() - var oldNode *serveNode - if int(r.OldNode) < len(c.node) { - oldNode = c.node[r.OldNode] - } - c.meta.Unlock() - if oldNode == nil { - c.debug(logLinkRequestOldNodeNotFound{ - Request: r.Hdr(), - In: r, - }) - return fuse.EIO - } - n2, err := n.Link(ctx, r, oldNode.node) - if err != nil { - return err - } - s := &fuse.LookupResponse{} - initLookupResponse(s) - if err := c.saveLookup(ctx, s, snode, r.NewName, n2); err != nil { - return err - } - done(s) - r.Respond(s) - return nil - - case *fuse.RemoveRequest: - n, ok := node.(NodeRemover) - if !ok { - return fuse.EIO /// XXX or EPERM? - } - err := n.Remove(ctx, r) - if err != nil { - return err - } - done(nil) - r.Respond() - return nil - - case *fuse.AccessRequest: - if n, ok := node.(NodeAccesser); ok { - if err := n.Access(ctx, r); err != nil { - return err - } - } - done(nil) - r.Respond() - return nil - - case *fuse.LookupRequest: - var n2 Node - var err error - s := &fuse.LookupResponse{} - initLookupResponse(s) - if n, ok := node.(NodeStringLookuper); ok { - n2, err = n.Lookup(ctx, r.Name) - } else if n, ok := node.(NodeRequestLookuper); ok { - n2, err = n.Lookup(ctx, r, s) - } else { - return fuse.ENOENT - } - if err != nil { - return err - } - if err := c.saveLookup(ctx, s, snode, r.Name, n2); err != nil { - return err - } - done(s) - r.Respond(s) - return nil - - case *fuse.MkdirRequest: - s := &fuse.MkdirResponse{} - initLookupResponse(&s.LookupResponse) - n, ok := node.(NodeMkdirer) - if !ok { - return fuse.EPERM - } - n2, err := n.Mkdir(ctx, r) - if err != nil { - return err - } - if err := c.saveLookup(ctx, &s.LookupResponse, snode, r.Name, n2); err != nil { - return err - } - done(s) - r.Respond(s) - return nil - - case *fuse.OpenRequest: - s := &fuse.OpenResponse{} - var h2 Handle - if n, ok := node.(NodeOpener); ok { - hh, err := n.Open(ctx, r, s) - if err != nil { - return err - } - h2 = hh - } else { - h2 = node - } - s.Handle = c.saveHandle(h2, r.Hdr().Node) - done(s) - r.Respond(s) - return nil - - case *fuse.CreateRequest: - n, ok := node.(NodeCreater) - if !ok { - // If we send back ENOSYS, FUSE will try mknod+open. - return fuse.EPERM - } - s := &fuse.CreateResponse{OpenResponse: fuse.OpenResponse{}} - initLookupResponse(&s.LookupResponse) - n2, h2, err := n.Create(ctx, r, s) - if err != nil { - return err - } - if err := c.saveLookup(ctx, &s.LookupResponse, snode, r.Name, n2); err != nil { - return err - } - s.Handle = c.saveHandle(h2, r.Hdr().Node) - done(s) - r.Respond(s) - return nil - - case *fuse.GetxattrRequest: - n, ok := node.(NodeGetxattrer) - if !ok { - return fuse.ENOTSUP - } - s := &fuse.GetxattrResponse{} - err := n.Getxattr(ctx, r, s) - if err != nil { - return err - } - if r.Size != 0 && uint64(len(s.Xattr)) > uint64(r.Size) { - return fuse.ERANGE - } - done(s) - r.Respond(s) - return nil - - case *fuse.ListxattrRequest: - n, ok := node.(NodeListxattrer) - if !ok { - return fuse.ENOTSUP - } - s := &fuse.ListxattrResponse{} - err := n.Listxattr(ctx, r, s) - if err != nil { - return err - } - if r.Size != 0 && uint64(len(s.Xattr)) > uint64(r.Size) { - return fuse.ERANGE - } - done(s) - r.Respond(s) - return nil - - case *fuse.SetxattrRequest: - n, ok := node.(NodeSetxattrer) - if !ok { - return fuse.ENOTSUP - } - err := n.Setxattr(ctx, r) - if err != nil { - return err - } - done(nil) - r.Respond() - return nil - - case *fuse.RemovexattrRequest: - n, ok := node.(NodeRemovexattrer) - if !ok { - return fuse.ENOTSUP - } - err := n.Removexattr(ctx, r) - if err != nil { - return err - } - done(nil) - r.Respond() - return nil - - case *fuse.ForgetRequest: - forget := c.dropNode(r.Hdr().Node, r.N) - if forget { - n, ok := node.(NodeForgetter) - if ok { - n.Forget() - } - } - done(nil) - r.Respond() - return nil - - // Handle operations. - case *fuse.ReadRequest: - shandle := c.getHandle(r.Handle) - if shandle == nil { - return fuse.ESTALE - } - handle := shandle.handle - - s := &fuse.ReadResponse{Data: make([]byte, 0, r.Size)} - if r.Dir { - if h, ok := handle.(HandleReadDirAller); ok { - // detect rewinddir(3) or similar seek and refresh - // contents - if r.Offset == 0 { - shandle.readData = nil - } - - if shandle.readData == nil { - dirs, err := h.ReadDirAll(ctx) - if err != nil { - return err - } - var data []byte - for _, dir := range dirs { - if dir.Inode == 0 { - dir.Inode = c.dynamicInode(snode.inode, dir.Name) - } - data = fuse.AppendDirent(data, dir) - } - shandle.readData = data - } - fuseutil.HandleRead(r, s, shandle.readData) - done(s) - r.Respond(s) - return nil - } - } else { - if h, ok := handle.(HandleReadAller); ok { - if shandle.readData == nil { - data, err := h.ReadAll(ctx) - if err != nil { - return err - } - if data == nil { - data = []byte{} - } - shandle.readData = data - } - fuseutil.HandleRead(r, s, shandle.readData) - done(s) - r.Respond(s) - return nil - } - h, ok := handle.(HandleReader) - if !ok { - err := handleNotReaderError{handle: handle} - return err - } - if err := h.Read(ctx, r, s); err != nil { - return err - } - } - done(s) - r.Respond(s) - return nil - - case *fuse.WriteRequest: - shandle := c.getHandle(r.Handle) - if shandle == nil { - return fuse.ESTALE - } - - s := &fuse.WriteResponse{} - if h, ok := shandle.handle.(HandleWriter); ok { - if err := h.Write(ctx, r, s); err != nil { - return err - } - done(s) - r.Respond(s) - return nil - } - return fuse.EIO - - case *fuse.FlushRequest: - shandle := c.getHandle(r.Handle) - if shandle == nil { - return fuse.ESTALE - } - handle := shandle.handle - - if h, ok := handle.(HandleFlusher); ok { - if err := h.Flush(ctx, r); err != nil { - return err - } - } - done(nil) - r.Respond() - return nil - - case *fuse.ReleaseRequest: - shandle := c.getHandle(r.Handle) - if shandle == nil { - return fuse.ESTALE - } - handle := shandle.handle - - // No matter what, release the handle. - c.dropHandle(r.Handle) - - if h, ok := handle.(HandleReleaser); ok { - if err := h.Release(ctx, r); err != nil { - return err - } - } - done(nil) - r.Respond() - return nil - - case *fuse.DestroyRequest: - if fs, ok := c.fs.(FSDestroyer); ok { - fs.Destroy() - } - done(nil) - r.Respond() - return nil - - case *fuse.RenameRequest: - c.meta.Lock() - var newDirNode *serveNode - if int(r.NewDir) < len(c.node) { - newDirNode = c.node[r.NewDir] - } - c.meta.Unlock() - if newDirNode == nil { - c.debug(renameNewDirNodeNotFound{ - Request: r.Hdr(), - In: r, - }) - return fuse.EIO - } - n, ok := node.(NodeRenamer) - if !ok { - return fuse.EIO // XXX or EPERM like Mkdir? - } - err := n.Rename(ctx, r, newDirNode.node) - if err != nil { - return err - } - done(nil) - r.Respond() - return nil - - case *fuse.MknodRequest: - n, ok := node.(NodeMknoder) - if !ok { - return fuse.EIO - } - n2, err := n.Mknod(ctx, r) - if err != nil { - return err - } - s := &fuse.LookupResponse{} - initLookupResponse(s) - if err := c.saveLookup(ctx, s, snode, r.Name, n2); err != nil { - return err - } - done(s) - r.Respond(s) - return nil - - case *fuse.FsyncRequest: - n, ok := node.(NodeFsyncer) - if !ok { - return fuse.EIO - } - err := n.Fsync(ctx, r) - if err != nil { - return err - } - done(nil) - r.Respond() - return nil - - case *fuse.InterruptRequest: - c.meta.Lock() - ireq := c.req[r.IntrID] - if ireq != nil && ireq.cancel != nil { - ireq.cancel() - ireq.cancel = nil - } - c.meta.Unlock() - done(nil) - r.Respond() - return nil - - /* case *FsyncdirRequest: - return ENOSYS - - case *GetlkRequest, *SetlkRequest, *SetlkwRequest: - return ENOSYS - - case *BmapRequest: - return ENOSYS - - case *SetvolnameRequest, *GetxtimesRequest, *ExchangeRequest: - return ENOSYS - */ - } - - panic("not reached") -} - -func (c *Server) saveLookup(ctx context.Context, s *fuse.LookupResponse, snode *serveNode, elem string, n2 Node) error { - if err := nodeAttr(ctx, n2, &s.Attr); err != nil { - return err - } - if s.Attr.Inode == 0 { - s.Attr.Inode = c.dynamicInode(snode.inode, elem) - } - - s.Node, s.Generation = c.saveNode(s.Attr.Inode, n2) - return nil -} - -type invalidateNodeDetail struct { - Off int64 - Size int64 -} - -func (i invalidateNodeDetail) String() string { - return fmt.Sprintf("Off:%d Size:%d", i.Off, i.Size) -} - -func errstr(err error) string { - if err == nil { - return "" - } - return err.Error() -} - -func (s *Server) invalidateNode(node Node, off int64, size int64) error { - s.meta.Lock() - id, ok := s.nodeRef[node] - if ok { - snode := s.node[id] - snode.wg.Add(1) - defer snode.wg.Done() - } - s.meta.Unlock() - if !ok { - // This is what the kernel would have said, if we had been - // able to send this message; it's not cached. - return fuse.ErrNotCached - } - // Delay logging until after we can record the error too. We - // consider a /dev/fuse write to be instantaneous enough to not - // need separate before and after messages. - err := s.conn.InvalidateNode(id, off, size) - s.debug(notification{ - Op: "InvalidateNode", - Node: id, - Out: invalidateNodeDetail{ - Off: off, - Size: size, - }, - Err: errstr(err), - }) - return err -} - -// InvalidateNodeAttr invalidates the kernel cache of the attributes -// of node. -// -// Returns fuse.ErrNotCached if the kernel is not currently caching -// the node. -func (s *Server) InvalidateNodeAttr(node Node) error { - return s.invalidateNode(node, 0, 0) -} - -// InvalidateNodeData invalidates the kernel cache of the attributes -// and data of node. -// -// Returns fuse.ErrNotCached if the kernel is not currently caching -// the node. -func (s *Server) InvalidateNodeData(node Node) error { - return s.invalidateNode(node, 0, -1) -} - -// InvalidateNodeDataRange invalidates the kernel cache of the -// attributes and a range of the data of node. -// -// Returns fuse.ErrNotCached if the kernel is not currently caching -// the node. -func (s *Server) InvalidateNodeDataRange(node Node, off int64, size int64) error { - return s.invalidateNode(node, off, size) -} - -type invalidateEntryDetail struct { - Name string -} - -func (i invalidateEntryDetail) String() string { - return fmt.Sprintf("%q", i.Name) -} - -// InvalidateEntry invalidates the kernel cache of the directory entry -// identified by parent node and entry basename. -// -// Kernel may or may not cache directory listings. To invalidate -// those, use InvalidateNode to invalidate all of the data for a -// directory. (As of 2015-06, Linux FUSE does not cache directory -// listings.) -// -// Returns ErrNotCached if the kernel is not currently caching the -// node. -func (s *Server) InvalidateEntry(parent Node, name string) error { - s.meta.Lock() - id, ok := s.nodeRef[parent] - if ok { - snode := s.node[id] - snode.wg.Add(1) - defer snode.wg.Done() - } - s.meta.Unlock() - if !ok { - // This is what the kernel would have said, if we had been - // able to send this message; it's not cached. - return fuse.ErrNotCached - } - err := s.conn.InvalidateEntry(id, name) - s.debug(notification{ - Op: "InvalidateEntry", - Node: id, - Out: invalidateEntryDetail{ - Name: name, - }, - Err: errstr(err), - }) - return err -} - -// DataHandle returns a read-only Handle that satisfies reads -// using the given data. -func DataHandle(data []byte) Handle { - return &dataHandle{data} -} - -type dataHandle struct { - data []byte -} - -func (d *dataHandle) ReadAll(ctx context.Context) ([]byte, error) { - return d.data, nil -} - -// GenerateDynamicInode returns a dynamic inode. -// -// The parent inode and current entry name are used as the criteria -// for choosing a pseudorandom inode. This makes it likely the same -// entry will get the same inode on multiple runs. -func GenerateDynamicInode(parent uint64, name string) uint64 { - h := fnv.New64a() - var buf [8]byte - binary.LittleEndian.PutUint64(buf[:], parent) - _, _ = h.Write(buf[:]) - _, _ = h.Write([]byte(name)) - var inode uint64 - for { - inode = h.Sum64() - if inode != 0 { - break - } - // there's a tiny probability that result is zero; change the - // input a little and try again - _, _ = h.Write([]byte{'x'}) - } - return inode -} diff --git a/vendor/bazil.org/fuse/fs/tree.go b/vendor/bazil.org/fuse/fs/tree.go deleted file mode 100644 index 7e078045a5a0..000000000000 --- a/vendor/bazil.org/fuse/fs/tree.go +++ /dev/null @@ -1,99 +0,0 @@ -// FUSE directory tree, for servers that wish to use it with the service loop. - -package fs - -import ( - "os" - pathpkg "path" - "strings" - - "golang.org/x/net/context" -) - -import ( - "bazil.org/fuse" -) - -// A Tree implements a basic read-only directory tree for FUSE. -// The Nodes contained in it may still be writable. -type Tree struct { - tree -} - -func (t *Tree) Root() (Node, error) { - return &t.tree, nil -} - -// Add adds the path to the tree, resolving to the given node. -// If path or a prefix of path has already been added to the tree, -// Add panics. -// -// Add is only safe to call before starting to serve requests. -func (t *Tree) Add(path string, node Node) { - path = pathpkg.Clean("/" + path)[1:] - elems := strings.Split(path, "/") - dir := Node(&t.tree) - for i, elem := range elems { - dt, ok := dir.(*tree) - if !ok { - panic("fuse: Tree.Add for " + strings.Join(elems[:i], "/") + " and " + path) - } - n := dt.lookup(elem) - if n != nil { - if i+1 == len(elems) { - panic("fuse: Tree.Add for " + path + " conflicts with " + elem) - } - dir = n - } else { - if i+1 == len(elems) { - dt.add(elem, node) - } else { - dir = &tree{} - dt.add(elem, dir) - } - } - } -} - -type treeDir struct { - name string - node Node -} - -type tree struct { - dir []treeDir -} - -func (t *tree) lookup(name string) Node { - for _, d := range t.dir { - if d.name == name { - return d.node - } - } - return nil -} - -func (t *tree) add(name string, n Node) { - t.dir = append(t.dir, treeDir{name, n}) -} - -func (t *tree) Attr(ctx context.Context, a *fuse.Attr) error { - a.Mode = os.ModeDir | 0555 - return nil -} - -func (t *tree) Lookup(ctx context.Context, name string) (Node, error) { - n := t.lookup(name) - if n != nil { - return n, nil - } - return nil, fuse.ENOENT -} - -func (t *tree) ReadDirAll(ctx context.Context) ([]fuse.Dirent, error) { - var out []fuse.Dirent - for _, d := range t.dir { - out = append(out, fuse.Dirent{Name: d.name}) - } - return out, nil -} diff --git a/vendor/bazil.org/fuse/fuse.go b/vendor/bazil.org/fuse/fuse.go deleted file mode 100644 index 6db0ef2935f4..000000000000 --- a/vendor/bazil.org/fuse/fuse.go +++ /dev/null @@ -1,2303 +0,0 @@ -// See the file LICENSE for copyright and licensing information. - -// Adapted from Plan 9 from User Space's src/cmd/9pfuse/fuse.c, -// which carries this notice: -// -// The files in this directory are subject to the following license. -// -// The author of this software is Russ Cox. -// -// Copyright (c) 2006 Russ Cox -// -// Permission to use, copy, modify, and distribute this software for any -// purpose without fee is hereby granted, provided that this entire notice -// is included in all copies of any software which is or includes a copy -// or modification of this software and in all copies of the supporting -// documentation for such software. -// -// THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED -// WARRANTY. IN PARTICULAR, THE AUTHOR MAKES NO REPRESENTATION OR WARRANTY -// OF ANY KIND CONCERNING THE MERCHANTABILITY OF THIS SOFTWARE OR ITS -// FITNESS FOR ANY PARTICULAR PURPOSE. - -// Package fuse enables writing FUSE file systems on Linux, OS X, and FreeBSD. -// -// On OS X, it requires OSXFUSE (http://osxfuse.github.com/). -// -// There are two approaches to writing a FUSE file system. The first is to speak -// the low-level message protocol, reading from a Conn using ReadRequest and -// writing using the various Respond methods. This approach is closest to -// the actual interaction with the kernel and can be the simplest one in contexts -// such as protocol translators. -// -// Servers of synthesized file systems tend to share common -// bookkeeping abstracted away by the second approach, which is to -// call fs.Serve to serve the FUSE protocol using an implementation of -// the service methods in the interfaces FS* (file system), Node* (file -// or directory), and Handle* (opened file or directory). -// There are a daunting number of such methods that can be written, -// but few are required. -// The specific methods are described in the documentation for those interfaces. -// -// The hellofs subdirectory contains a simple illustration of the fs.Serve approach. -// -// Service Methods -// -// The required and optional methods for the FS, Node, and Handle interfaces -// have the general form -// -// Op(ctx context.Context, req *OpRequest, resp *OpResponse) error -// -// where Op is the name of a FUSE operation. Op reads request -// parameters from req and writes results to resp. An operation whose -// only result is the error result omits the resp parameter. -// -// Multiple goroutines may call service methods simultaneously; the -// methods being called are responsible for appropriate -// synchronization. -// -// The operation must not hold on to the request or response, -// including any []byte fields such as WriteRequest.Data or -// SetxattrRequest.Xattr. -// -// Errors -// -// Operations can return errors. The FUSE interface can only -// communicate POSIX errno error numbers to file system clients, the -// message is not visible to file system clients. The returned error -// can implement ErrorNumber to control the errno returned. Without -// ErrorNumber, a generic errno (EIO) is returned. -// -// Error messages will be visible in the debug log as part of the -// response. -// -// Interrupted Operations -// -// In some file systems, some operations -// may take an undetermined amount of time. For example, a Read waiting for -// a network message or a matching Write might wait indefinitely. If the request -// is cancelled and no longer needed, the context will be cancelled. -// Blocking operations should select on a receive from ctx.Done() and attempt to -// abort the operation early if the receive succeeds (meaning the channel is closed). -// To indicate that the operation failed because it was aborted, return fuse.EINTR. -// -// If an operation does not block for an indefinite amount of time, supporting -// cancellation is not necessary. -// -// Authentication -// -// All requests types embed a Header, meaning that the method can -// inspect req.Pid, req.Uid, and req.Gid as necessary to implement -// permission checking. The kernel FUSE layer normally prevents other -// users from accessing the FUSE file system (to change this, see -// AllowOther, AllowRoot), but does not enforce access modes (to -// change this, see DefaultPermissions). -// -// Mount Options -// -// Behavior and metadata of the mounted file system can be changed by -// passing MountOption values to Mount. -// -package fuse // import "bazil.org/fuse" - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "io" - "os" - "sync" - "syscall" - "time" - "unsafe" -) - -// A Conn represents a connection to a mounted FUSE file system. -type Conn struct { - // Ready is closed when the mount is complete or has failed. - Ready <-chan struct{} - - // MountError stores any error from the mount process. Only valid - // after Ready is closed. - MountError error - - // File handle for kernel communication. Only safe to access if - // rio or wio is held. - dev *os.File - wio sync.RWMutex - rio sync.RWMutex - - // Protocol version negotiated with InitRequest/InitResponse. - proto Protocol -} - -// MountpointDoesNotExistError is an error returned when the -// mountpoint does not exist. -type MountpointDoesNotExistError struct { - Path string -} - -var _ error = (*MountpointDoesNotExistError)(nil) - -func (e *MountpointDoesNotExistError) Error() string { - return fmt.Sprintf("mountpoint does not exist: %v", e.Path) -} - -// Mount mounts a new FUSE connection on the named directory -// and returns a connection for reading and writing FUSE messages. -// -// After a successful return, caller must call Close to free -// resources. -// -// Even on successful return, the new mount is not guaranteed to be -// visible until after Conn.Ready is closed. See Conn.MountError for -// possible errors. Incoming requests on Conn must be served to make -// progress. -func Mount(dir string, options ...MountOption) (*Conn, error) { - conf := mountConfig{ - options: make(map[string]string), - } - for _, option := range options { - if err := option(&conf); err != nil { - return nil, err - } - } - - ready := make(chan struct{}, 1) - c := &Conn{ - Ready: ready, - } - f, err := mount(dir, &conf, ready, &c.MountError) - if err != nil { - return nil, err - } - c.dev = f - - if err := initMount(c, &conf); err != nil { - c.Close() - if err == ErrClosedWithoutInit { - // see if we can provide a better error - <-c.Ready - if err := c.MountError; err != nil { - return nil, err - } - } - return nil, err - } - - return c, nil -} - -type OldVersionError struct { - Kernel Protocol - LibraryMin Protocol -} - -func (e *OldVersionError) Error() string { - return fmt.Sprintf("kernel FUSE version is too old: %v < %v", e.Kernel, e.LibraryMin) -} - -var ( - ErrClosedWithoutInit = errors.New("fuse connection closed without init") -) - -func initMount(c *Conn, conf *mountConfig) error { - req, err := c.ReadRequest() - if err != nil { - if err == io.EOF { - return ErrClosedWithoutInit - } - return err - } - r, ok := req.(*InitRequest) - if !ok { - return fmt.Errorf("missing init, got: %T", req) - } - - min := Protocol{protoVersionMinMajor, protoVersionMinMinor} - if r.Kernel.LT(min) { - req.RespondError(Errno(syscall.EPROTO)) - c.Close() - return &OldVersionError{ - Kernel: r.Kernel, - LibraryMin: min, - } - } - - proto := Protocol{protoVersionMaxMajor, protoVersionMaxMinor} - if r.Kernel.LT(proto) { - // Kernel doesn't support the latest version we have. - proto = r.Kernel - } - c.proto = proto - - s := &InitResponse{ - Library: proto, - MaxReadahead: conf.maxReadahead, - MaxWrite: maxWrite, - Flags: InitBigWrites | conf.initFlags, - } - r.Respond(s) - return nil -} - -// A Request represents a single FUSE request received from the kernel. -// Use a type switch to determine the specific kind. -// A request of unrecognized type will have concrete type *Header. -type Request interface { - // Hdr returns the Header associated with this request. - Hdr() *Header - - // RespondError responds to the request with the given error. - RespondError(error) - - String() string -} - -// A RequestID identifies an active FUSE request. -type RequestID uint64 - -func (r RequestID) String() string { - return fmt.Sprintf("%#x", uint64(r)) -} - -// A NodeID is a number identifying a directory or file. -// It must be unique among IDs returned in LookupResponses -// that have not yet been forgotten by ForgetRequests. -type NodeID uint64 - -func (n NodeID) String() string { - return fmt.Sprintf("%#x", uint64(n)) -} - -// A HandleID is a number identifying an open directory or file. -// It only needs to be unique while the directory or file is open. -type HandleID uint64 - -func (h HandleID) String() string { - return fmt.Sprintf("%#x", uint64(h)) -} - -// The RootID identifies the root directory of a FUSE file system. -const RootID NodeID = rootID - -// A Header describes the basic information sent in every request. -type Header struct { - Conn *Conn `json:"-"` // connection this request was received on - ID RequestID // unique ID for request - Node NodeID // file or directory the request is about - Uid uint32 // user ID of process making request - Gid uint32 // group ID of process making request - Pid uint32 // process ID of process making request - - // for returning to reqPool - msg *message -} - -func (h *Header) String() string { - return fmt.Sprintf("ID=%v Node=%v Uid=%d Gid=%d Pid=%d", h.ID, h.Node, h.Uid, h.Gid, h.Pid) -} - -func (h *Header) Hdr() *Header { - return h -} - -func (h *Header) noResponse() { - putMessage(h.msg) -} - -func (h *Header) respond(msg []byte) { - out := (*outHeader)(unsafe.Pointer(&msg[0])) - out.Unique = uint64(h.ID) - h.Conn.respond(msg) - putMessage(h.msg) -} - -// An ErrorNumber is an error with a specific error number. -// -// Operations may return an error value that implements ErrorNumber to -// control what specific error number (errno) to return. -type ErrorNumber interface { - // Errno returns the the error number (errno) for this error. - Errno() Errno -} - -const ( - // ENOSYS indicates that the call is not supported. - ENOSYS = Errno(syscall.ENOSYS) - - // ESTALE is used by Serve to respond to violations of the FUSE protocol. - ESTALE = Errno(syscall.ESTALE) - - ENOENT = Errno(syscall.ENOENT) - EIO = Errno(syscall.EIO) - EPERM = Errno(syscall.EPERM) - - // EINTR indicates request was interrupted by an InterruptRequest. - // See also fs.Intr. - EINTR = Errno(syscall.EINTR) - - ERANGE = Errno(syscall.ERANGE) - ENOTSUP = Errno(syscall.ENOTSUP) - EEXIST = Errno(syscall.EEXIST) -) - -// DefaultErrno is the errno used when error returned does not -// implement ErrorNumber. -const DefaultErrno = EIO - -var errnoNames = map[Errno]string{ - ENOSYS: "ENOSYS", - ESTALE: "ESTALE", - ENOENT: "ENOENT", - EIO: "EIO", - EPERM: "EPERM", - EINTR: "EINTR", - EEXIST: "EEXIST", -} - -// Errno implements Error and ErrorNumber using a syscall.Errno. -type Errno syscall.Errno - -var _ = ErrorNumber(Errno(0)) -var _ = error(Errno(0)) - -func (e Errno) Errno() Errno { - return e -} - -func (e Errno) String() string { - return syscall.Errno(e).Error() -} - -func (e Errno) Error() string { - return syscall.Errno(e).Error() -} - -// ErrnoName returns the short non-numeric identifier for this errno. -// For example, "EIO". -func (e Errno) ErrnoName() string { - s := errnoNames[e] - if s == "" { - s = fmt.Sprint(e.Errno()) - } - return s -} - -func (e Errno) MarshalText() ([]byte, error) { - s := e.ErrnoName() - return []byte(s), nil -} - -func (h *Header) RespondError(err error) { - errno := DefaultErrno - if ferr, ok := err.(ErrorNumber); ok { - errno = ferr.Errno() - } - // FUSE uses negative errors! - // TODO: File bug report against OSXFUSE: positive error causes kernel panic. - buf := newBuffer(0) - hOut := (*outHeader)(unsafe.Pointer(&buf[0])) - hOut.Error = -int32(errno) - h.respond(buf) -} - -// All requests read from the kernel, without data, are shorter than -// this. -var maxRequestSize = syscall.Getpagesize() -var bufSize = maxRequestSize + maxWrite - -// reqPool is a pool of messages. -// -// Lifetime of a logical message is from getMessage to putMessage. -// getMessage is called by ReadRequest. putMessage is called by -// Conn.ReadRequest, Request.Respond, or Request.RespondError. -// -// Messages in the pool are guaranteed to have conn and off zeroed, -// buf allocated and len==bufSize, and hdr set. -var reqPool = sync.Pool{ - New: allocMessage, -} - -func allocMessage() interface{} { - m := &message{buf: make([]byte, bufSize)} - m.hdr = (*inHeader)(unsafe.Pointer(&m.buf[0])) - return m -} - -func getMessage(c *Conn) *message { - m := reqPool.Get().(*message) - m.conn = c - return m -} - -func putMessage(m *message) { - m.buf = m.buf[:bufSize] - m.conn = nil - m.off = 0 - reqPool.Put(m) -} - -// a message represents the bytes of a single FUSE message -type message struct { - conn *Conn - buf []byte // all bytes - hdr *inHeader // header - off int // offset for reading additional fields -} - -func (m *message) len() uintptr { - return uintptr(len(m.buf) - m.off) -} - -func (m *message) data() unsafe.Pointer { - var p unsafe.Pointer - if m.off < len(m.buf) { - p = unsafe.Pointer(&m.buf[m.off]) - } - return p -} - -func (m *message) bytes() []byte { - return m.buf[m.off:] -} - -func (m *message) Header() Header { - h := m.hdr - return Header{ - Conn: m.conn, - ID: RequestID(h.Unique), - Node: NodeID(h.Nodeid), - Uid: h.Uid, - Gid: h.Gid, - Pid: h.Pid, - - msg: m, - } -} - -// fileMode returns a Go os.FileMode from a Unix mode. -func fileMode(unixMode uint32) os.FileMode { - mode := os.FileMode(unixMode & 0777) - switch unixMode & syscall.S_IFMT { - case syscall.S_IFREG: - // nothing - case syscall.S_IFDIR: - mode |= os.ModeDir - case syscall.S_IFCHR: - mode |= os.ModeCharDevice | os.ModeDevice - case syscall.S_IFBLK: - mode |= os.ModeDevice - case syscall.S_IFIFO: - mode |= os.ModeNamedPipe - case syscall.S_IFLNK: - mode |= os.ModeSymlink - case syscall.S_IFSOCK: - mode |= os.ModeSocket - default: - // no idea - mode |= os.ModeDevice - } - if unixMode&syscall.S_ISUID != 0 { - mode |= os.ModeSetuid - } - if unixMode&syscall.S_ISGID != 0 { - mode |= os.ModeSetgid - } - return mode -} - -type noOpcode struct { - Opcode uint32 -} - -func (m noOpcode) String() string { - return fmt.Sprintf("No opcode %v", m.Opcode) -} - -type malformedMessage struct { -} - -func (malformedMessage) String() string { - return "malformed message" -} - -// Close closes the FUSE connection. -func (c *Conn) Close() error { - c.wio.Lock() - defer c.wio.Unlock() - c.rio.Lock() - defer c.rio.Unlock() - return c.dev.Close() -} - -// caller must hold wio or rio -func (c *Conn) fd() int { - return int(c.dev.Fd()) -} - -func (c *Conn) Protocol() Protocol { - return c.proto -} - -// ReadRequest returns the next FUSE request from the kernel. -// -// Caller must call either Request.Respond or Request.RespondError in -// a reasonable time. Caller must not retain Request after that call. -func (c *Conn) ReadRequest() (Request, error) { - m := getMessage(c) -loop: - c.rio.RLock() - n, err := syscall.Read(c.fd(), m.buf) - c.rio.RUnlock() - if err == syscall.EINTR { - // OSXFUSE sends EINTR to userspace when a request interrupt - // completed before it got sent to userspace? - goto loop - } - if err != nil && err != syscall.ENODEV { - putMessage(m) - return nil, err - } - if n <= 0 { - putMessage(m) - return nil, io.EOF - } - m.buf = m.buf[:n] - - if n < inHeaderSize { - putMessage(m) - return nil, errors.New("fuse: message too short") - } - - // FreeBSD FUSE sends a short length in the header - // for FUSE_INIT even though the actual read length is correct. - if n == inHeaderSize+initInSize && m.hdr.Opcode == opInit && m.hdr.Len < uint32(n) { - m.hdr.Len = uint32(n) - } - - // OSXFUSE sometimes sends the wrong m.hdr.Len in a FUSE_WRITE message. - if m.hdr.Len < uint32(n) && m.hdr.Len >= uint32(unsafe.Sizeof(writeIn{})) && m.hdr.Opcode == opWrite { - m.hdr.Len = uint32(n) - } - - if m.hdr.Len != uint32(n) { - // prepare error message before returning m to pool - err := fmt.Errorf("fuse: read %d opcode %d but expected %d", n, m.hdr.Opcode, m.hdr.Len) - putMessage(m) - return nil, err - } - - m.off = inHeaderSize - - // Convert to data structures. - // Do not trust kernel to hand us well-formed data. - var req Request - switch m.hdr.Opcode { - default: - Debug(noOpcode{Opcode: m.hdr.Opcode}) - goto unrecognized - - case opLookup: - buf := m.bytes() - n := len(buf) - if n == 0 || buf[n-1] != '\x00' { - goto corrupt - } - req = &LookupRequest{ - Header: m.Header(), - Name: string(buf[:n-1]), - } - - case opForget: - in := (*forgetIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &ForgetRequest{ - Header: m.Header(), - N: in.Nlookup, - } - - case opGetattr: - switch { - case c.proto.LT(Protocol{7, 9}): - req = &GetattrRequest{ - Header: m.Header(), - } - - default: - in := (*getattrIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &GetattrRequest{ - Header: m.Header(), - Flags: GetattrFlags(in.GetattrFlags), - Handle: HandleID(in.Fh), - } - } - - case opSetattr: - in := (*setattrIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &SetattrRequest{ - Header: m.Header(), - Valid: SetattrValid(in.Valid), - Handle: HandleID(in.Fh), - Size: in.Size, - Atime: time.Unix(int64(in.Atime), int64(in.AtimeNsec)), - Mtime: time.Unix(int64(in.Mtime), int64(in.MtimeNsec)), - Mode: fileMode(in.Mode), - Uid: in.Uid, - Gid: in.Gid, - Bkuptime: in.BkupTime(), - Chgtime: in.Chgtime(), - Flags: in.Flags(), - } - - case opReadlink: - if len(m.bytes()) > 0 { - goto corrupt - } - req = &ReadlinkRequest{ - Header: m.Header(), - } - - case opSymlink: - // m.bytes() is "newName\0target\0" - names := m.bytes() - if len(names) == 0 || names[len(names)-1] != 0 { - goto corrupt - } - i := bytes.IndexByte(names, '\x00') - if i < 0 { - goto corrupt - } - newName, target := names[0:i], names[i+1:len(names)-1] - req = &SymlinkRequest{ - Header: m.Header(), - NewName: string(newName), - Target: string(target), - } - - case opLink: - in := (*linkIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - newName := m.bytes()[unsafe.Sizeof(*in):] - if len(newName) < 2 || newName[len(newName)-1] != 0 { - goto corrupt - } - newName = newName[:len(newName)-1] - req = &LinkRequest{ - Header: m.Header(), - OldNode: NodeID(in.Oldnodeid), - NewName: string(newName), - } - - case opMknod: - size := mknodInSize(c.proto) - if m.len() < size { - goto corrupt - } - in := (*mknodIn)(m.data()) - name := m.bytes()[size:] - if len(name) < 2 || name[len(name)-1] != '\x00' { - goto corrupt - } - name = name[:len(name)-1] - r := &MknodRequest{ - Header: m.Header(), - Mode: fileMode(in.Mode), - Rdev: in.Rdev, - Name: string(name), - } - if c.proto.GE(Protocol{7, 12}) { - r.Umask = fileMode(in.Umask) & os.ModePerm - } - req = r - - case opMkdir: - size := mkdirInSize(c.proto) - if m.len() < size { - goto corrupt - } - in := (*mkdirIn)(m.data()) - name := m.bytes()[size:] - i := bytes.IndexByte(name, '\x00') - if i < 0 { - goto corrupt - } - r := &MkdirRequest{ - Header: m.Header(), - Name: string(name[:i]), - // observed on Linux: mkdirIn.Mode & syscall.S_IFMT == 0, - // and this causes fileMode to go into it's "no idea" - // code branch; enforce type to directory - Mode: fileMode((in.Mode &^ syscall.S_IFMT) | syscall.S_IFDIR), - } - if c.proto.GE(Protocol{7, 12}) { - r.Umask = fileMode(in.Umask) & os.ModePerm - } - req = r - - case opUnlink, opRmdir: - buf := m.bytes() - n := len(buf) - if n == 0 || buf[n-1] != '\x00' { - goto corrupt - } - req = &RemoveRequest{ - Header: m.Header(), - Name: string(buf[:n-1]), - Dir: m.hdr.Opcode == opRmdir, - } - - case opRename: - in := (*renameIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - newDirNodeID := NodeID(in.Newdir) - oldNew := m.bytes()[unsafe.Sizeof(*in):] - // oldNew should be "old\x00new\x00" - if len(oldNew) < 4 { - goto corrupt - } - if oldNew[len(oldNew)-1] != '\x00' { - goto corrupt - } - i := bytes.IndexByte(oldNew, '\x00') - if i < 0 { - goto corrupt - } - oldName, newName := string(oldNew[:i]), string(oldNew[i+1:len(oldNew)-1]) - req = &RenameRequest{ - Header: m.Header(), - NewDir: newDirNodeID, - OldName: oldName, - NewName: newName, - } - - case opOpendir, opOpen: - in := (*openIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &OpenRequest{ - Header: m.Header(), - Dir: m.hdr.Opcode == opOpendir, - Flags: openFlags(in.Flags), - } - - case opRead, opReaddir: - in := (*readIn)(m.data()) - if m.len() < readInSize(c.proto) { - goto corrupt - } - r := &ReadRequest{ - Header: m.Header(), - Dir: m.hdr.Opcode == opReaddir, - Handle: HandleID(in.Fh), - Offset: int64(in.Offset), - Size: int(in.Size), - } - if c.proto.GE(Protocol{7, 9}) { - r.Flags = ReadFlags(in.ReadFlags) - r.LockOwner = in.LockOwner - r.FileFlags = openFlags(in.Flags) - } - req = r - - case opWrite: - in := (*writeIn)(m.data()) - if m.len() < writeInSize(c.proto) { - goto corrupt - } - r := &WriteRequest{ - Header: m.Header(), - Handle: HandleID(in.Fh), - Offset: int64(in.Offset), - Flags: WriteFlags(in.WriteFlags), - } - if c.proto.GE(Protocol{7, 9}) { - r.LockOwner = in.LockOwner - r.FileFlags = openFlags(in.Flags) - } - buf := m.bytes()[writeInSize(c.proto):] - if uint32(len(buf)) < in.Size { - goto corrupt - } - r.Data = buf - req = r - - case opStatfs: - req = &StatfsRequest{ - Header: m.Header(), - } - - case opRelease, opReleasedir: - in := (*releaseIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &ReleaseRequest{ - Header: m.Header(), - Dir: m.hdr.Opcode == opReleasedir, - Handle: HandleID(in.Fh), - Flags: openFlags(in.Flags), - ReleaseFlags: ReleaseFlags(in.ReleaseFlags), - LockOwner: in.LockOwner, - } - - case opFsync, opFsyncdir: - in := (*fsyncIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &FsyncRequest{ - Dir: m.hdr.Opcode == opFsyncdir, - Header: m.Header(), - Handle: HandleID(in.Fh), - Flags: in.FsyncFlags, - } - - case opSetxattr: - in := (*setxattrIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - m.off += int(unsafe.Sizeof(*in)) - name := m.bytes() - i := bytes.IndexByte(name, '\x00') - if i < 0 { - goto corrupt - } - xattr := name[i+1:] - if uint32(len(xattr)) < in.Size { - goto corrupt - } - xattr = xattr[:in.Size] - req = &SetxattrRequest{ - Header: m.Header(), - Flags: in.Flags, - Position: in.position(), - Name: string(name[:i]), - Xattr: xattr, - } - - case opGetxattr: - in := (*getxattrIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - name := m.bytes()[unsafe.Sizeof(*in):] - i := bytes.IndexByte(name, '\x00') - if i < 0 { - goto corrupt - } - req = &GetxattrRequest{ - Header: m.Header(), - Name: string(name[:i]), - Size: in.Size, - Position: in.position(), - } - - case opListxattr: - in := (*getxattrIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &ListxattrRequest{ - Header: m.Header(), - Size: in.Size, - Position: in.position(), - } - - case opRemovexattr: - buf := m.bytes() - n := len(buf) - if n == 0 || buf[n-1] != '\x00' { - goto corrupt - } - req = &RemovexattrRequest{ - Header: m.Header(), - Name: string(buf[:n-1]), - } - - case opFlush: - in := (*flushIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &FlushRequest{ - Header: m.Header(), - Handle: HandleID(in.Fh), - Flags: in.FlushFlags, - LockOwner: in.LockOwner, - } - - case opInit: - in := (*initIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &InitRequest{ - Header: m.Header(), - Kernel: Protocol{in.Major, in.Minor}, - MaxReadahead: in.MaxReadahead, - Flags: InitFlags(in.Flags), - } - - case opGetlk: - panic("opGetlk") - case opSetlk: - panic("opSetlk") - case opSetlkw: - panic("opSetlkw") - - case opAccess: - in := (*accessIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &AccessRequest{ - Header: m.Header(), - Mask: in.Mask, - } - - case opCreate: - size := createInSize(c.proto) - if m.len() < size { - goto corrupt - } - in := (*createIn)(m.data()) - name := m.bytes()[size:] - i := bytes.IndexByte(name, '\x00') - if i < 0 { - goto corrupt - } - r := &CreateRequest{ - Header: m.Header(), - Flags: openFlags(in.Flags), - Mode: fileMode(in.Mode), - Name: string(name[:i]), - } - if c.proto.GE(Protocol{7, 12}) { - r.Umask = fileMode(in.Umask) & os.ModePerm - } - req = r - - case opInterrupt: - in := (*interruptIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - req = &InterruptRequest{ - Header: m.Header(), - IntrID: RequestID(in.Unique), - } - - case opBmap: - panic("opBmap") - - case opDestroy: - req = &DestroyRequest{ - Header: m.Header(), - } - - // OS X - case opSetvolname: - panic("opSetvolname") - case opGetxtimes: - panic("opGetxtimes") - case opExchange: - in := (*exchangeIn)(m.data()) - if m.len() < unsafe.Sizeof(*in) { - goto corrupt - } - oldDirNodeID := NodeID(in.Olddir) - newDirNodeID := NodeID(in.Newdir) - oldNew := m.bytes()[unsafe.Sizeof(*in):] - // oldNew should be "oldname\x00newname\x00" - if len(oldNew) < 4 { - goto corrupt - } - if oldNew[len(oldNew)-1] != '\x00' { - goto corrupt - } - i := bytes.IndexByte(oldNew, '\x00') - if i < 0 { - goto corrupt - } - oldName, newName := string(oldNew[:i]), string(oldNew[i+1:len(oldNew)-1]) - req = &ExchangeDataRequest{ - Header: m.Header(), - OldDir: oldDirNodeID, - NewDir: newDirNodeID, - OldName: oldName, - NewName: newName, - // TODO options - } - } - - return req, nil - -corrupt: - Debug(malformedMessage{}) - putMessage(m) - return nil, fmt.Errorf("fuse: malformed message") - -unrecognized: - // Unrecognized message. - // Assume higher-level code will send a "no idea what you mean" error. - h := m.Header() - return &h, nil -} - -type bugShortKernelWrite struct { - Written int64 - Length int64 - Error string - Stack string -} - -func (b bugShortKernelWrite) String() string { - return fmt.Sprintf("short kernel write: written=%d/%d error=%q stack=\n%s", b.Written, b.Length, b.Error, b.Stack) -} - -type bugKernelWriteError struct { - Error string - Stack string -} - -func (b bugKernelWriteError) String() string { - return fmt.Sprintf("kernel write error: error=%q stack=\n%s", b.Error, b.Stack) -} - -// safe to call even with nil error -func errorString(err error) string { - if err == nil { - return "" - } - return err.Error() -} - -func (c *Conn) writeToKernel(msg []byte) error { - out := (*outHeader)(unsafe.Pointer(&msg[0])) - out.Len = uint32(len(msg)) - - c.wio.RLock() - defer c.wio.RUnlock() - nn, err := syscall.Write(c.fd(), msg) - if err == nil && nn != len(msg) { - Debug(bugShortKernelWrite{ - Written: int64(nn), - Length: int64(len(msg)), - Error: errorString(err), - Stack: stack(), - }) - } - return err -} - -func (c *Conn) respond(msg []byte) { - if err := c.writeToKernel(msg); err != nil { - Debug(bugKernelWriteError{ - Error: errorString(err), - Stack: stack(), - }) - } -} - -type notCachedError struct{} - -func (notCachedError) Error() string { - return "node not cached" -} - -var _ ErrorNumber = notCachedError{} - -func (notCachedError) Errno() Errno { - // Behave just like if the original syscall.ENOENT had been passed - // straight through. - return ENOENT -} - -var ( - ErrNotCached = notCachedError{} -) - -// sendInvalidate sends an invalidate notification to kernel. -// -// A returned ENOENT is translated to a friendlier error. -func (c *Conn) sendInvalidate(msg []byte) error { - switch err := c.writeToKernel(msg); err { - case syscall.ENOENT: - return ErrNotCached - default: - return err - } -} - -// InvalidateNode invalidates the kernel cache of the attributes and a -// range of the data of a node. -// -// Giving offset 0 and size -1 means all data. To invalidate just the -// attributes, give offset 0 and size 0. -// -// Returns ErrNotCached if the kernel is not currently caching the -// node. -func (c *Conn) InvalidateNode(nodeID NodeID, off int64, size int64) error { - buf := newBuffer(unsafe.Sizeof(notifyInvalInodeOut{})) - h := (*outHeader)(unsafe.Pointer(&buf[0])) - // h.Unique is 0 - h.Error = notifyCodeInvalInode - out := (*notifyInvalInodeOut)(buf.alloc(unsafe.Sizeof(notifyInvalInodeOut{}))) - out.Ino = uint64(nodeID) - out.Off = off - out.Len = size - return c.sendInvalidate(buf) -} - -// InvalidateEntry invalidates the kernel cache of the directory entry -// identified by parent directory node ID and entry basename. -// -// Kernel may or may not cache directory listings. To invalidate -// those, use InvalidateNode to invalidate all of the data for a -// directory. (As of 2015-06, Linux FUSE does not cache directory -// listings.) -// -// Returns ErrNotCached if the kernel is not currently caching the -// node. -func (c *Conn) InvalidateEntry(parent NodeID, name string) error { - const maxUint32 = ^uint32(0) - if uint64(len(name)) > uint64(maxUint32) { - // very unlikely, but we don't want to silently truncate - return syscall.ENAMETOOLONG - } - buf := newBuffer(unsafe.Sizeof(notifyInvalEntryOut{}) + uintptr(len(name)) + 1) - h := (*outHeader)(unsafe.Pointer(&buf[0])) - // h.Unique is 0 - h.Error = notifyCodeInvalEntry - out := (*notifyInvalEntryOut)(buf.alloc(unsafe.Sizeof(notifyInvalEntryOut{}))) - out.Parent = uint64(parent) - out.Namelen = uint32(len(name)) - buf = append(buf, name...) - buf = append(buf, '\x00') - return c.sendInvalidate(buf) -} - -// An InitRequest is the first request sent on a FUSE file system. -type InitRequest struct { - Header `json:"-"` - Kernel Protocol - // Maximum readahead in bytes that the kernel plans to use. - MaxReadahead uint32 - Flags InitFlags -} - -var _ = Request(&InitRequest{}) - -func (r *InitRequest) String() string { - return fmt.Sprintf("Init [%v] %v ra=%d fl=%v", &r.Header, r.Kernel, r.MaxReadahead, r.Flags) -} - -// An InitResponse is the response to an InitRequest. -type InitResponse struct { - Library Protocol - // Maximum readahead in bytes that the kernel can use. Ignored if - // greater than InitRequest.MaxReadahead. - MaxReadahead uint32 - Flags InitFlags - // Maximum size of a single write operation. - // Linux enforces a minimum of 4 KiB. - MaxWrite uint32 -} - -func (r *InitResponse) String() string { - return fmt.Sprintf("Init %v ra=%d fl=%v w=%d", r.Library, r.MaxReadahead, r.Flags, r.MaxWrite) -} - -// Respond replies to the request with the given response. -func (r *InitRequest) Respond(resp *InitResponse) { - buf := newBuffer(unsafe.Sizeof(initOut{})) - out := (*initOut)(buf.alloc(unsafe.Sizeof(initOut{}))) - out.Major = resp.Library.Major - out.Minor = resp.Library.Minor - out.MaxReadahead = resp.MaxReadahead - out.Flags = uint32(resp.Flags) - out.MaxWrite = resp.MaxWrite - - // MaxWrite larger than our receive buffer would just lead to - // errors on large writes. - if out.MaxWrite > maxWrite { - out.MaxWrite = maxWrite - } - r.respond(buf) -} - -// A StatfsRequest requests information about the mounted file system. -type StatfsRequest struct { - Header `json:"-"` -} - -var _ = Request(&StatfsRequest{}) - -func (r *StatfsRequest) String() string { - return fmt.Sprintf("Statfs [%s]", &r.Header) -} - -// Respond replies to the request with the given response. -func (r *StatfsRequest) Respond(resp *StatfsResponse) { - buf := newBuffer(unsafe.Sizeof(statfsOut{})) - out := (*statfsOut)(buf.alloc(unsafe.Sizeof(statfsOut{}))) - out.St = kstatfs{ - Blocks: resp.Blocks, - Bfree: resp.Bfree, - Bavail: resp.Bavail, - Files: resp.Files, - Bsize: resp.Bsize, - Namelen: resp.Namelen, - Frsize: resp.Frsize, - } - r.respond(buf) -} - -// A StatfsResponse is the response to a StatfsRequest. -type StatfsResponse struct { - Blocks uint64 // Total data blocks in file system. - Bfree uint64 // Free blocks in file system. - Bavail uint64 // Free blocks in file system if you're not root. - Files uint64 // Total files in file system. - Ffree uint64 // Free files in file system. - Bsize uint32 // Block size - Namelen uint32 // Maximum file name length? - Frsize uint32 // Fragment size, smallest addressable data size in the file system. -} - -func (r *StatfsResponse) String() string { - return fmt.Sprintf("Statfs blocks=%d/%d/%d files=%d/%d bsize=%d frsize=%d namelen=%d", - r.Bavail, r.Bfree, r.Blocks, - r.Ffree, r.Files, - r.Bsize, - r.Frsize, - r.Namelen, - ) -} - -// An AccessRequest asks whether the file can be accessed -// for the purpose specified by the mask. -type AccessRequest struct { - Header `json:"-"` - Mask uint32 -} - -var _ = Request(&AccessRequest{}) - -func (r *AccessRequest) String() string { - return fmt.Sprintf("Access [%s] mask=%#x", &r.Header, r.Mask) -} - -// Respond replies to the request indicating that access is allowed. -// To deny access, use RespondError. -func (r *AccessRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// An Attr is the metadata for a single file or directory. -type Attr struct { - Valid time.Duration // how long Attr can be cached - - Inode uint64 // inode number - Size uint64 // size in bytes - Blocks uint64 // size in 512-byte units - Atime time.Time // time of last access - Mtime time.Time // time of last modification - Ctime time.Time // time of last inode change - Crtime time.Time // time of creation (OS X only) - Mode os.FileMode // file mode - Nlink uint32 // number of links (usually 1) - Uid uint32 // owner uid - Gid uint32 // group gid - Rdev uint32 // device numbers - Flags uint32 // chflags(2) flags (OS X only) - BlockSize uint32 // preferred blocksize for filesystem I/O -} - -func (a Attr) String() string { - return fmt.Sprintf("valid=%v ino=%v size=%d mode=%v", a.Valid, a.Inode, a.Size, a.Mode) -} - -func unix(t time.Time) (sec uint64, nsec uint32) { - nano := t.UnixNano() - sec = uint64(nano / 1e9) - nsec = uint32(nano % 1e9) - return -} - -func (a *Attr) attr(out *attr, proto Protocol) { - out.Ino = a.Inode - out.Size = a.Size - out.Blocks = a.Blocks - out.Atime, out.AtimeNsec = unix(a.Atime) - out.Mtime, out.MtimeNsec = unix(a.Mtime) - out.Ctime, out.CtimeNsec = unix(a.Ctime) - out.SetCrtime(unix(a.Crtime)) - out.Mode = uint32(a.Mode) & 0777 - switch { - default: - out.Mode |= syscall.S_IFREG - case a.Mode&os.ModeDir != 0: - out.Mode |= syscall.S_IFDIR - case a.Mode&os.ModeDevice != 0: - if a.Mode&os.ModeCharDevice != 0 { - out.Mode |= syscall.S_IFCHR - } else { - out.Mode |= syscall.S_IFBLK - } - case a.Mode&os.ModeNamedPipe != 0: - out.Mode |= syscall.S_IFIFO - case a.Mode&os.ModeSymlink != 0: - out.Mode |= syscall.S_IFLNK - case a.Mode&os.ModeSocket != 0: - out.Mode |= syscall.S_IFSOCK - } - if a.Mode&os.ModeSetuid != 0 { - out.Mode |= syscall.S_ISUID - } - if a.Mode&os.ModeSetgid != 0 { - out.Mode |= syscall.S_ISGID - } - out.Nlink = a.Nlink - out.Uid = a.Uid - out.Gid = a.Gid - out.Rdev = a.Rdev - out.SetFlags(a.Flags) - if proto.GE(Protocol{7, 9}) { - out.Blksize = a.BlockSize - } - - return -} - -// A GetattrRequest asks for the metadata for the file denoted by r.Node. -type GetattrRequest struct { - Header `json:"-"` - Flags GetattrFlags - Handle HandleID -} - -var _ = Request(&GetattrRequest{}) - -func (r *GetattrRequest) String() string { - return fmt.Sprintf("Getattr [%s] %v fl=%v", &r.Header, r.Handle, r.Flags) -} - -// Respond replies to the request with the given response. -func (r *GetattrRequest) Respond(resp *GetattrResponse) { - size := attrOutSize(r.Header.Conn.proto) - buf := newBuffer(size) - out := (*attrOut)(buf.alloc(size)) - out.AttrValid = uint64(resp.Attr.Valid / time.Second) - out.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&out.Attr, r.Header.Conn.proto) - r.respond(buf) -} - -// A GetattrResponse is the response to a GetattrRequest. -type GetattrResponse struct { - Attr Attr // file attributes -} - -func (r *GetattrResponse) String() string { - return fmt.Sprintf("Getattr %v", r.Attr) -} - -// A GetxattrRequest asks for the extended attributes associated with r.Node. -type GetxattrRequest struct { - Header `json:"-"` - - // Maximum size to return. - Size uint32 - - // Name of the attribute requested. - Name string - - // Offset within extended attributes. - // - // Only valid for OS X, and then only with the resource fork - // attribute. - Position uint32 -} - -var _ = Request(&GetxattrRequest{}) - -func (r *GetxattrRequest) String() string { - return fmt.Sprintf("Getxattr [%s] %q %d @%d", &r.Header, r.Name, r.Size, r.Position) -} - -// Respond replies to the request with the given response. -func (r *GetxattrRequest) Respond(resp *GetxattrResponse) { - if r.Size == 0 { - buf := newBuffer(unsafe.Sizeof(getxattrOut{})) - out := (*getxattrOut)(buf.alloc(unsafe.Sizeof(getxattrOut{}))) - out.Size = uint32(len(resp.Xattr)) - r.respond(buf) - } else { - buf := newBuffer(uintptr(len(resp.Xattr))) - buf = append(buf, resp.Xattr...) - r.respond(buf) - } -} - -// A GetxattrResponse is the response to a GetxattrRequest. -type GetxattrResponse struct { - Xattr []byte -} - -func (r *GetxattrResponse) String() string { - return fmt.Sprintf("Getxattr %x", r.Xattr) -} - -// A ListxattrRequest asks to list the extended attributes associated with r.Node. -type ListxattrRequest struct { - Header `json:"-"` - Size uint32 // maximum size to return - Position uint32 // offset within attribute list -} - -var _ = Request(&ListxattrRequest{}) - -func (r *ListxattrRequest) String() string { - return fmt.Sprintf("Listxattr [%s] %d @%d", &r.Header, r.Size, r.Position) -} - -// Respond replies to the request with the given response. -func (r *ListxattrRequest) Respond(resp *ListxattrResponse) { - if r.Size == 0 { - buf := newBuffer(unsafe.Sizeof(getxattrOut{})) - out := (*getxattrOut)(buf.alloc(unsafe.Sizeof(getxattrOut{}))) - out.Size = uint32(len(resp.Xattr)) - r.respond(buf) - } else { - buf := newBuffer(uintptr(len(resp.Xattr))) - buf = append(buf, resp.Xattr...) - r.respond(buf) - } -} - -// A ListxattrResponse is the response to a ListxattrRequest. -type ListxattrResponse struct { - Xattr []byte -} - -func (r *ListxattrResponse) String() string { - return fmt.Sprintf("Listxattr %x", r.Xattr) -} - -// Append adds an extended attribute name to the response. -func (r *ListxattrResponse) Append(names ...string) { - for _, name := range names { - r.Xattr = append(r.Xattr, name...) - r.Xattr = append(r.Xattr, '\x00') - } -} - -// A RemovexattrRequest asks to remove an extended attribute associated with r.Node. -type RemovexattrRequest struct { - Header `json:"-"` - Name string // name of extended attribute -} - -var _ = Request(&RemovexattrRequest{}) - -func (r *RemovexattrRequest) String() string { - return fmt.Sprintf("Removexattr [%s] %q", &r.Header, r.Name) -} - -// Respond replies to the request, indicating that the attribute was removed. -func (r *RemovexattrRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// A SetxattrRequest asks to set an extended attribute associated with a file. -type SetxattrRequest struct { - Header `json:"-"` - - // Flags can make the request fail if attribute does/not already - // exist. Unfortunately, the constants are platform-specific and - // not exposed by Go1.2. Look for XATTR_CREATE, XATTR_REPLACE. - // - // TODO improve this later - // - // TODO XATTR_CREATE and exist -> EEXIST - // - // TODO XATTR_REPLACE and not exist -> ENODATA - Flags uint32 - - // Offset within extended attributes. - // - // Only valid for OS X, and then only with the resource fork - // attribute. - Position uint32 - - Name string - Xattr []byte -} - -var _ = Request(&SetxattrRequest{}) - -func trunc(b []byte, max int) ([]byte, string) { - if len(b) > max { - return b[:max], "..." - } - return b, "" -} - -func (r *SetxattrRequest) String() string { - xattr, tail := trunc(r.Xattr, 16) - return fmt.Sprintf("Setxattr [%s] %q %x%s fl=%v @%#x", &r.Header, r.Name, xattr, tail, r.Flags, r.Position) -} - -// Respond replies to the request, indicating that the extended attribute was set. -func (r *SetxattrRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// A LookupRequest asks to look up the given name in the directory named by r.Node. -type LookupRequest struct { - Header `json:"-"` - Name string -} - -var _ = Request(&LookupRequest{}) - -func (r *LookupRequest) String() string { - return fmt.Sprintf("Lookup [%s] %q", &r.Header, r.Name) -} - -// Respond replies to the request with the given response. -func (r *LookupRequest) Respond(resp *LookupResponse) { - size := entryOutSize(r.Header.Conn.proto) - buf := newBuffer(size) - out := (*entryOut)(buf.alloc(size)) - out.Nodeid = uint64(resp.Node) - out.Generation = resp.Generation - out.EntryValid = uint64(resp.EntryValid / time.Second) - out.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond) - out.AttrValid = uint64(resp.Attr.Valid / time.Second) - out.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&out.Attr, r.Header.Conn.proto) - r.respond(buf) -} - -// A LookupResponse is the response to a LookupRequest. -type LookupResponse struct { - Node NodeID - Generation uint64 - EntryValid time.Duration - Attr Attr -} - -func (r *LookupResponse) string() string { - return fmt.Sprintf("%v gen=%d valid=%v attr={%v}", r.Node, r.Generation, r.EntryValid, r.Attr) -} - -func (r *LookupResponse) String() string { - return fmt.Sprintf("Lookup %s", r.string()) -} - -// An OpenRequest asks to open a file or directory -type OpenRequest struct { - Header `json:"-"` - Dir bool // is this Opendir? - Flags OpenFlags -} - -var _ = Request(&OpenRequest{}) - -func (r *OpenRequest) String() string { - return fmt.Sprintf("Open [%s] dir=%v fl=%v", &r.Header, r.Dir, r.Flags) -} - -// Respond replies to the request with the given response. -func (r *OpenRequest) Respond(resp *OpenResponse) { - buf := newBuffer(unsafe.Sizeof(openOut{})) - out := (*openOut)(buf.alloc(unsafe.Sizeof(openOut{}))) - out.Fh = uint64(resp.Handle) - out.OpenFlags = uint32(resp.Flags) - r.respond(buf) -} - -// A OpenResponse is the response to a OpenRequest. -type OpenResponse struct { - Handle HandleID - Flags OpenResponseFlags -} - -func (r *OpenResponse) string() string { - return fmt.Sprintf("%v fl=%v", r.Handle, r.Flags) -} - -func (r *OpenResponse) String() string { - return fmt.Sprintf("Open %s", r.string()) -} - -// A CreateRequest asks to create and open a file (not a directory). -type CreateRequest struct { - Header `json:"-"` - Name string - Flags OpenFlags - Mode os.FileMode - // Umask of the request. Not supported on OS X. - Umask os.FileMode -} - -var _ = Request(&CreateRequest{}) - -func (r *CreateRequest) String() string { - return fmt.Sprintf("Create [%s] %q fl=%v mode=%v umask=%v", &r.Header, r.Name, r.Flags, r.Mode, r.Umask) -} - -// Respond replies to the request with the given response. -func (r *CreateRequest) Respond(resp *CreateResponse) { - eSize := entryOutSize(r.Header.Conn.proto) - buf := newBuffer(eSize + unsafe.Sizeof(openOut{})) - - e := (*entryOut)(buf.alloc(eSize)) - e.Nodeid = uint64(resp.Node) - e.Generation = resp.Generation - e.EntryValid = uint64(resp.EntryValid / time.Second) - e.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond) - e.AttrValid = uint64(resp.Attr.Valid / time.Second) - e.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&e.Attr, r.Header.Conn.proto) - - o := (*openOut)(buf.alloc(unsafe.Sizeof(openOut{}))) - o.Fh = uint64(resp.Handle) - o.OpenFlags = uint32(resp.Flags) - - r.respond(buf) -} - -// A CreateResponse is the response to a CreateRequest. -// It describes the created node and opened handle. -type CreateResponse struct { - LookupResponse - OpenResponse -} - -func (r *CreateResponse) String() string { - return fmt.Sprintf("Create {%s} {%s}", r.LookupResponse.string(), r.OpenResponse.string()) -} - -// A MkdirRequest asks to create (but not open) a directory. -type MkdirRequest struct { - Header `json:"-"` - Name string - Mode os.FileMode - // Umask of the request. Not supported on OS X. - Umask os.FileMode -} - -var _ = Request(&MkdirRequest{}) - -func (r *MkdirRequest) String() string { - return fmt.Sprintf("Mkdir [%s] %q mode=%v umask=%v", &r.Header, r.Name, r.Mode, r.Umask) -} - -// Respond replies to the request with the given response. -func (r *MkdirRequest) Respond(resp *MkdirResponse) { - size := entryOutSize(r.Header.Conn.proto) - buf := newBuffer(size) - out := (*entryOut)(buf.alloc(size)) - out.Nodeid = uint64(resp.Node) - out.Generation = resp.Generation - out.EntryValid = uint64(resp.EntryValid / time.Second) - out.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond) - out.AttrValid = uint64(resp.Attr.Valid / time.Second) - out.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&out.Attr, r.Header.Conn.proto) - r.respond(buf) -} - -// A MkdirResponse is the response to a MkdirRequest. -type MkdirResponse struct { - LookupResponse -} - -func (r *MkdirResponse) String() string { - return fmt.Sprintf("Mkdir %v", r.LookupResponse.string()) -} - -// A ReadRequest asks to read from an open file. -type ReadRequest struct { - Header `json:"-"` - Dir bool // is this Readdir? - Handle HandleID - Offset int64 - Size int - Flags ReadFlags - LockOwner uint64 - FileFlags OpenFlags -} - -var _ = Request(&ReadRequest{}) - -func (r *ReadRequest) String() string { - return fmt.Sprintf("Read [%s] %v %d @%#x dir=%v fl=%v lock=%d ffl=%v", &r.Header, r.Handle, r.Size, r.Offset, r.Dir, r.Flags, r.LockOwner, r.FileFlags) -} - -// Respond replies to the request with the given response. -func (r *ReadRequest) Respond(resp *ReadResponse) { - buf := newBuffer(uintptr(len(resp.Data))) - buf = append(buf, resp.Data...) - r.respond(buf) -} - -// A ReadResponse is the response to a ReadRequest. -type ReadResponse struct { - Data []byte -} - -func (r *ReadResponse) String() string { - return fmt.Sprintf("Read %d", len(r.Data)) -} - -type jsonReadResponse struct { - Len uint64 -} - -func (r *ReadResponse) MarshalJSON() ([]byte, error) { - j := jsonReadResponse{ - Len: uint64(len(r.Data)), - } - return json.Marshal(j) -} - -// A ReleaseRequest asks to release (close) an open file handle. -type ReleaseRequest struct { - Header `json:"-"` - Dir bool // is this Releasedir? - Handle HandleID - Flags OpenFlags // flags from OpenRequest - ReleaseFlags ReleaseFlags - LockOwner uint32 -} - -var _ = Request(&ReleaseRequest{}) - -func (r *ReleaseRequest) String() string { - return fmt.Sprintf("Release [%s] %v fl=%v rfl=%v owner=%#x", &r.Header, r.Handle, r.Flags, r.ReleaseFlags, r.LockOwner) -} - -// Respond replies to the request, indicating that the handle has been released. -func (r *ReleaseRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// A DestroyRequest is sent by the kernel when unmounting the file system. -// No more requests will be received after this one, but it should still be -// responded to. -type DestroyRequest struct { - Header `json:"-"` -} - -var _ = Request(&DestroyRequest{}) - -func (r *DestroyRequest) String() string { - return fmt.Sprintf("Destroy [%s]", &r.Header) -} - -// Respond replies to the request. -func (r *DestroyRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// A ForgetRequest is sent by the kernel when forgetting about r.Node -// as returned by r.N lookup requests. -type ForgetRequest struct { - Header `json:"-"` - N uint64 -} - -var _ = Request(&ForgetRequest{}) - -func (r *ForgetRequest) String() string { - return fmt.Sprintf("Forget [%s] %d", &r.Header, r.N) -} - -// Respond replies to the request, indicating that the forgetfulness has been recorded. -func (r *ForgetRequest) Respond() { - // Don't reply to forget messages. - r.noResponse() -} - -// A Dirent represents a single directory entry. -type Dirent struct { - // Inode this entry names. - Inode uint64 - - // Type of the entry, for example DT_File. - // - // Setting this is optional. The zero value (DT_Unknown) means - // callers will just need to do a Getattr when the type is - // needed. Providing a type can speed up operations - // significantly. - Type DirentType - - // Name of the entry - Name string -} - -// Type of an entry in a directory listing. -type DirentType uint32 - -const ( - // These don't quite match os.FileMode; especially there's an - // explicit unknown, instead of zero value meaning file. They - // are also not quite syscall.DT_*; nothing says the FUSE - // protocol follows those, and even if they were, we don't - // want each fs to fiddle with syscall. - - // The shift by 12 is hardcoded in the FUSE userspace - // low-level C library, so it's safe here. - - DT_Unknown DirentType = 0 - DT_Socket DirentType = syscall.S_IFSOCK >> 12 - DT_Link DirentType = syscall.S_IFLNK >> 12 - DT_File DirentType = syscall.S_IFREG >> 12 - DT_Block DirentType = syscall.S_IFBLK >> 12 - DT_Dir DirentType = syscall.S_IFDIR >> 12 - DT_Char DirentType = syscall.S_IFCHR >> 12 - DT_FIFO DirentType = syscall.S_IFIFO >> 12 -) - -func (t DirentType) String() string { - switch t { - case DT_Unknown: - return "unknown" - case DT_Socket: - return "socket" - case DT_Link: - return "link" - case DT_File: - return "file" - case DT_Block: - return "block" - case DT_Dir: - return "dir" - case DT_Char: - return "char" - case DT_FIFO: - return "fifo" - } - return "invalid" -} - -// AppendDirent appends the encoded form of a directory entry to data -// and returns the resulting slice. -func AppendDirent(data []byte, dir Dirent) []byte { - de := dirent{ - Ino: dir.Inode, - Namelen: uint32(len(dir.Name)), - Type: uint32(dir.Type), - } - de.Off = uint64(len(data) + direntSize + (len(dir.Name)+7)&^7) - data = append(data, (*[direntSize]byte)(unsafe.Pointer(&de))[:]...) - data = append(data, dir.Name...) - n := direntSize + uintptr(len(dir.Name)) - if n%8 != 0 { - var pad [8]byte - data = append(data, pad[:8-n%8]...) - } - return data -} - -// A WriteRequest asks to write to an open file. -type WriteRequest struct { - Header - Handle HandleID - Offset int64 - Data []byte - Flags WriteFlags - LockOwner uint64 - FileFlags OpenFlags -} - -var _ = Request(&WriteRequest{}) - -func (r *WriteRequest) String() string { - return fmt.Sprintf("Write [%s] %v %d @%d fl=%v lock=%d ffl=%v", &r.Header, r.Handle, len(r.Data), r.Offset, r.Flags, r.LockOwner, r.FileFlags) -} - -type jsonWriteRequest struct { - Handle HandleID - Offset int64 - Len uint64 - Flags WriteFlags -} - -func (r *WriteRequest) MarshalJSON() ([]byte, error) { - j := jsonWriteRequest{ - Handle: r.Handle, - Offset: r.Offset, - Len: uint64(len(r.Data)), - Flags: r.Flags, - } - return json.Marshal(j) -} - -// Respond replies to the request with the given response. -func (r *WriteRequest) Respond(resp *WriteResponse) { - buf := newBuffer(unsafe.Sizeof(writeOut{})) - out := (*writeOut)(buf.alloc(unsafe.Sizeof(writeOut{}))) - out.Size = uint32(resp.Size) - r.respond(buf) -} - -// A WriteResponse replies to a write indicating how many bytes were written. -type WriteResponse struct { - Size int -} - -func (r *WriteResponse) String() string { - return fmt.Sprintf("Write %d", r.Size) -} - -// A SetattrRequest asks to change one or more attributes associated with a file, -// as indicated by Valid. -type SetattrRequest struct { - Header `json:"-"` - Valid SetattrValid - Handle HandleID - Size uint64 - Atime time.Time - Mtime time.Time - Mode os.FileMode - Uid uint32 - Gid uint32 - - // OS X only - Bkuptime time.Time - Chgtime time.Time - Crtime time.Time - Flags uint32 // see chflags(2) -} - -var _ = Request(&SetattrRequest{}) - -func (r *SetattrRequest) String() string { - var buf bytes.Buffer - fmt.Fprintf(&buf, "Setattr [%s]", &r.Header) - if r.Valid.Mode() { - fmt.Fprintf(&buf, " mode=%v", r.Mode) - } - if r.Valid.Uid() { - fmt.Fprintf(&buf, " uid=%d", r.Uid) - } - if r.Valid.Gid() { - fmt.Fprintf(&buf, " gid=%d", r.Gid) - } - if r.Valid.Size() { - fmt.Fprintf(&buf, " size=%d", r.Size) - } - if r.Valid.Atime() { - fmt.Fprintf(&buf, " atime=%v", r.Atime) - } - if r.Valid.AtimeNow() { - fmt.Fprintf(&buf, " atime=now") - } - if r.Valid.Mtime() { - fmt.Fprintf(&buf, " mtime=%v", r.Mtime) - } - if r.Valid.MtimeNow() { - fmt.Fprintf(&buf, " mtime=now") - } - if r.Valid.Handle() { - fmt.Fprintf(&buf, " handle=%v", r.Handle) - } else { - fmt.Fprintf(&buf, " handle=INVALID-%v", r.Handle) - } - if r.Valid.LockOwner() { - fmt.Fprintf(&buf, " lockowner") - } - if r.Valid.Crtime() { - fmt.Fprintf(&buf, " crtime=%v", r.Crtime) - } - if r.Valid.Chgtime() { - fmt.Fprintf(&buf, " chgtime=%v", r.Chgtime) - } - if r.Valid.Bkuptime() { - fmt.Fprintf(&buf, " bkuptime=%v", r.Bkuptime) - } - if r.Valid.Flags() { - fmt.Fprintf(&buf, " flags=%v", r.Flags) - } - return buf.String() -} - -// Respond replies to the request with the given response, -// giving the updated attributes. -func (r *SetattrRequest) Respond(resp *SetattrResponse) { - size := attrOutSize(r.Header.Conn.proto) - buf := newBuffer(size) - out := (*attrOut)(buf.alloc(size)) - out.AttrValid = uint64(resp.Attr.Valid / time.Second) - out.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&out.Attr, r.Header.Conn.proto) - r.respond(buf) -} - -// A SetattrResponse is the response to a SetattrRequest. -type SetattrResponse struct { - Attr Attr // file attributes -} - -func (r *SetattrResponse) String() string { - return fmt.Sprintf("Setattr %v", r.Attr) -} - -// A FlushRequest asks for the current state of an open file to be flushed -// to storage, as when a file descriptor is being closed. A single opened Handle -// may receive multiple FlushRequests over its lifetime. -type FlushRequest struct { - Header `json:"-"` - Handle HandleID - Flags uint32 - LockOwner uint64 -} - -var _ = Request(&FlushRequest{}) - -func (r *FlushRequest) String() string { - return fmt.Sprintf("Flush [%s] %v fl=%#x lk=%#x", &r.Header, r.Handle, r.Flags, r.LockOwner) -} - -// Respond replies to the request, indicating that the flush succeeded. -func (r *FlushRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// A RemoveRequest asks to remove a file or directory from the -// directory r.Node. -type RemoveRequest struct { - Header `json:"-"` - Name string // name of the entry to remove - Dir bool // is this rmdir? -} - -var _ = Request(&RemoveRequest{}) - -func (r *RemoveRequest) String() string { - return fmt.Sprintf("Remove [%s] %q dir=%v", &r.Header, r.Name, r.Dir) -} - -// Respond replies to the request, indicating that the file was removed. -func (r *RemoveRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// A SymlinkRequest is a request to create a symlink making NewName point to Target. -type SymlinkRequest struct { - Header `json:"-"` - NewName, Target string -} - -var _ = Request(&SymlinkRequest{}) - -func (r *SymlinkRequest) String() string { - return fmt.Sprintf("Symlink [%s] from %q to target %q", &r.Header, r.NewName, r.Target) -} - -// Respond replies to the request, indicating that the symlink was created. -func (r *SymlinkRequest) Respond(resp *SymlinkResponse) { - size := entryOutSize(r.Header.Conn.proto) - buf := newBuffer(size) - out := (*entryOut)(buf.alloc(size)) - out.Nodeid = uint64(resp.Node) - out.Generation = resp.Generation - out.EntryValid = uint64(resp.EntryValid / time.Second) - out.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond) - out.AttrValid = uint64(resp.Attr.Valid / time.Second) - out.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&out.Attr, r.Header.Conn.proto) - r.respond(buf) -} - -// A SymlinkResponse is the response to a SymlinkRequest. -type SymlinkResponse struct { - LookupResponse -} - -func (r *SymlinkResponse) String() string { - return fmt.Sprintf("Symlink %v", r.LookupResponse.string()) -} - -// A ReadlinkRequest is a request to read a symlink's target. -type ReadlinkRequest struct { - Header `json:"-"` -} - -var _ = Request(&ReadlinkRequest{}) - -func (r *ReadlinkRequest) String() string { - return fmt.Sprintf("Readlink [%s]", &r.Header) -} - -func (r *ReadlinkRequest) Respond(target string) { - buf := newBuffer(uintptr(len(target))) - buf = append(buf, target...) - r.respond(buf) -} - -// A LinkRequest is a request to create a hard link. -type LinkRequest struct { - Header `json:"-"` - OldNode NodeID - NewName string -} - -var _ = Request(&LinkRequest{}) - -func (r *LinkRequest) String() string { - return fmt.Sprintf("Link [%s] node %d to %q", &r.Header, r.OldNode, r.NewName) -} - -func (r *LinkRequest) Respond(resp *LookupResponse) { - size := entryOutSize(r.Header.Conn.proto) - buf := newBuffer(size) - out := (*entryOut)(buf.alloc(size)) - out.Nodeid = uint64(resp.Node) - out.Generation = resp.Generation - out.EntryValid = uint64(resp.EntryValid / time.Second) - out.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond) - out.AttrValid = uint64(resp.Attr.Valid / time.Second) - out.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&out.Attr, r.Header.Conn.proto) - r.respond(buf) -} - -// A RenameRequest is a request to rename a file. -type RenameRequest struct { - Header `json:"-"` - NewDir NodeID - OldName, NewName string -} - -var _ = Request(&RenameRequest{}) - -func (r *RenameRequest) String() string { - return fmt.Sprintf("Rename [%s] from %q to dirnode %v %q", &r.Header, r.OldName, r.NewDir, r.NewName) -} - -func (r *RenameRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -type MknodRequest struct { - Header `json:"-"` - Name string - Mode os.FileMode - Rdev uint32 - // Umask of the request. Not supported on OS X. - Umask os.FileMode -} - -var _ = Request(&MknodRequest{}) - -func (r *MknodRequest) String() string { - return fmt.Sprintf("Mknod [%s] Name %q mode=%v umask=%v rdev=%d", &r.Header, r.Name, r.Mode, r.Umask, r.Rdev) -} - -func (r *MknodRequest) Respond(resp *LookupResponse) { - size := entryOutSize(r.Header.Conn.proto) - buf := newBuffer(size) - out := (*entryOut)(buf.alloc(size)) - out.Nodeid = uint64(resp.Node) - out.Generation = resp.Generation - out.EntryValid = uint64(resp.EntryValid / time.Second) - out.EntryValidNsec = uint32(resp.EntryValid % time.Second / time.Nanosecond) - out.AttrValid = uint64(resp.Attr.Valid / time.Second) - out.AttrValidNsec = uint32(resp.Attr.Valid % time.Second / time.Nanosecond) - resp.Attr.attr(&out.Attr, r.Header.Conn.proto) - r.respond(buf) -} - -type FsyncRequest struct { - Header `json:"-"` - Handle HandleID - // TODO bit 1 is datasync, not well documented upstream - Flags uint32 - Dir bool -} - -var _ = Request(&FsyncRequest{}) - -func (r *FsyncRequest) String() string { - return fmt.Sprintf("Fsync [%s] Handle %v Flags %v", &r.Header, r.Handle, r.Flags) -} - -func (r *FsyncRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} - -// An InterruptRequest is a request to interrupt another pending request. The -// response to that request should return an error status of EINTR. -type InterruptRequest struct { - Header `json:"-"` - IntrID RequestID // ID of the request to be interrupt. -} - -var _ = Request(&InterruptRequest{}) - -func (r *InterruptRequest) Respond() { - // nothing to do here - r.noResponse() -} - -func (r *InterruptRequest) String() string { - return fmt.Sprintf("Interrupt [%s] ID %v", &r.Header, r.IntrID) -} - -// An ExchangeDataRequest is a request to exchange the contents of two -// files, while leaving most metadata untouched. -// -// This request comes from OS X exchangedata(2) and represents its -// specific semantics. Crucially, it is very different from Linux -// renameat(2) RENAME_EXCHANGE. -// -// https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/exchangedata.2.html -type ExchangeDataRequest struct { - Header `json:"-"` - OldDir, NewDir NodeID - OldName, NewName string - // TODO options -} - -var _ = Request(&ExchangeDataRequest{}) - -func (r *ExchangeDataRequest) String() string { - // TODO options - return fmt.Sprintf("ExchangeData [%s] %v %q and %v %q", &r.Header, r.OldDir, r.OldName, r.NewDir, r.NewName) -} - -func (r *ExchangeDataRequest) Respond() { - buf := newBuffer(0) - r.respond(buf) -} diff --git a/vendor/bazil.org/fuse/fuse.iml b/vendor/bazil.org/fuse/fuse.iml deleted file mode 100644 index 792ad4c30c83..000000000000 --- a/vendor/bazil.org/fuse/fuse.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/vendor/bazil.org/fuse/fuse_darwin.go b/vendor/bazil.org/fuse/fuse_darwin.go deleted file mode 100644 index b58dca97d648..000000000000 --- a/vendor/bazil.org/fuse/fuse_darwin.go +++ /dev/null @@ -1,9 +0,0 @@ -package fuse - -// Maximum file write size we are prepared to receive from the kernel. -// -// This value has to be >=16MB or OSXFUSE (3.4.0 observed) will -// forcibly close the /dev/fuse file descriptor on a Setxattr with a -// 16MB value. See TestSetxattr16MB and -// https://github.com/bazil/fuse/issues/42 -const maxWrite = 16 * 1024 * 1024 diff --git a/vendor/bazil.org/fuse/fuse_freebsd.go b/vendor/bazil.org/fuse/fuse_freebsd.go deleted file mode 100644 index 4aa83a0d4104..000000000000 --- a/vendor/bazil.org/fuse/fuse_freebsd.go +++ /dev/null @@ -1,6 +0,0 @@ -package fuse - -// Maximum file write size we are prepared to receive from the kernel. -// -// This number is just a guess. -const maxWrite = 128 * 1024 diff --git a/vendor/bazil.org/fuse/fuse_kernel.go b/vendor/bazil.org/fuse/fuse_kernel.go deleted file mode 100644 index 87c5ca1dc675..000000000000 --- a/vendor/bazil.org/fuse/fuse_kernel.go +++ /dev/null @@ -1,774 +0,0 @@ -// See the file LICENSE for copyright and licensing information. - -// Derived from FUSE's fuse_kernel.h, which carries this notice: -/* - This file defines the kernel interface of FUSE - Copyright (C) 2001-2007 Miklos Szeredi - - - This -- and only this -- header file may also be distributed under - the terms of the BSD Licence as follows: - - Copyright (C) 2001-2007 Miklos Szeredi. All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. 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. - - THIS SOFTWARE IS PROVIDED BY AUTHOR 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 AUTHOR 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 fuse - -import ( - "fmt" - "syscall" - "unsafe" -) - -// The FUSE version implemented by the package. -const ( - protoVersionMinMajor = 7 - protoVersionMinMinor = 8 - protoVersionMaxMajor = 7 - protoVersionMaxMinor = 12 -) - -const ( - rootID = 1 -) - -type kstatfs struct { - Blocks uint64 - Bfree uint64 - Bavail uint64 - Files uint64 - Ffree uint64 - Bsize uint32 - Namelen uint32 - Frsize uint32 - _ uint32 - Spare [6]uint32 -} - -type fileLock struct { - Start uint64 - End uint64 - Type uint32 - Pid uint32 -} - -// GetattrFlags are bit flags that can be seen in GetattrRequest. -type GetattrFlags uint32 - -const ( - // Indicates the handle is valid. - GetattrFh GetattrFlags = 1 << 0 -) - -var getattrFlagsNames = []flagName{ - {uint32(GetattrFh), "GetattrFh"}, -} - -func (fl GetattrFlags) String() string { - return flagString(uint32(fl), getattrFlagsNames) -} - -// The SetattrValid are bit flags describing which fields in the SetattrRequest -// are included in the change. -type SetattrValid uint32 - -const ( - SetattrMode SetattrValid = 1 << 0 - SetattrUid SetattrValid = 1 << 1 - SetattrGid SetattrValid = 1 << 2 - SetattrSize SetattrValid = 1 << 3 - SetattrAtime SetattrValid = 1 << 4 - SetattrMtime SetattrValid = 1 << 5 - SetattrHandle SetattrValid = 1 << 6 - - // Linux only(?) - SetattrAtimeNow SetattrValid = 1 << 7 - SetattrMtimeNow SetattrValid = 1 << 8 - SetattrLockOwner SetattrValid = 1 << 9 // http://www.mail-archive.com/git-commits-head@vger.kernel.org/msg27852.html - - // OS X only - SetattrCrtime SetattrValid = 1 << 28 - SetattrChgtime SetattrValid = 1 << 29 - SetattrBkuptime SetattrValid = 1 << 30 - SetattrFlags SetattrValid = 1 << 31 -) - -func (fl SetattrValid) Mode() bool { return fl&SetattrMode != 0 } -func (fl SetattrValid) Uid() bool { return fl&SetattrUid != 0 } -func (fl SetattrValid) Gid() bool { return fl&SetattrGid != 0 } -func (fl SetattrValid) Size() bool { return fl&SetattrSize != 0 } -func (fl SetattrValid) Atime() bool { return fl&SetattrAtime != 0 } -func (fl SetattrValid) Mtime() bool { return fl&SetattrMtime != 0 } -func (fl SetattrValid) Handle() bool { return fl&SetattrHandle != 0 } -func (fl SetattrValid) AtimeNow() bool { return fl&SetattrAtimeNow != 0 } -func (fl SetattrValid) MtimeNow() bool { return fl&SetattrMtimeNow != 0 } -func (fl SetattrValid) LockOwner() bool { return fl&SetattrLockOwner != 0 } -func (fl SetattrValid) Crtime() bool { return fl&SetattrCrtime != 0 } -func (fl SetattrValid) Chgtime() bool { return fl&SetattrChgtime != 0 } -func (fl SetattrValid) Bkuptime() bool { return fl&SetattrBkuptime != 0 } -func (fl SetattrValid) Flags() bool { return fl&SetattrFlags != 0 } - -func (fl SetattrValid) String() string { - return flagString(uint32(fl), setattrValidNames) -} - -var setattrValidNames = []flagName{ - {uint32(SetattrMode), "SetattrMode"}, - {uint32(SetattrUid), "SetattrUid"}, - {uint32(SetattrGid), "SetattrGid"}, - {uint32(SetattrSize), "SetattrSize"}, - {uint32(SetattrAtime), "SetattrAtime"}, - {uint32(SetattrMtime), "SetattrMtime"}, - {uint32(SetattrHandle), "SetattrHandle"}, - {uint32(SetattrAtimeNow), "SetattrAtimeNow"}, - {uint32(SetattrMtimeNow), "SetattrMtimeNow"}, - {uint32(SetattrLockOwner), "SetattrLockOwner"}, - {uint32(SetattrCrtime), "SetattrCrtime"}, - {uint32(SetattrChgtime), "SetattrChgtime"}, - {uint32(SetattrBkuptime), "SetattrBkuptime"}, - {uint32(SetattrFlags), "SetattrFlags"}, -} - -// Flags that can be seen in OpenRequest.Flags. -const ( - // Access modes. These are not 1-bit flags, but alternatives where - // only one can be chosen. See the IsReadOnly etc convenience - // methods. - OpenReadOnly OpenFlags = syscall.O_RDONLY - OpenWriteOnly OpenFlags = syscall.O_WRONLY - OpenReadWrite OpenFlags = syscall.O_RDWR - - // File was opened in append-only mode, all writes will go to end - // of file. OS X does not provide this information. - OpenAppend OpenFlags = syscall.O_APPEND - OpenCreate OpenFlags = syscall.O_CREAT - OpenDirectory OpenFlags = syscall.O_DIRECTORY - OpenExclusive OpenFlags = syscall.O_EXCL - OpenNonblock OpenFlags = syscall.O_NONBLOCK - OpenSync OpenFlags = syscall.O_SYNC - OpenTruncate OpenFlags = syscall.O_TRUNC -) - -// OpenAccessModeMask is a bitmask that separates the access mode -// from the other flags in OpenFlags. -const OpenAccessModeMask OpenFlags = syscall.O_ACCMODE - -// OpenFlags are the O_FOO flags passed to open/create/etc calls. For -// example, os.O_WRONLY | os.O_APPEND. -type OpenFlags uint32 - -func (fl OpenFlags) String() string { - // O_RDONLY, O_RWONLY, O_RDWR are not flags - s := accModeName(fl & OpenAccessModeMask) - flags := uint32(fl &^ OpenAccessModeMask) - if flags != 0 { - s = s + "+" + flagString(flags, openFlagNames) - } - return s -} - -// Return true if OpenReadOnly is set. -func (fl OpenFlags) IsReadOnly() bool { - return fl&OpenAccessModeMask == OpenReadOnly -} - -// Return true if OpenWriteOnly is set. -func (fl OpenFlags) IsWriteOnly() bool { - return fl&OpenAccessModeMask == OpenWriteOnly -} - -// Return true if OpenReadWrite is set. -func (fl OpenFlags) IsReadWrite() bool { - return fl&OpenAccessModeMask == OpenReadWrite -} - -func accModeName(flags OpenFlags) string { - switch flags { - case OpenReadOnly: - return "OpenReadOnly" - case OpenWriteOnly: - return "OpenWriteOnly" - case OpenReadWrite: - return "OpenReadWrite" - default: - return "" - } -} - -var openFlagNames = []flagName{ - {uint32(OpenAppend), "OpenAppend"}, - {uint32(OpenCreate), "OpenCreate"}, - {uint32(OpenDirectory), "OpenDirectory"}, - {uint32(OpenExclusive), "OpenExclusive"}, - {uint32(OpenNonblock), "OpenNonblock"}, - {uint32(OpenSync), "OpenSync"}, - {uint32(OpenTruncate), "OpenTruncate"}, -} - -// The OpenResponseFlags are returned in the OpenResponse. -type OpenResponseFlags uint32 - -const ( - OpenDirectIO OpenResponseFlags = 1 << 0 // bypass page cache for this open file - OpenKeepCache OpenResponseFlags = 1 << 1 // don't invalidate the data cache on open - OpenNonSeekable OpenResponseFlags = 1 << 2 // mark the file as non-seekable (not supported on OS X) - - OpenPurgeAttr OpenResponseFlags = 1 << 30 // OS X - OpenPurgeUBC OpenResponseFlags = 1 << 31 // OS X -) - -func (fl OpenResponseFlags) String() string { - return flagString(uint32(fl), openResponseFlagNames) -} - -var openResponseFlagNames = []flagName{ - {uint32(OpenDirectIO), "OpenDirectIO"}, - {uint32(OpenKeepCache), "OpenKeepCache"}, - {uint32(OpenNonSeekable), "OpenNonSeekable"}, - {uint32(OpenPurgeAttr), "OpenPurgeAttr"}, - {uint32(OpenPurgeUBC), "OpenPurgeUBC"}, -} - -// The InitFlags are used in the Init exchange. -type InitFlags uint32 - -const ( - InitAsyncRead InitFlags = 1 << 0 - InitPosixLocks InitFlags = 1 << 1 - InitFileOps InitFlags = 1 << 2 - InitAtomicTrunc InitFlags = 1 << 3 - InitExportSupport InitFlags = 1 << 4 - InitBigWrites InitFlags = 1 << 5 - // Do not mask file access modes with umask. Not supported on OS X. - InitDontMask InitFlags = 1 << 6 - InitSpliceWrite InitFlags = 1 << 7 - InitSpliceMove InitFlags = 1 << 8 - InitSpliceRead InitFlags = 1 << 9 - InitFlockLocks InitFlags = 1 << 10 - InitHasIoctlDir InitFlags = 1 << 11 - InitAutoInvalData InitFlags = 1 << 12 - InitDoReaddirplus InitFlags = 1 << 13 - InitReaddirplusAuto InitFlags = 1 << 14 - InitAsyncDIO InitFlags = 1 << 15 - InitWritebackCache InitFlags = 1 << 16 - InitNoOpenSupport InitFlags = 1 << 17 - - InitCaseSensitive InitFlags = 1 << 29 // OS X only - InitVolRename InitFlags = 1 << 30 // OS X only - InitXtimes InitFlags = 1 << 31 // OS X only -) - -type flagName struct { - bit uint32 - name string -} - -var initFlagNames = []flagName{ - {uint32(InitAsyncRead), "InitAsyncRead"}, - {uint32(InitPosixLocks), "InitPosixLocks"}, - {uint32(InitFileOps), "InitFileOps"}, - {uint32(InitAtomicTrunc), "InitAtomicTrunc"}, - {uint32(InitExportSupport), "InitExportSupport"}, - {uint32(InitBigWrites), "InitBigWrites"}, - {uint32(InitDontMask), "InitDontMask"}, - {uint32(InitSpliceWrite), "InitSpliceWrite"}, - {uint32(InitSpliceMove), "InitSpliceMove"}, - {uint32(InitSpliceRead), "InitSpliceRead"}, - {uint32(InitFlockLocks), "InitFlockLocks"}, - {uint32(InitHasIoctlDir), "InitHasIoctlDir"}, - {uint32(InitAutoInvalData), "InitAutoInvalData"}, - {uint32(InitDoReaddirplus), "InitDoReaddirplus"}, - {uint32(InitReaddirplusAuto), "InitReaddirplusAuto"}, - {uint32(InitAsyncDIO), "InitAsyncDIO"}, - {uint32(InitWritebackCache), "InitWritebackCache"}, - {uint32(InitNoOpenSupport), "InitNoOpenSupport"}, - - {uint32(InitCaseSensitive), "InitCaseSensitive"}, - {uint32(InitVolRename), "InitVolRename"}, - {uint32(InitXtimes), "InitXtimes"}, -} - -func (fl InitFlags) String() string { - return flagString(uint32(fl), initFlagNames) -} - -func flagString(f uint32, names []flagName) string { - var s string - - if f == 0 { - return "0" - } - - for _, n := range names { - if f&n.bit != 0 { - s += "+" + n.name - f &^= n.bit - } - } - if f != 0 { - s += fmt.Sprintf("%+#x", f) - } - return s[1:] -} - -// The ReleaseFlags are used in the Release exchange. -type ReleaseFlags uint32 - -const ( - ReleaseFlush ReleaseFlags = 1 << 0 -) - -func (fl ReleaseFlags) String() string { - return flagString(uint32(fl), releaseFlagNames) -} - -var releaseFlagNames = []flagName{ - {uint32(ReleaseFlush), "ReleaseFlush"}, -} - -// Opcodes -const ( - opLookup = 1 - opForget = 2 // no reply - opGetattr = 3 - opSetattr = 4 - opReadlink = 5 - opSymlink = 6 - opMknod = 8 - opMkdir = 9 - opUnlink = 10 - opRmdir = 11 - opRename = 12 - opLink = 13 - opOpen = 14 - opRead = 15 - opWrite = 16 - opStatfs = 17 - opRelease = 18 - opFsync = 20 - opSetxattr = 21 - opGetxattr = 22 - opListxattr = 23 - opRemovexattr = 24 - opFlush = 25 - opInit = 26 - opOpendir = 27 - opReaddir = 28 - opReleasedir = 29 - opFsyncdir = 30 - opGetlk = 31 - opSetlk = 32 - opSetlkw = 33 - opAccess = 34 - opCreate = 35 - opInterrupt = 36 - opBmap = 37 - opDestroy = 38 - opIoctl = 39 // Linux? - opPoll = 40 // Linux? - - // OS X - opSetvolname = 61 - opGetxtimes = 62 - opExchange = 63 -) - -type entryOut struct { - Nodeid uint64 // Inode ID - Generation uint64 // Inode generation - EntryValid uint64 // Cache timeout for the name - AttrValid uint64 // Cache timeout for the attributes - EntryValidNsec uint32 - AttrValidNsec uint32 - Attr attr -} - -func entryOutSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 9}): - return unsafe.Offsetof(entryOut{}.Attr) + unsafe.Offsetof(entryOut{}.Attr.Blksize) - default: - return unsafe.Sizeof(entryOut{}) - } -} - -type forgetIn struct { - Nlookup uint64 -} - -type getattrIn struct { - GetattrFlags uint32 - _ uint32 - Fh uint64 -} - -type attrOut struct { - AttrValid uint64 // Cache timeout for the attributes - AttrValidNsec uint32 - _ uint32 - Attr attr -} - -func attrOutSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 9}): - return unsafe.Offsetof(attrOut{}.Attr) + unsafe.Offsetof(attrOut{}.Attr.Blksize) - default: - return unsafe.Sizeof(attrOut{}) - } -} - -// OS X -type getxtimesOut struct { - Bkuptime uint64 - Crtime uint64 - BkuptimeNsec uint32 - CrtimeNsec uint32 -} - -type mknodIn struct { - Mode uint32 - Rdev uint32 - Umask uint32 - _ uint32 - // "filename\x00" follows. -} - -func mknodInSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 12}): - return unsafe.Offsetof(mknodIn{}.Umask) - default: - return unsafe.Sizeof(mknodIn{}) - } -} - -type mkdirIn struct { - Mode uint32 - Umask uint32 - // filename follows -} - -func mkdirInSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 12}): - return unsafe.Offsetof(mkdirIn{}.Umask) + 4 - default: - return unsafe.Sizeof(mkdirIn{}) - } -} - -type renameIn struct { - Newdir uint64 - // "oldname\x00newname\x00" follows -} - -// OS X -type exchangeIn struct { - Olddir uint64 - Newdir uint64 - Options uint64 - // "oldname\x00newname\x00" follows -} - -type linkIn struct { - Oldnodeid uint64 -} - -type setattrInCommon struct { - Valid uint32 - _ uint32 - Fh uint64 - Size uint64 - LockOwner uint64 // unused on OS X? - Atime uint64 - Mtime uint64 - Unused2 uint64 - AtimeNsec uint32 - MtimeNsec uint32 - Unused3 uint32 - Mode uint32 - Unused4 uint32 - Uid uint32 - Gid uint32 - Unused5 uint32 -} - -type openIn struct { - Flags uint32 - Unused uint32 -} - -type openOut struct { - Fh uint64 - OpenFlags uint32 - _ uint32 -} - -type createIn struct { - Flags uint32 - Mode uint32 - Umask uint32 - _ uint32 -} - -func createInSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 12}): - return unsafe.Offsetof(createIn{}.Umask) - default: - return unsafe.Sizeof(createIn{}) - } -} - -type releaseIn struct { - Fh uint64 - Flags uint32 - ReleaseFlags uint32 - LockOwner uint32 -} - -type flushIn struct { - Fh uint64 - FlushFlags uint32 - _ uint32 - LockOwner uint64 -} - -type readIn struct { - Fh uint64 - Offset uint64 - Size uint32 - ReadFlags uint32 - LockOwner uint64 - Flags uint32 - _ uint32 -} - -func readInSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 9}): - return unsafe.Offsetof(readIn{}.ReadFlags) + 4 - default: - return unsafe.Sizeof(readIn{}) - } -} - -// The ReadFlags are passed in ReadRequest. -type ReadFlags uint32 - -const ( - // LockOwner field is valid. - ReadLockOwner ReadFlags = 1 << 1 -) - -var readFlagNames = []flagName{ - {uint32(ReadLockOwner), "ReadLockOwner"}, -} - -func (fl ReadFlags) String() string { - return flagString(uint32(fl), readFlagNames) -} - -type writeIn struct { - Fh uint64 - Offset uint64 - Size uint32 - WriteFlags uint32 - LockOwner uint64 - Flags uint32 - _ uint32 -} - -func writeInSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 9}): - return unsafe.Offsetof(writeIn{}.LockOwner) - default: - return unsafe.Sizeof(writeIn{}) - } -} - -type writeOut struct { - Size uint32 - _ uint32 -} - -// The WriteFlags are passed in WriteRequest. -type WriteFlags uint32 - -const ( - WriteCache WriteFlags = 1 << 0 - // LockOwner field is valid. - WriteLockOwner WriteFlags = 1 << 1 -) - -var writeFlagNames = []flagName{ - {uint32(WriteCache), "WriteCache"}, - {uint32(WriteLockOwner), "WriteLockOwner"}, -} - -func (fl WriteFlags) String() string { - return flagString(uint32(fl), writeFlagNames) -} - -const compatStatfsSize = 48 - -type statfsOut struct { - St kstatfs -} - -type fsyncIn struct { - Fh uint64 - FsyncFlags uint32 - _ uint32 -} - -type setxattrInCommon struct { - Size uint32 - Flags uint32 -} - -func (setxattrInCommon) position() uint32 { - return 0 -} - -type getxattrInCommon struct { - Size uint32 - _ uint32 -} - -func (getxattrInCommon) position() uint32 { - return 0 -} - -type getxattrOut struct { - Size uint32 - _ uint32 -} - -type lkIn struct { - Fh uint64 - Owner uint64 - Lk fileLock - LkFlags uint32 - _ uint32 -} - -func lkInSize(p Protocol) uintptr { - switch { - case p.LT(Protocol{7, 9}): - return unsafe.Offsetof(lkIn{}.LkFlags) - default: - return unsafe.Sizeof(lkIn{}) - } -} - -type lkOut struct { - Lk fileLock -} - -type accessIn struct { - Mask uint32 - _ uint32 -} - -type initIn struct { - Major uint32 - Minor uint32 - MaxReadahead uint32 - Flags uint32 -} - -const initInSize = int(unsafe.Sizeof(initIn{})) - -type initOut struct { - Major uint32 - Minor uint32 - MaxReadahead uint32 - Flags uint32 - Unused uint32 - MaxWrite uint32 -} - -type interruptIn struct { - Unique uint64 -} - -type bmapIn struct { - Block uint64 - BlockSize uint32 - _ uint32 -} - -type bmapOut struct { - Block uint64 -} - -type inHeader struct { - Len uint32 - Opcode uint32 - Unique uint64 - Nodeid uint64 - Uid uint32 - Gid uint32 - Pid uint32 - _ uint32 -} - -const inHeaderSize = int(unsafe.Sizeof(inHeader{})) - -type outHeader struct { - Len uint32 - Error int32 - Unique uint64 -} - -type dirent struct { - Ino uint64 - Off uint64 - Namelen uint32 - Type uint32 - Name [0]byte -} - -const direntSize = 8 + 8 + 4 + 4 - -const ( - notifyCodePoll int32 = 1 - notifyCodeInvalInode int32 = 2 - notifyCodeInvalEntry int32 = 3 -) - -type notifyInvalInodeOut struct { - Ino uint64 - Off int64 - Len int64 -} - -type notifyInvalEntryOut struct { - Parent uint64 - Namelen uint32 - _ uint32 -} diff --git a/vendor/bazil.org/fuse/fuse_kernel_darwin.go b/vendor/bazil.org/fuse/fuse_kernel_darwin.go deleted file mode 100644 index b9873fdf3910..000000000000 --- a/vendor/bazil.org/fuse/fuse_kernel_darwin.go +++ /dev/null @@ -1,88 +0,0 @@ -package fuse - -import ( - "time" -) - -type attr struct { - Ino uint64 - Size uint64 - Blocks uint64 - Atime uint64 - Mtime uint64 - Ctime uint64 - Crtime_ uint64 // OS X only - AtimeNsec uint32 - MtimeNsec uint32 - CtimeNsec uint32 - CrtimeNsec uint32 // OS X only - Mode uint32 - Nlink uint32 - Uid uint32 - Gid uint32 - Rdev uint32 - Flags_ uint32 // OS X only; see chflags(2) - Blksize uint32 - padding uint32 -} - -func (a *attr) SetCrtime(s uint64, ns uint32) { - a.Crtime_, a.CrtimeNsec = s, ns -} - -func (a *attr) SetFlags(f uint32) { - a.Flags_ = f -} - -type setattrIn struct { - setattrInCommon - - // OS X only - Bkuptime_ uint64 - Chgtime_ uint64 - Crtime uint64 - BkuptimeNsec uint32 - ChgtimeNsec uint32 - CrtimeNsec uint32 - Flags_ uint32 // see chflags(2) -} - -func (in *setattrIn) BkupTime() time.Time { - return time.Unix(int64(in.Bkuptime_), int64(in.BkuptimeNsec)) -} - -func (in *setattrIn) Chgtime() time.Time { - return time.Unix(int64(in.Chgtime_), int64(in.ChgtimeNsec)) -} - -func (in *setattrIn) Flags() uint32 { - return in.Flags_ -} - -func openFlags(flags uint32) OpenFlags { - return OpenFlags(flags) -} - -type getxattrIn struct { - getxattrInCommon - - // OS X only - Position uint32 - Padding uint32 -} - -func (g *getxattrIn) position() uint32 { - return g.Position -} - -type setxattrIn struct { - setxattrInCommon - - // OS X only - Position uint32 - Padding uint32 -} - -func (s *setxattrIn) position() uint32 { - return s.Position -} diff --git a/vendor/bazil.org/fuse/fuse_kernel_freebsd.go b/vendor/bazil.org/fuse/fuse_kernel_freebsd.go deleted file mode 100644 index b1141e41dc96..000000000000 --- a/vendor/bazil.org/fuse/fuse_kernel_freebsd.go +++ /dev/null @@ -1,62 +0,0 @@ -package fuse - -import "time" - -type attr struct { - Ino uint64 - Size uint64 - Blocks uint64 - Atime uint64 - Mtime uint64 - Ctime uint64 - AtimeNsec uint32 - MtimeNsec uint32 - CtimeNsec uint32 - Mode uint32 - Nlink uint32 - Uid uint32 - Gid uint32 - Rdev uint32 - Blksize uint32 - padding uint32 -} - -func (a *attr) Crtime() time.Time { - return time.Time{} -} - -func (a *attr) SetCrtime(s uint64, ns uint32) { - // ignored on freebsd -} - -func (a *attr) SetFlags(f uint32) { - // ignored on freebsd -} - -type setattrIn struct { - setattrInCommon -} - -func (in *setattrIn) BkupTime() time.Time { - return time.Time{} -} - -func (in *setattrIn) Chgtime() time.Time { - return time.Time{} -} - -func (in *setattrIn) Flags() uint32 { - return 0 -} - -func openFlags(flags uint32) OpenFlags { - return OpenFlags(flags) -} - -type getxattrIn struct { - getxattrInCommon -} - -type setxattrIn struct { - setxattrInCommon -} diff --git a/vendor/bazil.org/fuse/fuse_kernel_linux.go b/vendor/bazil.org/fuse/fuse_kernel_linux.go deleted file mode 100644 index d3ba86617802..000000000000 --- a/vendor/bazil.org/fuse/fuse_kernel_linux.go +++ /dev/null @@ -1,70 +0,0 @@ -package fuse - -import "time" - -type attr struct { - Ino uint64 - Size uint64 - Blocks uint64 - Atime uint64 - Mtime uint64 - Ctime uint64 - AtimeNsec uint32 - MtimeNsec uint32 - CtimeNsec uint32 - Mode uint32 - Nlink uint32 - Uid uint32 - Gid uint32 - Rdev uint32 - Blksize uint32 - padding uint32 -} - -func (a *attr) Crtime() time.Time { - return time.Time{} -} - -func (a *attr) SetCrtime(s uint64, ns uint32) { - // Ignored on Linux. -} - -func (a *attr) SetFlags(f uint32) { - // Ignored on Linux. -} - -type setattrIn struct { - setattrInCommon -} - -func (in *setattrIn) BkupTime() time.Time { - return time.Time{} -} - -func (in *setattrIn) Chgtime() time.Time { - return time.Time{} -} - -func (in *setattrIn) Flags() uint32 { - return 0 -} - -func openFlags(flags uint32) OpenFlags { - // on amd64, the 32-bit O_LARGEFILE flag is always seen; - // on i386, the flag probably depends on the app - // requesting, but in any case should be utterly - // uninteresting to us here; our kernel protocol messages - // are not directly related to the client app's kernel - // API/ABI - flags &^= 0x8000 - - return OpenFlags(flags) -} - -type getxattrIn struct { - getxattrInCommon -} - -type setxattrIn struct { - setxattrInCommon -} diff --git a/vendor/bazil.org/fuse/fuse_kernel_std.go b/vendor/bazil.org/fuse/fuse_kernel_std.go deleted file mode 100644 index 074cfd322887..000000000000 --- a/vendor/bazil.org/fuse/fuse_kernel_std.go +++ /dev/null @@ -1 +0,0 @@ -package fuse diff --git a/vendor/bazil.org/fuse/fuse_linux.go b/vendor/bazil.org/fuse/fuse_linux.go deleted file mode 100644 index 5fb96f9ae942..000000000000 --- a/vendor/bazil.org/fuse/fuse_linux.go +++ /dev/null @@ -1,7 +0,0 @@ -package fuse - -// Maximum file write size we are prepared to receive from the kernel. -// -// Linux 4.2.0 has been observed to cap this value at 128kB -// (FUSE_MAX_PAGES_PER_REQ=32, 4kB pages). -const maxWrite = 128 * 1024 diff --git a/vendor/bazil.org/fuse/fuseutil/fuseutil.go b/vendor/bazil.org/fuse/fuseutil/fuseutil.go deleted file mode 100644 index b3f52b73b257..000000000000 --- a/vendor/bazil.org/fuse/fuseutil/fuseutil.go +++ /dev/null @@ -1,20 +0,0 @@ -package fuseutil // import "bazil.org/fuse/fuseutil" - -import ( - "bazil.org/fuse" -) - -// HandleRead handles a read request assuming that data is the entire file content. -// It adjusts the amount returned in resp according to req.Offset and req.Size. -func HandleRead(req *fuse.ReadRequest, resp *fuse.ReadResponse, data []byte) { - if req.Offset >= int64(len(data)) { - data = nil - } else { - data = data[req.Offset:] - } - if len(data) > req.Size { - data = data[:req.Size] - } - n := copy(resp.Data[:req.Size], data) - resp.Data = resp.Data[:n] -} diff --git a/vendor/bazil.org/fuse/mount.go b/vendor/bazil.org/fuse/mount.go deleted file mode 100644 index 8054e9021c4e..000000000000 --- a/vendor/bazil.org/fuse/mount.go +++ /dev/null @@ -1,38 +0,0 @@ -package fuse - -import ( - "bufio" - "errors" - "io" - "log" - "sync" -) - -var ( - // ErrOSXFUSENotFound is returned from Mount when the OSXFUSE - // installation is not detected. - // - // Only happens on OS X. Make sure OSXFUSE is installed, or see - // OSXFUSELocations for customization. - ErrOSXFUSENotFound = errors.New("cannot locate OSXFUSE") -) - -func neverIgnoreLine(line string) bool { - return false -} - -func lineLogger(wg *sync.WaitGroup, prefix string, ignore func(line string) bool, r io.ReadCloser) { - defer wg.Done() - - scanner := bufio.NewScanner(r) - for scanner.Scan() { - line := scanner.Text() - if ignore(line) { - continue - } - log.Printf("%s: %s", prefix, line) - } - if err := scanner.Err(); err != nil { - log.Printf("%s, error reading: %v", prefix, err) - } -} diff --git a/vendor/bazil.org/fuse/mount_darwin.go b/vendor/bazil.org/fuse/mount_darwin.go deleted file mode 100644 index c1c36e62b5f3..000000000000 --- a/vendor/bazil.org/fuse/mount_darwin.go +++ /dev/null @@ -1,208 +0,0 @@ -package fuse - -import ( - "errors" - "fmt" - "log" - "os" - "os/exec" - "path" - "strconv" - "strings" - "sync" - "syscall" -) - -var ( - errNoAvail = errors.New("no available fuse devices") - errNotLoaded = errors.New("osxfuse is not loaded") -) - -func loadOSXFUSE(bin string) error { - cmd := exec.Command(bin) - cmd.Dir = "/" - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err := cmd.Run() - return err -} - -func openOSXFUSEDev(devPrefix string) (*os.File, error) { - var f *os.File - var err error - for i := uint64(0); ; i++ { - path := devPrefix + strconv.FormatUint(i, 10) - f, err = os.OpenFile(path, os.O_RDWR, 0000) - if os.IsNotExist(err) { - if i == 0 { - // not even the first device was found -> fuse is not loaded - return nil, errNotLoaded - } - - // we've run out of kernel-provided devices - return nil, errNoAvail - } - - if err2, ok := err.(*os.PathError); ok && err2.Err == syscall.EBUSY { - // try the next one - continue - } - - if err != nil { - return nil, err - } - return f, nil - } -} - -func handleMountOSXFUSE(helperName string, errCh chan<- error) func(line string) (ignore bool) { - var noMountpointPrefix = helperName + `: ` - const noMountpointSuffix = `: No such file or directory` - return func(line string) (ignore bool) { - if strings.HasPrefix(line, noMountpointPrefix) && strings.HasSuffix(line, noMountpointSuffix) { - // re-extract it from the error message in case some layer - // changed the path - mountpoint := line[len(noMountpointPrefix) : len(line)-len(noMountpointSuffix)] - err := &MountpointDoesNotExistError{ - Path: mountpoint, - } - select { - case errCh <- err: - return true - default: - // not the first error; fall back to logging it - return false - } - } - - return false - } -} - -// isBoringMountOSXFUSEError returns whether the Wait error is -// uninteresting; exit status 64 is. -func isBoringMountOSXFUSEError(err error) bool { - if err, ok := err.(*exec.ExitError); ok && err.Exited() { - if status, ok := err.Sys().(syscall.WaitStatus); ok && status.ExitStatus() == 64 { - return true - } - } - return false -} - -func callMount(bin string, daemonVar string, dir string, conf *mountConfig, f *os.File, ready chan<- struct{}, errp *error) error { - for k, v := range conf.options { - if strings.Contains(k, ",") || strings.Contains(v, ",") { - // Silly limitation but the mount helper does not - // understand any escaping. See TestMountOptionCommaError. - return fmt.Errorf("mount options cannot contain commas on darwin: %q=%q", k, v) - } - } - cmd := exec.Command( - bin, - "-o", conf.getOptions(), - // Tell osxfuse-kext how large our buffer is. It must split - // writes larger than this into multiple writes. - // - // OSXFUSE seems to ignore InitResponse.MaxWrite, and uses - // this instead. - "-o", "iosize="+strconv.FormatUint(maxWrite, 10), - // refers to fd passed in cmd.ExtraFiles - "3", - dir, - ) - cmd.ExtraFiles = []*os.File{f} - cmd.Env = os.Environ() - // OSXFUSE <3.3.0 - cmd.Env = append(cmd.Env, "MOUNT_FUSEFS_CALL_BY_LIB=") - // OSXFUSE >=3.3.0 - cmd.Env = append(cmd.Env, "MOUNT_OSXFUSE_CALL_BY_LIB=") - - daemon := os.Args[0] - if daemonVar != "" { - cmd.Env = append(cmd.Env, daemonVar+"="+daemon) - } - - stdout, err := cmd.StdoutPipe() - if err != nil { - return fmt.Errorf("setting up mount_osxfusefs stderr: %v", err) - } - stderr, err := cmd.StderrPipe() - if err != nil { - return fmt.Errorf("setting up mount_osxfusefs stderr: %v", err) - } - - if err := cmd.Start(); err != nil { - return fmt.Errorf("mount_osxfusefs: %v", err) - } - helperErrCh := make(chan error, 1) - go func() { - var wg sync.WaitGroup - wg.Add(2) - go lineLogger(&wg, "mount helper output", neverIgnoreLine, stdout) - helperName := path.Base(bin) - go lineLogger(&wg, "mount helper error", handleMountOSXFUSE(helperName, helperErrCh), stderr) - wg.Wait() - if err := cmd.Wait(); err != nil { - // see if we have a better error to report - select { - case helperErr := <-helperErrCh: - // log the Wait error if it's not what we expected - if !isBoringMountOSXFUSEError(err) { - log.Printf("mount helper failed: %v", err) - } - // and now return what we grabbed from stderr as the real - // error - *errp = helperErr - close(ready) - return - default: - // nope, fall back to generic message - } - - *errp = fmt.Errorf("mount_osxfusefs: %v", err) - close(ready) - return - } - - *errp = nil - close(ready) - }() - return nil -} - -func mount(dir string, conf *mountConfig, ready chan<- struct{}, errp *error) (*os.File, error) { - locations := conf.osxfuseLocations - if locations == nil { - locations = []OSXFUSEPaths{ - OSXFUSELocationV3, - OSXFUSELocationV2, - } - } - for _, loc := range locations { - if _, err := os.Stat(loc.Mount); os.IsNotExist(err) { - // try the other locations - continue - } - - f, err := openOSXFUSEDev(loc.DevicePrefix) - if err == errNotLoaded { - err = loadOSXFUSE(loc.Load) - if err != nil { - return nil, err - } - // try again - f, err = openOSXFUSEDev(loc.DevicePrefix) - } - if err != nil { - return nil, err - } - err = callMount(loc.Mount, loc.DaemonVar, dir, conf, f, ready, errp) - if err != nil { - f.Close() - return nil, err - } - return f, nil - } - return nil, ErrOSXFUSENotFound -} diff --git a/vendor/bazil.org/fuse/mount_freebsd.go b/vendor/bazil.org/fuse/mount_freebsd.go deleted file mode 100644 index 70bb41024978..000000000000 --- a/vendor/bazil.org/fuse/mount_freebsd.go +++ /dev/null @@ -1,111 +0,0 @@ -package fuse - -import ( - "fmt" - "log" - "os" - "os/exec" - "strings" - "sync" - "syscall" -) - -func handleMountFusefsStderr(errCh chan<- error) func(line string) (ignore bool) { - return func(line string) (ignore bool) { - const ( - noMountpointPrefix = `mount_fusefs: ` - noMountpointSuffix = `: No such file or directory` - ) - if strings.HasPrefix(line, noMountpointPrefix) && strings.HasSuffix(line, noMountpointSuffix) { - // re-extract it from the error message in case some layer - // changed the path - mountpoint := line[len(noMountpointPrefix) : len(line)-len(noMountpointSuffix)] - err := &MountpointDoesNotExistError{ - Path: mountpoint, - } - select { - case errCh <- err: - return true - default: - // not the first error; fall back to logging it - return false - } - } - - return false - } -} - -// isBoringMountFusefsError returns whether the Wait error is -// uninteresting; exit status 1 is. -func isBoringMountFusefsError(err error) bool { - if err, ok := err.(*exec.ExitError); ok && err.Exited() { - if status, ok := err.Sys().(syscall.WaitStatus); ok && status.ExitStatus() == 1 { - return true - } - } - return false -} - -func mount(dir string, conf *mountConfig, ready chan<- struct{}, errp *error) (*os.File, error) { - for k, v := range conf.options { - if strings.Contains(k, ",") || strings.Contains(v, ",") { - // Silly limitation but the mount helper does not - // understand any escaping. See TestMountOptionCommaError. - return nil, fmt.Errorf("mount options cannot contain commas on FreeBSD: %q=%q", k, v) - } - } - - f, err := os.OpenFile("/dev/fuse", os.O_RDWR, 0000) - if err != nil { - *errp = err - return nil, err - } - - cmd := exec.Command( - "/sbin/mount_fusefs", - "--safe", - "-o", conf.getOptions(), - "3", - dir, - ) - cmd.ExtraFiles = []*os.File{f} - - stdout, err := cmd.StdoutPipe() - if err != nil { - return nil, fmt.Errorf("setting up mount_fusefs stderr: %v", err) - } - stderr, err := cmd.StderrPipe() - if err != nil { - return nil, fmt.Errorf("setting up mount_fusefs stderr: %v", err) - } - - if err := cmd.Start(); err != nil { - return nil, fmt.Errorf("mount_fusefs: %v", err) - } - helperErrCh := make(chan error, 1) - var wg sync.WaitGroup - wg.Add(2) - go lineLogger(&wg, "mount helper output", neverIgnoreLine, stdout) - go lineLogger(&wg, "mount helper error", handleMountFusefsStderr(helperErrCh), stderr) - wg.Wait() - if err := cmd.Wait(); err != nil { - // see if we have a better error to report - select { - case helperErr := <-helperErrCh: - // log the Wait error if it's not what we expected - if !isBoringMountFusefsError(err) { - log.Printf("mount helper failed: %v", err) - } - // and now return what we grabbed from stderr as the real - // error - return nil, helperErr - default: - // nope, fall back to generic message - } - return nil, fmt.Errorf("mount_fusefs: %v", err) - } - - close(ready) - return f, nil -} diff --git a/vendor/bazil.org/fuse/mount_linux.go b/vendor/bazil.org/fuse/mount_linux.go deleted file mode 100644 index 197d1044e926..000000000000 --- a/vendor/bazil.org/fuse/mount_linux.go +++ /dev/null @@ -1,150 +0,0 @@ -package fuse - -import ( - "fmt" - "log" - "net" - "os" - "os/exec" - "strings" - "sync" - "syscall" -) - -func handleFusermountStderr(errCh chan<- error) func(line string) (ignore bool) { - return func(line string) (ignore bool) { - if line == `fusermount: failed to open /etc/fuse.conf: Permission denied` { - // Silence this particular message, it occurs way too - // commonly and isn't very relevant to whether the mount - // succeeds or not. - return true - } - - const ( - noMountpointPrefix = `fusermount: failed to access mountpoint ` - noMountpointSuffix = `: No such file or directory` - ) - if strings.HasPrefix(line, noMountpointPrefix) && strings.HasSuffix(line, noMountpointSuffix) { - // re-extract it from the error message in case some layer - // changed the path - mountpoint := line[len(noMountpointPrefix) : len(line)-len(noMountpointSuffix)] - err := &MountpointDoesNotExistError{ - Path: mountpoint, - } - select { - case errCh <- err: - return true - default: - // not the first error; fall back to logging it - return false - } - } - - return false - } -} - -// isBoringFusermountError returns whether the Wait error is -// uninteresting; exit status 1 is. -func isBoringFusermountError(err error) bool { - if err, ok := err.(*exec.ExitError); ok && err.Exited() { - if status, ok := err.Sys().(syscall.WaitStatus); ok && status.ExitStatus() == 1 { - return true - } - } - return false -} - -func mount(dir string, conf *mountConfig, ready chan<- struct{}, errp *error) (fusefd *os.File, err error) { - // linux mount is never delayed - close(ready) - - fds, err := syscall.Socketpair(syscall.AF_FILE, syscall.SOCK_STREAM, 0) - if err != nil { - return nil, fmt.Errorf("socketpair error: %v", err) - } - - writeFile := os.NewFile(uintptr(fds[0]), "fusermount-child-writes") - defer writeFile.Close() - - readFile := os.NewFile(uintptr(fds[1]), "fusermount-parent-reads") - defer readFile.Close() - - cmd := exec.Command( - "fusermount", - "-o", conf.getOptions(), - "--", - dir, - ) - cmd.Env = append(os.Environ(), "_FUSE_COMMFD=3") - - cmd.ExtraFiles = []*os.File{writeFile} - - var wg sync.WaitGroup - stdout, err := cmd.StdoutPipe() - if err != nil { - return nil, fmt.Errorf("setting up fusermount stderr: %v", err) - } - stderr, err := cmd.StderrPipe() - if err != nil { - return nil, fmt.Errorf("setting up fusermount stderr: %v", err) - } - - if err := cmd.Start(); err != nil { - return nil, fmt.Errorf("fusermount: %v", err) - } - helperErrCh := make(chan error, 1) - wg.Add(2) - go lineLogger(&wg, "mount helper output", neverIgnoreLine, stdout) - go lineLogger(&wg, "mount helper error", handleFusermountStderr(helperErrCh), stderr) - wg.Wait() - if err := cmd.Wait(); err != nil { - // see if we have a better error to report - select { - case helperErr := <-helperErrCh: - // log the Wait error if it's not what we expected - if !isBoringFusermountError(err) { - log.Printf("mount helper failed: %v", err) - } - // and now return what we grabbed from stderr as the real - // error - return nil, helperErr - default: - // nope, fall back to generic message - } - - return nil, fmt.Errorf("fusermount: %v", err) - } - - c, err := net.FileConn(readFile) - if err != nil { - return nil, fmt.Errorf("FileConn from fusermount socket: %v", err) - } - defer c.Close() - - uc, ok := c.(*net.UnixConn) - if !ok { - return nil, fmt.Errorf("unexpected FileConn type; expected UnixConn, got %T", c) - } - - buf := make([]byte, 32) // expect 1 byte - oob := make([]byte, 32) // expect 24 bytes - _, oobn, _, _, err := uc.ReadMsgUnix(buf, oob) - scms, err := syscall.ParseSocketControlMessage(oob[:oobn]) - if err != nil { - return nil, fmt.Errorf("ParseSocketControlMessage: %v", err) - } - if len(scms) != 1 { - return nil, fmt.Errorf("expected 1 SocketControlMessage; got scms = %#v", scms) - } - scm := scms[0] - gotFds, err := syscall.ParseUnixRights(&scm) - if err != nil { - return nil, fmt.Errorf("syscall.ParseUnixRights: %v", err) - } - if len(gotFds) != 1 { - return nil, fmt.Errorf("wanted 1 fd; got %#v", gotFds) - } - f := os.NewFile(uintptr(gotFds[0]), "/dev/fuse") - return f, nil -} diff --git a/vendor/bazil.org/fuse/options.go b/vendor/bazil.org/fuse/options.go deleted file mode 100644 index 65ce8a5410d2..000000000000 --- a/vendor/bazil.org/fuse/options.go +++ /dev/null @@ -1,310 +0,0 @@ -package fuse - -import ( - "errors" - "strings" -) - -func dummyOption(conf *mountConfig) error { - return nil -} - -// mountConfig holds the configuration for a mount operation. -// Use it by passing MountOption values to Mount. -type mountConfig struct { - options map[string]string - maxReadahead uint32 - initFlags InitFlags - osxfuseLocations []OSXFUSEPaths -} - -func escapeComma(s string) string { - s = strings.Replace(s, `\`, `\\`, -1) - s = strings.Replace(s, `,`, `\,`, -1) - return s -} - -// getOptions makes a string of options suitable for passing to FUSE -// mount flag `-o`. Returns an empty string if no options were set. -// Any platform specific adjustments should happen before the call. -func (m *mountConfig) getOptions() string { - var opts []string - for k, v := range m.options { - k = escapeComma(k) - if v != "" { - k += "=" + escapeComma(v) - } - opts = append(opts, k) - } - return strings.Join(opts, ",") -} - -type mountOption func(*mountConfig) error - -// MountOption is passed to Mount to change the behavior of the mount. -type MountOption mountOption - -// FSName sets the file system name (also called source) that is -// visible in the list of mounted file systems. -// -// FreeBSD ignores this option. -func FSName(name string) MountOption { - return func(conf *mountConfig) error { - conf.options["fsname"] = name - return nil - } -} - -// Subtype sets the subtype of the mount. The main type is always -// `fuse`. The type in a list of mounted file systems will look like -// `fuse.foo`. -// -// OS X ignores this option. -// FreeBSD ignores this option. -func Subtype(fstype string) MountOption { - return func(conf *mountConfig) error { - conf.options["subtype"] = fstype - return nil - } -} - -// LocalVolume sets the volume to be local (instead of network), -// changing the behavior of Finder, Spotlight, and such. -// -// OS X only. Others ignore this option. -func LocalVolume() MountOption { - return localVolume -} - -// VolumeName sets the volume name shown in Finder. -// -// OS X only. Others ignore this option. -func VolumeName(name string) MountOption { - return volumeName(name) -} - -// NoAppleDouble makes OSXFUSE disallow files with names used by OS X -// to store extended attributes on file systems that do not support -// them natively. -// -// Such file names are: -// -// ._* -// .DS_Store -// -// OS X only. Others ignore this option. -func NoAppleDouble() MountOption { - return noAppleDouble -} - -// NoAppleXattr makes OSXFUSE disallow extended attributes with the -// prefix "com.apple.". This disables persistent Finder state and -// other such information. -// -// OS X only. Others ignore this option. -func NoAppleXattr() MountOption { - return noAppleXattr -} - -// ExclCreate causes O_EXCL flag to be set for only "truly" exclusive creates, -// i.e. create calls for which the initiator explicitly set the O_EXCL flag. -// -// OSXFUSE expects all create calls to return EEXIST in case the file -// already exists, regardless of whether O_EXCL was specified or not. -// To ensure this behavior, it normally sets OpenExclusive for all -// Create calls, regardless of whether the original call had it set. -// For distributed filesystems, that may force every file create to be -// a distributed consensus action, causing undesirable delays. -// -// This option makes the FUSE filesystem see the original flag value, -// and better decide when to ensure global consensus. -// -// Note that returning EEXIST on existing file create is still -// expected with OSXFUSE, regardless of the presence of the -// OpenExclusive flag. -// -// For more information, see -// https://github.com/osxfuse/osxfuse/issues/209 -// -// OS X only. Others ignore this options. -// Requires OSXFUSE 3.4.1 or newer. -func ExclCreate() MountOption { - return exclCreate -} - -// DaemonTimeout sets the time in seconds between a request and a reply before -// the FUSE mount is declared dead. -// -// OS X and FreeBSD only. Others ignore this option. -func DaemonTimeout(name string) MountOption { - return daemonTimeout(name) -} - -var ErrCannotCombineAllowOtherAndAllowRoot = errors.New("cannot combine AllowOther and AllowRoot") - -// AllowOther allows other users to access the file system. -// -// Only one of AllowOther or AllowRoot can be used. -func AllowOther() MountOption { - return func(conf *mountConfig) error { - if _, ok := conf.options["allow_root"]; ok { - return ErrCannotCombineAllowOtherAndAllowRoot - } - conf.options["allow_other"] = "" - return nil - } -} - -// AllowRoot allows other users to access the file system. -// -// Only one of AllowOther or AllowRoot can be used. -// -// FreeBSD ignores this option. -func AllowRoot() MountOption { - return func(conf *mountConfig) error { - if _, ok := conf.options["allow_other"]; ok { - return ErrCannotCombineAllowOtherAndAllowRoot - } - conf.options["allow_root"] = "" - return nil - } -} - -// AllowDev enables interpreting character or block special devices on the -// filesystem. -func AllowDev() MountOption { - return func(conf *mountConfig) error { - conf.options["dev"] = "" - return nil - } -} - -// AllowSUID allows set-user-identifier or set-group-identifier bits to take -// effect. -func AllowSUID() MountOption { - return func(conf *mountConfig) error { - conf.options["suid"] = "" - return nil - } -} - -// DefaultPermissions makes the kernel enforce access control based on -// the file mode (as in chmod). -// -// Without this option, the Node itself decides what is and is not -// allowed. This is normally ok because FUSE file systems cannot be -// accessed by other users without AllowOther/AllowRoot. -// -// FreeBSD ignores this option. -func DefaultPermissions() MountOption { - return func(conf *mountConfig) error { - conf.options["default_permissions"] = "" - return nil - } -} - -// ReadOnly makes the mount read-only. -func ReadOnly() MountOption { - return func(conf *mountConfig) error { - conf.options["ro"] = "" - return nil - } -} - -// MaxReadahead sets the number of bytes that can be prefetched for -// sequential reads. The kernel can enforce a maximum value lower than -// this. -// -// This setting makes the kernel perform speculative reads that do not -// originate from any client process. This usually tremendously -// improves read performance. -func MaxReadahead(n uint32) MountOption { - return func(conf *mountConfig) error { - conf.maxReadahead = n - return nil - } -} - -// AsyncRead enables multiple outstanding read requests for the same -// handle. Without this, there is at most one request in flight at a -// time. -func AsyncRead() MountOption { - return func(conf *mountConfig) error { - conf.initFlags |= InitAsyncRead - return nil - } -} - -// WritebackCache enables the kernel to buffer writes before sending -// them to the FUSE server. Without this, writethrough caching is -// used. -func WritebackCache() MountOption { - return func(conf *mountConfig) error { - conf.initFlags |= InitWritebackCache - return nil - } -} - -// OSXFUSEPaths describes the paths used by an installed OSXFUSE -// version. See OSXFUSELocationV3 for typical values. -type OSXFUSEPaths struct { - // Prefix for the device file. At mount time, an incrementing - // number is suffixed until a free FUSE device is found. - DevicePrefix string - // Path of the load helper, used to load the kernel extension if - // no device files are found. - Load string - // Path of the mount helper, used for the actual mount operation. - Mount string - // Environment variable used to pass the path to the executable - // calling the mount helper. - DaemonVar string -} - -// Default paths for OSXFUSE. See OSXFUSELocations. -var ( - OSXFUSELocationV3 = OSXFUSEPaths{ - DevicePrefix: "/dev/osxfuse", - Load: "/Library/Filesystems/osxfuse.fs/Contents/Resources/load_osxfuse", - Mount: "/Library/Filesystems/osxfuse.fs/Contents/Resources/mount_osxfuse", - DaemonVar: "MOUNT_OSXFUSE_DAEMON_PATH", - } - OSXFUSELocationV2 = OSXFUSEPaths{ - DevicePrefix: "/dev/osxfuse", - Load: "/Library/Filesystems/osxfusefs.fs/Support/load_osxfusefs", - Mount: "/Library/Filesystems/osxfusefs.fs/Support/mount_osxfusefs", - DaemonVar: "MOUNT_FUSEFS_DAEMON_PATH", - } -) - -// OSXFUSELocations sets where to look for OSXFUSE files. The -// arguments are all the possible locations. The previous locations -// are replaced. -// -// Without this option, OSXFUSELocationV3 and OSXFUSELocationV2 are -// used. -// -// OS X only. Others ignore this option. -func OSXFUSELocations(paths ...OSXFUSEPaths) MountOption { - return func(conf *mountConfig) error { - if len(paths) == 0 { - return errors.New("must specify at least one location for OSXFUSELocations") - } - // replace previous values, but make a copy so there's no - // worries about caller mutating their slice - conf.osxfuseLocations = append(conf.osxfuseLocations[:0], paths...) - return nil - } -} - -// AllowNonEmptyMount allows the mounting over a non-empty directory. -// -// The files in it will be shadowed by the freshly created mount. By -// default these mounts are rejected to prevent accidental covering up -// of data, which could for example prevent automatic backup. -func AllowNonEmptyMount() MountOption { - return func(conf *mountConfig) error { - conf.options["nonempty"] = "" - return nil - } -} diff --git a/vendor/bazil.org/fuse/options_darwin.go b/vendor/bazil.org/fuse/options_darwin.go deleted file mode 100644 index faa9d78e7429..000000000000 --- a/vendor/bazil.org/fuse/options_darwin.go +++ /dev/null @@ -1,35 +0,0 @@ -package fuse - -func localVolume(conf *mountConfig) error { - conf.options["local"] = "" - return nil -} - -func volumeName(name string) MountOption { - return func(conf *mountConfig) error { - conf.options["volname"] = name - return nil - } -} - -func daemonTimeout(name string) MountOption { - return func(conf *mountConfig) error { - conf.options["daemon_timeout"] = name - return nil - } -} - -func noAppleXattr(conf *mountConfig) error { - conf.options["noapplexattr"] = "" - return nil -} - -func noAppleDouble(conf *mountConfig) error { - conf.options["noappledouble"] = "" - return nil -} - -func exclCreate(conf *mountConfig) error { - conf.options["excl_create"] = "" - return nil -} diff --git a/vendor/bazil.org/fuse/options_freebsd.go b/vendor/bazil.org/fuse/options_freebsd.go deleted file mode 100644 index 7c164b13687d..000000000000 --- a/vendor/bazil.org/fuse/options_freebsd.go +++ /dev/null @@ -1,28 +0,0 @@ -package fuse - -func localVolume(conf *mountConfig) error { - return nil -} - -func volumeName(name string) MountOption { - return dummyOption -} - -func daemonTimeout(name string) MountOption { - return func(conf *mountConfig) error { - conf.options["timeout"] = name - return nil - } -} - -func noAppleXattr(conf *mountConfig) error { - return nil -} - -func noAppleDouble(conf *mountConfig) error { - return nil -} - -func exclCreate(conf *mountConfig) error { - return nil -} diff --git a/vendor/bazil.org/fuse/options_linux.go b/vendor/bazil.org/fuse/options_linux.go deleted file mode 100644 index 13f0896d5844..000000000000 --- a/vendor/bazil.org/fuse/options_linux.go +++ /dev/null @@ -1,25 +0,0 @@ -package fuse - -func localVolume(conf *mountConfig) error { - return nil -} - -func volumeName(name string) MountOption { - return dummyOption -} - -func daemonTimeout(name string) MountOption { - return dummyOption -} - -func noAppleXattr(conf *mountConfig) error { - return nil -} - -func noAppleDouble(conf *mountConfig) error { - return nil -} - -func exclCreate(conf *mountConfig) error { - return nil -} diff --git a/vendor/bazil.org/fuse/protocol.go b/vendor/bazil.org/fuse/protocol.go deleted file mode 100644 index a77bbf72f1ad..000000000000 --- a/vendor/bazil.org/fuse/protocol.go +++ /dev/null @@ -1,75 +0,0 @@ -package fuse - -import ( - "fmt" -) - -// Protocol is a FUSE protocol version number. -type Protocol struct { - Major uint32 - Minor uint32 -} - -func (p Protocol) String() string { - return fmt.Sprintf("%d.%d", p.Major, p.Minor) -} - -// LT returns whether a is less than b. -func (a Protocol) LT(b Protocol) bool { - return a.Major < b.Major || - (a.Major == b.Major && a.Minor < b.Minor) -} - -// GE returns whether a is greater than or equal to b. -func (a Protocol) GE(b Protocol) bool { - return a.Major > b.Major || - (a.Major == b.Major && a.Minor >= b.Minor) -} - -func (a Protocol) is79() bool { - return a.GE(Protocol{7, 9}) -} - -// HasAttrBlockSize returns whether Attr.BlockSize is respected by the -// kernel. -func (a Protocol) HasAttrBlockSize() bool { - return a.is79() -} - -// HasReadWriteFlags returns whether ReadRequest/WriteRequest -// fields Flags and FileFlags are valid. -func (a Protocol) HasReadWriteFlags() bool { - return a.is79() -} - -// HasGetattrFlags returns whether GetattrRequest field Flags is -// valid. -func (a Protocol) HasGetattrFlags() bool { - return a.is79() -} - -func (a Protocol) is710() bool { - return a.GE(Protocol{7, 10}) -} - -// HasOpenNonSeekable returns whether OpenResponse field Flags flag -// OpenNonSeekable is supported. -func (a Protocol) HasOpenNonSeekable() bool { - return a.is710() -} - -func (a Protocol) is712() bool { - return a.GE(Protocol{7, 12}) -} - -// HasUmask returns whether CreateRequest/MkdirRequest/MknodRequest -// field Umask is valid. -func (a Protocol) HasUmask() bool { - return a.is712() -} - -// HasInvalidate returns whether InvalidateNode/InvalidateEntry are -// supported. -func (a Protocol) HasInvalidate() bool { - return a.is712() -} diff --git a/vendor/bazil.org/fuse/unmount.go b/vendor/bazil.org/fuse/unmount.go deleted file mode 100644 index ffe3f155c484..000000000000 --- a/vendor/bazil.org/fuse/unmount.go +++ /dev/null @@ -1,6 +0,0 @@ -package fuse - -// Unmount tries to unmount the filesystem mounted at dir. -func Unmount(dir string) error { - return unmount(dir) -} diff --git a/vendor/bazil.org/fuse/unmount_linux.go b/vendor/bazil.org/fuse/unmount_linux.go deleted file mode 100644 index 088f0cfeeec4..000000000000 --- a/vendor/bazil.org/fuse/unmount_linux.go +++ /dev/null @@ -1,21 +0,0 @@ -package fuse - -import ( - "bytes" - "errors" - "os/exec" -) - -func unmount(dir string) error { - cmd := exec.Command("fusermount", "-u", dir) - output, err := cmd.CombinedOutput() - if err != nil { - if len(output) > 0 { - output = bytes.TrimRight(output, "\n") - msg := err.Error() + ": " + string(output) - err = errors.New(msg) - } - return err - } - return nil -} diff --git a/vendor/bazil.org/fuse/unmount_std.go b/vendor/bazil.org/fuse/unmount_std.go deleted file mode 100644 index d6efe276f6cb..000000000000 --- a/vendor/bazil.org/fuse/unmount_std.go +++ /dev/null @@ -1,17 +0,0 @@ -// +build !linux - -package fuse - -import ( - "os" - "syscall" -) - -func unmount(dir string) error { - err := syscall.Unmount(dir, 0) - if err != nil { - err = &os.PathError{Op: "unmount", Path: dir, Err: err} - return err - } - return nil -} diff --git a/vendor/github.com/Azure/azure-pipeline-go/LICENSE b/vendor/github.com/Azure/azure-pipeline-go/LICENSE deleted file mode 100644 index d1ca00f20a89..000000000000 --- a/vendor/github.com/Azure/azure-pipeline-go/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - MIT License - - Copyright (c) Microsoft Corporation. All rights reserved. - - 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 \ No newline at end of file diff --git a/vendor/github.com/Azure/azure-pipeline-go/pipeline/core.go b/vendor/github.com/Azure/azure-pipeline-go/pipeline/core.go deleted file mode 100755 index 0dde81d728c9..000000000000 --- a/vendor/github.com/Azure/azure-pipeline-go/pipeline/core.go +++ /dev/null @@ -1,255 +0,0 @@ -package pipeline - -import ( - "context" - "net" - "net/http" - "os" - "time" -) - -// The Factory interface represents an object that can create its Policy object. Each HTTP request sent -// requires that this Factory create a new instance of its Policy object. -type Factory interface { - New(next Policy, po *PolicyOptions) Policy -} - -// FactoryFunc is an adapter that allows the use of an ordinary function as a Factory interface. -type FactoryFunc func(next Policy, po *PolicyOptions) PolicyFunc - -// New calls f(next,po). -func (f FactoryFunc) New(next Policy, po *PolicyOptions) Policy { - return f(next, po) -} - -// The Policy interface represents a mutable Policy object created by a Factory. The object can mutate/process -// the HTTP request and then forward it on to the next Policy object in the linked-list. The returned -// Response goes backward through the linked-list for additional processing. -// NOTE: Request is passed by value so changes do not change the caller's version of -// the request. However, Request has some fields that reference mutable objects (not strings). -// These references are copied; a deep copy is not performed. Specifically, this means that -// you should avoid modifying the objects referred to by these fields: URL, Header, Body, -// GetBody, TransferEncoding, Form, MultipartForm, Trailer, TLS, Cancel, and Response. -type Policy interface { - Do(ctx context.Context, request Request) (Response, error) -} - -// PolicyFunc is an adapter that allows the use of an ordinary function as a Policy interface. -type PolicyFunc func(ctx context.Context, request Request) (Response, error) - -// Do calls f(ctx, request). -func (f PolicyFunc) Do(ctx context.Context, request Request) (Response, error) { - return f(ctx, request) -} - -// Options configures a Pipeline's behavior. -type Options struct { - HTTPSender Factory // If sender is nil, then the pipeline's default client is used to send the HTTP requests. - Log LogOptions -} - -// LogLevel tells a logger the minimum level to log. When code reports a log entry, -// the LogLevel indicates the level of the log entry. The logger only records entries -// whose level is at least the level it was told to log. See the Log* constants. -// For example, if a logger is configured with LogError, then LogError, LogPanic, -// and LogFatal entries will be logged; lower level entries are ignored. -type LogLevel uint32 - -const ( - // LogNone tells a logger not to log any entries passed to it. - LogNone LogLevel = iota - - // LogFatal tells a logger to log all LogFatal entries passed to it. - LogFatal - - // LogPanic tells a logger to log all LogPanic and LogFatal entries passed to it. - LogPanic - - // LogError tells a logger to log all LogError, LogPanic and LogFatal entries passed to it. - LogError - - // LogWarning tells a logger to log all LogWarning, LogError, LogPanic and LogFatal entries passed to it. - LogWarning - - // LogInfo tells a logger to log all LogInfo, LogWarning, LogError, LogPanic and LogFatal entries passed to it. - LogInfo - - // LogDebug tells a logger to log all LogDebug, LogInfo, LogWarning, LogError, LogPanic and LogFatal entries passed to it. - LogDebug -) - -// LogOptions configures the pipeline's logging mechanism & level filtering. -type LogOptions struct { - Log func(level LogLevel, message string) - - // ShouldLog is called periodically allowing you to return whether the specified LogLevel should be logged or not. - // An application can return different values over the its lifetime; this allows the application to dynamically - // alter what is logged. NOTE: This method can be called by multiple goroutines simultaneously so make sure - // you implement it in a goroutine-safe way. If nil, nothing is logged (the equivalent of returning LogNone). - // Usually, the function will be implemented simply like this: return level <= LogWarning - ShouldLog func(level LogLevel) bool -} - -type pipeline struct { - factories []Factory - options Options -} - -// The Pipeline interface represents an ordered list of Factory objects and an object implementing the HTTPSender interface. -// You construct a Pipeline by calling the pipeline.NewPipeline function. To send an HTTP request, call pipeline.NewRequest -// and then call Pipeline's Do method passing a context, the request, and a method-specific Factory (or nil). Passing a -// method-specific Factory allows this one call to Do to inject a Policy into the linked-list. The policy is injected where -// the MethodFactoryMarker (see the pipeline.MethodFactoryMarker function) is in the slice of Factory objects. -// -// When Do is called, the Pipeline object asks each Factory object to construct its Policy object and adds each Policy to a linked-list. -// THen, Do sends the Context and Request through all the Policy objects. The final Policy object sends the request over the network -// (via the HTTPSender object passed to NewPipeline) and the response is returned backwards through all the Policy objects. -// Since Pipeline and Factory objects are goroutine-safe, you typically create 1 Pipeline object and reuse it to make many HTTP requests. -type Pipeline interface { - Do(ctx context.Context, methodFactory Factory, request Request) (Response, error) -} - -// NewPipeline creates a new goroutine-safe Pipeline object from the slice of Factory objects and the specified options. -func NewPipeline(factories []Factory, o Options) Pipeline { - if o.HTTPSender == nil { - o.HTTPSender = newDefaultHTTPClientFactory() - } - if o.Log.Log == nil { - o.Log.Log = func(LogLevel, string) {} // No-op logger - } - return &pipeline{factories: factories, options: o} -} - -// Do is called for each and every HTTP request. It tells each Factory to create its own (mutable) Policy object -// replacing a MethodFactoryMarker factory (if it exists) with the methodFactory passed in. Then, the Context and Request -// are sent through the pipeline of Policy objects (which can transform the Request's URL/query parameters/headers) and -// ultimately sends the transformed HTTP request over the network. -func (p *pipeline) Do(ctx context.Context, methodFactory Factory, request Request) (Response, error) { - response, err := p.newPolicies(methodFactory).Do(ctx, request) - request.close() - return response, err -} - -func (p *pipeline) newPolicies(methodFactory Factory) Policy { - // The last Policy is the one that actually sends the request over the wire and gets the response. - // It is overridable via the Options' HTTPSender field. - po := &PolicyOptions{pipeline: p} // One object shared by all policy objects - next := p.options.HTTPSender.New(nil, po) - - // Walk over the slice of Factory objects in reverse (from wire to API) - markers := 0 - for i := len(p.factories) - 1; i >= 0; i-- { - factory := p.factories[i] - if _, ok := factory.(methodFactoryMarker); ok { - markers++ - if markers > 1 { - panic("MethodFactoryMarker can only appear once in the pipeline") - } - if methodFactory != nil { - // Replace MethodFactoryMarker with passed-in methodFactory - next = methodFactory.New(next, po) - } - } else { - // Use the slice's Factory to construct its Policy - next = factory.New(next, po) - } - } - - // Each Factory has created its Policy - if markers == 0 && methodFactory != nil { - panic("Non-nil methodFactory requires MethodFactoryMarker in the pipeline") - } - return next // Return head of the Policy object linked-list -} - -// A PolicyOptions represents optional information that can be used by a node in the -// linked-list of Policy objects. A PolicyOptions is passed to the Factory's New method -// which passes it (if desired) to the Policy object it creates. Today, the Policy object -// uses the options to perform logging. But, in the future, this could be used for more. -type PolicyOptions struct { - pipeline *pipeline -} - -// ShouldLog returns true if the specified log level should be logged. -func (po *PolicyOptions) ShouldLog(level LogLevel) bool { - if po.pipeline.options.Log.ShouldLog != nil { - return po.pipeline.options.Log.ShouldLog(level) - } - return false -} - -// Log logs a string to the Pipeline's Logger. -func (po *PolicyOptions) Log(level LogLevel, msg string) { - if !po.ShouldLog(level) { - return // Short circuit message formatting if we're not logging it - } - - // We are logging it, ensure trailing newline - if len(msg) == 0 || msg[len(msg)-1] != '\n' { - msg += "\n" // Ensure trailing newline - } - po.pipeline.options.Log.Log(level, msg) - - // If logger doesn't handle fatal/panic, we'll do it here. - if level == LogFatal { - os.Exit(1) - } else if level == LogPanic { - panic(msg) - } -} - -var pipelineHTTPClient = newDefaultHTTPClient() - -func newDefaultHTTPClient() *http.Client { - // We want the Transport to have a large connection pool - return &http.Client{ - Transport: &http.Transport{ - Proxy: http.ProxyFromEnvironment, - // We use Dial instead of DialContext as DialContext has been reported to cause slower performance. - Dial /*Context*/ : (&net.Dialer{ - Timeout: 30 * time.Second, - KeepAlive: 30 * time.Second, - DualStack: true, - }).Dial, /*Context*/ - MaxIdleConns: 0, // No limit - MaxIdleConnsPerHost: 100, - IdleConnTimeout: 90 * time.Second, - TLSHandshakeTimeout: 10 * time.Second, - ExpectContinueTimeout: 1 * time.Second, - DisableKeepAlives: false, - DisableCompression: false, - MaxResponseHeaderBytes: 0, - //ResponseHeaderTimeout: time.Duration{}, - //ExpectContinueTimeout: time.Duration{}, - }, - } -} - -// newDefaultHTTPClientFactory creates a DefaultHTTPClientPolicyFactory object that sends HTTP requests to a Go's default http.Client. -func newDefaultHTTPClientFactory() Factory { - return FactoryFunc(func(next Policy, po *PolicyOptions) PolicyFunc { - return func(ctx context.Context, request Request) (Response, error) { - r, err := pipelineHTTPClient.Do(request.WithContext(ctx)) - if err != nil { - err = NewError(err, "HTTP request failed") - } - return NewHTTPResponse(r), err - } - }) -} - -var mfm = methodFactoryMarker{} // Singleton - -// MethodFactoryMarker returns a special marker Factory object. When Pipeline's Do method is called, any -// MethodMarkerFactory object is replaced with the specified methodFactory object. If nil is passed fro Do's -// methodFactory parameter, then the MethodFactoryMarker is ignored as the linked-list of Policy objects is created. -func MethodFactoryMarker() Factory { - return mfm -} - -type methodFactoryMarker struct { -} - -func (methodFactoryMarker) New(next Policy, po *PolicyOptions) Policy { - panic("methodFactoryMarker policy should have been replaced with a method policy") -} diff --git a/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_syslog.go b/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_syslog.go deleted file mode 100755 index d0bb7740769c..000000000000 --- a/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_syslog.go +++ /dev/null @@ -1,33 +0,0 @@ -// +build !windows,!nacl,!plan9 - -package pipeline - -import ( - "log" - "log/syslog" -) - -// ForceLog should rarely be used. It forceable logs an entry to the -// Windows Event Log (on Windows) or to the SysLog (on Linux) -func ForceLog(level LogLevel, msg string) { - if defaultLogger == nil { - return // Return fast if we failed to create the logger. - } - // We are logging it, ensure trailing newline - if len(msg) == 0 || msg[len(msg)-1] != '\n' { - msg += "\n" // Ensure trailing newline - } - switch level { - case LogFatal: - defaultLogger.Fatal(msg) - case LogPanic: - defaultLogger.Panic(msg) - case LogError, LogWarning, LogInfo: - defaultLogger.Print(msg) - } -} - -var defaultLogger = func() *log.Logger { - l, _ := syslog.NewLogger(syslog.LOG_USER|syslog.LOG_WARNING, log.LstdFlags) - return l -}() diff --git a/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_windows.go b/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_windows.go deleted file mode 100755 index cb67398995af..000000000000 --- a/vendor/github.com/Azure/azure-pipeline-go/pipeline/defaultlog_windows.go +++ /dev/null @@ -1,61 +0,0 @@ -package pipeline - -import ( - "os" - "syscall" - "unsafe" -) - -// ForceLog should rarely be used. It forceable logs an entry to the -// Windows Event Log (on Windows) or to the SysLog (on Linux) -func ForceLog(level LogLevel, msg string) { - var el eventType - switch level { - case LogError, LogFatal, LogPanic: - el = elError - case LogWarning: - el = elWarning - case LogInfo: - el = elInfo - } - // We are logging it, ensure trailing newline - if len(msg) == 0 || msg[len(msg)-1] != '\n' { - msg += "\n" // Ensure trailing newline - } - reportEvent(el, 0, msg) -} - -type eventType int16 - -const ( - elSuccess eventType = 0 - elError eventType = 1 - elWarning eventType = 2 - elInfo eventType = 4 -) - -var reportEvent = func() func(eventType eventType, eventID int32, msg string) { - advAPI32 := syscall.MustLoadDLL("AdvAPI32.dll") - registerEventSource := advAPI32.MustFindProc("RegisterEventSourceW") - - sourceName, _ := os.Executable() - sourceNameUTF16, _ := syscall.UTF16PtrFromString(sourceName) - handle, _, lastErr := registerEventSource.Call(uintptr(0), uintptr(unsafe.Pointer(sourceNameUTF16))) - if lastErr == nil { // On error, logging is a no-op - return func(eventType eventType, eventID int32, msg string) {} - } - reportEvent := advAPI32.MustFindProc("ReportEventW") - return func(eventType eventType, eventID int32, msg string) { - s, _ := syscall.UTF16PtrFromString(msg) - _, _, _ = reportEvent.Call( - uintptr(handle), // HANDLE hEventLog - uintptr(eventType), // WORD wType - uintptr(0), // WORD wCategory - uintptr(eventID), // DWORD dwEventID - uintptr(0), // PSID lpUserSid - uintptr(1), // WORD wNumStrings - uintptr(0), // DWORD dwDataSize - uintptr(unsafe.Pointer(&s)), // LPCTSTR *lpStrings - uintptr(0)) // LPVOID lpRawData - } -}() diff --git a/vendor/github.com/Azure/azure-pipeline-go/pipeline/doc.go b/vendor/github.com/Azure/azure-pipeline-go/pipeline/doc.go deleted file mode 100755 index b5ab05f4deee..000000000000 --- a/vendor/github.com/Azure/azure-pipeline-go/pipeline/doc.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2017 Microsoft Corporation. All rights reserved. -// Use of this source code is governed by an MIT -// license that can be found in the LICENSE file. - -/* -Package pipeline implements an HTTP request/response middleware pipeline whose -policy objects mutate an HTTP request's URL, query parameters, and/or headers before -the request is sent over the wire. - -Not all policy objects mutate an HTTP request; some policy objects simply impact the -flow of requests/responses by performing operations such as logging, retry policies, -timeouts, failure injection, and deserialization of response payloads. - -Implementing the Policy Interface - -To implement a policy, define a struct that implements the pipeline.Policy interface's Do method. Your Do -method is called when an HTTP request wants to be sent over the network. Your Do method can perform any -operation(s) it desires. For example, it can log the outgoing request, mutate the URL, headers, and/or query -parameters, inject a failure, etc. Your Do method must then forward the HTTP request to next Policy object -in a linked-list ensuring that the remaining Policy objects perform their work. Ultimately, the last Policy -object sends the HTTP request over the network (by calling the HTTPSender's Do method). - -When an HTTP response comes back, each Policy object in the linked-list gets a chance to process the response -(in reverse order). The Policy object can log the response, retry the operation if due to a transient failure -or timeout, deserialize the response body, etc. Ultimately, the last Policy object returns the HTTP response -to the code that initiated the original HTTP request. - -Here is a template for how to define a pipeline.Policy object: - - type myPolicy struct { - node PolicyNode - // TODO: Add configuration/setting fields here (if desired)... - } - - func (p *myPolicy) Do(ctx context.Context, request pipeline.Request) (pipeline.Response, error) { - // TODO: Mutate/process the HTTP request here... - response, err := p.node.Do(ctx, request) // Forward HTTP request to next Policy & get HTTP response - // TODO: Mutate/process the HTTP response here... - return response, err // Return response/error to previous Policy - } - -Implementing the Factory Interface - -Each Policy struct definition requires a factory struct definition that implements the pipeline.Factory interface's New -method. The New method is called when application code wants to initiate a new HTTP request. Factory's New method is -passed a pipeline.PolicyNode object which contains a reference to the owning pipeline.Pipeline object (discussed later) and -a reference to the next Policy object in the linked list. The New method should create its corresponding Policy object -passing it the PolicyNode and any other configuration/settings fields appropriate for the specific Policy object. - -Here is a template for how to define a pipeline.Policy object: - - // NOTE: Once created & initialized, Factory objects should be goroutine-safe (ex: immutable); - // this allows reuse (efficient use of memory) and makes these objects usable by multiple goroutines concurrently. - type myPolicyFactory struct { - // TODO: Add any configuration/setting fields if desired... - } - - func (f *myPolicyFactory) New(node pipeline.PolicyNode) Policy { - return &myPolicy{node: node} // TODO: Also initialize any configuration/setting fields here (if desired)... - } - -Using your Factory and Policy objects via a Pipeline - -To use the Factory and Policy objects, an application constructs a slice of Factory objects and passes -this slice to the pipeline.NewPipeline function. - - func NewPipeline(factories []pipeline.Factory, sender pipeline.HTTPSender) Pipeline - -This function also requires an object implementing the HTTPSender interface. For simple scenarios, -passing nil for HTTPSender causes a standard Go http.Client object to be created and used to actually -send the HTTP response over the network. For more advanced scenarios, you can pass your own HTTPSender -object in. This allows sharing of http.Client objects or the use of custom-configured http.Client objects -or other objects that can simulate the network requests for testing purposes. - -Now that you have a pipeline.Pipeline object, you can create a pipeline.Request object (which is a simple -wrapper around Go's standard http.Request object) and pass it to Pipeline's Do method along with passing a -context.Context for cancelling the HTTP request (if desired). - - type Pipeline interface { - Do(ctx context.Context, methodFactory pipeline.Factory, request pipeline.Request) (pipeline.Response, error) - } - -Do iterates over the slice of Factory objects and tells each one to create its corresponding -Policy object. After the linked-list of Policy objects have been created, Do calls the first -Policy object passing it the Context & HTTP request parameters. These parameters now flow through -all the Policy objects giving each object a chance to look at and/or mutate the HTTP request. -The last Policy object sends the message over the network. - -When the network operation completes, the HTTP response and error return values pass -back through the same Policy objects in reverse order. Most Policy objects ignore the -response/error but some log the result, retry the operation (depending on the exact -reason the operation failed), or deserialize the response's body. Your own Policy -objects can do whatever they like when processing outgoing requests or incoming responses. - -Note that after an I/O request runs to completion, the Policy objects for that request -are garbage collected. However, Pipeline object (like Factory objects) are goroutine-safe allowing -them to be created once and reused over many I/O operations. This allows for efficient use of -memory and also makes them safely usable by multiple goroutines concurrently. - -Inserting a Method-Specific Factory into the Linked-List of Policy Objects - -While Pipeline and Factory objects can be reused over many different operations, it is -common to have special behavior for a specific operation/method. For example, a method -may need to deserialize the response's body to an instance of a specific data type. -To accommodate this, the Pipeline's Do method takes an additional method-specific -Factory object. The Do method tells this Factory to create a Policy object and -injects this method-specific Policy object into the linked-list of Policy objects. - -When creating a Pipeline object, the slice of Factory objects passed must have 1 -(and only 1) entry marking where the method-specific Factory should be injected. -The Factory marker is obtained by calling the pipeline.MethodFactoryMarker() function: - - func MethodFactoryMarker() pipeline.Factory - -Creating an HTTP Request Object - -The HTTP request object passed to Pipeline's Do method is not Go's http.Request struct. -Instead, it is a pipeline.Request struct which is a simple wrapper around Go's standard -http.Request. You create a pipeline.Request object by calling the pipeline.NewRequest function: - - func NewRequest(method string, url url.URL, options pipeline.RequestOptions) (request pipeline.Request, err error) - -To this function, you must pass a pipeline.RequestOptions that looks like this: - - type RequestOptions struct { - // The readable and seekable stream to be sent to the server as the request's body. - Body io.ReadSeeker - - // The callback method (if not nil) to be invoked to report progress as the stream is uploaded in the HTTP request. - Progress ProgressReceiver - } - -The method and struct ensure that the request's body stream is a read/seekable stream. -A seekable stream is required so that upon retry, the final Policy object can seek -the stream back to the beginning before retrying the network request and re-uploading the -body. In addition, you can associate a ProgressReceiver callback function which will be -invoked periodically to report progress while bytes are being read from the body stream -and sent over the network. - -Processing the HTTP Response - -When an HTTP response comes in from the network, a reference to Go's http.Response struct is -embedded in a struct that implements the pipeline.Response interface: - - type Response interface { - Response() *http.Response - } - -This interface is returned through all the Policy objects. Each Policy object can call the Response -interface's Response method to examine (or mutate) the embedded http.Response object. - -A Policy object can internally define another struct (implementing the pipeline.Response interface) -that embeds an http.Response and adds additional fields and return this structure to other Policy -objects. This allows a Policy object to deserialize the body to some other struct and return the -original http.Response and the additional struct back through the Policy chain. Other Policy objects -can see the Response but cannot see the additional struct with the deserialized body. After all the -Policy objects have returned, the pipeline.Response interface is returned by Pipeline's Do method. -The caller of this method can perform a type assertion attempting to get back to the struct type -really returned by the Policy object. If the type assertion is successful, the caller now has -access to both the http.Response and the deserialized struct object.*/ -package pipeline diff --git a/vendor/github.com/Azure/azure-pipeline-go/pipeline/error.go b/vendor/github.com/Azure/azure-pipeline-go/pipeline/error.go deleted file mode 100755 index fd008364d633..000000000000 --- a/vendor/github.com/Azure/azure-pipeline-go/pipeline/error.go +++ /dev/null @@ -1,121 +0,0 @@ -package pipeline - -import ( - "fmt" - "runtime" -) - -type causer interface { - Cause() error -} - -// ErrorNode can be an embedded field in a private error object. This field -// adds Program Counter support and a 'cause' (reference to a preceding error). -// When initializing a error type with this embedded field, initialize the -// ErrorNode field by calling ErrorNode{}.Initialize(cause). -type ErrorNode struct { - pc uintptr // Represents a Program Counter that you can get symbols for. - cause error // Refers to the preceding error (or nil) -} - -// Error returns a string with the PC's symbols or "" if the PC is invalid. -// When defining a new error type, have its Error method call this one passing -// it the string representation of the error. -func (e *ErrorNode) Error(msg string) string { - s := "" - if fn := runtime.FuncForPC(e.pc); fn != nil { - file, line := fn.FileLine(e.pc) - s = fmt.Sprintf("-> %v, %v:%v\n", fn.Name(), file, line) - } - s += msg + "\n\n" - if e.cause != nil { - s += e.cause.Error() + "\n" - } - return s -} - -// Cause returns the error that preceded this error. -func (e *ErrorNode) Cause() error { return e.cause } - -// Temporary returns true if the error occurred due to a temporary condition. -func (e ErrorNode) Temporary() bool { - type temporary interface { - Temporary() bool - } - - for err := e.cause; err != nil; { - if t, ok := err.(temporary); ok { - return t.Temporary() - } - - if cause, ok := err.(causer); ok { - err = cause.Cause() - } else { - err = nil - } - } - return false -} - -// Timeout returns true if the error occurred due to time expiring. -func (e ErrorNode) Timeout() bool { - type timeout interface { - Timeout() bool - } - - for err := e.cause; err != nil; { - if t, ok := err.(timeout); ok { - return t.Timeout() - } - - if cause, ok := err.(causer); ok { - err = cause.Cause() - } else { - err = nil - } - } - return false -} - -// Initialize is used to initialize an embedded ErrorNode field. -// It captures the caller's program counter and saves the cause (preceding error). -// To initialize the field, use "ErrorNode{}.Initialize(cause, 3)". A callersToSkip -// value of 3 is very common; but, depending on your code nesting, you may need -// a different value. -func (ErrorNode) Initialize(cause error, callersToSkip int) ErrorNode { - // Get the PC of Initialize method's caller. - pc := [1]uintptr{} - _ = runtime.Callers(callersToSkip, pc[:]) - return ErrorNode{pc: pc[0], cause: cause} -} - -// Cause walks all the preceding errors and return the originating error. -func Cause(err error) error { - for err != nil { - cause, ok := err.(causer) - if !ok { - break - } - err = cause.Cause() - } - return err -} - -// NewError creates a simple string error (like Error.New). But, this -// error also captures the caller's Program Counter and the preceding error. -func NewError(cause error, msg string) error { - return &pcError{ - ErrorNode: ErrorNode{}.Initialize(cause, 3), - msg: msg, - } -} - -// pcError is a simple string error (like error.New) with an ErrorNode (PC & cause). -type pcError struct { - ErrorNode - msg string -} - -// Error satisfies the error interface. It shows the error with Program Counter -// symbols and calls Error on the preceding error so you can see the full error chain. -func (e *pcError) Error() string { return e.ErrorNode.Error(e.msg) } diff --git a/vendor/github.com/Azure/azure-pipeline-go/pipeline/progress.go b/vendor/github.com/Azure/azure-pipeline-go/pipeline/progress.go deleted file mode 100755 index efa3c8ed06b5..000000000000 --- a/vendor/github.com/Azure/azure-pipeline-go/pipeline/progress.go +++ /dev/null @@ -1,82 +0,0 @@ -package pipeline - -import "io" - -// ********** The following is common between the request body AND the response body. - -// ProgressReceiver defines the signature of a callback function invoked as progress is reported. -type ProgressReceiver func(bytesTransferred int64) - -// ********** The following are specific to the request body (a ReadSeekCloser) - -// This struct is used when sending a body to the network -type requestBodyProgress struct { - requestBody io.ReadSeeker // Seeking is required to support retries - pr ProgressReceiver -} - -// NewRequestBodyProgress adds progress reporting to an HTTP request's body stream. -func NewRequestBodyProgress(requestBody io.ReadSeeker, pr ProgressReceiver) io.ReadSeeker { - if pr == nil { - panic("pr must not be nil") - } - return &requestBodyProgress{requestBody: requestBody, pr: pr} -} - -// Read reads a block of data from an inner stream and reports progress -func (rbp *requestBodyProgress) Read(p []byte) (n int, err error) { - n, err = rbp.requestBody.Read(p) - if err != nil { - return - } - // Invokes the user's callback method to report progress - position, err := rbp.requestBody.Seek(0, io.SeekCurrent) - if err != nil { - panic(err) - } - rbp.pr(position) - return -} - -func (rbp *requestBodyProgress) Seek(offset int64, whence int) (offsetFromStart int64, err error) { - return rbp.requestBody.Seek(offset, whence) -} - -// requestBodyProgress supports Close but the underlying stream may not; if it does, Close will close it. -func (rbp *requestBodyProgress) Close() error { - if c, ok := rbp.requestBody.(io.Closer); ok { - return c.Close() - } - return nil -} - -// ********** The following are specific to the response body (a ReadCloser) - -// This struct is used when sending a body to the network -type responseBodyProgress struct { - responseBody io.ReadCloser - pr ProgressReceiver - offset int64 -} - -// NewResponseBodyProgress adds progress reporting to an HTTP response's body stream. -func NewResponseBodyProgress(responseBody io.ReadCloser, pr ProgressReceiver) io.ReadCloser { - if pr == nil { - panic("pr must not be nil") - } - return &responseBodyProgress{responseBody: responseBody, pr: pr, offset: 0} -} - -// Read reads a block of data from an inner stream and reports progress -func (rbp *responseBodyProgress) Read(p []byte) (n int, err error) { - n, err = rbp.responseBody.Read(p) - rbp.offset += int64(n) - - // Invokes the user's callback method to report progress - rbp.pr(rbp.offset) - return -} - -func (rbp *responseBodyProgress) Close() error { - return rbp.responseBody.Close() -} diff --git a/vendor/github.com/Azure/azure-pipeline-go/pipeline/request.go b/vendor/github.com/Azure/azure-pipeline-go/pipeline/request.go deleted file mode 100755 index 1fbe72bd4dd7..000000000000 --- a/vendor/github.com/Azure/azure-pipeline-go/pipeline/request.go +++ /dev/null @@ -1,147 +0,0 @@ -package pipeline - -import ( - "io" - "net/http" - "net/url" - "strconv" -) - -// Request is a thin wrapper over an http.Request. The wrapper provides several helper methods. -type Request struct { - *http.Request -} - -// NewRequest initializes a new HTTP request object with any desired options. -func NewRequest(method string, url url.URL, body io.ReadSeeker) (request Request, err error) { - // Note: the url is passed by value so that any pipeline operations that modify it do so on a copy. - - // This code to construct an http.Request is copied from http.NewRequest(); we intentionally omitted removeEmptyPort for now. - request.Request = &http.Request{ - Method: method, - URL: &url, - Proto: "HTTP/1.1", - ProtoMajor: 1, - ProtoMinor: 1, - Header: make(http.Header), - Host: url.Host, - } - - if body != nil { - err = request.SetBody(body) - } - return -} - -// SetBody sets the body and content length, assumes body is not nil. -func (r Request) SetBody(body io.ReadSeeker) error { - size, err := body.Seek(0, io.SeekEnd) - if err != nil { - return err - } - - body.Seek(0, io.SeekStart) - r.ContentLength = size - r.Header["Content-Length"] = []string{strconv.FormatInt(size, 10)} - - if size != 0 { - r.Body = &retryableRequestBody{body: body} - r.GetBody = func() (io.ReadCloser, error) { - _, err := body.Seek(0, io.SeekStart) - if err != nil { - return nil, err - } - return r.Body, nil - } - } else { - // in case the body is an empty stream, we need to use http.NoBody to explicitly provide no content - r.Body = http.NoBody - r.GetBody = func() (io.ReadCloser, error) { - return http.NoBody, nil - } - - // close the user-provided empty body - if c, ok := body.(io.Closer); ok { - c.Close() - } - } - - return nil -} - -// Copy makes a copy of an http.Request. Specifically, it makes a deep copy -// of its Method, URL, Host, Proto(Major/Minor), Header. ContentLength, Close, -// RemoteAddr, RequestURI. Copy makes a shallow copy of the Body, GetBody, TLS, -// Cancel, Response, and ctx fields. Copy panics if any of these fields are -// not nil: TransferEncoding, Form, PostForm, MultipartForm, or Trailer. -func (r Request) Copy() Request { - if r.TransferEncoding != nil || r.Form != nil || r.PostForm != nil || r.MultipartForm != nil || r.Trailer != nil { - panic("Can't make a deep copy of the http.Request because at least one of the following is not nil:" + - "TransferEncoding, Form, PostForm, MultipartForm, or Trailer.") - } - copy := *r.Request // Copy the request - urlCopy := *(r.Request.URL) // Copy the URL - copy.URL = &urlCopy - copy.Header = http.Header{} // Copy the header - for k, vs := range r.Header { - for _, value := range vs { - copy.Header.Add(k, value) - } - } - return Request{Request: ©} // Return the copy -} - -func (r Request) close() error { - if r.Body != nil && r.Body != http.NoBody { - c, ok := r.Body.(*retryableRequestBody) - if !ok { - panic("unexpected request body type (should be *retryableReadSeekerCloser)") - } - return c.realClose() - } - return nil -} - -// RewindBody seeks the request's Body stream back to the beginning so it can be resent when retrying an operation. -func (r Request) RewindBody() error { - if r.Body != nil && r.Body != http.NoBody { - s, ok := r.Body.(io.Seeker) - if !ok { - panic("unexpected request body type (should be io.Seeker)") - } - - // Reset the stream back to the beginning - _, err := s.Seek(0, io.SeekStart) - return err - } - return nil -} - -// ********** The following type/methods implement the retryableRequestBody (a ReadSeekCloser) - -// This struct is used when sending a body to the network -type retryableRequestBody struct { - body io.ReadSeeker // Seeking is required to support retries -} - -// Read reads a block of data from an inner stream and reports progress -func (b *retryableRequestBody) Read(p []byte) (n int, err error) { - return b.body.Read(p) -} - -func (b *retryableRequestBody) Seek(offset int64, whence int) (offsetFromStart int64, err error) { - return b.body.Seek(offset, whence) -} - -func (b *retryableRequestBody) Close() error { - // We don't want the underlying transport to close the request body on transient failures so this is a nop. - // The pipeline closes the request body upon success. - return nil -} - -func (b *retryableRequestBody) realClose() error { - if c, ok := b.body.(io.Closer); ok { - return c.Close() - } - return nil -} diff --git a/vendor/github.com/Azure/azure-pipeline-go/pipeline/response.go b/vendor/github.com/Azure/azure-pipeline-go/pipeline/response.go deleted file mode 100755 index f2dc164821dc..000000000000 --- a/vendor/github.com/Azure/azure-pipeline-go/pipeline/response.go +++ /dev/null @@ -1,74 +0,0 @@ -package pipeline - -import ( - "bytes" - "fmt" - "net/http" - "sort" - "strings" -) - -// The Response interface exposes an http.Response object as it returns through the pipeline of Policy objects. -// This ensures that Policy objects have access to the HTTP response. However, the object this interface encapsulates -// might be a struct with additional fields that is created by a Policy object (typically a method-specific Factory). -// The method that injected the method-specific Factory gets this returned Response and performs a type assertion -// to the expected struct and returns the struct to its caller. -type Response interface { - Response() *http.Response -} - -// This is the default struct that has the http.Response. -// A method can replace this struct with its own struct containing an http.Response -// field and any other additional fields. -type httpResponse struct { - response *http.Response -} - -// NewHTTPResponse is typically called by a Policy object to return a Response object. -func NewHTTPResponse(response *http.Response) Response { - return &httpResponse{response: response} -} - -// This method satisfies the public Response interface's Response method -func (r httpResponse) Response() *http.Response { - return r.response -} - -// WriteRequestWithResponse appends a formatted HTTP request into a Buffer. If request and/or err are -// not nil, then these are also written into the Buffer. -func WriteRequestWithResponse(b *bytes.Buffer, request *http.Request, response *http.Response, err error) { - // Write the request into the buffer. - fmt.Fprint(b, " "+request.Method+" "+request.URL.String()+"\n") - writeHeader(b, request.Header) - if response != nil { - fmt.Fprintln(b, " --------------------------------------------------------------------------------") - fmt.Fprint(b, " RESPONSE Status: "+response.Status+"\n") - writeHeader(b, response.Header) - } - if err != nil { - fmt.Fprintln(b, " --------------------------------------------------------------------------------") - fmt.Fprint(b, " ERROR:\n"+err.Error()+"\n") - } -} - -// formatHeaders appends an HTTP request's or response's header into a Buffer. -func writeHeader(b *bytes.Buffer, header map[string][]string) { - if len(header) == 0 { - b.WriteString(" (no headers)\n") - return - } - keys := make([]string, 0, len(header)) - // Alphabetize the headers - for k := range header { - keys = append(keys, k) - } - sort.Strings(keys) - for _, k := range keys { - // Redact the value of any Authorization header to prevent security information from persisting in logs - value := interface{}("REDACTED") - if !strings.EqualFold(k, "Authorization") { - value = header[k] - } - fmt.Fprintf(b, " %s: %+v\n", k, value) - } -} diff --git a/vendor/github.com/Azure/azure-pipeline-go/pipeline/version.go b/vendor/github.com/Azure/azure-pipeline-go/pipeline/version.go deleted file mode 100644 index c4bb62d810b2..000000000000 --- a/vendor/github.com/Azure/azure-pipeline-go/pipeline/version.go +++ /dev/null @@ -1,9 +0,0 @@ -package pipeline - -const ( - // UserAgent is the string to be used in the user agent string when making requests. - UserAgent = "azure-pipeline-go/" + Version - - // Version is the semantic version (see http://semver.org) of the pipeline package. - Version = "0.1.0" -) diff --git a/vendor/github.com/Azure/azure-sdk-for-go/CHANGELOG.md b/vendor/github.com/Azure/azure-sdk-for-go/CHANGELOG.md deleted file mode 100644 index 13a0ca4b388b..000000000000 --- a/vendor/github.com/Azure/azure-sdk-for-go/CHANGELOG.md +++ /dev/null @@ -1,280 +0,0 @@ -# CHANGELOG - ------ - -## `v6.0.0-beta` - -| api | version | note | -|:-------------------------------|:-------------------|:-----------------------------------| -| arm/authorization | no change | code refactoring | -| arm/batch | no change | code refactoring | -| arm/compute | no change | code refactoring | -| arm/containerservice | 2016-03-30 | return | -| arm/datalake-analytics/account | 2015-10-01-preview | new | -| arm/datalake-store/filesystem | no change | moved to datalake-store/filesystem | -| arm/eventhub | no change | code refactoring | -| arm/intune | no change | code refactoring | -| arm/iothub | no change | code refactoring | -| arm/keyvault | no change | code refactoring | -| arm/mediaservices | no change | code refactoring | -| arm/network | no change | code refactoring | -| arm/notificationhubs | no change | code refactoring | -| arm/redis | no change | code refactoring | -| arm/resources/resources | no change | code refactoring | -| arm/resources/links | 2016-09-01 | new | -| arm/resources/locks | 2016-09-01 | updated | -| arm/resources/policy | no change | code refactoring | -| arm/resources/resources | 2016-09-01 | updated | -| arm/servermanagement | 2016-07-01-preview | updated | -| arm/web | no change | code refactoring | - -- storage: Added blob lease functionality and tests - -## `v5.0.0-beta` - -| api | version | note | -|:------------------------------|:--------------------|:-----------------| -| arm/network | 2016-09-01 | updated | -| arm/servermanagement | 2015-07-01-preview | new | -| arm/eventhub | 2015-08-01 | new | -| arm/containerservice | -- | removed | -| arm/resources/subscriptions | no change | code refactoring | -| arm/resources/features | no change | code refactoring | -| arm/resources/resources | no change | code refactoring | -| arm/datalake-store/accounts | no change | code refactoring | -| arm/datalake-store/filesystem | no change | code refactoring | -| arm/notificationhubs | no change | code refactoring | -| arm/redis | no change | code refactoring | - -- storage: Add more file storage share operations. -- azure-rest-api-specs/commit/b8cdc2c50a0872fc0039f20c2b6b33aa0c2af4bf -- Uses go-autorest v7.2.1 - -## `v4.0.0-beta` - -- arm/logic: breaking change in package logic. -- arm: parameter validation code added in all arm packages. -- Uses go-autorest v7.2.0. - - -## `v3.2.0-beta` - -| api | version | note | -|:----------------------------|:--------------------|:----------| -| arm/mediaservices | 2015-10-01 | new | -| arm/keyvault | 2015-06-01 | new | -| arm/iothub | 2016-02-03 | new | -| arm/datalake-store | 2015-12-01 | new | -| arm/network | 2016-06-01 | updated | -| arm/resources/resources | 2016-07-01 | updated | -| arm/resources/policy | 2016-04-01 | updated | -| arm/servicebus | 2015-08-01 | updated | - -- arm: uses go-autorest version v7.1.0. -- storage: fix for operating on blobs names containing special characters. -- storage: add SetBlobProperties(), update BlobProperties response fields. -- storage: make storage client work correctly with read-only secondary account. -- storage: add Azure Storage Emulator support. - - -## `v3.1.0-beta` - -- Added a new arm/compute/containerservice (2016-03-30) package -- Reintroduced NewxxClientWithBaseURI method. -- Uses go-autorest version - v7.0.7. - - -## `v3.0.0-beta` - -This release brings the Go SDK ARM packages up-to-date with Azure ARM Swagger files for most -services. Since the underlying [Swagger files](https://github.com/Azure/azure-rest-api-specs) -continue to change substantially, the ARM packages are still in *beta* status. - -The ARM packages now align with the following API versions (*highlighted* packages are new or -updated in this release): - -| api | version | note | -|:----------------------------|:--------------------|:----------| -| arm/authorization | 2015-07-01 | no change | -| arm/intune | 2015-01-14-preview | no change | -| arm/notificationhubs | 2014-09-01 | no change | -| arm/resources/features | 2015-12-01 | no change | -| arm/resources/subscriptions | 2015-11-01 | no change | -| arm/web | 2015-08-01 | no change | -| arm/cdn | 2016-04-02 | updated | -| arm/compute | 2016-03-30 | updated | -| arm/dns | 2016-04-01 | updated | -| arm/logic | 2015-08-01-preview | updated | -| arm/network | 2016-03-30 | updated | -| arm/redis | 2016-04-01 | updated | -| arm/resources/resources | 2016-02-01 | updated | -| arm/resources/policy | 2015-10-01-preview | updated | -| arm/resources/locks | 2015-01-01 | updated (resources/authorization earlier)| -| arm/scheduler | 2016-03-01 | updated | -| arm/storage | 2016-01-01 | updated | -| arm/search | 2015-02-28 | updated | -| arm/batch | 2015-12-01 | new | -| arm/cognitiveservices | 2016-02-01-preview | new | -| arm/devtestlabs | 2016-05-15 | new | -| arm/machinelearning | 2016-05-01-preview | new | -| arm/powerbiembedded | 2016-01-29 | new | -| arm/mobileengagement | 2014-12-01 | new | -| arm/servicebus | 2014-09-01 | new | -| arm/sql | 2015-05-01 | new | -| arm/trafficmanager | 2015-11-01 | new | - - -Below are some design changes. -- Removed Api version from method arguments. -- Removed New...ClientWithBaseURI() method in all clients. BaseURI value is set in client.go. -- Uses go-autorest version v7.0.6. - - -## `v2.2.0-beta` - -- Uses go-autorest version v7.0.5. -- Update version of pacakges "jwt-go" and "crypto" in glide.lock. - - -## `v2.1.1-beta` - -- arm: Better error messages for long running operation failures (Uses go-autorest version v7.0.4). - - -## `v2.1.0-beta` - -- arm: Uses go-autorest v7.0.3 (polling related updates). -- arm: Cancel channel argument added in long-running calls. -- storage: Allow caller to provide headers for DeleteBlob methods. -- storage: Enables connection sharing with http keepalive. -- storage: Add BlobPrefixes and Delimiter to BlobListResponse - - -## `v2.0.0-beta` - -- Uses go-autorest v6.0.0 (Polling and Asynchronous requests related changes). - - -## `v0.5.0-beta` - -Updated following packages to new API versions: -- arm/resources/features 2015-12-01 -- arm/resources/resources 2015-11-01 -- arm/resources/subscriptions 2015-11-01 - - -### Changes - - - SDK now uses go-autorest v3.0.0. - - - -## `v0.4.0-beta` - -This release brings the Go SDK ARM packages up-to-date with Azure ARM Swagger files for most -services. Since the underlying [Swagger files](https://github.com/Azure/azure-rest-api-specs) -continue to change substantially, the ARM packages are still in *beta* status. - -The ARM packages now align with the following API versions (*highlighted* packages are new or -updated in this release): - -- *arm/authorization 2015-07-01* -- *arm/cdn 2015-06-01* -- arm/compute 2015-06-15 -- arm/dns 2015-05-04-preview -- *arm/intune 2015-01-14-preview* -- arm/logic 2015-02-01-preview -- *arm/network 2015-06-15* -- *arm/notificationhubs 2014-09-01* -- arm/redis 2015-08-01 -- *arm/resources/authorization 2015-01-01* -- *arm/resources/features 2014-08-01-preview* -- *arm/resources/resources 2014-04-01-preview* -- *arm/resources/subscriptions 2014-04-01-preview* -- *arm/scheduler 2016-01-01* -- arm/storage 2015-06-15 -- arm/web 2015-08-01 - -### Changes - -- Moved the arm/authorization, arm/features, arm/resources, and arm/subscriptions packages under a new, resources, package (to reflect the corresponding Swagger structure) -- Added a new arm/authoriation (2015-07-01) package -- Added a new arm/cdn (2015-06-01) package -- Added a new arm/intune (2015-01-14-preview) package -- Udated arm/network (2015-06-01) -- Added a new arm/notificationhubs (2014-09-01) package -- Updated arm/scheduler (2016-01-01) package - - ------ - -## `v0.3.0-beta` - -- Corrected unintentional struct field renaming and client renaming in v0.2.0-beta - ------ - -## `v0.2.0-beta` - -- Added support for DNS, Redis, and Web site services -- Updated Storage service to API version 2015-06-15 -- Updated Network to include routing table support -- Address https://github.com/Azure/azure-sdk-for-go/issues/232 -- Address https://github.com/Azure/azure-sdk-for-go/issues/231 -- Address https://github.com/Azure/azure-sdk-for-go/issues/230 -- Address https://github.com/Azure/azure-sdk-for-go/issues/224 -- Address https://github.com/Azure/azure-sdk-for-go/issues/184 -- Address https://github.com/Azure/azure-sdk-for-go/issues/183 - ------- - -## `v0.1.1-beta` - -- Improves the UserAgent string to disambiguate arm packages from others in the SDK -- Improves setting the http.Response into generated results (reduces likelihood of a nil reference) -- Adds gofmt, golint, and govet to Travis CI for the arm packages - -##### Fixed Issues - -- https://github.com/Azure/azure-sdk-for-go/issues/196 -- https://github.com/Azure/azure-sdk-for-go/issues/213 - ------- - -## v0.1.0-beta - -This release addresses the issues raised against the alpha release and adds more features. Most -notably, to address the challenges of encoding JSON -(see the [comments](https://github.com/Azure/go-autorest#handling-empty-values) in the -[go-autorest](https://github.com/Azure/go-autorest) package) by using pointers for *all* structure -fields (with the exception of enumerations). The -[go-autorest/autorest/to](https://github.com/Azure/go-autorest/tree/master/autorest/to) package -provides helpers to convert to / from pointers. The examples demonstrate their usage. - -Additionally, the packages now align with Go coding standards and pass both `golint` and `govet`. -Accomplishing this required renaming various fields and parameters (such as changing Url to URL). - -##### Changes - -- Changed request / response structures to use pointer fields. -- Changed methods to return `error` instead of `autorest.Error`. -- Re-divided methods to ease asynchronous requests. -- Added paged results support. -- Added a UserAgent string. -- Added changes necessary to pass golint and govet. -- Updated README.md with details on asynchronous requests and paging. -- Saved package dependencies through Godep (for the entire SDK). - -##### Fixed Issues: - -- https://github.com/Azure/azure-sdk-for-go/issues/205 -- https://github.com/Azure/azure-sdk-for-go/issues/206 -- https://github.com/Azure/azure-sdk-for-go/issues/211 -- https://github.com/Azure/azure-sdk-for-go/issues/212 - ------ - -## v0.1.0-alpha - -This release introduces the Azure Resource Manager packages generated from the corresponding -[Swagger API](http://swagger.io) [definitions](https://github.com/Azure/azure-rest-api-specs). \ No newline at end of file diff --git a/vendor/github.com/Azure/azure-sdk-for-go/LICENSE b/vendor/github.com/Azure/azure-sdk-for-go/LICENSE deleted file mode 100644 index af39a91e7033..000000000000 --- a/vendor/github.com/Azure/azure-sdk-for-go/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - 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 2016 Microsoft Corporation - - 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/Azure/azure-sdk-for-go/README.md b/vendor/github.com/Azure/azure-sdk-for-go/README.md deleted file mode 100644 index 6a1aaf4acb91..000000000000 --- a/vendor/github.com/Azure/azure-sdk-for-go/README.md +++ /dev/null @@ -1,102 +0,0 @@ -# Microsoft Azure SDK for Go - -This project provides various Go packages to perform operations -on Microsoft Azure REST APIs. - -[![GoDoc](https://godoc.org/github.com/Azure/azure-sdk-for-go?status.svg)](https://godoc.org/github.com/Azure/azure-sdk-for-go) [![Build Status](https://travis-ci.org/Azure/azure-sdk-for-go.svg?branch=master)](https://travis-ci.org/Azure/azure-sdk-for-go) - -> **NOTE:** This repository is under heavy ongoing development and -is likely to break over time. We currently do not have any releases -yet. If you are planning to use the repository, please consider vendoring -the packages in your project and update them when a stable tag is out. - -# Packages - -## Azure Resource Manager (ARM) - -[About ARM](/arm/README.md) - -- [authorization](/arm/authorization) -- [batch](/arm/batch) -- [cdn](/arm/cdn) -- [cognitiveservices](/arm/cognitiveservices) -- [compute](/arm/compute) -- [containerservice](/arm/containerservice) -- [datalake-store](/arm/datalake-store) -- [devtestlabs](/arm/devtestlabs) -- [dns](/arm/dns) -- [intune](/arm/intune) -- [iothub](/arm/iothub) -- [keyvault](/arm/keyvault) -- [logic](/arm/logic) -- [machinelearning](/arm/machinelearning) -- [mediaservices](/arm/mediaservices) -- [mobileengagement](/arm/mobileengagement) -- [network](/arm/network) -- [notificationhubs](/arm/notificationhubs) -- [powerbiembedded](/arm/powerbiembedded) -- [redis](/arm/redis) -- [resources](/arm/resources) -- [scheduler](/arm/scheduler) -- [search](/arm/search) -- [servicebus](/arm/servicebus) -- [sql](/arm/sql) -- [storage](/arm/storage) -- [trafficmanager](/arm/trafficmanager) -- [web](/arm/web) - -## Azure Service Management (ASM), aka classic deployment - -[About ASM](/management/README.md) - -- [affinitygroup](/management/affinitygroup) -- [hostedservice](/management/hostedservice) -- [location](/management/location) -- [networksecuritygroup](/management/networksecuritygroup) -- [osimage](/management/osimage) -- [sql](/management/sql) -- [storageservice](/management/storageservice) -- [virtualmachine](/management/virtualmachine) -- [virtualmachinedisk](/management/virtualmachinedisk) -- [virtualmachineimage](/management/virtualmachineimage) -- [virtualnetwork](/management/virtualnetwork) -- [vmutils](/management/vmutils) - -## Azure Storage SDK for Go - -[About Storage](/storage/README.md) - -- [storage](/storage) - -# Installation - -- [Install Go 1.7](https://golang.org/dl/). - -- Go get the SDK: - -``` -$ go get -d github.com/Azure/azure-sdk-for-go -``` - -> **IMPORTANT:** We highly suggest vendoring Azure SDK for Go as a dependency. For vendoring dependencies, Azure SDK for Go uses [glide](https://github.com/Masterminds/glide). If you haven't already, install glide. Navigate to your project directory and install the dependencies. - -``` -$ cd your/project -$ glide create -$ glide install -``` - -# Documentation - -Read the Godoc of the repository at [Godoc.org](http://godoc.org/github.com/Azure/azure-sdk-for-go/). - -# Contribute - -If you would like to become an active contributor to this project please follow the instructions provided in [Microsoft Azure Projects Contribution Guidelines](http://azure.github.io/guidelines/). - -# License - -This project is published under [Apache 2.0 License](LICENSE). - ------ -This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. diff --git a/vendor/github.com/Azure/azure-sdk-for-go/glide.lock b/vendor/github.com/Azure/azure-sdk-for-go/glide.lock deleted file mode 100644 index 31f3207eec31..000000000000 --- a/vendor/github.com/Azure/azure-sdk-for-go/glide.lock +++ /dev/null @@ -1,53 +0,0 @@ -hash: 7407050cee9bb9ce89e23ef26bce4051cce63d558338a4937f027a18b789e3a1 -updated: 2016-10-25T11:34:48.4987356-07:00 -imports: -- name: github.com/Azure/go-autorest - version: 0781901f19f1e7db3034d97ec57af753db0bf808 - subpackages: - - autorest - - autorest/azure - - autorest/date - - autorest/to - - autorest/validation -- name: github.com/dgrijalva/jwt-go - version: 24c63f56522a87ec5339cc3567883f1039378fdb -- name: github.com/howeyc/gopass - version: f5387c492211eb133053880d23dfae62aa14123d -- name: github.com/mattn/go-colorable - version: 6c903ff4aa50920ca86087a280590b36b3152b9c -- name: github.com/mattn/go-isatty - version: 66b8e73f3f5cda9f96b69efd03dd3d7fc4a5cdb8 -- name: github.com/mgutz/ansi - version: c286dcecd19ff979eeb73ea444e479b903f2cfcb -- name: github.com/mgutz/minimist - version: 39eb8cf573ca29344bd7d7e6ba4d7febdebd37a9 -- name: github.com/mgutz/str - version: 968bf66e3da857419e4f6e71b2d5c9ae95682dc4 -- name: github.com/mgutz/to - version: 2a0bcba0661696e339461f5efb2273f4459dd1b9 -- name: github.com/MichaelTJones/walk - version: 3af09438b0ab0e8f296410bfa646a7e635ea1fc0 -- name: github.com/nozzle/throttler - version: d9b45f19996c645d38c9266d1f5cf1990e930119 -- name: github.com/satori/uuid - version: b061729afc07e77a8aa4fad0a2fd840958f1942a -- name: golang.org/x/crypto - version: 84e98f45760e87786b7f24603b8166a6fa09811d - subpackages: - - pkcs12 - - pkcs12/internal/rc2 - - ssh/terminal -- name: golang.org/x/sys - version: c200b10b5d5e122be351b67af224adc6128af5bf - subpackages: - - unix -- name: gopkg.in/check.v1 - version: 4f90aeace3a26ad7021961c297b22c42160c7b25 -- name: gopkg.in/godo.v2 - version: b5fd2f0bef1ebe832e628cfad18ab1cc707f65a1 - subpackages: - - glob - - util - - watcher - - watcher/fswatch -testImports: [] diff --git a/vendor/github.com/Azure/azure-sdk-for-go/glide.yaml b/vendor/github.com/Azure/azure-sdk-for-go/glide.yaml deleted file mode 100644 index 90f54fd1031f..000000000000 --- a/vendor/github.com/Azure/azure-sdk-for-go/glide.yaml +++ /dev/null @@ -1,12 +0,0 @@ -package: github.com/Azure/azure-sdk-for-go -import: -- package: github.com/Azure/go-autorest - subpackages: - - /autorest - - autorest/azure - - autorest/date - - autorest/to -- package: golang.org/x/crypto - subpackages: - - /pkcs12 -- package: gopkg.in/check.v1 \ No newline at end of file diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/access_conditions.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/access_conditions.go deleted file mode 100644 index c7432e41c323..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/access_conditions.go +++ /dev/null @@ -1,67 +0,0 @@ -package azblob - -import ( - "time" -) - -// HTTPAccessConditions identifies standard HTTP access conditions which you optionally set. -type HTTPAccessConditions struct { - IfModifiedSince time.Time - IfUnmodifiedSince time.Time - IfMatch ETag - IfNoneMatch ETag -} - -// pointers is for internal infrastructure. It returns the fields as pointers. -func (ac HTTPAccessConditions) pointers() (ims *time.Time, ius *time.Time, ime *ETag, inme *ETag) { - if !ac.IfModifiedSince.IsZero() { - ims = &ac.IfModifiedSince - } - if !ac.IfUnmodifiedSince.IsZero() { - ius = &ac.IfUnmodifiedSince - } - if ac.IfMatch != ETagNone { - ime = &ac.IfMatch - } - if ac.IfNoneMatch != ETagNone { - inme = &ac.IfNoneMatch - } - return -} - -// ContainerAccessConditions identifies container-specific access conditions which you optionally set. -type ContainerAccessConditions struct { - HTTPAccessConditions - LeaseAccessConditions -} - -// BlobAccessConditions identifies blob-specific access conditions which you optionally set. -type BlobAccessConditions struct { - HTTPAccessConditions - LeaseAccessConditions - AppendBlobAccessConditions - PageBlobAccessConditions -} - -// LeaseAccessConditions identifies lease access conditions for a container or blob which you optionally set. -type LeaseAccessConditions struct { - LeaseID string -} - -// pointers is for internal infrastructure. It returns the fields as pointers. -func (ac LeaseAccessConditions) pointers() (leaseID *string) { - if ac.LeaseID != "" { - leaseID = &ac.LeaseID - } - return -} - -/* -// getInt32 is for internal infrastructure. It is used with access condition values where -// 0 (the default setting) is meaningful. The library interprets 0 as do not send the header -// and the privately-storage field in the access condition object is stored as +1 higher than desired. -// THis method returns true, if the value is > 0 (explicitly set) and the stored value - 1 (the set desired value). -func getInt32(value int32) (bool, int32) { - return value > 0, value - 1 -} -*/ diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/atomicmorph.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/atomicmorph.go deleted file mode 100644 index 385b0458b3d7..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/atomicmorph.go +++ /dev/null @@ -1,79 +0,0 @@ -package azblob - -import "sync/atomic" - -// AtomicMorpherInt32 identifies a method passed to and invoked by the AtomicMorphInt32 function. -// The AtomicMorpher callback is passed a startValue and based on this value it returns -// what the new value should be and the result that AtomicMorph should return to its caller. -type AtomicMorpherInt32 func(startVal int32) (val int32, morphResult interface{}) - -// AtomicMorph atomically morphs target in to new value (and result) as indicated bythe AtomicMorpher callback function. -func AtomicMorphInt32(target *int32, morpher AtomicMorpherInt32) interface{} { - if target == nil || morpher == nil { - panic("target and morpher mut not be nil") - } - for { - currentVal := atomic.LoadInt32(target) - desiredVal, morphResult := morpher(currentVal) - if atomic.CompareAndSwapInt32(target, currentVal, desiredVal) { - return morphResult - } - } -} - -// AtomicMorpherUint32 identifies a method passed to and invoked by the AtomicMorph function. -// The AtomicMorpher callback is passed a startValue and based on this value it returns -// what the new value should be and the result that AtomicMorph should return to its caller. -type AtomicMorpherUint32 func(startVal uint32) (val uint32, morphResult interface{}) - -// AtomicMorph atomically morphs target in to new value (and result) as indicated bythe AtomicMorpher callback function. -func AtomicMorphUint32(target *uint32, morpher AtomicMorpherUint32) interface{} { - if target == nil || morpher == nil { - panic("target and morpher mut not be nil") - } - for { - currentVal := atomic.LoadUint32(target) - desiredVal, morphResult := morpher(currentVal) - if atomic.CompareAndSwapUint32(target, currentVal, desiredVal) { - return morphResult - } - } -} - -// AtomicMorpherUint64 identifies a method passed to and invoked by the AtomicMorphUint64 function. -// The AtomicMorpher callback is passed a startValue and based on this value it returns -// what the new value should be and the result that AtomicMorph should return to its caller. -type AtomicMorpherInt64 func(startVal int64) (val int64, morphResult interface{}) - -// AtomicMorph atomically morphs target in to new value (and result) as indicated bythe AtomicMorpher callback function. -func AtomicMorphInt64(target *int64, morpher AtomicMorpherInt64) interface{} { - if target == nil || morpher == nil { - panic("target and morpher mut not be nil") - } - for { - currentVal := atomic.LoadInt64(target) - desiredVal, morphResult := morpher(currentVal) - if atomic.CompareAndSwapInt64(target, currentVal, desiredVal) { - return morphResult - } - } -} - -// AtomicMorpherUint64 identifies a method passed to and invoked by the AtomicMorphUint64 function. -// The AtomicMorpher callback is passed a startValue and based on this value it returns -// what the new value should be and the result that AtomicMorph should return to its caller. -type AtomicMorpherUint64 func(startVal uint64) (val uint64, morphResult interface{}) - -// AtomicMorph atomically morphs target in to new value (and result) as indicated bythe AtomicMorpher callback function. -func AtomicMorphUint64(target *uint64, morpher AtomicMorpherUint64) interface{} { - if target == nil || morpher == nil { - panic("target and morpher mut not be nil") - } - for { - currentVal := atomic.LoadUint64(target) - desiredVal, morphResult := morpher(currentVal) - if atomic.CompareAndSwapUint64(target, currentVal, desiredVal) { - return morphResult - } - } -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/highlevel.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/highlevel.go deleted file mode 100644 index aa022826bb18..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/highlevel.go +++ /dev/null @@ -1,510 +0,0 @@ -package azblob - -import ( - "context" - "encoding/base64" - "fmt" - "io" - "net/http" - - "bytes" - "os" - "sync" - "time" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -// CommonResponseHeaders returns the headers common to all blob REST API responses. -type CommonResponse interface { - // ETag returns the value for header ETag. - ETag() ETag - - // LastModified returns the value for header Last-Modified. - LastModified() time.Time - - // RequestID returns the value for header x-ms-request-id. - RequestID() string - - // Date returns the value for header Date. - Date() time.Time - - // Version returns the value for header x-ms-version. - Version() string - - // Response returns the raw HTTP response object. - Response() *http.Response -} - -// UploadToBlockBlobOptions identifies options used by the UploadBufferToBlockBlob and UploadFileToBlockBlob functions. -type UploadToBlockBlobOptions struct { - // BlockSize specifies the block size to use; the default (and maximum size) is BlockBlobMaxStageBlockBytes. - BlockSize int64 - - // Progress is a function that is invoked periodically as bytes are sent to the BlockBlobURL. - Progress pipeline.ProgressReceiver - - // BlobHTTPHeaders indicates the HTTP headers to be associated with the blob. - BlobHTTPHeaders BlobHTTPHeaders - - // Metadata indicates the metadata to be associated with the blob when PutBlockList is called. - Metadata Metadata - - // AccessConditions indicates the access conditions for the block blob. - AccessConditions BlobAccessConditions - - // Parallelism indicates the maximum number of blocks to upload in parallel (0=default) - Parallelism uint16 -} - -// UploadBufferToBlockBlob uploads a buffer in blocks to a block blob. -func UploadBufferToBlockBlob(ctx context.Context, b []byte, - blockBlobURL BlockBlobURL, o UploadToBlockBlobOptions) (CommonResponse, error) { - - // Validate parameters and set defaults - if o.BlockSize < 0 || o.BlockSize > BlockBlobMaxUploadBlobBytes { - panic(fmt.Sprintf("BlockSize option must be > 0 and <= %d", BlockBlobMaxUploadBlobBytes)) - } - if o.BlockSize == 0 { - o.BlockSize = BlockBlobMaxUploadBlobBytes // Default if unspecified - } - size := int64(len(b)) - - if size <= BlockBlobMaxUploadBlobBytes { - // If the size can fit in 1 Upload call, do it this way - var body io.ReadSeeker = bytes.NewReader(b) - if o.Progress != nil { - body = pipeline.NewRequestBodyProgress(body, o.Progress) - } - return blockBlobURL.Upload(ctx, body, o.BlobHTTPHeaders, o.Metadata, o.AccessConditions) - } - - var numBlocks = uint16(((size - 1) / o.BlockSize) + 1) - if numBlocks > BlockBlobMaxBlocks { - panic(fmt.Sprintf("The buffer's size is too big or the BlockSize is too small; the number of blocks must be <= %d", BlockBlobMaxBlocks)) - } - - blockIDList := make([]string, numBlocks) // Base-64 encoded block IDs - progress := int64(0) - progressLock := &sync.Mutex{} - - err := doBatchTransfer(ctx, batchTransferOptions{ - operationName: "UploadBufferToBlockBlob", - transferSize: size, - chunkSize: o.BlockSize, - parallelism: o.Parallelism, - operation: func(offset int64, count int64) error { - // This function is called once per block. - // It is passed this block's offset within the buffer and its count of bytes - // Prepare to read the proper block/section of the buffer - var body io.ReadSeeker = bytes.NewReader(b[offset : offset+count]) - blockNum := offset / o.BlockSize - if o.Progress != nil { - blockProgress := int64(0) - body = pipeline.NewRequestBodyProgress(body, - func(bytesTransferred int64) { - diff := bytesTransferred - blockProgress - blockProgress = bytesTransferred - progressLock.Lock() // 1 goroutine at a time gets a progress report - progress += diff - o.Progress(progress) - progressLock.Unlock() - }) - } - - // Block IDs are unique values to avoid issue if 2+ clients are uploading blocks - // at the same time causing PutBlockList to get a mix of blocks from all the clients. - blockIDList[blockNum] = base64.StdEncoding.EncodeToString(newUUID().bytes()) - _, err := blockBlobURL.StageBlock(ctx, blockIDList[blockNum], body, o.AccessConditions.LeaseAccessConditions) - return err - }, - }) - if err != nil { - return nil, err - } - // All put blocks were successful, call Put Block List to finalize the blob - return blockBlobURL.CommitBlockList(ctx, blockIDList, o.BlobHTTPHeaders, o.Metadata, o.AccessConditions) -} - -// UploadFileToBlockBlob uploads a file in blocks to a block blob. -func UploadFileToBlockBlob(ctx context.Context, file *os.File, - blockBlobURL BlockBlobURL, o UploadToBlockBlobOptions) (CommonResponse, error) { - - stat, err := file.Stat() - if err != nil { - return nil, err - } - m := mmf{} // Default to an empty slice; used for 0-size file - if stat.Size() != 0 { - m, err = newMMF(file, false, 0, int(stat.Size())) - if err != nil { - return nil, err - } - defer m.unmap() - } - return UploadBufferToBlockBlob(ctx, m, blockBlobURL, o) -} - -/////////////////////////////////////////////////////////////////////////////// - - -const BlobDefaultDownloadBlockSize = int64(4 * 1024 * 1024) // 4MB - -// DownloadFromAzureFileOptions identifies options used by the DownloadAzureFileToBuffer and DownloadAzureFileToFile functions. -type DownloadFromBlobOptions struct { - // BlockSize specifies the block size to use for each parallel download; the default size is BlobDefaultDownloadBlockSize. - BlockSize int64 - - // Progress is a function that is invoked periodically as bytes are received. - Progress pipeline.ProgressReceiver - - // AccessConditions indicates the access conditions used when making HTTP GET requests against the blob. - AccessConditions BlobAccessConditions - - // Parallelism indicates the maximum number of blocks to download in parallel (0=default) - Parallelism uint16 - - // RetryReaderOptionsPerBlock is used when downloading each block. - RetryReaderOptionsPerBlock RetryReaderOptions -} - -// downloadAzureFileToBuffer downloads an Azure file to a buffer with parallel. -func downloadBlobToBuffer(ctx context.Context, blobURL BlobURL, offset int64, count int64, - ac BlobAccessConditions, b []byte, o DownloadFromBlobOptions, - initialDownloadResponse *DownloadResponse) error { - // Validate parameters, and set defaults. - if o.BlockSize < 0 { - panic("BlockSize option must be >= 0") - } - if o.BlockSize == 0 { - o.BlockSize = BlobDefaultDownloadBlockSize - } - - if offset < 0 { - panic("offset option must be >= 0") - } - - if count < 0 { - panic("count option must be >= 0") - } - - if count == CountToEnd { // If size not specified, calculate it - if initialDownloadResponse != nil { - count = initialDownloadResponse.ContentLength() - offset // if we have the length, use it - } else { - // If we don't have the length at all, get it - dr, err := blobURL.Download(ctx, 0, CountToEnd, ac, false) - if err != nil { - return err - } - count = dr.ContentLength() - offset - } - } - - if int64(len(b)) < count { - panic(fmt.Errorf("the buffer's size should be equal to or larger than the request count of bytes: %d", count)) - } - - // Prepare and do parallel download. - progress := int64(0) - progressLock := &sync.Mutex{} - - err := doBatchTransfer(ctx, batchTransferOptions{ - operationName: "downloadBlobToBuffer", - transferSize: count, - chunkSize: o.BlockSize, - parallelism: o.Parallelism, - operation: func(chunkStart int64, count int64) error { - dr, err := blobURL.Download(ctx, chunkStart+ offset, count, ac, false) - body := dr.Body(o.RetryReaderOptionsPerBlock) - if o.Progress != nil { - rangeProgress := int64(0) - body = pipeline.NewResponseBodyProgress( - body, - func(bytesTransferred int64) { - diff := bytesTransferred - rangeProgress - rangeProgress = bytesTransferred - progressLock.Lock() - progress += diff - o.Progress(progress) - progressLock.Unlock() - }) - } - _, err = io.ReadFull(body, b[chunkStart:chunkStart+count]) - body.Close() - return err - }, - }) - if err != nil { - return err - } - return nil -} - -// DownloadAzureFileToBuffer downloads an Azure file to a buffer with parallel. -// Offset and count are optional, pass 0 for both to download the entire blob. -func DownloadBlobToBuffer(ctx context.Context, blobURL BlobURL, offset int64, count int64, - ac BlobAccessConditions, b []byte, o DownloadFromBlobOptions) error { - return downloadBlobToBuffer(ctx, blobURL, offset, count, ac, b, o, nil) -} - -// DownloadBlobToFile downloads an Azure file to a local file. -// The file would be truncated if the size doesn't match. -// Offset and count are optional, pass 0 for both to download the entire blob. -func DownloadBlobToFile(ctx context.Context, blobURL BlobURL, offset int64, count int64, - ac BlobAccessConditions, file *os.File, o DownloadFromBlobOptions) error { - // 1. Validate parameters. - if file == nil { - panic("file must not be nil") - } - - // 2. Calculate the size of the destination file - var size int64 - - if count == CountToEnd { - // Try to get Azure file's size - props, err := blobURL.GetProperties(ctx, ac) - if err != nil { - return err - } - size = props.ContentLength() - offset - } else { - size = count - } - - // 3. Compare and try to resize local file's size if it doesn't match Azure file's size. - stat, err := file.Stat() - if err != nil { - return err - } - if stat.Size() != size { - if err = file.Truncate(size); err != nil { - return err - } - } - - if size > 0 { - // 4. Set mmap and call DownloadAzureFileToBuffer. - m, err := newMMF(file, true, 0, int(size)) - if err != nil { - return err - } - defer m.unmap() - return downloadBlobToBuffer(ctx, blobURL, offset, size, ac, m, o, nil) - } else { // if the blob's size is 0, there is no need in downloading it - return nil - } -} - - -/////////////////////////////////////////////////////////////////////////////// - -// BatchTransferOptions identifies options used by doBatchTransfer. -type batchTransferOptions struct { - transferSize int64 - chunkSize int64 - parallelism uint16 - operation func(offset int64, chunkSize int64) error - operationName string -} - -// doBatchTransfer helps to execute operations in a batch manner. -func doBatchTransfer(ctx context.Context, o batchTransferOptions) error { - // Prepare and do parallel operations. - numChunks := uint16(((o.transferSize - 1) / o.chunkSize) + 1) - operationChannel := make(chan func() error, o.parallelism) // Create the channel that release 'parallelism' goroutines concurrently - operationResponseChannel := make(chan error, numChunks) // Holds each response - ctx, cancel := context.WithCancel(ctx) - defer cancel() - - // Create the goroutines that process each operation (in parallel). - if o.parallelism == 0 { - o.parallelism = 5 // default parallelism - } - for g := uint16(0); g < o.parallelism; g++ { - //grIndex := g - go func() { - for f := range operationChannel { - //fmt.Printf("[%s] gr-%d start action\n", o.operationName, grIndex) - err := f() - operationResponseChannel <- err - //fmt.Printf("[%s] gr-%d end action\n", o.operationName, grIndex) - } - }() - } - - // Add each chunk's operation to the channel. - for chunkNum := uint16(0); chunkNum < numChunks; chunkNum++ { - curChunkSize := o.chunkSize - - if chunkNum == numChunks-1 { // Last chunk - curChunkSize = o.transferSize - (int64(chunkNum) * o.chunkSize) // Remove size of all transferred chunks from total - } - offset := int64(chunkNum) * o.chunkSize - - operationChannel <- func() error { - return o.operation(offset, curChunkSize) - } - } - close(operationChannel) - - // Wait for the operations to complete. - for chunkNum := uint16(0); chunkNum < numChunks; chunkNum++ { - responseError := <-operationResponseChannel - if responseError != nil { - cancel() // As soon as any operation fails, cancel all remaining operation calls - return responseError // No need to process anymore responses - } - } - return nil -} - -//////////////////////////////////////////////////////////////////////////////////////////////// - -type UploadStreamToBlockBlobOptions struct { - BufferSize int - MaxBuffers int - BlobHTTPHeaders BlobHTTPHeaders - Metadata Metadata - AccessConditions BlobAccessConditions -} - -func UploadStreamToBlockBlob(ctx context.Context, reader io.Reader, blockBlobURL BlockBlobURL, - o UploadStreamToBlockBlobOptions) (CommonResponse, error) { - result, err := uploadStream(ctx, reader, - UploadStreamOptions{BufferSize: o.BufferSize, MaxBuffers: o.MaxBuffers}, - &uploadStreamToBlockBlobOptions{b: blockBlobURL, o: o, blockIDPrefix: newUUID()}) - return result.(CommonResponse), err -} - -type uploadStreamToBlockBlobOptions struct { - b BlockBlobURL - o UploadStreamToBlockBlobOptions - blockIDPrefix uuid // UUID used with all blockIDs - maxBlockNum uint32 // defaults to 0 - firstBlock []byte // Used only if maxBlockNum is 0 -} - -func (t *uploadStreamToBlockBlobOptions) start(ctx context.Context) (interface{}, error) { - return nil, nil -} - -func (t *uploadStreamToBlockBlobOptions) chunk(ctx context.Context, num uint32, buffer []byte) error { - if num == 0 && len(buffer) < t.o.BufferSize { - // If whole payload fits in 1 block, don't stage it; End will upload it with 1 I/O operation - t.firstBlock = buffer - return nil - } - // Else, upload a staged block... - AtomicMorphUint32(&t.maxBlockNum, func(startVal uint32) (val uint32, morphResult interface{}) { - // Atomically remember (in t.numBlocks) the maximum block num we've ever seen - if startVal < num { - return num, nil - } - return startVal, nil - }) - blockID := newUuidBlockID(t.blockIDPrefix).WithBlockNumber(num).ToBase64() - _, err := t.b.StageBlock(ctx, blockID, bytes.NewReader(buffer), LeaseAccessConditions{}) - return err -} - -func (t *uploadStreamToBlockBlobOptions) end(ctx context.Context) (interface{}, error) { - if t.maxBlockNum == 0 { - // If whole payload fits in 1 block (block #0), upload it with 1 I/O operation - return t.b.Upload(ctx, bytes.NewReader(t.firstBlock), - t.o.BlobHTTPHeaders, t.o.Metadata, t.o.AccessConditions) - } - // Multiple blocks staged, commit them all now - blockID := newUuidBlockID(t.blockIDPrefix) - blockIDs := make([]string, t.maxBlockNum + 1) - for bn := uint32(0); bn <= t.maxBlockNum; bn++ { - blockIDs[bn] = blockID.WithBlockNumber(bn).ToBase64() - } - return t.b.CommitBlockList(ctx, blockIDs, t.o.BlobHTTPHeaders, t.o.Metadata, t.o.AccessConditions) -} - -//////////////////////////////////////////////////////////////////////////////////////////////////// - -type iTransfer interface { - start(ctx context.Context) (interface{}, error) - chunk(ctx context.Context, num uint32, buffer []byte) error - end(ctx context.Context) (interface{}, error) -} - -type UploadStreamOptions struct { - MaxBuffers int - BufferSize int -} - -func uploadStream(ctx context.Context, reader io.Reader, o UploadStreamOptions, t iTransfer) (interface{}, error) { - ctx, cancel := context.WithCancel(ctx) // New context so that any failure cancels everything - defer cancel() - wg := sync.WaitGroup{} // Used to know when all outgoing messages have finished processing - type OutgoingMsg struct { - chunkNum uint32 - buffer []byte - } - - // Create a channel to hold the buffers usable for incoming datsa - incoming := make(chan []byte, o.MaxBuffers) - outgoing := make(chan OutgoingMsg, o.MaxBuffers) // Channel holding outgoing buffers - if result, err := t.start(ctx); err != nil { - return result, err - } - - numBuffers := 0 // The number of buffers & out going goroutines created so far - injectBuffer := func() { - // For each Buffer, create it and a goroutine to upload it - incoming <- make([]byte, o.BufferSize) // Add the new buffer to the incoming channel so this goroutine can from the reader into it - numBuffers++ - go func() { - for outgoingMsg := range outgoing { - // Upload the outgoing buffer - err := t.chunk(ctx, outgoingMsg.chunkNum, outgoingMsg.buffer) - wg.Done() // Indicate this buffer was sent - if nil != err { - cancel() - } - incoming <- outgoingMsg.buffer // The goroutine reading from the stream can use reuse this buffer now - } - }() - } - injectBuffer() // Create our 1st buffer & outgoing goroutine - - // This goroutine grabs a buffer, reads from the stream into the buffer, - // and inserts the buffer into the outgoing channel to be uploaded - for c := uint32(0); true; c++ { // Iterate once per chunk - var buffer []byte - if numBuffers < o.MaxBuffers { - select { - // We're not at max buffers, see if a previously-created buffer is available - case buffer = <-incoming: - break - default: - // No buffer available; inject a new buffer & go routine to process it - injectBuffer() - buffer = <-incoming // Grab the just-injected buffer - } - } else { - // We are at max buffers, block until we get to reuse one - buffer = <-incoming - } - n, err := io.ReadFull(reader, buffer) - if err != nil { - buffer = buffer[:n] // Make slice match the # of read bytes - } - if len(buffer) > 0 { - // Buffer not empty, upload it - wg.Add(1) // We're posting a buffer to be sent - outgoing <- OutgoingMsg{chunkNum: c, buffer: buffer} - } - if err != nil { // The reader is done, no more outgoing buffers - break - } - } - // NOTE: Don't close the incoming channel because the outgoing goroutines post buffers into it when they are done - close(outgoing) // Make all the outgoing goroutines terminate when this channel is empty - wg.Wait() // Wait for all pending outgoing messages to complete - // After all blocks uploaded, commit them to the blob & return the result - return t.end(ctx) -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/parsing_urls.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/parsing_urls.go deleted file mode 100644 index e797a59c0b97..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/parsing_urls.go +++ /dev/null @@ -1,111 +0,0 @@ -package azblob - -import ( - "net/url" - "strings" -) - -const ( - snapshot = "snapshot" - SnapshotTimeFormat = "2006-01-02T15:04:05.0000000Z07:00" -) - -// A BlobURLParts object represents the components that make up an Azure Storage Container/Blob URL. You parse an -// existing URL into its parts by calling NewBlobURLParts(). You construct a URL from parts by calling URL(). -// NOTE: Changing any SAS-related field requires computing a new SAS signature. -type BlobURLParts struct { - Scheme string // Ex: "https://" - Host string // Ex: "account.blob.core.windows.net" - ContainerName string // "" if no container - BlobName string // "" if no blob - Snapshot string // "" if not a snapshot - SAS SASQueryParameters - UnparsedParams string -} - -// NewBlobURLParts parses a URL initializing BlobURLParts' fields including any SAS-related & snapshot query parameters. Any other -// query parameters remain in the UnparsedParams field. This method overwrites all fields in the BlobURLParts object. -func NewBlobURLParts(u url.URL) BlobURLParts { - up := BlobURLParts{ - Scheme: u.Scheme, - Host: u.Host, - } - - // Find the container & blob names (if any) - if u.Path != "" { - path := u.Path - if path[0] == '/' { - path = path[1:] // If path starts with a slash, remove it - } - - // Find the next slash (if it exists) - containerEndIndex := strings.Index(path, "/") - if containerEndIndex == -1 { // Slash not found; path has container name & no blob name - up.ContainerName = path - } else { - up.ContainerName = path[:containerEndIndex] // The container name is the part between the slashes - up.BlobName = path[containerEndIndex+1:] // The blob name is after the container slash - } - } - - // Convert the query parameters to a case-sensitive map & trim whitespace - paramsMap := u.Query() - - up.Snapshot = "" // Assume no snapshot - if snapshotStr, ok := caseInsensitiveValues(paramsMap).Get(snapshot); ok { - up.Snapshot = snapshotStr[0] - // If we recognized the query parameter, remove it from the map - delete(paramsMap, snapshot) - } - up.SAS = newSASQueryParameters(paramsMap, true) - up.UnparsedParams = paramsMap.Encode() - return up -} - -type caseInsensitiveValues url.Values // map[string][]string -func (values caseInsensitiveValues) Get(key string) ([]string, bool) { - key = strings.ToLower(key) - for k, v := range values { - if strings.ToLower(k) == key { - return v, true - } - } - return []string{}, false -} - -// URL returns a URL object whose fields are initialized from the BlobURLParts fields. The URL's RawQuery -// field contains the SAS, snapshot, and unparsed query parameters. -func (up BlobURLParts) URL() url.URL { - path := "" - // Concatenate container & blob names (if they exist) - if up.ContainerName != "" { - path += "/" + up.ContainerName - if up.BlobName != "" { - path += "/" + up.BlobName - } - } - - rawQuery := up.UnparsedParams - - // Concatenate blob snapshot query parameter (if it exists) - if up.Snapshot != "" { - if len(rawQuery) > 0 { - rawQuery += "&" - } - rawQuery += snapshot + "=" + up.Snapshot - } - sas := up.SAS.Encode() - if sas != "" { - if len(rawQuery) > 0 { - rawQuery += "&" - } - rawQuery += sas - } - u := url.URL{ - Scheme: up.Scheme, - Host: up.Host, - Path: path, - RawQuery: rawQuery, - } - return u -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/sas_service.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/sas_service.go deleted file mode 100644 index d0b12bc17a89..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/sas_service.go +++ /dev/null @@ -1,206 +0,0 @@ -package azblob - -import ( - "bytes" - "fmt" - "strings" - "time" -) - -// BlobSASSignatureValues is used to generate a Shared Access Signature (SAS) for an Azure Storage container or blob. -type BlobSASSignatureValues struct { - Version string `param:"sv"` // If not specified, this defaults to SASVersion - Protocol SASProtocol `param:"spr"` // See the SASProtocol* constants - StartTime time.Time `param:"st"` // Not specified if IsZero - ExpiryTime time.Time `param:"se"` // Not specified if IsZero - Permissions string `param:"sp"` // Create by initializing a ContainerSASPermissions or BlobSASPermissions and then call String() - IPRange IPRange `param:"sip"` - Identifier string `param:"si"` - ContainerName string - BlobName string // Use "" to create a Container SAS - CacheControl string // rscc - ContentDisposition string // rscd - ContentEncoding string // rsce - ContentLanguage string // rscl - ContentType string // rsct -} - -// NewSASQueryParameters uses an account's shared key credential to sign this signature values to produce -// the proper SAS query parameters. -func (v BlobSASSignatureValues) NewSASQueryParameters(sharedKeyCredential *SharedKeyCredential) SASQueryParameters { - if sharedKeyCredential == nil { - panic("sharedKeyCredential can't be nil") - } - - resource := "c" - if v.BlobName == "" { - // Make sure the permission characters are in the correct order - perms := &ContainerSASPermissions{} - if err := perms.Parse(v.Permissions); err != nil { - panic(err) - } - v.Permissions = perms.String() - } else { - resource = "b" - // Make sure the permission characters are in the correct order - perms := &BlobSASPermissions{} - if err := perms.Parse(v.Permissions); err != nil { - panic(err) - } - v.Permissions = perms.String() - } - if v.Version == "" { - v.Version = SASVersion - } - startTime, expiryTime := FormatTimesForSASSigning(v.StartTime, v.ExpiryTime) - - // String to sign: http://msdn.microsoft.com/en-us/library/azure/dn140255.aspx - stringToSign := strings.Join([]string{ - v.Permissions, - startTime, - expiryTime, - getCanonicalName(sharedKeyCredential.AccountName(), v.ContainerName, v.BlobName), - v.Identifier, - v.IPRange.String(), - string(v.Protocol), - v.Version, - v.CacheControl, // rscc - v.ContentDisposition, // rscd - v.ContentEncoding, // rsce - v.ContentLanguage, // rscl - v.ContentType}, // rsct - "\n") - signature := sharedKeyCredential.ComputeHMACSHA256(stringToSign) - - p := SASQueryParameters{ - // Common SAS parameters - version: v.Version, - protocol: v.Protocol, - startTime: v.StartTime, - expiryTime: v.ExpiryTime, - permissions: v.Permissions, - ipRange: v.IPRange, - - // Container/Blob-specific SAS parameters - resource: resource, - identifier: v.Identifier, - - // Calculated SAS signature - signature: signature, - } - return p -} - -// getCanonicalName computes the canonical name for a container or blob resource for SAS signing. -func getCanonicalName(account string, containerName string, blobName string) string { - // Container: "/blob/account/containername" - // Blob: "/blob/account/containername/blobname" - elements := []string{"/blob/", account, "/", containerName} - if blobName != "" { - elements = append(elements, "/", strings.Replace(blobName, "\\", "/", -1)) - } - return strings.Join(elements, "") -} - -// The ContainerSASPermissions type simplifies creating the permissions string for an Azure Storage container SAS. -// Initialize an instance of this type and then call its String method to set BlobSASSignatureValues's Permissions field. -type ContainerSASPermissions struct { - Read, Add, Create, Write, Delete, List bool -} - -// String produces the SAS permissions string for an Azure Storage container. -// Call this method to set BlobSASSignatureValues's Permissions field. -func (p ContainerSASPermissions) String() string { - var b bytes.Buffer - if p.Read { - b.WriteRune('r') - } - if p.Add { - b.WriteRune('a') - } - if p.Create { - b.WriteRune('c') - } - if p.Write { - b.WriteRune('w') - } - if p.Delete { - b.WriteRune('d') - } - if p.List { - b.WriteRune('l') - } - return b.String() -} - -// Parse initializes the ContainerSASPermissions's fields from a string. -func (p *ContainerSASPermissions) Parse(s string) error { - *p = ContainerSASPermissions{} // Clear the flags - for _, r := range s { - switch r { - case 'r': - p.Read = true - case 'a': - p.Add = true - case 'c': - p.Create = true - case 'w': - p.Write = true - case 'd': - p.Delete = true - case 'l': - p.List = true - default: - return fmt.Errorf("Invalid permission: '%v'", r) - } - } - return nil -} - -// The BlobSASPermissions type simplifies creating the permissions string for an Azure Storage blob SAS. -// Initialize an instance of this type and then call its String method to set BlobSASSignatureValues's Permissions field. -type BlobSASPermissions struct{ Read, Add, Create, Write, Delete bool } - -// String produces the SAS permissions string for an Azure Storage blob. -// Call this method to set BlobSASSignatureValues's Permissions field. -func (p BlobSASPermissions) String() string { - var b bytes.Buffer - if p.Read { - b.WriteRune('r') - } - if p.Add { - b.WriteRune('a') - } - if p.Create { - b.WriteRune('c') - } - if p.Write { - b.WriteRune('w') - } - if p.Delete { - b.WriteRune('d') - } - return b.String() -} - -// Parse initializes the BlobSASPermissions's fields from a string. -func (p *BlobSASPermissions) Parse(s string) error { - *p = BlobSASPermissions{} // Clear the flags - for _, r := range s { - switch r { - case 'r': - p.Read = true - case 'a': - p.Add = true - case 'c': - p.Create = true - case 'w': - p.Write = true - case 'd': - p.Delete = true - default: - return fmt.Errorf("Invalid permission: '%v'", r) - } - } - return nil -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/service_codes_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/service_codes_blob.go deleted file mode 100644 index d260f8aee5cd..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/service_codes_blob.go +++ /dev/null @@ -1,195 +0,0 @@ -package azblob - -// https://docs.microsoft.com/en-us/rest/api/storageservices/blob-service-error-codes - -// ServiceCode values indicate a service failure. -const ( - // ServiceCodeAppendPositionConditionNotMet means the append position condition specified was not met. - ServiceCodeAppendPositionConditionNotMet ServiceCodeType = "AppendPositionConditionNotMet" - - // ServiceCodeBlobAlreadyExists means the specified blob already exists. - ServiceCodeBlobAlreadyExists ServiceCodeType = "BlobAlreadyExists" - - // ServiceCodeBlobNotFound means the specified blob does not exist. - ServiceCodeBlobNotFound ServiceCodeType = "BlobNotFound" - - // ServiceCodeBlobOverwritten means the blob has been recreated since the previous snapshot was taken. - ServiceCodeBlobOverwritten ServiceCodeType = "BlobOverwritten" - - // ServiceCodeBlobTierInadequateForContentLength means the specified blob tier size limit cannot be less than content length. - ServiceCodeBlobTierInadequateForContentLength ServiceCodeType = "BlobTierInadequateForContentLength" - - // ServiceCodeBlockCountExceedsLimit means the committed block count cannot exceed the maximum limit of 50,000 blocks - // or that the uncommitted block count cannot exceed the maximum limit of 100,000 blocks. - ServiceCodeBlockCountExceedsLimit ServiceCodeType = "BlockCountExceedsLimit" - - // ServiceCodeBlockListTooLong means the block list may not contain more than 50,000 blocks. - ServiceCodeBlockListTooLong ServiceCodeType = "BlockListTooLong" - - // ServiceCodeCannotChangeToLowerTier means that a higher blob tier has already been explicitly set. - ServiceCodeCannotChangeToLowerTier ServiceCodeType = "CannotChangeToLowerTier" - - // ServiceCodeCannotVerifyCopySource means that the service could not verify the copy source within the specified time. - // Examine the HTTP status code and message for more information about the failure. - ServiceCodeCannotVerifyCopySource ServiceCodeType = "CannotVerifyCopySource" - - // ServiceCodeContainerAlreadyExists means the specified container already exists. - ServiceCodeContainerAlreadyExists ServiceCodeType = "ContainerAlreadyExists" - - // ServiceCodeContainerBeingDeleted means the specified container is being deleted. - ServiceCodeContainerBeingDeleted ServiceCodeType = "ContainerBeingDeleted" - - // ServiceCodeContainerDisabled means the specified container has been disabled by the administrator. - ServiceCodeContainerDisabled ServiceCodeType = "ContainerDisabled" - - // ServiceCodeContainerNotFound means the specified container does not exist. - ServiceCodeContainerNotFound ServiceCodeType = "ContainerNotFound" - - // ServiceCodeContentLengthLargerThanTierLimit means the blob's content length cannot exceed its tier limit. - ServiceCodeContentLengthLargerThanTierLimit ServiceCodeType = "ContentLengthLargerThanTierLimit" - - // ServiceCodeCopyAcrossAccountsNotSupported means the copy source account and destination account must be the same. - ServiceCodeCopyAcrossAccountsNotSupported ServiceCodeType = "CopyAcrossAccountsNotSupported" - - // ServiceCodeCopyIDMismatch means the specified copy ID did not match the copy ID for the pending copy operation. - ServiceCodeCopyIDMismatch ServiceCodeType = "CopyIdMismatch" - - // ServiceCodeFeatureVersionMismatch means the type of blob in the container is unrecognized by this version or - // that the operation for AppendBlob requires at least version 2015-02-21. - ServiceCodeFeatureVersionMismatch ServiceCodeType = "FeatureVersionMismatch" - - // ServiceCodeIncrementalCopyBlobMismatch means the specified source blob is different than the copy source of the existing incremental copy blob. - ServiceCodeIncrementalCopyBlobMismatch ServiceCodeType = "IncrementalCopyBlobMismatch" - - // ServiceCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed means the specified snapshot is earlier than the last snapshot copied into the incremental copy blob. - ServiceCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed ServiceCodeType = "IncrementalCopyOfEralierVersionSnapshotNotAllowed" - - // ServiceCodeIncrementalCopySourceMustBeSnapshot means the source for incremental copy request must be a snapshot. - ServiceCodeIncrementalCopySourceMustBeSnapshot ServiceCodeType = "IncrementalCopySourceMustBeSnapshot" - - // ServiceCodeInfiniteLeaseDurationRequired means the lease ID matched, but the specified lease must be an infinite-duration lease. - ServiceCodeInfiniteLeaseDurationRequired ServiceCodeType = "InfiniteLeaseDurationRequired" - - // ServiceCodeInvalidBlobOrBlock means the specified blob or block content is invalid. - ServiceCodeInvalidBlobOrBlock ServiceCodeType = "InvalidBlobOrBlock" - - // ServiceCodeInvalidBlobType means the blob type is invalid for this operation. - ServiceCodeInvalidBlobType ServiceCodeType = "InvalidBlobType" - - // ServiceCodeInvalidBlockID means the specified block ID is invalid. The block ID must be Base64-encoded. - ServiceCodeInvalidBlockID ServiceCodeType = "InvalidBlockId" - - // ServiceCodeInvalidBlockList means the specified block list is invalid. - ServiceCodeInvalidBlockList ServiceCodeType = "InvalidBlockList" - - // ServiceCodeInvalidOperation means an invalid operation against a blob snapshot. - ServiceCodeInvalidOperation ServiceCodeType = "InvalidOperation" - - // ServiceCodeInvalidPageRange means the page range specified is invalid. - ServiceCodeInvalidPageRange ServiceCodeType = "InvalidPageRange" - - // ServiceCodeInvalidSourceBlobType means the copy source blob type is invalid for this operation. - ServiceCodeInvalidSourceBlobType ServiceCodeType = "InvalidSourceBlobType" - - // ServiceCodeInvalidSourceBlobURL means the source URL for incremental copy request must be valid Azure Storage blob URL. - ServiceCodeInvalidSourceBlobURL ServiceCodeType = "InvalidSourceBlobUrl" - - // ServiceCodeInvalidVersionForPageBlobOperation means that all operations on page blobs require at least version 2009-09-19. - ServiceCodeInvalidVersionForPageBlobOperation ServiceCodeType = "InvalidVersionForPageBlobOperation" - - // ServiceCodeLeaseAlreadyPresent means there is already a lease present. - ServiceCodeLeaseAlreadyPresent ServiceCodeType = "LeaseAlreadyPresent" - - // ServiceCodeLeaseAlreadyBroken means the lease has already been broken and cannot be broken again. - ServiceCodeLeaseAlreadyBroken ServiceCodeType = "LeaseAlreadyBroken" - - // ServiceCodeLeaseIDMismatchWithBlobOperation means the lease ID specified did not match the lease ID for the blob. - ServiceCodeLeaseIDMismatchWithBlobOperation ServiceCodeType = "LeaseIdMismatchWithBlobOperation" - - // ServiceCodeLeaseIDMismatchWithContainerOperation means the lease ID specified did not match the lease ID for the container. - ServiceCodeLeaseIDMismatchWithContainerOperation ServiceCodeType = "LeaseIdMismatchWithContainerOperation" - - // ServiceCodeLeaseIDMismatchWithLeaseOperation means the lease ID specified did not match the lease ID for the blob/container. - ServiceCodeLeaseIDMismatchWithLeaseOperation ServiceCodeType = "LeaseIdMismatchWithLeaseOperation" - - // ServiceCodeLeaseIDMissing means there is currently a lease on the blob/container and no lease ID was specified in the request. - ServiceCodeLeaseIDMissing ServiceCodeType = "LeaseIdMissing" - - // ServiceCodeLeaseIsBreakingAndCannotBeAcquired means the lease ID matched, but the lease is currently in breaking state and cannot be acquired until it is broken. - ServiceCodeLeaseIsBreakingAndCannotBeAcquired ServiceCodeType = "LeaseIsBreakingAndCannotBeAcquired" - - // ServiceCodeLeaseIsBreakingAndCannotBeChanged means the lease ID matched, but the lease is currently in breaking state and cannot be changed. - ServiceCodeLeaseIsBreakingAndCannotBeChanged ServiceCodeType = "LeaseIsBreakingAndCannotBeChanged" - - // ServiceCodeLeaseIsBrokenAndCannotBeRenewed means the lease ID matched, but the lease has been broken explicitly and cannot be renewed. - ServiceCodeLeaseIsBrokenAndCannotBeRenewed ServiceCodeType = "LeaseIsBrokenAndCannotBeRenewed" - - // ServiceCodeLeaseLost means a lease ID was specified, but the lease for the blob/container has expired. - ServiceCodeLeaseLost ServiceCodeType = "LeaseLost" - - // ServiceCodeLeaseNotPresentWithBlobOperation means there is currently no lease on the blob. - ServiceCodeLeaseNotPresentWithBlobOperation ServiceCodeType = "LeaseNotPresentWithBlobOperation" - - // ServiceCodeLeaseNotPresentWithContainerOperation means there is currently no lease on the container. - ServiceCodeLeaseNotPresentWithContainerOperation ServiceCodeType = "LeaseNotPresentWithContainerOperation" - - // ServiceCodeLeaseNotPresentWithLeaseOperation means there is currently no lease on the blob/container. - ServiceCodeLeaseNotPresentWithLeaseOperation ServiceCodeType = "LeaseNotPresentWithLeaseOperation" - - // ServiceCodeMaxBlobSizeConditionNotMet means the max blob size condition specified was not met. - ServiceCodeMaxBlobSizeConditionNotMet ServiceCodeType = "MaxBlobSizeConditionNotMet" - - // ServiceCodeNoPendingCopyOperation means there is currently no pending copy operation. - ServiceCodeNoPendingCopyOperation ServiceCodeType = "NoPendingCopyOperation" - - // ServiceCodeOperationNotAllowedOnIncrementalCopyBlob means the specified operation is not allowed on an incremental copy blob. - ServiceCodeOperationNotAllowedOnIncrementalCopyBlob ServiceCodeType = "OperationNotAllowedOnIncrementalCopyBlob" - - // ServiceCodePendingCopyOperation means there is currently a pending copy operation. - ServiceCodePendingCopyOperation ServiceCodeType = "PendingCopyOperation" - - // ServiceCodePreviousSnapshotCannotBeNewer means the prevsnapshot query parameter value cannot be newer than snapshot query parameter value. - ServiceCodePreviousSnapshotCannotBeNewer ServiceCodeType = "PreviousSnapshotCannotBeNewer" - - // ServiceCodePreviousSnapshotNotFound means the previous snapshot is not found. - ServiceCodePreviousSnapshotNotFound ServiceCodeType = "PreviousSnapshotNotFound" - - // ServiceCodePreviousSnapshotOperationNotSupported means that differential Get Page Ranges is not supported on the previous snapshot. - ServiceCodePreviousSnapshotOperationNotSupported ServiceCodeType = "PreviousSnapshotOperationNotSupported" - - // ServiceCodeSequenceNumberConditionNotMet means the sequence number condition specified was not met. - ServiceCodeSequenceNumberConditionNotMet ServiceCodeType = "SequenceNumberConditionNotMet" - - // ServiceCodeSequenceNumberIncrementTooLarge means the sequence number increment cannot be performed because it would result in overflow of the sequence number. - ServiceCodeSequenceNumberIncrementTooLarge ServiceCodeType = "SequenceNumberIncrementTooLarge" - - // ServiceCodeSnapshotCountExceeded means the snapshot count against this blob has been exceeded. - ServiceCodeSnapshotCountExceeded ServiceCodeType = "SnapshotCountExceeded" - - // ServiceCodeSnaphotOperationRateExceeded means the rate of snapshot operations against this blob has been exceeded. - ServiceCodeSnaphotOperationRateExceeded ServiceCodeType = "SnaphotOperationRateExceeded" - - // ServiceCodeSnapshotsPresent means this operation is not permitted while the blob has snapshots. - ServiceCodeSnapshotsPresent ServiceCodeType = "SnapshotsPresent" - - // ServiceCodeSourceConditionNotMet means the source condition specified using HTTP conditional header(s) is not met. - ServiceCodeSourceConditionNotMet ServiceCodeType = "SourceConditionNotMet" - - // ServiceCodeSystemInUse means this blob is in use by the system. - ServiceCodeSystemInUse ServiceCodeType = "SystemInUse" - - // ServiceCodeTargetConditionNotMet means the target condition specified using HTTP conditional header(s) is not met. - ServiceCodeTargetConditionNotMet ServiceCodeType = "TargetConditionNotMet" - - // ServiceCodeUnauthorizedBlobOverwrite means this request is not authorized to perform blob overwrites. - ServiceCodeUnauthorizedBlobOverwrite ServiceCodeType = "UnauthorizedBlobOverwrite" - - // ServiceCodeBlobBeingRehydrated means this operation is not permitted because the blob is being rehydrated. - ServiceCodeBlobBeingRehydrated ServiceCodeType = "BlobBeingRehydrated" - - // ServiceCodeBlobArchived means this operation is not permitted on an archived blob. - ServiceCodeBlobArchived ServiceCodeType = "BlobArchived" - - // ServiceCodeBlobNotArchived means this blob is currently not in the archived state. - ServiceCodeBlobNotArchived ServiceCodeType = "BlobNotArchived" -) diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_append_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_append_blob.go deleted file mode 100644 index b8711f5a1c43..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_append_blob.go +++ /dev/null @@ -1,112 +0,0 @@ -package azblob - -import ( - "context" - "io" - "net/url" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -const ( - // AppendBlobMaxAppendBlockBytes indicates the maximum number of bytes that can be sent in a call to AppendBlock. - AppendBlobMaxAppendBlockBytes = 4 * 1024 * 1024 // 4MB - - // AppendBlobMaxBlocks indicates the maximum number of blocks allowed in an append blob. - AppendBlobMaxBlocks = 50000 -) - -// AppendBlobURL defines a set of operations applicable to append blobs. -type AppendBlobURL struct { - BlobURL - abClient appendBlobClient -} - -// NewAppendBlobURL creates an AppendBlobURL object using the specified URL and request policy pipeline. -func NewAppendBlobURL(url url.URL, p pipeline.Pipeline) AppendBlobURL { - blobClient := newBlobClient(url, p) - abClient := newAppendBlobClient(url, p) - return AppendBlobURL{BlobURL: BlobURL{blobClient: blobClient}, abClient: abClient} -} - -// WithPipeline creates a new AppendBlobURL object identical to the source but with the specific request policy pipeline. -func (ab AppendBlobURL) WithPipeline(p pipeline.Pipeline) AppendBlobURL { - return NewAppendBlobURL(ab.blobClient.URL(), p) -} - -// WithSnapshot creates a new AppendBlobURL object identical to the source but with the specified snapshot timestamp. -// Pass "" to remove the snapshot returning a URL to the base blob. -func (ab AppendBlobURL) WithSnapshot(snapshot string) AppendBlobURL { - p := NewBlobURLParts(ab.URL()) - p.Snapshot = snapshot - return NewAppendBlobURL(p.URL(), ab.blobClient.Pipeline()) -} - -// Create creates a 0-length append blob. Call AppendBlock to append data to an append blob. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob. -func (ab AppendBlobURL) Create(ctx context.Context, h BlobHTTPHeaders, metadata Metadata, ac BlobAccessConditions) (*AppendBlobCreateResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch := ac.HTTPAccessConditions.pointers() - return ab.abClient.Create(ctx, 0, nil, - &h.ContentType, &h.ContentEncoding, &h.ContentLanguage, h.ContentMD5, - &h.CacheControl, metadata, ac.LeaseAccessConditions.pointers(), &h.ContentDisposition, - ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, nil) -} - -// AppendBlock writes a stream to a new block of data to the end of the existing append blob. -// This method panics if the stream is not at position 0. -// Note that the http client closes the body stream after the request is sent to the service. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/append-block. -func (ab AppendBlobURL) AppendBlock(ctx context.Context, body io.ReadSeeker, ac BlobAccessConditions) (*AppendBlobAppendBlockResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - ifAppendPositionEqual, ifMaxSizeLessThanOrEqual := ac.AppendBlobAccessConditions.pointers() - return ab.abClient.AppendBlock(ctx, body, validateSeekableStreamAt0AndGetCount(body), nil, - ac.LeaseAccessConditions.pointers(), - ifMaxSizeLessThanOrEqual, ifAppendPositionEqual, - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// AppendBlobAccessConditions identifies append blob-specific access conditions which you optionally set. -type AppendBlobAccessConditions struct { - // IfAppendPositionEqual ensures that the AppendBlock operation succeeds - // only if the append position is equal to a value. - // IfAppendPositionEqual=0 means no 'IfAppendPositionEqual' header specified. - // IfAppendPositionEqual>0 means 'IfAppendPositionEqual' header specified with its value - // IfAppendPositionEqual==-1 means IfAppendPositionEqual' header specified with a value of 0 - IfAppendPositionEqual int64 - - // IfMaxSizeLessThanOrEqual ensures that the AppendBlock operation succeeds - // only if the append blob's size is less than or equal to a value. - // IfMaxSizeLessThanOrEqual=0 means no 'IfMaxSizeLessThanOrEqual' header specified. - // IfMaxSizeLessThanOrEqual>0 means 'IfMaxSizeLessThanOrEqual' header specified with its value - // IfMaxSizeLessThanOrEqual==-1 means 'IfMaxSizeLessThanOrEqual' header specified with a value of 0 - IfMaxSizeLessThanOrEqual int64 -} - -// pointers is for internal infrastructure. It returns the fields as pointers. -func (ac AppendBlobAccessConditions) pointers() (iape *int64, imsltoe *int64) { - if ac.IfAppendPositionEqual < -1 { - panic("IfAppendPositionEqual can't be less than -1") - } - if ac.IfMaxSizeLessThanOrEqual < -1 { - panic("IfMaxSizeLessThanOrEqual can't be less than -1") - } - var zero int64 // defaults to 0 - switch ac.IfAppendPositionEqual { - case -1: - iape = &zero - case 0: - iape = nil - default: - iape = &ac.IfAppendPositionEqual - } - - switch ac.IfMaxSizeLessThanOrEqual { - case -1: - imsltoe = &zero - case 0: - imsltoe = nil - default: - imsltoe = &ac.IfMaxSizeLessThanOrEqual - } - return -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_blob.go deleted file mode 100644 index 96d85cbfd8d3..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_blob.go +++ /dev/null @@ -1,222 +0,0 @@ -package azblob - -import ( - "context" - "net/url" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -// A BlobURL represents a URL to an Azure Storage blob; the blob may be a block blob, append blob, or page blob. -type BlobURL struct { - blobClient blobClient -} - -// NewBlobURL creates a BlobURL object using the specified URL and request policy pipeline. -func NewBlobURL(url url.URL, p pipeline.Pipeline) BlobURL { - if p == nil { - panic("p can't be nil") - } - blobClient := newBlobClient(url, p) - return BlobURL{blobClient: blobClient} -} - -// URL returns the URL endpoint used by the BlobURL object. -func (b BlobURL) URL() url.URL { - return b.blobClient.URL() -} - -// String returns the URL as a string. -func (b BlobURL) String() string { - u := b.URL() - return u.String() -} - -// WithPipeline creates a new BlobURL object identical to the source but with the specified request policy pipeline. -func (b BlobURL) WithPipeline(p pipeline.Pipeline) BlobURL { - if p == nil { - panic("p can't be nil") - } - return NewBlobURL(b.blobClient.URL(), p) -} - -// WithSnapshot creates a new BlobURL object identical to the source but with the specified snapshot timestamp. -// Pass "" to remove the snapshot returning a URL to the base blob. -func (b BlobURL) WithSnapshot(snapshot string) BlobURL { - p := NewBlobURLParts(b.URL()) - p.Snapshot = snapshot - return NewBlobURL(p.URL(), b.blobClient.Pipeline()) -} - -// ToAppendBlobURL creates an AppendBlobURL using the source's URL and pipeline. -func (b BlobURL) ToAppendBlobURL() AppendBlobURL { - return NewAppendBlobURL(b.URL(), b.blobClient.Pipeline()) -} - -// ToBlockBlobURL creates a BlockBlobURL using the source's URL and pipeline. -func (b BlobURL) ToBlockBlobURL() BlockBlobURL { - return NewBlockBlobURL(b.URL(), b.blobClient.Pipeline()) -} - -// ToPageBlobURL creates a PageBlobURL using the source's URL and pipeline. -func (b BlobURL) ToPageBlobURL() PageBlobURL { - return NewPageBlobURL(b.URL(), b.blobClient.Pipeline()) -} - -// DownloadBlob reads a range of bytes from a blob. The response also includes the blob's properties and metadata. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob. -func (b BlobURL) Download(ctx context.Context, offset int64, count int64, ac BlobAccessConditions, rangeGetContentMD5 bool) (*DownloadResponse, error) { - var xRangeGetContentMD5 *bool - if rangeGetContentMD5 { - xRangeGetContentMD5 = &rangeGetContentMD5 - } - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - dr, err := b.blobClient.Download(ctx, nil, nil, - httpRange{offset: offset, count: count}.pointers(), - ac.LeaseAccessConditions.pointers(), xRangeGetContentMD5, - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) - if err != nil { - return nil, err - } - return &DownloadResponse{ - b: b, - r: dr, - ctx: ctx, - getInfo: HTTPGetterInfo{Offset: offset, Count: count, ETag: dr.ETag()}, - }, err -} - -// DeleteBlob marks the specified blob or snapshot for deletion. The blob is later deleted during garbage collection. -// Note that deleting a blob also deletes all its snapshots. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-blob. -func (b BlobURL) Delete(ctx context.Context, deleteOptions DeleteSnapshotsOptionType, ac BlobAccessConditions) (*BlobDeleteResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return b.blobClient.Delete(ctx, nil, nil, ac.LeaseAccessConditions.pointers(), deleteOptions, - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// Undelete restores the contents and metadata of a soft-deleted blob and any associated soft-deleted snapshots. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/undelete-blob. -func (b BlobURL) Undelete(ctx context.Context) (*BlobUndeleteResponse, error) { - return b.blobClient.Undelete(ctx, nil, nil) -} - -// SetTier operation sets the tier on a blob. The operation is allowed on a page -// blob in a premium storage account and on a block blob in a blob storage account (locally -// redundant storage only). A premium page blob's tier determines the allowed size, IOPS, and -// bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive storage type. This operation -// does not update the blob's ETag. -// For detailed information about block blob level tiering see https://docs.microsoft.com/en-us/azure/storage/blobs/storage-blob-storage-tiers. -func (b BlobURL) SetTier(ctx context.Context, tier AccessTierType) (*BlobSetTierResponse, error) { - return b.blobClient.SetTier(ctx, tier, nil, nil) -} - -// GetBlobProperties returns the blob's properties. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-blob-properties. -func (b BlobURL) GetProperties(ctx context.Context, ac BlobAccessConditions) (*BlobGetPropertiesResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return b.blobClient.GetProperties(ctx, nil, nil, ac.LeaseAccessConditions.pointers(), - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// SetBlobHTTPHeaders changes a blob's HTTP headers. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties. -func (b BlobURL) SetHTTPHeaders(ctx context.Context, h BlobHTTPHeaders, ac BlobAccessConditions) (*BlobSetHTTPHeadersResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return b.blobClient.SetHTTPHeaders(ctx, nil, - &h.CacheControl, &h.ContentType, h.ContentMD5, &h.ContentEncoding, &h.ContentLanguage, - ac.LeaseAccessConditions.pointers(), ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, - &h.ContentDisposition, nil) -} - -// SetBlobMetadata changes a blob's metadata. -// https://docs.microsoft.com/rest/api/storageservices/set-blob-metadata. -func (b BlobURL) SetMetadata(ctx context.Context, metadata Metadata, ac BlobAccessConditions) (*BlobSetMetadataResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return b.blobClient.SetMetadata(ctx, nil, metadata, ac.LeaseAccessConditions.pointers(), - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// CreateSnapshot creates a read-only snapshot of a blob. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/snapshot-blob. -func (b BlobURL) CreateSnapshot(ctx context.Context, metadata Metadata, ac BlobAccessConditions) (*BlobCreateSnapshotResponse, error) { - // CreateSnapshot does NOT panic if the user tries to create a snapshot using a URL that already has a snapshot query parameter - // because checking this would be a performance hit for a VERY unusual path and I don't think the common case should suffer this - // performance hit. - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return b.blobClient.CreateSnapshot(ctx, nil, metadata, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, ac.LeaseAccessConditions.pointers(), nil) -} - -// AcquireLease acquires a lease on the blob for write and delete operations. The lease duration must be between -// 15 to 60 seconds, or infinite (-1). -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. -func (b BlobURL) AcquireLease(ctx context.Context, proposedID string, duration int32, ac HTTPAccessConditions) (*BlobAcquireLeaseResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.pointers() - return b.blobClient.AcquireLease(ctx, nil, &duration, &proposedID, - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// RenewLease renews the blob's previously-acquired lease. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. -func (b BlobURL) RenewLease(ctx context.Context, leaseID string, ac HTTPAccessConditions) (*BlobRenewLeaseResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.pointers() - return b.blobClient.RenewLease(ctx, leaseID, nil, - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// ReleaseLease releases the blob's previously-acquired lease. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. -func (b BlobURL) ReleaseLease(ctx context.Context, leaseID string, ac HTTPAccessConditions) (*BlobReleaseLeaseResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.pointers() - return b.blobClient.ReleaseLease(ctx, leaseID, nil, - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// BreakLease breaks the blob's previously-acquired lease (if it exists). Pass the LeaseBreakDefault (-1) -// constant to break a fixed-duration lease when it expires or an infinite lease immediately. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. -func (b BlobURL) BreakLease(ctx context.Context, breakPeriodInSeconds int32, ac HTTPAccessConditions) (*BlobBreakLeaseResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.pointers() - return b.blobClient.BreakLease(ctx, nil, leasePeriodPointer(breakPeriodInSeconds), - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// ChangeLease changes the blob's lease ID. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-blob. -func (b BlobURL) ChangeLease(ctx context.Context, leaseID string, proposedID string, ac HTTPAccessConditions) (*BlobChangeLeaseResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.pointers() - return b.blobClient.ChangeLease(ctx, leaseID, proposedID, - nil, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// LeaseBreakNaturally tells ContainerURL's or BlobURL's BreakLease method to break the lease using service semantics. -const LeaseBreakNaturally = -1 - -func leasePeriodPointer(period int32) (p *int32) { - if period != LeaseBreakNaturally { - p = &period - } - return nil -} - -// StartCopyFromURL copies the data at the source URL to a blob. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/copy-blob. -func (b BlobURL) StartCopyFromURL(ctx context.Context, source url.URL, metadata Metadata, srcac BlobAccessConditions, dstac BlobAccessConditions) (*BlobStartCopyFromURLResponse, error) { - srcIfModifiedSince, srcIfUnmodifiedSince, srcIfMatchETag, srcIfNoneMatchETag := srcac.HTTPAccessConditions.pointers() - dstIfModifiedSince, dstIfUnmodifiedSince, dstIfMatchETag, dstIfNoneMatchETag := dstac.HTTPAccessConditions.pointers() - srcLeaseID := srcac.LeaseAccessConditions.pointers() - dstLeaseID := dstac.LeaseAccessConditions.pointers() - - return b.blobClient.StartCopyFromURL(ctx, source.String(), nil, metadata, - srcIfModifiedSince, srcIfUnmodifiedSince, - srcIfMatchETag, srcIfNoneMatchETag, - dstIfModifiedSince, dstIfUnmodifiedSince, - dstIfMatchETag, dstIfNoneMatchETag, - dstLeaseID, srcLeaseID, nil) -} - -// AbortCopyFromURL stops a pending copy that was previously started and leaves a destination blob with 0 length and metadata. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/abort-copy-blob. -func (b BlobURL) AbortCopyFromURL(ctx context.Context, copyID string, ac LeaseAccessConditions) (*BlobAbortCopyFromURLResponse, error) { - return b.blobClient.AbortCopyFromURL(ctx, copyID, nil, ac.pointers(), nil) -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_block_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_block_blob.go deleted file mode 100644 index ec7028558763..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_block_blob.go +++ /dev/null @@ -1,157 +0,0 @@ -package azblob - -import ( - "context" - "io" - "net/url" - - "encoding/base64" - "encoding/binary" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -const ( - // BlockBlobMaxPutBlobBytes indicates the maximum number of bytes that can be sent in a call to Upload. - BlockBlobMaxUploadBlobBytes = 256 * 1024 * 1024 // 256MB - - // BlockBlobMaxStageBlockBytes indicates the maximum number of bytes that can be sent in a call to StageBlock. - BlockBlobMaxStageBlockBytes = 100 * 1024 * 1024 // 100MB - - // BlockBlobMaxBlocks indicates the maximum number of blocks allowed in a block blob. - BlockBlobMaxBlocks = 50000 -) - -// BlockBlobURL defines a set of operations applicable to block blobs. -type BlockBlobURL struct { - BlobURL - bbClient blockBlobClient -} - -// NewBlockBlobURL creates a BlockBlobURL object using the specified URL and request policy pipeline. -func NewBlockBlobURL(url url.URL, p pipeline.Pipeline) BlockBlobURL { - if p == nil { - panic("p can't be nil") - } - blobClient := newBlobClient(url, p) - bbClient := newBlockBlobClient(url, p) - return BlockBlobURL{BlobURL: BlobURL{blobClient: blobClient}, bbClient: bbClient} -} - -// WithPipeline creates a new BlockBlobURL object identical to the source but with the specific request policy pipeline. -func (bb BlockBlobURL) WithPipeline(p pipeline.Pipeline) BlockBlobURL { - return NewBlockBlobURL(bb.blobClient.URL(), p) -} - -// WithSnapshot creates a new BlockBlobURL object identical to the source but with the specified snapshot timestamp. -// Pass "" to remove the snapshot returning a URL to the base blob. -func (bb BlockBlobURL) WithSnapshot(snapshot string) BlockBlobURL { - p := NewBlobURLParts(bb.URL()) - p.Snapshot = snapshot - return NewBlockBlobURL(p.URL(), bb.blobClient.Pipeline()) -} - -// Upload creates a new block blob or overwrites an existing block blob. -// Updating an existing block blob overwrites any existing metadata on the blob. Partial updates are not -// supported with Upload; the content of the existing blob is overwritten with the new content. To -// perform a partial update of a block blob, use StageBlock and CommitBlockList. -// This method panics if the stream is not at position 0. -// Note that the http client closes the body stream after the request is sent to the service. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob. -func (bb BlockBlobURL) Upload(ctx context.Context, body io.ReadSeeker, h BlobHTTPHeaders, metadata Metadata, ac BlobAccessConditions) (*BlockBlobUploadResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return bb.bbClient.Upload(ctx, body, validateSeekableStreamAt0AndGetCount(body), nil, - &h.ContentType, &h.ContentEncoding, &h.ContentLanguage, h.ContentMD5, - &h.CacheControl, metadata, ac.LeaseAccessConditions.pointers(), - &h.ContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, - nil) -} - -// StageBlock uploads the specified block to the block blob's "staging area" to be later committed by a call to CommitBlockList. -// Note that the http client closes the body stream after the request is sent to the service. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-block. -func (bb BlockBlobURL) StageBlock(ctx context.Context, base64BlockID string, body io.ReadSeeker, ac LeaseAccessConditions) (*BlockBlobStageBlockResponse, error) { - return bb.bbClient.StageBlock(ctx, base64BlockID, validateSeekableStreamAt0AndGetCount(body), body, nil, ac.pointers(), nil) -} - -// StageBlockFromURL copies the specified block from a source URL to the block blob's "staging area" to be later committed by a call to CommitBlockList. -// If count is CountToEnd (0), then data is read from specified offset to the end. -// For more information, see https://docs.microsoft.com/en-us/rest/api/storageservices/put-block-from-url. -func (bb BlockBlobURL) StageBlockFromURL(ctx context.Context, base64BlockID string, sourceURL url.URL, offset int64, count int64, ac LeaseAccessConditions) (*BlockBlobStageBlockFromURLResponse, error) { - sourceURLStr := sourceURL.String() - return bb.bbClient.StageBlockFromURL(ctx, base64BlockID, 0, &sourceURLStr, httpRange{offset: offset, count: count}.pointers(), nil, nil, ac.pointers(), nil) -} - -// CommitBlockList writes a blob by specifying the list of block IDs that make up the blob. -// In order to be written as part of a blob, a block must have been successfully written -// to the server in a prior PutBlock operation. You can call PutBlockList to update a blob -// by uploading only those blocks that have changed, then committing the new and existing -// blocks together. Any blocks not specified in the block list and permanently deleted. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-block-list. -func (bb BlockBlobURL) CommitBlockList(ctx context.Context, base64BlockIDs []string, h BlobHTTPHeaders, - metadata Metadata, ac BlobAccessConditions) (*BlockBlobCommitBlockListResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return bb.bbClient.CommitBlockList(ctx, BlockLookupList{Latest: base64BlockIDs}, nil, - &h.CacheControl, &h.ContentType, &h.ContentEncoding, &h.ContentLanguage, h.ContentMD5, - metadata, ac.LeaseAccessConditions.pointers(), &h.ContentDisposition, - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// GetBlockList returns the list of blocks that have been uploaded as part of a block blob using the specified block list filter. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-block-list. -func (bb BlockBlobURL) GetBlockList(ctx context.Context, listType BlockListType, ac LeaseAccessConditions) (*BlockList, error) { - return bb.bbClient.GetBlockList(ctx, listType, nil, nil, ac.pointers(), nil) -} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -type BlockID [64]byte - -func (blockID BlockID) ToBase64() string { - return base64.StdEncoding.EncodeToString(blockID[:]) -} - -func (blockID *BlockID) FromBase64(s string) error { - *blockID = BlockID{} // Zero out the block ID - _, err := base64.StdEncoding.Decode(blockID[:], ([]byte)(s)) - return err -} - -////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -type uuidBlockID BlockID - -func (ubi uuidBlockID) UUID() uuid { - u := uuid{} - copy(u[:], ubi[:len(u)]) - return u -} - -func (ubi uuidBlockID) Number() uint32 { - return binary.BigEndian.Uint32(ubi[len(uuid{}):]) -} - -func newUuidBlockID(u uuid) uuidBlockID { - ubi := uuidBlockID{} // Create a new uuidBlockID - copy(ubi[:len(u)], u[:]) // Copy the specified UUID into it - // Block number defaults to 0 - return ubi -} - -func (ubi *uuidBlockID) SetUUID(u uuid) *uuidBlockID { - copy(ubi[:len(u)], u[:]) - return ubi -} - -func (ubi uuidBlockID) WithBlockNumber(blockNumber uint32) uuidBlockID { - binary.BigEndian.PutUint32(ubi[len(uuid{}):], blockNumber) // Put block number after UUID - return ubi // Return the passed-in copy -} - -func (ubi uuidBlockID) ToBase64() string { - return BlockID(ubi).ToBase64() -} - -func (ubi *uuidBlockID) FromBase64(s string) error { - return (*BlockID)(ubi).FromBase64(s) -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_container.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_container.go deleted file mode 100644 index 0fad9f07674e..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_container.go +++ /dev/null @@ -1,300 +0,0 @@ -package azblob - -import ( - "bytes" - "context" - "fmt" - "net/url" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -// A ContainerURL represents a URL to the Azure Storage container allowing you to manipulate its blobs. -type ContainerURL struct { - client containerClient -} - -// NewContainerURL creates a ContainerURL object using the specified URL and request policy pipeline. -func NewContainerURL(url url.URL, p pipeline.Pipeline) ContainerURL { - if p == nil { - panic("p can't be nil") - } - client := newContainerClient(url, p) - return ContainerURL{client: client} -} - -// URL returns the URL endpoint used by the ContainerURL object. -func (c ContainerURL) URL() url.URL { - return c.client.URL() -} - -// String returns the URL as a string. -func (c ContainerURL) String() string { - u := c.URL() - return u.String() -} - -// WithPipeline creates a new ContainerURL object identical to the source but with the specified request policy pipeline. -func (c ContainerURL) WithPipeline(p pipeline.Pipeline) ContainerURL { - return NewContainerURL(c.URL(), p) -} - -// NewBlobURL creates a new BlobURL object by concatenating blobName to the end of -// ContainerURL's URL. The new BlobURL uses the same request policy pipeline as the ContainerURL. -// To change the pipeline, create the BlobURL and then call its WithPipeline method passing in the -// desired pipeline object. Or, call this package's NewBlobURL instead of calling this object's -// NewBlobURL method. -func (c ContainerURL) NewBlobURL(blobName string) BlobURL { - blobURL := appendToURLPath(c.URL(), blobName) - return NewBlobURL(blobURL, c.client.Pipeline()) -} - -// NewAppendBlobURL creates a new AppendBlobURL object by concatenating blobName to the end of -// ContainerURL's URL. The new AppendBlobURL uses the same request policy pipeline as the ContainerURL. -// To change the pipeline, create the AppendBlobURL and then call its WithPipeline method passing in the -// desired pipeline object. Or, call this package's NewAppendBlobURL instead of calling this object's -// NewAppendBlobURL method. -func (c ContainerURL) NewAppendBlobURL(blobName string) AppendBlobURL { - blobURL := appendToURLPath(c.URL(), blobName) - return NewAppendBlobURL(blobURL, c.client.Pipeline()) -} - -// NewBlockBlobURL creates a new BlockBlobURL object by concatenating blobName to the end of -// ContainerURL's URL. The new BlockBlobURL uses the same request policy pipeline as the ContainerURL. -// To change the pipeline, create the BlockBlobURL and then call its WithPipeline method passing in the -// desired pipeline object. Or, call this package's NewBlockBlobURL instead of calling this object's -// NewBlockBlobURL method. -func (c ContainerURL) NewBlockBlobURL(blobName string) BlockBlobURL { - blobURL := appendToURLPath(c.URL(), blobName) - return NewBlockBlobURL(blobURL, c.client.Pipeline()) -} - -// NewPageBlobURL creates a new PageBlobURL object by concatenating blobName to the end of -// ContainerURL's URL. The new PageBlobURL uses the same request policy pipeline as the ContainerURL. -// To change the pipeline, create the PageBlobURL and then call its WithPipeline method passing in the -// desired pipeline object. Or, call this package's NewPageBlobURL instead of calling this object's -// NewPageBlobURL method. -func (c ContainerURL) NewPageBlobURL(blobName string) PageBlobURL { - blobURL := appendToURLPath(c.URL(), blobName) - return NewPageBlobURL(blobURL, c.client.Pipeline()) -} - -// Create creates a new container within a storage account. If a container with the same name already exists, the operation fails. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/create-container. -func (c ContainerURL) Create(ctx context.Context, metadata Metadata, publicAccessType PublicAccessType) (*ContainerCreateResponse, error) { - return c.client.Create(ctx, nil, metadata, publicAccessType, nil) -} - -// Delete marks the specified container for deletion. The container and any blobs contained within it are later deleted during garbage collection. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/delete-container. -func (c ContainerURL) Delete(ctx context.Context, ac ContainerAccessConditions) (*ContainerDeleteResponse, error) { - if ac.IfMatch != ETagNone || ac.IfNoneMatch != ETagNone { - panic("the IfMatch and IfNoneMatch access conditions must have their default values because they are ignored by the service") - } - - ifModifiedSince, ifUnmodifiedSince, _, _ := ac.HTTPAccessConditions.pointers() - return c.client.Delete(ctx, nil, ac.LeaseAccessConditions.pointers(), - ifModifiedSince, ifUnmodifiedSince, nil) -} - -// GetProperties returns the container's properties. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-container-metadata. -func (c ContainerURL) GetProperties(ctx context.Context, ac LeaseAccessConditions) (*ContainerGetPropertiesResponse, error) { - // NOTE: GetMetadata actually calls GetProperties internally because GetProperties returns the metadata AND the properties. - // This allows us to not expose a GetProperties method at all simplifying the API. - return c.client.GetProperties(ctx, nil, ac.pointers(), nil) -} - -// SetMetadata sets the container's metadata. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-container-metadata. -func (c ContainerURL) SetMetadata(ctx context.Context, metadata Metadata, ac ContainerAccessConditions) (*ContainerSetMetadataResponse, error) { - if !ac.IfUnmodifiedSince.IsZero() || ac.IfMatch != ETagNone || ac.IfNoneMatch != ETagNone { - panic("the IfUnmodifiedSince, IfMatch, and IfNoneMatch must have their default values because they are ignored by the blob service") - } - ifModifiedSince, _, _, _ := ac.HTTPAccessConditions.pointers() - return c.client.SetMetadata(ctx, nil, ac.LeaseAccessConditions.pointers(), metadata, ifModifiedSince, nil) -} - -// GetAccessPolicy returns the container's access policy. The access policy indicates whether container's blobs may be accessed publicly. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-container-acl. -func (c ContainerURL) GetAccessPolicy(ctx context.Context, ac LeaseAccessConditions) (*SignedIdentifiers, error) { - return c.client.GetAccessPolicy(ctx, nil, ac.pointers(), nil) -} - -// The AccessPolicyPermission type simplifies creating the permissions string for a container's access policy. -// Initialize an instance of this type and then call its String method to set AccessPolicy's Permission field. -type AccessPolicyPermission struct { - Read, Add, Create, Write, Delete, List bool -} - -// String produces the access policy permission string for an Azure Storage container. -// Call this method to set AccessPolicy's Permission field. -func (p AccessPolicyPermission) String() string { - var b bytes.Buffer - if p.Read { - b.WriteRune('r') - } - if p.Add { - b.WriteRune('a') - } - if p.Create { - b.WriteRune('c') - } - if p.Write { - b.WriteRune('w') - } - if p.Delete { - b.WriteRune('d') - } - if p.List { - b.WriteRune('l') - } - return b.String() -} - -// Parse initializes the AccessPolicyPermission's fields from a string. -func (p *AccessPolicyPermission) Parse(s string) error { - *p = AccessPolicyPermission{} // Clear the flags - for _, r := range s { - switch r { - case 'r': - p.Read = true - case 'a': - p.Add = true - case 'c': - p.Create = true - case 'w': - p.Write = true - case 'd': - p.Delete = true - case 'l': - p.List = true - default: - return fmt.Errorf("invalid permission: '%v'", r) - } - } - return nil -} - -// SetAccessPolicy sets the container's permissions. The access policy indicates whether blobs in a container may be accessed publicly. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-container-acl. -func (c ContainerURL) SetAccessPolicy(ctx context.Context, accessType PublicAccessType, si []SignedIdentifier, - ac ContainerAccessConditions) (*ContainerSetAccessPolicyResponse, error) { - if ac.IfMatch != ETagNone || ac.IfNoneMatch != ETagNone { - panic("the IfMatch and IfNoneMatch access conditions must have their default values because they are ignored by the service") - } - ifModifiedSince, ifUnmodifiedSince, _, _ := ac.HTTPAccessConditions.pointers() - return c.client.SetAccessPolicy(ctx, si, nil, ac.LeaseAccessConditions.pointers(), - accessType, ifModifiedSince, ifUnmodifiedSince, nil) -} - -// AcquireLease acquires a lease on the container for delete operations. The lease duration must be between 15 to 60 seconds, or infinite (-1). -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. -func (c ContainerURL) AcquireLease(ctx context.Context, proposedID string, duration int32, ac HTTPAccessConditions) (*ContainerAcquireLeaseResponse, error) { - ifModifiedSince, ifUnmodifiedSince, _, _ := ac.pointers() - return c.client.AcquireLease(ctx, nil, &duration, &proposedID, - ifModifiedSince, ifUnmodifiedSince, nil) -} - -// RenewLease renews the container's previously-acquired lease. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. -func (c ContainerURL) RenewLease(ctx context.Context, leaseID string, ac HTTPAccessConditions) (*ContainerRenewLeaseResponse, error) { - ifModifiedSince, ifUnmodifiedSince, _, _ := ac.pointers() - return c.client.RenewLease(ctx, leaseID, nil, ifModifiedSince, ifUnmodifiedSince, nil) -} - -// ReleaseLease releases the container's previously-acquired lease. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. -func (c ContainerURL) ReleaseLease(ctx context.Context, leaseID string, ac HTTPAccessConditions) (*ContainerReleaseLeaseResponse, error) { - ifModifiedSince, ifUnmodifiedSince, _, _ := ac.pointers() - return c.client.ReleaseLease(ctx, leaseID, nil, ifModifiedSince, ifUnmodifiedSince, nil) -} - -// BreakLease breaks the container's previously-acquired lease (if it exists). -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. -func (c ContainerURL) BreakLease(ctx context.Context, period int32, ac HTTPAccessConditions) (*ContainerBreakLeaseResponse, error) { - ifModifiedSince, ifUnmodifiedSince, _, _ := ac.pointers() - return c.client.BreakLease(ctx, nil, leasePeriodPointer(period), ifModifiedSince, ifUnmodifiedSince, nil) -} - -// ChangeLease changes the container's lease ID. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/lease-container. -func (c ContainerURL) ChangeLease(ctx context.Context, leaseID string, proposedID string, ac HTTPAccessConditions) (*ContainerChangeLeaseResponse, error) { - ifModifiedSince, ifUnmodifiedSince, _, _ := ac.pointers() - return c.client.ChangeLease(ctx, leaseID, proposedID, nil, ifModifiedSince, ifUnmodifiedSince, nil) -} - -// ListBlobsFlatSegment returns a single segment of blobs starting from the specified Marker. Use an empty -// Marker to start enumeration from the beginning. Blob names are returned in lexicographic order. -// After getting a segment, process it, and then call ListBlobsFlatSegment again (passing the the -// previously-returned Marker) to get the next segment. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/list-blobs. -func (c ContainerURL) ListBlobsFlatSegment(ctx context.Context, marker Marker, o ListBlobsSegmentOptions) (*ListBlobsFlatSegmentResponse, error) { - prefix, include, maxResults := o.pointers() - return c.client.ListBlobFlatSegment(ctx, prefix, marker.val, maxResults, include, nil, nil) -} - -// ListBlobsHierarchySegment returns a single segment of blobs starting from the specified Marker. Use an empty -// Marker to start enumeration from the beginning. Blob names are returned in lexicographic order. -// After getting a segment, process it, and then call ListBlobsHierarchicalSegment again (passing the the -// previously-returned Marker) to get the next segment. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/list-blobs. -func (c ContainerURL) ListBlobsHierarchySegment(ctx context.Context, marker Marker, delimiter string, o ListBlobsSegmentOptions) (*ListBlobsHierarchySegmentResponse, error) { - if o.Details.Snapshots { - panic("snapshots are not supported in this listing operation") - } - prefix, include, maxResults := o.pointers() - return c.client.ListBlobHierarchySegment(ctx, delimiter, prefix, marker.val, maxResults, include, nil, nil) -} - -// ListBlobsSegmentOptions defines options available when calling ListBlobs. -type ListBlobsSegmentOptions struct { - Details BlobListingDetails // No IncludeType header is produced if "" - Prefix string // No Prefix header is produced if "" - - // SetMaxResults sets the maximum desired results you want the service to return. Note, the - // service may return fewer results than requested. - // MaxResults=0 means no 'MaxResults' header specified. - MaxResults int32 -} - -func (o *ListBlobsSegmentOptions) pointers() (prefix *string, include []ListBlobsIncludeItemType, maxResults *int32) { - if o.Prefix != "" { - prefix = &o.Prefix - } - include = o.Details.slice() - if o.MaxResults != 0 { - if o.MaxResults < 0 { - panic("MaxResults must be >= 0") - } - maxResults = &o.MaxResults - } - return -} - -// BlobListingDetails indicates what additional information the service should return with each blob. -type BlobListingDetails struct { - Copy, Metadata, Snapshots, UncommittedBlobs, Deleted bool -} - -// string produces the Include query parameter's value. -func (d *BlobListingDetails) slice() []ListBlobsIncludeItemType { - items := []ListBlobsIncludeItemType{} - // NOTE: Multiple strings MUST be appended in alphabetic order or signing the string for authentication fails! - if d.Copy { - items = append(items, ListBlobsIncludeItemCopy) - } - if d.Deleted { - items = append(items, ListBlobsIncludeItemDeleted) - } - if d.Metadata { - items = append(items, ListBlobsIncludeItemMetadata) - } - if d.Snapshots { - items = append(items, ListBlobsIncludeItemSnapshots) - } - if d.UncommittedBlobs { - items = append(items, ListBlobsIncludeItemUncommittedblobs) - } - return items -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_page_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_page_blob.go deleted file mode 100644 index fa87ef8527e2..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_page_blob.go +++ /dev/null @@ -1,236 +0,0 @@ -package azblob - -import ( - "context" - "fmt" - "io" - "net/url" - "strconv" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -const ( - // PageBlobPageBytes indicates the number of bytes in a page (512). - PageBlobPageBytes = 512 - - // PageBlobMaxPutPagesBytes indicates the maximum number of bytes that can be sent in a call to PutPage. - PageBlobMaxUploadPagesBytes = 4 * 1024 * 1024 // 4MB -) - -// PageBlobURL defines a set of operations applicable to page blobs. -type PageBlobURL struct { - BlobURL - pbClient pageBlobClient -} - -// NewPageBlobURL creates a PageBlobURL object using the specified URL and request policy pipeline. -func NewPageBlobURL(url url.URL, p pipeline.Pipeline) PageBlobURL { - if p == nil { - panic("p can't be nil") - } - blobClient := newBlobClient(url, p) - pbClient := newPageBlobClient(url, p) - return PageBlobURL{BlobURL: BlobURL{blobClient: blobClient}, pbClient: pbClient} -} - -// WithPipeline creates a new PageBlobURL object identical to the source but with the specific request policy pipeline. -func (pb PageBlobURL) WithPipeline(p pipeline.Pipeline) PageBlobURL { - return NewPageBlobURL(pb.blobClient.URL(), p) -} - -// WithSnapshot creates a new PageBlobURL object identical to the source but with the specified snapshot timestamp. -// Pass "" to remove the snapshot returning a URL to the base blob. -func (pb PageBlobURL) WithSnapshot(snapshot string) PageBlobURL { - p := NewBlobURLParts(pb.URL()) - p.Snapshot = snapshot - return NewPageBlobURL(p.URL(), pb.blobClient.Pipeline()) -} - -// CreatePageBlob creates a page blob of the specified length. Call PutPage to upload data data to a page blob. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-blob. -func (pb PageBlobURL) Create(ctx context.Context, size int64, sequenceNumber int64, h BlobHTTPHeaders, metadata Metadata, ac BlobAccessConditions) (*PageBlobCreateResponse, error) { - if sequenceNumber < 0 { - panic("sequenceNumber must be greater than or equal to 0") - } - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return pb.pbClient.Create(ctx, 0, nil, - &h.ContentType, &h.ContentEncoding, &h.ContentLanguage, h.ContentMD5, &h.CacheControl, - metadata, ac.LeaseAccessConditions.pointers(), - &h.ContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, &size, &sequenceNumber, nil) -} - -// UploadPages writes 1 or more pages to the page blob. The start offset and the stream size must be a multiple of 512 bytes. -// This method panics if the stream is not at position 0. -// Note that the http client closes the body stream after the request is sent to the service. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page. -func (pb PageBlobURL) UploadPages(ctx context.Context, offset int64, body io.ReadSeeker, ac BlobAccessConditions) (*PageBlobUploadPagesResponse, error) { - count := validateSeekableStreamAt0AndGetCount(body) - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - ifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, ifSequenceNumberEqual := ac.PageBlobAccessConditions.pointers() - return pb.pbClient.UploadPages(ctx, body, count, nil, - PageRange{Start: offset, End: offset + count - 1}.pointers(), - ac.LeaseAccessConditions.pointers(), - ifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, ifSequenceNumberEqual, - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// ClearPages frees the specified pages from the page blob. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/put-page. -func (pb PageBlobURL) ClearPages(ctx context.Context, offset int64, count int64, ac BlobAccessConditions) (*PageBlobClearPagesResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - ifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, ifSequenceNumberEqual := ac.PageBlobAccessConditions.pointers() - return pb.pbClient.ClearPages(ctx, 0, nil, - PageRange{Start: offset, End: offset + count - 1}.pointers(), - ac.LeaseAccessConditions.pointers(), - ifSequenceNumberLessThanOrEqual, ifSequenceNumberLessThan, - ifSequenceNumberEqual, ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// GetPageRanges returns the list of valid page ranges for a page blob or snapshot of a page blob. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges. -func (pb PageBlobURL) GetPageRanges(ctx context.Context, offset int64, count int64, ac BlobAccessConditions) (*PageList, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return pb.pbClient.GetPageRanges(ctx, nil, nil, - httpRange{offset: offset, count: count}.pointers(), - ac.LeaseAccessConditions.pointers(), - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// GetPageRangesDiff gets the collection of page ranges that differ between a specified snapshot and this page blob. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/get-page-ranges. -func (pb PageBlobURL) GetPageRangesDiff(ctx context.Context, offset int64, count int64, prevSnapshot string, ac BlobAccessConditions) (*PageList, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return pb.pbClient.GetPageRangesDiff(ctx, nil, nil, &prevSnapshot, - httpRange{offset: offset, count: count}.pointers(), - ac.LeaseAccessConditions.pointers(), - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, - nil) -} - -// Resize resizes the page blob to the specified size (which must be a multiple of 512). -// For more information, see https://docs.microsoft.com/rest/api/storageservices/set-blob-properties. -func (pb PageBlobURL) Resize(ctx context.Context, size int64, ac BlobAccessConditions) (*PageBlobResizeResponse, error) { - if size%PageBlobPageBytes != 0 { - panic("Size must be a multiple of PageBlobPageBytes (512)") - } - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - return pb.pbClient.Resize(ctx, size, nil, ac.LeaseAccessConditions.pointers(), - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -// SetSequenceNumber sets the page blob's sequence number. -func (pb PageBlobURL) UpdateSequenceNumber(ctx context.Context, action SequenceNumberActionType, sequenceNumber int64, - ac BlobAccessConditions) (*PageBlobUpdateSequenceNumberResponse, error) { - if sequenceNumber < 0 { - panic("sequenceNumber must be greater than or equal to 0") - } - sn := &sequenceNumber - if action == SequenceNumberActionIncrement { - sn = nil - } - ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch := ac.HTTPAccessConditions.pointers() - return pb.pbClient.UpdateSequenceNumber(ctx, action, nil, - ac.LeaseAccessConditions.pointers(), ifModifiedSince, ifUnmodifiedSince, ifMatch, ifNoneMatch, - sn, nil) -} - -// StartIncrementalCopy begins an operation to start an incremental copy from one page blob's snapshot to this page blob. -// The snapshot is copied such that only the differential changes between the previously copied snapshot are transferred to the destination. -// The copied snapshots are complete copies of the original snapshot and can be read or copied from as usual. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/incremental-copy-blob and -// https://docs.microsoft.com/en-us/azure/virtual-machines/windows/incremental-snapshots. -func (pb PageBlobURL) StartCopyIncremental(ctx context.Context, source url.URL, snapshot string, ac BlobAccessConditions) (*PageBlobCopyIncrementalResponse, error) { - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag := ac.HTTPAccessConditions.pointers() - qp := source.Query() - qp.Set("snapshot", snapshot) - source.RawQuery = qp.Encode() - return pb.pbClient.CopyIncremental(ctx, source.String(), nil, nil, - ifModifiedSince, ifUnmodifiedSince, ifMatchETag, ifNoneMatchETag, nil) -} - -func (pr PageRange) pointers() *string { - if pr.Start < 0 { - panic("PageRange's Start value must be greater than or equal to 0") - } - if pr.End <= 0 { - panic("PageRange's End value must be greater than 0") - } - if pr.Start%PageBlobPageBytes != 0 { - panic("PageRange's Start value must be a multiple of 512") - } - if pr.End%PageBlobPageBytes != (PageBlobPageBytes - 1) { - panic("PageRange's End value must be 1 less than a multiple of 512") - } - if pr.End <= pr.Start { - panic("PageRange's End value must be after the start") - } - endOffset := strconv.FormatInt(int64(pr.End), 10) - asString := fmt.Sprintf("bytes=%v-%s", pr.Start, endOffset) - return &asString -} - -// PageBlobAccessConditions identifies page blob-specific access conditions which you optionally set. -type PageBlobAccessConditions struct { - // IfSequenceNumberLessThan ensures that the page blob operation succeeds - // only if the blob's sequence number is less than a value. - // IfSequenceNumberLessThan=0 means no 'IfSequenceNumberLessThan' header specified. - // IfSequenceNumberLessThan>0 means 'IfSequenceNumberLessThan' header specified with its value - // IfSequenceNumberLessThan==-1 means 'IfSequenceNumberLessThan' header specified with a value of 0 - IfSequenceNumberLessThan int64 - - // IfSequenceNumberLessThanOrEqual ensures that the page blob operation succeeds - // only if the blob's sequence number is less than or equal to a value. - // IfSequenceNumberLessThanOrEqual=0 means no 'IfSequenceNumberLessThanOrEqual' header specified. - // IfSequenceNumberLessThanOrEqual>0 means 'IfSequenceNumberLessThanOrEqual' header specified with its value - // IfSequenceNumberLessThanOrEqual=-1 means 'IfSequenceNumberLessThanOrEqual' header specified with a value of 0 - IfSequenceNumberLessThanOrEqual int64 - - // IfSequenceNumberEqual ensures that the page blob operation succeeds - // only if the blob's sequence number is equal to a value. - // IfSequenceNumberEqual=0 means no 'IfSequenceNumberEqual' header specified. - // IfSequenceNumberEqual>0 means 'IfSequenceNumberEqual' header specified with its value - // IfSequenceNumberEqual=-1 means 'IfSequenceNumberEqual' header specified with a value of 0 - IfSequenceNumberEqual int64 -} - -// pointers is for internal infrastructure. It returns the fields as pointers. -func (ac PageBlobAccessConditions) pointers() (snltoe *int64, snlt *int64, sne *int64) { - if ac.IfSequenceNumberLessThan < -1 { - panic("Ifsequencenumberlessthan can't be less than -1") - } - if ac.IfSequenceNumberLessThanOrEqual < -1 { - panic("IfSequenceNumberLessThanOrEqual can't be less than -1") - } - if ac.IfSequenceNumberEqual < -1 { - panic("IfSequenceNumberEqual can't be less than -1") - } - - var zero int64 // Defaults to 0 - switch ac.IfSequenceNumberLessThan { - case -1: - snlt = &zero - case 0: - snlt = nil - default: - snlt = &ac.IfSequenceNumberLessThan - } - - switch ac.IfSequenceNumberLessThanOrEqual { - case -1: - snltoe = &zero - case 0: - snltoe = nil - default: - snltoe = &ac.IfSequenceNumberLessThanOrEqual - } - switch ac.IfSequenceNumberEqual { - case -1: - sne = &zero - case 0: - sne = nil - default: - sne = &ac.IfSequenceNumberEqual - } - return -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_service.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_service.go deleted file mode 100644 index d49a20846b3e..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/url_service.go +++ /dev/null @@ -1,140 +0,0 @@ -package azblob - -import ( - "context" - "net/url" - "strings" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -const ( - // ContainerNameRoot is the special Azure Storage name used to identify a storage account's root container. - ContainerNameRoot = "$root" - - // ContainerNameLogs is the special Azure Storage name used to identify a storage account's logs container. - ContainerNameLogs = "$logs" -) - -// A ServiceURL represents a URL to the Azure Storage Blob service allowing you to manipulate blob containers. -type ServiceURL struct { - client serviceClient -} - -// NewServiceURL creates a ServiceURL object using the specified URL and request policy pipeline. -func NewServiceURL(primaryURL url.URL, p pipeline.Pipeline) ServiceURL { - if p == nil { - panic("p can't be nil") - } - client := newServiceClient(primaryURL, p) - return ServiceURL{client: client} -} - -// URL returns the URL endpoint used by the ServiceURL object. -func (s ServiceURL) URL() url.URL { - return s.client.URL() -} - -// String returns the URL as a string. -func (s ServiceURL) String() string { - u := s.URL() - return u.String() -} - -// WithPipeline creates a new ServiceURL object identical to the source but with the specified request policy pipeline. -func (s ServiceURL) WithPipeline(p pipeline.Pipeline) ServiceURL { - return NewServiceURL(s.URL(), p) -} - -// NewContainerURL creates a new ContainerURL object by concatenating containerName to the end of -// ServiceURL's URL. The new ContainerURL uses the same request policy pipeline as the ServiceURL. -// To change the pipeline, create the ContainerURL and then call its WithPipeline method passing in the -// desired pipeline object. Or, call this package's NewContainerURL instead of calling this object's -// NewContainerURL method. -func (s ServiceURL) NewContainerURL(containerName string) ContainerURL { - containerURL := appendToURLPath(s.URL(), containerName) - return NewContainerURL(containerURL, s.client.Pipeline()) -} - -// appendToURLPath appends a string to the end of a URL's path (prefixing the string with a '/' if required) -func appendToURLPath(u url.URL, name string) url.URL { - // e.g. "https://ms.com/a/b/?k1=v1&k2=v2#f" - // When you call url.Parse() this is what you'll get: - // Scheme: "https" - // Opaque: "" - // User: nil - // Host: "ms.com" - // Path: "/a/b/" This should start with a / and it might or might not have a trailing slash - // RawPath: "" - // ForceQuery: false - // RawQuery: "k1=v1&k2=v2" - // Fragment: "f" - if len(u.Path) == 0 || u.Path[len(u.Path)-1] != '/' { - u.Path += "/" // Append "/" to end before appending name - } - u.Path += name - return u -} - -// ListContainersFlatSegment returns a single segment of containers starting from the specified Marker. Use an empty -// Marker to start enumeration from the beginning. Container names are returned in lexicographic order. -// After getting a segment, process it, and then call ListContainersFlatSegment again (passing the the -// previously-returned Marker) to get the next segment. For more information, see -// https://docs.microsoft.com/rest/api/storageservices/list-containers2. -func (s ServiceURL) ListContainersSegment(ctx context.Context, marker Marker, o ListContainersSegmentOptions) (*ListContainersResponse, error) { - prefix, include, maxResults := o.pointers() - return s.client.ListContainersSegment(ctx, prefix, marker.val, maxResults, include, nil, nil) -} - -// ListContainersOptions defines options available when calling ListContainers. -type ListContainersSegmentOptions struct { - Detail ListContainersDetail // No IncludeType header is produced if "" - Prefix string // No Prefix header is produced if "" - MaxResults int32 // 0 means unspecified - // TODO: update swagger to generate this type? -} - -func (o *ListContainersSegmentOptions) pointers() (prefix *string, include ListContainersIncludeType, maxResults *int32) { - if o.Prefix != "" { - prefix = &o.Prefix - } - if o.MaxResults != 0 { - if o.MaxResults < 0 { - panic("MaxResults must be >= 0") - } - maxResults = &o.MaxResults - } - include = ListContainersIncludeType(o.Detail.string()) - return -} - -// ListContainersFlatDetail indicates what additional information the service should return with each container. -type ListContainersDetail struct { - // Tells the service whether to return metadata for each container. - Metadata bool -} - -// string produces the Include query parameter's value. -func (d *ListContainersDetail) string() string { - items := make([]string, 0, 1) - // NOTE: Multiple strings MUST be appended in alphabetic order or signing the string for authentication fails! - if d.Metadata { - items = append(items, string(ListContainersIncludeMetadata)) - } - if len(items) > 0 { - return strings.Join(items, ",") - } - return string(ListContainersIncludeNone) -} - -func (bsu ServiceURL) GetProperties(ctx context.Context) (*StorageServiceProperties, error) { - return bsu.client.GetProperties(ctx, nil, nil) -} - -func (bsu ServiceURL) SetProperties(ctx context.Context, properties StorageServiceProperties) (*ServiceSetPropertiesResponse, error) { - return bsu.client.SetProperties(ctx, properties, nil, nil) -} - -func (bsu ServiceURL) GetStatistics(ctx context.Context) (*StorageServiceStats, error) { - return bsu.client.GetStatistics(ctx, nil, nil) -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/version.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/version.go deleted file mode 100644 index 8a8926bd33cc..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/version.go +++ /dev/null @@ -1,3 +0,0 @@ -package azblob - -const serviceLibVersion = "0.1" diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_anonymous.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_anonymous.go deleted file mode 100644 index a81987d54a30..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_anonymous.go +++ /dev/null @@ -1,55 +0,0 @@ -package azblob - -import ( - "context" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -// Credential represent any credential type; it is used to create a credential policy Factory. -type Credential interface { - pipeline.Factory - credentialMarker() -} - -type credentialFunc pipeline.FactoryFunc - -func (f credentialFunc) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy { - return f(next, po) -} - -// credentialMarker is a package-internal method that exists just to satisfy the Credential interface. -func (credentialFunc) credentialMarker() {} - -////////////////////////////// - -// NewAnonymousCredential creates an anonymous credential for use with HTTP(S) requests that read public resource -// or for use with Shared Access Signatures (SAS). -func NewAnonymousCredential() Credential { - return anonymousCredentialFactory -} - -var anonymousCredentialFactory Credential = &anonymousCredentialPolicyFactory{} // Singleton - -// anonymousCredentialPolicyFactory is the credential's policy factory. -type anonymousCredentialPolicyFactory struct { -} - -// New creates a credential policy object. -func (f *anonymousCredentialPolicyFactory) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy { - return &anonymousCredentialPolicy{next: next} -} - -// credentialMarker is a package-internal method that exists just to satisfy the Credential interface. -func (*anonymousCredentialPolicyFactory) credentialMarker() {} - -// anonymousCredentialPolicy is the credential's policy object. -type anonymousCredentialPolicy struct { - next pipeline.Policy -} - -// Do implements the credential's policy interface. -func (p anonymousCredentialPolicy) Do(ctx context.Context, request pipeline.Request) (pipeline.Response, error) { - // For anonymous credentials, this is effectively a no-op - return p.next.Do(ctx, request) -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_shared_key.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_shared_key.go deleted file mode 100644 index 51da1627797a..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_shared_key.go +++ /dev/null @@ -1,187 +0,0 @@ -package azblob - -import ( - "bytes" - "context" - "crypto/hmac" - "crypto/sha256" - "encoding/base64" - "net/http" - "net/url" - "sort" - "strings" - "time" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -// NewSharedKeyCredential creates an immutable SharedKeyCredential containing the -// storage account's name and either its primary or secondary key. -func NewSharedKeyCredential(accountName, accountKey string) *SharedKeyCredential { - bytes, err := base64.StdEncoding.DecodeString(accountKey) - if err != nil { - panic(err) - } - return &SharedKeyCredential{accountName: accountName, accountKey: bytes} -} - -// SharedKeyCredential contains an account's name and its primary or secondary key. -// It is immutable making it shareable and goroutine-safe. -type SharedKeyCredential struct { - // Only the NewSharedKeyCredential method should set these; all other methods should treat them as read-only - accountName string - accountKey []byte -} - -// AccountName returns the Storage account's name. -func (f SharedKeyCredential) AccountName() string { - return f.accountName -} - -// New creates a credential policy object. -func (f *SharedKeyCredential) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy { - return pipeline.PolicyFunc(func(ctx context.Context, request pipeline.Request) (pipeline.Response, error) { - // Add a x-ms-date header if it doesn't already exist - if d := request.Header.Get(headerXmsDate); d == "" { - request.Header[headerXmsDate] = []string{time.Now().UTC().Format(http.TimeFormat)} - } - stringToSign := f.buildStringToSign(request) - signature := f.ComputeHMACSHA256(stringToSign) - authHeader := strings.Join([]string{"SharedKey ", f.accountName, ":", signature}, "") - request.Header[headerAuthorization] = []string{authHeader} - - response, err := next.Do(ctx, request) - if err != nil && response != nil && response.Response() != nil && response.Response().StatusCode == http.StatusForbidden { - // Service failed to authenticate request, log it - po.Log(pipeline.LogError, "===== HTTP Forbidden status, String-to-Sign:\n"+stringToSign+"\n===============================\n") - } - return response, err - }) -} - -// credentialMarker is a package-internal method that exists just to satisfy the Credential interface. -func (*SharedKeyCredential) credentialMarker() {} - -// Constants ensuring that header names are correctly spelled and consistently cased. -const ( - headerAuthorization = "Authorization" - headerCacheControl = "Cache-Control" - headerContentEncoding = "Content-Encoding" - headerContentDisposition = "Content-Disposition" - headerContentLanguage = "Content-Language" - headerContentLength = "Content-Length" - headerContentMD5 = "Content-MD5" - headerContentType = "Content-Type" - headerDate = "Date" - headerIfMatch = "If-Match" - headerIfModifiedSince = "If-Modified-Since" - headerIfNoneMatch = "If-None-Match" - headerIfUnmodifiedSince = "If-Unmodified-Since" - headerRange = "Range" - headerUserAgent = "User-Agent" - headerXmsDate = "x-ms-date" - headerXmsVersion = "x-ms-version" -) - -// ComputeHMACSHA256 generates a hash signature for an HTTP request or for a SAS. -func (f *SharedKeyCredential) ComputeHMACSHA256(message string) (base64String string) { - h := hmac.New(sha256.New, f.accountKey) - h.Write([]byte(message)) - return base64.StdEncoding.EncodeToString(h.Sum(nil)) -} - -func (f *SharedKeyCredential) buildStringToSign(request pipeline.Request) string { - // https://docs.microsoft.com/en-us/rest/api/storageservices/authentication-for-the-azure-storage-services - headers := request.Header - contentLength := headers.Get(headerContentLength) - if contentLength == "0" { - contentLength = "" - } - - stringToSign := strings.Join([]string{ - request.Method, - headers.Get(headerContentEncoding), - headers.Get(headerContentLanguage), - contentLength, - headers.Get(headerContentMD5), - headers.Get(headerContentType), - "", // Empty date because x-ms-date is expected (as per web page above) - headers.Get(headerIfModifiedSince), - headers.Get(headerIfMatch), - headers.Get(headerIfNoneMatch), - headers.Get(headerIfUnmodifiedSince), - headers.Get(headerRange), - buildCanonicalizedHeader(headers), - f.buildCanonicalizedResource(request.URL), - }, "\n") - return stringToSign -} - -func buildCanonicalizedHeader(headers http.Header) string { - cm := map[string][]string{} - for k, v := range headers { - headerName := strings.TrimSpace(strings.ToLower(k)) - if strings.HasPrefix(headerName, "x-ms-") { - cm[headerName] = v // NOTE: the value must not have any whitespace around it. - } - } - if len(cm) == 0 { - return "" - } - - keys := make([]string, 0, len(cm)) - for key := range cm { - keys = append(keys, key) - } - sort.Strings(keys) - ch := bytes.NewBufferString("") - for i, key := range keys { - if i > 0 { - ch.WriteRune('\n') - } - ch.WriteString(key) - ch.WriteRune(':') - ch.WriteString(strings.Join(cm[key], ",")) - } - return string(ch.Bytes()) -} - -func (f *SharedKeyCredential) buildCanonicalizedResource(u *url.URL) string { - // https://docs.microsoft.com/en-us/rest/api/storageservices/authentication-for-the-azure-storage-services - cr := bytes.NewBufferString("/") - cr.WriteString(f.accountName) - - if len(u.Path) > 0 { - // Any portion of the CanonicalizedResource string that is derived from - // the resource's URI should be encoded exactly as it is in the URI. - // -- https://msdn.microsoft.com/en-gb/library/azure/dd179428.aspx - cr.WriteString(u.EscapedPath()) - } else { - // a slash is required to indicate the root path - cr.WriteString("/") - } - - // params is a map[string][]string; param name is key; params values is []string - params, err := url.ParseQuery(u.RawQuery) // Returns URL decoded values - if err != nil { - panic(err) - } - - if len(params) > 0 { // There is at least 1 query parameter - paramNames := []string{} // We use this to sort the parameter key names - for paramName := range params { - paramNames = append(paramNames, paramName) // paramNames must be lowercase - } - sort.Strings(paramNames) - - for _, paramName := range paramNames { - paramValues := params[paramName] - sort.Strings(paramValues) - - // Join the sorted key values separated by ',' - // Then prepend "keyName:"; then add this string to the buffer - cr.WriteString("\n" + paramName + ":" + strings.Join(paramValues, ",")) - } - } - return string(cr.Bytes()) -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_token.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_token.go deleted file mode 100644 index d7f925d39818..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_credential_token.go +++ /dev/null @@ -1,126 +0,0 @@ -package azblob - -import ( - "context" - "sync/atomic" - - "runtime" - "sync" - "time" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -// TokenCredential represents a token credential (which is also a pipeline.Factory). -type TokenCredential interface { - Credential - Token() string - SetToken(newToken string) -} - -// NewTokenCredential creates a token credential for use with role-based access control (RBAC) access to Azure Storage -// resources. You initialize the TokenCredential with an initial token value. If you pass a non-nil value for -// tokenRefresher, then the function you pass will be called immediately (so it can refresh and change the -// TokenCredential's token value by calling SetToken; your tokenRefresher function must return a time.Duration -// indicating how long the TokenCredential object should wait before calling your tokenRefresher function again. -func NewTokenCredential(initialToken string, tokenRefresher func(credential TokenCredential) time.Duration) TokenCredential { - tc := &tokenCredential{} - tc.SetToken(initialToken) // We dont' set it above to guarantee atomicity - if tokenRefresher == nil { - return tc // If no callback specified, return the simple tokenCredential - } - - tcwr := &tokenCredentialWithRefresh{token: tc} - tcwr.token.startRefresh(tokenRefresher) - runtime.SetFinalizer(tcwr, func(deadTC *tokenCredentialWithRefresh) { - deadTC.token.stopRefresh() - deadTC.token = nil // Sanity (not really required) - }) - return tcwr -} - -// tokenCredentialWithRefresh is a wrapper over a token credential. -// When this wrapper object gets GC'd, it stops the tokenCredential's timer -// which allows the tokenCredential object to also be GC'd. -type tokenCredentialWithRefresh struct { - token *tokenCredential -} - -// credentialMarker is a package-internal method that exists just to satisfy the Credential interface. -func (*tokenCredentialWithRefresh) credentialMarker() {} - -// Token returns the current token value -func (f *tokenCredentialWithRefresh) Token() string { return f.token.Token() } - -// SetToken changes the current token value -func (f *tokenCredentialWithRefresh) SetToken(token string) { f.token.SetToken(token) } - -// New satisfies pipeline.Factory's New method creating a pipeline policy object. -func (f *tokenCredentialWithRefresh) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy { - return f.token.New(next, po) -} - -/////////////////////////////////////////////////////////////////////////////// - -// tokenCredential is a pipeline.Factory is the credential's policy factory. -type tokenCredential struct { - token atomic.Value - - // The members below are only used if the user specified a tokenRefresher callback function. - timer *time.Timer - tokenRefresher func(c TokenCredential) time.Duration - lock sync.Mutex - stopped bool -} - -// credentialMarker is a package-internal method that exists just to satisfy the Credential interface. -func (*tokenCredential) credentialMarker() {} - -// Token returns the current token value -func (f *tokenCredential) Token() string { return f.token.Load().(string) } - -// SetToken changes the current token value -func (f *tokenCredential) SetToken(token string) { f.token.Store(token) } - -// startRefresh calls refresh which immediately calls tokenRefresher -// and then starts a timer to call tokenRefresher in the future. -func (f *tokenCredential) startRefresh(tokenRefresher func(c TokenCredential) time.Duration) { - f.tokenRefresher = tokenRefresher - f.stopped = false // In case user calls StartRefresh, StopRefresh, & then StartRefresh again - f.refresh() -} - -// refresh calls the user's tokenRefresher so they can refresh the token (by -// calling SetToken) and then starts another time (based on the returned duration) -// in order to refresh the token again in the future. -func (f *tokenCredential) refresh() { - d := f.tokenRefresher(f) // Invoke the user's refresh callback outside of the lock - f.lock.Lock() - if !f.stopped { - f.timer = time.AfterFunc(d, f.refresh) - } - f.lock.Unlock() -} - -// stopRefresh stops any pending timer and sets stopped field to true to prevent -// any new timer from starting. -// NOTE: Stopping the timer allows the GC to destroy the tokenCredential object. -func (f *tokenCredential) stopRefresh() { - f.lock.Lock() - f.stopped = true - if f.timer != nil { - f.timer.Stop() - } - f.lock.Unlock() -} - -// New satisfies pipeline.Factory's New method creating a pipeline policy object. -func (f *tokenCredential) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy { - return pipeline.PolicyFunc(func(ctx context.Context, request pipeline.Request) (pipeline.Response, error) { - if request.URL.Scheme != "https" { - panic("Token credentials require a URL using the https protocol scheme.") - } - request.Header[headerAuthorization] = []string{"Bearer " + f.Token()} - return next.Do(ctx, request) - }) -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_unix.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_unix.go deleted file mode 100644 index b6c668ac6480..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_unix.go +++ /dev/null @@ -1,27 +0,0 @@ -// +build linux darwin freebsd - -package azblob - -import ( - "os" - "syscall" -) - -type mmf []byte - -func newMMF(file *os.File, writable bool, offset int64, length int) (mmf, error) { - prot, flags := syscall.PROT_READ, syscall.MAP_SHARED // Assume read-only - if writable { - prot, flags = syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED - } - addr, err := syscall.Mmap(int(file.Fd()), offset, length, prot, flags) - return mmf(addr), err -} - -func (m *mmf) unmap() { - err := syscall.Munmap(*m) - *m = nil - if err != nil { - panic(err) - } -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_windows.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_windows.go deleted file mode 100644 index 1a6e83dad9b2..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_windows.go +++ /dev/null @@ -1,38 +0,0 @@ -package azblob - -import ( - "os" - "reflect" - "syscall" - "unsafe" -) - -type mmf []byte - -func newMMF(file *os.File, writable bool, offset int64, length int) (mmf, error) { - prot, access := uint32(syscall.PAGE_READONLY), uint32(syscall.FILE_MAP_READ) // Assume read-only - if writable { - prot, access = uint32(syscall.PAGE_READWRITE), uint32(syscall.FILE_MAP_WRITE) - } - hMMF, errno := syscall.CreateFileMapping(syscall.Handle(file.Fd()), nil, prot, uint32(int64(length)>>32), uint32(int64(length)&0xffffffff), nil) - if hMMF == 0 { - return nil, os.NewSyscallError("CreateFileMapping", errno) - } - defer syscall.CloseHandle(hMMF) - addr, errno := syscall.MapViewOfFile(hMMF, access, uint32(offset>>32), uint32(offset&0xffffffff), uintptr(length)) - m := mmf{} - h := (*reflect.SliceHeader)(unsafe.Pointer(&m)) - h.Data = addr - h.Len = length - h.Cap = h.Len - return m, nil -} - -func (m *mmf) unmap() { - addr := uintptr(unsafe.Pointer(&(([]byte)(*m)[0]))) - *m = mmf{} - err := syscall.UnmapViewOfFile(addr) - if err != nil { - panic(err) - } -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_pipeline.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_pipeline.go deleted file mode 100644 index af5fcd6c7f88..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_pipeline.go +++ /dev/null @@ -1,46 +0,0 @@ -package azblob - -import ( - "github.com/Azure/azure-pipeline-go/pipeline" -) - -// PipelineOptions is used to configure a request policy pipeline's retry policy and logging. -type PipelineOptions struct { - // Log configures the pipeline's logging infrastructure indicating what information is logged and where. - Log pipeline.LogOptions - - // Retry configures the built-in retry policy behavior. - Retry RetryOptions - - // RequestLog configures the built-in request logging policy. - RequestLog RequestLogOptions - - // Telemetry configures the built-in telemetry policy behavior. - Telemetry TelemetryOptions -} - -// NewPipeline creates a Pipeline using the specified credentials and options. -func NewPipeline(c Credential, o PipelineOptions) pipeline.Pipeline { - if c == nil { - panic("c can't be nil") - } - - // Closest to API goes first; closest to the wire goes last - f := []pipeline.Factory{ - NewTelemetryPolicyFactory(o.Telemetry), - NewUniqueRequestIDPolicyFactory(), - NewRetryPolicyFactory(o.Retry), - } - - if _, ok := c.(*anonymousCredentialPolicyFactory); !ok { - // For AnonymousCredential, we optimize out the policy factory since it doesn't do anything - // NOTE: The credential's policy factory must appear close to the wire so it can sign any - // changes made by other factories (like UniqueRequestIDPolicyFactory) - f = append(f, c) - } - f = append(f, - pipeline.MethodFactoryMarker(), // indicates at what stage in the pipeline the method factory is invoked - NewRequestLogPolicyFactory(o.RequestLog)) - - return pipeline.NewPipeline(f, pipeline.Options{HTTPSender: nil, Log: o.Log}) -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_request_log.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_request_log.go deleted file mode 100644 index 23d559eb7c43..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_request_log.go +++ /dev/null @@ -1,150 +0,0 @@ -package azblob - -import ( - "bytes" - "context" - "fmt" - "net/http" - "net/url" - "runtime" - "strings" - "time" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -// RequestLogOptions configures the retry policy's behavior. -type RequestLogOptions struct { - // LogWarningIfTryOverThreshold logs a warning if a tried operation takes longer than the specified - // duration (-1=no logging; 0=default threshold). - LogWarningIfTryOverThreshold time.Duration -} - -func (o RequestLogOptions) defaults() RequestLogOptions { - if o.LogWarningIfTryOverThreshold == 0 { - // It would be good to relate this to https://azure.microsoft.com/en-us/support/legal/sla/storage/v1_2/ - // But this monitors the time to get the HTTP response; NOT the time to download the response body. - o.LogWarningIfTryOverThreshold = 3 * time.Second // Default to 3 seconds - } - return o -} - -// NewRequestLogPolicyFactory creates a RequestLogPolicyFactory object configured using the specified options. -func NewRequestLogPolicyFactory(o RequestLogOptions) pipeline.Factory { - o = o.defaults() // Force defaults to be calculated - return pipeline.FactoryFunc(func(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.PolicyFunc { - // These variables are per-policy; shared by multiple calls to Do - var try int32 - operationStart := time.Now() // If this is the 1st try, record the operation state time - return func(ctx context.Context, request pipeline.Request) (response pipeline.Response, err error) { - try++ // The first try is #1 (not #0) - - // Log the outgoing request as informational - if po.ShouldLog(pipeline.LogInfo) { - b := &bytes.Buffer{} - fmt.Fprintf(b, "==> OUTGOING REQUEST (Try=%d)\n", try) - pipeline.WriteRequestWithResponse(b, prepareRequestForLogging(request), nil, nil) - po.Log(pipeline.LogInfo, b.String()) - } - - // Set the time for this particular retry operation and then Do the operation. - tryStart := time.Now() - response, err = next.Do(ctx, request) // Make the request - tryEnd := time.Now() - tryDuration := tryEnd.Sub(tryStart) - opDuration := tryEnd.Sub(operationStart) - - logLevel, forceLog := pipeline.LogInfo, false // Default logging information - - // If the response took too long, we'll upgrade to warning. - if o.LogWarningIfTryOverThreshold > 0 && tryDuration > o.LogWarningIfTryOverThreshold { - // Log a warning if the try duration exceeded the specified threshold - logLevel, forceLog = pipeline.LogWarning, true - } - - if err == nil { // We got a response from the service - sc := response.Response().StatusCode - if ((sc >= 400 && sc <= 499) && sc != http.StatusNotFound && sc != http.StatusConflict && sc != http.StatusPreconditionFailed && sc != http.StatusRequestedRangeNotSatisfiable) || (sc >= 500 && sc <= 599) { - logLevel, forceLog = pipeline.LogError, true // Promote to Error any 4xx (except those listed is an error) or any 5xx - } else { - // For other status codes, we leave the level as is. - } - } else { // This error did not get an HTTP response from the service; upgrade the severity to Error - logLevel, forceLog = pipeline.LogError, true - } - - if shouldLog := po.ShouldLog(logLevel); forceLog || shouldLog { - // We're going to log this; build the string to log - b := &bytes.Buffer{} - slow := "" - if o.LogWarningIfTryOverThreshold > 0 && tryDuration > o.LogWarningIfTryOverThreshold { - slow = fmt.Sprintf("[SLOW >%v]", o.LogWarningIfTryOverThreshold) - } - fmt.Fprintf(b, "==> REQUEST/RESPONSE (Try=%d/%v%s, OpTime=%v) -- ", try, tryDuration, slow, opDuration) - if err != nil { // This HTTP request did not get a response from the service - fmt.Fprint(b, "REQUEST ERROR\n") - } else { - if logLevel == pipeline.LogError { - fmt.Fprint(b, "RESPONSE STATUS CODE ERROR\n") - } else { - fmt.Fprint(b, "RESPONSE SUCCESSFULLY RECEIVED\n") - } - } - - pipeline.WriteRequestWithResponse(b, prepareRequestForLogging(request), response.Response(), err) - if logLevel <= pipeline.LogError { - b.Write(stack()) // For errors (or lower levels), we append the stack trace (an expensive operation) - } - msg := b.String() - - if forceLog { - pipeline.ForceLog(logLevel, msg) - } - if shouldLog { - po.Log(logLevel, msg) - } - } - return response, err - } - }) -} - -func redactSigQueryParam(rawQuery string) (bool, string) { - rawQuery = strings.ToLower(rawQuery) // lowercase the string so we can look for ?sig= and &sig= - sigFound := strings.Contains(rawQuery, "?sig=") - if !sigFound { - sigFound = strings.Contains(rawQuery, "&sig=") - if !sigFound { - return sigFound, rawQuery // [?|&]sig= not found; return same rawQuery passed in (no memory allocation) - } - } - // [?|&]sig= found, redact its value - values, _ := url.ParseQuery(rawQuery) - for name := range values { - if strings.EqualFold(name, "sig") { - values[name] = []string{"REDACTED"} - } - } - return sigFound, values.Encode() -} - -func prepareRequestForLogging(request pipeline.Request) *http.Request { - req := request - if sigFound, rawQuery := redactSigQueryParam(req.URL.RawQuery); sigFound { - // Make copy so we don't destroy the query parameters we actually need to send in the request - req = request.Copy() - req.Request.URL.RawQuery = rawQuery - } - return req.Request -} - -func stack() []byte { - buf := make([]byte, 1024) - for { - n := runtime.Stack(buf, false) - if n < len(buf) { - return buf[:n] - } - buf = make([]byte, 2*len(buf)) - } -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_retry.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_retry.go deleted file mode 100644 index 4c885ea1aa35..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_retry.go +++ /dev/null @@ -1,318 +0,0 @@ -package azblob - -import ( - "context" - "math/rand" - "net" - "net/http" - "strconv" - "time" - - "github.com/Azure/azure-pipeline-go/pipeline" - "io/ioutil" - "io" -) - -// RetryPolicy tells the pipeline what kind of retry policy to use. See the RetryPolicy* constants. -type RetryPolicy int32 - -const ( - // RetryPolicyExponential tells the pipeline to use an exponential back-off retry policy - RetryPolicyExponential RetryPolicy = 0 - - // RetryPolicyFixed tells the pipeline to use a fixed back-off retry policy - RetryPolicyFixed RetryPolicy = 1 -) - -// RetryOptions configures the retry policy's behavior. -type RetryOptions struct { - // Policy tells the pipeline what kind of retry policy to use. See the RetryPolicy* constants.\ - // A value of zero means that you accept our default policy. - Policy RetryPolicy - - // MaxTries specifies the maximum number of attempts an operation will be tried before producing an error (0=default). - // A value of zero means that you accept our default policy. A value of 1 means 1 try and no retries. - MaxTries int32 - - // TryTimeout indicates the maximum time allowed for any single try of an HTTP request. - // A value of zero means that you accept our default timeout. NOTE: When transferring large amounts - // of data, the default TryTimeout will probably not be sufficient. You should override this value - // based on the bandwidth available to the host machine and proximity to the Storage service. A good - // starting point may be something like (60 seconds per MB of anticipated-payload-size). - TryTimeout time.Duration - - // RetryDelay specifies the amount of delay to use before retrying an operation (0=default). - // When RetryPolicy is specified as RetryPolicyExponential, the delay increases exponentially - // with each retry up to a maximum specified by MaxRetryDelay. - // If you specify 0, then you must also specify 0 for MaxRetryDelay. - // If you specify RetryDelay, then you must also specify MaxRetryDelay, and MaxRetryDelay should be - // equal to or greater than RetryDelay. - RetryDelay time.Duration - - // MaxRetryDelay specifies the maximum delay allowed before retrying an operation (0=default). - // If you specify 0, then you must also specify 0 for RetryDelay. - MaxRetryDelay time.Duration - - // RetryReadsFromSecondaryHost specifies whether the retry policy should retry a read operation against another host. - // If RetryReadsFromSecondaryHost is "" (the default) then operations are not retried against another host. - // NOTE: Before setting this field, make sure you understand the issues around reading stale & potentially-inconsistent - // data at this webpage: https://docs.microsoft.com/en-us/azure/storage/common/storage-designing-ha-apps-with-ragrs - RetryReadsFromSecondaryHost string // Comment this our for non-Blob SDKs -} - -func (o RetryOptions) retryReadsFromSecondaryHost() string { - return o.RetryReadsFromSecondaryHost // This is for the Blob SDK only - //return "" // This is for non-blob SDKs -} - -func (o RetryOptions) defaults() RetryOptions { - if o.Policy != RetryPolicyExponential && o.Policy != RetryPolicyFixed { - panic("RetryPolicy must be RetryPolicyExponential or RetryPolicyFixed") - } - if o.MaxTries < 0 { - panic("MaxTries must be >= 0") - } - if o.TryTimeout < 0 || o.RetryDelay < 0 || o.MaxRetryDelay < 0 { - panic("TryTimeout, RetryDelay, and MaxRetryDelay must all be >= 0") - } - if o.RetryDelay > o.MaxRetryDelay { - panic("RetryDelay must be <= MaxRetryDelay") - } - if (o.RetryDelay == 0 && o.MaxRetryDelay != 0) || (o.RetryDelay != 0 && o.MaxRetryDelay == 0) { - panic("Both RetryDelay and MaxRetryDelay must be 0 or neither can be 0") - } - - IfDefault := func(current *time.Duration, desired time.Duration) { - if *current == time.Duration(0) { - *current = desired - } - } - - // Set defaults if unspecified - if o.MaxTries == 0 { - o.MaxTries = 4 - } - switch o.Policy { - case RetryPolicyExponential: - IfDefault(&o.TryTimeout, 1*time.Minute) - IfDefault(&o.RetryDelay, 4*time.Second) - IfDefault(&o.MaxRetryDelay, 120*time.Second) - - case RetryPolicyFixed: - IfDefault(&o.TryTimeout, 1*time.Minute) - IfDefault(&o.RetryDelay, 30*time.Second) - IfDefault(&o.MaxRetryDelay, 120*time.Second) - } - return o -} - -func (o RetryOptions) calcDelay(try int32) time.Duration { // try is >=1; never 0 - pow := func(number int64, exponent int32) int64 { // pow is nested helper function - var result int64 = 1 - for n := int32(0); n < exponent; n++ { - result *= number - } - return result - } - - delay := time.Duration(0) - switch o.Policy { - case RetryPolicyExponential: - delay = time.Duration(pow(2, try-1)-1) * o.RetryDelay - - case RetryPolicyFixed: - if try > 1 { // Any try after the 1st uses the fixed delay - delay = o.RetryDelay - } - } - - // Introduce some jitter: [0.0, 1.0) / 2 = [0.0, 0.5) + 0.8 = [0.8, 1.3) - delay = time.Duration(delay.Seconds() * (rand.Float64()/2 + 0.8) * float64(time.Second)) // NOTE: We want math/rand; not crypto/rand - if delay > o.MaxRetryDelay { - delay = o.MaxRetryDelay - } - return delay -} - -// NewRetryPolicyFactory creates a RetryPolicyFactory object configured using the specified options. -func NewRetryPolicyFactory(o RetryOptions) pipeline.Factory { - o = o.defaults() // Force defaults to be calculated - return pipeline.FactoryFunc(func(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.PolicyFunc { - return func(ctx context.Context, request pipeline.Request) (response pipeline.Response, err error) { - // Before each try, we'll select either the primary or secondary URL. - primaryTry := int32(0) // This indicates how many tries we've attempted against the primary DC - - // We only consider retrying against a secondary if we have a read request (GET/HEAD) AND this policy has a Secondary URL it can use - considerSecondary := (request.Method == http.MethodGet || request.Method == http.MethodHead) && o.retryReadsFromSecondaryHost() != "" - - // Exponential retry algorithm: ((2 ^ attempt) - 1) * delay * random(0.8, 1.2) - // When to retry: connection failure or temporary/timeout. NOTE: StorageError considers HTTP 500/503 as temporary & is therefore retryable - // If using a secondary: - // Even tries go against primary; odd tries go against the secondary - // For a primary wait ((2 ^ primaryTries - 1) * delay * random(0.8, 1.2) - // If secondary gets a 404, don't fail, retry but future retries are only against the primary - // When retrying against a secondary, ignore the retry count and wait (.1 second * random(0.8, 1.2)) - for try := int32(1); try <= o.MaxTries; try++ { - logf("\n=====> Try=%d\n", try) - - // Determine which endpoint to try. It's primary if there is no secondary or if it is an add # attempt. - tryingPrimary := !considerSecondary || (try%2 == 1) - // Select the correct host and delay - if tryingPrimary { - primaryTry++ - delay := o.calcDelay(primaryTry) - logf("Primary try=%d, Delay=%v\n", primaryTry, delay) - time.Sleep(delay) // The 1st try returns 0 delay - } else { - delay := time.Second * time.Duration(rand.Float32()/2+0.8) - logf("Secondary try=%d, Delay=%v\n", try-primaryTry, delay) - time.Sleep(delay) // Delay with some jitter before trying secondary - } - - // Clone the original request to ensure that each try starts with the original (unmutated) request. - requestCopy := request.Copy() - - // For each try, seek to the beginning of the Body stream. We do this even for the 1st try because - // the stream may not be at offset 0 when we first get it and we want the same behavior for the - // 1st try as for additional tries. - if err = requestCopy.RewindBody(); err != nil { - panic(err) - } - if !tryingPrimary { - requestCopy.Request.URL.Host = o.retryReadsFromSecondaryHost() - } - - // Set the server-side timeout query parameter "timeout=[seconds]" - timeout := int32(o.TryTimeout.Seconds()) // Max seconds per try - if deadline, ok := ctx.Deadline(); ok { // If user's ctx has a deadline, make the timeout the smaller of the two - t := int32(deadline.Sub(time.Now()).Seconds()) // Duration from now until user's ctx reaches its deadline - logf("MaxTryTimeout=%d secs, TimeTilDeadline=%d sec\n", timeout, t) - if t < timeout { - timeout = t - } - if timeout < 0 { - timeout = 0 // If timeout ever goes negative, set it to zero; this happen while debugging - } - logf("TryTimeout adjusted to=%d sec\n", timeout) - } - q := requestCopy.Request.URL.Query() - q.Set("timeout", strconv.Itoa(int(timeout+1))) // Add 1 to "round up" - requestCopy.Request.URL.RawQuery = q.Encode() - logf("Url=%s\n", requestCopy.Request.URL.String()) - - // Set the time for this particular retry operation and then Do the operation. - tryCtx, tryCancel := context.WithTimeout(ctx, time.Second*time.Duration(timeout)) - //requestCopy.Body = &deadlineExceededReadCloser{r: requestCopy.Request.Body} - response, err = next.Do(tryCtx, requestCopy) // Make the request - /*err = improveDeadlineExceeded(err) - if err == nil { - response.Response().Body = &deadlineExceededReadCloser{r: response.Response().Body} - }*/ - logf("Err=%v, response=%v\n", err, response) - - action := "" // This MUST get changed within the switch code below - switch { - case ctx.Err() != nil: - action = "NoRetry: Op timeout" - case !tryingPrimary && response != nil && response.Response().StatusCode == http.StatusNotFound: - // If attempt was against the secondary & it returned a StatusNotFound (404), then - // the resource was not found. This may be due to replication delay. So, in this - // case, we'll never try the secondary again for this operation. - considerSecondary = false - action = "Retry: Secondary URL returned 404" - case err != nil: - // NOTE: Protocol Responder returns non-nil if REST API returns invalid status code for the invoked operation - if netErr, ok := err.(net.Error); ok && (netErr.Temporary() || netErr.Timeout()) { - action = "Retry: net.Error and Temporary() or Timeout()" - } else { - action = "NoRetry: unrecognized error" - } - default: - action = "NoRetry: successful HTTP request" // no error - } - - logf("Action=%s\n", action) - // fmt.Println(action + "\n") // This is where we could log the retry operation; action is why we're retrying - if action[0] != 'R' { // Retry only if action starts with 'R' - if err != nil { - tryCancel() // If we're returning an error, cancel this current/last per-retry timeout context - } else { - // TODO: Right now, we've decided to leak the per-try Context until the user's Context is canceled. - // Another option is that we wrap the last per-try context in a body and overwrite the Response's Body field with our wrapper. - // So, when the user closes the Body, the our per-try context gets closed too. - // Another option, is that the Last Policy do this wrapping for a per-retry context (not for the user's context) - _ = tryCancel // So, for now, we don't call cancel: cancel() - } - break // Don't retry - } - if response != nil && response.Response() != nil && response.Response().Body != nil { - // If we're going to retry and we got a previous response, then flush its body to avoid leaking its TCP connection - body := response.Response().Body - io.Copy(ioutil.Discard, body) - body.Close() - } - // If retrying, cancel the current per-try timeout context - tryCancel() - } - return response, err // Not retryable or too many retries; return the last response/error - } - }) -} - -// According to https://github.com/golang/go/wiki/CompilerOptimizations, the compiler will inline this method and hopefully optimize all calls to it away -var logf = func(format string, a ...interface{}) {} - -// Use this version to see the retry method's code path (import "fmt") -//var logf = fmt.Printf - -/* -type deadlineExceededReadCloser struct { - r io.ReadCloser -} - -func (r *deadlineExceededReadCloser) Read(p []byte) (int, error) { - n, err := 0, io.EOF - if r.r != nil { - n, err = r.r.Read(p) - } - return n, improveDeadlineExceeded(err) -} -func (r *deadlineExceededReadCloser) Seek(offset int64, whence int) (int64, error) { - // For an HTTP request, the ReadCloser MUST also implement seek - // For an HTTP response, Seek MUST not be called (or this will panic) - o, err := r.r.(io.Seeker).Seek(offset, whence) - return o, improveDeadlineExceeded(err) -} -func (r *deadlineExceededReadCloser) Close() error { - if c, ok := r.r.(io.Closer); ok { - c.Close() - } - return nil -} - -// timeoutError is the internal struct that implements our richer timeout error. -type deadlineExceeded struct { - responseError -} - -var _ net.Error = (*deadlineExceeded)(nil) // Ensure deadlineExceeded implements the net.Error interface at compile time - -// improveDeadlineExceeded creates a timeoutError object that implements the error interface IF cause is a context.DeadlineExceeded error. -func improveDeadlineExceeded(cause error) error { - // If cause is not DeadlineExceeded, return the same error passed in. - if cause != context.DeadlineExceeded { - return cause - } - // Else, convert DeadlineExceeded to our timeoutError which gives a richer string message - return &deadlineExceeded{ - responseError: responseError{ - ErrorNode: pipeline.ErrorNode{}.Initialize(cause, 3), - }, - } -} - -// Error implements the error interface's Error method to return a string representation of the error. -func (e *deadlineExceeded) Error() string { - return e.ErrorNode.Error("context deadline exceeded; when creating a pipeline, consider increasing RetryOptions' TryTimeout field") -} -*/ diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_telemetry.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_telemetry.go deleted file mode 100644 index 608e1051ca0a..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_telemetry.go +++ /dev/null @@ -1,51 +0,0 @@ -package azblob - -import ( - "bytes" - "context" - "fmt" - "os" - "runtime" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -// TelemetryOptions configures the telemetry policy's behavior. -type TelemetryOptions struct { - // Value is a string prepended to each request's User-Agent and sent to the service. - // The service records the user-agent in logs for diagnostics and tracking of client requests. - Value string -} - -// NewTelemetryPolicyFactory creates a factory that can create telemetry policy objects -// which add telemetry information to outgoing HTTP requests. -func NewTelemetryPolicyFactory(o TelemetryOptions) pipeline.Factory { - b := &bytes.Buffer{} - b.WriteString(o.Value) - if b.Len() > 0 { - b.WriteRune(' ') - } - fmt.Fprintf(b, "Azure-Storage/%s %s", serviceLibVersion, platformInfo) - telemetryValue := b.String() - - return pipeline.FactoryFunc(func(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.PolicyFunc { - return func(ctx context.Context, request pipeline.Request) (pipeline.Response, error) { - request.Header.Set("User-Agent", telemetryValue) - return next.Do(ctx, request) - } - }) -} - -// NOTE: the ONLY function that should write to this variable is this func -var platformInfo = func() string { - // Azure-Storage/version (runtime; os type and version)” - // Azure-Storage/1.4.0 (NODE-VERSION v4.5.0; Windows_NT 10.0.14393)' - operatingSystem := runtime.GOOS // Default OS string - switch operatingSystem { - case "windows": - operatingSystem = os.Getenv("OS") // Get more specific OS information - case "linux": // accept default OS info - case "freebsd": // accept default OS info - } - return fmt.Sprintf("(%s; %s)", runtime.Version(), operatingSystem) -}() diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_unique_request_id.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_unique_request_id.go deleted file mode 100644 index a75c7d1d2e18..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_policy_unique_request_id.go +++ /dev/null @@ -1,24 +0,0 @@ -package azblob - -import ( - "context" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -// NewUniqueRequestIDPolicyFactory creates a UniqueRequestIDPolicyFactory object -// that sets the request's x-ms-client-request-id header if it doesn't already exist. -func NewUniqueRequestIDPolicyFactory() pipeline.Factory { - return pipeline.FactoryFunc(func(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.PolicyFunc { - // This is Policy's Do method: - return func(ctx context.Context, request pipeline.Request) (pipeline.Response, error) { - id := request.Header.Get(xMsClientRequestID) - if id == "" { // Add a unique request ID if the caller didn't specify one already - request.Header.Set(xMsClientRequestID, newUUID().String()) - } - return next.Do(ctx, request) - } - }) -} - -const xMsClientRequestID = "x-ms-client-request-id" diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_retry_reader.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_retry_reader.go deleted file mode 100644 index 42724efa52c3..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_retry_reader.go +++ /dev/null @@ -1,122 +0,0 @@ -package azblob - -import ( - "context" - "io" - "net" - "net/http" -) - -const CountToEnd = 0 - -// HTTPGetter is a function type that refers to a method that performs an HTTP GET operation. -type HTTPGetter func(ctx context.Context, i HTTPGetterInfo) (*http.Response, error) - -// HTTPGetterInfo is passed to an HTTPGetter function passing it parameters -// that should be used to make an HTTP GET request. -type HTTPGetterInfo struct { - // Offset specifies the start offset that should be used when - // creating the HTTP GET request's Range header - Offset int64 - - // Count specifies the count of bytes that should be used to calculate - // the end offset when creating the HTTP GET request's Range header - Count int64 - - // ETag specifies the resource's etag that should be used when creating - // the HTTP GET request's If-Match header - ETag ETag -} - -// RetryReaderOptions contains properties which can help to decide when to do retry. -type RetryReaderOptions struct { - // MaxRetryRequests specifies the maximum number of HTTP GET requests that will be made - // while reading from a RetryReader. A value of zero means that no additional HTTP - // GET requests will be made. - MaxRetryRequests int - doInjectError bool - doInjectErrorRound int -} - -// retryReader implements io.ReaderCloser methods. -// retryReader tries to read from response, and if there is retriable network error -// returned during reading, it will retry according to retry reader option through executing -// user defined action with provided data to get a new response, and continue the overall reading process -// through reading from the new response. -type retryReader struct { - ctx context.Context - response *http.Response - info HTTPGetterInfo - countWasBounded bool - o RetryReaderOptions - getter HTTPGetter -} - -// NewRetryReader creates a retry reader. -func NewRetryReader(ctx context.Context, initialResponse *http.Response, - info HTTPGetterInfo, o RetryReaderOptions, getter HTTPGetter) io.ReadCloser { - if getter == nil { - panic("getter must not be nil") - } - if info.Count < 0 { - panic("info.Count must be >= 0") - } - if o.MaxRetryRequests < 0 { - panic("o.MaxRetryRequests must be >= 0") - } - return &retryReader{ctx: ctx, getter: getter, info: info, countWasBounded: info.Count != CountToEnd, response: initialResponse, o: o} -} - -func (s *retryReader) Read(p []byte) (n int, err error) { - for try := 0; ; try++ { - //fmt.Println(try) // Comment out for debugging. - if s.countWasBounded && s.info.Count == CountToEnd { - // User specified an original count and the remaining bytes are 0, return 0, EOF - return 0, io.EOF - } - - if s.response == nil { // We don't have a response stream to read from, try to get one. - response, err := s.getter(s.ctx, s.info) - if err != nil { - return 0, err - } - // Successful GET; this is the network stream we'll read from. - s.response = response - } - n, err := s.response.Body.Read(p) // Read from the stream - - // Injection mechanism for testing. - if s.o.doInjectError && try == s.o.doInjectErrorRound { - err = &net.DNSError{IsTemporary: true} - } - - // We successfully read data or end EOF. - if err == nil || err == io.EOF { - s.info.Offset += int64(n) // Increments the start offset in case we need to make a new HTTP request in the future - if s.info.Count != CountToEnd { - s.info.Count -= int64(n) // Decrement the count in case we need to make a new HTTP request in the future - } - return n, err // Return the return to the caller - } - s.Close() // Error, close stream - s.response = nil // Our stream is no longer good - - // Check the retry count and error code, and decide whether to retry. - if try >= s.o.MaxRetryRequests { - return n, err // All retries exhausted - } - - if netErr, ok := err.(net.Error); ok && (netErr.Timeout() || netErr.Temporary()) { - continue - // Loop around and try to get and read from new stream. - } - return n, err // Not retryable, just return - } -} - -func (s *retryReader) Close() error { - if s.response != nil && s.response.Body != nil { - return s.response.Body.Close() - } - return nil -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_sas_account.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_sas_account.go deleted file mode 100644 index 8b51193f6a07..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_sas_account.go +++ /dev/null @@ -1,217 +0,0 @@ -package azblob - -import ( - "bytes" - "fmt" - "strings" - "time" -) - -// AccountSASSignatureValues is used to generate a Shared Access Signature (SAS) for an Azure Storage account. -// For more information, see https://docs.microsoft.com/rest/api/storageservices/constructing-an-account-sas -type AccountSASSignatureValues struct { - Version string `param:"sv"` // If not specified, this defaults to SASVersion - Protocol SASProtocol `param:"spr"` // See the SASProtocol* constants - StartTime time.Time `param:"st"` // Not specified if IsZero - ExpiryTime time.Time `param:"se"` // Not specified if IsZero - Permissions string `param:"sp"` // Create by initializing a AccountSASPermissions and then call String() - IPRange IPRange `param:"sip"` - Services string `param:"ss"` // Create by initializing AccountSASServices and then call String() - ResourceTypes string `param:"srt"` // Create by initializing AccountSASResourceTypes and then call String() -} - -// NewSASQueryParameters uses an account's shared key credential to sign this signature values to produce -// the proper SAS query parameters. -func (v AccountSASSignatureValues) NewSASQueryParameters(sharedKeyCredential *SharedKeyCredential) SASQueryParameters { - // https://docs.microsoft.com/en-us/rest/api/storageservices/Constructing-an-Account-SAS - if v.ExpiryTime.IsZero() || v.Permissions == "" || v.ResourceTypes == "" || v.Services == "" { - panic("Account SAS is missing at least one of these: ExpiryTime, Permissions, Service, or ResourceType") - } - if v.Version == "" { - v.Version = SASVersion - } - perms := &AccountSASPermissions{} - if err := perms.Parse(v.Permissions); err != nil { - panic(err) - } - v.Permissions = perms.String() - - startTime, expiryTime := FormatTimesForSASSigning(v.StartTime, v.ExpiryTime) - - stringToSign := strings.Join([]string{ - sharedKeyCredential.AccountName(), - v.Permissions, - v.Services, - v.ResourceTypes, - startTime, - expiryTime, - v.IPRange.String(), - string(v.Protocol), - v.Version, - ""}, // That right, the account SAS requires a terminating extra newline - "\n") - - signature := sharedKeyCredential.ComputeHMACSHA256(stringToSign) - p := SASQueryParameters{ - // Common SAS parameters - version: v.Version, - protocol: v.Protocol, - startTime: v.StartTime, - expiryTime: v.ExpiryTime, - permissions: v.Permissions, - ipRange: v.IPRange, - - // Account-specific SAS parameters - services: v.Services, - resourceTypes: v.ResourceTypes, - - // Calculated SAS signature - signature: signature, - } - return p -} - -// The AccountSASPermissions type simplifies creating the permissions string for an Azure Storage Account SAS. -// Initialize an instance of this type and then call its String method to set AccountSASSignatureValues's Permissions field. -type AccountSASPermissions struct { - Read, Write, Delete, List, Add, Create, Update, Process bool -} - -// String produces the SAS permissions string for an Azure Storage account. -// Call this method to set AccountSASSignatureValues's Permissions field. -func (p AccountSASPermissions) String() string { - var buffer bytes.Buffer - if p.Read { - buffer.WriteRune('r') - } - if p.Write { - buffer.WriteRune('w') - } - if p.Delete { - buffer.WriteRune('d') - } - if p.List { - buffer.WriteRune('l') - } - if p.Add { - buffer.WriteRune('a') - } - if p.Create { - buffer.WriteRune('c') - } - if p.Update { - buffer.WriteRune('u') - } - if p.Process { - buffer.WriteRune('p') - } - return buffer.String() -} - -// Parse initializes the AccountSASPermissions's fields from a string. -func (p *AccountSASPermissions) Parse(s string) error { - *p = AccountSASPermissions{} // Clear out the flags - for _, r := range s { - switch r { - case 'r': - p.Read = true - case 'w': - p.Write = true - case 'd': - p.Delete = true - case 'l': - p.List = true - case 'a': - p.Add = true - case 'c': - p.Create = true - case 'u': - p.Update = true - case 'p': - p.Process = true - default: - return fmt.Errorf("Invalid permission character: '%v'", r) - } - } - return nil -} - -// The AccountSASServices type simplifies creating the services string for an Azure Storage Account SAS. -// Initialize an instance of this type and then call its String method to set AccountSASSignatureValues's Services field. -type AccountSASServices struct { - Blob, Queue, File bool -} - -// String produces the SAS services string for an Azure Storage account. -// Call this method to set AccountSASSignatureValues's Services field. -func (s AccountSASServices) String() string { - var buffer bytes.Buffer - if s.Blob { - buffer.WriteRune('b') - } - if s.Queue { - buffer.WriteRune('q') - } - if s.File { - buffer.WriteRune('f') - } - return buffer.String() -} - -// Parse initializes the AccountSASServices' fields from a string. -func (a *AccountSASServices) Parse(s string) error { - *a = AccountSASServices{} // Clear out the flags - for _, r := range s { - switch r { - case 'b': - a.Blob = true - case 'q': - a.Queue = true - case 'f': - a.File = true - default: - return fmt.Errorf("Invalid service character: '%v'", r) - } - } - return nil -} - -// The AccountSASResourceTypes type simplifies creating the resource types string for an Azure Storage Account SAS. -// Initialize an instance of this type and then call its String method to set AccountSASSignatureValues's ResourceTypes field. -type AccountSASResourceTypes struct { - Service, Container, Object bool -} - -// String produces the SAS resource types string for an Azure Storage account. -// Call this method to set AccountSASSignatureValues's ResourceTypes field. -func (rt AccountSASResourceTypes) String() string { - var buffer bytes.Buffer - if rt.Service { - buffer.WriteRune('s') - } - if rt.Container { - buffer.WriteRune('c') - } - if rt.Object { - buffer.WriteRune('o') - } - return buffer.String() -} - -// Parse initializes the AccountSASResourceType's fields from a string. -func (rt *AccountSASResourceTypes) Parse(s string) error { - *rt = AccountSASResourceTypes{} // Clear out the flags - for _, r := range s { - switch r { - case 's': - rt.Service = true - case 'q': - rt.Container = true - case 'o': - rt.Object = true - default: - return fmt.Errorf("Invalid resource type: '%v'", r) - } - } - return nil -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_sas_query_params.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_sas_query_params.go deleted file mode 100644 index db10171e7535..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_sas_query_params.go +++ /dev/null @@ -1,211 +0,0 @@ -package azblob - -import ( - "net" - "net/url" - "strings" - "time" -) - -// SASVersion indicates the SAS version. -const SASVersion = ServiceVersion - -type SASProtocol string - -const ( - // SASProtocolHTTPS can be specified for a SAS protocol - SASProtocolHTTPS SASProtocol = "https" - - // SASProtocolHTTPSandHTTP can be specified for a SAS protocol - SASProtocolHTTPSandHTTP SASProtocol = "https,http" -) - -// FormatTimesForSASSigning converts a time.Time to a snapshotTimeFormat string suitable for a -// SASField's StartTime or ExpiryTime fields. Returns "" if value.IsZero(). -func FormatTimesForSASSigning(startTime, expiryTime time.Time) (string, string) { - ss := "" - if !startTime.IsZero() { - ss = startTime.Format(SASTimeFormat) // "yyyy-MM-ddTHH:mm:ssZ" - } - se := "" - if !expiryTime.IsZero() { - se = expiryTime.Format(SASTimeFormat) // "yyyy-MM-ddTHH:mm:ssZ" - } - return ss, se -} - -// SASTimeFormat represents the format of a SAS start or expiry time. Use it when formatting/parsing a time.Time. -const SASTimeFormat = "2006-01-02T15:04:05Z" //"2017-07-27T00:00:00Z" // ISO 8601 - -// https://docs.microsoft.com/en-us/rest/api/storageservices/constructing-a-service-sas - -// A SASQueryParameters object represents the components that make up an Azure Storage SAS' query parameters. -// You parse a map of query parameters into its fields by calling NewSASQueryParameters(). You add the components -// to a query parameter map by calling AddToValues(). -// NOTE: Changing any field requires computing a new SAS signature using a XxxSASSignatureValues type. -// -// This type defines the components used by all Azure Storage resources (Containers, Blobs, Files, & Queues). -type SASQueryParameters struct { - // All members are immutable or values so copies of this struct are goroutine-safe. - version string `param:"sv"` - services string `param:"ss"` - resourceTypes string `param:"srt"` - protocol SASProtocol `param:"spr"` - startTime time.Time `param:"st"` - expiryTime time.Time `param:"se"` - ipRange IPRange `param:"sip"` - identifier string `param:"si"` - resource string `param:"sr"` - permissions string `param:"sp"` - signature string `param:"sig"` -} - -func (p *SASQueryParameters) Version() string { - return p.version -} - -func (p *SASQueryParameters) Services() string { - return p.services -} -func (p *SASQueryParameters) ResourceTypes() string { - return p.resourceTypes -} -func (p *SASQueryParameters) Protocol() SASProtocol { - return p.protocol -} -func (p *SASQueryParameters) StartTime() time.Time { - return p.startTime -} -func (p *SASQueryParameters) ExpiryTime() time.Time { - return p.expiryTime -} - -func (p *SASQueryParameters) IPRange() IPRange { - return p.ipRange -} - -func (p *SASQueryParameters) Identifier() string { - return p.identifier -} - -func (p *SASQueryParameters) Resource() string { - return p.resource -} -func (p *SASQueryParameters) Permissions() string { - return p.permissions -} - -func (p *SASQueryParameters) Signature() string { - return p.signature -} - -// IPRange represents a SAS IP range's start IP and (optionally) end IP. -type IPRange struct { - Start net.IP // Not specified if length = 0 - End net.IP // Not specified if length = 0 -} - -// String returns a string representation of an IPRange. -func (ipr *IPRange) String() string { - if len(ipr.Start) == 0 { - return "" - } - start := ipr.Start.String() - if len(ipr.End) == 0 { - return start - } - return start + "-" + ipr.End.String() -} - -// NewSASQueryParameters creates and initializes a SASQueryParameters object based on the -// query parameter map's passed-in values. If deleteSASParametersFromValues is true, -// all SAS-related query parameters are removed from the passed-in map. If -// deleteSASParametersFromValues is false, the map passed-in map is unaltered. -func newSASQueryParameters(values url.Values, deleteSASParametersFromValues bool) SASQueryParameters { - p := SASQueryParameters{} - for k, v := range values { - val := v[0] - isSASKey := true - switch strings.ToLower(k) { - case "sv": - p.version = val - case "ss": - p.services = val - case "srt": - p.resourceTypes = val - case "spr": - p.protocol = SASProtocol(val) - case "st": - p.startTime, _ = time.Parse(SASTimeFormat, val) - case "se": - p.expiryTime, _ = time.Parse(SASTimeFormat, val) - case "sip": - dashIndex := strings.Index(val, "-") - if dashIndex == -1 { - p.ipRange.Start = net.ParseIP(val) - } else { - p.ipRange.Start = net.ParseIP(val[:dashIndex]) - p.ipRange.End = net.ParseIP(val[dashIndex+1:]) - } - case "si": - p.identifier = val - case "sr": - p.resource = val - case "sp": - p.permissions = val - case "sig": - p.signature = val - default: - isSASKey = false // We didn't recognize the query parameter - } - if isSASKey && deleteSASParametersFromValues { - delete(values, k) - } - } - return p -} - -// AddToValues adds the SAS components to the specified query parameters map. -func (p *SASQueryParameters) addToValues(v url.Values) url.Values { - if p.version != "" { - v.Add("sv", p.version) - } - if p.services != "" { - v.Add("ss", p.services) - } - if p.resourceTypes != "" { - v.Add("srt", p.resourceTypes) - } - if p.protocol != "" { - v.Add("spr", string(p.protocol)) - } - if !p.startTime.IsZero() { - v.Add("st", p.startTime.Format(SASTimeFormat)) - } - if !p.expiryTime.IsZero() { - v.Add("se", p.expiryTime.Format(SASTimeFormat)) - } - if len(p.ipRange.Start) > 0 { - v.Add("sip", p.ipRange.String()) - } - if p.identifier != "" { - v.Add("si", p.identifier) - } - if p.resource != "" { - v.Add("sr", p.resource) - } - if p.permissions != "" { - v.Add("sp", p.permissions) - } - if p.signature != "" { - v.Add("sig", p.signature) - } - return v -} - -// Encode encodes the SAS query parameters into URL encoded form sorted by key. -func (p *SASQueryParameters) Encode() string { - v := url.Values{} - p.addToValues(v) - return v.Encode() -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_service_codes_common.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_service_codes_common.go deleted file mode 100644 index 765beb24150f..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_service_codes_common.go +++ /dev/null @@ -1,131 +0,0 @@ -package azblob - -// https://docs.microsoft.com/en-us/rest/api/storageservices/common-rest-api-error-codes - -const ( - // ServiceCodeNone is the default value. It indicates that the error was related to the service or that the service didn't return a code. - ServiceCodeNone ServiceCodeType = "" - - // ServiceCodeAccountAlreadyExists means the specified account already exists. - ServiceCodeAccountAlreadyExists ServiceCodeType = "AccountAlreadyExists" - - // ServiceCodeAccountBeingCreated means the specified account is in the process of being created (403). - ServiceCodeAccountBeingCreated ServiceCodeType = "AccountBeingCreated" - - // ServiceCodeAccountIsDisabled means the specified account is disabled (403). - ServiceCodeAccountIsDisabled ServiceCodeType = "AccountIsDisabled" - - // ServiceCodeAuthenticationFailed means the server failed to authenticate the request. Make sure the value of the Authorization header is formed correctly including the signature (403). - ServiceCodeAuthenticationFailed ServiceCodeType = "AuthenticationFailed" - - // ServiceCodeConditionHeadersNotSupported means the condition headers are not supported (400). - ServiceCodeConditionHeadersNotSupported ServiceCodeType = "ConditionHeadersNotSupported" - - // ServiceCodeConditionNotMet means the condition specified in the conditional header(s) was not met for a read/write operation (304/412). - ServiceCodeConditionNotMet ServiceCodeType = "ConditionNotMet" - - // ServiceCodeEmptyMetadataKey means the key for one of the metadata key-value pairs is empty (400). - ServiceCodeEmptyMetadataKey ServiceCodeType = "EmptyMetadataKey" - - // ServiceCodeInsufficientAccountPermissions means read operations are currently disabled or Write operations are not allowed or The account being accessed does not have sufficient permissions to execute this operation (403). - ServiceCodeInsufficientAccountPermissions ServiceCodeType = "InsufficientAccountPermissions" - - // ServiceCodeInternalError means the server encountered an internal error. Please retry the request (500). - ServiceCodeInternalError ServiceCodeType = "InternalError" - - // ServiceCodeInvalidAuthenticationInfo means the authentication information was not provided in the correct format. Verify the value of Authorization header (400). - ServiceCodeInvalidAuthenticationInfo ServiceCodeType = "InvalidAuthenticationInfo" - - // ServiceCodeInvalidHeaderValue means the value provided for one of the HTTP headers was not in the correct format (400). - ServiceCodeInvalidHeaderValue ServiceCodeType = "InvalidHeaderValue" - - // ServiceCodeInvalidHTTPVerb means the HTTP verb specified was not recognized by the server (400). - ServiceCodeInvalidHTTPVerb ServiceCodeType = "InvalidHttpVerb" - - // ServiceCodeInvalidInput means one of the request inputs is not valid (400). - ServiceCodeInvalidInput ServiceCodeType = "InvalidInput" - - // ServiceCodeInvalidMd5 means the MD5 value specified in the request is invalid. The MD5 value must be 128 bits and Base64-encoded (400). - ServiceCodeInvalidMd5 ServiceCodeType = "InvalidMd5" - - // ServiceCodeInvalidMetadata means the specified metadata is invalid. It includes characters that are not permitted (400). - ServiceCodeInvalidMetadata ServiceCodeType = "InvalidMetadata" - - // ServiceCodeInvalidQueryParameterValue means an invalid value was specified for one of the query parameters in the request URI (400). - ServiceCodeInvalidQueryParameterValue ServiceCodeType = "InvalidQueryParameterValue" - - // ServiceCodeInvalidRange means the range specified is invalid for the current size of the resource (416). - ServiceCodeInvalidRange ServiceCodeType = "InvalidRange" - - // ServiceCodeInvalidResourceName means the specified resource name contains invalid characters (400). - ServiceCodeInvalidResourceName ServiceCodeType = "InvalidResourceName" - - // ServiceCodeInvalidURI means the requested URI does not represent any resource on the server (400). - ServiceCodeInvalidURI ServiceCodeType = "InvalidUri" - - // ServiceCodeInvalidXMLDocument means the specified XML is not syntactically valid (400). - ServiceCodeInvalidXMLDocument ServiceCodeType = "InvalidXmlDocument" - - // ServiceCodeInvalidXMLNodeValue means the value provided for one of the XML nodes in the request body was not in the correct format (400). - ServiceCodeInvalidXMLNodeValue ServiceCodeType = "InvalidXmlNodeValue" - - // ServiceCodeMd5Mismatch means the MD5 value specified in the request did not match the MD5 value calculated by the server (400). - ServiceCodeMd5Mismatch ServiceCodeType = "Md5Mismatch" - - // ServiceCodeMetadataTooLarge means the size of the specified metadata exceeds the maximum size permitted (400). - ServiceCodeMetadataTooLarge ServiceCodeType = "MetadataTooLarge" - - // ServiceCodeMissingContentLengthHeader means the Content-Length header was not specified (411). - ServiceCodeMissingContentLengthHeader ServiceCodeType = "MissingContentLengthHeader" - - // ServiceCodeMissingRequiredQueryParameter means a required query parameter was not specified for this request (400). - ServiceCodeMissingRequiredQueryParameter ServiceCodeType = "MissingRequiredQueryParameter" - - // ServiceCodeMissingRequiredHeader means a required HTTP header was not specified (400). - ServiceCodeMissingRequiredHeader ServiceCodeType = "MissingRequiredHeader" - - // ServiceCodeMissingRequiredXMLNode means a required XML node was not specified in the request body (400). - ServiceCodeMissingRequiredXMLNode ServiceCodeType = "MissingRequiredXmlNode" - - // ServiceCodeMultipleConditionHeadersNotSupported means multiple condition headers are not supported (400). - ServiceCodeMultipleConditionHeadersNotSupported ServiceCodeType = "MultipleConditionHeadersNotSupported" - - // ServiceCodeOperationTimedOut means the operation could not be completed within the permitted time (500). - ServiceCodeOperationTimedOut ServiceCodeType = "OperationTimedOut" - - // ServiceCodeOutOfRangeInput means one of the request inputs is out of range (400). - ServiceCodeOutOfRangeInput ServiceCodeType = "OutOfRangeInput" - - // ServiceCodeOutOfRangeQueryParameterValue means a query parameter specified in the request URI is outside the permissible range (400). - ServiceCodeOutOfRangeQueryParameterValue ServiceCodeType = "OutOfRangeQueryParameterValue" - - // ServiceCodeRequestBodyTooLarge means the size of the request body exceeds the maximum size permitted (413). - ServiceCodeRequestBodyTooLarge ServiceCodeType = "RequestBodyTooLarge" - - // ServiceCodeResourceTypeMismatch means the specified resource type does not match the type of the existing resource (409). - ServiceCodeResourceTypeMismatch ServiceCodeType = "ResourceTypeMismatch" - - // ServiceCodeRequestURLFailedToParse means the url in the request could not be parsed (400). - ServiceCodeRequestURLFailedToParse ServiceCodeType = "RequestUrlFailedToParse" - - // ServiceCodeResourceAlreadyExists means the specified resource already exists (409). - ServiceCodeResourceAlreadyExists ServiceCodeType = "ResourceAlreadyExists" - - // ServiceCodeResourceNotFound means the specified resource does not exist (404). - ServiceCodeResourceNotFound ServiceCodeType = "ResourceNotFound" - - // ServiceCodeServerBusy means the server is currently unable to receive requests. Please retry your request or Ingress/egress is over the account limit or operations per second is over the account limit (503). - ServiceCodeServerBusy ServiceCodeType = "ServerBusy" - - // ServiceCodeUnsupportedHeader means one of the HTTP headers specified in the request is not supported (400). - ServiceCodeUnsupportedHeader ServiceCodeType = "UnsupportedHeader" - - // ServiceCodeUnsupportedXMLNode means one of the XML nodes specified in the request body is not supported (400). - ServiceCodeUnsupportedXMLNode ServiceCodeType = "UnsupportedXmlNode" - - // ServiceCodeUnsupportedQueryParameter means one of the query parameters specified in the request URI is not supported (400). - ServiceCodeUnsupportedQueryParameter ServiceCodeType = "UnsupportedQueryParameter" - - // ServiceCodeUnsupportedHTTPVerb means the resource doesn't support the specified HTTP verb (405). - ServiceCodeUnsupportedHTTPVerb ServiceCodeType = "UnsupportedHttpVerb" -) diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_storage_error.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_storage_error.go deleted file mode 100644 index 03178b247abd..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_storage_error.go +++ /dev/null @@ -1,110 +0,0 @@ -package azblob - -import ( - "bytes" - "encoding/xml" - "fmt" - "net/http" - "sort" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -func init() { - // wire up our custom error handling constructor - responseErrorFactory = newStorageError -} - -// ServiceCodeType is a string identifying a storage service error. -// For more information, see https://docs.microsoft.com/en-us/rest/api/storageservices/status-and-error-codes2 -type ServiceCodeType string - -// StorageError identifies a responder-generated network or response parsing error. -type StorageError interface { - // ResponseError implements error's Error(), net.Error's Temporary() and Timeout() methods & Response(). - ResponseError - - // ServiceCode returns a service error code. Your code can use this to make error recovery decisions. - ServiceCode() ServiceCodeType -} - -// storageError is the internal struct that implements the public StorageError interface. -type storageError struct { - responseError - serviceCode ServiceCodeType - details map[string]string -} - -// newStorageError creates an error object that implements the error interface. -func newStorageError(cause error, response *http.Response, description string) error { - return &storageError{ - responseError: responseError{ - ErrorNode: pipeline.ErrorNode{}.Initialize(cause, 3), - response: response, - description: description, - }, - } -} - -// ServiceCode returns service-error information. The caller may examine these values but should not modify any of them. -func (e *storageError) ServiceCode() ServiceCodeType { return e.serviceCode } - -// Error implements the error interface's Error method to return a string representation of the error. -func (e *storageError) Error() string { - b := &bytes.Buffer{} - fmt.Fprintf(b, "===== RESPONSE ERROR (ServiceCode=%s) =====\n", e.serviceCode) - fmt.Fprintf(b, "Description=%s, Details: ", e.description) - if len(e.details) == 0 { - b.WriteString("(none)\n") - } else { - b.WriteRune('\n') - keys := make([]string, 0, len(e.details)) - // Alphabetize the details - for k := range e.details { - keys = append(keys, k) - } - sort.Strings(keys) - for _, k := range keys { - fmt.Fprintf(b, " %s: %+v\n", k, e.details[k]) - } - } - req := pipeline.Request{Request: e.response.Request}.Copy() // Make a copy of the response's request - pipeline.WriteRequestWithResponse(b, prepareRequestForLogging(req), e.response, nil) - return e.ErrorNode.Error(b.String()) -} - -// Temporary returns true if the error occurred due to a temporary condition (including an HTTP status of 500 or 503). -func (e *storageError) Temporary() bool { - if e.response != nil { - if (e.response.StatusCode == http.StatusInternalServerError) || (e.response.StatusCode == http.StatusServiceUnavailable) { - return true - } - } - return e.ErrorNode.Temporary() -} - -// UnmarshalXML performs custom unmarshalling of XML-formatted Azure storage request errors. -func (e *storageError) UnmarshalXML(d *xml.Decoder, start xml.StartElement) (err error) { - tokName := "" - var t xml.Token - for t, err = d.Token(); err == nil; t, err = d.Token() { - switch tt := t.(type) { - case xml.StartElement: - tokName = tt.Name.Local - break - case xml.CharData: - switch tokName { - case "Code": - e.serviceCode = ServiceCodeType(tt) - case "Message": - e.description = string(tt) - default: - if e.details == nil { - e.details = map[string]string{} - } - e.details[tokName] = string(tt) - } - } - } - return nil -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_util_validate.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_util_validate.go deleted file mode 100644 index 001a21c69651..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_util_validate.go +++ /dev/null @@ -1,61 +0,0 @@ -package azblob - -import ( - "errors" - "fmt" - "io" - "strconv" -) - -// httpRange defines a range of bytes within an HTTP resource, starting at offset and -// ending at offset+count. A zero-value httpRange indicates the entire resource. An httpRange -// which has an offset but na zero value count indicates from the offset to the resource's end. -type httpRange struct { - offset int64 - count int64 -} - -func (r httpRange) pointers() *string { - if r.offset == 0 && r.count == 0 { // Do common case first for performance - return nil // No specified range - } - if r.offset < 0 { - panic("The range offset must be >= 0") - } - if r.count < 0 { - panic("The range count must be >= 0") - } - endOffset := "" // if count == 0 - if r.count > 0 { - endOffset = strconv.FormatInt((r.offset+r.count)-1, 10) - } - dataRange := fmt.Sprintf("bytes=%v-%s", r.offset, endOffset) - return &dataRange -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -func validateSeekableStreamAt0AndGetCount(body io.ReadSeeker) int64 { - if body == nil { // nil body's are "logically" seekable to 0 and are 0 bytes long - return 0 - } - validateSeekableStreamAt0(body) - count, err := body.Seek(0, io.SeekEnd) - if err != nil { - panic("failed to seek stream") - } - body.Seek(0, io.SeekStart) - return count -} - -func validateSeekableStreamAt0(body io.ReadSeeker) { - if body == nil { // nil body's are "logically" seekable to 0 - return - } - if pos, err := body.Seek(0, io.SeekCurrent); pos != 0 || err != nil { - if err != nil { - panic(err) - } - panic(errors.New("stream must be set to position 0")) - } -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_uuid.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_uuid.go deleted file mode 100644 index 1fc7e89cf29e..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_uuid.go +++ /dev/null @@ -1,80 +0,0 @@ -package azblob - -import ( - "crypto/rand" - "fmt" - "strconv" -) - -// The UUID reserved variants. -const ( - reservedNCS byte = 0x80 - reservedRFC4122 byte = 0x40 - reservedMicrosoft byte = 0x20 - reservedFuture byte = 0x00 -) - -// A UUID representation compliant with specification in RFC 4122 document. -type uuid [16]byte - -// NewUUID returns a new uuid using RFC 4122 algorithm. -func newUUID() (u uuid) { - u = uuid{} - // Set all bits to randomly (or pseudo-randomly) chosen values. - _, err := rand.Read(u[:]) - if err != nil { - panic("ran.Read failed") - } - u[8] = (u[8] | reservedRFC4122) & 0x7F // u.setVariant(ReservedRFC4122) - - var version byte = 4 - u[6] = (u[6] & 0xF) | (version << 4) // u.setVersion(4) - return -} - -// String returns an unparsed version of the generated UUID sequence. -func (u uuid) String() string { - return fmt.Sprintf("%x-%x-%x-%x-%x", u[0:4], u[4:6], u[6:8], u[8:10], u[10:]) -} - -// ParseUUID parses a string formatted as "003020100-0504-0706-0809-0a0b0c0d0e0f" -// or "{03020100-0504-0706-0809-0a0b0c0d0e0f}" into a UUID. -func parseUUID(uuidStr string) uuid { - char := func(hexString string) byte { - i, _ := strconv.ParseUint(hexString, 16, 8) - return byte(i) - } - if uuidStr[0] == '{' { - uuidStr = uuidStr[1:] // Skip over the '{' - } - // 03020100 - 05 04 - 07 06 - 08 09 - 0a 0b 0c 0d 0e 0f - // 1 11 1 11 11 1 12 22 2 22 22 22 33 33 33 - // 01234567 8 90 12 3 45 67 8 90 12 3 45 67 89 01 23 45 - uuidVal := uuid{ - char(uuidStr[0:2]), - char(uuidStr[2:4]), - char(uuidStr[4:6]), - char(uuidStr[6:8]), - - char(uuidStr[9:11]), - char(uuidStr[11:13]), - - char(uuidStr[14:16]), - char(uuidStr[16:18]), - - char(uuidStr[19:21]), - char(uuidStr[21:23]), - - char(uuidStr[24:26]), - char(uuidStr[26:28]), - char(uuidStr[28:30]), - char(uuidStr[30:32]), - char(uuidStr[32:34]), - char(uuidStr[34:36]), - } - return uuidVal -} - -func (u uuid) bytes() []byte { - return u[:] -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zt_doc.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zt_doc.go deleted file mode 100644 index 6b3779c0e980..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zt_doc.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2017 Microsoft Corporation. All rights reserved. -// Use of this source code is governed by an MIT -// license that can be found in the LICENSE file. - -/* -Package azblob allows you to manipulate Azure Storage containers and blobs objects. - -URL Types - -The most common types you'll work with are the XxxURL types. The methods of these types make requests -against the Azure Storage Service. - - - ServiceURL's methods perform operations on a storage account. - - ContainerURL's methods perform operations on an account's container. - - BlockBlobURL's methods perform operations on a container's block blob. - - AppendBlobURL's methods perform operations on a container's append blob. - - PageBlobURL's methods perform operations on a container's page blob. - - BlobURL's methods perform operations on a container's blob regardless of the blob's type. - -Internally, each XxxURL object contains a URL and a request pipeline. The URL indicates the endpoint where each HTTP -request is sent and the pipeline indicates how the outgoing HTTP request and incoming HTTP response is processed. -The pipeline specifies things like retry policies, logging, deserialization of HTTP response payloads, and more. - -Pipelines are threadsafe and may be shared by multiple XxxURL objects. When you create a ServiceURL, you pass -an initial pipeline. When you call ServiceURL's NewContainerURL method, the new ContainerURL object has its own -URL but it shares the same pipeline as the parent ServiceURL object. - -To work with a blob, call one of ContainerURL's 4 NewXxxBlobURL methods depending on how you want to treat the blob. -To treat the blob as a block blob, append blob, or page blob, call NewBlockBlobURL, NewAppendBlobURL, or NewPageBlobURL -respectively. These three types are all identical except for the methods they expose; each type exposes the methods -relevant to the type of blob represented. If you're not sure how you want to treat a blob, you can call NewBlobURL; -this returns an object whose methods are relevant to any kind of blob. When you call ContainerURL's NewXxxBlobURL, -the new XxxBlobURL object has its own URL but it shares the same pipeline as the parent ContainerURL object. You -can easily switch between blob types (method sets) by calling a ToXxxBlobURL method. - -If you'd like to use a different pipeline with a ServiceURL, ContainerURL, or XxxBlobURL object, then call the XxxURL -object's WithPipeline method passing in the desired pipeline. The WithPipeline methods create a new XxxURL object -with the same URL as the original but with the specified pipeline. - -Note that XxxURL objects use little memory, are goroutine-safe, and many objects share the same pipeline. This means that -XxxURL objects share a lot of system resources making them very efficient. - -All of XxxURL's methods that make HTTP requests return rich error handling information so you can discern network failures, -transient failures, timeout failures, service failures, etc. See the StorageError interface for more information and an -example of how to do deal with errors. - -URL and Shared Access Signature Manipulation - -The library includes a BlobURLParts type for deconstructing and reconstructing URLs. And you can use the following types -for generating and parsing Shared Access Signature (SAS) - - Use the AccountSASSignatureValues type to create a SAS for a storage account. - - Use the BlobSASSignatureValues type to create a SAS for a container or blob. - - Use the SASQueryParameters type to turn signature values in to query parameres or to parse query parameters. - -To generate a SAS, you must use the SharedKeyCredential type. - -Credentials - -When creating a request pipeline, you must specify one of this package's credential types. - - Call the NewAnonymousCredential function for requests that contain a Shared Access Signature (SAS). - - Call the NewSharedKeyCredential function (with an account name & key) to access any account resources. You must also use this - to generate Shared Access Signatures. - -HTTP Request Policy Factories - -This package defines several request policy factories for use with the pipeline package. -Most applications will not use these factories directly; instead, the NewPipeline -function creates these factories, initializes them (via the PipelineOptions type) -and returns a pipeline object for use by the XxxURL objects. - -However, for advanced scenarios, developers can access these policy factories directly -and even create their own and then construct their own pipeline in order to affect HTTP -requests and responses performed by the XxxURL objects. For example, developers can -introduce their own logging, random failures, request recording & playback for fast -testing, HTTP request pacing, alternate retry mechanisms, metering, metrics, etc. The -possibilities are endless! - -Below are the request pipeline policy factory functions that are provided with this -package: - - NewRetryPolicyFactory Enables rich retry semantics for failed HTTP requests. - - NewRequestLogPolicyFactory Enables rich logging support for HTTP requests/responses & failures. - - NewTelemetryPolicyFactory Enables simple modification of the HTTP request's User-Agent header so each request reports the SDK version & language/runtime making the requests. - - NewUniqueRequestIDPolicyFactory Adds a x-ms-client-request-id header with a unique UUID value to an HTTP request to help with diagnosing failures. - -Also, note that all the NewXxxCredential functions return request policy factory objects which get injected into the pipeline. -*/ -package azblob - -// TokenCredential Use this to access resources using Role-Based Access Control (RBAC). diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_append_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_append_blob.go deleted file mode 100644 index 8f3dc9934973..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_append_blob.go +++ /dev/null @@ -1,234 +0,0 @@ -package azblob - -// Code generated by Microsoft (R) AutoRest Code Generator. -// Changes may cause incorrect behavior and will be lost if the code is regenerated. - -import ( - "context" - "encoding/base64" - "github.com/Azure/azure-pipeline-go/pipeline" - "io" - "io/ioutil" - "net/http" - "net/url" - "strconv" - "time" -) - -// appendBlobClient is the client for the AppendBlob methods of the Azblob service. -type appendBlobClient struct { - managementClient -} - -// newAppendBlobClient creates an instance of the appendBlobClient client. -func newAppendBlobClient(url url.URL, p pipeline.Pipeline) appendBlobClient { - return appendBlobClient{newManagementClient(url, p)} -} - -// AppendBlock the Append Block operation commits a new block of data to the end of an existing append blob. The Append -// Block operation is permitted only if the blob was created with x-ms-blob-type set to AppendBlob. Append Block is -// supported only on version 2015-02-21 version or later. -// -// body is initial data body will be closed upon successful return. Callers should ensure closure when receiving an -// error.contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more -// information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. maxSize is optional conditional header. The max length in bytes permitted for -// the append blob. If the Append Block operation would cause the blob to exceed that limit or if the blob size is -// already greater than the value specified in this header, the request will fail with MaxBlobSizeConditionNotMet error -// (HTTP status code 412 - Precondition Failed). appendPosition is optional conditional header, used only for the -// Append Block operation. A number indicating the byte offset to compare. Append Block will succeed only if the append -// position is equal to this number. If it is not, the request will fail with the AppendPositionConditionNotMet error -// (HTTP status code 412 - Precondition Failed). ifModifiedSince is specify this header value to operate only on a blob -// if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate -// only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to -// operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a -// matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded -// in the analytics logs when storage analytics logging is enabled. -func (client appendBlobClient) AppendBlock(ctx context.Context, body io.ReadSeeker, contentLength int64, timeout *int32, leaseID *string, maxSize *int64, appendPosition *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*AppendBlobAppendBlockResponse, error) { - if err := validate([]validation{ - {targetValue: body, - constraints: []constraint{{target: "body", name: null, rule: true, chain: nil}}}, - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.appendBlockPreparer(body, contentLength, timeout, leaseID, maxSize, appendPosition, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.appendBlockResponder}, req) - if err != nil { - return nil, err - } - return resp.(*AppendBlobAppendBlockResponse), err -} - -// appendBlockPreparer prepares the AppendBlock request. -func (client appendBlobClient) appendBlockPreparer(body io.ReadSeeker, contentLength int64, timeout *int32, leaseID *string, maxSize *int64, appendPosition *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, body) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "appendblock") - req.URL.RawQuery = params.Encode() - req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if maxSize != nil { - req.Header.Set("x-ms-blob-condition-maxsize", strconv.FormatInt(*maxSize, 10)) - } - if appendPosition != nil { - req.Header.Set("x-ms-blob-condition-appendpos", strconv.FormatInt(*appendPosition, 10)) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// appendBlockResponder handles the response to the AppendBlock request. -func (client appendBlobClient) appendBlockResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &AppendBlobAppendBlockResponse{rawResponse: resp.Response()}, err -} - -// Create the Create Append Blob operation creates a new append blob. -// -// contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more -// information, see Setting -// Timeouts for Blob Service Operations. blobContentType is optional. Sets the blob's content type. If specified, -// this property is stored with the blob and returned with a read request. blobContentEncoding is optional. Sets the -// blob's content encoding. If specified, this property is stored with the blob and returned with a read request. -// blobContentLanguage is optional. Set the blob's content language. If specified, this property is stored with the -// blob and returned with a read request. blobContentMD5 is optional. An MD5 hash of the blob content. Note that this -// hash is not validated, as the hashes for the individual blocks were validated when each was uploaded. -// blobCacheControl is optional. Sets the blob's cache control. If specified, this property is stored with the blob and -// returned with a read request. metadata is optional. Specifies a user-defined name-value pair associated with the -// blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the -// destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified -// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, -// metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and -// Metadata for more information. leaseID is if specified, the operation only succeeds if the container's lease is -// active and matches this ID. blobContentDisposition is optional. Sets the blob's Content-Disposition header. -// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified -// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified -// since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching value. -// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. requestID is provides a -// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage -// analytics logging is enabled. -func (client appendBlobClient) Create(ctx context.Context, contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*AppendBlobCreateResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.createPreparer(contentLength, timeout, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, blobCacheControl, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.createResponder}, req) - if err != nil { - return nil, err - } - return resp.(*AppendBlobCreateResponse), err -} - -// createPreparer prepares the Create request. -func (client appendBlobClient) createPreparer(contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - req.URL.RawQuery = params.Encode() - req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if blobContentType != nil { - req.Header.Set("x-ms-blob-content-type", *blobContentType) - } - if blobContentEncoding != nil { - req.Header.Set("x-ms-blob-content-encoding", *blobContentEncoding) - } - if blobContentLanguage != nil { - req.Header.Set("x-ms-blob-content-language", *blobContentLanguage) - } - if blobContentMD5 != nil { - req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(blobContentMD5)) - } - if blobCacheControl != nil { - req.Header.Set("x-ms-blob-cache-control", *blobCacheControl) - } - if metadata != nil { - for k, v := range metadata { - req.Header.Set("x-ms-meta-"+k, v) - } - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if blobContentDisposition != nil { - req.Header.Set("x-ms-blob-content-disposition", *blobContentDisposition) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-blob-type", "AppendBlob") - return req, nil -} - -// createResponder handles the response to the Create request. -func (client appendBlobClient) createResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &AppendBlobCreateResponse{rawResponse: resp.Response()}, err -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_blob.go deleted file mode 100644 index b2f8eac665b7..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_blob.go +++ /dev/null @@ -1,1233 +0,0 @@ -package azblob - -// Code generated by Microsoft (R) AutoRest Code Generator. -// Changes may cause incorrect behavior and will be lost if the code is regenerated. - -import ( - "context" - "encoding/base64" - "io" - "io/ioutil" - "net/http" - "net/url" - "strconv" - "time" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -// blobClient is the client for the Blob methods of the Azblob service. -type blobClient struct { - managementClient -} - -// newBlobClient creates an instance of the blobClient client. -func newBlobClient(url url.URL, p pipeline.Pipeline) blobClient { - return blobClient{newManagementClient(url, p)} -} - -// AbortCopyFromURL the Abort Copy From URL operation aborts a pending Copy From URL operation, and leaves a -// destination blob with zero length and full metadata. -// -// copyID is the copy identifier provided in the x-ms-copy-id header of the original Copy Blob operation. timeout is -// the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character -// limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client blobClient) AbortCopyFromURL(ctx context.Context, copyID string, timeout *int32, leaseID *string, requestID *string) (*BlobAbortCopyFromURLResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.abortCopyFromURLPreparer(copyID, timeout, leaseID, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.abortCopyFromURLResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlobAbortCopyFromURLResponse), err -} - -// abortCopyFromURLPreparer prepares the AbortCopyFromURL request. -func (client blobClient) abortCopyFromURLPreparer(copyID string, timeout *int32, leaseID *string, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - params.Set("copyid", copyID) - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "copy") - req.URL.RawQuery = params.Encode() - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-copy-action", "abort") - return req, nil -} - -// abortCopyFromURLResponder handles the response to the AbortCopyFromURL request. -func (client blobClient) abortCopyFromURLResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusNoContent) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlobAbortCopyFromURLResponse{rawResponse: resp.Response()}, err -} - -// AcquireLease [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete -// operations -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. duration is specifies the duration of the lease, in seconds, or negative -// one (-1) for a lease that never expires. A non-infinite lease can be between 15 and 60 seconds. A lease duration -// cannot be changed using renew or change. proposedLeaseID is proposed lease ID, in a GUID string format. The Blob -// service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor -// (String) for a list of valid GUID string formats. ifModifiedSince is specify this header value to operate only on a -// blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to -// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value -// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs -// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is -// recorded in the analytics logs when storage analytics logging is enabled. -func (client blobClient) AcquireLease(ctx context.Context, timeout *int32, duration *int32, proposedLeaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobAcquireLeaseResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.acquireLeasePreparer(timeout, duration, proposedLeaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.acquireLeaseResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlobAcquireLeaseResponse), err -} - -// acquireLeasePreparer prepares the AcquireLease request. -func (client blobClient) acquireLeasePreparer(timeout *int32, duration *int32, proposedLeaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "lease") - req.URL.RawQuery = params.Encode() - if duration != nil { - req.Header.Set("x-ms-lease-duration", strconv.FormatInt(int64(*duration), 10)) - } - if proposedLeaseID != nil { - req.Header.Set("x-ms-proposed-lease-id", *proposedLeaseID) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-lease-action", "acquire") - return req, nil -} - -// acquireLeaseResponder handles the response to the AcquireLease request. -func (client blobClient) acquireLeaseResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlobAcquireLeaseResponse{rawResponse: resp.Response()}, err -} - -// BreakLease [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete -// operations -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. breakPeriod is for a break operation, proposed duration the lease should -// continue before it is broken, in seconds, between 0 and 60. This break period is only used if it is shorter than the -// time remaining on the lease. If longer, the time remaining on the lease is used. A new lease will not be available -// before the break period has expired, but the lease may be held for longer than the break period. If this header does -// not appear with a break operation, a fixed-duration lease breaks after the remaining lease period elapses, and an -// infinite lease breaks immediately. ifModifiedSince is specify this header value to operate only on a blob if it has -// been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a -// blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only -// on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching -// value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the -// analytics logs when storage analytics logging is enabled. -func (client blobClient) BreakLease(ctx context.Context, timeout *int32, breakPeriod *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobBreakLeaseResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.breakLeasePreparer(timeout, breakPeriod, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.breakLeaseResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlobBreakLeaseResponse), err -} - -// breakLeasePreparer prepares the BreakLease request. -func (client blobClient) breakLeasePreparer(timeout *int32, breakPeriod *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "lease") - req.URL.RawQuery = params.Encode() - if breakPeriod != nil { - req.Header.Set("x-ms-lease-break-period", strconv.FormatInt(int64(*breakPeriod), 10)) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-lease-action", "break") - return req, nil -} - -// breakLeaseResponder handles the response to the BreakLease request. -func (client blobClient) breakLeaseResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusAccepted) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlobBreakLeaseResponse{rawResponse: resp.Response()}, err -} - -// ChangeLease [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete -// operations -// -// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. -// proposedLeaseID is proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the -// proposed lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID string -// formats. timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. ifModifiedSince is specify this header value to operate only on a blob if -// it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only -// on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate -// only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a -// matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded -// in the analytics logs when storage analytics logging is enabled. -func (client blobClient) ChangeLease(ctx context.Context, leaseID string, proposedLeaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobChangeLeaseResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.changeLeasePreparer(leaseID, proposedLeaseID, timeout, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.changeLeaseResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlobChangeLeaseResponse), err -} - -// changeLeasePreparer prepares the ChangeLease request. -func (client blobClient) changeLeasePreparer(leaseID string, proposedLeaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "lease") - req.URL.RawQuery = params.Encode() - req.Header.Set("x-ms-lease-id", leaseID) - req.Header.Set("x-ms-proposed-lease-id", proposedLeaseID) - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-lease-action", "change") - return req, nil -} - -// changeLeaseResponder handles the response to the ChangeLease request. -func (client blobClient) changeLeaseResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlobChangeLeaseResponse{rawResponse: resp.Response()}, err -} - -// CreateSnapshot the Create Snapshot operation creates a read-only snapshot of a blob -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. metadata is optional. Specifies a user-defined name-value pair associated -// with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or -// file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with -// the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version -// 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing -// Containers, Blobs, and Metadata for more information. ifModifiedSince is specify this header value to operate only -// on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to -// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value -// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs -// without a matching value. leaseID is if specified, the operation only succeeds if the container's lease is active -// and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character limit that is -// recorded in the analytics logs when storage analytics logging is enabled. -func (client blobClient) CreateSnapshot(ctx context.Context, timeout *int32, metadata map[string]string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, leaseID *string, requestID *string) (*BlobCreateSnapshotResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.createSnapshotPreparer(timeout, metadata, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, leaseID, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.createSnapshotResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlobCreateSnapshotResponse), err -} - -// createSnapshotPreparer prepares the CreateSnapshot request. -func (client blobClient) createSnapshotPreparer(timeout *int32, metadata map[string]string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, leaseID *string, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "snapshot") - req.URL.RawQuery = params.Encode() - if metadata != nil { - for k, v := range metadata { - req.Header.Set("x-ms-meta-"+k, v) - } - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// createSnapshotResponder handles the response to the CreateSnapshot request. -func (client blobClient) createSnapshotResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlobCreateSnapshotResponse{rawResponse: resp.Response()}, err -} - -// Delete if the storage account's soft delete feature is disabled then, when a blob is deleted, it is permanently -// removed from the storage account. If the storage account's soft delete feature is enabled, then, when a blob is -// deleted, it is marked for deletion and becomes inaccessible immediately. However, the blob service retains the blob -// or snapshot for the number of days specified by the DeleteRetentionPolicy section of [Storage service properties] -// (Set-Blob-Service-Properties.md). After the specified number of days has passed, the blob's data is permanently -// removed from the storage account. Note that you continue to be charged for the soft-deleted blob's storage until it -// is permanently removed. Use the List Blobs API and specify the "include=deleted" query parameter to discover which -// blobs and snapshots have been soft deleted. You can then use the Undelete Blob API to restore a soft-deleted blob. -// All other operations on a soft-deleted blob or snapshot causes the service to return an HTTP status code of 404 -// (ResourceNotFound). -// -// snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to -// retrieve. For more information on working with blob snapshots, see Creating -// a Snapshot of a Blob. timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. deleteSnapshots is required if the blob has associated snapshots. Specify one -// of the following two options: include: Delete the base blob and all of its snapshots. only: Delete only the blob's -// snapshots and not the blob itself ifModifiedSince is specify this header value to operate only on a blob if it has -// been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a -// blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only -// on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching -// value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the -// analytics logs when storage analytics logging is enabled. -func (client blobClient) Delete(ctx context.Context, snapshot *string, timeout *int32, leaseID *string, deleteSnapshots DeleteSnapshotsOptionType, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobDeleteResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.deletePreparer(snapshot, timeout, leaseID, deleteSnapshots, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.deleteResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlobDeleteResponse), err -} - -// deletePreparer prepares the Delete request. -func (client blobClient) deletePreparer(snapshot *string, timeout *int32, leaseID *string, deleteSnapshots DeleteSnapshotsOptionType, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("DELETE", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if snapshot != nil && len(*snapshot) > 0 { - params.Set("snapshot", *snapshot) - } - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - req.URL.RawQuery = params.Encode() - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if deleteSnapshots != DeleteSnapshotsOptionNone { - req.Header.Set("x-ms-delete-snapshots", string(deleteSnapshots)) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// deleteResponder handles the response to the Delete request. -func (client blobClient) deleteResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusAccepted) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlobDeleteResponse{rawResponse: resp.Response()}, err -} - -// Download the Download operation reads or downloads a blob from the system, including its metadata and properties. -// You can also call Download to read a snapshot. -// -// snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to -// retrieve. For more information on working with blob snapshots, see Creating -// a Snapshot of a Blob. timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. rangeParameter is return only the bytes of the blob in the specified -// range. leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. -// rangeGetContentMD5 is when set to true and specified together with the Range, the service returns the MD5 hash for -// the range, as long as the range is less than or equal to 4 MB in size. ifModifiedSince is specify this header value -// to operate only on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this -// header value to operate only on a blob if it has not been modified since the specified date/time. ifMatches is -// specify an ETag value to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to -// operate only on blobs without a matching value. requestID is provides a client-generated, opaque value with a 1 KB -// character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client blobClient) Download(ctx context.Context, snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, rangeGetContentMD5 *bool, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*downloadResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.downloadPreparer(snapshot, timeout, rangeParameter, leaseID, rangeGetContentMD5, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.downloadResponder}, req) - if err != nil { - return nil, err - } - return resp.(*downloadResponse), err -} - -// downloadPreparer prepares the Download request. -func (client blobClient) downloadPreparer(snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, rangeGetContentMD5 *bool, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("GET", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if snapshot != nil && len(*snapshot) > 0 { - params.Set("snapshot", *snapshot) - } - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - req.URL.RawQuery = params.Encode() - if rangeParameter != nil { - req.Header.Set("x-ms-range", *rangeParameter) - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if rangeGetContentMD5 != nil { - req.Header.Set("x-ms-range-get-content-md5", strconv.FormatBool(*rangeGetContentMD5)) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// downloadResponder handles the response to the Download request. -func (client blobClient) downloadResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusPartialContent) - if resp == nil { - return nil, err - } - return &downloadResponse{rawResponse: resp.Response()}, err -} - -// GetProperties the Get Properties operation returns all user-defined metadata, standard HTTP properties, and system -// properties for the blob. It does not return the content of the blob. -// -// snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to -// retrieve. For more information on working with blob snapshots, see Creating -// a Snapshot of a Blob. timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it -// has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a -// blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only -// on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching -// value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the -// analytics logs when storage analytics logging is enabled. -func (client blobClient) GetProperties(ctx context.Context, snapshot *string, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobGetPropertiesResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.getPropertiesPreparer(snapshot, timeout, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getPropertiesResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlobGetPropertiesResponse), err -} - -// getPropertiesPreparer prepares the GetProperties request. -func (client blobClient) getPropertiesPreparer(snapshot *string, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("HEAD", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if snapshot != nil && len(*snapshot) > 0 { - params.Set("snapshot", *snapshot) - } - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - req.URL.RawQuery = params.Encode() - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// getPropertiesResponder handles the response to the GetProperties request. -func (client blobClient) getPropertiesResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlobGetPropertiesResponse{rawResponse: resp.Response()}, err -} - -// ReleaseLease [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete -// operations -// -// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. timeout -// is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. ifModifiedSince is specify this header value to operate only on a blob if -// it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only -// on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate -// only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a -// matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded -// in the analytics logs when storage analytics logging is enabled. -func (client blobClient) ReleaseLease(ctx context.Context, leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobReleaseLeaseResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.releaseLeasePreparer(leaseID, timeout, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.releaseLeaseResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlobReleaseLeaseResponse), err -} - -// releaseLeasePreparer prepares the ReleaseLease request. -func (client blobClient) releaseLeasePreparer(leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "lease") - req.URL.RawQuery = params.Encode() - req.Header.Set("x-ms-lease-id", leaseID) - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-lease-action", "release") - return req, nil -} - -// releaseLeaseResponder handles the response to the ReleaseLease request. -func (client blobClient) releaseLeaseResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlobReleaseLeaseResponse{rawResponse: resp.Response()}, err -} - -// RenewLease [Update] The Lease Blob operation establishes and manages a lock on a blob for write and delete -// operations -// -// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. timeout -// is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. ifModifiedSince is specify this header value to operate only on a blob if -// it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only -// on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate -// only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a -// matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded -// in the analytics logs when storage analytics logging is enabled. -func (client blobClient) RenewLease(ctx context.Context, leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobRenewLeaseResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.renewLeasePreparer(leaseID, timeout, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.renewLeaseResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlobRenewLeaseResponse), err -} - -// renewLeasePreparer prepares the RenewLease request. -func (client blobClient) renewLeasePreparer(leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "lease") - req.URL.RawQuery = params.Encode() - req.Header.Set("x-ms-lease-id", leaseID) - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-lease-action", "renew") - return req, nil -} - -// renewLeaseResponder handles the response to the RenewLease request. -func (client blobClient) renewLeaseResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlobRenewLeaseResponse{rawResponse: resp.Response()}, err -} - -// SetHTTPHeaders the Set HTTP Headers operation sets system properties on the blob -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. blobCacheControl is optional. Sets the blob's cache control. If specified, -// this property is stored with the blob and returned with a read request. blobContentType is optional. Sets the blob's -// content type. If specified, this property is stored with the blob and returned with a read request. blobContentMD5 -// is optional. An MD5 hash of the blob content. Note that this hash is not validated, as the hashes for the individual -// blocks were validated when each was uploaded. blobContentEncoding is optional. Sets the blob's content encoding. If -// specified, this property is stored with the blob and returned with a read request. blobContentLanguage is optional. -// Set the blob's content language. If specified, this property is stored with the blob and returned with a read -// request. leaseID is if specified, the operation only succeeds if the container's lease is active and matches this -// ID. ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the -// specified date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been -// modified since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching -// value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. -// blobContentDisposition is optional. Sets the blob's Content-Disposition header. requestID is provides a -// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage -// analytics logging is enabled. -func (client blobClient) SetHTTPHeaders(ctx context.Context, timeout *int32, blobCacheControl *string, blobContentType *string, blobContentMD5 []byte, blobContentEncoding *string, blobContentLanguage *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobContentDisposition *string, requestID *string) (*BlobSetHTTPHeadersResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.setHTTPHeadersPreparer(timeout, blobCacheControl, blobContentType, blobContentMD5, blobContentEncoding, blobContentLanguage, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, blobContentDisposition, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.setHTTPHeadersResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlobSetHTTPHeadersResponse), err -} - -// setHTTPHeadersPreparer prepares the SetHTTPHeaders request. -func (client blobClient) setHTTPHeadersPreparer(timeout *int32, blobCacheControl *string, blobContentType *string, blobContentMD5 []byte, blobContentEncoding *string, blobContentLanguage *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobContentDisposition *string, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "properties") - req.URL.RawQuery = params.Encode() - if blobCacheControl != nil { - req.Header.Set("x-ms-blob-cache-control", *blobCacheControl) - } - if blobContentType != nil { - req.Header.Set("x-ms-blob-content-type", *blobContentType) - } - if blobContentMD5 != nil { - req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(blobContentMD5)) - } - if blobContentEncoding != nil { - req.Header.Set("x-ms-blob-content-encoding", *blobContentEncoding) - } - if blobContentLanguage != nil { - req.Header.Set("x-ms-blob-content-language", *blobContentLanguage) - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - if blobContentDisposition != nil { - req.Header.Set("x-ms-blob-content-disposition", *blobContentDisposition) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// setHTTPHeadersResponder handles the response to the SetHTTPHeaders request. -func (client blobClient) setHTTPHeadersResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlobSetHTTPHeadersResponse{rawResponse: resp.Response()}, err -} - -// SetMetadata the Set Blob Metadata operation sets user-defined metadata for the specified blob as one or more -// name-value pairs -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. metadata is optional. Specifies a user-defined name-value pair associated -// with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or -// file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with -// the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version -// 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing -// Containers, Blobs, and Metadata for more information. leaseID is if specified, the operation only succeeds if the -// container's lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a -// blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to -// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value -// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs -// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is -// recorded in the analytics logs when storage analytics logging is enabled. -func (client blobClient) SetMetadata(ctx context.Context, timeout *int32, metadata map[string]string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlobSetMetadataResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.setMetadataPreparer(timeout, metadata, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.setMetadataResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlobSetMetadataResponse), err -} - -// setMetadataPreparer prepares the SetMetadata request. -func (client blobClient) setMetadataPreparer(timeout *int32, metadata map[string]string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "metadata") - req.URL.RawQuery = params.Encode() - if metadata != nil { - for k, v := range metadata { - req.Header.Set("x-ms-meta-"+k, v) - } - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// setMetadataResponder handles the response to the SetMetadata request. -func (client blobClient) setMetadataResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlobSetMetadataResponse{rawResponse: resp.Response()}, err -} - -// SetTier the Set Tier operation sets the tier on a blob. The operation is allowed on a page blob in a premium storage -// account and on a block blob in a blob storage account (locally redundant storage only). A premium page blob's tier -// determines the allowed size, IOPS, and bandwidth of the blob. A block blob's tier determines Hot/Cool/Archive -// storage type. This operation does not update the blob's ETag. -// -// tier is indicates the tier to be set on the blob. timeout is the timeout parameter is expressed in seconds. For more -// information, see Setting -// Timeouts for Blob Service Operations. requestID is provides a client-generated, opaque value with a 1 KB -// character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client blobClient) SetTier(ctx context.Context, tier AccessTierType, timeout *int32, requestID *string) (*BlobSetTierResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.setTierPreparer(tier, timeout, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.setTierResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlobSetTierResponse), err -} - -// setTierPreparer prepares the SetTier request. -func (client blobClient) setTierPreparer(tier AccessTierType, timeout *int32, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "tier") - req.URL.RawQuery = params.Encode() - req.Header.Set("x-ms-access-tier", string(tier)) - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// setTierResponder handles the response to the SetTier request. -func (client blobClient) setTierResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusAccepted) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlobSetTierResponse{rawResponse: resp.Response()}, err -} - -// StartCopyFromURL the Start Copy From URL operation copies a blob or an internet resource to a new blob. -// -// copySource is specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that -// specifies a page blob snapshot. The value should be URL-encoded as it would appear in a request URI. The source blob -// must either be public or must be authenticated via a shared access signature. timeout is the timeout parameter is -// expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. metadata is optional. Specifies a user-defined name-value pair associated -// with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or -// file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with -// the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version -// 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing -// Containers, Blobs, and Metadata for more information. sourceIfModifiedSince is specify this header value to operate -// only on a blob if it has been modified since the specified date/time. sourceIfUnmodifiedSince is specify this header -// value to operate only on a blob if it has not been modified since the specified date/time. sourceIfMatches is -// specify an ETag value to operate only on blobs with a matching value. sourceIfNoneMatch is specify an ETag value to -// operate only on blobs without a matching value. ifModifiedSince is specify this header value to operate only on a -// blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to -// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value -// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs -// without a matching value. leaseID is if specified, the operation only succeeds if the container's lease is active -// and matches this ID. sourceLeaseID is specify this header to perform the operation only if the lease ID given -// matches the active lease ID of the source blob. requestID is provides a client-generated, opaque value with a 1 KB -// character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client blobClient) StartCopyFromURL(ctx context.Context, copySource string, timeout *int32, metadata map[string]string, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatches *ETag, sourceIfNoneMatch *ETag, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, leaseID *string, sourceLeaseID *string, requestID *string) (*BlobStartCopyFromURLResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.startCopyFromURLPreparer(copySource, timeout, metadata, sourceIfModifiedSince, sourceIfUnmodifiedSince, sourceIfMatches, sourceIfNoneMatch, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, leaseID, sourceLeaseID, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.startCopyFromURLResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlobStartCopyFromURLResponse), err -} - -// startCopyFromURLPreparer prepares the StartCopyFromURL request. -func (client blobClient) startCopyFromURLPreparer(copySource string, timeout *int32, metadata map[string]string, sourceIfModifiedSince *time.Time, sourceIfUnmodifiedSince *time.Time, sourceIfMatches *ETag, sourceIfNoneMatch *ETag, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, leaseID *string, sourceLeaseID *string, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - req.URL.RawQuery = params.Encode() - if metadata != nil { - for k, v := range metadata { - req.Header.Set("x-ms-meta-"+k, v) - } - } - if sourceIfModifiedSince != nil { - req.Header.Set("x-ms-source-if-modified-since", (*sourceIfModifiedSince).In(gmt).Format(time.RFC1123)) - } - if sourceIfUnmodifiedSince != nil { - req.Header.Set("x-ms-source-if-unmodified-since", (*sourceIfUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if sourceIfMatches != nil { - req.Header.Set("x-ms-source-if-match", string(*sourceIfMatches)) - } - if sourceIfNoneMatch != nil { - req.Header.Set("x-ms-source-if-none-match", string(*sourceIfNoneMatch)) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-copy-source", copySource) - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if sourceLeaseID != nil { - req.Header.Set("x-ms-source-lease-id", *sourceLeaseID) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// startCopyFromURLResponder handles the response to the StartCopyFromURL request. -func (client blobClient) startCopyFromURLResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusAccepted) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlobStartCopyFromURLResponse{rawResponse: resp.Response()}, err -} - -// Undelete undelete a blob that was previously soft deleted -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. requestID is provides a client-generated, opaque value with a 1 KB -// character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client blobClient) Undelete(ctx context.Context, timeout *int32, requestID *string) (*BlobUndeleteResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.undeletePreparer(timeout, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.undeleteResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlobUndeleteResponse), err -} - -// undeletePreparer prepares the Undelete request. -func (client blobClient) undeletePreparer(timeout *int32, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "undelete") - req.URL.RawQuery = params.Encode() - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// undeleteResponder handles the response to the Undelete request. -func (client blobClient) undeleteResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlobUndeleteResponse{rawResponse: resp.Response()}, err -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_block_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_block_blob.go deleted file mode 100644 index 4e75dcea337e..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_block_blob.go +++ /dev/null @@ -1,498 +0,0 @@ -package azblob - -// Code generated by Microsoft (R) AutoRest Code Generator. -// Changes may cause incorrect behavior and will be lost if the code is regenerated. - -import ( - "bytes" - "context" - "encoding/base64" - "encoding/xml" - "github.com/Azure/azure-pipeline-go/pipeline" - "io" - "io/ioutil" - "net/http" - "net/url" - "strconv" - "time" -) - -// blockBlobClient is the client for the BlockBlob methods of the Azblob service. -type blockBlobClient struct { - managementClient -} - -// newBlockBlobClient creates an instance of the blockBlobClient client. -func newBlockBlobClient(url url.URL, p pipeline.Pipeline) blockBlobClient { - return blockBlobClient{newManagementClient(url, p)} -} - -// CommitBlockList the Commit Block List operation writes a blob by specifying the list of block IDs that make up the -// blob. In order to be written as part of a blob, a block must have been successfully written to the server in a prior -// Put Block operation. You can call Put Block List to update a blob by uploading only those blocks that have changed, -// then committing the new and existing blocks together. You can do this by specifying whether to commit a block from -// the committed block list or from the uncommitted block list, or to commit the most recently uploaded version of the -// block, whichever list it may belong to. -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. blobCacheControl is optional. Sets the blob's cache control. If specified, -// this property is stored with the blob and returned with a read request. blobContentType is optional. Sets the blob's -// content type. If specified, this property is stored with the blob and returned with a read request. -// blobContentEncoding is optional. Sets the blob's content encoding. If specified, this property is stored with the -// blob and returned with a read request. blobContentLanguage is optional. Set the blob's content language. If -// specified, this property is stored with the blob and returned with a read request. blobContentMD5 is optional. An -// MD5 hash of the blob content. Note that this hash is not validated, as the hashes for the individual blocks were -// validated when each was uploaded. metadata is optional. Specifies a user-defined name-value pair associated with the -// blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the -// destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified -// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, -// metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and -// Metadata for more information. leaseID is if specified, the operation only succeeds if the container's lease is -// active and matches this ID. blobContentDisposition is optional. Sets the blob's Content-Disposition header. -// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified -// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified -// since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching value. -// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. requestID is provides a -// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage -// analytics logging is enabled. -func (client blockBlobClient) CommitBlockList(ctx context.Context, blocks BlockLookupList, timeout *int32, blobCacheControl *string, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlockBlobCommitBlockListResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.commitBlockListPreparer(blocks, timeout, blobCacheControl, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.commitBlockListResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlockBlobCommitBlockListResponse), err -} - -// commitBlockListPreparer prepares the CommitBlockList request. -func (client blockBlobClient) commitBlockListPreparer(blocks BlockLookupList, timeout *int32, blobCacheControl *string, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "blocklist") - req.URL.RawQuery = params.Encode() - if blobCacheControl != nil { - req.Header.Set("x-ms-blob-cache-control", *blobCacheControl) - } - if blobContentType != nil { - req.Header.Set("x-ms-blob-content-type", *blobContentType) - } - if blobContentEncoding != nil { - req.Header.Set("x-ms-blob-content-encoding", *blobContentEncoding) - } - if blobContentLanguage != nil { - req.Header.Set("x-ms-blob-content-language", *blobContentLanguage) - } - if blobContentMD5 != nil { - req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(blobContentMD5)) - } - if metadata != nil { - for k, v := range metadata { - req.Header.Set("x-ms-meta-"+k, v) - } - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if blobContentDisposition != nil { - req.Header.Set("x-ms-blob-content-disposition", *blobContentDisposition) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - b, err := xml.Marshal(blocks) - if err != nil { - return req, pipeline.NewError(err, "failed to marshal request body") - } - req.Header.Set("Content-Type", "application/xml") - err = req.SetBody(bytes.NewReader(b)) - if err != nil { - return req, pipeline.NewError(err, "failed to set request body") - } - return req, nil -} - -// commitBlockListResponder handles the response to the CommitBlockList request. -func (client blockBlobClient) commitBlockListResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlockBlobCommitBlockListResponse{rawResponse: resp.Response()}, err -} - -// GetBlockList the Get Block List operation retrieves the list of blocks that have been uploaded as part of a block -// blob -// -// listType is specifies whether to return the list of committed blocks, the list of uncommitted blocks, or both lists -// together. snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob -// snapshot to retrieve. For more information on working with blob snapshots, see Creating -// a Snapshot of a Blob. timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character -// limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client blockBlobClient) GetBlockList(ctx context.Context, listType BlockListType, snapshot *string, timeout *int32, leaseID *string, requestID *string) (*BlockList, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.getBlockListPreparer(listType, snapshot, timeout, leaseID, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getBlockListResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlockList), err -} - -// getBlockListPreparer prepares the GetBlockList request. -func (client blockBlobClient) getBlockListPreparer(listType BlockListType, snapshot *string, timeout *int32, leaseID *string, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("GET", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if snapshot != nil && len(*snapshot) > 0 { - params.Set("snapshot", *snapshot) - } - params.Set("blocklisttype", string(listType)) - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "blocklist") - req.URL.RawQuery = params.Encode() - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// getBlockListResponder handles the response to the GetBlockList request. -func (client blockBlobClient) getBlockListResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - result := &BlockList{rawResponse: resp.Response()} - if err != nil { - return result, err - } - defer resp.Response().Body.Close() - b, err := ioutil.ReadAll(resp.Response().Body) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") - } - if len(b) > 0 { - b = removeBOM(b) - err = xml.Unmarshal(b, result) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to unmarshal response body") - } - } - return result, nil -} - -// StageBlock the Stage Block operation creates a new block to be committed as part of a blob -// -// blockID is a valid Base64 string value that identifies the block. Prior to encoding, the string must be less than or -// equal to 64 bytes in size. For a given blob, the length of the value specified for the blockid parameter must be the -// same size for each block. contentLength is the length of the request. body is initial data body will be closed upon -// successful return. Callers should ensure closure when receiving an error.timeout is the timeout parameter is -// expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character -// limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client blockBlobClient) StageBlock(ctx context.Context, blockID string, contentLength int64, body io.ReadSeeker, timeout *int32, leaseID *string, requestID *string) (*BlockBlobStageBlockResponse, error) { - if err := validate([]validation{ - {targetValue: body, - constraints: []constraint{{target: "body", name: null, rule: true, chain: nil}}}, - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.stageBlockPreparer(blockID, contentLength, body, timeout, leaseID, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.stageBlockResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlockBlobStageBlockResponse), err -} - -// stageBlockPreparer prepares the StageBlock request. -func (client blockBlobClient) stageBlockPreparer(blockID string, contentLength int64, body io.ReadSeeker, timeout *int32, leaseID *string, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, body) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - params.Set("blockid", blockID) - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "block") - req.URL.RawQuery = params.Encode() - req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// stageBlockResponder handles the response to the StageBlock request. -func (client blockBlobClient) stageBlockResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlockBlobStageBlockResponse{rawResponse: resp.Response()}, err -} - -// StageBlockFromURL the Stage Block operation creates a new block to be committed as part of a blob where the contents -// are read from a URL. -// -// blockID is a valid Base64 string value that identifies the block. Prior to encoding, the string must be less than or -// equal to 64 bytes in size. For a given blob, the length of the value specified for the blockid parameter must be the -// same size for each block. contentLength is the length of the request. sourceURL is specifiy an URL to the copy -// source. sourceRange is bytes of source data in the specified range. sourceContentMD5 is specify the md5 calculated -// for the range of bytes that must be read from the copy source. timeout is the timeout parameter is expressed in -// seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character -// limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client blockBlobClient) StageBlockFromURL(ctx context.Context, blockID string, contentLength int64, sourceURL *string, sourceRange *string, sourceContentMD5 []byte, timeout *int32, leaseID *string, requestID *string) (*BlockBlobStageBlockFromURLResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.stageBlockFromURLPreparer(blockID, contentLength, sourceURL, sourceRange, sourceContentMD5, timeout, leaseID, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.stageBlockFromURLResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlockBlobStageBlockFromURLResponse), err -} - -// stageBlockFromURLPreparer prepares the StageBlockFromURL request. -func (client blockBlobClient) stageBlockFromURLPreparer(blockID string, contentLength int64, sourceURL *string, sourceRange *string, sourceContentMD5 []byte, timeout *int32, leaseID *string, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - params.Set("blockid", blockID) - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "block") - req.URL.RawQuery = params.Encode() - req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if sourceURL != nil { - req.Header.Set("x-ms-copy-source", *sourceURL) - } - if sourceRange != nil { - req.Header.Set("x-ms-source-range", *sourceRange) - } - if sourceContentMD5 != nil { - req.Header.Set("x-ms-source-content-md5", base64.StdEncoding.EncodeToString(sourceContentMD5)) - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// stageBlockFromURLResponder handles the response to the StageBlockFromURL request. -func (client blockBlobClient) stageBlockFromURLResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlockBlobStageBlockFromURLResponse{rawResponse: resp.Response()}, err -} - -// Upload the Upload Block Blob operation updates the content of an existing block blob. Updating an existing block -// blob overwrites any existing metadata on the blob. Partial updates are not supported with Put Blob; the content of -// the existing blob is overwritten with the content of the new blob. To perform a partial update of the content of a -// block blob, use the Put Block List operation. -// -// body is initial data body will be closed upon successful return. Callers should ensure closure when receiving an -// error.contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more -// information, see Setting -// Timeouts for Blob Service Operations. blobContentType is optional. Sets the blob's content type. If specified, -// this property is stored with the blob and returned with a read request. blobContentEncoding is optional. Sets the -// blob's content encoding. If specified, this property is stored with the blob and returned with a read request. -// blobContentLanguage is optional. Set the blob's content language. If specified, this property is stored with the -// blob and returned with a read request. blobContentMD5 is optional. An MD5 hash of the blob content. Note that this -// hash is not validated, as the hashes for the individual blocks were validated when each was uploaded. -// blobCacheControl is optional. Sets the blob's cache control. If specified, this property is stored with the blob and -// returned with a read request. metadata is optional. Specifies a user-defined name-value pair associated with the -// blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the -// destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified -// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, -// metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and -// Metadata for more information. leaseID is if specified, the operation only succeeds if the container's lease is -// active and matches this ID. blobContentDisposition is optional. Sets the blob's Content-Disposition header. -// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified -// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified -// since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching value. -// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. requestID is provides a -// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage -// analytics logging is enabled. -func (client blockBlobClient) Upload(ctx context.Context, body io.ReadSeeker, contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*BlockBlobUploadResponse, error) { - if err := validate([]validation{ - {targetValue: body, - constraints: []constraint{{target: "body", name: null, rule: true, chain: nil}}}, - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.uploadPreparer(body, contentLength, timeout, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, blobCacheControl, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.uploadResponder}, req) - if err != nil { - return nil, err - } - return resp.(*BlockBlobUploadResponse), err -} - -// uploadPreparer prepares the Upload request. -func (client blockBlobClient) uploadPreparer(body io.ReadSeeker, contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, body) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - req.URL.RawQuery = params.Encode() - req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if blobContentType != nil { - req.Header.Set("x-ms-blob-content-type", *blobContentType) - } - if blobContentEncoding != nil { - req.Header.Set("x-ms-blob-content-encoding", *blobContentEncoding) - } - if blobContentLanguage != nil { - req.Header.Set("x-ms-blob-content-language", *blobContentLanguage) - } - if blobContentMD5 != nil { - req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(blobContentMD5)) - } - if blobCacheControl != nil { - req.Header.Set("x-ms-blob-cache-control", *blobCacheControl) - } - if metadata != nil { - for k, v := range metadata { - req.Header.Set("x-ms-meta-"+k, v) - } - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if blobContentDisposition != nil { - req.Header.Set("x-ms-blob-content-disposition", *blobContentDisposition) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-blob-type", "BlockBlob") - return req, nil -} - -// uploadResponder handles the response to the Upload request. -func (client blockBlobClient) uploadResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &BlockBlobUploadResponse{rawResponse: resp.Response()}, err -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_client.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_client.go deleted file mode 100644 index b42a79b1571c..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_client.go +++ /dev/null @@ -1,38 +0,0 @@ -package azblob - -// Code generated by Microsoft (R) AutoRest Code Generator. -// Changes may cause incorrect behavior and will be lost if the code is regenerated. - -import ( - "github.com/Azure/azure-pipeline-go/pipeline" - "net/url" -) - -const ( - // ServiceVersion specifies the version of the operations used in this package. - ServiceVersion = "2018-03-28" -) - -// managementClient is the base client for Azblob. -type managementClient struct { - url url.URL - p pipeline.Pipeline -} - -// newManagementClient creates an instance of the managementClient client. -func newManagementClient(url url.URL, p pipeline.Pipeline) managementClient { - return managementClient{ - url: url, - p: p, - } -} - -// URL returns a copy of the URL for this client. -func (mc managementClient) URL() url.URL { - return mc.url -} - -// Pipeline returns the pipeline for this client. -func (mc managementClient) Pipeline() pipeline.Pipeline { - return mc.p -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_container.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_container.go deleted file mode 100644 index 3e744fcbedb9..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_container.go +++ /dev/null @@ -1,1006 +0,0 @@ -package azblob - -// Code generated by Microsoft (R) AutoRest Code Generator. -// Changes may cause incorrect behavior and will be lost if the code is regenerated. - -import ( - "bytes" - "context" - "encoding/xml" - "io" - "io/ioutil" - "net/http" - "net/url" - "strconv" - "time" - - "github.com/Azure/azure-pipeline-go/pipeline" -) - -// containerClient is the client for the Container methods of the Azblob service. -type containerClient struct { - managementClient -} - -// newContainerClient creates an instance of the containerClient client. -func newContainerClient(url url.URL, p pipeline.Pipeline) containerClient { - return containerClient{newManagementClient(url, p)} -} - -// AcquireLease [Update] establishes and manages a lock on a container for delete operations. The lock duration can be -// 15 to 60 seconds, or can be infinite -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. duration is specifies the duration of the lease, in seconds, or negative -// one (-1) for a lease that never expires. A non-infinite lease can be between 15 and 60 seconds. A lease duration -// cannot be changed using renew or change. proposedLeaseID is proposed lease ID, in a GUID string format. The Blob -// service returns 400 (Invalid request) if the proposed lease ID is not in the correct format. See Guid Constructor -// (String) for a list of valid GUID string formats. ifModifiedSince is specify this header value to operate only on a -// blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to -// operate only on a blob if it has not been modified since the specified date/time. requestID is provides a -// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage -// analytics logging is enabled. -func (client containerClient) AcquireLease(ctx context.Context, timeout *int32, duration *int32, proposedLeaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (*ContainerAcquireLeaseResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.acquireLeasePreparer(timeout, duration, proposedLeaseID, ifModifiedSince, ifUnmodifiedSince, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.acquireLeaseResponder}, req) - if err != nil { - return nil, err - } - return resp.(*ContainerAcquireLeaseResponse), err -} - -// acquireLeasePreparer prepares the AcquireLease request. -func (client containerClient) acquireLeasePreparer(timeout *int32, duration *int32, proposedLeaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "lease") - params.Set("restype", "container") - req.URL.RawQuery = params.Encode() - if duration != nil { - req.Header.Set("x-ms-lease-duration", strconv.FormatInt(int64(*duration), 10)) - } - if proposedLeaseID != nil { - req.Header.Set("x-ms-proposed-lease-id", *proposedLeaseID) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-lease-action", "acquire") - return req, nil -} - -// acquireLeaseResponder handles the response to the AcquireLease request. -func (client containerClient) acquireLeaseResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &ContainerAcquireLeaseResponse{rawResponse: resp.Response()}, err -} - -// BreakLease [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 -// to 60 seconds, or can be infinite -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. breakPeriod is for a break operation, proposed duration the lease should -// continue before it is broken, in seconds, between 0 and 60. This break period is only used if it is shorter than the -// time remaining on the lease. If longer, the time remaining on the lease is used. A new lease will not be available -// before the break period has expired, but the lease may be held for longer than the break period. If this header does -// not appear with a break operation, a fixed-duration lease breaks after the remaining lease period elapses, and an -// infinite lease breaks immediately. ifModifiedSince is specify this header value to operate only on a blob if it has -// been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a -// blob if it has not been modified since the specified date/time. requestID is provides a client-generated, opaque -// value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client containerClient) BreakLease(ctx context.Context, timeout *int32, breakPeriod *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (*ContainerBreakLeaseResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.breakLeasePreparer(timeout, breakPeriod, ifModifiedSince, ifUnmodifiedSince, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.breakLeaseResponder}, req) - if err != nil { - return nil, err - } - return resp.(*ContainerBreakLeaseResponse), err -} - -// breakLeasePreparer prepares the BreakLease request. -func (client containerClient) breakLeasePreparer(timeout *int32, breakPeriod *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "lease") - params.Set("restype", "container") - req.URL.RawQuery = params.Encode() - if breakPeriod != nil { - req.Header.Set("x-ms-lease-break-period", strconv.FormatInt(int64(*breakPeriod), 10)) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-lease-action", "break") - return req, nil -} - -// breakLeaseResponder handles the response to the BreakLease request. -func (client containerClient) breakLeaseResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusAccepted) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &ContainerBreakLeaseResponse{rawResponse: resp.Response()}, err -} - -// ChangeLease [Update] establishes and manages a lock on a container for delete operations. The lock duration can be -// 15 to 60 seconds, or can be infinite -// -// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. -// proposedLeaseID is proposed lease ID, in a GUID string format. The Blob service returns 400 (Invalid request) if the -// proposed lease ID is not in the correct format. See Guid Constructor (String) for a list of valid GUID string -// formats. timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. ifModifiedSince is specify this header value to operate only on a blob if -// it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only -// on a blob if it has not been modified since the specified date/time. requestID is provides a client-generated, -// opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is -// enabled. -func (client containerClient) ChangeLease(ctx context.Context, leaseID string, proposedLeaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (*ContainerChangeLeaseResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.changeLeasePreparer(leaseID, proposedLeaseID, timeout, ifModifiedSince, ifUnmodifiedSince, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.changeLeaseResponder}, req) - if err != nil { - return nil, err - } - return resp.(*ContainerChangeLeaseResponse), err -} - -// changeLeasePreparer prepares the ChangeLease request. -func (client containerClient) changeLeasePreparer(leaseID string, proposedLeaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "lease") - params.Set("restype", "container") - req.URL.RawQuery = params.Encode() - req.Header.Set("x-ms-lease-id", leaseID) - req.Header.Set("x-ms-proposed-lease-id", proposedLeaseID) - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-lease-action", "change") - return req, nil -} - -// changeLeaseResponder handles the response to the ChangeLease request. -func (client containerClient) changeLeaseResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &ContainerChangeLeaseResponse{rawResponse: resp.Response()}, err -} - -// Create creates a new container under the specified account. If the container with the same name already exists, the -// operation fails -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. metadata is optional. Specifies a user-defined name-value pair associated -// with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or -// file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with -// the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version -// 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing -// Containers, Blobs, and Metadata for more information. access is specifies whether data in the container may be -// accessed publicly and the level of access requestID is provides a client-generated, opaque value with a 1 KB -// character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client containerClient) Create(ctx context.Context, timeout *int32, metadata map[string]string, access PublicAccessType, requestID *string) (*ContainerCreateResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.createPreparer(timeout, metadata, access, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.createResponder}, req) - if err != nil { - return nil, err - } - return resp.(*ContainerCreateResponse), err -} - -// createPreparer prepares the Create request. -func (client containerClient) createPreparer(timeout *int32, metadata map[string]string, access PublicAccessType, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("restype", "container") - req.URL.RawQuery = params.Encode() - if metadata != nil { - for k, v := range metadata { - req.Header.Set("x-ms-meta-"+k, v) - } - } - if access != PublicAccessNone { - req.Header.Set("x-ms-blob-public-access", string(access)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// createResponder handles the response to the Create request. -func (client containerClient) createResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &ContainerCreateResponse{rawResponse: resp.Response()}, err -} - -// Delete operation marks the specified container for deletion. The container and any blobs contained within it are -// later deleted during garbage collection -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it -// has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a -// blob if it has not been modified since the specified date/time. requestID is provides a client-generated, opaque -// value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client containerClient) Delete(ctx context.Context, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (*ContainerDeleteResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.deletePreparer(timeout, leaseID, ifModifiedSince, ifUnmodifiedSince, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.deleteResponder}, req) - if err != nil { - return nil, err - } - return resp.(*ContainerDeleteResponse), err -} - -// deletePreparer prepares the Delete request. -func (client containerClient) deletePreparer(timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("DELETE", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("restype", "container") - req.URL.RawQuery = params.Encode() - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// deleteResponder handles the response to the Delete request. -func (client containerClient) deleteResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusAccepted) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &ContainerDeleteResponse{rawResponse: resp.Response()}, err -} - -// GetAccessPolicy gets the permissions for the specified container. The permissions indicate whether container data -// may be accessed publicly. -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character -// limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client containerClient) GetAccessPolicy(ctx context.Context, timeout *int32, leaseID *string, requestID *string) (*SignedIdentifiers, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.getAccessPolicyPreparer(timeout, leaseID, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getAccessPolicyResponder}, req) - if err != nil { - return nil, err - } - return resp.(*SignedIdentifiers), err -} - -// getAccessPolicyPreparer prepares the GetAccessPolicy request. -func (client containerClient) getAccessPolicyPreparer(timeout *int32, leaseID *string, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("GET", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("restype", "container") - params.Set("comp", "acl") - req.URL.RawQuery = params.Encode() - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// getAccessPolicyResponder handles the response to the GetAccessPolicy request. -func (client containerClient) getAccessPolicyResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - result := &SignedIdentifiers{rawResponse: resp.Response()} - if err != nil { - return result, err - } - defer resp.Response().Body.Close() - b, err := ioutil.ReadAll(resp.Response().Body) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") - } - if len(b) > 0 { - b = removeBOM(b) - err = xml.Unmarshal(b, result) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to unmarshal response body") - } - } - return result, nil -} - -// GetProperties returns all user-defined metadata and system properties for the specified container. The data returned -// does not include the container's list of blobs -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. requestID is provides a client-generated, opaque value with a 1 KB character -// limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client containerClient) GetProperties(ctx context.Context, timeout *int32, leaseID *string, requestID *string) (*ContainerGetPropertiesResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.getPropertiesPreparer(timeout, leaseID, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getPropertiesResponder}, req) - if err != nil { - return nil, err - } - return resp.(*ContainerGetPropertiesResponse), err -} - -// getPropertiesPreparer prepares the GetProperties request. -func (client containerClient) getPropertiesPreparer(timeout *int32, leaseID *string, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("GET", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("restype", "container") - req.URL.RawQuery = params.Encode() - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// getPropertiesResponder handles the response to the GetProperties request. -func (client containerClient) getPropertiesResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &ContainerGetPropertiesResponse{rawResponse: resp.Response()}, err -} - -// ListBlobFlatSegment [Update] The List Blobs operation returns a list of the blobs under the specified container -// -// prefix is filters the results to return only containers whose name begins with the specified prefix. marker is a -// string value that identifies the portion of the list of containers to be returned with the next listing operation. -// The operation returns the NextMarker value within the response body if the listing operation did not return all -// containers remaining to be listed with the current page. The NextMarker value can be used as the value for the -// marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the -// client. maxresults is specifies the maximum number of containers to return. If the request does not specify -// maxresults, or specifies a value greater than 5000, the server will return up to 5000 items. Note that if the -// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the -// remainder of the results. For this reason, it is possible that the service will return fewer results than specified -// by maxresults, or than the default of 5000. include is include this parameter to specify one or more datasets to -// include in the response. timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. requestID is provides a client-generated, opaque value with a 1 KB -// character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client containerClient) ListBlobFlatSegment(ctx context.Context, prefix *string, marker *string, maxresults *int32, include []ListBlobsIncludeItemType, timeout *int32, requestID *string) (*ListBlobsFlatSegmentResponse, error) { - if err := validate([]validation{ - {targetValue: maxresults, - constraints: []constraint{{target: "maxresults", name: null, rule: false, - chain: []constraint{{target: "maxresults", name: inclusiveMinimum, rule: 1, chain: nil}}}}}, - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.listBlobFlatSegmentPreparer(prefix, marker, maxresults, include, timeout, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.listBlobFlatSegmentResponder}, req) - if err != nil { - return nil, err - } - return resp.(*ListBlobsFlatSegmentResponse), err -} - -// listBlobFlatSegmentPreparer prepares the ListBlobFlatSegment request. -func (client containerClient) listBlobFlatSegmentPreparer(prefix *string, marker *string, maxresults *int32, include []ListBlobsIncludeItemType, timeout *int32, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("GET", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if prefix != nil && len(*prefix) > 0 { - params.Set("prefix", *prefix) - } - if marker != nil && len(*marker) > 0 { - params.Set("marker", *marker) - } - if maxresults != nil { - params.Set("maxresults", strconv.FormatInt(int64(*maxresults), 10)) - } - if include != nil && len(include) > 0 { - params.Set("include", joinConst(include, ",")) - } - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("restype", "container") - params.Set("comp", "list") - req.URL.RawQuery = params.Encode() - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// listBlobFlatSegmentResponder handles the response to the ListBlobFlatSegment request. -func (client containerClient) listBlobFlatSegmentResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - result := &ListBlobsFlatSegmentResponse{rawResponse: resp.Response()} - if err != nil { - return result, err - } - defer resp.Response().Body.Close() - b, err := ioutil.ReadAll(resp.Response().Body) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") - } - if len(b) > 0 { - b = removeBOM(b) - err = xml.Unmarshal(b, result) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to unmarshal response body") - } - } - return result, nil -} - -// ListBlobHierarchySegment [Update] The List Blobs operation returns a list of the blobs under the specified container -// -// delimiter is when the request includes this parameter, the operation returns a BlobPrefix element in the response -// body that acts as a placeholder for all blobs whose names begin with the same substring up to the appearance of the -// delimiter character. The delimiter may be a single character or a string. prefix is filters the results to return -// only containers whose name begins with the specified prefix. marker is a string value that identifies the portion of -// the list of containers to be returned with the next listing operation. The operation returns the NextMarker value -// within the response body if the listing operation did not return all containers remaining to be listed with the -// current page. The NextMarker value can be used as the value for the marker parameter in a subsequent call to request -// the next page of list items. The marker value is opaque to the client. maxresults is specifies the maximum number of -// containers to return. If the request does not specify maxresults, or specifies a value greater than 5000, the server -// will return up to 5000 items. Note that if the listing operation crosses a partition boundary, then the service will -// return a continuation token for retrieving the remainder of the results. For this reason, it is possible that the -// service will return fewer results than specified by maxresults, or than the default of 5000. include is include this -// parameter to specify one or more datasets to include in the response. timeout is the timeout parameter is expressed -// in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. requestID is provides a client-generated, opaque value with a 1 KB -// character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client containerClient) ListBlobHierarchySegment(ctx context.Context, delimiter string, prefix *string, marker *string, maxresults *int32, include []ListBlobsIncludeItemType, timeout *int32, requestID *string) (*ListBlobsHierarchySegmentResponse, error) { - if err := validate([]validation{ - {targetValue: maxresults, - constraints: []constraint{{target: "maxresults", name: null, rule: false, - chain: []constraint{{target: "maxresults", name: inclusiveMinimum, rule: 1, chain: nil}}}}}, - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.listBlobHierarchySegmentPreparer(delimiter, prefix, marker, maxresults, include, timeout, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.listBlobHierarchySegmentResponder}, req) - if err != nil { - return nil, err - } - return resp.(*ListBlobsHierarchySegmentResponse), err -} - -// listBlobHierarchySegmentPreparer prepares the ListBlobHierarchySegment request. -func (client containerClient) listBlobHierarchySegmentPreparer(delimiter string, prefix *string, marker *string, maxresults *int32, include []ListBlobsIncludeItemType, timeout *int32, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("GET", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if prefix != nil && len(*prefix) > 0 { - params.Set("prefix", *prefix) - } - params.Set("delimiter", delimiter) - if marker != nil && len(*marker) > 0 { - params.Set("marker", *marker) - } - if maxresults != nil { - params.Set("maxresults", strconv.FormatInt(int64(*maxresults), 10)) - } - if include != nil && len(include) > 0 { - params.Set("include", joinConst(include, ",")) - } - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("restype", "container") - params.Set("comp", "list") - req.URL.RawQuery = params.Encode() - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// listBlobHierarchySegmentResponder handles the response to the ListBlobHierarchySegment request. -func (client containerClient) listBlobHierarchySegmentResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - result := &ListBlobsHierarchySegmentResponse{rawResponse: resp.Response()} - if err != nil { - return result, err - } - defer resp.Response().Body.Close() - b, err := ioutil.ReadAll(resp.Response().Body) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") - } - if len(b) > 0 { - b = removeBOM(b) - err = xml.Unmarshal(b, result) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to unmarshal response body") - } - } - return result, nil -} - -// ReleaseLease [Update] establishes and manages a lock on a container for delete operations. The lock duration can be -// 15 to 60 seconds, or can be infinite -// -// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. timeout -// is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. ifModifiedSince is specify this header value to operate only on a blob if -// it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only -// on a blob if it has not been modified since the specified date/time. requestID is provides a client-generated, -// opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is -// enabled. -func (client containerClient) ReleaseLease(ctx context.Context, leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (*ContainerReleaseLeaseResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.releaseLeasePreparer(leaseID, timeout, ifModifiedSince, ifUnmodifiedSince, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.releaseLeaseResponder}, req) - if err != nil { - return nil, err - } - return resp.(*ContainerReleaseLeaseResponse), err -} - -// releaseLeasePreparer prepares the ReleaseLease request. -func (client containerClient) releaseLeasePreparer(leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "lease") - params.Set("restype", "container") - req.URL.RawQuery = params.Encode() - req.Header.Set("x-ms-lease-id", leaseID) - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-lease-action", "release") - return req, nil -} - -// releaseLeaseResponder handles the response to the ReleaseLease request. -func (client containerClient) releaseLeaseResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &ContainerReleaseLeaseResponse{rawResponse: resp.Response()}, err -} - -// RenewLease [Update] establishes and manages a lock on a container for delete operations. The lock duration can be 15 -// to 60 seconds, or can be infinite -// -// leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. timeout -// is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. ifModifiedSince is specify this header value to operate only on a blob if -// it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only -// on a blob if it has not been modified since the specified date/time. requestID is provides a client-generated, -// opaque value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is -// enabled. -func (client containerClient) RenewLease(ctx context.Context, leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (*ContainerRenewLeaseResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.renewLeasePreparer(leaseID, timeout, ifModifiedSince, ifUnmodifiedSince, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.renewLeaseResponder}, req) - if err != nil { - return nil, err - } - return resp.(*ContainerRenewLeaseResponse), err -} - -// renewLeasePreparer prepares the RenewLease request. -func (client containerClient) renewLeasePreparer(leaseID string, timeout *int32, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "lease") - params.Set("restype", "container") - req.URL.RawQuery = params.Encode() - req.Header.Set("x-ms-lease-id", leaseID) - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-lease-action", "renew") - return req, nil -} - -// renewLeaseResponder handles the response to the RenewLease request. -func (client containerClient) renewLeaseResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &ContainerRenewLeaseResponse{rawResponse: resp.Response()}, err -} - -// SetAccessPolicy sets the permissions for the specified container. The permissions indicate whether blobs in a -// container may be accessed publicly. -// -// containerACL is the acls for the container timeout is the timeout parameter is expressed in seconds. For more -// information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. access is specifies whether data in the container may be accessed publicly and -// the level of access ifModifiedSince is specify this header value to operate only on a blob if it has been modified -// since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has -// not been modified since the specified date/time. requestID is provides a client-generated, opaque value with a 1 KB -// character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client containerClient) SetAccessPolicy(ctx context.Context, containerACL []SignedIdentifier, timeout *int32, leaseID *string, access PublicAccessType, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (*ContainerSetAccessPolicyResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.setAccessPolicyPreparer(containerACL, timeout, leaseID, access, ifModifiedSince, ifUnmodifiedSince, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.setAccessPolicyResponder}, req) - if err != nil { - return nil, err - } - return resp.(*ContainerSetAccessPolicyResponse), err -} - -// setAccessPolicyPreparer prepares the SetAccessPolicy request. -func (client containerClient) setAccessPolicyPreparer(containerACL []SignedIdentifier, timeout *int32, leaseID *string, access PublicAccessType, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("restype", "container") - params.Set("comp", "acl") - req.URL.RawQuery = params.Encode() - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if access != PublicAccessNone { - req.Header.Set("x-ms-blob-public-access", string(access)) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - b, err := xml.Marshal(SignedIdentifiers{Items: containerACL}) - if err != nil { - return req, pipeline.NewError(err, "failed to marshal request body") - } - req.Header.Set("Content-Type", "application/xml") - err = req.SetBody(bytes.NewReader(b)) - if err != nil { - return req, pipeline.NewError(err, "failed to set request body") - } - return req, nil -} - -// setAccessPolicyResponder handles the response to the SetAccessPolicy request. -func (client containerClient) setAccessPolicyResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &ContainerSetAccessPolicyResponse{rawResponse: resp.Response()}, err -} - -// SetMetadata operation sets one or more user-defined name-value pairs for the specified container. -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. metadata is optional. Specifies a user-defined name-value pair associated with -// the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to -// the destination blob. If one or more name-value pairs are specified, the destination blob is created with the -// specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version -// 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing -// Containers, Blobs, and Metadata for more information. ifModifiedSince is specify this header value to operate only -// on a blob if it has been modified since the specified date/time. requestID is provides a client-generated, opaque -// value with a 1 KB character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client containerClient) SetMetadata(ctx context.Context, timeout *int32, leaseID *string, metadata map[string]string, ifModifiedSince *time.Time, requestID *string) (*ContainerSetMetadataResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.setMetadataPreparer(timeout, leaseID, metadata, ifModifiedSince, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.setMetadataResponder}, req) - if err != nil { - return nil, err - } - return resp.(*ContainerSetMetadataResponse), err -} - -// setMetadataPreparer prepares the SetMetadata request. -func (client containerClient) setMetadataPreparer(timeout *int32, leaseID *string, metadata map[string]string, ifModifiedSince *time.Time, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("restype", "container") - params.Set("comp", "metadata") - req.URL.RawQuery = params.Encode() - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if metadata != nil { - for k, v := range metadata { - req.Header.Set("x-ms-meta-"+k, v) - } - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// setMetadataResponder handles the response to the SetMetadata request. -func (client containerClient) setMetadataResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &ContainerSetMetadataResponse{rawResponse: resp.Response()}, err -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_models.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_models.go deleted file mode 100644 index 3d8114ae6b5e..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_models.go +++ /dev/null @@ -1,4501 +0,0 @@ -package azblob - -// Code generated by Microsoft (R) AutoRest Code Generator. -// Changes may cause incorrect behavior and will be lost if the code is regenerated. - -import ( - "encoding/base64" - "encoding/xml" - "io" - "net/http" - "reflect" - "strconv" - "strings" - "time" - "unsafe" -) - -// ETag is an entity tag. -type ETag string - -const ( - // ETagNone represents an empty entity tag. - ETagNone ETag = "" - - // ETagAny matches any entity tag. - ETagAny ETag = "*" -) - -// Metadata contains metadata key/value pairs. -type Metadata map[string]string - -const mdPrefix = "x-ms-meta-" - -const mdPrefixLen = len(mdPrefix) - -// UnmarshalXML implements the xml.Unmarshaler interface for Metadata. -func (md *Metadata) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - tokName := "" - for t, err := d.Token(); err == nil; t, err = d.Token() { - switch tt := t.(type) { - case xml.StartElement: - tokName = strings.ToLower(tt.Name.Local) - break - case xml.CharData: - if *md == nil { - *md = Metadata{} - } - (*md)[tokName] = string(tt) - break - } - } - return nil -} - -// Marker represents an opaque value used in paged responses. -type Marker struct { - val *string -} - -// NotDone returns true if the list enumeration should be started or is not yet complete. Specifically, NotDone returns true -// for a just-initialized (zero value) Marker indicating that you should make an initial request to get a result portion from -// the service. NotDone also returns true whenever the service returns an interim result portion. NotDone returns false only -// after the service has returned the final result portion. -func (m Marker) NotDone() bool { - return m.val == nil || *m.val != "" -} - -// UnmarshalXML implements the xml.Unmarshaler interface for Marker. -func (m *Marker) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - var out string - err := d.DecodeElement(&out, &start) - m.val = &out - return err -} - -// concatenates a slice of const values with the specified separator between each item -func joinConst(s interface{}, sep string) string { - v := reflect.ValueOf(s) - if v.Kind() != reflect.Slice && v.Kind() != reflect.Array { - panic("s wasn't a slice or array") - } - ss := make([]string, 0, v.Len()) - for i := 0; i < v.Len(); i++ { - ss = append(ss, v.Index(i).String()) - } - return strings.Join(ss, sep) -} - -// AccessTierType enumerates the values for access tier type. -type AccessTierType string - -const ( - // AccessTierArchive ... - AccessTierArchive AccessTierType = "Archive" - // AccessTierCool ... - AccessTierCool AccessTierType = "Cool" - // AccessTierHot ... - AccessTierHot AccessTierType = "Hot" - // AccessTierNone represents an empty AccessTierType. - AccessTierNone AccessTierType = "" - // AccessTierP10 ... - AccessTierP10 AccessTierType = "P10" - // AccessTierP20 ... - AccessTierP20 AccessTierType = "P20" - // AccessTierP30 ... - AccessTierP30 AccessTierType = "P30" - // AccessTierP4 ... - AccessTierP4 AccessTierType = "P4" - // AccessTierP40 ... - AccessTierP40 AccessTierType = "P40" - // AccessTierP50 ... - AccessTierP50 AccessTierType = "P50" - // AccessTierP6 ... - AccessTierP6 AccessTierType = "P6" -) - -// PossibleAccessTierTypeValues returns an array of possible values for the AccessTierType const type. -func PossibleAccessTierTypeValues() []AccessTierType { - return []AccessTierType{AccessTierArchive, AccessTierCool, AccessTierHot, AccessTierNone, AccessTierP10, AccessTierP20, AccessTierP30, AccessTierP4, AccessTierP40, AccessTierP50, AccessTierP6} -} - -// ArchiveStatusType enumerates the values for archive status type. -type ArchiveStatusType string - -const ( - // ArchiveStatusNone represents an empty ArchiveStatusType. - ArchiveStatusNone ArchiveStatusType = "" - // ArchiveStatusRehydratePendingToCool ... - ArchiveStatusRehydratePendingToCool ArchiveStatusType = "rehydrate-pending-to-cool" - // ArchiveStatusRehydratePendingToHot ... - ArchiveStatusRehydratePendingToHot ArchiveStatusType = "rehydrate-pending-to-hot" -) - -// PossibleArchiveStatusTypeValues returns an array of possible values for the ArchiveStatusType const type. -func PossibleArchiveStatusTypeValues() []ArchiveStatusType { - return []ArchiveStatusType{ArchiveStatusNone, ArchiveStatusRehydratePendingToCool, ArchiveStatusRehydratePendingToHot} -} - -// BlobType enumerates the values for blob type. -type BlobType string - -const ( - // BlobAppendBlob ... - BlobAppendBlob BlobType = "AppendBlob" - // BlobBlockBlob ... - BlobBlockBlob BlobType = "BlockBlob" - // BlobNone represents an empty BlobType. - BlobNone BlobType = "" - // BlobPageBlob ... - BlobPageBlob BlobType = "PageBlob" -) - -// PossibleBlobTypeValues returns an array of possible values for the BlobType const type. -func PossibleBlobTypeValues() []BlobType { - return []BlobType{BlobAppendBlob, BlobBlockBlob, BlobNone, BlobPageBlob} -} - -// BlockListType enumerates the values for block list type. -type BlockListType string - -const ( - // BlockListAll ... - BlockListAll BlockListType = "all" - // BlockListCommitted ... - BlockListCommitted BlockListType = "committed" - // BlockListNone represents an empty BlockListType. - BlockListNone BlockListType = "" - // BlockListUncommitted ... - BlockListUncommitted BlockListType = "uncommitted" -) - -// PossibleBlockListTypeValues returns an array of possible values for the BlockListType const type. -func PossibleBlockListTypeValues() []BlockListType { - return []BlockListType{BlockListAll, BlockListCommitted, BlockListNone, BlockListUncommitted} -} - -// CopyStatusType enumerates the values for copy status type. -type CopyStatusType string - -const ( - // CopyStatusAborted ... - CopyStatusAborted CopyStatusType = "aborted" - // CopyStatusFailed ... - CopyStatusFailed CopyStatusType = "failed" - // CopyStatusNone represents an empty CopyStatusType. - CopyStatusNone CopyStatusType = "" - // CopyStatusPending ... - CopyStatusPending CopyStatusType = "pending" - // CopyStatusSuccess ... - CopyStatusSuccess CopyStatusType = "success" -) - -// PossibleCopyStatusTypeValues returns an array of possible values for the CopyStatusType const type. -func PossibleCopyStatusTypeValues() []CopyStatusType { - return []CopyStatusType{CopyStatusAborted, CopyStatusFailed, CopyStatusNone, CopyStatusPending, CopyStatusSuccess} -} - -// DeleteSnapshotsOptionType enumerates the values for delete snapshots option type. -type DeleteSnapshotsOptionType string - -const ( - // DeleteSnapshotsOptionInclude ... - DeleteSnapshotsOptionInclude DeleteSnapshotsOptionType = "include" - // DeleteSnapshotsOptionNone represents an empty DeleteSnapshotsOptionType. - DeleteSnapshotsOptionNone DeleteSnapshotsOptionType = "" - // DeleteSnapshotsOptionOnly ... - DeleteSnapshotsOptionOnly DeleteSnapshotsOptionType = "only" -) - -// PossibleDeleteSnapshotsOptionTypeValues returns an array of possible values for the DeleteSnapshotsOptionType const type. -func PossibleDeleteSnapshotsOptionTypeValues() []DeleteSnapshotsOptionType { - return []DeleteSnapshotsOptionType{DeleteSnapshotsOptionInclude, DeleteSnapshotsOptionNone, DeleteSnapshotsOptionOnly} -} - -// GeoReplicationStatusType enumerates the values for geo replication status type. -type GeoReplicationStatusType string - -const ( - // GeoReplicationStatusBootstrap ... - GeoReplicationStatusBootstrap GeoReplicationStatusType = "bootstrap" - // GeoReplicationStatusLive ... - GeoReplicationStatusLive GeoReplicationStatusType = "live" - // GeoReplicationStatusNone represents an empty GeoReplicationStatusType. - GeoReplicationStatusNone GeoReplicationStatusType = "" - // GeoReplicationStatusUnavailable ... - GeoReplicationStatusUnavailable GeoReplicationStatusType = "unavailable" -) - -// PossibleGeoReplicationStatusTypeValues returns an array of possible values for the GeoReplicationStatusType const type. -func PossibleGeoReplicationStatusTypeValues() []GeoReplicationStatusType { - return []GeoReplicationStatusType{GeoReplicationStatusBootstrap, GeoReplicationStatusLive, GeoReplicationStatusNone, GeoReplicationStatusUnavailable} -} - -// LeaseDurationType enumerates the values for lease duration type. -type LeaseDurationType string - -const ( - // LeaseDurationFixed ... - LeaseDurationFixed LeaseDurationType = "fixed" - // LeaseDurationInfinite ... - LeaseDurationInfinite LeaseDurationType = "infinite" - // LeaseDurationNone represents an empty LeaseDurationType. - LeaseDurationNone LeaseDurationType = "" -) - -// PossibleLeaseDurationTypeValues returns an array of possible values for the LeaseDurationType const type. -func PossibleLeaseDurationTypeValues() []LeaseDurationType { - return []LeaseDurationType{LeaseDurationFixed, LeaseDurationInfinite, LeaseDurationNone} -} - -// LeaseStateType enumerates the values for lease state type. -type LeaseStateType string - -const ( - // LeaseStateAvailable ... - LeaseStateAvailable LeaseStateType = "available" - // LeaseStateBreaking ... - LeaseStateBreaking LeaseStateType = "breaking" - // LeaseStateBroken ... - LeaseStateBroken LeaseStateType = "broken" - // LeaseStateExpired ... - LeaseStateExpired LeaseStateType = "expired" - // LeaseStateLeased ... - LeaseStateLeased LeaseStateType = "leased" - // LeaseStateNone represents an empty LeaseStateType. - LeaseStateNone LeaseStateType = "" -) - -// PossibleLeaseStateTypeValues returns an array of possible values for the LeaseStateType const type. -func PossibleLeaseStateTypeValues() []LeaseStateType { - return []LeaseStateType{LeaseStateAvailable, LeaseStateBreaking, LeaseStateBroken, LeaseStateExpired, LeaseStateLeased, LeaseStateNone} -} - -// LeaseStatusType enumerates the values for lease status type. -type LeaseStatusType string - -const ( - // LeaseStatusLocked ... - LeaseStatusLocked LeaseStatusType = "locked" - // LeaseStatusNone represents an empty LeaseStatusType. - LeaseStatusNone LeaseStatusType = "" - // LeaseStatusUnlocked ... - LeaseStatusUnlocked LeaseStatusType = "unlocked" -) - -// PossibleLeaseStatusTypeValues returns an array of possible values for the LeaseStatusType const type. -func PossibleLeaseStatusTypeValues() []LeaseStatusType { - return []LeaseStatusType{LeaseStatusLocked, LeaseStatusNone, LeaseStatusUnlocked} -} - -// ListBlobsIncludeItemType enumerates the values for list blobs include item type. -type ListBlobsIncludeItemType string - -const ( - // ListBlobsIncludeItemCopy ... - ListBlobsIncludeItemCopy ListBlobsIncludeItemType = "copy" - // ListBlobsIncludeItemDeleted ... - ListBlobsIncludeItemDeleted ListBlobsIncludeItemType = "deleted" - // ListBlobsIncludeItemMetadata ... - ListBlobsIncludeItemMetadata ListBlobsIncludeItemType = "metadata" - // ListBlobsIncludeItemNone represents an empty ListBlobsIncludeItemType. - ListBlobsIncludeItemNone ListBlobsIncludeItemType = "" - // ListBlobsIncludeItemSnapshots ... - ListBlobsIncludeItemSnapshots ListBlobsIncludeItemType = "snapshots" - // ListBlobsIncludeItemUncommittedblobs ... - ListBlobsIncludeItemUncommittedblobs ListBlobsIncludeItemType = "uncommittedblobs" -) - -// PossibleListBlobsIncludeItemTypeValues returns an array of possible values for the ListBlobsIncludeItemType const type. -func PossibleListBlobsIncludeItemTypeValues() []ListBlobsIncludeItemType { - return []ListBlobsIncludeItemType{ListBlobsIncludeItemCopy, ListBlobsIncludeItemDeleted, ListBlobsIncludeItemMetadata, ListBlobsIncludeItemNone, ListBlobsIncludeItemSnapshots, ListBlobsIncludeItemUncommittedblobs} -} - -// ListContainersIncludeType enumerates the values for list containers include type. -type ListContainersIncludeType string - -const ( - // ListContainersIncludeMetadata ... - ListContainersIncludeMetadata ListContainersIncludeType = "metadata" - // ListContainersIncludeNone represents an empty ListContainersIncludeType. - ListContainersIncludeNone ListContainersIncludeType = "" -) - -// PossibleListContainersIncludeTypeValues returns an array of possible values for the ListContainersIncludeType const type. -func PossibleListContainersIncludeTypeValues() []ListContainersIncludeType { - return []ListContainersIncludeType{ListContainersIncludeMetadata, ListContainersIncludeNone} -} - -// PublicAccessType enumerates the values for public access type. -type PublicAccessType string - -const ( - // PublicAccessBlob ... - PublicAccessBlob PublicAccessType = "blob" - // PublicAccessContainer ... - PublicAccessContainer PublicAccessType = "container" - // PublicAccessNone represents an empty PublicAccessType. - PublicAccessNone PublicAccessType = "" -) - -// PossiblePublicAccessTypeValues returns an array of possible values for the PublicAccessType const type. -func PossiblePublicAccessTypeValues() []PublicAccessType { - return []PublicAccessType{PublicAccessBlob, PublicAccessContainer, PublicAccessNone} -} - -// SequenceNumberActionType enumerates the values for sequence number action type. -type SequenceNumberActionType string - -const ( - // SequenceNumberActionIncrement ... - SequenceNumberActionIncrement SequenceNumberActionType = "increment" - // SequenceNumberActionMax ... - SequenceNumberActionMax SequenceNumberActionType = "max" - // SequenceNumberActionNone represents an empty SequenceNumberActionType. - SequenceNumberActionNone SequenceNumberActionType = "" - // SequenceNumberActionUpdate ... - SequenceNumberActionUpdate SequenceNumberActionType = "update" -) - -// PossibleSequenceNumberActionTypeValues returns an array of possible values for the SequenceNumberActionType const type. -func PossibleSequenceNumberActionTypeValues() []SequenceNumberActionType { - return []SequenceNumberActionType{SequenceNumberActionIncrement, SequenceNumberActionMax, SequenceNumberActionNone, SequenceNumberActionUpdate} -} - -// StorageErrorCodeType enumerates the values for storage error code type. -type StorageErrorCodeType string - -const ( - // StorageErrorCodeAccountAlreadyExists ... - StorageErrorCodeAccountAlreadyExists StorageErrorCodeType = "AccountAlreadyExists" - // StorageErrorCodeAccountBeingCreated ... - StorageErrorCodeAccountBeingCreated StorageErrorCodeType = "AccountBeingCreated" - // StorageErrorCodeAccountIsDisabled ... - StorageErrorCodeAccountIsDisabled StorageErrorCodeType = "AccountIsDisabled" - // StorageErrorCodeAppendPositionConditionNotMet ... - StorageErrorCodeAppendPositionConditionNotMet StorageErrorCodeType = "AppendPositionConditionNotMet" - // StorageErrorCodeAuthenticationFailed ... - StorageErrorCodeAuthenticationFailed StorageErrorCodeType = "AuthenticationFailed" - // StorageErrorCodeBlobAlreadyExists ... - StorageErrorCodeBlobAlreadyExists StorageErrorCodeType = "BlobAlreadyExists" - // StorageErrorCodeBlobArchived ... - StorageErrorCodeBlobArchived StorageErrorCodeType = "BlobArchived" - // StorageErrorCodeBlobBeingRehydrated ... - StorageErrorCodeBlobBeingRehydrated StorageErrorCodeType = "BlobBeingRehydrated" - // StorageErrorCodeBlobNotArchived ... - StorageErrorCodeBlobNotArchived StorageErrorCodeType = "BlobNotArchived" - // StorageErrorCodeBlobNotFound ... - StorageErrorCodeBlobNotFound StorageErrorCodeType = "BlobNotFound" - // StorageErrorCodeBlobOverwritten ... - StorageErrorCodeBlobOverwritten StorageErrorCodeType = "BlobOverwritten" - // StorageErrorCodeBlobTierInadequateForContentLength ... - StorageErrorCodeBlobTierInadequateForContentLength StorageErrorCodeType = "BlobTierInadequateForContentLength" - // StorageErrorCodeBlockCountExceedsLimit ... - StorageErrorCodeBlockCountExceedsLimit StorageErrorCodeType = "BlockCountExceedsLimit" - // StorageErrorCodeBlockListTooLong ... - StorageErrorCodeBlockListTooLong StorageErrorCodeType = "BlockListTooLong" - // StorageErrorCodeCannotChangeToLowerTier ... - StorageErrorCodeCannotChangeToLowerTier StorageErrorCodeType = "CannotChangeToLowerTier" - // StorageErrorCodeCannotVerifyCopySource ... - StorageErrorCodeCannotVerifyCopySource StorageErrorCodeType = "CannotVerifyCopySource" - // StorageErrorCodeConditionHeadersNotSupported ... - StorageErrorCodeConditionHeadersNotSupported StorageErrorCodeType = "ConditionHeadersNotSupported" - // StorageErrorCodeConditionNotMet ... - StorageErrorCodeConditionNotMet StorageErrorCodeType = "ConditionNotMet" - // StorageErrorCodeContainerAlreadyExists ... - StorageErrorCodeContainerAlreadyExists StorageErrorCodeType = "ContainerAlreadyExists" - // StorageErrorCodeContainerBeingDeleted ... - StorageErrorCodeContainerBeingDeleted StorageErrorCodeType = "ContainerBeingDeleted" - // StorageErrorCodeContainerDisabled ... - StorageErrorCodeContainerDisabled StorageErrorCodeType = "ContainerDisabled" - // StorageErrorCodeContainerNotFound ... - StorageErrorCodeContainerNotFound StorageErrorCodeType = "ContainerNotFound" - // StorageErrorCodeContentLengthLargerThanTierLimit ... - StorageErrorCodeContentLengthLargerThanTierLimit StorageErrorCodeType = "ContentLengthLargerThanTierLimit" - // StorageErrorCodeCopyAcrossAccountsNotSupported ... - StorageErrorCodeCopyAcrossAccountsNotSupported StorageErrorCodeType = "CopyAcrossAccountsNotSupported" - // StorageErrorCodeCopyIDMismatch ... - StorageErrorCodeCopyIDMismatch StorageErrorCodeType = "CopyIdMismatch" - // StorageErrorCodeEmptyMetadataKey ... - StorageErrorCodeEmptyMetadataKey StorageErrorCodeType = "EmptyMetadataKey" - // StorageErrorCodeFeatureVersionMismatch ... - StorageErrorCodeFeatureVersionMismatch StorageErrorCodeType = "FeatureVersionMismatch" - // StorageErrorCodeIncrementalCopyBlobMismatch ... - StorageErrorCodeIncrementalCopyBlobMismatch StorageErrorCodeType = "IncrementalCopyBlobMismatch" - // StorageErrorCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed ... - StorageErrorCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed StorageErrorCodeType = "IncrementalCopyOfEralierVersionSnapshotNotAllowed" - // StorageErrorCodeIncrementalCopySourceMustBeSnapshot ... - StorageErrorCodeIncrementalCopySourceMustBeSnapshot StorageErrorCodeType = "IncrementalCopySourceMustBeSnapshot" - // StorageErrorCodeInfiniteLeaseDurationRequired ... - StorageErrorCodeInfiniteLeaseDurationRequired StorageErrorCodeType = "InfiniteLeaseDurationRequired" - // StorageErrorCodeInsufficientAccountPermissions ... - StorageErrorCodeInsufficientAccountPermissions StorageErrorCodeType = "InsufficientAccountPermissions" - // StorageErrorCodeInternalError ... - StorageErrorCodeInternalError StorageErrorCodeType = "InternalError" - // StorageErrorCodeInvalidAuthenticationInfo ... - StorageErrorCodeInvalidAuthenticationInfo StorageErrorCodeType = "InvalidAuthenticationInfo" - // StorageErrorCodeInvalidBlobOrBlock ... - StorageErrorCodeInvalidBlobOrBlock StorageErrorCodeType = "InvalidBlobOrBlock" - // StorageErrorCodeInvalidBlobTier ... - StorageErrorCodeInvalidBlobTier StorageErrorCodeType = "InvalidBlobTier" - // StorageErrorCodeInvalidBlobType ... - StorageErrorCodeInvalidBlobType StorageErrorCodeType = "InvalidBlobType" - // StorageErrorCodeInvalidBlockID ... - StorageErrorCodeInvalidBlockID StorageErrorCodeType = "InvalidBlockId" - // StorageErrorCodeInvalidBlockList ... - StorageErrorCodeInvalidBlockList StorageErrorCodeType = "InvalidBlockList" - // StorageErrorCodeInvalidHeaderValue ... - StorageErrorCodeInvalidHeaderValue StorageErrorCodeType = "InvalidHeaderValue" - // StorageErrorCodeInvalidHTTPVerb ... - StorageErrorCodeInvalidHTTPVerb StorageErrorCodeType = "InvalidHttpVerb" - // StorageErrorCodeInvalidInput ... - StorageErrorCodeInvalidInput StorageErrorCodeType = "InvalidInput" - // StorageErrorCodeInvalidMd5 ... - StorageErrorCodeInvalidMd5 StorageErrorCodeType = "InvalidMd5" - // StorageErrorCodeInvalidMetadata ... - StorageErrorCodeInvalidMetadata StorageErrorCodeType = "InvalidMetadata" - // StorageErrorCodeInvalidOperation ... - StorageErrorCodeInvalidOperation StorageErrorCodeType = "InvalidOperation" - // StorageErrorCodeInvalidPageRange ... - StorageErrorCodeInvalidPageRange StorageErrorCodeType = "InvalidPageRange" - // StorageErrorCodeInvalidQueryParameterValue ... - StorageErrorCodeInvalidQueryParameterValue StorageErrorCodeType = "InvalidQueryParameterValue" - // StorageErrorCodeInvalidRange ... - StorageErrorCodeInvalidRange StorageErrorCodeType = "InvalidRange" - // StorageErrorCodeInvalidResourceName ... - StorageErrorCodeInvalidResourceName StorageErrorCodeType = "InvalidResourceName" - // StorageErrorCodeInvalidSourceBlobType ... - StorageErrorCodeInvalidSourceBlobType StorageErrorCodeType = "InvalidSourceBlobType" - // StorageErrorCodeInvalidSourceBlobURL ... - StorageErrorCodeInvalidSourceBlobURL StorageErrorCodeType = "InvalidSourceBlobUrl" - // StorageErrorCodeInvalidURI ... - StorageErrorCodeInvalidURI StorageErrorCodeType = "InvalidUri" - // StorageErrorCodeInvalidVersionForPageBlobOperation ... - StorageErrorCodeInvalidVersionForPageBlobOperation StorageErrorCodeType = "InvalidVersionForPageBlobOperation" - // StorageErrorCodeInvalidXMLDocument ... - StorageErrorCodeInvalidXMLDocument StorageErrorCodeType = "InvalidXmlDocument" - // StorageErrorCodeInvalidXMLNodeValue ... - StorageErrorCodeInvalidXMLNodeValue StorageErrorCodeType = "InvalidXmlNodeValue" - // StorageErrorCodeLeaseAlreadyBroken ... - StorageErrorCodeLeaseAlreadyBroken StorageErrorCodeType = "LeaseAlreadyBroken" - // StorageErrorCodeLeaseAlreadyPresent ... - StorageErrorCodeLeaseAlreadyPresent StorageErrorCodeType = "LeaseAlreadyPresent" - // StorageErrorCodeLeaseIDMismatchWithBlobOperation ... - StorageErrorCodeLeaseIDMismatchWithBlobOperation StorageErrorCodeType = "LeaseIdMismatchWithBlobOperation" - // StorageErrorCodeLeaseIDMismatchWithContainerOperation ... - StorageErrorCodeLeaseIDMismatchWithContainerOperation StorageErrorCodeType = "LeaseIdMismatchWithContainerOperation" - // StorageErrorCodeLeaseIDMismatchWithLeaseOperation ... - StorageErrorCodeLeaseIDMismatchWithLeaseOperation StorageErrorCodeType = "LeaseIdMismatchWithLeaseOperation" - // StorageErrorCodeLeaseIDMissing ... - StorageErrorCodeLeaseIDMissing StorageErrorCodeType = "LeaseIdMissing" - // StorageErrorCodeLeaseIsBreakingAndCannotBeAcquired ... - StorageErrorCodeLeaseIsBreakingAndCannotBeAcquired StorageErrorCodeType = "LeaseIsBreakingAndCannotBeAcquired" - // StorageErrorCodeLeaseIsBreakingAndCannotBeChanged ... - StorageErrorCodeLeaseIsBreakingAndCannotBeChanged StorageErrorCodeType = "LeaseIsBreakingAndCannotBeChanged" - // StorageErrorCodeLeaseIsBrokenAndCannotBeRenewed ... - StorageErrorCodeLeaseIsBrokenAndCannotBeRenewed StorageErrorCodeType = "LeaseIsBrokenAndCannotBeRenewed" - // StorageErrorCodeLeaseLost ... - StorageErrorCodeLeaseLost StorageErrorCodeType = "LeaseLost" - // StorageErrorCodeLeaseNotPresentWithBlobOperation ... - StorageErrorCodeLeaseNotPresentWithBlobOperation StorageErrorCodeType = "LeaseNotPresentWithBlobOperation" - // StorageErrorCodeLeaseNotPresentWithContainerOperation ... - StorageErrorCodeLeaseNotPresentWithContainerOperation StorageErrorCodeType = "LeaseNotPresentWithContainerOperation" - // StorageErrorCodeLeaseNotPresentWithLeaseOperation ... - StorageErrorCodeLeaseNotPresentWithLeaseOperation StorageErrorCodeType = "LeaseNotPresentWithLeaseOperation" - // StorageErrorCodeMaxBlobSizeConditionNotMet ... - StorageErrorCodeMaxBlobSizeConditionNotMet StorageErrorCodeType = "MaxBlobSizeConditionNotMet" - // StorageErrorCodeMd5Mismatch ... - StorageErrorCodeMd5Mismatch StorageErrorCodeType = "Md5Mismatch" - // StorageErrorCodeMetadataTooLarge ... - StorageErrorCodeMetadataTooLarge StorageErrorCodeType = "MetadataTooLarge" - // StorageErrorCodeMissingContentLengthHeader ... - StorageErrorCodeMissingContentLengthHeader StorageErrorCodeType = "MissingContentLengthHeader" - // StorageErrorCodeMissingRequiredHeader ... - StorageErrorCodeMissingRequiredHeader StorageErrorCodeType = "MissingRequiredHeader" - // StorageErrorCodeMissingRequiredQueryParameter ... - StorageErrorCodeMissingRequiredQueryParameter StorageErrorCodeType = "MissingRequiredQueryParameter" - // StorageErrorCodeMissingRequiredXMLNode ... - StorageErrorCodeMissingRequiredXMLNode StorageErrorCodeType = "MissingRequiredXmlNode" - // StorageErrorCodeMultipleConditionHeadersNotSupported ... - StorageErrorCodeMultipleConditionHeadersNotSupported StorageErrorCodeType = "MultipleConditionHeadersNotSupported" - // StorageErrorCodeNone represents an empty StorageErrorCodeType. - StorageErrorCodeNone StorageErrorCodeType = "" - // StorageErrorCodeNoPendingCopyOperation ... - StorageErrorCodeNoPendingCopyOperation StorageErrorCodeType = "NoPendingCopyOperation" - // StorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob ... - StorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob StorageErrorCodeType = "OperationNotAllowedOnIncrementalCopyBlob" - // StorageErrorCodeOperationTimedOut ... - StorageErrorCodeOperationTimedOut StorageErrorCodeType = "OperationTimedOut" - // StorageErrorCodeOutOfRangeInput ... - StorageErrorCodeOutOfRangeInput StorageErrorCodeType = "OutOfRangeInput" - // StorageErrorCodeOutOfRangeQueryParameterValue ... - StorageErrorCodeOutOfRangeQueryParameterValue StorageErrorCodeType = "OutOfRangeQueryParameterValue" - // StorageErrorCodePendingCopyOperation ... - StorageErrorCodePendingCopyOperation StorageErrorCodeType = "PendingCopyOperation" - // StorageErrorCodePreviousSnapshotCannotBeNewer ... - StorageErrorCodePreviousSnapshotCannotBeNewer StorageErrorCodeType = "PreviousSnapshotCannotBeNewer" - // StorageErrorCodePreviousSnapshotNotFound ... - StorageErrorCodePreviousSnapshotNotFound StorageErrorCodeType = "PreviousSnapshotNotFound" - // StorageErrorCodePreviousSnapshotOperationNotSupported ... - StorageErrorCodePreviousSnapshotOperationNotSupported StorageErrorCodeType = "PreviousSnapshotOperationNotSupported" - // StorageErrorCodeRequestBodyTooLarge ... - StorageErrorCodeRequestBodyTooLarge StorageErrorCodeType = "RequestBodyTooLarge" - // StorageErrorCodeRequestURLFailedToParse ... - StorageErrorCodeRequestURLFailedToParse StorageErrorCodeType = "RequestUrlFailedToParse" - // StorageErrorCodeResourceAlreadyExists ... - StorageErrorCodeResourceAlreadyExists StorageErrorCodeType = "ResourceAlreadyExists" - // StorageErrorCodeResourceNotFound ... - StorageErrorCodeResourceNotFound StorageErrorCodeType = "ResourceNotFound" - // StorageErrorCodeResourceTypeMismatch ... - StorageErrorCodeResourceTypeMismatch StorageErrorCodeType = "ResourceTypeMismatch" - // StorageErrorCodeSequenceNumberConditionNotMet ... - StorageErrorCodeSequenceNumberConditionNotMet StorageErrorCodeType = "SequenceNumberConditionNotMet" - // StorageErrorCodeSequenceNumberIncrementTooLarge ... - StorageErrorCodeSequenceNumberIncrementTooLarge StorageErrorCodeType = "SequenceNumberIncrementTooLarge" - // StorageErrorCodeServerBusy ... - StorageErrorCodeServerBusy StorageErrorCodeType = "ServerBusy" - // StorageErrorCodeSnaphotOperationRateExceeded ... - StorageErrorCodeSnaphotOperationRateExceeded StorageErrorCodeType = "SnaphotOperationRateExceeded" - // StorageErrorCodeSnapshotCountExceeded ... - StorageErrorCodeSnapshotCountExceeded StorageErrorCodeType = "SnapshotCountExceeded" - // StorageErrorCodeSnapshotsPresent ... - StorageErrorCodeSnapshotsPresent StorageErrorCodeType = "SnapshotsPresent" - // StorageErrorCodeSourceConditionNotMet ... - StorageErrorCodeSourceConditionNotMet StorageErrorCodeType = "SourceConditionNotMet" - // StorageErrorCodeSystemInUse ... - StorageErrorCodeSystemInUse StorageErrorCodeType = "SystemInUse" - // StorageErrorCodeTargetConditionNotMet ... - StorageErrorCodeTargetConditionNotMet StorageErrorCodeType = "TargetConditionNotMet" - // StorageErrorCodeUnauthorizedBlobOverwrite ... - StorageErrorCodeUnauthorizedBlobOverwrite StorageErrorCodeType = "UnauthorizedBlobOverwrite" - // StorageErrorCodeUnsupportedHeader ... - StorageErrorCodeUnsupportedHeader StorageErrorCodeType = "UnsupportedHeader" - // StorageErrorCodeUnsupportedHTTPVerb ... - StorageErrorCodeUnsupportedHTTPVerb StorageErrorCodeType = "UnsupportedHttpVerb" - // StorageErrorCodeUnsupportedQueryParameter ... - StorageErrorCodeUnsupportedQueryParameter StorageErrorCodeType = "UnsupportedQueryParameter" - // StorageErrorCodeUnsupportedXMLNode ... - StorageErrorCodeUnsupportedXMLNode StorageErrorCodeType = "UnsupportedXmlNode" -) - -// PossibleStorageErrorCodeTypeValues returns an array of possible values for the StorageErrorCodeType const type. -func PossibleStorageErrorCodeTypeValues() []StorageErrorCodeType { - return []StorageErrorCodeType{StorageErrorCodeAccountAlreadyExists, StorageErrorCodeAccountBeingCreated, StorageErrorCodeAccountIsDisabled, StorageErrorCodeAppendPositionConditionNotMet, StorageErrorCodeAuthenticationFailed, StorageErrorCodeBlobAlreadyExists, StorageErrorCodeBlobArchived, StorageErrorCodeBlobBeingRehydrated, StorageErrorCodeBlobNotArchived, StorageErrorCodeBlobNotFound, StorageErrorCodeBlobOverwritten, StorageErrorCodeBlobTierInadequateForContentLength, StorageErrorCodeBlockCountExceedsLimit, StorageErrorCodeBlockListTooLong, StorageErrorCodeCannotChangeToLowerTier, StorageErrorCodeCannotVerifyCopySource, StorageErrorCodeConditionHeadersNotSupported, StorageErrorCodeConditionNotMet, StorageErrorCodeContainerAlreadyExists, StorageErrorCodeContainerBeingDeleted, StorageErrorCodeContainerDisabled, StorageErrorCodeContainerNotFound, StorageErrorCodeContentLengthLargerThanTierLimit, StorageErrorCodeCopyAcrossAccountsNotSupported, StorageErrorCodeCopyIDMismatch, StorageErrorCodeEmptyMetadataKey, StorageErrorCodeFeatureVersionMismatch, StorageErrorCodeIncrementalCopyBlobMismatch, StorageErrorCodeIncrementalCopyOfEralierVersionSnapshotNotAllowed, StorageErrorCodeIncrementalCopySourceMustBeSnapshot, StorageErrorCodeInfiniteLeaseDurationRequired, StorageErrorCodeInsufficientAccountPermissions, StorageErrorCodeInternalError, StorageErrorCodeInvalidAuthenticationInfo, StorageErrorCodeInvalidBlobOrBlock, StorageErrorCodeInvalidBlobTier, StorageErrorCodeInvalidBlobType, StorageErrorCodeInvalidBlockID, StorageErrorCodeInvalidBlockList, StorageErrorCodeInvalidHeaderValue, StorageErrorCodeInvalidHTTPVerb, StorageErrorCodeInvalidInput, StorageErrorCodeInvalidMd5, StorageErrorCodeInvalidMetadata, StorageErrorCodeInvalidOperation, StorageErrorCodeInvalidPageRange, StorageErrorCodeInvalidQueryParameterValue, StorageErrorCodeInvalidRange, StorageErrorCodeInvalidResourceName, StorageErrorCodeInvalidSourceBlobType, StorageErrorCodeInvalidSourceBlobURL, StorageErrorCodeInvalidURI, StorageErrorCodeInvalidVersionForPageBlobOperation, StorageErrorCodeInvalidXMLDocument, StorageErrorCodeInvalidXMLNodeValue, StorageErrorCodeLeaseAlreadyBroken, StorageErrorCodeLeaseAlreadyPresent, StorageErrorCodeLeaseIDMismatchWithBlobOperation, StorageErrorCodeLeaseIDMismatchWithContainerOperation, StorageErrorCodeLeaseIDMismatchWithLeaseOperation, StorageErrorCodeLeaseIDMissing, StorageErrorCodeLeaseIsBreakingAndCannotBeAcquired, StorageErrorCodeLeaseIsBreakingAndCannotBeChanged, StorageErrorCodeLeaseIsBrokenAndCannotBeRenewed, StorageErrorCodeLeaseLost, StorageErrorCodeLeaseNotPresentWithBlobOperation, StorageErrorCodeLeaseNotPresentWithContainerOperation, StorageErrorCodeLeaseNotPresentWithLeaseOperation, StorageErrorCodeMaxBlobSizeConditionNotMet, StorageErrorCodeMd5Mismatch, StorageErrorCodeMetadataTooLarge, StorageErrorCodeMissingContentLengthHeader, StorageErrorCodeMissingRequiredHeader, StorageErrorCodeMissingRequiredQueryParameter, StorageErrorCodeMissingRequiredXMLNode, StorageErrorCodeMultipleConditionHeadersNotSupported, StorageErrorCodeNone, StorageErrorCodeNoPendingCopyOperation, StorageErrorCodeOperationNotAllowedOnIncrementalCopyBlob, StorageErrorCodeOperationTimedOut, StorageErrorCodeOutOfRangeInput, StorageErrorCodeOutOfRangeQueryParameterValue, StorageErrorCodePendingCopyOperation, StorageErrorCodePreviousSnapshotCannotBeNewer, StorageErrorCodePreviousSnapshotNotFound, StorageErrorCodePreviousSnapshotOperationNotSupported, StorageErrorCodeRequestBodyTooLarge, StorageErrorCodeRequestURLFailedToParse, StorageErrorCodeResourceAlreadyExists, StorageErrorCodeResourceNotFound, StorageErrorCodeResourceTypeMismatch, StorageErrorCodeSequenceNumberConditionNotMet, StorageErrorCodeSequenceNumberIncrementTooLarge, StorageErrorCodeServerBusy, StorageErrorCodeSnaphotOperationRateExceeded, StorageErrorCodeSnapshotCountExceeded, StorageErrorCodeSnapshotsPresent, StorageErrorCodeSourceConditionNotMet, StorageErrorCodeSystemInUse, StorageErrorCodeTargetConditionNotMet, StorageErrorCodeUnauthorizedBlobOverwrite, StorageErrorCodeUnsupportedHeader, StorageErrorCodeUnsupportedHTTPVerb, StorageErrorCodeUnsupportedQueryParameter, StorageErrorCodeUnsupportedXMLNode} -} - -// AccessPolicy - An Access policy -type AccessPolicy struct { - // Start - the date-time the policy is active - Start time.Time `xml:"Start"` - // Expiry - the date-time the policy expires - Expiry time.Time `xml:"Expiry"` - // Permission - the permissions for the acl policy - Permission string `xml:"Permission"` -} - -// MarshalXML implements the xml.Marshaler interface for AccessPolicy. -func (ap AccessPolicy) MarshalXML(e *xml.Encoder, start xml.StartElement) error { - if reflect.TypeOf((*AccessPolicy)(nil)).Elem().Size() != reflect.TypeOf((*accessPolicy)(nil)).Elem().Size() { - panic("size mismatch between AccessPolicy and accessPolicy") - } - ap2 := (*accessPolicy)(unsafe.Pointer(&ap)) - return e.EncodeElement(*ap2, start) -} - -// UnmarshalXML implements the xml.Unmarshaler interface for AccessPolicy. -func (ap *AccessPolicy) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - if reflect.TypeOf((*AccessPolicy)(nil)).Elem().Size() != reflect.TypeOf((*accessPolicy)(nil)).Elem().Size() { - panic("size mismatch between AccessPolicy and accessPolicy") - } - ap2 := (*accessPolicy)(unsafe.Pointer(ap)) - return d.DecodeElement(ap2, &start) -} - -// AppendBlobAppendBlockResponse ... -type AppendBlobAppendBlockResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (ababr AppendBlobAppendBlockResponse) Response() *http.Response { - return ababr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (ababr AppendBlobAppendBlockResponse) StatusCode() int { - return ababr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (ababr AppendBlobAppendBlockResponse) Status() string { - return ababr.rawResponse.Status -} - -// BlobAppendOffset returns the value for header x-ms-blob-append-offset. -func (ababr AppendBlobAppendBlockResponse) BlobAppendOffset() string { - return ababr.rawResponse.Header.Get("x-ms-blob-append-offset") -} - -// BlobCommittedBlockCount returns the value for header x-ms-blob-committed-block-count. -func (ababr AppendBlobAppendBlockResponse) BlobCommittedBlockCount() int32 { - s := ababr.rawResponse.Header.Get("x-ms-blob-committed-block-count") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 32) - if err != nil { - panic(err) - } - return int32(i) -} - -// ContentMD5 returns the value for header Content-MD5. -func (ababr AppendBlobAppendBlockResponse) ContentMD5() []byte { - s := ababr.rawResponse.Header.Get("Content-MD5") - if s == "" { - return nil - } - b, err := base64.StdEncoding.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - -// Date returns the value for header Date. -func (ababr AppendBlobAppendBlockResponse) Date() time.Time { - s := ababr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (ababr AppendBlobAppendBlockResponse) ErrorCode() string { - return ababr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (ababr AppendBlobAppendBlockResponse) ETag() ETag { - return ETag(ababr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (ababr AppendBlobAppendBlockResponse) LastModified() time.Time { - s := ababr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (ababr AppendBlobAppendBlockResponse) RequestID() string { - return ababr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (ababr AppendBlobAppendBlockResponse) Version() string { - return ababr.rawResponse.Header.Get("x-ms-version") -} - -// AppendBlobCreateResponse ... -type AppendBlobCreateResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (abcr AppendBlobCreateResponse) Response() *http.Response { - return abcr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (abcr AppendBlobCreateResponse) StatusCode() int { - return abcr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (abcr AppendBlobCreateResponse) Status() string { - return abcr.rawResponse.Status -} - -// ContentMD5 returns the value for header Content-MD5. -func (abcr AppendBlobCreateResponse) ContentMD5() []byte { - s := abcr.rawResponse.Header.Get("Content-MD5") - if s == "" { - return nil - } - b, err := base64.StdEncoding.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - -// Date returns the value for header Date. -func (abcr AppendBlobCreateResponse) Date() time.Time { - s := abcr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (abcr AppendBlobCreateResponse) ErrorCode() string { - return abcr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (abcr AppendBlobCreateResponse) ETag() ETag { - return ETag(abcr.rawResponse.Header.Get("ETag")) -} - -// IsServerEncrypted returns the value for header x-ms-request-server-encrypted. -func (abcr AppendBlobCreateResponse) IsServerEncrypted() string { - return abcr.rawResponse.Header.Get("x-ms-request-server-encrypted") -} - -// LastModified returns the value for header Last-Modified. -func (abcr AppendBlobCreateResponse) LastModified() time.Time { - s := abcr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (abcr AppendBlobCreateResponse) RequestID() string { - return abcr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (abcr AppendBlobCreateResponse) Version() string { - return abcr.rawResponse.Header.Get("x-ms-version") -} - -// BlobAbortCopyFromURLResponse ... -type BlobAbortCopyFromURLResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (bacfur BlobAbortCopyFromURLResponse) Response() *http.Response { - return bacfur.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bacfur BlobAbortCopyFromURLResponse) StatusCode() int { - return bacfur.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bacfur BlobAbortCopyFromURLResponse) Status() string { - return bacfur.rawResponse.Status -} - -// Date returns the value for header Date. -func (bacfur BlobAbortCopyFromURLResponse) Date() time.Time { - s := bacfur.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bacfur BlobAbortCopyFromURLResponse) ErrorCode() string { - return bacfur.rawResponse.Header.Get("x-ms-error-code") -} - -// RequestID returns the value for header x-ms-request-id. -func (bacfur BlobAbortCopyFromURLResponse) RequestID() string { - return bacfur.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (bacfur BlobAbortCopyFromURLResponse) Version() string { - return bacfur.rawResponse.Header.Get("x-ms-version") -} - -// BlobAcquireLeaseResponse ... -type BlobAcquireLeaseResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (balr BlobAcquireLeaseResponse) Response() *http.Response { - return balr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (balr BlobAcquireLeaseResponse) StatusCode() int { - return balr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (balr BlobAcquireLeaseResponse) Status() string { - return balr.rawResponse.Status -} - -// Date returns the value for header Date. -func (balr BlobAcquireLeaseResponse) Date() time.Time { - s := balr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (balr BlobAcquireLeaseResponse) ErrorCode() string { - return balr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (balr BlobAcquireLeaseResponse) ETag() ETag { - return ETag(balr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (balr BlobAcquireLeaseResponse) LastModified() time.Time { - s := balr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// LeaseID returns the value for header x-ms-lease-id. -func (balr BlobAcquireLeaseResponse) LeaseID() string { - return balr.rawResponse.Header.Get("x-ms-lease-id") -} - -// RequestID returns the value for header x-ms-request-id. -func (balr BlobAcquireLeaseResponse) RequestID() string { - return balr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (balr BlobAcquireLeaseResponse) Version() string { - return balr.rawResponse.Header.Get("x-ms-version") -} - -// BlobBreakLeaseResponse ... -type BlobBreakLeaseResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (bblr BlobBreakLeaseResponse) Response() *http.Response { - return bblr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bblr BlobBreakLeaseResponse) StatusCode() int { - return bblr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bblr BlobBreakLeaseResponse) Status() string { - return bblr.rawResponse.Status -} - -// Date returns the value for header Date. -func (bblr BlobBreakLeaseResponse) Date() time.Time { - s := bblr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bblr BlobBreakLeaseResponse) ErrorCode() string { - return bblr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (bblr BlobBreakLeaseResponse) ETag() ETag { - return ETag(bblr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (bblr BlobBreakLeaseResponse) LastModified() time.Time { - s := bblr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// LeaseTime returns the value for header x-ms-lease-time. -func (bblr BlobBreakLeaseResponse) LeaseTime() int32 { - s := bblr.rawResponse.Header.Get("x-ms-lease-time") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 32) - if err != nil { - panic(err) - } - return int32(i) -} - -// RequestID returns the value for header x-ms-request-id. -func (bblr BlobBreakLeaseResponse) RequestID() string { - return bblr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (bblr BlobBreakLeaseResponse) Version() string { - return bblr.rawResponse.Header.Get("x-ms-version") -} - -// BlobChangeLeaseResponse ... -type BlobChangeLeaseResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (bclr BlobChangeLeaseResponse) Response() *http.Response { - return bclr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bclr BlobChangeLeaseResponse) StatusCode() int { - return bclr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bclr BlobChangeLeaseResponse) Status() string { - return bclr.rawResponse.Status -} - -// Date returns the value for header Date. -func (bclr BlobChangeLeaseResponse) Date() time.Time { - s := bclr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bclr BlobChangeLeaseResponse) ErrorCode() string { - return bclr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (bclr BlobChangeLeaseResponse) ETag() ETag { - return ETag(bclr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (bclr BlobChangeLeaseResponse) LastModified() time.Time { - s := bclr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// LeaseID returns the value for header x-ms-lease-id. -func (bclr BlobChangeLeaseResponse) LeaseID() string { - return bclr.rawResponse.Header.Get("x-ms-lease-id") -} - -// RequestID returns the value for header x-ms-request-id. -func (bclr BlobChangeLeaseResponse) RequestID() string { - return bclr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (bclr BlobChangeLeaseResponse) Version() string { - return bclr.rawResponse.Header.Get("x-ms-version") -} - -// BlobCreateSnapshotResponse ... -type BlobCreateSnapshotResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (bcsr BlobCreateSnapshotResponse) Response() *http.Response { - return bcsr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bcsr BlobCreateSnapshotResponse) StatusCode() int { - return bcsr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bcsr BlobCreateSnapshotResponse) Status() string { - return bcsr.rawResponse.Status -} - -// Date returns the value for header Date. -func (bcsr BlobCreateSnapshotResponse) Date() time.Time { - s := bcsr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bcsr BlobCreateSnapshotResponse) ErrorCode() string { - return bcsr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (bcsr BlobCreateSnapshotResponse) ETag() ETag { - return ETag(bcsr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (bcsr BlobCreateSnapshotResponse) LastModified() time.Time { - s := bcsr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (bcsr BlobCreateSnapshotResponse) RequestID() string { - return bcsr.rawResponse.Header.Get("x-ms-request-id") -} - -// Snapshot returns the value for header x-ms-snapshot. -func (bcsr BlobCreateSnapshotResponse) Snapshot() string { - return bcsr.rawResponse.Header.Get("x-ms-snapshot") -} - -// Version returns the value for header x-ms-version. -func (bcsr BlobCreateSnapshotResponse) Version() string { - return bcsr.rawResponse.Header.Get("x-ms-version") -} - -// BlobDeleteResponse ... -type BlobDeleteResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (bdr BlobDeleteResponse) Response() *http.Response { - return bdr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bdr BlobDeleteResponse) StatusCode() int { - return bdr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bdr BlobDeleteResponse) Status() string { - return bdr.rawResponse.Status -} - -// Date returns the value for header Date. -func (bdr BlobDeleteResponse) Date() time.Time { - s := bdr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bdr BlobDeleteResponse) ErrorCode() string { - return bdr.rawResponse.Header.Get("x-ms-error-code") -} - -// RequestID returns the value for header x-ms-request-id. -func (bdr BlobDeleteResponse) RequestID() string { - return bdr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (bdr BlobDeleteResponse) Version() string { - return bdr.rawResponse.Header.Get("x-ms-version") -} - -// BlobFlatList ... -type BlobFlatList struct { - BlobItems []BlobItem `xml:"Blob"` -} - -// BlobGetPropertiesResponse ... -type BlobGetPropertiesResponse struct { - rawResponse *http.Response -} - -// NewMetadata returns user-defined key/value pairs. -func (bgpr BlobGetPropertiesResponse) NewMetadata() Metadata { - md := Metadata{} - for k, v := range bgpr.rawResponse.Header { - if len(k) > mdPrefixLen { - if prefix := k[0:mdPrefixLen]; strings.EqualFold(prefix, mdPrefix) { - md[strings.ToLower(k[mdPrefixLen:])] = v[0] - } - } - } - return md -} - -// Response returns the raw HTTP response object. -func (bgpr BlobGetPropertiesResponse) Response() *http.Response { - return bgpr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bgpr BlobGetPropertiesResponse) StatusCode() int { - return bgpr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bgpr BlobGetPropertiesResponse) Status() string { - return bgpr.rawResponse.Status -} - -// AcceptRanges returns the value for header Accept-Ranges. -func (bgpr BlobGetPropertiesResponse) AcceptRanges() string { - return bgpr.rawResponse.Header.Get("Accept-Ranges") -} - -// AccessTier returns the value for header x-ms-access-tier. -func (bgpr BlobGetPropertiesResponse) AccessTier() string { - return bgpr.rawResponse.Header.Get("x-ms-access-tier") -} - -// AccessTierInferred returns the value for header x-ms-access-tier-inferred. -func (bgpr BlobGetPropertiesResponse) AccessTierInferred() string { - return bgpr.rawResponse.Header.Get("x-ms-access-tier-inferred") -} - -// ArchiveStatus returns the value for header x-ms-archive-status. -func (bgpr BlobGetPropertiesResponse) ArchiveStatus() string { - return bgpr.rawResponse.Header.Get("x-ms-archive-status") -} - -// BlobCommittedBlockCount returns the value for header x-ms-blob-committed-block-count. -func (bgpr BlobGetPropertiesResponse) BlobCommittedBlockCount() int32 { - s := bgpr.rawResponse.Header.Get("x-ms-blob-committed-block-count") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 32) - if err != nil { - panic(err) - } - return int32(i) -} - -// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number. -func (bgpr BlobGetPropertiesResponse) BlobSequenceNumber() int64 { - s := bgpr.rawResponse.Header.Get("x-ms-blob-sequence-number") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 64) - if err != nil { - panic(err) - } - return i -} - -// BlobType returns the value for header x-ms-blob-type. -func (bgpr BlobGetPropertiesResponse) BlobType() BlobType { - return BlobType(bgpr.rawResponse.Header.Get("x-ms-blob-type")) -} - -// CacheControl returns the value for header Cache-Control. -func (bgpr BlobGetPropertiesResponse) CacheControl() string { - return bgpr.rawResponse.Header.Get("Cache-Control") -} - -// ContentDisposition returns the value for header Content-Disposition. -func (bgpr BlobGetPropertiesResponse) ContentDisposition() string { - return bgpr.rawResponse.Header.Get("Content-Disposition") -} - -// ContentEncoding returns the value for header Content-Encoding. -func (bgpr BlobGetPropertiesResponse) ContentEncoding() string { - return bgpr.rawResponse.Header.Get("Content-Encoding") -} - -// ContentLanguage returns the value for header Content-Language. -func (bgpr BlobGetPropertiesResponse) ContentLanguage() string { - return bgpr.rawResponse.Header.Get("Content-Language") -} - -// ContentLength returns the value for header Content-Length. -func (bgpr BlobGetPropertiesResponse) ContentLength() int64 { - s := bgpr.rawResponse.Header.Get("Content-Length") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 64) - if err != nil { - panic(err) - } - return i -} - -// ContentMD5 returns the value for header Content-MD5. -func (bgpr BlobGetPropertiesResponse) ContentMD5() []byte { - s := bgpr.rawResponse.Header.Get("Content-MD5") - if s == "" { - return nil - } - b, err := base64.StdEncoding.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - -// ContentType returns the value for header Content-Type. -func (bgpr BlobGetPropertiesResponse) ContentType() string { - return bgpr.rawResponse.Header.Get("Content-Type") -} - -// CopyCompletionTime returns the value for header x-ms-copy-completion-time. -func (bgpr BlobGetPropertiesResponse) CopyCompletionTime() time.Time { - s := bgpr.rawResponse.Header.Get("x-ms-copy-completion-time") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// CopyID returns the value for header x-ms-copy-id. -func (bgpr BlobGetPropertiesResponse) CopyID() string { - return bgpr.rawResponse.Header.Get("x-ms-copy-id") -} - -// CopyProgress returns the value for header x-ms-copy-progress. -func (bgpr BlobGetPropertiesResponse) CopyProgress() string { - return bgpr.rawResponse.Header.Get("x-ms-copy-progress") -} - -// CopySource returns the value for header x-ms-copy-source. -func (bgpr BlobGetPropertiesResponse) CopySource() string { - return bgpr.rawResponse.Header.Get("x-ms-copy-source") -} - -// CopyStatus returns the value for header x-ms-copy-status. -func (bgpr BlobGetPropertiesResponse) CopyStatus() CopyStatusType { - return CopyStatusType(bgpr.rawResponse.Header.Get("x-ms-copy-status")) -} - -// CopyStatusDescription returns the value for header x-ms-copy-status-description. -func (bgpr BlobGetPropertiesResponse) CopyStatusDescription() string { - return bgpr.rawResponse.Header.Get("x-ms-copy-status-description") -} - -// Date returns the value for header Date. -func (bgpr BlobGetPropertiesResponse) Date() time.Time { - s := bgpr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// DestinationSnapshot returns the value for header x-ms-copy-destination-snapshot. -func (bgpr BlobGetPropertiesResponse) DestinationSnapshot() string { - return bgpr.rawResponse.Header.Get("x-ms-copy-destination-snapshot") -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bgpr BlobGetPropertiesResponse) ErrorCode() string { - return bgpr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (bgpr BlobGetPropertiesResponse) ETag() ETag { - return ETag(bgpr.rawResponse.Header.Get("ETag")) -} - -// IsIncrementalCopy returns the value for header x-ms-incremental-copy. -func (bgpr BlobGetPropertiesResponse) IsIncrementalCopy() string { - return bgpr.rawResponse.Header.Get("x-ms-incremental-copy") -} - -// IsServerEncrypted returns the value for header x-ms-server-encrypted. -func (bgpr BlobGetPropertiesResponse) IsServerEncrypted() string { - return bgpr.rawResponse.Header.Get("x-ms-server-encrypted") -} - -// LastModified returns the value for header Last-Modified. -func (bgpr BlobGetPropertiesResponse) LastModified() time.Time { - s := bgpr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// LeaseDuration returns the value for header x-ms-lease-duration. -func (bgpr BlobGetPropertiesResponse) LeaseDuration() LeaseDurationType { - return LeaseDurationType(bgpr.rawResponse.Header.Get("x-ms-lease-duration")) -} - -// LeaseState returns the value for header x-ms-lease-state. -func (bgpr BlobGetPropertiesResponse) LeaseState() LeaseStateType { - return LeaseStateType(bgpr.rawResponse.Header.Get("x-ms-lease-state")) -} - -// LeaseStatus returns the value for header x-ms-lease-status. -func (bgpr BlobGetPropertiesResponse) LeaseStatus() LeaseStatusType { - return LeaseStatusType(bgpr.rawResponse.Header.Get("x-ms-lease-status")) -} - -// RequestID returns the value for header x-ms-request-id. -func (bgpr BlobGetPropertiesResponse) RequestID() string { - return bgpr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (bgpr BlobGetPropertiesResponse) Version() string { - return bgpr.rawResponse.Header.Get("x-ms-version") -} - -// BlobHierarchyList ... -type BlobHierarchyList struct { - BlobPrefixes []BlobPrefix `xml:"BlobPrefix"` - BlobItems []BlobItem `xml:"Blob"` -} - -// BlobItem - An Azure Storage blob -type BlobItem struct { - Name string `xml:"Name"` - Deleted bool `xml:"Deleted"` - Snapshot string `xml:"Snapshot"` - Properties BlobProperties `xml:"Properties"` - Metadata Metadata `xml:"Metadata"` -} - -// BlobPrefix ... -type BlobPrefix struct { - Name string `xml:"Name"` -} - -// BlobProperties - Properties of a blob -type BlobProperties struct { - LastModified time.Time `xml:"Last-Modified"` - Etag ETag `xml:"Etag"` - // ContentLength - Size in bytes - ContentLength *int64 `xml:"Content-Length"` - ContentType *string `xml:"Content-Type"` - ContentEncoding *string `xml:"Content-Encoding"` - ContentLanguage *string `xml:"Content-Language"` - ContentMD5 []byte `xml:"Content-MD5"` - ContentDisposition *string `xml:"Content-Disposition"` - CacheControl *string `xml:"Cache-Control"` - BlobSequenceNumber *int64 `xml:"x-ms-blob-sequence-number"` - // BlobType - Possible values include: 'BlobBlockBlob', 'BlobPageBlob', 'BlobAppendBlob', 'BlobNone' - BlobType BlobType `xml:"BlobType"` - // LeaseStatus - Possible values include: 'LeaseStatusLocked', 'LeaseStatusUnlocked', 'LeaseStatusNone' - LeaseStatus LeaseStatusType `xml:"LeaseStatus"` - // LeaseState - Possible values include: 'LeaseStateAvailable', 'LeaseStateLeased', 'LeaseStateExpired', 'LeaseStateBreaking', 'LeaseStateBroken', 'LeaseStateNone' - LeaseState LeaseStateType `xml:"LeaseState"` - // LeaseDuration - Possible values include: 'LeaseDurationInfinite', 'LeaseDurationFixed', 'LeaseDurationNone' - LeaseDuration LeaseDurationType `xml:"LeaseDuration"` - CopyID *string `xml:"CopyId"` - // CopyStatus - Possible values include: 'CopyStatusPending', 'CopyStatusSuccess', 'CopyStatusAborted', 'CopyStatusFailed', 'CopyStatusNone' - CopyStatus CopyStatusType `xml:"CopyStatus"` - CopySource *string `xml:"CopySource"` - CopyProgress *string `xml:"CopyProgress"` - CopyCompletionTime *time.Time `xml:"CopyCompletionTime"` - CopyStatusDescription *string `xml:"CopyStatusDescription"` - ServerEncrypted *bool `xml:"ServerEncrypted"` - IncrementalCopy *bool `xml:"IncrementalCopy"` - DestinationSnapshot *string `xml:"DestinationSnapshot"` - DeletedTime *time.Time `xml:"DeletedTime"` - RemainingRetentionDays *int32 `xml:"RemainingRetentionDays"` - // AccessTier - Possible values include: 'AccessTierP4', 'AccessTierP6', 'AccessTierP10', 'AccessTierP20', 'AccessTierP30', 'AccessTierP40', 'AccessTierP50', 'AccessTierHot', 'AccessTierCool', 'AccessTierArchive', 'AccessTierNone' - AccessTier AccessTierType `xml:"AccessTier"` - AccessTierInferred *bool `xml:"AccessTierInferred"` - // ArchiveStatus - Possible values include: 'ArchiveStatusRehydratePendingToHot', 'ArchiveStatusRehydratePendingToCool', 'ArchiveStatusNone' - ArchiveStatus ArchiveStatusType `xml:"ArchiveStatus"` -} - -// MarshalXML implements the xml.Marshaler interface for BlobProperties. -func (bp BlobProperties) MarshalXML(e *xml.Encoder, start xml.StartElement) error { - if reflect.TypeOf((*BlobProperties)(nil)).Elem().Size() != reflect.TypeOf((*blobProperties)(nil)).Elem().Size() { - panic("size mismatch between BlobProperties and blobProperties") - } - bp2 := (*blobProperties)(unsafe.Pointer(&bp)) - return e.EncodeElement(*bp2, start) -} - -// UnmarshalXML implements the xml.Unmarshaler interface for BlobProperties. -func (bp *BlobProperties) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - if reflect.TypeOf((*BlobProperties)(nil)).Elem().Size() != reflect.TypeOf((*blobProperties)(nil)).Elem().Size() { - panic("size mismatch between BlobProperties and blobProperties") - } - bp2 := (*blobProperties)(unsafe.Pointer(bp)) - return d.DecodeElement(bp2, &start) -} - -// BlobReleaseLeaseResponse ... -type BlobReleaseLeaseResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (brlr BlobReleaseLeaseResponse) Response() *http.Response { - return brlr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (brlr BlobReleaseLeaseResponse) StatusCode() int { - return brlr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (brlr BlobReleaseLeaseResponse) Status() string { - return brlr.rawResponse.Status -} - -// Date returns the value for header Date. -func (brlr BlobReleaseLeaseResponse) Date() time.Time { - s := brlr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (brlr BlobReleaseLeaseResponse) ErrorCode() string { - return brlr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (brlr BlobReleaseLeaseResponse) ETag() ETag { - return ETag(brlr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (brlr BlobReleaseLeaseResponse) LastModified() time.Time { - s := brlr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (brlr BlobReleaseLeaseResponse) RequestID() string { - return brlr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (brlr BlobReleaseLeaseResponse) Version() string { - return brlr.rawResponse.Header.Get("x-ms-version") -} - -// BlobRenewLeaseResponse ... -type BlobRenewLeaseResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (brlr BlobRenewLeaseResponse) Response() *http.Response { - return brlr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (brlr BlobRenewLeaseResponse) StatusCode() int { - return brlr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (brlr BlobRenewLeaseResponse) Status() string { - return brlr.rawResponse.Status -} - -// Date returns the value for header Date. -func (brlr BlobRenewLeaseResponse) Date() time.Time { - s := brlr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (brlr BlobRenewLeaseResponse) ErrorCode() string { - return brlr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (brlr BlobRenewLeaseResponse) ETag() ETag { - return ETag(brlr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (brlr BlobRenewLeaseResponse) LastModified() time.Time { - s := brlr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// LeaseID returns the value for header x-ms-lease-id. -func (brlr BlobRenewLeaseResponse) LeaseID() string { - return brlr.rawResponse.Header.Get("x-ms-lease-id") -} - -// RequestID returns the value for header x-ms-request-id. -func (brlr BlobRenewLeaseResponse) RequestID() string { - return brlr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (brlr BlobRenewLeaseResponse) Version() string { - return brlr.rawResponse.Header.Get("x-ms-version") -} - -// BlobSetHTTPHeadersResponse ... -type BlobSetHTTPHeadersResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (bshhr BlobSetHTTPHeadersResponse) Response() *http.Response { - return bshhr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bshhr BlobSetHTTPHeadersResponse) StatusCode() int { - return bshhr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bshhr BlobSetHTTPHeadersResponse) Status() string { - return bshhr.rawResponse.Status -} - -// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number. -func (bshhr BlobSetHTTPHeadersResponse) BlobSequenceNumber() int64 { - s := bshhr.rawResponse.Header.Get("x-ms-blob-sequence-number") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 64) - if err != nil { - panic(err) - } - return i -} - -// Date returns the value for header Date. -func (bshhr BlobSetHTTPHeadersResponse) Date() time.Time { - s := bshhr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bshhr BlobSetHTTPHeadersResponse) ErrorCode() string { - return bshhr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (bshhr BlobSetHTTPHeadersResponse) ETag() ETag { - return ETag(bshhr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (bshhr BlobSetHTTPHeadersResponse) LastModified() time.Time { - s := bshhr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (bshhr BlobSetHTTPHeadersResponse) RequestID() string { - return bshhr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (bshhr BlobSetHTTPHeadersResponse) Version() string { - return bshhr.rawResponse.Header.Get("x-ms-version") -} - -// BlobSetMetadataResponse ... -type BlobSetMetadataResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (bsmr BlobSetMetadataResponse) Response() *http.Response { - return bsmr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bsmr BlobSetMetadataResponse) StatusCode() int { - return bsmr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bsmr BlobSetMetadataResponse) Status() string { - return bsmr.rawResponse.Status -} - -// Date returns the value for header Date. -func (bsmr BlobSetMetadataResponse) Date() time.Time { - s := bsmr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bsmr BlobSetMetadataResponse) ErrorCode() string { - return bsmr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (bsmr BlobSetMetadataResponse) ETag() ETag { - return ETag(bsmr.rawResponse.Header.Get("ETag")) -} - -// IsServerEncrypted returns the value for header x-ms-request-server-encrypted. -func (bsmr BlobSetMetadataResponse) IsServerEncrypted() string { - return bsmr.rawResponse.Header.Get("x-ms-request-server-encrypted") -} - -// LastModified returns the value for header Last-Modified. -func (bsmr BlobSetMetadataResponse) LastModified() time.Time { - s := bsmr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (bsmr BlobSetMetadataResponse) RequestID() string { - return bsmr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (bsmr BlobSetMetadataResponse) Version() string { - return bsmr.rawResponse.Header.Get("x-ms-version") -} - -// BlobSetTierResponse ... -type BlobSetTierResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (bstr BlobSetTierResponse) Response() *http.Response { - return bstr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bstr BlobSetTierResponse) StatusCode() int { - return bstr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bstr BlobSetTierResponse) Status() string { - return bstr.rawResponse.Status -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bstr BlobSetTierResponse) ErrorCode() string { - return bstr.rawResponse.Header.Get("x-ms-error-code") -} - -// RequestID returns the value for header x-ms-request-id. -func (bstr BlobSetTierResponse) RequestID() string { - return bstr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (bstr BlobSetTierResponse) Version() string { - return bstr.rawResponse.Header.Get("x-ms-version") -} - -// BlobStartCopyFromURLResponse ... -type BlobStartCopyFromURLResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (bscfur BlobStartCopyFromURLResponse) Response() *http.Response { - return bscfur.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bscfur BlobStartCopyFromURLResponse) StatusCode() int { - return bscfur.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bscfur BlobStartCopyFromURLResponse) Status() string { - return bscfur.rawResponse.Status -} - -// CopyID returns the value for header x-ms-copy-id. -func (bscfur BlobStartCopyFromURLResponse) CopyID() string { - return bscfur.rawResponse.Header.Get("x-ms-copy-id") -} - -// CopyStatus returns the value for header x-ms-copy-status. -func (bscfur BlobStartCopyFromURLResponse) CopyStatus() CopyStatusType { - return CopyStatusType(bscfur.rawResponse.Header.Get("x-ms-copy-status")) -} - -// Date returns the value for header Date. -func (bscfur BlobStartCopyFromURLResponse) Date() time.Time { - s := bscfur.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bscfur BlobStartCopyFromURLResponse) ErrorCode() string { - return bscfur.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (bscfur BlobStartCopyFromURLResponse) ETag() ETag { - return ETag(bscfur.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (bscfur BlobStartCopyFromURLResponse) LastModified() time.Time { - s := bscfur.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (bscfur BlobStartCopyFromURLResponse) RequestID() string { - return bscfur.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (bscfur BlobStartCopyFromURLResponse) Version() string { - return bscfur.rawResponse.Header.Get("x-ms-version") -} - -// BlobUndeleteResponse ... -type BlobUndeleteResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (bur BlobUndeleteResponse) Response() *http.Response { - return bur.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bur BlobUndeleteResponse) StatusCode() int { - return bur.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bur BlobUndeleteResponse) Status() string { - return bur.rawResponse.Status -} - -// Date returns the value for header Date. -func (bur BlobUndeleteResponse) Date() time.Time { - s := bur.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bur BlobUndeleteResponse) ErrorCode() string { - return bur.rawResponse.Header.Get("x-ms-error-code") -} - -// RequestID returns the value for header x-ms-request-id. -func (bur BlobUndeleteResponse) RequestID() string { - return bur.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (bur BlobUndeleteResponse) Version() string { - return bur.rawResponse.Header.Get("x-ms-version") -} - -// Block - Represents a single block in a block blob. It describes the block's ID and size. -type Block struct { - // Name - The base64 encoded block ID. - Name string `xml:"Name"` - // Size - The block size in bytes. - Size int32 `xml:"Size"` -} - -// BlockBlobCommitBlockListResponse ... -type BlockBlobCommitBlockListResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (bbcblr BlockBlobCommitBlockListResponse) Response() *http.Response { - return bbcblr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bbcblr BlockBlobCommitBlockListResponse) StatusCode() int { - return bbcblr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bbcblr BlockBlobCommitBlockListResponse) Status() string { - return bbcblr.rawResponse.Status -} - -// ContentMD5 returns the value for header Content-MD5. -func (bbcblr BlockBlobCommitBlockListResponse) ContentMD5() []byte { - s := bbcblr.rawResponse.Header.Get("Content-MD5") - if s == "" { - return nil - } - b, err := base64.StdEncoding.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - -// Date returns the value for header Date. -func (bbcblr BlockBlobCommitBlockListResponse) Date() time.Time { - s := bbcblr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bbcblr BlockBlobCommitBlockListResponse) ErrorCode() string { - return bbcblr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (bbcblr BlockBlobCommitBlockListResponse) ETag() ETag { - return ETag(bbcblr.rawResponse.Header.Get("ETag")) -} - -// IsServerEncrypted returns the value for header x-ms-request-server-encrypted. -func (bbcblr BlockBlobCommitBlockListResponse) IsServerEncrypted() string { - return bbcblr.rawResponse.Header.Get("x-ms-request-server-encrypted") -} - -// LastModified returns the value for header Last-Modified. -func (bbcblr BlockBlobCommitBlockListResponse) LastModified() time.Time { - s := bbcblr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (bbcblr BlockBlobCommitBlockListResponse) RequestID() string { - return bbcblr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (bbcblr BlockBlobCommitBlockListResponse) Version() string { - return bbcblr.rawResponse.Header.Get("x-ms-version") -} - -// BlockBlobStageBlockFromURLResponse ... -type BlockBlobStageBlockFromURLResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (bbsbfur BlockBlobStageBlockFromURLResponse) Response() *http.Response { - return bbsbfur.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bbsbfur BlockBlobStageBlockFromURLResponse) StatusCode() int { - return bbsbfur.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bbsbfur BlockBlobStageBlockFromURLResponse) Status() string { - return bbsbfur.rawResponse.Status -} - -// ContentMD5 returns the value for header Content-MD5. -func (bbsbfur BlockBlobStageBlockFromURLResponse) ContentMD5() []byte { - s := bbsbfur.rawResponse.Header.Get("Content-MD5") - if s == "" { - return nil - } - b, err := base64.StdEncoding.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - -// Date returns the value for header Date. -func (bbsbfur BlockBlobStageBlockFromURLResponse) Date() time.Time { - s := bbsbfur.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bbsbfur BlockBlobStageBlockFromURLResponse) ErrorCode() string { - return bbsbfur.rawResponse.Header.Get("x-ms-error-code") -} - -// IsServerEncrypted returns the value for header x-ms-request-server-encrypted. -func (bbsbfur BlockBlobStageBlockFromURLResponse) IsServerEncrypted() string { - return bbsbfur.rawResponse.Header.Get("x-ms-request-server-encrypted") -} - -// RequestID returns the value for header x-ms-request-id. -func (bbsbfur BlockBlobStageBlockFromURLResponse) RequestID() string { - return bbsbfur.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (bbsbfur BlockBlobStageBlockFromURLResponse) Version() string { - return bbsbfur.rawResponse.Header.Get("x-ms-version") -} - -// BlockBlobStageBlockResponse ... -type BlockBlobStageBlockResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (bbsbr BlockBlobStageBlockResponse) Response() *http.Response { - return bbsbr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bbsbr BlockBlobStageBlockResponse) StatusCode() int { - return bbsbr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bbsbr BlockBlobStageBlockResponse) Status() string { - return bbsbr.rawResponse.Status -} - -// ContentMD5 returns the value for header Content-MD5. -func (bbsbr BlockBlobStageBlockResponse) ContentMD5() []byte { - s := bbsbr.rawResponse.Header.Get("Content-MD5") - if s == "" { - return nil - } - b, err := base64.StdEncoding.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - -// Date returns the value for header Date. -func (bbsbr BlockBlobStageBlockResponse) Date() time.Time { - s := bbsbr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bbsbr BlockBlobStageBlockResponse) ErrorCode() string { - return bbsbr.rawResponse.Header.Get("x-ms-error-code") -} - -// IsServerEncrypted returns the value for header x-ms-request-server-encrypted. -func (bbsbr BlockBlobStageBlockResponse) IsServerEncrypted() string { - return bbsbr.rawResponse.Header.Get("x-ms-request-server-encrypted") -} - -// RequestID returns the value for header x-ms-request-id. -func (bbsbr BlockBlobStageBlockResponse) RequestID() string { - return bbsbr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (bbsbr BlockBlobStageBlockResponse) Version() string { - return bbsbr.rawResponse.Header.Get("x-ms-version") -} - -// BlockBlobUploadResponse ... -type BlockBlobUploadResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (bbur BlockBlobUploadResponse) Response() *http.Response { - return bbur.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bbur BlockBlobUploadResponse) StatusCode() int { - return bbur.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bbur BlockBlobUploadResponse) Status() string { - return bbur.rawResponse.Status -} - -// ContentMD5 returns the value for header Content-MD5. -func (bbur BlockBlobUploadResponse) ContentMD5() []byte { - s := bbur.rawResponse.Header.Get("Content-MD5") - if s == "" { - return nil - } - b, err := base64.StdEncoding.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - -// Date returns the value for header Date. -func (bbur BlockBlobUploadResponse) Date() time.Time { - s := bbur.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bbur BlockBlobUploadResponse) ErrorCode() string { - return bbur.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (bbur BlockBlobUploadResponse) ETag() ETag { - return ETag(bbur.rawResponse.Header.Get("ETag")) -} - -// IsServerEncrypted returns the value for header x-ms-request-server-encrypted. -func (bbur BlockBlobUploadResponse) IsServerEncrypted() string { - return bbur.rawResponse.Header.Get("x-ms-request-server-encrypted") -} - -// LastModified returns the value for header Last-Modified. -func (bbur BlockBlobUploadResponse) LastModified() time.Time { - s := bbur.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (bbur BlockBlobUploadResponse) RequestID() string { - return bbur.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (bbur BlockBlobUploadResponse) Version() string { - return bbur.rawResponse.Header.Get("x-ms-version") -} - -// BlockList ... -type BlockList struct { - rawResponse *http.Response - CommittedBlocks []Block `xml:"CommittedBlocks>Block"` - UncommittedBlocks []Block `xml:"UncommittedBlocks>Block"` -} - -// Response returns the raw HTTP response object. -func (bl BlockList) Response() *http.Response { - return bl.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (bl BlockList) StatusCode() int { - return bl.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (bl BlockList) Status() string { - return bl.rawResponse.Status -} - -// BlobContentLength returns the value for header x-ms-blob-content-length. -func (bl BlockList) BlobContentLength() int64 { - s := bl.rawResponse.Header.Get("x-ms-blob-content-length") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 64) - if err != nil { - panic(err) - } - return i -} - -// ContentType returns the value for header Content-Type. -func (bl BlockList) ContentType() string { - return bl.rawResponse.Header.Get("Content-Type") -} - -// Date returns the value for header Date. -func (bl BlockList) Date() time.Time { - s := bl.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (bl BlockList) ErrorCode() string { - return bl.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (bl BlockList) ETag() ETag { - return ETag(bl.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (bl BlockList) LastModified() time.Time { - s := bl.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (bl BlockList) RequestID() string { - return bl.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (bl BlockList) Version() string { - return bl.rawResponse.Header.Get("x-ms-version") -} - -// BlockLookupList ... -type BlockLookupList struct { - // XMLName is used for marshalling and is subject to removal in a future release. - XMLName xml.Name `xml:"BlockList"` - Committed []string `xml:"Committed"` - Uncommitted []string `xml:"Uncommitted"` - Latest []string `xml:"Latest"` -} - -// ClearRange ... -type ClearRange struct { - Start int64 `xml:"Start"` - End int64 `xml:"End"` -} - -// ContainerAcquireLeaseResponse ... -type ContainerAcquireLeaseResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (calr ContainerAcquireLeaseResponse) Response() *http.Response { - return calr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (calr ContainerAcquireLeaseResponse) StatusCode() int { - return calr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (calr ContainerAcquireLeaseResponse) Status() string { - return calr.rawResponse.Status -} - -// Date returns the value for header Date. -func (calr ContainerAcquireLeaseResponse) Date() time.Time { - s := calr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (calr ContainerAcquireLeaseResponse) ErrorCode() string { - return calr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (calr ContainerAcquireLeaseResponse) ETag() ETag { - return ETag(calr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (calr ContainerAcquireLeaseResponse) LastModified() time.Time { - s := calr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// LeaseID returns the value for header x-ms-lease-id. -func (calr ContainerAcquireLeaseResponse) LeaseID() string { - return calr.rawResponse.Header.Get("x-ms-lease-id") -} - -// RequestID returns the value for header x-ms-request-id. -func (calr ContainerAcquireLeaseResponse) RequestID() string { - return calr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (calr ContainerAcquireLeaseResponse) Version() string { - return calr.rawResponse.Header.Get("x-ms-version") -} - -// ContainerBreakLeaseResponse ... -type ContainerBreakLeaseResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (cblr ContainerBreakLeaseResponse) Response() *http.Response { - return cblr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (cblr ContainerBreakLeaseResponse) StatusCode() int { - return cblr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (cblr ContainerBreakLeaseResponse) Status() string { - return cblr.rawResponse.Status -} - -// Date returns the value for header Date. -func (cblr ContainerBreakLeaseResponse) Date() time.Time { - s := cblr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (cblr ContainerBreakLeaseResponse) ErrorCode() string { - return cblr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (cblr ContainerBreakLeaseResponse) ETag() ETag { - return ETag(cblr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (cblr ContainerBreakLeaseResponse) LastModified() time.Time { - s := cblr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// LeaseTime returns the value for header x-ms-lease-time. -func (cblr ContainerBreakLeaseResponse) LeaseTime() int32 { - s := cblr.rawResponse.Header.Get("x-ms-lease-time") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 32) - if err != nil { - panic(err) - } - return int32(i) -} - -// RequestID returns the value for header x-ms-request-id. -func (cblr ContainerBreakLeaseResponse) RequestID() string { - return cblr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (cblr ContainerBreakLeaseResponse) Version() string { - return cblr.rawResponse.Header.Get("x-ms-version") -} - -// ContainerChangeLeaseResponse ... -type ContainerChangeLeaseResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (cclr ContainerChangeLeaseResponse) Response() *http.Response { - return cclr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (cclr ContainerChangeLeaseResponse) StatusCode() int { - return cclr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (cclr ContainerChangeLeaseResponse) Status() string { - return cclr.rawResponse.Status -} - -// Date returns the value for header Date. -func (cclr ContainerChangeLeaseResponse) Date() time.Time { - s := cclr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (cclr ContainerChangeLeaseResponse) ErrorCode() string { - return cclr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (cclr ContainerChangeLeaseResponse) ETag() ETag { - return ETag(cclr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (cclr ContainerChangeLeaseResponse) LastModified() time.Time { - s := cclr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// LeaseID returns the value for header x-ms-lease-id. -func (cclr ContainerChangeLeaseResponse) LeaseID() string { - return cclr.rawResponse.Header.Get("x-ms-lease-id") -} - -// RequestID returns the value for header x-ms-request-id. -func (cclr ContainerChangeLeaseResponse) RequestID() string { - return cclr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (cclr ContainerChangeLeaseResponse) Version() string { - return cclr.rawResponse.Header.Get("x-ms-version") -} - -// ContainerCreateResponse ... -type ContainerCreateResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (ccr ContainerCreateResponse) Response() *http.Response { - return ccr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (ccr ContainerCreateResponse) StatusCode() int { - return ccr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (ccr ContainerCreateResponse) Status() string { - return ccr.rawResponse.Status -} - -// Date returns the value for header Date. -func (ccr ContainerCreateResponse) Date() time.Time { - s := ccr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (ccr ContainerCreateResponse) ErrorCode() string { - return ccr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (ccr ContainerCreateResponse) ETag() ETag { - return ETag(ccr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (ccr ContainerCreateResponse) LastModified() time.Time { - s := ccr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (ccr ContainerCreateResponse) RequestID() string { - return ccr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (ccr ContainerCreateResponse) Version() string { - return ccr.rawResponse.Header.Get("x-ms-version") -} - -// ContainerDeleteResponse ... -type ContainerDeleteResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (cdr ContainerDeleteResponse) Response() *http.Response { - return cdr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (cdr ContainerDeleteResponse) StatusCode() int { - return cdr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (cdr ContainerDeleteResponse) Status() string { - return cdr.rawResponse.Status -} - -// Date returns the value for header Date. -func (cdr ContainerDeleteResponse) Date() time.Time { - s := cdr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (cdr ContainerDeleteResponse) ErrorCode() string { - return cdr.rawResponse.Header.Get("x-ms-error-code") -} - -// RequestID returns the value for header x-ms-request-id. -func (cdr ContainerDeleteResponse) RequestID() string { - return cdr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (cdr ContainerDeleteResponse) Version() string { - return cdr.rawResponse.Header.Get("x-ms-version") -} - -// ContainerGetPropertiesResponse ... -type ContainerGetPropertiesResponse struct { - rawResponse *http.Response -} - -// NewMetadata returns user-defined key/value pairs. -func (cgpr ContainerGetPropertiesResponse) NewMetadata() Metadata { - md := Metadata{} - for k, v := range cgpr.rawResponse.Header { - if len(k) > mdPrefixLen { - if prefix := k[0:mdPrefixLen]; strings.EqualFold(prefix, mdPrefix) { - md[strings.ToLower(k[mdPrefixLen:])] = v[0] - } - } - } - return md -} - -// Response returns the raw HTTP response object. -func (cgpr ContainerGetPropertiesResponse) Response() *http.Response { - return cgpr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (cgpr ContainerGetPropertiesResponse) StatusCode() int { - return cgpr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (cgpr ContainerGetPropertiesResponse) Status() string { - return cgpr.rawResponse.Status -} - -// BlobPublicAccess returns the value for header x-ms-blob-public-access. -func (cgpr ContainerGetPropertiesResponse) BlobPublicAccess() PublicAccessType { - return PublicAccessType(cgpr.rawResponse.Header.Get("x-ms-blob-public-access")) -} - -// Date returns the value for header Date. -func (cgpr ContainerGetPropertiesResponse) Date() time.Time { - s := cgpr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (cgpr ContainerGetPropertiesResponse) ErrorCode() string { - return cgpr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (cgpr ContainerGetPropertiesResponse) ETag() ETag { - return ETag(cgpr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (cgpr ContainerGetPropertiesResponse) LastModified() time.Time { - s := cgpr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// LeaseDuration returns the value for header x-ms-lease-duration. -func (cgpr ContainerGetPropertiesResponse) LeaseDuration() LeaseDurationType { - return LeaseDurationType(cgpr.rawResponse.Header.Get("x-ms-lease-duration")) -} - -// LeaseState returns the value for header x-ms-lease-state. -func (cgpr ContainerGetPropertiesResponse) LeaseState() LeaseStateType { - return LeaseStateType(cgpr.rawResponse.Header.Get("x-ms-lease-state")) -} - -// LeaseStatus returns the value for header x-ms-lease-status. -func (cgpr ContainerGetPropertiesResponse) LeaseStatus() LeaseStatusType { - return LeaseStatusType(cgpr.rawResponse.Header.Get("x-ms-lease-status")) -} - -// RequestID returns the value for header x-ms-request-id. -func (cgpr ContainerGetPropertiesResponse) RequestID() string { - return cgpr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (cgpr ContainerGetPropertiesResponse) Version() string { - return cgpr.rawResponse.Header.Get("x-ms-version") -} - -// ContainerItem - An Azure Storage container -type ContainerItem struct { - Name string `xml:"Name"` - Properties ContainerProperties `xml:"Properties"` - Metadata Metadata `xml:"Metadata"` -} - -// ContainerProperties - Properties of a container -type ContainerProperties struct { - LastModified time.Time `xml:"Last-Modified"` - Etag ETag `xml:"Etag"` - // LeaseStatus - Possible values include: 'LeaseStatusLocked', 'LeaseStatusUnlocked', 'LeaseStatusNone' - LeaseStatus LeaseStatusType `xml:"LeaseStatus"` - // LeaseState - Possible values include: 'LeaseStateAvailable', 'LeaseStateLeased', 'LeaseStateExpired', 'LeaseStateBreaking', 'LeaseStateBroken', 'LeaseStateNone' - LeaseState LeaseStateType `xml:"LeaseState"` - // LeaseDuration - Possible values include: 'LeaseDurationInfinite', 'LeaseDurationFixed', 'LeaseDurationNone' - LeaseDuration LeaseDurationType `xml:"LeaseDuration"` - // PublicAccess - Possible values include: 'PublicAccessContainer', 'PublicAccessBlob', 'PublicAccessNone' - PublicAccess PublicAccessType `xml:"PublicAccess"` -} - -// MarshalXML implements the xml.Marshaler interface for ContainerProperties. -func (cp ContainerProperties) MarshalXML(e *xml.Encoder, start xml.StartElement) error { - if reflect.TypeOf((*ContainerProperties)(nil)).Elem().Size() != reflect.TypeOf((*containerProperties)(nil)).Elem().Size() { - panic("size mismatch between ContainerProperties and containerProperties") - } - cp2 := (*containerProperties)(unsafe.Pointer(&cp)) - return e.EncodeElement(*cp2, start) -} - -// UnmarshalXML implements the xml.Unmarshaler interface for ContainerProperties. -func (cp *ContainerProperties) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - if reflect.TypeOf((*ContainerProperties)(nil)).Elem().Size() != reflect.TypeOf((*containerProperties)(nil)).Elem().Size() { - panic("size mismatch between ContainerProperties and containerProperties") - } - cp2 := (*containerProperties)(unsafe.Pointer(cp)) - return d.DecodeElement(cp2, &start) -} - -// ContainerReleaseLeaseResponse ... -type ContainerReleaseLeaseResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (crlr ContainerReleaseLeaseResponse) Response() *http.Response { - return crlr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (crlr ContainerReleaseLeaseResponse) StatusCode() int { - return crlr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (crlr ContainerReleaseLeaseResponse) Status() string { - return crlr.rawResponse.Status -} - -// Date returns the value for header Date. -func (crlr ContainerReleaseLeaseResponse) Date() time.Time { - s := crlr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (crlr ContainerReleaseLeaseResponse) ErrorCode() string { - return crlr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (crlr ContainerReleaseLeaseResponse) ETag() ETag { - return ETag(crlr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (crlr ContainerReleaseLeaseResponse) LastModified() time.Time { - s := crlr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (crlr ContainerReleaseLeaseResponse) RequestID() string { - return crlr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (crlr ContainerReleaseLeaseResponse) Version() string { - return crlr.rawResponse.Header.Get("x-ms-version") -} - -// ContainerRenewLeaseResponse ... -type ContainerRenewLeaseResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (crlr ContainerRenewLeaseResponse) Response() *http.Response { - return crlr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (crlr ContainerRenewLeaseResponse) StatusCode() int { - return crlr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (crlr ContainerRenewLeaseResponse) Status() string { - return crlr.rawResponse.Status -} - -// Date returns the value for header Date. -func (crlr ContainerRenewLeaseResponse) Date() time.Time { - s := crlr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (crlr ContainerRenewLeaseResponse) ErrorCode() string { - return crlr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (crlr ContainerRenewLeaseResponse) ETag() ETag { - return ETag(crlr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (crlr ContainerRenewLeaseResponse) LastModified() time.Time { - s := crlr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// LeaseID returns the value for header x-ms-lease-id. -func (crlr ContainerRenewLeaseResponse) LeaseID() string { - return crlr.rawResponse.Header.Get("x-ms-lease-id") -} - -// RequestID returns the value for header x-ms-request-id. -func (crlr ContainerRenewLeaseResponse) RequestID() string { - return crlr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (crlr ContainerRenewLeaseResponse) Version() string { - return crlr.rawResponse.Header.Get("x-ms-version") -} - -// ContainerSetAccessPolicyResponse ... -type ContainerSetAccessPolicyResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (csapr ContainerSetAccessPolicyResponse) Response() *http.Response { - return csapr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (csapr ContainerSetAccessPolicyResponse) StatusCode() int { - return csapr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (csapr ContainerSetAccessPolicyResponse) Status() string { - return csapr.rawResponse.Status -} - -// Date returns the value for header Date. -func (csapr ContainerSetAccessPolicyResponse) Date() time.Time { - s := csapr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (csapr ContainerSetAccessPolicyResponse) ErrorCode() string { - return csapr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (csapr ContainerSetAccessPolicyResponse) ETag() ETag { - return ETag(csapr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (csapr ContainerSetAccessPolicyResponse) LastModified() time.Time { - s := csapr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (csapr ContainerSetAccessPolicyResponse) RequestID() string { - return csapr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (csapr ContainerSetAccessPolicyResponse) Version() string { - return csapr.rawResponse.Header.Get("x-ms-version") -} - -// ContainerSetMetadataResponse ... -type ContainerSetMetadataResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (csmr ContainerSetMetadataResponse) Response() *http.Response { - return csmr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (csmr ContainerSetMetadataResponse) StatusCode() int { - return csmr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (csmr ContainerSetMetadataResponse) Status() string { - return csmr.rawResponse.Status -} - -// Date returns the value for header Date. -func (csmr ContainerSetMetadataResponse) Date() time.Time { - s := csmr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (csmr ContainerSetMetadataResponse) ErrorCode() string { - return csmr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (csmr ContainerSetMetadataResponse) ETag() ETag { - return ETag(csmr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (csmr ContainerSetMetadataResponse) LastModified() time.Time { - s := csmr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (csmr ContainerSetMetadataResponse) RequestID() string { - return csmr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (csmr ContainerSetMetadataResponse) Version() string { - return csmr.rawResponse.Header.Get("x-ms-version") -} - -// CorsRule - CORS is an HTTP feature that enables a web application running under one domain to access -// resources in another domain. Web browsers implement a security restriction known as same-origin policy that -// prevents a web page from calling APIs in a different domain; CORS provides a secure way to allow one domain -// (the origin domain) to call APIs in another domain -type CorsRule struct { - // AllowedOrigins - The origin domains that are permitted to make a request against the storage service via CORS. The origin domain is the domain from which the request originates. Note that the origin must be an exact case-sensitive match with the origin that the user age sends to the service. You can also use the wildcard character '*' to allow all origin domains to make requests via CORS. - AllowedOrigins string `xml:"AllowedOrigins"` - // AllowedMethods - The methods (HTTP request verbs) that the origin domain may use for a CORS request. (comma separated) - AllowedMethods string `xml:"AllowedMethods"` - // AllowedHeaders - the request headers that the origin domain may specify on the CORS request. - AllowedHeaders string `xml:"AllowedHeaders"` - // ExposedHeaders - The response headers that may be sent in the response to the CORS request and exposed by the browser to the request issuer - ExposedHeaders string `xml:"ExposedHeaders"` - // MaxAgeInSeconds - The maximum amount time that a browser should cache the preflight OPTIONS request. - MaxAgeInSeconds int32 `xml:"MaxAgeInSeconds"` -} - -// downloadResponse ... -type downloadResponse struct { - rawResponse *http.Response -} - -// NewMetadata returns user-defined key/value pairs. -func (dr downloadResponse) NewMetadata() Metadata { - md := Metadata{} - for k, v := range dr.rawResponse.Header { - if len(k) > mdPrefixLen { - if prefix := k[0:mdPrefixLen]; strings.EqualFold(prefix, mdPrefix) { - md[strings.ToLower(k[mdPrefixLen:])] = v[0] - } - } - } - return md -} - -// Response returns the raw HTTP response object. -func (dr downloadResponse) Response() *http.Response { - return dr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (dr downloadResponse) StatusCode() int { - return dr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (dr downloadResponse) Status() string { - return dr.rawResponse.Status -} - -// Body returns the raw HTTP response object's Body. -func (dr downloadResponse) Body() io.ReadCloser { - return dr.rawResponse.Body -} - -// AcceptRanges returns the value for header Accept-Ranges. -func (dr downloadResponse) AcceptRanges() string { - return dr.rawResponse.Header.Get("Accept-Ranges") -} - -// BlobCommittedBlockCount returns the value for header x-ms-blob-committed-block-count. -func (dr downloadResponse) BlobCommittedBlockCount() int32 { - s := dr.rawResponse.Header.Get("x-ms-blob-committed-block-count") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 32) - if err != nil { - panic(err) - } - return int32(i) -} - -// BlobContentMD5 returns the value for header x-ms-blob-content-md5. -func (dr downloadResponse) BlobContentMD5() []byte { - s := dr.rawResponse.Header.Get("x-ms-blob-content-md5") - if s == "" { - return nil - } - b, err := base64.StdEncoding.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - -// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number. -func (dr downloadResponse) BlobSequenceNumber() int64 { - s := dr.rawResponse.Header.Get("x-ms-blob-sequence-number") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 64) - if err != nil { - panic(err) - } - return i -} - -// BlobType returns the value for header x-ms-blob-type. -func (dr downloadResponse) BlobType() BlobType { - return BlobType(dr.rawResponse.Header.Get("x-ms-blob-type")) -} - -// CacheControl returns the value for header Cache-Control. -func (dr downloadResponse) CacheControl() string { - return dr.rawResponse.Header.Get("Cache-Control") -} - -// ContentDisposition returns the value for header Content-Disposition. -func (dr downloadResponse) ContentDisposition() string { - return dr.rawResponse.Header.Get("Content-Disposition") -} - -// ContentEncoding returns the value for header Content-Encoding. -func (dr downloadResponse) ContentEncoding() string { - return dr.rawResponse.Header.Get("Content-Encoding") -} - -// ContentLanguage returns the value for header Content-Language. -func (dr downloadResponse) ContentLanguage() string { - return dr.rawResponse.Header.Get("Content-Language") -} - -// ContentLength returns the value for header Content-Length. -func (dr downloadResponse) ContentLength() int64 { - s := dr.rawResponse.Header.Get("Content-Length") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 64) - if err != nil { - panic(err) - } - return i -} - -// ContentMD5 returns the value for header Content-MD5. -func (dr downloadResponse) ContentMD5() []byte { - s := dr.rawResponse.Header.Get("Content-MD5") - if s == "" { - return nil - } - b, err := base64.StdEncoding.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - -// ContentRange returns the value for header Content-Range. -func (dr downloadResponse) ContentRange() string { - return dr.rawResponse.Header.Get("Content-Range") -} - -// ContentType returns the value for header Content-Type. -func (dr downloadResponse) ContentType() string { - return dr.rawResponse.Header.Get("Content-Type") -} - -// CopyCompletionTime returns the value for header x-ms-copy-completion-time. -func (dr downloadResponse) CopyCompletionTime() time.Time { - s := dr.rawResponse.Header.Get("x-ms-copy-completion-time") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// CopyID returns the value for header x-ms-copy-id. -func (dr downloadResponse) CopyID() string { - return dr.rawResponse.Header.Get("x-ms-copy-id") -} - -// CopyProgress returns the value for header x-ms-copy-progress. -func (dr downloadResponse) CopyProgress() string { - return dr.rawResponse.Header.Get("x-ms-copy-progress") -} - -// CopySource returns the value for header x-ms-copy-source. -func (dr downloadResponse) CopySource() string { - return dr.rawResponse.Header.Get("x-ms-copy-source") -} - -// CopyStatus returns the value for header x-ms-copy-status. -func (dr downloadResponse) CopyStatus() CopyStatusType { - return CopyStatusType(dr.rawResponse.Header.Get("x-ms-copy-status")) -} - -// CopyStatusDescription returns the value for header x-ms-copy-status-description. -func (dr downloadResponse) CopyStatusDescription() string { - return dr.rawResponse.Header.Get("x-ms-copy-status-description") -} - -// Date returns the value for header Date. -func (dr downloadResponse) Date() time.Time { - s := dr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (dr downloadResponse) ErrorCode() string { - return dr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (dr downloadResponse) ETag() ETag { - return ETag(dr.rawResponse.Header.Get("ETag")) -} - -// IsServerEncrypted returns the value for header x-ms-server-encrypted. -func (dr downloadResponse) IsServerEncrypted() string { - return dr.rawResponse.Header.Get("x-ms-server-encrypted") -} - -// LastModified returns the value for header Last-Modified. -func (dr downloadResponse) LastModified() time.Time { - s := dr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// LeaseDuration returns the value for header x-ms-lease-duration. -func (dr downloadResponse) LeaseDuration() LeaseDurationType { - return LeaseDurationType(dr.rawResponse.Header.Get("x-ms-lease-duration")) -} - -// LeaseState returns the value for header x-ms-lease-state. -func (dr downloadResponse) LeaseState() LeaseStateType { - return LeaseStateType(dr.rawResponse.Header.Get("x-ms-lease-state")) -} - -// LeaseStatus returns the value for header x-ms-lease-status. -func (dr downloadResponse) LeaseStatus() LeaseStatusType { - return LeaseStatusType(dr.rawResponse.Header.Get("x-ms-lease-status")) -} - -// RequestID returns the value for header x-ms-request-id. -func (dr downloadResponse) RequestID() string { - return dr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (dr downloadResponse) Version() string { - return dr.rawResponse.Header.Get("x-ms-version") -} - -// GeoReplication ... -type GeoReplication struct { - // Status - The status of the secondary location. Possible values include: 'GeoReplicationStatusLive', 'GeoReplicationStatusBootstrap', 'GeoReplicationStatusUnavailable', 'GeoReplicationStatusNone' - Status GeoReplicationStatusType `xml:"Status"` - // LastSyncTime - A GMT date/time value, to the second. All primary writes preceding this value are guaranteed to be available for read operations at the secondary. Primary writes after this point in time may or may not be available for reads. - LastSyncTime time.Time `xml:"LastSyncTime"` -} - -// MarshalXML implements the xml.Marshaler interface for GeoReplication. -func (gr GeoReplication) MarshalXML(e *xml.Encoder, start xml.StartElement) error { - if reflect.TypeOf((*GeoReplication)(nil)).Elem().Size() != reflect.TypeOf((*geoReplication)(nil)).Elem().Size() { - panic("size mismatch between GeoReplication and geoReplication") - } - gr2 := (*geoReplication)(unsafe.Pointer(&gr)) - return e.EncodeElement(*gr2, start) -} - -// UnmarshalXML implements the xml.Unmarshaler interface for GeoReplication. -func (gr *GeoReplication) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - if reflect.TypeOf((*GeoReplication)(nil)).Elem().Size() != reflect.TypeOf((*geoReplication)(nil)).Elem().Size() { - panic("size mismatch between GeoReplication and geoReplication") - } - gr2 := (*geoReplication)(unsafe.Pointer(gr)) - return d.DecodeElement(gr2, &start) -} - -// ListBlobsFlatSegmentResponse - An enumeration of blobs -type ListBlobsFlatSegmentResponse struct { - rawResponse *http.Response - // XMLName is used for marshalling and is subject to removal in a future release. - XMLName xml.Name `xml:"EnumerationResults"` - ServiceEndpoint string `xml:"ServiceEndpoint,attr"` - ContainerName string `xml:"ContainerName,attr"` - Prefix string `xml:"Prefix"` - Marker string `xml:"Marker"` - MaxResults int32 `xml:"MaxResults"` - Delimiter string `xml:"Delimiter"` - Segment BlobFlatList `xml:"Blobs"` - NextMarker Marker `xml:"NextMarker"` -} - -// Response returns the raw HTTP response object. -func (lbfsr ListBlobsFlatSegmentResponse) Response() *http.Response { - return lbfsr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (lbfsr ListBlobsFlatSegmentResponse) StatusCode() int { - return lbfsr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (lbfsr ListBlobsFlatSegmentResponse) Status() string { - return lbfsr.rawResponse.Status -} - -// ContentType returns the value for header Content-Type. -func (lbfsr ListBlobsFlatSegmentResponse) ContentType() string { - return lbfsr.rawResponse.Header.Get("Content-Type") -} - -// Date returns the value for header Date. -func (lbfsr ListBlobsFlatSegmentResponse) Date() time.Time { - s := lbfsr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (lbfsr ListBlobsFlatSegmentResponse) ErrorCode() string { - return lbfsr.rawResponse.Header.Get("x-ms-error-code") -} - -// RequestID returns the value for header x-ms-request-id. -func (lbfsr ListBlobsFlatSegmentResponse) RequestID() string { - return lbfsr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (lbfsr ListBlobsFlatSegmentResponse) Version() string { - return lbfsr.rawResponse.Header.Get("x-ms-version") -} - -// ListBlobsHierarchySegmentResponse - An enumeration of blobs -type ListBlobsHierarchySegmentResponse struct { - rawResponse *http.Response - // XMLName is used for marshalling and is subject to removal in a future release. - XMLName xml.Name `xml:"EnumerationResults"` - ServiceEndpoint string `xml:"ServiceEndpoint,attr"` - ContainerName string `xml:"ContainerName,attr"` - Prefix string `xml:"Prefix"` - Marker string `xml:"Marker"` - MaxResults int32 `xml:"MaxResults"` - Delimiter string `xml:"Delimiter"` - Segment BlobHierarchyList `xml:"Blobs"` - NextMarker Marker `xml:"NextMarker"` -} - -// Response returns the raw HTTP response object. -func (lbhsr ListBlobsHierarchySegmentResponse) Response() *http.Response { - return lbhsr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (lbhsr ListBlobsHierarchySegmentResponse) StatusCode() int { - return lbhsr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (lbhsr ListBlobsHierarchySegmentResponse) Status() string { - return lbhsr.rawResponse.Status -} - -// ContentType returns the value for header Content-Type. -func (lbhsr ListBlobsHierarchySegmentResponse) ContentType() string { - return lbhsr.rawResponse.Header.Get("Content-Type") -} - -// Date returns the value for header Date. -func (lbhsr ListBlobsHierarchySegmentResponse) Date() time.Time { - s := lbhsr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (lbhsr ListBlobsHierarchySegmentResponse) ErrorCode() string { - return lbhsr.rawResponse.Header.Get("x-ms-error-code") -} - -// RequestID returns the value for header x-ms-request-id. -func (lbhsr ListBlobsHierarchySegmentResponse) RequestID() string { - return lbhsr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (lbhsr ListBlobsHierarchySegmentResponse) Version() string { - return lbhsr.rawResponse.Header.Get("x-ms-version") -} - -// ListContainersResponse - An enumeration of containers -type ListContainersResponse struct { - rawResponse *http.Response - // XMLName is used for marshalling and is subject to removal in a future release. - XMLName xml.Name `xml:"EnumerationResults"` - ServiceEndpoint string `xml:"ServiceEndpoint,attr"` - Prefix string `xml:"Prefix"` - Marker *string `xml:"Marker"` - MaxResults int32 `xml:"MaxResults"` - ContainerItems []ContainerItem `xml:"Containers>Container"` - NextMarker Marker `xml:"NextMarker"` -} - -// Response returns the raw HTTP response object. -func (lcr ListContainersResponse) Response() *http.Response { - return lcr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (lcr ListContainersResponse) StatusCode() int { - return lcr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (lcr ListContainersResponse) Status() string { - return lcr.rawResponse.Status -} - -// ErrorCode returns the value for header x-ms-error-code. -func (lcr ListContainersResponse) ErrorCode() string { - return lcr.rawResponse.Header.Get("x-ms-error-code") -} - -// RequestID returns the value for header x-ms-request-id. -func (lcr ListContainersResponse) RequestID() string { - return lcr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (lcr ListContainersResponse) Version() string { - return lcr.rawResponse.Header.Get("x-ms-version") -} - -// Logging - Azure Analytics Logging settings. -type Logging struct { - // Version - The version of Storage Analytics to configure. - Version string `xml:"Version"` - // Delete - Indicates whether all delete requests should be logged. - Delete bool `xml:"Delete"` - // Read - Indicates whether all read requests should be logged. - Read bool `xml:"Read"` - // Write - Indicates whether all write requests should be logged. - Write bool `xml:"Write"` - RetentionPolicy RetentionPolicy `xml:"RetentionPolicy"` -} - -// Metrics ... -type Metrics struct { - // Version - The version of Storage Analytics to configure. - Version *string `xml:"Version"` - // Enabled - Indicates whether metrics are enabled for the Blob service. - Enabled bool `xml:"Enabled"` - // IncludeAPIs - Indicates whether metrics should generate summary statistics for called API operations. - IncludeAPIs *bool `xml:"IncludeAPIs"` - RetentionPolicy *RetentionPolicy `xml:"RetentionPolicy"` -} - -// PageBlobClearPagesResponse ... -type PageBlobClearPagesResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (pbcpr PageBlobClearPagesResponse) Response() *http.Response { - return pbcpr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (pbcpr PageBlobClearPagesResponse) StatusCode() int { - return pbcpr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (pbcpr PageBlobClearPagesResponse) Status() string { - return pbcpr.rawResponse.Status -} - -// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number. -func (pbcpr PageBlobClearPagesResponse) BlobSequenceNumber() int64 { - s := pbcpr.rawResponse.Header.Get("x-ms-blob-sequence-number") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 64) - if err != nil { - panic(err) - } - return i -} - -// ContentMD5 returns the value for header Content-MD5. -func (pbcpr PageBlobClearPagesResponse) ContentMD5() []byte { - s := pbcpr.rawResponse.Header.Get("Content-MD5") - if s == "" { - return nil - } - b, err := base64.StdEncoding.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - -// Date returns the value for header Date. -func (pbcpr PageBlobClearPagesResponse) Date() time.Time { - s := pbcpr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (pbcpr PageBlobClearPagesResponse) ErrorCode() string { - return pbcpr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (pbcpr PageBlobClearPagesResponse) ETag() ETag { - return ETag(pbcpr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (pbcpr PageBlobClearPagesResponse) LastModified() time.Time { - s := pbcpr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (pbcpr PageBlobClearPagesResponse) RequestID() string { - return pbcpr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (pbcpr PageBlobClearPagesResponse) Version() string { - return pbcpr.rawResponse.Header.Get("x-ms-version") -} - -// PageBlobCopyIncrementalResponse ... -type PageBlobCopyIncrementalResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (pbcir PageBlobCopyIncrementalResponse) Response() *http.Response { - return pbcir.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (pbcir PageBlobCopyIncrementalResponse) StatusCode() int { - return pbcir.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (pbcir PageBlobCopyIncrementalResponse) Status() string { - return pbcir.rawResponse.Status -} - -// CopyID returns the value for header x-ms-copy-id. -func (pbcir PageBlobCopyIncrementalResponse) CopyID() string { - return pbcir.rawResponse.Header.Get("x-ms-copy-id") -} - -// CopyStatus returns the value for header x-ms-copy-status. -func (pbcir PageBlobCopyIncrementalResponse) CopyStatus() CopyStatusType { - return CopyStatusType(pbcir.rawResponse.Header.Get("x-ms-copy-status")) -} - -// Date returns the value for header Date. -func (pbcir PageBlobCopyIncrementalResponse) Date() time.Time { - s := pbcir.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (pbcir PageBlobCopyIncrementalResponse) ErrorCode() string { - return pbcir.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (pbcir PageBlobCopyIncrementalResponse) ETag() ETag { - return ETag(pbcir.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (pbcir PageBlobCopyIncrementalResponse) LastModified() time.Time { - s := pbcir.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (pbcir PageBlobCopyIncrementalResponse) RequestID() string { - return pbcir.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (pbcir PageBlobCopyIncrementalResponse) Version() string { - return pbcir.rawResponse.Header.Get("x-ms-version") -} - -// PageBlobCreateResponse ... -type PageBlobCreateResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (pbcr PageBlobCreateResponse) Response() *http.Response { - return pbcr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (pbcr PageBlobCreateResponse) StatusCode() int { - return pbcr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (pbcr PageBlobCreateResponse) Status() string { - return pbcr.rawResponse.Status -} - -// ContentMD5 returns the value for header Content-MD5. -func (pbcr PageBlobCreateResponse) ContentMD5() []byte { - s := pbcr.rawResponse.Header.Get("Content-MD5") - if s == "" { - return nil - } - b, err := base64.StdEncoding.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - -// Date returns the value for header Date. -func (pbcr PageBlobCreateResponse) Date() time.Time { - s := pbcr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (pbcr PageBlobCreateResponse) ErrorCode() string { - return pbcr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (pbcr PageBlobCreateResponse) ETag() ETag { - return ETag(pbcr.rawResponse.Header.Get("ETag")) -} - -// IsServerEncrypted returns the value for header x-ms-request-server-encrypted. -func (pbcr PageBlobCreateResponse) IsServerEncrypted() string { - return pbcr.rawResponse.Header.Get("x-ms-request-server-encrypted") -} - -// LastModified returns the value for header Last-Modified. -func (pbcr PageBlobCreateResponse) LastModified() time.Time { - s := pbcr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (pbcr PageBlobCreateResponse) RequestID() string { - return pbcr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (pbcr PageBlobCreateResponse) Version() string { - return pbcr.rawResponse.Header.Get("x-ms-version") -} - -// PageBlobResizeResponse ... -type PageBlobResizeResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (pbrr PageBlobResizeResponse) Response() *http.Response { - return pbrr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (pbrr PageBlobResizeResponse) StatusCode() int { - return pbrr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (pbrr PageBlobResizeResponse) Status() string { - return pbrr.rawResponse.Status -} - -// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number. -func (pbrr PageBlobResizeResponse) BlobSequenceNumber() int64 { - s := pbrr.rawResponse.Header.Get("x-ms-blob-sequence-number") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 64) - if err != nil { - panic(err) - } - return i -} - -// Date returns the value for header Date. -func (pbrr PageBlobResizeResponse) Date() time.Time { - s := pbrr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (pbrr PageBlobResizeResponse) ErrorCode() string { - return pbrr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (pbrr PageBlobResizeResponse) ETag() ETag { - return ETag(pbrr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (pbrr PageBlobResizeResponse) LastModified() time.Time { - s := pbrr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (pbrr PageBlobResizeResponse) RequestID() string { - return pbrr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (pbrr PageBlobResizeResponse) Version() string { - return pbrr.rawResponse.Header.Get("x-ms-version") -} - -// PageBlobUpdateSequenceNumberResponse ... -type PageBlobUpdateSequenceNumberResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (pbusnr PageBlobUpdateSequenceNumberResponse) Response() *http.Response { - return pbusnr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (pbusnr PageBlobUpdateSequenceNumberResponse) StatusCode() int { - return pbusnr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (pbusnr PageBlobUpdateSequenceNumberResponse) Status() string { - return pbusnr.rawResponse.Status -} - -// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number. -func (pbusnr PageBlobUpdateSequenceNumberResponse) BlobSequenceNumber() int64 { - s := pbusnr.rawResponse.Header.Get("x-ms-blob-sequence-number") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 64) - if err != nil { - panic(err) - } - return i -} - -// Date returns the value for header Date. -func (pbusnr PageBlobUpdateSequenceNumberResponse) Date() time.Time { - s := pbusnr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (pbusnr PageBlobUpdateSequenceNumberResponse) ErrorCode() string { - return pbusnr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (pbusnr PageBlobUpdateSequenceNumberResponse) ETag() ETag { - return ETag(pbusnr.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (pbusnr PageBlobUpdateSequenceNumberResponse) LastModified() time.Time { - s := pbusnr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (pbusnr PageBlobUpdateSequenceNumberResponse) RequestID() string { - return pbusnr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (pbusnr PageBlobUpdateSequenceNumberResponse) Version() string { - return pbusnr.rawResponse.Header.Get("x-ms-version") -} - -// PageBlobUploadPagesResponse ... -type PageBlobUploadPagesResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (pbupr PageBlobUploadPagesResponse) Response() *http.Response { - return pbupr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (pbupr PageBlobUploadPagesResponse) StatusCode() int { - return pbupr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (pbupr PageBlobUploadPagesResponse) Status() string { - return pbupr.rawResponse.Status -} - -// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number. -func (pbupr PageBlobUploadPagesResponse) BlobSequenceNumber() int64 { - s := pbupr.rawResponse.Header.Get("x-ms-blob-sequence-number") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 64) - if err != nil { - panic(err) - } - return i -} - -// ContentMD5 returns the value for header Content-MD5. -func (pbupr PageBlobUploadPagesResponse) ContentMD5() []byte { - s := pbupr.rawResponse.Header.Get("Content-MD5") - if s == "" { - return nil - } - b, err := base64.StdEncoding.DecodeString(s) - if err != nil { - panic(err) - } - return b -} - -// Date returns the value for header Date. -func (pbupr PageBlobUploadPagesResponse) Date() time.Time { - s := pbupr.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (pbupr PageBlobUploadPagesResponse) ErrorCode() string { - return pbupr.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (pbupr PageBlobUploadPagesResponse) ETag() ETag { - return ETag(pbupr.rawResponse.Header.Get("ETag")) -} - -// IsServerEncrypted returns the value for header x-ms-request-server-encrypted. -func (pbupr PageBlobUploadPagesResponse) IsServerEncrypted() string { - return pbupr.rawResponse.Header.Get("x-ms-request-server-encrypted") -} - -// LastModified returns the value for header Last-Modified. -func (pbupr PageBlobUploadPagesResponse) LastModified() time.Time { - s := pbupr.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (pbupr PageBlobUploadPagesResponse) RequestID() string { - return pbupr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (pbupr PageBlobUploadPagesResponse) Version() string { - return pbupr.rawResponse.Header.Get("x-ms-version") -} - -// PageList - the list of pages -type PageList struct { - rawResponse *http.Response - PageRange []PageRange `xml:"PageRange"` - ClearRange []ClearRange `xml:"ClearRange"` -} - -// Response returns the raw HTTP response object. -func (pl PageList) Response() *http.Response { - return pl.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (pl PageList) StatusCode() int { - return pl.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (pl PageList) Status() string { - return pl.rawResponse.Status -} - -// BlobContentLength returns the value for header x-ms-blob-content-length. -func (pl PageList) BlobContentLength() int64 { - s := pl.rawResponse.Header.Get("x-ms-blob-content-length") - if s == "" { - return -1 - } - i, err := strconv.ParseInt(s, 10, 64) - if err != nil { - panic(err) - } - return i -} - -// Date returns the value for header Date. -func (pl PageList) Date() time.Time { - s := pl.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (pl PageList) ErrorCode() string { - return pl.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (pl PageList) ETag() ETag { - return ETag(pl.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (pl PageList) LastModified() time.Time { - s := pl.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (pl PageList) RequestID() string { - return pl.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (pl PageList) Version() string { - return pl.rawResponse.Header.Get("x-ms-version") -} - -// PageRange ... -type PageRange struct { - Start int64 `xml:"Start"` - End int64 `xml:"End"` -} - -// RetentionPolicy - the retention policy -type RetentionPolicy struct { - // Enabled - Indicates whether a retention policy is enabled for the storage service - Enabled bool `xml:"Enabled"` - // Days - Indicates the number of days that metrics or logging or soft-deleted data should be retained. All data older than this value will be deleted - Days *int32 `xml:"Days"` -} - -// ServiceSetPropertiesResponse ... -type ServiceSetPropertiesResponse struct { - rawResponse *http.Response -} - -// Response returns the raw HTTP response object. -func (sspr ServiceSetPropertiesResponse) Response() *http.Response { - return sspr.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (sspr ServiceSetPropertiesResponse) StatusCode() int { - return sspr.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (sspr ServiceSetPropertiesResponse) Status() string { - return sspr.rawResponse.Status -} - -// ErrorCode returns the value for header x-ms-error-code. -func (sspr ServiceSetPropertiesResponse) ErrorCode() string { - return sspr.rawResponse.Header.Get("x-ms-error-code") -} - -// RequestID returns the value for header x-ms-request-id. -func (sspr ServiceSetPropertiesResponse) RequestID() string { - return sspr.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (sspr ServiceSetPropertiesResponse) Version() string { - return sspr.rawResponse.Header.Get("x-ms-version") -} - -// SignedIdentifier - signed identifier -type SignedIdentifier struct { - // ID - a unique id - ID string `xml:"Id"` - // AccessPolicy - The access policy - AccessPolicy AccessPolicy `xml:"AccessPolicy"` -} - -// SignedIdentifiers ... -type SignedIdentifiers struct { - rawResponse *http.Response - Items []SignedIdentifier `xml:"SignedIdentifier"` -} - -// Response returns the raw HTTP response object. -func (si SignedIdentifiers) Response() *http.Response { - return si.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (si SignedIdentifiers) StatusCode() int { - return si.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (si SignedIdentifiers) Status() string { - return si.rawResponse.Status -} - -// BlobPublicAccess returns the value for header x-ms-blob-public-access. -func (si SignedIdentifiers) BlobPublicAccess() PublicAccessType { - return PublicAccessType(si.rawResponse.Header.Get("x-ms-blob-public-access")) -} - -// Date returns the value for header Date. -func (si SignedIdentifiers) Date() time.Time { - s := si.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (si SignedIdentifiers) ErrorCode() string { - return si.rawResponse.Header.Get("x-ms-error-code") -} - -// ETag returns the value for header ETag. -func (si SignedIdentifiers) ETag() ETag { - return ETag(si.rawResponse.Header.Get("ETag")) -} - -// LastModified returns the value for header Last-Modified. -func (si SignedIdentifiers) LastModified() time.Time { - s := si.rawResponse.Header.Get("Last-Modified") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// RequestID returns the value for header x-ms-request-id. -func (si SignedIdentifiers) RequestID() string { - return si.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (si SignedIdentifiers) Version() string { - return si.rawResponse.Header.Get("x-ms-version") -} - -// StorageServiceProperties - Storage Service Properties. -type StorageServiceProperties struct { - rawResponse *http.Response - // Logging - Azure Analytics Logging settings - Logging *Logging `xml:"Logging"` - // HourMetrics - A summary of request statistics grouped by API in hourly aggregates for blobs - HourMetrics *Metrics `xml:"HourMetrics"` - // MinuteMetrics - a summary of request statistics grouped by API in minute aggregates for blobs - MinuteMetrics *Metrics `xml:"MinuteMetrics"` - // Cors - The set of CORS rules. - Cors []CorsRule `xml:"Cors>CorsRule"` - // DefaultServiceVersion - The default version to use for requests to the Blob service if an incoming request's version is not specified. Possible values include version 2008-10-27 and all more recent versions - DefaultServiceVersion *string `xml:"DefaultServiceVersion"` - // DeleteRetentionPolicy - The Delete Retention Policy for the service - DeleteRetentionPolicy *RetentionPolicy `xml:"DeleteRetentionPolicy"` -} - -// Response returns the raw HTTP response object. -func (ssp StorageServiceProperties) Response() *http.Response { - return ssp.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (ssp StorageServiceProperties) StatusCode() int { - return ssp.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (ssp StorageServiceProperties) Status() string { - return ssp.rawResponse.Status -} - -// ErrorCode returns the value for header x-ms-error-code. -func (ssp StorageServiceProperties) ErrorCode() string { - return ssp.rawResponse.Header.Get("x-ms-error-code") -} - -// RequestID returns the value for header x-ms-request-id. -func (ssp StorageServiceProperties) RequestID() string { - return ssp.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (ssp StorageServiceProperties) Version() string { - return ssp.rawResponse.Header.Get("x-ms-version") -} - -// StorageServiceStats - Stats for the storage service. -type StorageServiceStats struct { - rawResponse *http.Response - // GeoReplication - Geo-Replication information for the Secondary Storage Service - GeoReplication *GeoReplication `xml:"GeoReplication"` -} - -// Response returns the raw HTTP response object. -func (sss StorageServiceStats) Response() *http.Response { - return sss.rawResponse -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (sss StorageServiceStats) StatusCode() int { - return sss.rawResponse.StatusCode -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (sss StorageServiceStats) Status() string { - return sss.rawResponse.Status -} - -// Date returns the value for header Date. -func (sss StorageServiceStats) Date() time.Time { - s := sss.rawResponse.Header.Get("Date") - if s == "" { - return time.Time{} - } - t, err := time.Parse(time.RFC1123, s) - if err != nil { - panic(err) - } - return t -} - -// ErrorCode returns the value for header x-ms-error-code. -func (sss StorageServiceStats) ErrorCode() string { - return sss.rawResponse.Header.Get("x-ms-error-code") -} - -// RequestID returns the value for header x-ms-request-id. -func (sss StorageServiceStats) RequestID() string { - return sss.rawResponse.Header.Get("x-ms-request-id") -} - -// Version returns the value for header x-ms-version. -func (sss StorageServiceStats) Version() string { - return sss.rawResponse.Header.Get("x-ms-version") -} - -const ( - rfc3339Format = "2006-01-02T15:04:05.0000000Z07:00" -) - -// used to convert times from UTC to GMT before sending across the wire -var gmt = time.FixedZone("GMT", 0) - -// internal type used for marshalling time in RFC1123 format -type timeRFC1123 struct { - time.Time -} - -// MarshalText implements the encoding.TextMarshaler interface for timeRFC1123. -func (t timeRFC1123) MarshalText() ([]byte, error) { - return []byte(t.Format(time.RFC1123)), nil -} - -// UnmarshalText implements the encoding.TextUnmarshaler interface for timeRFC1123. -func (t *timeRFC1123) UnmarshalText(data []byte) (err error) { - t.Time, err = time.Parse(time.RFC1123, string(data)) - return -} - -// internal type used for marshalling time in RFC3339 format -type timeRFC3339 struct { - time.Time -} - -// MarshalText implements the encoding.TextMarshaler interface for timeRFC3339. -func (t timeRFC3339) MarshalText() ([]byte, error) { - return []byte(t.Format(rfc3339Format)), nil -} - -// UnmarshalText implements the encoding.TextUnmarshaler interface for timeRFC3339. -func (t *timeRFC3339) UnmarshalText(data []byte) (err error) { - t.Time, err = time.Parse(rfc3339Format, string(data)) - return -} - -// internal type used for marshalling -type accessPolicy struct { - Start timeRFC3339 `xml:"Start"` - Expiry timeRFC3339 `xml:"Expiry"` - Permission string `xml:"Permission"` -} - -// internal type used for marshalling -type blobProperties struct { - LastModified timeRFC1123 `xml:"Last-Modified"` - Etag ETag `xml:"Etag"` - ContentLength *int64 `xml:"Content-Length"` - ContentType *string `xml:"Content-Type"` - ContentEncoding *string `xml:"Content-Encoding"` - ContentLanguage *string `xml:"Content-Language"` - ContentMD5 []byte `xml:"Content-MD5"` - ContentDisposition *string `xml:"Content-Disposition"` - CacheControl *string `xml:"Cache-Control"` - BlobSequenceNumber *int64 `xml:"x-ms-blob-sequence-number"` - BlobType BlobType `xml:"BlobType"` - LeaseStatus LeaseStatusType `xml:"LeaseStatus"` - LeaseState LeaseStateType `xml:"LeaseState"` - LeaseDuration LeaseDurationType `xml:"LeaseDuration"` - CopyID *string `xml:"CopyId"` - CopyStatus CopyStatusType `xml:"CopyStatus"` - CopySource *string `xml:"CopySource"` - CopyProgress *string `xml:"CopyProgress"` - CopyCompletionTime *timeRFC1123 `xml:"CopyCompletionTime"` - CopyStatusDescription *string `xml:"CopyStatusDescription"` - ServerEncrypted *bool `xml:"ServerEncrypted"` - IncrementalCopy *bool `xml:"IncrementalCopy"` - DestinationSnapshot *string `xml:"DestinationSnapshot"` - DeletedTime *timeRFC1123 `xml:"DeletedTime"` - RemainingRetentionDays *int32 `xml:"RemainingRetentionDays"` - AccessTier AccessTierType `xml:"AccessTier"` - AccessTierInferred *bool `xml:"AccessTierInferred"` - ArchiveStatus ArchiveStatusType `xml:"ArchiveStatus"` -} - -// internal type used for marshalling -type containerProperties struct { - LastModified timeRFC1123 `xml:"Last-Modified"` - Etag ETag `xml:"Etag"` - LeaseStatus LeaseStatusType `xml:"LeaseStatus"` - LeaseState LeaseStateType `xml:"LeaseState"` - LeaseDuration LeaseDurationType `xml:"LeaseDuration"` - PublicAccess PublicAccessType `xml:"PublicAccess"` -} - -// internal type used for marshalling -type geoReplication struct { - Status GeoReplicationStatusType `xml:"Status"` - LastSyncTime timeRFC1123 `xml:"LastSyncTime"` -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_page_blob.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_page_blob.go deleted file mode 100644 index ce6507080e79..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_page_blob.go +++ /dev/null @@ -1,794 +0,0 @@ -package azblob - -// Code generated by Microsoft (R) AutoRest Code Generator. -// Changes may cause incorrect behavior and will be lost if the code is regenerated. - -import ( - "context" - "encoding/base64" - "encoding/xml" - "github.com/Azure/azure-pipeline-go/pipeline" - "io" - "io/ioutil" - "net/http" - "net/url" - "strconv" - "time" -) - -// pageBlobClient is the client for the PageBlob methods of the Azblob service. -type pageBlobClient struct { - managementClient -} - -// newPageBlobClient creates an instance of the pageBlobClient client. -func newPageBlobClient(url url.URL, p pipeline.Pipeline) pageBlobClient { - return pageBlobClient{newManagementClient(url, p)} -} - -// ClearPages the Clear Pages operation clears a set of pages from a page blob -// -// contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more -// information, see Setting -// Timeouts for Blob Service Operations. rangeParameter is return only the bytes of the blob in the specified -// range. leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. -// ifSequenceNumberLessThanOrEqualTo is specify this header value to operate only on a blob if it has a sequence number -// less than or equal to the specified. ifSequenceNumberLessThan is specify this header value to operate only on a blob -// if it has a sequence number less than the specified. ifSequenceNumberEqualTo is specify this header value to operate -// only on a blob if it has the specified sequence number. ifModifiedSince is specify this header value to operate only -// on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to -// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value -// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs -// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is -// recorded in the analytics logs when storage analytics logging is enabled. -func (client pageBlobClient) ClearPages(ctx context.Context, contentLength int64, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobClearPagesResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.clearPagesPreparer(contentLength, timeout, rangeParameter, leaseID, ifSequenceNumberLessThanOrEqualTo, ifSequenceNumberLessThan, ifSequenceNumberEqualTo, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.clearPagesResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageBlobClearPagesResponse), err -} - -// clearPagesPreparer prepares the ClearPages request. -func (client pageBlobClient) clearPagesPreparer(contentLength int64, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "page") - req.URL.RawQuery = params.Encode() - req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if rangeParameter != nil { - req.Header.Set("x-ms-range", *rangeParameter) - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifSequenceNumberLessThanOrEqualTo != nil { - req.Header.Set("x-ms-if-sequence-number-le", strconv.FormatInt(*ifSequenceNumberLessThanOrEqualTo, 10)) - } - if ifSequenceNumberLessThan != nil { - req.Header.Set("x-ms-if-sequence-number-lt", strconv.FormatInt(*ifSequenceNumberLessThan, 10)) - } - if ifSequenceNumberEqualTo != nil { - req.Header.Set("x-ms-if-sequence-number-eq", strconv.FormatInt(*ifSequenceNumberEqualTo, 10)) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-page-write", "clear") - return req, nil -} - -// clearPagesResponder handles the response to the ClearPages request. -func (client pageBlobClient) clearPagesResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &PageBlobClearPagesResponse{rawResponse: resp.Response()}, err -} - -// CopyIncremental the Copy Incremental operation copies a snapshot of the source page blob to a destination page blob. -// The snapshot is copied such that only the differential changes between the previously copied snapshot are -// transferred to the destination. The copied snapshots are complete copies of the original snapshot and can be read or -// copied from as usual. This API is supported since REST version 2016-05-31. -// -// copySource is specifies the name of the source page blob snapshot. This value is a URL of up to 2 KB in length that -// specifies a page blob snapshot. The value should be URL-encoded as it would appear in a request URI. The source blob -// must either be public or must be authenticated via a shared access signature. timeout is the timeout parameter is -// expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. metadata is optional. Specifies a user-defined name-value pair associated -// with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or -// file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with -// the specified metadata, and metadata is not copied from the source blob or file. Note that beginning with version -// 2009-09-19, metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing -// Containers, Blobs, and Metadata for more information. ifModifiedSince is specify this header value to operate only -// on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to -// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value -// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs -// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is -// recorded in the analytics logs when storage analytics logging is enabled. -func (client pageBlobClient) CopyIncremental(ctx context.Context, copySource string, timeout *int32, metadata map[string]string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobCopyIncrementalResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.copyIncrementalPreparer(copySource, timeout, metadata, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.copyIncrementalResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageBlobCopyIncrementalResponse), err -} - -// copyIncrementalPreparer prepares the CopyIncremental request. -func (client pageBlobClient) copyIncrementalPreparer(copySource string, timeout *int32, metadata map[string]string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "incrementalcopy") - req.URL.RawQuery = params.Encode() - if metadata != nil { - for k, v := range metadata { - req.Header.Set("x-ms-meta-"+k, v) - } - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-copy-source", copySource) - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// copyIncrementalResponder handles the response to the CopyIncremental request. -func (client pageBlobClient) copyIncrementalResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusAccepted) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &PageBlobCopyIncrementalResponse{rawResponse: resp.Response()}, err -} - -// Create the Create operation creates a new page blob. -// -// contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more -// information, see Setting -// Timeouts for Blob Service Operations. blobContentType is optional. Sets the blob's content type. If specified, -// this property is stored with the blob and returned with a read request. blobContentEncoding is optional. Sets the -// blob's content encoding. If specified, this property is stored with the blob and returned with a read request. -// blobContentLanguage is optional. Set the blob's content language. If specified, this property is stored with the -// blob and returned with a read request. blobContentMD5 is optional. An MD5 hash of the blob content. Note that this -// hash is not validated, as the hashes for the individual blocks were validated when each was uploaded. -// blobCacheControl is optional. Sets the blob's cache control. If specified, this property is stored with the blob and -// returned with a read request. metadata is optional. Specifies a user-defined name-value pair associated with the -// blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the -// destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified -// metadata, and metadata is not copied from the source blob or file. Note that beginning with version 2009-09-19, -// metadata names must adhere to the naming rules for C# identifiers. See Naming and Referencing Containers, Blobs, and -// Metadata for more information. leaseID is if specified, the operation only succeeds if the container's lease is -// active and matches this ID. blobContentDisposition is optional. Sets the blob's Content-Disposition header. -// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified -// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified -// since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching value. -// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. blobContentLength is this -// header specifies the maximum size for the page blob, up to 1 TB. The page blob size must be aligned to a 512-byte -// boundary. blobSequenceNumber is set for page blobs only. The sequence number is a user-controlled value that you can -// use to track requests. The value of the sequence number must be between 0 and 2^63 - 1. requestID is provides a -// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage -// analytics logging is enabled. -func (client pageBlobClient) Create(ctx context.Context, contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobContentLength *int64, blobSequenceNumber *int64, requestID *string) (*PageBlobCreateResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}, - {targetValue: metadata, - constraints: []constraint{{target: "metadata", name: null, rule: false, - chain: []constraint{{target: "metadata", name: pattern, rule: `^[a-zA-Z]+$`, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.createPreparer(contentLength, timeout, blobContentType, blobContentEncoding, blobContentLanguage, blobContentMD5, blobCacheControl, metadata, leaseID, blobContentDisposition, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, blobContentLength, blobSequenceNumber, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.createResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageBlobCreateResponse), err -} - -// createPreparer prepares the Create request. -func (client pageBlobClient) createPreparer(contentLength int64, timeout *int32, blobContentType *string, blobContentEncoding *string, blobContentLanguage *string, blobContentMD5 []byte, blobCacheControl *string, metadata map[string]string, leaseID *string, blobContentDisposition *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobContentLength *int64, blobSequenceNumber *int64, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - req.URL.RawQuery = params.Encode() - req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if blobContentType != nil { - req.Header.Set("x-ms-blob-content-type", *blobContentType) - } - if blobContentEncoding != nil { - req.Header.Set("x-ms-blob-content-encoding", *blobContentEncoding) - } - if blobContentLanguage != nil { - req.Header.Set("x-ms-blob-content-language", *blobContentLanguage) - } - if blobContentMD5 != nil { - req.Header.Set("x-ms-blob-content-md5", base64.StdEncoding.EncodeToString(blobContentMD5)) - } - if blobCacheControl != nil { - req.Header.Set("x-ms-blob-cache-control", *blobCacheControl) - } - if metadata != nil { - for k, v := range metadata { - req.Header.Set("x-ms-meta-"+k, v) - } - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if blobContentDisposition != nil { - req.Header.Set("x-ms-blob-content-disposition", *blobContentDisposition) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - if blobContentLength != nil { - req.Header.Set("x-ms-blob-content-length", strconv.FormatInt(*blobContentLength, 10)) - } - if blobSequenceNumber != nil { - req.Header.Set("x-ms-blob-sequence-number", strconv.FormatInt(*blobSequenceNumber, 10)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-blob-type", "PageBlob") - return req, nil -} - -// createResponder handles the response to the Create request. -func (client pageBlobClient) createResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &PageBlobCreateResponse{rawResponse: resp.Response()}, err -} - -// GetPageRanges the Get Page Ranges operation returns the list of valid page ranges for a page blob or snapshot of a -// page blob -// -// snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to -// retrieve. For more information on working with blob snapshots, see Creating -// a Snapshot of a Blob. timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. rangeParameter is return only the bytes of the blob in the specified -// range. leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. -// ifModifiedSince is specify this header value to operate only on a blob if it has been modified since the specified -// date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if it has not been modified -// since the specified date/time. ifMatches is specify an ETag value to operate only on blobs with a matching value. -// ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. requestID is provides a -// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage -// analytics logging is enabled. -func (client pageBlobClient) GetPageRanges(ctx context.Context, snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageList, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.getPageRangesPreparer(snapshot, timeout, rangeParameter, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getPageRangesResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageList), err -} - -// getPageRangesPreparer prepares the GetPageRanges request. -func (client pageBlobClient) getPageRangesPreparer(snapshot *string, timeout *int32, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("GET", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if snapshot != nil && len(*snapshot) > 0 { - params.Set("snapshot", *snapshot) - } - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "pagelist") - req.URL.RawQuery = params.Encode() - if rangeParameter != nil { - req.Header.Set("x-ms-range", *rangeParameter) - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// getPageRangesResponder handles the response to the GetPageRanges request. -func (client pageBlobClient) getPageRangesResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - result := &PageList{rawResponse: resp.Response()} - if err != nil { - return result, err - } - defer resp.Response().Body.Close() - b, err := ioutil.ReadAll(resp.Response().Body) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") - } - if len(b) > 0 { - b = removeBOM(b) - err = xml.Unmarshal(b, result) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to unmarshal response body") - } - } - return result, nil -} - -// GetPageRangesDiff [Update] The Get Page Ranges Diff operation returns the list of valid page ranges for a page blob -// that were changed between target blob and previous snapshot. -// -// snapshot is the snapshot parameter is an opaque DateTime value that, when present, specifies the blob snapshot to -// retrieve. For more information on working with blob snapshots, see Creating -// a Snapshot of a Blob. timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. prevsnapshot is optional in version 2015-07-08 and newer. The prevsnapshot -// parameter is a DateTime value that specifies that the response will contain only pages that were changed between -// target blob and previous snapshot. Changed pages include both updated and cleared pages. The target blob may be a -// snapshot, as long as the snapshot specified by prevsnapshot is the older of the two. Note that incremental snapshots -// are currently supported only for blobs created on or after January 1, 2016. rangeParameter is return only the bytes -// of the blob in the specified range. leaseID is if specified, the operation only succeeds if the container's lease is -// active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it has been -// modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a blob if -// it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only on blobs -// with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching value. -// requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the analytics -// logs when storage analytics logging is enabled. -func (client pageBlobClient) GetPageRangesDiff(ctx context.Context, snapshot *string, timeout *int32, prevsnapshot *string, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageList, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.getPageRangesDiffPreparer(snapshot, timeout, prevsnapshot, rangeParameter, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getPageRangesDiffResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageList), err -} - -// getPageRangesDiffPreparer prepares the GetPageRangesDiff request. -func (client pageBlobClient) getPageRangesDiffPreparer(snapshot *string, timeout *int32, prevsnapshot *string, rangeParameter *string, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("GET", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if snapshot != nil && len(*snapshot) > 0 { - params.Set("snapshot", *snapshot) - } - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - if prevsnapshot != nil && len(*prevsnapshot) > 0 { - params.Set("prevsnapshot", *prevsnapshot) - } - params.Set("comp", "pagelist") - req.URL.RawQuery = params.Encode() - if rangeParameter != nil { - req.Header.Set("x-ms-range", *rangeParameter) - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// getPageRangesDiffResponder handles the response to the GetPageRangesDiff request. -func (client pageBlobClient) getPageRangesDiffResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - result := &PageList{rawResponse: resp.Response()} - if err != nil { - return result, err - } - defer resp.Response().Body.Close() - b, err := ioutil.ReadAll(resp.Response().Body) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") - } - if len(b) > 0 { - b = removeBOM(b) - err = xml.Unmarshal(b, result) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to unmarshal response body") - } - } - return result, nil -} - -// Resize resize the Blob -// -// blobContentLength is this header specifies the maximum size for the page blob, up to 1 TB. The page blob size must -// be aligned to a 512-byte boundary. timeout is the timeout parameter is expressed in seconds. For more information, -// see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it -// has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a -// blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only -// on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching -// value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is recorded in the -// analytics logs when storage analytics logging is enabled. -func (client pageBlobClient) Resize(ctx context.Context, blobContentLength int64, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobResizeResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.resizePreparer(blobContentLength, timeout, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.resizeResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageBlobResizeResponse), err -} - -// resizePreparer prepares the Resize request. -func (client pageBlobClient) resizePreparer(blobContentLength int64, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "properties") - req.URL.RawQuery = params.Encode() - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-blob-content-length", strconv.FormatInt(blobContentLength, 10)) - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// resizeResponder handles the response to the Resize request. -func (client pageBlobClient) resizeResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &PageBlobResizeResponse{rawResponse: resp.Response()}, err -} - -// UpdateSequenceNumber update the sequence number of the blob -// -// sequenceNumberAction is required if the x-ms-blob-sequence-number header is set for the request. This property -// applies to page blobs only. This property indicates how the service should modify the blob's sequence number timeout -// is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. leaseID is if specified, the operation only succeeds if the container's -// lease is active and matches this ID. ifModifiedSince is specify this header value to operate only on a blob if it -// has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to operate only on a -// blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value to operate only -// on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs without a matching -// value. blobSequenceNumber is set for page blobs only. The sequence number is a user-controlled value that you can -// use to track requests. The value of the sequence number must be between 0 and 2^63 - 1. requestID is provides a -// client-generated, opaque value with a 1 KB character limit that is recorded in the analytics logs when storage -// analytics logging is enabled. -func (client pageBlobClient) UpdateSequenceNumber(ctx context.Context, sequenceNumberAction SequenceNumberActionType, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobSequenceNumber *int64, requestID *string) (*PageBlobUpdateSequenceNumberResponse, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.updateSequenceNumberPreparer(sequenceNumberAction, timeout, leaseID, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, blobSequenceNumber, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.updateSequenceNumberResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageBlobUpdateSequenceNumberResponse), err -} - -// updateSequenceNumberPreparer prepares the UpdateSequenceNumber request. -func (client pageBlobClient) updateSequenceNumberPreparer(sequenceNumberAction SequenceNumberActionType, timeout *int32, leaseID *string, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, blobSequenceNumber *int64, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "properties") - req.URL.RawQuery = params.Encode() - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-sequence-number-action", string(sequenceNumberAction)) - if blobSequenceNumber != nil { - req.Header.Set("x-ms-blob-sequence-number", strconv.FormatInt(*blobSequenceNumber, 10)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// updateSequenceNumberResponder handles the response to the UpdateSequenceNumber request. -func (client pageBlobClient) updateSequenceNumberResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &PageBlobUpdateSequenceNumberResponse{rawResponse: resp.Response()}, err -} - -// UploadPages the Upload Pages operation writes a range of pages to a page blob -// -// body is initial data body will be closed upon successful return. Callers should ensure closure when receiving an -// error.contentLength is the length of the request. timeout is the timeout parameter is expressed in seconds. For more -// information, see Setting -// Timeouts for Blob Service Operations. rangeParameter is return only the bytes of the blob in the specified -// range. leaseID is if specified, the operation only succeeds if the container's lease is active and matches this ID. -// ifSequenceNumberLessThanOrEqualTo is specify this header value to operate only on a blob if it has a sequence number -// less than or equal to the specified. ifSequenceNumberLessThan is specify this header value to operate only on a blob -// if it has a sequence number less than the specified. ifSequenceNumberEqualTo is specify this header value to operate -// only on a blob if it has the specified sequence number. ifModifiedSince is specify this header value to operate only -// on a blob if it has been modified since the specified date/time. ifUnmodifiedSince is specify this header value to -// operate only on a blob if it has not been modified since the specified date/time. ifMatches is specify an ETag value -// to operate only on blobs with a matching value. ifNoneMatch is specify an ETag value to operate only on blobs -// without a matching value. requestID is provides a client-generated, opaque value with a 1 KB character limit that is -// recorded in the analytics logs when storage analytics logging is enabled. -func (client pageBlobClient) UploadPages(ctx context.Context, body io.ReadSeeker, contentLength int64, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (*PageBlobUploadPagesResponse, error) { - if err := validate([]validation{ - {targetValue: body, - constraints: []constraint{{target: "body", name: null, rule: true, chain: nil}}}, - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.uploadPagesPreparer(body, contentLength, timeout, rangeParameter, leaseID, ifSequenceNumberLessThanOrEqualTo, ifSequenceNumberLessThan, ifSequenceNumberEqualTo, ifModifiedSince, ifUnmodifiedSince, ifMatches, ifNoneMatch, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.uploadPagesResponder}, req) - if err != nil { - return nil, err - } - return resp.(*PageBlobUploadPagesResponse), err -} - -// uploadPagesPreparer prepares the UploadPages request. -func (client pageBlobClient) uploadPagesPreparer(body io.ReadSeeker, contentLength int64, timeout *int32, rangeParameter *string, leaseID *string, ifSequenceNumberLessThanOrEqualTo *int64, ifSequenceNumberLessThan *int64, ifSequenceNumberEqualTo *int64, ifModifiedSince *time.Time, ifUnmodifiedSince *time.Time, ifMatches *ETag, ifNoneMatch *ETag, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, body) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "page") - req.URL.RawQuery = params.Encode() - req.Header.Set("Content-Length", strconv.FormatInt(contentLength, 10)) - if rangeParameter != nil { - req.Header.Set("x-ms-range", *rangeParameter) - } - if leaseID != nil { - req.Header.Set("x-ms-lease-id", *leaseID) - } - if ifSequenceNumberLessThanOrEqualTo != nil { - req.Header.Set("x-ms-if-sequence-number-le", strconv.FormatInt(*ifSequenceNumberLessThanOrEqualTo, 10)) - } - if ifSequenceNumberLessThan != nil { - req.Header.Set("x-ms-if-sequence-number-lt", strconv.FormatInt(*ifSequenceNumberLessThan, 10)) - } - if ifSequenceNumberEqualTo != nil { - req.Header.Set("x-ms-if-sequence-number-eq", strconv.FormatInt(*ifSequenceNumberEqualTo, 10)) - } - if ifModifiedSince != nil { - req.Header.Set("If-Modified-Since", (*ifModifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifUnmodifiedSince != nil { - req.Header.Set("If-Unmodified-Since", (*ifUnmodifiedSince).In(gmt).Format(time.RFC1123)) - } - if ifMatches != nil { - req.Header.Set("If-Match", string(*ifMatches)) - } - if ifNoneMatch != nil { - req.Header.Set("If-None-Match", string(*ifNoneMatch)) - } - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - req.Header.Set("x-ms-page-write", "update") - return req, nil -} - -// uploadPagesResponder handles the response to the UploadPages request. -func (client pageBlobClient) uploadPagesResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusCreated) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &PageBlobUploadPagesResponse{rawResponse: resp.Response()}, err -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_responder_policy.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_responder_policy.go deleted file mode 100644 index 2f391d731258..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_responder_policy.go +++ /dev/null @@ -1,74 +0,0 @@ -package azblob - -// Code generated by Microsoft (R) AutoRest Code Generator. -// Changes may cause incorrect behavior and will be lost if the code is regenerated. - -import ( - "bytes" - "context" - "encoding/xml" - "github.com/Azure/azure-pipeline-go/pipeline" - "io/ioutil" -) - -type responder func(resp pipeline.Response) (result pipeline.Response, err error) - -// ResponderPolicyFactory is a Factory capable of creating a responder pipeline. -type responderPolicyFactory struct { - responder responder -} - -// New creates a responder policy factory. -func (arpf responderPolicyFactory) New(next pipeline.Policy, po *pipeline.PolicyOptions) pipeline.Policy { - return responderPolicy{next: next, responder: arpf.responder} -} - -type responderPolicy struct { - next pipeline.Policy - responder responder -} - -// Do sends the request to the service and validates/deserializes the HTTP response. -func (arp responderPolicy) Do(ctx context.Context, request pipeline.Request) (pipeline.Response, error) { - resp, err := arp.next.Do(ctx, request) - if err != nil { - return resp, err - } - return arp.responder(resp) -} - -// validateResponse checks an HTTP response's status code against a legal set of codes. -// If the response code is not legal, then validateResponse reads all of the response's body -// (containing error information) and returns a response error. -func validateResponse(resp pipeline.Response, successStatusCodes ...int) error { - if resp == nil { - return NewResponseError(nil, nil, "nil response") - } - responseCode := resp.Response().StatusCode - for _, i := range successStatusCodes { - if i == responseCode { - return nil - } - } - // only close the body in the failure case. in the - // success case responders will close the body as required. - defer resp.Response().Body.Close() - b, err := ioutil.ReadAll(resp.Response().Body) - if err != nil { - return NewResponseError(err, resp.Response(), "failed to read response body") - } - // the service code, description and details will be populated during unmarshalling - responseError := NewResponseError(nil, resp.Response(), resp.Response().Status) - if len(b) > 0 { - if err = xml.Unmarshal(b, &responseError); err != nil { - return NewResponseError(err, resp.Response(), "failed to unmarshal response body") - } - } - return responseError -} - -// removes any BOM from the byte slice -func removeBOM(b []byte) []byte { - // UTF8 - return bytes.TrimPrefix(b, []byte("\xef\xbb\xbf")) -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_response_error.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_response_error.go deleted file mode 100644 index 3dcc75bb52b5..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_response_error.go +++ /dev/null @@ -1,95 +0,0 @@ -package azblob - -// Code generated by Microsoft (R) AutoRest Code Generator. -// Changes may cause incorrect behavior and will be lost if the code is regenerated. - -import ( - "bytes" - "fmt" - "github.com/Azure/azure-pipeline-go/pipeline" - "net" - "net/http" -) - -// if you want to provide custom error handling set this variable to your constructor function -var responseErrorFactory func(cause error, response *http.Response, description string) error - -// ResponseError identifies a responder-generated network or response parsing error. -type ResponseError interface { - // Error exposes the Error(), Temporary() and Timeout() methods. - net.Error // Includes the Go error interface - // Response returns the HTTP response. You may examine this but you should not modify it. - Response() *http.Response -} - -// NewResponseError creates an error object that implements the error interface. -func NewResponseError(cause error, response *http.Response, description string) error { - if responseErrorFactory != nil { - return responseErrorFactory(cause, response, description) - } - return &responseError{ - ErrorNode: pipeline.ErrorNode{}.Initialize(cause, 3), - response: response, - description: description, - } -} - -// responseError is the internal struct that implements the public ResponseError interface. -type responseError struct { - pipeline.ErrorNode // This is embedded so that responseError "inherits" Error, Temporary, Timeout, and Cause - response *http.Response - description string -} - -// Error implements the error interface's Error method to return a string representation of the error. -func (e *responseError) Error() string { - b := &bytes.Buffer{} - fmt.Fprintf(b, "===== RESPONSE ERROR (Code=%v) =====\n", e.response.StatusCode) - fmt.Fprintf(b, "Status=%s, Description: %s\n", e.response.Status, e.description) - s := b.String() - return e.ErrorNode.Error(s) -} - -// Response implements the ResponseError interface's method to return the HTTP response. -func (e *responseError) Response() *http.Response { - return e.response -} - -// RFC7807 PROBLEM ------------------------------------------------------------------------------------ -// RFC7807Problem ... This type can be publicly embedded in another type that wants to add additional members. -/*type RFC7807Problem struct { - // Mandatory: A (relative) URI reference identifying the problem type (it MAY refer to human-readable documentation). - typeURI string // Should default to "about:blank" - // Optional: Short, human-readable summary (maybe localized). - title string - // Optional: HTTP status code generated by the origin server - status int - // Optional: Human-readable explanation for this problem occurance. - // Should help client correct the problem. Clients should NOT parse this string. - detail string - // Optional: A (relative) URI identifying this specific problem occurence (it may or may not be dereferenced). - instance string -} -// NewRFC7807Problem ... -func NewRFC7807Problem(typeURI string, status int, titleFormat string, a ...interface{}) error { - return &RFC7807Problem{ - typeURI: typeURI, - status: status, - title: fmt.Sprintf(titleFormat, a...), - } -} -// Error returns the error information as a string. -func (e *RFC7807Problem) Error() string { - return e.title -} -// TypeURI ... -func (e *RFC7807Problem) TypeURI() string { - if e.typeURI == "" { - e.typeURI = "about:blank" - } - return e.typeURI -} -// Members ... -func (e *RFC7807Problem) Members() (status int, title, detail, instance string) { - return e.status, e.title, e.detail, e.instance -}*/ diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_service.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_service.go deleted file mode 100644 index 76f235e1595b..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_service.go +++ /dev/null @@ -1,350 +0,0 @@ -package azblob - -// Code generated by Microsoft (R) AutoRest Code Generator. -// Changes may cause incorrect behavior and will be lost if the code is regenerated. - -import ( - "bytes" - "context" - "encoding/xml" - "github.com/Azure/azure-pipeline-go/pipeline" - "io" - "io/ioutil" - "net/http" - "net/url" - "strconv" -) - -// serviceClient is the client for the Service methods of the Azblob service. -type serviceClient struct { - managementClient -} - -// newServiceClient creates an instance of the serviceClient client. -func newServiceClient(url url.URL, p pipeline.Pipeline) serviceClient { - return serviceClient{newManagementClient(url, p)} -} - -// GetProperties gets the properties of a storage account's Blob service, including properties for Storage Analytics -// and CORS (Cross-Origin Resource Sharing) rules. -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. requestID is provides a client-generated, opaque value with a 1 KB -// character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client serviceClient) GetProperties(ctx context.Context, timeout *int32, requestID *string) (*StorageServiceProperties, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.getPropertiesPreparer(timeout, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getPropertiesResponder}, req) - if err != nil { - return nil, err - } - return resp.(*StorageServiceProperties), err -} - -// getPropertiesPreparer prepares the GetProperties request. -func (client serviceClient) getPropertiesPreparer(timeout *int32, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("GET", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("restype", "service") - params.Set("comp", "properties") - req.URL.RawQuery = params.Encode() - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// getPropertiesResponder handles the response to the GetProperties request. -func (client serviceClient) getPropertiesResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - result := &StorageServiceProperties{rawResponse: resp.Response()} - if err != nil { - return result, err - } - defer resp.Response().Body.Close() - b, err := ioutil.ReadAll(resp.Response().Body) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") - } - if len(b) > 0 { - b = removeBOM(b) - err = xml.Unmarshal(b, result) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to unmarshal response body") - } - } - return result, nil -} - -// GetStatistics retrieves statistics related to replication for the Blob service. It is only available on the -// secondary location endpoint when read-access geo-redundant replication is enabled for the storage account. -// -// timeout is the timeout parameter is expressed in seconds. For more information, see Setting -// Timeouts for Blob Service Operations. requestID is provides a client-generated, opaque value with a 1 KB -// character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client serviceClient) GetStatistics(ctx context.Context, timeout *int32, requestID *string) (*StorageServiceStats, error) { - if err := validate([]validation{ - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.getStatisticsPreparer(timeout, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.getStatisticsResponder}, req) - if err != nil { - return nil, err - } - return resp.(*StorageServiceStats), err -} - -// getStatisticsPreparer prepares the GetStatistics request. -func (client serviceClient) getStatisticsPreparer(timeout *int32, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("GET", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("restype", "service") - params.Set("comp", "stats") - req.URL.RawQuery = params.Encode() - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// getStatisticsResponder handles the response to the GetStatistics request. -func (client serviceClient) getStatisticsResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - result := &StorageServiceStats{rawResponse: resp.Response()} - if err != nil { - return result, err - } - defer resp.Response().Body.Close() - b, err := ioutil.ReadAll(resp.Response().Body) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") - } - if len(b) > 0 { - b = removeBOM(b) - err = xml.Unmarshal(b, result) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to unmarshal response body") - } - } - return result, nil -} - -// ListContainersSegment the List Containers Segment operation returns a list of the containers under the specified -// account -// -// prefix is filters the results to return only containers whose name begins with the specified prefix. marker is a -// string value that identifies the portion of the list of containers to be returned with the next listing operation. -// The operation returns the NextMarker value within the response body if the listing operation did not return all -// containers remaining to be listed with the current page. The NextMarker value can be used as the value for the -// marker parameter in a subsequent call to request the next page of list items. The marker value is opaque to the -// client. maxresults is specifies the maximum number of containers to return. If the request does not specify -// maxresults, or specifies a value greater than 5000, the server will return up to 5000 items. Note that if the -// listing operation crosses a partition boundary, then the service will return a continuation token for retrieving the -// remainder of the results. For this reason, it is possible that the service will return fewer results than specified -// by maxresults, or than the default of 5000. include is include this parameter to specify that the container's -// metadata be returned as part of the response body. timeout is the timeout parameter is expressed in seconds. For -// more information, see Setting -// Timeouts for Blob Service Operations. requestID is provides a client-generated, opaque value with a 1 KB -// character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client serviceClient) ListContainersSegment(ctx context.Context, prefix *string, marker *string, maxresults *int32, include ListContainersIncludeType, timeout *int32, requestID *string) (*ListContainersResponse, error) { - if err := validate([]validation{ - {targetValue: maxresults, - constraints: []constraint{{target: "maxresults", name: null, rule: false, - chain: []constraint{{target: "maxresults", name: inclusiveMinimum, rule: 1, chain: nil}}}}}, - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.listContainersSegmentPreparer(prefix, marker, maxresults, include, timeout, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.listContainersSegmentResponder}, req) - if err != nil { - return nil, err - } - return resp.(*ListContainersResponse), err -} - -// listContainersSegmentPreparer prepares the ListContainersSegment request. -func (client serviceClient) listContainersSegmentPreparer(prefix *string, marker *string, maxresults *int32, include ListContainersIncludeType, timeout *int32, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("GET", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if prefix != nil && len(*prefix) > 0 { - params.Set("prefix", *prefix) - } - if marker != nil && len(*marker) > 0 { - params.Set("marker", *marker) - } - if maxresults != nil { - params.Set("maxresults", strconv.FormatInt(int64(*maxresults), 10)) - } - if include != ListContainersIncludeNone { - params.Set("include", string(include)) - } - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("comp", "list") - req.URL.RawQuery = params.Encode() - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - return req, nil -} - -// listContainersSegmentResponder handles the response to the ListContainersSegment request. -func (client serviceClient) listContainersSegmentResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK) - if resp == nil { - return nil, err - } - result := &ListContainersResponse{rawResponse: resp.Response()} - if err != nil { - return result, err - } - defer resp.Response().Body.Close() - b, err := ioutil.ReadAll(resp.Response().Body) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to read response body") - } - if len(b) > 0 { - b = removeBOM(b) - err = xml.Unmarshal(b, result) - if err != nil { - return result, NewResponseError(err, resp.Response(), "failed to unmarshal response body") - } - } - return result, nil -} - -// SetProperties sets properties for a storage account's Blob service endpoint, including properties for Storage -// Analytics and CORS (Cross-Origin Resource Sharing) rules -// -// storageServiceProperties is the StorageService properties. timeout is the timeout parameter is expressed in seconds. -// For more information, see Setting -// Timeouts for Blob Service Operations. requestID is provides a client-generated, opaque value with a 1 KB -// character limit that is recorded in the analytics logs when storage analytics logging is enabled. -func (client serviceClient) SetProperties(ctx context.Context, storageServiceProperties StorageServiceProperties, timeout *int32, requestID *string) (*ServiceSetPropertiesResponse, error) { - if err := validate([]validation{ - {targetValue: storageServiceProperties, - constraints: []constraint{{target: "storageServiceProperties.Logging", name: null, rule: false, - chain: []constraint{{target: "storageServiceProperties.Logging.RetentionPolicy", name: null, rule: true, - chain: []constraint{{target: "storageServiceProperties.Logging.RetentionPolicy.Days", name: null, rule: false, - chain: []constraint{{target: "storageServiceProperties.Logging.RetentionPolicy.Days", name: inclusiveMinimum, rule: 1, chain: nil}}}, - }}, - }}, - {target: "storageServiceProperties.HourMetrics", name: null, rule: false, - chain: []constraint{{target: "storageServiceProperties.HourMetrics.RetentionPolicy", name: null, rule: false, - chain: []constraint{{target: "storageServiceProperties.HourMetrics.RetentionPolicy.Days", name: null, rule: false, - chain: []constraint{{target: "storageServiceProperties.HourMetrics.RetentionPolicy.Days", name: inclusiveMinimum, rule: 1, chain: nil}}}, - }}, - }}, - {target: "storageServiceProperties.MinuteMetrics", name: null, rule: false, - chain: []constraint{{target: "storageServiceProperties.MinuteMetrics.RetentionPolicy", name: null, rule: false, - chain: []constraint{{target: "storageServiceProperties.MinuteMetrics.RetentionPolicy.Days", name: null, rule: false, - chain: []constraint{{target: "storageServiceProperties.MinuteMetrics.RetentionPolicy.Days", name: inclusiveMinimum, rule: 1, chain: nil}}}, - }}, - }}, - {target: "storageServiceProperties.DeleteRetentionPolicy", name: null, rule: false, - chain: []constraint{{target: "storageServiceProperties.DeleteRetentionPolicy.Days", name: null, rule: false, - chain: []constraint{{target: "storageServiceProperties.DeleteRetentionPolicy.Days", name: inclusiveMinimum, rule: 1, chain: nil}}}, - }}}}, - {targetValue: timeout, - constraints: []constraint{{target: "timeout", name: null, rule: false, - chain: []constraint{{target: "timeout", name: inclusiveMinimum, rule: 0, chain: nil}}}}}}); err != nil { - return nil, err - } - req, err := client.setPropertiesPreparer(storageServiceProperties, timeout, requestID) - if err != nil { - return nil, err - } - resp, err := client.Pipeline().Do(ctx, responderPolicyFactory{responder: client.setPropertiesResponder}, req) - if err != nil { - return nil, err - } - return resp.(*ServiceSetPropertiesResponse), err -} - -// setPropertiesPreparer prepares the SetProperties request. -func (client serviceClient) setPropertiesPreparer(storageServiceProperties StorageServiceProperties, timeout *int32, requestID *string) (pipeline.Request, error) { - req, err := pipeline.NewRequest("PUT", client.url, nil) - if err != nil { - return req, pipeline.NewError(err, "failed to create request") - } - params := req.URL.Query() - if timeout != nil { - params.Set("timeout", strconv.FormatInt(int64(*timeout), 10)) - } - params.Set("restype", "service") - params.Set("comp", "properties") - req.URL.RawQuery = params.Encode() - req.Header.Set("x-ms-version", ServiceVersion) - if requestID != nil { - req.Header.Set("x-ms-client-request-id", *requestID) - } - b, err := xml.Marshal(storageServiceProperties) - if err != nil { - return req, pipeline.NewError(err, "failed to marshal request body") - } - req.Header.Set("Content-Type", "application/xml") - err = req.SetBody(bytes.NewReader(b)) - if err != nil { - return req, pipeline.NewError(err, "failed to set request body") - } - return req, nil -} - -// setPropertiesResponder handles the response to the SetProperties request. -func (client serviceClient) setPropertiesResponder(resp pipeline.Response) (pipeline.Response, error) { - err := validateResponse(resp, http.StatusOK, http.StatusAccepted) - if resp == nil { - return nil, err - } - io.Copy(ioutil.Discard, resp.Response().Body) - resp.Response().Body.Close() - return &ServiceSetPropertiesResponse{rawResponse: resp.Response()}, err -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_validation.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_validation.go deleted file mode 100644 index 98a2614e606d..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_validation.go +++ /dev/null @@ -1,367 +0,0 @@ -package azblob - -// Code generated by Microsoft (R) AutoRest Code Generator. -// Changes may cause incorrect behavior and will be lost if the code is regenerated. - -import ( - "fmt" - "github.com/Azure/azure-pipeline-go/pipeline" - "reflect" - "regexp" - "strings" -) - -// Constraint stores constraint name, target field name -// Rule and chain validations. -type constraint struct { - // Target field name for validation. - target string - - // Constraint name e.g. minLength, MaxLength, Pattern, etc. - name string - - // Rule for constraint e.g. greater than 10, less than 5 etc. - rule interface{} - - // Chain validations for struct type - chain []constraint -} - -// Validation stores parameter-wise validation. -type validation struct { - targetValue interface{} - constraints []constraint -} - -// Constraint list -const ( - empty = "Empty" - null = "Null" - readOnly = "ReadOnly" - pattern = "Pattern" - maxLength = "MaxLength" - minLength = "MinLength" - maxItems = "MaxItems" - minItems = "MinItems" - multipleOf = "MultipleOf" - uniqueItems = "UniqueItems" - inclusiveMaximum = "InclusiveMaximum" - exclusiveMaximum = "ExclusiveMaximum" - exclusiveMinimum = "ExclusiveMinimum" - inclusiveMinimum = "InclusiveMinimum" -) - -// Validate method validates constraints on parameter -// passed in validation array. -func validate(m []validation) error { - for _, item := range m { - v := reflect.ValueOf(item.targetValue) - for _, constraint := range item.constraints { - var err error - switch v.Kind() { - case reflect.Ptr: - err = validatePtr(v, constraint) - case reflect.String: - err = validateString(v, constraint) - case reflect.Struct: - err = validateStruct(v, constraint) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - err = validateInt(v, constraint) - case reflect.Float32, reflect.Float64: - err = validateFloat(v, constraint) - case reflect.Array, reflect.Slice, reflect.Map: - err = validateArrayMap(v, constraint) - default: - err = createError(v, constraint, fmt.Sprintf("unknown type %v", v.Kind())) - } - if err != nil { - return err - } - } - } - return nil -} - -func validateStruct(x reflect.Value, v constraint, name ...string) error { - //Get field name from target name which is in format a.b.c - s := strings.Split(v.target, ".") - f := x.FieldByName(s[len(s)-1]) - if isZero(f) { - return createError(x, v, fmt.Sprintf("field %q doesn't exist", v.target)) - } - err := validate([]validation{ - { - targetValue: getInterfaceValue(f), - constraints: []constraint{v}, - }, - }) - return err -} - -func validatePtr(x reflect.Value, v constraint) error { - if v.name == readOnly { - if !x.IsNil() { - return createError(x.Elem(), v, "readonly parameter; must send as nil or empty in request") - } - return nil - } - if x.IsNil() { - return checkNil(x, v) - } - if v.chain != nil { - return validate([]validation{ - { - targetValue: getInterfaceValue(x.Elem()), - constraints: v.chain, - }, - }) - } - return nil -} - -func validateInt(x reflect.Value, v constraint) error { - i := x.Int() - r, ok := v.rule.(int) - if !ok { - return createError(x, v, fmt.Sprintf("rule must be integer value for %v constraint; got: %v", v.name, v.rule)) - } - switch v.name { - case multipleOf: - if i%int64(r) != 0 { - return createError(x, v, fmt.Sprintf("value must be a multiple of %v", r)) - } - case exclusiveMinimum: - if i <= int64(r) { - return createError(x, v, fmt.Sprintf("value must be greater than %v", r)) - } - case exclusiveMaximum: - if i >= int64(r) { - return createError(x, v, fmt.Sprintf("value must be less than %v", r)) - } - case inclusiveMinimum: - if i < int64(r) { - return createError(x, v, fmt.Sprintf("value must be greater than or equal to %v", r)) - } - case inclusiveMaximum: - if i > int64(r) { - return createError(x, v, fmt.Sprintf("value must be less than or equal to %v", r)) - } - default: - return createError(x, v, fmt.Sprintf("constraint %v is not applicable for type integer", v.name)) - } - return nil -} - -func validateFloat(x reflect.Value, v constraint) error { - f := x.Float() - r, ok := v.rule.(float64) - if !ok { - return createError(x, v, fmt.Sprintf("rule must be float value for %v constraint; got: %v", v.name, v.rule)) - } - switch v.name { - case exclusiveMinimum: - if f <= r { - return createError(x, v, fmt.Sprintf("value must be greater than %v", r)) - } - case exclusiveMaximum: - if f >= r { - return createError(x, v, fmt.Sprintf("value must be less than %v", r)) - } - case inclusiveMinimum: - if f < r { - return createError(x, v, fmt.Sprintf("value must be greater than or equal to %v", r)) - } - case inclusiveMaximum: - if f > r { - return createError(x, v, fmt.Sprintf("value must be less than or equal to %v", r)) - } - default: - return createError(x, v, fmt.Sprintf("constraint %s is not applicable for type float", v.name)) - } - return nil -} - -func validateString(x reflect.Value, v constraint) error { - s := x.String() - switch v.name { - case empty: - if len(s) == 0 { - return checkEmpty(x, v) - } - case pattern: - reg, err := regexp.Compile(v.rule.(string)) - if err != nil { - return createError(x, v, err.Error()) - } - if !reg.MatchString(s) { - return createError(x, v, fmt.Sprintf("value doesn't match pattern %v", v.rule)) - } - case maxLength: - if _, ok := v.rule.(int); !ok { - return createError(x, v, fmt.Sprintf("rule must be integer value for %v constraint; got: %v", v.name, v.rule)) - } - if len(s) > v.rule.(int) { - return createError(x, v, fmt.Sprintf("value length must be less than %v", v.rule)) - } - case minLength: - if _, ok := v.rule.(int); !ok { - return createError(x, v, fmt.Sprintf("rule must be integer value for %v constraint; got: %v", v.name, v.rule)) - } - if len(s) < v.rule.(int) { - return createError(x, v, fmt.Sprintf("value length must be greater than %v", v.rule)) - } - case readOnly: - if len(s) > 0 { - return createError(reflect.ValueOf(s), v, "readonly parameter; must send as nil or empty in request") - } - default: - return createError(x, v, fmt.Sprintf("constraint %s is not applicable to string type", v.name)) - } - if v.chain != nil { - return validate([]validation{ - { - targetValue: getInterfaceValue(x), - constraints: v.chain, - }, - }) - } - return nil -} - -func validateArrayMap(x reflect.Value, v constraint) error { - switch v.name { - case null: - if x.IsNil() { - return checkNil(x, v) - } - case empty: - if x.IsNil() || x.Len() == 0 { - return checkEmpty(x, v) - } - case maxItems: - if _, ok := v.rule.(int); !ok { - return createError(x, v, fmt.Sprintf("rule must be integer for %v constraint; got: %v", v.name, v.rule)) - } - if x.Len() > v.rule.(int) { - return createError(x, v, fmt.Sprintf("maximum item limit is %v; got: %v", v.rule, x.Len())) - } - case minItems: - if _, ok := v.rule.(int); !ok { - return createError(x, v, fmt.Sprintf("rule must be integer for %v constraint; got: %v", v.name, v.rule)) - } - if x.Len() < v.rule.(int) { - return createError(x, v, fmt.Sprintf("minimum item limit is %v; got: %v", v.rule, x.Len())) - } - case uniqueItems: - if x.Kind() == reflect.Array || x.Kind() == reflect.Slice { - if !checkForUniqueInArray(x) { - return createError(x, v, fmt.Sprintf("all items in parameter %q must be unique; got:%v", v.target, x)) - } - } else if x.Kind() == reflect.Map { - if !checkForUniqueInMap(x) { - return createError(x, v, fmt.Sprintf("all items in parameter %q must be unique; got:%v", v.target, x)) - } - } else { - return createError(x, v, fmt.Sprintf("type must be array, slice or map for constraint %v; got: %v", v.name, x.Kind())) - } - case readOnly: - if x.Len() != 0 { - return createError(x, v, "readonly parameter; must send as nil or empty in request") - } - case pattern: - reg, err := regexp.Compile(v.rule.(string)) - if err != nil { - return createError(x, v, err.Error()) - } - keys := x.MapKeys() - for _, k := range keys { - if !reg.MatchString(k.String()) { - return createError(k, v, fmt.Sprintf("map key doesn't match pattern %v", v.rule)) - } - } - default: - return createError(x, v, fmt.Sprintf("constraint %v is not applicable to array, slice and map type", v.name)) - } - if v.chain != nil { - return validate([]validation{ - { - targetValue: getInterfaceValue(x), - constraints: v.chain, - }, - }) - } - return nil -} - -func checkNil(x reflect.Value, v constraint) error { - if _, ok := v.rule.(bool); !ok { - return createError(x, v, fmt.Sprintf("rule must be bool value for %v constraint; got: %v", v.name, v.rule)) - } - if v.rule.(bool) { - return createError(x, v, "value can not be null; required parameter") - } - return nil -} - -func checkEmpty(x reflect.Value, v constraint) error { - if _, ok := v.rule.(bool); !ok { - return createError(x, v, fmt.Sprintf("rule must be bool value for %v constraint; got: %v", v.name, v.rule)) - } - if v.rule.(bool) { - return createError(x, v, "value can not be null or empty; required parameter") - } - return nil -} - -func checkForUniqueInArray(x reflect.Value) bool { - if x == reflect.Zero(reflect.TypeOf(x)) || x.Len() == 0 { - return false - } - arrOfInterface := make([]interface{}, x.Len()) - for i := 0; i < x.Len(); i++ { - arrOfInterface[i] = x.Index(i).Interface() - } - m := make(map[interface{}]bool) - for _, val := range arrOfInterface { - if m[val] { - return false - } - m[val] = true - } - return true -} - -func checkForUniqueInMap(x reflect.Value) bool { - if x == reflect.Zero(reflect.TypeOf(x)) || x.Len() == 0 { - return false - } - mapOfInterface := make(map[interface{}]interface{}, x.Len()) - keys := x.MapKeys() - for _, k := range keys { - mapOfInterface[k.Interface()] = x.MapIndex(k).Interface() - } - m := make(map[interface{}]bool) - for _, val := range mapOfInterface { - if m[val] { - return false - } - m[val] = true - } - return true -} - -func getInterfaceValue(x reflect.Value) interface{} { - if x.Kind() == reflect.Invalid { - return nil - } - return x.Interface() -} - -func isZero(x interface{}) bool { - return x == reflect.Zero(reflect.TypeOf(x)).Interface() -} - -func createError(x reflect.Value, v constraint, message string) error { - return pipeline.NewError(nil, fmt.Sprintf("validation failed: parameter=%s constraint=%s value=%#v details: %s", - v.target, v.name, getInterfaceValue(x), message)) -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_version.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_version.go deleted file mode 100644 index 760271a42159..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_generated_version.go +++ /dev/null @@ -1,14 +0,0 @@ -package azblob - -// Code generated by Microsoft (R) AutoRest Code Generator. -// Changes may cause incorrect behavior and will be lost if the code is regenerated. - -// UserAgent returns the UserAgent string to use when sending http.Requests. -func UserAgent() string { - return "Azure-SDK-For-Go/0.0.0 azblob/2018-03-28" -} - -// Version returns the semantic version (see http://semver.org) of the client. -func Version() string { - return "0.0.0" -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_response_helpers.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_response_helpers.go deleted file mode 100644 index b4f058b6748c..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zz_response_helpers.go +++ /dev/null @@ -1,242 +0,0 @@ -package azblob - -import ( - "context" - "io" - "net/http" - "time" -) - -// BlobHTTPHeaders contains read/writeable blob properties. -type BlobHTTPHeaders struct { - ContentType string - ContentMD5 []byte - ContentEncoding string - ContentLanguage string - ContentDisposition string - CacheControl string -} - -// NewHTTPHeaders returns the user-modifiable properties for this blob. -func (bgpr BlobGetPropertiesResponse) NewHTTPHeaders() BlobHTTPHeaders { - return BlobHTTPHeaders{ - ContentType: bgpr.ContentType(), - ContentEncoding: bgpr.ContentEncoding(), - ContentLanguage: bgpr.ContentLanguage(), - ContentDisposition: bgpr.ContentDisposition(), - CacheControl: bgpr.CacheControl(), - ContentMD5: bgpr.ContentMD5(), - } -} - -/////////////////////////////////////////////////////////////////////////////// - -// NewHTTPHeaders returns the user-modifiable properties for this blob. -func (dr downloadResponse) NewHTTPHeaders() BlobHTTPHeaders { - return BlobHTTPHeaders{ - ContentType: dr.ContentType(), - ContentEncoding: dr.ContentEncoding(), - ContentLanguage: dr.ContentLanguage(), - ContentDisposition: dr.ContentDisposition(), - CacheControl: dr.CacheControl(), - ContentMD5: dr.ContentMD5(), - } -} - -/////////////////////////////////////////////////////////////////////////////// - -// DownloadResponse wraps AutoRest generated downloadResponse and helps to provide info for retry. -type DownloadResponse struct { - r *downloadResponse - ctx context.Context - b BlobURL - getInfo HTTPGetterInfo -} - -// Body constructs new RetryReader stream for reading data. If a connection failes -// while reading, it will make additional requests to reestablish a connection and -// continue reading. Specifying a RetryReaderOption's with MaxRetryRequests set to 0 -// (the default), returns the original response body and no retries will be performed. -func (r *DownloadResponse) Body(o RetryReaderOptions) io.ReadCloser { - if o.MaxRetryRequests == 0 { // No additional retries - return r.Response().Body - } - return NewRetryReader(r.ctx, r.Response(), r.getInfo, o, - func(ctx context.Context, getInfo HTTPGetterInfo) (*http.Response, error) { - resp, err := r.b.Download(ctx, getInfo.Offset, getInfo.Count, - BlobAccessConditions{ - HTTPAccessConditions: HTTPAccessConditions{IfMatch: getInfo.ETag}, - }, - false) - if err != nil { - return nil, err - } - return resp.Response(), err - }, - ) -} - -// Response returns the raw HTTP response object. -func (r DownloadResponse) Response() *http.Response { - return r.r.Response() -} - -// NewHTTPHeaders returns the user-modifiable properties for this blob. -func (r DownloadResponse) NewHTTPHeaders() BlobHTTPHeaders { - return r.r.NewHTTPHeaders() -} - -// BlobContentMD5 returns the value for header x-ms-blob-content-md5. -func (r DownloadResponse) BlobContentMD5() []byte { - return r.r.BlobContentMD5() -} - -// ContentMD5 returns the value for header Content-MD5. -func (r DownloadResponse) ContentMD5() []byte { - return r.r.ContentMD5() -} - -// StatusCode returns the HTTP status code of the response, e.g. 200. -func (r DownloadResponse) StatusCode() int { - return r.r.StatusCode() -} - -// Status returns the HTTP status message of the response, e.g. "200 OK". -func (r DownloadResponse) Status() string { - return r.r.Status() -} - -// AcceptRanges returns the value for header Accept-Ranges. -func (r DownloadResponse) AcceptRanges() string { - return r.r.AcceptRanges() -} - -// BlobCommittedBlockCount returns the value for header x-ms-blob-committed-block-count. -func (r DownloadResponse) BlobCommittedBlockCount() int32 { - return r.r.BlobCommittedBlockCount() -} - -// BlobSequenceNumber returns the value for header x-ms-blob-sequence-number. -func (r DownloadResponse) BlobSequenceNumber() int64 { - return r.r.BlobSequenceNumber() -} - -// BlobType returns the value for header x-ms-blob-type. -func (r DownloadResponse) BlobType() BlobType { - return r.r.BlobType() -} - -// CacheControl returns the value for header Cache-Control. -func (r DownloadResponse) CacheControl() string { - return r.r.CacheControl() -} - -// ContentDisposition returns the value for header Content-Disposition. -func (r DownloadResponse) ContentDisposition() string { - return r.r.ContentDisposition() -} - -// ContentEncoding returns the value for header Content-Encoding. -func (r DownloadResponse) ContentEncoding() string { - return r.r.ContentEncoding() -} - -// ContentLanguage returns the value for header Content-Language. -func (r DownloadResponse) ContentLanguage() string { - return r.r.ContentLanguage() -} - -// ContentLength returns the value for header Content-Length. -func (r DownloadResponse) ContentLength() int64 { - return r.r.ContentLength() -} - -// ContentRange returns the value for header Content-Range. -func (r DownloadResponse) ContentRange() string { - return r.r.ContentRange() -} - -// ContentType returns the value for header Content-Type. -func (r DownloadResponse) ContentType() string { - return r.r.ContentType() -} - -// CopyCompletionTime returns the value for header x-ms-copy-completion-time. -func (r DownloadResponse) CopyCompletionTime() time.Time { - return r.r.CopyCompletionTime() -} - -// CopyID returns the value for header x-ms-copy-id. -func (r DownloadResponse) CopyID() string { - return r.r.CopyID() -} - -// CopyProgress returns the value for header x-ms-copy-progress. -func (r DownloadResponse) CopyProgress() string { - return r.r.CopyProgress() -} - -// CopySource returns the value for header x-ms-copy-source. -func (r DownloadResponse) CopySource() string { - return r.r.CopySource() -} - -// CopyStatus returns the value for header x-ms-copy-status. -func (r DownloadResponse) CopyStatus() CopyStatusType { - return r.r.CopyStatus() -} - -// CopyStatusDescription returns the value for header x-ms-copy-status-description. -func (r DownloadResponse) CopyStatusDescription() string { - return r.r.CopyStatusDescription() -} - -// Date returns the value for header Date. -func (r DownloadResponse) Date() time.Time { - return r.r.Date() -} - -// ETag returns the value for header ETag. -func (r DownloadResponse) ETag() ETag { - return r.r.ETag() -} - -// IsServerEncrypted returns the value for header x-ms-server-encrypted. -func (r DownloadResponse) IsServerEncrypted() string { - return r.r.IsServerEncrypted() -} - -// LastModified returns the value for header Last-Modified. -func (r DownloadResponse) LastModified() time.Time { - return r.r.LastModified() -} - -// LeaseDuration returns the value for header x-ms-lease-duration. -func (r DownloadResponse) LeaseDuration() LeaseDurationType { - return r.r.LeaseDuration() -} - -// LeaseState returns the value for header x-ms-lease-state. -func (r DownloadResponse) LeaseState() LeaseStateType { - return r.r.LeaseState() -} - -// LeaseStatus returns the value for header x-ms-lease-status. -func (r DownloadResponse) LeaseStatus() LeaseStatusType { - return r.r.LeaseStatus() -} - -// RequestID returns the value for header x-ms-request-id. -func (r DownloadResponse) RequestID() string { - return r.r.RequestID() -} - -// Version returns the value for header x-ms-version. -func (r DownloadResponse) Version() string { - return r.r.Version() -} - -// NewMetadata returns user-defined key/value pairs. -func (r DownloadResponse) NewMetadata() Metadata { - return r.r.NewMetadata() -} diff --git a/vendor/github.com/Azure/azure-storage-blob-go/LICENSE b/vendor/github.com/Azure/azure-storage-blob-go/LICENSE deleted file mode 100644 index d1ca00f20a89..000000000000 --- a/vendor/github.com/Azure/azure-storage-blob-go/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - MIT License - - Copyright (c) Microsoft Corporation. All rights reserved. - - 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 \ No newline at end of file diff --git a/vendor/github.com/StackExchange/wmi/LICENSE b/vendor/github.com/StackExchange/wmi/LICENSE deleted file mode 100644 index ae80b67209e2..000000000000 --- a/vendor/github.com/StackExchange/wmi/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Stack Exchange - -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/StackExchange/wmi/README.md b/vendor/github.com/StackExchange/wmi/README.md deleted file mode 100644 index 426d1a46b4aa..000000000000 --- a/vendor/github.com/StackExchange/wmi/README.md +++ /dev/null @@ -1,6 +0,0 @@ -wmi -=== - -Package wmi provides a WQL interface to Windows WMI. - -Note: It interfaces with WMI on the local machine, therefore it only runs on Windows. diff --git a/vendor/github.com/StackExchange/wmi/swbemservices.go b/vendor/github.com/StackExchange/wmi/swbemservices.go deleted file mode 100644 index 9765a53f74db..000000000000 --- a/vendor/github.com/StackExchange/wmi/swbemservices.go +++ /dev/null @@ -1,260 +0,0 @@ -// +build windows - -package wmi - -import ( - "fmt" - "reflect" - "runtime" - "sync" - - "github.com/go-ole/go-ole" - "github.com/go-ole/go-ole/oleutil" -) - -// SWbemServices is used to access wmi. See https://msdn.microsoft.com/en-us/library/aa393719(v=vs.85).aspx -type SWbemServices struct { - //TODO: track namespace. Not sure if we can re connect to a different namespace using the same instance - cWMIClient *Client //This could also be an embedded struct, but then we would need to branch on Client vs SWbemServices in the Query method - sWbemLocatorIUnknown *ole.IUnknown - sWbemLocatorIDispatch *ole.IDispatch - queries chan *queryRequest - closeError chan error - lQueryorClose sync.Mutex -} - -type queryRequest struct { - query string - dst interface{} - args []interface{} - finished chan error -} - -// InitializeSWbemServices will return a new SWbemServices object that can be used to query WMI -func InitializeSWbemServices(c *Client, connectServerArgs ...interface{}) (*SWbemServices, error) { - //fmt.Println("InitializeSWbemServices: Starting") - //TODO: implement connectServerArgs as optional argument for init with connectServer call - s := new(SWbemServices) - s.cWMIClient = c - s.queries = make(chan *queryRequest) - initError := make(chan error) - go s.process(initError) - - err, ok := <-initError - if ok { - return nil, err //Send error to caller - } - //fmt.Println("InitializeSWbemServices: Finished") - return s, nil -} - -// Close will clear and release all of the SWbemServices resources -func (s *SWbemServices) Close() error { - s.lQueryorClose.Lock() - if s == nil || s.sWbemLocatorIDispatch == nil { - s.lQueryorClose.Unlock() - return fmt.Errorf("SWbemServices is not Initialized") - } - if s.queries == nil { - s.lQueryorClose.Unlock() - return fmt.Errorf("SWbemServices has been closed") - } - //fmt.Println("Close: sending close request") - var result error - ce := make(chan error) - s.closeError = ce //Race condition if multiple callers to close. May need to lock here - close(s.queries) //Tell background to shut things down - s.lQueryorClose.Unlock() - err, ok := <-ce - if ok { - result = err - } - //fmt.Println("Close: finished") - return result -} - -func (s *SWbemServices) process(initError chan error) { - //fmt.Println("process: starting background thread initialization") - //All OLE/WMI calls must happen on the same initialized thead, so lock this goroutine - runtime.LockOSThread() - defer runtime.LockOSThread() - - err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED) - if err != nil { - oleCode := err.(*ole.OleError).Code() - if oleCode != ole.S_OK && oleCode != S_FALSE { - initError <- fmt.Errorf("ole.CoInitializeEx error: %v", err) - return - } - } - defer ole.CoUninitialize() - - unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator") - if err != nil { - initError <- fmt.Errorf("CreateObject SWbemLocator error: %v", err) - return - } else if unknown == nil { - initError <- ErrNilCreateObject - return - } - defer unknown.Release() - s.sWbemLocatorIUnknown = unknown - - dispatch, err := s.sWbemLocatorIUnknown.QueryInterface(ole.IID_IDispatch) - if err != nil { - initError <- fmt.Errorf("SWbemLocator QueryInterface error: %v", err) - return - } - defer dispatch.Release() - s.sWbemLocatorIDispatch = dispatch - - // we can't do the ConnectServer call outside the loop unless we find a way to track and re-init the connectServerArgs - //fmt.Println("process: initialized. closing initError") - close(initError) - //fmt.Println("process: waiting for queries") - for q := range s.queries { - //fmt.Printf("process: new query: len(query)=%d\n", len(q.query)) - errQuery := s.queryBackground(q) - //fmt.Println("process: s.queryBackground finished") - if errQuery != nil { - q.finished <- errQuery - } - close(q.finished) - } - //fmt.Println("process: queries channel closed") - s.queries = nil //set channel to nil so we know it is closed - //TODO: I think the Release/Clear calls can panic if things are in a bad state. - //TODO: May need to recover from panics and send error to method caller instead. - close(s.closeError) -} - -// Query runs the WQL query using a SWbemServices instance and appends the values to dst. -// -// dst must have type *[]S or *[]*S, for some struct type S. Fields selected in -// the query must have the same name in dst. Supported types are all signed and -// unsigned integers, time.Time, string, bool, or a pointer to one of those. -// Array types are not supported. -// -// By default, the local machine and default namespace are used. These can be -// changed using connectServerArgs. See -// http://msdn.microsoft.com/en-us/library/aa393720.aspx for details. -func (s *SWbemServices) Query(query string, dst interface{}, connectServerArgs ...interface{}) error { - s.lQueryorClose.Lock() - if s == nil || s.sWbemLocatorIDispatch == nil { - s.lQueryorClose.Unlock() - return fmt.Errorf("SWbemServices is not Initialized") - } - if s.queries == nil { - s.lQueryorClose.Unlock() - return fmt.Errorf("SWbemServices has been closed") - } - - //fmt.Println("Query: Sending query request") - qr := queryRequest{ - query: query, - dst: dst, - args: connectServerArgs, - finished: make(chan error), - } - s.queries <- &qr - s.lQueryorClose.Unlock() - err, ok := <-qr.finished - if ok { - //fmt.Println("Query: Finished with error") - return err //Send error to caller - } - //fmt.Println("Query: Finished") - return nil -} - -func (s *SWbemServices) queryBackground(q *queryRequest) error { - if s == nil || s.sWbemLocatorIDispatch == nil { - return fmt.Errorf("SWbemServices is not Initialized") - } - wmi := s.sWbemLocatorIDispatch //Should just rename in the code, but this will help as we break things apart - //fmt.Println("queryBackground: Starting") - - dv := reflect.ValueOf(q.dst) - if dv.Kind() != reflect.Ptr || dv.IsNil() { - return ErrInvalidEntityType - } - dv = dv.Elem() - mat, elemType := checkMultiArg(dv) - if mat == multiArgTypeInvalid { - return ErrInvalidEntityType - } - - // service is a SWbemServices - serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", q.args...) - if err != nil { - return err - } - service := serviceRaw.ToIDispatch() - defer serviceRaw.Clear() - - // result is a SWBemObjectSet - resultRaw, err := oleutil.CallMethod(service, "ExecQuery", q.query) - if err != nil { - return err - } - result := resultRaw.ToIDispatch() - defer resultRaw.Clear() - - count, err := oleInt64(result, "Count") - if err != nil { - return err - } - - enumProperty, err := result.GetProperty("_NewEnum") - if err != nil { - return err - } - defer enumProperty.Clear() - - enum, err := enumProperty.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant) - if err != nil { - return err - } - if enum == nil { - return fmt.Errorf("can't get IEnumVARIANT, enum is nil") - } - defer enum.Release() - - // Initialize a slice with Count capacity - dv.Set(reflect.MakeSlice(dv.Type(), 0, int(count))) - - var errFieldMismatch error - for itemRaw, length, err := enum.Next(1); length > 0; itemRaw, length, err = enum.Next(1) { - if err != nil { - return err - } - - err := func() error { - // item is a SWbemObject, but really a Win32_Process - item := itemRaw.ToIDispatch() - defer item.Release() - - ev := reflect.New(elemType) - if err = s.cWMIClient.loadEntity(ev.Interface(), item); err != nil { - if _, ok := err.(*ErrFieldMismatch); ok { - // We continue loading entities even in the face of field mismatch errors. - // If we encounter any other error, that other error is returned. Otherwise, - // an ErrFieldMismatch is returned. - errFieldMismatch = err - } else { - return err - } - } - if mat != multiArgTypeStructPtr { - ev = ev.Elem() - } - dv.Set(reflect.Append(dv, ev)) - return nil - }() - if err != nil { - return err - } - } - //fmt.Println("queryBackground: Finished") - return errFieldMismatch -} diff --git a/vendor/github.com/StackExchange/wmi/wmi.go b/vendor/github.com/StackExchange/wmi/wmi.go deleted file mode 100644 index a951b1258b04..000000000000 --- a/vendor/github.com/StackExchange/wmi/wmi.go +++ /dev/null @@ -1,486 +0,0 @@ -// +build windows - -/* -Package wmi provides a WQL interface for WMI on Windows. - -Example code to print names of running processes: - - type Win32_Process struct { - Name string - } - - func main() { - var dst []Win32_Process - q := wmi.CreateQuery(&dst, "") - err := wmi.Query(q, &dst) - if err != nil { - log.Fatal(err) - } - for i, v := range dst { - println(i, v.Name) - } - } - -*/ -package wmi - -import ( - "bytes" - "errors" - "fmt" - "log" - "os" - "reflect" - "runtime" - "strconv" - "strings" - "sync" - "time" - - "github.com/go-ole/go-ole" - "github.com/go-ole/go-ole/oleutil" -) - -var l = log.New(os.Stdout, "", log.LstdFlags) - -var ( - ErrInvalidEntityType = errors.New("wmi: invalid entity type") - // ErrNilCreateObject is the error returned if CreateObject returns nil even - // if the error was nil. - ErrNilCreateObject = errors.New("wmi: create object returned nil") - lock sync.Mutex -) - -// S_FALSE is returned by CoInitializeEx if it was already called on this thread. -const S_FALSE = 0x00000001 - -// QueryNamespace invokes Query with the given namespace on the local machine. -func QueryNamespace(query string, dst interface{}, namespace string) error { - return Query(query, dst, nil, namespace) -} - -// Query runs the WQL query and appends the values to dst. -// -// dst must have type *[]S or *[]*S, for some struct type S. Fields selected in -// the query must have the same name in dst. Supported types are all signed and -// unsigned integers, time.Time, string, bool, or a pointer to one of those. -// Array types are not supported. -// -// By default, the local machine and default namespace are used. These can be -// changed using connectServerArgs. See -// http://msdn.microsoft.com/en-us/library/aa393720.aspx for details. -// -// Query is a wrapper around DefaultClient.Query. -func Query(query string, dst interface{}, connectServerArgs ...interface{}) error { - if DefaultClient.SWbemServicesClient == nil { - return DefaultClient.Query(query, dst, connectServerArgs...) - } - return DefaultClient.SWbemServicesClient.Query(query, dst, connectServerArgs...) -} - -// A Client is an WMI query client. -// -// Its zero value (DefaultClient) is a usable client. -type Client struct { - // NonePtrZero specifies if nil values for fields which aren't pointers - // should be returned as the field types zero value. - // - // Setting this to true allows stucts without pointer fields to be used - // without the risk failure should a nil value returned from WMI. - NonePtrZero bool - - // PtrNil specifies if nil values for pointer fields should be returned - // as nil. - // - // Setting this to true will set pointer fields to nil where WMI - // returned nil, otherwise the types zero value will be returned. - PtrNil bool - - // AllowMissingFields specifies that struct fields not present in the - // query result should not result in an error. - // - // Setting this to true allows custom queries to be used with full - // struct definitions instead of having to define multiple structs. - AllowMissingFields bool - - // SWbemServiceClient is an optional SWbemServices object that can be - // initialized and then reused across multiple queries. If it is null - // then the method will initialize a new temporary client each time. - SWbemServicesClient *SWbemServices -} - -// DefaultClient is the default Client and is used by Query, QueryNamespace -var DefaultClient = &Client{} - -// Query runs the WQL query and appends the values to dst. -// -// dst must have type *[]S or *[]*S, for some struct type S. Fields selected in -// the query must have the same name in dst. Supported types are all signed and -// unsigned integers, time.Time, string, bool, or a pointer to one of those. -// Array types are not supported. -// -// By default, the local machine and default namespace are used. These can be -// changed using connectServerArgs. See -// http://msdn.microsoft.com/en-us/library/aa393720.aspx for details. -func (c *Client) Query(query string, dst interface{}, connectServerArgs ...interface{}) error { - dv := reflect.ValueOf(dst) - if dv.Kind() != reflect.Ptr || dv.IsNil() { - return ErrInvalidEntityType - } - dv = dv.Elem() - mat, elemType := checkMultiArg(dv) - if mat == multiArgTypeInvalid { - return ErrInvalidEntityType - } - - lock.Lock() - defer lock.Unlock() - runtime.LockOSThread() - defer runtime.UnlockOSThread() - - err := ole.CoInitializeEx(0, ole.COINIT_MULTITHREADED) - if err != nil { - oleCode := err.(*ole.OleError).Code() - if oleCode != ole.S_OK && oleCode != S_FALSE { - return err - } - } - defer ole.CoUninitialize() - - unknown, err := oleutil.CreateObject("WbemScripting.SWbemLocator") - if err != nil { - return err - } else if unknown == nil { - return ErrNilCreateObject - } - defer unknown.Release() - - wmi, err := unknown.QueryInterface(ole.IID_IDispatch) - if err != nil { - return err - } - defer wmi.Release() - - // service is a SWbemServices - serviceRaw, err := oleutil.CallMethod(wmi, "ConnectServer", connectServerArgs...) - if err != nil { - return err - } - service := serviceRaw.ToIDispatch() - defer serviceRaw.Clear() - - // result is a SWBemObjectSet - resultRaw, err := oleutil.CallMethod(service, "ExecQuery", query) - if err != nil { - return err - } - result := resultRaw.ToIDispatch() - defer resultRaw.Clear() - - count, err := oleInt64(result, "Count") - if err != nil { - return err - } - - enumProperty, err := result.GetProperty("_NewEnum") - if err != nil { - return err - } - defer enumProperty.Clear() - - enum, err := enumProperty.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant) - if err != nil { - return err - } - if enum == nil { - return fmt.Errorf("can't get IEnumVARIANT, enum is nil") - } - defer enum.Release() - - // Initialize a slice with Count capacity - dv.Set(reflect.MakeSlice(dv.Type(), 0, int(count))) - - var errFieldMismatch error - for itemRaw, length, err := enum.Next(1); length > 0; itemRaw, length, err = enum.Next(1) { - if err != nil { - return err - } - - err := func() error { - // item is a SWbemObject, but really a Win32_Process - item := itemRaw.ToIDispatch() - defer item.Release() - - ev := reflect.New(elemType) - if err = c.loadEntity(ev.Interface(), item); err != nil { - if _, ok := err.(*ErrFieldMismatch); ok { - // We continue loading entities even in the face of field mismatch errors. - // If we encounter any other error, that other error is returned. Otherwise, - // an ErrFieldMismatch is returned. - errFieldMismatch = err - } else { - return err - } - } - if mat != multiArgTypeStructPtr { - ev = ev.Elem() - } - dv.Set(reflect.Append(dv, ev)) - return nil - }() - if err != nil { - return err - } - } - return errFieldMismatch -} - -// ErrFieldMismatch is returned when a field is to be loaded into a different -// type than the one it was stored from, or when a field is missing or -// unexported in the destination struct. -// StructType is the type of the struct pointed to by the destination argument. -type ErrFieldMismatch struct { - StructType reflect.Type - FieldName string - Reason string -} - -func (e *ErrFieldMismatch) Error() string { - return fmt.Sprintf("wmi: cannot load field %q into a %q: %s", - e.FieldName, e.StructType, e.Reason) -} - -var timeType = reflect.TypeOf(time.Time{}) - -// loadEntity loads a SWbemObject into a struct pointer. -func (c *Client) loadEntity(dst interface{}, src *ole.IDispatch) (errFieldMismatch error) { - v := reflect.ValueOf(dst).Elem() - for i := 0; i < v.NumField(); i++ { - f := v.Field(i) - of := f - isPtr := f.Kind() == reflect.Ptr - if isPtr { - ptr := reflect.New(f.Type().Elem()) - f.Set(ptr) - f = f.Elem() - } - n := v.Type().Field(i).Name - if !f.CanSet() { - return &ErrFieldMismatch{ - StructType: of.Type(), - FieldName: n, - Reason: "CanSet() is false", - } - } - prop, err := oleutil.GetProperty(src, n) - if err != nil { - if !c.AllowMissingFields { - errFieldMismatch = &ErrFieldMismatch{ - StructType: of.Type(), - FieldName: n, - Reason: "no such struct field", - } - } - continue - } - defer prop.Clear() - - switch val := prop.Value().(type) { - case int8, int16, int32, int64, int: - v := reflect.ValueOf(val).Int() - switch f.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - f.SetInt(v) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - f.SetUint(uint64(v)) - default: - return &ErrFieldMismatch{ - StructType: of.Type(), - FieldName: n, - Reason: "not an integer class", - } - } - case uint8, uint16, uint32, uint64: - v := reflect.ValueOf(val).Uint() - switch f.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - f.SetInt(int64(v)) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - f.SetUint(v) - default: - return &ErrFieldMismatch{ - StructType: of.Type(), - FieldName: n, - Reason: "not an integer class", - } - } - case string: - switch f.Kind() { - case reflect.String: - f.SetString(val) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - iv, err := strconv.ParseInt(val, 10, 64) - if err != nil { - return err - } - f.SetInt(iv) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - uv, err := strconv.ParseUint(val, 10, 64) - if err != nil { - return err - } - f.SetUint(uv) - case reflect.Struct: - switch f.Type() { - case timeType: - if len(val) == 25 { - mins, err := strconv.Atoi(val[22:]) - if err != nil { - return err - } - val = val[:22] + fmt.Sprintf("%02d%02d", mins/60, mins%60) - } - t, err := time.Parse("20060102150405.000000-0700", val) - if err != nil { - return err - } - f.Set(reflect.ValueOf(t)) - } - } - case bool: - switch f.Kind() { - case reflect.Bool: - f.SetBool(val) - default: - return &ErrFieldMismatch{ - StructType: of.Type(), - FieldName: n, - Reason: "not a bool", - } - } - case float32: - switch f.Kind() { - case reflect.Float32: - f.SetFloat(float64(val)) - default: - return &ErrFieldMismatch{ - StructType: of.Type(), - FieldName: n, - Reason: "not a Float32", - } - } - default: - if f.Kind() == reflect.Slice { - switch f.Type().Elem().Kind() { - case reflect.String: - safeArray := prop.ToArray() - if safeArray != nil { - arr := safeArray.ToValueArray() - fArr := reflect.MakeSlice(f.Type(), len(arr), len(arr)) - for i, v := range arr { - s := fArr.Index(i) - s.SetString(v.(string)) - } - f.Set(fArr) - } - case reflect.Uint8: - safeArray := prop.ToArray() - if safeArray != nil { - arr := safeArray.ToValueArray() - fArr := reflect.MakeSlice(f.Type(), len(arr), len(arr)) - for i, v := range arr { - s := fArr.Index(i) - s.SetUint(reflect.ValueOf(v).Uint()) - } - f.Set(fArr) - } - default: - return &ErrFieldMismatch{ - StructType: of.Type(), - FieldName: n, - Reason: fmt.Sprintf("unsupported slice type (%T)", val), - } - } - } else { - typeof := reflect.TypeOf(val) - if typeof == nil && (isPtr || c.NonePtrZero) { - if (isPtr && c.PtrNil) || (!isPtr && c.NonePtrZero) { - of.Set(reflect.Zero(of.Type())) - } - break - } - return &ErrFieldMismatch{ - StructType: of.Type(), - FieldName: n, - Reason: fmt.Sprintf("unsupported type (%T)", val), - } - } - } - } - return errFieldMismatch -} - -type multiArgType int - -const ( - multiArgTypeInvalid multiArgType = iota - multiArgTypeStruct - multiArgTypeStructPtr -) - -// checkMultiArg checks that v has type []S, []*S for some struct type S. -// -// It returns what category the slice's elements are, and the reflect.Type -// that represents S. -func checkMultiArg(v reflect.Value) (m multiArgType, elemType reflect.Type) { - if v.Kind() != reflect.Slice { - return multiArgTypeInvalid, nil - } - elemType = v.Type().Elem() - switch elemType.Kind() { - case reflect.Struct: - return multiArgTypeStruct, elemType - case reflect.Ptr: - elemType = elemType.Elem() - if elemType.Kind() == reflect.Struct { - return multiArgTypeStructPtr, elemType - } - } - return multiArgTypeInvalid, nil -} - -func oleInt64(item *ole.IDispatch, prop string) (int64, error) { - v, err := oleutil.GetProperty(item, prop) - if err != nil { - return 0, err - } - defer v.Clear() - - i := int64(v.Val) - return i, nil -} - -// CreateQuery returns a WQL query string that queries all columns of src. where -// is an optional string that is appended to the query, to be used with WHERE -// clauses. In such a case, the "WHERE" string should appear at the beginning. -func CreateQuery(src interface{}, where string) string { - var b bytes.Buffer - b.WriteString("SELECT ") - s := reflect.Indirect(reflect.ValueOf(src)) - t := s.Type() - if s.Kind() == reflect.Slice { - t = t.Elem() - } - if t.Kind() != reflect.Struct { - return "" - } - var fields []string - for i := 0; i < t.NumField(); i++ { - fields = append(fields, t.Field(i).Name) - } - b.WriteString(strings.Join(fields, ", ")) - b.WriteString(" FROM ") - b.WriteString(t.Name()) - b.WriteString(" " + where) - return b.String() -} diff --git a/vendor/github.com/allegro/bigcache/LICENSE b/vendor/github.com/allegro/bigcache/LICENSE deleted file mode 100644 index 8dada3edaf50..000000000000 --- a/vendor/github.com/allegro/bigcache/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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/allegro/bigcache/README.md b/vendor/github.com/allegro/bigcache/README.md deleted file mode 100644 index c23f7f36ce48..000000000000 --- a/vendor/github.com/allegro/bigcache/README.md +++ /dev/null @@ -1,150 +0,0 @@ -# BigCache [![Build Status](https://travis-ci.org/allegro/bigcache.svg?branch=master)](https://travis-ci.org/allegro/bigcache) [![Coverage Status](https://coveralls.io/repos/github/allegro/bigcache/badge.svg?branch=master)](https://coveralls.io/github/allegro/bigcache?branch=master) [![GoDoc](https://godoc.org/github.com/allegro/bigcache?status.svg)](https://godoc.org/github.com/allegro/bigcache) [![Go Report Card](https://goreportcard.com/badge/github.com/allegro/bigcache)](https://goreportcard.com/report/github.com/allegro/bigcache) - -Fast, concurrent, evicting in-memory cache written to keep big number of entries without impact on performance. -BigCache keeps entries on heap but omits GC for them. To achieve that operations on bytes arrays take place, -therefore entries (de)serialization in front of the cache will be needed in most use cases. - -## Usage - -### Simple initialization - -```go -import "github.com/allegro/bigcache" - -cache, _ := bigcache.NewBigCache(bigcache.DefaultConfig(10 * time.Minute)) - -cache.Set("my-unique-key", []byte("value")) - -entry, _ := cache.Get("my-unique-key") -fmt.Println(string(entry)) -``` - -### Custom initialization - -When cache load can be predicted in advance then it is better to use custom initialization because additional memory -allocation can be avoided in that way. - -```go -import ( - "log" - - "github.com/allegro/bigcache" -) - -config := bigcache.Config { - // number of shards (must be a power of 2) - Shards: 1024, - // time after which entry can be evicted - LifeWindow: 10 * time.Minute, - // rps * lifeWindow, used only in initial memory allocation - MaxEntriesInWindow: 1000 * 10 * 60, - // max entry size in bytes, used only in initial memory allocation - MaxEntrySize: 500, - // prints information about additional memory allocation - Verbose: true, - // cache will not allocate more memory than this limit, value in MB - // if value is reached then the oldest entries can be overridden for the new ones - // 0 value means no size limit - HardMaxCacheSize: 8192, - // callback fired when the oldest entry is removed because of its expiration time or no space left - // for the new entry, or because delete was called. A bitmask representing the reason will be returned. - // Default value is nil which means no callback and it prevents from unwrapping the oldest entry. - OnRemove: nil, - // OnRemoveWithReason is a callback fired when the oldest entry is removed because of its expiration time or no space left - // for the new entry, or because delete was called. A constant representing the reason will be passed through. - // Default value is nil which means no callback and it prevents from unwrapping the oldest entry. - // Ignored if OnRemove is specified. - OnRemoveWithReason: nil, - } - -cache, initErr := bigcache.NewBigCache(config) -if initErr != nil { - log.Fatal(initErr) -} - -cache.Set("my-unique-key", []byte("value")) - -if entry, err := cache.Get("my-unique-key"); err == nil { - fmt.Println(string(entry)) -} -``` - -## Benchmarks - -Three caches were compared: bigcache, [freecache](https://github.com/coocood/freecache) and map. -Benchmark tests were made using an i7-6700K with 32GB of RAM on Windows 10. - -### Writes and reads - -```bash -cd caches_bench; go test -bench=. -benchtime=10s ./... -timeout 30m - -BenchmarkMapSet-8 3000000 569 ns/op 202 B/op 3 allocs/op -BenchmarkConcurrentMapSet-8 1000000 1592 ns/op 347 B/op 8 allocs/op -BenchmarkFreeCacheSet-8 3000000 775 ns/op 355 B/op 2 allocs/op -BenchmarkBigCacheSet-8 3000000 640 ns/op 303 B/op 2 allocs/op -BenchmarkMapGet-8 5000000 407 ns/op 24 B/op 1 allocs/op -BenchmarkConcurrentMapGet-8 3000000 558 ns/op 24 B/op 2 allocs/op -BenchmarkFreeCacheGet-8 2000000 682 ns/op 136 B/op 2 allocs/op -BenchmarkBigCacheGet-8 3000000 512 ns/op 152 B/op 4 allocs/op -BenchmarkBigCacheSetParallel-8 10000000 225 ns/op 313 B/op 3 allocs/op -BenchmarkFreeCacheSetParallel-8 10000000 218 ns/op 341 B/op 3 allocs/op -BenchmarkConcurrentMapSetParallel-8 5000000 318 ns/op 200 B/op 6 allocs/op -BenchmarkBigCacheGetParallel-8 20000000 178 ns/op 152 B/op 4 allocs/op -BenchmarkFreeCacheGetParallel-8 20000000 295 ns/op 136 B/op 3 allocs/op -BenchmarkConcurrentMapGetParallel-8 10000000 237 ns/op 24 B/op 2 allocs/op -``` - -Writes and reads in bigcache are faster than in freecache. -Writes to map are the slowest. - -### GC pause time - -```bash -cd caches_bench; go run caches_gc_overhead_comparison.go - -Number of entries: 20000000 -GC pause for bigcache: 5.8658ms -GC pause for freecache: 32.4341ms -GC pause for map: 52.9661ms -``` - -Test shows how long are the GC pauses for caches filled with 20mln of entries. -Bigcache and freecache have very similar GC pause time. -It is clear that both reduce GC overhead in contrast to map -which GC pause time took more than 10 seconds. - -## How it works - -BigCache relies on optimization presented in 1.5 version of Go ([issue-9477](https://github.com/golang/go/issues/9477)). -This optimization states that if map without pointers in keys and values is used then GC will omit its content. -Therefore BigCache uses `map[uint64]uint32` where keys are hashed and values are offsets of entries. - -Entries are kept in bytes array, to omit GC again. -Bytes array size can grow to gigabytes without impact on performance -because GC will only see single pointer to it. - -## Bigcache vs Freecache - -Both caches provide the same core features but they reduce GC overhead in different ways. -Bigcache relies on `map[uint64]uint32`, freecache implements its own mapping built on -slices to reduce number of pointers. - -Results from benchmark tests are presented above. -One of the advantage of bigcache over freecache is that you don’t need to know -the size of the cache in advance, because when bigcache is full, -it can allocate additional memory for new entries instead of -overwriting existing ones as freecache does currently. -However hard max size in bigcache also can be set, check [HardMaxCacheSize](https://godoc.org/github.com/allegro/bigcache#Config). - -## HTTP Server - -This package also includes an easily deployable HTTP implementation of BigCache, which can be found in the [server](/server) package. - -## More - -Bigcache genesis is described in allegro.tech blog post: [writing a very fast cache service in Go](http://allegro.tech/2016/03/writing-fast-cache-service-in-go.html) - -## License - -BigCache is released under the Apache 2.0 license (see [LICENSE](LICENSE)) diff --git a/vendor/github.com/allegro/bigcache/bigcache.go b/vendor/github.com/allegro/bigcache/bigcache.go deleted file mode 100644 index e6aee8663b77..000000000000 --- a/vendor/github.com/allegro/bigcache/bigcache.go +++ /dev/null @@ -1,202 +0,0 @@ -package bigcache - -import ( - "fmt" - "time" -) - -const ( - minimumEntriesInShard = 10 // Minimum number of entries in single shard -) - -// BigCache is fast, concurrent, evicting cache created to keep big number of entries without impact on performance. -// It keeps entries on heap but omits GC for them. To achieve that, operations take place on byte arrays, -// therefore entries (de)serialization in front of the cache will be needed in most use cases. -type BigCache struct { - shards []*cacheShard - lifeWindow uint64 - clock clock - hash Hasher - config Config - shardMask uint64 - maxShardSize uint32 - close chan struct{} -} - -// RemoveReason is a value used to signal to the user why a particular key was removed in the OnRemove callback. -type RemoveReason uint32 - -const ( - // Expired means the key is past its LifeWindow. - Expired RemoveReason = iota - // NoSpace means the key is the oldest and the cache size was at its maximum when Set was called, or the - // entry exceeded the maximum shard size. - NoSpace - // Deleted means Delete was called and this key was removed as a result. - Deleted -) - -// NewBigCache initialize new instance of BigCache -func NewBigCache(config Config) (*BigCache, error) { - return newBigCache(config, &systemClock{}) -} - -func newBigCache(config Config, clock clock) (*BigCache, error) { - - if !isPowerOfTwo(config.Shards) { - return nil, fmt.Errorf("Shards number must be power of two") - } - - if config.Hasher == nil { - config.Hasher = newDefaultHasher() - } - - cache := &BigCache{ - shards: make([]*cacheShard, config.Shards), - lifeWindow: uint64(config.LifeWindow.Seconds()), - clock: clock, - hash: config.Hasher, - config: config, - shardMask: uint64(config.Shards - 1), - maxShardSize: uint32(config.maximumShardSize()), - close: make(chan struct{}), - } - - var onRemove func(wrappedEntry []byte, reason RemoveReason) - if config.OnRemove != nil { - onRemove = cache.providedOnRemove - } else if config.OnRemoveWithReason != nil { - onRemove = cache.providedOnRemoveWithReason - } else { - onRemove = cache.notProvidedOnRemove - } - - for i := 0; i < config.Shards; i++ { - cache.shards[i] = initNewShard(config, onRemove, clock) - } - - if config.CleanWindow > 0 { - go func() { - ticker := time.NewTicker(config.CleanWindow) - defer ticker.Stop() - for { - select { - case t := <-ticker.C: - cache.cleanUp(uint64(t.Unix())) - case <-cache.close: - return - } - } - }() - } - - return cache, nil -} - -// Close is used to signal a shutdown of the cache when you are done with it. -// This allows the cleaning goroutines to exit and ensures references are not -// kept to the cache preventing GC of the entire cache. -func (c *BigCache) Close() error { - close(c.close) - return nil -} - -// Get reads entry for the key. -// It returns an EntryNotFoundError when -// no entry exists for the given key. -func (c *BigCache) Get(key string) ([]byte, error) { - hashedKey := c.hash.Sum64(key) - shard := c.getShard(hashedKey) - return shard.get(key, hashedKey) -} - -// Set saves entry under the key -func (c *BigCache) Set(key string, entry []byte) error { - hashedKey := c.hash.Sum64(key) - shard := c.getShard(hashedKey) - return shard.set(key, hashedKey, entry) -} - -// Delete removes the key -func (c *BigCache) Delete(key string) error { - hashedKey := c.hash.Sum64(key) - shard := c.getShard(hashedKey) - return shard.del(key, hashedKey) -} - -// Reset empties all cache shards -func (c *BigCache) Reset() error { - for _, shard := range c.shards { - shard.reset(c.config) - } - return nil -} - -// Len computes number of entries in cache -func (c *BigCache) Len() int { - var len int - for _, shard := range c.shards { - len += shard.len() - } - return len -} - -// Capacity returns amount of bytes store in the cache. -func (c *BigCache) Capacity() int { - var len int - for _, shard := range c.shards { - len += shard.capacity() - } - return len -} - -// Stats returns cache's statistics -func (c *BigCache) Stats() Stats { - var s Stats - for _, shard := range c.shards { - tmp := shard.getStats() - s.Hits += tmp.Hits - s.Misses += tmp.Misses - s.DelHits += tmp.DelHits - s.DelMisses += tmp.DelMisses - s.Collisions += tmp.Collisions - } - return s -} - -// Iterator returns iterator function to iterate over EntryInfo's from whole cache. -func (c *BigCache) Iterator() *EntryInfoIterator { - return newIterator(c) -} - -func (c *BigCache) onEvict(oldestEntry []byte, currentTimestamp uint64, evict func(reason RemoveReason) error) bool { - oldestTimestamp := readTimestampFromEntry(oldestEntry) - if currentTimestamp-oldestTimestamp > c.lifeWindow { - evict(Expired) - return true - } - return false -} - -func (c *BigCache) cleanUp(currentTimestamp uint64) { - for _, shard := range c.shards { - shard.cleanUp(currentTimestamp) - } -} - -func (c *BigCache) getShard(hashedKey uint64) (shard *cacheShard) { - return c.shards[hashedKey&c.shardMask] -} - -func (c *BigCache) providedOnRemove(wrappedEntry []byte, reason RemoveReason) { - c.config.OnRemove(readKeyFromEntry(wrappedEntry), readEntry(wrappedEntry)) -} - -func (c *BigCache) providedOnRemoveWithReason(wrappedEntry []byte, reason RemoveReason) { - if c.config.onRemoveFilter == 0 || (1< 0 { - c.config.OnRemoveWithReason(readKeyFromEntry(wrappedEntry), readEntry(wrappedEntry), reason) - } -} - -func (c *BigCache) notProvidedOnRemove(wrappedEntry []byte, reason RemoveReason) { -} diff --git a/vendor/github.com/allegro/bigcache/bytes.go b/vendor/github.com/allegro/bigcache/bytes.go deleted file mode 100644 index 3944bfe13599..000000000000 --- a/vendor/github.com/allegro/bigcache/bytes.go +++ /dev/null @@ -1,14 +0,0 @@ -// +build !appengine - -package bigcache - -import ( - "reflect" - "unsafe" -) - -func bytesToString(b []byte) string { - bytesHeader := (*reflect.SliceHeader)(unsafe.Pointer(&b)) - strHeader := reflect.StringHeader{Data: bytesHeader.Data, Len: bytesHeader.Len} - return *(*string)(unsafe.Pointer(&strHeader)) -} diff --git a/vendor/github.com/allegro/bigcache/bytes_appengine.go b/vendor/github.com/allegro/bigcache/bytes_appengine.go deleted file mode 100644 index 3892f3b54f3d..000000000000 --- a/vendor/github.com/allegro/bigcache/bytes_appengine.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build appengine - -package bigcache - -func bytesToString(b []byte) string { - return string(b) -} diff --git a/vendor/github.com/allegro/bigcache/clock.go b/vendor/github.com/allegro/bigcache/clock.go deleted file mode 100644 index f8b535e133a7..000000000000 --- a/vendor/github.com/allegro/bigcache/clock.go +++ /dev/null @@ -1,14 +0,0 @@ -package bigcache - -import "time" - -type clock interface { - epoch() int64 -} - -type systemClock struct { -} - -func (c systemClock) epoch() int64 { - return time.Now().Unix() -} diff --git a/vendor/github.com/allegro/bigcache/config.go b/vendor/github.com/allegro/bigcache/config.go deleted file mode 100644 index 9654143ab132..000000000000 --- a/vendor/github.com/allegro/bigcache/config.go +++ /dev/null @@ -1,86 +0,0 @@ -package bigcache - -import "time" - -// Config for BigCache -type Config struct { - // Number of cache shards, value must be a power of two - Shards int - // Time after which entry can be evicted - LifeWindow time.Duration - // Interval between removing expired entries (clean up). - // If set to <= 0 then no action is performed. Setting to < 1 second is counterproductive — bigcache has a one second resolution. - CleanWindow time.Duration - // Max number of entries in life window. Used only to calculate initial size for cache shards. - // When proper value is set then additional memory allocation does not occur. - MaxEntriesInWindow int - // Max size of entry in bytes. Used only to calculate initial size for cache shards. - MaxEntrySize int - // Verbose mode prints information about new memory allocation - Verbose bool - // Hasher used to map between string keys and unsigned 64bit integers, by default fnv64 hashing is used. - Hasher Hasher - // HardMaxCacheSize is a limit for cache size in MB. Cache will not allocate more memory than this limit. - // It can protect application from consuming all available memory on machine, therefore from running OOM Killer. - // Default value is 0 which means unlimited size. When the limit is higher than 0 and reached then - // the oldest entries are overridden for the new ones. - HardMaxCacheSize int - // OnRemove is a callback fired when the oldest entry is removed because of its expiration time or no space left - // for the new entry, or because delete was called. - // Default value is nil which means no callback and it prevents from unwrapping the oldest entry. - OnRemove func(key string, entry []byte) - // OnRemoveWithReason is a callback fired when the oldest entry is removed because of its expiration time or no space left - // for the new entry, or because delete was called. A constant representing the reason will be passed through. - // Default value is nil which means no callback and it prevents from unwrapping the oldest entry. - // Ignored if OnRemove is specified. - OnRemoveWithReason func(key string, entry []byte, reason RemoveReason) - - onRemoveFilter int - - // Logger is a logging interface and used in combination with `Verbose` - // Defaults to `DefaultLogger()` - Logger Logger -} - -// DefaultConfig initializes config with default values. -// When load for BigCache can be predicted in advance then it is better to use custom config. -func DefaultConfig(eviction time.Duration) Config { - return Config{ - Shards: 1024, - LifeWindow: eviction, - CleanWindow: 0, - MaxEntriesInWindow: 1000 * 10 * 60, - MaxEntrySize: 500, - Verbose: true, - Hasher: newDefaultHasher(), - HardMaxCacheSize: 0, - Logger: DefaultLogger(), - } -} - -// initialShardSize computes initial shard size -func (c Config) initialShardSize() int { - return max(c.MaxEntriesInWindow/c.Shards, minimumEntriesInShard) -} - -// maximumShardSize computes maximum shard size -func (c Config) maximumShardSize() int { - maxShardSize := 0 - - if c.HardMaxCacheSize > 0 { - maxShardSize = convertMBToBytes(c.HardMaxCacheSize) / c.Shards - } - - return maxShardSize -} - -// OnRemoveFilterSet sets which remove reasons will trigger a call to OnRemoveWithReason. -// Filtering out reasons prevents bigcache from unwrapping them, which saves cpu. -func (c Config) OnRemoveFilterSet(reasons ...RemoveReason) Config { - c.onRemoveFilter = 0 - for i := range reasons { - c.onRemoveFilter |= 1 << uint(reasons[i]) - } - - return c -} diff --git a/vendor/github.com/allegro/bigcache/encoding.go b/vendor/github.com/allegro/bigcache/encoding.go deleted file mode 100644 index 4d434e5dce0a..000000000000 --- a/vendor/github.com/allegro/bigcache/encoding.go +++ /dev/null @@ -1,62 +0,0 @@ -package bigcache - -import ( - "encoding/binary" -) - -const ( - timestampSizeInBytes = 8 // Number of bytes used for timestamp - hashSizeInBytes = 8 // Number of bytes used for hash - keySizeInBytes = 2 // Number of bytes used for size of entry key - headersSizeInBytes = timestampSizeInBytes + hashSizeInBytes + keySizeInBytes // Number of bytes used for all headers -) - -func wrapEntry(timestamp uint64, hash uint64, key string, entry []byte, buffer *[]byte) []byte { - keyLength := len(key) - blobLength := len(entry) + headersSizeInBytes + keyLength - - if blobLength > len(*buffer) { - *buffer = make([]byte, blobLength) - } - blob := *buffer - - binary.LittleEndian.PutUint64(blob, timestamp) - binary.LittleEndian.PutUint64(blob[timestampSizeInBytes:], hash) - binary.LittleEndian.PutUint16(blob[timestampSizeInBytes+hashSizeInBytes:], uint16(keyLength)) - copy(blob[headersSizeInBytes:], key) - copy(blob[headersSizeInBytes+keyLength:], entry) - - return blob[:blobLength] -} - -func readEntry(data []byte) []byte { - length := binary.LittleEndian.Uint16(data[timestampSizeInBytes+hashSizeInBytes:]) - - // copy on read - dst := make([]byte, len(data)-int(headersSizeInBytes+length)) - copy(dst, data[headersSizeInBytes+length:]) - - return dst -} - -func readTimestampFromEntry(data []byte) uint64 { - return binary.LittleEndian.Uint64(data) -} - -func readKeyFromEntry(data []byte) string { - length := binary.LittleEndian.Uint16(data[timestampSizeInBytes+hashSizeInBytes:]) - - // copy on read - dst := make([]byte, length) - copy(dst, data[headersSizeInBytes:headersSizeInBytes+length]) - - return bytesToString(dst) -} - -func readHashFromEntry(data []byte) uint64 { - return binary.LittleEndian.Uint64(data[timestampSizeInBytes:]) -} - -func resetKeyFromEntry(data []byte) { - binary.LittleEndian.PutUint64(data[timestampSizeInBytes:], 0) -} diff --git a/vendor/github.com/allegro/bigcache/entry_not_found_error.go b/vendor/github.com/allegro/bigcache/entry_not_found_error.go deleted file mode 100644 index 883bdc29eb8f..000000000000 --- a/vendor/github.com/allegro/bigcache/entry_not_found_error.go +++ /dev/null @@ -1,17 +0,0 @@ -package bigcache - -import "fmt" - -// EntryNotFoundError is an error type struct which is returned when entry was not found for provided key -type EntryNotFoundError struct { - key string -} - -func notFound(key string) error { - return &EntryNotFoundError{key} -} - -// Error returned when entry does not exist. -func (e EntryNotFoundError) Error() string { - return fmt.Sprintf("Entry %q not found", e.key) -} diff --git a/vendor/github.com/allegro/bigcache/fnv.go b/vendor/github.com/allegro/bigcache/fnv.go deleted file mode 100644 index 188c9aa6dcbd..000000000000 --- a/vendor/github.com/allegro/bigcache/fnv.go +++ /dev/null @@ -1,28 +0,0 @@ -package bigcache - -// newDefaultHasher returns a new 64-bit FNV-1a Hasher which makes no memory allocations. -// Its Sum64 method will lay the value out in big-endian byte order. -// See https://en.wikipedia.org/wiki/Fowler–Noll–Vo_hash_function -func newDefaultHasher() Hasher { - return fnv64a{} -} - -type fnv64a struct{} - -const ( - // offset64 FNVa offset basis. See https://en.wikipedia.org/wiki/Fowler–Noll–Vo_hash_function#FNV-1a_hash - offset64 = 14695981039346656037 - // prime64 FNVa prime value. See https://en.wikipedia.org/wiki/Fowler–Noll–Vo_hash_function#FNV-1a_hash - prime64 = 1099511628211 -) - -// Sum64 gets the string and returns its uint64 hash value. -func (f fnv64a) Sum64(key string) uint64 { - var hash uint64 = offset64 - for i := 0; i < len(key); i++ { - hash ^= uint64(key[i]) - hash *= prime64 - } - - return hash -} diff --git a/vendor/github.com/allegro/bigcache/hash.go b/vendor/github.com/allegro/bigcache/hash.go deleted file mode 100644 index 5f8ade774daa..000000000000 --- a/vendor/github.com/allegro/bigcache/hash.go +++ /dev/null @@ -1,8 +0,0 @@ -package bigcache - -// Hasher is responsible for generating unsigned, 64 bit hash of provided string. Hasher should minimize collisions -// (generating same hash for different strings) and while performance is also important fast functions are preferable (i.e. -// you can use FarmHash family). -type Hasher interface { - Sum64(string) uint64 -} diff --git a/vendor/github.com/allegro/bigcache/iterator.go b/vendor/github.com/allegro/bigcache/iterator.go deleted file mode 100644 index 70b98d900435..000000000000 --- a/vendor/github.com/allegro/bigcache/iterator.go +++ /dev/null @@ -1,122 +0,0 @@ -package bigcache - -import "sync" - -type iteratorError string - -func (e iteratorError) Error() string { - return string(e) -} - -// ErrInvalidIteratorState is reported when iterator is in invalid state -const ErrInvalidIteratorState = iteratorError("Iterator is in invalid state. Use SetNext() to move to next position") - -// ErrCannotRetrieveEntry is reported when entry cannot be retrieved from underlying -const ErrCannotRetrieveEntry = iteratorError("Could not retrieve entry from cache") - -var emptyEntryInfo = EntryInfo{} - -// EntryInfo holds informations about entry in the cache -type EntryInfo struct { - timestamp uint64 - hash uint64 - key string - value []byte -} - -// Key returns entry's underlying key -func (e EntryInfo) Key() string { - return e.key -} - -// Hash returns entry's hash value -func (e EntryInfo) Hash() uint64 { - return e.hash -} - -// Timestamp returns entry's timestamp (time of insertion) -func (e EntryInfo) Timestamp() uint64 { - return e.timestamp -} - -// Value returns entry's underlying value -func (e EntryInfo) Value() []byte { - return e.value -} - -// EntryInfoIterator allows to iterate over entries in the cache -type EntryInfoIterator struct { - mutex sync.Mutex - cache *BigCache - currentShard int - currentIndex int - elements []uint32 - elementsCount int - valid bool -} - -// SetNext moves to next element and returns true if it exists. -func (it *EntryInfoIterator) SetNext() bool { - it.mutex.Lock() - - it.valid = false - it.currentIndex++ - - if it.elementsCount > it.currentIndex { - it.valid = true - it.mutex.Unlock() - return true - } - - for i := it.currentShard + 1; i < it.cache.config.Shards; i++ { - it.elements, it.elementsCount = it.cache.shards[i].copyKeys() - - // Non empty shard - stick with it - if it.elementsCount > 0 { - it.currentIndex = 0 - it.currentShard = i - it.valid = true - it.mutex.Unlock() - return true - } - } - it.mutex.Unlock() - return false -} - -func newIterator(cache *BigCache) *EntryInfoIterator { - elements, count := cache.shards[0].copyKeys() - - return &EntryInfoIterator{ - cache: cache, - currentShard: 0, - currentIndex: -1, - elements: elements, - elementsCount: count, - } -} - -// Value returns current value from the iterator -func (it *EntryInfoIterator) Value() (EntryInfo, error) { - it.mutex.Lock() - - if !it.valid { - it.mutex.Unlock() - return emptyEntryInfo, ErrInvalidIteratorState - } - - entry, err := it.cache.shards[it.currentShard].getEntry(int(it.elements[it.currentIndex])) - - if err != nil { - it.mutex.Unlock() - return emptyEntryInfo, ErrCannotRetrieveEntry - } - it.mutex.Unlock() - - return EntryInfo{ - timestamp: readTimestampFromEntry(entry), - hash: readHashFromEntry(entry), - key: readKeyFromEntry(entry), - value: readEntry(entry), - }, nil -} diff --git a/vendor/github.com/allegro/bigcache/logger.go b/vendor/github.com/allegro/bigcache/logger.go deleted file mode 100644 index 50e84abc8006..000000000000 --- a/vendor/github.com/allegro/bigcache/logger.go +++ /dev/null @@ -1,30 +0,0 @@ -package bigcache - -import ( - "log" - "os" -) - -// Logger is invoked when `Config.Verbose=true` -type Logger interface { - Printf(format string, v ...interface{}) -} - -// this is a safeguard, breaking on compile time in case -// `log.Logger` does not adhere to our `Logger` interface. -// see https://golang.org/doc/faq#guarantee_satisfies_interface -var _ Logger = &log.Logger{} - -// DefaultLogger returns a `Logger` implementation -// backed by stdlib's log -func DefaultLogger() *log.Logger { - return log.New(os.Stdout, "", log.LstdFlags) -} - -func newLogger(custom Logger) Logger { - if custom != nil { - return custom - } - - return DefaultLogger() -} diff --git a/vendor/github.com/allegro/bigcache/queue/bytes_queue.go b/vendor/github.com/allegro/bigcache/queue/bytes_queue.go deleted file mode 100644 index 0285c72cd50f..000000000000 --- a/vendor/github.com/allegro/bigcache/queue/bytes_queue.go +++ /dev/null @@ -1,210 +0,0 @@ -package queue - -import ( - "encoding/binary" - "log" - "time" -) - -const ( - // Number of bytes used to keep information about entry size - headerEntrySize = 4 - // Bytes before left margin are not used. Zero index means element does not exist in queue, useful while reading slice from index - leftMarginIndex = 1 - // Minimum empty blob size in bytes. Empty blob fills space between tail and head in additional memory allocation. - // It keeps entries indexes unchanged - minimumEmptyBlobSize = 32 + headerEntrySize -) - -// BytesQueue is a non-thread safe queue type of fifo based on bytes array. -// For every push operation index of entry is returned. It can be used to read the entry later -type BytesQueue struct { - array []byte - capacity int - maxCapacity int - head int - tail int - count int - rightMargin int - headerBuffer []byte - verbose bool - initialCapacity int -} - -type queueError struct { - message string -} - -// NewBytesQueue initialize new bytes queue. -// Initial capacity is used in bytes array allocation -// When verbose flag is set then information about memory allocation are printed -func NewBytesQueue(initialCapacity int, maxCapacity int, verbose bool) *BytesQueue { - return &BytesQueue{ - array: make([]byte, initialCapacity), - capacity: initialCapacity, - maxCapacity: maxCapacity, - headerBuffer: make([]byte, headerEntrySize), - tail: leftMarginIndex, - head: leftMarginIndex, - rightMargin: leftMarginIndex, - verbose: verbose, - initialCapacity: initialCapacity, - } -} - -// Reset removes all entries from queue -func (q *BytesQueue) Reset() { - // Just reset indexes - q.tail = leftMarginIndex - q.head = leftMarginIndex - q.rightMargin = leftMarginIndex - q.count = 0 -} - -// Push copies entry at the end of queue and moves tail pointer. Allocates more space if needed. -// Returns index for pushed data or error if maximum size queue limit is reached. -func (q *BytesQueue) Push(data []byte) (int, error) { - dataLen := len(data) - - if q.availableSpaceAfterTail() < dataLen+headerEntrySize { - if q.availableSpaceBeforeHead() >= dataLen+headerEntrySize { - q.tail = leftMarginIndex - } else if q.capacity+headerEntrySize+dataLen >= q.maxCapacity && q.maxCapacity > 0 { - return -1, &queueError{"Full queue. Maximum size limit reached."} - } else { - q.allocateAdditionalMemory(dataLen + headerEntrySize) - } - } - - index := q.tail - - q.push(data, dataLen) - - return index, nil -} - -func (q *BytesQueue) allocateAdditionalMemory(minimum int) { - start := time.Now() - if q.capacity < minimum { - q.capacity += minimum - } - q.capacity = q.capacity * 2 - if q.capacity > q.maxCapacity && q.maxCapacity > 0 { - q.capacity = q.maxCapacity - } - - oldArray := q.array - q.array = make([]byte, q.capacity) - - if leftMarginIndex != q.rightMargin { - copy(q.array, oldArray[:q.rightMargin]) - - if q.tail < q.head { - emptyBlobLen := q.head - q.tail - headerEntrySize - q.push(make([]byte, emptyBlobLen), emptyBlobLen) - q.head = leftMarginIndex - q.tail = q.rightMargin - } - } - - if q.verbose { - log.Printf("Allocated new queue in %s; Capacity: %d \n", time.Since(start), q.capacity) - } -} - -func (q *BytesQueue) push(data []byte, len int) { - binary.LittleEndian.PutUint32(q.headerBuffer, uint32(len)) - q.copy(q.headerBuffer, headerEntrySize) - - q.copy(data, len) - - if q.tail > q.head { - q.rightMargin = q.tail - } - - q.count++ -} - -func (q *BytesQueue) copy(data []byte, len int) { - q.tail += copy(q.array[q.tail:], data[:len]) -} - -// Pop reads the oldest entry from queue and moves head pointer to the next one -func (q *BytesQueue) Pop() ([]byte, error) { - data, size, err := q.peek(q.head) - if err != nil { - return nil, err - } - - q.head += headerEntrySize + size - q.count-- - - if q.head == q.rightMargin { - q.head = leftMarginIndex - if q.tail == q.rightMargin { - q.tail = leftMarginIndex - } - q.rightMargin = q.tail - } - - return data, nil -} - -// Peek reads the oldest entry from list without moving head pointer -func (q *BytesQueue) Peek() ([]byte, error) { - data, _, err := q.peek(q.head) - return data, err -} - -// Get reads entry from index -func (q *BytesQueue) Get(index int) ([]byte, error) { - data, _, err := q.peek(index) - return data, err -} - -// Capacity returns number of allocated bytes for queue -func (q *BytesQueue) Capacity() int { - return q.capacity -} - -// Len returns number of entries kept in queue -func (q *BytesQueue) Len() int { - return q.count -} - -// Error returns error message -func (e *queueError) Error() string { - return e.message -} - -func (q *BytesQueue) peek(index int) ([]byte, int, error) { - - if q.count == 0 { - return nil, 0, &queueError{"Empty queue"} - } - - if index <= 0 { - return nil, 0, &queueError{"Index must be grater than zero. Invalid index."} - } - - if index+headerEntrySize >= len(q.array) { - return nil, 0, &queueError{"Index out of range"} - } - - blockSize := int(binary.LittleEndian.Uint32(q.array[index : index+headerEntrySize])) - return q.array[index+headerEntrySize : index+headerEntrySize+blockSize], blockSize, nil -} - -func (q *BytesQueue) availableSpaceAfterTail() int { - if q.tail >= q.head { - return q.capacity - q.tail - } - return q.head - q.tail - minimumEmptyBlobSize -} - -func (q *BytesQueue) availableSpaceBeforeHead() int { - if q.tail >= q.head { - return q.head - leftMarginIndex - minimumEmptyBlobSize - } - return q.head - q.tail - minimumEmptyBlobSize -} diff --git a/vendor/github.com/allegro/bigcache/shard.go b/vendor/github.com/allegro/bigcache/shard.go deleted file mode 100644 index 56a9fb089590..000000000000 --- a/vendor/github.com/allegro/bigcache/shard.go +++ /dev/null @@ -1,236 +0,0 @@ -package bigcache - -import ( - "fmt" - "sync" - "sync/atomic" - - "github.com/allegro/bigcache/queue" -) - -type onRemoveCallback func(wrappedEntry []byte, reason RemoveReason) - -type cacheShard struct { - hashmap map[uint64]uint32 - entries queue.BytesQueue - lock sync.RWMutex - entryBuffer []byte - onRemove onRemoveCallback - - isVerbose bool - logger Logger - clock clock - lifeWindow uint64 - - stats Stats -} - -func (s *cacheShard) get(key string, hashedKey uint64) ([]byte, error) { - s.lock.RLock() - itemIndex := s.hashmap[hashedKey] - - if itemIndex == 0 { - s.lock.RUnlock() - s.miss() - return nil, notFound(key) - } - - wrappedEntry, err := s.entries.Get(int(itemIndex)) - if err != nil { - s.lock.RUnlock() - s.miss() - return nil, err - } - if entryKey := readKeyFromEntry(wrappedEntry); key != entryKey { - if s.isVerbose { - s.logger.Printf("Collision detected. Both %q and %q have the same hash %x", key, entryKey, hashedKey) - } - s.lock.RUnlock() - s.collision() - return nil, notFound(key) - } - s.lock.RUnlock() - s.hit() - return readEntry(wrappedEntry), nil -} - -func (s *cacheShard) set(key string, hashedKey uint64, entry []byte) error { - currentTimestamp := uint64(s.clock.epoch()) - - s.lock.Lock() - - if previousIndex := s.hashmap[hashedKey]; previousIndex != 0 { - if previousEntry, err := s.entries.Get(int(previousIndex)); err == nil { - resetKeyFromEntry(previousEntry) - } - } - - if oldestEntry, err := s.entries.Peek(); err == nil { - s.onEvict(oldestEntry, currentTimestamp, s.removeOldestEntry) - } - - w := wrapEntry(currentTimestamp, hashedKey, key, entry, &s.entryBuffer) - - for { - if index, err := s.entries.Push(w); err == nil { - s.hashmap[hashedKey] = uint32(index) - s.lock.Unlock() - return nil - } - if s.removeOldestEntry(NoSpace) != nil { - s.lock.Unlock() - return fmt.Errorf("entry is bigger than max shard size") - } - } -} - -func (s *cacheShard) del(key string, hashedKey uint64) error { - s.lock.RLock() - itemIndex := s.hashmap[hashedKey] - - if itemIndex == 0 { - s.lock.RUnlock() - s.delmiss() - return notFound(key) - } - - wrappedEntry, err := s.entries.Get(int(itemIndex)) - if err != nil { - s.lock.RUnlock() - s.delmiss() - return err - } - s.lock.RUnlock() - - s.lock.Lock() - { - delete(s.hashmap, hashedKey) - s.onRemove(wrappedEntry, Deleted) - resetKeyFromEntry(wrappedEntry) - } - s.lock.Unlock() - - s.delhit() - return nil -} - -func (s *cacheShard) onEvict(oldestEntry []byte, currentTimestamp uint64, evict func(reason RemoveReason) error) bool { - oldestTimestamp := readTimestampFromEntry(oldestEntry) - if currentTimestamp-oldestTimestamp > s.lifeWindow { - evict(Expired) - return true - } - return false -} - -func (s *cacheShard) cleanUp(currentTimestamp uint64) { - s.lock.Lock() - for { - if oldestEntry, err := s.entries.Peek(); err != nil { - break - } else if evicted := s.onEvict(oldestEntry, currentTimestamp, s.removeOldestEntry); !evicted { - break - } - } - s.lock.Unlock() -} - -func (s *cacheShard) getOldestEntry() ([]byte, error) { - return s.entries.Peek() -} - -func (s *cacheShard) getEntry(index int) ([]byte, error) { - return s.entries.Get(index) -} - -func (s *cacheShard) copyKeys() (keys []uint32, next int) { - keys = make([]uint32, len(s.hashmap)) - - s.lock.RLock() - - for _, index := range s.hashmap { - keys[next] = index - next++ - } - - s.lock.RUnlock() - return keys, next -} - -func (s *cacheShard) removeOldestEntry(reason RemoveReason) error { - oldest, err := s.entries.Pop() - if err == nil { - hash := readHashFromEntry(oldest) - delete(s.hashmap, hash) - s.onRemove(oldest, reason) - return nil - } - return err -} - -func (s *cacheShard) reset(config Config) { - s.lock.Lock() - s.hashmap = make(map[uint64]uint32, config.initialShardSize()) - s.entryBuffer = make([]byte, config.MaxEntrySize+headersSizeInBytes) - s.entries.Reset() - s.lock.Unlock() -} - -func (s *cacheShard) len() int { - s.lock.RLock() - res := len(s.hashmap) - s.lock.RUnlock() - return res -} - -func (s *cacheShard) capacity() int { - s.lock.RLock() - res := s.entries.Capacity() - s.lock.RUnlock() - return res -} - -func (s *cacheShard) getStats() Stats { - var stats = Stats{ - Hits: atomic.LoadInt64(&s.stats.Hits), - Misses: atomic.LoadInt64(&s.stats.Misses), - DelHits: atomic.LoadInt64(&s.stats.DelHits), - DelMisses: atomic.LoadInt64(&s.stats.DelMisses), - Collisions: atomic.LoadInt64(&s.stats.Collisions), - } - return stats -} - -func (s *cacheShard) hit() { - atomic.AddInt64(&s.stats.Hits, 1) -} - -func (s *cacheShard) miss() { - atomic.AddInt64(&s.stats.Misses, 1) -} - -func (s *cacheShard) delhit() { - atomic.AddInt64(&s.stats.DelHits, 1) -} - -func (s *cacheShard) delmiss() { - atomic.AddInt64(&s.stats.DelMisses, 1) -} - -func (s *cacheShard) collision() { - atomic.AddInt64(&s.stats.Collisions, 1) -} - -func initNewShard(config Config, callback onRemoveCallback, clock clock) *cacheShard { - return &cacheShard{ - hashmap: make(map[uint64]uint32, config.initialShardSize()), - entries: *queue.NewBytesQueue(config.initialShardSize()*config.MaxEntrySize, config.maximumShardSize(), config.Verbose), - entryBuffer: make([]byte, config.MaxEntrySize+headersSizeInBytes), - onRemove: callback, - - isVerbose: config.Verbose, - logger: newLogger(config.Logger), - clock: clock, - lifeWindow: uint64(config.LifeWindow.Seconds()), - } -} diff --git a/vendor/github.com/allegro/bigcache/stats.go b/vendor/github.com/allegro/bigcache/stats.go deleted file mode 100644 index 07157132a239..000000000000 --- a/vendor/github.com/allegro/bigcache/stats.go +++ /dev/null @@ -1,15 +0,0 @@ -package bigcache - -// Stats stores cache statistics -type Stats struct { - // Hits is a number of successfully found keys - Hits int64 `json:"hits"` - // Misses is a number of not found keys - Misses int64 `json:"misses"` - // DelHits is a number of successfully deleted keys - DelHits int64 `json:"delete_hits"` - // DelMisses is a number of not deleted keys - DelMisses int64 `json:"delete_misses"` - // Collisions is a number of happened key-collisions - Collisions int64 `json:"collisions"` -} diff --git a/vendor/github.com/allegro/bigcache/utils.go b/vendor/github.com/allegro/bigcache/utils.go deleted file mode 100644 index ca1df79b9335..000000000000 --- a/vendor/github.com/allegro/bigcache/utils.go +++ /dev/null @@ -1,16 +0,0 @@ -package bigcache - -func max(a, b int) int { - if a > b { - return a - } - return b -} - -func convertMBToBytes(value int) int { - return value * 1024 * 1024 -} - -func isPowerOfTwo(number int) bool { - return (number & (number - 1)) == 0 -} diff --git a/vendor/github.com/aristanetworks/goarista/.travis.yml b/vendor/github.com/aristanetworks/goarista/.travis.yml deleted file mode 100644 index 1f34efa6b225..000000000000 --- a/vendor/github.com/aristanetworks/goarista/.travis.yml +++ /dev/null @@ -1,16 +0,0 @@ -language: go -go: -- 1.7.3 -- tip -before_install: -- go get -v github.com/golang/lint/golint -- go get -v -t -d ./... -after_success: -- make coverdata -- bash <(curl -s https://codecov.io/bash) -script: -- make -j4 check GOTEST_FLAGS=-v -notifications: - slack: - secure: MO/3LqbyALbi9vAY3pZetp/LfRuKEPAYEUya7XKmTWA3OFHYkTGqJWNosVkFJd6eSKwnc3HP4jlKADEBNVxADHzcA3uMPUQi1mIcNk/Ps1WWMNDv1liE2XOoOmHSHZ/8ksk6TNq83x+d17ZffYq8KAH6iKNKvllO1JzQPgJJdf+cNXQQlg6uPSe+ggMpjqVLkKcHqA4L3/BWo6fNcyvkqaN3uXcEzYPi7Nb2q9tl0ja6ToyZV4H6SinwitZmpedN3RkBcm4fKmGyw5ikzH93ycA5SvWrnXTh1dJvq6DU0FV7iwI6oqPTbAUc3FE5g7aEkK0qVR21s2j+KNaOLnuX10ZGQFwj2r3SW2REHq4j+qqFla/2EmSFZJt3GXYS+plmGCxqCgyjSw6tTi7LaGZ/mWBJEA9/EaXG1NkwlQYx5tdUMeGj77OczjXClynpb2hJ7MM2b32Rnp0JmNaXAh01SmClo+8nDWuksAsIdPtWsbF0/XHmEJiqpu8ojvVXOQIbPt43bjG7PS1t5jaRAU/N1n56SiCGgCSGd3Ui5eX5vmgWdpZMl8NG05G4LFsgmkdphRT5fru0C2PrhNZYRDGWs63XKapBxsvfqGzdHxTtYuaDjHjrI+9w0BC/8kEzSWoPmabQ5ci4wf4DeplcIay4tDMgMSo8pGAf52vrne4rmUo= - on_success: change diff --git a/vendor/github.com/aristanetworks/goarista/AUTHORS b/vendor/github.com/aristanetworks/goarista/AUTHORS deleted file mode 100644 index 5bb93cb3fa6b..000000000000 --- a/vendor/github.com/aristanetworks/goarista/AUTHORS +++ /dev/null @@ -1,25 +0,0 @@ -All contributors are required to sign a "Contributor License Agreement" at - - -The following organizations and people have contributed code to this library. -(Please keep both lists sorted alphabetically.) - - -Arista Networks, Inc. - - -Benoit Sigoure -Fabrice Rabaute - - - -The list of individual contributors for code currently in HEAD can be obtained -at any time with the following script: - -find . -type f \ -| while read i; do \ - git blame -t $i 2>/dev/null; \ - done \ -| sed 's/^[0-9a-f]\{8\} [^(]*(\([^)]*\) [-+0-9 ]\{14,\}).*/\1/;s/ *$//' \ -| awk '{a[$0]++; t++} END{for(n in a) print n}' \ -| sort diff --git a/vendor/github.com/aristanetworks/goarista/COPYING b/vendor/github.com/aristanetworks/goarista/COPYING deleted file mode 100644 index f433b1a53f5b..000000000000 --- a/vendor/github.com/aristanetworks/goarista/COPYING +++ /dev/null @@ -1,177 +0,0 @@ - - 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 diff --git a/vendor/github.com/aristanetworks/goarista/Dockerfile b/vendor/github.com/aristanetworks/goarista/Dockerfile deleted file mode 100644 index 0322e564e163..000000000000 --- a/vendor/github.com/aristanetworks/goarista/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (C) 2016 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the COPYING file. - -# TODO: move this to cmd/ockafka (https://github.com/docker/hub-feedback/issues/292) -FROM golang:1.7.3 - -RUN mkdir -p /go/src/github.com/aristanetworks/goarista/cmd -WORKDIR /go/src/github.com/aristanetworks/goarista -COPY ./ . -RUN go get -d ./cmd/ockafka/... \ - && go install ./cmd/ockafka - -ENTRYPOINT ["/go/bin/ockafka"] diff --git a/vendor/github.com/aristanetworks/goarista/Makefile b/vendor/github.com/aristanetworks/goarista/Makefile deleted file mode 100644 index 4ef2468dd65e..000000000000 --- a/vendor/github.com/aristanetworks/goarista/Makefile +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (C) 2015 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the COPYING file. - -GO := go -TEST_TIMEOUT := 30s -GOTEST_FLAGS := - -DEFAULT_GOPATH := $${GOPATH%%:*} -GOPATH_BIN := $(DEFAULT_GOPATH)/bin -GOPATH_PKG := $(DEFAULT_GOPATH)/pkg -GOLINT := $(GOPATH_BIN)/golint -GOFOLDERS := find . -type d ! -path "./.git/*" - -all: install - -install: - $(GO) install ./... - -check: vet test fmtcheck lint - -COVER_PKGS := key test -COVER_MODE := count -coverdata: - echo 'mode: $(COVER_MODE)' >coverage.out - for dir in $(COVER_PKGS); do \ - $(GO) test -covermode=$(COVER_MODE) -coverprofile=cov.out-t ./$$dir || exit; \ - tail -n +2 cov.out-t >> coverage.out && \ - rm cov.out-t; \ - done; - -coverage: coverdata - $(GO) tool cover -html=coverage.out - rm -f coverage.out - -fmtcheck: - errors=`gofmt -l .`; if test -n "$$errors"; then echo Check these files for style errors:; echo "$$errors"; exit 1; fi - find . -name '*.go' ! -name '*.pb.go' -exec ./check_line_len.awk {} + - -vet: - $(GO) vet ./... - -lint: - lint=`$(GOFOLDERS) | xargs -L 1 $(GOLINT) | fgrep -v .pb.go`; if test -n "$$lint"; then echo "$$lint"; exit 1; fi -# The above is ugly, but unfortunately golint doesn't exit 1 when it finds -# lint. See https://github.com/golang/lint/issues/65 - -test: - $(GO) test $(GOTEST_FLAGS) -timeout=$(TEST_TIMEOUT) ./... - -docker: - docker build -f cmd/occlient/Dockerfile . - -clean: - rm -rf $(GOPATH_PKG)/*/github.com/aristanetworks/goarista - $(GO) clean ./... - -.PHONY: all check coverage coverdata docker fmtcheck install lint test vet diff --git a/vendor/github.com/aristanetworks/goarista/README.md b/vendor/github.com/aristanetworks/goarista/README.md deleted file mode 100644 index 316d711ad212..000000000000 --- a/vendor/github.com/aristanetworks/goarista/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# Arista Go library [![Build Status](https://travis-ci.org/aristanetworks/goarista.svg?branch=master)](https://travis-ci.org/aristanetworks/goarista) [![codecov.io](http://codecov.io/github/aristanetworks/goarista/coverage.svg?branch=master)](http://codecov.io/github/aristanetworks/goarista?branch=master) [![GoDoc](https://godoc.org/github.com/aristanetworks/goarista?status.png)](https://godoc.org/github.com/aristanetworks/goarista) [![Go Report Card](https://goreportcard.com/badge/github.com/aristanetworks/goarista)](https://goreportcard.com/report/github.com/aristanetworks/goarista) - -## areflect - -Helper functions to work with the `reflect` package. Contains -`ForceExport()`, which bypasses the check in `reflect.Value` that -prevents accessing unexported attributes. - -## monotime - -Provides access to a fast monotonic clock source, to fill in the gap in the -[Go standard library, which lacks one](https://github.com/golang/go/issues/12914). -Don't use `time.Now()` in code that needs to time things or otherwise assume -that time passes at a constant rate, instead use `monotime.Now()`. - -## cmd - -See the [cmd](cmd) directory. - -## dscp - -Provides `ListenTCPWithTOS()`, which is a replacement for `net.ListenTCP()` -that allows specifying the ToS (Type of Service), to specify DSCP / ECN / -class of service flags to use for incoming connections. - -## key - -Provides a common type used across various Arista projects, named `key.Key`, -which is used to work around the fact that Go can't let one -use a non-hashable type as a key to a `map`, and we sometimes need to use -a `map[string]interface{}` (or something containing one) as a key to maps. -As a result, we frequently use `map[key.Key]interface{}` instead of just -`map[interface{}]interface{}` when we need a generic key-value collection. - -## lanz -A client for [LANZ](https://eos.arista.com/latency-analyzer-lanz-architectures-and-configuration/) -streaming servers. It connects to a LANZ streaming server, -listens for notifications, decodes them and sends the LANZ protobuf on the -provided channel. - -## monitor - -A library to help expose monitoring metrics on top of the -[`expvar`](https://golang.org/pkg/expvar/) infrastructure. - -## netns - -`netns.Do(namespace, cb)` provides a handy mechanism to execute the given -callback `cb` in the given [network namespace](https://lwn.net/Articles/580893/). - -## pathmap - -A datastructure for mapping keys of type string slice to values. It -allows for some fuzzy matching. - -## test - -This is a [Go](http://golang.org/) library to help in writing unit tests. - -## Examples - -TBD diff --git a/vendor/github.com/aristanetworks/goarista/check_line_len.awk b/vendor/github.com/aristanetworks/goarista/check_line_len.awk deleted file mode 100755 index a9db53550548..000000000000 --- a/vendor/github.com/aristanetworks/goarista/check_line_len.awk +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/awk -f -# Copyright (C) 2015 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the COPYING file. - -BEGIN { - max = 100; -} - -# Expand tabs to 4 spaces. -{ - gsub(/\t/, " "); -} - -length() > max { - errors++; - print FILENAME ":" FNR ": Line too long (" length() "/" max ")"; -} - -END { - if (errors >= 125) { - errors = 125; - } - exit errors; -} diff --git a/vendor/github.com/aristanetworks/goarista/iptables.sh b/vendor/github.com/aristanetworks/goarista/iptables.sh deleted file mode 100755 index f118ff493e2e..000000000000 --- a/vendor/github.com/aristanetworks/goarista/iptables.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -DEFAULT_PORT=6042 - -set -e - -if [ "$#" -lt 1 ] -then - echo "usage: $0 []" - exit 1 -fi - -host=$1 -port=$DEFAULT_PORT -if [ "$#" -gt 1 ] -then - port=$2 -fi -iptables="bash sudo iptables -A INPUT -p tcp --dport $port -j ACCEPT" -ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $host "$iptables" -echo "opened TCP port $port on $host" diff --git a/vendor/github.com/aristanetworks/goarista/monotime/issue15006.s b/vendor/github.com/aristanetworks/goarista/monotime/issue15006.s deleted file mode 100644 index 66109f4f3171..000000000000 --- a/vendor/github.com/aristanetworks/goarista/monotime/issue15006.s +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright (C) 2016 Arista Networks, Inc. -// Use of this source code is governed by the Apache License 2.0 -// that can be found in the COPYING file. - -// This file is intentionally empty. -// It's a workaround for https://github.com/golang/go/issues/15006 diff --git a/vendor/github.com/aristanetworks/goarista/monotime/nanotime.go b/vendor/github.com/aristanetworks/goarista/monotime/nanotime.go deleted file mode 100644 index 5f5fbc7ae566..000000000000 --- a/vendor/github.com/aristanetworks/goarista/monotime/nanotime.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2016 Arista Networks, Inc. -// Use of this source code is governed by the Apache License 2.0 -// that can be found in the COPYING file. - -// Package monotime provides a fast monotonic clock source. -package monotime - -import ( - "time" - _ "unsafe" // required to use //go:linkname -) - -//go:noescape -//go:linkname nanotime runtime.nanotime -func nanotime() int64 - -// Now returns the current time in nanoseconds from a monotonic clock. -// The time returned is based on some arbitrary platform-specific point in the -// past. The time returned is guaranteed to increase monotonically at a -// constant rate, unlike time.Now() from the Go standard library, which may -// slow down, speed up, jump forward or backward, due to NTP activity or leap -// seconds. -func Now() uint64 { - return uint64(nanotime()) -} - -// Since returns the amount of time that has elapsed since t. t should be -// the result of a call to Now() on the same machine. -func Since(t uint64) time.Duration { - return time.Duration(Now() - t) -} diff --git a/vendor/github.com/aristanetworks/goarista/rpmbuild.sh b/vendor/github.com/aristanetworks/goarista/rpmbuild.sh deleted file mode 100755 index 52b691bd9ac5..000000000000 --- a/vendor/github.com/aristanetworks/goarista/rpmbuild.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/sh - -# Copyright (C) 2016 Arista Networks, Inc. -# Use of this source code is governed by the Apache License 2.0 -# that can be found in the COPYING file. - -if [ "$#" -lt 1 ] -then - echo "usage: $0 " - exit 1 -fi -binary=$1 - -if [ -z "$GOPATH" ] || [ -z "$GOOS" ] || [ -z "$GOARCH" ] -then - echo "Please set \$GOPATH, \$GOOS and \$GOARCH" - exit 1 -fi - -set -e - -version=$(git rev-parse --short=7 HEAD) -pwd=$(pwd) -cd $GOPATH/bin -if [ -d $GOOS_$GOARCH ] -then - cd $GOOS_GOARCH -fi -os=$GOOS -arch=$GOARCH -if [ "$arch" == "386" ] -then - arch="i686" -fi -cmd="fpm -n $binary -v $version -s dir -t rpm --rpm-os $os -a $arch --epoch 0 --prefix /usr/bin $binary" -echo $cmd -$cmd -mv $binary-$version-1.$arch.rpm $pwd diff --git a/vendor/github.com/btcsuite/btcd/LICENSE b/vendor/github.com/btcsuite/btcd/LICENSE deleted file mode 100644 index 53ba0c5608dd..000000000000 --- a/vendor/github.com/btcsuite/btcd/LICENSE +++ /dev/null @@ -1,16 +0,0 @@ -ISC License - -Copyright (c) 2013-2017 The btcsuite developers -Copyright (c) 2015-2016 The Decred developers - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/github.com/btcsuite/btcd/btcec/README.md b/vendor/github.com/btcsuite/btcd/btcec/README.md deleted file mode 100644 index 130bd200a007..000000000000 --- a/vendor/github.com/btcsuite/btcd/btcec/README.md +++ /dev/null @@ -1,68 +0,0 @@ -btcec -===== - -[![Build Status](https://travis-ci.org/btcsuite/btcd.png?branch=master)](https://travis-ci.org/btcsuite/btcec) -[![ISC License](http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) -[![GoDoc](https://godoc.org/github.com/btcsuite/btcd/btcec?status.png)](http://godoc.org/github.com/btcsuite/btcd/btcec) - -Package btcec implements elliptic curve cryptography needed for working with -Bitcoin (secp256k1 only for now). It is designed so that it may be used with the -standard crypto/ecdsa packages provided with go. A comprehensive suite of test -is provided to ensure proper functionality. Package btcec was originally based -on work from ThePiachu which is licensed under the same terms as Go, but it has -signficantly diverged since then. The btcsuite developers original is licensed -under the liberal ISC license. - -Although this package was primarily written for btcd, it has intentionally been -designed so it can be used as a standalone package for any projects needing to -use secp256k1 elliptic curve cryptography. - -## Installation and Updating - -```bash -$ go get -u github.com/btcsuite/btcd/btcec -``` - -## Examples - -* [Sign Message](http://godoc.org/github.com/btcsuite/btcd/btcec#example-package--SignMessage) - Demonstrates signing a message with a secp256k1 private key that is first - parsed form raw bytes and serializing the generated signature. - -* [Verify Signature](http://godoc.org/github.com/btcsuite/btcd/btcec#example-package--VerifySignature) - Demonstrates verifying a secp256k1 signature against a public key that is - first parsed from raw bytes. The signature is also parsed from raw bytes. - -* [Encryption](http://godoc.org/github.com/btcsuite/btcd/btcec#example-package--EncryptMessage) - Demonstrates encrypting a message for a public key that is first parsed from - raw bytes, then decrypting it using the corresponding private key. - -* [Decryption](http://godoc.org/github.com/btcsuite/btcd/btcec#example-package--DecryptMessage) - Demonstrates decrypting a message using a private key that is first parsed - from raw bytes. - -## GPG Verification Key - -All official release tags are signed by Conformal so users can ensure the code -has not been tampered with and is coming from the btcsuite developers. To -verify the signature perform the following: - -- Download the public key from the Conformal website at - https://opensource.conformal.com/GIT-GPG-KEY-conformal.txt - -- Import the public key into your GPG keyring: - ```bash - gpg --import GIT-GPG-KEY-conformal.txt - ``` - -- Verify the release tag with the following command where `TAG_NAME` is a - placeholder for the specific tag: - ```bash - git tag -v TAG_NAME - ``` - -## License - -Package btcec is licensed under the [copyfree](http://copyfree.org) ISC License -except for btcec.go and btcec_test.go which is under the same license as Go. - diff --git a/vendor/github.com/btcsuite/btcd/btcec/btcec.go b/vendor/github.com/btcsuite/btcd/btcec/btcec.go deleted file mode 100644 index 5e7ce875fde7..000000000000 --- a/vendor/github.com/btcsuite/btcd/btcec/btcec.go +++ /dev/null @@ -1,958 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Copyright 2011 ThePiachu. All rights reserved. -// Copyright 2013-2014 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package btcec - -// References: -// [SECG]: Recommended Elliptic Curve Domain Parameters -// http://www.secg.org/sec2-v2.pdf -// -// [GECC]: Guide to Elliptic Curve Cryptography (Hankerson, Menezes, Vanstone) - -// This package operates, internally, on Jacobian coordinates. For a given -// (x, y) position on the curve, the Jacobian coordinates are (x1, y1, z1) -// where x = x1/z1² and y = y1/z1³. The greatest speedups come when the whole -// calculation can be performed within the transform (as in ScalarMult and -// ScalarBaseMult). But even for Add and Double, it's faster to apply and -// reverse the transform than to operate in affine coordinates. - -import ( - "crypto/elliptic" - "math/big" - "sync" -) - -var ( - // fieldOne is simply the integer 1 in field representation. It is - // used to avoid needing to create it multiple times during the internal - // arithmetic. - fieldOne = new(fieldVal).SetInt(1) -) - -// KoblitzCurve supports a koblitz curve implementation that fits the ECC Curve -// interface from crypto/elliptic. -type KoblitzCurve struct { - *elliptic.CurveParams - q *big.Int - H int // cofactor of the curve. - halfOrder *big.Int // half the order N - - // byteSize is simply the bit size / 8 and is provided for convenience - // since it is calculated repeatedly. - byteSize int - - // bytePoints - bytePoints *[32][256][3]fieldVal - - // The next 6 values are used specifically for endomorphism - // optimizations in ScalarMult. - - // lambda must fulfill lambda^3 = 1 mod N where N is the order of G. - lambda *big.Int - - // beta must fulfill beta^3 = 1 mod P where P is the prime field of the - // curve. - beta *fieldVal - - // See the EndomorphismVectors in gensecp256k1.go to see how these are - // derived. - a1 *big.Int - b1 *big.Int - a2 *big.Int - b2 *big.Int -} - -// Params returns the parameters for the curve. -func (curve *KoblitzCurve) Params() *elliptic.CurveParams { - return curve.CurveParams -} - -// bigAffineToField takes an affine point (x, y) as big integers and converts -// it to an affine point as field values. -func (curve *KoblitzCurve) bigAffineToField(x, y *big.Int) (*fieldVal, *fieldVal) { - x3, y3 := new(fieldVal), new(fieldVal) - x3.SetByteSlice(x.Bytes()) - y3.SetByteSlice(y.Bytes()) - - return x3, y3 -} - -// fieldJacobianToBigAffine takes a Jacobian point (x, y, z) as field values and -// converts it to an affine point as big integers. -func (curve *KoblitzCurve) fieldJacobianToBigAffine(x, y, z *fieldVal) (*big.Int, *big.Int) { - // Inversions are expensive and both point addition and point doubling - // are faster when working with points that have a z value of one. So, - // if the point needs to be converted to affine, go ahead and normalize - // the point itself at the same time as the calculation is the same. - var zInv, tempZ fieldVal - zInv.Set(z).Inverse() // zInv = Z^-1 - tempZ.SquareVal(&zInv) // tempZ = Z^-2 - x.Mul(&tempZ) // X = X/Z^2 (mag: 1) - y.Mul(tempZ.Mul(&zInv)) // Y = Y/Z^3 (mag: 1) - z.SetInt(1) // Z = 1 (mag: 1) - - // Normalize the x and y values. - x.Normalize() - y.Normalize() - - // Convert the field values for the now affine point to big.Ints. - x3, y3 := new(big.Int), new(big.Int) - x3.SetBytes(x.Bytes()[:]) - y3.SetBytes(y.Bytes()[:]) - return x3, y3 -} - -// IsOnCurve returns boolean if the point (x,y) is on the curve. -// Part of the elliptic.Curve interface. This function differs from the -// crypto/elliptic algorithm since a = 0 not -3. -func (curve *KoblitzCurve) IsOnCurve(x, y *big.Int) bool { - // Convert big ints to field values for faster arithmetic. - fx, fy := curve.bigAffineToField(x, y) - - // Elliptic curve equation for secp256k1 is: y^2 = x^3 + 7 - y2 := new(fieldVal).SquareVal(fy).Normalize() - result := new(fieldVal).SquareVal(fx).Mul(fx).AddInt(7).Normalize() - return y2.Equals(result) -} - -// addZ1AndZ2EqualsOne adds two Jacobian points that are already known to have -// z values of 1 and stores the result in (x3, y3, z3). That is to say -// (x1, y1, 1) + (x2, y2, 1) = (x3, y3, z3). It performs faster addition than -// the generic add routine since less arithmetic is needed due to the ability to -// avoid the z value multiplications. -func (curve *KoblitzCurve) addZ1AndZ2EqualsOne(x1, y1, z1, x2, y2, x3, y3, z3 *fieldVal) { - // To compute the point addition efficiently, this implementation splits - // the equation into intermediate elements which are used to minimize - // the number of field multiplications using the method shown at: - // http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-mmadd-2007-bl - // - // In particular it performs the calculations using the following: - // H = X2-X1, HH = H^2, I = 4*HH, J = H*I, r = 2*(Y2-Y1), V = X1*I - // X3 = r^2-J-2*V, Y3 = r*(V-X3)-2*Y1*J, Z3 = 2*H - // - // This results in a cost of 4 field multiplications, 2 field squarings, - // 6 field additions, and 5 integer multiplications. - - // When the x coordinates are the same for two points on the curve, the - // y coordinates either must be the same, in which case it is point - // doubling, or they are opposite and the result is the point at - // infinity per the group law for elliptic curve cryptography. - x1.Normalize() - y1.Normalize() - x2.Normalize() - y2.Normalize() - if x1.Equals(x2) { - if y1.Equals(y2) { - // Since x1 == x2 and y1 == y2, point doubling must be - // done, otherwise the addition would end up dividing - // by zero. - curve.doubleJacobian(x1, y1, z1, x3, y3, z3) - return - } - - // Since x1 == x2 and y1 == -y2, the sum is the point at - // infinity per the group law. - x3.SetInt(0) - y3.SetInt(0) - z3.SetInt(0) - return - } - - // Calculate X3, Y3, and Z3 according to the intermediate elements - // breakdown above. - var h, i, j, r, v fieldVal - var negJ, neg2V, negX3 fieldVal - h.Set(x1).Negate(1).Add(x2) // H = X2-X1 (mag: 3) - i.SquareVal(&h).MulInt(4) // I = 4*H^2 (mag: 4) - j.Mul2(&h, &i) // J = H*I (mag: 1) - r.Set(y1).Negate(1).Add(y2).MulInt(2) // r = 2*(Y2-Y1) (mag: 6) - v.Mul2(x1, &i) // V = X1*I (mag: 1) - negJ.Set(&j).Negate(1) // negJ = -J (mag: 2) - neg2V.Set(&v).MulInt(2).Negate(2) // neg2V = -(2*V) (mag: 3) - x3.Set(&r).Square().Add(&negJ).Add(&neg2V) // X3 = r^2-J-2*V (mag: 6) - negX3.Set(x3).Negate(6) // negX3 = -X3 (mag: 7) - j.Mul(y1).MulInt(2).Negate(2) // J = -(2*Y1*J) (mag: 3) - y3.Set(&v).Add(&negX3).Mul(&r).Add(&j) // Y3 = r*(V-X3)-2*Y1*J (mag: 4) - z3.Set(&h).MulInt(2) // Z3 = 2*H (mag: 6) - - // Normalize the resulting field values to a magnitude of 1 as needed. - x3.Normalize() - y3.Normalize() - z3.Normalize() -} - -// addZ1EqualsZ2 adds two Jacobian points that are already known to have the -// same z value and stores the result in (x3, y3, z3). That is to say -// (x1, y1, z1) + (x2, y2, z1) = (x3, y3, z3). It performs faster addition than -// the generic add routine since less arithmetic is needed due to the known -// equivalence. -func (curve *KoblitzCurve) addZ1EqualsZ2(x1, y1, z1, x2, y2, x3, y3, z3 *fieldVal) { - // To compute the point addition efficiently, this implementation splits - // the equation into intermediate elements which are used to minimize - // the number of field multiplications using a slightly modified version - // of the method shown at: - // http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-mmadd-2007-bl - // - // In particular it performs the calculations using the following: - // A = X2-X1, B = A^2, C=Y2-Y1, D = C^2, E = X1*B, F = X2*B - // X3 = D-E-F, Y3 = C*(E-X3)-Y1*(F-E), Z3 = Z1*A - // - // This results in a cost of 5 field multiplications, 2 field squarings, - // 9 field additions, and 0 integer multiplications. - - // When the x coordinates are the same for two points on the curve, the - // y coordinates either must be the same, in which case it is point - // doubling, or they are opposite and the result is the point at - // infinity per the group law for elliptic curve cryptography. - x1.Normalize() - y1.Normalize() - x2.Normalize() - y2.Normalize() - if x1.Equals(x2) { - if y1.Equals(y2) { - // Since x1 == x2 and y1 == y2, point doubling must be - // done, otherwise the addition would end up dividing - // by zero. - curve.doubleJacobian(x1, y1, z1, x3, y3, z3) - return - } - - // Since x1 == x2 and y1 == -y2, the sum is the point at - // infinity per the group law. - x3.SetInt(0) - y3.SetInt(0) - z3.SetInt(0) - return - } - - // Calculate X3, Y3, and Z3 according to the intermediate elements - // breakdown above. - var a, b, c, d, e, f fieldVal - var negX1, negY1, negE, negX3 fieldVal - negX1.Set(x1).Negate(1) // negX1 = -X1 (mag: 2) - negY1.Set(y1).Negate(1) // negY1 = -Y1 (mag: 2) - a.Set(&negX1).Add(x2) // A = X2-X1 (mag: 3) - b.SquareVal(&a) // B = A^2 (mag: 1) - c.Set(&negY1).Add(y2) // C = Y2-Y1 (mag: 3) - d.SquareVal(&c) // D = C^2 (mag: 1) - e.Mul2(x1, &b) // E = X1*B (mag: 1) - negE.Set(&e).Negate(1) // negE = -E (mag: 2) - f.Mul2(x2, &b) // F = X2*B (mag: 1) - x3.Add2(&e, &f).Negate(3).Add(&d) // X3 = D-E-F (mag: 5) - negX3.Set(x3).Negate(5).Normalize() // negX3 = -X3 (mag: 1) - y3.Set(y1).Mul(f.Add(&negE)).Negate(3) // Y3 = -(Y1*(F-E)) (mag: 4) - y3.Add(e.Add(&negX3).Mul(&c)) // Y3 = C*(E-X3)+Y3 (mag: 5) - z3.Mul2(z1, &a) // Z3 = Z1*A (mag: 1) - - // Normalize the resulting field values to a magnitude of 1 as needed. - x3.Normalize() - y3.Normalize() -} - -// addZ2EqualsOne adds two Jacobian points when the second point is already -// known to have a z value of 1 (and the z value for the first point is not 1) -// and stores the result in (x3, y3, z3). That is to say (x1, y1, z1) + -// (x2, y2, 1) = (x3, y3, z3). It performs faster addition than the generic -// add routine since less arithmetic is needed due to the ability to avoid -// multiplications by the second point's z value. -func (curve *KoblitzCurve) addZ2EqualsOne(x1, y1, z1, x2, y2, x3, y3, z3 *fieldVal) { - // To compute the point addition efficiently, this implementation splits - // the equation into intermediate elements which are used to minimize - // the number of field multiplications using the method shown at: - // http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-madd-2007-bl - // - // In particular it performs the calculations using the following: - // Z1Z1 = Z1^2, U2 = X2*Z1Z1, S2 = Y2*Z1*Z1Z1, H = U2-X1, HH = H^2, - // I = 4*HH, J = H*I, r = 2*(S2-Y1), V = X1*I - // X3 = r^2-J-2*V, Y3 = r*(V-X3)-2*Y1*J, Z3 = (Z1+H)^2-Z1Z1-HH - // - // This results in a cost of 7 field multiplications, 4 field squarings, - // 9 field additions, and 4 integer multiplications. - - // When the x coordinates are the same for two points on the curve, the - // y coordinates either must be the same, in which case it is point - // doubling, or they are opposite and the result is the point at - // infinity per the group law for elliptic curve cryptography. Since - // any number of Jacobian coordinates can represent the same affine - // point, the x and y values need to be converted to like terms. Due to - // the assumption made for this function that the second point has a z - // value of 1 (z2=1), the first point is already "converted". - var z1z1, u2, s2 fieldVal - x1.Normalize() - y1.Normalize() - z1z1.SquareVal(z1) // Z1Z1 = Z1^2 (mag: 1) - u2.Set(x2).Mul(&z1z1).Normalize() // U2 = X2*Z1Z1 (mag: 1) - s2.Set(y2).Mul(&z1z1).Mul(z1).Normalize() // S2 = Y2*Z1*Z1Z1 (mag: 1) - if x1.Equals(&u2) { - if y1.Equals(&s2) { - // Since x1 == x2 and y1 == y2, point doubling must be - // done, otherwise the addition would end up dividing - // by zero. - curve.doubleJacobian(x1, y1, z1, x3, y3, z3) - return - } - - // Since x1 == x2 and y1 == -y2, the sum is the point at - // infinity per the group law. - x3.SetInt(0) - y3.SetInt(0) - z3.SetInt(0) - return - } - - // Calculate X3, Y3, and Z3 according to the intermediate elements - // breakdown above. - var h, hh, i, j, r, rr, v fieldVal - var negX1, negY1, negX3 fieldVal - negX1.Set(x1).Negate(1) // negX1 = -X1 (mag: 2) - h.Add2(&u2, &negX1) // H = U2-X1 (mag: 3) - hh.SquareVal(&h) // HH = H^2 (mag: 1) - i.Set(&hh).MulInt(4) // I = 4 * HH (mag: 4) - j.Mul2(&h, &i) // J = H*I (mag: 1) - negY1.Set(y1).Negate(1) // negY1 = -Y1 (mag: 2) - r.Set(&s2).Add(&negY1).MulInt(2) // r = 2*(S2-Y1) (mag: 6) - rr.SquareVal(&r) // rr = r^2 (mag: 1) - v.Mul2(x1, &i) // V = X1*I (mag: 1) - x3.Set(&v).MulInt(2).Add(&j).Negate(3) // X3 = -(J+2*V) (mag: 4) - x3.Add(&rr) // X3 = r^2+X3 (mag: 5) - negX3.Set(x3).Negate(5) // negX3 = -X3 (mag: 6) - y3.Set(y1).Mul(&j).MulInt(2).Negate(2) // Y3 = -(2*Y1*J) (mag: 3) - y3.Add(v.Add(&negX3).Mul(&r)) // Y3 = r*(V-X3)+Y3 (mag: 4) - z3.Add2(z1, &h).Square() // Z3 = (Z1+H)^2 (mag: 1) - z3.Add(z1z1.Add(&hh).Negate(2)) // Z3 = Z3-(Z1Z1+HH) (mag: 4) - - // Normalize the resulting field values to a magnitude of 1 as needed. - x3.Normalize() - y3.Normalize() - z3.Normalize() -} - -// addGeneric adds two Jacobian points (x1, y1, z1) and (x2, y2, z2) without any -// assumptions about the z values of the two points and stores the result in -// (x3, y3, z3). That is to say (x1, y1, z1) + (x2, y2, z2) = (x3, y3, z3). It -// is the slowest of the add routines due to requiring the most arithmetic. -func (curve *KoblitzCurve) addGeneric(x1, y1, z1, x2, y2, z2, x3, y3, z3 *fieldVal) { - // To compute the point addition efficiently, this implementation splits - // the equation into intermediate elements which are used to minimize - // the number of field multiplications using the method shown at: - // http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#addition-add-2007-bl - // - // In particular it performs the calculations using the following: - // Z1Z1 = Z1^2, Z2Z2 = Z2^2, U1 = X1*Z2Z2, U2 = X2*Z1Z1, S1 = Y1*Z2*Z2Z2 - // S2 = Y2*Z1*Z1Z1, H = U2-U1, I = (2*H)^2, J = H*I, r = 2*(S2-S1) - // V = U1*I - // X3 = r^2-J-2*V, Y3 = r*(V-X3)-2*S1*J, Z3 = ((Z1+Z2)^2-Z1Z1-Z2Z2)*H - // - // This results in a cost of 11 field multiplications, 5 field squarings, - // 9 field additions, and 4 integer multiplications. - - // When the x coordinates are the same for two points on the curve, the - // y coordinates either must be the same, in which case it is point - // doubling, or they are opposite and the result is the point at - // infinity. Since any number of Jacobian coordinates can represent the - // same affine point, the x and y values need to be converted to like - // terms. - var z1z1, z2z2, u1, u2, s1, s2 fieldVal - z1z1.SquareVal(z1) // Z1Z1 = Z1^2 (mag: 1) - z2z2.SquareVal(z2) // Z2Z2 = Z2^2 (mag: 1) - u1.Set(x1).Mul(&z2z2).Normalize() // U1 = X1*Z2Z2 (mag: 1) - u2.Set(x2).Mul(&z1z1).Normalize() // U2 = X2*Z1Z1 (mag: 1) - s1.Set(y1).Mul(&z2z2).Mul(z2).Normalize() // S1 = Y1*Z2*Z2Z2 (mag: 1) - s2.Set(y2).Mul(&z1z1).Mul(z1).Normalize() // S2 = Y2*Z1*Z1Z1 (mag: 1) - if u1.Equals(&u2) { - if s1.Equals(&s2) { - // Since x1 == x2 and y1 == y2, point doubling must be - // done, otherwise the addition would end up dividing - // by zero. - curve.doubleJacobian(x1, y1, z1, x3, y3, z3) - return - } - - // Since x1 == x2 and y1 == -y2, the sum is the point at - // infinity per the group law. - x3.SetInt(0) - y3.SetInt(0) - z3.SetInt(0) - return - } - - // Calculate X3, Y3, and Z3 according to the intermediate elements - // breakdown above. - var h, i, j, r, rr, v fieldVal - var negU1, negS1, negX3 fieldVal - negU1.Set(&u1).Negate(1) // negU1 = -U1 (mag: 2) - h.Add2(&u2, &negU1) // H = U2-U1 (mag: 3) - i.Set(&h).MulInt(2).Square() // I = (2*H)^2 (mag: 2) - j.Mul2(&h, &i) // J = H*I (mag: 1) - negS1.Set(&s1).Negate(1) // negS1 = -S1 (mag: 2) - r.Set(&s2).Add(&negS1).MulInt(2) // r = 2*(S2-S1) (mag: 6) - rr.SquareVal(&r) // rr = r^2 (mag: 1) - v.Mul2(&u1, &i) // V = U1*I (mag: 1) - x3.Set(&v).MulInt(2).Add(&j).Negate(3) // X3 = -(J+2*V) (mag: 4) - x3.Add(&rr) // X3 = r^2+X3 (mag: 5) - negX3.Set(x3).Negate(5) // negX3 = -X3 (mag: 6) - y3.Mul2(&s1, &j).MulInt(2).Negate(2) // Y3 = -(2*S1*J) (mag: 3) - y3.Add(v.Add(&negX3).Mul(&r)) // Y3 = r*(V-X3)+Y3 (mag: 4) - z3.Add2(z1, z2).Square() // Z3 = (Z1+Z2)^2 (mag: 1) - z3.Add(z1z1.Add(&z2z2).Negate(2)) // Z3 = Z3-(Z1Z1+Z2Z2) (mag: 4) - z3.Mul(&h) // Z3 = Z3*H (mag: 1) - - // Normalize the resulting field values to a magnitude of 1 as needed. - x3.Normalize() - y3.Normalize() -} - -// addJacobian adds the passed Jacobian points (x1, y1, z1) and (x2, y2, z2) -// together and stores the result in (x3, y3, z3). -func (curve *KoblitzCurve) addJacobian(x1, y1, z1, x2, y2, z2, x3, y3, z3 *fieldVal) { - // A point at infinity is the identity according to the group law for - // elliptic curve cryptography. Thus, ∞ + P = P and P + ∞ = P. - if (x1.IsZero() && y1.IsZero()) || z1.IsZero() { - x3.Set(x2) - y3.Set(y2) - z3.Set(z2) - return - } - if (x2.IsZero() && y2.IsZero()) || z2.IsZero() { - x3.Set(x1) - y3.Set(y1) - z3.Set(z1) - return - } - - // Faster point addition can be achieved when certain assumptions are - // met. For example, when both points have the same z value, arithmetic - // on the z values can be avoided. This section thus checks for these - // conditions and calls an appropriate add function which is accelerated - // by using those assumptions. - z1.Normalize() - z2.Normalize() - isZ1One := z1.Equals(fieldOne) - isZ2One := z2.Equals(fieldOne) - switch { - case isZ1One && isZ2One: - curve.addZ1AndZ2EqualsOne(x1, y1, z1, x2, y2, x3, y3, z3) - return - case z1.Equals(z2): - curve.addZ1EqualsZ2(x1, y1, z1, x2, y2, x3, y3, z3) - return - case isZ2One: - curve.addZ2EqualsOne(x1, y1, z1, x2, y2, x3, y3, z3) - return - } - - // None of the above assumptions are true, so fall back to generic - // point addition. - curve.addGeneric(x1, y1, z1, x2, y2, z2, x3, y3, z3) -} - -// Add returns the sum of (x1,y1) and (x2,y2). Part of the elliptic.Curve -// interface. -func (curve *KoblitzCurve) Add(x1, y1, x2, y2 *big.Int) (*big.Int, *big.Int) { - // A point at infinity is the identity according to the group law for - // elliptic curve cryptography. Thus, ∞ + P = P and P + ∞ = P. - if x1.Sign() == 0 && y1.Sign() == 0 { - return x2, y2 - } - if x2.Sign() == 0 && y2.Sign() == 0 { - return x1, y1 - } - - // Convert the affine coordinates from big integers to field values - // and do the point addition in Jacobian projective space. - fx1, fy1 := curve.bigAffineToField(x1, y1) - fx2, fy2 := curve.bigAffineToField(x2, y2) - fx3, fy3, fz3 := new(fieldVal), new(fieldVal), new(fieldVal) - fOne := new(fieldVal).SetInt(1) - curve.addJacobian(fx1, fy1, fOne, fx2, fy2, fOne, fx3, fy3, fz3) - - // Convert the Jacobian coordinate field values back to affine big - // integers. - return curve.fieldJacobianToBigAffine(fx3, fy3, fz3) -} - -// doubleZ1EqualsOne performs point doubling on the passed Jacobian point -// when the point is already known to have a z value of 1 and stores -// the result in (x3, y3, z3). That is to say (x3, y3, z3) = 2*(x1, y1, 1). It -// performs faster point doubling than the generic routine since less arithmetic -// is needed due to the ability to avoid multiplication by the z value. -func (curve *KoblitzCurve) doubleZ1EqualsOne(x1, y1, x3, y3, z3 *fieldVal) { - // This function uses the assumptions that z1 is 1, thus the point - // doubling formulas reduce to: - // - // X3 = (3*X1^2)^2 - 8*X1*Y1^2 - // Y3 = (3*X1^2)*(4*X1*Y1^2 - X3) - 8*Y1^4 - // Z3 = 2*Y1 - // - // To compute the above efficiently, this implementation splits the - // equation into intermediate elements which are used to minimize the - // number of field multiplications in favor of field squarings which - // are roughly 35% faster than field multiplications with the current - // implementation at the time this was written. - // - // This uses a slightly modified version of the method shown at: - // http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-mdbl-2007-bl - // - // In particular it performs the calculations using the following: - // A = X1^2, B = Y1^2, C = B^2, D = 2*((X1+B)^2-A-C) - // E = 3*A, F = E^2, X3 = F-2*D, Y3 = E*(D-X3)-8*C - // Z3 = 2*Y1 - // - // This results in a cost of 1 field multiplication, 5 field squarings, - // 6 field additions, and 5 integer multiplications. - var a, b, c, d, e, f fieldVal - z3.Set(y1).MulInt(2) // Z3 = 2*Y1 (mag: 2) - a.SquareVal(x1) // A = X1^2 (mag: 1) - b.SquareVal(y1) // B = Y1^2 (mag: 1) - c.SquareVal(&b) // C = B^2 (mag: 1) - b.Add(x1).Square() // B = (X1+B)^2 (mag: 1) - d.Set(&a).Add(&c).Negate(2) // D = -(A+C) (mag: 3) - d.Add(&b).MulInt(2) // D = 2*(B+D)(mag: 8) - e.Set(&a).MulInt(3) // E = 3*A (mag: 3) - f.SquareVal(&e) // F = E^2 (mag: 1) - x3.Set(&d).MulInt(2).Negate(16) // X3 = -(2*D) (mag: 17) - x3.Add(&f) // X3 = F+X3 (mag: 18) - f.Set(x3).Negate(18).Add(&d).Normalize() // F = D-X3 (mag: 1) - y3.Set(&c).MulInt(8).Negate(8) // Y3 = -(8*C) (mag: 9) - y3.Add(f.Mul(&e)) // Y3 = E*F+Y3 (mag: 10) - - // Normalize the field values back to a magnitude of 1. - x3.Normalize() - y3.Normalize() - z3.Normalize() -} - -// doubleGeneric performs point doubling on the passed Jacobian point without -// any assumptions about the z value and stores the result in (x3, y3, z3). -// That is to say (x3, y3, z3) = 2*(x1, y1, z1). It is the slowest of the point -// doubling routines due to requiring the most arithmetic. -func (curve *KoblitzCurve) doubleGeneric(x1, y1, z1, x3, y3, z3 *fieldVal) { - // Point doubling formula for Jacobian coordinates for the secp256k1 - // curve: - // X3 = (3*X1^2)^2 - 8*X1*Y1^2 - // Y3 = (3*X1^2)*(4*X1*Y1^2 - X3) - 8*Y1^4 - // Z3 = 2*Y1*Z1 - // - // To compute the above efficiently, this implementation splits the - // equation into intermediate elements which are used to minimize the - // number of field multiplications in favor of field squarings which - // are roughly 35% faster than field multiplications with the current - // implementation at the time this was written. - // - // This uses a slightly modified version of the method shown at: - // http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l - // - // In particular it performs the calculations using the following: - // A = X1^2, B = Y1^2, C = B^2, D = 2*((X1+B)^2-A-C) - // E = 3*A, F = E^2, X3 = F-2*D, Y3 = E*(D-X3)-8*C - // Z3 = 2*Y1*Z1 - // - // This results in a cost of 1 field multiplication, 5 field squarings, - // 6 field additions, and 5 integer multiplications. - var a, b, c, d, e, f fieldVal - z3.Mul2(y1, z1).MulInt(2) // Z3 = 2*Y1*Z1 (mag: 2) - a.SquareVal(x1) // A = X1^2 (mag: 1) - b.SquareVal(y1) // B = Y1^2 (mag: 1) - c.SquareVal(&b) // C = B^2 (mag: 1) - b.Add(x1).Square() // B = (X1+B)^2 (mag: 1) - d.Set(&a).Add(&c).Negate(2) // D = -(A+C) (mag: 3) - d.Add(&b).MulInt(2) // D = 2*(B+D)(mag: 8) - e.Set(&a).MulInt(3) // E = 3*A (mag: 3) - f.SquareVal(&e) // F = E^2 (mag: 1) - x3.Set(&d).MulInt(2).Negate(16) // X3 = -(2*D) (mag: 17) - x3.Add(&f) // X3 = F+X3 (mag: 18) - f.Set(x3).Negate(18).Add(&d).Normalize() // F = D-X3 (mag: 1) - y3.Set(&c).MulInt(8).Negate(8) // Y3 = -(8*C) (mag: 9) - y3.Add(f.Mul(&e)) // Y3 = E*F+Y3 (mag: 10) - - // Normalize the field values back to a magnitude of 1. - x3.Normalize() - y3.Normalize() - z3.Normalize() -} - -// doubleJacobian doubles the passed Jacobian point (x1, y1, z1) and stores the -// result in (x3, y3, z3). -func (curve *KoblitzCurve) doubleJacobian(x1, y1, z1, x3, y3, z3 *fieldVal) { - // Doubling a point at infinity is still infinity. - if y1.IsZero() || z1.IsZero() { - x3.SetInt(0) - y3.SetInt(0) - z3.SetInt(0) - return - } - - // Slightly faster point doubling can be achieved when the z value is 1 - // by avoiding the multiplication on the z value. This section calls - // a point doubling function which is accelerated by using that - // assumption when possible. - if z1.Normalize().Equals(fieldOne) { - curve.doubleZ1EqualsOne(x1, y1, x3, y3, z3) - return - } - - // Fall back to generic point doubling which works with arbitrary z - // values. - curve.doubleGeneric(x1, y1, z1, x3, y3, z3) -} - -// Double returns 2*(x1,y1). Part of the elliptic.Curve interface. -func (curve *KoblitzCurve) Double(x1, y1 *big.Int) (*big.Int, *big.Int) { - if y1.Sign() == 0 { - return new(big.Int), new(big.Int) - } - - // Convert the affine coordinates from big integers to field values - // and do the point doubling in Jacobian projective space. - fx1, fy1 := curve.bigAffineToField(x1, y1) - fx3, fy3, fz3 := new(fieldVal), new(fieldVal), new(fieldVal) - fOne := new(fieldVal).SetInt(1) - curve.doubleJacobian(fx1, fy1, fOne, fx3, fy3, fz3) - - // Convert the Jacobian coordinate field values back to affine big - // integers. - return curve.fieldJacobianToBigAffine(fx3, fy3, fz3) -} - -// splitK returns a balanced length-two representation of k and their signs. -// This is algorithm 3.74 from [GECC]. -// -// One thing of note about this algorithm is that no matter what c1 and c2 are, -// the final equation of k = k1 + k2 * lambda (mod n) will hold. This is -// provable mathematically due to how a1/b1/a2/b2 are computed. -// -// c1 and c2 are chosen to minimize the max(k1,k2). -func (curve *KoblitzCurve) splitK(k []byte) ([]byte, []byte, int, int) { - // All math here is done with big.Int, which is slow. - // At some point, it might be useful to write something similar to - // fieldVal but for N instead of P as the prime field if this ends up - // being a bottleneck. - bigIntK := new(big.Int) - c1, c2 := new(big.Int), new(big.Int) - tmp1, tmp2 := new(big.Int), new(big.Int) - k1, k2 := new(big.Int), new(big.Int) - - bigIntK.SetBytes(k) - // c1 = round(b2 * k / n) from step 4. - // Rounding isn't really necessary and costs too much, hence skipped - c1.Mul(curve.b2, bigIntK) - c1.Div(c1, curve.N) - // c2 = round(b1 * k / n) from step 4 (sign reversed to optimize one step) - // Rounding isn't really necessary and costs too much, hence skipped - c2.Mul(curve.b1, bigIntK) - c2.Div(c2, curve.N) - // k1 = k - c1 * a1 - c2 * a2 from step 5 (note c2's sign is reversed) - tmp1.Mul(c1, curve.a1) - tmp2.Mul(c2, curve.a2) - k1.Sub(bigIntK, tmp1) - k1.Add(k1, tmp2) - // k2 = - c1 * b1 - c2 * b2 from step 5 (note c2's sign is reversed) - tmp1.Mul(c1, curve.b1) - tmp2.Mul(c2, curve.b2) - k2.Sub(tmp2, tmp1) - - // Note Bytes() throws out the sign of k1 and k2. This matters - // since k1 and/or k2 can be negative. Hence, we pass that - // back separately. - return k1.Bytes(), k2.Bytes(), k1.Sign(), k2.Sign() -} - -// moduloReduce reduces k from more than 32 bytes to 32 bytes and under. This -// is done by doing a simple modulo curve.N. We can do this since G^N = 1 and -// thus any other valid point on the elliptic curve has the same order. -func (curve *KoblitzCurve) moduloReduce(k []byte) []byte { - // Since the order of G is curve.N, we can use a much smaller number - // by doing modulo curve.N - if len(k) > curve.byteSize { - // Reduce k by performing modulo curve.N. - tmpK := new(big.Int).SetBytes(k) - tmpK.Mod(tmpK, curve.N) - return tmpK.Bytes() - } - - return k -} - -// NAF takes a positive integer k and returns the Non-Adjacent Form (NAF) as two -// byte slices. The first is where 1s will be. The second is where -1s will -// be. NAF is convenient in that on average, only 1/3rd of its values are -// non-zero. This is algorithm 3.30 from [GECC]. -// -// Essentially, this makes it possible to minimize the number of operations -// since the resulting ints returned will be at least 50% 0s. -func NAF(k []byte) ([]byte, []byte) { - // The essence of this algorithm is that whenever we have consecutive 1s - // in the binary, we want to put a -1 in the lowest bit and get a bunch - // of 0s up to the highest bit of consecutive 1s. This is due to this - // identity: - // 2^n + 2^(n-1) + 2^(n-2) + ... + 2^(n-k) = 2^(n+1) - 2^(n-k) - // - // The algorithm thus may need to go 1 more bit than the length of the - // bits we actually have, hence bits being 1 bit longer than was - // necessary. Since we need to know whether adding will cause a carry, - // we go from right-to-left in this addition. - var carry, curIsOne, nextIsOne bool - // these default to zero - retPos := make([]byte, len(k)+1) - retNeg := make([]byte, len(k)+1) - for i := len(k) - 1; i >= 0; i-- { - curByte := k[i] - for j := uint(0); j < 8; j++ { - curIsOne = curByte&1 == 1 - if j == 7 { - if i == 0 { - nextIsOne = false - } else { - nextIsOne = k[i-1]&1 == 1 - } - } else { - nextIsOne = curByte&2 == 2 - } - if carry { - if curIsOne { - // This bit is 1, so continue to carry - // and don't need to do anything. - } else { - // We've hit a 0 after some number of - // 1s. - if nextIsOne { - // Start carrying again since - // a new sequence of 1s is - // starting. - retNeg[i+1] += 1 << j - } else { - // Stop carrying since 1s have - // stopped. - carry = false - retPos[i+1] += 1 << j - } - } - } else if curIsOne { - if nextIsOne { - // If this is the start of at least 2 - // consecutive 1s, set the current one - // to -1 and start carrying. - retNeg[i+1] += 1 << j - carry = true - } else { - // This is a singleton, not consecutive - // 1s. - retPos[i+1] += 1 << j - } - } - curByte >>= 1 - } - } - if carry { - retPos[0] = 1 - return retPos, retNeg - } - return retPos[1:], retNeg[1:] -} - -// ScalarMult returns k*(Bx, By) where k is a big endian integer. -// Part of the elliptic.Curve interface. -func (curve *KoblitzCurve) ScalarMult(Bx, By *big.Int, k []byte) (*big.Int, *big.Int) { - // Point Q = ∞ (point at infinity). - qx, qy, qz := new(fieldVal), new(fieldVal), new(fieldVal) - - // Decompose K into k1 and k2 in order to halve the number of EC ops. - // See Algorithm 3.74 in [GECC]. - k1, k2, signK1, signK2 := curve.splitK(curve.moduloReduce(k)) - - // The main equation here to remember is: - // k * P = k1 * P + k2 * ϕ(P) - // - // P1 below is P in the equation, P2 below is ϕ(P) in the equation - p1x, p1y := curve.bigAffineToField(Bx, By) - p1yNeg := new(fieldVal).NegateVal(p1y, 1) - p1z := new(fieldVal).SetInt(1) - - // NOTE: ϕ(x,y) = (βx,y). The Jacobian z coordinate is 1, so this math - // goes through. - p2x := new(fieldVal).Mul2(p1x, curve.beta) - p2y := new(fieldVal).Set(p1y) - p2yNeg := new(fieldVal).NegateVal(p2y, 1) - p2z := new(fieldVal).SetInt(1) - - // Flip the positive and negative values of the points as needed - // depending on the signs of k1 and k2. As mentioned in the equation - // above, each of k1 and k2 are multiplied by the respective point. - // Since -k * P is the same thing as k * -P, and the group law for - // elliptic curves states that P(x, y) = -P(x, -y), it's faster and - // simplifies the code to just make the point negative. - if signK1 == -1 { - p1y, p1yNeg = p1yNeg, p1y - } - if signK2 == -1 { - p2y, p2yNeg = p2yNeg, p2y - } - - // NAF versions of k1 and k2 should have a lot more zeros. - // - // The Pos version of the bytes contain the +1s and the Neg versions - // contain the -1s. - k1PosNAF, k1NegNAF := NAF(k1) - k2PosNAF, k2NegNAF := NAF(k2) - k1Len := len(k1PosNAF) - k2Len := len(k2PosNAF) - - m := k1Len - if m < k2Len { - m = k2Len - } - - // Add left-to-right using the NAF optimization. See algorithm 3.77 - // from [GECC]. This should be faster overall since there will be a lot - // more instances of 0, hence reducing the number of Jacobian additions - // at the cost of 1 possible extra doubling. - var k1BytePos, k1ByteNeg, k2BytePos, k2ByteNeg byte - for i := 0; i < m; i++ { - // Since we're going left-to-right, pad the front with 0s. - if i < m-k1Len { - k1BytePos = 0 - k1ByteNeg = 0 - } else { - k1BytePos = k1PosNAF[i-(m-k1Len)] - k1ByteNeg = k1NegNAF[i-(m-k1Len)] - } - if i < m-k2Len { - k2BytePos = 0 - k2ByteNeg = 0 - } else { - k2BytePos = k2PosNAF[i-(m-k2Len)] - k2ByteNeg = k2NegNAF[i-(m-k2Len)] - } - - for j := 7; j >= 0; j-- { - // Q = 2 * Q - curve.doubleJacobian(qx, qy, qz, qx, qy, qz) - - if k1BytePos&0x80 == 0x80 { - curve.addJacobian(qx, qy, qz, p1x, p1y, p1z, - qx, qy, qz) - } else if k1ByteNeg&0x80 == 0x80 { - curve.addJacobian(qx, qy, qz, p1x, p1yNeg, p1z, - qx, qy, qz) - } - - if k2BytePos&0x80 == 0x80 { - curve.addJacobian(qx, qy, qz, p2x, p2y, p2z, - qx, qy, qz) - } else if k2ByteNeg&0x80 == 0x80 { - curve.addJacobian(qx, qy, qz, p2x, p2yNeg, p2z, - qx, qy, qz) - } - k1BytePos <<= 1 - k1ByteNeg <<= 1 - k2BytePos <<= 1 - k2ByteNeg <<= 1 - } - } - - // Convert the Jacobian coordinate field values back to affine big.Ints. - return curve.fieldJacobianToBigAffine(qx, qy, qz) -} - -// ScalarBaseMult returns k*G where G is the base point of the group and k is a -// big endian integer. -// Part of the elliptic.Curve interface. -func (curve *KoblitzCurve) ScalarBaseMult(k []byte) (*big.Int, *big.Int) { - newK := curve.moduloReduce(k) - diff := len(curve.bytePoints) - len(newK) - - // Point Q = ∞ (point at infinity). - qx, qy, qz := new(fieldVal), new(fieldVal), new(fieldVal) - - // curve.bytePoints has all 256 byte points for each 8-bit window. The - // strategy is to add up the byte points. This is best understood by - // expressing k in base-256 which it already sort of is. - // Each "digit" in the 8-bit window can be looked up using bytePoints - // and added together. - for i, byteVal := range newK { - p := curve.bytePoints[diff+i][byteVal] - curve.addJacobian(qx, qy, qz, &p[0], &p[1], &p[2], qx, qy, qz) - } - return curve.fieldJacobianToBigAffine(qx, qy, qz) -} - -// QPlus1Div4 returns the Q+1/4 constant for the curve for use in calculating -// square roots via exponention. -func (curve *KoblitzCurve) QPlus1Div4() *big.Int { - return curve.q -} - -var initonce sync.Once -var secp256k1 KoblitzCurve - -func initAll() { - initS256() -} - -// fromHex converts the passed hex string into a big integer pointer and will -// panic is there is an error. This is only provided for the hard-coded -// constants so errors in the source code can bet detected. It will only (and -// must only) be called for initialization purposes. -func fromHex(s string) *big.Int { - r, ok := new(big.Int).SetString(s, 16) - if !ok { - panic("invalid hex in source file: " + s) - } - return r -} - -func initS256() { - // Curve parameters taken from [SECG] section 2.4.1. - secp256k1.CurveParams = new(elliptic.CurveParams) - secp256k1.P = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F") - secp256k1.N = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141") - secp256k1.B = fromHex("0000000000000000000000000000000000000000000000000000000000000007") - secp256k1.Gx = fromHex("79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798") - secp256k1.Gy = fromHex("483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8") - secp256k1.BitSize = 256 - secp256k1.q = new(big.Int).Div(new(big.Int).Add(secp256k1.P, - big.NewInt(1)), big.NewInt(4)) - secp256k1.H = 1 - secp256k1.halfOrder = new(big.Int).Rsh(secp256k1.N, 1) - - // Provided for convenience since this gets computed repeatedly. - secp256k1.byteSize = secp256k1.BitSize / 8 - - // Deserialize and set the pre-computed table used to accelerate scalar - // base multiplication. This is hard-coded data, so any errors are - // panics because it means something is wrong in the source code. - if err := loadS256BytePoints(); err != nil { - panic(err) - } - - // Next 6 constants are from Hal Finney's bitcointalk.org post: - // https://bitcointalk.org/index.php?topic=3238.msg45565#msg45565 - // May he rest in peace. - // - // They have also been independently derived from the code in the - // EndomorphismVectors function in gensecp256k1.go. - secp256k1.lambda = fromHex("5363AD4CC05C30E0A5261C028812645A122E22EA20816678DF02967C1B23BD72") - secp256k1.beta = new(fieldVal).SetHex("7AE96A2B657C07106E64479EAC3434E99CF0497512F58995C1396C28719501EE") - secp256k1.a1 = fromHex("3086D221A7D46BCDE86C90E49284EB15") - secp256k1.b1 = fromHex("-E4437ED6010E88286F547FA90ABFE4C3") - secp256k1.a2 = fromHex("114CA50F7A8E2F3F657C1108D9D44CFD8") - secp256k1.b2 = fromHex("3086D221A7D46BCDE86C90E49284EB15") - - // Alternatively, we can use the parameters below, however, they seem - // to be about 8% slower. - // secp256k1.lambda = fromHex("AC9C52B33FA3CF1F5AD9E3FD77ED9BA4A880B9FC8EC739C2E0CFC810B51283CE") - // secp256k1.beta = new(fieldVal).SetHex("851695D49A83F8EF919BB86153CBCB16630FB68AED0A766A3EC693D68E6AFA40") - // secp256k1.a1 = fromHex("E4437ED6010E88286F547FA90ABFE4C3") - // secp256k1.b1 = fromHex("-3086D221A7D46BCDE86C90E49284EB15") - // secp256k1.a2 = fromHex("3086D221A7D46BCDE86C90E49284EB15") - // secp256k1.b2 = fromHex("114CA50F7A8E2F3F657C1108D9D44CFD8") -} - -// S256 returns a Curve which implements secp256k1. -func S256() *KoblitzCurve { - initonce.Do(initAll) - return &secp256k1 -} diff --git a/vendor/github.com/btcsuite/btcd/btcec/ciphering.go b/vendor/github.com/btcsuite/btcd/btcec/ciphering.go deleted file mode 100644 index b18c9b7a306c..000000000000 --- a/vendor/github.com/btcsuite/btcd/btcec/ciphering.go +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright (c) 2015-2016 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package btcec - -import ( - "bytes" - "crypto/aes" - "crypto/cipher" - "crypto/hmac" - "crypto/rand" - "crypto/sha256" - "crypto/sha512" - "errors" - "io" -) - -var ( - // ErrInvalidMAC occurs when Message Authentication Check (MAC) fails - // during decryption. This happens because of either invalid private key or - // corrupt ciphertext. - ErrInvalidMAC = errors.New("invalid mac hash") - - // errInputTooShort occurs when the input ciphertext to the Decrypt - // function is less than 134 bytes long. - errInputTooShort = errors.New("ciphertext too short") - - // errUnsupportedCurve occurs when the first two bytes of the encrypted - // text aren't 0x02CA (= 712 = secp256k1, from OpenSSL). - errUnsupportedCurve = errors.New("unsupported curve") - - errInvalidXLength = errors.New("invalid X length, must be 32") - errInvalidYLength = errors.New("invalid Y length, must be 32") - errInvalidPadding = errors.New("invalid PKCS#7 padding") - - // 0x02CA = 714 - ciphCurveBytes = [2]byte{0x02, 0xCA} - // 0x20 = 32 - ciphCoordLength = [2]byte{0x00, 0x20} -) - -// GenerateSharedSecret generates a shared secret based on a private key and a -// public key using Diffie-Hellman key exchange (ECDH) (RFC 4753). -// RFC5903 Section 9 states we should only return x. -func GenerateSharedSecret(privkey *PrivateKey, pubkey *PublicKey) []byte { - x, _ := pubkey.Curve.ScalarMult(pubkey.X, pubkey.Y, privkey.D.Bytes()) - return x.Bytes() -} - -// Encrypt encrypts data for the target public key using AES-256-CBC. It also -// generates a private key (the pubkey of which is also in the output). The only -// supported curve is secp256k1. The `structure' that it encodes everything into -// is: -// -// struct { -// // Initialization Vector used for AES-256-CBC -// IV [16]byte -// // Public Key: curve(2) + len_of_pubkeyX(2) + pubkeyX + -// // len_of_pubkeyY(2) + pubkeyY (curve = 714) -// PublicKey [70]byte -// // Cipher text -// Data []byte -// // HMAC-SHA-256 Message Authentication Code -// HMAC [32]byte -// } -// -// The primary aim is to ensure byte compatibility with Pyelliptic. Also, refer -// to section 5.8.1 of ANSI X9.63 for rationale on this format. -func Encrypt(pubkey *PublicKey, in []byte) ([]byte, error) { - ephemeral, err := NewPrivateKey(S256()) - if err != nil { - return nil, err - } - ecdhKey := GenerateSharedSecret(ephemeral, pubkey) - derivedKey := sha512.Sum512(ecdhKey) - keyE := derivedKey[:32] - keyM := derivedKey[32:] - - paddedIn := addPKCSPadding(in) - // IV + Curve params/X/Y + padded plaintext/ciphertext + HMAC-256 - out := make([]byte, aes.BlockSize+70+len(paddedIn)+sha256.Size) - iv := out[:aes.BlockSize] - if _, err = io.ReadFull(rand.Reader, iv); err != nil { - return nil, err - } - // start writing public key - pb := ephemeral.PubKey().SerializeUncompressed() - offset := aes.BlockSize - - // curve and X length - copy(out[offset:offset+4], append(ciphCurveBytes[:], ciphCoordLength[:]...)) - offset += 4 - // X - copy(out[offset:offset+32], pb[1:33]) - offset += 32 - // Y length - copy(out[offset:offset+2], ciphCoordLength[:]) - offset += 2 - // Y - copy(out[offset:offset+32], pb[33:]) - offset += 32 - - // start encryption - block, err := aes.NewCipher(keyE) - if err != nil { - return nil, err - } - mode := cipher.NewCBCEncrypter(block, iv) - mode.CryptBlocks(out[offset:len(out)-sha256.Size], paddedIn) - - // start HMAC-SHA-256 - hm := hmac.New(sha256.New, keyM) - hm.Write(out[:len(out)-sha256.Size]) // everything is hashed - copy(out[len(out)-sha256.Size:], hm.Sum(nil)) // write checksum - - return out, nil -} - -// Decrypt decrypts data that was encrypted using the Encrypt function. -func Decrypt(priv *PrivateKey, in []byte) ([]byte, error) { - // IV + Curve params/X/Y + 1 block + HMAC-256 - if len(in) < aes.BlockSize+70+aes.BlockSize+sha256.Size { - return nil, errInputTooShort - } - - // read iv - iv := in[:aes.BlockSize] - offset := aes.BlockSize - - // start reading pubkey - if !bytes.Equal(in[offset:offset+2], ciphCurveBytes[:]) { - return nil, errUnsupportedCurve - } - offset += 2 - - if !bytes.Equal(in[offset:offset+2], ciphCoordLength[:]) { - return nil, errInvalidXLength - } - offset += 2 - - xBytes := in[offset : offset+32] - offset += 32 - - if !bytes.Equal(in[offset:offset+2], ciphCoordLength[:]) { - return nil, errInvalidYLength - } - offset += 2 - - yBytes := in[offset : offset+32] - offset += 32 - - pb := make([]byte, 65) - pb[0] = byte(0x04) // uncompressed - copy(pb[1:33], xBytes) - copy(pb[33:], yBytes) - // check if (X, Y) lies on the curve and create a Pubkey if it does - pubkey, err := ParsePubKey(pb, S256()) - if err != nil { - return nil, err - } - - // check for cipher text length - if (len(in)-aes.BlockSize-offset-sha256.Size)%aes.BlockSize != 0 { - return nil, errInvalidPadding // not padded to 16 bytes - } - - // read hmac - messageMAC := in[len(in)-sha256.Size:] - - // generate shared secret - ecdhKey := GenerateSharedSecret(priv, pubkey) - derivedKey := sha512.Sum512(ecdhKey) - keyE := derivedKey[:32] - keyM := derivedKey[32:] - - // verify mac - hm := hmac.New(sha256.New, keyM) - hm.Write(in[:len(in)-sha256.Size]) // everything is hashed - expectedMAC := hm.Sum(nil) - if !hmac.Equal(messageMAC, expectedMAC) { - return nil, ErrInvalidMAC - } - - // start decryption - block, err := aes.NewCipher(keyE) - if err != nil { - return nil, err - } - mode := cipher.NewCBCDecrypter(block, iv) - // same length as ciphertext - plaintext := make([]byte, len(in)-offset-sha256.Size) - mode.CryptBlocks(plaintext, in[offset:len(in)-sha256.Size]) - - return removePKCSPadding(plaintext) -} - -// Implement PKCS#7 padding with block size of 16 (AES block size). - -// addPKCSPadding adds padding to a block of data -func addPKCSPadding(src []byte) []byte { - padding := aes.BlockSize - len(src)%aes.BlockSize - padtext := bytes.Repeat([]byte{byte(padding)}, padding) - return append(src, padtext...) -} - -// removePKCSPadding removes padding from data that was added with addPKCSPadding -func removePKCSPadding(src []byte) ([]byte, error) { - length := len(src) - padLength := int(src[length-1]) - if padLength > aes.BlockSize || length < aes.BlockSize { - return nil, errInvalidPadding - } - - return src[:length-padLength], nil -} diff --git a/vendor/github.com/btcsuite/btcd/btcec/doc.go b/vendor/github.com/btcsuite/btcd/btcec/doc.go deleted file mode 100644 index fa8346ab0f91..000000000000 --- a/vendor/github.com/btcsuite/btcd/btcec/doc.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) 2013-2014 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -/* -Package btcec implements support for the elliptic curves needed for bitcoin. - -Bitcoin uses elliptic curve cryptography using koblitz curves -(specifically secp256k1) for cryptographic functions. See -http://www.secg.org/collateral/sec2_final.pdf for details on the -standard. - -This package provides the data structures and functions implementing the -crypto/elliptic Curve interface in order to permit using these curves -with the standard crypto/ecdsa package provided with go. Helper -functionality is provided to parse signatures and public keys from -standard formats. It was designed for use with btcd, but should be -general enough for other uses of elliptic curve crypto. It was originally based -on some initial work by ThePiachu, but has significantly diverged since then. -*/ -package btcec diff --git a/vendor/github.com/btcsuite/btcd/btcec/field.go b/vendor/github.com/btcsuite/btcd/btcec/field.go deleted file mode 100644 index 0f2be74c0c2c..000000000000 --- a/vendor/github.com/btcsuite/btcd/btcec/field.go +++ /dev/null @@ -1,1223 +0,0 @@ -// Copyright (c) 2013-2016 The btcsuite developers -// Copyright (c) 2013-2016 Dave Collins -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package btcec - -// References: -// [HAC]: Handbook of Applied Cryptography Menezes, van Oorschot, Vanstone. -// http://cacr.uwaterloo.ca/hac/ - -// All elliptic curve operations for secp256k1 are done in a finite field -// characterized by a 256-bit prime. Given this precision is larger than the -// biggest available native type, obviously some form of bignum math is needed. -// This package implements specialized fixed-precision field arithmetic rather -// than relying on an arbitrary-precision arithmetic package such as math/big -// for dealing with the field math since the size is known. As a result, rather -// large performance gains are achieved by taking advantage of many -// optimizations not available to arbitrary-precision arithmetic and generic -// modular arithmetic algorithms. -// -// There are various ways to internally represent each finite field element. -// For example, the most obvious representation would be to use an array of 4 -// uint64s (64 bits * 4 = 256 bits). However, that representation suffers from -// a couple of issues. First, there is no native Go type large enough to handle -// the intermediate results while adding or multiplying two 64-bit numbers, and -// second there is no space left for overflows when performing the intermediate -// arithmetic between each array element which would lead to expensive carry -// propagation. -// -// Given the above, this implementation represents the the field elements as -// 10 uint32s with each word (array entry) treated as base 2^26. This was -// chosen for the following reasons: -// 1) Most systems at the current time are 64-bit (or at least have 64-bit -// registers available for specialized purposes such as MMX) so the -// intermediate results can typically be done using a native register (and -// using uint64s to avoid the need for additional half-word arithmetic) -// 2) In order to allow addition of the internal words without having to -// propagate the the carry, the max normalized value for each register must -// be less than the number of bits available in the register -// 3) Since we're dealing with 32-bit values, 64-bits of overflow is a -// reasonable choice for #2 -// 4) Given the need for 256-bits of precision and the properties stated in #1, -// #2, and #3, the representation which best accommodates this is 10 uint32s -// with base 2^26 (26 bits * 10 = 260 bits, so the final word only needs 22 -// bits) which leaves the desired 64 bits (32 * 10 = 320, 320 - 256 = 64) for -// overflow -// -// Since it is so important that the field arithmetic is extremely fast for -// high performance crypto, this package does not perform any validation where -// it ordinarily would. For example, some functions only give the correct -// result is the field is normalized and there is no checking to ensure it is. -// While I typically prefer to ensure all state and input is valid for most -// packages, this code is really only used internally and every extra check -// counts. - -import ( - "encoding/hex" -) - -// Constants used to make the code more readable. -const ( - twoBitsMask = 0x3 - fourBitsMask = 0xf - sixBitsMask = 0x3f - eightBitsMask = 0xff -) - -// Constants related to the field representation. -const ( - // fieldWords is the number of words used to internally represent the - // 256-bit value. - fieldWords = 10 - - // fieldBase is the exponent used to form the numeric base of each word. - // 2^(fieldBase*i) where i is the word position. - fieldBase = 26 - - // fieldOverflowBits is the minimum number of "overflow" bits for each - // word in the field value. - fieldOverflowBits = 32 - fieldBase - - // fieldBaseMask is the mask for the bits in each word needed to - // represent the numeric base of each word (except the most significant - // word). - fieldBaseMask = (1 << fieldBase) - 1 - - // fieldMSBBits is the number of bits in the most significant word used - // to represent the value. - fieldMSBBits = 256 - (fieldBase * (fieldWords - 1)) - - // fieldMSBMask is the mask for the bits in the most significant word - // needed to represent the value. - fieldMSBMask = (1 << fieldMSBBits) - 1 - - // fieldPrimeWordZero is word zero of the secp256k1 prime in the - // internal field representation. It is used during negation. - fieldPrimeWordZero = 0x3fffc2f - - // fieldPrimeWordOne is word one of the secp256k1 prime in the - // internal field representation. It is used during negation. - fieldPrimeWordOne = 0x3ffffbf -) - -// fieldVal implements optimized fixed-precision arithmetic over the -// secp256k1 finite field. This means all arithmetic is performed modulo -// 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f. It -// represents each 256-bit value as 10 32-bit integers in base 2^26. This -// provides 6 bits of overflow in each word (10 bits in the most significant -// word) for a total of 64 bits of overflow (9*6 + 10 = 64). It only implements -// the arithmetic needed for elliptic curve operations. -// -// The following depicts the internal representation: -// ----------------------------------------------------------------- -// | n[9] | n[8] | ... | n[0] | -// | 32 bits available | 32 bits available | ... | 32 bits available | -// | 22 bits for value | 26 bits for value | ... | 26 bits for value | -// | 10 bits overflow | 6 bits overflow | ... | 6 bits overflow | -// | Mult: 2^(26*9) | Mult: 2^(26*8) | ... | Mult: 2^(26*0) | -// ----------------------------------------------------------------- -// -// For example, consider the number 2^49 + 1. It would be represented as: -// n[0] = 1 -// n[1] = 2^23 -// n[2..9] = 0 -// -// The full 256-bit value is then calculated by looping i from 9..0 and -// doing sum(n[i] * 2^(26i)) like so: -// n[9] * 2^(26*9) = 0 * 2^234 = 0 -// n[8] * 2^(26*8) = 0 * 2^208 = 0 -// ... -// n[1] * 2^(26*1) = 2^23 * 2^26 = 2^49 -// n[0] * 2^(26*0) = 1 * 2^0 = 1 -// Sum: 0 + 0 + ... + 2^49 + 1 = 2^49 + 1 -type fieldVal struct { - n [10]uint32 -} - -// String returns the field value as a human-readable hex string. -func (f fieldVal) String() string { - t := new(fieldVal).Set(&f).Normalize() - return hex.EncodeToString(t.Bytes()[:]) -} - -// Zero sets the field value to zero. A newly created field value is already -// set to zero. This function can be useful to clear an existing field value -// for reuse. -func (f *fieldVal) Zero() { - f.n[0] = 0 - f.n[1] = 0 - f.n[2] = 0 - f.n[3] = 0 - f.n[4] = 0 - f.n[5] = 0 - f.n[6] = 0 - f.n[7] = 0 - f.n[8] = 0 - f.n[9] = 0 -} - -// Set sets the field value equal to the passed value. -// -// The field value is returned to support chaining. This enables syntax like: -// f := new(fieldVal).Set(f2).Add(1) so that f = f2 + 1 where f2 is not -// modified. -func (f *fieldVal) Set(val *fieldVal) *fieldVal { - *f = *val - return f -} - -// SetInt sets the field value to the passed integer. This is a convenience -// function since it is fairly common to perform some arithemetic with small -// native integers. -// -// The field value is returned to support chaining. This enables syntax such -// as f := new(fieldVal).SetInt(2).Mul(f2) so that f = 2 * f2. -func (f *fieldVal) SetInt(ui uint) *fieldVal { - f.Zero() - f.n[0] = uint32(ui) - return f -} - -// SetBytes packs the passed 32-byte big-endian value into the internal field -// value representation. -// -// The field value is returned to support chaining. This enables syntax like: -// f := new(fieldVal).SetBytes(byteArray).Mul(f2) so that f = ba * f2. -func (f *fieldVal) SetBytes(b *[32]byte) *fieldVal { - // Pack the 256 total bits across the 10 uint32 words with a max of - // 26-bits per word. This could be done with a couple of for loops, - // but this unrolled version is significantly faster. Benchmarks show - // this is about 34 times faster than the variant which uses loops. - f.n[0] = uint32(b[31]) | uint32(b[30])<<8 | uint32(b[29])<<16 | - (uint32(b[28])&twoBitsMask)<<24 - f.n[1] = uint32(b[28])>>2 | uint32(b[27])<<6 | uint32(b[26])<<14 | - (uint32(b[25])&fourBitsMask)<<22 - f.n[2] = uint32(b[25])>>4 | uint32(b[24])<<4 | uint32(b[23])<<12 | - (uint32(b[22])&sixBitsMask)<<20 - f.n[3] = uint32(b[22])>>6 | uint32(b[21])<<2 | uint32(b[20])<<10 | - uint32(b[19])<<18 - f.n[4] = uint32(b[18]) | uint32(b[17])<<8 | uint32(b[16])<<16 | - (uint32(b[15])&twoBitsMask)<<24 - f.n[5] = uint32(b[15])>>2 | uint32(b[14])<<6 | uint32(b[13])<<14 | - (uint32(b[12])&fourBitsMask)<<22 - f.n[6] = uint32(b[12])>>4 | uint32(b[11])<<4 | uint32(b[10])<<12 | - (uint32(b[9])&sixBitsMask)<<20 - f.n[7] = uint32(b[9])>>6 | uint32(b[8])<<2 | uint32(b[7])<<10 | - uint32(b[6])<<18 - f.n[8] = uint32(b[5]) | uint32(b[4])<<8 | uint32(b[3])<<16 | - (uint32(b[2])&twoBitsMask)<<24 - f.n[9] = uint32(b[2])>>2 | uint32(b[1])<<6 | uint32(b[0])<<14 - return f -} - -// SetByteSlice packs the passed big-endian value into the internal field value -// representation. Only the first 32-bytes are used. As a result, it is up to -// the caller to ensure numbers of the appropriate size are used or the value -// will be truncated. -// -// The field value is returned to support chaining. This enables syntax like: -// f := new(fieldVal).SetByteSlice(byteSlice) -func (f *fieldVal) SetByteSlice(b []byte) *fieldVal { - var b32 [32]byte - for i := 0; i < len(b); i++ { - if i < 32 { - b32[i+(32-len(b))] = b[i] - } - } - return f.SetBytes(&b32) -} - -// SetHex decodes the passed big-endian hex string into the internal field value -// representation. Only the first 32-bytes are used. -// -// The field value is returned to support chaining. This enables syntax like: -// f := new(fieldVal).SetHex("0abc").Add(1) so that f = 0x0abc + 1 -func (f *fieldVal) SetHex(hexString string) *fieldVal { - if len(hexString)%2 != 0 { - hexString = "0" + hexString - } - bytes, _ := hex.DecodeString(hexString) - return f.SetByteSlice(bytes) -} - -// Normalize normalizes the internal field words into the desired range and -// performs fast modular reduction over the secp256k1 prime by making use of the -// special form of the prime. -func (f *fieldVal) Normalize() *fieldVal { - // The field representation leaves 6 bits of overflow in each word so - // intermediate calculations can be performed without needing to - // propagate the carry to each higher word during the calculations. In - // order to normalize, we need to "compact" the full 256-bit value to - // the right while propagating any carries through to the high order - // word. - // - // Since this field is doing arithmetic modulo the secp256k1 prime, we - // also need to perform modular reduction over the prime. - // - // Per [HAC] section 14.3.4: Reduction method of moduli of special form, - // when the modulus is of the special form m = b^t - c, highly efficient - // reduction can be achieved. - // - // The secp256k1 prime is equivalent to 2^256 - 4294968273, so it fits - // this criteria. - // - // 4294968273 in field representation (base 2^26) is: - // n[0] = 977 - // n[1] = 64 - // That is to say (2^26 * 64) + 977 = 4294968273 - // - // The algorithm presented in the referenced section typically repeats - // until the quotient is zero. However, due to our field representation - // we already know to within one reduction how many times we would need - // to repeat as it's the uppermost bits of the high order word. Thus we - // can simply multiply the magnitude by the field representation of the - // prime and do a single iteration. After this step there might be an - // additional carry to bit 256 (bit 22 of the high order word). - t9 := f.n[9] - m := t9 >> fieldMSBBits - t9 = t9 & fieldMSBMask - t0 := f.n[0] + m*977 - t1 := (t0 >> fieldBase) + f.n[1] + (m << 6) - t0 = t0 & fieldBaseMask - t2 := (t1 >> fieldBase) + f.n[2] - t1 = t1 & fieldBaseMask - t3 := (t2 >> fieldBase) + f.n[3] - t2 = t2 & fieldBaseMask - t4 := (t3 >> fieldBase) + f.n[4] - t3 = t3 & fieldBaseMask - t5 := (t4 >> fieldBase) + f.n[5] - t4 = t4 & fieldBaseMask - t6 := (t5 >> fieldBase) + f.n[6] - t5 = t5 & fieldBaseMask - t7 := (t6 >> fieldBase) + f.n[7] - t6 = t6 & fieldBaseMask - t8 := (t7 >> fieldBase) + f.n[8] - t7 = t7 & fieldBaseMask - t9 = (t8 >> fieldBase) + t9 - t8 = t8 & fieldBaseMask - - // At this point, the magnitude is guaranteed to be one, however, the - // value could still be greater than the prime if there was either a - // carry through to bit 256 (bit 22 of the higher order word) or the - // value is greater than or equal to the field characteristic. The - // following determines if either or these conditions are true and does - // the final reduction in constant time. - // - // Note that the if/else statements here intentionally do the bitwise - // operators even when it won't change the value to ensure constant time - // between the branches. Also note that 'm' will be zero when neither - // of the aforementioned conditions are true and the value will not be - // changed when 'm' is zero. - m = 1 - if t9 == fieldMSBMask { - m &= 1 - } else { - m &= 0 - } - if t2&t3&t4&t5&t6&t7&t8 == fieldBaseMask { - m &= 1 - } else { - m &= 0 - } - if ((t0+977)>>fieldBase + t1 + 64) > fieldBaseMask { - m &= 1 - } else { - m &= 0 - } - if t9>>fieldMSBBits != 0 { - m |= 1 - } else { - m |= 0 - } - t0 = t0 + m*977 - t1 = (t0 >> fieldBase) + t1 + (m << 6) - t0 = t0 & fieldBaseMask - t2 = (t1 >> fieldBase) + t2 - t1 = t1 & fieldBaseMask - t3 = (t2 >> fieldBase) + t3 - t2 = t2 & fieldBaseMask - t4 = (t3 >> fieldBase) + t4 - t3 = t3 & fieldBaseMask - t5 = (t4 >> fieldBase) + t5 - t4 = t4 & fieldBaseMask - t6 = (t5 >> fieldBase) + t6 - t5 = t5 & fieldBaseMask - t7 = (t6 >> fieldBase) + t7 - t6 = t6 & fieldBaseMask - t8 = (t7 >> fieldBase) + t8 - t7 = t7 & fieldBaseMask - t9 = (t8 >> fieldBase) + t9 - t8 = t8 & fieldBaseMask - t9 = t9 & fieldMSBMask // Remove potential multiple of 2^256. - - // Finally, set the normalized and reduced words. - f.n[0] = t0 - f.n[1] = t1 - f.n[2] = t2 - f.n[3] = t3 - f.n[4] = t4 - f.n[5] = t5 - f.n[6] = t6 - f.n[7] = t7 - f.n[8] = t8 - f.n[9] = t9 - return f -} - -// PutBytes unpacks the field value to a 32-byte big-endian value using the -// passed byte array. There is a similar function, Bytes, which unpacks the -// field value into a new array and returns that. This version is provided -// since it can be useful to cut down on the number of allocations by allowing -// the caller to reuse a buffer. -// -// The field value must be normalized for this function to return the correct -// result. -func (f *fieldVal) PutBytes(b *[32]byte) { - // Unpack the 256 total bits from the 10 uint32 words with a max of - // 26-bits per word. This could be done with a couple of for loops, - // but this unrolled version is a bit faster. Benchmarks show this is - // about 10 times faster than the variant which uses loops. - b[31] = byte(f.n[0] & eightBitsMask) - b[30] = byte((f.n[0] >> 8) & eightBitsMask) - b[29] = byte((f.n[0] >> 16) & eightBitsMask) - b[28] = byte((f.n[0]>>24)&twoBitsMask | (f.n[1]&sixBitsMask)<<2) - b[27] = byte((f.n[1] >> 6) & eightBitsMask) - b[26] = byte((f.n[1] >> 14) & eightBitsMask) - b[25] = byte((f.n[1]>>22)&fourBitsMask | (f.n[2]&fourBitsMask)<<4) - b[24] = byte((f.n[2] >> 4) & eightBitsMask) - b[23] = byte((f.n[2] >> 12) & eightBitsMask) - b[22] = byte((f.n[2]>>20)&sixBitsMask | (f.n[3]&twoBitsMask)<<6) - b[21] = byte((f.n[3] >> 2) & eightBitsMask) - b[20] = byte((f.n[3] >> 10) & eightBitsMask) - b[19] = byte((f.n[3] >> 18) & eightBitsMask) - b[18] = byte(f.n[4] & eightBitsMask) - b[17] = byte((f.n[4] >> 8) & eightBitsMask) - b[16] = byte((f.n[4] >> 16) & eightBitsMask) - b[15] = byte((f.n[4]>>24)&twoBitsMask | (f.n[5]&sixBitsMask)<<2) - b[14] = byte((f.n[5] >> 6) & eightBitsMask) - b[13] = byte((f.n[5] >> 14) & eightBitsMask) - b[12] = byte((f.n[5]>>22)&fourBitsMask | (f.n[6]&fourBitsMask)<<4) - b[11] = byte((f.n[6] >> 4) & eightBitsMask) - b[10] = byte((f.n[6] >> 12) & eightBitsMask) - b[9] = byte((f.n[6]>>20)&sixBitsMask | (f.n[7]&twoBitsMask)<<6) - b[8] = byte((f.n[7] >> 2) & eightBitsMask) - b[7] = byte((f.n[7] >> 10) & eightBitsMask) - b[6] = byte((f.n[7] >> 18) & eightBitsMask) - b[5] = byte(f.n[8] & eightBitsMask) - b[4] = byte((f.n[8] >> 8) & eightBitsMask) - b[3] = byte((f.n[8] >> 16) & eightBitsMask) - b[2] = byte((f.n[8]>>24)&twoBitsMask | (f.n[9]&sixBitsMask)<<2) - b[1] = byte((f.n[9] >> 6) & eightBitsMask) - b[0] = byte((f.n[9] >> 14) & eightBitsMask) -} - -// Bytes unpacks the field value to a 32-byte big-endian value. See PutBytes -// for a variant that allows the a buffer to be passed which can be useful to -// to cut down on the number of allocations by allowing the caller to reuse a -// buffer. -// -// The field value must be normalized for this function to return correct -// result. -func (f *fieldVal) Bytes() *[32]byte { - b := new([32]byte) - f.PutBytes(b) - return b -} - -// IsZero returns whether or not the field value is equal to zero. -func (f *fieldVal) IsZero() bool { - // The value can only be zero if no bits are set in any of the words. - // This is a constant time implementation. - bits := f.n[0] | f.n[1] | f.n[2] | f.n[3] | f.n[4] | - f.n[5] | f.n[6] | f.n[7] | f.n[8] | f.n[9] - - return bits == 0 -} - -// IsOdd returns whether or not the field value is an odd number. -// -// The field value must be normalized for this function to return correct -// result. -func (f *fieldVal) IsOdd() bool { - // Only odd numbers have the bottom bit set. - return f.n[0]&1 == 1 -} - -// Equals returns whether or not the two field values are the same. Both -// field values being compared must be normalized for this function to return -// the correct result. -func (f *fieldVal) Equals(val *fieldVal) bool { - // Xor only sets bits when they are different, so the two field values - // can only be the same if no bits are set after xoring each word. - // This is a constant time implementation. - bits := (f.n[0] ^ val.n[0]) | (f.n[1] ^ val.n[1]) | (f.n[2] ^ val.n[2]) | - (f.n[3] ^ val.n[3]) | (f.n[4] ^ val.n[4]) | (f.n[5] ^ val.n[5]) | - (f.n[6] ^ val.n[6]) | (f.n[7] ^ val.n[7]) | (f.n[8] ^ val.n[8]) | - (f.n[9] ^ val.n[9]) - - return bits == 0 -} - -// NegateVal negates the passed value and stores the result in f. The caller -// must provide the magnitude of the passed value for a correct result. -// -// The field value is returned to support chaining. This enables syntax like: -// f.NegateVal(f2).AddInt(1) so that f = -f2 + 1. -func (f *fieldVal) NegateVal(val *fieldVal, magnitude uint32) *fieldVal { - // Negation in the field is just the prime minus the value. However, - // in order to allow negation against a field value without having to - // normalize/reduce it first, multiply by the magnitude (that is how - // "far" away it is from the normalized value) to adjust. Also, since - // negating a value pushes it one more order of magnitude away from the - // normalized range, add 1 to compensate. - // - // For some intuition here, imagine you're performing mod 12 arithmetic - // (picture a clock) and you are negating the number 7. So you start at - // 12 (which is of course 0 under mod 12) and count backwards (left on - // the clock) 7 times to arrive at 5. Notice this is just 12-7 = 5. - // Now, assume you're starting with 19, which is a number that is - // already larger than the modulus and congruent to 7 (mod 12). When a - // value is already in the desired range, its magnitude is 1. Since 19 - // is an additional "step", its magnitude (mod 12) is 2. Since any - // multiple of the modulus is conguent to zero (mod m), the answer can - // be shortcut by simply mulplying the magnitude by the modulus and - // subtracting. Keeping with the example, this would be (2*12)-19 = 5. - f.n[0] = (magnitude+1)*fieldPrimeWordZero - val.n[0] - f.n[1] = (magnitude+1)*fieldPrimeWordOne - val.n[1] - f.n[2] = (magnitude+1)*fieldBaseMask - val.n[2] - f.n[3] = (magnitude+1)*fieldBaseMask - val.n[3] - f.n[4] = (magnitude+1)*fieldBaseMask - val.n[4] - f.n[5] = (magnitude+1)*fieldBaseMask - val.n[5] - f.n[6] = (magnitude+1)*fieldBaseMask - val.n[6] - f.n[7] = (magnitude+1)*fieldBaseMask - val.n[7] - f.n[8] = (magnitude+1)*fieldBaseMask - val.n[8] - f.n[9] = (magnitude+1)*fieldMSBMask - val.n[9] - - return f -} - -// Negate negates the field value. The existing field value is modified. The -// caller must provide the magnitude of the field value for a correct result. -// -// The field value is returned to support chaining. This enables syntax like: -// f.Negate().AddInt(1) so that f = -f + 1. -func (f *fieldVal) Negate(magnitude uint32) *fieldVal { - return f.NegateVal(f, magnitude) -} - -// AddInt adds the passed integer to the existing field value and stores the -// result in f. This is a convenience function since it is fairly common to -// perform some arithemetic with small native integers. -// -// The field value is returned to support chaining. This enables syntax like: -// f.AddInt(1).Add(f2) so that f = f + 1 + f2. -func (f *fieldVal) AddInt(ui uint) *fieldVal { - // Since the field representation intentionally provides overflow bits, - // it's ok to use carryless addition as the carry bit is safely part of - // the word and will be normalized out. - f.n[0] += uint32(ui) - - return f -} - -// Add adds the passed value to the existing field value and stores the result -// in f. -// -// The field value is returned to support chaining. This enables syntax like: -// f.Add(f2).AddInt(1) so that f = f + f2 + 1. -func (f *fieldVal) Add(val *fieldVal) *fieldVal { - // Since the field representation intentionally provides overflow bits, - // it's ok to use carryless addition as the carry bit is safely part of - // each word and will be normalized out. This could obviously be done - // in a loop, but the unrolled version is faster. - f.n[0] += val.n[0] - f.n[1] += val.n[1] - f.n[2] += val.n[2] - f.n[3] += val.n[3] - f.n[4] += val.n[4] - f.n[5] += val.n[5] - f.n[6] += val.n[6] - f.n[7] += val.n[7] - f.n[8] += val.n[8] - f.n[9] += val.n[9] - - return f -} - -// Add2 adds the passed two field values together and stores the result in f. -// -// The field value is returned to support chaining. This enables syntax like: -// f3.Add2(f, f2).AddInt(1) so that f3 = f + f2 + 1. -func (f *fieldVal) Add2(val *fieldVal, val2 *fieldVal) *fieldVal { - // Since the field representation intentionally provides overflow bits, - // it's ok to use carryless addition as the carry bit is safely part of - // each word and will be normalized out. This could obviously be done - // in a loop, but the unrolled version is faster. - f.n[0] = val.n[0] + val2.n[0] - f.n[1] = val.n[1] + val2.n[1] - f.n[2] = val.n[2] + val2.n[2] - f.n[3] = val.n[3] + val2.n[3] - f.n[4] = val.n[4] + val2.n[4] - f.n[5] = val.n[5] + val2.n[5] - f.n[6] = val.n[6] + val2.n[6] - f.n[7] = val.n[7] + val2.n[7] - f.n[8] = val.n[8] + val2.n[8] - f.n[9] = val.n[9] + val2.n[9] - - return f -} - -// MulInt multiplies the field value by the passed int and stores the result in -// f. Note that this function can overflow if multiplying the value by any of -// the individual words exceeds a max uint32. Therefore it is important that -// the caller ensures no overflows will occur before using this function. -// -// The field value is returned to support chaining. This enables syntax like: -// f.MulInt(2).Add(f2) so that f = 2 * f + f2. -func (f *fieldVal) MulInt(val uint) *fieldVal { - // Since each word of the field representation can hold up to - // fieldOverflowBits extra bits which will be normalized out, it's safe - // to multiply each word without using a larger type or carry - // propagation so long as the values won't overflow a uint32. This - // could obviously be done in a loop, but the unrolled version is - // faster. - ui := uint32(val) - f.n[0] *= ui - f.n[1] *= ui - f.n[2] *= ui - f.n[3] *= ui - f.n[4] *= ui - f.n[5] *= ui - f.n[6] *= ui - f.n[7] *= ui - f.n[8] *= ui - f.n[9] *= ui - - return f -} - -// Mul multiplies the passed value to the existing field value and stores the -// result in f. Note that this function can overflow if multiplying any -// of the individual words exceeds a max uint32. In practice, this means the -// magnitude of either value involved in the multiplication must be a max of -// 8. -// -// The field value is returned to support chaining. This enables syntax like: -// f.Mul(f2).AddInt(1) so that f = (f * f2) + 1. -func (f *fieldVal) Mul(val *fieldVal) *fieldVal { - return f.Mul2(f, val) -} - -// Mul2 multiplies the passed two field values together and stores the result -// result in f. Note that this function can overflow if multiplying any of -// the individual words exceeds a max uint32. In practice, this means the -// magnitude of either value involved in the multiplication must be a max of -// 8. -// -// The field value is returned to support chaining. This enables syntax like: -// f3.Mul2(f, f2).AddInt(1) so that f3 = (f * f2) + 1. -func (f *fieldVal) Mul2(val *fieldVal, val2 *fieldVal) *fieldVal { - // This could be done with a couple of for loops and an array to store - // the intermediate terms, but this unrolled version is significantly - // faster. - - // Terms for 2^(fieldBase*0). - m := uint64(val.n[0]) * uint64(val2.n[0]) - t0 := m & fieldBaseMask - - // Terms for 2^(fieldBase*1). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[1]) + - uint64(val.n[1])*uint64(val2.n[0]) - t1 := m & fieldBaseMask - - // Terms for 2^(fieldBase*2). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[2]) + - uint64(val.n[1])*uint64(val2.n[1]) + - uint64(val.n[2])*uint64(val2.n[0]) - t2 := m & fieldBaseMask - - // Terms for 2^(fieldBase*3). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[3]) + - uint64(val.n[1])*uint64(val2.n[2]) + - uint64(val.n[2])*uint64(val2.n[1]) + - uint64(val.n[3])*uint64(val2.n[0]) - t3 := m & fieldBaseMask - - // Terms for 2^(fieldBase*4). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[4]) + - uint64(val.n[1])*uint64(val2.n[3]) + - uint64(val.n[2])*uint64(val2.n[2]) + - uint64(val.n[3])*uint64(val2.n[1]) + - uint64(val.n[4])*uint64(val2.n[0]) - t4 := m & fieldBaseMask - - // Terms for 2^(fieldBase*5). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[5]) + - uint64(val.n[1])*uint64(val2.n[4]) + - uint64(val.n[2])*uint64(val2.n[3]) + - uint64(val.n[3])*uint64(val2.n[2]) + - uint64(val.n[4])*uint64(val2.n[1]) + - uint64(val.n[5])*uint64(val2.n[0]) - t5 := m & fieldBaseMask - - // Terms for 2^(fieldBase*6). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[6]) + - uint64(val.n[1])*uint64(val2.n[5]) + - uint64(val.n[2])*uint64(val2.n[4]) + - uint64(val.n[3])*uint64(val2.n[3]) + - uint64(val.n[4])*uint64(val2.n[2]) + - uint64(val.n[5])*uint64(val2.n[1]) + - uint64(val.n[6])*uint64(val2.n[0]) - t6 := m & fieldBaseMask - - // Terms for 2^(fieldBase*7). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[7]) + - uint64(val.n[1])*uint64(val2.n[6]) + - uint64(val.n[2])*uint64(val2.n[5]) + - uint64(val.n[3])*uint64(val2.n[4]) + - uint64(val.n[4])*uint64(val2.n[3]) + - uint64(val.n[5])*uint64(val2.n[2]) + - uint64(val.n[6])*uint64(val2.n[1]) + - uint64(val.n[7])*uint64(val2.n[0]) - t7 := m & fieldBaseMask - - // Terms for 2^(fieldBase*8). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[8]) + - uint64(val.n[1])*uint64(val2.n[7]) + - uint64(val.n[2])*uint64(val2.n[6]) + - uint64(val.n[3])*uint64(val2.n[5]) + - uint64(val.n[4])*uint64(val2.n[4]) + - uint64(val.n[5])*uint64(val2.n[3]) + - uint64(val.n[6])*uint64(val2.n[2]) + - uint64(val.n[7])*uint64(val2.n[1]) + - uint64(val.n[8])*uint64(val2.n[0]) - t8 := m & fieldBaseMask - - // Terms for 2^(fieldBase*9). - m = (m >> fieldBase) + - uint64(val.n[0])*uint64(val2.n[9]) + - uint64(val.n[1])*uint64(val2.n[8]) + - uint64(val.n[2])*uint64(val2.n[7]) + - uint64(val.n[3])*uint64(val2.n[6]) + - uint64(val.n[4])*uint64(val2.n[5]) + - uint64(val.n[5])*uint64(val2.n[4]) + - uint64(val.n[6])*uint64(val2.n[3]) + - uint64(val.n[7])*uint64(val2.n[2]) + - uint64(val.n[8])*uint64(val2.n[1]) + - uint64(val.n[9])*uint64(val2.n[0]) - t9 := m & fieldBaseMask - - // Terms for 2^(fieldBase*10). - m = (m >> fieldBase) + - uint64(val.n[1])*uint64(val2.n[9]) + - uint64(val.n[2])*uint64(val2.n[8]) + - uint64(val.n[3])*uint64(val2.n[7]) + - uint64(val.n[4])*uint64(val2.n[6]) + - uint64(val.n[5])*uint64(val2.n[5]) + - uint64(val.n[6])*uint64(val2.n[4]) + - uint64(val.n[7])*uint64(val2.n[3]) + - uint64(val.n[8])*uint64(val2.n[2]) + - uint64(val.n[9])*uint64(val2.n[1]) - t10 := m & fieldBaseMask - - // Terms for 2^(fieldBase*11). - m = (m >> fieldBase) + - uint64(val.n[2])*uint64(val2.n[9]) + - uint64(val.n[3])*uint64(val2.n[8]) + - uint64(val.n[4])*uint64(val2.n[7]) + - uint64(val.n[5])*uint64(val2.n[6]) + - uint64(val.n[6])*uint64(val2.n[5]) + - uint64(val.n[7])*uint64(val2.n[4]) + - uint64(val.n[8])*uint64(val2.n[3]) + - uint64(val.n[9])*uint64(val2.n[2]) - t11 := m & fieldBaseMask - - // Terms for 2^(fieldBase*12). - m = (m >> fieldBase) + - uint64(val.n[3])*uint64(val2.n[9]) + - uint64(val.n[4])*uint64(val2.n[8]) + - uint64(val.n[5])*uint64(val2.n[7]) + - uint64(val.n[6])*uint64(val2.n[6]) + - uint64(val.n[7])*uint64(val2.n[5]) + - uint64(val.n[8])*uint64(val2.n[4]) + - uint64(val.n[9])*uint64(val2.n[3]) - t12 := m & fieldBaseMask - - // Terms for 2^(fieldBase*13). - m = (m >> fieldBase) + - uint64(val.n[4])*uint64(val2.n[9]) + - uint64(val.n[5])*uint64(val2.n[8]) + - uint64(val.n[6])*uint64(val2.n[7]) + - uint64(val.n[7])*uint64(val2.n[6]) + - uint64(val.n[8])*uint64(val2.n[5]) + - uint64(val.n[9])*uint64(val2.n[4]) - t13 := m & fieldBaseMask - - // Terms for 2^(fieldBase*14). - m = (m >> fieldBase) + - uint64(val.n[5])*uint64(val2.n[9]) + - uint64(val.n[6])*uint64(val2.n[8]) + - uint64(val.n[7])*uint64(val2.n[7]) + - uint64(val.n[8])*uint64(val2.n[6]) + - uint64(val.n[9])*uint64(val2.n[5]) - t14 := m & fieldBaseMask - - // Terms for 2^(fieldBase*15). - m = (m >> fieldBase) + - uint64(val.n[6])*uint64(val2.n[9]) + - uint64(val.n[7])*uint64(val2.n[8]) + - uint64(val.n[8])*uint64(val2.n[7]) + - uint64(val.n[9])*uint64(val2.n[6]) - t15 := m & fieldBaseMask - - // Terms for 2^(fieldBase*16). - m = (m >> fieldBase) + - uint64(val.n[7])*uint64(val2.n[9]) + - uint64(val.n[8])*uint64(val2.n[8]) + - uint64(val.n[9])*uint64(val2.n[7]) - t16 := m & fieldBaseMask - - // Terms for 2^(fieldBase*17). - m = (m >> fieldBase) + - uint64(val.n[8])*uint64(val2.n[9]) + - uint64(val.n[9])*uint64(val2.n[8]) - t17 := m & fieldBaseMask - - // Terms for 2^(fieldBase*18). - m = (m >> fieldBase) + uint64(val.n[9])*uint64(val2.n[9]) - t18 := m & fieldBaseMask - - // What's left is for 2^(fieldBase*19). - t19 := m >> fieldBase - - // At this point, all of the terms are grouped into their respective - // base. - // - // Per [HAC] section 14.3.4: Reduction method of moduli of special form, - // when the modulus is of the special form m = b^t - c, highly efficient - // reduction can be achieved per the provided algorithm. - // - // The secp256k1 prime is equivalent to 2^256 - 4294968273, so it fits - // this criteria. - // - // 4294968273 in field representation (base 2^26) is: - // n[0] = 977 - // n[1] = 64 - // That is to say (2^26 * 64) + 977 = 4294968273 - // - // Since each word is in base 26, the upper terms (t10 and up) start - // at 260 bits (versus the final desired range of 256 bits), so the - // field representation of 'c' from above needs to be adjusted for the - // extra 4 bits by multiplying it by 2^4 = 16. 4294968273 * 16 = - // 68719492368. Thus, the adjusted field representation of 'c' is: - // n[0] = 977 * 16 = 15632 - // n[1] = 64 * 16 = 1024 - // That is to say (2^26 * 1024) + 15632 = 68719492368 - // - // To reduce the final term, t19, the entire 'c' value is needed instead - // of only n[0] because there are no more terms left to handle n[1]. - // This means there might be some magnitude left in the upper bits that - // is handled below. - m = t0 + t10*15632 - t0 = m & fieldBaseMask - m = (m >> fieldBase) + t1 + t10*1024 + t11*15632 - t1 = m & fieldBaseMask - m = (m >> fieldBase) + t2 + t11*1024 + t12*15632 - t2 = m & fieldBaseMask - m = (m >> fieldBase) + t3 + t12*1024 + t13*15632 - t3 = m & fieldBaseMask - m = (m >> fieldBase) + t4 + t13*1024 + t14*15632 - t4 = m & fieldBaseMask - m = (m >> fieldBase) + t5 + t14*1024 + t15*15632 - t5 = m & fieldBaseMask - m = (m >> fieldBase) + t6 + t15*1024 + t16*15632 - t6 = m & fieldBaseMask - m = (m >> fieldBase) + t7 + t16*1024 + t17*15632 - t7 = m & fieldBaseMask - m = (m >> fieldBase) + t8 + t17*1024 + t18*15632 - t8 = m & fieldBaseMask - m = (m >> fieldBase) + t9 + t18*1024 + t19*68719492368 - t9 = m & fieldMSBMask - m = m >> fieldMSBBits - - // At this point, if the magnitude is greater than 0, the overall value - // is greater than the max possible 256-bit value. In particular, it is - // "how many times larger" than the max value it is. - // - // The algorithm presented in [HAC] section 14.3.4 repeats until the - // quotient is zero. However, due to the above, we already know at - // least how many times we would need to repeat as it's the value - // currently in m. Thus we can simply multiply the magnitude by the - // field representation of the prime and do a single iteration. Notice - // that nothing will be changed when the magnitude is zero, so we could - // skip this in that case, however always running regardless allows it - // to run in constant time. The final result will be in the range - // 0 <= result <= prime + (2^64 - c), so it is guaranteed to have a - // magnitude of 1, but it is denormalized. - d := t0 + m*977 - f.n[0] = uint32(d & fieldBaseMask) - d = (d >> fieldBase) + t1 + m*64 - f.n[1] = uint32(d & fieldBaseMask) - f.n[2] = uint32((d >> fieldBase) + t2) - f.n[3] = uint32(t3) - f.n[4] = uint32(t4) - f.n[5] = uint32(t5) - f.n[6] = uint32(t6) - f.n[7] = uint32(t7) - f.n[8] = uint32(t8) - f.n[9] = uint32(t9) - - return f -} - -// Square squares the field value. The existing field value is modified. Note -// that this function can overflow if multiplying any of the individual words -// exceeds a max uint32. In practice, this means the magnitude of the field -// must be a max of 8 to prevent overflow. -// -// The field value is returned to support chaining. This enables syntax like: -// f.Square().Mul(f2) so that f = f^2 * f2. -func (f *fieldVal) Square() *fieldVal { - return f.SquareVal(f) -} - -// SquareVal squares the passed value and stores the result in f. Note that -// this function can overflow if multiplying any of the individual words -// exceeds a max uint32. In practice, this means the magnitude of the field -// being squred must be a max of 8 to prevent overflow. -// -// The field value is returned to support chaining. This enables syntax like: -// f3.SquareVal(f).Mul(f) so that f3 = f^2 * f = f^3. -func (f *fieldVal) SquareVal(val *fieldVal) *fieldVal { - // This could be done with a couple of for loops and an array to store - // the intermediate terms, but this unrolled version is significantly - // faster. - - // Terms for 2^(fieldBase*0). - m := uint64(val.n[0]) * uint64(val.n[0]) - t0 := m & fieldBaseMask - - // Terms for 2^(fieldBase*1). - m = (m >> fieldBase) + 2*uint64(val.n[0])*uint64(val.n[1]) - t1 := m & fieldBaseMask - - // Terms for 2^(fieldBase*2). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[2]) + - uint64(val.n[1])*uint64(val.n[1]) - t2 := m & fieldBaseMask - - // Terms for 2^(fieldBase*3). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[3]) + - 2*uint64(val.n[1])*uint64(val.n[2]) - t3 := m & fieldBaseMask - - // Terms for 2^(fieldBase*4). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[4]) + - 2*uint64(val.n[1])*uint64(val.n[3]) + - uint64(val.n[2])*uint64(val.n[2]) - t4 := m & fieldBaseMask - - // Terms for 2^(fieldBase*5). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[5]) + - 2*uint64(val.n[1])*uint64(val.n[4]) + - 2*uint64(val.n[2])*uint64(val.n[3]) - t5 := m & fieldBaseMask - - // Terms for 2^(fieldBase*6). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[6]) + - 2*uint64(val.n[1])*uint64(val.n[5]) + - 2*uint64(val.n[2])*uint64(val.n[4]) + - uint64(val.n[3])*uint64(val.n[3]) - t6 := m & fieldBaseMask - - // Terms for 2^(fieldBase*7). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[7]) + - 2*uint64(val.n[1])*uint64(val.n[6]) + - 2*uint64(val.n[2])*uint64(val.n[5]) + - 2*uint64(val.n[3])*uint64(val.n[4]) - t7 := m & fieldBaseMask - - // Terms for 2^(fieldBase*8). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[8]) + - 2*uint64(val.n[1])*uint64(val.n[7]) + - 2*uint64(val.n[2])*uint64(val.n[6]) + - 2*uint64(val.n[3])*uint64(val.n[5]) + - uint64(val.n[4])*uint64(val.n[4]) - t8 := m & fieldBaseMask - - // Terms for 2^(fieldBase*9). - m = (m >> fieldBase) + - 2*uint64(val.n[0])*uint64(val.n[9]) + - 2*uint64(val.n[1])*uint64(val.n[8]) + - 2*uint64(val.n[2])*uint64(val.n[7]) + - 2*uint64(val.n[3])*uint64(val.n[6]) + - 2*uint64(val.n[4])*uint64(val.n[5]) - t9 := m & fieldBaseMask - - // Terms for 2^(fieldBase*10). - m = (m >> fieldBase) + - 2*uint64(val.n[1])*uint64(val.n[9]) + - 2*uint64(val.n[2])*uint64(val.n[8]) + - 2*uint64(val.n[3])*uint64(val.n[7]) + - 2*uint64(val.n[4])*uint64(val.n[6]) + - uint64(val.n[5])*uint64(val.n[5]) - t10 := m & fieldBaseMask - - // Terms for 2^(fieldBase*11). - m = (m >> fieldBase) + - 2*uint64(val.n[2])*uint64(val.n[9]) + - 2*uint64(val.n[3])*uint64(val.n[8]) + - 2*uint64(val.n[4])*uint64(val.n[7]) + - 2*uint64(val.n[5])*uint64(val.n[6]) - t11 := m & fieldBaseMask - - // Terms for 2^(fieldBase*12). - m = (m >> fieldBase) + - 2*uint64(val.n[3])*uint64(val.n[9]) + - 2*uint64(val.n[4])*uint64(val.n[8]) + - 2*uint64(val.n[5])*uint64(val.n[7]) + - uint64(val.n[6])*uint64(val.n[6]) - t12 := m & fieldBaseMask - - // Terms for 2^(fieldBase*13). - m = (m >> fieldBase) + - 2*uint64(val.n[4])*uint64(val.n[9]) + - 2*uint64(val.n[5])*uint64(val.n[8]) + - 2*uint64(val.n[6])*uint64(val.n[7]) - t13 := m & fieldBaseMask - - // Terms for 2^(fieldBase*14). - m = (m >> fieldBase) + - 2*uint64(val.n[5])*uint64(val.n[9]) + - 2*uint64(val.n[6])*uint64(val.n[8]) + - uint64(val.n[7])*uint64(val.n[7]) - t14 := m & fieldBaseMask - - // Terms for 2^(fieldBase*15). - m = (m >> fieldBase) + - 2*uint64(val.n[6])*uint64(val.n[9]) + - 2*uint64(val.n[7])*uint64(val.n[8]) - t15 := m & fieldBaseMask - - // Terms for 2^(fieldBase*16). - m = (m >> fieldBase) + - 2*uint64(val.n[7])*uint64(val.n[9]) + - uint64(val.n[8])*uint64(val.n[8]) - t16 := m & fieldBaseMask - - // Terms for 2^(fieldBase*17). - m = (m >> fieldBase) + 2*uint64(val.n[8])*uint64(val.n[9]) - t17 := m & fieldBaseMask - - // Terms for 2^(fieldBase*18). - m = (m >> fieldBase) + uint64(val.n[9])*uint64(val.n[9]) - t18 := m & fieldBaseMask - - // What's left is for 2^(fieldBase*19). - t19 := m >> fieldBase - - // At this point, all of the terms are grouped into their respective - // base. - // - // Per [HAC] section 14.3.4: Reduction method of moduli of special form, - // when the modulus is of the special form m = b^t - c, highly efficient - // reduction can be achieved per the provided algorithm. - // - // The secp256k1 prime is equivalent to 2^256 - 4294968273, so it fits - // this criteria. - // - // 4294968273 in field representation (base 2^26) is: - // n[0] = 977 - // n[1] = 64 - // That is to say (2^26 * 64) + 977 = 4294968273 - // - // Since each word is in base 26, the upper terms (t10 and up) start - // at 260 bits (versus the final desired range of 256 bits), so the - // field representation of 'c' from above needs to be adjusted for the - // extra 4 bits by multiplying it by 2^4 = 16. 4294968273 * 16 = - // 68719492368. Thus, the adjusted field representation of 'c' is: - // n[0] = 977 * 16 = 15632 - // n[1] = 64 * 16 = 1024 - // That is to say (2^26 * 1024) + 15632 = 68719492368 - // - // To reduce the final term, t19, the entire 'c' value is needed instead - // of only n[0] because there are no more terms left to handle n[1]. - // This means there might be some magnitude left in the upper bits that - // is handled below. - m = t0 + t10*15632 - t0 = m & fieldBaseMask - m = (m >> fieldBase) + t1 + t10*1024 + t11*15632 - t1 = m & fieldBaseMask - m = (m >> fieldBase) + t2 + t11*1024 + t12*15632 - t2 = m & fieldBaseMask - m = (m >> fieldBase) + t3 + t12*1024 + t13*15632 - t3 = m & fieldBaseMask - m = (m >> fieldBase) + t4 + t13*1024 + t14*15632 - t4 = m & fieldBaseMask - m = (m >> fieldBase) + t5 + t14*1024 + t15*15632 - t5 = m & fieldBaseMask - m = (m >> fieldBase) + t6 + t15*1024 + t16*15632 - t6 = m & fieldBaseMask - m = (m >> fieldBase) + t7 + t16*1024 + t17*15632 - t7 = m & fieldBaseMask - m = (m >> fieldBase) + t8 + t17*1024 + t18*15632 - t8 = m & fieldBaseMask - m = (m >> fieldBase) + t9 + t18*1024 + t19*68719492368 - t9 = m & fieldMSBMask - m = m >> fieldMSBBits - - // At this point, if the magnitude is greater than 0, the overall value - // is greater than the max possible 256-bit value. In particular, it is - // "how many times larger" than the max value it is. - // - // The algorithm presented in [HAC] section 14.3.4 repeats until the - // quotient is zero. However, due to the above, we already know at - // least how many times we would need to repeat as it's the value - // currently in m. Thus we can simply multiply the magnitude by the - // field representation of the prime and do a single iteration. Notice - // that nothing will be changed when the magnitude is zero, so we could - // skip this in that case, however always running regardless allows it - // to run in constant time. The final result will be in the range - // 0 <= result <= prime + (2^64 - c), so it is guaranteed to have a - // magnitude of 1, but it is denormalized. - n := t0 + m*977 - f.n[0] = uint32(n & fieldBaseMask) - n = (n >> fieldBase) + t1 + m*64 - f.n[1] = uint32(n & fieldBaseMask) - f.n[2] = uint32((n >> fieldBase) + t2) - f.n[3] = uint32(t3) - f.n[4] = uint32(t4) - f.n[5] = uint32(t5) - f.n[6] = uint32(t6) - f.n[7] = uint32(t7) - f.n[8] = uint32(t8) - f.n[9] = uint32(t9) - - return f -} - -// Inverse finds the modular multiplicative inverse of the field value. The -// existing field value is modified. -// -// The field value is returned to support chaining. This enables syntax like: -// f.Inverse().Mul(f2) so that f = f^-1 * f2. -func (f *fieldVal) Inverse() *fieldVal { - // Fermat's little theorem states that for a nonzero number a and prime - // prime p, a^(p-1) = 1 (mod p). Since the multipliciative inverse is - // a*b = 1 (mod p), it follows that b = a*a^(p-2) = a^(p-1) = 1 (mod p). - // Thus, a^(p-2) is the multiplicative inverse. - // - // In order to efficiently compute a^(p-2), p-2 needs to be split into - // a sequence of squares and multipications that minimizes the number of - // multiplications needed (since they are more costly than squarings). - // Intermediate results are saved and reused as well. - // - // The secp256k1 prime - 2 is 2^256 - 4294968275. - // - // This has a cost of 258 field squarings and 33 field multiplications. - var a2, a3, a4, a10, a11, a21, a42, a45, a63, a1019, a1023 fieldVal - a2.SquareVal(f) - a3.Mul2(&a2, f) - a4.SquareVal(&a2) - a10.SquareVal(&a4).Mul(&a2) - a11.Mul2(&a10, f) - a21.Mul2(&a10, &a11) - a42.SquareVal(&a21) - a45.Mul2(&a42, &a3) - a63.Mul2(&a42, &a21) - a1019.SquareVal(&a63).Square().Square().Square().Mul(&a11) - a1023.Mul2(&a1019, &a4) - f.Set(&a63) // f = a^(2^6 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^11 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^16 - 1024) - f.Mul(&a1023) // f = a^(2^16 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^21 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^26 - 1024) - f.Mul(&a1023) // f = a^(2^26 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^31 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^36 - 1024) - f.Mul(&a1023) // f = a^(2^36 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^41 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^46 - 1024) - f.Mul(&a1023) // f = a^(2^46 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^51 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^56 - 1024) - f.Mul(&a1023) // f = a^(2^56 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^61 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^66 - 1024) - f.Mul(&a1023) // f = a^(2^66 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^71 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^76 - 1024) - f.Mul(&a1023) // f = a^(2^76 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^81 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^86 - 1024) - f.Mul(&a1023) // f = a^(2^86 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^91 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^96 - 1024) - f.Mul(&a1023) // f = a^(2^96 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^101 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^106 - 1024) - f.Mul(&a1023) // f = a^(2^106 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^111 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^116 - 1024) - f.Mul(&a1023) // f = a^(2^116 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^121 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^126 - 1024) - f.Mul(&a1023) // f = a^(2^126 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^131 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^136 - 1024) - f.Mul(&a1023) // f = a^(2^136 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^141 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^146 - 1024) - f.Mul(&a1023) // f = a^(2^146 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^151 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^156 - 1024) - f.Mul(&a1023) // f = a^(2^156 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^161 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^166 - 1024) - f.Mul(&a1023) // f = a^(2^166 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^171 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^176 - 1024) - f.Mul(&a1023) // f = a^(2^176 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^181 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^186 - 1024) - f.Mul(&a1023) // f = a^(2^186 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^191 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^196 - 1024) - f.Mul(&a1023) // f = a^(2^196 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^201 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^206 - 1024) - f.Mul(&a1023) // f = a^(2^206 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^211 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^216 - 1024) - f.Mul(&a1023) // f = a^(2^216 - 1) - f.Square().Square().Square().Square().Square() // f = a^(2^221 - 32) - f.Square().Square().Square().Square().Square() // f = a^(2^226 - 1024) - f.Mul(&a1019) // f = a^(2^226 - 5) - f.Square().Square().Square().Square().Square() // f = a^(2^231 - 160) - f.Square().Square().Square().Square().Square() // f = a^(2^236 - 5120) - f.Mul(&a1023) // f = a^(2^236 - 4097) - f.Square().Square().Square().Square().Square() // f = a^(2^241 - 131104) - f.Square().Square().Square().Square().Square() // f = a^(2^246 - 4195328) - f.Mul(&a1023) // f = a^(2^246 - 4194305) - f.Square().Square().Square().Square().Square() // f = a^(2^251 - 134217760) - f.Square().Square().Square().Square().Square() // f = a^(2^256 - 4294968320) - return f.Mul(&a45) // f = a^(2^256 - 4294968275) = a^(p-2) -} diff --git a/vendor/github.com/btcsuite/btcd/btcec/gensecp256k1.go b/vendor/github.com/btcsuite/btcd/btcec/gensecp256k1.go deleted file mode 100644 index 1928702da84f..000000000000 --- a/vendor/github.com/btcsuite/btcd/btcec/gensecp256k1.go +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright (c) 2014-2015 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -// This file is ignored during the regular build due to the following build tag. -// This build tag is set during go generate. -// +build gensecp256k1 - -package btcec - -// References: -// [GECC]: Guide to Elliptic Curve Cryptography (Hankerson, Menezes, Vanstone) - -import ( - "encoding/binary" - "math/big" -) - -// secp256k1BytePoints are dummy points used so the code which generates the -// real values can compile. -var secp256k1BytePoints = "" - -// getDoublingPoints returns all the possible G^(2^i) for i in -// 0..n-1 where n is the curve's bit size (256 in the case of secp256k1) -// the coordinates are recorded as Jacobian coordinates. -func (curve *KoblitzCurve) getDoublingPoints() [][3]fieldVal { - doublingPoints := make([][3]fieldVal, curve.BitSize) - - // initialize px, py, pz to the Jacobian coordinates for the base point - px, py := curve.bigAffineToField(curve.Gx, curve.Gy) - pz := new(fieldVal).SetInt(1) - for i := 0; i < curve.BitSize; i++ { - doublingPoints[i] = [3]fieldVal{*px, *py, *pz} - // P = 2*P - curve.doubleJacobian(px, py, pz, px, py, pz) - } - return doublingPoints -} - -// SerializedBytePoints returns a serialized byte slice which contains all of -// the possible points per 8-bit window. This is used to when generating -// secp256k1.go. -func (curve *KoblitzCurve) SerializedBytePoints() []byte { - doublingPoints := curve.getDoublingPoints() - - // Segregate the bits into byte-sized windows - serialized := make([]byte, curve.byteSize*256*3*10*4) - offset := 0 - for byteNum := 0; byteNum < curve.byteSize; byteNum++ { - // Grab the 8 bits that make up this byte from doublingPoints. - startingBit := 8 * (curve.byteSize - byteNum - 1) - computingPoints := doublingPoints[startingBit : startingBit+8] - - // Compute all points in this window and serialize them. - for i := 0; i < 256; i++ { - px, py, pz := new(fieldVal), new(fieldVal), new(fieldVal) - for j := 0; j < 8; j++ { - if i>>uint(j)&1 == 1 { - curve.addJacobian(px, py, pz, &computingPoints[j][0], - &computingPoints[j][1], &computingPoints[j][2], px, py, pz) - } - } - for i := 0; i < 10; i++ { - binary.LittleEndian.PutUint32(serialized[offset:], px.n[i]) - offset += 4 - } - for i := 0; i < 10; i++ { - binary.LittleEndian.PutUint32(serialized[offset:], py.n[i]) - offset += 4 - } - for i := 0; i < 10; i++ { - binary.LittleEndian.PutUint32(serialized[offset:], pz.n[i]) - offset += 4 - } - } - } - - return serialized -} - -// sqrt returns the square root of the provided big integer using Newton's -// method. It's only compiled and used during generation of pre-computed -// values, so speed is not a huge concern. -func sqrt(n *big.Int) *big.Int { - // Initial guess = 2^(log_2(n)/2) - guess := big.NewInt(2) - guess.Exp(guess, big.NewInt(int64(n.BitLen()/2)), nil) - - // Now refine using Newton's method. - big2 := big.NewInt(2) - prevGuess := big.NewInt(0) - for { - prevGuess.Set(guess) - guess.Add(guess, new(big.Int).Div(n, guess)) - guess.Div(guess, big2) - if guess.Cmp(prevGuess) == 0 { - break - } - } - return guess -} - -// EndomorphismVectors runs the first 3 steps of algorithm 3.74 from [GECC] to -// generate the linearly independent vectors needed to generate a balanced -// length-two representation of a multiplier such that k = k1 + k2λ (mod N) and -// returns them. Since the values will always be the same given the fact that N -// and λ are fixed, the final results can be accelerated by storing the -// precomputed values with the curve. -func (curve *KoblitzCurve) EndomorphismVectors() (a1, b1, a2, b2 *big.Int) { - bigMinus1 := big.NewInt(-1) - - // This section uses an extended Euclidean algorithm to generate a - // sequence of equations: - // s[i] * N + t[i] * λ = r[i] - - nSqrt := sqrt(curve.N) - u, v := new(big.Int).Set(curve.N), new(big.Int).Set(curve.lambda) - x1, y1 := big.NewInt(1), big.NewInt(0) - x2, y2 := big.NewInt(0), big.NewInt(1) - q, r := new(big.Int), new(big.Int) - qu, qx1, qy1 := new(big.Int), new(big.Int), new(big.Int) - s, t := new(big.Int), new(big.Int) - ri, ti := new(big.Int), new(big.Int) - a1, b1, a2, b2 = new(big.Int), new(big.Int), new(big.Int), new(big.Int) - found, oneMore := false, false - for u.Sign() != 0 { - // q = v/u - q.Div(v, u) - - // r = v - q*u - qu.Mul(q, u) - r.Sub(v, qu) - - // s = x2 - q*x1 - qx1.Mul(q, x1) - s.Sub(x2, qx1) - - // t = y2 - q*y1 - qy1.Mul(q, y1) - t.Sub(y2, qy1) - - // v = u, u = r, x2 = x1, x1 = s, y2 = y1, y1 = t - v.Set(u) - u.Set(r) - x2.Set(x1) - x1.Set(s) - y2.Set(y1) - y1.Set(t) - - // As soon as the remainder is less than the sqrt of n, the - // values of a1 and b1 are known. - if !found && r.Cmp(nSqrt) < 0 { - // When this condition executes ri and ti represent the - // r[i] and t[i] values such that i is the greatest - // index for which r >= sqrt(n). Meanwhile, the current - // r and t values are r[i+1] and t[i+1], respectively. - - // a1 = r[i+1], b1 = -t[i+1] - a1.Set(r) - b1.Mul(t, bigMinus1) - found = true - oneMore = true - - // Skip to the next iteration so ri and ti are not - // modified. - continue - - } else if oneMore { - // When this condition executes ri and ti still - // represent the r[i] and t[i] values while the current - // r and t are r[i+2] and t[i+2], respectively. - - // sum1 = r[i]^2 + t[i]^2 - rSquared := new(big.Int).Mul(ri, ri) - tSquared := new(big.Int).Mul(ti, ti) - sum1 := new(big.Int).Add(rSquared, tSquared) - - // sum2 = r[i+2]^2 + t[i+2]^2 - r2Squared := new(big.Int).Mul(r, r) - t2Squared := new(big.Int).Mul(t, t) - sum2 := new(big.Int).Add(r2Squared, t2Squared) - - // if (r[i]^2 + t[i]^2) <= (r[i+2]^2 + t[i+2]^2) - if sum1.Cmp(sum2) <= 0 { - // a2 = r[i], b2 = -t[i] - a2.Set(ri) - b2.Mul(ti, bigMinus1) - } else { - // a2 = r[i+2], b2 = -t[i+2] - a2.Set(r) - b2.Mul(t, bigMinus1) - } - - // All done. - break - } - - ri.Set(r) - ti.Set(t) - } - - return a1, b1, a2, b2 -} diff --git a/vendor/github.com/btcsuite/btcd/btcec/precompute.go b/vendor/github.com/btcsuite/btcd/btcec/precompute.go deleted file mode 100644 index 034cd5533215..000000000000 --- a/vendor/github.com/btcsuite/btcd/btcec/precompute.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2015 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package btcec - -import ( - "compress/zlib" - "encoding/base64" - "encoding/binary" - "io/ioutil" - "strings" -) - -//go:generate go run -tags gensecp256k1 genprecomps.go - -// loadS256BytePoints decompresses and deserializes the pre-computed byte points -// used to accelerate scalar base multiplication for the secp256k1 curve. This -// approach is used since it allows the compile to use significantly less ram -// and be performed much faster than it is with hard-coding the final in-memory -// data structure. At the same time, it is quite fast to generate the in-memory -// data structure at init time with this approach versus computing the table. -func loadS256BytePoints() error { - // There will be no byte points to load when generating them. - bp := secp256k1BytePoints - if len(bp) == 0 { - return nil - } - - // Decompress the pre-computed table used to accelerate scalar base - // multiplication. - decoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(bp)) - r, err := zlib.NewReader(decoder) - if err != nil { - return err - } - serialized, err := ioutil.ReadAll(r) - if err != nil { - return err - } - - // Deserialize the precomputed byte points and set the curve to them. - offset := 0 - var bytePoints [32][256][3]fieldVal - for byteNum := 0; byteNum < 32; byteNum++ { - // All points in this window. - for i := 0; i < 256; i++ { - px := &bytePoints[byteNum][i][0] - py := &bytePoints[byteNum][i][1] - pz := &bytePoints[byteNum][i][2] - for i := 0; i < 10; i++ { - px.n[i] = binary.LittleEndian.Uint32(serialized[offset:]) - offset += 4 - } - for i := 0; i < 10; i++ { - py.n[i] = binary.LittleEndian.Uint32(serialized[offset:]) - offset += 4 - } - for i := 0; i < 10; i++ { - pz.n[i] = binary.LittleEndian.Uint32(serialized[offset:]) - offset += 4 - } - } - } - secp256k1.bytePoints = &bytePoints - return nil -} diff --git a/vendor/github.com/btcsuite/btcd/btcec/privkey.go b/vendor/github.com/btcsuite/btcd/btcec/privkey.go deleted file mode 100644 index 676a8c3fb010..000000000000 --- a/vendor/github.com/btcsuite/btcd/btcec/privkey.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) 2013-2016 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package btcec - -import ( - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "math/big" -) - -// PrivateKey wraps an ecdsa.PrivateKey as a convenience mainly for signing -// things with the the private key without having to directly import the ecdsa -// package. -type PrivateKey ecdsa.PrivateKey - -// PrivKeyFromBytes returns a private and public key for `curve' based on the -// private key passed as an argument as a byte slice. -func PrivKeyFromBytes(curve elliptic.Curve, pk []byte) (*PrivateKey, - *PublicKey) { - x, y := curve.ScalarBaseMult(pk) - - priv := &ecdsa.PrivateKey{ - PublicKey: ecdsa.PublicKey{ - Curve: curve, - X: x, - Y: y, - }, - D: new(big.Int).SetBytes(pk), - } - - return (*PrivateKey)(priv), (*PublicKey)(&priv.PublicKey) -} - -// NewPrivateKey is a wrapper for ecdsa.GenerateKey that returns a PrivateKey -// instead of the normal ecdsa.PrivateKey. -func NewPrivateKey(curve elliptic.Curve) (*PrivateKey, error) { - key, err := ecdsa.GenerateKey(curve, rand.Reader) - if err != nil { - return nil, err - } - return (*PrivateKey)(key), nil -} - -// PubKey returns the PublicKey corresponding to this private key. -func (p *PrivateKey) PubKey() *PublicKey { - return (*PublicKey)(&p.PublicKey) -} - -// ToECDSA returns the private key as a *ecdsa.PrivateKey. -func (p *PrivateKey) ToECDSA() *ecdsa.PrivateKey { - return (*ecdsa.PrivateKey)(p) -} - -// Sign generates an ECDSA signature for the provided hash (which should be the result -// of hashing a larger message) using the private key. Produced signature -// is deterministic (same message and same key yield the same signature) and canonical -// in accordance with RFC6979 and BIP0062. -func (p *PrivateKey) Sign(hash []byte) (*Signature, error) { - return signRFC6979(p, hash) -} - -// PrivKeyBytesLen defines the length in bytes of a serialized private key. -const PrivKeyBytesLen = 32 - -// Serialize returns the private key number d as a big-endian binary-encoded -// number, padded to a length of 32 bytes. -func (p *PrivateKey) Serialize() []byte { - b := make([]byte, 0, PrivKeyBytesLen) - return paddedAppend(PrivKeyBytesLen, b, p.ToECDSA().D.Bytes()) -} diff --git a/vendor/github.com/btcsuite/btcd/btcec/pubkey.go b/vendor/github.com/btcsuite/btcd/btcec/pubkey.go deleted file mode 100644 index b74917718f9f..000000000000 --- a/vendor/github.com/btcsuite/btcd/btcec/pubkey.go +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright (c) 2013-2014 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package btcec - -import ( - "crypto/ecdsa" - "errors" - "fmt" - "math/big" -) - -// These constants define the lengths of serialized public keys. -const ( - PubKeyBytesLenCompressed = 33 - PubKeyBytesLenUncompressed = 65 - PubKeyBytesLenHybrid = 65 -) - -func isOdd(a *big.Int) bool { - return a.Bit(0) == 1 -} - -// decompressPoint decompresses a point on the given curve given the X point and -// the solution to use. -func decompressPoint(curve *KoblitzCurve, x *big.Int, ybit bool) (*big.Int, error) { - // TODO: This will probably only work for secp256k1 due to - // optimizations. - - // Y = +-sqrt(x^3 + B) - x3 := new(big.Int).Mul(x, x) - x3.Mul(x3, x) - x3.Add(x3, curve.Params().B) - - // now calculate sqrt mod p of x2 + B - // This code used to do a full sqrt based on tonelli/shanks, - // but this was replaced by the algorithms referenced in - // https://bitcointalk.org/index.php?topic=162805.msg1712294#msg1712294 - y := new(big.Int).Exp(x3, curve.QPlus1Div4(), curve.Params().P) - - if ybit != isOdd(y) { - y.Sub(curve.Params().P, y) - } - if ybit != isOdd(y) { - return nil, fmt.Errorf("ybit doesn't match oddness") - } - return y, nil -} - -const ( - pubkeyCompressed byte = 0x2 // y_bit + x coord - pubkeyUncompressed byte = 0x4 // x coord + y coord - pubkeyHybrid byte = 0x6 // y_bit + x coord + y coord -) - -// IsCompressedPubKey returns true the the passed serialized public key has -// been encoded in compressed format, and false otherwise. -func IsCompressedPubKey(pubKey []byte) bool { - // The public key is only compressed if it is the correct length and - // the format (first byte) is one of the compressed pubkey values. - return len(pubKey) == PubKeyBytesLenCompressed && - (pubKey[0]&^byte(0x1) == pubkeyCompressed) -} - -// ParsePubKey parses a public key for a koblitz curve from a bytestring into a -// ecdsa.Publickey, verifying that it is valid. It supports compressed, -// uncompressed and hybrid signature formats. -func ParsePubKey(pubKeyStr []byte, curve *KoblitzCurve) (key *PublicKey, err error) { - pubkey := PublicKey{} - pubkey.Curve = curve - - if len(pubKeyStr) == 0 { - return nil, errors.New("pubkey string is empty") - } - - format := pubKeyStr[0] - ybit := (format & 0x1) == 0x1 - format &= ^byte(0x1) - - switch len(pubKeyStr) { - case PubKeyBytesLenUncompressed: - if format != pubkeyUncompressed && format != pubkeyHybrid { - return nil, fmt.Errorf("invalid magic in pubkey str: "+ - "%d", pubKeyStr[0]) - } - - pubkey.X = new(big.Int).SetBytes(pubKeyStr[1:33]) - pubkey.Y = new(big.Int).SetBytes(pubKeyStr[33:]) - // hybrid keys have extra information, make use of it. - if format == pubkeyHybrid && ybit != isOdd(pubkey.Y) { - return nil, fmt.Errorf("ybit doesn't match oddness") - } - case PubKeyBytesLenCompressed: - // format is 0x2 | solution, - // solution determines which solution of the curve we use. - /// y^2 = x^3 + Curve.B - if format != pubkeyCompressed { - return nil, fmt.Errorf("invalid magic in compressed "+ - "pubkey string: %d", pubKeyStr[0]) - } - pubkey.X = new(big.Int).SetBytes(pubKeyStr[1:33]) - pubkey.Y, err = decompressPoint(curve, pubkey.X, ybit) - if err != nil { - return nil, err - } - default: // wrong! - return nil, fmt.Errorf("invalid pub key length %d", - len(pubKeyStr)) - } - - if pubkey.X.Cmp(pubkey.Curve.Params().P) >= 0 { - return nil, fmt.Errorf("pubkey X parameter is >= to P") - } - if pubkey.Y.Cmp(pubkey.Curve.Params().P) >= 0 { - return nil, fmt.Errorf("pubkey Y parameter is >= to P") - } - if !pubkey.Curve.IsOnCurve(pubkey.X, pubkey.Y) { - return nil, fmt.Errorf("pubkey isn't on secp256k1 curve") - } - return &pubkey, nil -} - -// PublicKey is an ecdsa.PublicKey with additional functions to -// serialize in uncompressed, compressed, and hybrid formats. -type PublicKey ecdsa.PublicKey - -// ToECDSA returns the public key as a *ecdsa.PublicKey. -func (p *PublicKey) ToECDSA() *ecdsa.PublicKey { - return (*ecdsa.PublicKey)(p) -} - -// SerializeUncompressed serializes a public key in a 65-byte uncompressed -// format. -func (p *PublicKey) SerializeUncompressed() []byte { - b := make([]byte, 0, PubKeyBytesLenUncompressed) - b = append(b, pubkeyUncompressed) - b = paddedAppend(32, b, p.X.Bytes()) - return paddedAppend(32, b, p.Y.Bytes()) -} - -// SerializeCompressed serializes a public key in a 33-byte compressed format. -func (p *PublicKey) SerializeCompressed() []byte { - b := make([]byte, 0, PubKeyBytesLenCompressed) - format := pubkeyCompressed - if isOdd(p.Y) { - format |= 0x1 - } - b = append(b, format) - return paddedAppend(32, b, p.X.Bytes()) -} - -// SerializeHybrid serializes a public key in a 65-byte hybrid format. -func (p *PublicKey) SerializeHybrid() []byte { - b := make([]byte, 0, PubKeyBytesLenHybrid) - format := pubkeyHybrid - if isOdd(p.Y) { - format |= 0x1 - } - b = append(b, format) - b = paddedAppend(32, b, p.X.Bytes()) - return paddedAppend(32, b, p.Y.Bytes()) -} - -// IsEqual compares this PublicKey instance to the one passed, returning true if -// both PublicKeys are equivalent. A PublicKey is equivalent to another, if they -// both have the same X and Y coordinate. -func (p *PublicKey) IsEqual(otherPubKey *PublicKey) bool { - return p.X.Cmp(otherPubKey.X) == 0 && - p.Y.Cmp(otherPubKey.Y) == 0 -} - -// paddedAppend appends the src byte slice to dst, returning the new slice. -// If the length of the source is smaller than the passed size, leading zero -// bytes are appended to the dst slice before appending src. -func paddedAppend(size uint, dst, src []byte) []byte { - for i := 0; i < int(size)-len(src); i++ { - dst = append(dst, 0) - } - return append(dst, src...) -} diff --git a/vendor/github.com/btcsuite/btcd/btcec/secp256k1.go b/vendor/github.com/btcsuite/btcd/btcec/secp256k1.go deleted file mode 100644 index 1b1b8179e167..000000000000 --- a/vendor/github.com/btcsuite/btcd/btcec/secp256k1.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) 2015 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package btcec - -// Auto-generated file (see genprecomps.go) -// DO NOT EDIT - -var secp256k1BytePoints = "eJzEwAcjEAwaAOB32NnJzAxRUfYKRUNRymwKDZ/RIEQKTUWUlXbSpkkSyUgpo1SStNNQSEmkhPsZ98D/SV22JPy+0UETkw1YojoYD9z+SKNZij7p55CAQSeXdadRTqgC2CUE4/4QMzCa1MPez4VgcbgEdWYBBqlcxEclw4Qnx3D4YXFIHHwBY3s6Kep9LjjkJtCAQxK99f1FYmv7IKKnCwInyZJsy3hQ/3aajTTfQHZyNP16nUEDiiNoTCeBoEUpL9tlDQe1RLhQWRhMFNbjW2M/1NYYAsmlA5yjbkVzaswhtXcTt6pep+8Vxaj0TgKexLVx/LI8eHJYkwLfiPCJj3+5MeEC+V+ZiIMG5YDZU/h1yVi4eO00n+87BKYLX9O4rtVUvGARjHJ0Bb87J0C5sQqNMjMw+74ihM2Nhllpr2Hv9Gg2+Hyeb22aSyd/vET7nAU0eaYzwYKTdDFEEooERuHQ5cXwveEsNIrmk7ybGcpqVPLOkbuo7aczJGqL0INOdXjyehIe8b4L/9z34YKt17DS9hFvfDwPZgodwoxzmrgn7hC7eyvBE5PNkB+9mFZ/jOLc5+Ls9aMIZ0iMxbUmN8lpRgauUrcm1WQrMHf4hwUZDRTyIIl96mLYqHU/uR+Xg/if9Wjk24zFY3th+JsE+Mh20X+Tu+BY83ma+lwJpFfeQvM3z/i5vDzdbjtAy8cuh/45EmAWKAHmrRdgVX8FiJdc4m2ueSCdZMmjR0pAopANzSwUxkfFgjArrxnimwop0iifJNCWogZzWC5xJTp2HqSFQhvRTK0YX7sqQaG8AJlHD/JP/11YuSiMQD+TDyUU0eSv7ZBxexV8/vIbbUZpwL/N3vTNeje1d+qgWIYTbtg/wAZakrh+4Q1wd3gHiVMuQsUOJbCIGAs5xxneaNtT4I5rVDd/MxbYPOWgZ8X49Nhb0tzcQo8XmoCK5EmuCzhJKdOOsuicbbBYoIyeTVkPHkOO5GAyBrqfA2ttVIG9JSJwNySG0VmH1b/lwR6T5zi+e4C2yP3D4CuVnMU7SFRWG7Jlt8LHLyP52lAl67YGY9Kkm7x7qjA7+IRSbsAHPG3yG29JKYKg0nV06TrDHdgGXoc2kkt6I6nIfOYVt5dBz1A7hudGYlT9aAibu4dV49PowbAlBu4c5qzFY8G75R21l87nD7W/2LwyC+9+MgGPjSas63IMDp7LoZ4zGVh7YQHrvR6CqykXeM5TYficN4qK1wuAbG0TX/g9hfrX93Km6x3w3uiGIQ0HOeKTHxjcSoO01x/J2EcQ5ig4wvPWFNyaZwSbZyaBS3gzmT0tZ9z+Ab66nIKJ18r5YIYR+KRpQ7uTM2h/nYg6pa9hd9sZnO4wB2+HToH33U/w0LIMGN0jA+IzNnDwLwsqOtLF6h+HYNdDS+5+EwHNSxRI+sx2GL9rGpzZqATbfn3CBI87+GrACz9eK+VPh1/yrYSZvG5GC5i4/WOze2KQb6cCcr9buVSxjsrdllJpTDD8gga+fq4MtNxL6feFFn5oL8VXZezBcJkzjf+gzIV/b6K57w7Sk/em4tYo9D4xDNld83DJ0wsgp2kAIn9cufDXfFSQs6TddRHQmcfgQ1ZsmOGPsjrb8cqzdZwooAL/0iNAuSCLSm9eovG+BWxVlwWXh1Ip+sk3tD+2gr7fXk9PCpXA7OwKGHLJwWUTK/h2+HVuyrkE+aKNWL1REa+OO4/99sVoPVcQUs39qEgqBEytM+H8vlcwbs5HbOo6gBtiK3BNFqDUVj/4OUkP9l7bREYLfsG3s1vBVFiP7if18e/YT6C72Rhm3lkDe/PbIeWzEUz2CsG8qH/86Kczbwi4wMfGToSddaPhYYwfKGo2k27qTe4wHAEFWbt43yoPnHJiNuRPeM47Jn8G65WdcHFNEVQHVZLDClcsuSUAG79tpgXNSrTh3AwsCKrhN29m87ap9Ziz/w39do5ARe/jsJ6F4IlpLTcZuZCW0nVSeTgGBcbGw6akJ1y3bREFf9VB1S2zaeOcsbB69gxQUH7Nl4as4d/7o8iO2yhz/DBIikXTK/GN8Co/nEp3C8Gqwp98iWMg6MxJ3L7FhB9pzOINWufg4YoTaOP5FT4IOGLpyVFg5NRFC88NwoO+HvK6oc9dUtHgfqeYprWLgKigC0XPTub4X5qgousD4tWutGayC7b2nMQPk/agu+x1Wqw5gYU9TFn8hCt2LFeH/379hSGzJl4rFAFyzu08c5kmZ60qYrEUExDpPY9D1xyRnMZDfX8vGq8spN5j3nDhyGxYH9aGU+EI+GQcBrWEI7y0qh4GsqShI1ccOns6cOPZQZbXfYbmJ4Zo8o5qXjnPESrvGNH8qgHI2jwKVn8uxxFzgZqGrWj9gfd8R1GNQt2tMGh1JgY9f47T99yDmhQLOCPtzPvudfPCC6FcrefGWnEGuLbqO0+cZkdNL3v43hlnvqmiD49uB2CLfj+IdTrwK8FEwptekP5kO6ovZRKUGgMlZY788/JIMFKzY5Wi52S6qhUHnziQs1wMm/wQwvvBP8H42X0uCnzNprmGsOmIDCVsn4zrnrdA49LTGP/BnR/Oq2Ohjjtc2LkVUh6lQ9hkDfCLXQgs5Yj+5iP4wNypSDIyfP3maD5YN0ASptp8wugwhr9VgKZr4+HDiDfg2pWMGb0PwGJ9KR1KroWYGV/wgV4ap+w3xiOhEiCUqc7l9jXw2T+Vsss1yV/lHqWPuwRFpQfg+BFbPF82gxsVJ8MBvIGx4S9wQs5BtBs7FyvvycLdUX14a6oWmA134Qj5/SD0wxBUs9PgReQknilbTH1pB0A8fT5OeRlKH8yioVtLnnsvCOG1JwSpFQEseWovL5IKhLB4XZzeac4zf8qR5rc6eOHczu3khX6bCHSermS9w/V4WtyV9gXcw9wZV9FGc4CSTtnyvp4x3HF0PB+sGQX/9G6CXIQmDFw4QDq7hSBt7FmQ3/mA45NP0xm5YooddQWXeaqBl/cbeCR1gvf0feVWdUmKNtJCpdRIeNAlTBulp9GCeGlOHaUKhxe2E1YIweJ9ndCW9ZwVW75ziJII7x66wMlV4Rw35ABkYACjre+wTMgTaiYjkDwyD9ZavOYgbwOwc7jMJ2yq+PnWLWzqKg2HFGtxzN8aTtzrxjPWDOAuZSfQmf8c6qwO89jIYzwY0oi5umNhkdRabls2yCdLvWmjtBjUfKwm523m+DDRBbo6a+CLyknIVjaGixkzacchQfp8i3DE76VUEvCOmuJewjWhfZhUfh+/HGtDG9CCMar6TIG/aN5xByz7eB1uunVxb1oKXpbrI/trfVBzbBro71cGiVpHdHHOg9muu+isSB4831pO045H4O3gTlQYskS5r56wX1QcDqz9hA8vrqST42djdeFxXm1YDM+fmcLLxc1o+uw5bEtNQkdpCxCSjcR3uR/wyhxnsJqymIqMP9G70+co+sJT9PqRBtXb/tG8j2YwcLIb6i9fYhnFozjVai34HJmFk12NQKhmNK3XFELZxnykRBWYy5YcM7qGuFadMtKv0ubXHWBiHwWV50rRQXoq/AxdyIbCelDxeT4+tAiGVypb4cQqNfIcCsCitACucijmHTvW06Qae74sJQvzxQw5pcGeT8o2wyxhfYoxCuSLbeYoOOcL2sMk5Jdj8NIUXRAv1IK25UY8VHkOp9kUUn3ACWh/Nxbvve0m75hFIBWxicYPTIS+hlH4TOUwi+dfgps346go2ZQN5t4GrSFnnPCjBTX+0yG/bAFIdNJBv6XStGtxNvpcLKb+2CJ63G0Km1V2Q9P7jbyhypOH4zRg7YwsWDH/CUnfm0a57j1skPUHNxmdZ6Vvj8jxozU+mLmIKEgPrmdPxUl3NTHzzkIQNv5EL/ofcuRZUch3zYL9qzZCx/XvpBegDjM0HtDuAnneoaAIW5/08uFRsnhjyTuQ+2OABcb2sCDKEu/tMwLP9H/QM2ItCMW44r/5M3HOB3v+3WMNi72k8ZTxTrD+Vory80bBzpv25Jz8mXO9rMkrfx9//jWNurZI8T35PLodW4GGg+fgUKIEPA4aD80iIzlavwjCktZg0v5eesIStHFjBtTjdnq/vw+GUjThlWovvtyryLJb1Ehsyj284H6FzixNYnmpIJhx+Asv0XMljUXy4L3DALy0Z5KG92e+ePAJ/St7RHdHrqcEhyL6EZ/NqT9HclOgJNza2Yd9YlV4NXIKfPeNR78dB+GKSSk+fH4X9637jZIb/kF2zmQYP8kY3BSLmMcVgtfwWXzmn8+7LQ0gYHkoSjcrQanPKlolrQwFJIojhaMgcPxVDHe0Q9uj1nyxtodKttWi3p1e2iEXyIVWk8E7T4F9G5ZR7e9OapA3pNrTxyjqzlc4tukw5LlroPm7N9wyj+DR3VR6IrKRphTX4UcbKbRvzcX5759T0CMP0DvdAOpiR3CckjFIRr2j+urbrJs6hS6m/cL3Yy5hh14lrneYzcELnVHnlRyNNJKAFn0nEJXIhQ8ab+hMpgV5FE1Eiews+r03iBJy9rFGshvsnyoCf149Q80Zw7SrPp8WJlXBgYPnQHjiGrrjoMEV0oWkvdcYNy1SB7UnzuDWOMTlPelQ+GkJXJ2hwOPsovCPrS6unl/LKtU7wDBrEuiET+R65dvAEqU04OKD5UaL+e+qOZzTvBOnna7gL7+SuDzGFFaL5YPCtO98RmEY6qf2Qu3dThhrvQa+XbGFrsRNMCQuBQNnteHa0XPgab4f45KXkNNYBZZeXQvHFxmQT7wBPhE7RrXTH9H1lFGwyskWCmRqeWHAdd4sVUz/RtjxqC2n+aXWeojIuMdbR19nse168NimFU3PFuNi1MTtSja44tAuaku/wQuarKAz348tk9pgWpEi7LEsgSsh4zkz9Ao7RrfjbphIL1Kv08gl4bB8zj5+fa0JuvwNoGk7UJ/7R5yz/ywcWrEM1b5mU5jLMpouJMzRAe3YHrqFbi23hT2JQ3xphBU7b9Sl851VYN3/D8eItKPGSD8yTIsB6Wvt9LZeD7Ti0jDWL4ADwlfTjNQJFNvmD817mO70fYCLuQY4oHiCrK8IwpFdpnB5lDV1WpTCiOhC7v3PA1cdtgff/2JoNx/Eb3baEG03Cva4PuDHjYOgdXIT7+1JgENn6lhFwBU/HHgLWC2N55xCoK7DCuzPJ+Bax1oW2joWdpxQIsm/JfDIQpinhSXh67AZtPPkXEpYz3AwxA/EJ/RTzU6kQc9COOcQDHrHCojqPkHa9Me0buprKLlrDqOse2nT+xCWvatAiyNH0J+nJ2hnSxl2bHxKK64O0iqZdn440xhi1ZLhtqEdvEqZyoK7KpDLd+NfBw9UDE5iqV2FMGsgFOSEJ4JXehTtEu4lOQMh1liyGZfWAhY4TSdNhw5eJovsnPOGVDVFYbr1DQpcrwiTm8eh7b/b4P50EZnsE6S25das2BuNad+U0bpEFVblRSDAWLxyVhNnmLry2p3bqaTGmJbNOo8npafy1vtqOCdRBLQmNYPnuSn4qOwWmmgBa0lmYU/4ZZCSFcAdjQf5aB5zzGVFMBbIpH5XF4hZsIY1lk3nBMnjUCWzkiLmT4GFmkGoPlMdzpZpgrnqEkyYIskehf60UWcfB39KpzP6WrBwy0d07bPi+c828PWWUWDSu4ynhEhgo88Y2DpWnrMG7an9vjYemGlAY23rsPPsR9qrNQnUvfIgeJEhOtZr823rG7Bw0Bg9d6fz5FP9YBv0k7QHz+MpT3OQ3FXH4RZHMXFVC78xSILYHVW0LuYSD8oeo5ifjbzhYCDkxwnAt/P+fP5kFUhefEjSUhfoRMEhKM2dDDA5iyLFx9CGCdXYJ6AN6Se+wMXF5qRsMEQaK/6hz6OrULfelmJaHnFR6xDBf+u5sFkGivMtUfZcGBXZPMFNzUVQgXu43ns9LP/1DjN+BELv3R6qadeBJbIp5Nd3H4bbc2l3705oK+nG7dK/SGxpJCqFPMCfE6ogMxtg67xE+vOqEZ+vqePImyWstU4STp2y52tiL/jmjl1gGfsc924zh/saC7A6u4PSAiaQSl4jr9tvQEaoxyd8dejZMnf+nFwCGY3KcNM0iSo2a8AP/XCefi4Wo7dIsGVBAW0x7sNX1z+z3jgVdNYxgsGh31TRvg+X/2dMU0oLYd3f+/D21VbU1BAhLceL1P5DBgQdbeDPjnScpzUS6c1o5uQJMBdyqfpFFwqlZoGuuzvJhKRA7nsBkNH5TEZXDGjjwmvgZO8HlVJp5DJtIz+tOAy9dxroyOvHXH7LEAbSz2KH4xg+7nWczzqnQsl4IVAyAPAYo4OJv5/Sm7xQLGmTgvPndWmXSwl/rd9DVQbAk39Mh64AVVS9dIdCs5XpYcc6tG9UAinpNr65OR3WRP1j+TIxlCp/R53vK0h0WwNsdhnkNc+8WcTRDnqOTOXFDX8g9YIptejak0y3C/06HokCvmuxq1MZJQ98pe/ZRrBjqQcq7raHCHUviqxYwnWjbLkv7R++WP8eo1uaMTRwP0pIyEL9xOPgrb6Ifrz5y4oZx3CfqwCaCdZj+1Uv9nv6A3RnHKbN//ShpeYvZg1o4O2hXvawEiHb8f3Yb/0aqOwlJg8WQmWdBLzdYgBxSk85ulAX7w4GYEjxTDafGoVd7zLx3varELS9ik5XddMxG11wa9/NxmbaXHqkjL0uhrLamFH8aaUVdN2bi4eWn0dj24lQ3iAEuiplOEbjIYVHvAG7BSZEtzxxWl07r5nymsWWvaKyzm+gOk4PzmVbkes1La5TzMcEn0A42tZDuztPQ8rOGbgqrRHLTj+Ghy/lQK/iIJTcrsb3L1tZXOsGzFleB1dP3aUhnc88alCGdsQ+JQHV8RCb4AnKLwtAZNN5sttviEF972hOQjLaSmZwuGwPS/puQdvrxuBjpIViIb9xh/4viqux4ME58mBVbs03NhA/s3TktD8n+NFofUj6o0s/zgmRispiPOl5liJPGKNoz2z8MS6M1Eakw5TjodjaMxI0c7+T8ovTMHp3OMXtHQVrkh+A+O+TOGKMII5zWosVovPBTtAMjm88B5cOrUG3RITp2QcRqJKzMmMg4cx2Mp3swBkX6rHunCAUKIhS9KIIqp5UhaqkTZ0/kqj+kAF0uu/hfXsEufzoT9x7VQzmfPXBmfp9sDptDTTI/sBPq9+BwUcBLl+lT8m509msJxAuNevAkehWWu5Uxsei39OB4t/QNmsdBcF9iDmgQEIXbHi5yBwaLpKFD3SIV4ic59Zocy7UuMtflqfw6ylt+CtmiPY7IEt/vUUrvxJ0xyXDEcFBMh4lT2ceRPJje026fEyKVfsyueFZK5xVLKb5K1Qgr2sSOkdMROXUu7ypTZpsbW6QTqc6j2vaiSH+d8nVU4ZGaxmD8Ull8Io7BrMt9qDVolxYvHoBbDqew8villP/rJPYIaQEd0qEYbpZL8h8loAwBS/2/5yCPae30qK6ibBw5wFyi8uEmKMP4YqpCjTa/uWek+9oRsN22iJ8FfvbtXnBjBsgqRKGA2gPDTo32P+THbT23wfBrjg6WP+NfNcks/OucZioGoY1ZxwAQlToUXEduB0ThdQx12hFzisqlz+H6zx7sGS4iMxedGPuZFt0D8rGb/YiJKosD97+8RgbEcmBe2NxzAY1uH3OEIdS36Pajrd0QMYEOyvzKOakAbwrMMOo8F5o4ilwwHALSa05C5Vm1yBo71rmxedQKPgIrSlQh8Z76mzkqQC2kxsocclo3ny4mLwy16D9QDkK3OmnP0FZVK8pCQWXflBPaDwEdo/CQZ/ZtOi/zSQXupyjhlfDlru7aajKmZJvjoO021GwoaCB3947SQ7vZ5Lzj+3sf1KYF0qMorKgPxA0LpTDpBTBZb8ja9RYoG/HffbUK8DE7w3wzFWLrqbcheDqRhKVGaZVj4VA4/53EjqlRH+vmqGtUiX1q9vA46I+dFRBElgaB877R4LJSTloGtqHR6y1cKD7IiW6rsNNv3/Q/jgbfHEhlAS/leHs4WA43ToJmoyOgEHUC5w+Q4LuriiF9tofmPtagn4ts+eDd6PJ/89JSvQUBi/vaygQWcDzfTfQz5QJPOh2nKVWTYIZj5bj/NnHqWR/B/V6WQC8P4dNEmGwUjsXujclc6hCJkfRO9is2AYnWB6sFklxwFttiJ3rxjLKySzbWEJzFv9kYa1xRHOfUO+cPBQ5kg21oa74afJoeLdjJObgUgiQP8WtmR5sJzKTRgrV8I3trzEk/QgUZ8zCdyNF4dDVGM5a/xsWbFuKN7ZehKSXkynI5xgPO9TB99BGaP0XQct6zaCkbgfuPNNGBsPtcHr3CLCd/gVztgiB9pZIVh8hjNU9I+igyCjoh19kavETbqicZj+vOg5+lsNjdKPR5tcWNk39y+bi47guXhY8vlSyR00LfHeYyw9/5PCK206k6aIFpU+Xc6TkQir+dBgMdY3hj2YOeUZGUlLKOuy7tJQd0ifT15Br5JZSx1Z/BFGu/zn+jgD4u2QsClaFs+qIYnB1d8fJjT189FUo0/F8EI4YxJshlrh1kyjEa9ZgfNgXujMxlwwMh0DV4iYlpttTzswMtto+heJkQ/hLhBboP6iAUy810UDNg10Wi5DNukD4UC2GpRfkaL5EGoody4egXFlYYCSLEroTObCzA7+UPKWnJ13xy9B5Lqr1wrzQdWD4MZd7k4xg/K8fvLbuARfsaWe347Yg/KwQvofIgrf8cTbfo44Xtg1y8FplECmVIqdL4hS+4i/b6g/x7KtisG4J4lQvTzpw8ySdnaaGF34DVIn/w4Tgbqp6vo5m5baRwcg++L5iAs3f/gvb7dbz2Yse9PPyeNg3NAei6qai/I9qzrVU4559OyhyZDX/zh6BpWfNSb3hDm04YwjpC4O43rcM/P08YWtNG0+4oYul99uw91sVJvZrQ4ptHOkLq8AjtRzau+EsqodroI/FZHz6O4XGFs+mTv/bcFN9EKvL1TgyXRAmTtECepBAfpiGrc3ucPngSL7+nyca1v6FruCvZLaxEbRfASxUs4U0z9UwatoZMPEi6G8OgUE7Qb7xOZYKe7bTgyu3accNG5gQvgkXPNXGzz+O4eAXc0xXjqT4Td1wTu86diyYCSZpkvjMVQ5w6BBKmUdz/5ZafB11kU/M1UeXbWV0b9FVeKh8Cn2jBPm+rDQcMSzD171/WWiXACfeYjBXHWad7WN46Mse9vGqRXVjVdgwXhYMStQh9GYURcv1Q/OyXu4aDMb+PGkUq1xKO34k4JrxF1lTXgNObdNlU0EFytmpgk/VnSjoXyyvnBmA5lZOsOJrOO4alY3D/mLwyFARvzkmUMWfN9jwRwNcl/nQgq3feWVWNPi9CIBSjRk8skAHssaKs3zgZ8jZu5ciPARheVkxFkyt4sv1e1grLwJaTIdpV78MTJYx4UzF/9Ch9D/cpzYRDutowREvT/pstpla9yZweZg4TZ8hDzUi0jR8WxWb6jdwmmwy5D1R53IpDdR/4QZna9fAxreV7J0jDRWNg3DHrxryNt6i5MMvYeRFHXSo6OU2NRuou7EFfkWWkeEzSWhCM1KNW4CuwUUg6vsWNuw0IInnM2h7wwDgVQ+oc96NLf8ZQMyBedh16Bk/ebUYTma+419NK8lWWBtypk3DFafaYQg28KtltrD1mD3c+KFEkYsJvY794qp3pTx6Whp+9d0NeT0lYHBFk5INR4KR1D1YmCcGH6ep8BGxbpI6cx7UZh/jjI7jcHqLMR5ODOdJt5RB/YYS9+k8gL2+jdS7+Cjd19zGK8wEqGz9ODQIzqf5zdVsfkoZYq49gcTdRdQnboihom/IIOsf+GmPht6VEnB8x0sIuniaLvbbgaRzK553nsPXn9/jZg97fFXWTyK/z2Nifzb3CZjBB1dlHq+qCHywhX2fH+LSE0b44fsOOD0YQQ6RAaz3QAgsy1XxY/V9HtcF8JxsQMfrLJ5vP0qCJjNQ/3IJKKpkclmtJ/k452CCZR69djOBmXKuYCaRAl3bD+Cb7BTwOnqZyq3i6EDTUS4LVuD4f1F0qkoFEhe/xB7dyaAg9xSGzwzTldp3kCqeTmPGL8c9N7VwVEoy9jmYwfDUNXSjzwla6BY6l7VzzDs/WnVkH14LnMCnLDJBxWmAp8+fBGYLRUnu+wO6apnJMv2OvOWlMyQtckGLiSKgV7wP5tU5QNE7AzhrIMTiodawJtIKtK6qU1J7Ahh06ZBLlw1aBZyDWx810ChJD65VB8N++zB+djmB7Mdug+D1viA2bMXWIWb0bas9as7+QrbtemAdYMRO2bdYR66O7Mq0WH76QoZWBZRYMYpmeM0jpY5kLr4wAuwOniMNrSOgGicC7k3LaPw4e9j/bATpFq/A9OxZoOszH6zmGsDyxePY85ATu1RV4Mlfg1zVupT8EgKwJMGOyzc1UH3/VhxzSATWikwEv9V6JBj9DU1vmuODKEn8uSmKtk+7x1dtzyIrPefvh7Tgn4ItnB7WwDMHjMi2IYRNx5qTxuJzYPn4Al/pbCEXm376uUoMypY/RpEZiVR+0RrnuqvQA6UF2Ot/DQWufkW50Psst1qHK5R0QTCjjEISb8KKj53skL4AI+JmwHurM3R19zQI++EDcl5xVLNHFhaIj+bW559RoHs37Dn0Htf+O8NT+vJR9dY/kBdwBzeFUhIKlACHJYHc1eGEUwLEMVRkER5YYoMe73+ha6wcmd28wmeVzUjm9kRozP4Ei1TmUEqgApqLFFPdyNFUuU0RLwSNwUd+ffzhqT4/6CbY+HgEDFvdgvjsN+QjaUXujbvpd9hatv79FJRt7qHljAjav8AM4qQfUpJlMVUXfuTfHw1A/pkI+dzfj2P9bQG3n8E2D3lOO60C5hn1MLb1Je8KeYWmYy+wkP0kbHEeQR+vOdIk4XUgbbwX2vfYgqHsErS6vJcjElP4vkQwCnYVc+qHZWgsN8xfjD5xXU8LXJqnCuETC1DhVhZ/TxBnL3Vlbrpjg0eu99DbB+X4ULwd1ffPhDunZODKrFrInpCL0tY9qDK+CvYkTmf9ugqOHPwGU72mQV7BC9jnrgvTbq2GWc7yMCDhQUYzLoHmqhtQKvkftj1fh49eE1jckUSpP3IQ/lwcr9b7wO1PWhjnuwNnfrCn2N9bQEhchR+d8MU2cX8wtVODV09MYDhgImqLjaUvcZZ4WucrPO7S5oZFAzzXzJPHNGzmBSNF4cAKRfJ2FIQ3G3QwZmEIy0z5D9ZXjgTvKH0qcFuIT1OXUqqbJJheDIVfH0pwUeMXtP5dT/P8Aili7Eoc88UPQrqmw85NnVB7Uh0Kc+bipdZu7N7zjmPWJ9AiOS04eSicTdOl6ZhPDu20UCXPc4IwPt6E/IQyob8mDNODL6Dwlxw+576Cg4K+ceXqLu7+nE2pXWYweu8ahBfbUKt+Hy3+sxNzX1aS+IPleMUZ2E3kDuyb4AXLHA2hY4U6xC+6xxamD/iRwSC9GN2Huo77UHG1Hxpv2gxiPrVsYz8Suj6pMu+y4Mf5x7B7oiov2XEK60SrIVhnIW3doUiCjzyw22YsaH6opXiZZ5z16RArnWumc0V5dGTaLtIheb77dwtl2Kexap8pXEkygvXXxDh5337UmeoOI7dX8zLVtfRnwhwMOiqLJbN9IM9VFu4Uv4GJSfeZl6qzi1MmNm1Lx+9l7vhsVjS+ExmkJ+s8+NjiEWCSmQ7Psx3o9t4eStjsSQMCnuRtsoddxwfiWLeLMOWzLenmG8E1l/Gc3imJ4/TfYfmCs3Trayt/nmULTy5Ysu+d+dD3JR/+3B4JfkXidH7qT5TUKYJlBpdwkk4mh+ot5/WXNHCK0A5wmrCIIl8rg96S07DySyHmrqwgT+NQWLlsOv/Qmg5JOnsp3iIBm4S7QU1FEowz7vE8jw66HrsW5rYr8fRrnXBLYi/7u/Rgp9lOOLU+AL68FYM8odPcqWBH54/8YvB2YqcjV/m87Sj+Lv8Zv7r+40/JhPqKFrBG5jxO/TSD6gr9eUZTBkXkzIOZDR9p8sxr3PPuOOlVncIIQQHwWZSIDXOcwTNuF/+pm0v3386mU9MWcva7mzx64BJX2O2BbYtt4eDB6bBQQobu7fUly2ADEJw0irdpFhObV0F6Qi6GzdoGQpbWELLhA31ZkED52p/g7h9R+rbbgnw+R8E+vUTsnykKtW0FbP9oLBRsO4Jmm1tIueMVjP8rTfJ6nnCowo/iFMrZrLYePsZao+lyDWjcIEI1XoNoJeuDTRvf4tdDm9DpnBadHrUHFpI1Twz7SYpS4rAnqocjd/eT09qPnGVyEJXrH0LTiWNYdtuTVGYF80qdDJK8ZwoxheocrtqNJxpUmBPHY/C5O7T9vTWYBM7Bl8cuw/cQUVaMUIC0zkwy6f0G1s3R6G13k7Y3f2T7wZH010gMP/fEk97kRdgfYAQR9uXklr4MDeUm4NF1IRQ2uI6Mr92hKoUGymjyIttCKZYKV4WS7CJ4h81Y1zmWLC5Z8+2RP3iR2RkOTp/OQsvO8tLx3zl/N4H4QuKbv+bArrDvMHdfPa5cYw1JlpGUpf8OqxyUUT84lOKkCVZ/O0y7o/eB+0orXrLEEeqPn6F3UWLUlu5Jj7d3oMRvA3yePBIe+rXw1ZtP8dhywKCN59BZxYVudcnwP5kz8CrRFN+ctsRHvnog16tO7luOUXTgXTYKMscFEnPAaUIKX628hiHGSqyX/pzLFUdAQfwtDDdWwuJGQaideoLSVh+BctHNZJY1CeMnnKDzs/TAao4C3BDdCv7RV3GDSA1uvVpPN9wncfVxHaqfpc8lU314tb0zd64SAHfXV5S04Cwr/nChml5vmGU2TFuif2IoNtH1wJlwR0ATOzN0IHvfHl73Xz9+/bkIPepNMOHlPq6cuB1zZ+2HKpuF+GPFarq6ygZyg89D3oijsFYtk/z76klF8xKtjTSkoBOH2fRPOix4NpokbhnCdNGPdLl3Gmj55vM4Gy0+2iIPM8+24/yEjfRmuhNOmuMCrjJSICnrznJXq/EKH4DWuTnUKT4WFjyI4cahx2y6zATnKb3g1iZFUJBcDR807cDt2TE2rWzArONq2H9rBHVmiEIOx+KlUZfozjgJCNtew38UH+OR762wtfEqnswCtJ0ezoMuTWQ/zY/EK0fCYWMRqHuXRuOwGuUWx4LaGmW84JpMG4cswX2HJzhcaiOTZn+YeV8O1uzXA8ueLfhxtAmoP5hDyqsqWKfvOmToB/Na50m43UuUr/7RBopexYVKomBuq4UdswTZ2m86+G5Vgjx1Gxqec56b3ETwQaApbDZ8QycGAyCr/gL9Pr6WvkREwIigJVztNArcrEaxiZ0AnFS2gt2pIvD8Rx+KrWjDto5UqD7/HXx0pvCT4S5+Hx+EOee3oVjACIg1iKWJ4bvRXsOZS8rvUuLaFehffonC+73ofq8ONwx3oNrc0RCl/BaX9u8BHs6hzkm7qE97CC7diYD23GYq2aqB5dqBpKVjAVP+OeAS3xLqS1iA/l5/QbTKGGuOBpDGthQsbDmLwVYRKDrCAvLUN/C8M9tYNzQa5qmuZZfez7x4wJeevqkFnT0XYY94A5fb20LRQA+3Wm2DHvu3ODmnmN4c0GSzS22wJVeOv0j14ouJjVDeqQd/o5dTe6gbden24TEvH5h6tJQD512AqpfCuHOmLydm6+Bo14nw1zcMJP6lYfywEBuKXuV9WXkgOuI5L5WShDCTJm4dOZte39KHP/P7eM5GGdLICYTQVz30zLEG5UVmcqTERHRL0kPXwJvYXq0Fkw+mcuVHLXqZ+5Oj9G1x0rAIfL9+G7oDNEncIIu6nVr4wyNFkHrcjsuLptEnwfGUIODDS/T2ooj/IqA1apTj8QfmjfhLWU4TwKJwKk1Sb0F35wsoU7aFjpuPJf1oP6pTUOE7rtPBxnIuL/UxAhg7kia0TaeE/Qc4QlYO+lQ6GFe9wgnRB7ETMsl6ejk1yBhBfGgN51xaysedI6g9YxBVF72FpU8/cZzRTLhZ503vLRdjTvcEsHQcgjHX7vH1e9KoleZGBlu6SS/4GsxNz+fcu/ugXmcLuxQZgE3KfkovbwPPMWo87/RF0oiI5M2P/FjbtpLDb0+n6uQzHJMvDHXnN8GLowc5a7kpOkVr06xeV1y0cg3ZWhTh5cQf0DQwD0IkROHDp1S4ecKC7ucvgdov62ly5mhesHo/BB1QpaOtl/i/xmcgdEQGRhw4zMV6feDffQV07Afxv/m2KO+xEaRO78RdHjH0RqEetzYxDMxdj3sv+JCDdADLCyVhm+4YcN75l5eMlILb8VvZ+pIviOaNh6Q/41gkZhSOtHoLu/ZfYtHDSjhTWxG3/XFDj8ND0JLzgXQdR8OBPSF8xbMd6qIusXCHI0nXqEDExnreVdPNdvqxvDH3FT9zEoM/sX9RV3UjxhskkVRBAa+VPkfpo2bz3ZQC0vQOAu9fNdh4Sgom3vZH+YG3nJKcAEevC4CfZCQtOfyYQnA/3pr3kG/f+8a/ZW1BeIILnr4uy6NPRrHz81ienO6IyyVkcGTrUmwwcaAJzkboECUHPxf0o//KWhzpKYUXetzB+IMwZA95QWe5Nka9aqFZl87TNmE7WHtGEy97T8J3MyZy5jkCQbsSWOj2jM3X9cNaa0mcssqRw10IFh2IxLdVu9Gg5yvUrpOirVmzSOLhObjnZkWd38Lg9/YfcO+eMnRN1ueIKfFQO/8sbbCOxC+Vw3Th1FoaUZhIo2685LnbemDQQxL+7PjOOhZT+MU+a9wpXYgf1huyufQrvLFrLcaOk6MqEy/4Ugugn7YXhpLcKdXPCC59m0yrzjXSuqPVdFlyiB88q+OOwTuUXKEKd97NA9sqa6oOEkKZBaYoZLKTdUVi8W/BSrKN0qAXRQlkOcMCIu7pgUfsU/jIeVRxeCzubMmGyF++ZObynF2Um1kgto9fSBtB6POZZNN+gNxuHgIvVQ2Kd+nHzJRwFEtshAiFCNZ4v4YDwtRB+6kJHQ+rhsDjmhz6rhqPXjwMWSYaWKyggMJyN1nh937W/W88LIs5CzfnWvCsCmFK3j2Rur9FceVvRbT/MwJ+vani0gvZ/LtAHw74X8bMHV9IuX03em6zYsXEJj5rmMoiwTnwV/gTKeMSPK8nADZ9n0ggthj2vnBj7dPX8Mh4Mz4l8xKNoz7A+9WfqOjFTagUFwT9wkdkM8OV3FdJ0Mi7wdQRlQFL3Pei1kkhDlQ6Stu+hOOijZbQ8rGPXh52h+2nZpOg2RyUnDQTBzO8qWNLJeZfugk516vQS1gayt6Z4APnXWDnsY2a22bStlW5PErtAybsGwUr99/BjL+ptHuaPqTf1aYrxevoz8kSlLrri+4X5PGsmAwvrjCmBi1h6HAe5tGnNWHd7q0w+uNnrP19gN6u0eS2kNWYOkEdM3Uk2EZsBTz0M8IdClZwq0oEey/nsL+DCH/Te0DzIB1+Sc7HjDeJHLNzIcg3P0PZp2pg77qAhI2swf74eNpsdgRGztsFn9ssuexGDzZvL+Wd+nGwz3YMhF27SwUbFfHArChW8kqiUxVTuaLyEMY5zCCFec4QfCqF2m6YQ9+XRnhU8B5rFCWxc+omrvU2hoyOe+h75jq6LXLlIMNiuBQ1ESRKbemAsSU9PHkPzaZehANuOWy5vIebEm6ir/1nTrK5C4EjDKC09iS+n3+FTcep4t6zAmzaqcbZe+L5r2kymm+LRp/K/VC8wRQ+TA+iFypHWHu0Fu/zvELCVi78sbGQYyz0YWbPH9o9aS55ndCCWQeGeNOAO341VsRpkWtYInsuFs0J5zVdWVhzS4QuuI+G5+ONoS3HktPL3nLDpl8sY6yA2wssONhmiKOzK3EoZRlc+64G9MQUUH8/rDa8RxUWJ8BHawEd113C0y1mAbc3UJhuHC+acQk2RI6D96nZeDi/CjNkQ+Hf5500d0IlexpMovhaHVTXWgRiLj94eJkIpK9MIIX+R3TXswf85rdA/0FFeu3+hJbE3WTHok10SOgXVvyVgeJMc7SLLaWXQfm437SfF+7u4paSHNqR/wyd18bSsWQpXrZ2NORGpmCYey1eb7fD2iW5pP83n+q/xdCRi81sXzUX9D++Qh1jM7hprU9trlt588AaGGdZAGHxj/Hu1gTw/WfIi6WKwFb1LQ/ftQW5VEeQ+DlAAknHMMsPWPPwQuglH/yz9RS9E9bBq4HX4eQaG0i1rqVX51qx4oAs6OZVU3btT/bQE+dijVz01XpA0pp/aF26MoRqaGLwd3PwtNxLk3a3cyX30qclSnh57HuIzWmi6covccdaRbgSl41PV/6Cdf98UOi+BvhvWgOjz6uAUEg/q6lM4ztNi+CClBGs0JLAgUmnUE3qOJWrzuPndhXgbPaI0j4OkkOaKGw41c9JfbYw40Q8+7/fht+N8+iU7zhQqbsOT+pVUailmRtnCaIT3ob7I8TBM+s8KAdeh54/x6HorxwNv4uHO4vOsvS8bN5i8g+/fn8Gy9uFoWhbJHuOD8Q3uoN8KHwcng6xp1HzbCjG4A6eL5uBaePzuclODTYO+3JZsD+cX90N0YurYeUROziT+YrqvurBTpkIPrjRkQ2PaUCLmho42x2msGnBpP87Bj7MEKJYqRO4rNcOGmYLQ4RjBC4SYVhxcRNPdTqICoHM8a0GZDpKBhcHZkL44ymokXOF9q3S5y51VahLqOYfg1vp2+d2sjYrQDokBM1fXtOK+cms1LqT7pt9wKiRdqC9axW3Z7uxvXUrqI7VQ9nkX9C+QokKnwbAR3cNzDecDqEVijCQr4C3LzpS//2/NHzXnzIEjtHzJzcgS+0Wge1+rq1U4TtxsrBONxvK83z49L+3pNbzjub81YW+kghsnryPAhpL0TxmMR5faQv326s4RaGLBp+6cXLFbmidK8lr2v2gpmsjxZqco5aaZdj2Rw1mlTbhLcWPvCo6ixwvrYCfOVoQs/ErtnnOxqkRa9m7dQBClmtBnMUp0P1njTaXd9LEW0hbIj2556UQ9Ow5hMm+P1hM8TsHh+hD9/4xpLPBFKI8vGGU/xAuihvm9lgvWLomkjtmrwff6m8sUWsHn+wkoWy0Ll9/mo6nPR7zGkN9+tB2HK+E6XGOw3teW5JJlW7CIFyiBe+lH4Df7HPUcTCE/yt7Qeo33rP54ZP4eMVVUFsegV+f6cHMAUtQOlwPT+4UkNp3W5qSdQEDnt6j/+qc4dKGWtynmwqGsRqw2HkMTHdLo7a3wvQ5vo2OGd0id/f5oHTzCzq7+GPe5BncbKADxd+vsOBfb5rsLAVNkgtJaHE/fXIJgqojy9kh5hRVt6vhZ0k1eP/TmLUFq6Do9io6MLUbfU+48M6UbMpXzES+sZ8mHT6L16aPgKnr3nBPRh4Zyjbgw6mpuGzMbFaoVIVU42R41LIEO1gLfXN0QCI0A8YUNeOnu760cUs5/X2wEiPXR0GavgN5bn0PmrmOKPB0JExd+ZAr5e+z5NfXULBUhbpnipN79AEeqP1Hx4vKuPafG86xFQXJJhcKNzOExpNfcUDeGb7KG2Kh2QnsfrmcatorYWz+E1KbLwtTPL6Q9Q9d7j9qSnt9n9CNmeH8q8OBTHYMQ/HlTPbti4YxUpNhs2IIhUV8xQWdV3Co8zc0lE4Eb/8gsjp9kJe4J+OW44JgftEabj09Bjfqj5CclBakbb+AIv3T+HXIK5r6UIte/dbFF3r9fH2kJvyn95jMH2cxDflxjXoJf3MLwglp9/FhbQdNfpYIEraeaPSfOJh7C+L7BqTMHY84SdmFiiILMHSsE7nnJsENXVFapVnB9h9GQJe5CU3JWUovr57ib5e3cajYPd6q3sEBT7ai9KTZoG98FurOi8Gs9D7E7XGYme4MJTBIY6r0+X6BB6d5RoFL/FRcp3+CbyRJQ4B5HP4MSMecA4fRPHECH1b5Tk+7loFuXghE3rGF5okypPrCBiJ1wiBp9z56HbWN7xj9R1fDp1CHxXOsVDeEOFl72vXfOO4rQZCJfMgfz+nhAs+xHPW5E2p0m6F6Uz65l/8hWfW/4CTpyGq3jWGHdQioJH6lXe9+Ue5thvWrDCiyZjG8Cytm54J2/n55BclNsoT6Unu6uVgPOz4o0YKJZqj1RhR+aemzjWQlTug/SdoQhfM2mEBB83e6oBfFW48Qac4po6k7SsDyngibC8dQdsRFNMm6DpF35UE2Qxe27V/P2YGfucn4LXuG5VLXQSe4fzcCVB6EQl3RN65cLwm/3rZDqpIeVS1dDUZxt7ApJYTzZ3wg23HnWH3hd9gd/gnHlE+G0NjDPC34L341z+f8hj7Qt9qAH7bfoIJ+M+ypeYdN/jJosVkAHoybgBYFidgd5YHO8zSxdbo4P+MgIi7G/dpu6HdSDcWHBUHDZjTMPC5Mj1KFwHaELj9Ou4YOIS7sGRvME7u/0RbfUxCeqgLLLJ/BwMe/ILXFEOoe+ZLx/Cf8rVcMBkbtgxW6AzAmRoIrtk8C0UdRNEVoNcgcV8KoEm1smF8PgyIe2FhjC1ahQ1D65xAKHxoDGt820FX3l+gVaMlLX33kVNlA2vtSnzZKq5BZ7DwYXOcNofc1QFCT+eyK97B6Ry47u4lR/zp3HgpFqEjPQwrz5eikKpo7DeHr2gp2eHURVJ7lsWy8LFgcSKXEZYzWn5eQw9soyC/spSXXDCBnqw1hOdOTeB1QXf+Sno/YAvWTw+lL7QHye+JGdiE+lLNWAuxNp8DNOT6wW8kAlrx9B6rdYyBtZCmz1BD5RVjTQPN7qPYzA3VZB1jXvgdNvjhxje9D+q5zH5sDX8PsvAf0Uu4B5ktvpgd/7aCS3PBISCW1x35k3cJZeGnoLLnEjaCt4wQ4UWUdRe9swOBZI0HhowlsnfAAl7+6BjQojSkJE0Ah4xo5t5fA2EQr+ChbRqs87ODubSPMKToA8SPkaPWOqWza8wAywlPwQ8p6wIe7UWrNWRrVoQz+Xrmg9ViFSk/2kb9vC8jGf6NV21Zz2N9KejL5FBdHJfKK2XLwO2oBfbobgMukAnF4khdvCrKiCqGf7OT/lnfnOkHpwj+0wkAQcoXmw91+Ffjy4AP5JC4E+6er8dO6ieD9UgxaxJbg71p5snC2g7LsH/zVyBsnLL2MXWW6MOH2Y1K+voCmPkik8HM3WaO2nf1PyUCRQA0+KJCjDcNzofNgKyU/bkAPp3moqU5wyPw3Hm0RpJ8gD1PjWqH5ciEvfhTIn0S2kuDSbuoSuI8j9Tw4bKkbuMknwtxFMtBimEaFa8LoXuowJ6WchuVrf4DH1REwX+g1nHFwhCq/vyw8VRu+OgqgrP41Thb2pEwBOR4OHkCPxSP4fsUuTpnojQE5KbhASwhmKDjT9oJhOh+6CvJlSuG/bwvpLJRwW+Jtahhahrvc1KChheHEsuM0oJmK906WYpfzM6o0fY8zS5WoaGYVRd2o5mHtbqQeAaidNZPfvHjMseX2uOv1JDgtsQh/LZkPootOkfIlVz6aGYVgoAxhtj3wlX7AbTMnNFCs5LSeXrgvugvbyl5xyC1/bsnR5p/7AETPLWUf7/0srSnCCU6ZPEdXjzTf76CtazfAlfwCXK+SCQXetjDas4yUo4bwS0AY7lz5mTMxnzWfnGLNJeHw07gY2t/28Nu3BI4KMfDJcAWvv5+KVqOXwFENW/Tw96MfK4TZwCKc96TXYOBpA5gYLU6WzUkw7SJTirE2q/5TItm+taC6YicOCdfSWNUL/G6CNkTOaMa6N9Kw17UVS0yPs2znM3iqfwqFlmykx0/PU13mGRqWFoVWY080vp4MWjH3+aFaGf52CaZkyxespdgMjXdWYuWpXbgkUxfyV/YQCN0F73wnXB4wgro6otC5yQpvLAvk/jF3OKFajXtmacOdoDV0Z/R9zlSOh9obsRjgEQBnC/9H3H0oAqGoAQD+h2SECElG0rJ3iWSkQSWzIlIJiVKc0tKk0qAdQkZJKRlZmZXKigYlaSojJYmWcB/jPsm3kX9kXGCF1e/IonYXqdwaAQ2VXRD3PpdOtgXxg6AjcP5+FvyLVeMXIhFAViX0s/AkzbDQA6dYa27fNoeP+EsAujTjIZMFFGEQy/FSd+mY3lEeoeCAs+tmQeF+c2i++Jabwo9Qbug/misQwmlrXPl4x33coH6ZLpsN4OGfhhDrZ47H7/3GmQl76fPPU5i2vYqln9nBn+2B8EfBE06uGOLlcQzBcatJzsQMLIIGqb2pEyyuTccHYw7RM2sz/JgoDqqTNdFilxzMsfvGd/6W8qU5+/hMYB+J9QUTHFvE9x4r4Q+9BD4xd4B2nR4BU5ZZk3/rTdS6KwA7Hw2h4fql0KHjTiPL9sLlSg94szgKpx+aBKV/d2Jn5ST2EvXBiPr/cPElMTB1AxQ9EkRBE1dx6/4oCPMwhaUfb+PawO0gu3wa3V85Cwd2fYdmj/e0OtyV8lsiYa6lMeQvloOhBARbgXRctF8D7285Bdofj+InzS/cvX4VzC93hpvaOrDDfRwY/DvD0w/108IEc5CrNabHd5ZT2D0LWv9yPOb0zOM6tz10/5Ya6KV6UpdNP+z4oI6bopfzguEGXLe8h7a6LKZb++u5dFkM8NMR4D+7DRICSrhTfRl/3R5KnqsGuWvgF2/uqYee3UCCXjo0XUMWlhXtBMNUQRIrngOO1WmU9d9KWiqagNkn13LF8WA22XAOT9aLwS+/IPbpvYM+PxTATSYYwuI30TKVbjp6vxiLe1ox9ugQc7gqrHabSuc6PoLx5ygKKwnlef/s0FUomd7t7oKRqz+w9dkvIHJSC8z3TeCOwD88+UIinrJfChnjb9A9kzpqPf+X0s7dhaU3csk81wxmvF4MV4W8uVllMT3WngaH+/SxtvQVtcqMBdEZnzhUdTn+KTKEdxqv4GlBKcf8e0WLZUroRrYPfrlcg4bfithy63m4nxFFmn+0wcs1ArQXG2DY1xdwc/gprzi/HJc0J9DfGl3qOBGFl8/nkGqtKez56QgGBjrQ7mDCe/ILyf5XMn59epFHV88k/WkxnF55EmZXysEuI3n26PiItgWX6XKhFI12fYe9665hkVkXdHm/oL9vfsBEWYCw0Yrw2FUVpEX0OfvsUopL0eY0CT1c4zgSD1y5SR5px3DZaXVYFZuBaY86uKXZg1V7ZUg+KIl3/+rgi2HuIJ/WQUWnPHixtTmobvXj2H33+b1GJb4YJ89xZ/+gzVEvztSpwdO360hiTwq8nDsT7sxbT38eC/FBtW7OFrBlJ+VWOFNKWNNzH4/sfIjCXxQZ9wuBYFwc5Wq8oMTXxuBQc5HnjBfB5KoMat3mTFXhJzDjzU0KmSsMmS8C+LU9YsVEAz68ZTl8KNLCZaPOkPvmcP5w+CqLeB2AxA5F2Mdy+ClUBVJnnoSKtli2inrBfclbuXFZJb29yVQx4TKZnjGDRR1XqaZxLZ/zecbvT9aC+9zxNGWlI/YMfsLAx9tw0PUMO6sYQVXZVV7uPQAhuIi33Tfgu3XZJLdECiXCvoFfylJwXeIJIbqjQcRYGuV79mBabjaI9ZrjuOm1+E24AJysX0K//y6Sr29CkU/ykJesy/deIv/NUscVc8+jcdYoask5jE2Xn1OU7l5Mu+XH1dKy8EvAANeWnIcNUy5A0eRe+HC/itx+jMGYsLFQEXUQrv2KA8H/1GGU0TH+LOnOatOlof5WK3R9jYPTLRa8KeI16Mt3wodhF37mPRkMF0iA9/ksuG5fTxKjHnC25TG2/mqKhoryYNmGXCeyGkI2KsCPBwuwa9ANFNq1+OVAAcWd9Wf/fmPYfmYLsrMYhiqu56NlimD4yIbv7cokfU85iPQzwOAgLyoRreONIQEYOdyDlZ8UeM52IZCv38w7ruRAzrEPoHVSEcta9jD7/uDvAZlsnPWZm6282P+hMSyLWMCD/AFF84fhluwwBR4a5BGqL3FD/n60jpEGR8GRuGC0BjTKbOIacyteIlQM7pK5+HPSaDLM1aCSg0Gk8Kmejl66jY/nSUHem2k4VikZG0xT6M/ubrYw3IRbw+bSU5ss2h1+FKw+vme5xHEwevY3fDZCHW5/Ws7uohoUJ28EIhO+kfr+gzhf9yNLdt3AIZvR0Ct8DTJnqMK++O9senA2SG7fyNtLX9BDo/M4WtGCJT97css1A+jyRPZz20dqH9ppbJYWuvbdpBtKs+Ci3gNyojI2GnKgwQOy8Oa9P4UvnwKvn3xj3+vppJcqBcLOvbyhbBENbvJG+xEVvGTVGOj76QjqD/Nh0sI+LvCPRL2Ln3D/LH3ycn5Dj9JGcJu5F5RZ6UGHyEucG9jM37r/sMw0e/ZtbaKhbfa4ysWBw2UT+b9l6dReMAGOHqsFoS0R4FxtRgt/9GJyTBianhiHayyNQVmE6PKph2Q/XQPGqv7BgP/Oovbf86AZ4UC+R+NY2sCFay6nQFHkdprzo56cxplDh10gpRyxgfPfjGBNthX7zUQ0/3GBH6ZF8xrvRfTFx4v2FE4Htdo/qDClBt4Nj6PAqjBovvMW5HOUyHuDCc8RXEBmecdIVkgBTDd+ht/FBlTs/oo3G66n1VGbSEvbFCwLX0ONSD0UNmdy0ZeRoD/BirbfaYeIB79pQjdh+LK3uP9tOjitCcX/2sOhz/0M7yQDWH1kmL52nUM1i9skWiiLRm7ruLs6Egfvm9OaSB2e6VqAcevVwcdYliyXDfCykf1Y/aqcM1z+osac4/yxdDIPKiSCVZMmlJRPB/ljNSQy4AHjLWsxwtQWroYdJispWyy65486QgvoToEjtX6WAMcVK7mgPJKPnQsj97WvQVDhNfcvNsLgquu0V9ENb4IwVYMeHP+xhM5Y36PNeTv547Mj1I1NEG3oCwaBOuQxFbDsbB7PV5ODFy/EeWD3dyxuXIjyb/so22AAjBU/Y7PeczoWZEjNAW00csEE2ONWBc80PKl71DvyWYn04awJTDDMRofzW+nQnA14yqUX0v9ThinitnBqxip+VHcanty4DEnZQ5TzWRPWd+5gccUdMKe1nPfMFgPR18/ww75oPqryDnblaZD6rIeQ1XYF0g6GsFukH2Wd8+Fi+RHg+zcPrx2Yj4sVz8DBWjGUXKRJBx98wvmdPrB3XB2XVl6h/WMBGt+q4vCMIfg8cx9E9Ohz4LwsljCwxK8V/aD5wgunHR7NehliMLQmF3TPGMOb6SfZeU0k1JzTI7MzWrR9/hsui35P808EcdTc2eBv3cACZX/g8IJfaDuqD/NLN+Iiz1CyXXsVDUQsePmrRTywbQJcO/wYGs1UeKWuKjaOE2LVpnewNsAZEq68p5p3G/CF8mbEo7Ph/ewqWq3lAV2bulFy4k8aSOuiyFdJ/Nf7C16++Zxc34RiudAIqHgqTYKbO+CvxlaKajWg52MCILV3iDuUZGHeOTWS9cnD7zlSMGHMC0j7dRkO6Q+RnvY8eBRRA/3OtVCqtgczd2+C2zr6VBFnDOGqmznQuhq9Wu3w83hd6viiwl6njXnnBllMElyArcHVeHSvBnjbieIBcCfF/qUQefUl/+cyGWN++WGt5hG4k3eIrg+9Apcj00D/4xb02BRIwx2joeFoDAU5ZNHyUWGQbKfCm04oQfWy29xzdzykvP9Mm/44gId8GVt6ZNCDs2bs+CUJnp8shgSpaAj/L4t72/Uhcdl07DGUgPv7CuBrzghqkQqFs3vsMWdWPj297cqPtAmDTxL4PcvDMUd/wj6DKfxZxAr2zrgBXXtNaNzBe/TWsQsdLkyhp2Yy4DsUCNM2r+fZM5cAHjXgTusk1ps/E+S0TuHfV7Xw4J4Yn/WeAvsStEj8xW8cCs6BgpIYcEr8geujx6FSeTv0XY4nm9YQZhtZ2NGgzrNfiGHIkUiWmXgeKx6Vs19GLPy38SIf3GTC7ZovueSmBox/4IyWBU+54ZwCacQGwB/NXrqXKYMrlfK5MV6J9YP6wGMiQkzXMtRvnMRfVOTxqX8tv6hK5Eln7kK+cgrraFXR3xRxrlOYCNoGTF82J8Dtab30bbsGTrP0phXvTpOixzOsC3tOt17og8RIBcjPnwjHBc3ZMukTnTUCnCf9Dc7iLWjzFMGUj5tofUMBHvkwAhQ/ZsK18irS9cygsSunwc/SdCrSX07zX05CJ6F1+Lf3Opj26MJzOSsKi97KXbdvYkCOPDjXypPrx8loarKWQ68eRc83muTcJga72jtI5mwHx21MYZvPySAs9JgPSF2BtrIMHoqLpjuP7VgkWQOKFGMx97sW79gfij9n7eCsH5WUXDKbww8Xoqb2IfTt3wLFr4Vhs3EjfYwL4aVXrWlwSAsf51RCZtEPuDZlB9yL8QD5+A5uFpsJioX1+MpAhNwWSMDhG89x/tHH1C/nwTsLvHmSTR+l7y1A81+yoDDbnUT2W6Auz6bd97Kh/6ozrDRKxN6CMfTl73FqhwDw32IAU7KT+GVdGMsYrce1o8pwd9lqKqvsYZmIZJovZ8WVqb4YloKwa/NJrBQ3gOz/voLUuj7+fl+Da3K34pshA5Jdb4v+QxmUP10HttsdwNrhZEqL8aLh6YGkOKAINqkBGD1YBs9HFWB3lxeZLVKFwt5gWJdRCf/cetB471se57yMLg0mcYZAIrVf3s7ZVxyxqUIFqt7v5dcF2VS5UAWON77HHA1rll/pyZPL9BBzL8Bg+1TKcVQFnwu7+KOHAkwP1IEznf3cOEEO8i6kUnnbRtrldh7i7T6zv6cB3L/5Dxxit8EVwfHkevUOSa6/RZ8D98A2k0A4+99Jmq4ly1fu6ICM/yuK11tCC2SYT/QqYNq5EdAqtYpnbl8OfbOsQUNalmbuHgUnPBr5rTKDot4lUv78ndZWjUa5qc9wVlgDXekIxALRE+D9dxQ41N2n5aAPFtYN3HqrDzaeLqPVo73oeq4lRYg1c6PVe5pvoA5HalJ4W7gXNbkfgn+/gMsujeKqfzEokmjAUz1+Q13sPOjp1AbtUC86N1zHXTLmnOTlT/Pu5NO7BZfILzodvu0Zx7emJkKg1Ez4tnGQT0ldoDELOmBxyyVUm/KJVi28B0tbgvnO3VSsr2jDlCPjYISdKlp83cDdh9X50TVFWjpKh8wkRDHfI4gmTs6EN+erMGKtIiiNKcDzw9bo2BEJxhPzoO3+NLov6cCGqtfwbmQiFwhbce2skdAicpxfyg/zzuAqfntPhZrGD+HgvHwIL4lDkc5G6jp3jJ/ZMfyy0Ye/khogd+0hfj43hga62vFJ9lzWv4sskW+EgQtVwMRbFfY/KKMlF/SxeKslHow9R9aXSqm/ZwSn6yvjWokWCi9UIrcAEwhOcKWQKgEwtTmPDss74fjgOPjxL5ukp1/EEbmhYG1iirf8RsOa7E6uSNCF7HcTME38ILq+08J45XKeeigevHKm4ul0e7p7Vgz0xRswSWMvHXzcTCGHs2nHPVH8FaxNhuudsHGNED/8WEWnrSUhzGCYq5OM0WiJDkzpqSYXDCfTr9Z0clse6AXWseS7Y7xZZwbMyUnmDWHx+M1SBvSbq8DmZzgaZS2iSc0WJFQqxxsmh6KQpA78w2ryc5Qhnyn7eI7nFOweHIdr/lpAt0A5GUz3ZvGSYdgPRnDRYgaEJ04mwf4sNj45ltSHbnN5gS3PTFRkVYnzVOT6CShaG1J9dsHeI0dRuf0qnxj4xNc9DqOJngOmrwQekquBi3a/OaFMAOKe5kCB9HL+4CeLh2vGsr/kLyrPPo7TqqX4cOwL9rmXTB/NFOGSlwx06Z0mR69jPD81ixt7LsGXFb9IJ1ifTE1sMSZVG0MH5aHM6DzndUTQuYohSL60gu5tfQClj05yppEArPj+E/Vv2+JSMgXd/FJe9labTp/wwjlV5pAQkwpHHEeDd4wqfIcYVFI4ACc+6oFr7zO8OW0X287bCgdWfuODAzfAsL2NG5a9wpdfzemUsiaeOmEKqofLMH5kEUeuEqAbbT0oXCKPR2sqUNnLBrwnFOLZg/4gOkUFcoI90LniHvdf0KXeS9kYPi+K5zqfYiGHUjaeWEAWM7QoVlAGTk0IYOmu6/gvxJMMz0yniHXeNLJdBRKji8Fxqh99HpoCH8frwvPeKeS8q4Us3kzn0+EH6NZbEa7adYC2OwPLfPDDhuFaflgvB0b74/hBvDGXrjKiaTsTwFndhD8v6OeMe464on0nqNmr09k/OvCnKQG0s0M4KgvAqfkz48A/tJ7sQbk+77HrzDCkZmTi+CxBOHZlI4fPUCR5mfuof64cErd+whi7rWA7NRge7F0N4trz+O9UUSgWTIDTvxM4670uCxbt4KyPivQouwGOHmlGL1NdyJukRdJfZOH3l0e0cMk2ED31jrafmUkK5RF8ctNDEtjdzLXLcljPvJQuRSrANdtRdHfcSgoUrsRCM0vQfV4ElooRuHP5W97VcwhMdkVzXpghiD+eRSseT0XD5xto9YpBrv/6D8jjGyuV/0H/5TuwTsWNKixM4NpvFW7oqaB1jk/Ze2waLNT0RMN1+0E0IgDNHi8B5xdWtFXPCLqWP4b1vjEgeeQfHx6shoqud9Chl80/YlfyubBouBjZDrDICLo1v6BwxFLU/d3DMZNP8cneBBi8PICqkdPR7lEWuCTYA0zTg1OSGzlLI5p8ij/TDmVFLPcN49Uufag26zJ+enuHPK4/oAYLYfjvgiVKvflMphdjadaSFaBxPRmfmv2hrS158OBDDTirqNI4l1Ew9lorNpoNMZg/xz63EEiPCqS3Uhdh3W4bMksYywOvLSiuxRxebfOmB7ezeG7oHZ7REQKFUev5XcYyfPTjDjzKEsHaMnGwuT0DxFXt6VLOFKgveotYagKHIwQhdc9Orrv1G+v0rNn+jQIu8NGGFwP3eKJ1MKhRIBiF9fCV3ZfxSZ4CenrshdsjS6jefSYcuaoEpw4XQq6LArs3X4RMj0gKWrkdhnr04J69CJ6qcIeMUeNAvX0GfKitgaDn+bjWmPmF8gJcaXSKklO/Q+dNF6p48Z6y/NvAz18fdFec58PXS1A6ciGHyQN//3aEOgv/gNJldTogJUX9/cNosEoDnvoK0cH2Bi5/dQLW7dWFMbsmkHZhBgtPPwAZzSXw8swkitIWhKc5/2DB8Fv0+eNAV/e444fMet4/tQ2MIm5Qx6q9/GpMPw27C4BkUytESu9F550fsNjwHF9IWwbBfRPgz8JNkD1qMhQuaYDSRFHwdN3Eh/Na6ZO0Di/0fMwyldJg/Pw37pU/TCutgiFs8Xgwh5lgnbmUu/yLsGXtWTxofJnn3/mFRaOd4BzEQtojH97dfJi63UfCg+pzfCVpgD25FyqUdKDOPIqWjdpGX67q4ibVVdi4ZQNar9YH04Gt6FRsRY/eJLF10VgYFzSJb0nPQe0t7rzktiw1Tf5KZ86qgFlZCLVE9qDpwUh+9fUlbk58Qn5Pr/Lm8FoWp1d0uN8I14+YCBdFjtGT+IswPnQKTjTN5YxNlnDT8gs67WK8uk6BRHJVofbmZKh+t4TGLgji1w41NOHcSFLvtaW1zz9D+vAMUjmdQrtWS+DIcG3QKbXg0g3Z5JFwAsUGwum4lTS8vf4VJ1mv5ctC5yFrsTivLJsB95W9+ehbW3qlr4E/pafD3yRZVKBKGL96Nfz4XsUmTXkc4y4Aap1raOHBYvox+jd+e+jCD34doE3PIyld9RWMfCmAvMSPejZMhrWaFTymRZtaOxHGrz7ItlsmUWCuPbv05IDF4GkoKG1B+0xl6LdK5T+fnkHLEh0I8piBLTtGQOLilzAnVJbKbl/B+AWXoHi0DDgmqdCJsJdcd3UHLtgnBOZyt7g2JB4P6Z7mJc8SKSXCGn6/ng0RfJTbBqoo4MEedi3vZOOLp7HLQg+33vyH1zr9ICZ5BfqGasMHFCPx9hwa+JOJXk4lUP21mXUjmNTebaGmn4exaZEU3Z4wCbLvTcdT6k2kKZaKgn1F5OhWxzqm88BIz5ac7C7wJMnrNMNJEzRkcuESrSDRJ29IANeA8g1VzutWoiTN32Bnp0AOegHQHCYIZjJvaUTEKHhocJvSV2wBx+JRsNPhCCePdaBZU8P5o5YP5eTNgu8d73BK01p8jDJgX3mKErPioGWiAst4iXK9ih06VcWh7glzED0/il6cX0+SKddJ0auIb/YosG7/UTpe30UG+wVYslARfy+ShC/10ezi9ZIfHRqDK1d5w9OlClTc+52uLxSmUNWX9O/TVyzKEgA9f0Wyu3oOd6yYRN82hsGoZwXYcrobvx6tgINbGVdLuuAYP1FolPmNj1sHYf+Cp9DTPIPOeP/C+w4KcCFTBHO8EkDvxTEWWqQA7hsS6MKpTRTvXQ8rTttR0GUJQtU97PVtJ598Cixp+orrk4xAcnsy9v17zx83LYMr5x7jYr0Q7N03BXLXz8PKi0/hTbAKrPwxC8x7+/iPkxaFf01gH7mz9NHBiF7F+PLUZj0S+F1JJ/d/oVWfFGBiySpQ0pvC/hm/sbPQllQF5+DtqB5+cmE7San+xo9Hf8ARQSNwDttGM+/H0J37onwlW5EDb7/hQ8JGnDY6n9foi1LF12L4tlYGGq970sFcJVSeORlt3Mazt2sxW0QUQsr7BzDJbzR3Bv/hUy+loGnuXr6R6sBuUXf4uZ0jvr8qRLNn+eDMLX7YtSgJLaZZwIVbhmBzKg8zvc1pg9ZR8NYQgq0pW7F2axmPcjlOb60k4eGAHfwWEoLtSU3w9cMntB+9jr9H60O6VTI0BnyFMZNT8fnNSzRfdRmb6YyGtG31MPIoU7HhDZyptZdsTVVI7rk7v11WA2hwhrZJX8b0i3pw4/wq1FRKhQOfIth18V5QXJQKXzV+4IEgBXyycZCznKeAbIc0VJsIQlH3MGu17aXGdUZg1PyCU3utSSbkNVguVKZ/uSthXMN4SO8wZf20JBj1eS/9WB7BzcdlIX2GHmsknoJYo9+UMDYHHz2aDR+GWqk8JYiPPxiClFXRuOHgP1gxLENaH7Sor9cDVbamEKUQOARNxNjMe+zt8gMeG4lhf2o8rBv6iCELK+m/iGQSveuCY6bNBJAzA5+M79Q/3hLcNKdzdo0mRGkjOaURZfv0oZWtLbRuVoO3T7dTtHYKv1vzE81fybDfyFWYNSmFwcGS/3NThHFZX8h+oxycuT2fJ8c04arQGr4lHERa3bdZee811hw5gb9/nwhHFxTS3fETIXlbBe//OQS5Gx/Sz5knUeXeGPIvOIf7EgNg/6I0uvC3gScmzoAD0VdpvvdpSNMcjUf4AL5ZHcmr9tvA/JouvtH6CS7uW8blpiMgT2Euq+kcp/FGP9G6zYpHTqjFJ7rraKHyIjgRGUGFyU8hTH066DY+5Ya76/FQQgLNEMrnDbvMKD/uITyd40f592+BwcZLvLAc4F3aY5DsnQZzfZV4l6Y2P550E2yXHaAnZ/pZZ5EB2W3ShPv1DBJd9vw6fxsE2XXAqsIDqLIlEXJPNlCLwBCsvZxDud0ZtFNtBpxN+k6GJ6aB7w8dfjBTFjTUrrFk0i7+/LAUj12thK93L/L3f+PBYvVWHph1DDXwKF6fYszjVHpQ5s5s2N/3GDUWBVD4GjVcESMJEw4Uc2vefby9MQiPav3AEcn2dL80kh40nYSftxxJNv4gzwmRheLNu3GliT1MDu6D8uZeXGQqCVYpwhiQG0r5trtYunEiWGXOhrcQjAlxe+jqVw1cJlgCRj1/cX/KWK5PaoY7s5Q4TuY1rXgoD2Orp8AM0z2cf6MWhk13YmW4Ao5x90SJqyEUerGVTtu4sPAxeTh4IgX2PrWAdce1ofeSKESt/gAFRU5w30wUOmZEUNR6AwzsnA7/9h0AqrpAXaN62EXVlgMEUmnV+yRYPqcZfs2fQZ1qvshVUnDBzol9zOLwZN5y3qhhivfiH/JozyEYW+OHmyvd+NxaGx6TPAquRzFN/6bOn54lwmkaSzklYfhfkSyP+vMSzxleouPtBjToLwn1Y2RgmosaG17OouP78yF+4gV6IOoDzSPaeN5aS7rJlSh2eiqILdXj46uuceHV7VQtc5fGOa+ki74atPdUBeYEJ4PZ+i4oFTUG5wVreOeNPtg8/JrSnPTJsm4TLAyTgV6lfh59N5giuqrhTQyC05k2Xqs3lkr+syXHwn3Y33URJL4J0aXnPrhh0W8e/u8ptztIwhSzVlwk44Kz/znjgc31tHuNCZ0e2UJBl27xvxOtaPjEn53SpWHUGDlYEWhPFv8GcO3EydCtKky5+f0UfWY9Hpz2H4nQAvxePBkaK05hp2M8CUzIoyfSvZwrnsIz/VagwsABTv+yBpTMtpBesjws+paHXeGH6ZvPQ5haugHmujZxU7oIVv+p4tiS07y8yJgcRHRhh5IQ6Vlk4acbZmD86ywvbS1HwY5fYLFaDC21JGlT4i6e7acH86+VYbpWBv3yvgMl0h20/UYVNrRuBmnnBC6MLyV8+Yh/fwQoF/1Je96tJJLaRQtqLcBC3BrWGM6G2weT6WCtD0n/UYIoCUGwf5GPAWtesFbVYtpoYkl7C3PQtMGOglefwE/rbuNv06fwd4oB9PUmUIKuNcW+GQmgu5RW3ekEH98BLKhWxO6QHdgc6wdPBpUgzFyZ0pICKW1DBxx4pAjiX134uk4Gh4zugN2p12D1FDV+kaYMOWrPOUqvlE89u0+akyvp31fmQveF+Ls5gL8s2c3h6cLQ2KkCzXJzeLHfIMrJLOMUO1c2CZrF01fs4ycnlqLTURt6WPGHQjSmQ36mPAdE3+U7VwiH7aLphMR5lM00hsyaRijZK866O77wt6tTIOJmKx5L64BNHsZY7WmI1zMu88MHZyguOA6EpwuxvY8Y9xoCyL3x41mL10PGP3tcUnCD99e2Aqyowyvaz6HFLhtMQhPZaaEx1Nr8gqBvj9CtZST+GNKG7d8Pg1nqE6yzegxCo++Q2HRzuhYuC2vPVWD6ZVMSObKC167ZCkrKHyh0dyYtX/EFkkZHow1kYLsqwWNBVbDqeYPlmTKgGTcO5z1Q57Ny3ziwvhEKNoZgU4oZXugZA2NHXsK6mWfg6GU1Wi3+mmZNjebQR9VwpKUfW8z16OnDfL4cqguHyufys/1zeWvfJ7p81wEXzO/i/E5/epIbzdkjD7Jp0yDbvVEG8ehcONK0gp4pbwUpk8Xw3007ksqfgYt0VfHT9gVkrT6NDb8KQlSLLy8pDcLvRZIUmR1CEWZpACveU5XZYRo35jP8+7IapoSLQcXG5WR0T44sKuLIuUSZEr1tabb7IE/tnk75sT9ZMfEDHH8hDGOb5OBhRSec0TiLIg3zuTz/DabssSI78TI8fuIBNMWH8LPomaDw7gvdFlqDJRbCVCmzCbPqNoOH1md6amdIKz+s4wK5GJwrqAGKB3fQNsNieq4hy488X3Pv2QoULRKF+k372Ud7J0dtK6etIYpQt9gPF1z5SRMGvlDt++VYfc2e1tg/RIEIByr7VsrvF7fwJF8NCOgIhHrtTXzXogNPi+3nfDlbkFRdT2M1gsDj3VmW+7cVNwaZgb6uCX9QrKbx/1ZS+4lGnDjhBm1JmE+ez3/wj/FrKNjmCZoPTwB5ZUPOOrcKKyOMeKztWhqMeEADThv4VvZavqXeAof26LD3Pwn48/EyXnYIxuIWJbbR6YGbronYLxrFtzu02EiunG7laMD61wow/2oI+cVNw8o6bdjXU4hibjZsLbmad66spesBPXjiyi5Q6hWEY3seo9YOGXhv8RreW73m62s2wsvjvzEz7wK3PKmiiwvLcOXG8ZA8oQR/2z/lDZeDcVb9I7gotJVLu5QxrGcVT85OJAmpLsp6ThCnV4Wn/1pBskIYeyi1o2TNJBjsuQPz2oRwilEBm2TcwuF0KZj5OIM1jwng7vs/Yc6FFViVZERLL+Xy6XOfMN85Bl+0PaQSHQkYFjgL+45rwsLzmzjM4hifLkyA8qt3eJ3TIPiuXgHFm2Lh55ABlEsNUa50FwlKvKYxRxrJtsMJWq7/hnY/H1oZpINnD4nT6AglEBkfiTu+TGRzGx2uHxTE/bviKEukgkhmAJ0DfVnh+F1UmjEJYk3fgpNLOpe/PooFz05zxLXNKKF6nQr2PaGA0sng0myHC1X1YOaIZBzyeQMu12/BiHRFPDHzK9Zkh1FzdCbIvIrh9lfBfLNFAp7XrqRlb0Lps5ALH1+jQpM++0Lqpt/gNF8O7hQtBxVjfRIBWdjpMI1hZAkZfEiBJSsFaKF/Bsx7GMjfI32oqXEKhE7bBeUSE6D58jse3XwfZaac4rKAWcBT5VBIppXXfFDGqVGJPCYtBI53aMFMzzcQkn4L0caGNRqegsQlFeiPLeTAJDGasC8Q8pO9sP2MHrgVBXPoryTs921E64fVKLlZDZZfMCa/Vh84q6EDzV/TaX2PNCyY1kLjp46h/DUNcGzDWNz2ewYvFtvN41OzoOeJLTYqXeCU1Qpw+vhHWJpcjZnLBCBWNonjdy/FpcdE0GiMOnl7xGC+/wFSPUAQqhzCj5d+5eijfVCz+yLfc7vFt46vh+oTieD6bh/PHJcHVqOVYda6r2zmUU+uc4tgmssxMlogAXoCI0DvzBV6d+IQDwhuYMsSWTisa8A5EvbwPlWSRMfvph/L4mHbpJE084M1aA5F0NAIbY5arA03ki7DRrUEKMqPx3em8SwuNZt3Hp+NJeesoHPPDXb59ZTjJWaC7qXTLPDKngNOhZD1vB5YpOyKSeHHKSzgA00bdxiOCjyA8vmqsGHXJzguTJgVMIELL6VAnGkXTkzaScu2qJOFRzponu0G1xCARs9M8phRxWIXMzmm+QVptiyGK97lJD3dj4M3WuEc+ThYOE0D4nfoMO6zAc9vvtyVOw3nvPtB8pXvecc8b9r2U4jLlitg9aJZEDUvBK8tLiHR2XLok3+Sb8sYsJ1XAW8ovY8T1T9TlucgKe+UhB/pm2hrsyvap8+DDOFa/qT1CGe5feKzG+LQZGIt/RZXgh2FaqDeac57e5PAbOE0dhrhR0e0pGD5kRRcmy3GJ7NXY4DFLBB6pgi7Go3AXS2KQ5df5U1L5nPrwEu01GrkqOA7lH8hlf+bHMfZcwTAw2c5fH4tzGGv54Nuaz4bztPhFy2/qOSNB5fv7qO8WWU0J9kQBs4PwdE7YmiSO5/DrcQw86o2Pb/pCQOlK7jfxwkzjoXAWidlmHNmGJpqS0HC8SQmp+qR6cEudoRZnHRGlkNXfuHui50sWGAMlzoioXGbM8abPsPPJ1MgcmQODO+vY4EeATj1pApXCy+Fj3+UIM3xLwi1POT9gUf41b7ZeM/mKFqOy+dFMs/YOayd1kxZgiXvZ8CUpg2MTYlsr/SBSnaospKBLk6vzWKV7PE8jtzI/r0KfbspDiUnsvB5ZiWuKWnh50pPyHVRJPms3I2zkzPIVXYNRErtg/UfZWBzUhc3eTfwHlsTOF3rxAlq88Dt7maw/BoHA5PG8ByvSjDpU4JPz+Rwpc8CHilvzrvOevGECW3k0zefzilMpYyDhbxftJh2liiDg+Voeu/gxWklfqS8XglaXrRRQPEgxW/dQPfOXYGx5MJyEaIwT8wQsgvv8bNTg/BQQYcoMxc0DhSCwKsBfp4ZT3seX8c5rxlCUv7y3kkS4JTwgufb9bGb1Tz89SucxqwugKdRBTSUdBX0d02Hzm8T4SzX0YenAtBww51GTpqAOcXCZPJmBYwWt+WvY39ii/Jk8My6xfbO9/jtijOsIZtPy9ZKYKR5GfqaMFmVWYDql5HYhkKgwvvZqF8CJEUBrztqwfz1v+nyRyO+8a2FinERxE44jstGy4GDSx0sTUiD5Y194CchCjoihpg16QSkzXoJm5y1qGpSPf9JkAeZN+OguKEefbJPgpzFU9KxkqfikIfo/fUaXp6wD0dufgQnbQRh+4JVtH/VRBbe8x/vSJmE/YUmMDBajVuX+3N5tSTIm3rgCwdpGCGuDVmLj9CNbAla7/0NJscP0w/zSpqbZM09F67Dl/uLONFXBjbXXQMxc3faWiVG56WM+Ei7Cm3jefwzeRrMhwL27cxkQ0OAiYILuc0qin2dg1jHURMiu7vQvqqWtCxysK2mh9XLQuGa1jQQ0ZXBExcdsTurnFdmCOK96CTM2VoFN673IfYLgt/qxeg7YyocNY5HGQM7vFZ+FaXl1XlkkTqvU5zLe3VX4XZzZdKek8Chq8RBJuYdu+0xJfnNiXAkZwpX6mnjDIFt/FXsFMXzcjySeoQ9t80CN+l+MrO6B8+FN1GmuDZlxDZgsN5aeN8YT1eWnGDtp/p0/rUWeMfJgU+XI+iV3SG3gDSwSjLBPYsek+VZJ+jzi8FTO57Dxx3TYXgqcof9ejSc6AJFHYdhzKv5LBgfjvtQhx16J4FNkiVbnRGB0lvRaDNUxzPtRuD6lxKkVWkDB31LWPnCCa7e3kIrRA7hYicj6J6YDerlv3C6z3jadXAxBx/UR8XJriyv9xmru1VpvJ4KWTyXgL8H2qhtshM0jtkH77SNyKKmE6t/nGerzLmc8ikcpj2T4qEjgqAu8h7e2SJtUb8CfWWP2bHYirR3v+JWcxF+8SSSc8+a00DaJHig/pd1OndQ6cFimuLux60y5zlZcwJ4LgvhzwfTOerkaFrK42Dq5NdUNuRI7LsBLJbk8qzsYl6sLAxmk5qhUnYAtot0o/ZfdRiK0MKHnmIUWzubGkMfoszWJdTdXsOhYftAbvNG3L1pN+a5y8HbKw4otvMgTn56D89dtcVHQedwTMcpuHZTHYW+K+D7ezfprbA2TNz3j/0Mi9B4rAa/3T4B5tcl0PKaN7gjcQcUWI+CF6d3w/i3YhCqtAh2yS3jpt5iOKazi8ODzqLt2xg8P2INLuwYydsqHxNrC8NgrjKviNRDF4kC0g/SpRkHPDhlxTC7BwyS9LcB7vedzjnB06EudhW+GnMWRL1uY4PTRgqpvkL1U5eTTKEnrAk5D8dOyMD1ydJw8O8nyL92lluU2kDqRiw4pzaCUPUG2pFzhpvD52N6mzxpTdeEItt3PL3uJ1xY9oFle0YSd/3jOeeKSWfkEe7vm8HTdLwhfZ4OdCWXQPbWGXRvsStsFH1B19uPQEHkT1Y5uQRiH72kK26HsX/DKHiTrsCW4yfR5oPJHGC8GHoV6plBlO+mPuO+jeX8LaCb9G5rwhkFLfTP/AKxTqb0xNUTzzXUwPjHe6F4kgtWjfwHZrNVsdbGCKSTjIDG/6GfaaE0xjiXHsadonXqDjSqbjenx77lCO8gjPKRhprSfXxX0gGEpr2khc8y4EJIME99YAN7zhwGjfX9qKXSRPtOECwdNRF6FSeR46lFfP/hK9gdb4CiKnl49VEn/xV2pJsj3fhrqTic52SOqdDik5cPkK8CYYT+c/z+SYsTBBPgpPF5+DvZlNQExCDzZCd56N+lZyWeOKNICE4M+lOm3zaYuHMy0ZPTJOI+lppJCzjoHI/d5s+/LaVxapEjx5RIgPZ7F4q67ooBv/3gkLMYbVqnBKmuJdC58yqIWu0hx4xD9FqlgEQbp6C29gmQFfKEed1rAY0nwE39Rxz0MxeixbLoh2oNa8Be3lp4gLeYzYfRMouQ9yygQS9DkM54RoUFUXBJdxNE7xkBH467YLjFG9z5XQdm/PpBc24thAuzCaLvDKHWaAdctbUHhHIP0piSv1y34hH3+xtA2c/vcHrtbPiRMAvaymvYrd8EL328SWLxuyh64laUmZuGY+PPkvLSMeRSegfcPpjC972zsDz6Ij9wSkW9wN+UJyYH8RNj6PWKmygzbALiyicw9s1oWOmjwk6HvbCgQgGvZa/Du2NS6c2vQFCZl8a3xObjmsx+EsgYB9uv6ZNwph1b0zUSe7QOFIUX8FflE/jReza1T1uDRoGe7JAhAAdyA2iMVwNcLd8Nbsk1aBEVypEOwiiUpUOpO01h4mdrWHFSEuYsnkhZ6X1QUxVJOVJd9NF0JvqJHqSsOev4iXIDF3Tvhy4ZWbhspUNrvnTiQwshWFlxBaft3MzGjeVsO2cVt4tr4rPl9dwerAhWaXuwe/gn/Nc4CWzTA8Blkw7cufiaUt9KkoesBt7UtoG6GiXI/W+QU89NA9snFagyVQoXrdSmdX7VcMdEjpYs+Yu+wheh3VMNrgcf56c+tViwLxZjhZpoSUwlf3P3Rpf+HbhHM5a1NhlgdvNYuD6kyPVFNrB/szn9mulJFb5x+NuxHWLV72LfajUOz1mNb7RV4X6GCz5ap8Uix17gnvULaHShOl91S4fngY2stnQpHRhnALalAL5iUyljzC38e/k1tFUE04ct/dwupQPbxd5AseshapsmBbs1NGHbLVUcjCwmjVw/krRoA0vVbigImI050tXwcuJCWOJejmlbCa6J26J+hidNEk1CA/EOUGt7Qo5xf2HzzxkgqHYQnOP08fFIbXDyUyXXV0Ces25AvOY4CHvZQhmxI3jv7tM837iZ0j4G8F4PQfC0+QGewffp5oVqfN1pRCPjf3ORRColti1GW6s10Ow0CueEzgK1Vx/xVlsA/puTDcKKs0BWTBO7A4bw0VgJqL4zCpc59vIVPYClN3bDzc3G8GyhMkn3aPE333z+WlqG7lVqwBYGHLKjhveJCIBjmgIH/QuEN2rd/OahFFUEK/Chy2tp1R0xihv/mE48vgGL1MbBv1wvvJs1gU7tu45J1p0YsnonJqhJo8txfw79ZU6Jb1/iqHUi8MluNETWBvLJaneAc3fp70jg/17ocLJgD9S1adC4feJU3jcGZru3Q9K22SD37iAcOqZPbRZXSeOFOE++eYefT1lHi8wlwe2MMERPtYDUM8Uw/DiAF+S3UmVDNNhJqWGP/SB9r8mGtzcrIJVMQUWpCZ0sAtk4/TSZnRKiL6f+gMRUYNWSIFjbshCXzLyOTwbEQHioAg80K0GQ2T08tckT16vVo3lwGlgURNGIG454xKgSHPzHgWZnNzRvyMC/DueR3GaibGEldv5pQImmBrKdq4/PlLSQ1ipAywxxHHleHRftscMEeUt4/MuAbodMhsrNybxB/hr0Vd5l7xnaUHBHEjLsHmFnuyZvTuigyxs1eHfwUdoqLk4Cgffpq04GX/44CtwmrKLfIiJ8bFEyVbs/pzxvXwx0LsUfa77jvmN/adFOHcrz0obs35Ik3HOCT7XZY1PkLxb8u5Mq3MPIIegCzpnvjdFe19BCYSL063/n7iAbfL39Ad2T2wNTvtZCd44TvGuxZ4vZFlRf7US6YnL/L/4X9hTag0D9bT7QUY1KG0JpUskUmn4/D5PqL0Pedx/yVVkE82PMwXgD84uTATQIW+D252tYsVuMx735hRBQQgN3XGmGajQ5yiFYWonD6yh/XDV7Oq5bshTuiaqAxNvtPGLrXFrVtRTD1stCR4sQPLZTpy/HfHH6r7Ngf2Y8ats5sPK326T/toJazvhRlXAxXJWZAPb5W/j8bhmeUydPz1Nng/NXRazftZAPXOpj/6UW9CXchj7q6UMDFIDUg5u8c1MoRPRc4KfXLFj42nuYH7Sdy0Xz8NGNYj72aCqE3zpHt3uesfiSXNhjdRu9xtxgFyt1aFU6ytE68yGhoplfbhGAUtlJlCVRjc8uhkF5916I4nlQ5SNEot1vQC7VBU10Z1J0jCLMTL+Lo98r8Mv+bKqTuchnUwVIUCUa1+Ypw67SXaCePoY+2wuA3ajX+CpvAY/qXQfh9i4YePoXTN2jwE2PzlKxty/FD3wi6w0mcPhINI319YYAmSx+5HWXVl5KYn39Plj6QhF9REzgy6Ua3D9NDl48aWWP4rkUd2Qi64z0Bd2PU7j2QxR2zO/D065hPKzhACX7xWHv0U/UlSRMw7vmo7vaDNqQ4oAbnL5zuvEEnPVzGWspKNMiSYbyBDvacv8+HVghTLY3q1DLvIKS24fZfUYllN47j35jnuCcUEE4veQdRv5dADJTVeBJ+S30gY10xViS6PsZ+CuLcOk/KVh/SxTsxSejq8kHMFu9g303+8P6xgwOXzqaN/m48CKjRKiBm/RNwBiwwJXyxd/itM6prL5Qgg+LaIH0xg5Kun4elr0uhN759fjnrjnESzmT57YrlDBmA97MPcfH55jz1NwjfHhfNFiXj2dD6y60b1YHyOvjWr98fGKqAzoN+Sh9OBFyt0ZRstorSjbv4W8+4njXwgTGm7xjHKvNTr/eU1v6Sljc+4cmmezjU7cfspvYPFBMFWTPZwiOFkHw9/Vz0Ois5HPVkhQtq4orYQZ7LG0g/XHzQNVpBCxvkoZPvq2oYR7AwT0jQOLoXLxr+Z2iZBaya8coqNwBrDu1AW/UGEDn2Rbc9v0pVvtIY+q9EPz1eybmZFSTfKAPLaw4gmHVtVy5WAj6F9zCoNAsev77IkuYpaIfyPGF7gxYsGUjKRtf5tcu/lSuKQvH79aBjaU0f5F9xkELGuiDwmxSK5pAkmluKNi9BUtPacKA0RhYlfgJ/VP+UMNyWZAsvgTTcpVwg5gNvN73k9XpEq95OIQtkyXg39q7VNXmiCXST0j9ryDHtG4mqYZUXHzKnPcnMv70mM2nR2nA+9oIXGF4laa651JTzGh+4TLMCU3voCL+Goc7beBxYuocs1oBMtOe4fQcUy5cYsKLt0yGyZ8Ww5fvl8jv2jDMvVpI3xVLcETtSPCUuIbiG+Xge+cjSvP0x1VDRyhrVhqpzPsAWcNW0LBlGxcICcBQ2DMoKpSBsceBrJyX0fJ71+g/vUVwYtQolIoyxI871PFltTlsGc7Hu/FRtLGniRu7xtIfywU40N9BsXHt0LC/jIWeDsAfZ3Eo1Pakqnn9UBGymC74FmO/miLMUplJKy4I4JqSHZAf9wO6nxqC7ocDePhZFrqJ9rKfuQONHK+BZ471YtT0hexS9gvS+xVRqXQWvJa6QhGWJ3lj8BmYavqA79bocMpGA172yZc/X4qmO4cOc7K3DHResYDkqveopzoR6ix/U33+L5668DnlXUzCVz1uNC16O34dHA8HCwP4TWIjfDF5hYZzbLj6nBGrxqfylxGCvNUzBf0Vmlj65Fi443CQNjR/xKTfE+DGxFIKbB/m1m03KFIlDTZa38PWz3fhWYQgxAytY/m7Kbh1zUaaWfoLpy3bzYIyr7F1vApNm2gL75LdWWmeAHz+mIF7GmfQgo8J1FHbxyMxgVHShCzn2qOpXhVruA7xnhZTeOQ+lfpmfcbxMj9wV2gS/7DvhGPhc+D6OWsS2OKON/IPcV6BBKS8NiKpb2/QrM+GHi0dgPcn16GDrhHtX/wJ37/UA+Of3+nvMQ1IlhugksbPkPVzLxnvHYuuz1Kx4wvBrc/v+L8sUwhVCiDdFcKwsGgy372YhXfc2uDYzgo0HHOEW4QKUO+tP23Z3U5ZeSFQ5CMOd84Dqo//RvPCRVm1sgr/XB3i3EpXTtVURw3FvzT9UCwc8BkP150L+b/Vz6HwDsCLzKsg0q1GZnVNtH5LFRjnu8CsuN3QZqkJe/cuhubBXJJoMyCzs3dx3bM8Fq+OJcv6KDykZAVTL83DyiId+Dg5jS2FRTmtm0ha5DlEbLsLLaZe+E/SCxvr1PHCBYACgVFgGyNOZwVycbefIB1RTaOFMQ/5lUUP3nVXg7bB5xh7ezQqZmpC5st28qOpfFT+Dr6V/Ydzu9p40/PfHDnoD166ZWwUNAkbV5nBsqCHsOdXOB/eVURK35fj+zIl6k4Jo8gHduS86xIm227Cpn5hSOwcYDXb9Xx1lQj+p6tGgrXb4bOVE8/65kS41hYlHOeRc70k9HSrcM5yG5o16jieO9WGQbePU3bfbXLt203yYqWYGF8IXTsmwH6Lw7gkajKJr0/la7X1fG2kG622KuVbKXl8aJIVS4RogUPRVDg0eS4+/h8B8AEIBAIFAPQPKsoWsldk770VEioN0lC0aEg0CZWMNIRoaEjaitK4lBSpqCglo6gUoai0hLgXNYanLKtml69f6HitKk10+g8yxKzIa8J6kjsRAYoNWmB9/yLKxexkr+s/0Xv9ZdwhsQ2lVlihyoTjOLNMnTx2ptLMY8aw2ykNen+L43fF6fR+TgS4jKpG3/OPcHZxPVWvCYWd+o/x2U0VeNcvTEI/plPL8Gtsd25hKlZhYTdbun12KYqHrYPknsNw5YoK1Hj4QaR+FzjYyzDXXoVdm3eDuMQE6rnfwOFz1wA5j0ataFPQVlCFW+UOoBIdyx1tzpifr00Tsg7DmwfXUSN2mL+cmw0zHcVhf0A1lAo58rgTFiS5ZDQEn2Vau/4EJ/xL5VHzlKnsoxHovLOHh47f4d6mg2CVfB/NFZaCYlINS+NrnnbYEVJs3/Klo/cw/8woiLlrwQ8W2vLUenFMC57Nqq0ncO8XK7T2eM0nJdfxWcGX/HKnMhTbd+Lj7nX419EDMoxu0dV1Nhiz5hqLFUyFN4cPkHtXPS4+awiqAmm0GE7yZ9+DOKlDCjZXWaGw803QHfEYvEVEodcNyVdQFxZNiuHWuh8wZ3kEdJxMgJa8YdBtOEHVslsxIfcNeXeU8DR/DXgqfROfSdfAfXdf3hLgAJ0JkmCh+55I8imWxtnwlMpKvJwwEiwfe2Dn6J/Qd+MDWlqI4n8HuiH3qwbvkR5F+923YqKsI33QUAH1bXlknFrDfaq3+P47UyzP0sXitu1MpWKg8r6A9PJ1eHqZKtQ9a6b6z6dx6whntpp2CrVtv5HoZKY59xZjurUH7siO4LtHREBdVIgPzffCbJ9zmDRuDmQob+EwPsu/n4/Dp6wA8dPNIfjqWBhlvgQkvs6CUtVavrjZFnq1tuPV33PZyS4WI9pP8FeFYpCZaQ+Sq2WwaPta1otIghnVt0Dptgr8mfWCc+0DaFLUXc6vy6ZF6oqgb3cZpFy14ZD7L/jbUwfXfmjj9+hMKFRrp+VdYhA2ejmXB+qBv0Y5GfXvhiHFDRSnEc+yyg30ael70IGHkExlWDx2D7hZmcMxu9+wM94Ni585wpOaLDQZ44itxkZoufMNJ2h7QsmiZjDUHQVtq5H+Ku4hI/c+7qm8R8r/3uBH4VN0NrWZVpvep5ut2Tw71w6erdzLi/8G0f3ICdhZWAw7NqSD+4IoPNGuBFf6P+NB40JwDBOA6OvPwX+hPPfpCWOsUDnelzvNriuqaZ5XJbJxCIhu3cZPr00Av4x/rPBwH04X1yWFMS7Q2Hqex4Y94hVBv+jwK1PI+eKP522NwFHyHc89EQ9hCRUkuf8Tn6mthCvzJUg3wg/H9O4HzydGnBc3AS5sycLGn/dg2dYOjgqUgf9kjLFs7UJSufGKbl/fwKYaIiAzzgA+Xk+gr+pxHGGug7sltNHvhTGO+rUWZz7dDf/1uOLcXjF+rqADnvtaYZ+PGqvMdKLKaAbBF8QBX+UwYIwbD4b4grhHN8WOEgerHUa06P0D8LyxHS7q7EWx48dwKOgOSvT6s7fnfPJ12g4yFWbQIVeJsYnl1HrbACe1ZdOkG5mcWzUexKKFeYPWeRp8d5NCRkmC3+wHaBOXSIlp9+GIXysrCV2A065TuNNLh0+btkPWimLsVBODpPoQELgkQbN8/3CbfgWLzi8ko8h7aH0pAgtOHMEOizn8+aYZfPe3BKfBN3TYYD/d/XgKpgwLwZvH0/Bm2XtqWGQH12tPkHCsHhz8+BpSnpjjaolufA9tMNevjV1rQ1l/0i26pnyOupz9oaNaH0YdFKUJAXbQr9wGklfCYUXRaSIWIBNpL5ymqoROvb+gO8sIFqxaTaLPf1D8pBi4Mame/P7MJTO90bxvzBPQXB3CJ95LgOJ4hJs5dpSSWUxRn2V4qkY1GQqFULysGjyK3Et3zTdR7ux4HAe2sFLYiO+oCkPuv3sY9qcSJ4fmQvoCA76zPhj1o0ohafsBsm2VAIVzobjhXhaMaNzM9h9NwD11MtCjG6jqPpu927biOAdBWNOrAm8D5/KZofn4zkeINBX3oNmRfg45oQRTd32CuPBVJJWjj+JfneD31wMco7+BDytvA8mz8/Cx8yHcZT2C9mXKQ+/mQtIQ3QZpFsYwgkR4xkof+pDxGfN7o9gwQxJdFk2mOZ2KkFXbA5P/beXrGdYg9M2WoubNoYGCk2gjNBPnPTkGdlcd8cr3Oaih6oJF7x7QhQZdWNxoBZ7qqbhQ6ihPF9YE9fgiEol0ZDOdRE7ftgG3Pixlq4dmoLZ9gCyl3OGV6RM4WvCKM9pl0HhmKg+5jAChgxo4YX8C79AZAZm7oslvzBK0WX+OE72ng8b6cTzqrC0qFi3krswb0CtyFuipCmTWz6Jkg3fopRfGK52eQd7sz3iT56DLiPlYKncSS0Xm4ibbUTDKvxNLZhrT9KvRcNbdiQ4+bsLIZY+5Lz4JZKwqySzJn48l68O/2zdZa+wCtFhkhhfz9MHk+nFQPfWGNhU8pB+6TrTh0Cv6OWU86BUaoPvZUg5pNYF1UULsav+WJI/LwOKxBpTX/Rg/TWrFDcPK8N7tPA6fmMzevqdoceZF0FKW4Mz3VTR/oT9cXuAAWqcOgqGUMFhmL2MDGXWKPOSOXydUQ1eIDtQatIN3WxmHrTIhHR8ZkpcwgKXb72PdmXjYtn0V+4f9o6S3EtB6ZyWuDJiI056XcG2eOPcbKoHT1QTIk2+iF/eaWKL2ANtdMCbxsOn8zdyHOyW38go9B/gzWQwcaupZ+sh7uCItyiXVEfjm5RYcKBwJAhXx2OWgQndn3eJ2TT3YfGcWiR00gsGX9yBUeSvXu10kh//2sImuIiduUmXfhhD6Z2AJQfvcIfOkAVTt+o9dlI7DpioHPvxUiexjf7Lnky9QolOOHmudoCC9lVyOrcMdJ5/A9xn7+ZRpO0jSD/y8Yiuam5+hlifq+DRCF7qt93HwvXCak+dLhjIniG+fo4G3UrhmfB8M7amEwfqtYD2gCqGeKhQjMYKrRM5io5IFjTUP5OJx7pRn2sXtBRvh+KFo0i8ZBycfBsKylmzyDrsJWqnTIeJVPa+YuB8y7v+CqbomPKJnNJ+x0ASPQ+coda8AJNx+Det+3qUpM4ww2+c9/H5RgS3TtuHCE8Hwa6wYiIxl/iZfhH1/58KsM7MpbZ0020w0pMaXs+Fz5h/cUWhGHkOCsEtuLX7brg4ZT/JALk0dL+r54vsr8/ioaDQ66hlC/+IO3CxBYLXoIp7ddp5PPt0OlVtKObIvE19VPad7VYkcsuwx/2iYT53zjaBZ7SyP1PhCbg9Fqb3OnZqey9OcVb289vN9XNzVhXYSx6g9QxuGRxjTif6jfLN2EJ32bOeXcdPhU2Ehiw0dYN3R0vj8RRRlisnB/HXZVBtyn8uSxHnrvLM48cEXyixMQMV3IgiT4jHYOhnurDCHfW76dPpzIp+uHID+hU/4WsFZFhNbxlGaynArWIutWpswfZQqfNeVh4I3Jdw/0hz7+2fi6qnVMEHvN4kmLCGZ1nvgoVDGY7NkYLIc4bwZs9jWfBsdjnTiU8EeXHD5DcvBdf798Q4WbLrJyXWiIP+vhOasG2BjjWp8Y3iXVu39jUFn08nTKAdueB8BHbGHZNYtCQkOsyhgaiesu1TBNi3P+Nr8VEjPrMObT9twdzTBRxs17my1hV/TvoCZbgE2pTvT9yNPIOpYPsaYHISrLf8wxv8mjjGKw+79o8G/8B0LDHWxQaIGZ4SGgcbwP7QJu4/7qjJBu+AHy6f+R1/ERkLNEoZiy23grWaNjv+Z05sFdnDD5jY1BqrSj9kL0CTWkFYe0IL0R+t5RWcvVWZNwpfFN7i9R51rnlTA8QoZvF/XAF6HxFBNTACuz7fgXY+kYIbJRUzLugPiIW/gVoU6TDMIoRi9LlgVsw1S1ezB/XYN2C+YQFF5D3GG2BzSv/Eaop3OQ/EnBVYVOMcRDvq07LEabK1fic03LiJ+C8AVtj9pYL8FzrDuRt/2AZK+MYaVPqaSYbwN/MnNxhbZJ3xG3JC1BU9R0bJSEHA7TO+7nGHXmEvQMN+a5o8aCZKvHOm6SiWJ3/1OjrJ6YARxLBF1iYK1v3PibRdU/O2B568YQ7vDAu5MGKQovZ/gMTWS1fZMx0DXd2Axfx+qj/3NF7pzMCdVCmbOXIaOR4Tgmls731ceYndBA7zbcoYkZCM5c2IZaCm5YNznUaDXJEhBk85BXcw3CA8Xggu3XqLvozQQWWYDU/I309oebVZhayjvcYZ5Cx5S/oFqzvMX5y8aXmgbVIfxosG4zCsWLNOEqD7cAsbp9/BeSWkwfLcE7LZOQX5YRL8WWJGO7U4qMT2Ije6nWeWQFfjtaOSUhDq0f1HBTemHcUqyK/7cnEoZqZ9wSeF1rNeaA65OJnDvZAwnqLXRsGUehhxzwIcZk7HcOxez869DSOQ7ELk2Hq8Y20PAmnr6WVNAdQ7d1D56CjZ5mVPX6JXYkyxB4THjUfVpBdfl6UJfeAMER+tQWncfj39nR7tW3ISmpbp4WTId+cx7MlMKwpKFUjD8ciIYJN3ijuPf6I/UFJ52IJzg8wI4f0uNntjOo6DlA1AyUxh+mW2j3iePOTBiLYSY6TDkuWN4UB4/mzYPG8YZ0rc2fR6lKwGxDs7gev84jHivAd/F2vmB3UhwyPhOtupd0BXvQRLSV2D1BiXwLnLFzSL6GC0ejlLnFpP4+8esNv4qny835tjKSdRi8gefiTlCvudVdimaCVO/+9FQUgr9HhiAwVN74EFsIK3q2op3c6rAHyfAr/tucKBoFv1RzuWLrp84dM4CXH2vHNw3NqJLiz7PfepAgcnWkPnRkPTa9vKF7VPJsL+AzNfmkM6CKhBo/o0aD1zhac5BvhqqBxVRh5j/buLxER8JDfcibuwE58geHLn2BCXvWsJJ+oV8zUMC8jxc2baiB/LcH5DnBGs44vCdBaKf8+DfQcoT1EDPuc/wUpsVvLk2FmT6vLhmVAvx2icYsewzbn17jH1Lj9OO/FgsyrKC2/nK8ETrHblJJPDh2gew0207ykqb4aOVVvAxXwEd9pnDFq2X4CKhBdLV8eQDVWAyOw0GlwvS4vMNOG3KSx4z6hYfcW3ml1Pa6KmSIliuNYeNC1aB38kUtBJxxn/Vnaw95Qa8WvgVstZ6ceeWVZioiPBetI+CewTQR+E36O4o5pKVefDFq4QmxUmS18hrHBc8G9LiR4DZbWNY8k4Co8aX0+grSnjQcgg0P87FrfVZ7Gl6DdQXMxzTVoZdsQiXR17HWKN9bA9fOCwA4Pa9UZg61hdct9uD1scs7DEYAX8/m5Dt8HJ6GDqP+6wEsX5QC/ZNVYCkuEKwnkKw+MNh2BbhBNtiG2Ds/gScFCUKLPGBZlwyJcEcRXQpvcPlmb6cp5KFqofswWlhOm7WGY3ZL8/C1vszwPmLIHyadxsyFwL/TSgkLb/f9O6nHuSne0OnvgHOkdChpd1tfF13KpolnUaN2Zcpb7QQ/S4fBlypBaWCTZShtoenO1pQWW4hKJ7PpY5ODxZVLwXp3SnQqT4bxj8fB5eua0BpaQoONFxh2yvzoSblJ/qp9MGRk8X8LPktym5aQCtaR0LA/pHgGxCPka/W0Kn7n9HRTBJHFpfhUNU8XDTgDnPUVWDFQnM4bBAEhrcb6Pn7mZAs+ZRffm4hhz036OreYswW0cGOjbksr2IOx9NESe9XHVzy3gAeH33Y+/xV3HZ5mGodymD3zj9QcGEITGqMwNt3JIu1vebfPsdgZogl7tz1gg9WFHNPx1UsGiOBkRf0aIGEHfxOSWOtIw6kDBd5SZ0zB3Vm0NhufXrs/oDGxMTQ1keiPHDDClwDe9jdWYGTvgVTcH8K2xpvBOfvomRRc4amfBGHsMlfKatVCx5ck2JP56lo3asJRzQOwaKALXCiaSRV5/4Do/P9ON0+Dv2njgN/g7P8zXA++V/aSDMCq9Dmgh+XLEQWTVXkmvSpIOQuQBs7hKEheCd0p56gg9qz4YWvAO0x6sC64G3ovWIjydstoJIlCvREaRzMrZCGmjktVH1uDXaGnSarwCg8NaKSPJY1wdTxZ2CxfB5f1TWD8iANWpi0m8xkEyndvZm1pwbwe90P8OhYAfyUlYLRlV44XYggr1gVV1l+5kWTHlGB1B9yeHuEP1cswPmizWjqepMjtYbpts5ISFFbDQM6rzj55A/eb6MDI6098OWu3ZT43QqPLvsBVvWr8VG0LhSsleSdvwLgk5EF8oa79CU4G+Ur5lNnxwk8l7aSnxwaoB0CCLFzrLjhkQ0u+lOLp65UoqamFZroCFFy9DosdBIFq6P9ZNUoDn826PC1fR4gVqZG33dGwO6f7znvwj8UnfqGAi+as1x1B9WMBNBRfQdZ5WW06uQUEqmupUudYWj0qYX/HkjBUtMEvmO8D4Vc7CDh3ULKTpnJOY8/UtgVB1Suyef8F0FUIXMTWLGVvgZYwOA0e9Be2Qwzq0/Bg+/F8C05jK9crcc5z2zo5n96OLnmC809854e3xSBUZfn0uaYieDrrsylqTLYK9QLOpKT2FLyMkiMWkbasnvhVpccnLwjTPWe06BuwU+qy/kDMt1GND5MBB62xWH8q0j+PrMDbmmIgYWgB0KPIru92sgpa/fA0YOTQOXcHMzZcYw/nPKGVZcvU2CuCay5VEOfPvhxhJQfB3kdJbcvutg86yoodjliUMUx8Dz0C/faOcDoAzb0aHoUq087y4lNFXxqhjYKbrLnjWLXcMqaUggfrwRnfkjCgPZ3mO16kc10/sCYG3mU3HGXbU1N+NP4eiqf40yBL6aRGcvBCoMDeHpbF3zc20Jjn/wmA3lxGFp0h8KrFmKg3w7upjooeiQCyVfewf69f/hKoixveLAIcO0yKpjgRrnijRiuk8rJQVfwrK4wjNsthG61E7AspANeDevgCVtDFlbLJ9kNT1Gv/iy8sr6G3wbl4PlOeZYt+UErHOR508cktqRyGnLag+Q9Fzq3FfB6zzj03iMIo++8odmXzcHHLobLBGM4dtMiWDFeCT2zLHjp1QwK1H6MI40VIOjnAxxjuZV8xgaitIMtX36bj9W7LpB8iBTa6/ghbgwnAUD4ZJ1Ml7zXkkmIPmsppKCTZyccF42GdTpy8NJvAs4oDmFdo5EwQ3Is320UoytVQ+ju/oUuHMzlsHtbYGtOMsh1t7PDJFd2+aMJv+2ESU/kOgbclsRDVwKpPaicm/7JoL9OB/4pu8n9fj/57UsdkOxH2pT+AGyFH9GJaafJdNVh/u+eHjdJz+PA+5L41D6LYq20QH1jCEaY5fP5bZNIo2Yn+WrNAK/SRg4X7uba0XGws3A63HqiBD/M59HtD+ZwoMydnBa85CNWYrzhXAOaTp3GUonncIlNB7+yNoAzk4xp/t4bVOShSPpVHfxQuhpUI0/hvM+l9KV6JhZGa9KCBBO4uESOdy8/Bj6XGyCy8S84lu4A0B1JsT+GcbVsA76/85APuoqDV3wV/V5YBme6N0P3Yws6k+YGF8ZX8dKZt7DjVjS9rggAS68RoBAdTsVtDij29Aj8OZLDmuG93GBnQi0PzvH9UYoku3ITqSfLg5bTTP4bu4+qxJvJVfYQeXZco4WujaSlvYltx12i2uoWXBNG0OwzhFvLD8C52tmst+cKWax/Tm/upLHp8pWc8OQSBsrtx/iRdvArMgE+ryqDO32O6BdvzBkTMqDKbRM7zKsieYdHdFlpF0++LQkv9qyiMiVdfvW3BU68PAHOPyVZ8UovNS49C6/N/HjY/wmLgwrsVQ2jyhFCeMe8iWLCLWClz1gQSOpBebPzqLbciqc1S+CNVQAXXydze8ZtMl+QDhk7HmH59izeOXQaHhn9ozjxBdy3rh76u+xgwffX/GtEMjw65YNNiQu5F+ahYcpy2PAsGRWNnvB/P7dg7ViGmOzPsD++AbWSw+jcGwXWyB9Nqw66YYBDPyoEpOHtlRmQtNsOtoSG8x3/TnJTCwa9GcYI6cdg6H08Oi5LZoFzT1E0NhtUz6pDj9pPnGisRwuujWYni8k8+2UohqzqRLfIQDTctZ+KllnR9nBHOLqlB80q3+IVX3XIlm7iFZrnuWSaCBs0zyLPIXmuazwPQhkAK6Tv4Sv7m+DsuhYU1Sdw6jtRaF+cAXF1wVDOPvRLMgBXrbWFOG0drhl8zbP+W4YNog1gM5hFJ702odJMb865fBBKhfdjQybBalUXdqs3wXdXHKgj/AMpTB1g+QOJZDryPS66O8gxb5Q4cRPAJodYaEqPAFJI5aXyJ6mvyp4m3FnKnRuek/qUUeAb3QMVw7Ig91YBZNPi8K37Ky5fto8m/kvmQyZOMEZDnV6F34Rl7ufhcagDHP8cztcu72XHlnnYk/Scs2I2QNYkK5zcuhV0mitgZosmFQ5Zw9oZB2Fa7id4dy+dfrbGobJCLwlK64LD0i2Qa/+dVR+NoFVTlYHODdLjZdN4ybV2ite/ygqVZnDfLRXOKe2n6sP/eLGWCSvNMIX6KTVY8TgD+zQeQ1j6Dpy34g7s9PPFM6ulMHOvMXgOHCAFfW2Y/dUC24ZdYbLZNS7UyiAly/e4WD8HckPTWVh5O+mtUmXDLRqw3k0HjHQHcNu2ozj/y3jQNCqnvpsEd9ZGs4NABSSEu+IRbVGYkG+NLf2n2VPxKqnMGQbt4wn8PZPAXOwU3PqvEc+XyuFEZQfo0ReCK6FNJP/fZHpw+zb0W0xgsaAYvOpdjqtOXKItmkqYmK0Alnm3uF79PW+QysHLbiuw/stl+NgVBQaZHVjL57H70XKMSLSF82TOLqJLsOhRKclSDEwZ10o3emtJ3yoZtO4/4pRnn/jUN0vY8G4J+Aqbw7+L6+GzsRF/6rXn6rbFYFOmC1ejDvCIqyV8d5cCzJH6h9sW90N+lhb/nbmFyhKvUMedGrpvqQ+3G0Jhz5ANjIyWhR73zxgtrYmBc3ZQdYcwN3j4wbvjRnQncQV+CXiMhxOsaNI6Gxj/vh+6Tn6GEl93fPpqE2y5/IBenEyjMnemrmx7dHxxDr7GCUKccjlfib1Gmjrf8GiiHU3I9OWaiedQKnARaoe68yWtGZRUbgQ5F53h8dwpPM+vEqa9fc1fK0P5aWs6fc+O47umP/jKlaNQFz0B0q/GgJtuJXbmlYB38Rp8VYqo+e0frS3ZTkK3z1Bb+2uouysHTzyQqmedYePtPnhhhyzsal9EUap98MffEl6IbOCwzot4feQY+DL7In4Iz0M5jWUgnmFK1hXhHKXUDWcyG0HviiqpfBLERlEbOBLwBa4YXOfiqPm4R6YS8mxN4GvIWvy6fIBKsq7B1k9NvGMFgvq7Ooq5W0fHFJ6DsPE7MHHQxdVWx8nu1zf2s8qBOvSCz42j4drGaRRmewj3hphQaJUnTO+aBSM/BXD411n0pfYHKVySZ4sMI1CcvxUOP+vDoE8eXHfoGLw+okhLbgjgzfHa/H5gDm+YPIYdd8tB2skGUOl1hlM/9+HYQwjTVJZDfbsI3PMqhkM3vblx+R3IHmsKUyUq0e1hP4S+NaA93kMEhuPhRZ8nv3u1EQt+OoBp0VFWWmsHl17FAeX/5jvW1SBQlAku52dDj00hLarZyUsrVoOgsxiFj1GGv9WEe74p0dK+JNKffQtbD32Ck1umw0SnA1Sb8wvW7VpIXoKG8HzFKVqd/4NGTXwAe08XcOCrI6yXchItl5+nTd+rcH3Dap7SPwqi+uJpzKdC8i7yIEezZIDCkaTacQOUMzfx5yMpvKtvDfndFYMPV33orlsYNQjL09eZaXzc+BH2fW6ld73DsGXuIQrUvoaTt0qDh1cXeJseYLs9fyH48CW+1p3Hm+etZX8hI0qL6KcBnw345L0hyHWG4FC8HZm/O8YCxpU4YeYuuqS6g4S0M6jGZj3XbO/k5RMRfCuVMJ/cOPqyPvRMW8/aC8/y4RhGwzVrcUHVSqgus8KCckk4NHEZjt52i0cOhoNBrTa/WCnGywRLWcTIkwouRUC/5C76dMoO7liEwu+9Hzk89ih7FTZQws0gsH3ty/+ZfeOuB9chLf0eGMSMBPmZ1rAuYwyeOCZAa92fwgpbJXLLOUlTa+zJysGFFmx5j7ZLrKGsZwMYu+TDwfOf6JRnHCl+TeBRX+dTUKkk3snyYv8399F+lhyoTw+h29oD+DeSoEpxCf7w0EHL/EjSapbA6VNyocqmhH2aAcb/ekEhy32huDMXr165go2Jxry8xgvn9mtyaqU+pQceps4hEfjyKwg1phvTjqm7yEhoIp5zCeVC3y/85WgaSxzrJadv0ynjoxLEPtZCGc8iakj9Di7CivC704IHL/vwow97efGt5zyjZTnIf1OGLZE/uS+rmNfdU4G7wjuwRWEGea4sISW7FvZcuR7+yoyFO9N1YahTE11NguDyy24euyeLnP87wA674jG46w5t3LCaN20pA8N3wqC+UZGbjv+gjfsU+O4zL1bRmo9Rypvgu8IyyDv+i9T8X/G8ECNIep9Ck++5wC2JFnifOcB3vn3AKNNeDE2xRTnlmXw2sB9kzWVhgdwVXPvsK4p/sWWadxQ8ZpdiROFomltRRz9cq6B4Rz5o9ivCzFHvWHfuI7Lx6KL9u/NpzupTsPfLFDAicVy3PBz2X/VB2YNjYMkCf94jcIkGnZvQuSAXWgVrwWv5Ftoaf5Ov3RhJF43f0S8NNTjdXMa5ma7YEZ+EIyb8Zi/bjfT8Ry3Z58jwIvNlPCM/mY8Lm8FhMyV4/bkXVhcnc3JDPl+P/AB2yoFcJrEFowPfksztKHB8aQNyO7xoxu8I2tBSCu8/D6Lw2YucqpzHNtlmfGP+LDJeU8frJxhB97LlXKAehU0pXtT8dBP+vOcCiauUMcBCDD6qJvGXLVf4zho1MB1tRHPnPuCFHXdQJziM7+wrQ2fPmVjz7A6Vb5KBytJs3pHlAJcapEEu8QYHpWSjhfIOVkxsxv+UdpG841t8LnmVtz3TYi0wA6fgNSTx4BFuX9zM0z/dxdruXl5QEQPLWvdi24E7nNhSjun71UBx1QLsVavEBK9m2hOrCwJ6YVBZGMOOa5rpa9l2nPyzkVt3Inh5ZOLR3Ak8K2sfCcTFU3BAGulNCcd1fh9gZOg07s4klP3nCH81o/CG5Fz6eqoG73yppoJL9ryOdqJvzVOMXPKSxZ1VKGDLKJjX1AZ2O+7weulxMGKNBx8rq4YvUREw+sAYDMjPwtB3gO3uDjBjdxJoyX4B2bvNKLFvJhTMeoO+k3fhy2uC1CSeCvlX5NG9QAWu1tRisJUDjNqbBiOkHWleTzrQg6/EM1az2svJZPrSHdsyjeBFeAKWOqzDV7F7yPlhCDUvFMSqB9X41MWbVvsyrpn6nWreqsOqiDPc469M6l2XuO9pC5YIyrMVdMMoPabDE+bg+vUzqLXFEjo0j7F83XWenygMjY/MaOjfWs4+uZXiDFXx5pzt5LYzjfbnmMPnTgMe++Umev85AOVjJXFWy3o+4/qBygSFoXp7EOCZfi4qHA8TnOJ5IOcuVv5Jp1fbtanCajIMW+uy98+PaOrcTdGflWD6mfEQcmSQgk71YHD+X1bYUwImoU/JpfM9zjdaCGc2WqDIh9UoGqkMw3MR19uvRyHBfjh9fAy/Lt+Nvc8TQGr5JBT/E85HxZwxSVwIpG3cwGYoFVSihDBl6jpSPCYIsQ4JrCnwhFvm/QaZt3dA1FweLMUUqCsmgZ9Xx1PK+VzIrfqHT9wO4uyopZA88TSYSm1AEzEjyF4kDeJC3Uj/2jhEOgInX6wHrVmGPG+qGjlYTcGMqq1kEAXQlWCBS7YV0/ggRTTLMoAd58RhUs9oCnsgyi2eASD7L5sq7iNM1VoKx0Q/Ul07ge6CYGh9HUuWv1tAJrqQpsxJBWkVNdJ/ZQgfsos5fLwyy266zGIH93DEi8No+m4ax85dRoZKOrxCwQIdr1nCcacVrJraC7ODl9HP2dM5IX8hdV034fyF2/lhYCOdWVyND5rlQDa8nyvH3+XSuVdhgut6PjzOH05iKFU0arNDYTy0vXpL1cnicC/xDEXEZLPIqmG+mjEZ/8v+CBdPVaHkGy/YmW4LoZ+qUOKPGpzc+wDlJ+VR0N+zVLg7FVwPbmNJsd0cHiJPuWNH47yB5bDqtT70tcjChXlNtH6DP/X+HQNZa7/zVB0T2to1Fwcl7aj8+DMSeiEE6+se0q8lD3jyM1H++noiBu8vwE29YVjfmo+3i3o5yH0lNCWNgUPqanxr21IqYh9wnniMhw9OwlKpbgg77ogp90vx1G9zGphmAd5DPmxz5hPcalGAzFcb0N4tky9UxNLG8eI86nQ7BI4+TQs8BaHJpZCL+k/h5Hn2dL34FIS8vE3aI06jx5M9mKBzlFa2XualV1XBc5sDFLbWs/TS+3xE1YieR3rhj+pMDloUBXPdF2OjgxyMqRoFvuadsOTbVcySimQplxnkd3YVJjwp4KOG9/HQ1UQ27TpAfTkicJSl2Mt6O61UNoDitCDYU78Em1yc+GL6BlK65c3Gcy6DcZ0JtB56SUWqC9hwIIavzfuGM5IksObldcgYuRNvFudg/8xqsBC3AcmOMK6wSafDdW20Wfc2dTaao2HeKBTetJB+FGhiXPBN3vVaHzSqbPni5CTUOBtEl9aU4IrhR9iVMoNO7vyO+0WL6erCeVziJAA+sm/Bx7qb1jdq4beG1Wx4ZyLUpcWR7/GPuFegj+u9hPBGmiEI3E2lt+oHCaKUkZWbaKXlGPBPHYK1x5dDuvIxjopjPPJ4HKhoHMS1chd5/c2JJF2QRy6rpcmnsQe/eJSSUfMHSHGwwkteo2Cr0CA5j5zJ4Zu+wi/HW+h39TaWvGOKFDlGSX2fMEJ0HAnel4PBl4vxb/hO6rloxrueWiK+vY5x14bJYCAb4/YNo+SENfzvgQJc7bOBDSe1yXpWM6grrKOyLx78n7wFjNiqDA0p8nxvKJD9N48Daxs/LA2bSiKPP8AIuRu4N7WRom5W0PxxQqg5XZHOpzuhjKckvF7lw3vuKpOccRynmPZyUuh+/twoSEvibFBEu4NXmYhRbJgmHIk6yvd3NXNNsRBOOhML73omU8PLUtrxo5OMV8Sxkes9VjtkD6+PvafL6/JR4F8tFw/r88aJnmzcFQvDl69x1qEeDJhuySMKxoK6/FkolDXEQt3DqKp3nZd8NCOho9MoJm8QdhyXhv2y/XzS1wQyPSrINHMxPP96ioWCx2OF/F6uiTCg4oQtcG95I5wbfwEf7jQF78wSrH/+EE42PODfL1Ro3vF5tES/kMvsWxEjHYAejgDx+4awwGEuFx914uZ+D1occwILTgZRstQR1MSfUBwdTEqzFKmjQQjKrA/ijoOn+O+sMVCSaMeXn+2ilb7vQTt0Oj2rPkwrNuaDzTNhOMXdXPPLCjQjhkiu8gou2SJFotf28IsGcZq62Ia2K6hxpIEOaL3t4SUBSZQQNpbfVghy2Y5J+OPhR44JeU7d3jUcnhDCNvYakDgsyXOqJrGhSTS+qd9M2Yov8Xz5Bx4+2MQBd2LpaEQNdYQawrX2BWC9rYJL0tpwUKiNlTUcyVIZ4HntBaz5psbjglMhS4fBdOIAGMfEY+PeMfBgthyvGa8Hl3uF2Sh5LEtrhnKoqRfH6xlD03AtL5wsR3W2e/DF+tvkl7wEVHZEQ8PUe7jNaSzZrcihA4JysG/6I/DPisD88nH0vCGTbn2ppsKJz/G6zVsOX3OV50brcJulAbRv6YNaTKJlfAtCHltyxb1HkNW1hDKXJcB9t2V0u80KduRqglXPLd47MgCOH/LFTy8PwsmOU7ClYwUp3LuDZplufPTNDVplDTB1sB9/HtwHOdqn+Ofy+xxluhjcQw/C9EV76JFiDxt6pdP+VBsodfPnSVP82UYBQDfZE8avOwQx1TVMR0/ih6cMwmONuXa3JmyUVac33k188oUxjCnv5IeaAlg8qoy++htx15osMtyuQlrjVSDhlBKtG/yGiYrbqFBdFrJTFUGyYjsPpzygcblLOWU4GQ7WqMI71T2w4Fw+08ex7PswhGXnpOC66TdgsfMreOgQSVZvn1POeDGI6/SkPyu7wb4hj/+p6OAmd0fOmrEIK2T88O/fOZT4bg70CAnAcetJnD3nDI+c3Ew/k/pJar42qEyQwRvf6ult9A/0OzOVv6ULg2vcSD7STBx/LwilAhtx/N5FlGuQCgb/suBGwHdeGEGcvF4UUrbuRL28jXDFleHCTwE4NzUapCzGQMG+6STndBei5v8BkheADwNpFGf3A0siFalvvzJFHp4Dhnp6tGlzJs9ddQgcv8/D72utQHa8LsQMDUDNOQPwXxwAOnaX4JbCY7hs+BTzR+5g4xWMga9sQfOxCmaLFUNgpB3Y9juTxKcInuX6kMN+NuK3rePhSPoffBAgBZ9oGnYmHKP3if9IXHkG/6e2lc5JOtNLzVoYvXYx9LxW5NWn9EB22gRM/XoFjh1ugLAn7aTp8hf9f5SQzrylsMKiCmPdzHlylATML/OELE9tTJNQxPE6H3GLkBQHvWnAHqsknl+3l1SGiwg3yMPLb+1c4xqHW1b1wKoJddxi/hK/hR3CNSJ78bi1Aze+fsg6V03gam4x7A7Qgy/PX6Huyyc8Qfg77LtUyQOFd/n4p/XQffMghk4RhuxUN1jv6Ezirr+gPWAWFYfeJNFzFziyqQQ/iC2FbZpleDlYDVpCV1J3JdJ2raVw8e9OOrLfBR6/lObkjUZk7+6P37reQuQzK2hrSiEDy7dYNdjDgk4+4PxuEkZs8+KIxrnkND4NZlTagfpFa9BJmwwb7zeT780DJCZeSL1uflw09xNa7L5F634toVsayWSaqwmiF2rxzMBiOFB/Ey/0PqZKr0+YGRSM2X9GoPulA6TYOEibq/Xgu9QsXD/oznYD++j19Td8NjAWry12Y5fl+yDG/RJcRzsYv0MeGt6YgZnPbPIqGgNmJoTfgmrB0OAF/534AeZ8K+cnz0xZZYceyNR95UOTBfllhjEvzImGlY/LOfSXCXpPsMPTF1PhgXsy/xzUhKGcBHwe4U5NK+PRSC0alWc/Q6mFN/DP63ReNzDAIwVNcfkqMzg0IZKnz2fum7oExryeSQdW7uC8GVHsU1PMpUueYXDxQhqhJwIb/yTSEYkfuMr9P76bsQ92/jyIBz64UN2helrc3k4pjwfIR208hOoNwpvUGpCemsiv1i9iydP3wFgoi0zDJEByyStKnjiOjt2Sgu9psdhnv5xuxzwil3N+WJ82liRcHLEofxT41Vzi4R0duOuRAfz7fgMK1NxBJQihZ2YZHp5eDxGK0/D33xVgUhYHki8noO4Ue5B+fAyWTQyGGm01UJDv519Fl0mr8SiJy0byYYdmFMsDtF8jDkvudkJ0syiIamihX+hVNstsRqd+R55j4gJ3tFIg58MQ+topwRJTRTz6rYn9ZpST/EYRzm5z4+KeOyQ/PIp1kuRoyWMhag8bAR5XneCR60zac/8lPO24S2opezD8bC41BAjQui2/4Y/NeRb+ORJ0kiXondsw/NXvItsAeQyb8RT8/xyiPw6t1Luyk6yM/vKsSzIg4KDAda1N3OqgyS5Xc3BnD6Dw/tmcbZnBFxTq6a1NLua4i8Gelalo+L2R08oe4xmjh5z4ZzT4pURTEemDR+k3LE4dxxY5BvBh9k1UmOHOpasVscU5EnX6t6FURjTurYyklKIbtHXKJO4PNIO87CewXcMf1EfLoJfLMd61gyhtogdPbZIm05/ScOaQPJw4YwYVCybSg95JdNlNDm4P3oCTDRWQl5jC39aIYIbfei560YsdBQ6gnXECJu63RVh6lGx2FOHzbS9geeh2zMsKxHXFx8Gydojb16rBveN7IU/UGJcGI6+wtAWnL2U8vWEz7M68yHGLk2iYMjFfzQEU3p2lsJb3bL1yGn3zruJJ/93ET589wVSjgxcKCXK7jAcaPbeApGYNWNmijV0yLyhTfzTLBDpCzpAzTCkuw/sxF3hrtCD4HVODwTfD8PhUMJ+oduCC6RKo6FgD+31CefEiGzQdG46fC2XxiYwsuD3Uw80Tz/ElxxVY71iIB7WrQeFBHRUPP0LBHxdg6uxcfrFZHG7L7oW/dVPRYKYh+w5446gTR2BM61o88vA67J71FDtkL1H/JEfwEh8HZyTUoT72Gp1zsYfV+xvx/J9FfNr/HLYe1IP0mP1g99wKBNERLpEsH1qUR8bng0l5kxdkX6ynWMM+nmFvR28M7tORVGtoEp8CI+b8R0JHo6l7zy+wmCBG84rU6e9SOVr59xkW9ZtAjLcFvOpeTvNlW6F7oJiW29zGs6xOox0lOSv7NdaN6wO3/CcU+MgJxsrvYJmq5bhaV5mmzH5AFm9d0OBYL4yd285uSecYHWpJYKQjjPmqSLz8N9Snr4XsVxOp6aMejn5aRS9NI7ngkiNKPlpAO8pHwSHN52j6oY0nJk7H5ev+4hGRVfih5x+cPO1P0ww6YeEkLeg+ogVr1EuZ60/yXE19PqPzj+7657B881jytgnHetEymP3WkGws7SDC8BvsCTlP+6WHyS/UFR56iaD50j3gO2xDIdf9KP6oOLelI7w0sCbB7SX8Vp7o160PfODVOmi7WE/Z1SnYtzYXoqtT0H+3PoRFd5H/w+8sEhlNpbqSHFh2FHLtHbDmgBOkHyxh49NfUCxFAFTOZ2FuwhT+GjSD5gWnk/9QL1s8HsYph/+wx8y9WPEpkPC3GAxF/uMpCW8gdtiMlFWX4RQHLdaX+MjNza7cOXcP+o4RYs12FXiXg5S7y5KLuk9x0u9mUJpSQsY64VCYI8pNCzv52sIuaNPTAc9FL/Bb7nq6t8uQKp/M4RrnT5yruxTi/16n5HwhePxlFe9XFwfzTFHSNVGGfyNK2EMqg4wfKOC3bZ40re0DH/jqQ8rqE0luEGD+AOALJXPqPrwLIlxiMdNogKQXr6E3S41olMwp/C/rJC9QUYDjKSK4OPkfnFZvw1PNM/mt/X/sdSiAl5oX0ffPGUy3DoFAphSQwlbMlXyKMTYn2ENQF4ffFtHu0CPknVMD4uHdNOSjDG71BtDSa8zLRgyQxd8hcj5wl5Tk1/NaawHYLGxLCwdcyPeJJe9argcP5oyl+aGf2DBmJdtO+csn5U5Tse5nEtCfCarX56P5GR/y2+IIOVPsCNYfpMqkD+x0SAJHjz8NPrrf4IyXFrxRP0La2x+B+t0J0NYdhJ1uD8Fn4y+61O2E+WfcQOqWHZf9/AGtY/bQiP/SMe2gEISG9LGa7nZ4Nj+X63u28zL5NmjL+YAiU5dRkWssJb2fQQWS6nBh7kWKSbOk+2f14cj6WyBmtYaED2hw9OUW7iqQwN33F0Lvb1vY9Wo5F+jPxZhYWTI0D4SHoTG0TC4IJ0Qhq6dOxHGFk8Gq3ADqVZdja+0rjJUwpt3rI6D18DPe27+fXo1bxrG/niB+9aFCNRlYLTMWY8454zzPpZCmlElmAaXUVjmCG29WonZfEd9J88TDWpIw7mwJbni5Cnef8OZv+ZOwJ7INdrUt4RFZoXyr9xB+nJtAT6ItwCNHFs9uecjyqQlkPX0Ifazt8fKVDloslA92fBW2mg7yY3UV8Lw7jM5S+3mL1Xi85qLI+OMKjv3si1995/GWMbfh1m45/JwnDdOir6FhnQveXX4SHGu0eOVoCfgZpIrBIqnkEdtHYZPOsOUOVSh87sCl2x1ZfE4KqN+7zJUyXtyYvA/fXz6Gu1dKg4CQOeS91AD7549wi5kTnssToKONyvxc6iQs3R3Eyg9VsFK4m36Xb6JFrWMhed0K+lFzjpteWeCq1DTcfe8fWTk+hl9ZyjirOY4ffRukls2jYX/Qfhhz3pXOr00knQdfqRSPYXdfKbku0eT5OSUw3VeVlFUYLvlZwWKNIH4aJcpbgi/RdENnEnm4kmaePk1bDKaw6+QSdnltDWNNhNE6dBGtfz4dRQPFYcE4fdKP0ybjpo0UeXAfrQi+A913R4HX9VmcYWMNy9zqYPui+ehzRY7tVpvh9OVr0X1bKhUdW0/OM6RBaq0xF6tKwowbD3H9sCpeSzmHd238sVloJj6bZIL+b1MgRsQYvMpUIaQlnHYXLsFgEW+q9B3A4ZlbIN53C0VnPwHrwIW0eYMJaNQfhLSEeMzQqYVZIb1k+dqYXy4S4+Z7hbw/4DK2N+dT31MRiP/zE/5kJfLm0kBe8esYbRWfCJ/a1/Pi060wmC5Hm+ck0b5AhE295bhg3XzIyL+Fp5USWcMyhu313/JGn8vw+VIq2OfdYsX+cTDlgThJPG8Di5ZGcNmnRLdDlXn742eUrT+PdV8/px6Z93CtTwL2Ff3B9W2/0e+IIW3+MY67zm9gtJxFg8+CYXPEKlIaOMLcYAp7HhVQQ6M0JguJ4uBvIfzaPw+GH4hDdUkgHxlrA+Kz2+mtpihEXTmPAa3+cLZiIrxKDaG2T4mUuvcHS9W2Q9asfviafg/P3VCHNYZyOIAK/CopllVao1GAfpLhjd9cq54J7Sp+2P7VgNBGET43F2GxuCUfPezLCSOleeu1Gn5xJwYbfMT5P99L7Hi3GGbc14AO71z26LlHn4Y7cZZxPA9q7qLe5nIOvTARS1cIwfH+UPiZJgzJKQ+45tRUnLVXAlukE0jQtol7kv+Aol8rKCgxC9u0oKreWAh+c5Lc99zEt74XsbxoJAyc+s3WVRkoNvY522gdp5mHdvHtPICtqTvQ124YZwVr0PLrlXROqwEitqiy8DYFOi02Ha2FbQnfjQHLwXJcMaSHSuUisO3DfsirMOLZS7XxwN5u9pNaCzSiAzyv2kPJcWEceeApSjb108K9Sby1W5nPfl2OVT3fuMRIBqL2HsWvCwVBI+wHnhYaibs3KFOWXDlf+/QGzSe8pblvk6AgfRz8TT8NkU0qMBzdzDUNyrDc6gLnbkphH2dP7h1ugcHJOfRzli36bj2AW5zs4ZD9d/wkuofbQtPQOcoJvi8B6A3Xx69BD7G9qQ5WHVsKxx3Ggd7E1ZzyrJ5GCdZCkYIguBxqgexGIcizmoUCUefQpeU09AiYgeDxHejWFEBnAg/yO/F+fKwtApYX1HBm/QJsHwzm9yfEeJeBOOzzdGO16rUQN2IJT0uaxRuTN7NhyBUaW+rI5m8teVGJGmz7TxB6MpdSRaQc3OyL4f1Ch1nHtYYsFatZdd8iGFXyGOMWmlCzmypERgSyQd0g3deYxhEeQ5j7WprGr7qFqU9bwVLrCK1KyKEHQ0qglT+LU5oU0VuvAtLyuqHAR49jlbbxkTHuULlyJgmHecPa54ogUJoE2uLbaE3hIhhxmkDRLBNvn20gl2u+mFjoShXpVlAbIwVhH1LJ0eAJJ7WeIaW7vSyyWBM23l3P+1ZYwfxYa0zZXI/NRSqwpUoQRhVZQcCyhfxGcwNPO/wREy3jQbbsH0718CXLs+qcu1oAJGE737U+yqFT5fi0bhd8VllI821bcON/Rlh9XA87jrRD38Ao2LkxDDa/cseDWrP50+xEMB4aA+3eFSxSDvAWp7Jr0Fxeb2QCET6S/GNNH1VJBPOfJ3/pvHYHX/aeDmoBZ+HSL3eILYrggGVyYNzfgtL/rOhSuyjsktADxfhIHnzXRpYC8yAkYCtFbRGFJluEFeNTMbVqFV+NK+eQCmQXp5W08LwPCXTXsW5wBAybnoWfTdKgF/+TzysdwbkTJ/OIvir2KUByTRpDKqpDaHRPG47Lvyb34FFw94g6pBwbyZc/z0a1MUnwSa+Kfjtrk6vmIB3uFIcptw/wY0WADzJStFq4kIQ+a1F4hiMG1SrQ5pvLYI/mbdjh0Yf198OgUlYIjqsBzf5cT7Ou7cKl3zfBnPvxoGhVhnMMpVjnf+LuQx8Ix18A6HcgK4RIKSsySshIZYREol+LtBSVhgpJqVBSsjJChUpUZKVF0lBJGkqS0aBBKoqMROJ+7lP8n+E8wHHShd7/+im1URharuxi55G2MLojGD1+u+PiLjN8vCEE1RPnQ1mSF4RcnQdbcmVAYNZh2uwkQanJmmy2p5lW166hngMBuK9sIS8I+4AnSzbTxg8CENuizN7bbnH5igCUFMiiSJVwvjCgwS1Wptx58ADk/b5GAiEaUCg+EfU6s6HNagIv711NIfpjcMk4RzL22Ec/m2/j1fidnDmgC33XayBR2YuWi2/n1Z4GkDotD3XdN5JgwRwQXCXC5evv8BN1Avmsubjn4V/4UdkBnud6OHPMNpactwbOZ35jU9ViKFZJoMMiFvDBdTE2HDzJOaElXK9/DBsG99Dlb5u44aonb9liA8bcyRJaomDgfZ9DXoTjkNddknZ7RKNXSIPwjuX4Uu8Y8Z91NBRykp1MBMF08xi+nPsfVk06wTvfG1G4QTkbrXGjvQJxrKv0ik6f2Id3z86A8MkbKE7hH+xLDAP7tttwcvFSXtdWCHvbLmBi1GpWLVlLSbtGQHehGv+dnUmRteGQHFuHNawKX/I9edPGFPp2+xRdjfUiUQFFaD0QSH4JlnRK1JeG7m/iqfEDvO9AMGf0faHysE9couENsZ0yoJVcz2M/rObfZ7dT29qnuO2eEi9xeMu5uqZoZj6NRk8eDRqeYyA05gVqriujYEVfCD1zBMK3qfNHiyFcKWTKnTczuWWnKNRl6cGf1AT2PSyJjZ2GFF8bQBsk9XBy+ScE2X+wpr2aRd9FUkSKKFiO+0we9l9heW4l/dr4jvfMD4BdWzxRy7SdItdUU5zVAubHk2B8uDvcnCvONcEVvAzFObZ3EtcVBUKR3wSuif6KefXmMFxgApr/avH5GXWYiQ/Ioek8Lf7sjV7GufRwdTmmJ27Fqxtu49YTCLkGwXgZxFh4uzxIDBP81R9Ar1MNnPqjjUFHl5UPDZCSoylUZNrB5qdH0W1BEZeMUCfL84/YZ1scvPJtYI0NBnB0xycaGq8Hzt0x8Cp1IV0Jt+GKzc+w3U6aRaESnfv3ssThVAx+KspS/42BbcdCsD5DE7e590GjdBY+S7bF9T9F6ZizI59fehSMIkfR8zJjwDmtuO7lZbi5M4N311lh0dnVWLRZEyJb8llz8BVrxyRRwjJzgIDpHNLjA28yf9Kr++tIb6IIp/SsAZdZLzFteJiuiTvCuUhheP9ai/tD5+D98DLcdXg/hMSmkODVatq62hE9fH9ju7QNCU8TAyHTK+zhM4iW83RwTO1oMlHNwf3j/fn2gzcoEOvCbfyD+g4CDMw3hA0/J8PRiS9o4NdLyk9TpojKHrgm344pqqqw/GwJ3S6WhT8Rt+Duhj245b4MzPb1hQTFHXAuXx7eVahy5fBmviL8mtpdR8O1b94o8PkTSC0txETXBLDy3ISLrgnhGB8hnB57l65rxvBuW4b2ri0YsUYRYp//BV2j8SjXZ8dtPil4pqEHel2u8/t/oRBwThv25Eiwpf1MqClWg4zNs7D62nc6JbOAZ+WW855DCylX/R/PUdOHbllPGqnXCpN3OPCz9VNo7rRm3K72k89IBNGkH8f5yA5PVnioDl2v3+IK1wkYFfiPDj5T5Nc5znTcaimNEjfA07lGXJ+vhALDuiCvkYwHJqwhz2tL4ZypFgh9HyAJ4YlQMZgM79pWUrlwJgwPC8K7vFycrCGFWYfycJtpEjw5/AVPCvnQqHGLyWieN+QPxeDiNlE4nnUTpta/g6s3HDGzdi/v0npK9xZ8BeULI2HlKj92cFXnLhsFCBh7iZ1mzuZLcQnwry6JjM4E8NhNT3Hj7H/4Q385c9xh+F0uAXFzylmsoQDLu2bDZ6P1WCHyDT/ssKaumw9g3v4Ejo4Npjcf1OH67NMgdWc2Dn2Pwr12zjy1ZQmJjmrGcS43cJdRFwY4noYtS8xB2XMmWE+u5fuRd1BqOJL/GxXDrdmeJJFhjtUiFTTm9Gx4KaUE3zo3U+6Yq7z+VCJbP7nLJ2eIwsvRPWDmlMYamn9hT0g076waD85j4+ml90cwemOAU7KD0W/CVfi7Q4tEawVoo/5l6q0KxfDJ4+BNfCPljBDEi953wGNeAf9yL6fAL3e4a+dzdBpsxxH9a+jaQ114k/gQQ/TWQOmvfbh6ezdrCF+DyfVaECIYjS8/bIK04SGs/yAL0gfWwFmfXez5zYfjaBQoCoTQ5Y77HFn+lsP+3oIPZUJ4S8gIIvVeUq30Qfhv1Fra8UYfRxq+QNVXHRzy7DRbhRnTyNiZqC2vC9U8DutWi2Pv+Tj0XNLPnrrm3Ka5GcTHy3PNDlGSNdgDz7wIRk4xhu0rcuBPrwF89O1HMY9hmlARCinPM1lq0i/asW4LmUdMhpi0D5CT70Ezurbgcwc9sp+fDYthNp8/mc0P8i2ouNuA7veqgK1xJUjs+Ax//F1g93FRaNu5n5y6s3l7YRQvCO+mUQLNVNhoCBfT+9A78QBLT3qIei4K1KpvDbnKP/F7+1HUfJ8IhrpNKOikDc+HYuHU1U34LGAyRR/S4Em2x/m31nV4cng7r29xA/TPI+0GOTDqloeXisHIIfdAOGUJmbmVQnm8A1zPLOTmN/Vs/byZjwqrQh/N47J+LVSpLkUNnRycePQ0/JWPgpT7N3Gt5QD3bgmjgUdSkGUSTG6X1eBwcShXW2rS62P7qF5lMt6Onw8qaWL0+Zwl+jpLgeOCM2xlcRPGPW4h4zmN9KjsErUJW2BEbQAND/rSZbUmPONmBp8qzpPlsUn8fdcNDFwsQ339VpCfYs/7rSxo/+EkPLY8ke+oTQTj6m084oYL2Yi8wMWip2CseBTcs5LAhs/HQb+omX7FNMHDXfowUzmMZg5qgtFqEdYKNsMbFqK4W4egO1YId9k8hsm7VsPMeAGoSJoGu9SVcMpOU5qeZksKNx/ipeR+FLljiOM/PcQss3IMdtcAf3dFzo5NgZt7FmBRYgJM/HUVQ86MhdHpuXDcfhEtnfWY3f2kISJ7Ni67+h7eafTwkrafWKvSzQbfq3leRxj9qT1PatOl2MJeB3rD0uHVs5Hssmgt1jovJMvXGyHU1pTSM1sh7UkfJO7aDY/WWECdwwL+1TkIYms38Fe155w/xRulpfdQxLJNGHJhDgWk5hCcmAgvlrqQcvYSqBFewa2V3jD12XYuMRlFf4YVwfdUFpRO6UK5JhVw6gvEWzFRaP+1EzR6lEhmyxIW87eAUL8C+LtEFPbb2CBe0YXOXcEwMmY6mc7/gZmvYyBnlT5dfvWWzk1YhZXqdlj7KpmSKsRg2XYHVuw5SJ+NjoJ80H9UYZIK8XNH01zeTb8Op/OD8HbI+YbQ+60RzdSFWKnyAO7LtKf0L0bsVOtPOgn7Ua5Lgzd8jaY4Aw1QcxVB/WtzAaCJneadpbT0GzCuYSXcWSUJ05wWw4VTyly8RhC01WNg6XkfMjnxF8cd6cIJg0vhktgYCDndjwoTW3GRURVu9VSAq+eTIc16FH9cM8i71iTQOn6Hpp2BfPBsLp1RmEHHs09Bd48W+N8dA0e3Tyfxiw/wv+h0DLH5yY73W6nUwoCVraaRkGQtiRSMgxGVaby47ipVLsrmQ4pn8ZTXWrLKZzjq8JJebPiOc+/IYH40wrkpc3lsiySaTxWDNT0RvPW/WDZ6vJy09wFI5uvyoaL1/LpPBkQtjeGC3lyat2caCE89hw9+umPDqlH035tcsI/sBDWNvfDIVx3mHktGx6fAHYHvwLznKn6u60KLpQfZ52UIZh8dwZN0l9I4YYQqzzQayGvjWdZP2X/eCHSjFzR8dBAXV9fTQFsfvmQjrgrQh5FztDEkoJ0eS1+i4Ze/8fv6c2Ch+w0PpBfw68nP+JrXH1pZLA7Rw2rU8EeQLMpc2FqoFaojX/OrCZWkNzyGNnkPUPjdWTD6rxkM1VrSzRdyJJ7uC99vKuOrvVZgmWHG9ZICXFsXQjqhuST/SgW6MrZxW5gRRBT14e/GMChqvssTc6J5tOJKPulYD13D+ZycNRouTpKi1YY2nDFsiP/5OtB4K3mW2XKYp3vnYs20MLKpOAIVStKw3DwDMzT/kc77fqrcVwyX5cR4Y+AhDHWbgYXNSfDhWD7+6EIQ+FZJ+1w70clhJtrLnyOp+eac/esBTNvWDG/22mGL3iuct04DfnSepC0Xb9CZ6lP430RJtHPUg7wDWnR5QhjvH5pDk5yXYcCoCWCfMgP+RZfyiMPh7L7gPPa65GG56UJ6csqQI3b0ctU8a779axJ0Jqehaet7TGl7RPufbKTU/ljSe/GAo3obaH/MPdj30oCe24+AtPY0XmuzibdWp5Ldvpk8rU0bB1/XgaeYBilZHwXlgU7a+1sbDGulsaPkNIeOiqNBkQN87vgfHnNRhiOiA1Fi7yg4KV9J3tXy8C1rGtkOzEFXARDofJ7ESX//8RnqwR1ip9lP+RcIzxhNv0/JwVen47hv3VnYJNgLtZdDoU5CC1KTAkB7gTlMchKlT+0L6Le5IpxcqcA+YxNwb0gdLw2xJqO6QbiQNg8m5kvBhIOi+HvNabqcPhrU+3Nh3eVKKguVgLKRkeQS/wRlNJ3xX8tE+uQawIbbz7H4UjU4NzoOIlSSuUX9A97OXQUyL5bw+nuzwGGqL46RK+W88hd49AvDir21tHTABU+OmkMzyq5QvM5UuA+H4V7KHdT9ugv+Sk0Dvb0Ac+5Gcp6MNuurBGPDKmmwUttOKqu9SDAqA+MmTIXowgW48IE4tM5UwKu/j0LMvBiumZXBVzsUUGdnPRduPMRhgRd4fPZ3aK+fCStPOZKZegMFqW7Gk8HxfMtvPR6w7+ahEhUQvRGLx9aJ4si7E+Dd9GHM+jIKTaMXoe7SBg70HAIh5QookFzJe2uNQP5vMH0tGg8vUiqgYYQfTj9xmr9p/cN0mQkceLGI1a704uW4Lvjo/4bvOCnAjhBNkDI5DHWXnGiLpSUGFJ2gxOSH0Ks9FrOuGvHpx9dg5i4DuHj0G4gG12NsSTX8UX7MSyf8pZBFGzBshAfEzQ3jLocZMGXYCCQ/z0WBD8sg5tEaHK6WQOmbstj2R5n++M5g3dt5ODEhg/VWm0DEBlFM2n0P1q4MoiTHDaRTfI7HJDnzqwMqIJvtgIun7EcPb1F4NqGQVPLzIOunEc1/1oALzDzJT+Ic7tjiyllVT6hhZS7dTBsFVoFn4ENSHF/7nkR/1K7A+7BhfpUtQPb5V7h541kmTQkqWzYavLOQ7zrNAyM7SUgK7qLVNwwo6vpZUpe5S3+njCUvSScKn68Buwt/omq8JSpfa2TzIXvs+5lGOE0Qb0e1UK+vHIlb62GDDIHXZBW4fN6Tr/qP5vx1r0E6VZWeDE7DByOus+sHKRzZvQMTnFVgtLkrvvjViNMsFrPGSAV4HmXEYSLfeLL2EPguXwvSWpZoIy8GEccD8UDJdj43fxpaXx9DHb+UWDZ+Jn5z3k7ytyOx1uAY4rOpULnMitc/WsbRU29Cg/4v0u/7Bk9Sz6O8pxGVfjwOac+/4zltI1C73cHq+33hkrEk2ibPg+3eUaTi9Iqupt/igcvIKxY/45HLLEB3WQWtuLSG+y7foVvjKti0xomOzFnNvyuD2edsJ/imn8Dd2VOht7gBLoTIkO46cWj004Mz/rZ49dEN2pgWTn67P6FbVCh3xk6AoLR7JBEszzJdJ9jv8VFMVk6AbzMcWX7FBBATXQHq71UwpV8F8qQK4e4CY9Z49IX6b5dQ861hPpbTAGPSDDntThvd3HyKm7aMhvNLfHi53Ed0UtGHC1si6Zt8A1u6IA5pjuHLRzTZJcwD01cpgHXoX3yyIhnj7nSSi487t5q+o7K8j7BPqgan+9/AvQ6OdO/lRBCaY0Lb8h7i8afFYKVdxcuKY6H/3gqua4hjp4O/+YbdLvSRkAXnnHUwybWQagZu0VnxQtz3+TE+3miFowU7adKMuajoOh28HMZAeshffnRpM3h5RNGfbeuob209HVqQBPObnXlqaA1PckrhW3P04e2L+YhKJuAdUYpOH46DydRtgKJ7+ULJJ5CaMJl6n6mTU6c6KEh5gJz0PzZ+ZYbx/bkQNnMGh2VupGV7Ktg3cQ+eLt+PWXJCsFNTl3WqrnPTVzscX51E230ZVG0v4MldglTuPBc8382E50YTQDxfCDN3f0AR8Uckevs9rvExwQqra9SrpwG/hNz4lFgk1/sZQc56b4wqYJ4c9xK/zHCgxlXHsPWyIu0wHQVDFpHQlXKBvQPEwObNXVQvcYNXis/5rdcz/tnfATP+xGBjeyxk/vxFDjJP8aw4gfGSXnbV6oSceAm4/H4tWD7oYOGg97D3uhddN9VC36kBtGc9gOTjDhCwFeapNzdCrZ0GZlzcBonXqvGQXjbOz16H2kubeToLQ7iuHL/OWE8Pb7fQC5W93B6lh3oL71DmokzUWnCDbr3pgO56JQgYbIH21j7w1/cAy7f7MfrmCNzyrwPaXGvx53EnkNgUgxabFcAvOhq3OcSw+tPTMK9jLR4ftQ3m7dzKr95UktYNQbij6c6bPxmBar4dx95phy9PfeizlwFeXFrIGZmbqG1VMlp89oGwkE2855wAVH61R40nF9jl73j61dxA7e/E2eOjL56zygIDn3+wcL8mrfAyhAoBETzcm0r5z3/itC+dePSdDaV/dQOnbSokOKefVVvDKbHGAk7ap+HGS/l8sjCHvVZ0UZDgR/jGCmh47Q2dan3FGQq1tHiKEWzX+4G2Wh/wgEkh3z57ACTm5vHmkmLouNKHvlUzYaJBK5st0QGjQHkc8GijqabLSO5uAA3UmOGUWZ30W2UZGuQok+ZXDXqweATU5SWBl942sgmIZp3pg/hY7ApNi4jlwq7N+GaOK56u+sqS5vLwwvYBxIvvg+grw3Rm6kJcelOROgsusLr4F5Taq0Y+R4d55+Xx8M/lGz5rUoGzKXf5bJIBWPd+IVv1z+RCxzm1Jx3eLPkN1lYz4NehWkrZG8wXF5vS8dLj6N97FEJNNkDXJzl676FP+rJGJN4yGfKD9CB1uIeexAfzp/s3OGH+V7T2OAMq6X9g67AfzN8tB/q+Y6F2lgK+n7APa4+Yk86/Oqw0COWgRAN03+AMPb7f8GPyAPdHakKR3E4W2DCV7h+sgx8Tm3jhhTMsZXccQt3nolm3A1lcfYh1jjMhymEOz77uz6nesajR7UOZAT2w2p0o1fgAtcUIwQgTfbzYJA13C/uwpvQsF3x8Qj2eQBYrdVCwV4iGjkdyTUAKtg0GYtl0I+jePwu2HCCelTAF3gvLcPyXN/Ah1BxfswwWjMzBySssMNVpDDRWqkGCzn5eF/MSsow+sX5eAO72WE0z343EZ/9c6GBpPWm7T4QRngbQ+mMHhXsEcMgIQ/xXkAQtVU5U8OscVQa7wQirR6h4ZRwcyN/Aos53uP7ITr46sZ5n+NXwouY4HGWyFbRWb+V5j/ZC9QZjCDBUIP9ENyqQDKQ3I7N57oHzNPX1AByb6Yx2VWdA0lGGS7aqQqlnCMp29WDUwr/c/qcUjQvSMeNOKqjaGLNHpDWnqN3k7gNjwfDsAKvYOsHR6xtQGM14hfkXurbyNjSnRfPc/nhYO6+OPtlbAN9bBiduiMDrFSU4UXo9y+2Qw41uQfC+qxROGY/GHqFJ1FwpAFKPn3KsyTUSN5WGu4oqvERUlqcpqWFsXAZcOqWEvkGbYcVJFXDMXslzxFWoVzcK8u7s4Xkf9WH+VFvqm6/P897fgE2u2tQjOgGWZP/GKXvWovWlLbgyvx+WnO6hLTMn0Z18CfzlZAEiUyVog64IpJgagGaTPBaHiUJQ/Se2qbehqmM6KG9fRM2r36GjWA+clh8HMxd/YJ+eGiw+uAvbyg154csKsit3xbqXSWwVeggDY+eQV5gK/Pb/gzvXL8M9hxv4kvERqh67i7etKYQSycmUKf4bnScf50MeOiDqV02J4+7he/c2gh+X8JJHIA0GXUb7pOOkddKR3xj9pH9lItDs1E+/Xgbwc40iNHdZhe9uWWP5bk0y8LfC8xdCySVhBoz3HgH1P51AfkgVXDuNsGXqLnqrHclaA1PYfGEQZs114Prn0hCaPhJyNl2kXRUjOW38eY7Yc5BKfeJoUXoxLrn5DP/d6QSPlu+8wHomJMbq0oP/+sFuzTvm7W955BglPHbblw7sc8ORh/7y6K3XsaFYD8xijvFkUQv+vFkQxgkN8RvopVKbfk5+M4Vme98krQU5+LZEEO55rGfRyY4UPqUFT7VKormTD9LhaA6UugJ+GxaRZ0YNGJ0WhAVzt5P47VM4pNODZTXiUKVyg7p/R/HCsA7ME98Bm1L+kIuhAmiFTQC1TUtxclgY1T+8DbfnDOODRm+wOaFIR54uhX0bZsGO3pFwbcQqwNbDoLFTE6513YKknEwMF8nhx0X2fM5cncHgCv7ZLAL+0+ZDRq0bH1wsDwZ/l9OLJ6Xwb38NCw3m4LwCSWg1c+e0qllwJf853WZFKC7QIBX7DrTSXId6Sv9B0btCuqWzn5erh9NKR3HYOH8hPhZ5jDsWvqZjs/Ux9YcfT3T9yltH6aB7yFhUXVeIDeWjoGZHIrT9vAXHazRZomMxnFw0iaxDhVll0znMr1mK0kkVHL3ZHDwUGR5srMde6518SOEnvDLYi9a2HZjncB/fXg0F8YvzMD1sHCzeVsDVXlHkOpxFAdkS8DkwifYGPcL13tpYsvslbZ75FVvi1WDW7mbed/Mm6JRN4oc35tHfwrucESZJ+65sAet3z6mhRJ8eL9cGszXB7KcJ8PZfI+Ue6OeaFdvBccEDXPA4CRWXNMGRBafAa9NEKM7vpnW+ySD9NZEsxouxf9RzHjnyOP+M/ghzjF7w869P4NQkJbAaE8rHb90H0550CJh5AR/sKqCS9n14LW0fRb67zI0rY7lFh2C1pjU+GVzDY68a8QqDSt5aGEp730vC/Eoz0P+zAsMjenn3Vl049vgZaczbBLO+bIbZyqEQ/mElFqw1xOZOSdb/lsfjzq2CqoPGcOOlMT877sgG7wikr2pgo3cBVAQ84+geHx5X/Yf3r7wNmnojYejAfdycp4+5c/x4drUnHPAYwcNfCMyt0mFieyAINT3lm+ki4LmshyeV+pF1lzAaNWdi3K9OWCe5ClLfbOKeZbJ0pNYE7D8aQYdGPbqZX4EeEKEZxoJ0y6ebtW/E4hKJk7jZdi5XSOnAtqcaMH3dFDg1uZTC6ooo8f4iblniy0vT6uFr9zlM6fjMaR11ePG1OeiFdPDa+ATUc86ASx5DvDC2FP4zkIMNgadYLX8ADS300VVyAhwsTqHFY3fSnR3R6HYyANSlcikqP4BCJ/dxe/453GCdi7YNFpCl8h99mSZD+iiK1+0XceEsF5xv/Bos9j3j1TV6dCRkG606qQv24Q3gn7GSxbPr0XyxMarf1YOgGBEc2f+BJfclY+YIZ6y7Yg5LHOSx1MEeAlZcoEGt5bzb+DcPbMmjntDl4OVgB21KZZgUrQdvUtyg9dl7FF9yj5+rW+A2ZwvYn2HEhfmvUb9sGy/BZDZAZag4vBU6BSbhYY1SMvIS5O68dt49VY6F59/CRSM+YvDCHaDRZAy/Rsjz8XALtvtjRgcP/YahHfLwYpUMjTvwFBcZSNNbq2hKVVeC6I4lnLRfgeM7PmLleT+u3fSWE+8/wHuLbWDJ0DyyjFSkHXMILr0rppX6qrzgqzzM3GNE1UscuZbEcaS+ND0a/RFjheZz94mR0JUkzcLnjnL3YXeY3OAOaU/luCZuGtU+T8cJafM4uCKI8lTV4OKHN3RztjD55GpwEylg47kssH8izWsbu1FgaDO/c1nGq7dpQeid7fQ0PJdPaHlxy+Uq/rZEABqMgWU0pWjK4hxqGboI/r8BMnf4Yrb/L1gUHAOsZI8NMR60Jk2A70+oIj3pOyi5QJZfJyvCl9CLqNeUy4ahltw0x5aSPD6g7NlhNJtgCmvOWlP01S0YnGkEbkIBdHtyEFv3xPJ76WaYJxBCn5dGwsnyRi4+mEMN4IhHzyCkK5pSgNsxelyXSQYN+7m7PQ222gAIF31E1SMxFPloPJS5C0CTswNFm9/noJWd9E/gKqS7bcJ9I7pou9IilP7zBv6eWkl+/zHMC7PFGccauPfhIc4t14ZNk1U5/vhWOD9Vg2PGKtEul/1YlzMRGlVFeXziXRBz1+eEfgfuHnmDLutGstbFeAyI/ABJ/Ufpcao8jA2OwqAnDSD0OQlk1q+Go/9N4JrHf1jefy4Mfj5HWyT/w9up+jA2bTPmz3oCRts92VLXCYc047nb2Y+ePfgDec1WvP/JQ0iIFIMveVWUrOdAk6x2s2NDJp2LOYBtukmsG14E40VesPfvMAgLEYU5RU9xRWcbmqtPI0kRIXqqOx9j/MpZNDQMLx1qhaKcTtwsqwHbxxSQ5ogi2uPTjFa+MznsjSi1dhmQo8VeFAm/ygtXyYL+HEOQtV/EVz7qQpjlfczQL8IO+QYyb/biy/+UQbzhH3aVWlFsuCJELZ2BI48pUtbaCmgP+szDgudpescmvH3BC0YufQ7DJ2vY87UKbIl3YZfiYthUcZx0ImoxPKGSQiwegWdJKykWy/HTnl46/EkEWqsqIXhBC59al07u921pQWkhj1zzidvP91BGy3fUGTUARoJT4OnJbnD5E8eBAQlos0uHnIvN2Darl0FRFac+yeJkhxJqNhaECYK2WNrRRjE5WVSlNBPataLJzeMMkKM1mcanE/3XTPMlxUA7sxst7fuxQ+4L4UlLODNGlktW1INCny+/sutCyflb6eGAOdCdCAj6McwvOoK5OvQ2FDavYw+BUzwhLp6UXFtAOeURjeuzABwfw65x1tjn8J30vpmx0pNj5Bh7GWyPnKdfj6X4ZfZRaNg1BlKOEF9QUQG7gTZojbuBOYcTQXKjP71P7SJP41sgWulMGrtEwH6oCNzeqHLZOz9KK3+Jgv85U0ijKv9tXc0yDy9iULABOdoZwR33t2RbqIumh51RNbAXUg51gJlEAHfs3kmh/wVgSvdYmPJaEOzlE0jb1RKC51eC7FxjGDXohTsfTsZt5enUunghfa8+hEGHBeB6PNO2rcbQ0bKI96sd5hcPrVkvyJK/DtaD+BM//Jv1EKV1R8OdTaup/UQKHBnQ4Vl9X0HjejWVZD3F53VapF2myXZbR+PY74LQ11pO9gVrUULZCks1tDhcUh0TZ4zHlPfOXHj1HE5RfwDhNQTzd4TA9Ech9OrLEMy/vYe746Xgh8xLUrs/nkdM8eKfadP4zWgZsHc3Rd+jI+m63Ge60D6eXk8PI655A5HJSjxmtge6nC3ga55i4BnnimLSWqjpup73bLuADueL6WXdHWrW90W/cb8xaNIZvnJQH04LNcHJike4L10czWKeg+v4SzQu/j8S7VMEaTFLOhvpxScGDKBFpI8dXXLwlb499o2cBQXiS3GPoxV5nXkNXcm5uHuhNy+R0YGjJRW8qH0ZN3y8hc1H53DBwwaUkXen2IO3eObBenbPWEsCuQqgn+tBW/uiKOpiCLVvv4QeQVsg4+oV0M/uYwEnG96hrMTP5opD07Em/D3JgXZOucMJg2awc44pTZG4jrc9fnLwlEwqMNzF+oEEisV6tN16iKYHB+PH0BJ8ohbPDXlCIHxuLDeJt3Pvjzg4sUAZ3HYl4pvN02jsIX+40miO8nK1eMAnAC9rquDuyhQ64JYAe/0VIHW0GvTeHsZnblV0tnIZdd4MAz0rO7b+8ZpX5v+ANNl6WCCpAZGGr+Bt1nR2dvlJS/PHwe/eUdRhtxAHDc/TMyMREhvYDLljBWGIdbEvQgeHBeTRhLdAcDOD3kp5iMr1pwm3Iyl/zi7qLrOAnqZRNFszHR/+eYAq19TQ89wnWjyNMbF8AAW+jsBHh/0ocD+DTOgdyDPcCrvlV+D2iS9h4skA/CW7idS+H8GoFR/g1H+WfMh6IjgnVkN+lRpOENBjofPuFHNhHCZ/keTXh405ctkAxK+cgeMmjgHLs0k80Sed94q95w1OytAy1QoEbcfDqtfFoN5sAKOoFfoHzGDVzCSWulVD167n4ttvufxEQps/e+0jxZ6ndCWqmgLCoilrtxIsbjsGiXLJJLSlFt9wIq2c7IKZO4Jh6vlmdPTr4nVBI0G9Xg7szATxZ9FFGKU3Cvzcf/MM1SBecXc9z9CcA/rhEVw4ejdMNpAE2e/reZviSF6tP4tT0o1obkY0Xtb1hCU3qvBygBzIWz7CZxU6kK/wGqqWvsN3Jo7o39AFC+wiuHnDM2jLk8d0lVgOqVdiyTh9mPF8LfRF+GOcWBXEfL3IB/4iWtsZkIKdHqiqNPP9qHLs+jIRjodEYWp7NOpGtJPrXOQHdYii2gF8L+AmnRry5VddX+CdjzH8rieqvOuOy83D8FPYZPi+5Cwld/XgpvJP9O5fAi82SoBjW+XAovMKLjR4DJNPaiM1eYG38HeQ0nZB+wIx2tf0F4es1pFaixGUHdDhCxbWODa+DuLrZsLkkzVYlHeMLGSOo1WsIS9SWIW71omAcOALWLbNEOK7JvHp0aaYq3yX2ndGQMrPxeQRIomBjYxJ8cbg+smYI6Ir0OrCNmj4NgatNznD5/7N2NLVww1bdentrdN42Hg0jE1Ph7IjfVxc+AT8fHSx7MFUjHgohAFuReC9kbCez4Fx2Fgg9bvgecMMZw2to2aRb/RqjxGc4UpoDBBEzzGlvEtyMZi5TgC7h70cNKqLOmIuQ91pCS47/Qvm33gKilPCMZUtYceAGdtGjYRIu2nQRJfxk8pavKJwiK1z+/D76B7IvuSKcYGHaKvKVwhGM/iqWALtw1agIPsEpvh+QYsjn/jP9Tr6JSRN6Y0vsF/+Ma54ORYmFU/CNSmXWbeHWU3NF2Olk8B5bTB/sD9L4pc8ecVqQcoSloDR3fsoRkACrsqp4sNsURbYs5DMfmvj4oZd6G8dxF/y93HLhzGwfFiOf6UtgPCP3Xjn1V8+KD2V+mt+8rFH9iRQXYEyN9IhZbQwNN2bSanXq9nGtZYsNURQ2/IPtWx9TgYVJtRkG06LLIZw5EpjuMbiBM5PicaMwPvLL2FNpAk9inCFab+dyGHtDhrvthllz5nA2LWOWBXlz+6lmRhfKQvnFMfBmiZ1OPVlA3msb+SFI17wernpkGGwE8R1I/jgr3IMu9XPFQ/V6azSetQ7EARmgcLw8c0nqrtpDF/fVMLG12vpVv1x2roinuSee4GH33k+FCiH+0QGaJGPPpy+Oga8k0R4YctFrAxYxDv/NuOD+LHwu/MomWQcoHOTF0Dlsi/QqjoOVsY4QWT9Upqb6g17Kj5xQfAfODL4lFx082m8VA7Oz+2kwAfi0KuZDia6fvzb8wlOfx1LoudeolLnKZho70RloyfhmpgAqAkCUFF/xSK90+jT1ZPUuMqGdPLS4aPeflylmoEHbeXg+qbzMLx/AtgefkHmsQlwuLwR1XYA7DrQitowj5MfroTTjj6g12HEC12kwFunn7+3zof1Td54zPQH+/8Mptt2J2FmbCR1K4vQmBep9GiODognbkKbI+8w51o9ZY1ahf1pNRSrGQsPAz/iP00hEk/PZ5nZ+tAnkYMPYg9xbuFcbm4sh9ODvngo1ZYS0R6OCTxjj/X3QXSHJJytX8GDGbkw+epBikocpDL7SzzrjRQJpAVxgPAx+LDkGb/VZRh9/DmbdhjgweuW2DeUSdV/16KO7Fwon3oJHI5rwcD1VFA1mQrxf13p+1JzOH9tHXQf/Y1NTw9x/lI1vH/jCNW2mlJe1Du0mGoEJ5at4rolRvxruyT3jBCi1uTVeLFhISTRUxpSj4KICcVA39Rg/o9nUDL/Iu4RiYSCj8Z09dUDWiohDE8rfEnp9HcoXPOQntfIgcajKD64aDW7/S2Gdzs6uOzwajQzPI/FdxLx9H0j3GAUQV9dx4DJATuYtnElbhdpxPirV0jy/HRq3vOa/nOZxa1iC9jxmQ5tszGChzvtcY6MB1c+KuEdM2NxVUY0TulcDOvqGnBy/UIa372bIix0weLsBjb5tBDFwYY1jr/FuMQxkFpnwqklH3i1xUc+4V7Fbj6TIMPpI66+6E5i+5JhtkI3Ko0Lw09nWuG++TQYozaK4/A/eH5EGuaFbcG4yolUPVINs5Z+prMnYsHHbgqV72+EszIP4EutKBYvHAG6c6fAfa3zpJ/uwmFkTSMWi5Jf306ubjbFitIUcujcShemj4BHkz3hhdEoCim3h6xPifB11F9c8qST17tPhx+xHXhJq4euvVKDpzP3sE1hLZXsEKba8R+5aOgEF/0XSXuPucGlIxEcttWcxVEHcp7N4MjHgWQz+BFmBHxBq+E+FPs6jv57b8cVX12wfOoUGtWmBP+Uc1DFvI2+vhqHmZYqsPX8AwybJMihmuZwIHghCIq9xpP9DFULtvNYQXX0bNsFQ9U3OLB9MwwODFCM0CJ0WL+WFo8Vp8QbEuAfGAPzT99AafuN4IZDPH9AgfX9RcC2bCJc3fcVNc9lI5rogsHHJ+j9J45cxCNxbcZTeH7Ai9ZmV/DMUc5wNN4AX1tGY4f5eBCMdYDwNx9gbt4EEmq15cXuRnRh1276TlL0+ccuvGwpAQKTtP9n/6/CyhMQav4Z9y7J4bcbvtM377Xg1f+RJjY/4YN7GmGRwQ8sXzkZuvO8yf7gI77SZwm+979RnlcpGcp8pqvKJ/GklB2rVYjwpPWykCbdyk5Gx7gyqYzXbNxNjtalsOVWGH4oWQEHTUzonb4VRZSpw7yuOZA6fJoW26njjgV+fK7AAG73aeCZgG1o+92Afu1zQgVTQ2i8lQeGBeG4zW8F1N8M426vSPomXQGN+9UheI4CV03Lx16cDissVkDWVhHadLOR456+pD9P3uLDdTepZH8XGuhNQtU/eRx8TATufz5PCYMxWF7jhtaCZ3B8/BpIPyDKD++KQY92Fh5NfcstfbLQmLCO5q5xAzupBOz6qov6uk9xgvUXbu9KJmv9IcofvQ7zRHThwSE3XHe3HJtjhCn94Q1+c9eeQpauJ/kF3vB01Uvwa5iFgwkSAHtcoTHPl/vUl2FIhiGE6hzH6oqjcPjkfrp3OhfuFtmjw0hhaDwnQN6KCmizSguv1mSwhqsBxuwI4CafIJBbbML7h4+D6gZFmL/Yje4qXWDR7NewbHs2rfIX4qbbxex+oI8f7FrBvTrl4Ng8A6YrbuSOZ7Xoo1gPd6Z7g/2VH6Q1eh8P5nSSybQ3sCulCjcWjAfTOXn4csgatfwayDwongeWDELMWAd8p3udkjYdhhw1Vyo6JgXH9q3k4nP+6Gv4HK8NJlPZbV/4LqxNloKVeCJsBx/6Lgw7XKdB3zU3KjhmwtMH5uC2whu47OxSjndIZK3bwjSl8Q1Gu6ynycskwW9wBH0qHCbXF264VdsL5jvWsdrbkWgxtJcUrxWzyA8Rdn9oDDm/ruCEqhs89owQT5NOYRVpC558dy3sGv8Cb+aroYdHOGTenQXj332Cw+ckiI+c5a0d1XB41U/AQTsYN24ZBXqqgM67fi5ZMgUS4nfS49LR5LRnNUyT30BVz3fyLdcOjn7ynqyfOsEDeW36ZIvQ1q4FkRvvcoOrHt2dG8rhcdPR/0kvzH+xEP7rKwC7PyPJM1AefLOLsOBcKKd80CL1OcAPuw2h26QSOgX6Oe9BFMy7dpC3qWrBhQptnjfxBj0ZZ0lrjuwk7+QRvCmij8/OloaeDR6wUrgX502VgPGRUrjnyCG+t3AD7NoUjUnHZDD36FK8IH4S9XfOhnVNLuxmrAbjSh1w/7MUeNmSi+W5O3FtyyBUpfZj+fKtWOhZDwfUf5CatizIfvpHPwqn08qie3xqaAq0hT8Es+elcKP3PxLwTcfZ2d20LsUCUh80gWb8cbBCLXIMCELBLxEQsMibHdUGwPi0Eptm/oP1L6fD7rwkel0ylXut0/lx8hrucbLBI2JHuXFfAQhkfYaczEaUaTcBr6J1WLdTAsZFfcJNFh5ca/adXpMBSxt8ZAkJedru/QnO7BoDEWtPwqq1EfTt8iw6TobUEJUJjYZZdKR+CgbZXcMzP4Xxwl0zuD72PY/78opb4vwwp8uG3kdqQ9HhNIoe9kP5T0sh64wEdbbqQ8x7S8rKU4PzvUJ8IuEedR51pILwc3TGeS32lSrg+vEX8bqlHvwLMcBtZYkknP6CY++K496/aaCkq0kdlqtJfKUyWJRI4qWfs+B7UTZGdn+DiMedrC+/gKJkOnG0fSD++dyLfhprUOT1eIJFs+DJxGR63tUIH4x209TZXXwtTYuPrV1GXY+CsObpWtpgFoL3r+uCYmU1qr1wpA1117F5FPDgZxNQam8lnVmuKB6xmVwSJoHla3FYNCoZjx+YRNm3/1I7edP0Cmlcp+xG64oOYv8aDUzINqIm21Eg/8AId2dvpLjOG5D4NwvLn8pS+axt5JS5nZ1HFPGFzDK49U8QjpyfSG1LByAtbxg35Tzi9vWv6YzLTJbotETZmcowpC3IZCsDkVsPceyV3+iVk8mC97TBxVYOerJOgfaWuejfkcVTns9hw4VKoOGmig/OhNBf2/f0maaAmeMe/l36iK5tnkqrhB/CsjhDvLVUFmL+PObuUBcYFbOFnBsWI8+sxYtT4vDluHd4p6MO1KKaQOazBjw3aYLkKDfOmnWJvJWdoLHECwsHJvPiaxeh0rGU1t/ToeJpJvBomju6iuwn2eu7qdngIUt+TYWSoFVUJqaPYe8jaOFACq6PmAhObx1xYPMUPCu0iUd7JsLIDY10r8ORHL/acfOJjdBdMMjl26dCmGMMJDnNpdSmv/R2xXGUS67kVX+n8TihZk4/9Akzl23HZc3KUOAwgprGqsOft+NpTul/EDhLG18YudGFnH1QP28rF9dshKqdqmDrko6LNHLBf0YJLbr7Da3ur4UH26aifJsfOZcEg+vuTfR9ljEkHDEgSIiigRx70P0kRWnhNSist4wEZb5wuGQVpyaNJqUkC/g+LZr7Dm9gJ6F2vlq9iGfdqiLnxzdIVjKJJt4Og9WtG2FlqAlc2HoAi3+9A7td0/Fe9XLavGo6BO56TdNb31J9wm9W8thDps+MQXPRbVRIPQrKbf1oNOv//SfhlfFXaMz9HMxmdzoQKIOrLshCgtAWUH74HlY7n4a0S1E8KBQKh6w245vk0xifXYvHas0wYeIMmO3ny87j1Kls0QY2craG2+NHsI1JD4acqoS4yB2U+MoBw+bIwfOtdew38Ttfdb0FlX5KPPQzGm9MqMaCecO8Lkge3Vx2oLqhERyZEsclR8w4pK6Ux3quxcDMsSym0AHzQ3WxKEKM66uvoKPzGBCXyYZls3egx69UHL3hPIZGOuCZFWPw4BhZCN77kyRNrGij4HRYby2O5uZ7MNkaecykCrb3WgGTbxyG+d7z8bT1N3Z/mI1C2VKQfUuHN/unYGuNG7xNLWOfBaOgXeAUGq5j9NE+ThUR7/Fj3yzolAnlMajG0R8zSWTPAg5a4kCV4cYw6DXEy4M2s3/mG5IaTXDljgVsXaoNTu/EedvRNF6wPR93t1WQn24DzTTRhJsnhqE2SQ9OXHkJuk/b8a/ncvLfcAkMaxlmi57g16MW4jLdJ+y66Sd6zVaCv1Mfg8seWXrW+Jvc7bV4+fl2vv9MktQ1tHGa52o83XUeO40M4Fb5Dz520Bl0vqlizaoUurloLD/udcTEvU1wU7+EtrenoYaMCfR/6EDV3dPRU/YVbzv2Ad+/XwFdL2ZgS10OBJ04QC2rP8OSJ0YwzVSX0w+3oXLyInyleotf5e/jmpj5lFetwS+6S7G8ahNkHBMD09BTUD7GBh9l5rKA+l8wPRyOF0/X4oa9FiQa7IR3cuoosXEkmLosgf41iTB+7iC9tF2LTzNNQTHtOH+Urael0Vt4YWg3fXk6CpRib1H73MN8JlmIX7U0w+D0ZoyOHAE3ml9QddBL6B6aB1VnxCE+TB/ufRrGccezYITARnogmkiDdctx6PQQ5FRf4o4p3mD31Ay8fiphysf5EOroSq9xgNX9n+MCHwlQqKrEWvlUbDIUxZhAMzB0N6eSRatI/uoQ6VbexH1Kvpjk5Qu+N+pASnQsy1ZuIX1rFegX7cCxUeN4xYgk9jVuhuQZo8m+xJwSbH1BarECyUm2c0S8KsAWa1653QbWhJTDpPZ76L79A9eds+UNuh38Cp6T/qN+Xi6rC3sU9XCNXD0d+pSOAt8jMXpgCm4Qe0an5syh/TNL+brSGNL2nw66Z/ew3a43VLjsCo8tqaSq5HDc8TYb1Go0IeWPAg2GAvickgRJucXkff0xrX8jhCsTDVjP2opa0iSh9EoZ5vrEgznH8DQLfSjS04GeNYL8duM+fiqoh5tsLqKIcj9F+k/ikwqbyWjxfXZJkwBD+0l4u+UKi1etxRMiZaQSK49hm8ZS8j0pvusejUM6R9j7qRBcWsgoZVhBFHkXvzTk0gtZhLPf1eHCixaUWLEeU5WeYNFFZVD0ugEdvAd/v0tgt2EzbvBZT82fD5Od21aycRsFwc49cGbFDNBa7kZS1uqgkXEWjd7ugY179Fh9rDGNeOJEETMHUMdFEbIOzoKHqrNxrG0HFzTEk+H7Iixrmg5lkX246q41HJW6Dyl/Izhjthw4KsXwlLx5sNP9CFZKEzddnMTTGoTQWtGKVs4HFp6zBY1KJQH8L3Jt4WsMXDiOVqsOwtpP6ljWfZKL73jRyYUH8MyiXaz+RAJOVDnhBct1dC9YhU2WFLJ8jynFqE5GnfJIii7eQnqH9jJulYTwPc2kb/MLTt4rQI+yFyDz/TapWOfj8koRDClSp2MRF/HSJ1OQbDPmWU4+4PfKB0I9qqD232deFipHt7TVKcNOCxoLJNHj5VR44jKE+pvP4MYJn8hsWRs90HbEMYEbeEX7XIpoWIFqQ8pkVjwSzOWW0IW3mbBj1hFa9Xo/zZ44Dz9u3AgHPMvRSsQJVom1oniIIZScLoXMP0+xtXkZiS+2gsb4Epa0Midx0xZsd9dEN9VqmpmhCHJ7zkP1RxsWy3GFNzuDKLj4N5YWvuB50E029Wq8+PwrGmchDkV6MfxVvZ5E520A93s9kOFjDVsuaoPa9lbcuGYUt5u9o589ynBsuTlMNRqgnC1vKXfCY55buwCiXilR3eW7jB07sfO7Ocqdnwq+Rb9QJmgupypngfDxk7R0ihfsl9vMbeKeLCdpyOd7+sAhfiLcl72LGv5qWNfwkx/kmqBWgB2mZsyiBWbVmJnty7IhPrzm6DTgVm30b97KeFuEWnkudcQlcOvCer65/TtdsGuHPNM1oFCgA35Hmzhc7BAnrrsBY49dB5uzQvTePwOG1Qqp6bszlmf9xc54BZBWUubZbR64vO0fzTlSSp3jUlH+vC8rJc2C2YsU2O9rOmycqgjbkz+Qj78CHexN4SKPQ6gQosS6UX74zGwhWX8Wg52vhqnIUR+m3p9OP6rt8OZ+T+j+5Q6jvyaT8sE7HLk8DdwvlMNd62/418YUOlW0QTdJgO5OEGGXK7o8dkk7Z5i0YlXaVjCWl2abmi4q8BcDM/cWqNK5Tj8KfvD5PjUWH13Iyr8coTzAC9x/5IPcFicSfzoCokPj6GxPDlb/rOf2ESV0yGsEBrpsxrO/s9mvrZscrkTSdl1zeKK6lbOSH+M5G0PePbmEB1/G8Ob0IBizvoIkPCwpp8mcVA7NgI5PK0mnywJHvbcj45nL8bGrFMXa5mBaXAgOOk5Fp/PyIJuvDY+3hOLcnyvhvJAYXwn5yg43mKS3nQZNnwQ2FrtOxQdv4ZbfypDtM5/fWb6gAu9csAy2hc8L+8lSJ4HWxNrgp1dzSONgI660kgfZtEkQM+kyli1bgxqbTPH/CIAPgBAQKACgfxTtTVuh0NYeUpJRKSUaVCgrKxUllISyQtkkRSRllV0RoUglxBUlpShpahiNe0+K/nF7+CKuG96IEmabsN23BX6tGgsf9/Tx5XdzeWacGVY+O0cjWAehcAcHqL6mkqOnMe+iKpcN6MGez1u50fAFKKqv4FBTESjaZ0x3Z/3mXUEJdLLRiNd7mvOWaSLwU+oWu+1WYdWL//ha0w0IS9lBTgZP0H1oHPRqDJPdMmeS17OBmb1q2Hh+BYbmD5Bi/lj2TG3jWf6BXH/yISvUOtHVXdvI6xbB2QUOtMp3DiQEtdPLia00JuIVVbzXx8RVphTVVIne55bBBkl1iK6aSy89CWPfO2KMUjp0XVSH+Jqf+NcsCB9dXEcXz3bTaxVlCNg/Dtsis5GPHefGvD/g2TSb/c0DSbOzim+tdMeRZQb8PtUY7qbuoRtHz2JvyQVwvSONtdNbqOTILtqp2E6RZ6TJsS4DQnsF4O3e43h5rhuVXG/gI3NTqO36ZjoyeBgrHqWh+PgLMOXeFFodqQDNyy/ShBP3Ya2VBUZvfQH3hUTo3j1L2ql4DYf+5tNaj0l0V9AYfr48gpke9vReaBbfePyPFGYFcemKKB4If4QqAVW89M1hiFqjDvMMlbE+liBweCYkrirDo5UfeP4YVVjz9j2dzarDUcorIUZZHrr9nvATg1xUcXLD7rA22ExPKGP7Kni/TovLSt/x/YhAEJWdAr9v6bKwsAatqImETPNlcNzrFW81GKAJdh3QpZaGT+xO8YpLSjB9Yy8W67vxyXFTwHB0HR2zPMqOuzLJcPFklm+bDCM3qGFhmxxc6NlMU3Rz2CX3Gb+MdcCIV4uhq+UvtDlH0rfAKWifVUWftorCaq9Buk5bwb10MXeL2WCnyT3aukMOzV2foXhgPi1UW0Nb3ptAd5UaLQy4wQpa68miQJemBZxmQefH9DgpDXIbX/OCNFPYlW4IgmuD2a0IMXSMIHWnjKSEpgYW/RpAg6324CrqSqEX5+Ox7TZwpGYxv7qyF+dHX+Rp2zajaskX2NO0GFIaVfizYTC4Yw8uGK8Oq4IeoK54B7Qkf2Ofm4DdnStQNdmKPZb+o4arTSBaOMD7Z1vCpNMRnL+cSatFlpVL68lA9Al7efXyBBUBmmX6D/zVPXDgmwLIZiyA39feol1lA80arU/VL0J5UNcYTSoeY+OSSxR7XY3MlxvDUjsz+B13Gz4n2LHaHUkeMW+Qmsed46tHveluK5J6bhJzhhY4r3agHLN8bvAz5bi1e8hW9jEG9iZhR/YmECg/iulmk2lflgqojP9C628nYXVJMr0csuKXbeIsFDPInmahMH70A9pz2xsjRMdCnHcgLi7IhnEsyw9VwyAkbCTP2TCZ/Mdb4e1920EqSAX7pMdA8W0xmFp/iSW3haHphr+cNzyZDTIeQ9yAPQm/PEPLhWVRsXEEJLMhBJWHcdv1JBqxJZVaw/w5+agOLXG8CD2+sjCrxArTNGwhcrU/h4yeQzfF51D0yT3oWNJHHVKneMtyZ5QI+QDDkxPBdIcIxDVn0rjkBzTFpw+ClxhB0Kzj+ExpGr07/os3VxphPNbR5/eG0C+VwL8NvHh2TjvExaqhzllVPjlaEv2+h8HqyPuwYjdDu8x4sLTtpeH0LyxXugSDU+3RTngP2G+bjdPKl3Mo+vOtc/sp39AYvKRdUadlJAm6eLNYywSe+ssMr3pKQGPsSV4vdJiMg4pgUG0SKPusIM2lT2H8r620dWc3VET5sjPWwWvVAZ6r6wUxup8xUsoGcmV96crcMPTQbIOnmw1w7+pyFDvtB0LB/VRUVY1ZB49S0Tlz+D7yE4z65Me/7xBWttpj/uwudPx8Au8d6OJFKc+4wicHx8hNhIJKYzwb28zODjvhi+xtOPeqjfzUp9KxEdfQtL2JHh/0AO9obTj8ZTulVTAd8ljMH2RuY1ulJsRknoNvHxeA5MZz0HqvE68NG0J1kzGk9+dAtbsOeH9dREk99pz5KQejpCNJRrKUzQT6aPUbVZBeOAQvI0dj6sd6eHjIANM9siHMdCaqlkdhytd1+HDuB/g2djSYFB3GCsVcMrQZYs35m1Asw4F2XtoBEXv2k+NGaXzjkAHNCrZg0LSTrBPCSFSwheLljdhj+TALxRiho+x2ivnSwRJ7F3OAvxAIFwnhOtmtdPaBKL5R9ofJ0yTp0+EMXJ0QSArf5fBf8USeIqQGw1n+5FyxiladX42b+6+AuFQKqfp85vbuLXzokyp/mBpONT6WcD5Jn10vGpKJUDmpTwhCA9Vv4G7/EKvb7pJQdBsejdhDOYH6sNGmm0KDiqk/OoejxoSD3MR1ZCWlQ0o/ZmMvfcM1GTG0abomiB50oAixcrqyRob/XarFLdO7sG76C9gxJ4327DhN357PguqfYiC81wTCsregltdYbFLWo8+nkvjQvX/cPXY/TMxI5WyvRDyipwk7tKaiU1UCzJLQJeHYOBifdBDvWgjw5yeH+ZnMHVr9vAyE5zP8jruJb6oqeLS9IG3b2sX5J3fxXd1qTDjjhz+eHoPrHqNRJ8sQ+pMHueDreJq+7h1J9BmDyHhbuq4rRxlPRsD0liBuN9XGpcrSIGY9yKHJv2FqRAv3aiaTUtVNSnsTgd+ajoHBemcS149hgbOm0DNuH90wXMH9abmc3jcSlRXdccmB/7igwIp9b84h57BX+LRECzKyHuP3Vi1Iea2BRY+30MYtrYwXXrPXpAn4XkqbDSz62SzcALQTSrFyXwiLWDWhfro1rjnTCaX+D+lv+RscDu3F5sRUVlJi+O03hvYJ/ubJO8uoqDOITcJkILdbHi4nnuC9RV38rbiBzEsNIGPtT1zw4BtElbwEIVk70gJb8sz3puHgxzgUXEv5qeWgFzQJbmwpJ5uj2tBi1gM3HzMbXrSmPochrLlfQwErCW73z+H7RdLwcgTSLtvnWHD8Kb39cIYLopejk3UBHlULh9KC+Zgu2MWu0jagLOkCTjmBfOK/An499QX2TfWBl2/b6J2GIyvdmogPMwuwMA7hsfVScnl1iY/4FXGXYwHTDH2YMCmeL6VeAMGfITAr2Y1/gDhcqo3hQsVAMp46CPKPxmHfqnC+m9JBgfuk4WmjD3mvfUAbv46HhSUJfP2EI/2JSOEdbn48nF0Gv//LYCfjBLw3JAaJJeJsKDYaLki58GR9gswZP/FF2l/612yPMkayYLGhEiWoifeXysKnH1qQG3iCexxPcILaWZgb7MtiibP43fh2EjIQofsVu2FRlSmHiynA8mTm9PZTdHRCDYV0CnMvO2Je8l7MdPelZxu94aZ/Dp7aqABW5Am+G7zZOLYVto3QpJsHF5L+RUXQO2dBcid/IUYewrRqUZj1oI7+jPuBh1cU0ojQW/xJ5j/wnZwMJRhBx/qqePKvGRQlNRLun1kDgVGv0bq2lG8GmoKLQQasFP6OEZI/uPuWD1Vn7kafSG0YfmqHJRqraNSiG7BhtinYVe+HjSJTIcw+n6JndnLh6AdoUogwZZEMNV66z1WXRMjMIoDMY8wx+uU/rtmTwDuO9cHoOUfI8YY4uC8BOL3vGOuMmgX5xyZRoeUu+m19hI5s2EHHBeeiUb4NPlMfCetefuDgxR2UNj4ZNnYepeM3DlHPrHTYvWA+tKelk9yeEbA2TgT+a26F3otvIHvOJFhZeh5ab06AV62bqUg6k9TM19PEGEl+Y60Lbh+LoUX9PTx+5MTXGv1B3OAuqA60w+aqYtLzmwkR99+w5bEp8DfcmPvnXUO9KjlIDf2ICgq6/PqnArv81Mc12X1kM2U2nzCSA+nPn0BYhaD2biuEy3ug4Z0OiFu8AmMNUnH9Ozcm6SI6skcI1sxJhdcWZugoJwD7bwuSZW4Bb9efDjs6ltDICX+w/VgJ1xy3hFtBu6Ek+zZmSNpgdtd6aPFch7rS7nx1wzA8STnOBzSnYM7hkSAq6oYKr20oPdmPtqa+4FNhGWwkmU5F+cJcPE8K3y9qZ+fvtnBy81yYGvaL6hdI4si7tiRQ6M7dBumQvjEJKv4E0+LMy5yRJwANDt206q0+1uybgzdk1Um4xYGvuhTzR8U2nvFKGmccLYExL0fBitlDqHnWEwa0hMmqxRfcZaIpw9aF6h91Q5tyLz2QNOMAFVVYINzNub2GVJh/mqy8d2DqqsmUbRzK8/Iy4No3GcpbvYmzauRhak4yH3r8l2BjHLYdqeb4ZCAR24NUuluFq17PoafvDfjEBSOYtNqUq0Qn4NXAmfR2vw/nWN5nX4exLHDSHzIOiMMSoU7Q+zIVLOI96fAiF1oXUMOyly6wuE8eicethJF+57hyvjkfuDMJb31Whwm7n8DbV7fAcn8pR0sV083p+bS9xRmu1MWhnQ9Aqsk+uNcwAQ7W3eMJ+/twx/gC1jHVp0/zbamnLAo3ZB/ksI4cdLuewTpa2hBWEcWPhSTh0tptvGnqH2x8Gs0/t2iQXs8Jdkp6jnLXtqJEsD4kByvSqo4aikhVgeeTG/Gg20JsEnqPKg3RdK5qO19qvYB2YmLQJCUAJ9w28OSN4rDlrQH1f3iHW81NOGN4LK3Me05ndDTw9y1DOFlXCFqvKuntIhcYuWoeXhXr4tTmTZD6K5/cY5wxdsiTRmtPgKO3TfDbY3VY8jALazaE8Nn/DtIzr146MnyDLnd8hkekzh5jdGC72FNomRXAUucG2T/sC03awBxaoocT22vgayHii+BazrYZBS4iV7hxygMSONcHjuu+gMAXF05Wug+Pjwfw/huJvOyfHKLJZHi0bh0qCBWwjPNN9FFOgHvlRiRwrwVyzqlSm9oT+PyumbYfUIFdxz6w1IpQuNK6BoJebaZr1q78XHI3vFeKoIMi2RxqlQpynkKwcssJvLxDl/edE8XgCQvIyLWByqSWwMPTF1Eo3xROyN3Fl3t1oFQ4DMpq1pBkXgy4fYpA97W99PnMGawwP8TDkgn4qew77Lw5Au7bvYSLX3eTmpof73QVoJRaTdbXnIEDgyupa5YRFjz6jNM6ReHGWDEo3/UZXHcSCA9bYgcdgoD5zYjZv8FrvSltL6wEyzNT4YX5FWz2PM9vLkiTrdQUWmqtDVv61kHm76dc2O5IgWaj6KCGMBz0sOfR7ybj0RYxHDBdDgoF7+Dk6Vcwc8ZqdA0JYZG8Wj7+1gokdI9jZkovHBT1Iw4opueyciR1cTk6fnCGSVpPyMcgnWujDODy4hUgaSXBY2cnki3ZUMaHRKya/hiWv5eH1tEyeHhhKbhbMOz9fR6vRtWgY8wmOD/9FDbKD5JG+1m65ryURVwNMOZGM2p7yYBcznjcO9YV1sdLY85pwLcBbXzPdSl2SGSyo2oRVk3ZAPl9ouAtU4WTBx7zuKMPoOemGV3JDmBrpTb4sb+X8pLfYY+rB8v/ZwAvr9ZhiNACaFGNxKdr0ylduQ3VnomjfvBOLH30jp+OiaKkElW4nGFBvmLNtGtnAN7zOIcOQglQDr2k3JsCf+yeo2WaE1q8sQHrwY+YcLKNDu08ykEDwSyhtJt6tl0g+fWeKDb5HHYaGbEGWkK1eQxbuf+AZJFLbDXeDk7Hv4Uh2+dY+KGD/Q76UfqVNjRNtIbU3xkUqzkJ6j6nUW30c/A4uAAWFIrCvJKTsHq7Ez81PweX+oTgR/hDspc6St0icrDx7CYoiq7Dj2Gy9MLqNcqc76MzkkP0vmQqPF2SD90DG/hy1Vd2zrXEbME4THvZTDJ5oznD/jvbrX7CrXnisMuqhQbHmNJnI2I9DXUeGPUCZ31GljQ4QOD+CBRLf7HraGPgY1UgNuY53RRohVxJU8wzmAt+G5ZxqbIB5XxcA7+MuvCYnCWckNmHcXY1qHXmPTcIf0dlWV2k2rX46m8H/Ki6Rt2VF6jF0hLUHY6zp0cotlxLRO/N3Tym6B3NKN5G9lGNZPDnG+4L3QsH302C6UbBeLIhl26nBMHZuFNYOvMaHI67RcfuaXHQBlFUl7uNn8KswMPZFVvPSlKIhzdo1syGgeuN2DPOgnYlicPXlX8xtDyGzSfIw26/uxxqFEzDk0u5TroMZ0pPxudzWqFEaRlnr0qg8tWWoFlEMPW7Ogzd9YOJf2+T5p2toNhmh7scgqgzcD2W0z9s8mmEiDYJaBK4D5IzP9JHlRJ6MHoV6Fg+gkXy/+GerZI8gHPgedJ6svWThfeJi/nAmgPgv/EZa6f582Q7Wfz3Ejn4QQnNdtyK30r2wZ9OURCQKueWCcIkGrIGFu5XocerQ9E4spNeWBnTGFk/kA5Po89PNMC+ZSUETo7HMbdroP/+Aagf2M0u3y7h/Z/COM59gJ+cC6ENR0ZDqYkNeklehPuC+gzH8rHMt4vnXVTgZvDFg5O+8Jbz10j5/AjQ2lKD7b9OY7lXPIe7p1HNKmfeuckMZsi4kPyTfXAysRgXsCm87/LjptxEmud6mgrarGC1bABWrnQgp/qjELAziHHAE9/MUwKlX1Zs65rOx1bm8ftEezKfdhh3nrWj+X36dHy7EUUvGgM+K8bCt55dbHrBGA5praczclcoxs0Ppu9ugCMXVpD7URE4oJTL5to6oG4SBY5jj3GZ1SiwUK+npVs+UsOxcmw60YB6GwxJrPEz54oKQcV/GzFmwBmzt8Xwu3rEhFRl+N36lJL2rGLBJam4vUAGqgvF4OMZZbp4bzWZl35lHV9dXjxSESXHC7CBsy9ODoyAp3sX4Ao7CVhsZYO5tsLUpnQUpP1WopmDIW9OmotB+Qwr3p+CdpFjZFqvAo1XE9BrhCt9OFSNUiLeEDApHGx+7yPnXflYMLKeogrtwNlkEtRpqXFhdxCqHHCkZ9COixJMSNylnOctvAa5ERnQs8Gcbj6zgMyfSnxbKwZtzZThr6M6lFSL4BexNB56GEQ5Greh+fAzeHVQDrZfXYEjTcMwLPA02KaKYGz6EToi8g7eFV+G2bLJ7KYnCZJpsuDSl8Guka7ou/QGTX/ciY/uWpJ51DTsnGDNz4Tm4tSikfTnoSxoXfNk5+dG1NX2lcP9XlMexGKQ/1zQ32aEMZuuwB+hMFBN1AFd8bUcVDKBujMH4PLPGPr4tANyv6eQ7/MCVMNAtNx/io9enwol0U1oGaAJ2pMWQU36NTIfu5Bni5SS1MQpoP/fbMq+sJueX5GGFBlNmBIthfWHV+OTUR/B01kbBh5epjFvvKEo7yQPRLzAV/EErySEYdGTDzAm4haVV/6kXYlx+PjAEc75YU3eft6sMkGZLjxQhgJ5Aqfj7ZT/oIqUB8tx3JrzZDHzMr0wWQb4WBMlT3+g+MIJULrnI+zQ+4QPr67hhseH6Et7PtX+vAwVT9djQ/cBOj+4gfoTzKAjO5t3xiznlF0HIf3mbVi+yYoGdULhcsQgftlyHqd0nsb5fQqwYq0jTu7Nxg1LLcGyErAhVZ6v28fDk5n9lL24A7dIHeUF4iPAxlIVZVWvcmV8LWT1P6UxNX/whJ4pTh4fQBV5j9G6IIEmaYiBzOtx8O+LPc0MaqeKJSsxZ+FyCknNRp/IGhbvXQIem8JgKEwSwpWqaVfXbJqY5EZS25eS75IncMh2Kb45p4j5T+fTvG++aJlqDZeNb6L3UjWQWPoDruh6AHYrsw4YQabSVmwwmMRhpTvptshoaHPsp6VXl9PuZd0UYtABq3bEkLS9N/9L9KDH8TO53NGex+aZg+zqcfzW/xldFbFF0R2vWGekIJ0qEkDZL14ocWkFpllsJcdSG5iyJA3CttjSqB93MND7ER/4W4ulH0LJvWwmNjp0w5FiDZ6XbgDeYUVwaZ0YGppPQKEvS6BH7AVYCvhjbOV32hlvjpPWb6CcD3Jwd1UG+SptotvHs+HXlM/4x2cHbIwZR2kzFqKyciT4RvzBVDeG1h0eeMTEBmYdSkJrj1+oa7QASpW/4a8uM3R/Ow5nlH1AnyfacCEvlt6pfGLzcGGUuywHj8/OYYcSO1hRsobz9x6BFTeOcPDEKVA/fTJqi9yjDRJdtC1kPYT2i4PzPHW612gIUvJGoOy1Elf8mwIntxhQ82VxKErq4S9X40jyUAw8KTUBlw2BXKs/BYTEkjlUTBAUr/WwnKkddZeLg+W6XAyvfgxfItbTi6L3pLFUAEsFczF+ohB8uKcDR2UduXPQkryXDMOcn3a067klrS/ay9uW3cQJG8wx1scIVrg/oLVu4TRyqJfjPn5gqB1Bn5z20SKL9ahrNp62HDWC/J+asFh/BVidnUf7v/bhHvM5lP0+EG8F5LDWjwmo416LeUXp8F/kCNBXOYujZmzEnOkbobEriv7VaED8OS1S+ZZI34cN8c65YfqRbQavNmbQlJZtbGUdj1nJz/GQ/CgYjL/Au6bHwTrXaJRPSoJZmrpw79tltG3TpXfuwFMexqJjWz0d/dqPL38AmqhN4ko9Wxg3djyMcJnHxQut6duVJI4b/5pd7VUpsvonCPyq5BsdS8n89HLKOj0CTB2ScLBrGnj1veX5v67DA6FLtOBhCLQ/2s/1dQepOWohSY+WgGa7DVTbtx7V/67kfp9beCx2PoSsn8pDJSVUuuszB+zYD21rdCH9uAbuubaCot9soUcPrWm8yzfSsnnNLlO2060bquyxYpBJWxPUb2ri9ttjIdN1Ns99482q2rkwdHwWTrn4HNjRF/1dpsBJWzmofrGCzxnu4cakx9Cjbwb6I1vQrGkbffuvh9aIpEL1nlbe5i4JzwZdaYlXBUkcY67paMcWNWeSybxMr1rWw1aH2egTfIzeVY6EE4+noXk9oUOqMFW/3UJ1xwvI+kQKfJZ2p/D8HojYmE4L5Kzg2ShR+DU/Gyo/uGGDcDUmeSpzVkgoXXpdysFhe6m8cB0oigvCZbE7cEMkkZW2BvKSm9FUknAWvL4OoIb4d3gtYkrThpRg8T1D0AvrpbT1ojxcbcdyHho087UYKC9g8so/xWMeSqPF037OiTSFk8MmZKQbTbvrt4GOwSK0LdfmJatP0+pruzk4+Dgpp+tDSLMq9IePgE/bZlG641scu6iW9/xthudJUegVGMMXK6Op5GUKNg8YwuDwelIKziGfDftxnTjguBmVrFuqCSMeHCLDkj9QZ38HJmUrwKrFb6FkpAI5p32m3R3lnDH4hU99PM9lV09BxYXndK7uK+7PFgVDiTwAywjIDr8J/uuaIFl9Ppzt0ifVhVkg6m3KY406UeiUOVxIrKQ4HEC30eNQKG0ajO2pxsMrZ5D/+yhoGH+euvQEKWKZJUyums9nDv/AUctGgvPe0yx6wwsXby+kWxL+6Lwol0cvWwB6j/Qh8IUR5+0ejy+yFcG82Il8V7lBmncizrA5gZWnXuKvRG/cXDgaJi5M4AydKfSfkzkcczyHYT6F+MpwEY33GouVBaYUtFEEIhImw/rL0dwVeoxtm9UBbjlR689xmDBwGVvuTSTPh0/QVT0DVmXLw3LdLTz2dAwZtYoSTjxN2+zmYVzmCuwZW4gi2iF8VHshuT9Rh+WSx+FXiAg11DnDiEsn8dHMZ3RSIBpOijSDzM1tPC90CS+crQvxlIW+u9W4e1EyV623YP2B1xAfbw5yua9IsiMQPb9WolWZLegM5bNM5Un2z7oPEwLfwA3Ps7Dc5xJ9+iuKG9siqHd4Ad9J1YQD09M5+dQPsrmWyEkpbrhQ9SU91TSjYsu9WO1QCzmtZ6HunC5cF3mK9/WkCD/OB0UJD6q7eQUbxhZD4vB26stbyEk6T7DtiCzccQjkBRNO89laCRrzpwB0P3lA5e5nUDAqH4r3nuOCijI0SpCCd5XEtnfEear2X1qqFkbm98Th2stxJLi5Cu51pkD7Sm+IfqYLAjWrcJPtH/7y3w6Oi5oDRlce0s0VnvxmtzFPtGlF4TVR+F3NBvbffofzjm6CIjHAhY/7yOtTC03YuZKvDdWAV1QfmT1247IXArAuKY7/+7qZHVsOwGavKnhiGkqiuzv53vxg/jipjkXcbtMlA1EIN50HPm/kaFidsTtDmNBpLSU8mEsCRhl8ItoNn7sroaKpBRT8jiMDwTuUtUEVmncX8JwFTVjuLUZKE0LRMlYIyvJSSU0e4JWmGEik1oDntjxq9H8GR+S24og7V9C5ZgvcklTEi/JHyWT+ZFDK7yWhp5M5ba4NNZ3RQcnrzly8M4xapYl3Xaqil/MuckCbEdw62AAV9fXo1d0Klc5OUD3JnmIDfXHjnrscsMcY4/L7MdxCG7ZcuEy2ZZ1ccKQKc+2u4LpqxuKtC7HuIMJ1m3Xovq0PV81Wgev7eyE/agrmDZWhys4bOP+sLY6oDMGU10646V49nzYJgmHLKZB6toysc0bxLKeb8MRbG+cMLed/Lb8wNfsUrFdthP7HqRy+UQAsbl/kG2+VQHJJMaiFj+cjzwqgu8GWDMJica1vOtxa+YCPLtIH1Y8+kPK0ELjPk40nj+EM9V8QUziN3v6SZ/lMTzRwyae0JkNYtiqRnrnao9XXflh/ZiLMTA7ibaNX4arPItyz/i+tmT0JprkYgd2Vn2DjOoihD3Jgf2QaHW/L49g6gisWp6BmaimUz0+C1p+yUKd0G/pDhhmevaG5mdKUXGAAn9eM5yNfxpCYxAk2i9Mhx9fjYW/pHZo62IIn1RRw/seV/PrHG/r72R63HzgNrmUObB27mbxvqEHR0hMw8DeXp67YA+rnNOh7Thbs4cUwN/kc7rdfjwm6ACZTtOG/FxM5I0OSO5U3sZZ2B8fAEfoZOpVWBTvxiMKXIHntERe2CcAV9wEMULwCjjY9tMz6KFs7xlB9USDDjIsgY5tFOnvdsNxiBIQ9E4BFOnUsttWJG74m8v2q5fTguCNbC76D9c36eH1TKMzarQvPHI7zllOP6GlOFmYExpOU2gPcEhQJ/vF3cbguGhLHSNL6SHMIPr4IyTEJTh1UwDsfV/H8gUxMWa+CBh/Gk5D3K6q+sZ5tHAThfXkQuCx+RXP7m7it3YGH9GrZSMMSG5IyYXjrLqATk7jX3xw+BTnhUdMFdO7geapf6ESeQqYsKhqPxxNP0N1ZLVzhN5KOPJsKWX+O85Z3lnj4RA9bSKWRw8AAZ1+ZQjPaInnjnsX4yPg7zr0zDsLllcCveAtMPSCNN3el0BI3XQoKn4WCnqEkfMcX//j14PZlQuCUO4JrvkSQ8fP7PGrOLTbx2c0hZunUP2st5UXMYD+rLjJ31IcrJcd4TOgOiH44GdrSuvFO7gFKz9pL2Z3bIXWdEr/RWgAiFrLwquEtvjYrw3YPFfysfgNHLfWk52nLOE1QFPYqx1LTvw7YcVkJZEws4GzKcbi7dg8vki9DAe0JYD7rL5btDYQt7I3Jh8Ppo7QF7PD8j5fmAtpLDnHeh9tot0yJ3g4TRYlHwbnmSnotWAYyYhNgxFIz0NW3wTCHnfAs6zkdKn0Nf8RawfXhEf6mM0gx6x3BwkoRrt3bSf7iN7EBfoATvsC1d0Op7sw8rgvcjS8UQllqbR3eNdOHoqSdsPAhcKN0NYdMG4lxcjG04O9brBj7DF71jaUQq3Ke+k4ErEwHcIV2CQrsGQFrYtag5f4jPOX+StY2aaesPcU8+1YniKorwud1r2GBwiXqHVbn9KN/eLvtEQ44kEphI2/TE91P3NwZRoYbZKAkxRd6Hax4QFEUbqcqoKSCDZyFMpaYfxXXalwBi6I+iFXUhWOek3j7DlFcFn2TUyY3o/+dazBz0SoMdxDmpmcSlDluBZzwkYUTP5iFM2QwXGkx7PP/CMdVrXhpVBzxFTUaVP9DCSut6V25PBgV34PEmidgOdYDXisXgkLEJuj8V4T9Z16D5tgbPHtPJmcYqcCQqwp7KHVQi1gA7D8ZzGEvOqjV+BFpCb2lG3/asTE/hgtrRcA/sZCcFrtT+kd/PrnBCQaHFFFC0Ymu6hmRd3UenxdNxJvXx4CSYjRKTHXD7GpJNJtbS9t/KdJ/Eh7osyeKcx62cvw5d4xMFYQAh0lw+hbR/N4X8Kmthi64llIwjOEJehPQ00uJTkme51/HR8KL71J4puEQKdUuxDPFITjbVgWlh9bQlzdS9Fg0A/ud98KIdBtYFPGABKGCLsXfwZM2K+nIDkPctUeP/fpqOGtPIPz6tJw+N6qDs1ETe0zMhNORC/Fi2xNK9RehQs0vYNy/ibuH1OB7fQFvOCsLn7rOk9aHEpAIjqJfiRLwM7qQ152/BDsj52PBoQswdsRaum0lBWsUMvnR1z0woDKSRs9xptlyqli1Pg4VQm7DUo8YoNUnaPEOIXBRKYeXd4fhicNVSLjhCjMOnIHrHmp4994CPLfuNQ/GzKHpiZpgl2cG5NmKJx/JwEjPXSiHc6BwoRSKm0rQsRtuJBm2F/zqRCEldx0eCLyApq7DfOeBDBvvbqDE7UGcaZmGW6+Nw9i2Cl40TwrstgjTjXorilwrwsd1HtHbt7EQaGLEh88WU4upJ23Z/ZM7zghCXEY9vExwwZRNXbzNw5c2mIpwwIAZiLv0c+CuA/BcUQr0p0yA39qneO9Lhrw3I3l732zOmNtAzScm0HXrL7DLLhSjehU44a4BaAhM5LELL9LTnX9ZO3Iq+7xNg9kVTrTaZT0WZefQSTkPTtRWAkv/YMwouEA36jcTt72Hvspe3HfuC/wxSWWJj1/IxqmTn68bDaWb9pHrsX7K2m1M04N94XCdFSWqN9OeK3tpxqnpfGBGPXuBIfwXsh/OyjM4xd3GoTHrcGzbb7TfOIhxz0dR/Bw3bjBQpsm3R0Dt2J+0IrIO+3Y5s3BWEHz7+hj2rcugde31qKNqDttcHPnzOFnQiKunxBplODYwhioKP2Foowd4S/fjZhcHqFLUpKAGMSp01YOPfp9ZWP8waXieh7LfxWQxoRi9xxxn5cX9PN7ADVa1DoK7ljhc3DgPjv7RRdHPIXjqwxZQ0neDW52OoF59D6Y33kdIawSRtYIw9+sinDWhmb92xWDQ0BGc+G4HV9TsJc35Tlz22RlEvrzCmEwBSBhdwb/vpWDb+l8k1rWdGiALtvcZY/i8D1DkEIGpg6Ow3kwOpgpEYZv5XN6g1UNN4dNwyaNFoLdTF+daTcfuD6P5zO8eynIVhCdGrnAUn/Kfqiz8u20+hj0Lg/inWrjX5Bh/m/+exWTek94JhK/HO7jkgjc9UJzDgvtscMffQNKu/c6n9zjyWtDC9DJ51kjUhPrOVzBOoZ4NqJS/rPlITlrnuXtmNDdFlNKymYcpOz4Fc2XGQ+jAX4po6uHfm25T7/hKFAqwhcv3F4HC5DTWqT6IB4qVoWc2Q/s+L/L6J4LX9+9A23Xi3NglySZHw/hrBkJJ+zZSeJXE6p9lYe3Jak4cbw0Fhjc5VymWH76IY9+CzQQ//+PGhefgaLkPgYo5LFdwR81/xzhT9irGq8vwjNeCHBmyjH8K52HV0ia+ruqP1wZloGd+CSmHWLLLB3WcG7kct63t4TspP0BucQ1869uEiVZNfN5LEW5UfKCrgU/pjrYbvhHugVkjo9ivu4VD450xdn46vcp6z3IaI8GrxI/mFWTD+0fuVLbrAK8ObaRRIYPcM6OdL9hX4eLVr6l3pQ6oS76Gc10aPE3lCi088Jje+/yE4x0CtOBYAjosu0Gy2/rpZpsceKEqiFy4Cp3//lDtTTeqEvyH7yPMcZRcHgbY78RLG2wgqUccorQektfiB9xhYccny8Nwxh1f/kXyVFb7ClakhYKv4Ab4pCQCKdeu49tD7djVnUzn7ZtQ1SeKFv+No64gKXrVbY4b7+3nI+/kYczeUvoi9otv7rSEpct76ZDiU7zo74b5Br94ff1CmPZeHT+K6EPMVheM6elhHWVz2hyZQb+a+vHO+UrKH1vAr4LLqP/CeUqaPgEOSsTj/IUDUPLYDwyu6XHWQTs45D0DT66ugJ8eiIYlT+HAoVFw0mkU9VlfpRfzkRwvpkCecDxN+xqKy1Wf4HnVufzB5RzOzVQD8cv32dZ0DWjLL+DAvBD0W3eUryY2w+ZIDXR5LQL5NQl49pwVPJ6wgB/urwP9dbUo0dMGh76uBYWMGbQ4oQp81h2hwe+efCjZCDQKI+C/lEBKdNxEzxRj+JOeKo0s3gwwvAfNHobAvYEhKhEWgKlq2XR65SOevEgEXr6fzeXPFmNZRT9MmzWKFkWJkc6mRvbKsQFr+W+0aaEiSS9eBg+UZoGSoQhkrFzKXV7H4O2iUVgkfY1dflvBDD93TtWwx5etA3DoQCNz/wc2ybdhWYXdtLqvCaVmltK8sCnQ4mhNsu3msKROFk3LZ/DkP3HwruYqj+/Rwluqh6ja2hp03giCgJ8VjNjrSvDvDrdO78fZy4XB+u1PNLEu4WdFA7Du7D4oyDYFwcXj4bqkG+8+sQxfj9zIp/5bwzNVHpLqqzLcNU8P0tSTeKmOMIQ/n4P6nxbBwFwFtncfIEHjd9Rx4Td9ixVj01kI4wR3kN8DHbD5cROvJK/FBhtAr1oZmHRBD5rq3+GD2jNcI69MKpdNyf6FMdhxF0YXLIZ/Jh7k39iKq/Z08ZHZeSTeV8yhV6eD5OrlXLLaEIo0tuOyygK62aiBce7uEJVaB7bec/mI0wt4qPEGTHb4QrqwDggsXophX4Yh/+Vn3KZViYNbO3jEjMP8O+stHXwhz6/WrsS/cmNg65wC3Omlgxe009ip4jr+85vDxlFnyOrgCt4wv4i+DUrg12Ap0LxThT4TO/ic6xyYeH8X9EeO4+er74OkShO07vtC4tH2bOCsCQEXM3GiljBFmq2h0OHR/E/oJtx5NQcWqXyjZaCDt/XC+dNpQ6j+DHwnvxyXTS/hZS1/6W57AxmxNI7rNIVM3we8b84SfHdABULE3cBniyO2dVeDpZs0lL1sxP1HlvGv/bIQqPIJdlV9JtqNkJKnDL4VduxzYyscnz+KptxlvFB9F+dl1cJ/94/y7QeXeP5RBItiV551xosfWLbyw/P7MLZpiKed3AttG93IMvo9uAsFg4aIPhxSTKacTBdysL7Bxv363G9hSEcSN1LxxjsgPOUrX2udxeWfx8IK/oMSzy5QTGAzF+V/w7cvfUHi/QUAnWN0cJ8lxdZEQeshE5g4rg9zHy5lq6HL8DIhFVd6yNN8GQ86/baBvzaN5qlJB/jCqClQvDMa5T0DWUH4JhZvVAOz/WFQpyJLhQKn0Lo2lsoDDkLWXS04GFADbTkEFGMM3vHucHe9PsWft0AVr+d4qOw4vNytzE/+qcHMfZfxzK8n8P7XAgzf3saJPd103YrxXdtSvOIQwENnLNjygSLU5oYRLOsE8R+T8PeaURw5Zg+rz26GUu/v4PznByclZdB0f4LcnNWUtLWPHpacQq85o2BeykWwyf+MvU/u8KhrGRRi9h/8SgXIHbMC7QT70Lg0AOmuI6/+MA59c+ay36xjaO1hQuLVd+iMji0MRNWyrXAbjzr3nZZp34V1XfZcOLiTdf8zBUefHBpcaI/6EQTx1vn86f5TFhWIpblyyrilKxHeJsmz27RVIP6xERf/EuDsjrGQotSAWl5puEvZACwahlD9zRSK/5bP0ZNEKLaun8yCRpHYeSMoztzFet/+A+NHPnhsojpbdN3F5iMqIPz2IaZWmrJC8z42NjQAnaIW0Ks7yVnsA+28HTbriPPa7E6MOf2Xot/6gsO3E2TTJAhZiT04Y34PZV3TgicHpFFi0BN85y2k3KpPaNcrDPFZr6GmRRHivyvh1K44Ks1NwMqL2XDhhCwGfDpN1v9U8Z91E3d29nFApCVIbU8mCtEg+WTin9pf2KzlIZculsVnufvg6tyTmGcjzQl75cG8QRNfhu4D7gQwVbRnKasMmro9kzadbaG9h2PJ75MlC080h5rKFJCP/IODr95SvcNd1JNYA1NtdvGIp370SGEtV59sQaf9MtDuthMUt5/hXUtyOTB9J70YMQqa267igYNGFF1RAkV63hi/ayQYBEhiwMcrdJiWkbNXPJU9qERf30YasvpMA99fs73zIpRPl4Df8/bR5ItWNCbFE4QCPTD8sTPHSnfTkN0Wvpf5FrRUh6GuwQRMy/byLJGN2JgkBREFG8h7SAz6KBour/pM2gVa6K9XiUZjNWDPJ1UKOH+Wjz/PYFcLW+T3+eRu3c4V4Q85KXIibJPRo7lZMrBJeDLI3X+OH36uBbun9jgdZOG/40m08+19TI9Upi4jF5iDRpAQWM3yJgfpdt0TnNlri0vviVOkhiK+2abFj+bokMAGJfqlPBq+BlmDZdUpqJYzYaONHQAVRWzc6cm7/5vDlw45EItms2u+Apx4Iwy3332ig5u/YXZdFVbYL8Mxq7yh9IAleD/X4sJjw7haVB/u1l5l+ww1MjvwlY/dOcjkWYErpWVg/vhUijT1IYfN+2FxtA4crN0Np2Sec0bbMPXsqQS1VSdgDK3lnxIW+NHFCR5JvKdsO0No0wzAY4/Go1HnTzJbageZq59A1pcp6HfwOoS7NNMHe2v6fdcaMq6IkblFOFXBINmYTeeYVV/pUJoBti8s40uVxdDSuh27xwiB3/qT7KSQxkHuw+wt1sPTfQwgSW0e7A7po56TNZBZ6Is1E5XBYmsmKzeOwqvSZuBnp4mdyW5UF5YNYVPn4YmjGej6Mp7fnTKH6vJP0PykmyVeScLT3E9EE0wh+t9LtNlhAc2//MCmYC4d0BOE6rlDGJbG/Hj6PAyJWsIfu51AU3cSiT0ZIK25v3DdvrU08oUezJm5id+45GBatz2cqNWARx9jca3RfLLx6OWagmT+UivOMjtFYbr5ETq+zp3ELBfwepvnqB4XQaseMcP8XLiv3Uhlgas4r0EahpK9eKYawOAtZ276fAombJ9M8peTQNfuB+akp1G6nxlnJFtC/qkZ+G3UK+q3qQalq2o8W9OYPMf1gvrTEVx4fjn8kTgE8e/kYGNcOcQvmcc/my9igJ8RloiPZ8feOq653MUPNq7jj9Zz4WulEtzcJgDTBE/x6uWlWB2ryyoemzh+Tx71z2nkgYUFWPTdAR8n6EHdkCyL3+jDWKkkfPFUAg4YjsGu3gUY7dMKxknXuET8IdveMoYHUf8o5n4CrnzEcP9rOne4aoO/jBy+M07Apc6v6PxYSRANHQONO27RKzU/PnSyAAL8l8OpBz68yLgKpDqvAnz3Iim9Xrz0UxUefp0KLzXeQKN1Pf/4YM8fFJkeTKmkzM3jWaP/D+x01MN3tuJQsu4RyHpuhisbnFExdzV1Xx2CtqB88DufSVprHtGxgnOUYyIJk78q80OzdJDUaoRd2oGYc2I9W1SvhuUB76ixQYW3vVhEMsn6cCB+CbrvXUdGc69yiNY/PDzsBZvU6uHC400ktz2UL445Cp1jBeCfcBbuDw+mXTsPkUiUAB+eLwLKIEYhNQPkMCeaDmVNouhUXZg7FsDG5DJ1RhzGXVc284ehNPJZeIdSbzlA8qRyvvw8hc1LheBAejIZpgySwqd4VFk7CjxqZ8N5xdM8alk53Kr4Dw1qUjlu/RiwvH4b7BV6SOGBMn15eA3nLuuH1F8fUab+B02MTeH1z5fQTT9tKDZ9ygo7l+CS6zvRbXgc/fB1pgVTKqD+uRM6PqtEyZeaoOJhA/m33PH76lmkktxDUlP9cMwXQZZLEGXbQ80UGD6R2kb8ZbUHY2FIZjVv2rsP86oT6bi7L85YV4FnW9pY8twk9lp+D0QO+eAmMVvQvLiP9dapY6fXCIztX0RCabVYGDYLd888i736Oewy6Sm7nhOE/cHj+aLsbdpYdYSFvd7wtNKbFPPrM2uoSIC8bh3EClRjc6QpZI7WYge1C7jPcTpYbLIgcbckHCF7lWYO7qamNm1qlgnCGO1JcGvOCI432AnP+tejQ8hKcLhuQ6lgxZsPv+FZOwNY16gFbvRbQK1+AY+c9Jba/x2AqQd1SanvKdWUm/D0ohUYHLwM5919CYbSo2Bjwni6Hb4Fbhrao4tMO7v+/Yktmpnoz9upWGgi7SoXhdcdE8Gj4Tz3rIkHQZN7+E0tghundLLUvc2wrjKRflQVQKzpAf6QMhr6UyUx9v47+rXzLPXmvyLlKSIwclMyzd21mEtPlNMk16U0scAGYLM2j3kyTLs+zOX9FSHsVPqQT+utYKdPznhofzFOejUXfr5Tgo0aG8DylgzmxPmwpWwhbCuvgLbdMVhy/SQJZOTjXnMPzrJQho6Wu7ByjyvfHF5Ip2IZftNOnN0+l6uSh3DkqMuQ736c3k6SgPMvc3BCWj65SMyksA++GNl0jTZftufY6LGwIDeNmrOGKFhTCX5+f8DqO6ZCZm8DeTw8D4MWTlgZXAFlmmbssP0vHVVIYOVKEzg9eyXYFoxCD6NQ3nKqg/WbruPAmAs48+408HvxnQQxGN7XjIe/HXfJpMURmrSk6Wt4D23q/st3rM7h5u8D9NU9hNe9+0rf7FTATUsUFpx14KaQI9CoUUXtqVI8w/43TdDezFp3H8DppQdwfOEICOqehYI3xOF6yi7yis3mgwE2qO0rCO8n1kPV31Z8NlINJJYZwLnR32mnywISFDDmb2If2fxLBexsF6TOzZfB5PEjVJ+Xw1Jh2lC29gF/XT4Tfgh8wi+HzfD8skqW23qZIo58YluBO+Ab/4WDFDVgcvEamn/qCL6WNKM7PxPB7tEXSI86z8/GDHFxhADfneSGQbut4eL1bnCZd5+lN44nbB+B483vsEn2Q7r+W4/nRHvgAqU5GBCuCDtMz0DtnztwJbAPG57XUYG7Df2YspsWGeqhRtdBUnd+R847RMD+nBSob54Ahxd44xpvF1o6QxU/iD3kH2nFMHamBo4b+5U/6OvBuOti/LKhhQdqnuBIzWR+9Hgzvje3hEbdfWw5r4KOXlxIyZ+UoCbIDX/se4rvI5yhbo0sSwyUcFCHPy34u5Jnfr+LOWpzcPpeK3gdsJJL7KZDyIxiuD3LAV5Pqqa0F0lwMmkcXcuLpWyBLeB4fCR4au2lecaSEKmrjdqzv5DMm3LWbD7MkaLroPHHbNDLuosv0ozg0JOx8Ea6F8v8f+I38e1UPOIYJ25eiqdKIjhr+w0InNkKa/7JwnHRcCxcmAzeawdwxS1V+nq7hj6av4PHewG3lkSD3FYB+LvaBJpnL4KspXVwa+gzvT27nLZukGH17Bhe3lkCMsUWlHFtC8vbKkLw1IsQm5nDHVEOcG+fO++/9hQMrIx53M0PoOh3GtNnPgOdkSKwZEE9mGyejtPPTiBVMKKGjyWw5aIqP7KSgGfDB6jhhghvujUZ9sgfwUfTFNFGXo0V/n2F7bX1rH8MwdskDxv+nqfgC41w4cU4kHz7l/q/KdDsW+b8eN9VmHvoFP6bc4JlbofDpPRcKK/xRyc3TUit7eeNfz35wKluuD/OHex9W9jacRO3SLbQwr6RPDzdkJYOE2xxFaWPuZPIRDIHyoM2kFm8Jti9XslU/A0sYufA2AotuBcqCi+kHnD+n3A0iY3ACU+uAXwUx4a+SPp5wpfkZ82E2uhV0HBdHSQm/cSUBwkoejuKXTYvodT+sTQtLI6XFQ1ga94JKpjVDF/vqUHs60yq6niGaeGn2dn4Itf/nsEFb4uw9/J1sljAGFGFlDFRDcqe3QWldGcMnhEHN4pH027587gpv4T0r7nhgU2t7DO2H3dcHgGBn7Th/aPd3GLkAVvk7OFb9Es0ka1F/z+5sK3uHgdPl6Th1ULw7l8+j4/axeX6gri9Zg3q7nkDy4JUKWGbDdz5NoG+XJSAjgo5UEv/Cd6m4+DhWzNeE8dkuGc+nGnuoor6JVjmt5/cH9nQlHHW8G11F3do6pCSfiymC/ijd9lnkD2qDNPi6tlu5XP0XGSP+ypHwFsMxph5SfBz2gY+6l/PccEPyWSyGE82yKGK4/WU19qEXdcVITbUGlye1fMmp+swehSjasEr+K45ivKyH7LQ3rWUucARYnMZ/ifuPrSBcPwFgH+HTcooheyM7ISQraRklJGiiKiUfiotEkVIVNpFE5GUVEiUtoZRKIlKUdKw2pJ7zn2J/5N8kux6ceXOSzhaSZfVt2nhwZNp0F4ZQsc77cDj1AQO/rsXUlYwSE/O5ZARWtipLM41GlLQ/EmAt47whNdLe6F/ehSf7OjBIqmJ0BW0lDKvl3BU0SoQO5aFrIUAWQbgUxyCNxsSMLh4M6cY2YCtzQE+mv4POhWK4ZrpMnDwjGYt7cfg296Iwac+87fH0/CKjhDoSUyndWH90GG2lUtz6snv9jXqlU9lZ1F3pI0pWLXTFWZ5KIBV4Dz681MYZ9ePZ+eAbA6NsqAJNsfxi8VIcMBVbL5yMY7ptILvoXOxIs0Ybtlv4ed72nF3fyIt6rgMz9/vBIG+bPpvoz7uva4GooFf2fj2arh9dZDzWu2xHyvZ1boRwhauwlmr6iE9Xpk/nNGDMK9nFHfwKR6N3YxJI7NYfdc7CiuKw0bBTrbYfJC0PU7AR1156FrVDBd+evGJJHlqeuwHhz2f4IqqD9xx+zV6O76hVwd3kNGyUbBB9ilvWbMOTk1PBCvHATAw8YTgxcvBsXgLxqQK8Ym+Dn54Qxxq7qlQi5MabHH/SNU7bNjR7QNEbJfAzx7vubmqB/ZPfwEbmgk+an6E61szQW+nIUsWuHCX2jlSq5CBiH/RnO65D2Kbs0AS9aBjSA9PuO3Bod0t/CpFjx9caOZg2XCIaLREFZcKJsPP+K1qNJgJq2PM5R8YXVtAcUfyaenGOHT1jMRP3XPAv9SbCuxSIC9LFoSbXsIpvXHkHniHTY3jqbjuJEZVa/LgbFUe/r6YCpU+gPYnA+h88QGjl9tidf05vqVpRfM37ubxXhakGGoA/b8Seby9MeePEwDd7jss+rCSBM9awsmR52Fa9BGcUO4L6ffdUO2CEy9tlUSDLQRb3G6heEkcbhL5zJELNpOlK+F9m+Mg8HyYPc6Ko0JPOyYrjgXDN6dYLOsedcQ8QxS/hZXHlWidRSi21WXQc/UIjqyK4LzoqRB80R+ljrzgQY9dICXTR4sWXYNfU2Lwo24MyG0/C5t63nPISmk46nYLlDNug0vnJz4vfIvPtE/nN8sbOOGpJ4YphFG66yTu0NOD/ywegOenZJKdZkMWV3wo55QUvA1QoDjpZlqg9YCUt06goaNSoLajm1Qi78EFg9fQ3fkHdbLy+ORbT95mH4qCukYYajiG+sdqgv27Y5QfG4l9EbvIu04YcWcYmL1YQXfe3oTVD7/h3gezILhEFl4H6NDx9B7sXDMRPju/gfLL0jAcPQlX7krAx8+jeFS8OBclmENZnx5473uG6Rs78POSM9Rz5xYEBdShUUkuWO8YIIV/FRT5zALy1u4Dy3HzyC1HHBp4BgbZRFNsQg8aTlMgadEOlDTcS6rNgpBcPhHqBes4s7iGjHMUePWrRoz8ugDnz4oh43xxLlSKQc87I2Gv9B5a7b0VsW4xzpT7Q3/yz5Piim1sYlmOSVO0YWykFf1baggpY3tYPHkJn1MpII9PPrj74gc882csF5lO5ua2I7BIy5ztD0wBnPQF9bOLQWStHt1/NB1u/JPkEON4PL5OjCPEhbieluGRTgnwi9pKyZffwb9dyeDeMAfTT6ZAYl4uRnalkOjtHP596AwUlUlCdsEBKgiaRVV6GjDm0Gmo3OqA0nLhlHhCmaKc28nD2ZZrMy3AdP5ati+WpbjMFSB3TZVbfowEu/6b7DNQwYdTvDjreS+v3aoAPSZHcNH0hdhg+Qi3p7mBwqVR6KO+ihxnmzCtTef8TV4cFGEIhpOaedR1fzjDzH5rDHD2zBHwbmgIRo2opaTBNjKt+E6W6wUgwyWFbCM1we/ULFqZsILyzULA9aIKx4ZnQ+zdLs5RHIVvu8zhVF8rXZ68hfdZSHOo2gX+z3Mjz3Uy5bL4dXikazudr66C02la0H/tA9O+Piz/WQ79Tnr8+cdemnc1A0Zek4Mr18tx/syTHGUvBlUXmvh4whTcsN6L912TYZPjd3nl4qUU970CPmz9i9dyv2JTjhhYaWjy7IJwXCeaDubLauDA4hS++Okazx73Esaf2A6q879iiYw8lBYbUI6oLTf5deHTERJcbLuE1h4NpIJoT7x38ibkxOjixN3iMP3AJL6y2oncjMXRKL2NixoTeeXsQcoe+Yda/GXo4PMBfLVqCnw23cLLhL5z155ONI5+DEPSSmQbUcMRAj40Lvgx33xeCMoSFmC08Df993sXv7KQokNK/twTEAzDiz7TrFBJShMOhhCdOo70EYDc+IfkEBhMRgIVtDyumO4/JW5a1cm1YTPh4JkufBn4FrfkScLmo52oq9CLdz5kYt2DP7ByhD8nthny5t5A3PvSikaIxUDBVVWQu2BP01vlsW7jcnp5YQXqiAqQyt2t9C3lIIflFLDsnWl0oHMCnCntgo2l1lgY0sG6DVMxUOQBRed400ePIAw4/wZ8graxbooa5D3ZTbH36ihGNYkkbv3hmLj/6L7gR9je2oHu77zAUtQO9x1QB/VYB86268K7CXsx799lPtD3Ft6eL2OvCw+wyF0NqyZIgnC0KVSePgRt6htR4jFTSpEy+I8VhT2XaiE2u43DnTP4YP5BMjimDNcXP4b7xrXw1NkXjh/s5R7JnUgtoeDUHwpiM4RhbkMifVUfD2NDESyc2tFjQTPEDhbi8TyCuYkvObCqG96K/kePPAnrMhFqZt3kfXEtOFLXmvdKtNAi2UCeebcNs403w+LL51hutzffeGkBjxQvUX7RTzKSeQvVC+7A7AeeEPeqnZqkozjQsATCJLb9v1/WYdfJq1/Jws/h8ZD2RgcLpx/BKEUXkLMz5Hlqm2mo/jN+HLKBGY/fs9CV85Qy0g/st8XzUpFDfO+1NHmWnYYzX/U4I/kfK+UbQ3iUJyivzsAuGX14LLsYPpyMQuE1oTTooIDLTO2gp0CEcOUUCEiVBal9HnR0MA4dLo2joSnlPLCpiNZUHUKWNqILFwapJksPJr9xgBlQAJEGW+AFSPDWpIf4wuk+H8vqh/KZnrAqRpWyoywhy+81fdc8wJN2z4VBp3E4TuIHWa0awx7Rj3hNnhsKXQ2mKRcEoHnfAuia94hmGi6CvL5qfDBLGX8uN+TT9hv46utuHoz2RFN1c/hy6RKtDgnFC2+6qfftRIxMtyXmaLq4MxNdTNt4vuZoeldvCG9j4qHI8StKSL4j5ZgKCM/TpBle2qSf+h19DUu47ut9SlgiDUvXW+KX1iCuu1CFyvrJcHWuEHQoysKHfc/R39wHH/zShmtRliD+vYRrMoqgtOYXlWqsgtNDF2nSokG0y8jBEVUrIdSxC8RWycNHAeaDInZwrq0Wnhgfpzm5d8m9TA4P+2eC70ZjHj08l8d+FIfCuRH050MPretLxqr0BxBnF0A4QhgTjwbwpuPj2XFwNRuk6gPHFfNw7DlE1SVwJfAK5hX6oc0/oKW+Nlh8RA+D1qiByMJx8PXXXPio/JW214ylXfFV/PTHLD7cqAXBqy/zzUI3NvMVpYk1YhD+0gB7X1Zg1yRx2KL2B/+b/h0MEq3I1noau62Iw4HJh8Dguj7AxWXcdmEF7Dx/CLyFZPllRQYcXRgDOidmoqlVKEg5JdNVRXkoWPwXxkqksK5fPo/MLwR3M0kQfT2TtpiNxGv7FWlH3SUsLZOF14VeWMrOVJSaAX4lb5nfCwEluYLPvdMo1SOMIcOyOGEvwH753axt9xAaA2pobZ0on+YgjNEN5xGqDvDq/Bl661zIGybJgYBkH/dONefeukNgbtaPmpYHcINpErd8Ogzt+/4D15sHSfGxGdx4vBtD/RJIUcYXJksoUu2VcpqyivBHvTxpJc2goT8RHPFkLOxT2EZKo47j3oUxIJY9Ai+RBqfKuuJ8OT04cdkd6m1iualRFxT038PHtXPobsN+UO7JpjvHHaF+bCrqT3BD9dUMd08WYdXkEVB78hwP1+bBk/l7YJlXKveIXaT0ez/w44X/cH94Bmgs+QgbbARg9jWErAcCuLvRD+wf/MZkFEPBzyPZZY4ghbY4gfjCStZt04KOfbPIMSqOTEoKMUryEtgqS4L4OsaPTTdIunAJi+x/hbN8TMFv2ADVH4WS6ob38LDsExxKi6BLX2xBY8FUENh3Ew43B0Lq/akweMCOFmz1pPx76zlZPJklgr7BociDoH3uF/hZtsEVnQ7y7TCD+odxLDH8EB2nLwH/T19o5HcxWLPemtMuj6cZV4cw/GMqP5imCZIG5tQk/pBcnPpx4Ws92HY3nX7OmASqUsXUUSkFHy7Ng86dsjC6Yj4UHWxDLRVtLIweAe5zJnLrT0G6VGFK9gOP4foyGU63ngonjJCFbMxgUMQBf62+QG71U2GSqjrEex9EbdEjcGZcOJ+0sILlM4p54+NTsKdLgh/tGIOv7ObB3WOvyDwtga1+zcCrFR54aKU43I+XgOFF1zg9qQnXdmmCdp8TN6edhzsrmyDg6XLy9XxAM4OlAGa9Y5WHOaC2wAfKFx3FEcG65DVoTlNKijl0020SnfSAzL7JwrJiB1ikYs1vfj9njVeuHOtWhHnnt9JF2xtola4KX6TLyahXAvY8GqRwvSDY/8GFDC/OAZfFRqwwqoQfhq+lzK5zMG1VKpvISUOvlxieMJwOq44Okufr63zfOYwrqkvw+WA4Lf26nGQGHpJkkAWMV3LhDfXTQf5ZJppN0IfODS1QyNV4Xa0F8lt+8ybJEoxoVgV54bUwd6cVGBa+wx0fP7PdASG2F7kA7SIjcefvCzhGoJ58D5pBu+9RFBx6huLeK/nVuXa8F9AKxgqKZGL/Fd0spXGmzSc481INLrhl8f1iPbjj+gNevOiC49OPg8a6M3wrVxXkj8vx+PHRUFRqCyUv6zk9yhzCNYQwQnw/rNFV4LBRf7BW5yXd2LKZdlZuYotgfXDfH0/jc7Jpopoxyp5Yxbf/bOENE7W4wFYL2zQjQCr4Bx+drAoKk1VhX7ovDjd9BNWKCJQ0W44jNT/yrthZeKL9Mlx93YnVKyeD8PTJsPGUNPwJv8nAYyBF7DmkjoiHfa+vsa9OKNg+XkN3ZkyF/+a3sMAOW+wxbgK7/CswpHcNWo+HoHzqWyqMeEaLzMoQt4iCQK0le4yrwd9+ofTv5lm4NtqIPnko8vTSPvA7+Z4PLu8EMw1lGPR4zj0Pn9L0P5GoEW9DJ6oSsE7qO+lo7Ob5Qv2gLrOI5nydCGLFTljfr0vK29xRv/4GmViFY/WmASpv+ggDxvWYt0AdmnYJgr/WDygqPs0NJpPp6Kga2NoagKubruCZyc705JE4/bAVhgvb1aDhWQtG3RvJU0WGIDpNl35MrEdZqyA4dScOszO8MWFfBU+9awWm/vPBb/I/upToSP49v+nJ4gEa0zueU3O+o3imPappxfOSCISTnrdYfd9RTrxkB3EyN2Dbw3dgdkoRbdQMudR7KosnvIA6FSkQHHUYo2Zrw/Wkc1Do2AnfXD/ACv1YGnfnEe/TmIb1X7RB1EoNvn4Sgtr3B1F3bQXsF9nJnvHRpKnaAMfmmJBPoQ3djPtCekKTwfRQCmS5dIFBSgSsbnNF9zVbSXbVeH798gCWbjzFWseDaPsHgKS3SG4KMqRtpYR3FVxokcY2llwbCm7ylWzxYh8tN7tJweusoeHBdM4WQPTv7eGnno8x+NwoAsVn/GKhMvgvUMWnWfPwgKowmB+aQKWlubRQ6hHPireCkD2FkFs/mQcEUvFdkTQ2KQlgtagOvB1xiOXm38djmyJJ0mo3nZwqSurrvnCT1lHoHlOLHz9+olRFC7j67T3svziGvfr1ITTXmmoS1sHtMwJ0fH0NLTijjSZP3/ITf3PQbvvEZedD2co3gRZd7ac/gcXoY3yI4zQ2QdA1a/q02B9udQlCo+hiOGTZDjYJmfzO6gAGByvwauFJpDHhKe5pmc8DaYexvUwKLBRv8dnJE2iJVz1EV8Xy7iOrcamxDsYcSgaJugo20zhM3WsVwOPLTpQsl8cix4l80tqem+olueZLB0e1H8Sutc/ZzVidj4Aa3FlwAQYjNVHztwdPOLcb56pW0aJNF3m3Ug2Vx+UAGClg51p1uDP2PEdZMCfuNOGfqtP56PB0OHHjGFzpbwdPzype1L4RdvUrwfcmFzZfWwUOma9pVdlRGhd5EvYGHoXErt1wXDCG1ckZyjXlYcjVjTWDetluwwtcF/MGRtcm0KrGQn6S0kiXT1nR2e+luHO5NMw03Q11ietg6+SbVPWphezla6Et4gf7LpIDZ5staBIeydFp1jBtsI8TvefjOA4H33GaXB0/GzUbculDaBus6BtNPybuoKCn0qAs7U+3g3di32N1GipfAzK7RvDtXV9YTsaIv97QoctvpuLU6wTxHyQoqnASSygcgbzZQG9F13DzRAlwEO7Gy+BG+UrLefwvGfAa9EPJv6k8WLuJDnjsxP8yr7K5piVEnZAgfWrln99HUcJkHRgVupHyq9/iH38XoCXz8Pz8ftBUmI0nQm7TaZPL2C8yjBt0jeHvv9040fwc/xHtoLmrO6jzv3p+fPwJ1y6cxh05Y/DwL006kT0Zpoyzhi+lrXRxxni8mOyOq5zO8YM6U8xafQmmjTThStc5bJoiDu9bREFL/y8UV9iw3e9MmC29Af8Gp7HwjlgQDxqAfe79LO9rBTrDR7hi4zI41HgZZmd7w/TXiWyw5BiZv7PnTsPFXC3ynbYfV4FrC06RbeRKCnOW5KL6rRBQ9xrU69ajvf9K/nBKH8Y4LefBRlt40boEPuyZBaWNP/n4i+d8zL0W+puducwqCbLHPqdpI2eBjs1k2GPZD156E+hmTRsbp6+BRTdV+cNwOJXkJ8F065lgdTsT3B7LgDU14tPKX/jO+wvp/Avh+7ITaG27MQVsjKWb6vFgX2yMmy5awHPpTbAsdR4GR2eif0kNBvwXgQ3z/OFv7DQoT9XE4vsO2NwxARLK5PHBq3/sJbiBPW58BevgCM750oXnAvpQWLKIRVe60beZBnCqz4yTvr/mok8nsWm+Og5HLkM1Aw/cKvGUl54JBz5gyKVxapC+ZhCWeynDi1UVtDDBi4b2ebL+dSLZUQbYL+QI5yTTyWmfJSxeWEc6bvvAPU4fcy0Pwd/pEWx6rZ/CRqVAxp4g9tq3nm5f0QJ45sZq63+QVEcpge4qOm4TySohA7RLTYGlUnbyDalPPOK5HpyEU/C7yhkm7VlICQZT+UFCPXxZco/mzz1DgS6qIHtSDiZNEQcji3XszS/ZnleT0bgEzrvUxTOOl6ANmICxVAZF5oSjSsAU6I59hQV96+jd5YXotXMnmIro4PXVreSWW0S1g6cxsskWR2xQByXTGJabcw9vfnLn1LyzZHv2AxwfUwc1butw2XMJdi/2p4YeEeiffo6P7vwNFke2QkNTE9Ylh/CDccUosioZhrarcaXiXx58rQkm+wV5uacfrlo0l4ynrMB/cipYabWAn1ue5n83ajg2SJ4KTpuA24JuXHO2AZaHOMKMxM2gMFacHMt+wNg11nC89x7qzvlFY9MnwOCcC1g2VEv7UAlX7HDC+TbXMNhjKiUtscH4R0HMQ++4OGQqlO/UxLWdNjhZ5BEmOVTA8xtt3K9lTYc2B4DjvGVY9VkKBe1EIShqJ1+430k5ty5SGjyihQZeoCWrybWDZ2FIYB1nhH7GreGTYYzVdjpU7QiHxdrAoTONzBQXcJxYI93R1MPjWjbgUpaId7vkQDjQkicGeeJfp0joFQpG1Q45NhI8Q5b6W2hGzlaaY11E2kKjwDR+LP+7UE63cmyocO4xvn87B05b5/Gafco4pnssG7ia4MzdCrDK9TL86yzGMqsdcNOykNdfEqU1qp5wX/spjSx3JemUqXTh83jYoPuXqjWu4euCTxyhhXi1/in5m24nMYkpULVGkl79fsUlv6Xh7FM7qn6oCz+X1LJsyHXyKE+nEmN5rDiVC4eebMOxA7c4YpQwqG2MhrGW84jRCyxFIsF+tBvG+STygg2NEDblN6g+LKRp29RhzdkVcODxAoiWuovpA6p4ap0gPbPcw3NVell38Te8V5RDw1sEQL5bCWWd0zHwpjiJXttCeDSHZoxZxZXmymy5FeGA5DJ0rlWCgO8FvHrSO95scYyVHIkKbUNJxEmIz70OhYrzt/m4WTrXGyhD5ue9zD+BB89Mh6vvheD8nGEO/VeBExzNUWmfMjxY5MFXVU3goORfWCB1F9vXfoNrfhPhe0UDH2teBrnjEnh5+SBqnEqhNC9p6HWdBb21v6BWeTZd/B2CT6e+Jdu+azzxxlIIzjTk6OMbMO+lKWzuHcP5H+ZSybhLnFRgxHv3nuf9w+Kgv2IZVx+2oBU//PCbuRn88LCFU/H6LHvLgfjHOMqw3oXPLvRS9U11XJJejh/rgzFn5gh4rGuPjy658LS1gpzRPRkXZp7AJuUqXNEhR7krQllVMZM1Dk6FS3vs2H080ouu0ewgF0Jt6+KhtN6VHBMa+MyjUlA6NIc37paDxDEf2KLblVSnyoCLyk5Y+yiN9+Vk87HQu6wZMAJCNuVwrqg8vHJIZsO/WyAuSJyFG1bjuSfDoHI/hgfG2KMv3UEd1Rsw8FYBgt64cON0oshfTTgUGc+q766zZHQgCHyx5RaThZBweAX1WEnAogsvoH2LHucu2UZfP1TwxoPXcdZcHyxsmUqD0+rYUUyMSrQloaell4eSc+nkaR16uNuSxc+aU8+3OzR6Vwf2La2HHo0ZkKWrCxmb1/CUy36o3XeJbp5Uhz2SFZRg3kanXvnC3m9KsKTkBTzMlYPuVA+8uNCD6/x+cJvmVbov0APNdZm4qW6A0gJvoaP2dnJWs4RN1cv5gtolPJBSSI5TtnK4mjjYjzxME+9Kse+2bMrREsaxM/ThO2rzv8oflBpfyF+XvKaGa8fhJHwn9/+mY9GBP1CTMYGU3opCeGMmSf64hhXVQTxCo5k109bQ/lnbqPSOCxRkiSIotUHZdF3wKBfk4yLR7BbojMtnZEBGviClNhrD5L5QuOu2hjaJWfH6SxPguUwKufqdwcV2VixxZQdM9vWmac/ncFZJCW2UNIJ/ect54x9RSPpxiPeNjOSXKwfxca87jehzwaBCMxBfpMZO47bwf/8J07VN+rAgD7hgw0eQ7xgia608th9ry9XPtSH1sQi2jFDhhSL29CbBEGZ5j+BL6x6Q27Ju+LWgHPKl38D+MmlYmv2QVpr9ga2+v0hS3AQKK3Poa28aOIRbg17MbfwT1wL/qR+FKW+D4NIXYxrxTYBGJo4DozI5ul5WC4Ay7HyuEa8sn4vOzYFku+YKxr7rom2nKynwujWMUx4NZVl2UKt5B5X9v1G7dAHandiMOlOISp/o0uTPgXApTgqUc+/htLUO0FJqD20XW3FIeRBDPg1SxZb9sFVlFz/pq4HoujGwKeUCd6fl0qn2e3xlZAeYtRnQy98a5DCcjmZC8Ty3wB7F06XA8HA0D9yaxk+e62NnSRlsoqugue45OtvV0kG5a5R13IDeqmiApagxzbebjo9fXIF74SvpaIABZCkIolZBN1qUBNFxI3G6EmQDk3d0kfy5nbR21ACse6sJ1gKz0W1ECje395OPZAtdGfal4iQ5qEzYxOO7zlBGfSEXV5qzd5QkSm57hn+fL+PNpzV5a5wPrtaxgm6XRtjrMgVfGRvAq+wTeEM/CAR9B2ln8mfYEbKBF8zuxJs/1GA7zqAQywwKLJOnIPEdNMF3GfX/icVYo0J8f9UYfduO4C9fCciU3kD5m3+h+tNRNCOonN/V7IfV0ZkwL+wRbih5x3tlQin6DsHm85uwOMSeLATF8Hb3TWyNIMJOPxox2ptjh05jnpEovEoTgI83FLFfZw3ef1rJtOk31u9MQ8FHp6BttAj0mq0liyc7OPOoFOzs3ENnPbRJdHAjt2iPpTkRk9HdfzcFzn7Bcbu6YPs+GU7JF4VNAS7w4u9sHDVaD2I1FOnOp2500bjD1/YNgFzPEVJer8J/z2nBzs3VWNgZyp3eM/lEYAI23TwGKoGZXFWcjBF2+TxhZB8PSqlCdcZy+vBQmzxT3uP23mUcfmKIfk3rpsHVufDqSDm03bPHhbf0ILYrCe3mxWKD0XrasjiZyFqS6nTO852MBHLblkPOh9+jbqspCNalgWauDu6asZjck+fx/edZtPbDQeoL0WdvOyFeU6DGjt26sND0LUOUOy9VWE/tz8VhufNCtilKwP8e5ZHmXDf89+wzal5QgUO/6knPaRW1162H4VxVmFJ0BO+W9rPLtxiWbsqjkEuxdGujHCzRe0/yUr6ADu4g7awAN54chdUOSGPM9+Dh/zzYyiSGRlyQgc1n9lPyjs+gr+RDtuMX8Oa+MNwc34jp65+Sue0HWtk4ixVahUBQ2IQlnrmRQ6ckzn98lmVjrKFyngpYztiJDyMfkNC54yA+YAgmL37j4S2SHKA3gXbmfKLk7FfYN8GYqsWGqcG7j0XPzsA20fHQ0bGUcrT30oiWRFaqKcEsuXewNKYFxV5Xcs5vZXY1OQZtn+TgoE0H7HDz5Dzbz5Q0dQodWzkL2msjsDjIEY4N3OGMwZ94TU8G5s9O5ds+2hyYrg2OI20oc2o5+kfY8zttBS6SPgvjxk0A1UZNuDZNAw0eLaOgbRdo8vXXlPp8OWTEiWMstVOZpgZNS51L57VEwcrCn1uMszFVuISlj6ohB7ZC6NMqXD08lWO75lCVnzz0mqjAmVGJLB56ilaG+PPfNCWqkNOjB3AOEpduhtaAmfxb051O7ZGBl1lGVLvbBAK0D8CwzTM+FXKHo2JK4cc9N7iYsYZEfBx4lJ4ZdA2uwmOYjfI2yhCwowcmJF4DFYVG9Dq6h1PdnsCPE6spJNME4k98g31P07igJhSl24foulk+nFpkBN9jTSn7nROarz9HL/PlwGCGJXX5Ihl8u8Vt7wP4iPZ5DFymx1Y3b9Po89vYaNt0sik3AkNnA8j4dh6rPE9As5U4v2x4TDHG+Rz3p4Y3Vn6Hr8esafkLYZDYeo61VX/jjAcmrNjmS5+SzsLXyM20TdeFL9vuwEqBu+ijJQ2eH3PxQ2QQpJ8ph/m5teSZdAJ19U/xraMb+UhDF2RcXA3SYjKwes5mbPfZyBlLjGnkfCHw7Hfk47NKWWKWIzkFXYBUEyOelysKNW5b8EyjCDWYL+K/VyLRfOYgt9/9ga3aj1BP3xHPpiG2J6nB7l+C/OPNAAr1nIKeK0G05n4fhxWogJdgJjmEH4PbPafJ74U2dJn7UV1xNnzre4MDlW/off4f+FzozBlaGqzq+ZnyZNQx32EMjFGajdPyU/m3ZgGrXZWFbqF1+OKoOK/69ZNXbsjEoipTeKepD1cPPwLFUaK4u/kuJl3qYMeGJSyZKwNLf3yFKHFXXgVNvMzOAN44b8ZvxeZc834kr9b8zUqfzfBGgTWl1/ZBr70hzLwXhO79CuDsP59KPdvw6tn5eE5rOUVV2pNM+h0YLbwbqhSXY1JaGFj0igB4qvCCkvUouyiLehq0cHPfJUjROMqyC8vpufMY/jv7Mf9XbANO+gHspDMF9fZb85JFylB+8SqObECW3BkKN2I3YprLCC7WQli8w5CFpJyoNnUxiixeD1daXSDG+i1tmnyJnG/4QrnLbbD+pw7yu0bDxYFNtPavEk6sqYQD62xR3jAG52Tthux0Jxr1/gAt3ysPLwa2sqbXKLwy7Sq/DfzC8yrF8cWROoSYWDQ+MR0XqQTRwTmaEDH7EOodXUyykVbwZ9QLjDd1pfm6grAgfzvNTvxGGxR98Gq7PEzaooSK83fCzwsadPasH8WUNbKJeRG+NB6Aei8jOjj3Pm9iE1gpshAnffGA1d5jMHPFDdg4FIMKcw+SzPKpdLv5GYe9/Q+uaUjCAe1U8raRZS7ey5UXjnGcgAwb6njyzqvbIUBIFPQ8g/mDtBJotmRSezuybVU4hot+BjGtFRjulEhGQ23UGptJCQUK7Oc+6X/m/3aLBfJ5ES22jRJE4x3lqLnJFn6IJkEljaE3xic57zGh+WgD8NLV5EVrltIB5zssvrAVg2TM4W+HHH3oTaVohfE4VraIvgkow89d22HtTDGstFxFDobZdPWBLX/8+o4Ujv3g76lWFPCP8dyZCXD6SivlCImAU2Yxsa0JXbyxG6VHngexlL2Qc2UOSKvtw2qWhYQNAiB8fyPYPxpJo2+PZt+zsVRlqQvS9/5B1e9y0jq+g/yXqkKF03bec2I+NmQl4p1jlyD4aBjKT/KgdW+1wcStBpZO6OCub8rw+kYQvc97RkV6nizR94BmPNHBiesKsWnTeHoa0MpbH/uAv8k4qPA4g6e9X9KkhDosuG5BG5VfY+7xhxDjcQpzkkohLMcThoqsoSkrmjVFZuHRvd7gU7gIya8WhBfZwi0FdWxt8oKhpwDFazSg84UdN82rps+Zw5zl/Q3M3OTB1dIOTiX7sqiuLHwtOwg5OwmSB+rh5PsH8OuODib3y0LG3Tg+vbYWWzY50vSZWexauoRc3qjA2/Xl3H1jAycfO4Upyyay8/vv1DRbEFb8eU7FGYv5RUscL9o3AoyglFMX52OIwmTObDAA5XG/KDMvnpaG2vCXhGBMGHuZz8RNgFdbblFzYR1ObE2gOhEBEnVupOXq8rC7ZRsNb7jBXhEFvKRNA+6/bubnY6VA+KEh3WuchOZmQ7C4IJ71NJwxf8c5qH/xg1bc14Srz+Sh2UMA1p5eB5dnWfLhMidWOO8HUXEmaNIlhLWaBdCMk6A0yY+7TRyJ715k/2vS5NnmTifvFVBDzCoe/zGHNI+fhi3yE0FLtgIyFsRhe4kIuuosgrXDLuDzcBp1mLZR1RJptBdVhOxCHVi/YyPJbfRFDUUdXDtDAudeccHXjb/gtbMczRXQQbEZ72GZF0D3hEq8ZuaPYqs24Ff181T0uBCcVk7Hps/zeJz9MZjSmMyNd8dDzpxSft4iQZGVtfzI5ziYX9UlU4fz/CTmM9gYZUJwUxTv6xWCc+5OsPedOCtv+UJhtufp2VcBkBV7iX8Xa2KNZgFdKP6MujmjIU2mlRrKDQEsdWH64GtsCtPEhzfVYObkRqg4tJFvtNRjT7AKHPY1wY7yVB79dQDEfH/Q3c+tMMrenH787YFu16ugtEcFQy8agDf5k1hhCI0UGcdPyz5w6ftMUAjZR4JvJ0LXgUCcdFmNNzRYQ9jkn+T5ey75zFfnS6ffAPAk+rv+AI3M+knp83rQbuAEGX22AvXgP/jkSiP0WDbilrC7sNhPG04dnM12Mz0x+4IXOHUPYsqvSVBx35FdDyThtc1rQDRzKU/STOdX0el8YpEsBwR+wrJeFYjqtoUSz0SwmHofCjtXonjhS0iMPoNlve04eetLrjEfgWVZaZzroQKPUgVwx3pdfPCoCafav6YhheV8+WgfvLrwhK53CpDBxVuov1Ybfm7vhBu2rRSzZip8MW6loXR3FP82Bwa+L8F2I3PuKxpipwdmYOH0F9oeroN14W9Q/mQrmv9AeG2SyD9dIjjSK5V2/K6E8u0KUFp7kezEElhGzIQzm/djXfFCDMsUwUsJHTR07gdMsHvKZRfGgZ9eAJGuPgLPgBknt+Lhy6fRo/g0rxEEGP1HEN4fE+B42xFw6+Z4ir/ax29+O9NasWF8LHWJHWpE0OP9Ux7tdYYi5eTBskUGZlh+gl2L5oI39EPG/Us4OHEemE/shP1zY7mm9hNNCnrB4/tNobb0BWkYJnFzphf1qN/lyxUPKMitmV01U/G07w/ePOEnNyeJQd4eVcgcCoJss1L+MmcVyeUNgLn9bC42WMK/M+aDQ7gWO3yyge0rp4Kp0l70/HYB+xbp8XDSOzK4uZSX+6hwbkoW7Kq+y+Mlx8MJ71LuqX0BtbnGrIzRdP/6PBz1MwqzTeJoTvl+NhFKwrA9RvCmrpLqQ4JYJaCaszL28nXHGJ41v4lNnVZCWHURHmlPYclmdQiaeRaXzD6L2cJ3yXX0Z1r66QFErijit4ucgLdY8PNJnrhZVx4e/L5IyzYqY1ljNVd6mnDYg09s9ugrOuUkQmD7RHzXsAuNzkhA+X2Et4YV7DocCBUfRmCJsSjZjfBBz+kHUXrZNL4rP5urNfRg/7tj2D79BSZWB/PtlUK4eIIa6M6s5843Mzg79zFn503BxNfqMDDjFbx3igfbjscY3S2PLY2OnDx9AtkfuIG7F9jB6qKtUGw2Flb8vctPl55lUv5IbTZL4U79WFrwcCy1i23BZNpAG6rKIU55LAjdzqKZF/2wWsKOtviEQY3aT5pdvI01lNz44+if1PJ7N605xJBR6EFfdfUo9vIV9CtcACueX8JzQwfIUbCCtxb4ULzDHfj8TAS8f/pymJgI7eg0hm2zw+nB3TTM3aFI3neUOGewH7t6c+jL8QkQm1eDpTKDtFAghFanjcSjX15DlWMCDnkI01ardApZWQcWZxBapqaRi9FjmPYznhtrL0DMrlfUoeKJ37Vn8CNnXSrL3EnoIgyyb8NQfZ8C7lw4yCN7RoKTUwgpjDmILz8UgKy4AI1+mIPvdIwhTWM9D6etI6UtT8nl8z/wGhtMS3u0cYTBVG4zlgKVTyNBJMMMtFa9p/dWhuSxMREcX/7jzdGFKBTqi7GKSzj/zGn+2pHJP9fbwA6JPjY84oUrKk/TzckuaNb2DcxaK6HDq4EU3h+FTXarIfGwFAw6BqL/lGTIe7qV9+7Mwy9KTnhR1gd//j0MbmmeaIc6ON6d4X3ZJC43uQV128Tp7fzH0Gzji+ttJ7BrRRE7TdaHiOWl9MhHA8q7TeDDosW0ODGTF46YAzIdiby3IQKbRu+mt5KuEDfrMN/pGwWXpk6gpnm3cbypBOV234fFue0csGcZDM/I4NDXETD+UgU124+HhzWV1H6rhQrPiqCk6QoOmPme9W2uQMyKItIpf0S7vKLY4Y8wfO0/yZEnDmHR62qWfr4cz1ypgzkCV7msTBUbSi7yl8+vcMIfEXDsa0b3/l4u1tBH+7O7eZPOEvgcMYdeKJrihw/bqGlbOuXljYR/Lo/QeEkipGbpkHq+BYbZ7aTRnrE8eXAqSV4yJrFlcShrqgWv578khenjQW+SN4X7POWqpmno1HyMvKaZ4gjMwzsxn2iDwAho0InGnnX3aWO5LWqKuuFtU3OS7HkHS9OUofvnBp54djH08DiolTRCi/eDJLgiG+ysBdFBV5V8tTagVmMQa4pf5UUDncDyQvB8lQ//6pyCOzf6wKhXBjD6cCiHjFoJPpfP47k1k2nq2EgQaxUCra+fsVp9Me/X+4PnHi7A8W8Avh3ZBgEW/nBDWxBnDaggL5SF+0dL2PPJRy6oWIfXTuynm6uT8X74WYxSOEqulTaYmnyWZPMZVBf+gcIvV5BfRWDDhiBek/UVvGSm4OsaI3CU1Mfdo5+ih7A5JGdmQZ3aPMCgQNx1fhQ3egyxzfd8tk7fgcJ9IbxO1BsfmZnAyOpftPrLZNLPKGCDVcfo3/PtcIYjQDhQHwQ+jKQ4TUk29heB8/Mdeab0fHr7u4vkOu6Cgb8vDcRn418vEXQvX4rewVY4TkQQEmWEUf1aGT+4/owNlbypcbsm5y9UoYEWUbDRzOWVbtq0zNYIzvhZ0MHd62C/rgFoTc8Gd6tmUGg7SuL9aVgwxgh3PXuDS39Mhnl3Z9Ggzgse/VeHm+YOQAb8ISHlBi51OE3dc9tw0dJsyLE2BRURf8obl0biUcdQae1nXr58DiSHb6CQg7UYm/uEgnqrOMgOIEsxilVeBrPY9gh4NUGO4jK8sLC+jEM9T8KFx90Abd7wy9IKXpr84F/ro9hzXRaE3XPGzu9PMEo3gmTTdgCte4uxyhJ0/bwhbCl5yCcjBeB9dhdZKC5H45gRHGk9GV8lWIFioDHyzHVc908LbPS+wopsQzxbFAwDIqfgtoM8eg0Us1+/BjcPbILCV4l09aIs3A7dBX5OWlA0vQrHRB0Bd1c1dDcNxFDZUAqsUgTPijc8N18CNlSr8YIv1/ic1T10/nIQ/32M5N+vEiD+uR7dtxdFBSUH6BgtD9ZyT6FMLJzkMlxo/8M1cHDvL7YVEaftU/wgSsWd7p9dAdGh6rB6lSKcKQ2DSV/ecvs+IxRU/0M+j5vx1LciftmygBrsnVmmbQKscDCm3JJMGEz9iTfeVFGA/EYWnQN0piafurmO32k3Qby3NGxOX4zPWmSw4+oz0jPwgi/rTsLvkveobVGLWl76ONpvNl/ZMAE8akbiseY2NpfdASYf1NDm1iMuKDzHDSUB3CKbzJ8PVqJ8+hTwT/aHP49+kGKmAF2Jz4abY5WgeXQq/Bt6xx0JmVh1foj+CajBpNqttMZMh+YdPkHbXiNVJe+HiUZGtIxyeNKfj1R+0AhNj00BqVI9eBf9nSRS9Cnt1GM8tmM2vp6mTLcrjHl3QTAnCstDSaYg/PZJgwML37Od2QwK0iyEhquRcKZGA+0myaNRSTgLl4jC9tZJcMb2Ik+ZYcO2Dl84c4skJkS9APNDs3nRowZqNuglw2WXIX7LKAhc1saOq+O4VcaZxPtz6bfXL9JcEoBaf7uoJnYpNKx8Cfai1vDv3A9aqriYmxcJoJGWAj7TK+Qz7xNBtfo1Reb3wsOzC8DfTgL+C4sFt/wimLN9KY1WKoAXR76Aod9UWvU+HScePomn32dCoOYYaFiwFd8utgWYY8B/L58CXVV5XPhoKVbHLgAbdqWa9v+wU8oafmavhM1TLsAUPQ/cpvMa1roK8K1nztD+cxpoNBRjVGMuenqIwse2/9DhbTMHy1qhV4YinJVrpe4frzDw4nt0ELCBp29X4q+do+Der1gQ8BdGNYEhTC+SZqUt23Bg1SV+1C9F0VqvUWLVUhitMAkMjTZjTe0Nqr9tjFKpV1mvxpzqM/fBwLJlsOpMOHwSO0tTnktBb24mBn+1gsBmMejZ9A6VN47lnb834YvrQahbe4w21clz2lshCK8UhmpwZUd5ZRyYr4/3FTRpRdRukBk1hu+drOIjJWdor6QxiI9dRCJ96qQ8cJLUR2uCUEELTfNRB1mywLC9j6DK/SXmBlgC2WVD/MlaKP79iYtFvPlo9WcM+TfIEgPm5K/9jpN0Yziw1RxW6vtxsLY6kuslDPtvNZ59lwafd82ki7eT2XtmEedmaoDAJRtotLsNKfrT4GbAQUxNngpl8hW0I7iHv4X9Y2NXPQrTXEdTnfVgKOkv2Z09jakphzB2oJHVZk+BtB/mJDsxBBzNv7HI07E8QmoEJIvNQH5UC5fu5YHRyrVw3k6Apw6u5wnKL6m49AR7Xa9C8TxBGHnfhV7f38gx755S18EKzhMP4E+9kyGjaA0dWyQDTU9PkfkSRVgbnAq+R3NojaMOf2/uxPffdcBz+AccOTkNyzcWwn9XzlO1nTqYrFsJvbav8InCATyVJcv7tN/AtitvSe15K0+cGgqXF0+h9q+iIN94ge9Wx0PsPyYrmWASGA4heQtRnD3WAxfXH+OwyQupUVIczBvXwomsw7g5awMbFbnzYZ9qzM1V4dAG4ndPA/D7sp18StcARKK+8Da1ifjEaDRLB+1BEa8yOqiliyrCZaSnFcaakm4054gU3MxtpbiZISx7bitX3PzOVz585r+i5/jZ2NFkd90GPri20OVDcqCgIUqnf9nAQp08TtTbjao6i6g2rhe6FjaATNAlepPUyW4I4Hi7FvpuSHGA4BsQPGdCC9WCOGiqPwxrJeCIrmTINj4HpZFTYCRHg76aITUIPsE7l9Zyh+YC+v2RcNu1pdx/y5+vamjzxgJpiGjfB4LiPmiorINtRxywysUEFoqsBF2VYjp29Bltv/SX930ZCz+VC3GJeTQON5fBvPGrWW/GOtyVmEJSZ65hkG0XNO1vppANsjDD/R8o6nbjcOoSeqaoTE8WA8nP0EXFTbK0++M3mn04DFW6GTpbABoOLCJVVzmy2LcOJRUOg/FHR3YOHoEDEitw0OYqpH3XhNjhv6SZcJiVMueg6NX9NGnTERS0+ASJdadh5fAIGBn1keduN4LlIaPwe8dlXpkxiwc9SjBC8yJ7v73NX66X45IBV1xpbYHdC4yhy+cfTOo6hQ+E1chgojF52ljwjhvdNKz/Hq7f64F8/Wd44KUt/LQKguCgUCqYt4nz5v7guaOE2f6OLkyXn4hCsxfDoUfWkPlIFc61HqaFA3tAJqYerhv4s0psOUd+m0E6Lx+z3Pcj3P1NDST9RODExHRcrePEVm0eOGRpikG4CmMfNIGzmD7d/JnIKv+5Ai5XB6OWd5RsmsDFerUs5F+CF3t6qY8fsKWSH1+rXYw47ROPWysEbo1a7P5VhqeHaVHz2tuooeVHe/S+4teTpyHpgSkqtWTjg48SIKT4h54ETKfkUZ4Y2qiFKvLN4OM1Cxw7G2FaySf6eyoFSoWMIOm5CFpNNOeDKgE0+84vlogwpsYd3+hvwmz03+OOQ/Pu00lrSfi3RIrmV0bhq6Zh9NvuC/kqEuBfro+FtyRgV/xaurvEnKusNSEqAkgx/yP7hj1GhYS/XDIcBWoav2iL5g/8jS3Y0pTEmD0aIicXQqtVHTZ92AaTCrfBpuwkkr+eAnfk10C1czsl7h5H/mnjoT5zB++0cucpNlKYdL4bsr6dxtUTv3DCxY9QrnIc6gonYq/NRHB5aY1yPbNw8NcCMC98iNZft9C2gI0kPeiOCRM+QkdqCkoekoNprv0YssUP/uQtJ/wlTu8f/uE7Zas4JHw2xWS3ISreo8z1urAi3ZoGXRRJ7Egd5/h9AbsNlXxO+DOOWxoOX/We4MJrmTQrUwGkQhbw1eJjpNaQRd3K8yi/0ISVCsoxGzezvMJYcr2zFUZeHgfqnSpQYzqRPKa+wXyBYDp6zAJlss7w5Qf99E3GnYf8voD7tlEwf/JNHjW1EmNXZHHlpJkgeicflqqMh3KTv3BL+jE7TFoJAyvVYcrFcDALL+FnlWK8viOLjR+vwP/melDurTXgm1+N7UFLQei4DlhavMOYBwvw17wu2MJPufViBQ5sD6THdzaBmNpvqrkdBSJsBtkvM+hItDKb3Slm8YIVPOW/CMxSuI9r3/dz0Is0VMME6BZDaFhRyooXsuGn6UgKiJfH82OUIL+vHx6WJKHSPCX2Wx/DV1oQVn7y5s9NKVB5fCoeCopFwYB56C3xiwpObcPYc02URO2omGELK85thjXz9Li//CM3KN+C3jnivMPbgdvNrOGyyCT+LX0S+yeMha+bsniwpZlzW33AtzwFP66biLuEraA/rR8DpdXAyiGPd+6dClIT1HjaoYXgZqwJCtX6ABOt0fz5LvJNXoJHzoZit+YbfFNjAPE7D8DCZ36gUGDJvoaybK8WQ+WSG6h7WBrCRazwd+ASkFgiDIcePKZEsysQ9aAV9nv1YnzaASYJRSzvTSbv1W2g8fA8elwxgQU7mrmlNBU6635whexucvnmB/Jay3jkxOX89aYKpV2ejuvDpMDUpRKCHXpIPNuTo6pPwCY1D1wsU8kLKhfAdZtDNHzqG7Q914bkolb6+M0aH05SQjgpwPnRNvTXQQ2rdxSSs/dC0itOoRONAtAWkY2Bj77B3JtGcP+YHJWNe80RGpt5aFcSeYe54EKLFPJRGwVyP8OxJHotzNS7g34neil1+iwca7MPZveL8PjwIjqWcow8NwuBjehC+PL1Nx4PEKD71Sm4d7QF71i8BI2ebuYe1QaY8vMFmDtNBF2TFzw0UQaap6/kdeMjoNBeiRbUZ8DltkN06Oc0cGrtwPMeMtDdJ8ST1Odw0nJTUjpcyCvW/WM1pbv8d/EF3Gj2DMat78HLHyzA8VUKartWYfR/IpQ8/gYKnh6Hy+EoRLiJwP8RAB+AQCBQAED/MLNlEyLZO5WsSAOhlFGRkTKSrj0VUSIUUqg0lBJSKNpb0R4kRDSUsqJJuXdZ9T4aLYjBxw/HwHKhHApP2ID6G+5T98c+uHH/FfZ+16AX2+fQ4seBsEvzF5TdN4PIv4excrY/WIREguVhGxCZoMdHf3+CkNJzMLqlg5ZZh8CN4/KgX55Bx9ploUtFh/91TEPflF5wD19OR99JcP44RYh+GkEuTQzbgm0oTGEFSDiep3BMhm6rAdC8FsAvBeTJccIkOL/aCAI3CMGZm2dB8oosVmTVwH+5y/nPKj3Kfziek1z1obhVHYMPLuGiGoT+yj7mkCR4MX4aS77dQJndrfzQM5UvTN4Mq/VusPE/RMfvMjBL4zCHz34OyqOWwqHVb3HgbQZP0hsgpRmJ0Hl6Gb4dW4+928bAtnUnoWyOLLj4HcUFzVto6FUMNz4SwQjtEjr+yhelOzQocJcNHI0YS3VPN8AN00tgMhRKsRGjyPxkCb75EEmP7RZQUq4/bQgQhC39Vbj1phUUKBRi5chmyFF7QzcsLsIj1yvsO8UWRD56cYuSKpz8+p5zFzzH44K7aMhgiOx9P2KCUDwtPmZO5drz+dUJJ5Z7JQrPNqlC37JIqK1uocav/fS3JJ3nLWvHTx6afPmmN27Y7U5yJjIQmBICtyTDad1Bfboy7IgNrxzY7FshGUduwbS0YjJ83g0WgyIgqCKJOcXP4MPSctK8hBwza5hNbbO5fHYm3E2+DTVJ++ByqSLc67gOWoI/+a1JG/+aYs1S0RtJ7vlrVlq0E+sMbTA/ayaG7JkAYWfD6IzxIriyPQ9eF53AqaZnUFj3AJTsO8uj5cJIe9kQLw8SgK1vnfhzjBdVTWkHkRoZ0NtCcNgzFnbfl0FNsRTeX3UNZ+bowzNLS+7zeE9+yzzIp12OygeVaN/c3egypRzKisppsWcHrjqvCe7r1rDIHV/K/jkRjYVbwWqcFl1cMparekRxd5wzfd77h1pSdeFycgw8c59CV5NiWH2EB2qHfeJFrqnQM2s6j7tfz0N+NzBCUAROPVyA3neisN8zg/s075N/wFYIqrhJqfvE6No0A+oOl4Tx4arQbWmNJyWb8Vx5L9RlFcDF2jcgNuIYrr60GsasV0B75SNQ0slQXjuJ9laosHidIExRWI8XZ22mebO+4tmVD9By93huqz9CYseNQPOED+ycMZ5mFalSyOcHLJQ4kgpPuJDtaGd4v68ORk38APP2OIBkliZUyp+DA9WtsE5kOmrPzmROtqQ7MQbgKzoPFbfLcs15M0hPvY9NMy24SQdxWcp3DM79j9d9SKfum+q8Id+HZmjHYomOIPTXF+CXYTc2vPYOdidXY9RRVd4hchxaFc7ThFEfSXlMM+4QEgIdhxnocnccrUjz5eB7H7C37Bd72T6GWQZd3DM2mzfV7uQXd6VA5Uoy5s+I5xHOvRRv6ELLo07ywWM/SUTrB5k8u8ZNGxt4YJcIFLyVQEU1b8ze+hmTg6PJbYoJdnQ/ofnXlCgZ//Gj//bBsVodSMoIA4PVkzjwTCa2qJTR/CFtNNifjoPNLzh0/g44VeFIo/cqwud7/XxlzGOM6Z1Bxapv6OygOd5dv4Vd+oRQZN41Wnd0H83+Mwasvk5iuwuL+a5rCqyXZ9arFuYrlb7UInyJCq5GwZ7ZATRRSA1KvJrQJ7SaN414yEWbjrK4/lLM4SjOzxyJufaKMHO6B0i+lYHX9pbc4nGPJFMTsWraS1T2/EThnjZwKq8HWuc3sPQ4KfyyVg+2zpAhD9s7eE3Cnk1NHLDRZxpOzjuEsOMw6WQ+xZT06RAZpwZfz6ygjDk/2L23FnfFN+PKRWOowUeEX66UoQKlOSzRU8JN4bLARZZw75EvW2R0ouqOpdTdJgBfgvVpxFUdLpX7CBcvqeJvR0NwlcjB2ooeejmmHD6brYXws1Jke9eF/m18AvUOR9mmfi6fNVSAm9ZzYUJ4DHof3oxLT7XgCqt+OBz7F2sPb+W+KZU4454GiyyQgPeqgXRf1ZYVm4x5/jw/Chd2R9vR/bTM6jhmjT8McwdEYMyMiaBdlYU97Ub0Pc8Qi44Cedc+5qChR/Br9H6e/WkhbCp0xY5VyuCV7UK/x37Fc9vWYpZXLSeLj+AJ/uLwSFGKwmyD2WlTKK+5KAvlTSkUpfSC619Gccd5UxpR+Bh+SztBfnYraP0lskhqA+HMkSDX3sA6xi+hWrMBLqxJ5smddzn/0DXYt0uIZ4zcya8CgmljnRKcmfgJF0eGU/A1HZSda4PzV+aBfksNS71Ohj+aVbx7ZxZrvB0HUy8wCL2ZxAsr9/MDD2lUaxWlAe/R+G7ybxKZvJiLrbXRj+0hH8rw+TRN7LzxD8NURsA5dX2qkj5MXTiNrKw/0UPHAtAonQgSacfgo3U2xGiuxZtxN+lP3giybQzhpY2NvOpKGpn8EYNb5yZA+tpPrKMoS2GXrSCudjTdaYyi0W9D0Xi/MNlF34bFt7eh9QplMFdWxJRVC7Bl0A7Vfx3HnsYDdNx4NuTEWdCmXTPIIu4C3lwxEWQGzUD97h1wURlH6bifrbIfQc+7n5TxsBoEVg/z7Fk3IW+rLITuuoW6aZLov2gZyijUs2WZGk3Zt5RGL/PAyy+rufyrOScXmMKjJX/pzs67fLN7Dq+efpl5mzNJl2mCy6I7sGNXJSn4V0L8LkHwMcmGFLF93CP3CI2bSkHNT5A7ZwI2mSiAbbgCSuW9BlPFifA9ogfzd6zhZSHf4WbpQYovkSdXjwiKnqOJ4+x82GX+HTSwNYIv8VnQInwfhW/94fv2i/D2tA4ccJsMnstfQ0v9Z14qHgwrX0nCSz9XMD+bCwunj4bre8LY/ogzVDf9gjE9k8Fl1iFaWP6NK5aageX2RpbbWI32MkfI3fEGhakmYsW+THhY2ARSca1wTbyHWwtU4J6QKf0rfUpbDt/n7/bn0DP+K/e87wf/v4L8CP24wNaIdzgYQsm8AiiY+xtkUszghvMDmtWewbltF8D5txPEdFnTZVkHdg2QBa21ZbA3byceSh4BaS43wPG6C+nkPEKx/F64kf8Ffoq28DRpGcg0imD3NFVYfNAQl40yx0V3DDlCeBJmFlej7PxwPqp3jaQTLCF9ZAZXev3DzRXBYLl9Gr/vVACp/v/QrH0ZvfMMhYFrM9C4XwbWqIfRboPJcNDtE1Vq1VBr7CQoaTzM170csGCEOtybqs5Su+QhteE9lW6+AfWC9Yx/tpJwZh6kLJ+ITp+KadrQSrhonAJxahrwWnoQTkzxRuenuvSk+C+kpUnjCYtwOOTnRVVq+8m3/Sl/TNOAxaZnMf3WXhzxzAwcEuJ5Jf3Gzme+JO86jC79Qcw75dlvJcDaiH54vTWXXMo+osSmi7h45DqoydQlN0VZeNGzA81nSYNIjixMsHpGN79ngYvdLHB2OYYetoFopZ5G+ip/KO/zd/KZvodXx9mAwsYCbl0aiamCGzhOfBNHbquj19m6nPjhGe6d8hH7IvshLMUQXtQX8KuIUDJVecolV9U5TcsB7T/u4wMRx3iVswTkJpyDKf8JwmIdRQrOkeUVO3T552hriMwqBqEhxluTVVH81jiQ70ngOZ+swW9DHd2Wm0kXxN6DcdxNVrEUhqePvdnr2GEsuaRH94SWUIaBMsiLZcKw1X/o+/47qnu3YGdKKtQ17sGJwelUkB2Gnk3VKLvWBjyjYvnJHqTrXgM0/UMTXUyXh7y5YZgyLAoLMl7g0J23sCNAHA4nPMCChmkcknEI7E7th9kHfeCqSQRqkRPctbjAQ9sOQoyXETQHHKHpah9RWmQmTr3sD3VzTSl1KB1yV+hTtGIVqicWYIQbwU1bV06p1KJh9YP45Pl1GD05C7aPAhjaGkeHm/1wikAXusjpg+87fbYbzISzXkvR8EUEJUIu/CouwZdzn/G8U+cpvPQy1SqZQ+v9o3S7YT1P7VIgc4tzNDjBmjRulsGrr46ouTIXn4ZdppIvE8CkSZ98dY9Qh9ES0nKyIIfXUnB3TDcIVL7Ez7oHcd/n3aBsZQCBn6/yi8R3+O5aCrpJ7MfIXW+Jis6z7CFBulO4B69HneRFD8fBhEt/MfmEHaa3bKNv7IB30RguX9kB3RE3WOLqEDSddMI2i4kQYSiFUYsjqeVZDH5YfpZ/dUWzTVMYD39dBVZlbXQl7zNlLZWATauu8xuP09AnpA2dL++SrfIPjlMJYJMdP3mb5VcccBVl1SYpOFn7mK2DnuIN0yoevXMS/Chfw5cXhUBEYCnttNzNR5y7QTRZGg7sVaGxFuV8P/0cnvu8lAVsjKCjuIM9tx1jVbs40tJoZbs8Ufj6OR6/lzoyzn8AhjvPYPRpWbhxbSXf3raIc6Q7SfBBLEV12kLKpOeolbQcthp8hsAtZrhk0Wc8t9MH0vRs8XRBOrlVmjA+HwXH45/R7BWFkDLDAQM/SfLONy9hUf9j+qTzhuIt9GHudHV6sQ5AVlyPGj6/xy0vg0Hl/kQumL0azfJtoPenLj5e+R8lDq/Cv6lK4FC4iWKq70KfQg317lpLh6RP4Vbp79DZ9xl+yT/CrE8e5P1LEOwlVdH5gD9e9MnkmYs24Jr77pyaMQJL931hpc1qnG0zSGURqiA+RZTrF/ZgUfFOUoi5QfpPNGmmwil8WjxEQXeyYLB8OqZEqMJ2CTlMPpRL/kWfIKD5GA2LrMGpXtuxbGiYEuashUr57aR22gouXwuBHo/DtCmoDQLWLwGxoDf0bc4SEpWrJ+GEyWxcfAL6bmjA2Khd5Kmqyg5bF6GxfAs8Wj0f2rU3oPHES5A2rh/j5kXyzI/asCp1Nv6dsphWPR8Bt2Ym8sEFcjhqwhP8NS6eLl7poiseL0g23QTULY6wyd6zuC7mIi7sjOM/I2fjK4lmvGV8h0TLm1HZUBMXTgRIW7+Wnx4+wFk35PH6V1kOtftHe5+9wFkbVak0TAWd/k0jmXpRSNptDl7lW9jeuR/u/F4GZlcb0WfSVTjRcB97bBrhisYD1nw4Howa+7hl0J3OrDuGIQt78EF7EgyHjuT8Lwuw70kRJb2o54P7EBzVL9HYLfLYbPUEglZup3nh/8GeMQp0t9eGV8Qac2hFEN/tGAnrZv/FIk1PXCEgw8q/UklY/h2s1xeiJwneKNjYC5brHpHPDSsoLptMMyEZCj4IksxaBBUtV9pL58DkugW+1zxBE71FsUxfGeKak7lEyoUqMyXJ2Lubp99mHPX7Ovs9robVZ6fR3M2neTvKg270Dn65dQtMjluP9+a3QolxNY9RmAd7FwyjwUwtGH3gBU5eYgGB5eX0n8AoDLw+ldSr0tDCwReVtZ9SgUo79Izq5EmLtuPXLh1YPwtJ7VQUWY43xYprQzzqrj3+nWeK8gtSMM6mFKssF0HdchHo9DaHfoe1bBHzFjrVpCjM5AGd3apHPuV7oFlagKav/skzdpvA35KJ+Ox0FilsKYSrq/VowthgThKSAruQUM7e/o8rDN5Aer0efBj6TnFRc9h2ljpbibnzx//aSP3ZLLSslGf5o3dhoqMCK4EROPRuoLKmcBYquMgHfogRX1WgXbW5bOKfye9zluCnyjj+Z6sGM4Y3gJuGAfSbW6K/lS6fXjCHnxtJ0baYFNIc30n05DcudhgHqeVdaN66lCzqv/HnqGzycw8noRO2OPWLFTvsTCebMi2ODdGCPTuV+FbLBjrs+QQmHd3MErE70FhyKltUenPcZEN6mpkOek/GQ0GFJa2ZH87jx6lC4cEWSqi/SGlO3Vxi2oD5+efpw5YYvHpbC+yOi3CxcDG6WiziMQap+O9ALW97/Acj8yVYuGse3gpJgMmdcjDPZx70jX3IFcMHaZuMPnx89wtvbrbC6IuTqV1tAgmI1/PP++bQma5IM4Py6EhoBuw7kEZRD+xZ4q0V9WbGkLaQDyYVfcSQTYbwVPYRZ2wVgVkvajhsUTl5rynEpPdXwF41gG87vYGAHWmgnTsK5q6dix3dZ2C+YzsVfHbC27vMsfT0UlQyGAWNTkMUnz6Zi/tkwXC1J/r6vsC8Oerov6uNT8aWY2vUKYBXC/n0hETYdMqHhrzlwCjoD3o074Gyy984NMqcG+8Bzb+hSkuG1tEj6xQc0d+N1wvHQke9NLarCULg/Od0/nkKKm2R4c4DpuzV4E77bBfR+k+H4XC4POj5bIfSi3XcePc2pLj9g106r9Dt2QLeF2YHtSED2JRwASuvKoPDOCFaNixPj07L04lyXfY8+5VfPGpl/ebbtF1EFPwXLUWDXoD5dwLZ4oIHyC64BXGF/3HSmVJ2LFDBKVM7ye5FAa/IS8C8gZHw2FkQVlYdhKo8C7JFQTivO4ZGu8vxqfMjeJlrNg1Y2aLvRxFYe70UQvd9QcmJD7Fi+VSOk7Cms8+QTk5dik96V/GOHhty26kCg/V7mRMPQqy4Jd+VeEnSt8eQxlcNWHVhIsvIXoN9q0ZT0iUhWJ7dhr5ZE3Dc+TYQ4GZQKOvCEcXa5HfNEQo+RMJSSWfezTLgoquK45+70/Qfs+ifUyCPH5ahk48L4ctIE0pufohJLctpXqI13BkbR+Oq07nvyzw427AGBAzP0ULRWGjb48ArNJvA2sgTJaVV4JHlY5y27SEcVVzLRQccqeg64qHXfxnftGHy5+lwRyUR+6NM4ENXJCW9msuFnqlgVbSei+Yuw++/FvAf4/HgVfQGzWaU0hZXC1i16DznXoqgjTfyUbHxCf0VnQ6RSlqg2agG0hp2VHDvPO1cJgXP5R5j84aDULy2hj9cP8mDX6JQ5m8pbIiKwAVGQ/QscRUlDE6AFW7CpGA/jY6vHuAVdz8BdTlg81Ytukh/UanRDjuWN4P7qNHwaGMqih+RhuVjJ/Pf1/vZZbcOJ7jW4uboJDBNewknTixhux4V8DjaSntGB4PX93O4OmANVnyqxBPZGSAaYserfiyn2Ton6OCG0RCYMgjNu36w/VMH/G+2AV/5ag0aB/7iLSUXmuq+Hi50TOUjHuZgPmcVOnmk4WB5IMi0q6PNRwMc3zuXznkOc6elKAs/8sWHjpbgqOGH58qzSe7VVz6iOAn2zjCnhd8eQ6y+N48IzODdI9dzyD6Ci07WqHKklDxCvejm71r6uTKDly3OxYiFmnhZbAZ3JE+H2jhlWCZ3AqRnxeLhuvO8Lj6bUzUv4q6LjWi/bCV5DahQ/ms9qp2vALd1irH2SD1JKodiWKYjn83dQLU/muk/i4U8ZXEazXquzf8KJcBAYB6M3JVGcxbE43+rj+O7sHf4a/NT9JXP5n3Np/lxVTeGu8mBz9JLHPNEFkf9HIvL8A6eSNvG/aO2QrW8DLuEaOD2kfFo8XYc3FRZA3O/3gOYtQ0FVi2nPre5qOdfws/HfoTu98O8WyuRGuI0IK1yLe5ctoU2zZRCG79fcNk+lJzbTPjwjmiqO34DS6bn8sd3I2H/lD90T/oGzNiRRXLeMWB3QhmCX5/Bll5HrnpzkDqO7APlC0rQFRLEDZMkuCTBDoSixuPAulC8vWIqX9E5wJc0c6F7ZD7N+wAQIfCGrReYYqRrJL7YUM/yGSdo7cRsktB5zkec71GIVQHcW2ENQTOHcGrNFJz79jQM5A9T3QZvxpTROKQZxNLNCRylaMNvwpXhjfIfXv9ZkfZflMaysrsspFbJkif3cq3IYrj53h3k9RTA3VMD9B2v4AIRIuHTXpCp7EYbjiswhcvR8PVuEHEdS7rtIdxSpAxvps6GudmbMcplMwcKBOC6J3MoZvgOW3vMBNPtVlS/Joc7hARhjpAKFi7z4h86vXzJBGBl5jvsT13LVxb9YvMDo6nt4z3+L8UYEgqXcs+lPn54Tw1FlxvRQg9HVnDqojAlWdgbdYNjXP6y4A8bEB8bhilhm3lrnzMHRndCvGoCf/8wh84a/AAzx1Zo80igHw4TYGltDKp/PAG9u75hnHc3ZKWfhPV5ebz/+Rxs2rOfBiVaKGmqKYjXTOOjh87wDTMvUl3nwKZLZ5OnlC/oXTIDmV5llJxxHI/utQYrYWdeNe8KF1WvgJqj1pCZMJc2jtlCqyOuY0GzP0fGyFFUFEDbYj2y2PGTXN+YQFOrFc6NvA3vJkSS9bJYej9yCb5rfQJP+2xA64EPdD4x4qbn3njwaTa/W3oFrCKX4d2691DqoEVi7xyxe50BmEhFcn6pH21bMQnKBx/R8HlLuCQUjbd8x9BauxR0n/8UywJkQT1sBQZ4FpL5YQtKPNyMyqav8YyfE88Uuo6OPybxQ4dMkO7WgCfnt7C4sgHGmglxcbkFO/UL88szISh37iOvle7Gs0fKafdiLdhnv58WzkrCCdr7KCPOHNY7uCIET+NXquFwudKVbRNXssUlASj2OgsN8Z34t2A9n7TPQ5G1VvR4wVZ897qNR91tYoE2Xd6zUAjq186HKb0xqP2fPlaZ+qKIiSwePHIDnlYpwcyc/Vx4MRmbLMbAq+2BfHx/M2tNVaRww0K+0Die5GZZ8KvMcDqftIAiLteQRNxE2ON6k3NahqjS5Tv882Fe8ESDWskDHwTNx46cA/CQXpCXnw68dyA4GGfP8fazuXxrOM/7LMAP30XC4DVV8uv/wuc6NpK1uykoDXZT7bdRKP9pNU/eMUyRTr9wa64CCEYF4vpze1HxYSQ9mCwGXeM90OvnGFQ+zGh95gjE/D4B0YGjoCB3NA58kUZzVx16CPpwbs9Fdp8iSYsy7kDpfCuMqElhp6WDpPcrB1v0xaCdr3BDmDJ4mX0FY29zHOkvRfYLpejLlHx6uOkQlkkEUnXMFDA2/Q6xQhoQnaUDK2W8yP57AiaX5PAWqyb0j46m1P0OWGuQwa2iynRn5TjwH/AC6f0n+UGGE/iYJXBkzm0+cOY1bcraxDaQxAnSs0EoWgckA1O5UVkEdm0xIv8rDtjjdZqXnZmAWyp8MXLjXpBvHUd6wiqgl1lC7fKLuOl+FUtsfEzHO2/C+3dj6Wf9Bkjq8kGoaMOaNA0IfNBOVanF9Ls/HqQv6MAMgwCa5raeoj48p2nVqbhy9Tda/doUHMpusetuGXy+oxYv79rP4WKxEJTdBLG7vCAiI4Df1SnS3F5t+OhxEgP3baTaWif8+3sCFFTfxb3792Lh5J+0ReEIx62wwvhTE2DDKB0oV9TE0bMVuHHAmLQSjlHjTnMefUUClI4dQr+1FRj52AzM/cMoUkCT5DoOYcCps/BgrzJZG76n6VoisL1wK+2cd5l4gxjUL3rIsRHIsTZluMU/B71jJ1LhmUSM+FYNCYZP+PrF8fhARxqO/c3mz6WDLLH7P7aOGYsFeXu5YGMjbz72jOf2CUChcQDefkUw630P5W7aCDHd2+FxUglKnr9DicHX4OPIjahauZaO/p7CthVCcOJ3ElmrqbJj+lmwPSHPAk+rKUNChtQ7/Unet5sLPxrzitlGsD9OCOtmLMH5k/r49pMJ3IUDpH0ohU5pWlJYgS4Y+YfSQW0JWPX4GbuFm5PbQBl8eLmdaIczenm14VtRT1T1qodmB1uo7xYA+/mWJBTVxPfeC3FZ2XHMtv1F25xFoPSkI6j/TId860KoG5IGYzllFv8qgI3BMnzx2UUc663Jv2Sy+cFPeXIL6gMBMVecuVAFcq5284aCHVBwzR2DdiHs23iWFU6txp6q7eBRdgjSV0bBv3ohcP6eDlP0VvKf9aIoVLUOY6MiaWHdTkz6fhbcnFfxoR0SGHpvAkhfKcP0E6WYEpEJw9mX6E7ZJ4zxG82lnxm+FpRyf8UDUp2rBI9HFlPlUVHc/2MzTe9+RLr5lljaJkaZF7/SkXwxzMrVgeTFRrDUVIjmRczEHUILSeD0O+r73M/LPRaz6bqHeK1zERn98YOs8bqg+1wBp46xxU0f1mFEgD/WHl2MN31m83eJtTxDqgp8re5QcjRBUMloypSyxDanO1Tx4iOL5x6lemgl6bGO9ORdN008Kodfd42GG/Pfg1DCYy7SMsM5e3/xvuFC0nZqgqmistCokghaO/fC39fiYP9kKR/JyKZvSyso9e02ks98SOvk8znBO5UmqSSCveYpCq4zgP0vE2H53Avo8PIcPk25y+UPt7FvaiWT6VMMyk5C/6+H8EiqDHjJ+YP91wacaXYT9/U589EgZs9YL4j/uw1sD10nl/UDVKOL8Gf0MZwQrQT2k+xJYrchVXxcjpclZVguSJw/q4dgd8VZ1kvWhZNJB2CwbgLkKiA96hqP8pfcsFYyBTSElHjitj3Ud+EL5R5Uh7kxqWgZOsylHrv4j6wu7ru3gwU2lpJ+Qgl9U7XB9pC/9HW2DgQ3bwSfvBKUX7uIWmPj+di3o9B9zAWylO/jlbxsqoj2o/hwgvJrfjRonEHLTKtBZ1cb5m4fh5PaT/IMjyM4V3MKXm38C7eEZOGqyC+eYXQBWz8fY6eUr2D0q5nzNdUwdpsdxP6zx9G5JTSqSh9cBV7QkTgNgkmxaPsliib+9OQ/hqe45Phm+vT6N79Mk6fzNQbQdsQJt7UpUo1nKz/Ieklfn4+BNtEbIGm6GOYZ3eB1L4xgYK865Anq8NyFP9DrVwYaC0WBy5MwntOggjeC9fn0YAIpHvgFEq6GUNjtRLEjx8PTPIL99VcxefV+zO/zoq7Vnhj4PQ5tw8ogz9QKutbpcWrWZF6Z+owy6pfRnjJt2pQzlmp+jqFgwXioNo3GJhaHRO/dNP/pVQxb/5TOtRxjBYlzMCE9GOwkjeDK2nUY9+0WvqpWgluzbLn16DOOC5oFfe6aNHq5NLYqi/Kd0mFe/HUQ9rX9gLhedSjvKcK0/QGY03wBhvaIMf6airLfreH2oSp+Zv0PxhbOIO/tujCjNwXmrI1k+BCM3oG2HNDqyM91NfD0XxnWXmxHa+P2Q9UKJWjfIsRrlgXwYXkxHheyEhTeOdKMzkG8v+sopG1LRCG3bzh16SiI3hJHqaUaYH5rCE68M2HDDVNhrlA3zSsuAsWMjfRtyRcS8bODDIeptGBxFmhFW4LLdxW6PpBJsqHTcPdfT9ZuLCY7MmLlqaZw2SiPLi36Ccf03mHW5TeQt20T9jhdgk3WInx71Q0+fTuErn+UhoKWKtoif5kyv/Tiki8WfF56NiWU3yXtSbb45IQP5x88Abn6BFUowjc7XEBFaCeAuwYq93rDsHk6HJQKAGPZhZx0oIxn6+lAXPwUulr+iy/Gh9Pj/ny2XNIK8yMDQLF0NazNl0CDYml+K2EC63Yeo8nbN3GxcDD5Vz9lMWcVyOo7yv5Oi/F4XwakrZcC/Xx1CBv4C8de7uS3YWI0IzcWj821hk7pxUA969GweDW8so4CWCEFk2ang9YXP3ptugoV4i/z8oXxHHfLgfvU1GH5s0skoi0Kqu1qELl3CU1of8eF6+fyn6AjUJa5BNSljEA/9im9C5Dnu/2pqJs+Hg6p5GNWuwxOCTCi1au/Q0FmDdmuf8dHo7vp35lbMOPdP55z1QqqRi4Gi8FREDk/nLJn36e+1U54P2ksbNsVQB5TnVhS2RPWuIrCjjej4UvoRlgVks8lIW5cevsvKP3r4k98mXylLEFH2Zm3P9OGtTeek0FDEW0OeM5Lfdpx2enLvP1AP7y9fh3cvo9H1X3+nNxlBdq9D9DCUwlObc3jtORoivFoQRe9c9QoswVW+tjBk9x35N2hAr+6m/iKeBkNhYwGXJkI3/6F0oNLKjTnryAONQzQDsPHkLpNAzpKXfCGpRhMzn+FKU+aUUrOFrTcEuj0ycN88b03bMtHLKw1B9P2Kj5x/AHvtYunBXUzOWtEJU4Tm4SjOoTpipgvSq28R4dMR4BP8GpeUtOE9R918NjUQmh6KwHvRP3oRLAdnhCNoHLnw7Rlmh6Y2aVTxhNEofA4HGWlyMWaGVziK45l15ah328Ffns+iIVi9SB0oh7vNZ1CZ67fZOFzoXBh1DQoe+5Mv/sNSXfzeVJOSseeJXJgIzLIrS07cPp1DXI/dgZ6I++hqOFl9Oz9DLaCuujgaINt06VBXrCIz7pkY/2EW9CaXQ6tGtWkkjiH5x+zxUzZDlSrqqCnm9Tg/d6VFBT9hh9emgjrzu/HGqWp7H4rnv6ZjgC11zo4cHMmLt+oAnr5T3jfjzh48voBrJEeD3/SknlUQxOadNTBYcM2FA1y4dJj0jA8cxDPaidQnsITDiseJFnDW8TS6SR+pJZOv1HBopQ/rJwnBddf7yWlETepa95jcJa4yIF7KvDpzzj0dqjBE2Ez+EBiFq2VM4AtHiL4s+MCBcpFU52vJVaN3AYn961AF58XYPBfNLZXxcMlI2WYov0Q5e9H8nqvGGh/5U1yU2Zy6UZlvOpbQ3tezOKWZkHOP24LL/e6wcRecQizewFaC59g9yoplM1TpbZuP2yWl4fh9Tb0X6oNeB+2QemJ73iH0ET+MamaOvQ/scJ1hOZpEjCyZT0PTVnIEhtEobXiOL87OwdHDdaB60pZurpwK+y6uxOtqwTJpPsQbJsuRAtuTgK393nkWzofSbeeFXe34nGpbLC+VYoVdoHoSsakdXY1vvkgCNQai65OmdjgeoYnzezktoNp4NGhQi+nNoJf+hM8NfsNVs1kOHrLhOVDGFL0H9DDnXNJSH8k7QuV5eA9gUwFTpzwcAuPs9IH++0C9EXDj0tU/iOflWrwauEoqkmfSqf+ttHfrm8IJ5LxWYMmRIefBiWlE+g6ZInTxc/TWDkHunZfjc51nIXrnz3JyqkW/plYw6xxqzh72IFyJvmjYsd+fNEcir5nE2j2oBg4Cziy+70cHnbThQtmXaji8Z4Fn16Fuy6HaMYbF/DydyaeOZrmmuTwEc9tKK+rD2OeqaFa7jWa0HocXpXYcaCwBFasms1/0g9w/LJinDHPFzX6ANwffcbro9KgZXUVvr13Ek4YTwBxQTWUsfhCIaEH4bZIKb9abgvPwoXIbulTyvXbyZnrVmBo83ZY73IUy9Xmgf+8fizeGoWFvyXAoqKITxRZcGGHLb7F2Zh7OZ1u6hizkrIiDnmuw7zX5ZQ2IAX2+z9xS78mvb2bwF+LD/O7Og/s839BPi5avGOTJi1KW003ZigARzSCzi1r6NhvikeW3aacd1PJ4pA73J9RSWVn9qBLyhpUlreEvWrGNGHhCLhzLI4F3K/Ry1BL/PG7jCoPjiRU9qBfw/PoULc9WFwOJ8P6DQQZATjxdjB9dJuI/ukpHNS1lNcZbuLxqavIXEQHgps02E9DEzYGF1Fxxi1YnbiaTMaNI09pM171JgUIFtA4UR0IHwReay8B5j8P0uG3z8nqzTa+GTaEsKIRwsQ7+Uf2dq6cYgRlA9m0fOQjajd4Q72aa/iRwFQ4OHOA1s7bRK8CHMGjMBFySmRguftBtimeyXdgJIv0jMAKlXysnL4H3fr/Qq7kJ56rqMrhOuNh4v1D8OBCP+XFClHQ9U+cFBlN132usnmyA4mIycEBvyMk568NFxPz6LjgUoypEuGYSC82z2mh39ltELInCUbfioTrLy1w+Is0CFrcBof0Rs608YKceBOKvjyfL84dAlfhK/DNQ40WfFvE08TMIXtvLvASBtUlQeip+IGz/v1hj8Dj/NhUnLp6zNm69BRuylEHm6oJfFh7HHoe7QKLhaYwZ2kUGAlsof5b0iRgWcDlWo8g18wMxkVMRW+JSrr3XYniRr3AIw2WXKv1EKwynOHDson439OFqH5+EiyRNIOiKYlk+mQebD3rTjPndeHyuIcg4J9FM18sYKHqUkq+qQRXrxTTnEp7lBPUw46wcrJ27gTLZ65wrOY8zRt1AKZ898AN1ZOg63cbPtvSAmM2VdLK9QVUdPcSotsTcn+0jutTR2BdmyGNKTQBg4LZnHptN8/NLWFD/VZ2H5PKn6a9Q0xxZD+dGh55eRSoZDD8zJSid4WlFBhXAa6698mnIIkXB2WB7kNdEBH5hz0aXjA0Vh0SN/fjqW+iHJ/3Hx1SHUVFqqtxz9A6Lr6iTCMm7+FFLhehdboi3E3uodbuVl7h0sRax4Xg/Ko1lGc6GfvjvfGGmBsXt24ikWgzMK3/hu/fXqKZRqH4VuUTSu9KJxsjJz6fZMl7feZTh+5qCKgwhxzhaTwv2Q/8/O9h+7cArmuYD0/XOnLTNVMs+qrPZm+8YIe9MtT0C/Mf91DWG9oDDuGO4KftBMJOBmQzNo5/CK/idTE2lLfDAPYUZuIbvW4UnmxDIyIc0eME0p0DE8nm9CVMuTONjpsBrOrVhrcyoXDa9xPH6Dixc/gl7Jaw4vk9b+FR0QGwbWxgRRFXjn6lDBXZ9iiXlMkrFq6Cb5+EUdfIGeyypHhRynGOd6wkFUFhunhTFNoSi/j2D31emnYXBLZd5pZ7S+BrRhmdzvxGLRnlfM3KhUNfjwThLBtsMJ2AAk9C6czKfdAwpxSTbXbD1MAj7GlxhHZ7/yWp9RIw4kce2D7PoJ77OTBaxZo0IgfgUGA1HDOpYvWYaAjJt6TN1eKQMXsUiXsX4/O3JTj1VzuXWgWx+ns70nyqStqXnfHHqEX8sE4J9rd8grffjnLxLF/OLxOgf32VdF8+DMQCxNCu4QI+vzKCnwvqw3DUc86jUaB+3x2EI6xIMECL77spc6yGLz8b9YA32l2kZf/ZwtfTE0E+YDPo5sVBZzuQc3oqjS3KZHHMJO1Py7GnZg0JSUrBWStnakn15yU0EZX2H6eDycNkMOMBc9UEMtZ0o43/yshiszykr6wi3YVn4UBNJWxR1KYW+ddQV5BGK88qw5MfLnwSpXlNhAM4Ws6CVyvuQ9apCA5Q+kKT3Wxh7aP9aHF3FuqWjcO5ddnwe5wERGl84M42SZhRdYGTz+aheGo27wgqhvnXxDlc8yY27ROk2kNKYLHtHa09Z8pjo3ZAmpcPrBJUZJv5S9nqUw7t0/TnOktVXnjACCK/pZFZvA2JLW2nXwETqOP1dAgNXcbT09JwZW8eT5ndSdVdmhC1pQNiT10Bk9ZgvvwtmzWuT8Pz2zZSUGk5u3pa4ZhgQl4iCC2hnXjSI4xiR8uzd8EsEEn3R9PLH3HxvKkse0eUziTu4fUaJjB94z4uXzoIE8994plRqqA3ZhLWLBLip0HdkLinHTSKjNi7BuF0jjs19nax2BIvWh40DI0JK3Gfeyq0dc2iHg1p+qYlgctd9OBgsRpt/k+ETX6epJ1eEzmoPAgcih7Q3N3JFIzubBFuhN8HdEEg1I7tF/pRyikpCJKtIu9LtXR2ziNuGHWZ6nYM0OAfopEOY+Cjhjp8nzQCLxjuwGjBq3B5yQKIHBIDi8CbdK/Elw5E1HD6e1nwrATWdxWhJD0Z/PC7GRPC16JgyAo4bT+L209bo9GMRrj9TQbqm93xd9wLasrypdzDgviq8AM8DVYBgRJxLhkq4xt15SgerQ47f/pwkE40a00vYQFwZNOvR7herwcvr9lAE0ov4OmlaZTz3gEkL47Gpde3UX+GLI+zv0O37UWhzLMBf2o7c13Udapr/8EiHnqwb4UsquX/JJONV6j9zH5sIEXyy6mDVxelIHm7AQkaJ8CvJIK+zm7u+2rOJ9K2AlTkUs2YD6TYtBLeTpxO73u0WTIniD5MU4fOcZI4UPoP0/aacMjic6g/aScP2Znhu2FbinrdyRvXXaVBKRGI170LI72EseFaI0WrHIeilTp4MjkW1hz7hEoJJ+HVMRs4eEUMzskj9R/egIMSRXCu7xUOetpD0SZFfnM6ntf/EaLEL2Xsc9keDIqQuibeoE2T1aD1ZjBnhD7GIIU77Cvhi/dGmGNkfC0LJ0mB7dfNrPpoIS/SckD3g+PY1eA0HAsyQTeVRq6b9o1/t13jOjN9mFMbysm2+Si+4j5puPRib7MJ/IJL4PvQDD+2GmOikSxM264AJcGxNOVlAohnhFFIozDuXbSSnJ3fwJPlJTBCdAvd22WHE6QUgIwXkXduJr4sbIaqL+aYc+EtzhfcSrULk+CYoCNt1tmJQQ/lYEpKFry78we2fSkiQdfX0FCigue1VLFlzT963NaOX2Xew9taWzAckQ7eEwNI+oAiyrRkUU3hHnQdnQDmkrIgW2eIqqen4WgvGzDuIwpJuwO99WugZfl+ujLyPugdieSNE+WwOvwmxjnZwN4sMRANnwLrYCbIDD9jq4evUXzjdvp3ZydM3beaeyWc0e9PInbbWcNaek2PK8cQuzaBfmEGB1pGQ+CK3Zw5uwpVL+wADnuC+dNHQ0VBLoR8zAbxmN3sKNvPiqOCICBbH27I/wQxo81UYXIV3riYwIsL/Xi6Xh63nNyD1ydW0EvVPL4zrRd9Zw5QU/deOCC8kF8dEIDAg4fw5aYM/qa8DVPvBdCSPQo0+V8RNKip0PLdw3A/Mo7xmRzsXl+N+8TsgKNkUXagmB8nmvH5Wfvos7At6bo48KV0F3wqKQ7VJ0p506txZDlvPxWqrAGJV0g1nwpZ/udOPKTsj1rGbpSibwExm/LgQagfD+vvRZcha1S81EUFf07DcpNXuFCiAmZMs4dDqybB0bHbOd63mF2sdkOQaCd+LCthifajEBeHJHCuhUfu7uVX/ywhTWoIfWQbQEr5G5f/J4/x/xVivc0AFJtHY8YGdW6sjQQft/HQlTifP79cwYtsC0n32ykyWKWD17bbwuI3VrC7qB1CDTzgnoM1DIlWg9KN1RAydgTcbZ3HatcCQXLyYZLevoxU9b/Dkio3fnFNDIR+vSXzmUdYLS6GuqfegrTz62lNWBFv3/8T/fXvwbo3j6F6jinM+LqYQwyXUZFgHCTsbMAbxf/Bl3O1UBjZCEcVxlGh4W8OPy0GO7tieUX6f4Tv7THniTUXf5TH/cZ+2G6ym76dnAV6kX9gxRItML9zlmcp5XJKWRJteFVC5gVDUKC/lSJlK2D9vDyo61WhoYnSUJ9mgR6tviiTOwjBd01xld5Bkl48xOcXt1DW3X+YfyIYDoUIQ5Dqcqhz+ozT/Y2oSz0Nqocv4Y8ni8DaaSPLTvuO/+38wN96ZKHVZCrsFS3h1tqxVHjvCUcXHEdBudm48VomDDT18UHTo7AjQhE6LfXZOnQhN18UBt13STxLIJVuB1nC5x036GBQNH47NQ5ir4+HZeOiQObedD6NauifWsOn8r/R6/fn0bAqBepDKyk/R4XuLpkEzUpPudX5Av56l8MybRbcvl8WJ3l10cz0Epowuxv2fi2g1DYzOFl4B9L9l/Abi9V40zWQ3JQQ+M1fepImRrMrL6GcqClrJwiAq3YjzTtzCI7uEaPRFq/BNvgLqGAeOU7JpZPLVkNfthaf8dQFTbE6yFVZycfXZ8D3F4k07fB1uCVXgDN1tcjDvRF9NiVC4jYbSLLT5Ulh3+mv6j9Sv+4NzfqidO2gLTY/2wsq0dtB9pAL9S40h6UrIihq6SBN39NEA9eL+dfAD1J7eokWnIzCk1XL+FfML8waORo+X23BQHcJGnl4Dj2yKeCoDVU03+ogfPHN5N8vPTl96y14usUMhqdYUNrJ9VwR0s+Xb37FU8mzsEc5CzP+NlCOqhuuEs3FxCgrMItqwqUPBUm9poofH6iAFUNr+FDlBOg9fomXH1OiKP0alowcByavNnCh9yeaHNNE8lJjQePPcdSebAvxd8LoU7orZe+wh5NuViAU9wMaZ6nSQ9UO0rEOAjdzY6j4sIJkGqfgVXFxanJqh7fXLaHoqB5afktD/apVNKLvA2tl18PivcdpvPJVVNd9jlvlPDlNQwL0HuXhFy1RHOVWTVbE9GJdMezV7eHaUGm+uyqJBv7dBpN6KThfXIm3tl+gwEvlcEvPGBquWeFTL084fe4BzzxxiXa1SmH8Kg3YMe4FRPfXQselPqg5bY/KHv943e0SFrAfQ6YHP2O65G4qXSYDZpUWKC/xnR7HNFCtTxAM1qaST8QSzK92hR96ydCplQcxd2wg4L84yLscB2bT1lK933f4UNlCnwdecYjdT5q3kOFKgxOfC1OFK8Mp2GyJ5CI+Ag/JTaGPcQdpjb84TD7thgvhLHRnzISGPRZg5quL8Zn7cdmv6Tz1vAo/vycChVKi9KbuLsbWi8LqzUOUOd4QNJwG+GH/OOY/Y+n8Sj1c8dyYKlpnUvlsWQjevoIKxt/CmAg90DpWg+tsXoOdzim6eEKJz4kM4bj1RGkWC1AyVwOvSbyCjTcVQLe6AQV03+LUmjLq/buGkj9oUvnAcZA1WED8ewUUppXgtcWWMHdOLy3QfY7xhZ7kVfkRojclgG7/F3oTfZNquQGuLhelcU2SsER7AaamZJH703sYJbsWl4lYs16VN29I6GFbJ0NMgl7u80P4vGAsxxnaUEeUOX0dN55VTsTCfy9jWWqJOqpkV8L5FdtAdtsEsFRdQD3pG5iet+PG5DZ6aDFAuz6asmXxHLiQkMgndZR5ddMk2JYsiGd0ByBMzxQa7rzn60WOMOJoN/2q28DuumdZ/nYrjEsdB04FXuh5rZ7PG62j56e14FhyGDXJOEKFwQw2nG7BEWvCaGWfA7jkvMH5KyfhgS3VNLl6MlzRAbaPtaSdX2Xho5EhXhC7R7MHdeDPf+2kfbiLLEOsaFtKJLz6kglRunth4Tc1vGl7kuvnSEL1Kyv499OATKJTyXAfg6TGSs7QPAI6gnbgOsaFZMPXg5vCAex6ORK6Em/RjPE5eGvrWF4XrQETBlXwq6IPbnkdQuVytVzb4Uly6xxgsyVQ55FdeNfpDWmvfAJ6y//Swuh4vmi2nDZJGFN6iA2PiNaHb4vLsOR5PPvVedLyBiEcbTmdLqyRot3xM9nTNBaEj5tzQNZoCJ06i9fXTIV3uVdJaqCZhd2JK3+Z4c9vLhA5ygD+JmqCT64meG33xa3Vu8lw6Dx2xPuy5dvx+PHDDJ7n/BaPPLbiaKnfGChlBR87vtL6rUlkc1MSJnQoo32rG7uWPcdCyUJ45KYIZwZX0PSrE0D47kw4+GMO1aRX4MCnJB6ZeIZm2njhqY/RuPjwMc65m0bHVeXh4dFfWPLSlryFX4GpZhFN+fwDg3Z4wYcHkix62Zn2aWjTbFshkBav4jd73+IVYRs+erMKBZZ8watRk9h00QYOHetDdsL2uHS2Aey61gBdr57z5p/OXJHjguXlC7kjMBUu3pHn7fiO2w6PgITpIvBRqgDFi97CvAcHYOW/hfRU/C2XbCU2NFxN4pvP01nBBRxUKwyxY4rI6dEZXKC7FT1q5DEm+ix0LPXAzbWb4L6HNU+zuYWioTqw5s0SnuN/CX6XJZDf2waqEt/E/u3f0fTPRZqor0mkvJY23TSDoc4ACNZZyFVBG9jY0A/u7FgD2zwbSL3nCO8fZU/FkadIr34SXNmyFT80raEtrx7hX7VHNEr1D5bYncHguhSQaP7BG+cUs5ORGmS3DsPcQT1WifhG56e6YnB8CArZvCWBj6tgvaIfqyVYoJ38JHgWcRnWBNtyseEfbGleAsun9hEIrMOk7jxydZtDo5LFUGMKw+q766iL5PilTRVmCE4lx5QVXGq3Ae5NUUDJmq18qVobRs6ShXANb37qcYxvXI3CUN8KxPNW3DxXFba33aC1nSq8P+E6BaQwyPUJ86SL17lt02EMXqLG1otc0MBrPy/Tu0VSu+fD283Tua5LDRwNxfBZSQf82LIZLRVM6erNd6SVPRs6sjJJ//kMOnrZGSXsDUDY7i/4fhrEuWtO0aavd7B35DMeV2OKR5z2o8JjxBMXFuPlVRJgZDiTEhv1cNbyX7z3dQC0zV2BL8dHwObUSXymVBnFetzBx8ge/oyRon/CE3njnZOwW+k7xtxdCyOPvMc8g9H0+qQpqNiH8HlnZTDcUgC3NMu4LH8Sy6SJYFirHkl0PUORnDe0UU2Wr4ZuhE5xERBVXEcOi+ewWX4gzK46S2bjczEgZQLl1v3m3f+Z8U2nfFwgqQn3uIV3mT4DnmuD/xN3H4pAKGoAgP9B9hbKzB7ZIjJKIVFSKiJpHZWVEk2RaEpSSIMoqQgNtJVSsiqFllS0lAoZpbqPcZ/ku5PzC2ZvLYWctUzqyRFkeH8Tvl/gwTH/TOBWjyKMOt/IM++8oesZnXgtWYZ7x4TC7oGLkHRnBVjPySTHhXIw7k0GjirfAGKyCXDPZAlYVfiTUrshfms6h2N8huH3SwEMtDaBNisE1RN9IJP4mLyfjaZty1M5b+Fj6i6ej1G3halhuISfRZqD4fMRGBc5mi7Megz9N71QJTqffKI+osOIGeidcBb8/s1m2xgZ0BI2orujvvF8wUo82fwCF32Zzq+zRfB1ZSR4H76DlQ53YcxhJ5BTTcJ/Xb/xgm8kJ/mZ0ejdfbywIZNtVHejj04dHHKpgQMXLUHf9ibJNCxgFRFRnNBzgFs7RrKvcA1n9BpgqognH10xCKvbZcDnUTUkTNLkyVahaB6bS2lO2nzk2npeX+/MYx9dpjrPGJRRZqj9spbjpu5DK5tAEAsJ4jurLuFl7708deNJXJlTRXv6o/GMow7IX8rBO2WfqbtgMwhZjKGiCcbYm2aGXmuSQeFOPe46q05fmp1g0219CHpwkhKXH+PhmiO8QDyAoOUF1Td70WmlibS1+gmemDgKzNe/gi+hO/HVhVVY7acBYaYFdOTjcliiE0kbd+fAK7smil+pDeZ+jfh91HtMvT0Mt7YV8BOypr8T8lHWNpd2Hsnm1/8V0Jl6Q7C120+3UwuhS6Kc3W7sZZHLAnjb3Z32VK6HbpcxnJcQCf/CpUBi2nTMluzEa13h4Ckrzhp7hRge3Qfxnvtcu+sBuffG0QhjeRjzyQNvtX7nmBfBlCE6jFEj/OHojxH8Jvc0Sf1VgkRBSfjmPBpUrT5gQ+E1LNxyjRri4yHKex4MGbbBw+JNvDilCTMXrYTbHsagWKfGn6+OxkcPNSiIbnLW6+W8889bOPijlrJWDeIb1qZdP8XAPlkQt+1Yx6KeF+lq/nOMbxyGtI7HZPIzA7Z+DCWnEXoYQmOh+vIzXPoghc/pl7B+vQ6rRvjwn8uGmKj/Cs+HjwTpEgk8dg/h04c14NYSRL/cKmHy+yA2FXvKt+Zepco5Ytw5G3DaWzGYUKIGklt3QcjSP/ztpSWOOLsUV92qQZPgcJIvPA5Ll97H7wmnQPLjeAjoPoYyqs28xzIUrxi1c2PXXFI1NsfVZ4Xptc4sMu6cDibjCb7slSfBlntkmV8PjtbBNPHeXKrTLcSgr55Yw8Z8JN8Rg14ThBmdZSenGzj6Zj/PPt2NTXCU0y0EedPWNSQxMwVX6BwhIUcbKF2ky/VLzHhymRjWRXbyWm0tqpCeiw/MD4GFZw7k1wvBjA2KECCgQW8j/NnYXApajYXh9qAF/YoYwYv8B9lnSjV3JL+iHx/VoRCcqcZ2AIVWxrHdDxs6fESFBifPh/zkHtpf95OuPr/Jzy3tQGuKOdbzDDT69IA1t/RDoHo/fz+ewP7ZobRN6gGmjlnMyxsEQcbRFht/rwW5qUtootQzaM+Xg2uJQzjK1AKyzjuQm3IEXfysA+97jejjPl0YfpAIr/0fU7a1HFfCOnapFUFDCVMOksnmnqlysNtNluYtr6f49f6859Y1GFh/ggvmfuDir+95319jflLzhn91G8Nx5yA6t1uTk0sPs+64AFrfG8Drvezh3SNAX6s80pLOxtn5o0Bx0W8aN/IUHP86yALOa3jLcB0q/DWBucUT0HZqGWitzadiSSUoHfaBH6PVKP2bAQ3cukrmM+7Bz7+5MMV1It9tEAKpqW60QFMLCuSvsMJqxNtdqzn3fi8KnpxG+XtH4DTvDhK13Q1lIiso67UBnKmYwnFtyyDq3Cre0lYJg97GuOJFFDt1x8CI4YuQMU8YuE4XlIKTMU0snoa/SNL2jlH41CMK94w9woKPtDl81TrWEfmCVzbIg3uvEgyca4XiIydAYpsMu9ofJsrq4pMnPPGaQCyU5DhCx4ux0OC+A3ufdUNreQlFLdlEFYrSfF8tCS8kCtKN7EVgWvICnicyHFmbgMLXt1BSsjWUTgsFHfaAgNzH9OD5WuifFcQLf37Bm3WiEC1sxwtfnuZQ/b0gOfEEe6Z3kfzILRyWmIOja0dAzJxuCjAfD2mzWvn3i7EwtWwUvdumALF64uiUVgoiWSk44cZpPpsyj71ZFaJOF+HOjVOovyIOMg2K+UGcL+T5V7HZnPnYwPfps3cznX8sDsFja+ntpzJeI6ELU+EKSPkqw7zb9fSjToZ1F9dQ3WYTUovRhL0by1jlXhPNMO2FEx0RbCqSjzLp/bj4pDBWHjNA8zt/efipBXQXToEqq8k8868bfzikSV6n3Uj1pTC63UujosptfP+ZGw+d14Yf5U4kqv0ZUutE6O+ffNayWQmLHtRjx8YQOBnvRH/nHAexPWIwL+4t73kpRPVn4lhi4BIMSGvAKLdEElkSQFcP+lJG3BV0LB8DsydaUsZaIw40FuBu506ulbjOqf7Lmctv8J/ZrlSlb4gX9LRg6351WrJ2A8nfkeXcUfEMg1dR6PdGNGwIhw+9b1gh9AZFfzSABTJxdL5xFkS4jcB9sS4ce+oUfY5Q5PjiIbwoa8iCW6/QK3YCG729oF0+j5d5i/MfwTEcd2MWd5v/4KMNZ1DPqJIs66ZCWowBrFy0mOJDrej4mU4McN+KVrWLMXqTKzwdVQIhaM81uf8wT8oIFh3zhNE6/ljVIkeLXmhg5Z56SlmsgEmjEyl95DXevvkKGMrqw5Gzp6Bo8U3W2BaAB5ccwN6JmrxDy5YvSy1EjYmXSGp0Ex58Kw6vxd2ha/9oLOvMh0xpX7avKEGRgPXoorqCxBKUOXjyW/bOsYW5y15B5593nLMuBeOSvNlw6WZ+mWBBAvr1NHjMDg7fWwZb/tjBH1Fz3lYqxX/jcrB48w42M9GGDbcrOC4zEh2jp+JCkSPQ36MMS6R3gppJFcX+/M5PvkeTqEE5Tl7ij+Xfz+Dx4zr0sHUA/v4nBtvSH2KYqRaKXTkIA1EpkFluiVrrL7BUehHEyWvDxZsHMDVPADyH7clNwh9ybcdTTPcenjjzHEU+boZNM26T999C6mIn8HymDs+LgyhD2IKyLUI5Vd6DZIsWkHLCVuw220lZDRfgXdMC2JKsDoqrX0C5hA9WPXXFVN8FbJ56iTbZjsd3qg+w8rIuGcB2vm0gCLIRtfT6tjBlviuHP6deYsu7OC7x68ZT3fvIXiCAKvWbcEeOGDy5KIHFfBgTYt9h2wV3Vgu4TCmftWCzcCkfWOuGDUPz0E1rJGR5PYacOUtIs9MG9R0jofvEI3679ArnRi2kr/4FaHL8IX2ZpACC1y9Bv3oAxpQc44mnz+DOrL/YHDSDFcbnU81zc9a23gFDcYYwdt0TyN3oQU3lThBSnc4OT2JY4F4IzWl2wDtlgxhw8SG+TtCFvFmRlIF3+az5L+7AYyyq+hoWn2aY1xNNekPK7FJdSM6fx8DJ7tv0seoUGfgtxM3OOfBKuZZv3PDh1tI8qHfSo+gJHexv4gRJkVY0ct0AvSp7wNvFzfmM7VV4oCXDj6fZ8L7wuTT1z1r+r8oObL8xrR/1nAZLethjZS6uHXYj99Hy6Nt2gwSO7oDdZ5yoYZIiVG8uII0VAvgi+QZdi9iBbU0h+Op1HVR5bMF73uFg/34kRawwhJMaNuTcMwnlREWo474KRWjngtFkX1qpHYN/1O+jkZEJf2l2hIg17eSXfopbU05yT8VR8nnay0vO2PCvhnE48ac6Ng6JwLw/CnC3Kp36o134Z548DSSfAt3YlRQbe4Ej39XR6a125HUqCauszGG31zZ8eGQhl9kP0sK6Kj4oqkK2yWKUVDQH5pvbY+CYY2TdYAdllhexIngJiItNhnMPivhP5BG4pDSLXNr3gariBxxpmogwn8BIJxznhffDlxJZehQpSrOtV/H9lDmcnuaOqzcL452fU7kszwJyNr+iHTFLafZAPr68bgZhM3u44OVcTrhUih9LIjhhvSjuizECb588jtxuRLsaWvAO6eEpjTAM0CwmzcUSlPwwEzf4xrN+jRNEeEtg4Sdz3ityhBt3pvE2CWV+sqwJvh25AIVf2sFrWx+eeWkNkuaM0oElYCj+hZfvruInkn68/u1DPlr2gRfcf8BqghbUt1kJXj7+SVWGbeD7qxK8bvygO/SG5q1fiStkM3H+T1FUGpdEbrIyUGLykc8EraPIRXE89sNJsP01iPOlV7KZSCKuvTWZY/Wlqf+rHkjvyIe3Puuxu3sy+2ycC4tcXOGjvT2ofr5JJWeng639FT4RoQ4HRSfxl6m3IDNxDKZtdseXR9V47p0+MjN0gJNnc0DrmhwU/LWE4j4p0pD2w56NPmB1/ADuuiQGVfff0DP1jazgIMHtH1vogJ0eGBXm8MvU0zw3Rh+3FQpQfhryV5OpLBHyE2vM/wPnplLcKGQFFzLcqd/Nn9bKd7NHhSvMfP8QGpfUY1vESVx6246LOy+BmJ8QyHW9g9WS8VCcYc3Sit94d+la7rzWSnjiPJ9b6MwtLUKg1WAGOc/dIIV9cEWcP/j6zoboGmvu+9ZFk3XbuEf6DhwzHAaXeiPwjdkA8S41tKJWlc9/3ABn4q3w+8z70Kt6F6J8NNgoOgYW/5SCAyHnqXrEE9qdpYHV+3KhVLMKXr7NIid9xiUXSjBHRxSkFznAsS/laLLhMfq81MOmimNIqaIwb0kpOw6KkKXIYWxM+w+SFY3hy9AfUN1xE/emnOaI5VJ47ls3q0+VwwcRl/iWUBJHv7mOpfEG4GQ5n08svgXrlj6Bff/pUsjUB2zyrA9Gb/1EVwOt2fvXBrw/0QlKxh7k6eWrcFLuVmgPjMFR86o5ReQdfV5+HL5l7cSVfwKhaUAbXo7PhlLfBaCb/IM97abAtI4WbFhWBJb5ZpwonUOmjW5w8LY8rDD7wg6C9Xw9NA3+tVvTiOxBSI+ejjcPv+BP1UmY7GWKNQfGwqfJR1hSdDTY1f0C7efSDKFLYJ/GJ7DcPJ3TdpeA96ZEnGcmDf8FxuLhPSmkMXE/bnnrhE6oSOtNddHZL4TmSclwXtVJFO4QgJUZ5bB38loofuoKOp3v2UQ9gKImpfJGuR0oUSZHO90kaMFEAzj9+C3W92bw+WhfHpKsg5QfQ7BkoTve9jnOCt8nsK3aUdgqZA9rvVeQxCEnVmvRxf2yeaxcpkPBGy7Rkx7iK7XOdO2eFjk8FYDvf2pQbAuD9ZV6GN3mh4/ttsKh9Ym03d+K54Z8pV0F2fypSBNGKu3gq4OFDLdsQdl3PcvJTwfv+nl0QboPNL8po9kiTZRZLQsWru9IALbRrmf1EFFVy663L2P9aFdosnKCE5EB/Gf+UxqfpQkNoXV8o2Q/5g+40FKcxLfVY6Ek8DAkz26GIVVnSvI9BB3vJCCl4gIcan0AK1z1YGvLXsqZGUCrnAAuBF3H9pUlaLbRDgWWS0FIyGUalLYF7VpRKK8PBVKfj4tVvgJM8mOTnkhy3/0Xvcerg92MzeSy2BIw9C6fe/sdHhf6s/uUOLL2jIFp7kO4skaXJ58Sh1UpH7F24lycOKWJh/qGSHL8OKR/apTSuwd/1YjxxiY3TvxtAL+eHYWSml3oZOHEVvVf6arDB4boGTwg2Qnra7voTaoF+AUqw3ivHv4pOJpenj5E8UmtuC7uK8rPTeBglVwwkfah+BUv0LnKEVyvnYSOkg0cMsObBub48oJXZ+jg6tW8V1gVzA+n0a9x+qgurAdde+LhfEoyL1rYS6avFaCovZk21nbxpnHPcOPS87RFQx5PNI2FAxYCWJbXRkkVVszZ42lW1FWe+P0maRrcpbPCV8Hb3RntpMfD9eML4XTVdZK5uQCnr3eCCeWXWMlFEs/3NvH+smUsX+MFPfEGsOeuCC+XVIddymFcXLwYf639wJrNiVgZ85jytarQWtifrW6NBUvlEnjdJwzLPu3Cobnj+a1cDFTKHgeJx9nw4uFb3LFPC47rGYBCkx9cnWhN18iR5l4U5YLkx/Tefgv11D3F4aWzWWrnURBfIQjRKuPZprEb+5SsSbr5NGvUXUCjuctA/sZ+lHCIx9W/xPG+riPUOEdTL3hAQHw5Z4v+gHB7fbyiJI/q92rh+3ArWl0/jq7mNnBefBfYdU3Gra/8+cf205i+5C2anRWHpJyFOG3lfYrV9aFzixRga6M3g916VpnlAvXjnoHoOV1Y7uxA00T0aOrBNHJy8eaXOxxhxdOjGOP5EISEEjBEXxEfPz3DFaEJkJcgAIuz54Fdsz22lo+DtrpxXGtmDfOOTMYdz0/BlxRZfNb7hz9euoZkTrDq8ixIP24GBqciuX+7Lu73TIIqN2cIPVoLegVZ9G3fQc578o0ebc7j5adHwevAJ/hUTwIzD0aQRDewicY7qCv6wWUv4rhJ9wzfdQiEHfIy8HbRGHYdsZh2laTx/ZmjMe7NbgwyXAPRQVfp18pp2NSWA77zlGDcUA3v7ViI6x3NeWpLIfuHbqPUp+uB5T/hiulvqebnWdxyEOBqSROHL/fGLxM6obbRni1WJPM5+2W4z+kkVA1vJo2Fb0DukhN0ri7mB78/YtubdbygK4azzyiw299JJH9mDlR+ngrVO89DrpomOG7dAjaDyfiyWR7NM4bArHUmtME5OGg6DuJOa+L1qYtgX6wijBVg/uD/CNQTD8OGVldaq1tE5aE7ecKUzXRreR3exd+40GA8OJh44t7kBPCQzqQclUfw6z9L+OXiy3LPXtC9K0/pvMpu4gcT4JzvUTq9XxzyJ7fx2Euj6INDJsyuC2JtuQ66r3uJvFIEeN5HHTjtUEib+oY4fNd0Xn1yFGRfjIWF1gfoqbQOzmpzh23J23mDnTVUXR4Evce7WGlbO5+rHYPp9ZVYfuYFBu6yx0P5Flzr04RgowCRUtHk1rKbzDwXsc1ONTQqbuFMwWFSnSDFNy6OAdeZCqzfoAULXsXAqjWv4ffpABBQbyeVyk100XSId/+dQ1lMUOVYQeELx4B5ejU0VazH0+7G+MerA1zDuuHSpfsQIRmNM75fwhuG5/G8qAFYKvRQUkYDz9aPRN2dT8hQ8AVXZ7dgff9zvLG8AXdc9AfnQFNIsd3KbSGWdN7gHZ1NqSGf3/UUHHCI2x4XcYCaPsjOUaflS0bBBJHzeLrpBTlkPEUnQxP4MjcIx3SdhbAyQziaewPKr0pR7z19EFdXoZtFinjX6AqF7gE+WerMv8Lk4eu+SpKMDGbjXT5wU9kWJFXyIWLLXEo09OXaQ5tA0jsF9n71hs2Gs0lCahZmpQyRgpsQeNbfg/CNtjTD4hMM6U6l+G9veIzKM87fF0z11+VRxckG3NpFoTVxHV2/dQ7bbv9hqWJJ2O3SCWk/jmH34VIOKVSlY2sOs2XlCKh8a0KlgURRy+9jr80KCqwSIY+138DZoZWctvoRabfjt2EnCH2lD1sPZtLskW3c/sMGW/vcscHmOu7alQM5rkYoGBYHS0NVIaooC1QMp5P6ZTkOGu1PpCXM14J66cSpuzBJ6TycScmjizQSnuko4ur16iR3GMF1WQRNGJ3EI08m4N+0PVz/9yYnhBtQ7l0TcP8nCCC9mQcnrwF70XCYJmBKO9Jn0arj89nlghqUq+ijTeM4GDtvAWbIvIfe2u+wl+zAY+JvmPCvD+qXn6ApO3K4XWURv+lFWO0TyLuedZHRSD+scHhMBt8L4LbjdVzxbi7tfNmCat0e8MZrPKxTbae3E0/QaK+vdNTlK5iNb8QtfpW0pLueTa67U23JXNTdrAVxzbv5soghnOqZj59qX+DPfUN8q84A7k9JxIgjB7ja+BruA4BtF5BGBwyC3NMXbKQZAHI7R/HKEwQGhhZUtVYRGjIesPRCcZB4bon3Y4TBo/czJFw6z6aHvlDRgzyKefUDJ4cZUpnLHxbLNINFVqe4ZFgEIjw6yORGBDYc6+Hp+a6gdEQUkqrHsciya2zgbQHfdWOo7vxF/t1UDjkqkWzWNshvnIugfaQ+Wdl+wi239SkoWRlsPt2mE25f4UBqGLc/ccfqdWMpYIUgTIg5zOrTD/Fua2sIbzMGO6dRrH9EEY2uHKWm0t+02cgGxNp34sgp9my8Txuq5TVwhLsVYOxFWnqqkOLW3OGKtEQoM7jGS6oz0Ck3gMLrN+OGuOkYWiABmx4ZcPt4b4xskSXDjymYVXERXFNWQ1nNF76mHgf3/mvEf5L6cDivDCSn36XbboGc/j4IdwqM4Se+X/lj5w62WH4XRe7sBJioCV8Uivn24Xcspe3Hp/0q6E/6RFZ7tA4dJx9iiQwtCj76mh90joK7zoVEpyaAiPJ18P8VynafYlnN5RVNTh3AsQe2cd20bj6QZQfKD1LIYtCCn+mOY4OcgywxTwtsXg9SxSEXTvKax6f/uwWtQjLwWPgn77+wF/NeyVPXLmHel6QJdU3lbLhgGk6M1UMx3wck7WgF9heEqGrNZIyevh5vK58D1TljaaLNXMpsLyf71ZXoFf8cDQWsQTR7P6RHlrPn98W4akc5OLZd55bAG+QaKcRF5SWoUGzA1x7JQKSJIj+e8pciVurwYMhGGB58TOpVwXT53XM69vI6mv2Q4wo1W1jaaEw7P6qhR24vKPc749Honbw95jsNRWvg1ZCteENwBxQmSEDUVG/4l5hMX7reUP/McthudReerLoJH+f5ko55HAhmG/MtdUFwmm1H/ZohpBO/CpRCjuDbzlUgrdgE57r38IqLv7GvQIEbC5WhiZNhvglT+xZ3khh5EY58WI7LRozCq1ca4LzVLXbmb/RsjTYcDMviwElxbPRbnCcv76RpvmNAvPMtaL62oGS9IliQegVXdAjBoqH7oBMfzeIr4thhoQmmxt+HtrTteH3DZXJc9h5kXgzw0nMyEKG9EScYyJDSvs0s/KMHhv3/8tSwOgpN3caTfo+lYhNBFjNUAJUThbBveTd0DQtwStEsWD9Xk3/M3Uv7+rvwW+NRVvh6hr0vS8DxH9swtVGADrs2kv8iI0pOMoGC6985+ZMP1D3YxqITCvBzjB1UjbwCeW35nFTkAEaJc6h1XRKZuYfi9TFIJouk2PjnZ1zlpwur5vjhLzsFLJrUyifXJtKJsll4XS6Nr5Y9he9Sn6GgVg0bQApi1l/k6/eEKPZSGHhGz8Z4HyUYsS+T4q4+xCu5N3ikaQ0urrKEwy5fQMfyEDw6KEiJY+wp4nIx7NvUDJ9ttHijSiA6bpBC8Z+yUKsqAnvzktl2wkSu3qMN5y8Usxhspe6RgphbI8at+z7yV70RkOqM1O95E+w1xMD6tzycv5FOcypceJHYWVosXo3h34hjPW1hzQ5dkHJLgKC6Fsz+PRsmnB2LN78n0seZDbBV8z8OnzYGyg3H/9/83z8ekrxjRALVb98Dq0JWor1NG9+YfxfnTEvAwA5bdG11h3VrdeH4rUzcprCMlshmMT7xwl3iAVy9+gZFFathZtkZWpjpytnLJUFolgnZLrzNI49LQ5nrR4wMCSKBIwH0YutImPe6mmMsFOiZlwScMM+i0bfmkwG+oIcbLehB4FiuG7kDmzzP4v6u8zBrsg/ulBIHodqXbDbfCc/JtbFvkj3G55YyjGkjBxdn/tpnQq/WziTTJ44w228NTbh4GM9Y74KLURIYWfCb1bSMISzSmP6MjCOfHEdwabGBdHlCg/ufwHeLMAaqfsLhMV2o6O/MX9OnY11JNExW3Igq+SPhvWcoSUhNgjV3ujlqviEHr9hM2vsvATlmoVuACV6o3cv+r1RhUvwESNqphI+lNFCl7xHsfKGHqeQJM2RkoPBKMBybtBL3TVOCiJpRLH/vNJVGn6QFWISKMoXUNGoNmGhG8NC3k5ATbot75OXBwMURjGp+01iT67BYNAd19jSjmvQwPHQNxGLJt+A6fRpr7RgF2xTD+USjLdoePkbPS3ewqLU/+yz4h7ZDi+jl12kccPcOzHFRgYCGFFpbm4suIePYObOUFfNH4q71U2Gh81Pcp9KLW7TO8a8ECTiR8IWndRlA874IcC3eyvf9W/jRBCPccyUPzI9IsYzESGiXkIL1Z95Sqed4+DJnIaRn+vHnPYm4al4BrvwkxGlHinnViNF8pMsS0npVeaOMI5YHvqCLU/dBjcNnelokhg0tj6k/3AFO6CxjmVhZaM8LgDmazyns0Qf+YdGN3+VOgvpGddrzdhMJn5ZnUwE13JhpBKMa7/DRC/P575AL7V6diK2Ln8Bt3AiXhz7gXSlnrM6TxGebEBIz59CFj5NojX8amrn2kUbBSbhV1gzd/xJwrNBi4n3BXDDPGCqU1tDleX7c6bMeqpKdULDYDLNsLVCyyJufqSVhsGIuKS+TA+WEPrTU/sx7k35gQLwKbarMopojiayQeIkd1+yj3/NlyeaPJhSnTIcLN8ppl/JVrjvTjMEngLwWLoYanWX4oTQGZ/Znk9yx8aDioQivjJ9h78TFPPthOY0w9Qfx23EUKrwOa73UoLl4LF6ZqwBaW2awZ/xqEv19E0e8DGR8GAfSsal486QfB4XF8qiJDhAgoA+C17ypx/I9bv+ZQdsuatOrjHSOeLGCDDXbuFbpEJR57+BcGSnIikqH/djIaR0O1LIpEeVDpVh2fAxNMdvPJuhKQja/YY6ZBWhL/cX/gnM5dSAcpIy/0f3pfjBxdiAZnfxH490OYFllAz8vN4WjM0ZBpXohRPUawKxt/pC2wZyasyVgXWQubZd+SKO/vkOMsoU1phXgKbkVy7Z8xCq5HSCrNI4dl2ZTQN5d+vfuM/539h+v2KICr4/Ooj8eM0j1Yyn4fHzD/3n5st1NaRp2s+Q5b2ZzzcGptP3xaBCY9YpsdTRAtHA3twiuRrceURS4rg0+bnMp71ob758gjammVjBC/wyfLIulUSfes4KQMp38Txf2v/+PzePaqS2wmRV1DFj1iCVwkg+ciTLio492s8iLARCZvgoXpemjg0sU/BieRFuSb/DkXRqwYsdu7MV3ZF95jIQWtKOM6Fj+EHocC6+GoKSZI+WfKETbcnk4mxADtb0/Qe9hHyWUy8DHEWEglfaLunKMQXnnM5j63hK9HSSgX1afAx4c4zn/tsANEwFS9IqC0PBUVCrVZw/TaHjRIMGdwlYw+LyUJoYLcv+rCDyzaAsY+4dBQ1EPNZx/irWXXvHCFQXo+ApBoHgKteRF4diNkyDWxIw7G0bwzLFjWTsvBCe4yEHwWlN6+kEG7rydzQrhy/FlD7PG+UmkLf0BPusGcUWjPjqY5NPtY4o4WWo83NQYhBcLz1HSwUbA9ihuvwA0V/AIL6i/SackramnvZNzusXhsexmUP2rAkdT7nDCWV8crWKOtcb9JJqgBWoVm8A/xIE99AWgY/pkhIL1YKKQhzdXa7HR3L+4WOgYb26Nha8vs/h9SyXH2zvApQ3eHOh2AIOyRYhV9TkjfA+I4TwoUloCs8RtOLiqnSR/asHyEcx7epiCD2ZCw3FterRfm5QsjvHy8nT2MjxLeofL4OpTO1j9/BHn2lTBm20drGc6B3b2yePhD5/haZ0eTr69kzboXMfZ54ShbygArGLmkWF/L08qHkWPfAENNshTtXIPFz0qw6T/0iivzRB2TwmB7T+6UHzLJ8oVluagU7UokWZKk8ViOTF9Iv54Iox5gxOg+XMpvN46lW3Cc0B/4mhoP5tByW8moF3kTGy2cCDrlzEcW2ICmduNwbiUSeq/NrSvrwRePJZU9BLoQNhDqm2/hzei/+Ofk0VhjtRj6m0/DCVbi9A4ez+99zWmC0E34bjvLJTeogrv22RQQ1cRLjed45VXTejssQL+usyQcgfqWe7udJ5c6U8aDzTYQWct18w0g4O9evBrTDOaPwFafGAbf//vPbyhUlKcVUDfghbS4t3O1NslAv4xs/D4JD9qE3pNn/ZuBK/OW3jD6y2sr76F38wcqE5oL3TukYF8L1t6Smvpq/h2evf1G/xT2o3bG+Vhp4oVL8p4wU49tWipMBYG5mbjjKRTKNLbzy7WCyjjnzDec1NC9Wnv+AuehsbbldjjZgOXo/5hWNYhrM96Rd4D38Hq+lkWqc7n7ZtCuV+lnpbmRJPRGhnoj8gFd9WtlGuznntXnIGIa5vAxcIAFtjNw+ll1SBm5wK/hDXBPsyXjR9rsvTjVSR14gm3BCbQ34KvsIbNUXapASZ63UC1VCsYtPtMq0+ZocubmTRacxNueJFL6jqeJJAxhZ+e/svhzz5CYbYNyB16yR+7O1Hp6mbe+286+62fQCc/N3J42kcIefaHPAvjMFRMEKbZJvHRK9NoypFO7pi6koM2fIANS+xhZsZsmJmvTDny90C1TA7cg0VB9kITpofvBLVxf2Hz1RYuVk7E8qwu3prayjODxbDxIMOLrFSaXLocX7rfRKUvfXjW/Rx2uZTg5PdacO6oECRYTYPn70bB1ulV9F7zIAh5CKFHqzVpdXryyL3jmfaIsMLiFnx7swhSfojCOXln9rUby3/vrsWrxwTo580v6OWnDabv1yH7dPPUTwV8qGosrBhIY7W8uzTp7RFOPO8AeW7S3Hgmk01LxrFgTQtHRNvwpPHqYHM9E1ddukIJ+/fwnuNJ1PlKjFaPrUL3IGucWeOAspGy6BttDBdPPuMlAy9YWn0qbwg8wv7jx7PlvxuoKDmJ7034giv1GZe0y8OYOQZYkfURj71u5M77fqh1axaPc1vFHj0JYBo6Ckd/OoFS7cKgtvY0N+RLcarFLXj34Qw69Dqzaqgl3Z5kzVtjnLg9dgsumaQIK3RP8JSLs2G6SQcGHt8DF1ffpban9bzu8l5yk0yDgBsn6VidIuw19sen8pkce9MbV9X2UbpeK9lN8eBJ/XWwf1kIGYQKgmy8GdgHzEG916HU6zsfzPzvcZj3Fv7zeBM4bnABpZpUDB6soNXK48D0Pw9uU7lGJ4cL+bnYThRZMxq38HG45bibbt66xdpb7iONVgCFk4OU8+wlu0dVUPWgD5x5fI0K1mWgaNAd9Lz8iz78O8KLL6rBgFMp+KrEQW7lWTzUpUh1BTP47QxVuLzJGKeOXYKvVHv5vYsFuIj84Rk/l/DmrxqQs/UgcGcV3x5zFqotP8GcpGaYs7mG07epQ1H6Gn6tGoIpQlsx/O4L0tuzm69kLsa/qZ/4cNAAT/zZDSomZlAouJNvD7tB6HAK646eQV7Wf6G3xIuc8u3Idpc6uDyIxIhUW9hreJoe5SzkeRel8KKQNDk5WMKZxV60+pQdrCkL5PFWr9nvkjJ46sjB5Qf74ZHlLPw23gAzBcrYbb0Fd8T9xMstvTzDIY15rCooT3hB4n7WUPj+EC743MCdq3MxsjGE97icQUnvi3hjwnp44yYKd14Kg2i6OD6w308bs3257b01K7iWobxMMs9/Ikx/U79QgvU46F/YDHXF5bh7MJxlHjznMJpPFf88qTjyGmQueUyLG5/S8wPK8Pt+J9YkJLN1fCpl6InSyo9D5DnmDXxNfs+PfA5x9adNsK6IIUg9n/o2yOAov4dQV9FMSm0j8VlED22Y/Ig1naM4afkv7JIUgPbX13n2m+Ow9rglq376iZfVjEAalsLLj00s63+V1m1einvfjIZGs3zu6JiKZ8ROUrxeBPrpWJPu4t0stHgL1rW5UMfQMF+eIgD2vuHoIfoN1WbXwoRFH0h8yXeK2CTCG/7t5mWvu9gjy5z3J0vCn13K2CDlRuu+uZJvmiOf+XWcWx6PxF1n0yDH8jRz0H2IXWMKkxoRSjrs8egPWcha5MYeEh/w8Qk5mBQeRedoCVj/7QUxvzFw0Ow5Fyv9pJWnnaH0rQf75IRRyNBuTAI9rj28gwPfvQVTOxvY52jJ33x6ofamNL0+nIynl2ZCRSmCoL0gTjFM4nd+41BXxgF4cAov6q9C9fAFPHNvEvdEfaMdg+5UEHYAo5+dgrUz0+nNIUOoHfqHFiPSuTymEXJS5qJLsyj0/bPmL8v2s8KfCRgWugTeptgB0S88PvchdJSNpRt2l+mt7AD8kczBaMmt3FNxiUNKFPHaoB14ZT7gSxMOkJLiWDx18yWef3qa3V23APhuZ+WjitTuk8kn5QzgkJc3Ru/wILVTtjjmhgj8PDSH/I4NkXH5KfaZu5/Nk5Up0VUZ7uasp3ktC/HZ97d8NTWLx7l+hPuxGVCSFsmDF7bBtsh08BwQhIlLu7nhpzfvnvmIT+hEgE2wGXy6owFByvHolCqMn2xbOOO0ArxY5UwHxA9w3dGJ3BV0Gb/oXqZpK+KwJroC+hRrIMR6H8jP1YHORAfu+DfEx6QngNjAfZyaa0bB2mWkVLQchPJFUaHnMFSbmUCkhDR6fHDEZblqvEliHA8t/w5ya+L52DxBMm5JpYu+5Sg/3h7MFjRSY+Vn3CB0gewOdfOMkApsj35Ixi7FEH0zBYe1T2OX/Uj4MPoO1GXbwD1DZpHF5+DgHE188nAsTA2Q5j8Os3nrOA/WX+8IdhXrKFBIg6bN+E2pbxbQwvsFcOrlaLj+Nwe+iJnCTnF1fjdaExx9snDIdTlJj3mC8rcFsaFVAS5YrifzrfdRrzyFuyc8gCUl8lBwuQr97hRQU/5s+GOYhR7uS2ntlni0iRwD24WZgt6a4fUAAXhosQhkm2352LJEVpn0HC329eJ5y/k480sLzQ5WRQ60o9RUfUhSHsODgy+ZMjwgJuk/lo+/gkv2WmB/6gkcSScxN/4JR6iLQ4iqP1ep9qDH9yj2/GbF5etl4NKUWD6xuoi3YS5qVP+CNYctobOzgKTTfejDcyUe+DgVawcU4bfOUX7m9whmT+pi6+q79GOTCDh+nkkfggtwzN00VoqTxTeGjynM+SkNrG5lanajqw3vadJII7Ccs4hWHd2Em5/MwyrnXHpClaC7QIM+yvly4dw4NhRu5hFXx4Gmoj6ylxVPGO9Ac31+80ODQTr5+DGv/GSNBY/G84boMlqxUgQeloejx5sgMnu5DcICGul+kSAsiMsk3+ILJDw3m82iRqHL6HEQH3YYrUTkcaDrLceKrkP1aWNAOv8dWb9Ix5ebzKBnuI+ev7CGtNRDtNlTDKK8JGj+TFUOm1BNhx940FvrIJxR+AK+/hrBqbkEjeu0YJzMeTw5+xH8uD8PVGXq6OS7SdTx6jaPHVqL0e5rwHeRPOyriuD0V9tw1nZBoop+zARPKnOTxHfX2+CRdx8+mD4JExZYgNzE99itr8Y1T9U4Q1EKrMbeg9T9HrxrUzCO3/eb8jsD6UGaDbgWhYL3a01sjhvB+VuO0BS1S/Qhd5Ds7Kv43IxwLpJbxBrjNcH07VIs/CtGn7fMhv9arpF9tBqoJvbhp6zn9P7DLrpoqknSYSKQuCYDIrLtSPfyBDj2aD9vHj0dAv4ZUfU1P5rm0IQ7C1ZQmfx4EFXIwPb/QnDk/ulUZOkHCZ8WwMVXfiAVLctVP1ax8oMZUNyuDBf23+Uph46D9JRuvlGQRK0/kzGxVhtuCPTj1DxpTBPNhNBtBEWxM+HjGXOuuXialIRHopZGK04xT4Lftw7gWnjDv/WP08bxBnC5pJimtjjCcNlDNJ73B/5rz2aLWc/xzaWnUGC4iuN2PcRl9eNB02s/Kh23pr6RD2njSU34/FyXatZXo4rifqi+143mV0TAc7YoRBxOx8BTq1E3SY3EazdwfJ8AKEbEY/mhRJQ4aMbff0dw7c0R0B3Wgwc1dDBn6XiQGJzFWrlF9Afj+dHma3ynpAYvjT/KHg8Jep+L086tBdRyoxrNLx0nZQEr3myzgzsVP0Fr81zatKIL1KbIwLuxA3i++Rc6CTxgwd4HnDjPh+QCJNHTKYdVkh5h0a4MfBxuD122xRxUdxP25CVAtqEz6k91hh8Ny2HFPSfI2A68t1gfY8bLQu5sU/KdIcP+6pP5WLMVfVU14uDzaujwaj8/eF2Ityp1eGqGEAzP7gLB40+gJ+kxH46+RseqX9JW3Sd85vwNtKi7jRViBnh10UhYYFQML20Wwoemclg+MY90ljvjggFF7Ak+TAHfXWlZhzMYzlKHWz+7YKmDARce96IF5Te5p3AG7LGLwquv0nHhMXke1yhHSkcM4Mi8P/RU+ha2zJYlmdIAOLAA2e25McXWOMHxICn8POcmFU4Tgh+VF7g4qx5nVljjvwJpvDrpFExePgOsOmzp419TWC1cSMsejYK02rG86Esr931w5Y3vR8PEcd2o9rUNbaT7qLttJv1adofam0aB7flcfl2mhBOnfYKaRAW65JlDpVWVNMXYmGP/HkP55DnoUm8MFos0cJSVL/yQ/MfCzmqsO1BGIh1e8HD7VrbQP4f0OpiKhqRA27iW24L80Of+DA4sKuOvisU8eCwYdrAOfHUd4NfV2vT9oyFkHY+i8OJ2ul1dxCLzE8Dq0jV6H7UCI3zTqCu2B/tPiLL2M20oPbISz+suZSPrn7gr2JMy0RY6rJvgbckW3H+3kEvLt9DIe+aQahnK1QKjSLcqiI+fmkubc+2o+d0G3P6vC5/Nk8c4QTm+7mgLAtvv4Ip/dqi0VpgOnpzPNo1GLL99HY8SiwHZx8Gg4WUCpek6IOpVRU/yjPDL3SLULd4Ff3r8SebPaVKvWwqHbq/FN9ca6M9PY4jcY07rirbx8+1b8Oq4YZyfG4sPUr9BaMZ1niG2l32m/yadKDnYEd7K6tPdYLGHHHQX+XL86H/cKxxLbpNt+c+/UXQvO4f2JYrAaskvdNGmDFbEuUHU1hf8fPYtXnBnGg+8UYY9wRdpa0cr/tekBAgn6MqadA5etwUmJy3FG7Y2ML/4MDdv3sUtxcZoKtMIKxMlwd5MlsevkuE7+evoMclwv2gumH7/CZn3l9Gop9Pw11FlHFCQBT2Rw/xMcyq+uSsBKVVjsGOCPM45d4+0dshRd7Mfza8t541XFeDA6XCU1jrGahUi4DVtBZ0UGIliXWnw1CWU9C2vQWpPEkZt0wdFYysqF11MVRtvgI7RFzjCi1hLnzEr9AdIqt6EvpXCeHm5NDhauUJOVyScW7kftjivAmcXOZ7uGMteD/TZMEkb5p8ivqZuDO5O33hS9mN8ETACD7uK48MNE2iesg0ZCc/i9h5v+uy+CqLbBEHrXDr2bfLm1DWG/EXvGz89ooaji+352eadWGB/mbNT8vChuDQEylZCTFYmNwWmUt85G1wzVZK1Pm9E69cr0G+XK4YpzOe1c4Vhb3Qqpjk8g3WCe2m2xRg825+H9cNXMTYgGCZUCvOfkashrE8LrvVkwwH533hgUhiO8RyGt6YKUJ8fxNWyR2HHNGn60GmB23eqg0n7Td55ThAWxJhBv95/oH50FM5WKsLmU99Q9v1BllyTw3InjGD9v1JoCmkk89tvWKTQk1y0c9hdNJxXuavRqUpH8NkzBbFVGiau8WOxKaW8ILIBHk6Ww6Fvo0j5bQ6vsRTBUYORLPWI2a9LHkyvi5FP5j+6N0uVv+oXYPCi71gzooxWL6kj7ZpYFK8/zOOKpeC5tCp7bY+juzpf0bskDorueEDEU2Wo2fiWhcKqUd+pnZ3+s4KCRHWap5/A+8pCUG2tAShUH8MEx1/wUnA+B2+5hNazZnLAFBEwbWyis/cBa54cplGHp+OSn3aUF7WaVNVSsLxUD8JsCOWzZSANpVlhHuCL+Amw5tQImBYojqLrcvHJlE38Qjif66YfJ/UeOZDL1qCcxSeoOXAJ+Ci0sqBpErT+FecjScy7hx/hg0J3WOKmAyuOl+GZo9bUEuPLS49lwL2Oo3DozSnakNkHn/ZdhTqNTk7rN4DuxB+0YOle0FsVTsnRk1mxI4k0W7owpdWbQn7vp00zp6H4KlGobfmBrn3abPLjM69w+wQdxpX4WLKZh5fp4iv7Rq4oreVxhfoQ9EiPX+V8o5HO9qju7g9yMsXwdNcxVCmZw7dzDlKMzTnI6DWAKRXhrCtwnreu8aK9kRZwftiawpL06aeBKxnad2PsjFr2nuYANgdfwtayh+CZpEin31/CVR4PuSwpDFe2ZdG9zmbOHFHElR9HQIp0ErPAHbZasx+vbreDRxWbSKW8mhq84kFDyg4u+ehxlYgprFX3Zvu/TjjVdgc/8T9EFhk3McVkL7n3KIDjv8PUM0YWxH45QdErHR6IjaaPV7dRtfZzfpI0g4M0O8nyzh/+cyOfS95VgnCWPUhGe+ABNxPY/2sVLXt2AZ62M6nkPaF2jVR4lrMQ2+SD2Xy+Lrw7tZkVLgexy9ldFBoZBkbvBuFe5nbMls+HbTfv8oKxRbhJThdExufw2ZIrHLP2PI3+2YUN7fvRY+4gbrvrTx8mnYSms958isygdQHCHe9+CFa7iPtlPrFCgA45VKjTE+nDPLgzjp7ua8SxGdZQMOki3XFeB5fvCsGnDQ04/fEQd7zPw6vT1uKegBT+azCdXyiNAzvPIpZItiPLC+nsGnMGRs8ZT/xqJ9aftCXHiir8/MqZdn3VhqG0F5ytK8d+V3Pp0uo50HL5GKcrluJ7w7XcsNSIi4XC4MfJ8bB2wJMETohg6JUKyhtYBYEZz3D+pvmY2CoHUSPEqOdDNuT7C4GpwQm2mTaNJ4lmUNgbJS7QOo3eI25Bvste2CR0HfB1CSrMJPh8fCatm9RJKqv8+fVLB6ycnIuz7oljcFQx2Uyr5VV/mlAoYxwMPUOw7wnFo9d1Yem+cCjS9cCxs0/wtwB70EosJZkt30EvUAFU0s/DsGQrvF+XwO9tXvPvDAO8cEsV1lk00L/Zo/GZxwd4E6IEx5rPgfvXLBhr84lG6s6kM2OSYIcsUKxGGVZGZ/OZ3g5Q+ioAGZVzaZVYHY7MCocvWbU0R/IpXvOdi6efzmL5Vw2oV1wHxb5OYCr7CJMXz4O0hbtpsUA0FnhOYv+xT8HglAXsffsVlWo64HyoOeyO+0mXtrwArymdIN4AUBYlhvLzN+IOvRoKV7GgAbWVPH2ROahMksbnC4uocLk6yRnv5lXCAlQS/ASXyaqhE92hujpZOjlFDzQETuDC7cP0uqCJtt1xB4cOI5QcHiBUvgxiW1xROHMQ5K5ogs38OtTKKKKXMZM55Gck/DfFhDOmmNDP2+XQYvOP6rGAdvmJQ5fjTQ5dWkU3tVdQX5saTd0rRT/7LpLcuSg+1mkBraEHeWWLOJhqDuOD23tI7N9/7H33C2pMUYfCOxPJc8gUDiwoheXnxuHvdTYQ5mRLUV/fsuewO3XtCaNxGAMbxJ/TykxBnh8+TF8TF4DrTVXYNvI8ir32xtjOACi8PxGOqLqDRdczODHJBdRMPoN/5CQaLS0J727mo2hVKHaEVGKMuAaKqvawtcIEnOEtRz/Vsnhn4UtqbzOBc1cq8ZlAMHfxKnJzkEaJ5f1s9OEe+3y5il0q1XD2by5MW6YFZ4+Ik92VIU5418cvr6WDvUcXj0kgerToPwoWvwrul41oygdhcBO1J/3vF9k59BGGTA+EFTv+Yf+Y39BfsxtnZZuDw+lACvoyEnaM84HLb2JxwR4PHrmmD28c2AaGXw1p1Iy5qJXXDmo1aaSnYw33xymy0eR/4DaZ4VLLGtqoFYLsp0+GUtK4csYwBmXm4fFgDXBvLiT9u5ao+DEeJMSWU6xGL2kc3I63d/tw4tAn3CDvy8M7tWHnolZa3RIO5zq78cbUOmyuXob2EofRzlkAb05OpwPZyXzeyAyeFyXj4I9bKF9bxaFnIqAj+Sf1ZQvy8w2mdD+mgptCxuNSZ00YSH7PvqqHeXHjKP4a4st2fzPZc4Y6BItOxAm2UtiaUkzBWw3glKgef9gZRoteP8CY0BS2nnicc/+Lg74ZfTj9/RwWWrmRcsKUIK9VEDUHsyj/xjOK3iEDC/SCafFsazgzYED9vct5a1w2tc4yB2XHF9D7TxuOTZWmMaedSd8qjn7tnYq2G85gv8klXLJsPvyPAPgABAKBAgD6B9l7ZWTvPaMho6RSOlFoKUKLkNUUkoYKDVFpSpFoSIWoVBSlQRo0qMhKS0O5J7VCHzS2D5JtzQf+DF8h60EE3L5fgS+XH8M896d4MqiX5tY3wGh9ORA6XQD/RrwC79UD0Jg/kka190LMsdmUHFGBPclnYLa9JYrKG0GAoSG0yj2F0d5/qVFhLQ7EveE3B9aQa+dhMnIWRuEYXXry1BI+dnTQ0LQ89DpSh2aixbwq9R3Jr1SCBI14vrxtBMg3p8GlXDGQN/KAwIpMlrMohZ99Oqxa0gZu2Xf4S8h19PSNJovawziKrKBupxad3bQfxnzuJh2JLJbe0UoeJ3+DiowNGabl0/hCddLtUYRm5Up2s7qMmimb+bD1KF4btYhktk3ClUmj2H6RFg1W/eWcUSNgVFo3T3jcRnvNaqA4xQ4nJ+Vi7pQ7dPZQEzj+3gr9FT6wqkwLfMWVuEPpL237WcfvhEWpXaUC5quMAtUtqawqYMr0RguP6atAg+FomqGlSj0rf7G3twt2HomnjYU6cFtqJKYvdkKZcyWAmRaQJm+DEQueg/io9ejlooQSkwfQJVgeSPQMCfQuBueADUD7RcB15lpM7hlGz4lTob/hGP830xI8/WRpff8ISHq0mt7sOkW8diTMmuvHwRtvckNNAX3+u4vLPCrA6vF97Hi4D0xn6rFb1yo+ft8UZmo6oeSDTticcRPNf/ziUV5usDtpCUitCYHKqbO57/ht2FJHcHjeS4yzKybftrlQUnaHHpu2s098NJ3VVIfvbfps9V4ABdoBrETP8oXfLfR4fBNXXixjmQXueGTtPV51RwgXq78isdhcFDISAS+HpTjl5ClKvgHQOmoJGC6SBUoxBm+jGFwd5Ep3jwpxarkxnDlzHKvfXEO/sm3olSDN4odG4esCQeJVF3HjDk8YPbCMQ/Rk4Er4ITBfrklqY5fzya7/4JXKf/i8SJXjG425qnEXey2rgJH5GuCooI3vNyPb5gTC6LL5XF/zmye6tcKJ7mZkUSt65rUMNsfbg4ySAXs9GU/3sn7xsGQrz7n4FKLF/5DS9146FCyPqadEofWRGgiP8aHxqypp5fkKVpYzpI970tHsszsELe+CD+/O0l+/NK7JlAbLb1PY879A8NJbhvN+doDUtg0g6nGHJsYJwCO56SDYxugf6QRRQs6w9Bnze+8gKv/WArhdAfpVNMm+IYiq6yPh37bL+HVAGQ4sHmSAXHI110B/WRN4M1eQ4i0DSDzwK+X7PYfsxiL6IAPQ7RzJqd8MSCv+CZ6rG6RHJbLs93QPm2ldpC/3SqmTv/MmXYLZlRdY9v18eA2XMdioDCdm/MShM494WYALtjyaSgYlgfynxALuKKxDj21RvDX1ApgLS3P0qWf45udf6r3TyvqHzfDM7++Q2iYP3lqjUHVKEgy1boI9HS6QVNxCrzo8cURiO48/UA+/fyzkZEF7+N4zgbXO1WLezx3guOwP5p96A0N6Efju416ceT2Y3M3SyG6FDmRYGaK2QTe6eK8DlRfrKO1gHZ37epalVizDqsYeFGwxpR0rRsH0z9P5dechkjSIpmPFF9Ci15v/M95ELde2gcu9WfDD2ZYNHG3Au/c9m73Ng+51ziwV5snGkUN0+vRUsjf5y5t+K+CW3y5sEC8BP9q64EV3CK8y9IAL1e1wUL8cTH8e4oARvuBv3El7q9dS5yt9uFGcB3aNyTA+gBiHbfmiqwys+/IRJ16fR+nSdvBPwg+FtimDebg1ldi6Y6rtVT5nqQ1y667ybofFEPLpLBmmVePzAEvSH3KEG72KJBQjg8VH7vGEuAfoYrGCbo35RPo/NDD/nBnG/LuKqu/FYaHtIliVkgVJsQ9Aap0GHOySox7fUuic6AZrXqwjxVFlHP7ZGkptziLBPUyVmoIumzZCl9QVTvHeTCbCfVwycjr+1f8Ae8Kl4OznMorraMa5+9Whsugiz3xTxscnrITVERNol0c3qD5dhN9224Kt2nFQi3qMnqECtEbiMvevKCPtkmnwvnALnEzSxKBHKVR4ZhwYXzoDx7/ch9jm9RTILVzqexsP59py4YKr/GHrWRRViMG2FnFISW8g31YR1l6SiIf8PfBY5UUusiDeq7WKNnWtgNU1OljbNwLyFIRIPGIK3rzfCj8n38KdY7ZDR9YeMFp7lnQfiFGSighfrDeFq4mWJFaXyGZKkXBBzYX3vdrAIc2ZJNNDGHf+AF1s/AJDDcqwoX4ELVqyni/MvEXjd5Zx6c0kDOvw4asF29E/4y8rjPxJbu5j4NkvP0pRd+Vfma9JfEQxzelrBJWJ3tApcogWLjHgEwE/YYKXCAhdvAfHh3tp68BGGqkXhD9G3sT7Wg244sQsvLgyhAZenoeozcJwJ2kNTr8gBd9X3CD5Bxk8Y2Y7To9wg/euy8HdfC8PxDegsckEsG5JxtfPO/jJ8QCcbiuGo94vhIZ7RuQxOxcu+tRC9MPb1CSuCr5Bl0jk5W1app+BuZ8VeduTWVw+dybMMonEt5iDcmc/Qrn4SBj7fQf7/WiG4ShhqJHdBQPquyFymwEIlSyhgkUnUco5A7qj7eDS1eewoHAaN156S8b1k2BcYS7/OxEHQb/tcWKmDy8RbgUdDXOwd5Gj0w2beNVmZTb4PIGj0vXw8+JqTJBToSSrj/j52GP0z9aF0dIPoFB8CckEyvCdkM14SP8gXowQ5lcbGylkpTCLF8phWIYAzH58gBQOdaFhz1XAgR1ULnOJYyiEX7argE3sWJisEQ5PpeUg+18OBBt9wy1Hz1Key35etmAdK5ToQ0rpXH6ksIHHFx7nwb2KAA+lQcN3iF/YXYC2j4b44s0Q+W03xXhnTQyV0eSXi+eyjIg0+O0PxUH986Rg2UBxd5fBz2ZR6l71GCK6HenZlkqK+PcGhJxUQV+kjv/FK9K1dQMcZHQd46IlYU+HFFbPf8Xrp52CL6+i8LKmBEwSbOH7e6z59qaV1EX+1F6uQu9+T4Wt1q9pTd1PMhGTQHspHTghFA77nsugwJkMPrjbliQCb/JPuWbwmDiEr1Yf5T3dtbjk6mgIVBOn7mNtPCn1H9XqhLDeNwmcsluTVrY+pIiohVTv3Q4LqxXAMuMFiExfBTUjPOA+aGHVJGEUkbdDlfomCptyEloC82j4rAGcGHCCtDX7+FACsXmEEI4dMwkfeweRdONvDjOOgXGuz9m2yQ6Cp4zHYpEmfBYzAfLO92JUtgIlX33CS3sMMV0kGAtPSvP0Kbqw4Fo1VjXtpBOWAyA8eJ+nrC2At+bb2aK8GVMn+VMDnqf4tQBbt1uA28NHuH35LQpePsQFmTkwx1obW9XXwGE7S17y6j49ymEYOfEa7Hxdj+XLInB8016UfjkLQyENDirZU/sVZTB1CgTRgzLwIcgDG/yPsneIEE++o0t9Tnv5fs5qmOrI/C1pDl06UEbP72vDojR5TDV4BlPLXIkkHGnkxQQ4vNsfRu+TgqcnxpFc+2USyFSC/K/JvF3cAsYaZIPi+ZV0PbSPPoe8wIxrrzH2lAFW+Dej5QhtMNU9zBWJGfhv5kswP+ZEZ5cthUtTq3He8FNYcqYO3h30hEXG5nDW3pm+bntO10658661dTTHageuaGVwTQnD23n3KWOUE41dLgA9y9oh7eFJ+Dc0BfofbIbN+T78W/8WFzQuANQS47Dzt3hinSEcvr4Vdj1dDRLH+lj250eom6sPMsvek43EQZrsuYFzXM3pRq4oNIfOh/Qz02H9/uv4UiIS6XAOKyqtwYjDs/jbaVtk43qob7aHX58m8T69V+QQvAmH951m5WdXOX5OEOzXceO+v2vg9q7R/H2SAkiI3sFw/WvUHNPCvv+9x6woLRLcSxy6LBTVhZLx2aOfeLvHDMSVN8MfsKWjxpGs7/sBo/Ifo80YG16meBoqq+ZTaZIQvxnQg4jh25SrKM5FCzqw3jsZeqWHYNqTF7Az7ysGH91EGwYDcEKKLfiOlaTDSnLw1e4u7R9jwH73d+Lk/wawN9oRdw7c53GuHjxaVwyEJTaC8qy3fPvpZOx1D2aH43EcpbMZlH+UQVHcZBo8sQ5uzDAHJ2dVeFmezJcvX4OME6o0xyECP2ExWhbvw3lUAb2mhyjQiuC+TQPIOb/Au+E2IPwzEx+5b8RFQ2vx95QJsEN+GkyW/ASbFwiAXcBz8jnTCD98U3HK9BhqWWqOEi8fwc/Ow6R9NQaLWgd5XbsRvE3J5WxbCZR75oWrZoeTv605SRq/5+wfyhQn1UlRPzwwatN42PrMntQm9IFG1A7siQSou34b4IwVbdrXQRvSD7FTVhX9jXACl/2y/KpzJk8WasOn1YdBry6Bvu6aA1/fOfMYoQpojTbglec1wXrwKFs02fK+bZVcrXQaL0WOxHXbVFmnqYm7zVZg5swAWK+hB1XFH3jajIPoHDwO7t35w5MixkNF1AN8vE+UEw9Nhzuv9uLBcgUYp/aNpvY84D0efvw+pZO9lifCFvO5ZOgWRqqOUyl9UhAtOGUNLQtrWepEP573tiSd9R94iaMzB3ffhX193tRS0MDe20wx+aUeOKQ2U+vFNaj7dR1vaJ6Ks47/gc02ISxQvI7fJ1Ti7k3HsEdFAJQCW+jXjZV4YGU/fBCuIsHAdopQVodk1bc0WiyWfU4Ww+rr0uAq5AE9ceIsNLmUO0e3ofmEI7R/zhHMbhhGh0dLwfCEOwnaO8Gyc+00+VM1zrnUCIrCDzgkuxX7JLfRspMzcOcuO06695JMVwtDcHUm1e0bByXRZjQru4rUrkZQ9slFnLNKEw6GHkWXwJWw/7Id7BDX4/erD8ECxQcU0WeOpvNm82pbZZgevReVlkhy/p4DXFLP0Cozm1taw2jj+YPkoveBTkITOjef4B3zMtHA5Qu8ssjk07IasGxpImTW/4EZAjqYkDnECzf+xIVPc+nYPBEsvGZOQscF6H2eAiy0Sucvnu85eOMP/itZRNe3N4Cq1Dqe/WMdNY6pA98mL846OhoWpSTzPFiC09evZItpy2GNyWyyGC6nSOnHnLV8Oz/3e41bhEyhIacZhv58AxUpXbj1cgwUdbbQ45kXSEB0Ag67Z2Bd6W0a1SgDkyxN+c2sOXDJezd76pZw5qXjFPJtNa3Id6Smmnfw5HwwqXzUgE1DYZChYUFJphmw6d5YehnsDR+2f4WEoTRuH30CeqxaeXCxGHx93wU9RatAJkGfbzk85p5bLzCbFmOtxGv8a3uda5y9cISRBhz7QShxbYDnHFPBDW/DQUw/Ey68jeabKZF8xGgM3pIMwojs0XAb3/Evmyb0ETBhmy/xsPOeKN15pY5R4QUcXVfDoRFilBEiDln7htgkWRTN+5+BiV0Ed58+SBfTvlPOynFwqT0MUgwO47QKCVBM6oOZdv9IfmcvGwwR9m7wx0DfX2D8+TO9XB8JBT6a3LLGCIQ1Cil9508asIwCY/kquHj9MHVfqOHOxBE0MbACbNPnoqKaGXTHvCTJgl4wjNvBc+N68F78NyjeSez9YiE7t03AyeVToVLNCVInlXG58wqqCgI+qhOAZ/1Ws3pADL/fIIxm20Zg73w5vnqL4eghHybpBSwwrxfqqs25aUszZiS+w7VS3Vhw+gl1F+biogQB4EmXcL7/CW4qO0P5Ym3klhYOnk8SqCw3lHa7hHNf0jeyuSkJODsQ/Iv/sZTWTto4kAqxqn20fVcqdi0HzFh4huPyTNnnoSbcX5FB7TwabhSv4CyRUNbZh/h8QRRvjWsEl5tLMMXkDY9ZpQxCpICuCdX080s9zZh8H7ytHGHL02h4Vncdu4zj6WyqC05tEYDI5FF44OYXCP7sQPv9E/FVvhV9zo4iWZeVsExtDg/FdtK99zbww/AQpcWoYOmkP+B2yIc/zl7G9q+WYmH4FLJ9v51Xb/3Cm97ogNy9ZF5wQwq75LNIfJEgJ+bdpH691XBRzRxlkszAKkuRS60FoHbUEuq6VQ0Z0nFcvime7SaPxYn0HynbncARR3+y/DcjtjyuA72rG3CG6FZ8vfwKDGUMkkD0d3J4kU8Ov57SQfs2GGmdALslCJL9PtP+oitsMKjBx3zmoLCDB0VHJPKwcQ0O31GDi355YBNoCoJnbLl6833WSttBugdv8jlbRbj3bQatOxFDu8LTWSx/Lj//ZwmSd++jncANpv80OTf0E67K7yAj01FwvBQoNsGGnvS5c2TQCDCYMYtnLjfhmPsmEGQQjxeTe2nuiTd44pA/9so/oq1GVbxbRBCOWtTQoPFnKuqVA/fYbtoj9ogkp9hy0BJBdpVxpikX1kDFH1VQlI0hWa1t3BpXT7dflsNKhTpY+Wo6FDsV4/M1d2ioJZvWbHaEwv2F0JOqgxvkBWBQI573LlQjyaZwqFp3i/ysBflr0Bre/1MSim/rYPI+AYx9fgUicrthTaQuPQqfDqHbzVh35XNeGB2I/4UogtSnUHaxH4W2mn/Ab8kB3lZzmu59LKcio0149kEs+Ud9JIdIZfB7eIh/fJUD/Q0d1H3qDe55YU1p/drUk1zCaeHW0JeviO2TZaG6u5b0+osg7dg+0LlnAhG5+Xh160+O9BXjpO3rYVuQGZW/coQcz72s+EqF0g47o2qzHZw0TuPs/GDumnMc+5sYHmMLGsWqQHlmDOw5fJnKs+bzsvGfUPuFNQyeD4HhxXH0JXUPdzY4gkOFNshddWRlm6Ww5+scbhHV4Ibb1WBj6QkTP9nwv9mymBIsRlvuAMQNbKeZZnIYFbAHFdbH05ZnFXQj8h/WL3DFqQZv4H0WY90ObZD7FYVZ61tIrPQfvehrok7RcuoIu4eXLZ1Qvs+Ngr/exlMeBG13W9lm33zcKhJO+fVFXDRRgJ93/OLIqaspfnkhSau2Q0eNBZitnUOhlmPB5JIYGPe4QdWNIVrqegKOTp5K1zY0UNoFKxjtZQYndjB+VZ3MlwxNcO0JS/JflIrjmzeTym+AiIUa/HD4Gk/X0oAj9er0Opax8GA57r6zjgPuquH561Iw45oHn6nZD70jsmn1QnuIN91Kq+wfQVqDFXScj4fr8RJoQv/A85kC25nVUoboO/5+ZAQ8yKiEq7ZedOoB8r1pb9g/2RPfPZfDYOcmlliQjwWJB/jCAm04MlxISkZ3ePezSGDPXxDy7gDPCe+nepWzNHN1M9nrSVCm8gSY/04OfPNXs/PKTorO6YTFN0Np+/HNtLtyPo35XkZOwREAxirQMbcTY/pMqMGkDw9MuQUJTxNo+RN/GNMRC3IOehjMKynsvgRkbfah1HI3upF0gGI3j6VHYyeB7YY+NH/rCcKWvlAUrcNXJ6mCtbQF5Nt7w2hnJ7r4SQfTT7qQpIcFJL+ciV8FDoDnj29cpGMGmrsv45k6AvtjbjT41oZ27d0Da9snQ/W5Ck58oswTRT9wi7EUmNr8hYlz/ShCqpY+TkNkuS7aPkEJrnS/wIpZD2F/zhKqPSQAc56+pnXbEnCahABftLvKhWYneNuSVI74ewQOXX7O/okuXHdYE6x0ouHCxk5ap/wQlaZl8Yn6ejL6KkDbKwx445AGf9xgwGfdbWGRfAdqlFugkHgIe0v3UlFIFwsPvaFFu7U5YpU7lut40ZQyAVDpHA2vC3347MUS+nFJCQboH1dF/eSLE3aTQZgsx+n3gKSTCmyeMhXCxl+nuix7zL0ykY/5ZED63/3Y+WgeqERXkZd1JEtaTYD/TnTQcKcR5eWtwOP+GgzPD4P32zyqGjoOEgf+kvodIV5wxxwOnblEuz9OgK7xPaQ/KRQlmgvxyZEV1PY6EmVmfUH/rUHoO0kTKjZ8wFuNM2DEi3m0UMGVHv+WoAFnT8DKG/jdKwFkT04EA5fx8PwqwYGzRbTTcxG5jtTCJPxL0dkJ+Hh2P7w1ymXXrGlYUGoESXprWNa6lqTmneKo6gTqfzMMxzz6SG/PQzDS9CGxwhCOVhKGFPfTrHjQlbpHxtKVo6NBX24PeM/ypYn6P6CtKIPLrOTg7EdTWFezGmxKavmXihnM+DuOk1OGYIegIT9V/QK7T2uD9bvv0BAoBlEJk9FM8h2sjU6Btc568LdNnyX6wnHTf2VsvG8qa097jtAqAaW6/yDK6DKbjDVHoSXR3OBRjwk0EizlBDD8WwaNOy0PSy+Ngj0u7Ujj5kJW2T8ScrlIkdMy4Mb3KnB+1gXxV/q490U7Gio6gtT7BNxaZUIiDx9jZMFn0Cj+SMVdq7lmhQ++3jYbUiI8eWeWE+zWT6aAkJs8tfMoLOsFomwfPDe4DxyHJmGKwx/WO3AY18gog3CrNAb0NbNh2l+wOrMMmyvj6bNdDs8/Fwdjrx6DWvmN9DdKBZYJErkqOmOjqRePlxdC0RO6fHLSb2i0dIa5K+5CSMVcsO81gTnnt9KZZepQNqqNQmYtwrXrG4HCUyn5+woqqH4Ca4QFaW2pKviW/yDrUA30TR/iMwXj+dX4UZA2z49NJX4Tb9Pmz2nDKFOqD4K57pyqVM/6I7Vg9iJZ2PZ2Iy/6qA8vVomAmF44nRGdwIm1YqB7IhQtPuTit/oajCtgkkscgK6dIeAj84bfTR7CR5WJoHhDAf7995cVZwN7z8qFsqcGfNr5GChG9IF74Va8efE4rh7fyqbfdEG/fhbeqL2E08P9+WptOm483Ei9BgtR5Mh62GnmSr8GlpHXQjs4XPQfSbU4wq6gGFBeI05ZQ4i6VQZ4ri8TJdcsgqzqVxzcqQa3wlfQVLHn+GX3Qpr85wOU1hwjW8HL0DF5HIf5/EClolK2yzWB6+vm46zkg9B2phV8392CYFVZOr4vhIKLTkP+PmHWcBmg5itj4eHVMNi/YQ63kDx5vmlGNYlGCrTqoMWj+zFI6QE+dslHjURT2PpbA1MUY6hnSwG3KowAm4oneC2lmAojvnBwgBLGacSD0mYVOHR7OphLGqJ55FaybgOIueMAXVNySHthHmwQ7+I9Ej9BcJkxzBX4ivNrWnhIZi1MnWsO4olhHKRzn11ufuUVX2Mpb8lemBRuBL6nqvnuBwNcZGnACja7aW9bCgT0h5G8lS5Juw7SnLogfHR0PKx5cxCPJbnDBomfvNrpAR6Z3gZ5woEwdto8buiex5On9/OF7xaQK5yHLxOCYEvWTHoSXAG3LKV5X60Sp43yZt1LRlQSnU7uZx3gfKA3azeKs+j+6eBM3TDl1wKqFl3Mt/gq87nl9MfegZP9JsCZGjEOefMHH9a/hRjhbB5Y/AECv3uz/Aoz8goxwOKqLHg2meHPki6m5d0gor0ddH938r93qSCz9xIfnVgNJes+wCyXMjh3zAneXn/CF1KXUkWOGyn0VeJA31iMkIqgE3c1cbJ3OknqWPOKTVagGHQXV53uQUV1A6oeusVuNh/gxC5PWFrgBzLLV7HqOw8e7BcGUE9nbsyjqYGL4Of+CTw/eh0K7U3E101SdGT1ObBOTsCmS6JgWecHfx574YTRB2jK4h8wteUgDOmuoHGq13nEjGS65CeKi/dogpyaKFzuP0O6V6Lw4rP9iEt3wiz1AG6Kf0KxLQvxlOU/OhwlDtMXVfKVMYcx9sEfMv9SSaOe1PKquR9w6xg59r88mxQ1XFnttwVIPK2EWFF1Ur9XRhoa8vih1YYfnc/iMXJ3IfnwSEo+7A1Js5Ug954jbMndRyaLZ8AN5XaINZkMR6c9ADp2HANNFCHlUh18IkH47+MNbt0cz557dsLmsslU+SIQdCkN+m0/wr2sKjQezuHIAn1YO2YbBd94xI8WeJKqQSPHCDzFiNXjuTToFOh62AMl1cCPOCXoP/qNZEtuY7a5OO6YuoxDr+xil8kd2LH/Onvu/I9ulJ+lqR060GrTj5xowTfpGun9mg11YafxwT5ix3sXuNzLlhNv7wDFWHsoDx3Eez/M6UpTGrXK9uMzRUPqr1jEySFSLFGxAPu0ttHRqY4gMSsNHmaGccURcdK/PZff+ZmyxLuH0D7PiMaMvkwdOqawq1YDrmZWcOC7FFq//AbV/3PASwJvYajrOqS8zMSrp7+jlWkTvvvoBJX7Kll57mdQ/XgTlYIHIb7aDTotJ4Dxe3W03VYFX87fxZQeEThwuJ9VK5vxVM4KGK1dz4IqtrT+YQfnjReiZfvusigfgSmr9GFr0hNYXB5MQ+vM8E9TCLw9GcHawvo49bobyITk0Xn1pVSaIQlr3odSsmcFGzQg1Z5czJH6mejjN5E/J1RB8uZ+nObzmKrHCsPiIzWw2Poia5a34eVH8rzx317Ye1EUJs/+Qy5SEvDUSgfT/o2Cj6tFcYyrCngvuYWHT8XCHlsvmPc8CN9tEcGttt9w/HV/LNtvDsf/k+IHLMJ7ZsziLv99sPFeKj0iQ9rW3QxHLndCubEeDEQbwvGAJLp64yzuV7nHHaYyoOh0G7WcXnB4rwc7KllBhZwCrE63A6cv0dT8eT+LafnQYPorFh0fQK/GtbGvnQouMfXlu3cHsLlyDKzb1AQhp1LReFwJjso3pKBR9/BQnAnEXBrB1i0NmDS3ltJ5JBQ5nEKVB7H0QjmNni59xyJu/zjsoBA1zh8EI1MP/j5am15ZOsA6q27KuSCNSRsa0GHYGVxyptM5cy9aUGTGO5J24pBmHE+LNYfvqXNRz9scHQ63UafKG34wsxzV751E34PKnPBBix79+MCmpxVh3t0LrLetlHxinDAyBEhv/Gp8VvSdvD90s0rQW1g/eJb2lUiCRU0QaOoDaC0eD9rK2lw45jCw+g48ssacg9Ia+Z48kIyCJGzOq+I/BxP57rMVYNLuT1lCqXS14Csl5a/nwszfEKoaiyceOIKjYAbJ+orz5aEWSKs+TJUxjng/PJmKc9KxlNLhzNhkPtA4Dj6sU6OlUy7wj+x/NMu6mdZPOQ3RSd28+qgTWyV1ctjrCjo9aQzEz/SEtuGH0JFghoHjXsJrzw7yatuGz3JGcceIK7w8pI21joyE2Te3snPXH8pP/M3y9tsx1eUuRv+ayMkCWrzR7ANFFXrywaWWULfbBCbCK17v08chQsHAKd58P0QSPCsewdtr+TjdqYMSNcRgUvcwPLcZAYbzhtE8XZf6dr7Ak6eHaeKDHqo9Y0z7zx7An33CMLpKiDK/vcTmjC8cN5DMui8vcu5JF3atWw96XYdwp/ocHNhnCY8SVPC2WghXHuiBpZvvkZ1EJ6vkuFH7lzNkNDKapcviOFBJAnbaT6WSrNvgfcmZw0cGkU1ONss9eUDzj2ehzsYDuGxUDAYE60DZvB6aeuskZTkIYXvWInRtdcb5rUBTRxfzQbEeUBs7DTYtMYIP+7KxMAFBWfQbNoW3wrspZ1DZ1QGV1kTARBNN7h1F6NRoCbEbDSBunjn8NrIkl/ODEP95MskERKGR+BBFWx3lAJ/DcMHdHmx2+3KK0W8yjTLiW1c70WTjVJ7ywZ8S5Sz5xyVZiBRagQWyY2H+2ho4pu4IqYrhVOp2m28tb8SNan6ou7ODr8wAiHkhyJvMHeG22i0Q8vQDwcmbMFJ0E727Np7mXfCGkYGJ5BofTeGeVVxMAJ+0ZuO7PQpw7kIhd1Wfpyt6YegUGE2yJ7fg5qM6tKB9PBaISMG58GzqmBrMW3vvwmKHu1SgtA7rStdgsfNlnBaTQ+rvI8mp1hT0cvxw2Z5n+GsfQEvvdlr71pPlhR9gv/9ezp0vDFs0LvG2RCGoCEhk+XN2vMrrEZfnmdLrokP4cGcq9Pv9YXejQGyz+o0H/MRh46Ui7hPKJ4cQX/7x8DQvNVsLro0D1PJkMWZNDqEX+t8pP0UPthf+gwaHElyRcAsOuBXwPhUf7C8qB0m3LJq7ayL3qNznkguasOZLOW0fc5pnjjuGsnKhPE1QBCMmvoHiHacoxWAI80KsaayxMETyb150+yiUXQ+CB3vq8eZKA/hbvIOnTX4MOifNSSigmaoXa4JTWAS7VuZz5rSlkCa3mE36g3DH1SqwM1hPLTcPob3aMf7hYwZjjl+GhLRlMD8nCLabTWHpjzPQLLYbezqsKQ3lOVnpDxzwVASBlDYSq0xnWTsRDFt9AAaXJ3Le6llYlOzFljqB2F/zkjrrHWFJyxYM7v4J4po/4JVIE9nv28YK19xwbYwuRdtdQx/dCJh6bgyYrPpDdLyXKWQljZmlhtcmbKJ/Yjl4orUK4U0TH5ifR88+m0FR1Eaaob0dbfSD+OHr73gzLBXS/orQRvkRuHZQkBOvKFGnrTiIgyNd7XkCYa4xMG5CA2qUy9C5/eXw79ll3GQvgTVRH7msHWFI0p2cfPN4YX8FydavRYFNrTw+bQfXTInjpO0ReC9CEDqDNaFYTYZGLf8IhuntGFXYRu7bxOGJxnpUcRLFJunV2FCvgdvnm8BCxQHqPfkFr9zTw1fXDbmnOZTGihEV3Jbn/fUncbbXbZoYYgmWB7xhucF6MhL/gg2CFex5cy/aSFWz7obzeGxsMhlYlPPkBQKw0NqdD2YP8Zs3KpxuVwUiph00zjcJ1PrqKbQji742b8E8Q3uQm3waPihFsV5bP66dvgR+BBXC5b8XqN53I+xXWIaaZqmwSE0EbG4epfrpZli+zprbx0rzeauNpH/tGXbN3YyTWtbjuKMJtCRcCrbPQDQ66M9b8r7wVrc+fpayHfcV1sGRXSKgOHcr+elqIFY6gozZXlSd+QPkVqSS5EA8NcZNoPqX8uy3IQBkyv6gQO9RXt8rBPMSB/B992ZQ3HwU22XDUO/GXgzIdmX1Fz3cPt2Dk65MwjHu4rD9SifZTf7Ft3Uuo8C4drgsGEcGPxVwjrs+rFM6Bq4ZM6mgRgrcfBex3PaTfHezNC7R/YpJm26SkE8tPxEtp9UrZoHc7BXg5yoM1+b3cs4OBUyStCXzCR/g+IsKer+oFdzCBKE62xjsQBkjk8TA33cfSywfDdb/7UBFWVW4qR6Csw8Jg8NYQ7iy5h8bUAM+ENOHXceF2T9zPnqfaybDlx3Q6n8P52sEk2TpVap4epw9vGdQUtMYmHVLHT6L5tFpzV1guliXE1eZY6t+GWbrJZOvUB+dnjAC1XarQ/GknbBeRhsen3TGK3KP6M3EDhi5LoEqMZKvavmxhsdPFpEzBvnb9ehrfA3H330G3es/wa+ab/BoUwk/2zEOZuiooMz8vRQ/wg6eSUjQ7nlOdLZekmalDtLOxHxKm/Gc5P7VspduH+x9I8trqhi4ZTz/OHEf75wXoiOS52HDvDKc4ikIG6KS6FCdOh412wb1h6Qh9ulR7I1rRbOR/rTQZBe987jNVveDYdsuI47bng661w24ZZst9OttgWHBDpAO/UiiESowY7gFE9aWwpCXDkRlrGJ0W4ozuzXBsloKwLUIsmIFcZehIgVqOYPrt7PcdSIXR5vawYIgKzTNlYCQw7koIxTDV1UVaW/4L6wLkEX3Uh2sl4rjmn4r2izOvDdLCPJCHXD/4Wkc89MRrYrb+UVVMj3L0YN5eSI4odSXQ5u/04ZicQgpO4NlCco4UjIFbj0aAxLvlenmoUyK2ZIPrQqV8HRuOYk8soS0LkvIdHiDP2Ycgjl+e3Hx1ACoEJ/O6cbKqNFzF3xXBkB6pAp4VUrS9dZw+HT3LTuddOIbtyzJy9ePS00X8O0FXvgx2YpnHheCOA81KH4+G5IUDuIu0cmwyQIpRCwEggv76Pu7XXBGXZsvr7KFR2eO8If3PmQqcpj+wg7UjpzJWm0fsHPxPLh+pAXzbS5hobg+LMU0vHhKnXLLpuMm/QH0OeOC2sa5/GxtCk8KaSGzxkM44rEW9Jdc4/ihOiiumINuW6QBr00gu5DbqH1hDzzUL+Yjm7wR7owDucep/CjWDjPCZkN2WTZkHIjnfW+0qLDkBx//dg8ly1rQSngcfI+rp1uV1+mxwyR4Gr4OxfaEwLsrD9FbYgyMORFCYwOLeUqmDDjqBWHeoDpExm7h4UfKOEHmDgheMaGC8950wf0S/BkepLv1cpBY74WtuTvxl0QyJov7c0deMkRkyaPrwvHUnX2CBSeJUeFsSdi76wvP+24C4bUmAHtW4caUP9T4Xpt0ljZj4/5szuR9qLjUHhx2RONe93asnazC6s2vwVF4Dr66KEt7QqawbudeuL5xPwf9VgHhmym4tVwSc2R3UE/EMA7nt8CpESF4alMY77V8hmcXq1OLviVc+NZIMXbKLFOxkSq0CFYkfsPSNcvx87yHDAfnkZGgCFUXS8BjOWGsHJ6PmuUlMC90GmWSAOd3hZOHmw7fEP/Nna0ZlLFbHDocBaB/2Afmmrym19cusNeHO7BjhzfMEerhsqTLOPnPIXafpAaV3TvR9G4+yzXexs/JNbikVIE0Sy3gluFtjr9ewKrZaihRNArKD47GtkEZ9peKoMnHN8DS+mP4QK6CbYMN8EXbC5hv7wa2w9Iwu3wca3xcQ8MeX2necwdQnWpCthIW5CKUQnwvh8JNbKFmihA8qSxl4y5Huqx1id84ukEDaPOWs8K8OLWCDykHY2dIIyZoj4Dh/lOkcuA0hjxYAZo2kny6ax7N9PWD760h8HZzMJrcOYXSbwXg950wSB9bT2BdC1nXJEDV35SfLQvhirhQ6Oi25GK5QRh8LAFu/aOpr0QD2hd4k84xQ9Cdwry+9jcMBe/Co5P8aaxlL4p2ysK8E+6Yo+xB0+bo4J/ShfRQzAhkhvfS7juaMOvrZS5ufkKbd2mA0IhVUJ21E/VcJLhMzB0fHsnH/zTTcOZoWd4zqEqNcetxwSNhmDZ3EvdntWJeyjzOuPqXXv/ejHMPboZvbQ+xPvwWZ4qYwZvjABumr2Xs90P++g5F506AWJG5tD5Jl1616sH8KA14aCoPqW2q0BgxRCLKP8h1vgDdnNfLNwJl6NNR5PQvE+nfrFXs4NEE0vI64JCeADPSrRFuJlNOriDunJNMGVmirPbuGQ+eeMxJGmGs26EJNXcyQbqikn1zgAfS/4OtJZv5hPM4sry+B5oNltP20UrYu1UUemvEYZ7PR6q0XgZlBt3kvsAcF354TIr9dexmgKgjO8wLngJc+/aWjlqogSjMJNuiTh5fsJZ6LJrw5Ac7Mr3sA9veP0dHRQXYGn0ENqYO0i3Vb6jz8CHEzu7mczIV7MQF8Hy5Devufs3BehOgYcZJ+H4SIerKcfhr/g+s/57ks16mLJfnxR/e9OJzpWgMvmwPy5cK4h19oDsPt+H6iCP8Z8oa2DTKm7/GBNLVk6V4+uJT7EieADO2v+f4r+sorPoFC8kCKwpE0aLeScSb9oKBM7FtfB5OP64DH8xV4O+739DlVUrmQ8WgqrqD7afPwIZZm3hxvzLOuWPAM3Mk4MqmXhIvFWGTzf+o5701e09by9MFQkDlkA5+/9kDAivFaJSHGETafKG8gENwabCGDpTkc7LdfxC7q4Ufem/AAqN20kk1hzFfNUG1+woWnJahOwovqKs1ETdHpYClogX8kLrMj+bqMz+/D5ZVo+HTzGTM2hqDQgkF6P79CT388BtmbxClHQ2zWGTxBTb1M6MdKaLwaG0pCqkO4bcES6hRXY+hKesgzdGI7S0aYOQfEzR8W0JFfWPh4fk2yv59hC8v/4qlmoOs3bwUrzRaw9uqSNRZ7M41WUVceGYCWMUFocY8D/CVmANrIlfCYTVb8plug+XrNoFmciZPfvIW1JYbgem4OjxvPAIu+MZBlvh6HL1FCBYv9qGMkU5w4/QsMjedhCvDdEC57ghBRBpredhh66pEEpHYzpq149hkgyYZfQrFV9/3ouYzbbBXkMTINHE8bOZODfMEOddfDo5AHce9SefUgvNwLEMOKuPMYdbn9Tg3Ywxczm7BkMeSsFvWjz1W2dOIE4vY5sJsdJ7tCXc/qcCV37fw2Nw/0KVugkeTF9B5O3lKvXQQu42v0GYpY8z9Xo6ZV+TgpnssJ9o2UsXiUFAqncWfo7eSuas5SIsvpJFK9+jb6FqepCAJ41TW8obq77zW7ys82hhJtU5+HJPyCZST58Kd4RFk6/yVjMT0waw9jKVkH2LC+hHoZpBJQmov8cKTkeyr9BgGG6ax2ZoGlFJzBNsDROW/b+JZnxM41PMXigSS6FxCGZfkh1GDbwdrzXnFK5ergFX4adrv4c1j/BVJx+gXLHX7h3amTD6t8/lPcRQ17CymhfpaMLJ/Nr4Nf8vpF/eR/bEMds6eQAJvRmHz01bqHmEB9ycW46lKc3CRzYG7M8bxg+tbAMTuUn6nGGS8egDvhJ5ybfpCeDv+GgvOMgUNMxXQkWgEp+rjENpfhU+2mqPFWQnYLS5CnyGcnSrbKGemDoi7i0GoZDqeK7oA/x36yn9qQ3nM/GTYdYGwpHYXH9PfBksk1OCZmj7Efs6hc3k3IfSKEI12tSYdl6+grq0GO6ZPp6cjpODg/tEw7kEJeUq50Vp3YS7KX0TW7T00N2YEip4OxGiPszDJuQUXfjQEG7ce3HRHkjT/zaY8x3KSumBIw/05dOHEKY5p6eELeqHUkSYP5XeXYYrQRXStv8Gu1m1o+y+ARiZ4UGn4ENR+vcppU45guYgiaHtZge+LNCxI6qQ6mQBQO9WAurnjsE64BJ9vSccflh0QMFILnHVdYMekM+ia+R1vuPzEweledOalCTd695HBIRM+MHUU3J2oAN2fW6nkxjaebulApW0ydPXjfHj95wbUZq5GgS3ILt0l1DtaFzbGlLDW3TOk3alP8TmZrGsvywtb9rJEmCv7/XcJazY0wHkjbWgsbKb6U+o80rsLq1pOQlOLPBXf8USBmnZe1O5K7d0dsO6BKej+dsDnO9/ie6e5XPhBlz3sTHCrqCd2RVvx3tBecrFPhur3YvBzzknwv7SbvvWp09Pqn7ha7QcfWd6AZkmvSClCF+V+SeIeJV2QWT0fNF+NghWRsVhWdY2SU2sxYewH/JIYQBcXTQLroyloekEK1OqeQHClNcy21GO4p4nbVu2EDWrTeUeYP+77Ios1t0Xx9T1FWJBdwnuCEPY5l2B0RDn2CO1A6ZxvIGs6Ct3ksmnA9hhNRD0wbH8G/pMk4SvPYoEMR0pakkXGGwTZRqAX/rmm0i7fcBK4MQG6R8/hQxHbULTXncHxKTorddLw0Ukwsv8PH946Fgbj4im0TxEafEwh7u8P1B/cAWHGJ6jYIBZLC26R28f90CEgB1aJTTTYYwPvp/2CmwukiFwiWIxt+EGuOTywlYO2oCuwuDeU/B4v4Ncv5CBzfAZM/i5NlgYTuC1xD8x1icFFvX/gyLdh8r09CDNLU6hdRwQibjiSfKgKjVC7SSLZwBU7RPCOw2V8OhhLJxfeooUKDbB7hxB8mHcKDdzfovva29i79yrbxH/FI/f28RGBc7xHOgg/Xb3CzuZOoN+lB88LF6BWgT7ee5GFR8dI4V2bPSy/5j/2dEAsmbUAlxdIQ/qKT3TtSzSP0zsM/+QEsW44AvMM4/FG/RxwTH9Bizw72UtBGkapeqCN7kVsVNOARA1lzrGPhaIZB3hwcIBEPH2wUn05jfO2h0bzJH5+8g2dHP2QFVtXcEP4Lfg5ijEsbilNGZYjn4NHQfyMMmQXmWD0PnUIPnAdvAPm8MHoYphYOhP2dYtQ3+AdfCVeAFrlYtCeqsXCY77xCZseyP9QybGGe2mEfRsrXmiiPGdLONgcyVM2jocimUrOLiuD/6KXkMviS1ixaz681i/DcL3DtD92IawOzcCeTzoglqLNHXEJvO5jIWjOcsGGoEiaLnsGFl3+zD7nZLip+grGigG0f6pCv4nSbNevhDP/LYNs8S8Y7zWJWaYGyqeU0X8b1DH2iwbciSvi0Tk3qenKRH5rOhdCUhdATpQ4vL71GzObE2hZYRZ8FHWEr+mOuNLjOQT2rkOdrYEwbs1d+JfsggtaxWHWAgH+EmAEFjWCUOkWgAv2SLL7Gwc6EL6bzTeMpJV5xtTU0MJW/5nht54mDi8XgBNpxGMyFKhR6S02Dd6F04+G8Nx2oq7r0TTtTxddnmdATsoSILswH4Z3fqJIDVfYU2XHYplvYL6GIWv6ldL+8QHcMWUFqBYZwC+lkRyu85U7FryBzRK9+MLnMNRWTQTttKNMAtI078lW9HKQg8vxr+DY91KYJOPA6V1lsOmSBvx9OJ/OdL6npeenw27RSsiXUwOZdSfp2oSjPMlqMnyMVyFh0S4qGZeNr2ukqXuMLBsv+gsPRjDMTrpLx49E0y4NZfrc7ATO/iUccCENsysqITtyHuq+Daa3I0aC1kU3WmA8k+sTE1iE1sGYWyPp/unHYH++GHc5DIPNHXne6j4C4OkeVl8kQncOnibBRT58K/QHxHpZctjYfVy/cjoN904B2X0KMN4pDUa7SPJ9LKSeUIa/Vup0pvYqxxlqo7urGzje+QbVxkYgvHQSWeXcoMXiYrTRugAHIoaxcPovCLh4k+KmDkLvyzxqWWgIJvmDHF79go+8zqRPK7NJQU2TxRP386Hmy1BlqsEiQqv5sKoGnJL6ChlVbpC114EUWi/Acbnp6Lv7CJamZ9LMp1n47nwv6WaNB/9ty8FV7zWe39iEyTnZ+FxMhWO0NXH50RZYeO0maIUd41XqgmBUshFM05X53A4tRM1eCnQJoC1d/vyf90X8JTkbzNbMJmthbbBMCORiUTk4frwJilW30qV5v/Fx6mVc32MNx4MXIemP5bIkQ1g/9yHKHzvGC8Kr4HHVSVYxDmJPL10Y+OcJgyLSeLWnGCfWj4Mg7+NgUdpI82VvkaqkIc5tvUnNSxxh6ukxMPXQEfz70xK/n3GCqQVnGa595PsbLGj/SFUUbOrghx5hsCc/jRxKlsHiU4GU+XIcnLQSQ+9vR8BM8zrrfbqJ546N4nTfEpY2vk3b9XdxftktXhykDS4iHvBmyxBWqiVCRL8vf0sJpZu10/HapQCUvhROv+2qeM9qG4hNXgnTci+B+mpXnLy0AnKLVmHS7xpMajBmmQdylGhkR1flpeH1h0XwyXwFaYkirbY4RPdSBLhWLgeOzzgEusoRcHhlHTV3j4JZOXdR/mQjLdn5HNX/niSFhgOQGHufH+vU0zvvPXi+wILeyxqB8ON0MHkTRTc3neEfku+5wd2DEnZ4w9tuOzT/9pxnu7fCxQOScEnNBBKnyHLhQCBOupLLwZUvUAS16LCWHrjMucNz3xdxZswE+Hg6lwJM7HiR2TMMfmEOrjX7cflQI1tFhlDQ0ju4LmoZjBq2BvW1yZAu7MxeFkYIF9fBy+uysLzpNUc8mMnXHO4ht77gD9rmsHnXczq4fQFVnR2LBwd+kkyDJTzJKQALNVmuOTAMedEVKPpaCK4t7sT11ZfQJPI/drGMYd22V2jhU4r+ajvoqrkt7YmKI6twTVj3eggvjvgONnXCGL54AZ31OY9Ld0TjFrep3OByHN4WlsJdNyWo1Q7F7xbSGPF3HMfY1UA2hkHbnuusEyQJ99fNJ7psiTHLdWE4PIv3rtQAecEouHlhES9yv4le32+iyYA1bE/9w06HDGlGmw0sczrFA/Vf4ZgXIBbp0I0LnyDyigs/PqDCAxbSVHSkjDWqdKBR4Axa3/2ND/795AKNCfzURBoDJL9Q/GgzTMqV54tbOyGxSQy2z7sJVNBJP+6l44yFxXD67gq6f2MCeB5cQUa29+ha7kV8OE0GLOxfg8ESRVKdqI6KL9LhE1/lXP8yWv7sFJrtdMejLv5omzsSTn3Sotjge/hk/VEIvlVFDx+v5iextZg3EAw5RmNZNLGCusYJgruFFY/6EwaBYZP4/tclOONzM2SWj+FnbM7xcwNoWnwGJ1qMguanNXBavhvXf/GjviVX4MAEf5bOa8Bzn3uoTXwiZAs5YNjwSJif8orPbDOnn8v2kf77LeRrHciyVXc5W7YG/7a+xnZhU1zy0wB8BjPx/sR6znnQQqaZk8mwfxr8T9x9KAKhqAEA/ofMhFJ2KiGjSJFkhSINDUohSYokTTmkpDJKpCIlokERSUkqo0VmRUaaKBVSVIjoPsZ9kk8pJJWakgW5a/pVXOezhLsEDED+5lmevU8EE+12QER5HyvHWmHOEQVc/7oL9OespLBJR+ndElX4/NEIXqlfR8n1j/jTXhHUt/fHoopI0PSLJL81RSCvWIrdY01A5esQyC424pfDx6FKo5Riqj5DypndkJeahIvup6F1WwlMlBMHvXRdSLuxj6QzGtnuYCbMUSukkSt8yDTChQvnx8J9w/UYJS8Pb2kan1LIZD4TTdOXj6N/a8Xxge9RODT1HiV3F8Pl1WEQ6K4Ny97/4S9S8Xi/6yEEfPuKP8TuYHnXALpVXQZnxxfgfeoxnDloClPoCV7R1MQHS5Jw0sYgeLP3Lpnulqdo5VSIW2yDtSY/uKlDCJ6PN6FJB93pxyoziNQbzdpKzNOnmlKqaRFbLQ3hoJwpFNU2EvxKhthiSS4qvVrEPlnj2bgzFBXTrpBM61FaIqxLmYIl5Ck7BbaaXeFyWWW4DqU4ujyYDg/bYW7nMZ42chycH+0HH0LUMXCfIljP6cWZrjaQ/PEjRgRHcMt5OXRZdxS0eyspJus0WZz6gkqrDMBFtQ1Ftv0g58L1uPT3C/gr9o4KBrww1PUbPGjYTmOCr5KRqyToH+/h5SdvUPqrp/Cv8xPn5yF2KXTAPfUStph3EtX+vMBXr/Uga6Ex2+hFsavSP65ZsZT0S+6i+cZfFLBbD3P1CunGQCvq1U8BJ68f+CUhHMQe7aTztpvg+uP51KOSQa88zNmsZpg29XbzsanCoHQpkpaeWsISqjKcW3WBHdo9OMZpEb+YtB4Ls7rI0XoAlimPBZP2j7gm1w/Nn5yGZYf2snBjDd03uEy2Lnl0WS4ObDOiaZ6oMHxyLqTEbAXIWmzAA3eNcXafHc/w+86iKmfw4+5CVPv2i4+d0YG3KvlU3XgQv6m2ofltKZ6j4s1Cp8xQq8IT1gRJ4QKLftpbLwJFChLU++sTnfz+gUenFoLFloms+yecNBR+8EOjq7jG8Tv8OKgO4+IMwf5qH23uv8Un01bBgwkzaMx7oLKireT14DqJPV6CeVLi0F6OcMLqHAvn3qSKk1PAJb+Kspre0WEpawrZbstmS3v5+Q1JEL9UBf+lXsNLG7TRqcqGfP9pspWvKMjn+ZFLajTSCQHSODoR1LtXQ4+VFces3AQVbuq4oqoezxYXk7zILh7a9pkG7z6mfKGZMC5XHBKHj4DH6C24YeRRHnnMBA+myvFfgUEcPXiB7iu/Y09Xfbh9z49vjQiiEdXhdDDaj1dueIkuw4/hVYMTiWm4A6d846IQTYgY9RsrRIe4d0UROXufYT9DdZ5wdCc7LtDHqf6G4LK+Gq8skwOJ2R/ol9EJnlfwB3nNO3qreBXXmyymEM9mXFC2jJ5eUYHLlkawqmQYXGbdwH7nRig8/4xkp4/HI/Xz8VVtLkS+vMESs5t47nNNsJWyx8iWZLI38OEvfgYcf2QzF4+s5cv92Ri54TqW3x6FnWMFQWmMIBbnbIXkACO2CTqAtLQbhkpe0vm4XDgyMYYGX6tRy84pcHD0VH65tog9Ndw4LeYtOPscx/3phZAcexgy4A3ZXt8Lm4qE4IdoH3xa8JHd70jzVbszfGF4AfSJB5JAlhte6F1I1zX2UoOkFMzwJOo3UOSoCGucLFDGD8Ucef6+D/QoNBoDTBaxtUUByv8VB8O7+VBZEkggMZb6RbPo420NlE5ugdg5wqzp1oRHereAYNxIEN/vRpsjzXF4TxuOCN2Pq16F8oJPt9nU8CdOK2uFIvt8NIwiaFX7yoccSqnW1YNTa+bhreXEB3SWkvfc+dTiowTKLkos/W4UpMwcj7vDHqP62z9U55JDl55Eosfip2xb3Anzf1yBkIYEbFuiB88//4JLdX4w60k4G1b0UEPrIy5wbeAgjiGbd1v4843ncC9pJuxousfnFjnieM92XDruCmq3fYUDrzsBjl9A96nFKLhbgmbVCcByiVAwkFpDK++vxpqIEE7ftBSyD52l3umn8NScE2B7xRGO7jWG9qctlNOwkdsmPEP51slwTuw7zPrUTv8GJ9OW0lEYLt0GGxWlocVkFLl0CKNxfyNz7mZeNiIRP6zy54Kxq3mm8gU443Ye/nqZwuLcF/zXqom+TqnnHNEsOPRMCOUTv3FG9Rw4mCEB4V0baVT0CMhwkKOuOelQmNCDVW1BGJ9/C1d6VrGpsCHvMnmP60U2wNQQXega2IjLaiTgtYkA1qtM46kLfuLTo72gpXkf/XyGcWZPKQmHjADdoX38t6ATZqR9oPgjc3lyTgaZTJjK6de6sf3QfWwMmMB5w5PgxpdXqL1AhLSF1nJ/hjI0ZEvxBcl/dKW0HU4p7sckMXtWL9eDxZ4KtOe9E4evBbg0ZQrMHHWeN7gd4DH4Aq9eHyRhp3XwJFUbkuZ34PugIjL8bAb6VedozZQ/GHkuDQxkqkBXehUFdFuyvaMUCLwPprWViE8crpHP4yb8eU+bP278xk4t2jRv9Q9ac6gfltyYDG9yp8KzY/mgdeQRlrpqwaRro2FFxnS69WuQjqWt4i/PDEjxryLUpb2FKyceQ6pUL8YdGOD7VsfgyJ44HFW6GGUUzsPaZd3crTQDZJa0QdwGGXT7zxxGTJfHA83zaf/SW+SOe6lSMx+myjnjTwFZeL+ihENmnucNd3bCxv6lmFsbxo1+2SRnd59TrZ24YNMW6BBSgl6Pi2A0KRBvBatR8pzrVJu4B+TOdHJTgAHcEnzJZvMOceqYWbBeU5G3T95Jp6SXgLr8FeyNiOMZkTU0fKGJnNP3srWZAHX0KsGQ1QuySk7hIWNRarCdzmbZTvDr9jNaddyNEgNFWezsbgpPnw777BTpxc0KnpyZRZ6rmiFj3B148aKMb9YupiL5eNrPBqTbIAMP1qljtV88Vt/ZzoKFARCUrkA11g10IsaM1pk9hBfNX8EuVBI2TBtHRi276FE70/vbA5yt4U57xS0xYOxhnFsbilVSanxXTAVOnzPHyIA2vvmkj9rG2IBqQBP3jSsDnQe7aeuo5fDK0Yle/VUAva6rML9Yme+90aeo5IM4c6QfDPq8gHYD4CBJXdozKYJdFIQgcHEod6dX8onEfvgz0AMxcZX8q+cfrlytywIjxqJhXx1b5glC8HplEvSxg8Fjc3FvvTudMFUF2xhR1olK4Ya5L/nIlBm8ca4KpC0R5QN9RZwmLAlLo9PA4OJkct41AafrJ1Ho+DwqPfYBwsfrgNqjzXBmiS5tbpXGW7iJvbtEuWb7TPxkEQLvDiPe+f4YLpZOhkDbUh74Zwg3/pODBNknLHlmBXKYJzt11IPavR6uRy1InzMWpvUYYVh5G7ipN3LvVHP+qzWTmkcTmdy5TysV7tJWBxv+7jcRXO18+Z/NSR6fak4vvuRD0L8s8OEOagn9Qasnj8EB5ddwRVQEzN/d4asXS2DgQhs51dbi6L2+0JZ4EgbSI1BCQ4pmQDwZvFCAfRXaJOpwBTa8lsIptbr0o9MTpAuDIO1nD+xxjGYbjMWqVCMo07yGe74psP12a2wIlABzI0ksUHDgEI/N1ORihn4l42DyPRmo0VfkPZ9TUShniLvsJWCV9jRO8O5DYZUN/G51MsaPqESbO0ZwP0yUrnltxOQnkuTZq4z2C8vxmdsnPjDqN8c0WlFa03f86i8BTso3+c17Ax6yHYPRj0ZS8HpL3tQgBYvF5XFt9neecDmS1j0fDfMjy7BGXZ4+X5uBmcK/+IazHWrnfML8DHm+POISJsgrwvp5k2CMRR4pbFvKk3fvwhG1EyllRQp5TtgCwStGw8vmGtx74wzvD5sJe4TicWSVKoxbqMNL0tZjrvRh/n42nPZX3qRtNj7otlUKNzUJQM+9L1z82xOFpxuDr0wzVY/fzh594Rxg2Qw3nozgAxvSMK9OAd7aLoUN+0/wIv/tMMuumma7i5FlwUN48XczvwxtZIu2TSiWKA45L7JQu+ckTe/biuafRShXcz75NopggaUcFJrokPeDPFYzkAKXbSo4eaMMll/4w3vX7aLFmba0O/IOHzFewV80xThm+zbS7FYE/dpN9F32HQ87tPFweQotNezn32ukqUz0OR5ddQE+fBkHVjKz4ID3YTiRMwVDVqnx0a4CniehAZF/PWHAvItcRm7hONEP7L12EtztE+LEQkN6IzaDi4Pf8Q3xcJqVLA2VV6roZ7IoQJMNa2mLQnRjEs9zWIJhy+fB0nAT3HI+FNX+bcWdVn20ME8U9o8eSY8WiYHQyMNo4qNK4ltCoEpTELYU+XD0zb/svX0LNcUOYdYiVy5crwcvJ4jTg6sKWBzogqqSSzF8zmfenBkGdu3ZoC75DBa/vMS/z+jDveO5lLfqBmn4R/HO33q4cliPzoA9RI/agV9+zoO2xFS2uKgDIngSWsL7oHtPCHh89eEpEc3wSlSeNKdfwKUbL8IFDWvS6FKG/Tm5lPX9JweG3gC3uxs53D6Mj69+SGB8mTdFZDKftoKhoSkw6LOdipVDwdLtKyk+mM+3rn3kwQ9B9DFgHAqoBqD4wunU2CAAXdYXsPX7RF70vBDXrRnLhn7rKfzud7IXfsYeN1Qx69pysFo7HU7Ev4Wufam8bl0miO4Lpgf+C/no2GYMk3TmSaeVqSFCiDrVJ8DnZCOWOObPjwyf8U3Zbq5fNIVEB6PoiMcsVtp4ml6N6Webgpkwo9uWRVYaw+HZG8DpzAPas6oDO/TrweHAQnz36Cce9H4Cwj9VYdzKKoo4awtab3aS2QmiU1Pu0OjwLjjZ/YjXjY7ApWLKEOFsBlfuSVOzVhxIlCfwpuhduNm7F7TTO2CMVh4YvBHnpW+SsHGLJqTZV6JdZhN/e5DB3/yQKMGHwjR9wDIskS2633L4shQStjCANWqibH55Blg65cDD2qlYQpOxynIPTX15hdUkvPHcr3wyFjOG/Ib/UPWAEA0l/oGPOxfh5l1vcH2HFf6T8IOHLyNRI2AnT3klBBf+ZHCsah6/MNGnlxF1ZKr5DeYbjIOd8hNh0VRTMrpYhKH/NCBudRNqClrT311jeeGZPWCSpk0VwzrYZRLC31bow7hWcxrzgcF5jw94tMfiZ39ZTFn0l58ITKLEngE8Er+ABNc/grOHSljVRg/GLnaG1ZP6QK/AkIS0L8PURfJwZG42nFwjDavOCFFNzixqtpkKQslCNDRHF50jr1L/3Toes1ufDl6JIvvVIZjs7Qo1Jf9o+kMdmDa/mPwLJ6LkWiEYKi2jQyGSZDHnGbmuE2AhsZPwc5sOPlw+HrY1BZNe5yHouRWM400PcpnFXBj/MYC9V77jY9+iofu/B9xvNg7eT7kJzuYm2BIVwj3rb+DEUBHWt/5NTgMP6W62LF9vtqAKmTEQ/d8rqrywD61UtMBy1UaOqEjgSy9e8akH/+hA1W+0idmF9EIQZqtacnWoJRrkxGNL2AHwCjtDuruXgMGsx+Tm+xwaD+nxjmcjoOSmHx5JeIZ9sQrUe6gX/vgSDx2M44tHkfQkhOCjwRAsblcAUaOJZLplK4iVMU7wXkOFHbPQRqEYJbLqSH35ZNR4NhGPNgnBjT59dlKL4ve2cqQv6AxR41dDTONZ3DOkSGPu+9OCJ/5kFakIBT43QVe6n//e7QIU/EIloy1ocEwL/Zat41ORwiij+w17+gVBKnEf7ZL7RWuS51LV704uvEFQXpYNanPX0gHRWKj4cpjPf5OH1nlB+E7mMj95/x67EipJR/MvbV6+D+1GC4LXZIQfUaFQIG4GR8W76Yvndah+LcjbNrvzsMYlFH5YBH7JLjzTUJeiJx2EckUVqJkbTlLmayE2t5uvH3zPjR6FZPLcAI/sUeKPqXIY3jcLF6rPgZR782hztwmNWyfOBX+WY0noAOmlxkCe9l948Gk25N/M5o/9MyHw8BGslzbk6kV34dE4R/IdPoxynl0YLn2ARYTeUEVfH9p2zYad8vuh8MNU3OVTCoef9fCS0cao6nkEN9ich3rvHDyfE4MLrprAQMQ0cFvYBNcHO0A8px2VZC7S09nOoCn5C+9HeNDjrHcwPCQNul6/YNbqZSyx8DO3eWXiU/cLIPbeETc89CUdsTze+cwaNeskwd/Ylz69lUajW0XgYH+E6g4v45AdqZQt3ML/go7jRIeXIGwuA+ZKz+hTfDWM+ZcNsYU7cPer0+x4/g28Wbyb9E/dg7tPt+PYIxPh9qlnlNGZQSkqEaAq5EKXnv2h0B2xcKDmGzx4ugdDXn7ivv80YGhPGbcfUqOs5X9RLj+Ra4JX4dmlPnDhaxdagzOmn46HJlddeB+8HZqWrYDMlfYsVKuJF5udePfnl3QvwBZumJuz6mAZ81tFcL+YSU+730LK3jJ0bawhq0kt2Lr1IMaOm4halkUs9OweS9qZgpmsMFqsFeNfkIkJhfr059sqKuuRp1B1H5ZobcXVC6/xdiEd+J14j5o89oGQSwQ4TDiPW0s2c7LOeXhyswOCPMSx6XsvJHydAaP/xOHyzWG4jcfjmPX50KS5lebDbvQ77cSPxo6GTdeD6WfhGDgttQWzJYcpvHQA2//+YQ6vgieF1+i9TR1OEt1Gl+MVMWmnOFTa7uMWkwSK/fUAz+rdg7Gr90C53VvYU/0RbeZX0DXnZla5PhJg60G6s+caxm7R4U367uAxdhu3WbfTGasUrIm7AYMh1dSQPRFkw2yg29sG7sm95t6mIbrwFHFDyV60OyOHyuni5Gzrj9X+4v83/1dMaw8mzTakjIISfq49H3Jj8+HwyUTanRYCczsrKOzxNz6SJgTvmgbRdXs0O9ieBvsdmZiqMQ+Or7JCgzhH+hDYBH6/+1DljiycS9bk2hINqHm0Da1c3qFg/CUecO/mhn1T6IT0dPpeqsy5mYLw8LkJ1889QldODZPy8V1Yvv0fKAguZM154pzhsRmVL3Wxu7M8hHeWwTsPNy521+WPllXwS7QQ/bJuw4ygESw5rod+jk3HD9FK8M5HCQO3L4RBoUyCWfNgZqIdGukX0lbBfhrqdcQFUnYcfGgkxPt10I7Npjjt0VI0tp2KCaPcaQmZoMf4X7hs7EywVRSg+49nwMt9q3mMRR/F2MbxYBiwqYUInYl9jNYb9+B9gU745TOf3n/XBYETOnxWrApEZgZxnckAaZev4uR/+jCmWBLi9fvxyoGNLD8foXDac4rOMcct4Y3QZHmCUq/Hs5qZC40x0aONSTNwwz5NSGqeACNOrOAlN7fwroRNVODlg4cS9PhG5yFODjPDa7LroO6QKf67NQJWGPXDys07ee6ObXws/TL7rTIjpzIjiqmXoWcTx+E87XZ6ulYC9NS+QNtwNvSHVcMKe3uaMjkObdc0kfPLADby66HT0/5BY4I8ZNeJwdPAhXj5VSUKeq0H2ZdLcNW9YbwZLskLX5fS2AY3rHcUguGSNDI17IHFv99j6adEltKczSMUtsAL0Xho27ERp8hNxl0CgrCzcjvZLZXAQzayXDq/HsYIPYNT6ioYZfAD+q3uUfr7Kgj8qAFhgfOwYL0K8bLZ7DpmPpw6L0gvSlRo7eF9cPevAdLYQxQuNQ0mlhjhNdn5cFemlupWz4aLZZfRR0wS7/fEU+Oxu9QeJg3OZ6aB4SobLr7VRAfwNA1FjaTQw+boWSEBx8KKedqNGeyx5TPm946FJQukMcKkFe/6jcazod0osc6OAx230KejIfwrtQeUrGbgtsUzwSnqCl5+vZU2xG7l8RpPMCgpAF/uO4mx+7zw64F+TF57h256i0PPJsSDRc+4hefjZMuzYO7bwVe+hvDCkaZcKBgE4kkqkPHKCN7OOUUJe6aQEPlT4e8orng0AUoPp1PA2k+UF5NGfx6sgKCAWeBe9Q+/Si+DB/kyfO+kC9QelWSdrsVQ0uqJsrPeoEjEbZDbIwx5ahV0b8dF3B0ch3srrbny2DwyDNAkM80iXDTwG5PW/iDt6XJQtuA8zzyuCJW24SDtuIicpx/juPI22uicRn6Z6njocQ/aFE+H7flq0PdnJ4289QmebJLD1FmWkJ6QwcfKY3nj4xperLMbo8IYfGybYNafWlqc/IPPRVfyqDET0aisnafvlMQr08TwqM1k7PUTgTubamGDjCveJgFc/zMQxtonc7SvOU6WfAz97ftJcVczXKmdA5LWBRA4J5kyOw7A3joF1twRSW19bliRM8RC9z/wyrJm3FCsC+8rCqllxS++5tuAx+ymoqCqDUyxlqAlE/3ApPUE2UjW0rLrDOsilCFeW4dP/xpgj39dGHdVmt+pLEe3kf0w7k8xa6zVoqP/lGAo0xW+TAdyVBwJ83U7aLrYObK2ayKF2e/o9MIJUH7rJ06I0YOHl36y2JOpJC1bCuOvKNCCiHbMSq2mGoFLKFg5FyI8xSl1jBicu67NunmX6ZSpEPQ+PIu2/Ia0RvaAu+cBmD2uA3K6T/Djh3IAo5UpLtOMj02RYf+M/eineRLFFkdC+MU9qKMng2+2ONL9jUogucwH5R7F84opMrRw23UWn9ON9/oms/Krx/Bs5FYM7zwHym1mYFArANNd/HHiTTdU73MCb7XnXBJXCh0pjeDqcpLEG+sw6dJoWOHyhO96OdA5uUbOG2J+P/Ybvd1nCXd1ouj8++f0aFwU/VeqBGqPutDgxW8oV53Bp7s/Q/WltRgqf5QltkijS90INlvcimcHJSHNwxiMC+rAJrWXH7dYwyQTR2rdXwLOlXKQqZ1Cz3fZsIiXHGytTkZBl374tD4Rcw4Us4n0CnbL+Yf/HXWl68fLOPebNUysVYMJhybw5EvbYAO607XKZvz6bw5L51aDia0hHD2VBkIDVTBsOgIWX0vnP6JyLCtlSmsddTHt83TsOV6GMycb0RfjITjv2wxfUxRhgWgTlVw9xKf+VfPdnN8kKNEEHj2TccuH4/xPYiIM+qwA65PS8Fcwmb7m7+ID845Ckqs51nmr88qo5bhj/jiy+F1GofGDbL5jDui8vY/L9L6y6L+v2HjSnyuzPVDmux8uk9LjL1X2JLDTA+O3GoCG4TX8MO8efNY/RHPGT+fZsrW89vJO/G8n87nsnTA0dxlHqZrBaVcJ1HDMg+bti3DNy2lkMVTPmV2JrP6kmwIXJnGVEMKu9SZgtngZf02vxQ4NI7Z700KTQju45cElvPz8N4qYJrNv61WslUDIu2XGoVnqMOVbCs0sWYYXalQ5r6kDA7NKaaB+O75/UwNncmVBNXMA78FxnDYynnObVrGF4SW642jNgv7VHCxuyDhuE2hZ6MPSV04gayWAdr7ZPFVfmGdYbkCn92oYLHAfMqQOcvidXKieR3B1pzxvkJWh7/t/wpW5K+Ds230wploHc6WvcN3WEfhlgTA67GSICZkNAuEWpJQZSTdff+SzUw/SWUlrLPI7ioU7WvhyWyLmRElDVMsx+KOpQXUBU/HonOfcqI804J3JnqO/Y+ymMbRskz87GYwCCZ9sntTYRl9cB1nFyZ3mjlLi5Tv+4N7kS3gv5zaHes+mX3tVITxkOZflZYLK5tu4/V4z2HevpsfN55nD3/LO3Kd87lkhNZ3Qhbz8YA4vug5ObwZYNnwq1oyoJJ3zZTxSMB8OtneTw+Kp1PBoHExQC4MtKp0wtqCEBzYD1ifVQbqHG4Re+gxG1he4luNgmo8gNH5qoPwjH1i/dxkrTPAFQ8cPWDHJkp5/8qS1geFcXWpIe79KgszeDm7+qA3jbhTwV+8u3p/OtCdakRzDlnKioRre6PWgTJ+pMHnwL+e+vQOaEdUEMiFQku8JP6YHYMlUb5z7k3niYUuu7NeBrY4jUDHMAeMPOPDrsNe8vmE7yuvuw01fZGhEVT7rnBUGYSERSH76HDQXd2NX/VaQKnwPjyOOoEeRAvqNP4wrCt7xcPFrqq5UhraxM0Er5TOmnLnF3C2JDQbnyPiNGLtc0YYNk4pw34sJXHZZHjoLcll8WAUapAyoQeAsL/tdwltNLCHxti2OfBxCW1SWoKKWMmg8uMoZdZNh2u10FDcTQ50uBy4t3wmBfzspW8qcPE724s1NEmDYJ4KGfkN4pGIeHq69g/MF62jB3SByaiJIjKhmq5gOuKyhC1q399M3Dx8OXbUULb+K4Wr9UExrOQdme57wUyUzHDNqFT/tVYYysQvcJ+9MiXsEueyRBVb5ebHFDkOMuT2AO2Tu4HL+Q87t2vB+nh6u/9nEkz5u5D7B1/R070dY7jALDg6Lw58Fd9hSvB3W/9OEujo1uvSrlP+VHKXstBV0yOwt3XHMpXDjalgythheWijRD3cN6Ne9B5WCX+GBlAA8Pa6BH891cEWsO1UrOMBLh28wfoISP/whD76H/Ohowlg4O+UHZmdYQvPM3+AglE4NXp9xZ94HLnYu4tyLY0DlmAQ+GvWEnhu2kE9wLd3yK0ejxmiMspZDE5HXsH9WGK/zUYPAPWHs2huOdTqTaLeJLD+PTKYyi9Fw+oUYtdtZU1bqUzpaZgq3gppYy7EWHprVU7FJPtumV/CJ/5bTvcJRfLY+GxQ7kjnzG0MWt5NV9w84tvQrdkuZwbWiUpAUEIb39QJY8WQqp70Y4sdHx4HkjBTu6b9K0eXlPEpLHRzfi8IdrRTY7NeMfu2tUBxdi/JPxWE4NoWLpwXRq5Nh+PnGTz5Wtp1HOQyRgkMgRTtm8OxOHfQyVoGFDke4LGsBnvggT4YRr/mFbjoGn+rApVp/WP39Zvi5fBOuUZ4NC4I302ivr9idJw8elaacY6XNco9CUfLaEK4LCWWPxZ3wer0URBY3cM7CQfK74M7ZG19za2I4tb6T5jWN4XxM/C66H34E/S9NwPrYeniXs43WR0Tx+N17uHVXES/+rYAeE87DOt1F6J/qDCJVynCxv460C/05oPMazt96B+U9m3nvjc108bUy/ls8l35O1qbVOeKg7C1P385Noa6Cbhi9R5JP/HXl7XuNQfr2NWiJXQPjHRZRl9xYKBjUZPugMDqhfxSWDUbiiNd3oHasA+VdfUKV89/w+MQv5Dl6Kijd0gf7wI9YUZcK9QY70PrnH/J6fRL8RueRb3A/jPUFyAiVhG9F92Dkr7XkfLWSGob2oVfKZ4o21OEgiR5UsBaCdSq3MSJnBPxUisANZ/UhTvI/vCT2kwd3GIPEy2ns+P4In0mOBPGlt/HxEgPoiZPiSVcBAuaOoeJLSlSsE8Unozfwz45alh7+RoYXRLH0pRjogSVkxZdzUZoxi77oh7mfjfhvexc4S39An0W+NJCzGG53ToOK1fUsKw6gKjJE34IFcW1OCeGusbhRP5Ey1nbxEk9jqF2vBhLXP0DBXiswvRNO6p1m+HKEHUtuLKLClWP4Vbge6o5T5H4ZIzjcnMKb23fRSfkxaBAeRMP1kmxrEYXnK3Ppo8sy/H1Rm9RjNMDaNZFjXrfia6uNpH8olaK4EgRfOMKugCCydpiABqbuUGaoDo9s40F2yVq49joEz+m+If+NmVhZW0h+d7fBjie+pLZ2Nr9uGAWPpSeShupFOPzOFxbIPuLHkj1w7UIbm7qMJ4lNt1hncQc0ahvCCj4KGroB2G22CF/JDoH/UBFXqxrDvg2HWKu4iasObYOUAiVw6lYHDfM+8tEwo6Rt5tRpK8TYV0RJck2UNRwEzWsO47ZyJVDsSED9igmYMHsNG4Tq4tEpVnyqaxJNuKQFq06Wkc7eQZALUoVnq3woONQeBxd10JE1l6j4RSq3HDmHw5ZzYOZ3Wfa0Os8Df6bA40xpDv7kxV/1t/NhVRlueroQ9y6dhJKuWpxRdZ0CtPZAevw0UEkw5dHeS9G+7CobCxxi+6h2iBP8CFAzgCV1rnzT/g6664lBp9ZHtJoUyA7TDDl96hfu4YPwqXUBLW+vhqeiaTBW9hzteT4LRhXVk1KFBf6V+wtHNJZDmZ4Q3FByB43BGWBxYRfmxwhRavYYcL1VSZKHYujgqxIcNkjnVz8286rX/8H0tbqwvH4KxrT9QPWZBhC6axFf3v6V82Wk2fPgRIr+E8ALrhpDK9mTc+INvGrzF48HGsNyiT+g6FWDn0ru46o7U2BZ5jFUOjaaVGtmIxf4ov/CfhCuGwMnB+9CreMCfIj2GOIrQPIpN9gjqAKSvnxG2/GeOCfAko7VMNR4lYC59y7SNpTm1vEm8De8AT1hN1WvEIfGHcX8ffl3mH18FCTmG1FKwweUjQPc/24DOc/S5I8CcfAlaIASBEbijy8ToPycOLyKrIKsWY1Y8s2I30s8wU1Sx8HIUIY2K22npLgueCaxEtYoTIWCuOdUMu41PG/xwQteq8lyYy88v5JAzot0eLl6NOVYfORyzzFgVLyDuucsAIPnfXSs5ARlHDlBWbNuUqfVLvoxyYw26S4Hy4Kp4HhAlM7+Xskm3VV4Z14gvLOTJBFXa+5v+0mXIhto32U5Sr4/EXauNqdVeVl8PQfgbNMiKNr/Ae7M/0mCfvkwYtdtvl0ZxR89CaYJWOKv53rU7/AbP4u0UtXoZ6DxaBAUPdVg9e6V1J7njAGd0yDbzpykC7140t7XIJQ9gsRs6/DjXyM+O60Bby73hHGmK0BznSb4r0rj94rx5D4AmJqdync85DAnIQa6Gtvg2L7HYFizmzu2T4ZR6q9Q4lMD552u5Dq5DPBVe0NiTafxd5Enzr1TDxVjP4OnvzB0bB3mCRIn6Yf8M6pJY6w5OQU1hySx+8g+uEDXOMD8M6+MFoHKYBneoDOW+1eehnKPII4YxTDUi2jtOx1/fOiCNKcoerJ9AgxoAEioS9K1NiFcuc4V18YvolslJ7D2gQpLJqbBkTRDaI0xhj2iG7G1ahzNTCE+LhWOdXGinKvsiIVSi2Dr9d040jec15qKw57m+TTUNpuiN70lg9PbMHRGKLRYysF8y5VsK9yBshZlqKUyHiLmEAidNoaE5BgMrVBgpaBTUGY2H884mFJNgT/HvR8FjzO0Ye9WM5xlZcNm457SF9tqSP3Qi1Fz21B4dwLGe0tBr48pdP5RA9/d18j/6XdOGpXDiYKXYcXiSla/9g/3q/yg52cdOX9UP43oNYCcuONgZ19HX7Sk6dFJSYyWcOXbr6+SvLUJl70ooaUx4dR43xC0bZpZIcKLTGb5cp1vHoi4zaKIqENk3PyLInRCaZnxFq5KMoDv6ne5sP8h/awLIQt7D6xLqeUxn5p4eaQF7Xi4DjZqVoPRuhkgdzCaJu+yBvnfNbS9ygELThTQyxfeNEq+kOvnnuQrr16Q+4QxYL8sCrY5NsFpoz5ecjaL7xVsp54eW/KdJwvTnPahxvoDqM4j4OObXEpKSmM3i3LSto/jo7123CB0gNSvOFLgixC6lV8DbXcFIPttMm+wcQbvWxXQFLcAr6/Vw0tOX9gyI47ipHfx2ku58J/KLMgym0a30u6hsu4OuDglEi943cE/H2/R7qvXKFNuFX62COXt1wUh/GoUl35xRbeRWvBCVJwm2o3kl4++cO7wTDr+8xgd8P5Mx6dpg7jYb9C4dBW7Hqaz4L4yChAdDT/KzmAJ34Rsh1AKUFvDt0JmgNY3BZjRt5P3Vf/hibHNsKMzE+92bAGZpyl0TfgCf9g7H4P2zoRrm4/xqWOHudMjiSXHbYKF777DhYRcOq/hBiErCniijyngSxUokhIBu1glLgtxpy9dApxy1BY6pH1xXYYi+tWnssL6NEqfKws3vUNYfpcIHm4J49Y5Tez/fiwZB7ljgd5zLDwYTbGJN+mtqwY8M10Jd7WMwCbwFMRPuAcrHl/hFRt+wCVfJ4z5cwVOazzH/FvC8OyDGulMeoZF88/RCcMG0Nl6llBPlvR8/0NT7c2YN3kEP5wmD9/mfACzW7vhQNYQx7z+TesDc+nFy9PQducuPOwvIhs9MxBLEgbVQ1NYLlIZJASIIpo2QvBQCjrIScOM+3GQf9oZT7R+5xPrhGHGXmmyK92EZ/zzsDZyN0xb/gEVD8RQxPUokp5TyqFbOtFRcRSMOLCAPC5dx011G6Dl7DsojdoDbx+XYrbAU9JI3gvGh2VxX6wINCxsg0PrLlK5zSt6YDEarthOBsH6qxS2UgSDB06jx4yfsMJbGW4HZvKn9hv03/k0djsyil3Cv+DmEzv4bbgnGKlqkuiOJziUoABJHnNoREYS3FDfwdUfZqFyizFMnKVBoRMDYMam9VxUr0jrfk4HF/GVdDxxEMJ/S+Fbh7u0b/ZKxubneGfrYoqaFwcWatdY/5wKBEdmUiIYsar8BVKXv8/nx4zgxAQ3VlOWZ+mBB/DB+CMuRwTrzjnQOmot/nP2R7Hyn9DSGYDqVyvo0i4v8JlyDesHT8H7qSqwSfUtLS2VAQexx5ibacOXb3VTds5x/DdjCSl0SqBaQSS09MrAbDdZqlHQwARopRj3Bvrnc42ePJzAi8w+YkxlCKhFZeDigyPBaLIiLBiQwIer3uEr3VQo8/LCOyG+RJ7qJCe1A//ry6NF4hMg58B6OuI5Fi+7NfGFgzO4e9x8ODvuC+R7ruSyBQQPnlWgdrs43Ox2wAu9hhBcOgVOFAhyesJxuDcxlvP/niTFCjswftxDwi+VIXyxPlz9IEZer3JBOVaM8jPG8AGTGP53qpHG/z0AP9c4scsRBVhmrUZ+J53Ic7MdX49/TfmqqWQ2LMGn5mRjYOgSFF82HlMmTIKqu+soblEbuRa2s9j5RA70nkCiy17y/F2z8GwfYfsbT5S7PRtq9L7zk0VaPHBcBrUXLiDL/XnovasXks648LxeAZTqmgdthWYQtGQkZGEObvMaBbDbm5c+/E7ZoS9YaPVP7Em6DW7BKTzihjw4puykp5eX03uBFLoz5TmBfRM+8DGFfU39pD0hFhwOFAL90YBTy3zpv6Jk8Pr1kJZZnCY1FU9wurWLVhorgQ618PeFQdwvogU4EMw1NpM4Q7WX4098oLozm3iB8VUumq+AX+PMUKNyNGanq4Cm7Ci+1RDIlUencWGzDH5NvY1iz+6ymMkZHHViNj3KbMJdnzShqi+dFxYP8H0dUx6+pUIFh/sgS/42dQxt4q5yR55QcwGtlyL02q/Hgd4XbNHWS/F2oZxVtx1bdTo5eeJNkJrxmerPrebDUgJQvEqVm5MTaeGEkaQ+KxgFJn3AOuuTNGP8LAxv6ucFOQokZqMNzXcvY+CLb5zqEgLe+5N4hGkgrO2zh6zxilgQvB+3+R6E/duUoHWDJJc6PAbMEOPb3VNh9rVirIiSxpSIcC6J+4zhNcdwyEoU3BdXUkaBOuprp5LejUvUPvof2zs14ehqFTaQGMWuPm6UkTQV3kyYR2Xik0HzuANV3LyDFxy00GJqNb+NP84Z/83nxHdqJCgyEzw/qeKZK1Ls+ywV09o/sO0dxhx3edJVMSD7b1/JSquL81+IwjrVerYr3gquLS/R9O4AXLssQjV3J0MTbmeb2llwUTUN/00ThmkXarDMsZvfzR/kPOk9MKu1gjrmNIL6V18+WtkI41VsyH2RKihfXoMKr1xJyKmVFh5wJ4F3x7F85mEscX3Eom0mlEH2dOuSCVh+3E7frzWytJc2h54Zg8fUHPDV/sPknyLK+oPmcL9emT9NVwUDl2JqMh8Hj1L7QOTYM4qZbo1/DsuClEgTfu/V5E0lmrQoQx70N37FA70bQXTjMVCKm8bNkg3ooPSYLj8NxE+D+jAxeSGmRzNIWZRwXLgwZD3YCDIBsiQkosvrwj/g1h8AdqLT4Osjaw57oAXJ19s4ouIhrZYcwsP1l0D//CdItd7A59XCcZ7BWfYad58bnSVBsm8Azbe44e8Rv/lC52EYeV8RFy9/wga31dG8SJS99s2jnJ0Am97GgnVqPf7y7IL1HUWwflgXP/ET+vjhPVRuFcdXagvJ+rIerIlbzV+Mj7PHNncoVzbgh/qK2NhtRf8Z9HL39gCsS02BUkNNuJ16hDYNDqDhhFgo25LBOkGxEHXegz8nC3HN6z9YGqRA758qgvkVG2xKSKHo8pcU6G7IU0y1ye37Ej6esg3/S9CiZ6pRIGejClcrGzGvJ4p0zCXR5MhafH4hAaK+rQKpry6U9XAFmN7wRLdhbciP/oYLkxL4b1kBWM/LwMGWepZacIGWWbWgbpEe2bIkXBMWg/hpUyE6I5n8JC7hV5MP5NnTgjOqVpP9ZkEY//kqnNW7ST1sDKcKbvDcZVnUoShNRQNZuDZkGJa4RHBPoSRmHZxCFz4Pwad0NTjtP4DtR1bBuElxKH97Bc1Lmok88R9OCt+PkYvm8XvZySwXKwRjUhbybuk0XK/ewmNG/oN9D8S4W2otfi1vJav47yzak06xIcpQrDmRsi4lku37s1zUr49ilh7g/GYr5i+TwTc/K6DZbweofhoJ3YXDZDlhCSgZxGOQfhOUxC3CixFrsDw1kQJDV2DIkCnqtBhAXWwLn55xitOmbWX35hwwl7WC3o0nceVqEXT5bs7ZmzVhZp0WuGqXYffWfPJfcpn2ZpSi+RQNCqwfgeLzbtFzOQCjPfo4xWcWaKgJU+TbNyB67QW9mnsKPL5/JUHBl6i2JAVDrZU51DUTIx+KwMHZYSha2wZrE05g7u8DeL+pCTzmF/FM2T48uX4xrG4NAKhSgUUzxbl8VhgVtZ/G+KR0dC/tIjfT7XTz6hMy2uKLO+vsedebsfAtaSx0bC0lpz9rIeKNFlRGBHBnWQmfDD6FbcU3eeIFF/YxNYTs6afpU1cYH7G8ggfHCXCN1Dv4fFqOSmyMaJNjFP+dFojKYAbdWzLhgMlCTi4xxa1FW+Dm7h0colZBIvfSYHy1KghHhtA8KWWoyEgB04x+6HctZ/u9M/FAVQx/Mx/J+k9suWTeLggSzUIOmglZcQshumE5D986QSOCNKj72VhuN3gKLh2eFF/3lUwWDPG+kcogvjaPO+1WIElM5c56aUx/voJSeqo4R2gVLlm3mjfutKGH/02EQklvVn5hyioLGuCLySS2URnFT2VXs0WIPEqdKWb/3FaoVxSGUb3HuSq/nw0XNILbhzC+kvKBVM+roISYBRWYr4KOzxO5OkcXDMzugXVtGC+4lw5OLpNgZ+szOJ3pA7Pv3uAVyf00XuEgyXXKgbC/MtzzbmCpX8WoN/AF3S62Y8sOBbw+Opi8Mqwg9kIJmn5G2FzVjPHNS8F321NeYrgMK01kYMv1DyAU4c6LE9T5oJ0dLX01C+Z/+Q2LDM2g2s2NQ27G08v/rnDHjlKSt1tHe0cK4/RPK8lEdwrU7F5JvlcP80LnNTCuaCWXlE5H3cgjHBh8AqD1L5bNrGepvZIwLJ7NvquLseDdflrauQCSwiog8E4midtexkLvJJ5wNA5tNihBuKAvVa/Qw4UjfqNVXy7noj+enzwZ0ncfw5ZXoSR5zogPvlaAief2YcDZn3BoWgB+dzLFoB26/EXtEwikzOETb17D11+78cx0ObBSGYveb3bw4yEpMrCYRrOTy2H12SKed6aHt8qaoE/NM66UUwRd8XS84kb0c4k+Xz4ZT8/zYvHAwSXocUyfy50EqbN9LjcfHgsehg84/V8LZPtLkt23K6D36Qg8zqlG18tKLLJ5DWkb+4H3b0OwUggim7PX0XUXQOQGBQ6620GF42/AlTMJMPBrGz2JWISqjxXhUOUifE0b0abzGQaXX6fo/cMgNc2Q1N9LcrqpAddV78W3w3qwoL8K5W1kwcLxLoxZ9gplho149rKF1GB3Gyw18iCz/Q7WKCjBVe1z0FZUhies10FroSg4GdfxCCUTWie/FB76ZrPXt6vwWFYT3OoHcOhRCiZd0cc344/Tq6f5nI4jcfPubSgjJIfeqwpA/ocJNM59j00r3XHNljkg6ZjG7Y6r4JzXSFwr0Egfdq9Aa/LEjB5VqMm4gG2yAbT0egl/GZ8AG0+XU+XzbaS3byWv9jkEirEb8PftSSDUGIOV4qZ48LkMbV5zGzA2FDenVmJ2vBFW+VjgxGwtPKoqDGnbrKjR5AfXVe8HibHxqPXfANZndHLspGKob15Hz0STUbJ1NJTrOnF1sD8YqU5l5SU6cFbsOy2SnoUzVq7ES2rzqUNIFOfWaMANJXvOfxCD5Q0q4KDoQRZ/TdDov2048eBYnvS6B1652sJ5w8kQEumILXNXc0vOKh7RYoDxsbZcqTeLSx+u4bqzv+CB/0i0uWgGowp2gkQfQNKtOMi/VAVTay/jmbhg2OsgifYx2qxyu50zSQbqf8fiUYc1aPNlO4hv1qLG/7LowPhR7JK3ncdNTiJHsRF8K04HlkUd556fk3GduRYPnZ1MfeqbuDjhD1QrumLUfEH0OmFPB9sJPgXHk6bpeBQKDEWLZdOw6ZYTB3sNMnyy41/OPexSJkad4yfBKr9Kule4ls8Iv4B/Y+PJ0kQEJbv+ULoso4LYD9hxrw2vfxaHvzsYkl1/kHucOlPcO5jJizn+7TkkoVd4xccblDaZ8tTtY2FKmCQUmH/DFcvuQYr4Eo5JfMfJFx9iyjlfThp6yLor7WE3zoJOMeSqeEGc5dzD10X68J6SMavHzQGKPkvthh1846c9RuSYwKBYGfq+WgnyOzbCt6jT1Dv4l7br69HO16ug/MFaStTyZidXbaCY55D5mfD4QDTd/mWObRmDnKl8HZakyNCbGGkscV+EbdIER/ZchJdWfaRS3UrCX7/DUZKDoS/P4Pujbj5Y1Ailbml8a4M8KOd8JK+E0bxVLgO3xXhh7BYF7K/4A/oWO8hq5iESKV6BwkYMhfsC0SbsKu+2VwXdZT/xV9lOilzYTO90ftIWnc8sFFtEAU4iUPpXGkSvvKINz1XI1vYkbPo2FVPkklDe6zTIHA6FeJd4SOyfCqsen+I53XNwlpI1uHmfJvlmf1w7OoW2bzCDqX+fwIfQGdAeKAmjFu+G48PSaOk4Ad2j0uBirCmUh4jx/OVyMJe6ecMNHXo8eiz0iYezSecmeu9SDWuy/oDxuHp8rnEATkSG0eZzhxDWjUfpLFV4G+dPD2sv8t911pSruRgLZ47GEqcwUrTbSPP0mtnT8jJ6nBgJ1xrH09dNJiTR28ICj8rJokqVy8Wno6HNOc4LL8DgiWqsPFodouMewTLrOSRzPxeqM9L4V/BueNB8E2fG9OJWLx+sPRWLuGMC9J1Zi1N23OLVwzY8+dcQKJw8Bj4//4NLyjNBrCYLgq0b4HiHOHy/OJ6MU4xI6c08fDp4kyo65tK2in5a0RuNpxPe8c13a+jxqRkQPVcSEgolKD7xKL0ovktq9x7CiBme8Pz0fN65xBrnTI2mJlth+LK6BVXLOsDj6FyqKIkird1SYHtfA4W9ZUh04V9QyBsHhtITwcxyG5qkTofkf8NwqE6BiqpW0uCC+ZBzyoVVr56gsqw2zIrUgmXpy6HsiAF5blGAxxt3M0sawoxJcvzcO4cSrwiDh5QzK3YIwyhHJXg9V46mf/CgxSskwT5AGOuMX0H5yROYsHAJSu21IF+3CSBvHYl+S87xl43VkPx1BMQn36YJ2xwxoOElCvwwJKGJjyhQSh/8L0/m7E4Trl89E5wX/0dFRQ1oWVoGexsj4fjYZCrZ+YjdwsygfmUAmme9Bvm9sexeMpu/rHGHp6t/Q4zZStjlZY0j/oiQUJMIKBxIIOWReXSov5WcpZv5+9A8su6thkFhf/4iaEU2k2rBpkcR9s/zhpaI6fRzWiu9AzM2+/kek1xzca6CB6y8eAdPql7no3NGwZiU0aid8pZsZXUhcGkYpnvspCzVAdgf/4On6XrwV6NPGKk9B5waW/HpZn9OeWaAmd376NWCHBj+OQLq/Hp43yoZlvIyIzVZAOPTgzS1ZBcuun0S1lwShLkxRZQsp4/PWnt5xtYbNOZqKZ2rMoBFIUac5vENtuwqwSdy7rRIQQnw1AJccqwZJ97rwXL6C6bnZ4HpARH6HwHwAQgEAgUA9I8UIiJ7FdkjSVmZURJFFClFmSmjHW1poUR1URRKQtFOChVFkiZCkSZJZSaqe+oVmezaegE2bRjAtgm/6dK171RHFjg6RxSOzDrMAks1IMfhJKdzGBiE59HKoed8SXc/SHSHsVfdL3KZe5qmlmvz9qti8NovGSoMpsKJ/BPk8Gk/+F5N5NW3f9NNFScwNWmkJN/dMBQtDXboi8saZ+CsRDvqs73P4Q8eUM3NabTmaR4cmmcFhUOWdMLCCmRFQji1xhKnGXWzrmkWtJ5KovKiyZTd70IBq0vR9HwnX4sUhbYtCrx9WxC25K3hr3GP6dwSWbwms5Gvtmfyw59ZkNc7hMfWT4J/pg/p4QlN1JHtxlXZxJn9u3Db6XE4yUUd1H/VkY38b15RpAoLQ/to/2N7nGd/FydLHYFnuQVY8n4DWHZW8F4KRY3tL0E8Tw4CJlmwupkGfJrbj/36geS9ephuxhNKqB8iie/VGLIwCm64i8DW5l+QvsEeLttJ4I1CET7vFYoTG5Jg27iv3PNUktJ/v6Lz4TowsXIQD3Mhnl7VBlmZLRwqYUFzf/pT/X9edDz7J2VZNfF859Ewfo4neP/SoIhvZ2FoSyF4S52GmyL2XLr6Oa6+u5FHJwah+Wsz+G27H+okTqN0wAlQ3GBC2xQnMShX4NTyQT4ST2z55TXca5wMGyOs4N034HqtZtJO08RHx1NYwaKZxMu+4tNVG8nbx49HOBtAc48Ud3mVcrjicjqy4QhsCW2DggRB6OtNJqdCP05XrsDUcbogUY2s+DwItHETD1o6c8SkXdAS+oPTNivBinU+rPnlPr8PIlAbKwibvbfiUFozVLnWcMK0VD6/bwHFdDfT/rMhFLrQBfLHIKxvVoWAt0e5TWkczK7agyvqDXHKh2DsvqyHq04Lw1yV+Xz8izg8k9NHa9kUHGRFOjvyHIf+GEVZq3/Ck7v3SP3AfLDwr8SRJnIw2zIcf98XoRemCeQ9ZQqevXQaGp1+Y/ilOGqNIe7aX4I2l8zgcSlwoJwpqfWMpOD/pnGMxWr2CZeEsLrZNGvSfYzKOwOaF2Tg755heKUlRxa2K/DkjFQarSYL8wT0sShwDS1ZEcD3J3Rxds9kkKgbQ2NHfALrpGFs7lzFHmUhsCN6MS1QV4WWW/dhfXMTrHSZDAWhHdR8fzkaXVjEv1brodidj9A60IVdde68pH4NeP1ZgaJNWnB9Vgq/ym2B/Vr5qB0pxDqPN/HpOeYcvOUV14W/oRum0eSXIAexsSNpZa4k5ZSW4O3SlTD25XLsiq0nC3AC9Ws6bNlTzgvfTYRzGoNk3+oMjSYXwPVkOGZIqKN9fg1PWTeFrarHYsyZLZD9Xhruvh6iaZsCYe/BJJosiry7ZTH9aNXjvUZdVHh7DT09kcvBNtNApEMBz++ai5fNqomX7uAF9Xa4ousz/TANZufPl2lf4TFQ/a4Ji2zLOeZuI6ouE+BCNwMu1A3CphmbMXOXMH1doMSfLz+E6kk6IFa7AuTWScODtZ1wdsxbWqFXxXsqF/ApwwbKLgilyuzHHDKgBF+Uf1H9rvfYN8sORhrMRtuxMuD4UwA0RVTo9pRhdG0Mhc7RI+HA2AO0O9OYTI2doF9GggwnZeHre0c5NbCY7l+LZF3Rx7xsCYH93QGKC9KhrpZPVK+Xz5ZDCqA77yo3tE+ijyP/4MIt5iDcawAfy5eCfmoV2Q33QewXLdhqIkHnDstS0s8/3Dp4nqctd8VXeqYg8d8I2J6tjDZKe6FbYSGNFFChI/a26ClbRtZyF3Cl3id4N3cM1JyZhGt9vGifZQvGvrPC6GV+OH21A47fUYDhQhNAKqGfCi7qwufQWLSVCcVVCZUoFrgTS459hfIESbJ2CYFbBmFU3aaEW3bJg9RkYTQNvssR/6bAzsaF8CNqETaPGMRH4i9BrmQGnQxaxfBAHXYW5NCfe7vRcF47ekSeIMOK+exztxEXSNXTjlglUIjposHFI+DLVBF4KWaAb9+GQW1SI3gvqOWdyYso4/gX1jC8Sqs7DhE7iMCFDx1QsVaXkvM1uYwIGxtr+N/V21SveBjcHgviNwkJjkgxBMN7MZxTKYZKTeOo6GAgl1VfoxqrDPjxOx3bCg7hkz9tlJYiA1OSJDBebCptMvPB+zMX0DLxaBA58Jwe+xWDlIst35HLYdMtyqAXtx9sHHZge5YQG0pa0KEPWeiz5y8sviGN+SenovTfNbT8kzy4jpeExlXT8diKGyggMwu3Gazlum5/tBXvp7mwBX2HrsKMeGl4cXoRH3lvyydnC+BD9x28VqYP76kGQ6rDQz51/Qc/eq+EX0RFIPLVBfaYvILtSZomdEbj2NL5XDDyCsxwTeah5SuhTGMZXROVgaixn3HPCCN+G5ADQUbJENU0iI1mk8Dpbzxc+LKQ76x0JfvecSDTpAW+mYHsM2cd/Mj5gsIyTtyJ3yiy1p+PHumHWSpzoGuGCJhLdZOt2htYpnGfJjw9TkkHhsFjiSo3N93CiPzT2OraBl6DU2G6rjdmR/fQoyQJnBE+gM3rxaiprYQ6JmbzXc1rfEnYlONjJMHs7lx4ZuxLxbsCQcBclJslLfGq4jRWkgziv6vk8MKtrbDppThIPnpH30X88L/seLSNAHxS9QHMzq/g29MlyMjZDTdKelH/lxGwasgUTOcP8os3iTiaP3FS7Xu8nOWDF/THk8mRPXxumgq1JUrCHr06euO4HVQW1vHw5SQy1rDkhlOnWMNkCQeddIMVy67STlN5OP31MwvcMsFItxCe1nIVZ9hP4EmnLkHAQ19Y9rOVVwxNhhefRaBv5T909ioli1OCvOfwX7zRMgK9tsTTRYUX2GIfTm8vx3Gz6hg4qAb8VkSP1IqrYWZjMq6/OZK9FVopK/AuvqtXYUc9ZMNSGXhauA/Ori3B4i1X4INYFz74bw782A14WM4a8pKqgWtsYd1RK1BXWgBqogdpjtpSMPm9AS9cZn624RPnLozDmISF/D1flWKqLCF16xjsLCgmNeEUlttzER+PkQPLd9PpP/Mn4BB8gbzWGeKo8QJgN16dN45sAaO2i3xlhBD7/XoNm9/ko0lUAEj1ZPE5YScwc5CHzI274V5eCfTcq8XhmFaKKm5m3dP/IO60HO36+gZ5lC0cKR8LLSgJr57K8r8D6pz+0R8uBmwnNW1ttF11ELrrVkBl11LcUmkIn911ebujNZwUmcoZAxNxvF0Zbr5sxom5y7HNxpZ/2fyjo6IGcG7iF7wxWEQJu+LQ9K8vLt9kx2XzpmNbtiuvU9xDD07I0izZiVBZNRN3FKazdHMIL57bDxffW0BXajy82UjwCS/TnImXcNIDK1CaWory64pJe3IaLUn8RSq3KmjbzmBOfqaPRdf24oEdK2h81Hj4rv8IJ8xfyS51HZSpY4cTY9tYNmgY9dY44U4exbfFhbDtkzbkNP7Go+5WuN5tLYo1n8WppzvgzsQqFlW3giSJZtpvYcJTF6tC0ajHeFJlAfrME8H9Ts9BP+wzVTqH851oLbp3ygV+rNGDwPnKsMuwlWxTbVnYcxqtcormY5PkMei2OW9acQc7lAspbUUui9tLQ7q7GXjKIK+bZgHGTxdBiJEYvVa5wsaP59Cxafn0bJoEaOrIwRH6wEEyhZw0eJfa497B8X1CaPD4IFT66ZPyt7U8PjINR8SIQ/lLKVq4yBveTjuH9+7eR787BpCc/wFNqxUw4FwHx265Ao2HpsKV50Eo7jQBR2/QxxPi5WQwPZ2m//EC+46VrFtRzssjfmCJNsHl2L1wORJJsGcnpuf0kfb5eRSzDsC97hceG2uOc98n0uckEVAdtILwzDrOqr3NR7QEcfb499AgspM7c9OhectJnpw2jUaaW8HLhKP46MscDik1gm2/qnlWfieOurAJ1uV/xpalSfjbYyRb14iB2rMqVI/Lh4oLI6ij0B/p3Xia9xTo9Nn/MM+oGhT+W0I2y8xhcXYd2W6149CpRjRu2RmQ1XJBY+WL4D03kI0WCGOD1CHYt00bmn+Xwu+zslSo2wAndqmgWv0bat7kQ6NUx4B75RasmbIct88GkKlYzBF9jaC16DZMtdCCwGuDdMZaj/GmGr5W3gv78q6g/3kRUK6cyY5z1Pmd5zOoebqXX0TG03WX02xEW3HPqThYdHkEr9eZBBtnZlON9U8qWugGPzWT4c1JKbw9ciPVuyhBhNEokJUXY56iDnP0Z/Fp1x7qcjAiq5G6HFz8CTaDARQJV9GZ46fJ+Y0AsZEkiMfGwy19gujg+1CenALeJrb0fkwR3PpiRMMPR8Cd9oWYMWAO8dG9uBOyaM7JTP56ah+VicRyqr47T37ziD5cLwLzs5WQXcSgZlfNchl5FDPNhOL0nTAmxB3aMmZyfegjTh2hyenWNaRoagZWG2xAffQwySRdpEuhoXi2dCVrPB1Nq2eGUuXVhXBY9ir9M58IEY9vs8mN+/T7YiAv6ZiJbmMrKSluPOgKf+T59ypwwqOdBLMtYJqlP/6a+5zv1E7m9f+9YcFnieBW7oS7ShZQ3bUlrH1vDRbcN4Fdg1YgnFiJm1N0QSVyOlxc4sQBZ7+w29ffUFKjDII2rqiQqQcj7p3gDveH8H5hKT/6fRG2T90D/XtK6YLTBNxo6sUrS5rJ+RxDk1wRll27zKGPDlOXjCs5lbymM6dl8JjMFJwu0I1Kcbq4WM8MTHxNcdWD1TyQGkPqz31pzU/kKq+bkCvApLqgldYmluNDHS04sDIQbQ9U88Bmc/wxK5w6uhbR2VXjMMeyFW9c16Z3o+JAI0ELsgreUuVaP577opxTjjij2Es7eCluBzJLT9CZDbfYfsEyiL4rAot+hnLM2yoW6H1FnRGXeX5rNrw+Nxez/wSiWkoJddeMIZ9dEuCwZ4Bve7SQbsJ2fOf6gP47HIZHTLzp9vUdeEvmNQxa6LBxljl0KrnR5kua/KPVACpcb3HweWNu1M1Hgd1uKHbgC0xPU2KN3wAyBbWYdMMfN8VXwZMXGyB7nw+9PbSKD/a3UeRcH3ql8xlOfB8HGx83wz7BH6Cc3wN3TqhSWJIw+CiMIxN/Zdbf1ArV/6nDcQFp0J30Ba8nbqR48xj8NDEELNJu0qml91lXdBo8pWcYEmGHykW6IBC7GnIzrMAv2oy0r/fTXusVMHVVPEZdOUunjrmi4ixBEHquCLG9OjT+0E34VPadytaeZP/lMVA/rIIJGwBFNX5ilc8cVOkbAfVLNnG88DNo4B98/4s0Vpn44rCHBrj2R+OGkAruWUo08a8prEpUwEmRZTRKaBQe9guEd+ltJCHdSnEimnT7zmnu3lWOYvOkYa9VKEnMSCHRwy/x1KwMnuA7HzUXS9JLk824wU6c9x29BObaEyFzy0LsdSlFDec8jtyXi5ouMymbv/HZsDXUdqEAIitaYfdJaTAYfwa7gpmOqQmxr78gSsY3UKvUZdz4Uw52euXxkn8d3PLCHM4Xl3JggAqtfuyDYtNHk29JHFmlS/CasfPp55fl7H5IBRxPM5RPv4cORgK0KmY037cMh6MPTuCveT/56M01pAC9KHXTiGfaSoOyxnl86HAez1e5wkodZYxbP5vD+RQ/zHtPaZaupBC1CwRdlEB04hqcm7kVzzcvpCMRT+iTpBQKSTpjqONsnC6fjJEPQsj6tQrIqf/FIYGlOBA8AzXej4bfLvWkmboGPi07RIHFN2hyYCW/lUc42eTN/XZyMFv2H+it/kMLDomR5KF/+HjoHbvNPE9qguLYZWgGPWqxqLXUCHZ2eLNv5hSsn5mNHcFx9NPfiVdJfcNtf56A9Tt9CBQ/jtv9V9C3+WIMjxTpVE0m6ipdpjt1N1B7TiCl+maz1gstuG4iRadUotjiayd93F7Btr6e0PSmETpKn7Gg9B/Q23kH/X4bQ6GfFmpKGKBDeQV5/E7DSX91yGbaez7x0A+nNlmzcbk9NoUDzLDIpuGQ8TDnljTF2Wzilt5zJJMixfciEqj+5j72ahvmwz4CICA3DlddKCbxtdVokh8B6nN+wpfYIBQ+/RcPP7ThrzuNSeqfEEhmzsDBvpGw9e5XTDzWyyk9n7AzYw6GmYlBe88jkj08m+736YFroBLVzXqNHyTfsc3D4xQ5/ikuSdsDLiZyXFR/GtxbgNpPj4e7w78wYrc139EQpKxvfZjzvRcUv5lSWU4dLpt2CxpMp0Otqxp06b7DRNm9YLFCAj9qtOCZud5g/OUDX1PQgwPHTOi4QREct1WHOQNWXPnPhpqFUrl5oxG3fE2DCackaJ6CPx29sgGerP+AVlPlYNnzlyiTsYZ0RzdB35FxVPR+Kk6bU4/j1+8gW/dEcOp+T38VReCf0UzwMBrLdX3t0BHTRkeGfUH79kK6V6LHS43tYKflDW7dJwD5eW/ojdooWKNujUtGP+M/VfkYJKbITq/2wmivHJT41QUGsgDtwZMZx4yH6XunokzBU+7tHUTLcYtJ5d4w51l+gZeB/zD0ig78S0/G/QFXyHvkflDerUU5zk8g5m0PaJ7rgCwPxJHeAXxqxFhorbwBCqs+gkWFCz/abc0zuzNZLqOD57cyq4uoYbieKLr5ToSk5F/4xfcfO83z4+sZxXzvsCOcW/2XFizPY0fh8/RWMZQflwlCpLwRr3s0HarnOdKREjmI/vGPtcTX8tpMO+ia30Ov6A2o3pWEC9W3qduin0Nn38BCq3JMPzQWDoWZ0mupTpIJjAA1rTlwat9oiG3rByOFMLx5sh0X6+hQUec0OF6dTBf8CnikUzsNHNXh9eajofSQDvwd20pXgwS5zW0qvk7I5R2iQihnthUNjI7ym/oL8J/1aCjyXAWHw63RcP8c8lS7R+OT+0hEIAtGORSw8DcvDPdNRcM7ZiD31Boe3D3GZuM+k2WHN6mb+tPOYjt8JtaBNYde4JjZ3znzPx0IE30J/jciOH3hOhKN2w8S8Q086sg5zq/swoseJ2hJVheuaVcC95SD8DPUDlf4SmGn92y8bJNDx/OGWFLcld95D3Ps52ZcmCQGyzcHYuEYE1pf6wjusmag+J8iS123xHez06l2/2a6srgJeyMAvD+NxvSblmSR0snRVw5wz/trvPt4G577/oDLPKSpavZJUjw4Bpz2zGTX2jSuX+jEeR7zKctQjEp9+zC4IxO1Vxfy4Z+ObKkkAlNcjWD0nzWQMZdIPUoej8pchjMGUlS8agtaRfri9EAAQUVD2JqYBL3Nj+iP1zXa3lgEMpuv8OLnobDyzAJclnoZs9b00t5jYiDlfwRMHlmQx9Ze3DO4hO5oNMA3ix5MG/MOxg9MAd23d7DC2xoOeC0Ax49n8exrhGNXDXnF8Aw0ve+E/Yof6cnKl+zwZx3Iq6vCy1cekBuaA//m/YJpPa4sLimL471n870VuSxXfBXvB8zl/EdCoDpem2om+GH9tAL+7+5E9qkMA9Hrwqx9Yy1kz2mH/46ncrHIdAhrek3dH23x94bH+Gi3H2uGd9P2vAFWWUG437sFOq3/kFUiw1XrAk5USKQ4PIhJNxCTwv7wYLYB1k6xparnB/C8tTrFfNaFy2mC8OrbYXoi2o2vjNQ4LKCQm1/vY2nDm7z61WmMRlP4uNIMuFeTzZ8eIDFlT3zqEQiVv35S8JOvKOuUR7udfvD2/+RhoGQqSGn/hj3Vp2lUTzMV8S/4eTiM/EZYQ7PGHt7c5QKOYdko+xogfYc6V8QDLjjhR6brv9Linx9QIWcF/LhxA293H4c9z2ooqFoCfv2NRp8XZ+nm/BPo9rcAJ1XEc1j0ILg1qMAM0wYaY7EV5s1DUB27CY3FyqHjxyX881YU/rnMQnmvP6DucZPix+RA2fBMHvqoA0mZHVw83AnLbX7gifsHQG1eAUfCQq6pyMclhedw1PTF+GCVODxoXc/fb3gBm6ixb8VXSNonB6ljjcnp2VWo32sM0uCDjiLjYPGZfvhq/RjdX5XgkIkB0M8T9GXDIdq3/jeJbNBkHpdI631U4PDvHlqWU8ie4jPAr0OTWGw3325UoUcjXtKeGf/hjp2mbPNMGQznhUOGrTYYlLbidmNRypizEAveTuU7QjdJVeo4Hl8gS8+szeHB+Kdw7XYfpZRHgrCbHLuNXw6Kgkv4cuZ5+KjXxtlz97GX4ygY6+5Bza75HA7TuXKHHFeP0qW+kp8QKDMVdvm/Bd2ea5SrKQddDyxo4PEHXPC0HQW+WMO2VmfueOdOyeciWNxcmO1e70ODLgl4GG7M/Rc1+HnUdSrUrKb5B//ggWJddjsjCAHv7cCgzwd3fBWF+AMqPOrhIwjyqKelMu0wNW4idqpYYMDbY3hk2TZ6su8PCAbJQ7BsCfsfWoTjH27l4lo7bt1oBTMaqiHfZTynRX8EpTnjyN9jOkwueskfd23GEVp3oNw0kdUXvqSoHwOceSOT3CKPw6Efanj7pDTEVhTR6GJHGO3cCOsdU/n5FBsKCbqImh9V4ZtxJDo96wKrDePg/iYnSGLggDxTfrGjCchuLskGG2ByykQ8usKL7WU8SThXE5YqicDEmVrk+FKP1w464cEXpzD6wxxoLvuEDQ6qkLxgCVxNEoKyr9cxUO4hT1D04nILOV4mM4cHloXA4I4cfKu5HDobTCGvWgfsjq+m/8booseiAa652gQJ25M5XXYzvJwqgcfXEfllEzkNq8Djd+dZz9KNXBy84MMYDQ4RfAVzyY3Kynv4XqkfrBd5A993EsTpCFL/jQ8oOdsLZcr3wfuABL5foA+XnBTpwZAu6Nw+woMN4lAlfIev0T3cXv8XPJocIalcEu4ui+UMt81orPiTBEd5gUqSKezX1WTZc1vhTsBezjLfyZnjV+Ji8YM091QROputgzlHd3Kv3ERYFC/FtRfmUZznDdC4egMXsDf/cxDg7Dm99G2wCJae9+PXWRPAU98BzqxmVPS8xZliI1kheSL5TMjCgy/84aLSNjK9eYuXt04AhZpwPDv6I1qsVeYtz3Jh0+clGBx4jW0S3VEs3J3/lK/BqFoBWLzyAFpM7WKthXq8JKKLhbw304REBWw4Fcj33ujwdyUVzBg9Eh4GalLyjk4Kyynjk1bxILvGA9wltOhZgTSm+szmzaqD5PFLDj7E74L9R30xIOQOyJno0fgn4nRAo4MicsazqkgWfsvLptmZqjAj+Tpd7tGhJy82kOunSGo47kWjI9pgp8AReNVfQP/mLUCF8QDbbQeo+oQsHFowmrxDD2Gi0is+p1pCE8/44hMZNexOdOLnk6VATHccKYxOJBuPKoblxXRnQzkJ3BKm6MPXsVxgPq05/Jf9xEfCiidVHFdVTWZ2nlTzRJ46bvXR2/fvyP7QFhLqn4xj1vXR3VKEZQFm8KC9FyqD5QC+9tG6RndWvrwFm+bZYbH/fNy1vZp7BCdBTFg7e4QEQa+KMzTs12HdhdPxWaE+jzH5i/a1y8ApqBHNw0Xh4plSyNlrw9qyLayuUQvVY0LQfdJ0cHWoJvcD0ezy2QYtnUUhVX05JrvnwxzR+WyRtQ+tFybSxdY79DFOnx5lvybzrCMQslEOFlklET9ZSo+Mg2jG1nP4ZXMDXHl+jo+oR0PeyCMs8W8xelyYAG3rh/DXKzHwPPcEXqsPYHXdMfA49w/7UYdSbnpAjFcUT3O2BH8TLZLYXAQ7slNwr/8r+hZgBJkvhyg+dCd2DjdDk+sGrhmUBbeCM9zRawKx57+AQ40mu+3qZI2AW2S3VYXWBfjRLksrSPkwAs7vTaYNfS/xdFoc6y+/wjGCu6lBoJq0Ewdp3AwD8k17zfN0jUAxDODYvgK0e/OSSgZ2QavgD/Su3MHiNs0kPHUWbn//CVsHNKDZvIKOzQhFhRl/4XZrGeh86aWjqwPQOs6AIU2PC/bk0ObRenDL7xOf3XaRDf+YwRenO7C1dZDHhDO/0ukn5QMtdCfiHUKmKKxbfIfu7JWCJiNHjE/QwQ25q7F2pizFi+jyCt9K1jO4h8mVJqDvWMsphUG8ZPIvwhXj+PDCJ3TY9Qr6rbrOsdHFULrHFs0lAV6Ui1N+tDv42hThQYkmXLFCGzffDEPel0Ig8JUqH4bw2j5RqAhKxZN7JKhBNgq/LptPFye4UKf3czKb6obXOjtxefBdKn+tAAfD3qJzlyqGtoqTXdU7fuKnR0em72XXmWPRRTUMZQbnQEKuFOzePYGcN0dA7dTZ2HlTlrJuuGPFuItQp+UEOq+mgPWUIu6M0oMDMevB7ucNzo8IhK9BVtS1Lhef7etm86pZgFvzcP2nYio/qw4PqwZph9FjvpxpRN3Bo/ip509cnB4LnVa36bZHLGsEzUYrNTEQqPCBL/fH0kQ5M9wwt4HnVa2E9Ra1YHl0M01/+Q5zr3/H9FWmcNMsA41WX0SrriU4RjadVWx+0s88DQ4ZnQPHZl/FRROWU6yyBGToxRC+joDYfn108RailzqmYPhKDm5mN9MevaMs+NsehsYowoFsM57Ruw2Kgnp4nfIVMJWdyeM8rrJ4sjYmSurgi1t/aUyUDHwd+YAt0hJxvYMMt31YjAdkbfiy/AB7mjykVXNnU/bVJij+oQI9cwhmnX5KEr2XWAnTaHh6Dz3oHMvvhedTdOJTWi4eCqPfysLayp2sc8GSD2/dQM8fCbFeewHVW73DHTVBJOExkwRV+nnvoAGoScSwrtsy0Dq1ERL6Q8lsuSLNM3Dk1Gu7KaujntxyCvjCdFn4t0mJZEpfYHtuFEhXfoM+KwGsrlDBIXdRSm7fzw01ljCrmWBirDUsHPaBtip3WBRmCIofP0Gg93hc8voL3Bvwhj9SW/jA3zFg/BcwxCKKdm0YhaIGNyCpPpVytDdRk4cznwq7BusDo/BjyWQYdP8Ap4wmUk+IGH9dqs/t9/6Sh1A5erhf5NyFAtxobAzX5hHsMCxEIb0SmFa5hONdvEDz4gkqdT4MDiprMNVeH04vWYgxwdawpSwI6aMOB17UhDbNNLa8uBM+HPuJT0NG4H+JO1lxeg675E+B+Xt/oItFHabUBeOG62Phu+1vLtiYBY7Zeym/JhpLthnA0jujobGgGcd/lYStM3WhoHUetR56S5tiDmDA517++juVk6c4sW+pLpDsMVp9359iT76E/mVOVBZeQS21xzHl0n4S+uSJ9vO/8/EABejcsw9rLgzxMh0t8Fq/jl4oyHPl/lc8DDmotT2aZtaasuwEMXC1+wWGzeU42SKehDTXsH3qCW4Omczc8w5FskVw8d0Oan4zFv7jEhY3ywTv56VwXus8Sen+oZ9je2H8cy/U9BOAd3cqqPS9FjyJUqDulBrICxXltzcMsTLKDrvtguHb73DYcmYEbBX8g+YLtSD30lX8b7kxdQ9J41HdcJwmmMjtW0aDt2AbXxmcwg/2eLB5lh4YnMmjq017WVwhCkIPefJm/kmzxZdDwUM1vrrTgSdGhNIcO0NotKxHiSolkGm+C2dmTcXifd4YJWrJUbFzQb4znVLWjOfCE1NBsmEBidvpUddPVbSdG8nGB/dwtOdVqDsZgddPfgKb97N5grUcpPq4s7nnNa4aS9DkIELfb1+DmMvdtH3kUpqpo0ms8Zbl14vAPMHXaGouhmWHTkPhkq/kOvwaa7J04JbdBRCOrOfWLfHkVKoAk+YTK7mUob/JDIx4fhCzpz3ioXMGrNYXTWfdJ1Jvw0iQt1cEt89HMUqKSVX5Ic38Y8b2r9fi3W/+fPSzAu50v47VwuGwsEIRWj5Hgtl6hGcPT+LLtTp8W8+Ka0WuU3tgId+9WYF++VE0x0sQpBvuYcWKMOiY4gGunpepcsMPVLR6iVrholTYbE8JsSdga6QY2EyxwSKLVfztcDy3yMyiHwUOZPG6DmOTN/CuyCKaKuzFAgtkYJGCI2bN+kJ7lguR4uutNPNxHl+Jmo4nF5+jGb43SS/6M/87bwESexbA2Jwm+D3UDna6ApRwuBofr13HiQW72OTmHxRzfMARc2Rgi9wdirdJR8H+Nnr3diMMZ6fB8p9vMNprPt7tdsalKbcpNtoELszcSAknpPjLSjm+MEmHZ6cZgWreAJ7d3chxi+No0lkX/GCuBXoH02jXEgWYdSwcFzzcwFeW6sN75WW0zm0xNBzfzVsFXtErUTVQeNrOYZZ1GGyoj3faRWh28RGWrvnNxpMP0OMjv3idgx6pxYlCyr1AaJobTO0LhYDi0+BQ9DR6NeUxaj2eBjuSpbHr8yL+ZqUCQRnemPxiAqnMLqYyh2FMM7XFfdfNUE6wAyu+TILPCd+gVE0B4uvn0TtPSSx8oAL3D57ljS5VPGPCatr75yQrvRomOdUCDAyRBzXbnSjI+8FV6CBZ75+HbfcecX9ZDx2zTMSvrl54+VUXCMZIwu28u/BwIACGZQZ48bkoHm4LwHt7JlJ3SAduzCnkwJUS+ERbD2LUDPjY5G9wt6qTco2e0hXHA3z0aCvczPpHialZZHXhC+i5KUOl1nuaf3Y6u+cHkHlZKkRMN0DHHGGGFf5UJ5eHsaPmYcBuUzDbcQjLP0vwvGorahnhzbvTRfAJbsSYWZLYsGEC9+UuxGBJBfg7eSXVeprhrrDpeO+MEaQraLCF/D6oaVuJ914psIcjo/R1HXgzzgh+Gavx+NTtJJ9jzkfa3Pi3cTmfrv/Kv5zjcVnaEzD+bQAW89+gu5sy9SVfg2slunzXj/BhiRrL9JrC4KzzXPRyAjnr6oLM9Ulks6eSTs/tQH+pfoqeogzv5I15YJMPy/iNxG8Zh/heuSz8eSWLNp3/0UX7hfxltTkOHYrljq1NVBJ4knemDeLfkFnoc5ug4noX7cq1J7X+TzhgfpxE3AfAXfIDNttWgsSrpzzQkouZSyUhPzSJuxIjScfqBL7ZYMYX5fR4//QFoFyuxymHiDYnjKLvB3RgXMVD+lk4lyycGvnRc0vYZnkKvyXuYvsUcVqoo4HZ6uLcMoTQ4z2FFmW1QMlPPzyc+ZzDKk1AsHonqnTloG3NC5p9Mwz3XxSE2GujQM93J51DU/i1JxPELoWiam4dT7T/RwdH3YNrOe/okZApzO78xpHR4bBhpT0KVm5lo+qrMLQ7mAy+ZdCH3Qfo9pvj0LBDAK5NqaNRD79CxFUl+txdyZc9VFHl0XN8ttKX5wzG4ayNObByljLcWvIdrLQz6WxYNTsrz8I83fssY+FByyyegO+uCmryjaC0LAMouJSB5rPiIOedI/fN242O7uXUNl+etbWice2SRjgYYgtUTpD6KYHg6wz22DuRLepKeNtOIdIt/subv26h62ZV0BucwS5D42GFsw0/PLsMhOf/onlWqZiWeIf1RhCJduth5thusPrWS91WwjBn5h/Y3RPOy/qK2FKUWeb3HvrQvo4W2OnjhcZUTpdawqbrdSFocBV3lX3mjMDD0H/oAqidWQMlGd24Z8ZS7Dp4EJ2+vaBFPwRAyeYYvI97BZp/R/LbuYKw1UYU1qZqUaVtLZi9eoQ7V40Glz2i8OGTKQUs6qbVKaNwzY1I2Ny/HSe432W5Z7WAHgN8OiEBLVEdwtotoD1/Jdt0VvGML+L8vSuJp+/7C49fLqCcyAgoO3oEX9lpQN/GVlowKQCcr+0BN9WDZGo/DsVv2rPE1gSK0g5AV/U9EPtzImiVllLqNxn+GTqTzp21orOb0/jaPVkqeWFPgnL+dGmwgkLER8LiEnkSfTsRrtoNodoRI3j3foCeOPjAyEpl6lRTo02/K8ny2BSIWd1Gp4+c5tXtJ/HcKQ+edO8rCYgl0HoaYk316ywV0whx0xXB4PhcHiv1l27oHIO2F5bs9KWKJyU0gG3VGdx2TYs6xq6g5eMtIX9VKFnHifEUsTCIunAcZ65+RV+dw3lNeBDxph4oveKJnj/1YPpBQ4q9JMU/HQoZg69gQP0U3P7UAhbp3gZBAXl6et8b0wangN+FctLctQ8thd/wI+lTOEv1JN8z/U4Xo83xcOU0XEHq1NejCkuuzON6qb/Y3NtEdtZH2WVuMS+pc+RkmToeePuEBXzHwPu/ynAzfhwdfy0A1fKTsTxOgPIs9NnfZAD8t2nT8ivK3PjEhxbPF4B/x0/Ans+JVL6lDOcsU8JvO3PpYNhTsN4az97e8/lGvAQoBhuDqrsTnvpwmeeqTuLoJA38e3w7Lij6RYvqJcCvWIHPtE/EiyKToefiNNR0E6A/2cJ8+IAW77iiwzPPrMU4Z1eYsjmcjXIDcMHdsaBeTXQ0247M+6PoyaTLaNjuSJ/tZCGyoxBK1yyG0hXTqfj0dFDSrQBLD3HyPW5Eho4JaJg+jqsHpnJW9W5ccHknFD37wX6/x8OXiNHsmS8POm2zeevG/9AzNBiVs26BsWUikI8jXRTwJZv8SRD6Nx8eG4lw1p0E3unwjv5K6VOPUzt+6L3DDnUR6BkqAJt0VUH3tzXWeqzhsldrKO1sEMtXAb6pd4cD1ipQN2AE2dccodtSCaq6TmNjXzg+7c3nHw4hYNzTgauqn+DG23n0Vm4VJPRPxpybJpBqhZQvbAl1Wzzh3ME+miDlxM+/D9LYSIToRRFUkbYPBCzMYPyJ+/B1wz9w1vvGuhZJqH3zPK3aRiB36xhsCzej2adb6MoqaxhYaIaii3vpj/9egE06oDGgT5bX2tBs11Je0LaBj+e6w45AK5DrzmalEnfyWjuWfcd5YapKAi+PckCrUe/Ab089Stks4FIJSbi76zzLmQ9jkMEnhmpdGjDPBNJxo671Jfxvfg5ljAjmW39HQFzyNoAzYzF1iwPY1LTDloBSHlo3Fwy/1ZD0r7+4vNiehgoB1Mpb6GmLP3VMDsRYi5Ns82sX9YZbse9oNfLfcAEE2h7xlpvGAD4faWnWPFArv816alFwY6Yq5r0+TbQyhZ+rFuLJW+E0ECMKAWq1cFD4GeQaukBjlREs19QBP5UOrh7WZt8Mddqp74qPro8G/nML59pJ4Pnrnnzv8HcaYzqJnymPpXMTtrHss7ksJJDGk3xHwTSbSNLJjoXzpYYYnf0DP2t+JJ3hUJxx8DWvdAmHhN3/4Zt2Bo2DfiTVfJm2J0Zxv6cGfIwS45XxWYRKpmz/pwfEC3JZTUkOZu5vpMej1hFeKKZ5M17CyqwDqF96CJuj8tG5/wO7OQRxwZaRIPj3DwRI2ENI0xRo9RLj7DJb+BpQD+ce7cCvWzTx38lcuuIqCRlPT/FTr3044/JHKhyUph1rpkP6szlw/rws298ZoFicQ1EPhKH+xVaYkl5IayoOcEpyPlaW/cYxVQKkYyTNd1864LHNvRh5UBwqVvlCsJshNxl8x+rbHXCrbxjGlhRTvQvj4KNTuPHJK7baNQmmJgWhuNsAtdzV4aGMJRhTfpvnQQDm+N8i5Y9poG9xB5oOm0B4Qz9mm1rSGVshMq3fQkcKDNnWSQfktb5R2vAGKLFbRY8F5UAn8RRNvj4PjjzeSuOuZ4BvZw5EzDoOUac+gbN6OPg1lJK9iBooeqvz1N6ZWFF9CPvX+HL7KnVePksRel+eZy5cwpZ1N/G6owXcvT0aj9leQbHgJsyzcKCkXf/o8eJ4eJgrD4UpD1HmeQ7/EgDYf/ESLfsqy/aYAFN9XtCp/EYuzt2Hr0TMqdR3Lb3saYJXOYpwsKgUL9y/SgM3XdA7Uhi+HFHiVtlD7CBTgh0b9XHCsqec26IBniVIwkX7cblPNuYX6+J143bIW/GARIsfwXm9SC5dXkqCruIQJh0HEhf+ksF/gzDz+hFIuGcN5Z3ZeC1sLnxOGQNGz/RRboIl3BkW4aItCvQlNQo8XnmzwwgxSHk8HT3NcuHhuHFkuvc8ROUJwY4TxWBuVUXSSqfB+fQ5UB1XBHEZJSD9V4L8freyyuuv1F0jDT0zr6B3RAxKryhGaRlN0Fl9Ei/kTsZ7i3R5v1AgG+q6kIOlADg/nQhJid28M8cX3wwFw+/bO0HTIIzVD+lTksVe0Nx3EspkDMFnXRq3jL7E1rLfMOSODiXPGoVqbx8w+TvQ0/vn8MSqRnoiPAKS35rB9z8XQfx4BF823E+btllifu4W/PZuPi9tvcXuGurcfmY6XHhqjc79XoRXTsD8aYUQnmuAzg1LcNKRl/iiowcsN8bxrk45KMjdzIGzbPmHzhu8OsgccJs46MxXFNMQYd2q3WDzyJoWDcvCjLs/6dVcY1r5awCrTbopwakU9U/+4tGlC2F3TCQZztDGJsNJsOyEDip4zIa/U2bTofUILT+2wNymYvi8sI7yJhxHi9VJGKosAitNx/LsFwrgWZIEIxtuUoR9KKwd/IpJM5twZYcMmHlchuuTzeHstZP02dcArz8Q4s9inbjTfglKKwaTfs1iNMnWIkGhCfTE2ASO/FNi3PwMFB9NgN7adF6TbADCQ1nwrsYd9oScJsPKKMzsEAWx5M8wNrETzbVvgbrwR3pe18WdCx7jgWX7KOCRIzz6p0OXa8VgtdpVmP9Djw8d9mERQzPY+2Ebf8s7xjvm+4Bt5FG6JqZIffLKMEV/BGbN3oCmH3+ShPkb6r6hxFXzRkLF7zPY2hJHKDqJ5M9NhK4Rc8D9yhAM74tETL/Ppxs8cH6qI7p7COHUD+c5Z+9mit8rD3jcANzkb/Cb0Ea8m14ErwvXoLX6XqiN3ERyZstA3lkS1x6xhKMTL8Jfo7tkvqgAeWI9dumvo4H5b+m07gssi/ehJa/cYOFyYwi9cwAqLExBwWMcqohVcOuex1j1YZg2aY2l6FnO8M98OX+6qwFeL2v5sFwtdXquxpUzTDglai7aftcH2++OuEKmlo8fLsJzE5WhtOsplHtO4mWugKkyh3CMuT2OOdKOj0d5o2ipCZ25OobF5abC1eHd3JD1GaYXbIUnRkfwwRglvBksSX0Db7jJsA4uvn4Idr8nwf7cIk6vtcQ1hp6kUDaRWh7as+D3RbxxWJ2jpwujyKx0Wq6uBsZPhOhjtAv+3ezAc1Y2oKu6OpV3XgdJ1SbKbu6mESUxMGQsCmNsYqh6zDeYeq6D4kYFQ5tXLwSOKUT1a1a01+Ecp1R9wCn3BGG7wUN42ZdIn5+/pb7XGbDbfyufzV2Coe9b8fryG/wlogN235WF6z9n8f0QgnTVC8Cn7XFutTbKxhbju7tvabbXfC5WYEoKkwHhmWYgnuOISwu2855IHxIduAKaSdqsnnqYXTa6UWjqPgzQ1oBfEjpQ+zWbdrr4QMxdL1puWInaEV20bI4x582+CWuXbaMpvWIwvqIaN22XxuGIbNyaIoexZaPgv7nDqHlKAdP/DaHtkxnU0zAJbLR68RXNp3UL8vGTbQjeqzxAwV6pvM7gCDX8HuQNzYlsddgUggdb+JD/TtrUl47X/h0m8SEheu/4nHUkV+DueRqUHj0aztwbB64zWjl48hMSXX6HRw4r41j71+BXdBUdmhRZ6bEuh5ZkoWOzMARkWqJs5gR2T1nMTvXt+CNDnMUNTPCETgecXiwDPFudp3ebQ51DMdYePwPXkj2x6bUU7bawZ/8/ypS9OoFloI5b0h5D2VNpOOZ5h2Ui3nB/ug+0Otxmg029nGj7kZSPjoQ/lrN45Py7jHZSUBX7hXN2aND3pQupIT2M7nu6wSqvS7xh81usMf/IBoMH4PYYIegN302x0l2QWdYGr6UE6It0NLlJifFmjzekMFjCt56egmkSoyHjz3WSmWmMg7bFZP99Js0qeojCLUoY7rgdXBK72Ko5D+1TFGHoziM22P2TBn4o4QmTjzR19xmSNFpLjt+2Q7LyG2ov1OIAcTH4/sYLFT2fs3aSJ5w/qExneo5x8t6X4Nc+Enz7ovFOXzKdyhWG64uCoOfQY6rqsOBynWAWOnuYTpxJ5qLmbjz20ITXucrDuznjIKD3Erdc1mF7nxBMzmhgwcW/SMK+htedrqH6u5Wc/HMxbRYjmJavSquNsynvsQbo7HhM6pPLQdHwMjw8uB6fJ6SQrOMD2hAnCvUheeD/ewt551hC2ZMR2LwymT86HOYsrzUsMuoSVfck8nZtaVjheJV3XX4C0WUjcfsTNf4UlMbyDfl4P0acW1K2QVcY4weaAu6CgRhW8gm0jmriUIkCbloaDUKf1oCYWgFNDcmAcS23OMHHEi63a2PQi2W8aLQV1Pk1onakPWb7d1Nu7CNcfPswZ0vaEwSOgkubPmCG8w/IaJkCK18cRYG9e7k26AWl9uRBTUIJThWP58Sno+Bz80da5/GQs7bOonEbWjGtoYqj3WfA5TOz8ECJKU6eY0/jMpXBUOsH7NhugJKl7eSiHgjbL1SBhfYYaP02AdcfzwDnFS5kdU0X9F8dxHjvbBDJD4Ovx55iW38txdcuAIeuQCx3zoLXn0L40LZxoPlGHW2mLMNNL715q4skCB3X5dD7n6Ev4R8o77yKSy4SV+ZZwVwZQY6IK+Q3UjUoJT+ButKMed0uBWqar423d9+Cqsqb8FGUId1AFXbtmEOVnrcwcKQVLVIs4ymJK/neWW+ULFoJ7Z92cUKkCmxUVSXjafK49dBbPo92mJK4Fs7uWYbXC4S5xsuKvPRCIC1TBh5OGovWssm0VjSFlPPXwpU7QRSwWwXnlUmx8sTZ9KhkiIbum0Bm1QKwWyPP4t1hsOm7Hn8qeoDpfYZY+ukii6tGwcv2bvooZAwnNobww9kfWe+4IF+cGMPWkWdJSS0Fn+Ulw81CL355eD/bSQC8bwqhsOqJ8PdJCtzwk4AD3ofYbGABGbup0tEjMfRNqQO+BUvCqiVPaaZBLcXaD0FHUAM0nfmGBhs2g6jXLHz7eALpx86kXW1CcG59AQklX+QM6TXsKT0P7rcWsFt4OipnTKBp/apU65eCER4ScDMpBoKez6UyuRk8vSYeKiu/YdrwGeh3/cET4rfwmwoDnLZfBPwNXpChZiNdf7mUtoXEcd+DIdrn74+KRw6imPRxBtlwFmmwhsEZv8jRRR/qpqRTaXM/tr+OxpSp4nhntzupV87CmYJL4NpzBZDMtuHR93Uxo+gsqBk0w6aqFhKaGAzVQSVkGpJCPicXwYIbQqCitwNvmqnSj1EDKO+kg9/FCC49O8E1aYbU+8aBdS+mwsvGEVDi0QRvojLoZNpe0FcQ4WyvT9DU/Ii3L/oOAnaPwS1TBYbkR4LfjedwXe0v7C1+Q88SvWD0CX+ccmIrXZbdgN1NW2jMlhdc6mMFJ8e5g9ilYdJOCIbRq5VwQnsbhvmvgmMGiXTOKJC6bbOQIlVgQfwS2BFrDa2zk1G6UQfUF5/jFWLzIb88GZWK2uHoKKI1YeMh3qCWSha7QSYEU9XXJVS78iHWeodyveV8mLhWFczeZsCfCZYgdK2OvX6EYXr4eIjq30tXj32Hg7dNSeZtJMkpW9PhHy9g5b8RkLD1J43boQ7DexVI4HgKdzjbc1HJMpj32wltz1Tyl4uCEJ4zFibZDFG+/j4OK3sG+zy2UXGmDM5LfQiu2Qv4vd0a0gqXwzdZarB/pABar5ekmqOZ/NVdlBoC40BymhC/XzyFN2tfozUiF2D0RVmY8cSTpzU00uy4cLTdmY9O9pUUf3cl197rho8VqrDI+QJvcraALSGXUHd1KopQI6YXevM8pw5sXmuCu5vi+b+5gbj/SyzjJmuQ+H2fneS06UHnStrxUREqdf3Isjqc5As2YM5OTXjw5D++OEsAzlj8xc0Tu6lxyWJctDcbNl1YilZjnnFYdzZmXAmkfIkm3puqCPJZr9mv34b08tMhqLmI8o0TaH/AJBA1VYHKKiOetfs8mmeNh6n9b3GvXB3ueFEH6XLlNNpVGxQOr6Pcvkc0c7Im/0pTJoujoqBxZB9e1z2GU9VOQabjNn5f/4ZNrOz4WsJ42nhmNx6594QcbRnC9DbxS2Mbqt2+lkT2+tBC/b1w8J8nfT/lSK2ZF8By9gjYUiEFa5ybyCB4LZ3wDmHTj8U0S1SPZso5UufJSfA/cfe5D4TjLwD4O6SIzOyIKFtWdihRiYpfGSVKhUIlJUU0SVZKaYqoFEp2hYikIUqElkpDVNLWOJ9zFf+reF4+12cVQNz8erZPUYJ873Jy0JWE7TOf4ZthLX42x4GFV62AGVtn4Y3xQVjb780eK+Vh3IX16DJ5GPaVyuGSPcOwLVkIt42t449SodyzJo2bb1lRSLgyHG8m+DbrHGUXWILdUneOFyY603KMsxTvs0L7dTb6rY7H9BkOagTjrNmu0CIxAYuO/KD3heGQ/iGJQuNGsmLTLbqcZIqJ3aqgG2LGYq51GD5sSC2Pc/lcQSYpTh/FJoOBcObIWXY8mckLBCwhWlseWvq+8d6rVTz1lCGvP/Kd7c5d4Z47BZxpdBDk1Obi605l8JOwR9MQdzTX02dvIRVKTDWAmrYMsmloRai8SRV2O9BJVRPGnOmDxLH70A30+aq5A4K/I6Y6+6FcZi8duDQZ7jgeg+WPFGBF3lt0i/hCT9VukZX0KlKIVcYz76/gvGOCPKs8HYJ229GmQSMQyZ3LbrcUYJv7QvBTzOS1I/rYZUI9Px+nR/PbmkBqqI6HboyFS17RnDH+Fusu3cecog7ftk7AbTcdadjhHj455ASGf0+T3DR1UA9+iblW96hjuzd0za+nty/U+N3Y1fxmry6dzY+CmxGnsLAEwMwjGuw3C7LQjRaO/HAFigpvskPNanL1/Q8OBNfSq9A99HqHOeR/0wc1xSjQF16GbkGr0XziOB6adArLJl+Annsq9DJagOqCrWFBch1VXRCh9qmSHKVfi9s/V/DXB8Jw8p81l8T4oK96HEybqwOrhxfT4thflJtyEu4KpcLmqJMYKCeDQ48Pwt+L09HL2xB6LEbDJUk5kOhwQ8rTwB0y2qw6p4nPNMjA/gFHTPtby0c2D3NgowmMstRgi3H36VFpML7I+Ed/7TLoanYS6a6dzn/2L8Tujcp4bL02ODY+hbyV+mhIG3B/mRL9+/Ceol4cxgrdenBWkAcb31Ru260KXz0Ow+PJ67le5xUsrG2mXosfuMllCi+yeUlRFuGcOkubx0YQPBu8z7o13fC8zIwn3P6B5ieUwU9yJ04pPMoSfTawxyqd78gaQPfzqSDbaMHu+R4sIjaTFt0WhLLz53Cf3A4YEC4Dg5p80j6lAZNcg/iGkAChoC3BSGEy6NtKdV/raPepBjQY7mCR/bVwZtIkcBjRTw4jjCFCMwAzDrzDJ6e3wPqDwXTnTyMeWXSW6v4l4cs3hrBT254rBs1QWb4AYjyJ1wWW88uff0hQXwEGlLvY6OtS0G4ygN8nw+Bschx0bRug9UXH+a14G8X/yqO5Xc8gx6uL4yd/wpegBTtWrwLhX8l0SLmWxOuycO8SEdS5no27c6xQbNVrLOleC64nLGCmTg19fGKOhww9YZy0Br8R7Ufxx3PgrGour2ncydZ/rbCtWQocIvTwfb0ljlKZQw+UgqAr2xIWF7UDrAyEbePFcJ9+MOrFAHzJj6DMyiF6eCEZHo+4xtLvx5KAiya0d1xFgVJGxdxCtARRUL8ZTMvnpsLYJ6Ow6d5SGJHoQd4pNvTcYjxo5P5muaevsd1ZHk5sE6bQ4OMkBarwR/guTllTiJ2Fx3Gi3wi8cvs0NIQ8pc+vtWF71F8KPbYR8HkajY4fwqD9s4GKFKg52RMCP7eR3JR63NU8BSZEKLKl2y2KevSKD97ZgS7rPtDxr7NA7b4FqIqP49bkZfTriRzY2tTh5hPK0HuiHnKKavDwzyu8+HslOaw+T4+36oBNQB7+qdCC/rNX8fn1GJzQqcBHviRC4ipDFnjojzN1dOj03wzIlizkb8WjQN/6A1rpD5Gq7jwoj5nKEkeise/MHlxeMp4maodx/vZEGB+lCvkm78B2TDAuLXrJn99l8NIjD/Cr+xC2X19KeYdPU9XEjaglZQN3C6ahp9s4fPRrCnY/7aDgcS/pZP8dtrqkCouSmniVbxa37hKE7fau0FAUxr6f7vI4gUkktrgOXMQ1QaJ3BLjc08Cb0mWwUkUDXl4Rw8ZZK3BX+F7wjTGEoxqF7P+nCrLOuOOl3lS6tu8lCTycAkdGGOCGYQt863gBZs3URp/wQKpTKsC7Uz2xaF00FMw+QN/nasGEzXUUTYa8VeQlyo0YgzVW9bjwjRvCuGReBT/51ioj/DTaDK7GhcBW9V0wvCqLVhoIo7FeKTp4Lsckz2/oubsYzbar0IMp4iB8OQv8Emtpjv87TJZTgHEx5lyyKRCc5FVpa6AX+b1yxp+OCEupCh6HhUD4P0v+elQVjBbsptwteyguLQJEb++ljO2qqHHdGLbdDuUjvROhKegtREybTVuTXbD9SRRqys9Hwdm7cW/HYZo6aAqOlyrxfNR1Hhr7A4ubXvLXpxrUqpnOOqvTYbbYCG6+PcC7qieBwpx69nCOh1PzpXFLVBTctVlBTlZidG75YTyep0IDWYEg80QXIuJ/4yR8SLMlHRCvO+OaGbNh+TZHDnD7g5KfhPjFuSUsWa8Dy775YnzoIqrI0mStO4X4+Pgh8P0+AWdHLeSMoz2QWiuNXy2V4MlgOx9/7A7r/Ctp6gUR/Dl0B09dEMS2QF/MixTi4UXJtCxRCUSeXuCtE4bg6lFFGv/cFsaXnIZT+ypIQEGT45OK4K9WNc4UVIXTmfkwEk9DpewHVLuejDqe/TR7+hCGRl2lvPP/cUjORTxhMgHuBT+FdxayHLMrC3uDLSDoRRvkTdvAe+eegrKCLFJbdhU+HFOFlkQGmrmbXZ+1w3BnPz3GTNYsW81i1rroObwJj82LRIkjBqClkU+nzINx7k972vB7AL/1u/Gi+b640Xg8lV92hlShRpihzxBc2wjDi+6TcLIueQ1b0c7zORSeH0/ieatwVM8qWDD8FFPtbSHYbCGaW3uT8eFG+JOzn8LT02HSsTbcsHUxHFGczzZKA7CjRAzkf6ymFzPOgKuuMnjduUxOb9azqUUnlhk3g/YSGfB4NxZC7yiDS605D08IhBWtbQznr+JN4zhoywil8Qnn2cqPwelRDUb0mIKL3ETc/UeCpj86S2+zKuhEYiVtPhNHvrP6WE+oA4qOR6Cp7URwLtfkEVph0HTnCYe3mJCCVxYWfTzNk9KWs2/tGnYcMRdk1HShestMWP5YGcYIK3LD++Mc724BeVe2oKzibIz76osdS/rh11lJsDrnzkfeScMDE3n8qbwNV3EDvHTsBO/yCrwhtZN/vENyktUE+Xm/qIV/s6fkU3qoacHCxZpcYmCJo/9KUvXgNMx5KAO3FwuC9cw9oFgrwu/Ta9EoxR6XWuhzZrcIbKebPCi5iwP0WvkUIWTJ93LqaAGuC/Dn5VcPcv3oRrqm/hviA2Tg0VcDiBCeCBhnCOL3VvDTzhoQTluOFHyZpoX24vV9O7luhgxvCl+EvuvMqPaUAIjZTeeFkxyx4853LNp0j85NHuJj7tvx0hxxPnk7EmuzRqDSF114n+HH5/A6Ta7Og12XHfjSqHqwVlsHrfAMyzwLoE9MGZOGpoJmlwkqNwbzuPXzKSAoiHbplKLd2HOQ0eWDgjvNuSYjlo16ZEAtRhk1tfej+PdsFFgfx1cqSlBz+wEqlUiHqqLLVNqUxVuENSAtV4Syc58D6JWR+cf94N7yhKzF3uNHz0H+4OeAx7Md8MtkOVCQ2IjVb9Zh4N3TdOzIZvRrO4HBocto1BwvPCEYybcmfedYeyVw8ZhDVioaKKYZi3pDapgXXAgiL7RwlMEP/BUST8WH/qGV/WQgVQX+F+RPzRXx0NXmxk3P/sM/MQvhhKkgim/XheKMQbqoYAzRmROoz90VjVLceN4JZ2yzTYNMT0tQWvGVleJPkf3cPtrdogxuoi6oNNAA1Rbj0L0/H5Nvv8IXS8xpjXEZjXYdxYVCp3ielBBslFSD0c+IfzQE8squ+Zzj0EY93l4o7T0KfilVcsPZhXA/TRzemPvAy+vHsctEFkpcpnP95hz4XCSGE6Xnw07zGro+/whvGTMWbimPhPjSZpR44kSjVbRx8LoVTIjt4QusS7uKg9GmuQneL2FwSzlLda3RcCYvDgp2/gcRJ51AVymAMMUOnF5ac7OdKHUXq4HF21V0sigbv46vApuv+vxaK59NFxN8PP2IEicBym9WokttU/5n/+8C3kvRtu04RvwRyKVvY4HBdvC8bUa3ZiiDYJkAB6ZN5RvvALZk72bli308RecHuB3rQLvG+/i30RFn78vFh+/NKfSRGFw/rgTvY4Sp9vRJlM4ALnQ7Tx1bJ/LbafZ0MW6QP3SqsbrdMyw5bwtXc/3IquUq7R8cRxaOqrAlsRSUtTZR64fr/P7jA9p/SQ0OvJaGFXJXoNJ6Mhu9XAYZGv2o3pUAt6oq2K+uho6M68HKf3PA6LAUjLXOg/q7ehjo84A5tgxTcgrpVO1kkrhogYNhw9x0spi+0CSAvXp0IPQDb2zp4ymBPjTv9BZ6NL8AROzz+WXMOxY1K2GTmRrwcOV3EFmUB7c+FVGxSTKI3y5i7fDVnG8POHN1OOnc1OGf6zTAJy2FxY3m8XtvGTxsaUPLLwaywxQH1vqcAxNLskFV3pU2eIjBgOsUmt3/GD+aZ0Gp/lmEqgb69GgsP0zJ4SrLn6xa/ZAFpYzg9+IJGNh1AazWncUEB3cY/dsFzLKIV129B3XpXlC+ZAPn1puCl7gx6K8Jww2/hKnvyCgStrOFEUkDYHhpL03oPoJeCzxwTcQkaPHbCyIufbDT1hO4aTTOnjMGtwnu4hVJyvhv7XIMy22i7AFTiOpM4u1hISy9VI/HqlrjXMNQnBihyCi3hKdt98acr+PwxIANqLybQQGxIqjj30RXYlLB73Y7+D/bxyPPllN8oSp7b3In2ZdmkHLHHa4HeoCg+CO8HlPNpRqraePYMAr3yqEzgk788tR5zqvVAj2hUsp+spFuZORgrpsIKZxtpH/hy2Dnj9Hg8noXV17cTcqd4+HPyGbQ2lzGKQM3yFN8GlkcNQKP4glUMnU7lztVUcwGJ/qQOxJKpwyiusxIqI+J4kdbH6CF0QCGW91GA98GDM8WovYHovDWTRd05krQNZcDoCVWiyI/E0Gj9wc2JR2nioP/eIPPbVpd8Y+ny0vCPOdGmHi2kefMmgKaryeTwTFf2iD2GQME3kBP7jXmwkN8QE4HpNI0cW/ZZni8PglG2RznRBXC6omCGBd6k88vy8Eva+Vhp5w+vL4TQGdNk+jU9X+0YJwuT0seAiktRzic6kiN7S8oXlGSMk9awVKsg6h0S+hc5Aql1nfpv4xpnH5gG04UWgGi8qK8ObKWp29UBslYJyobe5/VelzwwOF6OqsvykU54eDacQQyxBxw3ckC/jJGDCJ/SeHQnH4YeCzI9iUJtPbrZX5rIIQNjsjLzpfTUa8IjrYWhfzfu2BRkQR4fvlDUgGnEcM3w7bsP8BDZ+HVuTgSF3OlJhM1mJtmRp5UDfN/HcXGhHQQrXKDsDJdatjyBCtSlkHYbRP+aWkB5zV8ecLKNzBLI4nEDtjBDLVULAhowcYtZeC2K5p5XTXJfpSA6wsKofAI4NqJT/jChWF0U+6FxcLjKHXRE7KU+gzf363Aoxlq0PfYH6eENEOD+2lQ/DQbux55oOLaz2S88gy+StjHo85uo30njWDR3TOwp6yLgmx/46bOarZyDKH/tzO1pAEljwxyaXkP94+bCOO05/LmSf/xkXP76bn5Mpg0sQ0a3/+l5sVLqVstBlIeuUFClj70jXGiS4dG0L9F5nT7aQg0qqfw8U99uHnkGmytnoHpNkJ0oJmgdvQIjM32AG89WdrQ3QFXZw3jk00y8Em2k+LSvjLs6KLoPyIwubUMfwRdJt9bMqwxMI8rwuRAK1qHI7Yas3dyIkbaTsE8GynwkxXFiNt3yE/GDU/fCOONOV0s6ikBK4siuSlnBGVWBPHqcA1YWzsH5qzyBd2GTygtnMgjP8yk8n8mtFu6AxIvVFDKsXDMeWMID+ghKE1upVKh85DwxJ813v3Hl5r2YbGxCWllr8PZN/15VTNAyJ0RXCJsA9MrO7BeNxi6+sRAwmuY0xaYYu3lePS32In1ISrwrkyVJCpXkpl5OG9ehfjqyw7ccH0tNN60Zz2tUjozqoOF7LVB69wUhEvf+Pv3IVCLX8+Thuvo8IQKUG2vgxpBN3xzcjnO1hSChFkyKP12J3zLeoEnMhbg4boiuvm4lTS2j0Gfnx3of+wGa2Ubg/rDblCbfBc+tl1Hx4LlcGXTSNpRqcurck7g3FPlHPJbExrPKcP1dcFgnB3BFg23aMaqo6h14Q4uVq2BRSGb0FxGHuxLunlTkxAkxjbgu4MzocqrF3Y9TmGbFwXs5HOSnNOFeE1NHcrHHCRhaVNg50O8rWs3NQh1U9v7q2A/2RWe3EnnJZMTUM7cnftmTeflR5Shy7QEtRyXwZuBVzTVtpPE7fbytp3pIHC5nmuXVYFQyBrY5WkE5rKmkNKzH+VSTqLvHS/69OoSWIgE8O/gBPLZFMWHA6Rx/4mJYLqCKet6An7RNAL72vto0JbKwwkf8Yz0Z0y4lMxFQV70VUQSLM2rQDEymeYFi2DK+XOorTIaysf2cLpNI0wbZ4ZNU5Ph47mpIBV9DXWHxWhTrBT/+JuBYYmfQfX8RdRJsEEvUsO4WyJ4uNoA1pRk8gqDZJ42ahOkZ/Tz0J2jkNY8gLvLitlAWxCLbrwm6Tvq0Pw+kaVu3uRxCu9Q4aYfdX6+BzL3NHlN8lp2UznOFfUeYNsyEUw/r6EWnzsoe/cH7JgAoCjjwR1b15JWrxut9muAGSYrcCkaQMfaJric2kxK/WcoKtOazr7+Q1c6nXFf4H54+Iwo8ssT3FZoDVOWqOG1kzfpxp9rUPYkEaIds2BHkS3/8FWnMx8W46V6CQj6BJCr9QTtO69A0+BDyF/gDOM7M2B+ThAENidANSRy4wt5lG3ShrEiGfhNvIQadexxzpcaTh5fAH9eiIPOeV9o8ZKA9JTllN2uAAV3Gjgm1Yme+NbD/W8PqKz3Ld66vRpHTNrGmlNXQ4TKEvq92hASZy5hLckWOL5cgd3qIllI6zu9iPLA6MvddFpRg5UNdaAzVx5ErObjmkVjsVnIEU+qdMGbLz+hP2U/zH1tgyULO+B0kSe1p46GxB+RIIyHsKLjPOQ+NQDbOWpQa+KETwVb2dVXCt6v28jrF42Fb4//wOGCIty45Dhf+PEELq8p5R1ZczC3roGej/rOX0IO8XL7cTBdaDFcWhlCM+ecR+fLE3lO6yt8GLqYZlfW8MOixSC+9w9ubLMC87ej6FzoBRw3MxfkX4rAjXfXSNbnC0u8qgXjm/L4b+FFqLouCwvDxFgNvVnhUzE8H0oCR+WTPNtiNz2UfE1HVnrj2+eOoHVdCQpFdKFltjH7L20ip0/XQERLiK69ieT+qo20TOUMWdoFUu5eAahcIAqfMxTAS3E/fk4QR9eL1fisbCYsmfMIzJsDwE94GfsvloU3npfRfWk+xH4IZxX3h2zuKU17vn3CMSNLYf6eR7SzQ593GgmBbms2/w5JpyLLFFwX60EFr4LhvlAJ/efew9EpAiBi9JhNrk2ABLdfvLTzLhuu6UOfm48x/rgP20SqY8ffftY+GgwPDLwpeKcCNMw8DGSzjJPfrIHzHdv5iUAK1n2Lg4kiS6hbRpIPDavDuk1K8DE/FsWm1cOeKCV6t/4HDRdexfKjpjxidCS2Zi3EeIkucLkzCpz/XKdzK2Oo+pAOb6jz5y4BE0ypqSO5eFNS2efFcdPO4P0ofVCsNwGPQnMaGekFhc+EuOfSRnpV181b/Po4OiEE5+3O4I2zROCN3w9ICd7JlcXGvGieMhqOM4FLIXrQtN0Bg149gZIrE/BNshrMSK/g3wf3U+4XCY4UWQWv1q4H2wnDmH8hDxzmHmXZmiXkeGMMNG25ysZ7K0Cm3w2H57qR+egskk6pg/GJcfRMxB6j3Dax5WkFkBd9hZn6vdCh2QnjmuUhqEAUN4kOQqPGI1qyt5Lm65pheZw0lGg3s8TgWRLe74Q3WYk/ia2nkEP1fMGoipP6p/OBJ5Jonq0KtP8OVndJ4j+TKp46byLcT5ZFuzGZcJh3cET6WVpZpoiFUmNgQ81UGPS6jsfUXKFuniT8tzMB9xeI4/6SheCz9jnUTFTEmctVIVtdjNuC6nHmrFrwabvM+lHjObZ3C+wK6OU1Uw5SRmAtFRzVg5yiZpim+QC9nC+g+zJGZS1Znp67hyKUKvlbxT8Ae2vEbaLw5Pwhmi5hBj5nb+KpNZ6Q5L+Tyzw96cakBtxnF8rSOWd5h788RErE89QjfbSnain3eqmxgo8wfdmeD19/trD1Mmt8vc0QHu+SgYJ7AyivsgusQhA6ww+hwfZlHNSYRgde78MxDjdgnMx3GD/BEs75SXNofzMe+5hM+z1seIt4Dr4LMuFZPwvoRcxDMJuzD/VvW0L8yVHQ/PUHd0rPZFy4l6bXbMCWehdyuxeMK2/kwdBbgjfFkjCpzx2NztRgtdwS/jhyLch2DlC6wUe+e34q31hvRz0J1Vh1VBgCmjOo3zaO+0Xf4Ywfjnj1XgbP9TKA031mkG4wGufPsQIdKYYTZXPZZeJffHY+h5xXrCftb/vw25cnsMd2HO1jBcwancxpyyaAe4AdN59cCuZLc/D1xd9oCfqwI2cvku9adL2XglqZbgDOU8GteTHVfopF3eYGeOofDc8vpPKV7r/wYn8kjjLxwgvG4fymZSxspmHYariD/5ytoBsrc7nMfRE9+ugMxaPSsTWykQVm1lDZDAaBnfd5Rrssvtpqx+9aMymrSQXzpjpzmIgUrVxhhB6/p9PxPBPYeNeY5iptRv0vWmwqsxHdYpLx8gVDntfQA6LXNfht/BhWPUxQ8GceRZ9ciBF/G/ic+HT+YlKFNQ8JUkM1OLZLlF57KpPevRFgu/Et7ja5BMcd16PuTHmq3yLMGzuE6dv7fBIQCcRdze54UE4RYpe6cK6QMUgp1KL2lt+0XGkEyraZoM7GDaQ+cgU8yziDs6+Zgay/Jg98SodTIfb0S6YNylWESMNsElU8bSLz/iT0cVDEF6mycHPGUS74vgP8G+PwS0wZxB42BAGrmVDqdZj6rh2EuMB+WrxdDu5saMI1L1fDeeEQrnojC2tnHKFfvSp0tiCadFpNYVHpQQheIwGbptzB6x8+4NW6ufBT0ZxbHjRxolwlfN3/EyaPWE3dH0xgTcE4cLJ8CS9mb8Lmn5ko5l8N69pd4VlpDD5SegHfvj3i9FnHUbZGGRTSDOiveCjOSUgitaFs3nJ+KVbMOojhhdP4yxcv6A0+BLqumiB1xBreWxpDveVsPpsGLO7eSHekAiE5JYedRt7klHZ5evlaB9R1LKC3+zasMr+KL54OwUyZRhj8K4zFeTd4Za4P7jGYxG8nGsO9sUZw4Y4iuby9R96HfeFwnj16rIhDy/qtZLtjLeysceJtL8aCcsBv9hjoZfzriGNmecHDU7e5LUwVDw3MoHMb2ujN1W90Ws0Ahv8rgCVf9pNT1C1I//CcVEIXY8mFIL7fZUCibe84+OwnflusDF9nh1NKgCk/WThIPdfOcPJ4Cex93EQNtl9pulciLrHShxurrSBOoQ+qbIjnTtuD993vUaL5P/LsSCC2fcRB5Q34vlYWlx8cCS2mreg5PAyZZ5JwTqsCFuqM4TA/d2gy1qT7iRFcurUPQ3P0QedJI22utOXY7Xn8wzwbxctb4Vo08mV9FXi/PoHk1GTgW4As5E0p512Swbh9vibniv2hDebpmDRyEFYpFqDrkr80N/0POMw3gckXMnn5ghRy3f4N/qhH47FCNfrXK0ulVea0y51oX5Iq/jhiAL6aEyikyRVO+yaxnU0f3E+yoYCYaey7oQ6TjLOg8e8YMPqrBtrypfDBLRuDo3+gjKEtKPyJp+k1sdg3WoC8elpgrqc3PuyUAUFXF37mXYz9D6Vw7JYM3BpuR6N37sAb04vh2uW3HGKlS6tuC8Dksr0YuaWbK5ZXwvWVwaRSacxuea74MOohyvUBn1/pgDpBCEqzznB8swXuU9Dm3C6CXYVbwF//Ngfpe9CfkyEg3b+b7HbrgHPZLV6aOZkspuqw6+JZ3P19PN/2f0wqT1RgSfIOVPCxhleW42FPTCOWC8iTXPBCbt36B0V7oyBsx3y+KPqb0h9voBdyMyDMVw5+7ciC5I3ZbOgZAV4W1qhuUYrHVYvRUuMqv643pFT/QrrlbQv2H6Zx+98MGJH5hvdqJlJ3x17SxXV42aMKQpN+YJu6HjmcEoH+hztZZmwOnVbMJP/2mZxmIwbjFmSDY5MzVWb2gvYVK+ydjHB0VCTe/F1J7j7GEDx+KdiJrsbmo96YqnINa19t4l/CJXTy6Aiou6QI89PP0KlnG6mpzAZePI3nG8cE8L9vWWjXZk3RIvfBcDzCeMHTGHU/gLe98qcLnzNRpew5R+XqsYzEXWgMy6CQqWIk9k4YLpdocUnQDBq1bR5JVonSarV0+rElmLsS2yB4qwQWl0bClhMToUynFK1zPTgxJ4ieu04io9hNsFZwKrwzr0WtaB+M3zSeRU2Vod+yHQVnRFLZ2RFscW8dfNvwj5xUnrBHUh/d/zgff/pJ4vPnCN2i3RRl4oLCs/ezZY0wiKw9jLENvvhLYSLejIvnRvkaGD/WFIxCOrD0tiFcAHFInfuaPn6dCG2ayXjE+xrtuKPNxn5ryfQTw8dlx0G+RopUNI7CmFovbJ30ig9lDNEqw0u4L/IfnYjKwFUvBUF28nTsUq+AVP/HNOv7T1qjVwcFOWXc5NmNFvuM8eH5YxS9yAwEJ4Wi7tYVqOgXSZfWDFGVWi+i5QArycZypPUSJo8lcGWhNoyb5wXVK2LJ+b8q/P3IEvpm9vPa7AegUduAT1eHgmaJAf68BjBx33cOS9nBtnvceWFxK++yGUVHipwo9MVxrE5LIY3bM0i6wRR+V3+EtQ56LHV7LQiu+gRF+c588aMEbJwtjN5z/ShZ/hnPNRWCG5Y7oXzmIDqVtvBCFudbks6QGJxJfp8LWNqgGjyxEI6Uj4CDSbfR63kpXkzSx2GNIawVr+cz0zfitcli4PfrAO+3U8dlZ+TgopATf/ngB8I97ayjYcOCLV8gvtWAbu5Yx/+kwzm+IgcH98jDq8JA8rbfxf4BtyF1dgV7/poO+J8uuXQtxg0/Glg8eiOLP58CJ4ecoGvoIpKRLngJTQKl2TdQbcduCHZPo937SnBG/GZ6e1oe1NVdYU+BDj59bQO+bu9pvPwLcjc3A4eh4+CvWEed2W2wMJZhjucBeLJ4HLnercTrfAm6nXVIc1kfj38gy52pynjwuCfe0hGAhAVqrGHog5W/PtGNlK286HYgWa7fgxoXL/NigXqcUJUGyzLEIfnoblZKaeGtFev5cGMkPjjnDs9rO9BW5jv+/vAc3rs+ouZDUrBPpQ8Oj/EioUFtPvR+MvcEiPF/5YVUFPkNnaWsIHnNTvq8wxaM837CuFgp2mxcS1/vanLtlxT0vOQBq9aasfzDM+h5XQl/NqhCv3E8bAv/hw23HlNUyk1Qc3/K+gcPU6qSG1qNM6S3JsrkfHosVOknse4jFzI6kAai77t4+eNy+HysFq9q7aeP5V/wov9LODmToTfzH5dnRrLitK8wbJpOHlvf8Cb5oxQ/5iKV+1Rh225fjk5QhvNqD7nDRwI3Vn/kNYUl7JjRhO/95rKKXC6drphEzl9tIHvbeDhRtpv/vdBnrdpyCEtawnsuhNCYzY/h7fvfKH8lC14u6qOMf9YwqduQP1YNkZ63JH4RPg1RbwLxiv4qXuD1hk8Lb4Jrvur0Zbk6xLw1BdX6IyRtu4yWn4rlQ1PscJWFMbasnYYPmjdQ4Y1RXH1aEpSFj/Pjq4nYK2TNMh2ePKD6CAtnhNDFz25w9uIptLsiQHoPBCB9Uh0W6/zkDt0aqhaex8d2TuLU2rnYfWwKte5oxdioFJLdZwwVsf5Y4upHe5w38Yftdlg0KoIsR+9D65JR8Lz7ECUKlpLY00ngc9+CNjS+A+dRJ/lC73WWlpdFt3pTltHRB9H2dIp9480bDgrCj/LJ0Hg/GMeVPqSXBy/B93wB3JZ1iTo9rqKH9TOYWhyHMiuMwH3DfvL/1UlBczNZqnwSLemfC4d+JsI+p1TueagNKdWu9MNAE8b1mpB352zqzRGGqVPvUYod4cyfP/n06yGSGdiDU28yO70aDTE/71HQk6c0OjaIDp5rI02bOEhKtIaAmck8v+UKWEyNhq1gDou3VsMCMea9es38urmYwgLL+ekYJ1jTpgGRMunUdWwHsyDA1z1juHnDaZT9r4V8DZzwWqYkd+f38qljy6Bc7xIdeHaPY321ICDkAknJZ/G9FmE6mF9CM1ubaUXCFO6enUL2v79zxV4bmJM9CYauKOAm/fP8t0gCQlafJJ3pmXzRVgzlymX4We1MHmiPwjxVcyitPAEvg+7zWPV3fDr9HzbM+UHD7fOpau81FDllja374yA7mCEzMAs6Vb5DkcYWbN9oS/Ex5vBh1WKKH3UVRiW9RjfZLDAeqQtS77fRgtK3GHFgIytlDrNtmSfN+OSJaktuwKKRs8H32wfqHdSArpE38O8YwHDbM/DqQDtu1bsP5rX5KLUpnM/JzuaIiDiMPzsWVBMUuD3VkuSH7FnjcQCtM8zhUeZT6V3AeX56VBRH3DeljFVT4PkGRy7YJYW5o73BZt1IzpV+BbKDKVRe6IbGu6+Bc+ly+PLOCF5ZO/KK0PlsVHUHqk/pYNlZS+gyEaTvQdXotWuQmw4V4Z0QIRjKFuO1EedYtVWNxSJ+0HmVUlgtpsmSPsUcv/A/Ct30Eo8Ua8D0NYcxQroUX2R+wCNvFdDiPzWU+M+HahvXoH3pZ9JQmsHi+cpgq5zHG3RO0KvGYsxL7OB1azro++zXNFtZA5cpzcCC3+2s80Yc8jaMpX3HvVjl0QA8ttmObmkrcNyxYTw0PxAMW6Pg2j0fftqhCRdOFpGvoSwYShrBA1N5Ct12BspNYyn65x7AEmdOPCXBqlXSINHlwk2nd2Pv8S0YdmQneL9bgcKtPiy6uQgG48/DEm9r8FPUh9Wd5iStvRyDq2Jxr+UBXBlkS5FLi/GlxEF8tfsU7Zi+Fha3qMKBBF0E3EgbbL6RoOV+mqbxFhd+SKV5T5tgrGoad8xPBYUsC9Aasxdm/Z1JZ8ZrkZ+5Gt8KkaZRSed59Bkh+lLvAXEds0GyVAIib3fCl1nHec2GEeAyUgcTnjpR9aA1BmYfxxbf9bwuKBGn5EvB9roGfvTiMK87HEzFdmG4U7Ya22/nUcKuCjYTyUGnG6thnbMcmFv+xIwb9axqHYIK91NpVbEsfmkogtRbR2Cqci63L10HGQ8E4excI4z4zxa07lpiVb0dRo+pxlVbx7Pzn7cYJn6CnHUryWSvFiQsmwDPnofTSr1BKPh9lX+H3MMzxdfhRYMpVQ7u4XfLS6FBTwLyOq6zitIiGNA2x8VmI2HRs9tkEa0HUm+6ydluORza/hsKjpmAz0kxCBh3kQX037PMx8m44/AH+O9jPAwuHoB2eTGKQAfMfzEaEnIVyGWEBa4pE8Ko/TshttEKLSS8+alRC0SYh7McSJJ5qzgcCzVD2y1BWONyF0TuiuHaIyo4lWajk0I+3VywGdTfC6D1mAlwlPWpc04F9tgZQq/YPRypFELjJOWoSn0X28qsRJp8hHMdEPJqn6BtoD7mZbWB91AmFNlmwVDZPz5UHINPTD7w9NaneNlSFYo3VMLglEc4ztwfLyy7xPZRr+nZ9CrWd//Crdda+J6VAby9JgM7Li3ADyY2sKyzmE9cK4Ui9XX0VXAxm7y0gpoXOrxdzJgTXEbC/rf7qay3l6p338LEW5NJ5esQv190Fm1WfqC2S9FwZls/JrvKQPbKMxB4rYHX618n3xsf6aliBlcuC0DFkSPpd8deMt5kjtKWCBsqd8O7nc/ILicCerRdoMdvAw67meOqhPOwUdIEfXvkUWmXGBgUnKVpyVOg989nvPzWn5Ka35DBjziMnt+BU8JeYfkDLShaZgJ3ul7QTJcDfNPqG+YtcuA15+6jT+c0ePH0Cm6qW40xDo14okge1K+8xOhZFqwTvZiC9u1HpVlRpHNCCO0z7Ujd5SJuea+MronWcGqjFTveOcEBK5VgU5ggaT35Dsd/ZNAf/2OU/CyUC95+p0hVAeid38POUgdwS0ko9pveApX8crqpPgHm+vyH+5/XU/PhhbByngzsNSrBAc0hXJhlRYYrGnlqTyUWuZdD7R4XlN0kSmZKlrjusQSU2IjA/cOH4IfiIzDf+48KhzNAYKQhPA4IRp4lCZEbJXhlI8HzyuV4zz2X46q76erdPdgt+xLc82qxLmAK2l6z4htvmvitmgn0to/li5eG0XbOY7ipIc5pc8OocpMv3cs/QXMHK9lQ8yXIiU4CUd8duDZ5K2V9QthicYUln1bhmH5jeNA6CyKf9tLBByMpM0UHzkWIoPMeM3JSmwDbXTLhyTNzdgzwgHItOwwp9sJMrQd47JU8yBfX89+t0lw+RgQfZhixg4MKqPdkstO3d9x7IghfXHqJ5vqyMO/SJHqiV0g9AT3k9G4mBwqHgMgOV/ribcwlVS7UEIhw9/Y4MLnlhG/KrPm3wERqVJyMy5oH0dlBjCZc3srHckdCbPUrcN8mC9diVoH2pwi2WeBK3qaF7NeVjiM/6sL82kQI1J+Cg+OmgvdkNXh9+iGWSJrR7fPusET0N7gr3oMVm5Zi5vuv7LZdiYdunqLfpZNhjUACKdo00yqD1XzGP5JwkRe13JLmsoC5cFFQmzNtfTGrUwE83ItI62s3j71nR1vkGrjdeA6v1K0FyShNMA3aw7vyD9LySnHo7JfHa8bTaXGxKpkLGJCEjzZf7euEzIfp7BzUwwmSYShhpAaLLJzI7rA47rO35/GKHziswJmvdjynC8tW4lgbC4iomM9xCjYgsvo7Rfw5wmerKumgO3CYvh0peG4CDetADOz4BBCsQDUDBP1Z2rh//C04/+wBOcs5U5fQKDw3249/qeZRtfVM/Kf+nGxkVKExZh4Xq66nxIjP0GotQxfnC0Oh6W8IHQ7C9oOCjL4nOXJgBAxqW5Ke8lU8sKkSDhhYso3+Z3xrPwbUVvlS9b2fPFVfBR4PSEHxnRr6ka/EcniIwvP1Mdf7AHRKP0Tvnmj8Ex+AZesecGzPJLi+0oOiLV3w4H0BMDJ+AZU2/iy17io8EMijUWu3o7/0MUpbqg8VE5U5JNAd3wdowjRdLZJpT+ODL4XJYNsV9P8xjR+XpaF7vBZMFFkITreNsFg0gtPVP5Lf2Xo4yuHk5FEBpgVH+L3OUXw8pAE+j53p49Z3NChbyKYDHvje4Bb+d2cav3vrB9nSz9He9RpHRJtAr7s2n9y9CgwGntGCpmrw+lTOb3ScYdN4MSylLfTPS4dilohAgrcGRi/7TY2FI8n0ZigESA+w8p7TiH8kMODDEH8bUAbPvglQ0nuZ7Toe4oIVe9lzhxO9MHVizbYYkg4bhpc+l7DeMYrUjUbD8S+z8f5aDVx+0Br0DJxpQZg0ukkMUpbyBlQ0sMfLJ16Q3y5daPpeyK3qTzij+grs836J+1aegWKNA7iSfEBwRxFmvdUDl9HjIdthGu13V+dznMSNuakwWvwB1dXqwV5HA9rWmgTxQz34Y7QGzFp6EosX3eHulng6nPGHjWI+0U/fyfRzdAaOuTkbX0hmwdh1VoDrHtBy8yQeDo4Ak+OrOf64Nb/+0wT4/BgEiT7jr2aVIHPVBpZWecK/tsXg4dDBc0wdQN1hD/WsmMo+Dnsx6fZKdsv4g6f1EC73VePy6haQUu3np5lraPrl23S/3ZGXZY0mLPXlSTLzoPauMMx0lcAPNzdhSWYyTru5DH7t/Aap6hfAeYYHrLt5k1FlK6T9ZwZFR3fy+kAr6E+v4aMG8/jY1Xvk1mhNCy/m0on6a/Q6sw0fP5sIp2fXcIViOyYpvIb+2+p8tuIdPA++A5/OubHewTqcefQDwV5JqLFYT/qpT7HifSHUXCjk6y2KoPk8nlqvLsEhzdmcD1m0c40czNtPsLXsLx088Bluqz/iWxXdpOkaS+6FwTDsnA1PXN7hXgFLuHJCl82bluGFZypo1N6PQ986+FdaGly9epw+/ygnuQ9JbPtxHFzZaom9fW9pr703NY8v4b6fMrxiZxrP29INRmN0eHNOH+q0KsOLR7/gR44i7dH0xKglZvjqSDycTZmNLgmDcO5iKL5Ydw2EPqtBmssMOjz5Lw7fDsbHAUcgLkicDT7Mo2Ode+hN4hNeGNLLYhGGkOL3BT+9CmYjhwZY9XUElDavBGe3kfB3+zK8t/wy1osRqJpNgO70PrwxfjGImNrjli1LUfTYQ67PAPgULUyGjxYy7jyGMnJW8GruLVyxyBQ9zAXAUHI+/ZjygFLeV1OwbiXeNjRlmeE+NuwXh+ktNlBw/xIKx9zhmvRYLv0tguEhtaTrPBJFWn9Bwb5Q2OfOcNf+AHH4ElqanAYWKRdxRbodFc2RIjNxWdD1vUKLl4vwrVozKFlSwpOLHkDLqrNQp2kFz8a4w8QTxyHPbh36q26AJfSZpvVYwfRAK44xGAbLxac44Fksj700lcbudgVt5z28I3QAKuWm0gtDc3B2fQr3befgf90KuO3+EIiPX4TjQrezqZUySv2aCFHRP/iK3ARY8EYK8t+l4uZV55Bnu9K1SwKgnttIa5Yboq6/BLkLvGdP0amguNMTFPVOc1/7L2wsiGYsvUYuQyLwuno7atqn8He/cjqZrwsVd6Ig6ZsZfTvVDLnRT2ie9mUIe4842UYdi7sleN25H7TgqAysfajG0tWp+ObDSjg7QwoOPLblyT3HcYl1D5S3dOJz0ZdsOagLwxpjufJ5MhhOzoP5C1fz1d1tmEry+Of+NT5yPYxomidPmWAEll+CYUWlHM14/ZvXrg0lg6abGC65iqtMJuO2p/kcdn4fHT0qAJ9bpTlZ1xJTlVvI+N446vovnDZaq7JujiZbtDSycNJkHKFuBB8KY8Bx7UrWDHWmebFhdFR4Pz/SzMaBvlkwrWklBa8nWhOlDIYXasjsXjX+MvqKN++Ox2W5jjjiURj+ue8M1jtOQ9+WGbR1jDjUp50kldEnoC3iC45YP4F0omdxx5IecLbXhL3/rQF8Ox/KtwnD06Sx8PmyGl66mQxzRqYTi/tB6ctSrLnvzIKPNnMkeNCkbTaQM2YIlyb9wtjJU+lG5DdyaziNmkOWvOd6Mhvc8AJ5WS1SOjQSNPuqKWtwDq+oHM/3uy7y3YoaVJIKRcmHR2FJ0xFcPt8ClA6OBsNLlrDPaTG9dimg7S8+8BKbSo7+4QSzfQL5ueMDlNxhjULzVcDLWxT2qs5iDQcBiDGcSzPSFnLpqzmo/ymUIkxzeK7BDOhTtYWwIzNIb6MMHI/JQdvOKiiMPU5tLIPV+4+BmesKWHBXHPv0pGG77TQ2e/YctOqzONPkP9hkmYEzNVRwSZEaG387TLrXKyEtEGHurzmslraHfq90QM1ER9Lpns95gomspLeJStJcWM5Figae6cDcqs/UbRCHvvvfkfacTA4La8TKoWh4Y+oG6P0d1651hEoba3CRyAdjp+2c0OSNe29EolCcFodNFcXAKepgmvOKzf8twpyhSfDFz5liFmdT+3pVfKrcAkL6ZpDzOpt/Dq2Eq0m/4ETRLlw5IAwisf3cPEIe/e+E4v2jV/hnwyXKb3oJny+Fc3tSIlzXGOSWJWbQa3OLt+kn05/cJPK8MYp2LDuOAoc20F6ZW/g425uEErvoZ58UzLINBN+TQSAel0iSCnoQ9O8NVt0bQ8+/rqCHO4LBp7wIlpywBYkgQxgYsY3TBMZzzMUEtFYRw4lnv4FyayEtFPrAuWarYaSGMkSPuoNrP7aizoavIHZjM1ys14bvXprg/0yXT0xKhthUedD4pQ/a+S/pce536BIpodjiYpoSt5ytnt3FdQueUUbfXXi7rJeCFcZB+4cbPO1VE4+NW8ZifhF011EO/Vc0cvdBARLeX4iZH9agdBrAWLOn9Fx3DHsEzkBL5Zt49FUovKj7gZ8L66hXKxmaPbZzb4YszL39l8V/LiOpUQ4YJ6dDjStCKHiDOZ38FwziL6ewT/kFTB+vDWaKQjQvYT7dmSHHGnIDvE3xKhwMfsevLZ9ywqhdWCWeTZN/ToHYkjf4WX0qrR51jfrEbtG00jmsJH4BtY9uRYmt7/Dj3UvoLSgDjqsssKgiGDa+EqPU8Y/oK16Be7s348npG+n5b4LXYWk45ageTHosRvlzN9NYwy44rjsNHjVKcWDnPArSm8E+foWkOLibYiIFwfm+Hjd8tsVz7cOQtOUThoXe5HP795DLGkd0utEBwtNT4OqzSSA79RT1LHKlzXL7OFvtEWppldONsn84ZbQ3qgS+4pP2d+FTiCa8T4mh5HBFHPWfA1fPRNR/5oIVFf+xs8xoXnbvHM8KdWGDB0qwwnEl/9KRxQKXu3j1ljEK72qDVcmr2e7rThr2y4GCGG3QCrcCTTPk+W6FdObBDdYevMJSRw/wz8T7NFzyAm8srMIn9lawQMEGJty8RZ0iS7F+5gNQBBV443WZVvx+yGuFnkLRxOUc2d9JuiI2cPL0a4yVVWed7hF4/FkgL9OcjtX3wunS6EiQnHmL8gftaPREYZAvu8sr40ph8TEFYHsbSLtrj9N1Z+K7aZPhe14w6O30Z3AQBuWLDzDU/jwtnemPYilPUEfjLizNu8KLH5einClBorsv1H82AfPh97QtwhyVHhxC89WqpOLuzRu/JHFfbhlIPNEG41fpVN84Ftb/q8f2XhfcMfiSum9P5P1qz6k16i/KJ87B9nOO9Oh6Cs9P0oGk0pmoHDGGOz06KUG2g+WOzODDX1Rgp74GzNq+meY7NVLXmEnQaS+AIT09fOPsXrCaswgOJ5RC7j/EvvpHtEJQmeSzd/OYcFG4sMAM8lZVgZF4PQfYfkK5/sVovXoXay+axnHzdpDevxws1peE9x0HsMv3DO+MqWWxxmCQMzSlrNtx9GnLNDgYOcSLVEeyxnOGE01zMXmWMp0+fBrCCjVhid9WdmvshygXMxbZPAd7Yv/D5mvykOH4CJacPA3DC0ZT2FxB7ssqg+YtovTxbAnUKUdzhrYRvnugDuHyhfTU1gjCIqOhV98RdVYOwieRERDmkkMiljKov+8aCunbwqB8GYVdcwThpD20fJYOO0v2w/D4PbAPj4Pl8/egMvI/kvopChe8T5C3yVjan7iNL77JxDAPS6qYlg9BBzaw75vdPOOYC24zGwXL3XZhtfBkWjt3N2SfyMNFV8Nwkb815NQeQ5lN21hsrDeEejJkrl/K2/VFYHqNPNza/RLTVnWAPFSw+q2DWKTig9Mm/ETDfzIgX3yT1PxfsGjCR07NtwO1gXRo61cH7Q2j6On82aA/ciRnLzQCYe1aLpdj6lhUj+6aZ+CBegz2nnHHya5RPEZhCfPRh/glQASkvWqp6/NOjEvppq3CDyhysi4mPP9JNVN+s+SvBFwo2kC/NabC7DU+HGC4DnoFvcmVdUHrjz6Xp58Fn6fzKXbtBT6gUAeP7FRAnQXxVHYhFNTv4LYV/TTxqARLPnPg5HQJsB5lAJ8IsL5XD+J1TrHKMzms2/mGrRcoUomxHxu9KaDaO2Ewbscv3puyCT0WKkCjNOLWJcEU7nMAPQ7tI/PuLNJo/o4GxRd56xcZcIvXwVNj5EE4PY3XuA+i7Nr7+GrXd9y1eYDq14rwZoXF7FD/Fh6REb5zUoQVP/X4XMFhpvmydKPQngUzH7J11SQokiiha0ULyWRCDam4EfTtm8h2mzzZM+gz7HkV938c2gc3EI6/gPHvsCKSlZ1kzxBCiFCUUVSaWgppS1tD5Fcks6UiiUpDKQohpVAoK5XRUAkNKol0z/++iuc853x425zDmLNaEwXKH3LOkjh0TqyjfLFxQFle+HHAFTsL3WnXtc90aNIrdp/qBlNmTOMRa+7CkoD3mPNPAs5aqeL+R3O4sOo2BMxzoczAYXgw4xdody3H9svWFCaIUL5LCqY0tXBAawOlvL5H0mfnscaFCnwx0pcCgqeTxIHXmCzxBvIkDeGi4SlUGahHf/VHNO5sGPxsVsa3k9bh35i5JHtTiOovHefmSQbQvTObWtdPBD3L1aDZnEt/D0zl/KcS0DPoyQdTAlDtni5NGwlw+L8sfldqTMn7JsLSVHfOTPWGUt3TYDV7Pmzz7yPh6gXo0yAKq1S9IcbckJbklXFLkTn8eLEP/lrl4to1Xhjd9pzmUCPMD5oAvwvFuKOunD9dlcA327yoyzYVfDfWYQLewsMVLhA3vw5nj7KFgQ9f+XvAObBRzoCQmI8QbZ5D3iyOIz8awhztmXjbzBCIRsGVQmX+87OUtpbnoorSGf4yT4K3D3/BwHFaaC1kDnJtjiQfJgtBSkbcaJhL9zYpwLfBTRx/RA6CXSI5zN2KQ23fwE2pP4SjAAKE9GH/J3MSuHMTpZu/kv2DiTRTowEnzFfg40+Y5HSiuDvBAAJdUuDBi+doeXgPHgn8xuLH1LghoZiGNxM8nt/Dik3S0KhiASPMatk11wySK93he3A/jJj0k7ocH0GT7S6Gjbnw8/1XtPhrDAf/eNC1fwdQz7Qc9IzzSH1zKhyKaYTiPT9YwPIH9x+SYf9CAzgiOwozXumhQuYFmjDyHLWWXyDb0GqY/voH3xRVozteiyFp9RjQdviOSqZXcF/fEnRR+0Pbd8uxuqg/Rcb3U1xtFE8ccYh/q4lBdcocOJOXDZm1nbj1v238xkuC82b0wZj9b/HYiCGY0VZF+qeV4WLfd86ZJskNUx/wjvgMXiz7iyvWGNOzlmiakTmfA36/5oA2O1C3PURf6lzhjYESn1p7kBvvC6C29UK8O1TDmwW1QKFcFV7EiENS8RYaSU60PPwrSU39xKs6emFRqxAc807gEX7W4FM3itr3qoB923mUE9iLHvkbaPuu5ewpWUCRxYkQau3F9W/Lqb9sOo2/ogvbtD/zZofztEPjP6qLAEhcf4fm6SZClLcqX3jtxAsEBOCxoznc9RpCnT0FtFtmNe+NdYTSY4HoeHIpiep9orqmZticpMuPxGRBeJQh+NyTQwXNASy9dQA18hrAk3zZ1G40n/NcjeGYyC+XaYCW9VHuLBjAdVcl8ZXmIXB/6UoXLpxh+1xH8rYLQrHfAHamCpAQe4hu/5kKkD+DjOu/wwvNL6QQPBeWKDoRljSjoLUJHtgmBOEj/aDyTRAX7P/OIi0amNvgCT17G1j0QxevWNMOUZvv8ctiEVCKDIfZCjvhyqzfWDBHEX5LZXHJv3bwcVJCsY22eO+NKNXe14GR4k589r4Jt+VvIG/hQbCeKA8TJgTxlYBBaM2PgJhLEZw4TQ2CawShaK4A/9zeQ90hnuCndRVffNhKwcZnwOzrET41ZzK+E9eGS/0ToataGvR8cmHJ7xB+a7ERrx9ay5ed+qnr1Hm28ZlM7d8R2sRuwqLz2ny2sI20Pc/DY1N7/KfsixOcwjjs9S443GdNwTUyYJX7ErbUyZLM1aWs2tYJyt++08XJhMt0p/LabZPIKCkQDouoQ7tqKvmMdIClcyV4uv9LIDEZmLFBlFv3viXz8/94Wv5LipIRhv42D/ybkMhukQJ04o8ZaeVPxrvne9hTxp51do4HMcEifHlgAlQtG8873j3g0YZFYB6tR7RFCQVvt2IcT+BfMWIw/nUDjgseAflwmB1+vaVpzidIEWMwZ2Eob+pL5n+TR9LOwU9cVj2P9aNlYYv4EIaOnkELo+24uCmIA+YsZN29W1m5M5WCvudx4xMVjEkfD7EqXaBgaktdfSd48Egxuu1aAYNUBFE+/vB6jS+teNqE1ZmCsDlsMrVO2ktxNfe4KmYzKQYcpPp3AXTL9RF5S+xm+1AHXnnUBFJeaiLM1MSN7qtg690NOPu5By/JW0CXwlX4/a0l4GaiBO8EteF6aTL+idbDjw+OoMqkLDxWVIhn7q/GMNt19ORyM7k+3Q0f38lCiNcgzBLcSn6zEmnTYSv2ldLAg41G1HpyFPyqcoQdTiLQaSoDDnuncqf+W94i8pE/Hj6G6x2XEgeJU8efckz1HY/qKhXoukIJzC+HYVdVH03P/cP47zI7V1qS5fFPMPRAmSs+PkF3sU7Y4UbgUHeHvC9OxsqqXfSksgJ2bDfjJTdj+JByCo67MJuDH2pxDo2BTaZBcDbxJj2c0YJXXJX4peIYip5qjVZpH/jeIuK9ludw9XwduJ+SCLukV8LX0DgYcD/JGc0qvHmRKlaZvKPEkdth37ME2CqNoLKqBbsjc2n40w8cY/OXd0TJUeLXBMgOlueihZ3kKyzC765bQqBDA+trypO8TjsPXnWAyyu76bTZU6g3NQFq/A+uKl/jA2dl4YhrFrZuToACyTJelWQAZn8cWdzIm6b61IP9MT1eIjEO1NP1oeNKEPxVFcSpUyvZecV2Lon9BHr/elBt31cWC0vC/mMeUJ9kDxNn57PE2CFov9qL6w+2s//03WQmosJav5RwwbGpWP14P90abwpr461A5NRE1v2jwh/f3IOsmrXs+uYJ54+twtn3SyBD/DaseTweYqrvsXOMJmwTC6Znx3N4q2QzfNrmTVvthXnulsNYPKMfvMbpgkBSKcqdlcKHrq8g76QPWVYo0o7P52Fw7kmaJp7D4c+1MGOPKWxzeA+FIe9YKPIfaR7xwt1XCrju6Q4QaSqgda6fWTYokHfOEYLfazxheOwnvGt+G2ePn4InRO5gWWkR+chdYJ0LgEeODpL5XHP4+U6TenOV8cjcqXg8Sh61nqpA2MMAzh0chX63btK2CBEwjdaHt4KV+FdUlrb8m4v3zwSgjHoS2sRkYqm7C7h5rKDCm7dwxIsxkHvRAgbOjsLcjK2Qmf6U+8uXoJ1aJWSojac9davozKoF5K4xDiZgNXq6p7KI5F2Iqp1Hhk4HsP2fDoedMcMtob9wb78XTqoSgfj/kmFawEx6V2qGutMIPGdmQVuZJkv9m0aqDVvwx4e1uKBdDDZfPEChm55A/Pw6HPQ6Dp0JvlBzrAUeb/2ESQ0NeGlNChyfaQOmGz/g3Nxski4v57TB85DrtxpUm6vZ/r4TX5IYIDEhc0z/MxGKynvg36Mp6DAjC+QOIApPUWMJRQ9e8u4ifx0VQe3X+jE+SRiuhHxm8QkVvOZkEpfPBJIye02Pr8qQUrYmPTlliL7qlazRoQZZyxsw92YN5L1uhICyeur8fZgFRzuT3+00Ln8VhMsVB9hDzhLUcCNsv7EJhAqeY87JCrwr4MMvH8zkIuFHPKT5HvMjpqLnXSUY1vehJ7X6KHbfhJyeTyX5ljrqCTAGJ62JxLF/8EpiKlXMHQlCJXLYVGPGYtEmPKQSDlFrblFrmROdPDIPojgUa1OWYFG4BSwdmofLHZThv7Cf7OkyjLcOzoHz1aPB5cxecu3WppsjXXAwSx7mgRVn2jlwwBwZENkRxD99M3h90EL8IrAKvkIz289dxQKFihCfnQlmrfNJ98pj5DtlUPNLiuyTtlN8dwcPazqTrUM4GibKw1iUgZaZw+h3+y/oP9zIcR/E+PZ7fZp0T4rezL2P6cePk2+GEVy++oZ+ePjC0t7NhIrKJHa5CkrMlvE+7X5+Pn8V/vPbjU0fBcEk8SElnJOj7wu38QdVDZBX7KBo+bOUa23Kc87FkrL9bDDst4YSs3CuCSvi2sIS/LonEasv6sG00hHg6nCHFPbOYvqpQEa3bUDs5yaU8C+itfXH4ZpRDc/IH+C/p1pwwfPVGGpaS++9LtA2KQG4FbEQ5nXaw/J/0fiZM2DHIQO6eaWGtj9ZQftn3EPxo0dYtEsCdGEWP7nRz8Vr5fn6xq3ceNWLGx87kFzNODZdu4yny9tT0FVl2O6xCBtNS1nt8ykS8b4OmwQPwOR7ynDkUSu/eJLPwmUMD/arw7Ix9tgVB/i02pkqo6UwZEsBS/fEUGD/bb6+sgIyi/Oxpo/g84oi6lkZwiS9Ac/JvIS1Un4cvrWCFAcQxm0vgF85W/niFx14tiIEd1mmQYT9dr7wppKKJ72i2B8iaCxehNufzyb5MWFYumUUzPjxhcaGNoGP42VUe7SRMn70sPbGAozb1EB7XGO5f+NpupluDm0f5Tlp9j+ObprJ8eZrsShWkqTfCEPwk04m4+t0d6winXyrDQauZ0GnMg0boqUo3i6ATU+5Q928aNYWu8/mF2YB1j5ny5OScKhFD6q0K1j95TL2fdIOrdszYMXdU3TqUCK/OdkOo48IceSq8fCvzpYOzpEFv0FPvFQahe//XgC7st98P02cvL26+OHCf6ivOwrcfl+A+K8yOFzym4RjbsH+S44oum0H1L1Vo5VHbVg50IUWLpCEclcL3pS9BU4XtELBXl8eenyRPw9chpxRsii0NQFFZglAI+nBk+zH6HplL9xpzMMqh8U0/nA/vF/aCTWBNnRs4DaqhDJNK1QBj6Uvwenccn6+xAzbd02CkN2euNdFCQ6pytHaPfWUMsoA771k8C5/AKN5PO0sHoZucztS7XhNMwtk8OI3AZbWceB3Led4w18TWKouhxf2TIHpigfR7MIJygg3xZ/HJOleQyo3ipbA58wn+FpWAoxTNvPiN8aweOwN7j+bBTlNk6G32RO7rQ6x91YxGhkUhaUzRUCnr5SqRhhgQaYxe4bvpThlS/A6r0j/3b/KXk3eWJ0jDdXXZWGK1SQ01daj9+eXwqDLVHZR9MBEpQSe67sFDg/Y8vsyaRhYYQuhXpbES33INGYJbV58Cqxq5VFv2SCv2e7PXuHG5LvkHu8tnwA3372g20sPYfJ4Oe7tN4P0r9dx0d7ttLDvIkRE7KPduafIeJo8CKR3wrgT/nS/+C5+Bits01kGhy1ug9vaGZx7WI/yHL5CUbwaHDnRhJmyTEHRq8HIuB6mwlrSlpvBLUJPOTY9l0NzH8NoZTl49rIRp1xwAoHbO9jftw9eFHSQf/04vjCjEJeO2gK9MRN57XVVmLqlnbA7hBeFiNNEgQCu/ZcIf6I+Y8udYbpmYYyt+WHoJDEeVuYq8YJ4Gxo6XYgB/tcp+OVldM84igUu70FJZhZtWBYJwTsQurQPwvqKZ/wqQh2OrrnNBqEfwbF7BT/IDacKZS/u7bJmP2dJcK5zwNlbZ1J09myK+KZDQ9dc0XZRP936dIE+Tw/H1gVvaU+GCYTFFsB4yWoemnYdvP/c5DSDuXRcQYrzSuawRv4juDcmGXc+lQYT16dk5HwRK0fPJYPF/+Cegg8k3MpkjSAlEBtay2riL+iDqzwk7ZtEF7uU6NjpkzhqgwTVHh7gRucP9GJrNRwI/gquIm9g3R2CJfL9aNT+HV83LYEPRgN478oQc8F0nrVrEfQ6jkP14QPQoGEGkTuV+XvtfVYUkGYVYxEymy8L19IPoMs1V3qv+Re3X5nKAg+l4e+1Q2S18jabai6Ff08qaa5AKDprRJGZRjv+arfD//bLY1WdClir3aax2zuxs/U9aGYN4tpfq2nARgEujSkEdyFGyU7C818YHgR1YSR4Qo2NOX7+VchnZy2HUZ8Ws+52pH6PWn78bS+4NytDu/1RrBrVjyUfu+jD1O/kLyRM57zWY4xDFIuJPkc1D202z9UBo7VSeOXgbjhwqBjuFV8nT7/vpFY1BC0FoSjJuyho2yCM1bcEvzWyrJ19Cn6rd/DBmzW82HA/5yn6ULaOLSicEIGaecwJiaoQ7dmDparZZLnZEi+dD6bWypvcXbwH4N5+0r+xndX+RsOjNh04MVwD5pXr2WpEAicfOgefLyjiqXWy2F7aByc2zsfTmlspWlgNBBe1YefBG2yZfozMzs/DAN1SihwQhbVG23FQWRFmqc4GFzlhkHLXxPFunqySm8tZDV9ZK9wCex7mopf6EhK0EIN1yYeoZQLB25m/0aLwE5xtikT740rkNWgKL3O16cm3nVy+HxjVstFOTAu+aHpi8eEJ4JUehZMd62HOliCSmtGNDRVb2GX+AjJz14byzbKQc3Ee5q6JQ6OHE3lFgjTtvhKGln1alDL9C2pcHYl56eE8/ackOLql0e77cWwsFALN2xZzfU4bPX/fRBu/BZLJn2tUd0oKV7gowwR1X1ztMZIW6UfAxsOnyXD0f5CgsZhkrjuSsnYo1f5K5BW+opCZYs5aOzaSV/RPjvfeCSu2HKIsMw+4aulIe8SXsOTeYbwpYw/GC77w4Oz16LjIH4u/LmXZwacgufUGFM66iue/XsL3R/fD0Cw5UP24ko+o3gBrj5N4sr4ev9sW8tlp0jwkuQQ+1A7A/lXTMWK1Cmh9W4YWzUac11pPP69dB/dfSnQqayfWLoqCM6VVYJInw8mRCjB/vRC+VxbH/rQ8uv1+LK1VusqHovphTOQlkLdXJYl3c6huogGs6ximVTKCaFznTZEmCrgoNpMjNkWz13oVNg6O4Xu6B2DyUX1Ic7Gid9sJi+VS4FjyWX57tocmjiyjcKs6eOxSjxLvwhjXaECFynZSPHIAfl+8i1sq/oOg6M8sceo2P+vLobzeXfz3UxdU7R4PM3TNaW6yBgRNKMA43Vgu3Lccr2Q5gsAkUahv68Gsw274vsoWUr/mQOt4HVybNMTOx71oRct/aB/wCHPK4jEz9zjnZRHbf5SFoNczafr1OOSvf1hyVQcbnfsMGwYFyHD0MhJtSIX3rZep344hcdMYnCXFMCytgWnPVpLRVWG8v8oHjHdPx2WXWhjPbGY9CwEwEsvF4O5nNOrYHiruVqOrze94rHwyrbtqCPvnGBDNKSdv/8nQrycEWvv3wIhn/3H+3wRsS7IkO8863P13BNt2D3Fiexx7/zSAtJZhWu+QRyID7fzhzRAkzhXnSRpT4FGfN2xpXcg0Yx0eSdMHy9F5GFL8FKwvaEPPwFtYsW8iYpgAtT4qBivJhzz+uCwV7BsPj+PswOTqdgiavJiP7zVB/cBOOlEkASZrlv+/QY1Sn8aHr0vCg/kfIK9tFtxeWI2auoN4S/swzPXsoOHYg7jqkgk5qEVh2QyG9S8uIAf9YpsNI+jz6iHoG66D5TGZVHZuF/gJWkLVncVYXDEa3l334qSga1iyKgqDtJ3xvctySjS1hZ0553lBnDmWaBpx/6ARTCQBvDgwBZPe1LNmpT29OOSJ8xQCuchwFFhpL4MeiVRQvjMWxAoMyMPOC+P3DHCzlRIP9j9EkwVfKCBNGfMNJvPX2A/oEywNEnWifGN+P6qtcWOKlcOHXmZ8dlISFF4Pp2NvF2OXYgXfCZOAgoNnKKBTFerPl8LctmdcsEgOylrmY/eOev7c400Hd7xnUV1xeDkngA71+VGhoRpvnLISNf/6Qr+tCWZaMNl89OKwnJf8KW4kiPi7YPuvPt77QJesCh5DVowPm2Vnk71iNK849BY8x+8C11cIi5Q1eaWYDKV6C+AmvyQE6Y/Q930n92gyLBdXRkkBNXr2nxB0mI/H5Q9mwLqjjO4910HB/RY/jZpHCk52kJc6m35XVnN2jwGsHJyAQ5nvwSjGl+/fSaLCDAfoy+wgX00HjnKK4yN5ehTQYQFPPynhkpJ//PuEPLiP10UFciO5KX+pKegnlyQ8A91VtWA6WgIOTKnA+uBteKn9HxqK/iZ99fXc9nYV9PXqQ1eRJ755jBiUaA8/9wTTs9uTEEbm4oPCJ2SrIwdvUxV4YWoQaFxyAN+/H+mJlT1Mb3BggwE3/vb3Jtycco1MW2LZv2wUPW8L4iK7CP4gXoG5q1RgfuknOL3uBZkv1sfZD0fDt3PToTj5MGqeVcITWfdQwv42ClbLgV5qM0+8UoaVqtms2WxD59OicU//e2h+bIWH+0/haZULYL3fDg6s2sgvAiexjbIZPFp1jFftyeZJe/J4v2UcbHr3k08eX8sz7wpB2/2jIHxdE4VeJvCcy4pYFVbDW9paadmyFhJvNOA7Is/xhr0ELPd9DZd2xrDgtGBSit9BpkfV0HX9W55Yfg6Kp3uzvZcJHTcAuBK5jV4dXcTZdrno8VgHKi60wmnZV7iiyxIy752juLe7OMVbDdadUIcfJ3xZ3UYL9MOfUciUMijsHeItJ/ppg9YIUP7WxQ3rZEDh2QSQCZBHAeUTLNxxG9TTEthRZJDVN+dgiChiQvw4avihC8GS01jWA/D77bPQukcWDx+dzfV6UWz49B8JCQrysdMSfG2VCayRqoS7DbdYdPJFFH63gqp7vMB7vhy9dIpE3isPok9HYJaUGZx1deSImFvw9XQVPupogqcP2vF5+Do8KTzIdbN6+O5MeRLJswC3e3awqXw8//CP5fBfRTjCsxQv6juyaXw/WhjHkGXUaK7XUAFzowp+s7aG5rZVkdyacOB/8Szs6057QhZSwWYTqF2Uj5vtJsPeVmGu7W6gwBUb4e/vTTAw9IV0aRcd/7wUXh+aRWAqzsqecvBo+UMurlbDpCONUPr3E45p/osjzJ5iXrsxqQzJ4MndD/izhCAE/3cdl1Smop/TDjj4fR0Vm0YSCwdRt1E+nn/oiPOjnNF5hDF8rZNjBw11Vix4yFMr3PH5bw3MmFRPtQNeaHGnDV3ax6NosjF83NNKP0LFMGCZN3f47IDGpZnoH5yPf/Wv83aRShAXNKMzu8bBjat96L1TnQM2ncBnC5rQ5cNS3r2plso2FPFiz2Ns+EweesdZwds9YfDOSIg+D1uzkKo9jHg8nZ9/O8ChezxBNlSaF6Sk8JULQrC2MAU2Xh3Lh44f4zPRc/DctxgYvrgPgj8fxBE6NZA0ZiKf2m0PJmeHeOyYYoCV3iT4bBl96d9G9M4IZ449hTcdL6DhiSR+9s0IFG/V082gRAoKvgXrl+4E+csr+MG28ZDifINe9lnzXnJHU7KGH54nack0S56dEcpfx1WzS5Qae761peDef/zt2z5Ich1L51AARlqvhgVDBXRq/HEqEzyLDmk/4Wu+Oqx2XsRN1it5p/Q5DI8zBYOGD9x4XZe3enVhYlcdO9wdhQeDb9NrhTvoNWUB76keCWabENa3e/KLhOPccLCMXjSvxHX3nvPGW4NQ9l8cec98B8X2XyFRRg7+LRrNUzq86Vy2Or+YKQxr5/WR1ffvkNP+AX8f6aJx9pY49Ngeyr9/gWDX7aSjLYyb9vXibM2xVJkYzMbf7Lh+uz10Hb/LL4MEYVG2KmY/1oWv5mto7tVeaptlyR/+dJFa6l1qFQ4E+PUa6t4aQMm4BP4xmEuRl+OouzYebZbrQUqRGhyEe6xwcjEYS29l6TptaLgyBfOkZFgkV5Ubt+7EE20unLzyEaz7dgVnL0yH3A1beZbkZFiwzxU0Iqr4RpAlHptuSs8VDlJCSBwld+mB3T1XavIZxa57NSH5yBfcLXOXhB194MvshzS97AaEzYqj1S9V4WCSBxvetoXJKtawX/QaqMVass/urzh+hz0NzOnkbyWnYe/0JuhRiuTn3b3UvXkyrDg9CgOWKHLzSXnwTnxDIX3KfH5tL8+bNQUalmvyTbdc6Fk6ES6OvsS/H6Zg5isD2rR6CWV89oKJpsK4o6UZ2tNcOKbpDO84y7DaOo82nI/DfM0fZNn4HbRUVnBJpwpJLJTgj9IR4KEUjvnLJGBFlARMH/eUFfdth2n3NXFdzFbcsWA0Ky9bBFr94hThXUEhb2XAdtVIXPj8CBW+tMcpB1JhS9RY/lNgwv6dFdy5RgCnRgey6SJl+Nxfy2MNSnHUHheWsAVWHJlJQ6Gx7KexHE841fHfnQ9RNs0GdvpOhuuOUtQi7ktrM1r5nkI8P15SCXO+9/L5i4tx0sN3sM9BGHQsXsH3W1qQUrOLOV0c9599iR73NHhS9Bay661H/pGIL6qEoCzKhk/E6ICUoC23P0jnqqgdnGWrxBK/fXDO+OV06/oI6JeZDIePjWbJHwr88J8h7ZctRTlhA57VNB9euIpxx+Aa2GLdR78kdKCxXRRGT19Niv/sacDWDQck72JDZBA9CNDElsYIzhbWpeVXDGBLnggsCHWjnBtqcCJ6Mhjle9HQga8YbWBKIrZHoCD6LP00mgitFq6gc9OH8j2TQc+5HocfC8KIwPt4ftRb0HG3JhlnXawN1IIrOT+h0eYNtLy/DRVB32HxrrdsZbIGI6fYk3erBM323MR2781A68FVEgx2Z2ePbv4p5Q1Sp07i3wUVNO5nMhZYbQHxgBeUmWQJp+zk2XZbLVjtSMfOC05gGdgD41p8UD1wAFW3+bCeVBkuXD4alpUfBPkXmWRt48qS8mfoRdE8dMsSZOE1z/HufX0Mf5yGQ97SYDhXiPQ3bmM9v3e0wWKYTnRd411O6TQxV4KPpW/ig1fHo4CpJGwLq4Dqx114edclcpLaDgp6i+jAkjQUedTJESbX4NOW57z+myEssXkKXPmGQqd50CtJB3pq1QLq93uxss6ex0rsRteq7fx6iy5I3imH+faEf/quoZ5gBXwJUWGTmiP8aksWKiZNhDXzM/jPZEuoG1dA+rNm0Vy9IjAKWUoX3hzg0O0vKXLLRPgs9wqOGOZi0xN7aBNKQfnhQ3zEMAdqZHaisa40uP/8TG8fhcA5/Rpe8cydf9mNBjGTKHj/fCOaHs8FcJ6KXdGRuGrUBth3Xg0rjorBhaVa1D1vFLzQm88PDqygdX+mwOo3zRgjnUdaWM0aG8wgLMIT16p6QV6sILxN7cV4v144emMMysqo4Is3m7B1Tzp8HFqEbabnYZaTAZ24agQb1qph1i0VTodY3lLbhvGl5YDiq8nklQjkTTPj8QJjSPSbKHSnS8KzjcvYcPpq/pXhTNsis9lUPwSHpjniGl8/Wts6hncfFQGYbM7xBi7waIcG6IasBMlPFzkjyIKTrArIdK0flrbMpaP+VsCWguQglAuNbvOgRO86vjryBz99Hc0tF2qwoTME7zkGwav9DDfbY0HrTwoZa4TDhiwt/u9ZKtxSF+Xld1ditOMfnH/wDLs9NQK3WMRnl6Rhg85VmrrKm8Y4JWCkgjJ8CU7iLNnn0O5mBr7BqqAedhAsny5nsbFV5LdYD55VebHJud84bP6Lt28tZb0FoWw52gL+KRjARJFTUFTYw7uGx1D+FH+yUt6JySeOsVLsMgi5Ow4/JxqAdboZdMi8wHDy5HlLE/C7gBJnRmylsm3RFBu4GN3UlSmtfDJUJLbRg5VOPFciALJ9DTBq4CaoQjqdeDiWb3Xps/e9SmjWnQDek4foQ64uusf2Q3LUGnD6c5zl7z3FGZt66ciV41jle4puF5jCcynC+5e7yf5ODXauDOfBbzVY7L8FRpz9i6H4AIsKzqGahRgYeKpQhvc06M8eAZ3Xc2DrIjXUclDi6REPKVVGlxY8baRnzcKgPv8W7J/xnG69e8GvRjZSqsUlmGtynufpjeayoOPQ0VQDwxka8CG6mhYMKmD541rM09wG/s1aMMfhCaO1DBssOA2v6ybR1b6RoPPfaeyUkUTBMeOgftorCjrtzjXfuvDkeoa2nnrO1HMHSYsJACuXYmBoIu9bpIIqdgY49eQwBM1YzHN3ZZNS82U4bfCCR5dbw8TDBfzgogR4/VaBWs9hHj70EcsUi+hTpgn0il+j9moNbHcZAVt7prLyuliYuXUnCX2ZS7VrXGDB6Vds3n0Bpl9Oo7QR3mjYaAqXr5biK9FHVBXvz6ntWtC4+C+c22QHq9O6OGaVMTq91+X+VTrwcVE8pI8/SwsziuDT2xXs4lhKtyzd4PLBd3h9wJc3W27H6T8nQO/xp6C91RF75D7ibl853tLghIc+XcARczsw2fYnqylrgsmLCfDQeCNu8IhDQ/mTsHK2Otr1mcK5h/ewLNuSv6qOw6Z1Fqi9Vw66fwWjU0AzXhiwxJkjbNDt8xlyv7wNwqQmgcbnuTRTZi5WKo2E73mitPmHLsbtmkD7dE5SR3UgQEk3GAZE88mQDzRqzXZcM3kcTJqaiarK+3DW5y/Q7LiJbsso4uKV8eTmdpfzL4ex/4lwuntDAwyOVaHCrSw6436Pvjh3Ut2FU9SzxphvWO7m7yG5PLDvBjZ8HAPzXdJoqdZ0ev3YlmVfy9Pt2AaoUwpl0bNeYP1mEpxxTIe4xYZQJT4XmkQ+QeXN/Zw7fzPHjFrFhr9LwELQnOeuXoKHMgLx0zhbuEdj+HncYTwl9QF9rRpIUusCW725xtmVZ2i3byL1FKexrzuCUO1meCi5k3f/2U+pi55ge88P9uk9C5Z0Bd5Ep1DExxR8ulcXFDtF0a58Do4hTTqVu5lfXXEE41UOEHgBQV8ilH0eFMLoG4JwTbkbjqtuQoUIKbi+czFXLX7MkP4E9E/F4sK0B7xt20yY3qENgWWKmJ2eQN4h2bCknHCr53lyX62IZzvWY8HOWrr7RJcj+7SgSHcIhdcsoVfz3fGDozP2LHqK5qW3qDfQh2zyZdg1uBAdRKSgpmMtLnAop6Dtavx5MIH0TC3g4gJ5qPj9F/d9+0bZP46SxihZcM7XQ3r9g/rea+PNnqU4UCrOG8Ne0oJ3gtQiakOWmTn8ttMSNny6x4O70sD0YiixwwQ43dEBykHRsMr/L+WezqH4VUrY3awMqZYdFPlnESTGKaDRIwMUWljL0dGOOOGjM+DybFSIq8JCUQ2oSrBHFZFFXHg4k72bFemtWTJkp52jtYP6ZFGQgtcTcmnOLyEw0peCQtk2aO1uA1NpebbWO0u3SwlHm5qSUn4J7atdB96CotBh3YZus23xxppWkr4lDxFmTzkpR5SX/xPiTsONEHUmAv2fisLHmxPhj78HZi1WIP3RL6nmcxMLTWgjE49CunzSjDJOhLDfKEvY0aNII2+m0YcOd4i7mE1Bm43506lwWPY9gV8Mzmaj/57Q7/6R8MG2EgxDptKUfy0grtwDic1ncfNuU0JjYdotfQkk/lvOL05NgAljI2nxuVO469UcvLMwA2ddDIaIjtUsvmk0LI0/j4/E1HGfmwRMSbwIvc0CNClmgL6pP6UJj0z5mcBIOmFyiDmpmS+Na+XEKcJwwvAg+u5XomdeDfx+wAkm7imnueND2CF/D2fG3uJtY/fCgl1yMMPyE7vf/0wJEYtQ9e4JdIxMAMt1TnhyzzC9TL4BtRcD8PgufVC8fBbG/kzjxzXzyGLiEEXMsCajDWM4Wek8Rv8NR/MdIZTyTxF2TpnEts/f8dbNq+DKja/ktEYIYoYr6DyKYtj8cFBHWb75TxpMu3MgVPg4hdp1g8dHI55l85Mu3z5J8Y+vc+xnQQg8FU4lLtKw4PsNrur6DVvmCHDqjSfsJKIOUbaP+LNNAQvN2MQF55BfdluA3O4XaLPvDMdfvkY3/vd+8735dpc7FzfJ4VbpuVQ9x4GWzjAHrfoHuDd7P+ika4B74xA06cghOyzBNIWXmOl3GZfIh9OBbfqw+MEi8HCIpYP/OXDbt9Xwbt1Ujt9ojgv1zoHMfGH8OTUQmvdNAsWcaxSuZk+a4qKwJewpnrRLRqPqEAxImUVK/laQMfkKHf6iAisN+6Aypx1UrO7i0Fh3dh3q5xW/tpCYVh89cfWGHxJL0CNHF3wkkB8t98K8X1r4R3QI584y5GPuyXBjmyksHj8ejc91c6CcFPjULCfrB+vRoD6LRyjPZPWpEmB20Rp2+Qxw+r9ZeOqyJM+zJSjuuMR1oQ54cTiEw19ZUtxlOVxp9ROS3YFrfA7DBVNXmOJqAPvDevHR6oW0qXw0znIYycNZ0SxdfQmD6ieCh9scDDK9hmd2aEH3xE2csmoHmyabcpFgPl7a9wUcZs6mqYfe091P8nwrpZOnREiAxPAR7lhlxc8P6MBW7W+oOHaQI3+NYLX2coxQGcE7Uwsx+KcujCoTxcRTiXjedxxb6zdA/eSJOGZRDzpPqqczAyPhTU0DnxaUAg/Z3fjdbgWl+8Ti1icveZSlDSTm5RNv2Mfdd3UxoFEKH6VpgO/bq+SzTIg2hzmippgMFTisBN9Lb3n5rhxebb0enFLnUNsDBVjqkMPuN9bgpfIc0lApI/2T5Xh/7xqwma+Lz8sjUbK8hN9MMQeTmDTsqpNnfU170unxI7UbCbS4yJ616udT0wchipi0jwJdJCFjngtdMXzEh6ZVIunGwuNF9bQpazo6H31Gp6b3At7ajudnaEOrRyRvKpnEHrljkTbvo/Oj3kDTiNeoc3saKlYh3tk8wOL7DSD3QQuU7LYG+6V5sLHAmvPG1NOPHe9w+c7LfO7vB8Y3fTgRR0L132YuyfrEJpGttP+8D/elzaEn+fUQ6JfL2as34pngqfi3VRB2+uxBq7xqtunaBHtbnrBwajp4BjvR/nBvKBc6CZGDLtiXaw6HqhVhx0VZMD1+CMIvjsHwFc/w1dp8ru/8zX7ep8H4aDqL/baD8x+DYVKqEzWNlOJMzQis3H0bJr/8Cr2dZ+n9ydWklD6LVzdKQmtwOH8T2Mfnpn2nnKyRIPRHBkOO/4TYQxbgniFFQjHJHLPcCPLcxlOrWznGX3yCRS3qaH8lBUvS0shmzEze83UkC37ZAGk3NGDo/lSYohFFZlNfYaKKByvuWUBNmpt4ls1LLvyTzUYV/4GvsgScvTsRbiQdpcBHeykrRZWSVh2DMqU96D/0lZLWllBssT3e07YASP8FV/cU8D3fx9ijdwYMk8bSrNptVJn+CuSj/ODj1clUm6wDXSvy8fAbV7ofuodnjj7K05u20iElGSiLmka5exaReUkSdZ1TBtPPITTX/TQfbmmBsad7KKjpEfRN0mTvS685S1ge39lIQE+XEjy26IKDlp9oqrMxj3EBDv6wlp4u+cBRyYOkL99LN18up0v1NvCnNJwm7ByLQ/cm0tH1Mvz1niomKIbRkRk6eCziN6QKWcC89Xbgll3F3rVRfFxvK3eGmINfahQqCrliyhJZ1Ixy4ppT6bj2jyUYaLpApeNM0s7aB56vpclOay90nJ+Hk8RUeYbHVDwSJswDhTJwV8WZy43y+ZeSKZwYsQ3o1EpY/b0YWhYrkGOoLIQMPsA/KZpQ75yB48dk4wTjXno6+I5GremFAyoradaCRLRo7UbtpQ70t1QK1rW/Jz8lL/CwreSaG39wab00dBwSh45T7fioxpJud2wgYd1xMPdXPHjKLUYF6SR6POYkHTyixi2wjEdEzwGdT9chc74EmkXowr2u3bxM1p8y3RKh6sxROMcjuFYkgkRCHTGs5Qy1cBkIrjaBvSlx3HZ4EdVay+MmYW20lXzPlL8BHD8X81L9Mtiz4QzONjMF0/nB/LZajK+tE6GXF7P5+dP/oM5FFI4JC7PTpF+wU/o1F4cSzLcrIy2taLyx7R12Z3njTdEn3DXdlPOnBrOfbCNvFDCi4zNtobGoGeKdj0LyrmxabyfJ60Q+wbWZx3Gg8xIeNZ0HhgeSwCRLHNbppnHV8lGcoCrHYfMiyEjVi9Wlf2GTcgvPGL2NwmpPseMsOXiXegztLcxIY+Q2dInYTrvuHyPJxSfwvV0CDBiVYr/vPUj3HAUV8w6wSxaD7Kw9NG9qEw4mfaMTg84c7HwT78/OgkNftlPGXwEYb7QAu57Io0RRO473sMDKghose5JC3Ws06Fh8Eh2UWsd+z8ShrKmJZGgAri5+TAd7nVn+RTKJSMtit9VoSl5jjsdjGAWMEfqP7aSK2Wdwq08b0rd4OP9lO/sGz2eX5HZ0ykthcZUvIGGgCSWVwvyfpQasThhFPVtWscGlI9xW/hp3x33GC73jaO7YTnhvpAG7LOshdcoJWLG4Fi7/S6HQRd6oamfLH4vWAnqqQ8fnNFx21gQOzdfF9KE7WFgYA8fqdnPtiY1kF1wDa8f6Q2zfDPS3kcKNluPB6uopUtbyg1WLpkFLYxqOU/4AtXu+UaRGM15ADx4utYHuN9IQe3oQxnxWoYr1ebB7rDp/CF3EMVIPqFXRDhrnLQeb7Bm4zYqgaU4f/n3kjKPahDj9dSN9KhDiM2M+U77oRrr2S5XWNffDf0NiYCUaR3drflPaMUcabS1Nw8+3cETTeTi79xX+OH0URVf9YHEhFfiWLY8zPXdA0btlMNfmDKYmrUIPN2XK2V4FaodbyOxgIK9R0YaN4x1p6rz3VFd0jg02J4Ok5190HmNDNdsN4VN3Amp7fGCdXhOInTiTxh7+SH98d9O6+69oc9ZqDtjxAqKMd6OFkTJu8qoAD0N1mHM7ihxldVhUdTLb5Yljq0wnz/jlQjdPvqUr8cWUvVie1v0ZCSrOVby47Ryl7TSEjr12ZO1eD60n79KxzitY5GhKC6YvgPeaUjDGM4vy+iPIK1MNci8voyS7Nnzu7IeVXgVUbytKHcFWeG6/NOQs74RdrxKp4elcVihfgxp1f9BA8j9q6JWBkrosVBcx5QQ9G+j6sZ5ic19QmWs2KB2No0vHQnnuaHcQVLnEDa3+VBV2mTsWKUNG7jkyi/HnW019kLByLfpELqavnzxYSaYX+1MDQTY/j++2CIBB038weHQW3/Fbgfd/jsZrb+7Q9h8qkGppwP5rrGnHxisw5D0C1EtseJZSKpaPDIGhlI3UlrkSp9U7U39JOf3YOJp7ekew8H1zyOMCLDxzkARe3+BLorb8xWMcyVZG87kFypjrU8FLAkdj9lKCCTNMIXuKM16+HYafKw2xUGYdfkq4zTfO2ULhNUHyV9yMCRNMoGZpME93mw09h79BZJM51ZofwmpYiSVPFjKZOcLbYz4wesAernsaUMONHp5mcpO+PH9IDVutOWxqHB+wc8IHrbOpTuskiKsagP2HDBT+1gB3J6TxtuuPcflgJJ497kLRj2v455lamLzNmz9NNIZH1vpQlHeYX0jqYkZ9NK1YjhD92h7LS0Kp0XcVfDsqTpmmlvC61hMsG4f4ZOl3tFwwGkaRLi1xXoHNC9ogxzYUVxumguBSe5i7cCLqzZcAU8HTlGM9CcNMjpDmlw2QsesnL76oBV7vL0J0pTJMe2/MwdJb4VlsGCz4sRdeDDMsHadHdycsALnNijRrwSk+msTwafpkOqvyEatzJFhhghNi3xaU2sB4+40CRuqNwVuHI3B7gTaMuxsCTrOLeH1FOwyrBuKKACfeEVvJHRl9rDzdjWaWt3PGujHwLT2a/ecZgLGSPruFp8CXS/ngs3s+vjGIoY9NLrj66DHcv0YHEoaD4WpcKUVscgfrouV8ud6Cdo61Yv2LX9jBLYTiH3yAOysNIGZFINef0YGQI8LoDlvgGr3AYyXidEexmtvum+PwjDKc3CsF5xWnwuHTofyp+h0+bJamkGRfvjPlCobptPKxt3IQeqAEFozXBNX9S0nltRR1Vv3iST3O2LtwMkk/vc4bdoriVXkzEtgaAaK71MB/nj7J/Kpgpa6r0PVuE/VLqPDHponUITgKOv/TwaYfRvxaShQqxFTxooczZmkzlGj9RrfeObygbQMbdBWR/FA0Wwh4UnLaZDiy8x+u65lDInKHSb7IiUbq70TRlbmcs3MKPph2jmMPruXoUAn4+t8tDpS8ihntZ+nDgymkFWiBX973QZiiBQSo9+GbbFGczpZgWHga9wwc5T7HYhwnOh6Pf1uDYtpprNehitJHvrBKcQ8YlalCwbI0PmhtysqFFpzSOBnnhMwHD6VUFlqmQEtexdGZFE8+lToCXl8Lo7D2MaSw9wSOCx9DsbH6WOKWxjlJNng0wA//itiRsqgdvDWyhF+b/5HeCCQJ/WRaa5zMYQ4L+L7Dd5jdtx/9vQDd96mCyMADNvTyg9j8p1R2OAoyr1ZidO12rNswDyrGqbF/rj/HrVaHuxPV0cBsCPVz9+OVYWeMMzeFwX4tMJq8Gua934PO8imcpCwCGuLH4FnhbfZdrMTivQewOn0IDsQq4N0dhE2JSzH9NJPvHx1Qoncwfu8NSHyehfIndNl9xyTK1I/n3j8h2NMnCb+V3Xh9iyLsM/4E+vcmUFTZdYhY6IIR34vAYIYepKab8pEdQaC+U4Ib3Exhkutl/mj1GmN7nvPQR0XKKkzhiKgEbtJ2x7FJw7jpuALFdAvD7BsK4PfWl6xiZ7HQoAXMujiVPbdswu4tHmh2yg6HlxzBFSpGENEQgYGmGjj0vZ2fy0tg5uUWaFx+mdv9x+DS7G+0J2sV7349Co7YiFAseuPtFCms8fGEidozUSvDlvYtvAg7/Z7ipt/K3D84FprbPelZqD36P/tIkdKBUDnUAqUjZvANretU27sQxf+MhN+SY8FmchZD3Rl+1JfGY5+fJLXGaewaqAjnlW+wg2QHl7w7iUaLZGH2dxHcIboX7LNW4vJAP+zOGIRNkRX022whmDfW0uPhtWBXKgz49jE1jbrFfeEXYF5sIa4OfcZPlWKg8FIGmjWfp+IJX2GJngi8fyDL64OUqLlRHG6J+OLS3hr6LvCdpy7qo4HHyTjZrhmWGepCR4UQcVE0hh/potrSdnKXL0CRtOuARfW4/4cuvPsvE5e+nQwJQUX/6zNahXijsdFbnLPvNd2Z851O3rzGIRFL2cAnFd5NmwghB57AMtHZ5HvrFZ++M4fzti6GjIwbMPxoHstvG4OlfzQRr+hCfm8XfTV3gWKHBr7e6IWCy8u4tMQdu+A6PnePgtK6cTSy3w7iK9ZR/Ol57L7bA++sG8dLk0X4vqAb+ra+w1/PzoF4yShodTABt9W98LclGabKWEKXqBqOOysLFvZ+yKJP+f6teprxNJF1DxhBxK5UXiEgymP8tHjvii3kGH8KB0olwDXGHYVvvkXXjyUopTQaZl0c4KcVCmAbHQKPV07AvCwJGKuiTp/Sh3FT3mS6YhXDW5eLQ6vOfdpd9h+7XpGAtYYvuPPNDRi57QGMeyuKJ9NMYIa6FX6TIfig3cspuaPJMXs/HVgH0KVwAdfsrUXVmkjuvzmJDmg/wobF1qD43glNVHLotJsCWX6o513PWqDn6FuSMltMoTvy0WeHLQp168C/Iz/ZcmkneV2vgNHtvfDvhwYFDDzHfBFVqtx2i+I2fIMpJQDZh7/wk8ci8Mp9CnSr98KaCjH6UdlD/WGjYKD4F6z5Ox/K18tBdYYKjbnXRKmP4lBsuygvUdTmjJ71HFjtg+ESgFs/Z1FwnSW0+F8EDzFxvPzKAhaOaccjWkehNfog7rwsC3LhlznrrSclVWuDQ583+fX5MD+7jfOrL9AnkQjsVN4F5oc3QNOjj+zbrU0aFzThR34xbfGTw9vHJtHWiHiOv/cZmosfw5ZpN8n+ozZ6tBazTacgBGeKcczGxVBZ/phCL56GsqQB+jr4FYZPFKFNsj7PzemF3Rr2UKd6Ft0fmOFGnSe8+/JBxLIvpNs0D8//DsHpG2LodMATTlpmCssTl4LPgnBwSguHf/LT+OSlcSC2wgxiBg/ASz1DmuGXjAdEFWHvw+M8Y3MxNY+/jr+bbtPASSPw+9cOU7R0YcYOL+rYp09S7iJwMOoRYlI1FrpV0FjRb/BFZhtZvQPqqqvCaZFP8HD6dhSlkXBnbQMuCvxCf/pHs8ZpdZjqKo/SIh9YVkELl112o23WcyHijSyYV/8D4yuK9E/uPTYLJuDdzxrwulMbYJEgx+QWkyBuYzs5hlS5Kj5SepG+HiJQkxVmz2V7sCWjHAPSzKnuTQBraSryCdNJwDELWThcliT3W8BkNTO2qzlP4HYEDqYrsMiId2T26xCa+hjDuTtfSNOolIZWbOB+kT1oGxcOLx7YwIbyOZD3y5I9bJahdpIEhE7KwSeRfzGz5AVF+l+gjOrJ3CTeTaEL+3CD71OgMX8ZhsUgc881mL5qiA/9H3H3oQiEogYA+B8iQkJWGYVkk2SPQlQSJSWVhqKoJJUOQqKElIYGiQZt0Y4GEqJEKmW1hJDRlHEf4z7Jd8+MvcTHwISbqyDCfBGu6x8NH5aOQpXV5VDiwnDqTiatva4GEQeq0HnhT5B/KwZTixfTkNp7cFsTwM75QnAnRgIOPbQD4fM9kNC1gp9tXw3tbx1ojeFD+qQpgW7Sr9k2IAGy60Xhs44+LNznB581X7DO1LOw8fJxiLuzDnV8N+DTMFFIc99E2700ILgmH2dVRpBkZye8GorEQ06beOG/8xzSd4UjxotwjZUGTT5sBNo/NwN8WoBjt7yDlM1JEFigTBsOJ/Pa3FrUvXcDeqeY4Y4QQziIivyj+C9d9ZXhX4fPk/WRYWw78x3GupSjf7I6VDj44m8zgsq/RiQebI37fUpppcAvkjAXAlODlTxZdTTIi0xgw+hiHvlLDxQcGtGW5DC0pREM72+hlcpeWCkwgq/1ngHZ80gfxK1pXKY+fP1kgNPiqvB0cTzo1pmiVlw/LVSfijG1q4hzD0KPwUM+l2sJdTCCpJ23wl6nrxCR8hsmGCfTeV9xDu9ugetPt2HtZmGatGAqLHYUoCk+pfgybgubqCtwo78Haq6pprPl0iAy1Q/2ryumtNcicCr7Bgn/Xkbu2irUxgK4rcSC7v1bhWda3vHV8d9I2cuTWF8ATnWls8pUE8y9N5lfYzfz3kKK1ejmNk8B9ta7jyc/RHHpx4mwee903j01mpffcURXwRHUtd4ORi3Zwc56Y+jtrVl09m8MJF0Vh4jFU9h43wx4M7gN1qxoxasx5ui0XYQPZlnSb8X9JOT1mBcssYR7N3W57rQE7en0wP2XUmDmA0U6WvKaLl3M5aXnpmPAJ0WsfmUKpfmLub15HigObGedmOeg+8gJr5geoulYy8IjdnGSVDCo3RoNItWzuEzkMfTfrIeca+qQtTYTjN+vJLMkZ5RLsUMnl3PcXKoCOytuk0J6DOXGjsLpBU1c7BrAQVtUSE/NA2tgM1pfSObVS02g6st1NPmewvEB9+nbKTc0Xf8PAwxb4eW2x1zbsZv9W4Xx9bAlKP53ihY+SebkpSEgc/kbb+pvwIkvg9lYtgm3zXoEo1zt4U7MFKg3boazoW5YHzwf9e8ewc6JC+n7YR+oWN4JWoISNKcgiWfumQInDzuz0IZC0Fe5R1K6xXDjZxmtVFCjzqAkOGvfB41iJfT1vTxc6xPnq+cOQ++hICr5M4hdk6N4+2MHECzYCiXix/n8OT++riQJJ5pbMHpkCy1+E02DvX/5xLUoSHiQSevDKlipYT5O1AokKz0DKJhUgbd9XOmH0Qjoq0EKtp1FoYeMeDD4LOTZHKcA3790JkodzMc6UFadC5cMvKTQXY74IiwLkrrXwZUPd9Gvah8u6orBuZHW8O3EYXTI0ud/2wsgpT+PRzYl881fI7GnASilShDWXXjEK5vGQvCFE+Ay/jXPmRTA85zT4KGqOPorp5KOcxWuy3DGaqM9rD1N9f/m/8p/6cDlWXZk+0eA6h6n8q47L9n4ZBo7vT1O00Vdaah1NfpoaYGYfyt67JXDr90LuH17F7T7/Ecf8BA8WWSHqe2pmPxrgMpLCTTFGngoRhenz5NBCc27qPpLHhd5tENm1xFq2P6VIk8IY3OQEuiMT4XaPWL0IquZ376dCAWnLnDKnClQ9HUOTlQNwoj6B1hwaATsF1ejzPebqXB+DgzJT8Nl+mU0seUiuji+ZPU1WTjz4laeaDESagc06c6vOjD+lgWuXv1wtHgXxWwLhIV53nS7aQlIOMTD8XFqMHbfepQI6aXHqrJ0Q7SMG0Q+0EjpxzTjfA2HJs/B+mwDOtUpC3XDYigS0UWB35bCohkV4B0tSplRr8j9axkFemXyg/SF9KAEoXGpKvxwfYcjBgVRq7KMOuW38F2by7TnZglu/fgG1MUfQ4OVKvREJ+AKm076qusKU3zewrdLyym6wo2XvdHEmRNc+NmcCj5fBnDyyl/0H/eTP00uwWdrM0D36lJKHmjgceqL4FnCcX744hKt368J6mt1wFxDlhZXalBl+EFW/tdOBz7OBrFbyfx96kyQ/GIOS1/IQdGry9iveh/3si8tiy/ADf914n3nQt5TtR7fzy1jabWFeLdYEnTOx7Fr3iyUUYtHy3EAyo90qb82BcpfbsCTMzaSdkADLE8xB9uIT1goOA/mH/jDH7vSaYlUAJxquQDZqaNRaLUPJFc4gUecJtjEvYS8c6N4b+cbWCFkyuXLvuOAwRyYtT2dK58U4Y5qGYweYQBdfVU4A21wj0w5mIQf5k8RD1A6fgzs3N1DEm1HUFAXIG2DITyalQM3SkJgqcltlnIX4fWm+6j24Sy6c0cFeyIa+HdlGhWNmwZmv8vRVEOP/0tK5Vl1J+HI74dUJiaKu1aOANeF37Dg7zI6EqQOdcGXqCZxGsSv84SYPHVsOBBEY88vQ4maSXzybwPlr/vDd9sFob3rDT475MX5mqFsfsefrNSdOHV5JElLHuGKO8Hs0nGR/O11QHx1NmqfnQQrDjOfd7Ig+eQptIl1SWV/C4ocPsHvT5jzqwJJkJWchscfHQP6YkNDit9RX3AcH+vx423fT3Lm58P44YAbCQxJQpC7Bos6BbDQpVpo9xmEPK80cGz4SLs9JuOI53ow6kcfx62UhBgjIzjtfINhzWxeKnActYvm0sSHkvTrmDlYLqmHFQpvIO8ewOrYAVDdN5c1bmeD64q7mLF+mGZZjOcX45M4LnwRhff08qQeBHvXkTid1emjthz1RMjjO2N1ei5bDPbfT5Nh7CpcaaBLD1zMYfFtfbww4AOrTzyBrvhuUOg7weJuq+H6uSbwXrCRjHZa8uExCvDVxpHOb9mA115WcVteO783qaQtExdR/4QFdOCpHOp0pHL/y5Hw7lEi/2otZkgwhLcLpPDRHH12fnQSZ8T50Jtl1hBu3A6lr2XBfbY5+x+9gTanhPj9hFEsj3uxPqKOCoub2bfPlF3dlqBwiyGcrI2BO0YSdIT9UEtalBuTC+j2pf2wYk4YFbSN5FIRIp8iZcAwglGzA7hqoAR0Yh5B3h9ZkFMvphBZAd6UFwQa8yXYykwcDMX98Nh0Fdb+byoMa82CVzXz6fnQRggdXks2Wo5csbyavD5YwHLvAAwePYoPOSfCAwkNWPLKmRWhmzweinLElzH0xOYMms+Thyev0/HFc386O6OadOPssOREKx861Ahp9+z5b9YTuGHvTo++T4X3Cpuw2qUTVvYEkl+5AN39akM7y7bR4Lw9NKUnFFSEPPlAiSKszD6Pjfum8iqbILbJeAodvz9jRPBf6hm+SIqV/Sx6/ztUBk2DGhNLbtydjtdvyWDbyiBqDT7EmcJz8FfqNXJPmsxrry/i3XulgF0G8di4HL7/WZ4kC/NwmnA8Kv8UBsORXqg//zlNTQqEayuMoenCX1iXKEAOGRW8OH8D6l7o5dNO33hfiTUrKSZytHE2fX/NEHxqCR18sogf1RnTK0M98nu1F7IpA5MdprPri9WUJB6A33YowCfpN7BgoTJktVyBjpJYbhjMI9dgEXB48BgSJWX42Q9rNrmmCC4tkjg9bifmRCbRW3Mhbk06Qbce3oGBJaNxqCAVzgechf7ZuqDzIYf7J/yjiNRA8J19lipszvCzOeeoRUSFNhyypQeKtqwkLA12RdvJdpkLLS3ZS6VPJvHEBYLgfPkgHn4ZgcVjhOHYlsN8q8UAtrbIo+vX07hu415qsOjge6/SqeNtHN8YE0QPhn6grF4lLFtpDJEeU+ja6kGSa5hG0St2wY4VV7BA6QcfcVlCEj7+8Nq7BgYWyMN0xfOw+rUa85WjEHlhHVyCTlqRfYMMmiTRP8+TR3fm0zMZc1g8lMYpip5kGywJkiODsaW7BZ+OaoCDM07gjUQhfJ15gkRr5KDrzmj2G/+SsqcD2SoaU8tEC5YdMYI8//zC9Cgr7vb9D4XeakGhihxsybfCK3XS6P2pAOaunM/SOmfx64hrlCwgiUtv29PrdAt4NWM+fBMa4HpNSRg+OwQXwsx4UZQY7stdDa8qGin+1VpeZCoMARrp2H3DlZdvOMqztZfBsmX7YMaMXSAfsYrWj3qOo+JXQ5G5DBisec1ZBX/w2XJhFAiMBQP1ubT3aRnFPjDBnMpquvR5FESpTABfF0nK9q+An+MOk7aMEYqqusOUqjmwcVkyCxc9p1HquSz/Tw/GJ18BdV/gjM/GfE9QnK/NP0pbI9uh/oAxX25qY2mxEJKqNIG1cV9A/Xsb1d+3hlm6TSyW2oc5D/MgYEYp5yvK8QsXc9riaQx1oYn0Ui2QM8dd47yTtVAuuQR3mzuhS3orqKyxYH/rR6SfOxY8xRbghsEaWi9iBPVfVrBahx5Uy3+hZ/lZ5D98lm/gRAzTYlj/tZP9lhiSiYY/Wso10GytFCjwNoH8cXsp9NJk/PzRAM1fiMKjTWYoV3aNTid/IN1F88Fppzvek3oIPz+vpJe3l8K9jnaQfKkF6/72ouWFjzSqpZpic8JhzJGbnHvcFnxKTlH5xwzUcLtBynUjwW74Gl90vAS/oxOoyK8QVywbhJUXj5CCJMCOPwn0o6CEv96aAsY20pT10hBWLLjIZuIt/He9Ogd1d4BAYQneuPsHTvcbg+iKEWCeuBzsF0/Hk8dPovsCHRZ79Y9iui9hbfsMqn92Gs4FnsXdpgYQXdZHYdEd7B5bAKUeHpDU2A55dhowc89HsCuu4WdjR5B85WiAQX9eM0YTFI2O0YcwAe6cpwSFq4RQbnUZdH8MYMfDnhh6QxNM3ORB6tkzmn9dDP8lO0BxmQR6yC5FuwoRDlrmC/NUl+GT0crwwmYEnjmkTe0bV6B+gyCXGUyEIbe70K5dRg92d+OXb9dJ67cN7DPxxLjgOLaTukACFEozC27iks+iuBkrWEjnBhYflsLQ76NgS/0UPO65Gjc+e0jn+j7jx0AXBiVhlFZaQx0OF+nqJmsMNleA3/E9UPk0gd9F+9OarS/41NnbOKRbCQKXI9nbXZqT//Vxndo0eH/tHDdXDGP3HnmyWHkSy5Zl4+LvL3nvvnH8ff128NlZy7fGTILXAQK4qX4y5TmNJy9xM3Q98Ivrvs/FfVIlkKYgy9uc2uCD2ETIdr0KBaZEj1OMcMkJW5g8XYc8P3jhpoZiEksTpHm6tWy4QxemlElTiGE16BVkwVr7YpR4tY+k0mzQsW8W+wRtJfjmzw2BDLZn/gO3c86wUOchOdqfZP3xpWiUr4B3lG7BhhA/NLNpxncjCdaEG7DZzApetGs5tuauYP5ygX6uuYmZp1op8ogWPm4bS/3qU+D2jC+osaoTFVYBCSbM5eD8HlK6nAbRz3Lp7bU6SBowIw19Q7j2/QN1JN+nSdufkkC9Db06IIkns9s461ImHwleB88u3sbx902hx0ic3ksN0anUP9x8fDtIyt9AoS1+SJMUaIrqKnjcmYUa1cowvC4UYc8JnBrgC1rnZGmXvg2nNF2Ff3cieNfabfj+71H0HW8BHuiD50NVSa6/CDJt0/G6ZBUP3CrEvxzEzgu80PzYBvqXrgBODa+x4Wc9F23s5c8xeay9MAScz29B7xBT1rTwR1/fH7x1IcN1p7dwx1OXTv03kxPer+SVYrFg0rGdWla5AybV8M3bJeB8Rx3e6ZVyr0Uf7VnaRt20j34VbObN6rkUfT+YNe5txSMuSvjynw34iPaDOxBeE+yATxKlZBMwD8vSIrBPowHcM9T52/xAPvHPAuRn/wEPi/dU1qjFRk/Ogc0WPUxrXgq3Hg+QSshcfuIuR6OVrWBNlD1tS5uNMVEBfLbhMHm4SfJh//MktXgjqljswawhc5QebwRzohR494nj5PBiGxzLWIejVn7HPwPaYPVoPlz/O4ezwy5hvb0aCMWa4ol5D+BDuRkGLXSELUaRaLg3DMsXTKUk3dWQVD2VP6aPgpsiYTjOfBjPOlqykKIOF1aZ8mGVjXx/SArMQiyxbFs1dYRMBPO+DhIJOE2qKj4QGz8XTMM6qOv1QRBcupecB3y5aJIozhsUgCWRwzjhgwYqZLnh7toS6vowFT/6m0FKXif4aVXTjTELoP29MLzPHosl2vrUpLOdZ61YRnWG1lzQWE86DsXwatUQi2WuQ90mITCB1aTd9pn/ZmfTBtN4lDhyjienOZLR0hbsdRhk4dnX4UyGIZSfVoeHK37i71XenH66BaMEPDgmoAh35WqTd+xovvk2iDabKICXrgP/fLcXhpe8o4z90zEhWAWrvsvCIk0bvqP2kap+K7OIqgXsN9jD0lHXKVg7lP6r0eWjecvxU/BL9AnciK5pyCEW53nnH1PYIrUPDpXGQ2xNCjh3VXP6Vx3e2T+HclR0+EHdeggXrePvW5VA5+5r2OlVCJ1zj+Axlwfk4n8SRGzi+PP+w7C69xWMkVPAahaCr0HGZLPlJyZ42ROPyaAfMnfw1zlDXKxuw1fuTWYlhT5uHW0IL2KEMDq/CT0qJkI+IzSHFHKf1Fk89UKV3s8rAV+FOSw0SxtqldSptnwXGHVOQqW0xdR09wVtz0in+QvO4JFre0EbrXFvlDzs9ymDwZbNqCg9hYS3lvFts0YObneFYJ0WTrgfyYVFEbBVZzykp5yjSxKLWNPuJjsnO5KTdzWPDQki4QeGnJGRh/dPzAbnaePg3abd4CwpAFkzU3iujx7vuV1KWz7OIa3xaWSzfiFbbesm/0YCy60ApPKaApKSILbWEF79cMTG+Sk8tUuHXKuKWfCnNS5OHgOpCem84JEPC6w+zCnGOyE91w1/Z46jU7IP8M2vHdiqfIB8+hDgnRyHKJeim4obf3sgzHWlf3FZRg6OlXdC75WNZB69kArl1MFKwgaj26Wh+fgIvlO1k+z032KZuxaKO1WT0NEhljNQoI5hOch19UQMnUHaZ2Zg4s5R7P/rGHbJzOaAdE2YWKAEf+rMYd5NTbjbK4UTlKo4UEIdn22uwrQT2aT0+jV7j/2KD8QaqPmCJ13cOBGmnxNj0eaxNNpOhx3Vitg2y5fa5rjShBOBkBuuBkYa8vhASQuSlg7AnrHLKQDKeOjXOZZwiqTNM/bDlmopdkhZz1e+OJDhRmUQzOpEu5QTNLYpE4RnLcFHIjV8YqcN7UyooyTf8dC32A8MlPRgz6mLvL5tNPQblVNYeC1d/6wA3sMyOPanGYt2rOI3GE5HOkWg6t4/XptXijNfTmWl/Vl4tj+ZNF9Eoem757hrzGHm5lQeuX4a9D13wT4ncZb8qg63XsuSWnww/XqQibtbd8GhdA8KuGtNYqIaEPgxjcY4b6M9eVWYbPyO846F8aO530Gt+ChsWydPeasWoeQ6Kzg0/xflhI/kvLyFtFTrFXl25FBybi6cWPqUJBfn4IOQubxJ2xRE9fvw88pa2hHzkPwOt/KCIVdYPv0zVk6P4MGrjrA2dB6tcySYb60Ldv+Vop7seLruugFC9nXAskmmdK32KL79EcOHcnKoIEMVzFMt8P77P/Bf2DOaNOIgjPKRJnASpDbfOI5rmU8apZ64dPloyHo7D+PEnoDUrtW8LegKHlp7HmcYOOMoAQvKnS0HhT+Y6m8IwP7eAXI/HceLFxRCT1g7jN3UTi9f2JIbX6EFkxM5YYcLOekDaDR/4ypJVwhcN47vFJyiwaj7pH/BlCN12qBgnh88LXrONrcUIe5CNb0VFqAzn39Bg2YR793hB6MVeqCtexf4SjbAjU6kTQeUocjqAIa8b4bmtF4WSZ8IFpmfeHVwILqMVOSGrJtUPlsQ4+4Lwdx/09l0iQZnH17Kqxfewac19uiSLI3P1PTYakEUR+6Ro203R8OP3FF093AB7hz0BWkTfaoP0oUxvw/j9/DL/GNfPp03CgGl5VPgU/ldOjq7h7tVV8DUwQkc2Pycm1+KYY7TB34xz5jMteThnoYmeO2LoRlLI+Cr12TQn9kJUuuRTcJn4cyEUu48tAp8SlNYIcwa4rcuo8CNAvhMQBO+PqzjKXNf8XGnTSRt9pquh1fwjvB1aKotA+GLu/C97RT00LjMPpN3o4JMFM38Fo19fcLQp+8IDS/tKXGxNjjlWaKyyQ/8Z5GP+QvySGO5H+0K9MUP9jdQ6sxNurLuAsjGWsGero3MoTNBafx2XJv9nsbZSGDIJgO+EJdEdfKbacaKbSC/ajLEC84g4aPL6dIYQBn3aBooz+Pgtn1kfojR2/Ud1P3MInENI1jd+ZULxgTjhpKNqN1Yhn/fZ6JV5CUYsb2SmmXiKdxmLp8ZGAnb2//hx9JUWG06ig3T3GjsaCGuucgYWDiK//b9RysCBbnAzQxEurex8PnvsLFHDoybTlHSs2C23JHAY6R+gX/hFnxm1E63NVWgfMU0mKFhjsYT3pHf7q8cnvGC88cfIdnMhTAY7INTDX9gpKImaAinwb5LE3nI/wo/lL2LlxXEUTv1MY+tFmJbryLOubWSJMVU4d9aH5BNeApG5clcezMZB7XCoXDbeJgbd4Qf/j4H30esg/VfLOHai/GUfjwL7LuCaOBdG+Uvz4GckqM4uOAY7l0TifE7vfDwEgPI8SrhZyIbwb1TGspWW2Cq9Swc+3sXGfmEYqTfeL43EAGvjqnAXdURYPLdjTwEj/KE5gc4/pIbd+w/iBstrmHSOuKVZx+w4mqA7XZXSMfvFlxODEdjLScQiznLkWLv6IjyRc6b0URnb6niYJc8zJ/mzGfvFoPT8GeO2e2EjomKsF4J8Pr2YOjNmUfd6MSva63h/Vlr8M95TvYtj8gk/DtusUwCTwkBuLD2A1tefc2Cd1NZ1UQEvDcHU333MLkkFtGzoBkgIzmOGzfPx44hOQy4bolKaWowv08VNk00gbvRchC0pxcwtJalfXRJJek/VCrTpkO7UnjyJXGa8dUMRniPRuPRt+jT7P2QQH8pxiMeomu/4s7hNDz/bAOOvp5GaU8ngFquBy1Z6URrf6fQTxqBcnVF9KNgGxcIPcVoqzk4pbwCa4UE4RIWw6U1FVQ6sZkHFqVAvFQdm4pL86fcch6alIJnDtnh4/1qcOqbA7wq6+fthv7w8EwU/kpQRD/vTJjUrQhNG6RYbMwn/lyhCq1Xpdl9yzoYOlEJ5m42aNtiDRvslDB3xQ++5RuPE6068Ua7EZxQeAAxii+g+h+y7zNZPKGpxKrr4/DD7nh8YatJSZ4yOE1rGnhmPuAB7/Uk9qONrpo10W5ZPR6MTmPLR6FgvfsVyUhkUESoGnyzFwTH+7JQ2/SWuusqIMbmOe96WIoSfR54JLAdBkY4kPcMCXA7rMe+vB2N9UsxxCoDX8WPgSXn+nhSWiELakvBp/H72PeXCGgUHeHFlXUcWxRLysan2b5lAN496AaNA2t4xnk7vtazEESareDzwA2OL/mDgqf8uasjDF0SyjDOzhd9FhfQYpsIdIpSI5FtaiCxxB9kZj9G8ahHaBXViouPquFHh/kohp9Zxuc6Pn85g+asVIdZQrdJvyufXCS1YUmeIGx+1cAzjYIx/E8fhCm/h72vrOlljiHYfgFK7JDiyq1P2eL+IMrbhpPo91RwS79FE2qf85utO7ikXwQuz6qjXndbUv6lBGuDsjlOXo73nRoAnK/J+QfrSSZJAm+rSkHD3+MY6a4MC9CV755F/jSkBZO3SuFvDTOyN9hCG27+Q5wuDs63k/nVog4c2X2Ez6iugIIZbfym7CXPX74FVvE0fNYcDu+yzWBHtRqWnZAigU+LQchsBFmnp5LHaGU0NbqOEVWf+WTGLFw7Qxk+Zolg9stBliz8QmWnHGBDFbDA6UU0PfE3lwkassvSGgiUMARvTWN8078LgtPi0KbGAlZ4JFAmnoeYn1LUfFKEJ30PIA9xORi+bgsfkxzxQ9YeflfQi7mnc1F80zSK6ImgXZuvg8XtnzCrWRt8VzjgcrmfHKOjjS7OSvxDxASNDnTTiKownqfnhZ4ft9DYTSpwur8GrcsVMU+nmLZpZaPzBhUWq63lkjoPLDC+g0/awnChuyjIejfwtzWTKeWFFC3olYUd87PBqH8/LYvNgGXh58A0ZxQOGMlD+/Oj3Hw6E1aPbsYVxc7gYLacZy1cjIVv8qhZvxRiEwpx2S1NwJcPad+YxeRbOwvPjk7nDzcnQt3jaHR/W4ImoZvQYF4tOd9UhkS3hXjTVIguZZnhiuIP/K/RntR6l4LPBEkoeOLIk478hYObR8Lne28pQDAVzoY9hQVzsvHoc0dql7bF8jMjyLSxC7RP7+SYH5YQMvYWCFqep/gaX8xKkAWzG7U0tuUhP3i3EuI6jOCpgjaV+OqDSNN0nD48CVpq32GHtzVe3N4DT57JgmT7Asico4Tz6npBYcgaTtvfRUWp5bT4Zz/88hii2kl/6dOJETSmdj6lLW6ADT9vYf+VceDiXUT6a7bCwJNCTBXYSYJq8Zxi9JlH1E6nvju3oVMmg/u6CaKP9dLNc0N0oOQCbfG8AKlj5dje4ic/fSXGEgrnue/6Ge7KsoT2ypmssekHDucOYc/qyyRma0sfhr5wcTjjnwNWmJajD37imtCe00tJG/+D2dZPKOuRELd3evP51DrMDG5nnek7wSQA8IWLLNhe3MZ6HrngPCUETkp8YI2o1zAvwA+djuxBmWgLFhl7BN7+Nw1UNAzQeFoX3VE5ScWOx2jRh2ZY89qTWvZ9os9+mThuyiTkLfKgrNVAAspFPCbIFc752OKDv2tw5pJBStogDMpjD6Dvj7m4yR3Br8wKTQNmotuIel4aGQMO0mvB/3EdOrR589x3IrSoJg/mxCuBdYUAP1I/AkLXXMCtaQEvl/HBu9VfYHq+ON544Uo/64bhcgXAlCsF3LR3FX7PuszlGdJ0UC8Orp/5AJdtvKFw9nNY4laMjbni4ChcS264hD+ES8FgUTWJK3/CzT/yUahPDRTfBZD0SFOsUkXIPfaWLKxXwqyQXBYvXM4Osos4atI4LMiuweta+ni2pYzmPLCBTvdSemK/FvcLWrFcgChcOduF55aPwbyVAgx1VzFoaC/IeyCoxiZiYeg49u08CCdDNrH60SN8c1woLruZTpvbzmD36wt4wkcO5qifITXXafBFLoM7H40G3tpGUy8FcfZSIpXezVz5+Dlh3ghwcBqLolq/yc12PWXcOQ/jtIRg+YIWKDPSwjLJx/xC2oQszwEs/uPOiefT6XKXBbJ6APWMvAiebbbYGlxG28bLkFCHMj59LAQ/9mtThW41PS4JxGjZIdQPXoPviuRARCqJRFp2kF3Ma8y5PhbKFSrYLc+VLgZaYkLTUc6Q7KE7IYl84UsX110uAf0jdnxPhODnivto8aGTFrbPJM+KuXTEvRF6ah6h7f11bBnzCTI0VtLAOElISe6A8CURJN3qBcO1wxQg+hIvZzbQlZZguqElxscO98Bd/bGwpf8Jq2b84zt3lmH6egkSn2lJ8Uf1WGW7CP8XL0XysXW4Vl8BBFrdKS3QlFcUScGZlfcgrCwLz/BpaB2xl+eu+k0an4ewyFUXLn6VoU6tAxSSPBsuS2qS5aRykhYrhuuNt/Fp6Wb4PpwOtQYI2jZCdLnejk0LVWHNzDRavy2d2tW08bTOa85fuhEc7eqw6ilCrPgMnlYxHgtKs3Ht86UwoKlHgRsfksSVELJTTuLpmS8xb8gMBMqaYEptAvpkGtIhyxFQ53Cea2+qUNF8exStkGPJjdXovZJhjPpClHtfQ2H+2+hoUjlIah9Dj4a93P76PYYdrCW7kl8kPkISKh9v5ZiDlzESlqGk9QdcEJ0Gf7uPwfybZXyuugi/JgzypHWToHJiN3mve4124Z48ec9T0hCsoyemayi7qphieqQ4tEaCNCzUIHGTApduWo++RU+gOtcNrDoGySviL5gZyWFHliPsXJiHHiL6sMF2EeZUlaNp3SdOvOdBtgdcyNBJjzOtI6G9Tow0e3+Af5EKPPdWxMpIpoW2DezpTxitsBVrdI9ywJwa2DdiBlcWKdN/q4zAQUsZg/YK858Z61E7dTsGX76FF6YvA4vZ2jCrdBikT09F508qoKjfwY+iAiD98iN+L6CNoxa4s7DPA6xdVI1lahJkfigfe/ZMhIuLvPHfkwGe4Ud8SsEaetN28q7YY2T+ews2lBby6RtmPHOQ4GiSLupPDmdpnwb4MvYuNw4+pj3jU+n9pQVsU7EGPz1PIbOniiB6cSld7RaD/a9d4K3yRygqnEnDIVvxhyJga+QbNJyvzgv/TYPvQyfoUMsFvvvZkFKVUtlOQQ2+1hrSRen7OKMxmePthXC/qAZ8mV9IK39IAt0yARhzBx2vBkLh22c4yeUILfPv4Q3J40F1rRY8PreSDz6+y99vqWH4uDD21NEk07x6qv+8k9dWW9KkTg2c9ksfaP80irFeSUY3Bdl440pWsDQijVBHHHf5MBa7ylKc9WpUlZ8GNj4hWCMsBJZHdbH34zOoN11Ff2Q+4a1v21jgexsVrjXBXbs1ACIdaX1bMB5YksfunY0cF3KTU9iVbeS+4v5ZOVh+oxu1xo2CiJ4e3LppM1z1UqDUpQk4MruWfgs4UvC/VSDrmc8fsqVR9rgQpHopUrFzJ7W2O/Nb7TPgfn80LV9tDPt2atMez+9wot4HQxeawCeVLAjyWkK957x4bJg9bQytI+WQWh4p2QbVXqJccCWWQ1+rwznfhdwbfhRbLo7k5SXWuF/HBIt7R7LEyLcUbTfMg+3rcZnSaCgX06ZHB/7S1YzxIGUsRFkKUuRbvARk6yXYNE8ZmkcG4i+rSfDgihQZPevn9muf8L8/r2GpSz7+/b2HBPftpROJ3bgqPAjTH4hCfJgp/rdrAVa9LEGv1s/sum0IhjXfs5fPSZrzSgD/rHsPWfXK8K/GHark7OB6917a7tHDRg9/UlTsS0zx62IZpXtYozuMLvEm0KR8iN3/3iKnHztw6pI3cHmvADlcfEN7nuxgm5d3UcZCjjOuSkFsVBRuWmQE27U+cI/7U/patQdlM4QpsO4DKTaKYf+DNCr2loDr+lVoW7qX+qx3UUngQSj+Ikdb8wd55/F/eKRoMuUOTKVeA2EIP3ePJmUe4qyzWlw/KAtVuoO4aKgQu7a1w9LHTnCpoZDT/RkOnhuNp6Km05fJ43n3rGY8NdmFvAf/srmbC8qXzqOuwhAMVbaG1AgRHtKz52MnTlDXBDUIdN2M0541k/FgDv23q5+WnRzFm+drg83nSHTubcPFs2/B+gOn4e8GEZhmHYlbbgax7cAENtE+y6lE8GaHPdVFfoLF6z6RxH+JnDZOn2pO/WatGGEK9dhBdnoK+PGbLFhZ7GbXq3eh+91MnLgjHp9Ll3CCsx0t77kPZUEv+Ut2LG7p04Xe6QL8/YQGLH3xjhT9dcBwrjBtTG7G39JB8N/3NDilcpCK3CVgU8cj6C4SYXSOZOXUcKrNnoi5Ywfx6DpxmlL9mz03FXCtiDHsdrzCV9YX4pv8bHzkPIcrv6rS35pZ8KdwGX1Q9yWRiPdY+FAJJr63gruLzuE1vAwi26v5it8x3BJRQ6pHF8EfPy0I1guG0BgtuH4yBlSuj6P8LVf57dGLmPM7hgQn69NWhXYSlpmKKTNVuH3aWOhT/84l8/aip2ICBuu3c9hwJak6boTEuOdwIkONLQ+s4EPZurDm0yE4ZPWI1poNYfykFr4vpEJ9M/N5kd0uODd+DVtpnsa4rxPAeu1O3mN5mZSt+/lqWRdk2ETTpRrAvy3/ML4hBC13rqC1/gxnrl/FybOv8Gk3Daru1qDRhxQgZBrTgKcQzkk5wKOFR9O7tWNB598rNvbUBCuV37RcHunJiTYsuG2AFZPvg9Gr9XAMADS3G0GTdgeuP2jF8xf30chxn7Gi+yN9zL/EWzwd+bB0Ko58dxr/zFaFy9rZbFadTiONP8Ha/vW4V34zh0yuxieLdtKF735w2yOMn76xhAazNmre4wsaC9/jGU9PfDEpjMacfkbyKdtJKKGFo+VSUO+PIAiK+JPq3VE85/RqMP2Zwn9/7GH1+k948mo0PX+Whrc03anQYwQ4Kt2lIMmf/GW1FV4zleO2h/ak5XyMvgTZkU98MrBuI/dYq8Fd7XK64p0F+45vhexbppDoU4l+N0bxlXVEMRtGsommKnxQE4NCNRfwD5vOE84Dh06UBv81fnj930E+GrqKPmfPZ/9t2RiyWxA+tv6AVVek2HjqErpxZxYu/pZGx+Kno+j81fwk9D68GzudKkfZwAEV5MilNlimO5OSK0pZYm8Rn/+qhDXrC2EgwwPuXbqEw08tYSlL8kKBdhCvrqepax0gaPMIjJaz4qVrNeBkYit6rOqilyOnQlG3E2ZsbIGh6wawyGo263X9A5utB9n10DoYX34ZJGU8+eZCK6gJvk8ZIjFcPCMFopbE8De7dZgjlwGxEfZ0YsZNzNUrAuVyK9C5Hwyj/kpRkutovDtRGbX6d8OuuEya3OTJ4Y2TuV1vFOy3IUge3kKiiYd5smAMH7UN56yraVD+050nnU2DOb5jofaRIQVeNodEDVV6F+zA+snDrOGtgEU+hjRy8lbo+5ANBc+qQO/nRTQ6pgYhBsq8+akbt9kl8w+HHfw9divnhjdT+OpH6FBpzZcfraD2CeJg+2w17gq1YOfZuei84ivPOfkFHlSbcI14Ek3rOgu1c5q5IUUWChfZkGlGFofG/OVViiOhWaoNLkV+xntNmbxBygHeTjjJO5W14F1DB1YfFsDK2sV8M38T+uQvxehvFfxnQwLI1E6GM0tDQD5EGcrTd+N/B57wOuGxMGpLAiccU8bYjRPIzCuYHEOO4b6J/jRjlDGY974hA7FaHqv7CRsbMqnQQwhu/F2C6rdccdqxeJ5i+ZAWaiiA9jFbONn9mQs+tkDFr+Xk6ZlIG190UdTOYrw9Zy6WvR3BGT4WEJYxCSs2ZvIrfVFc+LuFR8VeYKUbJXSlbxwenzoGZEM+8tkeI3jec5Ht7ryBaplLOELgLDqcAK51300KScP4Rj+JN7n14lV/U0jU9qJKQR1UMUD8s1UWAwbT+UD3YQgy+85VuQ5gMGc8vf1IoDOtmp89Wozfl7rDSKdckMIx/G+NCCcpfeBpJytZae07+O+PPNze+hQOFTTh+d2NZLDFj3Wb4ujInlmsf/YwnqHd9PgvsKmUEcwzL8fI0ck4ZsMWnP59Pz8OSKJ7c7PxwDtLWJ7dD4cqxnGznDRkaWdQrLgSHZ5QzgZP4qhIZyJ+vJXGT9MzKFVgC4QkrKWb4hog8eMFftHaSvMi5NF6QBgFk9dBvZM2tx2ZifyjiRe5WsKsM1Lwan0Br0+wo0mV4+hUVA9+vKTLz3MLUeTYWP79pQwuiR7EiWkIBkYXuf26K8T6ZqLY5PskF+0B3Q390NegQHodt2iD41RWq5sKt2PlMF3tFRqXb2KWfkdSb3XgT5Y4Nv6JphCPO7yrchE9X2oDSQ2zyT36Iby0+UGFqdf4pJkf/Ik04bQHu2FjwCw0LqzAA/aGoF24A4Pe3cGasyrUaFlLW2/40egJZ7HwhgHkNEzDvsg0ds7RgsOLVLDCeTrfnxhDNbvvYmtKIexTUqM21yZSdj8HKivqqKBiFGQe1AbvD+K0ObuIEjJNePu2RNzR7sPRbxPRx1GC9T89gufnVUA84x0e9H9M9b51oDAchk+SjDB9538YtuwZzDvbhI6zNTFQYBJc8VhENW4SDO+cSWfNL1gSVYFNpm1soBtFlVFfyVz1ESvdNQIon4zCwg48Zt9J8HjQh2ceW9Dm6DKaKmFA/5Wooe0GFyjvNIH1UR1QnpVOp/wyyE0sHnqzjpNS2ky4NuY09mvaYlXCL3qxXxFCcDfnXalh1syGZRLGEGWoCbukd5P61GOQVniT51ypoFk2Y2Hygx0wtisUrt5q5Tvnfal8VCAbaE+DY3XNqO1tCWpWXXTNTALspS5zmkwRpFq20JXJAyS/5R+Jv8hnK5XjsNJTHFQSBanOdwwMG7xEwU2DHHk/Fh4NH+PrZVOwzcMELm3rwvRzc8lEMZ5UDmnDvB1r8MUOaTyyq5Rkl7jTEd1Wrjj/kANFi1BqvxbtWBCPsXvMIG5jIUV+fgJ9NjbcF1lKOwW3UHOuMGTaf4C09brsfuky7pymDL/Xr0HVjffpQUw9CEQcZ/1bfmAUKMlW5fdhaspYaN6+mqddnwJWgdd576ixaJefQMUWrTjm4HXWd/OAnV92s/6TK9A1xYbGHpIHyYcjqUDtOkrO7YcnItV4cYcSXOktBeFTQewg/w0UV5pQ0G4Z6D6ohRdDpsDXqmjW3maBLZ/aUL+ng1Pz77KSmyhtuySNCS1GsCbkF+zOWYYmZ8z5+JHTsHeSF8/3nkpxwTVwY2QlrOgZwE09k6Gjch4r6T6HPeffwdQnqZBTeROjwvJ4vOESvOf0iBbunoNadmOgTHAr5X+UxcH0JPxethpESjVRRTMeDTsEKfqcHKbkzMPEUANw3/eR76SUok5AH785OxPMzgrRXQ1Z3uGaD7VVerDm6EWQvKkAp/zeonfOTlTceRDOqz0Cv0sq1La5AFpCX4POmtnwOzGWx1SpAg/4kv/WD7hELhHV3u0H065QjGw9QoUzf7H+7hV4Ni4WZLzEoE6zlTfpBcG2iGVwsGIqicS/heExWyF88jrMQUXQDNKFKtSD6rBJkLv9INWZNLPEBCl6eG8ntDrPx/MbhehiVCoPzjmHGyREoCTTGA1CEaZAGKjYbgORTyGgonUBNvXsoaKGIbjsPw6XfTWHCNvrePWTAt1ZuYlsPMfx741DHD2mke68X06Gg3ehYuY5qHhiAEWjLtN9MzkefoHwvNiIz503QI+Ee3B05TqctmsHt4f9wmIPdVD4tQK6x93DobIvvFV+DIqVHCBlvRPw46EDHTsZyeEnXvF5T2O47RlH1vt0+b8LMZDheobvuyTSDu835N9oiHTwAYYN1JJ1qyQs9JICxxAvWGV1Hj+HGHOUykjO+orcUC/E+73ewOTls6lk4QRo1e2GRZfM4KN5PPgvewYW9pW0qPM27Xj/kuZ5XYGJOyNQy1AEdupJgf2XQmx7k89OT45D6tEOXp3oAJ/v58JxMV2yXnsRlBarw6ScUKo3auSfLd08NbsfA/LtQW1eGljffc69pQ9hX3M6is+VBgvJqRie+pAvvCwDVcOP3GOewZKHV6PRdje0SL1LO8sHYIa7FGwQ+UKN2unwQTueVlr14c7ObTS3YDUv3zUfmj38yF7yC25WEIRZ4fVgH6pFO+89IediTWg/sgULH7vRlIL3EL5TEvRTmmmRhSYszRQGYbDghMw/WLF7DvWaqlJ+axFezrpKjeNb4eWme1xVZQY2zvUoOuEX6SWG8zU9Ga5/EAXLewpoW6AZ1jv/I2GpPjL+bAPZx46y/O3l0FA+hpQi+tClUx5CWqPAyTIdY5+bYc7qGByQFwbr2r3gl+aP5gmuPMXUDydHm4JaowVE7VxIYcnVtOySCZ+tMgIZ02bcfu8dOddVUMPih9A29TSc/unJC9NdSPj9Apou7oD/vdeDBeNyeIPIFQ7fcJQF0sPpn/gqtlvxiHLsbpOOWTXLy43DMz8mQ6eeGguWD2LTwtfUd+A3XlldCLPEB8EqqILNe3Jx6fw0XNwxDl7m9dLedx+hbyCIT7wZgsSnZdxvv4wCpOPI9r9c6FxTzDOErEHfyof9W86z39vTbHPAkRtNDTh9wTFUPFqAHydJoZ5EGJzLV4Cwi2G8Zs8I2qcWjUVh4RjXMBcu/Gil/1r9eR7aYu+CQTiUrAZ/d/hSmUYT1KW0cv0kW4qU94SP99z4rrE3FNx4gReGdDlWTAE2VE7AR90PoFBvNmbvEwK1z3PQ8O0BuN24Bbb/aWKVW2/BdqEBGFU74c2YcLx1zpyTBf8jsExFKd88XBtRS8NPJ2Ovnxb/dFGBYyql5HrOlN9PcQO9U3K8w3skLajvxx/V97Dn/Qo+evoelk0YAx7bOniR+VHoXeyCdlcVSFjSlRWFFFC1RoRfLYvGafdfQqCeHizyug2xfx7y4JzZXB+tgsV94exqkY0yM4RwzHJvkr00G1J09OFfnjgUhyjgn8ELtKN4NC5z6+d9ketB37qPNyHCqIY6iA6xAcWfH7jJxJX0NkzBxhdJfPqLMIJDA/RtrSDBmEwYmLcFLcJFwUuzFmqXvGEDvQP8600FfqJGaBNMRO22b9j7Ro/3d7ziZxOnwcSw+6Rnn0vC+m/w+dV4dgg9y/fD5rJXvzt4dYjBfdE+9Js7CXSOGvOAdDxdPOACJod6cPbVWXj/ihpMqoiC/26pY3vra/5yXB+mjPsIo1wfU37uOKzXz+QNZ67gYe1RfKVLjcZfnMF+ftu5rmkKtD6cy00r3OnI6GF+G28KNQcW8FWhV5zdu5IdZYfRoOkpXv0rA+puNWz37DtIfd7LszNicOUPDZAL3Muf702BhULWcCH2OB92tIRM+3Sw/+FBe55qsSOG4vbbP+mUuR2GowhaynzjrMNrsTncArq9HhAuN8fLbu9huvVxiDmTxUP7n7GXciCuu2jJ1dIzyX47w+0v+0hUrouS6RIlak6i87enQJyOPp8cKqWEitu42qwCmp/rwo9Th7liXC4ob9UigRw5mjF9JmZcEsCWikG6tVeKZD1ekk6OFQykuHBx9UUQksynmoF/cEY/GQtVFkNUhD0PqVlw4rVg8D1qDjdtPiJa7IGiKWG8tkuBXtk/ROezKXj8YzpdvLOc2cabYmMV4KS5JOz6epHHC23la24zeNv2v6Tk/o+irSfw38VVtHhDK0xx1oIto5vIe5MSz1ozxKWVcXClUw1E9IborZcoposcxAlt3rTSSxR+isaj0lMdOLlfgvv+PKPM1k3ssb2OW8R/UdHDNJqsXgzzHMzg2bQseuHhS/3aMhzzYwc0S+9Bmfrt5OBris7bI2HJ6Q7IE2NY0mrFnccqOWDUJoxY4snf+pTIx8Sevm9uYunXCHEJm8j6lwA0jr7JF/LseVmnKH/8mIxVvW9xn94O2ux6G6VnjoKpp1/DuWv68HWrJ888t5dfqKjihz219L7xCKz7uo08msNZdscqvJb/ExbET4G/EdLsmt7Ck/+UMaquoFm60jh4zILnTxwBju8HIDitEK5PmQw5ioEwvP8sTmm8xwXD0uB/XQRj38/h9u4U+vTNh34fV+d7wUYgEL2OXb81oLz4XrKY3077CqpQtO80vuMe8FzsxAYbekjpuQSM5ue4P6ICZwx4QVTDPg5aNYZslubS3reH8YylOz35JU9YJwfPe75CX48KeDrFEE0bhXRHGvMMPsP6NbfgZlMHFt7/gQ8+6sAls0X0udQA/+n3gYOkBrkXKZO6fx1d0A4E5YRfWL/lHErDWKiYkElyNrK0LtGR3999wiEy0TB+3wxa1nyP1CxToKNoNd/XV4Ztmi85JnE6Sa0yR+UbyTh7tSVcF5nK63uteeFWgDdeMRgpJgl/c5dQvtsn2NC+GG2K7Ek7WI/21DfDzxOCkG1jzlf3LcflPXrgnHKadzl2gP6fHZxqPhWPFIlitlwej6hK4Elv17HTgX/Q1ysJa9+4Iz89RiJLmqEpZhcuvExw+MAHGjfwiNPdrVDt/CJ6fUkaRuYexT2Pk2GoP49Ds2ezaKwXbJ0fjZXCO8FmUSSXjbHgtR1qYLAkipXGvIbaKRuwtEQJlJs7YfBnOWFgCraH+VJQ0AkKFTGCd0dWskS/L779I4nPsrzRz38+iaVe4s+Kk3DKI1M6+eI+LgxVAP/1a+lE+huesC6UzNOHSD9iGTkr+3JL9WaWWXOYMi3s2PerAKjvb+ahVSPoW5MSeQTexdrMfpzeshpsOhWpajJBu2MwCvuMhpszouC0ym6eN+IdfbsXzqfjmiHMUZEn+beD8wEdavwfcfehEIKiBgD4H9pbpL23NCRNRRJCQ0ZENlHKKCFklZCSWSKkISXJaipkpqRQSE5Gu6QUJXUf4z7JZxxN9TcMQVDFn04cf4L9q/ZBwB4vPiLrCgE+D+l2piqZ3b8PLTOG0GwCg1mpKTTEXAZ3TVkutLYk53EunHfACFQaTnDHy0ZcS+Wg808WPg9Hg/FW5kX5BrTdxxcPj3yFZYMxaGMUyJ0nn9HlXTL08aQZWI13IKeW5bQt9TqIHAwnF1Ut9HvzC/5yL4r2vkfxo+4cOEoQpFvT+Vu8Msjm5vPkkkc0eokoX8zZhlopc7D2ej7Osb/Np2VHwYygY9yT4sf3H04gBT037DjdAzZyi3jH5nBYUPccYfct/gdmMBTqjHcie+HqoAHKn5WAjLLV1Gu0jma92s2iz5/hpLSN0JwzCpTiPXjf1dE4IN6GWSvzeNXjsfDhixynSZ9Bn98r2DM/HBye60L5+nLeYxzFqTEbqDR1OesfPQajyufDf+PGkJ77DUq/+QrUlprB7ewgUtryCS79UKLQ7F6Ys1KXnkdbwa76MLYz8IbBswEQoy4Kjlc+84TsTdR5xI6Xxz2Fm7N8uG1xIk/rL0cJw7uwQDIR97Xagtd7WV6s8RIK0s5BwPEO6D32HrV9XCn+12Mwva9FqQKJ5FmqBv9ed8BQgAbc2r4PYn6EYb2IAT8Xm0KabQa8d7wcbfZTp4Dx9jCnVgadBY9DcKkE7xR6jAG5I4mql6Kw4WJ8oOVA5g/TQDgOoVLmAARZzuaKfWc5I+0+pBWP5srYLqq8E4lZJun4+cxbCPnuAKuXusGyVmm6oLOE3jc/5GVu42DSB2HUYw3cG/iTb0ZNYqfdDtBtsIdrX6+lxPk6/PPKF5p2s5Bzsx7DsPxGCrjbDAkejhDbqA+Pz+2ksf0OHFKBNC5Fg+I+38N9WumsUFgNPYrf+PHFQHj43Q5U3/fBUYdKhpU/YNLzCNgq944MLH7hjVl3wfnlG9RQ1Obnsgy52b7YHuaP2YeQ2iz7se7DbVr4N5g3C+5km/YPEKSUDd9TNWHVSCs+0T6XL5y9Stv05eHkQwVM/jIJsrrqoT9Rmk2ixtBisUmAnYVosS8VlP67AhcMe+i36gRsi+6GjpI4kJ2wHnOWOnNRhRJEiJzEM3N+4uFxlzC7OwUkxy2Hfcd0KWLvdf4clsw9gY8hL1YfAA+QsqceeOekoFhSK6W8a0Ytjzi62jCRfgSLYv6WjRRQYg2HWndx8rJ9IPCxhmeKDPKjn010dt40akiSpbFSn9jjUhPd/SAMJdMMuKtjM6gs6Ce93nNUb7sQu6WH2djXHGUzFoJ7yHyy8B4BGrsnYouPH79dZcfrjfXpulcuzdMRg9L6o5i0xYHUJ42nWTEaIJ5QTc4hKdR+ej9P25LGUv4hfM/6ALm8O8Ptm7owJP8MR81VhVXjpoDRzTC66hOJ5Z07MEHUjIWtW3nb6kuY0GPOwtO+celZe0hZXcSiMeIoVZsGYHKO7x3wwBsjemmjYDs93LUH6gePcUCyCoQnNoJ19jcKPnwFfreG0MuDH1in+C7NLanC/YrlMNiczCmmAvDtsivtPSAEA57G2DjlB3w6qcK7lNtIX9KMrYIuYG3jPZIPloSosXfxm/w1undfky//GYfn5YVYcB3D6cbTlNURj5U5Z+npR3NQXqCCc8YvZLE10fC+yIQ/XptHfTnKfErjE9/cVsc5Hlk4uHMs7Ha25tsX5mH0JwvutZvP37oNMeCHMXauUIO8F53svPAEa/2zAqOWFXw4LoZ/t+hDz7bNINJRjZ6lb/naQUMckSiLqhWX6dIRddgdvYjGJZ8isz0JXPClj2Xu9lLgZVW4btHAG33yYPNFF+ACIdgy0YmLbz/jVVleFLnDgQ4sPYr6hyej35q9rF99HTo9JcF1khF4fl6Dy8KjSWCXNkwmoE9vbsCldXU48Yss5VpIwojPK/D8fTXI9VzIWoYNPC7Rlfft/A7mu+6zk9Q92tc1EXQ9VpL7oCjuiZWBZU7MphcWQdeKS3x+7kkc564Px38uhe+mEWiU1gb53WsxK3Uk1OXlwk6Zasjvk2VZyV4cc/oD6edqQcb7fTzUARiWbgFecxE23VGEyxuvg2dMGDtrfoLNuyPx4Lp7oJWvgB03F0Lr5noa93UCfPU7gIPq02BJWjpdvOnI1dleHCC8m3WvJVOW/yyosr7IxzbJwev+GD5ncRzmTX2Bzeb/oF3BCrsCznNP7CV4racES5c30/IKe7j5L5HbVDLRepUpZK23B4WSM6hRvBDerA6jgJ2W3N4jDoo5NrDCah/HvPzLDSGFuPu9HQ5nP+W2+cDTqyS5xqkCR/dMxUFfBrPNuVhovQ0WL+mlTQulSVlcnvQD9OCsngS4KFVB4Ky5kDJmFCSoDcGA5SgoglJKvf6ZDx24CLf234Wd37vgrHEouN4SZElbE6jevx9lc/tAZroIpJx1psjPjzgm5iM/JTdWS59BWXHL4eWC0fBnXxyXvh0DUXQKR6ZtY3sHVYr+vR6Cpyzi7EcdvFdkChbK68KMqAQ489GGbc9shTV9axDmfoQr1135XeVYsFU8yT+/KuM0WTOwn/MSl9tNhFA/G9y2vYz0LVZA2qwhVrEvxtN1e7jBZQj0NoqDa4kYxxithCd3yqhKzYiqNRZzu85StJuqw6vK1kJD12SaMVodPOpXckp+JD3eU4u/Ha/htCvdoLkzlNLyk7F3cw49Chtm231ioGB7F/dlB+P47RdxzYlSUn2dSb3Pp8E1J3MwFhWiswMG/MRQFyw//QMbRQWwnxdNXT7G1KaggUaXt1PYxECeuU0C/cu8+UrTCPjHiihP+mAf9AbbzpqCYlkDar8357drpsOBlHo2lvgCvfN0Ya1AFY/TeE0wWRmtP1hQ014vGordAnOK57O4/nUQOlsJ50aogsWTWrps/Zw3au7H5vYadr/+D7J3p7DaSwW8vD+Xw0KzaGsaQLj0e3xctBwentgIjzOn8IgkFzh4ZwkOlpRCRuJ0dFLz4OAVCuCZ/IFcx8vgwoexsD6tnXLqRqH2gCjHnZkK89zk8Zq/Excra8NXMz1UVz7Ldx0P0aUfO3DI/BAMWnfQlGMR8HRrIpx5pwx7jwnDbncvNqpawYufZOHJ/pW8NrEI8/7+Ybmld8BV8RydVd/D73eMhDMex+Bq5RDLlqoiJS1DeZOFYB0czsol47jrlBL+PvMEuVMXVktWk17pO648JMZ/l/xkK2kTWlR8jnLN/yOr8YZ0q14DvG6NgHUBxnTLR4H+O9QDXf2H6bCGCt+pa6GP65U4UvA1V+MY+rNHC/561GPznn+Qv7OSx+SEgNqQFWY6KpHvvP3c8O0oHLj6l+1vakPngUhSNpOB35lPyGS9Pv+oScfZK70xyGiAov8UYfVPR5AWE4N3Ep9gmcRX9p/hz7eybfGR5kT2u3IbThbNwpi45eBmcpcKQs0g1EidhL4FwZska341TxXP2VnAE+FBDFfrhbo5f3GiQALdPqYLy+L+Ypd9MS+dGQsoug4vGjzB/PwOvrbanp8HvSeF1lmU2zMCPpt9gAVBk9A42h+FslL4hrk1n+0kdpxUx6k670DhahLkPpUDy4gNWHijj6dJToa1irfZ5YElmLx/SwtDzEGup5f9/pvKGzrNIXy/Nqz0eQuasutIrC4fpHRyKCpQl88EnYX7glPx5HAffYkDCNwhQc+dP4Dpsze48MBIrKpcz7KjRtFCvX04vHspD96XoncuBBlBypjbacShUnvpdMYZHngwgEtW25Papnl468E4vt4wjW6mmYDB+yj6vCGQ1jx7jf0DM+iZ6y5yHNBgAbmj2O9TgIL6UqizcByIZczEwHgpfuxvB+3eP7DGGkgs9DreUd1LxXuSUGV4M/o7M+Sci6N5KmsgYJcZH+tdAcPaniTj9QAsf0yk827DvFpmPqXjaKjb/ZR+zVPgmhmjyNpcgg5nAQVHJvMsGwUe+JnNkvWX8G/dePBakIRhdZs5KPoAnZslgMpTQlF+3gIQ3RAOh4veg3O2JC3MsAH5uCTOLlYBx6uPsKS2ga50toDeMmSntyPBdfUguZzPwZujEcY+a6VrG9xogcsfFC4cj5FXiAMWjYYcKUHSlzsDKR8ms0asMYSoufLCwgU4NuUgLRAcpHXO8RzoHYmdR6P58dUYWDDDjGKeKMDZDwBnxfpRN06C18+chA5VJ+hNTDVghxn43Y/FF0c2Id6Th5roY/wt7hev8uilIoMSqtjTgGP1AqlBSImOdq4ibbsdeMLcCLYM2tKcbVn4uEcb41L9WHjkb7Ib64ljLWtx9rYNvFT+IU+rtYB5Rg/w1eJobLwozGOc2sk99xyv6k7n57pbcObGSLYa2sQvUqRhXs05kh+eDlOjCUSrA/mGwEL0rlpEkavX4b1HErBxyTJK6BKDsxPV+cmwHbnfsQO370KoN/Mg7r9lwQdGCLCGiz4Xv8vi8uvCsFxxJTWGzmVHp69g8tsF474sAKc+T2KvAl646D7srQiCzmZNeBp+kqyP6oJg9GeM3BnJBScnwXWPwzBvZjCmJ9ny0eok+hHJMJj7myOmymL6iDugeroFlC0JS5bOw/L5CbxK4yIfyl4NutFy4FupRFublFij2h9t23LwvFQhJGXFg80XJvMzRyhoexC6W2rADsMCfBkmzjoikSzeFwUdcw9wRXgFzbx8CDsiTLDomRjPXaAJsXVxtNLrGKsOiXLIgTFUdyOSQnIjWWp1JT74Nxk8l/dTj7I+3PTWgfN7m2GtZTUnaPeyYbgcdEYFk1yfNT1yjufnG6fAjnOj4NCxqRi2Q4lC635ztKsVtX47gRcH+mn8gT48m9kF40wUYNs2Hfhn/I1Ut7+iyvrt4Cv4Dnaq5aNPqys+D7iJZl5ikPkuDf2u2EP3iNs0YlYbtVmF0mzvEtJk5Od7xDkzXJJk0ZcPqAfBgkIxqN0+RG9ffwPBv0GYcVUDzlQ7gay6MkWMHglm4h+g27UODp4QgPO7RXnl7kMYnJXDY8/7wlR9OzwqfgzvDXths/gNfF4bD6+sjCFYsRkfGxvxBb3b6LkyA+Pyz8EI60xclXEPJeXGs51oKWD5CKgNVaA1JSLsvl2aPrV48qmgv3zcwBCPJg+x8TUnnnw3ibTvjAaJuctAz0aEvw7PQpeGIJQPzEG3ljPcqp6FDw/p0c4ptrBjrgqYPM3E6D9rcLJGF2wpFCK96BuYVLAEHuz+D4LPH4a5NX9RY6s9/JeSQ5+7ZvOJL3F01NeDnnt14qkBNQqNkeIX9cIgsFsIOwIMoDd2FyybXwczRKXw8vL3lHhXg64bJ7LNnlh2WzmP/O8voJx9tjBvkTvKbAyCkquHwejLa8raMJdjTTTRM30BbHao5Ps798L2GHOwi8vFv44jWH/lOvpbtAXvcx9/WqzHCWlDmPTWhSWLE2BWmSn8urgMQ+wNYItlHF7pWcTNYd7876k7G7+W4l2N1ozu9Vijog0h6Uvot9YM+DMzio66x+Okms9kv7eMG+e/ZJ1gJN+UUXz7mhS0Fp3H/ftXUsXpXfjQoR3s+mbgVO9dJJPeB/LyU/GuSirM15WBh0tCsNjjKTz3W03liTu5L7oFFwWX8fEWN/S8qAXLr5+mW6IaMPmgMzxOu49j13/hyj5NUnkri4ObV+Pui1Nxk6YYHZURxRsCYvDVtRdvrYyklfMPkfVXB3j9w4rHup5iS8vb/Gt5KfkoP6QN5ywgbiCB73+WxqHp+6HjUzTa7w8H1VQ/Xkmn6VGmG6+YlYBlNuPg0LohnLPyGGa9TKZDCoYQl6DMqcO3Waz9CmRvMiQj93u4t8kAWuSJzKVqKCF+Akzzngwr487CvJIs7JewhjVvDDkxXgNHlZjBVuU6TK505GunWkm9fJDcVKRJ2uw98U81rF9RiO+Sk9AW1WBNrTwKVn6ha6su0EPDuXywpYeofwHC6XPkl/6A3O7LsdYbMQj81o1V9x+DsaAbhMnPwuLnqbC/dD0bP90Hz9oD0GLZbJRzsYQve8xIfEwezf1RRn+DpXFjmylvc3TkgQxvlnOUIF8vYzQtGwl7t3xh44wHMObybLiZvRXc5DfDu899bCjeTQKSHTCt4zNvOiUEbW7ptLu2k4e2zIa0a/28de4kUNFppznqcjwoWkmHpl7FviFRaC37xbfDPQAL29l41yyYXhjCWjpSvOtANY/zdCXzxzXgehfAIewyFBd/5q/fTuL2H1/ILnA0LdU5Awd2BNCEJA3yn9lH103EQdPTBKfuH+IG3QdsdU0Tzo+fzOo77oGKux1dOGvKTmLfKFHTDnbhLwh5doOvty2EZdqavFHuCj/3V2DzE7eocfYd6ivox006yqB2/jNeunmNFOpu8hebKrKZmQpy56PAeZYqXu27zeMW+1H8BjGwTUtFgUu16NtdibZVgXBg3kYYkHXH1BclJHQ5D5J/iIHKX1vQmNEOSW8N6cO7c2QvNBX/7j6L5wM6+VOMB/Tu/Qbt7xk05HUg3ek81rgYQrGxHVqlLiWZlbG89fNTPL27n3ascKFAVzMumisO3vdz2LelkXtrimDzYVmIHm7i5d3BcFg0A/RXBNDZ2HywW68AZ2atxv0uI/Bwmy1KNbtA1exqOiLhS9NO9+Kgjz5dLjzGlvIEWaqx/DENqPJsCm4Z8KUV44Vx5cT5dHWzEU1Xno2Z16ZDYb02dE98RJ62GpT3Zx9r4xceL/kP3GZcRq9xCjgmxRmNEjdiV/IoeNCpBL2OnpyRFouHCuZixpspfCF/Fx5teovPTkcC5xN8mI3QL/WSxftsOCJjFtRozuHtKln4s0YNPx4/BbJLfsOJuvko5CEB4ydeQr0x+ujgaQYtCzo5zus/ULq0D1/4m9FzrQFccMcEr7dbwGmB42y1PJRCTtymWn9F9KpUQ9nGzzAyWY9PzWnnPcnf0NReFKR27GFHq/0YnzuGSndVQ8j9HTi/14xgvTAY8TjaGBOM77QQSk5mYtWNeJql5wS7zl3nSf4hOETObMBXsCxuI9hlaFBgx0QQnfgWN0+Yje6PutBPzgF9VhVTRFsAH9BdAEG/bfiB1Q9QcxMAaSsJtBKeSmHBHvgjfQ/lFO7A8O0PuOOGKwoV7qHpgvH83kAQPqYwfU3Zw/q69rjvyWdQbNjMjl9msNmNYhz//AFm2qxmzSsCILPFAYK+/6aPCQNsK/kdW9d5kJ7YHlLVEkapxJsoNfwK9g9YQHKEIT5VEWJRyxYeFZEP2xIKYfIpK5w74w43znuMfLIBV8QiNGYshnPGOzmgrxzbI4z529EQdqrNgIWXMunGAhty8D9Gy42NINFWgsKc7WjH3kcs/XYu/dyRyA1jzSHTJJkWyX/g+/qaePq1CBSG/sLlBfnofMcZa18vwJLYxRS5PB+9d2dysc5NzFa6SWbvEY4nvILxi79ik5wXt0zS5mC7IsyMLICb+2W5wqyP45rL4EmhOSytGQu32tfRqDN/8J1HOu6e3s47xiNKRrhC8jQZLjGfwXtPakDaLiOMvnyJwmYqkrL2Enobmkjl55VJY81EdLiwkbKkk0guUhDy8+djR90i9g/ajzemiVGfWjt0GX9gNhag92k+NHKiAIWHicOVR08hKbmEHjeVgeJVBqEGNdxuFw55BTOgWVCCF6pH8Bx5AuPbEjRpZDyRbxenhqeixwh5tjy7A6/pteJ67VbCy06kNUsHJrrJ8+WlPmy1ohnvLAWMel7JwqZz0PXYEOYfNqZwtS+QXKQEKVLpbBZxhmpsFTn810l0GhpDi/LWUtjXAuoq7kN65oICCiqwLHUnlAVtwklRzyDSxILVTjJMe6CMW70tqKLFARzzKzk8bhLMH1uDZy9fgeW9X0Au4TUN3PBnr4fOUMcX8WrDJThlL0v+umPgQPpsarFzR4VnjfTPcwY73/1G2aGXSOClB19hY/gvrgeCnwlAuYIGN0nspy9PQyDIq59uyS/m/uJeOuOwjCymBrNe5Qs8bG4MsS/iyNVvEZTWpKNL+iaUmuvPbx8v41ThaFxX/IbU51yDqI0iMK/kJyXIaoCEQTPenRNNjSG3eZXaMIddtqA5FhUUNmhLMkmTYPfd77SoJIKlnwTTwWcnYbSHDacfroaLdoTdx+U4sD6S7U6qQ9ZuNR6cuBpm8losO2MOi7/Hs/WFd7hEXhNWz/Rj0bCV/N86AYhrD6DC7Sl4OTmbPih8pvUV4Wg2wwiU15lBmq0GPnZsJ8Hz6nCnzxgbDjZAauV5dtzVDbHjlUBcxZRXSN3EY2k1VPwujOw1deGG6UYuMRDnxfQAGzP+wPyiszDPWgR7RfMhw28+fdz0FswEx4Kray/15gnwioHnwMumssd0UZBZfwC+nZHFuxFpEBayEQtqRkOi+WjIrxQHYRMV0vhUQT9c/anVaQHopv7HPdsd+U/5LnA7YQyzXyTANstSftPtSiajz+ID4Rq8frKB5YvFUfXvL/44rhK0klXgcfA/unP8E42Nvw0j3gjBS8GTWDXbhqrP2JHTjbPklupBliqi4Dd9MS72CEKN2nj0zBHDRTND4cFrdzh8240mL7Kn1b3ryTtMBU74BMKltlBqe90FuoH5sDt9K0tEv4XZsyIwcvl0Li6KYPUIabiUqYnzI59B4++1MG7ZW67a+Rwr7z7CztRicn16H3eF54HobWGIcJiNf9c+o0OWrSCd7on3jq9mJeuRaGk5gLc7bHDnuomctU4ZnpzqwDMhKfC5ah+rGH4HoUhhdrfrwjPrK+BDfyaekJKA+TsEYP6GRTTprSw+edNJP/ZdhSeKE2jCuqnUrrsCdrhG8TzzMNautIfl1edZxLsbfmbdh5eGLrzmvAttCxOBe3PqOfHDY04S2I+xZxCaRNQ52JOYy7eSnlYNHo2JICncD+Lb1PhmzDC+fqnNY7c6gMy3XOqTKycZ1xmw2kiPPI7P41t9BnhBSoq0fZpx1kAPl5zSh6vXwkm7bw2M6ncjqaxFvHXlNHhltJduTf9CyZ3vqPHLc4zyt4Kmvq0kvXss3w1rRpE1/TDiYRTtHp9BU2vL4HvBQtR7uRdSZgjBZc1RaDVpkJ2ntZPN8zL6r/MeBbvOQNtJOpA+Nhpr47Th4BtN2HK7AVWvjoLa5H54WGWK7vL69LVkAz6wegTegYp0zzaM/27Wh3/V2tixeBBGT5sP4PSHdvoLQHvjNp5XFgrt59SwZtdjtMoeC8rlr+lE5yOu8Ukju5UKNPDwJigFhtCEPSdQ+qkLumXcoKOVDJYtzXBZdi5O6LWCU13ZZCPA/O6gHVRZP4Gt6hNp/br72LpcHaosYtFx1BTaK2FLY1QCeO5EbzxxZS7tlxSifxUfKSJ0An7XkYTTd5/Sqa6ZsM90DKo/nUzHly3m7pHAMmc82ds+ijZNV0fHNZPA1+EWlvz2wuM3ltG4a9Vw60EM7K39gkt+m9F59xTUWP+HtX+OhPCjvvzTxAaX/87i1SeE4JAR4PRrCnT/3FROU5sMdfru/DbGDnbk3cX711ZQq3IvN48w5O8HSzFqkT9FOCxEW+vl/D3JGCXKR8ObXwup9LEq5gokwJbOMyR3UoxiaodBW/gmvFTJoGT/ZkzdLQBqM19wlIMbqE/p4UwNEchbHkevZC1ht2g/1a5p5p4TS1HsgTWMtlyEmyISAcsfgmDSYlY/acgqU83AZep6sHB5BgWQRadM9KDN4AveFLCjPMFtPOxUjAffpkK97HfMOHENjoS2ooPoRHh7B+BDuTwHqcyil3tyeJeyEeT9yoUpqSE0WfstjtpzkSZ5XyJvNYZlc7bABd/pOHn4LeT+CACBpHSoU49AbfWdVHf5PTwVUKOHQaawqi2DT5+X5xs628HYSQILbeI5c0sfrT7TxTZSM2CpqCJ3/xwJweN76YjmMVh6pJsSfZpw2p7HSAMMLhbhNDVsGXe/VEPld0rwtc6NJ86dDWMO3mPLZdNoxfNC8lCNJYmcAky785aMd/jDx6/mcDfqLMfELYVAZym2W3OOvOU24JKtVvTl0TG8XGvISu+96E0BQaHNWnxRWQovQ+R4bm0bHi67iRXlzrQ7ZiXJxWvTo8treHebPvTMkQPtkju4ZNYpfmHYBd6Z8+lSgwqKpZSQ2RkjnlhrSc/uy4K76iDUjxOH02ap/PXuMOz9KYe3xr+Et6pv4KnhW5Ly+0qllrJwcq0m5ygdwlUdwmCy/htvuLOFHFbshyexumxllwPZfq/AycAavj0bpskjZlPz6dtobKyJr1dZs0e3BOWNLWenzvEgM16exzUawfIrziQ0/QvMllZk32h/iF/1mbNfruR6I3PQtvem4uaNODBdB7LqpqJKQyN+uOBNaf4DtMmtmXRNf1Nm2QR4GroXs4/doZ0vtADmO2KAgSGHVpXy8sH/WHFXFN1UWoHZO/9x1V8J/H3Qhk0cNOHLYWmquNGDYptr+WHCc3YM3QKbnm+kh7SAZykqQtTBWhxxXhvmyipSvowqbqMvMHGCLm14WorctgFKvHVQRtgXlBetg1N5ujDQ08MeGXa4S+gPXpg9xM1ogQ0nbiHlV9K/WXac6WJLUkcmwOnKQEy7ZYt9zdv5znJ1TtUVxjmp5mSyIIYtf8VipVUlyziNgLZ1LqRQMJrW+BdR2/QbpHwkj5xFLlB1mCfGlGynxSEv0TfZAhRm7KKjUaHYeVUZdrTVw9W2YJL4vJUbV4XCY5FC/LheAI+/l4bdB4xxwZA+l6mE8lhLb7CpEMK09CFYM9WBMg3H457TV6Bomw0cmfEKd0X641O/ZjB5mAzCdstp3Kk23jBzP6W2DuMnP18OkpMCjYpHeJxPo6JgIcaZRNOK0LkofmgyLJbOwZmvmI6zAY7SlIf40hjsKQrgjfUfASvE4WjSWXDwruS+f5b0Qk0XvqU4wYsfxiA27xni95NwefYkfrhrGpp6avG59CLcHUU87YEHVZtYYan1CNC7W8dFh3Txvo0nKtStQMM3+6FXsQ2LR+dynZo6b515GtPmCMO4tmBea5gBKj+0qXJpHvudu4XHdB/BUGomu1cfJiGNZlLOMoIRbmIkabAevfp7SebaDrZUWYzTNl/D6xPs+KivEOjcCQKN2Algev4nj97uCeLlF+HGwD5SkfgFX/Y3cmTkXlgPlRhVI4PFvnbgUnsKpmUGEyXUwsWL9Zj+oJ29gsMoRFsSgl2B0obl0PirNcjesEWxFzdhvmQgTJ59G9KOhnBSlRZIeG9F6/UM+r++UOYWCwgXWsILdNVo4Vlz2FHUBhVBm6jlzxAfNfWk15d14OHoH+R6UApG5xXx3KPq9KlYn+X6P/GiqctwoHALPhsTDJt+HuMpowEfCUqDrpsYfXtUCw6V0vj6agBPV6qi/7aOBImbbWD2eDVO2XwXBN3sIPyuC/nNzoDsuyHUHXYA7x28xtVHQ/lI2jsssge0troOavH2kCxTyXrZAhgamYkLDKtos1cxqjbeAG2HWtzU9AlvJv0BqS49mCU6BmITvaBsczhUxA7g8tM5nP1Pgy+/XsqVHeMxVa8ajisrgV/mNdS4rwrB75zI0vwijwpv4Xm7toBnXQQ7N+rz5jYxfFXpALGnrHiKyi/QHR7mpNe+1LX4H5m8SIfjOnVUWHwA+cJW2HhOGoJP/iLN+5XctOotOkuegKYoR2yXGYXhkol40FUd4+cEsp2kLHy6+5orMgQ4/nMnTn51ltak1MO+w6fx4DEBOHktmQXaXPnROFmQE+4iiXVvMEv4L17uv4POZ86g7+oPPOn9bNI4I8EdJvo8VkYVllTcQZPue+w0+iRLwnlS+RtCgqmNnL7Bhstv3yHVL6ORdsmB3PspkHzoIU8OD6LH0sY0Y/ZqKErzwFGDDby96hXPnrUWM9+qglxwIcmAGhnFLePLgTdYOiGcHmhE8vE/pvD9aASd1zAFeyFReL5fga4Gp6Ht2Qxa7jaFDZ2tYaycFk+eU4UqfxfCuIHFnPXSDCL2H+ANpxax/dUY+pW4CdYKL+EM25f0QvoJmB/6SidkHWjhr/EQovoJ5QzXw7ZvLtA28AXMju2hV+LRaFy2GYOXvqGPj97hhN82ILtOlc5k6LDLn/Vc4aMGlusmkteNGLg+uRbdWv7RAxVt+hYuBWE7f4P9vm5cd/gjm9U6UnZROr8+PpIOCIrB5acncdN9CZ762xBGbJ8Fj+f0o2tlOysNz6YCnXQolHnF/ffDICzlFP8dM5fiNhpBUUM9Ve+Rp83ZPhx+Qxz1x+7FzxFaWLHjIkDPLv5dvxNenbKFyQeu8/jrSWxfps3zOhtxc74zP/R8QeozPHHBiGxen6PB9/8BpDUBrz3xlJ4XzkZlFS089u05K3z0QO/GROi+t5Zjt06nMb4m8Mk5gh/0nQUly1BeeKQSUPsqlN5r4qbCfOwpWIDhr7NZRVcKLrUH0ofNqZjX6soqO9R41dRmql85niocSnCzvCMNRCsDnzOFGB6iC4udYL/8aZzc4AdBpfEYGuqM1l+secGRC3BeJB/SE2XgxyQTXL/tI5mL15HnjlTed2oHS3w/TqMqyiBx3GKcNzsEHbuUQVdkOu/dYYzq/z6DqEMl9ssJ4VfznfBQ5xf/2O1G/hfnk8rvsXCzYRpptk8lj49CdDJuIZvOq6WmjYWQM/spVEbuhKTVPRjzUwQO7BlHqrnCrHHnP5i33h4TvJdRzqAW2G7thIK99ixX5snaexgM1FX4jukmCBR8QwqyFyi47DAJmotCZ6kttVpUQfGcddwnKAm5B5/j2XGxuCpPkf7ufM6baqV42oA3bp2cgWoi+eRf9IJj/tjAD8thVJ9xj6EROSfCFA0K3GDKnlKoXL6JTI/OxMYZG3GLpy18rBSluSsc+LaHBueHBKDPUhGQOP0cPU4KcFVxBHxaX8k7XUXg0UAXz1y9geq8F8GXrStwTPEWOlaQi88qh/HrgdOcMy2d6qwBtm4J5OJje1j5QC/ShdOUrBTFlmHl9G6nH0zV3ox9dhe5eqEJtDQvg4teTii9dgd1eMhTpG4iaO/fghMD3Sgi8QNJCy+i1YsmQdaYDs5d9xlLy3PgsF4LX4+qoo0WWbz4hD2INz2gIYst7KQpBHXW6dA0XA52dxdSGE6nK647QctYm88F78Kj6q6o3STHHxPGw9dWO+y3m8dCAzmYSNfIO9+e52duRb8L7uQzuxiGCw5DfCPBIqyh1hpVtPR6Aetl3nLI1Cxes53gxosFvEdUnrW31NFglRGESmWS+lF19Bj2wg9H/4P8LS084C4BR+OmQexacVzx3YYTSiTgTus1NPtPArYsleGV74TRW1kMYxw/YmxpFqVuD+KEAhcwcLYG94FzLPS1AySnhrDk5TdkGhGP+5Iu0LFFrpg8fTlG2dzj4XZ9WPnGniyEI0A38xbXPvkBrypfkv8ZG5LXWQTPTl6AvBd36D87SYi9YkcP895B9+Qd/C+2CpWWuLDJwmcQYJCMf7we0fpDe7g0Whv+pLbwocF8fGrRgusyYkjFZRcJ1zfTQ+90hE8TaUNABZ5vHg9fB46DwX/ytKLDAGp+I/z5E8GGsZ/I32U1C38xp2G1ClyYIwJCgQdpx4Js+LC9AAsuTaCHcxKxYs553L12N4a2KLLlEh1ec1Aa2kKOcX/rVlq1w5EyhmN4V+wqFPxSx8kn2vn8pV9o2a4PQRcVIOW7C/Y6VINmDpLoI2fQefmaEubOQO/Ti3lN+mWo2LyU+5bbQvPL+bBUzwRDpVXh8Fpg8b+/qLYjk4RbBbDh9iDe3vue4i8S1G+Zz9fDpKDN8AUsLJHg7Y9mQLH2Rv4nFIMCw1tZI04SRuuLgeNGa/j6wwge7HtHx2M8ue6bEf7UvwjPm16R7wg33jncgFMCVaD3+yk8ctcGtJYms4F4I3VcqWB9q9/0qUoQHz2egle+mfPjUg04M/YkKa8I4/j4cJYRMqGPEg0wTewh9H0rZLUt+iDdeB4ywg3hSqs+m5+LwqUZl/hjpDAHHhziojHfaObgKzrRo4c/dN6wULQIJOxfAf/tL8SUbWJ0Om8Dr28pJIvDD1ihow8dEkW4aXErRUXZQHd0C9eKaPELdxMQUF0JDSfD+e25w9BEB0D3qAzKv+6jXTJC0La5B6tqD8LxA/MosWE74ORyNjjbATMrbMnB+hNHlo+Dwq2jQWwgkcPnrsM9S22pTV0Dg3cm4pU6PyqwvEs7v6Zy1Lrp5HPdFKbcNmE/ufs8130NpK29Bld3ydHgy724w8USDcq2w1D/bTj9cASsnNDEXjfGUJpqKi3z/4L62SF0XJfQ2N2M/D0e0Z0CfTQssodc+ecoPP0nStu4Q+D5VHpU/4Lyz5VD57rjLO30GNbsug5toaKgIi/KWnmWuKa+l17ky6FPtRjvvKiNY+wC+EmyJ3baHAflTYbw0tyXRXS2o1S0H5xNUMApH40haXQTSD0b5IqKVGy/GM+3tulBydQ9+OZXN72mCpA60QGGf8Uhd3USLZqiRZ+qGUtk/+EWBRmYtKgDpvnegfaPAxQ26w3qnUwgmScXeKDCCl6MjcK+VD30M7QAvxF63Kc5B6LuTOEnF4UYpGbwQssuaplcC4dXqsCi2Q9obKE0XBvnxuc+3+VpXh6QJ+IDtc/2gb3gSpYZ1cOP0Y8P3t6PCVWKMHu3F8v3nsJv360hQtcKHokvID+R2ZA5VpIjvSTgSrU6jNggB2l+7fis6wOt2mLATpkTQbNzCpctmQiTl3ykM7fj6Y+YCyjPU4SOAUeOaPAjvedLoX1bN7cGV2JyliYeDGvAcyqfsa75D3xYLgiqoZLsLFAEfzL0KEb6M3ZVvaDHepkYpdWIN64cwSvZb3lwliTk/adM1ZIuYNL6BJ89P07L+iVA6GkBV2ik4zGDKvzv+no4skAGZKyD6Erpdb5W08iF/43EESdXwFjfl2Czx5nECl9xlkUTGF2wh5C3K1nJz45GvNpPN5/9o3KXJJq7wwgL95yD7o4pXHC1gJJyzEHUyhxX5tXDphUroa2mik95JeGtI/YoNxABo7bV8bXjPqgVowRus2vB5/V52HhpLF4d+geffkbyjA9RpOVYxYn7NrBajiKIO1iCiQdBZ7klfhWYAp0Dv/lOnDfYvxWklalBGGp6gAZqr/G86wBdVUs4pi6XEodbyNnnEAWVPyTt9k389OhB/HRxP704kY4uPQqwvjcLfHwu8KqHPaiffhQKV6uQ46n/eJyrDfTsL8J1LvGouAJB5c8/LN4oxeWLjHE8/eJLP5PR/Zsn3ap5QJ9PjKab+RvAvGoSbO49g+J+IhDrdovhexKu2XwDBZs3016Pe6wWGUMvtUbSZjttmGi6km/dNYbOBHf+HKeMHwudYHRMNDu7boSQyGx8anUPf163B1+r7+BlMAq2FjRy0ShFGqvUzTL5O9j7iS39rUe896QWf3yygKIrnTwo6clbh9Th/HoxeJg8kZ3VOyEh+g8431hAIweN+ISQEfgqTYcO7xj0fhlP1ipGLHnGCqIGD/LhtG76PXcIu7Z9ouo/8jDO1Z5PvQ7Aa18+k5eBOJ94bMwZ6WdoTIcjdo3cATXHVUDz7wgYeUgJGlwPUtiWJZDlNJ6tf4dz3fZR9Ckln6IXh/KyP/dgT+EYUOtaTbCxnKdOPML1Fv2wfbiE/CJ+oqxaH9z5T4Fnzbelky9kwMp3HX+Uek2vxt/AVc2r+eOuHvo3+Q/eeDqCVJ0e0I/BOeBYqAkaUk4QLkygqmDBi4cM0SHME4Qe5BEI6UKdgidOexlIG3LNwHCkMa4KeIwBD0dAzF5tvF/kBAEhJ3iVXRCMyRuBwVqLMc9BA0xENvMeHQM+9ieXZ5jfo0n2oVyWMoxn5x/h2F0NUFrnjJqBY0Fj736U/FICRaY/+L+ci+Bb+Jb27MhkB4EuOnV9kMqK/tGoOwpwtUSK0biLZHtP4O7Lb3if0FksCfgMU51UadvpBTDplTTvKRkDY1tt0LnnKet31dJJmTIC2ft8ZLoBbNhbDnm/28Bj+hheu3c8hM9uBzQdz7pxjyktazbdmBbHp1gPT9oSiwTtZJ9LuZyA8jC09ia2jojGAikjPsaHIP6MIAb1i+Nse0Gc89YDHulZc2qpA0yoeQTr37azfs9eNlF+gE+9VsHLA/lYLmNHUv3W6OKuhjXRQqB3xwUr5eJA0+UxGHsM4+KiGRywNRObUo/zv7S3vCZ0H/rmqsGifxfg5lRbWNubQe+xiSQ0J1DQWmXozXIkLdEfYLj9DN5SnQR+p1zZyKsI6ypf0K/DrnT5WD1e/TMXqsdv5mZvf6j7NYUfJ9vBSLepuPPQZiq9fY+DNxvT308B2HTIhMPOneORSxpwh8p+in1pAB2XBWFCgRUljPrDgtXz4GrVFqx/P5/tfT+Tvf9ahsMhaO5kA7clTnJyYBjsn5EI8VcKUVZ5OvxKWAvawck42c4Dc3EX+9mZwDlXKzBy1odf3tIwocaZ/QyvgWXoLbx1dz7YsgiMLzCDnecNYLTrKtr05j+QeLWCOjuvUOjV4zyqgPnC+FtccnKAB7x3sv1TM+jSmoO9l+9T0wtbWFIgjmVGYyj10m0su5QBUo8Okbq0CxjYK4Nkqxh6i8zF+lGGHLw2kmYFzKHHyU/Z2Goa9/kEoVmsDDaryMCk74rw0no6WJo8xPXzHCA5uQY1vwrh/fpntNw1BXD9P/5pZQtdUR+ZDgVh3fJGjvmxiMFIikRPefIL9RfcUOeGL5baQdqQJUz+6I76q1PQZ7CEPk/voWHlSKipTef4lovwKCkbD3Z/xUn+42Cw4AluWjeLtDqcedfWZpZoW85iNuH0fMJUetL0iMcEXoW5YVogejoNOsUbcadcMj5xjKYjGkew1XYbCU72g01XVsCxyHDouK0Nkhes8aH0Z76b4A9hGbmkGNAE0y9+pt9DEiR5Yxy8T3xEyt9MQNtMh7OPvKNYfUOSPvSHS60cMahyHI2Y2A4Pl9+CDAzh25HS8NNuGVedzScT82dcbj2ZsG8RRfi/gKXTzuM6pWl862o8mZwyh7nPK6G19Du/jumnSfJGbGZiAAed/+NpKemgc+QvZjWlwdID6vA+u41Ueq7zjc5ICg4uRtNSHz43ezQUOZ+liB4r7t5Qg+t3a0LUzhaq2HSPcM4yEMxZgZP9p2CtzAsamn6XcnfmgF52J6SnjYTD1S+hrfky5igeQtt8DZSuEuFVMcP0bnAjj6/cAH0XPsGhHBkokx+BhSKuJH5+MY/gdg7N246ZqUD6O76jzfk1rOL+j1pX6UD7k3Is6lRCbxVlbNpQz5PPL8X433sw72AP8ccB+N25D3WeOkDExlOsJHCS40/0sU9tN7snL0dNgd88KyIcVm+aAYvk16H0eTX4orIPqtW2QsiW8/Dj9zlUCGmGJx4aJLjCkbRabWh7QiQsumYMP95ns4+qEp1rGQVrtFWhXGSAFy8SYhe73RBX4kZyrUdZ/uYE+Pv4JgjNXkt3bl6Auj9vaPKsAlJIWAc13Rdobp8EjF7pi7KvRoGO3wsa6g1Cg5QMvmyfy3Z6qdS2RxrTGov45t1oyOqaDv+9VIIybzfs3zeEL6IXwMLWGXBPUxNTAhUh22Y6pd9G7k09irUnJ8GrpAo80vAE+xUV0aQ5lh9IyXHT9TbUq8/n8um97Kv5kw/5TYA7n9RR+ZwfacxMx3iTdBC+1A7N/dm00nQB5we/5WuPUrBOZwIIad/lzMRGtio2p1i1jViU2IQ+OofRUesbRlQ4cP/fxzDxuCSI9W2nS/1lMDpBA8Y+cuTpdqrw+qIR/Mm5Ckvj1pLIgwj+5SoI1vX6MGFmE3vdPYjVijnstPU0T0lfxtE92aCq0YCa+47gTVUNeHN5HaY9PwZ2yXV4fGQQFW39Cb8q5vFtmwMolvQOX9wrp6pWC4h+nQJXD7rgs6KdlGPexC8PlUHUJAPqszoNIbeNaMvEf+xvrgWlYws45GMCTKwM59hYffBxj4TQTxI4r+MWRWes43FNApDzxB5qTiiQomgt3Dxbw3l3wlA4fw2pXA2BW6VjqKcuELdJnoC7ZeqwYcEcCFzsxDXOs8DazAIkLyWScMgO2rI0DiyCnkHL2lk8f545fF9ZBsN/lPE/bRFa6fOHr3x7RBniNyHG+xMOCTxDD9s3GFSqCOWV2zAjzBlHT2ikUwvPwsRdXTj6cihVOf3g/m9H8MbMafSqQg0OKxFrhEZAxL9cSumXRwGRI/zV/SrnqVuSTIs1GmqW0Y2k8SCx+DW6b41CUdW1VLHzLrjOnwFyO+sp6DbiSdtMuneG6fQ0IXhyLw23b/jGU2avYqPV7iBisQzuL9nKHkE/odFlMTz5XQ2ZQXZg03kOnpbsxeLn1XDJ7iJ8L2WYDbkQ3zUaZAY1UYBuwytDJciL6OJ2X3+6+fI4dirm0iO/DLgk7o5GL96DrIokmZb/gHuLTWCxoBOvjb/Fym15+O/7AzwUcZVr2zfy2Iy3MGtyLjZkjWGVKXJQYTUF3zxq5S11Idzp0oCare2sVGSP8pneEC9+nw6O2IpSukYgLWKDX/668tPbLTRm/ys2N1GEOx86aV7NcSouzOQuX1lqcVYDiNvKvxefwlPLdKA26zGqFvtS8B4jOGb7nqodJvGMKF8oc9YFz8XOlLjvOytVa3DUCGMYXLKMlgXr0hK7LK7Y30xLtFfj/V5rWLSxmKoHMjDVVA/PtmticksSjXhtiiE4GeYdiMWbMopcEGb+f/N/k0470F/hGTzp3yE2uODFBlfVQXwagWjtLGi8XoKa2YP0ZMYouBfRjuFS66hZYRstWqsGNWMn4bEgAa4N8YE/Fa8hzp8IREbCZLkPFKLags6bf0NLdzdFlx6Fz2bTcXVhE1rf88V921ZR5BYb8NfrhoB3p0Ht7UWqyCvF+aeVyN1mNXdk/iO5vx/gdzLThkYJaHygBGlT3Xi8xFHou+EK+jdukk8wcX+4NG56uRG/b0rhWzGKMGq9J3W5x4L3pLskfSsU3Tr0+cPyOjC9ao+yDu9pnFAY2FeLws/d5yF98CEbJdjg7Pd9aBovSwZ3JdCnUA9+vRWlNYY3OEZEG3adM6Wnqtl0MLcX4yOV6apfJZj+9MfsM3n4e0YHK1YXsOhRC3ifOROETzlBWbcjd7fa07u112njrzF8qb6JFm6eCkkvj+CVSVoQomfGEiVN2FQlw+9b2/nVyjq69TQPJX6aw0StY2T5LAFX9o2H9RP2w4dJImR6Zyq/CVgGahEr+KPBIOTm9sH0bE1c3uGD06RFYOQYczhqOArkfZtxV0sdSj/7wutWzAQh5aWsY3mHNXYEcOAzUfCZWUAnRohQxthQbFgZAAe2LuCKxg1sXl0OO7snsKxiMbs5K4PolOXU7f+IExtPcWB7AqeP20pLRlbw8YWunB9wnLYs+EBLV8jBFk1TeCIegllv8vjTgyCO/bsbF+0eT69Caunhuj38t+UmLH5tCiUNg3hO8Rq3d5tzieMlyHe1Z6fda3G/uQEp7ijn/BQLkrWRg+xqe7YYMYPeHv8A939I8qoxx6HRpBQk1frx3LMg8lh4B89ly8DU6ElUvqAB1uYxj9t8GV7VxpB4TimmXXsBa6SG8PYYe/JTMAE5HQVe0+5LAkkDVOBznpcsDATfkVrw9e9zinvtCJXF5qjvIwlrNOUwiRzAIuk4Kd9ZAKeOR8HkGVZ8zTme3U/o48k0K/66agzMeh9IR+YOkf3qRfhqnx1LX+6Hnq/d9HL8RfSbaw8t8w7gqwoj+HqwDU6L+MGyzU2ko1LKmvJeaND/nGoEizHx8wkwTIzlpHAduPdaHqqcp8PcS9U0MNYC799LgUkpwuQ1dBUeF41G5/mHWCrIDEJkVEnzTyxGJ/6mVYccYIaXNaZ/rKOd1VtYUI9B4Fo6OBsrwVrdeuyZugvWxD7lK4+HseZ/BMAHIBAIFADQP4xIKiIrQklkZITMkhBJCg2llChFQkoSSSiaJG0VikSkLk2UQoUWSiGpFFJCRrnn+QckfcQh7dVz9C9fAmciPWhmoBncz1tGhaGSfKL7Ag2+/gujl1pAsIMy/Av24PZsQcqRLMQV69RhZcwYMrvaS+/Nr1HDnSYayN+ALm82UlLOThgwC8LjhR9pftAEWCMXy1tn5AKZ2kOp/RAYTHtKE3PWU4/OLZSqmMyXL07CXYMj4GmzHuy02QVHNtfwvbJvPL3Glr5tPghhN2qgaiAQZls380CgBsyOTmYjcUk8P+8Z6YtFQ4XkQRYbK4qjDn6H1dGGbDbNEhJuGsCVokZWPv6HJiz9iv1V8zjhrjeGJL/hzTtKUVVNCZfv38SVgupw2NKYft4thqETT6DdNQs2HVmJ3p03aZHvNg5MkccowzUo1GIJf+6XYsMGQxSSt0f+LsrxW6fQDcclOKfhFC/WvspRzRNwurQclFs8IL0pBtDeMxq/f36CsipqZD+pgY99bwGvWQok4CFMsZPlwXxHG1/RUga3oteQuzgdhiJ90Ve+goNk/GCv9QksiA3gjj4FiNr4gCUdftIqywXk+t8NFOxxgxdHpoBZ8B34cTcCHz60gBUHhaDvyhi6oh1GcS9fU3WOIC0s/0fqlTm0t+Ydr7m1EM8sFOYdkuPBevVyWiu9lMwvbeIBldngUDmLM/wnQbSmMdl5Z8Gfr+F0edpYWCstgWfm9GJkcSj4W3mSachSLMoL4XPqM6Hg6Ci0jfkFh2ebQoDuDr6muJ6iopeBj/cdXLDOHcqrv+PWHgvaGvsHU8NTwXmbPpyI3U5DClN5p88Av9xgzD4NGVAYEg6Vv2bgnY23uTk1kTXr9eD4ktNwNLyHgka1U7d+OL+s3QHCgv0of62VPu2R4s1lPTipXhF+qOmB5pFJsFLqHwwWMYUE/+Y3oZa0UfcWJGSOwJ2ZHZyfNBI2AIJSynPaM9+ffrz8R23pIahfvworZN5ilfgs7s75Sf0dgnDV4CItMCnBD67L2Un0AkyNd6HNL3M4Y7IeV0nPpYajC2CDhzJUTtVjj+X1LJ/yF9o3SeKLszU0uH8TvKlMpv5nx+FC0kk4qygCFX9c6dDhVLLcM4zvYi/g2O3icLPLgYOzq8kvXZH+FbnDKSVVaIowJ5f98XD+TwKf7vfGxe3iKHO8A1qmn+VphSXUHOtK1pHq8KE/FR+UfYMv75zozeAqbpmTCT+8y7lnUzeZ9Vvx0MvlUNOjC9cv1nK/rAMdja4mgbZ29j9TxLIjl6C5cgg8kSvmRQWL0CrJDMqdCijhoxTtz0zjw39r6XhtF453+YinPL6BYIEmnCkV4upt0+G2jQ9K2Syjlh+ruL7MGoSO2IDRrzB69XkL9emPR2nHFN6mJw11XxpZ/4gzw+VQvty3DNNziOxMDalhhBuuFejFPO10fHdWCTTc+rAnUQyutB/CxFBZNJ5+DdO7itny5Ta+8V8a7lvtzV9jVUDt6XbY+fIDyURaQ1JZN9y6kcC/tH7hy4xueFHeR/lKX9hUWAOeOFZiTc1Ljl2QjD8Ob6fdNZOw/bgJX1rZxP/ujeHHe1fj8UYBePXtH3l6G9GctfZoVz0C8oqBf+l344uSNnIXC8ApYc/5RS+Diawb9jnv55mvL5Ml3ke533/40oYEyJp9DqKq97PR0xZcetQM4PwA1Q30Q5jnUVw3Uo37jx0i+VIDqE+Rxl+eDpQ1sJVX/gaQ9LbD46rAO4ud+e3HkWh6Ox7apl3nfLHfPGKDAU/vqoVWcXNYpx7CVgdiaYxKNmlE7GbZ5/akedMXrMoyaLXiYwppVYDWRmMYPrMERz6vxj4TC/zg3MFZUWc5/5c1fC/9yV7F/1BytDM8AnX4FzzEcKMHjl/czWoBh6Bo007ySDGGi6EnsMDFlz2rCrBwpwiU63bB8/nVqNSynJu+KmLdpvUg8q4TB5Sz0dbADH4t+MC/KiaCQWcmuKqLkXR1CAqnS+CFLnOMenaXJ6d857oHFSClJQE9owUg3rEYcmzWgcMjGeBTSej9LgLzBxVAXHgVvdz/AivTiURBHlT/PEThvU9w8bt1OOGKGiVGDdBcWeJ0eV1YVLKA987oA70cdXh7/wjNvPUM1hrshrWCfeSwLg8N/0Zyj+0eCs4P5du0n4yXTAaLngMcJGGA43q8uZ5teOYjHXqmEMXhY1X43p0A2B6ggSNjRsHxNika7HbnhSY1OHIgmV3CP+GBA3to5r0/tCMylq7t2YWiujqQfew9Dt+SZakAeTheWkxHDwmiulc5aVTPp2fXcuGz2EvSH6EInYV3IWfpWnp87yNWeubAx2VpbPWsCA4trABPq/NsUlLJv5UlYWPyIbZT/wd5B40hoWosSbnP54accvSv2QiyS7UZrWrQ1V8S8haVYXWeE3Q4+8FPiQS4d8uPe/0UIHCHIp0xtaAra0dCsupYGOmWQvumNKOmigFEOPjAnsVymPqugdXthdEex5Jf2GrQvQxQ1FxJt44voCXezVxfMgg/o+Rxxf0+VudsNEpywJo9pXDOVAX+Kq7mba/fwMG6/XS3Yh6emTKWCkrtgV+7c9o5Q26+Y0mFryaC75kEvKgzlbJTCRtUf4HC1GyeOVuYY98ugsv1N2lO8hy64y0Jfqmb8IS9JoSr/iUbi6koskwCL5y/RH+LypnuT4SahbFsli0Bz08ocvwlHdJ8+ZTXXXkAMi+mwb1aZ7ztnIRu4rnwZUAG97yYAbEBaykZ3/HVxFKy9LJC/VVAq73a8YvTSAwfOQu0Fk8m90ZRsH70g5+2zCWJWcfZYuMBfiA0AUKEFajg3nrYuEMVNZ9coclL9WG2/XPOSx6D3hse8hlTR/BQS0R1w06C7jQW+OGBf0sdKF5MGy5eFKX140fxyOmv8NFuAzCes4lrsq244+B9FvzvNE7etIXuvjWH6R1r2Ev6JEX8VOeBkijc+99KrE3aTXsuAV+fqUKj1VTIx5dBOCaBE3q3QUnRdSzqDoDzOpU0YcJx2Gq2AK1X6tHroevopGgJ1T/cuOxqI5Ub+tFt+WEaHrzHJyMlaPJcN5b7tIKna2jganGAx12Z+Lv1Dks0joazqWcgbdx43iT4he7lluCiKGP2F+iC5C5h2PnmDZT4K+OzKjUI3tyOVY/u0eKk/Wh8Whz7aq+hsHAmVHwH2DSiAX4qHePRu/bxsm0FLFmzA58/X8WnRKPoj9At8gsch2/KJOBA2yPeOfobf3nXhR1NW/BxagwGdh0jH+N1+KZeDt6dKSfjeHPQkkSQa0hF2wkjQUzZEO3asuFSQwzIpRymf2+rMad7Kq1/Og50BjLox5Qv7OboAeVtXuzcNwVje/fjqy015C4bQMO1zeTTbQZqN8zI9+kBvDkoyusN28Fm3RcIERjLvCMXDIw+QMfwU1RImAFOkfrwdN8O7os5QiZ708HxczwFFcXxhhVtUH7rLCav/URK9QZwX8CTl8y6Su+nCKJr5xrSeapPjxJbWX35Iv4zSg6mnyzH9e3TYNfBAI6e9ZF3SU/jhxJKWDEzGdwznDghbilciHai9gpXeqY1Bhpf6WCi8SOQLtXg/fLZ4JP9Dpu/dsCjaxpo4lzMhXknKcV2HBxfZYWDOwxg7sfbEHNTkCakmtNYE3FcnDIPR3n4Y/iD/fRk2wRwClmK+j8ec8d5UxIRj8JrL+fAin/nuCDqF0/zmcep6qOp5akZtKWocxy8Au+eRP5RN0w+DqPQZlYlr1Ab5JuPEAL9CvFF5ig48FyU/l7fTr2+4Xw6J4oDjU5AeJwfCsh9R2ntr2DWuY3UNwtAf+ZZPJgxEvME1/OVm0FUWZGJvTv9aXj6Lhxnr0BNNc/x74A2nL2phbcvfgLh8zoQ87wCdbZ8QHIYx5eCp/Ha/CC2r+3Fgn5LWB6pxvfjc7kvZzLlCPhRjmgG611wgEN2lvhtyn0uCNHAcfLi8NhvCbx+Gk8SZ0/BWa/veGBjEwfqn+LUr7tR68wgpi84AYnNiqCX8h5Deo158yVdiNNrQWe5MlDcdhCfJP6C9c9i4WYDY9kvVTjhLo+Pcy/j2L4RWFzXSb/PJLNXXhMoPVbkb9XbeETcewxStgAPuRwKkEin6zsOoPay3fzlxW6UnTGGG6oy6M/NH7Rmrgx1XVKB2llH4YdJLi8TtKU/ozphTbAu/am2pznJ+3nw2WWs8lahsAB9yBvUYbNv+SA6cwumjxTkMU9e80ozd5q1VobKa1aRp0oWuIdMB1X/KniotYfktuhxoVke/BJ8xfJjXckw9Dm6xT6haKFidp44FQ471PGdjjYo0RAl+/pyNrvgCEqHrsLMMn+yMM0jW2FLChZUheUpVnytSBMb7mpReVkPrKhMw4iNJRAlvRa+LPQBC59N3CeiB4pSG1itLoeO7DsER3Td+PZxa7DKmEIfv53A6kd3qGvxSnI6rQaHJvnxUZlwLo8QhCUesXCqzRbPCLtwPzjC9VtxbD64iZf7z4Dar8Yc4HGFdroNg83RFdy9OQqLF3VzTNwKdlp/mRdFR2FUgAzEjfIE8egBXF1tCHlfDDh6vjWOqPpC1e2nsOmNMz/59gEMxEZDteoPSjQ3BtemGJTTnIYFsxHTXt4m+dSlHNw3DHoC+TTTQQ2iJtrhE09Fsv5+i6a5buP4beV4KnuAnva6kPiEs9D2fBObP1KBq1V/0dFNlvuKJ+OAjTB+PvuPv1z0gEVPzXBc8HQSmRGHj86KgFrZCY5LYP4xy5PVzunQQqcmeHFxmOfuC4Yz7+tpWDwN1y0zhv90vVFkw0nu2vYPxrzzxjclMzl1+k2UiU+k1cIqsPWxPIYLmUL5AlvUVg7DHpiBui8uo06tMj98NQiPb+TC85/17L7yDi6fogvhxla8xU6dvk1UAo8RtpQ2+h5907oDZuPloFXsIZqO8QI5/1GgNl+SddJP4ZU3D3ioqRZN94hAXedXdHmnhg05R+nnqHr4Y6QMwSWaqO0wHxf5uPHoyzpol+fHY5zG0LWpmTBgu5J2zbkOrxMFQGSEBWQ7OOBB6T407l9Lzd55uHvqHkwvTufySyH4dft8CL8mB/d0EzF3lD26rxREJSrnWZ7bSSekn8Om3qea4Q1Uv/kFWt2WB1OLAtTf3swXVeaxeMITEJQbzwkqQZiqbod/ku3h8ihpeC03AT66vcLM71+x7YwcSRR9pkdGelwjs4rfH8ogXC/GkfNkYUb2VLB3OomJT0Op/cc6yF+WQdus9lGd1Xn+t3w87z9wCgqUpvCFoWkw8sEK+NXaik5LemkwRwfcyheQYvRutl03nc/8NuHTD/1JQVoBpr6aRZvuJ7LeaGWsk/Klmx8YBCQX4vXyBHqduR4K3wvgOTFlmF7VzRI3D+OByBru3yoB54LluGusE6hpyuKDe0kUu6YJHkZagr+SE099N4WuNmXxWrNwEtCbhne7C6Fgqgmtp3fo+nQfvL6uCz1RIeQtYAzPtmTwmaSlfEVdmL4nTWDzbRUUY5BFLxZvx/9MpkDoR2+OWlnMG04K8rgnGfRj/ET+6VtEad0d3JTVhyuHF9Dtsglg1WDCVq62tEOimK+GtkOG93mcFZiIoWvsuVzOmBdPfwCz/rOArTmSbN/aRmGey+DoCRMY/asK9qUFcFWKAYd/sodlX0eRXcBYuDljPc98F4ej86Ix6GIhXWw+g9Kl7zk0dwLI2o/DkC4lWFArDndrTXlJniw0fpPgw4Vp9GrfdTzk4sQ3VHLA8bgIHU1NZOnp06CJXtAW5RbyTZuCr2/8ww8ZqlziYc5iC2eyTo0QwddMgHW6YBW0HhoXVIOO2iDHBD2jFts61twXQb6zFwHkvUNHcxEWHikAzen76MvyLeArNBL9F6nysdw63GAUhK2ie+j6jcV0zT0SAgMAxm2zgPa0SNaLnYTfv/vAuPsbeKqhEPXmfSVl+TY8q7YfUmcbgu/jCF5a0AGdGwdwbkkz6f+aCwVHG1C57hsJvH8KOb+1+KanEfyRWcvdCQV4w/cmap8uhHT5YBzfo4a+s1/B0aCPEDkxhXW8dOD+koNsuSqOJTznYfGq6bTiZQmCxk+sCNoBywfGcMjWJlj9XAamlWXQxr+BODyjkkOUw2Cjrw8XSQyQ0qrpZNEey28UH+PsCH2YfXgAboQNsrp3MslrF7JT03M+eT0aVys1QuRhaRgRch1i5wnAooNLQG2tKGaGPqSc9bfo9vY61g+u57dLitF3SjXOUrhEG3z0YNaz7dwp9hES2vbi1Zg2PNsmBNsPmrDMRXewcnbjzQIlcM9ODO7e6gIxy9t4sPU3XJufRHtM0njhgt34pvkH6jlOw+4lS3n+DlMQOhwB4x4gVK9UIcej/Xy3tQptTt6BRaofKWHVFJj79DdqyE6CDzqS/CVBkmnZRK40O0tjv9xE5wcH6MCeRXCyfhOb1wbRcOIkOHeznl2tBWHvCzmMs1vFL/7NZtsfQRjwuZ6UPbT5VooIBljqwtMOcyjw+8Fb/pTS7KI8npPRAFJ6a8F/bjVOqj8PUta3URiVwWHdGD7/5gJ8fjYe7rouZJ2AqzxeJgbErA+j6ONHIBZpz/tHi4GXhhBuGo4gEDqHNw6MpAF1f9qcLc9lr/5ylU02Pi9s51EpgmBSuZYsevbAt8qZEPe5Cw9ufYedL56z6d7fWDapEbziLsExVwH4It2FYl4eFCORxNcPToWRoa2guv8bPynsoC57VZpVZkd7fMdDsoUBHG3fDIGLREB5yQvOFdkKqwfj6K1wMWS3viWjm80g8lkEzBZfoaTkWKIP1yk7+QF/HRvPz6PPUUyGLxzZFkDVAYf4mtxo2GOxHQ/GJ/LXO46UsugGWYntpc/ShTi8bA6ct9ImG/+JUO4gCBXf7Djjzzrc+GonL18SDaGuklzeJEsSd5LJRyoO3zuWo9d2gsTNS3DiKWtY4PyLPgy1slRWJ14yS8e42AWMgl/h88XX3GAlBBYthSSTpMPvTbQpYN1leOhhAqfDk3Fiegel1hJv1Ejn+LE6cLxpAaHpXLR9NprlV8RRSvU4iIoa4izp03y2Q5Pufd1GLROF4Lm1CRxULeR3Ww6A1Iz3kH68EE37S6EycgyW7pJlIVtdbG0bBcYrO9DmyFJ4kKuLvs2r4T/3em5fOBXn1ntAX3Y47uydRlM9J8KbdQW4eOYLnOJcBUpnJ9D7/WYg/XkfWckcReHFf6laYhMtEJkK1gY5vDJ7DIUrXaEn7QngVD+Tas2vUpJ3CPqvjSdX9ULYed4Sdgiegrn6l+Fz4xu6vnkl1j7fzn2Ck1nnvh89/OAETms0IGivPgxmz+YFL86D4CdBlO18CCHFG6l3ST69/B0Pui8taVfnUojsA1g1Nxri9S6S1dz3nH3iPi7+t5mWZfyHgXMyqfrgAboadA1CoyXg1GsnUpuXT+ZjPkNDUgw2RkfxBDJlG5FD7HE0lkOTWmn0ZGGwMi5COcdaUlsWRiJwkQUXHWHV6HCCUecgKHgNyotOBrcWJfj7O491CjxZpu423DP1g26XCXg+K5RX/ncUHezCUFdJj0T/mIH/qduwFSzhYoAKPG1qYoEdkrDnSjWM1syEXeqnwdU5Afb90INYnyt0oGY5Kie/g9WtCtAxI55kSQrOKI6kng8/aWleBXo2j4LytKNgOS6b35b6o4KeDRhpfae44H54NmgN9efy2aunnZJPG0Kc8Ea+PniGFW8ZY278THx92Q4PrO+n7c6+ZPV4LIYKzIbM+QxRN4Rop0EMRuQdpogNLfzi3kRMnHmXLcJE8ITKHpw4QwneZVuAWakePh+8Tbvn6ZP2iEH8fjoEZm2/Sza/T8Os8B1oProUjROFwTqpBUHRBy3+PeMep1SIDh8J44NPY1uaPO+QG4cBadMAOvUgLL+Gj2zeAj+y1vF5GgeaWVlYXeKJhWlWtGTVNXrE1bj6phw47YyipAk36LZDCYyek4exsZfRo20RjWjT5TT9BySnK8JTNLRgu5Q0XtO+xzUZn1jV9T/4Pk+a4KkGagzNp7lK1jxCWY5VTKUgIKURGvam0z1dEb524iBYcjvMEyyExRmh6BK2hl3uKrBJgzF4er+FW7H7aVnPYjRavIj228jTznl7wdxwFNjU2vAXxw+8/bEAvJv5nB+WOJLByOcUZqgFkzsL4IC1DG4JuwvTphfRWJlKWDJDEHIjcrhHvxDd1CRg9NRMPKUUhxW3q/hy80kKeVUKhUEWNGm9GOjmXsNgx32QLVgKRyQu8NPJx+C2QQWeu+bEOUmfQFTOC6Wum8Eh11yuDlhHQjkPQNflAtmuzSBp3T70tFiIffuycPkKLdorKwqF60Kgad548IskLHG24K1xPrB8xHr4fTmOSI/wQWwL7ElXhhu9jlzvxFw8PYFztqiReSbBWIEP6PDnAyvk7gAX8xQIzZOBnge/uGP1FEp9dAcbt4riSTVpMkrop263W2Ata0rePefQOns8ZGibc35WLk+uRjrQ8x7ybeqh7vZrXrniJPQomGGGqQP4vQfQWF+Hk0Ysh5EHFVFqZzP1q4exzJ638OnIQp7U0kphDc+hTl8Z5Kp34skLo8C5Qgp+2t4gk0WLqWjHLr6UaYPfFq6AccvuYkW/MlQ1yqL78Fs2mXSZDy/LQJ3zv7jbJJ0yc/spK0kO9z/6xvo/deHlw0Danf8W56S95WzPCxAb4MMOpp20s/8+Lcv9hMsL7/PShrGgk74G4/TOU6Z/Jd+TeYTT35ZjU00UXW2oJ+96H+xYp027Z04HzUflcH5lAo3ddhx85JrZY0waxP5s587FcXhD7TuuCzrEEDwDLBS9Yd6QOoJkGEimvuHJwubgb/yPK8eL8JfvmmRk9A7n3BaHRTLDNIUWwtWItfCl5wOXbT7Dgpsf8zTd+7j17VzQ/2mF85LUQNHrDkvIO4L6CX0QzT+CW559BInQhzhlRz9rik/lSQlLoN3OCI6OM8MR032xArXRYm4c3PeWwvQkOSpUKUY9TR+uq/SHtZ+0wNypFiM9pPHormP4S0+Z//XXobi6PthsDefxN9L52/5bYOMmCSVa8vRwtQd9mpdA8eYerFq8B7pCJuDUQzGoqvWPD3dIU0W3HOwNzIeho1n0qFaMHut+oof5qzlr2VE84BCOjT/s4fqeLpw9URg0/m7hbRFLIMLYCl0uK+CZXVF0+ukQGtbbYkTAR3pjO5/NL5hBg2YXbd43Fgql79AUysTh9fZgWvyAtuW+Y5/0M1QQaEM3nujD3fjNNDhnDZ7LXwVxO6/SzDlGON7sJx7q3UALG5tg8OkSWKg9DfJu18LtRCO8FhtPv34Ww4q91RxRWETK+7/wtOQT7OJ/HJ7nKEOCWy67NgdDqqc2XHrbAV4R6aDnKY/3J06Ed3cD6PlUQzq/UwCMpvZChrIKH05rornnAjjiVwraaZymut6zuEXrMst91IGxLgTmq37T6oG7oNZZgjnfJ/G+Y0fZbawU1BgeoJVjszCsPAtmT5YDVxUPuFBpBK22Y8Aw1p3eTfDCuRYrIL/QgMZ5tvL8gr0QPlkbKuV2QBWnQ8WJSBg2isHKqkxyKFdj+fkqNPP8XQi+/xZiq0bBzXYfch4ZixtfNPKSkFfws/IpSk5vppALj3Df+mps+vWNZ3xTg+DnorB/oiu9Mj9I25PF0HfwD7R8F4Pmgo2k12sGWkZB+M97HFy+aUWPbZzwSKkXRUeNRcWQFHDxaQHjRlHAokHcbZdFn3V1wLprIci2pNP44WbOODySZVO+Q/uIOVCmewfc4qOR2hZiaJEsdMWks/zpJJJ4fJuMG9r5xobPYCb5kYqbx0DpyWxa+aqJtwSPhF0nPUla3gyFX/vj2eXfcfOJzbD2txg/7vxHI+LTuaxGG/RsxcDcMoKaVS7QvvNJpK0yC1f+WYAlmqFcf92L7ZQL4UBcGqRs1QLTjd9A+lcrlfl547xHvjTw1xorvsRT2YomLJyuBytuzwQF8xGgmW/KtdfvQY+uGa0O3AfyrkIg8NgT/RzV+XcL0cSITGwqMISyCyqY0VYHn/EfZvlpkoB3OhS/dec1qp95o2cVRFn04c5WYdiy8RKW4hWW0HUhzzfq8L7HFA5zA5kIWfDnAS3oD87kfYcNYLT1G3K3DoeQySK4vbwUz4/Spo3r2iko9Dffau7gqXfcwebPeLjlpobjUwtYcOoZOPTqM5e/UGax4h/gKleIYi/1+GnqCbYOUIBFLzP4q1sQREyai8NjH/OZTwJwximWb6bGkb/9Sk5xDOVvlQQnCs+zVMQgqtl00mhFUdZYEcXtT07y2YfC2LDlBXU8aID6iYawpjsV8/4GgWqtASQt3o7L5nVAUGgyKu52wjVljXjoghgXJk6AQ7OHyHb+Wt6SnYKFMk68Kl8cpWdW48c1NpT4+B8mrzqJXC4A7slOcOhOJzeujYE98U7wptGW93XOg1t2d7j07UmcpC2Dckeng9mTd+ik+5km9ExCu05duvQnFh2giS8FPIQvoI2q7TYEqSKw6Ig1WeAlEBl5i68IvsV0CXO8v0US3sruo47Juph4MwuHTmnBvZ5DPKTfiNfz34LTjIOgluWGd6ZtxXKrIFTI94Iffw1wnbMU1JTK0plkc7DPXkI7jwvjj1eNpGe3GR6HVYPrUClqpb3hQy5y0H3ClPzHzKJTyxbRaOcWcLBPpidzd0O19EqO7Qe60l0BZvOMIKKmBay+XgHRvosg0p6L27fO4uFOa9ju24IBp/xw9YlfvNCAIUBKmf4sD4RDT92hdMVtzpqzgWceS4P9faH8Q+40jZX6yzVfAb7ln+Kbqx9yp7IYT3t4nfr6EtEnWIYu+x/C6/ktODbMkvcNWkC3twtpvFyLq4eXoyX/4lG0ELQyT4DH6igY9VuPclbW4I2KyfApQgZ0XcbxoxdJ5PZxJOqNMYbGcUKUttISQpQXwcLX+WhzwwgC7AUxfu0PbJqWhukhi0FswxsW8r9Ms0u3wMPPn8k39AL8uSgKq+KdUfXcWbwSsw9KAtRo1OKVbBwxyD+f3UGDp4qUdK6R5u/TBce429C0oZXeL/oKOjljKefkIVqZOhfWuIqA7EMrfjg0CDMOSUDAfjlYqVGH5+8uxME5FbBmLUKTkzKp3Fdlr9Ya6Dh0BSUNACDQH02SDsGhEZWIJ9tpqUgiB5YO44nubloaMAhd86Jw0iaCetdwDC3ZCmULptHMuvdYPjqHTYxt0HnNOc4o1oTkk/9RcvgkuH4kAy+d74REPX2Or7ajHxl53DI/FuSXHEXNZ6/BCLJ4IGQGiFSWQclSP/ALXcVlgrls+EQHZjh34OKpMmQod5RCfVbQg39T4ETaeTrSkYv9JS5c0byF9Hk7zH19kAKFiew7c+hcRjELrxGFRTaSUGUZTc1Xb4LUd8JzQX5ocToKtjqpYCYHY4xMHry/PQqKNxaCe2067teKwimLP7F4vC5srt1O48xr2J83UGLSCzZ+LwtHdm2nN6Lz8IeCMgt+OA9ZFRp8cdI+7pi6kUz3GbL6b2uMOCkIq/wmkPIUMzaBfdyfGQURJU1ccN+Vpcp08M78eGg4FI9rHsuC2rh+CDbfjTXtM1hX7gAa39kFaj7yuPVEJP98qYkTfV+zrJMI1NytgfEWu/FLxFUWPBwDSoq5sGFyDup0T6fW/a+wg97i7zEjYHGnE/3MjMdXJybyjNkD/PNBBWu+ecgOJ9ejWeoPnFZrwvuXGkPU8XiWvh/GfbdvclrHL+rd7YC13X083XwDhK07wSfH3iAfX1l4sCsNVr1qRPnIOTzUFkFHru/Dd5Mr0WJgKc6eNpbGZqdi7m6ECz73eBiVKW78Fpp+ZDnstDxJ8eNjWPp+Ar1+5gFNNZGs62cIy5VdoGXKR7CR8sG3a1N5wpw5fKAiBz7+08T748uw6Zw9hnmagPYDXfg2PgTvLLGk9eqy6C0UBN9yWtD3jgUs2PmK+vkJJjqrQ/ZfAXa908JJc0PYoeIY/B1jANZua/mOTwVcS6+moNw/IO0nAds+aHLK1Av08+0EeOVdTPOGg6DZ+gt6L11PBqcFYNyxeZznKAWd7j4wJHaARu2ZwlPHt4J2zAMImdxJzr3VMGX6Gpx134AeyAmD4xQlqBfrY6+hUti6O4XTfnVyyPdPIPlRCNwtXGjfhrtgYKcPTSvT0aPqAVVnqMBpRwW8/i+cvHNdcOGsETir4zXurd8A6vc1QFbQBr003CB+XhAYm8WTvNRf2uS+gx/c6qJny92ofewtHHtZG240VfKBLwO0vqOfj/lpQtWbdohOyMNZmq+wWGw82F3yZVNBBdj324seaaZww7Y0vOF4DH0kKyDmmTvl5YuT1mkfrMisw4XF8pDzwJ1EFmVzlOATkD12i3/bMh6c+AjTpctxztkg8pz6GW+PGwkz0o2g6LQljVKdTNvd7kHaxlgSKCrjL3el4d+Wl+AYJYBC10aDRmcQCh0QgrqN63HgDPJ7tS8k4+7LwQWGPOpgOknUhPOfC3rw5mgN/T5RzI8/76Ub6qK4ry2YbleHUpZ7DDiPnkU7T5+hBeIzwDRVA7fkd/Ha47v4/aVLfOpcKc1fbcufl11Ci+Rl1HnhDidqaUN7exL2ejzm0WmHYe/XaJyusRvtcmw441UK517NIu1bI9AmTgFKXBLAWDWY5Z43cfo8b+gdXsDrbE+jx85Bvtz6jtffTMSrFmNg1o5CSMtXh5qotRxccgwkoh0h850MTXywCSfmxVLlzrWspqQIVVZ2uFdUnNsXNGFjVRKsziwhEYNzoGA2xOV4Hz3UA6BbSAkCnJNg5omLLGdoCp9/JsKYJZt5ntlV/N6aQCt6Ddhl2yZe+NEQ9CoDoKrICWJMPejhrEss7DmV6sxXU8jAId7bn04N529CyrFxsD/rLJ3YYgwxCzfw9rxe+O/PDs5Ps+Dx0QOkMcoRHdqPcGKqEJy9OkArR+aC/rEudrxyA+8NiPGyIXeaexXYdL0PbJk5l5XspeDymzucO+wJbTO3kIWHK8VEOdHHpH/U3HudZlU7Y0JWJRj904Kzdlcw/k81Pqrzot117nS99jsNTW7DZZscaPPKkXCk5T415wmB7IcGtL0hhctVs+C7jwnLmM/Cykw/DhEQBcWuJDbNCKCUveNg/MBJ2mU4mlu7toFtlxuXZbbhTdlDKKC+lSLEo/GcQSDa/icHE4zeQoG1Ips0bsVQ8zek9C4EMvP1OGl+KWq4OpF+uTsErtKFy+6akPPbjxbGJNNC+Vwokv7Hc4Wuoqx2E/TWWJBClzwuDx4Fp53UUSx5FPoKLcKDVr3Ql5jPPa/beLZDF9mPe4E/VfPYwlcR3pcHo/Y/IVat2QlGP214QFIdsmg+q1p705RxaWTqvxmUHcyg5GcZTVlhhwtPP6RzJe3gbfqe8xZGwFGbr/jq0HXqrFaBKvFpMC5OlMEyg/aOX4XPvg/ALKNeeCTljsNajtRiG0ICZU30fPZIKPt2GZ0K5sOt5BiyCAvnfy5VJO5rQcvEFdDdoAX6U3bDmCwL8J2whxZPNscnl1LJ6GgVHfI+jaY+20Fp7lhsnNgGi+QO07gDQjD4Up7nLS3lDvsHnKxjiacOf2SZtCd0Iy0RbPIjodm8ltb06oLtEW2ak7oPNISy6Rau4fb8WaDXupWiffbi7SkD/Oe4N0QqSsJIQTm8fbGGk54O8ektrnyuVwVsxy1jyVoPXmftRC1eD9DW3gg2f4+AxdKd/F3nAPropUDfmwWgUXEUStf8xl6ZY9AeGgDFD+TBdMtk2th2lAMMA+BQ0GLY8fA0mvZZcZ+WB1kfngWuHQ64om0y3J+xDgpbgsG2tZIKjbdQU8gGdm+r56v/7rJ/whj42PCbJ1SPAZ02E5D2tOPwL3409eUk7hpYjNdmKrKsmQVFykzlwsw1JJSlDgn5z2hhqg65CD+nm7++0pXnjzHodjxKPP4KUamemBS7i4uGtMA6wweeBB+kyYHG0HpdnwYS1+Fw91bUrx7Lx3Z7w3/KCnxeTRKSPlrBAtEuGDr5l6KK1Un0izSLPLwAvTJeiCan4O3fJJhxF6BOwJgfjkvhnXnGVL7BlP6YKGNyjgLERHylZQfmg8/+MNIPEYLftrHoiEnYJ96Gz3gULvNtQa2fe7jYrB7e6JniMecGVKklCDYYghkjolh8zE5IExQm6WhRqmy7yb8+pWDBxjb4pL4JAt+qgEG7OzktCMUM32GYdH4E5cb0cOqrIJ5huIReyx/mZ2AE2zIMYLK8HzV3zOElA27YNX4yHgjwhMvnl9NC/QUg/jEVUxxOgeSCibCiqp2ejvrE9R5IZZuH4dxIR77uJ4T9H6bi+FJNzM8EDB4YA9t+eFO0RCBsWjcd7upuII1JdjzJcjUVR++n+bt+o+bND6A91RDE1hfQ/qY4qhohTUvDWnHfn894M8IURz/6x8/cMmnp6b1YcEgHkgIroTf9AN5618NesedgV0szSlqP5azt12C1ejm6LlGFHdHGkLfjKnp0NdFQVgquqg4D+2ct+DFjG7gs8aATV/rZ/540SOydBG3OCyB4tAZWno7h3xk6tFzSl8ymH4JIuUweHy6ORe5zQbUMIGviFxZKmoX2w9tw7unVnNH0ldxHFqLW8WeUudmdINyGbylOA3GPSwgZkXj560Z8+ncWt8V/JPEASXy0mzn26jVcPVkAtYNF4e9OIwiZNJuzxkUCP61nLdHvfKaugNMlImDqLStcrq6N3eOU4G3efTbOR2zwSGeh2AjOV8rBEa2f6evfCbymP54+mx/k7bISUD69Ay54XkCrByGoWOAMh8dY0pXhBl4/Yil1R3jBlu9XeHDnDDjnV4X+/gI4vLmUq+LHwp3AdVwINmwZFw2R09tY+xOh/U5pGCiyonjXt/yq8Dnv8qnChy9e8RiDZTx1zx50vTMN/iW78/d5SnC9PpJ9HlnAvnkEu2uzqUqzAopkjeHSlSn85cUEEhbRZ+/E0XChzoBu12lTh7MyLZYOJD0jOfzv1D56mi/Jt7Vng6mfI+scUQeR+19xL7wgl/wqzFp7k3NevCYDlb1c81uOUy7W4eSPvyktRQdGjM7kGxstSSNlASYoqMHv9Y64ctVl+mu4GLIvL+XkuWm400YL9j7LwZef/tF9KxGy3+UNg/s1Qar0Gm1a5oLfFY3JwTGM70dPgfmBV3m39zxUODaLdtfJYHOaLAe9eUOHU3To8D4lehOzmNIbVWFkTCMUNjdQWqY6l/lXoYTiVfh0Zzf99QzA96+O46qgLhpqVYIVdlNxwcw6XOahDjdaU3lNyw36IqxNW5228dX0ZA4SiOXAh6rguqiBb70Sh42ih7Ewfi2NMAqkW9tvYd/u5agy4iyWX+jle0uV4aB0D+e+EGPDx3pU6LIcI2LH8/h2eRSLSSNdXWfWFTgD+nNGwsdbRSQ5QOjQWwB+9Us4/kYGnpe6yrNfl0Dc2Tj89d9yjOgwgQFrD9S5WEUKN56SpMZVXqESh1v8gVYMGvHPExnoPrGM0UYJpts9Z5OBGJwfvovqvdTw88uLLO5eAFXXZSD8hjw0++vxxOUMiy5b4xzDdF4scISqxffg37gYdApeQ/42E/GJ+14adNFFv79mID0lgWzrz1F7x0SUqLrJVxbKsWCxO5uKDMKbr2/J1OsIfLMxhFfYD/q7fdFX8Q4f/HgPw4O3QeC3PtocLsY63xNhhmUmPXxsDE/sB8hGuoQS30fReslv9Mv3C0fK5PCqsOk0e2IpCQc489YfJnDuryhEr3tD5pfqQGChG5REzSJpTW+umX8UHsSaQq2PPS7KnAI/1t/k2sSLPDXUE9+fVmCziP3QmJvE9fMqaFemLQ1PO4IVp2fCRskv/LNXgjMVHHChuzk7R2lCi3QMHD9oh09CL5Pa76V8wEsMCjUIgxRT6KrdOq558JB/luTxgPZh/vncCZOu2WODnChfENGGNU+3cukGOciv7aKZo2pwz8Vwbr0UAyd0lqJadiqHmO2ncuOJsO/dHz4TlwGL2+ew4Wdharyowx0V72iv/B2ImXGZcjJ14dOzMfD8oC7vCjfkyBG5uDa5HNece0n1TbthyTs5mvW5iA9f+w7y21Xgn/pl7lsUSVd/IHn8JtR58QLQqwGtNxmBh9MAvzpnB22O0pDpcphmugzCR7ticrs/kQRWBHFKYjx+upQL8cFrcEW1C6kcsoDSS6awS+0zFK2YiC2xRyHBejLWpjuyr9pbXLwxgdXNy1n7vAysPyLJYYUv8WL0B1RwPcEr/ttNblLradW2dKheuJF0DW+S/Q9VOG9tQyEXM1H6ugN8SJ9PQqFnqOnbUbKeqkINHzyprC8Ca0zGwMV9MhSV70s7vrxEW39TEB85h582HkQxlfmc0HsVt464RAtztGBUowwdb1zMGbfFQXGpNd0pK+KywAyUmHOZuqKXsYbcBBB1mARG4eHQr10HEuNBYIaTOH9Y1gqthW0wsvM/rr0XDaEX/tKnhOlwK7Acr1Yqg5R5DDg9XEXP7O5BbO5C0FcWp8yzNXDLWYI3LGDwWysB1qGW7DJUy0mVs8H23hP+GLwfotSM+O7SBggevEIiO8fBurPv4JTCCJyZ9Yi/H77ACRZNmBNdCntmpHLJHBfSyl3BRZJG0PPrH2mv0IOvhseJ4lewolsbzswoppJ50/i9+y62XDMEsj81oU7fiWZ0rqW2sBCosv8PKhK6sWWlL1nXFmN3fyR+qragMEcTOHykmha/Eceun/F06cgQxEYG4oHg6xgZeBHMm7eDSqMztDaqgubAM7LRsMYDXS446ulzLg17QFO6L8BxGSU6kBTHxtd6eFuWENzpOcVLBl2Ih1JIbWogpgi5kuuLIK79cwAu6QaxnVQofoyzAKl15ST4SIS8jp2jqvR7JL/fH+dpPgWLb8Iw0r6f224XsvtFCXjbvINGOgsiB7yB1lYjuOtcRz4nK3FVpBsnr1PlEeEyeMxCCuwWTqG4udaw3jCMqlR12NRSg98XlqClYiIcn9PBCXeH8EKKAqQtVaDD5qO55/FNcO0/BXK/E8Cy9zuff+pGenN/UmSTPbruVgCj/JU07YU+dVrLkpPeQlwdkoXntaTQfKk4Lq+7ThVhh/DlXj1oj+iDptoAqvtxAuYbFkCy8HZe+fIHXNaMxFyXXahns4cOnjOEe7blJLf6MJV3ysHEU6952og+WrQmAoo2XqORF4b5lKMra2epg0mgG8/8+pvsFL3QSW0Y7vfPhKxpsbCjQoGXT1flU6JH0FHEEsbqJZKr11n4EbCVm0yUqHHHc7obdAA2Zywmf6OjJDJ3Hnk5acCui8/4isAJiphvwoWzF9DJs17k5XSMp8+rI/89n0Dx3mI4pGYM213mgl/4Bx7t+I6e6nfCh7Gb4GSZABielOY7Amv4x4FPpOg6AVpdA6izLg1eC/mQr0MDLry2hPu2+UG8SwF8sm1mwVV+pKutA1tjekhuhCYcq/3NMZWV5PSvHJx3bOH81GAqaN9NV43e4ddSIUgr+gJ6W/bw7mffqefpPS6wHmYV/XaKsf4P11tl86iH17lIwxgOSd2DjtyzJHHeh/9bakDfV5bxf/bL4U7ARF69egyumL0MXxYqQsuS+6DwbJCPj9wGK0Z+xjHpdaxXXwhqGvdwZsVL0NDYTlWnpSAwdwgar1/HGPWDrCrggCODXrHzPFcm1eW8WOQbrXqli9nespA3UZEd2iZib6cjZQTexjPLTvN+lIQYuysg/k4DLysALRefArft4vlSeBgd85RD9wJLGHu7CDfMsWKVAD14YpQH7l8OQKe0CCgbbYSnexLQsXg5NORfBqeHNZSud51+fJKjrvGKWHc1l4V81MD74RienK0KD2R+4qrp5qTwaiP8yujH7q3GXOpzDee96sOo86pwN3UJZO9Whb252SA9ZRdoJcbAarundDRcg5WmXGK35Jv0dcJMeGSynhed1ATz+bJUUpLCo/4agV3wJ85VeMWbEo9y10RtLL5uDL/rTXHSsD0eDWrA9NBMyPg5E9x2e8H483dhxdmvdFNKnGirNMR8PEwXVy1mO+HPcEb6It494AHTX5aCuWQ0tOxZB2vWTwT+NBraeQI6VDVhf18rwwsZeCtdxEorLlC5xBxOuXWWh/yn4uAlFZibacSsFMlfPyZyXbgPtJs6cWjEQ/Cd/B865u+CaQ2B/O2GEew8bwzl12ZxbJoGLdaSxZflATA7Zx0OFzSw5VAdGYtGs0u/Evg/a0Fz60J68qQMl3Vvwy+vD9LqlHrOMnsNKu0X4fXREF49bRp0GK1jx6cnaWpoItzuFYE08WpovDiEE1uIdxhcZT/NURw8PBUeqnqTQVMk1hmV0JWmQgr7ZAjNelXgJ/WJvFQ7+ZtfI/ZYG8AFPz1+3L0Rb263RKOLoXjTRJJF1i8Cr4tjsSxkFI7+spHVu8fC85V7uUrZmubJCOK92iwskZeAJ/JBAL4leER/O0i6aZOjuDxEzhKljc1NpH+1EHIglQ6LTsB13dK8YVEKSsfVY9qOI7BEUwtWnoyAtZLv+WWeDh+MDIQp+9bC3dzNeOdDIlzs7Sbbkfqgo20E0pYTENcmw743Fnj00g7W8okE3S2eXBkihK1OcSxzYTtcGDEKdtvKk/v2JTxb5Ri7KwTDstnVPCFdEfZlynGj0Qqqf3sE+nqMoafMg+cVi+GXagFae/Qs/PdoJsc/a8HF/TX8+OovnqIeRrqmItDVuoev613BaglvvrpLkc6N64OgMfJ8xmIFWHX/Zbvifo6bIg+LG49TbFAfFi8NBd9da+m8ux/fvaDFF8o64fer3ThGdBxYf5YGLycz6D1UhhHzkrH8uzxcLtgOC0RWwYR5+WibvxI9PhwhqVcEaVVjcM/DSew1wQzLP7dgfU0s9D2MoJzYbey4qhveeWhSyH8WMPfoB/rj7YOy4rH0dUgHPiw6iPfvJuFkqQockvgA5XiN5nWawoevevitchx3WHlh5aIZ5L1mGa8Zp8s26g4cVqWETU77KTtfGwyjQun3AznavyeTVHM8yWfCHXZVHwcqLydA0JgCLHm7H42ejIDyIE8yP3QOGhKuUGbqPX4/xYSWvXCF80/76fBCe8z7ZMVzlyjB6MMfMVH/IRz066Tfo5XwnHsil2qW0d0UewymTHKpr0YxIXnYK34fO3+LYPrG+eT2VpRN7rnCktFCcCryJYRZZVJO12gGZWE4L9JLgzFa3D1tKxQZtvOzsA7a0nGStE5bQbCsJwp4Z0KKKELpf4/g1OYruGFOLp4xv0WVr/NRp2ERL3sZytJKNRBQkol390nAvJlqdHbdIThy4SvbGouRXmoPys24CqduvGLNB/nkldSKZ9ZpgSu9hLPPjlK5xUGuv7OR4J8C1TjpQzWXkrptFP9YGEhHEiQgVv4F9PynwYvOCMPdZcq8jsqp/aAS/7ANhN0NnryhXxAW+liAdctu9LOMh0UDbbzqLLGYYgIVZa3nGIU1oCcxGhskPSBwgzFsT++nopJ2/ie2Hgzkl/JJw2V841Quhk47gQazJPiU0S70fSgAvV3N6BStA5rbVmGhVjb+3d7M+renQ0eRLses/sSWnxr4m5UQ9CesBrv+E/z4VA91JC7F7oGjVJZXA2unDtG2+jIKbAuHmpxJMLb0JCaZHoZmOWfQ+fYVDTU+8qcLQ1g4Kphmnr0BEYmv8Ha5BryuKSCLIkFWM1xPI+atQOv3wWj+KwF/VutydNcgiyp54oR4Mfgk0USFz3Vx6/MhcIFQfr9fkb4Hr8P5Ds6wJiSMPwSaUnSoJrTcsuZx81X56uj56HVDEn8G1uAO2Qjq9aqFUilTuvGiFi4XEIQXZsP6zw+48949mi/ZDmEnK+HE9xnUKulGfTuqqDTqLGmoWsDopBFMS6eB6Dgzih5zB7UmR1HJnXoeljGA71usaU7QEEus0wOj/4m7D4UQFDUAwP9IO6M9aKc0VJqKUkhEoYSMlCKjpGwRaYgGOjIzKlREhCQrlXZGKqIhigoVqYi6j3Gf5BNU4lWJ8+iI/Qz+u/8TGHe5UMFzcQq1dIHmBmf4dOQGe7w0hblOCJPlQjlEzRav99whcxstnPOfEbgJneN4Yy36c+Qvum8QhQBRH1rqLMNbPudhXFIqGG6SQul/6hyWc5zebHmKs4oPsOJ8c7CqL4O+pM80kD+TPhyN5DOdKjR9CUFp2WHqvmiJDvop+EHOAFJURNlGMAK6zh/l7wWubFecgBUOlmxqMpHHO94nyxN6OO6kNFTFx/OC6e9B68J4Cpm0BlQmCdMRxYX0wfcNbhGMhKLVOaCspw05jdLc/UYNXQLbSAEv4rmWAm599IrUz9jgxpzH0LDChhP9x8EmbUMqrXvKmiesaLdiH5cN9GP7plOQoukAyoHHUe7GZZr1XQ9SDTdg/tZsWLt3B3WM/gIL7SXhsuR9jH3wjiU3V4JQeA6df6gOK38cgHKDXIj5lsd+aUZ4oAdgttBxmJ6zGSy2TiWpl6IkUzUGZEpeo4dNFvv2zsbmU+ocH/cZj208xhUpOmyWVMALtYNYa8RU2C5vSTVrVUm+Jh6uxAC2F+bAnam2yH0j4B2H0aD2Uo7M1oJj+udhUclsrntWTW7q8fjlWgL5X19K36c5g3rnXih5JI1fT1lC329HLHkSjAJTCqg9qRgu/F5F90+1Qpj+cr57uAqTH9fwizQd0Dt4iXOXb6Lq1SXcISkAVtFuOIuLUWlfCdcLD4Cm0Sw8rSMEQWKivOjqclB3XUh768MhVHYWS68Kgcov0thgOx229a/g+TOFwW92FKdd0IDWh7YYd1kZ/ENCqcxUAQ+PisP0Bb9ZJnIMzZ9jDmLPPXCltCa4a6/nLZu+ccOwK4gnr6dZ9S8odedbOFM3E94KKUKZ3i66FbgYbnhVwModFvR2XAI42+mR2bI8+nWpB1TiM2DXBm04eCAHPKXswGTiLUr6s4xGFV3l1Yoh9OHkOJp2OoOj+jayTd8YaMw1B6dXZbh2+XyMiTsHrnqnYbt3EP1TrOGIohAuPRhC5ndtQQaWwQl5Y/x88h7ZFjiBnflt/H26hVPBh/rtpFilQIRLDyuB6J2p8HdDHX+raCYl33h8LejG3klNHPPwFNwfeAp2uX2Q22wIpjJZPGd1Oq8tCoB1UrfRZngrSUzr4c/6k+Doj0Xw1GoGjF9iA/aD49nHXw/00iJ55NxGEFprTfOejufVxuXgKTyGTgRfp6VLCG4Yx4L1oqdcWHMM9bfIQb+DOBgcfoxHOl7h+lo/qpabDzq1snDoWCm9fmAPL53n8eclKvghS5PzBi7DvBsB+DA4DFXyjPiNvBkkOC+F2VnHIXzoA07e/BngcBRFatmT5kYG/bxAvOmeDyMKxGG9RBb7RbTTvyXJsDbKjTYumovv7TXp0GJxsJF8DL9fT4N1TRJwoncGGMjoUOOv6/jIsJVShm/wujFIGkPuFLYmAI1eWqPb85Eg9yqQnh/8jE1HLwJ2irOWeAH3x03n0GuvcUZCDJ1tMYCTkdawMDMAz/2to9trzsDU13rkMWwDdpeD4PjqSSh86iW24gauEBWGh5q6+FbAHk4Fz8Lwgyr4zbGdVqxgkMmTQi7wgJbwCzCtUw7uONZCwrtK/KveBtVZHZR9eAw5bZ4J9yLGUcWLQDRZX4rD1y1BxSSOBd/nwg67U8iuBrzdzo2K98XgDitn7v7Xg4uTQzg0H2DVKkKB+qP4tN6OBy96UvV9cxCOCcXFGofZfbcDFG1og5z3k+H45bVovGUU3n9xnk6phuC2IQkulVGDuuDVPKOxiQI2eGJwhAgE/HyE6/Zq8K1EL5w8vIRaTEeQ2WyigHv9tHDuH+zX2AEbC0aDmksZrlveAPqnbEl18mvu8TWFh9UevP65E9co7sZ5vpMouXYsnA3QheshXzBh8Vi+/bANRBelQcuEjcxl+mCVGsSTevVAoF8JvH2c6HXhbFqc/IaCdXrg5e0MdHERhunnd1DtkAomCLygVd4AWqPm4fGwcHb1Hc2jfrWQkaQERa1Mpqaxo3HP5/N8a3Qs1m4RAhOzrXzm9lfa4xNAy+ye0rzHgWy35Q6/2+CHoW2JaFZxjNWaLaH8405+oaqKy3T3UZq2JNkZbsRJx+/gtlEDkLvMC5YuXc1vU8fDhLZojHw4Elr0TrCqxQz4tHMQSsPEcdNIGdQcNRtCXbXZ8Lw0nJUZprIli/lTfggKnN1M0xQ+w82kYlxy9Rw6XPbHoWmtODddBUorTmOhxBZY7OXBBme2wn8rcihhjCc/9XGn8aOSsbKCYPMoRWg3j8UvJyTR80gw59hPQ4midby5aRt3H4nF1xMb+JK7CB1P0oa3Pda4qDcKHK37MbG0GRVPttEPiRqSeH8WwHM0mnyYCuWChuBpVcejBndxy/3VdHhGKa7Olubo7lc0SWE+VnS40MHo4yyZLwbic59g27NlpOfiB5N7xmD3bid6EfsHFr3VwUVu1/nXvji+0qAN2u5f8cuaT/RTN5c8Wl6CuJcWGj8zpLBfKRy2chlXTdRHGVstiO/q51e7MqlVQBiui5WzabYZZmvMoMejN3GQQT9Hd6xnS3GCUU4bIHvkAaqavh3DQkvgnN80mjs/hxZ5F7NhTxMsOj5EmWf1IeJvD9gpXyax2A7oK3yBQbNCad35U7TB0h0CV++EtHluGN5rAf5pxlw9RwebcgZw3aSnMPuzCCYZHmSlTmVa/0WFy598okvWirA5Sg+du42po6sFblR4wO10M3KdOAeGnfPwXGAljsjQ4SEFBKn99/CJkBCbHfPm8V8jYaZ3JDQt8iTV85c4bmMLLE0NZdGTuhDZ3w6f/T0oo80SXl4uwburTEDSSBLlFRzY7YU59NT08OomUdDT+sEHRfLA98R0aN7XwcOPMuFx2QYQ3OiPrhEtpP+1BLfUM7wxliafeeW8260JRCbV4bfFLTT5kRRb+j5iybt90CbkwBq/xGFEWCroHOnn3bmpaDPrFtZu9qAtO75Dvst8HCd1lwQF+8HdfyKk36imRUumwLOADNKvEUDX2gwyqg+Hnk2R9On3PijIjmLaagjVnXNhVe9HjA8cpHqTGC47LwyGfWkYc8IbJfZeBfWFWiC92AYer8lEm1oZTMyLgp5xZ/lgUDNnxqxD8S86cOnaPNo8ez9qNYrDkJQJzxwnT3b+l8E7pAL/uJpQj85OSFuiD0smq0IlXYGo8imgPPcvnOz+QRPcBljjvAXnPXyENgkFPB86+OJaA1K6vgsswByuys2AO3+yaNSGTta+JU5Fb+N4193DFNCrhMruKqQR/ZReSJvD9yhZ/LT9Cc+pu8O2czJ5cvEXmhqYCvm6HrC/eyprfpjKHXOEIfrrX3q3BVB6bzRtvBVMGY2Z9FxXBa7e6sJ5DQ58r7Sa+g+KQuqxMzj91TEKOS5AijZBsKl3J/uvyQIjoRd8UWwqqMkV40PrMXDquQLc6mplj1n74PH2ePSeMRaKRSpI5vBUumqwgkLE5DjzoCwsdlxN6W65uPOuB0V8SOddW8VQ470WqvWascGvYLwZ+IifhBvBcEo6f2gJR42FqVgzNId/F76kgJNi3HjvIJppFvJDpTuYoG8ASQvyeHmiL6+P0YUfob1g45/L9kejKGrPZVg/XgSbZbJA+IIMrPSw54XCn9jgsTBF/tVh5xJzHJpjQiYNJ9EieClNyTuIX+/Jw4GhQmoZEIMuC28ud3VkqCFeeVIQvCyPU9gnA8oqn8JfDmjDQi1Hygv8yQo7tGDajeXotmE6CxgW0eEeBz69+TpJr14NigfHQr/zflDL/wBeLUb0zE+H3vZ+wYPxu/D6KzO2PZzF4w/9QMETMqBesZoMZ92CCOFmVrs/FbufW9FDWU/qDxJiPbVMUDwggZ/UtSBl+TVWmR/L17oXwoBTBJW6f4FjT9fQ4pXSbF3RCuF3+sHnvRq0sxLU3DbG61kE46/087sfarBnnADNn3uV35UPw9BHVTCcOgKq6QR6DV9H1p8Cc+wP0fKkGLz0/QitLmuDsw71KG7tTQl91jBq/iIU1sqg+3s3UoWqM5wcugFH32VgSegoHlFUCq/WlNKJRYKQsGQBz3x+Huol3cljsBOb87tAeGQQbNnVBkWh3jzxSz17xk6AmJMhKL9sA5dubaS6hZYou1QbtV2e8Zw96axwXpHWFmTTWlNreJkYAgtzmSr1hclyXzKbZD7Bj39FuDftMUrqWnGOrwB6bhOHvK0uuOHcMRgVX4rFqTnovL+aTkSNxAVmQbTb7iCJ22hzUpQYZA060IVpsXzSNYylhINBL3odWS1TIN+NybhWahLb7bBjA9MpMFNAk+f6zkL9j1ehOUqGpB4f5NV/5uOenWVg1zuIq4ZcQM1IAC7UKtO3BxZoN3Cazmt10/qr+0lh7j2U+BqGHxyIH2d2sNsNfTCy7IIjlwXQJLKZJHQ+ctTYCH62fSL1bLaDT43ZfHxMAh7bowhbj8Th3m0VSF7vULXGHh+r3EHnlW0QPOIHnhcN4z57B/x8UxN2t8jAwQPXONIaqEryFEZXRPBa3zEUvHATasy4SKe9iknw3Eg4qWrIZ8cVs6FhN37jw3isaS+cX90AEqY78W2RMr1MFwPLyJEwaVwprE1fhNPid6LVnH2sPGIOi+W8Yuuj+kBr5pLfk3uYsdwQZMwms37GAHgGSdFA7zy8PZBESa0mpP75Jiy41UFK6wwB0m0g48k/7iwTYEuxk/Tet5cidi6kVeGd3OBYyLe2O0KV1Wn+NkUVLtZWUVmQHymGFuCfwUHw0dvCWyWOoXbBGJCM/cPzDnzjl17jobPoPg3+nADnBz3xtfVo9v/Thb1vTnO5nCvX1OVjA0yl1D5DmHrhNBl11aLEVj2QXx7MHq+D8P49bRJZORe92q3p18tO9HxvDiP+3cXAR7ZQcdgOPkwcQfuiXoHZmnSi2k1kft4ILl0UwMEOIXga0kBXDx3C9drubNCuTaZKz/FfSSUVFu+EmPI8+B6mjOUTTUCieQWUx0iQ/H0F3N75Fb5NG2KPdTogqBqFov4/uOuxPU6RkoSq8+exqzGHm56cgZibB7GoypBWh/lg4jZXCk/ph1P+LWzXrA0GphWM101Q584byM+Uwkbna3DX4BVn7nLnvLmTMV36GE721YM1+6IgO3k/fKe5YCtWSiFxryHwuTEUbFSlV3bLsV3EkMhvAvwVLqMQs8sMg4AfH+lw38R7fFW2lBveeOIphf/A+PhohnmKYFZnSae1rtDB+j0457ECHzmzh1Y+Y/ovUZyLEu3g0NByaniuBeNuqOERlylwIvgbTHe8A+8VXpCS/2j8npmF44/G86mVf0lZ3Ayaf13n9bum8JKyMjJIeQZdzyXQRrQdj/1S4ZvJMpCnXIT6UgSSl1zpgVEkH1WRYe0/5fyo7xjkLu7EWNszfOGXGzZ0xbNRDYHeu+0A4Tux8ZEber3bSn8mX8NRU1+QtOZ4rL0zC/w14lHAyBq0vDzw+ukMCH93gtUetMHktN0cFFvGvj8kobJkMhdOfQV9g0ag72UABZX9/EhCmT9Onch35y6lwpxMvjvvKxuZG8KXXUWwvYGg+esGyvRx5f/WitLE3QZ89cMuEvhVhMGTxxO71aBZ1j+uG5SF3MXOqLhxPLuflEW5gky2fi0EG1b6cFx0EanPG4s6h95z9g11KBr7D39ZvCI/gQtY77kTteqWw7qs9VR9/Se33FxFGUfv0LM+hgIbA7wS9oFWujfyt+Qe3uzlyl49s/GBWCxEnKzAatWNWKUgBIO7omm7ky5Gv6qkNNutdNpsCs399wVkQ9rg51k3lPg5SP/WGMGh+ELM65Rg1fsH+E3fHFw94x7RntW8+1MlbKrYBd1/C7lMSQys79pis7Qch5kLYfpjT/7a6ghHyvpBtKCTbmrpkt4HbZ7xRB8+XAjnSalK2CI4CwKmf2VppVAueHiKCndfoX0vTkFvkjgHrJWAzSUzQTilmBetNYYCK3PSerQA7iscoj83EePKO3HPgtnQddscHhKQutBqWvMgGBtDFqJ56w72TPaFFSMOwtgZ8ZhqPoqX/NMF5RgByiiayrInjaDz5w0Iu3cWU4u8cTv84a3ND+BGvh7tUTcBtX+avNlJD2umPqKR+wXwTrEpVoyug8/XS0CpTpElfq2lJcutQSdsPM9f/Q3mfD7DjXuN2XLfTJhuEkcrZXbBgFIumH4TYzKwBPXihbToIYNYaTbMd/xFR97folnf1jL1Ercob8ekyixaelkantvn0P5tXhj7dAH9UxfHI9wDpio3+aJiFE3L6IU9vf0Q0SUAvfbLuFrvBwgdmQsl2rV8/M12+C9lPpRuPwMfb6+GPS2j+aHhWBAfzqWt/8RApHotn+xeS+cCKuFK0wu21c3mSg0DmFJqSbJ/dWHXlVdQN+EXh5uG4YDkIfSzzuRXbY+5+3QQzzo+hiPG7odt3mYQO/8Gs/85zu+/A8cCT+BXiTe0epIlaJzbDJFBM7jW6TuUCFmBbKAALx5ZT/pPT9Gx5QNAz7vRqMycK91M8Z32BfAJTOTPEsKwpOYtXlUeBOU4gPqhDbQvth6E9WxBPWg0TRntgG5BW9jbQBGkLz6nCPdtOE69DjLfqtHSOckc3vKXHieK8c/XtjxxQhYWsQTUSZfA1leGtBT74O3vBLhrGQNF9q/gwIxJINhlQdOHt7DSVSPo9pBCj93zWbarl3fLpeET/Rcw8L2IxSUq0CHSgbPF/EE43gTy9iVjohnRfkc9jr92HRz722hWyQ9IPSvMLx/IU3WKC9kvFobGRD1c+es1r2q9SBvXefCmoIvUO9qeHa8b4MXBX/TFqhts0wzA3j6TzuwaiW3ZxVAZLEnFczX5g246Lmu5w3Yv5fD97788cr4WnFozBfcfi6TY8xEkEeBLNsNt0HAgk/94fkMlZXscIVAIehOkIeJNK6389RF0DWei0hZHjL+wmp+prqVnF3pgxKbLZPnRFPdVjQUf4Ruo//YuhP0Zhrlu3vh+vDGp+WzGzpVe1FRljY/sjrLPAgHYM+MNxDhXQUWFHW78dgWGjptgndNorvBShcZ7/vCp1g0jt4tAKi/FlpHOVLpfgC0eZbFPygc6JC7HQRHZYBqzj4JMfbluky3cXPyBHIM8QdfgO7j9jQKvVYhHrUX45useNvBrolXjD7K/rBHkHN+F0fIVcL5GjiVmBoPXCTXU/PWL/2xxI+V3h3DhMik4/UEEsk460a5iIU7//Jvk/JrooHUrOd98A1Yj9tBkCREUTU2Gu15TwdmiBIZHOuHTC9I07U8DlgT8hOGTp0Fv/zVEzQ044Wkk7bklDDJHHvKXadJsOLMHfLWsaSt+oomxtXjfs48KHYsp3I/5nKQAGG4w5jaJVnAsfUG3tyig8OdZsEU6n/5pn4UdX7eByVxJHGUyDs5+l2ExbGZ+7AJfFb7hJ0FxlPzjig2J+1hJfTLbBLzku0cswWy5OuqXZlNG0ivYPPiDt5IVm6jqsNtCGfiWOwId/oVSvKM1lAUpg72WPx22yudRPvOxO6SDQrY8BSm1Ofj2eAP8vjiKZkRog2tcOoVOz4CWSyfg3boIzDi3DlS9t5L75QGo+zOdUpffJ0fxSSA/Voamr0xHnQNXQfDLClSedwak5S7jjjP22C4xmktgG7c/0YQDab4ob+bADvcKoHfrTR49y5h+un5GybYoGu82jqdaO4Go8EQY+6GSD3Yl8oxMJRK+n8vigiswJ385/bQyI25p45dHXtPHdZqQEn6N7zxbAdK5smz8ivFhcCLsKHxIH4or8cbATd4vkwH987Sgo/wkD157ze8dhlDKPAZOm1mAnfB8ll0Yj3EfZ+LtlgvovlMeutfuwuwmP0x3nkE/bCdAY3A+zAqOoUnH++Gh5Su8Jd5BLq8M4Fu1O/xcVMqNbgt5lf0REthUwGNz1OGe4CEcERMH8p+r8L8aW3g3Mxxkz8TT/ohPFK0yldpSJvGa2tmYnh+MRgtn8coJgfz5N0PWxTBS8Kqm7BsLYF6ALDiJBuOijE949T9pWiwtjJyfDgd+WIKCdAFJZe7mgOwfNLVYFL8srAC9yRXw/YsNrTC9w4WNQvAkSwdqA70xc1QJC64V5D771zx8ahr3RZhSVl0Vyqp8guOrkkD2uTh0LnbBePUeFJEdwIuHnqPjU2Uc+7UFLO7K4Jzcmfj871+aUGsICd75PDFmAW6+vRn0/qSDkbgdjRFTgYf9Hvw69QptSrjO81gIFCPa8UW+Gl4ePoiGsmUgl50FjntMeZZXCF4+aoLXTAqwR2wqzLb2xzfHjVF4fzoFPnrFS+o78diqKxDn9wtkNZNxn9ZhfJNnDFvPfqT1247ih7xWkihRgZn343n62RO0++xhTpPPwsM2x6hGTBCM3nvAxzJbPBP+BfaNTsaoDYGk1vCEy71KoeH9et5YNhoktphBxg4zuJuQyEfVPqB/Ux4+EkvEB71X2ep+E56cHQQdj01wioYFhKfcxzqJueS7NBza1Koh+EokYIwtPa5vw9O37/Cajisk3SYL0SoypHxMETqXxfOfmXtBQPoKOPvb0GeXM9AaeZ4vH9kL/2IVIEpLAEaIRfEif1kosV+P8WZlsKGtGS/mpMCDq4Ls4PwfyXjZQtiGmWTg7gAhNB4mBV3kihPj8O2SRn7SuAvWXMqgQ19D2W2SCphri9NWIxGMbZDHjAwF0BQfjVX/+aKcfyLYOSRw2JX5vO+1Ggxcv4VShYOo7lHKfoaNFBjXQCFrMuiE/T8Q8hLiix2fIPS6GbT4/ASVj9vYaY0zOJ0dZNk4c7QcNZ4kjm8G2/bTVN4dj/9yJWBZWyV1Lg7mV1pzyEHmCvv13IKMec2cZ54Mmit0KWTqa+z8oQTpm+JAWeQwxquXkVJBGbQYfSOLqs+w6vgMisdyyDv5nsVjZaCpIAykX/exgJsLNM64xNZ3Anj1UA36bfCFOfAEV0wRwGEzTbhUmURGc0ZgeYYdHI0LoE1Xd+Cr7T/h1+sU0hdbBSeHQrH+uDDcrH+K06VVUT+kjgIG3vDDpctJb+YQC/77Ctfu5MGJ5D6Y72oCFv3+kGc2BJ7Dr3HOX2dyrl/Ks8WUOTvqFhx3Nae9R9bRGacJ8Lx5LtstyObjAQf55zF7ejdGk7s/ePM6laP0YNJ1+NNqwJ++joXSZ6/x3WYbXn4tjmd6TUfT97L8ucQA+v8ocs4/MQ7SDaHqUkGIWN1C2+XC2XPxT5x2S5Msvi7F9Nr5OCvlOd4LuA3Vmd043EQwwa2CTTzW4p7psljUvpiNVDJhiegTrlGTYieZdhph9YtvTpMF9Wum5OKyiWZsz+d3iuMxYrEwBb/ZA32OJzFm9hJyeqpPVz3MYfv5N5Ay7wRunL4fl7sbwv5Rb1lbx4n0/iskt4AU+mefik1FhvBYYiU2HIoGl2mN8HKCHc0MCaZxK1vxZMpOcPayho2eH+Gk/ARwIh9uCCmGWaLjeMw3a7aatJ09FYZ4zqph+jseyexLFa94qwznBydC3LMw7KjbTz//LeP0E0jrrkaC7oh1qPtyJGakP4FSNxO4k+pIw0/z8SZ8wrQFWeDQ00ONy0ygK1ERM/4YspnyRpxdaAP+fQHwa/YXvJFcATP8MnnbARe4172Mvwh8ockxQTTw6yBt+GMNmy5Jo9Iea/wV6wHtEdux//5muKP/EV7tiYZuDUV+5xyA3a4ETy8fgSElZ6r9IY9HIrLpSPFTbIgbi+316bTzy3eIXDkdzSbKQeai6ZD+URNXuwpj7oJ6UNeJQJGaFJrXlgRl/4JQY7wLmQQA2Gz9C45LT0Cp1XNQ7ukm48YoWNj4nBZkn4ajGpsgu3QBH9KWgJuKUfg54DRKXM2BPc/WwIquGFipkw3V3+bT5v2PeDCgAwc2KcOdQwfwyjdxuue8i6oC+2jgswfbYz5+MU2jxo5hHH0hip0EAcTGvsBdlxmdbv5gp91fYa66AxpbLaVDFq9I7Uo3vHizhtU9ZSDsjiX4K57giVnDVJaaQ9N120El5SGJqKjDvHUvaKdZHuivAwj+95CEpK5D8Zy3KOQTQGn3izim+gFKhWvyx5lKlKDXB27qGvDbYTPtFvvCvpUP+dRoNZ5H4rBB4A6UJ2tQ9aVevrJoGreLmMLpUz6YdxrRKecJWmklQHpUHN9dkcm32xxwy65reLZlBEXJGMMyl/Vc8l8eRh35i1aLuqElVAnn9LWj3YWVePzdDzAXWoPyvwWh5etxHHd5N6bu2ALRF304Y5w0pFrN4rlpvbDQzIciYmL4la8kJK5MoRETIil3yhNeMXIEKaypYjeDOpxvK0r/Wq9y6M35vGq5CWw/G8veWmfh4MIV+K0whasGVChw1wo42/Kdpwf2kaF0FUy4aATLbdTps2YOiJ7tw/3PfnDSPCWO2hEPLsukaIHnJuwZKuKGgLFw4M9HTIBaeLPTkSZeGQtfJx1Cb0NpMik+yqn/GVJR6GO6+G0CKFr84n2mwWRwYxtMbMjAKRvz6GGNNE9/Ls8fbZU4cHkqaUtaQmDGb+h6/ZWuN5Zh+/tRGFBrhRx2gjSNjtFBAYTD2YfBPEAW1jRuhJhlUXTmZgnF9Q1ymuQnmPNElY8dE+FBC3PYVJ7OSal64Bi6Ff3eZ1CR5W9e6TISBqfO5oUz16Cuig2lqIdxW18TjhytCivHeOCPlil4oOseLb9+GgfVRfjpm+3U+rgGFgUf4C/PNWBOrh7UGI5Fhy1N9G+PFn/PN+ejXt9JZsdl3m8gBzqCvth2+iIHGYyFzWnrWLm+FFXEu2ifmwjeIA120p/C53u34LT1W3BQ2Yes9K0ht/odphVNoO9xiRS5fSvJdcThW1dHfDcqhRU1A+iUnxHOlLOC6akTwCvpL5SMf84ZxYH0xvQdiO6+BkFLhfjIQBdpBWyChBQLWBTeiF1BOmxrHIJeyo44suQ5fur4ybOkv0DKgBSNe29GtxzkocvzJci/a8ATvYHUFhsNMlc6oTDgAS4bPIVv3G+B4HkbrtEXhHt61yjVVYVb3jwjx5KHpFI6G/X85tPyq6eptDUAxd9qsfS9KVCRt5hHzO6AMePyYdq4MmrKfY8b3+6C1ztU+aVIOe+6dQ9ilxrC7Zx6bsqThXHCd8jgwjoMintIS7OZu1uW8nqhRfD4XhakjgVY2jALVeQj8MJxYfSbIQWR61dCYa0wiU0JZanfqaz41gh0XljD7oz1dNe/DdXvebPKgyY2GWOPYrvP8rodkkDrHrC4kTtsmqQEUQ6epJzBwB+v8fHG5aAQ786jcm6BQuA7GtV3n/4N7aczwVPAoGsAAupVQFYglWeHWZOZzFRa5fuNTu9YCZmLyyE1IpfMky3BvSieDu85ArMFkzh0Yy6JH1/BlTv3kNm0F3D+oAZ7j3lGCasmQeOIYQpxPQf7mhsp8/12NnKZDMa34snPdzn5Dk6HgdYcdNqsBDPiUyHzYyTPLfjNI61yyTEqk7LUzWhmXDdpTX0Ae+ZuxiPhFjD7qiaU6ZvT7Qe/WCjDjG0mm5FxuwbcELsJa8a3wtTYBVAZoQIH0m7wue9rYfTrQng34QoKyG2Hs2cvcefv2yC1Xx5fwXq8qG4JRk/vwvorG8ktNRLv2fqBRfQZ9gnM4pq+R7Tb8DdKGZbAsj+jYFNXFI6aEsWXCv9Avkg7jO5ErJefSKUrVfhM3BQyt7oEH6xGglSPMQ2OcuTlq49Bplcf/5MVg+pZb9Dk0iYoTU7k4Vv3aUuXFORXWUKV5nHaY0p41G8eXTrfgTH2TNctABZ9tQPh8xq8RlwCtqq+opcUArrN2XDXcDKIL2in+bPOgRwIsvHuFGz2E8WuVgXwtbDmWi9PKN3hylHRsyHrTgzsmNaLHYuGcbWVBo59b8QrlUfD6QMfuGHSJJh+IJJaNxzliPVMTS/DuWygkR0b++i/cyPxd6gUSL5jPBX2FLZkxZOzmxONmlFCIpYfoFtSiX1bFkN8/3cwNZ8I6oWCzA3F7Dwnm0q3inGJ2QMIE77Pe/dpUH6sLM1O0KUjFRLgPGc6P1DMwhjZAaqzyIYEGkFb/nRTy8uZ7PekgztER+DcA5NhyrUrXJc1Ffa1t6PV4Wrw9V4IRzoT8fdDR5ofbMLHymNQ/q4JaP6MxuoSP9bN0qJPhx5QSX819xcspKCPu1h30Sp2fLEYxmySh5zJkhgaMpk8pe9CfeUtuiM3FQ52q3CRtSK0DmvyzjOG5BtpA6PcStnOaD3ynjVsUZfCIaJveWXDTzY69IgHDs6g6vPq/NII4FV3MoceT6bUFa108YQOT43cw2NePyEeFKIiIxMs2FSDsf1jYLaHPLbOnMzuWwdBpDkV8y3iSG7xItp4vwlzs31Bu9SW0o1Hwh7fGvhjup0qDH5A6+jzdDLpNj7S3I6Blj0UlvSQher+I6+XI+FwzTjUK2jiKq12uLkPyN7pDo3ZF4ePHwyhjMYZvLh0ElV+NoEGwclw2jiZu64vA/MZb/DWor30Ru4KlHi+hM2d9uB8vIwc3qmAQ1sLwL176D3uFJjfnwej1iyCMKVWrug7xefli8izOQv3TbYCl8E0LHs1g46JWUHQ2RPc/NqB6gNy6M2tYBj33yPyXrWRnxWKww7Rl/x1lCz3jrbFUJO9dC1mmKxuiMJ63QW08NJSMD5zGHP9paFbvYviVHxgyRx/7gy4DHuNg2lcxE+UE9pGeSJncd26iyAiqA9PRY6yY+JlmPZiFc2QqmH1S6fIbtlPThv8itbCyIMCSby+Sh8enToGjZ676EHEOWhathekQh7hmnrio5PaucZuHq1tyYQNJAJhTb7gYj1AZx7Mg7h8U57oEchOIiaotOMPXdqhSOkvM+FMsA1U/HbnvH5XiJdrp3HnvvPppy+o+MQOvhJtSru+VLKTdwrtO8Qg8KITFS96QGfpNGirRJY6Jwwb+pfBmmFBPJRjRKXm8ZR1VgGu8Cw+0/4fLzwkiiPLp5NvjytIug3C8uFHnFY5GXsPj0bzjwDtzptx5QRN0N58FB5ab8cChXg+L6+Hdx3CqVRoOwqovecqrQnwylEdhSTUyCr5LU2fVcP+ryVYtHwce+/s4wMZFiRzLZE3danBm7YJvKE8ii5ev0E7ex7Do3Vnudm4DF7f/YWfZP+BTb04D50zh1Ox83nR1xV8Ok4KNjZX0JkFHiA9u5K0ezpguW0iZke1YaHeBNj48wEuylsAngmb6cavvbg94Tt0R2fD63UP8O+hPBCq24Ffn6jAt/wl+D4nnW+ff4x1I67xxvgWLp6nTyX1E8H1ah0WGiXBAdHRUNUwB+bdzOVsvX4+ru6Is2dNpNvvokn1lDFUqepD2N7rKPTGCA5uaaKrcf9YKUwU9oSfwVc/tuHMJ+qcYBBPOqoF6BGrjw6LdcBaQo3V1u3hcrel1NYry1LWE8hsuQWO6fHGi6kTEDsj8fxOTQiZYY2ZB+Wh01uah6vKoHVFINukL+Grtzzw6IoSho1M+25LgvKMPL66uREu31zKb3RicP6bFMr/LQfDraos2lvITU+XoXqiIXyddgsm7jAjx5n7IFzWniJ3LiC1R6tQPaeEOl+b0+X2fKpYZwj3ljnww3PfuNVcCo83qGBo7RqUdNPCqoXxEHpHjGpkdnHHAgFwtlpDTg3dsHFAGC5HR+P8Ymf675Uf3jlciCe5j4RyA0mmWxfqDxfhvpgiOLPlN/quuk0fO3Jhg4gO/ddXhbvtF8HFw5p0aYkpuM0yA7PScF6a2kQFfsQbzMbj2JAHNBgyhDseviG/gv28Y4MwZC93pLJ4fRK4P4Y/375DT3aVsEtEA7+7/B+3WYzEexvsuP6NBDjPE4P4lT48f20HOsnLkv/7Nfh6ZzH2XtOmiYHPKOpYLDYfVwAROUHSOiIMa1TqQPnlUkrvqKOWdQvxr8kGbuy6hBE6KTTawAh07M/x+4AxWJeijLtWRLPStAJo9AqgKDlh7LMZpjO1t3ln8BTwMvOAsYlm+ExtOskd2MQ5Xkv4Ga/iCb+aoKSxkLxuxfH6IGv4eywFV4sK0DGH2XQpcQUXZMWBs/wRqLvxkq1txmLjUgMwzJWB3PIaKFLJJDXPGpTd3cICWf9hoo0PqH9/w48ET3HwvQCaVyMFxr45kJQkQ7paW9jscjdVNO+HC6dm0d69prQ3H8BhXgNjnDKE3/WjMeeP47JV66ln0iSIubuBKur2cvW2JbQ3rpe6y5Op86o6nPgZiDtGpPGHs14o5T+TThUlQ/W4XDowwZg+uavirshyjBbXgM9KF3j37LWkt2QCtZ/ehyLXhdleYiRryN9ktasDoKpdDWLXzEHWOQcflpYSzWkmmzX5+O5sBVZJXIP9yt4YPHc6GVSq45rjk+HBk5VUIacPt1cr45dtjlwuJICfRspDpNpE2DJiHL9dowKlHhPhonAn71fMgWt9nuR2JRl09/Xib62raHO3Arfe68H5yZtQvFUIgou24bzgElxtvIc9X7axy+h+THJbDOPeJ4FYtCNN7neFO4+MYXLRL8ycuJwuVz2GpEFVPC4xHi5v3wpvLm2FpYYb+NaZjfz4iQgcnFxPHyd4Umi+Hj9WVES3egH6m1/Ho22eouK5UHzFjzH62gg4MZzAN6Y50/mEpbi2fi+JJS9GyZPVENf8AnfImKObugJZFTFYyc8De/2vcMt+Jugl2OH6pkkgajcJOya/x5JvU5hO/WX3h7rQPFWLeuTseZT+Y/i9+iBeS15Af6bMwvrfADM+quCn8hU49aoZvA4+RFcnanNsyCqSS+7AlG0RtMZMg6OOHWSfw6XsLbkZh40VQbhoOpq9PMhuxg9xo88aDN5ZS096FpLYk1iI7V5GKqmBaO85AcpP9/P4YyaIQ3952spD9FO+AGNt8jBqgSJKVI1Dz/Ja7FxlAb6NlbDi11+el8IUff4zrL/2DVKSf5DPHDm0+u8ueBZaoHWwKYw0iMbRWybSRuuPcCNBCiZGHEaBUHPO1Y1B2wYNONn6kXsjbSAubTd5HrhNM47I4RO30/CZdqGjXB9l72hgoYWLaF/NCs7LV4bfYS846F0pZT86AC9WW4L62WhcdecWzsxJx/sJw/xghQ23CiqCRnoNG1nNgHsLnvOa6Atk1zXAls/3YPHnLFZrUoTW9sXwYooC+I8MAmWcwR8aImn3eHu2/NnNTmPSYGtfANTN3YIK4fvxsqIiqKVHo1/RVtqh8Q17dVfTUK43e2+/BUub67Dj3x/sm21Ivav0IV27kJXW5MIYm3fwfO8Sjt6+BU7/GIfqR5bzC/1P1PN9Gr34Kw+iDSvROyQHJtyswfJRV3hgkR5VftEjz6MJ/ORlA1mu2g5RmtrAmkI0YsVivpw4gqpqHShRroTVNmfChJuXOXfkTPQIuAXdw4Kw2KGPxnka0+Trfiz4TwBO7g/HvgN7yW3MXJhcvQ2CNmyD2yL6oCq4H96PrQDrzI0wxvI8zFzngAOXpfBczi1ucp9Go49uoaxqbWg0lIddf9JIYeAgh+wW5REhI9B+ZA+/H/MT9v18ChFfnDFNbRwoJh7Asu9v0C4mGsNdhOFfoStTcyyqVkZyjJQeVb3YCverRsK+uf3o9NKPnwQL4M/YCJpO03BnyBIobV/L6/82UnxrGqVFACg8DGEZ1z6eVzkRc1YJAZt78L+jGnj69zbsr41Au9mBIBYsCLs9dpJQvwztVzoFyd+tsbpqOz6bUwsmq+rY5bwUJ69Io3UjR8Lh569AZaw8Hh89FgLc/WC8YBZ2/ZHmhSFFtDkhlXwU7di3SBJKDJp4raA3GC+Yx3mj5vNX1ZtQmqaL6d23YfffKE6UVQbXWmNoDboC6Rf+ov7OJC7qew289Teq9j2h77uHuOWZEL8wTmJRW30IfB1Mc1MDSO9BFR39MAGnv7OFz4JDeLNhGK8MfoEtv6PxSs8k8LGSwtsnArEsSpOPXrLA4KVJcNUqFXR0ZoDv6Fh8fMAOHssZg71eBy+sd4SXCy9Ap6QN1Wdm450nRmTqXchBCmOxc48F3FytAdvvi8Ifz2sUjZe5ZuVofn2vlAcv3WXD2O2wf2sV/JUcwmm6Y/9v/u81WRGcxZegp34kprSLUPyE9TT2YiOtrXDnqTaxkKz7DKFKDARP7KEMiTCS6h5HU3cL8ZhvpRD6dTtKtJjh5/s1NHXNaowaJwYWIxrA5N9S9JuWzYW61dwz/x6IHtsB4Rdu8qQZcvior59mvzaAhJMnUSpxB6q5/+Pfvfuw4ncPqn+0oC9dDxltr+PWM9cx32YC5A1l8a76CtpyRQbqXUbDc0ckF/oNZy7pwtuGtTD/hBZ6NkyFqLOuOCt7IQ7M+UPLz+7iAON5GJSzAMTXH8BasSoYfmtOoXu0odLdlGeon+Pp/v40+tdE8mzQBw2nTKgpMMB5ibvh8vwFWOJrAdU7hNCkqIyF9YtQsTsNMzVdUcHQm/490YTE3S9AYNVXSG6yAby7BExvL0OJuwP0zqqAlVw3wJyQMDyqMZPGC/WgZ7k4Br4ygLS191mzwJo1r/4HezVywWn8cXg024JzJcuoefdP+upTwCs95OBz2isSu7OfZm0sxl2ZitxnrcZfdwiQ2wp/OKqqQocnLmSeLA5xS+6gja0AduaFQrrldjhveYlf+WqC1jwv3LFoNZ9MUwAlA4bNlZtAe6cGyUw8geFTlpPDHUuKMSzEwyuWUbytO51WK0HZT+qwztUZM/0kSX3nFKyaGsGrDC7wksuvOPVABm1XW8NCUSsoP1cPLsm34l8fNXbW/QdXU90pLnwHmKs44dWVx8A+SAojUj0oeaUIbGxeittWhOHs+mzM267HgV7jsWNBD9v9EsI2Nxl0v9wHQVGq8PigKBXdkecRstG0Z3IxZU7PgElKrZi9tBgGv3zBA1UxOKZaErwrw/CpmxVo1DIvufAXhesMeMfDGLjzLJ1OZ92iDq90fqIgD+pXp5L7w22cvroDcm18sdDQkGx1TfHYJDEwW/AMnfQEeGONODh0JVH2WQ96uzYITHzuQ9wL5qR9suRx4DJ8vFkE3z+J8KgsOXB9K0M7l4SStuoKum8WjnJJwphaeoMqii9Q68w2knGZAZY39CHVswAt77/G6faT0e+NAOZMdMMpT4/hJH19WnxvAaS323HsJBFQV83DgV9jcOjKOPCccoc7y2bxvTM9eGXidBiKqcFN+nZ8pEIYTi93h13/lXL0DXlS37Ob4pbVsmDAJdh5WIhuHV/A+skHecheEKSMnSg6xQKexCVw+8ARKDFbAaerpPBcwWP2Wt+OeetT6YSBNLx4XczXYm5y7refNGh9jiZu2YM3rFpwaepvahVJxAiXveggKwlNe2rRT0aBkkQYnOkRV6YrQOXsSPSYfRd3lo7n5TvFYYW5MEgcS8DmRcFUI5QKy78E8jPzMqgu98WfGrpQMfswXB/hz8nzRaEjTAJ+bdXkZmFk7/QmWrN/Ii94egD3bfSFvQXrOK86ADfMUYAlM5dzmNIAGP7VZDzZimeyb4NryyCKXzenpJg8epu8FFyu6cPO/gl8GL+TesZS/LUzGo0jXsGhoemoM38uz29NhzMzikgn1AwOpr3njdYPGQW8gdqRhZO+c6TXOjQMTeIV33JopdNDPuQA0FogQyn1rZQ5+xk/lVKmFU8SWWeuJQ8GN1PCQDF3Z8zGD61m8Dnak7cF6rOk/TMSWRSDEXkH0OSmO0eKC7Je+Hms3Z0LhkKK4NSzCurENeh+2lMaDFsLJ3khC5vcRP+5deyRMo1HdIwBh1gFGHPegdzC9NDmVzGZX5hH4RHRqCGpTtaSjTTgswuqZXLJN3MSTE2ug94Fp/DdjnRW3DKL/rZ0wfcx40A4+SOLiZyCZJ1HoPOdIMJFGoecxkDEXSk8t8Mda068oPeihbS+JY8n33wJW2/noZePDiy+bwTJMUb41PIWWXy3xfGO7vin7wbaHd4HAVb7INcvBQ7rmoPLUCC6bPbnEKt++rT4PFgeHoHRMqOBl3RDuI0hlJ3ogGc9auCx1ZV/pifiAfyMt3uKaUJID1afXoiJNi/JYNNllBhzDR7fUYEf/sOwTLaUSkbJQ2/rD9r2bjWbXyqgH97DLJtQghuGpFD9jA5oyd+jLk1ZHqvWi2+lCtHSx41lysXQIVsWm7cmkHhLO+77ownKrvtpQ5EJ3859h23vOnGMgB2eOl3OzxdGUujzMhaJTOLaVEnozZKF59aVkPh1OhaUxvLTAQ3e3PgXNC4soU2czl97/CAh1wpmlUtDlVYTVdto0VXPJhxODuArv0ehfsg7cE95T9WuOjz0ZgIIvruMHebfqHvffCweaQqfJ94Az+hwTjatp4T9j1l7/DL4vY3AXf8j/U3bhRWSw9jcfZQ/Vp6BkqNybDEmANtq+lk15zO1vwEQN56DzwSKQV7qBG8ZWkLTEsRh0KGBrq6dRDWLn/KkrRl8+pgJSMz5j5/YRJPG01Fc2TQW58qupnTPLJh7QRXTgx6z3CF/kK23geDwEI5TW8Kpcet5QEsdZoufZ/sZ87D8twEcWdHJp7KS0GhQEBzeAkWPjsSKU86w3NCeji1K4W2mj9lL3BIDT61GW5NQUgENsO6cy09c7rNF23q4f3ctnfzPklyzf/P0kkUs47UJLsqEcF+0NhzeO4Ru5U74N1wXLL6Yw6SXZqDiJQ7Ogp8obn0slg4I0WUZAzhjn4E/Y+NpxuANUI1+SA3F6zBC1I7zxlbi1YBUuGgUidKkCYvLtkCWhycqr4zCgHY58vI05SNdLpAY30I++w+BxVlj9H0H8N9yd5AavELhurs5Ymw2nlXuB5PTphja8wgEfOSoWvogGSpNgI6tRJZ7l6LdhToUSNnJXzUFcE+rMV+IyaVKTwUOOnqajy2whLiwfHLxuMJ7hwzhuslRXuFugOV9/uT2aDq/HGwgLStj9PlhBF1PRGlxoz2Nse3k/gYBenTkJSza/QgnZg3zDPXDNPSonBwMNEEt/wVhrim9mPiBrn8bB7dtV+HhfFW66VGIN7++JcEzJ6g4SRPC6yditXIhv7rgze7/uXDlih6+cN+b/ytogv2zM7BpXwIrmylC8d7NvL79K3uPdcFxSb/hyzI38LTxQEFpYzAdjCIFi2BSLlQHC3thVtOt5d9L4zFzQAGlmrZxsd4b/Pt1kD32xJKP0WQW7DeAkZeiSC5XBMzMguld0wigKFH2053DuQpfqShTBM3DtnLrtnEwuf4EONi2k+prPbIQeMe7jENhXWozX5spxfntnziqrQ7rNjA4jTDlhnB34sP/kafEArCc8YoOpy7F5IBfmDbeFpTPLqEXRtowSX8jnVU+yJN3FEOV3zL+GdnDVq+FoHnWATAf3wIvTl3kG41m4CHtSNNCVDlw7xkoytOHz87rWHnCa2q4P0y/jkwjzRelvPDeaNgi5sq9Rxxh+JYvUW0HvZfXo5FROhi0+xoWpblyp/U9tvs8CmoNWili/GOa/sST7yqcoHWJ6/mkfyUtCPCBsweDaZmXFij5TIJvu35DWiGQm7YLn2gIxJW9VrxAzZ79JvtS13Fbuu1vTXNAHRSgCA2L/kCUjy5/711It9/tBvR5gIriodh7ayTs3z+HV0ZpAPk5g5JxNd8M2oXpvyUJaodIZMFujq28STdOubHdiiD6+80Izm0P4l8DMWS7So36HjSytOoyUMhdixs8LvDVz4EwIesDK2sbQZdpPi8uTaZno/4jf0Uf3mSXxf7nqtBZch3pX7jA8lFz0UNnJJBaF4pdKMW5BX84ueIuLZypT8/Lp8Ia6/3gnVPGCaIPuVZ0NOwblOC729bwo3FN6HhqN1aY5ZH5OltyyRxEv0Xb0MB7GsiNNIXdEV/4+cgxvFc0CNO6XGG28RS2rtXCkf8jAD4AQkCgAID+UdKQdkqlUtHUUGkiRIkKRYRIyYyuaEhlhBQRJbtJGSFKRhqkRIOUaFBRChElIvf6UoCWXeD/Hm3k6jYtkH2wD7+8jieFMAl46a/DsovjKTPQkFw3eeJh1dGwzzyZVV5NguX3TWjzpmSS/KvDSSmD6HjsOdzoHAfNDeeo8LI7NhS7gNQ+Izjf0AV4t5Cv17iRVtwwjskWJYHwNdQ6OQmD9n5HmT+XIWycNgyqPmW9XGESHiqFh++VeY3DZxptdgtb7m8B92hfiLx9GrFqNMwVv0LkYgPi7X9x2yMzzkupYc8+V1gW2co21dPxre47ctgrCOX2G+jqmQ5svO0HKwyredfhNN6kywR3v8CXx+tgzo4k2tOpD0uVLWCn+FHwlzqEnriepm3owcm1frRM5wls7TxOc8OtKHX9CKg0cSZNugN7ZXr4accsMHkdBtSYx9qG93FDuxwGur4COVtZeO7BdMvpMIj8EAU5UW8esViIbXX7OHfuB7QsXsJKsyTo4GkTmLs7hr3zV/P+zkYYIXIHBt9tpXONhfB29yFqtMmCZ+KddOOTPvi1GrLpqB5Y/EQWQ73Gc/yTM3hppSJb3flESgFVkHpGkP/aCMEKjdeoFrwB9V3/8FuNDJbdEwh5q7LI7ro4Nc9awB75x1B4wAxkYi5B6BnCQ/rLeLtsJqdc9cK67hKqb93H/ZLuOErhMjZrGUKUZha0vf2OaZ2r6ID5NRL49wgk5I6y2MINUC+/nj7Nk+etX9WhYsISWNLux3GXY/BFrj3dSQfs3SYKsryF79X3UfShqTTopwEqBcE879NmqEmKpTC7J/CR9OFynw/Mj5nN4dbZLDdCBqXXWcKn6l46onQFF7SOxIKINFw2YjHXWl2lwKPvWHxTBd6Rl+RPJ0RAILkaoxviOH3WZzScWUWjSqOg9GoMnPviB7nH1rB43nw8flwPCrrWc94sbRbeZ02iyrPAYWUC5jn9wwv5KvBV8TF3+pyFVzWq4FoQQSuOHaf2mgPkPOsK5+jac6J5KvrIFrJvwzxqdzOns9+0oVCwiU1yj9GcnhucMFqAC62csL98DD2YZYGhg97sILIZ95gJw4NZSbDE4TzUfLuH5VIr4NlTU5I8v5++P5iAy++1wZeeLXBbUAQ2fumArZuInASrQf6XEr3ZeQ3z3+uhybAq3XtYDckn58FOE3nYtwCwEBQpU24VyR4y5BcW37g/KYU0xzrj0sRurvryCB91K4PDwUJeMzGeC+atxMOf63FRxkt+O1oQdK7rwwo1E7BJdoVVx61g98QwXvqhnecsTuMptZL4s/krRlw7jqmJ/eB2MAaXizfBw5niIC8iSQtXlaCBegcEBSbjDXbjba+3k8LBIsbNMyh1dTmvbtYGG6vvsFkzg8xO/aUEl6O4fvAb7e2vgNn7kjC2PRuGh4ew5KcQaHt+pICni7k3NoVKRqjz6O0ZXOnhjK6tYXA9qQWDIr9C6AwteKT5i7flOYDBpCSQ/FoLfqv64eHBc/hhuQhcFLhNjy+MREEdLZA+MwMbr+0mQ+G/dEv6Fj/8F8/in1zx8iJL1th3m6WDm2DtMVtQcthA/OgWJl44Syfnp/GtufX0vucfpwlp4CnxpTze7R7ti1SGyPw+0jf9zP4/DsPcH6KgLS3M33UvgqxlJaZMyiUjyzpe89EQ4mQXsJuZGh2t3Q4/r8ymX8vLqaWsARtyllHpuEVc6GYIM7ePgBDBa1TaMZne6TajfUw4bsYcMvOeyd8LluHAjXn43WIzqidrgVffSWwT/MM7o1agc8k34JwRbNQdzYd/udIl1R6w7Rdi1hwF35es5aDnWSx5VZOrspfxJdVlNKSmTR5rjDH0syUZNxZA+G8p8AppoCS/K2T17wssDFlLh/gwTPJ+wmJ+/Wyoo8+qc8zhXoYxLFFJxPFbJsCknX9ZSC+eHqrOhO3Ob1HXbj3d7Xcn5fo/cFuIYMl0VU6MS4dHklNIe6YbyjrvB4m7+zDNwY52PgZ6JvCTNXImg47rdfKdOR6FJUfza/sL+CKnA73NH3Ks8gAOOhyjGZOu4OLxk6G7fxcIPHrH6QcHSdHkOTnETGCJT1mYMycADpuvgPvaZ0FtI8Ktsnzym/sEu7pk4P2kED5k+AHV7N9wS9YWEtqsjM5BoXwsXRt6jPZiXGInF7yYDc9FCjko/DJd9LsPh7xLePZqBZC7Y4cPfWyg8lkiuhXL89ngZDAxP0bJByogVOsqzruagPWTknleaTSvVLSAH3MuQpnfMyr/3QpzYkPYa89OVrriAZs7j+LR9c14WLWSWs9NgGGL75Qy7ySNrFOgIouNkHh5A2uM6QbhHTtpj8gjHnmuliKfiMBfsXbQW6BLZ9MiacSndl5r+Q2/u++HL57LYEDnC8nFFRDGWINb4gRKy4rnwT897Fk0ki9fDeFFr3fhzBMmPCM1De8HVsNYU1HYl3+eV/UE8H6t33SiUQ2V5/ziE3uWc2ROFtdKa9PmyQfZ/tAIGAhcif8pGIB3w3qc4D8fox/NxLpz8uTD19Hl3ybw/veB39aaAG1cjF9uPIFypWY6fjUbZJfEYYuIDv9rKeHGNneue+UPOXPHwKNiYXQsOMLnzEroXUga0IU82lN3Hm5n5vOAjwkKyI2gSUusQOuXAu4HG7byS6FrxX9x0/ubHG75ENOUgcU9POCHezpKFhrA2eXiUOjsjt4Lg1G0tw2Wdb0ju8btcK8mjN+XF6Pnt1wY/1YDGj6cJ7fRw9T+thMu/XjJPzJGgNZuf7bXt+Upa/djVKYkVIdIw46vUfh7bz3J9j2jcMUhOqOxnDfqv8GiHaG4Y7c71XfKQHj+aPhjdxbTdx8DkSXVEGJuyu2xKjQyvQlH9qrDi2vxUCn4hCrnCoJM4XLUfPEU3L/qovkxZfSa8RNmpUzi6ydOU85bSzrwywf8CtUh++tl6HTxYs2weDA4dJYM1Y3hakQyYJgM9tyyhAnb7ejJAUEYY1ZBTeces4NYMfRfPwMlN+ZgzN4r2JE/liRclLGsKIw3fWN4PTcCG+MF+aVuJV4dx/DWQIpnqUXRZDiM29QE6Jfvan6lbAQ6SR2ocegFjF4xCewaOqGvcIgGo87DobH3YewhEXw/Q5yttylB7fn9PCbmA8ZWddFIYRHMul7MP/4lwa/sVRB5dAjy5F1Q9Yc1nPw0FWZ5PgYL3eno92Ai7kndwM2xJ+Go2Dd8f00NYP5onhUvB6uVpsKl/9JZvWgp5ms9hV/Ccui/1JcCBAT4pYg39mzIxZd9FrDa6greOv+JP4AVHtzjAGHb5uIOHXt+usCNWg4+hvldDLO+qkKj2yKcdEOBtzq8w+/zxTlBoYJOdQ/D4rzr5JhswDMjRmLSJ1k439tNRR9vcMrnRJq77R1f2LKSjv9+Rx/GK8K7lXVUr/yKU/oUAe12woX9fuxhcwn/XnQmn18NvL0/Am7L38QEydO0VTwUveOtIG1yHsLCQDjp+JBOfprBI8Mq4F9gJKUWDLBV6VL4ZSpJKxKVwcpQkvtjfcEjMor6DqjzUtnZeOTVHVSfqIwKqrJ0N6CKp95Xhpkpj6FMOJv/e7AaRZMlCRTf4rE0LVKv3ohh4dEUV21Oi6oUoVhhkEu1/Cji7jDUbRWBu1aXYWTtdHiUqQlqqz7AwOMZbKA9Evx17lKOtCVXFwuA2YpD+HpZI+S8l4WpA02cU+SNajPVsPCzNux1qANjy3hSGr6PxrsOwJoFibwnKJXu9FrCh8PG2KbmCbE6tpAS380ZN9PB7HcY68Tm0P6rBSy0+Rl5O0ez2BYh3G4mA8Fh2iAkP4JiVV/jtH8JiB6BJDhtB/mFzyH90BAwzLjIJ77+wvIFauDjZULYWIRaV4d5y7GDMNrLEfc8t4c9S0v5+f507Gofy6tuToKZ1gyJwUIkuMga0p/1YDs0sKuzPY68dp4du7P4iXIxDg3ZQNsWJ15n7kXazpcx89UOKq0I4ej9+6hNX4ml5hlQ+iVltCmRAYHx6+B3exwOFY7jhKdOrP1YlBO9rrG+kyIG9vawmFYcWLupgsIcUdIdv4gfb12Dzw+bo+3z1TgiWg2nVpnjcr15uPTFEj7WKQG6Z9/i1by5uDOygFqEJ+OjJF+OtRAHm0V7qOHFM/g8Iww104XAaGE1vnIZorWBe3Fo+VSyWDkazgjtxFXbMrDo7ix0w7uwrF8PHhs1cUDXTj6/rI3kZxqQ1zVfrrl7mgaaHsPF+Wmk8mIIV9bbgCSvQodpM3Hxm910P1cSxy4qYsWFwjh22QX64pBNHybLgPlBJYh/pcQNpZXQ3tKOBc4idP2ZHSl8tcLO1uewf+sRPNizDScaiMCDwzF0LCMT/zzypbwsfz6t84Vmr6lgy8OdaLx7FN/eIs4rz02E4JMy5DG8mJ8r7yX7R61sdf0R5nZcBGPPWWige5QmaV4j3ckIR5a6YOcpazjQEoVnP3TDJBlFlFIShuDOElwz3REc8oUparMVfNqlRjfvXeK5TobgV/ka7/nWYa7AHDIVroGk3/3wfV0irhu0hh77Xax7IJZyf1aAxpVvdDCR8Ub5Ldz3R5hv6TbT53969BiMYdtIY5wyzxg2pU6gi/LKuLWwD/+srCJbz34qnhcA/oufUscOZUiVL6bOT6HUY3qBIwMjuEirmOVlNsHTgh30nFyhKaKXrlpJga3kNa6dEozvJq6Aw5PvQtjJj/Cl/ABf+joHhi4fp/kLRbk2zgTKCuPB3j+fdx5egskPp4KkqAg3uahQSbM53VFURoe6P7x9hAHMa0hne/FQ3nHbmcpbL7B+8AH4N2TAbidL+UCLBIuezKCB2RIQUfsPhGwcWKbyHsofbESvSf1saz8Br3asgYx8O6zc+4eMYlTB0XwJSy54B3l1UXQ5JRriBdyhbMNzrqyowN4Af/xZNZIJJsP9ZKAyeTdOnCXH7X+JB49sI5fD/+js6kJq3hRB01pP4vhLcqDxMp21o5Qwe7kp79rgz6m/X9KqeYa49VU/h83NIZWcWPJIEIADRwdppUIjXA8zBOeaT/x5uhSmVP7Cwenfed4xUaiQLOKOHC0o3dLDKlGyeLLGlDS94jB28ClWbwuBUS/tYUqBBo2ru4+Ft/XBzkCY4wozOGdjDgfphEDulRm4dHkoDz3JwH3HNDBnVTudTxaAnaMAHv8wgBC3e3RjzRI+eGs8piqOwTdbf+DgkwYc0DAi4f9UwMy4miY++g4jkptp8wpLfJxnCp879dhudxCEvblHi0QWonuTDGh8yaHD9/IhY+4z2mMpBaWnUmjF+BCY/qYNXg7XQnrOH/iXag7BPgrwZ/Me6lkoTgvqMljpYBDPfZ3PhZcz8dO4ejjxUgLObbICg1ARwE4N9jr0Bj8urqPyC1H8SfkYLfVugn3dArQoYAv/nWcG7orWLCZSBoeqG8CNrmLxhkWU+OASOdsfw6ezzOmO5kpoPW8Km6PNIMqyHRRkLTCVRkK0kTDKNfayb/tKMHM/hJ+1onhcyXhYfseO40y2wLHpbnSrNx5KSiaQhsVLvDrvM406YE8pXu1UtUMXrsZl8RUzI2je2EXJz3tg2To/rh5sIRcFJ9RKOEDh+lfx4zllsHnRgLpOM1krPJNP9K4n6QOfeXLsTxyYmg5VG5pJ7qQ9n7AdC38Ux6HelImgvP0XzJkgREWXs8FquA4aZkxkl4CTtNrmFI6IlodvZdfY+ug9dtUdQrOjgbRaaSN3JC7g82dfs299Cr5yj4Jft0xAccQDPLRIBP9L2syXukNJ89Ig3fEW5vakBbT3ZCUnRFjA1QAEwctyXPDGHc9VlsHHrBZMqorhbd8d4OBxS5wZ6EBr3kjB+mAR+M/oFjurR1DVuv2UXHsVw11WgrzAanyma8mjUon/q5Tg8+6q0NP5D3R1KnFfwXEoMgzgVv9kTktaD2reySD3fTR2BVmRpoEChOyZi7E1auD/0Bu7b27lMqNHLHA2HbamRcG5qAT2aQoke2cpyICdXNG7nLYv/sDNHzdCxOMaWutgCR8UR4DXy810PesUk6EqnPIVoKQ+X3KqyOYRpa6QH34Tq3wzeL5OBtQktMCFt5tgsocpuPiuhbPLXXDvjW8koT8GffUkSGr9ctB0LEL7n8HgNriAm3UB2sy6uaM8jyOfTKLtesPQe3gt3jPzh8xv3ri89x07eK3BCykKMMpGkMf/zKG391u48ZsTC1+RhHO90znE6SI15IXhHfUWoGhDkFbTgNlrq3HPKUmoT8zlsyutsGdNHnYX+2OxyhlOMRZFhxVK8Et3PIuHRsA2Y2W4tPAmWW5eCvvfjsfa82W46ZkAeDzP5gQzhpyUAu6yPcV7Bk+AmcUVThc+xlezmyDUYQvGHH8CldUuNPGwGrR1RdDzTxno5ubFxh9ecfzdeTQWGjnfUBK7lrjC0o5j0BQwFr4keNCntE7q8l2FF+xk6PTHf9S87TV8NRfkU2lurB//DkvdR0PitgE0r3vJ+R5G8F1zBngsToHW+bp4PGgyHY3XoQdBDyhjpiB0SqgBXFXhn7U/uX1LOGc/MmBI/0J5zqlQVeYMM74OQN9dAej5Oo3HvA/huMr11NIwTJ0tk2nan1rQy7yO15xPgKa2DdrfkwZjvym0VtyHzZcIQ3E6wL9hRz58ZAEV29+CMze3YpO/Byd6CIDH57WYMvUl5US9YmsRN1zpEobipmUoPuYkPNuWxhpJG7lgHkBhTDqbGk4krXdOXLUkFhY/6sHAGQWsGLCcCzIC+ULZZFT9bAM6D2/w9aKpdGVFBGw81YTbqmJ5SHYivzlURFIpomAylINGbyaC1KhBsN5hjS7R0SDg6gkdc3eAekYzzbQRhutBU0Ba8wGeNjEFj7Ez8O2hChSrf4DqPwIw7/sYuDrxConXvaPhJTHw2MwM1q0hGGx3ox+rZ6DGnS6as6CE5VK+0kYDedwtc4i25PfTUd8leDp1LByxeUyR+p6kEDJEV8a/JqGWidAyzR8E5srQSduFUCe/h+GcIkx9Gwklh5NBe68YfsJOrPn9nc7/q6LGD5vY52012H/djp/sraE1O5uTVijDo6xpoFY6gkvWTiH/j6PxeUsgBdbVsHraJiydwDC1VJgu3LLAAMcQuqV8GNIXHgb/mHUk6fUN/surIr9wWY6bpAkr9SQpI+AiG6WLYeCoAdTcq0kl3f28XeUexfiu48Hth0DvthDobjbCRf4KaLX/Flx5IQ9N1c1ovrUOLHaPA60/RBnlZjTHeDxUb5KBp6834v3Y16gtdwwTYTU7rUY8c28r9y4YwjE/xUDkrxBc7HrKws/PoPW6JFj/nzhtFKrBS2/M6HJkOS9NV0NpyXocEy4M64dT+LxGP60XMKCE3h2oIv4dA2J7WazQCP9OvYf/9fRSubw5FJ3TpKX6gSh4NAsPi3bCgVG7yFJEGPa9t6XZQzrYkxzNzTM04ICPCVsPDcJqwXYwmjFAyVrWOHXcJrSNkeCzFfH0ZfoEeiinBldzC/iAVgaJ7lXGDxefYZLYXHiTbgqpazQwQDMR1/w4w3HrtGEguB/fd0+DfJqN2xVPYu+EJ1DS34N6Rfl8kM+wamwoGk8xgYn6FdCy0Rw/mzzmZ8+fQ6PEMSrMDqauhCsQtXsXnPuznKRUx8D6igbK9p1L6ftfwfbjkSj/25rLX3zE6M2tFPhUDAp0t4DyIkXIcSjCqHwlsH6mj+8CX6JyVRBeGTLkg7tS4NrpqVie4wAZmybAEZ8xJHp8FbwdJYDf7sfh0ROT6JjRHFi4OhNiwQpfG67nyCtTYOyuXRSVNhamd86ni8XZnHGlFrcVLMf/Ju0iPccX8FBSAWPabEDMVBkl5p9E3Snp1KbuzW5j5+FPGgJ/sVz8PgXBrdKeVPeMhmHLdio/cZ5/FU9BnRW5LPoulwWP76bmb/4gneqA8f1P8U+ZGqxtNQaYdQqkxaK5ep0kmD3ayVtbR1KI3X2oXeHJDf1XOHr9WDiyxxmbt5xk98CvNOKWPbqKi4OX11/Utg6mtrFm6OnQxgZHEYY3+nPKtr04rXoNvbwSxIvf6NPF4VraGu5IOR6juHTfcpBLEILFy67xqQdXyFHZBS43r+BpH52pvnMDjlnF9C1iAWcp3uBbhtawr3o6/CkaBav11OiKfgUPF7ZD2fB+kFLbwQVlK7DybhtldYvBoX2b8Oi6vyzv6w2Ony/Ax31H+Pjo5VA6PxaNJV5yhHUgzdQliJ16i82U3oKf70I0dt8KiYapYBO1lGtGZ0CJ+imYpz8CtwsJgI+APE1LzqfYIWEY9jkEy11H4L8ZW8H9pz9YhtrR0La/VLRQFQblbrNh2gbItn6MGnvnQvzKETS0UghXnfkAmtGXYW99G+Z2KMDOisUgNbeGPoba0o+021yZmUP7Nv7m+VNGk3VPAPPhEzT+qwVczE2hqyXXqHj1Qjolc59DQpIhJvU7T7v2h0JmXeF9ls9ZWFIejPPyWBz+0HSlW7D2+UO8NvYmZyU408WOIljo58mBN0TI0EEOfjnI4K1nJ1Hg13n8rfgABX3quP6TDf5cUMwu02dTeNw2FDokAN63zOjxliw2bHSD0LUXsSaui9x2avM1/TaUeWSPp7au5VMeCPK7q0nzcgSUr1OBIpFkbF5CcHrdSXS9t5G3C5zAvaGubDlWCbZaTcMXDjXg3PYVvXJ3w+cX9Rxk7UY9T4Dtb25HjTRnypAThklpPeTABpwMPvDnhSpKV1nA69khcFH4P7ph0wg+s8fC0p/jIE5pK88V2E2XsxaBpeBh+pK5h3T3LID7l5NQISOebL4vBz9nPXi4rB1sVX+g4Zw22CRmzjObBCg3sYMCVFxhnG0eiz5MoSYRa1g2OQpTe/xR6dxSXvWqErKsvuBmiS5yH5EH9n+Pg8ATJ+5vlYOf1s7QdNgMCqddo1fpobA0Th/FJyzHdfqTya74Op74T58il0jCzhR1zNszh5qe7UZP1Z38CDwxyvgNFk5ZSo//TiAvfyWm68pwdrcNvBx9HvMMT5Lu7PNwJcCJnk0fjzP1FVHeXYq8V7qBpbkBDPfOpE15jyjrsyxfVg/iw7vnweZv1aiUEkYtL1+y+am3nFEsCEVbyqFRaCYvtR+gg44PoFRPH9Mym0D8/QTaVlRHK6ozYFucGrhK/octpgtQ4vdSKhVdDvvEtvDHSea4sPMD/snfyYk/00j4mwxAZTvIepbDjQQHFPdNpZ9OoSBpEED+2T004VkZdYrcQ7UaeXj9LQpuH8yio0lzqTbsETV9Ok4zDgySypFBWvPWE7/ourCpjTC8+n6M4v+sx5M1yiDbeBY+ddbhHWkdzn2vwPFRTlRoEQNz10+AXQoW2JT+E7rroyC4aiEaXdnCc/vvgt9NH7KdV0F2lVn4a9AEzG/rcs6MONafLcsdT9PAqjoBTfvCIPxkKKyyAhwQ28YT7itB75Ip/KtGimtPtUHEy6tkpTyJh8Za0jeXKJh1sxVP1P1HdMYYLip1gR6u491Z47HFN4BNX7nhaxVvrJ9rSouWTMQps6/xklZLuCSix/6GTWg2WIDPn1vT5y9fsCemkL2jQjny63Pc6FVFzWK6UPt+PRU4raYs87NIz0q5+vRZKqwvx7f19yhHrw20WR4NEwRgmfAAShWvg7NzHHHn+f/wg4U0rPAYC4pXNVBUqBzlz0WRyKAVNFv94pFjLmNMwnc6L7EeR1UV8qOsDWB4cC24Xm/gGqFVNLXUALrXPIENX37RM6Mqqv8xg28X6OCuJ0/x9oU4PBr/G79amLGusigcd+qCuTqX+XDradzSmwel8u7YNNWF5k0l7Hzmie/FbMEqUAjuyJmQeq8yhtpJYYpcAQzNkIChiMscHmSFzpvuwciiW+Aoow4hitfhmd1i9KqZAUrzhCFT/BkLK+rD7LpPzHdEYOZtb3KayMDLHeitfANWhc/EORCDb7UOgs/63bRl5BUIgFBStH/FVyIlIVz7HtjWXKTfn25QYqAR3d0nim/eNvHWwqms7HuMO4YMoOGiIjS/voWaulkUMdkXI29O5oUrtvKGecXgkz4JxGpDcdzW8RR1WQ82xozD4NA8gi8n2Lcml1+99sYMO1HUvbgMzngu553Oq+FJqAb0XOjHnTJ/We+5JGS+ucOSl/IhwlwEc5eLgejhrdC66hgkq8hBjs4YGN1jTEZhW6jO+gHdgyD6fH4Tesn64MbOUbB5TDon/daHh5J9nCv4CmyzPLH9hh5cefmP6uk4uB+LxDVxrVAS+INaS2Tgs20s7HnsgUJ5KhxdvJE6N8ZjS9tB7LoHWKr8gLLcnWD1TCF4NLKb/uTNpmPHX8Dne5NA3qKDpB83wnexv+xWqsrlMaMwecgIzm+ejfcVWjmkfgcJ9V+EVG91eP04jUdk7gT5F3W4dtp6mL7cCu7o3Ae/PFWM1/2Ism8fU+KaxTTjeg0fN66kb5WT6fzraCglMeiPucX/AgbwkVQ0lWx8zWcXONCK2Me48mMeRZiE0SkRO2xYrwVLolv51rI+LHHuRvVj23HQD6n+lRntnJSAW97sJVXrIxw3WxXGdv6mszfv8MeRaeQ4cyx3ac9BNI2BM9tCODCqmIpfe6LGflGQ+p0A0x7pwolJSZBmOYIcm2tge/JGTN7vzKN31HOsrCaM0tMHj5T5pPzfaig+Hget3SOYLH7ggGIuuTrbQM8oKxw4o4Jm4ZbQ1vMCYhcAZU17i74Z5dD59Rvrbe4ip3nJELZADs7tL+WPW2zBrduS5421JC5Xxj2XDKDOvBY1jAfA8fVqaNd4yhry88lQRgTk/t5n969t8ODAGVqraoUPpZYBu4+m0Jv1UOtaBnpN9zn74nhIvrmFHmjr0oTrFZzeOoVWr9aCDYnKGJYtg29ylVn4yw12OycL5zu2woHgIT7eoIkPJ+9Fz/6ntPT0JGi0d2EXOTG6+8kZLfPlQb4unfNOFqHu1lLu7e/jN80v4Ns9X9w6+ha2OsrxFOlSDnmuButSn7LNjhdk1ytAAWNv0gj1h5T7XgslHlRAjKsmnNj/AnsXmcCSY7k0U3gRPRzhC/mv/Tn/7BQGMzVIm6ZAH7y/UU6/LbsaqIPs3/8gpFWSc8t+c4LODmzSZlqV2QcYYIJDP5MYdjzHcg89GGWhjnJXZrKzgAPUZVajSfp1Dns3GuHRQyhSmEd1J+tpxmdb8FmhihvyS3FsQBtqNfdTY7QKXbLIpeArByG7IxzX6M1AvqAM60qKwESwCWLu5sBNpz+gaHiWqgQfo03+KRD+JM9vdKdz3xwRqE/qgPr/ZuKiMbkk5ejF816IUWOFOG0z8KE7vhk4sm0Si5hbQOV0KzQKuM8iH+9QU0QrB3xzQxWfYXp9aDN+rp6JtwpmUpclwHmX7bgpTpfzd0XCln+fccYrorTwsxQsdJxvae0CowNKFCkqDJ/G/6aFRb2gXL2NA2Q0aW+YKAjbRiM4dYHjoR0g82kjfnDXhej2cpjyux11iyfS/oR2dK5MIcfPy8EhaCl+T5XldIVYFKtXgTLexT90JcG41ZdaPRfi1PEjyNluMTgl3scf3c/p0euVeOCHNHR9j2XjmWtxeJoJna7azw0zLvDOd7Pp7LI7dEAgHqadXk22Vw1g0it5NIqdgW9+J4BP9ngofRcDCoWI74/kwBf3dqyY4gIBgjJwXe0MmsWu4/9aLaEtR5ka9gjSien+ePVwHvsYX+KP2zohd9VEeJkbA+06cmTj6MM99xtglGs6uZiP5/IRW2BQvIxYMJPSrBhM7xqinvdVDJ+RhhxWg6uGxlCl/SM22b0Rcgo1WE0umepHi8IPb13+lXkNPhUnsm28Iz5VdkbUCkR3MQO8cCQYx7k0crumIdxeVEiBLUvgm/M2fPv+Api9Ws+by5JB/u5Y0Hlqh8uytnDNDUloS7Kkn2894dPRAViz6gvvut8HbR/bcd21kdQQYs5yM97iN7URcLFfGNbbK3FeySt+aFFIsd4KsNRfDaqnTMCmrKUUWV6PU4bkoOTPbxAsHI1TdI7CyHv3ISu+BlZkRvDk4Ung/LoZI5QW8DgBaZC8bsPLC5rw1Q4r+LV6DkgFbIRNigshIfsc3q9ohttjRFHzqCKsVvsFKaWzOOPcf9iyMg/CX/TjGOFnvC5kK7u+WILHxxuxTMoYMBZ/BudLV+EirzT0sreHwT96ZBqxjCt2NYKuQB4Z1ixFPSFLcFiWwa4TJeDZRBcu14nC43WCdOr0arr2SAnOnxXC0Nd5+EhXENJmBKNCxhJqtI2gy5MyoS3nCzTnSLKNhDqlmnehkHEEPtVSAY8lF3BD/TCWn6qFHcEV7BziSsYFv1Eno5FGNFWihcJBFLuvD/Hjs2D3jUS4cXQbPXbqhznla9n2qRguEk/hLX4VGJ3ey4efjQWJsCCSSn0AmWs66JvuCdYcVYZ9C5O49W4MtWd1oHamL0rdkIObj6XB4mceHHdyRRUpE4rP/8Um50Io/8IbXCX5m44+SiKlbboweDUS3m14iN2NuWyaagWnl8mjwOwW+mT5i5XiXuK0ikK4ma8KnZ2W9IX16GSpNYXJbiD5fA04Hr0a0m+mc/LsN7BWdRHHjzOAmZLefEJ8HH+31+WW/cvQ/UMPSb9ZBKP+FcKJoIs4JqCabzhaQvMkSXJoLaOM93VgfD2B9C+/Quv2G7D01yac+OY0DjcgLVikA4cGy3Dt+zUYdbwPv07s5v86vpPqQAtLj9yA84ZV8bD6Rvh5dhRUq90GiTuRtH/9bAQtN9R/fw/2eUWT2XXiDeMPsuJQKU9vMYGa4Dds3yeJItOe0LGeBGqXMsGCrokURMpk1X4G0bIIjj7WhhNqAYjzdMCobiude/+GFv2twOJzZjA8LEDrRa5j0pqDkFCoA49TM3CAFGjFrGG0GduIM8a0wYJrLTxKQBn3dWaCyKRC9KkcDfEpldzGadyZbwyHu+/AkWWbWezCDnypfpINjZ9xTPJn/CooAF0CElCracu3fsXiLJUizBIZgIdWP3CN1gK+9DIHf69bSEeWToUP4u85SbYWk93H0rE7DTzHJgXOVy3E36kVHHN2GFWeZuPdxdLw7vQJCG7vx6CRuzlD0Y8neq/FN+d+QoXITPRLEWCTmlAon6UIJ5y8+PaHUB5bexRkT32j1avqYGtcN2+7uwO7Kp5itYQKnRw9BVYbGeOk/IMcL95KZpsPUeuCHoq07+ZNN97xyMpMvhj0AkauUISI2yUk++4LTUzVJK/vEylE7w+Ni7JAbwsx0iqtR6/aRBivIAvvOxivdRdRiIkslIssxGn5YTxxtAvfrxaG4yiPHeUf2fOSItgeFeOxoIxFj17BtJNnUPmpART2LoaWAWL788044nQDpmobwrCQOfd9usTtrtIc9zoTJ1cFUKvlSbQWP0Yl0pX8ZsCb+u0Ils85xdvfjeOL1hkwecQYPt4Xx03HHLGv8B31TX7Fs00lWGaMDmzcWAslyuuob1E4FLz1g8U/3Nl98Sg02buWjpW4AXvaYXugLOxZq0B1QjtpjaEYWgmFQ7+PB01xmYXJmtK4WfAzqH0xR8FSAXipLkLRlcfguvhs3LiukkWjvnLJmbn445gZr09LpFGLDrGYmABYW6iQgFIiPYnS4SNp+wheXqArcz6Qw4k+lJPRJizKh4AUCyhR3I8HutNIRnErPe3fzKkmnRys7gej1GpQXvcUHKyM4DnWpnD/FsGAhhFbjfwHO1LO8p94Mb7pJ8kH7Fpgj/A0cKl7Au/nGkLnkWpYUdNPgnKifCnoDqiI9OKmk9shVKQfRBviqbbTBMq+A0xYmcrrdedTsnocnR4CUC7MwLyPkTz/4SX2ez0ZdHVWc5vYVKg1sWX9XAuSuLMEz2ndJh+h8aS/SADkpiRz2ZtmtDZ4xhoN6vA1eB4/mzhEv10FQSNBm4KPq4LkNVEco3UWf1a005Ro4OSxxhB07yjk+YWy8G9TENimgFUDZdA97wr9zf4J5jun4v7qILYoVYdzYYno0jaCEivjofbGEvxncIcnj3PBer948LSLgJufBODyRV2Iy7QDXO1MeokB9EFziHRlD5F5UBh5jm1E9+44eHDCDIvvTwVhGV9qcttPD9Wn89mFj2H32dVg5voHsv/bj5r1u2iRTzm7JdpA/ey11KfQQWlr39PokFD4sFMVpxbtpUm9PbhwrxF1TQjHX3/FYe9TIbod+oUlalbxgZH7MHryZt5w0w7vlC6lus/1UBxYhEkVWqC3Q5S9vpuSpdsGXJi0li5omvOVZQdx1NW5UB0yF+I2ydCbGilYufU9XTh/CnMfdMHzyk5+b9kFElPEaNaaJBhuq4GsQnFwC5CCHxE25LvsPkeqn6aVb8vI78Y/NIp/wk8C03HzqKl0oOEAePRrwrDeERzWC+aJegUokTHMoTjA93NiebrsOGw/b44JUWI4KGIL21ofoOBfb0qfH8vF8oGk1X2XndaKotuWCGh/v5Fz7q5hg1xz8Nkegxoij8GoIAF+oifki89nm902fD3SmC5fV+QfO/fA0T5jCNi0EgPt40EwmdjtYyV6zPIl0cp9fFR6N92tGUC1iB/QfGoK7E4rJP8xvegx1oC1pvbx9j2XObhRm9PXJoKJuB2YLgwgR2szEHOegAuXHmbbny95/bHN6OhwEV8/nY0LzWehMX7m8sl/YdVmLcjZ4U8PTm8Cz62a0FT7kT/kXqX6iPXstDSMX9x8y22OH7BwngZMWGRKmSNOMW6ppihtV5ozbSRe6OxG9TQnUB7xhIxUDGjtbQano024I/sy277LpyWVN3FL8SfW/GbMSzr2wQmztazknsES7Xqg4+fJW7fF4IsYdag9jXT4zGs6GrwT7y56iHsrpXGF3UxuqxWFG1r2OPxuKRcoGlHTjBlgdOU/OvifG3z4IA7e1uuxKVqT1ucbwG8nb5qntY+yV8bSioZ79OMk0a/aZJwytAaWHOtBsSOnoDJbEdRjEsjk+1cs2bwVK3OXQmp4NyidCIGAS9NRpsaF5o+u4N13bGBS5EESXl1Aa3YWw4Tz1pzWn0+uUyN5uYsm3Sw9hwm/Kqlimi3kbF8PixynosDxNTzWOhLsJ3fxtNsikK3xBE688qHH/pu5T5chNXcH3tIaoLdKjjglq4C2j5aGHaPH8Jbmp5jWLEO/IlKobbQRDLzYAKvdoknYvQjgaCqUCx5k61BNfPzuIL0QUqOIna2osEIcun9toAktQXT21lhwEg2gxlaEZZ5x7Hiykib/KcDoSsZ5LxVBhLzZvfUP1/f5kJTqcwxp6qMCv28cLyNOTk6TQGbWHhD7OhoM/fawkfMG6OpBOO0xmr/OUYI19xqp9MBlmKf1GIRty8GzdCycz/sJT4Pm0JEGCZ4i/w2ajc3hDBjDnBPS4HnnNJq0I3dbjoB5K/qwuSCblx4r5VqbdNqpqE/muh8oJk4PRA+0k4WxBBQeQnjT4UCOpxNg0vdAuF9mA6FfBtB/tyjuWtNLuak+fOqwJfs4CsBH36Wwy6mNdy5GcvWsgs4T66G8fjFvOWtFN5MsechFizUyVWH2ILBaqjOZ+ZzDxN0ueG/oMG4r2MGi/d404nA0FQsY8EMJZcAlThgD4fxeqh8TlPy445AcWn2KY+8lQzj3yyZYMTWdbybrwH/VLfD+4x/G1jCMHk7m2oV65Lp4BpUsXcxNIn6st9sLrneJQr5PDUd5ZUDvwzqyxB5YHKVLmRHF2DJ6A6x/PQ4zjUO5K8wAvP+lgWuTEGdr+fKr8F9ssPIpRThvRvMV2fDikhFVjGqGE6ETYeXzB3BJfSp0vBjJixsESXN2AyL9Zt0LB3DVeFc+NVMdvQwswF6wBb7fkYGH1xfxH4tTvNHCFl47aMLZMi04eNGcCyZkkkfdVJj8pJRvxj7BN7n/8PZsS7yrZgfiET50ZK87t5THwoNDBXT6uDEkJBhCQdtubNvfBIIvW6mvMh5ypwtghmstLfpdBs+r+qjKYjJ0mYSQjskAHo0O5aD3ajxbqZjbuxtwV1UuTHCeRZtqgkhMwBps9MdjoE03KsU2werMG6x4ifBhSxD9GzrFOnVFPHHqbb43bAx710rDwNgWKO2q5JN2K/HvvmBq2Lwc5S/1YYrpSyrbaMFqQ4ogVLyY3FdrYMwDT/6ou5cbLt7F8z968ciTKZBua8VhaiboKqQAfqWx9OPuJfKSrEFpNxWaMEOFY24/w1niHzimqQZfaTlBx3YreKxRQUUaspCgfgQsi6t4/nhzLn7qyD/yYnnCiKv06HgUT5gvC+X7UrmxxQi/fviAtnpSGKW4gHo0P4BXbD9ujxmiBUoW4CkmB/P/LGGh4NV4T2AUzp+ij57TMsFpx3FWcrZF7Y++9LMxgKUrDaDGIRZ8FjXQ6AO7sXz3M644lIAvLEex258z/H5KA/T6eJEWCIC491m6MXMcy826ykWXSvFK/CC0H2lm37THfH6CC4zcsA7fgBV86vSC+UO1UHJjB/54EQFST0z5ZtopSD+/hDfkvKKjue1sm64PnkafafhhM/e/y0bPhwug5Olfvv0xGKd1/MOFR5JJvWIUXyw3gA2zltKZae+5ITOJS8tUaM5XBVxgWcUf/tTAzcFSOP01DkJaRsL5v4/BMSgc5Sb1w6byAn4/ZwJvet9Idsn9JPSwBYcOWqPnFE247bGMpgucguPJHbRVV5wdwluhYEkJvDVPJbEsCWj2igSVTCl4GZPI6rukaWjBfgp/W0LrF71CyTdNIPHyG+tPrcUfgm+56Z0tiMS94mSVdlriG0F/pXdSsrcvZvhORKuZHpAS4kWCVYuhR18PnhpW00vTYBDmO5gmmY4Cc3/S3GPpFOS2GfyjfkKVmx62fbOCEVu6WXxmIe3aGIALdn+AqIUJ+PSOOeQeFYXrfcN0LcuOoo6IwtmAPzyneTGc0NgGZ40UOehjEavu08L6Az5gf9cSC5M62DxyEgwdv40HQ+JpnPIAjTs9Dr5s6ufT06VgZ8wNOPdiJ8w2IfIpFANK6sMpy/7xnKsu3GeXDRc0S1hXWxVat56iS6l/8IxgL6+VHgXXxhPo63XA+J9VMMlbhCa+aaZ+kQeIAVtAKfUwHCpwAtVx2nDZ8BxIHegBu9pFaHfLHr488cISmALRI07jtI318CPUnHyfMQjV91DTU190qTiBRSN9MPyoLjUq/sMECW2+YfYGbslb4gMPK+j0XwzlY/9DCd8M+NGpSH2fPSlxvC9WYzxOa7Wm3W0xoL1MEF4FmaDavFn46kcQip7x4fuXDqDHykwQkdTj8K3WUFPcgDbatjBRyB2KZ9pieMR6LLlxB9q8dODBqG/4x7OR/wtwwuduqrxbxQJ0P+3HFAlzXFzcw3lh2YzrfpJrYD0fl6pg05YNbBPrylaPLCHx2mbs0P9I69NKuKJ1JFwvUOH3FyfShI8qvCE4GDbYBOE6R2OoiTnDVnHBNL4rkHvKiumvZR8oBUixh7ge9nYaQHPQay5aaQrxaVIwY+F9VnEZwMKf9/C03CAWxKmxqOVtnry9E12zt0P3GguIUAwn6Shl2lL2iq/+MwGrOUzHhMJw8vtRWDS8jDt+d9HPIGk4K1PA9UOa2Nh+CpuUDvCsN98h84gR9W0u4CjHLjrdf4cTO+VgzIA311k5kpoc8axXU1nfqBBVyu6iaYYZ3QRBvnFnDv27YQQv7YZpZXU91U1Wg8yoCh4z6Mk6sdEgmuHKfmLHMPKBBG27IAFrLjhCt0cSRTnXc1qvGl55voG9Px7gf7dF4LV+PJzPVIYl00WgSGw5D97Zje8yXHip1HTy76rE+EgxbjtczuHfv8LH6lCW75eD/YFrODD0D+xpcyUZ+9NolVCPf0M9wDRTkpY9FeCpK6z4cpQAdDjepkKfWezgLYnm0wXY4LQL3RwfioHaq3ixWCrf7H0Bo14aQW5CFJhML+d7s0qgb8I0mLX6Ixc1CtFi729cbj0VVuyQwsz5ZnB/9F7OLrOj32cW0I5HdRCmrY85OgHwOm+Ypg4+w9FDEyl25hiYtusgUbwtK9ol4rynpri5WJA9+Ab/W/sX9J+m4rezepz1wQw2zdCjnTnEeLqGNDt/UHnaIj6RPYVaPw9C0zVZbFsVRTvkBGB12mnwN2whXwd/KklqQoVodV4VMoEvLW5Fi6Xv0cbpPgxvMYRJpdd5pOBrbDx9gsL3qELZl5fw+6A0i1ldpW8DBfDlSTmRkjrsMl8Cvfv8edftSSBSJoGHxK9QbORIOKIjjzcE4rE2TR3nrZ0AwR5pHKoyyD66+jyy1RoUGnxh6sYwstECKPs8kk96iEKaig7MMjXkewsa0URRB2yfrSUrN2nuytWEbu01bKVTT7fOL4GPqQjxZ8zpz7LLZHRAjcTCu3i+hjM62M/CAal1pB2hD+8Cm2HE33Eg8M8WisWscfOEKFwYUAcn9O/Tt669KBepTPUz/kHLxXwqVNSBJX8u0D0RbUgxS+IfKhuhZc41qJ94lC4pr4SDi6VhQ1Mzr1o4FZzySqh8ngvttrVCoT++OBimgKbLt8Oyczm4lM9z7+cArDsoAvKL12HH4+l4J96NjwZdgptlyMIDJ1Fj6kxeFxQMtV/2gL7daPiz7QyEJT3FsSdq2G/ZPhKPzQKTmXNRe88NDq/LhHWfP3FrtjDEmvTCtFVJxO2bIFlhD63eaE3bu49wU1UIxfRuhr0i0yl59GhoHHOFDVs/keyVZlwnPReGtzhS++Us7L78k5rGHELZsAAcKjCDo5/MsbvEF9bvH4INgfbQ0i4GMVfHYsZpPVb07wOr0z2UOl0LsrR/gu3Iuzx+/nsKCL7EQaIu5F6WwfHrL1JCkSNxZRAUTlIBo5xeKNO3Z6sXRTCm6wa8++DBB2dk04FHgqTc0s7HowNRfIMVjBSbwM/aXOHlejH47406bVGYxzdHr2DxJ/GoryPNA+vu4o09AMqZ38C9MBfOfj/Fd/qXwsNdxRQ524Dc1CeihIEYrQr9DvldZpC//SUf//gFnu+7ih57ttM0v+307Ecxzc/YgRPTPkO33jBZyIyE2KNbqeLZK147bxY01Bxho2oR7nD/i1HP59CYgjlYpJAFrnoGcMG0FGb3vYZGt4v4bUsbfz+sBrpWB3HB7wp0GWfLqmG1cExfFoIfuVJzSibrh3mS5LccFDwRB/rj2kCyxIKq4Sf8x1dZ+8A4qHm0DFwDHnDazS3o2+RJwa636dRFAUjYFQM/W6VhS+p79hG2heT6ubx0hRFE+ldBxYE+mPliEjrqOIPlDkMMPxDNkV82kOJWU4hufEOCV/6hrvhYuiJ8js+abGd2X472j/5BhutLlDkzH/uFVSA7/zav8pCFn3tVsS7REmz8f8MbmVsY1fMfXpp/C1PX2NPiHiX4OaeIuwrD6GbRMjr9NQJfKtfgSfVMunq4i6IPx5JlxTYUkdaAjJdeWJdQBj9UXkPswHW6vrSMT1y4xO+v7MMugV767hbFATAKTt6X413BUnBL+iWcslaDkbU3cfmYu2S//BuLrRzgkz8NQDVrJAS6RuGsIx2geTcRlpVO42m2y2Hv026QKtuEA3ab4fisEzD9uhX4q+RS0+yRtDVyLeHjR9CZ7Yvngt6zp/59tvMRR/eeWvidZA7Rd2yxfflhyu37Dq+nBoFjfyOekXlDO40+YcKCGpD+dIGCXQxgbVc6VxySY9PvAmx23Bd8JQX5QtULfC02n2Xu3WMr5SqynmINkx8OYIdJCJ/8t4ofaJfSF1tT0ouowuzL67HpcgX6Xr7HP45PhPKrkbzfZDz9a2/guWKOeCAoFvMENyEO3+LJ9WZYv1iLPmmOhSkd3djebIpvMs9RY7QQ9v+ygRUnmC9pzmfuXUmT10yg3n8GsMHCGJyK7eFEhQTHZd7FZ1Py+WJDIitP9CbzvhBWmyiPkiFWUKhizZNnf6af/xN3H4pAKGoAgP9BtkhGRmZIiswSGVkV7aWIhISolJGGojIykiIp2lQKKQ0NaUgRp0ESUUkhpFKK7mPcJ/meNoHb9+m8oUOdBruqSVexj07tmMpCN2/hDysZKPJezwWZNzFkSxgrXpShk6518N9pQbx/UQRubpbAVulKKG0dB55KT/Hg7SIYHI4Ai7AYWPB+JeqaTCMlqyS+9+IlPrsfyfFq2jBifBP0XhrC9Rsy6IFuBLgrLQc5kZ94tDMTfO9dwJKsPq49MAJsU25S/BFjsk3KojWWMZQSKoqVqp30qx14rrk4NJ/xx9JWMzCycgOz6xcp+OYUNFn+jj/E/WITOM1vOuRB5nM1slMtH+xWgnIogZPCbVCsp4Jzbnzi+zflccwhb5i28Cdt1Kpl4SkWXGdhBMpmj7liykswcYzGqnNa2KtzkdSn+nFWfDw8OlSPIfs9YflYSzAROw4vGn3YpmoQ9Y9I8rJaHVh7vpSDw16xQ5sbiyYGYdmPKZDhLsjlcespo/AfryoU47D6G2xVO5vU1nwgx813IMvflt3vKsKCgRjolfvK1ob5vHDwOPocl8b2no/c9v4smr7UAlmlM5RwZxwo131Bs0hXxIFGGnlnFp1xFqP7ml+huvkPR1uZ4ztVZw69rQPhZ6PIbu00vhVeTGvm69H8WmueaHebPodU0+cdcuQ8KRbVm4wBRStxQfEHfrD7EE3IMIe9f/uxJr6FZpu+gUvLiBbsOANrNEZB751OZs8amtZsjQH3DuLy+dKwGOphvI46N71sgEOdaZRcOQZq37VD1IHZ5LrqDMn0G7HIgneQ+/U9B+qLoIA5krf5brxjMgFe/jkApvttYUOzAk3N9EU5+SHefq8cvH0W8zHLj3B4Zyy8mzARwjXm4cz6a/Qg7wCEzbkP82RuckKIK5jVFcO36D9gVRiMd4rkYExkIl/9fpiWe2iCzMBK0hwBNEu3Etsr53NiSSuMuCjGPYHakOX4jb8WivNe1Rtsdk+edK9qoYzRURL6YUUl6rGQ613EfRO0QFFiNBU6O9N6X4a46OvUvVqVd0vbYkHUJBBNKMXVfhZs+3kCpEiksb+nOn4tOE/+F5VI8Isoxc3u5aV1iJVzjTHRbSo16OiAu9oIGLz1BzJWfkBIv08KfTn47a0wVExahKI9hfh6kzQNdmhCSMh9lDFKwxJYxesuTsYwj9NYdPYSbc0MoFclqyhnaDHVrbeApUPmfLWoFLdruOGkseEgeNKdhztqoc7MiZ6GWuLwp+3UqjoVrsvFgOyfeEitmoPdMqagPi4XJJ20SC7/K4R9OkOzhts500AdHvak8+k0H/w59g4b18ewi905WKyYTM8vyEPq30o6KimBlmNUoMhxgK3vDuO1Dbq42LyUs71S+fHcE3TywlTYX51E+n02fCpbGRIba0FgRwsJWGmgtEAj3LHLpckxn3DNFRv+d84bp9wq5vQDU8FHxJ7SxtRRzpaVbLGsEbu6M5mmC9HYKevAQ28Opp1ZiY8/TQTD/d3cEP6T7KPVuTTtHLZ5ucDUha30d3AYxT/Ik96jWnS9bggio7/CKfGD1K2Ux4aiRtCndYK75jSB5WpjrljSi/mJebjLaRLUMWLFuSu8xtAW3s17hJ3xB+Blci30as9EjcC7nHghm6oey0DSpGyykirGCV4e0PD0F5iMiAPFY0o8VlETDg2XU7D8TYiYKQdXJAQw9sBp7D5zk1OVv6Jt/iDVe/2CDVHnOKjLDntd51K0sznIl2phUo8HrX7fh6kPd6JeswAfu/odn88ciXmuGfTRu4XffNGC7PPvYO5NUc6XaqBDyUew0/cHrviqTJKfrGjBW0cUcD8DnRLaIPj5GflM8yf7YS143OeBSnm2dOROFV/LfAhlMsvw6OJ9YPpADnIWW+Cu5Uv4UV0on74YzDFt38hs3ARoOn0BrSfNY6nkY/BtsyBsmBJH/VeHaXjPSP6hbsd/2034YrUldfhvgbcrZ3JDuyvH5hBsjjgNtnbFFLfoGx5teYipsv1k/+gBmRp1s2efE8W8/cujJQCefhfj7M0hsK9sNu5cNJtOlU6iYxX7IDn/Plxzvgt73SvxpIMhmNsYobqcG9tkJkLXqmP096QTOniJwvdLCfjhlyjZrZhMv88gzHiRhl0F98FSOYfXrJWEX4p1oKMly7UVmfBj4ghOum1HBUUCMPenJM+Ifs/mlqI0PzkAZXtT8UX0M5QOa2HNdiG6c2sxbVGYAvhFhI82X0fpoQqWPv2CSj8nwuTP8Zgf2I2RQ5sw0LGbrTfLwpoT4Vg28RSMdpGCccE/4Pepr3DzuDZuXfETnXoScdrESpwWPAa+OTTzgNc2XJc2jEGpkuh7TIHO20+jql+7UC57Kf54+QeuvpKEti938LfDNjDxfMSnxuzGsNfhBE1RdOdeN76NTUD3zwvR9KAgZH5fwGV7ZtMEgzRedMaMpc5Yw4RFtbjJtpkDNy9An/QmPrxKB+Z4CUHx8o0wU/QXDUQFwuQ3IjxqXRKaWDRDo5wybvHcQHPFdcGxwp4P3K+G3mNWVN4di8f3d1GCmx1Jjz7LUz6bUrLCah6snQprxa9zcOUwD7cUQ2neFQiQ+cDf9txGHRyBkx+mU+bOhfRipzCcCW1CpSXPaXn5SLQaVc0Nb3+R/Kdovu5WQ5Lpl6A1+z+cUmwNgg+aWeqxFhnprAeHNk3c9uQWHlavxtP/3LjwyAWO3aFE6api8LNPH00Kz9NI0ZV01S+YI26YUocNwdDk2eD6KQNSLWZywX1NKDG9Qkk/KsDT5wqfCFYF6x8pNFe2l26qCPL4sfJ8d58e/y6XhqHSWDq45i3pXfzIBmqNUHn5NC3ebUIVMcZ05K4u2uY6wzVbMzAPBVSk1exW/g6DlGZQgwLyn60VVDh9G0z2MQG3PEvKIiOQ71SjQmdT7lASpTqzmfC0XZJPJryhWWkLSP/8MojO/MbLzylB1ApREpB1pEJbW84+5YGSZ6KwZsMtcF53CG445mFi8izSeqUFJ59fgud9c+jCzXFwYEMI3ktBnjVLEPZ5bMfrVdtxt5M7rq9Rg32PD0PcLREK2m/Py2YlcUjnXZQZns51t4IpqtmQ9ylKYObYEXBt4jNc6y7O3ku8WbsgD+/cBjx3rYKfWwqwm3sr+8VfB1VXBTjqNR7vp0+nKW1FIJAVzss715Geyhg+9gYx/5k5BZ0WB1s/HQjtb4WzF89j6FEbDCNXHv62CDypHLytAb+sC0JfjXf4ono8yN/8y6L+SbTh0kYseXMfD0jMpwjR9yyjaAeyO76Rl/MUvHFZH3yDH5CNdBvaSDrCfMG/uMzMlR4clOPE/wa4/kITzwmMB6Pt6pB/bytIBbzmX9eDKcJMlwI+laDb/RnQL7YR1M2OItRI8qfTZqCe6wZzF27EbVN2UvWFZXgsspQlxgvhpI3ZMPVfOZfFbKAzTqPh5bYJ7DPUzmH9eThZ4jz92HgODRSPs5JOP/eaP2fnAxkwu0gI0k2E+IMI8fhOeSx09ObX/fLww1kGNp/uJzP5RFyZ2wbH5WVA7r02NV0Q4T+GA3j2fA75pkznBb/n8MRrSbw0sJHy1VeS6xsRuGR1H6wNJKHeTwU+SIxglYOveEPDcnrnsgeS+s6A/2FxnKqgCWvr63HzCyO0fO0NUp8Xor+9K1c4+PKTgwE4+tIhXNv0mZOlxoCoeSma597BOV376MB7NTycZQQzXw2gyZ8VrBWsggqhW+lvpQR8TtlK7T0auPJgO5aZuZJamBy3316IinJl/HJPKooG5aPBVoYwekKL754EyaUn6OC2deA00pKOpSyhBWZ7SM98KwUsdyHtT1KgfUGIm0e7Q36XNX57YAeCo7s4xkQXt/x4QV3bvuJBOAlLi6bAqtJZrHNiA+bYjuPd69rB+uALSgiVoJGGxfhL/zRe3oqY8FQYKsJk8O7La/DhxR64eM4UbO2FsGxcGP4W3UY3FsbApvwI3mc1GuYKv4FR0nsBny7Cio4weiX8kG1sqnDPgRF8/W0Yuoqoo9weRXh+ZQsfdDhHo+PSaePyzXxh0B3kXxXyqp/uWCupDZP+ZuEGz1GQ0qBEg6cGcX/zPGprCYA1/yTgjchhDB1rTO9ds0H2li9LPx0LPwaNSe7tWH7y+Av6GzvhBzEBGqlYC97ja8j/0U96n7EKCveKwf7yOFa48pG0VVzQdWk1JUzsABuvF+wauI/t1+ez8y9tGDSRhmehkvxjtSelqb5CZYEePtJcxcIBZ7C+U5JGvliPHrJmsCxXEPKlZrFvlTsdHF+GPdZPyNW9h+bl1OAy8zQ+tfIUJMUnUojDVJiTaIb/NI6DTJ0zbhq9DYX/dsA7P+S7ibfoSaMdJbUm4o8uLRj2LKTy/tHgZtgLZ7uyUXjdRfSxseNmG4L3imPozBNpthRUgb6wcDo7MQrmxI7FjFGbcfOrM/jEfAWpVLdjwsoMnDrdghQ9NSCS7PlkqjGqjrfkZYmzKP3KZFzv7QTf7Z5TgdQgWx4sYPcSSzAaH8ruCmPIvWk+m98Iw97ID7A4IptWHSzD2hcrWC8wF36t0YZv9QoctLYVKv2zcA2PAtGkdaASfA3Lzrejsf8g7zrgRtaLrMF+tBs1e6+FxX6rMWmpF5pHX8Z9SSlgvssPT69cDc92SvDI25ZwZkomfpH+hx6FIdx0OJsKNyErDz6FRXlM0TgADllNtMNfFwozO+nO2k+4R3QVOz7UZ6OU6aQxZMn/JZZyteY8WPfyARu/mgybHseheZcPxHw5DA/hKh2ZZIJLkmXw0OkOaBFsoulXUlhCyghCF74HHX1hFslB+pm2gA3jsyn34khw6nRif7s8dNuwkf6sEYd5J45zt/5echubxuZe7yB5oz2ed3gM32/b8gWLKlJ2ewcLJ1iDQZg4NISIwATsZp/LXjh2eizJjTlH87w+4bZ96fjzVABHZlhCXccakpxeT3Wxe8kvwZr+PN6GVwZFaEjgD2R7ymGjTB+FrpwI44wqsTVrGhzs/488vrTxEw1FqJ/aQo++PKK5K6q5/loyzDlhDTOO1/P6c5F8yzkbVydn4IYD3TgtyYF2p0fxsr8F6NFrRzJXNeDjZQ1Q2JMGD7a0sGXpTLwpOg37TtTCqFWX2fymGri0uYLvLlPIFejEE6YjKXFJIO7dspIXHBSBL9qpFLYyCGxV46HlXxZmbTWHrmtO+NGjliOeTAM93XQ6K9eNVUdqMKnACe2kF+PP3H+0skAYIKmD0qu7UTc0nwzwE7l4r6XRQzlgfWQ0r9vXCP+9tqMbJspQs2MMuuctInedPnZQ2UNdPnvotug6Tm88S2LTRCHRrxecxphAnF81RW/8zvEPguA+i2FO93JKGMjmjmVfKFj1Iu6b/QF/GeqB7nFF1gsuh9S3HyjA7DAIp6agueUAvNbfTTcyNXn1ypX886kESEb+puPC/XRS/xvO2BBImyq2kNbeAZKvKqB1E6o5fnEROG0WBNHgCP7xQhOSBm3hheE1MHsujNLbezD3QTTdamrj9wt38oQmSegagWRwXATnd5jSOH1ndn/TQB2HVvHkPV/Z4rwxHbOfhrjcFO76fcCKkkayF6/BmmQr+vJdgc6Ge7HPjxYYFkxkxZxQWPVUHqapP6QPLREscPAG+YdXkHCAKhx0eE38Q5qyjkeD4f0MNlQRAA2FcG64HYiOskuwau0heKAQzA0bFXjv/Ms8cu90FDJ4xbqbR4DsFmX+F4u8+NJEmvNkDn87rgL2NaFsdy+d+n+PAdnXZfxziiUox8hTrv8S3l42kdVm+sKcWA1w/5BPMqeD2aAhFWedF8Hoscagv/Mh9c6Qgslhirxx6Vf4tvUiuGW50IUAdeg+KwaFQ2Z0e95oqFS9QflRp1kzvA5zxm6A3wm+VHrOHgyU76Pm/giSeJkMzdGj4WriExrRW8/nfa5A3HxBcFL25vqjo2m5kDPYNvjD084M1FZTgkOR3ewclU0SCpFgNiOKjhk/o5FVkrB3aCHc+prAlUVBNDVFC6wd0shptSMH2PdT8ftbsCfqMxjZv+I9iWEYP7+eS8cZguVGfYjIdaVFfzr4yvZZYOewm9Z+DMUDp7bT+CM6HJNynJ6VPuK1VrLQ8Ww3T3/9Haa46ZKdZi1mPVjE/RWG/GHHQvgtex08C47CqZhpULBiAJaNGYdyz91gvm42JD/pAYFZk2hFpj+473jLYUrxvO+ZNegGDpPlpWno5vQbaxtqQM+jCteYXcREeyDPm8Vc2HkOz5yVAic+SVWdv7njpxnLzuuFgVp1ODvHhSS2vODBAV/cnLaUpb5OBcWoJeh0Wx2bF23lt//l0J5Zc9m4+SwYgg/PnZRJ9fKAk7MYnJaJ8iKtIXzq50y7r5li1y4hstiowvbblNjzej3+LZai1upp0P7Kl2+VvoTUNFEeMj+IMRq+NLNrIV9YtAQ9pCNYPjCBF7WMBrXoSBSLvMSLDibyaVEz3PFpHxeHW3D9bU88sXc8RlY3w5pmPXCLbsKQsXtB33kGP+Rmrp+MnLHAGeWWbWfhHTYQsYewNUgH9neXUEm9P7n6IL5fmY0ZbeYk79fKPe6lmP3yEgtod4JxqzZc+OoF5Z55UN4WQymFS3hCdjiOvxsNN0M/4Q+5yZywphrH75kCvZ9X0tr7jnChUg2vGp3juOD9mP9MCQQaO4AF1tOxxc+hY5YqzLAypENpdvxkdAPvbRSD9/IWGNG0lyLn1MGGWF2yenmTc2NEILt3Ha/UsWFBAwfwrzDDVXo/wTvHgv/8zAbhloNY8bMRlMSM4WiZOfHuHhhXshy+/XQF1+/byUBkEHyyF5IeJVHqcldcZmYNZ5X84c6CkfRZfQJOIkFWDVTBh6NEQcBqPP033YJL/nSzVNdIMBVchzLzy3nobg2uKBakHHkt+jJHk0sidlK2XBykpveg/fpREHJImBz238WT+0OooL+DFq7aCgXXNCF9mx1qXfqCyyTf4pUfKvA65hze2JjHq5QmoW/PTriV9ArFmyNh56/pvMX0N5TbLabNEVowLNZK6nKZcP3vfR4qSMWlVQXktCUWXeKbYeT5uSCVloSvxJWhfugN1O0QIsH9pqjhshpCX4fRllk98Ha/ID/Qc8ExlZe5Z+lo2LspBp0Ngvj+UjXcK/MAIyxW8v3+Vki/5IOuEuXk912DSudrgOM/S1o8OR2DLquQjfwXitvayNdjH3DZ1ufwOqOC+zRGsNV2hDfbs9Bq4h/+T9YBfwlnsIPkMfh4VJQ2z1nG0ycs5PqQddx0whSEOqu4pW0ce1db8sc/nmiftBukmyJgcN0h0rucjePv6uLYZIKChM/wuc4Ft81M48d3HKlxxxIw0bsLd8ab4cIXhjgm6Av0S4yFGYlJvOPVRZ69QhwRCnFrUCxvabkC2deV+LXcR7hV9oWriyVhjEsSb497zF/tHuNIWsyzXkfjLs/FUPspD1Oe/qNUiV2wsVcKJkrtBs1IV9oZ/JVrjVRhVM1Usmzy42mnFqH8yRA2OJrKWysYJig2oNqPH6wwRZT13aT5cE8Pb/lzFgvHdpGMdhZ80n3GjjoMk3bF0pnsZpI9cwhm2ehy8sl6rNG1RdP2m9zh+Yu23hrJjlFaMGmlAP2eFYcdzqPheUAWSuUFw3+ZJ7h+zifaLWbGn9Ea1fabQ/D727zKPIvtk16T+ud9ILwglM88PcGW62bQx9YSvn1MCsWT9SHq8HGeerYFY1q0SdxoAFrmXMXkNctZX7yN3r29Rosal/PTywQZaua8YsAXhmz0eL7BEyzpe4yPJDdw8NJsXDXfi6Jc1Gm0J4FPqBWtT40Aqd5x8NfsKvxScqewnV9ht+kezP00FQJStvN3SS0wjX2JLbYBtOTSGIx1mMH5txdS3yEF/hidRb0GllCvvBFcXxjBoW9fIM7Pl5TMH+FLmVFQqWXOgiNTmN1WQMq2FEyOvQpXY8fCCv8GLD1cBr7We2jCkArcPXwMeyM+wJs5O+FrYRd6NBRhTIAIHCq4gyGPLrKuoh8U5y6hT68OgOfRDP75vh4ehB4GL42TfOSvDgy1jIN9M1TB+GAXX523ibQmRXPKnPdUvCeHH2g+wLQxZeA1IAmvbyVTUl4vh6Rv4ZoUS0pKyafrxu+woleLxslX0ocv5+mGP0G7UzpejZiB35apc7REC7yMyqKGx3fRiqspvMkKXkVZwurNY0HPcxlMXXUSqsdYUPWmLfCucDOh1BIa0zGMJ/5TYVh7i17VyENTrSyE6fqg3eQi/vFOiWQiyoiG3tMnN1FeYO7HvdnD+OyqIKhdIbKeL80nhkeQKvbimvxSKnKOgn14Ho1T9cj7dwu/nCQCeteXslCrJ8q+FaWT8sL8SamUKsP/UIOSOKafy8HlXavRR9kaDDKaQEDEDeadD6D8/CMo+t0PfSq3wVDZaxRT3EZvj1qRrJ0RfLtgBXIv9Mlr9QuwEIykftUxaDryBRWEq0H2vVDqVethwxdmsGuxPJ36PQVUTj+Ed/23Ie7CCIy9LEOyOe9o/8hkCNxwhiueCQNaV6Lr73RYZ23LG21ScNOfrbA5+iU/zZLC4cCrXFoeDTZ/TeEvLAfnVQpYeEsIq8r7UOOKH/vyFtygVkRn/9SS7p4a+rxABnTEfVH4cyGZz38P9fbBWDFpIXVYW/HxeDFsWNCKx7euhmkqxvBzrDmpVfVR3+9yPuQyiYdulJJhYSiH6ITRhdpWsHo6Hrw1p8Lmp0O85NsIXPbHhcRcR+FTwQHoNFbFrT2xbLK3gjwehNFgmiJ09seTVL0Vz3t+D9/+dYLL3W2cvGMXvr3dSy8KVmG4rztPEdUEJ8fDdFwplE/0haNB7FmoDdxPIqf3YYmNF43zPkVH3p5CvTRxmKnwgy4WynGtviTHucvzhgFrmi0WR/2L67my5TQJ7/lBgyvloUhyMSprfqCo4kfU4z4fKi/fon+/19OKJ7+pyPUTR7XshKFQY7hm9g6Mm2+CzJtPUBubzYozZoBJmBB210hzqcZYPjAphZ/uFADPU4chu/kNX70vCIafd3LvuC5UhmAq9ruEW5vqIO28PZ6qkYI453n8q92KM0fZYEmPD7smnsP1BbPIUXsBD/QdRcfiB/Rj+lhont0JsEwK5jRPQBvXmdRStZsTdw3wokM6nLs/k2vvPeB8MYKr73xwzp7PdKslGTUeVLLjq1U03K8KDhPd+axVBpoqXAPZFBPwk76CK6XS0TRFjm6ZyWHdlr3sXr6TEt8kUdobWThTwLjDTBkSVoeitrUoPwk/yBvvAXrc/ohiszzR5XYBrLxXx0Hb33PCfjW4enYTnFgUy1reshiY+J2KD/5kpX+P4c+VpzBVXoDib7lg5aIR8GnWEjId8ICrIUxeuYUs7SvH4UI65D51AZctGsc7d7zDVUGScHpbITdUScOHoG8YfHc1HvBbSw6TBehR2RKOc04l5+rzYD9aCH5evUIGX115jtE8eFdmgf6zBWhFlwWEoDpe/ppB+blimHBZGBysjMjvXiWAwzpOG5Rl+7aLTIN6bCdYwO9c33LZ6iNk3c0wvtqNapse0eLs5dBWcBlTVf/j1KcEtpUJbD7SCeMLTTHQWwvOztOAw153sd1xCzhvHUWN+7V5gWMIeHuZg8HiVPQda8elxQi2is0UfU0Wl4l+5xtchHr378Pnx1JkscUajv4dhj1143DMKg2QtMvAxN3HWbu6klefdoP5z2JZ76sUX53gAGgiy2cDR+D2teIQuGktdb4Upp3hEuA38gJmbyqi6bHZnNM1j7WcjAju/KA7nRqw9GgIblS7RC3XV2LMyI8cEN8EX2qGofF2GR28LwlflliSQr0liKSH88yMIczrKoAPQevZcGsmPrk7kcuMU8B3uSN0rriCDz9qw9oLPuBlo0B+x7Rp579hzCxrg11No/nHp3RWE/oC/7wK6eEoYTh4+gMZaOpCR+sV+DZzBF4OOwgvdM+C6uTfZJP4Hc/9MuLCt6Pg4HFXMjNr4q7hefT8nSc6qP6FwvUp0G9YDwdsVoHntGSSS1WFgLwZ5BzsxKk5RShtuxJkNw2AfXs5/ldzgUDvKh5eNJNMS2QhMDgDNxueZNnHO8C37hqrxrvB7owJ9PC/PP7bPoUcrIJYb6YkFAY95eBdS7FxQhJle61mmQWNfMJaCLfL5qLQkhD2PryB5wWOg5YtgVCprs6NB9thhGIlTbjyiwLGAZnedEUvx7lkIBjFxrtHgrHxXpj8xZDTcmZS5fS3XJVrg69Fn9Lsi7d53ZFT1OWSwwW21tCaf5i3qp6n2s/nwMw2hKrG24OZaizdLjeijKhoqnHTY6+eScA20dStMpNGLajFpOXmpLrnDGkaRJJ7VRrEJybDFisdXnhJHsLdQ/Dzwiqs0PJG/Yh4mFXCJJglCw6rxpA9q8OEjUn05rsODJkmYsnhl3RU9wRUvXImMdd1rPx+N9+OLuQA17MgEByDUZMnwUc9X1q79CDf7DUhk/N7WWDTCOgUWIYK0ivJVOQ7Ray7Dc8mSMIv2wqOmGrNsvONYY9nOn2smkveX36xnIwkjeqSwCPVqvh3mSCot9twZoUdTsk0pvNXs6Ho8Q9+KXYTrPYRthp5gdzyIjj5SQnuXC3B0xIf6fqRTNz/NJM2uc+HjEPDvM++GcOONGDam0yStTMHgepPmCAbSK/HO3D0qPfw1jkPVJSjKOTfaS7eFEV1PkE4+8MkiLVFmFDkh/HLailsfgrdy9TBs4NNXL7OjcO/iKPZS20ulhaAKTNa4fDzRHib10+b4rpx+glV2jucQ1suVdLz3H3gLy7A/Uba0Hl6FikahdOb+VMwR0iLfiZpUH5iBrz83oqGKl00dZ8RXWNZcB+9Ht1V30KSDdGmeydwt8Izumtyirqd3pHlyGlQlruaym20YZw5s4f5P+p4MotfvTjJmfsDoMcuifYc9SS1U/U0W8MJ+xcSaH8N5XTvYHhlfw8NY9dT0WZn+h6QynOqw2EjT+SgdabwL3MSdKW9o+hcOaqxEGXFezkYKagK728dAqumi7xGdjO153bgpVFGEFZXjxeKj9DhM4vpX6Qr2mk8JqEEWfoz1ovqA5FVx+TBbzVT+LpPAYLFb8PX5Jk8sPc3uUU2c8IPCZ737SDW56pS68XFGH7bCtRLN9N03VE0sFSbInM/8reR5tzTIc3bLjmTv4AQ0sQU1k2aDhP/NAKvn0Enai3IrEscnP+sREHPjfT1TAXNm1/Ol2znU+3jsWAw7z2EROhxRPZbHPP8N1zOHcT7MvtwSZEjm9pu4Qc95VxVowd7hBCvzvBE2YiHlLp1DVt6y8ABdxU+q/4UarrF2W6pCN2stQTxeTcgreoTlt0Zh35ahagqtY4cgmvgqK0FpV6ewI31v/mvz3hYd8cetjy8hKIHIvnnhJf8TK6NhTYawqkKPdw76xTfX9tKnk0CcPnyKB73opzSrj2DnXe72e1GOY+XL2E2Os/7W7Lh/jx/9haVhfDsIxy/9BTVpWyFYtUmCCztxvLvw9jeksQu9WoUIHQRY8bpwqZhVZSUzof45T5YrPeCbkw4BgurHqIsnMQK4W1053E0pf/Vhb2i4Si8I4ypxIfNHRPwhkMbJjyX4kPqAdBxZyKuN3FnVyVLGLckCIVso6G0XQ56+r9geV49nD5VB1b9afTueggbbRpFtx6Ogqg13nj4wwJaHCXF0d8c6L81xTBfdCn6LZmOQeGjOMTkHdfMNodJ3XboMiOMlO+Fk0J9JT/tqaUzE2N4RqcvdjTXYP3oJHA214bru8eh/ObvaNk7Bn8+64DWsYd45YU+hL5UTBhrQ1EFsvhtkiJEZ//glnNH6OqXefx4WS9ZyZlCnewsXJT/Ag8rBbPKo0F4esYAIuWjOGaCB/xIm8QnSwbg1uAh8JIKJceZIXjqXxdMXrUMPvQJQDmK0XmRi6QR/4xH/o7jb4O/iW6dx95Z11m4TJOb5m3g+3+MYO7jleBU4gSLNS/wn8hMXuiVQku+PqfzMlp0VGMibM35CDqPATaNO4Z/JVxQNmQEVwhK4TbR/aRTdhNvXo7mvljAiC0xvOSEBLi/FoItDSOh4WcjKJa1oMqiTs7cFIpnqg/wl1J/3mUQCNkS1vDMawC0nOLhgv0MzJt5jO0ctkDJ3ycw9Uw8tbMsNS50IJfvkmAWWs7X4qajp14cl9/sw0lR+9G9ajtKPZyAqpbbeHxwB7oFi0N32wFwWNWKDZ+P0Y26/zA2/C25PHTlabHl/DvqNR27+ZDv3TOA5w+rKGS6Hi4Omo3S1eb0Wu0DBPnvodcrgqlPYx/LrAqikTXjYVTXbPoT8x92BAbh3V8G+N+5IVwxeycOFgWDklM8hjh+Ib8TMhA1W4CObtPkk4LuoL0zHsOzOzAi4zSMkHxIbVM9SKypGmrHGsAWOTFW9VrNqXcOUerG2bx20j76u7yan94SxY/jqtnL1A3e5MiCgm0WHx/w590bk/HD63O0UwvhgloW//3rx4efxkFN/lh4LWIK27wmwtH8p/xx+XGQe6BBfy7l4gXpRbhxzHcQUfbkO2dXwJ8CC5B+o0CdRjfgdnEuXSmdC6rGrfwj5jJ9WuEBLc2K4Ce2g9fkykBk+AlaPXkpn734lh73tuET71bss7Bkxeu7MO3CCthY6kOPnuuC8McG6J5nwi9eP4HAi44c9nEcLYxI4Q9OGRwdu4buB6mB9t/J0Kf9Dv22/Sbd8x0YLvSMbtR20tvGMPxxRpjc/gvlmHMTafTLSeAXdZ19Z4ijm0cqRKa/4Gh4Qx3FBbRq82noE1WmjrTPOM/FECo29FDal0R6pC/Gg0anYcOrkZBvKo9Dp45TecgQNKguoZ1lI8GvRxAuLt2E8kVCfEM4kccnraXQAD9e+UkHN5oV8VV3UxpYogyT9WbA1oEanHD2NjXN/wh7/Gt44usYTtwkBbYHt6CgwnwqeCIBry844GWrN1B8uJTnfbxJs6ae5VyDary1v4Iltw5DrVQ3efQLQFbMdFQtjwUJDwIJk834sSGNhzdoQXfWbCgpz6RjfRvwzioVmCZSw/X//rLIkYNoF5XADx5+BpEEa0jokoPJvQHcltzGUxK0Qd2hm5pcQuGbrTYsHbJEVw9hqhCYCLvv6vIiFz28Pm8fqJtNAeOJcRwW+ZYkYxNw+uZI2uUxmbanvMKXR+8hKvVhzORr6CFjBpsLduEaBX0u0ppNQbtOQ96SVfzn2jQeFeBJuwx7IKVBEpJ6VcHz3HtWM2vlKWtecvUJCTiSPw6H3j3DBZ2zOOjEZG61VOZuD30YEN0Epj9Fea36H9x/dAxur2qHoZxguLvWFy6Yi8GL/SdhRoksbHPMxgcSUqx4wByy+lJQxn0DbvdW4Ai3ETDhejG8uGkH7lf0oKrLjMpjjlGb/mVYNSYOZgc/4flzNOEI+0L6MT1MfQU4vFIJlD/X0/t9ObDztwyuHpkKMtsK6KymHu+bbAHLZP6AsxegwcD/jf+FugoNLi6WomkoCMb639FP7Aaah4oQLXCCo7XP0Xp4OZXsVIG2g8n8dWoBjU2NA898VT7a1Qe3f0zmqU4GqJNoy3I7BKH1jTq8abyAu4Y94MVOcfLJN8LuDUasGTQIjy4mgmGjPXpuSYMt6ybDYy8H3vg0HE4ZLebjipUUX2ZDzeaJKOqbRX0BcZgwYAaDXw3gabI8Cs0wYJ2PtjAc9wBGwSNc/245JNt5wMZN6/jeNG94lDMW2k634vtOEdS6WI0n8oOo/cxYCKi24MK3iMmPvlNcvypPC1WDwMCbSFXC3KpyF2r1fKHuxg0o276LHC9/ZL2EYV4dEEMzewzBxMgC9dZ9w57Vp2HXjxvgujCNZp3Xg3Cb9Sy2+gPNDniEfvVGoHT5OAQlruFL9xdh6jcnzFhQSMMjWrlt/Qd8M/ocvE7KgN8fAVwCD8D8XhXov6lPan1Z/MrhLrSXrocMIzeek+xB50+Fg+qECeDzL5juabhQ+lMnHPXICbxm34Xv9QnsJLyMJmXn8cEQA8psNAV+D1Speoht6mPR4NUqaK8bwbsWMu1+58LmV7JxyeAY7po0GaaVx4L2ZmceEXYQHnd8IJuPKjQ+TZxj9a/whjpgt9QY0BhQgW79v3S5wgEE9v/jsn8hrNzeSkNfX2DPnJV8e3U3npo7kytNzODRrAe0WmY2dSX/Jm2xn+i1agLW6I9AV8Xz9ER/BWSlhEG3uzFIHUPStJ6LQ2sX8Qy3O/AjbC6GF1SSGc5il1BZNB3rhy/0dGHZrxB4WaGNw88ucoN+C10wW0qFmr3UsW0Eu94Zpl9+CqC0Vw/ubxXmkSbFaK48E1wWpPE/XQWA/noI0jzFfsP+OHyqAjUyJEDgL2PMn2w+6uyAi/d1gvQtFc6tU8YL2weh5XERdcb+xqpzgvDs/D9cGnqYjm0ew8nXF5FzxC7Uq+7n+EVzSfGzBzq7xIC6LMOWdQZ4RWsRusgugEslCbDeciR/+z3ALTcOYPPLDaQcH0+Z2oKQbrEP1VJug5W1CdddusnZD8/xzDwfqF1SAaUzRPH0b2XwN9QCnxW70OKFBjw4vRs3acTh9dIU4C8VLPL1LcYsvgLHQu3p40UNWBU4k69t/IQXgiTYXSeH1Jaeo71ZIyh+bhf6Z24lh+yx5GChBuL24/HsU1fOd5nF3/TqufhFOe2Ca/ByVwp80z/OaxwLcNyAPkzNvk55o9KpSnUM5X6RhucBK1BsZh+JNPrDGOnd3PtJhPId9KEoZz/uGn0LezdO5wOPsyBgSjO/rPkO5bHf0WVXDwa+nYWW4xTBKlqG/nNTAs+IJ5B8JhBaR/ryvperOSUiAWcOPmK9diU2+WIAeyqWssGSQ/hM4REtcqmnVm0Pqm15wkstxsKT78gPBqpQWVUCfp5aS5nSs1HrrwQI6XRQwss0elhhQNN07qPRVzVsX1SM8UfHwiQ6wE2R9ti3/CDXDTXygTpNyCtcS3OfX0Pnd640d4MzZN8wghuJPui8yJ/mHbbn5a1aaDvpJaU+0YY1Pfp8SqmCro0zg/tSE2DvYApENixAy0hNOCSbi0LzvanAMIQPiObQvk8qrPSxDRbaI+wT/MnHFZ+BWo4/77Nww922Q3wqrR82vRAGi/EZuODcZzIJl4WFiTto/q9eDt22isd36sCguyznX59NoaMkWC9vAQs4+lDZWUXwa/AikcNqvH1Yj465h2LI+4msf9IZzhoylsWe4NiHE7Dx7gjI82lDkyOGqKZ8jM+PTcP9c1NJ88NdcGwbhp6YB7BaSxoHGxHWTgnAgKMFdMHEg68q1+LDzGZ4NTSfshoiab/7CGx/1s/nhwgiKlazwgYRMvwhwTcDTeGxrgc+UZlFI31/UnZwHNbtXsSXpgK0esTRmOkzYP1KJbx8Zj6onCiiD2t3UECzAb26rQ5qmXPwfI0oHAk5DHnGryDlpzuuHNME220a2Xm2He7bUAYth7aR4N1oUFebDJ9XqNEaKwFa3zeMW7aPxn7DJyD0vo6c60JxXtB/tHo807YIbRiet5zihBVoZ+Fv6i0ayV8W7iSvjjMcKWuLgeqWpP6gDpuuaEH2uFc8Oug3/J1UiPXTxPG3nzfrq/WiuZ0hym+upNHrV+ATRR2wNp/HQkuM2WHST7S0uIHF0VnQ6d+JwoekybPmBhxQKaenlyaDaqUNrtEoozHXG/iqZwfax1iySqs5as8mXHltH1/3FmXnt9Oga7wMzGnXBL3eRtSx8CAri1oKfmCJc4cP8l/3Qf6mdoCc8kXg+lx/vCSpj0utdcF/sgL2qauTRcYijp24BZyjlvDo0fJc+9IYSioOE+powDuN6Wi0PRWLyt/RkQZBmFg/lvt2nONT9Bjd/wpDn0shxbm1836Nh7TOwRlrpjwnGa9ZdMBhDBeWS8KIzYr06pMhTC2aTwJhHnBUrhwlA5qouUkV122eRicORdDvwh6u2hfPsctGwZIv++DEtR4y2bkLA/TzaG6JOirc3k/jn0XRrNvr4VLfDbo5XgimrikE7c7dOC3eGWVvL8fqq1a8Zv9n2h54g2s3ycLepmP8QXMqJAZOJcdQB1YVk6f6oSAmtSBOPyLMLl02cKj7E17+foXjVHQhYa8/7Xhii3PPGcOHAXOOEm6E2usHMPnaMR5bFMaLt35mFS0tKJpgwg8THkKOex6KrHAGqQN7yOy2MoyvKYWaBGlQT+qk0OXycPm0K0wc54G7juSit1AGfzz5DxrXLoIH92shIFAPtt1+g7tyER6LLcPxsrHcuL8eTzYlkJvLThpwSCSB1GO8wloS9UCf74wShT2B7nj9vQ6qZUTj2gNlIDK+lmxcakBr6i7YTnmkIRtC/gZy0Jm3isHiNTq1RvNVJBx1PA4OjXYkr8m6dEZ7Pzp+CcGaPnlYlpYB779tpZhOA3g6dxFmKO/gye8TKX6lB8r9mk/L91njqvoxcERjOZUsvU+yKeawaWIlG8eHY/Cf32jZMJuKfgWhVMlO1C0aAcd2vaLgRVPZRXeIxs9Zx6UC3/Dx+mv8y1mIrofIwrLeXJ5uoAvxXto4nGQGmmGaePTSG+xQF+Xke4+w3T4DrkwMAjPdq3To71jYnBTLBSVnycwvDt9Gy7KGVxwWTTKm/qX19DpWmtbfF+bMz2rguFCPXHZog65ENgluu4NHOrdT8tordGZXND21HUbZ9QbYWzkFKgplSLFAlQ2zIvHDrz9cabEVNp6ugWllLbxpnwh8tw8C1TyAO0tus8qxD5zf9hnLTeK4Qu0q7G37RRPv5uAe6dXwUqkB7oSKgt+TJRxyoQRLhb1wqFKC7vn9Ibe0DWxispg6pdWwacVIDnTTh8lTLfBx7z8qc3jKqjfno8iCJg5N2MtKxsnkOriBna+N5GONEuCldBI70RBCj32GWyO/4LPVP3lM00c4fDQdviQb01f9rRi7XwUqik/iUFI1+zz4jRFKS7gw9xv/OjOFVJU6QEoO6fWLaPivYQqoZkaCtWc1Ba+5wn3fV5Lkoig82+7F/5VJ8w4JF96o8ARFDk0FRZe9FGvszZtWT0TxDdqs2PgLRLp30iyzqfDguhBMnbKAP4Zbwy+dJFrXvgndiurgarMj+EbtwPmpAKn5dTip+RErqV3k6CvWcCHsCDeJKXPaDm/0P/cShl47gazjUzjdb0NOk5TBWFYdkssswDChje4Hn4Vpu57j+6g+tqkLxW1V9+lvmQHZvJwEfUL30GUzwX39u5x37hqNOPKQmw5tAN2hkfjc/j7rvY6Atyeq2U3+J1aqGcDWg3K0Xno7axieoOzzIhD3Ipim2nhAuf5x/LhCCmWmKaDPKFX4ves9zxSYx8est1GLoSlff5jJ9+IfYfCCHOqNngEbxSdyk5EAjM45ygX3l7KMdwnruC5htVnmKN9WD1IjgzBO4j8uu3iKFCeKgMzGPmww/Ed2oVY0MfY7ZWjEsvHAaza8PJ0uqGhgvwDwzaIxkOU+SN/sNlGSrBObXzvAcZ62PK1Pje/Z3SRJPI6O+xxAd6w0HDq0BLIyQ+h8viEfHGWEN3SSUC3yCkgWLKTWwXwI+OABJje0wBEiKfjPS85zdCbFkj8A1xOxPa4AB3f1Y/s8A1yR2IE1N83gocdmqA1fi7MVm+ga+WGpbx1Jeh7AqNXpeKCwCOsuimKelgUkRKvwNg9zdD0oTr56erhynS91+Gwg+8TDnGc/Gbwt1nLT9tGw5Lo7y3a3kXJKFl879BqzEzKo5kojT2pz4OaFxSg1MZtqNk8HL5dbVDjrLgeVvYea2XZke0KPJii54hWJMDz8yR2V6y9R6wtduGr1Aksyt4DjC8LOv/e4YOAjzAxMgaG+j5CMJeBpu4icFo6G8pPPUeKaMJR3zGb7lGow7MnA9buJK5P86b1OFgXVm4OdgSUIm89EnwWyoHa6DbsrbuPR1G1QtbAXVq2xQekx4ujfMRpzNcdB9mA/VB0Vp03iV9D9njQbKDdS+Dw1RndBNHwziKf+yfDWHhU42/6Ar2cLsnJKOry8xSDbswaif1fBhlOLaL/0Er7j28TGOeLQ9n0+dnnOYdEJ1qCdNkC/m7J4hcwLOP5SF12ldXm1zmTaJaAGNr/6wUpdleQdxfDYoYukKWVLSzptOeZ6B/8M3sZT9sjzljB56AgIpEt6tTzb4RmWdn0gz8WRvPX9T3y4TBOvxruBz4RnNCZFH9bvv0ALxX5CxdFADgwNp96o9dCb30gDt7dTU10zL0i/wndiJ0FOqhO/tRpAmXpLWJFdzksMTKB7lyf4KgST0Phi9HYf5mMycmC62xOi8jV54gQPvlolgLUD4vh8ehlHvvMj/z4/8B1ViA65shBy5xiO7TIgl89x/Pn7Nnocvon2tH/kqpDL4LtmEm12loXit7JgLrEQ7meNp+DRylRodgt+yC2DPduPU5FsD3rnbMB1DwSZg4wgykoPFq7wYJWQGziw5AAc/yhBPZ+/osi2eHj4LoQydwZwtoMSqPc2k51OBOjoTQPzB0+wdHQ8TBr9nYxOjudY25+4xLqEO7ZZQKuqMnb4h/Ce/Cl0flkJxwkaQcGAKd7NFKe60MM04dpc6rynA9k5Kym4YAh1ztnR2fcdvDb3FryJWA+ub3UpRnskLC4L4c7LFrBn8hl+frcNJrsnU5lmJZvm7II/mmH0+t4KdrnYTmdjZWGOrxkEjHrLU8WOclbeNCq5NIXXaWVS3TV3lpnvxK3u++FS9DSYIyoOwYcS6ahcLe0rzoaCnnbStbIk1bwHmFjfiqcajPBOXR62VJmCcu5/bHU8mC4IjaanX8ywyu8vXJo/luiyOGzqeogzpjpz4m152NJxjUsGJcgqpp77H/XClo1TaKrZBnr0YwV/m/4bXslehXVCMuAS+YbeCfyD518nwLmktVx+Moe+hY/jtNN/6evOBbByaBk2LlSDedOb2a3/DX3yncT2UvfQ4s47Whl+GCuL9nLIFFMKdJ2JtmaScHL5RDy7qpo2XYyiI8kx+OPNSt66xYombphLgfscUUH1ItvFE3yfcpo+Kx4F3cVDcF2jGKOLA3hI4wjZOSnAb5eXtHn9WVjrrQLXysu5T72Jd4lK0YjdCpgv042P5OtRR70NZcapMt6bz0q7FMEv/A5tz1zClTJVIL0ynDfVzaXyn+/xvW4YHHFezQUpq2nolDC8bxDjhs0LsTokBQtsgmh39TsK682Fyeu3gt7DGnjT/YXebZkO6aXLUbelgczrq/lx3GY81uZBpvIn4NlDVzw+/xuOKK4BTQkxGK1/n+rqpVDM7S7ljdAE2+8J3LB5MZyKkgTT5Gm05dd8GrlRGGqepZPGpl+keLiIpNQewrwRIzhSyAAkT2xC6BjEyrc3wNKF4UGqDIjHbWa/jzpsvKqd1p5WxdvFmvR2YR64r/Ui0egI+GYrACPTt5KtRxmPTxfnW2b5tEDkHs2cHM/jHxexzbgobP5BMDdyOkxxEsOZYoNUqH4dk+3P0vgT23DF9LlkU6sNCYs+oe2V/XxHyAjSZLr47OwQbk7TYDlrAVBL3ostbz9Tu1kkrDuZyB/1Ovllgg7UtRzj9v5TNEKinzeZ7ce9N+aAyX/mMNvSmI4JIA61p/EbTTWofFbPEWKPedMPAXyyIghmWzajj08gdlM0Lvi3FS8/y8HdJqIQqDMCb1dMRw2qBlHDF/hd5hL/xR+0MfUwyh9fC7P0h9ktURhCLDv5h2wQp39AeivymJRSgqjw7Rje9VEBSixl8ML8xSSghdAU/BNagh/iUPNdXpYozQv/vsbmrOOMOt5g71IEs0oUqCFNHEYpZ0JHuCTc7Iqm6nmCVGB2nqZG7gYnAReU19bAqGxBorARcE72L8f1X4KWbSlYEiqM8bM28g14z6X3vmHD2PHopPOIlZ8pwmPPnbRTvRF8D7uBmF0Ip/vUgOZaOa41/AU01pz9/8ehfXADwagBAH5HyF4hysgWkpmIRMoILUQaStmlNL9oKJUVoaFUZiKlJSVUFGkoJaGiNJUWCkndc+7/eNz/4uX1ArDQehOOk82kpw4VKDZcj0uWyJOdgiU9/28Brck4BvFGN7H6qiX83KmHj7My+VyWF2ifC+EFRxIhTn8LY+ZY3PZoJVZf9sdybSVQDdGDIEMbTBmywOcaK/ljAECd9Xn4muFISXX9UGoTwJvVtaDbOB/pgAJMfTKVTnek446Dt8BpVwPZW16DFoVF/M15JhtMEoSJktNgfHYeDVUlsET2ND48T5vEq57wvlV2qCPtxJpLB2DlM2sQ+iTGZzTKYfudAtw09xoE/g2CC0bbaJvWPE7vGqTra+3pQ6IlBFd1k7J7DCSbJkKKeg96vlwO8rl/0LvEHs9ut0IRy6l8JHISBKsbss2eXLqq/gf3Gr3G4PylaJX9GVtCbKD7egapv+ihyTdNYNquNrBxqIZlSn/AuDsI0f88pnzKgXWlrfj54k9ep6YK/m7WMKKhhBTu/saxTW6UHnEYw14rQe2HYlzz+iQpdH6DwJvCEC88EnLkJsDWg884TSoEs+pXoulUUyIjcRT9nIilIZ6YMuIQay21AJeDIyHLxZBk42NQykITDSx9YWRpP4XMDQafolAYWrITdk0fD4pSjtA3tA26ffZwh+dVNF8jj+f9dqDZyVcYX+oCUn9T2OqKKijWeeCFd5+p4Od28qp/BdYuBvgqN49aZe9wg3cLgmAd54qOAW5vgITVKtB8ZYB3fPdCxbPm4D9OlecIl3GA+2H2rMqlLXFqkHFMDc80haL7uib4rmENCgfl6dpNcQ4dk0H6+eUor32KS0KFwYjX0LrqdigdGUPi9oFU+iyKCjuLeLFoLJ1LDqD5Gu85UXcSOO6ZCsFf/PCiz0/aO+UJbBHdy7VmU3Blwz+4Ofo+tLjcoNtSchCytR5/1q6hl2P0cN6OhTxOyAZKJ5lgdK4+65geReOJ1+Ce00hIvTcf5uXeALExv1jtwQ8aNdhGln+LeVVtMOqrRfDRq9EkO1MedirMIDWJJi6O3wc57tcoL1EAaWcrb+kZpiPy4py2Ux6Wf9QDjfGusO7+B249ZMsLjaZBr+830t1ZA4M/tsBlCUv0lTGmGeumwN/Vc0EwOxZ3ChuAkooxNTtp0xuzv3RGbzNjTycnNZpg0A8ElcczodbMkaKcL2CMqR6+vFRNqrNcYILtfVJYlUNSXVk4eFoPNBY7opZYH11vnIcLJZuh2s0S20OvkkJIEX0eXUjqJZ145Zsl/FdzlpR2L6eW4Wp0npBIjgFb0O/XNZ50UQgO6oiAeJIxJqoQbHK/xs52J7izrYRue30FN5nfJLRdmcSOF5GH1mLY+C0KBt6Jgf+yTfj+VRsvOHyR/117QdZptbCwLxDfFTrjznl20G2cgtstzGDfoVqUUsxktZHt3HYnicbd30lfAy9D3uUCuG2Wyn4PtfFY3BjwjVMgq/kVWPDiF2sX6ZB14X4UQ3dsqupmc/3jPOPzfnaV0YOEy1Mo/P4JMD/fBbMnx4Nk0A8gizZ6/XQGHJgignNyEuBF3lToPRLMB54vhssfLWlIcw4m9u6kazv28l9/Jxxebs6Wg2q4ZPEYeCwFcPljPMy45I8vRLex0fmllGHrDT1pubDveCe5ebqzaf4UKFj7Eze6jYZ+Kwc8buxBOWbp5H50kLx7JSG+upUnZK3Fkwu04N+fq/zIt4OCpy/khO5JcFW0mTuW/oIjzeE49YIPt/m8QV+XUXAkXRI2T6jDLw5b+cSRBzxBfhEcyV8OM17qgr2OJJQtO8CNlSNhWcVZaPvUBdGvY+FJoyVvs3/O7V/XwvTGHdj/Yz1mq+uz42RFKPY/DxjQAqPVBehm8Rl6o2rO71sMUUsng5aKXwCfNUJ0eqYVWGd/x5ysAH6hW85e3xx4IGQcz9gaDtLvc9gi6w/JXliLF7YbQVHCKFqc3Ex5nq7olPKAWvSL+ZvbdX5YLMRrQgf4hx/jjC0ToVfqPC47+o5szq0BpcPzMaLIAUKSb9HSencY9kjGvGvhsMbTGrx8TsC+XaeYo9/zLPOHWKIozXNilsMRq2OgE3oYpvRKg9xOJTC3OYyeW57Ds31raceFGLDp+4XXJF9A/ItZ8P2uNiwyloWXapoQEzAD0u0zsfJmBJQa9PP+2NNQcucA3n5/iatMnsFRIhT6MQGC133mej8xCjmeCuUx7ryws5iXatVwltg7nN4+iT+FfAUYqQEurdG8/PIf7hxzHdo6ReC20R3WTdcg/8lDoBe1HgMTdsOBnyPAJn8RZz2ppsXy5+nLMxucN6zDF2XaSPfdOC78sRRrlGPI6Oo4ELbfy6ZJTrS34gbL3nEAwQ+ueCYwBr3n7sFNVtPQJ/4jKeSbgKmjBUn2R6HbExdoac7Dv2+boDTACy7pfuCn2jYct/IGfR4WhFCFGIw5U4FlI7bicrkU/NgvhkWjx0NwTDI5Ob1mu+8JeL5SFs6NVMRxtxdymE4JPa+bTsdmj+eysmc08rcDazsdgaKA05ShqgumtsmQsOgUvj7VD+/VBlFwtDooJDjiuuyxEJ1Zz2UfKvGZgxxsM5tECzvKsSBGBCsz5+PEFz60Js2IQ12bKSSoDVvnf0S7OBHIC1TA3L236N5hXfzxS5wPmCSy+OIwvvggH5oX18CEk4KgnjASmh+OhF9TLHmcRjENkhosNYvm03WP+X3ED8zo0sTCuzH88qMORCw7jRpPH0DW8w5467KO/fE7X9BNoZGPNtANHVEw2H6Y1BVloGlZMKZ4teDlDydJK3A7eR2/ATN3+vGmLmfQ+R7IYwzc4IDLZOiu18TVJhqw6eYPVlTOpEKvCMYQfQ7eLMgnfn2lJzeVcPIyAXj9I5/EhXU4plQb3hvkcEXKRFSX300tux6Th/wyfD/gDg8dpeBpzC28+k0f3m4bDT1jQrF643mqGZtIBSrrcUX5Spri/IVtTo4A4c+L+XPzAIPlHWwb3Qd+VERif8bhmvYUiDv6iNv+mwsLDFXg+95HEDHvAAg5WvF4+W3Y+cofVOc/QMMoLzS8vIu8Hubwm/AJUDV4heUK3EjZt5OnHA9CUxUxvvR7Fww7f2Ej5Xx+/6GaJu2fAkcVa1hs5w489nEz37J+Rr8rLTnh8BC7lO+GPU/+Qw1zhC0LzSA26CXWjrrK+6994M3jg5Cbylm9yRoeTqnAuCulXGY4FeSkhUGk/zPe2oysnvMUbo1cT9eSy8D84iu0KV/J4pZKVLdWEPOUrMDb7QaFn5fC25NF4LdsAedfCUDhgmXU/n4QTcymQ+PrP9hcYQgaqUaY3b0ejne1Yurc3XDotgTlbYunDv82btjURHmwnbIeacAuOg/eckZY0dcGL71tQHt2IWr058KVVf8wvWou37GdzDIlI2Dkg1qcidVk9y0Hw2M2UuAWORDsEyOL+n0IXXG0InsT0AITEJ6kznvk3Pnn93DIrYnHvYvvcr/2et5V2QeOh4cwXeMQXXIZCwHvTPGrYRxUfb6Fk5N9wcbVFqRd3VB75BdSX/2Jqp+8xi8WBG2eCmjf8RSHcCXK6FVA8eELbDfVnSO1JsGn0pN8qKabfJ3koKVegFr691DeiHc4adsKnKz2hO6FrgWtT2bcM7cbF+Mp8JuvAVnjndF1oiNfNVGDO6s+YvT0majzuBlrwhqwXMaQJWUfwYbLwuCcCLBwlgWLq9qDTkM3DwXqI565QErnxrJBxzAJPRtDapIW8PnbIc6ZnYczs9rhpnI9yl2zIItLCzFL6hpNeB8IDwzz8FqNOhR8yKNN6/+jTtO5ZH2yEg8vysLotCMocyISdFx8+c/Ut1CQLwvdM2N5+EAOjvx6kw12XAI990fk09GK8YZTycA4kN/3InKaKqzZGYVO7/9DSL5Mp36/I9/6Cdw1wgFq9yZBctth+DRrO8y/rQaB17ew3f4ZWLLdG+5FnsBP2ULg6OUKfXudoOW+B+u2PqHNaiqQ76HOF71jaXVaOMupG9BJr0GeNNaKZ42bA0/SrOn2927OvyAFiqkOfGL9Y7wtPw1ivJgux8/Ca3LnONKDWSksAc/KLgdj27HwYrANokRP4LHE6WS0PpTyd95CM1NtfhZ7keOmPOd1KwzoiqMR6J62A+0f4yBf6yj1h6Vhe/IPyv4xn0YU2NCz+8EgYrEQFQeVobjDhC0ChxBnSFHwnr+sNvs+291rAM/nxcCWGlQx6TTNmKwGV5YIkoBCE3asE6QQJ20Ij3gEQ+NSaGJWKmk37Md9HdXEx2xhasYeChqpjYHCcvTncDjZzd3HO49I45T0UzzW/S+a1gTjiP1S8HJPGcoVG9H8waMckqcCjSJeqPb7Oe5qK0WZ3bbo1OeLYy6Ig928FLZVcIAiXAYFZ9ejz2ApO4rm8MmBIgjKd8LBW+toxmhp6Gj/CetuP2XF4DrcfqWKf+asIqEbZvRqMJxXPnoLqROIWzJN4OPRQBTx7mGFwmzyWh2LzUkML8Sy8FfeLBz7256qT2+DwLljoebPVeqUuoinA8rpilMxTHI5wJVFYZynV4bTVunBiJp2UPKyAp8tF+nuzT2YdzmBNuw7w8NL7+DnxT8gePkAv0kdhcrPppHjbUmgvNPcuOY2u0yvhTWhAXg1cjUWHEBYti0bay5VYoRWL0X8mgpZATP46b2ZVKnuwZrRpzH2sB2qaOjxp4G73PBpHMyOWkeLSAO8JCaA/Nzp5F06SE16F7i2bJDEVDVg2+R6GBt9nfxCf8OjCiMYKMiDOcFW8N+lk/z44jO28p7HYhenw7iwLzz8pZSeJC6EC391QLdmGrxTa8RlG7fgseZwFr77mY51Loa1mQr8oHId/1t+Co0bDEFry3lMvWECejeS8OS2lei734YPXvpIW2Q2oXtUKaWP+4f6HbLge2YCzI3fTYvdLHDR5zCUL9TCEb27qF9+DpT1F+CczgPsfMcaNHZ8AW3LTtj/wYfszK6AgJUZTr5zgAr/2cCrX4XcvPsXvexQhstZ2yheP5MPnrlGbeBOh1I7+FlkD3m7VoKemAsvcBDARxsnQs3dB7Qm8zhHOyzlSyWKPH+lENrGduKbcuK07v1cYmbPhjd1Yc9/18HuPwHY+3IEFLtV0H2RGoyXIzp4Yhq/jVejzcG59HemMrzu2kQ/P5zC6kOaIHlpB/htDORFWxFG4GgeavwL/X82cNMCZfCd9ginLWxnaScZnjt/Ni/yyoe3tabo+bcFnsz9SlnPe3jKWimo+HQKV4pPwxU5hnAxVoy09vdz1coXqHS6G/IF9/OLw0G4H4VhysAFbk1QRfXJu/DLllT8smga2VUdwvfvL6C55h5e97OQCmYpg7+3FN1fI4AZuzMw69M4Ti3rJxvtarry4xU2dD2klp4tqD15LBQmNJN6izwVfvSh8DFDfKrfD84NGLC6fCdedCzFt4f6aXiMCYQNu1KURzHlCzSAg4YQum84jn8nJVNT9mUuT9NkRdMBTGoeBUtH18PMy33c6SoCdyti4O+jvSA78jcvLHPiO7OPcK7JAopdSDA3fwDe9dfS44ZsKtNVpvMPW2jyu0zYN06B7T9ch9SLY+loowBIlpqyzsck1v4UxwNvZnJTzS+4l5lOE7+eouXTZ6J2uhFuDVWFBIcklHlVhGv93KF373w++mErts1/hIe7v7LtXTF20HsOWx0soGHJYraJDsLYjbvor2UbhseNB89nlXDz9WZ6qG+Ert7hGFJnACf8yuB+xGwYrsnA5lotPrLYn9wyLdjux0d2Cu3HX5rZ/P2HDdT+q4Wp0wtYzKQH2zprcVVxL+uqPYL/Oqpp+o4tILbsKRvXK4DGTRG6GrEZ7XQaOUspmQ40u3NHSQZmrq+BOginf/sv8IJ2GTjnvoMd5O3Q3PAwiaTJkiYZoNTyWpxRfgec3E34ROk7gpdCsFPpMUUNttKUH7c5wMQB14h6UuVEd77+bAKu+Myo2rSA/ZYYgMq60bC7MI8fhafztpVB6FmYgaH/zYAsqd30z3gV+K5NJ9N3tiCr0sUTrQDxpgz47hxNC5S2ku3sc3hM3AUl9pSynR/RkR3G4OngBzUzKzl4qhScffiIk2Vf464999gse+n/LbNwSTuphFjA3DXHqE5VEI7tHoOhDiEodm0xZ7bZ8vIPafDK8jgHXF5DUlctQLO4Ai4qTKLYrmi8rhqFtzZ8gQ/acfDY8hE9PRgElvFVmPrSGNJFvejhjBN8UdMDzmx5CfxFCQvUj7FMYj6M7/UBo4FZ9D1cBm6E6rLYpwG4r/2DOrXWs9pgHv6eHoENDWeh+1YhpuwYxlutCH1j/+BpNWVMa/EE0XfJtNNCHOOUkZ/NXwMRZa08IdGRVOV1wXf3LEg9+4hqr7nQgsFJcODKbSpyccHA7rWov6QIx3meAoOLauBHa1Gh8SeO3v4NVsdZ0eo917Dp4gWavl0MIoeO45VMc44LFYeMzKWgIJVHNlX64Nn9ETqDwzCl8hreOtgDGfpBoN6qiuvcbGH+ltXU73AairWPwKvgaIx0joPb3iqQey8GbkTFsXFqJx0JVIKjbzJAPOcntK1bTns/t0O7wBJ6db+CxT9aY6bSW6h5cA9EhARBICCWBlVMUTlqIYfOTiV78sHfgjfhtq0gxU9R4MpVH/j0TG0Q2foTcyfMwBohPaopFIb+KU08+8cVcGo/yWHjMyh382rM/qwAh1p/YPp2OzhovQ2ri4r5rWchHVt3Fq8YnuPp+4I4R2wUCAXJg2h1Im94c46nmqfjdQ8j+nBdGEcv08Xkb3EYkagA9i9fwV0pG+iOrIDtQ8b4cXwk7H30jx6pf8AEnfVUJbiXihe6kr3/U94/RwQUZaU5U2ctHXvhSWR3C+pPeHNZ6zvemf+QnLIjSHmcH7+YZwQD5h+hbqIpBD214ZVruuFKRgfdl1zEc3LdWFZggOYNWvK9rHFQtOYnxPaYYt7dToDn70Ha4B0r5fuDfKEgxV27CIrNW/HqWxXIX97BGSGv4KdmEbrsb0HLM6P4ncs/Tr4hgOF3GujRvx/QWiMOqdHDcO+BBS7X0KN1G+LpQMR7SsydAzUy87F5RSyFWn2h3Em6kKnVB1HFxvi45xLMNvnDV3+0soqdAkytvE6TLBUpb2YGzJ0jCZZJu/HAvY90u2UYJ1lvZNXqPPh58wTLeTuz7wFRvBnQxfGVcrDUOR41DOt5id032l8XTmuuaVNQxlL47pUH9XW5YPryGUv9GQECLmWUcrwAt40JhLB3o/mSZhLE7vuJu893cOj2Ev7P3BYGb8vBiYg+PnrTn70Vs2F74G24fUwVf3lfIIGjFZS3xoH7z7/B4ZGi8HfOGuKJdfQ4eRvbHROCqPXrcGFMNW2Rfspr2vfgf77TIOikFXxbaYzHXqmD8h4zFgy1p5fWRrxsSIGkpAtobvxL2ObfiyuOiYLwz+/4q9aaaU4mCM9ZSCpbVHjsEQGun9aJ66waaE78S2gbowYSNc/Y9cdcLhTLoYbDd2jvvC28TmMRmuN/4Kb1kbK+jcDepSMgy/cEZdwKAtnzV/Gc5XtaNica/noyxQ9mo8ia/eiiVgTJm/RBzVwEnHMrqNjxO0f/V06vlYx5W6Mfl7QrYupxXax3eQfTf4hBldd3+DzLEtbv84WX/87QDPdFuH8gB0rWemNzoC7MffeR7p9WAaU/XhSRLEIjp8uBltAJzvyWCgrv7zHFf+Yfe4N55qV1VJhDYBQYgGFTtmD7xWQQzj9D4vHKaFVpBWPvbed3zYp0XEqSksYz+Lku4bNq3ZDhVwyDY5ooslwX7izowy/7tnD8u6Oo9Uudt24FaNB15k0Vg+gz5yIkNXux+C5P9Dcu5JG0m848bAeFhcvx7bKJ8Prfe9id3EmGtTJUWGBFZSlu6No4B0XTw2CexgswM1OgDnd50MlYgGO126lK9j2pvqkiV91mVJLuxM1v1DFxwIZ/fQni+f8kYcNwCi1q0eIJx85w1iwbjDw1EoXWGtIseVXc9+kva7XX8opgTRA8Jc8BHSvx1HJF6MvI5cNOidzyeC8fCdqBRxPl6PJdLQ4WVIMHy5zpWugZKG/J48ork/CGkTVOv2cF3knPqPDcA/771IATjcwhzeI6vjf3B+vXrXgO4yH3rCSuXHMflETEOWnlWQ7tFuf7ihpgXRaGPvabYPLYAjST8sGXcxZj2owVnBk3AVMs9bjF4QI0SY6D3MlA40JH8Y+wdBz0m4obQlPwpP1YfPLrCMxwBj7o/Zc+F08CUQ8TzPbzIw/NVXxMbwmFySyEUKs1vCouF+bv8CHf3B5+bq4MK5zX81K/HziUfZC2xOwnCWVLrCjoxn1udync/Re8nisLZ3aKQ9e4fq7qlMdIEYAtmkFc2nUbcrsy8dLycFSa2cOxAnvZv3AKlIttxe/FAlQjswN/jXMASeUeNF59Acv7/bho0WkwmfYEc1IARDYq8izxeThF4R+mJc0GMf0bMLV/PtTIR5FmdiP5Ou/iGH8pWM9CcDPLjDOWlqPgFRuQVBAljyftFLJWjcdaycI5IwlqPCUJYpEa0O06xIIjXuDVhy/grcoVSvy3nCMWTCD59dIkMaGdMp5pwm/NDeBx7w0KWBmhc1AQV1jnYvkbe3ii4Y0FL/Xp66VP9OysFOR3FdAhxc80Ll2afO9dIZ2BmWicUADpPZshuPw+dX6SheKN4tCY0ErKcz+jd9drGrXzOfbv+4RHxv+ma+7PKGddB70sTQPLXlGwaj8KMb7dLBM6A/5pytGS7GWkv9GQi2xcsWZMKmikLoJXPgZw86QBKQi30NPVdbBk71gYva+CZ3v08Y1ZYRR0dgE5FDVhNmmDW0oa35olT7YZknT33S0oeJ6G5vdv8YlcTbQdncAOadUYL20ObRYiZGrnDXWrjkBbbx+tDcyFpwO/QGF7LxlLXGVtz6PYcFYBklwJEq7u5Utx9/h6sQmqSy9noaUPcMqTZbTwaSxIVMSQfrgw+LzupWgnbRJQ8cY9o0JYfUM7Ven2kar3VhiZV8KRikagrSwGUAHkuT6JA57awQGxMRjR+whlW/rJv+UGVOzNpolz7lN3nSpYKZxkDZsc1n3/iitLj2HizATQnXmUDrY9o9CO5VS55xy7ONvAbLFcnvk2AFu6LWCa8ld4FXgLoi5qkveiKliZs4Z3hWlgZJMaCPn38q70Z/y9aAUftr/NPRd+0+P0WeRb/RdM5+RD7pPL9POwNQiqLiXlJfepqdadx/S2gcQOBbp0qYNCCh35p/ViPvD8NF1IHwsvnK/jFf9T/F+IBgtYjKVphXtwzu4JLKXmxJ9W2fAOtz4QWGYNbf2TuTQxmoaip7JRQR3c7tHlhwV3ceb2czjwuI6+ibwDxUAluBWyB4Ns94PNpOnsZLsL1HLPoprkc9R4roKWz21pxGp7vNOjDMeOfIFT2YIkJCyEkzeuY/Hy8yTRuYG2SfhA2fESNvhYSbn3zaBmRji1NkVh2o47+GpgLYcptGOF5T8SvjWKW86tAZl9GyFzUBVyfdqR6t7jik16sHQoB+fKzOfxkoM4o7GAH0x/AVqfU7DCxhAiE+eyy8zfeDrRgb/Md+DeZmP+XtUA57+sha3a92HbyRUwc7UCFLbpsvCYXCiXXgopRhYcK/ASPvdp0eNrJmhj0U6r3ySDzxVRWFxiBoHzbCF6kykH/FAhtyl3eGdtAdp56fHllwW4T0WQ5HN0QKG4H53ygaxcpPllSAPo93nRU6kr2FFyFUtdv5Gf7nP4KKMBeadkQNbtNl7c4UMGvlYcvEATdOSK4PvcWHrln4n+Zg2Qn6MJf0f7UckePfpnFQh+myp5nOxX9rfzhLq91Zzm2A9nSp9j/IgRkLg3AQu2FFKOWigcUpxFifGtNOWbAGB6Kutd3Qrtb3PR/NRYaM78ig+1N/AXlwlc/P0NHTSxBC0ZfYw40g4Sfz7DJRE3ii+wgOtHDuP1q9JkNC0cY659gwCwpw0qlRx78TzrRExBN8c4Wr1GFYSDq8D4UyovnPeEv00rxKUbBzF7kzVf76rHs5UdMH7ld5jTOgn+dHWB1okW9H9pgrt89CnbZzt+VzzEOVsfwIv+MHQfasM5LpIgMCISX5RsQ6/5AvxuXTVP/WtBHXfG05izCFNRhkw35YG7gzS0Oa7lSTM38WIxVygcuoWKhW8h+oMU/zZ7T60ywrDE7QNcXa4P0cu6ULrvEoj0bgKft0WcEp2Or51MWaS2Edd6VZDC55+cMdkSDsItnJYqBCO7S3jSTz06bydPBfLeeGPqbFpT1MojstbyYx89OLJ2C6aOrIJWkzv4zW8byV/YhjPPqUPAzSRUUnFG4zVSMMtODVY4TwCtnjp2OefDx20FeObH91zrVQYNDkbsZTkPlee38rkEPfASaMUHwdM4vNWO7dOLwaDsKriom0KRYjQrgALvk5PhSYZq8KOrCXs2LKNqGU9OjboOv9Wv8y7hVrJ9sBE+TFjHjQVbeecjHUgO9uegBkt4pZTEeyyugNFqRRJunkfnps1HY8tO3pTnSdqfp0J9RzbZDryEEbre9OJAPpeVyPKBuPnQElMDC0WtUGvcRvCci7Dk3m0+0jySBzx66XTLKnpe34iThHvhYLUcrSkr5Cc79ehwkS10rDqLNbEjQGV8OeeWX+K7q9Ip9estqpLLpBtqIyA2V5PlNE0g8mg75rvYU+NtLdpUPZ6bOhpBpuIT7pTpxVtjteFgYicnqRtAi953WmTzCsP7NElDVIfeG52ngYadINU4yBMbV8OrvedZoksOtNzSQGTBNAoMrEL76TPYNhbAcfAyz/BeQ42B0pyVnYB5zwUhPjcSDjyL5hfX3Fh6JdAiERGytpoBphve0/KimfBtdwQ+MxEF7a4umjY1Ho613od/pd04IXwGnCxowJpz7nS3aRSW1SsjrBKGFw3a1PAiBx5tM8CrK1Pp6JTL3BtWQUG3h0g5qoLrYz7w4kwzqJ+zibNT1pP0iP/Yz1yeot9ugeZvMWzkc44C1Tawbq8lL/AVAPnpW2j67GPw6WQX9xtcprevi6BB3o2NdUaSk4U3Scat5B//LEDVYiMOtu4gr1vBfMw2lY6dmU8qJxTwSIAQJ8+ORPG5qdgsZA4udz9j9V0pfFUnyX/EpMll71s8uX4y5WyspUOSiqB3vBA+iI2GNfP3kvhYedi0VJfNIy3x1sUniFrn8N+RsaDw4SD5y4XBlT5RsFl+mMUkrrLhoh7UyHxObe8bqXDBJXBYsBuyCvew4yI9cq40h7OyvdA9LwwfTOhnGY+zvPh5Ow1eegJxH2L4yLv92BnXBgknJ8DvBaYwPvMlnh3aBCWrE9FPP5BMHA/Rxify5CBljM5PL2GasghIW2bScMNqaNMZptHWitBtqkVPyRxnHOumV5V7sHD2OdggIQSBpWFs0JzHYWavYIO+B0uOTcZeZyNaqeFLrgmt/HBgJNn424JZhB6mCudjpqcH+y89wP0BtZwwR5RnRC7l+/YdpPH6IG/0VIbUuYO8fJ4VDc5oALF7j8FzTzvkzx9DRZ67Ic1riDZGdEBJjyxUVV2gA1G5rDhiKS+ZbgIh78ZT6q/5ZBG1l1ZuGMDjI/7A3eva4BbhjIb2t9C2+zmYJFlz0zwTbNadg5VfVNDxcwLePX4Pl+0Qg7G1O2m0jxnMmCmGOxQnkHuWMF1ZMYwuj7ypUtqRnxrV44UpDMufd8IdDzm8Gb+awooXk/TBzXjirDz80zdg45giHkhK4RtPLeCy2T2Wzf0Kh5ssoEnjBs3Nmcn3I9Pg6Zyd3OHxEbbpm8D5qzYgan0ZpqsuIHouTnKG1rB/mh4qVE5jCZ9vsKvTC28nvafTy4RgxOADSonxYLWuBzC0XotNkmWoOzqaDx3VZ/GGKFB+OwYOvgWY278LH1ieI/z2nvri+/CNwXPue5XIH6y1IV1SEbMXXySVQ5bwdLMEn54ZRpIrazC3dyoeLZtAa6tF8cpRB3ipqseP3q/ixHpzOGu6DUw2LYbUu1V4vHAMRFwIx6MnelFE0Bd0r7rjpGU9vNlPAxzHbOWA8xLkc70KL6VaY1jQQ7jz6SPsaDiOO8zjQdZgMW2u0ITMPkOuWlPPTY1tsEP5EUweMQQPR45A19ovqHezGFOSZ/CxDRJQtbMNxrWPgnHP7bD05E4031SAIH2ddiwagUbnvKg3bw9N9lSFhLZUPB36jEVG9cBw0jpOXXUHJq2sR6NRP+lDqxoYFTrA4z2msGTEJxaQQnZ/IwdHn1jgfgsGCUEd6Kzspx2uFdgivpo0PcRh77RTPHqaLm+vHgPCG91Yc4oeGHvu5gjHl/QzPgr1Ng7itJXy8HnNL36YvgKkG+8TZEaj4011uHTsEZZfHM8JhxpZSagSVn6UgMjYYVI4mgca5keoYuRBFLG5yQmzo/j8taP448wu1n0ayn8X64HLIyvcOb4aInpewfsPR2mURjGsW++E7eov0MMjGC5WfuGS5/Kw37gdP12zYPlfN+lViQX8GumN4YXd+HHsCj7/TYj/W3ie521UBMMNk+mkVgy0O53ipBP6qOb+H5k7n4ap3QGQrv+Jv07fRTId2rCgrBmFjwXCiwNZpJPkwTe8f8C8qGUcseEADBQuBevpViiAE2HGglU8pkkWnxnPxjbD8Sx9LYMDsuZR52glMDJ6xBO7T3JGsApYTTpJq3crYID3YnKfPhcD9j7gJvkESBrxHd103vDeOfbk8EkNRqY/5gl9l+Hd8HY2nPOdEkyns2XDXRpYNRES3Gdx2WM3fP7aCBY79FDtYxP6qv+LnCv/cHKZIZ1U2EPpR39AruIXTI2cyLtKRWEUFpNzkT8EG+3Grq2KnPVPDndJfKVVjlfxWocD+HS3kWaqHswbHw1PlS9w8rVDZLYshcjUAIUHS8Gl+Q4ebValQqnrvDtKDRyH4vkA1tGNxlXAhkfxe+8g73XcSBfqP1Gi7D4I2bweDzgJgFf5PvIvlSCPr6lQXtEFsy6+g0rvVbTp0k3IWavLbXdOUWDjWJi4+xpfT2xgvxlPsWWrAt6N7eSk5EC4lnQBP+m18fMcRX6mYQJbp/zEwldnWHnwPnit9EHIOI3VOSp8WNMV9tuasUrtD942TRa028VZ/nYXbFu/AUblG4KQSCgUKwTQJeN8+tRjR6u2DJKP9URQ9LvJ8ektNPz6LI28UQ9Oh+TAfOVatFwrj642JiidpEAjBKyg86cBCpkthsFFyfiz2RT91hly0IZN9DD5Pzo/Q4J+CR4CX1srWDPyDx3taKKIC6qg7ORO1etCcPmBUXjsUTQkN6fwvkvC8KtMGShjJ36qNEILoZUcGzEK3e1yYHZgHVz/8g6E/m2mWzFCODRNDu6UpJBRzD/6bmrB+lmhXBYaglvDo+lj6yNWfbKcPjaHkPJKNZhvo4qhE7TwxSM3aMtvhEeOEhyVEgXzYsZzzZcKHJJrgVK5iXDMupR17y9BewMVqO17SkdH/eVXelfg2+FE8nnyDE62FaH9NFk4IW8GPapaPG1nL7cv1Kdfz79Q60JXHnMxDkJ857CK8Ts4pcHQ6LWQhbpLaU3/LuxTbKe1nRNBeFI6FZkOcsn9V7Bo1AYQKJODPdVnocK2nfYJTYZFfeOhaXwnnTL6D85tXkObzHrx2TsdLj1BkFd2C8fJpuKKIBEc4TWEUw+P5tLkH+RmXUiZ4ZsgUtyOFxuOhCMHn7LQJnteH+zG2V+bufnVM9I7cBTCnDayn44bGZWOQVdrhr1D06gkfjo/aa/AF3ZVMPbdNtr4zpIUWydizdol/Ft8FNQOKEPEibs0r34kWg4fwN85x+n58SGU3GaEHodPUr5rOmrL+PNj0fEg9uIf7PMJpMk909D4xnV6ue8ebPfZhWW5kSjWZc6zpI2hJ80U/KJ0wd96PCyTmkpdtlo0vFoLhzv+A8czuSD6RZotxat5/gdT8Lc/g2s/PIX2dytYzygFTpi08/HKRB4ZcA+dzynx+Q0VED5PGTQMraBZ6DlndQdx8tgh7lt0BUNCvtFik8mwGQqw/d0PrEsRh0AZKRJ7Ioy1wU+gvvwQNoqtpfgxZ+jDpIUscLGOjix7AeGLdeDC2w3QJlwG80US8GXuSVRqrccllREodjcYp01oIKHhWJa+ZQThDo9ol6sUjtnRCYKjj8Hp9VH8XMkCk19NpXI4yKaByVTzxhLyVWfgp3lh8DD0IF0K1SehxtMgdVqb2nYkkpWkBsnuOgqlp1UgeHog7p42naorK/DDzceUVb8KMuX3gOvsR9SUuAuj689AYJ04bDsxhRXHbsbJLX5I23zg96nNYGOwASrEn3BCeSwGXzpHxwdl4YnTWNCWE8erZT50ZnEupexqw7RhOZpta85vBLZCQV4m2cuMgpm2iezhp8Ct5yV406xbkCyaj7O2TOF7aauoRs6LVyl74vsJ6rDI2R3XmdbzlzW9VBA9muR09sGnFf94dexGeHA+heOr/uIyBUvIdEvhvMlz6PPfR/jNdxo76q7ms8/N8ZzwHhYf1QHqX82heudoyFxXAdqnvnKk3VaeIW5M5z974n0JIbgnvAycrvfAv3VFfOT+ePA9vwrXWk3n83XG9KhTFOLbb5L4oXnkaG3Mh7fr8bCyL3/1MoCPh1Zzpmcnbp4wEoa9nnG64zH0v+gP+VeWk/Jda/wb5YbVn1Rg7JlGXjpuGWpMfQmr1PaTr+89jAxYCiN1tlLM+FCMDXnGuiMMQGBqCb/V2A87/g2h9MRKyBkVxEH2K2m/zGJSbHHFGGdj3t1hAK8Kpflk7Cw4VVyAP7cUc/KSOLA1GOCpo6vIUeszPEzL5up9k8ADQiB91UF2n7GeBfcbYIJtGhluGKK84T9g8qYSS+4Yw4F6Y2jTfUbd+3vAz18UTxkP8M2S2TAr2xee0RWW7lTEmZ2toOmCsOytPHSMGYBYg0E0enEMJg4YUe12If5S1E8qXyuhTbWBhBMRVpRtAb0mVVj56RB4RNqQrMl4yEzT44wDx3H0qIk4p34MOUyfBN7716D4t3j6tPMNn/EqxL0R1fzfzgrMNsjA3w4G9EfGjRPSrKB8hDjmvE0izZ6b+K06CxMaZamlKAgSz/xEC6cQmp6xGuw/i8IJE1c6uPMF9kelcLr3TciK2AQb7gjwm9NW5LrTmx7GqsIECVUQTXzIezab41SrnxD96yUuUdwJzzrv8Z5/jhT5WwAsPg5yxU9VmHHcC8/dF+RgU0O+YRVI6SpvWOZgDW9WZ4hXOwce80R5+IAyvBq9i2M9Bql3hBMuGP8Yj2qKwS6BSVh40p++Hkqgb0qINlc14VF5KTXGtcLtO7vJOW0pLcqUwJKTp3jTbkWqVzuL19xf0Z0khHJdAT4msRnqeo3offEQWFMTH/pTRbIXdemP2woKTomlWcdFQeHIUjRTU0LJsI14rT2BR0+aStYP3HlDyy54PTWG5/Ub0Qs9AwgXk+K/7QWgrjwVpowW4TfX5MlDJ4zf35vB+2YeZGfQgQ+HJWBanTm4Btzi5sDVhKV9lCojCA2FdRArWQAvlH+ShJ4YLtCRgZfHrvLxX1XYsm4Vql9/hK+/PMTPTyTgeeYsLskaw8bjI6j7E4AJHOH982+T27kYkLQVQPmQRRRpb8WqOI43+8nD3/Qu/HWY4e2Y0RSitgAcx7TAaXsV/C87AV48uYi/izP4XvlfjNtUjlXiqlCSnw76tQp0Z4EiZTWFYF3RNv7iUMeVchWYtOcLsnwJO9/Uh9DLyVgw0I46EsI0Zn4R9l8Ywb2WVryx3gzyIpOpJywS/6kIwp0UWzYUvMVLx73jw4tzOOeMG1x9vheeSJuRi5kzbF08GoylJ8D+Xx0c1aAPti/KUXzmW5i4MJtTxHbR1ldyUDlqJfXOVSQxHw3YfPQgfB5xil62nuftfk9xofJDOlG2lIYi2yFLbyOuqvOCmi5RqKtshHAIwgoYh+bTH/KzmNXwV14c5DrngFLWSTjucZUcL1vAhfVT8MPiqSDlG4Puvbp89kMD6Vz7izuKzvDFmnwKeHkK1ZxFYEFSIRg0/IcTv3/Asz/H4Fv1PN75vQQz8rP47QRpmnu7gH6KE6zY9Ritx+tBluwBeiz/lf78rMT1SyaQhbscjjUSJ7OvhhBdLwELxVZCmostuU58wq/C/uCmiJ/Y41zO4qqFfMnqCLVHpGO/8mjY7r0PVR1recnR3RhheY3dHvylPbaT0UHWln8L/8amPhesTZOA8qZsWGPihdXN88EhwJ3ql1/kLtdHGOqnBeFX37L1r9Xw95wZBNBL8JFoxdAzp+DO2EXopOTFX8vaKPrWHLzp4IFWnpNxpT5C3PFZHC5xB97csSf73yqcYCaBcX9qcEvsFtbK6QX5MZ78d7Up+IUuwLq2ClSrHECvltvgoNNONluO48XHQ9j7311warnPmqcFofG6Hfx0XwDVn2Ngc7A0bgoT4h6PFNA3SmJPVSUQ2SoLMx/LwNaLEZhk9g7qJAzxZsYovrfzGkh1ORFUraGaskb0CIiE90aKIGlsjoEhXVi3YRalqR+hOxpBJDq/kU93v8Yfv/NByS6eVCdNhACZLIgYNZ7TZf5gRmYAf+3Zjgp6NVR7LQg635vy8CgZvBIqAb8kbtNwUBu8/veA04xcuXDxCygrDqPjPW1oLjPABnZZeNNYCULcjUnX5xmI9RYSHv6PS0oCaJ7oP3bwb8AzB07SwuUevGrzWJh8PhZOtd1n8ekfcWB1BT528kO9o8PweP4GfD5Gi/J6J/H2BcYgsGIZ+iwV4uiyOo56eRwkn37gHt3ZvBG9edljfS52voYHHo2BvkInTv2ykQaWrqFJ3aIcofOdr1fY0WHPsSB0dzfqnH9LO8U0ASWWccfQVg4bcZ0M1jeii4gMhuw+R0Mv9aHStZIKZi3h2PkId91H85K+TPqnvBYvPMzmxW/zWbVpJ/w9kckdgWXUOKoLwjZqQvGpLph+DuHrKn2Ys/kmtDz9Q+VSckTPN5FSUgwna3TDk7tqoMRzIHx5Mr60cKOXEu+w79gUPna4lP4bJU+JrcP42Xk7egqYQOuKfZi4ooxb6iRhtswREpaMg2efNfly8AP4WeFISb4a2O82FQZ05qHO0hv8PWU5BqxXgDngCI/709hz9S2cVqPPnb5ieHOvDaQNh0FEwQTYN82ISoPc4eHjs/R6ewCYn21FNdtdsHd1Mu5xUoS29AaqXNZB+oJHOMJvMykEnaG6pg14IWGYzUOcqadXE0Q2KcCfmiXgGz2KLFXPo6RXHztYXcLhAx3ce8EVKdKIw6Lb4O4VAShIFCKOzyPJvv2o+fkLsc5BXvVrH33X2g8aP0fx7FqCE4ungF5kP2dvXI8VYR14U/4vqEVsJre6csCqZJarjIRlAkdhe4USbFnSDRnLUjHbNgGcn4rTzGXKFNKlDIJi9eRoksT6s8/gimRtuKNaBH1WW1h1pSVPtC/BiiMz4W5POc767cKfV93h9Kq7MGK2GKx/6U4vPtwmu4oovDD3BvTctsZDfSE4EJ8NyqHy5LNxORbtZUhaX4VP5j4GnVRzcHy6jrYP3+DzGlkYGJFNJp3TUXDefEwqUwFP32h8kNKJvzyn4vkD33hySxf2GYXyx7hByPv5nv6Ma0GsGQ1ex5rYO1Yfzgz30rdjr7ioezrMN2hCoz22oFQ3jGK1RjDP2Bh8XU0wX/sopvsm8YP0Io60r+EJat9BkK6h7U0hNNuRDgM1KiA07EY1czZCpU0cnPl0D73PhJDakq3U80GYfdcvgeM5vxFKtMF/yRIMfnMfHvy2QCvnRdSkdw03+WagSYYCXppjiUJNZigTrA9JM2fTiozZXPlvEegU20COeDHuWOeMJxVXwhTZcTzBZSk7eirDonUbeayIMPm+fULdN4Nh6vaD7Da/ldCvEoIll0NAiB0d3agN/67fg6qH79hg3hZoD13BA97n0Vj9NrjI1XD37GYo6dgKK88SKDbp4cCms1j9IQfPZQqS1MAmzlXTBtV7sVRqkYbfZKrRY6QK3DcThVVykVDyN4Wu39anud9VYcwTY9hRUwP169Qx/vRpbjcXhJ/zbWHPBTk+KPCPts00460V47mo+xxMkvpElXnraJ3tWnhSZAtrL20DlcMB6Dx9kK7UKqNkXypPthrg4b2AwbvO0/iLgxxwUgtGzfOHRj6GnzfMI91dW+DypQ9w5tYTXrH+LF1uGYkHZxI8zxeB0raphJEXsCa8H9sGc9Du9UWysJsFosP36JKCEmZWfqTNnRZw0II448sRWLdVhlt2j8euoAE6OkWRTZzvYT3t43lRuTi50gZqLQ/AxNsX6HavBkzkSTxJ5TjPa1zJDmtfUP4cK1gSXkS7TmkCzi3gIXd7RukD+GTxZKq1ek1ZWc/RJmgq6iU38shgGVyhaAN/BGaA9ccJfHWHNlnXVMHknRv4o+w/2vBiD404+As8hH+QTxFCXKM9hI9rwF0mIfTIrYqv6KeSQ4sxTK/QJONRvWgyZy3wH3FIeP8FvrtOxYVkyJhSylVtsWR3P47MZIpweMYBsn8cT1vttaGqq5AkZr5G8XFrYfLbUJzsvwEOy3ah1qlx/L1vD47Vvwx/qgAi9r3htCo16rzRDSUxvyjLJQgVA2bhg9s2qK4nCbcM3UjH1hh6FF7BhsKLPNm9AN1+WaH9yxtwuN+DBOM/QIh6G4WOfIWfvBgaso5A5dN7kDBXj8T6vpHW9AIu3jefvh4Qg1W2LSQ37gROiZsAoy0yQb1jBC5WseW4u5tBLLaLjS7aguxwHiebN6NfeAL7e4wB0YWHuSjgAZab9kEx7OJIFebsR8b84Z4JHM5LwWn7jCnS1RASoAb/XqxghYBczDqfivrbnbk8s4JenfmJJvuicdE+5iJlYbjiPoqg3JgEegA8PLfyr0V+YLjoJzutDWF5hUqqWyqOWrUIpsYxfPvxaBgh7Urft8hy/aNx1LFOgm3HjWebk7kY398JDtUIDu0KCLXlFOU3luynzCP/FSFkeKcTwlseEDg68XvDyRh1Tgmm9D6GzJPKZPlgD8KORVQnGEtSzUmsfNgPcNZl7rfcR7RzKvw7owMrbhfzuNPdWFGViRNr7dFbaQjU14+hzTFybPkzDxzSxOC+2guuezqe1C/IcqjOcxYNTMS17utwdtl6knW4BF8n/kT943Jw69Qt2PFxLH1/6AJzS28xnkzDHVGlfHPoAjU7z6LHw9Zks1YL/Ho8WbNEh/V3f2WTcUPwa+YdeHPvD00Y1IV1v8xRd7cIJt9juKF+l9PcXsK5i1/wxITPFCbaCmmT3PHufwe5SFwVrmmEcv1zgshBTdC+Eoqne6NI/2gcJsgnsUfUfXDVfABLosfCpbRpHCUuB7b1GjDrVzBvDQ+jpXsOQXb6FF4baQvq7wa4Kfcr+HjGYflnM8g6aEMmETLouj0DPb4/xInRMnBVVxqitAXBqz4JRNOiucXKHLbGLcFInStwesk+TJmWDEIB3fC3PwAShxaQ4mrg2ZKf6UCIFvwpOEhOi//Db3KXENqO8Jg4TQpX2ICXIq7D5D1hFFiwGWwvm4LZVFM2FlDDPS4RHNW4mWyj3mHK4gBwDszmGV9O88PoQlDv14ErV29A9BdV6OkYBMv4Jtq0p5jHn/OiG8eaSMWkk+u36VC0iCEYbI+Do4rnUP3FArrfL8mXG93A/FAaSy49hVYHfWC1ehaaNGvA4b8HaNHZTNQIO48Zxer02tASxspKsFzcAKj9WQhPJr7EkosKULGhmdowDK7McMJ+aWme/m0e19TepFmLpsApxTqMC1dnrS4deApbWaFTDMa/jwODgpXk17WIhIJmsmD+BX63KRWOTc+nosOmgKFfwHu1LjqNk4Cw19tRZM5IlC8ORRBfj04nlOBspSbk1JhDYvlWlm9upjBZH1AxfQFNakpw5n/E3YdCCIoaAOB/tDWpNK0W0V5UikjJqBCREZKIhIymFpLs0lGoKDsRRVZDaSqKREkJLTKiHfcx7pN89U9J5rwR7jyUz2ZQgbMt5SErwg8N9+fx8ahYFDkyiQ6dn8d+bz5gVfR+vurYz6sH6rH+owAYFTXDwFwh+re2lN9UtMOyHfkwODEJagZsaOhWGNdMTcfYk5ogX/SdFWeHwLP5B+HFD39+vdCNLzjp4sFyO2zdGIAfGj7xRzdLUKkdhDX3fVnJq45GhjFb1K6BRwvKQe3eVPKjdsiXzINXH7UgsCSZh2I2wVyFFXBJWIj9ihfT1DkdcEnoDi7NWot7fe6jXrU69LQ68Zf9JuT30RFDxAIhsmUhxvbepeH2s+x3djwb2JniCmkZCBq0hYJCObDc7g/lcmNhrI8APh0VR0871sK4yZbkJe5Ph43kIL+nm3/HJmL0Hl2wWNuIvi8GOeVwARkOn6PRhTE086AI3nexgpg3VnDqpSyEq2hB1JpKdBg7mafNdOHPkQLsKrQJbWpdWTtUCJSCH4DqXi+cV29PbRlvWTDaDpyUPoGcwmMUXq5FSVeyQThcHLSPmeK0qmZU8xpkG/E3aPjYEvU00ihC6TN0NZ+FusHLeC5mDDSM/4yzcv9gV3MpVcu4Q42rPBwxeMJ08hgP+umR5MwkSisxh9UfJoGbUCS3H03jnhBTlC7oxIy/ftSXIYeV28/hwS1a6BoNML7GFPI7PpGkwkZolfhMG+5cYM+fx/HE7mw6cKoXbpWpgeK+KTA+1Q0fjM2Be2824a5zlXz8zRRKUn3Pn4Q/w58ufdhRZ07Pf06HiRLqfHvKexLs38P71TU5qvIheYSdQ/uHjzkkZgxETLgKvgoGcJ4zYabCHo7cuo21I79jmtt+2Pq2BIS0Ssj9SSO1HXTE/15NhFrHKNgULkH2H1TJQTWV9tRv41rJLnxm3I9dHp95pM1IsjQ0AJF5knRGxpn6TLaiqLw7dDQrYpZmFQbWHeRFh2/A39BaEM1WhLNPTTm/eDUsyxKG58v64Gf3cl6t0YCmKbF0LWMfPnJMoAu/rOBKTQgOmYuwzyJnEKxUhO260pC/0ooLZo/FuBF1bDFdgvyKrcH+8C5Ut2DSbpiOHT1mvHp8FIcOWhGMCIZJLz1hp00Hno5AGBQXAxMHR1Jcq8Pz+uuhYu1P7k+egB3wEw6t9kRzvYccVysB1n5H6I7kC+hRW4czRN1hh8gqEjv4A1b/tIdjh1RI9II8unuKwTW9m/SmpRKVTuiRzbpvtFXoMnf77YVFDfLoWeAEpzwr4XaJIshW+tONzvn8Av7D6uoJ/DvyNzQ+ZspSuwvjO44SLq8iDxsREFxrTiXpKjDOfQrH2v9HsblHQHSvHW+XVOJ6xR6wju+DnKnmYGKxnHanmmHEka+oqesM1Udz4Px5IEPHH9Qknc5tLU9ArX8iiHXsoCM3A0moWJRGJk2jusbt7NF2jJwzrXj1qxTYfTCJVn9XBtmAPN7fuhv7G73Y/WgYK429gQ3+alB1wQPXtPxAiVXdVHFACaR6ztGk9Q2c7aLJKRcCKUTICKL8DuDm8eswR2AHuVxuwMszhUFg1jALNo6hPpExeKV4CnmsVsGxzemkVHaFen3r6e3JPopvGgN/ZKXJcFAJbY1mwCd9Y6xzb4N+vXI6ZfSPIlPSqWKPNe9PMYKQnhBO2DOblusncij54qSWJpz+RwIucw56/FLAGAUp+vFbB/yfleA8pwK22pgMal7mMGrXC6wI3MCd4xpY29+azzivRc0AE6g/tp0fFCwmz5OtmGgzHee2a+GRwUz0yc6hnCOL0PO7FRp/mQZz0mJJ98RGWOCQjjr5G1nhsQN4Hwqg1Ydk4eft25Tj842DZSbAwydhbN8wBmz0N4Nr6hacYOWFLrt1cK1gI+7orKZb+8SgtlAS5F+IUdTnvXC0vB61QxN5mYMA3iodpij3PN43SZ2iGoNw7koTEPsoww5PX3CnpjoVZT1g87vVOFqhDU/aNtOvjVL0atVXajtrDvMeK8DC/ld479N1zHS15NN5qbAm6D9+W/OBdAotOFAnBg7ljoS7fxKp69dduFfkD/vMhPjy+QoIWFxFleMF0N0zkht7TuCAqwzobjtKKyrVaXLGaOzu3Mi+awRw1omnIJx8h9OftkPSjCNknsFg1LuJYhII3S+1QIJcA4SlynGqrT0ZOQTT/dfvYXXucviaqg9rzdRhXAgTzvqKyQJ2qNB6jC/vG0sfniylhRU1PMn2AF6/bw1ru3eygLI9PA7cCxHPOyg3uo3O7XfjpY9W8wW1GF4ZuwCsp02DxwX7YYRxMwrVKNDr5hGob3QE/pwOx57tR/nZWTfcH28ABpcnQO6Zp9QqNQdW7TpCRZYrKSptL4oFbML3qxJgqetMziiJIu0MHYBDp6jpRz0W02tU8bPkVfOb8XBTP8nfNeKmqgq+H3KAb96Vh2nNymiTaItjh74hxrpy4CJN+BN2mntVxME8oA8s4jNQaKsY/Mz5gyFjjXA1SMGMrVK4bzAEvzQPUWqqOLdcP4eguRRU7I1gelASeJ3rQkufcHipXYgnBbeSSsBE6NjryL/HdOOJpckk620Cd+dLcpPNK86feBbXeciRuLQQdr2TxPvzZoPng3sYMvcsLgmyAPl/TbDm9D+626VNYhPDweFBIy7zm4Z/qypIUssMOvrn4DnBKVC69QrcOBPHTpq/QFQM+dCXEdg+MAfGHo3GJL2FWCJ3E/b/UYBRCa/gfHcolMc4QMiOXrrm4UpZLeGkvymKFPWHsXmUJAR8sYKgfVdQLNuPBlRD+HPTNpjYp0QTlizDGCkj7PO4zt4mP2isgQV0f1lFGePleXXOL3RwiiLl4hp+rppK4oZ99KZRCDNvRbDNDl2wKP7N/wJG8/tZ2iBuVs0iE2V4sfF2SnOK4X9HSznCOxpmXleEsKUuuCXhJucsvs8ui1dhSaceudzcjGe6Z7HW4WGq39wIflMmww4JNfLcRHD3yQAJZQ+Qx7yD8PbrDyh/NxkOjcjFwXHJnHJ6DMhtXcn9bgtprYgXWwfs5Nm+ezjRw41drqvwn+MhJDyvk755C8GWm9vxxmQFHvEpCX+necCG21/wr+Y9alYv54SUVGqLv0J7JHTggvgq9JD4Bge+b2I5wUWweksKz+hwptNWvij3+ACXjt4OAvuloXqLJyy3aoM7I45DyV97uipnD8efTOGROtLYM1eFrqbOgr+x1mC5+wce2xXKO5zPwM+qe2jbLgGpms0kOcof9kTZ4au8ZmjvEAGxB3f493UhOPZ8KyR87cOmRHNKsb2NPk9+0cfxraDqMBYdSoWg/OhVsmg2Z4PAJJh2YJDWqp5mmjqSTg5txRGTJ2PGj1E8+GIMeCSNw7WqEbghw51mXbgClf7vaAH1cfP686jYHkkJbofYc4I2rPpWjht3aNL2wxvINOIStUiGw/rX32CrfwuGnZLgCOvzNL/KAg76NFIK3oHQ78F8ZKEsjzSqoayVPyC66hcuWPGSv7vvomUu42Chei4nB5+g7KUOEGo1hTzXJVHXrvV4LKsdXp74iRcmaXNDpR7ME1uEquK+8Cr9FNnpjWEXzRisijIlgahl8Gh+CEUo7KG5VQQthq481+Q26Yx/jweiZ5LuKRvaVSdFFyJOgtsDA9xxI5G8v5nCnMdz6WOjOFX6DaDYxwj8dt+GIHsOnm3oAKl/Vehr34ABHtrgkbOM1q9UQ8fBRMoJOUxDp3t55dexLKz4ANdetoJ6l3nQ8UEAYvTyWD9iLbjqzoeAh/fJ0OwXvfwdSy6quWhk2wOln4O44QHCiBv59H2pAhR8+Mgh0XZgk/WHzqzrZeNTapw96SbOONTJ8jge/tteSwoe4Tgk4kKmty9RmUYPr9qcB0+Vt8HSDxJcGRIPZqwNFx2s8OyqJMjPrICVrwJJXyUaBmkTf2zYRmepkVpXqsDGthHQM6mOk3Q7OdzhAbYNFOE+wUncd/sDdelf5PCeHnCdcQIq5qvAG3lT6Lk7jT6sC6DAXEswO/gNfM/thYgN0/HVnT76eqcECyynw7KdZ0j/bhVUj5mE+8IacKLPF1655T1LNaVhxh4NahiW4rs6CjDh4CNY0PoXxv++Q9fNFEGZzuFMVid8/AwjFXNg5vZZ/G20BBRtb2AlHwkqXveWn0V30rEFc3iPpAV+GTyIt0NXYFzKCAyyMIW/dRU8uO4K9GpswnP9f3FdnxV3JB3HZeIKXBKcyIel6ujin6lwPMGV0s9NhOYbyrTaOR/aj/zjpsly/DPei3cpzoPkKDksO0TQIJpMxdrlWOe5mVZvHoTdQ+mcflqQJ/m1wECOPddZxMPlBANwXjqKSns1ITQ8iX9HtOCHXwI09DCdg+2EwfCGG0ntWw/DegJwzW8bnzqbD4PdtmQ15RdG5ZhT7O0XpLr/Eugbd/HxWi2ITpKARofpWBMZjs7jiH1WnOKIRRro57YLKx6m0IFb7bS/tQEybqvDpEIvDHc6BY/TVDE1Wh22OObQldt3cfbiDNza+ZWsUiaih5UIKJtX8vRJeeg9vIxVPT/RptNTeaPjEVoseoKNN2nwtaTVsC1fFJZk6WH8Khn+KtbJKb+8+JhHAo5UWs67PT1xY3MP92S+waEiXUjTu04zUl5DePo82L7AmftSJ2O6jwWVbwzHjustYPZ2K1+2lITZYY507mg5PPgohHG9f8hQ9T+oVS+jZ6HW9GOxJEXFFnLNR3MQ8VDFNc65YLtMH/weRKLeXgkYL5+FxrKakH+6BX1FPPi8AsGC0yE8+/sUOtVtAat2CFN5XzJcMyyhxgsdpFKwhEUVyyhHXwMevazAF5NHkT+tpkwtR5Ltn0rrtzDpVFuyvbA4KZaqkLaYPOya5ou50TNI6fNp3np1FK0IE4JHx9NAbZkeJp+9w0v7V2HiOw1YtGcW2F+8R+GtQzDnXSZllElgkGgJ9h4xhaKAIZJzd6dZJ0whPe8KuJAQ1ZneQ4mjC6lX1IH7582BgC9xkBX4mFtG9FHpKEl4b+1LPQVncalzFM6/UIXaeXZwS6EMXvUU05Vn9vB861vMXjISgsd480aPI6T05gsfn2GBH5Vt0UpjP8jgdND89hmlhcX4ha0GHJiUydPzftHjuaMp5NUW7K5qROs7WvTE14tdxvpTpPoCSEoTBc+eVdA9KQVuaWpxufQ9POqazZ/rp/DJl6qw6Xcs5x3oAtdsJThRUMb1zrPosaM+fhzeTgPyNdT17Ti/8pIEKftFJCJ7g4tDpsLYc42QpjEd3nR7k8SiCox0TcJSH3foKJpBJXIv+fK4UNTJmA5Kc56jckAYBRx9icHT7lDj5ulwIOU79e26xnpXz/DOP8ak/E0JREq+cvw/aVr3Rpm/rXckX8OFPMLgE05VyqKFf9dD2Bek4WXicDwyFN+0+fKWoRpYbXESzjUvhJrnF8h+qwae8bsJB3cbo8RoUfgy6RR+KFfBOJID/5CbZP3ajxK/NkCx4TmqaH6HuwyT4d9kNQgvLWdoPI8wsxHVSvQ5vf0VXb0QBx+/fsbvyyzJWPMkrN2rAH/trFlnhR322HXBLtTHgt5mnpH9hQ7HxaJG6Ff4Y6jFoTI6sMRKCbaJvyE6X0n+1r9J8Lk5z4o8z4FR79kg+SF7ZC5n2ZmCcKC3gCXkNsGiKUdZbYIA6H47SC895+DmNx85bu1obEuVg1EC1mDQ9gUvLevBMXV7oftHH25VlsZmj0wWTuhHhbfFFDlxGY28xdAn8x2eVfngIXcfnrpCl8RyVHh7jyR0v12HTT5r6HK1MFuRHgRN1eJ4tyl0JNeRfYSUsNzJktQWm1N33TH8E4N8eGwm/J45Hs6faINDAkbQuuYdZlp84FFjLWk5HAHlDFlcvGwcLfnujRoDsnDbYielzXHnoqnOMPNDIr74FwzDzWGc4fURVSPyqdf/KifwZGiK/03apUNgcGot6UiEcubDHtpz4icoz1+B8ZPK4fLcWXDH1BQ841J5Rr4YTN8TiecO/AIT4YXkufUzbtg9E9/rxmFM12VcN1EA9pErr/7VBQ94NBmBNt4odkTlIA2qVgsmo2eF1BUPaPMOQaMhEKKGhFFcYDQts5pCjgPd4PBOk6cNnKHadAcaM+40jo+bBiO1n1LjgX5+bJfBPtLJaCr4DsYrnmBh0flYYbkZZ74VgpXb5UHOwYDbF/lhF5dSmUUAHFk2hnRlA3h8pRGMPfYWkm+V0ob1lmDe7Q812rLQ9WE7Hbtnh8Euv+m/0UZ480U3PtAfx7Fhz+h6rSJ88i7B+MIRVOs7CpSWLMOwMMJlDVXw30cbHNhSTpvX6MOtSnHYaPOIex5a49STxlwS3AGjz0eCQeBbTiwZJpcLk0lwVj4knpYF0x9GrJg3DvwVWnm+2CdYvr8eXYO0UeXDdLo0rw53qZfRLcMxUL+/nAv+foIL6aaYYG4PDonBlJlngEqduawu/IVvvzmNWhOFwd72L/vLFMAh74dYdisJDcPvwDmBe+Dltx2Djk6gnzvdkX9MAleva7RyYwMOjyhBYfkyAsM6GCyLpGt3gnj2A2Y9v+2YnSoBhcalmJH8l/yGPHif4HraO2EEGroo49bbkbD8UCe1Jm+iVw9FwNnCnPvv7YXhxFaSntKBGaJj2NPdmRtfuPGOqoX4rPg91HrJgsKGR2zx8BLXrVYEk5uXoeHEPvZw66fveqsh71kLhX+JwW0XTWDv8E08mp7PysFjYNTafeyWtpOWbjMn7eJ++kM21FnXAM2iivBr/zNIWn8MM93TabhoFNYoi5L2Uxd4+OEtDt0YT/HCD+hGmC4cHutGf8Jd8MfOJ/j7ghbPuHGEpISesvfHIswLn0U1r2w4MkEKimUOYePbPHa4moLHiz7TaJtkvlYaQioS/4HlQjUqeKtNvsJSMGpGDo9YMB9eOgXAM9MkSvFLgy4FR+rSDOCemGY6ZabCAfsFYaPVKo7ekUsp79ZjjEgSXBU6DW+3FGD9+XuoonODYsd4UbEGgHueJs4UEqX7i1pJ7vsB/Hd6IVVlD/Dfe6U8es4qiFUpQSNJAbDp+cFnd5TRVX9n6r18BC9Ez6LSOHOsSFTEov4KuP6qmxvdGPj4RLpZnAjW9YuJ57zjkxIOdCu/FO7eP0I3DFt4lY08FVoLwb4HH2DAJImWa4fT3xXj6G3Pe/iXPEhbl5iQuEwBPnJsA+EgLdBWV4RHh29SxeJdcNO7Choi46mgfzsesn8O2cbTAfek8tw6KXD+epmN/Lth9n+r8LyTLyY//8tD62NASsuFam0+Y/JZJzx7QgSCwvIhps4ascWFCh7q4pqu3bDf4xnOyh0AUzlpfpcdTaGzNYGtiM31TdAzpQre10mj6vf16C2zkrpPxrLumnn8POIpf/42AVIO9rK07FKar7yGrH2eQ+tiPQjoaaV6/7nQYtoJC/I/0vXdU6H+mio6mNjx1Cnz0EI2EZw1nKHnzFe4XFRCc/9cwZb82xA3LAAft4wk4yN3QCq6CobTNvJrhVS8MxLYfmEuHqgIJvOzHvjyqAR0OxO61x9j/c1T+dflk7T+01HQSf2C6Xc66W1rPt3ZVYYmdkqgTfepbGEGFZiGwkDvAZA46QpiJo+4VD2ZBk/lofPDVupyl4LZpQMUpuPBm4fTWUFQEOfcsqXhVFN49HohPbj9F/1sRHjFmYlgtTKWVK/1Uu0kH1gqI4PP117Dbp2nUCg+inaXruMrpWEwJd8ahO+Y4ZOzG2heZDS+clTCCdMSaXf1biiQEcI7N/ug9qYRGz1TgclJ8Zj+9TJoFY7jLemES8zzIMQrnue7XOdfVYthjUsfyVWpQdkrHzb4eZ+KghV5xYLxYLGynXcdfkDF9xp41sBCcpQRx9CvAhBVto4dxjP/sI3G59YaGL90iL1Fc/jZ4iNkNdWSX0gnwo2hKbDkSDP4jfPlc5nq5Bg+hpL2LSWnl1Vs4LCYjlaLgO3Ka/TfDAM4UqhIQ8uXUIT+WZz61JaV06dC1ofvvEWrkAfi7Oj48TTIOCoIfV+yeMlIcRzd94gah1/yE7uJ9G/bAFkeqOXxmstg3dJ5NC0dwKagH6dRGznEb6M5o0aw4Y5ojv/7jo+sHILFyuW8f40U/BU1hPKHdVy20ZHDP5/Drv924uS53nTkoiRre1/CC6onof9aCqyy1IBxHzfS29wHuE7JA6rdhsHkWj6aVZXyl13HaF1WDTmZOoPld3E4uvorP+Ft9B9E0M/kCPglvQUU9PXhu8NXvpQlAfZnruNacWvonPyTVtzwxKoF0bCh4Co9ZjHY66CDe83Kae75G0zt2iR8YzJMtSYefDCGrNgfNtTNhlSJvVi+byS4S7aSdH4ZeK0+TDvkJCBKWQNH2ZuRW5Y+uQQchm/ryvjUfg8M/aXNGXmXafQ/gDWvCXq2G9G+yx84e4w1dfZkw1V5QyoJkGbNUe58TcOQp27/A5k3tUEIHtK61lI2e2yJTw5+BcE18+hilRbNqiHyDNqGTyVWkOpHdVg98w/v3HIUS7+a0r27lRDichtdl97CgJHLYLFLH03pl+KDrzVBM8mKo6SvUotrASp13ab9Z+3g6j4hGDXblP+UT8Nm+aWY80gEus1mwAf5txi/voXidxyFdVsKqVx6KSxXX8kHLH/j3JAJEOWsCcdX24PrkB1vrxiim/7tuNi/lx1N08jmqhWdbS+juDQ7NrFWgOtbwkHynj6Gp32gb07Xcf21ZPrv3Ul6L5wCZk6jaPCxGrau0YUxX53wpt1VsikQBsmOQhy8OwI2zUqG7PY73PHzLP2sEcOuJISTgxfxYdEsMrr8H/xSasPnw4Ncx76olToRHu4vwAWuBqxuNw2+Cfph7JkULk1S4I0bi2FJvjtLmpnR9H2q+NUvF6xstfFVrAQUyi7n/V1RULd1L6wy9oXJMxz4RWUWTk9bzBd7D0Njdgbc6hOHOFkrOnRzLfddeU9PBVrIb20nLhKRJotRy9m5IJJD7fpQw8cC7ui+RrdQM54Re4YkRH/zx/RupAW57JDymB8kOlLsWBViVTFo8tbiJZf/omBmL6spq7DUPj3OUq6D2/kN9MO2DeJGLMSf4xQhv+cZ9kvdZFGxXVzfuwl1VOPIvn4t1+eY8ft38uQsG0/b/unBf6EL6IfBbb79GtBg6QDflqmiLxuFMEm7BBa9OMtKJ/P5lLgFNNVNw5XBvZjsvAJbst+x7cwnGO9Tgcu97/I6wfu4wV0HB84ZQvRxHYz7XknyDjU80XURp/+KA5GlE0i20xuzAkVQ4NN/HP5RBjpyzGm03Rma5L4e9ydW4cecVO5JKia5nVlY6Z+CrZGfyd9JFWZlHuI7qWZYncLo8FwDZSf8JHP7jbC1xAR3H9ICifqTMHGZCoxLC8Jr/9nywQo/TGivI9epERwWvwWdVhTywqjPvFa+hbb7qsLD5l14TeQZW0Yo0bT1n/HS43426NHiuvNJFPe5HXe6S1LNWHOY3j6SdIud8WfXQUDfLFixcisKyLpjTLMWNqclsU7oTdj20BjcjQ/imntHoKzxEN87cwb/fqzDzOYITJX7B+8uNWDKJ3n8vF8NlgxP4H2tZ1neFunmYXdW32xLwmWxaDTGD40qpMDDMRw/JKtAp44sqNU3Q3baDz6VXAf2FAjbVtfw3rJsuN/vwUIXR9AkmRFgnvQWvu+YzJvUN9Ab314ykNWiwjuXWaonHv/bK8unhBzg6IA6bJ8WyGGLx1Pg6vX89mUM7PtUTK7y0/nEwRLuEbiEzf4Z6H1HBprqW6BxmxysrNQjkXApWM25rLhWiit9imhw6yAeWL+SlgeNh31OXRD1tgbueoynK2+MeYqkJ2RfHMFq/jtpxbwPKB82ihegIty4+AiSHq5D1dhteOjLbHy4PJUGszyxMP4+NRvm0dLONN69UgxOOSxnx08XoWaNL5jmjgQ7q8eEMsN0b/wwa/T7crCLLjeumAzTtvhBsVwETf46iiZ9PcXrN+XzmKDNsOGaNNt/+Ii1g+LsN3UkfNj4lKZdnMv05zFMcGmn2ueSUGGlB6n7kqnRLhjGpg9DU7AoLHO0BREJO7jS4krj3UW4Y+Yiul/7CgOfpINw2md4v0SEI3tMQc2mlBwig2DL/NFwb+xqshY8D5XSdvTjrC3ptd7hyfGLWXijKOxM/IHymw5hVcEX+uNrhRtOn0W3JcaQldFD++tt+ELQY36KKjBvxxMaubadpNUNeeT+E+AjMhpObshC8TR9fCJ2gTq13rLgbGNYYe5EbVua6VFzNm2IC+WzH4fx8E5P9j92mGYecWBzQR2892w0fJ7NfGr2DmpaPoPO1S2jJpP5UKcxH94nbAbBqc8gSKuGymeZwUPhXvwsqwM3rRdg2MA30ijxp4sGbTS/uQiC8lr54W5TstBhMJDbh1+0DmK+2ApMX20H1lP0cMGIXtoyphBu5DaCyJ5iVg/VAvmgEqgsj6T51XZ4yVAdTZ5PxBq53VCzUh67V/TTmvpn/LTEADxfGuNOyxxsqhlF5suE0VJsD6Y8fYEya8aC6OReOie2gp4/MgCbvg6qulIDNT2tXLvpOW0LBBgjH84TD+egJhbRjpKDXOhlBIaq9eDkEU4L3iazl245y6T4QQIIYNSMOO4u38Eyall0T1kMMgp7IN1DANPGrOMFmwxg3KF8ONgbjet/lpLTlb0U55EJNwNGQ0LqIug/7MEbdQ1pgdQGPvxzOc5vnM8bpzxh+HAYHBrsUfK+ObR3PwavxfJU72ZM+Q8OgrHFSZpc/BOKvCLJx0UYPV48g87PoyDx+xJ65daMWlZ9mAR9oBETDyOUT3JCphl6ngtlqdYc/FMi+X/zf+ceNwQBVyE+dewiFhw2g87BLaSVa0sTp41DrWZXMHxXjHZhCnBAKwjEHhfwEociiP7BcEPmHQl+KYXoQVV4FOoPrbOL4Y/cGHj/7hmwyRIIuBUALm+Pou/i9yQ08JFs9Vs5RN8IT7i8BYMSWRBqfkypyZa4NvgMuMc54u3EAGjrFOQ3SoUkqPoHBTfG0GpdXbAfIYLjKmRJWnMbbitbCWueO6BeqClENCnjrczTLK7qSBf9NGHFs2Gsz9lMQiqTUEXLiz+saiLnu0vpTJYNvZ+WAsLXhUhCWx0+Kp2hoCI9CozQxLW7l1L7flO4474Nwu09SEduFRv+rISDwQRtbQWkMMuLLmfnYdd3oGmvOvjHphW0xWIN3TbL5vj25TTf3RIc1MvxqrsDRGjvIhPNDXBBxIMrOvWhpF2LO19vZqn5sVgnPg1yWh7Brh/ZMOAXyX6izjhnwmNSet8OpdpSdOCcBHSsrefmLoSV3Z2oeeoYqqmKgvn9cfA0/yU53I8HY6Pv/Ko7nYwDZPjqdhNwOZiKR5VaYdO4k/BgWyIfHIigpvfWTJnluP36NVCoCMfvZXogO+EuegQd5gtrN+PCtqnoETwC8lLyacSiThSOegmPh5phtOp4eGW+Cab8l8L3TSaT8pW77N1zHkJaTPDC1R+w484MTsydz2+TTOFy82c4usAKfnlcp1Ua66nzQB36zd0P4tu0qHHOdSy3TWXNIwxCgQJwW0qJ5km24nC6LGqo3OcDqmY017Oa1tT/g0Pdw5hhR3BT/ifINuzHy9nOkBm9i9/rf8GlI55CzdcwePqqmGq+f4Hr2YJgI7cB2uMLaMYnLZpUfozGX7nKVIa4y6cB7w+dx9ACN7ylbQlBZ2whcsZ/eHFbFp0TSoLRa8PZdmI2bJilyb9WfQZ0iKSZMePhdd4o/G02gi2+JVHKjjg+FrcI9s4FnBgszkBiVF+0CV7KSUEIV9KTMYvw18gE/KKlz0WLTqP5j1uA6fNhfMBLXBX9gTc1qMC4afvwY/lYtEgawfPXyJDsVF1c+eI2qZRmYc6NaDr3S53rmszgv199eMK5gEd8loPOgPXoM+op7FwQQfNKDbDUbi/uuRxE7hbjITZmM4hYb2Hfhnqcu/MTufwohYaiCdyuUMcPVMOoVCkdffqE4NUsd4gddZWc/FQhI7KcXVeYw81CT2rQkOB7CW1k1vyWtapkIai+Dzr8L/G0Da6Ucv4dHGzRQHmxONp/whYvrTsOR46Vw+hTclCZG4h27t/wpdMMunRxChhUXqU6NX2qtQ6HdXOH6W/gBFKbrwXyUSNAu7kI7dr20s47+TjzmSw4uuXBbrvREFxwAhbp7abjbkawZ6EPHw3/xqZRTnjfX5TWJBhDlsYkXv3HBgdmxOE5nSq4OTQRjCZKs3SgKqf3m8D0G1X05P1EZt5H5okKZNm3Ho4qCNENSVlQjl0B7tZJPH2+IMbfteHy5KscdKKFfugdoJJzbmiRvJBHRk2BPc8FOcO4mJ7sKqELYmPxi+1kSC2qhgWbVfHTB1+oGH+dJu4fDyJ+PvzQ5A89euzJ8XHXaZNNJSnuPk6iTdE48vJr/p59moUdpsN/IV1806qVnHSUKWvXUYpRfkk9JzShM+ASCFwYxQJqC9C3VR/S6Df43rXFeAFt+PPnMx7JHKKbN/7yvcP/MGxQC0NmLAP4OAamtHngxvxueLFWjnbsngVPDRP5xbZ2KGxwgSoRNXIzmYKrFowAz99FVJ1ez01ejRwtWgEe2zMx2L0LMs6HY5r9StKIzWfrN9NhbNVlvLY7A8Kqb0HHT0n+++UPpt8botB1e8lWA9lhxU6ufS8LJVcDUU/LgLozrNH5VTgrr07C5+/2cWljEn2UM4fBm76o8WIyXHxpjwOWc+Dd90dUu8aBs75fY0t5cWjxmwedGRcxQbWaJjwVBp/EHxScZ0bzw0/xhZov7JBwC7uuN8DoggTQCLrNxnulYbBQCipZEzr+puCq48vYNTKKPA2ecN2i6ZSoVkvyAtdI79cyXKpvAeuvTeGxMbN54em1eGLTPB7+WQ7qA/+wd9sW3ixiDz+qs3jXijEgYuBDu0fMoYfrQvnc90zO+F3CTwuewErfUGzwnc5WOy9R2WJxEJGyQnXvYhCb6khdHjq4750ChizeD57h0/jQmwRuWd4B6oOWoJJ8kV5M1YEZc6r4S9wj/rvmAPzp2wyaBZpsL1MGY7eFsF7aBCgQreVZmZqwOMGJ9Rrm4aF//8A9w43qKwXAo3kvtLy8At4GktBQFQhb9etZbbY8St19QKq3dWl1xXouEc+hkWLZGBAmgektirDk/UjsVDWjxZZFGJbWTU3vBPDYeg1S1XyOT3dsR+muPTj5pTacHqzHw7aVaNrlQjrHZtOe7kB4kfyanXgIHkyMpB/hu7BQVwSmnAom04JuLtqUBd2x7zirOwNvXmpnNd4Ii75msOTyXlhYgWBp/J7FPk8HtdBGbtO+ApprYzF0szPIfPZm7b2/2NZJCev/swJasATv/noM5leqwMj/KJVXGtF6by+OWdQNIwt9UW+PO2mG6sGy3HQ0yxlm60JxXCmZjB2+5zjyqj2sHHwLsfOrsDw2gVddNwe3AQuqCZ6EUz89gZQKOfh3Uox+jvTmDfiZ+03uwc7ff+hXlhxE7pDj6UGPwfhbPtctjAaQnUWWn2XI4G8DbNtTiftO9eAJK2O431sHFzJO487u1+A6U5BEFkihuXEfTLd5S8OZYax23hxDa5VB1q4U3MLaUEH/C3Yn94CR3wA6alnyuUw73Hb4GuRXxvL7ZmnIu5TPgkYCVF6aitskenBJ6EdeECOBr9t+0JyKJLL/NMC5VyfC0fxIShlegj01Z2BJoCj1iafhcXHinxfq8FiADaV0F3HGumnw6X4r+TYuAPUxAyjrW4tPwlph6rl68qyxpgMeHSS68jPZzxSCNeo13JL+j+/MvMxeA3JgcCKMEuv9ULM9HEQiNtB641cUI2AG5i/e4sEIP3y5r4MddDRozU5pcCgMoz01VvAkLhGnlgoyiQtCatAoinNL5Oq1Byi+PB9+/cglW1NTdE6YwlF/PkHW1nAcNVMAsnVcKW/hPzRXvAWmXWksXaJLvx4ugr8JBF+c87BK1xHyr6vB1lsaFDypidtTfSDxjBclnNvNLT7WZCHUydXTK+BmbzR+2qwNzbuSOaXjPVk4l4HnquuoV7SRhKQM8e+x9fRFV4csR6qwyYkRsFGlmj7u0YYzx/rZ89sc3mNgiwrBbdxeZg62p5pgzkNXODTHBFKqNmPcWW+Yua4GTOwXolrUKco/Vo4OV1rhfc40VB+/i+zqpUG7Yz3ktDWhiJwbGZe/IfE6PTrorAfnxjhQqVM2BcgJwY3/JGGVmCEEug7Cx4QCuBQdx0YTWslowRCse62MIq3zefcHSUoTFwShtCI0PfKXtR4tZ+Xbb+Hn1SAUXPwewsKMaXWaLC2JMofTtRqwZd5RnmQtiBmObZSsW0gR+sfR8KIdzLCvgrzqgzArKxeeu1tBdPUmOnDqCwWXT+GXnnPw0PEjJCLpRHc+p8J50xJYNUqMbpWbw9diL5Ab3AOb/jrgpKsPWXb/D/7XpQYiH0TRsugnwujPkGShD+2H/1FkRCNEJdnCZdE7vPDea/4aWYm6QlPp11A6LJPShXHJYyFktCfOLbaFDeVtMFd+IThn1YGU7Cw8+ayLH385Sp6vN5HylglQ65nB62bf5gX7DOnLYieAQzoY+VcYxaT7eOi+B87eWsm6DvqQ7fIXVey84MfWYTI/m0UpkxA2CCzng957IcfzPdxbt4Ky3A2gXzOXLF7fgvdjsjC2fxPXmGrQuaBs/LpVjv9WOmJGShd95skQWrSGReeZ4fhPPWTsHsL1ji/g05eXoNYtzuJ1ivQz8yvODZIE2Sm6INvtTA2dknykp5wyMpWg87Qh9jSXgsrObzj+WR8N3pwC0np6EPjWk77quFL2Sy/K2nuK+yYo4MmWg1gj+Q2sm9xgs6sy/IxeSUdcJnKngzd3eCuR/QZpOjuhFz5O2cBeD9PZ55A3zWjVh/X7roFPVR7+nf8P2maL4oCvDVy8d4wjzsljutEV3qtuBKAIsNlpOQxm3+QK4ZUY+7oejFfm8+1PeWQ9eBw7/1WieZgOTC+WgUcLl0Du3QRa9GcB/apW5oGsl2T+PphnPpuL17PCyGrxDahdrgPOI7Zx0P0WTLoxjS50V8Pesl72kz1OE6a+QNuQK9D9Rxx+mE2Bfb9us80xF+w7MQeUa17jd9vr2JkG0BlVC9/faVDdq7UwfZ0wVA3thic5l9kybi2MnTiJ7J8Bq25YSRImC7CszgULOwbAQF8GDjiV8Yk75XjlRgfVbl9Fcy6LwEq9GJizIQJfl41Gu4yHoK0jCgc32dPeki4qvxtITa5lHDB8lk6ukMa0w5P5tLc2Dm39hvNMzcDm33nasdyAxHLng9y7OupvdwLlzg44ZjaJReIrecXoz1T1SQfENOtI6PpZzBBMYZvrx2FAUAmbBKdyZuwH+BHkBfrGthztJQSRQ6dp7fIGuKB4CQLiqzA2YhtoRbag7Ic4DK03xXd7grBq2ApejzfA0twZ6KZxkzv3xZJp3AheP9sIRe89od+HZ+LHv8o8eFsEsj6dp9u+HvSoU4888iR5ttl8uqj/BPIej+LlRsGgFnYQrZZqQUj/AjAVuY0bvQPx9JVslu8V58Saf0g1a+DB9++UYZTDEhEScEn4K5xe0AyL/jsEC2XEaPTOPdyZ1MIbzGw5LE4BR2okU2XVRMhPesPVdbKsd0afetxDWe34LW7adwnOlZyCmbfO8hpZfWQlQYifKocJJyPhq/0QH/O7xnfvHcb98yzoXtUSnFDey65drXwyfRxM1riHzsffQ8yfdpYpTKDJcldp85P/YPknxOpXYpyflAhdkpPgVMdm0r3oCgdCleD4DVMom+4IX0MnkWqlOnbvP09tYZfoU8kk+J6phJGhImhxMA39inV51gMD8jnqAC6vqyD1WA2dNY/mVwKW4N+Wy9fl1+Kzp9mI49pYdc8iTjUoI5M3AzwvxBOecjWE/9UHktbBD+/OgULIIAdzAfTOGY16C9uxWroZ9+UQqvrvxT+pgnBjjRGeeBBH81x+ssBGBZqWHAgnDa1R98FO8B2RxvPFdWhOoS44LS3GmEkSsHLHO9yilAzjo3ZQYs1bXFFwF1MtBLnNfAH+W6ANTR8WoeSxSLbxnU8lb+9wm3ALH6neCDGzy5nnn+Rvxa3UXTYOzj51AsXF38hgyUkQzCzCxKJiiii6g1GuK3BY/wNuG7an9NsToVzBGpecDsOjE1bjwcZbtCn9Pfj1TsVtIY441iePdBtlsFpSFnJVXvDrp5vo584J5OFXhj8+aaOc4V5Uv5LLQWMfgGXcLxrXPhkeFZ5lo8hmGD3uACiJ7qYp6wrhsEQ4SuS+5phDwygv1IGKYqbQ37EAXn9NoVlP1+IZtW2ge82Uzp0oRLun40A90gt25DlQzmNxUJ1Qg1lCubyl6SebGPSQqWQNaejfhte7syCMJ9D+I4q8L0cG7G7FU/r7b6hUJw1n8u3pWXguR51RR79lO/HS/C64VDsDa53EoSFmAnsdW8xBr95RBImQQsMf2nx7A2i9bKNFKSmkFfMATw9qQeT6t/ivfQMs7l9Eyzt7eftjXTw1cjRuPV0C85ymstYTpGAdaegSGMUJJy/x+s1FeCXUk28biNPZUXV83SkBXkkvJvWnwTT703gweh2JvY8LqHFfH4z/foW0HmaR6rdAMrWazvc2meDtIz788eNI2DBvG6vYRePOqCyUspyP1komkCPbjVZdO2jaYAat7k3A9FtSYBM7hc/u8qZacQVItlmKs0684x/f7/Ii80s445A2bDLZCeO3iMOD1O+U570Ujf/Es4/zDkgMiAEpy14sAzvyEzJFgXlujK6akD15DS20GU+OQwE8c8MsKGzW4ImWmyDz+wpwvPiakhXKuDxOCKIddpJ4zl1uOF8Nkw5mgHC/KNTGPEeXYHPwuOPCBdU7uTGDYWe4P/ud+QojFhL7uavjrtDP+K/SATdWq1PKlAvQdcYMjtWqwPXpNZSkth2uxsXQ0OJeEo/yw8DL+9i3mjj61lFonHEAiv5OhPfy09HCfzbF/ROEEQm2fLN4BbS+jeEKS2d6eHks7pGVoN65E+DtjHL2MctG44y1INGkzB2jI8Hn/g1eMdadcMxHnupazN6FRvDvUxXMO3sDL5gHw4fJ/dxnYoNjLz0jh+AmPGpohFvK4mBSoCaMf6xP/ePWg5pEP29cUgVzTyjT1u8NYJKahX15CvzG+xg8TLWC07lDUDRBGd/dzSCznYI0M60XO6sMObjdDW1MlvGbv8241F0Elt+5gLLNb3BNhwpdHxSmU10z+dw1YXTd5cMJh//BqfRPrPBFEsakjMK7W37jokDAlwlW/Gn+WTT9uoZKG1+QwsVydN31Dxcr64PspG/oLzyHg9wMcKKZN93/1EuLTguyQulz0lDPBUd9b3wBCvD0RwnKpclj1MsQ3io6Fj4n/YVr6Z0Y7NDHVYHBMGaPJmSEGcJswTgumnUbV6snklzfAfhGY2HSQD0oPUVcp7YMFEb85uIsA1AcPEI77l7ACfHV6BWOcPS/j9DzdhvcMHmHUsf/QkdNIccrmwEfP42n/TdCTYsjKsqVYsTNTDyQOIGecRXYHnDkOVkqmBSvDn7SXfBB/QMrdH7EPw8XwBy9CIo59R3m7++iJ3diyGboGih4C4Hd6jDWi0A8nuoDoZoJcLA5gdaVzeHO1c84cMwTumCxjDIWasLnbQ28MaOeww7OowCPQV49NwgSX48DqY5wuF+tRz7z5vDvemFQ4p/Yt90Ujwdsgo1mr9lA4SHIjHvI3vOH8FHFLJxx5gBc+DEWJPY5cdWRebzAupuqR5/gJltzvnytmyd92waWby6Cc4cTVs+aDmXTX5Gr7BacG+xChnNccGpoEC9fN5oSpnjg6Zl/sF9LljcJj4Sik0PU6ioLSQbT+NiBX7AdbHl4Qy2K1K3iA5FbIHvGOFjuqg73D9/l4LwBqKhz537hRtKKHcJiyVEUpruFZj66SzPPtcKaVZNB/swg/8tYQpuFTsAlyT141VmGzMec5CMG5dTq9JsnrPeg4DAD2K39EMe+eojPK36ziqk0zF7oT/J5faz1XZTrfRNIZ9xdxiZjqFPawm2mJRiz8A8FxM1Ab6taGH1mMt8L1OGnknns1rAbrdqmQP3UM5AAVdRzvJtcvjZhz95FVKHylHw9V3NfnC35ae6gpiVjoSDNjVqP9LGDcymGG8/Gmhcbuet6Ig0ZjMKrihdIfVYb4gkDKP0vCXc+UCL/T7IUc2khCsvLgGn0bJx6ZxbV6qWxjkoh3dJUhFTz17DlUTJVzJeAdNvFpCo3wFvGLMJfY6Qpq2crzNnYDGteAOgXDZDrrhB4mZsPYUuDqGmMNyWV3oMh060QqhcI46olqHylKsw0fkUni83hqk8yLQl5Tl6OjyBK6RFcrHQiPxkjUHz7lW9+MgK59x/YMk4QZ47sxJF96TBxvzhkJrlhgY0nzwwgLrnqwjKv5WFSxQOeZ/qcB280kYfKIWzIHeBxB2Kw2SsNZihMYy+rIsqaoQuCDqEI0gH89kk8qc5OoBd+CL9tDcGrqZVPPLEF7a5ifLpLEPTmeyJ+jqdxN19jYugbvCtgRK+Tx2CuvRv5ib2H2os/KG2CCdzwUuP1035AQW8WHRMwBH2nXziy5S12XRqFN17NwaWXz0OT4RSYF3cTMoOaQSHxHw0HbeWIMiM88b0Cj3QP4MwsWfKL72FXc2HoOCCP9m57sWWBME8//IRCrvwC58nyZKHXD3XhNgQ/rKg6UwHEe8Px8hJDjs2bg8dS/vIJvY0krDWH1M6/QZOhGKpbV4jG+/ThdY8EKU6ZAY25AXRwOcC8v820sKmWNCxDKLEiE80WqrPTFxkQCHQBc/F94DzbFr6N7IWJmMfvHW7jVHcpupgzDWJmpOPt1xJwf9Z9Dpj7EFfk5fD1iFlsfegMfnGIJhHnn3wppoZ/m+/ChtkAhQuHsfb+Wb6+9yieE1Ili08FfEz8BI598Ax39l2l8xEeOH63BbRtlEcThUnovd8dDvy7AjXn5als83iuVP7CAm5FeDFxH5s/14N1Xso8Iv0m/5z9FZ8GiuNOo5loatsDBZWj4JdMCZ4+7AczHhDExGzhzR1yIGTny6G7NtCYDTI0WvozN917yJ/mNYIwl6DlBhm4eNkCToYSdw71oXz3KHZf0QlpSY/B1qAd/MVfcSvk8JrCseA4dwNeT5rFri2PySEkFRZNiEDzVWdxzcoErLFdy/dLi/n0EkHQ3jWBZu8/Dz4uq0k5VoWXtv3jjgWxXOI6Hadf6eSKaxGobKYJDdITqCJzFUyd2sSbdaSpdcV7DO9QBDfx73htOAY8nITJc4oGnB53gfutAEPfn+cRYdH023oHn+fDpOi9B7R/J8Lzj9/pv4AxIGo1yINDn8DxdzFN12/EhzNDybMji9vmCWFKqT4P2hWTS60cnF/bg5sfHiJFRyX2ue6MWzXcOU72LvuH1LGGghu2THqEa/xFwL/xFVyc9oXWSY3C200/2WfROmrW0sT6EQt587xWNL0mj/sLFUHQzp9bJxwCUdMVTLO2Q967OTBd6C1oOutSXZMrtF6q4geB2rBEIhNv5Fxl5XJ3HK33gdosNuKMjE5QFIrhF+vPcYv3ctDI0wKx5CYceekAKkzJJgUvGT5+7QQNfdPAzvzXOJLFqD0Eca29HgwlfsVtp2eh8fk/fL9dDsycZ+D8gUb0r4jjcV5zULdXEFJWakKh4Wl2mDKJUx5F0XHTN2ggUMS73VOpNaoVx42uxRGTL0L+cmG4U9IJ7WIBkLnmBAle78ak/yJomoko5F7YQF22eiRyLQ1Cs+Thpk8h2O8ORkFJG9jeIc0uxhGUJ1mNu6eu4zdrndHbcgt8Wy4P7bn/4bflcRS9/w0mfu2niTrt/GzpdVbzDcVEIzOKnnEXTs+XAPL4Ag//RwB8AISAQAEA/aOtNK3SLu0t7WSUUaKoiIyISoOM0tAgUURERqGQ0BmRUBqSPUJJSqWkIpUkItzzWc96h9eztKUCHMkGfrBzP7oNb+XWjKV0bftFVCFjWCAcCYZxp3C97BuaUJHLz5aG449SaRAT66bTr9fQ1U0+8GaePgztVqHmcWOwcmEr2jos47LsQLSQFmTrbVro3PWJFIwb6c9JAXj08jDkWM6Gxx/9edvBHrrxdya2XgAM2T3MSrn78Deb8fj9+iBRD3xTcS33dpay1Gwfuq9rS88OMA8f/sofR8/Hv+vG4wYRTYhrrkD7oO0s9fAUtX7eBlXZ7/lSyjMa69yK497f4CeNYRh6whA61L/Ag959/NhTmGVGzuQ1HIZj5CIw7L84uK33GnsHrsBIUWkQjMzlhE3JvCA0lL5GDaNWcDqWxBzjuIgnJLlcH5YXCeHF1AmgI+MBK3wb6e+Pw6A7Mpe9j+9huTFXSCAli/6EVZOezGc6sMAaBuMl8GGSAJ26co7CYm7TxEcdNODwHfblRLLvTQGM9n7J78tUIGP3eLg+wxtKNH7ASO9BLrKup6+fhVnP6g/0pIfQcYPTbNc9FhbeD6aJM8RB7MFFnvQxigpFWihWTwqmlY3mFn1Tsqn4ycHGWrBSsJaFTn7H0ZqaeG1wAmS/vArK/6Too+BFPty9HaSP6+Pk86qwKWMnq9jcJN+hJLCYO4Zq5B6hoF8keNu+wbZOX/QIf8b7fWzB1DIHJPJO4SWrXBAM+Y7zpxSRGQ7QrU9GtOWjIjZ+eoUKktJgvFKEvmy8RK6emZz5RxAcnUXpw58IkhC9Q7xPirycz1LGeAHQudmFD41e8J2kLbz21xTadDKEXpqv4t9BLpQZ2c+rVZy5eFAY3NMieV1jNsXeC6MlfmPox7GJFG1jQGs/JPMZ+Qj+uF6KX4QIQWNuEGfu6sXEdmmUzKxkn9G5IGa4lOxCNuKFuktscmoAvWeIgXdzNSVfm0u+zT0ga+lOYWZaZByaQM4GC0Dk/QWa2beTE/ysAO+J8fyxidxsZUEr52+lcfmj4M7tPdTkJMrj3FPxdZU8OoyRhSHRMFRvLoL43bYEjRvhx5MSEDa0gyPTO+CK6RNeVByHO6IV4MHpRbyw7DZb7FVmmb6LbOX1HOqODVN7fB4bVdtCR3IiNPYpwpT0rbgygRj81OnmjNMUruOLW+5+xIpGJ/SUMWTBo3MxfJkw+J4rhbwtY1j73xC875nHmSL9tOhlAFydIcEL779D3Z8WfH+LCehppqHWpVZ4vDIR32puZ6eGDIwNzgNxv35caTwGsrdJke4CBOfhYNZ5kkNpSbnwwRLJP9McK6zGsc/sXjTsV4Xh8D0UnD0CUrrkWPrUHZ6TkMoBZj5sX2mAP4wz4HG6Cb/5MoXyWzugNV4SFn0IY/WM12DzVhPHFnzlyPQgPJt9DfTqrmOnzkg02WjArzQsYMP6WD5pLwd3LmxCV4MA+Df1LgQLNtKNSEWKqXgFbalxFF4mAmImezjk0B5w01Jh0clZLOxjCmL7vWmDhz8+sHpObj+20MefI2CVahv9Sg2lhce9OOVwCl+ecpwfUBDtvl7BfrZ9bKqcC9KdxrB0lxaJH2onVystHhmsS9dE71Hebg+qV5qBG41t6GnOOWqeKANziz0AjyTQqh1JJL/tBSQuNsfPfft4X0cBWJiPxCylfxSyYRJM7nTmauuR/FbbEV6OICxR/Mw3L09Bj+o6zA8Iwb9HbFFpnhbEt4fRiouL4NjbON4z2Qey102FL6bIlh2DYPTvJcUXBNKmZ1pg2NmMshOe8NmMRDKyS6B/tU9pw8BitpOfCT8qb+Bkv25Y0qgJActuY1JoJx0t+oVOlwPBubgTMk6n07Xd9ZyZWowqAwcxxVsfpGar0PoUIV5ms4Dcur0w5koSJLnbkEJZDlduFwHXDCdurzGDe+WmMOPhWZry9RmMzVjDyuV7SUJyCW/raya0/0GbRBfiNAl7qH7wB40OdeD0MTkgJ6cLItbP4Oy5e1hkaUcioRoYZBcPzfcEwaX0O+bu9OIfY8O4NKmfJhnbwNe/ymTsugaVXYzATvsbBtRoQbByOt+8bcXf//Xy7cfH4cjOBzxcdpEcR29lGfFmXBmlxeVvlGGL1CfOzsuGpIeXWKGd0XSROWcqypLs+U9UenYj1WrbgKC6NsxeZAe2ezPIa30X6R/NxBPR5cSfj0DyRADXN6Y4eEOBi/OsoPrXZbi0cgv1NpjiNn9Xzms+hE7BiiAnOgA9JkVokbgAVmxWgIJEedBybsX/lrWjfpgrxzbo4rS0W9wX+QqfZffDJ8N3/OPuKNBa8geevimDrXsz2WG3HVfv0Mc0t5MwrCjLI+4W8auN+0EqQw88zuRx/a0NrN5xnJ2kbkDU6Ln4EWfxGtHVrDz8kwVsP9O3lQS/MzzQbsEozBaMpc2RmrxtcRpebTtH4euWQJB1L9/U+g/yi+QgsdqLFoz5Dfn7N8C/n3LwNWQCuVSV4iHVZj4jLUuht+6CtZcGTKUwOlwjxLPZj5LyRvAGdqbzU19wkOpKuNS8AXY3bMOWLF346Ylk/scXs2QfkJsCwZoaBwj49YNT5D7TJQ1HFMiZh4tHTACtectBdnEd11X+5lG9nZy7N53tb9TCtwFf2vbGCXolx9PDOjm4q3KNz73xQ1uez+sMQjhk8Vt+N9IUOpKNodn7J3ekidDlPmU4IreC/vRPg3cqN+nsfKArbco844Qw/w4Rh7s9LhD/+gO/LZCDxD3XYaSEFGruf8/aOblU6R7D+W7+WODTxNhWzGWJphwyYAVpoVeoK+gXaykcwKyIw9h2NoE6uQ3Sw4Jg1oxIfqf6iapjbGCevAlnV+3GpVVqdH2dHyyTLYaB3FU4e7Q+Sr5PppyQXKiUNYM3W42xbfQm5C0ZuGdcDp/3i4JNG3TpUG0iPBVZgTIFKXhJTwX+hPaDw5QQOu95AsfoSmFpqTYceZFMxhntdL4+iueXT4IX3gJwQL+I0r8YYpbaJIxJGcvPKq8B2Qaglkk0h4w9D1ePGKH4HEGo0j0NzXZpvLKuAVw1U+GUQix6RPmSjmQ5iE4rwrQvv8Fytz3EDcvhaoEB3mh+F6PPFGJcqRKllCfQfr8zGOiVCNdHnaatfULQtSmQd3xuR+NOY4odK02lPkL8+ed4unn1A6ywPwuFR51J5/FY2LFRkVuij2PbBhe0uRrFHyXdGdcdgsNpo+HSNeAT+bX00cAe/sBx8JxehfZjSshlizfM1GzB3pk7wXBMBbUsykeVIGf8t1oHBub6cs1/PWi3MgMfL6mleZ/7cJ2EIj3o+IxjyBTV9pdxmDiD1GcB3ng9DdJ6ttDy7AOQnwfgkPyLEt8m0igbY3b2dgbFh4oQtCaZblzppnDjC/x2my9Vpp/j3rmf4O2YIBxtbIY6v96DbrEBqNV/BWPp7Zww9jtJ64nhyCcicDVSBS+5h7OY6H9o3vAUt0ebgMPR+bg28gdVJN6FtnNO0JhQwD3Bd0nygRinxjzhMXvGkMtrKdgd68GX7yhhz4Ye0grLouaDSiCifJ62nl5D5vG30aGgB8rWyUJHwBfORCdqCt/Lk4yC6aP+FOpVusvP953lp0Ll4FDyjfPVrMF/RQ2V3KjinAeeOOqaJozRDOSo4WasCO2nsrHrofNuE+XomkBF9i/+pKzJR/+eo7GGaZRm1Ytaa/IxTeUxCglPw5kzgvitA0DexJUstNoTs7zusGXWRJoSNZeK+17Q9s7xHD/xOI+UO8QptgCf/a7Cv0lfYfk9Vfxm0A4jXujwrfgLRB7CVJG2CbdPzsE7wqaQrXQPXv9aDzHfEzAloJhybCbjDreL9DhtEy92yqLSzDb4uFkYRogvxK8CTznSSYcvj+7A1SJxLFyYQK2LAsHi8HdUNbhJqbO0YLagJ7nubcP0bfL8zKYICxruUfF8FXStj6GXOQAA2yiizhJq+6pwdsgwy13fToM1peTYFkYJOvZQ9ecmahdmgML16RQtKgqX7ULp+6Mf/DrFE3MfamHmYCRdT1PnO8LxJHmiifWlHOjnz5EwWVeOhfojWCO0EirWZ8HKt4Mgv3IlPTB5jnci3OBR23XcaaIP8uJL2fHrCXTQdWTz3HyoHMjHjp2qaDPcQEKOK1ncNIcHTWygfNodKn8WDeM8XVFlwn2s+baAjzxwgFTxxTj9iSBZGopCzgcLiLIeArF2EdzSMw2NVQsg96Q/rz1iBLWywWwybgfNenyX3p9Wg9oeEZoxaRV5tdiSieZz0Fz7lh/MsuMV/JPzdjnA5SIn2L/NAk6tjcB7So4QGXAOF705SZqEXPTyFr27s4YLaSr7Xh+AJawFQxNV4NOeYopxnsVLvNuopHgp1dQtQc1WEVLLcuYZQgswwH0EtM6OIiGn5+x2Igey0svQ4/o/aPB+hb8u/MBM0zCOniANZlu1QFXzGJ4ftwMm+nix3h8RVppWBpeS9+B+11I0teuDl/t+wqx3QqDz4g3Pv25OH9+00szqTMrfoIKmPxdzsNlU6jn7AP+9XM2+d3SgWegvQPUm7F+YR/dCntFNJwk0WugKZz5mEFgokbyaMa7rUQNhmQF4O/0qLDP0oAeDN8EvwQirHRtBc2k3G+28BuceToHfuvbwatMvdN58mbVEVfmBtCU9OS8BBz5soPEfGBcHJfFBDTU6+FYBYm6FspNsOEy5IMbjTsziOKnzWLy0m/Je+nD4g1hIfzRE2Y9k4cGpGrL2mEEG5sFQc+MepK3KwqZ7E9ni1AHoTNJn7eqxDKskoW3RahqbEUb1QV3439pWvJbUQDHnu3m6qD7VSpxkhUu54BkzCe6XL2afFkU4qT4OH1T3gU3FanKL24rtEdfx2pg7MFXgHS4SGwf7fSpA5N55Xil9BRQyJ0Hrx4WwftUvdvG4wTESxTg5eydE+E6CNpUocBixFQ+dO4jj79fhBmNnCKndSScn7qVLXEUDg1EobW0KZzZOwNHrx0ON6Uc8MC4MhB+ZY1jKTZQ5NZdnKonRhq8dHHN4DOzzzMMZnc8wKfc+SLEA5p5fBUsvKvFOI3UqPSoCXR0TubxGETYclYWz25IhQrgOu5yc4J3lX0722gGp+01oasIN7otQZ+trsjCv2AOmvNsHYaNe07FZZXxqzU8OUEyGa935/OeFNzwVLOXkf+Nhac5Ber4JIV/1DycsRU62vw/nyleg8vtnpCt0l/19x8LW2+Lg8d4X5RO3wqW+TJzWMosXROzh88uqMWHYHQ0ETDFaqglEDwlBXM9HGpE0B1WuGbOJ4GN4G/8Ny0+J8N2cFAjKn8cqGmNByGsi8A5l+O9LB+atk+PVLk9Y/3EvpOedheUTBSDkfhhfXJZMGoIi0BG0it+8nIWdG+9zmnAeHehpg0NZ6dS64h61z9GnAFjNJwfM4dCHB4Tdt3F1oShcVMvnSkl9PC75Cy/Gl/Lh+wV4ko+jI0nD0a92eOdoKV8fU4rbzySiofhGFHj3CW4MhHKcWy119d+m4rejYVHsb7zwoowOjgngU6GzKbJwEnDlPeyPl2M93w+cmKcOP9oMoCxFAjfmVVDeq3Ie/6mZPqy34T20iWKj5SFkewUclnoCAiwII/vCeXHtRt7VGYGztT1okYI8B87eCpGdN2C5SSAL3r+KIrN0AY/VcecEfypfG4w/En/BtZ5EetpWh6vWNfCSlXqwaesu8t7L0DJPgAd2HKGOS/54e95/EDZLjHSX/IaVd9/iLq8GTHe8wJZ9NvDlRjd5tmTSgwpx0vHrYIPeBbzt8Gp+JK0G0yyn0L/euWAwYAeGU6fihfQmyC1MAqNpTPLOo+DzEmHyfPgKjSkD117XAtlGexC8tIGOeVrSUOVyaK66iuphh6jsmyt73dOG5vfH0eiIBo73NISZB1t5lnotnG/rxKhty0lnkTFlzfpLq1WWgtb0CLK78xATNqnCzieL6Xu/HYlZiXGdUQAH+9+mSxeUYLjhBcX1CqPRunw84KML3hsvU8AedV67y5er4SAFHnlHF6PHoa1TF5p3u+Ku5qvketAc1F5oAPW44/aBqfRb/Q5Z5QKXL/6EY6vOQ8o0wF1r89Hz5UhwlZQEi/i31OajDPdt2oALHVEjrIW7J8mh3ZwQNG55yO9P60KQ/0paGitFxS6nKHSLIUffLMYnZfuod34a7boyzHckH0LbIkNYE1fP1w6GwNnSKNL84oUJHr+hWdALKWgyZfVOhm+n/GGa3mQ4kFdN92Oi8ajyC5r0IoNuwgMy/nkAbYvWcuf0M6y+dB9e61eBV6cm4XC7FyX9e8BznG1w+65MKLvZBnlf5sLE0iD+sHoF1dB4yNCWgORFZ2CBzla42DUbhq7MwK/hyEXd/8Aq1h3tRx9BKzEzKEgWpIATGRAQaQWScqbwQ1ePH6ZmwogvnjCu6CRUlthB8C8twJPtFHi9Gm0iTLFdqw9KrkriZ3ddODS3AMK338D3XZr4ZJIiDO0NA1WbHly/4T8e1jGAx6NEsHCHJezmFEwQ/Y8b7ePwg4cAJGwK4b8Hqlg1Vh7VCh/heRVVlL98nM7leWPtiotQqdlO9Y4GMH73Otg6YTyPsYziUdMyePTlJva7vgp9pLvRQM+MVoZupzoZA5i+fiYfbQrivtIavvy9BXxNt8PyhGLYlKmLUxR2gvfSOLBIEYBV/Ytpd5A38DMFvjHnFx8XWw/h00dy2dr1KCM0CcIO1aGTpBGsVNSgeqVertUPYnWNSRwnZEG39g7CND8nsrwxEssXLMQ+NwKxazvYRTidnT230HEzN0j2/wFWDn6cPC+QwPEBqPbvQcl5irBYLgsnRM5CR+tX3GreQ7WtP2mvfhWtP6RPblWh8HqyNE02lYfroTPpZrEEGbtNAgfVOs5YYcAFdvNwuDILD4TlgPiG3RR9SRz+xDnQ3dk/IFG9kKpHCUC2w3e+4lIOZMRo0mLBDi/EscbCFo5IpfOH8Hp+obgKR5zdAeO6ZrHi7zAqrjEkpZZ7RNEXoHG3IWz5E8iap3rYuPA+hyhZU1bwY8ieFwhrL8bx4+HtoPlwLlodUwTvZybYtH4bDKQsxdZ2E5jm0A6LbwWBmKcfxMZFwKt3s8D6rhQ8HDGd3Vc1stRRA7goHMu/HHUgRDoFuhY184tFWvzcPQ88V6hD56kKFsRWdDffC2AgQ9N8XtDEWGGuWpWKZXk+2Pk8lTQejQJlPyfSrIjkVvc7gJnVFC53nxoeZ6DDSU9adNoLbzVaou+XMdDkvJQbuy7S763mdGubJKQdXQL3I8diy4I3uL+mgO3b12D2Slk48iidQsKKMFT4Os89U0hL1lvSvBZt+pL9mxZIjYIaB1sOG6sI12RHwR+rYe7qd8J1epvAZVE0lo3yIOtL+3nIdTcUXvSgamtbMJp3H/pGNpNlaTiu7nahy5Xq5BS7llbqKGPiQg2yN3gEhld0QWvObp607SM9VJpF/XtDaE+VAEywTie38gH4OsaFT/84h+3aI6F3xTfWeHYHH78awJUFXdjvPg7/pezjjTdb0PF1OwxNc6PWeZqg+3YlteUJQdpnQ9rp8BoeZu8g10fOPH7hZdQaHwuu3T9Y7bIaXK1Fip3+mr7+mk7d04txeM4FdnfTJ4EJb+DlWRlSn/kFbKvGgkJmIGyVkkDUlQPLvk0cP+zPzpHHUSfUGcO7ktl6+26q9pSFnVNMaHz+WAju0uezO+6Dk04ifLfOI91BFY40Zrq35iAdfaUJvalvsDLOg44t9WDfzniWHN+IB3rncnlUIB6bHULF1v1QMU0YNjQ+Y2cFW9o4x5wPqxZS6V0VqnU/jM75SWSa4MJ36mLwuqs6/Ff2nVx1denPlUoaqfmRW684g/xcQXiWOoh2Wb3k7XqIcyztoddHjGSqpWjzzQHeNCWZpw4PsExtAWSVXobyqD0g80sQg89JQfz6Gq4wb4EZOzvhktBGfFQgQH/Wa3FQbyx/jVtD8YeWw/pCCZD7pkB272Nh78N2qng2gbeMFGa9h850Pb+TEqxH82zZVDKK1YNwx9/w7OMw5PqdA/sjV0jtUxuve1+Nd78AUas1vh0Ood4UOZgrKws3zo4n8zBrlP0SyfoO2zF1rDK/M5Kh/M49MGmMHWYHjID/OqwoZ+o9ClTIoaHIWDC+rEq/hQ6Qn+8O+uOwg599mQpdg8rwri0d3DVGYm1NIR5NvcWz9gfDoucmXPG9mTekXuPLJl1wzBrBPL2cBwq/ss3CaNy6ZitWf3xFV9Z+BZWmmfh+zgGI07kGLRXqMHvZIno19QMqivVjSXoJlzqNJpWHTSDep46+E4O462wR1RxQgF8m6nBv41p0tW6FvVxOk+o1efm4agreH8Hbj4yj3dfE6EC/Fnw7UY4NAfXkQx/YtfAldGEI05kTeGVoBVyJ/UbJag1o+pbB4pEjvFMUpLzP/0GRRxMN+Jzj4o0WVPLFkFucHtHPkyk4pkEWpKbPYJ9937ninD3eC/iDlzxv80idsRC4bDbq+Y2CpIaPvGyLHpgsc4OGHH9acGUytwca8Z5LVyjCLIr3+Txi2VkXeG1kEewVN4AYpT7arBIKCwNXknvZX5YQjGWHs9motjqB5Ef8ID/BF1R63QyCXb6w42JJCp1bj0l1NfT94292uWjGQzbLKO9mCEP9BZz/XAmcPK3RyfY37ayU4I1/loKR0iZY+yYeJZ0j4aSBAix62c6HUm3AOe4gTOnswEW+IpDb24Vy8zLYTmQmvur4zF3S9/kNTeV5W8dCxTRfOp36gF6eqia3R6tQbWAlRkXtAW/fE/D9TBQiXYC54uOgrvoyRWVVgUxwO525Jgfv1p6jfVNPYobIMro3vAZ+W47DIfHRMAW+kJHPQ1yjUsCnBoZx1kQ7GF7yHk7dfYj+B7fjktlKUK0qAZNXRXPyodWktn8/XtVU4gmRA5Rg5c3aob9AtE6Xuhoec+ZqK7ippMQCY/bx+iOzabJEIzgcWsiqObLQUJMLkk2h8PjbHZzsPglemJ3j9KrLVFDpDAZQjhdiN4Nv23f+HGiHH3+d42UzhvHGKCX4JSMI8UHqlLn/Kypb3cdNWQ8peZMXvt/RREtry4DVd9NuqcmQUmrN56ZO5ZgrJdjWf4Z05o7gY67PIabTHSs1w2FQVZL237OHopsKeHWVK6tFbeX5R75w4sW3NEt9LAVkh8If/5l8Zu0YuvxPHG4uqWPV9hfkJzMakqc70du4M3BmnT2Fv95CZTufUFbJL1QeJQCvG7LIY28/thf20asvGrxe8CkGXVzACxXfQHdaDmmIzWd9GR14pdJDx1K8cdVZWZ4x7h9/+vgG/go3gJ5XJq7acgiM1/hC62YLwCP5KPHCEJfN3M8OFi9QyNmPJ9m6wmByIE6Ym0Jy9nrcNGwHOsKmVP/2Fm9Lno72y8x5XOhBqvNcQl09H+jWmX7cKnKdPtMkKHy+nyxNq3lKygQYVT4Z8q69poGDqrS7YRF/LzFipTmJfOK9FVgKW2BE1yyKG2dF7QWivEbfmrIll7JEvTJcb37DoW+7eFKLFRTLbUDJiyI0fn4B/u6zY+VcBwotX0u3F5yAOs08DJpiDg5LhWBndgB37N0N4R2qXHfhAN89kQqOx+T5gqMESiT4cm6SPiWOFwOZNiFKeOQN3uNvUK6wJx7UzsKo6zZsXyABkw1TCAKP0j49eViVOJ/VRgWwcNteDgscYsUaGbaKnkGbrW7z98QjcHnVB6gys4ZznepUpOPE2ptuotj86/Dv5W6adrUK/iVaU/nSUFhx8zZ3RkyAPAUrTPjSTU/uPYD7ibNAbtdq/qdbDfXKueAq8YkOjegly0/K8NHdlzBcm0wkj/Bv+7FUWB6Bsl1fseOEIuce+0FSwb9x1CEDkBr2At1bd3l8ZyDkiijzkV02uPChIp8yWw6ek0/BfeN8ujbLCspOr+bm2Nsw61AZ2evnc59gPUgt9KRssY3QEXwaR/l7csAyAYjq3wxWHgRKV10hmSbjm6k/2Kx/Mp993MTZ5d2UPaEYFm1SAt9N89FqaDTPgNEk7XWbj5uvpH2qGXBp7UbY7NjKZS3t1NE4ElY2lUPxJFc+6GfLXRNs6VSvK/mMHQ8Gr/Vwq0Q2BkIYvOxWhVpRbzSbcRyuF5xgoSPtsPhRHJlenc/pr6zA4nkEv9RRwZ3b5UH7zj5IS06i1HEueEDpCQ0s98UFiyXoQetuOLjyE+kInYI7ewzh0Zg98CPoKJZrxVF9oT3uL16J7bnhLN+eCE4C3vB26V5SdJQDp7K/cHZADj8ZiYD2k7fY6rke3584B0sKgqkwZBg3qv1hh0EJ+Ki3ET5XTaDyrkI+nx4KdeLzQDCF4ZL1XCybeg99IlpQ86UUbJnmTqeDWvg/hzt88dhq0IxQhq4vQqR1rwS7tefCicALuC8d4cxpbz734j6KmO6lhV0tXGKxDhaX+MGCJhuy1nwFg8/j8ZSrKgy5CFJk+3FWXZEIF5oc+UqjPy6xdcE052iWeG9NzZfPM0Yj6PdvYKGpc3mmbiQ80b8KSeptMHdnMIj8vQQRf89y0ORn+FPHFnqeu6Fx9W94F+HE3nKZuHjpDriWZAzVn47g41HXaeKHjyhbNRGmrtTiunUjeMO1TO7puUFNTVq452Q8Hp/kwCbfR6DRpGb6tk4JcnCIrOyV0OXRKo461Y4lcyJZKNqcq3M2wx3f8Xy2/i3u2aoOyW6ikGp4lp3yYzhriQJc2zYJmgfXsErVbPCzD8XKOVV0QlEYcu9WUdEIT9x8rJFi07Wo3uAtnq5rgft/VsO8bwLg5i8D7CgOfkmHua5hDzifDCT7DFmqVN1MI8Ons3dcHOx89wPqUuvh5WEZECpMxUblI3BrQiGe99nCOjJzMc1/FHSOyqRRgdIYttgTroQDGKlP4qLBBJQ8cg2Ptazll5/j+d9yed7j/ZQC9eLxa+sMOJImA2cM7oL012AWm3qNS769puBzv3F8bw3vPGoPvcfv4LT2Blj9WhsedomwnE8cuOqc5BGzR/C7Y5G012ssNEdex3kP5OjjsSaMqTKDKTct6N3vlyR3KJI/vNRFSt9IN5Yeo0jbGFb5IAY3DjykBm8tMPoWT+Lr1oDStGU4HZ/DoGkb3k7qgglWu2C27GvubWmh56gDk41e8PHg93jy2xl6ayiMFR1+3F+1HbZ5uaDassVwqzGMLMVkoN7CjQrPnoY7r91gkoUnmg06g2BhKV3RyIPAxQoYdC+ZFZZbgFqOMpyYbkIuNjlcbjfAO3yO4beKA3D070n8FmnDI+8jHKpRA/8njpyaNg+HXLaSW2UT/HkaB3dd3/FX280UK74WFUs8oGy2HLhYR3CB+3nyFY3DGxp2KIRRYGdRz3Gb38ASiZ2o8jobK8sVIcxoGF9cGaSNf4vorq0zGg/HoPHaCpaY+A/IMI79R6uAeqAxSB80gpsPcqBtmh//WqfHydm7QMPrBQS9eYJ75/zF27nRUFisDaOq9UnqnDIvOXQQQtKNMalADV/PdITNvtNQ+/5JPLFLE0rsJMEwoIm+pa2nAPv7XDTTif8uVqPMQQnoES9gzQencfseVU64oAmi/ZUQKmsN4pFXcYP4XFrm0AuT74bD33M2dKngMi5fbModSpIw43MYjhgfxMkiGRTVH0N5ByL50MTpcPLOMkqqT8aG6TNp/koheHVNi3iLKU14LMmqpYdoZH87ry7y5wH9n0xjh6B18WqSeqkCBRsD2VDtE/33oAhGj6qmzOg32FzvhSWF78DvxWu8E1dLHe068FQuD9aJObF4VQP/nDOE4/+7ywtbUjm9fj3svd6OkjVjSEt1LIw4sgV3WibTrqev+MGGI7AGxXid4nfoOSfMZgolMGWXPG8StodJD6bR4jm32D/AgMxsu/GvTAQoOCzmsUrpbKimSvvb/UC2VAhqU1L5TvZ2OlycwbXaG3lo0AE+ZlrgCsMGqBcbiQmPeynokigcV5aFXUKn2GtxGLQIPUaBn3rw5342mNQMwdWBEvBbdob1Kxj8vszAryKlfFI5gH27WzDX/ApuhKX4SEaQk/0Z5cX8GT7KwK8LT+jpKE3GU9rwu7EX7s/QwF17lOAuFUPtkReY+swYNasBdrpd5uVbH1Dd68VwL6UXXm22hKXT9tPpuE84eN+SZ03OpnWhk0Ai5gYKn2mgXx6K9ObAfTR5so04+xNEGQSQ/PM0+jHiJRYW2cHEP51oanINdzXak45gJW1/KIOyOpKI8c1wvmCQu5PWQUiVItwW/827Cxywsn8tTNId4lPvNsDDsI9cUiHBdivdsUPqLxxcOBmy7CZyfVUFHrXZyn3xS3Dqph4MkC5Am/YdaPYkHM8uJSqr1IBjs83IPGcWX9uTSqJr6sHNfznOHRqG96pbQXRGHlhkxUFRqww8LfpEAgOxtFpLhUQ65rPL+xcQdGs0Sh2aRG/XVPGB/Au4dJUS/HncRGZ309DJfDTjyUNkoX4Dt089zEmLm1lvtTVa7NuEKyepwvAeN+xsiMDUVx6wweYLXUv5R/uWlnPij8t4XvAV2fYQm31Qg8lLd0N5fyVPMX0L4rfvw7InNzn/uQlOr19Nr7RGsoj0NJiXYwQut9Zi0fGv7HlFC1T1/eD8REvozhjm9llm1OItj8PuBfzupw5oefzEiKGJVB9yFQuqz0LNlhrY6bgcn8nuQZ2SRFIalsNLI9RgZOETWB2zgMz6LqPoxaW48Lc2zutZxqvDXElitBS+mrsO3RJHwPMEPcj/DNAveA6UZ6+jnLL9ZH87HLzdzElBfBsYZp6H2fEikPepDI9t2YW79CvZxUgIm4uX01w7AfI2cqKqNXF49W0RWlcrwsLrqez60hYU2zfBlG02FHE0l/XS9NFNnqk+/Sc0zLrNhqlKUPOfP+YdcOT1RQ/xfUoxSkk7sszwDLpkYk1GLXdg8g8z+vBKED7tc+DhrHsorN7I0+v+UusoUYjtXsZP8mowqWwxLPOXJ693NrAm6DtcPNxCF+bsJ6mmNpyXVIAqfvU0GPQc4m4dJNHcYuDn4mDfvgX3JISj7G8bwHUJ5FFwA927pXCH/Ceq3X0JHX944tk5Y0BfXpI7nQs4XPkevfskiCIi6Twn6gycfXSBou8GwqK2C9ysqg0aYnNZ+/hjnrDPjfSOz+KDE1JJPcuJYzY8hUGah4faDHChDsC303ok6lnEj0KXs/wVK5A4Oor+OBbitGvlsF69lX95qMKJKgtYE94I7SoHWOt1J+rvSWLp2UC4pQx3Srag541oenVzBl/p0gXr4i0Yn9VF7YUrqG/aTrr1xw5LrxzAoUxrWvskAO48u00Bv6ShYew3lDrSAa8vFeDZ3aUg/e4LTd+ygJoULqPPomY++KURTkSbgcsZwHPHj2N89U6WCWjE1f7eXJFykooSd1Pz6xl8croBF70dC1sfDMFxlz5w1U4g14Wz4XhgP+z9MxFluz6j+ptfVHBmmMcAw8ZNLVijNJqboA5OXWnCdx0fSM/tGZ/KWITznrZC8MQYep1hCidspenb+FoY55KOfr4pnDT6MlifCqdv+3eB1Y4WNlJ6TGtWSYPWhUd0/nUyxb+aC3O/t+Ai++Uk51BHB412gcbNW7zu5Bfe7GoE+bFOOFlgNqyJn0VLxzxi2S+76eLCGJD1KOXoW7r0dII7nZ8zDrRO1bOLkiG9/BNAMc82Q4TEdE57fpyC8gwgheVYfOZRinAA+FmlTzd/mVFobyi81X3BNXgZSnwiYdBKDkeYFILr7KcomW0LRuoWUPh2ELz1vmDzLA+Qi/sPLz1VwnEDJrjT5jJMU/8GD9MITM5o0bhDs+Du8afQEWoBc52K8YJ/Gwse+kUxKXZcGLWTMppMwLZxA1x9L4yrve1xSlMU7Ep7AAEXc0C8zA3eDSLfHVfD/RaCMMZwCy4NOYT5ZstQnabSqs4reKBLjyNFDtIdxz5qb9TF1HPy8MYDELul6O/5t1z0TR61rOZh9+JhevvFHrdK+vGLgVTuPC4J90KG+OjkHtCzSOS0Eeb0O3sN9U2ZzJnPlkDdtKv4aXsmVbUpwZRvw5B6tBRFUiLIYHU4vH+mz0fa9mJtlAyFr9Fl9zglvq2A0BriSUEbr3CvwR+In1BCE2+9Iu2q9dAL39CXxpD0aSH+ecoW6obm8ebR4zDRRJcC8TOkWaRw6+dybJ9YjJIgiU2bzqOD2GhoefIepY3P8ZMjlZzkLI0LFSag8QkNevMmCtqlhkk9YTyp/bAGTtlIUmd7uGz1Xr645THlZC7D/G/fIak5ma88iUDhvkdoEK4GOof/UpVIA3UML6e00C7ur70D0jr2FPN7B1WNroD9E7xAVU8P1jVPpMji89AyqI+CDib4++NmjKiIhqhRIyh+pzjHe2vxxZuGoH5jGvzY78azk0Th9AxtDPjxHH31t3LLVw+4/XA+rf3iQOcfK0G7rzI2RG9D3/GlLDF5F7+uqKKsCfdo86iPZFr8lVZ0XIGiNns4OnsPN8z5ir2Kmlie7UVDl0tRofUq7/P1wDcS3jBv5Qg23WsMN9Y30cSscOJsIXjj/Bn3KSei9LIM6rNzoTMqWbxb5xfKfbcCv6BwTow8yvLf81lIfjKszw4Hr6ejeUldNpdFn8GY9c/xt5oA5JYu4ZJPe/jNTx1mAx9KupfErwt0eEucN0fCCF5lqosxVQYQe+gTevhk44ITx3DLu12053Y7mDlrYJ/mShgzqZsWTtZgS18hKCyphUHDQuxa24cRp9eA+J8ujIiYirZ0Fo0KJ1Ltc+DuVm24v6eOZTXGU9/RRp4Rns3PHdTwb+9vOlunC0ltQmD/+RGelhkHl+1iqVXmFWzJTyalX8akt3U6RA15slr3HEiS8kCzlM1QGmEBP2New32BIpDW3wBGfQM4bWMePJ+aCJbT1bBinxgF9+mCna8CXBHI4/cyfuQi9BoyDXZBocot3DFFGUbHSLBIhShNUt2NGckmUBOmCMv+zcRpn9fxo/fp1NoVCc1amjDy63P4vv0Cd/4cB/+8xUBw1TBuH3Ecbj97hMterID8hfNh6M8QiYRuJ52pwdjAgmxvMArkrFt5+Mkp7N5QThzfyxoR9ui3yosEJy0FucXO/K33NA4NjAefNwK487gM2Xw4zf9CD6KYTD7c8PWhWLcnnKunDWvcc3go1gYePvrGj87m0i7cT8VXYqHnSxxnZOqAl00w2BgYwY/TwpxYNwr2nNeHw+uUeMPUd/BkcBDNKJkN/wrQT0FnmP9pPZQ722P0HFHwd/7B98Ych4WBnfi86TrfOCfFodeDKeizGuxfAuxyIZFUSlVBxrIXLOqyIe1JEB3ME0DxoH24Cpbi+AuvWLlpBW3U20vTi4xAY912vt/0BzFqLufITqbjh2Rgj/UR8Ap4g7mPksl6pCgEpGjAL1tjyFrqRG2z5SChfg/ubmDyUlXmMDN/Tpjeja12ySQprA4nnmzALyZ7eOYoTRQfmgb/zVsDoRP/cO6fEh77VAAUKl5yWYI+FMoGUlnJMWj6dYIXffjI6xdvYfapYY+tJuhqugXOVXTB6goxeAsd4L+3DyIqhCnT/DOWLJ2K8dAAzdsb+MOIZkyTEeOYpvGwtXYf36uexym3MqnKJp9u5L2graufc3hMB/vU2dPY/Fz0rrEH48hObBAP4JQdsqxj7YqD8yKxJ1AZgm1m4ouzI8hipDlctbSC0AWatO9FPr356I8msvqc1t1Kls/e0A3vbJCceIuyXtthcL0A3AseDbFfboJB+geMLl6DE/6MwotmwliSNQY+N65FV6mzeHaPLAS3TuYz+zWh4X4ymOtEkITsS/yXMh1c+qvZan0JxCWGQbSeFrwt9UajT+Og5BHxjiQbPBCQDn4xW2HkuBKW/xVF1z90Y1mbPfyrnQrrDuyGTuVl3DJ5HJHgHdZZkYQTzvtxx8krVGoViD8bpWDG6Vd0YtYDuhYznuM076OgQg0ECjvTs7EK3HJxL04Ur+B/atKg4HoZlEZPxQcHEij0eAedLNkMHY9OUOAaQ36goM7N/ZsgtAeg6lAUT983hvQ1TCByUzbsPHKfDk5aS0Ml+ykl2h126cmRzkQlmGiowQay7dRytBwV98vjYmkf/B4yHy/JXOYL64J5u8g7PiIgCp9+fIL4n6PQifVY7p479HudRjcnK55udwc3xMVxbVsLH9mnCxVTZsHzNEfcrq8PXZVFPG9yKsbUVUIaZHKt40aerrkWZL/JQpaYBGl+LsJtmZ/ojMVD7M/cRHk5texrspA1p2vDet1AOpmuAvOTz1Bz/RT62jAGauLfo8KTQbQM3QKXKx/jv1p5agovgt/SCMuVp/A/0fXkXyfGilueU8POGOx3EEHntSYsfiyaP+JM6g03gzfuT9HXn+GiwG1UtXVAWT9Zjr6vSZbXNfn1bVda9UsO9z0yB2X3Es768wNAJxUbRi3BkOMmMKS9F96HhpBkaR92rHsGvat1weZULGfsb+DsY0J0KsYeS1cP0q1JBhziuIDHe50k/5C5fE9hBKybfYZM5hCPVy7Agz7RlGJRxAt2W1LrSndYu2oijojRohf7J0BO9wj8fMERlaM9ccn2k1R87xVN1fXBVzOLON0iiVRijtGiIFX4N9zFjilv4eUcV74cep/7vM/DiqK7tMQ+mD5ee8BHl4yDjlwByH/zBZz712Bb0C7+eU+FZSPV+clpCTqS+QQlNO/Sws4CHD1zFJzbn4D5USdBdqsi92+/AdviVkBzwGbcZ3UYB5rDcHtdGr9stITT2hO447co8+BE6FtZzIkthSgu3Mi9Hv4g1XOY9s+aAvE3rUHILAyvNs5k55QwnrmlFqdfc+AJogegT7kX5Mda4k/TYBK+bwhzBMzhyYghmJktzQtlBUCjv4+yp93HV9HP6fG0+bCi+yJFfTeAZIWJ5H8sCf7U6sIlfVUaun6Oavye8VwzJbpWsImnNQfw+xI1qP94EBL7W+jKn6uUW3iYp2nHs23nDF6uc5Dlq6xpyvOTqPNFDtwXf4LlNuVw7ZwAmOxrRJ9zJ2BKN5Hh60F011SieK/NrCsA0HhxHbQV/IUVxpEwWukinDsgBmoj18LXZClQ27eHNevOUGXgaAgbtxk+LTTFoEIx/B6XRaqD8TwmJRIsR5vDvRnpVF7rxJsdhaCweD0mbK+Csqtj2fm0FezN6aTJuIvLHANJ27mZon82Y2ePJezo+A7fTjjh7nuPcVWjLnc9SyONNWEQ+LKCjS8Ykof2P15VMArG/VnLG+O/0ZnEbHJXf0KVEr/wd20+G2aEwOjLVigbGgB39k6Er3MPkeyDXBiRqEb3xhzGuuUaVBx5D3OHP9H3pE5wSwojBblxcCgzg8db70WLXOLFlnthnPc8+ihzBTNUCil1gwm6vnpOOqPUYcXDt9hnI8jrtxVQKVmT9pr/0HR1GFqfzGfZyRfp6Men9K5CFz4ZttK+hu9cLe5Di2yHccHChRCTexnNfJQwxCoZrZJUyX+kGSjoL+GGtHm8+HwkJUY/Y8XTx2iDcicmSvryk4YWer86iryqJ4CW2U+U+TcXp/mtxWW74lnvXDD4LpgAGn/D6FJMJSp8jwL7VFF4Pe8ABjQ2Y49EEOZPdcBbsxP4VXEcPV8Tz5YVsVBfqIENisZQazcHKz1/8KbpXSg1KxtTPUWpXTKXEmvr+UahD978+pw8l4yBHbWF5JK4Fj8EHqb3ywbo240u2j90BwfLP/CECAF4uv8ufhywhBOj+tHYYxMI3mhiF6k32Nr2k3cW/kdZ9g4EKUHgpTqZpk+UAutnX9lhXAePXPAbA6sKaL55AJ5RMcCKngAIkDzIlzQP42ULDbgeng5HP/mj+5yzpF9QgHuPiGH46gb2G1XBhr/P4YriaDAaZIiZ00Y715xhj/luEG8+iTdAJ1zGEj40wRPn2r/mfZfFeBuKgbv3fBpb24IRO4Z4ZpkxvZiaA/9ql9Kqz64UJ2wLuz0W03DRSGg6Uwc6GYWsHt7K0uazcL95OMyt1MIYDUdYf2k1JiQq42SyBK+c9/ik5iSsHnsGKheJ4xu9ChIdHwcDWUjZrgdQTf4IJBjZwPV8FzgZNo4Nn2mS7FcRyt45DRrDB2iMgzLECrexnt4WWrBHGArO6DO4uDMmHOP1hS246NIjvHZDFDYqqsGYGhO2OVvOzW8NQG/peBYI/YNzGhTpYKEyRzTb8ozYfNLf+oi0zDT5qqgbKk6QBCsb5NKBWjxwow8qb5TT2POt7HJci2W/JsDIXdcgf58EFjsZwlxXdUrDVtSLr2KxLY7gOmjFUVVnwOXXHDBrjKAv6xLAK9QchgpV4MWKEjAUmYAvrraTs7Q2t1n3UkjsO3q+RZJcJM+RzorxYCk0m+4ZXAE6IQZq/0WQ2qNZVH4nkzacsUTXeeUw99dEnN1iDi+8VEg7O4RD7UbjswVjcHq+IrXd+oci0jUs3XkFDtnVk4mqGUywT+LzR1VJSsIIVb/k8exlAXy5fhmfPOaDgksqMfGyPG8TE4fZt+T4ovlvMNFq5C6P9/g1yJAOjkD8vu0vScRI0NpiLf62SwzCKptxdFQjZJxcQWue68G37jpqW5DNa002kOTAOJ75fCYrh0hAt2UGGmy6iTcze7jx0RawFr5OKcrnUPfjInCRbsWpwZE09b06FLoIwPBhJXB8ArTqyVVqkD/M7396gpC+KOX19mPxtjlY66QEl7Ydx2GHR/hzWzLbV12kfJOf4NbqDTtcGrE7Ug7mO2bQghoDWPh6LzZNi8d5CXm0fckLrt87yFHNx+l1cCKbXV1Iz19OAqVSRXAeGYuWf8dSjZoJvz3py41hEfy6UIeCnk2h+p/rIJpSMSlFHGJ/WHNHyFeKPOHEFsbKpN8zAypcf6N4QjmurujkdzuXQ+NMFbDNn8O1U13hr7sTfvOvpB2jndA9p4nuFO7nF/mT+eU/D37/fQK0zknHA9/Gw9KMPvSWM+eDHt00lPiVvkYqkquENu/eEwP/qSvAad8JXJ21kv+smAFPrWVJWPk/yn3Zw83LHoHjphf0ZYkLpgwbQmX1e7zw31de8SWahMXOc7OnI74OOYiVr4Q5eOwvlJ/qjjc/msLeiaswacNUSn/2lgrtNMDiqBJPeWYCkXMTMWTWSywJ68ZxC9Qg2lAc0qRiycV4E2yq0oCp9pWw5VYwdZ0tI98NevwuZwFpKGjCM+1uWO81jhSttrPUiFrQGL5KT/e/ZvWLO/BtYjv+1/ONSycqwjOrzRRVsYXDqss4KjICFgTPoEX6CayHu8BN/Tz9jrDGnnJ5EGj8zoola1H78yClyJdxv28bueb/RLucs5R/7CsanVzGP7QE4aa5LNUemgR+u9XQvbwOBm9oYP6RMlod1UrhG6/jF+MT6HrIAh6V9PP8fVloGrwe1W1qefDbWzh+8RU1CU9Bwalx+M9xK3tdNYAsoQfkP3IaH46dj6/cBMBWU5R7labDB99UShtVz6P722n+CDtYK6MO4zJW8JrMbpz3VIK+KZpS6MvD4HbtO+f6lOCWzh+cKysKQ5+cqUcuAJqyPEg7SIBbNFPY/WwszJA35LKW3fBgpCitahgHF2XTcLPtRvQ748/le/35qegk/GyP1FF9Brwl43h3NJHMZHl4U/wSmnesJPORVhDtJsLxte+g9dpOXFm9idyeToHqgYVYp6IOqtPX4Y8TyximlOPMdxspde4oSN1bTK+8yqHtQSoVbHSkQWMxGJSew4faD9MXqQhUahLBT9vs+J7LQkofKQAWI11J4Fs94WMrUL4+klfu6KRXdvWw60Q4Dbk+hMH2H5Rl14xhO+7Dj/RdVGlrADV4lNdJGtJcX2OWsFDgAwLaIDJqGW9ZZMmPR1rSDpOnLB0rBus7e8jD9CZ5xhehZuF1wDk2YOV0kAwfzgef/4m7D4UQFDUAwP8oigZpaChNmtqbQlZ2lFSUOk1UCJUklFHIKkoKLQmZlVEJLaGMUAllRGkglVLuY9wn+SSGOHjdR/KeIggKGY5U5ONFjzdG8Jm4M/Cg3gNPVSrADQkbLHDQh4Ou/TxwUxxOZCO5jajmpMMS/Ex1HBVKSvFwQjAvsruEPR4JtC0gn5fcUIHKO0O0qoBha7M6Xn5XC3U/muhN90Q80R8B0YuN8HOIEr2I0oaN7u3UqipJA/bPucBRmoQWTKeYU1dJLUMJdguvxf8K1CA5byKItejAo01FpCB+mqSafPhR2yuqy5bBxw2hHPUgB5RlLtCT9+OgZsl9HtuzFOo0FCBmWjCeurKFl1x9hS5vDqCAfw1OdHpJ9XPNoPRoHi6ROoD5eTfhzOFJmJUTxc+dU3nf08/wTGcnh+8zgspnopAzZTSm7u5iy85qUlovD0clJ9OdHUbw9rwh241yQ8mdD9CrRxQMbTxQR+QgyL+Ow0uK7zHqwkxs3n8Cqg4zGp0MpqNZhmjVbQN1IQMk2nKLT13djP128fxVQoD+eP2l+N9B1HXkHTbar6L0x1JAmupk51/ForpNWFZrS9vdh7DP9Dx8bdpDex8MoHboLC4dawkL+jRZW3oGfC4zheAjFTx913988Pd71G5swbsbCjnxgxWsuzEBppq95V87GmixsTfo2GtAgc1NzI5eROe9CrHv0UboSMpCn9WqEGu/mwSM5XBl9waw2Ic87+k1mma5g+scB6DjZx+q/tcJO7P14d6Li5ieORZCi1tguvUdEO9x5WF/P7ip3gBPFBLx10RXtJpLkJqsw8NH/uDLL/3QOuUynLqqifbFajT19mvs9rrPPP072iwUhfKvG0hh/2uImpdLPQnfoPuXHS/ANfTsQCb8uVdDCk6yvEJxLEi5B0Pkqm8ke90PfdZWU0pJBSVsUKGd9dvoy9kxlO09hj6YykNSoT9Z/2qGCEdBOmC4HfofbcZAu3ycEzIIoz+Jsc2I6aQ/ciJYBWYDxPXCjHmXaWfNTDhwMg2czO3R8loOh45Ywx4986hSyQx6YBKt6a8H4wI1En+TwJkeSaDcN4O/fIygOdbXYHPiTtofqAKb4leimKYtdRdtw+rJ2hQVdphmtm+CwVRpiB9VQAXDX6HohiI4qO3jasdy9J/lxkOZn/nNWE/sllYl9011ODJ6PtwbQGBvXch7rY0vNilDyUMnyHmzmXb/fU3x0eYkYXeAU3+7ULNlAl+OEwf3f9lsKNzAY6p8wLXIFobbzHGywiI2efUckk5EcPWvJNL4NhHGtGmi8OqHuP3zNU6+UQa67xZz+kpxHGj/CMdcq+GxeD11lVnCs7ZpbJ5eAj2tU7j9RBQdSJPDhH3phEEF1NcYjH1XF8J9B1WwnRXJ0nMyWb9wJB84+gB3W5fRse12VLzMDYLKNGDqs3yY/kQBvmS4U83aqeyjE893F9/B7Vv/kevkeTSj8wi+UokGQVlvPH5cFrYmjIRYESfs8kgipVuuuMxcjn1XuePA1HX4YdCAW11tEJ6IwqNSM9ro2Uxe1jfxWuYZ7Pu1D4Ml51BQWQ7ViCxHnTH3qObDSJB4PAv9sxvp5o2dNPb1H14jYkQ3Ws2huS2URTvXQOb1VBTKHA9dhlOApr6D+8E7QP3FFsApnVBkepkW3L8BK7otcdz8GMpLGgVrArN4yu4rtFFwFN+T20xPr76hNhdnkj/aBRGGtrRHuZQ1nM0g/E4E++7fy0E6a6n31jZ6p5DHYm0XSMX5Mc4WWAarutRo+O9USLgylfV22cH8L53wUM4JzO5+gkUutjh0aSy/W/kVt2vvwQnSOvAc6khX15zmrbtBqQ4O5Gc6l62s9bAzZz/N67hCLZXn6Me0cTDeNxSVk31RfWM1HU89RQ7eIyD3RxFuy0mmq/3X2HjmBtixfSRU9QTiNbVpuEl1AqcqnOZf75bxn5oINl3jgLHHhmBCpRUcfW8ID5JfUmepCbm3acNoYU28OekMNL1NxvB6FfxQeYlzonNwy1lJWLrRBDbPWkSCRYZk+1mZXAzX4b45sigm40uBrotp1TsBMh2tAhoj+iB6zGGWl+7EZRPGwCOncWAhXcnPpbpZ82UaLRz6D5Q9RsOdf+pwQzqQxh4dyUJv35HwB1n463yS93cL8/K6DP6x7B06+5vB5oAXYFsxE6QaImFvB1JFdAwNP5pPNbIBvMHFh1Td31DvTStINYjjZ1vz0WmXPxTXauKG8k2s5VVAA7vlIO9UInp7zsELS8ZC5+hoXhrbhsESunSqJYqvl5bQ8vyVKK9XhGnzBOF3w1c8q45QctyZGiyMQdFwE/0bWYv5KQFUM1oOnJQ6+fts5KOh9vA32BSKFoynbllvuvt0K2zr7aDWvgr00w9kUfN62Fb7iLbIbqExI8wgZX4535Tzo9e2T+H8sy88sXoHZ+gKgterfzgjNJ5GREgTG9vAZjktCIwpooLwV+w/+jS+bdDG22ZXQHuOJy/su88tbkhf7onBf2+60SmmiGJvmnKrdAKriowFvYcFpDPLET53rsOx3QvoWM8EGFX/lmxeAIhFdMGqHcLQfHIMP3/SQKkFLfDA9DhOfX+NEjys4VQE0Jqb7yGl3AcEda35a74eKy9ewYdfbMfZp+Vx/vVyviRhA26KM0Do/CPW2/SM9D/chntL3lPs5WxeH7qQzumEwIn0ZnI31gWhsRWEKibse+wjTex+CSoX39G6zKuweWErrJmvSmrmC6nx5VQIf5xJM2834tTcnSB29R7r2AjDVGcLaj67A65J96JZihSrz5cG08KdXKK/jxoW9/DPD9kwuvg/Lvm3kxdsjOVHx4gPn04DJRUb2Ko0mSQ2fiDe5MmBIlVwOimaj5/3Ij+/lVzWZ4ZLKxw5s3IqJA19IV/9Rt4gfYb/RN3kFWtS0dJXnZJXtIGBYRIf6J/FkeMmQrLuAt59sJoSVDXp1czdGGHpimOLHPiE7ixesnYrHO6zhYQputBpuQYFG01g80kbnny8hgMeF+C13Zth9O2FXNoSz+XefugeoQtDmsJ87UI5Zu/bRAeLf+Ppy0vQ5fQEPBnkQCvUXfBu+i2+e9ocHIKn426zqWxsqIzPzX15p94H3vZfBsvsvI66jlVwYmEH3LU0gA0f0+Dmg398+s8W9DQkNt5+ELb37sfXOa/wn2QQfHJoAk9PEXC88AFLxD3Q/tow3bvrwhcmPAC7fbIg0ubB+PwN980aTzvNlOBuVyBozzKDB72RcE1nP5CQPWevPAEXQ06jUGAeXmpr4lHyAiD17gdMd0+CL6vPgemkEhCd5cNZ4XlY+DEaguaOwlarYjAynAjzpKqw9XAuOLaJoLlBGexYugT9bI+gycUQunfbGqxsoul4ljwIx9+l/R2xPHVzO/03GEyB74Vhb+8snB1cybcFZFjpkDFkbJ4ESyaZgr59NwSnCMJbl0/8/IQ7Ba/2hTTtWfDGLp4slgCUxAqB19tBrPWcRAUD9Vh+dy4rHj6Nbe+votmBULaTdCO5KZNo8K04rPm0AFQ3vsbZzum020yISw5ZsMnKetzRXUVfGojGPDHlw7+0oDjwOiqeSgDd0c9p2RhZihzvCqKP9KGt9x8ZlDuAaNYiNPtjDT+VuzCt7y7X7DOmOcvvUerqPXRwVBklDr1B9P8HI/XeoHC0OmxVucbiqvHwdd8l9L55mh9eGIvKk46iaqQQOOfdgG7xKlKbMhWcqk/iavspdMzpL94Zp8jBO55h3io70mINFlooj0JPEgC+2oCUZi4ZHp8JH7RGcbqGNeJtBzYK6+Lr/g0QqqJJbR2X2DFfAgZwBf5uvQp798bRTRl/Mv3+ChQif5FJzjMQyruBk10N2G0cwBX7cto68TMcCA6mFXUakN+uBPvUaqBrsTfskWyCuTNLceM+FQif/o1cHMfAxxs5HFLmyvKvVTko5AhlFpWwwa9Imh9mDGGCwqCntQTv4B54V54A5bNNQb5yOXREd3JkVRRkrFTHNbIqOKtvHDw2TyCNnipobdxMGzTXY/YudzJt6IaupbfpwMdnVNlzmoXUBeGV2Wh0fqELtqekwW3LLFj9KpE+r1CB96Ei3FiRgssctlCMogE4hASCxrA1lI9Q54SwXpp84x4KGy+Eh4ZuZKQahVJbGqkhfyyMv1gHN76NxqQ4NUirVscRS9S4vvwvmV8ypouaW3h16lwOPWACrfPrQb+3F+tmm5N6uzFr9C6AActhPLw/A2KUZCjYXpEto6Shad04DB8wJcsZK1FFcjMvepIGh2W84OmocrB6rUiVjxTJcJcwXL1ZyhJve3ndIk98onsH88pi6egoWfpq5g8ufxP5Vrg4BEdbQOTwNU6/X4EC2w6C4UlXTFm9C/+7cAc7fj3jaIUOSLV8AcEgCdpXXtPQGitWjVyG9mPfYd4jA96v4YwJIi7Y+GQ2C0/eimWOUyD+uQyNlytDq3YHyNo0jrQyAnHfu1S+qGnHt117yW/6I7pYYwyhm+PpbcEQ9Ql8pZG7Z3JMXDH5f8/DDYlHMWv/L6rzzaFXNsrg6fyVqq2L0HeHP+WkiGJ01ip43ZIPiXkOmOnhTpmH7/PXg9Kg7Xsf1FSycZmhJW9IVaCe+gFWEk2nPpHF/PbkCfhmB7RHzBJ0wgCc345g6/NbaVNkFcVsL2RVwWrWuvcZf83Tg5OFR0CyWxvG1kWz0KcSvv/feXy2soiqYw/hs2dxEJXlx9M/HEWbm3eQ9ptAhP4FXlzjyM/19pGCpxsdvGyEP+8kwWi3MaCrAIxNIWgvOBK2qHtCyk5gqZP/saDEPKw/+oU2URf/uzENL6t+pj+GZ1np0khYLJRM4tsDwe16N+0zjKXvi2NgqkwBn3iznSzyk/BG2XGQvjEKJriJwH2vRSw8+x/X+Bnj6R2PIdI+B8suSWDc/Vm0aFsTlewygrrJMSCfugn2/j3LbwRbqPDmcyhR/M0SQn6oLdTAn89uQAevyTB4v4EvlBbQwshmXqk8BQ5ExbD/FV1W1zSDtU5G8PDKFzi6Vh0UkiOheXAUe6dNh8prc/hH8Eo+JDcDdtwqpX/r/sGgjSrUBarBmxPqfMLyDxakdPJXhZvgpbUHziseZt2HmyBpcyC2j51GE+VFYOqfrRg0PRhFnETZ/0EkbP7diUM/3XCw35X9083gYOI4+Hd9MqgqxUL2iA10f9ohunilCR3iLUCgdDFMEV1MkoWPecXbeC41EIcjXZc5Neo31QuGcUTeZuh21WNLqUGU9HJFv03PaJ+VG20Zrwf9C/6BtI0talmc4x0FcyjiLKDOWEEKeX4JpGe+grKpg0z3NeDM6legtS0A/0bNhvyDiaBtsgENMmJJonk8DAT6wBxRREm1ETD1yTLuNGvEB3eOkMhMX27oK+FdtX3oFX8RlROes9ne9zg+Tx9aLziBSN0Nbhs/h0/2HwB7+3607xTAb8e+072aW+Qq/QXKXhIsXXiYAuunobHKeDI4OInnORTDyNK76JuyCfeqJ2KX7WI4eIugX8oKTu34hY3qubRrhDhWygRgQnM1yhz7RoouGTSrToyqNUwhdliT/7Z+pXf5fyhrpAjY/oqGWwlbYQIpcZSePh/6YE7yRiNhbsZq6B5uwYFWWRD+2c8LbrTDxKdH4PoUeTh8sBDq/hrwvPGW4HeyA3RSh9jfeQ7HbxKBMaHt4PPJE+Qc92PnrSB8uek0G41Th/8SgCfKH4FbF+5D3L1CVpwxD8UCBklwwAtfiU4lhdVZnBSmB19aOnlVC2LcMTFMHqrDtSeaeKjnAs94rAH/cnJYUSeWHgWrw3qTu5zbdhiUy03oys9+XPVRiv+b9xTnyxZAiSGzddVliCcxUIuJwciZP7kjJp7WG5yCrT9WUJrxFay1XU1vso/B5fd2IDTbCNbsjgCLcb8pOGgRNHzPxhqdOj7e74LflM5RsK0HPO2NpAkvZGHIx5Duz+8Fwdh6KPdejJqUxgliKfBMwp5q+Sn4ObyBIgt9ELX2hsnvvNBpfzar5FbDtTP3SEB7G2+M2EtdL6XJeIUWOs60AjGngzTeFrGzTxXGxBeCQMBygAA7nEI/WGJyJNX+XY3CulNB8IE2HY27iMKj/Nl6zXXy9k7llFnXwVpEhz8c3cvWK77wYIwaBB1BXNNfi6t7Zel5iwMdK7sCd8mJRG4Vo6X7ORo45cabpwtB3FExDAhdTvAyBqKfzuR6pTB4KKuKDh+I7zgPgvJMO4yTIeg1CoWVhx+BfvtGPmLVh/KrBEDctQALVJEn3XuMGdn6tL5JBV709PJel0wY2v+cBIpcsMc8HEY9lEDZC7/IY6iRjgoMQwlow6JztZwsO4GVXXeBW6UiB7Rtx7dOSXzruR6kB75nbalWmpkuAN/LZOnevBE0/dVqVJQ7R+vXaOMp2wQYF2HKU9ryIEZsIx5OngADXo3UtmobzHF347GLFrLk5xRsKNLF3sOlWKz8i4b+5NCXyaKwJnUEbZ+Tj9JBnuie2IlzhH5Tib0Kzlr8BLelN8Nl9VwaSBgHyfe2obWWCtaaqeCxwGi0efOJLiPBE1VPXHsim29Vx4JXqBasEIyAtrmteGymF7T/dcVR+3Xour8Me57ZxULHmjDyxnS6G6ID06M60NMgg5ZPTqVQjXt4RPggy1hGQX1oPm0M2ADSS8dAf5EgjFpkxpFqa2FRaTRHbf6CiouMKMijircWtWPJJx107BkmwRXmMLLtJ1O2MS1UMkDhvz1kF+8OwYY7eFOuFopvmADxRZHQu3ICGM9g+rTel5/kWdH9djvseHEbJqzKpPEO+1nIYAqaht/l7i2iYHH+KzoV1sJnkXuon98JF1S6aJFqCJwq+QxrO2tJ/rgfOVtZwaNVTyB+bDsqh03hN/HFWLS9iXoH6mDNrk18RF+QCuNns1PNCPjzYZg/vOrEwNG/aW4J09LfW0B93nteuyAAun5chV1SxXxbRxXCmofYepwmcshLdAorwuM56azz/QK7HvtMPe0HUPfBNXAOsIJTohdA93EI/gyUBke7Eri8+wv9qVaBP7decfSxMRC+/A1cP6ILL1Pvwxe76dyvJoJXsz6SkXg77gnaSbHVseCwKQ9PpSxH3z1i8Ov7Oe7l7fhU1g+GF0xCP9EP+OLvD8qcJMRP3v3msy6TYaKFOsQbi/EE3IlihZo0NrwdXLZuR6HBXlYMCYG8v/fRY+IPFGgShET1OAxyOQ8pbl7QOv8Oqtk10btxK3nTxF7eslKaJ/WfpmxhYzBOWAk3Lm+Fx0OBNGnwP36wpBb2XTeFLY+TUCBxMm9fHYh7nazh8L1ENPunREvjfHGLkzSK9/7kymN7SF25F94O7KGJG0Xx12cZGGVZRA/W9qNVrytl6PVQs2UMnSxYjhPbH8PhyntYv/cjplcKg1nIDpL4MBMOvPHCtUH7ea5wGb6XjcT760SwymiYm9SqcL2UGeSPmsKlH0/zzTlZsFzVmG4J1OL5qcVs5fYOUuYdxb8ym0hi1wh47dqPNiIhvPPyJTx1+zS8XhMBncO1mBKxHnaPfYWagiu4NkIIxr58j5oTt5PTw3reU1ICKc1eOPZ0DSwcKKT62dN5dd0pzlo/Grw2dZDtNQ82VC+kaZuRo/7MgJHprjRvtSiFznJEbaM/YHpiPGQIm3DcqhvwTf4O9OxIgcqa16jttJDD/yRwfMV3njK5ABdLT4EJUtdo1fr9cI3a6UuSLxWtSeXxLh85dtQTjizOg/DrO+jBEwkonGmC6V3VYDVVltpQE4Tm3OMrsYNkFXEBZ3bloOeCLfit3hrchQ1plb040Ts/dp+TR3aWQGXpsaiiuAh+PtBGpR0/IWe5EIycp0YXzomQ4ikvNLE4SuuNG+jeUQmqjVaHkKEq3BQQRwqe4yFcWhl8lcVQ96MbhY2JQ0mvHwRp7Zj76Bn9Vn6Ic3se4foWIdi/r5KW10Tggaj7IBB8DmUOKZBxgQ/PN6rCOTsP4ie7YPrxVgs8A6fg62+SUHtlCU2IK+S0fS6k27yJHUOKyEf5JVe6LqfJR23A3E6Ywqab0W+zN+AwdJtKG+aBrdAh1A06TXm6fmw2KZd99FRgONkSE1/WYPbP7RxwOoHvboukmmUhUCuxBP1QgC8bqbNwizZ0FkfAlvW32U/9Kh/duh/m77qOwm5ivKEtBRoDhjg+/geYHRSEPY5DcH16K3/4ehC8pgXTrhtX0eRDBpz+to/ePTWgO+WzKT7I6v/m/5ZfaeaOdgO8q+uB1RPP4KMvjKfkS+ie6Wsar7kWGx9rYtaQJQgl6LBPTiX//C6JoulX6eWhKpzkHINmErng2ubPz/u84OAZIxi9Pow9l78Ds/OKdOZzC7lXx+HHmQmctSIJbp3fA0Wf3pBkpA5Ey84l/YQHYGfnRped1als0UY0+m8MLtn8iwRCQijA5icuHjEFvvWocX3XbVwcq0IBuh00K7+drNcbkew3NxKe0Qq7HK9A9OeJ4KZbgQJr82ivbDRMm7AYyiT0YbHPRWgMrATT3BySd44Gp8fK4JY+AlqylHH67HTw/P0Ev1V4o6zxEu49ncclSa282X0OhO+dBlumCJPnzX4Kj44Fp55r1BmcBEtWR+D0q9KsVa0EZRdf88+DqrDVUp/PV6phooUyDNbYkXe2IfHLaJq0Qove9/dzedh1PL5CH4pN6+HB6jto2fKTrKzf8yV3b/5VZkrqF37xg7zx8Gu3LEsWmMHS0Bqyr7CnZp8ZKDrNAMO9HsI3K1EQbAzAFuvxYPS6ADUqtGCTvhs06fdBoHgVGuckcUbfLlr5bQZO9jKGkv/yMNJmLc6cYwGW5zSobLU/Wxr85v3pxdAqsBpCbDbS0vn7+Et/NdYufEENwpbgtSIbnpvfx0TjO3i3ZxASv9mDhVYX3pklBydyd4GTsRkfHyUKpfUP6KNLOTcnHSS7uefxovwOLg1VRJ3L5nhtwSC3lI7G5bsUQDZIjEa9HwZP/3+YrPsZw2uXQYpfLvUbvQXPV1swIFYaI9sQjkrmw8RPIng2KJ7j54wh+dAafv0smdLlzcDwiC1XFWhi8aZxYOx8nnRcfcF9QImGntxF5ep3kOiH5DDFFF0XDYKM6zqONFCGwJiNEHezB1N3dJGk8Dp+aXuIT1TXQsvjkThv1SCZbCoFi5yRsFT3DLto7KZZiwXp3Iy1MOhSBVfQBL9tvc/S067iopsaPHemKIzV/ISiCjFwp9uaxKMf8Z66LTDT3YReHd8JbyWOYM/Fpzh7ljg4hHQifkhneviNNxoFo5gpwYBLNq2USeB7LiUUkenFj1tHQPq8fIjf9QInyybCZ2VLDn0ohyt5Ksw75ovPbi+l0w+a4JoigbRcES1MXAIDZs/w6prlvFgnDxddHku/Fj9hbesOHAMT6aWOABwVdGY+doH8ny6GwrB80v80lQUW7MUrLUvok4YynH5VAXu9x0BKgglo9LvAh6HD5Co1Cq0m5MA6xXKq3zueXRUmwOtH2li3bgSEPBYgx62v0OFhJ4pckOSLRsWgUdVEWdvS2Hbsb5o5ugGW60vDvqY/5P53DeUHtELFpzLUSleEGrxEhlkV4LzVl7eVTOCHCkIwNv4aTL60mAaWuxIo1mK+qAbPf9UPM1+9BOfkYzzDMYUSjlmBZqAnml9u4CPrvNEAxlC9oy2KtAZT9tp6vjNtNsxe4w0jw5RAw+w4vtm8E3S3HuVCOWM8dfIBfN5wEu7l91HOVmSP/k4eVywHM3b04b8Vk8iyLQdNbltRbK8JDD19RiPPz+XI4TFUVvsQVMZPgUcFduh1Nwu1BaJ49RQX6HMpgpaD3Rw01RNVDU5Dz85/cMxJHn6ulOaKtib88raP1dI60E77Jc1dvZC9qmNYa+MykKo2Qd1nwrDFt5Vfpk7kCT+OY3bpEjpVEo2+yid5ocI77m58RZ51plhdYArTC96DQ+koCA7qgua9q6jj7FOu3u4NdhPCQTzdBL9P6GLZIGV4qzcHV61yhNr/HlPpRgfI++8mX8bHlD8sAKrVjST8J4seuk8CuYGnuD/8CBxr2gThMz/i4STk0SOAbUzsOXyzBkbLB9AoSwG4dzEBwqW1KLHzAR2TeclO96rZr1mcPXwXw6MaGaRbO7BqkQnkHW5k38YUrFxvQt4muhza3IcizVuxSGgmmKqrgMzoIKgq1wSjIsQdtsm4b8YwdI/eBlfzv/MzVV/+6lHFazQ2k+aRNTwkLgd9zwrw0n5nXuRRit0TtmHiQUc8svAa3ZaW5YF5UXDmym849lQaXg/eQpkvznj4rCHfWvERfjYdY7uwEzDP1ZjdXkzk9YNGoK6gB8NlXWDw7w6cE1ajqLfveY7iEX52ZSldm6nPX5/0QvBwHdk0ScIC7yz0H+OHL+d7oFniKa6Mt0XN6R95WNwD0+4LcM3XfJry2BrKIiSp7qsK3Lk7mpdeKCOnOB2wPXAKyl0Oc2kvc8DZw7RceSI0DZrwbJVe/nPSgx36BPlssA/d0ttKaRuVeCEFkpz/Lio6JwhhOf5UYSsIa8PWolTNPugiGxzseInHbRvYRMMD5pYt4w0VBCGp//DRTQMgdVMSub+KDS41Y8EsQE1hHWyethpPnRjGaf9NAa3Rb+jfwC6wEiunKX7fcVSvIK687IxFf1dCRJMTr+nMxcqR5vCm0ZMf5oeDungCS6oUQV7GfdhqYAdzSyeC4/MhEKuXQftVqpC8woE2P7xNPReSMf3yMAgHH4ZNmoE8ce5LWCGkT8UJB/CvmSC4RUmjcv8KimjIo9GZcaTnZAm5AtPhUJ4q1O1+Aoc3zwTZe3pQI/0CdnQFgI67N2cO7OPdDzfjhlo9srK2wIAT5zi5ypSOTZSGU52F+KffE7UjlWnQ0h0KxbPhkVElLp2+nLZPLKDMY5V467QAlAwnUsAFoOfmDjBQeoz3/wil3PMT6MvzOvYVfM0bkv+R+QZVSHOXoSXP9EHglhPJ3eljcY9s+j11NX2TnUGPdNQ49tZXqF6jBhmeHlxvuBUiajbTnMVPeczYJNix8AMFXG6jzP8USVQ8lmy26sEIv79sWkocb/EHZzUXIoxT5ovpqZDj1QxaEcdx/aEPlDDPCjyDZtHxsGzoD+jmc3fN8YW4Gs/cfZtmlx3HJ+8C+OvXQXoqqw+7I55S0eAfOO5tBF0KqbT33Rzoy9SEMZMy8P5AAGu9MqJVjy3BdaoJVx8ThgStFyS2YyJ9zyjin6E/YZ9yGc8WnsIHY/VRNwshsFQKdhXUkWHeY154wBgHhxfA/DMppGpYScL2e3Bd/xJuXDwFvFrXkOH2Oiyyr8W6Rd9Rr3OINmqGsbKPPoSoH0Dhigp0rjcBix1NpLZpHs6cNQpO65tBdoce4v4kcLdfC8ErkkhwjyV69xvBCP6GcTtNQVs8BaaF3mKj6YHo59EO/1bfoZOLZ8GnhFE4sYXAE6xZ99MSsPkiRv7v3/D5yCt04LkBwhh/cCi6CR/GDsCHE/JQseQb3Ne2p4pSLQzuaGHdnhgMvVWGJcFb0P9KOUj3DsGFwilwyOImSWkEskZyDUUPN5D5wWpSmy0HfWvPM0c5QyXehiV9gjBvfAN+O+/J2numwTMHRf4i58RGbvtpmeIJ7BLbC2FTlHiynTlcGlrFRqWduEyyiPZ77CWFG3d51UASPtJIgsCIVnRRmst+Y2Qhd7sbvXFwBm2raoja3QJSTsro6r8A/8Z2cdPKHLKIk2J7v0nQ5GMGnrkhrLBvNuW/UqJv2g140eUxz8lTJM0WD4gQ3M4+a2RB5FM3ryy6y+g/lU2fC0Ob6V/e/eMDvav7zdujSnHp73d0bZ0KTClPQPdbxnj1nTNrb/mP1zqUY1FkPxlWKdEuXQna7L8MqjongwmZsP7oLez3UQhX1A/C2sNqtO3Lb3py+z/Yod5DlZ2FKCuqDNZ/x4F1jBl7zLGhj1/u8a9mWdznEkWTA1LpapYl9NyKwe+zLKC1WI0OjTlLFfSRR5vXQFTtH0j2NIIZpnfYonyAisMtuFtzBEh4iPLlqEBc5R6Gmy6JQZmfOUn0v6PD/QgaV5tB+0g9704YCT3rVsOlF/fZIruTtkU+5bimAlptZ81Sfe3wfJ4/ZYZUgJu9ICxNKqH9lzuhKb4Q99zxQ8+3IThf7AZXP9iGcVb28O/KchI3NYZu46Xw2vErX9T9wXLyG6nvUSO0fpaC1PHW5JYqQ8tXPcWrfkqwy+8gqnRX0K2HQbj8gCn9e1KNshdz4UPUUdpofRzjlP0hd6YarHULYzmTP5iTNgHkTt+DBbWM5vPd+azpe/670JLEhYop5roUJJvn0dn2KFw3ZjGatV/B0kRVSuq4wN0P10Pj/ce49Ptr9qmfCrZVq8Fc+QcWvqhludrx3Jw2A/doVHHM4xZMaheChA/HobxQD3y7L+I4H2NaYenE3w+VQKNWJlc1A7StkuGP+ICKRmpiT/AIyNEyZ61t92HelEpIKrrBo6Ou0IONSuBZ68pdl9bQZbW9NNBHACLTQEX2J76dcRlSKvvh7uECTPs0G+WD57KysTn7OwXiOTtFWNZYzJdfjualZonwKaubuvJP0bepefgvZBPMbhgJW1aK0BpbebA/UAkP1EV5bfc3knGMI0v/qzh2lTK9sZAExwxTEJqzCn/kT4RPcyZQptxI9i3XQvfjk2FReiYW/PKHNTc04PMjCR496ji7xBmB9+7f/NzpHtV3DeC+kfn4x2E6X7HdBhcnVMJ8jb0k/6MMBIKFIXpPE6VdX0E+twahXeIDlS/ZC9EhBrBtQwneWjXMFakmOGmlLKgVHKO1gzM4w1kaNMqvY1BJO4y66skOoTJYie9RwriMd16Wh1CpAyD+fTePCCtAiyFvqr25GS/u+gKPlkqwxplTdLZsK3tpaoH2hlQ4v+IQnfI14EUf/2FRSz2VDf/FzroX7NtkQ8q9R9lnrw40/OikX78P4ctPvVRhfx7eK5zDy9N+o633Mp6qmUjfyhrZ49MkyE32g09Zifhm90OSMPYHteF7tO5zMysWbKf9o1rITOExxIwcCYoilehx6iRoHFHlr12/QK5kHsYuuc7TeDHZsTEn21WAn80IKHYDFpHrAdm5tRxzTIFCXb9xfaYYaEiFwDqLftYVuIsvV02Aq2FXKTn3K0u/OEhZY38SeIwlhX976fPGYYj+z5a7JD6Bi70gfAsNJ7mf+yFHZCM7ylRDjW0zjLKtoYNRv+G7cQAbiMTS1O8SYHaKIft9CLo4ymOQihXtC7/Ok7Ut4Il2MVikvSUVd2M6a48QPMUFbFZdBJuJbfxQ/jNN/yJPzhHj0CDKhzIbZ+K/QwNgUCoPt/Q04K/5ZXT4fhB856+gly8EyO1qAlzN10TbohJyP3KMj1powGGK4Z9ywdTjpsol7xzgaUkBBClfgSiZC5S2to5GdN+EBQ0WYOg+BGnfpXhw6UEo/pNITxRVSLfsIJ9VNIRzA+O4qmMCv/wtC/InSljgQTZJ7P5F5+ztoG2zCjr9CWe10Qsh481VLgi+xyeFpMDSI5hk4stg6+cBxqW3ME1lA7Tb9tBJuIy/O9w5t+cuPEtUhhsx+eA5dAv+Slyj6VWXaYL/CqSsftKpq4BDhj5U8WkLCG0zh/dfY+jBhCoumqbJggekqPdIBZ2PEiY18QVcOH0CReZ+Z9m/RvAw9TcnPhMh95VB3H8iB+UuNrN8iBjfyPEg90duFO3UAWnnp0HX0kJY5pMMGXF/OelbGPnMP8mj0h7zfr8gMFV7R19WXmPjKGPoNlqD5m9F6K5bPdsJAGT2q6Kt91rc1aBHspebQG/HW75dA7DAMR2/ZF4liWe90KyygLSUfVBEYwd+WBbOH3ZfA9VQH5gnbgA1Sefw7gslDj8SyEN79Wiy+F+s/CTO/nbrOAdF4EdWFAZcFIB17+LAWscHV26vZTv53Zw4vhz6z7hTkNwjqBLOBBUogZNCZrDrmhFeLXbBxfsFKKBYEfIq6lEy8i8M+FlAdYgOG8/wwpE9U+HlUgMet8cZTn08w0G5M2HQt5QjAxypa2Q0ZcZOgIA/s0j9/TTwfVUIP+dv5qSNKuC4pJrCLUNhdXE82Bh0kPLne1hVZAyHK0xgb3QSuRiG8+i6Iao6exsEwqIwt8masvZL8sXr7Thr/TFsuiAHQ0MJEExHUOLpEMCeWvh6/TJrbnyHRpZDcE2ihb6abcTw98aQZugKjwZf8UkTKRBN0EW936/Af7cqJudHUrnHFfg56hdIXAD4ddUclv73HGL2X8XE/9pxr7Emhj0Ow9Rt+nhl8QFu/F2LOyKkYHXSNj7jXk+JDi0cf+El5C4WhTEvEjihfw56vh3Ds3zFUAvlQWvPSio+tAG2T94NT2ua4NkZD55ifBa2pCpAv50auGaG8qOHo0D8fhb/0fLg8C1BkNLuA1rSwxz7roEObIriu/IqLKT4hSM2TQO5vlS4aFaP+otn8bFgG4jILGSPFnESf3YSdNtiuFL+PV7W1Iak9HJosqmiyw/v45ZJCuT6+Ry/KvChrVbbwUJDmM+2TmabtzIgYZSDcn4auO5MLrj0RfPDVUVoo7kcX44v4BEFgtx2wpv9QwxAVtgZvZd84aeHbrLlgTbc03gZq098gtonI3FW8UXK8UY4aDAeLqy6iOJ0HkNSGNPcz9DciLvUtSwXpM5856EWIe5ozaO/u5XhuuVUFhN9zSc8Lajlog/a/FyH9xvO4vg3RG93aoF+6zRqypSC4OI17GaWju2eR2ifSCPu2DeWpisfxHnnqlDBPJqqLozl0UYIzz/fwDznz+h/VwG+LQDsx2hYW+FD+9Umo/vk+bBhhw51OUwGVDrG0SJ+HG4WwVUK+eDy8QsOPw2miSau7LV4CI8YnScDtZFg2J+M8kfm8Ko2IRrGubRO1gUf6l4h07Fb6dz+ZJzfXgHe3WMg0eUvZTg8Jb3J0mQo4AszlweR+MHJdHpSJQVqGoLatRU844sq3JgbR/9WJrKmjS0e2mrDujQD52RugAvxC2jfmz9wYdY8HmUmCnZnHWnpaQuM0beGfHET/u9XLfkKe4DC0/EcfGIW5unrYU2pNlT+sON7DjGw9/wQrXtbxodl7CHgsTT+Vh3Pdjku0IQFOPm2KfzpXkCOb4Jo+fhJoDyxgc1+peH+A9ZQu+wn1Y/ywo4V/2hwUAsO9Ozj7lG/8Uj2Rq6L8CO/rhSyv3mQmgxc0EfUluIa5UntlS7kFj+A7N0POXbPS3CX/A9cbIXJWNyCDrSFcLHvAESUfuDkp3rwYvZxrO2/ir2GEZDc28uRF+Lx3Hg1vGB0DXR3B/LClnK8qjoeejovgMheNW4RHMDXuyJYwHA7zT4tTKQUTXZ3p9CJ7ChokLQEY/tnsEKph45NRkxusUHDU8fBcu0pdK8/SOtLN9K9qR/5n4E4RJ2bSzMf64Oz8he6k34Qis1leNbtZhp4HEV5GUsh32ARBwaIgOP8i9CnokeK61LJ5iHhzuhd9NRqPmdM2oRy08pgxUQFyi1RAxgbx6/cjuO1zgyUuPoHlksXcFK6M2oXTWXLW78hq+Aie7lowj6PeXikJYOCCm0gKsIO9rYpgvqW+zRicz3unD6ORQ8YkfcOU7BZNIY1w1/ghsJDpDDSHupWxVJGLEL5DgS1jI24PPoTJ1eogMvXFvjUeZPyH5ziGRKymPkkixsc6/mVyh6cc7ST24eXk/h6S5gw0QjvZy+CZ69s4VuBF0meQfi+qAIsakPYfNc/Otc7DvTGicPpvz+p7IEAjLirwAJn+6lJJg9EQ9dBZu5Rim8JxRFJTdzy1QLqPE7yxvb5IPvqAe4MToKN4h/w4otJICvznrI3xJNWfC59n28KBj/8Mb84hmMuiIOq8FZS9n3Cyg52lKKoz8FPeklh5xbYqa0E8aXx2LvIiI4kdMAbGx2UTDPAPo1ILv+4lz6VLIBzY47B3nAFmHO1H8IE/OHrkSqa9O4Mfm6Sww0L2mlBkib/0tFhebdKmtgnAYeunud1Qrf45dpwKlIKpC0Rx6mt9Djv0tTB7t6rdGv7bAh7MA3ObLkKJ7cPc6F6MtzJtoQPQtY0r30hbOpqwfmqGQxRb+isoQLcctKjE+P72C5VCiuiQ6B+hhJ02TyA21U1tMtggA8c6YGKJIBdSTpk9TAFrr2+Ah0UQEdO3UWHZ2243VSX5sW8hMlyHZSbawoR6Qr0dk0d7JkZxkHWA9AQnoZorME9BYGoV3qd1p2+C3MbDcCyrhf9Gj9DaFYHD4Qt4xWHslEvNJmKxFbDk6DRuDVGAV7GmsJcq9eQ7yrODo89KTpEkRaWV+Gmi2fR5U4n3v2pwbGYSM2SijD+6UI2+joB+8vd0bIxDyse9uMxmx4s1PgNcZqqNDY3HkxWTgO3U+Pxbo8ZNhWWspVTMv1ufQ0hvRvQpWQunXFWwgChAfxoYQiZDb4wPVMKjyak4IB8FSuay9AZlfeo3ngcViWEo9NwDx1Jl4aK8aEg67mcpU5Owo6U4zDx3HbI1SOKKdSncRISKFzezx1bACIUhSHw6Huo70gBLbGnUKf9i9YpjCbLT1H40mw1rTU7wQnXEVxnPONcgw145O9yGjfJiLZ+WQydphOg48x9vrHuEr8cZ48myaPh7I6brBXnyHCgldMa7vDOfy50afZRlOnYjXXPsqG3OhJTfNRAS9sMnMTWUocQQWPBCX5UXUxpvbep/eYZThT6S0/vdILNUy24ty4TvV9q0pD+Qnj4ew4Y/ZrDR+7Ek2hKBS3VYBCLec8wbAMS+pMx9IAGtmn4YkbweXrkvBndW5OYg66DyERRNpc9B3RhJIyfHgxqo49wXPl1Hnf0ABxa58qnhNeg9J3R9KLLkzPfbSGlZAmIORFHsV3f4NGVUm5V/0dB0WJk99GJEh/GQYW3BjaqaKF5jTKcm6aMEn5vsVrchx7q94HYhg9kmBVAuWsqsG+RCqXfDITUbSPBRzSc1h+SwWs+n7lDTQgHaqfRqfG6HLnPmHwvbodJqxfD3S16cHjnRVxqK4EjKm6z471I6Fh0ES5pmkBPSCu5VJrDk4xl2C9sAWraW+hR1GycVR5DN1TmkPfDbyz5s5hTHkyGqJCzFJdlgJPSJkDd9GESP7yDrYJbIDtnIc1Z0Qoj/9xnn3xjXjUgxtYdE2D/GD3wgW242mgXepnag5COPpVFzsTBo5WsO+o83z5Xgl8/NXH5rSkQ6xbEWQG7eKphJt5+JAOAI/B31XoU6ftOKm0lLJyRxWkFlnA2NhzF9qVCef1sthmMwDST0dhjl0t0pYT2FAFeT62nk6OtYb2AGRVbRlNzy0nsmtYK/YkjaG+rF15ieXj0qJk7jY+T7B0NuHF5B4s8LIJzfUqwNVWJj7QO8vi5tbhAJYUyLHLgtIMfSOUow5j2EHhgZI+n/54hS4XRFFBwElXvFmFj4Qbwe/cbfMf/wdZXCnDyXSK3tz2j0lvlfFRYlYbXG0JM4kcoWHIcb1QLQfpWI1izVR8sdWpAOqiNdrs1cm8p0IoFulR3Zi5Fp3hjuuxN7rI6iDOrR8DyNxZgrpIHsWMtOfaeA8YFusCI3CgqW2oF2T7CnH7wPFVenwTD8r940e9p8DaxGF6GCYHSonZKSYxA7+G5/H1qEG22nkLNnVqglVOIHbKqsGb6btjW2sinJvZifpQ7778YwrlpdWiRJYB2RQBmLr7YPCMXzgvbQHhqDL4UH+L4ybq8f5M9OoQYwa4sd/o2TgEatY1hfNQ+9PfTx6YXs2iRpD4EKEzCH7muOFvlN6apnEZLD0XIfnMe32w/CdpztfiAtDH9TVjCi0/Px02Bg7i86zGYDHUyrlaAsCtGjNEjsdXHCgtND8MTOXsy/2UOf+dMg4o1O+iD3yU8JCUGA74PMe6qOcp3P2bvi8asmquFP3bm4NMSQWxQr2Gr74Z0YMJI0No3nVYYdlPNzp182OMiqKz/yxb65VBUeowWr3KHQbNmeiamBJOkhGDLdw0+5P8VcwurqGuCAG3e7E3TehvwmXc7F3ucgNKvJnBqXj4HBpqxV/xMmJYpRE7au0F18Vc8OGkkyromwcj8BJb4IgAKh3vJ+UwczRZcTlcOr4VVw0Oc5nsZ+u4fgYnCjrhBbAYrzbOBFSY7+IGuID1yNsIxxj004X0npXpJ8mHJPfzbKYj3HO/AnT/0QFvDjLqSomgoTQd2CaryKb3L+DjvB+2VGEkaWg+hdu09brmiAY6p07kk1oPl3srBugWr8cHcRJ7ZvJVe+6kzzfiLs5YeBjVLMZhjGsLvtUPweeEqSr5wi/BVFm3hdm4+0wIpqz7ApVknULrBGmwPKGFYtybvmR4AzvM8oXmMGh8o2cNqK55D5mVL6Cxs4Z86Y+FQwzlcMu8MPLqTQDOPynLQ5nxcIG7N0y774ry6WeSw5Ak1BehC98FwuOsxB0sHj7JAL8HPoqUUJnKChXat5qlKGfxC0QmeP9eFUPc89H0xBUanrSDRJSu4y+YhmWsXYtSbbHRec4O+9G2le/vFIfxcAkuYWILd4hk46dlVCl+uSllh0jjzrxp/zwrE3ad7cG2YAhTL5NKRHYJg/TMTQ7+eoMyYLRSWpU4LtdzpjMl+mrokA33v64G0ZBO8kmlhjZcBsLF7DF7R3YiN5q9AZlw8dX9xwvQhPZI9JgvrO67yP7kzdEf3D9rtDOEWE3GedGAPlW4JQ6mNWqy4fhqlXlcBoc5TdCbdFh7c8afxyXKUvMqVgsuvw4NxzyHX8CtrRgXjyhBBkHRYCm2F83Fpsjfpv+3H2Vck+EbnSP4qo04RObH8pXiI66pNwLTQHEsk+1ByxgUUW6PDnrcdYbk74U9hN1z8+wQ/cisB1xCAdqc4CJjtAo1jx8BR4w102kEG18xN52k2xbwqYADuuz+GccqaEPHjGjs/iKSkm8NwaNphXDLKEks9d9GG3qWgq/0PMg6Ng2NndOFH1k/2F08DhVepELH9IT2zkySrl+F4MtuNJKWy4f78BjhuLQe7UsW4ZtsgfmuWh/Nbzehi5EMwPjFE595+B7G5GXRMZBb1XSOYozfAo/ZI0dH8Tzz2uDdnl1lRnzHxoLAXRr8lONX3BcyOK8OOvKlk0jobnoanouirXBSdfhNMhPNY8rwiOdjK0QytF2R8Sx9y6u5j2K2f+PLBeo5VOswKa6P41HYHkpgkitnzlSHooyE/i9SFq5u8qGiMN6abDYKD5xN89SKZ9+z5wKEJ+2lERwqLzDvJVouV4dfCCB4Ik6E5tr6o2jQXfhk+wW+6bSS/4g2s6P8E11TqScFHDSR1zTno9Tk6s0wKbOwDQOZhGEiuc+U8vwxsEhPF1swNON/HFKZ9GkGfm+vomXMn1uuZ0qu0P3BAMY4qMo5DWFkYnwi7SXIHRsAN9b38rU+SN3+X5QO/tvI/VXuc7NfB2/LqwPP1NtxiJwQ39knBmRUPMPE/aT4aspoUwy5Tc8E0+BmsxLwwim9Pf8Xz7kVz0RoJ+JReDue/t4Lb20PcGTgJ3n/4yEuLb8GSIGe2muVPGRqbINPOAoRc1+N57Rra/joU1cRaWF8nnw++2AUUmETvJv7FzqRoFjprDQlClfh4rhos+TSa7J6uxe/OGexmFspCy2p4s2sU3vM/gy6bVSBM/R+vXvYALi3aAAVHN/B79oXkoQr+PuiIo2Nv4Qb1TfR0li4Yu/lBxvByLv52gHYWGKDUNOIwT3domL4YU3zqMWllHaYqioNyXBgccYzHV3u/gmi7K61R7YFvb8p4Y8VTXjvJEW0PGVPGLXmY8CKebHzX8dSUt5Aml0Kr0zJo19Rt7GL7ETsUhkHRqp5OP9GGzd0faILiXSxZ2EAzBcQpT+Mo5kS+5CcrWyjwuznlO3+Gv6OUwOb+dHS4K8W7B1o5OQugRsgCw85NpIiycyhcegSKN2yFhDnm0BKzm1KEPHiEbBNf+h8B8AEQAgIFAPSP9lBKS9qlaElDS4OEjJKRLVIkKW2SUlEkEklG4RRNCZGRlQpNSnZWSEmSQqV7Z01htKcGXqgQpyNbFuKbaCtOe1HKRbEIknXLsdN5Bq3dPIdf3e+lHLW9kJDsB2+PLiR37RNU+2YAFw3KwOCsUNx6bjVvPJ1LSuOlYNvkneiUcp7715eBQVUm7hLQhL0aurD5zxDoCbui6PAzcpx/Byu+ZuPRscvJRHABl317QlOeZlO0vCQIayxB/w8XYbxzMOm82E86Cg8oae108P10Fg1dVpHbcAx/3aoBD6cocu+0JrRtLATHo2E8/5ovvD8WBCGHdtPx7hpUPi1LYt2ycFRJky1/ZrBzSTZ2jfnEWcKGmCi5nGw0i0lDZSuEZNtz/IAA5Lc7ktjmCGpbfQADvET493ykoshWvFY4EZ3DCa4d8kS3cGm4WXKUSoLv41IHB3wScpzLq3phxwZb1rr4Ba7OCYH84UheES8Lt429SFounw8nWmHDqj/gPeoI/TT8R8JtybwnsAUbRvSxT9EIuJirTylbTlNq7lt6eMcM3aKO47Htw2Anq0RnI7pxY/UuyBNQA+1tIbxHzhKm3ywm34UEQ+UfcURZINynOfjR8RU3NbdzkeUY2BdRCFx2HePbLtLA7q/YMCeL/zn/R8UhSeSZmE39M6wpsWwcHF5tCA/UD8HeVXmkHekIG12PY86B/1BF1BuOh6nj8uJseFWlBE6aC1jwv0JyWZgEhQv/kdoSV7LdtJa8f6WQ43NxfJY0B4J3GcGCsQLUFeTMj55Y8GibJq6904xvnxux1+UYyFa7yqKlZSwfw5C4QhbrJz+EA09n8oExeWzRmQr/SWZAw/FGEOhv5z83H3NfhT0ElOjQkqtdfLLXGXr91LGklvDiSUEIflhJDvIpeO1XOI0zMQA9fRE0PZ7N5Q31eGChEV3efpC3dF9k6Q4dWn7hKZa9SScbTwZpswDSlPiD2V9UMdLCm9187rBG02MIEvrNT/N/wkDoZjyzQxYuS/YBXP9O59/cwqgnV/lXzlHwyB7Daw5u5lmDBRwfFw5jpuoDfcxGpaU9eOe8Er0tMcc8RzGYIKbMwcvESL9yF7REz4OTi6VAJyUSu4wzsDdJDigugTI99KFmxiEckV/B9Z4xKBwcxTsX6YPE76WwJectjRgeg7u+dJNJaSQ715tQo8I0Oi/QDslFodRxUwguW6zDpXox/K89FM8N91BpeD8b7N0C2ccmwKJbShwamMb/HAxhxeuHlDuzFoeXXaFxy+s45s162B+YDrdLCtG+UZtmTy/gdYd1wOuoCpxa4spVfXNAud+G5CrnQm9ZFL++sIz7Y4bwptF9DFhuDrXZW7ly7lW6oz4OVzne4EwzF57Qr4EWi6RA41wzyiwqI8/zeiCwbA5cmm5HV49/5vVZqvhO/Aw8q5vKbQIiuHiVJV8wnUJPLutCdcUVxvvG0OaaBbX39pDIqivorXgTx3MseJ+OgpVpd+hQuBBwjS0pmFvAvA/tPF70CUe9FOWUUA0QPfeD1J3OsOaTWXRsgjVsOHKeBL5bgkS3Kimml2OPyQy6m+uH9QaFPHfJQ7o49RR+djYHm+1CfM/nJxScDGdH1x5qcL/NdWeMoPHNHRyQaOD3Pq9YxUofIr7XknXoax4IdKYdV5K56IItOvtW0+KeXNq7YQvoSTrg8tlG8KOmGkfrXufws7+4S8yOinkmyVbuwJ9l0dh3RQWmiZ2ElCo5wPZILhvqguv7LLgoOhjkrF/xZ6sg3L/4B2wX1YKIS2Mhc7YxzP3US6kTFKFi4g/W0MtE/19nMPJvMx9L8AHzJgnYXfSFJieowpvQTbCY3sKscVsoUjgH9ld+wfsNvyCxWJgWzplEqzYthftfzWCC3h/qtHTEqveC/NItmFbsFqLvUo3gdcwRs7cYUXV3AEeF6IDwFuCPlxT4sP4vqN2aAP8t7YNto1VoRf5EbP9oAfl5SnR4lB60Dc/jP3W7ybe2hwXnOtPpS7r49fxKkv94Fw853cZZ3oak5aMEKqa2WNHzHsoVpkNXlTQeE+sCn93V/F5FD7IshFFkyAUGSybAV6EQXnx8mNy+F3OfoCWb/LKlqNh8kOy7Qp6riqHyRDblOEvChYH3OHgrHJfsrgAU64PBi+PpYZgNvRlrR0+S/qFQO9PucgF4eEiJtpdrsNFzoGWZ83CfsTpNFXbCR+m9qFTXQf/9ssOnZxEuuOzGVU7/Ye3XAFQf0IFOg00cKinAn2Rfg+Kqy7jIZjIIGtiCdZQCPd4px9u6hengvB2sU5bLD7/0o8yiy/TA7wyFHqrmjZaKQInmmJq4AW5lPmQ1jV/0Z1YjmL/zh3Sjcv6nT3x0VjAreiqD8UkfXG//C2v2RXLL0w4wjHrHvR1J/Kglm66dsmBvMTVuEREGyyRN6AnYBlKeSvjT5zxfuZsGMfdEsVO8GSVvPsF8eWuUj1KG3LGzcbbeQQ7uLEL96w605GYxNjxcwwUT71H4+Vr+F7ECZhpJwd8mG3wTlkLvTizmGUv3kJOoGO3dPIm+32PI++EO28v/cvlWddD+tIwH3TPhnPlN+HR8Bl66uxtP54dQ6I118GxwNtlc6IdCFwGgqAwQz96JVtk3wKezBTq8pnPmeVfoSR4L8+5/4tFNf6Fi50Twvr0Rf7Ia1n/4waHKnji9tR4ufC3i33LHwC1lLzevjaOv4xXhx8EcuuXXi8OLAynj8kS63LqTmp6ksWi0A805/x84ZHmy/Hgx0Bt3gWK/HGMXy1KskdRFmetH8e2jleSnnkE3ZEMx6k4dn1MEEBB+DzHFyDY/z7BJwhXYdCkcjs2bCJGTK2Gs2CpYJ/MBFmlLwUWZq9CiXk/W02tQc89RvHgwDelOBV9bdAdNBy7inOR/FH7FCh4vVeLdx/upbMtS8m/aSV77N/L0MeWwMzIVqduIJ97aAxbLreFh/1/uOVlK31Pd2cRjNNsrvmHzhCuYN8oUvtg5ceOUVqYtkyDeyg7t035Dbbovqbi9px/BUXTyqg8fc37ACXdiaZL8fFrVow7hrwrw/ovzeHX8F5afvJm0N8xF9zkKkJ2dzHNdptPpyLVsMyQF56SdqX+kMItZNLAmrSXNB2N4fugKzpq7AdVqN1KX2yPe6GUAorXroe+aM+x978QLfozGUeby6P0oCsafi8Yz4yP4woEzlNZmDBgXgh3F6ynZZAcESTXCqA3ubOESRC+uamGT1kuc/CGLZP00IS5uG+42jcIETRdKmOaMveZZbCKRD5vfDeLYqVfB+JEXKXeowothSSzXLwOjGxWUiSL8d/pfSFG9D4HDKXCobw61TdoBOrIjwLvoIzdsvYI7fv3HKcuuwpSqAgi8tpGnW0zAvbkiMN1fHX616MDiOIDMG0dI1G0b+sQYcs7Cl7zgvSJXWeTjKc1iTPp7kHSTLeCHzgXC5Ej0ME2DoRx7kNW6BwvFH8OXhSPAUf0EFYf2wfQSJQgtPQYBu4T4Va8eZaq+49TIaaT1sZDln4RS0NRPLHo9E9dlyML4A2O41d8Iyf0FR0lqcp6OF3xrEIb6nk801ek5+RgHoN8dOcjduB1kpBIp6mg5G7YMgGxFLVjrtvDBY55Y0z+NHuz8TP6BxjCqaTV//b0AvomcpOHRO8D/tQC3FtiTmXQFqaxrxQ61LZTzegw8yVfE4Z4MvPj4KXtWmsCUffMhfGE4OAa68e7ulVx4fiSsipGABIU4fHN1Is0wnE9CdX5YISNPTUv1+eiau3x8gw7dXrMcq1skoKjhPg5YeXBMdRGHjrwEi/9pYHGeE88/fwtWKvviEWFLNnG1gY7WebTi3jsWP5fB0W65zEOrSVlFG+QmamCs/3p6FHeFrpqagNC/LKrw3oKjVWVZ6r4ul/9ZAEMhNny5EniB8EQMjviJ7fqjwKpjFJ/YqUaPR6oR7lPgYyiITY7tPHjvKoW417KURzif/jUJpD2QbVOf8osPzrAhZDUbH9NHnSn34PZsR/jyA+lPRBCagj1cQWv+GvmRhWPPo0vpBMjXkcHGuBq4saOUe/bZUNz8YD7/XAsU7u9i05Wh9HUu05kyf+7JycTMQwr0j2Jx9blwFndOoBWBgnDuxEO6pvWWmp+8AeGfZVQybEfxTSPoSJEyBarMoYsxtzBNFaDtsSJ/Sc6Ew/8mQYvlGdrUt5nX7FgCTQ+EyFx/P6a+mkLPt6lC6KdkWKs+AYe83WBFx0E+G2ZDcTeC2evkV1Yb7qaIcAU41TAKMvVdKeTcYth1dCmu077FZ5dbk+WyEn738B4umLkIkiN+YNMVLbg/NYUDX3+G6e/HkMPEU7B8nTEXTc+l9V7htDhUjzL2/kIB0ADBOSF4ZO8fdo4yZ/neTsoZFweoYAYTzrfA9esz8U/yJp69WQp0vSZxzZz9aHH6PQnsPIsW+fX8UMKYV6T/gb6DPfSq8QaIXLGDWe5JGD3qIEoUhOCxH+Z4unwXbJwuADc1HsGXLZrov8Ma0+YSdOuVQl7hNVgX95j6N2myjn4Wit9ypMX77qFYzwfyEf8BHmAFL8ZdhRkFi3liQQnLS2rSvEl98Ox7GAxfKgTXg5/Q74UZn1ihB+o7b5CR7R221ezj+/sq8XhxIDSHZqLPyGScfDOGZnZG490gKbhePh8tw6xJanUK3JOsoOU73vLPwd0Y4PWML11Xh/zhQU79rgWLp1ZhdoI6lm3byoWuUmwtMhafXxLl6qQ2ODhhBdZ/OcePvqkASzRhcHwsHLv3iCw+LCUvAQPoLVgIckIO8Gv8KhYzjeGbgnpwLj2Aa0+8RdPfOZSbOQyLH7znCK962D56J200EKDJy9fzp4ey4NLykr5PacapKbfhvVA+bOs6B9fjjLB81WF86nOOxUfpkK0ggfnSQpT7T5oDwoLJ8HkX2t3RpGkdKVDn4Q+vKn/Alju/6PCAELy7copNxBo4VSWEjbI34N6hYey9XY1J87WZH4ZwWvdIFI2RhLd+p1CgcJDsSvfDRqGxMBftMKrTnuSaXXj7Uw8QaR0mjQhZaHA4Cjc/v+OkBC9yGXTHn4nW1OQxGrJsnqJWYxnr3Xcj7fVj4NrW7dQWdJTOuTqCUcgTfmqrRpvNTuPy9f30atctVgvRpvR7IuDqeJGyTheDz0g3Hlr3jvodLlF79EpQardnibXuXHWliLb4WYGyjyhlFVRRangfHX1Xj3eKaynmzifuGLrBzTqB+KRYkAvadGHKl8s8TuAjj2p/zYPzuniZsCtIVwVi/ElPbtTsB/92TVTKEoV2dmTdE0JoXhPFaccHyeP0WVx9ZxYmpW7nA7Pu0KIxfznu5Eg4H34eHh7fgVvlAmH9jtv4++ovvrejAZNstoCTgAx8jciE1xWKUGlxg66W+sPE95V0ceJ6/v1UgXYbjCQjBR0qaJrDbZauNPm2FKg6N2LnsUJ87P0fmbbH0yo24bFmB0BY8wgKd5xmi9pXOMPXHAxNWmnCDUSjSefZ+6ErX7BVxas7m1FW1A5/7ZSCiLVvcXULgtF0CTreNB3v8i+sbW0mc5e5/MW7kl/udKAM3zqSGboJfyz0QOisPUo4jsAJp8bi5dinMHjWHmM0lakstZdvBk1lgwXnWWXGePC2ioC1t7OgW3cm+QzvoSNiu/BGcg6NzkiHD1ebYP2D9zxnixJErdPEo2Z6qH1LHW8ZzGef6HdcNSeTR1kX8ofOM3hq1Q/WVkKQLqnFjrhWXHvoGC6s6YGgf6sx4PIJ2nTEAIWCN7PRnxNYJywAfnnVkB0oCG+ixoH+tm8g3LiKisKd0ORiF4/cFAjtz7PAfYoRJK6ORH37PBbp/8NDuvv4U1kb93h7o82duzR8/i6OfxMH3/cow2qvMDBvaMez/5lgweOd8Ehbn9cIXQLzjdMx/WYvfmm6CDXVAhAZ00F7u6bA6l2f+d+IrSjS0EZ7Fv+H88PqQY2s0Hy9AC7S0Yblr16yn68myw8fovjR/vyp8TzkdQVgjqEeHo+8xjdfy+HwCmPIcxMgWWVRtnMt5PU5MVT/JYLao1QpUjILXL6OoMYlwjTjiiaExonT1oQh1F0SjS8OmaG44wvw7m/AkKBy2LrEHGIPKdJSDR2Y2jIA+U6rScTDhBMuacDWxDQu+NFHndqjyHhfFU2w3A1nREbBz5x+9s+oBB/HYLqY8BkvKapigaI7OU2qxWnLlSnoeDh3+I2FCRJVfNG1lT7YV2HY6hkctXseFgukgUejF3Xu8UKhCF909NSDqYsMMEXwETdyEerZI8bYhYD1dAmu9bXhyRuyaVDhAK64rQ/VWWX0BmxoVXMwBXZ38JMFV1CWbCDo3QrafdYTadlqDF2gBzvlF0C/txYqx1XD4vuTUK6yhxtMIrH0RRxW1S5lcfOXYKYuBJMPusOFqq1kZ1LO8xf/4g+JTqxVVkf73iiQ1dfLGLTvEB4sM4Hl/xnhjOq9NCy0BuuML7PpsjMofmgJdVzZgrHCZ6j7uS2uey4Mz/Y6k3KNGiaOXoyZJTW464oc2XSpQs9Ncaps/cG7K0todZUOVKadhjJVDZy4cx40NL+g31HRmOMeyMH26yH4Wjx2/5HhSi0FELiQByuqX9LNNV+hziCPljgyyjjuRL/E03hsyVc+G12Ne2TNoDVJFV983oa3OmeSducgJKlY01+dmRQZ+p4D7PrIfvQjWqVjCq8+ROFnzVv4veMPHOzV5WcqF7n7RCV+OPacB553QHntJr7yVx4k7Gz40upJ3Ce5EERr/flySi5/lpwB+WZV0DJVB9+enQgdKA7/qJRPu4tTps81cs68zJGLAnncQBE9s1sH9mk3sPvzEbyebQH/Np8CN41R5C6aj0udBWDuTncoyvjNGtSHXQZApVn7edSpcRDTtgczr6/iD6o6KNJsTi5l6jinKoO2HDEj7X93OX98DLw9YQOKHeZgJTdAjqeukeuKVNw/zwguTmolF31At8WNPKtAmcLjrOGn+BiWvTIH16yv5zR14KIucdATNYVYuzUYLpPPjy1b4UqBGfRmK4BipSVp7NjI41UFeaNgG82710Hn/jsHjdv6+OnwWhJIkgPvrvEoqX2Gdo5hNHDaDfPsS2Gp7UewuCjIdybK0JK3SuT/VxJSrp2nlKkr2W/RbEqvr4Lne8v5o+l26BY2h66qYMpsU+IhSXXwcI+h8Zuv4C8NfxRyqWfdD7f4rGoOcVcWGU46ztJGQTQ3hGC45ycv1hSFlKWzIWvSR3q0oxBmm8nRYvHfIO6ZTNbZU3BXigCkFp7hFMEAbrkzGiSWvoaYV80kMt6e5slGsp1COfRe+YMdb0WhKseJh5MjUM/rMjg9d4PFyVK87c93nLvuFsxr3s51hWf5aJwy9Gkuw7zHBRSfuwHHTWEK/3eS5/ldpyQXQQoTPQwNezajc70d1M7r4hSzEWwofxCaW/Lw68ATaCjIAqfSLTzstQXa9Yzov+/jYNVISVIYaIbZLw/AzaQ9OE96Muqm10B+2W267anFHgcu0vll1uA3N563fu2j0kP9eAxqKMxsOvk9z+enNmuxmGRQ+ekcHiMiDj16kji8+R82/b2F2aKO7GqrDfa9xO4+zfS2NZ6+CgWBs4YaCB/7gA5FTynjSDcm7hGh/h/bKKTHniT3LiP1fS849GkBlyfIwBJTIdy14QgE7o0m6zsL6au3I86vKkJF63c4HLeEfvTYwHpXW/hx4xfsNRJnq9HTQHawE6573ednkAXhYeXwLi+JRF6O4k965jBOYzU3q8Wx/EQN7P23B89prIF7RQFQc2MWlcV+gLEW3lBwTR42dKXyw+aR1B+kS45WY6FT0gUv6myB2UkrYL2vH5q99OSIXyLQpudJE9IItwcXkcOOnXjfqJiaFZ5B+wlLalytiSswAnsXSYPVEnme4Dkat88cif+qrrKh00POEn1MB1rd6Nk9d+rR6ofnp7RAXmmAd7n70kllFaaTnbygVB1PvFiJN++eYbGB0bxs4CPPf2MAPgPScFupFCcITYH/BnRZU38Qdh72ozDXAZ5ptwXHXXhJO+xEoOXkS55o8QOkFdXofXA9KN76SUOPLjHEB8J8nM02XqogONIE8sYKYNnIJlhbu5G7ehLw3Ytocj71ni4kaMC4fevJNrCO7MgANBc8otWK96A7TQOnn/aDnD3ynP5iBJgUPKNN2wOwrNGFqlIlQLPLCVeFNPHVlAe8LWEeaY9/SD6C8Wx0rB427Y6FETv+Qv8qUWh6Eokq37LQ8zFizYFwUsoJoJ+Havh0oCTNMN3HK7rNefupUfDrWjGvCR+PP3LESDzmC1lHxtGeFH+SEmmgX/vfYeJJHbQbZMhzMsDQwb/oVetKx4NTcHOpEvTeuMX7T/bD79XJMPqFIiTnq0CowU2a6TST9i+t4z3CC+nvpgFUcFXjju9GHKK+kiqerqRtSxQg879Wrp91nTe3J5HTrWh8bzIPmzyuwFEhMTynXQoO0c9g5zNzEBmzg4oOTILqFSP5+FUROPnxIjQKjMZvI3pxUu5MDit4zmNf6UG5pwul/u4iqV2pYCY+HfdftqEQd3c6NcoVTL02UNL5Lbgy3Ar+s3oKM3fvYkw7xDdbBslf05Xv+i9HjYCTuFB+FlQO1NKZlQwL/w4DDjwhj5dbcX9lBoSIb6bxUrvogacsRX8awV7XHPkrKYLdf4Y4ccs7uuPsAWMdM7E0eJDvly4BOtlGTQ9aWb9Rjq+5KYOyzVoIKlhPAXPN6cyzVHJ9/ZZanCu46JcKT34Qhy250/H+XXOYcjeexpT4cMDLzVweN5k2fknG05NTKNfQhPcdD8HHNmZQJysMbuviOa3BFYV7CZrH27Ltxjbu+F2DzirprMbSUDGmiheWioLfzC9wPOEDGFZUUIncdhhV6YnPdv3Fl0vtoUv0It5MKaNHk2XAa/kSXi81DZ/IGvES1VZ+VfKbnpiGc7qHNXWeLYfsjH+csssIpizbhGqmP+mxzwv8OmjJhosOgoWiFc8UmUaRk8X4scYgv/GVgW8bd8Ps5ky6HH4c7ZV2g4x8Ib14rwkLZkpiqF48pjVYQGK1Cbw3EWQx0TiIf3oIbqiX4g//E7BPmVkxpA9bV92ji3rlePKTLry7acXqOpG8TPc4D+3pxsXPH2PNuNU4VmEpLv9jzZMl/bEATCEWhJAUK3HuvwE0X3OdvgsP4ybjX/gtzYGd1cZz0u0BkGsXgB2xU+GIoyH7FApgfYM9j7y8mAMuO/NQeyx0vneA5FeJpHd/FBg5iIPW65GwfWcPO9/VQaf+h3hZNAFiM/I4uVeepHaEYOBEQbi0bhXvu+kNMsW/eWNOFoTVpYLC3pms6PYXnmrKsoFkLGXvE4Lf3w9Q5qkEfuJlyN9/95H/9gNQN+IPLliXgg/nN8K4GnGYlKoIwWKCuKjTHD4v/gmfRdx4dfBh+q7cgHrpGyhiswNVpvbATzVbaCj/wOtLTlKZVyNtLHpFCt+Xc4bPC+jvMOPFe6by2ZfZ9KdGDuwkY8BR0x/sFc7R87mq/G7dThIasQiXfgnmfuexqL4qFCVGmsMGifE4oBJD70pn0ayxtXT8xBrY/+8ojFOLp/ACT+j0vMEyuTagpCpA6btluXSuI+u3WZGFgyHOu7ua9abGw0NPF9xzKZG/2evBIq/VZDE3iKaN2gaNX2xh2o9RUNJ9ga81EQz75FH4ZDeoPCsKd1SDoVDckgUFd8ITw2mw5nA19e8xYfndH7F8Uy1f3zGOK3gktK0I4JTSARj2+Q/M50uimONCPhpylG7cDkKBi74gWHKBS4KFQHtRNTi+d2QjdUcyvb2axaWfQ9X8ZVw/+hGeLTJlPpKPZ1N1YO8iXXy1rga+/3qAFkGjWKs8hvbukQRr+zgat/YjLd3dR9cuiYGnaC9E/XpHo4qn8jTnIDbbKsrlcB1Fw2Q4OvAgWt5xoD36RiD23g7OrvmD6ufMwT6jDS7I23DMH3mq6xlFBp0yuFU6jbZPVYPY4UwYaq7kUKth4JJZ8OKIKZsuOwrmrn5UYEXYVF+Ay9tFYFvpMjxRtwcjjy+lVcqqbPnrLaXsJNY+swkKbj8hnR3LqKpqDJw8NohPX8ZQxdgjuKrmA0gcmwKT1p2kuKRdmJsSy57e78FZbDzcXbEUbrqHwI+ao5S6YQl0axyk8x0p0K37CtfAZ1R3TuAFb80AF2nh2t8j8dxjCzDqiSSVTz9BcHY4tTyzhlE2m+jjfxc4OE8Dyhq+4ZnScZjaMhvbR2iRevcFPCDqi//JLkPjmg8gtUeDhjQkILzpNy4VnAQ9yy3Roq8RrvkE0S37dpJU1MRT/Waw81UeWSUbgumwPj6Y2ILPeupQYvgRXOrWhwVb3+C+lhZ4u70ZipLu4ZoSeRh3PJZ3Je6mbTeDAXZL4oqFj/mQajImJciyQeha3lfFtDVeCe7GyuB/ts2YYhQBUeX5eF6xHTe27aQlygPw4eg6JLlsMtqiDCdiReGLwile4ldIidUnIUF1KvWWN0PY7DN0fXgP7B1rhvFPNCBRVRtKY/agYNEsnJ2fxrmSL/Ckzl9Q/L6I0oxbcIzqZBweLwdPD3yBtKE1vOTMSs7U34h9l214wHgZ/5n/nUL3zMPix4w+jxFO+D0mqV2H6IJLKsVrlfN1rWEOurWJr4Y10/JGKyoL3QTSecLwqUeAPryVxB2nF0HVR3V+tuEA17pNAdG1C7nd4wj87c9luYPykJSvgxdtjHiSiRFPD18Cj9IS2HbyKF78/T777Iihbbc1cN2gMgiML6VXcwQxRCWJ8l2AvCUGQXFFAmx/NZq1BnRpRfljnq9lCyXKIXBGTwv9RC9Cz94a+G/DXTyipMFWLr8pqXIZ1T1y4s1V0uAcGwkbVoWTdME/qJ4mAz+7BLnihytumeHGMKGfF28eIN1eTVil7MqbxplA3b1DsDm6lCeZJOOUAQd8M60cxrp/ZOfMTnD4xPDsYwDk1fTB5axOjJ9pDH+GDvLnxb4QGCzL2wV0YZOhHR37Nxo8vSqpNUcWaqwDUeWhKDvtnYwa0+exgV0qf1axJy//Icr7IADjF3vzkedDYDeZYWvHJZ589xDvULiGpB/NVese47vgSpztIw31U5inThyAt5X+oFc3in2flrJXlzn8wQZ6a/ADrZR8+JO2ITRY+GCadS3tEvakd9dU4ZSCNPwwXoSNe6sh+nMnJF+LJ7/CSVBX9htnSNTRSVN3GH01ilRszXH0zGN0WMIW30Z7sp+HCZe+VIQVZXZ87e0HmDjjI5zx20CGaiFQE7mTBItNaOZpcfi0Uhy8nbRg1r3RGLHtCZueFIQt30NQRDYTIz71AX8+y9szorl46kF6660DprFjOff+O+4LX0Bk+xdm24/jlLwFIBeWBvu2dsP2gsk4Ypo53BCMx/SpadSc3s4b9yngc98oHhhjAy9j40njoQ8XzvMhhdMToHiuJG4UmkHj89zQ2rgSTrmuIUnZC6SpPAJLSq3w55wLdFGXoKhtEhcJzAX55lXwqsyffc/eZAWlEIxQe83aYfLgklgAxjUCsCBFjbz22MPo/O2kMlMeP99LoZFeG6Ay4zHj1xf8Kesw7p+rBXu1TOD6DkWeJCXCR5df4baUVrIRNMSg50dwUf0SlhQ8RnNn2sOokgEuMZelkJeBUH7XBbz8jvKbjJXcJXKdHYrDcVFAGVns0gctSU34eFCKhHpH8M1AX9ZIjMHCXkleEnWaZh/IolFqMbQnzgy+9ZqTr9oiWieszt/OFsHm0fP58m5p3HivAvVCMjB6eRH7dsvB/tYqNlPtR4OZZzBgrDB9cHTgYKsLoGo8yG/WNlCnSy40XreF+af2wMc3o9ghoAYTJj8Hjn7LpQfVqT7iBB3c7wCDviGsskMDWnwiUd5yET3zLYD1ng00rDybxldWkem+EFpZWMJRR96Ah7YFzCm7gF1/Cc4lVhN+fcSfTU/B19tXSH9UJiQPHSKpawc4cp0CyK5OYD0lQ5R/JAmn46P46YcapGux/FolnOqerKXWwkdwPmssZJ3shtg/OrQqOhCDmgx5xEQV9AZPgiWtmDq/CgwvmdPWXxpQsKyJHxqncuECG5RYY877zRfwt9s+1DDTBnq79pHr05P49bcpxI5+D0Pd+9jxfDtL1VyGjw/iSXHeB3h1Eljg3jJ48WITeATYwd2e3ZS0twqC1lygbGiHlnmCFNewEx4c7GeDoJV4p92ctgTbwxT7Xqq5b8OSVyzYcW40XP3VRa9TdNGmVR4g9TgJTfoF236NgrDxL/n2nzA67OgMji9uYbL0Fkgx2g/C+85xjvt83FQ3h9Z4jwAX12/0ceAsdNdfwsHWdxxzPBVVI/7DlvFWkFqynUpkdqFXnRaIb/wEUcX6pBeUjl/PNZJ8Tyx0nghlj4vi2O96gA87nIUNfjpwIice+9ckkE+xKd+Ly4RD84xIyMYPbrUQuj9dA7sHjkFLoAQcfOdP74Mi6P5wOvOCKTxp6Tk0kdGia6sm4ddd26l2gga7fzKFMc5FmPTrJK6xM8QpKYmkZHKK8rKHUb4K8Uv4bTRCpDHv9IHS36OR2xjqHo5HIZdETLrVzvmdUWSc48W5T1T5vtQG9hMRgmv9V+h54i8eZXcUbKVc8OBnUShX/kujDaXAZ9VvLC/KQ/kJxqDn+5m2yGawgowP9EYtoI/THWFDbRO1/AsGkfLXOD1RlmLWMIifzSDrpA4wuVVL4yw7aOvUMBA06cXSddE48q82fl4+hmq3KkHVTm3cfNMWTfarwLhtHWhY+wzzi+ZC+vQ/mKBSDBv0zuKfZ9JwM0WCxiu746UVl/HI9gg2iH7OTkUpfGDHfog4MB8+fLTAwm96sOP9Trql7Qyvr1dQoAfQi+RJIFEbRIHBS/HqzwBcmfUJnAtHguv6dBoK76Tryhs5RPY3aXiMgG6x2fBh3iU6X3uKRiw9BYu0jKA+9SD9Gb+Ebs8ZJsH3x3m+swznbrfn4lsC4LNOgTZu7cdJly1B5mEa7KkP4Q4bWbBvW447X+rSwBVvSjqsRmZpnVAwaIpeR8RhMOgf+amXovGBQ2yqE8gnh2exr64oCkq542Y7ZXj3NRfzw81hfJ4vvZCaCYuK6rHcrgeXpQtzyfe99PnPLlgR1sP+z5uh0NMAJqUc4dKYtaCm3cMfRrvz5a2LyOFyIz1x7ca0Ubbwt/sv7rOaCPF16hA/9i/9fGaBWko5sGl3H7DWNdyf7QorvJ+ArvF1fiwgBvUh0XTNVRAUguXQ3SmZbxSrs/ZcEUr8Hgrfh0fCk3OmpDBrPAy8e0bnNUbzu1MNlD/UxI1SmWwVr06Bs2S41f4wXt64ioKWCcCcRTug2I0x84Itb+x1QcUFp2Bhy2b2eKDLxpyOjz+sxkd+ArDl+lt8UGMKeofF8LrfT1q0ajYGtPpj97M+mpiVAf0qMWikpAFvRceQTqQGXi8w5YQ7cym6YAZExuXyh7EXOMGikHzbgkE0QA5GHBXhmvVjMPnXYzo84SBoTfHmbe5T2G/5CVRVNsfSLR9J4pYiKI8P4QS3adgg8pynzG0i2duSdCRLny53ric9gXre9n0q/bOcCCaqR2Dp1kSeMfkIi20UpbIwKxCRyQGx7314fdFMaluTiM2KalBpaAJPBs+S781mnGwzEoLbJXlm2R1Kq8/FLKt6ltAQoWgPG5CRvUXxRSN5q/luvLH/C8U0WEGUszfURDSizvyl/OxRODTrqMCYzA34t2M6OMSFoPSnmZhoJgp0pItsfOQx99NECC2LIYlTBrD1dApdODqBgy7cIJVYFax86A6bqgVo4YxIXLwsFX/Hu5BBEIKB6Elw01jNX4fOwhT1JfDhtgzA1SYanGfOpWZf4Fu2AaxYrgGKfy/yy0RnUPrSi+2JavRygS0ciQzhxyX9TGuOwzklCV62aBLIyj6jSSP6YfneBpLbqoSX3SbB3/VnMKA4k9Wa3uMrs0dQvkobgte9ww0WQvB12mjUDH4GVQlv+eLzlfDgpThOVutmxbmufGukFdzJG4SMDEdWvX8Kpnp4YGHQKpCKOIArzoXjxCf6IHh2FryeqAJfDe5BhlM/1PgO8YpgIV4vvgHbfKZxzMgmyMzNwL1p3fijWBZGTFnI86qWg43hGRSuP4D/ypfig/jtHLnyB08w+gqam/XxcoAdLP2WBZWbrmL4RiPc83kX9i1MpVjlWNoesZWHS4WwoUaDS1frQli0O0Qp6XNaegmU+OpRsqYINXQdYcWiENx1TBcqb8zBrmxLsFz6kpLdv4Px30Pw70EKhGgO4cnru/iEhhlod+hQRUEUHZotC5ELY7gqcQTmp16kp5mSXFV4j6Mdv1P1ZBF6VnQRT7WGoWmhLPi+vEbHTK5S26FnIJRlDf6ZBuBT8Q9TxG7QtmZ56nuqw6s87UE2+DKVu9wGweeq4P4sDjaVaeGOgDjuLnqIBxWMUfKPAbSkCcEtHV/+VOdPRutDIKTGntwXzyCJV9s4/fJhnFg2ipxDoiDCYjQ4DwRggfZC6DycQfaZ0nT5oj95n3wA99u0OevNU+7N2kq/vAi29dtAUW06j01/R1e/VXCv4WF+uP0fTZ5xCpX+vMBg5yOcvXMifEgfD4+if/D3imRWCRaAzFw3WhofiieC2yHwwBt+v3Y0521keL3GlzwyhzG4zp2rVfsw00gF3Wyz0XjxBlD0fUtigu1wcJU8fO0TpI6cMFaM38afc9oxJusrDlx8yFs9kL3xJL2behfu3TaFzpufoWL+dr4XnQ2HxFUobLM/Lpr9kp8uBuiLMKTqL68w4qY0TH6iy1O2quO0RjncseYsaG34Dk89dPDB+GS++1GSoo6Zw4zNquA6dhgOpM1gwzgD2nrnG5RxLAu5Z9MOKS0Y1tzIfa3reNhVHqwCX5PUb1GuMPzDvVcFQFmximWX6vOb1c20781qfPWikF5UmMFsizuY7W5E5w9W0HsTYfhmOR4lxK5hR1oS9IlqQOscEcQ5UhD9rhBVHMI4aKcqG0cJcUDFPromMJV3nv5HjQcr8f25Mv6QaA3Jqj/5T4ofCTtMRKM0HeyKSYDlk5vILUoZOxz96a3yeggXHAduR/zA0ruVasXt0Cv1KXbEXeKwVTP4eKMlfTXxIPV0TThkZgR5/YKUE7WY6nKFsdAzl0M09cDcXwx9v1wEj4bjmF8yjzXTRKD4cQppPcrAoXmmFLN6NoZFfcH74xUQ0l9gjtlInO2Sj2pxAvBwbxQOb3KD5Mgsytu3GBznPmaJ92spba00tZXNJLfQEhieYQy+2x7z/ihlXhm7hnH0f7RIZxMXaT8lkZWTQEr4IL2wc+TdFbYQtmMCjBl3HDQX3GTHB3fQstSQpygdwmXtSrjpehW2210mJ0tDiOhsB9M3s+l8dAge6jjARgtfsdO643Rk2Qvy/uhLUoE5OO6qHry63gNbTYb48J73fCViBGfq9fOGt9fh2SMlbG0ey4sV3mJbizrM+qbLn6Km0b+M+eCgE09Lg87wn0g5PpJ0C7vTHNms9iIMLNMADcvnvGq1NR5970gbeSLFR33D6Wdnsfe0WRQ2JpFjfu+gWDVtyI4RJa/ZOpRr/pMTJz/FXd0HeXhaCyxquQtKekdp059/pDt6FLR33UaDsAiyzJTmeucsuBi2DF8siIbb/qVwuGUzbXqeRrWCurAvsREe7BcmryeH0cHzDu4u/MS3D9/B3DVNqBTwBXqmBJO7GoBEUjhYDtag41VFSoi6QNdHvIT6iO3Y71fOy/vdSci3HBdEqoFn2yl6NWgJXT4llHBPiEdqarPECxNYoK5JrXOHcb1NPC0HAQjRrIa1ytL4IzuAph5pQc26GswzDGT9RR5wftEmehVaxTurbOC3qhHXByST9ZISvBvURuP2DfCBI5N4zXUxvq1wHGss81B+2Ax+yu2CuwpPeGljB8cZVLPYTG8KtMojt2ux4DbTnjeUnufwW6JwNUGHr9T/xGFlCZIqWcfTS7vA9sIXKGy0pU2nt7CtnRStW6ME1bOcKPqEMA/NXAn7+9ZRzIGVuG7KNBxxNgeGrkrD0Qhz5o12sM9OmleUfqB8h8e8fl4tjXwVgR57dsMeLRk4IJiEuh6H0HJoEtxx+gJJO6whKnwIX2w9iyP8nqGhShPOu9cOFf4tUBrizz7fJ4JCzwo0dvDAXqnnVLhejSYl/aCEQ9co6Gg5a7ET9xWPg3u/xGDj6NtUE/mNoMWKrzbMRYP+InqTcp56vnliemUGyN1Nwn2NEhBWtQ3W+zjyhsz1YCU2m8ykd/CfLE2UnEQ88xxTxN/fIDNZAb5Ne8bfBkTous4oeCF/AjYXh1Hj62Ly/70LLeu6ycnbEo8O60FrxQT+ltkCy6f0cetfPd6Sq41K337TWr0Y6Fozhw50VrPx1bHQZVnBJV36oDXuB5RuN8Q7KISOi5BXTYuibS0pENg1kfSi5aBweitSlzGrr5WlCxnuGPYjFdrunMCte3QIzlwGB/aCwSFxcNU6BWkFivC2M5h1LWfi3+Qh1pceoKlWcSSz4BuZps+ndcMm0FYYgfNb7dj4+3gs3ZaO5+1i0SR3NeUPOsHY/G+0S3MK3q8XAI2kQrxVfIV8Ezrg46Yijh2hSZY5S8nCzZOsXvwFb93VtM1IHEa3+tO1S8Y4Qf0hhsr9Q9+If2iUfBwXVmrjyOaXNP7OS3I6LAti0yxZe/txOjKljyhElBN7POiw2Cl4aHkOd8pepyA9J3rSJAg/JBey6LkcSK+7Q69jpnBqTAO5zhcFpzIRah6xj+/UetKXiomwXL6X9mV8wgXlCeAZdp0DwoZpxdS94Bo5H9+PLOWsGh9cHi0Ccp12OEUrGe6JiLGSwmPa/eUWGX1RgNzOlaxTqIvVFgHsricBSioDVDTPmfa4BoOM2RSQ+jOHPwj00/Hk5fDAxBtDRPN4xL4JYFimB04rMnBi2kH6t0+WFUfbkUB+O36fvhBe53wCcSsbCMjVhNV71uOkwkLu2qyA9kVutFbuI203iGGPIITkyHNQ83sEbMizgpacl/zimit83bIN+78P8M3P58Dq8Afc+fEB656th3XmdWz6WgtC1As5aH4WV3oZwTj3V+Q2vYI2Xn4OCwLSeGPzOVbbcpuT16uBULw+HlB7hfJjoumlRDldrn7NOg2zgG6Jw97KubDiwwro/SAHe6ZX4amTuehRd5bP/beQlFcJwW3rB1T57iddlP1Hvj1n4Kq1EAz5rgMl8TeU5fQS6iSs0bG2mJNjBJku7KaZRRr0rDEShkXHQWmCNGjGr6He9HaeIvuIzFS2sVfXXU5tGsRg+WZcFFDD+dnK8DL0Hbl8ngpL29Uo9uJKeCiuA7aiHSCsNY3CuwsJrpjjdFFRKDbWRN8bK6HIVYP2HU7koqJbbDBjG5WOySI90d/wRKcS7ncgTN0wmkJS09nhx3iSkTGAo8ObcWuHORTNLmZeowXq+kn4t20cHFtRQHb3srB6bCsXWkfgjl2/wPj5VBqjl84ROx7g/gnDpDt3ItiWDYGK3gz0mvwV3199QzOHrOHd0HgI6LrE1qlLQFvtIMjf0gSx+C0gX3sSXrp3UuRgOVboNrCC2G1yf92GP+dp4ZRxI9Fhrz7MHJeDItPM4IxOKxZV53HDtP/4n3MetGWe4ckx+lg8w4gMPMfBgsAYLHw7FnUW9sOuQUO4fSsarU0r2CTwF2qMOwwt+qmUnzwK+r7oUnXXLBR+MgrjNjbgo861OL3VAqu95TDjzweqnRgMj2fbgfWuU/xL7BvNeuYLoy7P5uvzqvHB6WzKcrmEo3TtKdRSkPqvW0NBiTGErE+Hzuk1LD17Idfv6MDST1Xgue4qp8Q+pF02y/i93QQwcq3jfe43aHTQBhi++w5c3HtBbk0sbHngD53ePfTWuAPEbHXgUMkgbtS6Db4zJmO6STiGLJ6Hze6riZq34rHT32ml2S683jQajBq6yPbSIXpZsZE+FxRx9c/NqK2ZAi9lMjm1YTdtX+lL0seMoWL2IGcMEpyjSxBevYzMG50oUauc9w2+wBfHbeFtRgjYPbaBk94jcHZdOEU+/AvVOuWoSzPojlQT7pt0gOZvcsEpTQHcpaoIspEXyL90CQTtNuMNik8oyjIHZe+u4LVl6dxntpyfq+TCmnpD2O/zHP6+9GULAnwrLQN/JT+Q5StHNku5A36eIqw3Yznts7aEX68iIGz3M9gqdwxefrXBs5HhmNxjCZ2rV9OdxHgS+OlPl4/LwqMxV3i1mjTO0HsEB6NLaPayZxBddxpSM6/iw6rX1GgUAkm1atBsJ0XT1jnQy7xyEqnTpXeDV8FqyVy88mENLT84FS3HfgPL52Lwqm8H+buWUW/DZq5vOAx6hufgZEEvnN0pxQe/34JOuSrERBMQfj8NtQdPQ35dPsfaHKdRE8MxZ9l9fv2lEVXdpmD6uddctZtgXVcvVT+5heE5z9H81G16ZvAXfwo14QrZFNSY5UC5q+cTrzQDjb2xLGl2juNVl7PKQzeUt73Pj4oV+Uj7bBzy7KQ5d2/AogQpeFI8EQxj9uC2kxd4xK4N0PD8D8bwJFrw5Afrpc+CPUvkqM5UFjbN3U/XI9XoyrJPnPHsBKq99qOyDYIoeuIsXfhhCp6W10hitAp0vNlLSxK9MO23KH53f4hpOQWkfWQAvAM98InhOewa2MpLXKygaeYIrJViSGUX/tXNvDWgiI3cv2OrhTzuLDzDbplHWV3bHDolFsHn5o1wYtMGEJwkDY/Sfah3ay9JnljDG5yc0WDyFVA6ZQKn4sww691YPKc0BlyG+mjLBitc6S6CCRti2TO2gfTv9bO4ixS42chjgvoBeh8ajZHlinzUMQv/WI1Dn5tpmOVpBwPHK/DWR0N4ubKSnqgpwmwPTbwf7gnv3GshKmEpxMik4wjhBjD2M8eEn7ZwTuIDqYXlYrvDMVqwMZK/D5+EPmEZFLkzl4/7ZGHhwloyjpcEHWUJrt9/mZ/vPYP3trVi0ogL+NtoFMrp1NMybV/wsJtBB/1lYFD8G29eMwtG7QA4/qkGWtWa2cH/OUhpT6CBIUcu6n4GEn6m4JD/gMd9taLg5qdgO9+flMwewCnJDnw414oO7Deg+wvfULOBGOQV28PoMeNxWqwNSYf+4TbbPGovlKYZy9rwqVwljjDMwOg9gnC08AS72r0Bz/MBICRVx2/sAc4qlOEnt0fc7PCOzywDXOGrDuUP16KmtDMMPfDkag8dzB9cT5v9U+DI5zOwen4LZdw7yrcirIDrkygVI3HTYUFIfOuPj13uwYrQpzC2dTdcSsmgkmNhPOmxGTw97YZbTvjh04pLaPfJn8wyvlJbVxNayJnhDFMjlMx1wcXTlOB+SS2XxD/npIN2FKmdy9ednFj+ZTdeWpZM1bojsE1xBN0oGQnOOQ4kvOctJGbb8rIXW8HwZir9F3qEeO5t1LoVgf8a8llmkCCzcAoXlreTzLhkiDJQoGfLJpDj3+8091QxG/9t5NZycf79ayRIX3lDs7a0cfirNoxTceWCrFC48D4Wv22vp5ysSIqPXQ47qhXhXtcBvN1hA4YhZ9AvPx4G1izgx2nbMWPNBYqTDALNC4NQslIBTp7QwSelnmBrnM+fH/mxrL8BdIcUgUBUHDwWK+eLS6Ug87QMWM13oT8zXXBxWAYtn9/L2sYl4JB4Hc7m9fOu3118pLSU8udrQ8DjdAx5a48ms7ro9L7f+PjWF5qi2YEf6l+Q9+shsjn4AwPe20BO9BYsP9PAP1VNsZQlORdzqVEpEj1VgyBxSiutuzodLhrog0vaZHgtsgqme2SCjuY2Xp1tQQIHElg6BKAgIAyt/Kt4db4QuP+0RvNxY0mkKISvvXPDwFwrerBwGX+3s6aeCwvRdMR/WPDWFHROfKaH/lehQCuZSmSOQ/X+s+Ae+YjixZ/w9E/naUQxo8//xN2HNhAO3wDg37BnSiHZZEaSUYSkSNG0GoRKGnaJitBSQolKQyFpaJoJlURSRGhS9E97IWXUd853E+99POc8UdPAw8UeXoQc5cCvpRzgZAp2xj/YZZ4vLFMr4dkK7zGx7DQKyhmC+Nqb8CV0Cm1fMYteCDhT3dpI9tu/Hkac0kbDV7J4V3Yu/T5hASv/lOK171J8VuY9tyX2Uvrd1XD9gDvECu+A95XGNHuCAry/YQzP03Jp0ulanne4By8tb8H951bBoyZl/h4mj5Oc7Vnk0T0c8W4CDFhexiWpPjRgbUwCRYoU0NfAtY7VuO3TfEbpMXTw0jO4GGwAQm5DYPw6FXfFJoCdfT/ktW3ljXNmweFDSiSWXAGyv7Xh9UU1sK90xy2aB6k7qB1nn1oGjoKiJGL1CZzc9oNr0CSMnS8OovOmgcjyJdj0cBrVn0uFS5lX2NXDi/w1TDDrlixFDG0h5xuHsPGOJXye38Liqgs4NfECZR+pBe8NkrzI+QxPmK2EYrJjQe2RNP+6AHBisSa2Kl2mYx4/4dlybZ5Ft2BW8XJUrK7h/cINeFIkBbV+j4HGMldSsH8JY22G0WX2VQjuNoK4/IkkZC4D+odz2f7oBY7WmgLzupzxj8E+SHgyDz3FBTHd/yUcGDONYoK+UebKg7z4rQSNVtSEAFk7bvLqoqjmf7jlrS6dO1XNA2YN5DB/CXpLfgWlRC/4rW4ETs/d0GFpJa/5cww8bsxlKbccvLXZEdbKVlP+fzfwo6kB9dxWgE5fFRzR/IAvCM/lY8HC8KIlGywjJ6KbdwfH1vSR7ww9mLp1PGTaONMLdV2qijSEN4HLoLZ7BaS66/HZjYiNHXVoZpiNkVst4b5/Bn+YcRseCRrjwqJZIHFQjkqWLoQ986toQbQZXBg2wot/VWFe9kkKq3oOJecdaIqvL0xYPQy+5T68+MESOi7jDxe0wzni/USoeR7Hb1vtcdTG2+TGpjx+dzQ4dj3FCMNCLHn4FtvOz+DfW2TBbrIk/NUr5QsRv/Hn0m1wx0cSz0V709NmGQoZd4VejVuFU86IQUWVJ02Kc0aea8b7PWdCZFU4Gwk5ohg20bh5P3DxdzlcoSgM/p4FcMA5gUrNT1Ge307IyJMmvynuWN4cjDM/GdKVw/bodNMKrGIYfBK+U92CEmjfGQCn+vMo1fovzPLphCW9XpD00Z9/1SrCgP5mdIkwo0czYulnyG46FHKP5LtG4cst38nKpwhMrv+hVAsJOFr/CNrmvKL5o+XwfMdDeJm8GgvPCeHB/4YhTH85fpddT8vICgyM99GmshWso7cT96gtpFgvHxSumAjBbXV8yhbpoW0DGr0iKL+RC48Si7DqdxJbig5TzbZtHM2CmG3ZAK8Lj7DaeHVci+PAMWwJvw3yxkbbWZByZgJdc/8D+zTc4X3GXV50Thqt5TdQtNB4ePxkHvmFi5Fiyl24+egpLpGrxDkHGjDp4VSeZjQF5j1IA10UhTNFFznb8CN4/Z4Fi7ZfhAaV6dBQMgDTtZzh98cTPHy1lWOPmcPWsTVwsUGR5kR+x4VFGjDfzQYFpb/AhEeZlHu0EzpqN9EDaSHw9JWiwuAz8PdQG8f4P6ThekWcK3gNlPZMhLjUXFxkfw1X+yM0ZPfi087zMM1vCVwZpUmyS9+i/ulKVkruo9N/BTHihwAZPxCA3sqx5Gb/HR4JB8LX8SJc9TITHq825RztF6Az5i/vDb4KYq1y8Dl+NSjkTKX0k6/4ves3HpP3hTq8X5LwhWC0tvlJygGJ9E9tCuzuUoHujbVwwMCHkx2SoOD0XM6qugBO8W+o2l+QF7ju48MJCrAFnmCh9CBt2n4XQ0WKeGvQO4oYdYtkSwQAAnzgc95fKrUQhT6LLbTyXzMsfy6Mw9fiqUVQn1ecTSfj+mRWCwnBxfYeVB+vAaG6YXgjAvDfmx4O2zMLdUfux27HNxyuvx/XNYqQ1VEZdjC1ADu1X2DrEcqOfpb8+8dqerSulp9SJqxUegcV4ldZMb4L3spIwHlFMZT0S8Gw7VnolyALHeengtTR/0BhUgcPxe3kDXaHMP6xMMwNSULdT9UwpN6OyX5r6UuDKb3UryeB6E1sVPATortHo/8zcRDVPUGRKu/5otw+/P7VlpqlWiFcO4h3Ld1C94qPg8m1pZTYrgLei+T5D4yCxe4pvFavHCyDlnJVqSRoxgfw15xkXocPaVWPCvhU9YK1wGmSXukHEbJPwa7jIjVsnsldY4I4r6oeBBdqwK5GTeiuLSXlqgF8VjQVkm1WovS+41DmLoyl66aAkuIhni3kwfcPS4FO3Soy/hcA8TvFeJdVIn869oytdWZxxNYdnLhngEx8F/AmKR3YO2hLgbcm85t3NfhV4gtWC/mzQMM3XlHqBir9hahv7A+FHWagUi4NnboqeBo2kl7Dbb5SfYqsGuax3K5Gbn9pzm/r8+mXmySEniXKSfaDZWm5nKrvjRpfvlHdnYe0o36YzcbI01XdXijq1obrV0wo72Af5UdvAJ8XVyBDOpuXr7/Pm3M9YcDJHRJuSKLveC0of6wEIrlP0epnFP/xruMkrRHwzGos//QNAZ8rOWwb/Rm+39CDnOcZGLzuKAxdv0odM17hgS3bWTNkPc/bFEElXodh9wkDqGufBjNoPwtmzMF9xhJo98IA9p8uhb03zGDY9iPs8xpiV8cyPLzHEkb9/o5CmX+h9ls090W7QZVeCcYIb8e0npd8sswHYyUW8XJPgoRt3Xhmqja9jWikFK92HmP2EGOLr8PTm7FkGYEgoR7OUWayEK1aBNJPztIG22/wdb8EvNIKhJy//eC+KpKUNEaSyOE3MGmyKJimZJPiyvdUVFGDNkOu0KYshBpaUhz/u4Wrti4G0grlNmMt0AoIgb2jx0HKPXv86nEP9kqJ8Ozl63Gc/RsM9zxDfV+70LVYCUYMpnNXkyweLUmBUKnVVDQjiU5kHOALk75hzc0C+nU0FX5+s4ZiwV90tEUV+nNC8VD4O0hYMgk/e1aTpPsZvvr5ED5Pc+GZddNg4SxFwGPXSWhaKWWK5fO+nevhxl0dSOuTZr+SPj4/ow3GhUqC9tvHuGa1CN1rucuLtqnQnjWLKSHMFYZKQiHiyR0QkwsF4d/qYHxmN8dKPuO0rAy+JqiL9anr0E1+FNefzSLz0uNkWRyF678ynAsK5q7r4RgbHANr3b3A4XUyD807BZ5bF3NmeTxLK27AJbZjIOvkPIiZ7Ucz/jymeLuLvFriMe9wZ6x/bYfmsplYuGoJzhk1GdZGxEBJWyo8KCjExZK/sW6zOBZFF7DIhFQUSJGmLnFvShdWh2ytfNwlL8prJ4ey70AkJnbmo0v0Os59o0Xxydvhkk0OJXgIQ0JKF5SIOmPamXKcl+8Bbmda6L8ds1G6d4AXbAdsGi0IRps0IapkHuYK/KagSFE4ZZZLGxYeoA7zMIqSqePzBa6QIDJAVj0K4FVcjz7vppGK5UwWPGvKk2O0SSC7gApC7tFuTz+SqbjOSb+nQuWGXlhV+hbWlxjjqeReynnoQpYdD3FTXwurOLtAz2ERHJOuBlUpXynEYgqQbzs80jQDt2p3EN3qwn2GXtzf4YCyVo2cIGkB/hr5MHTjAOdGbmCDM+e5cXoJ5Vc/oxdVdzhhjDLqPboOg5oyMLMpn1SzWnGl9zvQLU3krViB8iX64KRbDkI7l5OHZTZtVSCY/XYpZ1tYgPNyRXiusJuCkipYuHMnt71tgqsjG2jHu7HUXaYFOW7r+OytFtjy+CTW9L2Fuw9Gw/5Wf5RvG0Eq6oEkJ7YLF9fKQnqaOoW8+ElKTjepd2M3Jiy+h1K75Wif421u+xQMInVz8WqUEEx9k4hWVEvB4rd4TNI+VlGdAhGxwiButRjdX/6Ex0WRHBJMcNolGeya1Flr5gteLTpMkcvr4fp4b27QRzpQsgqWCyzDC6HW0GnwhsT90zHnzTYaIfWdd/cJUt3SeThbuY1qRU9A2Stf1I4TgG3Ou+FY+wbO13yI1zTrOXzdXJC190UTqxyeL3UCzRe+w7sFwrDrGJKmqSXu3XmCtSYbsvuCclgRK43m2w0h6bwtphySpJma4tC7ei81CXRSzuow9tr5H60tKqGdve3w5/JN8PjVSbnhXyF8kQSMDmijyVGT0f/Ed/xiUco2q9dg5/gCaIob4KkR8qzir0CnD1jDjzUL+OUrhAmbm2l/UT0svtgKZuX7+NPkfurY0EM7lx7loO/qIOXRhXFLndiq1IH13iOJ+JvjnZcnaMbNJLyjc58UnwaSV9AEWN56DJe4aeLDEdmUoCsJHydkouvSeo4dms+f66NwU9lh8s4VAl2DDqQP39HQSA3/fQ1hWewmm991JNjwj05/KYDO2MfkZCsKAd++U806eYqaF8J98w3pheQI3Pa4EP2XrUe5gTnUHr4MxukQrKk7Am+9frBwsS3Ind3Jmm1J7LWlkVc9qiGD/zbxwfRx/KJaB7QbJKjGcSltejmLttmOwo3X+yk/MBVffzXBcYlXQc63mF+OF4INuctgfc0y9LOyoN0Vl/iBvhyb22VgdsFiHhA5i4Z+pmz/VwDKRv/l6/p36E+cA/Q4h9Kq0ccgsvsFKzx9jhVd0TRy0nu+2qEFik57YabecfL5dIxCVFr56RtFbHVoh7Dw6diVlM1rbT6w5j89WCXUAtKpgjx2kh5VebfApkxx+u26lHbfukr5C2IgX8OcV11mmOA7k0WiN6L+86d4u2EX+1a9gwOyARibMQsblJ7w96HrtOucNASqfmHtgxq0PLkezfJkKD7NDi4c7WCfOeNYolERzw884MRkQVD2ng1Wvwyh8NcLGI43A5l513hLWzPsD60BgU+LsG9ePwxm6cLRu/c41OsQNMvq8gTHbpRdN4tyzrWw741J8CJmIfaPO0YrivTAeaM7XRIZAzLVc/H3zI8weaw/am5Vo5sGhThybgO16MXwTzcduKdSQFvNPch9sBVcpKv4X+BNqvWJh48BC0Bn4CMO6s6k9sXKcLlXlRw3ikLWXmPK3Qo8Tbsaw62O8xG4wB6SU8D0zmyqNFYDpYmXaXPRNu7fpUKJIYM0JzQMXq/9hxtOXKT/yjfTl7PrYcRXEdj9p4J31TZRYPMr/pU3g39XvASVS908sruVHULeUPOuPPj3yxw6Nm7kte2n4V2NJnYuPkxzfjyliX7TGK5HoITaeR49womX/bCAjMt+6DN7C7pGH4LLx8bT2jcDYND3mp/sGU/a89+C5D6G9t6xILroLSyY+pbf3Y/lwItH+FSSGVguNoCC0C34X50/BIbbYZiaADh6joRin4WYFxBK/y4Fo8GLeDSoKMHj/zGNHW3JqzwUSX2ZEtyamktCuqdIxlwCq1sA5rwbwSNPhkHRYD/mfTHi1k1t9MFTHAq3t9DA4z3kadLJGbbhvHL/W852zoJFdh/49lwHdFtTDnOdNEDIpZcmjVPGh/N6QXR+G274dxT3Rubi17mu1Lf+Ijis+sc715rB2VfZNEOgHP66r8fMtS5QN/YFdaitJ5X8YY6O6kEziUv4JdkSygJM4JupIoz+0EwlRxJBoccRPxvOw5qUUdwO1fT7wVzy8tT7n/2/VuO1IG37Cyo7Z0LHw97h5dphOL81iDPtX0HUxTX0V0oStfP1YTjRi54fPUgLDAJx4kNFXPFxEk+GAkyWeIpiz15y33ZTNLGZCkVHfPj5uolY8eEz9ssNwdqwZTD+pypsTJrC8R0qJKP2Gx60TgSvj3fhcJsafaFX8Oz1Z/Bxe48/pF0JZxzmTct72FN4IX81YhBQmYwja8bTFeFXNPDFDMvf3qDocw/w7fe5HL8oj7piIyjntiGc2T8FfgVH0gXlj/DgcCgZ1ebCjHe1kJpkTiaGAYCW2yChUByUDR7Tv1fvwH7MO+rSr+Y36x+xY8AW+lQjzWV2A3DfRBmmVtuAwZZWmLRlK1d9L8DOGGmW/fMMN6vbQfHd/ZA5IhFPd62iouuK0BCeR17+7njnjjEsclcnZ89xoP6gGkcoBfKZW8twnecjiBlEkPi4ED5M6MSoK4txc/89+pdjzuHBdyEjQAx8c4jd+lfhnuvqcKpbFadY/AL/RWV41esXuBSrcjP70lGZBBYb/o4KQtUYliUD3+9cJOPpgyxZaQtCLR/pm+d9WLD0G/UMCPCYKWfB9tE6Sv9lBUvkR0GK+2yaU7kNj4SrcruBFg26vOaCRCNSvm6P/+Qngd3aEdCmHw91OhPQpPgrfN03ifeUb6DM1DDMtR+PA9NcyVhPEb2mmAO5y7DPy0PgcuQKaRb0k6L4NTi4cANIRr5HP9cwLP/0GiTLBEBAKQ2kc2MpemQxLP/vE5zJseZ9Iq9oZsUo2OqgTFPjmBzKNUFsjz4vClRgRdkeGuMtQbRzJSwtEKB2MX8IWPIQdnw8Rx90REDf9wJWjl0CZjeOYai3LmZYd/BeqY2wW8SLAgySuK/5Dxm+YShRDOalnxNh9YrvYHRkC+j/10z3O+K4q28UBQvM47rTpWRYMBJ2lm5GsYhvqPhzEZu2B/FT5Sx621QL7/+OpFU5y/mD80dMnDsCMgwreGWjC3X/1QKpKiMuv2SP4grRfCL5PLYZLsBTxe/o1tWp0Fn6EtbJfGbHDm1abGFP6LmfOkSKwOJWMUdYrCRfs38o2T0CerI+4i9Ra5Apq6amD278/bI0jv4rxM9mjMOH1WIgsrWUbpQZwKoRyvR3aSDPE/sIY6sP0t8Hu7lzuSpfSFRE+9lf8OrL0bShfBw031xDr6MC8cI1K5w2zhNkv3hg/NAdONMUygUT5/AsTxv4Fa0KpcHd/H5KOyeL7eSWSiW6ojQCs7/O5ZPl6bjAqZRF9+3EknUaICbbSKv1Imn60mQa++UojjzdBZOHZkLndjmuX3qDvbrdOeORDHxVnw2WgUth5OFdeChCj3uzD5C17y101e3lWxn+GBMYjIeq5EDSuoB2uX2grqdj4USsJDxePkTD8mtg3Kgazsq6w5N892CT2WRo9PZB7q/Go5VHcPcxBghoYpeJ3+iJdwI8OTkT7i86xWtNLUFilhO5dG4hzR0VrIQ7SO5cAV+Z/BWe1JzjmFAr2hzoi5JvJoBHmCP15uex7a9+LjtOFBz0D0T17+JT8Q/o6t1OqpM+Y4YmwfH+o5Be/QNXbRlLRVVP6fMsaZAY+IHm+rq4b0klXh67E4Tei0HfUALbpb2GhYscyKHqMix2y8T/Jl7GrlcRNCJMGcLl/PD+JyGQCPXjqV0B4GG0B85svAQ3RTXxy8+N4JNpj4HXpGjb7jwOOqIL4aL16Dx2Ld4/8BF6F9qgudhGcjLQhH8ml9i6+RUJLQ0iuUEJMK2P5KAXN/FyRhz9TqmHjC8SfG70Gwp5IgnDbVYQ0qXPQqdGQlrXZ9KYL0Ni5+RwZ3gp3KcOaBHwoa/VRPJjhqFjx346la0EqWmltKafMXd5KChfsqUE+05QGnyBGk4mlOeZwYfMMvHJYQno6f0BShfFuMTAjmotBfnHYC0tqWjBvNZr1JIhjA5zRtB7a0UIzf5Cl07kY2bkMsyiELK9HA2+49LQ2jaeo3oLaP7dmQyp5qAgNIfOp3rS8lYXGPYUgx+F6ynpUxaUhH3lslW1kKB3lQd2msJwrA+IhRezqVwi550zhYPXFSDN7iaH2j2CBZnptG10M8d4iIGHgzqaPnkBBjZ20KVuiCd2rKbSpI0w4pkgbLNLRnryidJTEd5M1KWDNqU0wqMXbT1nQtUfb1zZpcZFa/Wh+GMaiHW9oyODDE8HUujQt23gHypL515645DROdRSfYb6teeoNESRaqwm8mwvTYhxVqLvRz9QV897yM25ze9+NJP6DR04O0seEkfZcGZgAK5bqwL7pooAr74Er6Tm8K0PkdRCV/CgjzkXpcXxLnKDXl9f+APmUCs8Cqf+fszVIh/xdbEFed+ZwQMdSzl8QRGduWHDLqdLcKoewI+0n7izeh5E6QlTy+bbsEUjEzaVN9L0yR4gpiQLzbYneb2NACTm/uXpuu/YIe4NKc7cS4MuB/lrThE239UDm6CTICYZiS6vp4BP03747FyO8/Xe8OagFbRYaB8+lJAAnzczcFrLKNJVN4A14npQcMIZwovm4tBCFbzpYkz9E5NpQ+MirDN9C1+T91GYYBaNvy4DZQeiKPTKB9wXeIhHnq2FJBsR3BiczcZ+L3GSzSV6cX6Qx3WOhq2esbh5qyPYHwxF9/G76dSRXVhqG4cvbI/wynG/cE1OI9/7Pg3CF2nyseVz6eezXlorNYTLYBvtvKhG6pP7IST8OKePuUPxrTJwU7ic/HU+oPyoZTC9sIIiJxeD4udTPPK7HLzWVgbBlF3krGYDPfvfwLTR8eC6nPgvXcawir+g1bgSWywdqCoyj+PtFvKTSAMQ3/CdB/bfYhcHBZh5K51fW2hih1IaH/j4EOVr1bkwSIUTkuRBwGYr9btMY97TDhpn28hY7ys8OHgQLNcupLnwCIdSbfGu9jR4mHGBzNWtOK2nFXYsPUN/An/wmsYBOLu5l3dcaMSan64kryEN7RF/2Fy8EljpIbY8u4oN6UMwInCQN728y+u3XeSzY+pZxm8M7Cm5AePgJFSJCfPctxdw0yltsPe1x/VVnrQxV5GqDB6B+EMp6HrwneaN0+ai5ybcs+sTqKd8hgjhCzygcJeO2xqDVHEmyt8RgGTh5bS3cw8bjZHhbZVEO/abQ9jiXSS6uh7nLhXGOWsU+eDhyVAfNw+3xd0F+bOOqCp7lQzOjgWl4G9kZbKFtL/kgKrjJXZK1YWqK6XQ8HIxPQuwhumvHnNZcSR8D7kJBkUuaDXNnBdKmtBIUQm4ke3Otbb6rJ0fDNc8Z2Pl62WsfOg02brPg4jp3nBn8B6Pmm8KZVLhdFKjh4QKRUHh/irU6Z/HSq1Mixd+55SuAHRqqeaYkYIg/uUoKI3qogkVQ/C94D2OFDCGcV2KMN/mDji8u0fNRg1U+VQa5rgfwwu/Kjl78DtUxQ+Ax/3tcELhGcw4l00ZJUIw93oHHyjXh1i3/fzcPgiy1Z3pxNBz2u/1l+ZHHqW09fdo2aEwjqo5SbrNxjA1NQzqgl9A+gML0rT35V/1/9D59UeYY5wBx+I1SXTRTjJ9Kg6B2zLZ/FkvaHAXfvETIZnYapwtvY5qS5Mw8Ecw1AuL8vyZo6F1+R+4K/cAbN9KkH3YbXqYrYOtkm9R0OIuLt8RBntdx9MiBYb1Pvc5b/kaeKV9D28fvk1G44OxO1OblaUS0TVfDxTzXKE/Rg3kl//HC6+UQ4bYL1bRM4G5EUjCup9owcZgyjbTxDPjI6CqRhhOvbrPhaFt9N2hnxa5fcTRDvPAwVESg+OvYpv+XDgzuxEPhmuB/IS7XG4qyuwzRPM1nuLBDcpgfc0LfT28oMFwBSwM+MEfykaAyzKCO71GdFz4Ee52/I/LVfOg/VI4rTjmD7BfET7sEKOuB8awXmk3/m2+hz9bpuM8qR+4kx35lXk328y/w9uNTTB0mz6fSjIEr/mmNHqbBMxo24khygLcXXcfAj2e4RbTcDjjehVVpLaTeMJEaNZPZv/Rr/n9kTooLnjNn5/Y8nBxKrtfiMCXMwvJf2gTz1Y3BPd4CXBtWASNqp10h0XoRWMadv7yhwjJLP6yTw0UJlylBGszOH9GnruGREjLaDQ9EhskNbFiNh53EfhvIOyu/sfahVMprn4kNAweprvXVtFe//u4z2MSTWuQReeNM3D6VSC9TZvRslKIasaYQPqcIRLTGM83/y0Em3ndmKaWzyf/e8rOI++x9y8tqLQypopLqmDxbwf5TDWHxKM2tHjyfTo4Vo3bPGxBcc9G/rIrgIX1V/D7RDVod/Tj1r7PFLFxC6x16UPNoBs0TccVto2bztfvP6YUj9Nsc0wW/BtHI7pWAUbroaOhI+iuXw1yp635UlsNHJFvwmSd3/DroBEk94Rjo/ZHLE3bwUpH+tHl6AmIXr0B8imGDHpu0/OKaIyJUIIl9XdooP/Y/5u5oNUX8PO9feSzP4cFN9zj/PBMSLefQJ3NI+H3jTzSS4iA/dHB2B7kjK2KQ3hoWgvckJnFjl3voSbDA/vSR0DKygCuHL4A7XwBAmI9YXp2Mtw0W4lu+SJQtdQBLBULoX26BZxt8mfNba/YMtAMK9uPYE6tEGk8WwahsYXU/OUIjHQPBgNLIygukeVnu9aggHA+6zS8p+2yf+jCVS+q/OUD9w28aMyIFVT4QhFWyFzk3U/GU/SCC1zWN5Enbz6CJ4pe4oa2QTS6kEJDvUGYOVkHRrUPsUNQBbh0bIReV3dIclgPdOovv46zw/WvD/GU8R9xbcc0sLbdjr331nD0wae0+0827PYToJh7Jex4OZrKsg/h3PwQKvGwhsuzbFGwwIKGD3/lznRnKD15huesW0lSUzzB6fg90Hokx9dmGcCSFA0WVDvDC6xOwvjQSogQ3opPlj+glyfUUchwAxZJ+XDRsBJkV3/mzzuVSS0rkMK9ZMm6I4ffvTfF4F8L4XdZAtN8fZTLV4e3ezbzy+8FIDZBHpITrqOtThA2/fKHxT3faI+RC03cQzRV0QgsZKtYe9F42mojQ1VXhEmq4jM8+G2BI6b8oKw5V2jrAXuSWTYO+k94kLQMQH/mY9rlkYJbaidi3KphnOqbAH9tHdFz6BwnTRKFK2t1eNTG/3gw7CB+iXhNrR/0WNrxIexWFQED/Te4vSUA85ZKQhcuQ6Nb73DfupuU6VBJFHqKpge/4Lx3K6jSfSH5VUzn+3kykKo5kbLtw9A3xAYF105E96BCunT2PaZ4/kenfQ6i+rz5dHWpBFidOM1VGUu5snAn/3f8Iij/V0M5kxVZTbgCugwUQD8jDp61q8BS1zScoDEMv2Z+oI3TgyjlZR86fb3IWVVp6J/+GYVzr0HI/nFQaNIBoXsy4KvpBuz/kweWR5bRwajJWDwtlV5DP6Q5RqCAtz40GppT4dz5MPBBEIb1cqjLu5mffNbl+I3Its83cEO8E+33NIJU+fUg+deVo9xy0PJiHQzvWAlVJXvQYV0eWp2fCxJNnjj2gBl8frULJwe74x1pWXQS0iKnV6cwdosQvRnliLJREWwWMhHTLqvA4KEkTLEegY3rT9Mji914J1abXslPhKvJQ/Rt/RM6cBz51Ct5OHNeAU4cF4NT+0RAwPQyaXRLceDD8xzXdRu19/1HFZI+xCaGEB69mSVTazl4th6nCRlQotk0nD3wH9PsFrqvN5tmdX3ET70i0GVpgysN7XG7SiuOPn2Itn6ZhWbNLjxjwVn6McMe5n/6CxdOqEOsnCVIjahjOdcUWnv7ETatlEXJrUq4VGUs1xz6hI+KhvAjmYPgA03oEa+mKRMS+V92Fe+4ocv/lOXAul4D64UsqFXaGvf9ZNDLvcSWt6pg7KXb9PWMGv9y0ybZ3q8UFmnKi/euIXX359x4gUDu6SD8TB/gnqMavPeHKlmlT0e39RfIz9ME54dtZxO1kSyjPQk2Kg3iWD8PHm98He8besODpV14yP4dW97ezzf1jfCTTwFdjLQCAVVjbO7TxR8Jy9AXo7mlpgRkLubDB6GtVCDWjy2r08D94hS4KdyEKUmGHFD7E/amtHPIe02YNORMtv1tdK/UjM4vPAV2KqqQddaYqtemkugWD9rst5EdWkN5Ff6Byn5lzlS1hZpv18ngpglIig1iZns9fjRawar1wbxp/yaYo58LyZYvYfHtZHbJOUJ7JwuC4Mi/tHJZDPzLi2OZl/JkFOHJu57JQN/sLxiY9IaExB9z/DZ9eBpcjGo7FqFNuDrGJY0Eq1Rl+Bx0Hj+d/oI6Ch/JpdyEvzpLQK3HLdCrjMMtnMpRNfLkW5TLv1dVoLXAdD5v9IEcu2LJaKI5CMJoyBnoA5UzmSxi8Y5atqwkxautqJkhQJ9oDp77dh0UtUfBynOp/KdpL10a3Mt6urehLH83veneQTs3qpH07Qo4fGANpChYw9LB2azk+Q1PdK7muepK9FDbjsommnO0ryFZfRLGXnZkpfVSEOJTS9Wvn7NX2wCGXLbmAanP8GnBOjQTSsKW4So6ss4QNg1Lwv2KF2gr3EJJ636AxCl9fLm5jxpkH2Fg+nbevnMpiPe4486J4vB0fRUUTtsHwUUyFNF8gWKereCrTm94t9hNqr9DtOrDdfJbKADi7lf4jtMAux+dBWtzRCh1vAOxuzf5D0rQwarPqPDvDwS4ysDlXcTBnoM0MvYHlRgUgf5Uad70o4HX3fvM6jv10Ln6NCgunwhzTp6mVwKquPSTHJQXnMP+hgU8yxtw9v1MuPxNnL7H/cJk18lwe8IaaqMWrGu24oPucTxc+IOOl2ph9mk/OuOuRjncjXEqorA98BgqWDSBKlTQsWd5XOMUgsmpiuj28hh4qj4FVdU8KJs/BS7XWKDo8Vu8MfUHndVdhwsiVKDpyQxO4iwa417PcxIk8HOdCbBiNIx7FQ5JgRGs1CsPNvnHMCrpKu81b6XwtHDocv6JSbGCEHpXFBwjNXiHtz/8lJOizFnDpBPgBNW54sQOnzg98D9qni4CmR15HJvpBUWdjuSfu4ncj5rxa40GEH/4iUMik/mweyZWWUlC2J1jfHFpEtT/nkAZ83L4sZ4lGpvIQ7VuB+7fW8K37f0x6bcAyMakoMqOJXhkiwbb5AoSX3HCBosYKpsmDQPTPlHW9qXgnj4aalQyKHajOibK+vO1B1K0T9qej3tq4tCo7dx/3pbkI9Uhabw+/FiRAW77F6GTSAEed3zDzXECfGnvap6YvQL61v7jE0KXcY6gFszWOQJdFQ18TX4uvh1tzVPvmZPL41CuywmA0G+KuLZpNvv76MOSJ9pUc2UAe3514uOXHTzZsh3j7wfya68sGrb7CT4H1DD5oBAINSug22I9nHTKABLM4kDgySsIODmXV/cC7s5dT7F3tODN2RHQEgrsHzWGdab9B8sitTGx9Cl296lC5ZWd+KxTC2+ruGFMgjR0xwXz8VfFFLPeEfekRdHJ2gYsLy3CZRfvY2jUbqBbYaT/YiRMddiPkysnUE6BJqbMPUDm8YP4UfMxG/icowbzIXIXGaIJogZwQbCAF039BsHbbkDHWSmYaTuAJ/fdpdOfA2n05yp0vixAl3MUQDxhDScOncYpy5eh8clBin2uySfvTIJiHw9aP+0FvNy9Fs+ukISFMdKsOxwLO1b+gjtqczBINIe/VvmCTb4caihnsG/1GXLJZHCJkOB5GSFwWYSocvRzUBouJn/ZDhARL4MPlY20tXYyVPWKweexxB7PRuGe0pPwSOYdKFWWwET9RRA3wJztFkOzEnXI6LcyfN+bw+fO9fGv2m9Q/tiB7gztoY8TZsKV+d6YUvObXbqTOaZFDmQfSJCuiizXR0fBwPcb0CZTj+fKY2iNtCVoPjiDIwoMQbN9HOyenoM1JwagOmwhNyxcjt+ylUi/Tp87Xm3mO4Im0LfBjhvGWMCUHxPxiFgfRUw/wbERS9nDdgmurLtMJ3Ri6LJtGB3T2IWp/XqQ8m0yp8zoptDuVST4Mp0EtDZCetlENjSU5m73YxiecRzkP2rB9QnD1O5czcltL9Dvyhwaq21BnRt6WWSrLJx0ec6LBOQgTW0iNK/9SdF79tC98yH0SXUjBy93gdv+qnhdNYVcdevJ73ojjboxEQZEPtE+4zYex5X4pWwc/1I+xq+rRlOf0C2+f34bf5q2iiZcM4E5gg9xaV0NOYxfzFGSHXzWxwcEA96Dr9do+iKygwXE17D2fQVYPS+O09vucJ4RouavfCrryaIXTcboLesC5nqPQfaEK/2zQzC58RrGuE0hETsj9nucAGvt3dg6t4ZSV36E37oDZFiuj9oZgjAh6xpe6Y2CEON88J9+Hh2qdSDCZQtsn6YMIiI93BORhOkTzWBi3jB8PZPA9nekqXf+IRJ2VqOdIanoe0qHju7fiv0TJ3H8VmtYI74YGvuj4MGUvSRssY9m7ZxH60U2oP8uY2qr8IMXRRK4IU4LHJcm4JTJDvhgazAssujkr8pRbLY1D2wXATQ/tyZbs58UHmwElxuMuaBHn9dJLgLVujtww9yYY5bPQNUCe8ga1qOZf/V4vMJUEFGt4pFLG+GStzBZv7tNU8M+kINJNKyLeUXl49vRQ0SXA55MgnFTBFH+WxOsOeCBAUtC4KG/OAfEZ+NcxUxw311EC78gGRnrQt6CRpyyNo1THuiztl8bLAtZy5HS38hmYD7MLbPDC6Ur4KuHNdSJZJP0ge3wxm8NNwt9ItEYL+wVdQf3+OWwSTESR24/A7OMReH4rjsYHnKZYDARZ2zcROPTn/CDh7Z0YnAeXjxlRcf/OTO+GA1tRvfhYexsFjHVh+SzW9jGoQzwqAnlOobhzMN/6PNfxq+vx0P36jJUqSD6NrgAls7XoDVy+bT12CPY9Gc5iSTYoNX2HFavHw9fHhM4nJQg8Sf3abBkAay2K+X5w9d5+o46HJ+kBI1BYuAcbAXZp5eApMZunn1gDFW9f85nDYQpqgfo8kQXkh3U5KgNhShrORbO7MoEw+ofZJGC1LpXEAYqpCFPVoHiPk0Hpf0WNHnSHBLJJFh42ZHsPPfjIZto8FCbxeNMreGAynwuMLhJEZ0itHJeNXr8E4S7W85z2w8TdFe8QlPtSsFnSTh6brlLHxfc5svWP5E2CLF/oRXU/HjNQ54nSG7bOtJSPEzPpltQqEU2NqsSFTU54MBoH4DnIwDVumjPhBRUvpYFR25YwNfvS2nuUSHUcm+AbZfk+EeqLKzeSBDkOgOiv3jzqSfEgyvF2dZVCwP+TIbiA1943aEKGN5hydqHrcGz8SOJxojQpIZJHGE4H25GP+E8mzLKO+lPMwfdMKvdB+4WKEFWlgzrzK/GYuvR2Kmrin0XvTHJLxR/bn8GK4za2VMvmGYtEoYsnkF2Mavg4vlcbl8giF5mY6nAtRc9CvP4qvN7envfkEqWTIY0+WtcPfIu7Lq4D86GFJBydxs7x+zjrtMI6fna6DRiNQjFKkGPzGMScPMFBdNqjF/WSut/zsBEwXLqmOjLg5t2QVV6A3fOEAU3x4Wc8K2QppWak9v4s2h0JpXXHszBc2+m4VCqO0Vo3YCjdiNg5vQmnO26nWpK6/DIBwm43CHKWnIGqLhJiULnBtEoiZsYtXEqLGz1oto+N1pZbE3G70XxtPRmqNELZPnz0Vh04yp23VxCizdMAme1bTBaMoKdMveheE0/zXJJxUNGavBpIBqaTkqh06JaLItRgPdv//DJ5YPksHELGa7tp5mtJ/CuwH0ojyqFS8MSsGiGO6hE28CcOBdsPXUUzukM8D/b+bzIswJ1P2Sy14xzkOjoDKJtovjjqQ28XSULj74G4cyVIpzuH84lA29B99x5LMw6BEFdiWiuF84yDxEeuWfxPvundG9OGEicZ3g29iXcFDeCbUV5HGoTwLvHf0RjDxGo7ZaH0JiZGBL0kT1LGojyWtm0/SG9XXYZaiz/Qfz+HdhnYQ7+33eiTeIBPnc9m+b2lGCjqCbC+DYo9XxELz0Jir3S4Xa4JsSNaIX7C6fz3GpzyDAJo4Y9uyBxnBpW3AqHBiV5vGU6gcOaJsD7nXVwPbyBW/Y4QfzyAu753swrjqTRVfd6KPyzGddFTOfwHlG4VSaM6gdGQcIjB0qIb+Wrlo08VlYcVtjbcGXEProxopwTRpqCeZQv2AWdogdTzrOekw+7K/SB9Z1dYJmVgZ4mbaBz+hWWPbeBmuEpUCC1BZLP74HoX03UckWdKtxccfP4fDranUjb8q3x1S6E22c8wX/cMB4WKoNLoTJ8tsSCE1dPxKt5GVTaMwHDFhxh789mkOkmz4FdieChdYo7Er+Bdk4E/JcHFGL2EW57HmbXqm98Z4QC1K2LRI/2UtLovoTB31vh0lQHDHBNIE8ZfT7geJziw39jW5MRrBAZRaY//6Hk1y24zf0fbn19inIKH+K5OE2o1TUiI7tcHjkoBYkFUXQj1gnPKOvzC//3oFe5B3RE4tDzhSPvDnyBdfERkKynB9LZ63CaszgsmK0Cb7d/Q5GIEjhwbA7pxT/lX8M3SfyWPpokCUNCRzPkVKjiFz0tzijIpWZJZ9oePYf6tbM47ogAXV2njtbHlaGww4+S5edg+q57dCvrKdawLzXdLADjlyK8Y10c3in/SRdcTCCy7TB7K2ty2pVo2j9dGWcffgy2u+4iy/biAtlS3mrdzlNFBGHdovt8ZnwfmPu0I9VuJa97zjh8owpumJtR1OsO7LtVxj4Z06BySBkNXGfx0QllrB7djX/mFfOsFmssWbiQ8wNUSchfh4qGVKDcXBt/yXqB+OdDWJJ6jpSfqGO23FHw3hsOe5ePwZqayTh5nQ5sM/VEV/NllOtfR0scj0LKvRoM6tWkE1vPw7/NhvBKeBrvl9eDqNZtRDkz8FD3PTjWMwuiVJ5hu/YY8pk9GaRU7eBb6B7QXj0ONjz9iyqqW3h4pzql2bSQbU0ZRlsrw92nnXzyWgYoTJwGBiPlQCfCjGfOeMuGzcasanmLrq6IBPv9wvQ3WIejlznShPN/eFhRBCJd1vBZQ4bk936cs/A4tK04T2/PibFKaQ4OLNpOv3IHWGT0GLBcI8vnNwxBqE009R8wYcm+btC/Uog9H/uw0SCLPp54hXUWU0FQ8x2n3sinvvX+pPSynuab/qXV92/jpxuaIC7ozNFNO0H/hRTcDf4P3pUWoo9FD3S1xVDIH23SPyFMnsXX6cYHSUiYO55mtorAaL9cNLr7mjYWtVKqTCQOjc+j0Yp76NB9I7i56SeOl9ODz3IGYBWYjPq4hgud/ThLrQID70Vg2I8geqYaTnu3eaLGnjjcfM8IRphvp7pCDYjoj2ML1zHYU7oPO28/4b8wDiOOP6c1jwbRv1IPtP7Lo8bce3RM+DUXho6CU4uFKeqZOEWExVJBmBC+KH9Fujkq8BktoUapkVd8NaZom1bAQ02spz0IzeeW0LpkTUj5aUUlb21gQNCLIneNYN/gKZSpEs+KjW787EoKF28ZxRaTXnKQQiOdltUFt9ozMOJLD0e1j6dnBkR7n9XT1upgHOGJtKCymbwtJOH6REXQzIgklTJHPl00CZYesufLnv/o9JdrmFc8hiUHBnnVZj9sLhsD99+sgj8751PIDFd2DDnEeRb6FLvNiN5V1/BHEzFWyYiGneMt4LbJcfx+xATErMNoZ3ETaAULwu5PDhD+6x/cmpXFBpsmUeZaK1hg+RduaQ7yxRQ7rnzsCYenFWBBmg+aXD9LG3220mKbV7C0exooFKzCrPA8uqM0Bg+kq+Ff2Xi2FhJjlzGZZL7Ikxct64KKBD2YpjeAQT1xfLJgOsTf9mUnw1w6cS6XwytSYQSNYt0Jhewkpwuio57i/vRcEOh3wGuaxuwXZsUhukRoeQOu/j7KroLFtPquCaR1dsD6Yyk4bjuwZMQZCvZw4MJMOyieHIIZn1ajjcgIFEkXhooQpDHai0j8sjBnWCrzXnDEn02TMLYkm37vTIG22A64hBPApmAZ7jXOBtPnM0lk1Q9+0rCIL752o+IJD2nlMwPedv0FhwRoQOR/+nyssxPDjaPoXIMebh/woalrXXGM9SrI1flJlb+NqFBwEgSGNeDuIDXWyCjCVQ3vSHxhJ0zVfcRFuw/yNaUcbCsWhGseBrCt6xsfob14bZE0znGahGVTi3ik03E6BJvZRa8KU0dFwCRldegWl4SFOk/xrJs2NJ4/wtmHFpCwNcLMl9dp6h89DjNJ5XQfZSgvrkGV4HI40DKfH34wwSv720kBP0Nl8CQ6r/sPGx+k06wiUXgco0nfRMLo7LzPMGQxEZQDrHF+92W44uQM5pO92Dz9OKzuZPi5vQU+bBPl1ZnncX7KLaht28yV0cvp4YRR1L1blkSshAAdBCD/9hIo3NHPM8NUyLcmny/deYppFgm82DKSH69KZBtLcfSKHAFhi35TsVg/25mch/g0cQi+dhXfnfXnzMu7qFP9JtXckwdpeYSajcHwStEDvr1cQcESGpxceZhbPTTx4kQpmjzPCb98mwjXxMXhTuo1Gvq0hiyfKEL52XkgcC4Ja2e+42W7ZWmvlQHH59WiSb0oLDt8hcp19tP3CVZw5pkqGDyqQ/f9lqh1txYWJw1z/5HpoCQ5Dp6u+wDC13OptWcuPH9+A88W/OHfq8NIkHWps6ONbk5/RDcSzcFdspxn15vir6xt2C4yhD/n25PjJRd+qWqANhk+LKOtwR+DjcBUVIteV0ugQJsih57zZq3FziBc85j3ihyAFRpX6PWLNKqYbgpe/4aorMwZL0Q4w9x6E8if5cq+ZifpjEYAXjx4CMV+lgKvGQdZ6yLw0F09TFHo4OHhYGx0EgbFKQn8c4QXPmy2oBaNVDJtUYfgCx+4zNgJdxksZPh7h8t7n1DniSbUWHySbt9OweuhDeAQIgVeH2IgUSEblrzZzZvF99KFMn928mmneXEuXF8zGryXZ+Nhz8nwdp8OetScg1Wz5tJTP3N+Nf0M5HaXcc3YTt5ZcxWvqMWR8i5r+NHnSBW5K1F9ihlpClxg76+h/O7TbLq73J4UzcpwjNsZWl6nCMc7teGb+V2wHLhMh6cl0Mm0RtqpHUOGIy/ArcBEqvPez5eWaEDwwBt8k7Odp74ZDW+nN3Gh0R5uUjcgB0dxlKj/Dya6uEGNzxSIt9Mn4/uL8X1gMgzU2nGKcCBlO2bBqDk6vMfLDFXFkqFCQQ6uyMri9pATeMyljX88OY8J2U/oheJmOHH1Llw3msSWJ/OgKX4KUGM2vy6NYZ/DnezWshgjxqSDl1QNxMz5S0JvSsA+fRl4KivCzehOPu53D9Or6vHlaFOMYEdsHyuJlVOTaChUChJGy6JOlwoUz02kw94B9GWeASTv2YtSKyUxumEKb8+aTo3FfhwpUcY6Y3RBK3QjfYpJRIeVb6DhrBbEuWwHa6cKVt1aB1cTfpD9GWnSnq0Ozy1L2C3AlPbqIu21/QEWkTY0sFmQ37szaa0t5fqxX6jCywwWjNpMf3b+wsY5RH9uX6CLo/ZCpv1tuD7qMc++boLd8Zfx+V9lKNroDA7Z3ajSkwD+i0dBXI8KSB1Mx/pp83ld/zmWMzvB0/sMYMwIXRB1EsFnKjL4vCuU70nuQNNRpnhU4yTFHLzC42ZIUUjfOPAfnsLeD1qIjq/B86mC3PUsn+PWKGD4mm6aeXUeartV06edpjDyxlT4dzkD9+b9oZStuuDTsZEfXVxOVVETQKfcEAJjv8NIhSnwq7QfGvfv4tELxuK04G+8YhJi23gpEH8VhK/0svFz2jTIF7CAee6rUH/bTbBfNB88lTpI/2Qfp3gJQ2q/OujeuMWKZzfAZ3GCsrI1rPJMgab8NcVZ4QpYF7+B2p3XQfAWTTZ0Q37xYRlqG0yGCbLV2Gn2jNtMNnKPvzfoxe9FnWFxOmIYQt57qsnCUAq07CfAb2sVWr11Md4a+sPvW29CwOXd/OPRWKhTO0X5cIPEdNVQ6qIerJ37gY6+vMN6Bd9A6rgUqpx6DHYNX/lh5yUYWRQEV9TjYeQkhFO+vejhRbyhpooX/JDiPYHveHpaLJwvsiBT05P8zksZSmVHgZOFLvXucaBETSs4+FOZDy4k1PlhTNH7hkHioif55reS/HpJiHy8DlcvWMf/FqzjlGsZVGsejFu8ReH7kn8kbvcbtKaPgudy6vBPbD0Eap5m26e1qJGE0FyOPMNAk6WrOig1Sgab1gfxa0tFmHEuGcT0N5Lou000uzWQTmxv5ciLWizp/xkd1D/RkUFdcAqaAt+fnKPCJ/n4QKqRN3yzAPGF4ng0ajtbrD1AjVGLsClwH/n+mQCzizJpwF4bRDptaPm/VNT1VEbvZ8EQ/38EwAdACAgUANA/SmnRVFKaooVKO6koGrRLkcwKURJCkZLKFommrBCpSCiiSUnJiYrMIhkNMnNv0j82uK3DUpGTMbDaEjK/3cUvNU9xf5Efte7q5cQ/L/Hvu/9oSZ0/9O7/ifNcelGl3xxKyq2go6iVqpuns8jWC7izaCnlOGyB3BpF6DsqCW71c7m9CWHX6nj++PIqNiYWgkvuU2ydL0pPF5ziiP3dSG+fkoisHpvoAMQufAXVmsmQH2PFomLvMW38WMi9GEHuFrLwo2grxxl3QORhNVis1EkNJQ7s3LCXryfNYtNywHMfX2Bt3hqaqfOJj9wfQ/vsR0CjQgmu/h3KgiY+/P57GN1pH8C8iwMooRyPx/4IUKqEO8mJC8DC+b6k4PqAVl1+xNr1y9ERVqJTrxD2lgbBn/kTSUt/LJk/F4D1i+LQr0uI191UIH3DERAmoMNxAuux8+UvGqOUheMXFOPhubKwwG4JtKu4wvP17XRn63w8c+UhZ5Xv5JmGt8HPpAuW9u/lQ7/GwlNlMUqWPcIPs91JvW8QZXQXQ4jIH5jl+ojPS46GLz6H4EeGNJgtuQ53vt6nYkdxnD36MQYqzGb7z0j1+YYQeNsCjm77A9HfR8MsxZ/kJe4JOglroUNeld9qXEDN+0+5p9uNM5PWkoH1Ih5TNwrw+FuoHi6h+37vwUHmIUb2OdA1eQMQEXrGtS8PUb66CGXdE4PxuYq0asE8+DeQxLdHt8P+yf/Adt15OPznNVjWG4Dk6YUQvkoSXt/zQsPOmaD9y4b623WhVkcHFd+dA5kUBTqXrEiq2bowJnEyuEbE0oUQP3jkK8bP6yex5yhXyEz+QOJtd1EvtB3ceyuheZwyVHtlw7lKI3JMDOUbTbdg27lEfOd3EwrWavPD92Op6skU+tysC1YT48Dv53XO+iIGa13lqODCW6p9mYFU3kJ7JdJZXOMER6TrwyKDL6D94BBJeSyntzcy8F+jBf76UAQRHfOgrsmWOv5loeNsWbjwUwFmzQznuMuJNLlLmW+7B0CukTUPLh+B858UsK9cJA3dUoKo2y3wUPkrHN1xB7XiTNl8vRL+ce3kTxdEaKHHfv584wWvFZcFQ81FsLj+DGdVj0ZvqTN496AoX97rzq8+NXKltwvIrF4CVjf04FP/F1had4Y9tQrA/VY2n7oVDjKmSH3m62DbgQMQEfKPp9+ZDvRfD4V47sPF8sd5Ordj9SIvWnjkI+1wW8rLw4Uw4tt8GjVRDEadXsRq3Qv5p3okDO4fjZmGRnjIKJ1Pe63G+aLK9Fa4B+ewMCx9bE1qGTbcUyAGDaL1tO6IHC3xryHtsRPw/G41MHwSS2/TjMEyoB/02jeD7Y7nUJJ4hF6/2A0eXEQXbDJYxS8OvPJbeIOuDjSvvksOXc7Y5rUUp/2WoqoiYQi3q6Wwy3ZUeOkFWfwUhHWztUDk7D4sTdnIJ1+NxZvUihFv/6P4P1bcsK8fRm4cZE/hTnTzUgB1h3tsJXSZPv46SkvWLkTt/ffI4083qYvb0lD0XtLJNYagai3Ys3ctXXh8mINFokBj5QCY/XLFjklrIHikPHiZbEH78Gqy6RaFDW2zOTi+F/XkhlDgpREOqS+mEx63Yd6VSXB74D5LvHtBCmdl4UfqOjDKfYwOObd46nIx8IvzI7lAVao3vY8vjo7GaZtm8/e708Gh8SnZS6lC2uZVcLp1CiXrSuCmhyd4x9gEuuZfzsER9hz2SQBmyAXS1wB33uySAKRvwsaNOrTVl6nspBuczP9Ij4wq4Ey0FZy8UUHvJmbi16OVnN/5l8tuStK95hdkHzeDskqzeIXCAXywRRCqNkxnj2En7CupA0ebhyCXV0HTtAIgNWQWHXU34cjimZCdKAdCqvVUolEAXKXO+a0T4YD0eJ5UV0Ylk4MRl65hx5MCvDpfBbLLd5H/Wmt6afoB9nql4e09C6jqbRnnnnJDwX/fIGZjJMxdLQwTpmSx4MiV8NvpOsi/yYMmo3G8WUqPk4I8uG2oE0UFNtNIA20Y45JB/b1ZoBZwAK++zyU4q4VOzbNZXieX/8ScYdO4eNzwTwsuq04ExSP3oeuFN85ZN4UdKgA+/SjkDps+/C8vGLf//spWxZLw4YkWjXN6xzXnc1B74SyyP2JOu7YmUU9FPnVsmkXxV2Qx28YKqgyTYOagOMesX0Zlvq5Y++EU5PrPIPNTJ+BH0ioc9S6H9Wv04aHWLvbIKwH/H4F4t2c/JwZmovl/2zF4qzTWLbrJq/amo5KkCpS759Po6nF0+Ew37dowxIEBZWxEISD4fS53rpCgNIskWhkkAAJOjbg9PJHzRsxlly8uNDXQFcpvKPNXa0saeVITTippomieBMTeaoKdxX9wZpkcViU18aauSTzeqQmtrYb42qOx0JqZg6fbJMFiYTwFdYpgwKY2ls37iLXS1Wx/7iA2eqpDoJc9XLqUQnGlpuD/7z5IF+ujkOowvKmYiZJiSlRrtwW2/fcXajWu80NxE/pwQAX0DZUJX4vRhxQ1TIrIAFnwpjcu6fwoIZ6czezg4MYb+OqoBjQ+awXDY02oODmNJtyq5c0mI8m4x5QWC0lRRIASuAZ4k+0DYYjXSqDnPyrwQf0ier91NDd4acLieSo4R1KPPJbNpE2f1/BKHSkIz5FDs/YkqL72B79ItYHK0kq+N7qfJpwWwLB1a3mr7w1aNGwC+5p2YtL2iRRxeDOaJ9Sz6sNc2LvIiFYUrSfDcQiDWj+467UGFEybQaX3ynli33YYsXUqSu/6icI5Mij/KA4zXb+hrYYWPdAThUMqzuT43YG/3H9IUUNjSOXlV/zPYTmmlYRyvs0wuRzvgS1DitBQtRmq1kyDptIP5KX+gy2uiMAowx4orbCC6pSr9NW7m45ESMC5cXfgh8JjKrihT2/j91G2QhwVVZ9Bs8gubLC054Vxk1kmVhDixJLxni7xT+kumiYbDPoGH0Dw5khsNmygZbUHaU1aMS3KEIHzVxp4whVH3J6YCPLXK7loeyHnilez0asXJL2vGM7fZ87dbAxLHhlS9fqv9DB1BevtewJznt5GlwWrcKfaMsitugr3Nco5crwCxFWsgDnrPlLRlqv0SdoJ5irc5OtpLRScU8ymkQHsVzUPPorKQUOyBs3WLGJbv72YUTsSyOYONUun89ilmtxy4xuXp8xnfx8TEBBaDU51+Xjm+zW48cuPCqtF+UbSL06QW4peF29ytoUVOh+YAF4Vq3HDQ0Ewu7KUTeoN6fHjD+gUfhACj/6F2rZseHymiq/MmgDHlk5Cv2RXfPGrhQ3MRCFb/zGd+eZHRv9ZYq57FItgLMapWQE0ZGO9kTA8f/CQE6ab4uR4caqf4wRbh1by3tIzpJKpCdHh02BFpgobLZtKeyTeYt3maOy3XU8PjrXBnQlzeMJwMGP7IUiMmAhntybT2okfMP/JZk6YIYtzXz3jOBSH4wE9dMJPg4Jv+8GlAB3I37cGRhxshhv62jhHvQ8NYw7RSm0NUnCV5PsbKzCtRAuj3grAH2FdfuywlLOjjWHo0mMu6Msn160xbFl+H6e+jkTlZhVMvysMedtM4ZR1Hs2qXwHGxY7sswZwgehzWulzBVJe+0JwRQGmfDGDj+afIPNDAm/4lwr9W//C3vIwfhUeiK0f8vFQfShu6NDm5gIT8BcXop6q5WRjv4VO5fuh0dRJvHOBLX9OPMX6mlvB2/UBiahYgrWgBa9oX45RWVZUHiZPUniIBsxGoFHMD/zxPAS7/Px4h6g4XG95ht2T1ej9hjncssIZfQpFwGtZDYg+PciCmtd5THowOcTKwKZ5q1n9kiVVP6vG+PMN1HdOilUOK5JKiDVlh1Sy4M9PlCk+GSL276fCKTfgTlsC/Pn0Ci//QLRYH0wBs72pS/YBnpJOwns+xtD7xoun3fyBfmGe9NV7GdwanEnB17/x3qPzMWpKNtgm1lKanAREm8egY+cQLjYSBOeRpRBy4COef+PKkWFGcCMhAY8IjqX+RyNgTkwublgfxQsdb5HjtR/cPLcUtm3R4Amqy1Gwdiy7nNXB7ZcVoN9yNk4zWItPjrrzuiNbWMhkNAd3bsRXZhfg29fv8ClFEYYcdEFX4xcXnvZk0QJlUE5cxY1TRuOrolE0w/oq9eaH4XeLGk51Hwe3N32mQk9brnb8zGtGErx5MhKCz5TSWfvJsHPND4oc+Ypn/ZIGRxtN6P1dTJHTJWh0SQce7wilENfJUHzmNP19MRt6BLSgON4S3IdFIDW+FDSVT9OXW0Wc82ka+xdsxUejZLl19S0q910Krq/MwNMrA3KD4/HDFSMyKDLnDwJrMOF7AbxMX0e3oxtx9IQ11DJJFjzX+eOOzcxa03/A02nnqC7yKsmFrmTDgEn4e0sSGJ6sxwqRcZC57yBfWnyYWttccH1FBY1tHMaRh0bBvw+H4M+KIbiOkZznIgv2otWkoSlJ4bWfoD1Gh3p2FNOtkjvUFhOMm8kNZ28wxsMlclCd7oHT9GKhe9RBvCdZBkFVfzjo+xu0Hf2Pb45QZuOWwxAiOwJu12yEEv85VCQvwPKNR3HTny3QmlnDIydMh1TTIGyjGDTO0wd86M17norARLlUtFggRGJHWtDW0B9Oab0l05kNNLA7AC7cNIB3W3QoDGZgUfc0fGRtzwGDG2nEkfPoXP6ZS9skMVf0Jz5aJQ5xuzxge+ZjunHEGM6cGQc/eqJxT+tLMI2dQClPf2DaOjFUtxwPoVnTwelfD866t5aCxQ5B/jpnnnrUmHTvLUDx1qkkOM6Cu6NkoEj0CzcJX8PgojKui38EydfOwYo5U6ExpBomH9Xm6c9Pw4stehAW1MyPg3T5svBxXBVSjuPl9qPisjVcOsKIku8mwtaWTfy60RQcfhvR3wVm5H7mECQemstp5hZUck0I5PwesIr5KDqJdSSeJguO62rwZeYVNhO0hhvHruMI8Th8MwswZ8wEWlS1izwP1lNjnjDoK4djf9tFOGu8np3jNGlZhAzJvzRFVE4nSx6JsVlhdLZ5FOi3KZHIaXnYFbGQq/tPk9gkewzrusOTdDbzV/mvKNSjTuU98nApuJ/G7n4C21ZWo9zD/fSIhHjPr3/4ZPk/MLWWhEzd47TEThJWyKthnfg4fGQ9k2w9j+Aa8zZ0XCnB2qcl+E7vWny+T4Dak8VgSKCERyXJo+a8el49zRUloh7hfTFhmt/gintPP+AZb3bDrW8Iz0P/4KDHGdiVf5xPXGjj7uw/aL11LUtk/IQVan6Yu9IK9ArlIHNVIKs9VSPzzGMo2a3PIxc54wosAe/FtRxaE4r7trvBvlvKMLqRYJ6IBbXFzIIet42gcXUhX/6vjBy6NtLdeVrw92Qw3opg+Ceohkob3OCo6nka7VNHAuMjcEptEZYKDaK64yxwfnMArVgewgza0NrSARKXf2ffSEM4FV3Om4t/c8hnL16mMYeSVjfi+SMMdnsOU6jMSFr2poFqTWx47xRfbO2bhW2uOuz4ez+HiEXw1XYBeGRaBOXHd+B28SDSzwvh5u0HYEByJifYj2KXxtmcnrMHZpkLQZ3iBXx/f4DH/r4Hoza0s+TxMtRxz8GWgUxoCb7H5iOFuLdYEWr7S3j8M2GMzv1HC67EYIT2B3j79y7uzBaka3fU2HVSPz3/OR2yCgC8Sp/yigeCNGwXQ0/1D9G7Hds5Iz0Z/gYuxuWp39lnrhjIKa0B2whn7LLMxGl+i0HiRz5pVRpxtkEmztuaRg2flcH+lhjMLM7kFIkfdGzpJhacvRFW5gug+MgC8DTWYWerONqo+YArQB6EtW6S8vtz+LrHnWLK37Or0WiyONeD8drPWGm8A5fdzYB7Tfqg5aDM22dmk9N9OZzkPUBXP8hRj+55agr/xQ1+6XTd2Y5nWIlC1Y9W/Fs5CkuvD7Kg01MK22ZDsUu+gvCpN1By0JPDLjpjnPhU2JQdQv1Xe9H5bxjLbVgPE/4lQMWBydA29hx/n5JOFvuC0VLaBJ5dX89p0r6EvTd53/x2tnn8kPzOlrKg4gHS7ujiqzNfspbhWJg6JwZGj+nB0unD3GNwG+/NW0s7ldfyxbCXdHBzGO6sVWKXc6MgvEkH9hcpQ/OMXPQdM8R/Fm3l5IfCoF6bQAlxS2msqBSrZ1nCu9n5OGmCDD7uMOb50x3ZYNVnTJ6STuNeHeCbPX5U0fWR0l5ZgdiW59BxQ4r+HvKAAxK7aJ3GCDgdlEx5M07hT/UmvKh4Eq6JicJw7xZcYh1Cj65Jw4WnYzHIfw6JHcrjI8+YvjwUx3wdL44/PgX2eRZBb50NDb5bghYxC/lo+mls82c0VdfHlLtpmCvyEoajFeDgSlWy+JeH8tIB+Lx7JPpMqGP0e0yq0f9hQcwVNn8hDZoZwqDSoASSoia047IrXOiwhEnjdDlvvQacWOeJB7JfsHfrM9jdPxnSln6B5HFvsHPXWPQe1GafI4owPK6UTDYs4ycuj+B0yFNo2DYRdN5KQ9eEJFwt8Y3l/qnDT7VWPKn3FDMlMvDtdGm2qu+F09oC0LtCDIUDInifwCv+6yRMB2ar4uayYhK5bUXSbZ/ohlE+ZshPAfvJ2RSn6IofdurAXo9ffHnQmb81LoG4ggNs/usgvxyQRu+JYlDk+IMm/NvFQ0l/yOMKoJDjNvx6OBP3eo7B06NusVrZQzZbNgpeTsiBGv0cDNs+BuxuzQOb10vYrsYMBv51wuChflrmMAWr7BWhKuEZXdaaB+s3KUO94AxqdosijW2+oOA5SLoGO7AzvpsqEuUgabYEbE9VZa3vZzgiMoRukjFsaIwGW5XdvKtBBktWduOqqcLQWlJNC0JvcOSk75wZaQW3vwMPRWRwxfQmzsrzw5wdcqylOhlWNJfTF7NyDE0QI9WvSqhYcxdtbexh1u1OPP9wFvor9XNjpS5EHr4EIcrupLZyAg2+dcYUu4lY3xsOCelBtCX8KQu7P8CueRZg0ShGC6/EM9qk0vuuWNIyMcYjB2s5KaQJ/+sIh+1Cz3DwowlUHOiF7+JOcI6uwcL55zlxfSzIn2jBO2dMoK+lm2MmatHwTjVwTm1GvS1XeQDDULTpNbX5z6Zd0vPh4vOdsMr0CRalfIPVR6zh9J5bLL7mHu2dexBqeu+T3BsPMqtahu2xIzh+uyk7f71GcmAFi870Y33xYnr/bzJbYzWXS//mQxBAfwqW4aJrn9hxbCT7qqmBXXYPR/25hkNZ9pDa2QrL8Sy6PSuFzFdikBj1lA6I3MD6HVoQEP8aGo55Y9HSEIT3BpBs7A6bj3mQbYgZ9659AW1pHvD6mgG0+13B4UmxtNyzllzHn4fP001QPHE5ux92BxFzHxDv6oIBS0v4bXoWtr8d4qD6D+SgGcgrM05ixuL3BEnh/MxcAdLXhpN/pgEc3uaInslbQN6uBCNyV6G7Thp6Fv8FtWdW5FxHIHmjhM7bycLjd/eoIHeI95Q60xOtS4BicyniwkcUK9vGOonrUY5j8L8iPWi7PxZobTqnHdeBBJ8YUGj/SmNGzoXdJ2eBlcsvPFu8CAdOjAQFmoC/Szpg9FwXeix3khy//eRd3oVsuiSPS6plYMfDCmhlPegTqyb3PaLcPqQEs7Qvwx3fS+SZmsKFZ/9xVYYb33jixK3XLMBu5ySer7yX5aqSOONAFFXPjaPoaR/J+FIzZh2QY92UEO6XnQKbYsfA5uNe0BMSwc99uvmThCOczw5Cs9o2Umj7QguzuzEOdGFD/EwY1x5NZ46f43SLh/C7awSL/9qHz/NKMGrLfpB89RM1jstD58r7fPqxI3UeP0lzTk6huH4ZalQtwp8LY3CJqQuZfZLAgPVWUKWRSp/LYlDsXg+fFnqG5bJLeeupnVitswAF4CZsn38Z1y3ShCsdbfyktAZqagZp7jVnchocQfPG3cedq8Jokvdf/FsehC/7hWFHrC1MdLHFCBcRCuzzwFP1DPfWz4KIAURPiZ38216JLfaNg4j+HLK7oIB6CfLUsdmP3x2Wp1tmhwktZnJ6+i8eud4UdqRKgqbDV5zW8pm9dZ5x0KLZ1K90BY2yDpL8h9PcOSWNBgU+c9YLfbjaPg5nOtbQOo2PONHyHsz2bYAOdaCqiFCOV5pLx7K/U7W+NkSiFkaOtcGaV+tA4PAYNHTXh7Uqmth47iWEPfQACpMhm6tT4UnOf7R8rRt9fWsKEgnJ7CdbSwe7klBkYRe+XOvCHpfiKWixDERuboDPTUG8I1MQE6wEebDBkizvN7H95F7+WnwHjgldwLYKfVhieR0aB3L5ztxbuFLPFxetSsMNz2M51NcPeIQgWnrXoF+vAWR1FODlc1K0c0U4PDJrQSUBBxIf1Ue2k1v4nv8xbF4kAY9XGkGUjBEaBzzhS48+o1dTDkpNGwEaSqakNxzMV9W8adfhSTQ53AB68AC35hjw4J3ftK4qg6L0f/BErqCVB9fAuXktKPCUechAAJwf+dMp7QDyse/ARxp7cbdYG9Q6f+TtKrJkKnCQX1XWUc9ONdjtV0uaN35AbHolrzYJR880S574oIaMNI2g+bECdLVn4DRFQfCpU4QHMxfQsfGToaU3jNeGLAIjARnWLltANztd6OzupbR2WAycTafi8uQrKNE8G9uX7OYrt//jFiM7zNL24cG/QWS/8RfZrBeCT9fGcN+cE7xqwJckju+AlJornKPbDp4zv+Foj7+wLmkmTNhoCMs1zqNK8gmUwh7acVAMOreowbt1TMUPbCBPNY1U5Ifw0FQh+Pd8HC2aoQRyPVMpb+Up8F6SD1PXtYJJgCJefv0d5Wef4wwrAXg+fQkaaewg+BsLss43QXCkHqyaepCeez+CsOFRlPXmDriHjoGI18JQefknhp0whpjUXvY1G2T+WEdSsqnwxfsKcu12+iiiBrFXd7GDxQIWl7XkprhE+np3Bde5vYWgyl7uSK3jb9GGfKfOGjbpbsC029awYLoUKDXew8gTVqiw8C8tCp6Oq3/tBzfxMkx3lIau3ZV8s8ub8guj4fdydXQxkcOVtWaom9HE//y2UXeVD3VKmcOwjwl9a+nmSYc/QpeBHKRLefHH+x5smrAHg/ecAueiE5hSMQYsd3fx+ihr0pmZSGKNS2GjhSx6jlzDH74I4JC7Kq455cOmY+ThqlQ30r8Qcm/wYJcFwcjCbuT5ygLmlHlg/cPLmKKkhCrzJkBu5Xi6eVqQJse30WjUY3H7ApSI+onT5QvJ5PRhuOnA5J2oCmMKdwC0G2Ca/yC45UmyWsNaLLgO1H16DCxU1EP/iA+8+9U4eJO9mrp/dJF3qQ17r50K89Ur4a10NDX8MoOlX46g1s9M+CkEEO3iw8K/XuBllVOQ7vwcfu/I5ScpI/mlXTyttBOGqEsuoKY4DSa+3gDzRxZDu48AL1yeCGl1KlgRuJ5lY+fiXaUSnu99D6s1dCE7fhK79GvDnQV/ecy4GfByqjHf2hzIY833QE5pOnnZ2rNXEIN09w28t3g0mo19BK9uBZDWvExKlRIGj8VZWPg4m3WFTtPaIhPoPH+SBFakYPu8G6jz4hLtXSTETyTmoeUKbfogdImUOorQIGgStN3JxTWO0birYAMn1Oqgz6lWygoQZEr2ovgX/uS2LBEFl+jBzJQgCjg8CzIzIrl4/GPumnUGjcdVQplTCmwzPoIeecGwIkgPVJ450cbKSH4YKQ1Ki6fQHF6L1g1uNHdqDg+NaiTh/3aRf6omvD1wlMokr8KFwmaYsHkCZu4qoL/Se0hzoQ0Z7rpMc+9MoMJ1FnAuyJruKD/BnKv1FGgbwuErJ9GRjlimbaJ8s04PPBPjKKTYCNy2SzOHniH/dGOeUfuF7Gy/UnRvK373OsgrlP5jg4lbyCRdA3TU92GJ2m7c8eAr3QttYfcsR5RvDwaZpQk81KvKU7zUYXbQZNio8oUPlsaRtvpnvpJ1kDRS18L9H+LwofEs7SjSY4Uf52nM3VEwX8ODZk/ZxsKHttAnu3j+7d4I3QelqMkqBJW9X1JCoB2+e2gJXYL9XFyVCOtjo3nxkSm0ZMM/ljtynqesKeT7DoV480gnHAozgT0j7oLt3QQ40z+PTD2fk/zBEOp5/5JPP7hPl5x7YLTiYTQ9OQ1KN8tzqZEjTtqDECrTg8WzBUnCPhBN68xw1fostFF/hw+dVUAiT5oaSkrhle5uUnvyH5ZttcVLTvVwtnIXarwFsLDoY89chENtNXj2ziM+9XI5i0e9pX7xOyxcDXR9cw5oC9vyhvZQ+KoyCTru6dOEU8dxNfxDja17+EvHYfp77QGwbBJ8WL6Itp2ZjeGvRsD21mV0tnQxnLWdhQOpRVhR8JFz85zoVpsQxnSN47mZoyBHTxNaa17zho/WfPH6VNo7eTkXdY3EW6FppLTtHlU9iINPd8XY3ssE7FpvQH2sLaxs2Ior1r7CBT9/wbiqVbypcivuHxnM7zY4UNhmRSg1v0FWzVfgr2Ujeq42wVmdnfC1Zj7Yjx8Gx+9G4O6kCqUrzGD39Qg690Ea3ddncfNRBdpZXcMa+SegQOYZ3I4NxTlb17NbsiSMFOiiRF9T3HBXmFLmTsPArNOw0OIOiBZ85rLAj+CZYMPyj6TgUugAx7s6s5DuFdq84iqfEa/CB8cec1v+YVTZqwZbcpbxi1PSkL2sDV20DkBlvTmuzF9Dn6VvwWUhFypsy+WpP+exnYYd901Uh5srluN/Rn3kjwexYOJ7pqZgPLa8B53e3gOZzhr67iTMVbrjwHW1LOz7uIyyruxh31tvqPHeedpUsY9Eutx5iossuiz8yxuWS0CM/DGsWrMVJvgOcsvrHFq8fRns2TSTCzvykRe0oEO/By4pEIaqK/v5xwZnljXNQNXNTtR1YgNN8NhNt+b8JO9nm2jldm0wTZ4OY2uTaWa6PA5tmENnNS+yuWgz9/dawfEvmqBYDLQ79jxtXz8CxvfpU137YRzOmUeLKwThlekaPPp2GaS0rCO5rnX4zGUnDP41hRE/N9PKggi+f+YUGVQcpQkRcjim8gqb5q3B9IpUeHO9Fk7vkgb1OyY0s3cCxfl7kv3tUBQb9wFPOFrShiXPSTKrDARrkklyqz7M+zCDfqgug5CYY7Tw8nHalfKAXauXgEJVD7V8swPLRTbo76kBx9ymc2hyFrpo70E9oS+gVnkOv0XuptAZb8FmlhQ8C6mjFl8h+P5uPI1ekQjj/9Vhp3MlLLC7xlcDerh54354NXMu1952ILnD6hD1pxvyHgiCKZzkST+3gPnPcPLM2Yk1aeJ449l6mrL3FU+YOhFE0zxJzMCNKveWQXFVHrR4d4OobRl1Rr+CXbYz8JrjcfgyRwwcbunz4aZu8LjpjL+eGbOh8iwoWhkAbWpuRDe+kYpUOg3lmIO7uiiEPw7gq1/XcOFeFxy/ehE4qDvQQOEmvNORAHfnPWdrc3M47r4KzApWktDdBhr9eSWILjUCl/CNNLosmuoyWiAtQhLo6WRIEMjCk9PM6fPR6fzobzBXOymyRuN7LosayS+UBmmq8iEM2mgAeG8nr4uII5HMTtjxIgG2HSjEdbqF/Nw6madcFOT7G9/A6iptiPjzmiPOjqAF65dTlXwTBy4tptTjHVRqeIkHzgaxwwk1uHtfEK7ffcaWv/6j3IFFPClRAAd1gVZMCIA46Yt4bP0wjyEtSA+eCuWVw/x3ZwR+MTSBHm9PTqxJZ7ltG9mqyYmjk8Pobb4JTujXAdFpUZAlMAF9lknTuR1rqUN4Nf6tLsJxXQ2Uc7wSdS2fsrCAFFQqK1HElgrUtsrjOZJp/Hgh4zzvdnqfPhJvOl6GKHMVODQwHt5figTxWYX478lUrgozYt1sdb79PZF/vDzBvfWz6L6zA/ub6cH2eVfxltNYCF7cxmurSmllgSU/zpiHj50C4Le5DRn9MYHvuxTA/0EutI8qQiXhd7zT4ABIl88GxQhhCPTZTXfX/cTQizMxqVMOZKq/89c5GnAttZXiKzIgcK4e/l14EzfMS+EXvy7CcbF4Cn01DVYOL4d1LY/Yd7EN2hT38AJFA0BPOy4XOES/9+2E12klvHjvJDgeMh3mpnhDR0E9mG+MgxvhmfRCQRHMll4i4daVGNu0jYUui8Bdn+kQ+8QP2we/0nSfKD6SbMv7DRO5Iy+Ax2VNxVUnN0HGQSmIqS3ksvM+eKw5ka/O9QMBjT+g/GIJt66cReZhx/lq2n68dUIX2hNmg5xCARQ22/Oe8iau2FEOVte2gPYtCzgwywGMxUrBS0oV3JX8qXu2ODkEfwPhOT3cJK6GN1Xi8IbdKJq+ZR5WX77Bj3qsYa5bGY+Z54/fTlXQgFE/Fv4QAo1xjJduvWaNA15w2LsMznmbwaIxO/H10QIe2FqJDy7uxN5PV+DnrIvQPPYTKqdG84Gc+fD7kyAUuerw43VXUcV3E/c37MVjs4fxSek38Fk8H29emMHiLncpq3wsmGlvhu2r5OjozXIIUKtAfc8EipqrDDLzheGrzU7QElYAt+OKICaix6dWXIS11jlwbNl2GKO8DhTm2mCB3m9YZtbMG+ykYOupqfDQ9CItiN7KWePOY4G1AnwdbwI9MSm8WXsKRt95DCsuloNIkglMfCgDqx8a8wbBeux27OOBgE1EIyswzKOHa4smc9t6H1q1xxLmCryArCUzaP0MJ7Z48oKKjG1I/E8SyH7XoUSpEijrCeIv2ZNheUsXpRd+A/fUcvCUEKCAaHnQsZgCRg9HQ9znzfzC2AKfvhgPx05uoRtnZFDtpyz5ZYfxGN1JCLI+aPsuCA+6uGPGxhdc7i8N9vEFoPXvMTv6N7F6QyNJXd7Lqm77+ZDvTDi26R1udFGAV6elIDB/IRwVmEh2XfIUWAKIOtPIcvA0vRM9QA1hujwqYxF+VpGCcVuKqTROCtT79qNl0n2Q77PBYkV1qm0rx7FhhSSZtRHbGmXgl2UZ7NN8z6PEk0F5QzKW3+2hyII0sP19ihw/D3FpxwM6ccYclH19cSeNxMOv1FlVQABsDW1pcug8GF4wTJP2GZDwxB205b0FRPz5QuW3A2jIRhbrFv2HNdN92WbOEfLvmkpWZxrp08I33BFrBO0mrnw1NIr+O6OLTdqX8dORJhilxej8dQZ92T+a4EgtRn2QhfpxL1BujhF+PZ6MH0pu8ccn69E6bYAvxUnByeyJeDf3IehfMYKZq3TIVHcG2ob+xi6Hs9h+1g66JBl3RN7jmvlbsDU6g6aBFszab85fNiXSbp9EdDVYCtJ/LHjXiUJa3N3NIn25YNJpzWPG6MIp93h62GvEDu1ybCD0hb/NcaNp1VdYY8dJGj+9DzRttMHjggRcuN5HYG3JlTNd6LfhMfqmYQq/tETRM6KCFmTUw1iDAS54NQnSlwnhcH833ZR1h31T3SH3jC3I1eaR33viIIFcMP37ka0/GILOgyjqDVXC3xpTsCUzApYvbmWzcTfp+I8JdCDCh/pONkDgnVEwJS6ddG0aMK0lCxJPFHGutS0fzzVm+wdRfFO2kTfIN2Fhsxr89C9ktdfy8GbXZHAYmUcvT0XzZqGtfPvgDLoeZQ/yvoO4R08VxjlephYjCW55sRTerRFl8L7GkvvP4caHefjupwDL9tVRSa8CaI1YA6ZGuVislEy6gvLwe9NROt25BKtm76PmkH4uvupCp2bqgl7yWtbT/cKb6BrlKS7Dh5UVpKFnjZ5hlvwp6jypdKTBtd/68HZImpr0DWn8by8efXoTbwtVo/In3rQxTI7v7VHHvBuecEJzHGzsTieXEbtAhZ3QrWM/8PFWtJl7j1pGfQOZMnc0KPmDVc+lYXiiJq/qMKN43yp4EfUGk3UywXdTNSzRHoG5CdtZcds8/u4mDdJRgpTYacINar+g/sZFTNK0A/G1Odg17y15L7vHi4LfUf5Veej684rTsly5zu45dJfIcHv7Vyp0O4uXP5Vh7osg2r6/gsWbp4JI4k22UZxL2jVd1DZXCb562HCv+WR0GZeD36MrWKzWmUJEFeHueF1If7AHUnVrkU82UpbjL4p93EhndkzAiXV9dF1jND25pwOjxj0DlMhDxcddpJG2lFTlnMhpmTZLTtwPkiGbISTclmrF1ECh1I82FOYDVtrzR+ksXLNPFffam8Gi/xbSdC9HnPUlEW/36MPlRYrYqxNNk/oPUNLppdhcMIY9h334OX9ktQYhDnd1ZdV0E+hol4GVW2Lwkckd8rplBGsVyujR1UCY6rcW9d6f4YDhTywiqQ19Pzzo5Ahvdl+gwAKkjFMyE9El4AwuCT9Cs3fawuWzNjTabDqslDeitJoyPhwfCfdnWEDpaR04cFma1Ob8YWllb16xSx+MzirAPr0ivLl/BV/RT4Xai5YwJrMaL6zfBXqvS/nJK1d+/nQVXjtlDINtr/DFtnAkJynqn/uTHLdrcMC54xQyZhbO2NCAtTtDWKpZDDqEvYn+tdChkF5a1WxAXTUq0Nq6Anq29rLpTFN6v9aJE28rQuqrOrJcBZh20JTnbd2JLsExbBClzc9HRtO1ab4Y67aPslP1YIVBON5Qb8OeiD2UJF+B6eGnkfZegAtBCmD4WxG3NeXQ5etmkOW2ikuv2UC+mi24FbrDyX/n+HNwFlzyzsP37+yw5WwAvD4hAhl+Z/ho51FylomAiMc9eLO+lXOd9GGxVC7Z1C+Hl3mH8ffGkXBy7icqUDDGd+47OVurG4x1zfBVTjgtdd1B04XO4cpvU+lPvAIcX76Pzq47DuPPpeLnc/74Ybse/l1aCNKvGvlghgDFrn6Auldl4OR9H8wMfUvRGEv9AeK05awozRcrpVnfQ7GKPLiy/gPZOY+CqphlMHH6Rej4LUBSKn186up8FitcwcObX4Bf2WUUmJ4DLsUIPkkG+L4+gEyTv4BIpBP/HPMPOrN6WfNHEE1zv4bf8g7AoTWTYMqBFbyiAsh43Qo+mJJLPJQPwuFBkOquzqrCa1i+9TkJHpWB4cm/4MMdZ5RZuRkeubZwxNxarAiZDx+nTWCBRZd4gbESrnGxgmP9R+Hx1Uzq6rKG+AfbYF6sD7iNvQdBSd9on/lKnuq8F+JUhWG42RJsx4ji3u9N7DtoDAmFB3jcmw5YOq8Jt8AJXFHxH/f16sIFswc0ZYwKO2SuhhNLZoNz9Fu42OOGg3H3MDAjmix+7Of0VxPAs2kAnvw6iLvhM0PJInqRWAQXxr0myagutlr8iJKemUG6uBKMNu3jXPFPOFDI7GzlTI/z5VFitCKkaYawpE8de75shvQRY2BUTB76Vn7mA39judp3mLbtVGPdG8e5WrefdU/9owU/ZXhGqiCEuwKsk5wE5rlWOO1+JWm6S5D7dwGe26nDN+MLyPZXJr5eIwSWIy/ymr8itOUPsMvATFTfGsHLh0ZwPq7h2j2vOU/tFbmSOaRmfETL8VL8IHYTDFmOpYvbzdFmhClTxjEW6RVlJZkmeJkiDOVvL0FAZztqaobBQNJJWDblH9jnH+ClNq18wi4Lz04NoufdBnBa/ibvXeJM1a178ZDlMy6VigPBFd9RtdwQGusuUIj8S07apQY7NSNw6uAXWr13J6YW6IDhLkOaH/kWX6bcYIWfH2mzZz57iRtDctNqdF/jA03bf7F+bQz+1NDhWYKHSdBXhQ8ZqvLRPwM44aw5uEWowFCqKqjVSbL3Eheuj1+JVse8uN1DjUcFZrKKsgPUuKjAv5XKKFFZgqcsm6HUeBnNOe3MMa+vwG4TXVbJ3o2FGXtQwMkQ7PkOlv70xe7BVTBncicV31wHbu2/MDKhC/nJDOT7fVgxRwhaBRCO5guz/MSZrLomhKcbreVjUWfx+ogajG0biwsmxlPLAoa/ZvGwc3IzkM8ZGlqXSQmOknTnoBAce1bClFjDFSsb6Icqg6l8Gwh1t+KiSbXYrO9LMto3wBSe0ejLp8gpYgmEyj2lyhZhWJ3XTz7352PUWw1073yJWSqvKOBHGI49rsdJBn+5MLsX/7MwhCfThVFkigsER5tz2CpNtPI1QphwG4W6FmN/ymquG26BQkt9uLpuCYwK6kONja/46UlNKpKyAnVbO94f/JGnX+6CD0c3oug1BKONhVTUcR1zUJtnqD0jx/QyjBwfg7nFFjx+RwxGWkfR2H4zWFrTgVIeCjC+s5tGe+ziOUazIWBRAvo7nef404q0NL2GkqonwpPR5lgmIM+tQfVwou0K7G9dRdoTzeCZWh9+HNcBx/2/kb+jMkzr2o33xkymzQG2PNmjlGVf6lHw58ls36BHm9yLIaNuMU4N0IZYe08++SWBtjqEY7Lyb16a4wM7wseyavArnIqvUW/mQ9LaORI+S9uj0l9N1kgwBc2hXyy57wO9/DcdZ2IR9/k/opqhR3zkrCZcnWULyfnK9CfhFNx7cAYtT8TxhoY0hh/PWPSoNw5utwN3Q0NYlroUXPtOwvHD4dj4OAPnB9tAStI/dlayh93mtjTnhTy/3GkKimPdQLE4mg/1HIbk5adRzekFX1wgyoaJm6DUN5E2XLbE+SLyMGL8BbQ/L4CzB+TBdfEbHPWfFc7rGuJvPSlo0bydz1gNoH66HkwuWsRBl99R8wwx/hX2GHbsGAl+aR0wt1oer98LxTmPvsDi1RYQsW8JLRZcAMaNutSyfxnECG7B3J8L6WLLVBRW3QjRT8dDR8VouBkshAurbrNjnyH6vhehjhymwcnNeEn3PSwb8QmE8mWoIm86BL8+RqLp56DKthwlA3fD79KJmBfxEuSdPPCtzjVqsSjiVUPT4Ih7ORTIioLS2n52XWaHO8ZPhwqTPeiyjHHd4Xp4uGcPaHiYwadxFWhxLZGV8/ZD6N/L2HW3mGdeM+QJO0diwvAzdjysR7o3tOBhwT6+/novZh8Khyd2WXi/+BInX2njnMofnGF/HBd4pWDECnm4tPwnBgdGktb7idT8WAw/b5KniZXrsCTzDi45eYQOBVrhTntVWBE5npcktMD4pDs417CWlR6V85tIQx63Uoe99bwxbasW/7dfHbZ9t4bq81uonfaiSIo+LvGQgWsOWSBUbcYr2pyoo7mdFvSLwY64faQ5cQNVRo/E4qEPKO/RjOvGLIZOX3G++LmVSwwtKUthDPRcP0vXPFNQeZQRm27/wsM+E2FtUC42xd4BbY8YyPd8iFPGaoJa8wdM9RXnhgcXed6Uy6Sd8pAlZqvS0ZA1WLRYDNdeVsQHkmOh3XM5mZ+ZDd0pPRjp4k+BM7JIxMYN5tQ/5zllz3DnLylY7q4EqX4X+KtzFIDyF/DIPURJMi28OyoC3n5YhZtzPrOqRSadbZ8KRzPL2ebCONi7TQFinm6ErxuO8eOPi+BGwxr8Yp6JhVFtHPPHGI4MhqL3UBzYW8+mK4fMIC3MAu/d2MT2i//xrb/91LbKmRO05aHhjS0NTFyN/n2PyF5xNteqlODhfQ9wdONm/JdcxsKXpMBghxyM1emmc8/3wfVDDZRdkY2farXZwvITRjrL0W71RBS4PcQ/RyiB6xEtGhDwBPNREZyf0QLD9U0cr6kIratD6OSdWXhljzX56wvCf3wNEmNsSNX0Icot7WLb0kr8l9ILz89MJfUALbYvkUVVTWn4HqzA4/8kss+nGq4pXYgiLwZQKHA6L5xaRW8kJHCuSCRV+KpB35R0KOlWJON6a5rXaAKBhnFkPSkAFFvmwqUQOfBTdYKzwxZgGx0GQqO6yenAYUw5GIqGG1Vg1rNHdGPFN6xr9+BXn31pEGWgKtKJryfeAuutNTwtZyksE1kOMelqWJRxiE9EiXFheCI8V5WExLc/WepdHqSkXCHHkZW8XaefPs3I4xJZWYyfsRp+z6wHi0gVMLt+Ht9lHaf0v7K4XrIQbY910VDBYS7ZN4e0i4Z544U7XPVxLBglZxJ+P0udJ2swPXguzUs7R3DpD6GNDJroPqX885V0sEYJ7r9tw5dpVeSn/RaWzH9Lft/60T/qETf8EcbUJbshorGJndsVoCnpEDUWVFDRgAB5HV5IH+7ugNWgTi4qZ6lt1ASi4hYOnaQPMT0b8JpRMmhtUoa1dX78aLcYJBY7Ql7ACU6U10S/gye4+4I87HoTTpp7JTA/sp2i9nrxk0mOaOKwj6zfncPkr1akOGWY5W8YQPDuh7xV8hgsjkmkyutHILKpiWLG2KNpwxg4NA8h6qo2jna3BPCuZpEMQRTNkqYj4jp0/+paahysgJqzZ7k7ejSUPAmCGQECILXnDrnqnOTfTudQTGcXb7dZiBmP3VhK7BY+uidEPbfSoKlYDuZnKtGFCZNZtaEMbMfm8M4OQ3IKOoZ+hV/owJNh6ry1h5/7y4KHcyBIZN/k2N2bSPG9OWYfv4xqJ2bgtogi3vr3B0U/SCG2RshqGiaDdz0QHpZBB7+fQYXKClq3bTo9zXyDKaLRrHnCA9z2ScPifVIsvvkjLju3BdviE+FN/2oOvP4cNqWuwt5Z36CzbhL5Fo+GSVPOQ9boHyxw3gBtlQLAp9aFWgJKILV8PGY3H8eu66GoFqoJZa+9aLbaIXTK74UHNZL0tGk0umnY8MiZ13DNSVM+3rkKJp4BKHSfjZvuv6baHX9Z5ewJ/jviMdWWn4fK0nvUOc4VpI9tY61pQvAwJhd9uiTIy14Go2e9wfFx8qw0VotPFXtilLoYSNdthBMnR4PFlAus8vwKBniYUVXJaQjdDLT/giL/yFLE8B1j2MdtHiV1I/xQ+cCBk3MxNmIjbciWBOGe13imczHJHXhBS38Fkp3ef3z5lgi8vRiBlW92AqVKkEy1A3wdPZkF32mQ+pASGF4bwgdfo+h+jyA8vdDADna72G3UcZARHyCHD79QV0+AdYbTaLyTFxnHlvAbPW1oUAjG2BQX3O7oR8d8yqhweBAnT71HgU6h2Dp7N2Srz8MrUnIQl6gK+p2lJPb0JDx5+RavBJpw5O7HnHjxPE5Tvk+qHyTgtRGCpu0BPnb2IPzVG0cHKhbjIslY6MkYIKX1VjzphCB/cFVCw6UT4VbeVvqv+T6Pa31NqeVO9EbJi6vTX4CIcyEkUhrLuy9BlQhT8KpU5z2+0nQrfD9YZ3wEC6W/0Hy4Ar0H1KGFBUDH9z2uuKgGHRfcOClEDe4dqEJa400ah+pQYUsohkkaY+zM6WC9cCrNawO4ejkdEma1Q9pNb15u9xTTLKsg9/5HnLs7im8pBfCG5s9g7cQwqugCTUmy4xyhUNq/+zxczXjNA/P94G7MZRDvLMSPy5eyTdxEcNbcRrprUzD+hBU8MUV4Z4moP5SGu7SIe265oLDfFNS9Jgvat2eB05ORUDfKjDraLTDOeD8cyd5IwrIRMOLFUSqZmUEygVpwdkcXb8t+SGXXHsOiQAd+mXiCMq078dzvUgyo3Ad6p8ToyNORIN07BNikB3Z73uMV7x+wy+cxFiQuxrCNgbQsNwj2QjGOMhSHn72qvOGBHurcjOBYr9UwH334YOBZmJqqzjKDRrxv8BKMHTsKRgsvhr494tCV1Ae91btx1fJYXrB5JeeKdqGXZhA+SY/DvgYJqHsbxI0nLXHGxiFwKFsNT08bw58tYiS7qx0k9jzEVKVzMFJNFJQ013HB1gyI2boIf317C3jqHIsNvsU9n/UwY8Qgb9glAIv7ETw6J4G/wng+ungLv5i5g1Mej8IBiUJ+ojgDydiFoie+gTcPRGH6yp28w+ER7OqTxfGBERyzfQ/A73Bcv/U8npbt4kPnhlmsUwOmxHmiQsxZPlBvQzp7d0PxXF3Wb2T2RwdKNQrlvHlOlDjeDAxOp8PL1bfJ9twEaOoJYDSwQzelY3h49x+APwJ8OHmAz1uLQ4XXbvziI89P718E5b4pdEZ7AF+lqtK+p32o0nYX9kca4295MYgpuMjmBTmw0P8cittKQXFdGNsOyPN/PUogd2UW9Z/bR+WWWuCwv4D+FR2Dg/8Tdx+KQChqAID/IUS2jEhmIZFKSYgSCZX2ktLSMRpklIpUlIyMqBBJFDKSJEkiDamMqJA0UTSQUrmPcZ/km/gT2h6p4e3MT7xo2zLcXryGhEosgP4dBu9DSqAUsp+nueykZfNd+PS7/Zz7bRZlirzlV4maYHIvnG42iODKXm34UuzPyo7z6XjqRaw+lwKbDC6RmuF9tFvsS3VVZbz52wCX35oGMZ+qae7LATpVl8ozzw/ylYM9fOXISY5qPgamDY6gdykUrG4Lgcq2DNTEXJaNWMmpU67T+dCfQOkvcJqNBex4fgE6XX1gSa4xHDHvBIddV8j8+B0e3dqPWkdmw9v9haQZFo03E+pplO98lPGWA11vU1wlWUajFdeQv7M1dV1aBId71chifx2PTHyMycpBPDpmFvzQKqPYo3OxoU0Bwv++otm5BH9PuvPMBB8QazCGHo+vkGwnAy2j19Iyy0Mw16MT3s5bAkdRBpKjxGF8zh3YFR9AMUN7eOsZAjlrJbY0z2Fz6+cwGadQYHAlJdx/zx2T3Uhpuh4c1z7Astcng5RIDDRqavGe99KgffsaXQxewxsd4uF3TjiOm5OGNR7eME1JDOYOP6Ak5RR+aTPIWy7+ornmtlhyZyeC+wx4Ex8AJyz/I3chVXgwQpBKkl/Bbb7EOn7z+YawHLp8GmT/jC/QVvuSpk06TOuldeBBUh0EbPxOzjufAbauIImsHn7x0Zv7LhGJfvYmny+p5J0kC9HZcfhkTzAPJrymZW23ubovH+smbceOad00YaooVEnN556eCSB5yhNGVX0ET3V3TMlxguP1uVA99yI26b/Ay1HZfPzWRgqKk4be7GoQezgSPUe0UILrA9SqlwMv99O4V34DFvgsoIzJKeAaMhGyxv3gBZu2sOv1bp6aPA41M02op/M6Ppi7gH8UVFO39DdM95ADdbkZNCLSmQ9memKhwVN2t3lBiRLF6NZqgHbZ9jxlbixfTJ8CnlLReDvegF2SH9LUCSb0zK4cHweWwJ93jTQy+TB9ELWGklXC8ONWOHVe9eO/QeEca1GBdqd+o0psFAZOS4b82At4cVcrjX08FTb8GsKzn09i5X+yUNn3HOSDruGoyttwb7ERbAk4gQLmGuT8WR5krt6i/1ILsPB0OLgpC9Gw8HiUftKJlz2d2MJSns9e1uJGdUUYLvcHoRNCYKIgSGtEgliyz4lvLHDlX71auLFWkG+43aBYYzUocImh66cq8O3y/aj+1ZLX3YunVQN76azwRxyHv6F92hAbjhGECBlbwFsroPC1L9scmwtuE7/QhVPTIP/uBEh/4opbZ7wGg1IBsJk4Hq2ybWD8fU0edy6LX426Rx2/YsFYfx541s4GfG1FI+oNwCryAO5qyWexh4cxdpcDhJ8zJvPbeSQq+RHsoAfFprlBtzUCXPoHbetTYa3vDrgR4YatL5ewzCDwplIdWvPoOS+pn4Z7OzUge8QOjA44RQtnI4lGjKZh8TWwOnk/5t6dTHcmFtPiUa3QmiwM2r71JHwqCZuvTkD/nxuhxPEEq1AUTyzvoMudE/lbpzvNsZKFpqgH9NKQWSq6G2avOwXJ2+aAg7c4dXbX4s2tFtAa5oCV+lPh2vi7ZDoQDoYGVqTo9ZkXjtbEpgVfaGPHZ5y7T5uXqJVR8FNRSDd6gr+3ToSi9UdR6ocprBdOQbVr+Vyb7wZGUdZQ+VqW9rkKQNqKfkpIKiKX251kRFUc5pvAY6OOUMGXR7Aueyt/krxEJbmK8P6vEn+/F43C6wop9ONoHFf0FM8s286zpTqh8U4dfR7diDeqRWD8zX/8YPwsHlHcxbUx13HJpf0woCbPvlHF1K5RzcJPxWmv71jQbK6m0EQZHONYCkIXU2HAspeOwgZaOfMXHpqyDJ/ZvMSxhoKQOboMHQS2k39kP+bHhaBnNPLf/CiMDa5FvyEBSpyYzdJVCrDbt4xMZ/tz6egFpPx3H+X258PvY05wT7gLRI8VcWSzPd2ZChAkeBfdA3/Dh9eIZgEBWFl3HN6VR+NxxfnktsMZrcy20aMXBJbTXWjClL/Qxr20bE8XLtfwotPqpqj/pgelDofQ9eYCSlMaAzJi31lGMRJedU7A6nNPUNhjJE0O3sxfx6TyvD8/oHiNPW9+OwpKJONh42MFiPSy508rt4JeRC/x3DJYLWPIk2/r8M9xS7B6tTmU7LVFU8k+fup/kE3ubIJpeY64pqCKTX6P4PxXgwA64+lguDD8SDmMqbXHMDm+k75tdOVvYsn4UUmDn7Wl8OiZu3FuTT/N9jKE8q0JGHCtD4oseqlyYxDj0VMwtnszCR5yxhWBx+nZUD/82WUCJcod1LIzkDuUllHx1XQ4olEJrwM6sHH8ECg574Y2ydV4I1EdGhKM+YtBKTTFx4O+ojRL/VXn8x51eE+zgsRUy0DCyonnXNKB9MMzwWP8Orq92xaLld+Q8NEdFFXtjdpWFfT0/XrQcDXDorQZMKE+B5RvGZNg6x3YEL0Qzjw1wwEzS+ryGMVqX29CWfQ6mF+mAjK147jhgTQtdStjsfbP7DdswhlputjoZEjLrg5z0oNokP0iAVnPanhjvDyOtVlJ+anybHtbG9bmHYMr/1Zhu/4I3lPxGs8GjYdVSQvpzIp8OGrRA/P238OmyCkgI72NVx+6CquNJJDO+3DXdGVwOC7H0mcr6fD0lXC7S5GX+HbSsckM6es7qan+I1cr+tLIAkXYfaSeLtcIgYjaBipxX43vs31QPAT4vyXBHH/XCo8eXw63bUXhfqwq6JzthycfD8OYa3JwJjuWJycOY5vUU3Y9Ug3iN9MpyMoEFuj106/1R+jI2EbYffMz10cM05iVNhC004rWtH/CDu9A8MofCd9/hqP5p/PYof6QC4Y8eOHmJ9wXJk9hiS6Q/vcAFK+8Dy+81WHy9ucYn5wOBq3PMD1sPAyFXqKacoAXb8vpVXcnqJraICn/3/hfmDkgDHfUFqNXnQ0XpRnSPpEi+jJ2BDoda4PxsfXcpe9BF3rkoXxgNikajmLvntess60TS4p28kYtSV4du4tyrNVoUs0dfnpdBuzfWeP6kht0+tdN/lw3zIXvVtEzj898eVcz/gh4ygn9/8HdzSJgWVEF1d/Wsm5NKO4uncjdo36Azi4jHij5hs1tNejZYg5T586A42ES6KGXTmc5jkW9x1CZcg7JfPzEyYYLSGLfL95bswJHqOjC1qnF+DbpHKsXnoLLz5bT2Rk3aNaFrTjLWp8t/O7w6QJ1ljeVAz+3y1j8YRecNZKjjGxBij87kxUGr1Pujof8blUg7/9RCdHjJsBzpWbeN0x4M9Mc10l1wbq5KlxyNp1fq+wHrZsRNGasNFk+VoWFp3Jhs9hWnpv5DbaV+bC0oCHrnLbF6luZ2KJzCzsX6JHnoBi46NRAlttbiN9aQ40NzfQmQJhDakfhPVtg0w/v4F3cQhiUmABRIuak2VTKlb+d6WzXEdCafZ26d7+nSrcvfLBrCKRHRkDGNUnwdV1IPctG0cVyWZS7KY/Cdtrw7kEvS1yThJ1P9DDrVTq5NYuDzPhntPNRAbyxegm10sS9L6xZ/dUw5Y5+hJ1ZcpAQupRBfxY4Tm6hel933iUSAmE8hzCyDt1f52HqB1XK1LAFwbY80D4jAKHT33PD3XU43vglHLe2xhKjKTTRopJ0l7xH3epdrFFxHUUSxOHDI0S7s720vnATT3gxyEqVBSx37St8klSCKT0j6WKsIO4fPQIe/zTAc3kiYJ6ghBWLXlGaRDJ+SCiFhtty9PnVNv7euZtOBIjD84PbyU3Kgr4tfoP+vkVsccgYp73+Syd6x6POqGNclqiIWxInQ5jbfhZ7q8Hrd28k218OUPXnG/6Z9JG7OkQ5riSd5885DNa9UtC615U839tR789RePPtFuq0isDlp1L5q9gzzDa7jw9LssjRQRD09sqAddU0/HVqErXr34aROQtYYWEeXDk6iE9/rcf2sU70U0UE9Gr+QebcUxj10IVmRFSTxOo2+DbyPAZZhvJDn4nwuGgppU5WhdpRo9jncwMqzX0FnHMbynNsMdmth56cqoPv5nfItS2Plu83BquaTl417jwXdASBcW8q6D8YANEQBVrYo0R00o/Djl3HLXZKYPb7PoYqR+PA5VJy2CnBY/5Lh+gFvhj6JAljBST564QzXNY0CuTRAruXePD3rxsoJX0D5MU5sP373bTf9iLtkN3KfgkjAV9LgdXybPASMUSXNcv4x3lfiv8widNiLmPuGie6FTIVfFJlSMFYCY5u2oReyaMhO82HNobmU5W9PpPESzD1ngJ0swBOfPEDSwF1aGh7TzsfPMbGjHaqVs7gaWlnacvmtdxY3My/h6VZZKcZ/NorDfoL3+NNnbekolfP2nPm0upbU/jEyLlku3kWCOgo07k/1mzsrQraa9fijHAdFjWTAOeBTs5PF0dP4fc8eHU+hrT5g8DpsWAxdxZ4u6qA7mhVNhvVDBEV14E/G/GNkUY8afJiLP8yCo6LV1LyRBn4b0c7tOqcxIMH89FLJwjDLWL454YzUJr3gNf/eEK3nuhR4Fd1sI29RrUN8mDzSBCDF73B7BMKYL2jkEtLb8KWF8XsUx3KNUXKYLv+ED058Zx/KvmTuLkLbpjQzd3jSmi57n5wz2R8nZcGTwUIzm04zqtO78JayengK3YdLrrN46qHGVR+/zm8WC9DHZk6mK5tAv/hSlR1MSXjemc0DhDF3H3RsHNPP79PT2CVgAaa9dYADowfAQ+dffnlTSle5aICB2e1Yc3vdfyvMoFznq4ko7oZ6N+SgpM0xsDO1kmQNLgIW79kkNy+RThc6wnthjdAwjkRQmOHcYnSS2gIVgMXE1tObk8ghezxnHWygQoP+mD57K90PvsjDX+2oz7F6xQwfSSstmC4VHQXKpaosVOrHPofuAAGbbuhL0sHJ21IgKqmD+Q9XQDENDTxVed2/jO1GL36xpHzMnOuSAyhZQ0m4FjxkKImjsIp+iYgNYqgTvMXy7vmsthIEZ6W0QINbW544MVDUnXfzG09dhx2agw0xkZBwMkERuW9NEvuC6RJ7SLZy9spq7EbdvN7agQjiDqnA6hwBmaeHuSFzRI4YeV3Ppx8iktC/PnIn0h8GVXNCZvn0tp5E2DngyBOxhrccV+LJ8hMIdM8P17tZsPrbuSw3oUBXP7mNe6bPwHyRmaivs1ECJivRiHXnsFpLR/4z+A5jp+3jcXmP8JJrXnISVOg9/I29D38FkMXf6U3Sa4YUnKAbxpl05aLQSjyzIJHbX1I68oJzFqtcYvjdTy+axuPnWDE8f1jqD/Gn5aMuoHBrad55nhRFPQ3hNT6JxztZ8FzqsTxxR55EDWuR2U3N3CcnwpTaCYvuBUBiz5Kw+djTXApygODbz3j5rR/FCRpQO1yieC8cwLfbw/FwIKz+OvBKLB/eZoqWo/i+CRHiGhZxns7RrCJixLKLAuGsiYL3H4gEauCdMGwaj0veLicE1yCwTQzEArHbAOlh79JtD6SyiOseFe1Eue2yYHI0UjKz+kjweej8VheEjk3H8fQtdYQduYqhaUp8o/PR/B8uSwYzLHAY4dswNPXiIpXhtB/UxxwUfhByht5ixyezeTVGmnk8tQQVkhVwVhPfYKKd5h/fBs9a/+M2vqPsDflH4YOXOCRqqkkOFoHokcche6Fv3n+OiXe2bqUfcXscc9OSfRNNoXAhL8YJrwLVow0gcXHw1BycwdOnZ/L+XbWmDDxC1zw+8OF0hZQdCGXUx85Unq/CJicfw6J+56g2Pql+MkmFfMdDXGcVy3a5w3CGRMt6l33i1OSTGH1uCbsrZKkv66+/OtBHBpWR9NTjwm4yMOX7/0JgsnHPHnscWl4plgOOZe+EEiugUebYznry2J2sCmF4q7xoHtoL01V3YKXdyrBti9VLNfoQkYPq7h6oguEDJdB0IsWevKvBdd6SHPpAQXY+HEmGMXvRw/ddHYaNGAbjbPkfPIQCSuf4nnzFsD2/bKUNeM6hq5TAaO+Nhx+soDHpGwEM78TrCacTdJqO7CywY3m1fyG6o1NkL1dEOa/sAKM1qSIkjbev6+d1q2bigNHP5Du8xR6GncJG9S94CnPhiihHzhk8QNWnM2lqU2mtD5zACJr9agrMwQdVWo48+NNLlCeDk86MtH4w2L2OLsW0r/4cGp4Ng+8eUL++Tlw9msJrhON4a25+rCw+yjeV1Mlw5tmpGiTyVtuT4NFF8Q5X+oUn27rAcdjL0BstyJM+mKOP5aM4uRv8/GC5T++/fw0FyTuwR1lRTT2UjzEqkVTyrqpMKH7LT7VuMXjmv/C++VRkDB9GpTMkEH12ZZom6oHvt+z+cZWSXiXV4hdT1w5dcQy7t2RxAuNT4O8Why5XF1PjverMTJLgaz+GYHp/WmwKu8lXV0DtPjkDN5o7gj7JjbjCI0yCtSPQPHNoTh/uTw8rn+OodqPYLTESyrOEqe4lk84481WHJI34pSnNaQ36zqvz1GEb5eqeIOKO/MWQUz3iAOfD4kg2DcRBvvv4u3GfPixLxl6nMbDINth2+kE8L+4gD7+OI1awse4ao4eHplzHg8Z3waNFciB15UhRXYvTtrVh1Fxk2jb+ANsPWmYFpkawyXd/eA0sQDS1mdAU4EiaHjYgVn2EE5RsMXGT2eg7gHR1CBvqpqajqlTNDG0OoD1r4yCgksX8PXsIHqZu5OLSnVZV2o6yV95BynKc3BOYC7F2C3FT0OTwUHPlGj2Bz456xxe/r4D9/6WoFDLAVgTvQgt5fxpZVEGC86YCdVCbrznhzP3v9VA76LZ4Ft6CxIe2mN3jzGV6q7AS5fE2VFBG26ueIu2sWP4llUaLow9xGt7rFF2VSfG3hnDCZbPOMQzCG4oM7TfmM1WVvpYOHIJ9i725B8eB2nHkCX09vyB11NkOXNtOQlZmoK9bAFL/prHb9PaqbRjN0Ws6sLA6V8gWN0f3EqlwHH6GV7wZzToOrfz3vRDXG2fyFGfg6jjXDVkTyngVXr5kNcrjFsf7qSDGsKgbBKFGlueoUzNajTYmk8tbRrwXWAKCQ1OhaJ/TRC3YxmX3teEmNABMNX5hWtEwuCAtA1XGs5jFeUwODR+FVwUyESlnxV4LU8MauXM8YlRDS1drYU6hnJ0o8WZ/V+s5/6RWrQsZx5eYCtMu6YC8VoKmJXkzEsG1NBLMpAdHW/wncpHZNYcDoq9NbC/VIkqjKfAmCtP4UKaIg8tDqQScVUOlBFjkywFqGxbiiZyUlSh852a1OWh94INqahMhA7VOpqj+ZyCdgfjnrkO2L3akbUbX+Dihqk8a4I6NJ714btPpvL2HnPU/N0DfutOEQnUc47SSbi06jHEHS6igBH6sN1REFNPfKW4pX1cY2kI//oicGnkZ1j//TFY6T9jf7OF0LAeILp1Bfb4vwVadJ5+582AllsK8PajL/aImuDCGw70fXMNjsuRhfUdoyDtUy/l7JuK279rsY/LIShNEqLTbQ/B7rkHfe7ehvoaIuD3yQvbV3dw+6+NIGxfQX2KK+nRxXnoG/cNTvWchcC3czG7SwqS6yJJtV0Q5IokWUtmH04JLaP3Df3Y2OHFF/gh5DQtZDerKSCqK40NEot4faASxW/5j86sXUl25zXZ8tUh7FbVgeUrVlDan7FwsrkQX+1tY32vV5BaHgqGJmLQq/0RM+TvUubpEkgtLcFHfybC+Zi1pPFWiHNHLOck21Z8klGLn8rfcICRH1m72NPxogss+lgcjCK9Eayuwjs7A9IYAurTtOV252yYXnmVUoMTwWzkdc7okoJdWv4QcdcCh9JEaHSLEh7eJk8+yyQp+lwjdYbOoHqFvdxzUgVWJGWDgLAEBf0NhsqvFby74Dyuds3nk67RYLYpGE/YNGKS/wiINJehnftP8mftZfT160/wceynewF34HrZEOnHfaXttRo067MBDInFwmz7StpycRudjrjOue52GGPWBZ/dnnCJczNcfpdK26eMgCalyyAQactfF22n4HIzHJu5gCMW+rDnfzdYrlEcF1cdpXHfx0L8xTlU92wOm+/XYbeORDiwzQMaB7zg96g88Pt3gN3/SEFLxjjQtv0P2379hSf2ptgjaYVFq4RgV9lpvhjZxA6il3i+axmJWalDbtgQ6OzvxLpieRB9MwoS132gxOEgnO+7ENpOv+ZJGd94n7QshE18yY1fj0HtlxdwJGEe7ppcz032iWyjqwMavyThcfB+HDlyGuxY3IfNqSrUGTuFq0K0cXbofCzPr4O3IS4g5XaSJl3djtIKACdyN0F2di4vEl/MO0/1QJOnIm5b/BSPvzmLgjcb4L8H/nDkkjYYPcwCu69/WUh/I52Js6Yqvx7oiPahrKe1PGd4OssfLIKrWapQ/0gIfz8QpuHih5DWvBw7tU5Bf1o+HHjdT9dyyjCoYy42PZ8OsdlbeZ2mFiakvsTygkuUMvUltD/7TENNVnxuqgBsU1BkjfPicDRPG7t2RYNTiAreagvCjIda9DWtH/O/h3L9/U2cp96CLbGzQVUmlFVPDsAB3zg4qb6dUwpMwWT2StKMf0pLK/9BrWgw3UqVhyq5COx/Xk2Ocqp8+2gBe744DFNiS7Bj0xVcOluJhw7b4bKHgvAu7hvz4lOkWezIoYnHcN6NXPYPDeOmuu24uaWXRTb4Yc1kWXA4oowqY2eDSMYTiJRxxYlBR8C5fxOUnY6CVdnzWHd3JB0xUYO7tS85x7QJ1y6sQ6laAVD6tJNuVZ3AfxuT8dXiYvwSn4jnRo2GD8Ud5FyoCy2p8zHCK4tguQQPOv8HXdce4MncV5g50QTZwwAqQq5w1MU94KH0GOSiH3OwXC6MWSOFlY9ieMuWEriqv5NMzmnC2LIftG/GBtAobkHzNxvJVPgRHtn8DXRf5TGNPIceq0q55Ko+aNx5S573/XhLsDvc/fyY1cbO5KSTy9n//iUY0VfJFvlxNOu6CFx20cArzx6Bj0ITr6veDJ/kZNCuRJDLU4/B/FmyWBfzgS3rR8LFhdfIZlc4mj7rhHXiTILapWxgrsW9vqPxS/0Szv69hEf1CUPCmDKUtz7CcVttaY/wfLop5E/1682xXGgpWAxP5RND+SD3TxTmHPgPzQ1+wozH4/miuhYunH+bdkMjbvo9DV3W1lJwWyzuDTKEMDbAd8N2NLVQAsXifkBznhrXTXdhHS6jrNwPkFX0ge0e6IJm6nQ2t1MgnWNHsHH8Vjj3MJYu6b7k53WTYPfxSHwxOYc6u6dA+JSj8KFCkzK0yjij3x6nt97AQG1LCBLroS9zz0D9t1b+L00WTuw3wySHTLa80cT9rhL83T4Ivp+uxcCv/yC2MgyX6Q9ilL0ePJLrwmPDI2m3Zx0OtVqT0LEseH+8nRKOP+PTBxXx2JUi/Px5PDzcEUJizU08uSUDQsuuUMyJfpqS/J0qrOaSlfY1atwxkZr6BKFS8ysJnL2E63NquDyjGXbtuooaxuHw8IMtdGVW8qYtd6lwjywIHa3Gqm/B9F/mfVRqkmezKE20K7+OKQdkuKIglg6MnsnvB4VBpPUZ7va7TIV6rrSmPQE3b1Ykxck/of2FDaiay5Kjews+VheEyN9qHL5kPXZvXIzHB19RVd1DuCidxP6f74Dx0Ae487wOK/bJge/tcXhu5RlIS17Ktndbqd1gJU2qnUO7N4XT32oxFM9rhfMFAqD61wCSTffjj5tSaKmuya097ZR74QDOXWePty81wuKlQfhr70hY+kcUL3ZVYHy8KnUEOEDeljxIsJoO93wPcvdOaSiH8xR9ehJ090XBmyoryj04llvdv9CjpBWwxsCROutOUNCWF9D0ZiXFlSiC+t971FE9l4uTiVw/CaDf3UpYqLcBl1w1hulHRrHlJ23ctFIMLj+PYUm5UH5ScYW9k7TRO+ISZM87Blc8D0D41gMYzFNRVmIsxO96DQ+NYjAyeR43rk8Fx/JC1AppBv3Ut3ij5To62F+nrAlmYOchSavsmkDxUSOVnXyMOWevkcC3AladpkJz0YiqTCpAuE8InJrC6M0ERVzencq/Xq+g4rtCHBV6Cl/an8MNH3djVFYaTH2uBNbrdnBMWj9fNF4GmrevouxQHmx/1MrK/sw/ZWX4p/4RXvFUE2piM8js4D3UdnxPKmk6OCprAGx2HYKcIT84+f0OzdZzwtyb40E+fzUaNy9FMy0Nchk24OXiqvTgwiqOLC/C5c/WkadcJS+5og718xvw+nQDfjnqPCr4mYN6QQZa59jC8JUy3mfzmMeU/8XSREV4PG4Dqz3dS/vy7OHx4HNccG8tB5kGs4i+BQjffU4V7aZkd9UU8iMIPYfucsHkuyjfHkuhopHsk2xI27yfwhG3EJozIweFM1Vh78sizLlzFjQdvtLKhe84eJ8Uz4s0p/71rrh5MJLbAk1RY+w02OR2BwczHfC1rQp9GsqDvyaylJB0iwoXbYFF6od539UP+H6dArTKusMs8RPs5JsPmDWXU++6oFmYEAu+nc02MQ/p8o8e3DFCBOo1S1lYzwfCLxSDSUwcQ10aW8w4T7YdKynb9h0sGUrHtkOaELTIgyLvhXDuw91oL/sUp8epQM+0B7ix5C+o6OtCXMNZPjTCEN6pS2G4iDW/OfAAAgaFeMg2if6p1aKXeCcvjBODlMjdeCEd4KHdI7R9u52O/n0BH30VYbTSI/qc/AbiOlJowbhJVHagCC3+ykPjgXRa5wzckC1NO6u+Uujye2xlroHq+Quo/Mc+lOnT5xsSE6C5O40k1jTh+8FNvHanFG1Wu4wP5DxQ0lCencd+BxG1i6AUqw8Pbb1hVUg/i7cfJqdwA+6Nz6fMZbUcYZzEdoLWFHdYAfdKKUN54nsY+vmC1t4X5ZFytZAUdgVtTT5w0dmNHJ4iylfHABRII4Te6cDAbhF22O3L4X2JmLfFD1YOOdM5r0QYrnfCfHl7jl+PYO7UiQ8fdQGFibGkgSBv2fONb2oU4X8zltO299vpQIISmZMcjM7sgFkL78NgVTOaXl2EP5KTcZvUPD6j1sWBvzRxo08JzvlkCLLeMqBfpwSD/xaQ/H+hqHpwMtDnVZycFQJHLy7kJz+tWMbHDETTN2G49AnyWv+Hoyt/85+WJMC9vajl5MAtdTUo9LiFle8rw+WAbWD26wf43i7iTfpt+CvSGWMkvpKq+Eh46buARhy7y6sNRoP21V1cFRhNTmYKtDklmZa3S/JEtYk8SiGIxt4MBOWz+jyhXQn+9ImxU3oyvg0KRy+9ahpwj8KI2FJIeRNDExNWs/RqR7CaoAhBWs6wdaktWdzIojvz99K0dB0oczbAX/OV4F9WGS/b8IMFdypBbdpMknISgltSDTDrqQZlL6mGey6xJFXWx38aD9O9g34g8UsATGt/YNy8H1TDfXAqtZAfPfCDeYLz+V6wJSstmEcxH19gqa0q3KGtdPKyNxrLzseJd3bh3QEjmj3WDZxXPkDNCzFMd96zm/EU+LflFxYGxhMIp8HXm3P4iEUbVK+4xl7BF6nlwE6+57GK3IqkYG/2Bfg5x42WF3XAxVdH4X16P/6rn4WLd/uS9Ex7KN4+mjIPa4LsVj1qO/ARlMaMJB/hK7DSQheyNvrh7BUXSemgBLY1jCHlIhmI+NjJO96t41WqHrQ78D0tPLgI1FUU4YNSCiQUuGCXUzNOLZSCVt1amjzVBnqvHcfG5aWgkFKB7wbz+e7XFdwVNxqWuHrAWnFDaOp3IMHAe6gO5nxB1ItW2FnzlzMC2Hu/l+oe6lHv0+u0N1wGmtLm4p702SRy4DF8vOtHy3Z8pSUKeazUtBVeCuhBw1pBOPRWAwq3xYFowhsybi/GF1776ISNHXUqePKoy2r0QMidY3aEcJSAPCzyV+Np7i9IONeR9fKnUbKeOAsq66PnOXk02GvHW8vsOUhVDLaoSOK1+Nmw3n0+hoQdR/FPcVStXIu9e1aD8pw2DkqZjzF2SjBlsg78XbSAop4/g+/KPpQ3ZwVqvGikV+MuU8j5J3RGJ5jHamqA/cFLeK4miwUrHbHnugl0PdGDDRtsqLmlhXGBHNeqxcD5q4pQl6IGXzLbMOeRBgUKree7iYNgWv6Jn+5/z8IrEuFdYj4dHysMfi+3cfv1PtyeK0NSoRPALWovCUc4YOc0MYjWbcVCE00qWTADbE8+oaRF1nj80W+Ahuss7eVOAsve4W53E7jStwgwcBK87FeBI+t1eF/CU9DX98EalQASN/bA4ms1ePKFD5vPC4et8SkQ/HYkBE46jQHORaB6JAP/26IKZgrf6Z3DaRx8/5DeZGTRndZ6bvExB701aew4Igo/xX/FK7URoMUDcPHPMD6X0eWlWjPBYF8ZagmIQWyLL3+/8Aquphbg5NGpHCv8Dv7F60LLmz28sPEXVZzRghdLZ4Ll6jVoeNMbvq+pxGn2fWw7diMX/P6BnRvEMb9gAkVPSqSlSUqgn+oF7s4bwLNsKa/JXAIKBw2xp+IF97iMxbMS0fBrujrCH4YZ8ptprcA7rv/4AO9s/YkTLIqgdcZrejVuLpg/m8ldFvngf5Vg77U+cAsahYOhcWR9ThTT5l3BtVq5uKclgDLag/G7RQK7D40AtZW/4WOwAwwqmnLHdXVI7B4HMsW2dKkqgF1TDflHihbaXFOG3lv6FKC/gPtM1oDi0wpuD1Gl39dvcqVXCHrv2MeBbQ0wc95UyPMepn1yFWDocA2/3dyOviohvHnPZjg9ug6alZ3otL4L24wRBd63m9wP34WmS4uxeKE7H3+rwJfm6GLBgp34b/8FqOzeBONlJ8G5sEw6FzIWl007Skl/76Lsog7oqXwINfvdsSI6l+J+rcHXNxUganQEt07SoE2eYvBXRx1+ZoiQTsUvutk3n0KT3XnVikU8d0gIlFeX4UZUwiGZeEj6V4efzkaCupIXxB0pZuu+6ZRzSg5PHJ8AlhvukP9fD0qRUIK9d+twg24wrQq05VLhAFi2+xx5HmzhPRG6kKGYzhX+80DEr4jCu4ncHCqgJdodk8bbwfmT62DXzEKADfJwY91EMDiqQ5+1R0B6riNN110J+dO30PEPoowt2XR9qIhdhPTA29GJRP4M0h+5L+zZuwEitumyz8UBXrU3hU9OfkUZDz5j3HtJMMq25dDvgWQXKEjhu7PgWpUnybRFQqJTMpWqJpKv2BKqHQ8Qafwc1NxSuMDHir2lnpFw/l7o7lHh9tRS+FDvhb6WlvyxQRY6wr1AKcyfXxxawWZ/hnF0wBDeH/MKqoS0YM2sIbwRZkn7no0EAYlu+ra7BnfcL0XV4EGIqTzGGvdSyHVtJNbvqafUn4M4vYHgy+QGXvTOGFS29dCjbR8gpTgFfZ16sfn9EXqUYwHWouFI48Shf89REHqVAa2DgfBm/yl8uvYe5evroW+eJ9jbZcFBozmEyrMgseM1rhNvpju9Yayp0kEuWZl053oWta28jy4lyfS8WJVU1SVg3KoXeDJqIy86GMy3t4yhRSbb6UmmKOp2nuNe73F0IuQ2/NwvCNf0HuPSuoUwO+IiaYduB7lVrXzTNRtLt/+kT4t0ecyU/9h3McPfGXW0bPYblg87icO5E2m3Zzmu9DSEGD6HsXP7Sds+mWd2ENzuCqAbjaIc15AGj7sk+MdbaXL8rEXVhW18qGQObLEYyw83TYFbO/ZixMe5fGtZI74aWkmnp3vzuXX9fDC9B35fHgAFy8lw+4ohHKEf1O7ahsVZl2AtlsPavtnUeNUXbtz4TeV2ljhoQPAqcRa4CjWgjcc+ULljxPopc/FnYDE5K1fhOo0iDjF/x16xCtBraAQrXu/nnacnYPytdFg93xxqKk7i7OdTaFTvfEo6WYSdOSNxgr8uTM+ZTZ/Xf+MZntp0/Gwj/Gd6n2alRONvd03Y/cUeK+ycEJyM4FBfBzw+8ZTNwtXZ5UA1PnBMglNSBixgocLdMhfQJfwjHfWdBhi5nBd9T+P21gxycHDCXOWL/NNCkpNq8uhuag9YCkzCzdFTYEGMDIT7HKDZRZmw9eMiEOw+i5kVznR0cwwFPquCfWu6WKRSDBb5a2Oxyw6KH0rjw6fng5OFPmpUW/Aowzgs7x9BHwtD8VCXMSQPbYP9EwmyVBZCkpwRZ09eSpKh7RD75RtZ/VdEajpLYeYUaSC3To52XQwDlh9gA/+BKaqPcEyoLm9cFoL+NWvQe1ogznk1G26WZdC3T3UsviebfiyzxEPDYqA1LAAv5snh7lI36q9dyln7jWDbxkR8c8EKFq41Zi+fYChznAiC5T9Q1lwT/7kqwa0fUpj4QA8UcyRILduRqtwMKGCiOB3b6kKZo+v59vnJfPfZXZ7uMpp1HJRhkrY6pGxPQztfXRrY/BSrUm4zS3zGUG8FgnBV1A29C4t2joNx65ag2cUjdNo6EXdJtODHgw3gPUYEd12MgQtv9cHLsBeH500H1fY7lD9zLsjvuoW/1/Zy8xNXuGXXQmOen+bgoh80fF2fP02aCTcV90PQr/1U0nyYklNM2PjkG+x71UpadofxVsIGsF6hhR0PTSFOspXDWnLh4973qHeskOTCZjG+e85te1/SqsGX5LXmKTt7moLFu3yUST5LbjxIz//7wcILJ7GdexKMcGjja4VXsffaWqpdogybrktw2vEMlM8O48Tf97G3zIZkDbbAFbn1mGFsxYEfZkBF3Ui4GVpDs7eNRyXRbhJ4aQeRSZ1wlM3Be18STLyaS2oJc6hoqSJYr36POpIEWzu86Wa4Bt4yng+dNoin/opD1FA1PQJ11GoYB02OPny15wTp5AxhRP42mnFqP17PGYKAOdp04X4MW8/qh2dTCBTHP4YXI3fSL+Mq+jS+Hz8LLAbb9DrcO3UBwe6NOFUNKU9BGyR3Z1OVRxrI/87gZfl7wFH9BQ5e2YD5rwxo45pxdFsrigO9ZWCT5iKOHH+eS7xmss3dabTTqhqOqB3GxYtuwswNinQXvpNRwzTI+WzFg6/C+WzIEQ6jJPiy8hsO6NxF285Olt+USpdi59GEAHFQznTnvV6qpHV+ABvNA9jnfhIsj7TkCpUNdPyuI3fvL6T1KnLQUagK7870kdGeY5RgY8ptIxbTY7vnfO/teA4Q2kNv95eAioc8jNoZQrPKjFna3gyVDjlBjjnR8q6v/Anq+czMfjaZBmi83Awm3lSFoU5J0Nk2CQcTM1Dk20V0nGiJoe6GXOPmTa+mmMCYTwJwpkwPPx6eSSoznvJTq/UUFHUVnlvk8IiaJ7hR5DHp9vylI9bGILNoHEUPa5H3NR3cUdCJS+1esOD4J9gbX80SS7aCakwyy65UBUXZOxAiHISzRENQvnQF4P0HIJx/nDz6flJa40GW9DiCn46MAF3FNh4xfgYoqh6hJnuE6AxBWCM7iXYdzAO1qe85/JAYX4gTh27Pd9TospC0zQfBte8GneeXOOZsPtR4jOTLs5rommc6ua9Uh5UxI8DjtjA3NO2BgqTdWPvTFYwd2xFT5lCd0xm652zC5+4RfJfeR/NXNfGTx8UsfCSUlWSqcfkMV5g9eAa8RpyAQwqT4HC9DKwr3E3vz34g18xX9HHpZ6yT2MbzS0T5TPQT7Mx/gEf+m0F1bfJQl3yfnx7zJrM8YbioVoit6TtJYXsE/y5+wZdO6pL+6FZY/VwchNbHgJRCPW7NssCAZWfhNtXh0QmC3L9qI5c7FMHaAhVo9JcFv0dj0DD7HVrXWuM9nzbyGLgOe4yn4qJ5DXzUu5iW0h6oMtMAFdU66qhaTVf8ikHL1JsCjZbDiioJFHzkwC2diHazZEBwyQTQrP7AkgYES8ZG0Z8mX9AvuQVFE2fh11W+2K9QAU2f/pCJtRbY2kfjwJqp5LRCBDQElKkv0YkvaJqCyux9+FdfFxzuCbKHhCHs/fOMzjs/hmNq5XDh9QSOXvkQDqlHsn6+I288lkNz06Rorp0KfFSXhS7tmTR46wakJHbT1ZNeLL1KGHLiRuC/adJwq0QVYvQNYGZiAo3VqcYQsRoIrd5CBSlWpHD4FB9YtwINJv3ml1dX4FVlc0h5mQ9vl+6glPypdKtmK0e51cBVY1WAxHswA3zowj1rfGwiCIoHq0h2NeGZzUFYNvkCnZtfwR8OlOL4s4ZcYlcLb0UdQUhHGlbpDLGq5BEWXRtBtn+fgebvcyxv6gS5qyeATZ4J3+4Zxs15Y0HpgQA0hbZh9rVeSlUp5AOmbhTW3YtG773pWOlDEPkZRMKe0+EjPuPMMhVKeHQa4kVM4Mnqoxx/QBhMhrVQVVIEnQ9O5aM3lCA13YpLbCbRNMUPeIVqgF+tgfCNMyjsohrr/bgC93/ORs1jU0DmjAzMnjCa7xSkUrukE+8Qt0ejP/shTdSVfFXcaceiAtK5MB3qLbbgvkl7SeTIG4ic0YKb5R+SkOgszEzNxh1upSwSvgcnPxCEBYeVKKFchTc9Jh5Y3Q5ChicBD5rDhTB7GnnUFAMXngWhcSZQOe4UnnHt4TG6bvyotA0d80rxnYU7xrxZhLe7pGj+WnP8GjgeMnSPY/JSOVi6R4vsl2SyeUA5lPlchEqBB9C8bwQLSK2CnlujINfQHl8P7+CYr5p0it7i7xWb+d35DbyyLxQDTrbiRagnVZmxMPLYOxisKAXyEOd47RgUvtZPj/6+BC/ZH6zRuBwPxhzCOms1iJ6+hib6PqD2hWWw4nI8543oxuGIOTQ3/ALFzNJltWp5NlPXggiVtegnJEyOuTIgkzcKunc2ctPMCnJIYh512gbE1IawI1kFcjOf8+Dqg3DzkDsqFtpz0pVqqtSJ4oOVSqgsdoWbDznDZi9F+DSyGKfXCYO9hx7a/nrKrx7/5GOrCvHo7HpUM5uNyZZ7uGu5NvR9FaKNDcKYIfACTr7+R8k2JzlLeAsW6m5n8zF78Zq+MFQ3zwSDBxqQ9uoQdUctoSSJAOpvfI6mK9Pw7vk1ZHcnl7eJtdG8PknYNFaHNx7S4TiLJHDID0OtLQ5w48t/sE5gOYyxnMZW3la4VnQytN4LZk3tWzCYV4QiNwju5nwhu8e38MrgTI6dIs6XFs9AqZSRsL+onO5qN8HZc2IwWUsNry3dwoMOnihucAJPmvpBcw9jqpI+yLU1w9K129EkzJ0D14Wx9KgqXLKrEY0W3Aan5FD2HeNJ//1GuD9cSDNeuED0BC36rzmayw1N6GxhIJ+/Nx2bNLKgbKI+1XiowYOkNSCtZ8bBQ/V4cbcAD9q9BpVD9VAebooy32egsv890LltDhtfuXC3vTpd7KmhSbXbwXX/RD7Y4otB3+dgu0Yu1yd95eFADdioUgSvbpnQprAJWNokTpVVY8Hkwyh8oOeGjk9G8hgYyYqfhGCZ71i0k5GmG5EicOWsHJdJ13D+0iOwb8NbLmtLwI2vLTmsdwT0rL1Dv+850Zh/Q7j9z3k4Vt/PR1IaWOCnKkk+uQXJzaM4T1UffL73gndsJiRIVJBavy53Z+hw1W8xUg6vprqCbBK7K4YXThvBmVsqODNkP4s8P0EmSz9gmAfiO2zh+CeF2JvljGc3nQJd8ZngF2hNUSdS+HBSMb3SuUTbn1nyow3PYQr8wSNvFvDiEH0KsDOB6IHDXDgwheOurYNJcX68VKAdy+7dozYxeTyaFgGWrrvJuFwJtpXL8Kq5EZyZtwj7f34mi6Z8UjquScrXD3DwuElgJz2IM77qg1pDNDi8mcgp9owD/YY0KesyiE/rJov4Nfjk7WKWqBWigjpTWKz+CuLKnGnjiCSQvHOBr2qZsoJXF27zmAcjuwi03jZAzrAJqP/R50CzOq44W8+fu9fADI1lmO/rhIsTbPlK5UIWDEaQc5WDuiutoC/7nT3/aHH3HgUe8GtEh5P12F9SCBMyFoDfs2UQMm4q2Mp9hZdPAjBR7gePun2YVP/20yolSVpefB21PdX5gnQUPB03FYyCTsP3441wLNoMnP/IUMGxInb/1YPXnp2Eod/OuP3+a/C+YQqKlx+j0kN7OuWuQjfTV/HHNypQuD6F26JnwIPDCmhr+AQVj06HeZHjyfuXNU+p9+dVl5xgT/J8WNEcCA8MYljp2zH0sfrHj6TV4Y7gLETpmyiTbgFCyx7zqfmX0fvTDbjVcpsnbj1LoovVaLHqGCi3u4FgtwlG5trgtvuRmJE8DpdHV+Cjmn7wnWmInpUPYeHMMbDT7yvvOmrAHxx3gtDS03RDy4hqNUOgq7OdFK4O4FUpO0D1aTCotwMFLvhxhvtebqLF3PtsEUpH7eHP8pZUeLCXsuL+YoDObAjwL4aRy0PR7kAGlzotwTuazhh5x5FsFKbDZM1xIH/+MEqIK8C0P8HYlX+OpL3Xcc+TZMxU24tXdwvBFKdBuNL7hi4/MaZdfgyP07/irUN7Wct9Oa0dzMH9q16R+589sDU+Fh9HLoE66dv4VU0Ntt8QBHczIYyvEmX3qQdJQ2gt+7w1xLD3CI0Z3VhuPBI/FavBcr87OMVLlti5Dq2N+sjHrBg/1saDs7Qyrwn/ArmhW2FR4Ajwnb6bLmwKhniJLJxldI5GnCxh0aM6EOh5H97X/OZZF6t53wdTGJeeA3VbHGlyUQwHFvtw1x8n7sy7SloOk2h7yEWYqbiG1zwaBxPvqeMMxXA+9twD/02yhgkupSA/1xZLz62nD+JfOP8q49s8bbi06hFfb0yhsnf+MP9jF9Q87+ZD+mfwflQDdRba4+usFzjuzjTQVupnDbEEqLNQ5r8nrOjoBQ/8bBYLPXLlDFrigM+M6P4lOfB37+blAXoo37sW1tWbU5VhJwfsEMRag3B4o2AP0+bUkp+nFAR56/HsXE9wSMpgEStDvFeViioSIyAw+y77bXWC8WvnU6yBCpgvF8fqXkEwin4ATRGW9Lf1Lo8Ic+PZ+5uZJcfCwl0DrFppCtNn/GU/+Zvks/Y9/RAGUPw2H8MrzkBHsxuH6D6CA4FvIcB7Mvze1EBaS7/BEn8Pmlp3ANyiGzkr6AUrWCSTxz43vm2jgw4y2vCg7y54R8RTgcd6CoVJuLvtLw2YZHHRywG4oTeZjWgmPSoeC5ud96P2AT+YuJbBZpYRxkRUgOT1yVh75g9JtJ4AWroZo/Yag09nO4xXLYL7QQtxX4gHXM74xuVpn9FtpQRe+OAP59+c5yPmk8HugS40bFbAKMM98Nh7C9uMr8O0sfK8cHwfJY++D+sbrlLKH0PQMN7C2vUecHa4hhxchmCB5gwcHrueNqUpU0rPAI9xkqLDPAOWnuxmveYOcD7hypdy1oKG1zN2tNrCp55XsKujLqq8/Yu9hyaCw5YiNvklw+rfr3N/0hnwqdZn96uFdDA1FeQ+R8DmsbJk320IzwXPQ+KcIZgurg13XQvxSGQXp40NRomDiOstNoCEnASc/jsV5gi4wthzUXAlrAAOpB/ESx+O0MqbK2jrXlXqSLGlFSq1WOsuBA4q/hDyuYzebdQBcW9Jnmf3nKclluD2NU/woOwZTIiywrTcaXAYvcFAJAX8OzJQp2czmnk1U9K0XRwyeQIXe8jh0Xv6+IO1wazLiO66Ac69VUkRTQtRo8mFPl16T8NbRnPG0en0XVIEsi0RfrmIQuad39ifztz4SgKfX8sg37kfoGNVGO01D+GjGUuoaqMwzIxOhi/nB3CM3mFOCj5PR509QW3YGrxS7rDUpvGQZHcADq5SAYE1/9GSi62srvmQrqfModKpsag++gAYFn3n1AMrSH7cTXp82xwaxbq46I8NeW1/T5fURsFX+zFcqudEVZPMaCVlwpyHGmwhoQjrE3+QdGQ3LlD+Bd0vQ7Fq3UJUCI7hdnsFfLO/kgvK7FF/jjo8DlvF3j930vLKAXSIcqNH0v0w+ool3Ojo5yF/P57f1AJL/xrAfxEe3BU8lVM3SsOhshdwdLiQGpLq4cDFwxwfuoD/+x8B8AEQAgIFAPSPIm0tRaVBaElCSkNLyKpoiDRIKaVkpZOkrEKUKEqSUUJWyW4QSTTQkmiLRAPRPSMtaJ6lDov1o1CnPIlKjm1gidRvmNPymI5mLsGwd2lwZP4fTNl/HmI2iUHT3mWQGrua3iWpUp7fH4zcNgZzpgtD4bQgXvlpAtVcUkK9NhmQtw6jPvF2Mlnxi47neZKysjoPSU7nvJtVbL6shn0eP8ftUcaguP05b7xQjjN/i/Gh1xEopWMBlllRsI3c0ckjhQ3+nCThpSPh5J0B9Ip7zfvrdDHl1mEQi/Njd4taVigzIodfNrxGVZCu6I6BFyLWdNndn0zUgthUQY8/ui8lra+LWfdaH8HIySzrJAAFmXJgvgh4S1AziWi/4wrR7/g27xQrSn1mHbOHePrxOCosyODOKWNg1z5ptIydTMG+dvCgQxUH5LfT4uaz+NVxET8rfgmXxivwgYsA9y/9ofPXX8AIyZEsPz+MLRLUYaxaAYlE23OVWyZvdxjEcxtEQFx0iFMbJLhJ9yYfDprGUxeO5bmCNXDx8T1yyb/JA3vjYX2pALxTkwLZqBc0aLGLH5r5oPrIH+gUp8FXV2nAP6kS2my2FR5nSYDm6bf4/pUi7dx0Bz4ui6bKhLNAC4+Tdn8AhF+XomnD6qwoDFA3OoXVLtiCoFsamu6Zhd3Ve+CRzmZMufWRlbo04eTkUxBxQwg65lTS8z2b2EfuJxm86uClNmEkt2k1qywJpPqKNWxyby8u6hgPdZcjSUVzKkh/Rzy9rwTM33+jr0oH6H1TJAz2v4AHUTVw+rshbPd1wQ3ukVS2Ell2iS++FNpDqzaEg98aVShatJZ7NYTw3CFhGAWWPDfNhdf/qQN/awtO/nOU726dQSOXjed+bwvIsvDmvhUEz8Q74bLqfdyxewn13PzIO/PXc3vAfvrT8wPmmESzQLIfqMmaQcLIN7i0azMEzyqD8KsFcKCK6dn97zAtEFD9P33++u02yncKwVzcAWFTNvNxz28wvf8GzPX4CBfOTgahtnxI9lhEU7u0ybddBIwC+tFbPJg2rhSn1IcHWdJvM25oViftO050bG8giYrag8FUabA0s+QRegVsTy+5YKiN2oJ34HKBnXhUaSnXbnSCg1vnkr2LChg/tMXwiE10j1Zj6L/XlDdhB8rteoJr9JyYpiiD+PypWH9gNkzN3QWPM2/x6RBjCnC0oFFtWewslwMm0XbgsnI+bPkizjdyRkCPxmu6GHoapM5lgMIRY0o9/Ie1FTpYoXY5TksKgjMHnvAb95lQVbgWTm2zgOcP7WDuvDrgqA2QYSsEazdMoHcPCqAr3gX+my0H02ZIQVZpFHlNasATf+7x4b+72bZYnAIjnrJZFtDcezYQVq0APqvcaUtjJgXICOPmKH/ccVGYdP+VoM7LWjhQpAafbZ3JXXwOjIDPPOAxDW1z7al71nIUWruZQxxE8d6bXOw3HQVpfX1wdaUs3A8x4AQdbXKf0cNl5otRt16Z5bIjUbb6Di3clIjr5xXz1qUicHkZ88j0a/jMYCqa25RwTO0xfDD/EOrW+cCUi51U/WyQPMzVIeDvZbz0+i9+eRAJ75MsqO5BJyX6fAVJqz5KaajklfLlVNapC2NFiZWn5PLGQS2Ut/LnhZ8/0Lk+dVJyFCX5ZdmU3fWTbswZBVNTw1C3spBadM0gfq0Qreu4AEbn95CvoBWqrOoDsS5JzpinAMlX82GT0X8QXPgLpv1ZxmF/mmHVkRTIeHkRs47fwKS+AzgyYyREH1gNEkuVSebyDo4OOg9tc7ywVi2f/76YTFNXTKJCvY1Y8QPh6qpTYPzfORS91QrvHHJwgoEdVhnok9RcV3JYCxBy8Swd/mAMPYJ76VnqRubB+WTVXYyK5VX8ZFky+P/9DZly12HS1tPoelMO/B4Gw8UsVcrWNyev/25D0ehIkv15E6JX+kLK/mxWwiqeET4Z9mpE09A/OW6a4g7zLAne1G0D10Q3ujJrIShOqiFvRxWI+agLpV8F4e/bEO68U8E+As4cYzqZOh61cF9FM4wNryfrhwLQ5msKoXsz+UuUEnzNriHN2p+8xOEwjemaCY+OXMTNW37CxBU7wfjHeLg6RhneBBihtF8pfky6xOHW72Dx0Hyq6nTmcKVTrGfaBRuWGMO4QSnq3tACex7Vo7dlHvhtPkkehud40pnJrFmyC5ff7KZj9kowd1EOZXtvwPyGRSBRYQs1N/Qp1UWarwYUkGz7ON7tMAHvTFUCaVdzGL95C/zSVUbJn5V4dkMr9AcVk45NNjh8kyHZ3xvh7x0xmOV7FISmrCGBvhPQk2INkhnJVLZpFr6cPofWyR8HgwOPSes7QbuABdcFl7OCdhvWzw6gaVNbSMnkF6+c9Bo0m35j9tMGLrYRBcEFRfBb8xVpRG6gVeNOYeqsl6h8JwJvrNfmCcdD+cjTUgq/IQ6c+5x8vXtJY/d1DnTfS3YpDrRLZRMunncc5dbE40GHbXBzqRh89KiC7rwhniodBHXhU6m/VxxPJLjDczUxeGd2mE8lxHK49DhYtUqXhOOK+EyqHE56U8uThNwhdPdVSvZNoHFBPbRyghpsF1EHK5XpHN72hjo2S8Cf7Aj8YW0DHRGHMf5RNbzPS+F3UruhN4fB0zYYOh4soKfVV3jL00voeUCW+08soNZ0G/gy0oODaxK5ploC+jXdOc88k0c9vUGeGvU0ZnskvxjbSPUPq+DjeGPUmDSN+konwrXi2xBbpo8CqwZgvrUiJF66gpePZ9Pv/FBKPlCCqw8OsUmkBoiVaXCflyI6HP2ACzcVcebEblLWCeOGQl9a8Hc0/1TcClJ7DCHgegW/dHRByV3HQS9AlVSX9nCMiwkFGexGu/tbwGiZGls9lQBJ818wc+gHCaVLc8g/IW4LV6HHuxNR958tPO3qhvQJXbDOTQcW3rCgw3JSdDLwJQt4a6PEwH7MSLeH5atdQfqHAb0+vgoXCZvAodBiTN98Av1FzpHyxmb8B2IoOMYPrT98Z/m0PPxyWIn0ow1hWMMQshc20cao7WTSdwXvVatR+ssScEk+z9N6W4lHCcDtaDEos7sK9pZh3LIgG842f+MfT87yi0+XacWkID4erE1ymm/R3toA1LaKYeMjTTxUZEAKZT/YV+4AP1vpS9MeKuPGXl/cmt/Lhg2a8GrmaWhU+02/f1aTkkwoBjSOZk/hdazn14JaZ5+BnO4mLBjQArt7c6FhH4Fj3Fc6pRTKggKX8dnMCZRWugBlBA3JZZ0CLFVCUNvhgpEvN1FVyjrYEpvIbY2v8VeJHLxVDIc7TzTwSyXTzyvaoLLxPATFeuCkSe5s/mwXVqe4U8ZvSUyTqqD0AHs8YfyCZ6iPA8WqMP63NAY274tA09fTcfoIdU4WMgANnxIa4tewwQ1A0dgALjwAdC4JhvgXGhw90MVhPzN5q9dMsDnoyD+HHsCX4DYc7TsT/KXWgWh2IBmc9ERdqEOFV/pwQEGe3L3dYYf+ISgdH0iBERKgL6zFEuOWwTtcxYqX9hMFDdDUsV58wzuQvWLzYPPaAYj5pAcen+wp6ZMOFZ+5gXVNB5BkAvD7ezn+ueIW2ud9oxNFh/ncDgVYZqKCOr912TCzmDrWLIKFxVFoL7Gf/y1+BZ2/22n2DhuM/6EA7Trn0FBiGh8d70wBZeYgP5IpRnIZayZf4fyUb6zSMwrPZWjBjnOXoVtgJXXKjqTM/J30QHoh7xnogOHvVmwveZpPan+hfdICsLuU+MyUAiz1vwqrTpXC1pfnqVO/Hd93lWHQS20+nxDHPTAG3qfLwgcZB8zTuI6WcmFU8uc+jF7yEpoxEL7OXEsnSIUuaJpAs88QbdOexCdW6LDr2WMUkjcJx7TY0uKoKFh4TJkmBqtgmKUsxB0O578760FFqZdNHBNBUEeVyg5t5Znz+mHP2k56ovEYRi6cA2LB/1HuiIOE6dmko2sG16PM+dL94+imGs6hnl6wd9FBzNOcAdOwF39H58G/Q2psN2hG506ZoFbaLMDFL/nOqg0gIRdP2qFTIfpYAE1dv59wzSfQd7bHuz76NEuhgxYOH4S1mrmoeG41Ko2fDmXzD8GudYpcfus0Trr2FbepnsBlx+/R1MbxILHtGKunbMbYDH348lAfKmeJknNVF/6stIfam/ps92sjJ56potFf/6Fm/RF642UAu+1ayKddhtZ9COQRrsOcOXQWZ7Y3QeoRQ95tokcbGlfhzXljYeTjcGzQC+CrsgLouCSNbQOT6YbSEFqsV6FTSTsgdUI0GE0AcJt1kgY8jehtrj+11wjRzTdWILZiPSavnsUNTY9JqTcALnWPgp9LgNN7TEAicSI3+DbyJZnF5HX0JB6Ku0DbNQIx+P47nFrJcO9bKkc4VaHLMRVWzunhza5z4K/IFr69rwjbxk0nkbFzOLNWBtxjk+HxtU3gEaLM9rOG8MccPwpYrU7V4lGs5aMKV+5JgOU7Zci5pMwyG/5R76f5bFdcDyNDpWjF10h+W19HATkXaO3EVAitloIDAkMUem43x7ccY4c9X0hI0JKDVhqAvv4xXpLaSQ/ebuanxQbwdM94aLfqxMcf91ArlmJGP6Hkndd8V/QbxARn0t6r8znxngwI+3uT42wFmHQsktXGPeCYOVvo4NfzVLmngCbddiDBh+JQNXcKmKfP4geLAqlj7RjsPWwBBl834rUZg/xZV4d0DnTyL80C2qlkCtMObIBlFu/4Vl4T7N+QwELa56DB/TjpfhTG/LWtlJbiip4mCC3vGjhWaRu1izfjvbRaTtwqihr5BmwYsJc/ZWuinn0tzHdUg6fVZ+lpgCA5LbGAFOUFaORdTxNNa8l/QIwvLzmAifdlMfT3DGhqWohBIknkWfKX3O96sLxnCJxzCKFPuWtIY3EE2P8LptcTdeHHpR8wZ+EzWv7Zi8f4HQRZjVXg/2k9jE1mnGE8Dz2CUln0lCoEjFnIF+46sdcPWYgIqSONrddBPs8GswRus73jBXzo/5eshBmSU4LhdrUOVFndhu/7rcAndgw03tICccV8fJIrSmv6nOjBmWnwZt8b2rZNkiv2toLlicN858hbKu4s5Is748HZQANG/hPmfwkzQWDLYmiPM6FXpQGc1sn8atF62l5UALtmmtLtxl1UFJuLX2ZMBDehKsy+Ywl2Dj/JOXGQ4vPXga++HKn4irBVw1X4s/s9xtkKQe2wNyR41vHMc5Z4TG8eecVX8AvhYBJy8cO+HRV0b04hpo9XhpaJZeDcWsqdQ8GwuF0RXm7/g0UXVnBaaRf+kcqFe18b4H3SDDiiOgdUi9fj3ZgkckowhG2LrbArRh5P7FmB/w2/5l/Td0LrSQWI/c8WrydlYcqG6eS5sh0XLG3npFkB3CvXw18OvsHE/4y4PkET1o/QoMI9cqjpvgDnzLZjoyfxtO9CEVyxL4a3jnepu+U4dbaIQ6XCIBb/1kTL7qm4JEQXChPnQfLDzVBaVw49FYkYk+nKIeenw6JQFdo5+gxL2/7mX1OqgNMnQfnacrodfJjCg3Qwvb0Jnp6YDuZ+xqituwkeJ4vC8vYbHOTbgF4NhjAY8QIGNxTQpbvLMHuiEAhGu6NCqgTPu30Id0cc4sDiDTTjRwxVaMlyQ+gwpPlY4rwbSuCRdZ8NSj/iX42tvCHWHjUHNsLSj4VkbTwDbeOKyeXibfDSkYd35Yl46JIfOa8cSX3PdWnEPwO4I70YNo2zwG7PDlwo38FRy2TAoDmRr6QL0yuLGIiwskeo+ch+/Jp0DwVj0Lc+MrmRRBalDLs223BC4k8A+Uz4eCKMrMoPcwgkcIG4JC7IjKQnf21wUs8YmNFcDiuNW7FV8CvNrUnEAv1OznofRY8NNWFqqClPsfxNsuNN4XhjHIYL29GxHnlY/qCGt05SwJhz+6ntsgM69JeC8h9lGpCeDbJr8+hfgBXo7pXFHuEOcJr+kJe928drF9tSpY8cJPd14OIsXZhIRYijx7POPDWIefkQk6W3oXOgHj7oy0GJ007YlxAKESXqMOPmGxrOeQvh34RQE8tZ6JE8rrkRS/cL1CA6Vw3MLpkjdorB0MHXeCJnCCzX3+ayM61werwQfyj9AOVduXTucSuMFQmH+UWjQf+CIjxPDiKZ3iPwQTEMzo0QQJmq65gweSVMmqCC0qd00VV2IqjtqaGC1J/83e0ZyB4JY2G3QGgb2IzL073gb4U5dhqNhjYpJei2rOOGnJ8QUrCTTZRCyUc5FT1N1XF9UQdky9mTrPZm2r1ZDmYcHgQTa8BCwWjUz/iPwwvacaEgYGa0FhcnHERz56fYFMmgIMr85KAjiG3Tw7GrLnF49SNyepaP1R1+0LXrKFetdIH/fkjCxastcHzBI/LeGQJjjn/GKYdeQkz/T54osxPPBP/hq/OvcZYrw6ngdCha1QrBrVV07FAcbCk4AmbF89Cuz4UnjlIBofHt/Fl3Jsy90cZJ19IobrwazNf3RLW6Afh2bSqt0UxnC5unNGVfLdRdkoQu1Rz8RhNBxnkfYYIue65x5rgN6pCo/Jt2Vh1GcbG36Lp0FJw1j4FH+xcgF32HvNooNv60Emw31/OgfBoJPovk8DXLQDVuAsy32gzPu6z4918/VisDevT0P3IvEMMHec1sqLeN4sx3s8iqsWB7cQL29GSg7oNlUHD9KE9VuMU9GmKwxNOc1s1V5EyTZBZS1IHwRmMUX7YSbuVfonOq5fhjpw7XamziEvXFHPtdFUOW/8UxW0TBVuc3ru+dQ7vfteGuxftpe505hQ58p68TfOjXeUkq2+ND4+vEodXYAJfa7yFR1+20eLUxdEpPwNUafeCedYUX1XeQyLlnWOYzHpofhkLW8GJIHK9LRk0E1QfLaYd0G86e6wC7FP3h/DRRWGmvDzO2yoCJxXNITmQWUO+gHqs0MKiuhLeHlEE0eQDC76RzTel4sM04CfkPVajPMJHUDyiR7psLkKsdj9NGGsEbwWb22PkOZvqOgCKzBbTmyj54vf07LbvlirW+jvTQUxN+lTXQguw/aF5xDllJC/b3/2EzkVT0tB2Nj545YcfNb/j64zWQq5qJnQaTKdtiLPz6pgCmbdOpSGELNBSXoXvlHy5xDOT3/+7CpJP7oFXxJtbtmwILL5qBzpNAlB+njdGuX1HJ5QU8svwGy2+r0Yxboly4dRBuO+yjOQvkIP9PMISG9pPE/QW8I3oPfuoyh4hnj0gwNAr1nUeArKENTrBXB7fbQMXDzuj7QJa8fcVgiZUiZz+WgXLvBrZNMoP0xgPY8EAGNu4IAiPzehqOcSLrM1PY9UgOK7T249CIbtwaZsjfbxxky0yEaxeyQfNCLr044ANFlm9p5qZ76HZvMo3OuAbv/BfRw763YHNEAJZuuc9lPdV4MNgT385DOKn6mhLGNWFmjANvjXtOojNNQcCbIWHEQ3goUUTr92fyotYYPFTwCJRGCsF91ADdv2twze9mWOmhDd5lk/iM40xanveanj+7gMLxhXx7vwHMlksjCWpEs4hoaKwcDY/Nr2D/hBpstJTmRYtaaG3eLnSLXkZPnvVBxfpBDtB6yCcL5GDnkmcwOWgXv7c5iG4NszjUaSOL3z2Iyr37SNjsPl6+kcIjy+WgMNcIRD7rQsurhTRjZwyXPfGCCTX+fEd9Fnz++h8+Nm+hyE8SoLDqLK0iPdha8BvzYi35T1AQCBkeYQmt8zjmZAx0y5rCfittKJy1AXRtasDkQwOomVlztcllLi1Ngg0nptNJn8f4OHwTOpUCZPQWolR0F578sJyuJEyGDj0NmiATDCWnymnTvBrwbx0NPdWj4H1fCTVcn8+3Uv+AhvAbHnV3OTX2mGNXkzgd/bSGyn450KL9RhBtWQO3tV1JKOYx5y/XhXd2bvyr0Zx3fX+Me8WO8DbrR6jtNAbWbS6Ah3vWo5viJ/DfPRasaiNxie1B5HXfGQvzOSzADaxXTQbH/A28eGEZWQ318r6iRfQm3gXftoXBYl9nHBWSycZ+KSz7awpIRWWCx7VyMp8zhURSttD0FZN5vGQJaz7IwqReOdy3bT7McJkK/t05mK21A6cbCuD3ohe8K18aj7oeo6fP88j26XGUj1yE7kEiEN78C5sEnuNEjseX4z9R5rgjNFX/FE8epUaXnnbCceciuB8+Dfq2tJGw7k9wC1jOp3vX8/wP5fjdLwmnTEwH+aAM2KTTzeu7tGGazA1482wyGy/P5F49D0Y7ZVhQG4o9c+aDkGQaJV805oca08Fh52gM71bmGcWudGfjURa5q43PyxUo98h9OCG3nLPTVPGnggasLT3M8guP0ZydNhi5wAeWXjjB07+K0Pc6Rzi35RS8ahsL+EQH1KOv0sTlNpRwpIJzPvWzegdQt0QqXtVwwcOislCzwh6XWxrAkrgPZDPyCAbnV8H9mTM4I6SMlhZIYeKPKk4xM8aE8TX4c5IwnMhV5g/HnsGiMcegZ5EkKNybQoMSTzlH+h3+qt7KF44q02tTYxgVIUd7B9poYdEH9H37ncTVA8FO5ytst95Mqp4r2Lv7P85ZrA1ynj74WqCQzJQO8jn/IfayOYSP9i7k7qE2Nkq/Aklf9nHdvtmQ9vgVZln8hTGqafBCLIQ8tkRyTc8kuL2+mo/lyMHSO1KwfK4ASIkmwwX/s7A6YhNdrlsEw/unQd/icExu+UmzlDNo35KNMDiCoV14NkZ1vMeo3NeQrG7MR0/EYXmIFU8uaMNBP0t4EHMV5W7KQsS+mWSw6xZtKnqE5scZKk1Xg3jxXe6peIiu+WPohJ8kzymZAV/WG/D4Vyv4Tu8aGG0mh3pvBHBPaBd5pVrgf+eTyPfMHRgu1oWcUV5sO0IfvNT80cXwEx3fGoWPFZ7TPL1Omj/JDRQ+aFF17CSwLnflkuLDPDirGDSfWLKBWwf0DpVw2wp1/DvHlu/9t59LvWUh6fUAz+mMAzGRIlh3+x14kC8dyDsEWRne2BxuDja+XWDlqAbns0KpvUyPtowdA2F1CShw5hrnfxiAwq3v6aJXMa6vcOe8RSPgh9M/XtelztbW16BlxR+0fi6OT5uk8FbHLTy1x5ZL52nglihJGHHnOWUVVMEx+8/8YvQ2zj5ygcv7v2N5WToZbSnlZ1sTOdNJBMTCxnFT01kQNy3kOK1Qtngzg1d81OGGvFPw+p0n2X6zo547+rDA7jtc+VpOZV+HqNt+Fmjs9YW3gk600HMWFv04RGbhwVSZLQ9O2RIQsM+A/0quhsPDPTycnozvc5PgTFgW3x+Wg7SuzdDybRxMFArFwW/BZGyRCEn/fhHYjYSPbR5w8fIaWPZZB7LefmTvl2Yg7vsWV3zZidKRH6lzZBnV39oBR/si0S9cgPxnZtBnpZ+8++QIcJC25Iv+CdARW4DBu7eQimwEWOctgxFab6F+zA1Odq8HWcGpMDDXkXd6uHNhVyAM6CvBEYNr/Kkki/e6LKFjGf/I/95Lnj1LGLYn6cKSS67UIXeUDdsjYEAvifbLzIXNz0tAbNQtrqosoSNbJOCjaw1uFyzjkaU9HCoejYsszbBFdphGHXLkUbeS0W830qK5s8HKtwKtpmtCj64j6QtPYfO0q5hyaRq55x3AyeX2NFhdjpemCEGc4C341zeC9rmNp9Y9oZxnoIXG8uHsflQV9XtvwtIr77hCyxSGd/7iO+WGlCTth5m9tSjk/xPtTf5A7bQO0Hm9ltqsW6FxiQDMXzmBVa5L0JmRC7BjyUa0dvjEl8M88e+IWgiqOQ/TbK/zNtSEmc92gaWIJsyPssTdprLwLr4NBbJ/YPrjzej48ivJHC+jpV16EPbnHh9dF8tNfl/B/2wIq/z3FC5nRqJHYQFLZBZyvYssL78vA9Nl/ejPybv4oes1tmkY02hlUW60OoFp++JAqL2NDwxvwpvfNODVGFGInlMCYdXr8FnZfH7bbwGX/w6g6WA7ToncSNMy8qjRyxAmfy4jY/nTJCRlAb2zmvCVgg2W16rxc8Nd5DzRCDv6/VHUzgQqYzfy8f4aHGqIomXSNjBTfRQnVZfAzeUtJF+3jXzqx/FVVxkI2SxPC5aK8roVznh1xStYMr+W11R+xN9fvsFe78XQsG4xCepPgqbcaH6kfY4Wiy/HzS0DkKvfhuNvAdlfSmIBu3z8zbFYXTIZxhZ+Z7+qOyx5uwktMnfBm0fSuHbTWlhwpZK6t4digfRkiPQaCTHTJMFmYS3V9Ebw187XLKeQC6v1/qNN+Tfw1OjzsFie+Ox7M5jWfBiFr8yDO8vuUfu3atr3yBlbprzCgqNbwOatALAE0pofAlAn8QoTrijj+ZfTuMq5HYOlxmKL/j+QLmzihLgIvlpRyQ03taEoVAbLknaz9/nHKFkijVcwimqCLsKKjyOgpa4Ixj1CVO/XgR+2bjDY+YTcZhSzwJtqXiq6h2Ol7kBi8xd++bEBSiQ3kFTlOKhLbEAKiOIFI7xZ4T7B8eAEbC86DSUTluNyoXUwYZUB7f83DTznnqIwoc3QXlfMBmcvw+ScMXBOSgYsVGdCqFMWeSmVkeVlTViv7E/WVbvBWewzPBxZQeNOCMPLKwfo17qnVKguAFYhjWR9QwISArwpIEuYrPv90HL2D9K02w1997s5d3chyUrl0NiG0zhx0yx4rIt4/tMSzGzbBbB9Ha0IzUDlrEEUXNrKoblWYPH7Kel9kQOx8os0MrEfr6c4QeQaXR7TEkP3Er1AYqwRmg6nYnbMNvhzQwkyV6uAVo822ry+zkqV2jz+ghSNGWMGphrGMPPfGWwubyN9VwO47b+Gb8rNhAPWgFs0NOFzvSV5HfLDad51eC1xPhbNboOBTE2QICPQORMLraN66fbZa9TyaBv1VMaxq4M89ac9hrkHlLlJbArEV+6CqMkX2TVNjNxEZtNT61a2z5bl5FeNsKjhCHtscqQFjgaQ/lsWfge00ZxPRRSSO5Y9jkbxqtk6nHJjFLsmV2HfEieI7FGG87v+Y0E8Ru5bQ6jW8ir0B4aAtJQnPnNWw/dqI+jcyzho6VCCl+Iu8MrJHQN2LKFXCrdBWHs0rc5EfpJzEoY8nDhLLxBPC4mA/Z0eGpivw+ZLKnimHnBmRDGCcSodzDhFJw3Vsfy0CbSkGEHuvsvodtOU7lwYAu+xuXzvZxmMND1Chn9sOCMb4cKr73Q7ThaCyJe0OkKxfb0Z/g3Mhtu7B2BdiSFXfO/k8P2neCA8Dfb+U4FZPl0UJLMQC4LqQcx2FacEfebyr89xTtFeOqNciGNPdcNKwTmgfOw391w5wm7ti+ms9koefqQG/mmlvL/rBEfEOVHf8gn8tNsADpV346c9y3HF8zSSP70SemyiwLpdHLqOCICCvDaPmlaH37Wl4L7edV4euBYPDiVDSrss2i77h9tb6thHErHV0AdPnY8GmyYTaKBGHCyTp3wM4rdSWaBV0Abtv4+Bzg8jkN9ihyty8mi0gARcDw6hmBWWEPXkDy4ROsjF9fasNM+fWXAB7FNKpo2T78JTrdEwSr+BDINvkWTrMzT0nMxDPytoXI0jBWTU8+LIu1R0GPnJZQG4v0SMTE8XsN22f+zd/4ujFjzmEU9EQNlkL46zroVTW9VgctJ4mMCjKf33eB5TdoXkfr3Acgt99m2MYKMlbmRzoZMzyv/xiQRtyPLcxc6/cmmeSAO2ODyHUTKBUPf0KD1zbqC+gJm8TLseL1+cASt+R+GRM8U8fF4chPss6PkvL9IXE4bwAD+KUJakY/eSOdOeweHqQpyc6UErbgRiyalDeOJpNb7buICuPzhOEvnBoPjLD2xlZSHz1xZcrxtBs6KCYFxVMa/dLw69H7topVoRH2vx48SOejy0QRpA+RI82X8KnmaYoFzlN26d2EWzh53gj+IpElzwDfp/+MPHKh0wvLYX7XksDc/3omNP1XD7a2/W+vOVDx1U4pKpybj383zquTcLNGyzceeCA/R2azfZJm8EuceetHBAnJsl3/P0nXdJRHgqyp4xgeAhZ4yYpMUJAiK86ZM95yS7wuElOXhQ9jj/zhvC4WMp+CdiCgiN/oFQKA/X3yZQminC0RI9+DbhLM/6aMvuzup88dN7Lq2cDF/z1cC03o4leBym9UqRn+VxnBl8DlP5KA02p1NK83hyHpoBon838Hs9P5iXfZcXCWpzcNJpqNxZwXs6X3DkDnkUXTObdvcowbuZvXg5oJpa+8+zen0buSoO0MYAXTQ7qAIfouLAoDYI88frQEbMU15SlA77J+hBfPlJunsvF3YudqSHB8XYofYi3TToBTV1PRh9eT8NhY1E4y9V6BlwjB5dLoD3pna0VnEOlYzKpsM/75PTGVEwutIFFRdC4XbHA9r94hkKnpWkweZwGpksTKHa4RiwI5L+fleGfZ2nYJSdJo+fkQWVAUL8d5s4TxNRhgUGI8B1kwI0BYxDgblycHbXDmpZcAJStqhAUZcKa078QkIP7tL7ex9ZfqcBt+NcurNjBjQNTwJN72xYG7+Sy67cxY8e3Xxs601Iyd5MGyPkYVSbPfm9V4L3wf7seUmbC8dO4UidHHhx4Q1eavbgKpsp1Ni9A+uKRdnwlDToH4ijB+NM0GXwLfSyEyn3P8epZercrmMIRo9sQTP+CL+oVYfPliko+siBzmzLBOoVRoeDFbDifQJuOz9EQwmzcGqWD7YrSkL9hs+QO+4oCKIdmL3bC2emi/D0T6tQdVsiLd01n32lDcGOZsKPD3epNfsOvR5zGAScxCC1Oxk1X62i+G9qfGfVR87tGGRjiTlwwEMDBKIbwdmsj4s3OYPVdgksUKshn6ICWFV/DtRuzuG7AcKwTDUet8UFcIrSNDJSN6Kr1RPohXoiqwW/hr7z06CmoIb6a6XgANtQTZI9bXfSh9wjSJ+yX5KTRxjnjviFDpFXoWLCePA4rAaRm1oxwzyRz+wrwRelG3Fe92x+Ht4ISdf+wJsdb3n1p3A0rTSFMNlQDD5cioIOjTTq217y1nRBu1438ohXxvZyIyg9W0lWMAI2fk/FiWb+vGLxefi9WQSt+5xA0XsVN/ddB6cXGrBqtgnI/DOGI1fS4GBLIog7i5DoPWc4qapL94XVaHO+A2htn4szBkJB8b4y2I8bg+jvhpf2PUa3q2Po26NdPHLOTrx3wZTnn1qBG1d+ZXlHEci1OoWPx7vC2VIVnnzmIkS8M6UOVQmwTw3jtYo1qNSzkLV8xODvg4ngPD6G3Ae/UWrdXiyTroTZ1ZZQ7fIdVz0+ji0V6/DWXzkYJ38Wy9+YYWyIPZU+PIxXdnwEvcejqGnXUqz3EIIRw7tZYJ4Y5PUXcUadHG2bq8Lnrrmgc9VZVI82oU9ae3HRjXlsu+0GbMIJ4PIyAQ4m38GGjIUodnoHX89Rw4v0B5ujv4K16AsyGm2Ppwv1YGTHOHQYKwVbntngvNhp2HQ5iksErOBIujw2/gwCESV/ur9GFezfxIL88UFotjoEsOQjvw5+C1/Cl8DT1n1kt9qPf5tOo62moqB0NppGxfmj52x1EjX0Q1eWQqO+vWC1bgBrT5dRmr4Ewllx6H0fDz9OHoaY2T9hm4oH/xBdC9tbwlE7+Ty+nxhNCdcy4WDTJHCMMoX5c935jZoA3B94ij/q9/Do4ji+aixBmyxaaONpWz7UJAiZQ294ebE47R78zO/XebNXcgklCOdTd9l9qh84jxcqYkkuVxIyb4ynFyLvwE3xL60XyKM9h6eh9sV2WpkwiIZzXdi1tJucFEdAvq45y5yZi/6Pw+DvmzDUuX4FgmS76V5RPR1unwJNVxpojYoe2Iw4we/Cg+DykCGeNToPjgIRXHUnFWSMJGHVqIWopTyBprwfDbUyCiy14w5fezoPnIwNIOXfWTbc4wju2UNU1HaUvi1/DR3vzWDFu3jyLFLB+7Ei7DCpGspkpoOyhiOdjB5BS8M/kN4IM8hIVYAt0/tJUSSCB5KkELRa6GrJBHgYokhi+i5UyeNRcI8aTgvXgn2ZLzDUpQxDL13hz8r3+ZCTH1y+uIYqxmSzcGYrXa+TJGsrJYidLA9Z34ro+4Vcuvwhna6JpYD6A6C303+B+b0MtmnSoLksAWPfPALHvz5809aerW3kWMk8nb1ip7NvpAlERV4FF/XnUGktDBErT2Pn/GHQWfISJvqaU9DPF5SlZ8Ndt4bx9B4Dfjz+LCT3TwOzKd/p0lVPPnq8lq/G72ftlzs4wW4cC0R1g5tLK+sclmI0F4ITg1uoIMOFopc1cP7z28hR3diYEQfL5brZp1sW3oQ1w7PdujA804gufShl21hDnKQZjC+6L/Lq2alonNKKAeutwKB5K4S7KMCHjGqc01vNCueV8L/pc2n1LgeqyflAn80L4Nx3N5zeNIu3DRpA6LFYvPF5ENu1cqj3v33YWXoQ3UzeU45RCN3M94Zfk0x48hwROPy1mio9b3PgeX2+adbGEonr4Ois5ThYLg66Jvokn10Inuki8HrwMK4cJURrDUfhmCvi5OyUB7/kQrnYfSmsUQhgW7OJYOUpCGdE2mBpthV9vG6A1nomUHdRgyYF/YXEb9vQ5K0Cnp9Zhn+N5CGzyxhelxXAYLYmzK73Ia+8IFbUWI5jQ5ZRrLEb2vFHCvqnDdOfVuLOf3t5aH0TJAaU4oEftyHx7n7KOhlDInvHUcPAXdb6KAHP9Tbg1INaOD/yH/bblLCBw3J8PPiBTo86x2pFD7n583c8c0YbSjX380G5/TS4WhUXHCrikB+H2b0Huaa4gqJjOuH89mn01UINNpxNJkktDc7eshYb5jSSkFgArtssgkZLImHJ4kYoWjAd5Vv0QXFzLUs1bmGb0Q/5fMxBPJzgjw25PhDf/Y8N0mfTZ2FfmnOWofngK+jVcUa/wtn8/u5p3vlZhoJX1qBQjjZ0rTtNwrPC4amuBHhPDYF2hR/kOcIcm9sSYcdWMbb4+A56Jqnxn4Rc/ht/jG39BMFIZwTNUf/N0Z2W+Ex5A9bJV0Lqlh/0ZdtdTv76DiN8CbdFSYFX6X7UKizGN9sDoPD2LbQOOMYf7ldT4PTrpFarzc/m3OQxh2Th5O7P9PziABZP3s6PQrrJ2XkreB+PgFNSsTDbUwtbnrdQWrQ2fAjpoIwjDdh4qBiXJF2EUyK2fDG0GFerm0NceQIuu5DFKiUzQH5hJ0//F4rfH87gW7VFtP5DNuq+2QMuyQlctdaOwxYos2OsHNidVsBnYh4oUz6KP83KgvT41bhbOh2DjG3QsKyJ3Me0g9amGSB06ASJyQTRl/P69G2EKpmtaWe/vL0cGzIIV9f10svXzTS4VQFsVCegW/sS6L3xgk/Na4C2kJtgecqUPsRZ0kV/MfgtdROqoqQh8/kTdvttzAYNDDsSK8BwoznfnLwPXYzbachjB1xwHovmXxHuPX2C2dU/oDkGSfZPCEpnHqWMA/dBYvpuntU6nw4aKPN2HUkQ+53K23SPwwEZMyjxy6CHsvV8t4cxZf5D0J+xh0+Y91Fd1yjYckuJPnq4UrK4Fi44mogjAiK4qUuVL7T3c9Wpq7Sp+R1XrRsN3hJfwOGPF8ldjKalrsQP1T6x6OMP+HOCGy6cMpZSo6dCrgCBk+BDTkl3RZmPe2hwwkHUGHMIks9HQ9b7ZC5xeEJlFkvZ3FICvtppovtnRxjqkSPXsHpYZ7SJT6z9zVcsN2Lvh5n4K2oDfBg3Gib4F7PbbQE+8G0CPvs8gw4G5nP15kS+cFoFN7oYQ/exDxiboQGN7h+gwP4QNeckg5iNDk5Z+48it0dQapsmf2/9haOXCEPsy4nQqX+JM++oUlKID9yrrwPR7Ke4o0kGuxs+kk/+SGwtOg3701XhbcgIdiyfwGumniChKac5dF4Lx6yfhm2TZ0JnszVclreBgnvjYKyiOWwuPE3eCpcQ14mxZWQp7/9cB7HJ8Ww0dhqFr5zKw2NFIWfwJ7epefMvN2N88S6MQmIWQ3e0Ly864oF3o6xAVPUXSC1Th5O/KvlD1km4onQBk6KzOf/GK9pTVsvzKmah7mE7HjfwhRrfG8NfwU3o2xzMr3brUVHUBRrtoYt3gx5ye0Ag2+n0w+vpjnygVAPOnT4AGl8kUA46aWX2M4z4HYfN0inoflgAbILfke1xV0pYPB3Mmt7xsnRLNkucDsbHLmDhZR9uzvsOSdbyoFk6lSLeTOStGdIQnTyHtWSaaYeWGPQpf+aVrcNUmS8PYw58gOv66zFvTxUtipaEZR6LsG/NGmz5chvFIuPgh+gz1jx4kMfJGJHq3jfsYNIEtxomwGUqh3EuFiSTtYYGcytIXs4XZl7cQTNEXfiuoxDdSX8Em9ZJweD35TwHFtIX9/H8um4MV6xyxRnTp5LNbHtQTN0IyVPfQc/KURDXOolzd7RShs4D8ko+SQaKXZT04RnLe5lAoGgkWvhY4Aa36SC9L4NPPjTgnr1v0OTlNj40qwZcDhVATP1qatM5RLsXxcP5v5PgNT2jx2q74ExOD22y6QGh0V/hsuhv8L1Vhue6xNFRvAVet0wGnd+X6Mfpt3i34w4euzcVRke24PxIS9p4pQJnFNXw8TfLMbRvFmwcL819TzZDlu8u+HZjIwWv1qFHehWUGHsStUNH8i+jQbBsVwTVKTvpyuVKDNuoQTtSqqhh+C68ECwjU18diJ/XzupdMeSTIAsP1dLpruNVChC2w5oN8niprBVGRMnR3R2Hcc/QZg54pU15Xopw10sKrdc9ZTmNbJS9kAbpO+3xxf3ntNTtNhsaLaMTMQVg6ErQZn0MG4Umc9OuW2SVLcb+rSb8oG4LbWkj8MjyxK37E6mowRT2du3kO82a/G7VEZy2/grnhw/w7KPpkCGYz/Kf+0HUehev6waY9fEqSt6VpDffK+hRRwmK2lfyZr+FcK50COdLxsP1YCmWuCkAyYXH8cijHsprfk9hXRuwul2aDaEGZoY1gdvlQ+Dur0UTgnVgTslZCBkvBA9SiFflyPP93o2sYOCOxzbcY1EDU1Y90AyOhYqgnHcfww2rSe11KGr+SWObgtFkuKcOHEY+IWv5CvZZ5IHpgipQ8+A3zX1ZBSndx9hY9A2XXw9DozZv/jg4iW5ot0H6NRsQWCsFD83Wcll5Fs4420r947V4rWUaa/fuAb9zl3FS6jc+K9bNs/aOhBPkCApSRLI53ZTW0Q/oFIu7EyzIfF09WoR48dHXltReKwS1B6dDw8A9zv5TC41+jrz9aRfrumZA/LA5JV9BrDl3Cx8L68HyBDlyblWgEWVGPA9fsXXESxohqwr6nkegq9WVfwknUsZ0fRgcWQTr/Wog6WYzJpqlsomiMiyQUuLvNc0oUeyC6koCWKs+CpI6YuhoaTA5a4dggK4Ajs4X4e+8k92DQ6HZsAr/aCtx53spWCsYBvYOJvx6TR0rl0tQbeQwdNy6yEOKHixT5wXtdY9AY546VOkmo7rxBmq97MSnLIdp74Ux9PFxKR1784w1IZbnHBWjqTKS8CxKEC+2tkFfNmDiV3P8FzoGOzrscOrCMVhVUQm5wbXgPDwBxETfo83C5yR/yYlFN6ljidpddNGw5GdHQ2jBSWEOq/aFG9q6sOuwKyi+BT74yJ10ncKwcKUxt3o1k9HYFeQmOg5Nn/wHumgGl+cW44VAQ449sQk/un2j0J85nJseDpHzVmJrQgRY2NzDLzvVIagyj9XWL4JXF+L4e5oEzR/SxlpRQU5rCGSXzSX8Tc+HJSWMwLxYlvSkXVmy+TZsfTOCWkiTBHpTaMWvDFxV9BBbhy+jkrUEpCx7hXuvPeWWcE98mq0K8tGbYX1gGrqbfcG60yu4OGk9jxweB+X1N0Bt7xDIPTTFgOO60LWhg+6MD2Dpb+vgpflZ+PsomyW1Z4Bewz6oEDtGzotX8seCeMB3y7EsVxYqtLbw0fjd9HncMrAoM4IdOeFcFFrPZzYcpMzGq1SdJ8ypA69YKmuAtxeH4did++lY8WSozw0ldbcXdO/3Jfqa/5zX1d8k6eAcGNLMwYUGXrjWSA3j81VA7G8eWER/g70TzuG7W5p4Yvx2uP3nG7QN2mNfgwG/LejiWUdngeUrJdj6qBFPLV1CK0Pvs5utIE/3NET3o0vxl0MqeXmthwlpKjBV5zYtdo1jb4WPeP3oaRTfWAb+u0/h1GINnF3yFNwUbuGwrwrUirlz/YqfNO/MYlYuU0EsNKT9+q4c2LoPnnScgXkOLZRpbAaT45eisfkTCuN+VEwNpVyjNKS1FaCi8ZUCdAJoygRnlDWRhEb/yzxhQRK06nVBY2ouJcleo365HeQ0UYdE/97kI6vf89AbXbj+vZnVd/lBjboVeqX54lGlhRRXMgkWv42lj2uOwuM7gzS8zRDWxrRwydwFFPj3Ezr6DuBo5Q3wzbaChpwqobdblO20VbBDbjY8rv7LsqoCqKr3nUNWufCKJF84FvgDNC3c6cPENZhxyxger1SH2+Xq4NNoxJsWbcT1d86znOkLOj85h/4TPIrKcA2C8uKhNkoewj2YV1Va8rXAEqyJMaUpLsfpa7Ut97/R5JP1OSgk5wxW2+VBV+oR1G/rh8gCWzgwWQz8SuYT992lL9cyMXnIh7WrWlA0RwM6JjvQxiUFlHJZnz9FE8bOraHA+A4WPq+GTcEzoFh6Bax7S6Bt5oU/to0F78XxFB94CT/4dXJNahO+nq4NXueU+QseZ52JChBcJQ2zxiylz5wMds8GUGf/NWx8qMNgchhaROxhnmgS/n2hCSZtl2nJnly6GqHC6r2OOHPMOrhdJw8h0ulo/+Qp3Qn/AlalyjDPUAJWzfdC1eZF0KoohnHJQQw0n4/5l3Jx8Hz6teo/mtZpCJ4LLAgHkzhBLhhm3O7n6nAZ2G4+F4yOXcItPqKslH2E518dCZbv2+lrxSIKjjDH8H3vwO5cPo2/UIiSd2xBXtkKtqICjrVXArlZdvRiRSbN2C8F0TcycaBGDGwPV0JPqCC6J/6GwsA5OGrnHHDMmwSx48R5eOtdkrT7wrqr3lDRtx1wYOEOahtXAn2tkRBcLg6Ff/spde1JCseRaD+uF6MsjsIWPTmye3mbbidM42WdV/H0L0P4usETnEJeo+6ifOh0+EKHzWu5t+8GBeqowpKR1yDGRQevXTMFleZvHGPrzRteJlL0xEww/x0MhYmfeeq1ftioMUT5579yop0WLM06QRdl4vhPQwAGpZvSi8BGHvOzhU7vrabd/ja0+FkvT3w2DkLNhLHwZgruc9AjJe0QWlh1i2XWW9KUe828Nl+cqm7qgY+uGRg77sDai2/A9YI9TnQNo+3sg+7BRfj11Cu6+/0BeetaYUvgVAgWrUatxi340EUDr+w7jvVWYrDYZjTJdNzme07pwM7JPEXSBNKc16OczGLo71sJOHs9FqbOYdGmlXxhWAn3aPlx9+Q61LGTh6rVQ+hrdodTuw5RWPAZ2n2rCIR2vAWJcx7UOFWenMQW8jlBFXgQ1kzJew051kOLciZ30AkLIYw5e4Bcfilg3eF2vLR4Bc0eBggBLRYY7KKgonZUigvjeNVVlLz1JZ9/uQV+mqXSkW8iaL13Anyd+Q8Vu9Xg+KPnsP3taYg7uAucd6fCmfcX8OboWHBeGs8nkpRAUi4Aw05Pw2E2w9j338EiOpC9Ly/Ft3IScODuXB4qvcgfBpThjGcsxZx0gEAHfV4/S4ZdlzvAnDFt0HtflZreT6bhqwbo7yEHHcmL6MCpI/j3+GMQLimi/15VQp10PD/aYkQXtxijg8VWmJE+BSrfzWat6mU05d4aOqHiz1N8doJjdBa8bT/PWS7vOL/uOa/XFIainiaaK1EPD6ySwVnYmiXqt8OGZzP5yqEwmL08DAfOC9EBFxkwbS2g7OCtcFM4ANJ2ZEFH9TUeOFFM3mRD9rKz6e3LmbhkrDL4GWZjyblC7Np9HoqHlfHp/8TdhyIQihoA4H9QRtkyQkRWlJFsSpKGUhKFUqSS0qKcJklRkhYpaRFSSSRKtJQiJS07QpGKEEL3Me6TfL8GcFr9QlzuuRXLsjph+5MEkBoxDrx3yuB3u8W8V0aJlSTusciHLKwcGQhLmzOg4fwDtHo7jH8OjIabCm8IKyfSEok6rCycgqpLn1Gd1i/S7XzA/k674eeGC3SwQRbatz+BZ9/PgbekBY84rIWTl16k5tiJfJi/g8KTzXQyFPhsszxknviDNGcmPI4/hZ1KwdThbQppRWkYtDMfii9+ociKHTD0Qh+WjrfksId1cGX7PHxwfwC2uWZBh+BOmH71Hp6t+I1nin+Qcc24/5v/u/HSR56Z9oCHtBo4u7IUei6X8MK8UsbXcvzpUCLuWr+LLKvlodS5jZ4uXUDXb/nDpmyEKJ0G8kv+hSdV1uIRh24871bCW0KswFOsFv5DU7IL30m/cYD3x7RSylQpeLvnPe1e3czrFsvAPLvxcDz8An9yMcO6MyPo1PWf+C94OURlh2Dt3NMgNTcNusbNYjkdAyjXVmInpSocO6ISF/oYwMkZ4WAnZM1kEg9NqgfQQKgW5C/Lgoc9wJM9dyF/3RQY93QjqXo58hb7NB46UceBVcO47f5POCWhBFBRTaGir0jSNZzr5SfRQKAC+QT+o1XeFTxVKYfX23ljf480zD7yAcQUPOmf6iC+kGvFN1q5VKWjDQIN16BRtBnFT3fj93Yx+LlrDOw2VeOh4F9UJSYKCd8HeLtXHWBxHYzuRjYXbqTxotJwZXgdeBTcotwPfnRSIR+2GgaCl0gxDKYtx6CsFKgsSOC9483AqRbx1ZkeMj+zmPaXvART/xcwIv439cZYwcpHp2CimhlgugwE9gYylCnC10P1FONwCgs+fWGvT/tIR34+OzR+oooVAnTpgj7YKn2hfyPTcNaXP5DbvJDPjllNUdV3YWvvOkDfy7x01Xd6IyEEyeem42c/NTxl7sdV5uEom/ud76YUUnRMCqwOPc9yHuPwaawUXDTRwNCR6/m48Gd6dXIeREnu4FITU6hb7A4iO2RgqLIKlZP0YEBlLob+nsOhEiv4nqs51+5NpC8J/ty3/QOMEc0F6/d1WISiUGK5lsd02XKUZiMFlCnBWwMdrv7nz0dz0nhNy2zOcW3Cv8KacM+yG7YYLMJlZzP4o4od+uWtptVCP6Gjah2N7PlH1Wd286NNIiD/YRo77XiGTxS6we/3Fbi3pY3FShIwqjsbUxdHQ+GqbNoxVgFUpAJo6/tHnPc6lxRa5SimegSN6NDg+mXvecMZH+j0SIcDPRrQcuI7vLJcBfCmAvwVlGHD14ngJnKOTu8T5GNR2pzzZz082TYC7G8a865b7rxAIJ23BCVhStty8lqoy4OzclhI5gTfCZ2Bqsv1QTgjh7I2nOD4szE4hWt4l7Qo9az8x1US8/B67x8O1v1NX3vlwDLEg1x7zmGRfg7N6ptFyacWkfOVQtiUf5yU3h7hryt8qGx4HPzqt4SX9zNxw8Mg6GqbRnxaAZ3KNvLta9uxYe8YKJsmQXp/jOG/Kw/RWOkCdCs/gcIb84Hi01HrbSsqHhygbznETy/8pS931KBshgds6U0itc/p7KZ5F549OQlGBT3oPHY0+nr6g4zgWGgpmgz2281o3sIl5FoqzNI7DKi5MB7e6swm6ynHIL57FHW8V4TEEQZwvfkpn46TxxkOAMGrJtOS0NlY9WwU3FxogmPqjMBePIEblNWgdXEP//28EG+6PkPhfkOa0zkDjXvPYKmmJog3/OTI0AmU7iwA2xf8hVWPbfhv1m+Sj16L/e16LI7mFBUlT3ajVsDExzdRQc4IMq65wq2IELCNjUMPVR0+9PkaVbWn0J/vU7ExP4cUMpRp8y5ZGHPkEmw2Gg2OJ8rZNPUXvFDZwtKqsTQtU5kX7zfh3RpCICmgC0dGX+L/ZgxQ04nrvHirNDdOvsq35KLgzusSqkoEXPJoDJsHTQFn5yrclS+MjVq5kHYuH4ySG+mg3UnOSd+MI9eP4vmbn1PMXCnY8Ow7hITdgS1PJHivggbLJc0iLZaguiNj8YF8EjxS/0WCwfoQcH0f64mFkonkcjK1/wreW6+gkuZ+XL/nPIgsz2Uc+5Vr3afA7UXtZNgyAKWT9CGz1YlbO6wgbPJGGHW+kiIypWjat/PsN0UB3mQZ4gbTHSj3wAdHPakCKbmf9KxTl+6emcZ3rxdjeUo/yk4RhpoqIYqxq0NXI2l2v+kBqwWdMOo/E3T6MZevVyxGfEXwUlkQ0r8+p/2yrqQbZ8+64YOwSaUV5YeayVb4IYSeTcSNVYUodUcHtD2n4+/wPBhO9oDSa+L0uEEecgO2s19DHjQNT6ewW5vwsJUunF4hgJ3zrVBzbxJVjC+CwTBfmDXjHsnP+wareBo0Zu3Dc3tHQtzOcpg9rx7q9wmD2LQaOPI2n+yXNYHDwXiUGhMOGyVNIFtQDKT9U+DJcQece/48GF49RCcyyyk4cDJlvjai9QFSGKmwBAJWKEDGDgWS+pQKtjO24DxMgcBvr+jciPv8ePwkittgj9UWmZj6zQbemQdDTv1FuvjJisL/TqXTPUV8JW8/2fd3caRGON3eLYiem6xAP16F62LG0nnBlfD4SThtU/4B0UsHwSMkHTuqZkP3SjESyxsPVBIP67IsKCbiO4YnKvO+Y3Kw8VYJqbppQPG6dTxj2iEes1cedBqO4okpDRSftQNaU25AwLsF9CeUweP4cbY4exieTI0iw7+qUG2TyDNOj4blm9z45uq3kJ+cQfZfV0OB5VZYk3WNLh54DF7zVaD0z0K8JfqRFhr10t7touR0JBnHhBCtiJkI5c3HYf3IhZykawzxl21p7fFkbPZYxr1J5fzZXYfmVg5w1aMieD8hh5ZVeLBdvjY8FJzLCblN+GLpd9Qtfw0Zjv24YqiC3lXUwgG/hQhXUnDwlDGULEqmMAN3DHAX45L9VmS6aC772ufjmEkt5B/djiKb1lN+oREEB0zEMeVLYfI5F/y7yw+TzwqgfqwrLJteCTfHjuYopWsQaiEMc0N24eQkLzKf7cNz8iWox6wFRRaUs67uFdzzYDx41YRi6RstOKAnjJ7RZrD1RDXN1BPDJ06fYMG4GXzE+hSHvDFBs8gJ/ElEEE6sn8FhjssxKeYGT7roiis8avlIuATfGCuAignqFNauRH3zRaB45wCFXtTmhf4atF/IGK+OeIE3dWvos9oQNf2R44G1b3DnLiGoKZ9EptYJ/HzdMhS5z1Dj1wBO89KYs+aDcs16mPTSleU3joPu2BKGdVkkGNDE/o5XIcpQhyMFS8HvyBwqSSnnXoP7HGA3BQa+S4Fhbz+Z2L+hcBNlij2ogvfUJGieOmF5kQfsmplGb+TUYLJDKMtrnSZVNxsqTevnhwfuwMbNgZzbEcK/1vjzWOeJEFM/CnJDLrLFAltaY3KMCupGoOOrSdzSe5knJ5iSeaEiOOvtoEI1CQjY24fW5Tns8WEFD0WN5kT/l/zJNp7ej/2KgmN/8ek1y9FnsRxYaI0ivcs5vKW7H2b9zQOTTT5w0N8PXMXdcK29OkjlLoF+BYYRR8fhDc8qWJ42GseufUeKc1JBZOojai9ehlI512lrNWPLM0FQCdgHK3TGcZ/CHso7/4vWTT3BclGbsOz9CIwzU8W2J938+rwtjJrjz+YDG0Dw3CO2yxiLn32c6K5RJmkdaIEopSzu/n6BBd+Kwsa0aVzZvxXMVLzw+hkVtr+0Fm9aekDyRBeoGpWAYCyB7w5PBe3zt9hWtBymlobAc3UX1uhZRQ2vrdBa6gK9LvuCN0v7QOvbBJBxe0b/5c0Fs2ZhuuQ8hjc0+/HT/cH8zaUGq0/dolNyS0Hl7ii4FCPLd+UGMPKXBnRcMIKMlbVY8eEHLE4ygyuSxmw9fj7tG2UFw24j8LVLMJS+CMGtWxPZsv0EZEVMx9wZadTRYoRb/Yp4x0RNcFXewuL5F0mv5TXaj9+B2ilC2GVqx57fvHml9gCuF7HgnPixsNHmKYkm9IHFoXJSG26kbcMlqO2QDk39bbxD05JyQnaRdLQOjFg/CiIDTEHL/CnabvkKojtmclqTOEde2kcuk36ib8oN/poqCd1WQfzz+UqYPrsQBVe3olVYDm2P8cLqOUf5wBY36vsTyJM+E2xrrYZq1TT+HPITp9wLIqu/q+BeJGPH4kU4LaqOHy+fS2/nGsLF0v3wuvYvO956QeMPJHOnxzTMFDWjq5smU7WvE2gOHWHPvxqgdVWVcyXu0uzbx0Fk0ltaKzPA/+q92fptFHrfGYmhJifBAsXBbowBy078AHXR42C7zVxuNs7Adfd3wxiTX0guUtyiJc5e9mqweNEuWmSqAfMmhODWtZOoW0MBvpjJ8uhrM7l5pz4cHIhk319q0HEknTPm/6GyLTXoplsMG6ImoZZUMNt6d+O7HZ1Yv/MkCLgrg5f+GpCXP86HcxJhw9BmvC1qizPxP1wy1xI9fTZAngrwgOEoCAzZCWpVt/jq97HonxVKr/ZpwvXFN0jr0HM6GZ8OPbp6uHeWEejufouDmQ14bMFqdH+lic2fJ+KoXw2o5igFCwXl8XL6ddYtNARzWYI69a/47vVC6j31i3/Mv83P84+Bq5QzrIy9RdMfFkKZlTEs9wyi/gW3+aHKDAwwVuRqI3fek12LSzeEwF2zmZilH0ILVGTAw20lHEmqY8c7OznwpBXPLleF/PqJKD80Gx0X3aOnwp/53CWGNUFOXL5mFrpPDuO0I2V8Tms1Szhf5GUnCPc+9IK6j83cVTMWplQqw5TgXHoVOMz1OWd5/t0a6jMex6NSZsJZj+do4PmFF/4Rghdqc2DQWIC0RhbAfttCyv/cD+6HN1BSZjo+zvGE3OvJtHVgMvRq/+GSwtnkNTObiif04bOu+bhxwVocP6jLS4cdoar2C4deE4fjWdGQNmzIL4QksbNNkTMv7ecPe1Vx1v0Oiso6RQc2OlH7d1lYqSCIyeIKtO/8LvYUW8wlEZJQuG4MV99YQmLnlqHA89l8XmYK1OnNplEyd7iq/DmXbx/LGsb3yElLFrPdX+Fxjxa+vT+LldfKwmGr2bDYTAN06w1hQstudD5zCnLGvaGAZ430J+c3SP67zhVfxUGtyIXtlUVhW9Fnlgtq48lGpry++AJnvRtH3uvN4c+tJrwaqAbLAoNpU7o4W+JCuHZ5G27yP4G/1cqA3rQjJK6C9y99OF5cDCS0lNEiXZOeyLXTj1+DrOP6mA1MntHuRHNYlHEK2yVj+HL4eKhyIj58YBCF18jD0sizrF5jS9Kvx8BvE2HsPF2AkrEB9HyONOTONeFlK6aArI0vmD9WA0/JjRB0Zjw5bheBzV+WwMgp/XyzWxHQPIY2D8fBBlVlln3Tz8UtM8BUYy1N3fGZKx1cMTzRG4e+ycDVoQP0es0AVdRU8txKoJ5UMdpTY4VjW41x5Yx4ttJPx6nZ6vBUfjEsWGLNnv9a+UHkfHyUeYZ1RxfSh8xHMMVeiAphHHS9kwW1tyb0q7IPws6k4KBhBM10bseKkiawak2H0nnfOXZzCPg/sYXiwQ9ok9wPR/eLY3EVYfubo3DC8jSXu/vD+v7duHPQBz6/MQSXeT5oob0cwurH8EfdTVA9uwvsdaSwLEiSevM+c31aMEkm2EAkyMOFQ8u5+OkMUGhMp5YLabSapCBi5HrolW6HJecXUGaMGMSnO9M1l2OwglZi6zYBMDb5gLcbWunote108GY2jY/+hqN0tcGpTItX/cwkf1qDUr99UfzAfH4SWoBTbyTT0pOdUH1Khpvq5ODWtGPo8vglGEuq0IrUYZK06GYlUydSumPEmdv1yME2mA7MmAAKiwLBZ7YZWXslQLzAKNqdnMt713xGr/srICFRjx3CD6H7xLFQeLqYNyUdpotjwqA53RKNVrbwAs1WcNliSgZtlrg2bgsGuI6GqjexfG9RCJ+4Hghfy87icoWDwMeDoH/mF/haq8eDtq34W9gI4u+asfRwD0+eu4BvanRxVmo+am3zxuRfxyitW5aXiZrB3TxRkJTdhVmen/Hzgs2wJyYc/oYtxxGpkThBr4j2ThCF1LlesHJYDPyuzSCrdSv5SMRL8v5iwjLXLMCrUpG2vy+Fp569fENpJGvet4LOnEk85dNzehUiBPpGldSx2YRsFg5yvvFauu2pyDN0LUlcUwM8lDsoapM6vDNN48OxfWzcd4eX/OdEvlc1obuqlX46VmN9xDgwaNxDtb9LcbeNMW0dWYEbZKchXmxEIeMRnJPxHMbsPMa5vzQh0UCWG7Q6qCbSGLovz6au5Om4NLWWbi2xAofoA3CqIYzbSvQh0XYJmWi7UWL6b7TRXkJrdTfTW5lhftC9DI1bv7Bj4hd+tH0qDMbuY+EtRpi5YCpkvDOljJFhnK7/C5Wu2YLwDFvqm61FER2ScOF8K8u9/02eambgWjEAzWnLeVdUI8xTDQTr8kXQUKOId+9owZIJ/8H8aT9hi9FPNlHRxdoXHWTsrIKZ940wQsAMOgTkQLnEEuKqL0LppXCQfB3IPaU2YGKVhUsCN0PCWgMoGBKjtsgRoOeuDo/imklugSB8v4bU2XMeA1aqoPvuaaywvJU27UuCB4W3OUZVH9SntcKfC69wnsRLaAMz/g9vkn9zH1ZXOOGx+DkwwsaHq5uEYdz1h3jWSg6p3BzOF0hwCY2CFn1lOpyhSTpzf9D8gQa6E6IJdRMc6JT3MXD8IooCznX0r6SIxFLz6Fj/f1wtPQurjXrpUJ86fO/ZzN4H8rH45Rc8dKKFQqP2Y17wVK5xXoT5SX7QQw/JyVQSDM2H2fF8JMDbSrpbdgieBb7mRjEJrEqcRqKujL73JfkXmUPPyB8gMmEsyhW9JMNP+iA5IpSfZDrz+cfVcKKngzvfdmHlOB3QuS3Bs5Y/xLNaRdzr9xiGisxwvd8afF38gUzm/uX52y/BQOEIeLkgHWvDJ0FyWzMcUH+LBWE7YPsKY+olfdgio0nOKt7k8AlA+LICagRtwesvp1Dqj3jcrmUBMrGD6J29EWWKlmFHyGiMHisNH51mcX2sL/loloBD7CVe9uImLYov4A3eR9h3/xiqH7jLkCQPw/kOUF02nbUiO7hSwYQ31hSy+dchaH1Si9Ul6aD8chwUh9jCnJZynGe2HmJPHibJzXn47/kUGG69BRYm/+H7y2ncZxtN1n56sOe0Naw6qwI9Dhf5cONsfLMtkKPf3cOKcwH8zGMCyAzV81kRG/hSWEjV6/5wxIcftORLMJv22UFNrRtbd4+B6SkNvG7oGu8eGgGDd6t4mvgYXueaRhE2zqhzzpEqDlex2rxYTtR8heF6GTSgoAHZa7L5z4ASfhAcwmNWcfSmMxue5nRxZdIi3nSpDZQOuOM9iUkwPauWePs8CLr2lmSe/KO3fYdwylljSpQwo+SRRHdS7diyVRSOPVkOnquvwEznEZw5dIYPiJ7iWeKL0cHWHcQuS6KN/wq8QdKwwTkdExV/k7YWkNbXMBjl00oiW3+i/LQbtH/nXsxc74GNzdow9FaOLwVsw89He1nfv4ZKXdfQdBVxWH7TCqsSR4Ki5Ha4LyUG7zxmwafKYRa+Ucj3jq7E0S9byOS1AeutCaMX0cFoscqNWw9owvHqAqwrNwZfG1d+uN2PmpStaH+YC7+f5494oAaPbhTApnBzCM8IRLULAmS4dhMrzEzi44MyPGLFAAr3nOSuJkkUGkxhrzRFuDnOjrvyNuPVWQvx4OJANqyNxJQda2BqgijvPvsP70w9Q/FeuiBjpgbHkorBv8ILk/4tovoPG1i05iP/jJmPPjLRpDSviIMvjoOcsXVQeCEIjiYchOpDKXB7ljD8Kl7P2nG6ePP2I34sGMc2/RJwN0iP17e34/2AC+h3PJUT8wsweHAqk/R8WHW6DWqCnYGuTQY30If3mv6ssMSK25dY0NDB1Sww6QcFPenhjYve06FJQ/ysTxnOR62Gd9XnsSerFI1m3kKVG7Nx1R9VSDErwaG/7ZxTaQ32lwFkzpynW6+DqeQXQ7f7c1r3bDUVp4rAw8Jr4OajA9P+tNABdTPItLKjWT8SSeO4BlT6HWO7c8HYoz+GI/ZEcOaq9Zi7XA9IdCLYF22mnj5bcps3iR44lHCW8ir2zIuk6DM/YPLHOzhf0ZjF10mDoFMCLZMIA9PGdTg7YAGEq8/Aiet0IGjgGJ9eqsy2Ysk0IUEXSnQV8W7IGVjlPopEwhjz56vzxZ8nMbvTAtK2uFLyzG5MF58AQpZpnPdrE0w6l42TVWfxucv6fENxEJ6vlKYUxYVoHzsXM3OMwONDGfvXXyCb06YU+0meW6W3gcCNa3za2h6nTTsNgq9WspaJDdySCQL56dU05sggveJUEDonS2flx6Bg9RWM/XcWPrgtJgc1RdD81gBxYqP5T8E1nvZgIkzb+ZQU9jI6zrmDe5x247cDB2ntXiGQSv8LSaZSPO5oMak2Pea4r1/wU95Ospxei1p/a+l9QB8JjRGHu4HicOh2F/UrjqDiK9YwTdOb5EMDYVdEPZed9oaGnHH8UVgR1ifMwS8/PnDw2C5qyb1EH3RkeUXdapZb/ZRbhczIapUZNT5HaLF7RyGvemnHLD9yclrOUVbvaAP/xnc1slRjHEI+jvZ08IQinKjqpKFL0XyxRBrW8nneExbE/g6NoH71AnaNnIvjY6JYdJwlHKuYhBUqmdR99Q4uejDEQaGOLNsViXtuvUOD9SfwYehMXp+vAf5T/Wi3bRht098ATo7DMOVqNj11SwKquwOXhjPhtEI6R/4VgG8pLTiq9SMPdMrhC+HH4L9CANxv3IO+n8qkmr0dIi41kufDCbBJ8jOoaBRyZuc98D86HjMmiRDuP4iS1kPo/H4TKRad4dczLOHneTlUr5nKyRN0QHeggUVCt4C46kg4NioVjZafRanwJgjSBKiz3EDyjydwcP9TWDNXA0Jvt8D6iO0sGI3QtmIAd77ZwNKZMqAuPgs/FkXjkNhxLstYgW+MrpCcYAGGjd1GwybGcMngEOZ7i4D+iy9Ieia8PzELtzcrQGXGb0g/XwJfLl5iuagIkChbhm8/jYb9O97SPeMLYGL/AZJETtIwt8HhVmP6YRzIbXtceIPsDiqzJ6g4a8KHdcr4bo8Fl+7R4/ejjqFfYRulFJnx9uQkfOIcz3MyBEFbug93GG1ngavmLD9cCDOgAnon7ABhCV2wfNpKP/f28tWJk2HJ28OQO7aaf7SK4bdxm6l1ykzSd2kDucYY3hZyiAbk2ujqL0F4cCibJr7cje/yI8m/8jiWBVvSfTvCkmdLUM/jNaLaPFqSPxHGCChA8Bw9XPZBmj7ai7Kz0HLInlALIYoxuHPqPNrruxeCx9tA3M/FHB++Fw43V0Py2UY2HDUWK//8R3rHjVhTJ4rNBCZxgSTCgq6d5Lf2Ke13lgKfBl2QnWjJrg7i4C2XAtbOZfCSp+KjAm2wvGiJOxYChrh9pPrO7WSTdYN3/YvBeZcf4K+ACjQ20ic3HyuAf2NAx2Akv9K9DAouoXD0RQVefPIHze870swwCTAu+Inb/ghDyqWlfCx9Dm2bvQiju4TgWIEKar3ahudb9uKXM4ZwdtlkPuqiCcOzr/OQvSUGr0tG+loK+v79qHQ0g1ty1dDzv1Xg058AN16MAAnjRJiZ+RCeb5oBX7cnIbQ4gOuHcEr26gPNPY84fF4hfRmShplO+/h+ahgNjfiHoh1tbHDRlp7efo0bEzNIe403vA9W4XwvawgbCZRauQWWv1SinhI9kBM8CeMuvuTeXVbEjU/xYIskb1xgC4Nbh3HlVHlc79tIK/bY06XNZwlTf7BJpA9sLRliSwdN1i6YCAueH4E/npPoXlYhCradBH31lRhtIARK07aCWoo2OWVGgPw4AzDbkEy5o6/ilUOuHL8mk7ZINuHNZm9WsBpNb1QNScahDv5FqgPL5HCJ7kNaWvWZds9Kx2lXf/IPm//QIDYdI978h7vmJ2PgVC1Yd88LvDSjqKdOHrytXTDo5x3+c+YaWW3ShX2LBLBghhQcvTEVNLLbeUCrA+fNFaRtaSakYyFNv5MV+cahjaT3OpU2jiznD6Um8HL3Okp1+4yqXqJ4JfQZXLr6Hzc5bodH4T544ZYHBoZ/QKX1RlAa9BffP31FMvd/0ISHX9CzoJKrKgTpcHEn3c9KBcNNQ9DVIAnNz7vQcV8aLHLdzyscREknXxlOmNdjsrU3jV71Hl8rp/DPzpEQXFtLO8iC4maksFTbLmw7sRCbUnbQH5EjVOR/C9ekaoDSCmMYvdWeju+J5f3J4jw57iVcP1GK8S8U4KT6ORy3Ppu6R/yDtaLCYPfvHxRW6JHvNGWwOWoBm7cb0g8hVbTM72KV+d/JxucDLfQVgt0XHUDhzGTY6SsA4Vm6IBBfA9OOv6HNAvvpx1cvTl5thPdcdSFtWjagQgacOPKdGlTFSbN/CUceZ1riO0ynppdCrI47tZUYgl7LeK6JFAQNW1usmCQPO/I2wU33KlzrqcRbx9pC9egWNi+VhVmjNoDA1SwSXXsM6xNb6aiiFsy8ascnDobAsoCJ0Fl6FPK/SUHRuGA8Nv482xmbwnLvPNbL+QqJTYf5vWM9xYuJ8ff3glD3XQbmju7Ff27/UGjbeXZXeU1OMy3h/TMZ1JueS0FWt9GuPB1zd1jACXlRrOu/iz3S9Wzr5EeVpUtgR8B1UhcU462lrmC9Tpqf2TIcDPqFMfflARd64uabVtByppVS1miwtOIaqs2wwfD2PDwyURbubI+HzVazMDfsIygXXeTH976QDr+FcyxCSmVtZF85gW7vkYOrhUUg5q1FGhM2gkr+N9i88TNHSCphhftSXvr0Jz8NOoHrh0XAybGPx3V74+boJtIWewpfxf4RLcuFYkcnshvjSzp+QphWIwI7tvZyXO4HjJ38BN0StoCewnh8IF7Bu39kUb+PCTbHSICs0mgYujgN+363oVunJz5LuQb50XNIdelOOhcsxqvjhECnYBXa7BaAbacvkq/Gd7K7f5inlNvDJoMJvOWsJo8WUcaJodI0yakTdn4yg8Ui9/h4eCu9O7eRi1QOorJtM4wITufq73G8qmoUZ5QC6/dZwSy8BbrjxXnaXWNQnbaVztUOglDJeiqNMcOMtDae/SkLz142hndK2yl23Vg6ubuE6bs71JTfYfXf6vRmUBhOfr4MSv7quNhUDHIl5GH4sCVGojLVe+nRolkq2BIyAve0zwWf8giIuvIU5zqpwoXSp+iR20xllz7SfAENeP5XkXqVimmyvAuVpOlQyrt/8GL1KHByrOGe4WoyMfNHmTmPIVprFr5KfEfgcp9+z1KDrDgj2nVaDcY5rmXr8Evw36t1OPXKTLbcLslpk3UxaZw4Ourcw8KkfTS9eAS4FNfRi2vfcFHDJvIJfwajFW9QsMc27PumhPEp1Ti/9xZNuzIJ7vuH8dLfa6jcnTk96wf8GmlJr1Ir8UvONf7eFwEz3O5DqJ00qL3fg/uSbWmu9DysD2hDI3yDcs/C8egledxq+45GLasgV3GAuG43vqW0GLPHnyG6eY3FIvQgMLALLig6c8wbJT56zYIEXaRhvoYQlfhL0+JN3zDEah5s+HeKK+UsaGLCN5g69xiE82x4Y64IwwcH2FpjmLbVR4P4pQMUt2oStsi8xS0NH+hn10ZOPr0S6womQqzzKXDuF+RF5zdCxPctaJWwA5fsuY85+TshbF8i7qrcTS0rx0Fj/SfSEC6gfOePVCRWi2pTrmLg1qkkc2gOn1sRAErJZzG11QjGqc2EvWKLMSffD7v0J/Dsp1NoXcQ4WvNgKggdLqOw8fF0IlAWHKMz8O3Uizg3wpZuRmQgrrnNO01rcPlye3i75zc8ypoNcrIWkCRxjT5rZ8KiM9X4oV0ALo3X5Z3X36OviAnsfV8PuecjYEGDCbzwr+L92WpwdsV4jhowxcsVGug+aiZcWnSPk7XOUmHLYe4cMIU9u0QgTcaGvKZL4ZoNN9FDX4S+9u3Bm3k+1CS4jE8onsKz7SKQXh+N66q/gmezEsvHmZOE+wpK+/yCzD+exc8GUdio+BNjRQmeCCpxYUoUvrLKxN77+7GMw2DKg3ysi3GBjVJfMe/LQ1gbqAF37F5hl/UQ7BAa5J04CWCZFN++0okx9U3UO3Afo9qGWXehBFwas4Rr9G/SuPkPMTohj/3y22jlyheY6XKDQ39txmcKm6AyRwvkPl6AXJdceqT9HZdrfOCC076gO96Ob6muJOPYZlzl6E8tLAWzI56hdu5NkNaqI0v/K3zuw1H4dlWeflp9wtkSzfhjah+emCQGzkXRJHomn8xdO2H6oeUoXzcJtNMNcHe2FBV3X0SvtAP4KkMKfm3aAfOuH6ThJ1/Rcu9X/nJnNc++oQbx9qYcZ9eLG1bYg4mlHuyJD+O/IW94X8xhGPq8F5yiH+BFe292u34K5hsHQmQkw8vRsrDzyRv0vNOJmxxkQWviEXz98AgtuauOrPoQt3WV8EtDe5x70hympAXBf/kxvDp6MjjOuYs+z8Qp66YlfpD05Pp6Z7q7Qg6iy7Xh8jx1bP6VxdEdjWDzLptjb9fT8kWbuGLUFD5g7UGOUiXYcVof9o714wyzHu5//4gMzE1AP2oMyypc5rQ95riudw+3rFSHUYbWcE4iEPxr48g/1pcn79tFxVvGs/z1O7z0tgTHZlaz6aibAF0jQbd/IX2eeRR+hhfg5Rp3cFjZAF9UP/IpgRt4tWEq19qHwNzZclB72p+XzLpG7TMy8N7WLjqt7IlV+6x491JjUvB+w0//euDS17bgIXiDB//9oVFV4vR1bhB/NmiElYrd3K73A0a6WdDzfe9ZcoQh+KfqYqKQGWWMv8/m84Jx8QsjdC5XY5ff+iSyUh72u1xAz6BxYBHdAZkRObBReRP/89hHixPUyWW3BJroVtAuqT5YJH2Sn8zQAzIUomKrTl46NJ0rxnvRbssAPt/nRmIXfpDzBGEOTq7Gly4y0BT+jFSUvUnC+g/gKj+cvHKAI+XaYeMSEfC9bcI7BtxIYoc+vPrvLkZ8nkFiv6fyuOB03JeQSoNPi2CLthHdGXsRI3/LssNya5DU/4lWphuxwHwF37+yFsqdw9kldgf/Mz/Fiz4soyfrbOFgiwysUlzAPkI6eNutDfcNjuQGD126PrYTVZyH4fLCXohYvxuqFbQhuaydy0RzcGJaE6VmnMbz+qIQ4ZmAHxZVoc1/u7i6bBnOliVovn+G+qSP8k71pzDjUhJcPVtJA2mfuVl9Hft+TOQSr6MQa2gBbqey4R8nU9OcV+jX9hbnzDPBhQE5WCmiDxNuLec7nXs4XEYZVt2dxN2Dr2HqqddUqv6e53TP5wHJ7WT/IBtOu98EO9uLYJciCYc+puP8mcJ0eMdYaBI4hC4zD9KSbV8w/IY1TF8/H1V3LGD7v5JwoHY+fznyAOUPb6EelUQ+vuIrGT0oxcQN2iAq1wi3KxeDWqwA/PoZB3vlJXHeG8RNYw04s1SNk1KL2H/6ODyaFYXeInIcnqEMVd1JqJP4gaSVNdBGMY0DB1fjy5lP8O8SHchdMYHvZM0j/1sT4aRAAB9ziuLwV5JwRPAdZ1zQ5OwZq8lebR/UXnqMySH3yC9mDCw9HIeb3u6h5pBYLreTQwGZ8eBi9h43JadzoOVDDqgJhvzROjB7eJDODdhzcVwJvP+nTBvN+mikcygsUPkHDereJO+ahDpWACNr43HBs2rauq0N6MAITguKpszfwuzlsB4eL73MxZdtSee0IIQm2bHLjhTc99QIFz1Qg5JCAa6JuwzKftG0zKMOJePk4fdxTbg8/xdoNxLALnEuyGkHY6196FWlQ3m9vVz+PYDPBY3koKsKIGG2hovVCunGA1HqfHoSJxw6zJEXXXnH7Wj8WFRIj6f/A7EjgvBbIwG1TBPI6N0JMgj9xm9uipNE7WTeZRZEBtU1vNBeiWdXGsAKdSlMmKIIVTZ2rL48lf7Z1vLGsNccUZsNusZhVFhRx4s7TGHXsCIoli6kiZwAPy68gBdp4XTyjj9IqPnQz9P56OH1CDDaDOZ79cPWiuVotd8Ns5LHwO8bBpiJpbw/5xtNzpGhwZqFyFdUoc0qEq5GZLBaYyF0LzuDjw6OxF+XBmGRni/OGz0f4j4mgsWwOqwKHQ/yO6OwJFkVsFIW/5ohH54/HU98XEtaJbX4VX6QBA1M4a17Nqf5vacbNoZcsEIG0UGOxGrS4O9iJ1R6NJd8KlN54085GJkhD5rWT0it/TZ7jtkDimL1PH1lGQ12qUJXkyi1G3awX4wSvOpOYNWmT7zVB8FuhRbvEbgB7psccHzIBOrwqOFQVTFo+iYBBb3T4EptMcQUFbBubiutXTGGbvfux5mP57FT8iW+7GSLBV8Qtk6ejOOmv8B3HbqwYnocjr5zEc2WBuGty8Nwa911CDkiD6fzpeH59i5cpCvGiQ/ncXznYU6KbyeHpeJ8NGwKDO8dhuz2RJ730QjW3F8Pz0UNscY2lC98SufQh5pcm848uPEg+EVZ0BlzG2g8YwvuYorQtKQShm5Pwu8F7+Gx5HJWMVUi96Bi3PzqLWebTaPdGarg4ucJaacN0bjZDw6nz+a5cd9xskg2dszU5k8PwvnYvs8MAeZwo2wS4DJD6J0eyDLJjrzv2DC4atWSDwhybP9l9ueleOv3SJA/ow/m5V7seE2Qjl9fzCswGYcWu3Ff43uofR/Cnbmj8YSEITQeug9rN6SjV0AYXQlywl/ujvzNf4gfiU0lI6fZJJxkxGcMFGHx/hNo8uoif+9z5xvT6/DAkXyc+MePsw8Wcuz+HtR7oATriixByqoGNybfJMPT1nT8xWIMNQ/giqI7NJoroToonRavdeL6lSaw4lscF2qfIofGOzB/82WOuL8KX22YAG2LffiO7AS+LGsFqfZT4GD8fjhyzxYzblTTKp/XFOM+E+85TIIHucto/uaTaGdchDtvy4BKx1FI6trJz05cpyOJP6hw0W5sX7QVTEtXwavQfkiSl4YIp8nw6f05dLHIpJ4NgL+G2/CZ+VU40zuXYG4dDu0P5gm2r7FspCHU7g7AveKmPGmkM25RKMVE5QTyTUnEQ961LG4E7CnSxmVxyrDP9hAJ7/CjdaLILkra4L/dhvZuuUQ7XyzEtT5H+aQkcLCyMFQUKIK7kzcPX0jiXvENGDuzmIPfEhS2XeGh55FgKS+AqyIBLIanwJutD3HN3jAKyCumhL3+3NquwYWaC7DpnQQNTglhh0/m8ObbDeIwOzwoEYvHzk+G4ccx9EynB+OWjQbLX6txqWsjLy0UhA3RReQ28hHFFCSzQORFinpwCPLCtGni7BdcI12BeYof6d1VfRAKXkc49yBuUSvjWeeLQW/oAGpNlIfmzhLskk5g853Z5O1gDo4pUlQ85yXx4U74oW4NDw/OxLN51RT76CUHRC9lKvgDYWtsYaZKHL787yUKeEyFJRwCyZnyKDdvGR10dOGVx+bCIlV7cujTgvWN9/B2yw961zCaZ6Uok0phK026IYyK6x/Qa5ezcD8ym9sSVOBn+h7c6l9Km313waVFBRi4xBqt4QvGuKaDeVEZxGmp4Oc6cxCe6039bTtZ3GMfzVLaynlqUfD27AD89+UjSr0t47eqvbx/vzW8j2gAq1lhKKpnQbFb90PkvFDa1bSXGurH0lKQxRfbr8M0Z2NIOdEKKWu34ZjjrjT5Zw21q1UzSEdxrEki6mf5ssK7p+wtIQ5Ggbq8/rAmNtw7w/uC1PFRVRc+8u5EwxHF9FhkDkZSM7rYacOomBbKexzLI+SR7Pek8Mi0IbR2vYlSzQK0dkwKT9cJpqMxU+G+vB4EF54HuaBi2rq2GpM/mLOox1MWHSXIL+aJoU+pEpzcqQuSBbmwpKSIIhukoKVsmHa9E4TdpfX4X8N6dq6Swt6pAZShNAmkM0vgzi1LSLFDLhbu4MHuM3xdx4ilxTO584A2r0pohUK58eDzdwZN+b4bLW7PYqGN/3DsmgS6G6wOpy0206d1pth0YBzEaY2Eh4EE203bWHP0Km6oacXOfFcWvfUCS736aWvxVmq4+YDb41Uh+7ATPdhxFPL++woBLEmnnteyFpbDifFDeHx5GfrXCcG5tjFgZqmKK1VSYcbVWPac853j5Eqh9eEw+ssexydmN1DQz4xLXcfAubx4xj3p9Ml/FeqV6vKx1iUssCUUTm1sxTU1ceyr8QdGXlIAw1OdGCW3GzfuX8cvGj+S9xkD3rmvlyRULDFz1QPYZq/MgxZKYCPuyw6KtTgjPgvXOV3BvEc+4HbBFjUnl2CtsATPaz2IXxUtIDG6B4pH/CSde+fxSqo/vsgV50CNYKxIt8I78l9AvXE1/H4uAZKOMWCs+46zq2Kho9IY6o4MgvK7EkjMmM7FD5tR4fQ/VL2jD5MfvuJJn7aRxsSHBKq2MKm5hj4uXoJ3BR5gUewrGLX3I8mcnAz227+huns+CAZpoGdOEHl/E0CfXY1oGKMEAu7LKXJ4Lg6+lAGpHmmO6Esjw4h0cBtyRGv3Pdz2/Q9eMCoh/U+RFFY3iMF/R0L5bR++2OAEs34LwwQBLWp91w4Gay9ApPkpLBVaycv9j1J+qgq8UPxCT1t8qO1SP/V634Tx72u422M7nElNRAmdeJjpZw4n2uUhNsMdBh8RiPXJ0YvKKPpqmMb/KT7ACXlvQHFYGu6qd+DYWzawxQUx/m0mSDlLY3uxLBnceAR5JTvJKGQ8t8wSQ5E97iSeoAR1Pj6s2P4eMoXleOruSDbNzESHWYmcUHeFYmbIYLiDA0p/1oHE/QHocsgXX1TkkfwHN7zfbAv5Aza8QDCQLi9W4J/Ob3l/pSq8cnMjx+tePNAzgUzrjmBk5zz+YZfLqfnmcOp6JjrYx2GLogAgpMPYa59Q0q6OQuZ/prnPnkNZjyS0wgKulLSjDV1pWHfHBDyqfoPcuVjuUF9JA2/74c/UaRDQJsapr57hZKMdJLs5DfIzp0BPzzrWu6XDLy6LwU1LdV7QOALg+D9asUuWM+ctR8U9J7CtXx4W9o/A3sciEHJTFnxDrrGxtQk8d7fgvMGLuGDsAu6ek43/PhkDzLRDBQknyuhaRaorKlkkcCyIFyvA9TsedM05DE4JzIGjAppwxkqGBP7+5VztU1iPyvT31nESbvOA6p/hvKm3iw19TeHmfXHQeFALvkXz+XG7MmyVQk4Y+kOavZdQw24AL65qhRjrm+xhZQB+EzNwve1TGNWuRu+jTMnbXRwr83ppiewOGq1fzyl38tHH2gy2nFGB/tDNLKL4A6+tleS2T9/R+bw2n4g3xo/vqnhp/yGysZgCzjGF6Ld3PCy/M4Iaz2ris4THOKYwGX9uesaHRubzf+ldcMTXCg6td2AViSZ4GGMOopkXMPu9M13IXE9BBX+xaNlBkksJRYpn0AwP5BkvfjOc/kC+E8+R0Ig+7v0TwkZaH3iqEnCqyF0oCVSDvn+JON4mArdM+MXqR5sgod8DZh07ymPsHrBjSxrPnrUKD06WgFU/JoLqxL18r/A2ibWJg5PgK1JxOwLCq2dAYoU+nphGPFZ2FGQNraKqmSfhXrclnDsQTtPb5EBggggf942A2UrLYPZ2afaYPhHCCpLwSHcBCAUloam/J3dek2QDI2VuLUul6IKd1LZyBlqvFoHaYn8cVTeWXxrOhJuqi3FNwlNqCfHGyMlJVOT7AZ70X4TjH5XB699rPHlRHJU0ZtPdi2ZwfVcRCkxwwPdL1oHOIXV8MPow43VV8KGlINxqjnlXg7FyuQjYJuuAi8MIjp/ZAqfPjaUn1wpgyQCDbI4yNhn5Ao06CpP8c/FnRCqIgglWXljAj16fRXhdTbdXCMJh8SWQc2Unl/tngFVVET8KMGffn9/466azJBSTxTQ0Hp2krKE1/zJkbTCiwYHt4FpTivp90TR/32+adUKWL+66gyd5Hr74OQaah1OwNRIhUWUdHCvuYc2Pj7gvdho+/HoQ3YzdaFzPUljYaA5Ga/Zik5Ai/1q4kLVMNlH3jWmQO2sj7pt9lOuv5kJqwkM6KKcASec3cZDCedy1wIpjn3nRup6jMKatl5S+Z0LzDCK5a59xoEwUHi38iC81V/L0vSYQ8W0v/xk6iqHxLvwpxIKyWn6De3kFlW7WBNv+g9TduRcdZu2ha/O0aW5GOzc3TcWnFqHoukwQtrpdgbTTU2B9jzaJozLVjI2GOYfusOPcTLBRWcQ2i55jtb8UXDYxw86LlmBxeT5vDMyC54e7+XXXE2j0mYNnF7VjmMMuzJNtome7/mLkLyNQUK9Cs9XiePqDEln3/wa3112kF7ibCldo0fE4UbaT8QcpLx3wiLcDg+vrcLy/Gq1QfMo/8nxh6TUFaC+VpaDfD9lRWYFajQTB/l0mm9ZU0YGZs1Bc4w6tvmBDlnmDFCaogae2+vIO8Ue8t2MCDJ/JpxuRPmCpZkWtzcn80CeAanZ9gQeiq/B7gR/6lifBtnOmkN/4AAxtj/GvnBBwkZ7AKkcO00NZeRpQ7Yd05Zc8K0QYAqfawPI97/iJdxcE9+7Cp/VNVPR4AJ4bjkWX6eXcPJBKlRWHoL5MB3RVGdOnGMCe7QEULaGFohcec4ljMuDjCP5yKo7ffNtLl3+ag6RTGzVJ2eGi8H94Jioe1+77CYUP3lPj6pn4aZI0Fk1zRZFkM+gr3o0zDRtp54NO6irwhf/2zsS6q1WUo3aMLTv+AjcqEnjIwZXGMdCdeAQSBd/C6KXn4PCRKjQ6Gg3NMVL00vAkrPR4BIeEpwI8S+HDxY3kcuIuVL2Xo8BEO9yYNg1GHLMgWSs9zj9wDUoc9SDNJwHuPT0IN761w7CDF53NPEGB1Zt5rPsPtkxdioWDbzDoqSHMsDuHd4b1MPuxMD7tPgGq+22QvXzBRvM75r01Qpd9o7BfXRvS3PXp2d8gLFt8jRsiPKBZOwHtnzzgnbfEcY0V4qlY5C2zNaElxpWuzV7Kdw6nUIxEN60WOU97nm7FLQmryXemAlj2xbFMkjUU+bbh2TNF8PVWGwT3H4Edun/Z9fBT9EyzoR9B5vi9Ko7NurQh+tU4tjeP5msdOdz2SIPF1hmS6I2d/OunM6ysccbyix2kG2UMGycZUJNnOWjY7WOLDb/R7dhODvIQogvF9aC92op2xLpD2j9D2KK/BbNyZEhTLRntJE9jxI9L7Gm2kXO6ktjzhQisf9cJFtmG8EhOFAyCPOHY3hu8ckYphriG8ppZbhxbWk4OwzMgzvovDUobwI1v++jepRTssO0DQa8zOEnpOVnuq4Jkg174N7wHX5j34UJfVbg81QNHS+oTlAfygL8j5+Qk8cK8J1zfV8Id8Ye5Jns7j3CfAntXXsWVr9O5ojMJ380VwAMWlti4ewacy43CmNAsvnVgEn/4aARLO0xYstkWRzst596hM7zvuhvlBkxHJa3D+DnLGkqODcMSPQPQ7chC+1f+6FC4ga8cvsqvQkvB4sZ3Ps5lfOTJRHjn9RIanpmBW813enKrkjO0nFH3TDrmebrxzd7zoDgzkvbUTAePNdP4pZAZTM5/yGVOj9HhewNPPJKM3lmitH/cenZaY4hVTd3M56tZY64+XHWdx3uWmECJkDZclKqnVV+uYbHOVohL+wGSQvF4VXAVyf4ygMFYd6jYp8NG8t/piEUIHJc5hOuSnkPk2wacsG4VNJ09CX/vjwSvwiRQaLXF9uI2GDdURrMwCrvuJ8CM0Cgykmxn161SeHZgEpTSSRS4cp+fP5CBr/WRMP+qB4hoBoI/7MctzcLc29pG/aoa8E22HkU6Qjm7JgT2rfmLuraKOLIjgRRHjsVlv6fz49mz0WWzCbz+H3H3oQiEogYA+B9WtszMSGZGyoispKFQURHtQ9rJSqQiQlGRjBailLRRKhpS0VKhFApFikKJNO5j3Cf5tN/RrsYg9rhcQL/z40nq8Sv6a+0AEY/28tbgMxg8vQx6rLQg8ow15Mu9gi+1dWwl2Qa6WelwxEuAe1achV1a6lza7YhZ6ZZw/Lg+Fsulwbpz23BCbBRfzo1g8MlGrbpc8HsvAZ+eHsfaGZPgzYI7ZBH2F/QytUnmyhsuNZPi+nZPXKgaQnp2ATCzRYTe5AuB5KrtbPm0nCdtreY5PRNJ1K2Fv0SPwqKoazBpKpJe6SCVKqqDqc0wmXTpwcrvzpgkJs71ITZYfeIwjh8Vxx/Xv+PPxtlYpmEFOsalUCqvBPYbl4HQpn7Qdu/l+ik34H1LMfRZlXFqwVoM1TaEvpxZnOrykXIWiULWtA/o0tlE3WemAzn8wEBnK5i8sBG1Ba1gO7XAVcHz1NdxGwIfBqNqyz96ULOAIp2P0BiZRBDIKSVdv3EwcMIOJVcU8qmzydD84TuM8HlO+976Ep/zwLaICNjzI4Jrr6qAkq8v9yz5COW7dtOmADM2fTqG1G/dh9GOalxkG4vrTvaSbpsabMuLhSse2Zz3ZA/pSo6n23ZB8G3/eU4IuUkvQ3vA0UYedjlKws9ceZ4b+B9dq7KD9BkvyTtbAJo/jIPt27fiS+kmsE86gl431MBVbTRe2fMK/uJNGJq4lQLeGlDoHRuaXZUL3645kfCtU6DpJwI9X1+jg98HNC6awM2nRDntvSOKGQVgnq8IaraaUayrD8eeM4eX5I1raRxXUi4eJkVUaHhLsxqluShGCPoO3MFNvzLgY9sI+KYpyq/ynuHW3OU4LquVe3+fZcfucLpyq53W5shy66ggspQQhFaLGSAz7RF+GzqGH3f/ggOrL5P1+0/47106ee78RL/vq7PGicmw52szKv0VJBtjW4CmVn6a/YpbbvuTwxgpCG6+AocP3sRZMfIw87gc+XYVokSJPWl39mDum//41ok6vjT7A5zYkMvNp0rgR9x4EPy7AkQq8+nhsVf87OJ00lZ/TWsUx0LVv1QeGXINT/TOY+8QhsHrtXi24wnHhu1jG5NHEJFrwHHxmWw9MhGjyoK4/80uejZBAZKy5+EcldNkNWsNLC+7TR+S5dF43kHMvbYZJJN60GPJJErTlwKjz9fwV/xnrixI5Jv9E2i2yVk6t/YGmonbM1q/YYt9D3FTlQAovlBmL7NW/uMlDMMd3bQkezX4ux2GgK1VNNPFnt3nWsHycdqQe/4s1Y/UpFXRluR45AukoQBkfV4DEr8F6UbYOS6ut0JnXQ1we3eZZq7LZplXldQT9orDFb3orM9lxPABHHNvAo3f6I//nA3ggLsvnZOtIP1/QaB2TRA+tm0BQdfjXHvTAPqKFPmiqhZ1HTaGorph0l26imOHJkK76Ava0WLKMuRH108ugTN27qSzthoXC8hCGouwi+JEcF9RAUIZS2Dy5kuQ//QJhSfr0ojWldC47DMPzZeF7xsugrNxGGZXbOTGoXiKWFULbivC0GtHEx0vKeXZes9IZKceZH8ifFcRhlIRO+hUYz36ririA7KZNMmmDfeWCOGIV3PJYLUuTFoxCn4413KBURMZLlyAkjvzueGMOgtF9eKapAMwsSmCHm+Rg5DTl/DD9zoQmO9B0T0u9FewHgp0omj34GOMb3pMP7UM+ZKGMcy6UQSXtb35YOoicsttBRDto6nq/RCyR5cbHzhjsu9iNh6lAe/GbITVRh9QavAxCjxLZtf49+BXakuqblOR/IZZI0eF12crgInxPmg29KSkl/pgNv8UHdqXwb+nzIKPu1fCk0wliC07QFcabcDQwwrP+h2giCJX6jwjxw/vSfC0+cHUqk801bSLul+OxnkiuuDX2gF3H2qgg7QFz5yZD1I5h6g9zh3nHq7Djo32tCrSDcaZWoCB0FYckjTG+cLHoPdDPsw16MHvz3fzmPhU1k3ahZs+vOclWnagUT6EfSvNwPiCHe95d5fL1/SxwchlkFkWh/UN1ZBYdom9Kq3gzH1L+rSlmiw+C7BrwT+8a3eI/cT+0CSNKtoUMwVXRsfh+HI9OH+jF2T+WFJGymGcvV+UnW59x7A7F1EiYybOqTuMf7vKYdFWaZDcVkhH45thiqE/zLRbCd9at+K2NQkUHO4JG42KYfXKaFRPlgZTq2TorCjmN5tceJfxAtr+7i7ngw8EpjnyuaFpvGz/Jrh8wQ4KmvLI81gR3V+rBrPTPtO5cQ/57oVcWrgpC6U6KtHfNoEe7hWBPwNHcM/4Vrz4dwtae+ui+cEDnPVDhJeW+MOTf8fp4BVxSGuXhXT1Kn65fScsvf8Hy699pC6ezDp1ZfQk+Ac/d9cBM/EYbLAxAgdRSRy+8A7046JopsIRzopsBPnoRDafp8VjVl6GCXK/KSVQDUr8fvPUr6J4v06RpqTK4dSTa2B0/UqoLSHsc1gM8QtuY8UlU2j53UVyE7wo0ccG2g49R4WLPqCWr465mn7Q/f4SbXKTxg4ZMTjyr4f9hWLR4I05qWyqJutbLlzwtQqWVn6AKzc8sPttKS+O0YL6zZe5ov8Slgxfpe/3l4PqvTOgXajK18f109eZmXC/P4Xhozos/jyGshMm8tMoL67ok+NhtV8kFtlO65S+kon9FEyYcQQiwi2gOmM2D5mXs+awJ1tnarPoSAWMO+4FAYINvOx8BE+0+Qj71e3A+ZQL+efko5XmbSyU3IsbM61R6sYhHrfnJ84/PZ+8/AdpoYMVXGj/iWox40nhSyoOX2Y6d98HcrV3kMazZAj0HuA9L/tI85kFbG6rxBP3vHBUZwda9wZhfEcv7+n4j75kr+TZt4po9d3fNOmWNFiFOdFU6+ewzGEt+/YsBJn1hth4pwAPHqjAsjBhCp9gBHMnmIK56m7YuVYXHrrGg0qbIOWWTCVxEx8QqxhJ9RJ38HiAHxdMV4U93w7x06ROnmSQicM/NuOD/fH090oEpq/9CDLb79MmJWNa6z4J1BPmgFDoDtA6lQKLndqw9cFqcllXAqI+Sqx6U4bP9o2DlRtNYMOXZ6hkXYSr6qsh4uFYcj80k9MiFlH64UnoZmwEXdfSebruKLj2rBsbu9eyv3U8jhXIRbUWJ/yvThvOWqeiVNMcGv/fDz5pNQEOhefAiqSTtKBjB86eGcFvXorA4aKt+Ch1HD58KwsWI5ygvBhgYOQ2HCiqIqNZ7VD64gN0/afPW2Nu4w2bBGqZchulOw7QCx8BsOtowVGL7Ph4QCPrvo6nzWbbeFjqHRemWPGnRB0iU1OQO24OGteicOZhEaiYeQZcS6LwrZAuawumsOyMCZDhvBzWXp/JR10VITLZjt0PGqKMojEJXujDR6O8QcR0Be3PTEK/v+EY5zLI7gd14Zy+IKtf8cQLd+XxuP5VcCxvw+BvP3nG+Z/k4+AJ710+0MFZCnD00xHe4FNNW5YkompvGk8QeE1auRl4e7wzW69Og7KZg3jWfQJ8LxdlD4VSbHG5BaYZIiQw6R0lRG7Ff5oO2LSjEA6b/uagLl1QvnOG27w86KN3I9WvMwfdpRPI4lgprdv9DPVctsO7t8FgO8MSRGekYWT2P9o09yV3pnrS6AVvUCttMcU6IF40bOOmLhOezgR37uTwb3VdyJ8RS/3djXz2pw3vb17KD59N4wJ9MTp9Pgqv3TWCo5Uz4F2rH22vCqfpgWrw980nfL9Xm/uzz/DcVUFw6/hCqAmXg4OPN5LnhI08umYxBuxaCR9mB+Balf28M1wLk7cMoMkvTzhhZQrCqXt4b4YLzvd8B6V9u8Ey7AGGu5+gljXXeORmPb5vr4Kh4+zgsdwauHHEEJXFv8O4gS8kJLObr349jftwAAOeF2POnnwku8nwpEKBwxI30FRpTda7o4U/euaxts4D/H70P1qso8I6afH8Pk8GKh79xwfvSPCFS6G8glyo0v8XmH6VBYVTQDxahKdk97CFugL0bL9K0gt3gOHeF3g+yhMfHE2Bqt75sOywLWbHRHPsfwkweaEg7OxHmj49FYXvx1H+j1H4a2407k7eyA4H5SH3YgROH72Nf6mNgSLBKFA678tXLUt57hF9popeuDZGnxYKaMAzhWHUlBzNK4WkoHLyJlC7sAZGQj+VzB6kd1cdUX1xJb9PU6aY3a20detP0DphAzthFRz9sJZ3xDkgvyjk9EnysFVDEEpTp/PxYmVoMvAGi2nGcL6tFI5uGsmnSn/hzRDGew5xGPnXEFzSprLB2CMws3ou3TguDNZ+UzB1sRf6WL/lkAopTvi4EWIPG5JejxF+7Q2k/i/noG77RLgZrskqo0fS580x/HjlPap9Zg6bqh/CtqZ95JhYB36LYmB01SR4zlfhwi9RTG56QEuDI2H1+Coq2CJDh3/vBpvcfvqzUwe9q43hsNQpNFxkyDr7rOFAXgD/WoU8YOqBL9KKuDDejcPKRpO9kSao6PRCkZc0zZlRjnvv3qf8B5q0fVYj2nsnUsqKJdA/xRS/GJjCLdMgSFZ6Dn0Di/CHwH12XXieFdeOxAFNGxQc1oYeOUGYuVkeFpXd46VzJtGy5MXQ1raQ588+wW4lg7SbHanNbQvbT4rjaYGaEGSpRREPbvCaSDk849lGJ2LccX+pJ7cuG4+7b87l1EgxuNZgAQdGzSGK8aU2eykWFrWi3Zf0uWnaQlp/6SKNmt1JjhkKsPaTAYze9wqyD93hA8J7QNyhj07qHcLjZS1k0CSLYfVj8Ed2FJvqa0GOWy9dC9GlyaXj0WDZOQpVW4dJkSFQEHUM6wMteJRQK/y8YgKxxlswekI/DTaNQAvjOPr6z4lPfgnjphonrjl8HQeCwrimTReaZQ3hdvpJdvkVSP8lKJJWlhP5TGuHF79P0ZTjKjj7eAPfXmQPM2X/wB8XFZjSfhT+xGyBJ8cV0NPgHNw6a8yaKW58a8ZV9lDWh779IzjHvw2nr3lMr29LgNjSPGoyiIAvWk8gZ8xXuqYhTP6OuqA+9x+7XrWjd8si2CIkgiy7o/GJwA8UGGXCPm5y7JX9Hie1qsKIZ9uwT6SKizwO4bJz8dBbdxdz7DazxpUXzKPjceHwGzo9heCk90aoam8lq4hqOjv6EWxZFEULf7eCt9gzjrr4gf8aSoJ1jSjsUx7F+kOHIUAcBBZ+7qKmLddYzCKIdgisBKeoTswznA37NUaDluwKrlx3A9LW+4PEob0odl0I5QvC2D/8KdUEWNGokghIWisGSXQQP54248RGWY47k8y3F4qRztN1JHF7CGqvhGC+znWKs9YGdeFI2F9ri7rD5uD8dDf6fT/EY24NQdh8Dwxx7OHLFEknKghqPMM5TaQRLD43gWHNLJB6r4SLRkzH+VfUcQeuRq/CuShqrwof24vJuFSe9qz9j1ZbpFO6cwuO+/MZvowQg8iIY5x1sIma3o2C1kWKtHn3JnKy8MZiuVY0UtGhUZOb6MAlF4yVqsHarkTWfGMLh3d5kt+1sXRrylLOWXWP7p27BGqrXNFW6TskjFWDuCB9in0hAVcVr4Lb5GOgLvIKKu5Kw4qyMfTzwRDMnCUEi8auwtKBbxApbQenHIRo37Zk/o+yWfJvFdzdqYgfb8fwzvVWdPFCOlkl5rLAV1HQvXqVqMaXj96eSh/a6sB90iD4Ha6E8q4yOHVPHMW9JHCnzkgwWteMtpZVpLU+Gsbu2oTzTDN4cP5b7HrSgYujrWnKHQeiUAUwmzGBnv5w4tzzqrTm5TkUcoxlre09LN+9BixP5NFKeX0MfyIK9r6N+Cl1MjdGv4ejEcvwx4izdHrUdzCuvEgWSl9hNT2ExlwZ+PvJHJ9tNualrwzBzEMeZW6p4XH7anZZWQCymdfh28L7LLN1FIiPqoQwr3Y4/vsUOSocwkQbeezzqsWPoRNpWvdU+BO2Es86qoFAqzElfzsEAf2LYIptIfl7XCChKC0uaThOzeVbQN9OGGcdGg+2iatxaMxUdi1ewzFSsTQuThF8flzCCw0r4cHDI1Cwo4mfI8KPfxEcJHoVJn3fRXfknGmD5kV+Pi+GNa5pwn29CHIavR17JyqBecxkvvNKm9zq04FkClnIpxisxPrIdPJtpoPqXFwKKOwoDu05qvh8rRDklhUwDPXwzt3nUMI5DcruBKDTsm5sEU+iwrHaMO2uNaQ91ob3jwNp66AWXDH+QHqxKdCEnmy2YQHk9/wjOG4Ni/p7wDX7CpYnT4RKG1WWelpOUoUnqMm0mj6Nuc73YxKosUQWOtbl4SLtHpgQLo2lEheg1zOVqnPWoOTrYfpodQ+mFRZB1mkRuJJTx8m0GmNCXyA/9eaptz7zm5JOVBno4NE5+nTLYRP8jjCET6PaYau+KAV2fAHLJZ/5rcg96Oi7RbNsB/nEZldapzlIS0Q1QC3sLGzwPsv5x2ro3PY1dCvekyRn/Ia7Gzt57MITWGdZy/msA8oRA3ThewjnjtCDgJw9dE53CS8XbAPrYQ8O/PYBrjh/w3Gd5rCt6gj2HzPnrvq9JLc2lfeUPMAdrg1otrACPwns4nkjRvLvHQSq4vqg2KnK3q+yQHiUGv1SN+IldcYYt8Magk2vQ8EtQ459pgxJdsdZ+d11nuEpzkr9bfD5hA+bXcojw38xvClbBOYIbMYVuy1gnHgyz5PVYaveKN69dYjfx14Ehed+PF76N5ReX8rayoJoPN8e8nrMgOkF7l6lyjbDivBn9RN279iCX/4rg1TzTlxemcjRacJwOGUi7ft8DD103mK+qynrNo5hdvOC0PhCWpf8FkIknGl3vxXM26tOL4Su0rPorRR/ZQe39d/C4PoeHDTxxMPb/nDW4BbcaC8E+TuOsudUXRojakD1lgF4OL4TZk18wIPbHsDMzAienmFPDYIqcK5KHUpeXGFlE3Ea0aEAvm/T4EFZLW9Mr4Thjt1sLucK94xtgY+Ycc/xUnCoIxb9ZMX7DH/Bi7tauOHhKtwl1k5Vn0N48Xw7kNDbhEvs2qmeV1HFunp0c23EnV2muCN0FealzoTrVa2cmqIIO7SnouRoZQy+Fo5Bftb8cq4FmZn+Qw3fRfgvKQZ262mAlLU4hO93pLAfY8hHrpgXtyfB7L2rKN61i/LE1pCewlysPPILhdOlIPDfdVQz6uPUN2YoadFCm2fJ07GXibj8swc/CtDjwLWGVGkoD6KdHfBB6RFsv5LGp8ZKQ/xUcXr/cxlNC/bjv+WFuObbXHz1QgAWe56j7LZW1PVfifturoOU39Zcc+cjXjrQyeLx7/j8xq9o2aMOaiGX0Kf+F5/5ZM0dNU089W4BLK5xY1ehY2xoeY9cRyfi4g41GAELOO2bPudNk+J1CXu5IciPK99OIBOvt9RsGwG2b6T4V/FYSE+fjMVTI7GjQRG//kqBCEVptn0tAJyUxtq176FEPQ1yMgzgnrUwLRVuhTeBttCetZlOZm6ijtzZmHVuFnk9DucypTF4+rIUtB2ZR+lXhunqZjXISyqkC1MmkaiKBGhO1eFbO/3xTn0MKycqg/r9t5DVIQWFFVEk/buMvQs/g7NfIT4bzKOfIuVUmxOAiiPlweNWJJZffMgJs+dj62EXan11CYam7UH5Ca7g0DGbs2tcYMJPA/gjvZHy3h+k6HwjzDrUhSX+p2nUjjRSSOkm91nRUC3ZDL/X60HHWTPySnCm80UjcZTjV6q+u4zt3mvBiZubWXy1HlSXBuBsp3EgH3cAx7fX4cWxpqys8gCuTnYG/9NPqEWlA74VZqF6hxwaiJvDMu6mHMspVPALyDRyJXR8O03rf5fy+vazeKHsDCemfWHVQSNQ8tjKe3u+Q63fJwrLOs8NU++TyrK13FKcxDc/IG0tRc65aQEfPnjC2AxJ9nkog0Lisuxk58haPSPJwVKbMjpHU0biCuidOgJy5dZhT9J9vNbowM/1jkDtZC/6MisfZv9LxzlCMiTz/gNmGimDyIQJUD48H/leLRU+92Wx3UlkrOnDylyEhTUGVJz1j+CBOgTqnMFfYdt4w5ZYuDv8BGF6GMWc2EcJI1XJNUSP7tWrkNcGA1iTIguvUiRZJOQmFT1dTELq61DYqR57ZiVwZ/x1aqBglPMmsJowCstn7YGZgW/YfE0FPVjWgautZbnejSk7yYgdNSxZImoSeD/VYXWfYAqeXcJ6V+bjL7E8vP4wnVMebkCngBfUFXuUcj5bgYhABouoK0G1+3VKO6BLOht3YfrOC6yZVMlj7kijtPQTXiA7Acy0P4LRtev0KFseC1J2waRqHbp2SpI114iizqmjtMooDPRzpWDECm16ZR9OhvafSKzNhhripoMqJrFT8nL8YWQAj7VkKXqcDky8fQjvPinD0CE3CrI/gq/qDuHPi5kcbRLJfj+EYcLS+5iYx2D7bxOYFufCg8XO5DRqD/baZ/A/X1MYyLnDV9LF2NLXFo8pjQDFN9oQYr0Z+oWDuF3yNLrXSUCsbS26bpnAz5/1cbDCI17oIQKfFvWwz8wcstT9y1bvT8L4j+t5UyTxyfQyGqz9j164CvHrm5bwoiAS5Las5p2aZmjTkwT6vU0cFz4D3fdl8pIl7QQCS9hh5Xj4kN+KsSrLsXfeNvhRthiG22Noc9Ft2nVrOXw2Z2pq3MEfqghSu7s5X+koLogqh/urEkHVuBLc9Szgt48cfTM2BKWqu3jzmxB8H0zlsd3GuNy3g8vjNdArwBe7H1Tx0TZ7Soi9yrmzT0NUsi6sUbxKoRsusqibGFdvuk8pH6Xg9JAK7RqVyK01jzDS7z+Y9EQfmtPruOm+CgntOEQNywShzCcbmr6PoFjPtTBHphpFlQ1AzV4PwlMsOLxlI+oE6PHjdHdszNFFVdZgp5Oi8NzrIUmG+pJYHcLJVX/40I03dOaBLmxvLsA9L3zB4fEN2N3wGLN/3oDf8g0s+NES0r6aYereapR3Xsx/tbzpwsAhHmifCsdyzDAnOg1HPMwH41BrEP4swxEzL1GbozDNeTCNhD+/Bpe6VaD1MRQdNLNpwXzCjP1GoO03CvtPPeS5EfPw18E0HPT3QuH7H/mRrCSWjxoB79V6cf9yAulbr7i53hDiqR2pLhIfOwygwUAtbt8ix5pD+7H263EoGiUFqi1nsWmxLgjvaOKejFe8YKYqbPn2lp0U7GHBGgHSOnoBezRFwfnPNtjvuh1SuuRgkXU17jmrQeklieC6zIrePMrDl+91YNrSieCq/g7dJIWpMGKQ1ZR8cWrAfS5DH/bq/ckzLzexUXcIhFjrgVCuIIdkxtCJzXl4wfoT632LoYRJMuzu/JrUgq/wu7AtLGmqCZcverJo1U9oPhWKe1KTwOhTHuScf4Xxy6bT3AJVDGnLI1sbgvaifEzcaoj9+8dx5uQNsO6QI/15FY++4ZPBM/UVXJYWhvcmo8E1dTsdGT8VLolL0EBZCBXvO0m7pXvpddwy6H/QT/mXl1PDEkX43raBRhcXUa3+VF4oUcPX5wzwdvdvaImLeFFvEskEVuEdeWmwixamsMATLPEkAQVXGPKX9kmkHG1Ci+tywHfvXHp3/wc9KQL4Vl1CxUf8SU1vEWUqHWB1vXCIT5fgghGRFCDnyE4piaT1VBiWyp6AL3GbyTRwLumcqgflalVSGP8cg/eug1/jHsEW3RZ2QAMQuxiPL0JieNT0RTg66CLNCr6OOiO06VbrF5ijdoK/DJ0kF+9RsMbLHz4UvYEkn1LYrqDEeu/f8fsLwrRl5ykcWeFIzZEW/GCzODg334PhglBeLsKodU2Cg3cxVqwu4EM7n9KPoAU0UjwEg8+KQ213JJTbjoTXoiPowtgeNBuXAXqXl1PbEyR/lzo6YriLl8SJw+9/qhzwNoJf2d3C+cMn6KtxNTk4aZOHzBBHnW+Dd4pAgmIGYH26m8Y3qmFfZBCprXZh/1BNkqtZR0LxduhxxAuXzvAhp3+TQHGVNn6J2M5fQkJJ7dgTjr0tzS9zvCFf/xM6lPhzrmoV/jYXhfdz05jLJ0CH8Q3aa36JrqutpTl9y9n8SCaOs10CqBVIQhusQc0kDE+/R/LQXwl3z2ygoLVf0PPGThSNauA+JR3oHlnNfanqIPXoOSn9FcE1JpfYPXsm7x505eonoRg42oGFvjdz37R7OCAuDGGr+jjm61OS9bbm9vVi0LjwCJzv3AYGMTcoL/k0m8umY6u+BLi0nsapz6fh7aoNdODfUTqYsptX7BwF+cGnQPv0bTh9eQf89ZwEr2Tm8JwUUdZesQOeFkmg/7Q9lKJ3gPZkngO/yIfkxiGwxArh8JsF4F8/lpZHl0DnqjOkvX4Qi36Oodg/e+DCngiK3mvH8+KEQHPkQt4jco5unF4JksmNlNl7HiZse8aNNU9BYf4t+GN5knaUWoDymkCo87rA5oeNYDDLgG/UGMO+FQKssqcHLY8/w30bFfl8wnhIfSHC5q/Okeqmel7goIPGE5JYaY0mGKY6cNbKkfjdqhD1Ek1AscCXN6S+oB+2OlTfXUqZpm/wi4gnCx/6Co80jBge90LYCENQUPKAhUWP4F6uADlknUJz+RzQnqbIy36MAt9ZJ0FyzWccu0cJfrU+h685U/nR7CAenBUCVfXyJHPnJ84qLMfdlUJoIOWIS/6bBBcfTuB9iyTAeu4bDHl5j6ZK5lLAMYDpM3ZBj8tsjiprx68q6rBsXyAJqlwE7YxluCLWAZqk2+nhyEL6droD9f+r4MaMZFa4LwUx1k78dKs6j9sZCFtOr6PKp1v5V/kQGepMAiF9d/7SuA/GZsuA8I8+0snYjcKfK8Bo0Xne4b6ZZKtcQS1hOXXuj6VVRZJsrQ6wSX2QdxWvor/XznJVjTIMJB6km52HYVJPMokPrAXZ8ko42G0Cm8abgMP0bfDgxXJW2+eEaw+s4gPZlRQ59S1nBg2zqWIUqzYKQ9o/f5wtZ4s3XUxwzyEBrvaVgpX7D2LxjGhI2zAMertEaMoGK9DyP0ELR1dAdM4bvjRvAe/1mce+Hd9p+WcLPNGnhArD+/nPYwDx0CD0zMmD07cz+Oy0Zzi0Now+NHpT4Yev4NqVy3nPTSgoVRP0REeTX0kjJc05h6oyNdiY5MnadyuhsuopZtv/I6ul/8HvQGvwKjtDm8df4nJZVxKSHc9zC09grv8c3D8jkXuyRmPdovOcvF0XTv3KYN1zLXRf6CicKh9P618hyI+pwuCV1/CEsTCkBSTQggQBmBb2mCqXROMy7Ra8tPwqf2jyga0pGuT9yJ50rxeBR7sKlF8SBy/pHsyO2I2mzTIsOSOCLJQ2QobQW/A9hDT1RgKLhI+GOwUCMOZ0IcDisyQw0wBF/rpAwUN/Fl7ZDYc26sGpIT+8sTEYFmczGC4Jh/L7phT8NpjjREpJUtmAdLSr8LCaCN86OA7uX/hDRloAZxbVkJz3F8orX8Hjwp7De7M7fHf2MlwffJrWfTxEHws3Q8o2gGca8jR132TOepSFHx94gJfiT1q1bDWcbqhHrUYbGNk5jBrWE2Bi3BxYO9MCz3cGsUajNnZWf4MAgZWYLh9KkyfOQ5W9EtRxYiI0mRqTXclIel6pyhlQgqN87cmoeBfY3fpGnzwfgfb1nxx0WgY+bYjB4F49Tjm7ncTCjfDCtQYq8fSHvYmxaD36N+0wruOTN8fAg31baeqd7xjcvxKbB7pQdMlzdikV58c/e9lmlg7q2n1FA1N9CE2Ng5q8fDIpTsGJMj+xIucU1z1JRCdJVUjavBllthykpoTJIHAuF1acXMklYQ28dVkSW2m6wPWKRtTKzOca50C2H70E1VOsYLnbQ463isEnM/6jf7YyML6/htzkq1n1zDWqtzaA0BnLyNNSEf4dVOB0IyfK3CEMq07uwciabxCaXQSpNksxIS0Fz//w4w5HQzh50w1PVYZh3t1akog7RFn3HLnipTv1bfiPnseOxs8iR6H/02gI2BlD+SMPMs96Dk41UuDc0YFjQzeQXUQk7T58hiQ6wyA9cCLsc3zKax9Ow5/zlrLMuykUqniAfOReUPCJz1D//BuryyTRtUpJUKmezW71/Syj5Mlysz5SfUsy0HY3qJr9hItNF1BA2RGIt7ACudYy0C3ezFX71+BXh9W0fFI0jZXuogKD7/BErA6VX4wnrSXS0DHrDXWUm5F7jBXlXnXFGeEzCZbchKCOPPCZfY7G2D7G9Yc14IaPMSx4m4R6Qr78UGkKJ8pXsJ3XJ1x0QIFud8SCieccVPpqDOtuRKH+vRbM7jDm0/N20qBkFNXe3g7PVFLpfMcUrt+VQN1fxWCf3zHYVKsHcbNPcafGAVDc9gBq3h7lvbsnUsMTNfZfH0EK9xByHhei175VuEjpNKf6TaR3h2XxV7w/rrYpgZYge+r+1E5Rlxn2pgTRws9bqN08C7TuScPOabs5Jc+RdoEo2mo2c+14fTqtago6RgtxlWsEjLg0EzMu6/Lg1TpyWbUDwnd5gnuhNDrutaOyJkEwaM7E8Wf0ebGJHzc+ysXsA0f4xRoxFmgWhAN0lnccmgTX/xB0tv+gWw5dfLwvkHrTZ2HxRKLV1o/5zx9ROPz9G8hdsmQxH1sw6emgKnjNKmeyscO7AitX3KfBHBGeBsLQPuwKMoH/wezvY2F03F2+PywOliJPQfWCJtzSvwMLrq3n5U1buHfuTo7zm8xBKuOhwd2YjcQM+ckiaeyaspyCjm7jawZOtMUoHpRv/QdvVZ/DDgFB8CpXpek3vLA8biYtc9lLJsmz2X4Oc9vz1zhtwVvo6p9KM1rUIDTjMZZt8qLV/z7TTtcTJDTjNecXZGLULzOQ7HpL3i7p/DTHGFyuN0DFn30obF+PQzZ+dFv1OO/pacBxKAY7Vefz3LKf+ClVAYYrF6CUdjRpKYvhx65+WHrThhefnsXHSk3prKoDZgX34Y02Gfj63JKdvv4ijfmhGHZ4iCVaHIDbP2PH22voe/Aku3+7Bh4iCHccRHnRz6VU2d8GeRPUqGBNE2/PWUp3NnSRkKQy1p+divPuKIKX/B46ly5LMetLKEByIe552ge2fsF0uMOT3FovQkGDEAjqCMOG8G56H9uJ02/sRaW5+zF7XRxt3X0JvxR8Z3sNad5WNA9TtplBUXoixN3MggZze445OIFX5ktRjHcphBppUvTTWvqzoBM1Im3gmco5+HzhKExsVqaUrBm8VVUHv+u2scTCx5S8/hnWWURyd5QBfEjZSNE5ZfS4Wx4G1may8a3VZJuWAv4RgzRC9C/9VjxAYu/l4MO0K1x72JrH33SCpshU3uzlAeuGVHHfX2faYt7MzUNpOK4SQNpqMclumcu2X7bgmXva/Dd1Lp+5I4v2T6firIuTcanmct46RxDkVa3Bd5kvxu1dBGnLFfjcURdafUafsUAIvWuKwUalGEc3K8DLGdvAyUqTrvd7UvT6ahRfZc4P/8hT00kJWpjSRK6NESRmYw7HsuP4gEI8VO6uY+Ud18j0dgMbmVTCIzNl9l4oxit6J8HHP6YQuoV48vzPrCi6hrTab9PMDDsYe2IsjXSdjulHzFBc8xhHZY2H+RUH0Kr3MW1e4svxM+fQ9xlV/IIOoOpqXdLcEMq9qwqw6fsYEBtnQKZbDchIJAg8EGFdhD0vsH9OzsneuHyRAkaMPwPr/unAqhG36Oi8ADzuMZKlhs5jtfdvDNGTwsS5FrAzJRQ3HlfEpTNs4FjiL8p2W8FFi2vhsZ8cKZhewRR9K7bvicXJDXL0OHwdlN02hHlTWkDJfYgCXqbxjsh6OK73kvWXXMXiL4b0du4VmJeRhT/umED6e338eXczO+9I51yNh8QmGqwgrkPGyiLwed0PcB1Rh4enqsC/jLMs//YDKneKsdguWSx1PAc+CgD21gd5+9w73Dn7JMuFGkJT4FPUvh7A7yKfcM3Zk5xclsFj+hnlM/zw2l9NVr1PuH8zwISkYNwjMZ0kDU7AG79TmF7RgwYbmmGqYABNi3tAJ6oDoc7NClqXmGH2XmcOKr5AMx68oZ15MrA99h4aHWjDvEd/aYqOJTRdQ1hv8YgvZ1tS39FCXiL1hVTuvaHkXQYg6zQajzSv4CuVB/DdlnFQdmIAVTQSUaqwDJvKLBgO3OBIJWvwMghDen2Zw35X4N1BhoX1Auix25md1ldSr/lHXF5TjK+t23nHW1W6LiIIprsquPeaAszrquR+m8/gte4UP1ULw/iys/jodi5/KX7IpnW63J4jCOdHICgu+AQD626iw+k/4LxwJYaq+LKS6kHycI+AF7clwPf9ZHhjZgpmLYvBrtsV507YjGL1wnR7TQey0T18HGVD4uvVKWz7P4wb0IG87EBo27qbHQYv8tuEYE7eOhtiqlRp8etFtO3RaHKdVQELUBUEA1Wgavle+v6jE8fO2QjpfyNoZ5cbHHynymJZI0Ew8ht5qDCcCHuAH3//wphBLVaYfACGBk/R29cv6OC5Ada3bYMOgUxcoGoJFUePoOiQGkmttyXV46M4fPoQyZ2/T3/HTiHpbZ3gG9JOzglyMBjTS3P2HKD1LlvY5ucgk+AfiHX+xdUHDNDiSDVH6d2DOLkR0JWyDG2fVNKm3kH0+LmFm5QmYrp8Kc/vmkYfBxfwvHWS8HrnWLhVJstqHpt5mYc764w6Q0+yJnLyTEO86lCBXxQLOWVVGqt+U4Bdq6X49Ddx9P9bxBUl/lQlOJuNi1zgqmYrOmq7QNWxCgyI0wXToTBsXn+A6na60/POCBiNHuhj/p3/C3Hl9RvOYNqhEHydaQ6TJO9RTJ8FPtWNoQ1R9Rj8TBFuLc3Ae2bG0P3YB5Q21pL0URtYGpjDZ38TezdfQEO5DN45vAzORoXRrG1b4N61VqxMKefWqhGQ5XsbpXyn8L8Ggq7qM+CY6Mjbb4aQWdQAHDXQ5eB70uC3whpCj2jw3r2a4DhqF1jY2kFeawkEhinAHD1kjbXG/NcpizX2KoKl/kMa8cQZI8smUNGqBZzbvgbmaOhAxp0AeBo7nUS+z8PzZlrwJOYIT7lwEHeCNb4pX0aNIja0++ogBT4N4x8HBMBjtwWr3h4Hj1SDeGPoZoqxT8MO1fUQsfQ+TfIbQS/l66lobBQurWjj8+4CcHCVJofCCEr7qUwxbwbgz7NyvJ91hWv9KzC7LY3MAh/hoktiMPnkOIp+qU8292Mh1PE4q4hUsFL5KfQ550xazid5eMNUdPdRhMGL5fxf0CE4Oi4eJfpPY43QFtxkP5t3PKxj0YsdcFY7mY5YmYLX8iwKix1PTeeV0YxHcsK/03hlpyfghxxYMU2JnNYP4NgRhhASbgyKiSPActc0GlNsxBe3DMCr4GWUk7gZ/pXLUo2uCTXJGMCTeXLwQ2EaXVtwlPpC/oCenyCYnPuLs4a6KLJEBz+1O1P3H3GICTxAJSI1ZPn9A118FQ03HfbiZXELEPpZhEFWC2jNzgiQ9hOBja5GMLG+Hl//S2X/7a/4+Mn3vK9PGi6vfY1fcu3p785Q3j9XGqYNKOGDWDdKTIki8eAjWJ7wBVrikjFHMQSaY3WwZOwVqD8oC2f2PMYpGj5Akw6DQN55ev2tgaUM34J5SQ6MX1jBigW3cet+JRg65Y2Xxvng+9OicNlQCFZ8CWT/dR1Qt7SQSt1LMCfwJo/r0ABDF12eKfCTvg3/Ib8xv+DtmjjsWLyVbIa7MN9dFEO7PkBytgi83PyLxjU78gcNb6r5/IxzqrspKeolp5635UhFDyqOTuZtVhPhmYk2xGe5Ufd/fVRwTxqlhnz5oOEMfhNUym3zH3L/dzFM1lYBdxErfDW1kZfHdsBBCw/gue/ZRqSI/QecKPvPOSgqPc5Zs5VAvOoqu94shaZxbjD/+TCVJC3lnwHdMK+/l5+3ePACxTJqYVsg7Y2kZxHJvidrIFdYi1/EBXBvcx7OnnkDe2y0MTXrMSx6YAKnAl1oVoEgjQnV5JoxgSAguBK2eGWi/5KPdOOZDUlo9LGAhS6MnZhCD/ra0P22OH261ckht+filKK1XOJcTZvcNqB4wh2+8MUaStZegqvpJ3FVyWw2S62jGwt6KSdoEO9nj4Al39Zy9FMpbrCdCEPtyig5Jx5GXZfmRgdP/KQWDbZzPvFO0S56pCgO6Vf70OeQIXxcow0rUpqgcs17UvZSJZH+afzmy1GavL6Xaj2+wob39awSJgU3espgyOYPKo8353zlRTT87jOL7Yjn5heJ1Gz5HXNv5MBCFAepslfwVsUf05tFMDdCkNou3OYzDd5g/i6aPizfTmNyYsn+F8HE8atRvu8ofqox4wSHQvpzqpFuZpRC+GNrmv+pGeJF0/Cwvh2s3BgPE7/+5R0ib8BhXwyUlhnDzghTKj9Ugd6RC+jqw+msFGMHa0f/5ZkZLvxe4RLp728hmaAWTtB0pMZjN8h4YzxfdPrId1UJZj+vxLz4Bsi5lQlZizeR7KZDKCYhwY6nw2hPizpLHcuH9gplUGkUgObnzVhY5c7TSkbA8wkjMd/7FbXk2FPIhy4+JrIfnl6UgYAtuXzo41/01l7NHYU59Hf2ddKe9QMu7z1Jbv4CvC1zHRdaSUEF+8Cq99/hz8R8mv5tFwaHOOFvsUGsKpqAR+Ln0bn0NyStrAAOdxXQ6okwXRay4X/hMpR5/TlPdlxEV06epxdxh/DDvUVUs308lDd7YkbDGczuukG6S87CuGPv8LNEKxUlBMC8qiTeX1gEq2dYwgKpJtiQegj+yCfQAv2NhFUmbFzxF7h1Khc/LIO7pwAG0ixAwjsR4i94sMNNdfzWeBn91syhV1ldOIoE8VVDAlvtfY9WYeKwKf805qUcocmp2/C41Tb2WfoKaq8b4NvWBThBbjQMpjiju7MZREp08vgJ/eSUMow+5u0k1r0EtxSHQnOaNK/4uZF/F7+C7X0yIJCWRHOFdVlV8DLd9Hdn759AJbvyMM37AQVbfYf1k0PhzVRLWNxdC0ZRd7j40GQgkXyYKzmNl6waZu2Z6oRrs+iJbQd2KAH0LOrFyHwx2muixebuj+DW/jo+H+CNQpUzICg7BCMk5Cl3rD5sEv9NBYOFsPuMN4vYSfG/qh+8KOEYDm4UprJXU6B69BZq2GcEB7SC2SzvBOWss4Ln1gvwjv4YHtsuyjnusjBD5ChNnHiILWUtwOHtWHBN7gRbT2f87SGELU4q0O2/HvosVGBmyh++2fMJOmVGQu0UET52F3nxcRe2sy3irk/prH39On4pVIT7zaX0/MMsrEo1B93SJXTt53g0HJXGmtsWoN3Zaip+GYImrn/x2fIhnjB7B0fGjAGtvJs88sNVSvvcicr2YnRIaR0s2+zL2r0b6ajZXZj0fT2f8NIEYcFlPLApADJvHcNv9++xmeMU0rBbCXaGAdy1cjHn6zjRuj22oNzdjwEvdTBXRR06Ws1wa916yDCYRjv6mhAEfOneYDOdeaoO4ZPC0Yyv8MxFnuw/6RhVgSzWVHeQ2IdBuPcyEjbnD9OD3VJwd9cpatk8FdxXn0S3jpcsy944dsiLRdTDycmpHzIvDvNKQwkIEallG5N3tMnNGdqUL7PXAVG8YvgUtshGcUv9IIjuSmFn4Un/N/9X5udEmjf7L83buxEVA59C0p7p3BRvDtvT9/EMOUGYAgvokLkd7N1zD3ICNqG/rC0k5fXT64u7aENsJi68cQu2C/zkZichFvFUgrLR0ezR28SX5+nRwgR1GpxgAc/tk/GrZCItHTMO/9aK07mi0bDOMAtPVi7A2t0SKC/3G6KOppDE0SGaW2DOUsNz+N6oIc7dbA0L5QSh+FAUhiinseaU96z2aDTXFH6Gud+jcZzuNNotEIUXTtrC/ahd2Fn+mZe2vEE730Z8dLaEO99fh9l129B/4DzccejFs0sBTl+SALfBUySaG8DJK87QQ6tyzgzeCv4BiTzWsZsLS6+z/ToxsFz9Aoxen+X+E/tp7v7PeE15Mf64fQ5/R31kl3oBbt95CJ86ykH2meOc8Ooo6uw1wjO39+PMw6shIewwrLuTQl/eumO8gCd2jRoNeU4dkCOkCC5qf0F2chsclUqCG6uOgMeUHng3dj+c2/cQAnbrgs7ab3ij1gkTffPxRtUgbV6pid8UTHCiuwusnvqWNM8O8PIDoyC1OgTlnrfBu52TySVnCt34L529+43JS0MTV5trQ/RaacwRUYJ/8ypJSOEgTw3PhGsWG7AlfxYV3wiCaZvfos1/d8BubzLUpSjC74dH2LnwHPzKH0FjV6Vj4pS1+OhtJY0TSeKqxH76fGQmRDkjJMVN4gKDaoopyIUrqTup+rIUvSqcCqdb0sAy5ixlLx0AncfaULQjlmKv+GKDwhl2XL6JYha3gJ1eAAtMc0V7/VZYbZdJ76JsoOHCGdTL10HlrA1UF3mOKksmw/Skifz26wrUmvcLhExk4XjAZBg5KRNCFE9iXE03j5SeTsd+7QXv6QdZ6oMbVop3U93IVJr0wQL8lj6kxIB/PDR/Bl75PYffhF2H8d2/qCzYhWOWHQDN/elQNk4RYjZmwDbhIySROY0uNt5gueULcfJbE1r49hXZTLvKhvwKu19Zg3lyIrTMcuRwi2kk13qHW9xfY1PQMHWv7oSfqz7iq9NZ+DhKANINzlDrp+Ww9c9q/LVAmFtOz6dtP/PQUnEIRwY94dRWScQegGvaxI80O/GH2xrM+yEM9+ffpPibHvz67UjUGngJdivkIGmXPJzz2wCybzbADXUL0r1QiysuJbHN8Wj+tziNl/3rht7Jsij8SAiyRi6h+JxeKr2gzq/br4G+dgGNeeDMZpMO0lYhX576PIg+7tEGo9hu6Mxywy3bpPBwWw70T9TE4DtO7PFwF++MqoeDbrfo2HR5iG64wS8r9XBW3h/I0NhF0rM+s9D3Thh27+Mz1pfYx9me128YAScbJLmxfzELh5rgs9peOnZZBTJHhmOmrgfYJtvAHjVJiD5pAnVqp2CuVR0p7SMsNt/J1yM38SXZdDhvNpZOmgZRvfADNm20hxOj7qFd+zNedTwVXqqMYYGGM3Bw3HMs2yZIK44UkwuOp3vr5aAjwxHTonVgrcsXzLNUIt93cRTvV8iFnmGwYyLQoq3f8LrCaGh7pI0J9VMgze8+LcvIRJxeQvfvNuIxE38o6FaBbSIj+fR3W7hksAb1lcxpiep5DD8XwH17D+NArDeGjV5CUZVmLD03CN3cJ4HxWQ3UCPCi5X9PgtSGbix2SiU3n0E8Hq+DInkSZJg6nStmGMHA1n1069sxvnBSBjZ+aeHt88fxezVjDq7NAvM9vTB/6BP+FzAWrAuM+XDmSQ6uO0QNHf/xfuFKmG7dhb0LLuD56Dzubn1BRxUIZsuc588ff/Kz06o0Ji0a/st4zfL+a3CL8RSsdcvG6a/Hc2OTJUT37uJ3z9Ih/JQrhn2awKV97XRl/Ur4PlgAelK3OTKvA9R9CI7vkMe+M77cqLkRPc2WwD/7RxDt8Rp33doOCcE9fFHiCi1tM4Fy1708oDGdXny7D6FS/rj32SMayHOAHb1jaGMIslzZSpj+QBnORDtA3WdlkFj5kZeZmtO3OwYUOOEuuq3PQe+7tWDfkUD3LCzhn8Um6LwnCCvaVNFlswmPOOyIlU9H8q5PLuinoEErNY/RkQFleJDYzTt+7OL5DxLgwblOmv/pPwj/uRoHrKfTKeFaFN92Eu1W24DgwiqOHbOecr5KQMXuZSh+/j8aDKwBx5Fb+XBnJFeOseCCYj2o72igBZn1qDYugxOCf3B43hW2ZmEYluzG138v0fj1oXBlIkD8mn64/vQU2vMszvgRRw1RqnzifQpIuU7i9DuHUeW8JwipqcCbyT6wIu8UXZn1Ejsde2DUiq2s5ODGcp8k2XR/BGpcmk2W163B5NIsfHl3Ld1Y7QsS0y6huGAXvZrylw9r1sLNsY54ya0AjCtk4NLmPgwbVuLksjjKKNOB8+ul6YeeOvz6HwHwARACAgUA9A9EKVraU0UL7dJAJKsh0VkRlRYRDQ0hoUiIrIZCyigqRSotUVYUKUkkFCkionKvUQq3747lZPNadPUkmHX9Cr550MbeOY/ZSOo17S8Mw+P6j9FOX4cC132kkSUVNP6OPPxcz6jho4K/ZXeSyHAm3x9XjzMzV8KUV6PJ7M1z7Lu3jMMk5OBY3SJMwo+cd0wDql2C2X5iKxf3jaSIMXO5p64XQl3W4JrZ8qD2egEsqLOmxIcVMLDzF3+98xYbFiQAb7mFbv/GQcllhvz7hjAmwgYe/lsIy5T78ERAOpqca6Ioj3RqKixCz14/2PCgAJpZDh54nATVVgu4NbAYVnVH40KvSq4zbIWtkjH46N06SAhbznd9JcHER5a6lRvJ40gb1eYsodK4+bQ3OQGn51rBlXODmGN0mqLqBMEh7Tc7LO3ltZOb+YzIUZYw6YAToTm8y2Mplj6dy8WaivQgDOHA9ZEgvfAU2m1ejXftpsGlvZUUWvOCZJvf0cbDoXB4ViFcdjCB+Oc69HagkEOPf8Mz/vWomr4MNIR+oMPap1j87jEsfmOBLlYT4emJBvYq/EQP713n9kAJ0Jhcj9XX1pOu9nbwm6OGL/JtWP0DgGHsQcj58Rs6bTvBSGob3T85CBMq0rnYeiu2PW8lrzZt8js0HQomjKXbN6po2qLVrD67nS3HOPPEBRfQyMATJu9OgB1pDfRjvyW8250EHdrZWJ10E+2c3/DYaXdZLbeW3O5ZgejHAlDJmkn/qcqBjslfcDp6iy94bcGmokA4P/IbB12/gDESJnAnNg9KPipyvfZ0yDPv4izH2+w3dxg/O/lRmb4s774nj52/himycS32+qrwl5lWIDnlId/brM6OHVNgb6gN3yzvp8Nvb6OinxOUzToJJ7392KJpAgSIZsBrSwe6J9bG8123k4BEGjtaN4LggDF6eexnpZGfuDBVC3SNxPhr7iGS2a8CzQo3+d2NaBBdPIbmH10Jc6IGeEnfdorbLAl/ozTAZ/JcCNvex1qbTXirogQdfBSMIcXtIHFGAUxC1xDViMKy0k88p+Mzdqqcpc0vnpOjsjF+mPEKYfZTnjLCkWdIIE0UFwDLDQL0e9UQHzzVDauHL4LvcjtcKrceDxdPxrQFmRyfsIJcv2jA0tefYOrH0zx1qjx6ZP2l7+NdSKl0NC48coB1Z8zB6sk5tP+sPkzwD4bgjN+08vMkmlo7gUVadWAoqZtcnsVD6/BZmBVZyvWRqrDuv+mcNfoUvHd8Tb0LNMAxbCSIhY+lX5YdYPlTiUsKj1HrJEOYafAGc6LscY/sbYi7uxrWVZ5lj1MmcJf2wqR4A+57a0c+HeogESaK/ZITSHDyNny76zDNqFgNBvZu0L29iR8aOsL79mlotssUhKpuYfnnXLSHu9yZ4wmrxJ1gXtd3LnzdhQrX7qJVeDTFnwHYfkEAFDrywGPeGTKak46XhXxR904/YIIw/3ulxVMWKrP9TF24E5OFGo/e8ptLsRwz8So3XNrCkWH5tKT7EKQqv0BX6oTXTfJgc+gb/7vvgw31KqywfhgH1N/zvRPWlHd5F5RZ+vKWZZ247yLBzYzD1MlX+L2sD/klTIS4LVNhrNMh9HnfwlmRg5A7rhCbeyQhNMkCJ3z5Qk8ivCHRvAZOKKzCi9V3QNqqB+ym7qLdlte5e8gSrL//glibsahkX0yfgxDJchsEzDsO6xMywaRaD0Yk2nH1AgkYOSzMtZjO8X3KIGbsTVY5wrTvoy5c923kH0VaPHHTFdBbPQpSk0rpUmQbuszaBn0uHrz9ZAZGn2zGLRWLqGxxKfgnxlLVNFW4Me8AWhT9gsxfxXA2fRzJWo+n+8VlFPvRjnR3ZHBmaRzMypgECZHmNPnjGZw1bg22XnkOPkfOU+mGP7w15Avrlx7DY9e1UcJJHBTGqXDI+BB+5TgTpz57hMM/PjEJjYPZHZfQ4M5V8tOPgyXm0pC1ypY1J64GxUoRmP5SCG9XboQNWSlgL4bwRuAJres7yEtrzEBo2hVyXzeJ7g7/x5apdzHBeQDzyivRLHITn04aS6celoBotioY7wZ+EVNHt4v/8s6lIvC+cx43S/nCYuzgvTqzWHY4lvcaGoJmxU+6FHUGH9fdALvpATTyTD1YmxaBW7gJlSut4emFnihy3BxeTbfFVaFbaJH5Z9Sf7I1xVQnglxZLIR99KEFOjCeHP+fu02pgfmsUly9+iubH2qjrZBQHt56EmofaUO5fS+ZXikFXpBDLHilBs2Ax/+eUDQkFI6nNSRZjniwk2fkAg4WFXHdoHqh5voYZ68zhmagwF3+u4vj70nRNuAL3XBmNDd0LQPafKH9N/49WDejwxfYZoCSTwqOFWyBTzppchXfQPN022NX/D5aJZKGSgRisHpjItxQnwrG0QUp1tIMTBr187ORYGj/oBa2lD+Fj7ljQueUIFs/SUTNpDHwMTwSpn2Px7SNV2mb0m/xGLqPNA/Zkp1aLWftfkYINwmtbhE69JIo5Eg876xPI/r/zKJ//ACaPKmfzxhA89K4NV17VYF1vDWj086GRb9pRpW+Yzo0dolf5p+lzZxM73/dHuYOuOP2CH/prKEBl11XUefqDs6US2Mqui9VpAy+qbkX3bUN0a+tGjj63HLTcAe790eE/r9fTPc3JPGvVOXx3eAN4lhfg4ln7+edtfbCqdmUXUXmQnD8Sk5Zv5hTnBChJ/QChpi/Y0lwXmtd/JzuJElggdppdDZUgb2oLGnbq0ZM0YTh5ayqs+XAXymK0UOb8Xr4jEUGVLiuwqdIKtP54ULKvLz91fE+Ttk6hrgoF0MnUhKs+U0HAdQZOu6fGjh8AwvRWU/HYALTENBx5X4733/eDXyOP0+z+56RvPosPdcvg0lJTkPXtQfltZ8jVzgBffywElxklvMf2A0escefW4yfhVO5a0N2KIC+ZizeWHkKvJ5Xw4+oGqhtMhP+ssiErIBfOJTZDr/ICjF+pBSoVX3FPzmgaPaCLJmqrOFh7DcwurMIjxecJdknD0SYROLtvEqxcMBZlnxtDvEMVKu7Mo5JDp8in/S7+WlHBVQ/KeVNwL7wJEAXbX1vxgbwgfzRJoW07M8hLgWhbhyh1HttBks+z8Puy+ZB5QhyirHagqpEJlOz+hcmhPvj9lDMv88pEn4wG2vxUGQ/cUOfHp0eA6N+P5H/5GiXKelNS8Tsybc/h1EwryDTK4kmTs+BcwhAph5hD9xcZHLXsFIzpu8kfD35Di1PHyeLVNerZP5E4tgk2mSbRhacEf3Zb4qmMcDiup406EXokuHkzCH5Lh9BLRVTGn1lX4R3N2jsCdnQ2IWc8wu5iTbaU1KUNmbkws6uHyitk+VjHUWxoEOO9v8SAK5Kx/MAIuPckGJ9tqMOJHW54OXUHbbj3nWLnjENds0TKnTkSLh6rxtvOrvzsoAU3ul8HOX897h9ejo/HJWPRKRNcur6WZkzWgvG9RzlOfCG1hypS/yZNfj4+Fq+pbuPmV9Vg+3uAFJ/l08r2sfB4XC4WjvuFAlEr2WvHUrLWiGKDKcfZpeURLMkVYpfaXZiXqQDSXc4o8NsN/I495vsXE+l97zA6N02F5IuSdPZKHXoo6cHUd2YwLi8KejMM0KOpAeIHVjK2tLGP4EN2sDIHvz9a9OzmbLpZYwkVdVNA/qcRJGzK5YIuF97w8hv0vhGEhSuCsLnCjHSPlZL1FHMQqRSBrHHXuOKVAa2jfbTh9gC4PRTneR0HMeK/N5ww0Z0bPI2AhcRxrel1koow4M2FPRBVdYBk39hAsVgD6nu2UsKKfI7ZNBpuOU2AOqGv1Jl9AvcdSmeDzdkoNEWHYo6spy5lHTCYkIGNAyOgSsWE6gu9+cWvZ6QcD6Q33pd7pXuwaqkQbikdSaGnDsOQthHsu/wXlfsrMfRfHp+69ZuE7s/l5X/HQKeyC2zkrfhb/i7HKI8Bcb0V4KV+ncOuLOU9FodoWm4Ytot848SD3ujytga9rO7TqWYLWLQtjnaOauKc4U2wT+4kB1r9Y+NIJXIcKCOTCFe2SfZCA1cjMFjrhnalGawxdiN+MlxC1iZ5mLIbqKHPGxYd1ucF/b9YbpBB8/sPTLIPx5m/POiclhXPTttG8xYthlP3TFFe6AkEF23lkCumsPCKFtzR76DiHAnYlvYI7OKXgaStHBb3ALcOjIKng7vBxd0ECjpPswOUQs4ifQg7YI+m9Q/I+6Mqr3d/QPVTdOmyngQsCVSGRkEb7j6WieOWbKajrkmcuF8Pa+48xQLzURis9ZWbZ2VhYZwJxGfkg2RrGTRnr8Fzbz3x1vcYyrv+A6NkNeDOkWgofDqa666NB8nAZVDjvwdtG+o4YViRfFYq0pmjDzDopSennZzNc1Of0kRTVei6twV8nBvBtcsTPl2XozU1FWAgf5Q/pzai5FwbvtorDUGNkiA7RQ7kfRxZYQmT0+atkBTpiXvKcllJ6Qy/3vKIr2Ym4J8YFYCpS7DlbyAlrL6MP/TcwDNnNe/89hRkT2/AmvW/senTcvJP1Yexi8xQc7Ms/N0wh5TzDvCrp8a84JMfivs088ifRvB5XC7bqFpBUtRkftqwCy6k7MSVgafxEevg1XvaEBu6DtbqafP3xlpSOjECFBvbyVnmHy+z/QTXX79j5/AvnDJLADtHZ8FG4VQKOFPA1xLMYeHFFejgv4tv37aEnYmxFLlsCbumGlH0rJt4/lwJy0of5ZlOWmCftxAaVGbA5d1faZ1CCLSGmEH/3TU4V+cwVBicRtnL3TD7tAVcvDsVbGqFcFmQNFbPSKEIFMRTmjrYFOmCYaIa6PbCDy55T4SCeEHc5P4VDZ7bYblvH2p/K8WjR3LpgkAuPwk9QA/W+XLOPxXYphnK2PoGzM1DwCshgw59W4E2EpvojsE8Xt+sgnutNfDFaAm4p5WOPKTOsnplHGH/A90m78D5mcDTXp+G9927yXafFb2eNAlklf15R/sZ6Fg7iJLiirAj8Ar+FHfilAIZtM8wIQvVPfQ7lSC58Qp+HTuTUnYP4SKFGCyr3AsrhiZyZ+0lPHPpMfxZVMxjhafC6G0H4LyjM82JiaG4gwLcNfyMpkd9oz3WjPHxDig85Sd9F1KDxxp9rOd/m9dqHEKn6flUdKQG2jYR2fh9p6KIQZ719gmJHVaCxTvcSKCwAw9iOKh+f0l7PerA/480p2A7VAZvQHrwGp+7mcII+/dcuzeV5v1ny5l/1CFq6kaUqikEX3k/jlPPhLaLa0ElSBEKL6ZRk/AaWKq6HaXtPLmzYg2Z5XewbJckTndYBh0OF1C9XBfWO/2lvT26IB9Zj39cs/FFwh3oMgE82yUBBTUy9Ot2BwfulAPzly7oVOFIo5Zm86S++dhUsJsf31sD/9K2U2/Lbf4QUAorjcWhfuoWuv4+CH3dU2DCm2201y6DLwy+ouOhV/j3hXkoIX8C8+Q1QG2XNG0WrKOnQZPozruNHH9sNQS/LOf5SZfw3P1IzhMsxqdWCLI7xoDqZ3PKbknHigQXWLSqCGvG/2O569fx2YR+Uvv0FeIuqMPRxiZet9IQRtj/BLudRjTROo6t5JWg9NUSbL98H2+p94HJj5HwPPML7Fm+nZx3OKDt4Dl0ih6Ed8uT2LhpBhhNkyEIE6T4IYTTZtlMMuNp1WkJ0K38iEkbbLEvdQ8eE47hH/WrcdbXzxCdMgbgsh8H7TADG/Mcdl0QwI3fN7JKtCEt0w5k6RNJrCzwFY2UzEFxijormDGlPF/EP4t8MW/PKTAvekUbqz/iij8KZKP2AicmjAMRvRyOuJ5LLxe9oYq501BWSwIcbiymD2s7ef6KdbCoUoqOGIjBJ+ul+PFSJEzvKoatRQn06vUlmCzdTNWPgSpHt7NuRCqtfysGEUMb4d3rNVxQrwiyNgc5coEq2W924a0xqbzjxyiccTcRrhSIwU9TOw771IqCv8KoRCsHhBSAjWf60PwUC27R78X1J6vw4YOxkNGYArnfDtATbQuqTrzLDavVeVquAD9MU8PzdVvg+6cCuvjFAKQXinOpVx0kDAmhbEoQZiVlU2TzRVhtN8wn3Yog/bUdRjUJgXCrL78YtRr6h0VY3VoLd6d5Qnv1LQ5e8pgyipdgTEwrb9qpCosl/kDIwsP0VvQBeQuJQPiXh/ijZzvOP2pB4aovSMz3FpfYzICbHlvg1ZbTrFIcgSkdPtx/9Qwr9bqTnshb/CO/AQ/P0YWzAXLg61sJe0VPwtHKhzCp1QAFjozCB8ohIGIQCGqX3ejINheO/acJuhIm1KcdCsuhB+MOT8Jbd7TA1mME6n6pJX0lBV5tqQHnsyTB8IIwblkZgnH3rqCI6FyOi2vAoiY15m8/aOHMVPQf84PguySUb7Qj5Uu3yUpmkJ30yyH9oj/MG48Qfz+Q1X8484hBKVS8JQKG+q+ook6CxZ/tobKV7+iVZjFe1l6Fq/dewb9P/lLOHmn+N0YTdM6+wViNLWjvO4YX1iEs9O9juW1psK80nuafj0SnlXfZb4YGbHBGOLLgJz7a+JiUrrfA5cHDvGiGL0yUQwo5a89BarO4/qkAWMTd4ZdS8VQw055ME37wiNmKqH/wKA/XriGdeW008WI5W70yg5+v3tH1PT9Qs+U4jrynT+7+t+C8ZQi3Z10A45ki3Lb5O2qFmkBIQxNX1c5HsQgJzvv7Am4Ff8ZzlY0Yvvo0xOcHk5G+D6VengQlO9xZzF8ClkUokcNaMfTTj+bHeWdgkfAnemEqzIfTDdmiSxj2lYiQaPQZ8j+YzGIflOlE8D+OHPqN3VP+YuThxbSs6DVEx4+Cn9dc8VxnPKV1/SHLrj3Qu76Lyv1nwMafIQSGDyB+rTVG5MrDqv07oOHjGcwY1Q1h96sp0XQu5Dfb0AT5Vaw9byscSasD248aoB+/izs9Vbn/0hxaHnkPer2nofKvE6yfJIrr5SeBjm0Emi61gJSgJeT+dzG/nmAAyrK3aJvvYvxR/4w6woV44/womvm8By9MlYXZqido1dyjXORWSLKR3iQQpEbvZonA1NuGUGktw/4HH2LZbQSTkyYwd00C/wx7RntLvbAtKhV7nWVZ+2s4Zuuk4hYrdXQ0UoFvgQzdsZ/pwZ6d+PCDNFptSIQXJ7KhK/48NU92wi4pCUipHg9dfdtR23ArNQ6X8bDdPJim8JZcRD5zp04Uax5TBzWNQJ7xfgIs9kzEBwVb0bd/B5TvCsGTcadAsmOIlH5rsFrgc9QVbeGA6WqQFZIAjQvOY+qeefTZZAZUtSVDRt9kqg1zg/TLZwHvTcU9C0zAs2oH75JsZ5mts9itRozMTPSoO0QSd130Ib1/pahT1Mflb7Qger0tPExv5+9/DuJriVb4HXua18w9gL2Wf0h8wTquEU7B7c/EQGJOGd0Q/8gCo3XId2iQz947BU3X70Jr6VEat24V7Zpoyk6Px0GOjBMv3PEeTyw+B2er8slB4gHuP54KlUemQYWoKy8Un0XvWmQg6ZUNj/pyCq+8eoRvjF6C3jYPTBoTQ5dUP3KG+T76tesacoUUTBqpTw7+R6le4wfZf7CHvc9cweaeAhxcPBfG+svAwOmDLLBaGsKtD0L5GRUIFU/EV5McufxlJvtcTSAXQ2m0sz+F/cJfOfmBBUyqf4YP3DJocoYfDVSX84V9rlx47gNYJ6xDyH6AHd1C/PmROFRMvMLe3+1hneZJTOjZDCo35vLHrCssNvoX+195C28ehpPS4FSIcQaS2nMb539YyoEpxhAdvgj61utCUdJSeu95C5eezsSbkSZQl1tD7mLfoCx+HQx4rMJ4g3C+N/0bysXL0t6Rj9GnaxyrOArCwhdZsGWZAvfGm9EvqeMY1JUMAXV26CO+Evq3KZBLaBzd3GgI4q0OnJPRgpI/GuCgkQqLenmij6sOhlzdjHOV3UlvgTKX5xuB3KY35P7fVVTGuzTvyFM+8eM4Zz1bBAoxwTwgsp6yVwZAp5gSXMpxB5uT5fCf80nwk0kCtV2TcbWsHZt6uGAuP6FztmdxgsN02LXeH8KDblPxBj1U8r+O2iZjeMQoe0j+8I7bPe7QWb8zXKAqC/9JjQKTu/08Oy6F71uGU23meup8uYxj42ypY38ipgVuwgYrTWiNH4/b3f1YJSidPPkep/9QomovC6yLt4WC4L9A/eqoUS0CezaNpyfjNcBktBIV/fuDX3fn4p/iDyhwdyXVHowGk5kC0HN7OjQ0lEBD9jvYFFeDy3IlYPDtEn6hV8odnxdgZpIGbrZvgJ8nx8OO1Jnwa1cgDDoWQUHCHDrkcpIgAKGs5AC6yKjC4JJD6HdDH05PMUAyWw0OfsLUW50ITi1SbFs6jWLqg6B38R++Ld0Die+1YOmaGpC4XscvG3PZXC2LlHAHxeQ7cK6KBzovusZxGusooY7hrKcX700Rgy35kvRD6yJdffINLry0QGXXMB5qV4Q1Vx342AVx0Fd3oz/nQvnbHG8e074T+vQW0a3HeyDo3zmWfbKKWrMv46svOnBPWRVrpztyW6oHSdW8wdCEbK5adZsyuqzozmEP3Bt2ih+YqIJAWiyVaSfhkHQHXjQSIn+jYYrsPQCLHVeB3qLvfMPZju6rycMJmwQS3q2DQSYT2cM4DmsKHkOqlgq35UZhzo9U9B5/meYeloUTqWngf0uQPH93Yb+xBeZWukN4wj0Oci3gjJFObHFOg89sloOgM6946+dkKrlwAwy2p2CPqRBoxZ/i+etnw9X9X2mfTxCPLVCBFfoNeDf/Iv+pb2aX0HsUqDOCom2n4oXmZyi8NYqsL4dg6RtLuGZzDjJ8v2BKcwhPdDrDbz5docnyW2j65W8YFZKBpnMbwU1wAnxuq6Clitthx1sJrtNMo5e3jvPOl8+5P2gB1s4JBncBT1AU1oIQZykydvZEZ7E6zExmtCkbwbJxcvzPPJxneoXw/PlPQUeeIHzIiOelLIL5YgeQ9utBwq2JLD4jDm1OpHBa01wek7QdFxlZgfnTWbRp4T28UJuEw3k2MF01CWYsXcsKyqr4oHYNNbhuxVAfS9C96MR7/33DRK0YOFH+GBrLVHlm9RbYv1QU29/qgMr7bzhaZBws3y3C05oekHJ2CEWd8IBzdVvhRmkCb6rqh1FCxRjbOI4yI1ThrlogSqlPZbn6eLjxdC/s/TMSp/1T4fMFXtiypIoVh1s54YMwHL/vRpemelPBUUEw71UF7ruCahPcwHF4IbzYoMVjjQLoWcNoaLl5GD9UKePaouXQJTCSfy9qYkOTy1R2Rxozs1dAnk0f2mnLgGyFI3rNcUEj7XzI/tzIs6QE+cWj+ZCj9BCmq88hR7UVkHVnAlxN9aagIDd8YvcbRIdG0q4BbXjz0gk8Pl+imP/modTrqTT8Ww2q3v4Hf2Or2HdSGceUWsB0Oyf61FDFeVFrOOHQLzr2bzsorbGEqN75vPZmNcHVx0jyh/ijmRxd3zAXs108uXuDIS1LKIA72sYwpmcstFirU2q7NpQfCqW4yZYotzKIEuX20VnJEgh9lYjXLawgSTUQtMKWs5VwNVwo3gPuDWl8IOAV5+4czw07fnJ07CVcIWwCFS1fOC8rB0T+rQS9J4B7hm0p+2oNXDapYEXjYh7ZVs/C+vpw/V4DtSfeo6jMH7xG6g3Mf6FHK78tw4Nbc4mO94B21TzeWzQaZofWYUDWMTrW9ATt1rVhxJaLeGZPMv7ekE5+povx/YMaLGtXBxXz1WSgdhXN2ifAQc2X7GK8D14fMqW75mf4gZcL9Su8o9meDIoyf+ijmR+0Ly6GUNUqqPnohxtN9EhqaTHNuPAah6sMYe9CCdhGgeDangSi52fCiyWfIB3O4bjeKbAnJxVqHUToGevDEy0FWDb3F1wXUQc++44FS4+jifBkWv7FC9YlzqPuOXNBdXYB/MjSBa/7LtCQH0+ZT3bSc6NJ5N1jSWmGA+wqL4eBHrVUZVJIO7t0wWRLPKnubyTlDhkUL5vBv0SkKaPeFjbYdaNC0ClYMm8v5FdLgbKEF4deGYbmEEnisk8Q8bqAkw8RzttcxTGz/Cgu9hs7fTeBVNU/eDNHEYLH3cTBmmd8/XQBLIm8gvnPR+Gy695g616Ci8U1QVf6FQgJNdDXCf/BqinpULN3EL7lNvNw8g44HCEF5klAbZOMICvJHfM0NnJtqCPUxlmCx1YTSG7wpSINdbg2IIiFa0eBQ4cOHP8aCk9sHqHG7mug5P8MP1i9BPEJqlj/PpcD0s5Sc0waZJ6YDBUzZnNvtC39Nb0C2kkVKOtfjGb9wnyjfjW/0k6B5T6NfDwfYPWIYFDSLqV176ezTUAt50puhs0bPfmrgxjNeexIW313Y9vIsQAhNSR+ninA0pr3Nhlz5GoTVG20xE0rvPjhDDt8fH43C31GoDlCuGW2G1YOypCbyH6Okq0GHRs5aN/ijnFCLZgQWcDNtzUgrj+dL0vfIGuDSjB02oTih0VQTa4EAgVPU2HoHuwUlYNRItqQ/2A6XnE8BanbX6PZhK90OB5wztd9oPn8KY35Pgwj1HLoeJsZSJ5cAD96PvBRbXEatJiPK27PB/Ex1+g8neZ5hr/xvudinHN0BAwsc6NT93QpKXk1VUcIQ8QfB+5vesgfcmNp8uPj/DD5ATRKKkOWUi+0/VOjZfNlaHpGLf5tHYvWE7zpyfOreNLUnDM2qdCqfTqQWnYQ+mWmQouSMPvFxWLIwUmU8egFOavN4C8Ca0Hz4RoKD5oO3SpGsF1lFa+x+QLrPbqw/Hw0Glpe5Bsn5vPCnU6U2etPQysloH/FIfq89wPdnRMBpR8fgvgtG3A7K4rbs7JhZ8tePHgqDFs2KIG/gxSqndzBUX1nYF2mMs75aESY0445mnrYeHQB+cwaIMub4+Ht6C0UUnKd7p8OogdT7lK17SaOSzzE8TwTl/2+gtdH6ED5PxOwP6sPvCUM9X+/AYOfCVTkmAQ6keMpK0+a7aQqcJbDRJIfrw2TRuTjvK5YcMr8jaGOf3DA/xGbhYzDF4W5NBRnQ9nDhiCzQBEWJm2jC4UncZpwLSVnWnNTzlJ227GSbmRexu8ivvyyohKXOotD6ZfTeFplLEbt8kPz7F4O+JIA9slOMO38HUTRXbRv7xKc2ywNqfcm4+6dBly/rwQweidtad6GqbInoX35Iwj/fIhEZwajteokGFzfQPtDTdlc/ia1d/iC2L498PPoQvAX/4e7045AVk4DrJxhCuYZd3CytT7cf2uOo4pEOPzDQchWiuKEGdqwuXgljHC2wdB4Q1jYNREzJ8+Cuos74YajNuQvi4aUwSdga5wP2xpOk/1pezrwejzcFdpIAYovKdpNCwcVHDkmPA9WOc1lo7nqHLLxAolv3UxjfKTB/VwW5j1Jx1knl9A8KQ9I3bKKHGRGwZhXYbhm3i9aecYWCu5Ngff6G8DG6Ads/dlCpWtWsYRdP8+OfUfpz3N5oXMgfyq4w9bZitB98DooFG3hxMnX4fV6afiWr4SLpSvY8Y8IjdZ+wW+rp5JuugWkHt1B17okaYpWFp5pfEFGx1Wo3VWGN3/tA4uOOdTSkw0vx02GTbM30I5zV3lHuyZrKb0lp0Gkmt5G9hn1BHf/J4Vz6CscyBgDISKTQURNnG99mQDPA73BeWETzzKLh8qFxyBgcDZv0imhZnMzcD4oxCUqn6i4s5CObbfE+tprpHnSnHI6LHGszlsI+3Ib6mvFwVRbjgJgF7tXN5LqiGc4Yvow2isilaUtgUpfpsUfE2jY1hT6xUXonHIBlLu6gJ/EaGxrvU3J47Op0PYaC30ogwNF6SwjZQZ6l9txekkiSe+05VF/72HW4TBwELkEUb7rQfLaHLK3O4ULxKfDzYHtnCS2EXstV6LywmOcet4E9O7uoFUukayASVj0bjG7KSuCheswSx+/i8+KamD8SA84KVnOa2/lcqW9IdbMfUMhgl40OlsdilY+gs1mVkAhoaC44z1eGVwKpxWL0S3sLppKPsKmkt9QK6YIaoVzAGbPgNkbI1l4vAJFBqfTFMcQrA10haHpgfRecTv8WCcOUYs24SV3I3onfw+MYTaenbONvc/40Y3/fFDkw12YrHWCW6VVYHOWKQy0BILmyp0w6UcK7DdZzCV79jGKASSOFGPd4gl8S1sGIsbsQwEjB7DF/TzqtiGfy81kax1FTj82zLLKg2zW+xbF9ppDZL89poaO5LzEfThFNpRUjg1Blaw5rNr4mptndECn8mee+loDZH0e0v2StWwZJAru/R1U9K2ShR9txfSFT/Du/evs4/EWus0k4Fx9Nh5OVOHBeY54UOgaBpyupFs2l0n29kxKmy1EQc7TqeXqDGhKGEYccxgUWobg4uYluORxAqjdXEKN439CvYwsTpcYR1OOScDDgcf8+UY697+XwqW3HuDnpy4otCeV7075wro2QfhKqIPr2RB05I7zTHslSH4nC5U/VnDczVkwJ+cV/8zpoO1rm6DgmS/tENUEF502XOHvTJ11opATbwA/h/bh0JZd2Fy+lUznqOOiw6u5VVgRvvzWZ/vD22kDlaBoaCCaCqvjs3HzeNxMYzbSM4KnK2Zj+nkFeFycBJLT1HhCuTg2Wr+C4b536BzfB5d25dLMzVvRumo1/QYNsEuU4PRSWTKZ957FKYwqdgTQ/YPPqcVlkDJWHsPKaATbECXILynBdw2L4NncajL6a8BO+vmwV1UY46zC2O5lL135ak+NF0zhTKgHpE2rxbsBBZg9V5BqtkeS8U5lXiptiWE/Kvl2ZTUMFhnDu402MPqMPWqIPqeP5m0U9lCHL72KptjtzXjG0BrsktzwfJM+CK8O4NkPWjCmeDEvuz4G0n685XEnroJMDsFZkVa+USxKOvFKcLsgjO01r1DG01s0f/8v3qUwnzlAgYxcJwIFe+J1jxPw+hnB5Z8X8JN+BHqfraXL43r41Nph6hL4xPVagNudT8KN1ULw7owMLNQfiXtEd/Pl019AXzOBHobU0qnAVSw5ORdcHeuxe6cKPhozEtqmamNPjDHa6tbyTeOp6Ls3Djo9i0CyQxBVj1pQsn0DCj6TAW+3c7gwIpIODP0CSQkJXPQVWfhOOtY3N2H9LBnamVOME7ZJwjirY3AzqIALNA1pz4jbbCa/jTSF3eFD1AE22OMGbT7N+J+YFGi0B2L4yQoQfmlJyyV06aasK/xZEsGKqQUoVhlNZtHqIOY1DWytzpHWswXYrPaQs563UHGbHzkvd4W8r3VgpXSWBEmB+4VlYOJ/FXjAPAGva4Rj5Y7d/PZEHBpqKGKB3mz+aq4Fsz2+0HTt8XC4pp4tFTZQRMBNOKFaxL10l/U3vcGEpQF4NWMKaz8vgwXiKhC2YRAnLQrGMtW58OmnIfT8DmIZaTH+IFHHB+dkwcDuAeRoFShwPAHqYatAWHs7zYvfidnL7vABiVOcL3wcLcblo2rFOX68COFSVixetzsOKxVG0tv/duCg4EIMfH8W/PLq8L89c/hS8C3KL1KH6EABcL6QwxdaR0Hl/gMYPEqZLk1K5tiBbrIuDKCV9etgZO9YyF+IrC7oyIc+64CsXjAVZd7A2zflOKR+Plz/tJp1jGRRMFYeekqnYOLDJLj8M4m3d+XQ5I9r4KTOUTC6fRk84jzB4N1htv+sCP2rBun5inJY5huBfWZNUCG3G1e13mWX5VPw0249GtF4CcOsCD6aR2PfisP89vweHPYfgmh9K/jofoDHNHjgnF5Pqt3QAiqRCvDk2Aq4IRbAo7x7MM/+EcZajmOL/ZL0VNYF4mr0WWxFHujeZLh7Owy19JZgtcNtULa6wKPFsmHp1mGUFGqnqymjqKbaC+TDJWHGn2kUqJvEb36u5tYvN3isswicar6LAp808fEzJbg6LhwCJCXhc1wsjYywpgodHVzg1ITX9zLKXVhHFC4IWWU7QSjLDloaGSYobmBYsAc/vnOg3zNugopuPS8Kj+CbHoEw8BfRxaAGSsgI0jzmUfKuYgxLdiLLPi1omiHAV16NR/FzyrDxVgB7zi2C77/1YG7hGiqagyx7Vw9eLI/FOetHQEDjCvok8RA6NynSvLExuGv+JDjg3k/tlV68VSmKDgV5wIT1d7ChXxCkDhby3iP3SIwsQFJbGebXWlHP5HV4bm04atkmQsYTFbh/aQwbxWnz7wwhbOw8Dyai08B94RZ6lCaH3b76EPxsNgsGrEa9HU+5wl2XP5+fDwWHu2ihFUHP+kVoeHwxWP9cBaEGkiw9YTeuKfwCq6qVMaOvgX/Ix0CToxZ8ylJg/wpXnjNSE95ftwHR1kKW3P6IbNb9oTdCM2DqBUlaFi4A70Om8b1tDSQ8YTL1bT4H1/RnY7nsD/DU8WcwiqPwIF/uC9MGNZlhKJ1Zjc8sC9jJ/Dwc6TdEoeO7oM1ODFY77EP/9bvwTZg+7B5MgRa5eWz7pZ5znI/Qinn7cbrJNpLvcYAl9uN5ULScOw8Ig0ayJjde3QoO0jLUP9BAbsZz4dXWDraW/w+WLOyghNmWUJM7AqSWW9K8HE80PhXCc57NgwkvpcBvsS/ekFwDt6sd6MFZT0w2MwPs1sExiXroduAg2A9bYUxBGX41tqET25aATdBKmLWrgihCH7b8teM7M/24NCoPNlufpZ6FtViY2oOpQVK07L0alGZkUFmiHNirlfDJW/G4ev4P2mCey+cuGYKC+3QQS2kivTtP4XN4IuoFq8Hlt9sod2Q+TTs9COrua+FvmjmVb5iHwaNO8sudu+nWzQawVjEA0eL5WOZ6n4yjhUHc04lEX4+m06mb8Pu+OBretI//CqphClrA4EkRfiooTzdVS+nAPzP+lv2CHua14IeNmhRxzI3Wq9Wx5TcNCLgtxbWGMuh91Rht8A8qSh7iFrEDoJdwm58mf4bF17tAU0UQqhVL2E3YGPwTPfGa4kX8IHEcR9kIg29eHS9Ys4tf9KSzZ7ol/C4z44ytnfS4u5KLQ9RYeY4hPTH/QhEvtGGx6Vwy2pcHNd2jACa00TfXF3wg8yWILhyHdYHBvNBoLW3YuxfuTT+OoWLW6KdvCueC5/CTk6fgp0om3Nxngjlbt8NWxW7oaLqBr82vk/D3kTT+qwBMXGyDKQ8vgO5lA/iR10BZLwxIZSCBJX4XsIjwceQVuyh/jA7Ib94Nn3vTaW60Mpza8IWzAmRg0LoM5UYsxuC4xWx1eiK9+TAdcib/4y1Vmdx9QYwvpQSj7aZRfNxoPmbdMgPDeb9o9RE3clJThsjOGprwRIcCAwFL9ONQeZQkmbU+RuX/YnEg9hTOcvkFoVmmEOzZyHbf5tKEwrX0Uf0Vy7xB1PIYSV0PfmP/qkCWOiKGJ3gkGJ/3wdm1bbzCUY79E6M4rXsrhFf4sd3TU3xI9hpPWfuVXBIYXvUQ1op7UuPFepom2UOrKlPpXV0Ih0qE8cknWahoZg3Dn0XghZwuJRg9Qh8vCxzn0oWRM9X5v1JfmlSfgyFJ5ax4Iga73SaB+ZmX6Dr+CQSXXWDFtTsw282MpgUZw6vTI3BJrSmCyD7UjVOBrM0tMDXmOWtoh/CoLZPJZlMSaFXPg8PPXrBhmCJ+GTBg70YjWHfpEN3WXo57ZplBJxpzf8oF+OtdRS3K4njeR4BMknMh3HUSsKA9Bl5UZK1z4Rw35hd5jNamCRse09pPzVA/+B001Tagv7E0THnRAGe36ZC30E/IsMkBzSem7Fb2k9/9sgeBS8rkk6cJY9fqgPGXj/jpijxXqW4Bl2euNDrxAfzdMp3/e/QF9SqqSNV1HObfHgHLf/uhWYc3ullkU/6XDZTWKQJ9SX9pZmAPZS06yyumMSyTV4E7AU95MDcM7gquwMIFPmjYXQml55Mp/poF/fI9BjZnY9kyYDwcy9YF3+gs8psggZomy+GCxmGYH1XCYsMRNDL7PRiWrEXxC/pga6tCmXG57LDMmV45toN0VxmNGTGG3xbYQ+evERwo2stL5RUh6fclnuE+mj8JSePpbAmyG/7MB3umwTavMaBuNZnvK8XCeM/R4B9VxMlJW3GMx3m6vHEiD/+9iWIbFpBJ1XMQ8F3B+zv6ebb3eCjMZbrXeYduRLTCzBJTHi4dBevtb7CjpANOueEN0s83QoqtMTyvioQ7LTr8LU0dVreNpWr0Yqk4DbJe9oUDz28FDcGFdDBVCibDe1LPquKZZhPpYEQQhdRa0d/+AF4lbkBDS79zi1YDLXM1gNKzz2nL5sU4emsulZsZYVeTKGXu+c6PLObT+u/vyeFMFI+6rwJPL9mDzewBarq6l7pXpLHb7Ai4sS4QRq+ciXGjDfjKpHbYZmACVzs7qNr9G9+ScKIbC9pgc8NaXEsdJLH4HXfvioLNPurgoakFLZ6zOe5kNLdGRNHTu89JsTCFqn28oeXRK7x/XBS+fFlLsl5T4PvlmZSnfZh9UzZS8dvLtGulAN41tOddvRPY3WwIPqt94b51M2C2aSCn75SmBcf30EDETPKfGgzlJar81UIdBGANnR2qgG1TJkJobwAffJGP221FwdwsnjeaqmLkliourb4KoZtDuWVLF7SLy8NHqwoKbqiE+pvxdFZuHe8yq4LBcSok4CVFqksiwK19NksfVgD75lbKU1tE7hcfs/bz33inwgnuKyyA5GtdFFbkBrLr7OB7nwKotZ6jqhkLWLrCCs9PPwcqstHo31YJ545+Qo4+Q/mFtyG10BTEWl+Ac/AF+BrURFE6Opi+UwD2KmzGq8u2c4hEMPR55NGBWnN4E3AZ+vqGaZvPFfxgtIr2PO7BpNJ2dnoni33630Dd8RfP8ZsBPaeksSAtmsZJ3eTzavYw++xMLvu3miqnAJb9iaHjRibQf18GJF6mwt0DR9nqTAs0XT8Kj6UP8o4cJTD58IS2JhpA3EZC/0mT4cHSNZh9IgvuZRHItV2GkNg5UOS6iUWONsGGwGSyVFyDXatGQxwkw8ar27jYUwCF1l7hh89/oc33N+xnjlh6IZUOJjnxjngBUPl6nA9LrwFjjSP88UEYvGkVxpMvYzE6yp1FAr9RvWQPVY8FiBpciksmptE3TR+aLbcCYtztIHaBBPl5jYTzguvIO3krXTtsCDVt6eh/t4eqZg2TxdohoFwLytoyE/1lK9AsYxjm+q7hiEYTqN6kiSWPz4Plh3iAZ3U0ZHCWp8w9Smm7w8Gw0heHtmrwyAotuNwTx2/05DEgKh7Tr99je71rWK3zk/Ll/qOzxU+wYZcpqMeYgWBDMe7ZbEKhAQF0xKGeS/I/cJ2jPDp7D+HFv4mAObG0NmgsaG0QhoIhImXVO2SUlAnlo5Oh6YAFBm6eSOel1kOl3Fbo26cAbgGj2HapNRvnf8fmM7Y0t7IT1uS/piX2dbgtyYkzvXtZYakh/PmQzGveGoIzzedZjjZc1fiNZO3WQpVbI3ZV11PVqu08X8YSrjxNQOFqU/6VZcGPfsrg0pnt8KNbky4ZRvE100qWrzkFUv4a8C25Cgari3GjwxcuulcMsQHfQFJxA3ebLSAHr68wZoYsR65hWIKv8enZHHww0QSECo7x9XG38EKMGFaUJfOvn3/JZsiDdWaPgmZve/w2zRQ2BW2iyszdEHlBiCuuLuU7KS/p3oYlFKzbjPqKQtB6UhlF5Z7C4Rfm2HfShBQeSqHLRR/4LnkbN8QcAeeYfeDspQkb/R7C/DOVeCMzjR4NVUPlHU10eakARTYm9J/fJFI23AQvpguAmds5XqluT/kBliRemE6aDr08VsobRQcU0XmZAUUvOQ9nxljA6XU36bn6Mxw95QDvE95DfzIdKFqvF96kngcVwTwusZnFT7wlYMTjFZDg9ZVEGj2o92cevJtuTh+7H1G2jBqeLJCkzD2L6FWOKKzZq0T9zaV4QvAiHX7TQ/dXT+fsVg1yePQQQnaGcoDeWxosMYRjpnvIya0flf9N4KDzImxT8ontHS1p6tEM+jatBtxNpTlGQAwG81PIudMB3sf5Q0q+Frp9qKfRYaPx3463/Np1MR8fvsuffo+Gkr92YJPlRbfflJHYuEUYMxCNIv/KKY0+8/LXM0Dw70u6OYnAPdYeTJaXwsy9IzmQfVnDsIAjHJ3xs7wlK77IBcHR67D84BT4VHwDpIzvQ+/ru9Cx7iNMEukHbc3dvDzzK7j6VOKjHfKYUSMFh/cP8V9rBRZ+10Z26lPR44EztfoqcMtwD6pWjMarL7Xw4CIdmGujx5Y3LVHLJ5+urtnGWvv88b9DByj1pwSO0rHjwvGLYOtmeZi/9RZFF91G2XHL4IbuKEaDe4jeW3BtdADvbH7Exs9mcmv3WNh1Q5sCpJI5ynoZmuUJ8avEFPyRchxetzzF12qr8eSxOtqwVQwq5ori/hpf7gw9iyscH5L2SkkODpgGz/O8oORNDF7f+ZoM/EXgwOZRELDSho4+z6K25lrsvugLhkf+Ue3qaxgfsBg+PHbnP2aTYee/h7TmmB7tsDzGvUUFZO0XxisCE1Cm+RCkzeviAJtH/NRCH3J+JKDqtGHQuWnPliaO8Gq3HRh1GYN5Yx5uD3fH9cOPcHCUBMCeUTAh2AUfvvfCBRcK4WugGZ49mo/zqx/Cgbw5rFR/mqVHMry+dQ+e7FjLKSHT4J+eII07Hg4LdP355fsnrKGzmFrObeG+VAvgNgNOt/6Oe+t3QEtKEn1+oUB/av8i2HfhNdBAcuihmChD+O4pANeinCD5oxGEf7rFhgO7yU43iA6fWo6uiamsa+dD254aQk1wLUd4pNPbH2OwJGkJWAWW8pX3ddAt/gh0HLfQxvlreZHmCHgxNJuLk/aB7p5rZCtiwI+L97NM9yNodknB5YEhJLdWD9R7pkLuHMa4KQ+pIFiLvo5O4jCLAI7kZ2wvFAOxdZuwUEmGFPaqQs6cBiz5sh/bFdfR1JHToE/gNbQOPIFnE8ogv3IyGns/5O8HDODUWFn63OwON6sN8MjnyXA8XAUCBqdR2r5MuPpbDm/UJZCquiI0aQtByrtofHq8iSpqWvBqiQNfHmiAlBkCMEflIU2rGwVyQ5NBaJokFHnMYpmCSVR1SB4r3ymzwltD8PpkCkWmYmSV85YTJ2hB3EZhtpx3jY1XivOJoCq6d2MKyzq9IpMT36E5wYcfWOniGWVZCHgvTr3hyVwxKYeLoodpukIe7m9ohbOPTOmxywDGCF8jqe4xoHBLEtyTV3J0syQnXB4i41OeHPlTlYQcl7FXnQq8OcegMsIKMqsqcZnOX0h4OMRCUAU1VI/nO4whbJMBe7etYk1vCyx6Mxr2nw6iF9GXMDFZgWO2F5CzxQ1MbMpj63IrGPfsJaxNXUIddaqwaIQRnOw8zspNveyclkqRnrpg/XwB1hlkQc8Lec4M/UsPDxlB266n2PVHgsMn5POCo39QuH2A3lxLRC0IAaUjXlgx/Tv8KZsOovuv4Jjvh6jm+RW0tV2FPn1TccjqBE5I7OKpZ8ZjNWZj7lkNEDUcBDZXg3K7SOjYfQlVvgezZVkln02Kg+il++BjUjBZ9wjBFaNgOvhnJ7oZiuKjC5f42Qkj8Ao/he+HClHstxXF3l6K3lflYPdqBQ4/dhh3O8yCnLrVLHDFBjc3KXDOh1zO2HcQv5ocwofrLGGkZgKqluvh7TUBWFX4i4/4LMATCUqkUVoNKyQUkAI8qd5HHZQElSjwjxjciRSjg4p1pHNeBPRGG0EipvPVqiiq+7oAXj9gqGo7h8bG5dAmtxeD1SLJal0wrM/2hJv6dWA1t522GF1C711qoLb9DI19kYNLOoV4kkgBeI3Khdl6Snh7biK0LhkNm759ppC/U8An9wx1mpajSsswfow8Sec5FiMSnrD/nDSauu8Apk0fQPt8UZgidxeV5cvI8IcAW9z/gfnpREMh+8DUYSeu3lMLbekdlHBsGpSdHoKK1O0Y/j9x96EIhKIGAPgfISMSUnZWEZLIShQHRUtLCknRIu2ljFJJVoRCpawkMxUppNCgREtGpETapSjcx7hP8i0K5/o1J8Hg1WWIFl/AAp0SZBkiRVWSR+l5oyAUlyIdDE6hjevO8v2r8ZR7xA8+j2pA/VYL0u9qYtttznisaBRMlLsDm//NwhVzF+CUHW9Y70s4XmvI5HX8CFZdfIWqnWdw41uEmNllMG7JGrqab49H9NtJLkwaxqltAkFeQFsC9vGvR6cgxU8HfvmLYt2+HyAnZoo/lVfDGL0hGtnQhIunrIbQM5fRLrkKZ6pLwSRZLd7xiaDXVJ8GFTaz7OJ6vi2QAvJzt7KmnRJ9dPLB44+FYN/GDfgcEe8G+ePvr3+oV6qJo0TO0gfxSbT2nhxp6+7DEZ9VQavNiOvkIsHqkxO5OmrTlKA2WLn1F2Xv+Qhe8nqUwCPx7RktCNl4GlRH+EDxmjyuTlzOEgU95Je3DNeeccNuhRyYJiFO3nkqELa4nPeLWvAUZ12OK0tG89xnMEEqD22mJ2Pz0x9wTKgQYgbl4cxXRzRcnMBDp/7gj7nSdNxmIeVAMZ2sk+OxEX8ADwzSjT9iMKLOkG5vU6GvkQvBCbbgAZ0XcGlRCz9b50o3NbZgX0IiLtwlA9aJ/3Df02Dw+HgeV4y+hk+u9/ON5FZSm/6URCCOJnat5A37pkFc1y0y0hqmvyUZ3BE4gOZbN9CZyya0uf4VtUQug6w+Q/pVbABfouqo72UvzVDcgwb+IXxFt5scR24njeVXoO78LloT704BLhbwraeFr+3fRkKp/RgeXw5ulxbiv5P7OF21mKyCpaDV5R6nLTEB58nLeHfsA36V84KczRNgom8zaZT+oGvnReGOVAGoVZ+HOKNxkLu0Et6OWMN5syvow/JV6CyxC7yu6pKK0An+eFiUGsJ70WQrQBz5odqkAF7vV0B7Lsrj4lWAzWvquLK3G1WPpmBXWiAdi54BL09M4/ceqri02wmXigrSHbtGSLsmDltr0zBKOpJl99/AqwtHQGXEZr49to0S0o2w+fI8DjX8DYdTF7JldhrMajvDk8bI8fJpI0Hq2X9Q+sqE/p5ahfOOzEeN3WN5bNIRPD+xA66eU8Cm/i4qrVOEY4utqeniCxCbp8JbJEz5+N1QHDWYCwZJC7lJMIoVv0vCamMxmPNUgKzkv/O096tY6sd4ljqRQP+E/4OQWDd8eL8AcrU9uWWdBkybOAvVSB6tjszjTltv7pn/kPyfGLBjsTGJlN5m8MmkJm9DyHsjzXalayFL9AVPr/Blra/xnJr5Df9aruMDIX9BUloOl8iIgMY7CzC83gqTTgXzk3t+lDa/iwM1yqHg+gCmXk8nk+fraLz7BHje8wMaWrfhZHMd+nDFFqWX3iK8tQfH/x1L2zvOwZgZK1h/qwQcjXrLMyYGgbGSCZT8V0QnPq+lKJVO9uspgMeHL/KW1ZkkmjIDRpSe5D+fdcFMxht1w+pw9DrkK1nr8KjGVxgroo+7MsvJIGUiPFB9AM1R72HarktUtnkpPhYWIuPEQA5Sn0mXctrQV9cXnshJwNjmRnxaOhtErsliv4YnB8r8oYz5e/HktXZ8Et9CGdGX4aGnLjxYF40uG1o586QI1nyJpZG5GnhQQ5OEDET4ctY4rjeKITt/abghHUo9rtG422kM3b4dTTKtI7g81Bvd3wmBeU8Yz7hwC4/PFoaRN2/ijoUXeLm7P5sWz6CZXoOw6NsEnif0mp99jAGh0K/8tWgyZK5+TH3DmejwQ5cSfn4CqeHX1N03Cy0td5Boug8d+3uSF9vow4soAT6TEIVy94bxmlAS3zx+HZcotaNXxxUa+D7I929vw4VF0nBruj/OtvzND4vvws63tZA7whWGPWZBf8ENTrIXxcLxI2DhbgYx13IILRxNL5Rk0f1LAEcMppFUbCzpjzSjS5v98eoFG7IpGwntfUtgR3EtGW6XIOGp8Xzsgig6XtoDh3f78JN0M+r4nkfu9ePgi0M6ZKZ5YaldNR24kc1eB27gUo8L/CFBmQqvJMD2CRqw4ZspiPWtxm87S2hgoxkqpDiT4/pB/GRpQVWPR7JvWCAFFv/Gk2tMQOHTJc5qDYEr4k9gwMWdMaaXuuMvQq7rKxr/wRTvh4zCT1UqMKKuBB3+iPHa1SdI4HMiTxZ+j+p+s6l9UBokDtuB+KnF6HrLDIY9EtBDMh9OWN7AgBev2cm2EFo3HYRSw0YYs9IMOk7+JZ+7ujBJeCNeEh3GtqJHpPXqPkx8qsm+XR9IzlqKXXXLKGjhP45JVYZ4BWe6ekuK/ZsfUIV1NuZrTebRA3fgVOlmGj4diBph3yDbFkD43wVe/5802Hcm0usVMyBg5B8OfBBJKoE1qLzxEq99EMS2lTIg0SZD4u2G5HJVAkI3xlCJlSYefmFPe0+nouOE7SQ1NYfsJIxAxeMVvl8fx9nau/hP9CVagL04s+YUOmxfSoHrmiHS2xbHBCjBvMex/MpbDTuLr6Dmexd+87uf3lg2oZOOFkR/z6RJjydwYKAxPL4yCsbGv8WCNGfS0+7AJbX3IaDZkJoLNtLjRAd+06THA3uVYLqIAojmdtCctYpsf3ofbyoM4dprf6hj5xGcoLkUgi2F0fmnIaSr+7O4kwBFps+CNZPfsYjVOa6Z/ItnSanSJeUamlk7mcK7LKFxxQSs/rOGvmi2wKM9e+DP+F6I69vBGrq7UHV3AxaKbIZV0uJQJnWAFie+pv3DlbD3AcK54TH8VKOJjio6kFa9LVb8WUuu+gTp8bG4TmoqagSa00pnNe5MU2KtjCaQzFfi78X5OGGPJnx8Iw4ZJyNY4qkoTko4gjO368HqxjcY0fCC6hR04YZYEdzuPUQC5rLwPTuF99lH0OfMf3T160NY9kMSJv46xkePRPHmAW+QWh6KEi4WcH7pEWib+JaqFuaC91EFtPuWBdrnXuBL5VP47VscRviqUpGNEax6UMs7Fw6jVKgAhcqX4PlL3Xzt5UXW+jGESStC6MhWGTzwxRwOfnrFLzo8SdDcm484exNqz4UVwZcpR8gP/wk5cp7ZJFydNxmePimi/yICUb/UDIUuP2EdSy181HwMvu6PRZlQYebDR9B1zxR4LfOaJ8bPg+tfirlcspslc/opdLYXjNltjJfU5uHeY6KQZz8OSu88Qf+rO8Ct0otcRIX5X9salBSShBz5IPCYf4RH1ajw9jYjKH+rzR8OVNOpAF1K/7gEV9Y7w38ye8gr2Ri1NyWCw29jHPeVQedwAusdFWDt8Hq6Hr2Z7/bOpJa5+vxVyoaiFJaDj0Io/NTWgF2v4vii7Quu9xagxE3KUDTChkJlpehyyVGI3JTLQ4YREC+hCDnixrD59QK4VuQO275p05YZF7BeCuGTZTa2nZakoT8X8N1tcYjZaMEHzmyl/fuGOGqmH9q/mAh/PffDnjRJTk1cywdOVUHjQknYs/EZK5d9hbld7vxJopbr1tlCc9JomvzyLJ4N1YAgQ0D6LgaT7iyCIw8daWPFA85qV2YP2Vm8pe8fxmjt4DQdV1KZs4ve8zTIOLuH30+s4oIzJ/hkTggVLhgDr2TG4EmvZChoMcHvXmn4YP50ELoZxOb3NkFgTh6r/ZZmz3pFVLLex2pBnzDGbi3MmbONLx3ThZ/FZyFX3BHKbt/Gsyq7eHnUfRw6N4k+/06AN/trqFz6NNir6YKlaB+1Ocvynfi/rLJ/DhXfTEPrs2Ow6Y0Ejtf4SeGaN2ngnCVsiraH3Iu+MEVqCi6VF4DLwYxeCgnwaG8nSAtZsY/pIOpMMIEV4Q/h8Lb93OFFKHVNgrYfVsU/GSvY6+cF3JC4EZ9KhePijJkQ9e4DThdXARfxRpboq2CnEw5w/+4aOjH6Gje3qvG98m5ItNGHWR0H0LN2Ku4v8YMZJndg1b/7sGh4KjW5lYCupwgOKp/DZh8lEN5uBSmPB3jbnEM8OPYeFnTkcZtkOtIpFTi/y5+dH++l3WmTQeFlBf5IJ8wa/wX+SzKDYH1DnKsMHJRWhUUe8/j2F3XUTjaFUy8vAJy4yF/fA7TJ6MOxgcOwougjpvuVk/o7GX7msBsHplpA7LZhUh1aQ/vNGMdJFfPK+/n8+/hlPNKlhW1Xf6FmQTHfHyEMe2N/kseQK9hF5mGjxmze2zses17K0hHhGFgiNYgdLhP4wxhNeOr7CjBwEkrbzuHHdVo4PyAA3n7dQnGronBVRCVXfTiE+w3FQGJGEh/Kj6Ai5/Hwz0QVpt6uYe2fBjjf4xT/s13EjxyPoPlTMVC1OMoLwvfzguYwyu+RAjf/WizfOxNVWjPo6q2tPHmCLUw3nwwFy3dh+ZQ+HBd3g+0ig2GgJAB9FVvBN3YhSjqeZt76GRskjOGG2AQc0TkMx63/oFa0HpsrNIL22UR42/mYkxYdQ9/qbVS/UAtqo8bQUq0L6PuqFu26vtHHDckgfnUkwPow/B66HFvDXWHKFQs42P0CJV0soO3mItLyjuSjZ5L40sOznLzelh27U7HIcAVZBMvCT1UDir00RPcbBNihJY4+h8RBeMQ0sk7LYb/MYRB+vYn3ZSLs/TiB1Qs+w52mbbzA6DgGnChmP3Nn1Dv4lTrv7uVq+VQMPSALmq+vUvOSuyQ5FEuescaoeHAk2v45wAoNZmi9NBW730/hbGdTEGv2osRTO7A0+hSVt8lgzM6D9C3RHO+kSqL7LEk+hFN5nTfCueMj0D0yjF5sPgrmR9youHAk3/j6gW5MiOO58aFwRF6YO50t4Fh6ADp9RsCgMSi6JY7VC8RB3VcIM6JFcZVXId65foLOPVWANos9mBwiSmfoPi84+R6szs0AkwJ1ys9sxzkxZTSz3wNf2zGISQ5D45JmqJT4CNXb3chX6TaGJhTw54Re/uQQguq/CF+264K14yDqJm7jX8/y6OIaWzyz/zMunPSdFFs/Y+mbHfB8zGGUyR0J7Yt7+PtkazzXUY+loVvI1SqbqzckwpffO3i6fw7/O/0KZl/RhW6Ja1BzpIIKRsqg5LR37GtgT4ckdnHfcBn2T++jl/O0aJq3PlgqPQRX/RVUmVxPU+0VyCxCjPe8DEH9X03UeD2MhETP40lFJdhdrArlrwyhzjuY5UXrOWfeX7I+8IvDJi5Ek/FmsKMkgGITpcDqwy7oXNRP8/2L6GuSPerqBeLlOzl4MOI8WqdP4YRXguDWKgN/Ta1gWtp4UtxewmqbcvlU1y5c986V6suqeH65EOyyF0WVcA3oGuPDeb1KJPWzl0yzg/DMaT16aRQEs9+KUd8VQ1It7+FUDwG4FXCQH4VKUGVHAn7XN4P2ilwMDu+BUN1fON3HApOSj8CYs9OgUjeDPslcp9FP35DF87cw4fUa2u4yl8NikDs+fQWZ3WPw2Bch2JiuxQcdNajOppJXf+hEiV0XeNKvZ7z/hCFUhR2FxZ/r8VCtMcyZPp+fnI9ndjqKehe1ueSxDs08dQUf3PYHqzgxnJ88CCmrTKDfrISPPm3izIMImkINPHPfAEZna/L2wyW0d8wPXmJ8CFNfq0NYsAKPyerjom3G0PragRZpdkLTsQzOPFLA71+uB7ttMVhaaAgy/8rpbm4Xr9w3iTljHU6Y18nbZk3E1OF9RI09fHPBZRgKl4b8SZmYJxoHN2uj0euAGMq31aM2LAEXz52kxsCWipUoGykJiygWA2qq4K7MAQid5EQSqgGgbr+QGypnU3CSFoQFa0Bu23RotT1Hqi2p9KZXALRCjDiv1ZZ0vZB+vHnIgx6Is+PMaI2dOmTtsuPQFZYgprgS02d+xe0ZBlwTJEpvu2ohaaU+3NraxVmrReH2hxQY63od9ojZ8/KnFfRs9C7Ur37Ct3qH6FeVOc3w+AlxwmNBRyCTyysv0aWkZyTzVo8FPl4D19XPMP1oMJCoHu63LGKByxLwXKqc39hvxptGwjTmTBUmNN9AlTTA85vzucyjB5fENrD1r1FwozqWmw7dRYfyp1DxXBv7b86h4i2T2EDwF19cehtlDtmB90ZDCNjwlUcmDvHo76YcohNK0S7a/E3En+9emE9qaivhwvkTmOWrBkZCinDvmD5MCjyImyZa85lGJdzDxdQQ/ZZWv+pnhcjjbBE/BQbSdtGvT0fw46ZzPNu3gw58PQQOcqpoFFVFXyNSuGJcMhecIgC3WzzyZyFsOeCER65PJSGHJxymM5oaW8eCbsQ4+OZ5ALNOKsIO+TJMMHhJPiZ20BBgTlequyg805duCYmyzadWvtLgiT2GUjCnpAkyYseBcf4TfrRTDHXbBUHgXROcbRamlVlt7EsV0PlCDdaEW9Creh32CpLB8OtE8ZqDvGnfRvhc4gZsK0tL37xg8eUzYGuiM4q+k0KHQif6Fz4frC808Y/hB+SXLkWn1x+kgpit0PJADR4XhVBQ7lzctWsvzvgtjE/OzOAMJxf8ToNwr7KFYgyuwOKQsaAxZi899ZTGq5IKsEQ8lo+OWoohx/U5Q34aWn9Hdpg2l5uEBeEe/KQJe7po591o0ir05RVjZKnATRg6fNRBueUCb3Rupp4IY5id7Qobxrnh0lUJtLP0LTbo13PdCWkwv3yPzydNoYkjkzHPUxvyd+ph6IoEbHxNsLRZgNcX7kaphO3sO/MAWLdGwNKgexzqPROiAq7RrMpXGHHtD30Ha6q+3EN960142KaX4lWD2O2DM1n5y4C2uzpf3ZPIG9eakOB5O1bZ3YCpyjXQyE+gRuoWzTijy39cLSBnej61Na6hzddjabnSEYrq2gP1c/+Q8/EHEJReBjol+bQzzgQGq9PI2ucrmea4ACWdY/k93aAUWwNXk05iz4VO2lb3DS79VIL1i76z0fxdqH/oJ3mIBWPmbGcODbFnp+e+VLJtJn1v6aUt3iYQF7OKz/5Rh8t1F3ghnODdfnJsRotQImwsChWpcsL2AbQImg76ljvJP3QpvYr35yDlqzzkXMBz1j/gvMFPPBiri2+PunDFRlNISPEkqW3TeJxNGky8n8phnqPBVPsJXYxhLPtSjhu/LOTlJpZQ+nIYDjx6zePypnGlYynPlLOBvDBX0OsbCT57RTB7pCR+a7eEY8G6nL+3ja7npmP4jPvQnpRHZ6be4ec39tIBx/k4i57Dt9wZYLBcmvS3lJCfZjhbf9biZQV+cDjdgRbcqKI7+2WhuLIPryrrQFdzCLQpr8RYq3JOffmRLyld4BczttIiK2cquDARdCIWo7efEqgl5fC395/xgPBusBNKpMVqZ3HKlBv0ye86FL5eBYabZFn0xAQwq1kD00KJl+tdgdovkpTfkgebVGVQYFk/Pmy6yfXOCGveSYLtJ1OW3XkLYg9txnNZ+gDVMbDyZjEfKQew6/tAOi4T+JC/LsTf2Is1QXH08eR/ELfAEs/0Z0Ga2Geym+LA/SdmQIL7QtpxAMC/UQMsrHxwWacZJcQV8ILSIjwVfZB6o9fQratXSOfGSYhnWRjRf4ts2mMpUeQYtTcdRhGfLbjsP3lSjCimz7lbOcbYjTav04ClKZVwsHgD5Mc9pHlJyXinXwXaH6dAUNUgy1wrpFWB93lnlhYcu6+PQgNvuLzxAsrPSAKoeI8PLAc5oE6C7mjI04k+GX7dOxmW+vzm19kH6ZDfc15afIEyC8shu3IQcJY3dpmtZn7/mYMELaE3qAC/PtqBNwXEaZKmMQaWzqCTTitIIy0e6u850rax5zFwlAzISqzmkNq7FLXEn+Z+dwW3SiEeNXYkWFiP5GdyK+HywdloeEge+jVEwMkhDh0Do+nk2dUcF6kLz389479FwXzzjTR5/wtDGWslkIM8LK4e5OmLbWF86Gl4/Gkpfc/8x4VXInBT6geKknjFplungl7HM/TWeQoWIknwbv4+wNf7eOf507TabQ86traBlqIwtT4QhqboH9hUnQXNqZ14Q20x6AyOYqlmN5ok8w5Sq86jz9Af+q6kBaHKM6gubzLTmUHeXmHPbTJHwKg3hZps30KW7G4WOWhNc6bJw8MH7STkeISCCj1xg2MW6LaX4w9yBUyYhU1/G7A23RMfbFSD3405HK5jz82ZdzFL/DwpZ0rz8mWipC5iigpztoKwYyHv3mEMk8dv5+/SKXS2XJFih4/TuvZCiPk4CjP2XwTXFlFc+VGQI9dNB+ucZ7SzuQFb9lrw6XuPyEKM4IfmJ7j56jCfMx0Dny64wOVUE7h55BKmLj5N0YXpYF8niSOzG7B9hyKGBW/H3tfPsaw3iZZbK8JvY21aIGHG91U3YczjfsToBl6XqYzT98igbvp06NX25/u+U0D4UToEDBWDyOkMGkzrYV+Fj7xLaC3/XlVPJ5+p0ZgfhXg80QLWJqvSAq96kHQThn2te0m38BqLCR0HHHeYKE2XtlkV8Q9pI3DUzmLvS+E0omwKxMxJpCkSLmD3VY2vWDbDbPUPfMrwKMvZaEPeuRA4ZtRHTzyb6WLXfDpf6AphD5X5T6McNqXZ81jNFkwqEwC7TU9ZpGYdvdMej8++uoPAl2PYXN+JK+Qr8NeF92jl0w0mEyVh7n9BLGawAltObWC1tl6SXRNItoHPoPJUDS2RsAIXsZtc8FEXdsQvpPsVltC7ZxvkPbQjc7saqv+mRQl/BSBxkSwuU9bh5zsEoEjiHc45YEO/bGbjjKa/fNkgCT8cOM73T7zExKZqLr1vRU31BvC+WgrjY+eBg+lqNtEoh6oCK/S+Gk4H70nDj7RCuji5G0+licG6lV04duEn8jN9ySJJSagZfA5hUQNOn/GTH/5IhaSRK2DrNk1469OFP4a8oaZ1Azo8aYfJ/JWspF5Tzc6J7FW+EEN3SpD/XnGYsPoEf3ohift+/cQl4yXRynoCK9lmskbgF5BAIBkRSTroLwENXUIkUrmYnFwL+WCyLS/+sxStjc1pn609fIhOxPHuN7HYTxDkx3xHya7FUNntxDqenlBX+RFyV7vhQ/4PCqSfYY97CEikmkBYaQh1ThtNP9+lEx6rp8akD6Aulw7j5nnQxXmO7DGhBJv9CP4uXgWbTo2kp1lSGDvFEeNniFB84B3s8igFnblGvMi/kRctJojVnsPhe/fxLdX7+KzvJwmsjOBVYw1owio7NNyqQNc6jCDnqTAsNkkC5bLNcP3aRpDrGcGmcs74X7U1a3lLAH1N43GT1lHAsDl4zrtHIqmmXHXUE1RVP1LGBnXau/45qx95TyFxgSh0Zx1fyJOBUMnzjMdP0kr39zy8KwpqPt/nvloxrFZM45t5k3n5KYRcAXFYPHIpNKXv5muRZ2Fd619MdUrCUROTIW7dMzw16jhqfjmM/pWy4KJjzLl5uTy5tQKmVa3lGQo5YHjtDoqvWQTvFuXTSIF0NCuWgfUrNOjE41hYeeUc1GkXsMDwStpouhOM5d9x1qd57OYzwINq8qCpIcRCHWK0U+4D3Yraz+Nn+NI9v2BQ+qgOjqPloV8/HGYJjYDHt+Lx4Le9qPonEmzO9qN1yV+8cVQTRTdPwes9AzReTx8aJMVB8Gs2flBHWL/AieaHe8IyFyv2hh0o8zgWpJ2EsVJwI/j1CoJj2Q7s3buKvG47c/L0MyDy9QT9G/Uc+0P+ciy8ozWjVsOeZAEwgEKw9b6BK/y/sWxwAc54cJ5E3IkDfvlhlNFHcAqtpvhBFZjvNB/HdThDjkAsl1qdpkE5PZyuLoH/ZSzFw3r53HSgBIOeAOg2XIOhPZaQP/c/cPZdDadfncI/9pV0IaGfhjYfY2Wrh2Q8pAGr5Z6Ag/8Rkp4FpFyuSgUKLnT/gjoluWhyy6cfuLEhGpNfaULz92Vka1GHIolDJGy2jF4M3UcTn02QrbADddKOgO25aortQ9jw+DVqqSeQJuvilZoaHu2VQj+0WiA6/BrWbNzAP7u9WaHFBCwbs0D1gztbLV9CB+Uz2dGpkx9c38VH3y7ElocJXFH5kpsfacM/PEiCh405PbwA+m4/ReXhbu6T9IBfaWNoaYkWXg9M54ouXbi3poaW1U6nD00KMFZ+EfskvOLMamm2em/HPeXPQHLcXbrSagDbY/x53BYFShx9h36FS9DiJR8hu9eHs37kkIq2DW8dcQK/eo+GLR+V8aXdBvy78xEb/TxLfhrJYCvnxd3d2QzebVjA6/FKpBhkGXXinpbb0CgyD/0iImmCqjLstQmhqUqruXTUVVj/czo/TpkCEZpuVF14EQ4OP0flmBycOiYL3z2rppU5t8Ds+iaY0zVEU1Xk4NP7Jmy/cxijpy7HI+a76Km1CERF/qVZOaIgKjMRg/5lw2QTQRAVsOPL4et5z40udPr+Fx7ftIKZww1gZXUH27J/gd7kYxDweAIsr9CB0+svgZmKPx20uEa1KRK4c60znHpWR+JJNWRR9okn9GpCvvQ+dN73C7sv3+MZS6tJfXoPta7ajml1u/DzTxdocdOAiKcIsj49YLTwGmhI7uPQlU4ce3gBm7wTgnohHzD3V6R60WjsKTSCcZHNvNr0PyjZKcpr0BKObtwO9oobuOxTC+rMLkGl10mkWg+g9G0TqYmUQ6JGBD567EbRF4U5TGYE63vfgSkZKjj9hhVbVY4Ez/NJ7PFAhCX2rSOXi0cxx+AhXq4WwV3V//HSc+qQEz2EwgNjIH/rTxC7Y0qtW3aR/Vg3ilx6DL2OL6CyV/mY4ylKApsnwZ2KaXD44QZa8jsUBkO38sVFm+muhx0dL1gJV4MmE2yyJDGhl1x0SxgWPtSB24ejODzPneY+APB2/ITv3cfCIvdFZHc7BQU7gH3NFSDEYxuEpxPMdBlFDj3naGxsMet0FAJs/wd798vDrW4nuHxWBI621sDzU1spQIrAMMcC9y9R4Tsi//CMxGf+VnuRzopegr/nJMDieQTLenWBrdgAiLlHk4mbNPr0XWOB7bdh37/RbJQyAsuWa4NI7AV8WB6AJwWe0MzUu3zpngvtk7oJ4oZGLOMszHEfwshrpQao96dy0rb7LJjbRXuHX7Ja3DTQTZKAgKC//DloIpVOCGbbNBV4/8ILXVuUaPWOBG5srMd7r7V5yuYftEsyCGqWLsSctMtcbSYLoiWvWee4DDsPxOOPl+do1r1BDCp9hcICa8lFT5m7e8pQsWcmVL08i2uE97NqZShJ5E+izROns2nHC8hrUoY557bDkMEn7jAUhB2543Cl7z/qbPyFAXfS6I7JJu5+e5Y/qffg+ujl1JbThTYmEjBr6j3ctfkOai5w4EN7R8BQTzBuDr8CDQUjuDnpC51L2cujYsxA+1ooTKoORlXRMfDVuABPm1/F25/L8eTgBiiOlCZfy5noHmwIZ0qtaekucYKLd2HzsDReSLqKU5cu4uNy7XQ/wYg3zNwP3aIzQFPnLNt9nAsbX/3HhM4woU6YIoI6eShwC1TdUuF2m1heYcxQ0jYe5WqPQp2YOWQFuZP8wtc883MbxWZ70auH2/kqy9GcFSNBMzgODb2CCBKyaMycEkyQBBiUTISzQwP8R/YEXgw5waGOOvB5OIYOCc4gn9KjfCOggCeKK2ClxmPQ9nTGZHcHMPHs4LmdIiAXms+hEmOpdZoi1HrsgbDXRmAbbw67uzZSgeNv7j9thhfzzWDO5gs0a98wiGR+hANznsB0yUy8f/4pa3y+QfffRuCDdkmMqFEEu89vIL7lM9dKroVVZ1rZt7SAzfe6YdFyO2iTG4Rnpmfg3FsNqPhvESsrnoY1NrfZKbgJhaw2QYS1BF7Yqci/iidhtrQ1KUfKQL7iEXyc5A39YQ6gOPSTTEsS0Vj8KZ2NXwQHHvXA+6AKVLmiAVleSXzwtzcObLaGYyPy4PpgDI4sUIOFL9p5oCOYvpl1wuWlmnAzaQPfbnxIV81+cvyYm+Cp84Ulb92BsLYftP/RQrApngKHnY3h+qJ+Ov3cnLZftIXez/G0w60DB2PHQea6ZJwfJAPr9PswT1oSvgy3c7D5EcideZPULdKgYFwgN/9+jOsuFGL1wlba/nYdyy8bBcdcl5KIXwrpXTegqWt6wEBShyW737K610d+6DMLL0lVUcYOKfik8h6ys6Uwofk43T9wAj3ijdgpfieYrfvEofrmNNn5Ne+KVAdrzQUkMDYKysonU8AmK1zVrIWXz6py9eOZ6DDkiM2JX3B8iT74PHLF5EPisG6NJKU72uGVBU54dMF1ipxdjY/ubuaQi8Eo7j8TKtPm0pQNpfQ2uZ4Wr3bn9lXNlPRACTXWneVOmeukE5RHKSo6kKKpwO+nZrPr+FzMby2BsO3TGBQaeLBRDcs6d0LdmqPE6jpgM38y+KVpsXVKH8gMCvK8yy0sKZ5BZl/6cTxsQOcwN1jroAy/3vniznF1HGZwj9xH7Oaq7dtwYuZbcJvbzlkrwmDB1rFU/Xcs8BNzNHb6h6tbv7Dpxi5Ydiiejf67CZOrvkCb90+sP9+ExrIIQ8Fm0BQ0iW/KmNAJdxs+2fIBggdMoVveigvzI6HKdAcPF00FmZF+5HAjlzz0X+CyWlVww9m4dvJFZK8tbHneEsR+97Ck7gTIWTcKTgStIcjcCGt0+ui+zVcMPdNNdvVBtGrNV76vrEWZkqrw3i2ABpRzSahyJS2TEIKMnZ5cf2sHzXxmBRt6zGn0xyx490cJNt5fCIev/2Cp7gMQ0ajGscu2c2SxJCjszUa1f1b0unQf3goWhFVZYvxnJEGA9zlIG3UbJLa/h20mnXxTKgggWJVU/PfS26ni0OTzB7rHryTdDELpaZvRKUSWr2tsx82TvPFAbCqttXsNfxUFoTfkGye+kAKpJa+pbLYEXE6dhu5t/ejV+BVq/nVwcZktDI4ZB8V1snAtaBg3HdIG87XzsYlsWdNDGhsPReDW0dug4LYv7z87HVam/ANlcWN6ltvLW2aLU133SXLvjSM8NYeKns/GWK1aFhI2gUPeitDyUg7lfNu5wlCF1VRXQd7a8SwZcQDGzapmA7k0vP9KFmKnzqV7v8soO82VslPnw6fqZxy8YT0mzTyPbm0XoSo9BPSSZ8Lqc4K076ka6o0bQ09EVvNk93t0uuspiWQ95sKZP/jFXSkclrSE4OdXOKfuIh++6ksTV/8j07lRtFPzNEqKHMXkaXp4+6cQvlOYAisG3Vh6xWMUu6hLt9bcpd/Sm/jN+n9svNoYXz5bxl3m46DI1AIc9q/EMOlkzrVzocAWR2gP/wT+31IwxyebOtyf0I1ZQfybZQFGC8B+zyLcau+B0c8OceayUCTbEggpt4aapTV8wfsttw4bQmpTPU67J4wb2v7AUhc/SEu2glX/7mHHEXkYUzAAzlt6IEVQEpZadEPKkUvkMiWH2zX8cN/OX/hx9A2QHdWN9oc0aL/Ce2z8YwrvAs7SBfNl0HR8OQZ27CC9CerwQdOHL355jh9WviTvhX14tlkegrc8hdSLaqwWZkDmUWKgcCaBGrqj2KE5GIJ+iVPd0o8Y3SAB34T3Y/TYQI769h8IzJVBpZsDtHrJP3JTM6ajwqGsG/aHz1wSA3u1YJQ42AhLU5/gvra1ODCihqKnCWBuQxvcFizFPmc/DjA0hMqPs+nk+hQ4+76CDU69Ysnwn/SoUJRNbVwpzKWWL/2Xzar5AvD82iB7O3dQ+NNRuG3qS6qYmosnRR7QmwOtpL67Grf3LqMZT80gT0sARwjLEm//gYUjw3hr7ze4n5iL4W/v4wZvAbi/2gz2ZxjDppPhcONNG+TffYiXDgrCx1+u4O0dyyvXVbGRYCzUWczhZVGGMDbIHv6JNuNqe3VcnrsG7vgrk95BE6waPoO7DIZJeccimP3SCBryDvG3Y12g4KCD6iPPQKHjeB7YZoUXViTQwoUHkCd/p54FqlBy6DW69hbxm8vOeEtrCWRYx3Ck3ihe0n8HktYnwPB8wodGBrD06RJW9NAm684Mur91H8ts8yW58YW8fJwy2NRvpJNXFGhysjR8hV8UHHCIMqOTKB+aMHxQAv9lF/JykcXYMDACUuodyP2UIWz8GE7Ty5IZbH3QbH0Ye2+6yP3xj6H5Zht+Wm9Iv+Wi4KiNJewY7CN5ZRnY+PQ0rQrT4oxaBYxbXQ4dcwWwPMUdnv63mMSyRGHt0muwv8+cNSW28oMISepqANp5/AaOKvLAh16H2GP7Oz7qKAFqFhvB/s81lNw0k7Mk3OCsti+cu7EDPomV0c7vnuw06wYb1I6HunkZUH/sIhnY/aB1B67D7Q8f+dW7CbzMWBhPWM2HNVpOVJMFYLInmh+OUgGx38t4x2tHMjpaCnNiK0E26Svvlt3CAj6ScElbEW5v3sNxRudBbsQWkFLWQ61Fa2j05BJyuXeHBrfG0RgBeawz0gBtNRcofrodjYdlacG+Yzy25BEeDJ+DsZNXQeNAAMxuJLo1kcDFuJEn1FngygRZWOsFHJHWAeUGtlQafB7uBBvA4PQ6qtonDt+jZrCh90g0/H0SHca8Y6fRKexm5Y45RptYj8Xgke9J5J/CUOKRx6Pz0yFUew6KUy3XT+6ByLgVjE2/ocIqk4omXWaZWmlYMTgOpfktUPkyrFD+D8ozFelWpAk71Uei/25FPBf1mM2TZMHbo4WEE9fh+QtxMG7KIyx1GyCnr7NQtXEQvTrHcUJvGF/6KA+CZ29ijEc0X6l7DTL2o8Dj9R8wWubPeDqPpFWVUW5oMVaUiYA7PiTrNWdw8RMB2B8wA2RKV/Cg2h4QlpyA9k9uosBBN4rQHA3d2jlgN/o1bnwymjvT07hx5mm0XiEEitt3g8mHy2CxQ4864iVAVaMQeEoJ9O9LZy99Q3zZYcOWZm540Oo8RV65TZKZ19h63VTwuvyW3FOMaN3DwzTjwXvGHAlO/52KXdGXcHNXNxfekIYzYhJw74szFr8WQMeTE2lnnQb3hotir04cipttpKE38vSz+QfkSyvBz+lH8PFdKbBQWs4Tco6i/Ucfcmq4jNPqgdx3OtCt5zK010/i/+b/5nR00vltR7mgO4JGRwxiwwNpEkysAiWfB3RpVSEFxCah82IGHc9IrBbfzx4m42nMi062ck1FD4kWPD56Ocw7d4hH3F+Ony8rwWEzexAqjMF59x9x+25fCKjeDd9aazBAdS7lVs6HoSgXDCVRyBfKR9GFKbTvixrMnYccGGVKCQ+68E7kHFQqXw8vXFNA45QM2C84DTGdtVz7dRas3zCDLzWN5TTHR+i515aiBO/QQZtpGBOlAvLHF3CSZRbukwlB9QRPLLOJpH6f/0BD5ATLG5jwTl7Fm9I1Id0pgarv67GyrwLNd7ZB0cJTEJHtwJXwiqf07+BZp1pBc50QjCtdD41T/6BJ5Roaf/cgXlW5BYc2KHFbYipV7JeF7NokfBxuCbaGNmDp24k5w+b0uCgIk08E8aa9PnBvwj/qt/4Bi1r9+ZfmZMirUuRDtwbQzlKfRxTeoL2/lOHY2l48nN2J5rmruVu3Cw6kaoHpsVH4Qmoy6T0Vo8ZsQ/yz34heGDtwmH0iXsj2BC18yIWtI2CO/WyWy3zNAQcv05MX8gge1ljhZcXNZgakoxXEV1csoYLNk8GyfhzUjZhHJ87dZq1n2ixtvAu6FxXw2ztl9PvfKayM/ctTB8WhW18fvP6uwIhWNzjt1c06u/rxo4IkSNtJs2XjAn50sIEFXKVg8/hqnPpRD8X8R/K4U0GUQUHkYPwB2v9UkKWKD46vLmfp8eqQ0urHL3+cxrJfA7jaNw+nfy7iN1YuvKD9GJ35lMknr4hT42E58P33geSyt0Dyx0o+LnAZtwrMhjnJW1CwtgCPNsjQxrvR3Gc/Hjb2HiK/vyf4r8wDGts/hC65WVCmcBgmmfbhYn8jLHu/FG4biULFjA948sdsfH1Wkr6/ngf677UheswAT7ihzQdF41AluQbsfGVhj3wtu0v38ly/WxhyVYRiM4UgWPcLHzjlSUPlV8EyNojTSmWgpU4XctAcnCYa0AObDjih8gpqNNvggPU/6lpYww/DZ0PyZQs4pLAbm8cp47HqQVyT+w0VZILIOKiLRdfe5+9V8zj25WEW1ZQGYYHn5K2QzGlSg3Tg4nSMMRyLReeiqeRFJDhb++D2PQdBYOwMKPFsx4KcQurpioSsuOdkUTWM8yvfgXtzHKqJ34ZFMla0qlEbjGW00LuwkyKE89gMy1neRx2l5bfxxMS5+H7SbrYaYcTuEQKQ930snhrjglmBkvA8cAiWX9HjKf2B0H28h463Ajr5eNBNOzFolIrDpNQxNC70N1UtaeeOiTOpclMhmkV2Y5VfD20NSgUPQ1F4U/4T48+Zwx71J7Bbxhi0j9mBcekKkp+/De4usqGyFQ5secUI0jck8tXbU9Dlw0o0FwyBwUFfirOupRNxB6B1xzWcbiXCd8yVYOWx3Vy77TR4XtrPfU+q8FpwHEmWSJFMxnQWOXcQXbKKaNYlAai4+x3Pi7vyE+v9OD9AgkpFFCjcXooKlGWoZ/kFuuDQzVXm5uBu6EV+IYF8M9UZXu74R9f+OWNL9ytYslcDfqsqsan+VdCsF4CBTdNASVgQdpIoOf7cS25hW3CZmiLNvPcEJ9WuAilfDf75ZDRMXT6Mwa33QND2CS06rQfN20qweMgRyiSSQPi4AbWm5IHF36mwW6qblFTiaFtcClY90MOmCT0o22LDa1/ewutJcRD1Mw8dLPRh86IFJCgRT4+9ZrG6wUyUz0vBHVZREJqdyKlvZsFan62456I+OG+Kp4kZTEdOufH6/Blsfug42ghYsVnRGq7dHQC7PkXhIUUV2PboIa1UfwlJ2vNg/IirILfkNcZRPi6+8QaqdmVAqPkGEr8lC2qBAkRT+2HBU3cq2sqwZFQF5YU4wejF66BhVzhe6imG59oW8F9lHrVXBFOwwVrWtsshUYEH8K1HBp6OUsaigt98/kcIqD4fAY8CHuMdL2nsvrqB1iUlctiqHPASVkRljR5oc5WmGV+12Pv5WFjDkvgi7h3u+SkPx9ofcKh8DNhl7MIufWeouPSRxzdIopKnCphufwg7w07TvDePaE/gOdiS/wpIP5L+bjSlr30O4OnfiKqTx8MJ+dcg054JR52EsOSuBVdL2qCspCRuGr2Ui/e5kvfUlag4Vh32fsnGX8NmMC56D92oP8V/3W6S8IZQ0pB8S+Oy/NHgsBhs95gKxzWVMGzJNTgXakw7/8ZwcH4k64tlkpqCHM5MSkTZvmyU1B8LYvkEVyZvwOTSOGwsk2Pn5DaOLLiCzgGzcLLORrriOYf/ehjAt/cvqBQVcfWSKVDrXw1LOswhuOE5WYuV8p2tP1AtNxS+nTGAWZXHSH7iF6w4u5P9Qveh16XzbCKui0725hhYKchfBFfw73R9uDvmM32b58uD4m10cut+SCvP4lmwmVv1d2GX5ChYXbefFigow/7BF5B/+hzFVvui/wQVWlT1H7qVjcVZXXfo5rF98POJAzq36IO3XBMPzKyjprnSOCHiA2k+yoADMyTo2BlBjrKPhiLBeUyHhGDn7Y+0OrmEFtn64QetCBhaOBueXV1GDYIE3UkZeLDhO0+JE4XjYjcxw3EzHLBZCpe3TUT30zrc+jGEla6m88Jx2SQ0T49qn+jAysctKDq8GqsOVqG973iQLkxCo0cb+G7vati7UYcr8ppoxFRTiK0/SWt6imiWpjQOjYyh0afEYJ+NOsfZaJPS/udQ8yESbzkLQortM36Yk8vzSy7zlBRbnuj9Gx/bn4VIJ6CUNHt4Scvg3FZp0DbQZ8/xDjwu0J3sXn/H/+4+xArHQLx+l+hHayXBQClrbhCDffc6MXvPIjYU3MW7MipR5YMQ/bROwLqs5SDxS4AUfvfD198WkHt3Ge12PU0Hmrw4xvgxlO6Ip3kt1vhFUIqOtWezToEl5rwQgKvrizDd5hrOi5ICuelH6aCFCVdK9/HWZQtpet0w2e4tg4oKNdgxr5I2erfgW/Mn/M2kihOqF+Fl0udNQ7rotHYstMrJ0qrbFqA18AQ+FnnA3Bm3YYJ+LK4MjsQTFw9Dx7InkFl0mJUlxTmJpkCGti5cqK3BzoxgOjhnDowbsOH+LjcwKumDJr1sjvUsw69j1MAnYzsX5J3nrdeXgFLkH3h56xOqGgrQ518rSORMGsqOtQTlLj2YdLyD14qMgnfq+8Gx8Dy9MHLFsN+eMOfAMW5rmUxn7Uuwp3MarHaso53LJbkrYhSGbKhg9w3nqXr5FXgflYcWW3+hoNcW7HMXhYfV1vz05Ww+d7ObSloroGllITmRGfpVyqG1kQK+lByFNQoqEFEljquDjrNYsTrXPZNBo7PPKfNTHC00WYPvV3RRu+QIsuvRhjKHXvjUPwJCIyJAqlEIPBdO4mTTLzzpogOXGNawQ7Ityokaw0w05aFnl2n769OU/yOLDeduBj1nAdgq+o+a5krQqbMqEHVOEVqTivnvkok47PCMakZ9pw/bp4OCoAb6bgiCkzkWlLYhm4Y6J0GG2W/UtqvBv0I5fO+aIC8Uukab5szBmjUR0LBzKRgl7YdZ+hqgOiIYHmYo4/wYGx4wFwadzEHacWcPu8Wc4bEOzSgt70bKnTpwOOECysT3Us1bB0h/6wCyu6Xx3h0H6rjawqalt6j2eiN+ea4JGsnzYPUZOdi4xAU+z/9GdlMrIOlUP6ZLKMDo3xth8FEGx582hajiYAjDo+jh+Ir7ZcPBbtVcajqZCsnbasj3+VGK6bkOm79OhPBxZRDs+I4dY4TYLXCA8yPD+djOo+C3zI7+urZAw68PKC0xEnzj/2OsT4MVrXrsljqZo5KUOODFMlzn/wMvzyhkb+ONsE9UDwwnd1DvKkcM9+yHyiBxdr0eTufnt5PZKjNUyhDhN28KKW73aCi/84WHHtrhyP+eYGf9ZQD5aoq5LcnrB73g1R4Hzt3aBj/zp0LZ3xGUZHod/Na14uTLzjhd0xW+GDxhJQ0ftDgjzH0p0/hMzGQwTklH24nlYCC/DFb+Vcb56QY494E26knfopnTr+COIkU6JCMIbDgMgeJ7weOVM75ymwv7NS7hnOP/0ZQP2pQ9+z7Uz58CCsemwh6ZAByaEIxL0paBUsgCmOVyidp3vweRR/n882UHbsiLhvW50rBhlwvdFJyGBSKirDnYjjM7rqLAAgVyF68Cx6IXpH3TkTQPKcMNA+DOHZ7o2p2GeYlfSdZxLrROicdsQ0fMF9/AoQnnwCVXDGTFO0DVZAb6BGuix4fP0JwRz9euJGKIdRHt9LWjM+7nuWSiJXg8jwPtSlPaNEOJavVcUGe0I7TOmQRGomdx/Q5hfjo1lfu3jAXNq2ZQF72Yci+dpk+vyulCdxIcM0qhVvsxvO1gIC5fVMAiN0ZDrsA/alSRwvS5LZx6/B3eUFCmf0rVoOFzHt4bIfy3TJ+NC/TBTzyMEo4IQZ3OYlp0ZC3oFP6Cbe/66NKFDRBSGQVB9TG8NZ9hgsEz9v/8gbwP/qJbRR9pTdA6TPlcTHNbnfhe90OquXyItw0pwHn3A/BxwxK8XuMIJrdtIaLlAsf6reJaq71cWlwALU0qnOU7Ab6cu0ETbvShtU4fJYe/gPDEJXjjcyg11aaCd8l9ui78kN6EAiTcFWMDnX4Y33CejzQ9J/mzuSzdbwhndZ9w5vjjUO/8Gw7vHwvjBxaDb1A7uea2oKnfXjb54U65dS0g0dsJ0hRIq3YkY+ONCQAj5LmtXR8HGmbDvhB73gvr6djcIVxksp3fyX1Du6mzQOmqItx7dYZDZsvAkLcrg8d4iJUciTWKV3jZ5nvUvbYfXEVv85ZLFkCeO2FglS6YxD2B3DBN0ND/xFltyrTrRRa+nTKJdkuWkJCKEpxVuk5Fo5/SqxMe/HaTGKsY68PFGEUa+tZLF2fWocL9OrwYowRy23eifnEOzVylBe/Dj5DCUR/aptvOl0RnwbEr9fA1ZzG1e+nB8j4PNEgW5yERbah6DGhjGQyS7muwfccfyO3zIP//UVAfaiEwagCAv9HUULSnERoq7akkZDZUJFJJSkLICFEpEiFKISmjxR+VUihpKEXKCKGMEBlFSZHOc27i1dciPSE5kJVaQTEXcumngg8uc/9IC84HQa3NDkgUXwabdVbSpqq5sHbXGNjw3hlNyw/xwsI+7Klt5972BjK9mAA33/yHOhm6VH7rP9Y/MQ5iFiZzwYtEDul6y0+cPOGr1C3qWfedxZe8hnnmD+h0qCB9zVCAqzND2DC9gw4/MsaHfd+5dbwofs3RZbGNJbSzMJiukgjPix4PFnU5lJN2Hx626WCqjxoFT82kSU4dcDK1D99Pq8RTQ4E0Rn00mLskkNrlWKpXvYI5lZ0kO7YZ3+0+hiuvL6KQi16w2jsGr761AsXKbJr0thPD9A35tFIC/Jz7H54TUYNcsf84VysLbkhIs9kNQfgvr5zlZWvg4PA3Shk8jWNxBFVIPyXbhePp8MRlHNDTgv8VCsON+D6cOXEHW+u587GuiaRS5QyHKwTgjelYzu+P58KDXrzOWAzE6x+ScUYFuFcq8sQp/nTklAjnz/sDSgeGMV1IAZbkFsJHazHIq2jmIqOn+KW6isvW5YPs4ytQ+zGeC1sfwZMpQRC7xogzAqxhvHgLPngSjxdrf8LMLlOsk5xDewWGYJ7uW8janoCux1vp4XcBOJoUz28u9vOTZ6fos5s1/PpyH8afXcn6jXJYPWUldYj1QPFOAbisOpZWFYRT6JrJ0Gz/GjtbNFn0hzguWnKEcvotKO3mEhxYaADr9qzgAbUokghUoRk56bxSxwNUw+s5cfQRui25nC9u8SRs1YPUm8lwbGYIHo1cwPuOLIDKb6+p4EEqRmZdAFetkXSgdg3U5I2DQD8xVDlsSqFNEuTSXY8JUY5g0p1Afn591LywD96//Y0RCYJw79leFJn9FdefN8TXx6/RC915mLBeAar66iBpRh1JJF3G0RESULLQgCoVbHnHiNd4xqYA3pnLk46KDC9tk+a5wTe46ug0EhEYDeJp0rxHopnTQxfi+S4E76tmHOxlBeVOZfxvhTL6XL9NPgdNodhhHQo5fOKbhXpgWhxKTdLf0CfpL3poXqOzhef5yWVfcE0bDRL4ktevjKA5LTXcPEYaTmdYYH3xO7SaOA0i0vdh4qTXMO+uJGS/ucRxhoe4d/Evvnf1MoVqpZP9d1tcIHGRn/98jI1/inhekhXIvHuGbbN7UDx8Jd5w3gW3Mo7SjPO9sHdWPLhQDO6RWw2jzkwC9TURuNp7CP2uyaDOmHL0efad/VS0OcWlgmac2I7Yt47v/VCGtFnvKHKcF73I8OZKWS10+W8fDpe74g7RfC599p1N/ORgVKcNKAxF4WLvKLIZTMObxd/hbnoI2Rn1kf7Oa5AxfjrbT+yDc9PGgfamM9SXuweUqldBygdBdHmONEnyABk8LsHOr5ZkOGIcjwnRAJ2cIQ5+9JnUS9Zj/LKneGztQ9ib/ZvFjxnSiZevKGtkGVuXy4BnxjFcOLWbPBe6keeAMRbBWZbRtwLtwM0kPsUX/JftwSdKI8F31SSuPBTNCmk6cG79dWjtseejaAZXu8vJfP9KstX4gq0lelDqFw13kxtp0nptzGmPR1X56/zpyRDM3RgNL2MvYVTXQnpnoAUvDjtgUZoqblj3nuZnePJoT2HesboPnzuYk8OTRvx19Bom1ppC56E6dBEXxX1i1jzOJJwtR4xBu9NbuWT1Har3ckLtnDzcMFUJdCzqQMDZGKs8J+HlxlpyrVoIi6cgXDh+CrRNR2O2chJ7OwpC5/x4Knt/GXmRKM48K8m33pjwr1EStDDSmIydPuPXMmFODrSB66WxtCwrmpe3eqHG9hHUlHaUVMVtMOOtGGwSyaW8tBckbqYKkrXRUN9QyVU7k7nd5yi+HJwCkdN+s3J+LcoWu3PJwr106J856Hn2wqhieU6PPM33qqzxxJ4xKKpVAy4PCVwlrkJTfRqHTbUGQdXF+M9gCtRte8DLF50hJfEYrJJMx6z31rhbyRFauh157HIdMB4fDMdzddEo3A5E5KZQ0oF2/AlhpH/fmXeapsGXTW74KMQUzi/JgA3rM/nrrKV0fZwpqs9YDSfzcuHYCRGYLW0I++URJq42hUs7BGFkJsLTDgX6VzANuobk+OCvFGy0noFBhw5T/cMC7lOXBv+LVWh27Q23NR6lgYAmzpFazG5z1mP30HU0HCuLmddiKDpVCwpOaoP17q+cN68fjlzW5tVWW+iV+UGe63mTPjQ94cKtYtS3RA7mXleFAEV3qn6zD/4Tvort1wH8DWfTzFnA/snZnLDIB6Y9VwOZYyMo5ZM9Tkt5Tt6/N/LGQTtI/phIll2z0XVLA0NzE4Q0ysIGj1x6MV4Klc2TOKs9H59XeEP04US8NKYDi/99Ry29fWz1Thz8JYL4VrYXbi7owLD5xVi4cwbUDlth+6x66Aq6Al8khMjzrTmI12/Hwnel/HWbNK+abo2vh86yhVQXTfXR4785I9DwUi8Wp9hC/4FxpG+9AU9v+k1KVxP4pOxTev99H3xa443XrOV5r4YuZ6ioAcosZT+VQnBU0cLr9ddhwe8t/LLbmmHTA7aveMCq2ufIuVAD2upbwe3dHVyuUILpzvv4a94CFNnmRKO9LvHfgn3Q5D8b7+rowmOdUMjJHeJwO2NY67YHD++LJ8XGIPw3UYCff5OhfvgPVl+0gq3TC2nV8CGMPhgFGcpLYeL8LFz44yF/FVgIHqCOz0ySWD1MDD71CMPEunZGr2CoComicWaJ1PijnqQChvDHzbdoNn41yzZPgkizftaI04OJJ16gbUQXtl+XhOMbRuB34UX8dq0RtnbMofQASSgWvcRdJk64sO405R7N4SqlTFBx3Uab7EzwRHcZns8eAJuBsWAt8A5tM+pQ9KIbjm+346+FZVwn8ZtedAnRenUvOPFKFYPCVeFv9Uv4zWG8at8WmH72O84sm4IpPttA4YIwcYEif4xRhihlCfjSuhuv1MTzomnFoPxzBcufHKCQIxZIo1XQfsFHXBSZC5r7EUb55WBAdizVe+4gvm2NzvmudLX2AoQ5P8cnF5irGkrpZYQWrHyWQCXx/bg204enP83n3x+cYVJ4L8slr+GdHiJY523Ja+4DOL88A+nfJMik4wzPu7Ebq550odx6dU5eZQma83dS2eU1kFPD0KGujCm2fpz0rYC8v15lHfPJ4GcwASrAjoPvXgVov4GepeOh9cV9vHBtDTzYdpT3Fdtz/e94/jEpFuLUwtBYeysfD9yOs3OVQOB6EZWuGUkpGws5Kl+Iij+30Cz9Gkh3ucPTR7/g4Ce7qc5XCEyG23CF5HfcenM/mtwtgPM7Urj/WznpFj+k8J2lOPn7flI1UASHJjO8rCbKe/2CsfeAOppuzYLZ376ByA5BzAzoB7fHa7DophLsU5xJnaUeYHPwCQlb/cPwcf/xnYjXeNo1nQ4IVbDSf3GsJKcF3d4foGGeMO3PvUyV5RGoX+XM5SfOQ8fmmXTcvBMHji4lhZnG4L1hA61odMdNn5JZusgZ/EbHU4ZnCrecl0SBj5cgyu4G3D+mAFvtfbhhiRXdiM5AxWV3uEe2iNbNcsOx0f70ynM39yHT3xqA+xaqZDpuJZx1PEFKu1eRa7kD14o3kUZNMp763sSWJ2/j3WX64FyeAYI1N3F5QzO8HNcCMaExWO+YS+ZZTdT8NAfvVwZy20griDLcioPL4+Hc0/kknXAIg6/4883YD6Sd8ZpDWo+SVpo+hz8YCTPEJXmeqjAbpnXyGOftsDO5h09/Pg5W4V4cdyQBWvQ2s+dcIVhsL4VSvpm4EUeD6BkT+nHuIyoV7qDKvmGIOpDEgU/CaPscGcDt2vRHypfnKgrT2OVR4JOej3X+znRscTqsyDpNT18c5hqDsXBTo4iGzLbDHXMdVJ/kSzHXr4PyoU6WrAjgvIG3YKUxCMXLRsGSokBUVK8i3cgYzt0rSR0mm8nJJoeVbUbBL42/MFP8AF3PHgFKnc843/ALfHbt5cRZh3CbxWJQqXwDtU+TsSv9M0eon4DU3SNB924qruFzcON8DVspt0D/sVj6yyPpxMs8/hTvyi8q+mH1CH2ICLpM8dn9uP5qMb780cN+88eQ1tgZPNHwEhkETudi2xrQ5ymQPk8CDDsu4rW7UzBbRwECJrjgmTp9Dm0k0LMzwb6NoiS5ZiIUR5zE00amxAe08bWDNbZHTwcptXp4vsaTHG54QetvQdj50BxOB+TxzfcSKG1uQHK/3CHvUwpLLfJCJf9vdPgFofzJA5QtOBbOL0rn8269XCbvjVNOeWCItBu9VVJmyfPC0PK2jj3FzlLTLQEYaLwB1snT6cO931yYZEGvziXxy5L/SKnRHVZnfoDVX6bgy82S4CrWwU5zzoPHzdU0bfJv/PXrAs+ZNRsPi89n0eN2GHrlO+4wU4cT8xRppLMtz/HfAp9/SPBaWy+KWFDCXZKBNCrzOUqts8fk51ZwabYG25esx3n+9tQTZUzNacuoOe8Wep08gbLpavT92m4+NtsEQm4Isr+rGE1eHcc5UnE091ApNtz6RhXfjuA51UU8zmoc77ivDRM3DxFoAIav+MpK+mb8JVwSm+TGcE7vQoqzWMwPRedS0lkb8Jl+hMMq48Bww13w1GqF3DRnzE6spqAV2zGs1JFj1o+kYSc9EDC1xa3xYfy4cj17Wpbiu4/x4DHwAu77NqNm1kPYazEeNW4KwbxMU4ybWkDTVbNpk6M9q+qe59sSnbC9SgufrtDkbpc8vPBMCDx3I+UGXoaBRAlwHfqDZvYLeGXTRDhqcIb2Wg/gNfssvGmsB6cXzKTqpG6MG2EIzQ9u0oLkt9QttQr3LvmNpdNauDDzGCXrikDjppXQbFiG++1+oPeCSMi81oKi5rtwfk4h9wcao8ceB9hmPAqCvi6AG14M6lWH6M6VGZj85gnrTxgHt6aV8a/DHlj7cD606QlBSMZcyvX/xGonrlKjcAEcT7PmbfLEI5Pu0r1QZb6t7Ey2Z9SgNXYi9Lz+w8oLitErcjJMFjTgXtv/OH28F48u+0M990vBcsQU0D2shjGTpnFLbyHrjjHBNMMsaPq9gTb8sqdkCQ/4mTwKYx5NgKVSiaCT04ZFh+MhNXMeys9PJw+wY4PRJ+jH6D/gDX/A05XBuGEvBmjMQe36Pnw0soseJW/gNxcRStVTybMyH00mNsPkXbZQbBNCIbJ56O2aRedk+jld7jOGRTWD7OyLkPO9Gg42b8O6aUYgnnuE7g9cBgcbDyj6qcXr5nrQB+Px+CUxCqxOSeHJHaPQqGQUfO404uLGVRDZXoA5X2rh1/IgEnJxwEA3UZbYuAj3mz/k/YMW8G6dPZ4r6YDS2pWcl7iDSqMt6IikLj4Qcea8xU/h7jth9CjThHffR/AWoXt8WXMnKS0poQu/i7FcdSMfnvQUl7co8xFnU7ilOhn6L0egzzZR7NvnQP2TtuDUmI90PekZP1UD1DS0g06VVxjzAkGuS4wEtSLwb0MNpBy7Sl7bPWinvAn+Dv1B1Raf4bpbCS4fHAf91S58CsJJdMVPMrtxFEadzUO3q2Xgf1aaw0JugctBaTK8NR6yHudQa9tH/r2lnO+bjeWIWXfwoVE06nQ8wx7lDnQ9546BzgSa6sxVWdcg7v5n7spexLPDumnsASt4JD1MrUMZkDshj7IOK8D14hDYFbeVpR0d6bbjX2g41ovccQJ25G9kmfAV/OOIEFvMl4Kvqz6h740ILl8aTZwlhiOD6lE9dhdm64bS3c0XufXTKnSJMACXT5vB/OYPbEvQAVflZOwbjKOVhS/4yLga6mi9i1kBhai7XhlOLrXHoi9KdHS5IMi+NeUZ7mfo2tuLOH6gjYf7RuK3YTV880YQNiV9o9O6JnTuxz2+Ey2CSUG+9HtJMO6yXUOzdfO5tmgqGB1SgY3phbgsYgNfa2M8mveBTqVchZN9SVg67EwXPGfQ0fiR5D5sBWWy1Sh5rwJ2tBiRTcxPSPnQyl5vKsju8ELYPWEFr74QglGtI0BOog8s5/ylA1Y/sG7AiLrFCEtbLHitqQGEWl5hkbM3yY1UoOfyMd514CmKbn9K9XZDYPt8NyRnb2WB1nxMXJFOsrnS3LhQCcoy7FC4ZYjbPFqwe6IKlodfgHUqb+mC0UaOX1OHBkMT+YufEGS7n4EPB/NxdtJ3mgfTUHByOhrePsgmg7aoBN+gXU+C5+noQztOBKudivhKewmouWeD6+yX+LDMGQqPf6IT9z6Dm2gKbfioDrtvO4CTvSTtd/KnxYt+gsywN8RfqUHNJh9eUZoHS502goK8BfhKGUHBsggImNoD8yMb+aCKFchui+OTjRPZa1U3mLySwifV2nB+dTGJWvbxUqdozPfrhLw7p/GldjV9+1sAc+c5sY6lC/+cOgVuKrdzWelsWB+QBRdLR9J6gTtoknsCxc7mck6JKBZZfqZXfqPA4UERHF+2FoU2BsGHIh34qj4NQiTHg1lDBZud/Ij20v4gf88IVkkdZ/uQcPK+8owcpc0hJLkNT+9qgqNh3jT60Ag+0nEI78SbQmBuAORtSuTIP7cpetpm9LceRWs3z4HAD68wuXcALfPCEQ7rw1bPVA5ZkUgfBMbAQtkjOD/2PzqRrI0T4vTZxy0Hz58PgtQ7knBxlChD6gso1jFEaJMmhVkK/OXbIzh3Mh4Vld9Sv/F6SPlsAT1bn5PBfEv+KnEZhJ948HaFcjyh1klv9vfDpjPG/FbsFZeVM0iEisCjT+1QOOs3qZ7dzGfbfFgx2QYUDl6gw2XTQSt9GTnbqMKf+tNssGsyPPW34JKpluxivx5Dy3bhY8cmcpUfxSUKjhTgrw5pPxI4ZH0MLbArQinJ69i5YyuXqRTCm+BkzFj4jwOW1OFglhb8XbQStybfwsLzKlhepoF3O/IgI3cGbnWQYd9FCLeP/6bSNEtwl1KgXSFtbPb5HZWEPGMTx+kk90KSxg4Qw/axVDtnD9YGWMHt8k8YsqwN1nYuogeNT1nk5RKoMrtO2qfDeE/SaJigtgwkCyTglOQsPn3Blbruz6OUywkYb1qLj9tq4fDLnby1byLPsLDi3EeTYdvFapIdcRLvPT6PN5+dIvHx/jg4oZq27J2D9xfNYcWnD+jGHFWgr9HsJuhAOd/HwizXUKxK34cbaDstdksllbUfcdEJT5icrQlj/d/wo2pDUlsnTw3hffivqYTTbAVhWa4eNyZOwMG173lWlhZMuhJFGfgdHK3UQMRlKstpIwopSOGdGEe8vr4Cs3aJ4FUhdTCYF4JjrCOhWTmSny0YAsMQabSFjxh5uRM1ykaT+9RAGM5WgcfnL/Cw6WNcktfKqueAfkvewHPbirDM8CKtn5qCy+NrYCmNhfnuzqySqY7Baft5SfM6VtGU5V1Tx/AUm2g2DK+hku/tGL9RFXBJIR3RVMB5vTrw4mQb6IyfgkFBB9jTypbbNjmz8+aXcPShHlh/GImRhf5QTeF8tPMa2a7YjtcfbeC+Bme6krsc766RwtIPRjA2KQEvT3hAW1e44sdjsngm5QSv+PuJP+/24XX3v2CGz13iLeKwa+kiXnbCnqSKf9LBB+2w5WQ9bip4iDHTT0JkxzUqXL6c5i6XhNFX79GeTxcw6MxPmm92Ed4HHwLh/Xc48IMpRd0u4YKNniSxVRKCS0/iwX0baZltCkRcyWCFZUUQq1YOvSvv8b2vjbBF8RU53xKH3p4sfKCbCvtGPcebU5/TmmPa1HXeDtNYBT6LmZL33R4KDjeD6MGNlCAyjw5OsaMVm1bx9f57pJZriCrfVDFQSxtmzRfEZye0oUZkNz/wS0X9olQInlZK3cJXsUexCWpXHkeV84/gv+JDdLnNFLKevedH8lm8RikIv8wWp62ybvDaYATfTX1HmYMqIJjqgIYO6rBk9xvO/U+Qj30tp3LXMtIeVoMfZ7L4bvhIwBBdqF2yF4YdxeDSQkdYu/IjjJhxEOa06GG9uSOdeXeQPryOpHNTL7OFwGrsy5GBRp8AcMifTadfFtKzW83gHDiCH/eYkp3iLt7w6Qs8sh7gfSoI3xML4Jj8cZTK3UQ/74lxnp4+d8SpgEXuV5Y9N5ZMH9ewwtPJ0LrNgB0VnTDL1Bo9OiS5L2M/Zsx/jnknV2DljyV84+pUnHRbHtxqE7hrZQhctWwk50tWZL1Siw6kX+RjqcN86c0t8PIcC2Z9yrDGN4KN/Q5yz6oErr/1G1/HXmKAp/xoE3CgUwb8rCjmmOnCsM9DlE9WWJKE7RMeNymaavK28vLJKuw77E5/jHLogeozSMiyhBllcdTf3MpO4mlwwVEaegt6aIvbThDQMsXQzjtUO/IJ7+2zgrFzjehcsD3WRblDyoNocHh1mK+8fMx/Ly2kVZP3YU/wR5gbOBl6FR9DtsRjCHDo4KGDr6i7YQ/IKVrg++Zi/BN3m6e5psLCNFNQGPcQxK6bk5XpII2K+YKzhGPJXMICywUuUWGMLzS79IH4IUt4ssgVKk+M4NsH5sLoD6r8atZv2lFkQOYqJXjWcz4rnw6AL91KMJToz+/it4AjrqMtdjdg9bMdFLFIHzf4noZY272c+aoEFPolwS9qiGIaP5OOwkbo6bbAjjxDCo/dBCrzZ7Gc7CTctWUFDwrKwMiATEzUb6CCjigePayDvpO3kcTynzDV/zFn/FgAZtu1SPOfKawZuYxfBDaAwHsXmFHoBlrqLfC3PZUCwtrw3vQQeqb/g68qCcNWHzWScBjNX+Ju42bzK3Rdtx73Fs3g564yoP7rEZeMkEL5L6qwZPJFrky/giYDY7DbC7C1SJu/iFzk+ksqOEZdiIz6ZEj1lAW8LdvClv6VdGxmFZ66uRtOPZgHrk4N8DVMFHdOng0KCVH47ZYhRI0YT73zuvlwwhCIHP3EqrbpNHv/Csw7uwF+3DaBxwdlacpRhtE/tPBg+xBv/PYYdGqD6YbjA+yOVMQ5rr/gk688yRkU0PZkXQjb5gRXbPMgNCmd/gk6UNm0UPj3uYu3bUjC3WJXYLvQB9YW14atku30sLqXMlftxIlSWmBpFwptW0bCnaeJPK8hjaZ/+sfT8hRA0v03fY2PINOPe/DJDls8scGUszel43+f/OD6h2q4ESnMezOEoE9zFCff2wmxxrXYGpeN2Q+l2WeKGKwcPAPWFyWhulISxD4Kw07jWGj+Lglvi49gmYsZ6B6UY7Q/hc05Kzgp8jENXb8HNwanQP3JUviY7A8z2jtwvNBlmnX9CEasH0NO70Nhrqwh/Tkzis6oqoFz40369PAwvzU0g2wNFzLyeQwegdPo6/pMNNOWhw6hT6Q8YAQxE4R5dtwaHJtyAPJ/HIOfcW3cpj4R+ziYNwyp48Jx93l5pCBsGAiEBZWu4FnTA30eWqj38glKWblw/caP8EYikr+Na+budRNhbdddjNaWwWq9RqI7B/jV43TUcCzAmdMEKPXPBCqb8pF2G+nAqnY3vDNSEhu6Bqm6eBJPzqzmbrsAmHjuN9qEX4bra+/BsyQCvdYbbPpoGt9dl8OXHkvzqJZofjJLEraEGnDjF2GqSnmGcWdloXjDTNLqNkYrowMo3v4D1l8n0j4VRAemJ0KE6ixW+DAdJ0dIQoJgJ8cuCOLRf07CkyfeIJEnA9e0HSiw6BQHx2hgxqcIqFG3hCbtf3AtLwKf0WcKcNAEyvDAzA9pnDh9JG9dPYtNtY6TwNpRcPTUVfLSLocK+wbKDJhAY7esg2x3VxZfZMi/Wv3xeu8DhOBJEOwUDh+XWrLunk78FfcP/G1kIGdCNbVbF9DJnT8pRd6BlyeYgXmWBawhSbqhkwE6eZ+p4GENWXhb4G11BzC40k29698wKBlBdLArf2jQhh1dqfgiTIPkal5iY2ozBsX6oGBANtenpdCM6zIw+tYtaG8uoj2rI9k3MIZvGfnQbdFcXnzdnh4cCeZbCbEo9NwaKjYY4d1Ry0B3SwWNN4tDFzoMCXs9+VFrPl98Vo+3X0XhhgBluJT4gtPO3sAjU8uw6dxCDtBs4m9dv+BmZQe8XvuHVhZ+wvCW8SCw9RdPmWIFTnOJurSq0WR2HVd/OU/Toksp9/VTfGL4jkf56oCdWhHeO3UL9m8SZXmLSM60LgENr/ewSqCdnwyMgx3vjkLjLgtI+7WeSp95c/cPPxJ3Xg5NscmQPDkLbNZk4K2deZD9dxIO5cpBb/8ffpARBnkiazD+8V28uTkdl1yOwDdnM0ldUBsylr2AySIa0LvYgc/ou3Dczkt8cY4tG6t8JsO2cswR1qDqhr+cbanKqXrasK6Pub3bCMttGJemqkD5+xpS7b/HRZe+49CJdZwVLIIPumwhrnMsRSW0sd7ebIo0MOL6z0o0oD+BQqPXchb/x5ZRZ/hI3HhQvuIF85y66VHpXz5w1YNNzV6i/q8tfDjwN5asmEUz3Tex1j9dSGqvxYBl/hCrJgd3A/xBIF8UJ5fuoPLgNpA+sx3lhezQYP94aBasR5forzzBsJs63j+hcicvqDaqo9eTOuGn8Xqyqw8CqyVjQGT/L1oo6482By/QXedICt9uQ1sU6rBUYRUNR24j1/ULOHzHeNAXu8TZa1KouSaI55pawC+lBsr41cy/Fkyg3680ePlrJ9y1TBVKTv6j3GgD3i8vT6P09/A7Vzlav+oodmyZwcHGV8F9WgeEHbYB3bo6CF7Yw8mn5kK06woY9nAA0zsV0FMtjtZ73Fml2Y68lUZCwLV82DxWG5Kqd4JPyy1+MMsODxoiK4vto4Gr57FcywRuf9aGTT3ucO/Wca5/0IQyn41ZwyMS11kZQFTLMn5Qr0Sui2JonL0miPeKokdzCJw634qy965RPqfCs1Ul/EBMn4u+5lPK4wPkVCcKvuFfwOSpDNs9vYKhDrp0bdJWrhi9EPIrfKHPsor+OCugyURJ6AlbgyFaG0gTEnn4ogHoVmrD34Z8XGgaD4t1b9F/t5EuFQGotk4mmZY3oD9pPnlkBNLBSX9R09obd8rvYdUpC/jLBku+f1INwpRycFfEY5ZLN8dk40pQSI9EgyAv2r+4C/2bFGmTcCcmXrCG741a+HWxDWr7TuTAs5Lglv6HPP75UuObZh5w+s0uT5tobdokODxzIuj+2YMLUtRQZVojFMteJdNR9fBQZA0enlUAQRMX47kZwtB7Zz5d+LaCPlyfj7H7jeDar34MKL5H8XFrIPnQMk5M+0kT3CdDisVOrpzrQ6ZxIjD3gBLbtD/ktLRztMxJmW/5z8DDn0T541xd8P7xGM3EOqhM/gsbXc1EbxogUuzGwYZ4GBQSoEfh01HBUxLm9jSBy6AtOggkQ22FF1e/nYW2ja9oc6owvIyajZptHeCdrwYVJx7jut473Gf8AZdtlSV/29n0ctNYfF3+EDd+nUcbL06m5IMToHjxBjwy8izYyMeA0DtjLNbdxS5z6vnk22OgP92UNSz/0EDrOGj7vpBMv7nD3lRPmKpgTPfKB+jbvmD4+cKTEw/ksqSTJI4OFYIp+xRYtOs/aooohJUzXUFxXAvID3/ggtNSlKr6AHedCufxkTLgq+xMJ0ICUePAMV7No/jdajMqjW2iiisK8GlHDJ9PiYGyVmH4JPuQzr06yz8dH2Hb4rF858Q+EvGpZMv0cbTYo55PRiji+HAxUFzYyhlbrKnH6w8qixCrzfbnHuUAXHtoFVxz/o1rx3nwey0RqHYKxny/3TR5RR/fHPSBXX3Z7HjJHlc5zsZeUUuKfZxNKW9toPXs/w1eSw0HU8DUqZoSZg7S2wUaHD+vGOobV3NK2GjoS54KZZY++CnUhJRi3SFV9BXQFTtQGGGEvR/acN4Qg4CED35rUoMOgVLydDeC3oOvwN28EpO3bufx+Uu4/60WS4WtgpN/rqGmujlMTN+OLkIrKa7yO4807oGLj48g7h/G0PxCjvnbw6nDb/HCNlP4W/GWGx3e875pKyn0RAl7VPvSd9E79O/+UhzxuYkemf6Dxc5jYcuu5/Qq14/WzfzBKdqvMVDgJe6800pDwmJ0ZMIZgIlSYOVLkDdrBAp7qcKpgAK4c1QZU6a+5yVHBWD6gWQ8W60O/yX+x2GtKiBXGIvfSv/CmnsS/OqjCJl6F6BL3VL0+ZMLn8Zc4G5pXZCJMIJRb0bD9DPTwf3xMAuwDPxr0qMl9+Uxb4w6ez+txiR/f1r1nzFsi/SGlt2dPBTRRL5b3vO1I+vJI/QSxPU+JldzbbhT0MAeBmMgrCkIei0tcU7kPxr2+49lpcU5TViWnMfMYC3nO1AzYQTNFbSFcyUt2J9Zy4Yro9n/WyinNvfAPj8ZmL2shZb4bsG0Cglc/V4Ims63Q/RLTR4RXIxLk1KpJWQv6ihNoOKhN5Qr7Uw7HgphmaIpXDyTQq7lcVDboc+SaXXk+HkD5ufa8uNzYjDV/AgIiGTAwmgLSNtXxdNtNGFfyDf68XMaSAk9hpdjzrLx02ZSexuH3ijI09bZgKPeb+6V8gH9oWfk9ecYeYe40Yc2P/SPtWSPiTfZ0diKqzdMgJEWr+mG5gAsWfMZz7pOBbOUCFzzWBfvNObxy2xdfn82mlPd1OBnXzqOyzanmO7DaLtiLruNHYUHvftB+0QQaTvuwGcJ38DutQKkFEXCT9XLfKhQkdXrTCBylC9qRbnSEyUhFpveiwseaJJtozDo5+ryv8lDFGn0nhboZtOmz8bw37Q9dLFSFVrL5WC22z+YicaQ3n8RdvNp6DxgyevmdXOXmAjtLrRAjzXyuO7uDfKkL1i+RxMU9s0BGEiCQc8QKPLzBYGnP/ndwC846FrAyYKbQSzwGw9fkIfzXg2sEdWJJtqnWbrrLZgajmD9cBP+OtMd1IVGQIKePVrOQZhytIO2HNPgFrt+mDEvl82q/7Ltw7dspWwNj0y+kd2iuzj1rSS0S1uQYMhGVE81AbOQZ3xpyXz6XOFEYc+L8MzAIBxwEeKvX0bB4jwnHkgoA5HN0fzJWBaKdFu4+8Ub2LbJiQMln+DbCcZwrMYAbviLQ5BYPs31eskNzQ6w/oAGzJWeweNE4yFvoBduhzaB+U0JqDk8H/LnHKWbESnwOjWdorSYM6sL+dArI+6YmcP+V5rIW3cMvDjWinWrwjHDzRW2f7yH4bsU4WvmNPzw/AaZVgnQrCYJ+OIvDV5DKzl27S2uK/KEY7YmJG/ogqUxeQhZJmzz7ysWH75L0zQ1YL1VBL5cXUnXjpdyT5YstL49zlJWtbj4SQwY6O3Eyq0u/OqCPsxWuwRrrSdR2k5VPuQ7m2Pdf/DVuTl85HU9huWNwriT7pBwbDT49aVwRfEFmLLTh4dzbtKlUZs4c+43jF9/GYPER/OuFqZH+QJA8ZYIWdYU/1EYtzUsB/QwpNoCP5Ib7QiTzz1h97V1qHxIGbSnR6LS6im8OG0xTEx8CunX0llBKIRWLp3Eq8Q3gvaQOTmcGg+nRSKw4ZQmCLe8hpFyZSx3aSkWnKxjw6XeZH+tGVv6X8CzU+Zwr82fck7NZp1PtfjwbxT4pAdx3LhWstJyIy29lxj46iVMOKQE4ZtnknXfVSx5Mw4EWlXA49Y3PPXFHn3vubLCzD0ot7uanriPgYoiYZTL9CD9Xy70tzERVjlncmihJACGoem2H7ByURtI50lB7IoweHdJmcxOu4H7dWX6EbWFPgteBpsbzvSr0xLXuLXwsJcyHBB+Q18CtpHdk3NolypOl/9YYpmAPI2nNzDyfTT+efKDLHIR1o04Q49yDsKi/frcfX+Q8dUP3k774dXt13jvmggFWm7GP4tUwHTWdFi3cBnMNP9FuodLeP/qcsBDTrBuymI81PwO/s1LxkJFFUh5FkIW8u/4ecUutrp0lL8dfYa6OZ641l8GHjfp89qfJuy5aAJ4rw5gJa/FIPd9K8ZseQCmkp0gH6eMT8XKacHbXvwYH0CZ/QrgMGIOPVq/G6dvmkGD7t3w00oWjfOqWaHZE3oFl9KiE/38T1oTSi7IwLZJKzgpqJBuxSRDYeQdHFKWx/EKYjBxVAy1euQgGQJ0z+2CmdcQhOKkcODYLSYtT9DYtBRLfVqx69dyXrjID3+2qEKa4BNSO1UAm0fl4dISaQgIrMGrPw9Ae+ZDvLlzN7+XWIz3ugjm3vLg2ZILYd30Ts4QPoyf3WvgmksdTOlJp++nvoJZpSnOLjAApd/AyY/q0QNFIGGCF308NBnVk+PgzWNbKr68GNftWYY5W6VAJXs6HLSeBVEKG1FzQyNfntaMtcKL6cShZ2AwNx9DQnYSPNMHxTRpaqv2h+bBULBICkKcsIidZALp4d5V1HVlEKZ2b4cXp4ygz6UJqUCDzV1jaOz9F5wf/RGtH+Zjx+td+DBgiH0n7ASFRgGYv7eZlhxqA9lzwzws5M6iZslEjQX43/0Mygq/RDGHBljI2xJGfw7hs/2noTC/kUU3H4Yl6M71AYFgExfGTmdsydFmGwhnacOA51+yj5bBG4VFqH19Nd+ZbE5VEYVU7++G93KcwVfuJoUXKMFWN0X6uLEP9OPO89pAOxCQtsHxmjUw7YAaz88qwU2Hovn3Jw1YH7eFhtZog62BNvctfoOjp8ZSg0IjjS/diWfkxFgpE0HGWhEerlzHddN3U/QsdQxaFQ6nfe3pukQznP2giPreozlZdyo66ZjC7OF9FOXDsM/TALRLp0P0sD8tuWjFHROWooruMfzrfwiwQhB+SXdS2nActxevQP34Jbja2ASSS0J4a2oYP6rSRcUZPrCwUg9EzTvwq89G7D5zi8SPXKFdDpUYkudHw/KT0WavGN4YvwNEuxH8Z4pw1ywlmmQ4xC6lzbhx4wLYNHCHNbYYsNcDQ/zxYzNbzdcCqaen+NpYR66YvxF+7qtjEe/H5C0wGj/K/MGRL17D4RE9UDtSASIbSsi0pw8f9o4CDV9zVFN6icomHqhYcoc/68/CplUG9MDbGIKe9cK0OR5Y9ngUvp8sg0tT9pDwYCXoQSJs05aHZQKXUH21Lnh2ncevOSO5+ZIj+cm58YC4EF57aQsyWuPg/KAJRNZqgej00VCnu4Kn/7PDNwJeNO/jMbwXdJrHDhXx2+4y9ghI4t0JRWRkOBE2Lm+l4lsdHHx/O+fsk+ejajvxXvZFcLwzm2dXxtCb+zKo5KwN7wx/kNnueSjoe4SqO25i69ID0NDUA4K6P/hagiMIXx1PCk8MQEvuJ32YMpuvtHbhmX1HYfXJ9WTyIhidjfaR5d1CPBNgxoMO2iB6rpbCqJ9OO7zmqjAHfqp0Ge/L1WGNyR46NlxKkRd7uemqNhif9CTj+D3QuX8CXM9ogsYVl+hqtinlZERAQps/B2Wrw6HdqnDqiABnm16B4PpalitqxA1739Nt4ThyOqWKdzqGaaN7Dcx9Mh7WrnoNi7/owerSEOr2SOS4XxchXcKUm01U0Mj+Fp83eo+Ky+Uhf+VhWiscCk55EylxTxg/X5mECzZegIqvX7j+wjx+4eTDruJCsCJeBDNKtOhT9yKuufkJVjZmwKNvR+ii2la2i+qB8s2z6PKAIvyuPMlXTD3ZN7CXph+/Am4Gi1FrhB5LrezCCwECvDp1C+vJCcH0548wr+Asiwu+4KiW71Rj+QudN2cg1M7HaYtkQLFxKY58qAx+JnJYPfc3XOnyZKNz93lteRr4R9kQXVuIkwdeMFwq4AE0hjfP1cDe6gf9aFLDcI35ZLbLFhKdznKu8yHaa7iSNcOGcdROAWj3a+XiRXWwIvk+xcWL0B+5Fr4x8yrklblhvWMA9sktZ4E7ApCwZx9WjkvHzF2dtOooUElhE1+u3EL6MSb0p1sVF90IgLvzJ8KmO95cq2SOURd+49dfJylHNou60yuxxvQiFG5eAqNau9C1RhXMbmZwTvoSnB/biq8ORnDC2W5SrQ9By/jHmGDQRUdk9tOWIm04EtGPsU4Lcf22KAwva8Mmm2yek1/OR6cGg/LdXFJbcQmn/9SG17eruTZWkNWnSND2nSq0N7sfMo4q0FMJEXxlnorTEo1Jzm4CfKDNaHS0m+VKpuDlNV9oe6EK5TyVZ4WIfnhv7Y4jpurQ0m5FWB9zhp7+XoIjlG7QjHW2GCS8hX2naPMoCyf+NPgXjsoj79YcAVM1H9C7L06wWnoCK3UIc2DWLPQNUKDqs5pUGioKTre78HmsDYyf4E4h0M5ev5xZ6+sIXHXsPyoTfsH2jkpgb9qI5zqPgUObJMi/84JfGyoopCKf5y3Yhv3PkzgxXh9yz2SxzvFi7AmOxn/OANvq/Ol4yTauah1DNs3voCdDiNM97GmPTht+2BEHx292UFGhMogFXYUPM5aCVaUZtN9fT9q+t0C/ZzYOGVVi/9EmLg6cyI8nWsEss8k4RmUe3VRZwF1znHilThod0l1Oz6paIamW4VxnBSfMZpD+qMgrKneDxwdbkJTbxQZVn2jU6s/YVyuFATH78MaXZjiWpAhdkpJgtKEA9GEKqDRuA+FUG5p8ex5/fvcPtq9agY/Ur8APUwZr/x9w56o0f77yhI3VLuNYmZ34x6IULx1bh0ovV6PtdB288VIXJqWco6t180DvTx7ftHsNKlZ3MCwwm406H0Ox2RaIVVLEn9WGsG7cYVDco0J29+6x2cA4PjmnBsPFvuPeoae453M8en9wJulYOZCu0cNHGY3wb2UfhFgd4tS4NjhZm0fJzw2Jbx7DqdcPkORzccjFZbBhQxUpn9gAz+gU5+/3BU23jXCiapgzwpfT9Zc7OHY6gsi3cNC0+4YNBxI47LAYn9i+FbdfG0uZu7dD6OA5HLn8AWrfmgDPWjdjxG5fGlzojv0HrmBh7yZImC+DX8UGuSLuJdm0v2WPtwqweJkRPrv/HKC0h+719MHPjdI4MFjEQbMF4WxkMYieaCUVHyHYs6iJer/fwu2z5CGsJor3Yy1vk3nEVxJ8cO3kTpoqHcsz/QjGOBzA213PeWlzOoyWkYaeTc4cZhLD7r3laPGzkRd97EbjEnEY6T1ME6p0MFJaFX1ye2hayF2UD2iFRXWP4MU7H8qu/Ar6o/WgKU2CZLp+4LGUn6C92BRcs7w4tEwPG6u6wEvWiEqruyikaTKkDEry0bpyNHV0ZfGv5rxujioN/IriRLFa2JW4FKuX1pNehR64tmSCv1sN6Ky8TZUlq8gqTwwf1WmwnoM1mZ4fDQKHdCl/rwqcHVzAzrSF880UUfC7Eu1pSORGIU/kSCXI3vINE7f3oed7EdCIKgK5pNdgcfgRGlnt5qUHf+G70HbQd2EQeTefnd7v4H/xWvBrvQHwyCI27y+kVxWfYOFaQ/hS6IDukov59vgN0HTLC0pvyIGmizgVHlPg9zJMmjsGUWxJN3yuD2C/Yy74rXQ6Zqpuhv1FCrB32xDvHCrH8aWOuE/eGyIyt9IhxaOU9vA8mf40BMm0LHIINAOF1Y5Y5XyYpSXu0YqRIehXlUxd/SJ0L0wVwx2uUUt9E2q+kYJbK3qovS4Uds2ogo+1dXRkSg6+KZjCe7tX81zRz5R2vAx+7BWG8oJ0EHb9iUEDs2hbhhFYDD0B+QQByh6rCzm69pS79CX4r7aGrNl7UShIDTz+S6C6REdomCVFfxKzYKNnA+R+Hs1W19/zglKAvFkLwOrtKWr2CMUYMT3Y5niZoufLYk1EJ9parKZXG9IB6y0horCNlKb3Uu/kVIrnTWgfNZfPHYvHWbbXqCDXj3TWBEH1LmXA1FB65OuMIouMMWyrCj0fEcYaJ66hrXU7GoklUfbh46CjPBYyhoJ4qukSTts3xCtOnYZTb1xA/08onfqdCD+2BkL0FHO+UqwDhy3f8e0paSgvd5n9g8pwf+gkHNEeyvYj9vOVJ9vpYvFfaLtsCL7aEeh3cBAdtE35wQsnmCQUDBuMh9lmnCae+L2PHzbX8wUhMyid0g0qf0y4QVyIt194ipcLJ9Pab5V07vR2evipFK7n1lDNZQJRqROAM4r5178FdDppIi/J/QqNXZkc+zQOG/xKIPL+bfj2XAPeHdgPr1zmwn2FZh6f+ItDG4AGx7dzdcMauDV3HwpNVIEcCSn4GzuV9fbu4P79bTDpSxU/iKqksPpXIDhTj/4aRKFAjxuo7iW4rrcY5ESy+dLJ03SyWJtOZKrS4MSdFLnZCByfqcG81CM83GkK0UKx9Eqvht7tbOONmXps3/UWQyZrwbWYBHgq8gBW5Uiir5EO/CfrDPsPSGNF9H147d/C2LOCd7+ZT/vgAVfoP6etR1V49d2J4FC3FiyVBshUYxQcFH3IRz3+cLF5BzQZaGJ48CH+ff4S7DGbBOCwlDaGltCM70nwe/9FhORFVDjmOq+tMqZVB/xQb+k7rGvRgAV123njdF/yzTeEBdqv6b7ScYgs1sDqJd1oQTEgnXKcmx6rwMLgf1z1chQOXv3Ea3pu4kCYFmb+fkoJY5LwX6UkvJJcAEo8FUwEWyDqdgwON4dB4umjFKZqRjnD4zA0OQOlbDawUvQn9ndWAN/XaWy315ae7npGIgb/8It+A33TC4HI9uOwf+p21LBLo8WZU8Bo5Sdwc3LDJVeEcMTJSt63uI23Ps2kr8eXUP/cUPqUsBfvtivB5KddKJ/4F2WuLuQFqk/5znEhqszpY5OlRiSqR2S3+BeXfBGDRXfvwW2Z27D0QDDZ/5LFt+sm4PTMHmp0mYH+5eXwymovuforwRGbr7B4jCleTn0Nvxsv4JmxN/je8cnctPsfuITNp9cvUqDWWQkmLn0OlXaecPdOA5cU9IOg8k2Q1LiJCnMtmB0sSU/qDmYYC4L0rdFQURuFZ26M5rH7U0htTyS6312MOSOW8ZbvD/FKlghcGTCHviNdeOHfNehNHoT+J+Z0pl6DrkguglluQaCWpInHA8TJw1MDyjWFeT5Zw8ERmtgp6g//hBazod9OPJvfxFWnFqLhk83gOkkTLHQcUDKzACZQD35vO8fdPwuhfbUo34uyg0NVnRDwN48mPhaHrMvPwG/mBfqu6EpKtzzp+IutuK/wNe3Y5gb2yQ4YHz6T4iu0wcSwinbHOGLanRfgPyqUlwUEQce+IS7Y8ZLNf27Fec/UyGakGWTF3UHBytsoIyVN1hIrcZ3bJPbMe4gWBrOhMOAcd0zYgEHBMiAS2wlrwg9AWa0XB+nKYdfbJDI1t0TLb89IO/4NPjphwVPejoXe4PU0t00fIvwb6IDcN7Z8jrgmu5BmJiuxSHYn7H1zAR4ECsKlUdtomkMb9sbHoaF8M7p/scMU1/2g2XwPFrIxK8aos6yRNVw4ZMg3BE+z5GYb/KkSzHemWMBY762sJilAY9o/wqKz77FnBsPWF/+o9UQNB6tos7DVGjjUpc1KY/fS3VfXSEHSFW2d/mGsiyrEPb7NAbt/0+o1qhw1Ww+LBPIgyiYXvpEfVzd2QOvG77z7siSsuG8Pb2LcKd8zkkdcs6OibXr8ScCPfzo8pNn+NWAep8rFjyzh9lRLEK66BHFpDtSyfwm2fDlOXmN0sdH6KO/8NYKea01i7UYTuLbDBQ81tvC7h5EUZeTBxfdCIHzUX3qZ0cAGjRF00MwCb7wThNrgcki2OkuVHh9BZOVdfD9nNX08bE6iVzogp1UWLHtl+Z3TeKjRy2fHGXdQNu0uLxv/hXyWnaG7Rd5sIWpASfwfJXXvpDlu1uA7x5bWTCmAFwUR6PblPTz7aQk+lws59/w+UF2yHt49dwX1Efowt6WSXusHc6zUfD4jIwhzw0K49uUOnvU3nE/ka+PLpevZ0NsACjUqUfXGDciVTsCVb5twaQaBeLgO9/oF0/sr2/CgXRLP26ILhnYBJGGzmX/M78AZj9rggp4bl7mNoc45q+hF1yn4nDEO3j9UgT0a1Zg4rZEzqtSYwns5SqKZGs4G84i7SlxxfCfq906BwFvj4GXxJyo7bAHyDub4ds9aniWXy/8j7j4UgVDUAAD/I7OQ7GRkRVZIydbWLpKGUNqFZEVDOUpGi4yUklREgwqFslVGEqVQKUWUStHCfYz7JN+RFdFgHanJgdSNnTqVsD5AB1LOb8G9WQf5yZ5a5lJP7PM9jkvijOHuh53oJT5I4+YasMZNLTgnpcQSq2+C9eyfPMF1PA88vw8fRjwG/7t6uH7RLdxhawMhuSYw172T419ZMsq1o2lqKhduOMavP7+AZx6WNL9tFTWd9MKH4dKgY/8bljsm0+E2DZ41ZinXHb6OH9qqsEvEiXSz68BYfyX4K2tC3htVjjWZiLOiuskyOwaPP7Gj38f3QFVaCql2CvKhlEEwHTaFbe8sOPH9MT7SspwMY1Zg7rto0rediVKuwixbs5dGipfh9Plj4ZNJN2ROWAcCa4bxor861WSPgGbfPOysX4tx0sKYsOM3vjkxBrabtaPF3ls875kFBZzyYuOJytB7NRdHXPDFltW+/LxSFWYXE+gN1uHEhGTuT/GEiJYW7v9mAKoLv0KoQQbd/iGC0QdD8VPteMiNHQMnxkWgpp8lZaZvpl9xu2lDRgZ7GlnQifJ/4C1ZwZcuAMiZVPL60eEU82whn3V8AQqGy9BxrSWqZXVilsV5NphpT7bPNGDG4Cp03pHBc3KewsYNw2DtP4wR4cYQJVvPSXU6oFkymdaeHgkOWb/R4KU3PD6hz4+3JVBrmQxpSSwGz+kSKNSuAHVzn8K/gvGg0/8Obm6vpVTjn5ThGUzJegCDj2rpZ/gVbvbaAqL97lgcrwLf3tnS4kxHKNtzAcQ+d8NJ0SGoKvnF3SICJDJJFg5uj4NRaaow/q8vr7orC4cW+6PRz0Vw9spVynx/ntyd9NA0WpGqZpyGdgE9SFvtxad2DfOaXR30zjUSN1adxpzsGdiQtwyvlljjjFnC1BMlAmNOfkE7q7WQPV0WdZIqWfSaBCdPsqWzB12p/GYv84MtvPqAGsg9iuM3hU/4r+MKnuk0nqeMyuE7noK0NbqHitJt+a5INVRIa4KwtRDVL7/Aj76ZcoHhF3636hs8k5iBU1TcYMK1j/goXpGnnxkPPrMFUTJFgdSSfmGs50vscJmH+b4LeMy4E7ja6ztXtn2gxlnjwbHoH8hY3EcBeREMPq7Fh19nUnlEG60f7UiLl9/nszKNKPrbFGJ2pZHKrxN06cUjfHQnhW4L1INs507471AxV85ciM93f+TtD5WgWcuDfM4eBqHvy3jHhNk4nOAJRS5hNLJ/Ppf0CMFjM03cO1YOlF5N5XcaD+HWand6/CMVFB4O0DqTRtKMfMPzHEazwScvKKiXBntdXfKzUQcQ34ielvdwXOAbWH82nrrlq+j36SG2tfZmOdVpkHy5Eh1ji7iz6iuteHWFtTLyeb4cgONXKbD0+83qCwMR061A/5QmmkokwsaT1fDsSCImrcrFpp1fOCTLA784+sHzxIfk/mQMHNqnQQlqxdAh2MPCiVsx0XAm30u5zuvOXYTwj7fx3YN7JC2jCtveaoC5XjAs8FpEMhktbBj3Hka+fkMz80Rxcu4LVj8yEh6sIbi1qAoamrbQBNlSvvk+kpZH/KHJ97dDmv97SIcYHhvWBVP6lcBTgsn6qi7K3DWhyHu5lHEkgkVmOuHSCQLotEcNzssswwdPVGCf2z3igD+Qs7iYpb438qBHPyt++0A7LsRQ4QUDFNm1GmcvV4DGGZ+obZwcpvlU4OlmhLtxdzg8wIR+aepDceVcHPT8D1JWGEFCzFU8UFBOqUfMwPepMPcqaqNOxWEeOhRAl2aaYtTTq9R6TgsO5T2lqNMB1JxriDbOk7Du7GLOxauwWFOL13UdwRS1BDq/VQ4ud43i6//JwZcjE3nyyiHsu2kB9wPkyGStI5wvu4U5whNANUMYNq/Xo/+8NeB3nAt7v7LHCfdWUV6SMjbcFcPfBm185vdPuvtZCZxljNHhv9sgc3YSllhW4dTUI7j/4GUq/d0PjctUIVwwABb6IVhFEM3UOoGyg1l8XqYWlwQ1U4nmY7ZtW8A5yioUkXwDIsSsYcrNFP40hci69jHuqrADkfm15FCWDRkbPHj3+RN8wMeKQlKs4cjSYvy1eheXaxbQqVuf6YW7DbR3rSJzh5d8xH4x7hc+DqNkRsHcnh305u4UcpB/ghsf6GLf0t38ev5RHmpRAJKzw83PLGD/VWk4rh4P6017gVmPnmhY0+HWdVR/7DPuse/nl36raNphSZbwMYCNeQU0b7cZSE+8zNKjX+K8SxNgoog1W28fh3oy58Hw5jzenTcV6iQm0vQSO1S+KoLy3X5w4sIW/NnxlgJsRDF+5QwqmPkVLMT1oWq5ILzQbYWRK/9wU+kcVjcRg+4fK/Ha9ams88WXXh1toIf/ycCdh5e5ZGwxmDX5U9nKr6y88hTmpawiTaMh/OWRhnN2iXLEBytYkq7Mk+wugdzlNKzvfEY6IpaUr7CIYsqvcZ/wd753JxZfL1CAEToWpCAgiM1pL1Dm/EXe06uBc4OdmVqPQsar13hy+0l6eHE8yE0zxPtPw3Fd7EhyzGSU33kKyua08/2C/egZ9QGnDdvhEzlV2D8pgCffbOK694vAyXQuaS9eA44XDtEy1TPYVC9Cpos6cZkBwPSSYCjeWwN7RhSC26kHdLtOEeYr3MBjp5v5o+xb7r80n17PkYShR7pg5dJJjbHC3BV2lr0K5SklSpRCn8/jLYHzacW7bbhvgiTMV0/BvsdbuNmjj30ELnJdnCg8OSqEQeN6EWuqsfftN9q4Sgjk3sVzxPxNsH9DDpgpqNG2nc/5vbo2NfmPZYvFbbjj93va8dEKyoNe8S3vHtwnLAynPnpC88tsEhyfi9sORPCBr3eg3mAF38mfDI6q+nQ6wJg/vLHHgbWb8ef5ybBr5SRaKbccDtWmsNGjUfxTcgxsOCvA3fXE4WmVEFGThVMqzUkrz5X+SHyDWYWvQLZggCrHCEGa3lqOU67C1FkadK8vD9bpqkHls7koN5QFYqFW8GO8KemI64P7x0+4b1YAnp0eAh836dPJ+M/kUzQA09aLseAWxKGOdfjtohQ8nPAMSgql+UR6EL42Modq33lk8fsWjTXxw60zf+CT6s28XsUSlowyodpLBujWZU3L9RzYYWQsiIjOwqRtzzHe5CXtyjGmy11ycNYkl99cNydri1Ja5adJzgumYnmqL54vtMdjKMCq1Y00PVYPxjqP42hLI4TsX5g12oPXHEglQfUiXnP9N7m43MAZe4ph2QwTWHu3B7+W/+BDe51IXegda785SXaqA+w3voTOdg1D5AJBGNEIMNHWmXJVXkHVhSr+7+gXjHZ3pxE6ORSyuwDKFB1x5ZvVNGqdJqTeF+cfjsmIyitwzeF3PHHPBbLPasVZrou4LH0Ryuh4QZIEwmO/QDa51IruNVEgnxaN5lHKtFLrExzUnEBRDcdg0w8jqBnJMKZNEAOGL9LRY1vZTPAtZlgnQmXCL/4xmAfHW8KotqGUbrMK9K8bQKPrc/BZVTbd2PAFLCzmk+qYM/znswwcVV6OG+79omcDNlC8sYjm5k+lnuEPYDmrB5P23sJjO9zgyONiKN0cwg9me4Dgal1Q2dfIj18rYe+PveQ6fhn86BrFi06u42ehW3FBSQfWjkzj3bnCYJMtDHNizEnkxRV6dS8AfIRXcZbgPMrfuBvGK6yHt/+2gsYKLVAP28tDQQN8ckc9nnw5AZ53+nLai1yUbdnOf1w28aI/vTQbJkJScQLNGrsZpUTVeZVUIWyYg+hbvBSbDfehV5Y4ev5NhjVbtEFphzWkNKjR7KqPZDRgSOIGznCo8TEqfv/L83ZcwXWlivxHexpU6wUTJQtRxZnD3D5oyQub0qBhUSS9+uqHlw4n0P2N/RS8bSRovHWj8VbB9FTvJuy8pkqlphMxdu1LrNn4DI+3WNH28kyS8FeDAvXH6PQmk/0KXPjA0HaY072IPSdth+T3fagRIIQrXBOxo0MRtIo2YUiDKI7P2cI9E+spXOcAJJansXp8EG24cB5K3yXQ6I3TYOQeGchd+Y/ibM5Q+fdizjd5QV/3tuEn+d1wpSEcbNa441mWBh3hbs7RyILoB1vAt+cYFmYastmURgya84Ja4wIxQj0Tn/tMhjcL3fjUWDVunbkfJiZnk3pJEX4baEbl1Rf4LPiDz3UbPvPREK47zMCjm8dQRWQymVmuoKXHz1JWejXNaVfCcbm/KcPKkBcKGoHk4CGQCFDAOsNqXqJgSlHO4jj2SzALPl2JyUKPqXh+JWcbmECBaCmJfV4J1WYvyLUgEgTynOhwWC2NjozCo14GZGZylx0i5aHZQR29lubTBY3bVFCchkaLRLiyxYRVfrznwVZjtk25Cb696nA08Bc7yYSCu+kS7v2lQw1KPXCkqJrl19pSyDQJNilp5ebhEbDgdTMruM/G/vEreaT4aX6bgjhD/xt3J9XBEZ2jZOb1gZ53joNrf/Oxd9CXDCdWwCTtClRZoMQyJd5Ycesppnz7wXdNR4FMkDZ8CLeF7RVJUPpKmbMCJ3HS3l/g7z2Df77fxTNe9sDkfgFSG54IzpMnQ1TTEVgR60u3rVfzXZ31pDBNBroqdTE/YzTbK4ykvjeTYNXJAlTwtkWfjjCyjUnjoQcDHDbrBK7asZ4lKtzx52Np/iBlBvK2ifjibQ0/pQssHOKHG5YOkUftZZh7Ko7f/3jCv6X24m05dQgSfcfb7e6Blwaz9+8rMDVQm7v1OiHoiAsYV1fAyrPFfDjbHBbn58NrzybKiSvDf6fb6LHLYhgab0UeX3dR/MtrfGlyFP8JFgaBp/Kk/asV971ZyZ52OdC4byGPD2wm/1Dk8OtBNGHXIYpeogllm7cjdY1guSWBNMJQkBeovEK9rl/4YfAX3PpJ9NDyINu+lAI7wROcd6Wfngzt4LURiqCvoAYdhybByWm1vCgvkgu4B1NWM4RM3gIJvbPYLawG5j3ZxDldH7HSSouXtSzE5+ucUe7AZE56JgqaBlo0bWkHCA3dpVkuSZASa0wBzy9Bi88xXjHxIxov2Q7CzeMg3LIYZ3YVoRAVkD95gJKRFyrvlALbuzMp1D0cH+S9poMNBrBEoRBu5h2ho8e+saxHIfmWbYMCSSeomnkMn8b10C79cNhsTrDp6le2mjGMm3p2QPMoY7KrYXrjfY/mnzOg7+9C4W7iDHArMIOtZqKgLqJPK59OwWkPf0M4BIPqkWsgX6NN8XPcYfjtVxZKGQcHRbwh63oWj4pJh/3jRsKURgOYOOIxHbtpiSHugnBURA52mU+Cxq+6sP+tHeUtd+HuQeTogxmwP1QVBtxmcedYFbS5nU3fdKxg5CFDtEsby5nvo9g835evGmjj4UlTKG3NJiqaVQUfpyqRMevCmteBOKP5MqVJOrBhfx7drNbAEbu7+HW7LJnuHcSBhNk0198SNqY95trw1XBzQIYGPs3Eycd+0DlIhD1jbmLi0mFMubUN76oaQXCqPN7vt8ZVM/dy1BUNWq6tx293ysBgtQXIlTRh1610LB9UhukmIhRRuprW9F8ij/7jMFVmJ8SKm4DOr1c4e+ZdKlnthqFfxwDWGlCDrxCMUFGnRe2xsCXNkE42j0eLmOd4sugvbZdKgf+8LeFAZgNs1+tHl9uJGL4MWXCGMVc59dCdo3qwKq0RNI+v5uE/AFc7o0k2PgaNk+fyJJ8++JD5ATMiL5PYw0z6XSYD7UOHyfubNYxZcICenrTn65czsT6jCTL7buLKWZG0aOF2MuR/4NPdyWckRCDNfTVPFl0HUeUDlNrXA24qgeA6XpbfHu6G8KX7YLfAa96rPxYihc5QbVgRL9ouT2uPmFLA56vw4NIosNAcTcKv/8KdZ5dovfwE6G65gRF9Tey5ZAMYFK/Alo2HqMLLBif33GA1YUXYMqBFwXbK8KbkLPwODcCfsxO4pOAltzoWY3vpMhyTOIsUpurCpGPGaO0mCU4m+1BPeA3O0rlIId3TONPIEmZmd2DavUoUn/YAnUeNoAWu0uDyV4zWLppPcx2+0Ot6b7D+WcZLx9rSnd5r9LPIkDfIFaB5mxwYFL+EnfyAnubNRoXQEyxul8DyHXfAfY0jfl6+hZfvH0dqypqwwGQJJklE0KTds2B/rA1XKr4FgZVZlPH+IRXluPMFkQOUvRrhh2w+T3owyG0ZcTh73ThcmXgBLC/vhuY+GcyrF6C79ASlP6rCz24XHvffbEg3z6XeAV08NLSYxJ6+451tYRhWvoW/fA8nI//J4BawDL2qdVHjxjz6b9t20A6Yi1ddZXn2wRt8PMQMlTae5luNFvAlqRyCDprxpI/N+H7uNnxzCUnv9FSUUvTgLSqp1LvdnI6O0YapkxJBfjpgpaghO10+wufck3m+syDx9NM8eXciV9kFQWyMENhJKMNcmyj+d9qbdr9IQfnlZvRyew6+HLsTdTAdx6g4o36HHBQe18RFDw+x6aZA+Ff/kfO2bOG5m+TAY/IgZWWmYUXYf7zpljKEPZuEC/0/8ST1JNIfmAs3A6RRq78OpNZPppFri/h2zgigTFVYrv6DHNru0dBSWSpO9MKxGwX5n7wjDF10IJWW+/xV4xN/mWgBkne0KUPHGb9HGqHt1b8spfcEPH68Iblp3zht5hr4tSIIO0UnQenjQxTTeQcsF/rg4rvR/GogiOW22VNgiCD+UPZAgcNrweyPDrTvfsbmH87zgYiF1G00m7ONHdFTfC16+jVDXUM2ungJ47CONeyILob7e1rx4TIt8p7qxluuyMDh4TvYJR+Gz5Jb0fl1EW+pFIeSpGSwelPIvq6BXD5aCxvef6f15Yok+/0EjNnnAL1CpbhAYxrM7fSgWx/EUNt+Ar6UfYcvxvdSQ08IHg49AiG/M2iTdAtYRavCvzQTzny9E6Y+rEAnn1Ww9Phe6tbqQDXLubRurTt//ykKqb1T4IzoKvK5+4a2RP4jm3PldIO90d56Mc2CBKpar896Xa85VkoNlMT0IHWRFf6Tu0qp7wzpq0QapImkguals6SfFAUibhfoVpIgxN47CNo2vrD+80FuUWqAFjU76Dr2BxZarac3jnNAf1Uvt3jbgL+bGAad6we1I6U0zj4OmkW9aOmjYdSNe8ZZLwI5VGcQDQpV4Ni5lahbFAxiS1swb6MAlNzbh8HOh7ks+gpeEKvAk1+sqVlFBGa9aIIR5rbsVbUDWqSb8MajGjqQv4Vi4qV5Q70eSDdfwcjLRtC2p5VFDK3YxNyOPSrc8NqdTjRomAfeITv5wEURmqx2E/I8tSFZfheWi02kp7F+0NXjz+m352NRvB9ofrPA98WW/K/xOH3vV4NLSp3QODcWu11fQDaPZdWaY/jBRpM//J6HAT2nQMdaE4uKlEFIMI/S5Icgx74dk5t2YOyMf2RivQA/Qz28fTMBTZLS2Of+BDg4NxKnadti3u0RsPBDJKr3TKY918NAvLYdYsa8hZ926ui4SgI65nRQYW0C5p8fwvM1gxSXMYmjR0+AMR2X0WHTBhrdPojCSxHynPRJ93sldvqX4vCVtxCpZ41rTzjTop5Y/te+mQN1I9imTgtcT8ZgZq4TfK05Rr/3jwYRy0yUm2HOqmZfsWxhFjQtmAD+EVLw79xJdN2yk2PKgGvzT4D6zoX4SecQf513AuQP7eedHxegh7gw+AwYwJztsrDcSZsy+pfA+T1i/GBsFKzbbA/GgtfhxOL/cKBOFgbsb2LM6Dv4A4NZNPsZyusJcE2TMPyQVeIVFzaAV+tzNO6WhHcrT6Or2EaynhKPLpeteEnsPo787kGbnqaDxw8l6K+/AY4xphAhGc0+62+zaE8GRoYowbkpJ+nToUWoObGUR7mMR7Xafpoug+AqOgLaKrOhNj8YhFJ30a9qIRjQbmXKvgdWpbsp7+k8HPPJBqacS4DQY2vpcIUJXXbuAMWF6TB2Xhbp6G9Do6LLnGyUh6lX5OF15j20Gl1Jt1OPYknUaVwQf44DFtRAh74+ZXRlksHLDCxNU4fAJevIfclUsm9touUz9uD1f+/409NaqLx3n+ztrsOTAebuGxqQAx5oItfENx6788JTaZzz+yKmS1rzufpQXDNdlg7ubqM9dlPASiUVr3I7J+7poyePpTHy93X0yKkj8zVN/LTmGefrXsNdz6VgtFMjzJfZBjOWriCdcICB9520RSea/eOWoZSLNAuM/cA3QxUh7mMeurMofzq7lSVvRcPpuWU0Vjcd5olIgdjBJ3ypYSQea7UC4Tsn8LTdDB7wEgLcq8kOi/Np22cffK05HfcK/IaRm4zowUGCQ4sUoCrND+O1HWjoxRP2z06A7iJhXjL7C86JkOBdx0RJV0cGdqscgnm/87n33FbUWL4FBEc4kk2zOU3fugy2n/4CwcU/wD1UHPbPD4A8UX/MeiSEOwYu0tVdWuxY5c7OCVI43yOC7m6upIQF0rBK3ZnMD5yBI7XtWNkVzk/+1NAi2+ew//p4TGx5CIW3xsLVfaIw42MkFIcZkW7TKtgd/whDb0vw4dv3UPfrU6zpnoH3epy5XF0UvOYJoNf3Ayh+yw63ePWhw651ENpRCJ0/Yqkpdzdu+2ULl/fKw38fMvne1x8gMFaOwufYcveMXpy9ZxP2DWbxiKDT7Fz2BwylxsH3z9sooMeb52T74deMBLL74EWf7HZi0MR0KNZRwb6GCWicZgFLJYDCJ12B6Re+Q7DrcXaSfY7bJhF9KBHCRZrz8V7Tfp4XKw6F9x7zrbYtUD/7FVT+zKUhTxH42tqC3tfT8G+yEj17eod61U3gy9T1pF09ihtCRtHf7jMsdegLatR4sMIdKR5x4hU8WBtMx9eowZJtgzglaT5dXz6KRrXHktitTcDj5rOSPXOmphi3vWiEoucqkJXkDIf6R9GSM5XUkl9D1+fKkHnPfyDgFQltmlbcJJpPlZNGQm/JQUg17sJVFcHoeLMW38X6Y+yDYnw+oo9uq9jh0wIBEh8tCWfX/MEpf03wZKUmjvTQ4Rd9GVSz2BEl62fw1uDr4ObkgM0ztGAT6nFu7Ea426RLInNOsZXzBNg3PZiEFvlA2vEsDHPVp9LT46DGUx1lQ4Wp75USrdVYy89GuIDs7A18JPwycGc6H9EnUN0qAEczKiClSAuvrxblcyQFRu0XIOxgHC8OWE76hx/R32vfuO4KQ9zSkZAYnAQnEhPJXmcE3bS7D6lNg/BY8BoYn34F13x2Mo4QhSGZdN6tYow15+6gp+cSevBiF/updfDjGVOpO6MMVuW/x+EecZgc5Qjqd3fjijvemFiwjOe73YF1ZvZgfjedVL+tRmmKhFS5SbB+vCiK/ZWmdztmc41HFq4T3UTmYXpgub+d98AFUqp4R3m3jGByshVIynjz+fVTIWuXED6b3kFpPxVwoetYSH4iTvFh6txvNw3ay66x15dhnDPtG9V83E/xoy2wY+kxUDeopkyx57TvRjC4Xp8ICa2iUPdJHYvd43ng1BsUf3uEzJc1wMypNrht809y81OhhUYTIVrUE5uXB9F5X0mSa2iCj1EdEGO+jRz7NkMTMriI+oDBFgEw2DsH7RL8WeClHOldf4w7tAq471E4HPKWxMubjTC3Ig12D2lC8MRBvvckgRNcZlHJwTh0CR9Eky9PMX9eJHTlr+DR8e64eqkNhF+Op1XxVuxpO4nvep1FubEdEJY+Asu6MsCwuoXbbqYjxeiA6loBDisM5N3XF/DgkAZeHGyEKOsIPtAogdqqM0lu4whc4WsBZv1RsFjAEk8aLoXUmCFeWTCaWiWdIfjIUci1jAN7r29gsVUJ1m9ZBjsN/iPDelfee6ASereuwkfSN0iwRQiOK//gUb5TwWLFVDiZKo8rc2/wqMVf0Gb+MgiJsYBbn4zoqaIXbg7yg6TYfegiaAVBz2vg8YTXrPVfGB558h013xeSzt/f+OtmJFW2faftM66w2UJBUBeIYf2GQs7RdaDjgrNpueQJMO1bT+nqJbj4iBdW59qjnMFIOHduE1700sO1AZ5cv3MTi/9pwJljVOC7TSmaP6rkU3W78FSHAhw9OJb2LMiDRcJrYCjvLL1bNArGLFPAQ7VfWPRLOH8UGMUlawTAthRw2YQI8LHzwz3jCROTHNB9rAHalnThsbaR3Hn0LxwInAi3GzeT0+ZoEvi3CwfzRKjjfi/nFujxwPZWNP2Yih72/hAkZAzaNiWc0dCB+qWpAME/aJfoI27ZXYezZB/TWNF+in4sD30WhqAr+g/rPnlyh7Y4XT5WwncT76CiSyb6rflG4S83UcHWg6BkIgtC9i1Ul5PJ6pF3UOm/IbazSeXabieeJ/KOCg+WgjlloUySCgifLEWlznII/74WhHa4Ubx1FyyZf4yenqyn8kkZ7FydQqXyKrDseTjqvZcA924fDnlRSo88DHh3gQr0jUumfWnOvHrnR268pgyvRN0pxigRNq0sgxMvgnCp51tYv+MtTsoX4raLtSzqVg21d6XB+dxtMjBooQNap2lL7k+cu281VliaU/mwOT+yiWXXvSZ0Pc0Klu95Qwu09WlxVC1LPhmCeff6cW1hNPbcPQ3Ph9ywtUgVftkKwdudBui4IQ3c7zzGtQWD4LWqCYVvL8Z9Ho/xtpgBJp5uQzl3Obh5+AdqTBMjHf3/aMyCcBg2E4TdgYwWuseh3FgCx1wYBUsLp4H8gV5W9y7GBV/W4uhoPzq3eybnjVGmJ5OmQJ3+N+44J4lT/ujBnnQDHHaOQTsJM/pbpgRiJ6RBSsiPgzQW4sklnuRR8BDrtyH0xWTxuxhTfDywnTKbRqJPxi2KdS6g+NH1/EjoGOVsa0Cd79Lwru4ibFqkRMsG52Bw7Xe++qEJFzzNoRLPg3h7czYffjGHItvEIUf/Cc9YtYBjuyTpYNBEUK3vhNYd46nJ2QSN1FKgpc0U8taLw9XX0+jtgA2am6zhOb1GeO7UAhB8UERzbnWS+PoDMOf9LpL0kIEBvd+8Y1UC+RWsgt0P6jD2vzi4XpRIh2f6Yebq6/RF6QBVdGvBQoccSjmaQrV90zBlRwYW4FTW1nXAbTlWpKbsDRE9jNvOSsLh3GDuGZxKIT8NaZ60Li4cfwtWrF7Oi6QUWenzGvwyexJNWCIBn4pSwM0sFV/VyCNGLYEDq76Cf9R5WqeaAfEK41DXPgGP71OFrypuvHnhQ/y88Bqc27mYhq0U8KnHLBbyTafkAyVU9E+Z4l9pw811x/mVnwqFXpoJwR/mg5fvOCpKesUDhRf4xPBvzpldgpZvJ0LunlzqXb4ba7d7wFLRP2iWNALqJaU5U1yINnwMQmMqoLxAK1CMf82hpzWhWP8ltrrU0ZBWAM5JiGc/czlQzPak7c4JrHFTAuaFOnBNeSva3t4KQuNEeaF/Kdxwfozj94bQ9Q3lPOViGMWOVoSPdftZZus2hAwFyLvuBxMHNsLlDUchTaGB9f+WYsCPxVD0RR62LF1HT7PasLR3PbsUmsGcDTspWjcOb5+rx2wPKcwUlof2MZLwd/Zc+rxJn7sOpEHwitd0KccBnnzO54qXk/nnu2i4Z6nPjautIMtfgNfuacZZ/5xwwoLJZGvqSr6THvC0+ZfRScoVUrJC0XnkKIgSjKbgeg+ev2gzd5pvhVHmSnTmpShE/FeEbb5PcXhUPOm/mgiH3jvj3GOvIbetlaZPq0XL5C7WL9sOTofNWUCuGFKDFUhDyAyOFTyCWXPS0FDNgjXFzbAx5x/4dfjw4knzea1OFZf/aiTHX4pQHnMTnpx2QJP+gxjS2owi2qt4u+FdKJq2iBZGX6SodyUgYyULqh8f4yZhKTY4LAj2jX0UdnY9Sr7Qxgs5XfQ1Mp6H+m6CyzhJ+PExgiMOZvDg3ofc9WMTiXrtwqV+x/jAIW2c+WknF1wYwAZ7M7j68Q/GrHdleSFT2OMwG7aftMCKb5Z85+wK8Ho/D3NaE0HfWxEe17tjVdg4utsSxTZBO+nOZQ8W39jFDxVTqCMQ4fGOZjRW0Qav+EuU81SX0wcXkLOMKFjOnwcCvpep8dQFVG19D9st/MDrnSl07l8Bd++P4fTsAI5r/4PVMato6mxPnJj+lzObR+L+t0OwrFgRhg1f0ifZr9Dy8ijlpuWB6C17yGlbjuEPdXHIjCB86iKetVIeDhq/gH21YnRT9w/Ztqvi3z4b9l0rzAUbJOj2ikBSm26EEtVCEKOEfHk7k+TzHG5peIidUo6I36+hxr5B7Kj8iS0D+6hCWwfqdVbDyyfP+Ne+r+gvWoQ2OfnwxzIB06ut4W6UAt7tECYngbGQLexJh5oN4FBcJG29FIfD6kHo3JuDhYViNNbQljfoj4RXC6X+b/5vwexvNBl/8swKd5gcV41XW1xY9tcdag1Qp+WNItiqbQsJv0TA7pQbKgk1o3azJzzfr4hj/+yCVfclwGFaPOp9XQZH78VxwlQVcMUx8PR4F9lqJeGJKhkS36cBWvN60GZ2Mog+Y7ioLkJnN+nB+zmOnH6xCgfN3sAXwQDQPPWNrk7K4bw+V15/TI/21aXRallZKAnYy6/n3KDQg34g8foPLBG8QQ4j6+jTro9YGKDHHfcfg90kUdjl6kOnnjRBlPNS/FhwCyXyq0hp0iVeXvIQb/77hi4+x/FTjgkYiiA1n+7kaOkYvmv2ibvHjaTAvRs4ee4FNERZWGv7lirVR0O3bCcfc1kMZ4MlSEVLgk0PpVJDJfEPb2NaoPELu4T/QmyZCvxzP0Ift0jTQbdlKCs2mlP/hbPmxFE0T2sMlLqsxkuRMbw8dRxIq4yjDziIq8aJYoDYdByqs2Gp+MU85u49+hB0CyfvrSJvUx1wKjnFpRtLSDY/GIymi/DHZetozwk71IQb3PI9C2+8OAOx0/SgFqbQETtb3PdoMglrbMCtMb9J5t4PDF0/HkZtXAM9NyThh/8UeBaSwwGT41lmmwTIfXnJVgKemJpsxPeHE+nb+nXocdwDdnlbQHlvIjWXuWHGsS3g8FMRp457AS/3bmDvkCiQPK1Os/sbMWv6GGjBX5wh9JxOnDqAdmYJ1Lr+FApvC6X7f5x4qmQhpykYwmEBRfhXP0xzhzthufMVemgYDWPDxbC5UYufXn7CJUJtNPbQffJ7NAWi9LbguOsf6EP8dLYWd0G3/W+o47I3ve/UpPJ2Zfq7ZwlNStAB8WN78Mw7X3z4Zg2e9HvIH+rvUnNbCBRaq1G2Th1Ern4I7/5IwoO7o7Ezfyp5/TECrYy35Lo6hb4UqjJl18PrsPVsbK9PQg4I7VnmfDn+Fqr4qbH7VHsO/h6ED+9fpd9H9sPTWXPobuBonLbJEGKOFNNLl2vw6Ns2vtm4BHyPhqPlfhswHa+AJ5XEKOdEMmevsoEzkVewMW8TK+05R6IfmtFD9ghnv5GgB2WTKapUDUcLx8DbFAMw9fmHj+RmkqJpGZuFvsGMp5/ITTkGa87sxLR7AfRZuYe/2kpBa8Q9Si0zxuAOVXQ0+4hKDy7Qc+fprHFACEj2EqUML6SlJ0dBTnkbW8bmgt7jP3i7LIZ+TxFmLQ8dnnx7ATmGTiPXzCI4uccCdj+vId/1ZXRKbDGLH7rH4rquOLVlMn0frMSCKlFc+rYWxGWUIDnFlJVXf8dEnWkg5/KbX9t/o0XNp3lE3QSIKzsDd9fUwI/RE8DloQ+K7PLGJfoDbKzjCn0WI6D3zlV2E/7F7VfDWanqCJWvVYKq+ofcMeI7umxWRjfjV2ib+IZ84qfygifuVCQ+HtrWE2qJTYLpx8TJW/ArbHNVQ9RLpJLmcBx5bYB7X5vQhZX7sNv2HEndHgU5y58SqTzAPps4TruRDHkh0axXW499b0NBPfIIq29xBe1EDXB76EtKEQp0NOgzi7YfhRmLdnHs+y8Q0a0ILs1fwWxlM5wOHA8P//sEA3mtEKWKnCe1l07kVOOz6hK4t6CbzIZ/QXr/aDjYqQbnAxJ5c3sf2wiZYNqVNZAkJUJ6TgU0QTaEjgbJY3GTPx6oUgaVEWXUMOU+ZMvMp4r1uViTmMVnXu6ldyN6KHiuLel536H7dyRA89ktXq4AqHCyEXInP8Tl5s/w1lVCkeAXnDecAfbDYuAkJQC5z4/yuXuW8HLOHhr104hW3wmig9nnMVxnHtYOyWLCU1v4Fa0E95WNUNKgG5u79nOi8U6c80qd/E6l4ttL8yn5WiJ1dYbRiu0Ewx+e4TlvX1QTzaXpmU108oMvTdp8HzpEnbE4cBcvOXOeHPwmwtkvpVgxcycmz50PNqLmDGfEMOqDCC2X8OGNpr9Aa/cqbkpVBrUvoyDi403efViNohxesbXlTwq6OBZUxuVC4rJz7HAhHD/fk4cNbWFkXx2O846Zwtq4KjQw7KDRM5J4pvN4nrFlI53+VI7BHSqwrzcZK8RPkN+PP3xgOJN38hvwcTqFhd4nOFFuCtx99AlyEsTh+cZnXHfKg2vq3/FDUT9SiguD0/UPeXbKMKx82w6Vzk846s9Y+DduDGWZh1Bfkg29M6ugaXo6NH3rJOi7H0T5syPpi30qaQRYwtMxSoThPyDC6SFFvXhID8Tmwc6czaRofh+XZgxgiFgkrzMbAb7CWShnrg1Zo3Q5/oUZPvpkyicTg3D3cBylx9rx7WUbabryCJB1PI2k6k31JfogNeEEdZv85ccVv7DPtoqrzq6l0rf7ocpTCx5WjaODaS5QaGtFIkc1occ1jZS3rsDUtw7cZxLJ2YZF9LhRH3ZkXOTpZh+4SVkUcpV1wV4/H71vG0NRdC5+cBjmZtc40JqiBLkVMSxi4EfGUlOpy3A/RJ93ATwnxH7hpRAUZwpZwqqQaiILqf0WsFCgF71fxMLKhPlQ+2gpLjDwwA8rZ+H71Bo6a3UBA78qg4bhYy495MrXO8+j/PIFlH9qF1f1WcHiQkMYv8SfAjuGMMDACPbX1KHZ951w7ftq1JAWB/WPxvRBfB1M66mjD2ZTwOj8ZFB+pwWtRlOoSKWe9n64A30j9sHhhiA0dpkHk6v3wIqSXvQ57okN2wzgr5gufkw+AMsjPalF/yGEP02He65TSLl7NT3o6uJzj8/jPEVh2JwczRM81kCh9iVsG+yHq4ITKe56AvjJfuTLNum49sF/eDzaEIpvZGOl9To4UmVHkoX7qfXKFxh4Hos71myFA7aO1OV3Hu5oqoPV2g4crxNBNivvkaJfDdYv8ybTxgc899A96DLWwRb24Q4nDVgWksnLREfSDJc1YHfwFt569w750TXIUNzK7abDqPt8DJp/VYAZOy/SQekfcBkuUdkLYUwc3EE1e0TQV3ojpgcrUGDvSn73RRxuaZ+mP6+VuMHcCj8ZB0Da4yz2DlyBJwOE6EDlf7w9Sp+P6+vCvvEb+biYDt4M2kFblA/C3fOG7Dh5EJfO9cQTBx5w09Ualr4mBCcclVknJIrKxFbRDaf3NGvXawgO+orX6k/R9d1vYMRHXf7yTw5c33nCqa3TMMFoJzo/lsB+1UZOsLCFd/7vof7lPnq+fZBaXRWh1vs9eFmcYHHjSrw0cSYYkymHHl+LLeN6IS3JjZLOt8CczCmgUNDKi/qm81qn2/j1TBVNUb3A221L0SN4K6GQCp2a40/jYyxAct0zNPj6ABMKFdlgyT1saHqKAX2nsHqeLEo9bMGxYeE0pKMPB8RbIVU3Bjb7+pBfUyYtLzbi/WlvqPynGhU/VGb3J6MxaKMW3HibT+WphCdDP1J1oBPaH27kprFLSHbRQjofE4RnPy9F6dXj4I9tB5quzKaDbYDvG5bijc0LucP8Ks7+Xoqa6w9jdcZzrN46Atw+LkPNzYgZ5dNYwes2LZ3ryvFue8lGWAOWXokF6Rp16k0nGBs9TBNT1vCitgr+8K4d8q844ZBsPh8+fQoWFr/Asyph3PJMG1Rm3edRtYVUczGAPrT6YL/dLPCcswxLP2+i42/a+XniE6pTmgC5NVl0KewQfJDrosk3kmGt7G7c8+kz9fb/B9tUrSHk/XxK/6sIt6K60NdDHNatluZbbro8SUYKYu7a45ukEppTtAwOFs5m7226cOC3DnUWjOHwS5YwQWYrDrglw14Tax5O8oULB67hjiuyuHEug2ZRIGgbV8MxLx16bllEz3pSeFHFUdipVoblx9fgpj4JElw7BhRcyti/xZRNnraCVtJx3huqT297AyisvBQ+uEpQUdR4UhtlBtXSE2jFuc2oItYHNqcyeXDnIwhRfM0FW6Kpen8Fy67zp4+ZFtBw8QOXT1zMnbs1yH3LPRQJV4b/Ortgr0c6bAl+z9NiIsDk5ggQvSVMuTUKoD1lCt/89ZNdvgVyXc0v+NHXzOoO16gp+B6pPBCC7+sy+MlhE/pra40nRcVhpuov3hjiQ/f/7QK3mptsv/g3eksqQkCuFVuPFqTQ3Bn40fkO2SY14KjEY9jxhihvRxcZXKyANb8NQG+tETyZmcOWch3wOWUlzJYcwwdHv4XE5Lf40cQcH86r5ugvhuA3GIxnzq3iLdvGQ1r0XP7psp2kNwXx9oCV9G0gCoNb1nLkhqmQOuwMG42cyeCfEl/aLg9JUvdYWt+G5mVXUcoXfSzdnAQzjEVhYyTjpcQ6GPbfiDNkxemnoAcIVL8l75Rhin+lQFMdfOFyvgq4BeeQcVEbz/n5Bn+NS4IeeyeQLd8JHtaDcNbvDnW2HaCS05ZwJUSYUXIeLz4VwoITf/HZ0slwPuQ+zhr2A8+Fvrzg5gu2GiUG818oUs1/1zjGQp2O2FszZEbjyJJk0GrMZ5P72jCjeDSEqKlBb2gZ2fxywa/2V+hV9Dt6mf8ctcNDSfxOBQbONqP479FosVQHMv+k803TZtz2+h9LblsMu4Wmca+fOaQOO2BD9V64HGHAen2GYCkqCyq/rDFLrJPNVjaAk8dFcNAq5k2imWR+XI+/OZmDyPexIBfyDKdMDOGBewbs3ncP5tzXgrJtzygwcCWGqfWi3sTJ1C8rCjsbXnN30GjuWfSSym5/5yvx6XhRtYA3XToLwv/e8Sf1GN7iIANP95+GcUmClHFjE+4uioC9FtfAPH8cCs7cDdc1+yGqUgWUu8Tgv2NfwR6c0X9cNKqf8UCzoNsU9u4nT7XRY7nbFfglYwWOsRsNAjdmoJO0CzpGhFNX4D+c89GGvwQto4mNZhD01Icl93+G51/NYcrPdqqP+k5xfUf45A4dPhPaAn2WS/mW/Fu2kREA+Y5ymNA/Gv5lTQbBjmnwXjQYbgan0KpBYTQenQTglEcFG9v4nkA6XelXhr/GU+FHeh3El2zCEa478YfsfZzntItOfvfHlU0xlH3hCFzwF4HhGb3YeHwjeeV70fy0UL4+JhGX/okFy20mNLDDGUyvxqCnrg3onfHHJer6cCUknD5XLIf8ny4opX+BXFvu46j3V7HlqT4X9chC/8pT+N1qKnHCVFQ5YYCrq95D1aJ3eDSsH9aUvAbBK/1Q7aING2oXg87JfB6ZKUtPRl/hXdoL+K2UGS6+upikX6RQ869raHRMD0qqxoDcdX3q+bKMfWuX8K2JGqjivRREr2xglj5NBVfi6U6pDhiWieLQbUUMntOI308msZmiBgeK6nJ3pR/ctpGnjC260HdLGw7XHaHb5+LBblkjqBRGQ6ScFXzTTqC5y8TQOeQ3qZfP4YuFBBPfbaJZ9z/AlJkJyGm/WKxjI2kd16INj/7Decf3cmtNImYVWsGXK7NgkWU3r/mTjXdHyfBXrUZql/zKect30sBdA3zv7McO67TAPreQF88yZYmKbjCxO4lmaYG88WsjulxvogTvN7j4wh84v1senpc8x+gkG3pWeJoGzbbxmnXucPT2dRxzN44Kgl1w/IUgeCwxDQ6c38M5M8NY9ugu0LGMpOr8drgYpshb9uTg8flbqdzhP2wwVATD/iBa2BYDgV9nYr7VTPpzxQAdvYox4b4Hx7E+DMoGwkMfVShTNoWRb6NYtHs2bImWo5nvo9g4eAfvunCJ7T/ewMRqF2jepQE6Z+pwwdFy+LxUCrOt3SjbaBv7t2TxsoocmNkXxbouAXBtvDREWQii+YpdHGwxC+fleuKyB/bg+DqQms8twzusT8pLxFB8sShcn30QO2tEWVguDfRGaHCW/GiKCGtkN0lmu5vDPDXLhEMkx8GkfE1yCrXmZz9Hokz9Bcr/voDPv7pFCXKz4LhUMz4MOUb2vRZQukmCDpvJcHXVQoxu6uYZy6dT1YXDVFZ/HN1mOvHMDEuSaVKCva2XacV8W3yoMAx6I5PYLDiFerS1eTkcgdljX9D77gq4GDQSvmWoYrSJL9tk9bOq8yWqTyoggZmnqGhBGJm06eK2R3NoSeBk0HW0AqnPU+jq45VYGRVG6df86GTvRJi14Ryuk1ciL5dzLL3ZGBJFEdHRHs9lrmOn4wEQ/NKeHSNP4SXlebhxjQKqCLfCqelSoHNnBGVtKMMXr2LJtP0Zjdv0iVLKk/H11Gs8pi6W3UIPQ2aBAjSrSYLS2hl8wEmQf5ZbwYoRV1DOPZDV66zhzbYe/HR3MhafngqJmaK4Qa2cxvpks+DEFPRdr41Vx+xA6ZQTL8u05re+6yBzkxZ8U3rDTqUX6e2ZoxyjU0tX4kIwOUmA/JUuobqiKM9y2salIyUg8qwTvF2YAQX36yj91nxyzhyHol1T6LDtRgytVaD92l+g1MgUkg/688kUA94RFQmNwpX0vWs55ToEsf4aKdpuZ8m7XKJ4/RdL+OPjRBffT6QGK0ecc2or/DuwFde8ngDx5tq0ocENVjq+pveBIiBx/BQcOdtOIqfvU3VAKCYtsSfQsSTN0zJk3+5NLTO8KPSnHnS8zoVtZ31RVrEd7IYl+Hv4IAzXGrGrxyCsOClOxg6htDbJHNSP7oQJ3xxxwaE4Gj7jyS5B+aAWMZ/LFv3Bg/ejcar6GCCfcWCYI4N+9Z08P90XnfOO0a3eZDB52o5HDy7ChatNeWW+KY4bOQXsdq6CnEWLKcK+HNff9ECdhIXsJmKBnfbTMDDmH7ieB24qUoZEm0IuS71I6dnh4B6SBeisjkOqblQTFAftdJWNllmBySdxuLq/FOPz6zCxwJtURxXj9LeeZP8vGldIlqHjyfVktAnJnKXhZ4QarEstRT1fb7Sf2oINF1+wXZc0bjnVBiUOv/HqwC3eUygP8zP34U2TIXq9R43MhR5iRvI08H8RghqJ5rSh/T6/WfaVJp82B6MeOUobU4enyn+R+Lc7fO1GNL+WC8TIs+3U6h0I22c2kqi0GLw68APON3Rx5rkdWLn0AZdKR5PZ5tMcXviEal+dYlkBe6y2HAUuf135ufIgat6Zhz1xFnyjoZduj//H1zUQjVK+wr/sIPpzQg9ivP1xnFkoObv/QrOw0+jes4DaJF7xiwg7/jPFn9yvR/A4e0NYNVTKYt1v6MfTTzBpbzANvP/GlopjQGHiETQoycYdz22wzlsFTppOxEfK1aBRGcNhg5r0INkA7u01heyia7xUdzfsGR/LgzKKULCrHURGbKc4/yBu1snEBTOeUcW8HFZ18KK1DSNg5/2XuFJBDSa9WEGPK1ohu/k2CNWMxpVrN9J6qmGFRTl8atUW/rHYhxwaLWEIz9GlDX9g934j/rM5jc/e1wb/EWLoNSOYXySMZbHEPPiiaQQaO7VQdP5USjbYwb0pHbBv6zQ6HHYF435Uw0DDMV7/SADQ0AKeLY6nstHDMDtiMXcfXUB7DGJgGjjDBLSDoYoy+jmlkoIltEAnPp5DL5lhzBFDON+O9H6FG5svTSe1BxlcbFpNHyedIbcgZSh6HAtW9kMIxWcodNcb2PrgMtx0y2A500qWya5g2a561totBj4ht3n4ag7W7DrLoyxHUMVnV1hwbIisfb6itU4IBR+S5LDfytCfZAzy9mnoPkEBrtVIot7qzbRV4DKYdcawZG8EfD93iP1bJoDM4DxYu/E5+00wgp1b18HxTcmwWugTaE2/jHvSGOTDXvD+qyNhypuX+D+O64MrBEYNAPA7op2iiRYp7UgTlUpCCQ0rkZSRiCglW0salAZRUcqMZIRofQ0NUinKjEqysqLSPef+jCfy5lLOsFUhh/9cqEFzFKYYe7PjXAdwDR9P8a/zaMmZKfD2cSWXevbC+KKJ8HSrOVodtAfLNG/aLLiRP1h6QHV0KwmskIdFuwW4aZsTnbl4FG5uswKRtLWk12kIhgIL+EZuGb8cWYFfxRQhXLaevgX+gZpzv6Bv+DqWVn4GH7u1PLDBkl5I6dIM2cu8LmQy7I6fQ/6x3dTX8oQdQnxhpv5H3PT4FK9eNwTKytto3okC/itrAkI66aR7R4pTv8dj/BUZuDzVEoNe9aHry5ecruqDWWu8YGGMPnwf+5GXTJ5IRzJ+Y6zMFTh+I5PCXhsA3t7EHgEb+HifGBtdEQcVW0W2ljPiaym9+NOqmRY3e1L/v2MkcKobNOYr4Xfx46S4Vgfqz5RAwu44UoyKhami30nmwjGIyN+IO4o3cWF+ORyqauJs2ZHQtNgLbM42orxZCApHfWBFgT2Y3JFE3+c0gdLYaKqSeY63tIygW1IAdtzy4BrNZFqaKIvnDzuAiOV9quh5j3UX9sHVPSEYaKoLPnOuwLLUKZDoPUSjndppmL+hxNmJkP47HT+86iehmFwQuSwGx0/f579zWnlVVxx3GZxj9/dzqN32KC3c+h1CzAo5Z7MHL9E3huMdv3BTiys4fHpEt0LTcPqGq1TYvZKtkyuhNrINu/vu0e5NcvCyoReFr3wA0bR+6GpdjOXrVpBtym7KLvOHxzlnYHmKJxq8nwCxsaHcVP8KpVyEyHLFNz7n9YWiaQRfT/9GWvvdyF23Cbe7EMglCmB60Ry++Ggxqrr/A4m+Xqqwfoq719/D1b+SwXaHLTlKTgGVe4pUf+oKbPPKYYlxYVDr9I6ODe3h+JAtuP/+I5YqjoAvuhKwO8oGdAsCqFdwL1nOCqT7lW2c1X+SnaadhqJrbmT2KRkC81VhqbgL1Cb9oEHz9dgVvAvPzFfnW17pHNDVCBvGfaMNdktANVIWxvY/5JSQeqz6vA3q9V/SVvcP/P14LVau/odH+i+y28csOp03CcbnPODcremcH7cJ2112Ut8Wababv5zWPqyHpRPeYtqPK7zlmDy8PVtOyYP3QHD0bJzgIkZXTpdRzaQQiH6WQ/+avHn7kic4SXcSCKf0QGf0Tr4ansv7BQvRy/cxKSk1wMnyNvB/eg+PZEXC7qUzQefPKlz8zhCKf5+AvgPvQep0Fup8bCSx3nt89/QOsB+WQN0TDHsU15C96waQSr5MvwI+4ODlKPi2xQRlbl6li03puMdlNEScUIfAZ+94jco0VOtOJN+DC6BTq5iPXt7L8fsf09ykUJaNWAs2RbIgvPAayFmnU4jTC7IPCYL/TJ0oyGQcjfK5CIH7T7J5dws/VdCFOx99ecZ7A/KelkiKah188fB/MFtKC6Tu3AQL4XRoXJWPz29owo0Ke/Qb2Qa2ewxglIAUxIb30Fz1rxBwUR2miS0ggbGF2KEsDgcq9SEhTBdWO0+DBZ8bqDU7gz1Si/FW2gYQqXPjZas3Qk/pKPiRfZBKcphN7csh6V4m2fbp0WmBJpow+iqemxTIftvS0fGvGpReWcUe1/P52URNrDYrx5owC17zOh6WjI7GwD3h8CRBGxfdloCsRwfgwzRndPQsIfnZV/HN3FmQfz4cH3aM4FzNk3hExIxnDevCnG5jOlBliA1BtXBu+wN8ZLUHBm02sZ3ObxLbcxSyHILgipMkqDh0UfmhD2xk0sJ6hRogfLOJFAMbSFBsCs5+fgrmXohEqTcjwfGWKZ+Yl8ReP5P5WekEHGPzgsZtvEGPipLwYf4LEtHVxn0OCjBix3t6kimE53a68q2qWohPfksH6upwnpIYv9p8CGU+pMGeThPIfzkWhLZ0om3eTjpuOgA1JwvBTcKd97i10zUTb7jQGIMDpoYgWBpJ76+ncKWtJCxyW48Dp7Zi/a/zXHa4nP1WZfPqTWdg9WtdcBttRRuPT8LQyngS+26KEdnHQNUjAtbNjcTuW+V4fvAH6u2ZBCFrO3nVwHLev1wCR9hX8bkjqZgXPIomCAnCz7AaNNidRW7fZ0Ka6Wks+mkAoRrFNHW+HU2fvJ0XWbVw5IpdcECwi8UMMnBg5FRoEJ+Nbn2f+NzTNaw6Nw/85ExJ9Ik+hevMpnE9mTw33YacFhIc2ScEPVDOmmqxtPdmDu58vgFGHn4B39ysQcfjHMq5luAaoZlwolyApdQPgdr1Czy/yxQN1QN4OEKFY2oW4sXAxdB5ZDVZtk2GhpXTIPGiOUcnWKPsT2XephUKKWM60H6ML14MMiA5b2vGb5bwSXwVvtl3C8cb/uNZb3NYZfJtcD67h4MNBPnW8ymouD2XbOK04eq/LXhyagBcHrCl/uZYttn+i76ahsCuI8140LufLr7bQIu8DOHYbkO6LHeYTnue4t17bSkpswHGnn+EU3Luw27JOHjh/JVsv6vBdpsB6swt4wO7vOlF/zBLncuiB66eoHMpEAYr9PCvz06SNB4HUut1ab7nEUw9ZELeErF0GbL52PG/8PmWLQhcVIc6XzXKlR8HBkd+0fTBJOoRu83eYgdh7zcFOP/Xi36/k8Oek/fwvlcytU0kuLDnJRvuXIFXGubRxaNKvCm2i7X8DPB3YABFp4ng37JOEJ6mCusLyvjJYQMu+qFBf/Mu8FyfL2gdWI6+1zu5oVYPVGJ384VvKmD4FOmJVzCf+SaIg2ta0K2iHEYIB2J4gi7aRSyBla7/wbe9ujBykSFLSARR+b2zuNtGkbPTJrJlewx2WnvwSg9baP2hAtu/AEik1LG3ljd3q88kzyg5dDp/FgwM9WhotDv/1pbF2g0+kDsSYfnm3RxsMIyzTqmSnsVBjKzJx1bbaG54HITv/F14fK43v54pBP0zRsDI8Y/4m/FqrEu5Rp/M3CF15D7cGrWIjHzSwa+iGMMajCB+ayzOmxIEas7tvOmjCme+r6WAV3f4+e23uKrJE0ujH9GO+6rwekcZC3j68LLECg5gKzC/mkligpew0eQl/u4g+K9pKpnsmAqljSHQ+jsWk87qotERE5LZ7kmFP7rIaJ4MSch4Qkx5LswvEgC50y1g/j2Ol9a0gmRfLE2xNWblVHG6Mb6Zx3y9Dl29lZy3RBhGV1egmVItdr10QyclXf5uuRbtfOyYerP4rEQirj9xFaJ2jgPPBe9hZWoIKs/ZiCuPHIJ3a3eRSkcjlj18gnnfl5JqQjQcbzKCOSU/0Hr9HzCb9ZWv3twLy20WYt8zbVjSUA5i32fAhT19LCQiAr5vlfiNjiLerOyH7LhunL3MgKb6FOMd99s4vK8GFMeI4MVp8jDLpQHUTfYz5AmT1T9f/hZ9DLfVXaXPpWoc9zOGOj88gmd3DKHPMpTtE4OpemcX1VkcpGjHxyitPA6ORSViyvRS1LDeg5Xb1WF6sTXfbtcijY9RuO6OBEboTaAIyw0c4HqYncrm49qMIGx/PhrujmiCeyqFJGs3TG3jslDx9WF21FxBBs+jyaHbCqQhnj4KGoNv3mGekbaP3d9F8dhzetS9ZA3GuznA7p7XvG6SMdzfUIvrxWTh+yRR7r4wF+YVX6LpdduZmnfBnbnaGCaTwmIS+9j+xC54LKIJYWNcaEzRbBg1/REeGyGKCedK6O2AGJ8wM4F/Mqfgx/x1tDHVCGbqmtGo9+I4ePkd9WpHkG+MP62UtkepKz2YcjcDrnzypUmXDODlQDq/m7+UL4hqw1L9UnBb20vPHFy48YgEBTcHUFGLIUcbIyxSC4edoRPILfYT+tgLQY2MKq/3PwHbw9/CJu6CA0KxuF9aHQZN4uDxmlFYZdoE/W6zOMGgg2QfjWaPKYgJKXe5MngyCMsoQ/1eT+z/9YpgvAVf6veA3qZMXqH8Gb+6OYPRJw98pLAYrqzTgKEvSlixVxq3dTnxvugI/JS1BBOu3cOOF67UMszYuGmAjsZOg6ERvfhd6Bkl6snja6tiyC3vJDcHVSqfI4yP3onDwUXTUFZBHcQ3jaMIz6V0p3cuTdXs49MVt6FnrzKoX/0Do6TXcGDUFv4SYgy1m66gZIAute6bhDfibLDvkh1Ped7GI1zV6PdREU5QsMbV3VNgXtE9yB23kp2zujja7jxmhPlwa3QlXw/7gHKx/TByA6ONvDg8iXGjZJUL2HbED+Ikp/ND6WBceyeTWtQ6KGFNKTYPXqAfJuOg6tNa3Bd3Bo+0C7N/YytptsWAk9Zl3qVnTP/svEDr2W4SnGEOO36JY4LZDdoi+ZrXjZ3CcZ/VqPygNv8IOwzrX4/l0yN+gPY1XTivehT0W2ZRvh3hg4IMvhf4HxtIvadfMbnkuGUpZFb7gd4hefh3cQLkFteRV/NpWmnsi2nBK+hj2BhM0rqOLxyvksGUy+hsLAoiVWUwbZQoSz2Ug3kRW2BSqDwfP9SGpatng56yEqze+wDrOxEMt6lz4dJa1v66Ay56J0Cjzwn6FWMNYa3TYEbLApw69SDXnJWHUI/JnKG+FGKfj+Xd3gfwr+4ZPj/wHmBwC+8tvQSXj5/nZRUa0AzK2KCZDrnzXTD0VCaZNexnmcwt6NS/m/XT5HB20wPc5TkKCj/ewKIRNTzZXAuq1U3pWbMgptRdwz+GbaiijdQtloddATowXqyJZZY9praMOqoWisalVsfgncx8eKp3ko1XXuG0vLfc+UsNRN4nQG3Uf9jtN540LJp5xudXJJiWh2b2QyyfUYg5wcGcZjIZ3G2/k0rwRWh1FKWwPZEktG8kic50YKvqICgY2U2YdBd6BuThbXg1/VHcRsfuRqNH0hzQ8C6hqtAAjNa7BMP/neFbMu1c5y4LJyetxu1ngnBL/BFyipsEt9dU80gtOZR3/EYg8BpzZhSxpzqAc5QBvjqUhNPvGPNWj1BO8S4j5QdpOKXoIN368gXB3xTvKRpCT20Cr1yyk8clK9P55IVUvPcusNxC1s+bQpe+3qSjDWb4/KUJ2J7qxCtacjxzuyafvv8dz+SIsoZzOMo6i0Kmkjl+VZ9CMY/UYAwqsXNxIXekXeBcuwXk4SfI33Us4da7J9wx/BymzftCldv1oa/nB+l8CIcO9QTq01lAise8sPKmNV9rGcB5CZk8wmse3rqsC6oLtDDAyZWeVGaj+vg6mD35AClBLlhYT2Cfcy50XaEG1L1kwE49nHRr3WianSe6er/DN8deweLBFLJ7dQUHzEI4uW003NAAqJ8YQ7f/M+fLD5/T2297+aHQa6x/MQxdUEEpppX4xqcZF0zVhYeRB6hs2wPyfz8VnO5eBFFzU8qech1d1g7D2UI/KFA6htvPqsG7Xlmc9a2UnovdxFNFaszN6lStu5w+X12NMTKKODNuDewbkILJ84fAxHoruArewauLfsAS44sc/mA1j6hdwT9G/Aa/8anQ4TkRahY14b6sszzr41kSEC2CkOfddHsWg5amIEQf/AzWF8bwKosp8FAqCval9rJh/GFW7TzG82JMQc3mH+LJlSzlUEvDRkvIaKESRGyTpkH3Hnbefx32HknFWbJSnL83AzaufAWdShrwau8LPPl6KhhGRkH8pH4aTPxI5y+epAnQgcLLu1gzsRyytZfA1kmN0GxkDm3HIrFxIIBCnE1YfcY91LzoAYrnNbGjypmzRszCl2b9sHyzEsztzqXxyVcg32ot/H7dRD4xkXjHrwjuduTie2UTnJE2yE/UpSEyKxPrlcZw89dpsGGhJRyCWJy7pBZ2jSHyV5yJ+EcZfwROhlaVGD7fvp8UBlTBVjECJ6oQmg3/39IQ0rQdTlsXYulKIZj6cAy8XPoUGiUY2rQ2U+I5d542uQ7GfA7Hgff3eN+4bNwA0kCzz2C4qiAwLoIPC1+gf1gMnJN6xXKykjw0chPzwVu4sRygdYIWhW1158bDi/GD+n/0/PBU9jdQoe8yT/H0fiveVSOH2Zl6MK3uPEk8WYZmVSNJ+M1mdrgEPO/cRSSr43RfyZ1FtUT4xG4xEMp0grYAZU6ZmERTfGyoMeE/iOrdCZnvwrB110cKEasAvWETOAu2OEasi4JOelLEeDlaem8jiMUu4MObpcH0jDJevezDE9EQQncvhtjTVznusyebHLqGkU2epGQZySvuLKdv855zoaEbfvijCj3GW8jwYgb8Fo5kqSJj/BHgQbGbf1PaUnV2bY+BGSEvOGSZJBxzlkGlrG7UfmDDHjM08UW8CVT0f+HLHsOcH4eANl6orTsazq7ZgfX6Z7nxZRE/P7EbVFvvYu43N1r85BxTzQDK73DlHFEDULGs5hUacVgeX8Uend9gk6Imty2Zy7M/OfKmvUo499x/PFZeAOKi7MFu+kKsrvWh4keP0XhHCfeFe+DryHrsqt1ES9Qk+OU1cbBXnYqSW4/w5WsLqX7+eGpfqgtWsYtQqUoYJjaqc2fgEDcWqcDrzS/5XqQ3qyXfozqvYr6ntAuTOt/Tbtm14Bp3E6cmjOc1n82hxfwnlb23gJdpJ1A5uwPt1xiRpfshvrPaE67pynKAVhY+GTsNLqV6kXC0BUuKzaWS4tWUXPyOp4eeZvfw+2iWWc2CbnJ83NYUIq1HsUG7Ka/10oKZ99aynPkQhDs1w9aaAPb58wd8WA0ttUTh8MdmfvnOm3elS6Bq6SL029iPxyuuw+plq/ju1zJOPrKXE46qga7KXdo9L4qf3VcC2e6NWHDZBq0aZpKmjQsr7vKEoPdS+DtGHIK2fuRpa4L4XGc8NXmeg+rUiTSmUQv9PT+hZMcO2qybj02xArD6oxKN/aiHEmO8+WPhBt5tVM7d+gnknPQM8j84c43NCBzznzTIT11Lj8MN6ZdkJmZ+nEohppPRAo+yrGo12A88pcLgElQ204HIZytI+o4k3nOL4IjiSVztwnxdaCSGlbzCd136tL+7lp88NgU7b338RS6YX5EP9w7vxrVBXuQn7sUyXgP835E0UkuQJcrWg/PxMzm48S4Mzz/LqdkLaJzhNRaNGSYwu0x3Xfph3cIpqJ0gC7rJD6GgYSU8+i8Zitau4zXFd7FlTyJbr3zPf9ys0adTFByNTeCS61/sbXzCkUbHcbvjdSxIt+McuVnc2OzMxaY1gA2/qENZGjrCt9L+xyJwWj2UXSUt6UmGIQoOOMHZQ8XYHP2A363thSOVpvA9TpGNn57FF5OzQSc1GZ/HihM6jqbliiOgXsOfE2b70ET50TDixjK0TAmn1qyTaJdmgKvSe7hm2Vs81C5AThF+OFr9GT1tkIFPrMJiNAQK2ZZY7bQUywO+8qmNK7C48Df3nY6mv9s7yKtLAVA8hCdITMV/txoxNQTgXlIxabkt4XvZu/Cy2nbuWJQGGzrNwOtUGKxz88bH/vNY/+8Jfnj7BBS2y4GtXDPvd3xLF7du5vMwGtYdLcSPSZ8447kw9G5OIadRkrwtRZT/kz4IixQbqTrFAio2ysCsv6P4j8UMfpZpSn/uXKNqt2+kZzMP31s84XMP/lKsnC2O22wIBQE70GXqLs5FeXp3fjSE25jy+GeueH7wCo03ksY3J3tAtE0MImxLuPDcP0jIfYlyHlHkGiJFQn8VYHuXJQ66ueKKmrHwdq84mFduR+s7FbQh/xQ2XR1iq9o9sHz2digqeYbDoUm0cGsTz+1gWC1mhLfT3TiySpva/92kHe71uNXtD6w08ceVX95BYMZF0DMbDR9CfsPcL2PY9LAmvK4ewtwxwihi8pm3V0XAh3PhoOo2CNuWzYD84Cx6r1+OT184Ylj3LsrXysaFG0Ix/6sizL74lGRnP8CTnxGUJOrh5vi7bNJzD82LFkC97BteHPSRvyXKYNCpVOAflyD/owY4XpoNgyufkkLqZrqzTh59DAtp9tEfIDEwCS2VXrGIjwt1mYnDwws7cWxLPA79eEV/u9LI16SW/lOeCS075cC8YwL6SXykxNOCIGZ7gOhGFlXPOQ5qmTP4mUsqftmgQUaCxnTE/jz+1BymRT3SoHJgL61N2kfFc/VpzOBMzt1kxTN85KHZdRNZLM7geWEO1LFWAVwPPOQT9v0Yu/gE/osdRIXv/SxqfYJbsh7xG/UN7PPamxIvWcLeE7dBXUWCH/f9Y/fSYpoWbIEdQiN5QtQ7MvKfRMHTz5P8YkmgwNnw6eBhyFtB/PtFHk09KscaLw9Cb+YPWKvSw+6Vc0ArSBeCjSRpn/E11ArM4zO+k8mpLpPkjqhimbIZ2ZlGQXC3KW5IkgO7j7WQe9WLBNpaKGxoOVo2HoWkMW/ZpFeb5/vGYpGQFw1KTACtXqRTfrFYPqUSFlXWYnOLP+6yKabukcbc2V/On5P2Qu4OBfjx6RvcHZ5KD0Ii8eWuK6j16gd3Gbdj8xgTDNjyC8/ts4A/X5RB9tRBfDDFjX/fluaE7x7wz3sVxkanwamRk8lvQxt/lxUB60X6oOA+Et0ELnOcszXZya8A+yeXQPKmA85csRklvq/DG1lL+HaFGMzYvoTSf+0g7VsWoFl6BuTWBIL9wzlopL0P98ScZ8GdV+lfnQCIH38JWaMu4a/vCvA+wpREOsxgeJwvFxUY87LRSfgmzgpvqKrApRJPOJupB96N3eRcWI6C7ffwsFUE3q+sZuX7G/DxJT0sEheCu5HhcPbLFtRZlYRS4evIs8ifN1UDyfnvpF3nBmi6nifyenm4uSoCF38Xw4bpf1nhlDvu93DAbXiPDvp44gwtHxghNAHs+iVAqv0D+YU1UG2eA5a2BPDpM1o07ecv/KathVnWx+lmpREqCYmCvYw+yoaeowdPMzjQTQg9vC5jZ8MP9gntRK0n09hFX4NskiaCgDHTo4IYLjmlg3oPd8K16RqYLxdPudmPiaW1sfjTXj6jqw7j1vxjo+ImTI94QbDAC/5NlQSD5uukMxyPGz91cPJcc74GliDSdwCmm33GF65GfFYwHYqlnXjyxiFWm/8VZWZmoELcXtYslQQBuQweK6CHmmrlLObkTpOeTeTxhW74cNMddN68kkU+u+O8+1Ngo/Jinlpgwc0KV2lvryQs+TuBr0mvwCZ9KfohUooCljt5T7Q6LFJexVPbPKBrxnI2l58BJnrfwCXuMGXMl0KfwRQIqjImyw0WYNyRi9WhEyEtMAzKG+1QOHUu3MreDPOHNDFqvTa8Tc9l+eXisGRqNCb63MYfaw/yxOUH+cTxrZzmZoPDsAYFjrfipL+q1L7YABZpraa8QTFKXazBKWteckdvOGbu86CJ8e60ZGIQeObuwchlliD7WZjrVi+Gard+NvHbAWPsqnDc5/vUMtoVB9Sl6c3y+7ggfgJYj8rA/aTL80NUuT3PAnL/E2QdyyF+qegAA/aClDZPhpX2CsLMijAepbkTK157wxHF0RCT9ojMXjZQl/leDvn0kU5CJu5wEIJk4Yu0rDwPGhafxt1zGuhkSCJf7mhHhQP+xHOc+L2aKP9ZPxGit+0h8Q1f+FGaGI362sXyNdOwc+l63DhyETX+TYR+yRWwbZIuJGX0covVEtAvOsXnVuyA1WYOEHlTGgNXBVLdMVnukunFYFkDOPjnJH8MCqdz1z/R2M1l1FzxgYeD1vO1FHVes+My5camorydAnyev4d2LguhF1dWUrTrMri96y0E/j2Ce02DYERAHes3bIQXVwkCtG2xUCiR5ROsWLW1m+OmtqI0FpLU0CWc0NwOsfgeRdebwMj0Txj1+DfNvHkJY5VLULAtiDzzBMg3uw2dDibhPzMHUBAWgPyFqtQwN52Tev1ZXPk/cLpWRNfdfsEhhx7oe7kfLi9y4Zu6M8GgL4NF/inBIk0dTHAdokRZAz4/PYi+lk+CbxmzuO9INJ2PHw13iv/CatHl4LL6F82VjuHhcVlslCxLBm/Xs19nHE6SCqeyVRKgELKce4WM6PywPsgImOOQQQ9dmFFOY1Gf3p7Jw2ZXK37WKQaPjSfDTOUrqBWaSQe2trDJsRA++Owka1XX0/DqVzju51ga8jKGOxIXYcbWIrAyjcT4qxZgVnaWHN/so0HhZ2yYXYzCLmq4u38SmOUswsLj1nhQdCzdbt8Dh+Oa+MPlt9y4vJe9/cw4Q3U1jHQzBacD3mw8ZjWrlTiTk0QO5hSUcOaqE1gy0xPkDt7i1IoK7v6gCcNtpzmlWhazJlzDfau2gVqhO3ezH14fP4YWrfCirzk/ceUjQ2gudCXnj0Z8X3gBanf/xcUB9+Hp7lmgEq6GOlkfYUBiKy1frQb73m+j9sg0QKVLZLlrIV9/sZTrhvbjtdH9tExJCC+GveFZ+kIwNuwrDOQP8V9/PdDW9wVXpxU0felyLrFdCoeMBHjhrtl4TlwNfoy6gwvSlsONiElcNnomTC+7hnaCDjBX9QJr3xmFE5Kfk9vICXBAaifrnxXAHXsroWCtGvrZOZD9/iR2Tncm5wNWGJBnQ4mpKiD8ALFRfgk7+x3BKakNMDPQDxx63sDVHVZQLnULb/FXnPFDEDw6PVH38z4arlXn7psGaLnZi8KPBeKh0+3o8kcSZXkWf6qZCVYrf1HEyhLGq858ff0Odn9WhWclFEh1kj75/G2DjX4iMLtMB8w7vFF5sJvfuerzE7uDEHZ3CZ5IKaAiqz8U/zaE4sKEIMx4MmQfloP7ijo4KyQSjvZ/RM2IDfDjkgVN1vOG09M3kejJh7RdWxRkDCQ5bbiBQ3ZEQOaqh6ioOYgrSnNY/ZEeD7eEoy+spy8fR8JW31xcdaUC9AwE4cuVvxT6O52dHbw4L/Udj08cgSbCR+mCojzIP35KkpHVbPfMipJLTCHz70yqtU3DeOME/hjwj9NHFtHeT/Igtk6KSXwO3n1lgZ+0/8K/jAm0RU+TvsXL8nVRE5q4/gScS5wIf2XLYb1LEIocXsmxY2dy6x0fckzO4coNCagibQVBbytI9osWLLNMxYMhonBsTi8qHM/kj5Y5WKIrAsUPr3CYy1e8+PoXqS2dBi3idpxn4UI5eiWoFzodtd30yKNhD61UO8DfpkWjw5Qc9FHWh0uKZtR38SQslOyBwpIutOQOqPN4DrHNxWhRNohvNRpxTagx2N79gINqH+C3kjHuDGkFXS1LLpOfAvryR8HcYwZHZC5nudszoctuFGWqtPA81xK+4KbN+mfM2PG/LRBYdYwWaV7DkOcPuPy0IazdsIRGnj1Mk3glgvMacjYYoL1PgnCg4xd5xvrR2ytlKB0/Az5Vz0LhnKfkeXQF1f0YBd+68nntpW6Qufkfl0k9wG/v75BW81iwlUiBkg2yWKbRQKaV3+HhaUEMiX0LEc/acemMfeDxXh9KM8XgjqMO2IpUwQGjHayT5YYeSss4ef4t+iTQj+bGE+lR2i4ckWUKVW7moOWhwZk/L9GrqW/hlL0gpcx7REUrD2FL7hdIfOLDdpf14J9hICjPb4Y0HA/SBlnkf/cvNbb24KuVi+C1viF82z8Gm/TVYaqaJ0SNP4La2ip04HUmX1uTjzf+7sS9i/y4wSgUF148xprKpjBhmTG8ERKk6gFNWhI8ibdmnaU7Entox5uvdKRoNScXLMGr7gDVY2Pox9bT6FC/mAuyCuhdgje7rNDAW5OFuNRVkWviDdlKwALWCsXzqhGHyOVoKYT7ASyzCiHHp8fpbncfaeb60skkgIWNwrA24zC8iNKHz8a7YP7YqfQ99AEfDBrDlx01uPzQMnCSt+bUUBGY2fyeoucO8Y05k3GGwEQqqtvJlqBBs9YXkp5vMCenKLLmf4pgX+XJjZtucfuOWZR4OpOzW41Q90ou5GIe9QR3srOjAzbbKkD+lw/8SbGANSt3UMkmZ14g003CI3TY024z5D3V5cVFzjx9vADMdh+gcznmsOuXKexIQBBQXU6+tok4ZfFbWGf0D+ZPG4Q0LTFI38Is8mk0Tw+dwnsWBsDDI2NZ7uh1epB6FfRJgaSqEZPKRsHHOl0+9DYH6i2kQODTUW5XrucXKpkQs+g8L1+vjHOSd8OoQBX4cM+fC4YicbrDKiw9lARv5/iRoIQ7u5crUc2jRlgS30iFSWaQ8agIyw568ZDRaOrpXw7pFVZQW+BKqjrm9MNfCMPuv8VVrsZwRcKTH3km47DSNxqcswIbdbrYVrgKnZZ18snIezC4wIBse6ThmmkzbiJjftHhjFLBp7BnzVZcbXeVxx0JhS4bc/5suht+LpwIC3IvkOaaUZQR8h+ebv6BYRq+rDWhnNVl26lRYwXFz3vAXhOnQW1EDmeFjaNbuQX8X/hBTrf5ifN8U6lm2XRUs1jMO759pY1BAnD+QiPZ+W/l0CwdDFK8AE9/LYf19fXgslCdDBRSoSI0mGR4Krw9JwNHHKz4dpA8KgR/Zq8Hj3mLfhsU1ffAcMoIoJvdcHqNDmyVMqMFFopc42fN4dE5fKjqMWxKycaT6k1UlanH69or6Foww9k1syF1aCQV/xSl7b1q6LfLF2aW2PJrATPuejaanNUaoShUGgpG9ELYHGvYbyIHjvuWkmReDLr9XQqbhTaixBszyP++kH/Fa0I8EdPiMB6Wj6PzEzbCgifumFS5BdYLrYMvTyIR0o/zqTQLiHsYArsy/THx+URMjzeCUSYZFJBfxYX7ZuGUMXcJr51GY1F1uPt+FnREZrL1hFasufsZRiWWgUuCNkw31sHZbh9okeV+XtZlApuUK3i7pQ8IfbmNhu9u4KX3gfz6mgak3hbmirGTYdLVXii4rgnjG59gRP4f/pnpxHB7JkwcOYySFauxR18YQ/3DeHOFCD8KkIXVdq/wm64dFKbspntqx9g7R5i2TF/DtwdOwlQ9RRw/cxZ4+1nCFecIltD9CjGJf3Hzo/E40iIeLK8DWFi6U3CUHR2T+IYhAQKgt9oJU0Z18pirSTTL8TelRq2C9vvyuL9vHihJZlOXxHu0stGDwA23IdtDgv9pRqNw6Uzo/nyDVk8059ndFdxX18omR4N5/jxhWHbmMhouOsHnd32mLdsBLJx92L9/KwzJTWPl7k3wRkgGktomQl/0LX63sgeET9rTGY0qOjZ3LU+y8WP/7Y6kLyBED7uXQcPeUWC12RLLtlXDnx/1tOtKO5rX1KNrSw5xdCWvfRxC7vX1NDtGFaLXF9NwYz4k1dVg3wIZ0k1Xg6Txz/FGrzs2JNzH/bGNtOT5OKgeOMoNsirsknSKIdSKP58JJmehJSQ58xd/vhBEKJDOLSU60NqWyp279nL39qlcHKBNltIycPazCFRUZUFwZi7Oyg2CBRt0IcSyhPwUkvlI+SPeemkQpMLm4Z+LCyCp3Z3+JBRg5K6P2HReHFxXqbKQwzOwu/oN3f4GwrLSK5wu084rd+TQfH9ZiAtJhDn5FhD1YTOP3X6bu75cRP9md/oxbhM5RO4nJ/8RLN1/g8KEA3jZqJHgdDwezrnch7Huu9DFXpAr5N/QQ6Uu9CqYi4LmTrTlVAWlS+rD1FcT4MZLHxghfIk05WJozQwRSo2eyGqLnkPtsD7qSxpTmRNA+coeOK9+jG0HslFAYSbW3D/Om/w1YFS9FS2Ws4QBYYA/HirgXVOCl/7k8ZucAfjnsZObpTZhsGA8+Gc7gaPOA751yQHWaAiAhW8DGu1ezYcXPoSKQSfQP+SIbuLHqcJxNVid2griGg38LXokbFwsTksi63mjWRkqPJNmB80qfBb9AuQXl1PovlJOC03HfcvGg+Ada048Xom0Mp0u6JRjkIUHlw1IwpmLPuieKE4rAqdhqIcFBKj1sm+LE7yuec6mx5LRaHEQWusl89TH5fzA7wmsFExh4Z8jYfCSGN9RiuKfjXMoI0MSZeZcoA7lG+R7OIqP+pnTJq9w7vWRBZnb+1guQwH8fKXwko0j1CqMgiKdP2RbIwAPdp+AC7uqoEldH9xHqtKY5+6o8vsIfRntCJKymnzefBQ6yKryUb8JfOZhML1vNALyf8CX7Sbh5b5sWjJ2GJZb/oRx5ivwxXltflSwlxr+iRKoKEJ9ZzAmtwRTqe4V6Ek+AB5a9pyzKZfyWuSwvmIeL2gfwilnpWDB9tk83XIuVlWMh607JpO/UCv7GNfgUrFsvHwwGt93p5H01JlwMugPVeopU82fD4jD1fhjpz2VviCWvz2P/bbUsCPvYpGbCrBFZzLZVbeyzbIjLKz1CEInzoPfr2bx17Z6vvn8Ii3Il4HDgyKgZHydruiG4P1jdeyhOBa+ZKTCZ/nLPPFuC+ZFVuKjb3ncMHs6tJ5oxC/l6lC6fxmJG2SjqOoT3mq/Gq4uPE+mgZmkV3+cJ0TIQEdoFtZPm4NuAhPxS2oMNhXe5zfrkSf5FmGJ9Sj+MUkWdxwhWP9+LBcva+TNc4PhwRUVuLlPm1Vmf0GHjFj2HZTEJaKDmKE0ARSF18NTFz8YeeYevbgQhZbbZPlKXhyGp1/ki96GBMsvc5c/gb5FDq/pXMYnyImcLMupa1sZSPpuRbcnJlAtnQ6kUYrWP0bCbOUtkDa/kWLk81j9WRSbN/vzt2Jprpwcwt9mpvLDdU6ofBZBc3AVjTUQhIXnXWF5cj46vtOmNTsGsGrwCydYv8WHQu8oyHgMWHnf5Oo3B7lUzBG0hppwtFkJDsedoYy/4lD96Ae2HxBlTRN5MHiXxtmNgM4/e+jxjTaIOV0Ci3cL4+LgV7jhbRMq2abx+HsAFYs7If6aDKl3SXH95mi6W/uBxmy2wI2B0SghJwmOp05zscp0KLzfxLp781nXX5cFJMNxq+Z+XJ2WiBP7UuCzRhvKX+3DRTm68DOpjc7sfcsR0fr4vNANlhSc4MT++VCRbM7fjpTijClxsHWmEbROGWBvz2Ee1EW84JBKdgWjaey6FfjzZBQXu00mu5wiTHxhBJ2fP8IaxblcMCoS3j4TodzsOXDQcBu9F0sge5mTGL7KhR+Wy8L42KsY8ygAb+/RoskkzydHSJCqjy9XB27jyKeZvHOKLjZbqELLIjF+9S6fQl+k8NHgfA48do/zNifzk6uu+H3wMG33VUGLy1Ph8tEb+E5WjO9NfMKlVcXkuXwGfvhtT59brOFkUAbqwE5wlreEB5YhbDSUQev6A+nrxG0wbbIgh5w25I2KnvRg4V68ETmVlnYqwGUZDfzuaAyLspfzI4F4flIkCEGjj4L2niVs05IK1c/fQauWIYimhbBvRCg26s/EE2G/4XBRHI3QXwuxuVn0TrQVSlwe4OFNI8D6Txv1J1jCnHOHYFTvM7R3PAJnPyuSwH5lfmpkA9cVR8DXv5bQnjUPjPfnY+uODzzyjwjO8TCj+9MfYKJBNCWNu43J8u9op4oO+PwL5+DbUqD6MhNrzhbiZbXZ2D2ynlami1Jix3taEmIKzUkycGCpHoT/NGWLwy95RM5uNnSr5J2WP/EC7+J1g4uh9qQjNU8yBZn9bvyhch5F5r/kjUI3Yc6wPGbJbsUDuqZgMPohdAz9pLIzKlA9YRc93GhJZodsQLPZnGeeWkFCS5Iot3MCNe6eixYbUtCjYAaIDPXyCEFfqqK3bCpwBbK6R9O6C7KwLkeXbAwn8zaJaEzy1oIx/pbQEnsL/9I6gvOb0cVDBe+Eu2LAi+vodasVtHrEyU9pGvgqdqO4ex1deV8Gevck+NiUtehToowl6gXsdGMvrmubTQW2WtA5+Rbnm10gu62dpG+1hxXOvgX19AYId9Lg3Zs7SUtrFuQ5GcLSDWtgdnox78ly4OubhnjjSEFqyL0PC54sx/PXL6ECPyfJLxpgF2KEHvHfofagAa1ZlkFHtS/T87gmeJP9GhPNd3ODZi7oNBAkzHLAyXUdPDyzmNv0v3D3zkacK+xHTVDAQUZaJLn2Ez2YLwEb9yhyW4oFrlB9j2oLP4Nt8Gt6HmWD3j63qW9dPrVOCUGfNh1oDfrEOePGw4nyFF4u2AFHN/RTwTFhLriTRrPse2CTqyO8FJABFdVJqDUpjn+OXsqyT9Rw4MoM6HsyGR6XW7DW2AScNPsiVU+eBgsyRvOG5d9BPO0e6FWvBpvdvuSALehyaRos/hUOro2q0LDJBDyrYqF8jTG11QRTxQ199kuw4j7rVJjf48Npl3OoadYZXr9hEkzzM8ENQW1caBMJo52nc82Dsyzu7sJeXvWkWPyX3yXPo6ALk6Hz01nYrKiMLWPG0XP7AfwQ8wtKqzMhqtqIXq97SXm9ZnzmE0FM4FV+PqIZO9vvoEbvH755tZifK50lC4FQnJu8mba+ssMkHy3QjgmAfWWHUEDfArvyK3nEuYl02X4MDQv5otzJVlzwR5iD/GeA58lUlPqdRysdL6FihQ3vDMrCsCJN3OznCzd826l2rRF0TTeELbpRdFjRijLjBpi7l7B6/jrwb3Hgl7F2XBr2jKJ0L3DAFwnwWJ5C9Woi+PU+wMcqCR5TZ0aznDrRlYTI4/pcrvNy4H3XVSE2LwS8NDTQue0i3Zs1jTem5cJ+f3+Yr52OqWsdecN6C9zUIgYJ2vf4V4ITVYpeJ60N6piu1IwYUUP1u8ohyn0ZyC19SGIy5lCy4gI4/heEuR0ObOwTQYftCM/ur4S87of88+czKvCdTrH5oiBZ9wE9C2zYWCKbv2RVwA/9XnrU7YvL17/jDPGzaJ8whkRkRoHael+aeHwXuOTkscrcw1DIupBz5Abt3hoKUfMKuWXpQTp1ZDy8ezYeVUXeg8m7dTztli3nhAVBxo80rL86TNHbv7Hkhzv45ZopjGtpxtN1m3Bk+1zwSPLlAwJjoNo7AM+kHuLnY63A4XQtDJdKg/s6M4zymMf9Wl24eIw2Ythx8FVKx6H/UvmE8SbWc4ki8ZZxsOTbLpAet47VXpVBe+Jy9km/AH0HZrDxbG9UWWcD4hanMGObCTwY9winVDLNFq8lJaMa1sLboBGjhXud9PlG+QUUChGHc+kykBSyFv4E7+BiC0Es3+YJe1M3kV5xNPpv9oRNn1aStO9lPPNjKjR0eMGVr0VEy0X57fuFOFfjPSTqGIH9RAM8oWHIKb17OemeEHidEoET1zT4zyxFts8TBJ+k8Www34tOjqnDoj8nMdMgCpJ36oH0VC8+ul4Jr8W9xtixr1DB7QyPlf7Lq55/h+l6v3lpwnGc76YCigXJ7NX0ga4pXUCTd57w/YUv3fz9GyVCNLlnrhYfHbuQ6m6NA+87P6FgliMs2HQXq362UUZJDE+3r+ORr6OhD77CraCDdKxaAQYko1Bly1xMKiriX/9lo8aLU2goUwYzfIPxl1AAlg3nQuU5LXD6VghDGpvh77rJ8Nl1D2zceImTTl0FVwFx/mMTB3UXdtCtzxJwo9cMM6JL2V3mK9FJH/7teps9fvXT64E9aG9vRvx6FLfeE4WlPaX4YY8E5l27T5FXiqE9s5K3ThGFubqrac6dRlSbc5bmtklCLgvBuIBLZDzrKPrbzKLiLxnce7OEwwck6ejXLXz5xk4YY2YKoz4J4taG71SQksDvIvTYZHgWrvp5jd7OF+OW70L87MI2FLOSB5HQBtasncrK0rmQ+dOWFVuKYLBzETzYMR+2+mbRhDRFXljO4PnkAPcGutL8q+HYdE2Qd29JoHmKQdCqdIhlb09g8zO/QOLOCHD++If/HNSCuOM76HH2UUjEAXh1qBRu1a0AM87BP67bsVHXFKg3gjY4CcOXrFI+37kNarO34s794iDpKYkXl2wkx5Pl4FZlDq8krcFltgw+Kn+Ad5cvYLsrThD3Uh8WG7xkW+u78JvXQPv3afBDSYYF+4/Ttjn1qCl1C3YWbaV9lipcuMwVFGI28eKdI6DFWRLeJgujhdMROqj9mFUE58PgP09eX5OCWYbVMFJHDaQzvsGaPHEQ67HFQNtJlF2dD4YKq2DGaEm+ZqgIdYfOgKLCC/gybghvdxnAw1M9cE73ASgn3KGctLEsveIPbMnMx5IHE+Hz1H3oeHYaf0yaDPVpsbhDSRXeiJ6hXeNDoR4+wdDDf0xBVdA41Inu6VH4LkcA3n6YjDrhb+DBhyYsejCfdcap8wLZD9SWXkgR5ol8ZSfy/WwJEA0/SgUR7piLR/CsdR7tnPiCFKYooJXmJv498xi9v/iR3mTIwL0BDdaLfg3WJR0QJWjIGerDJPtFk6MXiWHABBUWG6oiy0VCcBwmU5y5JT2Y3QSOn9fhRVV7WhwcBF+sHkGw+AO46ijIfQmWoNyaiG9vj4bqgF+oC5UUcu0JjZhUgZecl0Hfs5/wfqkurkmSgoaf4+jRqg8UNv0+NV7sI/3vVrii7AmFnPuLb+wUsFk8jzufm4F/jQ3UpAez88wZlHlNBt6FZsKCyep4ecYN9JQfQVP119CSPQrws16G1g42cZWOE49y/sKW/kEQLv2aojcWY7DlBRzfNZU120fDoemL8fV8Tdj+QBPF7s/gyAO/gSbWokdNPo+R/MTPfh1AvjMeNEPraNzVEKxK94fzzXF48M0/qtFVxDOymtTy8xTvTm5mFXMAkYlpkJg2g06HTeer18ehrJovhtZZgOfvnTy98gvte1oFRlMM4MKotxxCNfxrYBV88BhLfzqqcayGAxoeccbHCSr4GfeD1lVpcJ1Xz4OlwmwWaMf9k7dQZfJmnhHcglPKyrjsWi7dCszkbY/VoXTPcegUr2Jb0SQqGheL55XyYE6zNkRaHAD1TGOsihsN4lOUITOkHiW/VGGxyDpQsajHEB8/PuwVQ2pdj+HR5D64PSMGNDxUQPLNNDzZdxprZ/xl5+8vuGW0CD9vNWKXKwvhrbEjzxxMAhvh8aAqugUX9ahBmv9yTDkzlb6/uUlfq5NQZUY2d3dvxl0mJjS2UBo2Ktdixpw3tLFPi3cWx7Pv+yywupjCo6asAxuZh5h72BQVW8dAdXow3JEuo6+jA3h84X3eMK4BnE1v09x5PtAZmYFG2a/ZXmo83PT/wxci/rGPww++7LgfRmhsYBE5A2SRQcwu6aP1A2chazGCxL0sVpl7FUf2L8Q5tbMgzGwRjDG+iTpS/dS9Lp6tm805Ml8VeuL2kp55LwlOYDocoMkblz2lCvkDNGlhJKufPYp7d27BaXL6YN2sxJ0pd3C6fRyOvmTBC2sOQX8coukZd4i3mUsqCaEQW4kwJW0JXAwp41DZ63BsYzGNPeKDutcqyGXEFrgh84RyRYvAZYMoxBfMpdJbnVweEgY36S7lxPxjxxhjGisYimoxNQQn41j2uSRcP7kXDeoCYdRDFZhiX4RV6sKUdWo0jyj7xZOibuKL22M5ql0OzJ5ehtlFSVQnwCjhtoCVH3pz4PTlZFqUAK8Cv9Od/nkcW2IKEsfCQbmzn85ohfAjj2c4lN4KbW2bQFvPGHormrnXQh7u+cuCad97Cj7oSF+3jaB/VQ08vvogv4Y4arSw46DXuZwxegsFmcnAwt9f6IjvYZqdps5VRmtg//xn0D+8g42vP2KZNU/Y8vsxmp6kD8UvbXj71mLyrHuLqLYfEsZE4pw4NZz9bQ5VnephdQt5nJGgDm6CJaBwwh6SBGrZol0BEl0vwSmL3bzErZKG0ozwlU8JuhWMhvvenXy3yBZm/9vCPyZ3YMyQGh92voAbLbJATqmcXt3bTUqJstBrXUgWfS2sc+0Jr5dZyS8+trKPtDQbTimBc2fUeXeZEHp+l4C7aksY67VhobYNHDyrTmtDPUFqngApxRtAfKAtdYv/ZKUcKcgR3IhJw03wfHIKvtlQANcE2+BTkyYrXJ1AQ/vS8LaYMFca64D3uK8sJ0qssd0K7ExWguvuYqgNj8ARBx3gywpDipnpA+L7tSFET4TSNJVBy/sTQ2oqSN2KoefB8vSoQhyLurOoQC+MVQXE4UR7NLyxuIZZm59TxB0lHhWZzNpDq6nMMxGN5p+F0d5ryVnXHCKOS8OiMdGkt8oYDrT5wx6lSbyoaAPX0GTe/3AnzK3p5R9ahjC/JwAOrRnLC6Y8IxuJJzgp6iGYtwZDR4gFuhgqw/+Iuw+FEBQ1AMD/aNHW1o6GtrbKHiVJRqIhM4QKqYSSohSlQXa2EknRQqSojOioNKiMpEhlhAb3Me6TfKsPjKGBv3YgViMFl55NAz9JbUpP+g/fLegh68f11LHjMk96qgHdLv+Rzi01CBhWheCfvSxQco79JKVA9v4WnCTahU95HyT2vIfLYxJQL3Yk/Nr0i1Tfr8KIRwF8M3wsTok05tnxpjTLr4y9N96CYdc4ltswAi6FhIJOjQMWpCfwWoW9vMSijFs7tpDlhkY6olHAi76H0XYaAepzrmLq95s4XUUF5SXXo83aYVbX6qbyr8cxXNaKc48Pk7mvETx6bYdtMz2g8eNG9HMo4OQF7Xwi+h7I2fVz6tHz1NMsQGH26pB9cxF/yR1PMsNzCRfawqbrgaw3dSRdG58J3Rfe4LeCYCi9bwtOYnYooZbD2kK5UJH5AWuGboCf9hQyNBlkN+dF+D4lhtwiCF4tUaPlatH4evlBiPoNpBv0gx/2iUNQcy0/Vf2KaqsY92wTgiNvPFG4/x7nBNyh6euIz8nrcH/sSQr69BPmGMyEu1vd+YuKBigKJmKzVCO+dG1kq3MqIOWZwV9y5Rl8dGDVQg1u1kqh6Ag5MPK9DOOWNcEkZVVu+/gb3O3WocqJrbS4qx6Ua/JxTrwm3HHUhRLDGaxw4DftvxYDC/dNI/H02fD6yjYS/z6RX4XcoEfzf5L6KiE4aHwQzX4MQmD6NkgJPAexKgHw/cleCt5xCp4uvsSBWIj5j5XhYY03ep97i7tDx7JA0jio2tuIWoXbEG4fxk85b+HDNeSLYsYQue0CbabZ5J05ibVO2YK8sS4qavXTpvMT2TfuPJpM3UzDbpOh1isRRARTKUluDSluqkcN/98UofceImQb2L/9H8zxvI6dn4XB0uQSlQfeBKcRY2HNNFMSOXUcNdY4c46BCI+SFaZ3pyeD7aAF3PleSNqILDGpEjUu1SMO69Hp0MdcOe8K/bmzEy3HLIWM+xNhkvo+LJHP45vyx6CpeS9e+FpJrUprISs3HlzkxPjcv488z00cNt4torlRXZS47RRF9tmjqM4ASq2rp89p87jXWxa+NZhB/ipzqBVKBKNj6vAsVYcNalQ4aqUw8f5NlB8rh8cst/Ov+1dhk7EiSMxKwrjvW9Dvfjo+HFpCTsanue34ForpsUetzq1Y/qGGNXusQDdwFk/T/EnTK7I4ovQtbvEXYSf12eA/r4r2iSlTS001qu4Wg27hV+z6EJjntdDOUmuwTxIhb4VKPrj7BH+VOEPFK3/gSksVUI+aBsN27jSc30RPn+yk1hmuPPF7EXz/PJrTPkWgWqkVnqwHOP1SidWXmWNssTvHPdfAK4OLIHfeT95l6kSlZ9aCX5Yw3thnDvUfrnNL+QoclHuOZYsfYVuECrid3IAxhatohelVvCQTgoZ3R0JyhSKXuk/mMb0Tabr/cxg/Mxzj87t58FwT5b+6ScKdqnBo2SjY63qK6zL0IH7VPz7wewA00sbBH8XfuF5hAJQy2qnpRzbVOYtA89P74H8qBdMpiyaf7cf7/z3BTa/3w26vIE6/VgAdnh4ggJIQvUydhfg4rDk9A/cNjqSoI9fwheozGrvhG9+0iaVbwjIcn6UPSd+WkF5wFC2eMocnlHXDw61pLOS5lRzTvOnxd8aXCQOs9c0e6hfb8CyxVn6/0Qw3RoTg5c03SH+TPt0WQoru0KehrgHaf2M0hDvokqnhVFY03EbNQmfg8q1/WFW+hNbPr2ZhZV+o6WrHFd2CoD/GjPrf/UQjfxUYf+oA3NozhUNf6NKhBH1e27MRGiuAtYpFoCaSMUjACb2DckiquIm+bvRD8fhePh+QzL2uC/HyzA2gcEwEUFGNVt7KAYPas9QwNYxmbpuOvTvHQPccEU5U66ffMUcYEm3B3OYz5ca9guXvh0lefzVq5r1nmeN6sNPagq+aHYMs2RyCu2PhyHqmks4dfGVAlcLeqYPJPkvwzEY8rH6Dd78doAMNYfz6iD5oHx2k68mfec2kAxhoLE5xhTo8ccsKDNXWpizRRrxhdZNKZ40DrdwNXKjPfLfJBvvzZ4PL7ju0Qn47f5yWAi63LmGXyhw4e0IWymd9Qx9pFX7QG0pO1jtwar0WJOZOZGOu4dSJv0mqIQhFPmnB2UZHNnvvwPcSJtOWmPOgXlsPXjvm4JGKrzRYcRjSTjyh3Ag70IrcyY+cl+LJzqVw54YltuQO4AgjRVCZ8IDenKkD/e9+rJanDnJfxckoVZefS/xgoUsGVOYqArM780jwkgbU7LvKTfNNcfFnQYgo9cVUCTlKf9qM4p0mMP/obZzWUI/2Y4X4SG4XBfps4iuzlWFw2zCdfLoQ9Bc+RN4UDjEXHtLYhvssNJOo8IIOOcZvRI1sIWiJK6RdaUF89OIqTv14jD32x1PMsbfgmPubdRrH0o29P+FUrQQ8GafPP+PM8dd6c67LucX5woS1Px7Qq4detKxqOR1uEobNIggtMZp8TNOQ47S9MaFsGmVtiIRjj+dRUmcZjLJUxQjeRu1SOhCcrEIjltnws1gJ6Bi3gm7/C6AerR7uvhKD+Se+QEd6MH59aw/z+o3JY4Yc2wY04tTfx0jKZxONNlOjD0cO0cRUTSoY2cdpVwj8LKbCyQntYJ0tBTnqPymGKzhRbSOdSBbm3pLjtDDBABwkbEHL6y6dzzKgnvefaNhdhc7MjeUXY3RQrj0Rkq4sZWsdefa9PQHqEr+js2EVuGxkrq4Wo57ac5AU1ciK00fjV6dQGiJ9PPJsAizxVibUEMFq1WLM/zOTrW8W8uMLjyhrnQKlzrYgizeEd/4w/GnswXtbt+IzS2Pas1Iemu+cASurz+S5yxS1ribx6gszwSdMF0q/v8Uxsi8htLwXvz3Sp7+LtqFbXBb9KLkENw6JoI+HCG+osYTNNzS4U7ge/pNp50vjjLHctw/Vu2z4T+pH3v1hAW/YuIdqjCTglnssTj29GsRGE95P0qfUnVZ8eL0vBvUeg94V6ym5LhkrfgsDJkbhpx11aOBTCZZKQSBvf5bOWR0i3ZrrnPIpCStrG3iqjy58/b2XdPwWwp6NnmhfZkPGA6tZIC6RfoxKBkEbF7x4RwSj3OxAUu8yNUzV4m2/k/Hizc0wpc0NppWG4w5N5pRpoigCX/n0SiGQ0qnEe1Or+UH/DDp1bAWdv3cRaIoYpogVgnrFMlgw+T1Kd9nAgzOj4WliKSeLRsLwXXNIaphMlY3OGHj/Jq+PnIWX7xvApZv2oJ3jRSvuS7Lv+Vd8PnkpZ490Z4edTfQjVZ8vjB5D9dnjoNzBDKRepAH88GSlGR30+5ggKRYswhN6a7GgTJqn+BwHqSNT+Osye1CRfktOC+TBXN+eZozbhNOywvnX3ToUzXemuc7+uGaNFWxoloW0gs+YXHIMl4SYUKj7SpaIa4B5B47xguxNIKh8FOYHVgGImEKn32P2uLwG7l+35FUHT+PYFfvo0dAnbn3SznqrMvHAeQV2+obgsl6Jpfe+oaUm5tQl9Irb7A9ivnkrzLlozrdgATXmzqexm5Xhe8t7CvfM4PfPD6H/5HLWUJDFo86d8Dt+mK7I1CMbWoF1tBTMlz2Fc4+X4SaNmSgctBq8e12hcP49lvp6ies0d+Kyw+70MVYW9v4xxF2Flrxx1U888sYNDnydB5INkdBgfRxsVQPx7nVxSDwkBx+DNrGZSQF1WEtA2gVp3B1uTrv1nmBZlQF2yZ8hhw8xIBNuCorL20jcS5KfNIfgQJAUJK2+gDM3TwLLvK14+O8ZtIjxwwcxkkCDy7i3cgDinJ/C5t+fICjDiaP6hsjv/F/WGf0YJ8714si7MmBp6U8DEl0wNOcZu9u+4SrLXEwxOccXbb3wi9ZfyPp3ibOOmYOTeSWN6xajBZ/LIdSgnSjyNmre0OfiyNe80OM0+l1Oh8Qz2vCtZRDk59hjblI+vsmYCEkKB/m9bANufW8KJ9TN+NTWCs6eMwHSU9P5yOFzGCL+Bl3X3eRmgTZuLxzmjL068DZxCWveOw4hr41gAwrxv88n8eSfcny2JI6cX4TgnLw6eme8kSUHkyF51zG2/qMLa8ROYmpKM3wb/QRelrxE48ZN6DLhKK8xs+TT8wXAdlIxdgpJwGOzDnb/8g5ft6jj5vEP6AkLQ9PlCpry4SaPP91HoT/20t9OcQi+/AVrh2LZbeswmsi9RBY3ZOORsRzm/4fmnd2LT02SaL25DbyVS8bJFg10QOUoPlmpBX/OzaSrO7XQ8eFstq0dZv+zt3mpy3h4p7gf9CyCYFVUHPeNvkEeoxbyOvE8ONA2keM3uMD2yDOYbIqwMk+SF5T4wZl7B9kBpdBYOBccb28F9XV1oFD6ixUcX4D/NA3oCr1AJpPFwb9vK0VrnsTRC2dw56pppFmqjnETxsPLRzdQqEcP5hZn4YxrMeQCm7hmaCSO65tAStd/obDwdzwrmozD/b40fEEWFtqMI1giQeOnSKDMhIcUdDmaonKCaFxzANikJJPO27cYWisEtkWH+eijBDY6fJ7sRVpY3TyMqk9/4BT3O9D0nyIGbfIkuGsOKiaVPMv8Puep7gKDuen40NcN7lmk8VulViq73Q8vp7Siorw4BJw/h/cfWPHqRbtRHatRbHYXTUswBU6tp2uqTVBWvYE+BKuDRlkAof9Usk6NgP02ofBZ8SZNtvrCM6YcY3vspTsmwtRwdgS0rh7NC6pvg8MYV1aV7aOvepXw+dYSMnmnDFtm1XH3HSucVq0J238H88LVW1AuQpFPfjPk8WE+ePTcTYIrG9nLaynNHtwFuxVs4eHzXpTwqkaBye9o7eYMMv/uwzk7xSg3aCvpa3+D0z/306EaAdib9QkqbobT/k0f4NnXTPT9ogNuMxbTDSFX/vhyI2i9OIzL/umB0vi/KCo9nwMeZPK0V8WwX9GAtQfPg9V2L8gXrqJ1B5PwZqMVeH8bwj0KZ2hVkTt251WhVbUkN2hY8KyMVmi67kGTPBXwxxoJKEmPx0eKF/H2cCjesBVEj6MleP9QIDuUzeYiFMJtfjbsF6oCsKKZHZa64cBoM8yK+ktStw7hwA0/Ep5nAw7yM6H9bxj8SbAGbZ1kTNvzjJ0ab+GZS3Phs9Uy6PxaDz0DJry8XwHa/JKZLiNs7ftEzbOTAW740pnXdfAtpYWdy90xMm8YPtB/KBU3ElM17cDrciUrabrhtNdVkDs3DTFvJYd074PF1R5UE9pAR6N6Yc8XZRBuNaER7U3scd2Cr4zcyZ++Mz2K/wOCepVsnHGHscQSfj2wgboHZaD06yg+3iiOFzYrY/uRLHr5yxLFt2/A3E35YNg3GbqbEbzlNOF2pj+9XrqUz7z7RKZznuGmteUYdfA7K7/MwvxJjrCn1Azyf5xAs/8SsfeGP4x1KMPTM1xBIvUNxbgHoZ7XDpgWUAUyvbpQ8TGXvTwC0e5TAhftNsbDaZ94dVAqbhq/nM+474UyU2P866UH1WoytC5QCjoi00n7+SnqG3EbBhrD6K2VL7XMVyGNH3LcLWUOdqWxYJ/ym5xM06lIbzqt+9iP95sLODRxPxRniGNwy0NcJqkCid9yMWlBJO+8/w88a/bQJseHeMnhHeolX+ElX+rwz8sy3lUuBPrLKin2XTS7GaXA4/ZUOj++gb6slkO5Iz+ozXkXNv+bzZeKRsLle1EsceMRXBRpgfI7QVCxs4DXaCZy144veKPyHVR2KtON5okw1CJBpk9SYIvCc9y0sIxU4r1pXvRx7nJ7Bq1z/7KgmxG+l7CEtglPOVmtnJ8bbYPF057RBZfz5LRvJnendfHG+hiaeMSAPupbgspgKV+fexIunrMB/s4oMusrGPxrhftvAvBSniSfTQgk1VdG8PpjCZ3KOIS2EWFwCxfihYrdEDkwCg8cleWRH0/QC9c/MKlRFDIOKUOi9leMKO5jb6981vy2niwD/oHP0plQar6G33vI8NXcsbB+8C9GgQeM1Ga4NsUGfYOjuVv8EL9ao8RLAl7wY/t+nGQ0Ht4a1kDFrCha9FiNH9b/hn2Vn8CDLuJr5TL6IVJA9+VPcHCFCCw8FYw6Xhc4cN8KrFf6yEdjztL05m3wz7mdPxu4s7X3W5xipwKre8+x3fpcFupfg44p43ki3uU55U1srfsAXk/4yGuPz4aITmtYbG1I5//bDqYvAik6RAZuxpex+40Y/qGugW/9LkBU4ESo6RoNd7aYwj1/UYwZNqD0JW9x/YLreCjbGIbH3cZ6gb+UWaLET0aMgg1bxNFcPBu3qM+HTW/F6JDFK7yyXguWpGXBrcpyTN0/lyq3S8Asdoe+JQkUs0GCVlSIwvvVlWjaIoRqD/bzMTMf/PrNG0TWqcIv2RAePtAC//kagZLcRjL9NEhN717TtyIZUD14j7MujYQaBU2YvCOQM5u249dLxrQIA/j4khdYucqZ+40cUbEjDWOuq2LgsAIs9TkNanPCSQ3zUCpkJ3Xa2tHv4o+clzULZkx8hNO7buKFj1qQGPyBen4Y8ZZ9Upj7pxOqztyED/MjeFbeTrpi6kcPtkQR7FSA9W/mwMaMn7jtYDZaF3SAnucgLzQKxrO/XtPna0fpYHcPF8oowoaZeZg5s4XahxfR4QYXPhpeD3Jkhi4ZrgwftHFsQSdeDZOF2wZbsXzdZh6VwWBhFoapNjZQPnMxBJ5xhPXS0bRcPJAzP0rDn9r1YKP5G+xPfKe4Faew13ABX9T4Sy8lppJz7Hq83q4Fv56IwZv406D+9RO7z9oHDsllUOL/m78tFgH7+d3wItMXXP/byd//SYJwzwC5iPuAz6x5uPyZHq2a+pzlYmtxaXwyzAobw969Bjz1nQnUxerAuHwnfmiVzNMVn6FHay19ShlP3z4YULFSJyvICmDedwWIPvWTxofGYHL0EF2w/YOPi7PoRKk+On9/DLLuryi3ugfOnLaBv+vHkkTVCoxUyeYNq7NZfNUSaNDSZCP3T1Slo8f30nt4pYcCnM1/CmGTc/FKwRZuGLzB9mFn2d/PDU8Z/MEpRxTBeKCHHW1VwDnBh9R64zncVIWloubxXqNa8jsrhj1SfbS8eAYGNWjj4DcBKFBTJa2SRVxu/gs1Y2Zi8MxEuqkXxZXcjSOmP2bjUX8h11wRssotqaUkCJc+eooBMSeoJcUFGw5MROPJOai9vIfzzlzHkS3jgUXUoWDhKhpabEB3N1aS5PoYqI6uhIfq1vwiOBT9HQ1ZswVglMl/9Cj1Lm9VQ5o02Ql3BXuRznkvTvugCXKdyhD8E1BzojFINGnA/avbMeSWAH9OHg1Pi6biGKkeVkx8j192TMQpL4XgiIos6FXMpZIiL643b4fMis8suqueAt5UQcpRe/4x2YBtsySo1X4i3JHuBn2Rsbw9+QRlrt4FffuDsf5yKViJ9XLvmhS6vcCMnmjqgdwLGeovlAMLXyDFoSZsP13AYWU/aO6EQsh444hJL35gcibAm+XtuNgogUwM1bnr/iLoyClGg7QiVBDPRt9V69DXZQY+1TGDrwmnsFdkLW25JMspu5/TttQmMozs5mvfj/OuAkmeripF8psVYUFOGOeoitGbtip4HfCEVQr94UWYHpp3TUBl4XpamCRLbw9rQMVnJxx3NIcWel8nbYtxUBPSwd8nSMJuQz2UiDSHoOFpcOCsDMy73opPIr/QiMJbrP2iEA4HxeMsYxUUKYjDsjhfOu/+nB8KMDhyF5XoBmBkvjQ8/1vOM10ewecdQzR58VM2zFvNOjdXoaKuLkQ8MwLtMkOKG7Qjm4N6PCh2BrZ9iqKUcw/A1a4ZX/9cy4ePS8Druo+oOnEJ35v7nPhxE2wuVeBPEfsp/GULvX8azK/NfoKqAkCgmx3KjtJGR/0RFCk3Fbdb7WF7FTM+1nyWhxZL0PIqbSyoGAvOwltYV7wJh4xfoKhbCdZkBrJi9iNe/TAHmgKncvhzVYjwGQ9vq7Lo14YgLmgdwoXbrDFs5yDZnrmK00W2wyO5YE60d6HlOnYwJVuG51Ud5bFFMmS9QwbihtJwqkwwjYkyhRV3z8C6azrQ+kkBnps5kFfhb1qoN5Pfqh2AwcmHeFPGRCoyv8cl6up8cMMbGg4xhj3y/axwIAPMRs6iTJd6dm0OxbaT+zDfyJdzg1qhrOcYXglQhaI55hTcdorVJM3ArCOel64ZCfF2o3FerggmRNVh6ootcOq+CCi9FwV90VDc8/Irediv5ZFbJVH3UT9at7rxOcNm2q5HuLPWCE4ZfeQXF8Zjg+NDuP+lAo4qNVNIUhL03nKgWbvDcP/nQsyXFoINwSdo5jpJyPYSglOC96H3xWta8eMTiZkIwZumeRTw2xMPRNmATfYvODV8Fx7UemNycDQU3QnkxifNODjqMN98/5SH9Qp4WEUXHj+8wqeK9+LBV+EUehpg9vqrGFxZxOseVYKdvRgbr6pD2wGAyu3f4KVRK0isjgUH4ysQeTeDvmZkIESL4qZ/LiSVGQc7ejRhodMP2j1mHdTr3QBVIxEe7fwc566UgLFfhEneLoxnYhSXrLSGha+C6XveHBprfBkPlo5Gx+staJv5hR++yobHAh/4gsIP/i6uBPIlI/Bm7i8+ZhKFTxPlqFTblgcFrCg2PhVmzjnEQs8CSCHJBOY/vgEfD9/i1bPvw6UFMvDJQBh8DGegjydQ5Kp8zt9/nz+ZC0CdUCscqHBiM6022iJnjr8TD8LuKUe4WHQxXwmNgaD18iwYpAD7lC6zwK4U2uF1nqKXm2BdxzKUPtvFsSsOwwSn+7jnQD/c80OITBamjQcPgOLFfxTa+4wqyk1wQ1E2J157BI8mvqXSh4tAJFgLCqymQ/uP7zh0oZ7szgjAO8sgaFX5zLarlpKzzSYumd7FECoJfbEDcKr9O8cnWZFPwWHyfXqI0yfagIjQGRhR+5UEnZ/iXWd9UPUj/lJzGV41dcOZsGlU0fGe+1ZLct9zHRTPUGZHp9Ug1j8GPJt9WFF/HeQVruUvUwRoRs8cKmk+iZlK5hgSN4dcd63loJTxsPS6O6mt+YW/WtfhyeI99MrUnx9GC5OtxnSkTXH8/tV2mnfZApwCjDCrGqhedDxGh3mhZfZeXHHHH7pnPaBW8zn8wSGSqwPNQElsE1jlOeOPmbG4zVUJplxejmqzz9DvmSdwl4gXn9qyj3ouSMI9x2VwaME6DLU0gZaOTu4a+RlC1B6jyecqNh+3Fzs+PKPFbkrQVhTJ05TUaFyWD0s8ecxJr3IwLcORA69VUu3p0/DJswyh0g426RSw8vkKUCuKgDFH90NoaDmsldNgV4cS/Gh3kXdt8aGSJ2ogozkfth81ByWn8SCdOwb+GDVDmHosTTL6zGuTlfDq0DmU1pOHitBsumw1FWLbHOBrSSgp92WznelHPP/XEFrPjoQS5YMw87sW3C7fTS7CebjqjgglqOfDVKuVmPL+HiWsPE5mSg4gL7+LPh5UA+PbxBI2RXDQYSSqNMmDZsYR1mz6R+/nIKv3HSTdzAMQay0Bq08+g/uP8uHOs0+sm5NDk2vew0tzaXYoLIZFnSNZ0HceNE4wgIzuReTikQaL7mmxquxuSlnxEqId/sPUlksQ/7MMrmQ9YZ0rMlDz+C97i26GQWllFK0/wTGCElgTmgQrlQpwytWXYKvtRhXGAv83/3eBbQ13jY/jxzOestN/yEGZS6HH/Bce8VmIJu//Q5usizA5Ug4eNVbTz9N7QVDem4001rKCsjkd3Z2Lr04m4KktirTkkBM9abOG/QO66PMpnCcMLIbT/+6w8aRqDFkXTgtnKSMoueMl5zU8/54W0PlK3OFpTCeLp9DqncUwYfY4/LNUBuOefuCwWCsakhLkscYq8MWQaYzQIo511IPZEj5sfektXpg4l/1E42CJ/21+8dyXNhSKwILqc9QZ1c/lz6Lx6b4FoPS1gbovJvMW72o4E/Ab3OsfgXiAGYiMLoZj7UspLzwcHl2KJqNXo+Cu2Vyas6mH23IauF7zKF1PsYJlDyv4bU0rSC1SpncGZeSurUyrpg1gRnMsrxu8j2HPU9AvWgXy42VwQuJvGsoqpsd3i8hpVQVUHlHi2TEhPHZ3FU8qkKSl5QBXs6uxL7UFu5oMMNI3CMQ2P0NBm+c8anc+WJbO4YjTBvxJ3Qa6bRniAqShfc4rLK/biHvF+kj4agS/OVgNf7KPwKoPS3Bt32gw1ekDnw8z8LuDDY47EowJMQd5tqM+jJn0H1wvusdH5hRR4ztLGDnbla6vT6dkD+Z31mNBvssEk+uMccrMCwChS3Gf5Q+yWKkJzbM2sPG2UAg/L8UjLm6k2x8XUf6aDJxSvY2WHeiAFomFbKWvDhkTDLFhxy/6daoLj2cZgOTuaby/5wubHe6jyV3/MENhCoSbKcDxd2dh73/lkNGbxhLioZybtI/zbAxJLjKYN8tk0do+FRgUJbgmVsWjlIv5X/UM3uz1HJTuSnPn7QfwW2EE1Mfp8jnDPIgZrQC689vwR1M09ImH019FbV7/fAlFJT3ipzwdDLzdIaRXk2bAeNgnp03l6Vug46oBlNr40hu1BajacgJHuA7So1RneKu2A02my0CakA4dNe1m4TNjIe9cK+18NhGW+3nz3OhKsIvYh0ZTysnypyF8KTjOgUpGFJW+gM7E3wEbKWP4peAFl5f9paZFziQbsxpblTQhVr2TVygt57MyaWjlWEQ26c9x7bGR3GVSiANm/RxSe4zGi1qA/6FB3Hh6BV4KXA6WkSsgbrgG70xcB7Ean7goaRad11/DVx6qwWK1mXht+CL6lz6DQIuRtO/lMnbdLc+qLunwn/cSrovxR2cnJbg34TOKt82FjbNzYG+bJYVmKoCu+iiefvIzrlz4EKQ363OVkQxMOLmABLUksWWGDcUrWtPP9mF+s3EOuqdF8D5lBc49k8LlRmqwc5wJ5uTHMrloQO3nX3Taw5WtF+XRqX3LaZq/ICr9OUI3HwpC5vBLmBurDlfzrahh9T46lR+Aesp5qB3ZwHva75Gg1TDtNVIFNt8JsuujcIHIIGxJGE216xO5J28j/rw9hNLfpuPm49ux9bEkgKQQN/4qogPd00m34iuuulZC1hXBKHKhDu19/WnhszI4JjAKVm0p5tR1ERx2OJflSwLhvxHaIDHdDaTUkJYPauDozWG0slkaju3bzpPfOYCxxiO+5z5A9yZO591S57nI4zRUGpdTyKJ+gh4JsHdyR+UCd7qd+RUOzPlKjyNdqcj4H099II0zxkVght1FOpY0HqKt1oJ36Hv+U/cWzwcvYZ2N0yDJagZrB7+hIxZ+/MSzGMrGq0HsB4CnG7U4UkgYN6nO5esH5tODtDHodsyG2O4pflhjy49vSkPDo/lYFP+G9SUZZ0e48dVBf1ote53G16biP5f1fCDIACZJCYDGTg1aZ3icVoU0QNVIBVodtga99ovzYLYc5sy7zat8J6CeqjnUPlEGK78j9Of6DB7ROZUE2ovoo08OzHqkAZaWMeB6+CSF8DjY+PMfPFl5jIaztcnQcR7daI5j+4GFJDfwkcLoO4VqxmCtgyzE5PVhdc5o3HsyCw3jN+DlJ4b08LESNM7qgwb9mdBgdJ4b3ijDwdhQKOh6CUqTzFniizvqhMug87EZrO3hQXZvy/HWyHI8elge9iw5C/53m+hnezKLZiRh4ftl1OFtggXX3oFm2Fh6nbsa9IvMIFtrJ4/tDqTgRRvgUFwje9MCchxK54BTSuwufB30DAvonIUomK71RpHcUygRUYzBKYvJxaiGF4WfBu82Kbqdp0s2Y1dDzSZzaO135BCRCSBt8AEfrPUkizcnaFJhOE51/Io3brhy6NOL+FNyEiwaV0sHDBfSIekPmGh6mBf5baQr9VpsrdqBB13DWSQqlRqcrEF/Uzmf9JfiVU+vsmqNPrYs/8MyKsVwU84W+uvH0nGph+j5zwhU3tyFxpK/rLzOjVutPvCx7dcg8s0MLtKqxlm6MmQKN2GF/BgY4bid3BLDaV+/DQxo2fKIgEPYUPMTRexcYNNoPdDJk8D+jWIQe92HjynUodOPhyDpPZpG2RjhpTGWJLToC2TsXMY9+3/BF58R4DkqGW4GWlDeYBBfPAT4XH8mpZ6UwcQEJ/ByaeG1uxXJ/SbAJgEx/JXejzC3gfUaTdlNtpFnFYrijrXTqDBYFJ7fnQdvjqmBiq0aV8JiLqwWhPHhF1jv3mUWu8rwZf9dGHenkXPXX6FnZZawLyqDVh6OAzA3w7XN/my/aAl8cOvgoDPhrF1xHHcXDuA6XzuoCdvLy21fw9E7dznv1R54+O8ePz8yEfaskebEc4dx61AXTr4qDQn/DtBs03zKcC9kvQdVaGmTTz5zzuPyxR2Uq9WMhWsawLib4HWmIEv2/oW823U0ZhZyfkMbFZddQ/8RGbAjZBo1iOQxPpoEsjnRPHfnNK7+lsLnx1yn2w+O0/dRMejx5A3krfAnzUeHydXJDhRfTKdj1mv5rvUPdFhyEU9s2sOtjtkk+HMnW/tUYXCeD7c2SsCavDt49fIjCCz5RaeyZoGb90e0L0TG+iLM9Ikl6a1V1LtbEqQt/mO/f9rk0nEbva+uhqtG8jghJhcyxeeioII8L38kCCm2RnBr9WruX/kRNwZdZeUzCexodpYbVHqoMf0m3dltR6qlMtA/yxoOSDrAlHUh0JSfggOGDqRlYIt3My9imJo2xKq0s6YtswtYQtf6blaUVsPHGeMptSgeTsVKQ/ncb9R38R6eSFyGjs9no9d6M9iZowWvJt/DZR6J9NpuOhxp2kvuK7+D2YnzYDaqgR9YaGJdjRpcjrkKnUoiPHLoDh84eZOXeETQlYsLqdTOF8pKLmKXzk+2qDcBx62+fK3Fja/JyFF09XScXC6H6z9ewWU70nij7mZwO5xA+yUQ/pt0CfMWu8Lxse08Z3YrH315D9D6NG+UPclth+x5T7gYzkiShbFuFfxEzRVF//zhu6fs6HqRK6U6j0GyCub77WoQOD8NVr0Rg9eh7qS98AZ/IaQEtxIcaLgCR9/GQ4WaEd/tqMV9mU2gPxugUq+Ru68eJ/k0Dap+nsMe3SJgflebcuJHwqrVibhu+mSa12oFcmpuZFsXQLY1CZQ+cA1Ua7W5PyYGh3Z1kqTVKWiZrkvdPkLw+L41rywr4fNWCfRy/BxsHpdOctWmZCoxg66dc2WzAGMe/qoMrutSWaUlHyTVo8EoOASytDZwziNJDPIdCZe3CNPEIqbdataQLR4MZ1d0ouzwPxL6ks1JEpkgX/yHf+gehIkb8njWWCvKFNaCWt1taC6/l/dY+bDZpGt8unklzSJfLt29jg/nhkJEsSs0xhqAdY8qLlstRDN6rqBW2weafMSc7tQk4ewL5SjqH4rhZn9IMd4Q1prPhrzdPViYsI0FcrXoemgHFf33Hzq99IRlOUo8sEadXI/KgNy//bxjZDymbRVgKVct+nmVqEx9B+xqTOEgz80cEbKLK3ol4OStx2yj7ckxU/vpcIwV33bZCYbhmTTm5AtK3RJEGw6dpe0SGlD88yCdK35CD+3P8pOHbajzcjd4eqjCc18panYeQB1VdZ6fMBneqWdBS7Aov5AlyF6/lCunuIBrsggcUXRG/59TscfYmAzc5EG4/Q6dyNnBv/Ousc4qU2hzL8S3VqOheNFbftBii7oNkSR7ThGeh0yGjdF2lDZuC2wXF8XJM26hwoleGhuYCha/Z3Lm+A3A/oYwd4MxbL35ijp+/cF/YzfQ2vJeWLlZE854L+bXap4kucoQpo6ZDCpeD8jF9xo8tHkAcW3HqTZKnV7o7qONeIY7f27CkWdP8NkyJTAJBUx9dANHfNbC4yPi8LWhGSypm0d6YQ5wYZ425s5TgJfSkjD4QpH9mmvhz5//aNF2ScqXLoOknbPp9JRhGjG6A1ZqX4f928dAzufN7HP7H4a1FUFf1CxQHllHDgP6PO/1CIpcVMfTM0dD7UkxmJgwGkM+7uSrvwwoN6qOGgT96NuEV1AbOZ1zpEVZ1jIE0sdIALmeAk/RGBjx/QtuC/hFevHh6OeoDyreYTRnUS1vavKiVTITocseObTOhXs/68K8mcto8MB1uPFZklWPK4PEREkK+HIQdrIEfF+7kz8smIuaZibUPWsN/r0ygCcev6FRQ/EQaBPJG5acQBtRTZCJcKf8Cxb0svMaFD23pZez7nOZaxRMeatLY9+NxXGnFlNtkjpcTXKD04ML6cMxXboySRgfV6WwFDXhikPbse2oA74PaWGPTA0wnvWc6wSSUTxgJW6XtARpJx3OelPLWQcq2dPkCY5tlKcXQ6PA3O4J33kch+2jNoNxURobblvEqZdUUP5GH9qfFCb5x01cKWkChWfKqdzoDOjPzwOxy6Gk51pH+6vsOLhRmKY63UYTAxPOaFYH1czPNGnPfxAcIQNFDz7QQJ8CHHn3AlWxja/Nb4B771+QdKcg3NVTZ0eNBii+cwKe3FwGeybVQJ7rFRD44ExlnwTItMGRmy1kweCoCymiFQf0TOFZakF8z+I2NEEGejwrprbkeTiuPRblNyuCwe0QsEleixYrPSlGqZVnz7tGb7ul+XfUHZ4gOQRjzv8Dn5DREDqQxWF7FOnLxtmUcpMwXHAI/2TNA6MLVZTiNQXGFc0nDzt7yBiIJsnbvXRoClFfEQD+Z8vFK5V4lN4EaK/ug/VJ32lfqSH8vKUBQecHIPIY0XK5N5Tu5IpCJ/ZDcWYk/LkryaXzM6j50AhYbraHS1sl8EXibLyQ9ZNHr7vIBx1Ps231Axzq+s3DHvas3iYJ27/H0K6PfZzaWc1DAV3QXfYXou1KQWLZeupfdxaUCueg4nFRkNAWwIHF4+nZ1pUwMd0Az+anwTTPTqYyfVawbaVRWr2w5D2AkO8gGZZNo8t2gvDM5STMFr2CHk06tLx6Gpb/7sLJ3iLsXjoOfMunYUD2V5aPcOArZgKQVv4XndrNQePdcTqd30eNSco8dpYI7NnVShZNp3mzyx7UznkHIjFKtOzOcQx/nEM1tVcgIqSeFYJVYfRZLZo2NIanib/C+ec9eOlqVUicfQgHnQ1o/foktnr7GuTSbOHVJydcfH4O702zR/nDY8HZxAwm3LuAgwcbKXrkfhDPDsBWA0Oo2XEJb06rwxsdu1l8yWSW92wDTd900FzXTHND/GFF/hTWEFCBlEmzaULyBM6SVySZ6Ev08c48uPNjHf7+G0Fhj4bh83YPDHyoCsOyjMdnGiJ+8sH9NyMpQbUU71d3oLelJSYabKd3GYbYLC4Lopf28VoZHSjcuQW2WISCrfdd0nraRx2qOSD67xL3ZZvB+lBziO/diW77t3NV9DX+dOgnz9/qir/6C/jaGFF4Me41+WsIcvo6hLgRstQueoJqtD6CdhWz1utEnB2fQHrKNZgQLkqW2fKk9VYDjnj1YVCOPob6RvH8khauFHyNKWZ7qC+ymSt/SPOhc8/IrUIdDo21wf2rzDhG7RHObf5BLvnF8PrHSty8qpI3VXng5JxR6CELoODqzmHpBSCXYgpW/ivh3Ftd1jLxhDt7/Lgxx5BPWk2iWcYm8KvCApb9d5IrdqjhKeEXUOtezlojR9Ff2RPg6/WcUg45w/gKKfCSO49CJzr4WsQ+TJ54n/cKOtNW0YkgMP0qxY0YTfP/uWCHpA6cUhqm/Jo5eDtOmw/MbsVi29WA61aCzwxfSBDcSLlyymRqZQ2l5So8fHYBbnEb5GbrVWB8rQNqKvbRtr2LSf6SNdzfNov0l5mDonI0m20TwxEPhdA79zRXKTOJS9Wz44AJlEpZ4yvJZ5xvw3CrbRHuel8GL3WdUDhJjcOWLeOkgVU45vczjtV1wuvXruP59DFg3JOK5ppxtNliPKhEXIGLx5/B8n3i7PomEzo/q6GngCI3TRKEW9fjofyZEBS1K9LTVz2knqSNzzLnQ76EJBidkMK73droTfogfambxaUrqddgNt2ZMw87zmty1Nd6unBdHOatYzz82RtzXRjSPNfQ5I4hPmqTR6WHR1Jb6VtQf3oUY09IQLa2NU1yXsleWYZgf8yQruXv4JQVC8hV6w0oTp0OQlFhdOJJMW1N0YaYY03srS4KQzUTMVBtHn3PfwGvj66huTEZMHdLNtcEXYei4plosm89OI2dBLFrF7HDsw+wpPcHb9bP5/jH7+lppi0+v/eFzD4T+5fqwFRTVbAO2QLuV8/zkS4L6swMg1OuH3jv5lrO7mijBQIqpFD3ELf6ycKkNY5QVBNJ3LYKL9R1gIpkG7f1iIPU0n7wOnEdJKd9g9JFNmAT6cwJCwu55WMIBey+CSOurQfDG3Px6oJdHLpIhac6mvOa3wxrG7t56kg9XpY6FQ9dnQ/CE8awqLcaq5kYwIP66eAz7z1+nDMBfkoN0TPzLLrfvpL42Ds8KeRKg33RcKQgFsYES7DM8bd08YQaxMl8Bdkd4qBisB0f6HZiw/tZvD08hiKVYlBCZxWessxDR0N16DPvgylrbHCOwgle5hPOSxY7YFbHXN6o0U9dqx9QzOLZtGWeOMx0XsEF9sKk6RAL3z1vI381A/s7jvg68RgXnfag0u5wDhFTgGqRetB+ZwP12u9ZRHcdCfInGLgwEUpmzsXRn//AlObV8Gq3KUQGfcdhK39o3BVDwV3pJH7Xjnft6MTeiGieKqBPo0f/hvMjRsDDUBHyD5QCXfnVlKI3id5HOOPVrm2wauca+Np6kBZp2rFgtSEILXzObfmDWKa5DiV9e8Gq8TQHR0zDZCt7/Ga+F+KVn0LvkTEQerIOA/A0/GrbAlcTZGAu5mBoYT+k7VhMSY/9wGtTHYcaaYCghRTNVF/OoVJvyPmNDfVcEQS8tIaq/S7ygy82nGjqAT1XxCEprwBOdEZh+4JWWn3gAzZ8bsU5KQq8PyMR7KIG6F78RRbfLwECpUXYXb8MNcNEoPjqOXL0iQM/pSiy0BdF/x0L8WRhIS9IMINr0gUYbZsCJc7qFOFwB4Vik7G0rxDnruwCif6xZLSrA0fWmMG9cn+UjO/mQ4cOoPbdLWSXkM06206z24y5oO8nTtULBJBAH1oV/NBw0lR0MXfgj9+UOfvQTPJc5M7nPqSgRnM33Yp8DEfHa0Fa20KcOewBoVP9UWF5H16SHsvqt/bTr6pdcLVKGR9ujqKL6+ShQ3gqX198HgUkAqG3UxDl+rOp/FkZPp+tzdmJcnwwyRNG5o4F2x9q+OCkJM+vl6Qxm05Sr5AqLvcaRc8m/McVX6pYNXABPCq2AYXJW6Hz9DOY+FORi5aOoCmN9TwsbcDzXk2g+gYH+FauA9NeaEH3SmMYa+AIp7wLWHmPJsWou6G/ynKaIq0HxgGtaG8xRMeFNOFT/xve1+bG6blreUdzHb9VSqYSiZ0sUlIEJ1sF8FzRKPKQsoURL7tBR86NWqd1gd3iGCDThbTqUiO/KzYhiS3KEKizAJ68tALRgipw1lsKabgRby7wpNYYY3DI8qLEFSdwe/V1uKLswtnnrMH1tTw43UuC6P9sQbDLgS8/+Y6DLxtQXaMQzvYfAPH03bjY1RqE9XbDf2nP8bhiCA5NrKEtS6rZUtgT8qJP8ww3Kfb8upfD3eRhxohx6DNfjJ5LaaP10kDUbfnBpx/PB5cbI2H4+Fn+5pRIlz3tIGiFAu/4fAZP7/Om1flBMO93OFbpHAaNs/mgvz+FVGccIHs/Aci8Hsj72pfywcOPIG6cNKrAJF7yIZ+rpkahkkQcbms1wJM77UC/Uo1Hygtg+5W3+N3pOLryYwi5M4G1l5fQkpy1sHjvCaauUfDb/AcVLUqBfUEr+N4BXy6XkcBjm/tpstYzal1qAjsG/5BQqBqkHrgHaSWhEKPSjdtrE2jCiEq61Z+PYzpfwY8vkXxUeSFdzbaERG8x7PJvxdoNyfBHbgGmNq6k9Ee5GLv/BJTuWUBNcw+AxjdLCK0So1a/Nt4Qfom7LP5S9pxv9KfACGIMd3LoWVvc3egK8fvtYWOONWgmPEfH7aNJ6sNynOsxH+QtDrDh+miuSPzJY7Tnk/VNI1DuPUo7Z25FwUR1bMlaCcWf77LCx2x+uSYc9Ktnwayi7zworAtqShLYHybJ7YcUQLHvMN3qWIt7B/ypWjsGrxa08imH/bS8RwoC3A9ixJQ0il/jhgkGoTQ29hFIyrXBegcg88UX8OP0SThOA6EmIo7HVc7j2Eu78VKbKZzxG6CoyVtJ1PQoDhbPo7eHSnmuviUkmA3CTq9D8Kv4EKcdVaSXx2XxZ8BSLg2vpMxPV8gmop+aAyfD/pg7LOY0DdJWqKJ7YiyM2ipE8Wcn04KXFewUHEOjblzlitXicNs4hHYBU9HaJRgWKUIbLjqDUtdL/JypBbWykWyYlwNO4+Tgjm8wl3EcVZ41Q6fJXpSg3gkiK67Dg6jZtDffhBM7trLGOxv4KxhAyp+m0jddSxTesw2aMghOT9bmGMrjmm4xbKuQRL17E+Dqci2+bxbGEa+nQfOuX+RYsB+WxwrBx189tOF9N9ibWfPtdGUQLfPF9mXb+NzucTBFVoMuFnTAm1/9dGeGAIN1Oh6UHcCmU1YwsILhicYybpJkviqqwCUnp/FD4TessmY3VURrk0jWGjSVFID9jtU0N8sVb+cK059+RzBac5Euet0mG+sbVBu3FlbTXxJ7rwTn142goj3P2XXLOh4hNZYrRlziG4IlFOb7lxTbAqnd8SII7pGAbLkc7PwVzl8SEuFQgiLG1pzA9+l7uLLCAfaeTIbWE+W8LkEFyqOWoNDO1Vzrp8xJX8154b5FkJEowL+HdnCfTw3Pr+sHWVsC/8sNNOpOB1uPcgHZZb9A7LYRizV8JfTcyo4zMinq2hhQCRWDomZP8ps8Dl/XXqNmxx2c9asff5uYgtyf61w+cT4OTZKGuzFyULdmBERmvsGUrDno062NGSE70WL+LnR6/4blNnyAW44K3JtoB4stunA48CbMuVvNq9YPw/P7jbhk4Ar/9PjGOlq76IHyERjeZQ9PtIa47fJ3Nh+hwzEHA3m59BOoLBPmrXuyWHxTEvd47aW9nxRAeHg8RRseR19tJZhs8pHXbnvJbQOhpFx1Hm4/yQe3ZdupVEsBPg4Hs4VjOq24IMk/L3uz0ggbPLg1H/++E+GW0A5+p5FEI2s0YNTxS/TkG2LkpkHSjlaC/ju7YPYCE1zqvRzKvP/g1NLlZNspBt5+LbyxuQXnq4riZ4GRfORsAt6XuEp393vS38drQf+sK4Y8sIRd77Zgrs96+FjpAupnU7FsaCGqHZoC+R5XaI3PWkgqHwfPJijBVqmP9GT7EPwecYgo7T2LuHdT67VQeiSkAZ4fBEH1sy7rv7OB2Jg6/iIezm9eagN6/gUdjS+4UsQDT8Wdg7vXBehdQRWa5SnAeUNVtHDo5XVhn6FWeAEeOZICVbPHwiKx+RT3KRM3/5LCrbYykFB5El1CcnmZ2X7MG06iiBhxEA+Qx8R/AVT630Keo1uGhiNtIMW8BRfoneUcMzO433gFr53WhQ7/FJIe7YXxnYXYmL4Xp1gagZCzFlaE7iMHC6Z5Cinst34HfF/zC2bYpNPDhDqU0yln8zJ1MB0oYoNuRaou7qeS/V5sZhYBC5KLqaY4DFRqxtF/n3/Sb7aCLy/+4ev4u3i2KATKW7eC4wYtCHE+gG5nXVlvQRC/btyGX0ykISroHm8X16TC9C4WzklHsYJR/Cv9OWkfM4CkNBfYU1pBxf4T4crMTyR6Ww1vlUTjjs1WsPbMHxhKEuelJq5ot/gWrpzQQVZT1GDNyc046YM6z1QZzWr9e3G+Shv5msnC3oxC3KoXDiMlDcj2kSZcTvnLlV8L6VuDFJfuUsXNCr7oWazAF6uCaKSRPHWeOQcH96jAyhfFcP7ybkw9qIIhN1XxfwTAB0AICBQA0D+kvUs7lYqioamhJIXMhszKiAoZpUhlE5U0UGSvSKXtiCRpSKGUhq2JEFpW95bPKwWpX45QHzbI4nJJKDsmhGaFacDta1l8Q3c5fNtzFN3Gl8GLc8BOe4/DkoVf6GyzPEy/nU37nkrCjbkKNHh8GenYfALpV6/ov+M3yXloGMvd5mH3XOZZNrNww/tRoHjSE9TUvmBXrAGLlm6kU7dlqUPkHkWYbcM8JyEY7B+mMYrKMAfc0V9HAkKUU3HERGnymGtAo9wS6ea4I7C9ZQXF3luBpqcFQGzGWxRJP4RCNZfgwuQLPPXGPC40W8NBdybwkFA2t0r10CwZUYhSeUm1HW5ooQqo1/qefx3/CmWVQ2gmO59FrKyheNIskJYUBrfEQd5AjWT/OgDm3HTCCXktNDE7Ab+pdvM1+VdcamwBzz10YU2TPv5TM4VbHufhl382NC4054YLy3n64RL4NOjCpekzecE7hn1Fj3j2zKlgsH8zJCuJ8eGT6ii4uQyUnefhrxwzGCoWIAUaC1FRuQxuo0A+chHemPeOdghEQfq80fQj/AeKd+aztMgJPm0qAE5LT+E0kSZ24w5KlsvgiEt9nFrujvc3qnOd5mpcu7aGtlywB9XSm1hhM5cOLazE8tV5mKJxm2eq6yE8lABzuZeUJCMGV6pN4fXGS9RUp02af1rZ/4AdwL9YFHc+QLjqIgTPkCZ/RxFIfyIKq/x6SX/XIXT/JQX78qZDzWNv2Bj3hMOudqL13FKqMLeBn75jQXFwJOR/8KObx6r44KzN3DZwjGUvOLNOZCJWzvbEdvlw/FCsDcKe0rjN5xsdmj4S+q6LYN6mjxDpvpzrk8Vpe7M7DV/fRILz1KBcbSp4bL6KFjeC+b+LYymbNoCfy21ePfsK1wdsxxVFUvh0C8LFuWNwnJ0YaPdUw1yDVNgh3IgjjeRxvswb2FNfzbMStNFBUAfkrBvhlFUv75OO4IdjRwEtfIA2IioEPmfxz6r1lDZaEMQmqkN1/0E49U2BXm5SptjbrmAwLo2Wr/ShkH358HyfHCe87KYAA0HIVDeFl1d9qFTgAnPNAi6dep4Vknfxfc8AelC0gSb69EGNuBa8HqMOB/3CQajDnK+me/C/+FIaMe06b7BrwCtDpSCtIg9d52zA1LSZjw9qou22+XijRw3Uv62lv09Pkpq2J1Y/9kK1Ey0QumQUFBZ85TnbduDYn4cwPGQ6FHtO5P0WK3Dx9rmUpfuPzk6dhysEbWDW2Zfw4etNXNK2mONm70RYaoQdUi5MqeIwpXM9btK3oZEnNMFvyBDcde+T3MpY9gzqQsX7S0ArQJG+rTsK8bElaL1skNPDdEDXl2HEqDLQ6JTBBXnCfJCGWPV8AnrXFPB1rSLwLN9DmZ1CsP7PenZL9mTJyJU8+DycRDzekOOoOxStZ8tDBeOoKmcRvDCxgtSHj+GDxQ9Q0xqipY0TYa3iXDj6URR/6aqgd+k9uC1/he1+jALLJVF4p3MXasg74KhEATyuOQjOGM+n/hjTpr9BZP7+EcEtgB2mZeQiboGNJaKk1nybZjxPgLDYMYixDVgQHotTR/yHJg1SYGV+HFYbBnCcy11SCWvgG8cvs/n1av6sdYHXnZmBpurfcWqoChwRGuKxpb84uruZjxe6gneAI5R3vKahy8MQ3GMAm8JiqcF3PKQ6v0X7oKm8c1gSVN5sAz3SpfaUUGiKCOWxq80g/nIR37prCRtNKqhAZBweN15L809N4psCKryyfwgWZvjyv12tZOb9htMaTCClfgmtnnwHhAuM0VwonE0df7LKvjG0OP0updVdp1WVg2RgOwmKfx8kr1QF+FpWymqxHpA2VYvLlTazdFQ2vBbaSa9lD5DKehkokBIEz/Y0dhScz5sTjlJQ/Ct0Ef8MxdNC4VdpOo6vOsif2k1hp9NTOlOaD8pfbXAr+4FF7kg68GIqRIWfB6lpX+B4dCunnmDIaXHAGflurPvLBu57n8QJouewqbKLo182kpvhU044Ysdd2SPhZ58BzD90hQ+MieDOScFsrmEDa54lgrTtV4h5WcUyzeE4wU8H9Hkk6E6cCi3bS2mD/xCXvXFBwY9jMD3diEabFWHbgYUsYiUDwge+Y5G6BFxb8Jfauu/wjxs78NIrM0hs2EYN5a24aHUllk22hOCjP+DRiH/Yn/4CJm3UYfG/f+HO/lN8eNCCjvp9RMVNJ/DyonGQKr2ZqT4Vtr2cB+76m1G6YhYcuXyEpXYdxrCE3TBfToHnNtrDrlH6OENXFh92KYDVql2Y6jKDoo88xbR3B/neXQm4lS0HPfHjwXD7Yp5qOJerDv+iRSsmMx4+jH6hXrRB7w9r+W7itIpslpUYC68PfqLFbEzjBotpweobGCkZDF8LTnKLlg5O29pJ4/Z28n+b9aBUZAikLtXzmFBvEDqTyd5xCWzs+A0OmSrC+tHJPOlFK6wTYPjXrIXRp1xQ+Fwd9iyRpuQHKXzM8A33/fXmhQ5Ii4tkOUpEGxq+3+CmLVaovns5Nsp5Q6erN11Rm0d/t5+BNnVlVqzVp+7ssZDRv4KMZY7TUnFRthItJOWPJvCfczB5DmXBqZod+LH5NB1bYg5KJ4+AWdgB3NRUj0ZB3yg8T5YF5aIxY64hTE2wpmUlayjgiSoc9wrk3rQxcGulGAxZZtPLKdlsvHgXLm54jmK6Mtyi4UzjAu2gcfRh9l0bwh6q5py7uZQ/hKejVp8rHx0xhmNtfMjq6EgcbTIO+uRa6MC8ICi630I5kWmw8PwcsC/dz5oLU7h4jzSHHRrFzSuloPmmCI9X9YLYojq8ELue7C1luFfsOizx2cyjD15CvTjgoO/CIOAaRL3pDzD29zGO6j+LSwP/4FDmSL50OoHdBbxZ7bgv3u1Wgact01lw8XkMFRvm3IsT6Oi6bWwieQa2PhDnPTCR6zLVUEbTHi4d6oSbJ3S4+lY7jFNMpTtUgw/eCMP9nDn4d9xMio/8QIcaR8Pnnlx6XDcJmw7as0rgLa5UmcNni3bxn4JqeFptwj9z3qDNTlPovfwPfAU86MDF63zlqTc9nRSInuo/eX6gJS4Q6gH93Dw0XmIChyOyOH2dPHs1NbHD++OYNJACoa661BfSBE8al6FCXAHnLB0D2RbfyF96AQXHN8HvNy346vM9ii3ogaUNAbj+7kd0ujwXB/S04eSbmTTC5AM/M3xPr7q2UXXnDKisf8NXWq7A0Mj7oPnVA2VPGMFB+eWw3VkUhl5PxBFHpnCToC1Nff4BM0RraL/IeQjTfEtyBkrA/Yo87UgH2p9cDAJC+/j2mq20BP3IcpErB0Ie7A1cyMdLRKDZz4E2Vd3kM9Z9MCCZzXM7XvMnEua2Xz1QHCiMDyvWY5fZJIhvV+WH5gTLyv1R/74CCJrmsmfPb/h4bTdV+PeDQrQ1PpQ1gA2bdPD77Jl0avUVOh0/DiOfnyNLiKfh+H9UmZvCj/21SfiXLmyw6OfKqwhl6adBYuggXJ7IoDlrNepHzaW9pSqQJ/sC8g1MYY1+C+8vV4MtL91Q9+hiaGyIwpZ9yaT4lXj25k84YKZFHW3CIHz7FC7omUTFC+zxhv54vpPzAXO9H/DMA2NhqLiLnUuPwteXEnBJ6irNDpPj3atEsUfhNlnLaPHevwaoZXES8iVuoYx5Kv/11QU/QXd+LWDILjr2ZPjhCrTvSaHtAsr8+MJJOLP4G+/72cdZm0Xg3+xurlGuxYSWbfiyLo46JJRw1asZXFgyHQYE/+KaZ4WknWQHO5TKIEAkg2q15+G0p7Oh2VkElqp/xinbi3CH+XZOELgDRgaGsFL7G6yXPM8exd74T2o9XXx2GAfWlqKV213M9jsAwcJtsNVQF16/v88idsGg2/cfZWedwRJyZ/cHx3G91zoWc2oCu8eyIHpQBCbGpqJJjDdNG7WBVIW3gleRA71Y95W6VkwD7YKJsOt2CF/fPR6erZpCkVOnokRIGbZPnAMeWQdBVHo6HbmsAmcCv+JP1RmQ5iUGtSU6/EZdECy27KRC4zN0qmAf/np8mgxjfWHpKCHsbjLnajmC0fMi6eS1eJjpXMVvnp+GbxBNs5OAf3VXcuqNsVA3rE1RygQb5yvhIrsBXlChxrP+s6Pa/DA2mWtFj0rSOSDuJX6ZHU3BYy3hx8Q2GKX7HT6XnmQpWXd6StPh/hkP/uGsSZY3MmFnRg27dVrCkpWJ6C2aTQ9ke7A/wYt3Rnxkg2hj3pdnjDtil5PX/L2QPDQejE/fhEXXi8B5rQ61asbD1HYvOvnIHwL3mdOeD+uoZQ2z6gM9CC83gvit4fhjywn0XRMAF26u4xP2PtRnYIZ/hbX5kUURbss3BeVzTuQa5Ye3vCpoMHk3iJufxkXN1iimdIUDvwVyW3UzlEy1B9H4RexurkfdF0Zg2+RjtGzMWxDLCIFbP29S2Hsxnr5wNiw2Nwb5pkFOT3HknzMjqXKuPE3Y+xyK7fVR++FIBqn38HnFHBDqEYMdky/zadFrtH/cfH49eTL4OuvSucBSlt8XgvOOqWBrxB+aGakGSz584Oj2x6wSUAWWqsm4s2ET7lugjbpfB3FaSw4GBw+jvYUlxCi+xiuZpZTs8ZKStpXCTAdXkPg+DStCJaCoKBHrzu/llc5ykP+shvZTOXxvbuKHfblcFPSabEP2o/UFD7hhu5S+hMXDJmklWHu2B6ZXaaJu+EyMabaDz72bSC7sJVluXE83x7qjbp8a9aEy2KYdpDZLF/g9/yeuv38BrVpOQ/YzRzJf2MJighpcs80Of+aYwpPhh/hKoor+O9ENGTVm1PVHHAOFnoKCgThaHN5NAdo18LppNOy9d5OtZp0CJcnluCC/DDPbv3DA8y9g5Dmdbn8fgU8rl9D7pIkQNM0Ql90BXiNcg2O0r1J+/FqsNZZEhdD19EftIZz6mIfvzwAUTq+AMR8MeYxzEl5e3E6i78VIXFeSVDvW8fcjhjBzeQdXy8vCowWy0Oi2FPt3tOKWE8ok59CEiXprePBVMWs5MnZuE+DoBDWoXHqBw9V1YHp7CEo4lODHL72geXYlFjx04/0758HypmR69EQGrsZHYsaKDzR9ZCNMbkqmfY2hHCXpRImz3vG9WFH65j2K7uy0AOnEWbRjYwNXDS6gX/pfQbbqErZuEScLxf0w/KWNzi5aiDUzjGCn4Wuqi/bH06skoGfZMM3w3I7LPupA4ZobqCrZhs7qYuyvbAY+R36B9QUtllihTm/nrMK/XxfwvmdVeMJgkM5ufMmblHUh2UUUzmS1g82/y9hhrsGLDMZTwGcZ2uSniE/3xOM0nzU03tGB348Tgv5/C6BZPQvSLmXg9AnRIKhTQ5XyMnz84SgsqA2i7bMrQOX0ZNiunoDrNe/yWYdh3DXvNM5VmcMi2x/B6dF/cey002SmMx2T5+pC4GZNKtqxiK5tkgd/iQCY/vwMzsm7DCX6p/jbv/m0bZopHLOxhVP9OTQQsgoX7suE1Uvs0XVONCn0D6GE637M9zqJ+bsmY++5URBp/RNn78ik091nyev6H3x9op8Ddq7GJi8hsnZRpaj1a3DR99HQLxnIf7JSoUPjON4dUc/NmYO4VKOPnSYswh+fZfCYZxWdGTYDGwF9nnhJBH0Ma+iDtRDm7HlKaWmpMBwjiXdrFfln9zt6tlIYtkEh7Cqey/U3kzH3zg04dS2YrE/7g2+TApX+tgBlCIeVAiKwzrcbYlbvhTJxdbD+Ph/HlB3CLAEx/uL2jFS2pbLK/RVUWmkDDvWd3C47BhJ7fcnnpjQ7bF2DvalX+XFfHrmp5JL5z2SUMVUEUveEjc7L+bCQPC+SE4W2/ZcoZNtfHIhWx4shvbzT4jtYnLeF/MX72eyWK69wD6M07QbeOW0UmK0uAi2XfH7wdj5rjP4PNAP0YErYSBR1eQ9Tlh3jZ2U1cF9XBH/kOXCotCYJPSnHTes2EqxUAb+IkVTZ70epUa/wTFsAWsj14oDxPZa5bgJbL+aShXE4vnYUgcTCGN5koEUFDht5xY7rqLgigdedOQsREy/wiE03wdD/FTzUVgFn3Ud867QJVKT44rUTbei8IxkDrUpo2f1f/OnJdz6VthJtN42AYOOz/NUkBd+4CMCpdQ6caPyR2mLegEnqVTyyR5+Fa5bTm9Wy8Ozsbj799D2/t73BUVOeU8AMA8qJioEvL5xhzhlnen42C9of20O6LHFapRl8PLOJdwkwHjrhDWPkevmPrgsfuFeGd52zMCXLGBaOVWKxmkLoz9NHsT2XGaWr8X2RP7ZlSoLvKgkOnx6Iu7/Lw5K/utC95zeXN3nBk/drqcb/KDXpiMPPLfdw+c0WtPkhxylVEnB8/1z6Z5KFUROZrfv9aIfkMZ5kkszKHddg8ZRE6rq0BSriZCH8tzcIOjVjgFw2da0IQddGJ1YOnQ8d7IdDqm3UP6ICOixMwTrlKx2y3cXFqx2YnnSTqfkbUrpfS+vjGrhypw9t9/oElWka8OryRJCJeU827s20r68MFwYKwvW7RvxTzw9mO1yE6/eLIGWEJZw8cxc+xF8DWLGSUz/sAXdrYK1qb1reIcgC37oBPh9nmWsmoNC6lCSTomkC/cS4plO4deAmeEwZghFnNkJBShOf0hnDFZoIX9UPQEmmIj8x1sGlA/twxfRRfGOsDz51K8TISnGoaRiHU8argkBHPc02PQhnz4Xw1csV5HvOhlNGLMIMf0nydhPCy9VKVCYjAmMVTCHUPoTSUqNAzOw4Pq69D/dOf2a7WGsW8j3HClNMWUvYGAwF0iGwbTPbBXeTRVcSTPWohGn9zrjmVTAUy9ZgofEEvlMuDuPXRvJwzBgQ690IvV9KIfePHSdcjiKDqjIWqN/El3IX8fYZAKFdK0F8Zj4lXdDjl6ceoeTE23TyhyT+sg4ln8VOfD92Ku3ZJAed78LhYUQ1iVlWkP/siWD5YpgbAsIhLPcNykjvZNlZ7/jnHmEQD99Poqqv6eU5Q4QrFbShupkuvn5PTp8ycOUOJ9Z5KEilHgw9+wk+TGzmDUlhOLBGGuoPTIELNeXw/qwrN7y+QpIyHtDjMAZm6DApC7fjdXjGf4v/YB+tAoG90hwltYAq18biyM3vWNvdEixYDcydIsCwFogX7SInKaagoXn4ysmeZyWHgcvlPTDorQEfLPPhyNoAcM86SHPKP0H+28fgahAINiFLYf/DK5izPhbdzYzBdf1d2NesiKKXy2irjQgair0nw8g0rAu8w9eO7gdPGWFuEFcGu9oq3LXEjM8ajqTlx2J4XKMmCqocxE4VYw7qdcDWuEP81EgKfji8BNnud6Af2kVWR4/i5klH2CI/EZZMPEbfNoTQFvbGrgwrCEpOwdCHdth4eixnyVtgzOwcFjhgBdPdR8G7Hkn2S3XGsSV68MxlH2XvCQeZWFFK2RrN3uKNpLE0D5XjtcAyyR1E7bLYeIICnFnfTH3nFGCx1l3sTUjiBYdFMEPMjVacu47z6y+wcXkWxhqOhtfBwjizyg8fasuQYmAaNm91p5amx9zme4aPqZ/ijoaR1L1DB0IqhVi9NwV/BLwAtSO6FPBvG1zTnwFqHuvQ+eUizNz1GPLW2MLvyXJ8ccJTTLN14YN3Bfm4dix2xY/Ax8njuCZAE6L1pUnrqzmo+X7ipUtug9SteDZ+uRMGvU9QSmE6x9dUkfC3YRSviSCpegGI0fyOhoNFtGaOEY5Zq4Gzm3VhcEkAXUxIwqyT2dQi8p3OjdCArbl/cY/eRsx7+x40CnQ46/Z1qr5pRssvSUJVkBglKjjSjV8AepcKYXtBAD59WwgNgyF0LK6KMpbMpx0PU2n2qEN0f5snpcdJQZlrDHjL9aC60CFoflYOsQ9leP72AWwW3wYeBzsQj9WwxkKE8yabKWvgMwoOfsBlqd8g9UQptWuL4Utp4nttWTSmNpP1eiVhwn8N0PJkCj/Z0oLfUl7BrppIlrz5hY+8Pc7D6wQgY+NvsJxiBnsT3pG8x1H00njE320isLx0Er8zWk6/JtSBD/ti4tIBOBYrDi6by6jSqot1140kG9PdsPKVJbaHvOEA+4eQbFRH+ef3gWqNLgR1f6W0wmb4EBgAJnNUKXZeLA4cm4Jdm5bxIuUEzPAzx5HXDeHC1tc4wzWOB07ZUnP1Nl5+QYh+OqdDxd5KEOkNw9jqtdTeLA4GUclAO85Bc+pOPDJlFiafqOe8qF7MVayD7JJH+OKdH2+vHQ/86Q+gVy+HT8+DT+ZFeGpjO9UeV6SN8ztBbp8ZjZAKpDd1ymD2IwTG3HpCY0560hrTSH55p5uDL6VQyqpDXKMwAab/iySpsglQElaNS3a24J2Bqfwm6zte3eTPHBkHhuE/YU7SNW5oTofLi8zhyBZ39q+8SwV3jEhXayku6HPBgtMBYOCwCty+ZeAtB2c6VCYCno6mOFc1CL5vlKFrpz+DzPYAcDv2ioK1ftIaxSh4Pu8X3iqWhjU3dlOVvDbcLT7O50Kq0Uh1KwXdbeOKPSPJdNZBVGlpgPAQZfg9O5CfjP7F7v1LaWRiA85XF8dWqw8gvH4O5hrMpV+OTfSgbhLk1w5T8bh84mxb3Cz0jsU7s/jj333w3VMSegS3QF+bA8aUmMCMg0ZkbiEC2pFbeJVsCQ8XPYFzSwp5/HcFnjM1lQNV2uDCyZEgKtTJX6T+cd52IWyNmckdHz/AtLnSoGRQxDLK52BtvS3dyjODy4rLOLCnmWO3VMDHH0l8o1uPkpf5Y0BTCIU+0KAD0Y9g9LAw8NXVHGhXxOPH60Lx7nTe+XUDjXv9Hevu5dLH4g/QE2fJYustoCk3BQ8vCObTfYrU9J8TtJYfp7jHj0iwtp/z966COpMQ9N4hBXIXloFtYD4UPFrN/ZIHweOKFedljmDZkDHsZ9COxS2DaLlTF4o1cvnb3GVskZoMgTfaKepNDHz8rMIJLn4sGOwF//Kf4mSrsTDGV5uP7ToAV4Nt4YfLdEh5sYWmrXxHB16a0mlVfXYPckXNb0LwaKQbLrPuh7i7n3F5LrDX+CCc4POaem49gJYYd4zc/RsvzNSDiZcNSarUmMcuraCTj+3o5zs3evOfDJhdX0qu3dLc3HOCy7Q0QLncA88pF9PxkH3Y3ZoAv11UsVsG8WE78k91E7hmYAOLdhnBYFIwOs7JAePCMrr81BR/7FhMBpNUME3vGq/fYUf/zHbR7Dcy8NglHJTuStCU6FOo7/oKGxRGYE7XTFoq/I/tVtTRqspkmuEiCdaXN4PJoBkVDn3iiLve0OvyH1ZrJUHtst8UaOZCjb+7uH+qBQStVSWH+rHsO6GW8g6FwiYjB7433YC/nUvl721J8O/UP7i5WgW2rPHGeOhFywe23L1yJQsG2KKhwSxYER/C76W+cmtWCk/Rt4aa2dqc0nYMKo/d5iP/LWeTU+GccDCZA+xmgmXhKWzKmkHjSxjcRnaR2dO39PiXPP4IioFrpiKk9ugvDs99i9oKObzcf4CuNFmDvUECRg630d8JqrRRIQCbH4xjK4Nu9LRuhjMxn3Da1XKseKQHcvNjYPToChj1LoQneO2G7N27uU0ilTZ5qVJz1RJuyLeHrXr64HfzEzoM/2bBnnZOuHWVqhyXoCceQv2VDdSkM592x7zCAVELGLFeE5O7LSFMyoQDNgtA7fGP7NfuCPOSCuFmZiZNvnCWQ1PtYWeHNvw5/gKDzWbxAtd8VjvdDL8SD4OYsRvmPBggSasl3KswGbpnKvABi0HMMZmN5cViGOCyg2Q3xnOpZS3lJ6/DgZ//ocB7LcgptuXwobMwOUOQz2iU8rtDAXxb1QrbrU3gwp5u+Plckgt8pGCs1VVIuysDgUuuQt+TSPDebYlDJamYY3GDx1q95RqfTBLIsYahOCMy7pDBJ6vVyUjXCx9cmQarDtlxwtVm3PBWnWJ940nogxQs8D2NhUEhGFq0FRcn3IdOrZVwf8YyVJDNwr8aBej47Rp/8bICI6cTOKexgOZmVQBMc+FVd57yxC5t+nf9Mk13fcNTKtpxc+NoeFo7F2wfTKBMoy9Yu9aLb/u+5IgjcVxxsQBFxQ/TyO95VOYwCSr6e2lT3El4GRhIGR+q8YWSC/h83Ubqj7ToX8lRjm2WJiMNQxCeGofOXwXpfGwrLD25F7ZI/gU3WTvCX2r0VDCRLm2ZTDq/R0FXmgjt+k+Hh0aPQK9moIM7YsDptQleeJlFm7dZ8LtH8ljxVwnyhERZdtYUDO3bSb/rn/IPXU944fofT5BJZM99Ixhe/SUTByO4MTsbp47aThaCNmQ2QQxp6BnoeC/D2aJ/+ZtaDFxJcqOIXoSNc2NgwdsnKO5tDP5HE+Bp1y506H0GhrULKWSZPgY5/eP+BAPQ1m1mJ/02nDVJDuOlLVC3X4mad2uQ7Mc5NE9QgGUK/HnwKoHLmvu8cLMLGfw9Sj6XYtmzq5Zk6wfxS08m1ju0wBx3CbxVpgc6VZ24WkUN/hsfysFPsinYRwgLwwo4TE2eokti6GOGNxcW6MHGZ8G4+EQuDYpo8oSinxyt5cDbLSO5P9OaqgMK0WmRE2OLEDx8cQl/uQeByeE5GFUgwa/vyoGHpQS0jdxD2RmzaaXcKNC4Zg6OWjHckpiOw0aBmHLUGVMr41hxkiLHnPjE/x5H0McVcqzirgVr/lOCCd9H4/Eadfj09yA0bDkGjaY76fMTHZwYWsTNZ405tcYIpPZ7YWm5F28caCSx6WPBMeoaPNz2npYfLwatCT/pXp0L/IkygKRPLeRaugCWfnPhS8YJsCHtA4lrtYDEC2TRWj/6MuYFTovVg9sTG9h84SeqefMcz5f84TbXXrSbKEzLooTggkooBLUkwsodk+BRhBx+TpGjUcMO7O5xl6J1BDDSoRMeywvS7ovveffqUhQZMIFba+bR85wsWLnuJ1VnF9LRGYbYcDsGpEMzUDByNSgpa5HaIQFYMEsWbAdP0IGP39jIxQPUf9vj2zn6IJYqxLN8DFFuuxj3RwMcenAIBlv7+FbCJTCedgU27xnmYxP3op7LCTy71AiDp/fRf2vtIO7bSviT0gKFEs7kbqlJMSv0eMHq2eSkqQObXiTRtenWOM7MFookHrDBTzE6pOWPJ28H0PuyGXxnYhIOHD/BdjtUqKoDUOCtMgxWzqFTd/9Am+9kGshtQte26XS+VJafv7XEgMblONZUllctM4b6L9fJIWALSE5xoPJJD3jPzXw8MPMHr/9cTXkZ/TxCXJISmnTg8Y04vKq0HRRLmsl4aAefrJ+CV+sfobd6FZ/5tx1stw/gkVNCsMs3kar8bXBU2yryHm5mz6Bl7DZCDW869qDxuV6QEnzEr6fqwrSbdaCwdTJu89eCT/qDKPAvnP4+nUNvXG9S4tVzsNUoATbFqcKCO+FsPyqJj94cwbaXfuDl+wfQ5bU0S7uupiVQx/O2baN966xATDwBvi6WohFl0VS8ShvvmNrQzAxFar5XDKe77aH9likotqqD3msnJr8ujlF3IQGnZlwzrYdn6uWCwaAPou5mSnznjTMu2cOQni/dex3IJ74mUNUWQ9zS6YRCp6JppeQ/1tkQwf/S3eihnSAsrzHn9K0/0WPgM5yZeBECCzRhTeFvPjNRALcLJbD8gxJ0thMA7+pxJH/+FT0/mYfz6mNh5ud6qnizlyLcv9HMsZcw4l4AGugLQ1r+D0KPODyb24txotHQdLsQ1ig0g43MMs6+sYOu7Eig9f6j4f28qWhg6Au/A7/BRIXrvOhyAIlvKOeJc2vgirQpzZ1fjaO0lCFVPwhW/ckDp/5e/OxxBKJmtNLquBrUuynPBXXHSdzxLbq7KcGCzmvU/v0vPmsxwTiHNZD96TcdLlnHNoJKcP9NPlkk5/LHd8JwV1AO1ycIssD9JPaN9oC1ti+h/50tLhhRTeqBp2id9QSYo64AXt12eNvuBRseO0EFchtgkpwWOD7TBf3gCqDKNF56Kh339+iA2LyJNCNIm6C7i04GxqNaqCN10RLo29RKm4+cpdSLL8DERxbMvopiuvkCXJswjJe6TCledi0vDFpK+/N3osPKGhb8VE/NlXZwSXsMOlQFguJiHVys9R0izTfCof+E8eVbwvIZiyivxhgibcbC2o09rLl5NM9z+cCedREokPISjWu08KDWMVp8Jpfl182j3WwPKZb74MV5c5DLdWM5kUF8viEPhl0/Q+6tMHy3PwafN0RT3o8xcNPUDPZJrQJNY0P8B/vpW2Mfaup64CyV3zhzgzSR+h+cHKkB1befcJH4P/w1IYtvfmmFS0dXcqyhBXtnZtEiq3Qc9lbHESEKcKtTApV94qB01xGy6PhGw7OOUZ9zDwt+6YQJS/UwySeD1jkZgvFPMdy9yJdCbGbA6DdSpOD1gHoVvThzbB6VUAZLPlGjJTF6oGxeD2oHl5G3fTZcHJTkKW59pLTvGBk7deKiVRE4XfEfeP1RAuW6r2TjWgDR+dsw7X4x2df14vdlBlht8ITvv/LnbxMH8bb6KFCzV4AVger4+KIh6xuswzDNBhgvKoj1+/fSem8rmhBXRwbXR4N+njM3vo+mD/apmHjpDKqM9kbQJsw6p8Uz/+zjms5XgJkAc+IucXpiA867RrjcZR22XHnHK3ecp/jGWRw3ROz3eDIYOU+CTaEK2Oo1F1Kyz8FSmffg+MiOUrXOo9yCO9A29QkY/PmHjfVi0D5HgJ/59dH5RH/MPBxD/VveUEiYAn5dcAOq6/8ju8lvqXqdAbj15UN3ezdeTLqGIw+N4M6vWei5WYEMh9eS0I/zvHNxO5iW6oOX0Di+7H8QY3v7oLFfCEOTnHjcrL+4LC6bJOJSyVj4MGu+F4OZuUvhbZII/pyaQh98veHiPW/y0palv8/P082xm2GkpRDObzWCFVfF4PgGppAfSEfcX9PMrYtAsMsXJdtDWeHCfTyx5yrGbJWHg7Jn2f6dKI2yms2ecu2gsp3Zd0s2lZ1uw9VRuty/yR2lJwEk9B9j/zon2v++h1RstemBTwOrpLli6AVjVu9vRhExZ9jmaw6X3zhRrdMaNtcPoSWynbTS0A3lkkayxb8pZJurxCXCIrQ3ZjzM1D/KbyXtyEZAFO7u2UfP96xmaYNkXiOizCM8PWHFo3Jy0h8LcqFOKL3aA+LSLVBnays1dZwg9QPXSNP7AD3c7MnbEvIhJccaPsd4o/SvHahW0k8J39fwq2v7yX3nfjaqP0caiWvQwccd4w6NBlONGWydrkMXTbLpSkI2L/5+DIOuGpPpnnu4J/UJmIXVsOB5AP+jUyE77QJJHQyDdcvm05bQ+1yQH4MqqX/IKCGYylbd483v9EDsyW1SHvpO8w09af/yz2Rz5yupvTgCjrcG0ay7Ff7VRIDqD3voOvyFzohq0dK3FbB6tS+rnmymYmNvPJCUAUvMV7Bx4DX8u9Ucti0tgeWDUiw/pgblnWfRxtO1qHooAiuW/IQfZYPQ8UmN3h+fDI39bahiVUhbVPLoj106J5bpgvYoa+jWUIWdc69TmrYwSo0zh3GNb+HJezuu1r0ONd3XwdR4M98vS6KQolt4e9o33F1QAEPvzcFEso6D9+Tjq2JJ6E6U48FWDXYuN8FY/7l012QVzutdzH+KR8Crtydozs/nsHRZPokd3Iqm9dsgvG4jRr9cgO80y6Hv+RVe4iYIm/o3okn7SZ58/h69mNZFYyYHY8Tu9VzY5wjVX05jnrctjze1hIFie4geeM5pKzeBdGYkFj6eyCbQij0OyaRh0AJRI7347H5hmODmRb0G+dD8KorVN4SQ1Ngl+OeIHpYOLscZ+86Q1hIBDh5nBCti3uKK6GEQ6/LHorF6dM7AmHvuWvH98ma+diYCfgvqw9TkMWB8KhT7tpXReFNxTvwsQr6hjdTuFUPjvxyGiTbW5HuqBWIaRKDjVAOcxmqe0l1Mb8NMSGLfR3yhtBc+tijDIicm/w+BvNjECs4v+0RxK4WgV7uVoj8P08rmmbxoaDJ4XNyDr8wXQMedO/xdaSxsy28Fb6+/WHayDBRMTsLbO2tp2/oKPtLuxPRWidQ8y0nkPwnoGtLBgvXyoHyGuVcxGPcEJeObmGUUIm1GNbueYPXMEBiYoQM1n8VI8LIETjpTDF21HZzyahPuWByMSnZbeSi+GOdvnoe4XAS8BB9RxYoE0Ilu42WZO1jvmQpomx2iS0cRfXUZq56kgbz3GBh2ughtFc+517eB1h2aAqPndcD9M208Q38Xhu7Wp7MR97gqagwEyI/Fk43v4UDbFTKNOwKuyV9w/ahkbr3gAdmf3eF5YhHv8dQDmY+zIferGwSnn+AL3U4UX7MWn7q+5ITrd+nuismQvugBbVcUApPXv8mhfSX2vj/OM9TX8p/FkqAxdSNPVzrO407J0rE2K9ooKgWO0olsFq2BNc4HwHWMGF9xPsW2tn/gX8F1urZrBx75ehsF9mmA7PRLtNHSj0yV1+Ed51jwKwqh/nfa2LD5NruGBZDlngX458EYiP18jWrz6ulhtAGOKxRmi6Z9sG17CChrLYE/rhcxW68Dvk0cBRX2ERxeeY3FH1nD0YNKPDCuid9t7cUZrrPBiObDx5wRHJ7KEOX6ELLWxXNNfSj/Si/lyF5Ftrd9Bhu2ziQNhxN40cgd9+wg2DnLni/qPuA42s+L/UbzrSB9njHgjuKyzjxjcAX/euXKiaMZtJdcoWl3BCnS5gWIJz2HyaqXobXgK6k9/kjKu8xozO7nWLnLEoqnKeHWBYkwYuU8bA9ei6sogtfm+PCuv5/pqPRrmrHJkzKY4WPMJLA6tBXkzsfy5Sx/dPNyo78wiM/ENmJA32hMyiuBBzNEICtoK7eNt0SRX6/QxeIxO9qYwIK1tfzWR5JrGp2x9us3CGxXhs3XvPFoVxaF1F4EIX1bmLPuOJ9v/IsZIbK8sgugr8gcL9vqg4DHYU6TzEfF8pGwLSuXnkXtQk85Jd7zsp0pbQ/ELP4AX6eowKev8zG4PovOHjekwym6lNIC8OHHVH62RRE+1krQC9epHBE5Ek7HO9NREx9KGVcLhwZtabutC4V6RMHMH0/g+RMd/LNwKi72HwPKrybQ4N4kXiIQRe2brGmBdzp62BeRrMJHvDLrHClLfSWvB0KgoINw+r809Fjrz6fsitHSZyxXNh4BkajH/Cx4KtoEZdCu74LgoZqIKuWb4BZPosyd//CobAXWjz+Kl4wDeZoOcdeuWpjRYAoxPtH4ZdQevqPxkfuqftMkb09eYX2NHYNioL93GS59Esx6cnrwoUOLGr684rrohax7TIQUm+XJL3AnvV72jA7NLAaXLjscd8sUVk0dST4XTdhlYBNZXfyOe9buhciQrVhstACdNxRBz8plkMcjIW3lODTyQd5S18rnZMwg2jsAVvx4DlumO7Df+ELMnXkZnG/pw7q9+rRLv5FVFzlxrshK+jl5EX/In0rjL5yBDps7bJ1RxnvOA8QceQufJqXjtBv1+P62JM1L3orGiksppMuKG9oVaUPsXlJ+ZQvvhHzQ10iLFnw6yLLZrfg66DEFzJXHgNfnsHGMCOz+8wg8F+jDtPf+2BI+jcO/q0FIaCvv1jyAG+qWY+w4ffooJEfSdS34J8kOSufEcve+F6QbfxQcoz6CISvzjI4W/qy+ho0tlNixxBvGek6CV766cNcjk/7oAJZtHAk16qk4K+g1hS0yYb8vMuBVFgnpI0whdexBsNhF+FjRC69alfFp8+d4N1mR9j0tRsdxKnR/+zzSVTCGsR6hvNFnEV174Ahvt7px6txuzJhbzttydKH79CKe7ziO38eLwshcI6qQ9eNE18M88mgPdExOI6VGGXwc/Bt//dvLdYuKOHu0OZSF7wD5WGVo6uyke8unQVhmBX+p+YcXp9TAXavvHFclSoobJsFvyQ60ONOEGudc2WF2NbxokYOmEZdQsw+xQmsddZRU4VIZKZD4dBcDvkvzlaqbfP3JbtrpkYGBtic4an405Z66x65jPNguyhq+ztGH2VHT8PDTHNKblcMCFoY48OE6Vu9fyfdWy4Fm9Ux6E2gEMRUP+FqIMs7f0cmb599DUfmLuPPuC/57LJ68q4I4auk+nFwpB+7250hluJ5//E2iMSKxKKZxjpVOBZFUgidMEV7EW7Kf4En7yTBySTbU7bRjN89lVK6Uy3u+HWTvTEv2fX6I5r2+TMeyI2hMuxEka8lBQeRGTL9znmLdpfCJ4x0+e/kIhdSIwhnHQAwOF6KjRuow6uwLCh8fQSMOPMUqSoYf0kfQIDEW2/2/g7jhXypPPkoZLtbw1mYBLoyQA6t/Xyhn/A3Ki7/AaVqmPF+kEv6xAc46fxGWWBmCxA1L1hn5h94GeVLtEeD/7ktCdeFriI56QVN1k2H4qwtNuDYZfhSEQ8OfbVga/g7fyMhjYWwnpVxahIfjxKjoyAhStjyCumgMDl8yoa3di4YfFlLS1/2U+OMnZux4SEOBHaS84Q7PidnIl7pNYMBmMe196Az6p7RZPWItB1StwW9vZ2LPGeLPw3YUutSKZvtbw1bBraDtL8f33rtxkasGaA1fgvWmzDKzvUAg7RdsetiK6yZPhP5vFyFxfQT8pxyAWi036SKksMyPZIrbP5EaDSt5SmwPFRw3g+6bPSDsp4Stch/B8moqmN/5CT0+08nQehs+ODQS9q5ygEcvFGCD5WdSUG3m6zQezU3vU86Wq7jDVhu/TN5Dv4Vz6JjBAOtqCsLuG6dBoa2UK4/M5B8Tn/KfmtXQMnsHD/gf5t01ybA4yRyMjaRBtfkzRjmd4w6T+ahqmwnh0bGk+NuaS+4Ai20VwhrV2ex3TQzeaShD5aUhWnPxNf+naYgTtb9RZvQ5MDkkTcrv/vBo4TB6WiIAGuKPwVQTcL6IMo3xkmHD5jj6sW426B5cBCrjz2O1jTLcOicPhydH00/r65R4QB9my4XRhcZwzvA34d07z9P83kacunE1zN0oBp/2r+bun5u4X+gwa6ae57u3f8C8Oiu03iKP1yrug59FPA+0KsAUAy1wOhODIYXWeH/UPWra9ImmOwJ9Gi1CXXNLmcvbCR3GgrnRL7y1eh2uLs8C3JpDYsqBPL5ymI45lWBjzScMUj+AEn+VYXfkH4hd2EoPut3BonwujGv0h5lTb0LTnBZuleokqdIK2nxDDn4NBcPGTiEuPO4JuUnCOFWZWdzMABPP2+ONCjPM+5tI3TUW4I6qrDGun+tmKcHOa28hbjtSmIQmrrBywfaLM3nk9Ch4vFANhLzqSOtjBR9YJMHqz2px7Y4/UN5wEArXhYOHoxHnO11AxTJj6C6IYMvPSJP8BCHswC0wf76QX6Tsp+ZXrex9RBBEdhrSGlCCZ/c62Xq9Pd7UtGDr0tGsGpPJTttnwNmOHopyr4XwIBneFakPM7b8hkXfl6PQl43Ufv82PJRKg57H16BcfgTtKa8nAS9LXDtNA3Ytv4dnHq+BgMl6fE31C0RoyJGdTCTPFM+hc7sHaZOpMDyJmAR585ehlm8m7h0xjIKtZnxHVII/T1hHhjSC6zMd2EHzJph80oNXJpMx6JwbxxhthJx8HX7hX4ZxDfP49jN1cM33YSvrs7zFzABuNBTC9OhKOK1qCAfnLWEZI2EKChJjvY9pdLjTg4ZDfOA/H03YaefOE6ZV8YGX3lgydIhSf2yBUG9Hej7tGWR+Wo7ztYGefgA4YPuN9RqesPM3e9oY3Ee7D3zHrgxx/uh9lh2eepFhrRJ5qRnCqDmLKfWqBGuuU4LYQnW6/XoHTq16RmP8d/Bb9Wlk+CEeHJQInnfsRP38TvxkoEwrNILQW3wDaQ01YGtmCWupBKDKJS84WGoDj01uw5oAe7BVW86fdO5StswPShG3RZ2ZedQ4K50E3gbxWjNb+H37Mi+5e5VN5X3w8y2mpcadOFkoE8ttD9JoOzsycFwIQzfUYf3NDBj4WY+5H+/BY9n/UOC8CI6eewKfrjNiZZEh/mwlQH9qJaBWpZvrNgdRT4I4t8234n+vJGHUcSmaPlUP6MAQ94dWkFeFJiw2HcClBfOhXfI6avBTytL6hJ4PLVhFQYfObvKg53ckOUdSGOQOrsYD7fk8sTOC9jXMpcJzbeSbvZrtI56yqHoa5f47RH3vjcF3YB8l3SkkT6ViMFVYCE/HzwQ3F1sMs5gPhaIGIHixHtK89eEg5/MVXMvLzjbi29fRrHcrh/q+PYWefRL8xdsRErkY5eIl4e2Bdaj84AgWLlwDmrmdFKZbxkN/P/OxTWpUmLsFcnSccNlnLdgbI4Fh50vh2sIInJlRh1XXmkDvVhW+Pb+bkkJeQMakZ/AihKDPVh39X5aD/SRPftKvjeMu9UBw+gYuulOHXWtMaJrVYWpdrQCjdonjriQBOqwqSaWDa3ma+XZ6bprHrgENPCnwEz5b+oOyzilAId8kh4NT6MaNJSC3Mgpc9MuArpcgVz8Hi0Q58n1zF2e/EwDpxiI8GfMfer35CnJuWnTA1oUiQn8SZyBLzblF75PPQ+busZDzfTIHZNuQqnwV/jUfi203unm8P0OoYSOouzaigWA7h9Bk6Exph4+Bp/FEsRK5xRfAwroxdOpABHZYPqRdZSMw/fMRnrJLF1rCD1Cdyhv2WNmCvwSLoVr/IbiX+HFepTZ7j5LgDH9T9MrTAyMlUTq9OJ1zojTpfNgo7O5+g3Jz9WFZ2Sp+E7oOu66HcsMsCVhtkwXN81JI55MOKSbNQu3H4ZhbQjwUcBreiOZjp104n7goAQE+P6iWFvGEgU+k9dyHL6bM42WRgeC6VZRCFFIQ1nfyW29NuD0/n0d47SbVVXs5MiqHrcUruYGCueJGMPt+uo/l9gOwcKQU3Jm6BquqnvAnuRMc7DyNO761wfeVBXRi42bWjdGE9+keIGxiDtW7s6Do80uSiXtFBst8YOjbNQ4T9aUa7+kk5i0LOfazcF7peLDvWwv3sltxZ8hxMF0nz8Uz+qggciykOn7lF56OtLhrLi2U1QTHCYtBP2sHfpbIoBuzRkF9mxdJBjFl+inQ8V0u+GZKJytPsILBBWc5cLMb/7ZaCzV1nfBhM/GMDaVgrmSED1JS6PnIvaw/2ggOJCZAwLyz2IQxnDFRk61mZZL/9QjY5lPP3iHrMNzhIG4tt4FS+xzqWBzGq9v9uM3Yk5aGfmatA68ouWQRXn+5h5+5noJYIylodBSkklp5Mrg5nbR6xGHWrnF8LvkOt3m95shhT4rsO4lW7gD1xwzw+2A1fZ9jxjaba9ju+icSDRTC4LhSMl71COK/IF+fog6z6vbzwxfDoN94goue3YOpIx/jvkmj+NKo5ahwN54FVqui50IFmO0riPu0ZMDIvJy+5O3iC0F7IfllEpy2q8GEiNVcrT+Jc6SNQeTHQ34jNxYvSxTQgQV/cGVGCYcLD7C7VAgt1EkFgYYn+POJGkyszOQLQQdw6stb8HDJFjYXP0YR+jd5SrwntLsY88idwfB6qxqo6feB3PPp9DxyLptsHqbLfQqQcTwRjmxcgQ4RCrTiUxudD0JI/PQE4+ocwaV2N+zeuhDeB07gmkf1dMjdBd8+SUOVqjC4eNoGqiZMh9zM5/xi1UmYs7WKm+ddRT+TZxB6SQt8do2jEL3VdMNGGQbrbkD+Bi069vU7HQ0uxr/2gtjjsZS0rCyw6MUgv8o5g1U1ViDWsRQkV4wn+dbfuEhOB/Y5lPPYLAeYUhaEheHZGDmviHOnTIZTco70bHkJP/Gv5bTASVD1Nwl+dYxE2w9PUH/PUfBTSGDDZePhg8gszJ6QA5Ceja3HDeCYyXQQiXcEhSJz/n25n+M+i7KpnRK4+4aDmr4dwAhRupW2m2Qy74KdcAJVri/C3LCbkIgOdHC2IMxtHM8/9wqChJQQf9C8znZXNHHnvF6S3BDG+ikydKkkBRNKreB/4u5DEQhFDQDwPyIrkWxSRmREyIyQVBq2BqXQUJoaRmhRUiKiaEglI6kcWSmJUlEpGlZRVlq0KNV9jPskX3GzJW39zxzOh3vCyzBRPJk/h9Tnx+BcuELW9nV4J/AZD2mMhFHl5Ri20R71DRVx4+mj2FvzCrNMg1hxUSJtWXIKQnx62NpbFNZ178LV9sVk9cSaxuQVY8vTPfwnJJ1KMpEO7BRg5xRvONygAXoLUvCvmRxu/XmSj/rIstT2Psz5nMtyE+bz3OoteONdEo/vFgKNcyYgv1WS2iZ4cMI2V3R6fQMmyErj+V/VsCawiz66W9DhAnm4WojsYXodWmtC2UJDhRv0P1J1/GPIfTwb01cEYaO9Bg/V6EO9gCB32xjg5eF0jswNxsD/+vCXowGpK5TzhARvuG6uA07TjeFykx59pPU0cU0MS2SFYssIdyo2jOAtbTrkOsUIIgrq6WK8DNiqS6Cgbz9IHJqF+aFhJHRlGdt5bsagyVWYf24rp68ehcnFZjB+oi8LPPRltc2GLFtvxBbi1jyuV5SeuuqAiOpurLW0Jd0cCSiLfAAyiqk4pqaSug6kkrTpQRQYEcZX5RsheDgMfh9eAoWp5rDwgCzLRGmgmJsgeewxoDtu3ugVp4E79U9z4M0f8GplNoOGNay9OAsPGTUArttNTxR9yKdCCU+9lOZfP/6j0NfCEIA2bJc/Ei4rrcBnd+dBdtQUmvh6EK0WicKXm8U89+k4uJVhick6b6noqhaoPXoLSvVP6XebCNtUpLNVUCd08lrU3JSCldn6NLw0B/Irp0P5+NNoVijASo8K6JhqAokvWgwTXjnDrOtZvDU9g0L8VtFISYItme/wbs82+tsbBTvT1MAE11LNyXieK5SFKRuO4ME4DS64PwoOFyfge2V9Xlo5RF5fi2GE4EgMGFoHU+bmkvFJTzo3dIcDTgrDZEtBfuWtS+0hYXA+yZ521ujC6eZbvCK9k76ceA0NnQqwvlMc7v86y8aOdyDQPYOKG5/hdMda+t3/mCot/nHaiDL4Fb4NF1oJQ353Kvceek35ae9gZ8Eg5R6/jVa8n85hC1VNLyOTNbV4N0sAnJba8H+Hv9GkT1l47u18yt9xh6UvJ+Aa/2x8te8OO9c84J7D+pBZEw8CnwhCqvspei/wDeuFNOu4Dyu4ldDTB1nocZ54b/802Pf6A5ee3wnjd1yEXa0T0DzUDaJgBx/0Xg/Oq3fR75oIOK0qALNFa2nkJneWkNLEYdFGsrObDQfuSCK/qALj+y6QuHErl343gtsbiumX+hOwCrkHQ+f+kZPeMfAPKSTUXonrR7XA0OTXUHJCGjb4raPPPwtIWuYzukS0o2VzFkp9FmaXgFaeba2Fc8fPoOsC00DL/B+l3fGBBsMlaDzDDia/FITg+Ll0fPta3jyzF8ZIT8f140zh1i8l3Bi9BK+fUuMC/2GwlnGFM3JfWHB2AqJ7MZQ9Xc46mYow8tZ9rhdNp/r03ZTy+SUe3bEOw4xDMSl2DLqvvIZvjJPRWE0a/uocZvWZifxYKJWGb8SAVMwunpr8C+7VPQXPFcfJYlcaJmy1hKWH31DH8bfo//YjldTvhkVeC3H1El9cHq9JpSIbyfbweV52TQ0mfZBn14hSSloWh6nh0uTu+I3W1Znw8ZE6fPhRK9lMOQ+tZuYwsOs7rX07jeYUmUCA1RVQN0vhbQMJ8Dp3CFwvW2J2vQzk7DaAKh1zaowUxr7fo2GNWT142KbCi8zpOPL1UrCfVoTafpth6SsFGBdejF0133jDg30o9jCZ3s5IoqZTRdBx2B71ew3gxlcGxfl6UKowgw9UaKJ4nBHd1r8Obel3wO6ePewui0NPPUe2cvGFoiQBOHbJkkxdmzgjZhpvFLKkxnlxZH6jBeN+hYDIt3O4MjsA0nvMwclJG6sChdmgxRU3H3gKbhEiVLt6KviZrCfBkQxh29dB7yZd+BpWw6o+Dujhl8Lpr3248MYSzJ45jOdgITqtHEZxfSf6fXkyFL4awb0T5+P6wDx6mO3Nqw+PgxXjw+jh0gX0J2YK33vvDC+fmMNvk4XwpEiXPhRH4SCfwwvHFqHqVwHoO7qKjILuwbvlHTijbwrscI9n76pNtOzgc6rz9cPylFASmfQPb6jK0GNxfVAcOwf7HLQg+7U7Otz2gpIfdbhG6B54RzugrkYJxEvP4mF7Qwz9U4I60dMgpM0SnT7fZKGn+qy09Bz/OKbIhx1/4Iq2z5ARcAH09lkwfR4HlTHr4akrwugcE1ohuJojGi/zUwkLTAtJwqcZJ6lm0jrwXW4J0btvU3K+OOSM2Eib7kVQ7OAevD5qAfvc7cb+Rd1sjlvwZsAYSL4jitNUi2CN6lLStpUkoagkENWvgzDbYTw71hB1vJXR/dRUmLNnFq8WOE03Jnti0gxl3nuVULFBlQ6NewXVRndISXMdqnoIweU703E4Sx+l2y/To8OqeGP/SFobXskKGjoYj4dRqtYBOlfIw7MdJdyq1sYeHVastrWK3L+r0PzFS/hn4TwYM3k5OLY3seYxMwjetRZ29X/ki/15OKr7IB1UmELSJg78ftpG2KTwkwsOmdDwPm2wflgL88+PoQzvjTQ+oAa6RF7xjZhw1B7cBPNzd0PNQCnLaeiCdvxsUFJOhxqng9xdG4cH1/jBwjPZnPHuDFVECvG8v/6cFKQLiq1h3GwhBReCnWnN4otQdqALQuW+ktvAdMg3RXi0NJ+0PPRh4SYVdsrYz1JxFnQz6TNf9LGGF2MTWM1EiUYvWs6mWVsRF1jASC1Nmh4mTAo+92iUuB+YpQ1gV2UkdPfeoKG4cGpVWk/BZ63ggHI7r1Z9iykPb8K9b795Ve1pLhj+hinOISykbwnpllG466gBXDo/jweTbbF1dyCUPvNAk8xD/CBpNcKPdFwW+QneaWeS8F8rODTficve/WAVMoHwrb4Ufa2VrCOMMNz0Na26LUZGGQ/psaQ8nHhgw4ONL/Bw4FzWHM6nrzeRvqRNhtrweEyf0E5maX78+QbBv/G9sHxiGGVeEiVx6U1spqEPYo8kOFR7B8Y0KvPzteMh2t4Y1inMofgNQSyGP7GtUgcbb2XC1CmtUDZFHurzKjhrWJ7WFZuC94l+8jwxTJ9eTUTj/lSMGVgHS+ouc4bkB/5TMwv1s6fQ7ieWcHNoPNZMy8NntkJUXO/D22840KXGqzR3rzt6u7ugzOp9bKajBo3Hs8lFaYhagpp5e1slPfYow+D9V1F+kgq1THTjedte848Cc3A5FQy31G/Q1Y+6LB5xkRJbzvOTyDA03bgSY6U+0frU27gtywRGJw5A6EM9SD5pCnIqllBhOESblN35m6Il5xx8wS0jXuBFGUWw0xlHf2Nf4Yhb72D3KkvelvKWJTaGwoaqfWjhbYruB83IjpRB3fwtTMr3AheJQgiNn8Bl0Xfg6Mm//L05B+cvuwBjhnVpVKIlRF2/zOdk2ij9kAieDQYYN/sSP749FZ7XykDP72aeO1eZ1So0IeO7OuzQS6Hz+asweakM3dmWgEXh57hgcjkKbCiGSrNi0hNmGNaNxgeR53Dbmo2UfqoOH5+ZSqmaYTRlWjhFWgTycPNmPDtBAtR0zuA7cTGoUxnE/tBNoLpfk1Nt1XFW4VG8mq6GkcckIGiaBrSddIGVhfNhZN4+Dl8tz2NVlmK2WAZ/26WGiddOg6l/FL7xnQIk38I/zrxEie+XuPT+VdzW6UIxExw42X0Ub3yyija6X0LWFIffO+vwgGMnbRC1gXmNsnR6ezWPtlSFCW9McFGyF85e3sofUidCb6AZLV+Qy6eFXtDrGQogNGYO68rPA+3lWnBTIwI2K81FrpCBOfP1Ue6gOt/c5ke60bH09n425pzZgRcUa8ln9Fcc8AjFRzqKcCfoCc/0Lge7LSvY8HgFaIxaAAfMSjBNyRkm7XoNiY824qFJulCj6QKyzj28p3Amx/SvQq+ZYeg/4wrUGKvQqNuSNO62Fx7Pmgxfpr3iI7ru9PC0HbWcN+L8m7Gcse0Q5Qfkk2jsPHDZcARc9ZVB974ClZw4AKcGFCFs5UxIGHhFMicb+cihNzBv81i6eesg7JCbBP3RW2Cxji39+R7AU9z24ouoXyhgeZUVIqdDx/3x0BhOuOyGEojOPgM/k61JRjgK/ZoWo2bOWqxIFcWIAD/ajaep9e4JmqYsCSk8TI1iUhTvewEfvFCltEOR6HZNiF7rvgP3eim8c8ONGvst4HfML1JdYgHiLgm0VF2fHM91AgaJwM7edEzqG6YM+oQjW0ShutiIqk89odLkV7g405SPuL2gNYsWMqrnQJjxP7qxqIIP+4+H5MVHeeUgYlxXM3X6RrG/+WGYnQ8QFWoFVm6DcOFWLXs2TIe4n00ocE0STaPekf6KWt4RPxZVRN6DqHMIbrJUpwMXLlD8nfHgqiICbwNaQdYsm4PWqODR3d/gVtswL7Pw4Her3GBKoBQsCxCFbg9NjPXx4Rf7B8l7YjzM+eROYzRv02uvdOroe0LvnU9TaJYEpKw3oEhvadbOjoRxcIPqPi1EcdDAzTZz6PwiB07cOcibjceDs+4bUhBNwWXF3eTZlUzbei7z9PhyKhwaBwe/VGKaVCxYRctBzoY8fm97DF/creaE4Too2O6J9WKSbB0Ryg+03Cjn7xB6jBCBT9nhWNFiQT9viPI3uTi4WWFKMr0taAQN/JOF4fbP5dioOwak61V574YCUDzyA3Uc/KFoYwre6rlNi8NX8vzJx3Chwjd8txtAYIUixq/ZA5OP/gSBrGGMWN2A/e+8+c9yF+rv/sNH9xSjb7EivNmqjEX+5/l78m5qjulg20eCqBA1gy5VduHf1HG03eEjLe0fBwXTz+OiB1Nww3+SNK98Py62Wg23lz9iqZYaMnRpxUOznrGZwghoFJnI5qyKYwVVYStd55oPR9HgaxAqhbeBzc5anr+uj1N3CMKNww943FdBPh2aDqmjCWriskGn6SjcUZ0GKm6ucNS1gxfmi8BJ8zOUMKcN2uNKcejAFqxmpnsFVnRd6T4ZCgvBxJonaORjBjZpx+D65CfcXSCANzwPs5fLMCrvVOeZgpF07+hz+Ou3imovKEO9cyCaFh+DBdMY+7aPAqkxz0CI9GnMcA15hZ2kzAmT0fCpBQjJHsP14hnYt/YXVeWKYaXuVkieaAGFcbew8mA89Fo8oEDv6XD5XRl6H1Jm54+jYe4ZYXRb3wz/9HbRiLlTOUBDlY9uKMWNG2RBSLmQ/bzSsNs+itZf9mJheTN4x//QskAddNXM+X2FJ9x2BShse0rb09fjcs0lnLEglMu7q/GSbzfd3KTCQ95ZaGPuBkZfhaD39nIIvHeTxk16iSekRvAxqyCYu88dFy2ZxL4y3bRUo5zWLZkORsIXMNzuAYUNJtPgpU7WuhYHPaaJqDG/ES6EV2DPg9VgZykOnh/X43lxK9z8x41wfQclT9Hkbz9kMFHPmlaJ6ZKxQhlW71OG7YvnklhXKY+2mkHaCx7w/l11vKJ0JK1aqcHS0SLgHPMPI0QtYc/j77TmqD1KJq6lncXSKDBfA2ea9UNw5mI6tcmB34wcS+FFDEvxMt6Jusn7vthTgd0x2rkgAaqeBNHP64Ywq0cPsyYFc0yBCDQf9YQrYpq4VcodP3hs4IvlEahr24timqUQMnsHOY3cDJGaxrBnXDs2eElS7/N0nqI4moy158J5mVGgHXmQGk/7c5lJG2YIiMOhCS5kl+mP++k5ezqehumtTvg70Q+1lUNB4co39n/SzutPjofL2ekYUVfBP09+AfmpLjDtdhmU9GzlN9ryfNP7H6urKZL6Lj3oyCzlpROssVRahwf1GzBXpA/jBoxJ6Z03ix6og18m5tCRZAV2c4xB0H8l5Z3vA/eit4T9PXjZcwLYOvjRX6tn6PUwE0+9Gw2prZ14umQ93jutBxd//WFb8zSweW7FkJ/GAyef88hZNbwqUha+dk6HdSlNlBM9jPv9U9gl3genxeZSU/8AdarOYd12ZfgaqQk/es15+O0/oLM1MC92FNj4leLJuEY8O/0IOW56SI7ciuskjQDpORz0sMAt0w5w0KrfNKu4n0+PdCb5dyo09v1C0NHLZ4NyMwjNSsUevyY0XhiFgVJ7uCh3NjTIyIDpwcPovD8QXB3/ot8uJRB5bMqbawTAd/g/mNlyg77/u8vPfu3DpgFjkrdZxGolSRigPAakPSLxjZco6cxvJrft0rjG/gI+GLjFGoYlPGUgAwae/8FcBysQzSjGwO5B/K2TBSfWT+E+jw3w82EV5+RFk2uBDq6waOVpZ0bB9o4ZePC/Au6QPIefVQKx78YAfU/1gdq9xlyzJIQPJYzk9AmaULrqGxVsmAsfcnzB+JkYyoQRe2ta8tuFmjQtdAnM/6KIu++KgIxAKYxOOc8LVbXR73Uy7dt2muYefwB7bWrx2TUTnrX3No1zEgPTjzY074MXTGgpx6IFO2Hrgm3wLV2H3AMzwOpqD4SFFEDorckw6+hl+O7RyW1m49j06zBJr23iaTn1qBNoD9tVhLD0WQSmSluA3PgzeCg8nJIan8Ld9Q948QtbzDd2Rx8pGz5o4QHGO/6AB2jB2mgFcjOZCfJ1xXQqbw0UGlbjNutybr2qwsWluWQXfwwrOnRhUd0iPrcziYMLR+Or51vQr9iCmoMHYZ+qHN7pU4fpEY48VlAZch+ewlCnu5x3ro4nJymzY4QAWnxO4PePTuAHPTtY3GAMnyUN4PJJMTo+4zTs9imDiiQPDhUoQx+/LPZvzqBgqbOg+MMRO3/KwMPF4nxBsBL/HLxDKv3/oXTWW1wzwQgV58dTtlgHzbWVBNG+ibA4exWtOL6CC/dfRXf/i2SQbofTLSS5/I42pBz8gMN3TVjwijQkT7vHfAx5/PdRqGCghRILlmK8fi90Vp3GjRMtwCNwInYvUoHJSeY8NskAey9nwaR3j1jnjB/dTmmji+L11N4kibdWtZO7oiQMGdwnydK/6FiWgWKVLmTtr4Byn0fT3XsFUPk9nDcHK8BKcdP/m/87Y3wV2zSugCvP8klpsSJsWfeFN52JxnmDgvBn0TPSaZLkoLsTIapGAZ/qvINYgS76MsOXBiN98fHTPFCqLmC780EwGDdMGvdEYJOAKAenD+D7I/nUF7kebk5cDNrP3Oin8gcuzAvHvdKXIM5PECLjjoDTMmfucfqOgwlV+PZCMkRZEP63fCQK241HHdvb7GgwAmb4D1KZchApVSB0584jZ0MpKC1vhIrk2RiY/g+v9W6ErnYrUIyZTT+2TCPDzGGoT7DC9892U0v8frwwcT/PeRBMJGcIIo+EwakyH7d/+AZtCZNpUeR71hPaRMXSAfi35APMeor80WU352sbQ0FVLx4+PYbUO/fD+UmX+fro2zwj1hdDL3zBG1dO0OWuQUiu0IHulauwrjQWEz/OgXEL/GDrXFfKGhPFyo/acfyNFlr2VRHWHTODQU9HlH/yhjcUhkP/1S5MnGNCYvljQTvsIR7qXUBaN/p5lIQCzPnQy2WfXnNIjxQ/6rkIK7mN/I9/p66yXXzN9SZN26iESU/HwbMqbbDJD0TljwvgXNYqjHKPxCVfXXBuVTQMhU3G4ISpOGG2MtyXNuerbmOxKXkxTg9MAAfDbxD65yZuvWJEzrp7eZSDNYY0CoLQk5u0wN8Gupa3QUPTLrDQeUNTtvmD3YYkEl0TAlcHhWihmhAMKApC+qt+en8tAefmtnJRbCZrp9yCZ7IP+M2eg7BYZjE8+WgMF5q0qUnhEK15KIY3IwP5TX4qOI3QwfbFaXBBuhkCdgzzGyOC71eKwE78BVwcF8ZrYpfCFRcTDlu+A19kbMSla3OJso7BKzNJmB25l/LHtdHAFQt+fCiaujzN2G/mSfg3mE5JYEgNK+bzG1ACyZ57/FmmnyaN3srvigVBzc2Ay8ar8XCRKiVurSOtWB+Ifj4GNDalYP0qPzzfN0TTf+rjvOotvLHsJ/tpBJFSZiYXX7lPpdYTYfbK+7Dsqx8HpcVxQ0QaNbSOZu/OdyA2WIdP9W/y34mbaGyxNniXdPH0+/24b1wdOMyoxvtmv3le4l98Zn2WtlknY1CmCN01R3gV78JWjup8Ql0bDT2qaWuSPWvPraTWEAHKjreBwm0/0K3aAqyue6NMyHOq9xgLrk6VmOgnzBY26lSnO5Nc9RLYraUIXE8YQ3S9M9jZ97DOHT+yjjnIcg1nKd3gLpfZPaEB1WxY7V1GnpqaMD1aia3H2dKDIVN482ouqCdKwvitj/DowEVoCJoN/9lJ429pCZA1XAUjz31gy8s38furWHhHYmh+Owf+3FdAe9HHdDTemouOWkHisSbaHedFLFfNne3e9CjzHW3z3gjVimYs2KrIq3MEMXP0VJjgvRQfvB2GqIIwNtzrBCenPAfjGhNYlHGG+4QVsWHdJJyXrwMrjCTo4oYiUjXshnbNrfyuOhlPlI3gwtPfUa7OAbyj1WlnKsHY0Xep+vZOtJFVAIO16ZySFwxrS26TSeFk3CS5GmMqIrl5iwbMnjeHvdcHwrWwl7BmlwZ5bm/is8UeOFnjFr/2Diep3CQwGbSAq9In6Z1gHP93tpBmT7Rjfx0Lajz0CEza7nJ4iSh8T+mk8jmmMHfTJRY/fB3XmS3hmst7UfXjRVwa/ZlHr9qB8aceQ3t3CIs2CoFu3B+6J1GI9X26+OTrZgp+I0smC6ToSWogPb6jz393+vHbRGt4qfaDAkSaMf+OPV99Kk1yWy24OfIuVt/7RTtOfqH75b3k0SAOxZ7VYNjzjw6dDYQLNRI8R22ANkfcIu+Phbi6KI6OfavhK0piMO/+bVJP0wRZ2300VCNDv96egIclqnBUqovooRFpLt4F3o2KsDZ9Afxdsxj7koQhYvAf+MhZ4HmrMmwVeolaBpPQSugAKvQJwyMeRRojSilP4j+YfmkvZbrkcaXwfZL/94baP8uy0qTL/FFfHPQdx8KsCTYU/OUMB2TdQjMhE5wUlks/rPM5vbeMbq29Q1XDxpBU+IPE73tTjbMI28yLgV/rvXjRwb1gfAjwcdVDGD0mHYWnTwG1uoUQlfwEUmRS2WJmNeio34VSkfsgZRSMSg6jYYn+dNbaKgt+dbvQa+VJuNzRwXZP5kPIDHlaZ6cLtdOiuXB1EeY3ReDYQDF42uNHFw1Hcr7VY1IalsaFgUUs4CyCK6zUaMbVa7gi8Tn+yZoKa0KQrcvesoO0JtfM0oPTeY/oSN4P9pu2GoalAK5olMLYjdYw5mMy9H+6SnXPGkh62ADhSjRleCrQTNFJMDs0gGW+6MK2JA0Y2pJP69zu8UyJCbRo/1PsbpSEshhxKj8SDw4LNmHSjk2kgXKw6Ug1dHX0cHYwQbuXG8gbC/CgzximHTlQnvCZAuyqsBEEQKyyFYPdj5J33xB1vTwPnc+0WPC0OQeqNGPojH9cFtOEsovHgIqZAgzxJBifKAIqbi4ku7IFbTa5gXbwM1z2IQPvHW7BGUUjYGr5GjZV20EOR2KxM+4eLxNowN/jXPi6iDrr6R0n18JwmJJvBL9PPkc3mZ84K/QhnFBdzPHN0dwhtAqODswG1/g7JNkjjq+X6YO+wBiyD9+P5yesornPk6koQZpdBu6Dsq0P9HjcI+96YR7daAiXwk6Qr7MKjjD3hGkmr/D87WsQ+kUEZUuFOXdXL8Yv6qVxv+TgRZ4M6ylfJUmZHSBipkaBrWa08cxkOJH2H43uzOfGaSIUu47B2dsUHi9rRaPYnfSlSphW+Nfj1Md6KCsiwjU7LmKE+iMUUZ8KzfrHQTHpD/nNdwGNvGJclV8K6w8c4Jo7wvBaz46GpAT4deMYmBJSxlVK5ai9dBPbSf9ibYFQTFg6ATwPP6Y8HSXy6ynmwfrx8D7lF8aO2UKBJatYf3MnKKf+xxkbrrHD6Pm4540qb+iIoKnnJoLTAmt0ebmET4asQrmrMuTwu4ZWDD3GCt1cDvLyhJ1ff9Oav6bgmm3Dhjui0Eh4CvztK8DN56VxwZ6r9LrCES87RXLa62iq0gKontuG8iVaFDNuMlGrGs12suW0PQtIWcGfxs6fCiHTrtBLb2sofDzEFeONSHXZcooOO0wvV35n5XuOFOPWTBtKa6HUqIbKajQh5/RvalBvw4xDLtzVfJnGLnODC3M+Q7qNJe4bqYctk19z/GFNyCnNIdmhbfxnoAPrSi6iqt5fOEM9wAarSGxsDBX8rEafUVawV30LFiy5SdVTcyEq+x3cCG/npJ4cMDxfAW93SXHrCTVsd2N4u7mHg0SmQaa2MeyJ+kePzHVhWPI5b155FjfVxLC/6jmwnWEBU2zS2OtXNvycNBbWer4C/wvTWWbWP7Bt0KVZR6Ow1GYIPwmPBcHWrzBi7EI68p8KgPwvCt+vQ/O8lXl1mS2r/GvlExKH8Ni6SZD1Xy6F71vBKQG70D3Die4dmEgud9Zjwrf/eNQcJ9CQdCGzTAGIr3zGP1YEoMJdCSxtc4Y1cuN4ppsWPMwo49U393OYViIcPSoKJjG/YOsjcUrNeQBiaXVEU46B0bcGiB9XSmtOufBwiTJlRKhAdMhbWm7UDiafn6P13a+46qstCozI5AbBXdzw4xF3ZPlTifc4uOdby0/K8mCUzXsQnvGRZoy8DtfMv4JdlDLYLXeglUlC7DZkCIUri7Al4CmEO1eT3fkqdpqxEv+JylGtqz29aG7isQePw56RevDHag7nRSfRn/B0KvL7xs8Er9Dnwm5ojDwKl5uLcP++GB4skASlyEbqC4gAyeP72CX2D/S2bIF3UbXkW9ROLUeN+E2cLcWoT4FLp7ShIeIHSJ4w4dVOyuQ3So23lyVCf9goTN3zAUotHOFDoCSE9yykzu5erBQ8yRdWKpDYw3Gw02s5O4w/TtKfF9JoxV/QT/rwvtKfQxU7OKvxJZ54s49+ux6kcQc+8tqh7TQ6wRcf+gjD2UIBcP25kXSWmMFP1VRqs3nO+femgcLjecDb6rl+gT4ENtmQROhomLWjnm6p2ZMzuHH/5g08ouUvmFfLw5ywRVA2vZidtC5Ae6AQrCuPJImy1RjjuxiWOZ6jol0a+G5zAl6rIEhf0ATFSWeJHxmCbrcdUUMJLg+fhLZRC0Ah9ghs2hqD/22eBZN3mLKcwVY6NnMM3C+PRF/NS/Rjmim25P/hiNHt5PvNCZaZi/OPfQ6sL5sNy74rwJsRCfgTF+C6TFm0lV/K8z8fAyWxf0xTd3PU30QUUnektwqS0HfwJJrGpkGMdiOJHMlFu+4bsKrvGL4YlcCWkxNx97f1fMZSA25OawalN+V44spH7Egjel30l96UtKLLn5G0M+YGPnn6DG4NiYJrnBNMvnGCwnOjIeN+MXu9CubFN8P48KyNmBVjA1tNC8mwdTrs9gin2r4nMP3LO3DV20lSgiHYbnUJVJwrIW6JCH0RecY7tMzgNlRx1f5hMBIbTdHtRmgT5cQyF07AI99RfPVhJsh3eHGTjiDI3tvHlrZaVJr+DQsSlOn59wxyEmnlp0+TcO/xddiYu58zHEZCZVw5mmkdofya7zTudSLNXBhIAyrOOIHUIG6nK00WK6IRTkKQ8nETT1K+BqYr/KhWSYJt/m3BrxFnYajoJbkafaE1FfNphqg+BJRdg99vJ6HtBlt8knYC3U+5obVJKgZ6/qYh7etsKvgaZ8+QhD87loBE/EPMV5vJDjptYHpoJH3/5YVNtadoZrsnTY9oZTdfMbgoMgEUs7fCpJlMOvtk+FywH51xDeZZlzqhqlsZLSqM0aXYBEoWppOD1mWYpbOa3PXuUuQqf955djc4GwvijosHeIapKOUla8Kn/fq03VODtCyy6X6lPh5Y4gEnP9njOLcr6FXmRaO19WHbeFHwDp5Bc5/m0K6NVuh1+gqEarbygMsT8j1+FT54R7J8RRELWhlAics/UMsM44FtQhA1+wB+P2nAXeVKNHV5NI7P24NG4i/wmawqxP/rhSXnc1EvmHjoozUZh13gP+kuVLn1OUY5R6L20XpUPi8L7LOQ2qe/h9sB8zH7tTgEVi6mhLI6CvpgRoq9RTgt9wRHFOjCTLcGOvYuC3+qWNMk1xP8SSYcnY4lUPjhEJxjtY/HBM+HJFmEuz71PEN1Dv6JD8cpO7XBnddCQtlDmDHBiq1WVtB2qWD+aSUHHb/fYOH9Krym6IK5Wv6k72HKLo5xlGqQDS9v74YRNzcSn5WFRQJE4Vu20S9XN+xpV6EWT0/0G/uZm3Kuc9QGdYx9Zwz5XTKwNbkU7DWvkZiYPyV33MNL2l9AYuVtUl9Uzd/F+3GUixecMSNYtkkStPf+wq7RFrxwTgqGS7+liz9cIcpOhF9JBPGPlpW0JUEf5C5EwacnMZyqY4WHr/TzzJNPyfzMcphbk4kTSBVXCYhjg5UMFOccxHNpgjxjIIszBVWwI1II9qtGguL7ffD6QSfEfLmHcwrUYMhwFMSciKXN71bSWv+d9FjNCKvcntCX/cd5jIUeyM/pocU/rGDJggL2397Dqx7t43+ZhiQieJ3FEjS46eMuWnImGRoup4CCphnI/3gCMW525Nw2zBPXf+WguEP048FDEvoznVMEfXnW/d+82VcB7AJdWfB7AT95XcyGG0ewK+/Bu2+m0sFQBWwpm8v2N8+Q70uAlO5sdnedjUZr3qFxYRVYXGsit9hX9DfUGAzcs+DQRVe81mEBso46aOBpCnVejfhFZZh3rpxM44ur4SAu5R3VP/DotT+8TUcEFG4+xKq/dvQ3p5NH7rsF17bfpLcF2nBpnjXcNFMDcesOapgqDs0ZBaAOe7j3wB5WMXRADc+fZLk7kTV0Bulf6jva8GMSDNfJQYyZC6wNUsPpldUw98EH+NxpxOtDU1H6mhi0SWpju2w1Li+Wh10DthCV/plHhEXQk4qr5N7aC9EHquhYoRHrCIuSmf4QLm4AmLTEnDzsnPn1kAz3OZ1BPclXVPfJCuODLqPF32+Y0VVJz16Oh2XVFlS2PpElPDzAJvId7328ns//OYmGmiYctPw8zdXZDyOU1KDzqw+/nZdM4b5ifKZkJfbdn84NW0+Qys+fKH9oNCssLcMR08RgOOE3v185ARd1mMJ24ZOw79IBMFzlgVc/PYUXPmb04nUrGnjrQd5Mb5ITb8O9LjEcp6rNnQkXoOB5Ekvo/WQ730gI/nEdJp6bBJrqDbAtVYosLx+je05laJM+kgt9JElyxnnYWPAddidoo30XwytxK3ZOLORDxwP5ssl7mtaxB7tGHkD12+Oh6f4HnnHhE1c/Hw8W/7pxlFM+HfT4C7NvB+L0c7J8ovUv9uskssDGNRy7Nov8zZUgrzkAS+5t556sA1Ad+xrenhAmyYgtdMhkI27yTMC9ki5o7CQGmy4O8MZxAHlFM2CH1hx+1roRM4zXc9qQL+9sPouG2jkcJ2MCCpe247+hQsxS12FT0RLuqc2H1qt/IGphD1/bf4DXBRugdao69A8u4E2Chyhz/xhafLCC9Qq/o470YY45LIfzhFbB4elp6HFEFSbOq6dD4b0U8vEKFL4IgsvzcsBvbCTddq5nqffFKHZ6CVjvlYXd206iXdEt9L1dj5LK+VgzT4s79G3526VviFvuYXtICpim6cKcxxrY6BkEfh0BvOnOCLTwqsSE3Uocs0WD23d85APz7kHuHh3of3+AlY500obKLIxo+so9nAC7Dn+GYrlizEk+ztWlFqQoNArWrF3AFvNUuV1RifziNFjFJYEDvj7ipculKHKrOAaLd/MtbRGw978A1rcuseGD6XTItw2fa+zEPRe+Uad/M8uIKlNaTQmm+cjAn4fhdHrCSryRuZEPjm1DK68QPrIuCarav/KnGb4ktP0ojv6lCnW9RSz7wZaSG+yh99RdrHq4Hi+qn8PXAQN0olSca+sTWfqdItwNcIO1DHhu/m6UzGjGE65BlCJ/H67vUqWjOvfwW9RRevN6Cgg7KGPqFDXaHX4KX7n54MetJaA434iaJdvZ0SgIqxfF8QYleXj64hvAqVa4L72PTnQkYIhWOq1c44B7l7ZixNEYSIhWoyRjYTD75Ya6j+zZUyET572w4ZyPEjz700QqElPHlIU34fGFl/jGRB5Cnl/GVvWr8DIvHi6WtNC69GUo1aQOOU1e3KxeSOm2s1hUVgo+5CZRmsZX6vYIQ9QlfvS9FU4O/WKjsQhtrbdQcFML5VhJQItrF18v7cDIKEF0eSQLV/wfk+p4fR6xby3kleTz2L0dKJNhCO134uHlxUC4ZLeGn3+dSw9O1aCUx2yOF4nB5XufcOPqB/RTwxhuRy5A4V1pbBBfwXvCdTC9ZRR+7j7Ca4cEKH6oDES+dbLbAUvoWemGe6+lkU1iBmgt7cDop8V0/PAu1LWxhk9ObVAzcSbEb5kIi7fr0umseTTFYRm1wFZMHGfBT76XsWGfOUT8t56KImxYPXoUbCjZSzVJsqj4Xy++/KIOWXKMq1+mcsWKWVD/+SHNn7CWt8RPg73va6k89SDkzThMT+Z8wFgrWc46MIsx/QJZXf8FKsflOGTLePDNHqCuO89QtGMFGe89SIP/HeS4Aw34dqEJLbe/j387jlH+nlGwf0I8jvZrpmjpSjyZ7wcCXT5sN8OdP3s+o+ZZflynFs5jn6lChVQuVdUqk+apBbB7zxFulDGDHsvR0B+5ATMWfIXjuRq8XEUBjk0xoM9HXoJBwUJclveJY38Fs/3f4yRdM546ZQQgbZ0/Nl6xBLsPuig5JAan52pwbX4HqH2/BcYOZ0lmtgrFa3qBtX05PpNQgG9SuXgxZyyWxw1i0c9yCqB/fGvSd45NHUVf9/ZCzs8y2tagAGoyL+F0x2IqwXG8YKYTSRxdDBO6prB33HrUCdwDb+UAIvVHwzPBdRQ8uAKzPQ1AMC+KWx9tpVz7Yqi/6EevBx6CW1YS7f2hD9smZpKf/SY8JueJleapmOm6n4e1Koi2hNGe7iGIsR0C2WApePywiW0uOoDU8tvUr/iF7IQPwNGxMTR9th8e/5KEXfV+7CUjAONGJPCpRS2kbdMEpZUtcDnHmX2qZ2Bf11wKE0jg7DNvcJHYaJgm7AdBO4TgsMlvvj9iMq/2aSBjjet4WqKcZhX480jJmbBoqTmkbpbj+6J13OVoQCr7x3GWUi2NyQwl85n/QGnbGmqcag5nwkbBp5nHaURlLVhMMIVqiVEw978xeHuggaV3rsb0Vc9x4XYTvhShA8/V+uBK1Ql8e2A0VfcX4CPlm3jzrA/uqzrJD5ubsPzSE1w/VQAmfn2NGV5n0FH5MxYr7uE9ZmV4a2Qelt29iJs055GPWi7G2IlCX9hOENqdhqvPhUFiagnHFufR6gWu3Kp6jryKKiBc8TZpe46FljYTkJV9hFBzl67CXBzYsZTeH3tKy/ykyDzFDDf0P6VjJ03A+l8syp01pfTeUdBjfBdvRaVh1v0FFCAQwf+lZUBRuBBMdlCDph5XznRw4W+a+jRBwBPe7F3OyVd+kuXWeXxPqRSXR86Cth/m0D2pBop/21HBvLd03G4+fyj5AAY3T+CNznMYd/80WZ5VJIVTE2DeXF2yTXDBoNZhUk+xweo5RrCs4yu/sRzHv2a4YuDeWvowh8F5eTFuc9dk+b2AvLMcZH/1c8TwSNCdvJ5N6QxuVvaEshkjYcO+TRjTPAPW5Q5iw2MXih6QZ5lRZRT2KYOuuFwj789ScG3YEkTOqaJ4z2EubTgIimfvY4eYPlxSvUqLcm7gmNg2fJ9ejv06AjBi3BdasigLPr20xOaF7tB5JBoUjFx4RUQtenh2wpQEG5bUGw/OO74R9gtQ06/b8KLqEAi1h+OTNyPht0ci2G7YiTlbHvG+Cks482AJPH43gze+V2dloXPkWVvMmVUG2JqlgFJGslT0x5Ok50nAklW7WX39Tjp1OAUe648Gm/qJ6Biygd9WLKGy8lb6uV2R/SsmwaDuTT6qaslqu/bjN78gGh67BirGlsINOVMeOrCUtN9voEJXffAJnEO1+5bjtypHuIqT0dQ3AE57aJPJsXK4MvgSZ65oxqygcfDMXpCPlR5gMwdffnG9B/4jVdpee4s/vlPCn1+u8eP9Cny8Th4Eur3RvagALT8GYe70DhLsa4PS1igomYj0RuUiiZung+RvdYjK9KeQgGq8hdV4SV+ODX+O5JIKG0xReUbDYoO8yecmr7k1AnacVeEl0+aAw4RRsPbUEzijc5cckyNRvqYf/h30Bd3S63C9fDpAuCMtabbH1c9LQL9EF2vEQrD0/Xn4LjMLjDYe4kt/UvCOnhSMMUuD3B4D6jR3gf1G62F6XSyrNepin3AR/Fd8B/cajAF+MgWMDWyR83ZB/605/HTkNNJSO4sWG8vo6PQXtPRPHs/RjaS9itqwYbk/1Og/5vTwMP7t/oitnLdRTd0SKvtSCJnT92LQhSZ45TIKgiZO4/YTnky6d1AxLgdWq4ux+txSUBv2Zukdt3G2hAOM+GoBTwYO41bbH/z3yXX0nvcQXuyOhdRcK34d8AFlDxyGn3nXKLZ2GvQuK+PwZ2YkXVmG+xpNQHBzJrpMKKBn67TgOH3FVz2vwPutNawRu8v3tt2CdIFmsvksT09TAH75h2LSjT0U7ipMbUY3QH/JCAh5FECF7VUUeiWHs3MkUHL8GTpzQRsWasxmKbdPmLJ8Nwc3ioHVmB7QXSkI779cp5CtaqAwEM3mzpuwvqwFhkuYS7p9MURHAw63z6GdYmPYR1+c66KbeWa2Gtu/vQ/uByZz0PiPXNdRQFnCljBx4S5YmGlMdiPksOvgD7iYYkaZj3SR/xEdD7hG+g0d6D9VCd5krOB1RzSxuqAQI28agWJfAondHmT/nWaktbkeRcc0sqSINKzTDeUZa+ZRpnUGnjKczzs9G2m7XSjr60nQ/H/9kJy8D1ztR0Bmkj++cR0NLtSCJlWT4EPaUg6On8Als15BXpwPSXzRA/MUXegJrWLFHanQsegj75m4m/Os1qFDwEbw/5DO/pcqoEBGjdO/jITy8X5U3bCUPJOXsNMCE0yoPwAbF33mIKEI1Ny9g9P8bnJAowW8nfGTn6vv5QM/HblzoxZY/RSGXi/iXWKnudc5j99GhsOKdnXo1HrARb2fYV6IPdxTDEP/vwJ8RiGCBcJGUsBybXh+Jw6v/dODE+ueY97qfZDzx5xvVl3Eb7u2sfzvEqwfn4zfxgpjQ0E39aYYgb5ZPTku3ksSHnY4Py6YR9g9ByHFO3h511lSP7+JjumW0381YyDQppWPiw7RmChL/i7vjq/cbrBzgCQcGnmD//SfhT+Hc3FbnzDEfn/By3NzsGZEOXZf6UYq3Y0vM5fSMpVKEjIMJ83dy2CRiDFc8orAUX2HqG7HVNbxyIBmh0SS81DmKRcrsDMB0W7bY5q6l8BF7iye65gEeYmCqJ/uCYv2bWClYwfRvt0FvUblUuV9FdI9ZQmZFfo4cWE2LVdJwTVyWhx5YBYlmvXA13Hm0DCojA/6j+Ctv1IwLWEip8qMhXPUAVH5gjj46w9KXVWDYKPJoHW1Em4a9MEPXQLHvTG0WsCWbB1GwihDH+zcW86nzh/BkittVLldipaceQBr/eTh0XrGwwcesIeMA8XkN2L+pWxIy7TDcNd1uGLOZl6ReRT3HzWBdyXCfCJoDlhptYD+/W8YOmTNp7amcu1/DmjTmMhaG9xxqpYuGL2QwpjoHu49MUxOD9VY4vkgTF2bzqNOy/Nx+ze8YvNacOvXgNhcLXxwXQp29e9C2/BCMNQ8iWE7Daih6xbph12AWPs7IJQnCOXbkrE48yVd7xLFB5PHgPr7RpDUyKMK79d0SvcHWandgvvZDDW7Qujs+etY8cAevfM+8cfkKrx/JxhUddJprWkJvRjQ5ok79WCHYzl/axSEAPFDENx9hXxHmdK9J69g65Vg/rbtOm8+5o3PHNVgYUUka202wR1tbynUbBTP+L0a7vYmwwev9TDz4TzeWRMP7jZmcM0/E+IUPFk9fyrfOfEYEz4SLTVRhxVx82HntC5AiYtorakOUr86sG1DIhxfbcSxtYZY+8uZvliJ41p3G8S/cvDK0h0FI7XBf7YX/kxLJMfLfzh7/Ao+GxSLETHL4cVQEG9xnglpa8bgP10LGKuynu28kJ87KGBeahvTewOYma1O4Z6FZOb0kLZWrcB/a7TAJ8QSrXt1Ia5lDxy7vBli326h9fu385/JH3FffyceuWrHU77qQv7j1ewu+xmU75nBO0c93BwPqLFEEK1Sv9PB8EF0y9Al/R+iUPXVAQsUi3G93EMcMc0N3H/t5TP/JbLgRSlckSaFsQ3F8JQF4fHUZOx6PpFUK10oyXIFnM/qYQ25VrhX3wkP9i7n/V+HoWGHJrS8lYO42U146FEw1OUvJ8cp2eQZrwItM8tQzfUTr9lUSV35lvDhzytu2/uY9BPNMWt4KSx4LMsaRmbY9fQJpjhMoPDkIOoXGgGS25SpO/Enh21Nxr/RqZh9IQUybV7DHNd71Ohai6++S8LJxwgJcV9o3YEFLPrSjSxke+FNYCTuarxL+OEXBr5Yh6tD+lDmkTH8/ZuDHzbJ4EBfGv/WjeRvWf5QmusLIU3fqNt6JxudaaC8A4pQHi2BT2RWcaKtPiffT8BK5QTozlyNpjKqJLjtMe1wGw32D6Rhtct4OvV8DI1rrKRBpWbeNtEFl1WEgtLhv/BVJ5uuzLwBEw3loLsnkZT1zvECvX7cPu8I53ouIkGLAPz77Bv11InDxLmXSXz7JKjdHUCnnfP42MLj8GBhFJ2Y50cHXXSpyOs/XqXViP5LJ5Kg8gRYd6mf6o+ORbPeBhZ4vhvSakS4aLk69O+fhtUxddQveAK6x8iDzFYXojAj0lt7nqZ+zSR/K2UMiNDGMZKzcK33OuysPQq/L42DrBs6ELjQFnOuB6OHkws3rMzGAQ0/cBW/Q3In6riv6ShWJUnB94oUfhcxQBvnauIyoRV8KF2CWp6/YFvpFpjYqk7TcQ/lyJtDitsKUlPJwLG/e7Hm9Gz0vTmFzLMD+eetCJzsfRN9u6TA/LklPNj/AWN9x1D7cAjrBbVB081zIDzZGu6vMoG19uvhy5JaXIv6oMqWtG/DH6zU3QuV1jUUdKoVjTZEcljYWvrbkIobmwdR3McYnJ4ps+81RzZ4Z4wdITPxk9J1vEJXsfpBGzl+O4wql01p+2SAf1GxILulifV/76a//Qt5p3QMSyV6s/JQMM+P7COfUXk44CwJD1428eZf73n3yiiSlLyAhcYPQTBlDA6VFIO9xWq4eEsXWt2mgZt8Nb5JSqL4DHteJ52Bh/o/0Jrwo+TQtJV8vrZR1fIZnKwjARsVnoLxxck413IH18+9SuP1x6KZaSvFiDhCSkEoZJQf5CVvjWD6g2BqcgimhDNjYMrjalpi/oDyul5y3YV6nJVsAz091WD53RzMdIzwSJkwdw3+JC//d3BV3pOaWRQNhMMwMtQdp7ABTlGaAEKzitkrbBblunxhlefWEKl2BBd6joPf5Zpon9LHvfdtqXnXSBgj/won3p1A17syiUJ+o8M2RQoaCEJ/kyi6fvcWpJmMhv0y1nAuJhpEFjpBg8ErfPZgM3pVV3JOzzkqLDsL4V+lsFvLF2dLqEGOgx81RPeCx4td+PHhaLpxRQik5WtxyfAxULetg64FauypKgDtIVpkJTeBVqlvAf3+7Vi39gHkN/aBbpIGn41dyJJ2e9C0Ww9erClDuW+nUGHnUwo9IAX3LBAM7hyHw2fKMKJrI1q//MKKS6zBMvkrOG/ZQcO4ijnPnJ9ULcYuAVusD05Ex049mh24FOcZicM7p6/w/cV4Uq3/CMW9Obxby5FX8gYasSyUylIBpkpo4OblhtC8VJJPLWynPQ5RuPiqAH1MigZx/wj8HwHwAQgEAgUA9A+ijJJQVii7jIyQVAoNMtIQlZSQpqTMhhEaIhoqe5RIqWgQ7ZSIXEspSkhUQmXk3si4XwwL9vGDjPOYqy8H//LjaPDWa/BUvw4Bc13h+5Abpds5UlDpCQgabcxt4h4kvFMLAiuPg2qcCvf8+MXPVfVx+ZpN2GqbgH9MXbntcQi3r5DiwgBN+HxqF7V6n2CxuHhMW7EN+4PdOU/TGrUHQ0H4zBnI+2EFAt5jwNB+NJ2q2IZXHKNgpnEPz35py9lJ09hy7hB+91uJrZrOfHS9CYTN0aGb83agzrIC2n6tGEvWvaJ3911ALOEv1dpU42sPU57zFsB69yU8MUeSemLmgGxbIXv663BbwkGOG+cFL+IqseG7E5zLFYdYgf/opaAJWV+vxbKMm3BjoAKOnH4DdGEqjimL51r/RmjOU4fpn/VZbspniNxfwdNrgvGyVAYot36EKK0oqjQ8Aa9HbsNpO00hXXIIx6oeg95vM2FPez86Kr8FR43X4BLXSG1KT3mgxpvWLxwJuXtmk4LyVfDSzabyjUtoi/sbyHaJhkVjzemQsTMannqIdzsngt2fuTzssBnf2InAlEovHn30HCsYnqTpMT9QsOUZWd98wlZ7xKBtnzraBoti9fJgyBw1TA++F/PVb2cg8NN+Ev5UCpXZt+jToWlw+cptfrMgjffOdkPXend+WnIIHc6somqnaL5tXszJD35jxGdVkGjYRL9z1+NcpZkQek6TSkomU2fGBHgsGghz2m7Q/evnsadYFBYs/EsPrdPRpnE3KQsNwafwMxS6ewdvsW7BmaOrsXLZZ+D/jMDobyzv1ijG5joBOlqgg76HZaBubjxq+bvhqPoS3vPRFiaTMtQd/cILR6qTwv0NmPFzIQcskcW415los9AWdkrOwbwbnaBxSAUiqtay3uEHJD48RHeszjELAOfs0KL9V5y5Z8RUmvx1BybaIhzz/QtJc8fBtqPLUdF/M5/99Q0sRf6w3JkGOPD9HXU8vMM7jDTA6GIHVG4LAefZVmyf3QfLxqTC7d7XXKXrSEVnLsD6J454rEoM6lcuwyd2P1Hwv6107tNd3LWqgvQOB5CQajEujMjgy9XT+UfsTDigcoHCtZaT8sr3uHRaD0tM1+UTHw7hXFltrhdqIVeLaTRnnD4EfzDEsJkpsHHBKBhj58lXxbXo1+QiQMdRMCuwBzecCiGZ74LgXJ1F2U+KcNg2D8PzlrHQ607aF2TNM9dlcs65JD630hOzXeXA4+dlNgxK57HrxNHP/zWrzzwLDu/PQ2rtVPRUUMYH5g+hcLU0eFg/hgL4gcpVd8hRppuaSzo5/mMgn8lxo2LddXxVYR8ZDKnB7rgFfGq+NpcUGdGT8UfZfL41mY9qoNd7D4D2lx08l4o4XFIUvs9J5NcXFmBl83TomyfAZYLTeIS3Aml67YAgfVOeZ6QO9aPMIW1xDGofmQBHfxiyh/46Di6+BXjwFJzUfE3932LQ7NFt3CMkDZ7eN2jFwyecvHImxv2VpfLfGzm6+QpZSqnB5qpnUNNH/GKMCsx+q8yt1Yq45M9RDs3aSKe0GrE5MYOnsDf6ZevinLOBdGuvNtwKSOH4+0nwvEoNNZJsaE+JBR+4ak/tjoVs9GQxnaj1oZhdGqB08ghVeYhy45adUO3gCT/m2XJn7ywsHnWYpC/XouSKHFxmKg52JdKo8XA2tpouB8b1bNvbjolGtzhq4UIMmiXOhisrKM5cAMbkb4eDKtWQdeQTKu+OxQkyZ/j0mA3cs78Nx0zYhX+t8qHNzQg82/Lx8Q5VSh9+Ar2vX8OPRS3chaoQpJ+MZ/MFOEOkFyXkRoCp62yo/CvEugZmZPXjCuxN/o7CC77QiuIxfKBGACX33WSreXIwss0bPn83pc37jfDAnRCIevabZ92QQHlvK5jxOhEr5rRinacyZNlE8GjD0SRT/QPMbmhzq1oBpff85m0+13CiohCvkxPhN3KicHvUePS7eBxrdGJRjtbixG8lvCa1EzREn0DgqSG4uFASsNUMWp4ch+QDrylroRf15k4Dw+IlGDKrkC32PIGu5hD4lfONcmOnwpKMIf4+34x+mYTS0+v/QYSTHtYeP0o3JYpxk3AnT/FdCmFpovBH9Aquls+iw3veUcGUKB7b0Ar1D2twf8Yz3O4tDBO3x2Jh5kR4UbwPAvIn4kOXbFiqdJH+5Z2A8gEnLBZQp4OiQqy+YApm/tCGjckz2U9EnI/nppHxyz94/Vc1Otp+welLt/L5O7/BcNsXjtkjDOMbRqOtaiosESjHZSZ2oJIZwjuyNGjN+JFknxSNhqHi0JimDQFrq8jB7z2KKnaQbnkNxr2R5Oc9IajVwqh1jeDZykgUi9IHFx1pfuWYhS6H92JOaT6kRetwpHU2ztqph8mTF8JW/8/UnzEFhMf6smBMM33QMaXzjsAdl11wkloC/SdhCScPIdywsqOM7/IwZaYLB1vuZaPWB1y+LgJUUpO5L/4PxJnl4qug+xDxL4CPfAMQGYOcr6PBRZlnwDumgPWXLQaJCFfeUKuE77/95SP+iryqcRpkFjCmRK6kE6sNOGblUp5waxgyfDJY0fsQiy9wQ1u/YkwVnAwu8A1j1/0HLkoHuW6qEXx8cQSmuy2m+MQ0+rrlHP9McONu5xEQrHkXN917Bw4wzJZrd2Lz2ma4O/AfDVo7gobReFyWd5rlJipCXWoyT5orABO2boN7Z6WhcH8grKh4wz/vbMbyRZFcvKaQZ6jJw5qJRCmTQykv8gSX+H/gtL+GMFL5AttuEwV9Y0mw0T/BhwYVwKm3CA9X7+I0vWwO39nPp2ZtgvBiM2jfYQ4JKxTBa+YA/toiAQrDi+nF/BLYIFpE5fFzcJPvWXRXHEte/6qxI8oc0/W247ctBuB13IvuJcqwXYM/sOsdqm0UxmPByXxQ/gl86EhnF49GiteaDEMbf9PqtfNBbbgX0wR30646R5b4GwF5vvo0duNYWvg5Ekb+HgNbVq+nyRv92VgoAF0elZH6nBaYcG01Dkl3wL8j8nBcJ4S/ZJiDz4PtzIrrwfJgC2o3BmBk8kky6vUiu8IxJBejQP+e1yMqi8EmaOSfQ3V0+Pgxiu55hCue5bLbtS849nQIrvX/wppaZewergpStoMobt0LWedGEZ54RpdEnrK6pAsMDTbDjIW1PEP5EqcXqMEssaPwqrCNNdIaqdRwPl5+lsL9B13wkPcZDLw+h9c7OGPgA3HY7f+BZwuepPSSFlaMLKW4vt8Qs0Kfqq68xvu/bWD4biN3lhjDNiMZKnlmhL8+tLFBbi9qn9UnhQs9MCIjEGN3WVKC0jrOWioHT2JUQWWhFWSWDNLv6m/QOnY73/3RiMcjXQg2v2XplW08r2IcmKa2Y/jAUX5Vux7DZ67hkgXJ1FNpQ2O0emHNyYN4p90Ln78k2DM3jY680sa4HXZUWyjJq3+HUlFvL5+Ty4eEwSuc8Xw+uuhPhVrNSzQ5sxdbjaPBIn4r/VsUQT+a3tGK3G1gMl4MNL0mcbW9GawV/EKvCwPg/T87Ll2ShvsNl3PMhFRSlW/GtmefaOhnLuyXVITnjt/Rt9GMHvkXse+9QzjHsp/yA+KB8lpg6wZXOHUI6dsRFbAot6bc5NkoXnoOs7I/UuBnL7h5eC54Ro5hlapwdFS8DKPENEH00ROsvB5BjjGJELD2Ek3v92cp95fc7vUYIsy7IU7cmL4lyECXTzG9V79D1c57uKpiBS364oT3/1jSeg9JPP/KDdQ0JmDQrFHgZiEMnt++0mr9Peg5xZQDZX9j53s7Kk9JgAM9Y6B+gz/aaY4C+GIGXs1u5JdkwDvvviWJq5tQbr80r8rezM9uPgV7hbVga6wAC9NVeYfDVQyS2sjH11yFMIU6CjG2gdmzTsPuHw5gNv8oPUqWA4tvo9D6pBzyvXAQ8LiLqvv+Q9/BBTy+9zU6agTSrJQLdPwUQk98GtyVz+ZiDaL1nqE8fekenvGjB4e8gqnzfgv4yXlRU6UhRCwxo5dJl/jQq2GOTg9i7xFNIOntxVcGjXl+5GpcNricToWoQn+FAUX7iNO1Kz14+dYqsvl9i2fU9cPdGXfB/PhlWu4uCCOea0CCylgqlhOAUdb2NEnwF4k3+PFJtUF4nKSFHSsmwobuNryiLw0SMmLcI5SCUmIE6obXYUXqJn7bv57mK+ei8+UJcOfLfRwTKAIpSZ5osmYTPTr9GA40v8M/g/awb1o45Zyawve+HsDNJ5+jQrEczBWzhoG9tnTpxXn226EJLjJz0NFZkIvFJkCmxWOs+j2VAhLkYPLoUqow0CMjjR/8Oe0LNaVWwLY/5ylyZAXYh4+ln4MTYLhfCrpTfvF6P3k0FbjGJpeWIzQsxaIvy3j7uLs4b50EjyqbhylvlOGjRioWeabgg+278fq5JGr0FaeHIwpBVOUb1DQfgavgCnES0+Gd7DqaruvJi+tvkcrgZDxuM0S2f1aBXr4apFrEQvpGNTzgIw4dG6ahyZ9ZHLJBhXu1S1Gx2o7j7qxlv7Xf6NzHdXA2wYmveGvDp9ZroKw3ji8uvYnCqd/R6Y0d/fT3ooBJK6i85x9fzV1OA8ni4GRtzj+vTuIPCwBFPd+g08HReLHUmx3+JfPUS5Jcv7cUfAyFoez9TDy95TROEVeGhMRgWLhIj0QbkrCrfD++0r0DP2fGMVw3hBkKZfj3mRJV8G3uiXHFxBk5pCE8l0t0n5Jb/R62iYzn7RJy8PJyGc3+8pDnO9Xzxx1hfLOD6Mujney8rwEnpVzG9UanQU1NEXY8NOLB753YE2FPW2S0KTnQmoR2HcZfywvpUOYq1ApW4lgHDfjPcyEOxSyg/vgsGrPKFLRHd+ClRQZ0xFMEU6VsObIolgeLxOHqv8VoLV0AyzqFyX7VUrS4akwHB99Ba4csLnisz2WxT9i33gQMAnZDb4oAqql/wFWNiqRV+ZB7FLbTL/nN+KQrE1evvsgNVePh+9zn2AK66Cm7GnZm3uSlKj7w+vJ6PrXgNzZ+lYS7qSb8IlcXvk05ybOumOPYlxG0zcAJvZJvUXHfMDdVqPHkYj9KhypwX2kKe7REaVWqG2gXv6aaLTN5x42f3Ov7nryezqGvL41h7fKlJJakAS1WDfDbV5MrZRbiifowMLKtobfdAnyvJhL+NWZx5d93fNp2FJwNOoyjbd6DcMd7aNRK5ysGO+FH002+/2EzBIl7w5Qj12nEgBgsc9WBnqVr8XygCeoaZbDX3ywQ/fUIg4MbmZYvx548LZZdPgpMPf+C7nARy19L5BClBC70Ijb/boZCIovh6/hD/MlnOXxaoQ6tFxVw8O560k57RGXOL2jWntP8s+8fV99eyjpuiWC5Q5+52ACu/HsMGH+OT5ish8hjJzAvJARetp8mCxOgkcckccfaWxQxUx88pLww2u4YfZmVCjX3rWDiNEP4ErOYXy08TnIHl7BymAPIlRmBRvlUGKEUg/+UEuHCrZHUlDAKykVG05mAaZTcYkIj2qdwzgY9SE4w5ExpTei1DQZVm5u0OXEzXB2Mofsu68Ek4y0ePqpBK9YpwB6bHDx8fAq03FzEPbuacPPXX7hhyl66mHkY52/YyAHj7NGyShLUWyI5/VkRHhqZzPOfd/HZpp2cNy+GM7tb8ElHLzuv6UazceJwNuwCPPBewUdPHePh1ePJ/kg8LJq6H2wndGD9bUtSPfSaFKfMgKSF+zDeO41OW83mcvkl9DlZBN7oJKJnUDU13/bn8NhKeHlPCnI3hUGqkDKdm6ZEUPQTfqrvoZaTSzBOPo1TC9/z6TQhqhIAsGr1wZH+k6B5VR/3f2yAh5TJ9odU4c86IZr9LYAX3xQj9DOFnFeetH6nHi2NYQi5eI0T46xZu/EwRUTlwdm3UTDpUSde0pEApS3f4cGWbhj5qw/HX9+A9/asB2v4wAnp1RSfWMhZqZdB4twoEIPv9GPUM8yP0YGlocIYdE+B3tdOox8rc8hv5AKykRZm5W/jYYOKL9m+6YGowVVkKzwRzM97U79qHzyZUUofBvo4K+MKh402gg/Z9+CrTireyNmMncfcubpEjq871+DstpFUsMkGJz4bpL1RGrBCfIhzTv3FW0s9YNe4xbw8zgKHasfhFDyFCo96qPDzerr2CSG6ZwWPqvJmtaBokpi7kkn0F7yfWkmPN0/B8tBsFB0xn7PENeB7CYC/wwjyd50EVr13WeWdDV7cepVfuh2lVymxFLujC272CsOLjv1w+IAuz5ixiAcuiJBunBS4RxlxiRnxuefydGmNJz12U4Gne1O4uWccmmc+p9VSN/jj1l2kN+c//n0gke6fUqHKiGUkFGgA2umF+DnkJb0RPUwnw3QgfudE3rVInZavSSGd0FeoPDcNuqXk4eIu4Ah5H+hWfAs+jf3sNOsY+lUYw+/kmxgpE0hz9ZxROWAGLFB2wdzXC0E7SANi73/AYPEnVP3IEl42tYPDvsvgGp4LofaKMFe4C00clNB5XSeKtX6BeZe2Q89fPZYrKedZFTbgaf0SJ2SJQUZRE7rnOEN96Dg+7LAdiwfzaK/nCc54NJYzpzjwvMuLwWOjDmTbj4O1J1/Dp5ouuFlqABHue7l3tRkqfd9I5+1LcEOtIVZpqsP6totsFruF2/OdwfuhBj4rX8fv1RbC21XZ5Gw/i3SEyvBzjhT8yhYBm0QZjJBzRoWgkawQnYSekj9QKncDBIX4UtR9dXxRYAFHNn+AB0MadP3RNh41HITbpXZzbXochnsEU8O7Oj7jMwuutJrBxTP5IC+NWD/sQstcfejSf0bkHhvKXjtaYUJYHb/YZMh6tQATm3xZ0sgJLk1LoJaFQXBw9VIs79iKV3dJwYhfEvwvu4wrT2vCCoEUelhylq9X5POg+BCt3G3NfzYv4vqjshD4+y8b3LiDzgHCcD/3MK7vGaR+px0QuEkDZ9RKkGatEW9x1uDTZ0q4cusMLl+tDUfF/bH5LtEFpWUYnPqTX605S82W7rD6aQLqK1VD1f0DGNAzCU6KN8DFxQ6cf8oF9Y+MIIHwl3Q9TodFXHzZYtpd8v00h2bXSEPtuLWQG/oZrnjtwxO5Byjtjyl0PrjCV2+1gGzzT1qpvZYtggVgV0kuH3NIYZ/gabhzbw7e/xqIRc+10f35OtzTEg7r4mJ4vKI63NymRnqT5sGHHV5Qb3iQdWqFyHJoI35OOoX+olbUWPsAMUcB8KIdvtHwgsZbW2lCdCF2Sr2k7Xe1SO1SKm8wFcME3dG8xc8UMnTSoLDAFN12HaXNKiF8O2ksJ65ZQ3cix+JIbTcaFbmJnRWFIfTrL3ofsA/rD+vC4Z2P+er2LxyoWcaJK1PBIboPzp6xp4wmAxi9upVrp5/Fx9uPk0FILMoJadNXy49wZjAA336K47oLiE5S6pBVZoMrj6TzcGEm9rRK8/l/dugu3ECTZ6fwpdIhupuejj0Lx8N/FXVc0ufJcZmXUDjvJu3f9wmPf5gJo3feoLY+BvtbYfTqpCBssHSDU+rpNOPJDFg304Uv9RzjoGWdMEp6gP6cGcQPO5dgdJ0ozLczp/jGJnBOTGfNR82oNjoLt5ycymZyqcT8Cf54dKCAkDa8vVWIhrWKYLGE4aeUBJ2du4ZfJDujk+xSePTCFwvjinnfYgv4nTGBG3220GeFDghblkcs/Jh3jrOBd7du4wofC/LPn4yye8fCmCO+NHPLBxgIe4xVj4JJRe8CmNyTxtt9l3A47ROkrt8E/sV6sGVtC9wy/QLXa1u5oXceNqtfgRlGztRp+RtCniziguut4CWoDvFnHSHSSBSla0dwemcJHnMJpXl357Fq+QiarvCSC9IV8WiwEbh3hVDEaxNoCflHrhZyWDG9A39K1eHBviMwuNMHd/YswNT12hCybxDSfnXxmEXbYDhFmg5pX+EXtt9xhIUiLBbZTiNsbsOTMCUoDLHHZyOEeF2uN9YIN9PI05coUNYKT+/3ZXP5Sh6TrU1T1UdAqEAWFLzIos+9Qjgu6z9YpP+At3WNpJ+pq4A63SnfCzBVUQQWpgxz5kM1yJmmC6pHl8Fmr9vgLCkC9yEA7Z1ec9aiBJZYBlCVkc8Ciftw1C5xei8rzWWz72JX8hEq+DxI74O/YvtzK1xvowY/Z+7k3zFlIDZ6ITqNvQBJCz5zV+ApqF83Cu0r9Tg4XZdVXxhD7X0HcMRyOG2uxH9n7cTYa4FwyrQPvR5G87/lNXjMy5pXpFhA+T+ippbvtNpyG3+YaMv7Pf9CktYsbBu5ho4dCaIzGup8YY0qJHrOoeA8dza2jYKYF59h3dsRlJiyF7Utz0BPUhKl7PoPpkhKgd3fkXD8cjfElByAlb2JMHCkkNZM8qabRUf51yRdKj51kHu65EFkVBxnhU3Ftr7lEHIiEtLFZSFgsgXZDJjhxVO/6E53M4i/EAS7GCUY7VFOSWHR9DNCmDqD0shS8iPkXH7Au+4mQeL9WEoBGZBT+IRRwtfYse4pyN53wLzw+1Ab0YNewt20+nEwvN9QBZc8GA7sv8Ml5Y04WO6Gk+u+4Y/of3T8/C/0dzOl97Ne489ZY3h9my7MXSQDPi/eQWxoOMRe9OJuh+u4wGE7jc0dgNG+u6jqfSyaxoiBfoEfTr41jKgeABW54rzHdjaK9Ziz+KcgfGEwnloN5fhV0QwI7E1nnwAxkPnJaNEYgWuicmC2fRKW5HpDY3YUPHpVTRZao0HsZBZZX36ORgcGcIJfKilY6uO4fe2830oYp6m14LRVmVBNSnB95FRQcb8DvV2quPPgcRRQf8qub3ei50R1PHzrDwxsKSWB2ePhRswhsNSq4s3lOnhSrpHXGXiD6UknzLnmzY7ft/PfUw0cfwVhz9hYnn80FiuytPDqpBQ6FVfD0grGvH/mVXj3IpLxmA+82aQA0rLJNEF+LwlEXIHj3V/B8fI0MPZopO6o+yxRlk9zvt9Ea1dh8Pe2JSH/SRhTh2hlLgmertrQPtIZXAs3oW+oHQk36fKbmWNgL1mScKgTpa69C3Vf1nKS8iEQWOoE3f+s6eDHEA5cJ0rHTyD4R/qh47lKWHejHR3d0mCkuQiXdU1lN0NlzJlqAw/MNSHsgxY8rrZCc4d06s68AS6uOTxF6yZ47vbn5NVNdLo3CrXk+7i6XAAK6j+x5q5Y2lj8Gp3HKfDbAxthrXomlc7WhTCrAfxrq08zm5VA778B8G0z4E/Zeuh0pZDUwxP4cLUENS1aRrll40jS4zGsdJcEVe1fJPlbn7aO9eaI0facvscblSb+Rdl5FhR6txeEVhxByaHp8PWXK0UvkeC42H2saPKBrWa/gk/yc9FJMhKlA5JIsP4W/FevBlcWvsHWw614JG8Yw86OpmNfW7m+Spk/eUdS11dFGBy/isqmK8LyRQZonC+IMEeNtNOm8wt3RzygdQSUQwJJ0ksE3sea41l3EdgyvAbeCS2Hp7VvKCzIHrd8HwCd6B3Ej4f54N4N0NZH/PqKMERs1CKHTYvg68SzmF0qyo0HatFsbSSW6ppRafU6kpuVSVoKBjDx5RbKNvqKXbaJaKZ+mmQ1/Kj75j8oPLgcQhRtOd7sJAXdNQGHhhSobpkNlRHJ4HrIm6f1CcHGrdN56zEdjp1ph3dkPkH6UxUY/tyHIgtK+OXnWdyU1YZ/ku5zic55vPK1FH5vaOZMhydsOH4aHC3px0naL9GuMJ73Vz2ksLW/4MEtbdQtITr27wHvW+PLq6ZPhcMdSzhq3AQ+NvMDfem7hR+lZnHFykNwe2QTNS+WhoqLrziwQQ8yVmmCX3wzCKZ/pZX1ROveJIJocyGtCZ4ICW6TwF8+Eg9masC/S29R51QY/JHbixtWPmYzmV9k2O9HaVHTcfZKbVzrGAWpc2Xh+yJb2uPSBJZwmbPOvKN7U7yhtfcn+czIoGsejynOciWtj5KDCvPFJP3sCnyLkcLb/cRDqqlkcLMPpxQBuvbZkd4qV/pTJwL3apfjbLFwVh2xGNsjlkPF2mvg0r4RJBdpgKLeTggU+cNTZSQg7LU7j2toxFavl2SmepUOJd7mEosgrnGqw1kHKmCkjQaHPiUIN0hiAWdlzhnjh2dem/Kfm0pY3rQJgyd+hf4ljTRN6T4duDsGzCRuwdYOI7RyXcRBLumgM6qTZ5rs4YpD/Zy8sxE01hhA+RIlaGmfQfflbnL62LEcdquWD/6+R49O/OY7b17iftURsPOKDLW4ToBVazN4yu6F4CH1F5I0n1Hq9fW8WDuatv3N5wlvi9jEpxcVhcxgrHs1fJ03Ak/YBvOpzk6yLZPnDBEFuBGdhSFzzoBXZhl8C5eFsMZ9+EZgiPKa83C7rCsEN5ai+I3zqAPS0CT/kz75+sECSwsQ9rnCq6QjIENNh28v2467V41m5eDLECezHcPHJkDevH24qM4MhIsVQNxLlUX2H4SsfS3kGPaZFT6aoUt8OdivqKHHsyLBX0UANp8cpl1d87mjeg06GLiCaqwrWfg30rLq6Xh+LwM+ms5KlaNBcn8wdHZ9ZdWsLmpffZBL967k0lLkvFR39rkow65rj1FjlxzcUZnG4xo2QYXpcVwQbc2pGSf4nX08uSS9YPpTCXWZ1TgnVhfOZS8h0yxjvr5vIs35/RiUr+pSRvA97m9ToMG5E7hIsYN2bBEDs2f1VHjsA+4DQbb7qkK639Rh45OXILS0lOZtcsQnIiNBRmAy9ExgfJ9qBiecsnj9DQV6WdkIizeNgKZXm+GW5juqXfyUvm6RBK3MDD7dh1z+Gfmv1huOOPkCNhs8gHs6fZR0Yx1HCLwH44OScD8viHZvieCCtmz6ETaJO8P2gWi0H2VvO4YPR3uQTdZCaB8Qh/I5BpShfx9XQhjFnLvMVePVqcXfEn7Y9vORfRU09r8gDP1iBEql83BqDuBjnQRs6j2Kbx67occdb5b3bcdI67889KIefu6cCLLWJnx6dxfYDleSzH5bTnP1xub8TaB/azXEGvXi9erlXLd4Mgw8AngbUMJTPfXILyYYpWfJok33TpRqNYSutDZ+ZPoOohaOgeKbVZD8dgP4rnjBDuEnYOaqDnI884hNZMdCbIU6GG3IR9g7BoY9HmL65nDqMlfCkAN61CssSMHT61k/dCG2lxZDUuExnFsyBm4lCrKbyRZalFwCm74FooDHFGibnoqpZ4bRq5rwvEMJdZrIQ2FwA88t3wQ67uex1aEG/XUb4YfxIEi9ssM/QeJ85p45nS0TgchFfRQ6imFxgQJGKwfR8PRSlvD9ypOLvqGQ9E886bEBbxcaQ872CHD624Bhufdg+l97sjC/xDVD4vzd8iktuPEVQu4vZd6lDka/puHzpa1kKbUfXo5M44KRYuxxNRa7pzwEsY2WXLegBSK2CsGWCj2WODcLt5+3YtG3orDviCHtxEe0JMYdZl94RG8MPkJYpyFsS2qnWOUGvvZrOT4Hd6zc0o7pf12g8vBEPvTxGKoePoDdtRaQvmEMSXb70bH/HuLerFTcmDifOqxqYLeoHD5YfIorHPOpqVUb3hcGU/2UHIjvPsHXZGqhUp9hsWoFZr/qJrtSa1q9KBmvhupBU1Ib7khcDzpZq+iVA+NMqS8gMvEjFKz3oQk73GF6WzhG+6jDs+NOOBA0hFlCx3H5bDfIDdiLkZ1tbFDuTiPHLmIV/fEce4ihUTsbz65IA2fveFarGYfhBhboEvwESDoF3YtSyf7YJLCp1IarR6u544cNZgYTZS3zpHOzg/lQ3G2eECyKZyW7WFP3J348NQbuTz/KN7JWkGNlDB9W68BnjqWwRPQVWbla0sgASbaUqOe6AwQq/ZO4cUIz/6sK5RXnduHcHcdALvUWD3x5Rj1uTvDfvO9QeHE8qGq84ulRIRB3yYweluvgP6curldp5JvbbqCPyTzeeGQ3HZCZAs8P2sL38D5OKLyHqSfdeMPEKv7kt5eUNUdA/NGF/KpuI+aHywDqSeOD5fnIB6zgWMkbrFleRdmvHHHP3GJQX3aDmnKtoCBGDGYc9sEDZZ3sqFLMG2r+wmr5Fh7YOholU3/ActVp3C1SDtKFInDxtBQOGW4gZcsi3uxZBUWfnoBb5A3U/biK4oai4cDoIaicIgmvzodD+TkVVLglShcuFUG99T/ojjKk3T5zyHOHO5yv0YKQOUrw+JomrRReA53vrmDFikP8PtEOc0Rs6IFZPawWisI32imo1KYPA20bYML+z/ws/A/P8SuEvJ2OoHZnESyOLsUf9oVY2CYOfzbqQ8Wd6aBqFYzFg23oBZmccsKV/86RIpXhAWg0bKetL8fD5INT4YrnLNoqMEi/8sdjo7s03itCiCgwwvPm9+Cb80m8L9EL+0frgMCzhzz45iR0iCpSqPtrDCoaycrF/+GZzj2QqzaXzR0d6UnBRHjOZ+GXYiLWG/7BEKtoeGHXjrq+q6la8Bqf7RcEzYX9NPHdKLjleRflbjvCqHYbapSShuxjy2jWkCiNzXmM4kV3Ya+KPeRHC8CrOSHkVb4cJY69pc6tn8mIH9LvxWIEe6J51DtVfHA6CMoNAbxb7Nny+BwUnTiRU77MZ5fd1Tw635yCsh1w+IUqugwEUuUfZXiXWYdTXzfwDt9omhSVDJ61YnCoXw4ivi8CdbGVvPHad+6OVof5ye4smiEMnl6ddFHzLwSatqPu+kxU22gOWnnfsb8skrWltSD6mx5/TbCmf/rPYNUYVezpSaZRYjK0U1AbN06L5vnlL7HG0RT+td5h0/dzIYNM8V1hMqRvZUhRWMd/Nx+DRwPv+OzFTJR4NA30wvUp8EAUj5kPoEe7cfzZMMpMf4wyu23h5oV7YFD1GZzDxsHwoQ4a/tKCxbmV7GgVDC2Hp+KJnQNcFnuFyl4e5jPG26DhqR4MO15il/EOvMIrBXUrHeHqDCW0cdmBFUoZdECjgcePDSaRMcqg5h8OqoPZtBoteYPmfDqpJMA3XEPg1ck2XtUuBjvmbeOrz6bD31o/pL/XKc1+D/26GcLhiwm7O8To0SstTPMgEFokgeeSpcFP+yo4q7lS+Mg4vDfmLteXmqGP0SPwiPrGHkN+dM8kh7O/zoTcZTN4fZMaxmyShQ61WxjVfYos/jsHUvcy+OrrNbQYikn9ihIkf+nEXfODeILcRgxLzcJEj/Xkel+MuzY0wsW5CdBmPgtGb1EBhVVSIHiyBdbVzqbDdp74Y6svtrhlkvi6IhjrI0JzMg1IfpwFhK0q4nkXBznUZzpr3P7IB0tMsd2yHy4fUsZRAtOxXquBQ88LgXJLI841SqU9Wd7wYmYIxUb2wNMCNZBwfEHmFjmkqvsYFfLMIHHedVDTvwjLz+yn+KzjZDX1EzfkOUCirABsuCABqzbacvd4UxCZdIKD+oew9GQ2vLuozP5O60GkhEmxfBY5CdxkD01xjvyjBpdTd9EaZyeILWmmmuBddPTDNqD1qpgp95k0HYNxvVkVWp/WgBlto3HX+SKQW/IeVhar4mxnR0w7/JkG7Qoob5Exb9jfin2fJkBtQgQsKN9OV/Kr8fHNQlqx/Cau3ZiCK9ePo2qbNnIKO49pTpMh9podhLy+hRdS58KiBiUqaVKhU1ftkN6ehsCR9lR6XYw978+A7YXnQdPNhyI+vKQnSlvoYqUU1+0Wx+b0W6ggl433whrZ7p45BMy+iy3eV3nO7hEkft0UR2Q48uSZI/lS8hAbNb3jynMvOLFJAoIk7emtmxbP3eFCkXN3grF2FdjvsmazJRfgcJkn/Mn3gQGNsSBxEyBOMRjq9Q1QeFUU1z5oxEuip+hQaxg9li3Bu0ln0MNEFaoPX8TnS5/xoooWvurcT1WbdTlVV4eDTivSy2Y3rn6lybpTJsLuZ/qcN9ADHcMf6PXuFTz/ujv8UnwLCdV38McWQZr8K40uRupDV9RZXLu5hf8YdOCF24dY4kIZFjivgbAF+oi1QhC1qRP+eYyApP5e/u7bRiEPW+BbjiotnzKZx2s+p5n/OXLZg3rcU7cbBRtnwltzDcKZZZgT/xWynT/za5WrdLb0GZwt28rnZX5xntV1PmM2A6z+atHXRZPRuiKLj+k9oi/LR6Fw7lYI6bwLMdkI80/5o+HPSbBfbz91PZrB2/yrcPMWZV4YVE6Os/1IISmIKrd9ghNNnjAsowFCyWUcI2vO7xzHU9SpVqwXWggtKgfBdosAdqWHw/6B26SrPh1kZd/CgoDX1HVyM7xTXMAvPYLhtcdj3jKpAPbrWJNT+Hre+tAILFI2gqfaYpTo6YZafRkOk+km2xsxVP97Ek/U/kY9xzZSaqwGeE4qxZn/xYOTzQ7cf+QQ1yw0xKv+J+jqyHyUrvfDq2PFyLVzNMh+vExft+nRgodF1Pf4H/qo/cPJ2AqLfVOgLuMZ/tGZTUoPAXK2PGEZK2NI2HoIH8ddxrm6ViQ8bjIGfHnFb/JGwbBKDf5UUIVnNhOpK3McFsWthn+mgXS37yAV5I9H0xpzbFy9Et/gVT7oZgEyuy3Jzi+Ll3hk8AH55XRaeirkS60loS3xmPqnnsZs+8BHY8bBnZU1mLR2CrabXwefknyIzYmje1OkSemVHAUc06WO0sP0NNsA9OSNcd/xbrAy/QAHDr0gebjMWrMqecZ8Qyr55syK1cJw/xxCa/AaNn4xDrvFbUjkdQGcKO+j7xo/4Y7SBZg9wQNMBmOwZcpk0OrYATtFf6LbdQ9s1TgPOTO+0PMUZzxmt4E6lnbTSn9JKBsvCybxl/iJ4AmUOWXJr6oF8Kj8JZ79aQGf31CF77p16aZNBfX/EgXTisvwVWUG5ayuQpWWQV6SHoCua8bi+kcyMG/JLwrSWMWiRprg/DeD2o3d0K7HHVvylfhs8FLICJ7INber8f2YGdT0wRsuJ+iBfEwxSpdbwJQMBfJV3AhXZniT69FaXtZ8mi2HZtH6JmFM2y4Jveaa/McnFbR9C+GWvR85TUtn4+5yXHTDhtd1LeFw1W5aXSkJn18tA/WWRpIqkcVVXb1Q0VzHX41aoXLseigKU4MlA8HQqDYKVOz34YiN68Dh+1f0G70NxkeakYWjOBzeNQ3cvgVT76AyXdssCAeHHoPzWUGa8EKKG0wucrh9FL74dAT17nvz7F4ZdtimxtuuIyxRsaWrD4UhQW4F220ZwqQdr2hEyT8SPXSGc+cP4x5BQVi4VhEq889gkngayOq8pfK4IBLyN8YRHxfjCHalQwsk2UAiCd/1TQTDsnxWjT8FX54tg7LrCA5p6rTu4BV4apVNgnuU0Prkdtq4WQyMu+TYcZMqFWr5sHNNK1XbNLGrqyGva22lnCmhfG9GNKykSfDyoBbKHKzkqSrddFZfFOx/ruXzAbPpR8FbFDkjiXKXc+hThQxck0ng/cZf8NLWQJB4cYwrbxnx7R4xTJXawQ1yZjxXM5ueyWtARIIrJRVok+JLczr5Swvv6tRAutAROPtNgLtVC2jacCZPuCgGYkY7sP9nIN5e8wkkHb7S1CjCiKhgSJ3bRd7ePSydF4jbnGRBINsCvbc/5en/NnLDxQck52ECfz6X0aZjK+jrqhAOnxeBbQYI7q/20eS8AUzQSMfVQeOp5Pt9PP/6E9lqtKOaqQ1IdS8lQQU5WJbogHOPJXDVtuuYIHSNdFd6wlaXadjUakyl+JGrfH7Tm5dqsDlyNsC9YTRQ0MVvLU9xwatEkM9+xxNUJVh12mYcOtJKHeMUoM7wG4xc3Am8uBTOf9gDgQFrqT7bF3YtvI6xuecwXLSOp282A1uzEB7SkyTo7Aev/SLwqzgDl3cKQo/wfg69II+1+nvw+4LpkKx1Ano8TqDLTzU2PZ2FTYWH8fBtf3x0qQaWGuZzsN0qOnFIDW78N8CHF6/EhTYWPKCZQmPFX7JcfCm/8evDxVsDwOhkDsTWaUKkoxeOb1lNx25f5ZCRP9F1UyxaxJjhF80ByNveDryyHLx+IQTtqMPV717T4Godru3WxoTETrCMPkG9JwVJfasz65g0seJxIZD/WscjCvwx/8Qz7DgrAZbuoyFU/T6OPPuX54Vcosjx6pRVIgfuvpNQWKkd7NvGwm2fPZzV9pzivATx8WYP6H8njfQ4GtINEBrufOPMbfvw6T6AaOnX/KJ1OwYtX44tonX8YIoHT478RP/+mUC7kRGX77aCf+JpJFE0AT9teQPHnvyjEx+L6L8Mb7yXLsSTSlXhqL07/itxoLEbW0H14EeYWbCLtB9Ecf2eAPb1saeS8m5cbGMGLxNWslShAPqITuChyYVQev4g3N+5mL5RHv0cb0T1YtoQWqQEfXZfUTDdhNyFFpIM93Ft8wjatu0sZX8KRzdRY758VBHWpTO45OfChtenQXjqIAtWb2edyZtwT1g4bp2Tzse2fOK1HcfRo1MLUveY8pTf3ZwN1ynbhOimvBdtajzH6/Yvg5bTm3DBsC3kuIyHqPbn3HfCE/Jjc/B3dgTliGmir94c3jRwEm7ZvCOJGkV4M3MymFg9IduuP/BfsAlGWa2B/8TEeeSOnbzG/AL5fNgE+zqq+EGjMbinzoXn0jtpZmIu7u/Uxbo/T1g4SQAmKC6mjGMd8CLMnzyvK4Gw+U1O8dkAi6018bLQQvJWnYoC031J8ocvCbhfwEvj5pHSnYkw79w1urOiAS65S/D7F4kQUboVhUIScGX9J2rb70ytX5txcpohBF6X5sjrptBwRxaU8q7BjfF6aL7UFapTj2OEjgUMqg2T7EVVcLt2H5rqnrPz/Du84FwpbdodAE+kk2mJxU508JjLZfZv+dAGC9jRvYSe1m/CwPDZ0Fs1l7cqi+Gk3O+srKbAavfmk8ouf5aZaQonF49l87ZC+Dq4BPROy8D36KuY904QTDxs8Y6QA5TZLKXzo7RgveAZLH6vxv05V/DOpxr4US1JvQvPs29xIt9v0uArQmfQ574u6MgJgm3yEhbOWY2rZo2iNxMSsCFlO77jChDy6YJ1t89Cs7gxjDkaQwsqCmGpeRvZPmxGt2cHoLbOB/c3GEBY/j3wkcunnjfTYMj5Cu64lk59fyahclgpiXTNJbT/jOpeeZx2LxFczPPoZtsUMLL6SMpFu8HL+AkX9UbDipdWWGkty32ya/G3gTt+v/wcCjZKwa4/dzkofQ9uTVPAyAo3nLS3nE6YhsGNtfcwP0ISXsrPoTGLRKB93zn6eDkN9jgjCVSnY/nW/bjZxplKAorhM8pxZ9M9sD+nAStun0TT9znccWMtFSruRukZKaxwK4Ys7lpAzNp8bIES8rMyhmXC1RgeuRevio7DnvGJmNkdA3LyEehmlgwnT8jhmPd1ePeMGrTe1MSBgVB+szuMPBXaqT3UlsfWnIelb6PJ2CaY68I+U9d2E4i22cReTn38SmoVDXYjH3zkgqaiT8Fl6ma+0G4PDSfzcPkYIfg0ag/uX5aIhs/aoNt9D0RZCkKW/A208bOGMz1XQbq+lp/aS8L9PDfSkw3glB8H6HbJI44fr4EpPbnYMyIF12kOcXx/CdumGoPj+9nsPS2Cg57I44FvMtT+r4y77MrxzbwZ1HhzOQ8fSAPPJ0YwYkAVto9zYgW191hW08ZW6q9IV0ABT3UIcPEHS/ZPq+XMRjPw/HUSJtXcgmzR6XDHUQo+ry3mW8/7IcX5Hp84UkWNCQe5LV4BCo/n0Mvtx7E9LYtz+ttwc8Uh2lrxBlXflUH4oDre2/IcoxxM4buYP9SFiZPg6CwyNVaj5c+LsGVdFek059Ml+yUcHx4OE8tU4NC8e6wxHIku/tHwEuPg4DwVzvl4Dle0riCD35NIfZs3it4aBSqZtrj4/mrS33odI/qcaJ6pJZac1yIJd23+MB8hHifjrGdj4e40aUixWoby49bhMwVdFHmdyr++5sH6hjBqLY3k0A5B2HxdFiISVHBUrzDojclmx/6RPGpGLQydS4S79VUkNP0ubte4w6etGH5OcoJxXy6Q2vhADpT3YLGJuRBR7MtYl8AbkrTJf0k1HJeYAU/NPqHcnG4UTfmPHUq24avjc1ixrwsitwgSLLSB+sNCeOkUw6R2ZM/6O/QwSZ4MbG7CwIwzmCUmiB+f/YTc8yHsODGQhZ5Nh3eaBTx/wX3MP9eADoZP6E3fHmwOmknbH0ny0blraVPiKv59VBG+xK1EvaqP9Pb2EJjrqKP7syKuPeRA56aJ8tDgYzT3U6JLH03AxSSBnkYthru5Tlhd+Yb1rhwHJ0VJGLVhkF/cXAxn352H9GkAN/7NBL1ZL1GzIINqbBy4YLY0lm9QJUUtN+zI3YdJHmfwspUwnJ0lg7Zlk9hBMoV+zI+mhar5LDBnLc26o89HQqr4r8QOWGYsCC3zhvCTujivC7xOPj8e8Muu6Zx4di8fb9/CrrGTwO/PAbz3TBaGugN5yrAvKJuNwey0G+h7URd1Tn0Hg81PqWR0OgQVvyHbIUEwLTuPn+Mu8mPDLSSh8AC0Jk4H2joPtu5eiWGW4/FggSq7JYhA8eJM9rtWAIoiK+ljej8+0Tfnz28z4drVXbzObwheSh2midsnw5+kIijfHgLhV8ZgwNNE2ORqx4ve3KajPovonYI27BL9Sy4fJaHWYRpI3RLHhorPvHvcPqx3coK2UxJQEe/AXbNy6aukJitH6cCXQ6JYX9BPK75a8KyulZj+ZCOycBYFfRPD4ej3HP/wP3rnJQ833cfBcX1PUvFYBgsup/CWe8Vc4/MCdr3ayvXl89H29Cn8T348ZHcU41ivZSDavwl9bwD8c8jmPyLX6X2aLhSLXWWnGhO6UyAG2vHrIFihDGT/vCf9h5sRxSaC/ZEckA9VJrebMzDBfTa8FxkH30ObuGe8CaT33sUXB8fAF1iK33fK0cY7SyH4415C5R4ecUEcWsdOJfUVF2BpkyYrGKtgffZ/1PM+DEfOfEt2sUWou3sCnBgnArVkhIEftCl4jidKBJZxz58nsFe2DoolnsP73RF09M0BEnJWhLUzf5B3zANY+0+IFE8bUGVAEzQs/sgzN2fCIZMarqxxhKmXlSBkhCiusulH/2WNrNDeyb0nC7Av4yB2XKxju/kKuGpNGOQgwsjMTWhYm8w5KWPATuwbP2wvpNRFxYxBgHtklVA48Cu47FUB1YiDlO21jRe8WcIvVIfRUnqAV7ycxJvmT4E5lstoEtWSxekx8J/WDXBKtiD98Df8reAKpDVEwcPaj+QV283NdqUYan6DT05Vhc/qCuzYr4L5PRbstSMc9guH89G309H4ywCVpdyGSaaT2Bp0wNn7OFwMiaAKA3uatTKbwcGBzh5bQtuFbmJvSyRG+xnR9o+qYG3hT262HyEo+idnXN/As4OzaH3BYxBeLgL9b4rY+GE8B26Wh9Wp/hz+Ko6X/rnLarAKglPV8YzLJtZtmYiHV37iM+mmNCnQGGyuTeWSIGv2SAzHkGvGUHtkGJYusMQ7MncwIrmFR4w4hppbjCHvUAQEQgmP2DeHoPQwJoZ54dnDDqTQMAwJe2dTn0AzWPqNh5xEDVQM94Jb3n3Adl4sdukVVaqdhabGVkzdZgZmQ800Xk0ONi77TtVyLpzteRVPhPpSf2g+PqYHNDT3C1i93U0aTz3x8XM5qPU4TTL9ZaC0ajzRs+OwNEKJ3Vbkkml7JoeuXEAJH//y2w9T4YKvN871PgMmS6Pgi0Qhx204TA8GbUjQ3w4Ti5rxZbkgfPCaCUJDsVRYbA/1gdPgQ8BxGlA05iNHR2HTRVlQ2ykG330/U+PRmbDMJAEurEnhRJUMxI5k8KgJ5ZiPihy6Zy8edDsJsX93g44kQcisDo5Wy+Z/CzxIZqUxBFr3QLm7Mr71KcSnam7ctNUavpjKwZqDS0gyLBRNbJ6TqXkEBk9u4ZR58TR0KZMjfhjxxvRgHCc4DaQ05qB1RCcMGltDlrA7jTPS5C8OYyAurwbMTN7zU3MtzIjVB82rd9FZeQ3+T9x9KAKhqAEA/geREUmRmb0yU2ZRSRooUVoSHS0qlLSTltVelBJJoZDSMiohsosISUYaEqKhuI9xn+Q7sv0emcxZhCeiL7LkvhyyutYHAiJX8XCvB/12F4SBvDh81rEfvUY+AuW4fr5lEQOiCz7wm6en6Y/wNAzTcoXpjkJQ9SoIJNWecNAjG3iW6MoBk8JwV8JR9Oz+CspSPThHtRd3iynDmCR9dt6wEZdrtuG+6XW84HMJV5w6hjtsOiBirRssOF/Niz1Gwhm1pSTemMUql1/xnriH/CXoARn9KsPEpKM8JO7FLvOleLuHGuhrf4Z89fO0IMqATgde5zWipig6WYW+mpdTW/1klHZSYoGTo2Dto/2k45QMXc3JeD/qKpcVR6CC/h20nFaGWdp5cE17DIQcMYa/OuvQTGAuh43ciLbFStjgYwnvB/+Au68M/n4bhTWRbyhQTBRCF9nhA9NiOpSyASYd6If6uBocW5LH9968gaelFyg5ZDt3sQLYjR7BSR9nwVLr91S8XoBcfveD6mVNmtWlQMbn47AjIYWEQAokGo6Ts6s4WyzLonbj55AtuJ6it0pBtpMhfh6ewHIpM1l2wxhor1yLlhv7UCvei9g5AN9n+/DhLd2w60kqX4xvg6nfXtOY00YQft4RIpcOg/t1Pc7sP4y5FuY0/EMPHocqwHvrYbq01BactynD1zkZKH5zO/p216Jh8Qx2XXeG39Er8ryizbohO0HUYwmu6DGGYxOc+NvoIv7Za8K5Z8XYYvJ8PNRzEwuC/9C13i48bdNMt8QU4c+IVlQHDSoqS8duiZu8OOE9xS33QqP0VlDyaIYBXUI5MICzXiPIrX8LpN28x6duGoCNvikcNHzD4+zS6OSAAme65zDIITi619PV4BJW75nBb18+gRt337C39Q2YvNufpbN+w52Q+/zz4ziItPTC0qAm6s7aTCcdC+l0bCAYPTiGvsl9vHh/BqjpiwIGCMEFAXeYfOAF3S7ehUuNTNjJNg5V7+8A02sLKVmtDkrmLad3YYYgIheHctMTeWhwBpfOlYCpPAf3F7VArcx36thuDhu/e+CyQjNYOMEN8r3PouOI13jbrhsMQoxgy7xRcKS5gsVabLF0cSb47JCHafdHw+39xRAkas3S5kJc/CGWbIPkuU03AT2sGjh+2nmMRxXw01vAJ0eNxnnl9rRjxyC0yTE3tI+louBwbJwRwX1vj8OxFWaQMFRN/oefQ8Ipa+4co01bpSph1fFWSJwxnUaVPuTIrdGYOFEMVhm+ZNMWd75tI47Xl31lkY0NkNflyuFzZejE19MU6PIajn+1gQTvzfxmUj6IvDiEcbOdySrNHA635qPKp/cUvS0Tnut+o/D9DNKS/pxxNQSPTp1Hy7ZMhSm3RrDXnx5IkW2AsMYkyqx8jOnFI8EmoAolb7TT/r290HNOmO2VrjIMKMDISxdZPfE+LwpYAUfWWEPt8iJYF36RjhTUosjZZFa78Zr8o6L4mZ4e+Zw1RR9La/CUB3hx5C6b+L5lXYXrUMeTCfROoMD4cs5bvQnXHtcFXaUs+uYmDb3NQnw0Zgn+++zFI1TK8UBCPzo8qKG/ca60a8E2WnvyPp/r1wQLxQdUWizDTh/f0Opr0mhuUQlXVFXYfhPQzaI1aLfvG31SFIHu+Gr0+JuMvRkLmfLP0oKP07FZNwoDJqtxdHYTjf3jDauk1cF2uRNA5EpeXbwK1dsHaOU0L1qU7k1+B8MxrH4jrhzxGAo9LeGW4yk6L1HCE1I2gX2hKG/+Oo9H3HmIjRUWFHnXALtCn9DMcgsI2jwAlqViIL61iTcue02iV/J5ZlEfjQl5D8qW80F6x1kq/WgCee8SaYeMIIttyoQE+3skW9RLjXu/09O6PjQI38h7w/9Dm3596L4aQbvLv1NJuBkEF+6G8M5PtCbfDZKcdiNviWaBdFvcOk0Tdj5RhOrMeJ4OIngiuYb8ToXT/vsJ2FqzjwoUr9GFIB0Q6hIEne7naBcmRe1rpVjmzRxc3F3O4kE+eGEglFwqMrB3/joy8gVYYnUOvAdTaa/rJXz9sQBG6XvRkxI/Tjf7TFJBgdRTtZR3lRlD3l4hqLorxEkvXfHyMT2wrFlCbpcuUNWz/WhlIwlN6h+xblgU9pZI4pRX8ym7uRS1onZS8vib8FhWCdft/sZvPD7yx/ulNEvCBqSiu9BIqAFaf/vQgSRbEmNlmLfKiIPmaoL9dGFSGEpFnf1W8GyUPu9WtuIfBTHssDOMJF5Fc5FODJ4+dJBuXjrNOQZb+ZLDWHhjKsgmGadY9uEsigu8gyle87H/lSs+1VOjlJOqNH//fyxfOgIMVt6lYmsh6BnUZ9eABhiYp0eCOSN4ukMmx7g24O3M+bRLlOBorhJ9yfYl0dEfIfvhP7b3Bz7dIY/Oi4do+ztbNK4P4d50dTg0eJ4/rNsCioYXeb0hs3zBVLYREYZDZu6cHL6M57StQ4F6Q5g9RYp05m+mltmT4J/iKBJSkOfKuGUwuWgEhmm086l5W/HKNkHIG7+fvlbHwqsODRx96xbnqU+lWicJUJ8cjdFzhFEzIYmfPCeYGOkO5VMyabcyUu+sUbS1RpI09+WgZzLBw49KLOVrihJndEF5fD5tzZCArZIHWbnvGiZGzwWpyEpK875Pf0J92MzeFAvizSC7KQDkZxdwfd1J6jIfAx+iX2PV1d30JFaYzaSecZ2HOgkd04afV/aQgUYbTVIrh1StYHoqLcgn/2sBr6PFsLzSn39+1uITpsrgPtaO/cND4Y5JFhZq5rDU2QekfzyCb3zV4Fmu18Hn7B7yTJgIwvcWwI4MEwzTd4e+batQumkeL1mXCr8HtrJ1uTtVO0pTeKoExFzJ5fPCAxz8p4tnRVymeaaJHDS8n8abJ1BeBcK+dZ0kbaYDxY8L4ek3JTj4IJaVJ5bSxan/KPVQFLkM96PRzQe8f/c4PN9sALK1x9C+nkgw8xilrrqAH+2FKPp6EDz8WceNryfDwTYp2P54MtzSiyTXyV+hYOgif6r8jN0zgXdbqJHSuX90RXYGPlsdh2PGy0LNnh8wT0wSd025B4K/77On4g8e8ziJfz8Rg6T0ZnBtC6eT38Vg1sNqOq+9mWJb1mL7zu1Qf38XJK99AslzRHCR9QleEj2KcI4iTH18gR0vG2L4LEXmHZF84UEk+P7wwfPLxflrtzX66knR/VgbqHa3hAtTTtEI7+co+kiFPMwdYGpVC9y73As1MsH8aeVvanxoCmmdd/lh7SDiPTXSCZxHC570ULutNzXU1cLn6VOps/w6+VdMgwUX27GlrhNzrFz4WOsWTAu0hBaTeWjZ/RY3ePTSlupuig+XA/vDQ2yufgJW7RoL1085Q5XML7A+5UqxnRnwsJnwwcQF1PhFD0asy+bRoi9B91o3DMWEQU9rP9+pk8GmfEuWnVeM9o9GoHbtJPhT/B83ltvyPgFxeCf4EndviKDZK/ej+RpRvJbXT62/jvP6yzJQcX0dHlh4iGfKniPWWI/nO/TwgbAVfYnW4gyvMKgs96ITrcIQV9+Dh6KmwiTbAZTbLEG2Tr3cutYCt/FU9Ak4xuo6TeDkMAFUrpbSMu9kanHw4pLX6fxt4CQdXD+Xz26xgmanTp5pEIhsMwVm9SfS6JAuSHQK4vaLx+m0hDq7C0Wy4cEUMq27wGHxM3HUzpHwY+NmHB1byQrBK8gexmGUbDidcEbekqHJblsUoaFaH/u9BaAlVgeS9F/RYKMXiig9BJ2oo7Rq7wYSFjCiR1bmaFB/mm44qYNNpyauaRjE/0pP89eHN7h7yjBJyi0FCaG1mOpxDQqkStjDwRJ8akoh7JY4PNCcDDKeu9ntOvF90Su0rlyREl3/8O+rg7hNWwesTs8gGw1ZlhVPgWkrzDjDeAii/SfAktO+GDfxOUjPXoMbH40Fwf9e86jcLxxDb1l5RRcem+IGK7eJ8g6wpPT8JehjZsbOYAEfHj/nUveVUPBQDNr/20/hzd9QS8qHRKdegQuZ23ja8gD4ylZQ03SQ3VIX4Ek3JzQem0oyL1xx7ThvqJCfiMIvVoPt7avw8gjBBaEF9PzpUrifMwY+X52C+Rqd0Puvmi+N3IcWf3248uteHreHYOlJcxizIR/PlU7BaLFnaHLNm68q3KbBDaowSb0QJ5ndoTHbROBeSzwpJFhjyReE13LHoeyPDsglmtGUU1UQmP0AvkcBlX6XgH8lIWBXdRp8s5JprrIUfxOXBP8ULX5l+JhEs99B8pZceH1ECazNvsGrpEu4YKYNjR5iTJeupUV6SiC2ey1ELH9N0j/jWXmrOjxqs+IjL5/iqSRJurgglwZ/6pNv3zGMWvyEM/rH0pgOXdYcHAO9+lV4XXUxbYy6gT6P+mBAyg7f3SqkqyvvwzsoJGHbQFQ7Y/B/83+XQQYqheXQknPNLL2ohYyrLsHd3UHQQl2ob3GDb3+L5UVXpeFZ8xX8kyRNQp1uXO8xCoVTx8PtFaf5qdFafNv8GJWM5ThZQAScSlXh4X8HeGTzYxwVegVnzzeBiEuveMqcZ3jtyy2Wil6KIcu04fp9cxZfSHyg5zk3f1uEo+Z8ZKfXCai94QDsLsngJ48dwPPmRJjrbkw6v5R59n59znOvgo13onh8/GM4o9sFl/vE0brsN22YrgtqARe46W0gmH7ywqMSYbzj+Rd0uHEPa9qayLNuPPi8dCPrs+PgfOIqWqAri5eDd3D6h8sk8LmV1qR30PDhKPwvOYfrw5pAd7cCLD6uiv8NB+KdqmIQ7PSBtFezWGdqK+4J/42y6xRpcX0SXXAcCc+Hb4P2wXEgoCiAg/VfcNuSx3zH/TM/lTtLi3YjjKk6xX4oB8V+QFOCDMnM9So9/FtBqSNdyWnXaN40UQYXCI2AOOtNKKIsBjFC5RgmTvAo4Ta0WcqCpWUtSLwsYIP5uVydf5EdLePBU9QCVtWup70HPGH2N20ITn4NJlEzQOrQfJ51voW7ZK1g+5hhFq2ShhMfuuDYqvnoMUECXaqeU6qaG89IH4Qn9wgi8mQhem0Y145TAjffU+hyFSEz4hCljuxCVUclKPqxDMTMxcio3ZYdzrlwcoA2mId4ocbP+Zw+9B7j88WonBh/CPnjZs9B8Kq/hB9bA5EC5GC6wWPuyRrDJdWfaa5fMwxsGsE+2m3YnbsNfezbeOo7TXq+QwiM3F9SfHc7nBkYIr8VP7k0Vhm+2rew4YNEPGc4HS8rLua+uwQFP1twbeII8Elowvzcz1Cfm4t1G0/i+n8zoCF1GSm2iIBd9GQY87Mdqsx38d2032T03Bpe/HqIVvsSIfN6Kp06YA9p50UxL8sKnPf447T8M9BzNx6uZx6GDDMfKnJsJmXrrSjouYO/f0kB0Z2yMGZiAH44FUy7lr/m484i8EvIiilnMh8JMyZd86O44OlJPCemCh5fA2Dj4Qoc/+YSWo7IhOGITprb/g29StTRLbwIDaRfgESuLoDfSuhrdsAj6WocsEKQ0Mkdd/y+gcc+KLBhvTW4X5Nl7VBzCL2vQGpoga7hH0Cs/xvevLKWj8+bxzkPn/HN09pws+Yx5sdrQHvEMRoyKiMp3VTKm6rOXj0mqNtoTM9TXMhKwYe+eyqxeo4ZGGc4UujiGnzRHwSLnu/kdxtiYMXaKp6QuZ3ULkaAxzZj0ukbD1+eVuK2uUmsq7+cYu+08Ni5ZZgz0EqXJlWwT0IYNYVmgukGETj92AvVK1ez3aM5eO2AOM74bcRJC0tw3+poXtaYTMa13iTeOxakzUpw+Ol6PjlJlGPCO2jF5Zu8Zqcun46ZDR/icshjkQ8mPhKElIXX8V3DOzh335kyV7zlFsNzMDzFE15KCsPcKfnUMtMaKu5ZQUL1WwoQdqd3nY9ArX4+/x23nLc/2UBH2v9DlxtRsOhJOX2xMAHVrfL0esYwxE2N4q2tIhB41AQ6RffTvUoD/G+bHL0OimAWNIFHCZ9ZSW0eeKAdzkg5glMPOUGRhww07XwPr9aeghX+BzBvrw3MPKoPnSJPqM19CV80WEOVYu7gIjeIQQlDoLpRko7JXqD21+Zwd98n3vc5G3YtkoSJv3UxZqYVxojdRW/5KLx5agt/mJ+CyaXqcKZjH1U5zKBpjcFUPNQBgZeFcNfMryx5Q5IVVmjR3UuxfPa8GhhEHkOdimpWPWhJky7dgfDdffBtaRNbTFiN46o7uGjNBboRawYGTwpBzSOG9sz/yxmL9dD2jDZtKWplryZbOHSjhopKjvPQQQl4sNGM+o/acN3zKbCjcQKtrJ+C3417+My7ArYTn8FaHptIdO44qDt4BsIcZnJxTghlZsVioJs8m+RH8qEHXzjuUjeVNSRgX7M+PJv8B4dThnh5pytd+Z4FueOU2HbqFoqp342jXxzkLfIryShWAk7b+dPEimT8b9s1+n0RQTRLBZMSLGBBZBuNl5qGMoeH4PY7GZA1N6DwzmraanWKR6hWwnyVMDiVOxu09liz4NpdkDj0D5L9x8H53ycgNG8t57y6DfuF1pC48zd0P5PBFZ5W0GO8D365W4NRgwR0V3Zhn8ECjP3yF17XtLNKRQEovyjiOym+sFskDYU6vOnECVnIXvgeY1eqwTqXebz0ylYu2WkMS7VLwaRSD5dq/YSJueGs90cB3hdexd7kt/xY1wK7e9Rx78a5MLFRDic9KyC/tbbkFulN74+qwCw3Z04wNuADO/opb98erNN/gyk5tjT7WiK8e9JBLiXK5LpUCoKKqjAm7BVg42PQtHahw7EzYfFKd+xTvQJll7fwgeRQzp0sAppR2aR5SotbB73hWkMHKpqOpeR1Hmh/ewV3lepjxSYdeJc1BfozNJCf/4eTJJSIzhqj598G9volSWWLtOjj0E2aoRhGI3aqwYJ/xhx6/xI6/tcIWjEXUbECMLLWhxLqjsFN8f2YsLuNu9zFYQ5GQ7PpGQhJM6W7mlbwn9t6ONQuy+//PULle2oYWdsHXYGq8FiugOJ032JHsBZmLHgLdvtU6L7NN17/7SeaPWgHhY1fYby/LLiXD1KrE6Ku3CP+OH40L379ilTz36Bn8DmO3OKBN+Pnstl9Gwh8ewX/ZLzDg8ce0Yv8W/xP4CZaXk3BwNRp0JPoCeHZoXzipCLYi+mQn0waC1x1wR8CYSQzcgUGO36HXQVu9DBiFOl/kIXXuVOg4ux7Utd4wzcjnFHQ9yKcHSGCpS+3w9yKszDbXJneSJkRlCtA4uhWHLzUyoty1MFWYzamNF6Cg6fXQu2dOqhw3g0VlRY84aE07H91gd8Im8CJoaU4rLKOza6fg9hyK0rteISPw37wQ/GT/OmZKfhvF4CkS784Y5IcXSoswz9pc1howQU4s+Q9OkWVY5PDT4J3k8BWezVW7UzhCLFekFauoTumGsiVBfBsvBTGTjpIB4V9+fgjFdCO3c1tSknct3MUX7pnBpblwiy++CJ2eQBLB8dSYoENrPFQhf6FlrhV9wBXLrED06J7+ObDG1q17BrY5dymByuq2PNyBV6RN4XeiiQQcJiNZQKV/Dc/C1SX5GDdFTcSdU7HpSfiwFx6LyedEYQqcTH0/Z5J8+c/oKF54+lo8iWUzwjC5zP+wCyPXN4w6jzuOsoguVsTMXo8vxmVg/JXiihWdxk4BH/jVH9FcDzXQ+8UfKhweArMMp0LU6ZZo9eJFDqQOIOmzzek1gAdKLv1ksRC98DM6Z68950IFC7ey6JfL/JpjeWotEsFjVYYcfWLOSDjac11Tp9g49dYvDrbBHQFhLgybiLXWhylxo3esGC8Jt1+84WtZyrwJY1cftlmTOMGrEF0tgHN0/aGjSP9yPeRK02bfhPHz6+n6gkuOCxgwtfqMvjQPyPwHdiGDlLv8LXSaY540sx/FWNoqxyDinoUCX25gCd2yGHdsCFUyLnRnE8ymF34iIp1HsItuS2k9iCLNMdvZJXedD7nd5OkDCwhodkK8obsIGjtO2qtXIx3kvexwZJguJzxAe1HM3YG+NPf4jEgKbsZjDJreen2IvhWM4BdLZvhst8GHLXQFcrrp7DqjCQ+90EFni0MgQcXDuCWrkqSqQjhG4+uUWHldhyuE2XHSamw366UsiQsIX3lFXqy1QecViKvvfkC+k530g3rcJ7WMYrEk69C7ZAaZX7UBLc+T6L7LiSReAgfznfD4tuX+Ib7OzTI3c5KE+7w12WH8G8Hw74F8yloxByYfq8Kro+bwqcGVaDeZj2Nv6EIslkvaebvMBTcIgrevq6w+nwWFp1UQZfZvzh+eBot89vHyUXdyAKi/OexF14xHA13nz/grq/7YcZQEEgqJHDVOAdW1xiDm8d/gLLfi8CqtJ37HCbD91nSeGDKMiySDSWfxFwM8lpJY67dorTPSagwXQvMxJqp/Mtk+DXBGidk7MW3YTNQ3iQHX/idRJO5KpShqAXrLouDp3UajTuqCL0NKZS8sBwWyi7mIwOnOXqRB/5620MBNR4U59lIKt/L2X+lIdy7+JDWnZlAU4czSE8pGR0DdPHlah/u3V5CXYfcyKIpGZ5vVYP11+OA1QtQxyGbR0wVQ4O+5agi2MsrG8wg8eld+nzBhVu9lOCF/inqLjvDflvXwFSLWqpy3UJ5y4rAzHgTtvb9QTeJx/whywrU+2xxbIA17/SQx/NG4jgUowdVtX7860wByot/hJuv1PltrzWkDbfDzMVp6DFrJ2hvzUafzLV0S0EAM/Iu0QiF67RyfhxM2yQMXwTcwOdsMElnjYW63W5kICcM7/xPYPAkfbTfUY4eAqO4aZ48vFFbypD/naUTFpGEcQOKCB/k57OFOTRIAtY9HqBIwUi6mDQOen3SyPK5CwsbLIExeqN5Q3ocZu5/DBOtN+NAoiGE3wxD0XhBePRmLzkbbYRttTbsd6UM/AODaPuN0VTwQ5NDIoHe3m3g1Q4msFGtmw9djqetm7twGZ9FDd+neDDtFW6rm0vCi0IxZmonRAUqws+jElwv8hgFnuXzjBZ1ttkziOUdIpQJHjRhZgi0n06FZwvGg+u4XpBrq8aEj158viWbZv2YzSH7BrGneATpa5/E93dX8MsqU/i6E/nOvS/8arc9ZpaH8T6DhTzi7AUU1lGCksLn/Dd6HHOjDKhvs+W1Lz9xp5Uj9G3ypo7bDyC3ZRmJa0zH7A4Z6G25yznTJ0Dm7RCMeq3DfwW08UFyEE4V/YONG0dTdnIB+Z+RAP8FxnjliSoclFzLUzI62WP0B3D7dBh/m6Vyy7tgqrNQhZyzcpwzQYBf2MqBznAfptk8oMfP1bCsazwlJP5Ge4O5vF37EeTUncbbDcboVyMHbZeA5ppLk1TvEa4QPMDWs6Ro5YIbOH9uMAS27YTHvuvofIMK/MlDrG9eiJbDj3k0vIR1v7M4Ma0HGtP6+fyu1Xj2QD2XOKrD+541uCwkjyYV/eRlL+Mx5v4F6tI4TdV1jbQlZgPJF9+juvxJkOwsR6o2SI92zqSUdhsu/PMFTgp/hAl1QWz4xR0Kestwf54wfA+fC0l2KaR2yQJqf0ijr/U0zPzSjPLnbsDXNbV0wCacynWFwU9nKt0LFuCec3kwt+ksVun14iONIdyjsBNKPWfDRDstGLKTBdfYcKx0yYOJE5VASO43a+n20b67hfTfF2eqnRSJDq5RoD1bDGoCG+l+TjC/ik/F2UNLaMPWVnTtFAADfye2LwqE5V/bsDidQG2kFjX9/I//LMuja/M24xy3+VjWa8QL8oOw2D2B6zoy6aSnBNwqe0ZX/46H9JkCZCoXyopjQ3Dw/S+aJP+TXysfQ52N+nArfxrIlC3Ho3dq8KyzKd/Y8BKmWiPevl/MV6qv4/i0AY6vecBvU0RhjrIHun3dBie2CpL/EkueNUEEnD/voUcLTcEpeD9XfdpPx3vlQbBpHZ0fMud1BVexu08HFCrjaUZlP3n5zMFBo34Uf2zCmllTwcPLgFVfHqK5ytXw6PtCbn2SQw3hdSyckUFrzqbyxzJnXOvK8LT9EOmOCIQn+xJIoSyVS8GFj242wOMu1njRvwaThAlF2xRgXdtL2hHgD6VChtj/NJtcXdz5jrAlHFo/hGbOTynvaD7hWUV4tP0wPFbeRL80YqhuiRcH6LfjyI4AkL7uyN0uYnA54Ak+u8VwzX8YI6tP0lxlRU4b2UAi8kNY2reVpHblsrrCBqzXeYgmyiYgn6+JQWv8+ODsrbgrZCvG2b7G240PePYjAyIhJ3r/D6llQA2yPJ/xaQEDlPSfAq/V6iFWZCnNKU5n+5TbeGrzKxzb48SOQzIAusoY/X4CR9gSyNXM59//dDH3w060a9ZFuduWPGtcCc2PY6if+Yad0n7w8a73nJwYREeXnYMXzhEoduI1PwiayBbXrGniWwIuKUZlla8wbYYnvNpohC6twXzpVzL+2GzM47V6oNLtPGdEaoBDpDcbrCwDTOunE80GHJrcAL6Cchx9sROHn8Vxl0s3fAuVh74YAdybF4eTJZhvjbpDtwsv4qYPfSSYuAG6DrpAq1AubmIjWH11G1kmPMZmx2RI6/7BGd3d+PPwIvCLOUjVUe+x4P0JkH9qAVWOy8lUxIzTJqtQ7T7k1/IekMuX2WqzNeXfOcYVjqHUA6NBWu8fs4YvzNWrhNUXR+LSyNm8qvQUJoULgs61Sg4fzMSKCjH4ukYav25IZ6O2M9TdpYig/ofrX6qgcPMhqGj8SkFu2az/XA0+3wwBse/zUD9Yi7bdWkOO4UKYWb2JK1e5kOPxG/jNRppz3dRgupIcuE0upOJlmyBKwIfsbhynUJ3fWH04FKIdf1Lr5naUEdCHavUE8J84C9MaNpLk1krw1PbjWWNN4FY5wdsR/SCYtoYGzypBzEspcGw3h5exF8DhxyioG6mKJ3xGYMaFOJgO/6ByjxWrpItA/J7HkJO9GSSeTmSz4TAetyocDVqCYN7Z76DrN0SnHhwBFW0NGPlBhjXagulMfBypTt/JoV4P4GvcNq7IEKRVnq14MK2BClrk4eXenxx9/hiPXqQCC1V74bivFpteKgAna6Z97usoVF0fcosnwxIpJVh0IR/X+Vzkyr5k3CeVwhNu5WK0sAub9v6mSekn+fBUE7itV0gbSltR1kMJGjdlsuP8d/Dsojxb5+SgyOiVuGbdIRzxXQ62jfwDCzbfZ2PtJVj91RROJq0lzHjKoodz4O8PR5y9NJG2ayrB+qR97N2xnVwS3zNZJUHp2EiqDk5gvSNFYGA/g+fJm6C8pgTsCTaCD0GGkPq8mdGmgAeiTNH/QiFPD6/iY63DpPK5nNJ1dWHVoeX82b4Mxxq9pAMqxnDymTItmHcLXNV28RTfXaijcxkLZkuBtts0GDJ4gHPj26FHIBRT23O4rbsbS2ECXPBQYZ1r9pQgKwwh9tkkax4EEVoXIHGsJI6KuwP7xf6DnhJnkJzzE1c97cbrXnrw99pO2jv4Cq87L8VbaaL8sbqSqm86cddJaU7uSefE/jiKq0XYNbAG358poy+GGbTgznP8QWLwe+QPEnkpim9vFuLKGmJnQ0mIU55Fc9rroXySDQdL5/OijHckWhPGi183kcCNiWj34Bpk3dCDr6012Ba0BqaXLKCOKcZ8utMOB4QLkFZWwrV2KcwKyobYI5Yge+0PDcoHsMDVTojeOIvljbdxxcSluKveCm5F1aCm83ZeMywFcqODYaBvBUbEWPHEEQL8L/kzSEw4xZUTF5Pc4tm03uQnnl0/CUL7euhdkjMn+b6GxrRglq1UwJE5LTzoroobrrlj+jtNjCAtuFU/hyRdnsMTzzjquZ5P9S3+6LB+EqSalHDy5Of8O6KRLb0twNorl6uiX3DE7nb00AvlL2f2oIWDKPknbYZdm4+wa/Yatkwwg41vBihnxWi6OaMWQqocuFtKGXeI/6QfZ/KpSPIEbHJ8y9nj9cDj3iVM1bKD7GNLOebEd7SMOIn57WpUo6bK2vKRqHP4Mnq36IFb6zGQybgMaiIRLP+knf3wL722D6Pns+R5zhERXq2WSNItNmDhMIG3JUbSXAlv/Pr9EbU8mMM1+0ro3Oyr1LHnEfYlC/OPlZJwxmYt7Ir7DQLpY/m/pFO0RO8XHlnTC7V9zzg8zptUNaJYUUwPAvbr8X+rZvO5OCscp7EOqnxleOlABd+SD6L4ihfkNPSLTdqN4MkIG0z1toUCSxnqP+gL4DMD1r+4T6/nZdNoiThY42eJv/IUYNLbqZTPFeysXg6eJmUsLdTBi0AT5WIv0sVbWcA/18GDGAtQKSiH9Dx99hOOhMLxS6msSIv/iZzGbYW12KYQQ5M9rHE43BC0no0GuuRLKrpZtDppHQZ+f4JWdaN5znYJdO8ezRXvf0BpqxbUfHfgww/rOa1Rg/uy33Ou41eSdzNmVaWDeOn8Tv53oQBfhQvB7Dc5ILVsEhfvuAtfjqjDNekMCKpZiu8jVUBthzCqemSjyFUL6IzKY9/hg1AX7IJ7th7CtndJtF0mG5M8ntKSkUGQe1QKx7+cCnZH5sLISzL4fVcabDD1Jd9oY5Qrmkmj5HNhW+QgTlxUB81++vDkdybGDXnjttSVIOq3ATN/e+D28F98+bo77oj6ANvGvOXP6bJQP7ycXiR5YG3IKlAQmgD9W5PYV+A1bUw9whmX9Kj51m6MlNKAj1fUIVZpM7Q9HYZPu6vo7tTdGL88hC9H96BbdTXci7xBV6S1wP78JH7/bRcJnKvjH8bHqfgj0NhbY9lyhwrbmAzgEosxFNY+EX727sDJl9Vw6NpdPtcawyfXzub6jeXs6zSJp407CVkn5UGzXgfseu+RrPUZ6hAaBscaWRpa/5ybZi7FxiMz4YZzHYfd16GtgZKg03ARx2YHQtqoILToLYNJMqn833AeOjgMgLdODjvKKdFhAxFQnNzMZePyMfDbZVD/+I89k9rI5XEXjczMoh3uAWSnLway1oqw+9lK3LNJj3/UleAW0Xu8cLsvB5xYQO4HpyGvrAdH++cw+uQkkDJzRaW3guBUfZ4Kz1VxtH8ErfZ5gIfO+XFE4nL89mM5zt+pCs4byiCx9Cj8cFzPNboz4VvSYbwxVoyjalRZSPAQf7HOpkJbC4hqauDDDlM46lgp7ssvhhU6T9FjVTBnPZqLB3omQ63cVRhKFYFy1Sau/iEFUPgRf/7SRZcNnXTR0g8/vEzitFV1eIokQFHBGgL7D1Do1L2oPFaV01cbcXihBCxzZ5znvQTnb1Hjb62PqFzFAH6fzKdvRU441nEjjYj0QEF8zfY/RTk9axN8aZjJOzWXoaS4Odw+64leIa7k3vENxo025tO1ETzv01rYqXuYA8u3g+YCpJep1uD3Vp++f38A6Yr9sFBYEt+t3U83n9SB1rhjLOWgyFYv2iBjkSBsWyZDHfn+YCz9iaItHPhi9yCvZnfKcHoCF2ZN4JXjZVg9dApo7Z5C0QGj+N/1s+wioQ+WNnW0vl+L1cP80L08jvL0F/KtPZOhfO4/uHUlBDbkKLPnoX/8y8qOLximsOjaXs5anI/rP57FpP9kIfOAFvy5IkiPfluy19GtOKZUny6EyfGLQGCL+yKcVKtFuhuEQcXWkrzy9XnSMVvewvtYSPE5xg8sAQvjephzvQEuf7LGfws14NWLJvTOPw35CUP0IfEi567fRVijB8Kt5vQwYiYkpjrz6DMK0PlRn18NdbPSnHFs1hcAV0edwYEs5KMnpjMkZyKcvIWrlaWhfaMmjFoegsMqonxJ/jO2Gc0HwfdDYJ7+CX+F3oWUH77c62gNnTcU6PYeS/QYvIKTM47TAYF/bNp8Ds2kmlDrdgPoJM3DipvT4N9Ba1r29jXNelhFCjracBWiaGJ+KR1XFIcdS77gt00mMD1QGCQ2e7OoQgtfbZ6GbWKXKepgGX4+0A+PLk3im/bn8NIjAVCP1QWL6X40c95nOmMah+fjG2nyxI+c1H8Fsx9MZTPXX9R+dC4NRhmCh4E5KRT9YjmLZtYq3w30ZjnsrFMGofQ06HMYxrEFo9i30xxe9ifDjDU36eWYOHDKHkeVX9wwtcsS1mzVwvTaC9BRJAMug+JgNNOFcg7H0MXT2jB71zFScunljpnHOXPEW7K0TgFtj/mwJUcO/Lqu46tgc+40MwMr0wZYa74Dvvj8wIHpQbQ4iEHCModvusvB9VlL8PoEbXr7p5LHdq+Hf9f+0siqJhStqyRVrUheUxTEuo0q0K+yAA8nr0STOlWS31aFlqVWWHaqgx6M8OZAs3Vw/fB8HIq2AIF3p+HHBB8uSVHEFREnMKjNjiYJ7mJz1SZSmfGHcIcV37OQBP22K9iZvoHtFm/gzTHVuGFSCrp3XMU7D3+xS0YVvhq8AE31wrBOtZks0zx51a0CaD12mwUSHPBWmDnsvZBIL1d8poEDhfxcSBNKzfKh+8dzHGW2gdMXT6Uf1wLgvE0eNoxsQuFDFdioY8/1itqge3QE/6tqI+VFLdgxNhoUHiHJX6rm3gnanDfTE9w1iAVWWMHPn0aoUXoMArt/8ViBVaRmY8tyH8rIvDOFTR3VIF/yHmTPkYCuxyWgdes3WT6zp4khMyhtkQpp+V4ndacUOD9TlVZtsoC1poaw5YwsCOw5iC8ThODXbA2KDp0HIZU74WI+s0FBIHlfOsUbCk3BbKs5Wa8zwX/XymGzSC4rbepmaf35WFt+C2//84fsNC/yFDGD+6NtOXtsF3mPnsDGTZFcNVaGijy2Qed1EbJdv5AXeXrhyEA5eCm1iH7qHaSeX75suEgNhDevY49IZczYls3m5u60xVED1ObaQMcWTVjep0EN2y0g8WcOu+97RzefAaiPk8DQiv1wc64orVbVg7iUXLTfKA5KBb3UIaKJ8cr1cE4jg0e5dPGthhh+L5CNnjVqsNZuCR+MqmA9Ux/0vjgaJd0UwQ02U4jBOKwM6+A48UI2jkbY3FQKrdMSoSqsmSMFPuC78FR427QH7n4ZAst4CV4Z85uE70+EvBPXYGf9B/AYVuRPrdI4SzYdNvuNZGG57fQmaDoc/FkJC1OtIS05GlrWVUD3Pk/QuahDzRduoP+mL1R3/i1d3nmHS9cD/G62hvI6dYYDv7CgKwaE9yhR9+whtvqdCW2Nh+igYBvd72uk9jIhOGoYgTNc5+KSKlO4e06LW+5dw+kBLrj4fCRZdJXhX9H9XO8+CqLS3bHszjArPDPCcyQE4cOBEO9wF9ZfEwQRp9/UbypM15aoQ7hHC8zsKAHPFi3+aLKfAmg9JJqlkbn1RT4n70pj/c5Q1VoluCDQgUsyreln0VhKqbXhsZlP8ZR4FJ5VCQUfqiTzQ0fZN8YMNOze80OxVEw+5AP9d+6RsIwwnlOzhtvDIXz9Vik1j9LFj0MAK1cmo+Lf0Wzs7sbnYj0w/b96CC7KBQ2fS2h4WR0maNxmtzobWPzuNXt3SrLZjAxYpfeRasMz+XtSLMeuvsDPZu+nm0fWkCIrQdKTk+S1fDWLWl2CKbN8aJ6XMw5cYbI9lghJTxPwY44XNq/WhkEDTZS/VYitpyZSdkIFrZfZwakm8rDwuQPdq2uDKUGH+YS0PDwdmcBv2A9OT14D7+QZFsmr8+RiGT6Tq0+HBjeT7ao6/rtdBzpcAFLrPcnvTitWXJdDt6yNYK5bSq4GEtRwOYpszaLhS5MW7DRKA83yO1hiNh6kiqr4Xt45frbzO8Y+20H7PN5y7s8ElrhmAenJSbix6gbPnLaLRw2eIzN9Yz5OYtS8tg/O6A3Az4V21JKIoBysxK9Uu/jiowgumrmTo7RmwwyNAuAMIGfTRm47kIwvraaBWdAZ9NyxCky2dEJWSTos3nmTCtdlQLfzXd6ywRB2ZdmCvJgYrMcarDs7jxfa9HGOVRBNtfrBGmaurPdHgXJuSVD3cWeQ9leHn1onqOJuAs/9OIrVS2NIT1IArl2VorQ5Epg0VwtUWn7A00IFUCn5gEqQBvfNu+l+sQLfG5eJJ4PyqP/EMXrg6ogZIfnc/U4XjsT0QOypEho/0Z41uk9Dk2ILV+1/TtN6nvBrSy9IjC1BlwMjIalkE8a47+CW7bVsU+8Ah6XNSEmrAv22y5Nnw2cOCHkAm4cM4Pbtd9ywTJ6mRGuy0alOKlxpAc9eryTrrftwe7Yr/tWuRLsEachuPUxdcbf5mWEW6VqakVu4PVUm/UYnmdF4o/IGTxuqw5z75vB+lgK6iNWTovEf6puRyOlKvWQbLsORxTfppm4vV9215QO24pDiKsrFR+5z1b9AGpw7kju2+cAvgVCYaCzN62SfwluZNNaxHA+2Zndo+eZ8PnIzHKuOhbPlgYcw9uEcku56SLjqP7Dw8aQGK1WY53sfRAcN8MwnFarnQEq4Gs8fzsWxfIAyDgrmwIvCkbjHdAw0vV/Hq7YogsGwD51Y9gyrne1QfOJDemPrTW6Lj0G79h4mXSkYPTYWggZGkOg/HxIQ/EgeF2bDOHMh7Pu8hY+b6vIZs3E8LssS9tfkw+qpPTjW9Ds8y5iJ4hXX8VBDJWz7swHtxRfhxui1HPRcAQYCjCBS/wtZtWrw9NUvWMpXn+tyYqBgigUGWg1x7+xYVv8zDrrZhtu6SunKeAmMOWUIO4374GSLMxzuWgn7quawsZQXiHWqwP3Xp6lm4SuScDpP7TEnaPTUE1D3dQAjBqNR3UwW5zQHYuxBZZj/9jYoeVTA66vD/Kl9Gg6tuUVpNe/hj5UDrvxWxNsMP/E6XWsIi9zLTZGudC+PQaOugUYXbMSJr37i/oxmFkut5wjb47Dh6gi4ZHyMjWS/4wXHKJQrqoXftvPAaVokDdqZ4FG9JrxwVh4eFhlBYuBvemsTj2eW/+USuW9gP302kMQ3SHK+SwKlSXQ26AVvsxsDBbaX0E+2Duf5vYZDyT5wNvg5er7Sop6/Q7T3WjcYl77k2EA5WPLYC918f3Hn1I2wuXAPfZS5Alhvw4az1PFTTSiHRE1GhWwp+Pp5OdsJrILaYy2w7KcFjigPocVjke6teQHBZ5ZhikoB2CwyhuK4GtDxFGGjx1tpz6ljFLrvGWlauoBv0FFoq19O+j3DcNfIGl46+vEvSSkeFFPAm3YvYPlqW7b+EIx/v/0ko3lBeOKUDxamqMEH8fO4Y68d1Uzuh9sjNtPYl06sIzAM8mYZMOqGJi0fbwFZG6ZA2Kk82OmiCHtNJ/HM+2lQ3yhJVdsJt68ZQDGvbHZcuBNlSuShO2Etuy79A6HTBygidhZueepCZwbCafeQHEy6FkR179ZCwlgbuPj6Bj3WLya7QQFuEdBkV6WXMCEjjRtHX+cRWqvITjMLM66IwaKuKnB8ZUiK+2Kwq24NfY0/RZPKd3NE+w6wEv/Gzo+NaXisBLTZh7NJ3mZMEmqGbKEEqIq1x9hlwhDw25AD/Lpw9SYDqs9Vg49XU8msXZNl7DTxbMtVtnjyhoQXZsMybVEs9bvFM2zvYVUigviN/SgsHMk73Q1QMPQExpMH7/Wdw/qBv2DIaBb/TviIckkMCdI+6C85ClzNfoFr9Bxe/3Qa/aeBFNYcjX3tz6HRopJnWavDkcYi+PXJi+yV+2jwlSu3jd+N4w7HkpTbRlb8FUJL/0Tz7lMmcOTGI/b8kwD6e61ol9AhnuS4AAdnrabPrm0kdrqaPRcepkmGE0BiggE82O7L3SsJ36dowcE1I8nh03xa5F+Ns92bUCttIctLTQV2eUhS+6ej/4sdcN91GmTWuWDugUv07bgHbjH8Ct1Qw0pN4yAyMJwP7LMEGe1aCDDxhsVqmdA2XhbClyTxY4s39DitDs6GT4byhEU09nMwP5GX4JfHr7LbnKtw9I4IN1k4oPfUHbA0uR6sZ0jCOtE+Hh/nTQeeF+NA8l6uUpeDNblveOhCJun7b6f/Wg/h8mIt8PzcS58fzeQW571wbv5IFG/Ix5BT6lix7y19+NGIPhv24otNk6DkyHjCB2Uw8tYuJLdNvM9pHkw4KgFiYQdIDJxxxsFnZJ+vBb3zn3OudAvVSJ7FmHx5nrvkHJ9XOowOdrVsICOJl3Ou04Sn1mBfFQBfPuixq89ByHyaRilvzsGFdRYYGOxPJc83cM6pfrR/IgdvtiqBt/gRnmAcwPavAI7N84dQuy24b/kNqhwpAmWLZVizzhzsnF7R+8qv/G7HJ3qzOpFXHOsA2zuG3CTVT+2ei+mAbytX7pWCjgPn4U3lRNi0votkxu2HwoefaPJVZUyKPURWS1Qw/nANxk9UhfxILbSIj4J56tr4b30Etmb0ooW4P3svPIRF02tpds8HsD4iDSnr9SBF5QKZ67Xw3AnSdLDoGKeOaeUJLXHcoilD8+OU6J+IPuhM3AQXQ2TQVf8Fby+MwG92iRyo/YPeLnsHE6bcw885JgQuSiDh+phfrRsJl9rWYFncKLyaO4YDHeXwfOcuDjg9DQx9HoPoIz14U6ELLetUqTZ1K39ethTMLHMoQ0MVXMb+QmfZaD5R9JlNVCzBOjAIIkrjofvuYWgNC4Y9O//y5qoGDIocBJXtE8mrOQLXflKBpVkrOedYEY65PJFOKM+lJbscuOJVL4ldbccQ2yCWbD7AkS9GQVxUJ40P1qEyTx1QPfUC1k5dQx83+kJe2mFsHTUZ80500oRkDQh5E0j9MeFwbsseCBVfDp+mvcW1N51hbW43f6jeh1ktlpSzjUFrVQV32oylwhJZNlpRhVln//D+y/FU1R3OXa5+ILogBBsDlOHA7VCe3z0F/+s9zZM2VID0pym8fHUb33l+E38fSKeIvC78vs4QAhqcKfbFQdzda4nmM4LhrEguVYiIcNidWpISqYO94T20vNoC2g69YZ8XL8DLvh0fncjgL4np1K3WT4KNr/DfgX1gO+SAk6N1QD7EjzNkZuKMDiW+NZBNgktns3SICNpV/eXLKTt4Zk8lqbiMg7YH5rQqYzHY5fTTLHVfSC2N5o8FW/DpplHwPdEcSmg5WGtag+9jDfYyqcYAmaNcY/SQ5o+azoNGDnDjnDq9vVGKw8+O8f771pAw2RuXeizH0Oo19E9BmJPd9iHsnof6AdL8YZ8+awQ8pbtDghBdFEZTtf/D9i2FYKibQZvFssHpijXPLKrHGM2d8Ez4C7hpmcCqh8PkkIDUE5sO11xXwMpX1rgipQK9LwdzudJCdi8+DY3NxjDu4xiK98pm3x2aMC5LHyd/KGaNH1m4OnUHmOByPGGfzUGfx4C/y00e2ZgNX/bs5dLD2aic/5cfHHKijy2xtEx8NaRNmo97SmSholoIJB4/QtkfjtDZ0sFp8VaQcP8Fnpi5nuKHNbjOq57HyYuCyIosnJDrjj3Zs7Dvjw3WnbQFKbFakB5vi9qHPtCZB+50xc0E8npTsKDuHJxaGMqS+VkY+egcxLXIAK+M5sXumzilyQSW+4wE4U36qGd5nPYtn8eeDw+SqFc6SeV58CGzAiwtPoU25qrYLjYG8KEVKkWsYF2Rc1A4bTEFSBay3+ipfN1jOyk1RkJtYBWa6kpBwqvt3H7XCKwPnkV1LeapIx7wzF1hVC+4gp0nykHzhVCIXWgOtjr5dLHVGA47fua5qnPosvg8Sq11ZaifShEfBXjBRz8qBAvQbBlD3r6zaGldFZYFa0OatifGRtwn/96LMOJ2KY4SyacpZxAEZ3yiQjs1To+vhPKHZqS/K43XK+bCzdwwcrwP0Nk5hN3/jQZduxcksH4pK3nFoY7zcrp74yckpwSBAM3jGeUEbn8rKOKvAHwPl4K7xitpcFwSrtMeRWWqFli2ug2Oxxlitaodvm7P5i/ykiA/ZwyKF0uCYPpE8hrzgksn5eEMrQlUGt9LZqW3Qe3JYjJvHg1Xo3bA0P6TUD5sy7vf1dIRqXd49tdsLvIawaVNPei3/gwsMjcAh+Uv8f2seC4vOEDZhWcwprYQDOra+eXJeu5s+Mv/o7g+1EJg1AAAf0NIO9qaWhraaSmhjJJs/qSBlC1FoZASUimjMkqk0iJSGaWiPUmUnRCRkpTtPOcy3lHHvvGNFZYw8HQaG3kN0aEHV0letIfDHaejh/xnmrh0AzY5x5LfvQJIXmQNGLWEzGre844N/pC5KYZyy0+TV4Y9rxkqpe/eHdT9exXpnZQC42VyeG7iMFuOi0fbzSPh1r+/3JeziXXmP0Db4QfUfHYplr02gk33u3mO+SWodLenSysG+aa2IL3v9SWpkm1ovsme7T8b0E5xC2gYfQKebT0CRZs+sqSjHedMD6NFdtdZZzShr/gNXHbqEKio6YCeywz0NBSjD8cm0nlrKy6ZE4e/CjV5QOYOpNwaw1Mt9lLPCWs47t4GK9PFaN0zZ/Rc30YdZ9ZSvdBKPicfCsdvCkPLax/eP2oUCLpE0oGWeM7W/MO+q/VpxZo2vH4NWSTXkEXG1NOiK7W08vIokJv5DlcmWrFRwDWwerQHj/sUYM+IITg7xZxFvx/Gdl9vjrhoBSLqk8g8+CynqSehfUYcj9U/AWey93LIlgyKXMzgEJQC2sNyUHPKiDasksPpFv9RvbcL/1RbQr8WmXNk1y9yLXbFvLvXMKxDAi7+7cG0A+vgM2xjjz59kGzpx7o8A4je9xcLqzpI20aXhauEAYPOwrQ5+/HihlegJMwQdGAXKzn/YsuOnVA6VYK77CSwUGcMdJ3aDHnt+9HW+TeJXKhlw/d59FDxFSyJVuIn/5TJ/9tlrNYyAIP/nDCmrZzkhz1IpCUY/8MLsND4JOzJTsZm8UT89lGE8o+YQGh2OzwoFIXK/TUcfH86dzV8gQlbJOFv+zB0+3pB9u9+bHBUhbB9hdSp/J1yBxSwtsWa1b/Phb+nPVlg+VnW3GkNMl0asK9YHUqH3CmoJRZjdxdiQs9PiqxMpTk/HPBlSg5efziD3kwz5gdtluDofZr7HgyhfewRerpxCJLuenPvzEhoXRpFfjZhoPVFj9a7S8Ch7rf8qPwALjv+HLePNIHJmyX5p8Rv7tmxjFuzb8IM3R4WPDAB8v6ow/NbP0Gm3YBVioJYamotG2Wr8+ov7bz37Vfo3l+GlxttIHavKrZMNqPQ8mf86N5UFBG/DJffLaY2o3f0VykEOqrO45mdYpB0QBkcYjfyk/ar9LZyL35t+kC9TedIbuF9LHsYz3V3z2HoFFGYtMeSNhiJ8q0pmzHe1wPDk5TIumoKRIi6IXc44rOD7tQgqwbhkR1kJXOa4r/2kZTFM/CVmMWbjv6DgqMjYMukVhLWyqM/z03g9Ugb2lmpCV1jIjA+zpBrY89C6p0uXPR1Phdbi9KU7zdRo5VB7gKyyoYWrpybxfnjzoBj/lywur6CrEUkoC3Mj2t81Dhw8SSI3uaBr7vz4H4to/u4DXx5lgpw+kl0ebUKVgiW0ZwiPTrTKAzNV6xwq81R3hnRz9eC/8KioXbylj/O3/KV6ADIgvzrGzw7bSSIS4WiUsBMkrJ4jDPjFSHXupDn/10KFiGC8GZeDwo9SkbZPj3Q/3ORp7WmkmvdLX5yZBpvffma1tl8J599K/jg4XwUfK0M33ZIwwJ7Ddolu4f2PBcFyecTqNFTBZVuFrLUn/F4a4I0bYlIp/+756ajNJ+xH+L7HftIc+IZOhXpwTcVltDRona2DEiCM5162OtiCCW73rLEmkSK6O1gA5ez+K8/DC5MM6CbZ+Ngf816vvt9Ik16qweRwoo4W/cc5Mn1w/CVyxAZYAwylv1QEFXJNzXsSHbHBe54qwcvRn1GK6ed9Gm1Mgus+YYQJcEfDzlwQXAfRI9ZQ9YnD3FB2mRoK41Bq2OrKe5hHXwZOAoXj5yG1xmDeC5jHw/KmEPhyu/wvsUKTuYtwFueprzlhwS2T71MUjdl6LSLM5Ql7YB1VRu4Q+s57lsoDk8EXsA9ugCdEtYYf/QE5ArmcNppF9B7Po7Fuk9QVP0SnDZ/CsxwTeP18+fgLufD7BW0kj8oTqeWYwP4YPg9ecdo4KMERxyVLwUfgnv41vx9tDWlEEKetdMStXhaFSUM6x8/h21lBzn/2mF+KmEHPNOZd1nvB2f1n6ATMwdz8yWwpsyO9yTpsuOjZSA9+zpQtTWgmQO83udHWxyEoXZ4A5e0jYekX4nYq7MTwuod4bauBrV1GoGJ/ikq+zWGo0pFQfDod1Z2UyEvsRdUUi7Cu1OfYoV0PF9aNAJ0l3ykVW8SIdjYmlO23OQ71WX8OkAL0yxssUcoA6e6/8b9eaPh6Iy1DIeVubB3L0f2vYIWN3264zIe67Lng832OQDycvj7oxC82NbCE2X/0hZvI6io62DRkFAYAWNIOGYIPYwv0oy1I6DgpxwMfFZi++XidOp0Dlm710Hf9yKQmVRDSSvC8N2HgzBpUhJt9BeAo1Kr+LjaWNhb6c2vb92lzGln4MjWaAx4J4Lnj3nignhvuhhtA1rllyH94DoOrLgGDQeDYPEuVTxWORfLut+yzILZXOm5g1duUITHWr9AoOsTxcn+pfsdZWR1O5RctZ/i+8UrcLbJL5yQlE72N1Wh2VUd3x+5BI4TUjDvrjMevDLIF+VnsejlWnp7MpzCXt4lL3EpeK9VAfJG92Gb9gGc82seOCp+gM0ZBtDZ8JTaIpbznohCKthqDgELa7jwaCWtStfn4QQbaJbTpAXLg/mZYAx+VSrkPIsy6qgbAS+XpYCKui397a/GbEEdit80FfxVe/HCorX47ZwCLPs0k7yTRsPtTZNJs2s8WB2bS8E3d5JLti5E5/aRrtUqmrPkDrSJmFBStQ4kPhvEcYJR3OisjPVFaSSU3Q1FrxHOnrPBg9Zf6Oi/NfjvwGRoipTCpOrZVJ0RTZlKCdTl6kUS52fh4/P38MezAJo+ZhXseasBJe4fWf3JLuqXGkIVc0fwfbAG6jOFaUS4LZ3teMYh2wdhw7dJ4Fi9AXJX2GJIogF/3l1Nj6XLSO9SFgWvXAXjdKtZc0MJWSdqQLj/Ijq46Az29Wyg/s4voD1uF8lvmcAZm7/h5id/cLutK2uYKUA8z2DoGUvf7L5xvVQilN17x8rRG3BU7WaSOVxBR0Q0aNubKWA8ThwOfXjMO64Yk+2by3i5sRWslkkgzj9DTzbowsisY3zoohCIPVxIBtMDQWrDVGz0fo0Rmc0Us0QR5dIWUk75B7B+7ISLNdVAB5LArzOQz1n70dLAR5xtr02THxImxC8gMbu9vGfbBb4wahJsrdHCq91/eF/9P4pdrcLn9mWipkomTjpjAEE5YfS7xgNa7WXA9HMypw4qo9ikChb9GMfrc9Ox7qskFqo78K3IG/xfyH5sHK8C8x9MZoP93fSo0xuWFNTTk0eXUHnsUcz5bwM/F7pChYMOjKlmcMdSl2Wag+jHLWGcXtoDOZdecnnuB9qi7Q/n1h7CheUvcYb8JNBQrQSx5bs5qDKDmqb58zKPWzRhYgV5Drniz5DVXDSnBpQ+WoCp72Me2trDY12O8LilAnRl/jVas4bp7VMzyri4ji/V2nBKhRosaurGxXUrqcBKElWklWimjzO16b3l0IxOuHavH0OFosC+XAY+L51Ox9qW4K33/6HzxpFEJTWsrSDDK25+4/nLisjl3SI6+M4SIhvySCw0inyiV6Fm9xWM0zzHDyXLcdHdT7j2/Sr+EqtEkqJj4PY3Y7DUceefuVtYP/QuVlz/BmtNf/F/v0/wQX4DapIrwDRUA15pXaKf0w5xbLcrpef0U15LOTycfRpcC9ShdGQomZtIcW6IIPRVmVCRObPUET92iRrJyW+GYdYbJcg6oghCkwrI7PN+LHtBkPM1EidIL0PDI22wMUiC27dUo/N6A/QwPkxNwc9AuDWMHGOEIWJEBtYWXoU163dTxGqgx/cRps/bjelv91HAvb0YYGrGoXFGUBOcSVkTEuh9qjJW3xoDKjarSV9qNyacXYvb9GVJIzaC3Jaog98/bxotXssHe1LxhmIcaieIovtOSTrzbzFsCLhHpUsmc461GVzS8ABjAw2+XzYO/gqs5tiFwTz7pCPHBVtxYKYq7vs7jTwGhcAqrphTL07jbx2GEJW7BzSbLGD+Hg2SsA0mhwfisPWxIMpriUD2j0K6uicUI27toZjNW0itjtFmiyN2nejmE8KJUNnsyb6+oiBs4UAeCm3c3KKO1oGCbFmTxSevlpKhXRILp/mTUm8cvttMkLm/AQR0lUBcrRM+O9+htd2XcFe1DF42NcUQKzfUnvgFwzw1If/5B1J7/pZT7BVYt2A6VxqeI+fXmnj28FbsCZqDLxdKc1C6DhwzOcyLw0djxvZG7t92ksymfIUyp1mo057JXc/WUeOawxCYMAmODP3HGZXBpBk0Fy6YOhD8Os2FPma8O3EWfDx+BqNlFdFqkg6s0lRGcaVZNPnQR4pp8MGqoSI8o1hFdfrZnNZXDTEym2ih8AhwjAsCtYWfsF9sBxe+v8lH5e5RXooqOnIt2bsNc9wzSzRsngC3+/7wcokJeOLeNmj+Nge3LW7n/rF+PKyqTKnF/9ChJgvHGiiBh04BSzb9hkMji6DOfj/YVX+kqp4+aFnzmX9cLANZZ02U8jMHx9WTsaXkDP3w/8sbE5L5rKEpzSpy5J9a3vTSNRbC80Upd2AS2NdtxXK1eExd3MpDdbtp0uKV8HSkCD4vbKC6WfUc1XgG8i2N4NPLKRBl0c/FFnU4FtTRTXyQRIeSWbenm+oL5uFH3/MU/t4a/khsodiZ70Bk2moyk5uJUqpO0LNsHC1fqghy/R1cEHcUzSIlwWVGMc88sZyV5FZi+GJPsFLewxMP3EFNDSN+rFRG8wqGyWm5NjiWv4KnB4Vwx6EyPKafix27dpF5Zi2ljT+Hyd+UIfBVHCy7rgneprf4X8w+ln69FSyX2vP0pvXsc72ciyQ18FXOazqbE41xkiowxfMHBY66i/sflwH8XofLc9/A74flpDzwhHN995Dl0VgIPCsFgsfU6PajZdy+soFTE8L4RrwPZ/3yoG9fptC9+zp0xb2FReaaQMXHqezY6cMZvxs4auYxuhs9CtVPvue7xkt4cHEd6a7rRKE2BVCOWg4f7F/RqDvO9CSuFBdPvkKp1pfhcbIUtuci71r9hfykdSEnfBNuCHqEWW9COArCcb2uF4W7fOG9pT5YdXIypNhXUPq08SBiJgiyqQvAIX46GRkrkNJ7Sf55Wx7emu+CH28b2PmGBpWJTICsw4l0aUELvG+qoIn7+3m5rygEbg/mtNO/qPTLDvgxS47U8yxBacolFLAQhaPzAyjGK4FVyg1pY6YFCJ89Sz9HbeF7HsXQlG0JwblR/NxbgX+9eEm2iak8Y+stWOPQypkpq0n+WREOuk3AQHEbWPO7BJbPWYO/RJvA999uvpddynr9qyla2YMKmy6AXEcOyebbglfzZqo5NI28Gv2p+O0ZuL3ZHRo6fuLnHl0s9QjlptxnmN1GsPPgeegvqaG4enE6NuUDJ4xnaL0izGIb88G/9Aj+rNtLFiv1YbPYKa6OWQgZj+6xZ/0pDN4ZyFkDw1w2IgcPPRSFrff2s+gFTdCTPAaFG6qoY5wg+ihf5v0xR3CW2FywyNnIOd1DcK9dnGwGxcFQZzwcfP+YrxbtoA2pkax1sYQvOF6FfwfXw50GZST9mVQoJgeGTr+h/s9ReHXgP1rQac36xyNxcqooqj7ZjrnhBeD9MxpE2QxUtxyDzSKGlHLtO6yJU2eoW0+z+kdiaNZ22lfvjde754NvgBAc+OIDP5OWYDYE4fvL16l5Vy3MCl+BCfYVJOCKPPN8P857bAqbVUrRwF8Xc+cF4GV5F3jxYiw+XyAG77uLaWfrFRLqksc7DdJwEPXIwfsGBZmtonFvmjluVhfJWAjSqvFfsEU2Awcqo+jrpvFg+eEmh+gYwOZ9MvClciE7ZcriurmNUJzuxwNvA9BOMZRVKy1BZaQFOWkU0U/N76ARXIqLs/1gUq0D9rh6U3zTFE6d6YkGizXgWaQLeEwXoe+L0vC46XjKPuPH1Xc+UmTmRpgQVANjC2opJVkRXqlUcO9TW77akQbC7QUkql4Me07PAebX6C65ArTnFnCDnigkZ8+goYcPqen5A3ispYBnlr2jT2ZnOL/Kk8//MoeGWd4grDwJHqb5oOPttVgcq0cxts4wN2gqW/hewk3q0mRb/ZFMf0fwKbIFkzonjrD7S9IOKqwRMZ7uNX2EO4uMKHPTNtJKzkZdLWX6e2w8/BOeQWLfVFixYRMJvV5Lt79t53fW86jguxlbGHiSbbA0evvZwMQoc1QrmAMfHL+iz7plsP5VLHlus0MpxRTa7TqF7TJv48hJEyG96R4tG3cUdoU186cfSfT0njpXr2Q4v30knmkPpq+n1vHnebagPG8VXAk/ivVCp7FUfCSGJzvx/bNzQOt4HcRPFkT/wb2glScM8wTPsPRBRYrc1kvnlngSmL6Bjb6uJNxlQs1hxvhUsQ8fF4lAqM4QlT2fAHo3d9KbHAFK1N9BrUO9JNAVjdJOhmRw9C7NPK0O/cfKQXb/VPw9yxN1DCRxXPcdTjHrpVa/r+T92Bw7ksRZYhnAy4AlqBn6GD0fP+InJIG9as38X5AkfX84nt4H9HNVRirk68nBazsdnunrRl4bz/JoVSFu0mtn3fO2fKZUFqaOtcJJ8UtZ6e4o0PCsgt6/IehsdRh/tj+hy6mBhA4LOEDzPf702c/rlRdw31oRmGclTVX615A2XsPerpvQLimC3XYFeFpAGC9xJB861EBVC0eBgMtGXHJyL4uusmWf1W647XcJ39BZD78DpsC2ikC6eLaFTBIYPvt/pp5aE94qFooxgW3UpybNW0c1sJvLauoTaYMNQz8gMcYQPpqsxN8uL/D6uyrapt0Kip/DeVzVHbYRGUmGn/aQa9hWVlklDfb3TeCEXzCZeZWDtGYzmj5uxJM1jSSlKEPyaStZtmgtPTLRhG9nZ9EzFRG+tL8Vpjfs4X81Arxtmy8Oic+DEZNPY6XOYui0lIF9ZyVx7o0mXP9CAPeb1HLiezcebv0Dlg9sIP2xNk0UGA3JkybCoQI9TFi+ly+ZnyZ5forWLzeC6fxr1K17lSdeXYlb7III/6mB8otAWFRbzE0eF7lk4DD7Ggzjl9D5uGzHDRI70wDqrnr0a7UkgFYXCPnFYoPoEBnzVYh6k8kCM7JQaPoeCkm0BQVeR7aa1uDy6xPpyBehRuswLPzzCJK0RuGRDTKwSvc4O1i3gmf0Yy4VE4XtqjNZIl8Pv4//AbfSvKi9pJi0EuM53ECJtJuEiN9vpaS90lD9aCPdDVWhJ/puPFUFUFciiy6dqETjjYfJuGgLlLe/QK03GjDTLIt7gxaiYoY6y9uUcs9mBfL7OJk9gm3g3Dcj6hyaTy6GoyDunDdWXS2g4Y/F+K2/Hr5NboBxtnvgUXwJPZDZAE4ui1jvpD64/RykrisquD7DDB6WTYf9wbUsdNiXNzpk47JvJ/jk7SZWkxWFgClKWLR2F1xZaULFX93xiGkBj5u9EUoinMn17hm46xZH8jnj4aq7He8IG4LX66aw4cgCDtjRiWtfr+VV4nYsJTGFl81LphVDQmDxAmlF0AESmB8Bl3d2UUSpBInOcWPormQb8/l8Z+VdvpojBaN2Z1HFLWS/nUbs986ddqvMg82Ch1FBS56akuXwbuRR1vhjDAsK7rKk+CtMiLiDrxYvB4FN3+jwkAnaJimB1y4A/95D+NV4DJTNygJTyxg0f34Ck+NuUs/cjeCSo8J5jxLBoP4T128XgJh6BTB9sJhO0yd4Wv8Lr8nI0zhFB8xusUEHj8V4a5ECjdd9BIf2qULsx+3Q6JSO9S3OZGjbg8KCuWyxK5nlbT3ZpUsC837PoEOplrA1l3Ekv+Nj8dY0LTebyyUjqKkgFey9V1DWOEEo6rsNY40EoODHDhiNhpCy14u+mkdS9JcCkt89Grrta3GLVA9kxbbB+OMqoL5rETvH1mKHRh+fXxlNRzu248uW6VwxRgsCIrp4dfN6mLhbHtzMXnHnCgvYpCiD1jH1HP70EbRYyvLncltqeRtHP6GXP0mpQ5zKANy9ZAaPDyzF21ufYe7Ea9iX7IHZoW4wOnMCXWhwwYQhRVBQ34q7D4RwTdsEeKN9kVRzD7OLvBOpJdRAwLbpfOz7KE5vIigZUKcDO6TJbsga240u0LxDMZise4vvpOtRUJAEbZ16GT1LBGG3yT66KZDCDv/lg3HZCd6ZKQ//+jIwK/0ArDp/hROnHKAQBUEIMi+gl2Lr4cvXWKxpKcW4pv0cZFbHGbnbSWRJHeqpPqG4YAOoNbDGvXFp7FnUAr+bxSDjThWsPEckljjEN3R06dB0XW7DEfD2jyF9XKsPx47dABF5URyd9hQMQnfRLCoHgUQn9n0cwAaVI+CtpAAJzRlF61YMwucRWhTjW8DJo3aiuZMjHjhhirEdynhqkQxUnndCR5tY9MEcar83CoJSi+G4SSbvWarHYoqXuHhLCobkyEHo6p30oXkAio3vUEmnHbeVt3CneQsX3JiCJp+HoPfZXt7dyNA9ugeNF9tDsN1vWDLzMcw41IG6f5jlBg9Qb/gr9Jn6H7QFjgLHvDTQswqnfY8PwrCwM/4WuU5HF+rDu6el1OfoAw27RsCmJCUwWRuDm1ZO42HvRIzqbAAqCOJRN+fSmzm78Y+AFQ7MG0U+MxH+zskCrUx9qiuIY6VQNaj4mkArr5eQz6fJLJZUCgd748DtuASs8NnE788eh3FfCUXWnOXc0AjYG34TCl0Ucceyl/B4XC0FZE2AmifpVPTQhg+XdYDviak81WA/3db8RxN3beTM1mH21P+BoknjYWppJWQPHaAVWbp8bG0n5cs5QuY/QTiYEcu93a2s4twE6ScJFiplkLpHF1fGteJbvRn0vfgzXPPdi+Yzl3HY+/d44WwjTtW2BctUR7izNAWkPynRwwZz9FI5CSPMmsj1ozvdM3Hg9rsbUbOQ4J76Kh7nOJ6D4n/g/aJFLHgqjOiOAN8f2AaZzeqo+ofomJMQvJz3glZEjMaxc06Rut01Nq4Jp/V/joOgkzt+1G6hJRkLcG6oGOyRfUcT5twH7dGO8GTjH9Z0XwxPxaJh+4IOljxuwiMXncAde2RhqCsRl+deIfF8RfDv8KekyGsguuEVvZ1mga+fzoeDgpNI+6kVmFr60Wmtj3zhUgF+PzsAnYfPk6FoHtXZNpPb0EMUqamlmRLqUNFcB2FfavhP5zSa0nQF0u77oXLfSY5N8aNTlpr4dUop+SwRgi1DtXj/8FS6+ysMj8lvAbEQYrjzgdVnroPgI97cYOTFZm5acET/Am/LVaKfNyq5dUwGzFrryut9g6i68xdIb/+BIYGnwX+1COSJnqP1au/Qb44TlMVtx79r7kPC1um0uGUXB/R2YaiEF+gHCMCRy+/wz3MNCqTl+PzCE97zeRlLK9fDtRmXufJ2D748/RKTZttB62ElUno+Gl+SPpB4E5xy/03/tunBv7rprHO3lYcFb+BpHS1obVHiS7ve0eGWZjB4/hUvfvCETZ4RsGzDM5idNY/brtrhCpvxcLXfg4wkl0Jo+g0sq06DHPEneCO9kcfrveBPW/P54nlJHntQCAJP7sPlXca8QuY03xj+ii8WXsd/vk/B7sxaGDC9Bl+zOnjXR1Mw/WsLzxa+pAmPDlDaTgHeIfYEb0W2s4GHCla6mpK+4BOMHScPcv8l0vPJ4RT4QRCTzxxmvWuqZLHFmhM+j8aSJdKoGhVPCwyU4EbpOLijV8kJt/o5adYDDNmbwMIrdmGRoA1+hKfgcGs7/dg/Gfa3M99P/wpPvz/E1yabKfjeGlj1pB4t5wgTR4fyUFUlufYZwyibN2gf+5NHNB2gNTpr0fNTG+xcH0dbdraDUqcaKTQY4l2TsaApcIiSTx1FZ9utsPLcCbAIN8WD7iHcvLiCnDx9UO6ELIxJGw03JJLweJ0oLnBdC8t/rWCBqW0w8e8GSBKXpSUiO8hE0AEO6ZvCstk6uH7bVpyV8wyXnuxALa8RLDZ5KbX9bOSQihroeTgRF0SZwX8xJ+nw+VRKFq3Airy7hHsVqcL5F7FwLni6BnDDq2G6kCAJr8aMokLVt3zw1RwyWqPP0WXDJDjnCSZmMZ5PCkePr0uod2AsDLvYwPmJRZB+dSLN9DMA+V+GWH/YCN4PvcOEBc9hSqINDJ6RhR3GO3h5fhwojIrAreYqsHaeLG1wtOKwtnpc9cKTefoEmJNtDA1OV6nMOJbDyuJo2ZnXdDvzHnuPisA5+6ay2zN9ePbxDGQ0ToCZ+it4Wasear1SwKD592Bh1SkYqRmNPqXLKVHUmfrOl/J1EXNwSHsCO02+oP6NG/Blsyr6D7rh3jUO8GjMexJxieEVCVFUNFIPdr7KBf3w21jllYSVe5fxbKl9dOiaG827lgdLfnYx7UK+1z8a3Lel0dInf/nU7hq4GfCXXzn2YflsTfgv+hO/nzQGg/YksfensXDB4jzcjdiPXpPLIVjhK/tMnQ6Nw+t5cmgBVm6XxV/uraC+VhkevXPiJau+0RyH+9x3dimIn27BfSNK0ddTHI5Z34BRiwLhnroSxAYQn73VhOlXRvPhG0n04M5NNArZyW/CuyFqQQy3lAXisUg1eD+qEJqfKsA7Tw30GneSOvfawY2dp7gmyAsmnGqEX2v6SDN8DLjuPw+69k9B86w3uy7awmvXNtHmgdN8f5Iv3rh3AJ/cHAUlHroQ3fOIJ25AvCipz19XKPGK2eWkvk0Atq+1h5jqCZjnrAJ1U0VgzFMherkoGq/b3YPgA5/goc1Iln3aA9ZjZsN4EXPe2nKf79eqgFN4IGaGzCJ1vWkgsB1pjHoYfhKYC2V3dtMgT4EtD8fyz3prELSdik4jRuGHD4Fo6zsE3kXGqJ8YwPGhtexkJoC8PZOdi6eAa/YK+HF1AWo+qsfhjnd8boIdzFsqAK4vl4Dk/U/YkHgdlfS0YJbpRbzk6QBHqpMhzbcLIPYVDTS+xiXt3Xztyyo8a9nB80AAsqJ96NPXJI7PeE+bvaTwQaoIjH1YgArKZynyoANSzQRqH2sOZl1b2d1bm54tj6b6Cc1UEzMTgkcnY7TRbBoweUYmbweg0Uccfv11A+GXWlStlgDFJq9BK6EE19Q0sEbgchpQqyaXHY5sHm4Jt7sXU4zNYoorsYf8slHYtfo+pG+dSHG+GqBjcIpzpOMoSGsUyIIed5RspSHnfOyxek0LdizGsTd3w/t/AXhH0RrXCa2nvV+kYeKW3dC8dB967HzIM5K0cGbTCkp7+oQSwopQJf4k9luFsNw3cbhgZQwy0gZUJ5+NAU1l8FD2He0PE6TAw/f4tvh1nFiQAseXjoTreZE020uI5KOC0d9/LGwLHsI1ziNgeNpxujn3PG5S7wW/SXrw6Vox3XgZzImfkjBlsQElvhGElZVK9K22lFWmnILtORFw460BVD4phtnjB3n2PkXK2qrLPUdSOO+9DviXF1JRqjSL64tg0j47eFkdxr/Fj8DLs0fY4+ZNvLfpDcw5/QhNgyvB8FgOnn6gA7N7dKBcGaiO9Li4pIxEXglhSasn/w0fTTrvrmLRkiacdeAPnRfTgZd+88FGRo5c1Svg6KpDMO7HHtoxUgFO5HiAed0XTvWWhwqFUaD1M55mjnkDM9b95lU/y/jYzE4OqTUl3axkml10ECQr9XhX71gY29bIDaNWoOWaJ7BRVBuFem9w1PMwFv48lsKDtvFfVQMc6BeCZUIilHJYnpuWEsZ/uQtLZh/BP4719HXGKZTYkUNvfohCqqI2dO3NZ7NdB2Hj5JUw608F6xqJ4vqGh5hQKAhysxth93ZrlFccCc/8/9LXDV/YIV0ZL2y1IdcJrlS+swQU5m4Cv78JeNOoGidvUYV9hpWwZeAh6H4QglTha1w/8ixYBqbwDv3l0FbThuFGVhyarAFVwnoUOrqJuqWjUck7mzFqLeCHMThwMoYdxzqyW/VbDgdt6Bq8RgVbokir6CBMAFe63yQN6W86aJTnbFpWORZrV/txvpoyzEuZDRFfpsGFps2QvO4uzcmvxt7gozDz3A8eTHhLF44M44jLkqDDm/n9z9ng91catRvz+NMsO3QvroY53bWg2svsqZ6MXgnGcMBnAZ3eYsIzL86H6IdT8dvxbfhjexS5xytwts1UnramA3OkJ8NWwa0cXDaHZKIH4PFJTZ42qxynCYuR0Hh/WpejgEfL5tPz5/Jw/tU2iF49BO9dNTlH7xa5vQ7G3soDbD/CHUX8nfnFz++0S0AVRp8YCdNKM3mS6CZik13wZ3iIyhbeRoFAN3i6y5aKbmfx0QxtmHPOn93+xoHL9xWsHyQLRysfkL9pCnTnbYPLKnEc0XyQY+1U4WDrfzBkV0IP/N+DUNNu2nT/Cn+proC+l2O4dfx41JFNpZT7tmC3eB8dEy3HBQ656Corjo8NqvCkVSN/W0bk7WJH+bLu1LZyImxPSGJB+xvwvdGUDN26KFspH/Tql6NLUSx+vvCH6gobwSfRCj69usfhTetoeZU5XQ44BHp3hnGhRC6V8hhKfzifl+utoNtWYlAsoEvVt7r558EafKe+HnXPtvACzxIYsUwOhXEinT91ipasFwanm9MxveU6fv3xiCdUd9LMgBk4vnALuA7Iw1WLJH4b/ZArXkrC5/qRdHLiNFSXSwEj54+8Pvw+vWjaS1m7FbjE5DRk58+DgDyEHXmhHF/hzH1HullV5xBpnQgCTh2i+K/KvLRMjEqlTkDXU33wqP7Bi/gahYR1w5zbwZjnkgqHJX9ztVo32B4bgYXRtUCzZEBDLoo6zlbgGtVcdtU9StecTPHExEb6Y/yBtRTX0tsxZqiprA4xFd9x3A0kp9MWbNTtAoPmopSjkYpts9oxYcVOdrv7mvbka4Bd0zM+cKETHBsL2TlbiDMcfUn3bgH13DnMRo/i+Hy1COpEERTvsOGECH/27XmAkR82kq9bFt5sMKP2pVfpT/YM7lm3A38OGMKTvk+4xzkN20WseMQ0Bdo7Xosaj7bA13JfaHYT4e4rZuyzTwTsD5iR1CUhXr+/lHxWPaG3f2/CkpNJLPBuEtWHCHC8XTFsPSAFZjIGNFhxFG73ZsGze8GsX2XChSf7wX3PBHa3mc2zZq3jBntBaBA3ochtX6G2+QsfeZgI49Z5o/npGdTS0IaXU9fzt7WOsGD5ZIjxyeLgbUv5hEkG12k3c+K7j1DqtZwSxPbh0+9zybpXiAI0BKB+TygveHkD+u8soC8/2vj90U0QJzmHli86y+Z3zpBorCvHzmTI0daGk59n0KZyGWgNKeG6Q3NZccdSKmq1wetXNShKex44+5tBYIExZGm/gMo7sphiM4q7Xi+iOyl1mDhlHkavvccfdieRcqwWOM4tI48p/piZ7w6wwI8S2pFmiwaAaK0wBd8Sovo5h8HQVAcuj4yC3XMKaVJANLctLsHX55ZCXFkdy6V3wa8oIU5yqaGBUAuY9+kE2PaZkmtWMzVXD1PfcCgvTQzgt66XQffUAWppc4THKaLgtTqDV5r3g0P9JDyyrAT9vivyAucWbJJOpE+HKrHe5jUcsVUB00uH8JzHAM6RPc+LbUQp81QYf5j4DYq/CrF37lZ67HKAzh80BlWtX7hj6wq+fXECrxHuJ9nosbzx7Dzw8NvGWyYfB+vXe3DaNkno80mF2lp7fnsoAiS3nqJZLuoY7ZRIz5q16eyTv7SoZCQml4+Di/kTsN0mBaJSJvF39mKF3FY4nnkYK/47AzrXOki67jSf0p0MJ2PHUnpPAc1dtZo2532n08lyNNVZDkc2raQq9et0etF62OiqAFnp31la6S6IuSRzYN0n7PAZi4s8xTCxzRlP/amksYeqeIhlID3UCULKfWn7ektMu95Fs22v4n29AdbPDWXLyqUQtVeDp+mpQm9dAA3PkseZC8XJYXMPzhZQ5gwVJNnwaJRrnUuz+vbA420KgJV5ZKR5AkfGIR1s+4ODbRNIKfQqTvlljNo2PWA7fjJfHzSHafnetNs1im4UKNHCShNetuYLvFBaCP4PUuDnJC/GwFQY3G0NUwwFwCd4Om6+R5A2XIFzruhh67QvPNVSFkUPK9CkqmRWVjEBJe08NtzvhDJHL8JSER9+diQRF7+pQ+eCmyDkGoSiD7JQImwKfMlJZftVjVhR7g9X9v7D8vxWGj8rFQu/bWTh22FYkyFHj5z1IXP9W+pa7Yg3xljQlksDdO74YhQ8M57ued3ia1UNhI9vcqqzIKiMWwDW5oI4t/QgZTg7cp+HN+w69JJKKmy5+5k21V4+isr9aqChXgYdQ9O5anQnmjprUt5kPyx73oR7NyayVqEAJ62UZpkQU4jd4s23Fo6C8HYbTMp3AzWde7hFUYM3y9qRZkU2XknZROmnNUFHfxmKl/3Cv55jMMHfmd2vrSB++Rnsrh9l1n7DEUXeEFeoD03PgunEgRkgHJuDDSbTAGNCcfm6Kh4hngERZ6ax11lfEojWh+GL8iC1SRe9YhqwzvQPiP724ysy43jQYwQFPHYEb+UIWOEmB0Pla3C13Ekm6Y0c8fowmHUWw3obLTgRYQHnjRQ4xVQd5K1GQ2PoXRD//AJuN5SgVuARWlPtRr9Ex9MHh6XwTjMQ5m77hzKnBODnDgdKrNrP4z4eRpvONVD/4CkaT9uGQs+7QfLJRrA4Uci3RghBdro/Fz/zwbyw6bC7OYbO3N+L53JbqOpuLK4sOEIGKlYsFWwB/37+xZn+yVT8ThTOTxXF5K8DcDllIXyP8ST38zfxlNgTaN0sAaoVWhxwwxAloo7D4VdTcdck4iATB2qoPQN5eT6w/u08uC4uCH33y9HieAJGpi+mwL58CCnJBpve1VBy5RGssdoFv9MGeWaqFBhPnswmH4RgWvQkmOB3gIqVnMHxpjT7hRlz/VgLNoXzJLALoEBmHthN2sML3s3l8XOHuadIH65CAiY8HeR9uQIYUS0GM5wMoP/BOR5rEIFbF1rzrwNGmLk7GSftVoKRU/Xp2jdbeph7j37OFgO6mMfdu+wgcmcbDTxU4f5r6rCkKQTcam1RPPUPdSaO5lbT8VAy/g9t+t4J+W5hbOO/mC+qirFccBA+0agGW5HRmLrQnxy9J8HtGfPRKBTI7FwhT77sA5M26uCyozks1mUF1erLYcutNPojC9ByTgrL5z4gFyNpFrc+h5+1j4DSvEnMkSbwNsULTpZvR5PpI+GVx0WoSn4D26c/QL+wF3BEbQV/edZIWmvcIXtpLw5fLUKFtCnweoMAdPpaYfft7zBheTjCVAd2Uh2DfpFq+FMrgxTvqPHGDGNwq1XgpbWJGDHdHaQCSzkqwQM+3brAV6o7oUnSAc5caOU3tkqwYN4SdN9WDs9TFrLbaiM+8+4Hf1vylOb6tqDp2vs8XlIQ9f8qwDdZU3746QjmDfvBpsV9KBk+AmCKNn47YQbnifCFyy9OzraBiJDHvPDfF1yeaciHd5uw6fwK/jjCHVzif6C3wQGuddpDd5eagYBYJmUuZ7RXUoC1Ucm0TIhgtdAWmCsUgmmOfpRQkY59UkKwsxVhcmAZZCaOgaDOLFALvYCHv18A6Z5haFdO5/ffbWnePivY6L6Pvhsuw/VCA/D8gCgdu3+F+tyl2WTwI/8Qnw+uUIIOdUKgquCJvo8boOvCJZaKPAwLZC7DeElrHr72FAKkRMg74RyMa5CH1TEOINo6Ds/tCoClE5LgWd1WUPMwgSeKk1Ez9RT8F/QfNZipwop/vfT88Wv+c3gmDxU+oMsBH8Ek/hE9ad3L/l4m5CGnyhlVsqBxuZWulYexssBvytfJY7Os4/hfpDZUfdjJliN+Q5yuPK3JVoQt5x1QIG8H7Da3pmdv3mCN4XLwTNZnO/UldF9ChQ54lZJ1ljBEBn+i/ae3ssTsXJQfGKSce+4Y4zSGxvVZsZ5EEmi/rsIXLrIw89EX2vJaGxWPIptpC8DxOFuUbdqOvyeW8oeTCrh6WyRXT1GAkOQjML3Mlod6V+H62884cPgU/U7+hTEXKlAwcjSarheg4woT4PPQS2w8NpnEL+bTw3BjSD8iQa32y8jtshALJWahyL8A2ucqAeeSx/CfTYFkFPGPjoWpkXWcEdx7XQWObeGYFv8fOWXGUX/GBLCYcZtXS1li7ZEr/F1zMduo3ubl+SNgj9NOWqQeADnNWlTeLAa6Fpd53pwa7Bz8R2or/7ES6NM55TRYPlaFJZfVg2HVW3qYagLfo4vp5IgIxg0WPO/wYVK0vM9ZVS/Ab281iaRlYX35a2jrtYGyhTPgm99CuIIq6F4YjD8230LNlvmcW7eIEtOKwbb/FY6eYALDyb34enkLP3GYyweO9VBYawGZflzPjiu6UWHOB1pquB1OWptA6H8n8YfZTD4n3QHlwpmoobyG06oWUpmNMNaGjKO7lQO8M08RemM2QdT0K4iy70G7N4j+sz5DEfvM8XXTLFzrKk39la1otngiZI85g/cm1tC6nmcQJuCCkwc/sNN7VVit7EXest8BFL+jnaYVRHaHkDoMULf+JsA/YynE4RLIczKtW21OQRmJ1IlILVMnwZejN+HYFUlcpp4DA9sS+b5QBZ1o9MfQx0do+wk5+u+cMduW6oH3pB20ufAZDrUakO7KFeRwJBAnevhD9PX3mHVkPjv3C0LjVYJ/u4rAyHUpPkp/xgMLF1O+nhu9LnhBZ+TiOFPTA8Y41cLOMAXYXFTLgyM2o1FVPGpM1GSpgdc4RtmPPSTi6cXUJN79xZvuGhM8+lsLVgMV2LzjLJ5wzILxC6fgk1m9lCBaDv2GcyG2fQNr6olBjtU/7h8piSMxgTfr3SbjQFUSOKzCIovc2TbyFyQHu9L8YHlw+uEGoxvUOH9BFp6tugWHjD24f3QNB0QGQpDQITLLsUXyF4Nv4p44PSeN7tVLg9Nlhnsjmykx4ixvufAe9dpdYcKmFTRluwqMq11NiV6XIc1EEN4clEfT6aZUbATUkxVHyroudFt5Cv8QlIJbzyNB7LsXXXPfj1+ifTDS4QfOcLrMsp253B7xBD527CW0mAipuzXRYWklTF8nzQ0z7Sjq/jES9XDEFKMeXmIeAKfUrOHIIz2Y8CuF+t618sWMz5ileh72JTqj/cPL9OOgBMLNtbhQuYliNytCtIAFb5lYQCeu/uQ62UaonrCGb167yvr1R3npXHOufegLa9+KwtVhTZTR90bZhG3gfNkYZRVe8KlTqZheuIX+DktimMpijj8nCKnTDsDeAUnM3l7MhbWBvH5FCKQVJqLbmkiK/a+fDwz10sVXqrAh3oa+pTzAGtttuELFAufOtaZxGUvAttIJVE2c0eSUIog8EoEH04OpbHAcRf3Ox5beZp7xwBxrx+rAO2cr2LlkGQfcrGCdcfIw138uuGd7kO6+XBqY8YYMn3lBimombuog1AvcR15eArBzxAgQiIxhpaF9EBvhDn1GlWh4q58lBEtgjkwE3MUwOCN9F2YkmcOMwBl8SK2EtPZH0PKBpXQ9p453XHAleyFByA66gdlJvigZNwWWTZsIB/SucVhzP8el+7JQ7Al4N1kE1dfI4IwRH6B7/Sva7icJh1cSnh6dh2PF54OLnB8XtIXy9wevIWCEAI/9u5UN7N0x03gKBEkZgsmhiTDJ+jfefhtCtye78Ol+Ezh0iSDRKw2WL80A38kTIeTEKTB3fgUt947j3BZ/tim8Re+zxXD2SWG6MvcCNmrcRBN5E5j44CeN9xNA7iLQ1tuPk893QO7nEaBWMQv17UaQjOU7GuujAtO2CHD+5B+4o9iYnHNi4FzUbUx7GQrxI09w2+U1dGiEOQqFKcHWnPV08NcOuNyqR+NZkcarDcDuOGMynv6QvRY/wV3WopjcLguP0BZClH5QeEo9N70n1HzwmaPtfTBP4i/8mXwfdRVOQs5jPRjXaUZmYVdwpkg1kLA7fOAULEn15bKqLhQVroG3961R+LgtbF4yn1JS3sBn0Q1c4q8Ebbd38KPJSrBwhzGq+VTygMpoHA7UgTkKU/mJ6Xp2Iwk2l3BhDckMEBu3GZNL+0nmig4ZoRAWG5tBnMEaSImM52mK1zknSR5lnZPRd2genbglytNbqrEwQwlPXTABrcAPMFR8Ai06GvmXrBMnn/sAmt8PgqnaR/R52kdj3K+Syhk7CO4ayy+idalGoI+erynC2N2rsHmEFUXcdmetNDXcbrmAEwcJfs4fxYMtYpxdc51iDybxcfCBtCm9sNhZCkWeu8HzvKm0IcEc2l7O4YkxRrzK9jddm32CC+N0eeaAJR8xPw2znXThvEAeaARZQuOLLqqdpgKPl9TjuCUfsd9qFZiNWo4TFcN4YNdODvlPkn4+YLilMJ27/y0BxXkumHwrh13i/FDF6jB+i35MLQ/NsfeqMPcuGgtv5b6hZegNTFzoR+/iGgGC9oBl8SCEd54iL8VgTk5K4M5lGtBjfZfH5qngw7Z4MjOcCmO/rgfbp5l8umcY35ytgfuThfn3GAnQOLcQllpuxCr7Q/DmUxzJ5OyEv5ot+DhqJf7QvIVbP2aB5AsV4CQzsEi8zx4LV3HJrxmgPrmW/LOesLp1Oo80akLnbx609w5CsWI1iNf8B4axPqAa/Y82C37GxkZRfFU3jZ4WnKZvau78NssEhAz6IXg4gL8LyfF39UsQlOuBN682s3C1EQkc+gKnlDto9T8bCJNZyYqKJ/BR9G3Qv9qPAVIW+CnHEvP043mUGsEMjbPoK6oK9mtuw/UHO8BYUoGFvevRWieLfg8L8f3V/7GhyAcO+9iN7mXSsOmHHbTONoNKJVFseTqIYSYlsN2+H0EuA8zviqPgPFvY2KcN5aI/sHLqbb5u3MTCbmZ4VdYQ1F9dxzl7A+B+fihb9InxfjVF0L6uxYG7MmDb9hd0f6cqPF+yG80KJuKy0RH06fM8/j3Wl5JWSMB9r3domHUJZvm383dNGzx/5iss+qVHMudS8VH3X5JLZ9Qt1oU3+63Bc2oLvh1sZzI0pPrMcMqdMQP3OaniQ+1q/lwaz4tuCkDUxhMU8XId2X2VR/whRz892uC20x5WjHvJNuPaIaVvKjXukYMzqX9IoaADg1dVQN74l+AbOYi/RyrSgegN+HTRHjjpbwp6BiOgTOQkPNLogiDhp+h+yhGN1EdiUZAyZiYU0Z8xnnDLx4jOPxwFIRveoYBjKiy2N6WrhftA9elzuNagxtI/H0HP1k7ImncXhL8YQJW9Fp6N+AgGI5KhRzqbpi+/CevKpNDw518orjvJ7yM20bMuDYhd/Bd7U67gc+3ncDk9hmUr3XhSuxLesktBeyFkd1SkF4NS4LD7GKuflyQlxSU0cNmdDJ9L4KMUZdYdlciGX1TAavwv+LtGBlxXeVH/xrXU9lsNVufsoRdz/1Ku8gBk6Q/Dolk5cKzDl0eVioGbiyc5/DvLnU/rIXnFTyqd1kGt4d0010Ca/S2byfFGLZ4dKQz7ZhmAqXAzlcvIc8p0QaCl7iCf3kt5dv78p9gI95Tl0YmJApDg2YQ5Stl40ngEnohbTNvXNuKExSdAbF8ezU5vp8bfq/h3jxaERARizJIijBdp5fyjhazhmkp2oy0QmksRgl2w1yQeprMylOkrEnTn0o6e7/ROrA7dO41ZaWoIXOx5Tm0qCiD4cB7MuDwJjo8N4YQXJdT7KABbX7jyeKev+GeonTNu/eY9r6aCvMZW2BkpDoM+o2hViwWf7M6guGJFUvC+gCvto3FqjDneEEvlw031zB0GsHDwBllnzeMPn9eQ0NwKOl3jTuFCjmSj0wljuQvy187jliEl+CR3C/y9DfHpukFQeyWFJg9HwpWEz2ip6Y5Bs65Bw6UJIBqvCsL2W1h8rhL3/FlAzguVOPVX6v+Iuw+FEBQ1AMD/aNBQKRpaKNpUtJM0aJjVKZUURYOMjIZUpEIRIkRSIaFklSRpqEQiZKakjMxEC93HuE/ysdPsVGj9chLaZmbB2oIr3OItA/rbTWC/vhaaqDRTsjbQ1qz9EKU9kRO0dDEf2rHLUB5tjMfC/bIp1DVVB49XvgeVc0l0Ypkez1pli2aNUShl28FxhxUh5rQifNskADv+PqV6uWqq36IAm5XH0PizajCvwAjtfy6iDq7C5lpZ+Dn3OcQ5/cJZoWaw0y0Qo2zWgWLkKPj6fiv3CViDoMBEmJIpDdq3o+n1mTLyj5SAM/OOo7/kLRK1E8crNRpcmJuHayeeIq07Y8AI1LCu+yY0aWRRwodWevJ+FfSeN2LBRVdJL/IX1t7eDrcOCMLerDWYM7YdRwV5gcrfL5z36DFJDz8khf/K4VqeFK9pUeOVq2Xhp44V9Nbeh71+e6lX5w68jtvLvs29+Pa5H+wQs4b9yhr4/YMOqEdv5AOrj0Hm3SQsrpWGp2ER9C28kJm/4QwRdVR48gIyhQ3Ba5cSz53dTlj1DWx8xuLWHivOPjoNMx/0UdKur9ilupwDFE3gwgwjvHHlKpSmf4DvD1Io08CYWwNbwVtqM0Ztvokzp3VCvLY0mOIIqAyeT1P3CoG1yz2uDWwh5ehaqrgxmdXHevOlsKd4/aM0vN5RRM8+TqVE/y7eu7ieTXRj+dPeTby00Q22z79F54PlcXuzFnTER9FQ2QLI6M3Blrdz8c/BaeD6Tho8XcLRft9x6F8+n56mMthnZrCy90bs3PUVbX+Z0OKrxA/OC0DoP3fQT+nE7bNMaVO3NtSvEMXeT+/hRvUQG25bBHfuH6P4fle0Vf8P3SNCOf7cA5wwzgTkbZ6ifXgi2McvgthQJVwprAj3VLV48N5c2ntVkb8X+NOZpVNgpPwNihHypJR9GnD03FnQTDOnJutSLJ1Rg8qLTThaDNF90AD0PuegqdQH3F64E5OP1OPZxd1YPX0/KmdX0QTxS3Do+l6wL2Z4/CsHTs9dDwdb+rAlKA//TBHkD5Omk8ftX/w5dBx8rbzJPXuMARavBTmXR8gNH/jEqdPEo3tp6PsQ2MVdJZ/ii1QkLITrrkuCQeh4mhezioV8FqKtnSy1u1vxievtbNi2gGLFv3JC5HiYqTgZRlidx+X1h+BU9SVMbNBlWfP7WOBdwU3Tl/FW8Td0XakODiSPgIS211gT0wUXpu/C37t8aFqQPbTEC9OvLXMx/o83Jz7vYK9afTj+KhSm2FixaMZrfLpzCzgMmlHYqBi8JLKSRv6upJCUuRD+TQ8Gjx0m+bur8Nu2XzTF7yBH3MvFQMHvcP6TA73V8ofLlyXJfeYUmHvhPWabyPLyQS+IP66FBXoSrHswiVreetDT7DMsMckEam+pw5L8T6xum4Q2BV6wOKoIqsu+ot6KQozZNxtuGcrR9c+XUSPAFCID9vPte8F8Yut6HOFxAz4fWEL66mNw76PJ+NVKnm1CYnDOuVHQKaSO7u8ewWbfSlB4rALhhz5AToQfu/4aAOE7z9F0owpqbZkIh4tWwbjgSLzrHQfTn1jCk/yHOCEtGwu1v7GO2FeWd2+kjT7jYadtAEbtH0mjKw/Tx+gVWNB/iXlGDegvS+LYG8I4kFzCaTss4PCXY3h7QyDH1rfj6iNFWHPZhcOLs3lLhyqu7/CgSNkNNO+LFngYLoe8kp14uLGKL92ZwB2pLlQ4Rgcn9b9FtxWOmPJlLXqFi0LDuemkm13Db6LCWfT1Cdy6RoOsJT/ToYIYWHe4E+RkHlCRh+j/zf9tEcqCuzHiPGDmBrFbVmGSdwcNB6djmII3Tawdwf8ly+F6TXN4MFiFX3ecgyvzWjF3/Q/QnC/Fhs+acM26L6R4s4M8ldyhWw9AxF6VlI65wrezTjB4fpjOWB1gR7dwPuJ7AgMd+uGTZDh0aIuD5J8MOvGxF7//LYbr1ZNx6Q+mKJxFln0y9KB1GtwKiYSYICu4Y13Eq47b0MaH3TQ9YS3PzLWgxGfOTC+uQKXwBvig5kRHjY3A7eAgO9z/Ca5PV/EWvTAU7sph34s/cBPWk2TfUZQWO8l148fAyUlNlBs/ilMWSUDvngGW3f6cDhevwBjNffDIXpCLnz1GMQ8FeDdxN23yWABZyTk4sn0QdnocQ20LM5hzJIGer1nBjw3O8tISU/ij+YdKbz7nZOUsbHtzgzS2aNORS1U4Y4M6VsceJV+hd1gRpgM+lXWUJPWAKpQPY4pSH2wasuaw5KusbNzIZYu1cJ9QN26sloEnqf28T3sGeMomYfiqHfjZyJm5eh3eH/mSD5vIkUHRC6yfagUpH0Ko6IoRRjxNA9F/8rBmkxDvDajjOc0aWLo1Bkt2TeRcKXloC/2Es/0uUuISA7IwuESaH9px3LkztLMoACPGHYarZ81YCFThhX8AbzskAPs/nCPrpSsgcokLXhRu5e64n+Bz7RB4GQeSxjdheFY6GmY1XKTmWl/Uem/L+YeSobXxIchphMDzc8KYfLiAPQ3Gwms2gHiVg/TwfQeE/WvnMqMoWiOVQBdyIrD/YSIqx60Gg2US8DNNi55p/Kact44wS8eEHmnLwSKpfDofKwAPQlfhqzMTcZzlCDhePBviO6vxiLYx9uV8B4UlCXQzY4gWKZ0GoRY7kj6ryAXbR8DBJ8+gSV2Mj7i6QB7sQY8OB9Ad2Iabs2exadUJEC1PA72X5jDmdis65hqQhHc3rVp8G5/0TISzyuL05oYsPPu3HCP6hci/UQeajYmlp04DmyR9/hsZAFP0nuGTUcbgoStLQstUseOZE+R4ikLtQklWyThOIwXfcpGtAEVcOw+SuiZokz2Kf/w7Qv095rTutShcXv2R//jdw1Ehu2i5ciFO6JHh8ifXSXD7fFZqrKFxR0bQJUtTaEwnQqNc/OHSRaE6MqBcP59fGQtwarczhhf+BmM3BwrOQ5j4TY6G3vhx/OpmYmFzMGq2A/dMJxzbOQfWVFZCuVoM3RmUAvh5jh+tvIEPQ3ZAfLoufP+3BhN1DqJcggEGOozlCtOTrF6kCG8itahUxw1+emTA5eY/RFsPQWxEEflcCse4cYt58+ti9Ho9HT76JCDaOaFjQw9dFK3mrZmDdHr2Doo71UFX7m+Awz4L8N+DqbAjeiWF/FmKl+5dgks9cVzzLBX3PKyidmNLFJ77hxZ9F8DgldOh3d6Ol9Q9pXuDX0k2eiMbeLjQqtQD7PRpD2zMvUqG9sY0rx5B9Nkufhy5kSv9jrGppj4WuMZxfVkgcOdv2N2zkhYXV1Bcmh7UumZDywRVdjLcRxJ7k7h49wDsEHOE/GQhPnzCj/NPxPP+L+ZgvsYMp7qoYsGMfWjRWstrkj3o1aSXvODweFb+U8fmg3J0+6sp/LvvjENHL5HNykO02E0UIhcuQdfcJjpv95r+DHTj+pvP8PJUAZj8nzHqiwVS76ArVSpsoucuqnBKYwqIrunAvZe/4BC95xQlMZBzPc5+mmsoKXEuHe4uR8FD5hAdHkC3h/6i3JGxtGbsabjLinD02l18bZdDPmtTULrtGr2pvoB3F2+CC70rWGbnOxq8/Jj2r54MSdEFKF4mSbZ7cnnN2WMYN1MUfG9ZwMUGPw5Qt4FDRyPoxQMF+Pozn0TzNZEGNuNaKsLvya7sU3ESDlytpUL/oxyw8BpKaRpCZMUHFNq8kSJ6LXlfZx3GJvuQ76Y5MCPejRxnTqTKQD+sLke4v2Ey3BQJgYPjesg26h1dGP+c1/56x0MG60Bl+mVM/jiFiz0AQtL6kMKj8VX8Uj41/itu+1aCvQWZuCAiD42fXSPHcUYw7p4mTLsnQ4o9C2hB5zg4JlOGQfIvYPaHB/Qy3h261Jie25ymZ1cU4PCZWaz8eBnmCfhS/uplNCl8Jfofi4KTExawxlkTevskFls9FOFTQir5bncntaN1EP/GkEK+/IJxG05zsZEj663zobBvbjx/hwC4xz7HpQKD+GbxAEQ9kcSbPVvJ/7Enxr4/hVG5p2irzXZY8UkYctaX0K7MNFTfrMYaB1VZa10D6e5rgzeJIux0UJ+3eM7EiS+lIGjZVfy84QZKjcynPscSju0thNVjxVHMLA6EXSdR9QIglQ1i4PA9lCPcMsjqxRCYVJnCYG8DLZmij2b/vGDH2wf8UimazaRUoXpRDsf1z8Lp12RRWek6jaiUJGu5TvL4lkE/bO1I424jaTuOBedrM7DczA6ifwbSD4c3aKd+AFOldHB9w0QqPurONSWFLGViCO2zR8O/yJvkc+wJXMhQIYnic7S58BatKz5Iz3r00L0pAgo8LOFlsSx/8FClG77V/GHHXxL4QbS9UREnLRjDGpXesEx9Asq1y0Pm9vM00dYLv+gX4uqjv6jKPJ/GeglChPVvOJ71k9/06ZHfgAVoOEXD9AoR+FhchWYS50ElY5hDj1aA/O8gqMwaj7fVAuBx1Qg4staU+/Yfwh4vxK+PuoGT5PGHUAGprryOSvePUEL7ExrloAEzvXRo8lx7mJq1CcriXuPrwLMwnGFGp6QDcPJ8cVxSuxtptyx42shTVe16jK89wFlx/0hBJIICIk6S5Nb18OOcOEcv0OQ7fpLgfk0Nng8bUdZzYX7oWUcBpqU8I1kEVINcqXb9GDKInQpFLaKwZGoCo+QrbH4dz3+dCuHoYxcSvORMVz3UyaEY2Do9HwL2TwP44o1z9ERZXNIAo53PgmWIK7r+247FTjNgW+1r7vGt5To1Rcjv68LdizJgufIKcJG8QUe3zOTVdYPYkpLIbPKKM4Lkcbq/BJTYxoLduVvcu02bAqcoQstaafheqgPF8z/xGon/+F+rHj35qghLEibg9aoesl/vRW4yRyHz4yp4JhQGt3IfkUvUdRToEMfKKGFwvFHBYrO+sGZzOJu6vUTJ9dJkfkOC3ITDaaLZVubyeRR2dBT0ytRivaY69vBhVHouDSdW1lDCvsWw3eUpV/54x/0xafTurwWMjgighoGvcCRgHi7rmoaXlW3Ay1UCKtpCYFBvHC39SHxQVgQWJTyjiiNNMOeEOoyvnQu3XuzAjgfX4N1IA/p0F1hWOY3PZUyHcwojKWT1ctr50QO/zVGixFm+eChKEnZtXIebw5ths/NJuH9CH8KeJfAyne28KzYXZA9noZZDNWcNrIRnM+6jd88rCne+y5Fm5tBpLQt5SVIwdCWetJ4EAj06QXfsIqmhMwOSjv1jx/eAc2MmAEyo44EjIVgozbiv/jVkh/dgSBGxxqu3WJ/YyudkQ2HSDBXYeFKSntVugt4LyVw1sxEaX+WCkLUxRotE4MkRTax1/Du+bzCD8KJevja9iTcti8bmvZXg8+sjQKIkPm8JAu9VQ7DAtpPjplqBTUIb7POcys2FH8EwvIj7uhVp37AFtYzYhb+FKjhr7kc0WiMPf6NWkPaWDXC4ugoXlMzmsU6puPJtLk1xiGGFICn2Wroal21kaLL+CEX+jvxvng5P6x9LoWv02LROnEd3KKF+viZ3zDanbG0dSNWtYcOC3XT5tAUHtjwATZkZ1PTgGZVXXOBhGwOuXpGIZlECkLrgHu86Vk/WUWd55hkzfrTVFsVjr/Kh1Ezy3lkLLrbT+YibFDxMD2Ifpe+M80roT88Y+OAkD+X3aqnzlDZGitTi9VcjQHmmDnw6YY/MXSC+LQ/zFgjixbZgELu8gFMWBKDnsA12Oo7FM4PCMK7BE9IWAJ22+Ar2wVfI6ZgevBgYokl7YvGhrQl9v2mBrCAPJT4zced8J1Bq1aLCqiHMmRpEFzeKg7tfCVadXYtWubJ0ytQcfnen8MCxt/CVH9NP4UL4e2oK+gsepYzngmggVEcXh/zx7OHJ8HzoFcwcKYFW8xNw3c9HXP42G8FIGDW693K5jzV9PFfNyQ1S8FDckc9GC3CA3HTau+A6LnyojpZow0H3nGmmtz002XbRFSth+FRUCFNCXFFVMIoLeBRvaRrFcyZ2wUuZ6wzrRuFk/S0sISAIMfkZ8PHjZ7ZzrWOlH0Y4qL+OD5x6B2NnD9HcqTp8zT+fvpmPgxebt8CBNCIpSXsy9M4Di4Jw1Akp5rtpr2B+eh9a5DRg783psNCmEpvCVYElX6FSTy7MtY8mUfoN/4xXwwapUtghkg1vO8aDpnUdW5fv5mvlyji78iIFiDymguxV6DwwG8OuOZCUiwUMBo8A+32ipK/RAjI/Mvmo4VYwztxI/7RecqFNJ0bsv4s1r+Rh3kUNCL1vhTAwFhJ/3sUTF26ip0AdZZh8wUdO0hwl6o9fRtrzxwoFeD7vMg5Ie1LryBaYseYStN1upIwJyhwwHE9zrE+iWFAVJf0UgVy15dwfIA/rda5QiVEtDm0qxf0yMpCr3sM7Kkppl6Y3ZEvLwtVFI7BDtJDTLMVxr5cfCK9cR/fKnpJn+Tuor/BBsUIVWiquAy3qPlShGoJtbirkatxEiw/40V0nUXSPzafxeiegTU6cFW7PgB8bnUE7JQbvyozHeOFD3H96BnrE1lJ6eybWlDXx1i+9tMhJDXZ5TOWk5kP8QUaOjDxn0SHRSVgovIdkl/nivVMvcUSME+3cIAyS1AlfT71E8Zu/SHb2PlJ20qfLc2/RvoO7YF9JHj3y3wmO4YLg2ucAnteDqOPmXz7nGkqle6NRxcib7A660igSpOrTQnyxSwl0Nc9xfNl5GOVoAHekI8BKQBfOa8aiqZ84htxIoSqTAn64TgLKG55TwLczXDJqJn6ZV8R7QtU4blYC3jWwoHPxL3mEjSSMLzSEvoAq7F21BTeYdICkxQ1SblIBurUBKuvC2HiLEog5GsC9/ZawJPcwN52ZRfmmj8nWtp1mFCZyyVhHLmsQI7BXhYB6XRLzGAMhnuPhu0MQnBRez8rNE2Dpq0So8xukkq8e+KggnA9/1SO1egso1MmCWffXIkkbU6aICL6feghissbx77ypvFv+KWUbT4SCUCkIcKzljbLLWPnsefKcU0N9u31IYH0airbu45vV7jhraSZaz1GErN5qkit4jo8vi/DkW5L4yfIDD39p54t5mui5YzOunDOTNdOmgaVfNvfYeXHVBmscEjDgF8KfOXivL2e5hYOxwgdUXxRF5U1W8COuGt91LeKoQ2OxGFfyb8UyzoRYoC1Mx0KKseRaPQqsGwu1f2ww9swCPjT8kRdFxKPfqlEk9XqITGR7eVC8EsY8LybhQBEY1h2EXOEajExdASPQmISU9NBJ7zunpzuBapwHHz3QAik1wrD2axdrNHdT/5Y99EJTH0JVdKhBaBw9bZmOqS88UXT8El7bqg4HZBdi2N8gOi1VAOcN74HJr0Z0uBwDh+aJgchFQzbOyoRZQsZQlKxM3zOGMW3dUZRtu0E3C/vg3sP1VHjOC1QzJsM6PREuvg+gI/SUJEWLMUvWC/8rP0hHloax3Of/MKNzPN1mHx4MCMYUJWNQKFhLgd9leU70JE7d6cQLjzTwMvOb6NAzhevllnHN+b3QoKAAMsFZkOqzmGwFTlHsLW/MPZxC9z5M4k02OkxdU8Eh9BjEntKBvBFfwfL7OtqaLI9jzxfCqrZsnjT9EbmslyBdw4m0xsGM8yInwTEFL45T2Ib+L/3pdNJ4pAF3Dt5+nWzOvcYkn0EMPa7CImJTQdeQOXxOBGRvC6cTSbZoRhlQdP41VS/2ZTspIhz7lHidDtyJe8iFhi60O/k964euQAG3uexjUQjL261RIqcH6ifaUlmdPKy6eJev7LQmv9Bs+LWtgQ9frcGqWxdJ/+8AneMdfFrsKswxsoCEJjlOLRHH6ZNc6Oyadnp4N4F23fTnmxsNaKWWKo4s+oAn9TTAZc5n3DzmLu2bIs6Fv1rxcsIsjD/8BcceW81t4sN8+34QB7mPAJu+tzxT0As7Jf3Yr+oU6jtn4vF5X3H3Gl966XEGs6o2UEUFwgzV71C8pponRquw/QFtXFs/A3a0N6O0SyUVhD+FV6Jj0bdTBpZ8RHKOuwptEZr8OCQPfkkXg7XaVbCNjuWUlAEedJqPqtKiABJPKNF5KckFufDlXbO4umQaTT4TgifDE2F4cBsaGa9G+RQFkOmKwEfvv/OaZgPWC/4E2p8Eue6+JKZ6l6HoizY41jSdVmhrgFjae1bfPAi31RzAZ7IAfPDTpbzZf+iAqywvuhQEWXtuk+EdeXBeJ4Nr3T/ytNHidFJuLotJXqXzSna4cdErXlXiS+UjjkDxKGmIePmK77iEgaHSQZbKGkPvT9ex7L6zKH1DhBbVqqP83C6KuSoCw99e8qiwGPi1cT71rBbn/bqdvGd5DGwUu4Qi749h17eXsDp0Ghy7d4z/VT0hGW0HHHn4EhxZmQ9WUur4KzqVfKxW0TbywyI3EVCSS8bKZ69IYLs1JAo8pdgHwrQrvQvufHGHuGZ/umXRRH1N+nD74yyOSvai8BkvyMgojaacuE81Q3Oge2Q6TEqdh8MP+2Hx44mgZiNItwIP4MAWKzh+YhZqSU3A5f1N+LfrFX9IuI2+471ozKbJEO3wAm91jKZXl0/RFGMBLH+ygH44zEWfh/s4VyWRw159o7sCavApKpiqH8rRL/scFAwNpJ8/q+B7/VecKSKLPq8z2X3fLMjbivDW0oBLggXx19lVLNzjQwKaU6n3hBF3y5wEgbc78Pasy2DSzRCpbQ8RqmV0/J85pu90YvuH+TjNeQS+nJfOq3WK2HijLLR9k4StP8vAPluQ1p/6gVNVlHjTgcukp+1Fa5ZPoMDbC1H+SDwG64wB9U37+fNWov2+02CJ0yfYFzAJt0i686G2XixPVMbHnTLgMlYEygIrOPP3N7b1Pg3z9BfACp0/MHCllvcbVdDLVzKYmrQNjwupQubwIcp3dMbFi9344fZ4+tY6BlNOtvICueskOCYYbn+0pxE7AaY9yieFbG3QfLcX/UXT6OOyz3Sw+B0cmLON7vy8yGc11UE0aRpkVN2mU9OsMC51kBvr1rKOhgoKrReio/uHUPGhMtlaxJD7G3mwFPlAPaIxWHU1CCRz9kJCtR4eM1KCvbLCVCcTTpNHCpH/t8mgEWeApviLwv4eZ/uMkdAyJoMG5BP5yIwiOj5jK72Kt8LwzwJgG2nPvZkdvIM/4DX5rdz/SxQvyctTQG0VdLtOAaG5a0D3rQmcFulhrVVPqOKoDe6IvEKTP16Eou4tEAbXYd+XXO53eIe/NKVhi4gzzMnsp5quJaQ0ph2u5bYwTdxHryJV8O2dLWQ+qwuO3J4IF77ugII3gTgoHsElWZU8cnssSZk74691Sbjtbg0/fj4HvqdPgEN6TXxLbQJVWTuQb6ca3RCqp7fp++lZyC4M9wnAp6H3ODlmKgz2/aY3P1fB2opQ3I1DIHtwL+rv2QObS0rxqZUqdtz8ifOvqcNvj+e07Mc5fPjBCIRi83hVbSU7fH3Di57U8aCGIy2J/seGUyQg1sWJVmcM8JaP12DTl1W4PNoaL6tnYeiG42R3JZlP9TjDL88pkCYnA3dsttLSxo8UsHg+mDsEs8TcPHq9/S/mD91B85YbILJdC46pl3DxzwW0ac4ztqTZLCh8A47WnqbivXtxDv6CD+93wTx/hJJHmXS33gH9TiG4nl4B9dqH+HaKNYpfTcVTHl85tjGOPkQqQbnBFNgjWcEXrg/zTUEj9Dvqzmn651H9I+G3dX30YE4BJbtpQLe7GhQenwkpb43I6mAdS91VwyXKhXhlz3F+GunPHvcrUGGDIoytPYZvJ24lr6X18H1hKf/aawdFNmk8PjSN1rgWcqL/TjJfPAVu+Uphy/US2uBiDO7qn7HvWyF8TFjOB/yrMLlInnOXPYKka9rQv2IvBiwuRuc3dWRr+QXPXVzJb1Wz4OwBUajePR19RSPBJEQPPh7eAkM8l0Jqw7Gz9h8c2ZSOfybtxn3tX+DqPVO8UtHHJ+XFYd2aYni4TAbUplhAgLEknpnXQfG/LWll9lmafMMO+1TnoIL2DNggWglPZ0/n4VcPYMK5UXREbw9cUL6JG/YngJtHJopZPcaf8gQFD/7DoZEK8A5mkaGbG7a9+sOXJ6bz+TPfyPPxdpL9eQG93dTBfaw9B73/TU8+GECuLpB7vg9uPrAd5OwOkIRcHhubbMfje/QgfsM+PjAhASy7jrBGfSrdG6jDl/5L+KjtPDockM4xvRlw/9YocA5TZ/2/OyA4oowtrLXh0rl+2Hl2BjXeNeIUQxvcplSELSgJrpWmPMmuhefKN8Juwb341aQIJl7/BzvONZPM0CLSUEmn6eHKEOM4BpOm7mXDUmcO1fDEJRNlyW+mGJz+I4a9Ci78UtQJsFUH4ue0wY/paXgErWn0nsukmveXyhYmYnH0e4itWA+am8vJdoQJVGMRV3b8RzerVHng4w16E3gGVEzzyXK+AsuNFMZlZtXwKp1BzeY31ZbthSIPTcxZLARtE0bA59GBWPrDmQfXv6Xz76Qx64clyNRM5F0lVpC5ZxwYmJbif39sIUjiDHcvt2Uz79e4q38raS5HiBY5ztNN31Fa20KKHNmLLr/rqcGzG1vVRtH25gt0WfApmy5Xhv8stHDU5AXgSFdIf/xn/PJlgF++6OFFT+5z+Z548JapwZm7JUDcV5HvPLjCCzK7sd/wFm1TXMpxU6rAad1xmHQ0jIKzHLjohiVUNP7i9JxaPPV+ACxTXsBtwTe4f70SvrzqS93i8bi+6gzl3pkCe0QsQMTTHpXfH2HvjCPwLS+IvXOuwAa3cvqvPYzOZ6+giE0WoHb2Ke4//AemFT/D35+QjJ/M4gbZNrD4eRZWjI2jGWPGcISiFmQIxqDByww40Lmbdy3eyAaRFyFD+j3+97uMBrfm0nW32bDxmjT4N7vzM5mRrJY5kRLudNPKB3KkHvWAKiv62fWoJwzHJOIHaxGw3NzHVKINMjufwcWwCnaeYY9vvhzkXabH4eZbT5zdsI/bEgFmZP4hOelIHHneBoKWiLDM8mqs7fhHz5+54OIHw6SSRDz03hJG/nPlWoka2OPYS4XRsZC7+T5a1nxCcaF5/NCnGkbL3cT7BWMgc4QvwB4/Cq8/ComV/vBh73Z6/fsYtIruxMNmm+AkruN3s7Tg/PGJ+MJrPCxY6QazTHsw/7QKGCsfpLm2p+ikxT5+Kf4UytT1wWFLNfRILeChX1/huoovjtFtw5njjuO/dwuoSXcV6D++wh99pUEqfRDiDqdwXJQAmgfZ4lS7JFQpL4dDnkLkMNkdLCWreeivGDS7TKJRDdux/cYK/pUqjiaK1/HByTD2sV8Ej+Wk+YJmJgXoToDxZtEoeioHlsS+5cztwygh8wnmjU2kohOhdCOM6KJ8EMxMUIeK/S9pssl+3L+JKPCHEO7XSgGFJZakudiM9sTXs9P4NNqcoAG3oqwgrLURnM7387W8MyT1YhngvtFYurqb3VNOQ9DGGNRqlIF5ijd5snU9Fg5Mw2+7haHSOh2qQnXp3GgfSuvezXIlBykkUxAGVKtwkeAV0KqSIeFcLVa5vBTPHpyEvw1fcdDiMlKNuMQd9zXBL2ElDlol4obp4Tgl6hK33ouA8he7QO14Mb+p3s991//RmHlm8K2X4VHOUpqQ34HNdhX05mQlThyoRZkrbbDzySEsFm3BNlsJKPiwk/NOzcC5ny/RqoIr5HzNltzsD8CbsCIeKyKDmJrDgkfEoK2riQNzP9P36W/Y5+IdVh9upKuLjrHoifNUXnkc5rtbs+QEbfCWaoawjZngk6iJkpjI5lfDQG5mE1YYH8EhgwzaOV0W1YVGwIc6SzB3DqbHhiPYN6SUHynosuTdYt4zaZhr7grBn35r2FdjBKmaliT57BF13biDPyWyAfsCsULehFwXt/KUAXWKqirASy8k4WyqGYjG9+JVVSuenbONRapbaLKXHEmHhqLo7ld4tukXjzabAqC4hZYYS5BdsxMttVEm/+ZWvr7KG8vVvqFvnxAlvFyPdY8lwEDbArfuvIiT5fV5TEs8nHVy4xXOM7AiKQ9aihLotFocbT0oAS4ao+lYWhGU2ShTTe1vnvZmMTf8HQPXk9MovM8JmsaFYargZDCMi2XfnS/Q0V8L/92YyNmv5+AUVz+ebTOCj36+SFk17ZQxczp4PHPk1RyMuwrUwK9pLKfcX8LlOyNppbUVul9swsWbz0ByqhlczFGB/P5XbOnljJjTSNn7jKja7hpm+T3hSftvQ5z8RE6SNIUvitMwdsRVvnBqOUwQWUrmzcOsm1UFLSYfQUIvhTa+z4Z0SQDleA96snAACu4jK25HHiWhSv6FP/h5jQsJaKyG4N+T4ZG/BDwtf4DqhUdR5uMFvOjSQsveVJCuaSD88NSDiDf7sXXSM9j8Vg4uh/WRzrta6Eqog0aVKGz0MiGls39IuP0P+tZPoUwuQdchK4iSaaVv6QuoKTqKvyeGsdOOXrj2Xz1kTIjC8ENN9NcrFeqt5KGicxKXbS3GVZI+mNNsgJITneH7jDfcufA7/yl3pjHBJ6BywzQ49HkhFgna4xSR96j32QsLPeP5VF4MZJvegN3tY0n8TiX2C+uDz7AS5vmsAGlfI+iyzQArkyx08pbgwkR7UvBIpmv3IsEpRgQOhCmQ7bnx0NeQBqfau/jyZz+avnqAFfz/I8kLJ+DS6W4slmJwaGASSbKnpXfugrXMajbf10V3lk+lq5v0WfCBM9qcPwrHL02GaS6N1Dt8mkaWF7Pj8mZ6dFWUg58t4q7OKJ7zsxyltH5ChjeBpkoBi7+P5AGHClhicwlVo0rZd54riRvl86VKXVquLEUlS+Xh8wlxHvm7m80SX5GSwC+YUbQSDq7Pwp+r19OX7u9k3FLHtzzlwTZ/EIT3h6DGxTd8cUoW1AS70Xh7G9a3/glvJEbBrAPVJNBpAsKlx+BCRz7/THzIEqnEr85OZ6XLt/BY2VTYFdTJ1aoL2G+cEUTdyGCD0OXoaDefT56p4Pj7wrB6qQQ+lj3J3lu7sDark2e8GAdHgsR5vLsbzD1piYsP6gD/ucrrPJ/wZOvX8GpKERfbf4IWC1VoajcDjWcLaLN3ALsuVQWXX65sMXYEJ4ssYeev77gxMItKakVAsugPyH3OB5Hf1lTgMwxl+69R11IjGn1UnDO3x6OW6iWM2m0J957MhakPXgNuuwCTbBpA/79AOKC2mRWHX+D1RZ1QJxTKgVul4EbxHc6Of0+ymncxtnY+tfa8w55dnZQX1In1W0XR2lwddceZwaBaJdspC8NFUUV6WlQGTtPX8JX4LNZ5ZAKl2Z9JtTUSblWMh9aGInx8yxRW+Jfyv//CYF6FJNQ0SfB6i6tUa5zCEqdqWKxNGiY7NQJHv4HaLxLsuCybCv8145NaXbo6Xwujvh0DPZ1r0PLJCG6skaVJg1Z8xvYFrLhuDPNe5ENRFVJp5hiY7Z9BBurL2OjhVJAPaIZihXC4vfIiv0qOYcFrM8ku34G0V0/DiFk/eFTDWI4+MgEc55eT4/tlfOW1ABqsd6Ny2AsnNnzmxqG9tOFEM6gZ78d5DSbw6GAvrfdcgTW2X1A+IgwmfZbgFs9aWlESiPmNd0l71jxeudscOp+bkHRWKVTMO4Mez09z8/Re1DP4i+mRo+ifmw0HKouyyi9TyHocg7oOAfB51kh6omkOGi+M6LXKSTKd0Aa/TlfTiW0N9E1tDLz+nc3vlvmit/kj/NvyilN1rSj5Zz093NaKcXdnw8iES+QzIAcO3+3ACbfAFOf7GHzDjI6I52FqihDVyr6in50eNOemPLgYKIBFQBe9GjrHW6pHc//NaK6dtZpUujeRUrsx35jVTHV+sfT5iyRMnvIY/h3IgP2Gj3jGcUDd/cHo9CgCqkrW0QYhTd4caEofDo6HlRctqG35bO6ZgDBKZBMmhBSSx+pJ5DGTWVYrmJNqYlDf3Ag6FkZggmMbDR9L4rLVAnzuqRSNu7EVNTOj8b8WBxq3ZAsER0wCfaXzfPPnOvoio8rvQz352bhbnDNuJuaRPXV+esBjx46hwf6RcEbbjG/PScMXfIx/37WAPRdE4OxGSVyntIALhkXwhZIb/p2uCU96M+HZaMJ/BZnoUn6AxQqO4ozgBJKw6+S8REX87DGFg/5pQoK/NH9dUcKq59fxt7RxXOhhCUcfnOQZHa6UbaCMPoGWGCisC/eeLuQzxvfJf2Id3HbWou9LF5Gk8VNefPgZHJTfRXlnHGD/nEkg5eCLhiFWOLlZmL6VvWdd/Q/YvQB4eIsaF7ga8d7rU+BVmBG02GUxNvRxTckLqhHvpYV3r5Hb8ZV03+oXHJD24fjN67h152gYkXMeGuQuUIhuANa918azj6LwqLYtlr1+gJbp5jCnWZ9X2QjBosQx5P/BgS86zaSTpnfIpDIfZqbbwQE3M+o7+AGuycznUdMUQUCWeCi6FBf5lfLtznNUbXac1d6PwovTX3PP2TVUHV3MEXuVwbfgDvauILp9IZAVzS1o79AyavqlzVLaeTjcW4OrAm5g7HxpuOf3kLJKU2Hp2U+wIfQOt5v94rTg0VxzcjIeqBLjUtnP+JTGwTm5CF4t4k26Bduh++tNFn4vRAtOONO2d9aw++lIvLv1OI2bYQRDY+7CHelyPLz0L6+0iuMLqi5QduY2SMZfpx3Sz0H+ai4L7tGE94skqV53CEZMc+XDpQ9h9eb1+Euqnk1zk0FMTRt9xKaj4ZzpcGubOKzeqEiNCbNI90YozbrTBccu9/CVm/Vo/+c0qHv/5SAJEzj4ZDIo/1bCw/Pf86FjFpQyuZr7N22EqzscyHhtB+/uSYW4gJGQOejFwRnpfMz1PxpwbECFigmwKsSYdl2XgQbLIRjV54RNi0bA8KVNVB59AXIET9EdtV2cG+0Jb3buIP9J/bC0Lhn7LxhTroIcSH604Y8NSBEGZSiSHMmrpC5ANseQdIsY+Lk8gtdT70KNkgnICo6kW7kpOJSjhspPUvhiSgyqekuwbN0LlBC8j+N2vyLZUH2o/fyVY2QdKTB3APPH32S1pE4u2ieJiv86ePfeJOye+xdO6RvB+bM/IK4sEp+Pusrr5pqjeKASKvzRg2d9f/Cn6GucxJLsLCgKXVfLUe2sAo65vpZl+sZhw183tpcbxYYR03ifiSqGXjvNC8zFwO98LyVsqeUa3VsQXe0OZ/Je86MmDcrfeItzVm3lpDlX6GupDni1KoLViymUVTGGnM9nQkfXSXJ1mkuN9tf5+5Y/2HjsP7gVqgWOo7Np5EtZnBskAFaJG3jn/DXgNqMdouQ3c/R9I5wEyfy4TQI2RVrScRSEtNJwyDj1moOKFrNjpRRmd4aSRMM2evfMgYOXTYJ3xssp5rc+fPHdgjfjluNM+WDScT/MS84CBQXnw/0bPehaaAWVs77S4RfLQHORIwR61eKeF8I0fWYQNVEqKS1IA4VTKzHnuAisMLKBPWs6sfS/abjLMI+Chp7ADFl98kv/i17rSmm6swUMVctDclskd5qH0+2/s8FOqx+Dhq5gjcRzXJWJeMXHjVruxnDL/HFw++kNNLs0HzbUpMIzt3107919OJeTDQ5iF2D24FLYvDWSDS5NhRnfFvIb6xTsl/yJ3uP3Qv95b4CFx9GiI4wrn2bz0wIRniclCD+njcDXrcs5UsuMOjf5cbBEBq+pycYJRzxxwfs9dOK0Ey+xB3iw0Q5V0sahzJG3FDg5lAvU3HHFgsc0kNqN76wuontjOOhuMwKxa124FhaRrm8j7j7+GBQd3qOt1XcYVyqLeod0uONwM0gIW4HnEXm4/qaAXIpkKDV2J5pGanJgiR9emVqKNkeaoP3fLZIWNgd7sUOgIXuecifHQ8IpH0r+TZBesRHPO07GkU4zob5oIz/eLgr1W615X/cOspfcBUKZf3jB+tG4eGo7haRd4ZbZGqif1k7ZV0eB11ctnH7blczN5sPR0p/8OceVVrvY8c1TwhR3JZdem7tT14AQDFmvwaxDQryhRI9WFprhVvdAijpYQEM7yvjqhbMQ+lAdfqgpQUMCUMjjNzis00JXfLfQyKgSHrJrwPctefjPbxAEzuwl23Bl+BD2HVvfHyev/ncYv0CWO4uug5VcLUQ31kJyUCOevHSfl1wwhmkZcgDHo+DmE1PqO3QHJU3nokTJINbaNbBraws+H8qnCO/xMG7+Y/JxuYWFupPx3tz3kDN3A+j636cTQ7Ng79+x/EKyAvYuFob3VfKslr4aPPS6MFv7FpdFrieZI3chvGYPtzoGwvA/ERS5LwAW0AkeL1qxa+J5zks2gczKPNAfXY5VPUnglZxB7VU9uHSNMCSltaLWgAp+Okh02a6FNwQbwCHHm3DhjDTLLwqgXeEmpFRtCEnrflH7f6Yw+cdIsp8wAupfLaDbMVbwaNN2vuTegV+mqtN1a1FY6BQEN2T/oHyyIlT/mkaJWp3gcqoFcw7t5Kkhiiy1fTaearaCfvV7lFZ2B3KSrmPULlvYqGGBcfVbyEu+BIanDEDQpzkY8sAI1PWJVbyX4N3FUuAh9hBnLhGDWFEdjsjugXOCItS2OIREzhjB5I29aNznTltm/8ZkYQeYZDhIoUKlULHwKcyOUmF9rX3w84QyJG87TxILxfFCUTW+M3PiR2ErqC1+BLoM3kVH1zVU3NFGp16JQ6deBZ2pPMvNswzIR2Q11Gsd4JtjJLB19yK6aRHGen9NIX6pHqSd1cNLdXkk9X4Z/t6kwIq+BfRhkhaVaK6EfbXptKjBGK8lGUJETxAbHu7niI3OWHUqkn77LKIBXyvwlF5OniK/YHuhIlbKIfhsPg/z46NANCOSOmt+wo9bq9Dw42lWFwvC5Xk5GFzlR+UfdKC8W4AeNlrCEpkYvq87AyXTL7H9hkxobGqhixNy2PZfCcQ9ZDjjU0Vae7cAporR0WUqWHfJETftKYADx1vBRNATeq+s5eW2utCQ6IqedTH89fQOatp8Deb3RqCbmDN5F66gHx9NYNw3Y5a2VYAT0gwG5imwTvw02dg9oaOWhfy8azb+i8jnuyb92LZ+K5TaC8GMaV7YeHE7BzsNYKvOOdIzfEDT4TNsyjoHK+aGYalWHr/1VgQDc21QN5nKH0atw0cXdbnumC+FTcugva+k+frIw6i6QwWTCnUhc9QaUDTwwV2hRzF9kTaqtEZDT+Z3/pd4EaNDM+nQ1FPUrGkAfgWFsGXdQTDMn8FqC9eAUZkCtzzMhCcPtvPTTC0akWBGeiXG0DonBxdEObPzvFmoeMEdLPeMZ/3jT2Dyfgu2KFwNA7sbqTtxMhyyO89TBU7R+mXdrHVtNS8M/EkNK9TgbGkKhLlaAIQuBzlfaZgvfgHSpHZgZIQKmt9owJPJDILNz/hlwFvI8d4BN3MOwLp0BWhPLsU9ct34sFYQI7PnU+/lTogs6oLMyqfwPnMvXwm4AHrC5mC46R7nRC+GTZanwee2HFxWd6LGMXl87NV11Lr/A8oq++C4gg4sffSBIvy/UvPyrZiXosrvetMoL6WVzM+3U/REGbAyEGC5R5IgvWkyXust5fa6DBoceAzm7idYIiWJg03b0bNLF0RF3CCjUxQUqueTx74zfFA/CdRN9Ejfu5rftCuj2ZZLEJt2GKyPVfLH7qlwypXY6DvTnacdsO2gHJXKMHwrdUYHHsbFGR2UHuXA2pVmsOfKLbqTf5j1ty/l84VulHDBHS5984cAu3Au+UWQ0SsKBsb6EDS+E6Y6nyHJjh6ykzhJZssn0BH5fm47dxX9OkrhjdVadowTAL3DknBoWxzHOkbT1zFlNNj5H9bfDqe7rXP5w+Yh+JGZTfvKRoHTSzX+krWMElS8MS8nmMe+uISFv+/RdisTGDeSIHlxNw6PFIWAHx1c6rcCZdK/8K7ELjrTIs25zXPoXHQfxXV8pITHrzhMRxoWWdeS8UZHnlj0B87q1NDT59b8eIUsuTidQc3PaujteRX+0xCAjbX+0KKVy2N07uHjBVFo3bsbXotKoeZ6KSoStSI58zyIuS4H8aNX4TP1VhJ4W40anS18pikGZ+7fjfGxfjDhzjcU22KD9xLkQeJoMmv1boW/40+QQIg752c7c91ONZp0og12/7xG3yLzyf30CJg9bj+1uNWxVdRPkvCJZTbKwdK5T8i38AK/7krCgF3CZPVwBphECIB7jwoqmyVjRU8m/JwqRqodWyHaNB03+OdA6PAEaB2ygCm6a/jqOlP22hFLD1IlYXv5BFhD2+HWVVeKf2pNtyWSeekKEXBCMXb/agRFj0/ypJE+dHTzWKzYN0Aqr8X4n5cmxIR0Qu5RgtduvrCjdilstKlm21QNvP7gB3inzYYz5ft4icNysnZfQeOKLMGrwAsOBazDua+uYhmsoxacBMaN4bBYsI5tL13iw7mXMfu2GHjnhfGmLZNoyc0Y/nAlnW+8E4ULK37h0Zc74f31eXg7QYWuLVWDEE8bGOvbQsMxhTRP8w1sjkmnP809fL/lBK8/8Z1KJ4pir+goKOYpLDMxlR6dfw7pDtfoVuk/nNjoDDVPe2DlZ+D8c7bwZpkFPFwsSv1vFrD+002gPKAAHWID2HvFGDnRgjV6jlF1aiYY9E+A0ORlHNlwgMg2A77k5XGMhQ0aes3G5+HSfP9rBLtfMscJczShf78/qoUocmllKKffHw3D/s14IuYx1V6ugheWIVi26T4sbxAHv858NgpPBsOeRC416oDkrBV0rW0WPN2tgNpXtvKbBbf4XvEYiHwsiWPUP6HA+BAqmV6JzbknSDrBin8PxlP1hVqade4wz3ugC9dK2zBqNrDIng2g/s4PMxO1ULehmaY9ymUalwx3RGRAqloNzD+YgsmosdCoNA7eiR4nvpDFc/5UUv6OPr49RQcyh9Q5yB9B/OpbHDaL5fs2W1E92AxKu/uwY0wITNwWSxr6j3iGXjSX+WvBuA2fKa+2FnMyH0PcwHH0l7gGdY1roU1oHBcfFuPwMg36JzoOvn7bAStOT8OXbo+5LVKN5qXEw4vV61h9pzYJXTrFmn898LW0LGSs2AMPeA/s9h/JYbnZWHLnD7e8OI/XORJvChbih8ulpPdyFORfaiPd7ebwW3cqyoy4g3faJ+CfNffxhuoPCjbbwSf8+9nrjAyUTlHFTXo/IXKnN4VfqGRDv1QakHHilPQ0yD3xFisG/6M6WVnoa1/B9x3Ws9Gydlp0QoPOrvyNS96Mpq0j3PCifRdtWHUSgkeMhIOPj/Ho0K90uf4dX8w/R5IXujnq8Tk+HZwLO/fn0+/Ni9B6McKkwPkck2NNNyZKQPrDvyS6P4irw7ezlNZH1l7lyuObRMH7hynI1G3G+J8DNNT3j4fvOnLT31TYMl6K7RUNWD2kiF1+F/KyqDEgu3gkzlm1nnQtl9KfTuazYlHgKjaAC5/qwM68bH5t85LCeyeCncwDmJ6kDCFt80h4jiYuzwnEGPd19KzSFeRSaoEt70FMvxXof+uEnCeW7OJQyrTmIqQsVYMLR3eC1vJrOFFiAjRH9TCfVAarr+agdGwa70pZRoXT76B0Uizukk2Hz+V/cHbQcqoWq+D23PGw6koHrHwzhPP9loLOtOM8u3ghtp98x3F6NxnbTWFFyTh6aTwVEjy9OMj0Mq3Vi+ANtgdw7dajJLr2OjhKbcaEqAmgcK4Id+4RA9CJI8kd43m5oRVFqAoijm6G89OMuGjEGtrybgi/anqQcshISHT5gst+b6ApWvOhIDmD+OYd8m8dhiWPnXmHdRddLxtFi6XkYY3ZN2CXNNa7t5ri+9r4xcbZkCb1nJ507wa/qz9o6TN/yj84DWyuPSf3CbXYecKOzM5p86/SJBr1UZxl2wzIUryR36n6wxo9A1gqkQWXrznhWF0rPDJjOjUcPIoDTn30/I4VvLYrJ1OnKEz/Kwwyakswd/938L5xit6I76CLT+/wwOyZsGPVBPa40wXSFuewz0sV9nlU/o+4+1AEQlEDAPwPOzIzS/amrIiM0joNlRItLZGQikhLaKGEjDRIGkJJSWnREEIpSlFWaSpRVor7GPdJPtz+2w5KKj/jy4ffsN9nEjTs2Ak97UYU6riDLJb+picturA9QY0rtJrJyOwpjT+YzNoGx8kuPABd7z/Ax6ntGDZqKu09rQs/NyfRzMA2uj6xCUf1tLPmha2Y7pnCqp9EUT/lCwUVWdLXYTU47RNGtz79x5KEqDkQDveqH1OZiRyOjb0D2b9dcOZDN4zyNoZtErdIfmUsPJ8Qh8VfBcnP0AhfegWAVdMNLltvg2selJHX6bFwylgIU4xWofGrXJgZtxvn+8fDv5mxJNutAAu2DsKE0ASUttCDNc0v6VWnEb+3raXT9/5AxNs8DNX0pMzNSqDGZ8khcwJd0hIF8VItqrhRyAFVf3FrcgoXvPOkE28+8BaJQji58hUE/27jKHVB8JMQJmeu4jchQqwnuwfduoYAjbdgR8tKXH98J2348JCkI9SgVPwvNl/Qooq3OVDjvgnVTdJBpPcL7Bccz+7io2jPIy/KUDOAuLuBHC4+RJ6L0nDO9hr4YlfCHenDvE94EpzJYe4y8MY3blYQHBSOi676QvDFneD+Npo2HZiP+5M04dOqRors84KBR98wLXs8jH/aRSXLr7Piltt0a+Zy/qQxARYmtFNVTgaFJJqRVr8zC45ShWhTT9g44yAqnQ+HH3aVrCYZT+YW5qCKN8g2yIbTZB1gnaISqC9Tw5DaGo6eooQ5ktsw7cB6aDnqgKZ2OzD3Wg8GXJoNIaEGIPxvHP/1qUCtkjR+M2s9humspmklNVDc/x/I/zCjiU96eWzESJCxWM/Pk9Nw1o8klOwajfZqFWhSnUJG7cLYXxdFh3xEoUF7EmzZcZl1ZLTwzYPVbJQzG+5VfWTjs3bo2mZEj42VwdhhHXb6KEN+dASMDKynnD5VdHq0CJsllPhgaiRnFTzlNqF63HxcAC3a9OFHwyIYW5HA61pUyDnqB5raVPBArRVbL/ZDm8p9PE57LLWXOkDAuXEEz3PgfcxiNjqiT7vKmgEzD8PJKyHku+ApdeunQXS+LGRQL98uHke3XsVAZJU15My2ox3R5mzldYtnNdpQhpQbelVMgP+m+uCJpnO4+m0Hp3spkc/Hzxgpspys4oGOey2ElyJjubh3Ikwbm0mDxzro3av3bG+6nxWU1dHirT8ughRyiqkA8bgIeJQlALsPCuDxY17wz3s8ORT/gW1y82iPTg4ozLkJV2PrOOzfbC6Pl4Lg6VmsrJBKKfd92SukBbesNYR52wLZsz+Tt7silTduQ+8xVtByuglz+47w8jxLHBXUBYZvT3AYv8bh9P/gaLI3VwbLABvYQ3CaED/RP0DG7524coYDaX1t44PQxIGR8jQxPIfiXgrT/i/KkN8ijIJDSRj77jMcu/iCKm+3U+uMuTx22Bua57/gHjpKFZOloHThYf7cZszFBokQP5AOc7t+UrTFDe5MrCarAXvsaGznxvQxMMNKnd6tPAMiNR605KYWPVLrI4XNcaQqt56+zzWFkh11pC6mCTuMMlC2oxOTnvnB/XeiHBC1Dsdu9caBcDu0l3ODiNCbeAyUQKbmPokLjafxUzfiuhVDoHPSG0ctOE63xt0G0fMHoFTCH59+GgulfS+hbrYvNylt4+rfHmgopk9d9qXwQLKYmuYqcH7QF7ZabwluL5zo3LTnUHbbEZxD38CKIDFcMLgTMHonYO8uMEvRAw9XYUiqbqQpLivgfp4wLtM9iD5XJfHTPYDEiXfQ6dg/uDjsSuEiAPrzz9Ln+n44FnMEn/dI8HVfFbw7aytcVXVh4Wly/Fn2KYy4IQRHJu0nmfYEzg2djiO+aMOTJITmSWN4j7UR9m2U5EdXL0KOsQNkhSjxuqGv7LxQk+fqF2FMvRKM6HxOitt1eNy4OUAhE2ntxBHwcmM9u5XIsoJHEx2WbkSxKVP50oYwfr7ZCr8PK1CcvhP/3qMMwV7vwajWhib8syff5BAc9VcdA66MoIHXY7n8wnEsyZwH73E0HFMvBf+dZ8CxwgBHC5jjf7MsyFd1JoXdXUXezm0kO1sfnIOFQVnCmJXpDHhgL3rMiWfJiS9BS3IbT1urxgeXFaPlbHNc9dcI2oJX4x6dlxiWbouLbBuxaO9s+jT7Ct0JnMu2FMkHPL5CRJMk3C7ZDmmLdkFbpwVbmP2j75M34N/jOtSR8paqS1RwhMQVNg8TgAXSP/nnwFN6GCVHRpl3MD53Mfte9iHF8b9ofbo2TpaW4CtKtjCvbzpK3BUAlaNu1LbuNqu9V6Xj2zeyuMl0mr9VBzsnBoFewWiwf+9HaWri9KZ0PH7ptcQLnVsxeeIsDpYQgcGlibhKZTvo1SlAZsV4xI1zyFw6BMyizDFbahRNaAQu3nqHrvfPZJV4QXzvKwF3hcRJJDoG9k8SQ41lt6i8eB7sWnONT/0YxKi2akoQK8VLjUqwyqWH/8Q6wtUf2dTn5cqWthV0liw4tyGLJcPjoPftOFDWVYRxSe5s0B/Cmja1kG7wjsODN3O1cQ/2ZXVy6BILDtF7yIvm2sN+d394/SyMvMfasX5KDCzVEIJZQSP4bqovVkzZxxt6PmLdSwEI94zGXr96Dp+XDNu6HeDnkvnobzUSyk720I/2/eig9gqm9WtBm6QIvVrQS0ver2GpN17A7mokOmczKXoNQvDnYbCauhYE5YSgpeIgo3ILhGRsgLezTlJvuyIY3lhHs58dQtPXD+BQty8Ha6rBjzFBlHd5D8nK6VFvtBBlbU0GvT2ZvGS3Cla6KaIdd6HqVSPYWZ8EZ82W48pXfhBuFEHvJeWpxTGB7p8i+nTgIHtvNobjWtLQ2+FPr975Uap3CkYqFnNeyxP4dWEfR0yaCAF0mo9pvCH004cxs+1xsPwBCiomwehUB0422oLbk9rYUP4KL8vJxLFG9hiwewJEGy/GB2OXQNPk99gvo4SuXfPg32Fz9vssgBpjjoFA9kzep2kFf3IPw26fcaB+Ppqunihmv+mBaJ+zBYdXbECZnSXs32NNf/4bCXsb1VFFM440j2+jwto3EH9qAgXmCaOa634aniIOR3w3wqqjWrBxYyf8OTwVJq2QJ5/np6l63l/q9TpALy9aQH9pNYmcjcNWdSFYLrsfRIsugWJmFDatE+N9IpvputkXFj72CQWibpCXuzt0Z5rC55P9rLvgCS2NN8bl8WI8c28oz+6+ALUjbuAlo3sUYveJnGeLQcsWB37QXYX+3ZK0RywTLcuNIOiWMm8LSKGGj5IsGhuFMltsYFRPOQ6ZzALpbWtIyG05Sj3Vg8CweSSj6sg1PR68VridJ9cj9H55AiuuzeKijAZ2t12O5ltSWSXWhdQefQHbNbdxuPsbTo6WhzcV6WD5PQyP38+moe2F6NybDsrbgcDFkDaOjAbPyWbotNcKFp5/ifY/ZvHAPS2qcc7A/25cwI8fszk1Wp2iTjVArnU3VOwVgiXPolEwuBHmpuyCab4/WcxxB8qLGrDIhXLorhHEn3KjYZu5Dqzsm0zXaRrdtBoD+botqK7thfXRGTRzvhiU743meWfE6W+/PngJlHBHXDChxjEKvRNGHlmnwPmyL26P8KQHs4ThusBcVpmuDP7D2mBapcrzxQzR2eMoxMSMZ9mmS6yhGkAKfXrgdugODowwg1G1AVTndxPWKipTtkUfdrl1wqX6tVB39BP8VUxCrTYH/hojBK9u7cOfcjkQljuJPdadYM3TXuBMI1E0pJk8150GTvOjC7OtYbLbVXgYGokTOmdxhsE8TE8M5afp38HnngsdsJ5MLdefg+VqCXiXNQIOzNkHnDqTTMdmYuL+7VCbsI+UzwTh+iY5tn3uzPZ3xkPT1680YNFLPxUHUPhsHi64qMy5kevBPmcFVDbJ0NFUG5IPNYH/3pXBLLdCSJnygCL+1lJe6g+U9G0nFS1RNm66Sbs9lnNG4zjYTKqYuUuI9D8IU+aWYN6X9ZeOi12mAxE/cWJyP6TFj+OrAsbQW/kFtq3agCmrk+BMiQGcVoijvrY3XFyrx6WRt/ir/jOKUbUCjyvR9OQcQevwXVh/dyL7+qRiYpc+7UxywM43GeCS9oqWBNnDyOp1PEWzF3Ytv0ZRj67hVW193uuSim253+BYuDhcffeNMg4pg/iM3zQj1JNmTR6P379LYNmN6TB5diG+nn0HGme8wRdBRnB0kz6kVXnz8u56VqrQogDRfzQm4gJOiZoMK1/Go0uHNotMVqJSf0sYs2ExVZga4H3HZPTzHckv9jfBo6kz8GJEP86tncrrvH/iNysjiP5Yz4N5Hri1sRnSd8+EQ8PPeeX2G9RhrcGtDyLBSTCH/m7WgVHZiXihZC87+2wHH4vPLLdqElW+BFyS2UcPW9I5rCuZPawU4I7ib17iuhfrM9/B+jGiPG1NDPuXjsb0o+FQlpeFr3+Pp6S3DMrrSyAm2I3PbA3AHyOn042T2WQikoKevor47ogJC9z7zkK7xcDQfg6YJQzgTUUfbs8fhzEFUiA0fQ7pzTrKGxZs4J6ybSi2VRg+jVFAFUt3tn0fBupqVvTu0zKYXLEFktdNgGNytex+/SF0Z5lCalkGdk0bxV5Ktfyrr4YuJG6l/Wc/crBAPFk6uuPiF4PkEKkHqdsekMcuD/ybsAJjwxaB3/FcTr66gy44H+LfmRYUZlNDHfsmgNS6Hdh5w5m6pqpQhZMXhFtpUtzUT6hrJs9oLsxmU7NApmsU+Iwfy3rpVvhiaS81fy+DxNRlUPGlD73y5vIneSVKHvyKG1gfGjIjOeHqTLwdJIYb5JdyYvcTaq1wAsevb0G1r5u6ZGqgN1sYFH7WgJVCLakeUAXxK8+4u6MbyyZrcYtJGa7uXEFj2mRo6LkDqFVo0mzXpSSCNqg5PRCMO4RIwSWYL2Zrk7X/BDptHA+JRgDvvv7hrFI36ld6iG8f9vGXm/U8pvE5dX5cTBc1a+D+NaCpX+TAG2fBtJM1/GXXZVSZuZoN/I2owy6P5Pqa4dG7CzCJH1H215HQMZCIV6wLqTTGAkzifsIWnTgq8/Kinq3RdEJfknWrK7hbQh+c7d/wYqsX+LZmHJQXydFvlwDK6A8g/wudGIr2/KfgMcNCO2h1SKGsshZQSHJiu62F8NYomqyXvwK664SHP38Gm8dn4fAiY1B1soEdhvqwIzcKY3u0SHWjHjdE2vDOdTN5NfVBQ2EtzDosAkohr8l2ei3udbAhb/eVWLGmhGVVJ3JHgTttbT4L/FgJn9mJwalbXfjeu4BdZB7Tp7bxUOpwCH799iDnQE+4umsMvLdrorhR1pBVd4ZcSr6yraQoRSyazlEOhfSrogXOKX+DaSesYaRxPt7YpQ46Sw7yJLVBHpWaQXtNfrKy2XPKuaEFdjPWYKlsML6Z0YzVMpYwvLqL/WdFkvHILHC9WQViEYs4UnoyCSmO5ClXCmDw0jtqGFCEzYtn4cMkD+4oW8iOZ8/D0Q+vKDU2gCPSTnPsBE1skmzH3f4aMP5wLyauteZnJ6aA48kqCPmoSSa2mbRDtwd5tRd1T7XmnokKkFtkRcszNWm/bAYWueyBndmfSV9kEy/NXMkaU1NI1WMKLtUfDeGzdoOjxhG8PSkYTCVC6bbZa/T4Tw6artwjBfECmPX2FgcG6IPbtJVsle8PUj1OkGl7g0uF/LhdQYaul/tAvuUoijrzGB8b6sDI6wJ8Ot+JMnS+kcu9b6yZVknjq8fTr+1/8E6bBukq5uPSc0KwTOUJa0mPhWPfMinlnAsolJjQX9kWLhII4z8tl+HpyBqIus6wOS6LdcPNUM1pAaq/G0MVo73gkfAt2jZshMV3//Jzha0snWwO0etn4bcNYaBz+AO8FmzGnuyXLNUezEGDwTj4eCNqHe1ld3tNMHqtAXFzLHjxOEf0cAriLbrj6Pil75x+Oh1zFjnRgY0i2G47EXx9frJLwzJeei8ZfAJGsuUNOUjdqkaVi17xU6ld9DzzP34RbQMV6y+D1L4QHLy+GGLdXCBnBNGqvae5LPQQrfivhV/M/gLvb9tCklMPRilP4yNehiiluxgto5No5tARLpzcBraXb3DueCv6nioJ53XMIHfeOVgccB3fL7KlAf9V9FWsEFWKSiEag6kh9TYlDSvCXYVe3Dp9B8f+9wdEhe1o+kQFNIpfyTMTO/nB92PUcKUIXWskYXS2K9taiEP4OUfyMdXHI7Pm8pp9L/m5wEUwldQiN8lm7FyrASG8lyaerKP6i+dYZcxkmrBXnYO/f4cLPaU8a7Ikxzwppu6ACSAl+gB92z3g7BZz1LHWwFBXwFE9mjy99QZ5/zsKZfYvgfSN4F7cY6q7NkhNC9diY+BLWJ6cyo1LFMD5WBb6mY7hXTN6ucrEAtZ/suOKOyNZxjaehC5+xHDJfNL9/YubXnXwx70fcPc7J6pw1YO5hW/pcTkQKM3HluofnC11l4RfW1CYrQGKJF3H5KUz4belAnR5R9BfFwVakDiAa/LPQveROCzt8WOfbD/0fTmdOgM6aOilIpyId6XDf19xSkAu9OZkgtGmElpitocvG1yEL1JT6VuYOZadM4JJQ0q0bGQeZjndQofCVDjVVMxqU3rhrNAKOqr+DS9NHoMLForCVXEzfGQ4gOIHc6BuyV0MMeymWddEOMxLmrfIzMGLYua8YdVIOFAyFw5kb0e3R/MhYDCGp21V4IWvFtLZk3PwRmAolAW28tmfUvBKVZ0m3C8n44PPsLJqAxvs/srOqdNwguhPjPX/ybQvDthUGnJU/Xm42pQme86HFYatvO/tT/KOjsNJd39AzYoFdCbzFzubGUNIP/KSceshUH0la7b64ORWRaycnouV/hN4+6ZKWK+egJcPyYO7bBiPf2tJmfsISoQ3wvkuQ/YZ9uPh17fZ+sIlvKiWQ32pDE0terR6TTGvqX8MnqL7yEZYjdLG59DJwJecO2olmTceBe0f+hBd3kwpYo5YP3sBrRVleB9UCKo1bzDBPAqEX74liS1v6el+cxhXFoYNRbvw6Y7nkNF1A73e9mPAuE2oWJ4Ml2efZ5MDarhiKYFkqhOanplPTub7YO2tCDy1No/LJivDsn3nQJ0TWS88kWz/yUDaXy/c/qIA33hHQoOeAHlOX0pKFQ20w/8qPZ3Qwkbz/CF+tCrIyXVD++eJOLffDe1/W/HF8nT+ptsDOzYvggXT5RH+7gOhPm0wyZ/MDwSW8t1lCaSwMp4+eNSR4Zx6uiNXjpaZv0i9og5SJLTgQ9lLEJzSRrEthGl3jVD+0mZwO24D74/50Nk/iynbspMclI1Ba44SCWo34PIDm0n6kwq6VT8ikcPWuL11CLp9rmKzygV0aJWAfXb5mHnEg7x91mHlwbsYe92R5UWLoKtqJn7xagILuQk0/HYMiKoYkoyCJ1idus174BsNb9uGsV7DaFJwAnV/D8HcVx/BqU8XTqmq4J3j92jht0T8tKQI6p/Gc9OyRFx66Q+puqnj8VZT1E/RhBjri3ww0J83vVbCqA9u/NLwMmS0dmL0vmS64lEOJ7zPccZsI7i1QooUHo8lvTghUlmQToJn3eFWmi5aVPZSubAn7/gwwM+PmsELqwa6K/UOB/rX8fOK0bA18jUpZFxi/zUfQHfsH1T2DaHnFgQ2rmKscjkRGm4OsMMdKToQ/x1OGPRwr4ES/Jdjy4tUFdHDSAxKjfNYc6wQv7lkTBouKSQ+sRB2tF3DpaetwO2mL7W8EqMpLkow+WE5jBMdQx1qS/nyFgeUqJ/GoRgER/+zBWk1f/zqJQXJTXIgtTqUk/+Zw1f5i/ynQZ+kpwpBkmcBtBa54u7F9TjTpAmHfZRgs84PelLQgI3/dnKhSTEd+jiK3YayWF9Rhf7saefNhyfBRxc7sIFEcDwYg4rPP2PesxiMmnuCCnr3cKdJPX26vpSlw0tohokRDMcbglJBPHxZEIJGTxdi1gdLbuu9ChnPCnFvujstkfNj71pDmHbvGfk1OYB9rgQl2V3mio1rcLF6LWUkPuDCyjY4ufsUmiQZw4+oUfzQaxXqdSSwwb+dVDDozGO/DeH8gYlM/52AmvyRfL55FAjO6eDJc7qw/b02DsZWscHGQ6Rs8QxUZRaAi/YfkIkpx/2NIyEpKJgEL22ktUq/aO2TUJ5o3QoCmfWYVBqDc8994zMFT6nAzBRSnr3jA+GEN6WDKVv6Nc8f4YtaGxZQgUoz6mnLUc2mZL4XZwSbVibhpI9jwaE4h2q2lGN9sg5WLBxNQQn6tGaSEDT/2oL5VlJQOnclvv9rDDVzpCCkwZNLIJhSn2XhvfmmHPjXg3q1RrK/vwR0jrpOwk8jeVKuG4b6lcO+8yFkqhqCY42L4J7WXfKfMoTKk4ThfrglKIrt49UWIfR0TwM0r7qF8TFrOGyeJG5c3IzeOlMhqVUbfKSUsfLOXDxybjxZO0uxybgierZImxv6KrE0+yGsWRXAv9ZMgA0Z36FIVoafTjjNJ7pl8bZ4EwYMybGySTYsthyLDmF3kEeoQFD/IxRtGsssU4B/0v7gtCINLJoyDh7NPEfXchfRnM1DIJClAg9UUzB/dQqG+idwnkslymXdgglnjoCATge3xWyCkDEroWk2wJHoM7w5KQhtE27Cqz1FeGoolgpLatmnLxMzsnIoZr8SBB5Wh3UbJbFw7QPcO9WIi299Bq/veRQkMIvPvQNW93TFipeWPKJCAn5tjMCCGTn884UZZ7VlgZ73Wd543YKCla7C0mVq5HntPo8plAXhi5tBLgogregfqW4yxva509Gufg2M0BFk0SupYJAwhhO/KYPDtnksvTsE18wuAB/5VqqcX8WHf76kRwcEoEAiB04VnQbXaE3oqoujjIRCeDV1EmSY6XL4r9HkZa+FifJLaWf/AhT5ylxCquC0XRLOn9pGn36+hTkWQbz09ioeH3UKPY5MwI+XLsOInx2o8QpAfsUyHpVbSW3nWvGz0yGSwEN0KfU1h86aQ1Ynv6OmqQ3KnROGDcs8MS5kP248vIgr0keySs8tvnn7Pp5YP4Wk9wThjwP5eNVIGWYefYlz0RBzfUtgxbuFtOdPFlZqNbOGUSHlDXTy93Zr/Ph6Aii/Pwtbe3VhvYwZCZ+rwb6QTxCbMpWKd4zFtLbzLPQhh8Kvq0HqyAU8Qe4C9S7twJCfulwwRR/XTdfBt0eGcHCGFixxKqZPCvZgYykPkbNXwKKapbS9yQaOQBiIHDxNVeHfMTsoivK/joSuHgNo1/SELANr3uTnj/vSdFDBXxQnf/KAp097aFLzC2w3X4LLyhVgpK4RRsaIQq2kGGflXcUV0f4wrUgXbnQl8QKHRHxa3Y1DA3Iwd44jLFEIwhG9cZRa24ABTa/AUPINT2su4Zh5Z8jxmgPefy8E0890QsfO+XxJQwZkwn7xkYFgFL/1CFXSTmGvbDs1VB4lwfGycEW8Gt7rGtPKWB8UNzoBu09ZQfq7IajrVGbjcR2838WQ01yE4X7+c56ZsQocrmvy+4UakPxtkOIOlMCZ0avo7SR30tPpZN0QDZi3egQvvtML2WVm+PXgRnZ1Ps1v6RJUmA5wS+otPPelFRZ9MgHPX5fhQnQS/1ulgnv2m+OfLfb0dSiGvoyO4VsnbTjnoSl2pQvC1/p43ufO1LzuJd/fZ8biX4b5UvpGstmtztpZyujhdg9GrLYDlz9noFuwlqTdxFgqXxPWdb3jjuw8npmkxCKpC2GctROekp4A1hCCjSovyGKXPS6/0g+nt5Ry96k94K1eAx+KZeiz22X4e1MY3op6sN/mW8TFr6DSvBs079uQ8pFV4BzvA9/kHlOy82Mu7DIEB7cIjnzwked8Wger34yElUvqaBe1QNcqVRJqkKWK/jN4MlQQ6mfUoezhYE6vnMdGF6wxd7IuHhawwclnIvGGx0Uwk/zOx8IYjFy2gW+ZHVZreZPibkt+O/SG9u+qRusXK+nsSU9wr9Hm/PdacGuZJ7zNaIJjZzdB/qMe3qqTwoE1f2lc3xnyv21AzlPl4JuEDKQG6vCg+iZ6PP4sPG2NprraEvQTyaTvsoXsqv+RPLZLYtMVAViYZEiRU0tAoSIFzv95RS0ujizeGYsPf11iz+93efnjKawd5ADjH7iAtrgzlhQeJjMXC1Yf1wXPG8Nw864s4sSXKGF9lkz/2UFesD4vnFvAIXsBXyjosqP9OhreBfBO/xCtWLIP/WZ0U99ebRB0bOTNBoeocfp2yOoy4TX/dtLElHl4QqycSzeoUdW8GDbSHgclvU/wWtZ2dAjOgiM3f5NJYgclFG3AmXHnuV+vj7R1Kni9iRA8irThO0VnyD4gGz69zMZExdMkXx1F0eUdOPlmMmByLNs5icN4iWecISHHb76Oh6ntPtDo481pqTMw+7IJnJJPQt9f1RDbpw9Pg4/gTb8lZGeYT/GvfXDxvGZubtvFHuaTYOeJaeh+MpliWlQh1DWXe5IrKMXWgN88mUbLrqznYRc3sntVB90hf8FJ8BQvX0Mgs+ohLJlZjJYryvBbzQQumfuWOm7do083PqDTlRgIOVMO7/T0YShcmI3pKLc9eciX1xnixNHlsOLSCpQ3bYCv89ZQ/mhdnPh1BCQfbufXB1PRMHU5/RkeTfl1apBkOoFzqsNp+bXvuDpBm775GICubwDtNzHF9fLv0Hl6L2gmzaZRAb+xYusdXFrfz0P1+ZA9XRtyHkynfQenQYupDmQUrqDVe+vop6goFrhMpQ1dxyl2pA6lflUBv+Ey1vA5CEtnKRMdRF4xqxHam6Tov2pH3C22n3CXIsyYqAMGj2op9M46au704RN+byn+bCTeqvhHAUHXIbOlgXqLp5F5vib4nIqAhpk6lLz/PlzLkYSxeUtQY9JDOmDjSFYy53F+jzA3/7CB2HtnWNzfi6pa3mNeRyWH9Puyr0gqJ8bbYazSZT44PoHS5WUh1OY0zRbL4Mf8h7VvemDnBUnIvXQEwsNyMPBXNT7SG+Irl8ZBxraLIN6sRiq+xjxCeAAX1OQC1K2i2Raj0fRMD395PAhme/UBb6viBHNvejT0Gys/X6TABw4g1pFCJkIPQcNhLgzovCa1zDEw89gn9hFZxF/8z/LHthEUfmo0Dohchp5tLSTjuwiPms/n+eAAkmUj2HroOhe3bKSMv7/IxncOJLTuBf2eIpTb8hp7xbLIfY0m7Npdxme2z4BjdsKY5VjJf68W4Vf3N9QoHMCe2lX0OmEQFpurweyVFRykFwp3ph6ktU7XeejCXl53YRXbHs+j+kXLQSHjKozfIQA6pSeoKOYFn9yWgJ93TWTb5WrsZ96KPU0LkXYn8hrBeyi8UwECrsSyYpABpp5qh1Ou6kRpjqT25yNnbXpL3a0v8fWEQtzwWQpMa2ajiYQbJeTYwXaLWm7Wq+R3VXNQ3l0XLm1qBMfl2uSNCCmHHUllfSZ9XbeDcmssoS+5n9qe1MLmpTv4eFw1GYVLweJpEqDhKkSNFZm0NfEc3utYC8+rLenQ7ghaXhdJS/a34aslTjQlQQA0tI+xh5k0WD4/xgZTo/mj1XH8vayHJfgp72vXowihbLxlzDCjYAUtWlSO3tItEHEmGk59D2f/2cSdamm0sfsI+Ol8w9FfTQFGbmeV9MWoLbYMXzgHs2riBmx5ZwKhzsLY2anD4u52uMJWGNbezcPvu7Rg5ZAjSgcZQOBfFV545wmcnzHEJ0+/h2SXQDwaqgGSrEna3wuQA32pkD0w/cwLlp2ZCjFLPqLtiL88t/Imb+42hZ7IMngfUkbYFEA+IvNgj90MPPUsBltulwC4nKdUTxdyHxKFoo87aYzSf9htsYSlirLQN9OLsf8tXy1yh0dtXmhk1YGhgmPhwAxRTJw5k+Yd3gy7DyjjTMd5mK6eAYMFh3nD8GmSERHAkCuj4Xb5Xq54nQeCrgr4PlIcPKVEoCh0EOZKCzJMVUS/Befpr6kenBr5mCqmHIeWL5O48dozvNBjwAeTi8G/7TTXhQez+9ArjFhtBsKT+pCWzqV8uQUUpX8Hixfnor9KEjyS9MfV75phw5IDPCvDGFaOmAI1T8Tgxr8UGB7zmJvFA2EgPwVDFCzwz/6noDfxDTQUAWR3FpDbBDt000DMfT5EN5tnonTmCxj1oIXkbetYvKoIc21EwHhCLThGtVBzfS/0jd5Da/pd+a/LHrKVm8IHhhiwphVsF5vDlkX7afV7UQq7VIzFG2IwbV8Q7X2Vx4uLv/O78WmgopkKU19LQ7ugMfa7RbL22EcgfmEpDAr+R1b7Kuh58xYoOGALiq4rwETYGu6LGqLfRSneU1yIsrJ2/NbJB3Ujp0Bi8DVQdNeAA82+9PAjw7naano29gmEVCzH5OlGvCqpDJZWGGCB23NYv1mQnOSbceVFOeh38EW/900YcnoKBV7zZq24AnTcLYS3v6Xi+EmS4Kfyl5obVUBkdxeex4M0Yskr2rcf8MYNCxol8R1GpdbxL2sNqk9FXp7O0P2gBHTHNdEasVx+5uwNf5LHsVy8IvcWyKLMsuM88W0e1MeJwMq9ajz0dDHVCE0ggTVbuTB9KepFbaSeys+Yo32fnzX/ol9bBKDwayq/vafDR68Vw4+xxN/brtCstdvgkvoQO1/3J6092rzgkD2sEPfky2GlGHQ6ksP0XelEfD3OKBgLJY9uYHpzEO36MBLt803h290NNKkwgU1Wv6au3naQyQ1B6f8qgXaqkqPlFTQf9MAZkg6g+CKBxOsGeeG9SeSeMgU2nriN8ioMHpe2cMEPV9j//B6n7LGH4W4/OGhyDAoEcujq9g8Q9SEHrU95QPXEevo7vQmW3AlHP10xONWVhjOeP4AfBs1498sP+BzYxy4WMjSYvJY/blLG0bvqub9EHerXdUF4YgC0nVsI8p7u3NW3n04pv+SLcyuw/IMw6jw3xbXKNiDnJ82LY+bS5vhH+OKXCU3LFYRQq9mYCes5sGwU/61qgOwqhH1fo0BTZhZdiuzhf+u+4QZ/c1whex7GHbxHtD4INC+uZ79wHWgYqsOD7jOowccMpUIzQCvCGr1faIHrDSVo/X6WhqqOcvvzMaD6QREHV1fSyrU36FqHFXjYJkLnIWe46DodZC9oUk6PIv28NR5muFTz4AUJ+jS+gWqiNGn7FHMQCD6HNgGL+PrlpfTrgTtse20LFlOTKPTbJd6hoQhVXwXZn5J476owiH1lzue3TmffViO48lQNlmYO4NiUKGq9U8eSJ9vhZscesjIIANdiTRy7zgrKW9Ihy2wUqOo7suo5EcybYMQltX7gFfCUpzSGgZTkOwjMbyQ5h4vkaa4D4+J+guYRd4owUIFlof/gl84jaltRB/H7VXj7D0UK+zwa7fPMYEhqI9o6POCp8+PpmnETCdR8gX+LJpOz4Fw6eaeO2p2bYetNDXBUNYE17RWcVPqKW/98oSe6gazQd4bl158E6fpM6Et7TPMWS4JiQR35S1whXbEwnmr4j7RCidb96sctd0/jhVx/2iw7RALXHeABz+GFQwZUFVeFmzL0cIv8MhYPLEADBUGkwp24gxeSstU4MNIpANEeT1Zv10S2cqMl7yZzotNdvvnoNAknHoeYC1E8vlYfntc6Qo63HrWseAVyskfZpyMU55jOovcGJ2libDbEZr3A3zv1wDD2MK7eUIdaB9VwnsoXntqyABLEJ0PkAU2u/30Ur2Y1s9mL0aAzag+pqObwyj/faflRb5byfUmHdpfhsofqXJpmgK+sR9G+LHPIGPMFStcPUuTx8fisWIbvKWVg/6gSOpskgfsui8NYpxC8bW4Dz5cM0JH5gUAxH2FP1FmSnvuGN6kdodJACTZct5RbtynRZT0ZOLM9FttL7nGS0UNeN3k6PBQ3o8UlV9B12kpScaqk8MtydOnDSLhQLcTXpoXjNxHGqsumGF8ewjvrF+LM5VEQPjqbtzpE8Y/1ylAhbIB2vaog+KyMZd6ognRwBy267Yt74i3wjbwcvs5ZgxMJYaPpT6gyCqECvXO4vESG7ohsYmpFdLecStdb5WDj9BGYO2QIOVmmlPnvKEsWT2cb6YW0w3ge10gdBSfvNk5YoMF54W3Yv3gMzGp5zypeRRj7ywKD7iOIXCrD+k/qZBdnjsvqOmDXJXEoGikLaYsugLFNBAaNbSbjN+Pwiqgkd/+5jo8CD0LkwYXwueQpKqpZwC7zUBa7f4hWQiINT7HHOwaT6F70bfSYks3vxj+hUVLT8dBrK7ieuoSGQwbJ1jQYNWe9AdsvZ9kwsxS2XPsIDRHhNL8oDO6ajYUvJxbzsfowFs6+DFGNdiCfJ83u6Uf57eVM3iz3C6SNrtCRV6rw+o4U+UrugC1j3NlfdTtO3LUdH3o0ULX7HOoO7cFs2kTzEwi2bDFkzUl7uET1BeV3eeCaceq0sPsaiN96Tv8SOkixagHO1jaD5bIt6K4Uwj0/0mnXk7nw38PxBAKfac1TS7z7fSafMSrgaYoq8HjSXw7rJFixvhbtlMfxgMI9Cg/cyum2d2Fq3CB7WvfCem8FEE/L4c2fl8FbnZuQd46xUaISFW6voQMqCTQ5c4hlWRvvPDKDbYJD9DL/F5TZXQSFzbGY5nWIjfa+hC2vzDHsQSEMpD6gwBJF6DXIo82jh6khfyXXqSlhYcQu2CGwBz4HzWC7M6X04408OauPgIHoA/TVYA4pbh7AE6nqePdZOHoPusF8e13KmbWVnwY9Jt8JujAjKoQzHq2BfRGf8fHo/Sx5lllZ2ZLkXB9Bi4gnrb9yGeR+K8Kt79dB8awf6F75Amjug8si78CaDhccepEEQ7PSabHjd17TMRF2q3nArs4RFJh4DPWM/+J/F8+yV4IivpsdA1X+2/nw0iH8kGYOenan8dsGbR5+1g5T6jeDY2gY6B18SlPGvAXtqwY40v4s3jugD0Wh32jV7WC0ma3PY5f/x8uW58Ea9QgQ97xMY6/o0pljsXzWn8Ezcyee8vvEZyvuQu09Myw5tIb+CcRT/NZcWqFeCyJDzH1z9cFTKQQdLQq52ecpPXbUAyO1FShS+Q0P6a3ilDH16PnBB0w/6YLI/UMQuXU9uC025tzv2bghdw3caNTgzpi1GGVZCEPumtCsPg46IqWoFGX5rtxd2jDpEu6/f5NV4mOp9o8Ln9aKhAcCO1EmSxeWLJnLd1sBs2Yd5KzGcVijMRenhFmjYsIXmDv3LFTnH2GTuyPBN7+Hr8ZeAiFbHxQ6dZo9Wh3h7txqVHR+T9qxQrwqbjwtf64Fa1NuYap7LlVf/0HOor9pimYrDJfHQl5qFwk1T2Sh0UmQKaEJK07/w/xXgfygWooX5HnwwsI7NHJUGzyMCObxCiO4amwHHykcAe801GFfZjCo3/DmHJnRdNo2jJfpPUT5vAmos1sD6rK7uHSGJkz9cRXXDhTRgMVWkvhyHAXLlKH4hSsuyLZmH2sDRv9yGH1WAd6OEuF5hXoce+8JPimcjRa7nRFXGcMSBxuy3ShBk0XH833XkbDs0X+w3P41Gg078qTPguhR/glkC9v4yNbRNOq9IX8I3c/xHwxhleZliFbWALdFp6GsrhQkzAJ4iW0ie1z4B/3mAXB/ZAKK6+jA9e8m+LbcG0YmTuU1w495i0A3xGUdwPBOZ0iK7IR6rfm0slYWko77cYXZdW5aYMoJK+egTbAAXHjhiFlrXDlE8jZWwQl608lweEkuiu85ha3ieZgofpkrdWaB49IdZPazBYWXiRLm3aT2dkNQ7P2HLx9VolC4BX3c3MU31UrRZOJW/DgplmVH68KVqjaW7R8DO97cQmnvMLxXbUWS6bnAty/Ca3MFnHr5IodLWbLRGHNoNxwFqq7NpGj2AmTcFWlgJPKIM734X9YNmmqvTC9ehdAn7oCJahqwK8oGZXdfpLfqXSi6P4b3JRmDR9MI6ipyhL2FohwSLsfPyyTA5kYoXVCXoc24DXzj1uLV/fv5xwFX7ku+ibNX5dDlec9Q7LYGaAmugJbJElA1K5kW1SbSktTzLCLxAR7NC8QHXuYUsCSN51wTgWTtAeqI/Q9s5wng8CZg81hN+q4wCoUP+dNH13xW9c2Bim3j4PVjZZQeNx50r9RjacEPKP12k1a/c4fYyTF4dGwS2ftIUOI2AWiRus2Wc7dC/YVpYBu3Ev8dMUGV1895UH8zH4nvpIXzo9FMegJE7TNC42/J/DrZgsdYRPMPif9YfLE3NqcCJtw9wgWhgyjjZAIX12+jpdHm0DLiC/uZmpL8jyyorz9GF8N6aKVwLaeuqcR8V0U4F/MRhz3mgOVLJY6xVcCCPDGULRzLJnkviZyWspSLFNdVSECB4WeyeXSc9wnNgNO5piSl4Qer3dfx/nAPKnswE29Y34MZxyfA9t4crK234GLjE6glkU4CN+vZIrMULr1xg9qV8TRH5BaeP2gFE+8V859N2nR88jxYeb6Qb6jd4D69W3g8A2mPpyFs3jMSRQOsYfn6NzDbyxyELvTzpIoCvLhGgrZseEMq+aswr1ESo96HcGOFJDw1mAeJt7O5/9JaMqnKYofys5hgoAPlV+eR7nQ52BRwDxWHleG4vRKq6B3DpV8MWX7RTnbeP55urn9GEWufUqmMM93/dZ43NhIs2l0F72PdWfFzPgTfV+IprkW884kV/zA5B/vTF4B4piFFztSEnq+ncMpzeWyXuY97zuvj3uSF7N42gGGbpOGp4BwQ/1kPZsYjAbpyMGX5NW7f/gWquuspJUKBRJqkUSN+FqlseUE6lRlwSE4XFB19sW5cHvynY0E19xZh0KnLnBX6nixTYnjEDmtSTEkmfqgF81c38pjJIpDaoAXazQtB7v0gJxavpK87K2lihji53wvlHW9HwIhj3Xh80xQQSHLgrX1RJBz1hqNlpHD/tBe8zfMY/PfnPimLy4LDl/18SS6A5nQq05O/+znVMImP7uymv6rZLO8sgxpdRrBxugmMunmKLFeIwJ5Pq2j3UlcuuC1Eeb/e8SOXTzRTuZ+Fi4Rp+S8LELz8Du+5pUO2/Rne9lQZFUXq6fb2q3Aocy9Stg5fNjMm/2GCXxn9VDdtPasl/oecspvRTgydrp3kM7vP8tOgm+Qd6okZrQ7w2WKIfU/I4rL0Dxyttpxr1/ej1zU/dp71B7/PraAoOSEw85sA3+Y4UfycasgR/c0yx27ztaSfPF19HU09dBXN07xg8Yc3/L5XAm5enk0Lptng6NpRVLgoE/TlbsMc1c1cvOwDL358CvZIjaAjmVow52cLGWYk0Ez/mxw8NpBrzqdiycnZeODcQRAvEaW+AVG2OS0F82UuoqtzN6S+yyCjG13UN7+J3F9p8JvrH9GzdznEGf+B7EtisNvtM4jmmqDL97l8xeYtf7B8jNt37qIrNm0YsdEFlM+MgIpuKRA7eAKaYpTpe+FDlDC35SHDSXjRLhjlv08j+RVZ4PJsNL/ssgOnM6L87P57Cn8gx4ZVebj/qhsNVa7A8LV5GHmkkdvjK9FZSgr2aU2AAbs6GDY6BckyLaxvo0p+816h9x1LTnDuIJyzmC5qMBgtKMbP+l9pQK4EbvT20wj9fxhRPBVmKv7gv78SMWX0UtruqA0FF12gV9mZnt8/S1pf9TB9VBop5gbwLqWRGPjUjm6/NsB/VhMheY8R+8b9gMLzzXzMN4N/eV8hcYET3H97HsYFSeMalUysTJIHBS9bVEt8xz3pAfh3tCNKCG7nizcegvqinXS+QQlzXEVJ2sgSVL4dxXF2DZi4OxDmbSmGz7mjaeWhT3TM+TW5zW2nN2GHWXL+CDigJ4qnk1VZWTuc5KXLWDj+Oe6+381Tb4rh1zYvFtbSpaofsmBcG0DzlfbRFnlZ6Fqhgz8eV9EWxzlwvyWJ8xt1uF/8NL+ssYbDXj1o3xKJfo+FeEKaNdVdb+ImUX1SLZDDpQeVQWztNxKylIOaSbsgtP4uzrQepGn/JnC4wHK2Dh9CL56Ff0fWkoxZHc5M1gfn4giYKPMbhlxugbSRGI1NL4dByUmYTB/45OEAuA1CeOexMtwov01nctewkexO+Li7hiPOn8CBna/xlGoCvxxAFmwwAslICUgr8YFr1nf4QJUxrxX5AtWHUrjQ9Ti9L1aD3Lqr+KdYHzu8NWFG4QeSC6rmoJFneUNBEH1+7cCDmX1s5JvIMg8L0T99mNa62gC9tMCuGx0UeK+S9sospObmXZyg0Yzm1REk5NJG+tteQJ0vg8QCe4TsIXbarQOaKfexeZEnPlllhIMn5Khs1T8Y65yAQw4ItdUVfLXCB2Icv8JJxST4REsh6uZhqqopp1TXL3y6UwyOntKFO63T0XBfPvRFVUB+WC9VfcjhRcMS9DXLEw2/fWdl33EQ76EO130S4Ox2FRj1fjop3TfEB0FFGH61HOefsOIlM8txVGI8b5o+Eepay9h61yhcuayXe5YL84yU9XBA/Sa3rXwMioX2MOfGS345ZAtnTmdj/TQLemK2nbdsPsrjmx1x0qi1nO9xjDe2BVLwjhFs0ofwfPofdlU4Rg9sjoNhQwlf+jpIdWNaUWOjIpoO3UecYAd7V6rDgNEADXue4FT7bri82ZUnPzkM/jE+MCi5mB/O/EPTNjiAuQxAZd9tptV3MWnIhhc1qYOYvh596BmGLHmkzxdiObpVjyYGGcHJnG18QlcQ5LashqjfZlA5vRc2SnTiVpdr3DhxOei4lPL7AVtonBKIrm/+wU31RIbUFm7JWoq6naX0qOgRSYnJwYqkSLQUmwSrd69n0ZK3ZPhPjdX//sTayREUcXUnvN5ZTcd8t8HeZbN4eBZC9gxVTP2ZC+UudyHkQxOukDjMmwJc+NxNSdplXANL3g+Dz0FpWOF3CdcuWogr/wah9t8udk1/xTMvOqO17QY0HXRCeJNMtp8mQpx9Gv2b0wqR0QI4ptkCD9ZWQVnSQtod0IhjDlvis1ox2pJkAUHPr+OZx/tg04YC8DN6RRMWH4dvJiIkPiMZP994SqqCEZgWPf7/5v92j2ijm7tWk/zaRGxX2spxc5Mh5+YOOPP8AS3bHMUePT+h0VgN1sbqQM2Iv5RzZAquT5RDwc2zcFKgHqSedKMV797Q49uurNSuDGd05pFswV5SFIvjmUefoGfEGco6akozDOqhoVeNZmal49kTwhCY0cexK8/Dl/sf6dz9Vro+yY5W7yCQXRlDz4q+ULR7FJx7Ngb+SLtgxI5L5LHIlN/8SKdus3U4GfbCogXJ1OlwnrKF1UA7yBx2GG3H4B966F23ktP9hCn7+QlK3KmEQa8DUCrAkfyOqUD6NVU4JbiERW5Y4b/7dqyxfivkv65nsz5NPpOTwdInY/Dcty84/5gtOM54zD++eGBK7VkWOLKD1K98QSd9e+xJf0PrBtayeXU2bV8/Ej71GuOTgEnst2YfrDUpZ9NxD8hmpzuGjNpHyWW/wSpiFDduNQGjb1LQObebZ49dxC7zruJdlzSWjDpKQ8v/cbPbdBDJNSSzQCsYHTnIr2wO845MPZ4wpp2+Dv8HB6sPgOCxvXj6zwGKdcmkyhmCkBBKVDL3NU01fM2DqW00cROhU5wDv71XTo/EK1heQQ0XHtKEBSPuQ8P5iWw3oxTS9hzlr8ZKbKn+hDnOiYtHVvPBg8m4vVMH1DyLcPSyReh9/SE0PupkqUAzjLhiQ3pPm2DVHTm4+cQc3q0VhCabNGz9aMMrFt/Eht8xpK+zjsdL93Bs8zA0tCZBmH0uFKfpwYLYSoja1U3O/YvhnA9B5VRN7PwRx/8KP/HW1kPQNdsBZquKw+1xi7nqtx3EnQvFy1t206aNkXR+cgnmHdnLliUr+OGQEGS6WYNV3RmWfXSXvFsr+djqaOjYf4zHymiBoXI6xIYeZtwhDhfm28OBu1fB9bgUbNF6CXbeUTRgZ85PYp0Z11b9jwD4AAQCgQIA+oddIhkhVGRnJiMhIlGaVNoJLRSitEuhpBJFRUlRtgppa5AoJavM4qQo0ZBR7lFsviZvlzqBE8IUoNI1Dh6r7eHNPbNZuM2fP88yhGfuv1Hv8hhY9PQ8zA4pwNE6Y2Gf7SP8tCSfhuxGkVh7HfYYTeEE63g++XMbpqSOgGiTO1j5WBikPBRwXbAZjg5w4Y12wXzn5GE23erBKxskqODtdDp1t469jDThjdMUinhPoL2tmLZOGMHme/1IaNZTMm2czo1FADXfRbHZUAe+fZ4A6/y3oYeZF464M513jVeB5CgTcH38AGdZTSdhnUJQj5EBbyEjKpgrwRuVNNjZ0wAld06g3wslMXHOEui948chdk00SVgQ3hd+gbU1D2D8+Vd84T9BKr41lVzbP/KPfhe83XqFu74EQk61CFhbnAKtg0MglrgcazuXQsa5KDh5yhTMh9z5vNYO7NUZotZ8hFmeF9lt01nMy/0LZbuWsPWePDSLn0Yaw6IMD56icmUzHhTVA5viNSCx6Am012XTM2qh6rvFcEB4EasMONEv9y00r+Yxyk0XBsHGX/j6qScfE/5L8aMC8ZjPBea7n3BPhy9FOd8njx+RMLHVBA71Pabz2/rJvtCO5XMRbZ7r04fJltDRTnyhP4Pj3X6gwWxD+JC6HnSvWdLuoVBsvPYRd306jXTyBMst0ubtth/4/JA/ldSZQ/tjdx5Tn406w09xWPwziB4Xoa99gWAsvRLMKy5xl0sISDVOAg/9FaDwRgFuxatTuNEf9tNdyOwsjZKDV2lYahIdO+rC3+0E4bHtcdj9fQ1PuORBH317sW7HSjIs0MS2jhwsPfAa3SNPwqQEAI+PryDT3pVijUR4y+hpeNnyFK80PEgzOlZQSaQ09XX+4i1BBqDdUcjHbm1h34mF/EI9EiXSZuOE5VepL6QV37yU5d7KddjyXRDmOgDl+2xij0tnMUAvhGY8XYbRb0Zi+3o3lsi3gQdndOF7lhl8/buSC0Omkm9NAD+VcoUPQtX0UusGd0towo+IUQDjBbiNlOFrxTpsmr0EMr8rc+9dE4pP3Iu2Zyowqn8s/afogWWflaF4WBiCXEqx/koGel21oN4cU7oqWcnO4s1Qo/sBZdy9qCrbDBJ2ycOD4xKwV3cZeS7JoraTZbBt+kk4FX6Dhi5sgGljbuOLndGgOU4ELto+B6nJI1i5+hylL2zBdzq6lFcvD7JffMnw3Udqun0XnadpwPLgJcCPy6j2ah8Hy30iocVRrBk+mzLzF3D/fFvcW3SW2x4agODlmcTh3+Dwnxy26VnM3VM2QaH1Kjp1UZq2ff1AHs5L+Y3nBPh3uwEiHhxnXG0Ip1reYXlMBZ8qOsqtvn70rcCegtOVYF2mKFhufQTlo+/jnvp5kDOrkM3vvuPJ0bncuPcOD5wfwzuWRTDIa8PhpEkwY+1OiLIo5vy2KBY3b4fsO1kk8E6IJm86CP9EjVn8BILG+jf0ovYPdzuuJYuzx/nsgCF5GyaTY2oRHjVQxmeleRA7geBe2ULsNI6H6S9UKdYoD2N6V+L1XbVke+4Rl167xRKWL3hfI8KU8W/BwUEJT12T5OGT+2ha5AMaSDrJrYnzSe1REB14/IYFRypB/3kxPLdkHP9yPcdL3fLI7rkWFT4tgsgxa3lvRxfFvvYAySvaYNcwkXU2CLHOBOLRFW849t8d+h7iCAFzArA0xZFF5ohj1QYdED6jC0E/RqPv3AGeezCQP5+ZSEV9bRC2NpBEUvXQ4vJY9I8VgciHLtg005foWigejJpGp3AEB+Mk6h5ezbf/xvHf2MUo9WckZCXuBvfHztTmYME3BipxyH4hTpkfAllgyE9im9k5dgkpHlQC56KFKP9VgIzimnG5SjV9CFgGl2Y1Qoq3JJzcdAK+ug7xQl1deNDUTJN7xpN10wYwk8jDDOUn7GXUR6GwgBdvT4CsZ6owsHIK6NWORt2tXrB1QRJ93xlBuLaFveWSKVh5LcwweMQJT/9AaJ0KXJXcRMNTn9Km0MfgmF+MrW7TWULjHgTWisNVfXEaZ3qLNeePhE0z9bh6xB9qad7Doxv86aFOBh+NjOPUvHP4cet1ODeqkU6PQLCNSIBzR7rYMNeX1wWH0OddapytNAsMzArAr2MOujde5ty/oiD02xDXPDCj98lTuUZ3GC5OPwHa1UlodnMUOQQY0bclpvTQwRyW9rfT6hnVODLJn278rKQO+2+4pc8TuxcuptaNjbB4exlITx0NT4VfY9jCBax1YiM9DAuA4YtmuEfEjdMlZqKxiQYeKQ+mhb81YMOBTLZ/vZcm/P5GykX13PPyH2Ub/saJgwFcW76Jhq7NhKIbhmC2IwD3KFzhom4vUovN4/KNSmjXsASrh+/xfVsVFDpoyPpXBEC/dhfZTzoEC/dEkEGBNj1wucebl0+nkKC9oPj7E+YtSoBqeXlomCfEYy+chvLWbnwyu5ibvuyAgJ8a4LYrjSe4HUXDCz8wwFEMpvyZDeXO2tBi6snmFnKo1T4dY/XqSfzMXQiS34relVM5rFASap4bgOmUEN4QUgkLyobYItSAD45VR8+4/Xj4miHHNDuwQJM8xH9ZQ/opR8j0+meSf54PH+/Mps61QRT1vpKXxPzAHQquKN09Huov/MTajp2wK6QeY9Rmg8nCnzj7YRu4Tv7BjrHhfLphPj9wk4bZDjcoIfwhLZ8xD8UlAuiJmzYmrlLAE/NuQFP0b3x0Oh+S0lUhRVOZ92nY85QWdxY1XcZFQ3108kQQ//xRRpYeoZT/2I7SxhhB/9SPOPL+Zph3aAs3+E2Bb05VuM2qEuTKCsjJ5RI9LM6lJWZTQLYzHRpCInj3R3eSe3CZzbpnUKpqNSuOvwY3EyeyZJs8Xo4UgoPHfXiTgiT5RSRx5ddCiHCoQGF/BzD++IVFv3yHjDVeNEZfHKJDJXn0OQFIfKaN0wU7ebzFV5adXc8LHW9j4IsDGBu3k/qFxeHmvd1gE/EKHu+T4KxtMdD84iSJiLjx/mId8jNWYvEgTQqfZwiXsnUoYqMndgWH8Q29L/jmggw+m12D22O06Pd/3XT7XiUWyuiD04R/4HNjmDULV8OhcgTPt7U4UWQndC8SJsmhRbxXPxn/zR4H1g9KUEGzF3Lq01E7wwxozVw4fLUJfeaVYmTzVnIx7CHb15Pgb48pGL01xycRaiRg5w+2Ud0wyzefVf6rgBPntuNig39s1m4OHxRtYGnmd1irU4OWZr38yHM/2X05z19yhPmC9GjkX9qw3FEZ1gXt53FcAL8WLcaf2sXo3iNPH5R/gsdBI2ysHoSL/hZ8PFsZcPdC7vBKRPe0FL6cJoBJJRXcZLIQzTxmwqOQFTAUFEQJsghRkl0Y8fcnx54oxPKE2XjtWTmdVF/BVzbowzGfbBqWSqUfFeJw+rMbLhzhxZGxtni8MYbSXLfzR+GRdGD2crqbpc7RWw0ovcICJnS5UNKpKfhD9CGWGhNLrZgJXhuf8RmJ8/DQzhNcR/2i3bJjISDOiSbt+Yd7Pp8FkYkjubBnLEh7qfG+tp/gX3MTnZdk8tSd8jBZ4zD37llLfQv24WSFPfR9vSueLf2I77JjqMT7DP1V1MROSyV4bPeR9qbOxR+tZigtBqijWU0i1WGYNvkp6m/2Jcc/kSxsOhksJYYgbziNJxk9hrj3Y+GvpxmKm4/i3K5pGJyeQ6ss4uiH2RhYunQyvbgWRof1J9Dnv1PoQmkgC0pfxu/vP/AsEVG4xtVgGqwGn/gnpL8255hvPiB9ejIX5ipDmKcWBAwWQsI+dc4/8grq6qzhfLwJtPYK0xK5Qzxh/kk+Hnid4tMV0GC6O3SvW0afXzrg57rR8MO+Bo8/V4ZVuRKwZsdOKN4kzZEVcznT6jBV7WjEHKEyUD0oBi1d/lDr/JcF9Rv4h2ITvr11lwTu7UGxLzM58MIbvt2VwuHvLCDQWpI1f9/HlrHubHXLi/MebSZlx6u0u0uM/jvfAPnLetAw1BBKtVsxq0QWD79rgst/DYB/ltGTjeGYKddLb5Pt8FdCEtgoGYPUVj262iIMAzAbIuwHKWrWM0y9cIZCd26Gte+CYLX1BxSrHwO9c1fDhxygSOVjVBbxh/97dxUOPqkkgZVT8JGZCLx9cQf+65cB50EHcPayJyPrfJrdcYb/bPEg40sbyOtvPe5+64CeykKcOEURxDxP4BQ7AUou2cTRX6X51i0h/GAgDjmFe5jsfEiv4zP/tJsKPtHG6GQ2l1/HGUFMoiHGOM0kyVtz4OTeLrw3EAtK2vo0QlMTfK33cMs/PRAPfERJ7/ZivnM/HQ69S4or2ki7PpcdJSzxTJ0YeI93x0Uzy+G/56/BerwMJeyLZdxuSSplW7g1S4NXTUyB/a7qYFnrRPIXjKHUtpT/WxZFDRjLIysFUKn3NTl80+DcnB4uk5CEoeo+2nZTD+WOebOSpR0pbJSG8z5uPDU3H4aHQjltuRxrHJeCsaFbcamtEO99kkPkQbxPrJzWJBOuPrIG+uslcPHY9bDeWAhO5WjgoQVlNGJ5Nf5dlgDfTv6gZiMDjIleSwrOijj1jgU5KRnBuajraHlzP40a5UOUfJS1XFYCWdlCjfpfikxx5yd3xnGkzEjYdWYGxC38wIujR6G1/CFsnXQYZ5nexpkWabx/WydGLZTj7xWjYZbEElTX1QG9wWvsnJdNS7SU2bj3NovPu47RfhdZNfcAfZOaAuvSfFlUrgJOS90At61bqGb8E6qLacGXixNB+ttTmOPRR+HVslA1Yz0L7vyBfgdOQ+b4AnzloMaLvH/AgTpBPrd1GJcc7aHSmQjxoqo0U3ACPyru4oFN5XB0hikLuY5D3ZiFuOdKGTXMTOQ15VKgvMCPXj4Q57mihfw9IIgLO0PBv+gRzBo7g9Y8mM2jf5ujeJscjJmfzKXYjgv/s8FLRz/wDgFRHv3chaftGUnVBtdYa7IGDSoZQLZZJl7WsQfXOyL0OG0L/LiVh2+GXkP4DykyCSrhdKtDoHZeDP61e7BNzinIcYmm7q31XK2kiz/TVPjlxit4eaw7h8wUhhm1YqB4pwOVi5Ko52EeOZzYSiEys8jl2Hf6FmYBwaeC4e+efhoZJwI6rUvhTPshvFauQi5WS+lO/jZSH78XprjnoXehB+drnaIZBybCs3uHQDq/D9RLLsCHCem46EsgNB2Tx7cHxPD9+lZWqRzHxotV4YTKPlr56SLNUbChI+ufgPKolfzs3zy8f+EVuwZI04ePvhRbqwo7ZUQoJNmZvI8loK3OVT51ehPbi0+gS4bTQfPqKXQxykKpGn14mfePQ/rUsTiwkOMStOCS3VTwzy/ipjw5HCO9DvxzjkDkQwlwVxODiqo0kH4ixee2vYfPqqWk8egw/fhwlcMV7vKylnS48twUPtwEuHS6EQXGv4CXerHQ6niLl15fyfNmfKUn0YlQF52P26tMYPc5fyxfW0MWtw9xLZrz8tP24GmkCak+swlUiihh9X7sj5aF05/0+WmvJ2S8s6KulDi8WJPH+mJOsEQkFYptqzArXora6qdAhps+TNt4k/yKUniRXwVVdenjhd8hYLGwBZd+OsNum2VAJl4Jcm6so+ijQ5i0uwCL7nTRHv+/dN8wHWefaKMbGcFovV8dtf/Ths5nybBOegeceIRUOyocl+2u53apE3ysxp3uvUqAhgRr2O2sCkNURg0+U/CQphWvt4ylPf5NcP6KP/lHrYVJj8zgnYYnyAWPgIA1HiAi9ZYFNrbi3w5fkvT4j0vWumFD8x96P/4bLpV/ganTlGDMwFIwKzsMOx6/5i/ZuVi8rJfWht9G/0fbICHYlEcO7eYj07Uhcm88J434jlHdnrR/w2+Y+WIK/1dpQO/1r+GosXVE0Uv54kJViBDro6ev1LjsnibOflRMUQ1j4ISiHH8YdZekBMRgaPA85jULw5k5J3h5VBlklUyhfT9LsL38LhxZHQsdPyPoU9UzupwTANtqp0LGKGEwcGwln+ni8HVCGrgpjKGDlREUkHId/ddU4oBkFvlnyILjjdlgf84RpV7lsp/oKjopIYN9DhKct2ESHjBEWPonEt2yTWBEuiB4ZF/gn2uP8pI18zG/fTlZL/8OYV+NeM4zTRD6d41L85Ug7VMtlHxtBYHxIrhYPQkcew6xef8MkI904YmRvWzrb8RZywVA48V6uvbcFI71qUH3lS2sMUeNtg0lQOZ/63jkpuPgul+BXwaMge8/AIWK3lBN6lK6lFQMKz5Gce7gDvp5yxU/9Xbx6fy9pC0yFqyEjOhLhjnqWWVy00g/zh65hh8FnURtdRUMKr5E+zpNqf7hFDD/08Qbjh5Diw5f+L05EJaYfmcvuee46dwL/DrQS9e/1JFnvSk8G6EKGt1uPFlzMR/tXMXSgZr8J6qXN/1XS1pZOhwa48yThqeAUaUEShfq0nC9JjcUS/D8mA+43zeNtz2dzmKl81De+zmePGwJq4LWckPwPPz8KR7T5fvg5+9UPHFjG4BnLZRYDeFzA8LggWmwUycSTnun488HnRTddIXU5J1I65UdR2TegZ5YF7KbV4Af16pDv307Rxgt5Cr/UeQSX81KBoZ0duRn7vGs51D5VD4eFMGKz8ZCxoU0+LE7C77bPsbRE4pI4rwnf5vxGslaGSWGUmDrn82sHagJev8B3fmzA35umAddF8J4Soci58N/jK3tWELF0CqcyZKlYjCu9RJP7mqny+IXufCyJx1suUf7Y+VIUnAPh/hYoJBYJif8Jw4JFrWwc+EKzNO4hG/2LsDXv0NYbEkFDWwuIrlZtmA7+hkJPVSCaeFt1FR2AhWLrfnN5W1YVHsf816u4jj/fBgQdqPDBZN58aYxMKAri9tlX1KjgTW4l6/H+UNS1OOmx0/Nwnm9fTxeXOQJOu1mcDzpBQXyXSj6WICGh5NgwaVoNFt8nZPGVFM8ptKCmm6Y6yUEmr9mcX9qGBUGf8F32wuw7Xwen9oyAkxH/QftXxJ57MgU/KSuDIv/bYaXNIucVabwxQt3IXLdLRLKLMHkqM/Y9kibSjUmQocBgPkLSSwIaqXd2z1gdoAn6ybOBouR0yjg2lQctTKNm4Ti4VYxAWUE0FxXHx5ccYQos5HuKHSRhY0U6UiN4XeujmSVu5RiHYSh5/hXnrRzkI3HmoFf4Gouqs+nL5FjKFJlGoqc6sSGFn+OaZoGYtX91OGtSY8XuMBXvV3wYOsEuis2xG3novCS0D/I/zjAewoQ5J1u44IIQRQZU8c2D3Wgos2Xn/jPRlkFD1zxCSDmbxAmbRkHLpol2Pg4F6cafIJt1XE4f6k8xK/4x8rp+WhyqwVS4kNY84UufB26xYa7D0J00iw+vzUCbp4boJrmN+jVFkvf2I9STXphacco+P7wK/jNyQUZ0x2w+IsJT/5KMJTgwn8mSWDu/MNUsUQWPPR14JiFBlx7W0trYkRJKPAMrhM5wFbl+bTSUBjby19idYc5OCqMAlmXK9DxcB+6CHzFAYzAH38OYOoCBViUPhL8vD7Ro6kT6IWhBlyNMeCT6a585IQwnWlai86qp2jK/Wj8uK8UrBbpsI/mWl5yjYEPa3FFzVx8s+Yt6naPY93vr2CT1xM065eA3Wcfwa+NrmiyRwtuOaTipxcFuOK4Pj7QPsCJlbZcu08CjU2cKK5jB6r1h3JLsiW8SD1NkRPCoHFUPbd4x8PlwAlQ9GY32H++RgJfPlCwrBKEGo+GN9yHfyCILr8nPPMyEI1nJMMM1VjuOjCacdsIbl38HBUXS0LAGl9uOzIF6142wNzQ5fTrnw2OeLQbJt5zgUdNebBtTC2FHpwO7esqSOZoJ9qM/8ZLqj9y9ZoHoL4zlQYWbQaF8hheLV0EK7+JQ2xyLj9zvkJNTnak6VmN6ebLwDHAE2Seb8eQugvssKmdLXdIgNSneXDXWBhnvF5AZnHXycLtMevXyMIXWTf8bNWFy1bl4qgsAVgm95dcW+JphY8SzFebQjlCVTBTToAO975H0doMWuI5m84py0G02C8we2eOA4uyQW1JAP47U8E2s7XY5Ygh1g+nY25YKbxZLQJhSq50P60ETmM4DQyOZ9EQD1Zcnw1jopawfdwD/ikfzj7nrKDMxJLVy7zJIfw2Chuk8xun23jg5DJe1FvPb+vuwaFqU0xpkIUNLp/5rATD7ln1JG6axfE6Ulyx7DHaZl7FnrAmdpwsBaKC0tCjYMOnf62C+Zc+814xfbz03hPOXw3DqymdPGr7MzwhawqGv01gsuB6Tpo8BZOah7Av0AdduzeAxQRpmBiTzVXta/mW+HlKdx8DG5dvwuWZ78CkJIyFu/5S+JmTnGp0Fg7rnUVvbW3cf9uNPa4x7L/Rjw3xZ0A9VBdScuVIyC2bj5RPg2L1GWSZKAk3Dkvy8LER8Gvfe0xtuM5eLst4qdNEjLLTB/fZ/8hv+gqIkNSlgMndYC88BqwneUNoUCOcPH0NMq6NgIpkb5aSvEtv/iyA+StO0KCVB+6o0ofWgxnYN88Z9xX9AkEHA7bsvwXR93+zk68aBnbVwQGvXNgbIw7Dep50eIwiDmAfZE5dR7ovotB5eDfNsHCB+bqvSOViNgfmysNypZ24RsSXSqsTSNj+IwtoWMLWoAconHMH94bIsYeKHd5ZORGclcVJ50c1+k1MBs3THezj1wCj/x2nHb978IhyNFokeoFpyRgIdA1HU4Xt2PbODEe8HAm2GIfZyWFs44hYtrYbS8UeYdU1LfiiOwFnrZ1Eme3GPF9qkOvCv4PUn70cUZdGVomBHJkfih/+WMFT3WR0LiilZecb+N/e2Rj2xh8HL73Cqh0NvOftWuoUekV6kVPB+lY/5itcpLgDH/DGqjg+YqCJlrbX8fMZdVRySIOjBx7CvkICa0cduGT4iZ5/SqVHrw5y7G4dcHJahHayETwam/GN1zBVJUyGmW4/aXpaNi98tw3szjnClpX2dD/kNz+UCEXXEzY8mJiGf/wF4Frodp4eO5v0rUNBwy0Gd4wrh46ELyQbEQjJtjOIVm3FEG2CDMuHtG5MKqXmhJGpiDfc9Yulg6HHOLX+CrVri3LX3EzQPmUKcxX/4V5Ze7QrUeTSoV3wrtoL/A190eeHLHjtNaTRTRIs5DoVtuy4BvtfSgKfPQF7vCNxd8EEOjomFK+6/oLg1X9IMmgvTanRgEkW97DZLZpPWWzG4BvzqbhwBx5o1aYNwq042bIKyvacpJ4BSXj205tk7LRw7Pgx/GuNEE/KHATJDTW81jeaT/dfoPF2tSC/cwz8+5uG58RzUNUiGkIO7+I7m+tx2rt+/Bh3hpvzZvD45n98AITBY3CIpm7/TRq2tiw3HEBmAgNsfMeeBq6a8gqzaLw4dzRZiZmCWM07WCmyCbxlH7Ja0y+u2m3O1+110PrAYZB3CYVHCinkKzYWwn4eoNzQS6Aw3oQLGm05v1oFBW9mklfyS/CJ7uBJ9o74sVcMfpY3w5dQD3KM34oLevv4eL0++P26xgH/FDFTu4avW9zBEQKS0KB/gem/lahm5oBtMsf4x9ZSMr+xHh6/0eMO4QuQ8NGMZV3MoCVqPkZ49IH9j2YaE/4SE5c7QP2KG5yxzwJ/NV7E5U90aLyxJRReTsFTzgF03UUeuu6Wsar3ZlS4GsATPPX4cLshjH87ByV0RoKgUCrpzFTCER9i6HeWMFRL+OIHh4tg1TUGz8yYA/NLFuJg+CSwCZ8N1c1rcUrjJV7n/gGb3uqjRuQfDuq+zav/ecJdk9ucuBhAY1cVl4nOQY/UG+A59jHLXxYhuWfpNNSXAoFZUfz+vBEn7lSCD/s9uaFwI6Q9zId5ttWgbHCUXTRK8G2UIv0RmYiSp8LZdrwEPCtSwtMfBCF4/xz0XhUAlrduw+eKGni/8B5LrwjByz1bscbSCFbVEj+YdoTjmv1BXXMVV2SPxUWdP2FKUgifgFQMW1uI8hky0CN8Ap9EJ/D1O6a0I2QuPc7PInzmia5f89n5tQzPkxeCuHFGIJ0sBWvsRtPWRmmQL7oFis9cOWIsgcluVWyU0sLMbaZ0uNwMrltZ8P3pCC9+q4DUgU2kcOIxHzC7D2EtNlyn7ICyHb3gMzwdpJaVkoKSFjmODsd1Z0+DvEMJDG0qAs/WbFLJnMszcxbicSV5WLc3F5+Y1kHYiE5q6jLGvStqofKiDYxZ9oMz6pXoyMNN4OZvAGE10bhXcRV3Fa0DIbN1fHHOREzreg7ZJY84qOAV7vi6gAPbpcFkmiVUL33Pp1aOhubnW9Dl6UF4LZLBv0J6QOSqHCWaNvOXa6MgeEUKFm6cR9mx32DZrAeg9qCFbLYMQ5vTaNAsSIA1qIoPbqtBSLsFtKhM4b5cJxhqzcIrN0biUfU43nA1kn6JbMeU9+NYTXMsnPPRoierDvLcVDVs8TDnlQlmpHnlHf5ZehyeDcTBnNoHWHNPBPp+X+EXSd/wlpwUPOyRovRtfdy9SAqrJfJIKPcMBwlo8TtvEzhhOINEvw+zxbtZ8HrDX5z0eA51ugrD4apCJtsNtN7zHzocE4KUfaJQ8v00+xTO4Ci9H5QzoATjlDphpughNK67SUsXvgZ7NILTW0sgwmc9KpSfopbnVXAux5wCTT6R4/1q9krspdfZsbC63wT2e90Gj0cJKKFRTXojN2N61W4s+9eLWSvNoTvQgedUv2PBuVIgMmsppR2eD89+rOZgqUv0e54N/ycpCd2JCjCuZSG39S9Hm5HWIDc1njZ6HYXkzUJQDJok7z+NpfQiSeX5Xmi99oQaV8dwg6Y4zK8NxDnfvlGoqA5t3HaCTKdpwMZrCZx/rpD35RuzmE8Kzp8vBJc9Q9F5Ty/8OHKYpplW0Ijui7T1qh8YXX9E7nkbcVfNEVSZrAJzNuVT4H8DPOVmGSy+oI0eN8bx4/njOLfRB6Yd2suzEqNZfZc4XHiQyikXSinsqhlN1nBEy9sB9CXlEs26Hs7/nkli1sZFLBkzCtJnJ/InNW1e79jNnSsF+VOGBZQP+ZPJ8TbW+CNLW46fhHuF46DHcwTG6V3FmOeFENr+AyaXL2SZWwG8aKYaef1yw0m2Xfji6RTYNFuLslWFefxZdUiozcTKDkXunCCGMontbLdGEwZMZIl+mcC0ak9Q79hLp5MsocGsFN6JhvOhchNQMjqKGi6mtG9jCPQNSUOlXxPlfO6EXWnfIW21NS8QcOHK3LEgXTXISVnHSD/uEEWcEwZL8xHk9k2Lbryqwf9yArnnTSDWJgdQYNEvTq5YgysqDpD5ZQU4qnKJxiyMxDMHh6EuIIXDhOaBQ/Qz2Kl7FmQEFrO+ezbaGOhDmcYrXp3UR69kC3j3gSa+/mQzLFKdxhFnD8FfhSXsvdyM/k6Xh++5G7jwoT35rSuj3Ev67HqzB8qqdSnDboBWihzi3XOOgbiiENgN2fFMiQN0zywFnpjb4pG4TVBmok73M/6gRNMDEHuoCYtDBaF89R+ItjCGJMcC+vukB0wWeGN1chlU9Yxixbw2WHZiJQ4YW8DAcleE7dtpWaYX2RfNYM0vGzHr1GtYJVENYqmzcN2jevb1EgYXx1aMr/oIZeV1NKL8Pl1MvkZiTTdx1vc10BbuQxuOAd17Zwn/7ofCqgmKYNw4gwMu/WLLWmcQkd4OSZ0KPDxTFQx7dvHBs9pw7vYtSBnjDcGLc0mgdgsLCCXSgpbL8NxSkZzOyWJMTxvvk5AFkfx4krS5T9K1R1lnfgaJ5fzDZ9dqwOnQMfiQfIk1B/1wuEUTfKq3okqZA6CeCS+N1qEtRtGU3RNPEdI23OD9Gy9Xh4NvJ4HErgTe8iIIhgyE2E9EBw8MTgXVop1Qv62ItIwTYdbdJNI/KwN3C03IInM0NNxpoQbNkexRfBm3rcxA94NP0fW8D/iGpIH/DIKYFzNQGk6TsK4pO3xeCIuKDPHw6gXsfCYPLTQRDm9XAKsmTZi2SxBdmp2xUssV1wlugNszLrL03Mdgo3Mc1xj0wpvQbvqRYQy3V57Gl1rbIP6KE3w3nEMLf6zmzK9V9HmHBV6cdAgVwQZf7VGFlWtPgLxyBt6Rb4dHrwvRcU4f+k78zac3TIIWeW/q2pHERRXjoT/bFPcdVMGnMZPo+isJDK4yQZH6UuhPfcQJ50tx6KoqO0toQu0NQdp6q4rnTXWCxRcj8cE4R9ro9RNqNUZhe7QFGC1rp1mK5uDhUIYqx08jx+0kn3oDdh4ux+Hzsty8eiW+OvkKdg2vR7XJo8HBTo6+rQ/HO3eDQO6lJJufvsKnMpThV9h3EPuUj4dWO7LPdCGY8yyZeV0pz3yRBm8MWnGe5xUqWXGF5U4cg9jSdvD/SLy8TAhMjb6zsdQOGO91jpbee4lln8JhV4kgxVEMdm54i+LRFnjbQhUUO2thm0wj9WWO4I8TV+O4/D8o2ONPmw9JgOQ/JyiGQeyaNB6yOpbA6/dOUFHdA8vCPnPgnG94+dRmGG2Xwa3iMuj0qwvWOlrDFp10rClN4K/6T/Cczl48Pa4H9lj4wYebAWCfWUUhyaWQYaUKO8bag5TacpDJ8gWZffqw+74K/TNXwXa5BCjZ0EiimxbhezNlsG3YA8EnfWFBqQTOztkE+4y/YVX0DfB2+spBq35yyXRzHl2pCvsCW0nBpYRkTCX4xct8CFt/m58VzIO2A4l8xHEBSeyPRHkHYTDtGMF3U9Sp77k/Wh2v5c/bjlP3oVcw7ed+WJ8lREaZ1ai+QAQSPz4E0zpXdEzcTQnXFsDKDd8JOtTQwdOIZs0+g6suW8KDe6Pg7hNp3K6cCc8bRtMHjxLafcaML/SLg2D9Xkq6+IrXLY7hwappwMr74XLCTI6J+0iVblGcKdNKjXXTQO2ZMX/5G4ApS96QWq4JHH19mQfXnsRtKaKUsUgba3+eIZueR6wu+BXXxF3EhSFH8L871pDqvBz1VPKx6Pxm+pgwCdIcXqB+tRy4VM0CxfWXYHSGGM63E4VsJS+4ZHGU/V1LWXiRMZu6nULLv0qgNEKZhSR8aIXuGXwspAhFRanQN6scjrlEgWyRKJ4IOIMflM7B8o0/SS18BL9OruCcRg2oihBnjXVXqMLkLsg4H+HSKi3KdG0mhVg1aD63DHr8Cun7KXUYcs/Bi282oEzDHm5Lno6lHqVgvEMafYvu0Z+ZwiTxPB5ULhpBUVQf5aoc5Kgxy8jd6xPdCj2P9T7rOfvVAziksgs/TKiErYKicGjrLzBM2gxHjYSw6OkUKDFPwW7RHIzQUuTqUxf4lr4I3VcVh0ydVE5U2M8W3zvIQyCWkx+H4lD9GWjS6IC7N51YbtF2bFklB6ZnZ9J/9mPBDkoJ5xTybQdXCHnqyVq+WvSlqpaduipJ7qoK6N5oYngzCIeeRKLqpW3QPMoYj0g30KYCWQ58PgnDJzRyZJ0+DOqtgnGuj3nczkzcqLUHtnikc+Xzu+SqeAG1M1MgOEKfUqdNhntlT3n5qnLcpbUQLu5So+Tbs3BqihnKh2ujn8hi0B6zBO3MpaArIgZz0tvh+VYvft/rxk2J4qAqup5k9abyD4e/JFRwhj/mMRx5MR3b/C1groEAvFmyAHuCDuHfnXFQrVFMIP6b/MceoX6nybDm3QJonq7ISe0beOuZDHAW+wdehufYeccsDq4zh+TtE3G0MUFjeydKfa/G7741cNBdkPcGVeK38j66YD0P3Z9pQkXoDTDfowwrnp0G/W1T6c60K9SCviS9/jlIOlwh+dnqEGMXSVduVIAmWcOxZZKk5mCHHn8uwP1cFVr3KZSsH9qxq/Rfkj9cSbPfR2Ja9AhQO6uFd9OuU06IKo1v+o6x4V/xdgRAwJtcEhQW4AULRvOqZyIw8oU06Ht7078rKryxw4mW+3mDpMB00lQewEB3e+pybgFbV1Mo9tLHgKypOHeTHNYnhGKvWxlddn0O5m5yqN1qRVvrTGmNmins2uOENl1GJPq8gJpCfmHCQ3MuPmbN69pkeNyZiTCQqQcV5aJwNXEPZrnWk1VJDW00+QaT08v43KZ8XNzZQ/qu6jDx61HeGy8D7bqxdMNImw917YQ/ct54VkEX4p2fQPqnS3jHxx3EFRRZ+qkpGH2J5TytM/jpRQ1/vtTBxwRb+GxNCHurZsENuyX4fLkyJTcag37tY3rVmwQHOrr5kTDhGrt+aJxhwwM3WzjqURnvv9XNEReFoGT8cryaEQ/+EitZJdwHa6un40mDkzzR9jJfnbsKxmAQdpEaLL35F0dYq0P+Oim6pB+NH2KscaxiDXuvmg+3r5ewtnMVFCgbgeJECd7XKMuX1tzl4yeXQrH/WNC21cPCDUkg73qHln6+BWu/yMN973W04NhrfndzNQxed8KPY+R55qs++ukki+MuVFGBxjz2e28OLyY7k87rVKz3aMfSxDd4R9sAvZ5vpJI6MbYKVILxI5txvK066I9ToLa8A3SttIXDJEexsc4Q/0h6R3XPT0CBjBP5yNqAvKE4DD4X41cPZOF+XwyNsh7EtzX3afUhOxxbLUi8cyMKhe1FW191uPYqkdaKvqa1j5eBx/n/YLtiI8T0q9GIt944U3MLfZR6DeteMEh6B6OUoS/32oYTtaeDdrkdVDx9Qwc3n6QrJ1ugqGw+13dJwtXqZnp4XxU25XtSRcE1KvkYwUqBR/ERzcD4wCc8y3c6v+gQBL9P8fD2ZwsVhs/hlb1+oJqWx+ad4pxx9CO9tBrHc3a+Q80iDXCstkELkRDW/dJMN0bPxPnf+vi4jR7vnt4P5ml38GTgHBKLAHC6J0K2x2Xg3lpRyBF9TWL7bCHs8ix82f2PPxz4QNnyN2lykgV0KreC0sbZuCQuCM2XF9A6kfdQ2TgaDkk40OAnAY6wzOTKUkmIur6PpLb28ErnxfQhSI/SNlyEvHWBuMVzMRi+KMDXjRU0tQehqWkMpk61RKeANhxjVoWX3wpjomswuhVl0fvTb1jW4DL49kmBWP837NgaC7eO7+Kzp9Nh37R4Gpr0CH9pqWKmiDxq5J8GgWQRGLq/C3+PbwNHow/Mtm6gbqHAGWYF4LXoDbnvF4UDO0ZwyheAZzJ9NHlaCo2fugZvGt+DX+//g9Vm82H98cdYIN1KL4IM8eVGCzhe/JFTLyeDU9UIfhaxFIYHetH+61PI1izkDW6irHRsB2xpt4KBrxdQ484T3ucjTOV+LfC6NA82VDzA/d732fSpLPQfWkTVG9Qh66YFLUh9B7/TgtkuXQBmeEmBjNk7KrqzD67Y/2WZd0to6wSG2wWl7DPswVZqRSAkfoVuLDqGMlfn0OKUJ3xCfRCDajx5XpQUBE43o2IqInm/bzBv/wEoWZ5FO5JjYXf1F+7fuJbC0uuoNFUPdKJT2HjqJvhqu5zvswIa8R80+q1NO/A7xmu3UM8RE047qg6LFzTQ3glW/DfiPJ2I0ILsAQNMt9Xiuw8HecaVpzBJ8SmFFivAn0XqcHVTDRh6t0JD6x+63nsUx3W9Y4Gpo3hvdyP/jdzJmfIS0Fz1gu6VB8MktV8cOG0DPpy4Gdptqihs/yCeP6SHQm7/4TjfyWCcfhrPpxHkn8zjF1pHsOvfYd649yV1Vwlg1eXNmMOTaWHmJFhvUASzF6nRft8BfLXEjYsHp0MlNPO+sI1oMTUKElKyOW+6LsjJZVNbzWv4uiYdA6xzocbrFZivbgC1W9dRSHQv7Wg+y4ouxpAh7EdTlcShrckN/vt5iO4bGfPOZ185HXTIa6QPbc23htjdY8DqWQvPVEzDzCdpLObtSYqfZ8DBcDXa+jYBa6/HseSSJfyqRROC3Kaz+QgTJuu5JBvzAlYtbMT+iT+4MnQ+mYaEQV3vCoqVV4RVDZksUb+H8tUE6dmCqdDxPpY9fOXZt+sHXH08m3KmJ9KFp+qwe0kDrG41oKtxT0mmu4fObjOlt6MNectnec6RuQinditQ+UtdiK11pDPtJ2H723UQYrOLpDcPU6eWJkxacZZap0/CZ+YhvFpLEIJe3aVXge1kd34lzP25gGMnLoffz39CROstvHHFGVLGhXKKhh48WZfHNz5GwIzXalg8PpNVvn6jq8fP4cGacoppaMIRazVIZbMKhN4/BKQlSitXWUOU6GeeP9GUhz4/g7ZDrVy0aSuNkvDA24/UQPT6ChS95gxjTWxorthXnLOlGJYtWMLBFrWw+ORlmmqtx2u3a0KLjA7y1lr+534P13iIYJPbHMiOmwDFIybT/DPR5DzQiA8WA6TV5FLdqvE0uPUu5i6q4KQaI9rj5wGeW7NRf5I6DZeexK5SAVBPzyXjqA8YdEgZld2+Q5bAcTgy04bKHJaB2pVkGrnsKIufFIKzMSVY8S+ZDvyaxdtVpED/tgNQ62wMS9vHSsbmtCHNC2/Gm8P5Uj+eprOBD4w9R2N73+ONLKRGqe9ok76D/cZdwsfiTAX3pEF6ohu4F2/AWPeLrD7WgHqXjqcg12BqbJEFg4MXISVdjJ+/kYfzFafZeLUsy/fXwTpvVWpsDQMLi00cbdeGozt2YfDXVTRD1gj+rHqIS/ROQueOW1z3WhlTNnSQzXAOTw4ux2ElDWoLLWINH2topb2kdDKc7ypFc13KQxS0yqck13BuODyP9wwrQcfVSTTprSTUQRNNlH9Ht6+o4buh2ej+9QSdf+LIK86msJ3lOs7Feu44ZwWyU23I8OchyHa4Svsgn+ele0GVqzZVbvwDYZ7hkGqpB3ljVWC1ozA8CheAZj0/+HBGjux+aMFVuwbQLVCH3NWhmKUtDFt+a4PPyu0cvNIWdFf/of6kMNwGNpxo9ZlfrZWgjt511PYykVaV6UNN6gI8YnGVg0ecoWLhLEoZ8ZACdC3xv/okrF4WTo4rnEjdfSS8TpGEoBOG8HbNCZbSOojVBffJW28/GX6roPBl5vQnLJdl/ceAo8NnlsqeBDYelzk3fhXeerYGlzWPBKH+z+jpOwFHe6TgiIsTQS8tjq8bG7HVAiP69csR851O8dXV8qy4soa9o59g32ANGqtNhrTGSURbunjnuRSq7FaFycZlME16kBOb/ajBKo18p0my0kQV+NzZBHFjrlOp3VoqeynCH2/ac/w8YWwy2kXl2p3UscadTPOmwBXVOvZOfM9z2qLgp7U9bs8JJrMM5Msrf8C9GRY0N66PJLWsoH3eREoZNgb7Bj+2vhaIrUoTwfF9EM0WK6e0nxlcXR/Oz/6OBGMXOdber0Lk2c6npi3ndLHNWCNfDMdlayG2aCKGlSjQoocMop1JcEE+nYZ21cONf968YVCXvmlJ8aHfLRBdG8bTX18i8Svj4POAO1fmqGGr2gn+Pv003TI6xyr/vcMs9ICOvR14RMiLYzYz6MZK4Vv9NLqT54l5mV/p5dZEvGRkTPZTJLk06CWYZpygc5HK8Hk/8sfKEzQEwTRWXxLDZ06AVaUqtJOMcENFC9iKx8JoAw3YMtGCTMdvxylnxsLkmADc4yGKvcfuUM+/YDpy9Sz6hFngTSNRaGgOgYB9tXRAYhxl553HAbtWdBN6SNkiD+mR1VjY05OPwemWUDJFG41OBUFn51lW3HmDvPrGkHrgPV59vwD2z/1G/7qHyOC1MUw3+kIiFqM4rSGBfu8EXCBQDcexiUNX7+Y7RwYhJHUe1Z5VhAeC4vCl3xmGJwfjU9UglrI5QRGb1/KuWeOoa1Y5avgfx4l9UlAnkUNDk/Mw+3ogvrJ+iip3Tejx60JKWi/Nfys+EbAFOd7SgcGp/bTm8xSyfppA4fs28OSKlRhX5kKCfV0cPDEKxDKkEXPN4PiaxWy4QR5/39TFl1vEQLDoBz95mQEHCqTo1pQSLrFfiAW7VGDj+3fw+94ClvxxFh2jN5LdSAd2nbkD92zYxVXSPhCw2ASOBjCka9zi7hpVfNFuSHvvXKLbk4VIx2QLqh/pg/iUh2Rj3kX3zuhCfYoPWE5bCg8vbeFqXxGUvq+Hp+L34Nn6mzy1pRYi9bpJvF8e0i/dAWGpZZiWnsHgXoyHdd1ZO+goRE1IhLM3fDjl1koSDR4POZ/FufhPPxrvLKC/P57we+1H9EdQlhKf34TrK6TRIsmWclaPgoBVAfj2zhYSri2kp/V7cV2qG/Y+z0TR7aYkL74GPXqS+Ei7AqxL8cXljmOp22sEfL6Rw6XeIuyXHo6nnez5Hf7mr2EWrGAiAOfthChVMJGK5C/wi83LQdBTC/adE+J9JxS4X8OAH8614jv+ahCkHIFrX9Ww+dV9UJSfwa+PXqNjHy0Jz9jxzcBL1LnqMHXhVDiwYwfIvYnHEpvD/IE+Ut6PLHbcU8zwRoxk1ptB6Dl3EHKZCsnJXZwjU4h9XXMoaoUrRZwXpZaVNSjY8wDe/2uAezNngcIvcdjxcg+lPdfE0lgZmDE3iT7dv88L1lVie546dppeRe03ejCz2ADKk50oJGU9yqlZUU5OHa3Mng+RJxNR5oIofZz0C3bCMey0MgVBigfXt2O5cWo2GgpGQeHkWBBq0wcoqie/5moo1DoEsfYMi9ybsCepHcyyIlE6P5dSPjeRYb0uPBntQe+sAviidDHfvDcVRHQVcee4Fzz10nH0X2gMB3bc51t1aiBUMkiVqV3UkvGJT24WhTnG+zHlZj5oH7rEPyc9oXQrLZTsXcAzbfK5ZaUpheSacIaeANg7beMh0bHgEC0HDx8mkKltFn7sKAfN9X100GAm661fx3HNorCu/SZlq9thostWfmtxFze1ncZFwmeh8d5tTj47TO/G14FomjYYyGwmZYd5ZE3DOGe7FGtbDfMUFSdwmdbOoKFCQQKXcV71CIjynAgxxgZkcuU7nAnbCzG3CzgwQBxGPbwOaqoN/C0gkEvfWMKcKDts9BaFWTO/48DKZvYvnUo6ddY8dybSMpttrFJ6EysH5GDtxBkkyjfZV2o86zoJ0Jw2c57yahMenXINf7+1x+f/fWUZYX1I2iIEm4Q6YcenszTq9j5cuWsXdUrP5TjDUJ4LlvR3VA7efG4KXqv0YGDNMM9aMQfE9q1CAdmD1Gpxi5XeNeKsMhdo9t7B4ktEoTXjDah+1+ANQ/GgrNlNLcvuUuPE76wzOopMIYWnmzmBTKY1vEt0oLjBSFq6QxwSPs3DJyyCJ09eB/yVyzdlppG3+Ri4fxEBXgIsUHGnoUOjYKmwMIwIO8YPh+w5q6CWXCdogj4mc7OyJfh9jmb7g7NR5uMxCMvTgd13a+l1/jPa0XSXzx1txL7jpURamtAttBw24zV48/ELxOvmwcRKGVLt/kdyy+Pgz/HJ2H6uiYtTDEFu5BA9aLQg5y3F/OJ2F1ba/KQsuQjq8A2gRV9DYLPQSR5cYwmvfzyFU5Wq5H7FkJ5kZsA9rQIYhFResecBP1g+j68PL+HXfiOgpewzRVYKUusMC7i+bSnfnWBPTp1XuTP5ATyqKOCojiB+vVkA8i+M5K+3vOjc8zbcoAU84+ouejl3PkTvNYJNA4m0CNLJd6QIvGQ1Pmxxho7m3iNVfWVKkTvN8msUIMkrknMtQ+FQYR953DEA5ZpPcNjekc9kGlHejU/4wuQadEQcIv9NHRAwYRQlXUyij+myUL7fiWsd7Hm4IQZGZ+8C19szYEu3EpbFZfG93FtwarkunzugCr3Wh/nPyTt0+24vWlyxhwOD7VSttISPde5j94n78UFZOvkPS8Ct6DBet0iGbYetcLzCXhBQ14GocBcaWNhPEmM3wqnqKnz2XB9u74uFxK5u2LzGkLJEa2H71Ax4uKOYtcZtIZHGZLpxOpNXXFOCWVt66fH29Tza0ZeDWxZh7ooo/HAvEC4NhMCuSZE8Oq+cvsZLwi8BHyxwUOM3vlshfmYNTKvYQMsOjQMt7cvw6uJUtjC5CcW7lEBVeToaZmyno/8YNhno4t2QGJ5l85pa1pTg28tzYP2MZgg9KwQutiEID8aQnePQ/8Tdh0IIihoA4H9oKEWFUmmh0pIGFRUpJIlEIZEooqVhlBmhoiKUQiiJhhFFaA8VLVmVlRGFQuU072PcJ/lo1clLvGzmVNzdFAhpUk7QFd2Dz5sc0DOSwLdVFvNDAKeKiKKfxn1eMWksftBXwnyppyyYksWHzYbxyVpDWNBRDZERuvif6j5QcvkC01ODWbBhPuzeXM6/1ihxicAK+HyFoL3hH65InQ+JhzM4d8oK2Jtvg1O22VHewp+oVXuUnLTGsxqZwCcLSyhoicfZvxuwKfoez9W9gv6Hj4KDohq9TLqGtcYv4X0cAs7vpA8eDmScIIfJ6g34Z7UmXM8p42MTjXDskBc9TJrGuWLykJj+jCbGFVNr6R5ynWTJxQlPwb57I0yf2cHeD6xJp2k9K5VIwoo7ijBg2QMvbKag7LxfeFJ/B6a6MinNNkbzaTPwxPBr3HzNGDLGZNFZn0yM25WEV8oWYeFnC86Mb8IZ/V/5eG0l8s1KzKsAaGmZzdv9xqF07Gtws8jiBQmW8F1akqdVyML1gnC+moxUsnYipBbOgu0u8VCkLc0uTpeANwEckn2Fu3fJgP8XS0pIc+aH80yhb9lPtFReTJWConhYMwxVT55C6R+FPOonsdLAMyqU+8rT42VAvvEMnzFYTm/dlXiJ0AAvfRpP2l/ycKHHJTiWN4fEb5jRnNBxIPlmENWtbGBb0wlSKUslz/5mmBfbjnfyZ+Cs3h3YrrAHN09RhGjB+/xKtBhfxN3EFOU/6D8tgZ+aX4OAFE/MfL+KdQy7IEFmOrQ2DqOdoAy/6kvFLKc8Drc05SdKHsAsw9VJt2DBvbcsPKwGJaGOKGxxl/eHHcd+rXWwrMAO7z7rBJ1DuRwh4IdFnW9xZaMmmNgmI0xaQN6WiyF94im6sPUIr09exb03isHScQms2zzI/0lOgviEfBAZ8AJdg2fQkaaLEb5/ydwhGuxcXEgu7iE5DF/jr/tVIUToBJhdG8a/ltG00N2OimIew50z5bhatRZe01U8AoYkWSMHdyM9SHBxNV4JmUZ/Hk8FX7ld1PcRaG2kMF5/0YL+C+1IN0gcdtu9oPOrVTjzoCt3ZZegT+Z6knsliP/5P0Gv97qkMvY4RuiNhBOfbWh77QnYvtOAj0x7RCaxs7DshzFmFq3E514P+fpMBWBLFUirB9olYYWZhjn8vKCN5vyRABeJH3TlTjKs+t0L3y58xyfyUtBwIpNnLu8BWrib7kudgbHVGWDzTgBWnXhGeFsASsOk0P2dIAjyG25MP4BaIce5KXQx1KvvYcwZxUIvtoDNe3tWdrwJ/0xVYHeBMM4qzyO5UbIwUeQFmzxbiYmHvCGyZhqvsO0hHVcltLliAirC93G69BCtbHdmxd/7WSf7LSmn78ZR+U28/HsbXHAxpakSIjDzdi+UiMqQ2khTxA471hw6Dsc/TgdP8/24wdAPl5XZwcmSCXAz1A7C20RBsVQJV0SUwDZDpk+uiGMeZMBLH3dqmvyU+r6ow89LdSDh6wgF1c/opcEctqvthBTLTzyl8Rmh+y/SkFzA5Rkz4IzoHbh+qZx1Nvhgz3cbLi7+g5MC0pmvLKNNS4u5VKuRP8XqQcec67BAbCrbT17DfgcCaWfXTD7oYAunts4g7cDfWP78I82tFoSi7q046eoJPnFvDV09+o41t+rhJt1OTnVciYHi3/kjz+VpLuMhS/YjXo3eBssya2nhqi48YDeL7PLbqS96IvsvvkFjIm7y+REasOyEF8tss6Hg5B/kUz8BtDbUkcCKKFRNXsXRylq8qbKArSzMoBwLcDBdj42qPoHb/H903XMEO1yOwY/aP9lTSJE7FJfT4Ght6M2TBbu7dXBz/3Ec7GW6HfCAK29c43C1C5R98TROOltG/5YogtG5Ye548QHSN3vRp+UvefvyTEyRbMB1T7bSZZxHb5slyHqJHkhVfea6Vxf5b7Ep/HY8iIUxCtjdfxN9v6TCnIPDvE7Wkg+dmwJ9Zv48erEASVqnwQS5SD5ToEIXlr2AN47mnPToInkNmpCJnwTov9hAwc9foPGtw+ijLwDGErpwYY8tFd6Thm/u96g5qJv8hQ3Apeg4ybp3w82kySDkfZXLdgmC82EjMI7ZwGklXRx2XhQP3BKDaMd5kPanErMWXYHDpctwwp0GenPHDPxN5/F+XWWqq1BA24qZ8CnZmNpf3uJZR0JofvgeGPjkyBOXL4Tw1wl8a3kebpGWwhZrY7h//zIVpq8j72uzsXzSEPXnjWNVFWsOKPgDxo2y0CV5ApV3jwGb53qU5+/N93cJg3zcJ0wWj4QwkyIMM3dA2387OPdrBvn+kAPxa77slOwLvncc6LKWPIt6K3OrVjb5n9RD7bGNXDw6kU8LKYNcz0+M9AUId3OBuOIMXNCtSmc3x7OMjig9bvoARV8/wO3aUVB3+Sa83kCw01yOju7Kg0XjnWAt7qGHxdMo+Iw1kZsAX87VgSSdX/Rf8FYWsXWCpoB4VsyPofqj8RCW9JHW+Y6HBUMxeMV8KnyqKadt9+7Deu1uHKpxofcNzvxKQgt+u++j1JIiVtC8xOcCzCFarA0/ZMzCy59z4JtzFfynvwGMG9wh8JQTzz7I8LTHh6xVBSHZRwgHldvROzYSTm31xcdbjVjmbTXP2lOFPnMdwaDmFD9uVAKXinf4PrSeJD31wV9kC4wQ6+MHciv4pvwr7j43FTdqV/F9cWPIHdbgs61NWGdxhYb+RKJc11Ky8i6nkRLx7G58kRQyv7LBT1EQzvwFT8Zm0fO/Eaz7bz1q1I+i5EOXWXb6EU4IG8cv1d7iyRI5kIhNgo/JUTRhZzcUXihjlVP9mKEkxV7LlzM6evFQ3RicPGMkDKrXwZj7lyknvBoOyf3E1YMS9DTqGeovzoXy8784x7mb8ooVIDhkJxvcLAQJFznu/OUEcz32IaqMoF/Rj0F2WwNpXHWA+ENTwTPODH3EPvPwMRMeZzwD3pA92187iCtFXoDr5GVwVWc5Nh6VAJWqBGjfpMiWgifg19smehWhivFDrrzC9xK//SCEogl9OFFtAlRQLA5flKRik0N491s8Di2zY5ymDJ47ZuLST/Vo9dwd42sMwdi3FkSk/rLQ+WQc9fQDjFPZgHNdFjGFPsbazSe4vbAPb8aZgHS2CW49/B1G35lD181ycPtAG+rNvYcml26iqVEwr7TbyAb/DEBE8j9ed+cqwctm2lPih4rXuvDZrZFwpTYS18htxpzP2/DeCHOQGI4iy+nxPFdwG98v+sx3U1wAekJ5bIsGrNLK4d/rV/HjKbKwMnUZnqhQRZVNX2gOy2B7XDA+fWRLHeXGOJgZx2JFMhBeog3e74upd14knOhogkG7Tt6cXIwrbGN56cUivhGfSTP3SLLlXH0oKvxJGtEaaJWqg34uh3j/v27c8eEwHzgyGs/9eszde3Oxf8sUuJ0xg88OWLD7w2ektXQymemnw8nKuagqOkQnxzqQ1/L5YDtbH+oFNnPDwgF+fuwZOcQ/hscpnyjQ+QZxtzr0C8nwk7oJvFFNFzrXfuGT4ea8s+QyVz3WR1KQoXQTFbgm30EHlQeooj8a3meKwa8roZji4Y+b9txg+wlybH/oH4ss6EQpyTs0JHCXvKRbYJyyMfyds5RcvCejlasmpH1OwVLHS7THpR3l59+iK9ef4DSLE3AzRAvGz/xCL+32Y7SZDabZ36eflgM0T0GXaJI35e2Nh+dr1uHL9yNBxtAXnkiPxwKrR3j/mwq9SPvAc3Js+VcmgNS7n3jvjhDlWc2GlzbtvCmpkEsq30NPxiO2fdJNAUnXIeuEMtueUaNkh2KMWSsH1Zra9HOGG6QJ20OVeyZVqgawa8t5GJHcClHhf3BjfxAtKFMFQRtdHFkRgxd35YHOx3ugrU30LNmb2lZ+JauyySgZ7Ant3yQhvusoN6V14/PKQdjauQPcPyjj71Pf0C6onCdc2kzz1V1oRbguaJ7SglnZylxhIkj3tz+CqV4/uLnZlXRlWtlxPVO4/iV42KMNd98F4JL6ENbU3sfTdQ+g9ckimqL+hi2KMzFDcBwc1o3GB0xwLMyaw+bJYUy4BruGhbJX7hzQ/v6NpkgshnUHM6h/53GI95KETXsPks+zDfxE5RLk0Vfy7z6IGBrGMX/r8W7WGHQsuIgVK03gKrrB6aRFPHAriKM2a5NTfDuk7h/mhiMmrPVTndwFN0Ke12j4eTsa2kuEYMn7daS/fgBXHxnLJRrBIDLwjsGyHj7ERoP+SGWwLj7Fzyo2gER1BfR/E0cxdxM2XXsfxmcF4N/g3Xhe2grUrkiBWvIRUJerh+vn3OBu7FoUFt4OPw4Mg9Wjbayi8osbTz/C3FgTWLJCGn5oyoJjajruu7ETfmyuoU99tmC5IRxi+97hb38vPH8cYaMC86qE3WwbcxQmJy1GZ4dIKJ6ykJVPLSIDhXjoM/tHs/00QEvvD6S/PYe/Wv+DowFaUDd1PUWdFuFBnT6cqDSPf8tMw+M5WmA15Si8F1GBTXNryUauCkcKytKUXWIkubCKbfWySX5rNig2TgLvlHHwTmcpHxGJ5HIFZxb/aER73/uxkosXBcwNhc4NOyA50RzeVXZQk1MH1+xiWnnfAi+oTmFN808ktSSRP5YegusLgsn0wzj4a78HJcIrudvEBVRUN/ITVX30rXJgmUv3MGpSIC+Ir+aZRYLQfcyE9L86wuLr6ai0aA70DFiCWJsfZUitQc0RS6BM05zGZauBgLAcfQrUofb2EDj47yqtirJCn2o1iqslDBMOgYMVjVARowe/IqXBvlQE/gSuAKtmC9zo3IYSbh+5aOYJiMtchh4C++G2qxCMzptP03fHo0pnAqaELaBMv8mwbeJ8Vtf/zjus3tGOVffQ+ZAp7FT+D03m6KD6mq3YXFlMG7VeUfWeVpxWak/xq414+eNYdnOfAEWGafzsXjtknx8FHru3gveuAiw+Y4AGVq9JTsIThlpP0pFQMYh5EsqGVmmwd6IhnhvejEJBnuDvocpL1t/htugM6gg+S/N2ScPhRXPBM16FftRXA14EOh7QCjXrI+D4xtXgHv+E7l2UIkfZaVDxvAYHnBJ4uZABxIofgbLPtylKfB5caJlK09aWYWNwD8s8HwcFlbk0P20Y3v43Bn/MrsAKUU/2VpwNZfKOlP1Uhg8tiOYx7oqwb5okxPJRqsr/wTLP7VnVR5FNi8bS9bPyLFb/lnddvIQapVqw66YEJtwo4itZbfSy4B6UjinmQyOMOW2iNxSO/w2F11dB4ApT+DtyAtfdO4ihl6IJFXtA3FQMriuehXmnmiB1VBPekM6EHRMnQuS+6TjX/QDZBF5FHHiCF2WA+/Rvob/NLwiP/Q6Lp36G99amcNnvH502qsG6rYlwZqiUtUZuhDer4rj3aRCF/qig/XNP4cF1E+DxpVn84a8LT7yUBb/u38I9Rz7wrCvruOzua/Id/k3mi6ZCVJoRHN3Yx6rZRPe/OXDCmi1k+Xk/fVAyZjudFejgmgOHW0vgE8tC+OtzoKBZRPpKivj28H2qLXCDUflT0K7vNiW/Xwqz91awYoseCCdMpRnBm6hINANO/2WM9J8CeW1LyOcIoHv+XNg9/TrOspaFvDF3+ZpFMwVubsLIfz/YJF8GWw4d5qkaMdBaZQMXjoXiVV9xCLq1AmxNj8OVzy9pziR5TuT56KpbSKbhC/G5RT7fn6mKm7YLw5YThbA5pwKOT9LD/x6H8IiwPSD7qQu399+G0/rPUTpyiEuqtGCF8iSuSN3DvVNS4UpIGT6iPC7ccZOwWRoy5H3B5YAVdwfLw8wLRzj5mgM53HPAO4kuvHGFIvdUCnHC+yss+v4AWSr34t6cMbBT+h26vrpFIeXh/C2uH39ldoP/gSburdhEV6WsODjtHl5/bQa3h97QPOVyeHu7FTxGqdDJOi2WOrAVY299JJ1Zb6hQ3Q/+/VSGcQo/ebtALW6pF4fvL2PR+9INUGu9zB/jZ2G7nylG+8ly4WczODK/FGhyPWZOXAldJ2Iw3v8UvV8uR3aD18BA3YPW7GvHvUq6kPaggbYpn6ObbS34OMeGOxMNOS3xOXRENOG49q9wQP83LUkB0AjrQqft3RRbdB1MtAC+HNwKFzaG4s7y85h6dzy8m5QDEYEC8DWwB2aYXiGZjHFc0i5HE5Z8xRt/XmG2fy3YmTaTt/U6ML+sBB9bNnG7SzKfOhVIjktFMWBHDx4JHsv7PIZpWHkzRGkmgGWfPpDNAOgtKofD2/3A00eXdudMoOZ2V7Z+uwCdNXs5Z2s9bVqgDvPkl/IfmUh2PauN+36c5KfTrkK1ziVSTTXjipxwqjtrDD7rtCFuy0V+uHMNHXiYQSMEf4FXQwxcnzMA6hvfUOLj/0Dxihzo6euBzMcIgskSlF4QAa8/9vAYj2XU1fAezTzOUaSTCkWu2oU75kjC2jQfmNNoyNNdalk8pIviSsrBLjiFqqfbQH5xG4WUneDABj2YN3I1Pg2roo2Va8HAwxMenlgC8uFmHFA2miy1tChZbAy8L5eDsw8Q9SMl4VUiQYrvBNqwUx0uir2DR1YZpOETSw6dkvB1vBBkq44mycBOkPy5nPZfaaHWRdH0sT2Ck+2rUGPsao4oUsFH65Xg5PoamDOwGT3iVsPg4EK6vjgdWszSSSxxJZzZLsdZM8MxSVsIHKqmYJXLAohX/gNfX9jR8vF3SHDsb2b996z33QkWFwvinRvjwWBrDXxQDKDWie95jNFfjF86jh68+UXW7RUspikCUx9GQ0ipHITbFsAVnycc0pbCrVl7SePVNu6cMRemLHsEa8pewL6Ja2DZBCOoSBpE9zffQFFCHV5phNGV0EDY8n4jX1/1Cx629XNAdhvMT5wGT3d5s3T4c7K0v8tqM07C9uWLIeMMgmjcQTr77w82zvkNH1NFYdz2fNI+JUIZGy7Dzq8pEF/rDuN/B1LW1dNYLK/Lzk2voG1QFmJaF4C0fguW3/eEPQtekWzqLv5y8ggPqP0Hy2AvZO5rpt6FBF/mTYDLaccoUfgoFNhrQJfYSeooKaXcJakgV+YMJ/4uhcOtqlBwo4CORc+j9ooilB98AspdWbBafRX/2P0Oyix38ouXamzgPw0KRwqRs1QfC0yfzf3BUiScKwTfw2eg2f7/YKSYPVUN/ULjHXKwaN1yWDQ5mG5vtwfzhXEkGvCAjES04d3NcgjtuojHTsXBNgVVCCp5QtG3v/ISeknXTB1JqqIBRJrUsLImFDQVtpCAVCWnLtGFD/MHcbVCDqb3r8Us82kcKJ7LYZXKPG3xOVjhs4dTTDtxz/lJcGShF1yz7QK5H8qYcX0TnA/yBGfzDLArbme9PY6sHZONUkFm8P38ZFpjU4f3ij7BWxMH2i6AuGSRPg9vWchyzb0kvSKAcjcLgWCVGtgr76eDUTbktvUDJC2vIcN9I8DXbTlKHL9Law6n0S8WAvvJC7HPKwcPvXtPKqdfwZVzFnzJppFC8t3Y+HwSbZ9zlNovCENreR+JVUjAhOBaeDhJnF6v/A2bSyJhZEAz1x9XxrVvl6NqvQp8FrtGI2ra2ET2LrZuFiGPhFm4zuk89s7fS+eUmYTT/8MLFUbwauA5t1bUwdzXkWyb9xsadJppwFcGVEcK8JfuNvKLdqJjS2bCGelWUDM7w1Mf7sI+vXP8KnYG5H5aArYLO0DNcRj6Ks6il7sqUK4QJ6ge5Oq7GeS/fhy8EzZhAXMfwIo/OGbDNlrd5o6VpRPhhrUe+e9UQWH/aLzk+w4Hq0fi46FMnB+WSjJrt4LkKEfSXKwEru6mcLA8k4o5g2d/9OTdP++g8JMuuFXsCVbKhbRvYgKcP2gKoYeOkBGtAet9T/mfUyayZxSn1UzldIPFfCP7HcUa9sPv+dJwWucjJ+vrwAz3rzRmtSi7vtdmoz1j6PGlfPYxKUDVgWSSM5ADx3fv8FiMHtp7BJHHXyWa8fkNith3UbzAITqvOYtE4qdCeIoA1GxIo8Q5khxzwJfsynexS888CMocgWHTK0H9mTcOuTjgmmgzMHxwi1QVQ/GbwRuWnOwIRh2b+NDlhyjjvAmsbnxC1fhRmOQ8BVo+jWSfxSrkoNmJp6/9xZzUFzjZSIP7bRvpU8EhXre8GyNtBUA8o4kHG91w5etz3Lx9C//5sxErk9IxL+Mw5dv3MZ4Mpz3/BCBI/hsLrt2EoeZSvNBHiXqNz4FRzQ1MvROJkzs2ocaAMQfONgeh6MO8bPx6CitsoEm74khgxDc8vuw6Hn2wF4qOHAFnkoH3E2dD07jveLu3ijxmatCW8EtY0h4G5Z+n8NF3LXi2/QvM1hTnMw4jYMbxFxgxajNOVJuOlQoGmGaXC5nFDvR44wDjlDS6lRTL03JngXhWPKQ5BvLEF+YoPgH449fXYL3tN+75z4uWydqB0tjRvOyROBg+H0di1nZ0KVCGM15bs9VjFUw6EU1FurIQ+2077nWVZ3WeCSU3Vdnq6zy0On2ZfYv3oW7jQtp4egYUl/rRu/6xUDx1CsbOlYfgHn90d9nCvq5ytHOWK317t4TviDlhXutmcJE8huf+2OP6RZqwXN0QO41D4NMmdZK8pgHz+pRwtPsdPuhrh1VbjFlcuYFmewK0u9uT289r1P7vD5tfG0Gqq4NwdmkdPOx+BThpN+0tuEr6KoaQ3WHMVzozEXeK0u62vbTYJh5MK3ZSicxlFut4Qh+jtrLA+ZFgO30zVmxyIY2lAVQVEgSd+WPoY9gL6Es7C0njPXjZaHXMNteEnn4VeDXzMDXGl8AVTyeSEzPF4ihTsrrVDFty11HM9NXknSEInxMj8JT+WF6rVYd6wk/RSdCLwo5q4V7XCP7laEnPXFVoZp8uRC70BGXPMs5UOwfvLEeR38JX/GjnX1aNF6OSTAu41/iUgiZJwfx9Smz52I9iBK5Tndd/JL7FmrfgfhpYFMI2oaHQ7bgA5wYLwHeV2aS68T2ZGFvQjewQ0Jrhx2HB2Tgu3Zv/TYmmEXve49IkM/AOcwLlxZKsLNAM3dYhOK3nAVjbzMZ0v0wISl5Gs0U+c6i4EdgI/ICEHxcgaPozbt4+Gt3Fe/CyzllSLPxLCoM1GLBtJAa9UofP5e9J9991XJHcx6cfKXPOm5u4drY+7JkygEuEhrCs7gDsmqkHCoq5CCGVXLCwB4YCAEWaBjikK563xJvw2O91cCoxg4dSNODGJ23OaYhi9aVryND1D3+Je0A6bpZY3fKMmyfsplDdZyxwRgxEzhbBpIdtOLBmLL1ZfYScTwvSqYv2vNTFg4MWt2LZumrKR3OQHjsWWvWHWORYOl758AqTdgSTq3Ic/ax7Az8DbJH26dDaIjE4PyMJT6bWsf+R5fDQ3AwW5gA90jfkLSqaXPwuANPOZqHNg9HgqbgH6tWqONb/NCodvIMZdX/x195HpOsUTFP2+6F58HV+mq0F6/zX0oaMNCgzfAtXqwzI50Ej1CdGY57FZ1jkdhDPisWT9bnxoG7uRBstbsHooWLQ/S0MsVa36dYdJ257N4zh0c85cEMwCeeOgb0pb0DmywO6qVxIW5R+wZSXy7B1XQQGz3hDi6MeklZhP6R/Rljd3MPGe37xn9HHUDpvHRR3O3JF1XpwqprOBlka4HfJBI9umAWOmy6Q4sWPsPTRR9hgXYf1pgG0Ik4H5xgcoPx2bzbf7sFHXaTgv6EKGhc0GSceMKSl+85RJx3jmJN/0fbBJkzZrIB+LXdgQepEmN55AcYHmeLcvJe4NHE83N5uysErlFmt9Dkv3CIKvc2RpGBJEJTwECYr38X1tReo7sRCynS4znknV/HKGQqw8OFqaugdDQpnjSHxsB7O7bjLC8uO4qdlHXS8tBiVew/AXm8ZWhGlBH885tH6N6bQNdKbSzdJ8pvbJ4jfreebjTKgva6VPGKm0A/TefD5YB/eyjADy9yRlGh3BfZ4S9K/8Cl4ZHkoqi58DU/rB1BA0wAsYuNwzHwpqMYmbDZTwNeK4mBzhPGevDtZjP5DwmcWYLvaDTT2roCSzVNBsMsQx42V5+atxqSoL8pmjjf4xoAbd//4zMkjLKDtiwpM360HayTuY9JaDSw0Rn5sX8X21dnQ/FmIIpMGuDJiiPKWu3LqJ11QqZ2C60/W8nb173Rm1n606DSCvsutZJfaQGuShqhjRQ+/TxGFwPHeXG1hgvJnfMlZ1xiSyy7BK8Vi+NzkBcceOdKqu+Mo/7+RcFbCEpb6+KD/F3O2GCeFtQ0zSSu9AHcNetLxiTGU/GAS6TdrQ3nibr6wzYBfyDE8DflHm/QcqDc2A89IS6BRTDG0r4ymBHEhuJ0ezJ37F/O2mJv896cpGg5W4/fNnjynMwKaDkng6rJwMlAcAYkv22CRji4pP1gH7lZeFCC6A17PekaGgvrw1MGeX2ZKwYH/DMBALQrjEvShdkE6NTXMwZVFfnzjbClGWPdRVb8AbahzxQvzjCCtQwZcPY9A1vGzdLPhMN70uwprWmRgROQ2qLKShn+BFahnPwUCpWugoLoAsk65socngfHWvRy0wgb1Lm6kgIfZrCtTzM90hMBmXiin77WjmQu1IaR9D6qnl+KN4UhIGheLUZ5yAHvsQV9QDV6PkkY5i3LMalrAxROe0MxHupBTuYBfFjbArNv+fG/jV9BUEIDu5NkwPc8TxnT8x2PORvDnU/Ng8oZmuv1vBi5/Yc9Ndifx6LQJEO0tDhMnZFPC7ABa9fEiadh04tTrVbThMmFY/X2Q+XKIk93HQ7CDHCu+NIZ/m+bhi5793BZThyHfXDk/tRsufY4lxfRs3jpLBbKmK8HMGRNhd+cBViy4RNt6RlBRjyZb3SvgvVeMsWujHy6IBnhxcpBw1QU6muLNbhkKEJacyY6ag6DrfBMXFYbgRqsZZLZrHFybmY5BDiP5nbIkbVWawXOvJXPiIeb2nAS8MTCVpf0aoFNLBnxejobjt6SpSW0OtwZE0NRZwrDaSRGt3nhDUs1t3PrpIry9PBYcJFvByegYTfzYTi+3PsEF0ak4xzQEpCT3w5HyFipT9ySfEBNQ8RRmv7ZxoL4oD4ueJXL80G/I1rtINmbn8Oqz7bxLRgcUxTQhzz6e/r4aTbfro+jp5eMgE1WKvxeb0LZvVixooEKCbsM89sxMuOUsyFanmnBoqgMXZgpx2PGlFN56iD02TAWHKfIcpjIWglwYWtR8OFg/id/Pz4emHG2w5nDuqo/FmUrNaFS+C/RGxkOj6ijwTCtkpdZWKk61oHn/WaFxiwMdlAkgxY+yqB9tSNflZ1NXhTxsam9iJ1sxXikJ8HafBYy3sMO6YANsThAl1fT3cHheDNmsmA31QwO04Vc3uNdW4RpfS/pg54LXXtTD81JvEIMqfLqpmDUzCYbV1GBJyy5YfTIAH549T9qfDtP+6m6+sXsl1Y/5DatYCiaH60LuzSRqPpMM+4ZtqSP1H0wXnwIqs53IcstCyHRzR4fJmyHecQR8q/WGbuU6Omg4hGNUFeBd6XN4Pd2UK5evIpna67xppCtsOyABXyAVTTvG0GCdLqcX5ePhJQX0ocYBwg+OZLFb/rStsA98PKfDgewezF9uTpZt+7DBRZzeje6lCUc+sOVbJqeN40mkQhiPisvBy8N/MLFXGiUF5lDCvw107p0sxlk08bvxxFfmXuWZSfb0n7wm6Gufwj16i+BkwgeQP7kD7/idg4dW0ugTbU5rus7yhPkDmJ8iBZed60nGdjVbvkjh5Npz2Km3FAZ17pJyjRkP1O0Au62noNBgJmjp58O1FDWWTF4He7RlaPaGCdR5TJ3c6vsxcn8NjPGpxpLRUjBOX4TKNhfDl5f3YHvibPb/EQdSwWI45WAOOorbQOu5LIwQkAVjF3XOdRkFH1oewFBeD6XIeKPz79t8N64ZBRQ20JMd9yHwnirErPeh7NR/fPbzGugOyuTZrups6wmoh5bcNSzD8PMvLhuBYFk6lez3jQAzs3O8LFeb2ifocOhER65wHAecvIKmbVgLXvkj4UPUe6xYxUAuEVgaZ8OBTz25+PhufH/QFm4K+/LU1BnsEDUWNE63oVrxNryTr4NX8vZxlfxp3jb2FtU+daF96Yp4cJUb1obJwMxnzrRD+h4MRvjigSMV8GqSAz7YsZCkXyuhxrTVBCdH87lEBRg++gC63oTB4yXxKP3yPWoHauHI4mCaIKfIOtP68e/ym1g5dhqsnzAKltREUuTzvxBbUE1P18mgq8wbajNu4fO9KhgyqpL0WpXAv1wA+nfG4Lyek3xZoYgMKreQ6dT3YBs6CZ1DhUnhzAnwtZKGrn9R9OdzNBx+VAq+R2ZxRshSxEQp9teUoZSL6aD2WYSqrBRB2Hov3BcOpIz7dlB6thq6Hg7zXZO99Fv9NOeW7MSfkQ10WHwWlI0ox6gxpfyp7R09rA7g/SLOrK6QxMG+QaSzNYn7R1XCjdWyIDb4jaOzLoDp54Xcq1INb2VPk/PWQSgqOkOXUuXh1ihLPtFmBq3HLmG0pii97u2CtAly1HN6M5VsNQZ5zbHw4FgH/8Ct3Cg6GqCviyxb4/mWsyWK37bnA3uFaITnFrhi+RD6VFtwd2MOjlbQBgdVMxoOMISgGX1wf9JTmHJYmjr8LWGn1QN456SP417W8gi98SCrkojmh/uofPRc+Gx6m/e/T4CLu9Lh0eOLJJd/DO7YAfue0YQHShq8lXdwVt44enC6De6OcsWE502U0dnGLn//cXlECeSNF4K9Yb54qeE+Lz9dh9u3mROnj+QLce2sqnwTKqNOUfWvGgqbqgy1Q2tp/7JLUJKZgBfGvIVTY4z468ticDDcg8XG+jT4aTEOrdYF9YBDmPfyJ21uSIELuzewfbsU9q0O4oXtvUwn3MjF5TwuE5SHHxJH4U2ZFmRPacV5xQqcMfoPj1RMgyLpu2T2O5NN3X7SjoCpIGp4G+78m81u+uVsHbybZDpraM2t/fT3hyKP+F2J+OwYHDmsAmPNH8DGJVYgpCzPY4d70WH4DQSp3qUBQSMW1hpNLxqc0PsSgmT2HLT1Aqq/W4LxTg2wKuY9tDQF8h3nEnQ+eY9JVhIaPxpA8gYZPv6mBhbOq0V3SQ08HK5EqoaetPBVCzzpU4QJUzowK9YQxvi3YfJTByrIjwCVd/VwY7UnVHbHk/u03eAg4ot3pWRo23hxyOg4CpNi7lB9tj1NF9LAk9MGeJZADggrVvKdsw7sfsSUlympQ6WLEcWUbMaj1+NZyX0+P9uUQ5MniXCAcymiyg/q2ldHfmbjwfW0NzsulaRdjfP5QhKxgu8EknHOI3W/HH7h5IWga8vZseNgwfMneKnvKMim5sJCsf94beEcspklT1qvZGhOTBqe36gO56bOhI/KrhwXPJlK/j3k5R6XSOKlGOxaZIRJdzvw4akHNOwygXd3ykDha1GGDAFyfxgMb29spu1/h+li3zu0sPwCo3TE6fTr7SQcYgideQcg2HAIhU+U4O48Kz4hXsAKZs2UVz6dFQouU2tTAt4emgIK2xah1Isx3KdoAlOqrgGnCYJQ+DLe1yAIRoYOUCjhTjd9xeBjwQY8vXMxbpzXjSlCmeDf5sTLRDPwUmgo5ZgHcNuWHZg7XhCkl57gEaYOEHPnMlgvagL734NU6TOFMiRD4U9QIQqWfsWnZ02haLI3b5FdAKeLRbkx6jepJX7BKD7OLxys4a6UMQ+WXwETWxn4UBGNIisrqWDvbzQuiMWVrndZYrCflnzYArdECzH/uTS9ujoabDWz+d/6AZiyzR9WK+fDc6cy3jJjKsge8yTR1cgvhnbw2MlKsDEoG0tvRWFv/A36CXPhXOdxutOch81tJ6nCuh9DxFeCooAsrLGoRNeBj2g5qY3XzzMk+u1PXnaJtGRnCh02+ExpAg0w9shsMIgJ4OkrdNHp8Wf6uukftjV7IUlXwP518jy3QpxmjGvkNTnToHnOCH53zpBbjh/BJ86VlHDYi/pX36Z7c/+y95yJ4LI4hq+WzAK38BH4Nv40dJjYYM+1q1xbvxPBYgiNJWaicUw51fsdpZQ4Y+j/a8Bm6cepoUwABj30sfbIQSh+XwOVm0+g94w4GEfHKDZGEEZ5PKaaUBnQu6BGpsV7qWRvFSyb+ZP0JCUgPNCPVn5eRc8qR8HJ+g+Q/egZhI3ZjFcXrIGA4vPg9j4HLvvq0dvwC7xcOIoP79OB1Mg33JkkDXnz/ODvtgM8RlSbrusux9+bfpOYoCZKK42HJ51qINIdhZfOyqPGfRNM7d9LuY1LeL7aSMiZN58WmK/j20eMUNlSFC7G7QL1gCFa0NGG0rWnma//ZOv1xfD9yQOa9CaHvtTVAMSOgD+izlwY24MX5XfCyJHa6PA9BBaf+YMvDcRg1X0T2LFoGWW8HwNvZs/D3V2p8E0mnwUsLKguZTncuvqb9OVSMXmlM/qYtdKoFikYt6qPJh/3onT7+9QUfprkVS7j1Skz8Z5gMfSrfUeL0hXwafIoiBpTyKqyN6hSTB9fbNoKOGcH929JoGQFOXozageUi7Tg2beCcKhsDCa/vYSmXybhrvowzJukwLr2azDWTRjy2k/hV6U3+KtQBHaGDeK1hN90PUkGMlVywH7qHA7o+UK1QY4k35xNnjNbsauTQU07guy6xlF75EF22ZoD+aJmsOjWRhZccp/CkhLR2Pg1StsYQteT+9Qc+QHurnqB0Q/cQb++BeueCGGh6BoUTzSjZ7lLGb9PA19DMWr3WId1O4rJQtOPm0bKwscr32lx1jq4VhLEigM3WWGDIpyVqsJNnSp071o28/Z0GvGoBuZVSdNZ70f48twevOKdwG61uuC1sAA3qy+BA23fMb7eFJzerKFPlm44UDify0rFuNH7A1nmaMAXaUko0rmLRi7XqffWS97Rbo1004KbYDN+9HmNkx/38NRAKbC0GKR9CV60+sMOkI2QBK3n0/FdzAPQGeiHbjNTCu99zgq/JOHBo19snVsGycKXeMWAOB7MkwMXlGWtZj0Qi7nIX+PzaHHrTFjzOpkOnmzBvg0NlGAwg6dljoLIShv4GiGCO+3e8/cndiyjNh6kMuehruk8EHlyAhZ1mEJovAYobkgAmYBjNP1mKizxiqfC4wQ7GzdwwM3V8EUuG1JGxJCaXSsmVTlS2mMbMPeehOLoQFtqx0CLRBHHthaz1ddX4CL0A+vDF1D41mVYseIVajz+TXcCVFkzehpkiQbifqsGvlmLmC35AevddMFwawuFWhugEHtjcYc0pCwQBamdC8jF+xWmizzBguPi9Pu2E7yZkInVf8N42oNb/EjnA5yOM4Kd2ukQkPWIg3RbYM7KEl7T8RO17hzB0JZUDMh3xokKUSyQOwkUnaRpvM93LNmVBpdTdNHi/UlaXPKTHquo87hkFeiTk6bb5XoQ+vQADkgtgZQNFVT4+RbtCZkDBjet0H3qR9rfdYC3Tkyhnp/S8HK/MTasCGGd3c9Q3EwI96tdIvFtkVR3JwZcRqvDwJYs9rUZDW0H76PInKU8rv87znkUTK1LB+HF2rVoNesCi3SYwu1LGagwUx0Kw4XIcVo9DuXsxcE3Nfg3y4aW7i5m+U/78PyOkfDM5jl6b5YH62FXdBDsgfWmf0Bg2kVc9V2JJSb5E+ocALt53uiu9YBtJWZATu4ZMvoiDuIRM3DZcWTtitXgPthE/tUn4RXs5qBfOwALJ8GwxW16GeeHibpL+KZSGmp8uE+5F6yhUfM8VfEG/lu9F1cpa8G++SpsZvkfLu8cxq3jBMD+Wyod0vXG3sDV9EV9kMOCd7DCmtEQ+2aQPwmu48iECp5v1UzLVzzG6U71NHV4Os2e5g61krokwOawcstufJTuhh5dUlw04gs6femFw3uV4coVJdBTFMB/F7TJodUUVtS7gKOtF6SrmXG8hww33tAin7gkclz2GOPLb8DKmo84e8J0mJrUwtsGm3g+O/NOj0pOOyfBJVlyuKkwl0D0D284dZADdEQhx+wRr1p3nKP3P8b14pF8KnUIhV8MkpLEE/KY7gZNlxbTWpMR4PflBEyt9UCtC8SHVMaAslMQXZFVJjdtH5yR/IPL9t8j1WpzYK1Gyoy/jyKDS2hMeCmJYDNdFJfnrWG7+NCFAAikhzh5jza0uHdz0tIGNv+piH9sz2F+RA0aOo/Bb4rP0ST/ALbmiaBLtAgUPBbHO8rvMOn1C35u2c7GWVP5bWIVls+vJf952fR4jSsfnTsZfp9bRuP3q1P2BQ24Jm4Bc8KlqVSgGA67h4OG837aeaKD92gTJFikc4fDeFYy0CPL8dIwZjAUN+vO4GjX9fDnvAh0HvwJ+wQMoW78fXgrc4N66xFk/QRo4hoX9h38S9/KNLlssRk1X7IlnRbz/5v/ezBrFUuUVoJ7SS+31K2mZd8uYN3dALiXaAMnlY9RpWsj3X5oDusf7Md/Isd41qarqCv3iASNtmLnmwF+3jMId3cdQh+1IA6aOxY6WRUPXHUAza/zyeyXEJn1T+fF2Z/hmJUc++Ybk5yJESSsJujNqqQslQe8/1UZ5ihvhrfJaZyRMRPc9EoxLmIHvVmuxw/rjeH18dWcZdRHt0aso8sXnkDc8wjud48mGeujuL9Zle5oX6K1T2Rgz2ILlHtrBL0cCpn7b+PXeG98EyrHZy2sMf7VZx5/yASqDCeD1NxvEOjrATGdd/lo4Twu+72fBzduBL04Ywh5kgQF7ZJc7jcaSvPz2C3vKC2QqCRt+yA4GafLOqpZOK0hEtbGCtDyV84gFDgVzg8/4mW0A8xc4+hrlBk5+l5C+xNH+HxYNb3HatB9cwvmb5SFtptKHHV+F8xvqMYolbW440AMK+p/pZ0OiuhV44odCS7g36sCvjtfQG7vTH68Q5amuphibosenL1SSgqLJqNj9SzISw2gfj1RKPw7h66fKcBTX37x570Pqc9JitW/N9GJuQXQa1vO3gcjOEhaAZ7+/sOZGT68iwfpW/YDHn32NWZbXMOpwjfo2qiTILC5AKZvnwQSg40ke2gIls6ro/YNBAcfzSRb0b0wSsED3wrZkj7Wca2QIZiq3qCY5W/Y0C2ExzmnYmToAn49bYD2ibSgjNJq+ugjC9sTVSEzazQ2hhfAlVdW4FwkAaOTjMCz9y8JnCsE+dALcPbMaPxVZg6PWr5iyVFp3DsliTVlEOcWVoCO6CnUvHif9PISQeeNKawVEwHVb+WU56XLqqpfsGG5Aj2olQPvPlX4Pl2MasUj8N7fLlpUIQJWpq6Un9jCDl7zKU42kJuOiHFJ+C3+cWUCTd64nJ11l7BbvBZU+nnSqjMudCKhji1+qVDthwb690eRGl4uwNFGE+m/fmfS8NSHU49mMFjFk2P/Vkq++QZ7on1h6UVnmqGng30H8kDsTxUdFhcCoy1WKH8hhKqPXeNfE/WwR3Qxnqk7QWZJsqD54hH9kLoC+StMIXyXGPfe0cA1Hmdppks1LNtmBhGlZ6B/y0p2PyWExZtGYOIEQ7AZI4Q7Ui25qm08nc0Mh7SPY9ktMZ27J/2mF1FbaM/V3bSu3AB0FvTBizAPthzWw83acbjo7W7e3lnMsgop/E0+nobbMjFRWg6M4mphg5couXavQI/NJ5FeuPO2Y0s4oqaH9D5nwLEGZfTYSRDWfppsrxzBaO03OGd/Idmb3oDsxAIUTl7IPMED/v28DsNh5qCZ2kGmIw/SvfzDnCEUD78ykvC4GQEnJPDQ5ju8IS0HYzNk4L/mGXDy3mQMODiWTF9l0eNyGSr9I4drzoSC0/e1HHH1E3zbKQ2Dv71w48WPcLkjjxysz0P/imU4L2AxKo5ahCEJUfz4XCz9KpwO40apoYFFFgbe66HXrZoQF3+TJfSl+W7jGTaenYifogtI6YIQjEpcgCPle3DLjNsg7zgBoipaaHWZJI23EgaJYhHmI4sh6aso/HqbjmvVU3Df1NW8bkoJzV5Zwc13bsPV+0acOq2Zq3ZOg8m/zCBky3J8tP8ypil684Ux8px4YzLZ5p7m+Q49YHLBFA98zqb5xdNhVKgE+z+tgWs+X7FsrC+Z+wlwijTy4PgMSKhWwvBOc16JojAUtJp8/dbSrqkL4EZvOib1bGKvXWa0UDQDPmyRZ6Gz4/Go6Xhw+g+h73Qiepx6i7PMrWhL5jCsC6zBTd1nOXO4lfQEtaC0SxKsH9qgS4wdGTWpQqCPEDhnDiK9/YyX9dtgcVsq/Qvz493fxeDJ0u/of+M4rT3NtK+qlHqMauF9hSvqvTXhnIvm9OnqWpzxhGGBx1qYl93N++bdoKUl7iBU/RwXrkviEqNH+NZ+HG+z7cJ1+wj8chfDqM7PGLpMn4/FHKC/go9py0NjqosLoLV7r1JX/AzSKQDYu2MD90/4CKpLXuDzXn+ojPTjmClWVLC9DoOqXXiSx0muENCHA7VzKDc7iW5YjOUE5ZN4d9V9jJl0ml2npVNgfyXq2rqAc4cm7Nh/gZ/2hHKU31FyDurm3I6nMDvFgW61n6bfesaw+vJGdk8ygqvX52Pc8TJ8Na4Dbnuegqjnz0nUKJifj3WkEd0yHBssDsW/J0NgwBosD+0ltzubYPyZy9gs3AJuo0ewreoWCGnMwmpdOziRPBFK801A6o0eps08DEUqbpza0QpSYyZBhqwRHSnJxrUpZ1B8vCZcdPNiW+vteGTWH748Nowb8rO4JMkPQhyIky7KgbXXOhIcJQDnmtKgoO8ifrU4DlGzE9nUux9+fFQmp9lx7G8SQ/dHvAbtiyNBsvU47hUfpIL7s0lBpoHG15zmjrQrHDhNGNreBYK9qh9452tAygsT/tc6QFu6orBbQ4v3XH5Aa1ePALXhEZy6wpNzN5mxpbMmzCz6ALpFxzlgazqsaO8npfpejqtZBiPdLpL1cW+aVHqWh04zFF6fipH7RehdRDsI1J3lY4F/efR6eSqsreSSwqMYEabO65+bgPLhTryYYY2fgnxpXagLCX/ZjLu7xkDjP2tublyDa5YO8scUXajakcL+xStph4IBeBmksPzhW1DeGg0iJgS3+v+DhBPZfEFSDqotSnHtl5G8yGUF2gvp0eoFjayy6CLOWNeMs3MNUKiwE6UFDCG3TwWGYt3hteV6WGFvxVn3Z5JERQGczn3LgqYi7LrSCR1tdABrNtNLlZV0UncSj0o/C7Wj7WkN/YbjPg1cMv0OXdPYgkubhOGxCMDad18xozcF1igXQeAoX4iftgc8ooawY1s/ulV8xBAlTagIqKW5HxRYObyZzWz+oPTSETyUPETHC4CaM16TpKgzKstIwLMAW+i01oKte8qh/etD5KNy/H7USkrd1MSbHgrTgtL/WKFBBbz1okngsA197xPlSp0leOaXMb9aMBXu3dAgg+EEODbXHe7iCDCbsRKt60XIzruHH9ZbYndmJHbfNORtZ6zBTfMb7z6zgkrXToRnvv/BXpEz3B+zjXabPwCFz4QvFg3Do6IH0KdtDkF/l8KhKBXweT4depadxe8n2lh2+0SIKkuDSTM3wfi41SRbUoLX5Vrhg7AYDJ64Ba4/D0CNaSPOWrcDzvc9pGFhfTi2yR2Uvq2iC9PuwDo5ZVDU9+T1P/bwn18DSBVe/ERZBSeMHMEzfctxxaIDvNNekszER8GziP34ZMpcvN3lBBGBWSSwUI59QybSsXUxcGtaIF3yaESN5yKgODyL317u5PXQiIt6KtC50gdy5+6lkYcn0inHIXr5IR48y0fB1ay9/OyHAy7VGInbXt7hq3cqQOjAZy73zmXv9Guw8NVp2pavCAVBL2B+zU5eoBQAk9e308kT++hvTSqN8Z3OK58rw93aA7SkSxOuPQjD61/XUHL5fH6sUkULSi0h5Mlojhufxq3Ci3jr9gmc6jQWKkxPwJ6yCODnNWx/M45ND4yC4HGj4Yy0Bt6NqCELpZz/EQAfgEAgUABA/zCyE8pK9hYZ0YVUioaGBkpLJKIUKYmSUlIpIpWiKCVJQhFFRjRQhFCaFCmjVFr3MOKiILzfEs4eS+r5jVQaKsy1gNOL4tjyjDJ3tcQzm+mCRGIBD2uagNSOdBAUvogL7PIwxHUQtlefIMfe3RiaUQI+r0aTYvQmTGmdDJ5l0djmtgtkFF/SkY06LBSwBIyvi0HdlyXodzSUWrKO4AhRAP++HuwQ90LeewffvXwByce8OcqOyaezn2ac0YV7IZFYEKAIX1Yto/haF4jOPka/qg/T3xAZOLKwjzc1jqEdklZ4+/lDLqswATHJezhn1HtMOPOMdx75gjGLVkO67W5wHHMeDVs6yX7jSNxSZwFezwN5+tMHZLJxBhrI/sMGg3Mw/KAcxqb2ksfn53hzsg/LxtrAbZ95+Hm+KEUIKMC6c4vYO2ctf7E4xLZ7jTH3wxw6LKPEaV9tYJ/WF07sPgTlZxZC77NV3KukijP9FsLBTCTh5ZvJztsDHn8Xg35xf1z58zkv9XCANHUbSPlwiBXvdIDMgVHQaL8YvtXEovRrgrzjb2D4qR+WW7wEvzuXOUttBGWHzuI/oh3cPJBGV1yn4LcmeaDxxZioFgfC+APGagzwhZHvIOZND/3u18PFYa9Y2dSBBB4bQV23AlWU3ocq0T2QcU+Tdnyxpm2vCvHo4hY45WKF+hr1kGcxFtIyL3Jd30ra2zsH/VbE437bEt5sdZQFjrWDVW4N5g/vxJUh/8ERl0DY/qicnHAhaf5pop6CuVR6bZB/rNpM3zeuo3FWX8HMigFOPWLZCY/R1zGT1lA969xfQNkej0Gn7h3MaXGAL8ottGODOOxUvcd/P7RQkshcul2QTBZXQlDX6D2/UblGM8RmoNnwaXzx1xJu5AvR0tdLybmjnk003eHEKTFQr/SlLI35ILzxBL1R9aCidA1oE60FqY+29IFfs4HQVj6pKEezjumz1gZT9Ilfja9fxuEvI2kwjT1LF4d04E3BOnQc6ANYZsBKD3Iw8TrQ9u7P7FCaSvk/dUCm7yFHPDnJ20V9aONBAfC4nQPHXqlwp80S1PtuRP+tzKaRr/VAp/8PCs1sBz7yHTamO3Cc6DYoi2jg0ap1dMjBAyQDFrH7vhEQG9TLUuflsappH17Y5MQtqrpoZhaG3vuCAXf+hciWNXxPzQhCVZXgZOoJMPR/A63n/uDVFYHUN9QNDmMD8VBYLWb7nOWoIn2Y4OZIl/8FwAP11zD0NpALd+ez0jRT3jCeWC9Nl0WbtuOGrWMgPfA5jjg8Cp3FF1PMvTjw1TwHvlEKtMrmPZfMnIF2G6IxUAGhpGsj9cFXdElANh9lA0LlkZhc7ca51nr8KOoIWbV9QdlqJZB/Hg7PbohDQOwsPp2M9JmmYfemqdC8pIvvO96CaYPWeM5bBTava6Se9CQSCBZncbt3NHzwPgYdtqcUs0JQ3tILyn9OwXYlC5i7vIhNt2yH0k5THJ4whjcdEIam9Dxc5S7MM7/MpNKSpRj4RQZmxOTw8sVaPFD7h1KXfoCyv9tZfm49XqgwpsjBxdAgnMo/LglD74FpKDbdh/8OOOCRU0fJZkUxV4iokM7pULgz6xeKqv2lvU0AF2YcgPVKS2lstSc8TlRBsVhn9IC3ZJ+aBUbH77C443q6O94EChqD4Um/BP0abKCdGgug8kYOdZUv5fIYXWwZfxokCjXR5ocetMTn8UzrXFyXVYqTH4VDTfpJmj/zJKWduIBnBovBe/VuNp1nDJN8fsD+HQ9JY7CbNDNv8daT00DqyVQW2PgcjEv9OcnmFo/foAl6CtYkIG2EdOMUTHoTBLpCgni4U5x+RBpj6fY89PFN5KxLI2HkhD+4o0yLC69p0+3yn3iWSilB7iSHVdqS05hEVFewhYBzprA+/QRMNBzCr4da+JTBVbz77xPtTFqOiUILQfzmKciU0oArncawcMdpGNjQRXPiHnD7sZGwMD0bnAYn8JiQ/+hNXRlfflVHs3pM4HfdGl640Zp0yhHUMxTgqF47JBWdwed6oXT1bgFcWKhKk4xNYWuYKznPPM8pWWb467AG33W/RhdretEvqYizF9byJ5Uq+vIOYeLaRhRYv53f+L2G09HqnCVaDMrjZODHU0kaZzOO3HO1afrVETC56yR5/7uC2tMGYJe/EuTN1oXNJva8sS6WXh5ahaWnDfFSgwK8ckmGIKVEstp9mgqWrQero4FwqbmNZlYE4aRfIqzQKIlLLkmDaoUgtk14AO6vfUkjKxN1bD9xVXA+vNgdT1aRzhi2JI3WeBuDumkmeafY8nVhY0hcqcvvdSLpTrccbLR3oLXp8uxZlUenpqjDvvGRlPrDnyOaTHHr2jB29tuO0sey4fReEwqfaQzpz96SpLgwdJlNp/ljNMjJahO1FctB8AM9tqw4i5tUj6G6bCb2bVKDiUOmcHG6LtYuT8YDH/wwJWQsqywxx53zH/Dx/ENsd16H8i928idtQfiTFI3fsk/Q0PEVcMFdjjMWSUClmRro5t/ioKAtLLxlOUh+NYd763YyRerSguAFPGycSovHZ/OnwTAesomiqUf2UXn+A14xURyO3w3lcaOT6UvuN3TV9KeCvLfsKHYG1/bkYaanOSeuvwtZN2VhXfNOjF75htWMV8LHhSfo5KgzPP95F3ZsrIIdIqaw9ZYULRhjBF47/vL6QxPY0+kZNEXdg0Vb1/CaTx+pelUk3hDOw51BRpyaLAqOEuux72YX7y4yIPS8CTomNTxj2V2yniuImklNGCz5By3rVGFDmSgKPt2DW4WzuYYEcdfwHPTJKIXoiG/w6vtM2LNYBL2OS4Gs3TPglI307GElbWgOhrKDzjiYWwNZKnWQEj1MNvMUOd5gDDyP2o2vcgKh16qVxbxV0P+yNN44ZIM1hcG06lcCGAUHg6yXOLQbaYPc0gQ8s/ET3w88Tq2rGnC/51w6LrkKMy5E44+ySbS0bzRY/duPdfU6cG5qFM0ePRJjlcrZwXobfTURIAnBAJo1nImqTf/B5VvROO9LH9l4q0C6qxSKFDJvk2vFY5I69F6ght9a1/I4QUuom7OBjmhNJ+urB/jM3Lc0WeQd9LVr8GHPeDaw6ebVfo1gr6wDTsL5OL2riJ9KJaOmTC48fhXGPy23UQNFsIyKIC0YduKd0mrQ9XoUzvCfxdGvbtDQ8fkYsf8ft6XoQry7ACv05+GefRXwcNcooJQEsCn9S63fynD8xC3os7sbYrLeUMTcszzeQwmk7/Sg5Q9V2PLEm6/VtWDGZlU+OVIUtNZ1wwPoJjOUw1SjZuySugzHUg3A0j8bDD7uJaOgSLTLuo48dx0vW3IHow/vontHt3GEXB78XqIOt/0v4MYnTGdX7WWbuDv0zX0fH/o2jI/1ZlLC/XISoTXY90kXFn3vgqyVKrw605feP9TCqolvQKVVHL+pjcEtxxRZxKod6mrMYFCrDj0DHNDDbyGVGlTg63+KuMb1Cno+PkTxjsVcfq8FdHUMwWtYHVcGhGDGrK20rjQYYyo/oYgisd9XcTQ424GhTyyh0kcUtpz7xKrfLvGEoDryHVyHoz0moj/Z0Wp1J7pcIoEuO2xpn5sxCIUK4Tdhf24OnIT1xUcp4pw1P59ZzcLuUVDryCSStA1uvNOGK1OL6f2pvTjWRAQVj86nMa/f46j4KvrQOpazP12m2pS/uNXbGjTvDEPCuO1QJPAKfJKfkX7RAVyZ0Q8aGVfwpP0zHmW9HeZs0QK7rYPQtWUldByajOPOSdP37kZQOb2LHsjrgdUvSfo07RJrGejC+ruXAV3XQpvRU1DSrSEt3fG4RW0tpPplod6aHbxNyAOfv54M042Xods4aZz1KQdPy3timtpD2hY9H93V9bDcYRwXngomuDUW1l3YgFkWa1GnNgWbV9hgxyRT6LoozVkPcyk2KgOmNqmh3CkGZ9cg+rpSD75eU+Xe7kjctCcG6petBN2TLTSdl9KYN/vRa70oxHVH4ZXJeXR3zlty0lTGlOxTVHG/iYUlgvmQ5zaI3jiKjcZJQY3KDHpteop2Wi7idSnFLLvyOMcYrQS1RQo0NuIK9EVc4drLE6GiqJNnzjAggy3i7HG6Cv1OCbOzfAV/PpbISj6GuEj0NShFikGX2xVs5uO4aMpcmoremFP+nv9c+EVB+xNY6n4FfhBSp+piA/hIqhSQqMtyAlb4/OJKtgzVIEk7KdByRhgv2shJ+6XgSyfClw2KcPhALRXMi2RlnWGofr8LZZxXw56DGRwdVcq7f0TT6PUIrseu0HFvL1plcot15yeAzol52BsjzZHi8tAoqUjB7cdx/GMTcEiazsNaIRwRnEb9Cdt5n9YAPWsM4FkHBKgoGXjuzARWnWwCRbrK/Hv6a2i59BrErzpRi1M23x18h2mHJfBDawPukVDh+QFyUHNDFvetzOeECSvQTFqOJAwGeNTkAfiwbA+H2z8j+V1X8dZCIXg8wpHGG0+iONFj+EB6K741JdxWZo4aq2u588Mx/ioaB5ot/8EC01AM0WkgpV2nISorDYQOJdLK8wKwaLM+/XEtpfXJDlQvLg5HA+eS1t5O2lLXRPn1bvigVpYeJsSjjWsn+Rx4xDNOj2IfWwEY1fMBhCKewMTiYP64ehJMK87AQVsJfOk6A4sd76C1oDQFlE+B73a9tCingl0DDuOy2IVwNNYLNeqRZufeI7WHy3CvlzI8PyQKXw8aYkP0djIIfkZH5z8jD/8nJH5JjQOsEkhtzCN0GHYi+bEicMz1HinJZ7JU0DAe/9fBBckXOWpBGB6+6E2OfmF0d1k822XKAO8rBt+57Vjuw2Qmfpl+pGRx8tInONnzO+35bcqWG+7iaRttOBljiL2y8Xz7lgRLKKej7dMhXN10ELVTxpOheglaGyrTZBNrOBvXR1l/N+D+vSH8MOYSLAieinWiwbRFbTl79l5EvvIHoioNICHvJ+8a+ZgfV8vT77AOGPO3kLzn1sIKD29U/HQc7E/c5q2uavDYqZb77/pz6GSC+KXy7N3dQRGj+rDp3Uyub79MMT+7UPmCObx2f0q/R5zizmBrLvX0hg0deTwUt5YdM35iekYRzcl1gZkfRaC43Q18t1zHTy0Xqf4/dbqcIQ5LZhzBs3aB6DNJn48eruZzoADbxU6xrf8D1plN2P9jFRXdWcCy8/Ogba8Qqqqeg7UKq6j5tQLsPKjHP0WUsX3qTPpz4Dra7RLgpxYnsfTGZswuSUPP917kLDEOOoTcYeFtMfDfFUOhDin0/Nsz/vdBC0vnJcPqXFcqePQWi7ZNgv5Ti6DuTBK2mFjxmV/Z+DXPlBsF8+iYYhCmt8+G3DMrIUxeCi6GWMO5Ujmua3ahl5sayWl3Emu3+oGXwSDLtefR8VtnQf2NJky+vZGPZv2HaVfcYdnGSPpWE8+pfzbhGbcrOO/bCRjXUIcXqoSh2OwPexQ6crbYRBrYrU7Ri5Oxpm4pjZOOhTXCDzhW9hCkVQnA+9QXsHpENdsNNELZ03acPyQC/k3jQEJ9Oa3qPA8tO7bi+mwVmBhnwNp+d0lyylUsC4kFTc7FvWHT+f3EZbCtYDJ0tivQpXsSIJEpgE8ONuBaQyW00wnHUpV1vFXlLEuOKwe16s8QojcJrE5qgp/kIxaT/EQfBTPQ/Hg7LzKYDJYdhpTWlIlTfBt5pu5qNH4IsDJHHvRa06HoyHyuEK4l49u3qOLfPWx//pz2nvsLOQ1hMEJdAGqu3uVHej/hrlETLR9XDa57RuGL3j+sqmJMJ2eMgfCbF8CiQBks15Wxipc/rDrbye+GKiFYOQhf6LXS7Vl6dHZeAak4q8OIE6IQq2/DsgHXUfVRAbl9n0MNHV945YUelMoUAOdPOzAmIRGX7RsFQoF/YadRJjf9mgFBH9XAt28jeCbuhFx/C/x42gTO7kpCv3gL+NafRl3TnlPaS3H490SeL72zgd1PfsHptePh3d45kP66DUyC9GGPcAR0TrqJHsd/0n/Xo/Ge5QmclXmR4/Rnkk5hMLaWNZCAiCT8UvnCek4P+bV7NS6yKIR/Qw/hdIAgh86aAaIF+2nZYjvsGm8JHvvlsHaqArjP7eeFVU/RrBVQ0gxBr+8XB6X9JlXxBzBazApWJr/D5Qen0LsQFzKJfMmv49vAJawGoovlocjBDuZJ1eHvJEnAlFN07Vkkr4pKot1HtvPTMknSfBcF8WVVvDxYE19ktHDeQiv4tvMFnxyjCeEd66C27gAs+ByO6ZLD7P7WB/qGjOhRjy7qLpsCKaLNdMokHhWWF6GxWQO3XXChO5PmQxRP5dGXj0Lg1ST4K2oEtkMRtFHlNw7krOXU6hLWX2eIrVGLsUR8D6injMXaqkvw6bEGlO6W4/nOJtQok8l3DB5DZNU8PNKlTak58VRXnghyMaEkqCMFExTWQrtOGFQrfWWfwDPwVTOKmvJkoH/8VKiQjaJ70eP4ygU5MDl9DWZvaYInfwRBV6uF8soF2OD8a1x8Yi4orffi5AXH+f0YZVB7foMTRD5zTdAzkFlbRYGHTcnwmDA1Jp7igfowVFuzmQdrESgxFnRsGwCjtHFkjis6ZYwh7+/qePuIFPvL+WKo/h8oXMSgdjYOBpY5YuuUCopbMBIFP3nTTksTsB8nzvYbV9ARrd/8xVcMrjufg74CWxKv6sPk8jT88dWTciVjUWvUS2qMWo7/lF/S2SxhWLXJDh5HDoJt1w6SHhiN1YV74Y2/FGS2uOHFzIdA2kW89AqD3hd9HG18g8fZq/BZL3kKkjxDsk+e8/Wkbkp+n01ndJF9t1mCj0gYdoQfgov6i9H2RzyO99SgbkM7mFPeBqamalys4suyEaOhvagRr582RL9TdmT1YSXXJwlx76t5bKy+mwZOTAcpnyD4flgHJFxbacMSMf78SBlkHYvQM98bzGRF+Kz7er614xwdEJnM7vIScMU8lr4WHiXVRfJ4ME0Dfwf10k+TDlw6dJid/T1p2Og0LZcXgduHFzF2I06xaKVZq8zg2oKr7Pi1D6fHBWOtlxjHyNfx1dMaULL0EIea3wBtukpJJmHc9UmNdue104nEFTSXArAtpZaURpvA4IYoLhqMB+vh91T50JGmO6iR2CZVaPG1hJ6HtbxfNwpHEMPz/M8kflUZLlyUxY8TVbGEtWGd/TjEZT/oau9FCFnbjHkjhGDXVBWWLrPF2qWC6HppNgQsdYIkjY8gpX8YrNZoUFXUVHCs04frH+PoybkSaBv1ja/PWs/3LDZB78/p8PT6fLZp7MW3+eLo3SAKH+e1oIzSS3yY8RwvPQmitiW7eN/9TXz750YKPj8VBLqPgeTs0SBW/Y4H5rzmNaMvgKHbB5ykvxZ+FIeT2bp4ND6uy0e9dWHonyBcPb+ZDR4nccyhK6QRtZ7y6m3h+FAOC54z4qzAYbB46Q6rTaZA96VkMm+PgJKI8Vj4tQLhWS/YV/xBmT8isCXVhS5ZKpGtgzVU+Wpix/ZS+GDuBZnfr8GBEBsePP8BpgbnsekdBWi6eIFjY3Rhynkd+GLQg73KjbT66T1weDEL8UgKBN8NJB/HThSfdANCJo+AWwdmo2PYCwi0CacPK8agnVIjXJf34kg7VzzwdhsdW7IEn0dOgHLnLpx/cA/oPuhHi9UZ8PbuFPCs+Y7S205xxYvfNKDbTN/VFGB2rxKFSqynLYNHuHRyPNyRv8kyyeoQdOcC+k/zguYtqfApRxhytE7gCUUztte/xRdigLeU7ofGW/dh4idREtl9Bx75PySXDSOg98RKvFeTD8VXnMmuSZXT6n+DqeZbXi+2neSK9tBkoRCQazKHa3XjqKnBGdwvmoHO1GiqaI6FuTtdsKM2nYavusLalYgX3NXgaUIcT5F2hWGhdTCwwwXGf/KhRtkAau+6TQ8rUrmyNR2UJ42CjQmz6GdrOb2+fBpLG3pQ0ukwH7w6wEMf71P6gd8oWD4SV68aA+kZYnBEuhzD37aB1K1DYKz/ngtdTpKU/kvc/2w8r28Koyj3KfDwmiK7ZTTzmgliXDDyMISW5PJK2ZN8SzyXXErTMX/wFb5/JQwWO2rwu74p2Wf9B491RfBlB7FW1V04t/sn/f4bira+ovj3hQ6o5oajlWweTH30APsPLEA/y/Pw7KcX1r4xZ99bG9nN6TBu+ToaZDfmQs/p7zAnYRdlxItyy4913HZ1E41y+EtW9jl492sWkvFoSFL1Q1fhGyQ1Lp4isv+Q460zXP49AgsqoiFjxxCJbHTlsnfSsFalnn3DslijXpOXvE1hh2Ux0CSRAc9OjaUTCpbcf6GWzapVoNRnAILvSoDCNj/SyHGgBS1qPNfWnXUepaDmIR3Yrm5Po4UNYPXWrTQgX83CBwgvjb3NQmO7UY2TyHb5PtgRuZyv++qx/biR4HIzmWbfUKF6uWHcPJTPBip19Etcgdf8yyahJe44w1oRPGSl4UhyMenUyPOiD2l08lwvmJ+7RxuXVtHmxnm0C++QSrYLvlEXhdJ7+aSSUYyJjS0g9OQoqHx4Sm0TcslpigJYj/XAjVlhfE11DNzoa+FpCSpgmjkCz3k0097BA6C+Yz9kz4gCmCSATwuXweFiU/gt5YOCPb3sOVqGY64Mcfuuoxz4cx79fZRPOsdUqVH3PsUra8NDu2TysN6Dfip1ZDdJB4tqv8LuY71Ye8WCz58GsN7VSPuFhCH23RCHGlTTm+3ZeOHkOnQJLWHfcwvJ++UGaFolBu7/eWKoojZstVjNql+GQCa4gsb9HYv/oivp+6fLBHt8wE8pgoc6v5DBUhNQOX2B5Co+c8D9OaQlvozDT+aTSe0jdMmzgIX712P0tSK2+ywEj1O+8awJn2C7gCeuHjkA6sV9fGK3KdaZOfHKDnnKX/Madx+1gd93fuG9LyFs/O06jk9y4BLI5vzpAfDYtJM9j2tQ3JI0enlUFhzTjGmh9GZyad6AHTqm6JuVTXKZchD/R4u7ehfT9pZ02Kc1DiyTd6Fb71buGf6GFbe96OiUUTBK5xzWyHbDmqfxaNatytLhOuA6UhuCpIrBiyN4ybbPmFTfhI5VpZBez/Td35gWaYWR+kMlyA3by3bbjUji4g8c2fETw5Sr6IWFP6+2WM/fbn6iiidVUDFFET6mq/Plu5lsODzIWQofsVdpDXglfKSo4nC6KXUWrj75Qyp7RkH/lxqa92kKX1HxI7cHh0nVOYB3i8yCm5MBxKtv0W6/Jt5/WxWMbu4DmZb5cDs8gB6VjGeT9HqgJ77QrTVALh1lvOlTGYc26kBhsx8Y6EXA5/TpfEX8HF591geH3mfSp32v8PHdCyj8KZOO+RuDQoQGbl0/F/HCfh6zLRcfjAyiqpqH9EzYg779E4FRgsLQt0EFCnzy4KzGZFSMGYfbV1xgq0vx1DvaBFvyJ/KeCStJ4Mw2nlvOEO+zBIfnCkOjrAYNz54EZu26vMRxKvq86KS5f+ZDhOYQ3dS2gTKDMrI4U4fO/ZNI0aYDlb/tosHGAfKrfsEZob38aXQmvgpTgs2q9lT97xaoDNhT3+ifuO7dS9jeZE177evRVesUPigfQS8clKE56jYU7/7BR/bL0UXvAXo4rIU1549gs4QiLXd4QOPU3mCNhj4c6xODswfy4EDfUhI/tJobfg/Qj8BZ4HZSC5ZX5PG5nEpY8lcGzqq1wODlGZAz5w5/O+XM58VVMPJbFmSv8scn4V8491YwCHmMhUnX7pKtkhuErV/P7f1bqPXMQb7ndBCUpmdjS34vvvc5BbUtKhDdvBsuzjXE7RtW4PpVnvBs3E4sj/uDlrfSaJFmG8DXR6Q30gKeBUVQycdx+ExIHLXeBaPPkzH4QH00ak2qQ6X8Rjjc1g4HLkrDnPel0P+wGa9DG+16/BumTO8la+1rPPWmE+0dUKCMiIlQ2aYLDpK+9O/GZq5d9YVXno/kQuV4GL9JlUSrtCE59zO89bUndX8jEHP7TrNMZWn/+XUQfXEAhqvWkpt2FbgovOB9r4dJcsY/FkcbEHN6wp8uhfDRs2I09r9JoPpVG+b89sagrH+cV3qH/+t7Rc52kjBlzwwo7rajkn4xGtHSB1I3JvGTJZZ8r0uOJ015Ah/vZ3JlkQlIqFyge5nfoc3lPKydbUIZ2lJ47q8nl24h2De7gStyZwOCEbxqWkGfY6bw+1RZuvf5Lajn/ICtftH4ZdMxXBR1i+IT50GpzyRQV7BB/d0/kK0Fufk6klfOSjhyWZAWi/8Aj8FfNNVvHibvVAGNOZXQGj7IxnVlMCZ8Pa4vSEdH+z3U/SQZRwRpgs3mpSgVIwSfFbNBZdIQmT16BzbrfvDj2dMpkqzxdtgTnHOxAJ67baFdd8bDzq/vad9yL+i97MObj67Bo7+nQqamGIs3+/NP53eo0uCMZ1wIpikVks2Hs7jgvB7/21UCr9Cc5neMoaDdRig9zQTO97+FhkWyICHfQ7fKsjlCcZCr3X5zZIEM0p7LAFYXIaBel3YbHeGzPyWgIeg0L9cqJA87e8ryc4FprXZUJO8H1w47grXZXL573BhNTFTA5F4yrXH6SRXBB/j54juAqd/Qb9dVTJtUjs1zNNhuvgc1io4Gd5UE/mJ4n9w++FGkwgY8u2AnnbB+Twsct8G8ck++OmcFZbTrg5mROy39ZIimd2fj05XbeUDDlVcdSKFn07dS4ZNBLr9lBFMVtWDxpU50PbUa3DwW0ZjIVvybP4lW7NzEK/sjoEZtFKh/fwSjJshDgOt5EHHRRWf/KXjiyFW8nXIawqRHc8vnrayvmsoqDlk4PGQIu5Ns6PFeR3iBR1nE+DrtWvgYC2qFyUfmM5w97MGHln+g257icLdUDXL9UlDGrR6te+MgfOp+/vWtFb/PHaTcn6EwbXUU958ZA6uuVtIQjMKOE+Oo1XsSFbR50q71d7lyRxQ6ietB8DM1mBoqBIPpXjhOcAX7/xKFThdjOLxhGjo43qJBaytc9yqLj0jW8Vo1I0gN+0O2+RJcGGPOS9bep6t3IzCkXozKXn4ktx0PYd2eYgwctoTZUmv4Yk003xHfS26j1mOrnBXuMzHH3yMrKXKdKdXbXuOuA2PA8bAJxPz9DyNnXONZml6c47uURp2JgXPz03nzpkTUL+vhTCLYveciSaZfxWk+GjzOxRWbwqu5Z1QRjN40wNY33PHVWj1YtVMCNmzLgyizuxQ3Sg+Pa1fRyk4furZwCNdt6IfmJ2LwMS+Kt85WhyaPGL6d9B6jaQN1rN7OtwRtafCMCr16+RmPP9annguCGBuqBeuEJ4BVzx1cnxHJy8fHYY5RNTjdmAK5175RZfklUsqLQ482YVipa8A1lY+x8VY02AfvxbVPN0LP4dd8xXM6NY41wxOfR+M3V32Q3fMBpL41UlBiGBrv9gHBOQbgsX0sie/ZB0t/R+F0o3ucIC4GyTLX8OS/CtS7mwea6S34SFSH9rv84KLJW2nfn4PQWBKC/3aqQWbwUVoTZoUGd6SowBJZQyiEXh3XxqARlcDm4iTUuJ8L/P4D843juNguluJDavHb49t8A1NR9PhtvPs1lztzb/DTxNmgkKgPeyqbcbQCQ7tpK9gVuMK9gwkAjU9p4rvxXJmUDv0POuHoURn4/MeEp7+Zgl7DjyApTIDuSjlBukc+T9AKhDs7l5FRw0qaLW8JVnLvyXrFX1RMMyD7AhUoUw9gHdu3cP22Cdj2mfHEAzHk0oCQ1mCMw89n0YggHSh59opmTujDochr9O+6Gj+4tJwPJ1jjlAcqYL1SiYTNJPlrqRKWb06Dtlu7qLyukMPP21H8f1MpxrsAWjoJpt0pgNHtldApPY3meGwF0ZxQ7kj8CCXzPODd8kWckBRId4JVYNGnpywZeQNUn0+CBbJBNDstCQ7FmLHBuRu8Zlkdq2o9p8gKNbgy5zX+vnCN9j2zpWPFi+C1QxgWrWjhz44a+MXyGGgudcTcHeZgC4fo4Dp1+H5ID3c3duFP/5ccEKQD+fuNqf5FEWdu7MOGPE1I7LmCE1aO5fJjKpSq9xvv107kNumbeHMz0Yrthbg1t4lfusvB/dQbvNf2MJy6+oPkRheDao8mrT8rx1axnlxwaSv/s3PkLb4EVYYrMD9wE1W46FB6sQ8Xzh9LJ6t+cppZJSadDmYddVuyVBKB103FYDWlFqxfBMJ/d8tgvPwS1M71YvNhObTI3ENJIVW0pswcpE8dA4lkWd5SvRJebD+HG+UuYlyxJK3zMyOvC9Z07T85GiGrCGcDG3CHSxzNmLSavBdsIfHzW7m7+ihZTRjPi/tUQG69EoSJyoHtzC+k238BZzquJ63uTpobu4OD6wbowYT5dMR5Ba2u24mF+0TBMsKer3i8AIuTDyFKSoVcbyfioq4+FLXaB7JvfbGzzJnfRKuDv+x8lPmZjRtwN8tWvYQRbfdJveYyHG6RAQXjJJa6Jgm3ZUaDw15l/ri5mcTblDjqXyHIV82mMocV/LEpksofGkFC1HK65SIJh967k2vLJdJ6l89z9o7kOabf+fKbYLx2lPHBVFs8/cCcV8eJw/oThD97d7LFjyewp7gfJO+PQMsjslyjMgJH6PZj4baDFN+jBzsMzXGEaDbWz5hBgVH5GG+XxK92eJKhmwV7HHbCCu1mkHszGoxzRrDza1Na+swLE9bp4sVuoCSnRbTgSCgEyX2lKdXF0Fk7AfaPOsJfXGdAjdcv+HHiDMz12obBZ4Vg1YQBbNGdRIfSz/PjM6ZQ7bgGXcslYOzWSIredBtMZ7jT4KE94BEqhNbLlFCksgGWmwHU31SmW1sYsWc7l3acpJeLFVgs9QvJSkWQe8VzVDU6zI/W6MGEO/+gWWszy5Zp4tds4uAFL3Dnf5dBvE8QUzvnQL2hA36aoA9K5geg6uMPcKo1J0e9d+BkpsKy6jrsWTQeQhYFooTIHs6fbgh511OwLqeAv/sq49j9QfDZLo6CVz3CwuP/UDz4Dwjcn0eVa7Qhus0NFNtegYCkN5oUONPukjl0Pu8jSy7cA2Uijaib8xHDP6lBgWEbTltsijXTttKdSiluqT/Od3fJ8lHMgi2xTHnn3mFxlDZIHZxI1WamXN/9EjUtj8NnmbOceb+KT0WI4gq3+6xnP5evaRmBrP4jLro8irr8xqOkcDh8b9vIt7QryO3sC7o07yOtklGEvV0iIOmaCqPezSLViB+Q/DgLRSt6+Lj5THh/2Y9i5h6lLUfW0G9vG0gLEeJ9F+az3Q0bbHwXhP1QDqOik+nWBFMwMo5miWoH0G4wgvwDluSbW0jtdb+gvOkKT3hpSVKDGvB1XyJrFO4Cgd1vYCBkDGzX90G/m+Kk/NQfNwnfQLHsMzDxTybtDWvEpqIkXpERzTmjJsCy+pnwxGEFBFfGgel+Z17VuBCkUhdQR8w7CP/Wj4VakRBrIAPnHj2D8H+6KGAWgqOfnYTf9Qdplc100pmtBSO/bmGZOX5k06cBgxpV/FhRmgIcrnHXmUieZu8Gj2+vgx0Vi3GBfRh8FW6nUHMF2C59kH+uzacFf/xgTJkpL2ncBYeqn8Id7YU4d783RDw7xkqBQmD5wI7SjxzBOVYTQCnsOMj2/eOMkBuU8iWGi07VU6pCK3W9MYaAjly+8aselewC8I2ZGFdlWmPiiH6oOjiD7n8RpPYPt1BigyKc243kkaIHac+aIKNMnWpJEKu/bsIfyiEwOVCJhOxfclOQFNSv3g8iRyxpwHAbhI1/xpneD8hJwgj/9hvR07ZA7u9yB51XFmDp+hIrGl3Ya1sDnN3shhXne+j4iCKwnzzMxg8+8J4ltZCyVRbk/guHyTPzQfOdPJdd30pl9W+4Y6Yhyo1L5EkDWWhwYQDktuvAHgoBLrFjC58FqKd7GJMoghJPymO94kQ+fYxBTG8RdEsqQcr9yxh4bBELXk/GVWXOcOaFELWaSkKWyDwW2KoH9w+KweyyKRDWuAttF9+g3+HunHdLELR3JXDvge3wtasdInaMQ6ELwVyxXRq2PzZkhfnjcFtTNP/VO44jZT9g9ept8LJkBuckuFJ89iCbeytBcMFnophGDBObxorLvWDc1FS8JPsMe4vG8WRZ4M/d0dBQYQr+nR9g5RIVMoFEijDQJMkCJXIqS8aNc1Sxos+e7H2u0vdPyhBwxROrh/7yjA39XGNzji+ZS9KZa3JU7f4Z3F8/5I/dV2Gz6ljIzjDjxMdHcJ77AXbyToFLZxzglVoWy7uYcqffFhrVmwNzNAXA0VQNw/qteepwKE3e3Q4+AwncNf8Lfi7tYC+trTDf+y9ue2EFN0r/kP8NNdCMa6Edce6oNX8j2wuK4Zk7tXThzRyc6SJLEdJ6EHmnmgfl3+BDWzu4Vq8NQn6tYG/hBR5H73HGVjOeNNEdC2K1QPv7Q9iSHcA+zwvx67WxFK3ZgrFT8yklZR678QY6ntKD9mXKALvOkeLyBvyZoUJaxqIQez2JhU7c4WtOz0ns3GtWf7QI7wtow2nnPxgavgESdrwHl8n/oVX7R+KuHZgeWUDJjxYhR+2nBTZWUDppC3x4Kgzu+ncw06scJT8XsumKDjRQO06+fiU0RucYhmwQhoqgVfBN9hKHrA8H018+VDRUAIvFUuHK5QI4bBgKg2nBrICSEL/uMxmNUANtJ0n0KnxBPj+6IGa8PE6e20A/d0dCdEIOHhxpA4FXUiBFsYZDC42p68tjmqwfx5NX9kKIexwZpCmjldcQRB5Vg/uXdlGoVgQYVvlC+VFrUO5Zhm1mH6jyUjPkfl8PqwOH8UWdFKhsGsMyrXfhx7oCWpE/hf1VvIFSS1jRVQ6cDpxFsYXDrFcuB6Vfgwiqm2HKeweq3K6JoRPc4WJeK1a8N6GEsD7qSP9JjiXmkL7sHrvPnc3+Y7fTvjJV1P+5GBdLLqTze/VBR2gQfxYPwRflEfB7KI7ye+bD9M2C9HejDU4SnQOO8ZtpPGyA+crdmBv+Ge++0ARxsY8UoL8CrSOm4LsTO/G7RDvbpCrQoLMnKBldogN/G/ilswiE5zXB3Jw6nlyQwKs1XqNdxw1O1WSaXXaOjF+oUUaZCx7OMoaLrR/xeqgz1c6upqU752PNvSBsXxJOVdfv05Ypy8FJfAJe1xcC802/OeW/q9CUZgsPA0KwIcSafs37CSV1cjSnoY//yXuSgLMFfLZFLrNKwuObZ8IMuAynlyfCmvZKyJspA2qv0mkkFKP3RhsQC7xJGjND+Or0hVDg9YsWCMeCq+Nr3NPdyZ+2+sLNtCbUbpGHfuPLNDFRD2rswyhr+hC6ziiA2eu74cm8majGlfimaBosPSoOqSeK+NVPKTp00BFGmFhj9kldtNQp52W2V/FETzGZdRdS/lULqPzXDmX5H0jg6lxY4PkPYzY60Pjk77jBLJxm3/4G9rdDeJH5ZKhqCcXHw59RJCmePKobYBfWwMiRx/BWdgg8X18NLwXEWbpUH+YfCUQLt+W4ZFsVVUw+hxKP/sB8kELvrcOU+kwQ9vueJRfRSdDZ8R52Cvry2L4E2l/9nkeGNvBgtTO/SV/BeXPq4L9YX3TLZihcfZ9O5hjgjrFSMFFlLV002cUbj2jxlhn/MS1S5NsrLqGzjQZM23eX91wK5QVms2hm+FK6OFOMXBweQMTcYzg0woRnruuj/faKUL/Dj24+nQlL1rjwNI8rPFzVzBu0Z+GvFSvhZlQGq83djyMrZKH79z/QTkkEsbyLvLhggL0DS1D+jzp/UZiIxv2juab3IffF2MKXw19w5dvZODDbCtM1nlOvzBqyjrGH7gBrbpz2Eh/FBcILNz2opO309LoBN+YJ8n3LLvI3f0uNKqX4724ozA+4Dl6HP1DlVGMwHvyHzXGraYVgBVgtUMMnd79S6QoRbG0q5CeWT3BmRzrnt2vCVEtXvH36HnQdGKK2CnOUSthJi+xcQexQHBkot4C0/A0OUFeC0dfeguGfXro504xixRejRWghaIoXw4zSzfxBxJOXfx5L6ovHwdKEhXSjo5vaV3jhBzlzarJ9BGJG0hDomgBX9pzGHYVj6DiIwiKfGIxfMAZ/5HSh/ZwEwkA7UpUG6t/viz83XiNDZVkoXisCeTqLKPyOJGetKSFLrWoeHRuMrTbP0V9iEJa6WMGehQtxWq4FeIYFgujOYD7ZJsLhs5fhwz0hNO3bPRj5N4lf3jzKlrbnKWOcIey3nov/rk7F2f0acPXaDSjG5zhGZQLlxiXh6l+rKWnFA/jtpA7yZrMxY24u8MPNfH+CCxVs3QzdQZv40L1fNO5JABwtaiblnZLwo16B1fAiBQYP4VfLt/Dh6VvMSR1Eu4Ua5Ja6EUXrz9AZv9FwftUv0rZ8hR/iDoBhdzy//uGGM5eeoY2p+aBpMQGiXXbj2AV6cPvtXg7I/Ab+LRY4OXoRmB5QhKzbSGH+T0FkbxPs0B/L3mvHQu2vQVjFB8FbvgZys47Cwi8OMF/Kh/19EWLSxGB+42KcMxbAYK8PD2x8iu83bMcPpoW8Te4jCsw6y4ouDhAoLoyxRqJ096wBBHw6gseHpOFnVib1G6/mm6Nk4fvhHnLmIjKWPoZTXzhigogaDCoEYMsmERazmcp+80/AvvIq3vGrmQRPCkGCSA5ZdLSS02l9yJ5QQk7T72PGsu1U5BiMzuvSQDV5PNrXvEXncAGuiv1KS1ss4MuubFzf7EBHdH+AX+YQ2Ye2QKxJEyo/uYY/fueQ4iZP1u+RgD3PerG+8y1/nVTIFeu/g3iFMYcn/oUjry3gmEURFr7Qgm9fteGy0mxaqnCZhBeaEr06TQ2d+ZCdZ86xG+7Div4S+hvigvtU9eHToQUoFvSM5teIIx7rxeK4//hGjh3nKEmgu+AmdDXai6cXGsLl9UasbnmdKoK/4c7ZPTh4/DxdOvURPlzYQgn7J7OuznQuspEBidmdcC8on7fFLgTxxSF4R6GSdTOGQHn6CCh+MIL/jkjlkftk4HJND9t9KIUZXy1RXW85vn42BM26v1lw9TP47HUQYjfGQGKFDCyr3ATDXs+h1yqA5ywNB6GfdtDePQzTys9hlutpXNH/gtev+A8m/NCH7Lgh2m/yGiYlPySHDmN4v0YZB3/P4o5TDE6vf8PjcHOwzhvDawKaaL/mWXp55SlJhkiBz+lUfBumwQc8b/HK8drQIKcEXtUSeNpkMgvwNjxgq89CKyqoJ+onv5M/yV/k5+LPp3k4UXwUfBPJA5sPPZDasRk8eg6T1Po5HOu8mR4ckIXg9wMgQdshwUkXPOO/4eTdpehTHssjF7pD3ItFlDVdHB9dGosNMY3scEIW7U4qg4H5QbK5d54SVS6y2S6gPq15YDtyCkSkRZGF5h7ON+0lGx9RiJeSQvfyEiiS3Erx9635lOpzsLpiASfsXtED/32Q7lCFb4WUIMeljU3s8mnpaDNIOnuIWppGYmhPAba31MDR5BkU57qVZklZwnDCaCiX6mfF4mry/GPDda4h+HhTGe1rKOeWTfNRpVOdV46xgq4QHXALf42qQrJYcr0fFmp40fCV42Dg/xb1V01BvopsViYDbTP7oXzyH7y++S++edyCzlJ7WP/KH3S4akSajjPIIPId1SjIgl/4AFmXxfHSby30yqSFVh1YSS3/fDhp8mf6ZIaQP6TMx25KQn1DNgukVuKdzx74wugX3ElPh4cCj6Fs9Sa+vPIRtgQpkrKUMKTGryDXMV44fFAL5rcowckz40ml35fenHGFmw+Xo/Spq1hgIANTzqaiU9saHOOshsIi3vRi62+YPXSD+hsTYPTACND3auFKqzEQZDGNdQ5W8PD5DFiqOR+1LVN5t4cNd76JQrOS5/TecjcILDGHiWXxVKa+lfMOnId/5ne5IPksN+j8B1Pi7qJlagklBR2j9bU6YP5CHiwuJrJLXBR8/sDkq/kZ1lwKIb3pT3H7pauk1+VGN3YIgeO3QJ566w6/UZeFmFcW3L+5gkP8DqNUiAuWlZygO//9QHs3VfhtWYmKff9AeIoBiN5LhhPN32moXBNMu4NYRPoatOnupa45UlD8OgAdSzXJMC8PXxzQwW2DFTj++zuoGpMJJRP/QKiqCa48IAvJT09x8TlXSBz7Bi8M/qU37E+VUzfBlXVX+HHrbGx4sAlLtOXhymEvnPC5jc5HlYL/ws/oKRRDV5afpL7rCvD57DDUKlqQzDIVaAuyIsOs/TBstwP/Fsyn0XWX+da1nSwT6o5bKx6AQdF+8K4wgHL/kXBsNdOD+7GwoFURyvMNWW2nBrVePsnqO+ph9vtqypuO8OnqaGje95g2Gbqh62UJ2qDnxcFpG+CmhiuvSmmAkCQ90DKbDMsnRJHb3+n87mATDKRYoFDaIxb1iUOpN6tAYM9H6KlcS8nLxUF93z1otb0JZkHS5FWiDzJLRkBtlTK1P/3HMu4/KFlgM8dpCEBDUzh9jPRnDadm6n4SgG6vPrJp2zhesM6YLyZLY6ClJbpOEYKfTkXQrPOPFI4epydvLqDMGVM4ITiCqlvHkZh3Aux3KqX6wVEwKmUWm6S9gEVTFnHGtCwaO76UTKM6qX5mPy63KAfVOXdhdcgUGJl2kvI9I6EzxgEmZt7kEvEdlG0tT0uV0/nezSdw2PwhusmNBN/Y9TTyvQ43qsiSh00jzot8iItNAmDRrGWs1xBGH8buA8XNJhCX0MhbS47ii8BqvP6vHacdF6TE2aXs0K/HItPH0nDTdKhcoQk14r403+gLpr/QxnmuLbjt0wS6/l8NSY1aTz4BI2GKTw9NPWIFa/OtqfvwVdC7OQuu3QuDcJsATA/MAZFL2+i//N1QHtWA0zMQJHomsNX7BJrxwpP9zNo41jcBLfqauHV6H3HYA3ws5gvyT4xBqmMZTMkOZ++Hy+GW82X8q1qOuctycRDvgVbOcSy2GIMlw4owYqkVD5SMJZOMdWDH0ly6UJo/yb/E70t68UndAH4xzkSxSmFwKRWAeYU6bJ/zks+r9HCf5VYM+CFGvhpz0bRxBxnvEsWY0/pQ+uIdpur2k7nqQdp5UJF9Nd9wckM6HK25RVo1q0ByRxezrRSUC43BrGZzbJ0hgUPWrrStIwEGcpvBb9wYCjhdDr9+OnNPghYITH2N++0y2OrCVJ68RZCPyN1i/+FezLc6T/rHGnBW8V3WWM0gc2kUhak64HvlZZi09SrZLjlLs3ekU/+naJDW2AJaLha4JVEN8n8U0VqbNqz1Wwzw8jp06N5i8dYVvAqaKPpCCJo7TIX7GprgKW5B0lUMuzfHw5EaC5hlI8/3R4nTq/1CkCCfRn4Cq/GYoTyMHpkP+mq5bNtpzeeFjvEZ4W7KNlwIl873YhF7Yav6BBbYYw7PPnzhU6JT2TtFnFbM/Abm9svpEJvS8n8HaEvXS6wSW8L2waqQ8kgCSmZNh9IBeyofNY5adA14z6wccnC0B4/YIFhoZgZiU8aApb0rtBy9ymMSDXHxiaksNLWVu9xMSSq4B/f8eo8xBh0wvMAY5vgCaEibc7rAMVyl3IqyBx/jg5rHvPvXd+5Tleeg2Z9wx9B4eFGVyJMMa1F+XScsE9CG2NsS8NXqD3iVLuQbD6RB/dBs0l81Dm7UGeA2w3nUlIZsMcsXnL1uY5LrPPAxUISsiDVglJmDzyJkoC3ahCxtgb2b7Vhoezu2j/LGLWleqJ6egnu+eoBpfDbaTRKBIjlJ+nslDzsicuFMQS/KLduA29b205ufIuhWpoVnrdWxSlkDNp+bSUu8h8n0vj36TNVmsyPbaLXGPPjwthNm11jDOaHF+GudBOywecaG7WG88KsSflz2lSqfalCaszDNSvGnolNXwKpyIipbGsAr9yZOybTlor/3+WvnINXt3I2m/6Lo49sVYDglgm1XdVOKoA6c/psHq343UqG5K/cc6cFRf93g0r2xoHXAG40+KELLvocgkmgFQd8JppxppvipwHe6ZmLv5ob/ibsPhRAUNQDA/2hJ2glJW0u7pERDqQhpoChKJRRRiGxlNayUhLKSUpFQioYioVI4DbuUklBWhe5j3Cf5cO9aZ3AP3QK+uQ5kGzkA8TWW8IV16fuQDk2V+Mb+cfdI55ULHAnRhxHsSEprCD0X3eTUO2ZgFxPLbo6G6Ni3i716hlnpxknwX6hLeYeCMUvUn3r15SDO0BA8+okLBx1BQ+4zWfd30IFdTnzt6yhYsnYpnr8hzPckqnFVpC5Mjd/FPTpv+Dga4J0HbbzJZRwade/msYni7Hd/FDpUG5Dk9xEw2O2FcqsbKCziKGtMGUOfw/7QvQB52lIRS6d/p1PgnZM0f54pPCoNRbczHTDOXRWLN6TwOWk9XjuuCzT/huFryTawnuHKAU5jYMqVeBhOmcrro2aBovZKVLZ7jfPXutK2KUZY/nQMlHSdI/EN2iA1OQl9/JQpQNkXAr9nYdrNUSj/rxVeWxbiwGdhvGJcRlutVEGnRhFuNLlyd8B9mJbzFxZfEsWUFhW2e7AWHbfIcN52M3qtrwp7vVMYXh5hPWgAKYhC0dE/2dUD+MfhCDqxp4obW8o4vMMCBM/PJD42FRTbU/FgXCVcCL5BU2gtpMWO5D+BJbSl8T8IDRIC5cWbOK/xCKxTq8ds99mkpOyHG7q9+NxtS9id84+HozVYrFoNpoTm4ESnJ1R1ZzIp+IrToUw/8O5pAa0jHpS/uhMW/ROAJll5yBTYzZZS5/C4jhO0FOtDsJUy/X6pDfcanDFsvBgdlLyNMw4rQ+9tVzx1pQsC97/nNbPMWHLFGpy5RocT/Mfy/MAK7tL/jqb6QqCQM8Cbh2Jo3vpSvDl5O8b0TaeSa2OxbGo7d28JJLOn4SCcPxK2VeuRnok4fl70mPdXvidJw2i8HvqZq18XQVJdFR3YVknmziNAMacd/wvR5GbfQLjYIc8ivzfh2PPP8ZfUWZQ6OJccb0SDwolx4CFSD5McW2Dyg3YK1SzHI+uWc3VoDE5OjUTbpH0YHXQHXLXUwHhzLwf4FyBMuoMKA1KodW01ZQS40yqjEBqdv5nrArP4128GP4l3eO5DJ3ZFGUFNjDOoz7iMi4UfwdUJY8BA/jmVSXynakshWPLyEI/F1XzK4igsDTpP64qO4IqtvykY2zDukzvOr54E2ZmGoGXQi/sN6rA5wZvq613pynRzaAlXwnav8bj5xWa2ENRk8WfGEGH7Hh6OC+VnD3+S1iJdlApsIYGykyxUHsSKLjeoYvxeSNIxBXNuwaY6S9Z4Q5SxV4EnTl0Cq4dmg/vpKyzzzp/nHciDc/0TIahGmca4+eGG8Hz6LziXuz9ORKF9oyg+2Y0cZTtIN1Eb43eOh1PqPzh38jAsLbiICp9mcolbKE6R+UEyzwIwI2ktR2/Wh5dHLWGg5it6Gu6B0mXh0HO3CPWfC/Or2mW45mIdPvcQgxgPeQ4hhOiFMbTl0wU+/jmSp7p5cqV7PikeFmWZF5Z02iaUj6w7yAufCsGSa7201imPy5bncPq/+xQT24g/PdRp5To7/rvXCKatOQXj7ivBmbcpsNi7CfuXLob7K+Ph39gR9HJ5IC/++xL3hUyEBL0UFukShL9tL8gujbFcu5ULt93BjIfWdMNgB77ovY56XyTpxFlV+u6lDQt1hvHL0RIefvgLZ9y2oNHUQmMy37GJuQvsxUHcWxWKO29aQeepa/RRORUag70h644u5Ngqwfm3B+jU4DW4VjmXF0W/h4hTUtBs+R+G2H9jzU5RGmdWg73CtbDv+AIWn/oKquPj+fcBT3gSNAICPhmj1+BJ3r1pHaVbKbLVmVr8Lj+Wc43v4sZzZnyjlcE5SxzUTPSx9GUdHrLMptGiOSQ//xNMaNNEibUH4f0zN9h4xwNOORpC/D8ZbLxdzJGBk1BIaRvlPNyAVfka/GPLPpppdIBezx3JSk+nQdiMD1RvJUAriy7DwZkvUSdyDPp9jMYzL0bRmDYJkmvMh2o2hK7kGtbPiKS9G9U44fRYNlNr5+c/+/iQWDNlmUZAY7YUxK/Xhi2zLLm4XYfX9MxHyblHOPxcOxvI9WPWr3/s/esN9e7/DNN+6EOXqRCWj/3A0woCYY7/b1LeGo5Z5w/R3eY8/uY5nmNcgmGZz0iYOKzFPnrBOP+MNR59Gkatv27QqflupDtOjR1Yk1NDevBYlyxc0kgEmwViuFssnZOe/ATvwim8QPwdd2jncm6BLZ19bouCHqPB32sYFY/vYNPwMVQeNhkSqn+gSqkqGa4zZlmJALSS/Myzl0hDnJkXR2m50FUhX2jcvBxDst9iqkYI/KMMODxnFa+dcQUFswWhs7Wb5euXg3nUF4y5uYBW+W2B0vGWwDfEoXYest/1CN5XpAK+Tu1obydHGb7r+aGyNFYGlvIVxwgqnyoONgIN1KJ0Df3bFEC2UBSVbjfB/EMN7K9eipETszFrdRK/yvyPzBrtyPd+NUKyJRwZXQsDkz/wK0trHFhQSvdaBXDjiybsMBxDXpOfs738ZUi4KgWfIRq7LbpBzm4WF+e4wYI2PYy5dBAGmi/AiRdjsLpcDQoXqoLz9gcs9SWIvCtjYX6UEzwJXMlrP9/AApse0Jl3FX1rZqCboxUovFWEy7/UMPVHGpdbLqP9u59Da7YoXR0cgvMDIpR+Sgi1dBXh3EFx6s2S4EvV/7HV7+O4frsSLquciu1X1vKh+rO4w3Mj3zokBCHl5fSx5iQ8b95IAf+WweXqcOzMbEKjmn0UFJbDJy9voIizZhBy4A33/ojjFxVOePJtBoR0V5Nfqho/9RmD22Km8F+xMkjtZzgZbI2+4l7Ykx/A2/2D4b7Zd5Qdmk+jDixAbbXlcHA4iGTspWBHP8GRLZKo+6IJoh174cGIXI44rAZSPT7oMongeksciB7RhkbtHryYU0CVggfQ9mINyp+/yxdkhUnrcRfeadiKcRzMZ14awOWOWAx7cxQ2nZHj6w65YFNZAvOejsINs3Qpb8MFvnTOgSr/joRRlx+Q//jvPKBXzIbZM0h7ugLnil+m9lUbSCchlF2+teKiMHVYKZGDW3sCqTAwhRfevEsytnNZs1oO4hVv0Wu30djo50Gvl0+GslZXcLaWgIULb3PjmN0UmevD24dCQeeSKVTc9CP3/ZU0x1MAHl5Wg4ir52hUxClIrbIBBcForti1kwOnfICahzaQBnfhxviRMGqjPQdki3Nq013ctPcxPVclej13PdYohmF6nwnHTBwijU3qUHshBmzL+yD71SC+q9oNAivuY/H9UDCUDEBHhSlYAoL0zlsZdlun4IQDE3lgZzmk/rDm6eleNMaugAVuPaFFWyNpjPdHbAvXg20b18P4gCvYdOs9mj17iEtDPuNqk/lwqNQff8x7yv1O+SAhqQ9GGwf56PX/aMbWt3xuVSS+NczA3ot/8PFpfYhbXckV4z14fYsiSOavAKpKocTMPCiUUqbl1adwXbAxlx6UBqWQT7hv/1mYUysA608fwIoHhbTr9m5Sn9jIFr+GIXjBL+y19QG9+A4MNquB1kcI5oN2NDDHAmP/XSPT3vc40z0BtUzN6FTiOtY2C4H0jnLsV5OH6qQp8FjJGz57H2Uf7ztU1rmGrZrq+c+yeMyc5wdeG4pYO2IkSH/Rora3GhQ7wxgFDFN5wzYDKsNDWPbBgwOGhnh4fDOvK5WF7el6POpYF1y+o8k52/ehGxwg1x/r+U5zBzoIV2Lm3PvYlSAFsf11dHZRJzrHZ8M4vcW4MzuPe+cI0oj1Ljg+9C37PlqP066aQpK6HuisJr6s0QByQtvo96YgUHM7z/Uy7yFq6QB3uaZxrqgFvNkzh8fk3qAVe39iWZYSXpuhQwvWT2SX1fPJSjEAfv7SYFpiDo2wErdv2EBJb5ejk4YwlndlQlvtVu6YWwIDEarsvmch7KiTBJnDzKLucpAtrU7rZ5bTJgkpmhR0n02DLvGSoU+U5ZVJmYsEQLFIA1t5GtbYL6eVZRaYtUqYEyzmcsSWEDhhvBY3L1eG6qfCsKFbnC2r0nnSl8t4csCenF4R9g2+5LP9NjxSVJr74y1w/NwxUBIZjW8d1FE5MhSmeiixwcxeDtwrypu0v7NnhgI/Ou2E7btGwuaifxhU+p1LTEXp3aF2LJ3pjSsHWmH/PAW2H6eCvz1SecE3UZB0vASVJ5NpiW03RCxJhsXSqnh7nQKVDOXBk+/fwbPSF553SkHZWSKr3HfU5P2cr82RxLTmY9gWF0+Kbi28KygAp313oPuNCHGBvSDd8A57zsXh+rcN9NVkELVt6nDGhDSaeXMHvHj/kzL6EHRGXaF9HdGsJXyGNRzsIPHkZg6oHIIVMyRgdlMzXD21Fz656kHWjzIu2jEHNv+nBVbXfQm2NfNcESWY2POYvKwIH+iHkO4UPZj8XBFkjjrS9NoE6iz8Qld17OHvhxze87afe9y0oSzhIV8wMoDWHD94vKEV277q4UP/i3iyvB6Dtqpw5H8V8PCmHU6fsZ+T9k2CwENiLG88Hxe9DQafubvAb+IwuWRtpSNZwjzhtg56OI5jn2IzOPasDJQL7tGIE30kMSMUDbZro/axl3Dx0Vb62FDNSu5B6BcuDgaXJtDr8uO80PUc7Enu5pis02R1MgZGnDfhuVeKOMKylkNOW0D42RSaevUXFVpI4Kwj50juaQSmz/Tl0q3vIY1Worz0PsQeVfCw+wh//luCTx4XYWLPEzTtjAA1tUfk0JOMw2uu877aOtasUId2nYvE6ECWV5VBSNoIH+7ZTJ9Td7LhYUHuTfWjVJe5OOvNOLj5tYofjxhHfz58x0luF2jVO3UMvR0BDfkj0X2+ND+rP4JnPeThfD7w9OAymLa9FyVyWtllbCEUlsaSAfyg7A820HFDhmw9pOCFnBonW3+BDsNi0ti8iW+Za7GA3QH+rPMRRE7r04Ev0zh44xgo2f4fq/4zANXQv7R+Syk0t9ZDluceOrOzg45PyQYN+SzsmQkg/+44CewQwbEa32iR2i8edDGEnzrjWWzlKXYIfoqrQvTpppIxTBjaiTlvigl9vbDq3QM63/uYZI4G4x/NRRjoak1BukVwNUcKfHbbo11SHI82VMbzex35mWEDjzozzNLKk/BSyx8+kTBEYU3msMZHhabnVvK7yb/p2cdSamuToEmRJZB9P45CGiRovmE9bSyYDjIRBvDLfTHPXFYGJd/n8mqhbHheF0AheR68VkMID/5aSRG7VWDvly9k7KRHuHQFjJcU4XEnJCljhQw4pmaiZeoe+nxGEuwMLOD40QPw6cw0uDGkR5qeJ1nA9xvc+KwFH2ETvp94D5RGfsMl8zTAUP4jndKrwIwmB+i+HYwXYq/z0s/3WMDHHT/eOc35Ctupv3oE7FJIB/1fKbQt2BqqnNpwz4N86MvZRqqrFsBCZR8wEiqCoQOjYXT0cn6+MIqPXhwNzy3NeKZdP377UQQVg3I075gFiQ4Yc8PiaWAos5dpbwq6i23ie8bpqLnoI717IMOJao958bG5nDw4ipe8M4EVaav5VNx3vl9eg2tfXoPcS6uotOw4J3UsB70HifDlQDxdbRWE743V5On3h4yWFKNL0zIwPBWG74ZfQ7vjbOwRryErM4IdFRPgr+Uner/aFoV9P0HJ9uMopR4Bf5elomJiJn8824Ay5R7wYoECOAzo4fkJrlQZZ0Yms/fChsFuuDlqNGiaO2H06CX8x1UcNK6Lw+qTdShhPwqVNu/FS1HVVHBfl9UTKzlh3xDZjn8Jof6GfOq7BYyo72Whzyr4vuA1j3nmie1qhjh+6xbqGAjgqrFzSOjVfOh5rAAHO91g+5kp8DZUCWLbjrGQSx9t+e8dLLj8CC5qH4a2KUdJ/JUqqHwWgLkj/8KoPkloPTtIMl8l+KK3K2aHvgOv+ZP4IyE2/tKGW6/H8NLvouwuHQG5Ai7Y6GNDe7WM+Erdfdi7QJfk73bx8XeicCpQhpoNnlBZ1hPMfBBGqjMn8c4lxXC7+jMZlnjCvNozFAOG8EtnLVem2cOBnjZuUznEv5cOouTTH1BY0I0zhADXtWRxXTzDX6ceCJcfwX+uxFHwt9vcb+FH5wU2ccSbjeQ7Mx9s1keykZEB7L8riH61YlipXEVndIt5k/RTchubAKNlm7jjQDqsELnKryMkIL/vGpbwIoywGs2zX93HY+1JbDI4B/Sql9KNK/c4wkQPDsfKgb/3Yd7z+AI9sQzEumJFONy8hz3HeePewJU0RymW5QYKOdpiJHxrDIGo87ksq1ANi5YyGrn8AVy9myw67tIiWwn8uHgnlFwVBpveTSjguZr38AjyPS/Iqu7XYfXrjzBmbi6kPO0ElfK5qHoMIObgLurMtYA5Ne7g+DYJt4VOgzSLLlgieo5dn/0DjcibWFSmAsb5rrTi0GrYtGYcVd6ZyMkWtWyUPI3FzGNhU68Iuh3bSS+OS8N6mROQuOUU+8X28+M5Z2Ft+yaIaLkNVrEmmJe+BMcKKKLsHDHIqhahSU4RPLgwgOVDdIisqtlqSiSZqGqzbMhqDhjjgtMzFcG8MRy13ydRccRRkJ9lyzF3RPFDQyzk7TlDK5cl0hTrvVxnOgnOFczHbcnHyCFOgcebVEDnQxHSGX8C6wRL0LnpPGdcKMc93ydBwfI4cF5/i6bnnsBz91dx8JK7JHdxCxUcj6B9zUt4f883zB7Sh82lq6H2YSduiXPjPcr3eIbOM167dyrNCEsnvzNbaEqIEyblm8Obb/nQ+GcURlkG4OHuJdiqeBJXOlfARUcVvrpvFoZvew0P1iPsL77FE0wEOMwnHrcJ72VoGcPfrydz1t9rmCe8G3vitdh2rAWYt+uzxLpmfBUfx9vbjnGUhQnP3LSGukxH8Zz455z9eSUuLJoO+17I0NycalhxzAgPRFXhO55HCZ7ncLDEk5SmfQXQrSX5haOhxeYQPjlpA6IT80EmbAW/Xj+Fo/0fs8goax4+Mw9WyLdx0ZvRYERSuLRLgO9fHs0PF7XhrmNfyc2qGabe/gPyDke5Z7o7uf7RhOS6eBT5q0FiDuqsqd5C5slPYE59KUQo/+Luc89oS105XzQThsWXouDlxypoLZvD8i71EKrwAlNdL+GIubJskXuUk6f20Tb1KbDQ2Qzct7jCkTcnaO3BxXBJ6Df5PQkAu/V6LHzkIzSYbcaYbgb3MD90m+TJ1hIu0Lz/ARscWoTn1fW5vXoAaicIY1HwHPrtbQ2fnCejgVwbqty5TpP+zsJGlzpKCT4HR1Ma6Ef8EA4tVcCqnaoQ010G2TPUuSZAgrZ4a/Og/zyQf97HgWsk0eHKMLwyHAGvFmuApv0P3J1eSjkmkuTUHESDPxoo6IYq3VsyHT6WLMDw0EaSzxWBzROBL0U+4cnaX3FDuguJ196imMnz6IrNI64QbOWrn2pBpd0CMu724Yd6D37ZMQLSWu/AgofPeNRwGbxadxW7DqfwXb03kDdiGtSHi4BGqgR4On6FpT5LKMh7N5iDC2kOHgGph3fw1LM1YBqsC4bzv2LG8TT2VovGW8vP4Z1987FHuIibGy/jfOkF+Hd9M96ZoQCBhTcA/k1G14/f+NXhnzhLMh2MfQ7SuVpf4pwMPOZeC0N/5eDaRG909LwPs02McPajGvinu493q6Xzo51ePM72LX2xLCC9nCnw84EJLmrcgn2LXlBRZBXn5payq2offptQRcd3BUCnjhr3fJYC+ZvZ3NS9Ff/NMYHgmj8YfK0Zqw7vgg9vHaB7ow68+3AOi4pMQctCnj51WEEybiWBcXLQOm43FolJw7LpLZif283bVC0p8KElfPv7m+RG2MKM/kD+9laK2t/GoWZpF3q+6+Iz8y3Z8PElOryK4KfXXS5c2cr/Xf2PbJdW4aTaOKg6voCPz1mMy1fNhYzqrzTgawjLjvXh7YxLfNLGh7RLjvPGSXeh4cRUPCw1BGN+76AecTeWmjkRaKI49M3fAFJZj9DBP5xKXPup+EgUOZv+4eF5X7gnjWjDFBkYd2MU5heeIh+n/9i4bSb7K5ylkrrt7PjUgd4UjqdWkYv0K3M0JO3T442TdaFYOZIuDXrDrp/XcKzHeB73rBFWGDrTHBM7EputB7ELb1D2jwygsTNJZzCZ9DyryEbagipauyF1aRgJOe5n5/6JEPNMl9U1ijB9XiB3b73MP7wUMFakhAWk3KmpeR5UpWyHQAlpGJMmyFYybVzpbUnOspN5+KUgzQl2xMtxJhgmXQWfCirxTZg4uD2JoYWbPMCm6yQG++/gtpTVrCK4Hb3HzYezC9yhU8eNbj8wB33FHjg74zT9ez8fJni2QUR8HkyZ9Ax23J6PRWPuUfAyR1w7jmHfGgMwtROmrpxKiozZzBeudYFFtQN92HyIfbfdg9Unv/CTa0pw4d861hE7S93T/nH+KVF6/rMPDuytxrkF58GoaQw8f22FmW6yIBuVDSvuCdM3j5Hg9OIdmjq78N/tZ/HnrmWYvucJuhQ+5oXiDNraGWg+5iUvvnmBhEZ50Jd/kvzXIwUaTbxQyKwKm56M5mHtqXD08UGKT7xIHbUqXBeqi7gzC11sD8CdgLlYsDoLnxhuY5lmgLiHmnB19Ax6WPaJntg4QfCyY7j/ejOauqXhGIMYmHVxP/e+kYW0Sy+gxSSaN3VZYuL2YnRXbcOJdW3YrfoFZu68yoJNYRS93ATe2SXw/p0etPBDBAlvD+M+Pxtcue8GNDnu4qSIo3zrXB7V6IyAYOl+UvGfB8seubBZymSYouhDzUMCvE3Fi57Jx1P7NiF2sVMAw8Vl8CNRgcJ3DuAjHQ3OmrobZoz/Th93qMAa+34QDfrFp+umwTVHYfj2nyEn7uug3+dcQdx8JwStuMpN0rO4VDcGx3xupwxreRgz+Be3BHlCb/k6zMwrg0ur/uKOxRaoEHafZKsKSMRQBIq/SMFQ/Qio2qXMWgbeHO+yg/NmLYJbXTNgj1MEaV+v5pbyK6Q5PA6mv1FF180LSMXvJNz/kU+Z/JKaGm0gKigUXtpYUpJDMX+oNoCWunr4sXwdvvR+h49sHtCr2iGalTwb/3quonXGX1jOdQc6RkjB8jtxeKNdkEZ5qzOudIf0oAI8p1vIMzYvpQpawid8lHHoiBYUvjeBbb+Xwv5+e/oWsgdmzrqFhR6/KSdiJjsap9P7T7f5IE6B5Jd5KHh9GMx6NqBclzKv2u2JLbMjMSjmK+rmNkOniSJGKWpDwpdF2C/4HU8v7cdVXiPRpGESHLX3pZor7/hAghQcuW5ONrtGQ0GHMR/uOQC6mY3kXCADrjdH4ZQAU/KwvMGGUT4UO/cmrLPXgUtju0l5sw019plS2dwPfG9cDBSq1YHn/RWYYnkSfyeH0KozwvAiRJa3vTpBU3OC8O7HK7h++yKydLgEbt9m0Tzpo9z69Ab+EjKHkhXiaCIiBC8KclCmeD93NRjSgs2TIFF7FhSdMefye8rklKoGdpEPKWSHFhwK/4aC7UOkGhnBD8wewJUfL1jGpx3MNwxiyjRZ+LuzGUb1TUH1glf40DMCdxhfpq1TB/nP6xeUtmcemFVfpKPnJGDBWVfIMZsELunCKBiWhPK+n7CoyY5neS+Di1k+ePhhLr20FYVlFXHUt4voRkgTLinfzQPptjB5lREvvlLPyxcUQ+Ctr+QYbAqNi2Tgn+F/lOF/kX38lWjNtZ30bdJlCn+1A9OX6nBRaQz++jQKjvm7kcX0at45XIMf4iPI5ucd8nd35k+7G7BJdC3ZpWpSgY0uZCwy5zDbK3h5YwctTpoIi/M/skBUI9v3GENiQDE6sg7MmKsNXlNno165Lz7zes4jbFzANu0v//jbRNPfunLemcv8b603xb8bASfXj0Qp1Rn8rLUWU6dup6iYQDq4ux32jnaGFpEH8D1qOu+Mk4QLe9bB0YZfvOQTgkHmEIV9aKHLzkJ4ZrCO/f+7BssF8kmg0RwGIuMxwyiXk1Ln4q8Ld7D/ciMc23YJv948AmaBF9Fi000+XSsCu9ciTLgUhkvu9HHKop38LVAAhFzq6KqSPN3f/giFnjvjtJqxUFLzgcjLlkoqp/LjxjQ+evI9e0vN5Oz6Jrj5YAfAmlaY9WMU/B0Rz+8uy3N/y1e6dsIL3TZ7UxaY4cR/B+GugxQ/6vXGj71jwOH6eUwY/4ePvN3MyltiQe4SsbBoKZesAs5rWomKjupw/acZ6EM+JtwYh7IOT5kk59HnMG261H8Zr6vOhkMXRtP+4BRWbxgLtUufcailB/pec6egYGVeMWYUt18bD//JvUD1j65o0bAeb76WBNHG36R5J4juffHF4ktZuCbSG7bdysedT0LpothJlLCWwfy/KqBvfAOmpBfg+pl28Pv3Urx65T38ezId5+8/zYG3BLA2vAhCfgMs/TUParTU2bf7CdxpSqT3rbYUbb4cw+amo7t3L7QpJoC000RQsm3DVO9ZdLnACOv7EOXeBFFJlDGdlz9LLjJD3DNPGJ8+s4DV2sYca/AB4qQX0JnJIbCpxZ28Lv9k+ch+thnrSN+UZDn6kAxYvzJnqcAeEKcgbBjZTWNWdeJmsSKWuBsM8eov+ETKWjSQ0YCkw9HcLjaPbH2/wxdZLzpgew4M4/vBUeYoOPVZ8pOievD4LgFb/IhdIgygWaaHfps6oaKfFvodtKZrEUZc+/coR69Jxe7VE6H+qjrXd43i2+49cMQ+mGIUtlLZigAYVbIP963XwoSVmrzrvjVMTPkCCx1Wc32TN0sPX+GnMsc5SewmxN/rhS+PwmhgsAXMNk4De+MBOProPSxf/421zR0gc5E2KYfdo695GjTlTx7OEL/OvpW6EDFnA2wQ20n9kVm488FIdDDs4tl9/ZyXN5LNinv5wutHHCo3HTJiXdAxo5umdqljqmY/+A4kYq7TRLD6vZDTXI7CvJsmPK1eAMyK3EgdrNk3sBiX3Cgizbt3+fwXF7aQK0E3q8OwS/4nvN40CuA2cd2WDoyKigCLNR/ALSOddc4KwLVwPxZcVEd2G3eCicc4GC4pB4frBpjm9RDviuTw5rI38PdYGUmLZGHUCHtO8fmHkyaZQcffQrDVGcAPBf/ge88HSr4hByfvZ9M5YUU8/LMFVm4wgFuJ8iB4WorrMqZg56hsCIwShoap32i+2i5e86iR0/eGoXqXIw61yYNS4BFskr8DH03U6I18J+vdPIKTyySoxGEszz8ezNX2krQhVhlcRiwFNn6E0r7iYLVmAtYHu8IDsyQqtlaj1QsLyU4rGwplp8D2+q1gt3Q6tUhdZk9HF45FWXoYMQkezc3FjrKRXKGvDrMTBYAu/sDr/kW4Y0AMHAIXwL/iK7h9cQDFvH6DRx4cpl1G30hMchoUjVqPs3M/kO92bc4ptAY/i3Ja7ch447sYrE0bIPOT+0mvSgTggAo5PCiinFYT8DCaxo8dW1hNfDqf33OZi4ZX4yTZI5jhPwFEfSbBqqJZbLrEF1ZNeAn22/LY6fBS2qJQQB83JHPlnlOUowfAncdR/2IoBDfJkGZWLB8eDuDxWucw0vULfG4OpC6zEXi2ajrc7fxMQrYOJGWgy4qJj8E/NxmTVkxDs/FhfEzjMncYH4NFaACL8kpxVZMeSynKQ11pLB3VDublJloUJy4N53NWkliYCu2bIAmiGeKcv/MPlS/4SYk1Vbj/7WicVT2Cto6dTYrXtvILxy1wMV8QSrw0ecHpe/R9WJdvpf7h8pYaiB2VQRJrD2C+0SqM+KdMg+nTYPwXHb68/jdND0zGoOxXoCpbyW0fddjadBPfdT6IZlN3ktBBFThfoIEpGtPId81WEoz/RLvGv+bsvU404/Bk7g26CZr7GEQ1x8HRHf8oWf0dXFQ9yCaxo6FhZgEkvlIm1wuFNDRtgI0jQrHFRx5GT3OlGblXMFzwMdjn7ueZeysgcNgBxw+Usdz6AT46uYI6fIQhP9ye9hjeAZlzF1j2tjrM65GE7ZktECkoz5PU9ND+xnNYkzwC/OT/kUiqFARofAY3jxr+tTAWxcv7OGBOMLuPzqehjxqwMFsWxha/5me+O+mdx3HQPjGBrh5ZR/6WClxu9YYsX9znG3ucYMpuYTAZaKYDzsI83iCf2h57UKbTKboh7AJ4/RJUZcVQYqw6jngtBgFHvXjR/O8s8keapp7OQPt7jXBgrT3mdf+BwvBJMMIiCjvjrCHbfD06ioTDn3hxKvhGIHTPg6OsLXmCmiHI1L7kecoJeKVdFKy6LHHZchOaUBMBmb+mo/o1A7KL/4R+JdJwYv9mfKr6lpd5ToNFPXXslq5FRarHIUGjhLZMG0sG3+1glpIcCSy7z1C9GqN3KkDPm7uo0rcGFI72c5ivCi48a4FVToQR7xr46qZG+BMTz0prJcB7znfw3OtGnpJr2ThyA1c9HIlre29xrtc2Ot66jKfarMLH44Ug9nAablAowatvHkDnkq3wxPEFmuseYFhzgSjmPL16X4WXJurBgrurWKNpEIvG3sQVl5zwzW0TaBD34P3O91i/9xvKOF6kO0u04OoSAZx8uBQl7c9i3+pOFFJdiK+7f5D7snzcXNAJZ27Hw9MuEfikqwNfz5pTuacJf/5wiP0mu3OQqCdJvQ1Br7GusNn+Pl8YKwnynsTTNjzkS3qu4HtkDf6VzwXDoRbO2tvJwTFfqeyvDt27LwembeNAVGeQTGWkqXh6BdZdXI8r/5tEFe5z4I5gP5vFhMG9cEswOD8OWvbZ091dyZAoZU53FfwR4+Vh6NgdjAz14OAHttwyIAVHsqzoekIybwUTOj9cQBOb30Hdy2UQ0T0GrDoqce2IOzTSczL823uOFD/fBrvVE6il7wglZCjyXdEPsGS4BtNaZkH71idQ0aYN8zcL4cL4QczZYYPP6k7RidCZqKXpjNnDevjoUTxfVyjgMyoyYOMQwcI7dmBv3B5+1ZtDw20J1JK4hQ81n6FbM+Qg8vdnuO5hDSK3FCgsUZj6lt2n8PENuO50IhpKTgY5Jw9YdSUFbBcWQu9yUzjyMJiH5k2lW89H4LXW83A/s4ltDp1CX4E4CIMnELpqBAn/1AJF/2qSqEgDe/GTHOrjhIs+NGPrr3YwwT2gvcIR5IOPwZ87aiC/fjSZLF1Fg95DKDhPFGIb1GBDixkY5btAx4clJJA/lQLnjof7QQpoWmkJdGkkPjovx+tW5ePRs6tA9XIqZgkPQNL7q6Qy1Qw2Rhmx2bsMNElz4HOOXvjN5wMtjslm2a5xvOKfPyw82AlFeXpw+79AGJeSTKP7pqPgSzkOitdF51eASwPzcIHqbyh12IK1T4xh5/N6mJuRAvddZ7LoRVN+bSWAh6wvwL23NbxuxzHs63lD/mMt4KJ2LrbsW8leD6NAfLAPQkr68KBVB9l8CsGu7Zb0MO8Stj0zB/jpwoXz2qgq7iuvnpWKyydfgEMJHSjN+tz1zhazV1ZDRrQKxMk2Y8wcMSx4fxPai2PB92oXVsQeAvHJp0lzZjgeVqhDw2wjWJ32H2WEHYKlI67SbYeb6DxsDEI+C2FHbQYnNgeB0vzbZJs4CY7rHuD5j25ztKIn94acg1rPNrKwE0FH82Gwsl+ONu8us8pMhruPLbE/aCVpK00AfWd5qlc7QM3a+/BbQCesd75Erm6XabGdLgyXiHC/VSAXXXsArm93sNDiOdTSfBzzPMvo0fFI7pV5D5JSqrA7NZu1Lp3BJCklfDu5lCoqjPlnsQJ1mafATeF1dFqhCQ9XjYQnGx+i8bEqUlYSo9OLzqKCthg6jDbld3Z59KQyhkOad2B23P+N/4Wza8RovIgIGm3ezlvsO+nDZiNcZD2BThx3hpM5/SC14Dy4fFIB2WVSrHn4BS3z3YgCPqOhZ9pVXPdkHSZ0WoBpYxxMGJuNqUclwd/YjC66nGa1sk7Y+k8X7gtJsr9QB9Xe28JzmzxBVH01248bDQd+9dIPbqCrOtMguPMR7MyoIOH8bqSaKWA9fw4r7PJAjbs6EOR+C28GtcOmhinoW3YT++aX4T6NCSAPV0Bn0B1roBzWHJSFmzDE6/RdETTPI3jt4u3/XrPD6recMKUZZtt8oVd17iiVJgKt9fp0kMby9piFpMT9EBWajqkPVWinqxKaLexmLWM3cJw9BeRE73LCtVGonBYOlZnlMKt4JA/5h1NfSTsIWvfT9ABbMro2BZxnRtG0dRoY4x/JeYec0eeeGq/UXY8HPmbCuIw7FGcTSYWfZOFvQT5HWmfjaY8+Uud5vG2VE/6ZeJeqHu2iu5s2oEFmD3330YBVi3PgREMW3kppo75Pbjh2SS1uu9eK6cN3aGnTN9xj+geEE80gMzqWvx65Tq33GullWT6IPo+HZYVzcWXsMh6vOhvsm77i7hxJWDNkTm89nEFz234utajgVfrloO6Wg6Kbe+mKNfBlrVa4d2EK+M7ax+EHsvF07RUukFuL/n7X8IDtUVzj5AuJ1hfR6eBFsNQygZ/ha/lwwA7U2f6YDq/8RwFfrFhQ+gpul9xIdnveYJ19Gb1cqwp/Lu1A+bjZSDo/+ezXf7TsWzDa6MjTvfDJHNOpAj6ZYRC3aiz4SzfgPbjOYz6twKcnskBXaw4NSjjjgb1veG5dPhQ9VKBqfTVo8BvPujVm1PTDkWoGquj7DAHIvyPGuedMoeHSPL7cnoyjZWVgT6kdSngncsSF77ha8yoLy//iFn07euI5me5VX8WeaEc23i8Li+YV8tLz7phdUQuGb82hqPcpTfxxkUd3WWD4a1Fo6HrEKpOE4FebHChecYDBRm88YS3INy1T+HrCFlL4m8k9RVFU3XGKrY4Jw8DlD/TIx48sJq6jmuxSjuq15/KNh9j5VS6/kc7D8moxDM/Qhi96iNedjaBgrxFKVnwEr/nzSWb1Jpx0fhQEqgxQV+coeJCnD56xUuhfHwfvT35Cu8EFCHbK8D63hbekFKN+zVKs2DmVFP8awcr+uZzWfpBEbySim+oolh31BX2yz2JHsw1ZaSbT/KEYKliqC6mXS8kq8jXq7HkKC7SOweb8KKy9kAQLpmjg0odBfFsiFUJ+a8Bp2aU4/bgTTCZNKseR3E6+vHh0H8Wo3ubcTl2cnpCJry31YO73ehq+YAE/xkfQOK1JWJe7HUyPrONc4zb+7SGGPzclsFSHNpRulsIkoRQ4fsoUNc0uwC4tG5Q5n8JCd31A9vdC3Nazn+csmQ4fEmzRz/QJnLqgSd0qy+nEYDZeXapGKrQbUy/Vwr60Hv6ZLQXKS3/RSi9neLzOlI49l6XPmp8oI8IIBTJvwpOfyng/ejaPfykI7nHhsC1Pkmz+3AOBFn3oLJiIeT75tKzUko2FdnJ4+Dko/jQO3qpIsMy3cZzcvorX2S2H1icveNGGiShav42e53qQq2oD1OwSgrIYd1jRZ0sPDZTgz5e1eO/GYiiwNYH2Bzvgo2s02s6+xuMiCM78OoD7FX/jySOWaGGsT06Kgpj5cQh8R2rC9lVi9LtiPwvaToexvlOYf4yGB/7uJFsTy5Uz2wkWGyN7a8Evm6PsrxaAV9RHwbbFaii7wYM/rstF1XUG2FOsj28DElE4dyPpJ8vQp6QjsDBSAGKzFIAu+IPqnxSKNlLnXR/6KU3JhdefUaFPO85BSUQ4XhMieKfxAnPXl9EeL092v9oD2t9OULzMJij9vp0VOqzwwTcVKIjQh03rfFn5Qwh8UZhFqncDOBLNwTI6DR3PFAJMnAZ1DSZ0fJM8CIt54LOCxTz25F1esO4hmIem8TEdHT4m6scrno6kmK5YtKg2g6m2WzhCcTFdyzfiFwWnuUZEiT4HurF/dAqKf3Fizp8FB6MEIK6EUb/YCE8tOAyzF+SCK2bi4hZTfKNsyTB2Nuz100Q5I1kIFDiLHsv6YKdVMDVlvWQ/51yu1F1DY+XOYdGnAOibWQ+fK7UhM3s1qawM5bfCv7g56iWkLbxEhzeIQ2/nFR6XNp3PeJbwjyA5iN14Ft2UVmO/oidLRQez5AYrNPlwnH8ue0rDVw2grmMLRJeYgfBrH7pWLIrvii/g3U1x2I1vuGzoOo82FUV/LXvIspGEpPcaEFw0AG0Jt3FRBEOW53IoMuln25evQfhkLZyZNg0e5B+DFdk6oGidh2Z5Jnxhizov3CoNyqXGNDf+Dv6ZXEyWegvI8f4OcvNVBAHdyfhojw4JQBhHbxsGN9kOauw/BlcNd0FQsCmcc4rmA48sIJ17qVb2IM2QTocfzYYUG34VJaTSyMl8MyleFKbY8+kUpCMOIwM9sTZ0OtXFmNJh80ia1fuVzvBrNNn7mSeFyILZqCrWEhsFLxdtZJv5+lTrGcKHv1ayxBEzsv3yCCaOvARai4+AX2kH5z1m2HpVBAzr/XBkUzdmjavgPD8jzv9kyXPubgPfgq1gdTiLco6rwTRJB5hUuJ2nHRHHOv0rvNZQDfcmifC960n0/m4PFnc2wpZvCKFffrFEw3IOH1GBv4+3Q1LjZW4Y8Y7WfjQHr4sTyVlvKXgFyIGwdBA/FlfjLEUFqNGxxA4rQxzQW4jKR9exouQA63ooY7yRBggoIsIeUXrsW8K7Hn8D9bIwUOu7Twnfr9P705W46rIcW+82gM2fUkHtYxFt/ShGquPtYAWvobdiLex+iHDJmExUrYzBo98MYEGiL/+Z5wOppcmQG3sVTXIl+JPJT1Ca8onnznbhN6ucSOC2Ndh77afvYQ8g06iNRmychYqPhqgyW5p9Fz+llIop7PrVmKyMxaC3cCGp2XfjKZXnHOm3HT9tMqGhwfOQt+0ILYGNvGNGGa11lIOsve681PInhy5owf8UnsOx4qOoVLUXvBwfotbfxai+5x7NsNCE/34HwhxehFpXgGcnr2cl7zbQ+eyMr/zq4VSxOVW5qdHp86rQ+58XfioOwgCNE1Dx3A4OTQnlL/Y/+ULtfHAwVscJVd6gOjQJ3odoEjxu4QFRPS66tg3fzVjACj/MYfDfDAyY9RPGudyHiEhRMGzRhOwrmQQ7zKHvuDx02V3EDtc4cEzVwWKD7dA5dRbuvWUEgsf7QFlqMiS/0KczvQUcteYgtk6cy9/XCdH3Gd48k96Q6mZtcJg9EuQ0TMDvmB8nzD4NQkVSmNW/A2aOzQc961fUXR3Pn5NkIcF/Hrtv1cCfplI4wcSRul51w776tfRywB6vybdhWZYlF2/VhV8brtCRo+24dJMtNZ9056A/lbRMlKkss4LF04ClZwtDXLQI4DE5CvzVjU7Pb3L/3GWw7OMBrh75lXf99x9cn5zJSufU6aPZCMi7mc/zmt/jnDY1TPsWyNGXd+Lhw/qUO0cNJdWQn2xQYmVxRXg/IorDvoTh14F5VOpmQqt6ukjn1ySeeMoWEpPE+e/Ncs6N0IIbI2pYeqYe+rMnxvv8onGtzrik4iJkC3TTD1cF+lB2hs9Yi4P1STGQeOpMU7vnQ3mRN5o+ECDR9i7yWuTHB92XgNNKFWierAD3KRyuxjpzrD+j8DfgLRlaNLHCjKZ1XsOysiEaUs3B0D/y8PSzIdTLvSed9neYevIfxm7KgZcN2iwTcB1ed7TTm6wzXKUoCrcPdvOMSDmYpXGXxOfaouy/aFLK3IOfB17DrS3prOPTyfVSqhAb7QyudyIIPazRa48OCbXX0hGBBOyX0cHa2wkw4vwnDFeZBColb+HE7FfoI/wC1X6a4crydyBd+A0dcl6C2JzpXB+eS01T5cBhwSiqzlsBsgbH+L21LxnPcqALbc9Yz0SUmtcUcEFnHinHS8Ni1cX8ceET0F8XgveWSOH7La2QHDyaigV+UryfGr5wCoftF0Uhw8EMpy76xI8Nt4L1/QQaXpAN5xaPg6+yYry8eCdv0y8i73Rh8NpyiBP2lNL2rGJ+vf4TLqp4D54ppXxh3zDNzB6EzmgtniUoAH+mi5CQhR6Emduh/dNqst79kA7O+kwDq5toTrMYRoW/hHUTCSYpHmfdl8fJodKS70r8pK5H1jghepj8UARsC5/TCfXFuHWsGowZLuOvqoWUb3WP5ct/QkVHI7t+CsPBUkVKtkbU6xnLm8IZFMWFeevLbRiTG0vnQixQrEyOpEpEQSd2GbhPdsVZ34cRZeXhyFFl9rSspzHP57BS0UmaEHIJ1m2Up3mhDiD8JJznuq3lpxMYbE83cc3etThLURkr01MwY+MaHPWiiHZ/HsZ/7TNhxthBXpSoDkoi8lSxaS5vFyoFWZGLNM/pNfEVHy6XaYOYyX9A/OFUnHldAp7Omcope11w3cwHfCW1lcaUxJJwzUvwt03E0hYVWFexBQplJeGgfyx9OLWPrnc6w/ln0ZhhFkVVoMmGDXO5E65BUeJkvFIwEUToEUQtngkHtpXjcXOE3iQGz64wXjYjngcvBqJ0QwWXyghBg/gHCONd9HBEAu8eX0W/nr1Gt8Q/8CN4Py/rVEOpnAWkKywINy/48gp9f1YuTSbRzzvJYuJNqNighy/99MDGSo2V/ulwwEVVuCP9Edf4yrO0fQsfj7Jjd391MAww587wAcw/e5YT0wfgaLISzDO/i+PsncnRfiLOcc/i2JVbITW1l2PTkUbu7STV8Tlsmj4VOqtUWS2lkJ0nBHBn8z7udt2Ktp4WqLBaGsRXmEJOsTOG7baEzWUpZHZXFL/ofIe9B1tIulWa7+pchjOPbuGrjWfQNeAl/akSBAXfdZgUtIPnywO+Kq7DlaaD6LRHF/ubA0g1/ADNTLKFP9sMQbL1NYck6dLZoWo2OLWD9NpGkvH9ndz26zYa33pPhU3l5NckDIVikSBiehYS55eTeB6R4IMgknjcx2tenCHR5Pc8Z5UP26VLgNOmn3zezR1Sc8/D2NeC+FVQgU8L1aDK+DoYsTEYe2VWw5V4gEBdY3joXMDVx9ywI3wSGGITjtbYQ3dfuYFjahqn1ZzFB8lGMHp1Cn+oegxfEvPIoGUMaPXZkU93DsbYI7uN20J+A8/xYJEZaI2dwQ8uykOscCDvCdBEdeuzeLVdg2pHj2U1ZWGccjcKc6sN4FzgGXpU+QZmNW+DX/8e4NnqaXTGr48y45qwO7GG5vyIIuc76nD680O6ljEfbEP3kvS7v5wmUc/Dg4F8/E0rKX1SglLIxuCfynDe8Cy8WayL3bubOMMWqNZ0DQqOmYrrKn/x6rb9/Cg0i0IXT4ezec/oXNoYive7A0NejTgiyh1/HJzMI4H5+L0W+G4vQBKt0+G4hBQW3pKHkbcFOexJC5WWlFOi9U/YBB8ppXQem9WuwaLRIrAxbhhaVu8k5wlPsCMggqTqA1g/LJ23Ld6MmUrZYHI/DO6cl4KMaeHUezKVG985gdXK3ZhlJoaF3jXAR6zpX14zVQj+4bfHTcFYvBHlVMU47OQiXnkgBw/5Z/Kei+/h2NtoeCaSSpabPtPJa5bQu8eXn/gcwCxbG+7vGov5Lu2Q3PQRw78up61huZy38ykkilrD1noD9nrShDONC9F1ewlA/09aPiCCq8bO4LFdt1F/oh35ORrDZolD9KZ9C4kNplOTzTIk/27wvA+YEnqF0wLH057mN/h2YDSYqD+DzAXD6P1QGpKaZvLUnHJOe/ePhTzDeNXKiyx8YJCLMqyhJbINXuaP4Mx5yTh1lzM25vwFxdRrZO9YCdEXMinGaikbjJeHDwZz0aDKH2v/OYHJu2XQ9teOnWrTqW6cKMqsTqZj25L4zGQxCBmlx0vUHvGbD/WYbHOEw2dLcJLnBii0bwf911XUG7sQl6pMhIOFDpiHI+Gf0HeIXhSNWZvPc4b2UoibcYtClj/GRx8uwC1LAAflJhiVfg+0N0bCtDtZUJVkw8taZ4DErG98a5UEPgmqwnkGVnBC5REaWV+ig+QJwdmC8CHJhYKcU/l+wizYEFCNNx5+4xfRyhD5VJHWB60ne0NFWtk6zL9kNPjMvkVkTFE4+7YGfUzwAJcSCZgzUPc/AuADIAQECgDoHym0KUWlUmnS1NKSQioryiyhlGQTKYRCEg0hojiRJA3RTpQ0hEJKEZpSoqzIPZqaJkaNTzdxv1IQz8z4SKpxTuAYXA2l/q08Pt6CjlfpQ6pJME6IX4hHopQwa6sH9p3twAuikSBSOgbu/lkL50U6eOIjE3CKXYBT5zThaJtBfC38mJr6m7FzjR835/qz750LeMD5JEamCUBJ6kmetfY6CN9NoP44gkDH9Shi+hqsFG6gf4s3yPVY4xZHgude1SCh6g4c5Ejhtz6yf9UyFr9wH8xqbvPnwjWQnN4N9a5WkG2qyOUJpaDp8o0Pb1+HSiMbYeGwIc/MMSK3El247ucLtzcZQUnhHXqX0Unt0SXk/vUPHuuqpS6KwbXP70CwgTfuDSK8qz8SIodVKCPhKv/4tJ2fPdzJUrGToSV0E890nc+Ln3jz1B1q6JmuBj3aZ1A2qw1W5B+EqDM3aWCXMuX7juNrYavIky7TBBFT8nxoCVnm8hhUU4dLdkfhRYPpsPfLPDovNx0OzXgOdtojsTRtKYkq6YHCeAP8rt0Hz7Vk+O/HHJwXzeT2qJXLRIK519kT/10WQOUp0jDt7Bs+VqGKxToa+KLgNMcqfaTrh+MYgwqo79tX0Fj4FT5+sYbWVXk4K7uPj63aTuqHVlGz1Sz86zgX/g4PcI18PbmF+GKGojLc6LlOirq3uCZABZZcf0HOh31gsYQZWS0KwwT5HpBM2U/ZQwAFE/pp+pgc3mvvzo37RKn5oBjK2+vDq9fjQfBRIGh36LNduwXYK+TAPP82rLxwjsL9PFj8ahnUS5XQta1XcEV4HCaK/Ae9ypawdFoFri7fDN9C1dneUIFvGG2g3KzrtNyXaMOambhX9hmFrrQCRc1v+MLQDEd7POZyxWpc1NbIf6fMpoHabmi27ye1k8tA20ADXpZuAEWFT7hDKRGiRorxcov9kNLthbODn1NT427ojv2B9nmisLB4BgduuEyRPad58v57YBW7Fm9uGwGxJTv4rUw72oy8SymD8qC1J5UjPVfCU8V3dPq4NZyLTOCBQClYbnmGJq10g/OOwvRmuRV8F3BhyQ2rSd1HBQ1lMvmYhTda6Jygy5KqXH6okFRfXCOjlxoQ4GxPF7K+0Znvy8m3dS3c+rqWIw1UyHXhOxR84IU/j85ETXdZEBh3ivZnHuI+q9846aYI35NIosrgfZxk/xGCnp+mwoZswoFJIHrEgR+cHcU77O7hpY5IPFFVgfp9p6DceQXbHPmNZUF/0V4P4dxRUz7yUJXUfT/TRV03EHZzwQ/HNsOIyzIgqltPmS7WPDxCEjyTjvCaMAGam/0FbB1NcZn2Gphb3YRKDQI8a+kQOcQ58M+zI2H3gyjessmLNnX/4LgF5jyTluBLbweaIt+AvTun4OpPYlD7ZSQ0dQrSyCODqHStkf/tUMDakmN00+8MDLtsgda6A3wY94ORizxs2tADe/sSQOurPk0fGMt3ptfgw4vRNKalks6GepKY3W1KVBsHpgE98OpfHk3VU0cNZU9+dycE/+il0mBVEV44/g7MujqhWU4B7P5Iww+hC9T5UpckcSUtcpclJ7OrMHFcNe39ZYiR85bBV41pkOV7DA5GhOOmIxvZ2fsgpSrHs+mefloYcBTn+e6B3gdf8WI1wU7XC6gQshi/WSpA6dOl9OffHww7EkFnMg2ob6E0xo+dCr/ipGH18yreKjEGDju40929XbRzUIBNb+WQaeYTHvXNFwzuieHkeXLwe0o4dHYZ4b0eB/IxTcSV1dKgJ/EF5RbOwYkTQmCGqyu5S+qC6cgnlPx7Kg4FXMGL4a9ISEmSRs84CNG9h/m/gxrgKbGTt7Wrw2xfHfAc9KAvpX40Kq4IrnR38ccZfzHSYDF6T3XBOSF7+QpNhv2bbvGA3Tde99aCxty/T1vOerHs1i/o8y6cVNfco+iJm6m3RQyatCXAcel4cBGaBi+q3fFl00ouy91PjzwluUXdj1YFrMFP4dagXO3AMg1vOeL0SNjs6s87htrpT50bFl07xqvNpUGRjsKNPE2YtW0Xa7bvg6+Ssix1KxkDEyzgYf4QKiTXwei5o3lB5VpY+kAHfl5LY8qz4Z8LmISf1uA8JVPsmG2Pu58socnvlcH1wixelGIJjk8D8O3FcxQfsggyvNzg/vZ1XFNez73B3dz6hHhPwXteVmoGRQ32uPX0bpb9PIvGnNgOsqP/UvEUcyi1ukCKhlto/v569D41FZodBnlPzUVMPXSUVU/pwBQfORxjlAM91Vr4QG4umC0ohqUOehDzzoNlD+liip0Fe1cjapmPhkOnvfnt2V+sv0WZjs06TN2NKvBVNh1i3L/zqgN6PGXxQt4gW0en35/Ega8V9FvXDJyqRSkmxBRuWe4GpSvm6NYeQRWr9PFXXxatnv2CXWPzARuTwPzXLtpgYAlmJ2Jo2pJeOGr7mXan9fNe4SpYv64RkvMbae2nKaA0wYx7wwXgzdgY7CyUhSWzxvG9l2kUHLGBo40zeE3RY5751IxtahRAJ0YDFG2U6cdWpGr13bxILInXGnxD41YHFP2RivO9TuLRdGXQq58MKTZDcFKnlKBBHv57/Bht5k3H9qXvuEBtFygtvwylufKQmW8AVjrf4Wn5dHw2+SGaGvewl0cUC5+9Tbf+c2B/6+tk+dUcp52SA1XJh5Rmpsw3H46BJS1aWFt4A0wrjem/Jn048m8Oli+MxkpHfaheOIGeHK7ClX2MeQ9X8b/kYqTPH/CAjggLJsviSPPRfNlMGkQUl+F4v8McoLqYAhVU8WtKLd+cE83SEAvLYhjfHrPB/TunQ0ujOCe+vE/BBWl0t/QOFNnE0uKHIWQWuI9/Gz/izQpEF4eN4U/IWo5408z+1Qkoqa7MpljFl7WEqEx8E07YUYCzLo+lJAV5ED9oB61lIlA6UZq80l5Rfcxk9nlehVGVMlQpIcKvn8nSlaUq8CWxhkVMbeDGqTOw78cxxt8V/FH8IvVs387NtTtZ03gpvZARhe+bi7hm7Shofu7E84qduXGcO5bGxvDWOT0ko5NNl3b+5KHfmkCZfigQOw+qolvIpYFRI+EeRabk43uH57igXwr1j+SCnKYiWLXNguKmH3xt2l0K0vpLgycN8Mx4C2jOraAfUjPwxPtdWDJxKsSmufGCv7Eg1yHLwYURUDRmLMf/QfKSq2BpaGK1osu4vNgAjA9pcfXSepi9T4XWT1gIfr/tyHMpkJVAElRbJlBSjg1tuCoC3ldMqHX1bH4qPZnt1D5SZ20h3Vz2l168iqPYMW4gUzSfi48pwX+bYyB+uj1dr/Ii281ZkJ8ow97Xyih0xl7e5LyEIisHIeWpKfx60gERB4YxNHQMa5+JIc8nR/hI6mGcdcoaHPb8xqKjkWxqqQ0Nh93IZ14tF076zX/NW2hVw0t2aIhBd5VO1o1YwbIvrMivVAXqTPUZylW5zL0Nf/XLU8AKa9z/oYhf7urjU/cdUBvmUsUfI3irXYd3HIVAT3cevEz34iXXt/PLNxb07/dVvNMrQZtWn+fLYyRAJP4eGcm4ck6MB/3MS4ApFxjbXvjz0c+fUPb5LT4sL8yr1k+CB34y0GQVRuKyNbTgfTZdHvkfXBx9j5+1x9G791loZ/uMZjSKw4kV6+HbvSUoEq4LGgdmsvPnxzD25zNc2Z1AL15rkeOT6zDTXB38zLZAm3gLay22ZHEZCWhtb+AVr8LJ0iWW1W+00kKcD0mRktCtk8ez51tC/4AQKaVbg5lpFxmIH6PytS5QYHIcw2q+w4J4Y7BTroCDgbLw7oAIsasHXLoojesuqoP09E0c0BCJwhNfgvBTA9hjuYZ+mbTC5z16kOs8GULnBkBn2QT4nmnIgomj+cMuWSg8YQEW5oi+J4/DiB9TqfLuNBh7JQL2l6xA54fmOCRVgCtU/XDcZiHoOePK28N+sZXQUlbde5037HfnR0J3QCNkJt8QCuADl1Px838GUFE2FgSt9GDq7S/w5mIMCXTLoqbXR/bZ1o03nj5i+7fx1JOOcFvjBd18RjhBsxUz4t7iL9ev8Guokd0364PthLX8qfs3uRfLw4rvSpj9/RuMFwzD9XX3wXJaCaXPL8KVS83hbPUYWl+px3eeTYb5A12w8d4D1v4zDDMV5Hnrrk+wZn0X7e6yZn+JfXgg1ZZrQlUgrioUlW65wuzdI/BW7UX6PH8Bz3ggD1eVPiLVdpC8RC0kdgtAwiwT2jj4hsWG7SjjxmTKui9JWrKqkCNgys6BeajrPB99H4qBQ9tTTLx/n1b+aAAPoQO0s0kYW8aepMfCWRARtgwWiAhg4XIL4FWreIVyGO54UwjG37fB8T3B6BH5B9Zf0wAh/4t8+t9B+OusAdMvO/C0hI0Y/+gNp2+ciH9ubYeJiV9AZ7QRJ8TI4O26WJzzQRz2e+gCOnzm4nUTOPH8FW6cMIxXt8yEGg8B1pbqhAHbBNh3wQBGtyvwm+ByVHrQhjMv+uC2a04sXDiJogR34enD01GqvBkz3bVAM/QvhNi5YMaGuSCs48kXr+WAZecWOnmrEZOsAmmgfwKd+aIK/7gDaque0c0f+3BK4xArrrvD22c/IItiUZjvI8l3hmqwq9MaBC5eYeEN6fBn7HtwTR4F3h9CwPX9LioJKwfB5ttwPk2a8xTUIXeJMea9EEW58emkXrMCQxIjMS1wJzmbuePL7wpwyKuS/k0VA5GZVZTcPR9icj5y0/5AkFt5EIfv/0fv972D8VLFVBB5i2rnycKV1zngK30Nb32/DxbdM/mA11v4fW4zVqoe4PidQSxcq8vRI/VBeN0GXN/oixebLcknzJuKsi1pn7s3ucYthFNWrbDg1Fuyc1WDZ4+6UDfgBy+3Jxgs9cPlzocxp9qM43pWo1TQCX74tRYG/HTAsW8JD5e9wEuXvrGHXi4NbrWj3p/JlJFdTmHGEVRSrAk/AoVghPwOuiuciooV0VzzSxfSJg9DrtEL1mjSIw9lRVYerYbzjNUg6uUT0nP5TnMqx7HitwF+6+OCe25+oZ317iwoOhpGXkuCCHtTOLR+BY669oxefT+NRf+5UeA+G+wxK6dlRsuJSQGMzSyoxkgUXB2CMdT3Gc5yWoXiyW3w9N8RdJ65mp5e/0wwxQv/NK3nB1nGIO2VAkKlQjTixVx+lipJ21+JEr8eg5/D4vHoVi8sHKrEL/eswCFxFpzXM6E1Yo7gNlOcaz9Wglb0cTTeYcFrdtaT0/1+qsoXBXe7CO65tR50Z/6is2sm0vKo+/R1rgzEn//B3dGTQCo6B1MDFGC+Zzc/C/DEA6YW+O+rLJftLkSPeEn6z6gDr153hQnLz7CHlTwMWd8BxQdF1PegHGcJZ/GlD4qkffQnbrhRj8sX1GNptQyWlFnCt9VC8GxpC64zbgJx5bV41/cOb7TZi215bjhaZBiWN+yEolfi8E/UiQxiTtJUv3UsEXgdBGKt0FzwCsXt3Y0yHiUUP0UIP80zhUT3C9Tuuhx//jCE2uSzbOY0A4V33YVWkUDwz80B8W8SKHlcH56Mf4exgZtIyl2fs/psKb1xJ9nmJJP/PjU6ffg2KIlL0KTjE2D8Ojc2s7gE21R2UOalk6i0biycGfkQG56EgldOLE/P7+c9O1UgVkYQIgsC8FFBLg9+q4Wf5zzRsnkij+uzoeulrWjTtRsc/42A5ZOq6beFIu8Q+QYin62hXCEbwpadwXkzn9KT9FHw5JoC7X43ERaMaME1Ozai0cG5oGAXTr9y3GBQzIP9zedA8LF1rFT3DStDTOHZm6V8W+cNbA2YAPm+E+H3z25SShnAIRd52i29HA8Un4eDnqqgc3SA1r7cB/1afqz5aQhKDt2nwNh8zH5XwUGaldgiuZ7+zhgNj66Xw4kzD2Hy1SXQ16SMq8IdWVTtB5qPLiOoewIth7/yeAEZWJe+AgRWzkPFVH0sKkkgpaLr/HT4MD3cPMiBIzpYzboF9ghIQUqvHr9W/0r6JcUwIaSTN17bjxVdnzlaZoAnVAWR6cEhnjMPIdJzBg3VGoJhrB9/92/mU0csyMFdClYUXkWjk4HUoLwFx0chuLWHYcQBCawI305LQ4O5UHQNiQQhdgm9wv9Wz2H1x69R/+UoCJ+2nG8OFeKuTbakmpjEq0VVwDVZkFsPhtG1s0fxystmUOtA8NC/C1YFg7wvbgd5XqkApfv9eC0pE1s7V1Bp+S64af+EX9Rowll/D9i/WA3sj1jDuV3n4PfPmTTlQS+Mj/DCsaeteUeUHNx2N4Jzh46zZmAVf10tjsYRSmD8cSr927eI2+WM8cD5JvK9vIm6IiVAOvobp/vMo5rtyaw0Ph5eVC3jrqPAXUsX8ImABvwe9I9PK8mD+H/aPGN9O5mmjce4eYbwYrkCPVrgBrlLA+hksjSMqHpNx4QNoTHTlSOG38Ldw7/p5J5AkilZi88zG6Fo6zY6IzEb/N+loreoKgTtVKXYM+JsXT+Fpc7d4iduttDi9RE3WT3iqmlLaK7OA95w2xwMw+7ifMkGMrRbT0Uyymg5/wRPnlfL9SPl+YnNNJybtwAnTpoCfygPRVcosqZ8BX7KmAWaal/hvIw+mxZsAtV6V9zetppu/p4KX92u4/yplZg1JgokPAYhtMEbZm45hrLzN1Ls3TFo5ldN73+oQ8Lm97zv5lyy2nkaRi2v5+j4qfAicBqGRUTixVYn+KLaQX9cJ0Gt9ikeX/AObTrT8MAJCQyvbGL1yLtc/EQDHT9WUF1iF698KwGfO0NIuHI6TlKdhBMoH1pxM+CoDj6qfYMk7f+Cu04+d8hoQb7qNIo+kgaTTL/gr28H4L3xKzzV4QDSt0/whWWT+fNcQfKbNxneDAyx76Ij2HM+kdMzOlDabRHpO3rh3pR+yjjwAyoj5qCGpyLsvWmJfSyGRZfCscNbGDfeSOW/qwx41J+RlOTWStc+HaQ9+ZKgrLSIct5a80LRizyq/BYt0BuB36IPclDmCsjdXEomhcU0P0EbIg7MJCMtV/iQd4sfewvA9nt3+bfjWN764RBZnrjEWSFpvF15KoSkT0dNj5Ps11CJMTIrufpLFLYor8TScnNKPa1My0b3UW87wLVD+TRcI0KKX8bSvmumdOvOPEjTyOIV2/3gdM0lypNYSQ/izaAu+BPb/reMdU8rQIx6PscO3ySHfUdAdPYMOqhzA+bFFOOPzLEwU18bNJ4MUapdNbmvygeF7wtJcfEuvPjDCZYs9gfrzEXkeG4iBIzQZhtlYZJ6aMJK4v0YdawNgm+uBJGVgTjSaTHrHxFFKzk1eBDYQrdeHofBoz9h2ryVsFGqAHQ/AS44pAYPZOfQ8JJush4SguEVPrzqgz9nKB2Euw3e5COdwn91TDDvjCgprovAyICNKL1ZEPxCquDtiii8ZnoAlsaF8BGXI/jnuR89E98H5rrr2cmxEMQ2CEGxljw+f7yYSaUTZD/mgmzbRVAfmIjouJI8XMTgus1pSGA9UN+lh2V0kk+NG8aYiXaslWHK444s4aQEe/CQt6J6+UCcEWAFe5uX02ftc1DzLQGPxlrg+SfOfHzpMK86dxc/6M2nlwLyZGknDiYNJ7F5TyiZqe2iYeHXeN/ViMTWfaYr04Vw++wKMg17ShPuqEPAiGJqdNpIQktSIVxCDe6NtaR9e614wdIYWleYhT0FHeQjSbDQfQ6MTpXHlvRY2LvLFHbnb8EBpVKcf/sKTExQgZ+GatDZNwIqTQiat5tybuFESvx9HE/qSrH1lV8YI7WCJhy/COudhujI5Wmw2DkGuxRVUVcinPqEd4BHaTDOclaB+bcC4deIV7g4vhAjD4qB6o17cDf2Cs0ONsSvLrkwsdkQ5XwD0Gb0HtbvvwaN4mLw6Pc4mL7Tg2d8TMKEFDd0ND7BWmZC9PrbTnY4GsLnK9yw9pAuVigy7BLO5AMHUrGp9ycECdzCBybnaWvHFYwoCKTJqlLg6ruEfPqEwW2DNkX0puPqUwH4eMUFDDAsAtc7ylT+exhmmV3hphEHITdcBQQH5+KOnHwq/E+bSuQ96OOFHjxcuB4eud7l8/E3aOV7JUzfBpBkMhZ3ePbj7DPN+Lm/hQ5dm0IXw/bCpoequLylgvRXi9GDaWPB++8m/ndBFjSeZMPh6yHw4686zIq7jiWzn5Ok5VHQCFZkGzcV6D4eDvv+M+Mb33aSbYI7nCgb5GUzttBwizg/hyNcnq9E6b3msFezH25FbQe91em0te0cRondQMfmTPp9KYwmnA5lQ8sa2GE2EsYtEuM3yLx97F9uT/uDKVc+kYr/de681I7CrWPJ4PRI6LYyg6kODnjsrwFV9vwFhxBHmtPXA4tSE7GyfgN9uGkO9trDcGy2IJw/+RrauRQyBmdh4mUtvjpfgtP7p1FR2G2ovXMYrhcIYarvNEh7mQxXf0xhu/hllJtaTIqP4ti5N467lCLpSGA9aJwsBvlgNehf+QFmPxiJfiGrudc9BQaKfEBqKBEcdlnSqPsL+PeoOby3WgYOSz6COyG2cOObLa37VQczRuvzMvU07t3/ApJt1+Pu3lU0ZZQoFMv+4ok/jWFU0j0qXq8MZY+fg+exLfSl055/u+3E0WUr4cS+kSA+opdcAjX51iMf3C4iwAlat6h0fAXuVxXBxZJyND1sMq/aLgkPnB5CX9VqGJWH1By5gx8rNMH73YE499hBWqgoQN9a31PdURVILvVDq8kT6GzILHo35w/++ddP2ttV6FGEEDZcHYMHaiaC9hQjOCHsSRkub+FjXifefn6B4z5+wVy/PTA2YTkXHXWkSwVfWFlyPNR+9AFb5yJU3XyUOXEXVeSvwfePzkNUhjDkhabDnx4VsFSUgA2HftNpAXnuWLSPUUQO1haOw8MBM+hmiCn+i3nDArfN8MV1EVDv3kAiRt5wdMNmKDR9hR1PqujVj2iWDRSmVqFr8EowgxfrmsD8iw9QIHAf/n5sw9tWJ1HxK0NeohXPsWneIFY7kkoFk+mSpRH4ih3Er4/Ho8p6VXb74wxeBtOhVFudd9gia0z0wAd7osguzhB896XzN/k5HOp2nZfaS+OUT/dhs5s0KFR/pM6HK3lMdRFke02EkJRlkCskj3Fed0j02zuyC1RlXY9Ccl7ZhbvkDqKI3U8W0x0DPnu+kYW3JBic14bHA93kpR5JDc1/OG9cKhwMMcG6E3ngdEManILUuaQ3gbVWb4XYdjWMrj4IYwWD2NZRDcY4PAS1aVc487ccCC59SstWtPFG7dv8dNFlNP+yhzzuWuHazDp681eM48dVk2eDIai4DkJH7BbIfTOFB0o2wvVHBP0nTsCfD5lQ163NlRv3QsEiK2g22szSO+ZiS1MuJB19hActBsHFqQ9cbr+j+xuO8+Zbn2jlJEloKopnHrJhKzmC2YFh9G3mUXwUMYVXfNzFVmdusUPRMDjOEQHR68TyHubYYWIOmrJ1+K+zlqXKOvmORD8ccnnEe6Tuo4vxeDh0Jh80fp6l8WsiIfnwGxoal4+zbleS4fkTrOOmzgpz52P7YwVYXHUCjhil8dZlbbhlx3dMWSeGVl0vwOn9HDRblg3Z8kWwZJskLApbAAc3zKUjL/qhZ3U7lJVKYl5bOOsELeRTm+axQm4lvKmUBS+pdJRL+YVp9ftYUUWEYpuF6MbAfcpYep5O5HeR65Sl/HSkFRzb/pDd49RgXmUZfZU9QJbhIaTzvJu+jFqCnkPm4Dr3IjsetIRJoytJuH8dy34sBpPPf/H0qRU84o0EKfiI0TX1QEqXFMCuScLwxbSAftqW4WeXd+h0dAqmvlaGNwVuYJL3hVPsDFFLSp0FhywguOEp//1vGhill+K3cFuI29NNSkkeoLfkLA9O2gVTvr2Hu3PVYdPYDPRxaqaOmn14cHotWax8DkeaiuDozmzgoF2wbsF1yDIxApVTJ/nHLnO4GeNBy1cOoMWUh9z4XJHyz7hCjbU/cIcunFgsA+LrIkm5ZzVvHS9DauQJScnTaWbIcbqhPAu9tdfB0nXGVKmvAT9kPfGqtAjPVq6CthO6vLNmJ4r776PrLe5Y+OAGWo/vQvk5ljA0axUuzL5PCwO3sEK0Ee6NNeEvWXtJ4Gg55r+yIGXcQY6DUyFc7jyMHNKia8lasFOeaL3cW9w2/jYlRltittQIGHwWyMbZ0jCUcxaM9CbgpeEs8HEbRycdErmzS4CC4y6Bzt8V0BIeAROHdMBD8Cnl7zsGv//7AhLvXeBeXh8b43KaoJtDlt89gGvroa1CBzbabSJ3jwVcpL0KDh9awHuUsuG+bx2t3J8NMyQ8uHzkNkheZgTvmz6DdLcGBwjH4uQQfXg4aYD3jjuD0X4K3Fq1hs5khqL1g2mgcy6Pdcc84DsvK+jCmXDI9ZcBTQ95uj56E3RvvYcxq9ajnNEU8IlVg3MRjMo2rjyk1gAOg954TOIsVjsNw6GGqTxKrhG/HzCHu26zWHT/arZt2gXq0uaUBR+g91kDb/SWpJO2hfB0jQIffgvgAvKcNKWN1wyE0nTrFJx/8Dn7B3Tyy54rUHy1lT4VihKsHg1W3eLw7fBZuNc3jvfW/uYul9uQ/doW1+yYA1YvN/Dyym1Yny8HBluasOnjDlqyXp0uhl0ipVE7aF5rMndPSoVJ1h8pXQn46GVFOB4ymj6Hr4ZQlWf81EsEzEzscexMKfrkSDjjay9fj2+gJNEx8PUjQPfJdyDlfI5/hJ6EntqN3LI+nULbCmlt3UtIOhxGxYkaoOsmhzcHekDDLwome4ynHU676FVpCFPicU54NhrLSrzp/epxIG+5GVQdbtPK3Mdg7zEORlZmoEeEC67VdoZ6/2aYqFRPhbvGgeTJ77DhyXM6XjWbx0m/ZZnsMMpuKGc7juT+RVOp6upaXjqf4c7aGD47qwoqk9VQMsmO5ie2ouv1cppZ78svK2zhvnYO1khNAUP9eojQ8SeNL5vJ9oEzVS87BrBRifaOSabvtndRs/sTpewXhgipUSS2KRx2Ow/yp0X3YYSbFMvcKkM133d0OO8vnq2PgxXuEvDdqx6NHnqAUdcN1soypr6rLnAgpYk0f3yBOfun8+eJ1zD/40gI/RyChU/U2ebGHEq/Y0klixO4+H4yXHROAKPUPs61j4FdWwShU82axFUTWaV6GY6fHcaTf5niZ5GFrFflT1uGZdHWzZ3vaYyCveMz4JCVAs3aE8cyJ/XZ7+xYehNYiZmlpziyfCHUdN3gynmaoBPzCc8cc+e8qBiKN91JSwPFMc9wB19+ooaWyXbccrwba58pw8lXguCsK4guG8cCL7PD6Mil9P7sOjg86hh4iApBkZsNFlcIgt6GBna78g3v6TZg7YkKcHruT36v/mJN+HOcj2n4/bgSTBhUgZN+ivzOfxyH9SznxR5+eOXCc6y5HEKn6uZj1+Y1sFbrLonV6cKFu6NA61EMv54uTQ80fEH5iRQtXhLNyxduhyszn+GqoiK2mTISFoRuZ601chhvcptHURH9cOmGitcjOWLNbrpb/pRnGJZBfZYqnJtYQN5za8ApKQAbtvnjmD03aJPmP7ZwUcNZXQFwqPQIJ8lpwt/KJSRUKItHyz7Cs6HNqDnqM6Yfr4D0Vxf4s/0rbngqhjs+T4HgnkKOGrwK9Wsaedak53Tu7mU2X+NFP6LdkbxcSXH2JYg/IAqKt0dxmcg8uKYxik+L7ONzquN53VwX/pInyLuO16Dy5zAIix4P4/KT2fykIId1Z8GH8on0bP8Q7c7MhBVbXDBA2Jctt6RzjBCAcpQpLYQEmGO5jHSfCaPsgir2F98N6z6ewMvgSWdKbPnp3Ynw07iXHpuXcLLgNFb5105KFVpk8ryJLthMxy2zVcDEJxX/G0KI/2MFdzadwaq9DjSy3JZfmlhx6J1NpDQhkNYvN8NS2+MYYTkWCp102Gzbe9xjUcl01hAqE1rpw30nLh/upDV7/5CJzmRYHz4GXFenofIkc07Qc6XDz4b5hE4Hb+3+B/FzClAr0B4fbkRKyBaERAMPsqVCMD3jgZU2kbzGcBcuSApGt+E6VlmSz+pzuzgjXgveSXXD9mNjwXH9cVrxsZyLE8aAYo4Qji2PZ+8fA9wXOwqXNclDbfZkzD4qzDbZ9Wg9Wwzm9znxWrkU3LnXCm0jkjhrhyaPm6EFqm4n2L3SHVXst7GbVRDnJCWC9gUJqJaKpltRnrSmZBtanjWHLV59JGgewuKzSzjUzh0Ko9Lo3MMPWHD7BI9OKIU3/IJPiZuAa8QenjNsA+sFXEhICXhd00VKMumErPcyOLNwMiyYcIE96oyh+V04aFw9DW2bDPCRVgoJDhqBtoY8XL4Zwq+SFTBlvw2DuAQMPr7HddsiYf7a3aDyupjH/7bEqa778ezVYnqlUA6ybwIwqn8qbCxxhks5TVwwyoQrf96gZuk2XHllDCdIXsE9UW0UGJLKeS+E4b7WUzhnL8RXlo3Ek7vXw9gl+yHXyIPkHqfDvYkr8cz3o/yq3xCOGhWjrNccbEqt446sWGi+NJEfOp4C8clXUeGxJ2ZKn+VBH2nIH5yLfvd3o5VlCsGAF1TtNqPK6eOxtCqKJ97+StvFfqPIoBb86ejEc8p7KHbVEf7jZAAzg61gTGYlt1yS4SG1bmyx+0RPfwjCSW8XOmhWiHf0FbhHOQvOV/Xyx9AOmH6yEt823KakCDtMU5gECkens5RyDmx7aExrxaxgyNubNAONyaz6H2ckl1Ppx998940VdDup4vUjK/nsqRAKFc+FF/lX+NQfWzRbVohvy97TBV1mdx9hSA2cxb0V2ui+bwhNpJ9x48AKUI2zwTCLP3hB5xqGFV8Gf3Mz6NdYxJrjr/INRWtakXeSyouseK+hJJ3rmo0Kjg4c/3o8brw0EcrfRPP22vmYY/4M7U8X8DSdO7w76Ce5r0pChRvpaEMEbfHysGjQlryeXyfn4oswO/k+HzOMIKHZkpgWsxFKHk6lnqGfOHuKCPjcHoLRozdx1NQ0tPV/zwurN+GjL71QmfUWrf3n4sgTkhS9TxJaOlOo78FUWD/tAHe4nIVWiVe0q+ArJ89ahtsrdLiVQlBQ1RCWRV7kQidZTuxk2NF2irPfd3P68mbaeF6NFhetpj1Vd3iLtjZk3v/ABfIl9OdzIc97/BLWTd8N0x6thvT3rvT7gBN0uQ3T2BnKsO31Y7yQLk/2UZJkar8e7Nwr6fI/V7xU1sXjrhbRujdD+Bcnwfu1FbyfgiFT7Tm1V27krRUAs7Z7YqCdP7881UiD/dd5i606lOdexovrftGOyAiSsRajCYJnOcrTiW7pSgG62eFph6e0qEwapj8bhTd63aHnQjn31aZhyrZ6dsy+g97XN1BTpQ7NlnjFUv8IJo3UpLsLz4HW1F3wYZsGdd83p9N7L9PKoHHYuf4efFwcwKG7dKHx42VsWjyTurfZk1BLCrnLvwb1ZADPyXrY/bSZ1yibwp5QcZhUYw0G+qG8qqICZoSrYFBPChQM2dPGpPV8q8UCHecYU8puJch89xT3bcunwsvu5HdFDeytRGF02y4+n1lKAc3jQGudEpQ9Bth17jrtb57Mwt4LIW5xK2e+WwyLX45DF+HVaPf1CcWk3aSpUgRl4pO5/GMQOr2aQf8tGod1jZmgv9WXpl0ZRxOqNXlE6mrOOacDxakfMGy7DdWfPcHs0YKHZ//CobGCsHWWArqNVKE/0Z/47nZ90BEaBa8XlKHdoU7KV/rKc+xDuZ9q6YtAMCXZV+OnzBu4Y7cpvBuejxNfCcHN5rv0+HU7n+29zC83R/OYF0NQoDYPEo+00UJjQViu2Ylnc1w4J6aO9y6M4QGFNSjorgpXMmwhYs4qTqjXx7NZk+DyfFVoDO2gt6LrIFF7ESivlMUT1k3k99OPRxfcgZ+p5VD4RwfeB+fCW512eNiWRq0xu2lk+G04lPUB3IIMIfhxJ1udLeLAUkn4lhtFO4oX0X3lbhINbKI3uc5geXcHJl8NpowNwzQjIYruBInAyo0yrKEkTJK/CJemt5Hp9KeY4T0aRI0LUH5LK/R1SVPkRSuoWFmMk6YLwOMAC0pZqY27JUewlG4FJk/IJvE1r8jFu4ePbpYG79FHITxeFfXfDuHItf7U866Ct16dC71H+uH3vU5OTAVYamgBA4/r4IOfKnTH6KPxyy204fxeiJtzEWKj2lDgpSY+X/QJSn6ogJ5QI7VnrOaXBx7B4nd15FLXQ3b6t0nO/yB/nToKv+30pYLDgiA+IpCm5I4h7RYBcj7fTAFHt8Oyz/dhk3kUXGrfhZYfHqOxnBlY57fxN/23VJSRQnXq7Tzn7Q84cOYoy7x/yX0OM6mLB9B42AREXd6RwycxElUbDdGdf3n0GQveLXObbtmuod1zVoN9ykZMDbaET2ZKMHN+E//LNKCalYihBqLou0iHFFOZUo6fwkTNm2S8eQpE7H6LPUnZvGSWIimX1qP1UA1sD7hHul5G8FlZCkTvR0PGbRHwt5LDIz8e0ObKMegUcJ/TZ97CL5MdwP9DAkrFBGB/uzBL1o4GP2tJEpsZgXen+JDbf0Z4cLwLRgkqsfX4NppDN6Fj4TRS/U8F6vXXcHu2J3vMqIQZO/M4OcgXzwn1ku+aBnbepQnnSzsoca4KxJUYQ7RKNZ3f8wdtZO3JR6MRNuV54hjDC3i5zZEqH5zkpEZjULtljzY6Rnhw8x1cJB2E6VtGgJCDJNJqdcha18GHT93FN5UA1u8P4Y4LMyFzuwGanVHmw6lPyPzmawwdd5UMxIO5HTbxXEFpqP4eyHWJKyiiVJbMhFppk4c/bo1NY9m4KVBqeo6mvn4P+xVN4KSZJmysfIJ59nIgt6SJz6d+AN+wQ/w1+iI5rbvNSZlVGNgzFTy0fNin3hbWzIrGexf241DaMP1+2s72aMc9funoMcWZOkvUQPLTL1T1dSc7MaSJMUYkIZHLwWIibPLBk158S6MZaYZoGSAAixus2JW8eHZ6EJ16NxtiLMRB4VQdPfbspFbrM7z+yW52MAbozernn+n7cPuZOeB7oRV/RI7n3uD3vEpKmLc+nM2tKTaks2kSnBNtJ4HYUuq92UrXNg5i1/ApfJjhCTs+51LOhgXg7FpNGhOmwqM/W+mUtREWfhCE1+efwYWWr2gxt4AmP8iFguuudKnnLTyXmQpjnyyibYHKVO3UBiLbJuD38BrMG17LTfvGgGTdDewKlUafi/owcD+LRnz2hMtP9CijShBMJX6zhtYT7B19nf3OZ0HSLm34kiMBIyrUaW7QS6qdkcDhzmfQZq8tt6rv4oOfplHHKC/wzNCku9PNwahuNi9+8gGvCi6nI7saINz3Pf8nORl6AkxIXsONJGy8QfyoOpQ/X4Srnw7xIQF1vj3/CHbWjYZ2dQvc2KlHh4/rUo/gezq6Uwiu5MwAlTV2kC52D0x33sWmsHyOkuiitKlBcKEwDlY/2Y/FR0ZCmqsgFYUoY+mWd9A/fTYPZKzBLeO/48YoTyi4KchJN8/zmLNiMJDwCic8CkZ950z+VyvLiygHJSpOc4nBeTIsKyHbT25sOlMOym4pkYl7M8jcTGOZNA3SXhAHDXo26NYyEYr7FbFoVRitG5gGmzcyxbcnkrPhI3ac8ADzih5hyzg7vCt0hpafucjqu9/Tvr1j4HnCWASZEGq/5s3OI29y7pc1vDAtj+YqqrB3cSR/Hm9MViWakCg4Bm+MW0dfol6Tb1Q66hocgLg8FS6LnIG8+jbZO4yFj24ToN1GAL0qFVjPvJp88pPo9NuNaItOZL9eBZd55cGXe2Hw/JgxyJksxuQRbZDdKkpjP4xjrVJnzApTZMeYYjYxuQwjen5AazRC48x/NOAagHbzFuK3NkOcWH8ett/15gqdFfjotQQW3k7GexcmQq/Ffa6/hbi/6SZb95rSp6AAvJ77DvquZOEBmWcoEWkJYQfGQnuCLQr8WMLBMhfw/Sln+LA2gdTDHsHmN1f4wxsBVk7ohy5vhtaFq1HvzmJYeC+Pz5rmwhJrX16xpAI2/BTC1mOOQPHd4BM4FjTTvfkU9WF05Xw6eygFzPUug924VeDQshXlfVLwxQJ9WJooACpbzkJO1Sn0iG4B2fvtOBqn0xnrdHJZks9Dx/5yTtlyynw0DZxi1kE4x9OnshrIbI7nWu0oeC45BPevqpF53l+IKM9DTz+A6wH1uFUnA8HTAQe3lvGsOEGsVerDoc967NdygynFiHZLW0D8ugUcbXCV22Z0w1CiDdwPHqahOcuw6lwuT3WYDkvfPqE2zdGw860zC5nfwoDQAT6WKA7N56ZBtEE8L5uZicP/ZHHd2zLumykJLu3rOCKzkVWO7ESPntvUXTqRLn7dzlfvfIfdMp6svMMJ178Sg1dnb3Ow5Tt682kVl9avYoOSLlzua47bLDtYx8KOlhjPoZbPsiDcHQxWPvawyUWf2ndLg9vKkfApUZf2X5WD6bsFed9TCbpUJwhB8TmYPMsMYFkKq9wLJwudBKoI2I+erqp8/e1mCKuNZIe3CqBUdZwn8iT49fkiL3I4gPW6v8D04D3+KnkZqoWvY5t/H4eskIBxj3vYzecQjPASo78jgqHuZDL4FcigZeJ3nHPzHIwYsMXDZw3gVPB1VHrUAH98MnhqeC/HqMiRvqU/8IlaXjI4C86NimPPUhOQPllNO+JraYp3Dz/8WYHfRVVoQrgfWjzKAH0/d1rbCjTNzATWV8XhfuzEgLqpNDOmH5VklqH9YAPb9J7EExkLIejId7q12gB6XXuxUPARXllfxpMl1qHSvkHSzv6NyY0XULLWkJ2+lPJpRWsI+ilBy8Uj8PWlYP4Tbkt+ZkogHGeHBRVbsH9OFhpAGxo+U4dD/xTA+owQ7ttuTGkzJpJH6wbuPDqG5KpLYYKNEl34rQ9fRLXgVNoL2G14jpL9+3hFZwPoHXDEV0mEJ10u8S1dPZhEGjBiK8Pk/GA4Zx8GM3KHSXtLBd77l8IFs9ayu+sDdNs0AOf0o6BUdxrMayjD3+GnWLr+Df49Jc6P6yNwkmU/OO5JxlSf3/Tn5GF8d1QPwq8OkFpZLy8vUCPsLoH9z5LBVNQFWMGc415FgfYZER7bZAgnMrfR+C+RUDBnAvgukeADL+eDnG4dFTf30pMxaaQ76jSleowBCfc48DiqRVdWzUc+KwcjThTRtf2G4J95GvoUgR46qOPKcglY/EkDX5mOw80i5/jcsfMcpJRFWnbbaWv9fDgfEo0WU8tBKAXhiNgwlOQuo5TPzSgh9hCa9IOheIQPR6y+iqdDW8j1TzfOfDENktQysKVPCvaEJlLRQVHcntjEXjprYbRvGzbWBWLfFh2YvdEa3s9ZyNkFzymgX5WzMr6zul0fVnh8hYT9gzy0qQw23XQiA0ELEE1V56Vxzvy9Wo0TbhJh01gu8V6D3r4JqBhyicO//sGSNA0IK1jM6as3UvjsKDRoXQO6jzJ53LeLMFs6nfytFqG7N9Lmr0Jgq5gGYk/98VnbTHKLkscaTwHY9jyAHtu74o2G+TTjTD7/dJ4EHTl3SOuzAMkXivGEonVwwW8bfxl3HmurAQYPbmf1acp0aEgPrscK8L9FpRQ17yq4B71By/o2jl50E4fuAZ+R8aCY6kDy6hcF45DfeOiiETQvDSaTL768trkRXli9wk0+n8Ad67DtcSTEPhOBy3fMaUlHBbce3sQSuzdibPsBTKgUgJmSz1jfV4yXSBuBvIwpFJ6vgfz6D/Bcegw/8a3hDXNSYb77Kpg4MpmspkhCUeh6tlayAH3ZX3Q65SfpTXHAv+KBrOK+HOpOz6LcoPGwob0AmhYo4vHXunDMqIhEVK5Sdi7RqymDNFHEELWSJvHSQG9cfkoIpdUX4HCJAuQNKsO3XD2YFd6Dm1OPs8N/1hha+Jpzll3ml/U7SaXGjwcXG8NPNwe89fouW/96RFaRurQ+uJxz7I5wRuhr7I3ygC6bJzykbgAeh3WwwfM8dnh9pHdyqZC3NpttO+vRYGwS5AY2UeOefDi7TxtWWDShdGEWP2k/w28OheOzDHHUyNejrFHakOxjSWeuyYP/TB3w3FYLytvf0A5NO5a8LM/5khMxc8NyOLV4LfRnS1JDTBe4mhtC74tQOvkwkoICp8Lf7z/A+1krT9ssyysUplPtPzEQNg+CxsEpMPTyCKZmPIP84lH8fpI6WY+WQSepRKibI4Tp+6uoOWAzrzs4DqqbR6K+4ykWmGcEhgeyQDO4FCOd8tBYpIQ0vJ7QvMleNHa+IQRGDvDbhANcKeXHS2wDYXBJEYWXbOSmBb/4vHAI2PREcfBWJbBfeIO8b0bD1M0msD09n4euScFDjXJwNzHGlh4fMgpLoPZ9EpBgGgb24oP07/VTHi+thdc6pcB7pQx2GP/DgeZ6eHTYFaJ65SD3VzoG93yBGcuNYYJjNKT8zIKgJbc5bK4rTSh6ia5Wy7C8VByy+235t1c/vGIT/iOnwxuXz+O0TBloGaMGRZqG3KVrjVsmCsDYkI80/+lzmm+xhDePbqI/GhZU090Ekz9t5RxNQ7R/eBKsGoTgvyB9+jf2J7r8NCGr7Hx+e2c8jQx9hqO+2WCbuQG/2OaNMnWiMFdiB4RMv4T9Pzu4x/oZ2kTkcajtJYxTfMMHT89lj0x/MJ8gALW7C+ii1WbU/a+Znti6gq3LDi4NWYHD681ZOOQHpX5bwPsumoGI3VWsOzAGbQx24ailRzlkKIZ/nhbllnnHuVp6NHt/fQKOLqZw/koKqB3Nh4B7JeyYrEXSQXGcME4L5ToU6IV1I58yNKZZsmOgMegM6Fpupnt9DAHybtRbZgt3PLTJsL6dBmo/U835MPSeOwGOOB4C2au/ySIsmp4818K1w96YXWGD+31b2fqfGcSt7MCu5/qgdugkrFudzsq9Ang58SVU/9XkYwuQn147wuLnu/Dxzp/QUmoJs4NvkHnIUfTMUoRjtv48K0eUNu1MoqI5bbD8xAUM1TuBQdd1QPnNZRwu0mUXqR+8fPgApW27DGs810KeuBJt+qgP0tNqQLVbDjKcn+IDS2tQmJDLE/KkaPaRsxz1cA5pTLsDXYZf0KYqAXpWyMFKET+Mn5mDj5Y+oF11x0igqRSVhLtg4y4bgtstGCXRQ80S8vB01RKelqsNmw49pMQ4c/zlUED+mrXYskWfT6TX41mfxdA/DLBhx0H+Yt/IVftGkoWkC/cGhEDlYm1aVzOFLS6NRKv6x2h7XhqMTmfh44B0bBI8SYezDlP8igvc3XID/15UA+XYMvAx9+ICfyGoOh9HV7ILKFrkIcaG3ebvJ7Zi8O0g7A09hB/qt+K+l/MpcN802Hr/Bmta5+Do/T/gadIK0k/Xo/0qyiw0xpVDb7mT+fINKN03FfYcsKAfRTshNK6TBt4m0ac3GeypmQeWVl8oQ/ctK5kYcdk6NdAvy+YclWO4udocEu47Ecy8wbYLFfFUqja7zd1Gzpd8eYO7NJhJbiFVuxn8YpQqaGt+pLGWOdywMBZvdm+D6Cwv/NcmQrOrTWDxcBvZ7szGpO9L6JVHJW6pekHT30+EWJVgaokJYDehUDh5QgoSbG2oSMuFZjuuot4Ty1Fk6B3ml2VQ1stxtGtIgj1lblCNiiokvJXGMV33YHWjAKtnPUK9kCFszxvJVeHSXH9nG61SbYDrvRJgcFcc1tpFwYvMBSSREA8eLzvY9pAUv5m/iMuDn7DzzRxSC5aA716WVCqsBJvmuYC9wj28qt6Mau8iyR+HuLJ+Go0XWIjzPATglZoRTN4xki0vClLp3QaIfDcDtW700Z2x8WQ2RoXFTzmxpoEIBPc1UpbSdLJo/IXuV5ZBwOETaDVFic/W2ICCQQ5ttCxBVJ4Gx+R7qDs7n6lDkTvkltCBPm8Y53OLWtQbMfuKIViG7QFIFIL8V3vw7t0S8vfoJy+HDBZXfkTpevfgQoLe/8TdhyIQihoA4H+EUBHZoZQRmQllRkZFQhrIKkVFhTRkdNJQSEnSIqLSnjJaZkMoQiga0hCpKCXuY9wn+WilcyuYflhA4/0UwKJBCcoiHCC82wQnNBRwzYo+7l9kzmU97jTfcTtNWaRNDbNl4ZBxL4T/9uGWjjqqMdaEzCoJyLCeg87rfsHw3g2wa3g1RWdMh+MLAuj9Ajc6sLuH70Q2YWzPaVqvcAfuGSNqDR0l/cgPuL5PCCpy77IBC7CH/mpWlKgBzTN/6NTtQ5jv0w2qi85S58EoJn9lUJo5wLHzF9DYw1Kw5tlSCjq5jotiF0DM3M1UwJO5IGY8lxxSgbXtz0jumCg9uv0aXH+54aPlTO3H5tFhVwE2FA/mkabpeGOTAvgeOgmqtwugZVsM1Dw+haEmkThuigVJtCWjuMMOXitQTMemioKs10sYm15A1v924lzpcNR+U4UpN70x5FEAHna5xqpVG8jbRB+2XnLghKwotu2/zO09bmwnvgKXj5kCKrH+cN5enTIehrBu3ggwijnEu2baU+i7Ep6Qu5NW33oK7u9n4GbBTHBb/4stv4tzwHdjSH+0AAR/LYR3E2ejcuwX7tk4CKsKpfCteDNcvKQGkqYjoP28Ihj5b8HNDgOwylUDijd9Q5nlpzn79hwSLaph67YjOLH/Pxo4OgaenTpMtrV3OZdvoXpkE4xrjqbelgIujJ3FOqulME9/O4/z14FE/5NwUqGJSiiSHT/kkph5HdqGL4ddC/fzDb1ITjdqRdfr5rDd4S52PnmH7Tpn8ICYCplUarKqjBVF2LiS5j8ZwqIvUJYtDeH6Lzn+zi1YUl5KQ66/eebHhZimsh+Upuly0tBNdDMqxFM5E+FR2WHsEWIoTionm/m/KPZ4IHTc3cA7qito/9jdJC9zDXijAlxQaOP5j+1J3MgHOzWQoh5VQWfrAISk74XcQCL9J69giZsmnDmnxv6KfeDQ9gA8zTZyZHc53qktRtlvWSRZsAZPOo8F8edaMMotBkvcfWDV+gLqVZxLG7fbwO+3sfyn4iYJVX6EgS09mHlbHC7I+bLI0nDunllJFaIMxlsWgHyqLgT5RrPOAV9uUL1B2hkToXC6Jzk/U+P2fBfKspeiIIWZvKwnGkas1YSF/+5QQ6kvDUoQPMv9SiPF9WmTihG3JxfiNcwgabElaJyRACrZMvg4NZSFmoxgb/MU7LXZzGqFX1j80j3MuSvKMZtF4XhkOvd6OfCS+zNI3tECPBavwGtRVlh6K49bJaPY+64HmoW9p6ipubhvx324e0oclOKnwqySRng4XMSvToqx25I4GBmwlM4GzWObPTYY+XcZjTn6hIdRBW7Jv4CVX+voVkQbL03WwSVJuyCzPQ2O/OmgaXZ6fMvPCc3fGILG22LuN6rh+x67Uf2KDkx5F8/3HoTBYHgRbFsSQ2euv4GJ/4nDz1157Jq3iTW+PcZLn+Wo1zwBTniep+yTHzhpMIk3DRrglg/yMKvRifdvCUfr7ZPJaow6X/mQwzeWboVv602wRmAmOEyfy8nmqqC50AOV3ibhgWdF4HPuKFRuHuKE8DZcaRaMtW+r8bX0Peq4PgpmHZrKz0SCKKpjI4dOSsf1j+zgx1vAuovzUORxEm/7K4EzCgzgorsuOdz3x9tdf8hb7xIV5qmCfOpDrszeRX5SYqx1Xo12WCtB8UUvvD0mjr8+C8dQ9Xpe2Xacd184z0YTMuFZrTKGCXvAATt1mLFiKwn4/8fp1aJU3+rMCinAcWd+oMXzH3D7Wge0LqzgviQL8BC3IEu5v9xqvZ1zcu/A9puVEJx2AXepE95PfM6GyxQo55EMiCyTxV8r5Mguz5YWGiSC+dsYEHaUpNJZH/G7cCFsfmJAkhfGwZ6ov7yz2QWa6q+Dw+W7lJYWzCv0O/Dl2Fr+GWfCc+smUZutCKy/mMvDm/aybHwMt6XnUF3cTJiVXEpVfqtpa3kx/OhbjkZH5GD7+Vt0aGETnOow4iKHYH7d+ZcsnVWxwHkRh65LggcXthDbGEBQ2WVY+HQy9E+NwAV5p9DWRo2cX82jEO8wvrGN+KLYKKpt1YCoNhUId5JCPyMR/nt1AxdNFODs3x/hodgjmKHnRXG/leB6/mjIUeiDt/JfWTG8DhzmLIJOhy2gfG0/RZh+Y59rczH5QjRb2itC1NMqOniggvj6BTTUO48Zt+L5648zFD8ynFYFNpPb/kPk82cksNIpGNhbyU5Ugr3jHkBviRT8DNQGFfG5FGx0lGTFTnPoA2lA9TMU2nCFvRcns9Pa0bjs1Q+YKnwAxUsIunRDKK+kn6JbFCHk9i1I3jzI17smErmpot4kQFvHYnCQ+0SfVhSzekMl3/OdCVp2hlTV+pXahdRIS4S5K+ojvSy/Ayr71THI4hiYNmvS3svK0Ka6HxXy99POEG1OJ3l+c1KAZ61xAt1nvWhlOp66lzzAJl0lkG03wY/f9Mg89CtWLViCn9KLwdFiNjwaqYfCd47CkeJ1YPdJExYHBFHsoTUcsSEfl5dcQMPc9RQk8o49V4+l0VuiaehuEq4Nmwkvv6XRxCF/Sjy4C6U1lGjRuD9w2f007na+iT4X5/PMdZu4v1wR0vcAm6/7jTdfC9OmPf+Rx71d/EaykvjmLta6IAvLDtbAlvMG0DDoAp/GnOS3tydA79cJqGlRDX7rtsNs9yV0Wv45pgYZ4jpnEbh58hlvissib3NfjhPr4jthlqz5IoqHkifBs0eDWGL5i/5sE4SLgdEA79+hiIAfLxDwRVH7cRCtWw5X1bK4tHABjHkSjr6LGGQv7Cf3ntGUk6jFx4YGOKHkOjk6LuEN7cVUJrCHI6wVOUpIAZ7tvYr709WhKziAQ1f1wZ8FU2H0+zK6V7iXMpt28HRZM1hsZwlv4zbhx3biKw/CMeROJ87NW4d2gfJ4eMxaOPvsEjxsvs0r48whwa0F0x4/prPuQiS9o4EiNXay44gamvAhA1XTdalqTCZN8h4LSVErcH2uLs1/94fnB4ej1Ww5etX+EoyN/yPHVcUYujaZR8RJQJfhaTAVEiHRP89xVEs7/DTopDzBu4zhniz/dCdsSV9Bd7oVIUW8F1Tuj6P171TpUmQZ6kc0kQF7oa7WbP750oAGbfMo47UouOhvhs8jbVnw2QYY291A9S5voLL+P07NGYVjJWfi0tpTXG4+FaRmC0DH65900egWTfy5i3VGiYOVOuKTyXthSusvsE86QwECMyFPVhT8j7zBpZmXMXBLJ8q8EsFl7VmkJ+TJ05RGQMA2T1SzVASHdVmU4/KDXBVjwfHcL1DxcsL2x+5ssTgEbz8Mp90qTiQwWQpUJA7A74g9tELjJf7duhLPx1rRCYXzvK89BXJUuqnu02Y+omUONXunYPcJKbLpEgFHD1Gae1ofrXfUUK/wRzhne40704+S3RtRmNnshLMkD8JvvRPkEHOX/+RPgz/rJNl7egzqLX1H5gWrGYPMYPwsQ9B41wCHZEbj3R1nKcH5BVu7NEG85SE48GchP7IcR3/PzYDRNg+xTW8sLimJIA1rW1S7cBse5AWT3tUI0r4COD5pLGX+GAECkaNIKNAdq0sXwb1kwm+jFoG78hjeliBPh20OwuRUDzR+LQxrtG7jyapIPugxAYb1HuDh1lraICJH+37agHWCARX8mwUyvwzgo+Y7eN+Sz06Pf5JSnSSbxouBAzjQ5t1+NO1ZF7qN/UNGk8zhq2U1nZseSsbKPjTsZM0eJT+odaMPK/3bRv0v33OQ52vaYKoOnn0efDzDA522ysDzES28+NMulv41ipWOeNC/Z85g4yyCe5UnwsHx3SAkso81BLN5kn0Z7lj6Bk3rRmDM9kAQrBZkvRtddHcUQZt4Lgp/yEe51GSO0j7M4U2rUOzeP1Itl6J1g464zW0vil03gPoRT3htcDc2rErni7uWUvNpb1LYuIRWFKxm2ZdKdL8yk00UpoKRZyysXBjPvl6a7HC5h57a/qD5ArtAtKkC34wchYMDG2Frpjicfe3F+w85krTYOd4825LmZDzlfXpXoavgNL3rnkffLv+gMEcxGPnVhz/9cEZb8Sh4NkuVZmo7c96acjoeNRc3F+vjONt/PGedBYyZP4QTlhnB60pDnLxqCfb9XE2qjbfwsGw69lUcArHHY0krE8Cy4wZGqH1FA4O9tEJdgbSvBFLC6XoKcIvHLbv3wfP+hyCVJA85b+9zQ70FuWlN4uRvv1D1xC6yKV2CC1OOc3TvEM5NnQt+awUBcp+zlhlhA3tQ2DgzrJ4djgbfhClU1ZZTuxwo9fU0Ejo7HY5mnOZf/ZowU/Q9532pprZXn+mj9RQ8ozgeb5zRoFlNdVhpORGWHlnHWWteYdpyU0reUwv6P5CEV7jxgfdZZJ6XyY+XipLld4aupDV0ohtB8v4F3jwQzEUhcrRr+SB0Ch/ndSZv6PP2u5h9xwxaIqux2HwS/N7oAlo3QkGucjG+N3/IMh9+QrVAPp8r/UVXjqtAikMj9awK5BM/xNjr62yIOHYAhIYLoaBYnxdfCCOpxlGU990SJIb68Lf8Y67bmcYbZbpxreYwDPiPJNOonbhbMpM0OjrRebIJHDI4jslbnNBd3JwnKefyzhs/qFH/GR9aIsrWFceof5E1Dk4ThTyRWrIq+Apz78txmj+w7axGOlSfDWduHuIZm+rh9+IplLZaAnKVZ+LrNZE84WwO0zek+NNJEJBajjlbiaebh8KXy2dBWs8AYIscbcfDlL/rDTfP9cVSH0MWXvwYz04b5gbxW/Aq4CVP2GwJDW+MIT5eCgOHc8m36C0HLhuiGKX5OCxmAcN71aBPxJNsLwmCW0sJxfeGksbaIgjOnQ7Zq4dxcasIfHpsjo+NayCluo2VWgBWhG2mglsaeMBekbZemQg2MRWUMimR7/WcgdijevAt4T1cadaDosbHnOdmxloHX2PH5Xmw1P0pl4904ULl7SyFK2ifpjndvKEJJ4pMCAb2oOQiMX4r9I2dNP+ju1Y2MP/uVNj5aB93l83HS++loCHejpZf6OBpx2uwZlAaFdZehsseuiTdaA5jzubwrnIheLJSHKJmbIflfcm0a95b8hetxenfizBPSQxmekTjQte7MNnPiCcsHQky166zk/Zlitv7lqx2fiWtoUhcvcGT/yuvIC3n+ZgeLA6W5crAzn95t9Y/XnAonHfNjKM5Gz+zV+EeDuuL4uT2Qn6y+x53f7OARuNDeH7xW5ohK0HbLct41b9BjL3/mS/9/cGhX+ZgR9AjkpmqAolaBXhwii3OMUplv8lOZNfUTdKXR1CMVSm49Aph0r9P+ER5NGCzOUqVWIHMogY+XeZGUU07UWfLC8rUUgN8MoISmxfCrf+0ocTtCK78u4HiXWJRx9MLI3dasf3YE3hnw3ZY9MaajtxQgiUVavBs1WdIWJwJL9wssaf6G9SuDcKdHQfR+vg1Vm2q5hlJL1B9swwUbR6Esx2O9ECzm0a5XcLiNyfwXSOCOk3DRyblsKgvl6fOkIAT0Z3Ufr0Ivm60h7LFO7hzngdfG/scdKuE8OjpTHhpqMOyXhYgNNDHfhmV2PR0Io+MvMqvdHbj1drNuHnBOAz7RhirEQ5hIiowMCMdPo3ZzAZLgmGRsQ80/j6Mzzz2QrOuO0L8Ut4tr4tNrAeaFfm4QVaXTnVH0+XcGTz32j6IPjeXZuYXo5TcIrJem03xSSYwQTcWnXqOs//ECnx3L52MC5bh72Q18A+/h9bXc6H91yt+yNKQc9iKepcewDnJB3mL3T6MDnPj6FuDqDOwFw/M8iL9j95oajsG3sxZg4u376XVfwXAIvAETnQtxOSpc1FDKwBGXQ6kK76jeEmCAOibyoHj63Ho3LYG+ha4ksn7L3ysdBSHig3TjdQCTtsqxhnWI2BHQgeJuOZSzf61dFLwOv06vhUnlXdizvBJPNRkRpG/88GzWh7G3ZAm1aokSL+6HEuNb5B5ZQ4NPWxibR1i77HuNGVOH281FoVmhQ/0L9eW6peYcv6BMWh1S5oUQi/B6+FQLFk4iYraAjGxahqIXLgLv2e/pbPm8bRj4CgNljqx/X01Wrd8DKteqSTTpd14/ch4MD97C3eMaIDE9YsgQD+f/y55wZvL5vAspd9If/+jBr3J3LBkAuzxT4Nlz/axh3A9rVet5mk7foJneidOSA2A0qdZmH8mD+11tCFphx3Jf0hno7ZXnHJeBH9LisDjKEVuLlvNU/228F+1e5SgOgbqn03FgVoPPh7vTDdXXuYa35+wfmAOuV7fwL0BMtzhFgj3548B6apJfL12GCa5/cfRpUa4vvsOr7TXoUO9Y/nt+j1o/mIcfVYUgrigpzhc4UNXFi6ht2NUYbmSM2+o/Q0DV+9xzlVBuik8jEcKAJwkjXlOrAqmxQiT3uRyenjsN0VmD2Bi/jr06jpN1458w+NPJsNphbWgEiDKS0+norLnNBRzvwMtTW/pJvWRnsY8vLzwILjpG0KW1lMoPyEOwnE7OUYtCh49mYgzhqbTgWpNmPo6ll62HedoSXWIhzZYEXmInMRSQKIzHb09ynhDixU1GPrQxbm1kHnNFff+kQdJ2U0U8kUTaM0w2AqeoOfCALYLp+PtrdugzlOTnJ+kcFQ7Qbrec5J43oFunzNp2buTmJvdQdvFgmncQXe8b3sVE1L9gB1E4Ugyo+uuOXhJUZLPr7qIgVX3YP69mWRiR7S6X5P1X27E8x6WoFOZQd/M/HDv/s2UIW6Gh+9q8B/XanhrbovvKl+xQPVHcs3Whqr8x5S1RZFHfVhPD3yy4GdfJtgfms+Fi9dQy1ZpDhZcCT6pMvBQxp4sB19TFIliiNAVOnF1KxncfocNChLQZGbH8m2ttIVGQUzyC0y71IOuLbN57NybnP9RAlSzhijO/B5sFbCA9tddlNwkCP3ZItR4wohMo0fz5PdZfH/Hdtg/kAdHTxnA6lu+rF0zgRRyxQBOWOGTjmicZzSDLLU24bp/40Ep5htTkwtXjynC0892kGWOEYw+qcGpi52p/sYtGvtiL358sYbFzsSDzSNN7JPfj0VLoviB1CQIH/6D8qfXYfcBAdAp2YcyEy9T4cwaGmmugZ3L5HDArBXfn9GDXywGKz5lc+D1P3Dp+k1+e+QZeM+4jmNcpXD7okP0dvFEHlhtDqHGKVwYl4Y5bl4gahdGKV2FYNJ1EDZ4fcH1Ph8pqmkuSOhNgBs9U+jN3UoY/8sCPa+ZQMz7MEyOvQy3Sy146aJIsNolxJ+uj4SOak1MvbSLdl8xAv84WT46SQmsXORgo6wPTJlWhprXq7D8hAT0tm7jlu7naHgpla2FDajaSI0rKz7DjsgGGrafDfOOG+BVeUOYlXULjwfl4NQYbT7+1wwnZInz47UV5L0onDh+CxzZKURytpMgO9sRH+tK4nlZUaxQEIOVG81wrk49C+/5gw5mjrDhxEkYLaEMk1dp4+T1AZgU9YYcv1yhU9nWsL/BFP4bf5NiZ79F0bMV7HMQYfBsMI89tg4Stz3Hw0N/yTjZAEy27eWlR8yhm+dwy6FcmHdSENTTW/jetB5Waj5OfXlJqG+QAfNsA0grYBg6Om/g92Nv+fFTIfB554Dzxbzpfd49Msi0YivPyZQ1OZtlO5gnJ52hKT9scb+qNDR9XMmbdgdx9Q0xmFP/Bfz8PkKRdC4V9tXD9AE7NDy4hDrUhSHwaSMruh7gdTcVsGT5SYwQvw9uVdNgf8ZjTo3QwcHvfhhqJwBRlxdBhGMXDhXZYesiNZz+rQ+sa1W4L6SSDrRLU37KRzJYogw2Lp851v00y5/fxT2tS/naiXIOPrATrmv94vS1Q3zK8yN2HheC7HBV7Kh1QoX8ZE62msESFSv5m70J3As4xFvaFuLiFkcMDDGGB3vqOPDXMexouUBXIyfglj/uOPvhewjfJom1V4/D8Z+jyNZSF0qqTqFWz1QyPjcVs4O7SO07MzomUVLVe45ND6HUN+N4TZMapG9yh3/181ioLI2TL42EiFn1IHtmJmi41WDB50S8WVBAdt8MIbTHl4sTazGnHuFgQSZGNExgO3qB9+/10Sbr3SwYdwnH/5GGCeK1tErqMi9sDoKN/W9Z5t9EnGBVjC8OLqfA8hEsNK8J2dQSzt16x6a7flH2g2VUe/YMOz58R1OuzeH05ar4z7uKAqauweYbxjDNoYT/zWmiouixIDe4A++IbYUR9AguHtCiJw/l8HuuMh45oQjBgT3cdqkeos4NweshT7w1+BgaPu+AqwF6PFZuO1omD8HOc4YgQY6UMfsfRF75xk/7zuE+mYkc8nQ+lZltoCun3mHFhwA8IysAoDsGXqzIwv79u9F3xXX4VK5OXs5KuPTLUdZ2SMAt97aQtbM22G5I5y6XVjJ4950TolbBgqcXwGNmC/2Zu5ic9vqT/P4mmKwhB3dunGDvscDj+8bjhxXyYPBYnFTj3ThLv5Ef3xAkF5lOVg8hCN4eQl/bNkDe6KlkIDcGdl7x477eGlpZLM/D99Vpg9lR/DB/MjS5HwbT4lmgWniBdmxw5p4Hytzo2gduV1fxGbsbeHXVIRwggKD4UO5+asNv3lWT1uk3/PaECzbZb4IJOYvh/e4S+KG0l25JS8HnUAdSv6WGs8I2YCy30SOPNF4S34ELtmXCsPx3XuYtiCo1SqBzzRBSC0pZto/gs4cGD2ksJYnY/whNrYkbc+Hq4Cbwv2sKX1tDuD/PCYM/T2H7iJe4caYsQftYbj2fDqmC13iSWyzJ1MmCd4YdnJAYRK29qljuPMjRhzswV2UFmLgrw8bYjeSybYiXfVKF0LPn2WDVbcAnA3Crupai9YFcJgtAmngjWERZcueXNShxyQIMQlIwKHgOZI+eRTnjEM49s4CxmwUhbPUh+Ku8GeP+KrODnyD8K5uGD4d2Qvu4x3g50A+0pozGQ89P8JNLL3BGwkeYZmlLyy+PgU7hXNS7WEEjvlwD0wmZNKz1AKyMUvD9uEjOrs3CIetwOHFuLFxIrMYPzo/43ZA231njwL6OdbSwuQoXzO2mqJ2XWFfyJYcUWMLNxZtIYXIQnawZz3WLY3Fd4300HVtL4R8kwL23gZKzCkjIdwrUpgZRm8YRXDN8FaQnL8EJq43RV7WLx+Z7sLTXOuxYsZvL7ilAV+xh/BYyH3/q9sCKS+9w5Zdq3nzkDXwesxsErk5Cr8wfOKFCFtY9DwWXQUfweP4PDx6ypy9xXpAofgiHnaLxprMX+Ci7c+IhOVhuHISNJQH4yUAAjrY0wP0drZwcdwSs66fDR3yO/85cwct5uqDZIshh52/T0ZuWPHFGAZJDMXqGjIR9Ra/IfXoc738QTKcWqcH7eGk8PuTICnMe0pj5n+nm/j04IS6W3/+eCvcnHOOhe/+x/+fpkKiZBkkJGjzj3lq01OnGKfNH8QKvIPg59Rpm5VThx7AxNGveTDA7fZfsGup56YUVMA8bIa/3JNPP5+QcfY1NaQLGbhvkNVWGEC66EVy+KJJqyisItnuNO5seYWxLCMuZqdP4v4dJSUGcCr7ow6GAKCoudkJM1aOnom/w5O8Bntj/EIzypWDmykw88WUhSOiNBVVpBB+pKPR64sieTQb4U/IuwidJ/hW5jY9p/uV/9ZdopvsouLm0Fyv/S8aH62zRYiiAK3fdx8ZYLfh9bBi6Lqzh3Gnd8ExfF37OVaGEK23oP3oUhSQU0DXdc5BUmoYnX8jxug1pmBBpS2s8xOH573Y28lOCv2ld8DLEkd4b/gbnDFeeJ+EO1xrH8pc39RxRJAgtkYdhzZP1tMYwDlyil3BV0FYqn72LYu59Iqk1X/npvAqulZGGdzNKoEloPc4tO80mZqPhVsw0GPNtGVcbJbOg4gDP0vHDqv+UwP6GE9w0L+eBM+M5uPUP7xpbDMdv/sLBcntcEHsXw07/B2EOo2HR+wxuDFgPeyszQfLDJdi1Yg59nhbHXybO5UTZvfzT5BlUvpwEe1XOY95BX0qQlof/JN9TwWxz6la9iVfl7DAkt4qaNJ7ipwQlsPwmjJo9nbxFUxnXr7lJ47w/49BESXqYJAExaAw+oj1gs8kMHvoOsyC4Q2zcLFCti6HVDVcgzdoclyrbwpkvAjDvcSdM9jeHX7lGtD4E+NOkYHpX/xk8a4+C0dRcfBimzkZBG6jFpwGOPdGC8RUe8Mo3hfTKE2Fvogtki2yDRK1ibupSYOE5W6jbW5fPiE4EJRUrVDvwgetOTecez89Usn8XjVn0kV8N7YP/7Owowukwel2YCNb2E2BNuT9NNrlC/0n18sxcDZz+dzlO+XEVUx3T8VVDDSR/0oTSwk6K61yM+2r3YKpVJQl0usEyX2k6770dJttX8/zda8GuSB7kJHTw75y34PNoMgvpRpJnTgRdbZPmIrlcUNyVhnl/U1HxoBh0b12IIiFzYUuiGmv73+HygC/8ramZIgxjeNDxMX3/I4S+P2dC8zsrcgtxpJXG+vj0cx7pi58i+7vX4au+PwlZTkVH3YuQWTkK+lSEYRV+wVvefeS3I45/tqaA24kV8FDuJWU61KN20h1+1IOw+3YqlS46CAs2V/Ed9QLY7nIVgpfOhrNrz1HIoel8ynAOtx8WAf0ZbriH7OFWgRpmt8aCxMWfXLPHnzctXoVWJxxRpScED1arwn4TGVY4GsVP09vIPFoa2kd74+cvHjBf+giNmKWL4ys0saNVDiKXDIKe+FN8frGdJfrH0eGdz3hvUBva9Eih/wbAaPH9JC0kALHZYRi7cS457buKUf51kBK1GAcmH2btQTPIzzYkB7tKFgqVBOGFs3BsgRN22a3nWOvp8J2LYd/3yWiWthFu22vz5o4y+rB+PExIS+P7m/PRqmEO9bgdw8TIc/j8VA9VGS+BMR+bwOr+KlqyZzyMGvxLq+bWU3+oHUYnFpN/3Qo2tBmH8wYOgmTsUv4ob8V/47VAIj+IR51NoJH3ZGDMlGIu6lwOp29fRo0HS6ki/APP+rkBLmeqQtu8g/xneyPmh7vB4Po7IGxXCCP2XWLDP9chbEo+FUyM5NU62pDTIEc50esx5qQ/zkrThssp3XzB7DmW3nwB+YPH6U5wG3j0ToK8T3pUM+MH2MWN51Fq53n0+FaqrWzmqrXbIWfYHIyldFjbatr/zf89b3eGpr5+yPkhvdRRLEXBPeMhaEokfg9ZiSOURdlGF7hltxno3c3m+NsPoOCEI+nmzkPBoRyed8aDzd5rc9VeVxRcc5inNzMM7YmgmK23IWmVEZ52c+XAvtNgeqcEwvKToa66CszGe9DOZoDZlztB262Mbp9Kwe7X3jy/q5gnvRNgsTGr+bv7CRZUe0Afogxhmu9h9n98iH6erGVrxzcQbJQIa8gFNcwOY7NYH58Ytx8emiFsEd1KWy0kccEIB4y52c/qw5vJ3s+Cli3qAuc2J6iP/IeloqNhyKeSK09tpf6vo9B3wXGepdlEXg8OQ424H06cEwGp/hE0p0IYfJ+8hFlRO3lfaD5OydhB+5Qj4eNFL2jwDOOYSaH45PlC/PvWBAKioziq6DDqj9qHcYVenPR2P5s8nMMGZ4RoaMp48F1gzztqzGCSRBraPzGD1PZ4/KhfxLZnjbH/8hf6KLGOUpqy6WX0XJooPh1EIxX4xkwlOrV6EiZsQbBqH8R1k92h+9V4uLyCSMjJjk9dIHikmsHWz/zR+fFhuGu1kKfdHyQH0yRKu6SP5QnRqNL7ixZsFYaWQE9clb4TH8wTp4Gvklw69IOLNebQ7MspULfMHKZETSXz0WNhpf940jRwxEfjhHBN7msYXVMFpruW4aTYerC7cJafqXdiYJUu1Ms6s+m8bfjk+gVyGP2eq9PmQ9k7Hd5gKEUXA/pRZuQEDK+1hJ14jsRstDDaQpnObLaikWVyMLbQDervG9B1pSRw0PwK1ftNYLrTbDgsXczKJXrgaFxPWY6rSOxzAPlJjiSRhskwOrgKehslIFoyE/TiytgppxiKzj2jq8EmcNF6AS3ZIoPtF9binEA7ypo7A3Z8NgL1rI3gJxGHDdqiVGiWCjvmmeLF5Ve4Pd4Q9LR34DklHcio0USDL7f4zE5RdGn9RX89Xdka8jg+rZpMz4rAuC4Lfi+tA4kLgjjicT3+sXaBqxFGuDqogg5HNOIxG0WcIeVCl462wwfDibBbIgEkvfORBJMo5PxLzpY+TnkRU1Fa4QRMvlLPnSqIIw8ZQFLeZBypfwQXRyxh91RTjjrSx6othrRgzVhwmzUJe3xFsbZcBqRt99G8viI0PrMIOsT7+OhBfQzUAnApn8VLXMPpY+IU6IAx8Gu3NmwsdQKtJwxtQp7sfjGTs3Lq4F7HM+iXy+ZlkgZsWTANPhlaY/mkHFJPUoTF+99iVNVJkJeWpLYzCXj51xdQcq3l1Bc6EJs7ih2mGdLDmSLka5RJyXVzuVgvhpXjp8I83elkHJNP78qmwIrBZrCzm8Lz7xmxWnUHV33o5wrZdWC0eBunDqnR6a5J4NoAsGv4Bi5pdKJdPlcwJvcAXhxKgfOH3oFN1Q3YqNpHtxovYGL9aPC49AumJxxDlc8pGHi6Aqes9mSv3HJcGSFGXkffgLbqES6rFYRJ5w6hzw5L/LRzJ6Q3XaeIxutc/1YSKjIG8dyfv+y0TJ2EZ48DdVBC+7TbuEx8Cm2M9+NMx0mQ9EAGD7cVo4NsMmWv1YdMWWNwifwIY+yOgdyj9dw7fhNj00xcmVBPVw+b0b3zntC+qo+aPiqBYE0LZB1rpPZLspzt/xKDl6hiSpMehi14yNqppRw/4xaEvbGEoB9/OP+hMx1u+0cG/wRo/bZSODdrB4X+a0P5kDrQcLfhI+0TgUcH43eXLihrSab9l3bzDncL+GIqBxNkh2B38ny4v96QC6UlQeRaATw/v4SyjSZC2Tt/CjZ2Jpv5r+nhB3cMv/ME7TPu8JGWieAaeJ2FF2jj/tYPlNOzBbMuF9Cjv4JwbLgBfbgO/42pQ4FGUfhu0ISLfg7y+ysCeN3aF96HeJKrZhkPxqWT1YFs1hOtQ5u2CbD1fSHLTVSgXq9yUH32BjLaDKA4QwUbPzpAr/tupkXTwTdFBkYp6sLGV5ewdPl7erEgnb+5XuWhggdQlyrIootW48uRO+hskCToW8zls1fieeWhw9SXeIFPyzviDMdqavP8xzerw6jpwT/8958OxHje5oPv/WFp4QzWnF9IzT4FeLVdhHRUt9PVGBUM+n6T7l2Xh4dBrby0uwJcUmqx9uYqaNE8Bu8WpVBK0XKAnoNo4buFZboM4YXHEBXKnECN6lIweLQYJxkCRv/ypsLYcbDPZwkkVi2mrKdjYP+mcq4LL0HPI4spUtIF959axM9MLSAzZ4AHnA6Su+FOrDKdBBdrpbA1IQh8IqwwVvMvqbdkcfCRZlI4FkAbfp1gWiNJy+aMANGsbbhP8Thuq+2j/BNGMPn9Pu4uyiPfCgtU+T6AxfP/4tlJsvBE9z5kDpyHB8d/kNZ0c1SLk6VWB6aI7FcYObEHdEUvkbOdEqgnLKHksu9wKeEODJedAzNFS44S7KCr9x6gRkE1dBSMJWtxQajfZIYfbJ/j4g3W+MHFBCX3W/OejAc4C0dhSY0kTS8wAvudJrA9tBo/Hgymb95tJJwazf0qtXzr7iIwXfcO59zZyYNjP4CLrhwsD91EvVOe0EbprZR+3pa8WtM5py8WvZd60riBybDl2g28s14Qzu0/BpOqnnFwchwv9rbmG/ukwDhMDSV91dEv7RmoHxRDnwvj4I+FFqYPetOy8aX0YvQePnn9FNSPcuXXQUaYetYUO8XFOfiFAezd+A2swu5wdFUD37AZxNUVazhlwJCD1YUh7W09lY8LxCEhc1C+nAFO/sIYUjWZ13WsxbJhXZi2NofVqnxBd9odcJJ9S6f2CYKC7gi+s/0vJB58gcdjC2mkuw1KbFmJNd9q6L+bNlwZZs8SYdow8Y83LNpWwlWlD/mF025MzlyHu0Mi6GZLA2ub7uY8+XF0b+JI0B7Upn+vp4PfPmHcdXUCxlUZ8vkJJqgzfgU3hemS5E8RtlIYD6rKY8Fs81P8My8DvGJ2wtH8FNpj/AulnqZx4P3PtE3IgvaYCYO9/jDsXXoLClrmY+JZSzB8Y4rlmo54fFkNZAX4wqZ7D/F5khpYmc2G4vgJ0L5mBlWqLaO2B/tQysOfKuxVcYbWJSz4fhEMA6dB0ukvLBweSqWPb2PmZg8asMrA31cFebd9Ef033hh9vTfB3dF6kLjYnyNPSMHjOTOoSFaUza1KuMFtL/V/EMf/wsRgVnonus9VhAsx92j9qSC4mI6knh9KbTV/8WWuPChai/DWgfNs8uY1iY5WBKfp06Aq15Ya+93w+vUWHt9bA9VjdFhovAFFVPWis7Ukhfcqw829I3H75nwY2DqeXSuLsfOsM63do4W7JfZTzqtc+vpenc1YG9Z4RtHFHTvxs0clrBlKBcOKZaBvd4Ne6d3EZWbnOKZwCu3t1YCfixZQe48kLF/vyHsvfcVXd9ax/pwf4DU0jw/v+QKlaubspC0OK7rEKXPOTXyvchY3+DyB1zJv0Mv/FSZtrEcxdkSP7ZMxTUIBTPE3DknU0H8XdFljUxM6GZvwG/1tuGfPF9TT1cUf67ZCY6khdGi+o1drvNA3QYwrHqTR9KxflDdyPkl4xUHqsWH6JjKKzzqogiF3cckIJ5L5NwjnpWXxivtayjr+BjOip+JPvwA+VVSB1QYWECElDa1ir3n6WQHuDZtK3RvjcWe4P3V73+ZmsZUw+rUAC2vowSuJO3Q2/gW96VKGyC/JvN7kJEVMeMNhPcKwZclMLjRNoax5RmD6HOh1pR7cGNyBWk5xvMLrOPkFepK+3CE4FvmVGm4OUs9yDXjdUYJ5b+pw3wFxKpD+QdPPFWNDWBVHNpjQiv13wGZGHfyzFoTHrcu5qFoD16/K5gMjNsE7AQP68d4QvseqQmjKT4yrb8Cg1yNAx3QLZT4vIsGRCcgNmWDY9Ifc0sX46t5lVLffiLuvr2Wh7TKQqDeOhKriqa1ZnTafuYZtS/K4u0uS3peNxH71V7xF/g8NR02HaoF6POwVDFVXMuHt/EpwPjedvbdlkHjtEF4xW4uGTu2wNUceLB0kyOpPEQV2ZmOrwEnCYRGMdtnDaGsC7c9yyKZyLfa3aIPzWxVS7X6HCfti+PHpIkj4nIiOp8JhddNOWju/GV9HW6DKJYCcb8LgE3SMzhWshgDPf7xpjTnu6VCkk6/e8znJElK3c+Ls2hFQnKkM9srt8PU/TxRpdsGt43fw190vIFfqAk6438V2pxJRVG4mFFemIBUWcrH8eW5Tlees0nvwKl6Mvgt2scLncLD4ZgJpCvpQ67SP+yYPgXzBRvKaq4JH+47S1j+2oHpdHiZdFsPaPX7wzFwLxDtHg+mHIF7vm0tbP2rTuJTZdHquIj7LK8RQrQwa3r2Nv3QYQproAOFhHb7Q2wOP5mfRmEEPPL3rJ97Zv4H1ZjSy0pt6fHNqMszSGYnmwYTSglPgQkAgLpDyooxBB5RyqeG5P4LgRUgwfb9hCQ9aGslV2pnNe6P4y5yf1G7bRRXNO3BGxAPe81kNHFY0A57VgPQnfdy84ja8Vg2ma96ytKw1hRemuoLrnSfoGlEI2054cdiQDgQnbcVLOolsrzQVlJ1XwPRXW3HSKT8OT1emCskdJNuZh366BjDpqhG7vRVit2uGMP7APdI3fgITlLfwPKEkGDUvF/c/H0CpYXnQTBWHoyfs+OwsG3hfaMaTHU+Q3UkbXNUhR803zGHZmbfgoawDoxW98cXGf5z3fSaCZSe27VeCoZYEmr/HFi62GdKyjNO8q0gFdo8TQdUl47nHKhI8TmyEUbuGqb/mPhjHJqLqv8+4u7Ec/o3QAk33Ql6wpITaDhpCe3MJhv8nDJ8zUsj8igLqHvJG0f5LMNJqHJR+tafoK4MwWHsKeuR2U4HZLxi17huOv9YFqw5m0eYfZ6Btij4kpkbTCx8VTnqaAt9/jGP/CSdh+mRfDvHtgeDsej6vuBx+/NSALyYFKJhnAkonFtCE2k70L/vLZiu88YCvCkz/asg2Fbm4bUAbPJoTeXvaQxIZW412V2NIS/cSxyx1hPr+8/y68yetSTeFtTMU4a51MEz3/8njDI3Bt3wa7LbM5JojC2la7jdKmiUHTgoP6KWXGdx88ZsMc/JR4uQEEh2fx6q+1/HHHxFy/uvKo7d+5D4LJyg9PB72mrlzaM0vWBSZDzZWr2hKag3EV7pyRdIy/lUrSWdH+JP6DFXYhrF0PiqAL2Y85e8VLvDCPxaMZnWiiYMjbbv3iJKrTEjUUwBGNcazg8oesn7AIPvVCIsmdlHF2JfUV+2Lfzru8795hqgWoggX0xtY4I4ryku8peCsIXSueY6n/lyAks7FVLY9G9fhdky8IQKxKjo0dHAfJxX7A2jNQbfRM+k2tPG1ye5wIWYcxr0+hoXRWrBlpj3c873Jd5ceh7DWzaxXJ8rYI40mGSNxRNlLXn1/KSxSFoKFruMhcZ0ReRQlYE6hGO7IW4qrvUfQ74vV9Pt8A2tkFcPFfCX40TIbXtZMAaeldXgNx9DC262oPeozaJ95wEESEriiN5DDHmjDYpnj1GO+gU+oGcPc9MNk5OxIq9b1ULNZJ5bdvsue/kIsX2cOFg9PUYWIGN6HLLh2Zyn1NCLXtZfw45P7YNLJ8RD25y0u22oMhf0uKCOpDiajjWi+cjJ+mjqX636HYPLIdxxfOQ9mO9Xy859T4eKFFlCOmUP5aj9ghM4Y3GWfxRKj7UnH6TXJy0nisk/3aPUBVZixNhE/a4aAd9M+Hswo517/GJApr8H87HJWvHQSk+19SSsCYWiVJuWuEIVom3kw+dUecMYu8lCez+dDVsOvgXL+ZnAKnasV4P6edXRQrBadfirxyculLPC7npzk1uPFH+JcklUHuqURfP6KJJQ/VyDHtn4K8hjmt4U3MOpYNDycc5VdxqzAuw+/s9amRXz6mTYc+NIJUdGx9KxJAsVTJai1UwC+PX8NcxN/kM/Uq5S67zmMEJIDqo3l6Xde0Y0Vunj5yGzufNsLM3b14eBgGKe114JF+QB/vTkKNuxXh+01xnDn/XhqmCMF0l9y0X/aPlg54idc0JxBWsc86YGgBRz3+ACzV2bgWOu7sEhvA5c99eO7OYHQEqIOAUsdcHLmYrp1UAPiOr/Syamq9NSkFr/MW4IH4BXnRE3iCWODwPfcaEgXCCAvFxFIafjAh0USME+2GadcGkAv92BwjJWhgnObScx3OmzQusgpx4RA6GkFTRb7QcstgiG0+wL3B+pj2s0otHH3gdvqY7A+oZ3Cl02GgcUysMEmhNfsuYd9dZ14aB/B4o5NbKvrR6cf7IN7R21AccwEKHy6iRpsjnLVQkXsOFtDK85dADv7gxx4aiPtU68ltfxl4DtdFuz+66eqgD80kHaX730UgZ6rqyh5og2f3J4MabENxOvqwG+TKIx4YUsWf/zphflj+KX7kw/eUKRB2ae0f281V5pUYZugOHDvTIhxCMeslbe5UGSIF94xh4aaYpZ3XkAPVo8j44se6DFxNn9RmQ5NJkF8S+8IH5caAQ4WDWxw8QAkfTvHox8YUnvOUfK4GQ9Fs0RhveRo6Ln0ni0uIpc+GoE/WBjkSybhSD9xPtg+EtyDL8BNTwFoXfEUHB3z2bL1E+hX3UK4sR52D7qRS7IvxpbMo3sdx3nwggI4HBnNO12EccYMNSxtfUOXT+tAxQFVFPD5DPPvSmHp8wpQUDGHQKcEGCu+B1O0u0i5vpHV3WfSx7gAOLrPj3Ml//IKS3uuFTAGEY3N7H1lEDofRcCATg/N+KrLOxIO4LS3Q7DndSw/aQygE36SoN1tz5Xh82n8st/UASdpSVY0vPQWpxc/F0Ojz3iQUxyiFHE1OLDRFVvveXDZr6No9vEAVn20o/4efV5v04NCMbN5Sup59vs+EtwHhyjENAoUTTexVqsMbPzYiHVWb8FZ+BNEvmvBlsCpaDhzChS7fkZKLWPHy7fRYWUI6JWupIu/uvnAyC1orfQLz4eF0lWHSfBn5XNeeeEotij48xF3S7AdU4aNfj/gfk0LDO7YQV8/HOG6X5Nhtpk5tWQk4lFDNS5qjuaVdil0ZLgAot0zsDTOHU17W2DbrTFQ3BoME70ccVZ+L8iuWEWpo46yw6McWDfCFmNqgJyUdSFOVwPQLRCt5x/BMIc06H5XCs21p1GqXxjshOP4ZsRYWLNtEWc/mgISG9OgcGINGI/8CUMCZSQs0gb7rr5A68ePcOTWjSzYMBJFDwtCdOMMfvf3IyiLC6JD6k52WWVPXU3ZVGK8h6Ta1lCdXAqJfdSFwzblNBvi0aH6JWXP+QUfXXW4T96Vktf188raYp7bbUeyvWqwFQ9i1dSVKH5DAW8fEqOUpwtJyn8N+hWdRydh5rEl56AzRgWCKp/C8OvrlGssBrb2FaTisAK/h3fg8kflpP1AmI/OPsAfiSHqnS7+ySyi3jXhKNvznX6aBcAZs90wcXs1xI00gc43KtyySBEC+jXQx9WDIyQjqMxUjo43n+aVO2Xh3MG7tPjpMt5pfxxnS5jDDqtf8OFAO3RddKGEifUcdkoRsm6fosAnqfik2Y1bjM5CtKMpfPAWQ0m8zHPn7SPdUm9+8CKdusdOoZDwPhD2fs+20Z2QpGMA/bP38ReBzWiXYYzrQo5Ahr0SB8f38DYvUTqQYMBnjJ4wGo+DbMVmOFvZBjsOpWBdawc/FvhOAUcq+ZT9Ayj9OkTf9x4D5VyEnTqPMcD6FjoLW3Jw5nTSTq3j+aPvEtyX59z6c6zqvw00RyvAm8h+1AuPR5vOk3Bu6g04k6+E6r0IcZ2TyLPXhX3MjPntJR1QunAbBYPm0jwtGe6v8cG1PwPBWtud75cn8y6pWXywyghOyspAzo0DLOlugpCbyMst31G/tz0sazgJU4RrebyiAXQu2I6XHyH8ufgXXG9LoHCOCDV/ug7Lm9OppLoF9nmLYNavzewZE0DSf80g4JgaWHxRB5lgRTx7ZgLPDJ7GPnm7aF1dNVfIHIQpT/xZ9rEwmOhmUbVPK9+VE6dQkUUs1CzOqqbIfS6emLBwAG58aaOzfSNgxo9+cPv0F7ocN0LjmfUwe0cK7G4PhjNJFeT7YRRa3LoLC65qQ8+4ZswzdMIHpRtZSrKNltQeZNOlu2l9qCNqZcmQjnQlHDtrCP1vyqnqQSXtWehDr9UMcUrZXxwYFgDTIlss/jcTBGR9odhGAaSKV5Bi1UgM/fiaN88XhY/rEvHq5WROsUrkqQ93Y6XIfPQ7MxM2fMplv/dFoCx6B6PL3SF7uyxsb7iCIuanwMAqhAo7XbhkpSV4Z/SzqGAmtztuQ/3MbF63LAosZp7Ewd2IL+7/Aq2QLRwnLwefti2m/Fe+5KuzGMOd12HErRn8Snc7vEkWgtRTS+nUqu1QweMgSLcVLqa7gb3XZpA7IQO0/RtEzNGH1wa/YepFc3w1YzU9jJoKb2fqk9bDXxTkHERb3yWQ1PBDnv5uH/0tCSPdssNgkmxIxtfVYVmIF0gGNLKVxn1oOqRFufPy6X63L+xxDMT23m/oJ/sCH4caQuTyceRh4gKhx7oxsPEne+omYqr6bgh90ksTrW7jMkN1nn97JEyI+IKvOi6jQ7wOXlF1h9rBND6z7DaPidMiu+gS/nR/FW2QVoGx3jE4S7kGipVM4b3fRo6a+YLNyjxR3HSI1vy8wrdd4vHvXwMIu9YHUhv9KD/0PZg1ldDw3Wn4dVoX3/FaAPvTsnjh9tu4pUkYzHSksGuhDxoX++Hlaf0YJ7INAi8nwVzpVBibf5BfJPbDtnIx+BBtiH/OxcL5yN/YWuFGAq/kSDnBAYqujwb9d0pgmOjH4a5S4CN9H+5f+IB9vPB/FNOHOhCMGgDgb9gJZWZnhGSXUEr+lKLQMBtEpUiDpKlEKCpFhaIppUEobaMoREZLS5KVRJFKOM+5iJdTBhO5VrMRk5IBDK8GceHMfo78awKxmYJgESVJzV0TSN00ny1/F7N4nwnN/HAYFsVZ4JYsZUjV/Y+wmGHJTCOsyazmUndhdPDOh66Fpajr54f5Qtn0TbAcB79U4u9IETDKzIahi+YgaiyB4ZOyaWxfNzee+42//er4whxvDtlxlsZ3q8Bog50w4Dyf/12yxtD0AV7cW0h7Px4AyVx5+vjiI3auSmafJ9LAC6/DXvWN2HxVngR//MEDI99RjkMWHj9ZzK7R0VSy0A+FN4mBxKS3vMblLTqVVuGb3fa8RquCPHSfUszFV5AvUQr64d0QftccdP5doubOWr4tr8AqC2TYcYcyjjKzx/Ib8ZQ5ejSqpU+l5NOiMMp0J2e0dqJZozgrH52Bu+z6MWS0Iv6W96UmXk6K067SyVBrWGlsx9oNN+jg4T48GvuNng3HUZyQJjZ2FIGPZx9tPxhKI20nQ0DKNYpLt8UZS3/Spy5FVnhxlc4X3aMbqjL8uWgZXRXZxXoWulA8axQ/PjQdxzxpwCDIg1dLj6NTyHVAIWWw+a8Z57UdwN0XFEBbKwwS/hsBbdM7IG1sFYwXNeJJ13fRWz8BLGt4AAlPJNhMWQXEToTQQYPxMFdyEkcJM7+znwTbDvfQg5ByXj3qDy353IrtzsqQrLEMn0pP4/8KlnEfHKfcQwsxzc6RWkuO8ENJZ5zSJgWmcdKgNsGMaKYM3D+bxOdNA0j8/gF2+cmcu28BKXvPZM0Xj2nrCgtYE3wWP3ov5xWTbmHg43E4ReARG8tepfNOy+iJmCcYxr3AcmUF8EZF+nH6K0x3FiCNH32QMX87bRhbTd+KK2DuYwPcrSuIamkasH/ZT/Z6pUP91ktw0r1oLp74l2KuWfAEs3M8Nf8drs/W4SY9EShRbmTt2ANcMKYTRxrF0FolI7iWVMFdWsGsap5Dgw136O8ISxguSqHoD+3kqbYIB9tsWdVvEju/OIH1sZ6svu0hSIWFYUe5LKTPqQW198zHzkTR0gw1aE9dyyXHMsFIFUlsSjE5NHXCQRVD2HdmGE0EBNhyRjpcPCXOfcXD+GDxB8zvXAeGgyEsF/Od1SpGwH3LIAgLLeM9bbJA5S20LzOD1ota43TfRVQ6aE1rAraR1WcpeHXKDoMnR+Nz71s4csNj9u3+Sgd2e0P4iGJKaUzBWLs4VvsBsONJK4yNcwDtZbPhhcxrEt2njP8S1nHmujRwKATSELVGVzcx2HN2M80bWoi/boejUlsQeHprwa+XUZR78Tv9O/Ked4UJcd00YZi5dQuk5s/iC4OirGNYT/rT2ni+mAv4O+px+PIiTL84DJknx4Prsjba6ruTlKuP0cIxn+BonDgLlQzwI6m/XK7RDws9DrJevQR4kiXNG78cHf38YJHIAjhkRTDpuCB8vjSHazN6YdS1U9DUIwvfliXx1eYE+n27F+wjJTHgwGEotD7PI3zy6OYGS94cY0Jq/mYwtV4Cbgm/oLwCSUpZUwwrDkdgvfYTrm08gR3pE3jfUVvYPUMDhGzuYN2olbzm4DQwqC+j1a5hcOrAPzS2d4Pgc3aQEabF87VlYeH9UXjYqBG3vd8MPpe9eaCgm6O2KfAiMXPsyrKmX1LG1BqtAek3KkHOai0f3XOHjtU106aDahhZIYZ/7r3BEm116hh8Dy0nhaDp4AE833QJnjavgUjfYySYPkjXvglwVeBnfPdzA64NMCPlqUIQIlXNf5+7U7/uVnDaeJsuGH8nkbx3sOBKFFw/kE3qhj8gNFkUPBYeYIOj5nBi6lcy/9SLdY7XKOzJBejq0gCz6j24NWk8XNiiCLek54PFus1Yln2cJISbGb0zQdihjR/VtLDFA0VcEzOChA6bQ1dTLGnPjaGGfXosql3Hy4tC6deuQliYq47bN07AyrdekBUzAXoaX8DYvDQIfPuWas030iSnHmiwyiXXzxYwSv8WzGdLNCBFuHhKjG58eoTrXgtjwYeFEJDpwMoxrbzg9y1yzdYmG9Hn0CwkDX3ffVBEVBp0it5AglYdvDc2g4KfpbRxzVnIWDyRLylkwfnJmtAw+wxJ2N+A9DAbFu5spOf173GHmQUdnDCeqi944bTv07gmyRSCOt4AvSmFYLMmWrfdghbtkAG14VqUTBrGFXu0ODw0DTILJ8Fy1wbeOlcVLmm+5sPOxvCz1ISv9hWgk3oKC/k8I/Vrx8jO2QrKZ/vCwJIIalo3DsP3N5DMyifsbePN0aUhmCCvhr8u/+bLmsKwJuInXx32gTjrmeyx25VCu2fScxMV+rM+lpTunaBJ1x+y7nIz8JyrjJIzzXHq0H727J8GCv0qsG1uFZ13dYEbTknsY+zPJ1yMQVjlA9corsARn4LQcq4ezlubDxycw4N33tPhSSOo9qIxDYcj3Or5AjPHGuGO8mZ6Fjge/1S4w/AfCQxfegk9Px3mRFsh8rxGIB0RCo7Pc6B94U12XGIOQ7PsiR7EQMtrV0JjB8j/7wz/JzcRyiw6KchiJGdkLWS5KToYktWOz2gkuD49QTcuaqFGihjf/z0Gpo52gfgZ76GNYqnWs5h9rsegQlIMzImW421W38hY5SQftEAoUz7Nsw0lUTbwGV0YHYJncxJ4oMcdrlfcQ9NtEay27DfMjp0AxVrbOFtRGmttK/lH+G1K1XOgSplztOiPLK4JzGCdglCK/ktwbkEiN3R60V2cQ4syB3GlWDuMXavAXqHOKLauE5S9Wnj0BSFwueSCB+3GwoNiX8peN0Tll0PApNGT5K7+o0Sbl5S4TI5KCyaAjV4TnL/xAWtKpMC8aw5P9wpBi5wduLOokYJrp7L1eRMa+cQSHrQi9dyfQwLeRli2toaSPc358LlZXP3ZA074xKP1tz5wilOCg6tDYUt6B3QllqF4XBSvHCsJ6w8+wbfa0jg1ZxQ/Fkkmz0ZlSIuUozdXa3HNzmgaHPJk/d074JVLJVVId+Gk2tvgktLMfFsb9qzSBHHXEPLUc2Hn00DBngfA/pwJRHpXYV1TLz7V/sK1ZgowXvglq1rF8cOajXTtmBquVmnEuKB8MixbAmPCt8OB19P4tLA5TDVaAS3bNen2zDIYENrAa7Ytg9RKHYy7shyzTy3CpuZErDiqCJaN4zHCIwZPmF1A95TPGOVwBgVczOHRv9+0bNZZCLC6CEuM1GDT+ecsM7qZZv/I5nUVsiToMxEVRaLg5p4VmD7lCEqbiUGwpQFEeh2ipidSMPRrGfl7/eT7LqX8zKgTNardSMrjC1y2T6aNJ0xA6+RWKp6rDd7LFCBVex6uuZxIIms18a5oOHpu3Q36z0dw8SKAGvEbcPOQDtg6hUG+WzDMPPuAPfyn0ku12TBT5goL561D+Shp8FOQhbQzE/BJQRxoj/6MdDYMZEP1qGbHQ5xZ5QnTLbNIV1EHcvYvwmyfCpZx/4ZiaR9wZl4wZx4bAoEpjqiaFARjZn7BHxNNYY68OCWVzMGGex84Vq4Qy6p24LgzUaQ5Yxf5RBhR+NMXOMZGHeoHBmF97waI+GrJuqvk+PS3AvZNTSDxf+XY15tFN9+eoLBEQfjh0Eaj89rRT+ECKfZcZrPhV+xk+hvSDZFfzhgJGtc34hZFeYjN8qU1+cUwr3U3TC2VQqtJhzF9mx7vKBqmr//KOfCRFM9+YgoOu8z44Nff+N6wBq3UNqJZqC22S0iC6ifEm5tLsPqgAMWuVIGD/m8gIvor/PJwhF0x03CnmQDuuhTAR8IO4nD0Um6ymMy/bazAF6fwQ4UsbFkVxqPPSdFNu17Ye6KY/6ha4cDFQriKa+hsvjmMGjpB84Tu83Dyd2r+WYe3TRI4zGUah9d8pHE5KzFlbzr5vtSAjQIZfEehGcbFV+HxUnGU3ZmNs8Of8C+BeqjeHsZKs5p5XoYCvDmwnO5lLIBNl4NB8t5LypX/hpsDXmP9pumspGDBl0tr8dQtNfi9K5/Wf8zE6zf2kbdfNTpVL2TLMQvBoTmcFN1FaVtgLCw7NR1EtM3Iov0mCDi9hZBBP3hsY4/G8++itk0RqidV4WaJcviyRR3CbevJJ2k2HR1ci1s8pWmGugA87D7PclqC1Nq6Da4Ny/DrIDPQNbKl4EQVFNM9AT+VFZilZ3L3cAnuK4ynu5V/2MPRnkSapoO2QAlnTlRk5001uG2VAka/dMf7L1/h/bZdFCMcA2GWb2Cynjg4/VeKRy4OYZLeY6xWFmHVJ4mw6bkjuPrmsPyIcfBbzwEjpBRgUbwff9K8xBFnhqkvArGuejcJr70Gn1658HW9D6CplkGW1ZPgkbQvzbmbS4533Tn71x6IH7GISoquYsDQbWi/WocrNtjyPldRqDjQRD/mziCP+QrgGKLNMP813T1NYHa/EavH2YNq+i5oCTGCO18tUP6BGfccHITZjR2wVyuN/jkPQtB4NRrTfoYyJndh5rnxsE3GjuUtV+P7gdWgtqcUKqXfY+eO3+xpRnjMYxF3B36EGTMkIGhrHBS9f8q3Op34tnMnbLU0wJ4N5fhj7DxI0M4mWU13PuUtD8Ipc2lnhB4u7w3FFwn9kGveDlc2xrHe3zJUX/wShkb4kL2HFKzeoksz3n/FQ9hK6pVZVLN3EZQ5dnFcjhEJVl+Bk5V2cOglQMOYVlLrfEerjtZzX8s7XPOTET6vgdNud/n57Riwvh7Fz7VNoSOoH2vuL8IrWsK4JykL9z2VBUONbLbOegKKJ8/BmqtivCxZGzq9e2mvylS+fWQNuQyvQf1Zx+HkQiWOtCuH6R3FuMviGFrKm8Pilo38LFCVP34VgOZGAZjbW4kPNC6B6itFsqzw5q+hy+nbxSmw+Z4tXXJbTsJxqlj9ilhkUQm3e7uwf54en3r/HMd+OQpaMnIQOHc7KX925QtrbVHx3RX6ddoSNtu1Y1VuObQtCmVVJT2u3KgE+kN7gFNNeGf3O8jeuYxayrLpt2ASTQ8+Sm7farhdP5ZWrVWFms4b0FwejsUiyZT7YhMcWjqdfVVz0XNOM8zUEOFT8/7A3KcK0OjnQmkihiTeEA/TCyax2sI4eCtTgZcm2oNuyw8QFf1D+y+MhqfrFoGshyJFrCdYd2I65j47iKpKDlizTIFGiDGsqvbnp0paYFqzi+d3eYHF2suo+2g8fpmznTpL7oLPgwtYIeXAfc0fUOmWDOx7HkrGGd+wa9UWqHyejuVjNPhhczcanr4H+yfkEF1fhDv3CcBLv43oWB4NQt7r0MTBl3r1kF7E1mHpsoWwrHMG7ld6yZe9BSHslTNuXTcHH+wsQkfLhTjarpT9nhwFle/llBusBfpaUZDVg3Bi0wlKrehgt/knyee/bhJJu0g3+s7j18gwmrTDg7pKRGl9BsAGlU983PExFa79g+X5TXTr9WI6kZGOQme38NpPN+Fa4FlqPSMEvzSN+GzUTIy/osniiw+y7X/aMNa4kx6f3sbXNFNYcrI69ZcZwtf8l1jsvRsqf12gIYE99EEimizXN9L3kbvARqOBq6d94ahoQ5haY0t75RXZeOUmXqY3l5/F9mOzjTF3KN7D0UU16NFQRSLLtaG/25ModBzbvE7HEUvngHSECLzrXM31jacpUDKcS8sDKWCUMaTAA1a/sYcv2azAI9PfwtuX9wFFAnCmbTy7/LLE64anQPy7CLx4YU31f4bgy/QAFMxQhK753hTVUsJ1/fEcLXyOMlZn4SvdabDtHVH1qlDsWScNymeZdycuIBHXZ7js5RpYd9IedhQdg9+b9EDv9liuaZ7N8jLImW4xuMZtFtc4plH8t/2g/PwxKXom0mr3KZB3aA6/vBCK+wPM6PRGM7I8fgsf9o9k5YtH6KFBDT4f+IkVd/RB3SKSsg1v8K8WLxrd148p4uHko10IA/dkqGLfGv4jtBq1D48Hd/E3uH79SLzw8xudmrMJNqyuBn3Z29zsL8Fn/8rzxZ2ecERcBz5SGX495Q1ijmYYH9tNJazBQpP74FT8QQ5Va+CcP1soeacMrHC4RksFciDo83lYPcWILtuuoEPuo7igwZlEA+LwxOuXXLN9MuzbMI4LrmuASHcE/Lat46Ptb6i4LJxHaGZDYVs439SaTb22ZjDv6y5YWTCVEq/fxbmn3vP6wan4cbQXtV9+QM7LvtAWvxW8VlYQLH9EcLK8C70a1oOb3zVBuwcg5aYiVp5vQv2biaBy7gp86jSAl7+lce3WetbK7kKJNx1M87RxclId+sIpaq8pRNvWJtjUoQR+Em0828OAPh9/jJ0iUWijVIfun3QwvzMf9zd4odydQL4lpgx+D/swikbgx8D1NL8oEl77K7PEPjeM+XkL9i2Qo17tJ6TtYAoLR7ny96WnMdNqHY521aTJB0upQsiNkn4fIa66A5v9j7LANX2QUphJGaZ+2JpyGocLdkHN6vX4o6IQ9+ZuJZ20SbhZ9wou/6UIlWrh8K1ZkKprzuGNWU/A5tRjCn3lgHtjV/LF/JUYJGiFYw+Mg1D9LjYuWAAul0XZvnYqPLa6Q741gjj0WhuvzyqlOTmmEDJFEs4HC4LTzFZysw+igtQ42KIhhNPbL2GJ10rqKhejqsgCen3KEAZrQ3nBahEil6u4NaAAV6sWkuDYSAyN24fpnx3gXqkT/DmkDPMfL4HA5PNw7eBHElvjz++F3+Mjow3ocdiYf8fowxv7PNTyEATR483sNa2TKmI10c9xLS38bx1ne81gBbkHvHG8AD1IO46e303gyvKdZG91F2PPipBH7yeWXKQFOze04kvFdST+uwF/ztPBobCJkOlmAZNU5qPLwFfcEB4K2yPO8MSO3SRruIJfXV3P1q0nee00a8jZkg8uATN4z9nlnP1Nj7UFsrgv4yO9q3jOPT83slTmGNYmOTik+wb8fI+Q9KMHeOq5E55au4iltpyHvLXKWPBnNM9rMeKrVloQlnqXJwuls/rFw/BZzAfrQ55hcEoA9lzeA2dEXGiv/xaeO0EIKqGcdqyw5c9BITzeJgPbG9XQULuMpobsxcnFYynhxgJ8aTQZZmu58JzOfLSZaUYK5yqxxWc/nf0iyO+D79F6T38ot7Lin/0y8H2GALKXM6WVj8eErkISy42jhnJ7bpQqY51VvjC2UY4tioQhK+cOn7WXZFvt2fSKT4B9VxY+C+4EZWNffPZRHdYPmvHsUAtYoiALez3voVt7O41848zNSgG0MTUfElqy6F6HHeWnR9GBKnWQNVhLsg5LqHIbYX5HAPe5FfDcus+8IaOfw5+7stKjO5zTSNAk1EbscADTTq2kpuC/2KTmBpM2W/FRQ23KsA8BhSg/CLAdCdsbJlOHlA64BWaTbthn9hxhDbaGvfDvyB/M+hSDL3LL0StbD/yu9tO93Rt5vusRrqfrtHP/dD6pfoQvvQ+lZzkr+P6OE6y0WQ48Dr6ClQJH4Ht+Hkk0WlHRAVPemGRDYh0q+NdEHRSzBTDZAyAq4ym4J8ST3pJoPiJeCn6L3DFCwwsuHBrmP/scMb0tF7svGUJi9DO6aatLdn3X+O3XqRB50A10O5bCkjvObLRDEr6IO9BdAUNYuuUgxG6yhwiJWzjrTxP4/zJHs4r5+F/ZPq65/QdMF2fQiKPKsHS9LSzb2MWeqfH8Ws2N5QUdKTT6PKzbvw+OK1SxxVxv+LpuOmSMSgDf3K0YZvERF6sehc/xf/HLoY9st/gxnvI/R5LT11B7lTSkZIiR6PVIHFDs4zv7oli37wL2aJ5n0YIRpHv7Njnvv8Njn4yFD/byaCrzGasnxINxqzjlCehRUmkdvDkSy5UwnRPd/UHqzUTw3tiP+MaeHR96ckm+LSkcXg/e/2ZgsPZe4uhF8EF2H8hmTICbe5qwcf4HEne6B3zhITw3W4d5+3bA6Cl/qPpmKzY7XGODVbqQ+t4VUv87hieuVNAzsTK2CXyBxRYFYJ8nDpdtX7NqqBIUt0jAqd48uDF9PwQMuuOAiAkVj7KFVZZv+PbPYnqXksTH8AgXfTCFurFZ6LCrm9oqVXFJkBx+0NkDdReWQUw/Ydj8Bn559wE9vq4HW51v0W7DLjxdvIn2/UpGq1pr6v4bha/SvKl+/mhy1tvNDjKCEHGmD6JkgGqi4/jTyHC6JqhKGUf+g+0v7HDKv2SUfxDK1xTE4daYMp7V40pTBs/jzpXN9G/uJ+gPKkAD3y4KLxzNB0WnkUe4IhyeO4ljZl+l6/8VMX9YRxeLe0GtLJcWa/jhZbdgGvtjIY5XIOj9q8+3k0xZuMyF0hZPB2HxcM6sqYLtfshSEZu5Z688XlPSgnPO2piiUMALkitB66Y22hy8Bo3Gl2jjpXGk4bIRAyK9cYSyCfxnlovRYfJcrvwQbr9YzykJIvzdow7G73ZBbc+75PcpGaTGMNz/3U2bai/wioZ4Dsv5hy/9IuFjbwB86VnPJx81gsdPbdQNUYXxg0G0oM+G+54M8J4ZtZzmJkoVRzso+9Z5dj7aiZKZpSxmIQThvWpctMSUJKP6uPRMBDpqjwULVwsQe/sPBUs/8VeN5aD8dixsVRThBVdyweH7KLI5vBh+NTiTP3pz/+NY9P4vny8u3sfTqifBPZsYiDn1hiecGuAQ/4cUc/4Ff7o9Dpe+uonaVoC3XG9wboMVeF6rgwKHCrRJIRIIaOT1DtYwFmSgc/lmtDziAz0BD2nDBjWYfeEjJW/egAt3jGHbPxMppEQaIn2K6IpYKwrFHOUdJrGgo6gGY31fU9vWPJxUMRdWaUlT3d5RsEDuOGg3zaedWyZxzeN/ZNgN4Db7BsnU/UZDlAaZnCZQeLsHylozcNqXSXBGrIEbLKfwgxht0Ol+TbbW2hBuuALWf/fHwjmnKTIgnnaf+UsnkrxYpL6WFn62gm+elZR4Oha9uuXZOuwLKBzezRDxFIb+OGC7zwm8pRfEkwxHA/R4gnCvGV06d4YW4Ab67v2Sl6me4I7Ic9wRrIKOvke5ebcpqDS6sZ28K0QX7cGWpfLkG+UFU5YDbdHR4yvPEnmb3zjqOzkFXGIG8H5OJqhmrmbTlPGUPyDK379vpQOgwrbyyVS+zJXeD2nBQdmHZNuQCgdyP7JguAnS1GhYsmUtPlgqyh8yjbB5jRPYnR0P1TcKsWyhNweXtLLkrcMw75YkNUT24YfNnzlJfgosZFn0TZ8ERZo76I20OQbfi6ArR4d565u/4L6ui6SLxqLk6Iu4JPApj1pkDm+VOsj90CXWo7cwvbiIsTMLX8w6R1uSYqDu13ocUOomjxHqsMXUhgK2DvOeL9JgmHoF8m+M4/Y9E8liTju5Od5Agbey8GKGOdgN14J+pCt+C1mFZe/P8ND3eWC1pBjype5i2O4cDLE4gJsKFGC9bBVFzDFllcRqfDTOER2su3jV9UC6W94C0p9XoYVUBskskIK3RoYc/6SAJ4rMpk0aK+DIvW8sM1eLf113wuLRZbzC7AQcrzcCbVUvEnNXpwkxOXhQwJ0sBXfC6dL7cNLqEHjHPYN5HzfTuQ1WoH3Jno9mitLx5GD4sK+NTEbuxJUGVrjmVg7KmDXz9OdBUH2B4EdSGAQ52FDHtxjSXaQI5WvH09uZiynw6kzYtDGGH5YowrpoeYgsOYgLglropsFF2GXXgZ/H2fE0mVVUbjoFTw5+5eNaK/DdR1MYql0HuXeXU5ZGFB7epU1hv09Bo1wPvF4+i2apu8PiwU7Wv6IJ7zTfol9mMDdqCqAyP6CzYn8h9oUfzdrXwc/SRtP5/c/gQIo5vK/NhSPdhpA/upg1iiJB4oYEqo8T4tcl53iyQxBKbhZG42Fp8BDroK+HrtHri62UGqvMbxr3wX9KE3i90Hk8v08cxtiMogMTx0NTwBiYHLudT758yzu6ET5Um9BH+VoKLU6GlZUmOHW+M0yeZQB8zhpsw9VRXUmNuKeNFh79w2c+jMOXPzogU8qOI16b80YrPbA61g5FuXt4r3kyVMgDjPSPBpVNcbC2vAY2PDxDCXFbIbnSDMZ0BuLYwkGcZdHCB5PnQ3DlbTwic5refO8hnRxbuDWSofiYKDRFHuVoSRmKtX5BFs+DORz/wJ/kUbjn8AEy26fAuYXH6W69DoTd24rSckUkmsmUVxSBM+STocWmD+3Xb0WZuXP44+tQdpGWgKBWdZo81o5Wz8znHtvj/C/TAOtuzcTMiU68efsiEj+5hM3zp8PdFCF+MSsb4v9LxRcCUfx03mkgXIYtYUK4FEej1MhtnHpgFNye7AV+PiYkfkeLKy+Y474TLaRYEE6+Z6aiw6hJpHfoCddeVoGTOxjE1tZD/6rZcGCwBpIlGynp31IQzVsK8VKtMHwih+9sGwXHV2nTrN9pQCPaWHaTDkj6CFNFiSdMOPIOrmeU8TsHe/w9xxISirw5rPEQvL/SD7XPH6OabSdfvurGpg3W5LBjmPKtu4lURMF58lHU7kYeM2MSW0qNIilxLX7WKsJ33qbAM+My8pTPI28LOcjQEoQw6RFo6R7E4Z/NwarfGwXvnuElaojtLq8gFiWhT0IXphifAr269SQ7zx+mTMshrXlRcPGZKVqmZWPVhDUobKcG4XtEoHrfPAzUfc5q74D39smzzcM9oHmtiB9K38CKSAm0VpiEZV7mUCisj/MT7RjnnEStaB2sK1zPcxN3wcJzajxZrBlLB49AfbMpVCcK8ts1cfiyNIW/TFDCaQOK9G29HW6/8plVGgvhu/19/HpHBlSMzXi42R6t5zZD2GFHdoqRxG/77Wh2hS5/HTsCn7xNgqoSY+iVcQcHq/vQ6afAFO8Iy/QaSPVsMgpsyuLVSXX4WfwwbPCWhtbPBTQ524Qj5xejynPCaXbKeHvcLez8awjrep5y229fdIk2AVSbjWEfnlN06lLOD/nEWY0f4OVkQ5gGr/Gc5URSlnhDie+tYMgqGLZ3ZLJh1UOUc+mB3xf66aLyalT7z4s8kyKhKPwsbCg3BOtADz7cPw7v3X+DKvkyoGLvRrMe96BluCj2XpgBAeX/WHDvaFAasZifP3nP4TEWaCedAhMX/IOhMVdQJvYxdzd3sdyN2bTopwlMl7/Elw+r4vLgbSDivwD1+89B9UMXWmY0hDfgOe2OXU7jxzEM6NTi0nBBUL38BTYXpkFr22FoEJ9PciXRLC3ujyeKY8l8gg7Y6KtQ02MDfuNqSq03YlB1lTn8lpmBxrMEeGr0A+57X4UvpijD7x4ZiDBzgDeO99nWqBvNVszgFYbzoPCEDGQE27Djkvf0tdwC/gmWsnuaBbTXqFG53g1oePOIlC5ex2+3H7Pmrnm4Ky+JrYwsYGMxgvTtMG61eYnuSz/xtzOdUFh3mJdK6KH5jLE0YYc/pxgqwJuRHvC1UA2vJ2bzve49mP/xIs7Z1AR/k2QJUu9g0OUzdDlHBvrv3KKAtA9keDYAD4co0rr8bqp8MIm6wwxY/5AD2Y1azyo6ANcOGWEdWfDPfqb3SUXstUoBtlW0kcTpehBZth6XxI4AyVN6MLzSF02ubIeQjPkkJZqGn8u/wcMPO9gu/je255iRffp6em0pAG+F9HBWhw+eNRkD6SkKbCVC7PZIlJU2nyWlcBG+ln4Fj+/UhQ/TAN7v8cWHX+Pw+vMMXp6ngneXS4KuswcsUwnlKQ3lFPJQBITyrOnUdUM4c8+btwccBXthaQx67gFSh+Zh8RMtlCm9RNlaYtBYIkvuMcewsfIS/lQMp5uJ3eAUcpfOL1UkuSs/0U7bEzoOTYVHDbbQNn4ubK9YT+r1M/gc/SKfc5/RR/0knY6QZWnXCjYbpwM6NhI8GFhAkUsMuH6CEFY9WAkB33ZiZpkZ2g/MpukXv2FdkQCULqiGs7PugbpbFtTNsKcFXx0hplWPFz9QgwfT4lBQthfH/DMEnyIhFHg3zDsWDXBk00Xu2GRI1iuNKe6OLMTAKnxt/JPstazh8PoDmF+/GlaWSNKh5DyOlgtE+dM15ClmRCIrWvE/HwP65ToG7mhNBqHRm3koczuvNhSFHROXQ/SwOcaIZHF8sAAMLo7EbRLT4MbJY3TvwB84HRCJ+QV1eH+6A7XmhoFGsC74JlnD18UhfPCnLnjd0CUvt5f0ZFQByX7vgIY5orBx7yEo+PqY1QQc6JrUVqrXNQePJmWUF5WGu/mGIFd0hy2jT9H5rDeQQJvo9tRKPrXuJ52+Ig2ntpyD/vBeNnuwEu4ZxKL59TWs7WICM+u0QUrCgRXxMFuPHAkK54X5r8hI7qj+BxvN5elH0mosSJAmkHGgXBNxOixQBNaB06Dl23FY5RPJB77M5C2T5tLq+w4w+lgo9+9KZ8PeY/zPM4nnGxrCBytNDu11x729TtAaNJUbLI9QReY2NDa9TUsXVUGM/0r0PmsINmevwLMxgbSp3wb6SnzIaG4YjHpbj+aTcyD1/Sb6WZmFhRJjIGF4Ii/Z+JRuCnaR8BlZPLH3Fvea34X0cg8svJKLBeY9UDHKAPwemeHwPGGoWizLUut3wBZHO/51xwafBd+F817CYHXkDj/dBfAvcDtk2TxhlwVplPkxhyaNqsW++yVQcruUtc8Z0ZkpE9k2WQrqPITh0tPH7JRTA6P1f2Drqxjs+fCJ2iMLedWk1Xxm1ky8uVwIQnwLqVQ8iXTSzpPdyTJqvbcaK77dw5c2TXD062nACHuK9RKFwJI0ysm1wtfumpD1UxO+7pSBUfePc9lrEerMKgd7zXj20JWB7rQcKjXT4bkJ3/jpqQz6vJlgz6xYPvbLmgqq9PBE8GnMX2kG+wfyYfOGLZjwRhk+1gxC7X0reqD/FI2dvMnmdijq1+exxCZpeOgpjRoLt7PWgkngIqXN+zP2stfF1fxQ3wgXGaxC3XMz+UWqEMxoGoWtc6J4lsd20A04gmKLHuGPW19oc24ye9m8geQHW+EwTIXeWZVYeROJ38zGcZu2ov9fhgQ7F1JQlMH72QT5bY0oqkdQk32T3yZosM/AOl79WRJtfu8j9S5HODGsTLEmVgBtaeR8aBJ4HAEqDIvlwYoi6p13C+WuniJ2vYo3FxyDkK+CcCpxJryZoQrfazPwgbEeezlY0aNV53GdzlnuOTKWsuZ9oMlrndB/mjJtPiIPm6QT0SzoO82anwVkOhXsZoTTM7LC+YvPsdVgOHW9d+Ljp+Vhd+dVLledRufNv5C0bhpZvjLgzIh3UDZyAJfYnsGwqrl4v10I9smqU0uFPlSRCUxp8wB/rxTQip4P5qU1uPrdH1Q2DcURD4Xgu7QvLBD6gBYjA6lX9jQ7jdsIBtExHFAsRFsT8sm1lvDyaAmoPfmFfix8Bk/1/8LRRxcgPWk5qB0SgMRPkjDZrRadO67gk1FWoP0nGNq08kh2VRu7tMiz9XQRtoxexWtc5OjzNHUqOXOPf5wVA40ScZq16QctKRTjnOPe5DhGDAref4QhuWIYjNPl8yZ38caGCbBaIgvcF3rQkxWPOKNJloW1GilljiXL1F5gb9kZ+O/ZOqpykYXCmsV01TgI33yXg9Vjpf5vmGKkO3C+zFIIcvSiJXJr4YqhPqgHOsLIe87cNToVqjJ34cy1m1Bq7TOctOYjXx6dgktn+MG8bQCj1RJIUFcdDEXk8P7TGbQ74BG30Vna678WysITwGyrCcqVjoWxZ3WgLHw+zr7wg2/Hb0SF7Eosvh/DD87Z0M9Tu3lcmjkeeaEFjy5EsVSEHjz5pgW3hFfj47zvMC66l+Y17+Ddoqo8RbGar5I5vFo6mkUl3+L0zaep7jUTjiY8FqwNMl6u5HlMlCe/U2Pj9CnQS2/gimgl1gxMwdFLb+FQfBOXGkig75LRcH7gB+uFj2a9S9KQ4HSXIirOwTbFd9S7shniEhfR5z+bcPHNbkjStKIFokugrl0HzvdtgfGHh2CvwET6cKYUTlqP54npHSxkEsHbqBdcXyZwv6sRNN9I5CU+4ehzzBwaf9mjo7oKB1adpGnHq0AvfAScDj0EB7IZ2rZkYMsTE1jVfJFFL9jziE8vUF3BkPolNdjr+H18cWoRTpgoB8/YDf3/XUb13bG48movKG6uJJ/gH/Qqo5b35Pii6fV5mKiuApavPcnpP2+UulhCTpuVYMW3sdQ5PAr/9LbQh+hAeCslhBfVTWF7yX3+caiJWuLHMQVvpWiJxbTFeBd5jrzArWLTMfvGaOwuHwVfqhPQcN0FNMwtoc8tLeS/PJ0eKLaSjjDiv1WfYcHwXtz60BosChogJ+EFud58is5r59DxPmM4Xvoajtip81BEIjrWvIFIc4ae7NNQFfCKwpf+5N8VInxnbTYIat5k8YC/WLv4O9mrpcDH2QLgELcIBGsTMMzoJv+U9oQpU/1AcXEuyN2QIe+UH7hqSxTtQSGI15yMtvd0uNslHqcsqqVdkz5SoHYdp1bOQKPhHCwq7KJ8qxFwQHUnXdS1x9TuQt5bZwHWvq2ocmErhSn4UeyBbbTcJwH6+s1hyctx/EJsNVw/3sD1FUK4/eJ2yJmYgGVKZlj2ZTVPuRsLn+5Lg4iSHYpOT+GVba68IMQA33pWwJ7vS/nyiO+g9teGXqfuQvPfinBSfj1ovdCAkKYQcPaYxerj1tD3flmuMZNClYWL4OQxLVq5cwJcrt8K1gdW4qw/2zjKMpgWTdanqUUWvOzpdZCLC2XP5of8/eIkqC+bylaOUrDs2jPUsM2kl8OGGL/3ElpH7EftSw1YrN5Du6qtIVJHDL5LLqQ5xVXkfiQZW+WWUrepLn4uLuKPlw3pbFQSbQqRBy3Do3TQfgPl3H4J6/90YrLATZZ828eoGcWZDcIwPLKFrGQUYKOgNug/9eDlTjJwnLeBVMNd2hIUCUmvGzlmjjuYXinEWXHGsPHrDyg8boR5YjYkNf8qLRW7SyF+Y/BSvBfUpg0g+9aR6aA+qC4vx2JzCzjdeAKbjy+mawU/+VtZAIm3P+I290R+7XYDQ9+PgZajqqz1nxoJJLSyvfIorkhpol63SxT4wQNSBeJA/pAc516WBUPp+ygSIYhjyhQo2mEtGUy1Iv+5F8E9+j5rhBZjh89OOFY9FQxTFFlaxQ4yLk2hZYXfoDZeGenpFX6iuoKTLYTx4846+q/NGFaYL2CpUSvpdWE1iZ3ZBtX/iqjVciEcD77Iip99ubbyH3fni8IWC0sePOnG47q7yKZFGcJlnBDXxHOOeBJqxGmSvf9xaPUQhaLeJI4YkoSOAksoet7Gi2cfhDxPax6WjqNVl07AQFIpeg/JwnbLObgdb7Cj5RLqviIL63w8eEt2Gq5K7uL/BO/SzvBaGBNC8MQxkLJk73LL5BX84sFB+pBURE9S/tJAmzNfWNOIx+u/sKmQBMwddMG47UAqa2fj0AU5aPPeQUuHfWnJ52gS+30FFO4+hXep4yBzzhOYLT8ajVZcJPfqfKCJ+6lF5DRLRYjyPgkVXrNImA5YItxaF81BolWsufs9XFIJI+vmdHLzEIMgJRHqkHjHxzZUUHGxHlg2jqTipxrY/MGAPxZtQJNn1xGb0uDK8qegmFKIO89Vw8hkK7h5yoAWXN/GXxrPUkeoJcnaPsL0WAMOeRzH1Re/0+mCuWA7TgOE9eJ4f0s+bIufDxGebzEtywpeTjjD+W7JkO7eDj/dREjnrxQ8z98Ine27aF7YVGw6Ngty6teznvRiKhS7QYmu88BpVROr3pcE50EzyhZ1xbC/N9BPUpcc77pw/pFnMDHrAU2dq4U3sp+Dq4o6JHmY0B7qp2qPbDLStQVFg2jM6r1FFwNyYZVqCRTel2Sz96Lw9elxbpI9jUNhm6H2QATqTlOACZsC+eHqcDra/Brma28CDw1lqAgpg9Vvf0OGqwU2zZHl5idVaDNyOX/1r8XGSh18L/yMPE6PhdollvzCZym8b++CY95X+bXWSPxrns86d/dRSbQ4rhFPhurvYqD4sIEbBFKhZq0tvF2QSNjohCU+01Gw3xEXfYgjp2cTwPOdIUhLeLDXDD8WXbQSXL3aWMZ8B8y4dhdXC6liU1g/HHHOxT2LlaD1+k0+12MOgeukKP5yIT588IpHpf7jv05XKN1YlfWHVLk40Aqat97Bo23XSFfZgmOcptHSKc0YMcOeFK920cjUMJSqf0cp5xkKlg5h5YYEnl8zQDummoF71HlqCrKEKa+Oc/cnEao+NBlrxk2GeNs5IIeGVGt0BXwuKvORZ9No3L9Z0GE4hx/GhuGKvHtwXkMCXK/tp6H7eVAQXM0rN3TBkms7oNK/HduF56KlhwA6vxKG8DQj0K8TpoA/7+GpliX9kgvDQdFqnrRJnw8aHeb45DtYMyYGyoolwD9elT921kPh7d2Q+ymDlCRGYtdxR/okakFb/OXYTm0W/haVhsFAB/w+/IYTN2bhW9tEbnFywwkyH+HR1Upas7werss44tBTYVj96g/F5i/HH9dG4jzdyxzzZw+ECKqhSqIc6wSsIi3ZPJjnbgHLhcZQaOcBMBhxmgNX+OPt7lS+u3kfqG5g/Ol4jo681iOh6ZKg3T+XZCPP4NFWUfaaVM7RSk6U+k6eVmWnwrGSp1D2S5V0xxqCuV05xs6aBx0fG1Dt6j7QvliFA00R9PzoS/rTng8mnT0MrpNhjGw0xHhqgMWK+6D/SYQligUxPs2PT63wxbB7u2C/thMsGZICucEEXl6lQtuPa9KOTgcctbyEJiRNI+3jUyG3WA9nf/RD3RWmoLRtF/a8X84aa+5TyAbGrqPtcOeWCPw31A59Zlth/IRHfPIEg8BPYbrh/gxdpzqS6S9PfvT2EOtKRUHCjRQuqv2AiXlPOVB8Inz6IMx7tAp5W1suf6y7i2sn67NlWj188T8GmuLtLDldC9Q6GVbOtqeD17NpgfkW5EPOXHfdiqpmp1GFtyZvjLaH4F/psLdSAjZNWAGqrnPIwobQY3IpOypW8alVxhjlvwMl84ow4Wcf2LUqwPhRH9BBzhz73vmj2gtFHOE6C+XS/tAUq2qMHMoAk/cpUHBMCwLgEer46rO8nzpI3JyJRzeORme/uRSdrISaIiKw9vpnkK9RhEFjSVj9SQhN6kxow9drMHj8Oh+SP8h6qYSH/B+y3sMMWnVLCTY71VNfmSIOlytxSeQInvVgFSn6h2KUeAaPO6dLSlsPccRJCRgt1MlFA600/G0MpLsc5KcztsPITyKgFN2Gn8oHOE3Ki052I1xK/84REWu5eqsAGey9SzTyAL5z0WIZjSQ43LwW3VVNab/NWFCRjaKhp/d52pYymKt6ApfEziCrlVvh6w4pWDvpE9qJz4F9n83hcVADPotuw71jbTCudB2NPBeLgj0tlFyZD72i7tRjnc4XikfAvoUbYMw0VbqooctB9WNB4b9j/On8X5ArLcExj7NR/0coS8iqQIfVThq1rJvUvMzQvvoaar06gfoi22jikixy22BAztra8KTMGIZenKdAQ23+OSaY7cQPY2DJWbK5l4mxUzdSR6s51M6wQLX51mCoPYWHNhjBwRSgUWGf6O6IRKqSnwcO36ZwgulB4m9H+LPKOFB5rcXFWw/S7Ot94JJUxC7nImiR7kOa3tWEOQujeWtPGX9VNYAjH1LR/O9UmOBsyMu6T/Ivr43k/D0Er/2t4BA3H4gfNxOrF42GWe/3sPejdnQtHIuaT93Qv30CCbiMoR5Zc5Z9tQz2v12GgVNMYZxqKEnZhdHg0t+0XO4cLcx7j95+p3jOtkg4/jWLx2suxXwlHfCK3gXbbB5BZEkcyuZKgFXXOeyOyOHlqXPI+fMHvinTTr2TBME2cDVJX70CQt4zuVPUEXfsiaTrtsT3txig0cArDki4QXujReFHxz1w7N+BEvoGEJe1E2efPIeSggXw6nwfcvpl7GxLxBUNptBefgE8BY6R8uZ6vtPwgT27rlBcWhLk6SpAwtvZOLDCksZkqkPQoAZIPW4DgYmf6XMccL+nMVY9EaXxQ10o5ieMUTqf8fU4Adiv+Id2v3PHnrHVnLVhMZ65Xc+F+2N47xZNIv8xfMKhgm/lG0CPbBwppXxk4XI97HbOBGFdRSjRmExPWl5R/c7vEDffH8aIGcKNqVrsO6uVuo33kLPBMdS6vY6yNupj9JpnuCCii2uXuPF/m+Tg0iQHfjngihoDz3nKuHhavEqb1c9cwhEXF3BB5VlwrZkBV4dN4dTCMDC0/kIv4kQgdsgENkx7AHP6htF9+maKU6qk0rRh0GzQBa3+PNKZIsRrKl7SEOfg+KESuvPHkS56nmSTtdKQsiEXU1aowZkrpuz9Zhom71qI4QojoKMHOODDVfy+4AeE+o4kv2etdMJ8MtgkiVFLRDd0fA2EZKcg1npWjYJ5pjCc18SF172xceAP5BWNAPtRlaARdBb3fVKBJbNf8JSToTT86Cr90z+HZUFFFDh5CZvxBFghkorZZtshte46RFWaw7p1nihvPoizt7zmtOBeTvXyhJWRFtAe/wpaJ9zEJQbbuNPaBR5/H2Q/+zE4bZwmnRIWglSBGXBh/USwqPuJL8dPQKUfa7g3YAAe7UrDuh+vcHDDPXZMnomVMrFYmqAAH/NO81vwoJ4oMWhtDcBs0xGc+vgkFKmGQ2WJLTcf6gGJFElY9mY7LrkVTdKTp0Nc7xQ+nbqOts0a4PEjgjD3RDFq/VyNtiLCEPnAB/LGOvPZt1fB4O14Gvp2kA0yj0K8/QJe6FyKhXMKuX2GFDQFpZJeVwvkyjmS2tlB6niuCuf2v0ZvfUX6ejIZBSxd+cgrI5CQ/cr+HYvITUYcBm074cvzO7TfxoF0/iiy+L4OmhsrQir39EE+bj39Jz8GBY9r4oKcJrIxO8BFOnKwZ+saem43nvL+m4H3VunAk5/b+cZOBRIe84yK/c6QxteZoD9zJ8T4VvKM0OP8/WM6DRfpwLWHpqRV3UIQfR81vFzh9acVaJg7igb8ovly1F7yPTkTahsBXofk0NDaS5gTpMLTqpwoZdNP9LTejvdTXsOlkZ54fcEclr0tASgxzA80VejT1HioWtoMO3q3k8ads7S925ZETwfztCXEz5OVQCRmInt7uaHd3w76k+5BTQsOUefS+Ww6XRIXToqFmyMyOUN+KqhcVaBvSjXsBxI04ZEv/mtux5pvF+DQmVL6e7MRC8CTq95NB3XzPApwvASlW26iqoMjvvERg8S7C+F6/1o++8mMhSIPo8gXM8i7LYIr3M9C1KYR9M9iL8Re0GOvX0fg2uZLrDylGnJOp2He1qlgMiOdbjsXkOL4borf5oPnjMph6rZK3hi7klo+loBGmAqSiw5Iavaj1gYPmhulxfdCRqHRnLW8WSwItBe5UVbnJlIXl6e/T/XgwCMniNiqzVPO7MO7Ff4QZtZN9lqz6E/XRU7JvwKXWzfDds3RsGNHEHy4LU0X3AdQfu1h2K14Bzfu2IlVWstpoXAYe1UYwA4hNVhweoAySq5Bvu8YeJP6gudsb2NSSuSe1YrUX0Is9nAv3HilAyeTP6FlSzLflRmB87wnc1n9X1o5Moril21iS+EzmKPtC5FGyhBht4vNm+Zzll0vrRCOhzzfiSDQdQ0+eQRQeuY4LF/8lQzeGIPJ1BWQoxfPl59e4IR1phDvFAGNffagskCOz+jux3n10pT+wQJicv8Dla2aOHdFIGxa8pDD5wazaVsnPkx0xi7zFRC2twwWtstC7U5VihPfxM9WGdN/208i+NiRV8gL7MoQAWu9h1iTeBX09ypCxyc7PO0jB84JwiQ7Th/TZovis/3CeDzalNY7C0POpmZqSzSBbSv+oW95CsQ0JtCYI7P4k3k8yk1QYMfD7rzzygL8U3uPFNIJTlZtxX/jp9EipddcMWU8Pas8z/t1XeBouAt6P2iFgZKTpFI7AkrfSID9QiV8MS4Yf78w586mS/SvfgR9nFUGXxKbYenfq+Sm/j/i7kMbCMdfAPh3UHaDZI/M7K3MKBIhpKRSoQiphJa0JEVJ9NNQ0aQyU0ppqqQQDSQqpEiRBk33nPsS/yf5CMOs7FISGq5F3WMVVGNTxTbjjuGbi4ux66wtXT3jiAtOKbKX+Eh4ediY9nU7cMFrTfLO+cHnQ6RI2WkYUp808YI/Hmx3QZXFOjShyW0Bjcn3Z6WuOLaqHyKtSxth4MAV2P/VEKdtlKIGD6LEIQRNmd/koFwPW8tH0MY4cTLPrQOJlGa+LXgaR7lEsFpoHm+MlIFHO17jI51KnpodBPbLteiqbjQc3xLA9srdbCw3jWa0bIW38ZNA0i+QfwqGge7Fk5ys/YcU5EPJRigLbfok4ErZUSpQcMKvZlZQdvIUth0bQ3vO+cIhrZ/cM+8f5QoZYfgdDRL++Y+XJWvA0VSAV/NsYAkuJcWtAF6rPvM4fWtoK4yBY5zMjg8k2bTVnc3fGcNGpdWMu85j7fUGkpWYC6W75Zh6JDHsygkQ3rmId1Ut4u/5ctC7WpQu/dBCk/2XcdPS4xyT0IfKOdvZ8/56uv5oJLbPqaQtdsqwsFCFp6jYkFfYNuxSOUYV1gdwJTznlf1bWbu3CyeI/oKLa8ZBoYYYK8v4UItxFZ7KPgrn19fxmbtKvGt4HovYTcD0KmlO2joJWsWTePLSVVznPQji/ZE0/tNdrJEmjNWOxKpp97BEZz3+1JCAmVcAL0Zdx56dnfjv2xlYF1EFqb+SUVAvjt7E2VLAyBa00peF9kOTcUl2LdXGTkMll6/wYKMO5vMnXh1zlW0mjQfrK+eg5hiC2DI7qv6bwFFFeSwd+IKLHR7R4RvAX/+28oqkGywySRuHj4rDf8fFaMuZmeg5I4kUJp7FwwnjoZfyaEbpDXT+dRA3nDiGn2ONYe9zd1ovexmLA3sgfYoXPO+vJ9VrflD82BMKDxdg56iRuPL2CNhmsIyFRodQbuZa1JuaChdKD1BqbTBUDunRKCNJ6uz9DObPNSHrthHWHqljlXlfMHuJI3QtMiccTgaVGXXwyDgFRl3LA9ejCvCmfwtFfZ6MPWev0ImeXex0z5Z+aIjB51EdeGb/LtjaXc3vn2qD16Z9FNuzDEdeUqKsllJsrVzJYm8O45ggT7YKUYf0nCk4/T9jyE024CmKn7BaKJfHXXPkltx4UN6pzZHTgqG9+DNH9kfDD54IrqYT6PunMxgIy0k3ZTMs9G+n2DkvUfrOIQ7JWIMTprTzZw0dmPsxgaS/O7ObUzcL2jmRzBwJuLh2CwttawX3544kJjaGZORGgpifFli8PMSXE96B85ZyGKi0BtGwdhA4KoPlUmXYUpLDZhvNYKf4Gt4w3wndJ63EdfcEUD/7NZ96GsMnkzXBYuouNjrQzopfhWCETzXoRz6HCidx9LnqyylZRjxt7FjIaNCj4hHuuCp8Ar3ON4KaqJ8s+C6OpnrfwvelR/hWmDgvaWjHgOnrUch6NH2pO4MfHPVhaI8MxwYMgVzQd/Q8UA2H187A2T3nKNkhgIPSgNLzSsn5jjXcNnfGDuEOqFoYykMTWmDRRG3y21eB2qkIZkLJ8LG6DLv2G4KcuBNXDnRif4Esvr6yh2LInTe9zIE2iSjeILsOAl9dgruOoiB5fhYNd5zn27WzuV7Clj6P6uRVqccwOmgeyE2SJoXeJbxygRlIWZzF3kE/8N/VCB5PPqObwTVMOiuFHxqTaK+aGawJ6MXqSbLQqNGKBa/0wGS+BqYKLKTB0qkUvFeHd+gsxOkO/8D71ChMFlKGp7H7wTTkDWS8CGXZujS6ZUHgPrKCu7aHABxXxxfzXeBHngR8kFjCZ4XieI1KF1uHFVJCggtvleigqsmz4L/tSlQ6cTRHWCjDKwFfeN/lB/vLmuGkpS8ZQTFPPmtHl7ZcZl31XtTeYIxF60xg2c0YkBZaRmv+muPgKi3YuayXI1Rnc5DzXq5cto/90nfA5AY78N3rxKdyCIJKT6Bqzn2KNixj7TszwPXzTDIazITH3zXR64cs5K8IxHGL5uDNyD7wdxSGJWbn+Vx4K5lfOYYPDm8mcXNzFvWxgdK2TlDKnIt3U7LxoE8TZRQ8INmV7rgrZS48X3URT7l2ccQVApXNxuyprQ+GE5phrtNk3Nv2hTyk7blEsIYW1X6Gj17+mH1JDl4Zf0duu0xFiy/DqRMCJDtahW+6pWHKvFfcGnUKrMI2Ym2dBDg9WAK5bV9Qbr8BppxqpwNkS8JTelH28zKwfuUJE/ulqTrGGl44eKOd7G0y3tyHOR438d9sXfz4uQWNPy4FQYsE9Hl9kmalM0TcXIf11+dDbPRVqNTrw84/5Vh+25rHmNzliZsP0JjbjfzaVR2GW53QM/Mm2RXNZN2VjXxMZxhOj2LcmLaJjjnvRrXXr6mwfzTU3xPlNN0efmKbjmGOulzj84QNzMvoaqImmPR2453U81ijKgh5x8Rp+fEIXqBYC3NttuC5TS7sHPkOEhqVoWRWK0Vcr0CIFYS90QV8WCYFDpy/QMX73HHwrQFN+lZMDfgfiDa0kMrhRdQ5WRwsPpbzntMPYVPPMjwu2UVKB/JIaOs5mPp8Ls5RLyITZUG0ERwH7S6TqO74BDgQV0cSCqvQxjeYMp6U8loPaxLQ6cfTRk70cLMxLL1lD9qdC2D8/Lsg0GYKcyc20/U51tTWZYb7HmdRcHs5W38zg2uakjjSv4s7/p0noT9hdNVpKZ97bIOitcb43v8KfTA7z4+N9EHu0hfe067FiX6LyeV9BesZn6EvNpdJb/4aNn71Ea4mxYJSjircvLIHk0dW4O2mXxxu3QCOaVkw/0syHzE7CKKTYtCkrBZv37WC+d/fYkhrEMaOlKOS9tmodz+ERh/6SSVvToHlTxm0XRfA3z6Zg2hkL/zJDcbsSH1ePtWRLOdcJLkMBQwpnYoT1q3BArlG+HDMFnZJaNOf48L89JINRV2zY6mvYbBT1ZPtv65G/4oUTPUlmvpYBLS2pGHz4GSsr3eiR2ZL2PZIEd3SuEEmKzfAnYoY/qzfj6bHhWGzUwsdk2qE6QHplP7ag2P3DZNj+W04GaRNaz5FwVxvVco0N4SavfswUdGX1U9rw+4X+rRfNx99vWVpbsIRMFa1p5jeI7hzsw409XVTYHEZ18+9yane87kv4TYnjf/Ft11yqEOgE9f+mIcbMhDK7d7CEpev/D3zK04078NFudHkNtaaPgZKgdW17/ClxIbCuhG+C24EmRJ/ertuE5YHWUDNjX/4udUVfDd4s1prAkjCdRy4pQZ291oR14yEU3+i6WFFKR3fqcZKAjPovulj0hmlh1dis1FOczTovd1McqGp8KtjNAaPeAmu+cQLZu7hMPCDY79X8duqM1DuLwBPCpvhevh3PBAtifO/moJywTE2UVkOR652wWTpJHCZ/ozXfdUHpfEaGOb1BrLG/wWnYCH+cnQk+Rk6o8fxnVQUP5cKPzEHzFGAMQsaYduQMJf27eEQkWF8eW8LC2c7kmJMLDr/baSY50t5BirCo33m3NRwmz19cvHA8Wfo+qcPk0ZEsIROLAlFveEB3QP0bqUIBHy/g66eDXwgzBks11tR/TJTVHtRSYudNuOX9z6QKdlIGufFwCR9PS4ItoNlPw9QnUAUHDzTxg0rDThuSQUMW9Vj46VfMHuCAdQEPOMD3ic5UjkKXQyUUU4nk6Sq9nDh9qlQ29BKE0frUuoHSdD0McJT2SOwX9IOTXAhtnbvAuknGyi6EjjX5yjs+ttMhgWjIOLid9ZcIsENK/Pwi9ZbnB+8g1Stb/G2+bH40iuafwkV89niMdAWZcFzmt/j+NIuDC5+AXeaz1G/bwo2ZNbDiOhX3BjXz1v22cD7ptk87pMvzEvswuyUIS4JCmWVnK2g6HoEv854yEfXPSRPEzsYadDPyYM/cOsEKfhaG8e6I6uosO4evbnviS3iCjRtnyykS6qAbeUc/rikDPo+asJVP2FKMrPCmW82YLv9Jvi8zh3VBQbwh7AdmDm0UO1NOTI8Pkj37MzBbeZrPmRegK7vv+P9jan82fg7nBiUB6GOCbT6oQRqv7aENdaP+I3bQbrn6I2Ot0XIrdKc5028jPrSkyGlS4j2i+1Dv4+HecCjhi9LRHLWTSleYSTC5VlBeNz+Ha7fZAWuOzUw8G8zXQm8yAuWWVG2rgWKKazhCqkjIHzJBN22f+HSTn3YEllIaa46uPRoPfVOq2PT3XpkcdKVSsaV8eccPb4cqkXD57TBbuROUnNcCKM21CFavKVFI0/gioc6eMRvFV9SeYyLfluwyXkZmFGlxTI20zhaLB0+Cb1i+Vxh3OQpCwOfGsn/QSaGN8lS5wNbaHJR5H2iDyhpw2Xo8htPZaZp7PG2FEQuOkPqb2l6YnKUJxyygsedl2nz5Fgw+eyCmpZy9GyiFapF7UHPnmguW/0Vbr1bBjVv1QCqjOihwQ9cfyiE319phZK2e2g8RwQ8Fc+R3NR2enKtm1J9reDxuwj4VOLB67yzePqJ1fx5QijLtvVgjk8Hqk23JttzD9FJ3xRy2pRh4KUSNCp3sOO9PiiX8WfHUfJw8vo/SDwVCNnC72hggxHc8md0WeXLUo5xvHTzFmwaIQO3LDdymvEN8vl3iyWkN0OVkgKorSqhVYl6bDlLAx5Nl8eNh0PB1r+btojEwHD7eHiy1A1Vfk8Ao7fhNDit9//NjKXl62FZwmyS6t+ISvP+ozsLq0hy/Ay6800adNx7ULG/l24u+c44RoxHy+txRt4QGom0YN/ma2A3Yw98mq4KOeu16Pn0NywvWQIGz6uoUcmYCsbKcJ1HJVpEV6Ftszes/2YG0mrmdFgvmpQv7eezGcn8Mfg+zbsVj69Vy0D2YBfP6tdD9UqEsys7UMHUgd5xOk1a68Uyk59x2rElNDLhGW55kgeHz70FSUl9CGyYw5Mc9+I361QWfGNMlp/ewquiAl6fsRVSlxziT3GNdH2bOOTa9vLA5ePsq7+L7ifcIoGTunzENRoLFy/DU8lmYCX+ltYPjQTh6ie4vs8b43yf8SrbI8TrH+KICbvpvNd6DPw1hRqt4/lTpR2knXOnvHplUpWxpOwZ52GZgT9U2KlzxoVtOPaPBAZd3U2XT1pA7FUvcgiOQ5dpI2GV8QCXXrkE+87Xsp9qMd59tB4dgnbgsl4T2BpkhiEtOqjgaAbFms18wfggXZqwHmbFRqH01USs/mHDi07IQ9vudbz8ezdNCRSmUzmpmHXxEICrC/tMHUtv77rj9rJl4KugBU0NDbj/dTgV9gbQk38rIU5vMZ1++Zu/yLfCg6kOTAoXgIWtQMphCplm7kZXo4+0zMqSAz6v5XGehrjk0RIIfKvJYclO+OCSBQgMNXL7rFP8XD+CTO3n8pu8YTStjYRtacsw+eEbWPr9ECvoInBnG9mnmdNWkyhavLiVm7IV4Nbl91DzqIouuOvhFq9yKPIxgMRF0+GdzhcIez0RRi04QRpxa7m3WIEz3vlj/AInXBVnRa/LLcBqYh4lrB/NppPG8Jq+KhC5WUhNV07ztTfpPJR3iR7utOM+fRl45X2A+gY7YcEXS9B4FMxLnvaSfF897Hlex9KzJoDWVH0omiICO9Xf8rUFqvR3twu3DfajR95BlAn/RB8Mp8MkCkJP7RpSl1CAskXh6DY3nY92X8K4g0epfU8CuAhvh3iNPM55ORK/3c3nC7+lYWfwXHA8e5QfW12mEN8R2K8fjZ0rn1Hsjw2o7y1Ph70mEeZJwMOme1wT84z/aqqSy2AHDMpnk4qdGZ+7E0IcMR8Ey5/wih8CEP9JBOMilCFytiiGBElAzsF+Fo3aRoP9v3HG4BSO8jkNN/URCiedhNoPI2jlxkMQtOgaCwnuAFhhimE7jrPsnencGyHMQWfGgtHSNvJXkqerFgnsnurCBwXVYHqpAtvI65Hl4WrSPKZEt4f04OrMjSC04QmKBFVz9Pa9aHY6gE8lL+UXbdl8VN0Gh0+eZAdVUdh6QBU2bGiiyrp6WhphS4aDV0ixLZ+UWixBI9KAxPf+pJqPAIpmCLMvnYFdGoPonvcG/uzKwXeNndSSrEZb0ARMFLXZxkoapm1xZH28DV3bp6Hm7VDQGzuPD8ZkwriFU2CJlA9N/dMON1EW4q6Ycufi57h15F32eL8XRCQEyHzUO3qnOYS+q7vQ4U8xB4w2At/hDRSuO4W1N87CiYfiUCakBnd9Pw5iG3/gPMVbWGIlxMtUraBo0WZQMrTCeb+/4857ftw8ewGYJbmiSMY3CPhQSzKhs7DWQgfqD3XDhZdebPrZHNKD+/npq/nwweMl/SzfjuOKH8KI24bQ/58N3NBYD04pZXw/+SkMfWhB8eI8/pi2Dw9GhvNYx+844l0DxvhqQZnnStpw+TZNfSjMKR3WbHTHhZQXOsPcngqQ03dCpygH1gwYByN2NWHgASt2Pf0ckuSZKq39eWrGF95w7BT85zWXdh435Xm/teHucAHNX3kXP4vuxXGWJpDc/xVyfkljaOJJWB6ux+NHhZOyhAYI7brMdwxUOPrnMRzRMY89Er5y7DlGvfAwiMzV5+UnRkKilzm4HgrnpUZP2P3LZ+yN2YrnfIN45RsHfJ+Ri4nXvvN15W2sdFcdBDtN0NdwORWMiEfzL6tpTNMAjVKNoYVVxXR80V6eqxnLSr4mMN1XCLIvdZDphcOwreMD7HDbALXZ0my4yZJ+xZrDb607IF6iChJh46H1hBYMdfviVX0FVnPXJcmi+/R7bxBH2SdgproPrIxB2GEWTTFZ5ylpTCzUDazFO4lh/Cl/F9ro18OB1SN4keAHWBlsCp6X9eDHodsoEfGUNQ8nYnm/KQWG59HsjGj8JS1BQofX8NF9arA35wY932qBWgWtfFo4ia76DnDz40nw/hWwzo1YEBtbgZfv64F+Sw+s3LCJVfb20bQ/n/i0VR1KVTdS7yJJmpIQRCK/ZuPt5nGQ7hlIYQoHaULELTyl6MbRLn95lksRtvZYg9dbT/4Vawz3GizhpIILpdwXJTEag0cHMyhn22w87jED5Iwb6cKxQVohehbVPFTgywVx2rjrMe0ZCuNVDhdY3CSZD+0d5PdnTcD2cT6v+3oZ/daLgcvr1XDQdDEWvUpg28K3MKrUAE5K21DBIV8uejvMBc9aqVVaEc4MzYa5w2dxCaqDXMB7qnlLHClyhA5Z19CCoVdoWK/PXx2k4OQ3QR6Wbubcr0IwutWW1X79QD3XfcjDmixwYSwuHzjI398rgdCEcHo/yg+EcufAtwOn8GvtAKl/XISeD7Wx3OE6Jx4fD+ZXbWD8IYLqoTk4M/88eWidx6NuczHSKZzk1sTgx9qbqKZ9CnolRoLi/HJckihGKZrJfO3gVkh0GUsduggB+YksM6GEPUsIyz8LQrFsEv94vRJeV00mLDZizZ4LMOpxIB5c6w6fxdWhdvs07A80hc8RBnx/yUaozfSCpf8JgHX6WbiROhebgx1hijbStqS78HqmEIiPOgjHZmhTudMAXdROhYdTpuPNL4xpCY3k6LkXu9dJo+RCSzg3fw38OH+Q7OVEIU9wGY0WiMfBESGYtnUl7za05vmDl1Cy1wjgWx9a+izFLWYTSUmlHjWW74GzM89ifexu/K2bQkuLx9OYOlN4L7uRhdpaOGKeFrku8+BRQe/BA7fRQEUZygRdJalfiuB0UhamVv+BqVWadL3zLYXHWZBb9H/g2g14eIw+vYw/B6YbP9EYgxFQFeyAgeVJJPkynut2fEfLyYa43N+P35o04JaNMtzi306L+/QBOhSxV2wjn56jxQKNZvBY0gNvux+F2UG++EXHlz20L9KkYEkoiw7iZSVBHFWaxxqHN+DMpc1UHPqObX+EwkDmaNQLmQq7f4yAfqs5bF1/H4IH/0LYuBD0S17J956W4P5FmXC/vYD7FDroe7401A13wfusq3j4tCmNyzCiE9W+1JzfBEN55ewmtI0uuJfx+z8MP3cj5ieY8Y1Zs2mDEbNZ4CCYFwewtkoMT2sKZAWPibTwrg3gExvO/PGXtLyUkMu1uDz/Ffq9ugwKzTPp9UwHVhgYzUvXKsAIFS/uubMUlDWns4FGBKvqhoFzuSOMvx3K3buXYG6ZMRXZ6IF6TD/O8N5EPvePsMSIx7xWWgWu39HnzKoE3uT8AFOS0zh0hyWka8XDqphbdNrrIE6cr0ZVMy9w3IdraBbtxxj8kz8P2GHh9dEg/X0y57kwPB9pg7HtBfgiXxFUnYWgIcoIzf/pkImZM91PmQxpk9RxIenC1R0W4BGVyXO0q8BDTJRSLz4EHd9H4P6zDAamSsFd53VQuHkty9s8wDL/C1w4VQgNvM/DCykjEol7Rvr332GouA3EvDzJbu4qOEtjOjk9WQtcXQRKz/N5u04NTTp9jgqjdpNGiDVgbzTahdxAh5dn8O+KCTCluhDOBL2i2XHH6PODHVTEj2BSgAWYV1TCuG0FkPdRhWxqn2Pv3lHcM38kf5rgRm9mefGVRGFMnS39P/N//+4Vg10vkzj0eDD470jEurSfvDZzJcy7lcpbLLUZewLw2zyAmPZgLkmPgd/bF/CNKdV44Hw1zfuQhK98z9E/NWOqsl7OygP6IFTlygkODahtJMAPH72AUrdHfOSdHsQcugfbr2yjlm0XYWgsQGR1NLWmtYMJt6Np8C06WreI7VYkksecVso/ZADO8a9hk6M2xB1sIw2ZHj4wYyZVyVXg1Z4EKupshB+zToLh4FiMbU+CjkMGoG4+B1a/0KV3G07BCv95vN3pCkXsu0nTRk/DHQVKlK5gDE86LQDqdSlcKIm9xwXQzk3v4OPyK9A//jGGmC/EKaK6nDUmGR4420DHFikKm7UZ/07Tx9o1QmC0+xJJNVzkO35tOO3uV8rR6KHhwjGwKKyP/jRkwZFp3mTRlEIFIxfhup7XPHnrIGo8zKb527RxtYsEmK7I4COfLen91hW0o1uGDudsJ5/lM9H57DhIvxcMxuI/4MwZAYhb18y2do+hbFk52pzIourATL7x6hcnHCyjNj0JCDi8DDoVR8PF+9FQ4j2XRmreQMcP0vQ4YheUVTmh9aQTEK26HFf4icHN2lHQpeIPmSLOPHHWGXBdn4OGpiP5kVgMpkn68JGrw/hgTwXF7zQC69I7nBfmT+9f98P77x408eFlDM1S49kfcuhn2DY6Jn6GFTZKQE7DK9rwK4WN/xbAfXlrCN3uxUvu2cHGsDhybFwHgwGfOSFJHhqP9HF2oyEuHqkLU6Zqwo3W+Zy+/gwWjXPGHR0D4PynhUbo20FhqCWHL4nHN4nROCp2I//cP4jbb/6Bo/rDoD5rKsXqOHGQgyKkuT4k4ddMx0ECrlW+pZ2pj/h+aBZ7GHRyu+c5NCg1R4/L1hB5bR1sCfKmB4EVdP3hA7yleYMDFPLQd7IrV4c/Av+zL+D0oD2Ilo2jCVf8qdtZhy8dUiSL4AS4kTYEXm9PQuodQw5Qb2RfcXMwGxCmc+77qD70Ix3dfhmefLvHaYZOfPKBHM57tQcEWzyg5bY1rBesgwQrdTbJfswfTf9SY6QgGb/ajUu/acHfsfKYtS2PvttKwznnUdh05DUttZOgaa/LoXK2LtnXxFLyHmc4OOMennq/i1LlVKCkRRlFfy8FyZY4LBhRjypNuuh1RJtvSPpCgLs0T119A0b+0If7E5245G4qo9c/qlxpTRsFbsKWVUWoOZVwUdowdgRqo+kebRB5fo9tzK6yTGUKyDntp60vXeGE2yv4L6uQ9gWv44KIn7BwNUCa+SLYcsMFW7Wvo3X3Vy4QCAYV93Q6O/AfjZUVo8RncWBQKQS3Xs6Hcr1uSLLaSiYi97EkUR/mi+3gzVPmsoLqdhrXX4LnskYCvVgFX+7sR2WdALhR8Zzv3rhOGWPdOPS9NM58cIfHLXlKyWbakDVGjaPKX/Bm0QjuftGIM+deY7c6P55dqM7xyytwums19e+Wgrv3CqGw7haWFn1grYrltDtwFS0WeMPisb3Y5rqJxv8WAXcXFfBJGaZvgYu4MK0ZxsS9pmP7q+DprVE43k2UU3TK8Y6SIrY5WgKe282TVdXoSWcpmVXaguvzw6RmIQdf4+/hAYU1oPLIGax3ErDqdPpUmQAa3//glcX7uOuhFa2dMQWfunng9FVnqTr3H0ssVgZtvfu8fX8LapwrJ58eQ64VyEOBjEZymLUY7vy0xceT6mBXrTyURg7xg/1m9FF7At56ogURM+M5eO033nFrGzfsm8MrTdugJUYMXkjPQdt5hfjl226uxXdoscoaizJUedViY07Xl6HK+ir4EmoMy37s47p7ViQ7QQ06XUeAfM1vuKmnwokXfXikmRD8zR2GS93qIJqG8HJQAB7uDsGjs5pBf+19qAYfbL43H8xOKtPsjm20MMkO7t3wpS8NQzT0WJcWpNSzZJg2/FUaA08GfvKKTQk4Xc4W/mbIwzrtLhD33QCLtUbw9moP/mL4gSuFDVjjaC6Jihzgb6czudl0FJRu+sWSXl0o6hdJJ64tgcd9FRzX4ogTrw5g1u861FxogKMDJ4HCsxJM+meC3z4/xvNCkdwi/QSMFL9y3g55hjECuOTsIF84LwMu/32mY7NrwVYnkCKCXWj1T1GyyQvG6pN70fxGCm98UMkmmlbQ5ZFDp//lg5+3LaVDHTbnVnK4ggCrh18GvzUvAO6qc5jzJMi5E4IDKgVc53UYI27XwaTpEbxgTCXfum5PgQfKcLH1Zi6xsYGwrCzW78yCDlcTiMjIRcvzPlgecRsGzp1FJQdb3Hr1LMchgsYlX065rcNhzy+i7V5jEKP5sGDqWM7JqKFfRiF0R3Q/rxQzBMfsAig7eQHPpOTC2evHIPVALH2c+RJbLkoCltfTokQZFrwrAHU9mzE2KA7an3hh9/SpLFg6jYUkp0FcEnDytAroWJxHG0EDVGevg/zfy9DeqQ8MM+6hVZYeLtEdDenrS9HthQ1H6VTi7KNycEvKltM+yNHa/9T5OPSSutNKSjbqhuGtrliU4k8l/Sfx+WZdGD+PcME3Wew4qoB1UX+gdUiMX/03ljeFy8BA/1/SqSnmj3njwbPiIV6OfEUTXnxD2bNdTA+S8F/gFf6qchwOmRO37jbANU8ngv/kGPTc+QHGHn6JEe0q0JUZQ1VP19FXgVD+vXYcHzQxg5UZ5nBENYP9WlJQIPE1vQ8dgUfG70dz6xGQuFoXt+nsgITB2TxunDyU1yjTkxUuOHvKa0yeMBdl01fRKOG7PGuFEYTIhJK5zjiaGjQOxhgYg0HnEPt9b+WTY1eB0VMROrJIny9tPYHj6uNJeXUP7N6vCg3Lynleqw4eHbBinTvKVF6uiVXferlm4xjefdiRFb+48e9Ke5hx7C8qkhDnzdjKPY46iHfW0oWeGNoTnY4qTz5z3u6nWBMyGXJEL2CdbjYs/teCWxbbU1a+PXR4qqFouBS9OKpNMr3PseKKJczSzeKKvw4oV62F8r3ZMCvsIe9s6GHj8/dY59o/iF9WBML2k0BD8z/UMX2OJ/2HSS/sLTes+AMb5NbxtjffqST/GbwfzMQvymqg8PAb11yMhOjxsXQx7gPc/N7CwUXNMDe7FI7lrqULY2Xpvw/akDzlJVpXNKD27TckuzmJQhT/41Ugiuuz4uFh0mrCqcNoa2YOWqP3cftMcZAtHYKrI5HXOzmTfMgI9Nyjgx3yEhQw9xBl3deA6RfK8df4SAo5aM6WvYtxQWYljnogiv+pG5Kk7CY6P/QODF4RRHUhRR18DNeeNXDQ8me466Eot0WqU0uxJu6Pc+M1Vr/plepEuFP/hq2DRVB8ww/ueJZLvgtdqKXWg25u0ySb9cbUaCnBgp1aUNLqS64PxWlv8wfUk6/FmoIk/jdvDLfu+U57vK7j8YkT+UiZNfCwIQvfzaeCpbsxftdCkJ8gj2sl5ejAfWPY9voNf3L7Buf2CYLwQBldfnyA6yd8xqj8CLpwqRBO5nwD0eXJOPlYCYZHvuJppgDe2sb4Yv8/WvMsnOcIbeIAhVV0JkySlj5QghGpGWi1aBY3jVWDD7Xu6JgRxOHdvaC09wukxJRihEUJz127DS8ZXWKxnchjihRB5Jc1xwVNxx/nvODQmUTq/q0D5RO1YKlnKN49/A39/yjAz5vy8MLgGq7T+4aqu3fS5HB73KMaABX3HdCg8zZLdovhqdT72BOnCP2/c3B7oR8P+cTTUuPXZLrlIT/87YtTIhEu22+hobNBvFBXGHysD2GL/i06++wfC8n8A4/rWnD9Rg94fgngpr43IC29hWS2KsHfqhJ6MrMLUhV2c6/dZB4p4UhHVwejeXEEJbAvHu1oprCdFvD2rT03BtyFaaoNtHqfC7yzVqcWKAf7A07o67UYlaKicOi0EuxIngo2faPwet5RmOqfD3UfT7PRgDE9ub8IPSAC/vwK5PxWbdh9MQw07L9CRuEM0nk3AY+LZ/KM2vnUbDcdVorY88H2WFqbog+jVYrhpdsU7vBYxHIbu/hBzDjU9hRj4yOnUSRRlP5pH+OLD8bC9plykDTXk6dYrcLZ9xpQvm8jn14rxCsqFUDN7Bz6TfGHW4eM4UXOdopiH1ITm0o1focge7Mm/TGr5dEqOXhvsTr9ty2QJ39UgsiHB+n7oUY8WxsJ/Y9KKEN0ExhmmcBqj6cstK4PnU0E4U/lBChrkeTcMefhyRQ9LFqcjIJBndRQYwIrAtdDvIsSPz6xgtxEjcDsnjxkpCiC9qebkKunxT4jijj2qiGlTnsDTZOmoK3gfdw6dRIcFEjhAOk0ChDaC4antVjD8iwdXDmNQ874grFbBQqe1+CFKsIgLq0Jd4ry6PdpIxy/7S89tU2E5u0H+NyOUbws1RbjazOxY9YoeBV4mlrE4+lBw1e2OzcaI9zi+VeYPXeovuWCnFMopNGFX+2EoFbjH79aNAo7X/zhTrXNuDeqAQ+f7Mf9q7dhrFMpJR6xgzul9rD+6l987reVrAelIAxnoLz/YnjqOxUvjJHB7qSvsERyEAIeGYJA8UV8IC7DoseBClavoZ7VF0jtUyg9370fmvYvhj2xIfjV2wA8FFZx06UnvEouDqonSPDy8CewfsAUgp018XGxHL02zWD5RCWwHzqG58Z5k/mzLnCqrqRJ83bzdpHjvOKmJXtXSJDN9Xr4Va0De+6cpQ55JZRf54W1WbVwrnIu+7b18K59IWTQn4hC3U28vlYBNmWJY3nwAxbK34krnuxAm98n4JPuHcyObIFXh46AxBxTUFazgliTYP7hZ0zxs1xhypsCdpZxYEelSPZ7+BFPFT3Ft1EKOCfDDE7dcOeRMZPh4uUCeJBqTCumJEC6+Hro/SxA9p4DdOXVUQoZ1odC4x8U09DIrzePowP2gSz+I4Eag2M40SmNfdJtYWHFfzDtthSYCf3A6+Pj8LHbYUqKyuQ58cg/DgXh9+1+fEHCHtREAtg/2ATe3FbH1Yal+D7tOB1LKUa97H+o3TQD2/JPQf3L7TDHYDHWCGqDjXQAL/81EkwEvMio9ym0/YhhMYFDoFP2Cq+eVEI39ww2DBMA91/mLOP9Cxou6vD7eF0KONXNvfyZF536CI4TR2HjoDDZaJiB8AtvHOXgCD0q3nBPdySOD7IjHfFOLsyMI4mUN/S0opkkdDVgSeZmMBSNAhw6Qco+18mi8DvI7n0Gwx5qGBjXQZ9Hi6DRDSN4WTYOjFcXoGxgHfzL20DzzX9ioEws9AtFMt5YCvU7N/L8ZeLwKW8Tyg2/h1FTDtIen/f88kIfZav+o+YVoSi7whjjlp/gRRMUwTFrOk0Zc42efZQCxVmd9DQ2C9y1V9C/jwd5wP0fFfywo09xFpC4Yxj3GnVj2/L1tNgxiTTJBtQjctihZx3sevaV1Ev38KV0NdDbZU/a1UhZp+1o6sIhlNrtRC4XW7nuoTz7fPChlOzLvNXRErRK3oHhGlH8taufB29m49XcQdr88Qs9933LqT196PfuPmluU4EP1aFg/TQVU/cX0L9V8jjUtwqy05ToRtZFMKqp5bAt7Wy9YCSIClwjgdsbcfb8B9wic4hUkkfDaOe7NMpQGQMikknWP5a7fFTg8LcU+pj+BhaYycL5lj5qaIshldHdsLtGGH4LSIKI5xYuOGEDcd3+tCO5CFQWnsZAsSAOXXaaCmra0eexMsaYyaF8wRIYDLaDl9dHAfu2QO31i/hj/BEw3j4GVLNW82H3jZQ/bx1m/w3F+Q+V4bxHH2osdGUrYymoFSRc7nuXxUe14vSvwihjcQ1aN1nwk03q0NCay0lG0fw87ikr/jlEZ8Yt5Ydf17H2xwq8eXks6smoo4+5GuiEruH5n4DN91ylzlAbWKG3F5vbinnHhvfQE7ccZc/qc6u9Pfw4dIUKWv/iih9LUM8kDFeEuFG7+jM0XvyWtBdFsFfOG3huoQaPx/dC19WZYKB4lax/feGiCFMae/gyyyjeo8urrHGCwylSfG4Aawyd0G2pHnyXU4Wxe47Q4yE3/hmpS1/S1Wh27hI+LG6D87skAZ7ZUL/eDWq29MQXUi+4ujeBeoOn8145d3rZ9BFakwtwsEcVPhQrg11bIol5n4aW1AF6jN3k1FDF9wSvYNwjabLzecoJZ4TguZwDuF305qlB3ZTRX4pHti3AZZPLgCOfg1qsP80VKeSpqoqQM3kcLz24EW6OSYWAwBVgLKMG+V6WNPJoCD891cKrdx3mLUqC4KFnifb796PL1j1Qn+7FYyZJw+X392if8ikQiZsOeV96sXWaHbTVKdPWGWp47dNXdnupBXsrlmHzzk38/NAA5hZmY1bCYzw+SQ7+6jtBxNX5sDfMm7oMu+H30kskM38hqzz5woO5Rvz80ncMP6cOc9V8+Cv9gk5XYcrWdmG1mc1Ym5aCaTrFIPFHgwM8T/HvQTvYXfmCnunfgMcK0aC4QwRf3dqIH+b3YtqqFExfOpq+Fm6lDckS4NXoBIVCZ6gZflD9tzp4P2I/9UulwI5oRdYKvgJ9UXtQsEUakp1TcN2GYdx+t4W2H35K7Y9fsmVxNUWGT+R410MQcOED5VwXhNNr9vMLlV4EsWe4a042qM4fjR4Z6yBtRxX9eRBGGlLKHORkCc+b2sD66lK8X7KKi+JOwOROZah3UON1QxvxVN1Y2LG4humEEriHeGPm5Fz+tXgLqjwcSXMN9uB5QWscv3oyZsaegz/Wxbx1gxGonJnALn5vWMJViB5HXwe9u+5ov3MUVik4sGVlC6/JtcBfu9Vh/7xbdDYnGjpHTAKPfVIkozaHbkcPkLv3WzCx3AE/z8Sj7MVRMFb4ArVtDqbfE0pBsaebY9zn45JVP3nhq4ske3o7qgap0fYiYYgdPYfVmsNBySaS5TSn0angKeB/chSabj8Jg12JMHiwAsIdJ8Hi8YGkZ1ACl7vuwouzX6m5+hhmZSJtEdkLMO0L2vTMw4mTdcDpZDjDoR5499oXF5dkQmqSB67b0sKhOfXQkuqCied2wYeF6tAZrUxrFEVg28Br+hE+Ena0R7B1yHHUvHkb/V+Gw4W/a7H6pCwI7prOWmHb2ePWZty3KRsaZNw4YdYIlHZXhb1hA+S7vxIkJghDaN0+9vGoAM0johT36Q6efbgatJRScWvkTQ4wjib/B2Mo7KQogHIZqZj0sofaBXbbfwDHavXAwJtmPnM/H6bNGKTGshz+T8kGpGq9Ubykm5NcD/Hvmnc8P3gyq6beYvy4HWudF1DhYkca1JWEaX172Vk/FdsOS8LOsnn87L4Qan+pQsvD7XhyoJh017nyu2o1aNs6jI8FgSbVIMe9l8OCYDW45ldNE44PYp3Xb74WvYXWPDKB7X9TwXHoMBZbPmbJMgncOG0h7JdrIGPXVTwjpAzbKr6xUcxEiDNXoSebnBn21/KtjR/5vn0m2NjswZJ1m6nK6DdcFtoOowvsQUkqCSbsXAHRUpv425u9YHkzi5RbG/Gk2R7Kn59PUTSfQzergnd2J/mZfsdwsyD+xc00s/ItxHnGUY75PWyXD4UNAavpoPBIMF62GdKP2LJV0w78pvcFxb3cUEC/hTY7nAOTsky2uI+YeHoU0JFT3DTlCsh1WqHAgm7+oNZCZxauwSupnnDjxQRIPlpKm7ZqQu/SShj3YAsL7twMkQ8W0qMR4rDTqJgvihzi/SGXUO5kDOam6YC4ag+W2xpy6GZh+qgtBk32VrC4IRXCUo3glmYePmi6hkfMhGDSTDHoMe8j2bxHdGNBB82+XQg//nvI8r+bcKPCWWo7ncG/botCyPlQjh59hiqjD5DPiRN01+0rrQt1A46xhG/2rbRpRC4pohl0HZanx2VH6JDrXbiamwoBPkWwINae38TF4RbZFPJyeQDrWgmedi6EoDPnsNb0DNeYm8AH/zcQ0upDgUsaeKdYJWd1eGL8lnGQ/yiNNbvOwJGVkjzkfomk9svxgFcvvxNaST8y/+Ok5StQJ8kaBrsdUf3VAfqi5s3+KnPBtD8a1GadxfVpV2BD2hEUflVNNtmTQXLpGwqbVAxLk3/TsrfTqSFlDdnN0YJLr3UwtzSVJs8a5vjdUiBrY4eZ8cf5goMh/X6ZD8+MkHYrZtGiP2NwjfA3qLcZC2s/CkN+mCNdD6zBn9rFuKniNei8fAdFzqvQ3PkVSgZ78+XmQtgqIwKr2ruw6PF/tMdkMq99ac5/UsrxqV4laNe0w9mAZN5s843V5k0GiV8zOGDZX864sAsma0ryt+ujYYNiM69ebI+6f5R4trA4F1tMhsd6FbxaIZB/OVXA9euvKeBED0yM/4CbpHeSe2QEeA3W0Ya7o0FtYjwePXcNHyp/gL3H09jzUAbHbJHBkf92wHrbRJZo0kVPgTGgcdCMx5zrA4vje9hxsQGkV0lAyA55PLFgGXqf+kVXXWvQ/ZoATItPpKyoCHz/9AMfux4KX/UWsWTWHZy8Loz3NtXQIsdoylKwhSL/c3D8ymieZSZB9+JGwwyLbBxn8JSLtU3Yb/dW9Fisz0KPpWHqrkBcu+QXfiQRrq9dBV9uROHCgmF8cV+EG/PLcElPOEyMsYaOvijaWLofp/aUQ1yCKuyXv0B1JMCdjQVcatsHCVdjoNdbGe75aED6nQF29btKg8pTSc7FEXfX9eDvbxJ8qjQfrVaHsKm5EayPt+agzGQSXVRGSlpnqP5ADJn9KAchpxIyagyAXMkD/O+CMsTL50L3BWF4mXaKu35YwpOhzRhfMw/PGxvhnRkGoCR2DIbPMpwOcgEZtz8Ms/bCSrcFuGHNTsiXtWFnWQssDDHC3ULnoG3EJChSiSbH525QtX0E+8sXQtOGixi//DV4L+1lvZQ+ELVcjLZHxsHrE6PJQvQ4bW7soPCDjzDG+hFNsKyFDQ+WwJs/K6jqlQMFHLeETN/ZGDV2G1a+fgj2Adcp5sNTEP5VikVuuXilNhSCv7+EKQsFIUzbhjsWbMSRJRHgcF+IxgiWYddWorrhBMhfMJfbr07CQikbODrOmb/6nYDqlnvwekUOr547iePKvvN2vVi46qCKjS8egOUxCdgvHUmVeWd5REUEmJ7PpvWlXfCmuJXbCtLpTmgfZ5cTnZYwhxcGR0HlfCh/6n3Lk/7bgTK6Eaxr2QfBv3ox+YMceqnMozkygvCoKJP903T558Iykv9PinXFjnLSg0dw0G8u/OnQohfeLtAUaQtaO4Eaci0wOFqW7hepo5XFChwaWI4/D0Zx8V8xKLhphSOmTwTLcZW0YsZWuB04k9bOfgWjde/Si/hgyAo7B03zf6NvRC7YBBqB3+qFtEN3N+suaIPOSe9wbekV+rFpLsYEq9KCGm/SUanD3iIxsApq4J7G1WDR84tEF4iQgd5edtezZaPwf2g/Nocr0qV5o5klZKULQF1dDQRmJgLsEgcP5z4wiheiA9kzYUxyE3/wO4ieOwxgzPEQfJS2hjZLl+Dm8F66IjGB91r0UV3AH3yvdBZPfovh0i2GcASP8M2AMyhQkMwLYr34i+pcXBA3htr3CKILn6fdx0ZzZaoauNr/B98XBXOZN+Gjwj4Ud9HmVdUnsSzkFsw29uPahzEYXT4BHkXkw1GRVCp46UQ7Js2hvxO38aWZgvDN8AYf2n2dl9eXcWXoaJjf8weHHwRQJP3Ep08nYVTQZiwyqACt3HKUks4A45zjrLJeG/oPisGiPXvpb54gD1/RBuFvDuB3Zg213gqhGTiRfecpUtfvCZD73QemZ7bR1NFHqC6J0MEnDqpDO3CGXSiuN7zJieHWfG+1JeibKEG6cwlmxEmwz4gaKLJ4yjMe/wPHeavo13kLnpwfAhavR8L7q77kILSCtH3dwP37OlJKUYLWu/4wriucpunOxqen7VF5ykRo+uDAB9wzcbnGFcw5asfGCxpJ1CGef1WVwJLISv6nNhUMvsmBW10YOV8+Sem5o6BryJN++pRS7B5rWjsxGMExk8rWdVOXuQGYy4/nqR93c1PGC8zbNwe7NGK41UyIpDZ7kttla5j6QZZEimRhS70A2j89j00vj/Gdm5PYd5cbpk8+Ba+8luLrJ2YEttV82VoCbOXtULZTm7/ficY3VQuhcEEbGilb8eTtEqRwLBX912zCW6dHQMuRn7jWJxYPpg7Df5W+XP9VmOO1XtG0BqbTOWuAI90pwtMQsioa6VCIHXgqbcTzhdWcXLkNfcwcua46Am9VLYFlx1biiWUasOXhLrobKIFLDLbizMXr+WjiEtabJUxtWwmjfvuzblIHd/5RgqTUy3hcIRjmvPeEfzeDIK8qCE+XXaeCxHqI+BWD3Ykd/HKLDaz18QW31c60ZOwLbln0BmuW+7P/j204JGCPnbuH4EzcJdh8AeCMtT7N9DuI7vvUcZZiJc9y/csr/wlihoUfqf8TpIunX8CpK5IgnXACpX4GcPr1ABqzOgs1Np/l6/decVOTKKS3neHUojAQCLQC5cZUtnsnB0UuvuxlJQt+4+To9t17/Nwyg80LNuPjoqc4MUQBRPA+0pqlyCvf4qpH4yD+mT3O/DoF3rgfxc/Gd1lEZTTPjLSAW/HvuOPXLEhsz6fxDmkk9VSDhhzrMevFWlgTOIaj/C9A8LFJMMF4BlZ9K8aUtgdw8VoHZKoLc+2nZug+IUo3FLX52/Q8eJarC96rU0kKt+KC1lTSHTzDon77KH/nMCX0N6GzryftTKrjlGyAc332+FZLnaYIaMLERDGYER6A4W8loCHqFP2ueoX9d9q5cJYU6C75CAtq6+BicTTfXaeCyuPvcnJELM/dtgzPdbTR1RAHKE/SAuu5E2Fv5gN0TbEhIVXEupNIs2p/0YGbfRRXKQzNtUXYsU8IMnv/wOdsHWzuNoLWgQBYZVHPrjn+/P7pMB9p8SLLt4/QZJs1dFvJU4QJkMq4dti8dx58jYrhxcv84MfVYnq7wxlm1K4ExfxRoND9hELLj9EI/1WYqfgeIy7IcdLMAH4+QwPibq2my7HKMLtxFJQ7jMfV8iXskP2Y/ibrUfxxfWpf/opKTw2zgeVztAjSgK6VYlA4+TXcjLuLY3obYKvyb9KL1IYuhyGSu7YCDjdu5fy5m8ijSQV+hkvDEolMinVt5/5rYuh1xAVdOgK4w7UGcvVfU8bwDErvEQKTU3LoumMLHTEayzZ1gPr/VUGz1UyacHgfuurs4gRvC1pVYQpS/fPx+5Pl3PBVltbMvA07Ru+j5jgDuCT6kB26J9BNP1vWOKgKz6NHs27+NIrX30K3t1/EeZ86SabkMBpevcxhRZ/hjkQFkNJo2PV0FSr7SdAprdUgPiBD2r3bcdMiRz54xhTOHj0G9XVvoPX7aPja6k85izfBTKkU6Ftzl2viDnH7Gm/067dHEcN/8Ef9KYkd1oGfb6OgKWE3vi+1xc9n7pOXTwZn3dHntKcqoHHjA3RPf8/h1vqglLIPuh0vk/iJb/hp3H3svlNNdX8F8UzC/3FYH1whMGoAgN/RLpRSIu20VVJpUMiIyioro6gQMtIgFUqDJKkUIqRkRolQISRFQ4OGoqKUpK+IyD3n/ovHGR9F38NZUjVwNHgcGFz4BM9W7CH9kGLeF+LKCo2faMFQHI7Os8fC39qMo2pQRNIIjAwvovOWA0QzZsKdZWvB3/wk1M0Up2JRI3Rd+57+dWwmgWfWcLh0NZ67m0lLt2STbF0/znvbyjsypDlc6SZ6Dj3nR6lIus80wU8pCH739YJinQqt0bfACPdX7G70ihMWHqfb05UwaKU87HymB+YaX8ljXSZ1BaSDlIYBBL5TI0fVP9Sa44bD4eEsd1QcpB8gLHxQALstpoLx2d/so7eJsz6MweCo45De4MSXxW6QxjwfMNUzBJOvP+GvwWNuTj1Jvt9vwZjNudyfbQxfUtp5nsEnHNigzLmn5CGyvYgECxp4hMt+DJE4wy40jkc8ecXZo79Q5z1xPhwaTi69SpC4SoTsXy/jc28qaPebk/zmsTT5bL+M0Us2sO+hY/hkSRP83KAPaZ8Nyfx+Juyb7kwTK6TobdpYsn7SAWPDs8jVygdvaR/F48Iq4HJQi5uvfqDlDkf48+ZUCg8KgP+yKjmy/ScayyIfsRoEiyIAle+3oNbyIOMsQVKfcJfUXXfgEndlPtuZhiP7OlhySBgs94pA+51XpPJNlDQWpkHULF2IT02mvYc6oSPyGgiXleK9qRpgKSYCM8Z08O9UAxqdq0dHc19SQX4en7Tww/hZqqB8/wDdv7kdf8RLQIpMM9c478V7VcogGJmPt3QD8E+oJBsdm0ASht8gyv87Hiw3hRUuj2G+3EYK2TOZDi0Io7WZmoiFc0jR9hUFLLJEpcHPQEUC0N7hyVunbQX/iyUw+nEdDx34xY1u10Eq05JLvhtxzMp5PP6HJRQfuEGREofJSdKc/PqPkNDgaZbdvwLCfj+FTa9m4XllH2p6aQkLG5IoTbodQi0WgLKoNv8T2wG6Su6wplYY5iaqcFOqK+l1ToMblkvZsm4hZY+4DouOrefbtk9Rr2ESiuqf5PyZ0nCytAYjbBTAIOIUNk7diOYTxgOYFsOzDxXQue0RDYy9Q/qp1+lQmDcczBcAwcpBMnlZyr8rTNBNcwbWGftRvdATbgq+RI0HwlkrOIPOGctChrsuH5Gx408JxfhpwQbyt96JNeYuEBYuyPbWt0BhazwrXJwMq01XQsN0A/qTb4H+YTpQf9ids88K8ejnXZza5oazjiN+CxoJrb6FXKuazXaWx9BsuQUrPVNCnfcLIOniFsiycSLVRgJnHQu42uuEvXvGwKabC1CyLQKXr+ilU+nXsf99GxfOlMPYy0tw3NMpoD/Tl1I/76Ww+RX0ueoAajr8pop1EuAjVgyNO0txs+RtWPxNAu4IuUL4qAzYPeYY9V+NgMSqb/xdrgSTRvxjC/8QevWpG9ZeNoAR2wR5crs0j/3swE/MhTnGLhBsfm7DVkkVjh2wJ9fvQ2y2XRRiut9hiqk3ue66Bb5ZIhgxwhASH1aS63Mj1Ox4SM4/NHD9uulwZdsO0HNM5lMX0miPvQPdSCZY999YFpxmT9JRwpgxo41EdxqATtMA6eutBLlPLznZJ56+iXexudwgzRF05VUbxPCXhRe9DjEG0PPhbqFoetEFGK/hyuo/1mHpiNcgNHo1hykOA4lOZng0Hn58jCSWTYRfG6Jg9VIxGONqALvzvHC8wi0Ud7WklAE3/GikAwmFH/CTlQuHShMt3xAHkf4mWP2gCHIO2cFhU38uqrhMv/+KwKHlsrxdawo6V+ZQbsAl7tnuBP/FvuWdV2QpdYsOnTL3x8JoHegJl+Oo8QOw1foHHTN9iNueJpLUi2y8/vUjpC7Zwlv9myD9gwBsnznENsMnUOX6OjCXuIjvk63xt9o7PCj5lprc93JIlR9uHmMNHqpCEDOmjUIu3sHnEw/irPXFmDbmHZq5F1DrorP4tOUnnL1hBe3h87HU+zb79Cqy8INyWmvQjyvvb2MBbaSlraP5688OwmoV0Nt8k+XnHMfuXw7gl70GlpXk479jM0nOqoKOPHhLIY+sSHA2wsNvN1l1KAJMz2jj/nGFqDvdi3L391PytDP0d4cEYvN9aNOaABO+xLLp90I4NlGCtIou8Oj8YfY48JaLJDaT+bwhjk63om8NxhB9zQaNTyCr/JhMIUsX0tRGG3ofWstPl26DcWdu0/0iB/Ay04AWlSJKUxbBOYPq/PdMCi/6/J2fBmXAAd1Mem73A+/ffMb3d46FoSBv0nPYS4uj0thWKJ5Mk0tRx+w1Bv7wxzPy0bDv1iFoum4N2UES1NFzimasOw3dnRNoCEUxGwVAw1qfm/68Joug3TC/zhBGWExkjev6lEXSvPD1DLB+2AflnsRbR5yFEyHNbCI+hpsmGYGaoypON87DYuc+VmvcBy++emPQmwloViBMC86MhFZBRfa1HAOvXQx4x81dFL9kmDtDUvHreANKLmvkHdG3Mbz2Dt+a+QqditUAr4yi20JN/HPrTT73TIaPe2+nXokymD7vNsoFrOZB01i+/MsEClUN2Pm6I64drUemFTq06G0LFJ7Jo4KKMkgZLQ/P55+APPtR4BTui09F3Dl01FS4kUVsLRPIdX+yOQ2A350I5/4LP2m2rxJsWGHKv7rlMdN5J7dIBcD2GjV6cXk26jX/peWbDeGO93FcHjEFKr+MZZntzWBbshHPpp4lj7wq+iMYiltXuuMcBUUQGhtC0epaUGrxg9tXH0N3s208ZLmXJ5pUoVbQSFJp6STJxAy833Eekq2nwN60KFq77SKZ+M6jotMbyVnMEUZVvcSISVWQW2NEGw78pm02ZhD2OoEsk6ZB8Ku/7DF2Ag4/kGPHUyugMNMVTqw2B2vRTKy9LQc+C5bhJS0jDDPcRkteSuP7LQtx9gZPqD6eAztGLKRd/i84M1cUTh7RJfulOey74TqP9DDhSMHf2FX+DcODp+I/xbkwbYsQbvxjAaOrQ+Hstis0uC6dpL3/oqqXHtnZRZG2XxW6fBiA8QZy0NmnAHt+/YLhXa/Ibu4EmpfyAW7qq1JxlxonfR3F37/G0qk2JXzbLAnbF82FPHlJdh69kt6cnA2ye2ugNXAnva29xG2NHRg9UZwPekvDNszl9ClKGIl/cNakUdBiJgZlEUac9LSRBOJ+ULu8Oas4mEHzdHUKeKtI69fMwO7EHbTFU5nfj1pI3S5nWGXfbJj4U5YTdowG1Uku/C6wkjM3lmND5HP4ZvsfTnf2p65lXZzUloLdS0NxjKwxNM/WRqUHwjhxcw53jcqHN7H2zDkehC8jsD7hKZxUOw9d9+TA4qA+9T1WwoSRASQhEg52ZqPhmeoeKggb4D3WrzHvvTIlDqnDlcgkFLwJsKdkAkX3AH8P3k6tPUvA92c7dw9J4bKcalj+SR0KI96jYfA57qoJQLOGXlwQ9oImn5lDI3+4gI+pACj/N48CTMXg6aK76BFxBH+ql0JpxlaM+A60U1GTyQo5Yv9HbmgWpDXdluDUZMLqrQW0+r00ZX8Lhx6shQefpaHU2YgcLEfRJpMinqmnD622Anzlnyh9rKgnmf472HHpLJqaHwEN8x50k55Orwe6edhIEe5s8Ya7z1ZTXkcVJl7yZLWfP+CicgO6K5RyZm0N/SyQoifGYjBolsTxz8Uhe0Yj9Ga1UMzx0fxGOpH+SnRD7IAlTW2M4UhRVTg47zCmrzbEKJ00qnnnSwUdwpA1T48CvTfiLOs5WHnxFLaHa8H0urm8KSSJF4nawsZHG+jXzDic/DQPtc3TWKYtnvMswzBGyxAaMJxvrA1hGSFHcgnyRLctu9i8VYIyJHpBkH+Q6IyXYJOuBHveRFCBWwiZO2XBmhfiGK/jyhfnhJOxpzk2L3QGqdzRsLSI4anjexLQf87Pi/owXfsU6mywBd2Dn9izeA3+t/o6r3vvSCs6zUBQbTmc+LQbQry/w78zIihoNsy5/syDeYPkZNXJ1RVb+U+NIoQoNlJ8fzMVfNxG5Y4N8DIqhTIU+3CxtQNGBuhi69EOSJwhBYEdUfRoXzjPf6bPzQe9abfNOzw2UMWKb5aSedMsHDvuERRXTYUba0/x0bwKqMzeTjxKCGJM03jgtz5ZncjDkg9nSe1+OdzFMXDnzEq+9E+B3s61wuLal3BhiSfYbtkN96554XTZe9R+RQBsfwnBJc+5sP11Bz9sqqe4DxNom/Mk6Ho4DkzxEldVFsEH7VMUvc8cPrWNhprN7nAwZz5Q3TdeLTke3yyewJs8NlO00X2oj1Ol17HmcEVsJJr+8aLuj+Xw1/kyv3Yhyt9zkS6clobVrj0wZe07LipQh2drHCn4vCy8iFRG8exELnwtyp5aOfB9/CL47F4NFZGHuGOdDBh9mQmHAuLx75YMlq2byjMv78PlO5w5+UQn+46yoDNqA3D4/AiY83wHv8v+CSc33MCNJ4wgQECfcwyMsTa/ke8WA/nv/gM/H0+F3keVfKk1H8BhC6/T9qftX5ZQ6uIoCH01SMY6CjxrpS0/FFKCk7fkWO/MFbgcrk+jlXfR0cLTOOC4mEzqH/PpiYlkpJ7KhW7iEJnvSHdDBEhrjxhOEleF6+oi5Lk7FSt0zvHPGyUE2ZqstdEa/rMQQ9vHyrxqwnjyHNnM4h8P08ayNrRVu4dvjrjQHbUBWm49HSbvEAXtS38wxeEKbpVSgrqYaDpwaTcJu0hAe5Ie2gXqYtc+edj/zJ4nhF2BiKCRtNDsAT0/ZwDrpy5l26QO2t03hoUomoRDpcFo4ydIDRHkvgcLWdy0Cuzvp1PHuA5YLrsM689chUofBW67ZAmK35mCnupT2BE1mBxyCQoj1NDptBhdX9GN9+a9puXiGnTWRQIGspdCmGMQXk2eQF/CyjD9gwudfVtHgsJdWDQzAH4JbaUGHgvpT7Phgyng4ppHlHithK2n7OIMeUdudE5CvcA9cM1DCCpN5WBjWSE+LvkEsRZLIdDDiwJuxIJnZxs/8VKBKSEhUDq0B3QiJWH+nIkYvL8BFeZWU0i+FCcU2MOHb4dZRqGXnWZJwoGZ/rQ2Wg5eFq3hS4L9ZChjgztHK5DG6UhUn3sNVLWWQ/OZEzB3xmxckm8BZ8/7gazRGTySf58zPsyCbUk53DxjFFgnrUWh6N8kcGsH1aMGSOQXcmn9MXDz+kVi458C/CGSS/3D6bmO9E7FinJ9d+CXhVMhBt+QhlofCuc9g6lfdXlLxhLEy3doRvUh7gyvJplPH2FXpwk0H1lLflqxPLntNlnYZsJ4J0vM+zeeRgWugXmvUmjsSUsQVtYEnzMx+HdjCn+zj8cJGmth64FBul3pQU4tJliqhHBp/DpaOFMbJjRvpaNbjsNS5X7wigsh88Y3GOhQxhHPy1BT5SKtqJXGt6/NQaUxEhWnibP9OR/uKZnFz4IF6LaCPXxvKyWFWD1ImS4AO0rUYNLPHSjZtJGWxN7AdUvG0spvzxj9JuOVwWvs7DkaJm38gdb5E8AobDyd7y+kf0aStHiiObw13YD/3R5PL1dd5hE3u+n5hw76r98Q9s/35Z6Riig7/wdtKlvKxjJjOLU9ALqD3tIB+1Z0bHPhGZpW4LdYlvscy0l6cj8u+1dN4fsDADRkQCkhF8Wk7UjxhQkcOW0J5iJrwEFGjmSVPTlXyoDPPvLiq0VnqNbuFJqPluOMsHOg5KsBwa9HgkPHYVjzORA3/lfKIXGGKGF7CHtslcBSMAqnX4qEWdM14aWOPxV2uOKTeVas/XkGGY3Lo0RFU+g438c7T7jA2GvfcHaTBMz9Zcn33u6Du8HqICNkzTEGUqj0qRJuHrxGZVV3+bqaH6geNQMjy9m4sus/Ut1pi5JmV7hwrwLqrQ4GZRaEtxfP85uzwWx/WAucL+dSks8/SDZcAtFTXGnbwUiOeXmL3WbK4ZuX3vRPyZ49RKaDSlcpLmrfA2c9TXA7C+FrO0ls3t8Hff7EuWuIT7cpoP+gAVxfPMBZkfE0MuwgGrTfoghzaTDdOoX/LIvEA41+gF968MZOTWiwvo7n5J+CwOR7JO/qwude3KCWt1PhZ7k2zhwKRe8zP0AvyAz0bc7igWBZNhl9iJO0Lbg9o5ljDJgMVXez6mpDmEbjefwOA3je/pBai2TIp7SMXOxdQd5THTd7lMPNYUNImevBvl5KdKJWFB44ebD+hGzM8XyNU8JWQ+2NnzSi0I02jssD5/3TeQZq0e8zU6D6nxMeX3mKbpgOsdD2Zso4MppGVP7C7BWFXFi9mM8uS8Wz7QjHdm5AH5nvXBE2CMePZmPbdGH+6CwNF2begVEPhln+tCSFlepA5z0NUrnMeHFAF16sLsLAvHYWHc7g/odL6ETYO5jl2U4qs83gfnEqRPsE0cT6MzTmgw7OjLqIJ+3mYpJrGOn4dZJi+xX6L84ctG3eYrrTWbhUHIxKEmIQ9tcOR37L5Yaxojh7fT0cXCrOAT90oeOiFs5bsAry16rh5TZ/cjL/hd2Hn/OEHFfcPKqFq55aUfwtDUjpbGe7OS4gtt6K8wtGQUCgH7vsv0Prhu5TjLgCFa9cy2slNUGpb5AXX6hBpY4K8Hj8Airc9nHbpOlwt0GCSpKugd8ebeyaLAoOs/xQZeUvlgv1hsz9q3jkuCKYvc4UBM9+IHdPb0wqNsHTgdogdeMjqiRpQoHrK/azvMAPYvXZOfgA/PwoxC8WFrNKVD54rNCAW+WV1Om3GR7ZzyDdNREo+mM11RoH4rnWo0xtDhR4yBjt7kvActMA6NrUiVFSdXhc2Y6LAmyo0L6eL2Xs4SnHD3Ff2xVQ2WsMs7X08YiGPkSNi0ODcwv4i6USaowogpS5O+i3ZgTuahUAjTVmoB6zie7e1eJD3ql00jkA/jZ7UfbGZF7lpYszT1znzJBP+GuUBcTtmguS2atgb/8uwEEjUDm5lXKXyMOsXh/QmObCyzOL8cYLJah8E48LvlXgx73usPlQCV0COTDLmQWOTT4YGRHLLz5shX8ZwrDdQx9F4q3p2H9nMO98Ax1VPsnzVYxwm8tz2pgrCf0LPHGLkRhoquyj4NU1dMpfGOT6x3DALS9O9FPFzTPn0UGNmSSbmQKXdk2Cvjg5zir+B1maztQyyYmM61Jgz8Q82nP2F154rQb/rotCT9AEWPq0i2P3xoGTZhav2DgHn2zzA98DEVynqEOK6YZkVVlFe56JQp60I2j1uFJY4TqMEfeBwKJmGBafDrbezNvP59K24XTyrlCB0bbncVxoC41dpEuq2YG495cETfEJp14eQ57r/On1voM4ZpUcvJutATue/WYBiy68eiMOehIfUNQqAw7VauQKlVu4ReIkHBFWhe7fzqwmIwox545x16ohtI4yh0eeQZjkfAGuKSixT/JcGl5uAG+qtNjboY0lQsqxJ28Pry+Vw+EEI2z2VeKsudJw2t0KZvWIwZ1Je1Ff5B1fkutC1RQtnnJbHoK3uZNL7TPwaZxDMqfGQ2ClIORPv4pnjNbi6qWjKfGjCI/ae54fq5vhrGVNKJD6mp555uHY5VIwnJ9B+vfukF5JDFsF/uB178J4Rn0vT2iciIpf72HjwDsUE5aDiUKrOfjOcxJM24X+nhuw/lQQVV5zxwry4j+5UtyoJYFl343gTp0/n6kdQdMGHkBJ8gHOeeSNN1pi+Kq0Hl5Z9w0DfR/ywmIRyBo8TuPr8kjx6k68uT4OTpEDDe8oxoF3nRRht4wKWho5PmgyrDiXgvFDJaDsP0SDZ/6wxBIHrvDPZVWfVjjy8Crp+2VjzThdUJb+Tg+2V6H2hjcsHr0PaxJLsXnZMlQ9H4MN+3PQ5OwAlrgow46YeppVrY5S5xl7V8yByrp/ECfsgAOGd1Dp8yXayR9gUYMIFNy/xHV5ZykiMY53Xp1GcxP1sT/2I/51m0ZxD2+TQvcQ2uhMAY05+yB1Sg3sORgOorOsccTzJj78JR1TM3ewoYANB81QQN12DYhpD6FkiVCqmbMKfmyTwOXK3dTfZs8a3IVztuWg7Wo7/tmmA2dtdPkzvWHZT2fxwH1/fvd4EJrnBNPERFEKfSHN06IJv16UgJTqcJpToAYrdm+jSfX7cJv8Shj+/QCftnnjU/VmnLjzELlVq8KRp9H8JagHtV0TYbySLs/+Nw4zMATfrX/IzkGvKat2I7lunwiuu7WQGzTwTbgkzAvdTRpqovAodSXWrM2mu2GJ7KrZBqvNxWB1pRf6xxEC5dHJnHbe0hOKZ8xW0MShd+i4PJSt09rp0+B4oOQvPFE4HKTub0ZnxVJye+0DevIEwUf0uLtpDXmMLYOK34ag8DKd5ojogUv3N1DoHoErd7rS572lkKdzlHq/qdGS+GFcLmIF85YNYpXfM2zds5tuDDPMqGuhnLdjyWReF7yuG6L2RZGwXU0DNtqfwYKh2bhxsxDFW1+kDVdd8X2XLMWEXOb2ogZuUpyLSWLGsEZMFdpU0mmsuT1tzmrH6K85pDjKiRdVTuBzcePg/rQp4LFPALaJhkPUi2NQkKgE6l/TeHDXdvDJP8f7puWSnK8x379UjoNsAc0HLoLEIeBxecZkePkcKBW2gfTVOeRRcA2ylH0wMSyVJ3hqgeJ7aXQ6uobjLqfAYqldpCM/DW+WmnOIZTVcl1tHH58WY8TXsfBxai4+rvkCLTNWc+6P2xQwq5j3e+nxGd0aDipIxQqRaN55aCps7ihhY9MVHN+khvJjwsFmRSh88HkC0edWsIDxFPb7kwOJRyaDSsNq+JSVgfLqJfBw4gZ+IpKBsx9e5vVSwdR/+Dp5HnKllkqGz1PH03CHARm4JvCRwB5KeanP1vUHUflpCt/fk4j7feT4Qqs6dMn7kvK7LbR+SisbqW+l8AjANf4DdOJxN8c/1uELmVl8sZ4gbGA3rl18jZ4N+9Kxk7dp8Z9OsM12YMtdOdRUJ4G6/5Ko6IUMpJ2RBr0N09nezgvvx63nG49Pk3t0KmWJpNHK8DU0Cc1gtYYUiGWVQ2XbUwjUjMVNljvgqu8uimuwoXuJkhzlEwmNQemY4KwJzT9tyN/Rkpalr+bYh4dBLjuCjk8DKi8fRXeKyvnk0naeLTUGpDq/Ylm1Mm6f+4FHzPbkx6DNy74uopFVyVCRK8iaGy6AtcdU2BH5EZuHt8CBIy2c57oH5MXeUnXieQi8LAO1kYXE0g4YoCcPHQvWc9THdl7k8QLPi+7hias6QT6qDwLb7WFf2CC8PqBNwV9MoEfxPDe+08AD9vLgnT6XjI/rYt6sHbAt9SxeWBTCCTMAvr+3ACPTcWhTXQXmKnW09+UzvlGtgMa3hPmqfwWdKannXXO8SChEF352fQIfyUZOqVvBLa8+4aSztTxep4w0SQI0bk7Gm3dL0VVbE1Zl22H3V3G2DojEZilR+tDgzaIDz9j6azclNmpAYIAzHQhUBI96SRozVYYF237x4MJYnhJVha2wC98757KSzVryrnrFC4Ik4cZvY1QSyIbxDoYkrOoFy8QHecz9iZAZuA3Oa+wi+QYJMBYk0B8wpPcG5ZQzGMYr9p0jq5OrSX31SEoVOQkF+Teptk4Tv6eJwXnDO5Q3yYcbK1fB5+5TFJe9k2fNkcQPYblUOyoR/ATnkIsHgftIZIcH8rhZZycV1MmB1SZ36pe9zwpF2SC7dAM/l9WktAJTqJm5H1bRRzL6cA43uypxUN9L2hc4xAr7+7D38AKqSTPjr36TYcSuz6yia8u2x1zwsIwpmz6P5UiFRXh1Xjcuv78Hq9PlwS11Osj+/sO/frRh2Y5PuLVpLDZWG9KBjmdsu0kfpNee4QtfV+CR2nHQfyeWqr0+8cy1m8nbpA9X67yDgKppuL/KDjeWyHD7P11qu6wIo0QvcfmfChh41skC3iMxX2wBrbIToa0BEmS+6iR0Z87jRT46cKIkg1ad6mHT08WsMbOGNlqJkIhkHH69vIkLzm1B6/XbwM7OEMKtFDnX9DJnnyqh8u4X2GjVRDeNL+KkMSH4yMkGFy20wjdDY2GuuDvaHdLDPLUc3jx0Ev0aD8GqGQCiZd8poqof80oP81UJM5j5cSvVNFTiii4tdPCfhE1CcTRD7xb+mGlKPi1LqXTqBVY5ZA7vHdfz1WN59M1SFQs/faOXeXmY8HQQq0wzcb6zPAwaTcBlOgLQW7+Wpr43oomCNqR5Zyl2Hv/FO7W+oL78Iap5YkuVn25z71xNCFdZAxP/+woG7Y9oaNAXIktuo92mJL7cPgtd2qLAyyGFY7fLwd+I4zjYMpsefdnL644c5Sg4g/fGp7HCXF/Y0bSMHd29cUQSgZdRKSar5fDtx4e5IaKONiwKxP7DDnhz/hZOOr0bTBYWUHm8MfRNMqLAjzvxU4gvrCQlyroSz6W9vrRjcAf8WbIF1/cvIvv9lnBg5AleeiIAWnov4ZaUKNQSIdxdtYEbPiIMDP3HvhPeQ94JPXD4rU9xqrakJa2EzYdb+W23F/hf8aER+9thU08nt8e/5JhO5f9bMm/PIYyvrOA33cFUITEXtn9NxpG/7oHeQiN+oerGv2+YgqzUMPxY+hs83ijCyTcvYPXFT9yu7ciTBtrApDaNerPrSWSREuilFNH9K0Lo7jBAslW1JP/5IoiOn8x/H+RTZrs5fQzUw+eOUhB+8yaKJARxq/92WDrnPvVlycAWs9Eg+74NhUIP8uQ9a+j78vGwe2oyvdlQSJLrZNDWugNnmrXDoXeb0Hp4LU/pvAzVlwtwq/BkSIgSgNSH9tjpfJocDjnBG73P8Hp3Pa938KAx4xvxlIwkhU3TBvNHZ/GbayeNj/Hn/SsT6HV7G1254AuDkbqoO3UdFlnEw1oxCeirO81xzxHEJw3DvyuB2KJ4BSNe/6O3qTfZys6JWiJnsriZBsycVcbBMt3c8v4Hy9um0BOJ6Wgbu56Fp8pRpO5znHplFRhaGIGgoCfgrnt0WUiKppUYoWDQJarYdp/9BbbDaY1NKMuB0DVkCdPf9/MCkdssK5zMyinXIEssiapbCQsG77GEwSveknEPlsaPg/6VR7D9fRGHmNfBi3vTcJovw88AbbA5EETO2vko2duHutfE4aNrCa681g0JIkfAJeo2jGs7wKPUNrHVDX3e5LYeg9L8MN9VEmjSYjzZmQCKpc94OGYiRCdZkGnwHVp7PR9NJxWgR24elanogcmVBxh+NIGNWmbx7OE4qDdSQdd1+7HCaz0fKJLH/msLsCBEHt7OO8nFei/oepM1mLhu53uvP4Dwp62sZqgKty+o4K0FZpw/VgZeWabi5xMNJL+uFvxXtoJikBNpqL6iXekRMOJbHF608eW3uyeAt8BLeHnyGuROv4GRwo448vdV+O14Fy4WH4BC2WR45x7D+14xtIwPY71CHRJZuwoup5+DxTfkQOieG8qrF9Cr6GO0Nn+Y9+1RBe/Oy7TPOwVOJsSAj5U1Bm34j13HvuQlowtZ920kDY1eRcM75CDbZi6tz2QclouDeHEtWHY+A7VzhShx0WgMj2mgr+fXwaNv5vB87wmMXnqE2rt24MmtP3Fx02YQs31O3z4bsl+7PtwYns3hyxh22uei7OpWvNZWDCwRzEYzbsC6zQUg8WgLZImNgXXCCtDWNx5EkyTQ1lIc9OAGjkndDO/cirFc/ht3chvff93Fsj3h3D08Dr6cFAK7Q9nQmC+M0bf/g7YvoSxcEgQBNwbpQl8SL+/4RDfTpGC8mD1d/6yAhgY/WWVNLC7qvkp/PzmApFs6pL/oRqHzlZj0SR3qyo5gx+ESuDEjFQ5vnAy357vBI91vuPbLblze4sFjfg2xipskGD0tx1kLiqBBsYF1hA7yQ6Wb2LJgCG//3oDVQy/o65MwCvwoD/u2y2G2qBWsNDch40mjafCKPhhulqeZIlZwZ0Q6H6uO4SorBO1odRLdJsMfFSrI67EQbrJXhBv/qdD1qVHoGpTKwwulaNkPBVDwfQK65eXQM6gGVXO2sUxZMI94q06XnE3w7uQf+N52Bd7yM4BT5Sow8mM3tb3Zy/MfRdERBz3aMmYaiJ2W4NMxpyHMr4CeLjCBlPyLvK32B02XmU+PVDX5RlsvByaf5aaAGO4qSebM0ve0e5cqNO2TpholZ7ZfMIf+qBfg/VuTOeXyG14oPUjid3LgaIstvvJQBfz7Go2n60CCrRbt6TqIP9TK+bCULE0KsKA0hULIW9POHsLKEHLQlkd/jeR7A39wwfVxFDLzNrdknOZITz/kyPPYMv0qlu9SBdfFwiz+SYx2nOqAc3UfKTohD90SLvL+3gK6uqmDtnvI83bHETD61ixYP38VLjO7S4d6/GiXx12cqrmDI6J/UOKdtSBp6okSHmPhh4kMXBD3Juu8MWz/RAFHjskGxXxPKprwnCNEiznozRDpODJUan6nlfN18ZxkPK0+tp+rPf+BqU0BDG3Yw2rpE0jP1J86O6bBqtMlOCXlNLz8swIOXjan2zqS3DyvgaaGJbPwuVt06MQ31Ky2hoFxXVz58zhrrxqAvxm3aW1COidlZLLtt400VWQC7jmqTgVmohCz8TsWSOqSnWoiL18/hb0/HOEn0YkoMycEUwTekXVdGH6vFgbP432s2D2AFVli3HpnFFV6x3FV1AgelzCNf6bf4dOVO+FBohY0bP/Ms3xaaNPjEGyrbaDCBa5w2PgcCVwxgK+ZE1le9zBFNAvD8Dlh6H/+kBdm6pOr2AlOHjxK7yt12GmHNAvXKIHYuN987LMxvPjbi3a8Eyb7xHHSGhvWPe3Nj82dwbsiA0Q4kkb6lYDxoATAsQ8ob36IHOd74aJZKVCftAxDxZfCjtytuDF3Cy3a8gi7lAzB4akWPYiVo6UqIyHPIBa3rhXCZeU9KNWgif0bfGhNbRo+XyEIZ1YpQNkDNzKd2IXt1nE8yS4dNizo5rm+jrBPoot3zuqDldXykL85EMocTWj3DxsaWyxDbtX2LO6VCD23z8Ar2Ro+ue45PjNRhhefwvFOmjW/9XVlh64xkDZkQ1abVrNmzBOq31cCjn0pOG6SPBR6P6MwsWv8ujmfj9TuA5PuPfza5AHdjXXHD4WJeP3kRop9YA17g/fSLjM12B6jCeu+bWSx6FJw62uj64O1NFHtK/vJ2dHoD+PgW4gVtibnc61FDhi3LuT6oFZsyN9PWsrdLNs3DncJzMGc1wAjtMIoI/MoXJdYjdd9HoGN+nrIt9aByoq7eM5rGVwf58JPQyfDmgJZuui1mqqD4jnnsBrOXBBCumVS6Dl3kH9f+s3Gvgl8o1cGzkV8haYExL51MlRQs4c3rayiiyeu45uEavjrrECjMkNQ7YQwXF4zh3YNH+Z7tgvZG53pVkUQeVseo3d53rR74SJquS6EF+sNwbzhJdjs7oOlVmPZuFcTmrRTUT+vm8r+8wMzm6vULTUDeqxUoUTIjef7hNOplQ8xf8Q66ivXosCxilimXwNNNQg/hybhe0MjWPDkGz2Y/AP/bXxMsjMc6Z5EMYf/2QUjYtexbt1sXFEyGe6dM4U5LVdw3761LGJdTRZa82hflTX/OVmJQzqrSEOoBLaP3YTRY6XAqXsW3oywgzUSEvBWrhw87LZz4iyindVPaPk7Wdrlvwe7mwm2Lz6M/sIicFR+MZntYBhj40Aj0m/TYT1LENuzDbJOB8CuhIlgnmRDG/AqwJOt8OxWMERsseBX1Qibv7fAXjsrOOwbDfcmToH9sftI1G46PYpxYVOvxWD/VRquuuryjPMbICDNEKExnK6emgIrC6/xiVgLSl3pyUERZhC+QRfTRB0x/9haetv9gu5+yIOoHFmYNGkJaIXJ8AfZfhjlth/rvNeRwdttLHx9iAWbvpGhzh6s1JkOyYI36e5PO4r+JIpPJ56HH2Zj8XGmDGsIhNJQ/Hu6XiZEjydIgq7MbEgIOIh7rFtgwfwY1BhvSXuXzuCHElF4VkkEkr8vxkh/a3AyKsHPde9gv3cAJVtd4EK9F1C+TJQ0zzzHkw2dqL+8nmfdmAQiq/3w8MN8KPfyR08BNZyx4Sl1VUSAnP0wFtYtAKVfZXglyQJeeMnxhk0LQVtHhyTzHsP33Nmc5ivNDxetxldTB1hrVSW7ggnUTHGBkttbyHyuJYrX7wKH27XYrpABr9xNUV3dkM/n1OE5cU0wkptNKeqzsFTYiH7PuUOFYssx55QrXTwykn/lJ/H7te3cp2cItVnnUcplKgWfq4VNOWMp+e5KuP0lCLNdP2O8qgu+PfqVVF2U4Oa2PzTw8T1GBKazzabLaOXjjL1vtDHlyEmeuGYYgrOmMt7TBsegYNYbbqdTZZJwWfImzvj4AIT7+slHMRKPtkyEyYcLydVGAXo81+H8rAx4OeEoTxdB8P8cDOkx7vjT0hkU797jwJJ6/qA1FkqUb0Gc4BqWmF+Ooefd4NeV9ayy5DZr2CfAgmO/cfqzXLYvl4RVvoe4cXs/bpcLgO6RIyjC0gLWXBTE73gG/T1rMWh3MeUrW0Bo/WQm1x6aeGoRK4aF0C+129wTZA+b3FtALi0N1SXi6c+QJCR80qJxO6fQ30JxDirQZO8pPjjm+EeaGlNDO2dmkfngEn64Xg1e8Ht+82gPze0VgKCc3Tx7uQt/PJPGiZU1dPH7X5aO0+AFEoYQ9+sSxL1+w898p4KSQCA6rAli4dN9qFm0lP9ODsbynHWUXWICx16G41GwBccrIZy4ZBwnDEyAqqPfqL4qks/Yn4IrR+15R+NosPjoRjURJ+DyWmeG5efxr6IOeLbLYNEsLWoecZN05axpmz2Ck0ggrEuWZV1tAaoUOk833YxRWFeJ5q8oxyWv+nF/0GSKEFSGC2XToFUvhCSilPFzhCItmJPCPZ9EKHzXDHCZcALFypbB0xWGIAGv8UjFDv4T+oRCe1/Dv9xOrh8dBvWdp2FawAzuiAjEoRUERo7fSD5rGBJDPnOm11lyydWnwm9HOcp3C592ucUlwXJsV6wF35eV4eppTbQvuxRCqw7gGZE7bPt4N55cPIJ51WfCRW4467UUxA/XQ47+aV5xLJe8lWfhp0IpLlq7k9aMVQd5RQ96pBfLTxZPhtw5QIt/JnPHyE1UX7USfvpl4vvdOnQ7XRxV8kbB9GnuZCgrAjjwBy5saiCPt34Ua99LQ7onsOpDKPnMv0v/hf5k3m1On1+pQ2KuLPVF3+GS7qmY13MU3FufYft/S6h75k6S9i1kY3drqqnXhyttPlg5/wW7u6WT29/fkHTnGd1KPYuPTlzH5OI8vPTnCdf7WYL/1snU3XIbNjybxDPs5PCxUT/vunyax3l5cP3Xyyz1qoenlamBxK/zkJY7yOvsVMDnoQuO2o5kUTEPxbwPsN/EEHo1px0CCkThn8F5lLeaQR1ym9FxfzK81dWlmTGiGNOvBUViEeT0KQSSLafCorAmFqhBcHpShV+36uGS+Go8cO0fZd61gbjOjTjjzEqMfyUAPZdM6fzlUN6OZbxi/h7OWaENx/seQOuIXXznZyadHCzDzPej4XfucvS5e4mKQi1wgW8YT8m4Qkn5ifx1Rwg82pDJLQ/VeVeOGCw7bUDhueW0PC4QS5TGsLSoOy1XMILKF22k1mlOt4Pa6flIYTDYMpcf6d9HeU83cPvUjm/UimHb9SCy+OUAfy7Kgvn551BiMRX8XWWh7dU+3iVvDXt3Z7F6uQRMXg6cK+9CywVXQrzIWvBSnwRtyp4cp5YLpV3x2C/lB3PmfaM1k//gZmd7mNuYAl8Nc0BotiUcdBGB+ce1+Wx6MWtcu8EFP3ZR0M9fXPVXAZqPt8KRDn2ermgANUvO8fBTez5aLkDTbPdh73cnDCspg/0LL3HKu0h8OWUxGCZLg9OjWzDf9RCWO1wB003rqK/5B+6dvB8HMtz54CktSp8ym7dI6YL+E0OcsyyLh++d5fcPT6Fefg+GdmjByiAT+vTmO4WYaHLPLF0oCskGOjyV1hhGQKNZFnwtGaKSggn4YsE0nJMuAY1S/ThDZjq4jZPgt8Ej6NKDSRBzo4ISKy041uoCtpgl0bk3A6TyzhYkdGVg60gh8tzfTLGNyti5TwJf/diEmcJaqNkTiKIrx5DMjSW8sEUQynfOZ4Uibzh+YCuPH50MXsq9mLutFe8dus5lX95RX9sFTHHShJeKi+ifbDiFeqrD7/sdcOC2NH+sm8Iha9y4/0AUWa0o5vvluuBgG88yDyzh7tV+ylJaBfLuu1FKfj8oXF3IakdH4cr90XivYzTk5+TivPETUPiOKFn65fDWO/5clJ9BD9OKyCNrDHzpO8QbenXg/qhH/Na/nabpJYA2h+OU6RbclLGY9U3/0n/ei8Cs9ygdjBEBfePxvHjGGE4R/cyzj+yB8+6uPFh3k36dew8eAuPx3Ag7yAmTg+ULfemobCAM7j2Ll9Y3UP16Oa7dtZLOwCoOtnyHMkGLKC5JAfbNuEbqQ1nkIvGKBBWtQIIcKWfNcZD4bgzP0oFobw/KKpnCzimWHKC2DqcvtUDzhBN8YLYpxcp9JLcL4STQXIq9RwtgafJESC3dw4FeuznIOYyp9y93aI7BFY/W8sSrHzhZcC7bVURyzI5JcGPSI1o4rgFSrbP5Uakk2v4+zGUhn6BeNQcsTwVC3KqLfP+qDmSX6EDqClm+eXsKPf/ehpaf7qF4+gCGjGskFxMdCtlaQcUz5eD6Zz1iJ2+W0Wnl7wo3ueTyQVKUiwNx1bX08bUv/7Jpgw4pSwhdcpsl407DHs3PMGLRAnyim0JnfQdocFQb5YmPx+1QDGm1U2D/AWtcmfgabOQrSN4qkoQ0c1jj6y68GbUDKuzLsMsmF1IKZcAmwhzTTC05+q4suSZZo+VAHW212Yy9yWt4otN3jpOYQC8E5WGivCIbz19MuiISqOQ0HcXnpUCEqAk4DbyCL7p/+OC9Jlq4cywsaF7J2zUL8Gl1A7qfVObsRT9IS9UJU0rmwqzUWzSbXHDWVHNQlChjy2NpoPvPEhPSzsHeyGf4M+ILNoS8ZH/jHpgY/BCXBI6G/9Ku4/PmH+jt2subXYS4Qq+PV6x3R13RYaj6+RZaBkuo2UETzIN0KPXIBX41r4wnvFkNozSycZXHMypJ14Xzx+rA/qgIJsdYQObcm3ilT5vGvU0Dv//+cFZVGkr12TMbh/Mkm40wtOcKKowdDYc+qOK4p9LUYe8Ef8OJFxa/AId76uz76xDs3fcLW3Zqs36LAYx/5k8u2k/xkp48KFS78vfk06zmvozaTKbgOdODvFD4MKv/0Qev2b3075odLFOupns7dFl4N3LpqfHoMtSJY0IW48rNJqzRrQfvVqWRWs4V5n+qcNDKkyXUjdjW9RU2VX4mD9/X8OnHF7z42BxCvaaywZTNtFlEDlXlBGGH7gpIem8PZkLatP/GCTJRZHiRYwHqb0wpOuEZBqiHg7i0Miwp3o8anhv5wpxpJD4hCxPmb6L6gyKgH/qPo+V2QMqiMNgUegf05xMtrgvhG3AAl8QMgc3ld9zvYQY9GRMhSfMpf7i4GqIS1fDh0R0Y23yHnu+TY+dfo+HrvHMY890CHv+z4GrLSaj3G7FCYyn+k85j8duy9GbvIO2rmUetM7TINADhjupYljloBhXrR7Ga/wp8ueA8v5k4Bby0QmFb/E1ofaeHuedF4KF+JpwJXI1vnWPRcdp3FI1og8PXzuLi0afJ7fBTMqyYQh8txkPU/l9YdNMNq1YV8JNLK2nerw1U2zSbrhzTgrWdxCf0DqOUiQE4rj/Etg8PcXlCBd2bEs26a/vIoDeKJ3Q14/YF68DKu4+OJJhCcJ0KOlpVgK2CIT3ZtAgvhK/i99O0+UmSJs8ZtZB+PQgl951y8OC/ChKrOU5rNvxk5YVLUKnpB68L1uFlTzKp/L8xEPnvALq46EGUlicvGveVJI1HoNyTbhj63U7yR+eDwszHLHHWDW6F/8MJjiZg+mgCL3/7HEvmOlFjcyLH/s6jlMkK6FX4Dp7OLaLhYyPpZbkA7K8QhyQ6we8U7ImLqjG0PRYvFMeysZ4FLP4XzR2hX+HUCgVorTkBXstTWT3AD34L30frU0y3rq3kI3Ou8YLseRAsW4y1IuYgU1SOOveYPXun0eUvhVjgJ4L/MvWoZaE2dywLJd2g17x04jTQCJ2Map0byWetNXb5XKKQTjn09f8NW82EwS9GFG+fHwcB8yZAoVUBfd6sC1tN19LiGEM8WZbE36/fYffY1wyR2zi/zYsGnhvCmIbPsK9XCM/O38LxE7Lg98ivcKz5AMVf3wru/ddpO4qAvashbP0lz/XWRbCu3AJDyuTISUoelF71c5BqFp75ZQymtSvoir0oTH4tDI88ilD0mRklhV8D68PKePbYFnwoH4xfbJfRFV8F2v9MGSZNjCX/pw2UHdxOmwdf4JwbX+iKVh2vGGvLTgdy6I1gG5of1ASdo4ep/elRvHBiPvO+6dB6qptK9D34XGwERZ37QD+UPdkgShmkhB6yY34LuybPIckwNRJoW04svQEvnurC6Jg0Tnz8lG4+VoEVV4Dzjd+iWGwCnhAQgnUZQ3BtQyk12DTxCvcy3GDxh4pCxOCy0i5OHBeCCZpP6O0RM+5JOkTR/zLI/Icfrji/G6wtZNk8WQoa89Sg+VQSSXgvBYfWv6wxfyGPU1gCaT1KpOg2kgymHeXaWjNQ9vWn2GuPoGfcWNQNDWfvkz2YHEmwKyEGdsp1YXZqAbkdUIPHBTF4aLk8hBsswPnO4TTymymFFBth8ap7tNw3iuTq0rksVQp066rg0BpriOyaixahNbAU/+EBqSs4auggPBi8CBZDsqijh1DcOguDX8rhYsNmFL9ZTh1HF4LdaituVXxOq2ui+YicET1XA1if2U4yjyohw1kbe78doZa8djqpdJjELkzBXv8sLgtbxg+WWcB84S62X16Odr7zqLfmLy6RsoKpik8xsV0Mb2iJ4au8Shj1ZBSMK1VDGZU0FvnQxIJ9wuyY/5EKD52A8ZYR7HDmJtLWC1RZrAXSX3Ix4asrib+8CC+9AiDAMor13nnj7XIxKHycQxNjjSm4dgz4+2fB5yI/1NQ/C8es4vmPXjJeyIijLEMZ2OhfBbIj34LLiBEQIj8K0+/YYJb+aZxZEkn/+s7Tx9P+MDbtDK0QL8BOh/v4M1cYbDNK8epkacp7V8XHWj/wdfP1eC6pj43hD5ROyOSi4Tou6RwBz1/M4n7tMjjSeg7fas3mE57GXF12HdtjBChCRYqnfN4Gbk1S4Gn3FKWyJ7KM1mI4p+9E+98epS97rmFwYgbu/dTAPgmHIfLSGLBQe8wdCvvxt1M4h178CxGHO1HWc5AHaus4xlMK55+VghNy8jCi9BSa1S/AVM8wilddS4YLI6jrhx5dX5hBOgYX6PVwI/zaNwYyzfLI3vYQ9uVXw4i+LXikaxdklk4jId2ZtMRCAgpOPMTR9tpw5M4Ifh+1FuMWf8aA7DF8/eFxNOq/jWdlqwnPfmVlZ196ozsegkuXcc+Egxi94AE5jb9LXv+KwWFbBkjdPw6hX2byGkETuKglC/P63fn8t5WQ1SLDEh/voqOHJun5ZoJ3owgMjZKkNTYXcGM5QI7abExcWIgZh2w5JPwE932VIJkST3TanMXX5pZg2z8nTBkrCwI1DDLHB/iF+G40ybannN9Peeq/nWgzK4br75ajcpkCnsuXg2Uf92D8zvMw+asjt9y/hlKtfew7fR0ntouDnttdHDcngh/ES8LRKnPY8acSXVcOoburKHmEWFFB9CXsfuiKX5s2Y/yD95wuKArVpz+S/JcBnueVSfTuHm+pLcaUkR85wamY+hTPYtN//1BKZAL8l6UCK0x+w0q/XuwfNwkfuRTQ4LaRVJYiQcNvBajMtAe7OifDSOFyKn/xEhPWLaTwI+0UYKsPR6tnotOxNVRdZ0ynU9dT8QWCKvcXrNd9DU2a58CCkv8Rdx8KIShqAID/QUtbNERLe6g0VCIZIZUV0UDRspIVqaSQ1TKSjJRK6chIWdEeSpGUlAYiI6EUQvcx7pN8UwhXAKZrefOK4Xn48fVJdE9XIA03AagS2QvH18ewgp0MShUUgNdmWyYoBc0Nx3GuejweOSzM684qQa18NToccILwGV7s0hOHj9y8ca3VGY6vjoFdH++AreI6HBoeD7ufeOAvgxB03nAQ5Hy10GfWeFJXes6D78fQRYsbkLmxly//NxXSwoxgtW0Tmxnu4K318/GCzjDF9ZnR7volrNAgSOYe6+ieny7k34jhA7sdqPppN/6Z/Jxvi48C++An3J46F6YMPcdz7/rY8cBo2PPjCPd/SwZbv/u4sbwMQ4N2grlvAm57ZYj/rp3ABN3nKCMpDZIa+9gzypiXbRenwBF9aOTkzVZ2G/jqvWfgdY3ZV3E2J6uLwITeR9hSbMBVV20wxy8a/kZqcO4UA45KiMBJJXXQVDkfA3M04fD1Brhv3gAN+7aR4Il16LnZGS1WVeO5D+m0o/oVmx5ewPlaCvD2znLeeXgIvsuMxoWS38k98AO4j6qlu3HXMXbQiFsVpMAmVxqSmsRx/L0Uut6JvEhSl8tM62iKYAN1rrMF3fwW+txuC12/p8KIhCk46slxvpoQxaZT78G2qFD+NvgL+2f4ke+bKHSSV6XEWllwDJxGNb2eYHZrPYQ7yXJzzHtcZG+EtH0NTdRqpo8TfekDjoGW2dFwb+dFihP35853YrywZwV4mcjD59cN8HFwEbo23scCvanwUEmDXld64qOKCBJWz8YUj2WoW9HIlu8b0FNzD3tOaiYnMwOwtcqnRzfKwLHmDqw7Mhkcy+fRseFA3nxYAi9VJZBB8E1s6ZsAqvPj0Nl/Iar8GcuvNN34VF8u64hfxLc1MfhOKYgdInLpwyMVGKNyjkTk98GVnDxIHXkAGjfu5ZuhX/mHkQfqzdHG/pgOeuIsDHf0RlLbgWZu3KhDSWdWQLLhZ1ZTSGBPuEsr/ohitm0Bud3VBifrpXDU3htHP4xEr4OOeGCrLo9Baf5j/xVCN2jCroQZpHJbC+JL5lPiaClw71OkirVjeeW5RNR4e4vme9vBsdYgHpmvigMBsqAxVpD1DMbhoZ/NlDf/FToYzKTNu5vBYt4DfuBdBs9uHaHqHhlY/U+HS+f4UOd+Ad77xoFbikWxV2w9pU/2ZZ9UZT5+LZXxng54TkzBCseNlNP2FiUay+ByihFO+5RBJxOLYVBXm5yz/PFgtgUsn3UPrt2NZNc+fUrsXID6k65hw84BmtK7CLQa9vO44wn0r1sR6ktO46PA67y/qY5XDF2Annlz+APWY1WYDMTNigbzz0nQYqkE4LwRT083YVvFfbB3kzxpZVzmnR5KdE4eeWm2Cv8tnAfwRht2ei5gjRNR9MQulLwPDJKq82o6HF+Pv21nod55DWiVPc+yp6bBkX3fOfneHwyd4IQuVmpkGP8fDM8aoOlZTSTfthgqErvpuo86iG34A+NC/NFh2moenmvMgjCEde6HeamLHaHzS1D48gDWGJiC75zXJDq6lGpnZVPfTU9OT9xMI2xlyLNhGV/OmUO6sjnopCsNlkbL0GKONYQtlaI8mRpsGw7ndxnAdlk74WfcUxJsDGadFG1ofSOBlzAbn8YSdWiPwaXHVnHWqdfwfocLr5S9gWErQnBiG8OtlgauOqYJvoVhvMU5lc8fi8Kg5CpcuKMD1qunor7AT1iWqwwmDRnowSkkZ+4Evxt6QB5nY5T1Sm4tX8ZmSh/hP1M7ODBSCFZt7ub7unM5VWMETWybxCtmDpBjrwV2LqyE56st4P6BPWC+VhNmtrvADcV+Fsk4iC3THvKitUfh9+w9VDnTiiZ9zKQ/GXfJ9YwQ4JhP9ODXelKJyoLjqUEgtnIXdm5wgIJIP+yY7M6zvTNZPMAMZjUfoMjeeu5dXgh2Qpq40moFfxo3hk80x2C4xy5Kvt/KlbNEYdBlGW1e5IJzy+/AlIZ4VJpgSAY/N/JfG0JnM00u7HxJg/36sD6qB8SlP/E4OSvSmRPCerkZvKdmMj48twwmqtnQ9IrlXCUnCXMnb8K6r5dooa8JqOqP42OuLfBl9BBGXJ1Kxt8Xovsuad7orgd5Uw7R2CfHSP06cV7IRphZHwTP1ttD5pW/oDZsSu/Oi6CaFcG795LcLH+RxzrXoHOTILhXXuLWSRK0WccQBp0GUWNxIuxZZQS6UwZ4alIzCi0JRMvKWGp/9g5snHZwzNgS8ip6CgItVih5VAL0+07w5aPh1KN7DKa3VKHo+U6c3XcWfSdth49cBGcHJejVmilQdqGC7fzeorpTLvdeTMfwl9dZtW8yTNy5h1pX7AWV3W/gb58+GG+KgJViq2D+558wpToD1yo1g5jybfa+sp+Dtx7inzeFIW+FGAQXSFDHYBtE4W7KaBGnixIrcU1vBoyf14i2g1/oRthMNB1nCgtv19IMBSset7obhDaN4oyDHylTOQh3R8pCeWkIaV3s5KglkmCslotmq3X5qKQKHBsw5h+zguldfAfG3TwPk8akQ7ibE9XuMIe/8R+5+YUDWUgpUuWS+2jrvZ6/Uh3rzb8ODx0ucsnjbL610BAkN0+j4VWfGJx8wFhSHc1OnqORr8TB99R0vOupCar+jXDxhRx4ecrw5gWC9DXjGsXGOnPgzmD+uS0Rv91UpZm+yRzVNoNntiuCUa0nTQkdiebRP6nR8zNrWR+FEsUCTtBEiisSwTHRI8HIdDJ02vpiu9F/tHvdIVYWOARJxUqsIJxD7y1NUUfKHnIM+nmpiyX8m53Nhn/C2extFy89P5vT1srS4Ly7fFsqAdrrjfGuwH2O/KEEWaePw7SxraRbO4r6Z36iRzXW4O//na+42eOtBZfhQ+I6En+kAQal4jg3azn3CgbSm48xNCf5HFHRP9Yzmsfrry6Ci8LlOP6GANyo/oj3s+ZioO0zVDl9jNxOSNOCb8lk5D0dU3Y20fsN7eBlpwWzexrAZXM9Rsy1Ifef3nDtuCDpjfqMi+xHUkJ2K0xfBbyoXw923Z3G420JRwhlsuJvC8otPUAZJwPo84HDNFz+F0vHfYMgwdEQkNBOUhMEoF51Kj8X+EvZcx6A5JIOat21l64vLqDi0j+YnD4eVj/eQ4IX4nF4ykY88N80fOYcjatlw9nOYy1ObX2DFdKx+DVEE/7LIoC+efQvdyzuWP6D0nfsgpuuLvj7NqPu/TBSFsvCLBlL2PXBjkcJfueDVr/AWWwv3b9VitYPY3Fq+g8M6AqEijZ1cv04GfICb3OQ60YOcmzhffbD6LDzE91YPUw+5d4UlxMIP0OtWDRpCrzdasdt/rM4vUIXOztfg56JIPiuXAAN/V50ZX8Cb7YXRtfnE2Bs1yEW3HyDB+JdwG59Kw4+v09vLTXBqXIeWcVLgGj9OBwbSNDRtBLNhC5RxAYNuBeUS3KrV4PrQicoFOzGzqFiNBXfCpVnAcoOJlOsfwLdsBWmOeVunK7qSDlGL0D0hCaetthEPQHd9M5PEDxEG0A6QZ92VIjhLGV/uLfBDseO0MU7jWLotvYW+wYN0OV3IyFDXAvcnyTTqPQp2NFbDmGbamFghQo8yx+PLfuO8fvDW8BX3QL21O7nlpJcOql/jR/nr+G8hFK+eUsZTDJfoqjPB37ueZKl7itCtbMcdI2Zwcca3sDAaS+YcHgiW1su5RsqIpj3dSrIPG6n3MsMpytCOfHEDly+q5WuKUthVnsbFq1cQ2WG8/hKsgxqyVTwnMYx4NlwCm/PusEjLcNYeW4azv3rgA7n/tBqT1eOEToHEooe/HLrNLBTPoOFb1PRakM3tjU9ZaPcCJ5vLgeDCjI8ImQBx5S3o9MGI0gYvQeFVvmiu/JDzBqhiyvtTqHBY3HKV/nAabuvo0p9BfbaGwKNLaSHj0Loxr0e6n6ZhgWGxjR19B8UEhsGXc2LVNNURkfb5GGr7h56vv8JpyjmQkn5G/L/PQutlCU5Z/Ap73/2FXq8fsAWR4DtT4vwa/BcMsv5AtoGMRSe+wtWGKfjeYkQyn98kd79akFp07Eg8TIEYh2ToMV1EnT6iuOPR+3Yli2Nw+kFePeLA40954iKjtrglnMT7h99BynrbkOG0W0MEFnAbZO/4FUjbaqUt8VDa99j+UlhEHOyptwXd0BF3YgvYQxduKFHDn5m4FGWB91xjnC6RYR7hRii9x8h3fz5mFo/gqNWEG2+7QHTYgZBcZ4k3ZTrwL1zxShBThW0K8dTvFAAjVduRZmnuay8pRQTs6fQ9/V38NDBO6i3PYD2p+lD2lM//nT7BkqO9MNzyeI8baIhdC3pY+/Xejjiww74+UQFSionwXBmHPxTaoaJSzW4dK8j5CuVUVOwOj4ISoKfy/3whq46P9sKEF12DQOXIkXdCCJll7W4XceJtu7UY6vA8bRUcwMPXAes+CAAozKmsXjcE85bmE0mp6+CS/tq2LpgDKVUqpF+A2JqTTXeWKcFzW1zUKqmFXvjXtAi/gg6gV85WbCf66ccAOW8v/QK+vnESjUoCJbjuE5XPK2yFo4fC8Mqk5PYsew4bEku4MkK7Wh5roP0/yhBiG0FL61VxaXVDZiuuhtPqXSh1sxjcMRsPArgK9I9Ng1vRojBE6Fc7op6xvx3Mmq8iOXzppo8O96bn4+4wV9WFOM+1UaQaJYDM4s3HPo6k+RWjeJvXapwzHM1/ok5jAeFD7Py6kyKz3DA8a+lwdOmgWb/WIl7TiXw2OipIFRoDnOufqLwLxdpWs5K7or4CfPEJ0PuYByYas6nqOFRJH7jDr1/uYrXeBhyrOUXjnhTSwvqQ0FLdTLsIV1ehiqw5uAa6Ch6Q8X9bjh6dzd+7IqGixvy8EbcdoooMoAdkhbk2BuFo+97U3xZBW95pYcdmUc5WG8zx/l+ZR3pGrjyWhnkjRiEuo5CxTQDevyvgny+3kX1l6Ws5rMUkiZmYUC4CIXE6kKdQSFuVfmFbePr2WtqGFUNzALhdFmw15gGjzWOsGTVfCpfrwHdJdIsXxlLRdtS+N+ZqbA38x4F1MhAavJi+pJZAc1HtMDipQXY1uajuF01uvgUU/TsHjjY7QGzT5Xigy43nq/rhgUSyXDRVwa0rfJZNyeQHUW3UoZ+HHH8HsrRmAP3lg5xwlpdmC/fi6ZnJsOi5JdcFujA65wucXpiOB7/3klzP18g09Un4G/vTxi/zx+cAqbDd3kHSnYbxk/Od8hxbB702R+FdLUKSK7rYq2Phhxjegm8PA3gk74cL5MJwC7tjeRWn4rj9j7gL1tHkNDUHdCUoskxZTn0yEcI/BMrUTdnPBboGqJFdSP32KSgffZB9s2V52ce59g5Yw1+1xUF81gvdGpZCk59l7Bl0m9et38htd8uw9+qlhDxLxIsnafClfnyYPa9m4VybtKCLilwjT6J639KQVHyD/q7Zzu1eWWCarMFCtYpwNq6J7he5TEvczSjztsO3FPpgA1lGfzp6jMoU1zEEcoFpPpyIngd3EKfPL/At5/B8MfUjxbnNYKiXxslnpIj2w+f+VO4FQmZGsOk3Bw6SH+pesUwSUecZPCezY9SgknfZi+8/PkGt+Y8pYp8AWhbvpbceCvuqD7KXuobodR7JqSl3oagR+PB9cEKaowcw2Ga0lDnWsFDUq500Kkd508ypwZ1Va6w2Uq62TPh9sjxGPtQggrXAeQZSNPZt0vgh5UsZzasg5j7T0AqJJxS/ntCQjezYUjrI2+KM4TV4jfhus0lviexD1b/UcV/N2zh4ZpITpKditWXm2ijVx0mNOlA395Z6DI2BhyfiIF2tA2fv+jEvdeHMf73ZVDrCcF9zRWcYmHxf/N/lcviSFDqDyy6XEJbVqzHw6NtcPyOw/xdJRF8Om9hdZ4w9R+ZBOdjQ1DSU5O/yCzn9vOPocpnP1RdzYa5saFwM10d036/x/IXOnBhsTa+Oe4GssaRdD3XEcSvR/DGbYdxp1o73ln2jIb23uZlZrLgKuXA3mPf4SGHszymcQ4pX/MlgZzxNKerF5oW3oSOc+Kssl4CupODuLgvmYULf7Ll+SUkOfyBJ8xIJGHtxRw6uJGC0tbhdCdBGGM6lT0X2LEGrkWtq4uo5+ZT1LC4Qj/79+HzKgPuNPBD/yUCYH48FLrua1GqQTt3PpEDqteHlrWqsEPkGmo4qfKL4u2U+E8aTp+KwnxUoN33x6DrmwmksWciJZ/ZSRwnReV58vxp8yUyu6gJ2yJeUGCnIsfK3+F4mRlY+uA1/9uxBtHpM4rQAp488SKkfrOGcE1vPPDVBsU9vvJ7h/U0a/EKKCrsp9q3o+iQhSasGXJH9fPKoKPWTNd22MNYaw3avdGZjk55R9HR/ihd+ZB21c+mObtzeeCyLmheOkHpM6I4o8AZWo84wt2xHhivW07zp9/m7z/16fEDA8wMEoHEzlJ8b6+JmktKQfbbEfBoUoDkhY6waEcMHLnqADPnKdLWUF1oiVbGmwfu8tZlO3nfAV/QX76KNr0uJXuZZE76UEtO5oLgaiUFewLl8enfVijWuQ8bRTNxrlwyOGZmYVB5Jds73WTLwFu4tEAMzCcSf53/iuUeP+B5zePoaakXaj8MBK3sOEoVuEN328Ngo4UVXDx+G47cLgcjmWLsGf0BFCZ54RW5ZjROu05CnYI0ccFbNpMxBr9J1+Glwna+apCH8UvzWOluGb1OdqYQK3cQmteBHr+V4O9BFWiKDKJg9zHQ/FSbIy3/8RRJI67cb4RmGvvB8z8xanz0GyTddeF7fjlddx3m5sxVrHvyGr5//A6Phm/F6cE6qOR/Hi7OlcIXSyVBIHACLBLM59QdX2CnwxoQlPOCw41t4P6jnK7YrgfHCgf0aRWHX6WJeH5SPQmMt+FNk8LIcvlM1pRhHL/Aj/SunaLTunoskW8N7XY1HF40lyI2CfDWEAk8UquJf4+Y8bbT6XhPrBOkxuXRhZ1ikFqoRp9kJPlV23Z0/dADl1rbuKmtA4JObQU59xuoMXU7nS5AqI79AYVKl3F00U6u/fYY6n+MpvDRa3HMYDhP6Klhcf0CDPAdA+k36iljTh7sT8+CE6rdWHpRlDoGr0Cpow/5vbjAS2d30afJ6lC0+zE3Tn4B+31H8Jof1VCY3wrqo33wXNFeXj9ZCNWjxGDyXEtIu+EG/WY7aNxbb5BJLIK4GYvJP7OfE2Y9A4Nry5hzWyl4rQXcS4+FU1HrSdI/iVet9YT01RX0RjOMk7Pt8YvGZD6odoKCe3XBJKmC67/bQfDmXNxSVMzNygyhaSvhpdsv0L5vC/OXyvC4Hknou1hHxiL+kBQuRtLPPcDnsTSuTFrGOd5K/DriLP0Ln8dBjnpQaVjE/dOO4mS/LrARbMfWUa70/DSASdpq2H4wgmq8X5D6SW34fHYZVj5hyJIPwuVfYyljfy8ub7mILccl2WT4NTtm7GebRTpgv2EH3RRXgAnxz4Gb77FhjS4pyXZR/89VqNC0FhO/fCPza9YwLV8R6j+sBhplTfmlb0DR7DXoan4EmYg44jW5OGbNMP5o0Qcrxygq2uoGfr8icOyIqeg5PZ7fZZvy8YHjGDzRGbL7SvnAZiWQmbAGpBfIYH3Hcli1YwOaNrWDgesgY1UamRaM4dnFLiw1ygTWFOsRLI/l7mUHKWtwP/+rjIPx/5KobO5W3KZkRxuGOkF9PcOfzLeUJ2nN012z+YuXOUePMIVq3UoaVdrDG993olJDPJ78MQqEPRK5K24AjNaWQmftW7wTfZZ70gLg2ZtD2C15FKb5zYOBLD14vcWWv1t1YNWzLaTn9owHlUagv+larL1lgraOjhCatYY1VytB7owZcP9vDezZcIzE/sRCflIEtv3wpmqH69jz04Ut+stodqYiHCw9jldhJdc41fHu8wP0aJQMZW3Xp98DFXzi0xIu/FAG1lEj4YioNKY1j0TX325U/cIfn9r0cflQITrIquD8q49p5fmNvGKcOKR9282n5/7Gs06r4P3vb9x61AuWN5hz4n1TivlwlGrvZqGhrQX06C0GiflmlPJvB+EspqInLrhguTMuMqmCGrEgvPxjGC0trUB58wg0+7qe1y//xCMltMmK3/BQxR5s3dEBMzcB3/1aycueW8OSghw4fmc8Z9d7Y/PXS2RgFwHvPU6x2SUrtk4agXErLDCiRABu6hmg4Wlp3N+/CEMVtrG1zEk4WH8HNhtlkP6Sl/Ah4CR5auvDgjXTUelUIWnPmsTRanLYdWU+J4yro7Q9hrTZsB6Mzu3n6nMy0BG6Ao6cXkjhJo8o6m0ymJj/BrGDv1hNLgGstl7Bb2+UaUXBaEhSqMekk5fJ0W8lmz/5QQI/fDgsLohbX5bSjLoArPrPgLoEAPr3rIbynj4o0t0H2aXbcI/DKagI/4Jq01/BunWBeOHNXl72azScv3KIBNtuc6xOHC+rXcG9F1I4qSsBNgxbskqzFHvevMr96kbQp/cCjyaUceOtJ/D0pwcYpP7lizEacGHSU+iYFY6hc45TgKcxVIl5coCVP7TZReCILGdOiPOjh/rbyD7Vktbu6kXdiy7s8VoMPl0eiblu8iy/fDs9/20L7fuSMaQaWOeWME7edB2ly1XxbAzBhLD5cFMpmtbeGI+73yyEX9HeIFuzExwbcmCb0XyWeb0Tk7eNhfynD+junFZWkshkjdUzKdyxlsVOfwKefRcfd9TQ/OFbvFdbEpwvXUFL9YuoO3sdTRqlD6ZFH6D70ki2vvgLHxeKciZPxedyMvD53nEq7WoEAVtJzveupWdrusnbT4Lf9Bjj9qq9vKLpIHscsoRAQV8SzcrAinR7HmycigkbhvHxLguO2bsezoSK8Wi7Qo7TEICpP7vxsdcUDJ22jkX3mtOce4BabgexdOg2414DPP+iGr4+Vob5u0/Sia+tTKqP6db0Hp6pO4mv79enVV53qH5AmPMtlDnR1wIupCzBCSgEW+3H8RGhrTwvOZFVgwbgg7sdFgdq4GxTM9ARlgKHAmcOj84F/M8B7bX7qXn6RJr1S5DU2srBLzkAFXz/0JoaBqnIdphxcBc8PX4AAy4bgYv8ahgoOUIznxiwY8hElNppwm3j1eGziCKe8rpPV/ueoVnDEOunnQGN1kG2+jeC9Gzr+fUeoGXyltCyaCmHhf8kRdkXZDcQioa7bUBh6Drp3wtgd8t0urZ0Bt7fpQn+D2w5WFAHB5r7eZHuCvDI3YxxTV+4e04Sx4qlYPs0GfhnrAVLThWSgLs3libJgMyku+BcW89rRj6EtrwyDgzJhGXff2BHhBIcVb8Oi+XqeFfheErNI3TVD8O7KyfjpdUrgHKSyKFkCpY+mwSXG7JYao8sZoQ40X59Z5beUwU5B2ppOR2EgEXX4fqWd3TKxwyydlmi8nQdPjZJBE+peYCb6F2WyZnDkdtdQezbXS43DePbtQKw7EIVNOeIgv2Ef2wHySxab81PWy/x14J0vPfiHOn8fM0PugShp2ILnApX42uN2/gExKHCbVESfuXI0fHdkLYglX9vdaGYO+bw4sV0EhnZAZefltEV9TSgtiXoW2kP9nmhXKYTARrKHtwoOQFa7/7hkeJLcMIDZbio+hvWtA1hcHkq3Zk5hl3gFj78zHjw3CQ4o+jPg38X4r2FaXxRXROqNq5GzeRBkLskinMlf3Pw4ctkhXJwfWwRXwsuRIfdsbQu/zYa7KnjiPBtoOZcTy3dS9m8MpOU71gBuBqwwr422piTh/92TEKtrGCS+PyCbb3MseZBKqSfXgdn/NVhfskpSmtS4+iZG2n/GWGKbCli4zRTPtEkxwIZxznyjiENf5aCmOpmcp8oCAbBsnD8rQXJu9pSaMgruPLpGhxwqGAtG034fUoNzIUFcck7P+wKG8FlxWOoNlMUZ+Tn04OGAWrbuQpOZmtC7GolWLY7m2x+ltEtn0e0tWoqGf22xrBp93j/ojn08kMSndfo5oY5iqBV4IdZK89D/l5HUI0MAbmjnvQx1YODX6zFiumD+PUrUK2XMfyq+0dWGhmwxS8JxXdL4pbkFNhVfhkvHZZmiatF5HviJB67rQ99O5/Bjh4Jnhftwu8T74F92HWu91mApjse4bnn36nYzZl6h8bC5BgRfDw8yMFxRNlht6mu+x7dvHOPPFensr3+dLw58SX/Pi4K+1+dp/MZc9ny5y5uqQullY1mNLpxCM1PW1NMwmeKcFyF69z14bTeW479sx3zTm6jTKsLdMifScvTHMZsFIcgO3NIkZvJgl+kIHnbKFopWU3zwjbRqJx3oLXxES5dvpQEg/djqKoil0iuoIlDZjB13zV6EeULfvFL6VztRzzX5cTn/EtBSiqNBnx0QPyCGWeWa8CqLES/7G7YvqiNKw2D2Ph1Oigk3oYdXaroVhPBY6sdwbRmHFTvCob8VikwLN6CzireEDRzEn2aY093q17Af+QP20PCqPqpBWg7abNQrCCKVMXj8pgIWBt/D1I/p0Lr7I+c2h3Dke83UISiGqgIy4F9xWU4qHQVV0yohyWHr8Lvj7d55o1HkCCiR3eLPbC2Vh7iHYfYzkYArD4t4f0+n3Fozz30Ff2BUUJ9KPDFHZr2NdLiRTqw58BO6nf5QykzfMnUOIiFr45AkwEx9reWhaJtu8ltZQ43pBnDl//6kPL+YLFpAHR+2wwr5qujQnIh6PV9hy1pC7n7yBWc/0cLxof+oP6bLfBfdAVkCVyln36NPD63CNYtqcVtEWfg9StnKOwZB3HC37G4oxQFvowFTccFbB0rjdNMtEE1uA3dxv1lBcVxHH5DEbpNFKGyIIeUC9V4WPA39fq34zWZ2TznuBpqDR/A8TX6vMV5EtR9v8WcN5J862JQoAwpreg7LTmsh0eK/WHbsyg4E2iDDjIGcE5Qgb9JPMIvF/PBZ8pKPPKyAq64n+ew7uXwL+gjyZb8hJJ+ApH/bpF86gxOSTGkG0eQTkkmUWb5UThzayqF7pelY4PP4eFePTjTyzy3Uh1C3k6ixfYPOTNDBHL6B6jpbAH8mxAJI++b4SYJCzj0RRyeChxHRT8pXDWQDLNk4/HeZzcKv9SAjqciQbI0E6+lS0NL8kJ+ZneJ3voL0O5fixj3LGZjjV7s/5pM/f4COME6gtTrEaKuKdKoU9W46r01C5itpqO3tbnkQgv7h0Whza4VOEvoBP3eYARl/xrJpKqL5ZVtsMz0H+hKzgPFVd4kDkfpc8ZG2L6xlKbkGsK7ffNp7hkPWvXMGQ37ppD6umNYuq2frNYGwYKQ01y2Og9lMhh+h2bgf1lNnLclBud6CJLv41TIq2+FiacScG+MFcxmPbIpUoQst1sgIb+X7RV0WdhwJz2W8cbcyL38fF8d2n1PJAtdZcIMdTjqlgXXo66wXvQg9WXOwVtvL5PSvbW8WaQRLuoHU5WhP8y4pwICTSfoqFsR77B6hCNVy/G/pRk0WJaAy23O8vZ3k/hKoRJs/WUKvoma8GGROyhnfSOjwwEwfcknLhp3HgefxuG56FywXybLs+6MhgMZo0Ap4yptm7uGKkc9xHjPZ5CyeD0d+0+XXh9eRIcfHoYVo00gpz0KXMyMSdv6AxtWnqCJNauofc8ArVLVo0Pp6RyuXsFn506HI+0SIJcUi6/2heOlHWkopbcFuLOCVAX+cHPwb770MoeWt04BQYm9uHlBPuY9fc6vLZtx1ruj4Fl6gvrN1/OJrx00te4VGkgIwd7dVXj2RRUbF51gL7oOQ62/YNlxC7zmd5+1b17Gm4lKLGlhAmfS13OqRQEN2xzHBWFeXGhuQl/nF4DbHEmS3f4aIg0iKKhQCOYdO0PvJc2JJ2TCJjEdGtFlAxkxMiTiGkDSJTtp8YLVbFYoDJYLTPmp7gl644xUrlGJL1ffJkuT9Xiz7wmfOvmITF97cnqAHoxMngG3l89F95fquMOYabmuPSfJe0Ks7ESSdK/FqQb9ZJYoArOv2kKFbjcal8yimUFDpJe8C++ZxfJ/179QT9tcvqstDo8XSsAU3xcUmrsRfn1qwV3Kx9lnVCEOiZVDgZ4PWgrV8Rm3ZpIMsoCYyy/Z6boHGAX34dgBHdC71QVB7e7csbWWB+Iv475tEaRvMhHaph/GxJClYFgdQElmUrCkDmCe52NIbx6JQVnlLPXwEltYaMLzSGkcPnSb7f3V+cDLMIzcm8emlvNJ9NkoCip+Befua9J1l/Fg+L4E7oU442DbcXg8xgwFtwpDmEsjyS05RDB6L6eNnsP6lcYwTvkuGkoP8kTBNah7cTMtWNuLb8Yvpf0dLixQOwfxcBa5F0rB0kOfwPJCAT53KSSh2jBKWjCaLoovpiD3drg1x4W37dLB6QoakDw5lTuCE6Gl3JpGbEjG6eQPoQrZsLz3C793PwRLDqewj8cU+E8sFA78FaOv22OIna7iy9HyPOPvTBhB1bA9uIkiFSbSnd96cOy3JmZGv8J9Jceg/GcxZ33/h9em9kCbdiUn9i7mS1de06mdytC+dAvLP4un3cUbQC1+mPNLRWjccAF4nthIenWRfHHpIP76qQh6C0fTw/8SsH36Ycr/fIbOD4/m41+3c9nmFySyrZwX+hhCaP9EWCVrghI1Q+h3tZ237buE/nqPKORRO2o1A975FMarrlpy2lQjuFwXizGvT9HRKUzfllXgHtF7JFZylPf0q7Gk9Gy83K4HofHSoJOpCcfkDbB92BvsPjHZ3tdG9awkuq8ZzbNmvkXRW4KwtlQKokUPwurCOzwYJ023RHaRRIsISjyuoRE+3Qgr5TBYupASw0ZBv1wJaVtG0Y7t12iRUwrKnFcE3P+exyep0MebMTB2rT0r1k6GMvGl/K1kMUVumUdFL6bQu8JAVi0Lw7+f1kDkFzfmUH1s7R4JsWf+cpzsDczt2cWPqY1MH+zisHuV8GrGHHrmOYJS2nTpQ7k1fIiwBIm6uSD25AF22JhSSbwkKzz9wZlHU0D9VAcnPp0NP2osQPKSBh1v+geH5A5jvNtZnpd8EQcnTuWwB4246cgJDnkbhR4fREGtv5JF/XU4q+EV3nsZBOc3X4ArsdsoZOFujPKbTU0FDegiaAZ+6qloNrgQJXUXY5hyPE75oYoWc0bz0oFqsO4OhPgXKZBzUAHqX03E5gBX2DNjKkR+WMX7vD9AVk4zHLYOISvspIDfAtjerQNGug9p8Y+VIJ3bhQMtbrg//w42xExHh5psbnG050vGzVBcIwb7748lkwAb+l5cSTJaEdRxohh8b42iHXK3UE3tIBut3sWWpRZQPWoY0sbs4y7FsXS19wrJpgaT0NF5WGKpjrdNCigOdVn8jDiUJ/nRI6P/uOLrSLI3amXFra/J5VUrTpolQ+cOppOjhB4/9pSDr3t1SDJzPR2MfgRVMZNx7ylf6tPSgejQbLr86RJZzxhNGe+NQficDIyaHEf++sPQULUKw21tIbtLlzcYVYOPRTOtdb4LO87LQHPvDpw85i28q7WigGlePDNlPi6JXkb5ItL85tBTPjj0Hi8lKoNj4Ane5lAJN8SjuTnkGFhMWYkGgjO4vE2P/TfWgLZgMb47KQqjVddD26lX8POdMuSPsuCKKzsI/SfgvW5ZXnbUlDTlPNH0qhVkXVjN+10e8tqTLaS49Q4KLYyjnzKz4YLpCHi5zBLW1bbxvNsmsKellp/NCeSS0bOxU9yRL0Q40KSIp4BFx0jefQ44ZuVw8VdruBTaRv+u3maPw1o45cEqLIwcS3NebsIfc5dQQm4YagjLUdosSXhzN5T7MnV58YcF1CunivKOwWwXWgKTHhGJDN3jVUJD/ELABLbcr8PYAyfxxIdRfMrUHTpPdIO82mM8JPIPrL7owwlVIX7iYQbNAUag++wXbq/s4a0dxWj1PIzffjmIC7LScb2dJeYXJkCRlTIc1ezjtuOJeFVYgqPjp2LGpkC8YrATIwSe8Z7+UJpsKkdi3+RBseIhdSuNRz/3y2RWcoJdZPXRJf4rGSzZB8+fycHBUbHo+VYDhCAYvYbdUOBzN8np29GTG+10oPc6uOoipdoVs5+LLV+8qgB2pb0we6slPvwcCf8W2OLI7mcQck0QMv6eAy3Vd6C+JBvO7tQBMYsXeD0tig8cvwm/VwzjlMwjqHTAl7/UZOH2U+v5nf1CStCdDI9nrQSHBC+ecOYV/o5Qg/buP/zopBYv0AvhCZ9G83CYMfN0EQj9cpufdyVA16ZL7OOtAIXWo9g05Q39ST3FBzQUyF3CBGPuj4TDc9/iK5Um/DTbgX5U5PB6UVWu2u5BIHgLUkda4SgpLy7wswYhj24sSpuNY8b6wN7fe3li6Xdq9H4DRlLtePr1JrQc0cUOC8dBfOMnlpgvwg+KAmD7sm+4JKaf5olpw2QrcVZ87UBaXe9xS5gyhD88wxt0FrPLTE2e654CN7/8YJuyGLpyLpU6egdYacx6ylLQhQV3/AAv9sD2yytpx7gYkhCz4nj3DtCR8cKnMzvB0vUk1YSPAq8MGd4RGQZ5QrO5VieEDdZpc03OJepImIiBlSnkY1aMW6pN4N/9ZPw4v5LNX4Xzlhu+uFHmJAo3FmLA2DX4LeAkej3rgJsBhmDtYY4Rt97ALwUBEDbpAvsRPTT9yEGQVWxGiwIdeDXehc5FC4PDoTyQGzCHV0lDKHnZj6a5zgWTol2kkioCakuXYEd2NLZWmEK5xSSUNL6LDasuQUupFcnZ6vDyISM0GdqEqdbVdOHJPvJ4KQ9CG+ohZmgePFQ+CeEP3vNI4wCwmO+AEy5EoZurM/v07KekV2PANseepFVMcY1aPr3vrEFeKoOPP62FTYu20ZkeQ96R9IsnPheFvS5arHu/D3dURkLiq3jQau7ndTdioGBmDUWm7Yf7v1059601/BbrZ4kliEqXzuCgZAKpq1vAjuNHUFOonztHWsNbo2h2vaED59fMBosLKhw6EMXfw/JJat8g75XVxwt1XWz9sJWsnzniyydTwXWrHeaeToeHpdZ0+qs3WKTko2TOS1YcIc5HqizhQroCPHw0HVJN1ODm9DzevD6I36RMBYcV0bBkjD6tdtfEplbi+k8hPOG6JDi9EMCOdVNhZqkoBdbncM+VEv6muZEub0wn56B2Wu6fB/NLheDlshuw6uspNPy4GI61vsRF9xeDX5goRrgpclusIw8rFvIVaxMYQDd8ejIJr4facNnbHjq9+CHKrfqB66P+8YyiYBSRGgc6+togZ/iEwyenwdnhRGzQCqUDZ0dgR64D58r/4cale+HMvj4YDLCE+b5boCi9E/NnDuKDZ7/ZzSgM8xbn4AitBfRTqZMKfBVpkooJzAiIgJ3jemjBYV+aqY+wZqoGS22swpB0DYipaQL7gm1U1y4Pv9e/xivRttRzRRcmHrNDFdfDfNv4NTse6mB1j3aUaSSOLleDzney1KQRjsdXMZ8wKEdQjiHFpC0kf6yTE175s8rdRuqxloEDc73x2cndNPR5FgfWXeR989ZAdLE/3lsUy2fSkmHN0imsqTkWjuoVgwQ78KaBbPS3DcbKr/vJSe4XrV7bibMXerKwgC/ubZwG17+7QUF/JJ8ab02+gWq8e/lyap5+l4J/38dZh2zwc7EYPA6aBiLPXKhg7Q0IcsxiwZ//4cQ9J0nU4iXGf+rDlFtB+MXCC7QDEAyMvnKFWhmlvHnAJ6KCuMb8Og8Ij+YIqXVU/bSRo+Vn0yNHY7D2ieCgGVK00DKDmg7tZfPI7+g8ZidNyfnJR5z8uaCxibWEZSFZ8gIGtCaD7JvPlCGxlqPqR5PNTRWad0UNK9TXAjXk0wiPkXB9rjXLOcfi9MyD0Bd5DU2DwsgqZxwLC97A6Ny34DPZkEIDpUDh8C2u5cck427Ptp7/4OTraTzX/yH7qGSTwy9FLLRLxm/FyrB3rAdMbg1g4YOGYLhOiYcfRHLEO288s3UcH4gX4/XNc2lqlQpsjDiPXpFueDHsEfxNTgIpow6OkA6BiINRgOPleKlMGrqCLOwUesOD1XvRYM0GVnd8CErLh+n4m2pepG2MMQMKDDNsIE8TYfOWs/A8zAxFZfVoRl4SChgGwi4tW35+7gwoLysCv/QsKskZAccUpOnfTVuKDxlgYcExWLptkDZaKtB6CTk6W13PifXtpNSmC32OoyDq1HXsWrSfAwt3wcfj/tydXssBj6zx0a9t9NQ5i6QS1GHkm09ksTObQ3R1ePfKN3zokDV2yK2ldMt62qjEFFdpxclPdOGj5DhuPqUFA/uMSWHreTzcfxK6/PsoZMUHkgu9Cb6LfWleogp8fx4MzX1X6eS3t6yR0gSFapup1XwHiizcDXPXOsGP/WfwoJEorH/cQdM/dLDUzsd0KucTNzfuwhuWmaxdvI4mOOjDUN4MkPouCh0NI/DbvBIImdVDJx8IkFYz44LvM+mD7ywyXtFH08bfgq/PEGpiA6ky/Ags8EyGsc7BdM5QEM6mMUyZp4xX1MXYYP4wu8/QhWN71nL62Bhe7+pARsJrwPe2L092/AJ/2nwgq5Sp8YoLpYxESG6s5u0/40kydwaEdwVSeLQpHjP/AVNn+ZDzpSFQMBwLWZ+FIEliFFZ96MDuB5ZY9uMKzeiOo8vnJFBx+h9WyI8l+7PdJF4mA6IHyinV5CVrnNWitoECfn6DML16NhqoDHFAjAo9Nm+i2AtWEGv0l9Tc3+Gm/vugtX4xzBuMwJk2xbBYeCWn8UmWnD6TL5RMhP9ayyh+03pyDYmgvZOuQr3VDFjpvIiW7q4h80FxyD2kTx+2GkHB8zq+8+UXL5sbCG0sRqZ6dyj07jTUu29HTbsv0tVdhrABpCDNQJsfZylyxiZxXHVjAXanqnP/jCAuLNvMjgm/UefsOvx+WwIsHuVQT8I51Px1CCcceMQKjvkY/rYTgw9U0511l/Fkz1yMUROAjTSK9zcd4AcT73CSjRdb+sxhB/ly+CpxHUP8Q+GFiyQ9KRcHn7UFaJe/jBr01UkhOwd7H9Rg7ic3MAs6ynItb+lztjQ+XG4MQQHj0GqCKRSzD0zelAVKEVnsUnOcb89VhKHiFj727REKFUnCxXcDPLZKm4u2vqfV0xFPvZrGmzesA8skRK3yPCibsxO+H50E5x3suUmlhF4q7IJvhovxQNkHUImLotdPcuht8HseipTHWbO0QOf8TJiduRhsZy5Gy5SNuNDhL5w8W4KbSjNI920L5qaMARltOVD33QWG9vNw7GPAZRYAIuZ7wEvMnn1C1+EtWykadec0/hc4FrK3vwN1NS/+flSQphxJJ7u26/zfgeeY/DGJuxqaWF1FHWULjaDothxfGmPAdZHpuOO9LmYvWklUspOOb5TlreYX6JbQARyTOh5K9S6i25YmOF/ngjeMtODFZ1+c8NYAZEdawoSSGgoy8SbNOgFI3rSCDaAeTp1dhpqutTzbppbOSPXxxRhnSrmUBItzxqD0SBF4o1gHJhaiOPveCd6mmEhGf9Nh7nkn9pK8Q3+yYkDuxypSC5EF9emn+P3k61gWMJffJ3bgnF8TsOJtIGdfi2Ap/UycYL2HI4ZHgNzRElw8cwmkbK+A0XPO07NrgXBh13ZyljkP0W2epK9dD/Yu5tA7OIbC7fsg+tog7JkmjcFPnCG+fBvuGr0M/OPXw/dRyjSkbggDlfK4+vUx8r4kTh29kfDAaymlTv0KtPkIq3wJB+Pm7zT8XAPEjpwkmaP3Oe2zDRnvP8cSCyvhfvZxWhfphR9bbPB71XLWHRgJcbfegpxKHtk2C8GDZxGcmOaB406EYeGh9/B0lRhrNk8l50sKULz7OX789ZOjPh/DwHmb+Y3yO9506AQ9eDWaszLfkP5vd/ghhXBYoZo9su2x+lYxZze20yNNVdoOdXzhqiKF5C3Da++DeNnoqXC8qhlNRFbC0hGy3L6vmU+8fsphmWu5dfAR2/a3oG/JJJy5VRh2XnjJJ1+9hT8iqlyv1wk2Vw1oePkfchIIY9+t6tScYwvGxZKgd8+Bx1EHFeyfxh+Vk3j6mU669NQG6pJLMEx1Iyq5ptKf1omwUyabZ2AiS0etwYCl2hS5ZhxkaJwD9ae7eZtNLVeCBJz1N4Q1kc/pyKxhTO8M5fOT+rDuy250s3Ji8ap4MC+dyZdvP2ShkSPAofgXBIR+xJKuKJrj/Zjtn8+CjYmjaP3P0ZD3XQPGZS3GvDfKsO6nDJdPFqbjWxRJQNkT86UbMUZxMruTNCTpZnOHsyf6X0aQ//WOdwZPZxt7ETDVmEWF59dwdtgn8tnohOdEn+HUY0JcdV0K7n+3g1LxYigTGcKYoSQuXNaHi1Z60a83qZSjbkz/WfnRklujIOX9RTQI+AdrIrx54I4H8MUWStV2x1WCAqw2ai8FHE4g/7TR8OKmCpZH9sK1sVocEDEFQz9Z8bkT9lBlUUSvHj4l0yeerDFBH/I+70HHhFz89MwGt1qJoI+0GR+Tm8e67bvJ3k6etg6JscIEY/CxPcjm7pdhtkEJFSUawaOsSTycIY5xui/41moTujVmKoTlWEOCby/N26RMf3wq0emcNB4S1yHN8DIU132J3ZE10KbYw1GmopBe0wzDQVHocv0+qBxaiOItvWAb8AOkk87y5I0JYLX8AirVT4aG0SPodfxBuL9Xn8qVjTikrgOyv7fS9EN7qU5ugLFBD7arCMBP4adk9diGs3+9gdny73A4rZjKrTp4n1QIhPRXYYnBJjA9ogYf76jQmSwvPLzuKnmE/+GMeEnQkOuh8/JPqFFLkITPf6VRtxBuOmrAZkkj8Hj2kFqnCtMc4e8wa1cel66som4w43N3lyNGS8Lql/vZ1dgPnxi1gpT+NAydNAVj+lNh4hElOuAhjCINS+nh5Qlwz28h3/P6ygnKYjDxjB/LZDwl6+0fOG91IH/sGMnLnc7g2KuqUK13gxV/L6P347uopdGebxf9w7rklRB5fBYOGdij4EMlOLjSFK6BLm123w1L5kaj5jdtPFaQzzXtFjj3wRbe1O0IbVPq8Iq/ODRa+YKB4iFcu+Qc73wxyOu1rKC9xhLCNzVx5RUJ2v37IkSMUIZDPoMk2DsbVs0r5XPbf6LgFw2oHSkFl5qM+dfoz5gn6ooeL6xB70stLKoZzweyointfiIs/28M11n40OudzznxjSQdPbePHz4XgdFzEvj5qip4Wz6GL1uponuLMGi0f8NZjr34AF/Ccqkj5K0nCX6nftK45e4464IZ7VDthQlv3vPLLQrk5jKKt+1yYeUoBGOTCXBUez7fOX+C3Sadx9GpbWzp0AsGx//SZVd/jr1qzydOCgJHi4FYojfZVj7lfed24hlaxIetDsCZ6bMpb1sra/8rp/lfZOhpljoMRGlgSlIK80MVvLIrlLzGGYJz7UyIEoqEbXSVyzRXce1XHcicJ8cLB27SjZU+bOOwGPP+2cPRPhMYio3BkrHdeMZnHUZWGcMaw3Lo0X7GsWNMUHTAiMZOd6CWLQfpZbwUHKsK5gIXO/68SB+W7r3KSQ+342Hr2zBjxUrw/jhAm8/587V/jXCr9RalmPTBzHvmcK8vl+d8+AdJUpvgT7AV1/uZk/cfRkPd85gvEIQ/O8dRDUmCUHkWWLhvhw6fRRQm+R+WfHxKf+9H4/t/m2CtpjHdbdHAH7vkISvoHoWKb6UwAUec/0KRhn93crtXP+Tpy8KF8YLQ24W08/14EHFOowMqA/zeMB7P67wl2c4z9OqtHXlvucCfqwM4MVuAS2URAkXjeX3nL9LxWQifrwixx9ZNMOnaEXg6+Jc3HCyDcYXX0HKsLqyYL0Ui+3V452Z9eD/7Iux/O4b552kO0QGYcesseB00J9MFqqAafBnXDkfTtBvL6Z6bC7XnnMCRLTsoPVKOGh5e5maJNsiKmwbumv2s2H8Aozr+8qc3wjAu8x+d7s7gVa5R1KR5jfZVXMY7p/5HAHwAAoFAAQD9wxaiiCTZldUgo0RDqZyMREUZEaWhJKKiUCEaKlqijJKKaFIpNCgqUshISVREySr3TEC8eBcOJu5G8xEK/Mpdmwb4FNn1TOSy8Tb0M+wB3Zt4hhWQgTcdpZ6CAM6Z0op/a0/Qh+JF5NqZxN9yW3D19HNoYbWGzj6RBomv7uT2eJhuWmRz+Y73+Ln8M+59OYMM3n2Av5cuQVPiBi6sRFD9ewKXzHOh3WwCp9ALzuVmQEv8Cbjw+zfNGDSi5JFP8exmIXh4ZC3cODiaI+zLMezdC6g6Mp4PbsljQ58dJN5aww5a96lQURCSRHNoudJJzDN4BGO0dWj9rjHsf0oLAov08evPEti2zpSeHdKGN4oTYLKbBFsuceTngS84p2YZ317cgTf1t4CLfDmZ8gq0LhsHO7zfw9En5uThko3Oxx/TGAljfJV8n7oryqB0aCFufp8NgSt0QUt/FqitCsd5Ej9o6rw1XHsqjeQMCcuG/PmH+39wvswetj4YBWlHvuDHjydIXFyQ+pSO0tKbsuQ46gpcKSoEyeD/INr1Mcw2NwbtWf8w5/wp3pE/GcfFfaHI79YULiZLBreO8o1X38k9oRvvdWpB+IA2jrApZqMyFWgczGKtlHyesrmZ+994oGqXLGp9GoTw0olQFfcYK6L2UIj+ECVVaVHKwDosyt2IlpKDOPYdwi1NaQ7vFQPxrc18RWoDGgar0veOGuyIPg3rl4rRpdnp3KP/gKNepVB+pBQs3FlO5xcGUlv4PQxT/wm5XeewLbCPvYLW48JoeRJ5uhffxs0G6XPOmNFxAX+v/cGPkmbhqeUbeYn5T/b3jIB5o9Uh99hDyMsUB4+jFjzrOvD0umu8xaWcTabn4oTRGzEp7zCNS96KosNhkGQlAlXtplDU60DSPgVw6GcfPjlsiTqHbtHhRi2+NEUXx471wxfHjeG1oC0e7J7A8GIDTzo5hxLj92PtpWlsvbmF66pqqNv7JYC9AGTYjQGtZEmeP30FtwrP5mUxgfRs/xy4cXsmil/aA/oPXoCAtg5kXT8I2U3nMcAtEuJtzuL2kBqarbmZV81OhXqzOvKPPYeliSPB6bkDrrh8ELteCJJLRwMdN6mC7Z3XuOa/tVgaqcAPZfL4xxCD7JbnsCFtAQ5enkm59I6x4xjW2fyEM1OssFFEgLSiSsGuSBfuyrfDS90T6F21BMe/roO+JY3oPSGAfFuNeOhwGZw6Vw3GGZPhnsBJvLg6B8oW/8dPuy9S9NF8VCkSZmnfefz2vSLcFz+JKnlmYPrjBKTfvUbefz+D9IhTFH/QnX6Y53PlNRHa9Q85Ynga3HU1hZ6qRsi/LUajx22GxLVJuHJqJGw1OI+zy2Vx3MszIHljOp81EAOxX0m0r/cGLxCYQ+Yzj7O13TUuPSBNZ3uyYfk7exp9MZsmKBqDx7OD+OhlOuWFbWSRMgnM+r6ZVdRGw1EvghOpnyniZgbc/TIZGuyFefsbQ2ywSMWD40U47m0/bL4wnren+sO1iq1UMHEKCHUi/Nao4aKwfKoZMQY36N2HS6rTyKJwFec8/YC/nI9yb8kP1A5TAnNJQ/BbG4tbb/2kS9I+vNjsK3YUlnG0oCvara+DKSnxEKWsAW1aouRw7R0ELP3IFeXS7HzzIilYenJa3EXem+zGLW7v0TJZGrJNjrFRwiua/a8M009twnM/hNmlz5gF/i2ls8uc+NfIYt47XgOsTavhqnsj1SQo4OroLyBU+5MmTfQjiXoj/qpbAx9fLoOtvQYwdnQX19qthOlH94JYsBL8PgD8X4IU+3gWwZrbF+HznrusbMRwd24NS6pNRDXlvzg9w52Of2jEbZJ6JFL5HneadtDxd2Nxm7MozNJrQWOFf5zUvRUDP/3gSQen4PnX3/nSgQwolDKAp9dOgInlLDDVOEbFNz/zD4V29lw1GScV2/G5GILgFDGa4D5MEYPP4ew7HdC3CUKJrvEYLNsJXybtxvFJr7n+93WsMGwlUd8HJBh4gCRHqIEnR/LMcgWYLiaKuovn8celzWhslokaOfupzu8XegVt4pH6o0DU4xwNukbg9df98KFci0O/hUGxcy2qr5SkbzAT7/bI4U4TDXj67B2YBRbD+/x6zOnVQI49wGKmfvQ4rZn2fQjFSQfusUrVVNA5ngp+8+bDNNUYUlrtQCKJpSBfdxeWzhtBMTovKer3YfzC+pC1fAuXpr3DRs1oqg22pBNj3nBUUBFeUJ4FC9TNsMPgG8oKakOZhy/3lQry5o6nND7WDR+0bwA9NxeK053GzslDHP9wP1sHiIJTUTI/U7SnmIN1mL1igEK2PsS/zlLcPU8dpR6W4xyrP7wd1KHClWiWxyzwcdZjp7BtsOh7AC5YLAX/nG7Ta0F7PkOH4OBEAzibJEM1pd+wYnwIDtW2o0LkcRLtjUG9rlb+PXAE5uxbgB6WBF/WN9OHLQLww3cRFqX+4VeJuVysHExemlsgLTyC1pb1oMl4AdhYNY8XLwyCBYEJEHe7Cp2a1lK2wnaSG5PNaj9Po1/XcWjXVYPH715T8o5B+p2wFf/1rEeRV5OhIPAPw++DZGcSwG8r/Hnu8EwoOHYAY9bpYnn8dG4augEnesJ5+bP/sMjLm0a/sqXJ+/P4i/skENPeB8furuAnC9/x2zJLmJAtCx3WZlybG0kqKyLg1OQi2JVuBIlXb0PLaMb7f75g8KWPkCa0kBq8z9OX7p1w7t5D/KeiBH59ADoJQfB71w8K0DYi1cwcOEC7eIftIBT06sBF2Em/LDzJeOtEWCB1hha5r6A9kiGYbGuIrYFJ1Hv5DU/39MBjJn+w6qAoTRmlC/OkKrBnbxasOPCPQ6M9+EvvG17erACFo/0ptPcXLNnZCVdjTKBiQScZeyjjnVDAccl7sDZRAp/lJfDIxHyKa5VlJ8klUB2sB0sq3XhuxV2+MDUbtiUkorUkkerHaOC5Rym9aRtF7e3AV0EEsSN68L3dQQxU9edduoPw4vELGg7+BO4LmXTrlHh16Xn6MB9gzpIo9rpvyHYnm+nzqNfsZDvEAZFv6XRDIi9bv5geizxB7/8mwb4TSSw2/ATi1rixwJwluJQ+8PB/oSB3pIYEX4exzj8X/HpfDU7vdmPJUjdYNW4mPvBzZfOjQlwRGA3W67+DcuVMnJLyHHdMVYVRz2Tx0TkRLJ2qyPMPf6Gp85rozuBFXDN5A869fJPbojIg76YJ5Ao4ofil8bR3+CB8sxaCXNFm7O9Wg94z+aSZFoHn115HHZVJINVaR190rdDs8mf6MHETT5ZfR80l/3i7tgqVP1/PSlp2oKSiAkM7PtBI624a+bEVS/4toBcQiu5ddfy+5gf8bfcEQcGd6FUvCvkXAzn+Rxaq5UbBGelH5Pq8E+piT8IFxdsk+8aD363uIcuoGRB2azpbPHSFz6OMwNHVnXQ/XcfS63E8a0kjDRiU85kHY3lhtTLEf7oPh7flkU+ADe7xXsSf3S1wTnI1xu/LJN9jnjwYcZRUw0bA50wntHuUD2GnDDilWh025K9DldLdRMY38NkPf8g4cA1V0g1h8EIAery6Rsdm+uFNHVkWNVhMBa4WcEOglDxThqD1znGaZC4JSQJ94LP8HxxX2sQOZ0Wp4t1hvOu2H206FNH63jU0LfmMTHrQbX+OCkRKyEbqGN3rOYoqQl44cmQgm5q1YNbbIB7/oQ6vqxlCamUxp2VpYZvJFo53CSVP6TrS7DjB0odVQf3OTLwivxtvf1WAW/wCBebdYvPdTym8YhtOkN+H6ov8yNzZiTYNhXHHxBvYf3UEVKkOYbeXBayhW3Tj0w1aEVMARgOhuPzxYzYvuA//9m6kvnMaIDL+AFksX4L9Drf5rtF93mP1D4xP1/DCBfZQuOc0hd32Aent6uCe9ZLqpO/g0J80MBSrJuOwhWiWf4Z8NfbCGWsZSlU5BS0n5UDi1G4s9OvivYKfoEK7F6riRkPonUHcKKOLKa2SNF7RgIfNAI5OqsXKw3PgadIsiA59Dee2zaf2a4GkPM0V3w+lwfwPCWCmKg+5goPUeV6Zcka8xAdddfT+wjG+0FKPd2qaSHpHP5a7HqLqf4KgV/sdyluCOb/AgFbbiLDYiBpclS7NUyPdcP+jqRjh/w6/3DEHjxdW8FthB937JotlaicxdtIb/Ds6gbOi3fG+rTfiLym6JawH3jK6xLsrWbY7AapUNuGavpEsajGNnpuPRo1eL/ggXwb+FxGunHBGjav/UKY2Gz/URsDUxavZcbskVCnqsPqdPeD7VRfm54uBxhVVnG98F65pScDEYBn4Y+xE0rwTBGI/0T//u6yxjahvsjzcqkmnC2V97Jrtw0YVQZhbLw4bRhbBkIMfewYaQviandy1WAYcTBDzwrzYtOMNW7nZ8v0H7qBevYhnLzTlT0VbuXR6EPuNk4Xd5tu46L0tae+3ponWQ5A78j/2u+GNORPK0cNEBBtv7QF1a3nY6C7Bq/QeYef0IHiyVZ0NTe05q8WGiw4Fs5HESKq94s/qCmZQJ3yYZT2rIdohFh5O+M7n68tQz6cXFum8wnC7KHrjfQE7u0fANS8bGJi9jvarM/33MQxE0vNhwZJksF+gBIoKb+jLhk+wxscA9hSkwsbJV/FAdgEHy6Wjb9BFsvF5zxPON1JJXRE0dR0i600MMRbi+PTtKWxPkOK+1U088nAqN2gLYd0SJ2yUqsWYew2c8Wc0LHh2HOpX6tMWh350+5HG8uzF84qjud40g55vPwA7h3YhDo+ECKuxKJIQCO/DOnB0pSf98fyADt8L4PfmzZSq+IVWdDfT0e4x0Ke7hg5katFcnSc8LXgpLrZcR1/6f/Ceyc3QNKIQTosc5oDOyfDI5Rd21z+CbuE7UPLzByWVC1H+ks28+KQyhR4sQX1jdzJSZThjKcRi3IUHF1bQx6hZkP/zPcn8/UWp4yXpbMJBlvy5gGoCJ0Fo2mkyOD2Tv7eLoVSsOD5Pr4WU2zfY+YcrXe1YxjJmTWS4dgq8GeVN5x8pwqNjtzF6vi1neIqxET2Gnyfucfp2Efj2dCN5xc+AsAALePjnBn5t7+fmd60U63sFppyMoSg7HzyXKgPCr67iyMKpsFjFj/OdpvLc8vU4/fE5OLjhLgkq5sHE6hd0LFOEM9cacN1WSVA2Po/e9R6YPXMrP7tdg9Pb/sDA6XnYf0wOTmdcoqd/JPn13mmgdseIds+OwN/hF0FQSAGF+/R5wfoY3l63HReUL6beD49pmaMBPFIaj3c7/8Bk/RH8pMUHhV+6w39uH+lpgAM/iIvBP9YS7KSlAz8Pn6Sza/M5YO5r2P5FHx+GroRNN20g6L4sJBR28bH9UaSZpQ65l25wiZc3dX+fgHKfLnPaVTOYZFpHvaaj0W1TCm+3b6F0UQWYlRuHVaNGwc+KBj7dmsVKEvfJd/dbHtJczyvSvKjs901syCUw6ZnNFg37UF7Xi+j7bcwISeTdo4xoNLiydsQQDBxeCqLSqjBtrAIcfDCOdwkfwbUPbtKsS/5gWHcJMgp3sHqcD5r3rAQPKSlYovIc1BZ20GfXLtjxaA6U/FRjYX8XyNOVgWG8ALN8plHbGBX4u6wD4jLFYZHwbLC57AuUm0l3Zsyjrk/3SCnUHV+MiQRbc3kwM3iDvQ7/cNj0PBoqVJJoqh75y1fz0uR74FitAtJlOry70AAsO53woJch7JFawclOC7lbZCpZtgrBuon68OfiHDA2KCbI1ITYCz9xtrAMCGuvhgK5x/At8wmN+5CFH+IeoXP8blhluB/dZihC1ehWXH/XDb6PWounjNdz0aOjsNfQBJ18u3HKBDtME3zMZ+sUYWUJ0ienzaC0t5E+O1aw8McW2r3zHR4w7iHr7ZI4Mtgag85Kg77jOOhd1MP+cavYwUCPXh5eSztCImB73gKIlzCGnNGbabqUAgQJbiGn7mzInqCM1j6WJDYxircXPYb4NZ9xZ8lZipZzJInfmvC1xg4Olt/BAmUvum12Ft1uKVJTdBom2G1n+8uWqLTuDb97MgUcdxxAz7wCMNNNou8hjVj6qg9zfQ9h5q1syHi4F+dlqJPkfgbbyQPkYFHGogJTKHfBVUixzsfwed24VzAWvoa8hpb7A3ii3xi2x0rwgHgOOrW2YmBEEMg8s6dbmRPpoucb0pUsRoGKYmp7A5CiNRdkPPqgVHwefG/qh88HjbBsUiPcv5VCinM3QFzeXg7fIQlz08djtftonBx6BH0ax9DyjdJYv6yQndtF8djKBfj53gHM7pKAkeGd0LIlmn522tPHcFGYdLIQ+G8fXb4qjlsMn+Ke9Mf84Y40jK8v4T9jRlHbPyVSU3gPbrLr6NvgGNjoJ0OOHfrkn7YXNzurQmCBKr4/eIpNK39g+NBqrCs4hlO/70XHtSJUYJ1DTwI0ecuu8TB7uQab//CDOaU/0MWsGf133cTcRHd+H34S1m7N5ScPe2jpJwGQSrTmmv5ICFmdT9Kmzlgf9oilr3+EPwPfIaryDvU6T4YbrmNhgVo7BAhPgtpDqXRj2zt4IRLH350Ow9+XijS8RxgPT13N754rQUZ/MVZv6aHk8gpa2KoJb+xlcfs3MQr2WE/+nxV4jnAlp5hOgAG3Gv5X8YzcRu3Fgq11MHL9OXj0KZLXCatx1b4QPLD8GylriwO3LcRHhTd5cmEERR/P4LS4IbqQMJfThc9wWoIDBu6JRolpMvBATA++S1ujulYVfHSZBValBvjEYBHNCV7FQ91aWHI0jL8pi8Oh1kMkF5pCT/c/ZMXi1XjBPZNztL7xzqmHoLLpHEkLVZJDswasG7gC40ZEgc5qLfBt0ORxLpdArXoIVP3KcKfOQzybZMaLLptAqqIi99psQFvpGqiPkgZHqbGcovQOi38Rm4Y9ZfU1hRRhKwPHTU7T1yu/KbDKmSLjA0mgYx4kBaaTjqAs1244g8Ljj1KhlwjMD9mF1icTKb7sFL74UIHTZPKx1OEipKbs4sezHajl1Gus8RKHoJ6LFCe1ClY6tqN/Yih1pzhAW9gnlkjzpl+eAbCs5SLVL1SEe3J7OXeHGamEx8K3jOUUMeyGXkkhKLa8BTtEbXjurh2gkjUa+LApji4dxjNmNyjPrIi3NKagyPN6LHjdD8FeM/g9iuAjOzloKxMBj4+/WUjzL4yKFIaYsxZoExAKO+APasnkoe3yz8wHBEHBYjsc/HcSLY7uR5X1W0HzeDJV/jvNP3Ud+bBrJpyJfwA7EjXgW2ULLDnjhAntGig6eBlvdlXzutJ6zJpfgFekjtFD+21o3TEOdn/34BSZdnYWfsNz05wx/FoESJTGkpOAL5rHhJJUZDF+OmIKimFPedItczqqfY0PSTZT8AVftneS4/+EhbDH35cUzCJp8YAKjBUwQvmyU6j3yZbTNlmQvetEXla4m8zHSWOzqCAbl2Xy2WBx6L93GY1sduFN4Z+4QDICS1/OBQd7N1Db0IeL0q7Q2ElbYMU2c6irOkkX77ly6sdUtuo6QTraR6BV+RiEvDGC7A2h8NN3kCokteCd2Wy8XjED/pMyw/oAaXpg+pt9tM6T7lhBiJ2mhEEOMZx4aQqcfDhEHZVS5HXdECWEO7i6q5v+haRi+VMBdPFYSw8nDpDdDYDTmhtQ7ZgYRmx9S0+eh9OplI0U/8QWzs8LZNNISTj5JZaNvyuAfvQcXia4lnMOtOLZBSPh5hJtimsIo+RNqSQ43wo6XVZQe9QIKMTfHHrOAKYZJ0D4jXMk35gPsQ72tOrkR/xQe5wizeSh64oRWCyfxt3LKyHFbjeV1tZB5cshNkxRw+KqFxjT/IitBvSx84I5qEim4NIV2TRxjQ8s3E9sdnc2XkxWJIlmA5zvUglnE31Yv2oUaIiPxY+ffrNJz2k+UKdBn+7Hc/bdzzT44y9brK9Dvbv+xIoI2bU6lOYyH7U+ZEOhbRMoq9rizt5yVD8yGz7aV/K6iee5cb8kvBcYgozH/bDviiCfz6qnk3ejsfuUKeekCvOCa4dAufcxx+ycDjc3TOX4f7NZIl4Vyxet4qFFwnjd/hIuXfCMrsgkQtBZdS4WGAU/aS+8L8/GeMX5vDzXik9pjONYDwte77MezsXehSm+++HIEMHP1w5QoH6RHi8NQlXbzdj4azH1bLCEDNlftM6iHqbp7MODyjpQ7HAcV6gJ8bnoHzjqfhD0LjhKcX6R6JmyhAbv/KY+8ef09644WM/Yyo9+rocrLa140EKNmrf/xvY1a0D8kwaWRcTwKR9r2jhFD7IdpdAlywrvvI7nOr1WfHtaFf7bncHzP16CS915dH6zOWfs1YCQ+KNQ+FWZmwqSSCDACuQn98CJ7kR4PiOTRIuR3DousUmkCuTdmoB/bX6xhVgbZYf8Bd+PlbD9/kaSO/MQfvVPpPa10hh5ZzyMeC6McHsOauzyhmdjI3j7xVH0a9wDcv2+hjc46ODeAWVQM9KCT57dBHEteNtSCWJqTEDSxYvNfRywbMQFPHdqK/o0jMF3AppgHH+Ya07HYIDBH1yc48e7XkzjP1Vm9FY5hAYMAzE//hVG39aF0LqvOOR4gZf5DdHTw51kq6IPhtfn81hUhKYrcjDrVxtfzpcCp4a9PLZIkIvPP4Zev1VocX4F3Jz2hguL5sEX2bP0cqQqLNGVh73yS3FzyW3uTt7DdUvj4W76J8z+mE575ijwo6Un+bSvDd2uE4JvXmKQ22IIgnP70H5sPjfO/MP6J0JwWqEKzLTrwEt/rNDdzQC6aCLtlHAndztJ4Af25K0rzNcfSbBh72ZcHBMJakVB/PiQEOxQ2UAnb1qzTe4pSs8ez0LO99m5PgHlw4XIa1ELT30+EVdMMoZlvwA1sIHXrKyHQ6M7oVwwj+72enPCDhH+0ZkLdibl9Oq+OpRkPyXR3gFMinUnFY9p/Gj7Blz/ZAW1TNgDBz+OpDUT5kLPjzHQU/OChLRbIVHKiux2F9NdoWxcPyMbT8nqgWHhNVbLFyD/maogHxOPRicG+VJREE9/LoqTs8/jVNNoVIiUpLS+7zwu0Q0LLBk+Rxvh+48+5CTZRQtixXj6s5t4YIwUpaz8jMLGYyHmYzX22spB2XymLtks+BxXQT0hnmha2MZLlIrgwN9Arks2hP315/hhoC7Upn+C4tFCXLtoCtg9FsGGzWIwfHQx6XW9htj0JTD21ACkDGhCT148FssL8xz/GPo2rRgSv+TRfTDhD5dm0TqrTNA0GIubbkrCq6khJGWSjmEGRfDI7hZWH4nhsVGbofrmV5rsuAomCgrTsQeysD3zHCKfQ98xNlSht4OejJkPeyfHckDPWig7aE0iEvIkqjgT/g1Z45P8Cr555SR4bf0Fna770OCcOU0oWIVy5a2c+mkdSbuZwq2nJ2j2kmSMzv/MS2tO4acZV/DtzMvgdHkxDgWXwtTGVXzYYRKE3MvHveNS4FfFH1ynOpajtt6DOPcJuD8yEDPkdnKUnCCE1OqD75mNoC3YzL8W9uFxMOEZmwYwQjcHJPaWw7FMFxj1pxpXSWlDntwf2lS2lM48LqM/46RoTsJ6em3iQ08ezaAj6zaAmHY4+A4y+NiaQk2yNzrv0MesrXo0XGkJzUsvk/8tL9b+7y3sefWDZJ/pwmXpdPYuuYS/35uxlW4DzJ5vBxN9XsIKu0bMupBFSfPe4JIxSqArZcmNSxxAPmARrJ/zmy7MyKKDLp/QMtcI0j30OXPrJniwfCwsqguF2AXhdF2+kxIWOUCS+GYaknzPHT2mFHDfEpu2P6Hvu6Xgo5Ewa1t5suQWI1p8Aunpivv0KlyW207XgeUFW/RfJw69u+Xhrr0077MIQt3/jOhInj+9yC5DfpiEEWHB3KjQzrOORaHpdgmYsGcW7slfwnl3w9lgKbPKvwyqUrvClife4PuHWdTt/xQLTgD4JC4Dzf8auMheFWu2zkGZ2+lkZnANfI+8gDiBbTBQf4Z1ZUbAwXeT6eduxpuxgZwb5Eg6zhL4Zo8oJFZ94EmrjuLlw9Xgbz0eypfKkvmfw5wUXAsr1YQxdeVsrDJ/yHEjbTHpyBI4GqFKzjLSYOn+GEslXCBC9h8ERtykWXr7yWq7D+eIN/Pi2e6Ur2+MIq91QHx0KI/rbwCzTbI4e91u8h/5F8+PeQcDOhWgW3iKEgtEoXi0AeS8W4I1l9NJ9u1iotZa7kzJoM+HrSAvthx2XNTAD1ftud9jHCQ0R/KD8iP8cL8lyDsOgLC5KFXMrQGHOgtwml/NVjnK8HWbDtS2+bOL702afHoi5hZcwdu+Q2hokQbKvuYw/9AzCH1xEDtnzIClD1awatgE7JSeR5Z5j4n67nCvdRElvE2AgJ9rQObqPDBRQ7h39wJM015NEcEKlBkgSBFy/8hQ0Znc/r6A04/XQlZLJz1bpgd9tRthz8EdZHlMGKSWbuQel8XUbCAL26s1cam/B02IH4lJkgSHNdphm4AADWr2UkGkDk+5WgqlLQIw8/METj5fx6diZXj7GTXI9H7GO4wXwJeFq7HcrIUijeK4L7YdPIKe8r3YG9R+woZtHNWhccEBKtLowYbXDFMyHTBoYgNZ7lACjyxnbv+7H0s7heFFpwmIxX/gms36MKYjGWULvclLQYnlgjy50fcXvTMzhTszRqBguyossLPiBcFVIC72hM83BdIR6TxIfpRHcfFR9DxlC9uMqIITg3KwM7GYgr2LQeJbCiz2VeXjiXl47aIsjkuqoqnF+/DaFUWcdE0Ltu77SWeMJOmRaSqrN9ykY9WXCS0nssuzYR5oksQydoPefF2QDOyERZEjYVCjCGIHD1C77HTo+J3Ehx8SKaabY6JzKY+9Mxvmmn6DkpGNdKs8m27KXeDnbgV8XOAiruubTid6v+KU0aqw6bExNLr/oo9q+8BBLhWmRU/ilQcr2dvrO5eJGMH4DBNwMa3C07HisEHYktr9Cf6LnUW/NLvpe5ItvSmygQeNq0B6zz4UdnaGG8MA7wqEQWeTDFxcZMKnrx3m2i1RUL/NnDVCDkBywRRcIylBI6vFIee5F9SKBYLdvCgyFRTDrxM2cO58dfio08HnJExhcvpeXnvKDNomiOG1I5Px6IsBcFFeSz2pQnSqtpvPj7oN1rPvU/WRG1CwygTk5nniBI8R5KDlS64lpvAiNJvuxs9B5Yz9UBI/gW98yYdVt4zgWpUfmnrcovV/v1L1sy1QeW0eu5+djJNPpPCEsfngd8IbTUeIgv+hpazl1Ey6eZt5MGCAN2na4Yv/nvCbJyk4p/8hzZtxGMoblOGzmRnX2yzkhR/3cdTdOJpb/IgNezNBxjGGHfueYEOtMvgMjQIn9wXQGS2B++48xp31GzggRZMN8lbSzwxdysQrnLM6k6Zf0ISB6Ufw9JGtuDQpn+W6C1hzZja/G+0IM+yEMSN5J1X8m0sSKaaQF2BNwnpWZO5+Ds2tm+GJkRe67Rfia+2adGL/dGoamMtWnYqwXPEn3JixjJaUtYNv80u4/v4TD5x/CjeoBCdgJH/+0Q6/N6tBVOx1VKvVYOn2L+jbUIz6XdK0viQcLq+6QXKfx3JE9hyM9pwElxuugli6HexR3gCnrliS29hNPLxmEQT3qGFcxDdsFPOifuNJ0GERxKtP/IDMwK989X4dztrymR8rnUbXYAc0/nqCm38Gc1bvWKj3Xoxw4Qyez3+GoSm28E2jC08E3wan6ErwHcwm09LD9GtQGPxF7pDWj2Z0Gswi/7fzuXv6Ojy25xM46GqiRGgk56nOBll1QTDXm4JxAp9wo2EkX5J/TTbmF+H2t2/Q1jcK/xbkUsCrPSS/SAiyV03GrtXvqWSjEWyte8nij2aSxfoQTBqdAV2nhLh6xi84O2QK2x94wuEaOTr9LQHuLnvAaTuWcJ7fTHh8Tw4uTH7NUlaL4Rgpw+XKTv6lLAWW+9Jp3LUsnLZPC71uBbMuxWFKQReHDSazTZEwOJXfgv4xfnS9Q528fwqQ3vllGLZxB0gnudKexLGQl3yAB3pnQ0xhCRz3vM1RZsm4s8QLFbS9IXTPRyZre9h7wBOb925BTwcBSJ0VBn1tzyHr8VgurBRlVpTAqRsH2cjJmE+MWE0ykkshfKc8rJnSD7vEVpLbqj2Uuu83dpaWUv6keH5wbCaslx0A6nODKCNh2C0/mf5Z36fm5u+U9vsFbDsykz9e/Q4pR3zx4oTL8MbxHurF6IG+yW4UtG6h2WsCyf7eBvqdo87Ll2mivb08d8jmgKrKVF69QwxaNVfDHaFe2C/mRkoV0zls62+4uk8JM4OtOHPABCfvl8Xe8FGwer4Whcx0hmemdnzu9lN45S1HJ9tukLKlJR3XsOXuDfNZ/sNs2H5zHf81H8SL9cDfo4th25l+FP5QwgbGt3izhAmOOjYZVnXpgHtfKNwdFqEdgdnYLjePhnOzebq2IWzbKYOpJVOZha+jx1cC0XHvYa51CcjcPgx9UhMwUfAIbH39EXOFTqG8wEW+ODmTnPSlQZAUyXh/EJdNTuLOJ5W8IOkJFOYcBpNrz8B3+C2FyqvyNyVNMJuZyW3VRTzU0Ad1U8yxqdyPQk99wut/nsF/n2tBevEcvOcpA31G+2j5jSz2rO7FSwM/YO1XBmkNa9aadh2n7GomFXqGzSO1QO+gHfyy2sGj2ldS6al1+LzzOUnJfaU1Xno4wbUNEsqjyLuMIW/BIfINF+YXxXmYOL8BL9pdhIZ4c/50YphMmr2hdE0r7YkTB9fwEkxzrIIJG9z57rU60LeVIanTxuRR/BpT/irC+4Yi/u0pBL6nFcGtNQL2C86ifYb7UfduCXvuAZgTuQTDVjvzvPWuZNqmDEWNm3m7XAhhgifO8RxNEGZPrstV0X2mEJWpXeaPT+eCeIcuLDcXhMhlwD67nDFmViVW16Thg8sDWGJmxfkb1SHhlQLEfJeAJyrAiStm0JxdF8mnZDPsPe1LEaENeGFFDxqZ1nD9LUW6ZyMJvqFLqFrJFpdv9iSdkvUM6lX4Z1gHNf9Twg6XP7j8Qi6MnjMK6iZr0rrXClS3rov3Nvnh8ExFup/UC2tjkMJG3qApKd9o+kIBSJ+rjac5n7wzpOGHggaZbuykG5Vl/PVvP4e2f6CWvkpO2DQVpPOk4LC1OPtUHIflnqlkKZaMdnpeOOrbMYjOWond/+owOkkDQgZf85ScJTDg00nqASG0UHYlT3yWhaMNlHD2LG/yNB9m32nmIMp7OMhaAkbIvqXBEzMwcelnfP+fEuSMn07i3ys577APrg1VhAUbaul6Thf8qXpId7Y68JjoLSgy3xpa9e7xJV09eL7+F1abTgUNH0kUctlL91Nm4YYmIeYt0RQQNA1uq8+kdNcCcgpZyWscEIaq40Du6FT6HhJOhSLucGDFTrI684fEgpQ44u4TuF0oy7qKI2Bdcw9LGb6j89PfgExTMw31nKGzEwZobIoiDLenQZjyOPAjVVCSfQRBz11x1863cLUmnjvOD9MV4224M/UqGwXdpnEJw7hdi6DtRB0NjIqA8Sfnw7JJBrT1/UXMEBuFTUbB7F+SCK/8N5FumSyI5NhSuq4duRRlYVdEIaQpmEI3WpOs+Qg8PzSNTcscKcJtNOy8Po4tPheRS4cVWhw6wz1Xl/Om1Tdh34F2nHT1DM/90MvfVsrAYUjlog1bYImJDAUY6sHRld/x1wknrqo+xnIt+9FgVyMZZhvA8rQ/dGkpcmTyK3y6fzE9u70JxthIsNPoTOr5exYS7SrY5ZwczPOQg8VtlRRQshu1H82EC+yI+5qT+W1IEC3rauGADklIOD0DDEXbSIJ2UOTF7SBYoMjvV4TxnGg3nvokDU7Lv0SXm+5cs1IdPDY0Qf3UIegpECX3V+94xoV6rL/qgSNLmkDH+T9K3T4ON6/XBmnBVv4+KQe17C6i1f6x5Kz9BeelMi8JkaD3gn34QWgX3IpWhX0vMnDguik8PXiFA8e04QKLSjpcu59br8/AbYmv+EDzcux5IAGKhwLhiG0trhQ/gtf6Q3Hb8EWcLv+UbfLreWzzP5LdswYXnpaF3W0VKHXUFitklfhfQQk/Vc3C8U3D9PSqND46f5it28fg9TfqkJ1VgqFJayjZ/gKf3qRLo6Z4QnjZERy40ATuBxPxYtQOWvNMCU44O6FO7xXw/s8LluRuBSdFgFGR8/hpxXHWepGAVks/4LTNU6Bx1gEe82Uc4a6nVJaQBhV6a/hWxyusHXyCfo8XgYbTNHp2czbkzD6L0zX/oGPfdtxXvBmdLbIg6EYu6dy4QmuODaBT4TLQVTKBRe9f4NvEuVTeJYJ9uhKwMC2DPp4V5xVKX/CMliRlaRxHkX4dWCv0izzu6nP32gd4a4UXvdk1napFz7Bo5hR+PiEHZsn95kH3UbD8YxhXXQ+DffN345MqR5Y6qE9vDwox+rXQyAOmaJvmA+OtlKBEow4PtbXxhpx9oBnVDgcbpNm17TbrGEtAcP8tSC3cTUWZ6nBSXxJFTMfBschCXvg8h16CNjWEjoPM+R2U+2ASluz7RjWaY6F0hg0fORrCsw36ofzQLrDrq4DslllQeTyBbL2MUHdEJ2r6CMLiRwu4pOU2uL+7S/OQ+LhBBz06rci6AbNZJaMYo/yFaJOcIciLnEP1qyEQmVeNO7pvYn34OlxWFcWbhGPpS1EHJVzbyKNmmYFrkCvm7/1JLtf/4rClHrjuf4eGc5KoalQbqWY24yozJ4i9bwpm456x2ZY7MJq3cWDYQpLyToDeUg2+uTaQ90XXo/osFxScIA61GyJIunUjZuQvBI+PyvQrqYh7L2+AGa1RtDmknmxULFihUh9srYvA9Ig4LJJtZJWsYzRytSXmuzvy9PVmsP7OZbwqUIeLOkaAkd9XuCF2iR1dV0NfvzPPmqZAajsqaOE6I1JZGoSh4cfh4j8peDe1EX+qO1CV4Gq+M1kWBDK06G6rP06YuIzmRK7k56ELOWeXESg/vIBf4oxYQciRFmx+jooDL/n2ywb8O/4D66T4w+uoTxyTqgEb2jvJ53Mh8/dV3GJ4hApU0lh840tU8bYi9Cvgd8HvMMpSGX6enQaJ/s2gNf0h665Vp8THDTjCsp0mjxmCfV7v8IFAMLgenw2z7iSA53AtjNDYiZe2rgBDcyu8v6+Dvdct5pS3x2nlb1e6KmoCpxJeYJlRFV3SCGG33/rQELGUZAZnwKewJ9CeqsIPaudg5UpzCL0TSs/XSoGWtjIF3RWDJoXTkDVfDuTGzeJN/5Zg11hzUBxEWDstlN+kPGZ9HIOLdAPBUTqHP230IvHBpRju0w6un7pw1Dh12N4rD3fNbvL0D2u4MaOFbbX+4nHpnTC/pJPl7mvja7+fVPIS4PZHFWh6IkGLlz/CjyPb2DzLBSPjclDqixBz+ALsn7eabpEYLBoZhMXmi2iPkAmMXeHKDtdc8JjmIJyRdYfltxQxYtUaGlSbArN/3SGlJYMoxFJYUkf48dEeHhehwzY/N2CaVCkcEjVCNBGD1OdW3Bg1A0SC5+DqZldK4lYwK3hOY7V3gM2GozRyvRJ1uxnAFP1B8peYCwN3BeDqiWi2Ng/kXS+XgeLYOxz39T1lXqjieYEqIND2j8aOS+B3qWaYqakIj2YOU9thbRJ+/BF2fL8CG2O88OkOaVDyMUEXcT/wN9Chwl0vIEdvPc3pUOI4s152Gt0Bqn6LUHqEDMT0TOZ1Nx5h5IxmfvysFcpzJ9Is7bG0a+oT5BkXMHpxHs18KAbHvrihrvNvmHGrlTUeZsDyG8FsubOc6nwsoCzmNp2LTuS76YqgMqocrg5v4X0qmTS38AbJddvwY85CfdKmarXP1KtsgwnlAnDsy0V4dckBe/fl0fWJZ/l58k98YFgMU6f9AOUTn7nJZgf1XJ4A6oHy5GJQjF0L9tFr5yYIqFWForoboK55BNINZdFG+jkJTdKDlRXlvHv/I0wa/Yy9K06zcakjjDq1n4XLN8C7I51of68SpZQlwTC/F+4/98SYDwKk9teOns2uJu1PJvwgRgIvel2He47rsO2+EkisqqC9PVK889og7Hzzg0KXArzvaEfB/1R547XZ0JwbyJr1ChDyZQ2bvSrgCUYJ/H3tb9zjVsWFzka89kUZblxMoODyAjaK6IBFXBrVJQWiUdQk6hr7Geqct+LL0nxcJi+MV5/oQGj2FbhSOQLMrpRThtw7sAstgtkPgaddX0wvLMw5pS8Rjjl6wmfpC/S1cgLEeWnjivwuWKmpR/vmjsGta5bDLicX3lZ4iSp+daN5gjt5fgW4qVqF4jeMeNauNDT584WbWktIeYoGBOcagmSpKyrOa4MP/SagkzUSt4M6WY+5BPvchqjsWitpSoewnmIobxsIpcSjOvx59BSArAGO1wwA06Rm2DotFGJZgDyiT/Ln159Z5k4QW605iZtaR0Pj+O+UdeUZShx/hy0B/vDDbxDqds3F3a5GVDtimNwOn+TNb2RgfUoET4QF/KztED6O1OTjDzJo1w5lbMslOos3WLVhDuyplIIL59250P4sf8B/8CHaj14fCeLO0+vR9cpCqnWeggd2nSMtnAmuUrEc4rEFkrRl4UP0GFAMbcL1547Afi89qo8J4tMmBdC53QA0zO7AY/tTOAdeg+KyZEhNDSHP8JVw/8RyCJ28FPRqq5mPi4PmgbkY+y0S18ae5y+15zj4xkL+kveWX5sbc88tQ9ZPfgv9JcKQ1lJMfjot2BuQjJceHqXd7ou4Id4HIgee8n67v1A5nEXDMqqQseQ0aYx8zk4JS/hF0VVQ0hbFXPOl1PZ8BD9wXccGgz8g+648FDVq4Ht7S6482AaS1togIlIKUwuL6OCp6+Rt7g0VU6tphK8ObMqXpJtFijQsuY4EQsdB144tbDUphAvK7Eg+qhkWhK/hsway4NJ2C/RSv4J8yicwlPiBJyOasfnrLuoo9KGeyGmgZ5VHiXqaYD23gDYH21GE3goWUkhEqV511nbNwoEgBQ533wAtQlN5zpAmyMf2YbXaQRTOVIGEnGt05fEDuv5UBu/VSdDomhjY0OWMiywVoWurBnfE6mCk9Sws9W0D9Tg5MLv/B0fNVQaXraXspTiES+MVIf+DDe5raqAl0c85JL0LvkjOJ8nRTaR4qYK7d0Zyn643+cYIw2nH++xV+5XKRHZizuIWfP+2ge7ZyUC6sT6ae2hQ3U5djJIVgqitH2Hi9ETq9v2An4alaEzPJNo5cxGtbRjJD23vwPwZ8ugkMgIsJizjyy75dNh4NoxtukSXXRegqkkCSXRk0nnvRr56VQVGbRaEgbzHMJRqBZVTNhLsvY7zZ38gOclZ0IZa2CR6DNBShurOTIDJmz7Cn4ybPM6KaPqUv/RZaQQENwTSvE1xaLN+BqUb5/C6r2YwZ8ZCeBbkAZdtRvJJ4z3k/fci2R+xwi0Rm/jJxEKwt38G1objQDPnIezoXg+3g59zVEkB9g2FwYh7/fywPwda7reBeNA4fqEgC5HDdfiUMrlhfTB7aTyhl45pOM67CeKce7H4UDVsbrRAoUs6EPBSmHIFj+Mir6X070EZ5vSZc0vhdFZaWImlofEgmFgKSaUKYDFxBaVuEOOh1h388sowyh1hxkOllCiSjVP1nfBs0m58qm0OGc+W0MdRy1Fk6hw6ESJAO8EIbD2m8f15mfg9XZrNLzMV2upDceNRUBr5lVz8YzF3QB9Dpqriaf8O6oNcbEvvJwmjThzaLwbn/7vJYy608bzdeSR+9jgq/B1BsY8NSM7wCEnwFMyaJwjDXgIwLOhO8jVHcWfLLY7+sJT8xzVz2NNVcEf2Bz8S1ofC3TbsvJvBrb8FbCUkYaqlEppEpJJa4gbW2SoBunH++LXtG095uh8urRsDPRH9vGR8NI/oX4fTroTQUVURyDnWzPr37GF1sgO1KPjS+VkzYEC6if1/WIBs3mG+J2FBuSmxNMo0imwbG/GGtzyfaC+DE38FoXWeI48ec5FO+Umgb9062BkaRtOzTqLkmxFYduk9ergoUbDITHgjPJue//iK7073466vdXBkVw233pMESywiR9kl6LD+G2QMmUOndBJrQiatVYiFve0j8PYjW1aZspqn7LAF/KkGZ6WkeXM+w5sbG3B5zkF8+d0Yz1zTY1Z8DUnrSnm+5Bx2S36Fu2JOc9ITKUiq3AlWnr18OzEXna5MJPemLp7qncwGqomYrDkLegvkMeuLJPjv/Q5FwxOx49RxjtEIB5/N/rDOZpCbCrX5i604bR6rjEn5ulBVX4sqjn6oK9MEAjWV8OygGT3ffY50ZohQYcAsaluqiSOiBUF5WT3dPNPO6YP++GrsCfYduE7Jyf6YUxiF1xd8h7MfC7Hv0Bi4GreQKjod2bF6Betv2woVduH4I1IOs1+OQaPUxaD1IJPn5xrB/cEO9jh3Gy03n+NJ/2Lg5R51tlobyzfq/Chbrw1WhXyCW/2GUOoXApekWlli4WH8UvsZ1ty7jaP1pblg7RsQqTvJVvNtyCR8BpxbEUmzgh/i26yZbB+6gja+/ELqTytIcZU9pjtbY+zaA6AbOwEqNJ6Cul8lRzldo7g5lpS99BYpFiqg9hd53mX2hAMNf4HMH0WgYk2Yc/Io2cgdgPLFrbDV8TFov38NdTMu85L43TBXdDZaRk2BsitKoP9qCH7L+OH1y/vZtHAjJt8/Rpf7R1JT4Hq+Mv81G3wzAaGWkWjlGIThi07irP0KiKOmQPghI8wBU4x1I1RecIMt/yCsWiPA5T/fQDccJ4OUk3BzWgYsmudCxjobeX1LFNbLpvDUDwhq61exzp9CGtC7AIEXVuLMUdvI4WEOHjOLhc2bftKJtpk4xkcRrC5M40fdE0liyBHEfzrisfO7MPpBDE7NyCWnInW06w7EMQkioF4+D8u+V8Ksru/4sOQftwzuwadnH9JwkxeF/HpC7/0MccdqaUjv0CWPp/rgXpoOlU/KeaDRmNRSB7G4whw892fgJ+e7sMGWAT7Ww9w+Uwy7eoodOB4c04pJrGIbp9uLUs7BW3Tj61mMKROEwUQxbJVbwt1uxTjzwgf89Oo1f5l6iIIPX8GLOoJkX7OMJnmYQMfTRSS+1YYm+77gI4szSb/5KZn2/6SJoe8w4Y4mWUik4lkvE/CIXYCSx1Vo2advVHfZD7+uKKZ1op2YfvsnjWhcA12b6jhspCG482I+L9hK8TEW6N37CgzfOLGhegc1nLoMUmoK+FLXnUJficOoFVJ0IfU5jws4AX/s99Ge5w94rmYKlvhGQOAVddrh9AdK748Dr4BBfl0sj8feHEJlpSIcezgLC5y0IFVoLcyz3w4J126jzW8ZKJsuTg2KolC2yodeHYiHO7tTSde/gM7LGrG8QiG1LpWj996zQaReAGtvfeHTfhGoPhSAW8fvwqqKeBi+rwnr2mRQ8LYxbHooD7ds1cG19z301l3k87uSsVvCBlf7nOI8/obeN0phalotVm9TAJCsBGEtHfpPuAuEXt8lCbjMilWDvF9KA++rDdPGl1PwwWMRkE3bCftFrakg0Qj2xwXADLtent/QwxNXDUN4eDIpZ/dhUqMYxN87R5atp0hsKAIV99ryqtsm7JBux683WWJReQMlStSAxWlTSEh+zsY1E3Dy52w2nOpALjlPeKrlUT6zbxytfvmaky0KMd9IADyEy3jdnTuQ0JLENicbcEhNhuYv/oQxOf28elwT8Ih+vCOqBI84gGyFCtjyz3LetzecT1YqQUJGI0Vf2oXPHk2jYc2FuCh8DIQuW4eLPzXi9PaV1DXej5UNbsKoGXP40pccUHCo5HvOnhyfPQl+hN2lLf39nLlTiz+N7gShvdr8S9wJR2/SoOWfk3HnnS1k+0wfRL/rgPaBegjKVIC/8wGlXm+DpWsGaMy0bPpmt4L+e3GLnJZMhK6fP9F/mx9nvR3Bh0LseG93K6u4/E/cfe6F4PgLAP6OtFC0JGlpL00pkqSsQhoiMipNIyNEomQ2CClCQyWKBiJpICkUKX5EoolIoUjpfM5V/O/iefdcYxvfxVzs+IQzrIpJusoEPoqkss9hadzgPsjKJtG4ddFdDDMxxca+W/B6dS2uvdLMcwzNAfK0of+mAD48N48vXr/EjSpDmLr/NG7zsAZTbRnY/PMbjN5vCSGdKThTUp9Vn6zimz9+0eCZs+gcPhOcCgxQS1eEUicIUYbjFChzUQdDu7t8tvcdB72XwbzjMZC+/hcsjynnN/6WuGLEC9o5WQhELk2gSJVysLEtxwfmI6i67TWlrfsIU64lYPqwBusrOWM9asOypNOodqyWZgWdwsVznmD+JAWOLznOn4S+wcX5J8FHage0uxnBmNV9/Gx9K2Xkt2Hx5Hja8OA9/PuTBbdcvaDtrTX8ejCbmy0YHgX/pFwnPxbXFAXHgpX8LNGRKo16eW3dBfxg95MNrXbwEjVZ+BDhQB46n3DpTkbpk6tgnvhmbnm+FYt9fOiVZirueyYA50OVYMesPKgwlMfBjD88ccMMdjrwjDInAq4cpckmhTpQ9rYZJ8ePhpWuETjrdQbsTxTh5jJz2pPpAnrkwjzGGi/Gl/CBVdU8p0caRN4Ecl1DL0Xe9qDnIjv5gNdcTJUOpbIGAXacE4pmCaNZwtMUzv87SIJHpUHNehoIHDIDh0XvWG+PF0bmatJGiaeQqCwJ5lOk4P76eNiu9Rv75nuhWJMufztRB2KyJWQfk4ydH3pwypkwjkieDg9W70NNFS14/FsBd76S4KQoZUpv/c25rULUkvoT/oiV4d2csXC18AqcmrqPJXQW4JFlQtB5oZVCLLp5TOARPDHTAE7XRMI1uXFgHBDFkfWIorFi4FBvSEVCFZAkZs/+nu9p3+RNpCNdSBJrRkGUXx3vEL0JQfcUcVtDNnsMaIG71yC2P6yEKr3RoB6/H1USRGDWtW5Q/P6BbpvnwInNajgkvolnPXiMB4QIt2VG0TmLH+AVMxb23oyHgRUVIGZ6DP8UttKx748x+cMo+hJhju2jWrnX7zsq/5KD/Lk3UPhvGzq+PcPWvrJ4fPt4vjfflfT/q8ADoveo8tgCnFitC8/DlMBRdpAjVdfwZStd2JtQDBt/LMCz15fw95gayt6QRoceK0H3zyxYVTuHxPZ4gvdtFZATG8VbrJeC27H/GEbuQqGYbvhiALDBTRC8qlT4g2MSrT72AuJ87oJyWjGf+9HNpXVP2dv+PFSvHgU/tCzJyiwKS+pzMONdMWxeEcaznh7F6gonlD+9lUpsRvLNNcrQsDUexPRsOKssClZ2aMBwrTvE9xjAFHsf7BT7TQntJezbpAPPe6fwTO9bNHz9A/0Xk0CG6b9w07dVKCGEJFl1iHiWHyRtN4ZAiRI46HkR1PdvYNMXGby58SfKZraB27IaPKWwF33u3YBkA3koXjQAWy/owhtA2v3BGRu9s1D01l1cYH6ENGfPhhMSVii3WhlyvCyw7eZBmpXXBLvMn4JjaifPkLpNHy6I4ZGJG2nk3ePY4iEHCyoyycHSmQWWT6XhjhgqPL2W59w9jBPzlsEUzASf3e9xyTx1uGJuQyIffcFcQ4e4fD3+CciHd+WCNNCdRP1pLvC6ZS8eMCXYMvI6vP7bzOOMV/A05yGo+ioPMk9tkePyyWaNLY/wfsnFouZw0u8ElqxbRa9fncVbm7fhLj9tWn4plDaNyqfeuoe0d4UWzR8ygsi4cAgujgMLz32gnDgVd6ooo3mtFZtoV/JTEyP+WXGZvp6eBPfEvnBFpATkNOyjKyrPIPbGZ1hutpLm3lBFxZc7KLZKlF/VGMCD49fAYtprsnxQxBtTj6LwGQHeFx+EHyZ+xvNVBXDr0B/8N08OPgmagpz/MGhOVIGIrloQCQkFP4cEGlB3w7GXbNjwkDrqhWjDzcUW6Os9RBN77oJ2+2Te75MDeZ/aYfCEIo9TE6Rn9hfZ96sOtPYI05pwfzr7rApu6RbBCC9VDJvbCyWwjJ6vqSTJ5YNcv8UYXuY04m3Pi9B8Ixu6zadSuKkWPzYJRNvNRjzL8iXtb/3G9nkS8DbYkVVmmLLflm9sb3udQtIvs69rCglUX8dji5/ROd3leOOLKFQItNHewiUkuEoEi7gdzn8+B4YavnD+XhH9kExn/8xLYLuawSx8ExwViWHZ7W/Jwj+bYy/1Q9XzR/B7qBL7PI5i9pTF8O+MAkx6Lg/z133DmYdtUblOAD/fTaKczd5s0z2KM7PaaPziA+AvNxnS1pXzmOZx0FYlTFute/j7ozvIv9LJcG8tzX0gSAmJOnT8uRok2WSQ4Rpxbq//gT4+FqApsho9plhCrvdkLPCo4xkTN6F0rT44ay8lqbciqJD7EmY/8YE/c6RogbIuj102nzrPIicKqPAzJ0kYuBaNzwdL+al4FWVbqaNG7E+yGIvcGfoNt9X40hH9AH5jYA7pl4LB9dpcXtq5nCb9B6Dz8wU+zfkALy+twyVGCaz/fSZoe48GZwZ+5d1FM76PwD77eiqQXQP2P/dwYds1mC2HOOKXBnqf1ILzcVNhk30MJ7/J5K9NifRRupBay7PJ/k0upvzxoOOZ3+C9hAEstPaCg4mDrKTjz/HoCsM3gyHoxFFYFEc0vFaTpKq6sdxaApTfN8PS7BPo7r4S4xZfwzviTRjn2QQpIuKMMXsxVjwWAy7Lw5jjv/h8TTY+WavJD1+9pyFRMdq2dTdoNgfBl//3enIFeoIw1J+Lhesye6hlUwYtGr+aF9xrwaDcdNBSewz2K1xp/GE1mLJDAV5PS+a9t3bAiMnvcffV93hihRqOX76I1q/rxbddx6Cw/zn/MBOC2uDZONR8BS/K3kd1BSKtLw4k/WYVCl2xxtWGaRCZ5A+ZwmqwM/A0WE1toBUDmlCVMhUcRihQw4aLpCMnTLM3q0HxmFFUNaQOfHEmDAVEc1jOKtL2G8Np/vdo3PWZvDArBJfbXiA34Re4JY1hTP8l3jMqC7tuauHKNTdppN9yfqKsQHk/vkGebg/8wEkwQUkCvIN9sXxPIHh97qKiwRUY0H+QuxsugVgG0YbNO9nCcBtnIkPqccJBZwFW6F2J4VGdrNP/ErteHYbfW1Zzz4SvdGP8E/b9JgsJyedR7VQF3b7mz9UWI1EF1tBJvWrelTYfS8JTIbW2D3zmqcH236FsN8aPTNWLOH7qdHp35DoIiS7ixe7PUeZiMbW7/+AHiUb/s/9XfKUKjtrkBH0Vs+BEBnDAZmm41hSDF3+NQZsIVdifJ8ZB2VJQm5nHR6N0+eW1GIp4u47+7qmFb646fHtWATREDWPGTjPul5KDR81FdLVzEp2Ou07CWbk0Y8cKPOfogZYituDbnIvqD6Lx12l9sDLJxjyrjdxsmw8FE6fyoVVNXFp9mK/Sanpo5M3s9IwHhBDEYubxjwcj2ML0C0rkGFLKET3waCnkv7V3+bhFMxxr2sa0dSzkLYlD3/vNYLLSgNYO38WUXg2SGf6PAoPW4rbyAhp1JxSUq0dD09txNPrGZxp84032ByVRxbkHznysBqnvc+HnBx3WOelC4W8FwFcuEAY+3+OJ97rQQ3II1SxrwbJsIVlqG1OFtSMeedUBG69oQEmoB2xZ6ImeSm/JJbwCPZPG4qfI/9hivgHuuNvJCdLiZNytBW9XiPGaexF0/dJceNErS3qTR2IGpnLYxnJ+d3Q//bUV4yWGQuAifIZkTKfju+yF/H3iavys+IKuTlmDh9zKuSijBudVT0ed/ClwQiybNSr1setnA5o+m8Ln540i3CxNj4zP8T7/lTjBPZK01eXg/bVQdLNtBCXx4ySWngIpvdJsdjIE7veJ8XCcBtWdz4KAx2MhZPYHMix9hKvj7yMPZUPG9L3ksdgdZnYcYgcFLfolZ8sTHgqCtKoUjRXroOL+NyBwxRY085LJK34Pa75JxH0LIihxahRWqgBEnHOhuTcrOTHtD5rm/4Hej418XFEBI87+w1cye3FEiz6M+W4AT+2v4kMZGey+r8DiN2VhSdAQr5jlyN8VzOnx50/44OEWypkgC53HP+L4ujv0X40fvE2yhlHa/hBYUc+l6Q+46WgZfT00HWeWycHEmD14PqsYoz6/pDGl8/Gs7yWwgbW4NWYsNR+zgaLYTJi1dAKYeNSAyvIClmk2wIiGlSSg2kk7LpjDMdsKuDkymM/fBlivMR3kvlzCt9eWUmWcNOj4FlK5lBveM9HlTkwmv64RNKW4jGpmjoP3i6PhiON0vno1Hh5YHsbdTnf4x1Z3fqdbh54BapCpaMKrNUwgJdMdzoWPxFHLpeGBXTTJj5tMFuENHH8rEj9puuK3Il9scxIB40QpOGMZDIGeudDlPxmW0B4Oc7GHz1tqYel/T0ArOA9in2vBi7Q4dJk6zIIeYzEjfCFMcF2Bz+85Q/qhefR7lg0H7MjA/WAGJQORpFAxAu3br5DTtAEclnPn2xuEaY67KNp37OfXFmVsMmgCCwvNyXnlaYi/UMWGFxRZttCf/NKqYWtWDbzxuAo2DZqY81IX9oh204Hz57Dt50pyNTpAndb6uC63G0xGDLLCVn92CHfArmhlcLzkQWo+pjxnUw/WLXxGP8ZUg1Z2O4foh6DzsqfYNnkjHLmlD+4OvhT9vY8VdsfQrmMDdHaSCZ7xPwAR7YepxFqOVmWpgq6nJoi4+NHqK6chKNqaDh04SXS2iTbOSMWa2f+4f+lsjAsvob4nk6B6yIc8j4+iR3K34LrNVMi17oEnOpEUY9YLGS6Z1Ju7jF8568A095/4aH8LfzAUovtbi0B7zmx0F9pBv3z8ebn/bBI63kPS6wxAcoofSr/YDVVfrOFhwCK0i8lB6ZO9GDzWFQzOnaGSpGBYGmEGsh+6+NSVSTR435nuvg4huJ4Hk3vCCceI0MonmnxY3wNe9hqDYMslNjxvzIZBrWQjlwpCy+RJUEYCPwtthy1TjKhByp7cxYzgqu0/0KqQQS6Tp0d1rvhN8wyEDjnQt5ZeNLE7iL+2G9GnlfowbucOthlSpK/Tfbm4oIH9SpXRun8Pu2ZOglOnMuhVzwdS32gOfYbrcNSWUxgePQdnG/tj61Njepc6j7J6gqB+ZAJK1B9iizQF8JU+ywfFUuCY/Tbc/K0TKp+ngPMzwh9D6Vjup4J7/ZNBM08TdtxUwx2PjdkhZA/6jXnMNW9247SBbLit/A0vbbGFsF1bSdhhIrxW72Cxl+nY0zMAmaeLMD55O8g4iqLsnxJO7s8lTbdbcK9cEgLr4kBiQB+qMstRojqERqzug+fa7/DbuTYu2WZGMbVqJGMoBbMueOLIi4mkrvKdm40k0Gi+OI4UPsjbbhxFH6sgyngUCef0ZoDqOEkSLnbnHfsvo614Dqp+8oCYXYm8p8yPjdVU4HCeM48DQXhqwChzXYBd41dCyGwpUF68hDZeHU+T1vZQp68NRDzN49nH5OHGHg+y7shHvYSjlKRdTiPTT8CdpofAPo2odPg+Jpdc5cGjE8Go9Q7Na9PGiXqlWBxhTn9n3KEPpQ3oFLiYl4wv4NSksXyzfhqMNw8Fy9PLOLRnCr1I3sI48yq+uP6R7pXawIDzF3If6Ka5imMgXlaKHlsE0uY8c9CzvYH+6S+x0ikL7I59gDh9HxSW+EvZnapgUdZJOzu2wJxVqpAW/g9nxsiRv/wRKKqvBlWlsdS0IIecK0Th6C1zdkw9S6XL1pPa2120WGk/Jh99gS/PVFIl1OPETUFwsVkFJPZqguJVI1puIQZnr9Vj36nLvOJsO8hHlvPgZR0qvGPPWknTYWDXbP6RL05Xzw/Q4uBBFN0SQaNTQ/heQBbLht2FoeRGTDo0Fp7tDmXJuAkcEL4Gtb1m4IhRwXB6UiP8tfMlx8b7oNTzjJSe68GdH0e41SqRfTM2YP3AK1g9N4wLZS5i9sgJsG3RV0zh+TAXpWG9dAXx9w1oHVuKff8OUrPEGp4+ypdPepxEMe9p8DTVAjftNYezDtdhtucvfr59K38aNAPBQi9eeXSIw5/9xbARUbjE2hmyv4yGlggt+q3RSK55xG3bu0gkuQ6ic0NpcXo1164LpsalN0FigjKc/tmCM0NO8oqaI9gj+pmbamfxuPBUvrJ9Le/TM4KQ9lUY4GkELmau9H33WZq5klhXuZJ3FjyBY6YTUarXBVVka2jRuD4+JacFU0f7gGV5Ec9R6AKrLwM8w7eOV+I5VhV14vI8e46dtwKHt4qDcqoeSvXMBacF/vBAejO2X5Rig+4jZHrgMo6Wusoqrpdp4l5JEB2jiwOvB8jqxw4ykU7icSvcecfGB5Qz+wT0zjrNiVk7SahaADb82ksTAr+i0wszFJJ1Z4OQTGq7ZQf3z4mjXXAJL1ipRBVe+rBbRxu687Ug48Jr7J2vzG+kxPlhjw5Xr5uNed0ClB53ENckqcNLJSFcXfML5AfPsYBNOsV5LiD7+kYeiJFD+4iRXBLQQbetLSFRP5g+zy9EMJtGjXU9dNH1DX7+aMwxmADnL98ihzEOsL9LD3aGylJCVyg4bQhlg54O+iljRKt+R4DuUzsI7VeBF+M3cdiL8eBdsRu6it+iz4JxcDdrBo8YM4uXS8yFmOn18GZ1JYg+NuX/PhqAzZjZZP9lEqZPT+XMd5v5XOsd/H7HHyKumOFWxVF4vaIDhlREIPHjXxbcFYbf0vspsusXvTxtilKOSpy8vQI/aTfRsv9EKUdRAva6dGB+Yygm9M+AzIAUetSWTf80x3J23kHs/dYAs33Gs8I/E/jxpxMEDv8HOpMWc3p9IYWdi2f5GQkw8cYRmrKwgE5/iaeeUyLwNLgKe7cM47RpoyBl5AkqDt0HN0864dyzkrjo1iP6ptvKjvXGMHnLQTSYZsXGhqO4d3kWyNx6wMWWF2FHYhR0i7px5ywXdKqSgBET86kt9ihdLmuDZMOFWHbjFc9rs0Uxv8Pw99Q8CE+7A/ckVOC1w2QYPrQP670PcsJZb4pUdmfrr7v44AhjXC3gypfrrVinWB02xBGuruuiu55B8C9bnKavG0HPy+XAZGQ6V8E6vmIniGEgDWds7/FNvSD8lfgaBwrkUCNLGLOHFqCUz0zQqX2MX/1fkVreKNC7kcMGHyNAdXktb5Jfi7W5sXxIqgFGLvmG9p9S6cb1OaCioAaJATH8/Ywe9D2Qw4otv8lYZwq8jxKhKsnLOPaAKA90r0PTemlYsGwd7oz8SNFSL+jUdylW+y0E8cIJXLRYmIw23OebhcKgt10WJverkFuRDO+6ehdFzQzI6FEfHzN+jOk1UmTluBDab6dSwbbREHsVYdz5aIjWP8t3zn3mwAsmPGbJMvTpnAkyusNQU/mSMw5PgTNlyegmEgA9/Aivvt1BMc3H+OFeE3BvOszTxOtB534DKS/UA5fFH+nrsXoYkDeF/OYQevvQh1uPhVGydDCOFTwKOXbC/ENJEVJuB/KTsYGQMzUYNAfNcE2sF+4O2gp1S3/Ahe5s3HDvPFbsVwE17XWkfV0ARJQvU77rexpcFAg5Wb/JXL6dpp9NgJRaOaxJlAKJj4jGj8ZDoV0f24p0s17tdF41+i6eDbsLt8aEMLtY0KDkVJixqg5LH9vh95tx5Df+AAV6xPKZvgfsojyXYh8vBQhCMAgQBj23H1Q81govzm+nveF3CCUvwpkwC6htW4TV9ndxW4EbXVFVBZnf5/idvgg4zp8Pp+fPolCbCXD6fjh7eWTQyVA7+rXNEFZuR9jrnwObm4JgWa0zvN4URiebVnL+1js0ZYk4VRaUsMOqYrYZGAELxBNgUsEbfB75HjQ+NdHsj3d5zZWjZDDhLz8SU0MfkTVcuJLg08a7vCz6FKlLdmOU91s48befJJMDQH/VAnyg0gbrjYbpepoSOH2bSlHNt9F2WJymNuvSf8IScH3JftpgegPf6jymvzM3wob5EqB04xC6T1jLIu7jaOSJPWQuaUEGYyxoX6kCRg9u5ZTS7Rz7ZCxEt3+C9q/NFFKjhxpeNSC+rQbMTp5DwdlbMPqXFzj0OeDO+VPhhOBF1L8cj1mhkRAn4EiOT0NhOPY4j57hSl9c42n5zOmwulIF7C4/5tvSpnhyzgT0yJoEUsUraV+mEvYqP2OtlncUd8mGYkItwG7fMGX82wuGXyK4bkcMZ6+QxP1rN7KR5yCJxO+hXcue0MMV8tByahpvXBPCJzZsw0+dB7EzqJ1rE++C2b2/PCn6NDzacQ8T/8iBlPxJfqJ3gB62tpD/pVQMP1nL+QWGaLjwB37ojIPuz4m8/Z8M5AVtgCypQehLbYZDVoUsWqeDQy6aeP+/h7D13wAlKtuhaPNImF2xgvx3RXLYuZ88vSUL7s70pjGrxUn9sjD89LhBC8ccQP35qqAqfhP9dlliZ4YAiM3y59fuPdQh8YNvlMhwy49tJOt4jjsTTMHMfgWt9D3ODqXhsCBdBWZrBnLhh1vYFhKFUzem4A1fJzDJVIEFG0Lh5YLXvH54Cj/broUK/Rt5o8t4vD33IQj+WQUK595gl4oMNKr9gbsTZSHn3UeY9ucE7A0Oo0sXw3B+41Xq/lCFoxWLcfYEM5ByjuANK4VBafJu/OXsBVWLwumrZBXNj49mO6UgnCLRQeMDp8DVt758XOc5L7voBQlPd1P/l+N02dQND4Z/QrlvH9HZ6QP3aSmAcfEWWpvjwO4uCCXbItHWugl3f01jiWWR/MTlBH785YKPlwrDGr/JcPKZIj5czxwbOp061shjwXhN9BLfxstfDXKd0kLqrpcA4V26VHTNAmzXr8IZF8x4pch9OKAQDZ+6j6LVYCc+CezgKeN1YGHQE4q5f5LEB9/zyN3aWPRpCo1+oseBOt4YXesJ8iU/aZXHdNAcdY9IsAHq1g3SBYF7dFihHppOA6/7sp/j1l7jN3AEb3YArKowAJk4W9obGEhxSxoY5iLE/zLG4ImOEK4lQGonjlN/gSqkbuqiLWJ/6cpVUVbJWc7r8itJeNk/dFecyFOD7Lk38BbYfCWQ96yEjS3FqKHznI/Hz4bvltvIYN0zzD10h+2LSkhn2WnOPCcEuWU2IPYrh81mm3GRlz+9X9oIQfnF8PLSTHadX4rPop9j7EchkGzZC2nla2jEGnWY67Wal2/oxmd+SbC0qx9Ku5aSaqUvfhyrDDK3u2D2vj5yz3hGs7cI8iF/5CHBpXxvnC0NSkxh0ZAKyjwNEJ8ezsUj3XjIPBrCy2+gpNMJ6PtPFaVbV+PSxWK04VMwWh3QhimRGmTxcAVrz5jMfr17OSBAk5Lm6bHaYksWXeCHYcfX0uX1onB62WXORRnu+6NPRjL2OPSpDA0CfHjb93JKwMcgumMXdFrrQMfgd/46P4y6tgOHTfQBd71aDM+Uw4j2CFii34W+dZOpVdcUflrNhxX1EthjHAUPns2nLzJJ2PUvjT3GD1D67O34sNSTCv8AtEc94ybn83hwoAnn/NWiLqv5EPLkAl00NaTVVw0pdMIWrjygAmseGXP2rjd8e0omnGuqhDNFt3A4OovKjPQ4NFkI7CZeR48cE3B5PRopUJgE5m1Fjd5f3NtphtOy9gJ9Po09Wfs4REIK3+yZCDc9t9EZ2XNk8XgUrMl5iZcfH+Up2xIBJw3yTKtoUnLRYM9+K+juOUYe7X2wbZcvXZnQgS8rLbkpVhwVOprgmV8UjYkdDdr28lA0HumVbjoNb/fBWV/sQef9ZQw6fh9mixjC3aonUHTKhXurhaCvtgLsjafBbb8+Oph6C9S8LPCsw1U44nCTpiUfgB1SwyySbAFL7K6gw8lcuqXag6d8rPn4PSO60ajPMp2f8GxQNA9KFeG8eRawLrqa0qLtQbZbFB/8SQZzB6T+yW4otYX46bHPHHZwLq80NYRH04IQawcw8XEWfPS6i5mSsrBE2Aa/RG4A3duf6Ps/a9aaPgpOT3XBubvN4JilHgQsQQ7fNIaWu1+hoIPMKcUusLa9C997m8M+70iuefkdA62n8zJHR4i+Lgn3f2/DybMQ5h1JhumTFeHTZWM4MjuJgyxiMH5dKgyXWmHuaV92RAFyP/uSXYdm0GMTU/L/NRX0Qz0Y5gXwObF7UBKB6Pt0JXiuO0VlNw3B/ekOGgoyhMIkWVAapYo/vxRBqvtOenRpCu3X3cDL9vwgWvUa3aaFkP+IWWCvJAtv3c9yb5I1tIRPAYOzxEPWtmzmfw6fafujrOZ6KOzNAt3j0yF8eTG5LZjLN+Or6JyvKr6YXsZmzy3h/eAusqgrhOgQS7ygYAI2uV+wfHMWq2QcxLNfv5D8v8ksvXAfH/C7znFtgfzh81Z0GdAFw4Ek3lU3ly6kHsO5s8ay2+elJN8xCJVTbOAFj0Ux5zQafK0MoUp7IfjfTZwpWoOuC2/C+u0pvOXPCCrpPU9nDSUheHYG6lWPgr6Fp2iH/zVSn7WVMy0OguxvP66q74W3W0vh+6SH0LS+EJtOqcBQbj9O+LKGzpQzWfxzheutNmS+RRLSdS4BzNxLN598ZNEOY2hskKUJGxfD+bpN5P3Xk9aFWlLF72vQ+J8w21w25kiKoq0dktD0QYXrHNppBt/kiM9CtP+bAez+rAuOM5dw2DgjtL2hT/pzjKFkRSK9mbSda6SqeEisB8uXvULdnDrc5ZOIhf1IuxePR3mNSVC26RNPXV2KJxdMpYiDcSQpp8K+B3qpzEUFSotPUn+FHcwrl4bD2dNYutMGlDJCYJb+KbSp0qRJB+LQcYMUf7k2HZamD8CuYCvwiOjga/KWoJoZxcunHoeQEb9QpcmJXx3NYS0fxjwTZV6+1wSeDD2DLSvCSEMjGIrzZ/OklrsYL3wJJ1nEkuyVcXBrtAV2VU8EFaWPqD1zNddKxuGrcl3+ekES8iRcSMgwA+cUvMJ2xz7692QiLPu7G0Ke3cabM8ogwrOcffv3oPgxT054UUs1/wlComwNPfEcCdClhCctX2HGHyG261zCR/NlWFMxitxiiujIvj9w5ccbMM0SAL2YMVR9biSkKiRywYV06EoRpLnu5yhslwoP8iqoNA4CwxsTYcK9b6CgPYGbKwJQKX0bnZAYRQ/tY0jLqwb0PB1oxn8pOGBnBX81t/A2rWJ4CcKsJ+xHV3rFYfR3Lwq8now1tRPYOyCKE6pmgNeeJ+z//hOfObSMrr7ZTro64ZRXOQfPC/0HnUsF+dD4S7QvQACyH6xE/S2WGNMjBNOGj6P88ywKWbyKVI4tgxPBCyB8cAZ6+xlA1dIU6LiYCr8SRqLvyLUYbNfKH6crUs53KbD60wzbTJqpai6AkuVjuF2hQTnCtzhX2wtGv7yCSVHDfB1vgc6UbB4n3EtWTlZg0BOEv5Yc4wCNExR8dRY37rRgvQ074OgFJ848YoQxp0cDy8yAIyeTYHqkOT708oD6UUrE6kXUsk8PMw/oUcJ2IbB74spp1tPBP/AWnrPcj5Nbn+OIS5rQ8p8hXMg8ShmPZlFrwTuYefs7eNQLwD25ZMh6vA6b3YRIt1kc/l4OhnnH7ODEy90Y3dcH5VFhoH1GBoTWPoIzEAcZeUH89UsxPM89huP2u/BR/W/Y+/gCJfV3cKi7GWw+7U5Cma6gftCZjMT/Y8PsHeChZo6vA0x5wwMpKvpPihY2A3wQPQBnCtSgI3AdFUUvI8GeDr6zqQNfbdhDvT8fslNcLJwCdZC0dMFj2sl8vEkWk4W/08H7HvA7YBfb2Q/zRWsbmDFBFVZ0a4OK6mcQaO3AgtLzMHBMAZdWZJCzkyD3KHuQUZQce066So83iINIz1bsEnIlsfeVPLl5DshoXoOW0aUYHLaH62deg4j8RXjx3CRwshSDt4aT4Pd9ex7lJweXxdUof/FdCI42Aqfsw/RAIwpbzRRgON2Fb9rNYY2gV6RY58vSYcvRVuknXhschz1VOuC4IpHnlRuAUNtmNK9cRdtfO2OrQyY6jLbHTyvzcZ3SBwyQHInVgcN8Z6MR0DVrGvW4l7Z7v+SAr270+dFimvhAkxv6VrGHuiNkO22n/e3jYWL4LewVGkXhUh/YfPQqPl5oxgMDJ+B62Vwozw1hDZmF3K6jAOJCmUC5S3iyuidFbd8NUe0KXHX2J3b5bMHQjrdgK3+Ny/7TAlU9G576ehT+fBPDNdVh+PDgRShfGQD+cjdJ+4gNuo2N54VlglAzbIUFFp14O1wc5P20SFczhgb/vmMftyPw7nMsNZh5oqOwBIQ1/eKAb7IEltOh+IwtiA2K8/hJR3jQllFv3Ax8lGDJFe8V4J2dA/1cmAx/tL7SqE+zYc2YXKhf8A0jI9JwjtMpXikcA6URWhC4QZ7ydzjw1zcdeAz+cJBMI79aI0T/5WiRf+oWjquu50QzCfiQM5+S/46EOgFv2CRxnGY5tPJ67xtwueEq18h60rwAb6guRSjtcweHHw1kedgVzHx1yCRrKnbV1GLKJCkuFRTmosqD8NxLGV4oSfOJB2+woH05LtT5Q/+uG7GShT83F36ihAsGsOdFGOXt1gHx1Sls0fwAnIRKSdhfFscqu/FcHRdueOEI1XsPU3+2J3Y3GUCS9X7YJv+GRmwTBJthXxTfp8S6Ff6w19METZ/NwOfjdEHnihFI/VPCUxTMhi/y0F1hArcE9sHLhmP4tPEE68b1oKrBAN11tYCP9X5QJ19MS31+4NUkXcpob8SCHQVgEmiD3ys1eeGsjxgrawLKmQ9ZRroGFgoUchp0U9WLp9Dpfhcet/Vx1DJFPplaBysqxsJCFWXUyTKE0sGdIFF2g1855qLC4zwK+WkJRb/zgW79waVrhMFq5z5IrfhNh8/P4ecem/FTmgX8WnAY324aAbaV80D5dxmqjTCBO+/WYqb/Ejx4+zU9vL0edr1N5bmSJjjWMxSDP83Ha2rdEFvAcASH+WbBS3yXP4gbLw9hleghyD+eDqezNHlXWRP9iBrNAuqaML5Gm4q0c3H+13iScb+Px5LXstT+a/x+wU74d38IFhr/JI1vBmCWEkO25arwaX4W32/4R4r3A3nggw+sPnGUpG4CaFhnYIGcGLTKjqXYUcpUUX2Q167cwxaiVYy2KnxuxgFI3/ENM6wbsUheFCS/mKK8nTB7pc+C8IotPCN8Dus3NKFk9iKWfvaA367XpdebjCF44UjYHlzP3h/ksOtHOoS8fMfPqgegOW2QvA8OktGXo1zSKwzZk2fR9pp0ML05jmSnq2PgJzt08lvBqpqtVHdFEs+cy8fSqYbQ9WEDvbkdglVKs9lhwyV2fNRCfWcdscW6AKL7PEh9xW74fsEStDIvc861LlRa5YEtJ5x50qF2nFqaT9lHxpF3eiWm5i1jm/sE5QsNOe7CZXQOUeA80TXw6dEe3rzMBmpuHoZXLt5UdEoH3B7rwjGPdJaNlcYVmTPwYOQpVL+Vh7+rk3h+dD4pSE+HbaEueM1cErSidrGb5VY+cuMmuh35B2L2Bhzx/BPln9jGIfpCVPzuHAVqioCX5Sr+8/Ybng24QrOK2iDzmxRM7rqApqsYS5rzKG2RPvT4G4LYyjks9n4RkO1pOOtkii1finDFi11cqjWL8//ugHLLq6h+1QA2T9CDwrxTOPmfEcVNuIPiYMoWqhVw2voRGSamoYreJbLNUodD36fDfq8FHHqqnWZP+0mwNBJLqiwwpeUVmKdmYI1REIRdGQFP29zZcq0iP/L+xK3hR8nvRQwZpCHV/B6LA39PcbfEM/j6VBmORxbi4jAL2mdVxil1jrjCrZOWTwuAmB0iXOkxm9kpgT+sN4cX4T3o9uslVqcNwJVLW9G2MYsPWeSyy48c+s8R0XpNJzaYGUCv0g38vuIJ+LrvwLkfxdhE9CzOkXzEy0rGkq99IdwfpQLLx8mCf8VvXpwtxhuiYvD3jWmYJxfIa9OsaWJQNduftIXG7ck8o3gyKOorkP2TJqRdHWxQ4wUzX9lheoAkG2/LoPBFN+CV2nhc3ycG+S73aMXrQDQp/4I3/GP5z7xAXPOghpNYjS1+bqHa9BSu2iYI7xxDcPLKYLB3NgSrEyU4P02bNAamwJeDTH8WRlJXaxcHZGtC9PxK/m35CC5WqwP4vUHHHlswAzOsL/GippvT+fGKN2CiORrijnryG2EvOC8/CN9lFalNZxEpNS3lWI0X5P30KtU4N5KSpxb0ln/EW180+F60PCVPjKWmPlMe8cCH69IMIN70H4WX/QfusobQMl4Q7K6Zkf7EXIzTqqNJgbN4XiEjrVTFU5Pf4aJdzTw1TwiUn4zlcsMWlMn/hN7+V1mv8SDbPTvE7VkX4U5BCtuqNFJ9qQ5kbXJE5V4zOF+WCo+nx+Hkw14YMd4Ed1VtBPuhk7wpbiSuVTWB8sVWbPBZhXQ19ejaiwMwfr0BHGoMZYdr6jg1TANuTNsHw/YjoCNsF5TfF8Sd6nNo/apMcoy9CgJHajjV0IuHs/3J2quXzoweCZYhRdiXvRW7lxbia/tTPDaqjVMvVvKVLT7Q/dMRcq8/Ja/FkpARWcgqRzbBVMGt+KziO63R/Yxb5l0Al7vxJBYiitbdC2l5tTH8jp1GDv5XSKzvMChPH43zb9tSStl0DjCpxZiqiTRZsZyTHkrDfTElWtIsyjFVShDY8Z7k6i6Q28dYen7iIa47Ic3OM1PxQf1UKLp0Bj7XNtK8DxKUu7IO3qcF0XpUw5iRLoi7H2BXTBu+zRCEgnkCNMF7ASafPIa7TkfBqaDx4HA8FlM2SYLtiV109NUbDFUyg5WdKfBvagvLj5bGUYM17Lb7NZnY/wY6IAKp48M51/IxX6gZC3rPxWBX+WOIkSmAozk7SVk8i8VErGhy4VE+fHaAbBXb+Ny/UVB07R+aNexGPesgyNcF/FSwCIQ+hbN573SW2pZJlid92dfMFHT2TMO8CVbwuEKTxzkcxWrnYY6P8qH3rv18etlC0G5S5rw/siAQrcfxEyQJftpRVqs2D506SF+/ZnBu6Cp8B0Jk73CSPueMgA/hF2j4ujE2y1VBQVc9vWp7yeJGeugYsordz7XAVat/MFJODUrv6+OmVbZofu04mC4twGPvizDhjDqLvvKEuevX496WFJ6y3xjid5iR094B+rVeCiw1i3HrMgMK6z5F6uGTOM59LMl32KBn4CS4U+zJFwWAR+zYCQkHtPmq3HVw9T5LQ+Mc0WxfEgyJ7IPPFirws1mAxn5To8GNfdT6RpNm3TLBBqciChvw5gC5t1gQ/Zs27JKD1XNdIf7IBxwztxM6PQSpNHk/r95dx6tkDoLYxQi8f3kYb3gYQVH+EAo3Ixzu9od59wc5bt9ZevpVF36vNuE9f/Oh7X4JbJw4BaztSimuJResRrVjy31L0HnviPr5O/FR9Uj6HVyN6zssSK1fDb47j+H4XcfozOom9H3hSTuE7HjhvwjeNtodjhypp9Ckh+jrowp725X5VZQe3a3JIO3X4mwafwSutqzA6N4YuCQ2GpzrK3mRuCocForGIHUPuHq7hcUu3mZ9RQnelRwGyV6z6LxuMShVG+P+txbQ9XIxJy+uw2FPM/4uAeylFUHCpYupOEoSque18e3n9dhjNhnObexmqdeu5CDgzCXL2vBPqyq9H+XCezQKcImNN1aWj0G3o1PhxYoBdFewgKfbfsBTv1SWM+xExUkS9HBrLXWc94Mjt4Oh4/NY8NFuoVQXX/xxXZFjBSUwf7sVkeoXaF29jNPbxGnz11+wqG8afJs3CdNWGvI5TXMy/3iMNp8woc+npOHk0DU2kA3GZpUhGjFiBFy0c6YxftvhW6Q1lQV84xVvumifoBU+/HCUnSWM8S7LYWWrBoS41+CbkYv5LDzkqfKZbBB7EWZYXsTETe9x5aRXrNLxlRobJkHp7E00aDAGly8LYEv/EtR4sI19ZWbQyPfv2OOpAlDaYWySngjLRBvpzO81VHR9PjX1iUOZfyukNXdyVMoejOlUYVm7k6x4xQhML2kAS/hif2MevNoiiPdUl9OzzFiCtqVwq12Wu2ruwLsXUjBJ5BbPcbGDRMXFWKEcwfMC2lBbVZracBa4pkegvO066NHUgPTPV6HISQXenWwERePFvDtoFbc7qrHTpjG8YONyUhhzE1ZNFYaepCRomzibHH/Z4GkZJ3KbZ48HW8+SypdquP71HyddMKdTutJwY1o525VcRjpxjqqsnCHPwoBmL4iFoD9vOef0OvwhYY9R2mNALEcYFUYU4uqcO6i//A3FZArCiKBW+FO2lsjNgBRLtqCkjz7Ya4mil6caZjtYYu9Refxx6AR+kjvBncl38NJhEfYx38OuPoIg8mcGBNwI4DeGEvDiuAD8uPCaE561MooW8cLeMHx+PQ3r7o0A964UvK35lQ009FHYpIVvCE6gs7URNLyvAgadr5GvZzR+iDECzfgZ1DA6jRdvBEocOQfHLrtEskUK1LnOgx63FEJj8AvuuqsB843GgrSWIkza2kktTkporN6Ey53OQGXzc1CgEAqplGbnqWqwsqSR8hKmQMmLZZCzOAOnuwdhzwQJWlUtBe3bjpL3RQH+lC8Mo85rUOnIdZzGQBEnXFk8jHgAD6L/NB3akCjKyc2f8Px1BUiRPgsbPs+FhVuM4UPDAdwd/wwEM1bA77IMltN2Zu1rYfh2jzxcmJ5OX8NM4d+tl3Dk0Q42N99KMUdm063Zd/HHE3O+y5NxhfoI+Do2n36HfyPzntn0Q3E0r06NxF/9w3C1RZKn7qxn65A/OC1PAE7m72bpbSfgrvZFlHqgC1cPVZPNz8W4QvYAPQ+ezpE2H2hVuzxYjCdylmtkHwMHtL04B61VB2luswvDFHG+370F9ItSaNMBfVA4NpMvHUgHIZ1m6PvvBSbFNtG242KY5CKHT29644CtBP8Zrw8fUQYuXclHtyU7KW5gIk6yn0x/a0pocPpHthgVBwF9aRx3TQDm5nhR7YRE+LaEUKBNBxu3u1PMagecNNYFg5tk6G2eIl3xNwKT4VEY0XsR9EMZllpYwKb8WHx4J5+6L1uxxs4aZDcB0jcTgd8O6nhadgi/OC3iS0f8IG14EJP8rmD/T13cu1QWvq0dBaAlAjmVX8lL9yYEt2lTwt5cevcoHTIkKlgkimG0rw3e+VKAcNkIVD8WAAwu5bSZtRB/agmqCTRiW6MV28cEgG2KDim0PoekZwzN7VqQm1cFu98uwTTxFI5MOAX85A+Xpi3CoWmzIWt1GSwQGwPBuo/J8looTc+XhHn1fhi45RprOn3DaMkA+rA4Gx+cW8MXA0TBN3Ic/Nx/nMU/rGLrhyY0wUUBt2p/gg3++bjvwCzsqQvC9Y0iMPp2F0fPmMvF11pYNrsJv8o/ocbGs2CwRwjLEhwoLceYfdyEYFdNFamd6aD+F2XceuA5OBXcwPWvvoM2/6YFWu+h36ce7toJQ7HuPojzv4wz1f+SUNMB3OLdiYJbxuLy692cb67JN7ZegqDPklDaVIRaBjr4VvMNRPa9wDZbTdK3u4EyrfOp608DCD9zxa/WKjDvvzoY/a+G2v3KYb1UNCzNFKJTd2JIRksQ1xnvheAP55i3mYC72B/+UlpGJ8OK8fbHGaxyUJ9zA6/hpXEp5PT3KywLr2GjvxqQddQZ7T6MxjXe13mWZA64/Izg+qNunJMnhntrbsLEJ1fIZvc4qCjfydvPhLJn9RTOj1jMbv5iJL+gDwZ+NeDZRxmYfLWYRZ3lYfyRs1Q9VALzU+X4b/dR1LM1BvniMN7/bhEdGUxkF8fr5LRQHN5aveELm6xgz+Q3vOdRNP5VtaXCTkOQ/72BF7x3wq+K40hj8iSwMA/Dd5f8oFh9PZr3+sKFpSa4J7aasnapguXIDqi/ZoRHOsdC+fBmqrl3FqZdFkGFCXNo8r1BdDVT48K3oXBGUwyCtx4kl73TIT37MniiJaqbtXKs2m+2qliCOxV/wJ6Tn3jK+uWwtzYIjbdPhzk1AlzT1gi1zpko2ecN/q9307L4dGh93EpbBi9h1qzRcNhmBDySHIdzD/rh4shTkHTpMRUdOUT987/hrIZ+EI3TYivDV3QraTxMXn6N3bIt0AdkcVfCdv7zleHw/U0wc7k7yZrpUpKNDWsvk4WIiV4spboYVw9G0oUVm0j4pBufDBnDdjaXsXPxI7Bd7MWl7Zawr8wbl7U48YRcVfp34hR8bJDFJzek8eMIOXKwe88KhobkJzISbGbupe9rSmCBpRK2leSh4O5ECn1yG8aqr4HXwTIwRf096SerQkzeH0q5mk+2z1tJMKiRApRnUFm/M2w6sIvXDe2md6q9vGq/PJS/lIbirAa+NPkbBl/Rprcfl3Krz1WaL7ANDTPu8tqEfkw5Zgx1tseg7z93yvwmgWemD/GI/hcwqDebn3qZ4E8PW5RROsR4Wxp+bxqBt6Ke4FtRDVJQPgwP87aT0gNdVo20B6rXJ9tqZXihKgczXg6C7psvFJ76HqvbdMAlWR63jPjFL7yYJ5cfp5sey/H4OwNQaV+Fude3o355LD3JbcE/bs/x69wHXNt9Gx41N2Da/BLWeqcIufs6sSrgODxRnIDZcy7Q6J/FVNZ+iaZUmPLc94N4WU6Ns0EFqsIa6GO7FI8vSMJNSyIxs3sLHdMTZ5NbXmzz8i8WOZTTvjZJGN83ATyEMjg+YQ6JPH2DBxVbQcRWi86kLcFV/WMgWSSBh48oQ/13O9ppPA/vu3hiynl1vLlUh3/lV8Ev6e2gWRaHEbuCKCZaDjIqrkLUhhcwzuYgj1llBsWJ2yjiggGbmB4n5zmC/LXci+5Ea8KKWeG4WVAKAtevAOG6EgrO20Bqx5eT76M55Kp8Adbs9qbIGWLwtBspb7EWxVp78SKVOXCl14T6t+/jaDMd6PA+z0V5ejTppA5c0FeAwt5KjpL8BgYxC+jkie34b8kQVFyWhTVfXPHfjEKs1dGHlY/D4UdSIipvXgt/oRQfLpvPA8nrWWFCHaTsWE3tNi+48K0gyH35wDO/7gB9KRsU2KvKXlnVOCpxJojWGPMxcTl4FXQJ4ncgODZ5U+XxRFCf9whKZjzG5I86tO6SNXpqiJDV82reuaAKW0MEoUb9I60sucOn7M3waYwbBg/2QI6MEW6/fBetE/7QSGGk550joVrJFx9rdNJ4v2isOemJXS+3wrfne+BQaSW2v2vk7eMj+WzVDDixXw11/Sxge+csWG3ays0BYugVPRNEhQtYJt8Toz7L46KxCoBvw/izpCjt6Heh7YLemKAygRrM56P/7ufQ6tOFjs8q4XSUGdRcPEWdq4+SnKMGudr0waMz6igxJ4RSvPpwkexWfvNmEJxHCcBS/WRqT8vCMyFhXKWpwvmmh7Di6g6015LEjxNH0uVIXZIZpw6uIrkUXLwK/F8c58U7blDORWf83GnPfnevU1uKDPjkroHJiSPggeIpmicRzZt+GOC40hxI3huH5u876OBQCr7cVYWzHufhm9XGcPFvLoje3UX3D1fzE531vEWoi8aFZoJluwffCyD0KnvJgqsNYfuXFNIK1oZX4Q7oEXmQXeVKOaL+Lz8/OwyKbdl0zc6MvpdLQsrmBhg74Qk3pN5h/fQJ+DvyMrQ0aPLleUn0UNSDktoHeIzjJCg1rgOrSbP4rOdxCl/SCEm3Eljacgb4Gx4ho1s/gF6VkNsnA2iV7Qcj1Q00Q6yMTxcpwbtaHbp0bwa8ShSBhvnq0LIimC6vF4fM72rYJLiMNnc4c3RBPh8RisJDlS600jWDtT+PY9dzubzSUhFUFOXx1MLrPDLbkMqu/mORjm68FrWAR9vMJIEdE0lTdD88EGZIWPIZIuzHY9GSxRD64S58uKuNPV8Nab+nIqSbnobHX7+gdZQIZK1zg6hdb/nLm0b+KmSD2mJGNFk5EdZE3SO/eOQEx9+cNdcMFNecRgXZzTRdajl8PpUAH+/18MQeY9y8fyoUFe6jtnuS2J8kAcPXP0K/4VJa938EwAcgEAgUANA/EEJZpVIyQjYJ2e2FZCWVrIomSaE0KRqoREoLZRRaKkoKFZWKkp2Si5DRQJLuzU6meafMqCWwEi54eFBnoRcZ/PDDfZaCvGmSGuRnvKJXO7/DUTVRKuhz5ZOVihgdtYKj3p3AiXlBKKn8DOO1hSA9YIDeH3VjSTthFND8AD4Dyixy+xQFjajHBQbHsHj8GQ50EoJ+GQ1OstBnjbOLQGWnJp+uEIY9A3qcu24uTGtbSZqt78BkrjrEBEZz/fQgFuqdAOqT4zgx+COM2RKGuMGIRlzXIcEPObhwghSoP8qgw06TYdzy7+C/VASrd3WThsVjmlLqyvG9VmiQ7Yobc8TA4E8cXnjpABrn/pBmnQdfvyQKoTssyGPvQlq29wUHhR2jxkFx2Of7HtqWDfHdjWPA4eRjbp63glvKYmDtTXWw/R7IoxPj0DxBDoq01ej76yw8L27Gt1aZc9nRKpp+YAD1ytLw76sqChafzZebxIB3WoOO1WNObttHrjJ3+enQUvr45ABUCVnjlZc7sNMhjVJEZsCyo0Uk3SNC5uNucvfL0bh0xxocFhTioFc/uKJVApWzb+PKGC3wePwIWqbM4pZfNVwt9QsU67ag4SJlrtBWJq8le3D752a4njoJdi4R4fj2JqxMqeGl05/xQ37LDSN10C3xGn58PwMfXKuHxQkG8ERaG/rjykAxSR9fHzHlsWkv2bT0G7kfDkFV32G4LVBBMlcnAt3qB6yzhP4HBmjS8B6u3lPDPJcxoCPgRd++j8S/Lx/gmippmLq7AuaopMCqnHyY3F7EiQ0OcH3saDKLsWRf6c1kVnoK7ywgcFyaDuU2Ryl6lgI6JW6kouFhfucZideatVglaTKpaxVxZ582JG5xh18bvlNa2HXe3JXASdKZnGHVibOufOHAf6fpy/dDcIikYWr3Ln4SlkPKaVuwPisNmmMjSEJxED0a5tLK3WVcd3QJ5d3XhbipmSyWNpYFPzWx17Y8TBuOIh0FAS71u40qKzzwzYKFNKxnCE8i3rJ6Vxob/xxHs5TWYv9WI8yo20lZI6RJZMiJXI57kv1vOciHMIjUZQyQD6F0qUzeqTUb5vtcxj9xdazoZQHND0ehgo05mB0Pg9PPWsnlaxvYDZ+l2XXXOXJzOCtOXMZ7hiWg4tdogBxVMGJ/mIty8NrjNrkPJFCc8XPQO6lEiUXiUNrWwbW7oyj9kQysUnTG6aG+pJc5E7wjjXCPzluWyCjgxI92bDd6CsTG7Yb5fToQOTuItJ0bUF9OC99rPYDsmjc478xLTogdwQo7BdlleTmet1WH9J4htJR05Dh/A1qyrQArV1TBHpNyLHTPhf5JzrCs5CH+2GEO3pcF4betA1wd2c2VImdJapYghk0spvW9UmjTK8wj5Y6Cri3CEsUL6HPJDFbc3kMb547iTfZzWflVAuxZlsJ3z3dgcM5d8sbJoNxtyRUh03FQpo6tt+iz08M4mlrRi3K/NuHmxFQMPHIITFYYwYSFs/l3ijjdTdhPS58sY7N7W7jT7D4WRnWxWpQROGWLYrezEQypzmKFXw/RJuESGpYnw6N9a+Fk2VtaOOsafXB8RnJPhyjX0QqEX/+m90PpsPb0Nw69VohJeU9hf/dccggUwCmvLvEFr0+8+50oiBasYUfnXHjmnQE55UtIeH4LemTsg2Tb/ZD+IRbnSN2BegcdiNbN48/OGtwjcAs/1f/DP7+8+K37RH7125RPoS+fmhNJ2jcIqrvXo3JnGn98KET4vQLvjFsDy/5G4+4za7kj5xSp7KxixWxBsN8XAE31aqDhlE4iwrtpjIgTjVsXTBudFcgjbzzqbTuDQe80IczDCU4oO8LxuYawomEnb7POgaQkN/oai+h8So+mdrjzreRpsPFjOyWrSFIt5PBxNARf8Zugl6oNJp6l9D7+BO1ed5BHCU2HtaL+dMxRgFFkM9SO6OZ9zVlwtyYNHxaMgjLjU9i3qRIO2ehAS14Bf7i+iyRFLuIGfS/yL2hE/vwSX41/ijKe4WB/XRbDU81gltlHPBJixtKlx9nOoZx6rP5C3OZLmNu8HzzWnCDniYv4x2mGFVNyWbI6DpdLd6DszQy+K1FALw9s5ve7l1KHRxL87pkA7D8Nzk34yaFXfPjlPS0+7P8cjSqboGJFCi8OO8+xX2+BUUQMHVqjDd0H/+Nr5w7DVdGPVHDQiU7mq1NeuBgre8bgsrYL+HXvHB5nZw4vh0ehnvEhtDz4FUY4ID9bsgw1OseCtO4p2FF+F3VNUsHvjyH0H9wLXn8kYJzoffRrXEPbDB/hN9kMnj1dit1Tz4DW31l89NcIGOotIg8vTapcFMHi3IPlk97RuEf9eOylM1unGvAqx3J8lToOcO4PnNr1GvJazGHszgm4L/0hvwl6xOtrz8O0vZtoe8Ii8JLXADO1pzDqxXMs6rOl7bYdZLwwBGD/CLi4IwJe28aDyNlTsP/beHAwNMVZfqY8JV0Jp5o/QI38VZCRUMiBb5shacAZneYxJ200ht/qjigh/ROMbO7BgrIntPJ1LHC0JJetvw5tk49iY3M6rA6SA90fj6AmbRZuaksjmPKaf02V5ZU79nKP+ltWDJgPFx90cLfhDHhxvJzXRe/CMdMsqMzhBjm/L4F5hudhoWYwm0Y9x7FnDMBUQRouKa7DlWLm0JH4FCfPM+O8xasJhKI5c/snyFH+wKnLFrHPTjM4eaOWWiQn4itROXzbLgLC1apskpIHHdvSeF9rO753tYd9UdIwQvAWegmfp3/JsjhzRS+Xj3zL9j/zaZ7WEVjkok/S8wdpzlQL+PRwPV8YvxGNd9dBZPUxtDbdCoeFfrJbnRjULU3h06JbOGzBKPg2cjcdHtfLwXIusL37CSZqT0T1yDzoP5UDQ/dD4OfQZphgLwhy3q/oza9aNDvzC8oLCvnJuE7uzTuIk/+7gG8XfaVDUxzwwxUL0Ph5kW/MvkSWe5fTi/BpyG3B4H3SEl3CgvHY00+YMSaMXKoFoP+NPEpMMqVjt+XJaN1MeOSXz1tPfcWd1j78NXQhfJy+E0LdVWDl2lG8dNdVLOl5zX/ez4fxD9/ypfpddOfsMb62XBXPyb1CoTWqkN+3Bv+pGKDRw4OUt2Ijtva3Q8zdMWgTb8XB8sfwtoAb5oWPgRWSy/n0vj4Wfu+Acm/i8Om4HKxTWEAvXNZDWqcvR3uNocWO+pB7phQeC6/F7DHzMHrVajwUGQWBS8/hwx911D1PEiYHydKZQiXYbrQKV2Vdh+asVJqtWAlLX6WjXOY8/jNCn7xE/6FmWQJCryL8DvbmRzZzyWjiQeiTFqKY5lj+ct2BL+f5Q+BkgOPizRSbxZDHn/jnYmMcPPocS5pdsD/iLojr+dGP4L1svekT7jpzEwUWG0Ncaj8Nuw/BqAZxGFJsoPuqRuD+L4iMAorQt3sCFCi/R0sxcTh62obbbO/y8sgd/OGgERz9OolTXofCUbXPsK32AS8S/Ut3GtVgQsNifuv8idTetfKcai/WVg2nfeHpJNeZgntGqvBICSEo0NWEo6PDuKctnG/mj8JI8Vz4XlUNrWvG4AgTXVrQo0bw+RAo9MnDuhuFxLeVcIeLNJQ+qaKxr1poXp08jClPw5NnM8ltjijfWTUatpyMo/sFAfDJTgaDYr5wU/Aadm79Q1GLhEF6YjpLe0xgyZOqsOnRFWj7FgiF346S4W0fPDqrip6HxPEr0R2o/6Gflrf5QeVqUVAwauTEXn1IVFXFXzdG0IX0+ex4sB0EW4fZSmUF+X9bRCY+ZlB/8hFt2p4H7XstoaB8NJ5bWU3zitfghD7GQVVHvvm9A2e1SIHv869k9FWGL0w+jHsmKLPybj26M/MtmFy4RKv/C8EnfcVo5TgGBs8HsG7LIH+32kWD0sfgo7kYJY/0wlaOhQvjnGFgphaVDxtC/5UnMCZpJ9TmqWHw3ZHc9O4RPVMkfJNUie4713O+az1Y9yLctG8B99ZuCH5aSzdOJ7KSigZZpXhir1I8F59+xu7dq6ltkw5Eq+Th8dbpnBgghP/dWYwGYufx4YsaPDnTjwZ62qHk1HcYrBeB5x7GnL3rCBfOnUIn5wXQxPOIPmoPcP4hG3zQV8wBh504UEQFuvYkkrxJMe04agm1z2vBaPpYcFz8Ay6kJGF8vyCfKZ/BfTIaMDZCmr62LuaxTw6yh9IZfJaThnqZ83kJbKbOcE+MPvmJpwkTJAzZ8npXNfDTlqHgBS84vPQB2mpJkFN1DB+xjyd06MC+XCEoUxAAttoEKcE24CixHdtXncONZ3bhi4unWWZzM16VccF/++RB6/tJ/Om+Dv8EKPD6ybGkefo3Lp74HTUTm3COoCBF1udDtaA5jPq0DCvH+eJv4xq8UxoFl0oUaKSBF1+uPkd9NwJg4op59ExZEU69b8E5URv5ufdJuqOjT6Ff9tKbrVcx9kI3Hhk9HXwEfWG5mDx09W2hyJWW4G/ohmnfxXFcRTpsTlJA06iJgLte4eVRZjxmSAvy8DmKjPyOBs83E6E6WGh3wVrVGZyQoU6mK3Nwx6i54PlJFH7YxKBp7CxQeKqBF7Z/Bq9rxeRHMyEpGGjV45ss3mVD9XusYE/1I9z9bB/NrxSEIYtruMAjB2xj72KqlBas2GjIM94VoGmkHoQ//wGbJkwHV61bGPc4n8a3rUeZhXpwsXAdHBTOZI3l0ahkIQkBUWM4VKyK0iEWvET+8hVpG1AZugxKw9NxluM+mProOQedRsj41IDJWavpX2gDSRdZAyx9RdkjRuNZ96O8tNubDR/q4aMxCK72Tvz9ijr2KHtTTd4pVtoL2NO3iEe+audFa/Zzf/IS1DlkCGav2snIeAV1GF/EW0GeFDVpJXjvW0jX/CQpdWMhNss9ZMFN5vB8kiqtihjG7wqfQN1sAIV8lKBzox5+XVkOHVfcUVXwGLrI6cK2Kk3IUFCj3PfTKCDgDFdLHwCTgXN49d5ZkMkYi/JLiimkTwlgpAyWpJ4CswM3WMl8Prn2l5LXgguQKLcVXXdJIsbnUNc5Mygcm4t9nuNB/0UV3EhPpYYtK6FxylxSubyNRF/1o6DKRJKpIpAse0KTQvxhva8BP3NzB3elUhC3V4bwNytpX14cqyiGwK0AAXD5OwM2P63B8d8LQXdLMezxv0JC3z/Rlj2KWKM2D2PV/sHW3XIg++0NDaSYQrzYAlLMv0lXRFfQoTHhmGRQRBna7picVsQiMcbgId+I1sqd+L0yEC5mX6fPOS6QNMELNeWs6ZuRChRMOMDxpyUgYIELt0hvpDI5f8otvgYeRV30Z6Mebw3vprBKU8o8F46fppnDTArE4I934UdCCK9v7MfjU3+g2ScZjh1dCB3nPeHsw3kQ/0oEwm/o4p3TwqC/1Q00bFzJ6t9nSDx2gnQ1ctBkRgVYzLCAytGTQavtOeSrx/AI6RAYb6gLKRG9KLT5Dz7f18S1mkBjToqC7ZMZcDpdDjeecsITf1JAK82Jjhjvh//WHuPl6pux+89EthF25aJXFpCw8ws91zRhbZcrnOI4CxSMB2Fh3DKUCc6BOyee8/KmD1T6ZDKYnwqinNIt+M1Pm8Lm2pOidRsdaQmhPd/m0zIPDXh+bxrv+agGVeo3ES510qmmpbykQxhyXK/TtjtvoNbVCC9pRrFEgiVs7hYFkWCELr10+HLcBefLXQENYX1Sy1oNT5dvprCwDWhSHQ6Nm83hqLkTrpY8DM4bd8Ln4H9sle/Ndut+QInVRdgW8gFDnsTw7yE5SCgKJrc1lRSgpYnjTpijVNEEuNHui1r/nmHgfUXa1vwZV7gpQ+uj3fD4sRarjRbhZQ3GLKh1kC0lDKB8thguObcYOw/qkZm3BUTYJsHWef20wDASlxwQR9WVO8DjbBHItNyFJsomM+uZ8KFnPPhEE1oauZPGbjvs9LsDqeHfqNf+JGxJXYCpvqrc7DoTtzpNg/MnNkIQd4Gx1gFMPz6F8z0v4PbcCLiS0sMosBpz942ktokM24MDCEMOQ2q8JGccK8TyNzWcucEDc2dO4Wqtm7CvcBRGz1aEg9sAlA9Wk8b27XzivzVssrgZS02GYaDYkxdPHYEhF36S3t/RMOpeKnmXngKnr6/hWMYznCgkC79X3AH9f6ns7HwJNvw9Qi1dRrDRtBPctv8G9boT8FVxHz2TX8rZ24U5zGuQfNMPUP3G/fy7YDpMKOoHgUwBvNI6DSu9VoHHzB/QmOhJvVkEF3LOQsven/js8GiIuC6AJfs98bXyRly+8zPZCmrRRLMG+pUxF+vUrclL8ycfWWEGR47Fk4BhFW9qPEbCmT8hXXg5mWd4E3jHQlIao9nNYPZsMQAnk2UgsV+ejPJno5TIdFjv/IT/rN8MT7dbYrZyIjx+m8T6nw3gqvtGWic2CgKLoumswia4c5yobMI8NnBL5Ey939hfOB+b49RgyYOvvKjkFe1KW07uwzL4d5QRvbp7k6W2XQIsWUkdfrrgYKgK9w6uIlqUyS9K/qHlOzFuvekLd6+noOiQHyplNmK0WC/sujMdBizj+aazHZtdacUx0xuwMksSbl/y46b3szjcZAeqBumAxwFt2PkoB98POmOF9HcW771Fpg/08VrGODLedJXfvTSm+tkruEtKBR6JVPF7veVUHFaJzWGBIONwhowmvsH6+lG87cR+eLAlgwUPz4Ctm69C7Z3FkHN0JsFLJfTQ/MSZQ92gK/6FjySKkt/lpzTilyFkPJ0N+3Pd8fDTVjDr+YyxyxKwdbwnHzP5jUrvr8KTeYvxipEMrE7NBPnBVXjSQpZSXztT4/h3vHnhCX7fe44uvHXmwPZdVB+iA+4ds6Fu0IrWqMzAszZbofrqVbyq95KuHfsA38aqQJquMLzNlYTihj9UIvkNNlz5Qe61lyH/1CuQzvanq3eD8bF0LLieluQII0VIKjOka28e8ZfQbewcKAWb63/DYFo/lFqdwl7bRn63S4x3FEiCy1FRujbxMl30WEbJJevRO2cEHm2+TIKzrVBv4krMO/UP9FfIQ7n2JdyvXs/H7Hyhbs4aWrC3iRbFKuD2Z7dQyPoXv1aIxIjVBvD7RBeMPHAfLzo2sejf8fy3LRyv6QiiwfsjJPV2Mau5erK4LEFyTSVDzma4ZTuRhZVDcGLiZW5//RzZuxk87Zx55snRuHuMNEzVsMK2Z99IRr4RIuYZQcf9TpxyOZeHb70GeR9HNrw7g1hIGUwcBdkn7x0LXH/LDhWLIGmPM1UiwbeVRJp/bKjTLI+9DQEWDdzhXqlqGLwQT1+0j2DPMx1IaOql9beiUeuDOSdfDcT5Yyxg5/3/cN0RedA2t+Oh74vYfXQRKfg85fADhzCg+DHsKvlChv9EwfWwDp1buRupRQsT9olzodkdtBWw44J7VhRS10mOW9Q4o2QGBGUKwEDzUiz/VwVy99dSq4E5Ld3/H9bd0sKU0G+0M2cewXFx2CrTz8XR/VCp04XRK0dRzvh0KCi5Dx7NXhgjlQtuXSk4u3sMlOuZ4hmjD5ht5Agq6QinO1WoPcyYhpp/s/N7RPVWEcSZmrDdeoBv6QlgZIEdnUn8AvpLGeq2ypNk8DK+kFwPs7w30p4L2vAn/ipt9VeCv1eOU4+ABB1RDucj1V/gc/1k9EBD/tuhzaZzVeDZhess3qSM4vsvcPE7Vdw/5QgFC62FrJTf3CN6mGfYFtL+0inwK3s0yS2vYIXCTVDRGEMGtJhm/fzBR7Ir4Y94EogF7UW5JoC4VlfAsBe0V/YuHvzwDhN+DFCV1RUIOe3CJ6/O5eixQzApUw4iRe6hzZIrYLBjBDqPfki9ctvgg3ESxuQI4/W8QDaxm0yjoqaD7t86fuH7C/XKlKj1nirLWy5Er2tLuSx7LG1YJQ3DYsYUs1YHnJ8thdX6fVgF6lx/8j1EZJ6DkeveYcDuaMr5vZ+/bWjC1nRLcLR+BQ4ls2iGzUxoDi1i/cevQf9hEN566YKTHcvguvdb6BtUgZ8TdMA7KIZrlh7E+hgJnty0CtPzNFh+nTd8tBnCuEXtsOCtCAwMK1JNyQhIOPuYXV8Pws6Yi5wkcpGidm8H+bAyEuMCCPswA6bmVGPg3XJ65/sI93rJ453Ys9yb484HAx3RJL8Cxs3fSSO9VOGCrTDt+BmDh+9qUGKeATp0vwP/Xh/IXXeVjzoGUMUJV1zvZAKjN+ZTyttqTN/9m29LnaaO58vh4rLj+KX8Lb8fNiSzGe40XA0wb5QfX04yBNFXybRaM5B+2/2Ehv8m86YzgfC79wdERpxFyzJt+PTrCRb8sqWKegvInnkZ479Ow4MONjT65T0UWtHOWi+M+GSyLvyLEGONmtlcu/g/evtQFdXfxfKRczc4bXsOVhddhqSWO7B7jyXkBs4B0yUlEPu0gi8Wa7OC3xBKvJBG8zA71jKfil9qRCG7SAYWwQgqvhhMztf0qTG8C8RPdoPziYPwRkAUxCbup5A0gjeXzSE+fwFsPaCK53UNySA+AJbOD+Q/4gfo58cqToxTpJoHnbikRgEaZgaweKI0bLI6wOwlyHGVPuRSsRIuPR8G74nnWEB0BTzwFYQvwi6oozoKlh4azUnX3LjvVD5c+D2V23tK+VzpXHKSSsd/53Tg68FWVolcwFEyuex6MIuF901C4XmVJC0/g5rHnMbagwGsfGUypHmIQ7qFDXg/Vqax5ZNxW2sDrXx9lTMLf6HjezFQ9BHk3eljoU74JhSfOc+rb11ksxo5dLt/A073qOJWuySC5wfwUt8tSgkVA6U5jWR5yIzPRt5jAVF10J2ugNd648hd2RKt+2tJ+bgG/tOzgIQn7dB2/gZE6JqixfXLeJo30GV1b47aeZ+uTNkBF83iSat1GsigMe3f2oRnYkrwhed+bjk5iVpEjPmVlSfO1D7Dz2sqQC5LHPbM9yLN/m46k3GNXgnE4rXkv7zceiyt2jaGZr3WxqNpaXiLLMHTYxrJLorA8yFl1CK3DaYZ21OpbC4pxnRQ4edGsPUYj4otonD/3WW+4t4H+o3H2V+PMUwlgT/9p4rdVseBXv+ke2CFC2ZJwIbYepLYIYAg0UxX707inf4ncXNELu0eHYyGF0eAcvl3jvQYA2zdx+c0rLFa8S7G9pyB7ITpZHlsJjinqOKcO9/pxZIwWjhlAuweWUxje3RQ+1ArztMZQzL3EjlxtxGX3lrMcVk5uNloL2b8lYc+6ziclKYFaTWRtNh1DN0vrgONxe40768hxaVnQZlePs6fJANCigVweYQV3PlPAguf6UJFYBYWa34By2+tvPVjHttX+9JA1zToO3gOkp8nQvm43fTkSCgM+9vz/kc3uNhWi+9/6WDpgij6bWkETbfyuPJSGGofUYeyqF+cvHgLPHmZzVlFd1HxtCj9V7ADlKxl4eNeK1h3cjTmqnZQa9Fs7hIqoZ0/T7LsAjc+Ov8/2ioUSGHBkmAmacdvOA4D5ebCQmcnSE6qJFo8F+MOtrHWfnukiSGwyV4eXg0lwFr98+ikZEnOmApLyISid+2A4Il3qXfLe1xqkMHTXoqDSeJ4DpO4haEx4eyuvRDWrJpEdQUGfOZNDN89fIl3TejHG4ojIGSMJHumGsO/rJ84e70DqNc6YL/kAJcOSfHa2Udxj+Ua2tBuBPqL2mB4/C1cUyOPDjP2caTYMJmv9sX8e/dg+f0MmpVIvGfWKPByqEW7mWv5w81QSGt+RzGVs0D/sjvsEAZ8seQhv9vVyUbWEiByew7GzL3HLxPladW+OLg27zPkvtkDkdUhcI8v84uaAbxjoQir47aw5vYYviu1kB++IFLeuY0liizQZVc2H46fCTcP/MM7seLQJbiX/rMzpQM9f2DCvaMw3SyZh2tGss2U3WhrfJtaLXqgYrUgeJSu4o6Yp9T0NJZLlGeSjaod/QmIpohzi9hvzV4eWbWMp9gLw7t58XBo7HS6/ykN8hsYj+ZIUG2oD8WrPEO1w1Mw7IQGNvYawNeP22H2HkFYdi0LY/Wtcb3ZSMo/vhqDSv5Rm1scTY0qxbGf5UD8gCuvOGkGe5cAClbOxhuTfsKqMGXeUtVCR5augYjE37xjxCiQiFWBFo08uJPLuOCQP552XsnX/ihQhN1serE8A3vKroO7liwklZbytsnSGLENYU5nH+2xWw9RNpn88e03VnyiDi85BqrvjIfn6T8hP3EpXjFQh8EHEXjbJAIHgm9xYKIp/lraTqNe/OYbknLg21FNJ2NuktefDfAk8wZ5rwllp1vZtGWRC25UfwovDs6ht0kqkB7sjpzzl9XmKvODb73wwWs9H7BoYCWZp6jYpM8Kh0bBKJaBy90ZXPZBCw0a9sMZXyEYV5EFWyWX4RThY7BV4gftvroZvluOB5cQWb705ggXvNmJdt4tLHBnP+n1N3C0bgfJhnShpNc1cF+sB2bJq6Bj6iLobujAhG45Wu/qgLmvlGie/z6obbaiP8Od5GE2BfaH95KA4Vu2kqvnRxtEYY9TNie1AErctuPl+2+Tr2gCKX0bD1PdL7PkcuBb/W8gocaZPrYXk8iuXlz2RQvlOs9zZq0A+F5XhSflBiwm2wRFBvHk9NgPslr3omfdPdBV1cYAo2l0TdgMvdVmgKFiIX6Yk4rx/6JgQakjn1boAaY9KP89gOb7BvBkMz0u/qgAh0/LQNoHN15QU0n+9Z08sd4R80ZfYd+jfeD2JQm09hyAJBdlSLKyZfvETzy5uIIchPbyI4c/vO7ZHBA3s2FVaYKJ4bpwQ0MY3pzJ5gTBHlxQ1AXjVmfDhfpMtH2zEsdaXyWjrw8o/Wk4kdcEwDchrKaihKKz7bGrcSS0xFwAo6cv6ciudFJvKyff2m8sFCcL6mp9eO+vDHvLiuCOt/voqJowxOv6gtozCcjLCuB6/wWQ0yYOuiuq4ME+Pfrct5133YlGIav7HDHZgPTaJFD97Bnwtynj656isNewnG40OEN4iBwECD8iqwILln13A5uHGjDqkzrN3XWRf/kLwgpZQXZauApv/dVF72QLXOh0i6e7fQSD5jTId/0LfxsBGkMkYIHvVxon/xgarPMoWlsOhvpDuT40CFV8NtOuHy7w2/ILGppOBLhdg/MfaNEP/UWgOT+HJzsK4nP/a1D+2QwX3nxDY+KtcLOaIJwevYM//l7DU+y3YFv0c/5w7hmrHoqnxfvScG1SEa2u/QTdatKwpVSIx7beYnWfA9ym8BAUHwqgwy6AawfLyXZvL/iH/oPZw1KgEr8Ol28vwAP5nSx2/zHyoVp2PvuI7P8qcNO9s+Dg9RBlz8wAoSWd+H5dHO5134QN9X/o6Fo7+Pw6DtVnrWX39iIQaBWnVwHaYPjrJ3smt0Cb8EVOzzzOZybWgNyIKXgq9h6eil7G0UZ9+G62LJQeOIp5qbtgx8hpINYchls715D52+kQPOEirqz0w8CaSfglzwoGMyei5pNx5Lo6E7R7npD6mABI4Tk8xXQxmOu6s9ZscZ68Qhtq3s6jusdRjCemomP6Z6rJymKbOfYc3LUS8ga3EM2PBQuYBiv/iNKtnmH4z9ccf5prctqyBaCVWgZXjd3gz14ZulE8kgPbReC/tfm4RXsC2BSMx3NlgxCZtpDmfxrAlofzsLnaDpTjC1DSXhvun3TF9Zmp6LWtDrrEkeuv3qb018EcuteNWSaHS5oP4oR8Uyjqq6JSB3X822CJtXckyDbgOjv1jaAJo2vR02IfDXufI9+NajD3qSt9GDcEn++YUuusieD/qA/UJi0E9Grku7HvoEXVnWYPTwLVLSPxwOivpEeapCJWCTqmn2hNkSmcqZmAJnKLeV3MbpzrbQXxd/QhKKyepcZ2wpPjlSRqVkIzz0ej2qqtkCQWjK8jouCehRVMPjea55ZL806VFFAbO4natyznYpX5/PbAHErpqeSIbGk8OmgFuUuXYPV9R2gO/4are7twuPATCzZZQeRWV/zs0k4+N5to1AtB8ND3ht8ql1m3qgvrT2XR7sX/UZ3NbfrdGAUWj8RwyRMTiLo9BlJa5lNw5wLcW+DNWw0tqXWbHFqFpNP9/H0wtFoVCw4fQj6gA+WLPtIF22z4FikPu2XdcVg+ghe6T2SZq49J0VsVZwsX8RRlAVgYNBNkXq6h3HWmPKJkN5+uBHbdFMCyieIsqjmJz8V1wkC6IbSu7MJvX9eyrcRjkM3Wgqh15TAzNB+k3r4ixUO25G9DmOgrBv27tSi18SnN0VZmjdH3IcK3G0csnc0/DHOpKiwOcpueQZCfLqhYpXNxXSH0qo2lR24VnDH7GK99a0DLgybg/EExuu45mWqyTGF03Fp+PXMqtF1dwrOXKdPlrAoWODsfDA9NJi9IgfHq90FQnGFN6CUqPikEm55fojdrF0PBql8kdbedz6/exF5Bw5TipAt3zosBV/nRhXYnfL11Oj1+0oQxL9Xp7Lk2fvBsC/8sUYAN0ltJsMkUfMtvYIKnAH+kHBhcXIuDIyQwNuk0XriaA1liS2jRkTV4rnsyXExYD84+2qSels23FmbiV1/EsBs/QC/CAWYFmNBQtSkKnBYFc8fJ1Pd1Pu7U0odfpbOh1Xchz9/1gR+1fubNt64TGcymSAt5UB07l2WG1uIOtzoy3idGyf5f6OTwbzIYc5Dblyvg6UWDJJCjAbEDHjwo/gcaVqqiMbpw7LXxIHBNksPmTUSFK7P5UtA1EkhSAonEIxillo/DG/OhayCU1kimspnvDXxX6M3TpKqxZftHfGegCdef2rP5f7upbnAmzc9/hR8e1ECGcgL097jxdKdBsDYLw0dOilC425JRXpzmOLpAaG8JB0lfhIyS+7z9si6Z//PEPXuc+fBUA1iQNBZL1l2Ex5r3SOhtDb/QOQsGJd2gMfsQvpm3Dt6IucEJNQ3AKVG8PvYdnFfrgkCB8QD7b/KoNSewqngZLizq5+InkZBzWwFkyl/RhehF9FVnBe8WTMKSSXm8/KYT35VK5X+26Ww4VQnOfEDQaThFjiJlmBmxn37LSLPkuQNommvIt9YVQmWGEH6/Eg4ewsowd4MpDN3qwfEHZPiDViI5mZ7Bl6mb+FOPCE/tQNJNUAJ6LAFmMq4UNOkFWkRtg5fTCrCk+Dbc6KkD+SvFvNxSEi/P0eSHW0RBVO0tdB3OYYmNQvRP7wGvebSVhid6cID9bnbMTKKBkigqqhQHq5kC8NvnOLjPiEVV7XB2WP0Ptoa28sfkQ6Apmwaf9p3Av8GKEPVYB2aGOqC2WQRfWW3Nk3wYD+zZyq9Nz9IUakDzJhva2KkBAena8Fx2LH24W0m/fIW4/vJmWmgYybln9NjsSBV6nrKDp0OKsHhIjcd+V0bHrZk40y8dtPYdp73JvaA434eFpY2pw6CKtLuVQGmwBNIOjWfHZEG4o+fNM69ncXB3MWUfDcKIuRd4W64dtqgIw3KpMPiyKQuiH0diXXQlO1rIUqyvJr5Sd4OLR3Uw9uV82Cs7HqS6EO1a9/PaRffY8l0i/zlfCgubH8LPzy3ghhPwv2Qb3pemBDWFPqzdXoYH/uVR8J4RJHJ0J6d9zuUShVbu3mdK674cgk2XZOC94ysMcFChz+uiYZuPGN1+UsULdB5D7PZCbrwYC7lnM2BgshEYbJaHO/7n+YThTTCPPks5fQ2Y/foxVUkuw6V278nhUAENjDYA3+YneEhVCuw9HpNOfBS2NGjx1m+DENZ3AlsCykm3/zBt3jEZ9h7sQefBHG50zgf1sgLKFNOHpQUr6MStWM73K8c9MpXg3wRwun4JZ9yaDDrmZegekQDJD27SvMwUuJHmA9oZ6VRrtIV9QRsmqjmQju4laIz9Qus2HcBdQbs4Zu5o6n00l5WOybLkaWkqWyoH5frqnDuwgD2td6NDkjaekh0JtpvO4+B1T/S+LwATyuOhS1MS/D2WwXLxKD5s6gYR9fsw7gTiT+FE/NirAaquj5lLTelSiAQIHpkHvRU9+LzRDRO7fGjN10u8s/obzSxWJ62zYpzx9jRad+mA7M/ZbPjPgmInSUDKlUL41iKODw1fQU6cF8YnIoaLe5JPsCxoqS3Bo40O7DZkxwWDURj6ZwscM33KzRWqfKlBAIX8cmht2hhQmFSNneXreIFlHM6o3APOQVvhTsI/VD8YBIc3bKPXPzaRnOpoqJ3iynXjDrJ4VSBGzBWg9VUSlF0iwdp3UiGks4IDJk1CE0WC6f4p3G6sxLMnJoOcyjHuG7wP7hoNMO+KBKX9XYF/Jr7lCFuE6V8u4Jq9jfhpcA18K91JDbn36G6VHzzrfU9DOgtYWusbi1gog+z4ID54dhIVvdxJku/O0yeFy6hk/IRDa0rZI0saK9Zo0+oaJXDZOpa6Rp8D5SMHQDD8EktTPy9uGEM5pi7QFDoKSmN/8FQpWfj0wwr8X5wC1nwC+vMT4WLtDnpXUUaOV3qoDeP5fc1eXCAlAjG1v7BVyIU1Gp5B3+u/FDD6Pd7MrKOXWc/xz493ML86FIw2acMB22gMt/0KBww/klSdPzrcr4L+C/9QWWckjRNcTqVCW2HASAneBT7FjAuteN7Hn8e0r8DOhXv4lNBxnO4czl/uDeC9p8OorKcHJ0dW4WGhIRpcXkNFUSk0+sY9vi15FOvKVdn4+g04LBcPcVMMYTg9AQ32a1BgRBE/3taCTkXacKNXBiPbE2jDTeYdt2rJ670SnH3pCjdVH2Gk3g1UMP/DdkuugMn8sbTr0Ub4pPiS847JUoCEIqR+YTZ9mYSay+SA03xwffxUnFPzCwYma/JZiW8sbGrOo9MRyo3EMe6IIWfGhUDrtWC6/ziSepTtcE5MAIbN70LlI1Mo1tQc+o6EY2pBF5tfYIrqOkFeFWUIB/aDfqsU188MJ31XOQwV0IP5r8XhpXkTLrW1o+BLpfBBvggobg/pmHlDYo8673+gRp0x40G33waWWiA2S5ryop3pZFm8GiwC1rGrxHkck3aGVOQF+baACTwem4oTtTzIdPNSmpWhS/s79tEL+11YNniIY/48h+SBfdgyTgvURJ/yPFNJiFzaCK9103Gy0l00XaOOi/2k+YHHR45uFMGbq60g+doUDPZt48U/jMk5tITzL/thjJEC3r88g73DMsn03mWy/KoAedfOUr6bIEkcnsw3oqPQ+epNNA/4jj72czg55QV4p5dh8jFT6NjmD29S2+DCP+JkGRuue7gf5zsooJUF0zu1aOi3PoMxPWPBobAbunTsYcHnINpWVU0iFqporyMEkpZdLK7mA+f6pFh+rjwM1FtQ9U4xfvVtP09tqOfbyVG8ruw3VCnZs17CIdh1swGmbhGC8qjNrGg6Anr7nmHAmAr+c3spjfHTgQvnq2G9uR62lEWg/G4l8DtdChbhL3hzTAf5Ddbx+pRiUnleCU3fY8n7ujyA3GYsXAsQ8KWJPrXEY+eVTWjGm/CEuiuVfMrBihMWtGPdBBKStsXse6NglZU06uqt4gUnevlZdTY9kPXC0NYrdOJXAWYPRaCmkAiv/W4Kwk+14NDthyisF0YnK8fDlRX5OCb8Mu88PkxZDZu5eF421mVqQdDlT2jXsBRdLCdioHISCs9cgUlW3/i4nwGfVnHGbElFcFplCuP/S+X5G4eoW2QxuGTeY8M1Uyn+3y2I+LwUxylupPcGnhT5SQouTJuByctv4V23Z9Ra0QQGxmZQJTCGs+f0U9MPZc7y7Aa9W0bQ4fecavZI07iLiahmIsMbGhVAyGA0J64LwqpVc+HatAJemS8K6gXl9MZVn3MOqZLnKht4mmwAeVOW8Kn1vdCR7YORMq7kcmo0LLG8zUs2mNO0TE/KvzAL7A6VYNWcN+jasA0Fjw1R8lVrvnFeHrw17HGEVRsqNN2jJq/LcO/yDzQIaYUjZ/bSiFHy4GK1CtwDZcAtfSXWR9/iA0qZ+PmsB4S6KKFSXg1mJe6F9KTXYDNqB3Znm4PXjJHotkaLztgqQMIbFx5VI0bF58aQ7ngvrjZL4HsPZkJaxVRQvBaKmw7PgfOpL8G2SJ9nWPyjj/3tdMq1AZpmTsPEy3dheFAE9gT/BYGx0fRrmHHFOxncd2YTThJP4tL/TlP93XsknZbKTeVaMFY0BIWz7nPMInsSu7GB/fVr4OX1JTxt7xOc3SEOnQYq7Ar6sNxuEc9VUyThgVIK8N5AMR3leHOLAxtZLIZXvz6w/X+5uHWVGCgOG3GGxk2ebpGFXTHd/CnxNYq/2ccD5r/hS/I/bL93FDUCpGGN7DVwLlGjxf6H8dTVTTiNia7WueOP+nr81GnDCxt/wBM9ZZjgaIfJhcdRZvEzNvzZRh9frAOFl4FktaUDLf5loevrVBSdKgj5HaNwWeY89px0kZRfxLGcUh3XkiO1ty6CmmpndppxGDbqjYJnrQP0OfAKeoXLg5HJAA0M6HBVYT373D4OCfdrMHcoE/R3jIRupQt0XbWI9i56gY92OGLr7+2wIM6a7M/9gmktN/FRrh9MOKUHPXqP8MYqFT4Zs5VkY7bAkHcDKb+2gh0ZS0Du5zDoO+nj/T4t8M9/j81pa/jnvKvkvCmTct39UeazC3bOd+fkgXxUuP0ad02bDLOq76P9eymKrn9CxWFOtKHaAleukyUXUS0ek5UCT7b64vXkUTBVNZI3jL2OQyYLUVW6gXNnH4Glww5Y+vknpowIxfxfi7i/RxCETjmw3wNXMHexJ79XohDyXza6nTGH5qwTLNmSgl+s49Bn8QxQSNWGXREBrBvwneadrUH1lFZWVHKBuSF+MFkjigyVL4PnZXnoNHyNf9cJQdNNcTqn/B+ZfCmFL9lEOxxyQFKoGIrMOjCnUAOeXi2DtcELaVPrLd571Rq6yrbQx4o8+DxBlvqnDHLh+B7w61WETWPycNqbGLw4IZL3P1lFqn8n04qW7RgcIU22hx4CpZ6FcBstCLQtp5e6S3jF5y84LycTbsXtIvm1S0htVAQsb/1Iyc874UDKZCjJWY5q5qaU+9UOhq4s4vqv4yhsSzA0Kf/HVW+bUfx3A6xxHwGd/QvR5q4mOH3uJr2OgzxbpQBK5/pSwK7bJGhynzVra6h9gyY03fwDOYlLIbY2GT0f7sOn01rAz/gnXHx4kbo6quBkQTCO3ycLX7LNsV7uBAeskKHNuJpWP14CqQsfUHavCnaVfeXaRjNy9psIhR/baMnF63zkfDrInPQHq/4eKs6P4cUKd+hex3by9xwg5f0KECe0EOPn2NOetjdwiMRxcLIaiahGw/6ENyTwyx18RqbT3ZEAQtMGofuxBdn4nMRRltXUXKgITW5aaHslGXY42fMnhzMY2iILujuX8YsXW9hqdA14DCvhL6cp9GXkFHYp14GW71v5qF8kZOoS1B4JxVmmk9FTsJ+yN9ujpYYYFlxWwpVSWnR+sRRfiu4hj9Pj4fElW1qtsQnsfxxj+xQTGlp2jk9q+6NcSAkv32bCYNCEtzulYdb3RBqVIsFZ6upUZ6+BmlHLqKTsPH0u2EoWEbbU3mhEis+1YCCwGG2+z8Xgsc5w7WYDNT/+xXJX0xHG+bH1wUA+ojsbj4yVhZAdAbhDTx26139EjzXDPKx/EacteIwHPP+DCaMiKUnSixuPasP72nsoGO9Dt8p7WdxtH9hMekCx1UO85stOHul5k0dvEOfweEmoasjjxOxxoJtljlHZ7tgeeojrZ4/GT+tvs7dQHZ9+YwfzTWRhua8Uyut8Jzwpx2/lg0nMyobb5qyAQ/d9adqTn7zSP4zK3XTh35cYmPDoLbsMBfAMlS+waNQSrD8ylqe+XkXBZ4DeTRKi00MA1gkPWcSzADTt7NHv22f6aT2IAe8MSGCqEyj6ylKnXBBcAVEwfqIM1cXtPHGkP/xKiuPUpkBw+XWNbfsu46OEZPjg9hyjdMXgkGwQziyTBu2OxRw6vYaTjKTxq4Y6CH6LxbJPLnzj9iX43CkAQ8e8aMIlU3yodJ1TdBeD5qFrnHbWAVfsqEFL1QIa/7eTDRrU4aPfQtz4Zi4G3z3BhbO20oWXj+mrVTlduS4KE7bb0eu/+8ngtCIsv6RBXk9a0btYDmdkPMXBinXUPDcJW67/hBZhIRqRosHPj06CnRkD9Nm+DjwSZsCVm/l8fm8edbd/wGFHF57neJGOuU2j5wpjQe8JUOQua/oVYgGVflLcFi1FIYU7oXTjEZo+fx3JvSuC6KJJILT8OLSWqaCSjTE0L22k1NyrjMXbuWaXFO85NIIWNQIePTYJRCb9QZRXwlDFQhqvXUVfYSl6Xi3EF5s2Q7jsMzbSSoYtGaNh9wYnFp9yErjmGbysq8Xszzbw7O0cds3NZB9+RvlZQfzltxH8LRfkaPs07vvdRt+i74BmSRtl9WyHN3O1eJVuGzfG14OWiiV8nBqET+SEKEeomP9WhlPFidGoZL2Z0jEQekLOo9a6CLwpbQhndEay20lHbP+uCu8+jOfWho3U2fGYpD81YaKxGxZmjYKjReLwpewC5wYl0Fv5fprQa83+Z4YhesiQTGcqwJX6dzQcX8DZaRZwdPcNOvvVjosNRmDNo1kY+fE+1I4VowV9S9Dk1G14oVyIf/sI3O2TOTHpGJqsT6argweoduZBfLStE1L2RNOJqmjcXfEQDiWJwsNDEhhunMxhte2ob+mEGeP1YJarPLs8GIRWp7G8U3wePtaVB/paR0v935H4cmP4XvwaS4S7Ien5Hyx90s9/Ts6i6ojJUHZYDfIi00nQP5aGRdZioKktLzNbDHW+M+lZTAQszz9OEaLHOOOLOLwRfwDuqmvp1VhrspDeyQ+E49H/6Tvs0GcMKb6Mx/Xr8N5jcXicl8W1/x3EE+KB9CBBi+rG6MObOYu4KlqG8u5o0YxdjTj3qDT8SHpF3X3JPOAyhXXlJ/Fuma+gufYqiv+o4QMTimHX1hjIFdOBiutTIF1DC0aWFPOjajuY8qyar17/DZX6ZzFUiEHQxgOKGg3hvpURVMw9yBPK2klF8Aa/z03nU+9/wKYzbVR7+hF2+Ymg02xtaP/8Fp9IueLQ7yxW9r/EJhqjWPKIFVzuFaacGdewb95RCJqkDDnumXxD9i9FpGyFqpPtLHfRBzt049H352hWSRKmtpcmbGavAIISYpQlX8yB/5KgbJkvW/+nhbYhxeSw9gvLqY6ARUqK6Px8AkxL+8E+SetIWjiBvCuUyd7+G1sc8sKnzaEgeK6OLhx3Q9dnBuCzwgRmSilB/sTZuN7lESqprYahVXk4q8EOq/WyWXiqDupMMgM/NVP8+mEWXfBexOG3NoGRcQJtVXkMO2L7YSAkmo0rGvFxpTa8XrmPk06MYqFzZXQp9T0JhvmRuK0H9oXeY7neJgxzW40pj1WBT9ewe/knujFtD1i9OYKO/oVk/L0ZPDzq8bCPLCcKu1HYPzWIHHUetXwkSV2ujS9Fref9dUh6PQvxrd1Szlk+H5dZr4B+fwlYITOVQ6YOo5VpPLkM5EOrzT5KWBlMEdfvo+jE1xTXcx2/BmmDl3Mr3zzwgJq/FIOX7GM+mOgGIwoXw8pIX1r67ScaJRnDO2OAxHAT0ioqgcI5RdQo4I9/uivBR2wFVaqHQpLUXF62XoUF5KUgEIX4qZgk/bs5n2Lz5GBDpAlby/VS3J0mklqnDNeLBPhIhQpMjz5GV8e848knboL9tF4YMriKm7OG4NdeVxAerQg92ddo770JcOniEixP6KLxfpH4qe8kB82VIL/mXJzR2kzZg/+457oX22xSgO1bPuONr0N45E8zZqhUcv/1+fy0dgHN3PANBH5Lo+ieelaPmAyeIvaogfdB9eE9fm6bTjsPN1HQnemw4aI8P/A8RZOsrVDTQRWU7z6n4Osy4HFlPdiLvaDSD8+45/5dnlZlwn3z8vHAJuZpYyfAhnnPQTOxmrbYWMLSL6vwkNciajT4RdPWn2PvpmaE/4m7D70QHH8BoN+RNpU0pKKkrUJDmhRJCCEqIUrJCmU0FFnJrJ8okhHRIFktlYyMoqmhFKWMhEra93Of4v8I5wmOzWxMDNeDsAcm/F+oOvccWAxvnp1gnTcLufZnKT8rvYWLVwtj2+wCqDk1FiLiRdmz/jhU6MxCsyx9uH90Ppk9OkuCXeKcfrkEMk7thuUiMiBbFEVBvyyod+g0yL2Tg/A3VylCIYZNbvXT48t5fMJuD5akKoCWnAFsLvkIATdGY+reAajVrOGaMiG4VxIMdyQXQZNBN34+qgWNv1vZf34T46ov/LFbln2eD/L2djdI+5wE/wk7U7F1N07cKwRlwx58sDEe1bc/gaCkVlg8t4rmb+liv+YTsHLPb3ZdaYXDQaKwdvs8mmb9ED+sDgOUruVbC/dTj8swz5x0mINULWl1JtI9P2H4oqaIb/weguG7Itjb+Af3Znrgp6vzsWEf8avNuXjaro4EHglCdYwFrD5dBAI+xhhy4wsYd37D73Ez6U6XNOmeqmRRs6doH24Frc2HsCEkjuZ0ScDtkr9c6biHHdIjqXiqCX2bJANnhifQTj8BGKr+wDpywiwo/glmT2WwsX3AD+dIQfCpjVQ7MIva6udzIP7P+l/4s7Cd+jSO4tvzNsTbPWjS3gy4FrCU7Y86YoKcCg4NfsaOHm2Y+i6PUws0uaxiIVz7KY4F/dUkrnwTdym68IqqBBj+Ow8nWoyG3bNnQdh4c+6YkwA5C0dDg78Mh26PZtNV5qCdvJO/5+3GjdrS4D6nhHnxKxCnRaCm7gb3Lkuhr5Us7x0spvbLJyDXNoBs7IxAO7IKH6ntgrXzRqHWoxGQvl2QZ5mFkdTMDtxCAXihwpQeihL4d2/BQ4GD/Lw5iMv3R3GrnDrXisRz7eV+Un2bARERf9AtVAUcTh2F0HviZK5qCz9ebsVG1VJ+2HoPjqVF802dabjD1YACZSdA0cd0brbsAD/T9Rz39gDIBLpRVVIuHDPYQIuWeNG3hp3Q2moC5/Epu0y+DkOJsXhtxQAtzz+LOd93UOGyFRzzWx0MpzXh5v7RcF79FNm4HyaJwBqAab9xy6hy3t3rxA6tKqD+6zKf2lsGn0K1oGbuOpLGLgpPnc+P3xXAqquHUWq4iIPzoqBgaDv5TVAn0UUm8Hjza1bb6IYhkZvo5rUIVilyYUuJJ7DlSTDI5Z2EVr8wsHZShW/tGiwcsJoe+t4ltQQPGBFuRZGSkWBZEoHKKtNA3L0FH2jrwvlQhlv4hPyOBfE248XovvQNr1ydgVNuh+G44li4WSdLn8QNYJeYEB6VvAIPlt6B1VJd0CoRil/9L+HN5M2ck2CGWyZGgXXteNjUnQ2bt4tRw/1XnJ0/E2KFZ/Pelc+5ROsen8mZwEKvh7B+vT6oohjVTQ9llf5BqJWbSz+WjqCAKnXIylSA4imOMBjvQ4HnjOHyf9J8RdySlmyNo+6M01AxmWiMaxWkfa/jDu+nJHJ0Ff75YgrWP36z34slJKSuSPomo3HG/Bn05IwuR6U9Z6G6ODi1VoYeOUyE9FnnMfycNyzc3AikIwaex/Sh0GcGRYsawbNgA5rQ3AH7lUdBf4QaaVTU44egBlztq0zpy1L547q1OCrwEH33OgKvNxlipaEIZCg9YaXpndy4fS7k9+Ry4Ypa7FZbS38bPTDG+g2tsv6A/VIm8NLjLl9qz+P0mF7UfFcC+afUSd++jRpidpKAqicuz9HAJgEriE92xpX6IbjCFdh2egvIpu+iWLvLsMZqAU2tj2Lr3B9wY4wuxC6Nhe3zT1Oc8nc+cnEVl05bwEf8J2P4ZWFIHvmP1eWFeekKEah7ugAbpUbRst8dvPbdU8o/coN2nciCoPw7qGPnQPb/XqOf3FhQLkwl/cN/yP6fANr3ePK6XRb8NHQHnLo+hr90voUnpbmQtsEEdFWlYaz4H+w7W4sS/Qspe2UHxu/+SE2ulyCFutlbbRQovxwPCX6H0O7Yam64WQ15eYYckB5Fz2u8ydq5BiyiF/CPnVvAdAGCz+Z6qs6w4IwP2yjRWYZS8AMkrLqG//7EcKf/EXCbFYyu42eATPhcULUs5Y6BTfTi7F6Y2glgc6CEDpmrcm3IbBz31JWHZghAyKvPMO06oe/YxfzvjwjaHW7Fh4UvsbMmje9pieCCQH066GEOg2dL4fefTzip/DVFjY2ltpEq6OT/lscNDNKzjQJk1/0bRdOkYbTVXI7Ts6YPa5xoStxqaPVzxMkVUujR1A+7y0dgx7e5ONHADIJnOFDbgDZVeJziJ9piLFh1CJqVrlJ1rTNsWz+F3Wdvx9FKSvDyjirNTAsnm1wBSr/mioNvp4Fkqg29/FvLVv6T6WdyDt+skYf763eB/nktqHrfQ95j4jkYP/Hr34e5+cwwpZff4FWf2millDp0SdbgD89+6Dt3EZ9HDqNrqB6/K9OEk8o6OHj3G8ZI6uLS2MnQeeQr9NSWYv5HR76eIYZixoXw/fUU6r+6GsWtH2FKSBdvmWQCH0XG8JQFduy3pBumCDijtEQvmdz9Cd0vn3Dto0qcO9GXDI6YwM5X93FitDye3/kQ2HA62o53xlWRh+DxrFs4Z1MDfpmRDA9eqMB483gsvB9P5l3OvP7UMwbl/+CGQwAbeYeyXWk7u91/jQo0AfYJiqHrfzL4464ilFcIcmv7PdLaJAd7Lq8kr9QJZHGjHHLHjwNTe0kM/RhOd7eZkv8vfZxu94r9SpdA0BQNDpVxoTzHD5QYpAJh8W8x66U/+Zb1YVeKBW7b3Ug/YibS934d/rgqnivW9ZBavRVUul2G9Q/vU0D7IrJ9GgETdN7AZS0jvpBVhP9oBE96YUw3rPQgunc2HC6Lwr0NyE/ej6AbIimoq+eE9VdX4XE3G6iO6OdwWxkombgcnlR1cfuHBPq7oRePLkrhjCFTLtRNoZHfjrKG82j422AAqr+a+fU/e8qvq+fszCUcPNBEV6qsWcRKitsth/GioxyN2a8JAsftWe5iMugGlPID/z209/F+rp3XgG7+/Ww/+zBobt7K+X2C4PTehbcZ/uOXUULkNU4a0w7mkEyJNbZeWgMn9JPQY+Y1nqdpBVG6J/j+PC041rMTv2XW4oh7KzgyVgDT9miirY0mxrne54ClYnAocAyUL+iBC5YWWGy/meNAldykH5LX8FqGt0jdS4rBcaESlGydCDN6//GKMzG0OW4VWtV6ovaS8dw0dAaML6Rxrcxt2OU8GS7eCeZW9bdcqNwDdU+1qV/diLaH24L3+olwYlEoBbydB7n/BOGRrB+Uaowgp+uisE6qDF4EzQPjJgVqK7bAQD6Gr3+7kcNZUxgXWAprDurwUNdWnnO5n46HAXstsqa7267B5Dk+IGO/lqa7CEDG1AUkfSiJBRTfcZzUTJ56dQ6vktyB+/SnQN/5/SB+fhbayc8A7wOr6UDIX9i12pOV6p1h3F4DHLvbG1/dzcZwx07c+rcVvTbrg0n/SMhqVmOpmj2gPk2HNt1So++X3PFksgvWbWvkTZ/t4MlbMRCYFQdq58bxZe073OyYhs/ep+I/Lw+2qSyH5qj7cPjZHN5dJApw2QgGZzWDVbcxb6n+yc2jR5JJ8DZMUr8AdhU+mLlyDS36OQaCTL6gyqHjtHTpLfRbd5Yz9yZCzaFSenlyFPTWPIC1ZYDFHwkW2I9HxdIK6CuW5n95QdB8z5nPZv3BrMhxJNaoR6f2OZGcqxzUPz1Aoh83c/lTKRAWd+av+fa4X6wMdOviYK5fNl48OZqy9hlAf5QqF2VugsMh99DeOhyPjSomm47/6Mf9BlJIuE/ftl5DdSdLeBpzmye43cXwq12wqfkSvxN9xZ19kShV8h/LPlMivpsAk8wlQXZ4O4tPegrKLzVJrVIA/htwwTGLq/lBeTguMZ3KHRv/Qoz2dHj8SoTPBp/HnIdasEgpExq/Z7BQ12recLeVdALSsOnpfHq2biyMz/1GaisOccqL9+z7VQ5mCR3BsGddEPpwPJxfpI+3BsU5aYQBPAypp/4Ls9gk2YNY5gY17orjp0ZtVGrzmXwP1XCcbR/pHjCGgun/YIZRJl2N9+emijo6kGoHSvWEj05Gs5X0CxpeakC/RURAJLICH9h58kUDWRiIDuHOCf/IL0ONpta74VxdB0oeRHR9NRYmm7oj6W8Er9MamJdby5u6zehS4BmSuVtIgy/EuFfKHD3WacGjsZo0ul6JE7fewlmbD6Fzry/ttOphsZMAcvlbaKdTP9e2qMOBHX7s4WNGrjvbaGzSP6QzR/BRpCHev6QJv+5U4WD5DlhXJgqf6pfhil/HKe2FE02ykcTl0qqg0HQMlY5kYoSjLii5r2WNr6Iw/wPjfwt+oXHYYq7TmEcVOwto96YGaGu/R05eRbTkZBfbnZWFlE03SePARbyWs4LEQ8I5+XwP8bcIuPHIBObOmctPYxdyQ44QnDnizPvCpxPUpcF0gWbqWv0Hb0xfRyPO3WWjQysw2vocj3XSBEv3FLiRFUPfCk9y+MhE/mLrAj/P9XD6qsOgIitMr/02olqFDjyZdwCfRFxn0wFzyN9nhrUbtuC9FV04feUa/FL/i5vfP6eWiyJwySGdKZHQLE4Ko/tEaNDJCYLFqgB19qGWiR2mxS7Eg9ctQW8/48v6u7hfNAqU4SakTXamy/rpkFJlxMedS1m9RJJ/dcqD8eexFHtZCcaNqeVjj9xBiN+j7ThJHtPewv6rczm+KpyjOg3g2dZ6Kh8qY/dcG16VvY2XjHoP7dXzSbO7kMsNc0h8lxUf6FWBcl0BHDh1jMY2RVDguCxctT6ZrrVchllDy8G0YDKH7VxAZY81QeKsMyc2n8Nrv0fT4Xlm5OS5F65cYlQe9uLNDT9I4Y0mJRYB2HbLECrpwtPYGGw/GY42IhtQslidd3T1kvS2LDh5bwqVtslBsMdz+hn/DwqN5sCa2SexcaYNdPs14+X3Z3BrehcabtwBJ41lIO9ACE1MLOFni4ENfJfS1kuX4IfMPFr09TClHysiA4OfOLdEHNTVXnDyweV0cVkij/idg513TOFPihzkPbjF8xyd4WGDIUnVCkFO/h/qrm4mrVkStP23GK98Pha6F1ax9b534PbtHVeqHOevOTLwY8lC9FCcTK9PSnJGwASoDu8gcCzGG84E7gNhMDuwHkzvGcKHgfl8eMR8GL36MIwYP5HjbjyCG6UzWDJDBtzPR1Hpop+wf44aLC3yRoWTSTSsWYc5Ydtx7yVhfKO0BladjgZeOBtvNTxgwf6RsGiGG+9LreOM4t2kGmGF87oYuzf7wkfbm3g57hZO3LGLNAQmgHJVPX1d70Trr/fC3dPpHNSUxUEuNWy/Q4t7Nidw70NHTlVVhiP/DpDr0kiWFj2Nny520rit2/D2igfwS3gZr+8bx9uMvnNtgynoXehFxZ47NCI5hm55R0Ox8zScsfI1P5ceDRly+8isWQjzdk+A0y8q6aasBCsnVpP2DCeQabPlExfd6d+eq3xk3Woo746nmmUW8C37Oz3RecaKMpv5Z2AHu5zcDE0qApQ6uhYj1myHmxtT4KafKJjMXs1P7x2G38v34YPuIZANuwxrBBJocf0V3CusRI926MPmp+ZwIWEyVk55DPnLHaDigjKtLQzDPfcX0IphS66znUbe1RNYbI0OeKw4Rw5rZ9Nqw0fk89EJ3n3UpAC9cNbxlIbZc/4D3T5NyN2iCA8WKpHPrCHcF9PP8zc/YtfTDqB8IwKuB+yhVTNFOK9pmMy/TwHjXYwPBGOxZrky7bWPpgPV4fiRBFHykS/4/twB6/Ab3InVhB2lJmwxUwUfXroDLvL3oMR7Px11/Ev1f9bC9dLFGFl5mMZ8mgKKf6VBpn0fX+w5QaVlg/BjSJ6T1k+lXbkxKGyfDvlLb9OyWwj3lcvp5c0t8FzDmHWn/geL2/7y86fe4P9gEy8QiOSgzAW8bfMkiPe7D7f2pqDWAhXIkvFgh3YPtFs6h7VSZPCJwDLwyxei9fr68FFGEtplZ4H9xEwaZVlPAU4OlC2ygLYdduFJQt9Q9pQbhToLgt3dH2Rw+hFYmneQtl8AOn1wxdFq1/Cxz2Tocb8Lsesu4TkPS/ixRg9iY7dDlLIESca+gDKvBPznsQM1k73p9kIhXGZhRosPGcN09VH0dW8FDXIMnvnXACv3h+DVTzL8VSMVLk2fwp+qv3PYAkOwf/UNTs1OgnDF1VBV3ofeOd9g3aat9GKTG3WFv4Jly7Zx9GUlcIBr2BRcj9JiBjx7WQSYjJgGaUvSuD13N/w3LQR/Wx9k45fy4DYwQGZjz/BK0yt8y3UubbmjSuh5gx5Nn0hZcZXYohvBnTaiMOVmG00cP52ETEayWGcQP2wyoVt7ouFUTTSnL56Nuq+248RxmvB35yu4bXUbRwqO4WbjMFB6mA5/006y/7U9rPV6OZ/aMQE8tQXg87NH+DN1IqxQXo2Ju+LocusC2Jq0gEdWNPCXSbPAuyYYn7QbgO+FcmrvMMLJo05idWECXaN7dFTGnlPuxnDZqy+goF6O6wzE4J3VZ/QX0WJ7gVH8120LyLz/CMJuKZRS0IC9EpOgtvg+Up8CJJxQ4bRZydjxnwHLT5qMi7dZsWtNLk5e5MkjBsR5TJQCfcsRB5X9mvBaKoW//dkF2qKKMH9jLEcEmmKxSBQVVy2Al1l5aH5zGmhorUTLDzcx7n4uwnVPULapoLQQOez2VcSui9boP+MLrFEfCeHLpnPH+FDIeXAHdk1MJf2I21CZWgRXCh3gZO9LWrrvBS85QbDnaRBInHSFDx+bydS8COYe/smli66yy4AijjF24LC2DpT7Txg+h/ygb596ebJXL5wf2AzqyzUoZdtFbjVs4fj7L9gwfS6eP6IP7zo8MbWgHWvO/WEbo9PgOLCQV0V8AJOi17BNPQ7GPKuAkCeWcLDMGGLytfCxbDBdajdmJ4O9HNojhaM6gUeaz8W+A+/h7RoF8NWcDErNepTqWE5uZb/oV1AAKj0NZ+WOkVBk8pxPLt9NJ2+KwID5JHpZcR0UGt/yqqs/+NKR7fTzXgFmeb2BUZcucuYaV1xxZDxMN6mCXXvU+cj9PLI4LkiPvzSzi2IYet0Jg9+rStHlnzvEuiqBZGU0lC5SpvGijnx6fiQfeyNEr0zkscK6jhXGBmK7gBEu/CwFzu6zUSrxHzjUPgcd3YcY09MNl2r30zqdBi543c7S6YRlFWOhPWsZLazUhG/JAqhz4B8fmWcHSy/dpvk3+ylt8U/08bGg9+us4PdjHfi9dj4+WecE0T6ToW1CCpc/VwC9qle09LEcrr31gU9+0octA25s8PIVODSu5WsR5/jBPjt4MnoQpn18Dj9/bOHXw3Yc3yIChq8vwROBeHi7/w3F+Ipj+dRD+GUFoM9UFaxfs40jM0RJY44EfC/9ipV7tpHZg3/Yfk+WtxY9hMiGw9jrkgZ/BbZAW9NvftUgDvuGXpGz7X1KVvehsQZ6kLu7hCXaovmqYAtcXW4EuvuDKExOGb68uIOZX0bjZ8/5cGKpDHtPJxaOKKH4S7vZIeQMTrj2naLsrWCU42JSStTCi/rxdKsjhVJcMnil3WG8Wn8Qmzu8ODFuHy1yNoaOUS2gWRHEf136+cmFfVgZ/JSPXN8Pa+qek5vGGSo8vx46p8nA8J+HHLNYF3yWl4CO0AmWujQJQkYbwPBJbb7hUkc5F17Th68yYB3lDYcHsjErxYly4itINK6AR7kdxo5af9QME6JeKWGODpIElm6GZbeD6MGlCdQtOhKDlTRg5K8X7K10A2nDMAgLtOJz9bHQURTOf1vM0Jb+QmpZEqt8uM8HbM3hdtoHCJn5Gz/EHYOwJm1Y1HoMNdLPokaFKAz5LmRdqsbVgzsgstuU3/znjeFnxsLIyWNhbqYy+efcAE0rNwpjJyz+2wiCv6XxSswOWj5xLSToKOIawXGgEZxLO4IcYePYT3zmWROo+hFX7SyhC3u1KXL8anDx7scVqlMhsf8clN16h5UWTFMOFFD11/XgH8tc/WokVGxxINmuODxoqwRD1hqc51+Ivt3jyGMNcETCUby89QgNTJrFvqkzOfHZeq6sNIXhj0lgYXKEqpcdInWlPTTNJRc7M/eQyWAQ+9+x5D1Fk2isryr8PRvA94PG4K3hENj8rRYPnqnFK8cq2HXqPsz0TuARMYvJsh1g4fY0Dn75AOpFDShbbi3+dS3kiFNveKvDKrjAq6hffhgOTpwGF38lsOa1EnoqthiW+SPErJzH4560ECn9ojM6vaTtvBjVOzWhfk0arJScTvdOu9O4STMwU+Ys7S9dzvdEneFsihyPlkjipnkGsM4yF0dP1MIBgf9oS9sZfihznaeZzOCB/Uhr2rIh++VKSM2dCLv1omjx66/oFDUCfCcbk+YdK3A5lIFzpgThHOlqzJ3yCxXnWcJidKZzu8Xx1GsHCGveCNbLj9Lr3FzwzwhCp/gh0jHJJ+1eNTDI30yXdbfjA8s/IHR1LQe6FGP+poVQY70UImOTqIQXYsyWCTCcbQH+O66BgPNEDDZqoVCXRr578hV+e+LO4wx/0ufbZmyUoQp4RxK0BRfCfj9r+LvTl7uHP2FjuRWvm+fKr+4pUs/gJjz33RxuPJxHY9t+UY9sPBXdS4H2DnMcq+KF244qQF6WJi497oaHAoVhvOlfOmJygmNFzXjReHfaegHIMG02vazfhu4CovB5iia/qRSEuU91qPXuLWy9/ZQrkvPxhog9tuZEoMNDJVr2Yy0bLE/j+HZ9sPxxDCdU69Hdn37QIFfAFSnS7D6tkd07hKEk8CCpiwexe7EwSHu8oQdx/mT0wB9/HimDJeO3QKV9MhyfrElSB3Xw9LRS1JlpAkc9UvB2/2S82H2V5zg246THH6DeE1Ey9hYKHxvijs5mUq2dCptm99KViovw7nEzHji3lBT07vIlP3fcWWdHim4d6P2fExU7mYKN2Gt6ukYNV1hnYaX9CppeNIPET+xCscydFLKxlSWqjrLDJwF4uVyK6obFIc3mJPMrZTyifA0Ov9bgHv9vVBB8ms/vzmGTNxZwwfgzTf/SzcsvbkKb/1yxPWAerN2liZcuEAifsqJRX8fhYmUN6PWUgq9zm8DijzW/FZ2Pu+YYUuoKQQq9MhNPSKXC7nPt+OrKJOgbDIcjlboU+8aKCyqOQ8jUfHRJliXzZmEq65oPzsZOcG+LIIyNFkNBoRhsCRKFUbWh6HP2E8qOl+Hs/OPcOvQWxxukcG2VAdSXBfL4EyvxwMQhPPQuDKOPO3L21EIq+H4PnmWagqTper4wcQqsadkFix99p4TPX0B35W94EHSMu0YU0sgjuZB5wpnMvswnewMDML+ni+VqF/HIow+gqSDGb4VUKErUBkLjOij520guCdOihJMEtflzSe5sNj/Wb+Pm/TKUMcmZ7saep4i7ybRmvxTGp/zk80ZWcNzblCNSDlPtKz3cd7WantI4bqjPY2hohxUWALOm3UPX/ZIQp5XC321u8k2oguLsxXzSRA22lU/g5cttwPDfH0zpGIflQgSKDZ9g6Zi7kDpqIztZZsPqfbksr7EfX2texVefzKgr/gHdmSoBsX36MOvNDT4legn87gXTuQ2NtO6+DJm/+czHJS+QUvZ7cIucAal1MZAzkI+Na42pxbUXLG+9IePd4bAgcAJOEZiD78UsOPbjCJiZeRcqxhlz1qAldTvm0AHpOzQtqZtNJrpC25JvZKw6nybIaoPXiSskk+PEQTs30rMTB3j/ankwXWNNjX33+aDuEfqbF0Cld1SgeJwuS5bf5eACAdLcMgTqyVIUOdMOvs08ClWV4cBzLSjEfTocnPEdj3zcwbY/XOlzZCdbXjxFpXOqQaNMGfJXr+TxFyaR0JAuWEmMZdPkLmjQ+EnfO+z57ahKvmdylEznqzDfcQPNntscfFACpo/ro+kH2+jntGUQfCcWRvYGs86R77TA6xjG/myGMV1N1FyjBfriraD81Q5epbTz+ObJnDowj1q7R7DLZT3snHkdyszteecDfRiLX0mi4jz90hEl1LzIG98agrD0QmqyGsuTJmSjmvcd8l9uBVfe5dGArBOeO2MFf88k87MNQUwXvrHn4QG0fzBEpV5f8dOEkbDDXRj/vK6HtIHR/MP9BO74tJO3qvTh9Vfi7Fq7i1Uc35PiNmVIG12AIyv7cXHHPwpUDQXp6hE0aUIl/klypi3priw+xZMXeIrBgXc+aHnsGBXuyOdlUZe5jMw4a3Ul+FWtpInZWeA5WYvFjk4C9W3xGPFYmJUfC9Gxl7oYMP0BaT9I40AvMexSVcZkowPYYioIEaPskGdb8dmzs3la5HNIWLyBT8/IRqOBQyChnYpZOl/IvVoQQrYsJgHNDTA69BE9WrODb8Ah6jVV44j3RzHr4C22DnjEX+KF4fb2e1CbXIDpA82wqdyPMwwew8xZ/8jRexxpa3jg+YAanNRnBBnrfCE13QHavRtp/SZjmuxmiFUlOqDCN9FvhzdcsEukVFsD0HazxRI7G7xTrMs7LQ/y+hYxFPBx4f1tmqx25TqOvrOS8tZKwYhUF854NZI8XQ0pS3cKZtcdpvkx43BvTRYk626kTc1WvErGGHyDakiXD6DZ1xWkv3krjN17C8KlIvlXqies9u8iHJXCAaYC8GrkClz0+C+UiEVSbq477HF4iNcFLGh5rDq+ztGnlzIxHDxNC6TzvFgEa8i4LBWlTj3nGgkzrprbjHRCjIt3tkOZ/Gn8fHYqBNQkYsTKQNJakIELbl+nsmQD/rMjis/4+IKRcRDUaXdQ0DNNSHh9lRWuC4G2LVLg0BOS7z4GM6vLWXCcJx1+XkD7W97D7ANjoUY/jvW21uD8kGCKLI2i8D5XBldTnhnvTXm7hUjZoxuGbpjBlR5bOvBiFdr5+qG6w2NUyHwPtT9n4aR3tpx9TApsvjjyT0Mx2JB2iH4lDNPCn4HYpyLLpZvkKPXDe7aXcsWyp60wRs4H5l3QghsRDdzee4E8I6X4R+VhXlnWQvJDxei76DGUp45A1csqGBakCJ5KgmDxeTRdtKhCWVEfPDQ/GI6NkYDsHV7UYpIFPxZ5oWewONx+5oPeg9N5uXAL1DXsAiWxLxTakII6xrVwSiwaPsrdpg750eDTXQPydaFosGY3rPiZA2aSxnhOJRaEKjZCz8sMrBE7jye1DWCaxl3+4f2FvRqm8KeTDrxoszB9fbKJ27f28u+3DB9Wm9G9MCUwd0rn4R1xXH3qKrx53wsX84s59lsw/tWNopbAlzQ6djnPe6EKWdnd+COrgFTv5HH13Bb+OihPnoeL+OXeTM7s0KQ1Y+YQLxKFhz/f0dMwKez794299tpBydJuDPxjh9t1c3CH/VSKPDwLQ7+aw5cXI/DeoBToiRZAb9ArkPKaSxJrq/HpFSX6r/MVN3nKQXaoDEjl64Hix0reZuPPP96cRgjejS/WJoPTuSP8dKUi31xtB6/jhWDWy5fcVZeLfoOTMHXVU9zmt5qPrFMA/zHraVXgAVaL2koF/VJwo8yRrJ9FU8CyESRSIgkvdyyhilcxZBYpjtG7i3BnrxL9/SwBhgkbIfD3HfZS/Eym9W0QKqNHcebZ4GI/Cbe3pMP4A6s5SxWB9jNy4jV4mmHGdNaVlIs14PiPJ6z/azQIGiF3CJijirY4TJ+hjKu+SfA7iRyocz0Od5pKaMLvcdgD+fy6qZp9zQ7BrJ368Pj0HkzTUuWCjYYUr7iFHwvuI6WwDvBe+Jsr5lvzxjN+fN1eB0aNPYYGJrNQxzcRPid7okLJOVyqsw5uGTTi2aW1rKCSyEImBDO/qGJe7VHseuaC1r3ysMPzCI+xnc0Ffd/xfdNfuHRgJLnNFIepM+fxkRk6/MKjBx0WH8f3TkGoLW6IGybWUPVZB7Z7q44SSWIgUKdIO4LMYdTdVvxet5EN7Dwh1H4TrUsog2u7N1H5+SD2kxoFYc42gGNm8qhAB1hpPg4TFZRJPjMdNJsVuHlTCrrPlqT0RXJQJCIElyQLIXffFXozQZJfbi0mlaXb2dX2MB6uECPpYEd8H2EFb/rzYaF9IQeZZ+L96ve0b20HTTV6QuVpNpBYUUTmPW5wWmUaLFSrB829oew0/Q8brbiCPwZ9yDjKESxNrOjz6I8UN1uYi0NHQerZP+jwbDXLuqtyad5GPvUhkKTr3lJXxmyUds5AzaEwuLuMYZnsJUp3e0SKXoag5W/JfVvf4++W+WQ8/zlO5n0UJ6KPXguNYNEMMbL3fk3TPsigwvqDTJuzeP8XXZQyCsVO9yUMtnkc4yMED/+EQumK03RMwoxmBCfB82g52PXfO/A03EHvHCZz6sUHpNI1DbRFtCEkwBQuZPrDwvdP2ev2TVydVMiOWs8xyfkcXBIwYt/bkqC13piXxoXAvHnCuPjEPlRo/Ycld1+AV/tBPCiVCl9tI3nUPxNwlsuElAFT0HhyHoaPfICYoHAKelsJYZ6psOepPAvJjqclZyRgw3OkqgddgEfq4VLidr7cOAa9cndC1JlOeBcwk1x3SPNCZ0sYU3KRxyn24LePSjC2o41OvvrDjpuTuG9BDUizAmrML0e7BkWYN/kggF00NlIHeEn4wefaPXR+InHalbk8YcZFKFmykg93TgblHk9eO34lTkhUoZOjI9GrUwJ+JUwCf/VzfGtMKu3ICMZpeoJwYVIxD4j7oM8DIVws4csbxzWDRuZ5kFIUAb3hOv6Wc4I6Z02AC9NWsoelH0vuHwsBShfZufQo2jVbg97XZ3DnTyEO8XP+bSAKu4M14Kfxafwhbw+fSpLBK1ke2hxb8b+obtqblorO5ptwwQUJMJs+nUILqtnI/iffH95Ip3X6cIrNJvx69jjkVOykaMNIOB49AzDxKGf/O8cR3z+jFX/nK7YzOb9oLxhPN8Ds4jzotKynv2WS4CBXySv+DcP9h9oc4jDEetZb8YPOO1JKbOTNm5wgpsYOzzSowXQped7q20hm75nf+FwElcKb3Lgrla48uQU2Jua0NuspjZolCbvavXmL4WXwGPUBV6b6sl/ONpT+rocVArv52nhJqu9fT90twrBxSR8fXnEHLNv+8O22LHhU8ZNfTL1P+TaxuDB5BfS0ZMCKCUowu+YImAu2YY9vDX48qYDGBT587XsCnd94DdQ/FuIr/35adsYSZvyMBGvjnbzLtZ29llfhqT39UHVFgn77viKJ70UUkrUfUt5qwsY3ofR61lqIal4Jp1cmwSWDA3Cq/g+eyaxhBbep1DjRHw2LZGB2ficabV4BMbOkGHIC6FzuFvjRPh9jHxXx3gh9mFThRZc09cDuzRq6kqWBau+iuVpwL/wJZ/zasonX/FdAv4zU+evsx7Q3WhmKRFdTQHYhXTrzHkj0Bt/VWwbxSfE4eciX9e3fkWtBAF810YPo5RvQ8/4qDvGp5QfGgtS4tI8bFObzfb8XrCSXBQHD8TA2SQfCOnZiv/YSPB3lxyXGHRwRdx1ss/tpm/0SeFowGSsqXECgUBv23Z0N37tP0wKHTRTQ00ONtIGPbH+HEwRvUfSDVJCV3wjp6eMhZ/8pfG+hxXVF/bAlPApa1maTVJ4E5+/s45O3/uFLSRsUHJKA0NlXcVFFHf8yHwGzEkV4U0U57TmpwCLhDmg/Mp76P3WTpJ4yYOVEvvFZEA3MF3O+8i+06XrDGqot7LOnioOuT2Vnz91UocqADjMwtcOeZE3u4Yej57hSbTdGiyyltGNiMPqtNs3JXsULP2nB0xUP8dCSBZzgvocvfxzi60/ewdHoOnaXTYIlPe9gyqv3UHHSHLLkXvAqnoUN/VKsktXAx499J16/nq+vbUCF0e9ghtBLssvSheKJQ3hHbBmGWSxD29pg4luGsM24k4tsJHiWYiQlNtzE0dYyEBgnjj9JjxWWO+OUtbHUJztMrV+NOHrVC9ro5IxOUSOosV8evH9IQEu3G6VUHkG95AzKt9PHSPnP/GdXKXg8XcpZ0ZZ4xWQKSFan0+3iP+w5TweLX14j8dk10BB6CDzfnuUkSUe0XhDB0wJkQczeAkeWXeIXYinY7CfBhqUbcKuLOixrCuOTWS5kdm8TSdxVhxWPklDuRxwpHFVGF41+OGT0mL/MzyeBg6vpbOYFWqiWRovMLOFFdi9+7L2Os7c7oELrYzRq/ktTZqijSlIQbtfIo+FPhPLDytBiIYUHVp+hTUdy4IXwJ9z78DiNGpaiEwurWE4oCd0Hjen4KSPY8/on7hTMo85vfvy35wVqThTG1iY1GL+sC3dqRMCViniK+KYPZaay+ORvHpg3q/Kbz/7YMjyHD83vZx3F9eBY2sIfpVYyDErBndGaGPpbgNaMsWEBqRLKvGoFVVADsjcsaSEuwMGwubhZTwAyX+4DzwdVvGBsOZXb+UDEig6w9XfDkO0EVm8y2MvkORVNnAp/H1mS0Ckp+vvxBk/pcwR3DIN9YRXUvyiJtjhb8LQD47mzlWHPhgCoc9mGtbW9YJUsBt86/rGgrA/taCvlf0NaZCI8n+e3TYETuqU0J3QF/1IYJjNJV9gj6wATN9ZhxgNPXP89G53SpNBxgywsNxoF41c9oSVVfvwlYzoW3FxAMRadEJBYDFnlAWDmOMwbzshAipIjNpyphFvX6+jkl7eYoFYIHzYlsel/Zaz68TjpzL5NtamWsMU7B4+tyqI0tQYasdGFRzbmwcWarTzPuQ41T1tSXoEY1HmNgOgEf6iLzyWfykO8bcMNlNdeyNEpB/CKxWx8nCzCcV8KMeG8JDRWhZCP2X7sWFYM6+fGoHW3MzbtmU+31NvI0bQJAvd/oNi2ieAlv4rjvM/CwlvbeWzEJLzn+5tznv7B8enHIfWdH+ddcAVRPRno9tgMV1eI4AZLCxwKSUfnb5I8uEuD7hmMgj2uM+FulhhMlRkDM7cmoDfJopSTN8d+daeJdudggl8EqH5SJbsXZuyWYgoPRwpDXao9iFkV8O4v1+jyyiLS/JyHm/w+8rJScSz0bcXi23+p97Yi/BeVT1FlArB7nB6sd9vGCpHBNPOrK4oUFWPDHSd8LZaAJ82nQ8vpHDgy5TmvdljAz8EfzZzTMPrEctR48h834RaMPHof0q7IgmHEZ7raaIQWEyTo4lcjCBR8zMq5N0DQfS1cdZalkYvqcJO7EciX9aDXgnH8RF0cY+p0uCQnm1bd34mWiQ+od3gmZIgexYaiqXDlZRMcdxvkA9Z3+HlWAfjrJvPbKYN8L1kOmnxCcPX0CdD+wQx6Xr4iCadAatwRCWdlcvHFtXKu3zsdyz5eAsXA53B0+UGsFRQB5yujsDfiKz7jX9Bsu4iqwqN4dtlpio9cTRUKnigzHIyO7qKQLPMSwi9fYaPCHyA1pMx7ZmWhg9AyMvUpReeNDSAzT4fO/7/XaQVah0bSMysTir6azdLV91DneQ+FqK7krFxH6PUX4Br3iZAcswPSWxso9/BasvLfSyW/RtGiJa0QWZcA8x/lg8qiSnolCNAlIgG6f48BsCH80q7mgKlxcOriTCyTacN1nY/5ifsArHSVhnMS1yHichrdDTPB2qYcEm55S5OqdtHeQjuIOSOMoHOK3RW04W9eOOtvaoSnor7w564zGgouwjDohCX7xSil5xheO/4Sq/MUodk6iDZ6RnPZxUv80cOCP72Mgkn5Tah7oo9W/n6DHya9IeOzhrBrvjdVHrXirykXaKHrOtJTkoTRNRl8O8EPtyzRxJKMENQPMoS4E7+4dokZSffsIO3LOfTythK4LNMmpQN91LT1EIYbDtMkRx2YVrSYpyn3ctr1STBPOByzNCvgUco/Ep2ly1Ybf0KwWC2JtOnCG1cX9gs6j7nl/jDrwQYeXdGOA26POG3bSjq10AUC9OK4XE8bKp9sg8dqW/F0qDEJSl7nMQmLoMHLCH0jbWjMmgB6MfUD7guVgH9Zd/hgWigbCrym8Yuv05R9b/HjqgcQ+KSLk7adopi547g4Wxwyv7dSqr4lCTpko4fwM2j6fotld4yD5Yn7qbB8L8M7Ez6xVgyuyd9HwdTJPEpLnJZH92F1UgZlp+4FvciL/Oj4MarYJMnb3kwFsc0h0L+nnVdOUIOw2lSKrmzmwFPLYcBjNL3PvQa3d4+Hc68FQDkiBx2a3TktVhiqP0eDlGkLn5Py5anqB/lLyQjuMJHG5/7yYFlnhDdW/uS/2WL0ZEAFL1RbkprMVy7cugClPu3hCw/V4FftOLiQZEMCx1pxzvlG/m59kkruLwNtsz80OGcHtOxbAGfHTMTX9hZQ4hDMTW98+UyIJ6jrvcEZ6gYYopTDYx8dh1nPDmLx800onCUEk1NfcWPbCx7SzwKh0gPgtHwZ22Unk/naCbiRVHnDM+L12gj8th/7hu+x0pc//K+lmr75iZLfxgs8+KibS9ZKkbe1FOgpq0PFslR23NzH3sf+sn/ZU2q73Ulat1TpqsoqVEtUxGPHp1FiNMN/V07wdT7B74JqIcTIFTXHfuR8b3ecEnwXLa5dpnUD82nDXYaZC63JdoUEyOu1QtGCeSD4LJVmRZ0gkzUpnPrbnwfHiOHC0WqwS+UJWLywpigLM/I98RGyol+DcZEY9WzwwAPd4hS8qYfG2cqDhPJ0PFXxmZ5VCYNbSRc1+U5nVRLCtMXP4a9ICxypXoGut2ThT0Q8Ov6+Revl1FGh+DkbbOsmD3dVzo1ox5ESS6inVYdV5QmeX/gNL5pqUXTpNn7tl0ePP2/EmMkvecHNLby/Uxguufhx0wMGJ78ojIpy5H3pc6FybRyMkf4Cbb7DJHbwG+/80odzfKXRQFsK5vrI8SHnC2z+2wZOWxnin1/LIHnEbPotsQ1usBbHyQ/Q7gIhqFB7yhPXeKBtszr7bCuiIJxHuuY53L31P5CdocbyXqnw+oA63HiTyKGnVOnYkkGal+vK1c0doBD7EM6tPwUBBgMkWxWO3mMtYJLHKay4YIxTXPqgVeQrb9/gSbYhv3FFTQDnHFoKX4o/kt87hF+lWyA5JQHUzrzgr0XWMCFAmMQe6WDRHllcM34VRx824e/LVCExQ4fNxQeoUTGEJBW90HYok45HptNg215Y0mCI636MgX07daBysAfL8vo5LMYRvGrTcOfXZI7b6MHH0n7BYZVp+HXzWQ57ikDqPiiVd5OF9KPpaMJ31JXy5LvCsuwRdB34zE760a9FXx9KwEeJXlbOsaFzkzbw1Op8nvnSGR45xKCvqCh5BC0H07wM1JpsCm1FI2HDKAXyuZ/LOzkIv24bx5OtHFFkvgco7HwH4n+2U9s9hukV93FidwtfSBkNhzL2g7vtKA784M+HKtRJplqIrqRqgKvHaJDYJcMRseHwYTgFRY474luL22CV8QgWTZiAu7z+8OTeTnp5RQCGnDQhYe1cCgpux+ezvcjmaD94zX/JdpHRcNN2D8zZ8IXedUmBcX8LPipWgZwPNjA12ZFrHkRT9owJpPDoN3osGcGZRyNJ2EMH1G/aQkvLZDA8GMwKNSoYuGEL7twLJJqxBcZob8BZHZvp7JAFBH/0xnafRZxS7g1JmWcxUNadDRbeZW3fCDzpH8UFmRb4oVMXZliW8eKdPSAc84iNjAfhWR9D4yU3il91i76GFXB8rx715ApCmmIuxx0q5LojDSSQNIOVwlJx9Hl/2jKilXb/VsDtrm3gNcMA1iTJofWLyTBuzGouCvaB3JkRnFCWDtUfzoG9826o3T2WB8Qs4eGzn3T1wAwYCjjI5lYLcHVoOh/V8kAfkzsgbfEMN7r4oayDICjJ+tOjJiOoKGjjmQ0zaNSjQsj9uwCcNT6TTFEcpZwP4w55NdB4NpsS3IbRSzEaJt67DKnq2nw48wrGlfyja0nJ9MPFmcOrR8H7Ef/AsPo9jXYsYPmlQ7zATg9n9X5mqRu5bJGwnm40hPLeIjOoWXIHZl2Oh/sCtXjL3Z0W2Fohkz522kZSqWo6Z1ot5YmCEqAQp04dV2dy1+5WOn13I8wOcKd1H5Xovrg+68mOQWUrRwpKMoBt5+xRydsMqh6ugav6UdRrOBnjTMRwsv59CE835W3tK3mCpjJckOvltSFaLPLRgjS89pNtwkywPuXHhYvK+JfCAPXWTodXcgw1DjdZb+kpTD+nhVdlruO4K9XYu66E92c/J+lMCdzdOAwzPs+A3KhSuJKoS1tVbcEzZQx07ImGuQ2mcOCdDq1NkUax7W8pQUMctu+zhqib6bA81hRbPiVi7oEeUHoNkLvjJt7Ps8NqlwR8c0UY+Hs6mN6+iZUkwju+GWGY8xDEiJzjlX0FsMXfBt1UD1OBuREYGy7lE726PN8mHuxH1+PU9F+0bpo8hp9UwVt/5Clm/gDtKxWARQ2NtPhkINu0roE188Jp7ebjaFidjzHSjeDvosJFF9dRpZYeLE/XBPGIYhqsa6QUTkf70GN4RdGQUrJP8SfdOFjm24srxiOYeHTyGKXPfGIv80GVIkhInYWuog5oIr4JNOsNoLLHG2/MkoDK2yM56UESG1ik8dBAINnZPqRFsuUc0qaEohtn0e/GQGh6bgLXbIIxW3kSR3+PB28nLVineJzPJVfR1PganrkiE3xPnWbfpokg5BcKjk8Ahk/64NS6ODy6aioeFbYmxfDryFr7eEhXAwYbdGCSnSH26J/C6l8bsLClEm+qX2LJzhz6JP0LvzisBoPeTzxULQ9iZ6I4aEIRyRss5dkOT7lRrBzt9AqRFK+y0JlAasscpJliM+BglAa/urEBrK8ms826Qzxo3EqRoT9B87MRjm7qALeuQrZfPwLWBVhifNtCfiSdRV3dYzjo9AjsbM2CWVYSZG6dB4V76mmrmhaULx/ElddG8CgBa1oSq8vjUsaTZYETNivehe6lP3Gx0TLycNeBhDlzyO3cLriz+QMcvWXO20+tYuM5EbgpRIgu/NShPp9ECnwvCJ5O3SS7RQxlH3/jEWZR1DlNGUVL0lhETYn7KpdzzNJrdGWXBPx+p8PCG3fR5iePoTpUitan7mWB2yqc8CwG2kUK+PmABj+RmQL58JzsevbRk3ebOLMxCervWuDspj/YvmseKNTpQH1mCrp+tIKcvt38olkEPO7vYSGVvaRffpwdAx5Q0/In9CziF10vOkK5D0dCb/5WinWMg4CqQiz9bsdh4+dhrfITaJq4CdzmneCTS+tJLcgMHss5wY3Ji1jsljhf6tOBRNs4nvrfDzpmdYhWyw7gbRNH/O46DYJ+EU/LP8eXVJZwcVAiKja85ZnHkL4XzEX1jA9w4e96StrKcJ7XosyWuSTpegjfXLxH8qE+3HFIl22DNuDM1igSufkexb1Hwm3POxS3JBivtduj/Y8+OnnoHC/aGoezPSOgINUd3M2s0DpKEOQLayhWYDHnqf3APfvyMfTHV1gb2A+4qhy6phRg5ZkHNOq7JLRsH0HRyp/RYUsJhO+Kg/sz5CGyeJinLKvm65lvsfTdeO42N4JPGdcA3y3BxEte9FJHEH9uWQJZRn3gt8uHj+kfh3WJ9XQxkGD4RwicXjtIBh2uFO4uwN57b6JX0z5Q+nwGmz7VcO7osdT1QAYOOwrwob+r0WJKKcaH3KTZllPo60zkeNdgOlo1Hz5pTMBat5FQI3Md/5WrYln8MLxYfRPs4s5jCktD2xUxqPQ0BkeZObCjVQqONBrz+wN93HSnFcp1H4NKiQEXHxgJEqqFeNXrPL0hT9jiZQWFme48UrmP7k8dwVlhURhUP4l2uAlA9Iwv4Ko9EiwdeuBToRZ0/m4g64p97BywBOwU5WiZ23I0u5PEx2tcsGrnVL7jUgk79PQg8cxUXLP9JPh7edEGdyOcdw3xyKAWlbYK4d4LRrC5y45F5GQhdqsfPPc4wxe22tNbz8/85ZI6+5z2op23d3LSW0Eom9AEz7SnQ6T+Ub5/X4XbwpVJ/JgEanSOg/8j7r76gXD8QI9/ByUzJCmyIxkRCRmlQUIp/ZSGFioSUipSslIoESmlHWkiRFFIoUgyIspIS0NREp3X/zyCc3cewufmc/v+PioWP1T9ofGKYZgWthhji2RgS+Awr9rayZoa01gl8zM23tgBDWM38tsZ5eRWmoeyE80xqUkAfhdlUcJP5Dez80D90HuID87iwnmimJWRgg2KJuC9VBqvdY4HPdcnIFqiwZ0b5GiMfz49dhUgu61faEJ8NYXeC+BfI97w6UcToaViNE06foBkSIFD9hdjjO5dFFlnh7+/eOPOC1tYvTOa2j+JwcpFz0G2J4YdPE6T+PkxeKayDmN9p0Offhm/8DyGqll9mFM+EbRuOsJPpS5SWn4Sr9ARfuf4njYNCcEvlZ9kOe4kbx/viUWlxhDwYQKNeLGcKg1m0vbSfHh55AraXQnjsKmL4VzRBw7LskPjXdNhV7saFWZnwvmuOCr67oOnRVW4rMSMxESW05g3T/jxfyq8gzSgw9aRV6juwHkVs6n7xVSUna/HOUVjWffGDY5cowkRdAcl9k0B47gBfn7hIf9wecQD5k9hX1Azf39xE0OX+ePB36ngU7IK6urlYEtkE4fWp1Ot3znapOEL9/Xuk8ubJKr69w+NPi8Dr+BByro+Ds7GveXY/z7CXENTVrhyCj3f7OSQKeWY12MIPxouwJxxxRA/Sxz06q0w0+kBuLjJsO3vWup7/gB3zcihxfc8IMiiG9bVRpLybEVQ7lrAbpb5cEz0L5/wW4Lcbk4jz55He/M3HLlxATUsqcZWK4QHh25jYu5EnjV1Ig/+esWnQxvp9PVM2LVVlvNLpvG7jhTo3mIEkok3eLjwP8p87sHN65Ngt8R1/F67h5umx9DC3t1kPa2Qf2iLwaW3JdyZkYK5C6ZAXVkHynkchGmf83D09DiwqYyH7LdKKN8xAqruqpJfeANZvGmF/fOCyUJriH3m2NOUrkm8qvsEP31ry2t/iMGJOylslSABPz7ac3d6MMTlRXFrniEtvSkGk2IF6E2yI+2xkoGut8747aIvN8pLQoqbCGo+WUoTzaej/KOF+Fr9NIkqVPGpVwrQ0PIFtG5epnv2KewjZAxeh8zJWG07X/cygY+inqw07jt99BEDTZMQePTfVIQpx+CN01g6myEJF6vaufHRPh609abxUhu5ff54OGqnyh1fYmCORRq8eTKb86c38fLyFk5puIxcYM40PBurUxgura2Fsg0bWGryXda0PEMabs6cdF2KA2fOxfULT3J98GK43DwONkvlYcPvh1xpfQg829VowMoX3mzQxcoOMazdkAbpWQ+RHmmA09TdvFDMF8/vXYvztNRpVEcsLTJ9SzNm3EB19zl81XgfeGSoQdOs0SyZe5ufJfhAYsMSFAk2pq2Dkrh8vT7rP/Clbcdz0UdYFar6jbBmcwQknXsDwpPC0GNBExwXzGaZmCWcny/Ms+//A+GxlvD0eBKt3bcUVayn0PpvsvhGVZbs/jXD0a/RXGd2E/QPLCDxeZKQPt0FZ79ezibmryhfsQy7jO0h3W4kmES8Qeulz9nHbD84LNCCMeO66ceDHpBx0IGFo7xg964FFDo1g9Wu6LGIqC6dThfHJoXpcNhan+JdJuD8v5H0Rw5pjMZGlHUwxwH5WFZS80PLAXPaZ2oJ/VvGsE7oS9qxaDV5rxjBf+JcqFzTn51iz6BS8V0Y7bmT05w1Qf62A7h/no9z9vWQTftlWhU1loVjjXCEfxNfHhWFccsPwMXl0tDpPQitWz9ST+UlLDZtooNpkWRd2Y6tv6VId9NHssjLxL5dSnDB7yD/vigEz68cxikxecQh98AnZxHqtL1ns/1XeHOFBxbrGoBkwVgOqv6NjR47KUR7Bs3r/Eq5nUVUPs+Gvng9xvvr9oO1zTh47ZAMZu6+/O7edjBSVyMBaV1yPtwOv4LnIAercvNQIxxZLAuflI1hqXoQRif9ZJs/D9H/uAI6LKzgqJZQfDpiL9c2nqM0lengPaeMG3drcshVEY7b7g97dnaz1bytHN81iNHJF/hvogso3tMHb00jaDUd4PkrRoHx8nSY6NUM/eYn6F6MESpPc2OD6UBmpSrQdOIBzBsZSks9HNhtwnKa/zMRbD9p0g51K94otRKPR3xFv91aYJRgQA629pQ0KZZt9SVhhyTiWSsbaHFdAjpay0lLvY/Se3XBXXwd/vAKohWCDTCj5DC7jNiN51tW0omtYvhJ0BECetSwa4slFGqKcaqhKy3ruAxducgVQxYwSnA/tWS+wBbBpZA67IXRQpYA3i9ou/FnnH31PHw/WgYX01bAVIjEJ1uMUHWSHYoMX4SEiyNgpkUlTytKApVAOzQZnE+iCZZ8qv0z7L39hKYLAq3w1eVZ48dBa3wdBbanwCiDGG7p/sspMZ/pm549S4y7RIJvN/DgaBvU7jOE4sDz6DK+BI4WrMNzWZMhyT8EHfZuxGUfulFztgpr568nm1ljIdHbFjZENKALdILmiRU43/MxaUjPgWl+D3mSvzgcHSwg/6+WEFX4niVK4zH/nxfs21zErQ9i+Ud2Ba4dTuH2fm98tnYy5d+dCIm7TvOrCZtZtFoQf4xugZRtclwX4kNPjBTZ4mgB0zp3jjWYCnJXZGGpvx1MOOLLziNPgKj7fdLf0cMzD0WTys5RrPIjHjdVT4UbT/TwzdptJL0/gq4cyITG7gCQc7KBgu0RWDNQjtN+28OvVoDzPAEmCs2i5GgnLGmUBcPSjZRcaYXDF25Aj18wvDGz41+LZ8K4JUrQ/DIaDtrKcUW1M8fY9NHhhQWsV1aPo9LHcPmq47x+kyAsCfeFZwn5OOi7C3+5JUHGuhE8++lxnrbxGWa5LYW1Gj6gLy8PMrnaCCMGIa5MDFI2drHFj1coNcKF/bAGbaQzYLbZEq4TN4TJN6qxJ/sDFtd2gpGnI9jsb8ILh7ZBiMQWWPrcHzyCa+jtLU1IvNYM9nqhbPJ2My/qnIYk9YNNTepJakcGKQq5IM+Kw1d3ZsLTjzuhzVmArHK7oXnGJM4+txKsGh6S8kAeBd3byg43mBI3ysP7XSXoNsmdJGTL+Ku0ESqY9tMO9GblfWEAW97zU/Nw2PVMA7qV0nCB4gFgmy80/7XX/zUX66oes0FEGou71ZJt8juQva0Mqz1F+RXX8qfhRtrQKc+3WuTxaMMutFndg1sPpsKniEBeFSQDP0Uiyd3JDx6jKRgN1vDldWuwT2QfPM4sI+wZTWqnHDi2Uxb23+qF/ySy0eFjEu+cmcw9LbEwrr8eG3YHEf78B/YCB+CblTCUP3OmayK5vHb+N4o8NoayLUtJom0W29Ye5IWHOsDoczL/kpGG+j+O1Czrxr9KP8CsN0PwwDobt9zdxxo+Z6FYtAQGZHux3dgIZsue4QXJUrilvR+Wz+1FNwcvDh57nG52HON1zUup8p0A2V2eAlPGd8EJxe201TsYb8ve5XaLdnQaXwVBxxbQh3ZRuPl8BdiFG0GLdAiFjIqjNr4LtqKFVK4Wg6PtNqBcpCJ9nnKW1Gp0+JGXJAx9P4lPcSvdGjECm8qLYNoqDYp+nw8LN1byLyFTVPZwxJNrLKEj/DId8fMmhfSxcO9PCNXlboStY/5QcX89iy4VQfmirdSrNxYeeGdjZvlUsrozmbXHrYcI52ZOmXYS1Wo92FtakmcV/eThqeOhWPkHZ6zphb7qQRS+F0+y28MwLn8xJyldo8reR+AysIx37hkPpzrPo7DyJV4wbQdui10NT7M20GBkCLdHL8a7rZFwPS0CrHIlQDpjmL3nv8dQQ18qWXQJnXZUc1N4KH/beJ1UFo1k1csaMP7fSBCXXQRrVcZiv8RPXB81li42nwIDhTYUWtwGctoxtC9oCD03aoIiOdG5lhpqspSHvOmOdKWhHHounEYPdxd+enIWq9f/opM75CEg9wEV3hLDKIf3dFL/B54Y2ILhBgX8xpVQcps9V1/2xZ9T9CD/oTUHTlqNIgUK8KpxKnUVf4XcMZ4wL8KGvvU7I1kvgeZSMYj2P0jX1d7RF837YCibCHUll8Gg8w4L8BSoT96Eq++EkH27NuxVEsBHKVPo4sut9FgyHPN1O2CCSwE4SteB9P1leG9dKvrck4Stt5vo0lEbyhj5iz9/P8AultfxYsE4jq+zJglRCWi6OYNmOGlAwf4TEKe/iWxLvXBg/CAvfDaIVw7ZwlczMyjvUeblazUxwWYaDGn9ZT+zdDBLmgsu4cw3O8y5yz+MPQI3opFbNW75/A9zXwiB55RCsDzzgK05h+6te8iLaAfJfUvA1OPPeVmPAhzf7Y+f/qhC+oEU/m+tOd5JTKePtXGUc+IiJ5w5Ah73G3D2UX1alRYEsHIirKu6iqNqYjB5bDWNzXhNdu8/cVrIMASmHQf5/HqIkHeAWUUjYcW0XJ5c8hgHC2ZjZ1E9LS9YgCKOv+nUg9HQvXcMX+lexG3zNSEoczn5ftxKayV/k8FIY34x6wl+ftvFJaVWOPvSEugfp8H7tshClnA4rUypo/eyGnTlZA2KTVODcS4p2DkhnUfk+5Fwjg0HNgjA+JByvvtwJv+vu3l0IKc5P2bHrIu4bcpfNitmyvQ8j1mmBE1RQHouwvRotxaWpFqzzc4Mrotw4ITil6DqFADzgq7C5M6xsGLZZfp2xwDL5kpR61kFnl5wj6v8yqjniAHdOnwTT8Xq0JxMQTiZ08qP85LJvSKKw+um47sKWZ7iLoAu9cEUNqoVttdvhXlPdGHoWyzcmaxEIsbeoPY5lguqTHjeTyWa0fqD1xZNpNm2p2nlLUmIvfSZp+0owYh3QagZb0CSwSqY0vaTRyZPhu6XM/j9DSVabY0gVZABWnUqmDtkDHrxMTiwVQA+LFxIXT77Yb9FJzhlzaARU0RgVakECxsewXlbrqNg7CqYr3+H0ty8IPa8OtqG7+dT8UMsvXcUTLOdjTNah1CnbDLO8pLB0VXJ0FAsRiLx1jxSQgY7dquTtbgxdM97xOMGrHmvRS/XF9+AXpsO7Kk+y/6gR2NOIzVvy4HWrpFQJa8FAo8Kac7LD/RH9yQ/E+/A+CxFfHqkktVeOpCDdjk21WuBoWYWLJa9S9W5t2nhHF1SlC7F55MKoLd4LiiLa/A83ZOQ82sm/HM+hxfWP0JJawtYkpwP/WeluUxuPMr98GWpJT9ZaqY1efynBNuODFOSyRm6OeYMV0tYkXWqBT/dF41WII9uX5zoxJwlFN4sAJkfp5GXbAV4L8xg57aLWCxhA2H/DaDprHs8LPsGj26+hq3Dk+D5kz4MSF/OoR/mwcXeHLZt00H1CYE4V+s75Pjdw+hgN5gwShIKz00Ak9CLUOKhA09z10LPDSncUbOPWrcpk53vWZBqiIP4A+JQGnMHJx0SA6HK1zB4zpgkL4Xg3g8SVCM+jAF5Q2j7OIyCZBTh2RNf+OdoQPNva0JJ9xEqiY6hu6+O8+/mbH41FAVhbVHkMlkPfi0sgN5bI6jIR40nsh8qd+vzjyO7KfFVIrd0ylPa1M1gtW0EGGV2QvRzFVK21qXpCS74N9iMR/iNIcHx7TQwLgsKWQgOj1ODiweLQb3pOZo5fMJXBetAuTGDDw6pQ11HGu7taoO+XRV4wEgdMgRjWGFMKV0+qoRRDwpoyuUJ/PG8DkdKnEK3kAg6lO1Euj2WsFD9Ca9Zuh4WTO0HlUvfGMT6Ue3RSDBTUIXueeo4OW0GxIpPgc6/anDkqDQsVgvj+18P054+aZL/04eblriTTLsFnvdZSe+TxsDayBA69qeNNs6oYiGB/7j28FhIdghmX90uFlrtCCXGGeAvowppy96jzMxu/JQ9SI1pT2n313Cw/aZKDkLnIKWhnG62BOCWOgnIDW4jqfoVtPaeM157pkV1sp7woiSEA/MzUNLjJ92tDoBv0YpwUkkWlix/y3rv+sjlyh4q7EmC/S8/UNvxxeSTEYEOP23RYMFE0H84hdKWLuOs+T68WWMLSA6mgE71TzidEcXZD86hb0kvmPwYA8Fp+2mXzWPKKtPgFH7Dfz6vg392u8FhqRSmPhDjt2Pm0bWXRrDQJ5ZFYnfDu9W2eOdzEGr058CmRYFQ2DaM27WOQblaFwaWT4KETWW0UacD18do4CuFYMj7T5s+nK+AP8ayJPsnkho3WUHqXzWgWnmWMPIDa1Ndfhr3lFtTn8Lre/1gPv8TRiqb8Zn7m6h4kjbEq7hw3vRSqupcC0uqtkLfkWM4RuE6HPr+kfuqV5HTrhfw5qYwXH/Wi7v36PBV7wxwN+vC3yuD0PhNOUz95sSlPe/xcs0XSnggCM3CzlTReYPkB3x4zMhXdPXtPZyqWY9Cn/ah+PFhOMar8Zn7aPjlqURbTKPo3ZRrqDr5LZY3+GC+5T+42KTNUSUTOOZkBfSOFgRl+3+YcLoUwq5NoG2/F2HSyIMw8NYCXmx0p75N3+Gn4lh82GUAP3r3oP2zeJhut4D+fPLGmpOSKGeyi5PtnrN0VyT+/hVHoroMgXc12e63I6qEvoI9wXtIeNE2PuToSat/GMOZ3hu06LwRKI/UgnVC9/lv2jb0vLSWdSODYMa9V7TLMRy/XVtFpXqq9Lb1AuZ2i0Kbli0fBkGQlBlNN0uv4/glN+CouRpM2D+dn7hN471P9oL8bh1wkdwJqbV6tMH2A/0N3wsmDcnYebkPG+cfgHftCqzkPB12HRKBL3L28OmdBF61GsK0/OWgnlIJ1hu7OErkNaz7ms/RwwO4algRjt2XgXGuQ6SkJE6LDAH+vQT2CdwE6x1Owb+v7/m9+QG2ODIdfHf5splgMyenvKe166/zoOgpNghexXZ+3jD11CPQfOLMy5vEwKpnEY1uWUqN4cfxy7FIfHE5CC4q9FFBeSfolkpDvKgEH9IwA4vKDbT+yVKY9EOLOySeQKOjO9+sGYXFhl2o9yqHn6WuRH9XKVitrQxvjHdCTeZBjDK8Bg4S2/jhilCe2D/IO7avRoNzp/jX/ImA6ZsxMakV9kRf5c66YPzrKgp24VmckhQA0r+Mocr2MsvONYHV36uxPasUniydjGY50ujutB63HzlNZ6W7KW5+DcU/CuQadz04XhMOJslTYfy6LXxfDjjh9jjYpZRIJztjwU5KHX2MroPnBW2oU54AFXHqMOMIke9UNxrlmogNLt0w9XA5vz0Zgi7rxHFzoygsuauP2bEpLJt+An/+3kU63rVQWzIC68R+4j+ZMrymkAsK38fBmwOSrGy4lB67fsGBtfm47qwX/CpZDyfrv8GRA6lYv0qAhHTEQHjHBProdp93aURTUWUHSyduhZla70BROpBbMxU4co0L+X2QBN3D7nD5YS7vLb9ODZbi7O+qDM+lnEG/ejOsvSMHxyLOwQ8fgvWfNvKAqSNeGTqOR4/owMivR6ir/jvMKQrCwp132cjJEQ2RodUqiuaOKafY118o3z+Adq6fglOq3+GmLQrUGv6e4mgdrxrWgFn2p2Cr+SysjNnFhTUTMLnChw6mTcabtyRot6ATzbkpgvuJ4dCTrVjgbop74mtIVuMQBxeOJ9fx0jBnsxI5lmaDUO9DfDFLAy6cHUNhDa50wmoG3bixk/fIleJ73yI8UOgOv5K6eFr8NLaZJwLLb96HfJ9ptLLUEt5qT4GDCTfx06//KMMjj7/M9aFM6Vh8bSgO96TX0e6BAFrnkoo982/S4bcX2PxoMvxco4C7TW5QWpwNH/lhDPa627HCaTw9unkVq5on0tsHYfhsrxx53r4OwymKIFy9hJfcFgSzYGXc+jME1obVkd0EHX71R4Da5o1igdnyPDihh27XjsBTReMh49g3TvhqzsImKWRafZUCSqTQ591pOPL1EMoIPuZ5MtK4oGYSxIhcZlq7BtPHuIPUnkiWvmOFPafWwVoDhqqCFCxXFyOnrFEgIuRJvlvWgISOHd9b5gInVkjRzUARPHe/Gm0OHaBxAon4x0oRCm30WUKlAVc+LAWV3zvR7wnTAQ079DK04fXiK7F3WgUv7DGCBuxnR9mJuHiZC+mneZG4tiyZw3oU61rFVWMJBP/GQv/XSSDjowhOVgls/1mfo7XV2XNdHKwqFqf0v0JYuNAIqr6n8EsdPfBIM8Tn3tE0T9KKZJryWXRpGm0sUyXzR6owa/9HrlbbDO4piqB11JrK/G9T+LcnkHNnJFS80wHlPDccfdwPTnVepacFPqQeLg/Z7yzArM6C2+1bWEm1ij703MfTuByLZ/vQR4WxdOC7KSSn6EFAcAOdLhaGbxGz4ORpfzaUeEmTVkpQ7dYjEF6aiXYiGTjupghYffemdU97YdRNNb54VphXNFjRgEQQPdLVJPdTQfxv4iGqfD0KZhc0g/vUNpoZOIV7v5ZSa/csqgr6Q4PVaVT5MYBnnbVjm4hxoHRJBT7Z2PLRLltK7a3AptY6KDGZSDPMMmC/chMej97K5Z6aYJfrSI9mhVFrlwc5jrjBex77YZj+Icqovk3P74TgKmVtmsPjYPmxLfhnmTete9VIh5fs4M3na2lnzxH6M3AUPpd5sMDGGHYJGg0jWRFjMqfjxN92NFTwBT2EDnLXP00Qjt7Aaplr0RLtYPigOrTv6YfjH6ZgaX0eCWnZUb/LREw9VY0ySeIcJdwITdc3wZqbsuBflcNCUQ5gvTOSIOc+fu/xhCsFGix3djdN1b/I7SKNZHpKHfSmBtPMwEjs671BxwQnw/Xn62HlKn+QVxnNMl93k0ffXhgrZAHn5swDUZk7XLG3Ddb4KtDRX3EoJBsODWXiUL57HBR41LIojob9d3VJZXsjrz/0i/QPfETbWxPw7r8IrHm1EW66CNJojuJi+TGgEekM+TMs8fVDRbJPyuO2G8Jc+mwP+UjOo8z5k2jW76WU/lELqtvLcWTCL9g2eBdmB+yjyV+TwP6mB/VMc6UntWIwM+s7hh5QBd1tP/li0GLSTJLBcw9/g9aeixzUVEte5pux/fk1Lv7ixOenjIBbJSNYZI04BQidhyDRvxDfpsalM+bAmB02vNFvJLy5VI8Pj6mBo64JuMwdhzNK37CfdR5ai/qR0opnOGRbR0JtW8Dj/jHSd2NwvH8S0m6XYWSxKn8JC2OhNhUQWiKIjSflad78GDxW6MQbZ6hC+OpCetegDU19iylpdwCf2PyVFTw/8tJ3YnBFzwum6d+l5i1GELP+Nd1WXIgnYnfhN8dqzomZjJ7ffqLhTzd6tC8YdboE0UtVAtoqZbhh1gkWUkxh6zRvVOy2wRV6Gngkr5Y03TthVMlVun1XCv5lfIXj++fwv/L7vOT7ItBe8RQqdv/Dg3eLqdLEGg+cGuCWE4pww+cZrzzuz21v7Tja9Ad/erUfD1RsB+FPiZRxPgp2JRVDBJjAskmlcPfAWPRYkEj1ApJwK4HIOaGXP8m08EqJQCyftYhe5YnAoYX5/FvsJE+TegMqebFg4iaIg27H6P7Uh3xklx6tVX1D9mPGwp9nzylzjjH/Un6Kt3LmYmnqZrxb04J1UjYcM+sOJX6IZrUwaXgxuYxkr0Vj91VvsM605Dlm76DRw4k1+TZFTFmJa+1HUW/CRFAqcGEXn39QEtRF86ptITV6Iq9Yx2Qu78B1r1L51pxhGr1ODuavHc8XNkigfutJmpgpCftVZOBFpgge+JzJ8UWL2drTip43K8CcR1owdqkANS14D2fdI/jPr2d88VE3vR2cyjK1y9BLtp97rwL8sH3Mq7aq8oNnTznmnjAPyS5mV8d0mu9oTj9imsDFowH/CVjCoMEHnOo6nzMvreaZ7/6DbuscUHgcTAuWulO6mBdOfLsNVv2VgNcD/bgxR5Js79xDxcvdkCg4Gjrf7YLU0zKku+MAL5AdRpMeHfjlNIXVBWL41arLUHS6EgW/XaTl4l/YPyeJJO8ewFHV/rCjUQ1eNpdg99WvJDx+GhcVTCLtBT6cecyTzgRH8lnrDizONMF32cZgM+cYJb1p5o8fVlKVxETs7k2iEdmLWPrkMr59JZmlnCfSQf2x0FXei9aJzVT+biG8vepLSXb6IJojwQ6XCujruv0wYZYCOBgLwTW9ZtA5KUoW6Sm42aGPfc5b8faPVzj2ngo1Fgag4vkOsPgxHQx996NhwBJubt2PAWNXc9jZ0Rgzwxzkx0STy/q3+HEE4MYsSQjWEQcrDMcreXGY3a1Cg7cOwRSldXR0dzvWfrHCIDUnmtAmD1UFrlRnKMfqNQdIaWkBvx6zHYK1qnACX2GlB96kVGFHA+cN4bDuZ7wqJwT9a4JJdIQ3qN39QDtlrfjBtkZ4qTwaS6ut6T9deTALfgwagrbQeamMrK74g1FNAMs0zqdM43+4xlSOW8fpwIz2kaDX207P9V+TkfF1KrneTxvvTyOzve7QqvuKfGWe8Kp9L1Cu3QDKd80h8eqtoJtrxPmz7sPoeGn+MGoZrDyWQ1kz9flRyHFYWzIBvFTSaK6WMh5ar46mL/U4UTUZvoZKkb6KJrfvDGLhlgj+IzQCmix/0zMZFxIIqCbbw+/QuiaHHZrKaemd0Sw+qITtYbPoyCcJOFoxBOZeEznKpoQmtFyh0EEzvGRhiMkv1HFDQhfLzq4D1xIJ6NaeQY7mwrRvtRkF2x+j+P8e0DffR9BiuYVHhV6hGVumgkG9HNhlvAbTvVEUolRPqUZlEDphKxkLHmZtz/P0M+wwDISfAZ9IYZAI/0W9tgFUOLoZd7/4xm+uP6EPTTf4pYkf176oI69LD+GrqDDcmOzPd1IXQaH9M9IOUsKgkm66cz+Dr9cHQ/n27zT1ryuaHAWQD/RGm1gB2mHdCReldlLk5cvYEFEFG5sPg0hOOUqdHwPeKzXg039f8LblCn4xUxIGr2iBcaY2bylJQbXhUZi5vYEClBM557QpXLzaBkdaozC9SpGKXNeB9Ml6WLMlkPY8bcKUQQlstQylKn9B0N21Hu5qTwH3dGXeZT2Xnk69z01Wqtw6JRsqBNTp/NQ8VHpoCpuKlFDv2G54dmYC6HfXQoWMKK43a8essokocCgeb23eAF1FFhB6+htzqD/V+MnCsRlPQWivF8vbJ/Nz5W2sW1TMP8SD6NtVCehZNARX0Z7MLjay3eL5nOp3FWvOrkKfjoMkJXGUUj2XQbjdZBB1G+JzD9+Dff9Hfm5+AKdLmJPCshpoWrafdw+68bYf9jzqlCU0yU0k9a0pkKdWS5/2pVBJ0AayfXybn++aQF4jzvGUrEf8REYMfNodKPTISvYzXQONHv+gaKE8WV77jA8Ha3izgAOsfnIb3HkcHF72luMUpsPWrU+IPENh0OgSzXO0xPW3rPhe3h1+KCBBWUUC8KA0llInnCS/mPGkt/UlF1qthWNScbg2IIK1X67E9spaOO6pDdZKBhRReon3jgvAfuPRoHVhHmVGLiFVTVFK/DsIAg4l8KJPE8I6c2Gu8F/ojkjH/rABOLXKnsMadKAGLCnDYBKPkxwDXV9NoXjeXj60eiL7L+3jmPAa1txqALq377LCnxjav2ss2oYawnMTWahzz0Vdoy1wc0ElpU9/R8puA7SywABGrxzJY4qW4OSvM+l5oRTYXGyAZa9+wgdPO1iU4Q8bqm/R2LAfvPqRP58ekUzGeWtoIHEMLLESpaY/y/ieSQ9aHjpDQhkDbMmCkH+rBbVE0kmn0olnrpCHybX3OGfuQdy9cg/5Fpbhsb4mjN/1ETSaqnG1jR9cT28HgesIgt+2o2TOR1qYcYBWHjvLFe9XsldKHmZFCeE1SUm+4ViH1XMMwMzMF9VlGNvTD9GInatQ8b/DFDryIjssNsHjnYW83fw9VLhowpIf0piWs5qnad7D/mmhEJm3hdPHl4FfQiGGrzrIPXaRcEzBCDabipJD/neMatyFITmKlKsyAhp/jOIFk5bhzh1COK/lHzSnIAQaLeNJeZPw0rFUtsdeFNY+B9dWIXlJXKC4Ch8UEXuPg6NGQmKsMdcsKaaX9VvIJr0QXuY2w82IG7x8Wh20ndxKXpJt1HhQD7I12tDiiyBC1VX6OqhKX3sSWLXejQwNzgAvnUtqpnvx1Wcp+KXcSWONqmnZm9dYfloMrj2owIXqmmzieBtcPwnSVYElbKFgAo4688lkWh1kp/+jNLXfvPvDOJq3upAKo5rwgmwGWM+1IOVGfSA3xIRjenRMowRyko5D0Hw9ivy2BEQdxuJyZ2P2d5CmebfEIFZgJ70QKoAJ2im0vtQCLzi8AaHgEWi+sY9UzWqZD3ficlsTKL6STEGe70FKfxzELwsC0VBn+vv3IOjm7qbeg7sRox5TXMoEcOsyxNcJfvhZ7g63vv0LIqu62CWhGNL8ZPFw6VVyvG1IaUZTgMbGgPL3eEjfqc211Xto7rQ7sMKvijbFXuJLHr3wQXs/L5k1FnzGNFLjt3pe/7mKkv0vcsgeG+6b7QNzat7hWpECCI+5Ts3VM6E59Rz+dbOncRtzKGF+EU1qzIL1x2bA/QUb+JfDGdAyFsTMGlPQebMK0/+GwtD6SBS42YoLY6+DtPBudj+ymL0/zgTJjtNcu0sd+sffgsiRy9h42VWw+HYMFVNWkLhqPpcFbKOHx0ZD5zo/1Js/Cg7Gz6Epwl8g5NwBPrEljlsmDZH/iQr4M0IbrRQWwK4dydw2SROK1ddh55y/6NYiCOCtyi8PW2HbM+RnJxBDI9JR658+xcVLwubz3nwr8B82t5+lmIfJ6KX9CHKnp3HglMkUlGMBinUC5FAsDm7Pd6LSri1Y/M2XnCNek6y4D4RY5lPBoj60Uc7nqDFH+WH3TFCPfEkpWdYE8gfwmlQLxi9OoaLuPO62+QQn3pSQaW0ZdeSJw4K8DVhr2g1OPU448twoTJsqA5pbhbimPo/yvOqxSe4sORoCnFZVZutdu9Hi0kjS+LaPh7yjwPDKNG7+2oEFzhtYb3Iv9/tIwE6FfvKd8Y5AzoEt1OPQ7+s25Cl6/C5LhOadUyEl83e0bLwkrPqSjqnX+vBf6iF66PsKJtc5Y9bDv/xocQJWTzqMAsaPMarfCMqksjErO5k/Ze7kN7XSaN0Rxiu0v0OrezX92RaKTp4zYayoNOw68Zr6ahdhSMUNSrMVAF3d7zR9QTiUZ0tQ7LVRtD71CXzxN4ey2Dd8yakRT/svZYX09Rx4tQtUSwy4rFuNzTtCsKJmA6cmjoXNkX/os95SPjP9FRXvOIPl9+1Belsr/4QuODzpEdhM96N9huNAzmw5fB7Ty32hiB7mcZgNdyAi+T1WnNrLcq4/8eE+S3wQIQg/ng3y6coE/DXuP7LqKqQ/7rXsXlsF71/L8I3kt/TICXjHI03QHbgG8QMiUBC/B7QvZSLHfqLaGadZzmcm1Wgk40qvC/jhvDKI3twCl/Zpgo3HAeoxj+MRgZ/g3Z1U6n9QDIe0rpJh/ReeOk0ffMxz4P3Z2ZxXOUBqZaaYFJGA2qjH31qruV/jLFqkNXL0E4Q1qcdwlOFVyqmcSF9FfTn3xiha4TqfXl69iL6zenG1fwOq7zUH3VAB1lOMBSnduXg4dS87zbgNrRv+4QI6iBpXDoB/ZRD9SNaCz2baWB0Vwj0xVyDZXwZe+6iwiYomytUuwym2M9nYpA+jpUaBTtwBmJU+B/6MGoUB9yPQWUoRynVtIH+tNi0+KAoiNuPRLcUcdi5eiq7nrFlQS5jmDy+hBZMescd+N9QK6+bZE0/jjdZ5JHNz8v+ej99lsyjQMx1D7mwArRfLaE36E9K97oyVBXZc1BLCJ6o0IWf+Om7RvMiCp6RIKqAYKw1dSMvPG7Yq3MUUN0saS8JwNkAZfgq/5UGzpzjyYAH9fHAfZm5htEqPgyRjUXymfYWrZkmgRdsIaLx+jM4WjgSBeH1YKPgExH670eELohizv4ISckVg809dEgRT2LbVHxac7AKZ1/7QXPoZspZ4Ev0q4NY5Hmi1/h3VvNjPx8Ms4eJtSWz5eA6yny6hhw2joPqII1uHjuBJckGwLzOHmkolST9BFKY86af1s6Lx0tVT/HjRX9r4OYkuLxuPBeudqOlLPDxAf3btMQHx5FxSAEVWTt3Ez1rD6FvHfXa5w3TtiAXf+eZNiq3n0cpTATYcBYp7/AoasiuhZroytAiswooVXii3qR02diRg0NcJsGOLLGQfyyFD5yPYEiePXtqNEHihh7a+egfrEneg75IswKRI/nhcHcROSeFYlZOY5JaPZuc9sabeBlI3ieGnSSNALTcRRCdewOIWefi49SZEnlrLHwNHgdDSV3hg3kxKmDcJyK8Mu3cgOZvMo4L8qXD2mwxNaBWiGUaBoDUxEA8ODmPUO1Oy1DyD45/aYeKifRTrJAtDy0sg3NcYnTQu8a/gJvK27CGxq9k08osXXMzxpKQlZzhRQBHebbLFGCE7Njc4TY32v2j3u41oJ/ob/9a38Ps7UTBXywGP+ciBza5h+HtLiqd7iVCQ9lho65qOXxbU0B3Lag77IA+HT8eQwAx5WDNmL83JiMGjjzo4+3kVPT/3B2Ir75NOUhQcC/1MSwe7OGXOaCh8E4ZFp6MgWiQVmxRb6YlDPC+/pM1pd9aTkXAZP8sxQJGFo4AUvnCQ5RWarbAS7+l4oVKIJaivEwCfJB+w3+4G7T7T6aUIguEDBRwx4R54ioXA8c7rdEhOnz5HV2H4THfUvB/M3bmVnKE0FcJP/4Bl0VmUZ6fCfl8CqKrlGek+e4eal1tAe9iSR/fKUvtReXh1E2HNQjF0+noWN1ENJ66dDNKZLTh38QpYqiaGY9pD8OFTTbj1VJ+rBseQYuxifFC2gKyfJsKT4BrYPIEhM+wKJ2oZUlkgwZxABYjbcoq/P1aGoMSrWHDtF1dmisDa25Pgpb0p+3o34oCIGrTZuXJlw0lUsk4nMaXjIHLgNrVlPCCn2720zSwWWyp8+flLbbj2fYhPdOnAZ3MTCinfC9/emJGPozptP/iEul+Gccn1OJJLZngZHctfVP+xYXgYdzpfx9osU6qNskN1x2rUX/CAXj+7wwYhslD2SRDWm+7EU5OrQGiDIokM9oGw80k4XbAFpz0a5pwlIzkzdBR4TVFlBfNNcP/lUrI/XsIm261pT10fq61N5RO7Z4HEuhjSNxUEXTkFPJO7nztBmZz0l1Jn1xXYnX+f599Xp1teaXR+TS7NuK8AMdKdIHzYgLf9FoDrjZbcm70N63Z1Uc6yaBxrVo/i8V5UlasOT5UWwUaVaVz72A+u1CdjecRKMpKYxL9uKZPrJwdQSlXC9yViEK/6DMIS98G5Eyvw6K8huG+WhVsk63FF+Tc8emUsDv/4jc8XC0F98AlO/GPGvY9cyUNRACYN7QG1tniev2kWex67BRv+CwKVK8LQO1CGC10lMf75RNARq2HPS76MZ7XpfUcSOGl8ZJHU1dRtrwPDc6bzufIj8HPZFfq3eiaT9HcIXe0FoaeaIPCQKb59lc7nygwg4N0TGnJN5dnbFHFnwkyKWBcOM89Kst1PVXx6OZ9SR7fjlBRJeD1xLqm3bIbI1SrYe9KRehQzqHebGc84KAKdP/XB6vFsvrSH4MbnXBjzPgwLC0MgXzIS1lTPgF47CYwov8pheY1our8f1R4pwVmTNs68PIA3ixNIRTwMZe/bwl77LBK5coc1j1ZSxLdtODTNEmyi7uL7ntcoe/EVyW95wYPuO7nQzgvlfz7kyOFmeF0kBgVfR0JwhAT848/g/TILpMaeItfjelhvLIrz7tdyRNRD8AkHCPlmACUqy1GhfwIu8a/gUZsQnr8Wx7z2j5h5VAjcP3/ly43ifC54DNzMdwH3zUvp7n9dlH3pJiWunkyDz8z5c1Muv/zvBhh4HIGL/Yog/jQB6802UVnfX1rg0UPLJ9yCw/OvwXTBybw3yQrrX73Bi2ET4cPGh9gOi6B99ylq+f6XgrIDoMjiN+w3VIJbhfn8vHAMXRkvDD+1q3hMniUvkM4l3y1DdG9eKCdVRMFRuQh+1RpI94XH0dguSzh/8w0s2n+eR9Z+Jt/5cpThbsMPtj4hO8lAerzmFX1VsaNiHQvgT4zNjxRwUa0RzM6aSx3Xo1g2fxx7Ha2i1McS5P/oBIOtGWx38uT/UqVJdsidLqhe4zr/h2ixJhXUCl1piuwn/s8tEw48nQpxC/vhtaQHfDn1gezOnmIuSKbDSQM88DSaOjd7UPzy1/yhUhomaOaRfchLcDyqDVK9b8lCKxxWzN1M9lcHIbtuN6g5v+XNQzNBW+If3wprhLHi0Xwu8go4vcqGcmd7eKIYBx9CI+GEziUoX6wNYVEreQpNogsyU0m5Zjxn/RXhD2cE8MPma7z/iBSa5M8gmfyxILZeiW8tEqREMS2sXtPPKa+7WSrwFH0dquP07jTIcLAhq2JVkE4Wxrevs0k/pJ9URRshJEsI/HKILVbV02K13eQ6eiYJX9aHIyUzcV3bdrQ/4g2tHy3Ruc2YZQS8sa0ygfMMdWiexXlo8FOH09Zj6HVACYSfreETf79CbdZYslPypXLDieA0bis/G7yGBUoT4fMvT4r1EaSQ6BZ+ecGFdl2wow0ep/nhyHiwkziGi4I62VxWH6IihPlqx0He15FIEdp2YGg7HmdfHIQIhUUsVjKWR5cu5bdFI8HZKJDfGXhCXKUR3Vv+meJf5EBWjxPKna2GCVFNMFX2JPwTVYGJCUMQtWs9BsgH4KUd0VC4/yt5J2WiyIl/mNawFcLD4+GThxgEvBXBFeeF+Pv8I3xlzB78rm3KsdsO01KZRKzTUGc/lWMIJwVh296F/Gi5IJXsr4FR0XdxzyFrfKfew+INp0H17HiQmiGOATsN4fOoWbRObYiOWDuD1fhWvP3xMIolxVCI3Quw9YiCgdfNXPDGEGwXnma90fPIRHs6B3bvhALjRiwuPkjfBUI4V9yQVmhV8qIOHbAR0qdLPRoQvuIWFx8cCcF293DkvuekGbSVDzxHePH2D/uYiQHWdUDk1B48kRAHs/eX4abFBTB65w5IeO1KswZXoeHoiyi1YzTImK5iUJxI4726Kf34P5L4K4Fpwn/I3TUY4sTGUXu2I5nMEIOa2Q78LjgP+b+jsCBoGl7BKVjouRayjZyoZZEt/TBW5VJrcbg6x5rSrj6j8iRLvjJYSW8e29FIi+tcEqOHo6+Pp7yYJXjxyST4XYIooOsNXwv08YDgQYio6aFWI2PsfyXOHePSMU/ZlusahMDdWJsXB20hpah/vPdLDGxLfgn3/k7Bz5kfMK0uDfe+NILPpUJgl/4IT2wt4jWyc9mnuIQFhKNJQmw5zbuZSt9qJ2PxahsI+qEI1VHlPFK8FE7r2ePHLa7wYfMMis+cgQ8uyYDshxAu2TEXrXJloKLZhT8skIOigZcwLyOZYhIfwed9cfTBoBnAoh0WHh5m41NC8NWugQIMdjD9G8Lbzs7oMqxMnZc3YbD8Snr+6QzUy8pR/nsVaFqwgYtyDdBAxx0Xld+GA16D/CX5Pmv4BJMOiOPz0kJ8lSoHG576objoNVwcuY9tTK3hQ9Q3Srn+jrLLomHun4Wc2ONJd9rNYHrqQrC1DGQVWScUXzoOzL6t5IBX67EjugsnjTrLK1an0utrBjA59wPUDZ6GQK0UvLP7FIzf5g5znxnR45+ePBgwjV0bn3LvT2Oo9/NE49RlNEGunR8tVqbRtZmg91ielu4whBPn50HIan/6kKkKviq3qTMpgfYcleAaOVcq28a471wTfUs8CM37PtJQdBaXzjUE5Uofyr0kRRu/zGHVPjFqzXOl4W5NzP9yizqyxEkuuBmDlAwhq8sGXzc/RPWVZ1hyrw8YbcjmVzH7+VhCOi0IRkzWaAOzMDFwK//L+4qu0LGKfBRQmkOZ/fegI1KSHsu/4mvfFtG4H04Yv3/y/zf/N1n2N5UtS4MziTE0I9eL/54kfvDwLK+cPIKW3fpCLQN76YTPRMirG83Dqj+x9MQslElRwWzZIdCaHcbFRY60I1GSz0/aSXfEpeD/lTJ+eGMja0siKuzSpv9eDXJU3B18ueMjP7cehxHbIvnKRAGwm6sIzZXXWG+5Gg2HW4KD129YX2RNtdMb2W7vEN57rcrafbaw7IIMbEtXpqH57zlq2gHSMpxLnnp/cGmYEO8POQM9Wqo03/4LeCuogdJaFYgz2o33xaIwauxyfmvcTzOFOnDxBWusX/yJcx68Y/F0UXh15AtlXtdAlY0PYFH9MAS5WuJ/YzP50dK/POpuBraI3OS/OSNAvWA6Oht1kAhNxl9S9hwifJC7ur25fpY9/lNQQAvZGRisPApGdF+irwa+2OlxDdpsJTkw2I4StV9ihet62pl+ktdmuuKhT5NgtZslhUheotsJnRj6az4p7/kK1yolub7uI0Z/ZX7+ZT6+sRADp1kbKTj6HFpX9LAeCLDBHAPs25oJ2zsXw+cnlbBlfS32PJkKNjyS1Ivz2Cz8O5lUtfHJUB8YmvCYn4Zfwxu/9OiNVws5T1WBIMdKMHwiQpPHmeHZ/XvZu2Ml7Bs3TBU73tOmqfNJO3k6rEgAUBZaBaGBj3jVMQn4vYTB3NKf76IqfU9w4D55MTrx8SwHVqmCl6gy9IWdhBBRNxxoWc899XV0evEtsCl2xXGDVyF5iwV8KLIAuTXz2UggAxtX+YDJtH4aKlACFdGXsK/PBMokFiJW/4RTzupg/vIBe9rlY+N1CZzZfBQNvE6w1+vHqHYqn+YVXuS1tatZ+qoMvLC4y2dm1dPubavwQkY4zNJpxr4Fe9nNsYADNbWosOYEGvQJwqGlxVTncYc6Cpbw7EnaKGlhSzUdB+nXDFP+LrsInk2WhTolEbj8+DUWfVzJJho68CdLnDbmqeOptvs8tLuGuu+Vo7WGBzsJacJARhIEdf7mxoBT+PVgMK2y9KFNDrrwapM/nngfhWGu7zCkfyQI7GR83MtkuX0ETdx8An9MuYEP//iBwc1hHqgMIF/phxD0Qgfe1TD9eRtJ/61dzGZGl/hbdwM9Q11+t7YMYz+FUuqFWMpOE4GBZURWFifwkqkCpF3ZRQGXRtMGax0s/LSBXSRn8R7xIPp4QBzOB3fA6KQgcD7xg0t8fsMXtVAK2XOQe9bMovjAS+R1V42MsmXh69Aa+rnNjFJDT9M+NUPQOh2NdnWJlGURDV+eycP40fncbi4CYnE/yenldVjHYsSqu6Hg1Fk6++A4JxTcochTK9nJsZbTW6RB2SYPlbxrUG3qXhxv7gORfTK0OP8Ajd7/mDUUT3HZQ1nwuTgGmjcuojPrCnnR1Ris+tTPZWaXIDsIaIWSNbQrHAEb52F8vW0abKsbxD+bhdi8KwifvNiN7qlFMHd4D9zjaHSrO4zCB37A9QUCYDVrE0p/cIB6Og7XYrXo59IAOB7UD5O0i3DNyPlsqDNMxuIaIHRXF2wcDeCk8Qpe7tTJ+t5t0JGrjh4Lb+GyNXugoPUeP3YXB+1THuR3vpSytQZxSch4dFJPpooxa7DXdBnXGtli8MAE8HmqDfZFi3H0UW9od03DvHu2eDNYnYKmxYBHy1f+42APAYHuGP93Ikw9FIPnnZ9invstlugeAaV+YRgwcTz/nvABXmg0YlJ5IaCNODgfVqNtTxvxScZNrDU9TPdGOOOv1/KQVXsQ7QNE8aXMAa7YrAc+RbnQZ/yLlrVbo6n2CTI0H0SZ2+tYrGEhTkxQgt6fWXBy9mTodAtmjYoMbnV2xLebmjBkXg9Ml34Lz99spPTNa+BT0DN2PWABN317cGTCKL6ocQtSQ8+h8NQANlllw/ZzXKlmuA9fvohFwQ9KEGN3FDtWuvO4qD7ec1wei3LMSafiELlWjWDBh4G08Xssnf40AR4O1+HjM3tozadgyvRuoeHve9DqzXK4Nn0Yr458C3HSN8lMhmDg9h0uiTfi6BUVKKozH8/8EuN8+xrcN02ZZBb8Bz0LxlNAjgiImKqhdmcbiVgponjbGXz+bS6cu+8M1t4b0DL7M5eq/ocy1kag/2kYVrs/RZ/6Qaj6PwTAByAQCBQA0D9IlFUiyc4mKxKKOqRdpEFlj6RIUqmkaGiIaJCSVTIbor2EKBWFikpkREUKpeTegx6af3oMF2dagMrzcCq5S3As3Q32hyiA/Mq7cEo3Fv8F/sVr40fAKGFNHDphxB0Nc0GpQYT2BqmzWbI65HycB1ZJweSy8SOo5CyDmnvGZLXxGzhavYUP2oP05YkDrFspDMVjRWDgqRPnuqyElUMJ7DJzJIoFmvBI5wkgcvwlr0lwh7TpOhDvuZdqO2fQDBV1ltUtpZhziVSaVsr1Hy/RwIwPbCHUxEmSU2Cop4YPrbpJU+TiIFlHiFb5+cKHSlf4XqiEck636EeyOZjXSoC7lySJKV3ihd1hNPplDv0TvkvHXc3448RB2Ni9E4wuhsGIYDkQ7wvmJS9WgZ2cOnrsKYe+tyJQpijBkQbaMHkRsN5cbXwXMgKyQgvon/QrfJo/QJueeqD54GcOaoylVTN9KC7iEur/tsbNuQowgB/g5qwknPFagBqeJtKpiw95VdMMFJGxBOFhcRRZX4QRojrwSaOIxz7ooKNKNZxsGkXjDdJ4jJ4z3HWbDuOCWmCJlzH+JzwGuo6ZweUTAXS65jXcv1+B2xcwXhHaSzUtwdQv+ZIjhndg80URmLcmk5MXBJCmowvul9kPG6IG8NS6leB68S4cXLQB/XWfQbeUAkxI+I86z/7hyM3RtFI6A57Ju8Cy4okAhrthR6Q7GDvuoBdSlqBQ40FT7NJAuP8pTtC2huSwdvwSJQZbnmpA74pWzljzHKY/mQKh6Q/o+9L5/Mh4O+3KEaWSAGuM8RBkcXCDgcEWdBPyxZ4dSmCY/JWK1x6BOKGFpHnfEDN8PWh71S4W0KmmWUd72STxMRYKy4HGxU9UpWyIJe3ToSRqL9hUlnDi1DZcd/Qq3zLJZJQYyXf3KEGdyGycNSoHKz0m4NwxY/F+iAEtuxRM1ZNVYV3rR1aQuISvDQWguXIOhRzzwP2fl2NaIPNrpbO86Tfx4VfF3GAwDiYMqcOD8EngNSabNm60476kkWgetIdPK8ji47o1qHR8I7eq/GHVnLGommIAj7rFYNWu49hTWoAF05xZJqKfNd+sxWNfvElCqghtMvOwb4MirImvRdHZqtjqLIkhauvY4O0S/vVqKQm0CmDsxvuo0WND1VtVIXvNN3gy8jeIz7bFNUI/eWltPOdLi1Fzhhy/L3oFfw8aoddsZZCcmME3t4rxwpkW7BmzAfsvr2aRXCOQt7mEOmfOQMrgRxI8NQLiv9rB/J42fJL8Fk0PudKowhs0WfwCFbVHIO3bxbY9kRClKgkGEi0g/tuTp3UJwKRJz1DvdRwFWIykoVQZTi9UoWfTvVlTUwCUV75ng9RAsnsiyLvVTPDnMn98/LCZZ7RncFduHWzVMKeMYQMYlnAF37w0XKpuQzsPx3DiszscnGlJB41DaLDkMhs87WVxGRXw8t/LEXMqecnuHu6VbIbUH4fxmWUTG0/rRH/XQpiSV8V7N+nDyDHl6Dt/Joy+dAgWtM9hn0sfuLClj3bOGUHjg5bzzqI5BCM1QW77MVyaN4MKDjnjvGOr+eLBT3xv4T8M3OTM4vLHmNsruLtkLBTNH4+rJM/AIu0LrLLFiGZ5dYDf66WcC60wobSIFExG8I+jlqAbvhZLT8iz9PbTkL1qCUy/E83T7v8G+dv74WrBIcy21YW9rQpQ+/YNnDOrhkvOImA2KMLtGnvpl4opPu0/RD8zEuCDeBjp3BwHHy/ewcy8FaBb+INMP7dgbmQVziiqw1M35lKgogOi+DI6KiwOt7YpgoP0SVyc0QNJiY/4gYEAXdh9jctcoyDZUo02zx7BjcojoMr7EGl6vKKxB8v5m9Y0WJ11lOoDluKhRY0oeegU51c8p1GRIjAvdi52nbPDwrD1rKA0h4NzpTjNeikrdMez98cQvBWwjhY8loR908fQCbMD5L3VnZJ9F+LVJ5nwfXQbm+w0BmcVJT7sG0xx+w1APOYLjy6Spt3D/Sxx4BY/2+bO046MRRd7SW6f8ZVC0ibzbkcTWCu1jRd93Yev/P/Rhy3H8eimEZCZOhomH0oGw1W7+MoUWZZZMg0s7q+l2juxnOt4kW1faeJTAUEKGw7GLY1fuLEik0zfZED6VguocFagAy06sMFQCBSFbrJuQDQL41ryG6mBSlIqnPJXFB0SFGBJrjCJNOlDm3grJcxWhqlOYSC0cQ1cb7nK/iH+rODjybVDJuC6cJhl561FmdOt/GN4OS42FaGj7es59tgk3Cj9F4ai3+JyGSW4l/Ka5yw4xw/HdfLdoeukI56LBU8VaX+FOzwu2korg5JBoE8TYuYvB4UDx7HftRba7IIYGqq57/FyuFgVhmuPGIJnURVOyRQFq6+6PPtDO2WldWGD1HTMGjoMuyLO89Xwfzx+6DDIRnfiurXm8Pm5DevYXUKhW8rgoGdOxvNuU5tWF3U47eatI0NgjOZ+Ohg8BqTqe/l4dC2uqXfAOZt8ULHgEqwoFIHxW4wh+ijhEv8onNABoPl1GUw70o/7y//wAf1UbpOUZMsp1zFvxzj4vrmFn8bHAf4zhsslD7gkNwpSvc6j15GD7KXbh3faPsOx8+o4MGEZbkzVwVMDRpDYK0i/3NPoemwwVXafpX1atWhv2klNWx3oXsd0LC7y5g+ho+G90QL0F/Vh+WIZ2Pd7MW2Ru4CB4j00T7aTs0I3wOklLUQeupAoAkypitTvLgALDqrCp+KdbFLhTXuO+GBL5Qu+dTQBtk0yACHhQjBbGYJytilsN3CANz2MhZmPT9CGPffwitwECp20lS5UMBgaF7CWvAcsTzWhRzNH4bzgPpYpUmf/tfdJ08AQJd5vhr7/1GDb2cPcfjSOV434SZsepXJodB6KLjFEFd8e3r44mlWHB3m+mRhYaEzFCszDKs9AbHpfyy29R6BjTjOMC69Ht+GbsF2olnxXCcLX+nzoaj4K7oETedO659gbo4jfTMpw7qRqVll5GDIL3xDaToZTx0fD8z836FimAytdqkZr/2ZatDCZ8xsSUXLCCTxX6MZPHinCjnLAyH4ZnKm4n0v1R5GUfyhbTfjJzqq3IOyFFHzx6iLhq3pwMvoiv/6zHfffieLr8km40VQao9JMSS/kBao5BKBNXDu8rZMBm6kdeGfBPX4w1YETWw25oFIbv2kYkfOfX2TYfJhCnX/iMkBQk89Cp5MDrJO1Hi/06HBP7nfaN2I9jL//Gj7ptIBD4zusSbOEV1tX4rmGbEjtV6MaVWfeZbSCbDkPPa/14aOSalw+YhdtWKYEIimL0Ox0Nav9C6bN1xyw1zSXBh8gtGSOB6dBa/op/5qmC2hD9fVy/BWzgg2e+aKZ6jQeNWyBBmYO+MB8KS7OvIMNKyx54QxJkIjfSOpdPyEyewWFRjZii1w5WSVuwH2KW+mGiD0KJLRC/F5h0MlKQbFKKw6pEMaYruN0alcC73hMNPrORZK+tItmNc1mmacTQbtvOZ7ZUMirvtfRgV9T4X5BBp5tvUY2P0v4xJE4aDlfhH8a9KDAU5H0Y5nfpK/AmZdX0YL2A/Q30B6euI0nvzmd1DV8H7PfjwaLDaFwfNUHmvcEqVLPiId0+nC09ynQHtvGR+Z74IdbJ8HrxHgwOaSDc9pCuelGK4a+mA6fx+XTwgsjwNr0IJX43uJE/690MNsCDHrDuKajH2IlxkBFzEHo8ttIrUfF4YpBFi+NCcD7AmvIO3Ey2L5LoL4HGbR01nKaqmxLUeOW8vGOqzxeToijl1pA96yDKN1iBItmdKFqSwidE5qIxT0SpJRjCNqXMlH5tjioPA/gPWef0ptfYhAW3M6jm/1I17eDqq65YfANQbwdWgnDT4oh/Ywg/DbL4OXjJGD5C0dIkjCgnfnH4c9j4rzXduCn8pALfu/Ay49nUtPOM9h2eiooClnz46qt9FvIjmX9OmDeJiv0CnnGoc9m0UUrMdpbrkJjloyBi1kO/L4yjp9rbsWPXmfwaHI3Xcg+wfE9Fux8/Aw0CGykZ93CcOK3OqS+bOYYg+90uLoewkxG8kDNLFIYtqBjxqFQvnABznQg+F66kFWmScK98Tns0FYC+ncrQbgtG5LujOXHUcQnCuXAsVAQ1E2U4d9MdVSYkQSvx/3mUoPNqHG6GLVYAcyPuqHk4ntc858sXG5Iw4o4AbyV5o+Jtnq0daE//5efSmkvFkOo/2JqflSFufckYf8vZVp0VIQ7Ov0hvcGeM79rkKxeGFlOl+ISD2e8oJxAfxWnQ/dAOreMd6MutVBw2SROT+9PQCthIZgoKYXj5rtAe54r/owYAWuU18GvATls/DKWlNTGYcvUDp4epw0NDwvANKWADzgNY3OILOh1LMWGhEASWmKFW16PQ6nVt/jYbAUqtm2HOOeDbOgzxAaSI8Cws4eHu9L4zOsCcHurwKbJt0ClbiIG1Nmxg5Y6bZj9ksvNx8CmEBu02XedqnXtOCY+Fk+v+81P1l8EMws/9FukzP8W2fG4Ldqw+rwOPXWVBsG/1lx925cC/NLBaiAXq/7ew7/tgqgTvoy/OMrA0asboH6GOj117MNnqstZ+aQ7HzqdyssGt9DCHgdqmXSOthXOgD07BKk07wbGOP7DGDtZ3qnuwmnlB2n/4ct89dlVPBQfitorBaFuey+NFpgAU0YPo5KgOf5V1KTNP+rQo1+RjQZC2O5jJE1bNgNMck6w4PQ2PNaxCnfnD8Dt+tfkp+CIXu4nqGn2VpgwOJ2XfpeBkQ3McZQCIntyYPKrWVR95gclNxfD1hfDfNp4D/occqSeQ9pw85QQOqodIEXejNa1u/hX5wOY2BlA1qsUoTpoCP8svU/t3tIweliZyqZO4N6ISbhmrBzEnumk+NH9NPXEBApXrUEcVYfhYkIQLTsXJpm/RPNRE9jTXwnS9r8A3hUMOVGvOa95iGz/PmaPGENIznjPNQPzWWpPDzSF54DkwQi0oUSQnqiHlr/n8xf7Pla4LQiP8ny5tLaB9fgxKYV0UkntA9qScI+Vva9ihJkcztzWA8pxIoBC9jTj+m7w/zOEA/e0aaHhZxz+Moq7Jxbgz38BvLuxgKtlZ0Dj9NlUtP065J7ZRh8MyvCW6QmuNQ+jmvH3sG/9Pvj7ohRUDUThvrUtZq23hoGB75R/KQYflf/kBwXJdMZ5JOd9UYPZCZW03XIq7PdLwx+3m9BQWxKEF4/DTdrX4b71dUif2Iox4UEgUikFS0/oQuxKhB8PJ1LSmMd4SuoIvOmegPeTDUDG4R2Y5ujx7tOtoP97FDgtNWO5qcE4X24xKvY140SJfhps8KELR1pAaJMsSncngPWQGKx5owCFO4+CT8ggZr9Txu+rH8PEupOssV2DZ+8kUBUwo/haApm3Y+jiei28I2lFqy/tAr2JP8H4cCRN81DHjk8TIVH8IQaeRqBD/1HeNRnwiVDHANkMTlDLIZVrw3CXx8BNj32QujYZirKNoedIE9lHhPJEuUcwvECIs8yCeUjzMi/IyKbpk/6y3TUHGMg1gSOxAC927+L/5rtT19SpuDv5HpaGmKLgokT6sUERClbIwN0oUzh6pgECvmui1AQn2FPij/VL5sDl4g0s5vaXOtQFcGTqRvZUHA+F75zZxu0FLR76iDDSHcpCYvn8nEn0otYTN2M/XTwQB28iheDWo1Pge6KAXs6w5xwjN4raIAHLtjnQ1tunIOTIe1p8xYHyguXB8tkUfFKyC+c4itNN6VB0fepJ7akruWjRFpjb6YUL9u3BM5OUwCqygY4vGIvVd8/hO4dDaKd9kWzdEGpvdVC2TDMuG/+DpX9ZgfvwE3q40w9i/2Xge+U80C97CaLHVlLajEbsy3lAabUzaXqEJpzKEeQZHaK4tcsKbT3S+MLhR7DoUxO8iM+g4wvyMUZSiL8JG8Gp9MU8pfQJxC49RNGTXtGKADuSvf8ELmw+RZoHRbgw+Cmcc9MD/6RIFJ+xlwx8jvOuWkForjSldZdG4ZzzhugqHkCC5UGUtE8Z7FmF3mTugK/l8+DuShcqST8Igw/ewe+EItb/MotO7btL7f6WUHA9mD5MmECXjdwhfJY6Ba+cTwfeDJBFiCHm3HgJ893mYtpXgOPxebjsoB598O+i/u5f3DbjM/asq8BaD8ROr0IOEf4EDuGmYHT4MJ15H0ffNpXQnOkqsGm6Ovbs+I6blwTjpCh1aG0Vo8i748HoZxlOr5ZDzxBBKl6xhyJ3HeYBMwvQ8pvF8QfWku24atI20AajkcX01TeD/JO8qN9MgPlhGU5feAOVw5UwUfUfjzxrgNWtU+FC3zt0j7DmjKGf7P0mh+Q9O7hmmiJsVs3G9Yd28DurGHCZOAUaNcR5k1sPrh+TBOl7x0LYNHEujqsG3epk5n8OYOPEXHx7FCT79ePHmD24+tpkOjDBn85vGgHr+C5XOpSQ4nkD0hooIfXZkqBRfZZO0ylMijQFgYAUljvxnISaPkPW/atkU3MF7i+ch3ndmqC5PBz3/xKC7jVC3Jjyjx63hNBJFyeek1zHD3bOxTeOm0BAewzo/bnIW/0NMGxXOO7Wv4/fz4fQ/IA6im5MYe+Y37y3qhO+OJqB69QGWl1/A5zP+fFZxUiK6B+G+ZOe0MuULvrvzV5ce1CJycYIIkXnw1vT1/j41VcqrzmLImWjIf36Ns4vtaFHZyW54PYs3n6Z4ciifzDy8Bd81LIXRilow6K5f0FS9QdYGs6mxpmrcZ2cPHcenwGTFwqhvPdydtonA+dy6qC5sJDlBwK5fX40CN7t46fac8C/QhRk1udhhWka/73iB53xC/nAYCx5vNvCcQECoKbWyVKpNyitRwTaoqrRbPsNXP1xM40dnsMbI07ADZtMniXogTR+B+hecoNpk9Thy8cHVN2QQTPtU/hzrjKcvdZB51aM5tWuKyg2bhKN7cuDLwwwzSWSAqUlOX17BHjkP4Pvn5bwqvXrycvVApS2LeJ3Jf9xf7cppAqc4iu6ahC4NwMX/v0JpSP9qV9pFUaWZPL7BW2w8/YOeGpvALvuWqODljKonvCi1hmqsLjKBKdtV4MhpxryNZsEq8yMsVraCkR/CNOfWXdpklg/T4o0QT37G/Dc9hBvDUpBe/kgqNIcBc2/jSAnNIu77EWh2eYxy28t48lW8dBo/hKPxgWz888EXBF0n7VWGoJV3ABf7noPEkdd0e9+JX0+Ng+N+rLw1nYfOCkVATO3rYeyaAs4U32Cel300CjtCpm5WPGi7AVw024zbp82iRdeUkG1gq8sPE4Ddn6r5YRDT7CnMon/mF3GgZIazt0dBG2Zf9it5S1dqE/iLeOkQEvoDovfNIdlu+pZ4mwPdEfNxC0yZ8im0Z0kTE7SND7HtvmS0HnSFWQvuUDn2IfQvl8R5q5VpGLdQJiVEocLZXwovjSfh1Kk4ZRnN1mtXc6rChrR1HcyfI61JDe7ReD025x1tlyjlMdr0e3MeHDj5Ri/6im8zXnOicZqeHTHboobfxz2LTGF3z/sUOZmE+pJyAPGXufduUt5d5YkbWi1wS+JW8lnRDb87rtKq05Mo6jvb9G3TQ8e9AaC35rbGLehCNYsfsNDdeuoXasXtv87S8OuHRQfkk+3eyyg4+ASnNxUSWPDfqO3VQE41nVjZNYiFClLYdWdQTC90omEps6AgCInMg+s5KubppJcZATVDeXiiFJxulN/jiwzXeFJymJ656UC+a6i+Naihv4WLMRrfr5gWawOp/do8vXN7qCZNB+sn6+GbklDCNHSpcuSf2hu7nrQvJJIcaWXMWdFFR6OvQo5uBeqP/XTw206MPFXBiZszKfsdhlsMvxOLRcOo++vpbRuWTgcEdtAalp2dEVNGIbH+9NSV0Fc+l4Lt7xNIwOtDhx5fpCKo5JwQXIdCNyxR4Gf+iCtE8EnwZILriJ901/ADWuvkaZFBGmaJdHyhtUc0lkPdQoaUKylCx4WSfjatQ/VblVj5cw78CE3kfIyHajgwQ54LKMI2kvlIdvJAWZIWnD+qQ+oJf8HL3gK8+6OU+y96QD4jusER8ml1Oc8FdB2I6vnNpKeZT/9+WSA6jFCCP/m0/ARTzZfnAdsugO/J1mCSNosnrB8JGrtr+DrIXksdSGL2gSiOF9fFE1WRLHF7CgQFDYDH6nHdHpnBb5zHY+O5x+Qn6UihE4dwg1HHuG73lsQKXCFRZdYQLSTF892EeCsZz+wdJsKBxofhw2aa2hRcTltabnK/k6bSXXOCEiyFqO/C+7jhV3zSEr5MU3XzKBdpz5g5z8FVkV9kL0yGjeOBygSCcPP+v60M7MTrvQHYOcDO/iw0ZCfdb7DfLNG0M4axd3iklBWlw2HfTJo2+wXYHbdD/LVJKglzo8ELKfB0FQ5qA4f4nU242HaqFCYm1kKJrOGeej5RXIv2wDuc8Vhdsk5sNqdTU2f/oDiI0noeg30fns0U2EBbbmxDQrGWiBlVEPy9m6QsrGH1rv28GC8DljYe8C3QVP0CqqiarsCqLjpCVGVx1BoFtGZviOw7EsQyYnMgCfD7yDRcB6OXtlNUz1d6XMFwh7fq2jyXRieFZZy5cZS9HwkBVEOeji7RwFejZagN38/w1mLn5T7wg33Fe4iy+lraLBjDexZpQM9oAXhVwJp7+cydr2UD/+FWsB6VzMyeDwZZE578otLFyno5wjQmduEM5be538PNUG8PJXCpn0BL7sZUJb7koaNa9B87Ef0Wj8VWoO2gb++EV/ZO5kLRn7ljFFGkAXJELmkl17tT6Wvu30ppEwaLmvPonHrV6D3Uhf4EVlMJ4vnYW5KKsrfHc0TK+5h9NP3cHOeIqybJkkRhwZpOF6TRzvYkUXmalZJi8as7mFu/xhMoeUjSVjEEqZ+reJfGmtpR1woTnaUhaItz+n58lpcd+433xIrg/eBw+xjaQprh95BsaUjSP5Tx/f3ajjjxku47qVN+Qfb0H2qNsV8rsW85VIQ1RfEX+WbeUTQYT6S2k25q0+h5QkRblz3lwQeb6DV7EaxgmIQsvsNXRUahjlLjuEE8RgqCfTiRRG6NGevPPb7JoJLYiCst5WEwjIJHGxpo0mfI3CnyWIuak7hVxvm0JcfwSCUrYtfXt2kN+mT4KFXNAld7cVNptM5WCqQjD6U4KKgSmi1LYPVyScgU9KTIHQMDH95x/ZmHnzu8Q0ojlqM4TvGw8KT7lzh+YdXPK3ic3E5sE97HHw9sJc7ZhTDV2sHGhvvzGfr7PlB8H7aqWvPoSYVrHy9B6a3ScH4WRfJZ+8J+J6SDxs+PAG3oHNo7rWbRDNnQBaf4/1GT/CCnxo8/jzINkE9lJM0jm+oBqFkWx+du7mc9rVlYnX8LD6w4QV6p1mCrRKCzpAMTJY+yWbS99E68hEViJ9D9fH6wPcGYNSXV3gyWRtmrr2JPwR2gVmcFZcHCdBx33woLN/Ektpr6FnfKfrubQz/HE1A72oBj93XhULPb8OnLjEKlTSj4fRKtJMRIOO1s8gozhBz5inBbu8Bvn7hHR5rluCnpTa4tbMAz6xfzopOAlz65CdU6SRhuLc29DWvBb2Rv0n9SB0EbPeks/9Nw6rjtditbwzrb24Ev4hn5PqdYGTJJ9QM98DJ+Qh5e9JA97w4xj6bRd4iV3Cu7GiqHb8VYm9Og8lPfvC0rzEg5WiNeW8P8r1KGdYtNKezHtJc2jSZ3lrIgmS5JLw4/hPietrIwDkSR++IYf07R8HnZiufHv8FLaMrebSWGtgJjoUD85dwbYEYmPy9w4uzM2hlx0pMHlCgKW93UbXLROyNqufZA1oQfvQ5bl5cQFam/6j9bz5s83DH9ZJ/oGj7MMb3GYGGqCQY6TMsTdPElZt3Ecr7ktS2RFQ6GUj1bwQpxf4gnvmqTy1VKvDaWwN+/PIkGckzNFHsCQwtS+TXLffooUc+/ld2kfWv32KNIy8weudEKJ1bxXMvuNOyFjX2qRiJu13/YyHF+RxXL0TRP/LJS7Icf68bDc3xkhAgWw+Or+X541IBOBF7Gjc3rybXJCe8m2AF6b+d6HaeAKz+4kgNF/xYevk5rmx8yrLrVrJ23Vm4uTgVHn67yuGvFLm8Tgn2nFLFQ+OkSGHxe9hjtwHyJxqB1fq7FNeqClbhydRcH8X/dutA7rkokHzZBVFyhvC2pwy2Dr+k59Gd5Db0jQ7NNwEJlzD8tkQSsr168OSY3zg3YxHHPR1EnWu5oJd7jAfuK2LXmlNgX1JAqd/GQXrWTDp/xIyHOJYSNv+mD4W2ZPmqDFU3m4PK4o+okPiD7xmbwaUmA97WFEzbXl+F6xsus+Cb47TVOQuWpHSivNYXED6+m8NHCMC16RXUmphMDU6nsPL2KD77Poym7LhNdtDNw8mWPFUjAN/Gq0JF5n+0MiCI9jVpoLdTLTvubOWavyIUKzWZPzZ8RsVju7jDZgrILPEBY51GUq6MJlnaRH3XNHDhf5I8v+UdLm/+wBdM9SHnmjDsMPBFp7/idNDdFZ6u8ObqttMg+HOQX75qgDqTDnjaZow/T0+CA18bYGjIHsUW6bOozRL+IrAE3bziyTj4DFvce0d+3oIg0ScDd6ABZt9+SlsMbsEie0NUGj7De6TuYEbEV5wS+ImELHx50wVRmH/bEhaoSqFrQzwMb2jl+32V/Lo6kLo6zDHY9SnG6j7h01U6EOZ8G58/A65LeMYXb37CT4LC+DbbCFYdisLpQb9Y70AC/h2QhgljZGHr7YV4rVoWFU7L8zLBTfRcaQaNvfGPRpxZDjvWq4OoIEGzcifPeqfFQYfcqezbIYwt0AKd79M4X8+FllgtxstmRyn0kST0pa6AES5ptC7AA931IiBh3WMSnbUJNs+OofrHyfhs0VUony0D82USeJa9IllJjYcdExUpqc6aBKZpM9d30YNtgrQlvg22R5iCc6QfLG0ZosDp/vjc7gPGxKzARaXf0WRJHYZ4ONDczBRK/WoCdb8fwlT7edA2ewBXLdLiD1a9pFiiCL0/G2G37Qt4Z7Ecvikpg7DNVy58cJHKh9XZvW8N1ik+hLp551DR9B3b2JWjbto79nGxhPMP/eGupx5BsTVLuRtw04b3KB2ZRbXptzB1zjS2XqbI39rGgH5lNSwtWYLD339D4ekw8vHRYKlJLnS3JAn2RwdDvXMaL74yBmZ736Gi+nu4utobd2uEo1ebLsbe2YLX1/5k7ct7qW9vJr7LGQ2GHbXo5rkf3RpC4H7tRbwl8hhS916FiCn6/OuIGsy9L861h1ShZ+8VnqSRyu15PSSsto0k4z+Sp1wvjag1pQkfyshhth6lHTCC/gkFYJNwGFr0UrCnbTwnOkqxx6swjJN5xImz5UHwiBesbzWENV+78JBjHM6bNwN2nerDKSEDqHKwm5bMzWKD7QWg7dYF8c9VIcJRFaXHCYHzllkw9EMGtlsfhlZlHXQPS6dJN/TxxeFf/PKWMExwNkWhFis2lNxNaqOc8YiEAIT8jmQXdxXudvPGQZiLY3EajBo3E7LGOpPtia28QvcE1WrV8aPwOvT6C/jq0zG6euEUi7lrwMZRt+n5o98wpfcomzzSxFTham7QFgXJhbdxwyN3uNN4igcmGMKwzkM+cCoAOycfgzOP2+HSEQMK/iTGo118+XyMG5z95k2nQQLEZ6ZCU500JbpLw7asd7zVTo9bS9PpvwmXIKmniUu1vpLvXFP4bHefiv4uQROVo3x6qjQ2Ti5lrWxR+NcbAiq9DbTCR5PyXkrBQPBVmiN4j9ouWnL/0HgUlX9MRgnhFJuXy/lF+vwg3RHDVk6DvfZzOSn5HvWnG9OkDe/w55JkNvK9zj8jimi1URuvqkghgdpRUJZzEtIlZHj/ehW+1ClFx2Y/INyZwOdWBsAd5VQ4tv09+HVYQElIKYh4ZkDf5OvEZyfzYPNqci9tge29a6hwynU2S3MhtUpVOH78CIzLygJxnds85kEbSjYWga7cAFnPtQUvpVCyP/KDm5PV4dHLaaTY+xiOHnHmiPMH4cpPB9B7Ek5um7+hY9F1yFT+Sd/yDSBDfhFsO+6Ftww/48NRO0i8r5idYl/jnbvnycjxE+a4JeJO1gBxjUGYmrOE3+wIxKbMdBw12xrf5M/D/YVhINgVAZmnFAgFLCDCbjv63VQm7/iNuPbHPNJZFIq5U3+B7rMtmPZlPoz/MY1WPBAEmWcHSTZjC33uvUrjhxfgEn0hNoqqxhbxTejRvR4UxNfzqqQp4CZwnUpD3+Cz9/f4VPACNEqr46aqc2CstpvKLivxDNetGHdzCjQL1UH/jUL+vu89tvysx5nGmaA4QRV++RCVb/OF31floe7eeFB5uIEtR73l0XtT8FHofY67lEgVrvdwk40W/7plzWLd3mg1WwS2r3iCJxfJ0VO5QRi3U5aSzshDo4YuazQ5go1JJ3r2atDogxbgW7OTytvt2O+oB0Q7n2eXxG3kd28Hiv3NolTlX2RyeyngfWEoKNyCZ1UJfcu+cNLJNpAr6uNvG9/CZ78mdnu7kKv1g0Bi9ggIPbyHzjzJAvOnyFfX7ibZDCv+NlsM63ua+cbwDzyXXMoehpaQf+YFnHkWT5Z+hlSouh/9ipdR1ZUDsPHQWezveMFP5pXT3Ao5wHmfObA+G8yS9DHyw37KOabEkP4W49dFo4rbCdrWdYmTv8mBu908WpfgCorZd2jUjga62zGC/WJL6ITlA3SY2kiPVzbh6EniYPRtARxvWA3O8nu5JKGf9a0PU0dYHo4Q1MPeAmNSeTUPL88BWBJ9jvM8VOjwjR4QqJXABNnNJPJQg+o+aWF0I9O5799YX1ISjjnpsNtIovo6VTYa9YrPNdXTa/0XJPlhEL5qjoErf05x+V5pyKjuglQVZehrPMIF+9dRaU0TrKrdSJm1U1hPRJjaDo3F7gmSIPQ5lCJ7l5LIvHfoPRTOAsF76WmhKs0WuUY9e6pQqdmL3vsAjB/VRX6F5ewUqgWJ0otBsK4NrL/bgI090s/6cA4J6+NLVWPh9uZwfLpjCobIl1PnqR78o7WPxSM0SDi2izTTb1HPiwBomScAhacU8b+jpayoHARPhH5Q781mfux+nF4rSHGJ4WH+FGmCufEK8LY8ne94+NLEqafJ7lUFfDELo3XXc9l0VyPM1ZsLCpv+UrGlKYgm95P65wJKcA0h99DR7JsSxG63C8BF8iaElfThmOQmrM80gjWiB7h8zQ6wKyxmpa9BLF81m0aZVKBpymjW9dkGk9d3QWCkMVy8Ek/D517xjJcbccHlPG44spB6k33obWAoHtRzpUWnw/h+nylYfzmBewx76ZyEPblLl5NFayCqy49C/1f+uM3QB1CkGJpBHoz/vWS/dkXe4pRBbxfeh7sdGjhZNpRDLqVQSm0cCo+upjoRC7iYswUEbmmRtEkUrpumyFWGyPWbE9he1Y+/ee+GzY92kFKOKXy8mkBRFVbo1SDDW/Jv03INcxr+XIvpcsLQ9mUA0wSc6VuFAUzwiaMn6meQRZF7HplCY/FKGnswGDb8ucI3Zz2gsS8y4NJvY2gTkaD3CxV5V8JD/iPWC7FlovAm3BPd7n6AjTcNOPrDPBLjCbAs5RJs3OVO5cL5KFQfQbmvq6ApbwUU/X4LVLGZXrsPwFdvdTD4lkkJ+60wP+oLPNMewE2NP8jQ0hOPHv7N89vesdSwKt2NnAFfPpRwSLoXmx3fQc+k5wMMB/ErkWQS+2uJ23cd5lfGd2HqAxH4t20kGqSd5Wu7M3meUzhMtD4Hund/QoGaEV+o8qe5Wy/inMnTIbwnhv0+J0DWaTvgf/HsmC7P/eN88PgZS4pKK8f/Bt6TTrUMeHtm4cxhL4g+soUK5Lbz5TG+5GfpAK31I5ESLsN7s2uUIq0FD8+Pwyu6YyH/zFuyNX0Oql6TQbS4G0pHV1PPy1rOuttBPkajYcTfeDS4FQgj57/FbdXbYavdAAynC2PV1gPcm+6J67ImsJiPLITe6KO41R9on+17nhsYQKy+HEzG2YJ11wNsiP6EVgZlbFKhDPeCt0LC3YWw2nwZN2ytpR4dJ/6U8hFfXzKiqSbv8WFqKRzIGwm5cV9hoaM/STkehl0Xd0PVgnxUktnDnunivEYuhUJ2rKOCMVbQtlgdVdYa8psZPyn8ni44mrVwUPE23FlwEFIfVpL28c/w54YOaGuO4Kvip6le/AT0LHiD805shIMKEfDnTj7GqJbhx+SxPC5XFlKXWOPbxCU4q3EBV3XtQ7JajC1JZ9F7KInXPosG3ZZgFLFCGG2fTEONTXSoUgbW5twGG8cTHB15Gvde2sdlhzLAaV09GShOA70Cd/BfVAjr8lbCr9nS9DFoM7rEy+PLr7G0/nUp1CwfRNFvelC7pxjk+RC1bbBEfl/Iwba3YGa3BIrlyJGe8TPetV+YTcSV4cF3DZrQdobrBF9TvHw/aNdG8f7Ho/GH2Ckc3/EKzz61ASfBkWCUtovTpObBq5e2dO3MdSqL7ARjyWOo/G09rYn4RguiC2g6CcDvgARwEUsmsSt7MH7Oeprcfgyn1cyGESrzKSHmPxi3ZQNOWSQLF/rOcnh4DYnsqkDDLQQs28oDZaq88cwUeJHeQrISL8FBVAVuLWng40XToaNNmFzXi6GA1l+e7zrIu9LdUPXOQpy7MB0iVQl2tBjgJpONbL/7H13elkYbVheR8gN70HCugOffKujddD3M3GYKXVfi2W7lB9xyWAITk6XJbEwM7wvrpmHDEDg90ZMKK4Lx0QdFiAycSHZ3kSwy6ilXuYmeyVuyu58hr3fP40HLX7ji3kSQ/k8TLiuKUryxOBmreWB24EFOHfmehl6swK4Xg/xv/xWq2qENg/lK8HxQGHYYPaRzlyTofPxDalz1GS9eecgzu2rpaqAU6rZ2kLaxGiyct5/fHFoC7TvXU+fvGNp6o4n1PWQhe64xZ61UI/vng+i5imDozmde9XATdA8PQajeWY64c53e200CPbNyDuwI4pibqphVqA8/4kbjmdQSDLr8CvNjV7IQO5LAZVOQ0Shl58zflL76CiYZ6UPRdVH6EPuYlFbthcQDP/n56q1waaQPn5k6hRUfjoGDUTu4V4EgNe4srQqLwryZk2mB+XQ8W7oaH2t+IQp6RtFJS/jpp/nQtEgN9DIe0X+kiU//5pPo2EO8wsgUf1QkcFSLNf+pmILXnhYAuQtAyJN3dO2/Plg/4wOeCrCgl88dIXG9Ix+SjycS8KdVm2RA5ec4ENjZjH6vLuG0xw3ctsAJG7vcaa1XHA/mXYPRdQKs33wTf/pqwsrybuiySsOEhz0cZV5Lb/8FQtN5OeyIuQrny0vh88AC0E4xBe1uUbw44RM6tUniwMFWlqkxYpfkz6hzZg9cO3uccl74U854SVgVH0AKq6+A8NkWuj4viU6NesEvx1pRy0llfDL6GFO9FrWPNYH+19HUqdaO+1rbKMNoG+aXPYJl86Lx3bFFZJAxwHR0L7Z0G8GWrjf082scW57VAjx4E4oLwiDqVRYU+E7Dc5aBnNebDwH3rWCEcQ2VdjRxxppo2KsaAtb/qWHj+ge4NkiJPhZZo7nQQw7pM4bISCMIXt2Gu7tf8b9XM5kWz8Loler4IHMhPax+iusDkkCvwxRWjfyOk9Ss+fL4GGw8vBDiVwVz4yp3Lg55RYo1g7Qgdx64B42APbKWkB19Bq5fBPZ4Yo6ygWMxzngTOk++xRr2wVQR9oBfm+rDHpHV2Hr0F/87Owpv5cTgiA1X+OD+2XRi0TD/9NxCs5p6KXesOuw1y4FT0j7w6PdJ/ngnH9sbMsm2KpA1vntSzbLj4PLgChc1TQRDWTu+XvqMn8+ayBZHp8H25KWYc3Ui/k1JQDPBTliY8xvb/0wDibbpsNjFmOjkYpgSd4vkHCL5fqI+SUdnQPTTSXyKCbJNhMHwuw8dt93O01QyqabsBsw6uB+3JurSjgtJnPh9E759WQClG9XghWA1L7a9yWOdytFpYDTtkYiA4vhxYJV5lqvyHGDV+1ho/TICTtiag1CMIlu/msNvQvpYJrKc9RzvQW+cJOX/uYTxbU9wZdNIeFBxG9V95+KBCA88rddEuhHa7HajDZKLZelqTDcUKpxDx4zpMHjQCRN35OCr5lV09HsaNpqOwvMFR6C6Zhn/5Rq8rPcSfs3UgcS+2TB2cwbwg0q6nH0cpp+/QSWW78jkzD9YlixPWSWh6BQqB6ErG2kw5wuplYjg8V8HoLf+JjdvdqTihXPoQu9ztH7ZDdvnjYKXskF867YKrHgugENZs2BC6y5AvXw89+UQaa6fD0YZ1WC60gAyRe7CDQU3zhl3GoO5Bnt9u8HS5SI1nm7n6POVeGHZYt73aAqISJby0yUvKaBZmyKL1mCZZjrcjFclbwkjHKMZS8H7svm8ij7c1vPH7+a/uEfYg0Oyn6PkF1dMefYc1A3X0oiHlzB0yxm2DJsGSyI/8KMCK4hYmk/Je++zwxchlAdj7HGxBf/rR0CjM4TX5wrDq702/M5WFh4pRUL2kB/ckVmOB8LTeMf+Zmy6toLWt+wgFWV1mLXUB33uToGziw/SvalOuOjHeTCaI08jMsoIFhehtcMmyrDRhFk7tuDlpnJsdpLAj0e74OHATbbePAuy5Vw5jJNxUMkanG+pw+cD5uD2Uh3vffIGp/lruOw/bej7Uwf9i/PwonUuyN91RnQVhervmnxfZyqpXDDAsafUoEShC2tumZBu81Javs8IwyctoNfdVrCjajY0xGdTuEwK+IV+wCWe+Wy0Np3DTGVg46Y+DNS1BXUpHRjaXkw7ezqwudqI/r3T44v77WnCWim6lTwFH0TVg+42MxSJ1oaznQtBfYUJfzD5zbtIB9O+uYFzznN6GNaLVcn2hMLGaN0rBcvPt1PcpRZK9x/PvLwEE1pzafy2CHKUrsMbKSI4si6eGlfIQdOYA8jtlpyankA6l9fgSL/n3BtXRndpPO/ZAdBp8Q/g7miIfmNOM1LtYJ+tIE+/dRbeJO2nF4dEyHzudrpu8gjNfLogrEoJ4m0fUHRKNBr+WoFixSs59NxmaNvQBh4XXKiqKAa9he3h6UQzMK3ZBxH+28gh25U5bhKsavgCNSV/eGzXPkzRcKbOLiP8T8wcltYVwTbztXDb9gKMUfHms2ZqpOhpDHEtAZRXmAGWWnt5m8FUCPleAv/pCpKvSzYf3NLPn6cl8OrNDhyvKQk7DbZAg3w0ickIwAnxbKRzkaSwaw0k6AqR3SZHHtX1l808zGCjfTC0L74Ln++Pgson/rB6dDV2zXQBeKbA6WtvgE72WvbAbHyhcIBcv3nBqHQ9eLu3EPmKFJ0QSgWvwZtoVv+DN2Mzu25xRxfbJDR7fI2lc43h2JZHMLRzEik++YCNKxZR/7q3HFaYxH7e5mC5PoXqy4shZd4UuPx2mEAxGzuzPOiCaQ1fy1ek/I+9ICOkyOfG1mBHaSehrBWslS3lw4ajMEgiGD2DyqHxMZPuryjcGd5Mg9ZiGD7XgXzOiMKU3W0scNGUwrqOQVFGJg9d/4sXnzjTrPJ68Ax+iFJjFfAnjQT7tFmYWkEU8KmIfMa+JtG5G9hSrhIyA//C0ZhcGi7eimE3lGBqyQy+oq4ML+uC+IZRPjf9q8bGFyWUGqyKJ608wP/fWrglPwLGSW7hxMhn8NJqIitedWfHkqWcuSqOafkcdPo0kzS1H2LWP1U4/6GGLy4apgcFy2hc1QBVBqqyRYIQiB7bD/22X8l6dTPI90+BFwea8NvhLBbtXoiSft2473Qp7pcKwM89TjRy7TWIGRuMZ66rwiPhTaw3/QeprO4HEbE99NfiJJ6684jNO1zY6ednnvxlOwbnKEH7iXCofKzO+fcq4daJrXRITgNvVqfy/J9H2GL5Gw7Tfse9gbrwp9OPzu2rBauwA1DkZgMhcx3xRaAgjXk9C60ud1JK7FbujlCDW50RdGHGeVxXlA4rph5na/PTuPrTVoxZvxdVzQtxursRTQID+C/BEt6K1cPQQDoWX4yFiQZeWCv9hJ3fBXKyXjkOS+RR9iojCFV6zyPve+HzxJ+kleYESw+KcorMP15cVES5DkYc+skTxk2YDjrHo1lj2IXuTFwMN56/QpF923hduS69ejyLfmkvJO0saRZ8owDT7FphYUA4arrPo+E/obzbVhmU2++Tnv5dlhEUBcUJerBvviqIO86A4j5HiJjUCNceruVr6vJwWkUINnVvRu+nV+D5lh+sc1UMZjZUsLGTLr5Y20Rf/G9T/yhxvFabgfUCQWwbOxGUyyTAVUAHZOTDSCTgACzWUKIwsWHU1fABz6Qw3m/nAhvDimlG0E2IWasNF/Oy6KSQMi5vTmHv9xsxf34I1Mz5wAF18rzHP5w5q5B7XqvBmDs36LrfaHh9Rg//DN4CgfPymDPTCJ/ZjcGhVOC0Vlk2n2QOH+5uo6VvFrCW7QI0S6ynv3l1MLX3GOxx1cUbanOg6PFyyrfVheOH+tEv1R6OZL2mfePGgcSPt/BboRWlypu4ZO13Ni/uh/7zE6FqtgCNkdDm5exLETdu8d6NZlww/yDaQC18EF6L4akpON9pIvg5HeQdq+7hg2VfMfujJEyp0gPvMf+BQbUHHPk6k360/6UqWT2w+PiNFp8s4Q/fG9n2mBEU6WegwDpZLjiYDtktWSzhfoOzDeShbcY5sJ2ejcceOWCZ91Taa5AKYpwMuOc1LE3wZQnVe1hYPgGWJuTySZ0u/NTwhhqE5PC8+Rhym2mEx2J/cJiSM4j99STxc/rwtG0564WXQpJNFh4XycflK1LhtPMeUhzS5WGjN3h1jwkPTFGB9065+EFmHJe9DGARmTYIslKF8Dp58tU8QrGO7VBjbU4LnM1gjcAGShJLxITb0TzWwRZmORzDmrYqrFLyo+9aivw8Yym0zTWABy7CMCxdSGuHTsGBujh4MzcAjO9LQPpWbTax0ifxrwqYVzEGxu+cRzV7QqDVczzJ7T/ArkLFsPRTEkxy+81ZK4gfFLWCfYcReK05ioYW19j3biw9jXaBfDVTyNZ5h+t9JOjkZ6blP2ZDopUwvDikQrlX7WGz7hCucPrJAq+a2P2wBymDMN2WnEA/PL/Q2zJ9EI/xwByleyDqvBQ/bbWGTeLPuM/2GO9dokQhySu4Qu82vZunDC11KrjC5hqU6H0FkZpI8Fn+DHfoxWOS6RZUPjVA27d9535nAZixzwbebJpHQ3dqIen3V8o6f5FvrDfFq702GOd0myWevIPVG7Wg6z9jFFVrBAmNW1z2cCTPHf+IK9X9yeZICj2cJIEBDtboOGMUDH8TBLfE9yzfMYMvCNVjcYswBL7cCZdeTIFgm4cY61TA2m0WcF50DMnlh0LvqEXkMfcH75xjAi/kvTgubR2P3daK84KTIS1/Osz5vAYVZJ/w31FhsFHOi44d301y8emEnmr4cPAvbFJXhoO54pA8ZT8OdQDbO4tBw+ZV7FKiiXvX5eOIqP/4YOJ13HDJCy9IT4IV+62plP9BZkcl/htzhDdPCKDj7gyTd9aArB+zaYgIR4coguysdHRZJMvfBjVI6vhO3vZ9HAQLT8LdWlFkf7aOv0V9pzU1GvAo0guv1Fxn0zYtnqs1mdUUI9l3mggF6y/BVSfTwa4Uob9UFCT9n6PHoCl1d/0Hl1f6sMaICmo/FsNmVguhPfMEHM1ZC2kZaqD/eA9MLWvlIjjMg1+uUVTnalxhZUbn59dTWE8ouhp8prRCSXiv7ACpLmPZrD+QFaaqwovyAozx7iOXyh+oNUKSoi22ssQGQXhz3p8DbQ157cm9MKcuBpblRcHV2gIUWtGM2oU3adnifVglawjitI6+a9+EyLAJbHNVnh3atdBhnxd8VKyiORfWocKaBhhtowXPfHfDwlZtNK9To4yzH9nGxxJdptzgjNWd+C5ZEwOverPK/wTAByAQCBQA0D+UPUJkRfYmSUaiTZFQ2iJRUZJoaKhUkjKqa6DS0KAkRFFKKEXJKlkRRUJRKUXdmyoDa4e7oG+fA6Wq+nDhikw+Kx9O94x6IEBvDn9tm8qXV9+HgA0icDIkHXt+70eztBg2VNtJeSYrQEBxCXuo9cCh1xfBcKIxDLcJQH+hNTy6pYRKvyopLaqcPxon8JfARFhnE8ZLNTLpe349zfpqCXeq9Lji2ArYYdEAq7KE+FToW8wN+A3Si9qg8U4jrR+242WWlvB3zguoUH/GlxqmskHDa1Ct+oOV4rV8620SLdz5FG/YavHepTLQe2M2b222Q+uuf3g29wd4WF4lu6+DeGH8Uz5ZvQNe/VWBzW+sQDvnHdzXWcFvzX34TkAJZ5ld4kbFVto41AvR0eHwadsxXnJeATbf3QCCGVOJzWbwm/AZENOxmp8oaMGSp5HsaJBIsyZpwk0PHShY9JJ2mCpDWgPgt2sHYaDkLHquy6cHPUexa60Qv0zchrP8JoPzcBQsrNvJwbiCJHdkonyuH4e1ZnKlrwCJTVRjbcNXOFtIEswfAb2c8R2XpTbAioox6HlJhQMiCzk0+SaVKxyjoNM3yOSQPnjoLcRn+kt4VOBR1J/jB3JHclDpxzPqTzDh8DVd9EpqEKalyoJlQw81fk5mJ2sxblozEpbHFcGOt6uxaHcSB/e6sYl/CJSvHwuLSQ5aw4/gukmh2ACjeD9UoL3nA5gf+w2fx//jW59iseiDOSR3rkbL6EQoL7pPBW/aadtLWYwdaQvnU5TRsPoH1efp466LCjAlQZtm9O8CEZMfUOt1ii8mheK1tC56NFuKly3fjcWZWyh800hYE1OPw49z8ajTFhJ8N5Yki33w5fFMOHBRHFJuH6a/z46Qn4UBFC2cxGJHRsJoeU00VPmM1qoPMDw0CddvdML/NhnD+zxBqDaThUe96tjoXUHfbqQi2BzEl2Vq4EWicOHtfnRXlmB7oX74ZGUMqx8/BvtV+njgsB6dPvkNAlz2crViA9QpZeOk+lm4Vnwtv8ydDIqxR/nbg2ZYHhXIZgXJIDHhG7e7fqHAm3Gw+uc2jqqXw/nDGmDWbI+/e/W5KUqWP2XLsWBVNyy8fQ9iMmswt7wDmhO+oMtzOTBLCYTVh7MgudWGK4sBdMJdIcjqGE3ec5nkU8pASSUBF8wdBU0/avF2piPLDlmQzoVSmiT4B+XoOxzMNKSxUvK0ZMN9WvFHDhz7svnhbi+6a6KNAjlupGFcC3ZxwbylJpkUIor4vPVuPmRFEH0ki0LXXIHutT2QEXwOL2UqsPt/knTLQJ2V/y4EdxFXHqyQg+gRTyFhggfqiU6gbuMh8qv8RhoVF3BX8Wu2FrIEl9BCzO3RB8/+Zvg59T+8Vd5Cy/e3o8bYUsjV3kxtTid5TZwqd0wvxHoHO8jvseUJ8efR8r08b9uQCa3BCSQT/gTF562mgoTjoJL/lCVNbOH9kTRoinqFtq4d2OS/nZTe+uGlBd4g7tcLBUEKEKS8ked+HAc289ag11tHvJIsRI5l0fAiXQomperCbvNb3PGrnXyXKeCWKWNgnaIFKz2sQR/9HxTq/Q/E+1sgYtRt3L/tO4he2kAbVF6Q9vPJIKjxHtfrBHHZjzlglxDDqb+XQMrOtfjOIwHXbRThEt0J+HqSOrzw+EPtl+ZQi4sD70qQ5RkW63nBJ29SX3SCa8N9KbWwh1SaBMFGuJw6Pdzp7dhlpCX+g9NOpbOvXwSsm72J10/4gzbKx3iUrznYdv9F14oBsJ2eSW71j2GBbD65DASC15aNOHFkP6cr7AETZznQ8K5D20g51Js+H4SnllJBUz+cbHlIuz5vp4TAJnAtcyOjNmX42qSCL7pe4YLl8qBaYQtd91Wo8t4cmBIWh8nVrvCwa4CcujVhzfticDgcSmYCS9BHrIRbyy5wZ54Av4t1IrOYL3QgbRds6h8Js2yv8Irq42ifvonaHbfgv2PeuEb5D93wmIdzW9/jhKWXcP9WNXjmEgKWAVF8/z8/ei+8gSK3p/PQziQ8c1eTM1SV4LhuFLtemgybxtlyW4YITkt3YxVvUd58yQXeKT3jh1vHUvbzIG4qWsZPM5Sg9HodRcc/hN2jw0j5aR1t0jzN6g+IlQNnQ2bsd7xXqEdddmKQs/Imuj3UAu3N++iIxQjePqWKkoRUeIXaC2rOzcPPS2JIftNECB5rDq3WzeAeNQJ+ux2nWPsXoHA6hla1f6PBkSooLBvOx+UNwMZwLiS/moTZ1l4cEwP8aGQOr584lw6PWg8/192l4FfxdFlJGLbmX0Kzuqv88uEQXApW5b7uWE63DcO/165SYNZlLFGfS3Iy2kACvXDhRBq8u/CKt8Sb0IfpERysNhFEG+350qYNmKTxiNMG1KAm9Dt6mQvjdrMIWjxoDS4SWRDlbUxq3yq4okgLag23gpc5gZX7EZY8lkzlwup8cu0U1it/wP2PN7KCRgqkP62iH0n/ABVFQChsGz0JPQv7yzIxW2McznU7TCvSHpN9SDqWnnmDycqnyGqsOiQIXaAFzvNIQ9SdHA3MoM1tO+ddvQDyT7Ng5GNZfPe5gHTix8DaAGvyDrTClU7NsFduPcfVK6LqPEc4GpOCUeOLufahFluv1YRDKdLosfQ+G2t58sxBKVhQUo835NfT4tKbgC8/cv7xvyz+QxW0K/XQ3dSaPCrH4uB6X9YLCeew5M84beYQ5C7WoTrZGJBLNASDB1Gw3riI2vN38MJ9LdC/Yx/IzhAnH9dfbPminfIbptCaOeOgd8sdVtqZgbn1nXykoxr3L91CJ7d1wtQHBvjv730a/bgU5IItQXDzePp66yMr346mMbgGXeY8hbkejuhQ30LCR97zf9b76XiCAVjVS2OTnikFJbrCbqdVZBN7gWUkhdHt7CU4bZWD5iUh5DIsAxsjD8NBWs7thlNRa9pDnJxaCCpPwjhssj/Krb1A7/r9yShYH4YOLsAtP86zzfQ/dPxRFk29VMgnf1hRj3cKZCWKoH7NZbrz0xQMmsfSP4W73DF7DX1NVKDxcZUsmDKRNUuk4MvresqpM0VYzeAstglOVYShvpEiPa9OgPiTShxWHE9pu5zgxKuV/NpHjUOjlWEozg5+6mzDQ7Kjecbj3fD8lyjrKq3mMNmf5F83ByYvS4C8PAW4PGUPuMy/CbOnjufs8bPRLqqX026Jwa8cN+j3VSffxyKcdU8ITjW1o3l1Ne27NRuN/r4EQ48aSLDL4B1mBqAmKEF7v1yC4m9mcHHPazwVX4jCDvp8w/Aq1U3SJRCYi+L7jPhpwVaYIezJptFmMNchgH7nvAelaDv+WxMLptlWmOgYAHXZoeAbNh0uHP5D5ruEIOP5E1gZUMcFjyPo3/dSLA7ZAk1lDiTzspO0VqaxwgcL1h2UBd02O0qZswKqBOM5sKEJ15jm07qCxdg75jdnL4pEy03WtELUDuTrrrP8eB94RMB1ab78StwMtgvr04fTgbi18ij+ih9Gh4Pa4HFKFz4XfwYtcOOXalPRIMuAHTIL2crsH9SIOaPcAeKRkTIQknSXCncL8hmbAtwpdQ6TNStgWf4FuJG6F2UFjCguw4HfrRSFf+X3YFKPFE/Y/hjFvv/ESy8u8fOgPSBkaIl/VybjOjd5KJUwghlel/FI9jA4qxez+pwB3i6fRFtbnVjh+WyoWnqTV1xXZd0CCRjRGElrSt6yk+QmmhlvQ7Y2S9hQewkLqLmj7d4KuLPYgMd7yMLaO3tg+sIefHd+A38InQ6LPknjiZUhuC07CjZKzKfC3Wb0QH48uCktoV8Tb8AGcX/4YDOOe66pYPO1p5gss4HFVfrw56vRYOOsCRZxZWg80QZVvobAz73OaCV0HpPHG3H9qnbsC+nEo4HbKU5cDtw+JtJLw0QSmLwKpy00AL9TXrTz8C8IG5blG5FLYMp5ZXhZKgTDyzLZY2w1hAd58L3BAL4VWQv2P+bzPHCAjw4vQehcHT4yFYXrf05A6dRPFLtdiqsT0sg3wYvUx8/nzzenwb1Vk3C5TjuK5mnDDdF86HQM4YUd0sgDV9Hc7yZXN97nLtet/EtKnDKMMrF+yAjaeovh3M5SKtx1AJZpfscq7xdk0mZM9y7qQ+s+W0y/vQAGnzGkdX6nkqsvwFv0HrjqrICne09StIEeykdIcXHmFGh8kwFzu7XBedlDmlS/lkft+MDf17WArrYzbtwym36balN2fj35LZPBaEVJuFZTQXu2X8RJkv4gXl6KWXf12dRGkM1yl5KLrC0YSgWA9SiEdlZhi0tbwPHjBkyLvwBOwZ/QauwGSpP1wCkXCzG+cD0+dBeEp1UtNG+VEEp+DeOD0wxpf+xoqBONh2Mtb9CrsB9Xbb4IA1VGoHreF3ucennkkBK2fIjgTeM0aI5OK7TMSsM/EseodXgdRKSMB6dVc1jY8gyZVtmR+8o/9Hkonx7OKSEJD0+eUCXPjXOWw8+KMdBSOhfVtvyAH0fEsN5Rlc5pe6HlrSEeNNKhIqH9gPHp0HBrImh6aoFQ33NMV6skAdkD6CPzmBY2nMeXeUM8sfQujyoeAyKrZGC1uD63Ly7iJ2uekVBbABkpTeOQjiN0+cYi4r460E4d5i328pC9yYiSFkTAA89v6P0+lBx3XMEJBwxBff5P1KjMoyukgW9LTWCe5iNcNS+OnAKCOTM8i/fnbIBpdV2474oKmHxbxkuu7YXVk7XARXgE3ArNw28Jx/GwwV54IvofLpxnxULVCRBRYMN/FxdR+xlF+C11Ch0EEnlN9TBMa1LHeXEJLGH8jAUktBnYHCcqBNJ9HQVY/E4I4hv8oWDPJjhwVQrKdG5QlUckfbjwkKU2TEOxpL1YWakNkSOkoCyoEf89nQWHxwXg7vGeeKErD1vHHiPtvBlonDSAZDkSvlekkIjWIhqXsIr2b7PAIlExWpHsQ6+jKrhxZBJGxY/gbzvHwBFBHzhzxwYuW5yGQzsyUEdwPRou7scC3fP05ssY/OM5BRU6FOGIwXhyv/eZi7yF2dtYGBL7jDnI6D3MShriozr9OG5DP3UfkYcVjdG4aZMiH//cgrI3xTFv/iPIi26DY5ZHeJT5E/QYK0RKlcbwxfgNLLscx/1Ky0H2uhSYXB9JD05ForPpdlIZDkLlY9rw0M4UApSauajRkGecHItlYWXwsiGRJ+7VwTSzRpSWzsfqhHEQWGIMb6svYJyzHHFlAstIn8XGTZth+FcszhdaBLvzL4NOcyM/j9IE3+CnMLG9E9+fOo3+Rxfy7CU22C2/EQcO6dAh99nod9cZeFgZoNuWxcTP4pcbR3FAvhels7/QnS3XKTgpmmReLGQj0WLsJx0QutuPu2Y0g8IHe7zrKgjhsbdpScpsVHw3G/eMDcejxZJoWiUMa5PecpemD+gaGZNTVBTHLWilcyob8EdsOIZeqcCpxw3xEguD8tP9rJ/kRT1wnuwdhDDJ1pIn7XpNDTfOQP2nNti6PI/PCYuBws1A2BtH3NJ7kTGmny6O8MMrayyharYHzxeSRStPB+7YB7C7u4dU4qU5tSCIRZZ/pfFnNvH0me6cN/SaCjV+0cMKTRhXqwv7qvN4RGYD3fcrpYMlOXB2SS19tSmFJcJ7yLxnMowNEcOPRQpQcms7JhUlQ6q7Oo3edQETNuwgqXYJ8rvsBL2S97Ak8SacTDeHwTwjelC2CuyWncCMYRn89cEU/pNNwm1mJqC5bAXnxetgl6whSCZrUmX9J1hp04Ens2bj4t/SHD1VEPYqLoIaPktzrJPh/EVdkG78RlXYyduLvfmM6gPwNrLjkc/X4F65KDIb/Zju1c7GGrPxsEHOknJSMmDYcxk/cW6By7fe0M9HapAzqwTak1tw2w53HiGkDVGDSvSpNxOdZ5TjztGBNHOSD2ULKtHdMjPaUmCE+Zsq0KxpAjj99xPe5gRT+axudjuoSG25U1H5nx/5SVVjfZ4GbDJL46m7VWDF1DxuVb9EmZHOMHnoN0qKfKLK3u9M+w9gSM1t+FGczeWCQnCk2hPnen0Axav3USJCEq1uvafUBZspvGSALLz3Uc2aNgjfSLAxCGHVywcUVnSLz107wW9n/oaGaeNp7wJxGvnsFUs8vspPtUaAj5gLqdtOxmsdjZQxIYKKhmoxZhHQ0dAJdNAxld2+tuNiH2OYtUiF9U9pc4/QejZsM4VPiT1wcl0BzD1yiabPiEI1nS4W+m4K5gs+cpC1MZ/4fA4+xM6h74/LyXbhDpLTnER+mxN4l/sMeJ05Htq196OIqz/tOH+Hb0AiRe40BC/3T+DeHgR7xkdgilAru6loQIz1crxWYEdhOgIwbc1DnjXtMXhvLAbH6dkYtXUceJu2QZaVKKRryPHIDAuS/BrNe5zH8WahbHbX1yRl8W7eciWffJPzueunLCz9/Q+uartwxpm7eFQvHqbUzaPOjhKU9G4ig8oqlvY9xdNdtMH+4QxOjOzlBu93lIObYa+BPp0/GQIFkSE00dEA/8udTh/uisO7uAl87etPxKTVlCiNVGjZAscHj5Nx73FcfLaadxo8wkPfDGDNhEHU6bkKxR9MIFFzHJ7aNwsTS0s4bp4WbV87h1edzYajP6zA9qIICxqqQPvSOtodMhVOtljQgjE58Nf4I/Q/D8HWyg+Ymc4QvTMbPzSe49lCR+GSeAQMSwmhpbwftFr+hSUuvxmOiYJjhDhsnl0HlZXVgMYCJPJuJA4JJJLXXCs48XkAnn05j0+z9/GjSDtQMw6nwPY83iW2kbb0b4LWMCGyq03CELdo6LuSB8/PBUOPgDQ8OHoYcGQwSGq4Y/O2BdBqvQL+rFPD77bfMH2eNzcYucL3jYawc7CDH4zsY9cFjM0fI3j6nJu01PAY7LdI4XMm/Sjk/Y9rq3XB7JUbltzxYuGyrTy9P4HyDV6TWbM+v1zhj6G6XzH7gCUekzSF0pirMHeFHvzVm8g5GlvoqoATBSYewZbwWTj9jjKs+n4ZIh5IwgE/ZxAP/QtGEhV0+oIvzn9vyisC/lKGgBzO2pKN9gOjoO6nGIw4Jsqfq+N4+TxhVItNwqt5WfytZRvLla3HgIsP8YdeLP33Sw/O+g+SQsw1thwTzfuWKGFPSCOcUnWEY3dlyWK0GE04XwTD4ZKwNnQiU6QnVGpWYbrlXYqIXwvWduKov2gf+EYjtXRkYh+oAw0+o7LyJRg3UprK9xylBrFWGpPWD6lXD/GwRC7kvBekgmhVGC64jbfCjoF20STSC37Ibq99+IO3N/+bUwZrdQmjjB3JI3IsqKvV4lJQhBUH+zl4VT8XRV7GnWPiWS7rHSW/YLbY1MFPlytC05oP6KbsRR0RUazGteC3QxGfbE7n3l37MCDXD/c+u0h9nROg3HMh/7gZidPllbBVsYoVnMshcd8QPbMLYbXOZRz37xMqu6rC6bS/0NeyG+6GPYCeu0qcnJKL7YMzQVBlJsbCZCyd9BknjDIAoXk/yCz0NlkMXaOZoo0wyyiDXEuUaWTMPLim9gS/hMbj8pPikBV3kKy8U8C1fpC6x58FuX4P3JeXCleES2nd91b4urAfl67WhN/5PTxp0h98PLMaw5ZOo1dvFvLNGAWIUqvH2TOY1fSVUCxeCCrLVaFWZ5A6hqpIefdbHhSUoblK/ij09gy/smvlmPmmsKdfEkbXHad3TzezcdJUEH7TCXzYi+8u8CZV4eM00FXDF6oOotMYUQgTTYDjhsvgbdFsCjhlCSOPunHSnXWwdsFnrqi7Q6vzkilpuSEEBsdCy8UUpEOPcU36MxTt/w43x+vT+rfTuPvFAWwe0YGGPrLQd6uBglJTcXRTO73JysXuvmo8MK2ZZec/Yqtx1yj32xI62jYGDE8LcM4g8azx4+nElIeo7vAG135bBTcSbWiBZzGoZWjAeUcZqF5nj7fVFqNW8n7KuvYNAusPk/i6W9ireY/CJNeSZGExrPYyhaqJXbQde+mLkTQLTX8Ipun5NDXiOE6Y7MvhA9bMoaMp474IWG1swzU+5/Dh54Oc9XgR3lIRYt0vX3hlQBbXTTsJavNt6EQ7QVCbM//3MRYFnX1Zb+w1kthoCQenO+LQHxd6VYh4+GMSLHScAB5a4ly13RVud72Ge6HSaG0xh599vMCFw2f4jcUN3nJoMY5ZORFyn2uhwfKvOHnQh8LcrEHxajp5jhpJerHtEIaPWHWaKdw/bQI7AvtBbLINLP1ujWmb9SHLspjX+DQi6ciD/jUFOOZ3BxWfiMFrlYNY/7qLln7PoUVDwfhwZh+ph+bhogVHMdf+CKTPHAs+qAkVn+X58qsj6JfSyldvboHCPns88iYXrnSls5VRAf365gNzVhmB1cAN+NxcTgd7t0DZlUMwOl+dZ8tIUMeQK975Jcornkzks9vHgunRFRigLUB3T2rzYvlwOp2iCr5blvIMmT5Oj0rHBaP+wqhOVdBZlkGJBkb46KIw20o78xn7DPy2PA5OiAxgSpM/CHjs5IopE8FgYzdJTPlN5/9dhI4d0dS0C/CYQzOKRFeAodMsVLcagiYRfWhw2gXF130x/9w42rBTFS3GieO4g8G03uEsLwyMhusTT0FY0AjQmX8WvolupoXpt9lKsgltpxiggUszpammYcjYeRRnfJ3jAxHeKPyhvEUidHbrUtre9I0PvDlM6Qr3KaHgFoePOks9m1eiep86NBtcwneREaStbQuzVkfh9YNOrBUvg1KhTaiXrQIFEav4qo84vD37j378nExBy1344JlgyGrqofzDw/xeOYYDO27RexaHoJ0EE86U0PiZC9BCUBO0N0bT321fIBGmU/tqeXKZIkXipaPxhbkeXHxpA2seFJLKyiYeF5QARdtmwN7Mn2wT8RI1b8SB7Tk/2nAdIKAzDg533+f9siLY+qiPCtTCQHtpG2iNCUPjSCMOUb4H5vKGIOX/G0Tcf9FmrIMJOubwfONeUG9PwO5pr6Bo8j9MF6kC/1264OUJUBShChPujUWhqmJoNzbig/MKeb5gBIgNhZCVmTcmzhEEq93+dHqqPlnm67LEhAyS+jgJ1pf6wovOSXhGZRdOejyWkr8qQ4VpDOaZW0LaKCk89bMMVHbvgnX5Tylm5mPKjUkAoak+GDjDCM5eMgGbjBf8LlqKRpvM5ZtHwlDx2xrsOb8WervmoLxYJnhMFYc3+/24LG6A91St4RXXTWHWY0+03bQARVa6gvqufCr9swHvLVKA24lAYxa3YfluRr3vq3GpTT2eETiAOc9EIPaZA848Vsw3G0Xgi8h5qInfjyVjjfjyuDJWn6OIR7WM2eWhF2fs16PK9ACSppGgIahBm94vwWIxadpRaUwaXftoT/c+ck/vw/6xwbxmszwMLDWAX52eEGsxg69JfeDGsxegW8qYTU+bQb6BPZ2oOsD2d/dzoLwV7Dw5CzxjxXlxbCovK0NWLFEG/7xVVB62ktWFisikeSuaZ4uBpY4Nx7zrRe8ga2y3GANO6mpwfns/a2vXclDHJRboceTgXdIwSb4U5Vsfo5qVHr0uuIT7yvzpiWAt/Wgeib6rF4J76FPM2W4I6yWmwRcZTVpU+RJv7dqPtxd2UvmDPDjg44nmB37gL4F5UB+vB0VHz8LMgDF8oUsWjatW8fGuizxzqicKy+eAQMtc8MnWQZMWUchfsJz8Tyzh6qgc7O2M4ZvRgiTh3Ugqpd+4oWoU2TvIsVaGGVSZyYBP8AVeqz2Em06dQV+TGHR1P8Yzj1VCzMlPnOf1iy5nC0OrTSRs8HDDs+Eu9O7gOVSN0sUTvZJ8zHo059lmYeH4t/DonS1scYjm6RHdMEdlMXlbjGHZlGgYrbQN8hylwTTiE2x8J0AuvyVg7PsCUq4SQYEXJ2FhlCOcSRjNa5TDMaXUAUxt1+GArjBNbVaGBU86aZnnZHATnIQSrYdo84ZaWPDRij3jQknW5C9NqFwAt5+NBCnTRZA21xdNluhT3qbbNLriFJcY1HKb2kdOaczAz9tS6YH9CPh36BaZaCGKdotR3/HxeCZ7AdS2ROOfd650MG8Fz18zG4Y1zOHlnrfgbGtNC15psZX2dpY76su/nM7yJOWzpJCtDYuCImH3Oz3Q943BcQLf8d3JWVAhOJqlxEbxf/7afHbjINyMn8X/XIfwyWGGGcqZ+GF7Myv2fOHFe35jzBQTOjdmAjrnB0HNCR9WK4vEpQWiEJotit1mT0nPKZQ6/WtYV8Oez0h85ab9+1m+WBzmat2jpcu1oKPFHzSM14OBiBvNu70VuzZu40UvBeHpaTV4dVSNe+LT8XaPCZxuecTzJ0vx4UU1cN3xNH5dc5qrpHyhrWMY5549gAn4EeYG2gLdicbNO+3xtJM9Ct2Sgd7ly1FuyiBnhxmQj7AT9L4xQtFLBpC+bhkPPAukIImT6PU2GWxvz+YydVG6ZveE1dRdcIJbOTx6YgBjlnaCqNdBzN9JQEIKnNEgRdflrlFb1ypKlHhE8entZLtYGGa21sAGu3NwNG4rFXyVIwEW4UXNtjxNYj21bdbkXcLXWUFTFO7rPsenSy/iPZs6eHNDF0ZEbMNkgSM0qiia0oaX49X0GnbsVwSza3Z0cYU83JmyiL9WLONDD1Jwbbo8Nrga8M4dq7k0YSsLliPEB4uC58xIPv/pK4nmdoFEENOYQcQe3+t0/247Zpy0pic9+uAtLYyFj0IwyWsqG8mmwOXDf3HS+gosnt4LzXuVcLjHHz9ekgOLJZEc1aTItioWaGEmDEqNAlxr8R6tI2dzx+5gerZKifpemsKb/hMU7KlEN75cxxqnXj7g8xx2p76FsjN34Nf1LNrddhzEgsVgnMIvHp9VhE7//YFP3nNwhIcpftPSpzJPSSh0MMEQqxwMaDaCd1L+ILLWhRWOP8Ph42fYSO4LbhyKwc8nJoKh9DHKQn+weiUABbquuM3Vh3aNOcCFX+NBd8ISTDy9E1Znm9GElevIsOoMis4XgI3TpiHFdpJE10VyvtGPNlqDXLPFERuXLobRrc6gNM6Fw2aaQsoze5zl2kB1ne3w3uYDra++Cp8fhGJF0mmYumOAV7mZYZaSHoTtv8nffolQTJoC71Txw/7PciCfPR98j67g7i06lKamh/Y/VKFXvgE6awtwg5cQ2334TCkFzggyCdhoPRVElLdh7jxRMN8mCwYuGeT1p4kjrT+gTMpqfmL2m879NaRlq65h1Nc+Pl5jx1LLxUDvjBi8OhZH+3zO8rimJBopco7OBfjgtM0WYO6dASodHyB2lTUsdHTFCfHpeMcokAuq/PDjNmN436eKF5QecHNgH4d8d8AlJ/UhovYu/NxyBFuDnUEmdBRXXFxFExp2U9GAIE24V0Ju+S9I66gkOIY+R6MbudA7bQP+celhs3pzdI+5iZE7Cvh4x1c4aOPDyuUy4J2jAceSq9FvZwVNPi0Iq4JC0TusF8dY3aXjbY1QEDeSUk6JwOqu5xxxUpIixIM4qdYLJv6K5JwlspC7L4JP3SE88aGGXe1UIdBxImpYCuO/0aY8V+8s2FZ7kXGbANt+UqRnmR3w1OEGjvwtCmYHFOFV1lI02XuYpL7fxEl/FLj16AWcOSWbJl2U4D79JZC2fDzME9Tlux9+0HmezZpKKfg0MJfGXE3iv6WZtHH4Kv6atoiPi1tDtMcxmiwuhxsj8mCpsAz7LTdg3xlvIMg4iXcujMSbs/eDssxocL8YAhrhi2j9mbewuTqHRDQCYGa9IMuHO+B1fTtWu+xJ4/aYQvudFxDg4MjvC8Rx01JRTB/o5RdHfdl8azTf2r4S3r9/CiGjzKBumQSp6J/G9+sS2cB5LkV1v+D6pd1k0h7PG28MwOzva+nZu/Hg/+gFClMG7VZ9TQPOXvCzSACjUm+T1aIsgvBeGiEWRIeTZWC/6k+e7DofN1ilgvcuEbq/9hzP0RTAs0GNcM3fDw/OreM2cQCLAGMIPbAC7suFkt+nVNrqbgCRLQ3w+8kQSPg7w+HIPMxRk4W3y03Qa5QOBjvF48SBVSj6rAWW1e5BF+lkjta6hx4fJuItb0soEV9OneOl4J6oIb4Z2UPzDkrjR98XlPNqEMfeWABp1/7hi1Zj6DWYyfXLdMBzfzR3fvjDM/vaYYwdk5vVccgJy6fuvTfJpUYExlaEkfbYSJLJ/kH/ldxFCWl/Eir8CcWLZ6CLQx2lZk8mwaMTQf7NEvLAL1RbYgi/di2Gso1q+Fxfi4+3FYPJvBaUSf3CKvbaELtdiV5E9qHp+kDwf/mGJ+xTg8lm3aA6bhIvSJ4Ko8MqINSCwFJmFLx3mUtRPj4UGLwbI94sIKtRW9H1y1zY8MuCxihc50cn5OHE23NceGsn7nYWY40Lc6BwUIR1Sq7C+6IO/JabS+sLvKFBVApqBvZj7SdjfF16GXRKM+HcsQpW7HPjKUN/8aK5O44b+Yy7pC1B49lEHkp4is1jRiB9qQC3bg1SkWil2+f6wO+sHNhcXE2qkxEKpxWwrtdL7DJB/htynFx+OoPc4W6Kgj4+s0cLZugfQ+8JI0G0xZqgqQFuuCzBMYG7uMZxGUHoeZ6ZcwOvuMxC3W2eqPrJFsq/z2TnIk16k6uGeqM+wOhlDny7fida630jjYYsVFpvRVxiCrXvBsmtfjJNaeulirkS8KRrJ2k/l+YllyXY53cKXX35CaeALEyaUg6686ugZdIdvPCqnWqsknGK0wdw1u7gr2+8SC91NqVuHgkHVtTBvWlufGiDFW3UvIvNsVGoSLLECSnoMF0RLi+fhRLBOmDX0QCvNxrTiY6XeMe7hmK1EDOf97BG7yDPkc6hsi2vwCjWFLQKDvPRH0tBTvAtbJJx4j/is+CK8yFSSb2NBasHICxQmOd9VYXoPat5+QFV0BrtzVHBU9E7spty6p/DbUkfzHQRJGM1eyobLwlXCv6gq+liDOpcx4oTZ2Hz66eg7WJL+kH3wGveayoIOUWlaZpg7jmH/kZXgb/JWUpfngA/pa9xtfFhHCiSpvTUz9T+ywxvCErC8+Ba9N+chymRCyFRdQNnf7vHD/52c7OoIzqszsH1Inas6GwMdYn32e3yOTa6fAZqGmXxh7YaJ+/9A10fp8OpugUwKU6RyVwY5lVb0IMqf7Aw/oQKr5p5RKUJqMis58hN7ZTquBT9uuvBevJkeKT1HCazA/4eN4/3bpoBY48cJoNxMagdHgNZHXf4z956iLQ0AvnHfdAuGUbdE1Uo9sgzePuxhE2VYrBt/TpUmLqTput3wdZcgmvuM3nrOndIS7uFKu+nkuvS/fx0dQu7pL6GQuMfODE4B/UVFGHHTUm67G/HjvbhrLjzKmyq2o3Xgg5Ce6gD2mhmoGt/OFrqy8GFutFUnfqG96o00wXbq1h75yOF38+kBScJXO9Zwp2sUyTtpQfPzC6yaL8vWUp3ob9JEs/doQKL7Q6wyKeFZFzcDkGq5bjpDkJA3Wp4cGYyNGnIoXT3Y9zWmUlbNL6i++Y2/vJQjipdd4MZ2AH6roKbQmHsWbAInnsjfg7dx3uGD1DOXTMw6dnJ3eta+VCqEQTVxYPKSQc6fteBFrtdp4RZN/nh42GUeDKTh6J8aGHMBVxUIgbXDB3g9L/J3DznOCfaJsKm/ffxTZYuhr2zxMX6U/jXQALqfkLwv7EFbm48hF8nRWKhgTDFH70K1zVD6KdMPVVpXGT3zQU0y0AI0jZYQPPXNWwYIYvCvpfI0fggRnhMJ33Rb2wuJwxzhkLxbJkcDEoXcMBnFzqx0x3kx0SCW/M6CF/fSTIjv+KYiQYsfP47zb0xFvZKdfIh/0V8RGsxvC9yAYUDCjDJ6i0FH9tOV69Kg09nJ+7Lk4GF+jqcuqsByzdEsveiaeC0fZAcHrSQWccfiK7Uwcj0QzR3hhD8Xn+EIyPVKXvhEWiaPx9Sd4zmA6vj4GrudSz/PBOayi/w3VEGMO90L5VmPkPDfU28/cQ/dn6+GQO2fibP2HX0yfog20f9BzqVI8Bhai4VLYqj/+wFsFF/Cl5Sd+cr05Iod+MZUkh6SMk/y9EgTg56y92p5v0q/vEXYA+d592/vtNCpyl8ftx3mrF9PSa1pdN+aU2o1RjGJZWhaNUhRgGd/pCgY8lpX3ax7u51mO8ViTX64ag5YAzr1UbQ4hp9vFbrRAemhULeGQne7abHlyd5cndpHVpd/kHZKdbw8d5ibu/xRJHN11FghR6o/ueD1/TtsWB3LbU8OoxmRXvohusIgKhYGnGoBh99r2XbxE78vPk09gwcw/0hy/hg1is40dQAYZEGsLHIEqWPbKVRDUIgcWYuSMadw2HzS+ClbAdeIW2UJl3FkX3joDToACwuHMPjNlzmobo0bAjThYX/bcBA5VZ8676TzKV+gUyAAiyJrsZFy6JgpvE4Gp0eijNRCm1TlvHH6nrePrWTrx1xBPkyM1C6NB7tLTPRIbuQpyzei5lqOvQgQAouBLzgZx/VsHF5M8WU6wP7d+Khrr/Y6LgEVQZLeenoEbxSWwCsAwXxy7UQypr2Ccl2LPh9bYW3HsUY7duJBwP68GfNNmoLGcAdxw+S3+1yEDOr4pLvACV7p+Lv6hMceTgXxG4EUvGYlbTtSSnXVhzj2G8p3LJ3Bn4cpQl+C8/wxpDjFGkvy0X5vZDmJMHqa7ayRogC9/2VRt2XP8m8Vx3WKtzD6R1VMMNSCt2e6UGZRjNePGbD3V+seJuRB9b0jebeHmsYJf4d8841Y3vKFjg6qEvTVapZXuMA0pq1cKxiPF1TMOC4cAVQ35UHGeaVuEl8FqW2KaFQ2Wg2HS9Lj5P72f0Sgbv4YbJUGQGk5YnDosAZgno4/0IR7viewjdUnaDEdT0eVAiHBuV38EPdCBZYHKN0sxbcluqBThafQLtaGkYvmc34wR3/KGVQ9OMd8KJZA1pf3IHKnlc40GUPJxR68fHpVZA2WpIyqp7QxHxGwa2VNDzNHM4O7uJxOZW4dutH/qdoRY9HFUP71c+86r4HPr1OfOJSJK8lTYgojSWJpJ/4cPN7xCszSObleNQYsqSsne0g9ryYFXwu04FtE8B090i472KErgY1/LAulAPEhkEl/hsKRQXDvg1R1PdMhlSujYc2pUxuvLUXzfe4smhfOf/xccbD2Mo6n6fDou5EshddAX9nKMP/AQAA///vk9pB" diff --git a/vendor/github.com/btcsuite/btcd/btcec/signature.go b/vendor/github.com/btcsuite/btcd/btcec/signature.go deleted file mode 100644 index 4392ab41a2f8..000000000000 --- a/vendor/github.com/btcsuite/btcd/btcec/signature.go +++ /dev/null @@ -1,536 +0,0 @@ -// Copyright (c) 2013-2017 The btcsuite developers -// Use of this source code is governed by an ISC -// license that can be found in the LICENSE file. - -package btcec - -import ( - "bytes" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/hmac" - "crypto/sha256" - "errors" - "fmt" - "hash" - "math/big" -) - -// Errors returned by canonicalPadding. -var ( - errNegativeValue = errors.New("value may be interpreted as negative") - errExcessivelyPaddedValue = errors.New("value is excessively padded") -) - -// Signature is a type representing an ecdsa signature. -type Signature struct { - R *big.Int - S *big.Int -} - -var ( - // Used in RFC6979 implementation when testing the nonce for correctness - one = big.NewInt(1) - - // oneInitializer is used to fill a byte slice with byte 0x01. It is provided - // here to avoid the need to create it multiple times. - oneInitializer = []byte{0x01} -) - -// Serialize returns the ECDSA signature in the more strict DER format. Note -// that the serialized bytes returned do not include the appended hash type -// used in Bitcoin signature scripts. -// -// encoding/asn1 is broken so we hand roll this output: -// -// 0x30 0x02 r 0x02 s -func (sig *Signature) Serialize() []byte { - // low 'S' malleability breaker - sigS := sig.S - if sigS.Cmp(S256().halfOrder) == 1 { - sigS = new(big.Int).Sub(S256().N, sigS) - } - // Ensure the encoded bytes for the r and s values are canonical and - // thus suitable for DER encoding. - rb := canonicalizeInt(sig.R) - sb := canonicalizeInt(sigS) - - // total length of returned signature is 1 byte for each magic and - // length (6 total), plus lengths of r and s - length := 6 + len(rb) + len(sb) - b := make([]byte, length) - - b[0] = 0x30 - b[1] = byte(length - 2) - b[2] = 0x02 - b[3] = byte(len(rb)) - offset := copy(b[4:], rb) + 4 - b[offset] = 0x02 - b[offset+1] = byte(len(sb)) - copy(b[offset+2:], sb) - return b -} - -// Verify calls ecdsa.Verify to verify the signature of hash using the public -// key. It returns true if the signature is valid, false otherwise. -func (sig *Signature) Verify(hash []byte, pubKey *PublicKey) bool { - return ecdsa.Verify(pubKey.ToECDSA(), hash, sig.R, sig.S) -} - -// IsEqual compares this Signature instance to the one passed, returning true -// if both Signatures are equivalent. A signature is equivalent to another, if -// they both have the same scalar value for R and S. -func (sig *Signature) IsEqual(otherSig *Signature) bool { - return sig.R.Cmp(otherSig.R) == 0 && - sig.S.Cmp(otherSig.S) == 0 -} - -func parseSig(sigStr []byte, curve elliptic.Curve, der bool) (*Signature, error) { - // Originally this code used encoding/asn1 in order to parse the - // signature, but a number of problems were found with this approach. - // Despite the fact that signatures are stored as DER, the difference - // between go's idea of a bignum (and that they have sign) doesn't agree - // with the openssl one (where they do not). The above is true as of - // Go 1.1. In the end it was simpler to rewrite the code to explicitly - // understand the format which is this: - // 0x30 <0x02> 0x2 - // . - - signature := &Signature{} - - // minimal message is when both numbers are 1 bytes. adding up to: - // 0x30 + len + 0x02 + 0x01 + + 0x2 + 0x01 + - if len(sigStr) < 8 { - return nil, errors.New("malformed signature: too short") - } - // 0x30 - index := 0 - if sigStr[index] != 0x30 { - return nil, errors.New("malformed signature: no header magic") - } - index++ - // length of remaining message - siglen := sigStr[index] - index++ - if int(siglen+2) > len(sigStr) { - return nil, errors.New("malformed signature: bad length") - } - // trim the slice we're working on so we only look at what matters. - sigStr = sigStr[:siglen+2] - - // 0x02 - if sigStr[index] != 0x02 { - return nil, - errors.New("malformed signature: no 1st int marker") - } - index++ - - // Length of signature R. - rLen := int(sigStr[index]) - // must be positive, must be able to fit in another 0x2, - // hence the -3. We assume that the length must be at least one byte. - index++ - if rLen <= 0 || rLen > len(sigStr)-index-3 { - return nil, errors.New("malformed signature: bogus R length") - } - - // Then R itself. - rBytes := sigStr[index : index+rLen] - if der { - switch err := canonicalPadding(rBytes); err { - case errNegativeValue: - return nil, errors.New("signature R is negative") - case errExcessivelyPaddedValue: - return nil, errors.New("signature R is excessively padded") - } - } - signature.R = new(big.Int).SetBytes(rBytes) - index += rLen - // 0x02. length already checked in previous if. - if sigStr[index] != 0x02 { - return nil, errors.New("malformed signature: no 2nd int marker") - } - index++ - - // Length of signature S. - sLen := int(sigStr[index]) - index++ - // S should be the rest of the string. - if sLen <= 0 || sLen > len(sigStr)-index { - return nil, errors.New("malformed signature: bogus S length") - } - - // Then S itself. - sBytes := sigStr[index : index+sLen] - if der { - switch err := canonicalPadding(sBytes); err { - case errNegativeValue: - return nil, errors.New("signature S is negative") - case errExcessivelyPaddedValue: - return nil, errors.New("signature S is excessively padded") - } - } - signature.S = new(big.Int).SetBytes(sBytes) - index += sLen - - // sanity check length parsing - if index != len(sigStr) { - return nil, fmt.Errorf("malformed signature: bad final length %v != %v", - index, len(sigStr)) - } - - // Verify also checks this, but we can be more sure that we parsed - // correctly if we verify here too. - // FWIW the ecdsa spec states that R and S must be | 1, N - 1 | - // but crypto/ecdsa only checks for Sign != 0. Mirror that. - if signature.R.Sign() != 1 { - return nil, errors.New("signature R isn't 1 or more") - } - if signature.S.Sign() != 1 { - return nil, errors.New("signature S isn't 1 or more") - } - if signature.R.Cmp(curve.Params().N) >= 0 { - return nil, errors.New("signature R is >= curve.N") - } - if signature.S.Cmp(curve.Params().N) >= 0 { - return nil, errors.New("signature S is >= curve.N") - } - - return signature, nil -} - -// ParseSignature parses a signature in BER format for the curve type `curve' -// into a Signature type, perfoming some basic sanity checks. If parsing -// according to the more strict DER format is needed, use ParseDERSignature. -func ParseSignature(sigStr []byte, curve elliptic.Curve) (*Signature, error) { - return parseSig(sigStr, curve, false) -} - -// ParseDERSignature parses a signature in DER format for the curve type -// `curve` into a Signature type. If parsing according to the less strict -// BER format is needed, use ParseSignature. -func ParseDERSignature(sigStr []byte, curve elliptic.Curve) (*Signature, error) { - return parseSig(sigStr, curve, true) -} - -// canonicalizeInt returns the bytes for the passed big integer adjusted as -// necessary to ensure that a big-endian encoded integer can't possibly be -// misinterpreted as a negative number. This can happen when the most -// significant bit is set, so it is padded by a leading zero byte in this case. -// Also, the returned bytes will have at least a single byte when the passed -// value is 0. This is required for DER encoding. -func canonicalizeInt(val *big.Int) []byte { - b := val.Bytes() - if len(b) == 0 { - b = []byte{0x00} - } - if b[0]&0x80 != 0 { - paddedBytes := make([]byte, len(b)+1) - copy(paddedBytes[1:], b) - b = paddedBytes - } - return b -} - -// canonicalPadding checks whether a big-endian encoded integer could -// possibly be misinterpreted as a negative number (even though OpenSSL -// treats all numbers as unsigned), or if there is any unnecessary -// leading zero padding. -func canonicalPadding(b []byte) error { - switch { - case b[0]&0x80 == 0x80: - return errNegativeValue - case len(b) > 1 && b[0] == 0x00 && b[1]&0x80 != 0x80: - return errExcessivelyPaddedValue - default: - return nil - } -} - -// hashToInt converts a hash value to an integer. There is some disagreement -// about how this is done. [NSA] suggests that this is done in the obvious -// manner, but [SECG] truncates the hash to the bit-length of the curve order -// first. We follow [SECG] because that's what OpenSSL does. Additionally, -// OpenSSL right shifts excess bits from the number if the hash is too large -// and we mirror that too. -// This is borrowed from crypto/ecdsa. -func hashToInt(hash []byte, c elliptic.Curve) *big.Int { - orderBits := c.Params().N.BitLen() - orderBytes := (orderBits + 7) / 8 - if len(hash) > orderBytes { - hash = hash[:orderBytes] - } - - ret := new(big.Int).SetBytes(hash) - excess := len(hash)*8 - orderBits - if excess > 0 { - ret.Rsh(ret, uint(excess)) - } - return ret -} - -// recoverKeyFromSignature recoves a public key from the signature "sig" on the -// given message hash "msg". Based on the algorithm found in section 5.1.5 of -// SEC 1 Ver 2.0, page 47-48 (53 and 54 in the pdf). This performs the details -// in the inner loop in Step 1. The counter provided is actually the j parameter -// of the loop * 2 - on the first iteration of j we do the R case, else the -R -// case in step 1.6. This counter is used in the bitcoin compressed signature -// format and thus we match bitcoind's behaviour here. -func recoverKeyFromSignature(curve *KoblitzCurve, sig *Signature, msg []byte, - iter int, doChecks bool) (*PublicKey, error) { - // 1.1 x = (n * i) + r - Rx := new(big.Int).Mul(curve.Params().N, - new(big.Int).SetInt64(int64(iter/2))) - Rx.Add(Rx, sig.R) - if Rx.Cmp(curve.Params().P) != -1 { - return nil, errors.New("calculated Rx is larger than curve P") - } - - // convert 02 to point R. (step 1.2 and 1.3). If we are on an odd - // iteration then 1.6 will be done with -R, so we calculate the other - // term when uncompressing the point. - Ry, err := decompressPoint(curve, Rx, iter%2 == 1) - if err != nil { - return nil, err - } - - // 1.4 Check n*R is point at infinity - if doChecks { - nRx, nRy := curve.ScalarMult(Rx, Ry, curve.Params().N.Bytes()) - if nRx.Sign() != 0 || nRy.Sign() != 0 { - return nil, errors.New("n*R does not equal the point at infinity") - } - } - - // 1.5 calculate e from message using the same algorithm as ecdsa - // signature calculation. - e := hashToInt(msg, curve) - - // Step 1.6.1: - // We calculate the two terms sR and eG separately multiplied by the - // inverse of r (from the signature). We then add them to calculate - // Q = r^-1(sR-eG) - invr := new(big.Int).ModInverse(sig.R, curve.Params().N) - - // first term. - invrS := new(big.Int).Mul(invr, sig.S) - invrS.Mod(invrS, curve.Params().N) - sRx, sRy := curve.ScalarMult(Rx, Ry, invrS.Bytes()) - - // second term. - e.Neg(e) - e.Mod(e, curve.Params().N) - e.Mul(e, invr) - e.Mod(e, curve.Params().N) - minuseGx, minuseGy := curve.ScalarBaseMult(e.Bytes()) - - // TODO: this would be faster if we did a mult and add in one - // step to prevent the jacobian conversion back and forth. - Qx, Qy := curve.Add(sRx, sRy, minuseGx, minuseGy) - - return &PublicKey{ - Curve: curve, - X: Qx, - Y: Qy, - }, nil -} - -// SignCompact produces a compact signature of the data in hash with the given -// private key on the given koblitz curve. The isCompressed parameter should -// be used to detail if the given signature should reference a compressed -// public key or not. If successful the bytes of the compact signature will be -// returned in the format: -// <(byte of 27+public key solution)+4 if compressed >< padded bytes for signature R> -// where the R and S parameters are padde up to the bitlengh of the curve. -func SignCompact(curve *KoblitzCurve, key *PrivateKey, - hash []byte, isCompressedKey bool) ([]byte, error) { - sig, err := key.Sign(hash) - if err != nil { - return nil, err - } - - // bitcoind checks the bit length of R and S here. The ecdsa signature - // algorithm returns R and S mod N therefore they will be the bitsize of - // the curve, and thus correctly sized. - for i := 0; i < (curve.H+1)*2; i++ { - pk, err := recoverKeyFromSignature(curve, sig, hash, i, true) - if err == nil && pk.X.Cmp(key.X) == 0 && pk.Y.Cmp(key.Y) == 0 { - result := make([]byte, 1, 2*curve.byteSize+1) - result[0] = 27 + byte(i) - if isCompressedKey { - result[0] += 4 - } - // Not sure this needs rounding but safer to do so. - curvelen := (curve.BitSize + 7) / 8 - - // Pad R and S to curvelen if needed. - bytelen := (sig.R.BitLen() + 7) / 8 - if bytelen < curvelen { - result = append(result, - make([]byte, curvelen-bytelen)...) - } - result = append(result, sig.R.Bytes()...) - - bytelen = (sig.S.BitLen() + 7) / 8 - if bytelen < curvelen { - result = append(result, - make([]byte, curvelen-bytelen)...) - } - result = append(result, sig.S.Bytes()...) - - return result, nil - } - } - - return nil, errors.New("no valid solution for pubkey found") -} - -// RecoverCompact verifies the compact signature "signature" of "hash" for the -// Koblitz curve in "curve". If the signature matches then the recovered public -// key will be returned as well as a boolen if the original key was compressed -// or not, else an error will be returned. -func RecoverCompact(curve *KoblitzCurve, signature, - hash []byte) (*PublicKey, bool, error) { - bitlen := (curve.BitSize + 7) / 8 - if len(signature) != 1+bitlen*2 { - return nil, false, errors.New("invalid compact signature size") - } - - iteration := int((signature[0] - 27) & ^byte(4)) - - // format is
- sig := &Signature{ - R: new(big.Int).SetBytes(signature[1 : bitlen+1]), - S: new(big.Int).SetBytes(signature[bitlen+1:]), - } - // The iteration used here was encoded - key, err := recoverKeyFromSignature(curve, sig, hash, iteration, false) - if err != nil { - return nil, false, err - } - - return key, ((signature[0] - 27) & 4) == 4, nil -} - -// signRFC6979 generates a deterministic ECDSA signature according to RFC 6979 and BIP 62. -func signRFC6979(privateKey *PrivateKey, hash []byte) (*Signature, error) { - - privkey := privateKey.ToECDSA() - N := S256().N - halfOrder := S256().halfOrder - k := nonceRFC6979(privkey.D, hash) - inv := new(big.Int).ModInverse(k, N) - r, _ := privkey.Curve.ScalarBaseMult(k.Bytes()) - if r.Cmp(N) == 1 { - r.Sub(r, N) - } - - if r.Sign() == 0 { - return nil, errors.New("calculated R is zero") - } - - e := hashToInt(hash, privkey.Curve) - s := new(big.Int).Mul(privkey.D, r) - s.Add(s, e) - s.Mul(s, inv) - s.Mod(s, N) - - if s.Cmp(halfOrder) == 1 { - s.Sub(N, s) - } - if s.Sign() == 0 { - return nil, errors.New("calculated S is zero") - } - return &Signature{R: r, S: s}, nil -} - -// nonceRFC6979 generates an ECDSA nonce (`k`) deterministically according to RFC 6979. -// It takes a 32-byte hash as an input and returns 32-byte nonce to be used in ECDSA algorithm. -func nonceRFC6979(privkey *big.Int, hash []byte) *big.Int { - - curve := S256() - q := curve.Params().N - x := privkey - alg := sha256.New - - qlen := q.BitLen() - holen := alg().Size() - rolen := (qlen + 7) >> 3 - bx := append(int2octets(x, rolen), bits2octets(hash, curve, rolen)...) - - // Step B - v := bytes.Repeat(oneInitializer, holen) - - // Step C (Go zeroes the all allocated memory) - k := make([]byte, holen) - - // Step D - k = mac(alg, k, append(append(v, 0x00), bx...)) - - // Step E - v = mac(alg, k, v) - - // Step F - k = mac(alg, k, append(append(v, 0x01), bx...)) - - // Step G - v = mac(alg, k, v) - - // Step H - for { - // Step H1 - var t []byte - - // Step H2 - for len(t)*8 < qlen { - v = mac(alg, k, v) - t = append(t, v...) - } - - // Step H3 - secret := hashToInt(t, curve) - if secret.Cmp(one) >= 0 && secret.Cmp(q) < 0 { - return secret - } - k = mac(alg, k, append(v, 0x00)) - v = mac(alg, k, v) - } -} - -// mac returns an HMAC of the given key and message. -func mac(alg func() hash.Hash, k, m []byte) []byte { - h := hmac.New(alg, k) - h.Write(m) - return h.Sum(nil) -} - -// https://tools.ietf.org/html/rfc6979#section-2.3.3 -func int2octets(v *big.Int, rolen int) []byte { - out := v.Bytes() - - // left pad with zeros if it's too short - if len(out) < rolen { - out2 := make([]byte, rolen) - copy(out2[rolen-len(out):], out) - return out2 - } - - // drop most significant bytes if it's too long - if len(out) > rolen { - out2 := make([]byte, rolen) - copy(out2, out[len(out)-rolen:]) - return out2 - } - - return out -} - -// https://tools.ietf.org/html/rfc6979#section-2.3.4 -func bits2octets(in []byte, curve elliptic.Curve, rolen int) []byte { - z1 := hashToInt(in, curve) - z2 := new(big.Int).Sub(z1, curve.Params().N) - if z2.Sign() < 0 { - return int2octets(z1, rolen) - } - return int2octets(z2, rolen) -} diff --git a/vendor/github.com/cespare/cp/LICENSE.txt b/vendor/github.com/cespare/cp/LICENSE.txt deleted file mode 100644 index 70da676c981a..000000000000 --- a/vendor/github.com/cespare/cp/LICENSE.txt +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015 Caleb Spare - -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/cespare/cp/README.md b/vendor/github.com/cespare/cp/README.md deleted file mode 100644 index 577701fbe300..000000000000 --- a/vendor/github.com/cespare/cp/README.md +++ /dev/null @@ -1,9 +0,0 @@ -# cp - -[![GoDoc](https://godoc.org/github.com/cespare/cp?status.svg)](https://godoc.org/github.com/cespare/cp) - -cp is a small Go package for copying files and directories. - -The API may change because I want to add some options in the future (for merging with existing dirs). - -It does not currently handle Windows specifically (I think it may require some special treatment). diff --git a/vendor/github.com/cespare/cp/cp.go b/vendor/github.com/cespare/cp/cp.go deleted file mode 100644 index d71dbb4ba203..000000000000 --- a/vendor/github.com/cespare/cp/cp.go +++ /dev/null @@ -1,58 +0,0 @@ -// Package cp offers simple file and directory copying for Go. -package cp - -import ( - "errors" - "io" - "os" - "path/filepath" - "strings" -) - -var errCopyFileWithDir = errors.New("dir argument to CopyFile") - -// CopyFile copies the file with path src to dst. The new file must not exist. -// It is created with the same permissions as src. -func CopyFile(dst, src string) error { - rf, err := os.Open(src) - if err != nil { - return err - } - defer rf.Close() - rstat, err := rf.Stat() - if err != nil { - return err - } - if rstat.IsDir() { - return errCopyFileWithDir - } - - wf, err := os.OpenFile(dst, os.O_WRONLY|os.O_CREATE|os.O_EXCL, rstat.Mode()) - if err != nil { - return err - } - if _, err := io.Copy(wf, rf); err != nil { - wf.Close() - return err - } - return wf.Close() -} - -// CopyAll copies the file or (recursively) the directory at src to dst. -// Permissions are preserved. dst must not already exist. -func CopyAll(dst, src string) error { - return filepath.Walk(src, makeWalkFn(dst, src)) -} - -func makeWalkFn(dst, src string) filepath.WalkFunc { - return func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - dstPath := filepath.Join(dst, strings.TrimPrefix(path, src)) - if info.IsDir() { - return os.Mkdir(dstPath, info.Mode()) - } - return CopyFile(dstPath, path) - } -} diff --git a/vendor/github.com/codahale/hdrhistogram/LICENSE b/vendor/github.com/codahale/hdrhistogram/LICENSE deleted file mode 100644 index f9835c241fc4..000000000000 --- a/vendor/github.com/codahale/hdrhistogram/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Coda Hale - -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/codahale/hdrhistogram/README.md b/vendor/github.com/codahale/hdrhistogram/README.md deleted file mode 100644 index 614b197c3dd3..000000000000 --- a/vendor/github.com/codahale/hdrhistogram/README.md +++ /dev/null @@ -1,15 +0,0 @@ -hdrhistogram -============ - -[![Build Status](https://travis-ci.org/codahale/hdrhistogram.png?branch=master)](https://travis-ci.org/codahale/hdrhistogram) - -A pure Go implementation of the [HDR Histogram](https://github.com/HdrHistogram/HdrHistogram). - -> A Histogram that supports recording and analyzing sampled data value counts -> across a configurable integer value range with configurable value precision -> within the range. Value precision is expressed as the number of significant -> digits in the value recording, and provides control over value quantization -> behavior across the value range and the subsequent value resolution at any -> given level. - -For documentation, check [godoc](http://godoc.org/github.com/codahale/hdrhistogram). diff --git a/vendor/github.com/codahale/hdrhistogram/hdr.go b/vendor/github.com/codahale/hdrhistogram/hdr.go deleted file mode 100644 index c97842926d67..000000000000 --- a/vendor/github.com/codahale/hdrhistogram/hdr.go +++ /dev/null @@ -1,564 +0,0 @@ -// Package hdrhistogram provides an implementation of Gil Tene's HDR Histogram -// data structure. The HDR Histogram allows for fast and accurate analysis of -// the extreme ranges of data with non-normal distributions, like latency. -package hdrhistogram - -import ( - "fmt" - "math" -) - -// A Bracket is a part of a cumulative distribution. -type Bracket struct { - Quantile float64 - Count, ValueAt int64 -} - -// A Snapshot is an exported view of a Histogram, useful for serializing them. -// A Histogram can be constructed from it by passing it to Import. -type Snapshot struct { - LowestTrackableValue int64 - HighestTrackableValue int64 - SignificantFigures int64 - Counts []int64 -} - -// A Histogram is a lossy data structure used to record the distribution of -// non-normally distributed data (like latency) with a high degree of accuracy -// and a bounded degree of precision. -type Histogram struct { - lowestTrackableValue int64 - highestTrackableValue int64 - unitMagnitude int64 - significantFigures int64 - subBucketHalfCountMagnitude int32 - subBucketHalfCount int32 - subBucketMask int64 - subBucketCount int32 - bucketCount int32 - countsLen int32 - totalCount int64 - counts []int64 -} - -// New returns a new Histogram instance capable of tracking values in the given -// range and with the given amount of precision. -func New(minValue, maxValue int64, sigfigs int) *Histogram { - if sigfigs < 1 || 5 < sigfigs { - panic(fmt.Errorf("sigfigs must be [1,5] (was %d)", sigfigs)) - } - - largestValueWithSingleUnitResolution := 2 * math.Pow10(sigfigs) - subBucketCountMagnitude := int32(math.Ceil(math.Log2(float64(largestValueWithSingleUnitResolution)))) - - subBucketHalfCountMagnitude := subBucketCountMagnitude - if subBucketHalfCountMagnitude < 1 { - subBucketHalfCountMagnitude = 1 - } - subBucketHalfCountMagnitude-- - - unitMagnitude := int32(math.Floor(math.Log2(float64(minValue)))) - if unitMagnitude < 0 { - unitMagnitude = 0 - } - - subBucketCount := int32(math.Pow(2, float64(subBucketHalfCountMagnitude)+1)) - - subBucketHalfCount := subBucketCount / 2 - subBucketMask := int64(subBucketCount-1) << uint(unitMagnitude) - - // determine exponent range needed to support the trackable value with no - // overflow: - smallestUntrackableValue := int64(subBucketCount) << uint(unitMagnitude) - bucketsNeeded := int32(1) - for smallestUntrackableValue < maxValue { - smallestUntrackableValue <<= 1 - bucketsNeeded++ - } - - bucketCount := bucketsNeeded - countsLen := (bucketCount + 1) * (subBucketCount / 2) - - return &Histogram{ - lowestTrackableValue: minValue, - highestTrackableValue: maxValue, - unitMagnitude: int64(unitMagnitude), - significantFigures: int64(sigfigs), - subBucketHalfCountMagnitude: subBucketHalfCountMagnitude, - subBucketHalfCount: subBucketHalfCount, - subBucketMask: subBucketMask, - subBucketCount: subBucketCount, - bucketCount: bucketCount, - countsLen: countsLen, - totalCount: 0, - counts: make([]int64, countsLen), - } -} - -// ByteSize returns an estimate of the amount of memory allocated to the -// histogram in bytes. -// -// N.B.: This does not take into account the overhead for slices, which are -// small, constant, and specific to the compiler version. -func (h *Histogram) ByteSize() int { - return 6*8 + 5*4 + len(h.counts)*8 -} - -// Merge merges the data stored in the given histogram with the receiver, -// returning the number of recorded values which had to be dropped. -func (h *Histogram) Merge(from *Histogram) (dropped int64) { - i := from.rIterator() - for i.next() { - v := i.valueFromIdx - c := i.countAtIdx - - if h.RecordValues(v, c) != nil { - dropped += c - } - } - - return -} - -// TotalCount returns total number of values recorded. -func (h *Histogram) TotalCount() int64 { - return h.totalCount -} - -// Max returns the approximate maximum recorded value. -func (h *Histogram) Max() int64 { - var max int64 - i := h.iterator() - for i.next() { - if i.countAtIdx != 0 { - max = i.highestEquivalentValue - } - } - return h.highestEquivalentValue(max) -} - -// Min returns the approximate minimum recorded value. -func (h *Histogram) Min() int64 { - var min int64 - i := h.iterator() - for i.next() { - if i.countAtIdx != 0 && min == 0 { - min = i.highestEquivalentValue - break - } - } - return h.lowestEquivalentValue(min) -} - -// Mean returns the approximate arithmetic mean of the recorded values. -func (h *Histogram) Mean() float64 { - if h.totalCount == 0 { - return 0 - } - var total int64 - i := h.iterator() - for i.next() { - if i.countAtIdx != 0 { - total += i.countAtIdx * h.medianEquivalentValue(i.valueFromIdx) - } - } - return float64(total) / float64(h.totalCount) -} - -// StdDev returns the approximate standard deviation of the recorded values. -func (h *Histogram) StdDev() float64 { - if h.totalCount == 0 { - return 0 - } - - mean := h.Mean() - geometricDevTotal := 0.0 - - i := h.iterator() - for i.next() { - if i.countAtIdx != 0 { - dev := float64(h.medianEquivalentValue(i.valueFromIdx)) - mean - geometricDevTotal += (dev * dev) * float64(i.countAtIdx) - } - } - - return math.Sqrt(geometricDevTotal / float64(h.totalCount)) -} - -// Reset deletes all recorded values and restores the histogram to its original -// state. -func (h *Histogram) Reset() { - h.totalCount = 0 - for i := range h.counts { - h.counts[i] = 0 - } -} - -// RecordValue records the given value, returning an error if the value is out -// of range. -func (h *Histogram) RecordValue(v int64) error { - return h.RecordValues(v, 1) -} - -// RecordCorrectedValue records the given value, correcting for stalls in the -// recording process. This only works for processes which are recording values -// at an expected interval (e.g., doing jitter analysis). Processes which are -// recording ad-hoc values (e.g., latency for incoming requests) can't take -// advantage of this. -func (h *Histogram) RecordCorrectedValue(v, expectedInterval int64) error { - if err := h.RecordValue(v); err != nil { - return err - } - - if expectedInterval <= 0 || v <= expectedInterval { - return nil - } - - missingValue := v - expectedInterval - for missingValue >= expectedInterval { - if err := h.RecordValue(missingValue); err != nil { - return err - } - missingValue -= expectedInterval - } - - return nil -} - -// RecordValues records n occurrences of the given value, returning an error if -// the value is out of range. -func (h *Histogram) RecordValues(v, n int64) error { - idx := h.countsIndexFor(v) - if idx < 0 || int(h.countsLen) <= idx { - return fmt.Errorf("value %d is too large to be recorded", v) - } - h.counts[idx] += n - h.totalCount += n - - return nil -} - -// ValueAtQuantile returns the recorded value at the given quantile (0..100). -func (h *Histogram) ValueAtQuantile(q float64) int64 { - if q > 100 { - q = 100 - } - - total := int64(0) - countAtPercentile := int64(((q / 100) * float64(h.totalCount)) + 0.5) - - i := h.iterator() - for i.next() { - total += i.countAtIdx - if total >= countAtPercentile { - return h.highestEquivalentValue(i.valueFromIdx) - } - } - - return 0 -} - -// CumulativeDistribution returns an ordered list of brackets of the -// distribution of recorded values. -func (h *Histogram) CumulativeDistribution() []Bracket { - var result []Bracket - - i := h.pIterator(1) - for i.next() { - result = append(result, Bracket{ - Quantile: i.percentile, - Count: i.countToIdx, - ValueAt: i.highestEquivalentValue, - }) - } - - return result -} - -// SignificantFigures returns the significant figures used to create the -// histogram -func (h *Histogram) SignificantFigures() int64 { - return h.significantFigures -} - -// LowestTrackableValue returns the lower bound on values that will be added -// to the histogram -func (h *Histogram) LowestTrackableValue() int64 { - return h.lowestTrackableValue -} - -// HighestTrackableValue returns the upper bound on values that will be added -// to the histogram -func (h *Histogram) HighestTrackableValue() int64 { - return h.highestTrackableValue -} - -// Histogram bar for plotting -type Bar struct { - From, To, Count int64 -} - -// Pretty print as csv for easy plotting -func (b Bar) String() string { - return fmt.Sprintf("%v, %v, %v\n", b.From, b.To, b.Count) -} - -// Distribution returns an ordered list of bars of the -// distribution of recorded values, counts can be normalized to a probability -func (h *Histogram) Distribution() (result []Bar) { - i := h.iterator() - for i.next() { - result = append(result, Bar{ - Count: i.countAtIdx, - From: h.lowestEquivalentValue(i.valueFromIdx), - To: i.highestEquivalentValue, - }) - } - - return result -} - -// Equals returns true if the two Histograms are equivalent, false if not. -func (h *Histogram) Equals(other *Histogram) bool { - switch { - case - h.lowestTrackableValue != other.lowestTrackableValue, - h.highestTrackableValue != other.highestTrackableValue, - h.unitMagnitude != other.unitMagnitude, - h.significantFigures != other.significantFigures, - h.subBucketHalfCountMagnitude != other.subBucketHalfCountMagnitude, - h.subBucketHalfCount != other.subBucketHalfCount, - h.subBucketMask != other.subBucketMask, - h.subBucketCount != other.subBucketCount, - h.bucketCount != other.bucketCount, - h.countsLen != other.countsLen, - h.totalCount != other.totalCount: - return false - default: - for i, c := range h.counts { - if c != other.counts[i] { - return false - } - } - } - return true -} - -// Export returns a snapshot view of the Histogram. This can be later passed to -// Import to construct a new Histogram with the same state. -func (h *Histogram) Export() *Snapshot { - return &Snapshot{ - LowestTrackableValue: h.lowestTrackableValue, - HighestTrackableValue: h.highestTrackableValue, - SignificantFigures: h.significantFigures, - Counts: append([]int64(nil), h.counts...), // copy - } -} - -// Import returns a new Histogram populated from the Snapshot data (which the -// caller must stop accessing). -func Import(s *Snapshot) *Histogram { - h := New(s.LowestTrackableValue, s.HighestTrackableValue, int(s.SignificantFigures)) - h.counts = s.Counts - totalCount := int64(0) - for i := int32(0); i < h.countsLen; i++ { - countAtIndex := h.counts[i] - if countAtIndex > 0 { - totalCount += countAtIndex - } - } - h.totalCount = totalCount - return h -} - -func (h *Histogram) iterator() *iterator { - return &iterator{ - h: h, - subBucketIdx: -1, - } -} - -func (h *Histogram) rIterator() *rIterator { - return &rIterator{ - iterator: iterator{ - h: h, - subBucketIdx: -1, - }, - } -} - -func (h *Histogram) pIterator(ticksPerHalfDistance int32) *pIterator { - return &pIterator{ - iterator: iterator{ - h: h, - subBucketIdx: -1, - }, - ticksPerHalfDistance: ticksPerHalfDistance, - } -} - -func (h *Histogram) sizeOfEquivalentValueRange(v int64) int64 { - bucketIdx := h.getBucketIndex(v) - subBucketIdx := h.getSubBucketIdx(v, bucketIdx) - adjustedBucket := bucketIdx - if subBucketIdx >= h.subBucketCount { - adjustedBucket++ - } - return int64(1) << uint(h.unitMagnitude+int64(adjustedBucket)) -} - -func (h *Histogram) valueFromIndex(bucketIdx, subBucketIdx int32) int64 { - return int64(subBucketIdx) << uint(int64(bucketIdx)+h.unitMagnitude) -} - -func (h *Histogram) lowestEquivalentValue(v int64) int64 { - bucketIdx := h.getBucketIndex(v) - subBucketIdx := h.getSubBucketIdx(v, bucketIdx) - return h.valueFromIndex(bucketIdx, subBucketIdx) -} - -func (h *Histogram) nextNonEquivalentValue(v int64) int64 { - return h.lowestEquivalentValue(v) + h.sizeOfEquivalentValueRange(v) -} - -func (h *Histogram) highestEquivalentValue(v int64) int64 { - return h.nextNonEquivalentValue(v) - 1 -} - -func (h *Histogram) medianEquivalentValue(v int64) int64 { - return h.lowestEquivalentValue(v) + (h.sizeOfEquivalentValueRange(v) >> 1) -} - -func (h *Histogram) getCountAtIndex(bucketIdx, subBucketIdx int32) int64 { - return h.counts[h.countsIndex(bucketIdx, subBucketIdx)] -} - -func (h *Histogram) countsIndex(bucketIdx, subBucketIdx int32) int32 { - bucketBaseIdx := (bucketIdx + 1) << uint(h.subBucketHalfCountMagnitude) - offsetInBucket := subBucketIdx - h.subBucketHalfCount - return bucketBaseIdx + offsetInBucket -} - -func (h *Histogram) getBucketIndex(v int64) int32 { - pow2Ceiling := bitLen(v | h.subBucketMask) - return int32(pow2Ceiling - int64(h.unitMagnitude) - - int64(h.subBucketHalfCountMagnitude+1)) -} - -func (h *Histogram) getSubBucketIdx(v int64, idx int32) int32 { - return int32(v >> uint(int64(idx)+int64(h.unitMagnitude))) -} - -func (h *Histogram) countsIndexFor(v int64) int { - bucketIdx := h.getBucketIndex(v) - subBucketIdx := h.getSubBucketIdx(v, bucketIdx) - return int(h.countsIndex(bucketIdx, subBucketIdx)) -} - -type iterator struct { - h *Histogram - bucketIdx, subBucketIdx int32 - countAtIdx, countToIdx, valueFromIdx int64 - highestEquivalentValue int64 -} - -func (i *iterator) next() bool { - if i.countToIdx >= i.h.totalCount { - return false - } - - // increment bucket - i.subBucketIdx++ - if i.subBucketIdx >= i.h.subBucketCount { - i.subBucketIdx = i.h.subBucketHalfCount - i.bucketIdx++ - } - - if i.bucketIdx >= i.h.bucketCount { - return false - } - - i.countAtIdx = i.h.getCountAtIndex(i.bucketIdx, i.subBucketIdx) - i.countToIdx += i.countAtIdx - i.valueFromIdx = i.h.valueFromIndex(i.bucketIdx, i.subBucketIdx) - i.highestEquivalentValue = i.h.highestEquivalentValue(i.valueFromIdx) - - return true -} - -type rIterator struct { - iterator - countAddedThisStep int64 -} - -func (r *rIterator) next() bool { - for r.iterator.next() { - if r.countAtIdx != 0 { - r.countAddedThisStep = r.countAtIdx - return true - } - } - return false -} - -type pIterator struct { - iterator - seenLastValue bool - ticksPerHalfDistance int32 - percentileToIteratorTo float64 - percentile float64 -} - -func (p *pIterator) next() bool { - if !(p.countToIdx < p.h.totalCount) { - if p.seenLastValue { - return false - } - - p.seenLastValue = true - p.percentile = 100 - - return true - } - - if p.subBucketIdx == -1 && !p.iterator.next() { - return false - } - - var done = false - for !done { - currentPercentile := (100.0 * float64(p.countToIdx)) / float64(p.h.totalCount) - if p.countAtIdx != 0 && p.percentileToIteratorTo <= currentPercentile { - p.percentile = p.percentileToIteratorTo - halfDistance := math.Trunc(math.Pow(2, math.Trunc(math.Log2(100.0/(100.0-p.percentileToIteratorTo)))+1)) - percentileReportingTicks := float64(p.ticksPerHalfDistance) * halfDistance - p.percentileToIteratorTo += 100.0 / percentileReportingTicks - return true - } - done = !p.iterator.next() - } - - return true -} - -func bitLen(x int64) (n int64) { - for ; x >= 0x8000; x >>= 16 { - n += 16 - } - if x >= 0x80 { - x >>= 8 - n += 8 - } - if x >= 0x8 { - x >>= 4 - n += 4 - } - if x >= 0x2 { - x >>= 2 - n += 2 - } - if x >= 0x1 { - n++ - } - return -} diff --git a/vendor/github.com/codahale/hdrhistogram/window.go b/vendor/github.com/codahale/hdrhistogram/window.go deleted file mode 100644 index dc43612a4b60..000000000000 --- a/vendor/github.com/codahale/hdrhistogram/window.go +++ /dev/null @@ -1,45 +0,0 @@ -package hdrhistogram - -// A WindowedHistogram combines histograms to provide windowed statistics. -type WindowedHistogram struct { - idx int - h []Histogram - m *Histogram - - Current *Histogram -} - -// NewWindowed creates a new WindowedHistogram with N underlying histograms with -// the given parameters. -func NewWindowed(n int, minValue, maxValue int64, sigfigs int) *WindowedHistogram { - w := WindowedHistogram{ - idx: -1, - h: make([]Histogram, n), - m: New(minValue, maxValue, sigfigs), - } - - for i := range w.h { - w.h[i] = *New(minValue, maxValue, sigfigs) - } - w.Rotate() - - return &w -} - -// Merge returns a histogram which includes the recorded values from all the -// sections of the window. -func (w *WindowedHistogram) Merge() *Histogram { - w.m.Reset() - for _, h := range w.h { - w.m.Merge(&h) - } - return w.m -} - -// Rotate resets the oldest histogram and rotates it to be used as the current -// histogram. -func (w *WindowedHistogram) Rotate() { - w.idx++ - w.Current = &w.h[w.idx%len(w.h)] - w.Current.Reset() -} diff --git a/vendor/github.com/davecgh/go-spew/.gitignore b/vendor/github.com/davecgh/go-spew/.gitignore deleted file mode 100644 index 00268614f045..000000000000 --- a/vendor/github.com/davecgh/go-spew/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe diff --git a/vendor/github.com/davecgh/go-spew/.travis.yml b/vendor/github.com/davecgh/go-spew/.travis.yml deleted file mode 100644 index 984e0736e7d2..000000000000 --- a/vendor/github.com/davecgh/go-spew/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -language: go -go: - - 1.5.4 - - 1.6.3 - - 1.7 -install: - - go get -v golang.org/x/tools/cmd/cover -script: - - go test -v -tags=safe ./spew - - go test -v -tags=testcgo ./spew -covermode=count -coverprofile=profile.cov -after_success: - - go get -v github.com/mattn/goveralls - - export PATH=$PATH:$HOME/gopath/bin - - goveralls -coverprofile=profile.cov -service=travis-ci diff --git a/vendor/github.com/davecgh/go-spew/LICENSE b/vendor/github.com/davecgh/go-spew/LICENSE deleted file mode 100644 index c836416192da..000000000000 --- a/vendor/github.com/davecgh/go-spew/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -ISC License - -Copyright (c) 2012-2016 Dave Collins - -Permission to use, copy, modify, and distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/vendor/github.com/davecgh/go-spew/README.md b/vendor/github.com/davecgh/go-spew/README.md deleted file mode 100644 index 262430449b27..000000000000 --- a/vendor/github.com/davecgh/go-spew/README.md +++ /dev/null @@ -1,205 +0,0 @@ -go-spew -======= - -[![Build Status](https://img.shields.io/travis/davecgh/go-spew.svg)] -(https://travis-ci.org/davecgh/go-spew) [![ISC License] -(http://img.shields.io/badge/license-ISC-blue.svg)](http://copyfree.org) [![Coverage Status] -(https://img.shields.io/coveralls/davecgh/go-spew.svg)] -(https://coveralls.io/r/davecgh/go-spew?branch=master) - - -Go-spew implements a deep pretty printer for Go data structures to aid in -debugging. A comprehensive suite of tests with 100% test coverage is provided -to ensure proper functionality. See `test_coverage.txt` for the gocov coverage -report. Go-spew is licensed under the liberal ISC license, so it may be used in -open source or commercial projects. - -If you're interested in reading about how this package came to life and some -of the challenges involved in providing a deep pretty printer, there is a blog -post about it -[here](https://web.archive.org/web/20160304013555/https://blog.cyphertite.com/go-spew-a-journey-into-dumping-go-data-structures/). - -## Documentation - -[![GoDoc](https://img.shields.io/badge/godoc-reference-blue.svg)] -(http://godoc.org/github.com/davecgh/go-spew/spew) - -Full `go doc` style documentation for the project can be viewed online without -installing this package by using the excellent GoDoc site here: -http://godoc.org/github.com/davecgh/go-spew/spew - -You can also view the documentation locally once the package is installed with -the `godoc` tool by running `godoc -http=":6060"` and pointing your browser to -http://localhost:6060/pkg/github.com/davecgh/go-spew/spew - -## Installation - -```bash -$ go get -u github.com/davecgh/go-spew/spew -``` - -## Quick Start - -Add this import line to the file you're working in: - -```Go -import "github.com/davecgh/go-spew/spew" -``` - -To dump a variable with full newlines, indentation, type, and pointer -information use Dump, Fdump, or Sdump: - -```Go -spew.Dump(myVar1, myVar2, ...) -spew.Fdump(someWriter, myVar1, myVar2, ...) -str := spew.Sdump(myVar1, myVar2, ...) -``` - -Alternatively, if you would prefer to use format strings with a compacted inline -printing style, use the convenience wrappers Printf, Fprintf, etc with %v (most -compact), %+v (adds pointer addresses), %#v (adds types), or %#+v (adds types -and pointer addresses): - -```Go -spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) -spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) -spew.Fprintf(someWriter, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) -spew.Fprintf(someWriter, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) -``` - -## Debugging a Web Application Example - -Here is an example of how you can use `spew.Sdump()` to help debug a web application. Please be sure to wrap your output using the `html.EscapeString()` function for safety reasons. You should also only use this debugging technique in a development environment, never in production. - -```Go -package main - -import ( - "fmt" - "html" - "net/http" - - "github.com/davecgh/go-spew/spew" -) - -func handler(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "text/html") - fmt.Fprintf(w, "Hi there, %s!", r.URL.Path[1:]) - fmt.Fprintf(w, "") -} - -func main() { - http.HandleFunc("/", handler) - http.ListenAndServe(":8080", nil) -} -``` - -## Sample Dump Output - -``` -(main.Foo) { - unexportedField: (*main.Bar)(0xf84002e210)({ - flag: (main.Flag) flagTwo, - data: (uintptr) - }), - ExportedField: (map[interface {}]interface {}) { - (string) "one": (bool) true - } -} -([]uint8) { - 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... | - 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0| - 00000020 31 32 |12| -} -``` - -## Sample Formatter Output - -Double pointer to a uint8: -``` - %v: <**>5 - %+v: <**>(0xf8400420d0->0xf8400420c8)5 - %#v: (**uint8)5 - %#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5 -``` - -Pointer to circular struct with a uint8 field and a pointer to itself: -``` - %v: <*>{1 <*>} - %+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)} - %#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)} - %#+v: (*main.circular)(0xf84003e260){ui8:(uint8)1 c:(*main.circular)(0xf84003e260)} -``` - -## Configuration Options - -Configuration of spew is handled by fields in the ConfigState type. For -convenience, all of the top-level functions use a global state available via the -spew.Config global. - -It is also possible to create a ConfigState instance that provides methods -equivalent to the top-level functions. This allows concurrent configuration -options. See the ConfigState documentation for more details. - -``` -* Indent - String to use for each indentation level for Dump functions. - It is a single space by default. A popular alternative is "\t". - -* MaxDepth - Maximum number of levels to descend into nested data structures. - There is no limit by default. - -* DisableMethods - Disables invocation of error and Stringer interface methods. - Method invocation is enabled by default. - -* DisablePointerMethods - Disables invocation of error and Stringer interface methods on types - which only accept pointer receivers from non-pointer variables. This option - relies on access to the unsafe package, so it will not have any effect when - running in environments without access to the unsafe package such as Google - App Engine or with the "safe" build tag specified. - Pointer method invocation is enabled by default. - -* DisablePointerAddresses - DisablePointerAddresses specifies whether to disable the printing of - pointer addresses. This is useful when diffing data structures in tests. - -* DisableCapacities - DisableCapacities specifies whether to disable the printing of capacities - for arrays, slices, maps and channels. This is useful when diffing data - structures in tests. - -* ContinueOnMethod - Enables recursion into types after invoking error and Stringer interface - methods. Recursion after method invocation is disabled by default. - -* SortKeys - Specifies map keys should be sorted before being printed. Use - this to have a more deterministic, diffable output. Note that - only native types (bool, int, uint, floats, uintptr and string) - and types which implement error or Stringer interfaces are supported, - with other types sorted according to the reflect.Value.String() output - which guarantees display stability. Natural map order is used by - default. - -* SpewKeys - SpewKeys specifies that, as a last resort attempt, map keys should be - spewed to strings and sorted by those strings. This is only considered - if SortKeys is true. - -``` - -## Unsafe Package Dependency - -This package relies on the unsafe package to perform some of the more advanced -features, however it also supports a "limited" mode which allows it to work in -environments where the unsafe package is not available. By default, it will -operate in this mode on Google App Engine and when compiled with GopherJS. The -"safe" build tag may also be specified to force the package to build without -using the unsafe package. - -## License - -Go-spew is licensed under the [copyfree](http://copyfree.org) ISC License. diff --git a/vendor/github.com/davecgh/go-spew/cov_report.sh b/vendor/github.com/davecgh/go-spew/cov_report.sh deleted file mode 100644 index 9579497e4115..000000000000 --- a/vendor/github.com/davecgh/go-spew/cov_report.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -# This script uses gocov to generate a test coverage report. -# The gocov tool my be obtained with the following command: -# go get github.com/axw/gocov/gocov -# -# It will be installed to $GOPATH/bin, so ensure that location is in your $PATH. - -# Check for gocov. -if ! type gocov >/dev/null 2>&1; then - echo >&2 "This script requires the gocov tool." - echo >&2 "You may obtain it with the following command:" - echo >&2 "go get github.com/axw/gocov/gocov" - exit 1 -fi - -# Only run the cgo tests if gcc is installed. -if type gcc >/dev/null 2>&1; then - (cd spew && gocov test -tags testcgo | gocov report) -else - (cd spew && gocov test | gocov report) -fi diff --git a/vendor/github.com/davecgh/go-spew/spew/bypass.go b/vendor/github.com/davecgh/go-spew/spew/bypass.go deleted file mode 100644 index 8a4a6589a2d4..000000000000 --- a/vendor/github.com/davecgh/go-spew/spew/bypass.go +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright (c) 2015-2016 Dave Collins -// -// Permission to use, copy, modify, and distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// NOTE: Due to the following build constraints, this file will only be compiled -// when the code is not running on Google App Engine, compiled by GopherJS, and -// "-tags safe" is not added to the go build command line. The "disableunsafe" -// tag is deprecated and thus should not be used. -// +build !js,!appengine,!safe,!disableunsafe - -package spew - -import ( - "reflect" - "unsafe" -) - -const ( - // UnsafeDisabled is a build-time constant which specifies whether or - // not access to the unsafe package is available. - UnsafeDisabled = false - - // ptrSize is the size of a pointer on the current arch. - ptrSize = unsafe.Sizeof((*byte)(nil)) -) - -var ( - // offsetPtr, offsetScalar, and offsetFlag are the offsets for the - // internal reflect.Value fields. These values are valid before golang - // commit ecccf07e7f9d which changed the format. The are also valid - // after commit 82f48826c6c7 which changed the format again to mirror - // the original format. Code in the init function updates these offsets - // as necessary. - offsetPtr = uintptr(ptrSize) - offsetScalar = uintptr(0) - offsetFlag = uintptr(ptrSize * 2) - - // flagKindWidth and flagKindShift indicate various bits that the - // reflect package uses internally to track kind information. - // - // flagRO indicates whether or not the value field of a reflect.Value is - // read-only. - // - // flagIndir indicates whether the value field of a reflect.Value is - // the actual data or a pointer to the data. - // - // These values are valid before golang commit 90a7c3c86944 which - // changed their positions. Code in the init function updates these - // flags as necessary. - flagKindWidth = uintptr(5) - flagKindShift = uintptr(flagKindWidth - 1) - flagRO = uintptr(1 << 0) - flagIndir = uintptr(1 << 1) -) - -func init() { - // Older versions of reflect.Value stored small integers directly in the - // ptr field (which is named val in the older versions). Versions - // between commits ecccf07e7f9d and 82f48826c6c7 added a new field named - // scalar for this purpose which unfortunately came before the flag - // field, so the offset of the flag field is different for those - // versions. - // - // This code constructs a new reflect.Value from a known small integer - // and checks if the size of the reflect.Value struct indicates it has - // the scalar field. When it does, the offsets are updated accordingly. - vv := reflect.ValueOf(0xf00) - if unsafe.Sizeof(vv) == (ptrSize * 4) { - offsetScalar = ptrSize * 2 - offsetFlag = ptrSize * 3 - } - - // Commit 90a7c3c86944 changed the flag positions such that the low - // order bits are the kind. This code extracts the kind from the flags - // field and ensures it's the correct type. When it's not, the flag - // order has been changed to the newer format, so the flags are updated - // accordingly. - upf := unsafe.Pointer(uintptr(unsafe.Pointer(&vv)) + offsetFlag) - upfv := *(*uintptr)(upf) - flagKindMask := uintptr((1<>flagKindShift != uintptr(reflect.Int) { - flagKindShift = 0 - flagRO = 1 << 5 - flagIndir = 1 << 6 - - // Commit adf9b30e5594 modified the flags to separate the - // flagRO flag into two bits which specifies whether or not the - // field is embedded. This causes flagIndir to move over a bit - // and means that flagRO is the combination of either of the - // original flagRO bit and the new bit. - // - // This code detects the change by extracting what used to be - // the indirect bit to ensure it's set. When it's not, the flag - // order has been changed to the newer format, so the flags are - // updated accordingly. - if upfv&flagIndir == 0 { - flagRO = 3 << 5 - flagIndir = 1 << 7 - } - } -} - -// unsafeReflectValue converts the passed reflect.Value into a one that bypasses -// the typical safety restrictions preventing access to unaddressable and -// unexported data. It works by digging the raw pointer to the underlying -// value out of the protected value and generating a new unprotected (unsafe) -// reflect.Value to it. -// -// This allows us to check for implementations of the Stringer and error -// interfaces to be used for pretty printing ordinarily unaddressable and -// inaccessible values such as unexported struct fields. -func unsafeReflectValue(v reflect.Value) (rv reflect.Value) { - indirects := 1 - vt := v.Type() - upv := unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + offsetPtr) - rvf := *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + offsetFlag)) - if rvf&flagIndir != 0 { - vt = reflect.PtrTo(v.Type()) - indirects++ - } else if offsetScalar != 0 { - // The value is in the scalar field when it's not one of the - // reference types. - switch vt.Kind() { - case reflect.Uintptr: - case reflect.Chan: - case reflect.Func: - case reflect.Map: - case reflect.Ptr: - case reflect.UnsafePointer: - default: - upv = unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + - offsetScalar) - } - } - - pv := reflect.NewAt(vt, upv) - rv = pv - for i := 0; i < indirects; i++ { - rv = rv.Elem() - } - return rv -} diff --git a/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go b/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go deleted file mode 100644 index 1fe3cf3d5d10..000000000000 --- a/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2015-2016 Dave Collins -// -// Permission to use, copy, modify, and distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// NOTE: Due to the following build constraints, this file will only be compiled -// when the code is running on Google App Engine, compiled by GopherJS, or -// "-tags safe" is added to the go build command line. The "disableunsafe" -// tag is deprecated and thus should not be used. -// +build js appengine safe disableunsafe - -package spew - -import "reflect" - -const ( - // UnsafeDisabled is a build-time constant which specifies whether or - // not access to the unsafe package is available. - UnsafeDisabled = true -) - -// unsafeReflectValue typically converts the passed reflect.Value into a one -// that bypasses the typical safety restrictions preventing access to -// unaddressable and unexported data. However, doing this relies on access to -// the unsafe package. This is a stub version which simply returns the passed -// reflect.Value when the unsafe package is not available. -func unsafeReflectValue(v reflect.Value) reflect.Value { - return v -} diff --git a/vendor/github.com/davecgh/go-spew/spew/common.go b/vendor/github.com/davecgh/go-spew/spew/common.go deleted file mode 100644 index 7c519ff47ac3..000000000000 --- a/vendor/github.com/davecgh/go-spew/spew/common.go +++ /dev/null @@ -1,341 +0,0 @@ -/* - * Copyright (c) 2013-2016 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package spew - -import ( - "bytes" - "fmt" - "io" - "reflect" - "sort" - "strconv" -) - -// Some constants in the form of bytes to avoid string overhead. This mirrors -// the technique used in the fmt package. -var ( - panicBytes = []byte("(PANIC=") - plusBytes = []byte("+") - iBytes = []byte("i") - trueBytes = []byte("true") - falseBytes = []byte("false") - interfaceBytes = []byte("(interface {})") - commaNewlineBytes = []byte(",\n") - newlineBytes = []byte("\n") - openBraceBytes = []byte("{") - openBraceNewlineBytes = []byte("{\n") - closeBraceBytes = []byte("}") - asteriskBytes = []byte("*") - colonBytes = []byte(":") - colonSpaceBytes = []byte(": ") - openParenBytes = []byte("(") - closeParenBytes = []byte(")") - spaceBytes = []byte(" ") - pointerChainBytes = []byte("->") - nilAngleBytes = []byte("") - maxNewlineBytes = []byte("\n") - maxShortBytes = []byte("") - circularBytes = []byte("") - circularShortBytes = []byte("") - invalidAngleBytes = []byte("") - openBracketBytes = []byte("[") - closeBracketBytes = []byte("]") - percentBytes = []byte("%") - precisionBytes = []byte(".") - openAngleBytes = []byte("<") - closeAngleBytes = []byte(">") - openMapBytes = []byte("map[") - closeMapBytes = []byte("]") - lenEqualsBytes = []byte("len=") - capEqualsBytes = []byte("cap=") -) - -// hexDigits is used to map a decimal value to a hex digit. -var hexDigits = "0123456789abcdef" - -// catchPanic handles any panics that might occur during the handleMethods -// calls. -func catchPanic(w io.Writer, v reflect.Value) { - if err := recover(); err != nil { - w.Write(panicBytes) - fmt.Fprintf(w, "%v", err) - w.Write(closeParenBytes) - } -} - -// handleMethods attempts to call the Error and String methods on the underlying -// type the passed reflect.Value represents and outputes the result to Writer w. -// -// It handles panics in any called methods by catching and displaying the error -// as the formatted value. -func handleMethods(cs *ConfigState, w io.Writer, v reflect.Value) (handled bool) { - // We need an interface to check if the type implements the error or - // Stringer interface. However, the reflect package won't give us an - // interface on certain things like unexported struct fields in order - // to enforce visibility rules. We use unsafe, when it's available, - // to bypass these restrictions since this package does not mutate the - // values. - if !v.CanInterface() { - if UnsafeDisabled { - return false - } - - v = unsafeReflectValue(v) - } - - // Choose whether or not to do error and Stringer interface lookups against - // the base type or a pointer to the base type depending on settings. - // Technically calling one of these methods with a pointer receiver can - // mutate the value, however, types which choose to satisify an error or - // Stringer interface with a pointer receiver should not be mutating their - // state inside these interface methods. - if !cs.DisablePointerMethods && !UnsafeDisabled && !v.CanAddr() { - v = unsafeReflectValue(v) - } - if v.CanAddr() { - v = v.Addr() - } - - // Is it an error or Stringer? - switch iface := v.Interface().(type) { - case error: - defer catchPanic(w, v) - if cs.ContinueOnMethod { - w.Write(openParenBytes) - w.Write([]byte(iface.Error())) - w.Write(closeParenBytes) - w.Write(spaceBytes) - return false - } - - w.Write([]byte(iface.Error())) - return true - - case fmt.Stringer: - defer catchPanic(w, v) - if cs.ContinueOnMethod { - w.Write(openParenBytes) - w.Write([]byte(iface.String())) - w.Write(closeParenBytes) - w.Write(spaceBytes) - return false - } - w.Write([]byte(iface.String())) - return true - } - return false -} - -// printBool outputs a boolean value as true or false to Writer w. -func printBool(w io.Writer, val bool) { - if val { - w.Write(trueBytes) - } else { - w.Write(falseBytes) - } -} - -// printInt outputs a signed integer value to Writer w. -func printInt(w io.Writer, val int64, base int) { - w.Write([]byte(strconv.FormatInt(val, base))) -} - -// printUint outputs an unsigned integer value to Writer w. -func printUint(w io.Writer, val uint64, base int) { - w.Write([]byte(strconv.FormatUint(val, base))) -} - -// printFloat outputs a floating point value using the specified precision, -// which is expected to be 32 or 64bit, to Writer w. -func printFloat(w io.Writer, val float64, precision int) { - w.Write([]byte(strconv.FormatFloat(val, 'g', -1, precision))) -} - -// printComplex outputs a complex value using the specified float precision -// for the real and imaginary parts to Writer w. -func printComplex(w io.Writer, c complex128, floatPrecision int) { - r := real(c) - w.Write(openParenBytes) - w.Write([]byte(strconv.FormatFloat(r, 'g', -1, floatPrecision))) - i := imag(c) - if i >= 0 { - w.Write(plusBytes) - } - w.Write([]byte(strconv.FormatFloat(i, 'g', -1, floatPrecision))) - w.Write(iBytes) - w.Write(closeParenBytes) -} - -// printHexPtr outputs a uintptr formatted as hexidecimal with a leading '0x' -// prefix to Writer w. -func printHexPtr(w io.Writer, p uintptr) { - // Null pointer. - num := uint64(p) - if num == 0 { - w.Write(nilAngleBytes) - return - } - - // Max uint64 is 16 bytes in hex + 2 bytes for '0x' prefix - buf := make([]byte, 18) - - // It's simpler to construct the hex string right to left. - base := uint64(16) - i := len(buf) - 1 - for num >= base { - buf[i] = hexDigits[num%base] - num /= base - i-- - } - buf[i] = hexDigits[num] - - // Add '0x' prefix. - i-- - buf[i] = 'x' - i-- - buf[i] = '0' - - // Strip unused leading bytes. - buf = buf[i:] - w.Write(buf) -} - -// valuesSorter implements sort.Interface to allow a slice of reflect.Value -// elements to be sorted. -type valuesSorter struct { - values []reflect.Value - strings []string // either nil or same len and values - cs *ConfigState -} - -// newValuesSorter initializes a valuesSorter instance, which holds a set of -// surrogate keys on which the data should be sorted. It uses flags in -// ConfigState to decide if and how to populate those surrogate keys. -func newValuesSorter(values []reflect.Value, cs *ConfigState) sort.Interface { - vs := &valuesSorter{values: values, cs: cs} - if canSortSimply(vs.values[0].Kind()) { - return vs - } - if !cs.DisableMethods { - vs.strings = make([]string, len(values)) - for i := range vs.values { - b := bytes.Buffer{} - if !handleMethods(cs, &b, vs.values[i]) { - vs.strings = nil - break - } - vs.strings[i] = b.String() - } - } - if vs.strings == nil && cs.SpewKeys { - vs.strings = make([]string, len(values)) - for i := range vs.values { - vs.strings[i] = Sprintf("%#v", vs.values[i].Interface()) - } - } - return vs -} - -// canSortSimply tests whether a reflect.Kind is a primitive that can be sorted -// directly, or whether it should be considered for sorting by surrogate keys -// (if the ConfigState allows it). -func canSortSimply(kind reflect.Kind) bool { - // This switch parallels valueSortLess, except for the default case. - switch kind { - case reflect.Bool: - return true - case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: - return true - case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: - return true - case reflect.Float32, reflect.Float64: - return true - case reflect.String: - return true - case reflect.Uintptr: - return true - case reflect.Array: - return true - } - return false -} - -// Len returns the number of values in the slice. It is part of the -// sort.Interface implementation. -func (s *valuesSorter) Len() int { - return len(s.values) -} - -// Swap swaps the values at the passed indices. It is part of the -// sort.Interface implementation. -func (s *valuesSorter) Swap(i, j int) { - s.values[i], s.values[j] = s.values[j], s.values[i] - if s.strings != nil { - s.strings[i], s.strings[j] = s.strings[j], s.strings[i] - } -} - -// valueSortLess returns whether the first value should sort before the second -// value. It is used by valueSorter.Less as part of the sort.Interface -// implementation. -func valueSortLess(a, b reflect.Value) bool { - switch a.Kind() { - case reflect.Bool: - return !a.Bool() && b.Bool() - case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: - return a.Int() < b.Int() - case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: - return a.Uint() < b.Uint() - case reflect.Float32, reflect.Float64: - return a.Float() < b.Float() - case reflect.String: - return a.String() < b.String() - case reflect.Uintptr: - return a.Uint() < b.Uint() - case reflect.Array: - // Compare the contents of both arrays. - l := a.Len() - for i := 0; i < l; i++ { - av := a.Index(i) - bv := b.Index(i) - if av.Interface() == bv.Interface() { - continue - } - return valueSortLess(av, bv) - } - } - return a.String() < b.String() -} - -// Less returns whether the value at index i should sort before the -// value at index j. It is part of the sort.Interface implementation. -func (s *valuesSorter) Less(i, j int) bool { - if s.strings == nil { - return valueSortLess(s.values[i], s.values[j]) - } - return s.strings[i] < s.strings[j] -} - -// sortValues is a sort function that handles both native types and any type that -// can be converted to error or Stringer. Other inputs are sorted according to -// their Value.String() value to ensure display stability. -func sortValues(values []reflect.Value, cs *ConfigState) { - if len(values) == 0 { - return - } - sort.Sort(newValuesSorter(values, cs)) -} diff --git a/vendor/github.com/davecgh/go-spew/spew/config.go b/vendor/github.com/davecgh/go-spew/spew/config.go deleted file mode 100644 index 2e3d22f31202..000000000000 --- a/vendor/github.com/davecgh/go-spew/spew/config.go +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Copyright (c) 2013-2016 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package spew - -import ( - "bytes" - "fmt" - "io" - "os" -) - -// ConfigState houses the configuration options used by spew to format and -// display values. There is a global instance, Config, that is used to control -// all top-level Formatter and Dump functionality. Each ConfigState instance -// provides methods equivalent to the top-level functions. -// -// The zero value for ConfigState provides no indentation. You would typically -// want to set it to a space or a tab. -// -// Alternatively, you can use NewDefaultConfig to get a ConfigState instance -// with default settings. See the documentation of NewDefaultConfig for default -// values. -type ConfigState struct { - // Indent specifies the string to use for each indentation level. The - // global config instance that all top-level functions use set this to a - // single space by default. If you would like more indentation, you might - // set this to a tab with "\t" or perhaps two spaces with " ". - Indent string - - // MaxDepth controls the maximum number of levels to descend into nested - // data structures. The default, 0, means there is no limit. - // - // NOTE: Circular data structures are properly detected, so it is not - // necessary to set this value unless you specifically want to limit deeply - // nested data structures. - MaxDepth int - - // DisableMethods specifies whether or not error and Stringer interfaces are - // invoked for types that implement them. - DisableMethods bool - - // DisablePointerMethods specifies whether or not to check for and invoke - // error and Stringer interfaces on types which only accept a pointer - // receiver when the current type is not a pointer. - // - // NOTE: This might be an unsafe action since calling one of these methods - // with a pointer receiver could technically mutate the value, however, - // in practice, types which choose to satisify an error or Stringer - // interface with a pointer receiver should not be mutating their state - // inside these interface methods. As a result, this option relies on - // access to the unsafe package, so it will not have any effect when - // running in environments without access to the unsafe package such as - // Google App Engine or with the "safe" build tag specified. - DisablePointerMethods bool - - // DisablePointerAddresses specifies whether to disable the printing of - // pointer addresses. This is useful when diffing data structures in tests. - DisablePointerAddresses bool - - // DisableCapacities specifies whether to disable the printing of capacities - // for arrays, slices, maps and channels. This is useful when diffing - // data structures in tests. - DisableCapacities bool - - // ContinueOnMethod specifies whether or not recursion should continue once - // a custom error or Stringer interface is invoked. The default, false, - // means it will print the results of invoking the custom error or Stringer - // interface and return immediately instead of continuing to recurse into - // the internals of the data type. - // - // NOTE: This flag does not have any effect if method invocation is disabled - // via the DisableMethods or DisablePointerMethods options. - ContinueOnMethod bool - - // SortKeys specifies map keys should be sorted before being printed. Use - // this to have a more deterministic, diffable output. Note that only - // native types (bool, int, uint, floats, uintptr and string) and types - // that support the error or Stringer interfaces (if methods are - // enabled) are supported, with other types sorted according to the - // reflect.Value.String() output which guarantees display stability. - SortKeys bool - - // SpewKeys specifies that, as a last resort attempt, map keys should - // be spewed to strings and sorted by those strings. This is only - // considered if SortKeys is true. - SpewKeys bool -} - -// Config is the active configuration of the top-level functions. -// The configuration can be changed by modifying the contents of spew.Config. -var Config = ConfigState{Indent: " "} - -// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were -// passed with a Formatter interface returned by c.NewFormatter. It returns -// the formatted string as a value that satisfies error. See NewFormatter -// for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Errorf(format, c.NewFormatter(a), c.NewFormatter(b)) -func (c *ConfigState) Errorf(format string, a ...interface{}) (err error) { - return fmt.Errorf(format, c.convertArgs(a)...) -} - -// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were -// passed with a Formatter interface returned by c.NewFormatter. It returns -// the number of bytes written and any write error encountered. See -// NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Fprint(w, c.NewFormatter(a), c.NewFormatter(b)) -func (c *ConfigState) Fprint(w io.Writer, a ...interface{}) (n int, err error) { - return fmt.Fprint(w, c.convertArgs(a)...) -} - -// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were -// passed with a Formatter interface returned by c.NewFormatter. It returns -// the number of bytes written and any write error encountered. See -// NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Fprintf(w, format, c.NewFormatter(a), c.NewFormatter(b)) -func (c *ConfigState) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { - return fmt.Fprintf(w, format, c.convertArgs(a)...) -} - -// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it -// passed with a Formatter interface returned by c.NewFormatter. See -// NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Fprintln(w, c.NewFormatter(a), c.NewFormatter(b)) -func (c *ConfigState) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { - return fmt.Fprintln(w, c.convertArgs(a)...) -} - -// Print is a wrapper for fmt.Print that treats each argument as if it were -// passed with a Formatter interface returned by c.NewFormatter. It returns -// the number of bytes written and any write error encountered. See -// NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Print(c.NewFormatter(a), c.NewFormatter(b)) -func (c *ConfigState) Print(a ...interface{}) (n int, err error) { - return fmt.Print(c.convertArgs(a)...) -} - -// Printf is a wrapper for fmt.Printf that treats each argument as if it were -// passed with a Formatter interface returned by c.NewFormatter. It returns -// the number of bytes written and any write error encountered. See -// NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Printf(format, c.NewFormatter(a), c.NewFormatter(b)) -func (c *ConfigState) Printf(format string, a ...interface{}) (n int, err error) { - return fmt.Printf(format, c.convertArgs(a)...) -} - -// Println is a wrapper for fmt.Println that treats each argument as if it were -// passed with a Formatter interface returned by c.NewFormatter. It returns -// the number of bytes written and any write error encountered. See -// NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Println(c.NewFormatter(a), c.NewFormatter(b)) -func (c *ConfigState) Println(a ...interface{}) (n int, err error) { - return fmt.Println(c.convertArgs(a)...) -} - -// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were -// passed with a Formatter interface returned by c.NewFormatter. It returns -// the resulting string. See NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Sprint(c.NewFormatter(a), c.NewFormatter(b)) -func (c *ConfigState) Sprint(a ...interface{}) string { - return fmt.Sprint(c.convertArgs(a)...) -} - -// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were -// passed with a Formatter interface returned by c.NewFormatter. It returns -// the resulting string. See NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Sprintf(format, c.NewFormatter(a), c.NewFormatter(b)) -func (c *ConfigState) Sprintf(format string, a ...interface{}) string { - return fmt.Sprintf(format, c.convertArgs(a)...) -} - -// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it -// were passed with a Formatter interface returned by c.NewFormatter. It -// returns the resulting string. See NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Sprintln(c.NewFormatter(a), c.NewFormatter(b)) -func (c *ConfigState) Sprintln(a ...interface{}) string { - return fmt.Sprintln(c.convertArgs(a)...) -} - -/* -NewFormatter returns a custom formatter that satisfies the fmt.Formatter -interface. As a result, it integrates cleanly with standard fmt package -printing functions. The formatter is useful for inline printing of smaller data -types similar to the standard %v format specifier. - -The custom formatter only responds to the %v (most compact), %+v (adds pointer -addresses), %#v (adds types), and %#+v (adds types and pointer addresses) verb -combinations. Any other verbs such as %x and %q will be sent to the the -standard fmt package for formatting. In addition, the custom formatter ignores -the width and precision arguments (however they will still work on the format -specifiers not handled by the custom formatter). - -Typically this function shouldn't be called directly. It is much easier to make -use of the custom formatter by calling one of the convenience functions such as -c.Printf, c.Println, or c.Printf. -*/ -func (c *ConfigState) NewFormatter(v interface{}) fmt.Formatter { - return newFormatter(c, v) -} - -// Fdump formats and displays the passed arguments to io.Writer w. It formats -// exactly the same as Dump. -func (c *ConfigState) Fdump(w io.Writer, a ...interface{}) { - fdump(c, w, a...) -} - -/* -Dump displays the passed parameters to standard out with newlines, customizable -indentation, and additional debug information such as complete types and all -pointer addresses used to indirect to the final value. It provides the -following features over the built-in printing facilities provided by the fmt -package: - - * Pointers are dereferenced and followed - * Circular data structures are detected and handled properly - * Custom Stringer/error interfaces are optionally invoked, including - on unexported types - * Custom types which only implement the Stringer/error interfaces via - a pointer receiver are optionally invoked when passing non-pointer - variables - * Byte arrays and slices are dumped like the hexdump -C command which - includes offsets, byte values in hex, and ASCII output - -The configuration options are controlled by modifying the public members -of c. See ConfigState for options documentation. - -See Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to -get the formatted result as a string. -*/ -func (c *ConfigState) Dump(a ...interface{}) { - fdump(c, os.Stdout, a...) -} - -// Sdump returns a string with the passed arguments formatted exactly the same -// as Dump. -func (c *ConfigState) Sdump(a ...interface{}) string { - var buf bytes.Buffer - fdump(c, &buf, a...) - return buf.String() -} - -// convertArgs accepts a slice of arguments and returns a slice of the same -// length with each argument converted to a spew Formatter interface using -// the ConfigState associated with s. -func (c *ConfigState) convertArgs(args []interface{}) (formatters []interface{}) { - formatters = make([]interface{}, len(args)) - for index, arg := range args { - formatters[index] = newFormatter(c, arg) - } - return formatters -} - -// NewDefaultConfig returns a ConfigState with the following default settings. -// -// Indent: " " -// MaxDepth: 0 -// DisableMethods: false -// DisablePointerMethods: false -// ContinueOnMethod: false -// SortKeys: false -func NewDefaultConfig() *ConfigState { - return &ConfigState{Indent: " "} -} diff --git a/vendor/github.com/davecgh/go-spew/spew/doc.go b/vendor/github.com/davecgh/go-spew/spew/doc.go deleted file mode 100644 index aacaac6f1e1e..000000000000 --- a/vendor/github.com/davecgh/go-spew/spew/doc.go +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright (c) 2013-2016 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -/* -Package spew implements a deep pretty printer for Go data structures to aid in -debugging. - -A quick overview of the additional features spew provides over the built-in -printing facilities for Go data types are as follows: - - * Pointers are dereferenced and followed - * Circular data structures are detected and handled properly - * Custom Stringer/error interfaces are optionally invoked, including - on unexported types - * Custom types which only implement the Stringer/error interfaces via - a pointer receiver are optionally invoked when passing non-pointer - variables - * Byte arrays and slices are dumped like the hexdump -C command which - includes offsets, byte values in hex, and ASCII output (only when using - Dump style) - -There are two different approaches spew allows for dumping Go data structures: - - * Dump style which prints with newlines, customizable indentation, - and additional debug information such as types and all pointer addresses - used to indirect to the final value - * A custom Formatter interface that integrates cleanly with the standard fmt - package and replaces %v, %+v, %#v, and %#+v to provide inline printing - similar to the default %v while providing the additional functionality - outlined above and passing unsupported format verbs such as %x and %q - along to fmt - -Quick Start - -This section demonstrates how to quickly get started with spew. See the -sections below for further details on formatting and configuration options. - -To dump a variable with full newlines, indentation, type, and pointer -information use Dump, Fdump, or Sdump: - spew.Dump(myVar1, myVar2, ...) - spew.Fdump(someWriter, myVar1, myVar2, ...) - str := spew.Sdump(myVar1, myVar2, ...) - -Alternatively, if you would prefer to use format strings with a compacted inline -printing style, use the convenience wrappers Printf, Fprintf, etc with -%v (most compact), %+v (adds pointer addresses), %#v (adds types), or -%#+v (adds types and pointer addresses): - spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) - spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) - spew.Fprintf(someWriter, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) - spew.Fprintf(someWriter, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) - -Configuration Options - -Configuration of spew is handled by fields in the ConfigState type. For -convenience, all of the top-level functions use a global state available -via the spew.Config global. - -It is also possible to create a ConfigState instance that provides methods -equivalent to the top-level functions. This allows concurrent configuration -options. See the ConfigState documentation for more details. - -The following configuration options are available: - * Indent - String to use for each indentation level for Dump functions. - It is a single space by default. A popular alternative is "\t". - - * MaxDepth - Maximum number of levels to descend into nested data structures. - There is no limit by default. - - * DisableMethods - Disables invocation of error and Stringer interface methods. - Method invocation is enabled by default. - - * DisablePointerMethods - Disables invocation of error and Stringer interface methods on types - which only accept pointer receivers from non-pointer variables. - Pointer method invocation is enabled by default. - - * DisablePointerAddresses - DisablePointerAddresses specifies whether to disable the printing of - pointer addresses. This is useful when diffing data structures in tests. - - * DisableCapacities - DisableCapacities specifies whether to disable the printing of - capacities for arrays, slices, maps and channels. This is useful when - diffing data structures in tests. - - * ContinueOnMethod - Enables recursion into types after invoking error and Stringer interface - methods. Recursion after method invocation is disabled by default. - - * SortKeys - Specifies map keys should be sorted before being printed. Use - this to have a more deterministic, diffable output. Note that - only native types (bool, int, uint, floats, uintptr and string) - and types which implement error or Stringer interfaces are - supported with other types sorted according to the - reflect.Value.String() output which guarantees display - stability. Natural map order is used by default. - - * SpewKeys - Specifies that, as a last resort attempt, map keys should be - spewed to strings and sorted by those strings. This is only - considered if SortKeys is true. - -Dump Usage - -Simply call spew.Dump with a list of variables you want to dump: - - spew.Dump(myVar1, myVar2, ...) - -You may also call spew.Fdump if you would prefer to output to an arbitrary -io.Writer. For example, to dump to standard error: - - spew.Fdump(os.Stderr, myVar1, myVar2, ...) - -A third option is to call spew.Sdump to get the formatted output as a string: - - str := spew.Sdump(myVar1, myVar2, ...) - -Sample Dump Output - -See the Dump example for details on the setup of the types and variables being -shown here. - - (main.Foo) { - unexportedField: (*main.Bar)(0xf84002e210)({ - flag: (main.Flag) flagTwo, - data: (uintptr) - }), - ExportedField: (map[interface {}]interface {}) (len=1) { - (string) (len=3) "one": (bool) true - } - } - -Byte (and uint8) arrays and slices are displayed uniquely like the hexdump -C -command as shown. - ([]uint8) (len=32 cap=32) { - 00000000 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 |............... | - 00000010 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 |!"#$%&'()*+,-./0| - 00000020 31 32 |12| - } - -Custom Formatter - -Spew provides a custom formatter that implements the fmt.Formatter interface -so that it integrates cleanly with standard fmt package printing functions. The -formatter is useful for inline printing of smaller data types similar to the -standard %v format specifier. - -The custom formatter only responds to the %v (most compact), %+v (adds pointer -addresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb -combinations. Any other verbs such as %x and %q will be sent to the the -standard fmt package for formatting. In addition, the custom formatter ignores -the width and precision arguments (however they will still work on the format -specifiers not handled by the custom formatter). - -Custom Formatter Usage - -The simplest way to make use of the spew custom formatter is to call one of the -convenience functions such as spew.Printf, spew.Println, or spew.Printf. The -functions have syntax you are most likely already familiar with: - - spew.Printf("myVar1: %v -- myVar2: %+v", myVar1, myVar2) - spew.Printf("myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) - spew.Println(myVar, myVar2) - spew.Fprintf(os.Stderr, "myVar1: %v -- myVar2: %+v", myVar1, myVar2) - spew.Fprintf(os.Stderr, "myVar3: %#v -- myVar4: %#+v", myVar3, myVar4) - -See the Index for the full list convenience functions. - -Sample Formatter Output - -Double pointer to a uint8: - %v: <**>5 - %+v: <**>(0xf8400420d0->0xf8400420c8)5 - %#v: (**uint8)5 - %#+v: (**uint8)(0xf8400420d0->0xf8400420c8)5 - -Pointer to circular struct with a uint8 field and a pointer to itself: - %v: <*>{1 <*>} - %+v: <*>(0xf84003e260){ui8:1 c:<*>(0xf84003e260)} - %#v: (*main.circular){ui8:(uint8)1 c:(*main.circular)} - %#+v: (*main.circular)(0xf84003e260){ui8:(uint8)1 c:(*main.circular)(0xf84003e260)} - -See the Printf example for details on the setup of variables being shown -here. - -Errors - -Since it is possible for custom Stringer/error interfaces to panic, spew -detects them and handles them internally by printing the panic information -inline with the output. Since spew is intended to provide deep pretty printing -capabilities on structures, it intentionally does not return any errors. -*/ -package spew diff --git a/vendor/github.com/davecgh/go-spew/spew/dump.go b/vendor/github.com/davecgh/go-spew/spew/dump.go deleted file mode 100644 index df1d582a728a..000000000000 --- a/vendor/github.com/davecgh/go-spew/spew/dump.go +++ /dev/null @@ -1,509 +0,0 @@ -/* - * Copyright (c) 2013-2016 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package spew - -import ( - "bytes" - "encoding/hex" - "fmt" - "io" - "os" - "reflect" - "regexp" - "strconv" - "strings" -) - -var ( - // uint8Type is a reflect.Type representing a uint8. It is used to - // convert cgo types to uint8 slices for hexdumping. - uint8Type = reflect.TypeOf(uint8(0)) - - // cCharRE is a regular expression that matches a cgo char. - // It is used to detect character arrays to hexdump them. - cCharRE = regexp.MustCompile("^.*\\._Ctype_char$") - - // cUnsignedCharRE is a regular expression that matches a cgo unsigned - // char. It is used to detect unsigned character arrays to hexdump - // them. - cUnsignedCharRE = regexp.MustCompile("^.*\\._Ctype_unsignedchar$") - - // cUint8tCharRE is a regular expression that matches a cgo uint8_t. - // It is used to detect uint8_t arrays to hexdump them. - cUint8tCharRE = regexp.MustCompile("^.*\\._Ctype_uint8_t$") -) - -// dumpState contains information about the state of a dump operation. -type dumpState struct { - w io.Writer - depth int - pointers map[uintptr]int - ignoreNextType bool - ignoreNextIndent bool - cs *ConfigState -} - -// indent performs indentation according to the depth level and cs.Indent -// option. -func (d *dumpState) indent() { - if d.ignoreNextIndent { - d.ignoreNextIndent = false - return - } - d.w.Write(bytes.Repeat([]byte(d.cs.Indent), d.depth)) -} - -// unpackValue returns values inside of non-nil interfaces when possible. -// This is useful for data types like structs, arrays, slices, and maps which -// can contain varying types packed inside an interface. -func (d *dumpState) unpackValue(v reflect.Value) reflect.Value { - if v.Kind() == reflect.Interface && !v.IsNil() { - v = v.Elem() - } - return v -} - -// dumpPtr handles formatting of pointers by indirecting them as necessary. -func (d *dumpState) dumpPtr(v reflect.Value) { - // Remove pointers at or below the current depth from map used to detect - // circular refs. - for k, depth := range d.pointers { - if depth >= d.depth { - delete(d.pointers, k) - } - } - - // Keep list of all dereferenced pointers to show later. - pointerChain := make([]uintptr, 0) - - // Figure out how many levels of indirection there are by dereferencing - // pointers and unpacking interfaces down the chain while detecting circular - // references. - nilFound := false - cycleFound := false - indirects := 0 - ve := v - for ve.Kind() == reflect.Ptr { - if ve.IsNil() { - nilFound = true - break - } - indirects++ - addr := ve.Pointer() - pointerChain = append(pointerChain, addr) - if pd, ok := d.pointers[addr]; ok && pd < d.depth { - cycleFound = true - indirects-- - break - } - d.pointers[addr] = d.depth - - ve = ve.Elem() - if ve.Kind() == reflect.Interface { - if ve.IsNil() { - nilFound = true - break - } - ve = ve.Elem() - } - } - - // Display type information. - d.w.Write(openParenBytes) - d.w.Write(bytes.Repeat(asteriskBytes, indirects)) - d.w.Write([]byte(ve.Type().String())) - d.w.Write(closeParenBytes) - - // Display pointer information. - if !d.cs.DisablePointerAddresses && len(pointerChain) > 0 { - d.w.Write(openParenBytes) - for i, addr := range pointerChain { - if i > 0 { - d.w.Write(pointerChainBytes) - } - printHexPtr(d.w, addr) - } - d.w.Write(closeParenBytes) - } - - // Display dereferenced value. - d.w.Write(openParenBytes) - switch { - case nilFound == true: - d.w.Write(nilAngleBytes) - - case cycleFound == true: - d.w.Write(circularBytes) - - default: - d.ignoreNextType = true - d.dump(ve) - } - d.w.Write(closeParenBytes) -} - -// dumpSlice handles formatting of arrays and slices. Byte (uint8 under -// reflection) arrays and slices are dumped in hexdump -C fashion. -func (d *dumpState) dumpSlice(v reflect.Value) { - // Determine whether this type should be hex dumped or not. Also, - // for types which should be hexdumped, try to use the underlying data - // first, then fall back to trying to convert them to a uint8 slice. - var buf []uint8 - doConvert := false - doHexDump := false - numEntries := v.Len() - if numEntries > 0 { - vt := v.Index(0).Type() - vts := vt.String() - switch { - // C types that need to be converted. - case cCharRE.MatchString(vts): - fallthrough - case cUnsignedCharRE.MatchString(vts): - fallthrough - case cUint8tCharRE.MatchString(vts): - doConvert = true - - // Try to use existing uint8 slices and fall back to converting - // and copying if that fails. - case vt.Kind() == reflect.Uint8: - // We need an addressable interface to convert the type - // to a byte slice. However, the reflect package won't - // give us an interface on certain things like - // unexported struct fields in order to enforce - // visibility rules. We use unsafe, when available, to - // bypass these restrictions since this package does not - // mutate the values. - vs := v - if !vs.CanInterface() || !vs.CanAddr() { - vs = unsafeReflectValue(vs) - } - if !UnsafeDisabled { - vs = vs.Slice(0, numEntries) - - // Use the existing uint8 slice if it can be - // type asserted. - iface := vs.Interface() - if slice, ok := iface.([]uint8); ok { - buf = slice - doHexDump = true - break - } - } - - // The underlying data needs to be converted if it can't - // be type asserted to a uint8 slice. - doConvert = true - } - - // Copy and convert the underlying type if needed. - if doConvert && vt.ConvertibleTo(uint8Type) { - // Convert and copy each element into a uint8 byte - // slice. - buf = make([]uint8, numEntries) - for i := 0; i < numEntries; i++ { - vv := v.Index(i) - buf[i] = uint8(vv.Convert(uint8Type).Uint()) - } - doHexDump = true - } - } - - // Hexdump the entire slice as needed. - if doHexDump { - indent := strings.Repeat(d.cs.Indent, d.depth) - str := indent + hex.Dump(buf) - str = strings.Replace(str, "\n", "\n"+indent, -1) - str = strings.TrimRight(str, d.cs.Indent) - d.w.Write([]byte(str)) - return - } - - // Recursively call dump for each item. - for i := 0; i < numEntries; i++ { - d.dump(d.unpackValue(v.Index(i))) - if i < (numEntries - 1) { - d.w.Write(commaNewlineBytes) - } else { - d.w.Write(newlineBytes) - } - } -} - -// dump is the main workhorse for dumping a value. It uses the passed reflect -// value to figure out what kind of object we are dealing with and formats it -// appropriately. It is a recursive function, however circular data structures -// are detected and handled properly. -func (d *dumpState) dump(v reflect.Value) { - // Handle invalid reflect values immediately. - kind := v.Kind() - if kind == reflect.Invalid { - d.w.Write(invalidAngleBytes) - return - } - - // Handle pointers specially. - if kind == reflect.Ptr { - d.indent() - d.dumpPtr(v) - return - } - - // Print type information unless already handled elsewhere. - if !d.ignoreNextType { - d.indent() - d.w.Write(openParenBytes) - d.w.Write([]byte(v.Type().String())) - d.w.Write(closeParenBytes) - d.w.Write(spaceBytes) - } - d.ignoreNextType = false - - // Display length and capacity if the built-in len and cap functions - // work with the value's kind and the len/cap itself is non-zero. - valueLen, valueCap := 0, 0 - switch v.Kind() { - case reflect.Array, reflect.Slice, reflect.Chan: - valueLen, valueCap = v.Len(), v.Cap() - case reflect.Map, reflect.String: - valueLen = v.Len() - } - if valueLen != 0 || !d.cs.DisableCapacities && valueCap != 0 { - d.w.Write(openParenBytes) - if valueLen != 0 { - d.w.Write(lenEqualsBytes) - printInt(d.w, int64(valueLen), 10) - } - if !d.cs.DisableCapacities && valueCap != 0 { - if valueLen != 0 { - d.w.Write(spaceBytes) - } - d.w.Write(capEqualsBytes) - printInt(d.w, int64(valueCap), 10) - } - d.w.Write(closeParenBytes) - d.w.Write(spaceBytes) - } - - // Call Stringer/error interfaces if they exist and the handle methods flag - // is enabled - if !d.cs.DisableMethods { - if (kind != reflect.Invalid) && (kind != reflect.Interface) { - if handled := handleMethods(d.cs, d.w, v); handled { - return - } - } - } - - switch kind { - case reflect.Invalid: - // Do nothing. We should never get here since invalid has already - // been handled above. - - case reflect.Bool: - printBool(d.w, v.Bool()) - - case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: - printInt(d.w, v.Int(), 10) - - case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: - printUint(d.w, v.Uint(), 10) - - case reflect.Float32: - printFloat(d.w, v.Float(), 32) - - case reflect.Float64: - printFloat(d.w, v.Float(), 64) - - case reflect.Complex64: - printComplex(d.w, v.Complex(), 32) - - case reflect.Complex128: - printComplex(d.w, v.Complex(), 64) - - case reflect.Slice: - if v.IsNil() { - d.w.Write(nilAngleBytes) - break - } - fallthrough - - case reflect.Array: - d.w.Write(openBraceNewlineBytes) - d.depth++ - if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { - d.indent() - d.w.Write(maxNewlineBytes) - } else { - d.dumpSlice(v) - } - d.depth-- - d.indent() - d.w.Write(closeBraceBytes) - - case reflect.String: - d.w.Write([]byte(strconv.Quote(v.String()))) - - case reflect.Interface: - // The only time we should get here is for nil interfaces due to - // unpackValue calls. - if v.IsNil() { - d.w.Write(nilAngleBytes) - } - - case reflect.Ptr: - // Do nothing. We should never get here since pointers have already - // been handled above. - - case reflect.Map: - // nil maps should be indicated as different than empty maps - if v.IsNil() { - d.w.Write(nilAngleBytes) - break - } - - d.w.Write(openBraceNewlineBytes) - d.depth++ - if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { - d.indent() - d.w.Write(maxNewlineBytes) - } else { - numEntries := v.Len() - keys := v.MapKeys() - if d.cs.SortKeys { - sortValues(keys, d.cs) - } - for i, key := range keys { - d.dump(d.unpackValue(key)) - d.w.Write(colonSpaceBytes) - d.ignoreNextIndent = true - d.dump(d.unpackValue(v.MapIndex(key))) - if i < (numEntries - 1) { - d.w.Write(commaNewlineBytes) - } else { - d.w.Write(newlineBytes) - } - } - } - d.depth-- - d.indent() - d.w.Write(closeBraceBytes) - - case reflect.Struct: - d.w.Write(openBraceNewlineBytes) - d.depth++ - if (d.cs.MaxDepth != 0) && (d.depth > d.cs.MaxDepth) { - d.indent() - d.w.Write(maxNewlineBytes) - } else { - vt := v.Type() - numFields := v.NumField() - for i := 0; i < numFields; i++ { - d.indent() - vtf := vt.Field(i) - d.w.Write([]byte(vtf.Name)) - d.w.Write(colonSpaceBytes) - d.ignoreNextIndent = true - d.dump(d.unpackValue(v.Field(i))) - if i < (numFields - 1) { - d.w.Write(commaNewlineBytes) - } else { - d.w.Write(newlineBytes) - } - } - } - d.depth-- - d.indent() - d.w.Write(closeBraceBytes) - - case reflect.Uintptr: - printHexPtr(d.w, uintptr(v.Uint())) - - case reflect.UnsafePointer, reflect.Chan, reflect.Func: - printHexPtr(d.w, v.Pointer()) - - // There were not any other types at the time this code was written, but - // fall back to letting the default fmt package handle it in case any new - // types are added. - default: - if v.CanInterface() { - fmt.Fprintf(d.w, "%v", v.Interface()) - } else { - fmt.Fprintf(d.w, "%v", v.String()) - } - } -} - -// fdump is a helper function to consolidate the logic from the various public -// methods which take varying writers and config states. -func fdump(cs *ConfigState, w io.Writer, a ...interface{}) { - for _, arg := range a { - if arg == nil { - w.Write(interfaceBytes) - w.Write(spaceBytes) - w.Write(nilAngleBytes) - w.Write(newlineBytes) - continue - } - - d := dumpState{w: w, cs: cs} - d.pointers = make(map[uintptr]int) - d.dump(reflect.ValueOf(arg)) - d.w.Write(newlineBytes) - } -} - -// Fdump formats and displays the passed arguments to io.Writer w. It formats -// exactly the same as Dump. -func Fdump(w io.Writer, a ...interface{}) { - fdump(&Config, w, a...) -} - -// Sdump returns a string with the passed arguments formatted exactly the same -// as Dump. -func Sdump(a ...interface{}) string { - var buf bytes.Buffer - fdump(&Config, &buf, a...) - return buf.String() -} - -/* -Dump displays the passed parameters to standard out with newlines, customizable -indentation, and additional debug information such as complete types and all -pointer addresses used to indirect to the final value. It provides the -following features over the built-in printing facilities provided by the fmt -package: - - * Pointers are dereferenced and followed - * Circular data structures are detected and handled properly - * Custom Stringer/error interfaces are optionally invoked, including - on unexported types - * Custom types which only implement the Stringer/error interfaces via - a pointer receiver are optionally invoked when passing non-pointer - variables - * Byte arrays and slices are dumped like the hexdump -C command which - includes offsets, byte values in hex, and ASCII output - -The configuration options are controlled by an exported package global, -spew.Config. See ConfigState for options documentation. - -See Fdump if you would prefer dumping to an arbitrary io.Writer or Sdump to -get the formatted result as a string. -*/ -func Dump(a ...interface{}) { - fdump(&Config, os.Stdout, a...) -} diff --git a/vendor/github.com/davecgh/go-spew/spew/format.go b/vendor/github.com/davecgh/go-spew/spew/format.go deleted file mode 100644 index c49875bacbb8..000000000000 --- a/vendor/github.com/davecgh/go-spew/spew/format.go +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Copyright (c) 2013-2016 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package spew - -import ( - "bytes" - "fmt" - "reflect" - "strconv" - "strings" -) - -// supportedFlags is a list of all the character flags supported by fmt package. -const supportedFlags = "0-+# " - -// formatState implements the fmt.Formatter interface and contains information -// about the state of a formatting operation. The NewFormatter function can -// be used to get a new Formatter which can be used directly as arguments -// in standard fmt package printing calls. -type formatState struct { - value interface{} - fs fmt.State - depth int - pointers map[uintptr]int - ignoreNextType bool - cs *ConfigState -} - -// buildDefaultFormat recreates the original format string without precision -// and width information to pass in to fmt.Sprintf in the case of an -// unrecognized type. Unless new types are added to the language, this -// function won't ever be called. -func (f *formatState) buildDefaultFormat() (format string) { - buf := bytes.NewBuffer(percentBytes) - - for _, flag := range supportedFlags { - if f.fs.Flag(int(flag)) { - buf.WriteRune(flag) - } - } - - buf.WriteRune('v') - - format = buf.String() - return format -} - -// constructOrigFormat recreates the original format string including precision -// and width information to pass along to the standard fmt package. This allows -// automatic deferral of all format strings this package doesn't support. -func (f *formatState) constructOrigFormat(verb rune) (format string) { - buf := bytes.NewBuffer(percentBytes) - - for _, flag := range supportedFlags { - if f.fs.Flag(int(flag)) { - buf.WriteRune(flag) - } - } - - if width, ok := f.fs.Width(); ok { - buf.WriteString(strconv.Itoa(width)) - } - - if precision, ok := f.fs.Precision(); ok { - buf.Write(precisionBytes) - buf.WriteString(strconv.Itoa(precision)) - } - - buf.WriteRune(verb) - - format = buf.String() - return format -} - -// unpackValue returns values inside of non-nil interfaces when possible and -// ensures that types for values which have been unpacked from an interface -// are displayed when the show types flag is also set. -// This is useful for data types like structs, arrays, slices, and maps which -// can contain varying types packed inside an interface. -func (f *formatState) unpackValue(v reflect.Value) reflect.Value { - if v.Kind() == reflect.Interface { - f.ignoreNextType = false - if !v.IsNil() { - v = v.Elem() - } - } - return v -} - -// formatPtr handles formatting of pointers by indirecting them as necessary. -func (f *formatState) formatPtr(v reflect.Value) { - // Display nil if top level pointer is nil. - showTypes := f.fs.Flag('#') - if v.IsNil() && (!showTypes || f.ignoreNextType) { - f.fs.Write(nilAngleBytes) - return - } - - // Remove pointers at or below the current depth from map used to detect - // circular refs. - for k, depth := range f.pointers { - if depth >= f.depth { - delete(f.pointers, k) - } - } - - // Keep list of all dereferenced pointers to possibly show later. - pointerChain := make([]uintptr, 0) - - // Figure out how many levels of indirection there are by derferencing - // pointers and unpacking interfaces down the chain while detecting circular - // references. - nilFound := false - cycleFound := false - indirects := 0 - ve := v - for ve.Kind() == reflect.Ptr { - if ve.IsNil() { - nilFound = true - break - } - indirects++ - addr := ve.Pointer() - pointerChain = append(pointerChain, addr) - if pd, ok := f.pointers[addr]; ok && pd < f.depth { - cycleFound = true - indirects-- - break - } - f.pointers[addr] = f.depth - - ve = ve.Elem() - if ve.Kind() == reflect.Interface { - if ve.IsNil() { - nilFound = true - break - } - ve = ve.Elem() - } - } - - // Display type or indirection level depending on flags. - if showTypes && !f.ignoreNextType { - f.fs.Write(openParenBytes) - f.fs.Write(bytes.Repeat(asteriskBytes, indirects)) - f.fs.Write([]byte(ve.Type().String())) - f.fs.Write(closeParenBytes) - } else { - if nilFound || cycleFound { - indirects += strings.Count(ve.Type().String(), "*") - } - f.fs.Write(openAngleBytes) - f.fs.Write([]byte(strings.Repeat("*", indirects))) - f.fs.Write(closeAngleBytes) - } - - // Display pointer information depending on flags. - if f.fs.Flag('+') && (len(pointerChain) > 0) { - f.fs.Write(openParenBytes) - for i, addr := range pointerChain { - if i > 0 { - f.fs.Write(pointerChainBytes) - } - printHexPtr(f.fs, addr) - } - f.fs.Write(closeParenBytes) - } - - // Display dereferenced value. - switch { - case nilFound == true: - f.fs.Write(nilAngleBytes) - - case cycleFound == true: - f.fs.Write(circularShortBytes) - - default: - f.ignoreNextType = true - f.format(ve) - } -} - -// format is the main workhorse for providing the Formatter interface. It -// uses the passed reflect value to figure out what kind of object we are -// dealing with and formats it appropriately. It is a recursive function, -// however circular data structures are detected and handled properly. -func (f *formatState) format(v reflect.Value) { - // Handle invalid reflect values immediately. - kind := v.Kind() - if kind == reflect.Invalid { - f.fs.Write(invalidAngleBytes) - return - } - - // Handle pointers specially. - if kind == reflect.Ptr { - f.formatPtr(v) - return - } - - // Print type information unless already handled elsewhere. - if !f.ignoreNextType && f.fs.Flag('#') { - f.fs.Write(openParenBytes) - f.fs.Write([]byte(v.Type().String())) - f.fs.Write(closeParenBytes) - } - f.ignoreNextType = false - - // Call Stringer/error interfaces if they exist and the handle methods - // flag is enabled. - if !f.cs.DisableMethods { - if (kind != reflect.Invalid) && (kind != reflect.Interface) { - if handled := handleMethods(f.cs, f.fs, v); handled { - return - } - } - } - - switch kind { - case reflect.Invalid: - // Do nothing. We should never get here since invalid has already - // been handled above. - - case reflect.Bool: - printBool(f.fs, v.Bool()) - - case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int: - printInt(f.fs, v.Int(), 10) - - case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint: - printUint(f.fs, v.Uint(), 10) - - case reflect.Float32: - printFloat(f.fs, v.Float(), 32) - - case reflect.Float64: - printFloat(f.fs, v.Float(), 64) - - case reflect.Complex64: - printComplex(f.fs, v.Complex(), 32) - - case reflect.Complex128: - printComplex(f.fs, v.Complex(), 64) - - case reflect.Slice: - if v.IsNil() { - f.fs.Write(nilAngleBytes) - break - } - fallthrough - - case reflect.Array: - f.fs.Write(openBracketBytes) - f.depth++ - if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { - f.fs.Write(maxShortBytes) - } else { - numEntries := v.Len() - for i := 0; i < numEntries; i++ { - if i > 0 { - f.fs.Write(spaceBytes) - } - f.ignoreNextType = true - f.format(f.unpackValue(v.Index(i))) - } - } - f.depth-- - f.fs.Write(closeBracketBytes) - - case reflect.String: - f.fs.Write([]byte(v.String())) - - case reflect.Interface: - // The only time we should get here is for nil interfaces due to - // unpackValue calls. - if v.IsNil() { - f.fs.Write(nilAngleBytes) - } - - case reflect.Ptr: - // Do nothing. We should never get here since pointers have already - // been handled above. - - case reflect.Map: - // nil maps should be indicated as different than empty maps - if v.IsNil() { - f.fs.Write(nilAngleBytes) - break - } - - f.fs.Write(openMapBytes) - f.depth++ - if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { - f.fs.Write(maxShortBytes) - } else { - keys := v.MapKeys() - if f.cs.SortKeys { - sortValues(keys, f.cs) - } - for i, key := range keys { - if i > 0 { - f.fs.Write(spaceBytes) - } - f.ignoreNextType = true - f.format(f.unpackValue(key)) - f.fs.Write(colonBytes) - f.ignoreNextType = true - f.format(f.unpackValue(v.MapIndex(key))) - } - } - f.depth-- - f.fs.Write(closeMapBytes) - - case reflect.Struct: - numFields := v.NumField() - f.fs.Write(openBraceBytes) - f.depth++ - if (f.cs.MaxDepth != 0) && (f.depth > f.cs.MaxDepth) { - f.fs.Write(maxShortBytes) - } else { - vt := v.Type() - for i := 0; i < numFields; i++ { - if i > 0 { - f.fs.Write(spaceBytes) - } - vtf := vt.Field(i) - if f.fs.Flag('+') || f.fs.Flag('#') { - f.fs.Write([]byte(vtf.Name)) - f.fs.Write(colonBytes) - } - f.format(f.unpackValue(v.Field(i))) - } - } - f.depth-- - f.fs.Write(closeBraceBytes) - - case reflect.Uintptr: - printHexPtr(f.fs, uintptr(v.Uint())) - - case reflect.UnsafePointer, reflect.Chan, reflect.Func: - printHexPtr(f.fs, v.Pointer()) - - // There were not any other types at the time this code was written, but - // fall back to letting the default fmt package handle it if any get added. - default: - format := f.buildDefaultFormat() - if v.CanInterface() { - fmt.Fprintf(f.fs, format, v.Interface()) - } else { - fmt.Fprintf(f.fs, format, v.String()) - } - } -} - -// Format satisfies the fmt.Formatter interface. See NewFormatter for usage -// details. -func (f *formatState) Format(fs fmt.State, verb rune) { - f.fs = fs - - // Use standard formatting for verbs that are not v. - if verb != 'v' { - format := f.constructOrigFormat(verb) - fmt.Fprintf(fs, format, f.value) - return - } - - if f.value == nil { - if fs.Flag('#') { - fs.Write(interfaceBytes) - } - fs.Write(nilAngleBytes) - return - } - - f.format(reflect.ValueOf(f.value)) -} - -// newFormatter is a helper function to consolidate the logic from the various -// public methods which take varying config states. -func newFormatter(cs *ConfigState, v interface{}) fmt.Formatter { - fs := &formatState{value: v, cs: cs} - fs.pointers = make(map[uintptr]int) - return fs -} - -/* -NewFormatter returns a custom formatter that satisfies the fmt.Formatter -interface. As a result, it integrates cleanly with standard fmt package -printing functions. The formatter is useful for inline printing of smaller data -types similar to the standard %v format specifier. - -The custom formatter only responds to the %v (most compact), %+v (adds pointer -addresses), %#v (adds types), or %#+v (adds types and pointer addresses) verb -combinations. Any other verbs such as %x and %q will be sent to the the -standard fmt package for formatting. In addition, the custom formatter ignores -the width and precision arguments (however they will still work on the format -specifiers not handled by the custom formatter). - -Typically this function shouldn't be called directly. It is much easier to make -use of the custom formatter by calling one of the convenience functions such as -Printf, Println, or Fprintf. -*/ -func NewFormatter(v interface{}) fmt.Formatter { - return newFormatter(&Config, v) -} diff --git a/vendor/github.com/davecgh/go-spew/spew/spew.go b/vendor/github.com/davecgh/go-spew/spew/spew.go deleted file mode 100644 index 32c0e3388253..000000000000 --- a/vendor/github.com/davecgh/go-spew/spew/spew.go +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (c) 2013-2016 Dave Collins - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -package spew - -import ( - "fmt" - "io" -) - -// Errorf is a wrapper for fmt.Errorf that treats each argument as if it were -// passed with a default Formatter interface returned by NewFormatter. It -// returns the formatted string as a value that satisfies error. See -// NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Errorf(format, spew.NewFormatter(a), spew.NewFormatter(b)) -func Errorf(format string, a ...interface{}) (err error) { - return fmt.Errorf(format, convertArgs(a)...) -} - -// Fprint is a wrapper for fmt.Fprint that treats each argument as if it were -// passed with a default Formatter interface returned by NewFormatter. It -// returns the number of bytes written and any write error encountered. See -// NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Fprint(w, spew.NewFormatter(a), spew.NewFormatter(b)) -func Fprint(w io.Writer, a ...interface{}) (n int, err error) { - return fmt.Fprint(w, convertArgs(a)...) -} - -// Fprintf is a wrapper for fmt.Fprintf that treats each argument as if it were -// passed with a default Formatter interface returned by NewFormatter. It -// returns the number of bytes written and any write error encountered. See -// NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Fprintf(w, format, spew.NewFormatter(a), spew.NewFormatter(b)) -func Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { - return fmt.Fprintf(w, format, convertArgs(a)...) -} - -// Fprintln is a wrapper for fmt.Fprintln that treats each argument as if it -// passed with a default Formatter interface returned by NewFormatter. See -// NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Fprintln(w, spew.NewFormatter(a), spew.NewFormatter(b)) -func Fprintln(w io.Writer, a ...interface{}) (n int, err error) { - return fmt.Fprintln(w, convertArgs(a)...) -} - -// Print is a wrapper for fmt.Print that treats each argument as if it were -// passed with a default Formatter interface returned by NewFormatter. It -// returns the number of bytes written and any write error encountered. See -// NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Print(spew.NewFormatter(a), spew.NewFormatter(b)) -func Print(a ...interface{}) (n int, err error) { - return fmt.Print(convertArgs(a)...) -} - -// Printf is a wrapper for fmt.Printf that treats each argument as if it were -// passed with a default Formatter interface returned by NewFormatter. It -// returns the number of bytes written and any write error encountered. See -// NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Printf(format, spew.NewFormatter(a), spew.NewFormatter(b)) -func Printf(format string, a ...interface{}) (n int, err error) { - return fmt.Printf(format, convertArgs(a)...) -} - -// Println is a wrapper for fmt.Println that treats each argument as if it were -// passed with a default Formatter interface returned by NewFormatter. It -// returns the number of bytes written and any write error encountered. See -// NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Println(spew.NewFormatter(a), spew.NewFormatter(b)) -func Println(a ...interface{}) (n int, err error) { - return fmt.Println(convertArgs(a)...) -} - -// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were -// passed with a default Formatter interface returned by NewFormatter. It -// returns the resulting string. See NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Sprint(spew.NewFormatter(a), spew.NewFormatter(b)) -func Sprint(a ...interface{}) string { - return fmt.Sprint(convertArgs(a)...) -} - -// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were -// passed with a default Formatter interface returned by NewFormatter. It -// returns the resulting string. See NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Sprintf(format, spew.NewFormatter(a), spew.NewFormatter(b)) -func Sprintf(format string, a ...interface{}) string { - return fmt.Sprintf(format, convertArgs(a)...) -} - -// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it -// were passed with a default Formatter interface returned by NewFormatter. It -// returns the resulting string. See NewFormatter for formatting details. -// -// This function is shorthand for the following syntax: -// -// fmt.Sprintln(spew.NewFormatter(a), spew.NewFormatter(b)) -func Sprintln(a ...interface{}) string { - return fmt.Sprintln(convertArgs(a)...) -} - -// convertArgs accepts a slice of arguments and returns a slice of the same -// length with each argument converted to a default spew Formatter interface. -func convertArgs(args []interface{}) (formatters []interface{}) { - formatters = make([]interface{}, len(args)) - for index, arg := range args { - formatters[index] = NewFormatter(arg) - } - return formatters -} diff --git a/vendor/github.com/davecgh/go-spew/test_coverage.txt b/vendor/github.com/davecgh/go-spew/test_coverage.txt deleted file mode 100644 index 2cd087a2a127..000000000000 --- a/vendor/github.com/davecgh/go-spew/test_coverage.txt +++ /dev/null @@ -1,61 +0,0 @@ - -github.com/davecgh/go-spew/spew/dump.go dumpState.dump 100.00% (88/88) -github.com/davecgh/go-spew/spew/format.go formatState.format 100.00% (82/82) -github.com/davecgh/go-spew/spew/format.go formatState.formatPtr 100.00% (52/52) -github.com/davecgh/go-spew/spew/dump.go dumpState.dumpPtr 100.00% (44/44) -github.com/davecgh/go-spew/spew/dump.go dumpState.dumpSlice 100.00% (39/39) -github.com/davecgh/go-spew/spew/common.go handleMethods 100.00% (30/30) -github.com/davecgh/go-spew/spew/common.go printHexPtr 100.00% (18/18) -github.com/davecgh/go-spew/spew/common.go unsafeReflectValue 100.00% (13/13) -github.com/davecgh/go-spew/spew/format.go formatState.constructOrigFormat 100.00% (12/12) -github.com/davecgh/go-spew/spew/dump.go fdump 100.00% (11/11) -github.com/davecgh/go-spew/spew/format.go formatState.Format 100.00% (11/11) -github.com/davecgh/go-spew/spew/common.go init 100.00% (10/10) -github.com/davecgh/go-spew/spew/common.go printComplex 100.00% (9/9) -github.com/davecgh/go-spew/spew/common.go valuesSorter.Less 100.00% (8/8) -github.com/davecgh/go-spew/spew/format.go formatState.buildDefaultFormat 100.00% (7/7) -github.com/davecgh/go-spew/spew/format.go formatState.unpackValue 100.00% (5/5) -github.com/davecgh/go-spew/spew/dump.go dumpState.indent 100.00% (4/4) -github.com/davecgh/go-spew/spew/common.go catchPanic 100.00% (4/4) -github.com/davecgh/go-spew/spew/config.go ConfigState.convertArgs 100.00% (4/4) -github.com/davecgh/go-spew/spew/spew.go convertArgs 100.00% (4/4) -github.com/davecgh/go-spew/spew/format.go newFormatter 100.00% (3/3) -github.com/davecgh/go-spew/spew/dump.go Sdump 100.00% (3/3) -github.com/davecgh/go-spew/spew/common.go printBool 100.00% (3/3) -github.com/davecgh/go-spew/spew/common.go sortValues 100.00% (3/3) -github.com/davecgh/go-spew/spew/config.go ConfigState.Sdump 100.00% (3/3) -github.com/davecgh/go-spew/spew/dump.go dumpState.unpackValue 100.00% (3/3) -github.com/davecgh/go-spew/spew/spew.go Printf 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Println 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Sprint 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Sprintf 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Sprintln 100.00% (1/1) -github.com/davecgh/go-spew/spew/common.go printFloat 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go NewDefaultConfig 100.00% (1/1) -github.com/davecgh/go-spew/spew/common.go printInt 100.00% (1/1) -github.com/davecgh/go-spew/spew/common.go printUint 100.00% (1/1) -github.com/davecgh/go-spew/spew/common.go valuesSorter.Len 100.00% (1/1) -github.com/davecgh/go-spew/spew/common.go valuesSorter.Swap 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Errorf 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Fprint 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Fprintf 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Fprintln 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Print 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Printf 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Println 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Sprint 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Sprintf 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Sprintln 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.NewFormatter 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Fdump 100.00% (1/1) -github.com/davecgh/go-spew/spew/config.go ConfigState.Dump 100.00% (1/1) -github.com/davecgh/go-spew/spew/dump.go Fdump 100.00% (1/1) -github.com/davecgh/go-spew/spew/dump.go Dump 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Fprintln 100.00% (1/1) -github.com/davecgh/go-spew/spew/format.go NewFormatter 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Errorf 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Fprint 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Fprintf 100.00% (1/1) -github.com/davecgh/go-spew/spew/spew.go Print 100.00% (1/1) -github.com/davecgh/go-spew/spew ------------------------------- 100.00% (505/505) - diff --git a/vendor/github.com/deckarep/golang-set/LICENSE b/vendor/github.com/deckarep/golang-set/LICENSE deleted file mode 100644 index b5768f89cfd2..000000000000 --- a/vendor/github.com/deckarep/golang-set/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Open Source Initiative OSI - The MIT License (MIT):Licensing - -The MIT License (MIT) -Copyright (c) 2013 Ralph Caraveo (deckarep@gmail.com) - -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. \ No newline at end of file diff --git a/vendor/github.com/deckarep/golang-set/README.md b/vendor/github.com/deckarep/golang-set/README.md deleted file mode 100644 index c3b50b2c5c63..000000000000 --- a/vendor/github.com/deckarep/golang-set/README.md +++ /dev/null @@ -1,95 +0,0 @@ -[![Build Status](https://travis-ci.org/deckarep/golang-set.svg?branch=master)](https://travis-ci.org/deckarep/golang-set) -[![Go Report Card](https://goreportcard.com/badge/github.com/deckarep/golang-set)](https://goreportcard.com/report/github.com/deckarep/golang-set) -[![GoDoc](https://godoc.org/github.com/deckarep/golang-set?status.svg)](http://godoc.org/github.com/deckarep/golang-set) - -## golang-set - - -The missing set collection for the Go language. Until Go has sets built-in...use this. - -Coming from Python one of the things I miss is the superbly wonderful set collection. This is my attempt to mimic the primary features of the set from Python. -You can of course argue that there is no need for a set in Go, otherwise the creators would have added one to the standard library. To those I say simply ignore this repository -and carry-on and to the rest that find this useful please contribute in helping me make it better by: - -* Helping to make more idiomatic improvements to the code. -* Helping to increase the performance of it. ~~(So far, no attempt has been made, but since it uses a map internally, I expect it to be mostly performant.)~~ -* Helping to make the unit-tests more robust and kick-ass. -* Helping to fill in the [documentation.](http://godoc.org/github.com/deckarep/golang-set) -* Simply offering feedback and suggestions. (Positive, constructive feedback is appreciated.) - -I have to give some credit for helping seed the idea with this post on [stackoverflow.](http://programmers.stackexchange.com/questions/177428/sets-data-structure-in-golang) - -*Update* - as of 3/9/2014, you can use a compile-time generic version of this package in the [gen](http://clipperhouse.github.io/gen/) framework. This framework allows you to use the golang-set in a completely generic and type-safe way by allowing you to generate a supporting .go file based on your custom types. - -## Features (as of 9/22/2014) - -* a CartesianProduct() method has been added with unit-tests: [Read more about the cartesian product](http://en.wikipedia.org/wiki/Cartesian_product) - -## Features (as of 9/15/2014) - -* a PowerSet() method has been added with unit-tests: [Read more about the Power set](http://en.wikipedia.org/wiki/Power_set) - -## Features (as of 4/22/2014) - -* One common interface to both implementations -* Two set implementations to choose from - * a thread-safe implementation designed for concurrent use - * a non-thread-safe implementation designed for performance -* 75 benchmarks for both implementations -* 35 unit tests for both implementations -* 14 concurrent tests for the thread-safe implementation - - - -Please see the unit test file for additional usage examples. The Python set documentation will also do a better job than I can of explaining how a set typically [works.](http://docs.python.org/2/library/sets.html) Please keep in mind -however that the Python set is a built-in type and supports additional features and syntax that make it awesome. - -## Examples but not exhaustive: - -```go -requiredClasses := mapset.NewSet() -requiredClasses.Add("Cooking") -requiredClasses.Add("English") -requiredClasses.Add("Math") -requiredClasses.Add("Biology") - -scienceSlice := []interface{}{"Biology", "Chemistry"} -scienceClasses := mapset.NewSetFromSlice(scienceSlice) - -electiveClasses := mapset.NewSet() -electiveClasses.Add("Welding") -electiveClasses.Add("Music") -electiveClasses.Add("Automotive") - -bonusClasses := mapset.NewSet() -bonusClasses.Add("Go Programming") -bonusClasses.Add("Python Programming") - -//Show me all the available classes I can take -allClasses := requiredClasses.Union(scienceClasses).Union(electiveClasses).Union(bonusClasses) -fmt.Println(allClasses) //Set{Cooking, English, Math, Chemistry, Welding, Biology, Music, Automotive, Go Programming, Python Programming} - - -//Is cooking considered a science class? -fmt.Println(scienceClasses.Contains("Cooking")) //false - -//Show me all classes that are not science classes, since I hate science. -fmt.Println(allClasses.Difference(scienceClasses)) //Set{Music, Automotive, Go Programming, Python Programming, Cooking, English, Math, Welding} - -//Which science classes are also required classes? -fmt.Println(scienceClasses.Intersect(requiredClasses)) //Set{Biology} - -//How many bonus classes do you offer? -fmt.Println(bonusClasses.Cardinality()) //2 - -//Do you have the following classes? Welding, Automotive and English? -fmt.Println(allClasses.IsSuperset(mapset.NewSetFromSlice([]interface{}{"Welding", "Automotive", "English"}))) //true -``` - -Thanks! - --Ralph - -[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/deckarep/golang-set/trend.png)](https://bitdeli.com/free "Bitdeli Badge") - -[![Analytics](https://ga-beacon.appspot.com/UA-42584447-2/deckarep/golang-set)](https://github.com/igrigorik/ga-beacon) diff --git a/vendor/github.com/deckarep/golang-set/iterator.go b/vendor/github.com/deckarep/golang-set/iterator.go deleted file mode 100644 index 9dfecade4255..000000000000 --- a/vendor/github.com/deckarep/golang-set/iterator.go +++ /dev/null @@ -1,58 +0,0 @@ -/* -Open Source Initiative OSI - The MIT License (MIT):Licensing - -The MIT License (MIT) -Copyright (c) 2013 Ralph Caraveo (deckarep@gmail.com) - -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. -*/ - -package mapset - -// Iterator defines an iterator over a Set, its C channel can be used to range over the Set's -// elements. -type Iterator struct { - C <-chan interface{} - stop chan struct{} -} - -// Stop stops the Iterator, no further elements will be received on C, C will be closed. -func (i *Iterator) Stop() { - // Allows for Stop() to be called multiple times - // (close() panics when called on already closed channel) - defer func() { - recover() - }() - - close(i.stop) - - // Exhaust any remaining elements. - for range i.C { - } -} - -// newIterator returns a new Iterator instance together with its item and stop channels. -func newIterator() (*Iterator, chan<- interface{}, <-chan struct{}) { - itemChan := make(chan interface{}) - stopChan := make(chan struct{}) - return &Iterator{ - C: itemChan, - stop: stopChan, - }, itemChan, stopChan -} diff --git a/vendor/github.com/deckarep/golang-set/set.go b/vendor/github.com/deckarep/golang-set/set.go deleted file mode 100644 index 29eb2e5a2247..000000000000 --- a/vendor/github.com/deckarep/golang-set/set.go +++ /dev/null @@ -1,217 +0,0 @@ -/* -Open Source Initiative OSI - The MIT License (MIT):Licensing - -The MIT License (MIT) -Copyright (c) 2013 Ralph Caraveo (deckarep@gmail.com) - -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. -*/ - -// Package mapset implements a simple and generic set collection. -// Items stored within it are unordered and unique. It supports -// typical set operations: membership testing, intersection, union, -// difference, symmetric difference and cloning. -// -// Package mapset provides two implementations of the Set -// interface. The default implementation is safe for concurrent -// access, but a non-thread-safe implementation is also provided for -// programs that can benefit from the slight speed improvement and -// that can enforce mutual exclusion through other means. -package mapset - -// Set is the primary interface provided by the mapset package. It -// represents an unordered set of data and a large number of -// operations that can be applied to that set. -type Set interface { - // Adds an element to the set. Returns whether - // the item was added. - Add(i interface{}) bool - - // Returns the number of elements in the set. - Cardinality() int - - // Removes all elements from the set, leaving - // the empty set. - Clear() - - // Returns a clone of the set using the same - // implementation, duplicating all keys. - Clone() Set - - // Returns whether the given items - // are all in the set. - Contains(i ...interface{}) bool - - // Returns the difference between this set - // and other. The returned set will contain - // all elements of this set that are not also - // elements of other. - // - // Note that the argument to Difference - // must be of the same type as the receiver - // of the method. Otherwise, Difference will - // panic. - Difference(other Set) Set - - // Determines if two sets are equal to each - // other. If they have the same cardinality - // and contain the same elements, they are - // considered equal. The order in which - // the elements were added is irrelevant. - // - // Note that the argument to Equal must be - // of the same type as the receiver of the - // method. Otherwise, Equal will panic. - Equal(other Set) bool - - // Returns a new set containing only the elements - // that exist only in both sets. - // - // Note that the argument to Intersect - // must be of the same type as the receiver - // of the method. Otherwise, Intersect will - // panic. - Intersect(other Set) Set - - // Determines if every element in this set is in - // the other set but the two sets are not equal. - // - // Note that the argument to IsProperSubset - // must be of the same type as the receiver - // of the method. Otherwise, IsProperSubset - // will panic. - IsProperSubset(other Set) bool - - // Determines if every element in the other set - // is in this set but the two sets are not - // equal. - // - // Note that the argument to IsSuperset - // must be of the same type as the receiver - // of the method. Otherwise, IsSuperset will - // panic. - IsProperSuperset(other Set) bool - - // Determines if every element in this set is in - // the other set. - // - // Note that the argument to IsSubset - // must be of the same type as the receiver - // of the method. Otherwise, IsSubset will - // panic. - IsSubset(other Set) bool - - // Determines if every element in the other set - // is in this set. - // - // Note that the argument to IsSuperset - // must be of the same type as the receiver - // of the method. Otherwise, IsSuperset will - // panic. - IsSuperset(other Set) bool - - // Iterates over elements and executes the passed func against each element. - // If passed func returns true, stop iteration at the time. - Each(func(interface{}) bool) - - // Returns a channel of elements that you can - // range over. - Iter() <-chan interface{} - - // Returns an Iterator object that you can - // use to range over the set. - Iterator() *Iterator - - // Remove a single element from the set. - Remove(i interface{}) - - // Provides a convenient string representation - // of the current state of the set. - String() string - - // Returns a new set with all elements which are - // in either this set or the other set but not in both. - // - // Note that the argument to SymmetricDifference - // must be of the same type as the receiver - // of the method. Otherwise, SymmetricDifference - // will panic. - SymmetricDifference(other Set) Set - - // Returns a new set with all elements in both sets. - // - // Note that the argument to Union must be of the - - // same type as the receiver of the method. - // Otherwise, IsSuperset will panic. - Union(other Set) Set - - // Pop removes and returns an arbitrary item from the set. - Pop() interface{} - - // Returns all subsets of a given set (Power Set). - PowerSet() Set - - // Returns the Cartesian Product of two sets. - CartesianProduct(other Set) Set - - // Returns the members of the set as a slice. - ToSlice() []interface{} -} - -// NewSet creates and returns a reference to an empty set. Operations -// on the resulting set are thread-safe. -func NewSet(s ...interface{}) Set { - set := newThreadSafeSet() - for _, item := range s { - set.Add(item) - } - return &set -} - -// NewSetWith creates and returns a new set with the given elements. -// Operations on the resulting set are thread-safe. -func NewSetWith(elts ...interface{}) Set { - return NewSetFromSlice(elts) -} - -// NewSetFromSlice creates and returns a reference to a set from an -// existing slice. Operations on the resulting set are thread-safe. -func NewSetFromSlice(s []interface{}) Set { - a := NewSet(s...) - return a -} - -// NewThreadUnsafeSet creates and returns a reference to an empty set. -// Operations on the resulting set are not thread-safe. -func NewThreadUnsafeSet() Set { - set := newThreadUnsafeSet() - return &set -} - -// NewThreadUnsafeSetFromSlice creates and returns a reference to a -// set from an existing slice. Operations on the resulting set are -// not thread-safe. -func NewThreadUnsafeSetFromSlice(s []interface{}) Set { - a := NewThreadUnsafeSet() - for _, item := range s { - a.Add(item) - } - return a -} diff --git a/vendor/github.com/deckarep/golang-set/threadsafe.go b/vendor/github.com/deckarep/golang-set/threadsafe.go deleted file mode 100644 index 002e06af1f42..000000000000 --- a/vendor/github.com/deckarep/golang-set/threadsafe.go +++ /dev/null @@ -1,277 +0,0 @@ -/* -Open Source Initiative OSI - The MIT License (MIT):Licensing - -The MIT License (MIT) -Copyright (c) 2013 Ralph Caraveo (deckarep@gmail.com) - -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. -*/ - -package mapset - -import "sync" - -type threadSafeSet struct { - s threadUnsafeSet - sync.RWMutex -} - -func newThreadSafeSet() threadSafeSet { - return threadSafeSet{s: newThreadUnsafeSet()} -} - -func (set *threadSafeSet) Add(i interface{}) bool { - set.Lock() - ret := set.s.Add(i) - set.Unlock() - return ret -} - -func (set *threadSafeSet) Contains(i ...interface{}) bool { - set.RLock() - ret := set.s.Contains(i...) - set.RUnlock() - return ret -} - -func (set *threadSafeSet) IsSubset(other Set) bool { - o := other.(*threadSafeSet) - - set.RLock() - o.RLock() - - ret := set.s.IsSubset(&o.s) - set.RUnlock() - o.RUnlock() - return ret -} - -func (set *threadSafeSet) IsProperSubset(other Set) bool { - o := other.(*threadSafeSet) - - set.RLock() - defer set.RUnlock() - o.RLock() - defer o.RUnlock() - - return set.s.IsProperSubset(&o.s) -} - -func (set *threadSafeSet) IsSuperset(other Set) bool { - return other.IsSubset(set) -} - -func (set *threadSafeSet) IsProperSuperset(other Set) bool { - return other.IsProperSubset(set) -} - -func (set *threadSafeSet) Union(other Set) Set { - o := other.(*threadSafeSet) - - set.RLock() - o.RLock() - - unsafeUnion := set.s.Union(&o.s).(*threadUnsafeSet) - ret := &threadSafeSet{s: *unsafeUnion} - set.RUnlock() - o.RUnlock() - return ret -} - -func (set *threadSafeSet) Intersect(other Set) Set { - o := other.(*threadSafeSet) - - set.RLock() - o.RLock() - - unsafeIntersection := set.s.Intersect(&o.s).(*threadUnsafeSet) - ret := &threadSafeSet{s: *unsafeIntersection} - set.RUnlock() - o.RUnlock() - return ret -} - -func (set *threadSafeSet) Difference(other Set) Set { - o := other.(*threadSafeSet) - - set.RLock() - o.RLock() - - unsafeDifference := set.s.Difference(&o.s).(*threadUnsafeSet) - ret := &threadSafeSet{s: *unsafeDifference} - set.RUnlock() - o.RUnlock() - return ret -} - -func (set *threadSafeSet) SymmetricDifference(other Set) Set { - o := other.(*threadSafeSet) - - set.RLock() - o.RLock() - - unsafeDifference := set.s.SymmetricDifference(&o.s).(*threadUnsafeSet) - ret := &threadSafeSet{s: *unsafeDifference} - set.RUnlock() - o.RUnlock() - return ret -} - -func (set *threadSafeSet) Clear() { - set.Lock() - set.s = newThreadUnsafeSet() - set.Unlock() -} - -func (set *threadSafeSet) Remove(i interface{}) { - set.Lock() - delete(set.s, i) - set.Unlock() -} - -func (set *threadSafeSet) Cardinality() int { - set.RLock() - defer set.RUnlock() - return len(set.s) -} - -func (set *threadSafeSet) Each(cb func(interface{}) bool) { - set.RLock() - for elem := range set.s { - if cb(elem) { - break - } - } - set.RUnlock() -} - -func (set *threadSafeSet) Iter() <-chan interface{} { - ch := make(chan interface{}) - go func() { - set.RLock() - - for elem := range set.s { - ch <- elem - } - close(ch) - set.RUnlock() - }() - - return ch -} - -func (set *threadSafeSet) Iterator() *Iterator { - iterator, ch, stopCh := newIterator() - - go func() { - set.RLock() - L: - for elem := range set.s { - select { - case <-stopCh: - break L - case ch <- elem: - } - } - close(ch) - set.RUnlock() - }() - - return iterator -} - -func (set *threadSafeSet) Equal(other Set) bool { - o := other.(*threadSafeSet) - - set.RLock() - o.RLock() - - ret := set.s.Equal(&o.s) - set.RUnlock() - o.RUnlock() - return ret -} - -func (set *threadSafeSet) Clone() Set { - set.RLock() - - unsafeClone := set.s.Clone().(*threadUnsafeSet) - ret := &threadSafeSet{s: *unsafeClone} - set.RUnlock() - return ret -} - -func (set *threadSafeSet) String() string { - set.RLock() - ret := set.s.String() - set.RUnlock() - return ret -} - -func (set *threadSafeSet) PowerSet() Set { - set.RLock() - ret := set.s.PowerSet() - set.RUnlock() - return ret -} - -func (set *threadSafeSet) Pop() interface{} { - set.Lock() - defer set.Unlock() - return set.s.Pop() -} - -func (set *threadSafeSet) CartesianProduct(other Set) Set { - o := other.(*threadSafeSet) - - set.RLock() - o.RLock() - - unsafeCartProduct := set.s.CartesianProduct(&o.s).(*threadUnsafeSet) - ret := &threadSafeSet{s: *unsafeCartProduct} - set.RUnlock() - o.RUnlock() - return ret -} - -func (set *threadSafeSet) ToSlice() []interface{} { - keys := make([]interface{}, 0, set.Cardinality()) - set.RLock() - for elem := range set.s { - keys = append(keys, elem) - } - set.RUnlock() - return keys -} - -func (set *threadSafeSet) MarshalJSON() ([]byte, error) { - set.RLock() - b, err := set.s.MarshalJSON() - set.RUnlock() - - return b, err -} - -func (set *threadSafeSet) UnmarshalJSON(p []byte) error { - set.RLock() - err := set.s.UnmarshalJSON(p) - set.RUnlock() - - return err -} diff --git a/vendor/github.com/deckarep/golang-set/threadunsafe.go b/vendor/github.com/deckarep/golang-set/threadunsafe.go deleted file mode 100644 index 10bdd46f155c..000000000000 --- a/vendor/github.com/deckarep/golang-set/threadunsafe.go +++ /dev/null @@ -1,337 +0,0 @@ -/* -Open Source Initiative OSI - The MIT License (MIT):Licensing - -The MIT License (MIT) -Copyright (c) 2013 Ralph Caraveo (deckarep@gmail.com) - -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. -*/ - -package mapset - -import ( - "bytes" - "encoding/json" - "fmt" - "reflect" - "strings" -) - -type threadUnsafeSet map[interface{}]struct{} - -// An OrderedPair represents a 2-tuple of values. -type OrderedPair struct { - First interface{} - Second interface{} -} - -func newThreadUnsafeSet() threadUnsafeSet { - return make(threadUnsafeSet) -} - -// Equal says whether two 2-tuples contain the same values in the same order. -func (pair *OrderedPair) Equal(other OrderedPair) bool { - if pair.First == other.First && - pair.Second == other.Second { - return true - } - - return false -} - -func (set *threadUnsafeSet) Add(i interface{}) bool { - _, found := (*set)[i] - if found { - return false //False if it existed already - } - - (*set)[i] = struct{}{} - return true -} - -func (set *threadUnsafeSet) Contains(i ...interface{}) bool { - for _, val := range i { - if _, ok := (*set)[val]; !ok { - return false - } - } - return true -} - -func (set *threadUnsafeSet) IsSubset(other Set) bool { - _ = other.(*threadUnsafeSet) - for elem := range *set { - if !other.Contains(elem) { - return false - } - } - return true -} - -func (set *threadUnsafeSet) IsProperSubset(other Set) bool { - return set.IsSubset(other) && !set.Equal(other) -} - -func (set *threadUnsafeSet) IsSuperset(other Set) bool { - return other.IsSubset(set) -} - -func (set *threadUnsafeSet) IsProperSuperset(other Set) bool { - return set.IsSuperset(other) && !set.Equal(other) -} - -func (set *threadUnsafeSet) Union(other Set) Set { - o := other.(*threadUnsafeSet) - - unionedSet := newThreadUnsafeSet() - - for elem := range *set { - unionedSet.Add(elem) - } - for elem := range *o { - unionedSet.Add(elem) - } - return &unionedSet -} - -func (set *threadUnsafeSet) Intersect(other Set) Set { - o := other.(*threadUnsafeSet) - - intersection := newThreadUnsafeSet() - // loop over smaller set - if set.Cardinality() < other.Cardinality() { - for elem := range *set { - if other.Contains(elem) { - intersection.Add(elem) - } - } - } else { - for elem := range *o { - if set.Contains(elem) { - intersection.Add(elem) - } - } - } - return &intersection -} - -func (set *threadUnsafeSet) Difference(other Set) Set { - _ = other.(*threadUnsafeSet) - - difference := newThreadUnsafeSet() - for elem := range *set { - if !other.Contains(elem) { - difference.Add(elem) - } - } - return &difference -} - -func (set *threadUnsafeSet) SymmetricDifference(other Set) Set { - _ = other.(*threadUnsafeSet) - - aDiff := set.Difference(other) - bDiff := other.Difference(set) - return aDiff.Union(bDiff) -} - -func (set *threadUnsafeSet) Clear() { - *set = newThreadUnsafeSet() -} - -func (set *threadUnsafeSet) Remove(i interface{}) { - delete(*set, i) -} - -func (set *threadUnsafeSet) Cardinality() int { - return len(*set) -} - -func (set *threadUnsafeSet) Each(cb func(interface{}) bool) { - for elem := range *set { - if cb(elem) { - break - } - } -} - -func (set *threadUnsafeSet) Iter() <-chan interface{} { - ch := make(chan interface{}) - go func() { - for elem := range *set { - ch <- elem - } - close(ch) - }() - - return ch -} - -func (set *threadUnsafeSet) Iterator() *Iterator { - iterator, ch, stopCh := newIterator() - - go func() { - L: - for elem := range *set { - select { - case <-stopCh: - break L - case ch <- elem: - } - } - close(ch) - }() - - return iterator -} - -func (set *threadUnsafeSet) Equal(other Set) bool { - _ = other.(*threadUnsafeSet) - - if set.Cardinality() != other.Cardinality() { - return false - } - for elem := range *set { - if !other.Contains(elem) { - return false - } - } - return true -} - -func (set *threadUnsafeSet) Clone() Set { - clonedSet := newThreadUnsafeSet() - for elem := range *set { - clonedSet.Add(elem) - } - return &clonedSet -} - -func (set *threadUnsafeSet) String() string { - items := make([]string, 0, len(*set)) - - for elem := range *set { - items = append(items, fmt.Sprintf("%v", elem)) - } - return fmt.Sprintf("Set{%s}", strings.Join(items, ", ")) -} - -// String outputs a 2-tuple in the form "(A, B)". -func (pair OrderedPair) String() string { - return fmt.Sprintf("(%v, %v)", pair.First, pair.Second) -} - -func (set *threadUnsafeSet) Pop() interface{} { - for item := range *set { - delete(*set, item) - return item - } - return nil -} - -func (set *threadUnsafeSet) PowerSet() Set { - powSet := NewThreadUnsafeSet() - nullset := newThreadUnsafeSet() - powSet.Add(&nullset) - - for es := range *set { - u := newThreadUnsafeSet() - j := powSet.Iter() - for er := range j { - p := newThreadUnsafeSet() - if reflect.TypeOf(er).Name() == "" { - k := er.(*threadUnsafeSet) - for ek := range *(k) { - p.Add(ek) - } - } else { - p.Add(er) - } - p.Add(es) - u.Add(&p) - } - - powSet = powSet.Union(&u) - } - - return powSet -} - -func (set *threadUnsafeSet) CartesianProduct(other Set) Set { - o := other.(*threadUnsafeSet) - cartProduct := NewThreadUnsafeSet() - - for i := range *set { - for j := range *o { - elem := OrderedPair{First: i, Second: j} - cartProduct.Add(elem) - } - } - - return cartProduct -} - -func (set *threadUnsafeSet) ToSlice() []interface{} { - keys := make([]interface{}, 0, set.Cardinality()) - for elem := range *set { - keys = append(keys, elem) - } - - return keys -} - -// MarshalJSON creates a JSON array from the set, it marshals all elements -func (set *threadUnsafeSet) MarshalJSON() ([]byte, error) { - items := make([]string, 0, set.Cardinality()) - - for elem := range *set { - b, err := json.Marshal(elem) - if err != nil { - return nil, err - } - - items = append(items, string(b)) - } - - return []byte(fmt.Sprintf("[%s]", strings.Join(items, ","))), nil -} - -// UnmarshalJSON recreates a set from a JSON array, it only decodes -// primitive types. Numbers are decoded as json.Number. -func (set *threadUnsafeSet) UnmarshalJSON(b []byte) error { - var i []interface{} - - d := json.NewDecoder(bytes.NewReader(b)) - d.UseNumber() - err := d.Decode(&i) - if err != nil { - return err - } - - for _, v := range i { - switch t := v.(type) { - case []interface{}, map[string]interface{}: - continue - default: - set.Add(t) - } - } - - return nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/LICENSE b/vendor/github.com/dgrijalva/jwt-go/LICENSE deleted file mode 100644 index df83a9c2f019..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/LICENSE +++ /dev/null @@ -1,8 +0,0 @@ -Copyright (c) 2012 Dave Grijalva - -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/dgrijalva/jwt-go/MIGRATION_GUIDE.md b/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md deleted file mode 100644 index 7fc1f793cbc4..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md +++ /dev/null @@ -1,97 +0,0 @@ -## Migration Guide from v2 -> v3 - -Version 3 adds several new, frequently requested features. To do so, it introduces a few breaking changes. We've worked to keep these as minimal as possible. This guide explains the breaking changes and how you can quickly update your code. - -### `Token.Claims` is now an interface type - -The most requested feature from the 2.0 verison of this library was the ability to provide a custom type to the JSON parser for claims. This was implemented by introducing a new interface, `Claims`, to replace `map[string]interface{}`. We also included two concrete implementations of `Claims`: `MapClaims` and `StandardClaims`. - -`MapClaims` is an alias for `map[string]interface{}` with built in validation behavior. It is the default claims type when using `Parse`. The usage is unchanged except you must type cast the claims property. - -The old example for parsing a token looked like this.. - -```go - if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil { - fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"]) - } -``` - -is now directly mapped to... - -```go - if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil { - claims := token.Claims.(jwt.MapClaims) - fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"]) - } -``` - -`StandardClaims` is designed to be embedded in your custom type. You can supply a custom claims type with the new `ParseWithClaims` function. Here's an example of using a custom claims type. - -```go - type MyCustomClaims struct { - User string - *StandardClaims - } - - if token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, keyLookupFunc); err == nil { - claims := token.Claims.(*MyCustomClaims) - fmt.Printf("Token for user %v expires %v", claims.User, claims.StandardClaims.ExpiresAt) - } -``` - -### `ParseFromRequest` has been moved - -To keep this library focused on the tokens without becoming overburdened with complex request processing logic, `ParseFromRequest` and its new companion `ParseFromRequestWithClaims` have been moved to a subpackage, `request`. The method signatues have also been augmented to receive a new argument: `Extractor`. - -`Extractors` do the work of picking the token string out of a request. The interface is simple and composable. - -This simple parsing example: - -```go - if token, err := jwt.ParseFromRequest(tokenString, req, keyLookupFunc); err == nil { - fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"]) - } -``` - -is directly mapped to: - -```go - if token, err := request.ParseFromRequest(req, request.OAuth2Extractor, keyLookupFunc); err == nil { - claims := token.Claims.(jwt.MapClaims) - fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"]) - } -``` - -There are several concrete `Extractor` types provided for your convenience: - -* `HeaderExtractor` will search a list of headers until one contains content. -* `ArgumentExtractor` will search a list of keys in request query and form arguments until one contains content. -* `MultiExtractor` will try a list of `Extractors` in order until one returns content. -* `AuthorizationHeaderExtractor` will look in the `Authorization` header for a `Bearer` token. -* `OAuth2Extractor` searches the places an OAuth2 token would be specified (per the spec): `Authorization` header and `access_token` argument -* `PostExtractionFilter` wraps an `Extractor`, allowing you to process the content before it's parsed. A simple example is stripping the `Bearer ` text from a header - - -### RSA signing methods no longer accept `[]byte` keys - -Due to a [critical vulnerability](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/), we've decided the convenience of accepting `[]byte` instead of `rsa.PublicKey` or `rsa.PrivateKey` isn't worth the risk of misuse. - -To replace this behavior, we've added two helper methods: `ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error)` and `ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error)`. These are just simple helpers for unpacking PEM encoded PKCS1 and PKCS8 keys. If your keys are encoded any other way, all you need to do is convert them to the `crypto/rsa` package's types. - -```go - func keyLookupFunc(*Token) (interface{}, error) { - // Don't forget to validate the alg is what you expect: - if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok { - return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) - } - - // Look up key - key, err := lookupPublicKey(token.Header["kid"]) - if err != nil { - return nil, err - } - - // Unpack key from PEM encoded PKCS8 - return jwt.ParseRSAPublicKeyFromPEM(key) - } -``` diff --git a/vendor/github.com/dgrijalva/jwt-go/README.md b/vendor/github.com/dgrijalva/jwt-go/README.md deleted file mode 100644 index f48365fafbfd..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/README.md +++ /dev/null @@ -1,85 +0,0 @@ -A [go](http://www.golang.org) (or 'golang' for search engine friendliness) implementation of [JSON Web Tokens](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html) - -[![Build Status](https://travis-ci.org/dgrijalva/jwt-go.svg?branch=master)](https://travis-ci.org/dgrijalva/jwt-go) - -**BREAKING CHANGES:*** Version 3.0.0 is here. It includes _a lot_ of changes including a few that break the API. We've tried to break as few things as possible, so there should just be a few type signature changes. A full list of breaking changes is available in `VERSION_HISTORY.md`. See `MIGRATION_GUIDE.md` for more information on updating your code. - -**NOTICE:** A vulnerability in JWT was [recently published](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/). As this library doesn't force users to validate the `alg` is what they expected, it's possible your usage is effected. There will be an update soon to remedy this, and it will likey require backwards-incompatible changes to the API. In the short term, please make sure your implementation verifies the `alg` is what you expect. - - -## What the heck is a JWT? - -JWT.io has [a great introduction](https://jwt.io/introduction) to JSON Web Tokens. - -In short, it's a signed JSON object that does something useful (for example, authentication). It's commonly used for `Bearer` tokens in Oauth 2. A token is made of three parts, separated by `.`'s. The first two parts are JSON objects, that have been [base64url](http://tools.ietf.org/html/rfc4648) encoded. The last part is the signature, encoded the same way. - -The first part is called the header. It contains the necessary information for verifying the last part, the signature. For example, which encryption method was used for signing and what key was used. - -The part in the middle is the interesting bit. It's called the Claims and contains the actual stuff you care about. Refer to [the RFC](http://self-issued.info/docs/draft-jones-json-web-token.html) for information about reserved keys and the proper way to add your own. - -## What's in the box? - -This library supports the parsing and verification as well as the generation and signing of JWTs. Current supported signing algorithms are HMAC SHA, RSA, RSA-PSS, and ECDSA, though hooks are present for adding your own. - -## Examples - -See [the project documentation](https://godoc.org/github.com/dgrijalva/jwt-go) for examples of usage: - -* [Simple example of parsing and validating a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-Parse--Hmac) -* [Simple example of building and signing a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-New--Hmac) -* [Directory of Examples](https://godoc.org/github.com/dgrijalva/jwt-go#pkg-examples) - -## Extensions - -This library publishes all the necessary components for adding your own signing methods. Simply implement the `SigningMethod` interface and register a factory method using `RegisterSigningMethod`. - -Here's an example of an extension that integrates with the Google App Engine signing tools: https://github.com/someone1/gcp-jwt-go - -## Compliance - -This library was last reviewed to comply with [RTF 7519](http://www.rfc-editor.org/info/rfc7519) dated May 2015 with a few notable differences: - -* In order to protect against accidental use of [Unsecured JWTs](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#UnsecuredJWT), tokens using `alg=none` will only be accepted if the constant `jwt.UnsafeAllowNoneSignatureType` is provided as the key. - -## Project Status & Versioning - -This library is considered production ready. Feedback and feature requests are appreciated. The API should be considered stable. There should be very few backwards-incompatible changes outside of major version updates (and only with good reason). - -This project uses [Semantic Versioning 2.0.0](http://semver.org). Accepted pull requests will land on `master`. Periodically, versions will be tagged from `master`. You can find all the releases on [the project releases page](https://github.com/dgrijalva/jwt-go/releases). - -While we try to make it obvious when we make breaking changes, there isn't a great mechanism for pushing announcements out to users. You may want to use this alternative package include: `gopkg.in/dgrijalva/jwt-go.v2`. It will do the right thing WRT semantic versioning. - -## Usage Tips - -### Signing vs Encryption - -A token is simply a JSON object that is signed by its author. this tells you exactly two things about the data: - -* The author of the token was in the possession of the signing secret -* The data has not been modified since it was signed - -It's important to know that JWT does not provide encryption, which means anyone who has access to the token can read its contents. If you need to protect (encrypt) the data, there is a companion spec, `JWE`, that provides this functionality. JWE is currently outside the scope of this library. - -### Choosing a Signing Method - -There are several signing methods available, and you should probably take the time to learn about the various options before choosing one. The principal design decision is most likely going to be symmetric vs asymmetric. - -Symmetric signing methods, such as HSA, use only a single secret. This is probably the simplest signing method to use since any `[]byte` can be used as a valid secret. They are also slightly computationally faster to use, though this rarely is enough to matter. Symmetric signing methods work the best when both producers and consumers of tokens are trusted, or even the same system. Since the same secret is used to both sign and validate tokens, you can't easily distribute the key for validation. - -Asymmetric signing methods, such as RSA, use different keys for signing and verifying tokens. This makes it possible to produce tokens with a private key, and allow any consumer to access the public key for verification. - -### JWT and OAuth - -It's worth mentioning that OAuth and JWT are not the same thing. A JWT token is simply a signed JSON object. It can be used anywhere such a thing is useful. There is some confusion, though, as JWT is the most common type of bearer token used in OAuth2 authentication. - -Without going too far down the rabbit hole, here's a description of the interaction of these technologies: - -* OAuth is a protocol for allowing an identity provider to be separate from the service a user is logging in to. For example, whenever you use Facebook to log into a different service (Yelp, Spotify, etc), you are using OAuth. -* OAuth defines several options for passing around authentication data. One popular method is called a "bearer token". A bearer token is simply a string that _should_ only be held by an authenticated user. Thus, simply presenting this token proves your identity. You can probably derive from here why a JWT might make a good bearer token. -* Because bearer tokens are used for authentication, it's important they're kept secret. This is why transactions that use bearer tokens typically happen over SSL. - -## More - -Documentation can be found [on godoc.org](http://godoc.org/github.com/dgrijalva/jwt-go). - -The command line utility included in this project (cmd/jwt) provides a straightforward example of token creation and parsing as well as a useful tool for debugging your own integration. You'll also find several implementation examples in to documentation. diff --git a/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md b/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md deleted file mode 100644 index b605b4509309..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md +++ /dev/null @@ -1,105 +0,0 @@ -## `jwt-go` Version History - -#### 3.0.0 - -* **Compatibility Breaking Changes**: See MIGRATION_GUIDE.md for tips on updating your code - * Dropped support for `[]byte` keys when using RSA signing methods. This convenience feature could contribute to security vulnerabilities involving mismatched key types with signing methods. - * `ParseFromRequest` has been moved to `request` subpackage and usage has changed - * The `Claims` property on `Token` is now type `Claims` instead of `map[string]interface{}`. The default value is type `MapClaims`, which is an alias to `map[string]interface{}`. This makes it possible to use a custom type when decoding claims. -* Other Additions and Changes - * Added `Claims` interface type to allow users to decode the claims into a custom type - * Added `ParseWithClaims`, which takes a third argument of type `Claims`. Use this function instead of `Parse` if you have a custom type you'd like to decode into. - * Dramatically improved the functionality and flexibility of `ParseFromRequest`, which is now in the `request` subpackage - * Added `ParseFromRequestWithClaims` which is the `FromRequest` equivalent of `ParseWithClaims` - * Added new interface type `Extractor`, which is used for extracting JWT strings from http requests. Used with `ParseFromRequest` and `ParseFromRequestWithClaims`. - * Added several new, more specific, validation errors to error type bitmask - * Moved examples from README to executable example files - * Signing method registry is now thread safe - * Added new property to `ValidationError`, which contains the raw error returned by calls made by parse/verify (such as those returned by keyfunc or json parser) - -#### 2.7.0 - -This will likely be the last backwards compatible release before 3.0.0, excluding essential bug fixes. - -* Added new option `-show` to the `jwt` command that will just output the decoded token without verifying -* Error text for expired tokens includes how long it's been expired -* Fixed incorrect error returned from `ParseRSAPublicKeyFromPEM` -* Documentation updates - -#### 2.6.0 - -* Exposed inner error within ValidationError -* Fixed validation errors when using UseJSONNumber flag -* Added several unit tests - -#### 2.5.0 - -* Added support for signing method none. You shouldn't use this. The API tries to make this clear. -* Updated/fixed some documentation -* Added more helpful error message when trying to parse tokens that begin with `BEARER ` - -#### 2.4.0 - -* Added new type, Parser, to allow for configuration of various parsing parameters - * You can now specify a list of valid signing methods. Anything outside this set will be rejected. - * You can now opt to use the `json.Number` type instead of `float64` when parsing token JSON -* Added support for [Travis CI](https://travis-ci.org/dgrijalva/jwt-go) -* Fixed some bugs with ECDSA parsing - -#### 2.3.0 - -* Added support for ECDSA signing methods -* Added support for RSA PSS signing methods (requires go v1.4) - -#### 2.2.0 - -* Gracefully handle a `nil` `Keyfunc` being passed to `Parse`. Result will now be the parsed token and an error, instead of a panic. - -#### 2.1.0 - -Backwards compatible API change that was missed in 2.0.0. - -* The `SignedString` method on `Token` now takes `interface{}` instead of `[]byte` - -#### 2.0.0 - -There were two major reasons for breaking backwards compatibility with this update. The first was a refactor required to expand the width of the RSA and HMAC-SHA signing implementations. There will likely be no required code changes to support this change. - -The second update, while unfortunately requiring a small change in integration, is required to open up this library to other signing methods. Not all keys used for all signing methods have a single standard on-disk representation. Requiring `[]byte` as the type for all keys proved too limiting. Additionally, this implementation allows for pre-parsed tokens to be reused, which might matter in an application that parses a high volume of tokens with a small set of keys. Backwards compatibilty has been maintained for passing `[]byte` to the RSA signing methods, but they will also accept `*rsa.PublicKey` and `*rsa.PrivateKey`. - -It is likely the only integration change required here will be to change `func(t *jwt.Token) ([]byte, error)` to `func(t *jwt.Token) (interface{}, error)` when calling `Parse`. - -* **Compatibility Breaking Changes** - * `SigningMethodHS256` is now `*SigningMethodHMAC` instead of `type struct` - * `SigningMethodRS256` is now `*SigningMethodRSA` instead of `type struct` - * `KeyFunc` now returns `interface{}` instead of `[]byte` - * `SigningMethod.Sign` now takes `interface{}` instead of `[]byte` for the key - * `SigningMethod.Verify` now takes `interface{}` instead of `[]byte` for the key -* Renamed type `SigningMethodHS256` to `SigningMethodHMAC`. Specific sizes are now just instances of this type. - * Added public package global `SigningMethodHS256` - * Added public package global `SigningMethodHS384` - * Added public package global `SigningMethodHS512` -* Renamed type `SigningMethodRS256` to `SigningMethodRSA`. Specific sizes are now just instances of this type. - * Added public package global `SigningMethodRS256` - * Added public package global `SigningMethodRS384` - * Added public package global `SigningMethodRS512` -* Moved sample private key for HMAC tests from an inline value to a file on disk. Value is unchanged. -* Refactored the RSA implementation to be easier to read -* Exposed helper methods `ParseRSAPrivateKeyFromPEM` and `ParseRSAPublicKeyFromPEM` - -#### 1.0.2 - -* Fixed bug in parsing public keys from certificates -* Added more tests around the parsing of keys for RS256 -* Code refactoring in RS256 implementation. No functional changes - -#### 1.0.1 - -* Fixed panic if RS256 signing method was passed an invalid key - -#### 1.0.0 - -* First versioned release -* API stabilized -* Supports creating, signing, parsing, and validating JWT tokens -* Supports RS256 and HS256 signing methods \ No newline at end of file diff --git a/vendor/github.com/dgrijalva/jwt-go/claims.go b/vendor/github.com/dgrijalva/jwt-go/claims.go deleted file mode 100644 index f0228f02e033..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/claims.go +++ /dev/null @@ -1,134 +0,0 @@ -package jwt - -import ( - "crypto/subtle" - "fmt" - "time" -) - -// For a type to be a Claims object, it must just have a Valid method that determines -// if the token is invalid for any supported reason -type Claims interface { - Valid() error -} - -// Structured version of Claims Section, as referenced at -// https://tools.ietf.org/html/rfc7519#section-4.1 -// See examples for how to use this with your own claim types -type StandardClaims struct { - Audience string `json:"aud,omitempty"` - ExpiresAt int64 `json:"exp,omitempty"` - Id string `json:"jti,omitempty"` - IssuedAt int64 `json:"iat,omitempty"` - Issuer string `json:"iss,omitempty"` - NotBefore int64 `json:"nbf,omitempty"` - Subject string `json:"sub,omitempty"` -} - -// Validates time based claims "exp, iat, nbf". -// There is no accounting for clock skew. -// As well, if any of the above claims are not in the token, it will still -// be considered a valid claim. -func (c StandardClaims) Valid() error { - vErr := new(ValidationError) - now := TimeFunc().Unix() - - // The claims below are optional, by default, so if they are set to the - // default value in Go, let's not fail the verification for them. - if c.VerifyExpiresAt(now, false) == false { - delta := time.Unix(now, 0).Sub(time.Unix(c.ExpiresAt, 0)) - vErr.Inner = fmt.Errorf("token is expired by %v", delta) - vErr.Errors |= ValidationErrorExpired - } - - if c.VerifyIssuedAt(now, false) == false { - vErr.Inner = fmt.Errorf("Token used before issued") - vErr.Errors |= ValidationErrorIssuedAt - } - - if c.VerifyNotBefore(now, false) == false { - vErr.Inner = fmt.Errorf("token is not valid yet") - vErr.Errors |= ValidationErrorNotValidYet - } - - if vErr.valid() { - return nil - } - - return vErr -} - -// Compares the aud claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyAudience(cmp string, req bool) bool { - return verifyAud(c.Audience, cmp, req) -} - -// Compares the exp claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyExpiresAt(cmp int64, req bool) bool { - return verifyExp(c.ExpiresAt, cmp, req) -} - -// Compares the iat claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyIssuedAt(cmp int64, req bool) bool { - return verifyIat(c.IssuedAt, cmp, req) -} - -// Compares the iss claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyIssuer(cmp string, req bool) bool { - return verifyIss(c.Issuer, cmp, req) -} - -// Compares the nbf claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyNotBefore(cmp int64, req bool) bool { - return verifyNbf(c.NotBefore, cmp, req) -} - -// ----- helpers - -func verifyAud(aud string, cmp string, required bool) bool { - if aud == "" { - return !required - } - if subtle.ConstantTimeCompare([]byte(aud), []byte(cmp)) != 0 { - return true - } else { - return false - } -} - -func verifyExp(exp int64, now int64, required bool) bool { - if exp == 0 { - return !required - } - return now <= exp -} - -func verifyIat(iat int64, now int64, required bool) bool { - if iat == 0 { - return !required - } - return now >= iat -} - -func verifyIss(iss string, cmp string, required bool) bool { - if iss == "" { - return !required - } - if subtle.ConstantTimeCompare([]byte(iss), []byte(cmp)) != 0 { - return true - } else { - return false - } -} - -func verifyNbf(nbf int64, now int64, required bool) bool { - if nbf == 0 { - return !required - } - return now >= nbf -} diff --git a/vendor/github.com/dgrijalva/jwt-go/doc.go b/vendor/github.com/dgrijalva/jwt-go/doc.go deleted file mode 100644 index a86dc1a3b348..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/doc.go +++ /dev/null @@ -1,4 +0,0 @@ -// Package jwt is a Go implementation of JSON Web Tokens: http://self-issued.info/docs/draft-jones-json-web-token.html -// -// See README.md for more info. -package jwt diff --git a/vendor/github.com/dgrijalva/jwt-go/ecdsa.go b/vendor/github.com/dgrijalva/jwt-go/ecdsa.go deleted file mode 100644 index 2f59a2223638..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/ecdsa.go +++ /dev/null @@ -1,147 +0,0 @@ -package jwt - -import ( - "crypto" - "crypto/ecdsa" - "crypto/rand" - "errors" - "math/big" -) - -var ( - // Sadly this is missing from crypto/ecdsa compared to crypto/rsa - ErrECDSAVerification = errors.New("crypto/ecdsa: verification error") -) - -// Implements the ECDSA family of signing methods signing methods -type SigningMethodECDSA struct { - Name string - Hash crypto.Hash - KeySize int - CurveBits int -} - -// Specific instances for EC256 and company -var ( - SigningMethodES256 *SigningMethodECDSA - SigningMethodES384 *SigningMethodECDSA - SigningMethodES512 *SigningMethodECDSA -) - -func init() { - // ES256 - SigningMethodES256 = &SigningMethodECDSA{"ES256", crypto.SHA256, 32, 256} - RegisterSigningMethod(SigningMethodES256.Alg(), func() SigningMethod { - return SigningMethodES256 - }) - - // ES384 - SigningMethodES384 = &SigningMethodECDSA{"ES384", crypto.SHA384, 48, 384} - RegisterSigningMethod(SigningMethodES384.Alg(), func() SigningMethod { - return SigningMethodES384 - }) - - // ES512 - SigningMethodES512 = &SigningMethodECDSA{"ES512", crypto.SHA512, 66, 521} - RegisterSigningMethod(SigningMethodES512.Alg(), func() SigningMethod { - return SigningMethodES512 - }) -} - -func (m *SigningMethodECDSA) Alg() string { - return m.Name -} - -// Implements the Verify method from SigningMethod -// For this verify method, key must be an ecdsa.PublicKey struct -func (m *SigningMethodECDSA) Verify(signingString, signature string, key interface{}) error { - var err error - - // Decode the signature - var sig []byte - if sig, err = DecodeSegment(signature); err != nil { - return err - } - - // Get the key - var ecdsaKey *ecdsa.PublicKey - switch k := key.(type) { - case *ecdsa.PublicKey: - ecdsaKey = k - default: - return ErrInvalidKeyType - } - - if len(sig) != 2*m.KeySize { - return ErrECDSAVerification - } - - r := big.NewInt(0).SetBytes(sig[:m.KeySize]) - s := big.NewInt(0).SetBytes(sig[m.KeySize:]) - - // Create hasher - if !m.Hash.Available() { - return ErrHashUnavailable - } - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Verify the signature - if verifystatus := ecdsa.Verify(ecdsaKey, hasher.Sum(nil), r, s); verifystatus == true { - return nil - } else { - return ErrECDSAVerification - } -} - -// Implements the Sign method from SigningMethod -// For this signing method, key must be an ecdsa.PrivateKey struct -func (m *SigningMethodECDSA) Sign(signingString string, key interface{}) (string, error) { - // Get the key - var ecdsaKey *ecdsa.PrivateKey - switch k := key.(type) { - case *ecdsa.PrivateKey: - ecdsaKey = k - default: - return "", ErrInvalidKeyType - } - - // Create the hasher - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Sign the string and return r, s - if r, s, err := ecdsa.Sign(rand.Reader, ecdsaKey, hasher.Sum(nil)); err == nil { - curveBits := ecdsaKey.Curve.Params().BitSize - - if m.CurveBits != curveBits { - return "", ErrInvalidKey - } - - keyBytes := curveBits / 8 - if curveBits%8 > 0 { - keyBytes += 1 - } - - // We serialize the outpus (r and s) into big-endian byte arrays and pad - // them with zeros on the left to make sure the sizes work out. Both arrays - // must be keyBytes long, and the output must be 2*keyBytes long. - rBytes := r.Bytes() - rBytesPadded := make([]byte, keyBytes) - copy(rBytesPadded[keyBytes-len(rBytes):], rBytes) - - sBytes := s.Bytes() - sBytesPadded := make([]byte, keyBytes) - copy(sBytesPadded[keyBytes-len(sBytes):], sBytes) - - out := append(rBytesPadded, sBytesPadded...) - - return EncodeSegment(out), nil - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go b/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go deleted file mode 100644 index d19624b7264f..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go +++ /dev/null @@ -1,67 +0,0 @@ -package jwt - -import ( - "crypto/ecdsa" - "crypto/x509" - "encoding/pem" - "errors" -) - -var ( - ErrNotECPublicKey = errors.New("Key is not a valid ECDSA public key") - ErrNotECPrivateKey = errors.New("Key is not a valid ECDSA private key") -) - -// Parse PEM encoded Elliptic Curve Private Key Structure -func ParseECPrivateKeyFromPEM(key []byte) (*ecdsa.PrivateKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - // Parse the key - var parsedKey interface{} - if parsedKey, err = x509.ParseECPrivateKey(block.Bytes); err != nil { - return nil, err - } - - var pkey *ecdsa.PrivateKey - var ok bool - if pkey, ok = parsedKey.(*ecdsa.PrivateKey); !ok { - return nil, ErrNotECPrivateKey - } - - return pkey, nil -} - -// Parse PEM encoded PKCS1 or PKCS8 public key -func ParseECPublicKeyFromPEM(key []byte) (*ecdsa.PublicKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - // Parse the key - var parsedKey interface{} - if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil { - if cert, err := x509.ParseCertificate(block.Bytes); err == nil { - parsedKey = cert.PublicKey - } else { - return nil, err - } - } - - var pkey *ecdsa.PublicKey - var ok bool - if pkey, ok = parsedKey.(*ecdsa.PublicKey); !ok { - return nil, ErrNotECPublicKey - } - - return pkey, nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/errors.go b/vendor/github.com/dgrijalva/jwt-go/errors.go deleted file mode 100644 index 1c93024aad2e..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/errors.go +++ /dev/null @@ -1,59 +0,0 @@ -package jwt - -import ( - "errors" -) - -// Error constants -var ( - ErrInvalidKey = errors.New("key is invalid") - ErrInvalidKeyType = errors.New("key is of invalid type") - ErrHashUnavailable = errors.New("the requested hash function is unavailable") -) - -// The errors that might occur when parsing and validating a token -const ( - ValidationErrorMalformed uint32 = 1 << iota // Token is malformed - ValidationErrorUnverifiable // Token could not be verified because of signing problems - ValidationErrorSignatureInvalid // Signature validation failed - - // Standard Claim validation errors - ValidationErrorAudience // AUD validation failed - ValidationErrorExpired // EXP validation failed - ValidationErrorIssuedAt // IAT validation failed - ValidationErrorIssuer // ISS validation failed - ValidationErrorNotValidYet // NBF validation failed - ValidationErrorId // JTI validation failed - ValidationErrorClaimsInvalid // Generic claims validation error -) - -// Helper for constructing a ValidationError with a string error message -func NewValidationError(errorText string, errorFlags uint32) *ValidationError { - return &ValidationError{ - text: errorText, - Errors: errorFlags, - } -} - -// The error from Parse if token is not valid -type ValidationError struct { - Inner error // stores the error returned by external dependencies, i.e.: KeyFunc - Errors uint32 // bitfield. see ValidationError... constants - text string // errors that do not have a valid error just have text -} - -// Validation error is an error type -func (e ValidationError) Error() string { - if e.Inner != nil { - return e.Inner.Error() - } else if e.text != "" { - return e.text - } else { - return "token is invalid" - } -} - -// No errors -func (e *ValidationError) valid() bool { - return e.Errors == 0 -} diff --git a/vendor/github.com/dgrijalva/jwt-go/hmac.go b/vendor/github.com/dgrijalva/jwt-go/hmac.go deleted file mode 100644 index c22991925455..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/hmac.go +++ /dev/null @@ -1,94 +0,0 @@ -package jwt - -import ( - "crypto" - "crypto/hmac" - "errors" -) - -// Implements the HMAC-SHA family of signing methods signing methods -type SigningMethodHMAC struct { - Name string - Hash crypto.Hash -} - -// Specific instances for HS256 and company -var ( - SigningMethodHS256 *SigningMethodHMAC - SigningMethodHS384 *SigningMethodHMAC - SigningMethodHS512 *SigningMethodHMAC - ErrSignatureInvalid = errors.New("signature is invalid") -) - -func init() { - // HS256 - SigningMethodHS256 = &SigningMethodHMAC{"HS256", crypto.SHA256} - RegisterSigningMethod(SigningMethodHS256.Alg(), func() SigningMethod { - return SigningMethodHS256 - }) - - // HS384 - SigningMethodHS384 = &SigningMethodHMAC{"HS384", crypto.SHA384} - RegisterSigningMethod(SigningMethodHS384.Alg(), func() SigningMethod { - return SigningMethodHS384 - }) - - // HS512 - SigningMethodHS512 = &SigningMethodHMAC{"HS512", crypto.SHA512} - RegisterSigningMethod(SigningMethodHS512.Alg(), func() SigningMethod { - return SigningMethodHS512 - }) -} - -func (m *SigningMethodHMAC) Alg() string { - return m.Name -} - -// Verify the signature of HSXXX tokens. Returns nil if the signature is valid. -func (m *SigningMethodHMAC) Verify(signingString, signature string, key interface{}) error { - // Verify the key is the right type - keyBytes, ok := key.([]byte) - if !ok { - return ErrInvalidKeyType - } - - // Decode signature, for comparison - sig, err := DecodeSegment(signature) - if err != nil { - return err - } - - // Can we use the specified hashing method? - if !m.Hash.Available() { - return ErrHashUnavailable - } - - // This signing method is symmetric, so we validate the signature - // by reproducing the signature from the signing string and key, then - // comparing that against the provided signature. - hasher := hmac.New(m.Hash.New, keyBytes) - hasher.Write([]byte(signingString)) - if !hmac.Equal(sig, hasher.Sum(nil)) { - return ErrSignatureInvalid - } - - // No validation errors. Signature is good. - return nil -} - -// Implements the Sign method from SigningMethod for this signing method. -// Key must be []byte -func (m *SigningMethodHMAC) Sign(signingString string, key interface{}) (string, error) { - if keyBytes, ok := key.([]byte); ok { - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := hmac.New(m.Hash.New, keyBytes) - hasher.Write([]byte(signingString)) - - return EncodeSegment(hasher.Sum(nil)), nil - } - - return "", ErrInvalidKey -} diff --git a/vendor/github.com/dgrijalva/jwt-go/map_claims.go b/vendor/github.com/dgrijalva/jwt-go/map_claims.go deleted file mode 100644 index 291213c460d4..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/map_claims.go +++ /dev/null @@ -1,94 +0,0 @@ -package jwt - -import ( - "encoding/json" - "errors" - // "fmt" -) - -// Claims type that uses the map[string]interface{} for JSON decoding -// This is the default claims type if you don't supply one -type MapClaims map[string]interface{} - -// Compares the aud claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyAudience(cmp string, req bool) bool { - aud, _ := m["aud"].(string) - return verifyAud(aud, cmp, req) -} - -// Compares the exp claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyExpiresAt(cmp int64, req bool) bool { - switch exp := m["exp"].(type) { - case float64: - return verifyExp(int64(exp), cmp, req) - case json.Number: - v, _ := exp.Int64() - return verifyExp(v, cmp, req) - } - return req == false -} - -// Compares the iat claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyIssuedAt(cmp int64, req bool) bool { - switch iat := m["iat"].(type) { - case float64: - return verifyIat(int64(iat), cmp, req) - case json.Number: - v, _ := iat.Int64() - return verifyIat(v, cmp, req) - } - return req == false -} - -// Compares the iss claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyIssuer(cmp string, req bool) bool { - iss, _ := m["iss"].(string) - return verifyIss(iss, cmp, req) -} - -// Compares the nbf claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyNotBefore(cmp int64, req bool) bool { - switch nbf := m["nbf"].(type) { - case float64: - return verifyNbf(int64(nbf), cmp, req) - case json.Number: - v, _ := nbf.Int64() - return verifyNbf(v, cmp, req) - } - return req == false -} - -// Validates time based claims "exp, iat, nbf". -// There is no accounting for clock skew. -// As well, if any of the above claims are not in the token, it will still -// be considered a valid claim. -func (m MapClaims) Valid() error { - vErr := new(ValidationError) - now := TimeFunc().Unix() - - if m.VerifyExpiresAt(now, false) == false { - vErr.Inner = errors.New("Token is expired") - vErr.Errors |= ValidationErrorExpired - } - - if m.VerifyIssuedAt(now, false) == false { - vErr.Inner = errors.New("Token used before issued") - vErr.Errors |= ValidationErrorIssuedAt - } - - if m.VerifyNotBefore(now, false) == false { - vErr.Inner = errors.New("Token is not valid yet") - vErr.Errors |= ValidationErrorNotValidYet - } - - if vErr.valid() { - return nil - } - - return vErr -} diff --git a/vendor/github.com/dgrijalva/jwt-go/none.go b/vendor/github.com/dgrijalva/jwt-go/none.go deleted file mode 100644 index f04d189d067b..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/none.go +++ /dev/null @@ -1,52 +0,0 @@ -package jwt - -// Implements the none signing method. This is required by the spec -// but you probably should never use it. -var SigningMethodNone *signingMethodNone - -const UnsafeAllowNoneSignatureType unsafeNoneMagicConstant = "none signing method allowed" - -var NoneSignatureTypeDisallowedError error - -type signingMethodNone struct{} -type unsafeNoneMagicConstant string - -func init() { - SigningMethodNone = &signingMethodNone{} - NoneSignatureTypeDisallowedError = NewValidationError("'none' signature type is not allowed", ValidationErrorSignatureInvalid) - - RegisterSigningMethod(SigningMethodNone.Alg(), func() SigningMethod { - return SigningMethodNone - }) -} - -func (m *signingMethodNone) Alg() string { - return "none" -} - -// Only allow 'none' alg type if UnsafeAllowNoneSignatureType is specified as the key -func (m *signingMethodNone) Verify(signingString, signature string, key interface{}) (err error) { - // Key must be UnsafeAllowNoneSignatureType to prevent accidentally - // accepting 'none' signing method - if _, ok := key.(unsafeNoneMagicConstant); !ok { - return NoneSignatureTypeDisallowedError - } - // If signing method is none, signature must be an empty string - if signature != "" { - return NewValidationError( - "'none' signing method with non-empty signature", - ValidationErrorSignatureInvalid, - ) - } - - // Accept 'none' signing method. - return nil -} - -// Only allow 'none' signing if UnsafeAllowNoneSignatureType is specified as the key -func (m *signingMethodNone) Sign(signingString string, key interface{}) (string, error) { - if _, ok := key.(unsafeNoneMagicConstant); ok { - return "", nil - } - return "", NoneSignatureTypeDisallowedError -} diff --git a/vendor/github.com/dgrijalva/jwt-go/parser.go b/vendor/github.com/dgrijalva/jwt-go/parser.go deleted file mode 100644 index 7bf1c4ea0842..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/parser.go +++ /dev/null @@ -1,131 +0,0 @@ -package jwt - -import ( - "bytes" - "encoding/json" - "fmt" - "strings" -) - -type Parser struct { - ValidMethods []string // If populated, only these methods will be considered valid - UseJSONNumber bool // Use JSON Number format in JSON decoder - SkipClaimsValidation bool // Skip claims validation during token parsing -} - -// Parse, validate, and return a token. -// keyFunc will receive the parsed token and should return the key for validating. -// If everything is kosher, err will be nil -func (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { - return p.ParseWithClaims(tokenString, MapClaims{}, keyFunc) -} - -func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { - parts := strings.Split(tokenString, ".") - if len(parts) != 3 { - return nil, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) - } - - var err error - token := &Token{Raw: tokenString} - - // parse Header - var headerBytes []byte - if headerBytes, err = DecodeSegment(parts[0]); err != nil { - if strings.HasPrefix(strings.ToLower(tokenString), "bearer ") { - return token, NewValidationError("tokenstring should not contain 'bearer '", ValidationErrorMalformed) - } - return token, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - if err = json.Unmarshal(headerBytes, &token.Header); err != nil { - return token, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - - // parse Claims - var claimBytes []byte - token.Claims = claims - - if claimBytes, err = DecodeSegment(parts[1]); err != nil { - return token, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - dec := json.NewDecoder(bytes.NewBuffer(claimBytes)) - if p.UseJSONNumber { - dec.UseNumber() - } - // JSON Decode. Special case for map type to avoid weird pointer behavior - if c, ok := token.Claims.(MapClaims); ok { - err = dec.Decode(&c) - } else { - err = dec.Decode(&claims) - } - // Handle decode error - if err != nil { - return token, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - - // Lookup signature method - if method, ok := token.Header["alg"].(string); ok { - if token.Method = GetSigningMethod(method); token.Method == nil { - return token, NewValidationError("signing method (alg) is unavailable.", ValidationErrorUnverifiable) - } - } else { - return token, NewValidationError("signing method (alg) is unspecified.", ValidationErrorUnverifiable) - } - - // Verify signing method is in the required set - if p.ValidMethods != nil { - var signingMethodValid = false - var alg = token.Method.Alg() - for _, m := range p.ValidMethods { - if m == alg { - signingMethodValid = true - break - } - } - if !signingMethodValid { - // signing method is not in the listed set - return token, NewValidationError(fmt.Sprintf("signing method %v is invalid", alg), ValidationErrorSignatureInvalid) - } - } - - // Lookup key - var key interface{} - if keyFunc == nil { - // keyFunc was not provided. short circuiting validation - return token, NewValidationError("no Keyfunc was provided.", ValidationErrorUnverifiable) - } - if key, err = keyFunc(token); err != nil { - // keyFunc returned an error - return token, &ValidationError{Inner: err, Errors: ValidationErrorUnverifiable} - } - - vErr := &ValidationError{} - - // Validate Claims - if !p.SkipClaimsValidation { - if err := token.Claims.Valid(); err != nil { - - // If the Claims Valid returned an error, check if it is a validation error, - // If it was another error type, create a ValidationError with a generic ClaimsInvalid flag set - if e, ok := err.(*ValidationError); !ok { - vErr = &ValidationError{Inner: err, Errors: ValidationErrorClaimsInvalid} - } else { - vErr = e - } - } - } - - // Perform validation - token.Signature = parts[2] - if err = token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { - vErr.Inner = err - vErr.Errors |= ValidationErrorSignatureInvalid - } - - if vErr.valid() { - token.Valid = true - return token, nil - } - - return token, vErr -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa.go b/vendor/github.com/dgrijalva/jwt-go/rsa.go deleted file mode 100644 index 0ae0b1984e5a..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa.go +++ /dev/null @@ -1,100 +0,0 @@ -package jwt - -import ( - "crypto" - "crypto/rand" - "crypto/rsa" -) - -// Implements the RSA family of signing methods signing methods -type SigningMethodRSA struct { - Name string - Hash crypto.Hash -} - -// Specific instances for RS256 and company -var ( - SigningMethodRS256 *SigningMethodRSA - SigningMethodRS384 *SigningMethodRSA - SigningMethodRS512 *SigningMethodRSA -) - -func init() { - // RS256 - SigningMethodRS256 = &SigningMethodRSA{"RS256", crypto.SHA256} - RegisterSigningMethod(SigningMethodRS256.Alg(), func() SigningMethod { - return SigningMethodRS256 - }) - - // RS384 - SigningMethodRS384 = &SigningMethodRSA{"RS384", crypto.SHA384} - RegisterSigningMethod(SigningMethodRS384.Alg(), func() SigningMethod { - return SigningMethodRS384 - }) - - // RS512 - SigningMethodRS512 = &SigningMethodRSA{"RS512", crypto.SHA512} - RegisterSigningMethod(SigningMethodRS512.Alg(), func() SigningMethod { - return SigningMethodRS512 - }) -} - -func (m *SigningMethodRSA) Alg() string { - return m.Name -} - -// Implements the Verify method from SigningMethod -// For this signing method, must be an rsa.PublicKey structure. -func (m *SigningMethodRSA) Verify(signingString, signature string, key interface{}) error { - var err error - - // Decode the signature - var sig []byte - if sig, err = DecodeSegment(signature); err != nil { - return err - } - - var rsaKey *rsa.PublicKey - var ok bool - - if rsaKey, ok = key.(*rsa.PublicKey); !ok { - return ErrInvalidKeyType - } - - // Create hasher - if !m.Hash.Available() { - return ErrHashUnavailable - } - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Verify the signature - return rsa.VerifyPKCS1v15(rsaKey, m.Hash, hasher.Sum(nil), sig) -} - -// Implements the Sign method from SigningMethod -// For this signing method, must be an rsa.PrivateKey structure. -func (m *SigningMethodRSA) Sign(signingString string, key interface{}) (string, error) { - var rsaKey *rsa.PrivateKey - var ok bool - - // Validate type of key - if rsaKey, ok = key.(*rsa.PrivateKey); !ok { - return "", ErrInvalidKey - } - - // Create the hasher - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Sign the string and return the encoded bytes - if sigBytes, err := rsa.SignPKCS1v15(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil)); err == nil { - return EncodeSegment(sigBytes), nil - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go b/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go deleted file mode 100644 index 10ee9db8a4ed..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go +++ /dev/null @@ -1,126 +0,0 @@ -// +build go1.4 - -package jwt - -import ( - "crypto" - "crypto/rand" - "crypto/rsa" -) - -// Implements the RSAPSS family of signing methods signing methods -type SigningMethodRSAPSS struct { - *SigningMethodRSA - Options *rsa.PSSOptions -} - -// Specific instances for RS/PS and company -var ( - SigningMethodPS256 *SigningMethodRSAPSS - SigningMethodPS384 *SigningMethodRSAPSS - SigningMethodPS512 *SigningMethodRSAPSS -) - -func init() { - // PS256 - SigningMethodPS256 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ - Name: "PS256", - Hash: crypto.SHA256, - }, - &rsa.PSSOptions{ - SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA256, - }, - } - RegisterSigningMethod(SigningMethodPS256.Alg(), func() SigningMethod { - return SigningMethodPS256 - }) - - // PS384 - SigningMethodPS384 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ - Name: "PS384", - Hash: crypto.SHA384, - }, - &rsa.PSSOptions{ - SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA384, - }, - } - RegisterSigningMethod(SigningMethodPS384.Alg(), func() SigningMethod { - return SigningMethodPS384 - }) - - // PS512 - SigningMethodPS512 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ - Name: "PS512", - Hash: crypto.SHA512, - }, - &rsa.PSSOptions{ - SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA512, - }, - } - RegisterSigningMethod(SigningMethodPS512.Alg(), func() SigningMethod { - return SigningMethodPS512 - }) -} - -// Implements the Verify method from SigningMethod -// For this verify method, key must be an rsa.PublicKey struct -func (m *SigningMethodRSAPSS) Verify(signingString, signature string, key interface{}) error { - var err error - - // Decode the signature - var sig []byte - if sig, err = DecodeSegment(signature); err != nil { - return err - } - - var rsaKey *rsa.PublicKey - switch k := key.(type) { - case *rsa.PublicKey: - rsaKey = k - default: - return ErrInvalidKey - } - - // Create hasher - if !m.Hash.Available() { - return ErrHashUnavailable - } - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - return rsa.VerifyPSS(rsaKey, m.Hash, hasher.Sum(nil), sig, m.Options) -} - -// Implements the Sign method from SigningMethod -// For this signing method, key must be an rsa.PrivateKey struct -func (m *SigningMethodRSAPSS) Sign(signingString string, key interface{}) (string, error) { - var rsaKey *rsa.PrivateKey - - switch k := key.(type) { - case *rsa.PrivateKey: - rsaKey = k - default: - return "", ErrInvalidKeyType - } - - // Create the hasher - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Sign the string and return the encoded bytes - if sigBytes, err := rsa.SignPSS(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil), m.Options); err == nil { - return EncodeSegment(sigBytes), nil - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go b/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go deleted file mode 100644 index 213a90dbbf8d..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go +++ /dev/null @@ -1,69 +0,0 @@ -package jwt - -import ( - "crypto/rsa" - "crypto/x509" - "encoding/pem" - "errors" -) - -var ( - ErrKeyMustBePEMEncoded = errors.New("Invalid Key: Key must be PEM encoded PKCS1 or PKCS8 private key") - ErrNotRSAPrivateKey = errors.New("Key is not a valid RSA private key") - ErrNotRSAPublicKey = errors.New("Key is not a valid RSA public key") -) - -// Parse PEM encoded PKCS1 or PKCS8 private key -func ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - var parsedKey interface{} - if parsedKey, err = x509.ParsePKCS1PrivateKey(block.Bytes); err != nil { - if parsedKey, err = x509.ParsePKCS8PrivateKey(block.Bytes); err != nil { - return nil, err - } - } - - var pkey *rsa.PrivateKey - var ok bool - if pkey, ok = parsedKey.(*rsa.PrivateKey); !ok { - return nil, ErrNotRSAPrivateKey - } - - return pkey, nil -} - -// Parse PEM encoded PKCS1 or PKCS8 public key -func ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - // Parse the key - var parsedKey interface{} - if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil { - if cert, err := x509.ParseCertificate(block.Bytes); err == nil { - parsedKey = cert.PublicKey - } else { - return nil, err - } - } - - var pkey *rsa.PublicKey - var ok bool - if pkey, ok = parsedKey.(*rsa.PublicKey); !ok { - return nil, ErrNotRSAPublicKey - } - - return pkey, nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/signing_method.go b/vendor/github.com/dgrijalva/jwt-go/signing_method.go deleted file mode 100644 index ed1f212b21e1..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/signing_method.go +++ /dev/null @@ -1,35 +0,0 @@ -package jwt - -import ( - "sync" -) - -var signingMethods = map[string]func() SigningMethod{} -var signingMethodLock = new(sync.RWMutex) - -// Implement SigningMethod to add new methods for signing or verifying tokens. -type SigningMethod interface { - Verify(signingString, signature string, key interface{}) error // Returns nil if signature is valid - Sign(signingString string, key interface{}) (string, error) // Returns encoded signature or error - Alg() string // returns the alg identifier for this method (example: 'HS256') -} - -// Register the "alg" name and a factory function for signing method. -// This is typically done during init() in the method's implementation -func RegisterSigningMethod(alg string, f func() SigningMethod) { - signingMethodLock.Lock() - defer signingMethodLock.Unlock() - - signingMethods[alg] = f -} - -// Get a signing method from an "alg" string -func GetSigningMethod(alg string) (method SigningMethod) { - signingMethodLock.RLock() - defer signingMethodLock.RUnlock() - - if methodF, ok := signingMethods[alg]; ok { - method = methodF() - } - return -} diff --git a/vendor/github.com/dgrijalva/jwt-go/token.go b/vendor/github.com/dgrijalva/jwt-go/token.go deleted file mode 100644 index d637e0867c65..000000000000 --- a/vendor/github.com/dgrijalva/jwt-go/token.go +++ /dev/null @@ -1,108 +0,0 @@ -package jwt - -import ( - "encoding/base64" - "encoding/json" - "strings" - "time" -) - -// TimeFunc provides the current time when parsing token to validate "exp" claim (expiration time). -// You can override it to use another time value. This is useful for testing or if your -// server uses a different time zone than your tokens. -var TimeFunc = time.Now - -// Parse methods use this callback function to supply -// the key for verification. The function receives the parsed, -// but unverified Token. This allows you to use properties in the -// Header of the token (such as `kid`) to identify which key to use. -type Keyfunc func(*Token) (interface{}, error) - -// A JWT Token. Different fields will be used depending on whether you're -// creating or parsing/verifying a token. -type Token struct { - Raw string // The raw token. Populated when you Parse a token - Method SigningMethod // The signing method used or to be used - Header map[string]interface{} // The first segment of the token - Claims Claims // The second segment of the token - Signature string // The third segment of the token. Populated when you Parse a token - Valid bool // Is the token valid? Populated when you Parse/Verify a token -} - -// Create a new Token. Takes a signing method -func New(method SigningMethod) *Token { - return NewWithClaims(method, MapClaims{}) -} - -func NewWithClaims(method SigningMethod, claims Claims) *Token { - return &Token{ - Header: map[string]interface{}{ - "typ": "JWT", - "alg": method.Alg(), - }, - Claims: claims, - Method: method, - } -} - -// Get the complete, signed token -func (t *Token) SignedString(key interface{}) (string, error) { - var sig, sstr string - var err error - if sstr, err = t.SigningString(); err != nil { - return "", err - } - if sig, err = t.Method.Sign(sstr, key); err != nil { - return "", err - } - return strings.Join([]string{sstr, sig}, "."), nil -} - -// Generate the signing string. This is the -// most expensive part of the whole deal. Unless you -// need this for something special, just go straight for -// the SignedString. -func (t *Token) SigningString() (string, error) { - var err error - parts := make([]string, 2) - for i, _ := range parts { - var jsonValue []byte - if i == 0 { - if jsonValue, err = json.Marshal(t.Header); err != nil { - return "", err - } - } else { - if jsonValue, err = json.Marshal(t.Claims); err != nil { - return "", err - } - } - - parts[i] = EncodeSegment(jsonValue) - } - return strings.Join(parts, "."), nil -} - -// Parse, validate, and return a token. -// keyFunc will receive the parsed token and should return the key for validating. -// If everything is kosher, err will be nil -func Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { - return new(Parser).Parse(tokenString, keyFunc) -} - -func ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { - return new(Parser).ParseWithClaims(tokenString, claims, keyFunc) -} - -// Encode JWT specific base64url encoding with padding stripped -func EncodeSegment(seg []byte) string { - return strings.TrimRight(base64.URLEncoding.EncodeToString(seg), "=") -} - -// Decode JWT specific base64url encoding with padding stripped -func DecodeSegment(seg string) ([]byte, error) { - if l := len(seg) % 4; l > 0 { - seg += strings.Repeat("=", 4-l) - } - - return base64.URLEncoding.DecodeString(seg) -} diff --git a/vendor/github.com/docker/docker/LICENSE b/vendor/github.com/docker/docker/LICENSE deleted file mode 100644 index 9c8e20ab85c1..000000000000 --- a/vendor/github.com/docker/docker/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ - - Apache License - Version 2.0, January 2004 - https://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 - - Copyright 2013-2017 Docker, Inc. - - 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 - - https://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/docker/docker/NOTICE b/vendor/github.com/docker/docker/NOTICE deleted file mode 100644 index 0c74e15b057f..000000000000 --- a/vendor/github.com/docker/docker/NOTICE +++ /dev/null @@ -1,19 +0,0 @@ -Docker -Copyright 2012-2017 Docker, Inc. - -This product includes software developed at Docker, Inc. (https://www.docker.com). - -This product contains software (https://github.com/kr/pty) developed -by Keith Rarick, licensed under the MIT License. - -The following is courtesy of our legal counsel: - - -Use and transfer of Docker may be subject to certain restrictions by the -United States and other governments. -It is your responsibility to ensure that your use and/or transfer does not -violate applicable laws. - -For more information, please see https://www.bis.doc.gov - -See also https://www.apache.org/dev/crypto.html and/or seek legal counsel. diff --git a/vendor/github.com/docker/docker/pkg/reexec/README.md b/vendor/github.com/docker/docker/pkg/reexec/README.md deleted file mode 100644 index 6658f69b69d7..000000000000 --- a/vendor/github.com/docker/docker/pkg/reexec/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# reexec - -The `reexec` package facilitates the busybox style reexec of the docker binary that we require because -of the forking limitations of using Go. Handlers can be registered with a name and the argv 0 of -the exec of the binary will be used to find and execute custom init paths. diff --git a/vendor/github.com/docker/docker/pkg/reexec/command_linux.go b/vendor/github.com/docker/docker/pkg/reexec/command_linux.go deleted file mode 100644 index efea71794fdf..000000000000 --- a/vendor/github.com/docker/docker/pkg/reexec/command_linux.go +++ /dev/null @@ -1,28 +0,0 @@ -package reexec // import "github.com/docker/docker/pkg/reexec" - -import ( - "os/exec" - "syscall" - - "golang.org/x/sys/unix" -) - -// Self returns the path to the current process's binary. -// Returns "/proc/self/exe". -func Self() string { - return "/proc/self/exe" -} - -// Command returns *exec.Cmd which has Path as current binary. Also it setting -// SysProcAttr.Pdeathsig to SIGTERM. -// This will use the in-memory version (/proc/self/exe) of the current binary, -// it is thus safe to delete or replace the on-disk binary (os.Args[0]). -func Command(args ...string) *exec.Cmd { - return &exec.Cmd{ - Path: Self(), - Args: args, - SysProcAttr: &syscall.SysProcAttr{ - Pdeathsig: unix.SIGTERM, - }, - } -} diff --git a/vendor/github.com/docker/docker/pkg/reexec/command_unix.go b/vendor/github.com/docker/docker/pkg/reexec/command_unix.go deleted file mode 100644 index ceaabbdeee91..000000000000 --- a/vendor/github.com/docker/docker/pkg/reexec/command_unix.go +++ /dev/null @@ -1,23 +0,0 @@ -// +build freebsd darwin - -package reexec // import "github.com/docker/docker/pkg/reexec" - -import ( - "os/exec" -) - -// Self returns the path to the current process's binary. -// Uses os.Args[0]. -func Self() string { - return naiveSelf() -} - -// Command returns *exec.Cmd which has Path as current binary. -// For example if current binary is "docker" at "/usr/bin/", then cmd.Path will -// be set to "/usr/bin/docker". -func Command(args ...string) *exec.Cmd { - return &exec.Cmd{ - Path: Self(), - Args: args, - } -} diff --git a/vendor/github.com/docker/docker/pkg/reexec/command_unsupported.go b/vendor/github.com/docker/docker/pkg/reexec/command_unsupported.go deleted file mode 100644 index e7eed24240c6..000000000000 --- a/vendor/github.com/docker/docker/pkg/reexec/command_unsupported.go +++ /dev/null @@ -1,16 +0,0 @@ -// +build !linux,!windows,!freebsd,!darwin - -package reexec // import "github.com/docker/docker/pkg/reexec" - -import ( - "os/exec" -) - -func Self() string { - return "" -} - -// Command is unsupported on operating systems apart from Linux, Windows, and Darwin. -func Command(args ...string) *exec.Cmd { - return nil -} diff --git a/vendor/github.com/docker/docker/pkg/reexec/command_windows.go b/vendor/github.com/docker/docker/pkg/reexec/command_windows.go deleted file mode 100644 index 438226890f62..000000000000 --- a/vendor/github.com/docker/docker/pkg/reexec/command_windows.go +++ /dev/null @@ -1,21 +0,0 @@ -package reexec // import "github.com/docker/docker/pkg/reexec" - -import ( - "os/exec" -) - -// Self returns the path to the current process's binary. -// Uses os.Args[0]. -func Self() string { - return naiveSelf() -} - -// Command returns *exec.Cmd which has Path as current binary. -// For example if current binary is "docker.exe" at "C:\", then cmd.Path will -// be set to "C:\docker.exe". -func Command(args ...string) *exec.Cmd { - return &exec.Cmd{ - Path: Self(), - Args: args, - } -} diff --git a/vendor/github.com/docker/docker/pkg/reexec/reexec.go b/vendor/github.com/docker/docker/pkg/reexec/reexec.go deleted file mode 100644 index f8ccddd599e8..000000000000 --- a/vendor/github.com/docker/docker/pkg/reexec/reexec.go +++ /dev/null @@ -1,47 +0,0 @@ -package reexec // import "github.com/docker/docker/pkg/reexec" - -import ( - "fmt" - "os" - "os/exec" - "path/filepath" -) - -var registeredInitializers = make(map[string]func()) - -// Register adds an initialization func under the specified name -func Register(name string, initializer func()) { - if _, exists := registeredInitializers[name]; exists { - panic(fmt.Sprintf("reexec func already registered under name %q", name)) - } - - registeredInitializers[name] = initializer -} - -// Init is called as the first part of the exec process and returns true if an -// initialization function was called. -func Init() bool { - initializer, exists := registeredInitializers[os.Args[0]] - if exists { - initializer() - - return true - } - return false -} - -func naiveSelf() string { - name := os.Args[0] - if filepath.Base(name) == name { - if lp, err := exec.LookPath(name); err == nil { - return lp - } - } - // handle conversion of relative paths to absolute - if absName, err := filepath.Abs(name); err == nil { - return absName - } - // if we couldn't get absolute name, return original - // (NOTE: Go only errors on Abs() if os.Getwd fails) - return name -} diff --git a/vendor/github.com/edsrzf/mmap-go/LICENSE b/vendor/github.com/edsrzf/mmap-go/LICENSE deleted file mode 100644 index 8f05f338ac5a..000000000000 --- a/vendor/github.com/edsrzf/mmap-go/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -Copyright (c) 2011, Evan Shaw -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 the copyright holder 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 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/edsrzf/mmap-go/README.md b/vendor/github.com/edsrzf/mmap-go/README.md deleted file mode 100644 index 4cc2bfe1c8ce..000000000000 --- a/vendor/github.com/edsrzf/mmap-go/README.md +++ /dev/null @@ -1,12 +0,0 @@ -mmap-go -======= - -mmap-go is a portable mmap package for the [Go programming language](http://golang.org). -It has been tested on Linux (386, amd64), OS X, and Windows (386). It should also -work on other Unix-like platforms, but hasn't been tested with them. I'm interested -to hear about the results. - -I haven't been able to add more features without adding significant complexity, -so mmap-go doesn't support mprotect, mincore, and maybe a few other things. -If you're running on a Unix-like platform and need some of these features, -I suggest Gustavo Niemeyer's [gommap](http://labix.org/gommap). diff --git a/vendor/github.com/edsrzf/mmap-go/mmap.go b/vendor/github.com/edsrzf/mmap-go/mmap.go deleted file mode 100644 index 7bb4965ed527..000000000000 --- a/vendor/github.com/edsrzf/mmap-go/mmap.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2011 Evan Shaw. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file defines the common package interface and contains a little bit of -// factored out logic. - -// Package mmap allows mapping files into memory. It tries to provide a simple, reasonably portable interface, -// but doesn't go out of its way to abstract away every little platform detail. -// This specifically means: -// * forked processes may or may not inherit mappings -// * a file's timestamp may or may not be updated by writes through mappings -// * specifying a size larger than the file's actual size can increase the file's size -// * If the mapped file is being modified by another process while your program's running, don't expect consistent results between platforms -package mmap - -import ( - "errors" - "os" - "reflect" - "unsafe" -) - -const ( - // RDONLY maps the memory read-only. - // Attempts to write to the MMap object will result in undefined behavior. - RDONLY = 0 - // RDWR maps the memory as read-write. Writes to the MMap object will update the - // underlying file. - RDWR = 1 << iota - // COPY maps the memory as copy-on-write. Writes to the MMap object will affect - // memory, but the underlying file will remain unchanged. - COPY - // If EXEC is set, the mapped memory is marked as executable. - EXEC -) - -const ( - // If the ANON flag is set, the mapped memory will not be backed by a file. - ANON = 1 << iota -) - -// MMap represents a file mapped into memory. -type MMap []byte - -// Map maps an entire file into memory. -// If ANON is set in flags, f is ignored. -func Map(f *os.File, prot, flags int) (MMap, error) { - return MapRegion(f, -1, prot, flags, 0) -} - -// MapRegion maps part of a file into memory. -// The offset parameter must be a multiple of the system's page size. -// If length < 0, the entire file will be mapped. -// If ANON is set in flags, f is ignored. -func MapRegion(f *os.File, length int, prot, flags int, offset int64) (MMap, error) { - var fd uintptr - if flags&ANON == 0 { - fd = uintptr(f.Fd()) - if length < 0 { - fi, err := f.Stat() - if err != nil { - return nil, err - } - length = int(fi.Size()) - } - } else { - if length <= 0 { - return nil, errors.New("anonymous mapping requires non-zero length") - } - fd = ^uintptr(0) - } - return mmap(length, uintptr(prot), uintptr(flags), fd, offset) -} - -func (m *MMap) header() *reflect.SliceHeader { - return (*reflect.SliceHeader)(unsafe.Pointer(m)) -} - -// Lock keeps the mapped region in physical memory, ensuring that it will not be -// swapped out. -func (m MMap) Lock() error { - dh := m.header() - return lock(dh.Data, uintptr(dh.Len)) -} - -// Unlock reverses the effect of Lock, allowing the mapped region to potentially -// be swapped out. -// If m is already unlocked, aan error will result. -func (m MMap) Unlock() error { - dh := m.header() - return unlock(dh.Data, uintptr(dh.Len)) -} - -// Flush synchronizes the mapping's contents to the file's contents on disk. -func (m MMap) Flush() error { - dh := m.header() - return flush(dh.Data, uintptr(dh.Len)) -} - -// Unmap deletes the memory mapped region, flushes any remaining changes, and sets -// m to nil. -// Trying to read or write any remaining references to m after Unmap is called will -// result in undefined behavior. -// Unmap should only be called on the slice value that was originally returned from -// a call to Map. Calling Unmap on a derived slice may cause errors. -func (m *MMap) Unmap() error { - dh := m.header() - err := unmap(dh.Data, uintptr(dh.Len)) - *m = nil - return err -} diff --git a/vendor/github.com/edsrzf/mmap-go/mmap_unix.go b/vendor/github.com/edsrzf/mmap-go/mmap_unix.go deleted file mode 100644 index 4af98420d56c..000000000000 --- a/vendor/github.com/edsrzf/mmap-go/mmap_unix.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2011 Evan Shaw. 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 openbsd solaris netbsd - -package mmap - -import ( - "syscall" -) - -func mmap(len int, inprot, inflags, fd uintptr, off int64) ([]byte, error) { - flags := syscall.MAP_SHARED - prot := syscall.PROT_READ - switch { - case inprot© != 0: - prot |= syscall.PROT_WRITE - flags = syscall.MAP_PRIVATE - case inprot&RDWR != 0: - prot |= syscall.PROT_WRITE - } - if inprot&EXEC != 0 { - prot |= syscall.PROT_EXEC - } - if inflags&ANON != 0 { - flags |= syscall.MAP_ANON - } - - b, err := syscall.Mmap(int(fd), off, len, prot, flags) - if err != nil { - return nil, err - } - return b, nil -} - -func flush(addr, len uintptr) error { - _, _, errno := syscall.Syscall(_SYS_MSYNC, addr, len, _MS_SYNC) - if errno != 0 { - return syscall.Errno(errno) - } - return nil -} - -func lock(addr, len uintptr) error { - _, _, errno := syscall.Syscall(syscall.SYS_MLOCK, addr, len, 0) - if errno != 0 { - return syscall.Errno(errno) - } - return nil -} - -func unlock(addr, len uintptr) error { - _, _, errno := syscall.Syscall(syscall.SYS_MUNLOCK, addr, len, 0) - if errno != 0 { - return syscall.Errno(errno) - } - return nil -} - -func unmap(addr, len uintptr) error { - _, _, errno := syscall.Syscall(syscall.SYS_MUNMAP, addr, len, 0) - if errno != 0 { - return syscall.Errno(errno) - } - return nil -} diff --git a/vendor/github.com/edsrzf/mmap-go/mmap_windows.go b/vendor/github.com/edsrzf/mmap-go/mmap_windows.go deleted file mode 100644 index c3d2d02d3f1b..000000000000 --- a/vendor/github.com/edsrzf/mmap-go/mmap_windows.go +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright 2011 Evan Shaw. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package mmap - -import ( - "errors" - "os" - "sync" - "syscall" -) - -// mmap on Windows is a two-step process. -// First, we call CreateFileMapping to get a handle. -// Then, we call MapviewToFile to get an actual pointer into memory. -// Because we want to emulate a POSIX-style mmap, we don't want to expose -// the handle -- only the pointer. We also want to return only a byte slice, -// not a struct, so it's convenient to manipulate. - -// We keep this map so that we can get back the original handle from the memory address. -var handleLock sync.Mutex -var handleMap = map[uintptr]syscall.Handle{} - -func mmap(len int, prot, flags, hfile uintptr, off int64) ([]byte, error) { - flProtect := uint32(syscall.PAGE_READONLY) - dwDesiredAccess := uint32(syscall.FILE_MAP_READ) - switch { - case prot© != 0: - flProtect = syscall.PAGE_WRITECOPY - dwDesiredAccess = syscall.FILE_MAP_COPY - case prot&RDWR != 0: - flProtect = syscall.PAGE_READWRITE - dwDesiredAccess = syscall.FILE_MAP_WRITE - } - if prot&EXEC != 0 { - flProtect <<= 4 - dwDesiredAccess |= syscall.FILE_MAP_EXECUTE - } - - // The maximum size is the area of the file, starting from 0, - // that we wish to allow to be mappable. It is the sum of - // the length the user requested, plus the offset where that length - // is starting from. This does not map the data into memory. - maxSizeHigh := uint32((off + int64(len)) >> 32) - maxSizeLow := uint32((off + int64(len)) & 0xFFFFFFFF) - // TODO: Do we need to set some security attributes? It might help portability. - h, errno := syscall.CreateFileMapping(syscall.Handle(hfile), nil, flProtect, maxSizeHigh, maxSizeLow, nil) - if h == 0 { - return nil, os.NewSyscallError("CreateFileMapping", errno) - } - - // Actually map a view of the data into memory. The view's size - // is the length the user requested. - fileOffsetHigh := uint32(off >> 32) - fileOffsetLow := uint32(off & 0xFFFFFFFF) - addr, errno := syscall.MapViewOfFile(h, dwDesiredAccess, fileOffsetHigh, fileOffsetLow, uintptr(len)) - if addr == 0 { - return nil, os.NewSyscallError("MapViewOfFile", errno) - } - handleLock.Lock() - handleMap[addr] = h - handleLock.Unlock() - - m := MMap{} - dh := m.header() - dh.Data = addr - dh.Len = len - dh.Cap = dh.Len - - return m, nil -} - -func flush(addr, len uintptr) error { - errno := syscall.FlushViewOfFile(addr, len) - if errno != nil { - return os.NewSyscallError("FlushViewOfFile", errno) - } - - handleLock.Lock() - defer handleLock.Unlock() - handle, ok := handleMap[addr] - if !ok { - // should be impossible; we would've errored above - return errors.New("unknown base address") - } - - errno = syscall.FlushFileBuffers(handle) - return os.NewSyscallError("FlushFileBuffers", errno) -} - -func lock(addr, len uintptr) error { - errno := syscall.VirtualLock(addr, len) - return os.NewSyscallError("VirtualLock", errno) -} - -func unlock(addr, len uintptr) error { - errno := syscall.VirtualUnlock(addr, len) - return os.NewSyscallError("VirtualUnlock", errno) -} - -func unmap(addr, len uintptr) error { - flush(addr, len) - // Lock the UnmapViewOfFile along with the handleMap deletion. - // As soon as we unmap the view, the OS is free to give the - // same addr to another new map. We don't want another goroutine - // to insert and remove the same addr into handleMap while - // we're trying to remove our old addr/handle pair. - handleLock.Lock() - defer handleLock.Unlock() - err := syscall.UnmapViewOfFile(addr) - if err != nil { - return err - } - - handle, ok := handleMap[addr] - if !ok { - // should be impossible; we would've errored above - return errors.New("unknown base address") - } - delete(handleMap, addr) - - e := syscall.CloseHandle(syscall.Handle(handle)) - return os.NewSyscallError("CloseHandle", e) -} diff --git a/vendor/github.com/edsrzf/mmap-go/msync_netbsd.go b/vendor/github.com/edsrzf/mmap-go/msync_netbsd.go deleted file mode 100644 index a64b003e2db4..000000000000 --- a/vendor/github.com/edsrzf/mmap-go/msync_netbsd.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2011 Evan Shaw. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package mmap - -const _SYS_MSYNC = 277 -const _MS_SYNC = 0x04 diff --git a/vendor/github.com/edsrzf/mmap-go/msync_unix.go b/vendor/github.com/edsrzf/mmap-go/msync_unix.go deleted file mode 100644 index 91ee5f40f107..000000000000 --- a/vendor/github.com/edsrzf/mmap-go/msync_unix.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2011 Evan Shaw. 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 openbsd solaris - -package mmap - -import ( - "syscall" -) - -const _SYS_MSYNC = syscall.SYS_MSYNC -const _MS_SYNC = syscall.MS_SYNC diff --git a/vendor/github.com/elastic/gosigar/CHANGELOG.md b/vendor/github.com/elastic/gosigar/CHANGELOG.md deleted file mode 100644 index 45262e7b8dbd..000000000000 --- a/vendor/github.com/elastic/gosigar/CHANGELOG.md +++ /dev/null @@ -1,113 +0,0 @@ -# Change Log -All notable changes to this project will be documented in this file. -This project adheres to [Semantic Versioning](http://semver.org/). - -## [Unreleased] - -### Added - -### Fixed - -- Added missing runtime import for FreeBSD. #104 - -### Changed - -### Deprecated - -## [0.9.0] - -### Added -- Added support for huge TLB pages on Linux #97 -- Added support for big endian platform #100 - -### Fixed -- Add missing method for OpenBSD #99 - -## [0.8.0] - -### Added -- Added partial `getrusage` support for Windows to retrieve system CPU time and user CPU time. #95 -- Added full `getrusage` support for Unix. #95 - -## [0.7.0] - -### Added -- Added method stubs for process handling for operating system that are not supported - by gosigar. All methods return `ErrNotImplemented` on such systems. #88 - -### Fixed -- Fix freebsd build by using the common version of Get(pid). #91 - -### Changed -- Fixed issues in cgroup package by adding missing error checks and closing - file handles. #92 - -## [0.6.0] - -### Added -- Added method stubs to enable compilation for operating systems that are not - supported by gosigar. All methods return `ErrNotImplemented` on these unsupported - operating systems. #83 -- FreeBSD returns `ErrNotImplemented` for `ProcTime.Get`. #83 - -### Changed -- OpenBSD returns `ErrNotImplemented` for `ProcTime.Get` instead of `nil`. #83 -- Fixed incorrect `Mem.Used` calculation under linux. #82 -- Fixed `ProcState` on Linux and FreeBSD when process names contain parentheses. #81 - -### Removed -- Remove NetBSD build from sigar_unix.go as it is not supported by gosigar. #83 - -## [0.5.0] - -### Changed -- Fixed Trim environment variables when comparing values in the test suite. #79 -- Make `kern_procargs` more robust under darwin when we cannot retrieve - all the information about a process. #78 - -## [0.4.0] - -### Changed -- Fixed Windows issue that caused a hang during `init()` if WMI wasn't ready. #74 - -## [0.3.0] - -### Added -- Read `MemAvailable` value for kernel 3.14+ #71 - -## [0.2.0] - -### Added -- Added `ErrCgroupsMissing` to indicate that /proc/cgroups is missing which is - an indicator that cgroups were disabled at compile time. #64 - -### Changed -- Changed `cgroup.SupportedSubsystems()` to honor the "enabled" column in the - /proc/cgroups file. #64 - -## [0.1.0] - -### Added -- Added `CpuList` implementation for Windows that returns CPU timing information - on a per CPU basis. #55 -- Added `Uptime` implementation for Windows. #55 -- Added `Swap` implementation for Windows based on page file metrics. #55 -- Added support to `github.com/gosigar/sys/windows` for querying and enabling - privileges in a process token. -- Added utility code for interfacing with linux NETLINK_INET_DIAG. #60 -- Added `ProcEnv` for getting a process's environment variables. #61 - -### Changed -- Changed several `OpenProcess` calls on Windows to request the lowest possible - access privileges. #50 -- Removed cgo usage from Windows code. -- Added OS version checks to `ProcArgs.Get` on Windows because the - `Win32_Process` WMI query is not available prior to Windows vista. On XP and - Windows 2003, this method returns `ErrNotImplemented`. #55 - -### Fixed -- Fixed value of `Mem.ActualFree` and `Mem.ActualUsed` on Windows. #49 -- Fixed `ProcTime.StartTime` on Windows to report value in milliseconds since - Unix epoch. #51 -- Fixed `ProcStatus.PPID` value is wrong on Windows. #55 -- Fixed `ProcStatus.Username` error on Windows XP #56 diff --git a/vendor/github.com/elastic/gosigar/LICENSE b/vendor/github.com/elastic/gosigar/LICENSE deleted file mode 100644 index 11069edd7901..000000000000 --- a/vendor/github.com/elastic/gosigar/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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/elastic/gosigar/NOTICE b/vendor/github.com/elastic/gosigar/NOTICE deleted file mode 100644 index fda553b5c384..000000000000 --- a/vendor/github.com/elastic/gosigar/NOTICE +++ /dev/null @@ -1,9 +0,0 @@ -Copyright (c) [2009-2011] VMware, Inc. All Rights Reserved. - -This product is licensed to you under the Apache License, Version 2.0 (the "License"). -You may not use this product except in compliance with the License. - -This product includes a number of subcomponents with -separate copyright notices and license terms. Your use of these -subcomponents is subject to the terms and conditions of the -subcomponent's license, as noted in the LICENSE file. \ No newline at end of file diff --git a/vendor/github.com/elastic/gosigar/README.md b/vendor/github.com/elastic/gosigar/README.md deleted file mode 100644 index ecdfc1c3c56a..000000000000 --- a/vendor/github.com/elastic/gosigar/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Go sigar [![Build Status](https://travis-ci.org/elastic/gosigar.svg?branch=master)](https://travis-ci.org/elastic/gosigar) [![Build status](https://ci.appveyor.com/api/projects/status/4yh6sa7u97ek5uib/branch/master?svg=true)](https://ci.appveyor.com/project/elastic-beats/gosigar/branch/master) - - -## Overview - -Go sigar is a golang implementation of the -[sigar API](https://github.com/hyperic/sigar). The Go version of -sigar has a very similar interface, but is being written from scratch -in pure go/cgo, rather than cgo bindings for libsigar. - -## Test drive - - $ go get github.com/elastic/gosigar - $ cd $GOPATH/src/github.com/elastic/gosigar/examples/ps - $ go build - $ ./ps - -## Supported platforms - -The features vary by operating system. - -| Feature | Linux | Darwin | Windows | OpenBSD | FreeBSD | -|-----------------|:-----:|:------:|:-------:|:-------:|:-------:| -| Cpu | X | X | X | X | X | -| CpuList | X | X | | X | X | -| FDUsage | X | | | | X | -| FileSystemList | X | X | X | X | X | -| FileSystemUsage | X | X | X | X | X | -| HugeTLBPages | X | | | | | -| LoadAverage | X | X | | X | X | -| Mem | X | X | X | X | X | -| ProcArgs | X | X | X | | X | -| ProcEnv | X | X | | | X | -| ProcExe | X | X | | | X | -| ProcFDUsage | X | | | | X | -| ProcList | X | X | X | | X | -| ProcMem | X | X | X | | X | -| ProcState | X | X | X | | X | -| ProcTime | X | X | X | | X | -| Swap | X | X | | X | X | -| Uptime | X | X | | X | X | - -## OS Specific Notes - -### FreeBSD - -Mount both `linprocfs` and `procfs` for compatability. Consider adding these -mounts to your `/etc/fstab` file so they are mounted automatically at boot. - -``` -sudo mount -t procfs proc /proc -sudo mkdir -p /compat/linux/proc -sudo mount -t linprocfs /dev/null /compat/linux/proc -``` - -## License - -Apache 2.0 diff --git a/vendor/github.com/elastic/gosigar/Vagrantfile b/vendor/github.com/elastic/gosigar/Vagrantfile deleted file mode 100644 index 6fd990c14166..000000000000 --- a/vendor/github.com/elastic/gosigar/Vagrantfile +++ /dev/null @@ -1,25 +0,0 @@ -# Vagrantfile API/syntax version. Don't touch unless you know what you're doing! -VAGRANTFILE_API_VERSION = "2" - -Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| - config.vm.box = "hashicorp/precise64" - config.vm.provision "shell", inline: "mkdir -p /home/vagrant/go" - config.vm.synced_folder ".", "/home/vagrant/go/src/github.com/cloudfoundry/gosigar" - config.vm.provision "shell", inline: "chown -R vagrant:vagrant /home/vagrant/go" - install_go = <<-BASH - set -e - -if [ ! -d "/usr/local/go" ]; then - cd /tmp && wget https://storage.googleapis.com/golang/go1.3.3.linux-amd64.tar.gz - cd /usr/local - tar xvzf /tmp/go1.3.3.linux-amd64.tar.gz - echo 'export GOPATH=/home/vagrant/go; export PATH=/usr/local/go/bin:$PATH:$GOPATH/bin' >> /home/vagrant/.bashrc -fi -export GOPATH=/home/vagrant/go -export PATH=/usr/local/go/bin:$PATH:$GOPATH/bin -/usr/local/go/bin/go get -u github.com/onsi/ginkgo/ginkgo -/usr/local/go/bin/go get -u github.com/onsi/gomega; -BASH - config.vm.provision "shell", inline: 'apt-get install -y git-core' - config.vm.provision "shell", inline: install_go -end diff --git a/vendor/github.com/elastic/gosigar/codecov.yml b/vendor/github.com/elastic/gosigar/codecov.yml deleted file mode 100644 index 76ade0fdb0e9..000000000000 --- a/vendor/github.com/elastic/gosigar/codecov.yml +++ /dev/null @@ -1,21 +0,0 @@ -# Enable coverage report message for diff on commit -coverage: - status: - project: off - patch: - default: - # basic - target: auto - threshold: null - base: auto - # advanced - branches: null - if_no_uploads: error - if_not_found: success - if_ci_failed: error - only_pulls: false - flags: null - paths: null - -# Disable comments on Pull Requests -comment: false diff --git a/vendor/github.com/elastic/gosigar/concrete_sigar.go b/vendor/github.com/elastic/gosigar/concrete_sigar.go deleted file mode 100644 index e3ee80a980b9..000000000000 --- a/vendor/github.com/elastic/gosigar/concrete_sigar.go +++ /dev/null @@ -1,89 +0,0 @@ -package gosigar - -import ( - "time" -) - -type ConcreteSigar struct{} - -func (c *ConcreteSigar) CollectCpuStats(collectionInterval time.Duration) (<-chan Cpu, chan<- struct{}) { - // samplesCh is buffered to 1 value to immediately return first CPU sample - samplesCh := make(chan Cpu, 1) - - stopCh := make(chan struct{}) - - go func() { - var cpuUsage Cpu - - // Immediately provide non-delta value. - // samplesCh is buffered to 1 value, so it will not block. - cpuUsage.Get() - samplesCh <- cpuUsage - - ticker := time.NewTicker(collectionInterval) - - for { - select { - case <-ticker.C: - previousCpuUsage := cpuUsage - - cpuUsage.Get() - - select { - case samplesCh <- cpuUsage.Delta(previousCpuUsage): - default: - // Include default to avoid channel blocking - } - - case <-stopCh: - return - } - } - }() - - return samplesCh, stopCh -} - -func (c *ConcreteSigar) GetLoadAverage() (LoadAverage, error) { - l := LoadAverage{} - err := l.Get() - return l, err -} - -func (c *ConcreteSigar) GetMem() (Mem, error) { - m := Mem{} - err := m.Get() - return m, err -} - -func (c *ConcreteSigar) GetSwap() (Swap, error) { - s := Swap{} - err := s.Get() - return s, err -} - -func (c *ConcreteSigar) GetHugeTLBPages() (HugeTLBPages, error) { - p := HugeTLBPages{} - err := p.Get() - return p, err -} - -func (c *ConcreteSigar) GetFileSystemUsage(path string) (FileSystemUsage, error) { - f := FileSystemUsage{} - err := f.Get(path) - return f, err -} - -func (c *ConcreteSigar) GetFDUsage() (FDUsage, error) { - fd := FDUsage{} - err := fd.Get() - return fd, err -} - -// GetRusage return the resource usage of the process -// Possible params: 0 = RUSAGE_SELF, 1 = RUSAGE_CHILDREN, 2 = RUSAGE_THREAD -func (c *ConcreteSigar) GetRusage(who int) (Rusage, error) { - r := Rusage{} - err := r.Get(who) - return r, err -} diff --git a/vendor/github.com/elastic/gosigar/sigar_darwin.go b/vendor/github.com/elastic/gosigar/sigar_darwin.go deleted file mode 100644 index a90b998c2ef6..000000000000 --- a/vendor/github.com/elastic/gosigar/sigar_darwin.go +++ /dev/null @@ -1,498 +0,0 @@ -// Copyright (c) 2012 VMware, Inc. - -package gosigar - -/* -#include -#include -#include -#include -#include -#include -#include -#include -#include -*/ -import "C" - -import ( - "bytes" - "encoding/binary" - "fmt" - "io" - "os/user" - "runtime" - "strconv" - "syscall" - "time" - "unsafe" -) - -func (self *LoadAverage) Get() error { - avg := []C.double{0, 0, 0} - - C.getloadavg(&avg[0], C.int(len(avg))) - - self.One = float64(avg[0]) - self.Five = float64(avg[1]) - self.Fifteen = float64(avg[2]) - - return nil -} - -func (self *Uptime) Get() error { - tv := syscall.Timeval32{} - - if err := sysctlbyname("kern.boottime", &tv); err != nil { - return err - } - - self.Length = time.Since(time.Unix(int64(tv.Sec), int64(tv.Usec)*1000)).Seconds() - - return nil -} - -func (self *Mem) Get() error { - var vmstat C.vm_statistics_data_t - - if err := sysctlbyname("hw.memsize", &self.Total); err != nil { - return err - } - - if err := vm_info(&vmstat); err != nil { - return err - } - - kern := uint64(vmstat.inactive_count) << 12 - self.Free = uint64(vmstat.free_count) << 12 - - self.Used = self.Total - self.Free - self.ActualFree = self.Free + kern - self.ActualUsed = self.Used - kern - - return nil -} - -type xsw_usage struct { - Total, Avail, Used uint64 -} - -func (self *Swap) Get() error { - sw_usage := xsw_usage{} - - if err := sysctlbyname("vm.swapusage", &sw_usage); err != nil { - return err - } - - self.Total = sw_usage.Total - self.Used = sw_usage.Used - self.Free = sw_usage.Avail - - return nil -} - -func (self *HugeTLBPages) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *Cpu) Get() error { - var count C.mach_msg_type_number_t = C.HOST_CPU_LOAD_INFO_COUNT - var cpuload C.host_cpu_load_info_data_t - - status := C.host_statistics(C.host_t(C.mach_host_self()), - C.HOST_CPU_LOAD_INFO, - C.host_info_t(unsafe.Pointer(&cpuload)), - &count) - - if status != C.KERN_SUCCESS { - return fmt.Errorf("host_statistics error=%d", status) - } - - self.User = uint64(cpuload.cpu_ticks[C.CPU_STATE_USER]) - self.Sys = uint64(cpuload.cpu_ticks[C.CPU_STATE_SYSTEM]) - self.Idle = uint64(cpuload.cpu_ticks[C.CPU_STATE_IDLE]) - self.Nice = uint64(cpuload.cpu_ticks[C.CPU_STATE_NICE]) - - return nil -} - -func (self *CpuList) Get() error { - var count C.mach_msg_type_number_t - var cpuload *C.processor_cpu_load_info_data_t - var ncpu C.natural_t - - status := C.host_processor_info(C.host_t(C.mach_host_self()), - C.PROCESSOR_CPU_LOAD_INFO, - &ncpu, - (*C.processor_info_array_t)(unsafe.Pointer(&cpuload)), - &count) - - if status != C.KERN_SUCCESS { - return fmt.Errorf("host_processor_info error=%d", status) - } - - // jump through some cgo casting hoops and ensure we properly free - // the memory that cpuload points to - target := C.vm_map_t(C.mach_task_self_) - address := C.vm_address_t(uintptr(unsafe.Pointer(cpuload))) - defer C.vm_deallocate(target, address, C.vm_size_t(ncpu)) - - // the body of struct processor_cpu_load_info - // aka processor_cpu_load_info_data_t - var cpu_ticks [C.CPU_STATE_MAX]uint32 - - // copy the cpuload array to a []byte buffer - // where we can binary.Read the data - size := int(ncpu) * binary.Size(cpu_ticks) - buf := C.GoBytes(unsafe.Pointer(cpuload), C.int(size)) - - bbuf := bytes.NewBuffer(buf) - - self.List = make([]Cpu, 0, ncpu) - - for i := 0; i < int(ncpu); i++ { - cpu := Cpu{} - - err := binary.Read(bbuf, binary.LittleEndian, &cpu_ticks) - if err != nil { - return err - } - - cpu.User = uint64(cpu_ticks[C.CPU_STATE_USER]) - cpu.Sys = uint64(cpu_ticks[C.CPU_STATE_SYSTEM]) - cpu.Idle = uint64(cpu_ticks[C.CPU_STATE_IDLE]) - cpu.Nice = uint64(cpu_ticks[C.CPU_STATE_NICE]) - - self.List = append(self.List, cpu) - } - - return nil -} - -func (self *FDUsage) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *FileSystemList) Get() error { - num, err := syscall.Getfsstat(nil, C.MNT_NOWAIT) - if err != nil { - return err - } - - buf := make([]syscall.Statfs_t, num) - - _, err = syscall.Getfsstat(buf, C.MNT_NOWAIT) - if err != nil { - return err - } - - fslist := make([]FileSystem, 0, num) - - for i := 0; i < num; i++ { - fs := FileSystem{} - - fs.DirName = bytePtrToString(&buf[i].Mntonname[0]) - fs.DevName = bytePtrToString(&buf[i].Mntfromname[0]) - fs.SysTypeName = bytePtrToString(&buf[i].Fstypename[0]) - - fslist = append(fslist, fs) - } - - self.List = fslist - - return err -} - -func (self *ProcList) Get() error { - n := C.proc_listpids(C.PROC_ALL_PIDS, 0, nil, 0) - if n <= 0 { - return syscall.EINVAL - } - buf := make([]byte, n) - n = C.proc_listpids(C.PROC_ALL_PIDS, 0, unsafe.Pointer(&buf[0]), n) - if n <= 0 { - return syscall.ENOMEM - } - - var pid int32 - num := int(n) / binary.Size(pid) - list := make([]int, 0, num) - bbuf := bytes.NewBuffer(buf) - - for i := 0; i < num; i++ { - if err := binary.Read(bbuf, binary.LittleEndian, &pid); err != nil { - return err - } - if pid == 0 { - continue - } - - list = append(list, int(pid)) - } - - self.List = list - - return nil -} - -func (self *ProcState) Get(pid int) error { - info := C.struct_proc_taskallinfo{} - - if err := task_info(pid, &info); err != nil { - return err - } - - self.Name = C.GoString(&info.pbsd.pbi_comm[0]) - - switch info.pbsd.pbi_status { - case C.SIDL: - self.State = RunStateIdle - case C.SRUN: - self.State = RunStateRun - case C.SSLEEP: - self.State = RunStateSleep - case C.SSTOP: - self.State = RunStateStop - case C.SZOMB: - self.State = RunStateZombie - default: - self.State = RunStateUnknown - } - - self.Ppid = int(info.pbsd.pbi_ppid) - - self.Pgid = int(info.pbsd.pbi_pgid) - - self.Tty = int(info.pbsd.e_tdev) - - self.Priority = int(info.ptinfo.pti_priority) - - self.Nice = int(info.pbsd.pbi_nice) - - // Get process username. Fallback to UID if username is not available. - uid := strconv.Itoa(int(info.pbsd.pbi_uid)) - user, err := user.LookupId(uid) - if err == nil && user.Username != "" { - self.Username = user.Username - } else { - self.Username = uid - } - - return nil -} - -func (self *ProcMem) Get(pid int) error { - info := C.struct_proc_taskallinfo{} - - if err := task_info(pid, &info); err != nil { - return err - } - - self.Size = uint64(info.ptinfo.pti_virtual_size) - self.Resident = uint64(info.ptinfo.pti_resident_size) - self.PageFaults = uint64(info.ptinfo.pti_faults) - - return nil -} - -func (self *ProcTime) Get(pid int) error { - info := C.struct_proc_taskallinfo{} - - if err := task_info(pid, &info); err != nil { - return err - } - - self.User = - uint64(info.ptinfo.pti_total_user) / uint64(time.Millisecond) - - self.Sys = - uint64(info.ptinfo.pti_total_system) / uint64(time.Millisecond) - - self.Total = self.User + self.Sys - - self.StartTime = (uint64(info.pbsd.pbi_start_tvsec) * 1000) + - (uint64(info.pbsd.pbi_start_tvusec) / 1000) - - return nil -} - -func (self *ProcArgs) Get(pid int) error { - var args []string - - argv := func(arg string) { - args = append(args, arg) - } - - err := kern_procargs(pid, nil, argv, nil) - - self.List = args - - return err -} - -func (self *ProcEnv) Get(pid int) error { - if self.Vars == nil { - self.Vars = map[string]string{} - } - - env := func(k, v string) { - self.Vars[k] = v - } - - return kern_procargs(pid, nil, nil, env) -} - -func (self *ProcExe) Get(pid int) error { - exe := func(arg string) { - self.Name = arg - } - - return kern_procargs(pid, exe, nil, nil) -} - -func (self *ProcFDUsage) Get(pid int) error { - return ErrNotImplemented{runtime.GOOS} -} - -// wrapper around sysctl KERN_PROCARGS2 -// callbacks params are optional, -// up to the caller as to which pieces of data they want -func kern_procargs(pid int, - exe func(string), - argv func(string), - env func(string, string)) error { - - mib := []C.int{C.CTL_KERN, C.KERN_PROCARGS2, C.int(pid)} - argmax := uintptr(C.ARG_MAX) - buf := make([]byte, argmax) - err := sysctl(mib, &buf[0], &argmax, nil, 0) - if err != nil { - return nil - } - - bbuf := bytes.NewBuffer(buf) - bbuf.Truncate(int(argmax)) - - var argc int32 - binary.Read(bbuf, binary.LittleEndian, &argc) - - path, err := bbuf.ReadBytes(0) - if err != nil { - return fmt.Errorf("Error reading the argv[0]: %v", err) - } - if exe != nil { - exe(string(chop(path))) - } - - // skip trailing \0's - for { - c, err := bbuf.ReadByte() - if err != nil { - return fmt.Errorf("Error skipping nils: %v", err) - } - if c != 0 { - bbuf.UnreadByte() - break // start of argv[0] - } - } - - for i := 0; i < int(argc); i++ { - arg, err := bbuf.ReadBytes(0) - if err == io.EOF { - break - } - if err != nil { - return fmt.Errorf("Error reading args: %v", err) - } - if argv != nil { - argv(string(chop(arg))) - } - } - - if env == nil { - return nil - } - - delim := []byte{61} // "=" - - for { - line, err := bbuf.ReadBytes(0) - if err == io.EOF || line[0] == 0 { - break - } - if err != nil { - return fmt.Errorf("Error reading args: %v", err) - } - pair := bytes.SplitN(chop(line), delim, 2) - - if len(pair) != 2 { - return fmt.Errorf("Error reading process information for PID: %d", pid) - } - - env(string(pair[0]), string(pair[1])) - } - - return nil -} - -// XXX copied from zsyscall_darwin_amd64.go -func sysctl(mib []C.int, old *byte, oldlen *uintptr, - new *byte, newlen uintptr) (err error) { - var p0 unsafe.Pointer - p0 = unsafe.Pointer(&mib[0]) - _, _, e1 := syscall.Syscall6(syscall.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 = e1 - } - return -} - -func vm_info(vmstat *C.vm_statistics_data_t) error { - var count C.mach_msg_type_number_t = C.HOST_VM_INFO_COUNT - - status := C.host_statistics( - C.host_t(C.mach_host_self()), - C.HOST_VM_INFO, - C.host_info_t(unsafe.Pointer(vmstat)), - &count) - - if status != C.KERN_SUCCESS { - return fmt.Errorf("host_statistics=%d", status) - } - - return nil -} - -// generic Sysctl buffer unmarshalling -func sysctlbyname(name string, data interface{}) (err error) { - val, err := syscall.Sysctl(name) - if err != nil { - return err - } - - buf := []byte(val) - - switch v := data.(type) { - case *uint64: - *v = *(*uint64)(unsafe.Pointer(&buf[0])) - return - } - - bbuf := bytes.NewBuffer([]byte(val)) - return binary.Read(bbuf, binary.LittleEndian, data) -} - -func task_info(pid int, info *C.struct_proc_taskallinfo) error { - size := C.int(unsafe.Sizeof(*info)) - ptr := unsafe.Pointer(info) - - n := C.proc_pidinfo(C.int(pid), C.PROC_PIDTASKALLINFO, 0, ptr, size) - if n != size { - return fmt.Errorf("Could not read process info for pid %d", pid) - } - - return nil -} diff --git a/vendor/github.com/elastic/gosigar/sigar_format.go b/vendor/github.com/elastic/gosigar/sigar_format.go deleted file mode 100644 index ac56c9873c52..000000000000 --- a/vendor/github.com/elastic/gosigar/sigar_format.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (c) 2012 VMware, Inc. - -package gosigar - -import ( - "bufio" - "bytes" - "fmt" - "strconv" - "time" -) - -// Go version of apr_strfsize -func FormatSize(size uint64) string { - ord := []string{"K", "M", "G", "T", "P", "E"} - o := 0 - buf := new(bytes.Buffer) - w := bufio.NewWriter(buf) - - if size < 973 { - fmt.Fprintf(w, "%3d ", size) - w.Flush() - return buf.String() - } - - for { - remain := size & 1023 - size >>= 10 - - if size >= 973 { - o++ - continue - } - - if size < 9 || (size == 9 && remain < 973) { - remain = ((remain * 5) + 256) / 512 - if remain >= 10 { - size++ - remain = 0 - } - - fmt.Fprintf(w, "%d.%d%s", size, remain, ord[o]) - break - } - - if remain >= 512 { - size++ - } - - fmt.Fprintf(w, "%3d%s", size, ord[o]) - break - } - - w.Flush() - return buf.String() -} - -func FormatPercent(percent float64) string { - return strconv.FormatFloat(percent, 'f', -1, 64) + "%" -} - -func (self *FileSystemUsage) UsePercent() float64 { - b_used := (self.Total - self.Free) / 1024 - b_avail := self.Avail / 1024 - utotal := b_used + b_avail - used := b_used - - if utotal != 0 { - u100 := used * 100 - pct := u100 / utotal - if u100%utotal != 0 { - pct += 1 - } - return (float64(pct) / float64(100)) * 100.0 - } - - return 0.0 -} - -func (self *Uptime) Format() string { - buf := new(bytes.Buffer) - w := bufio.NewWriter(buf) - uptime := uint64(self.Length) - - days := uptime / (60 * 60 * 24) - - if days != 0 { - s := "" - if days > 1 { - s = "s" - } - fmt.Fprintf(w, "%d day%s, ", days, s) - } - - minutes := uptime / 60 - hours := minutes / 60 - hours %= 24 - minutes %= 60 - - fmt.Fprintf(w, "%2d:%02d", hours, minutes) - - w.Flush() - return buf.String() -} - -func (self *ProcTime) FormatStartTime() string { - if self.StartTime == 0 { - return "00:00" - } - start := time.Unix(int64(self.StartTime)/1000, 0) - format := "Jan02" - if time.Since(start).Seconds() < (60 * 60 * 24) { - format = "15:04" - } - return start.Format(format) -} - -func (self *ProcTime) FormatTotal() string { - t := self.Total / 1000 - ss := t % 60 - t /= 60 - mm := t % 60 - t /= 60 - hh := t % 24 - return fmt.Sprintf("%02d:%02d:%02d", hh, mm, ss) -} diff --git a/vendor/github.com/elastic/gosigar/sigar_freebsd.go b/vendor/github.com/elastic/gosigar/sigar_freebsd.go deleted file mode 100644 index 9b2af639b6d2..000000000000 --- a/vendor/github.com/elastic/gosigar/sigar_freebsd.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copied and modified from sigar_linux.go. - -package gosigar - -import ( - "io/ioutil" - "runtime" - "strconv" - "strings" - "unsafe" -) - -/* -#include -#include -#include -#include -#include -#include -#include -#include -#include -*/ -import "C" - -func init() { - system.ticks = uint64(C.sysconf(C._SC_CLK_TCK)) - - Procd = "/compat/linux/proc" - - getLinuxBootTime() -} - -func getMountTableFileName() string { - return Procd + "/mtab" -} - -func (self *Uptime) Get() error { - ts := C.struct_timespec{} - - if _, err := C.clock_gettime(C.CLOCK_UPTIME, &ts); err != nil { - return err - } - - self.Length = float64(ts.tv_sec) + 1e-9*float64(ts.tv_nsec) - - return nil -} - -func (self *FDUsage) Get() error { - val := C.uint32_t(0) - sc := C.size_t(4) - - name := C.CString("kern.openfiles") - _, err := C.sysctlbyname(name, unsafe.Pointer(&val), &sc, nil, 0) - C.free(unsafe.Pointer(name)) - if err != nil { - return err - } - self.Open = uint64(val) - - name = C.CString("kern.maxfiles") - _, err = C.sysctlbyname(name, unsafe.Pointer(&val), &sc, nil, 0) - C.free(unsafe.Pointer(name)) - if err != nil { - return err - } - self.Max = uint64(val) - - self.Unused = self.Max - self.Open - - return nil -} - -func (self *ProcFDUsage) Get(pid int) error { - err := readFile("/proc/"+strconv.Itoa(pid)+"/rlimit", func(line string) bool { - if strings.HasPrefix(line, "nofile") { - fields := strings.Fields(line) - if len(fields) == 3 { - self.SoftLimit, _ = strconv.ParseUint(fields[1], 10, 64) - self.HardLimit, _ = strconv.ParseUint(fields[2], 10, 64) - } - return false - } - return true - }) - if err != nil { - return err - } - - // linprocfs only provides this information for this process (self). - fds, err := ioutil.ReadDir(procFileName(pid, "fd")) - if err != nil { - return err - } - self.Open = uint64(len(fds)) - - return nil -} - -func (self *HugeTLBPages) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func parseCpuStat(self *Cpu, line string) error { - fields := strings.Fields(line) - - self.User, _ = strtoull(fields[1]) - self.Nice, _ = strtoull(fields[2]) - self.Sys, _ = strtoull(fields[3]) - self.Idle, _ = strtoull(fields[4]) - return nil -} diff --git a/vendor/github.com/elastic/gosigar/sigar_interface.go b/vendor/github.com/elastic/gosigar/sigar_interface.go deleted file mode 100644 index df79ae08d2e8..000000000000 --- a/vendor/github.com/elastic/gosigar/sigar_interface.go +++ /dev/null @@ -1,207 +0,0 @@ -package gosigar - -import ( - "time" -) - -type ErrNotImplemented struct { - OS string -} - -func (e ErrNotImplemented) Error() string { - return "not implemented on " + e.OS -} - -func IsNotImplemented(err error) bool { - switch err.(type) { - case ErrNotImplemented, *ErrNotImplemented: - return true - default: - return false - } -} - -type Sigar interface { - CollectCpuStats(collectionInterval time.Duration) (<-chan Cpu, chan<- struct{}) - GetLoadAverage() (LoadAverage, error) - GetMem() (Mem, error) - GetSwap() (Swap, error) - GetHugeTLBPages(HugeTLBPages, error) - GetFileSystemUsage(string) (FileSystemUsage, error) - GetFDUsage() (FDUsage, error) - GetRusage(who int) (Rusage, error) -} - -type Cpu struct { - User uint64 - Nice uint64 - Sys uint64 - Idle uint64 - Wait uint64 - Irq uint64 - SoftIrq uint64 - Stolen uint64 -} - -func (cpu *Cpu) Total() uint64 { - return cpu.User + cpu.Nice + cpu.Sys + cpu.Idle + - cpu.Wait + cpu.Irq + cpu.SoftIrq + cpu.Stolen -} - -func (cpu Cpu) Delta(other Cpu) Cpu { - return Cpu{ - User: cpu.User - other.User, - Nice: cpu.Nice - other.Nice, - Sys: cpu.Sys - other.Sys, - Idle: cpu.Idle - other.Idle, - Wait: cpu.Wait - other.Wait, - Irq: cpu.Irq - other.Irq, - SoftIrq: cpu.SoftIrq - other.SoftIrq, - Stolen: cpu.Stolen - other.Stolen, - } -} - -type LoadAverage struct { - One, Five, Fifteen float64 -} - -type Uptime struct { - Length float64 -} - -type Mem struct { - Total uint64 - Used uint64 - Free uint64 - ActualFree uint64 - ActualUsed uint64 -} - -type Swap struct { - Total uint64 - Used uint64 - Free uint64 -} - -type HugeTLBPages struct { - Total uint64 - Free uint64 - Reserved uint64 - Surplus uint64 - DefaultSize uint64 - TotalAllocatedSize uint64 -} - -type CpuList struct { - List []Cpu -} - -type FDUsage struct { - Open uint64 - Unused uint64 - Max uint64 -} - -type FileSystem struct { - DirName string - DevName string - TypeName string - SysTypeName string - Options string - Flags uint32 -} - -type FileSystemList struct { - List []FileSystem -} - -type FileSystemUsage struct { - Total uint64 - Used uint64 - Free uint64 - Avail uint64 - Files uint64 - FreeFiles uint64 -} - -type ProcList struct { - List []int -} - -type RunState byte - -const ( - RunStateSleep = 'S' - RunStateRun = 'R' - RunStateStop = 'T' - RunStateZombie = 'Z' - RunStateIdle = 'D' - RunStateUnknown = '?' -) - -type ProcState struct { - Name string - Username string - State RunState - Ppid int - Pgid int - Tty int - Priority int - Nice int - Processor int -} - -type ProcMem struct { - Size uint64 - Resident uint64 - Share uint64 - MinorFaults uint64 - MajorFaults uint64 - PageFaults uint64 -} - -type ProcTime struct { - StartTime uint64 - User uint64 - Sys uint64 - Total uint64 -} - -type ProcArgs struct { - List []string -} - -type ProcEnv struct { - Vars map[string]string -} - -type ProcExe struct { - Name string - Cwd string - Root string -} - -type ProcFDUsage struct { - Open uint64 - SoftLimit uint64 - HardLimit uint64 -} - -type Rusage struct { - Utime time.Duration - Stime time.Duration - Maxrss int64 - Ixrss int64 - Idrss int64 - Isrss int64 - Minflt int64 - Majflt int64 - Nswap int64 - Inblock int64 - Oublock int64 - Msgsnd int64 - Msgrcv int64 - Nsignals int64 - Nvcsw int64 - Nivcsw int64 -} diff --git a/vendor/github.com/elastic/gosigar/sigar_linux.go b/vendor/github.com/elastic/gosigar/sigar_linux.go deleted file mode 100644 index 09f2e30b2f03..000000000000 --- a/vendor/github.com/elastic/gosigar/sigar_linux.go +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (c) 2012 VMware, Inc. - -package gosigar - -import ( - "io/ioutil" - "strconv" - "strings" - "syscall" -) - -func init() { - system.ticks = 100 // C.sysconf(C._SC_CLK_TCK) - - Procd = "/proc" - - getLinuxBootTime() -} - -func getMountTableFileName() string { - return "/etc/mtab" -} - -func (self *Uptime) Get() error { - sysinfo := syscall.Sysinfo_t{} - - if err := syscall.Sysinfo(&sysinfo); err != nil { - return err - } - - self.Length = float64(sysinfo.Uptime) - - return nil -} - -func (self *FDUsage) Get() error { - return readFile(Procd+"/sys/fs/file-nr", func(line string) bool { - fields := strings.Fields(line) - if len(fields) == 3 { - self.Open, _ = strconv.ParseUint(fields[0], 10, 64) - self.Unused, _ = strconv.ParseUint(fields[1], 10, 64) - self.Max, _ = strconv.ParseUint(fields[2], 10, 64) - } - return false - }) -} - -func (self *HugeTLBPages) Get() error { - table, err := parseMeminfo() - if err != nil { - return err - } - - self.Total, _ = table["HugePages_Total"] - self.Free, _ = table["HugePages_Free"] - self.Reserved, _ = table["HugePages_Rsvd"] - self.Surplus, _ = table["HugePages_Surp"] - self.DefaultSize, _ = table["Hugepagesize"] - - if totalSize, found := table["Hugetlb"]; found { - self.TotalAllocatedSize = totalSize - } else { - // If Hugetlb is not present, or huge pages of different sizes - // are used, this figure can be unaccurate. - // TODO (jsoriano): Extract information from /sys/kernel/mm/hugepages too - self.TotalAllocatedSize = (self.Total - self.Free + self.Reserved) * self.DefaultSize - } - - return nil -} - -func (self *ProcFDUsage) Get(pid int) error { - err := readFile(procFileName(pid, "limits"), func(line string) bool { - if strings.HasPrefix(line, "Max open files") { - fields := strings.Fields(line) - if len(fields) == 6 { - self.SoftLimit, _ = strconv.ParseUint(fields[3], 10, 64) - self.HardLimit, _ = strconv.ParseUint(fields[4], 10, 64) - } - return false - } - return true - }) - if err != nil { - return err - } - fds, err := ioutil.ReadDir(procFileName(pid, "fd")) - if err != nil { - return err - } - self.Open = uint64(len(fds)) - return nil -} - -func parseCpuStat(self *Cpu, line string) error { - fields := strings.Fields(line) - - self.User, _ = strtoull(fields[1]) - self.Nice, _ = strtoull(fields[2]) - self.Sys, _ = strtoull(fields[3]) - self.Idle, _ = strtoull(fields[4]) - self.Wait, _ = strtoull(fields[5]) - self.Irq, _ = strtoull(fields[6]) - self.SoftIrq, _ = strtoull(fields[7]) - self.Stolen, _ = strtoull(fields[8]) - - return nil -} diff --git a/vendor/github.com/elastic/gosigar/sigar_linux_common.go b/vendor/github.com/elastic/gosigar/sigar_linux_common.go deleted file mode 100644 index 7ca649762225..000000000000 --- a/vendor/github.com/elastic/gosigar/sigar_linux_common.go +++ /dev/null @@ -1,482 +0,0 @@ -// Copyright (c) 2012 VMware, Inc. - -// +build freebsd linux - -package gosigar - -import ( - "bufio" - "bytes" - "fmt" - "io" - "io/ioutil" - "os" - "os/user" - "path/filepath" - "strconv" - "strings" - "syscall" -) - -var system struct { - ticks uint64 - btime uint64 -} - -var Procd string - -func getLinuxBootTime() { - // grab system boot time - readFile(Procd+"/stat", func(line string) bool { - if strings.HasPrefix(line, "btime") { - system.btime, _ = strtoull(line[6:]) - return false // stop reading - } - return true - }) -} - -func (self *LoadAverage) Get() error { - line, err := ioutil.ReadFile(Procd + "/loadavg") - if err != nil { - return nil - } - - fields := strings.Fields(string(line)) - - self.One, _ = strconv.ParseFloat(fields[0], 64) - self.Five, _ = strconv.ParseFloat(fields[1], 64) - self.Fifteen, _ = strconv.ParseFloat(fields[2], 64) - - return nil -} - -func (self *Mem) Get() error { - - table, err := parseMeminfo() - if err != nil { - return err - } - - self.Total, _ = table["MemTotal"] - self.Free, _ = table["MemFree"] - buffers, _ := table["Buffers"] - cached, _ := table["Cached"] - - if available, ok := table["MemAvailable"]; ok { - // MemAvailable is in /proc/meminfo (kernel 3.14+) - self.ActualFree = available - } else { - self.ActualFree = self.Free + buffers + cached - } - - self.Used = self.Total - self.Free - self.ActualUsed = self.Total - self.ActualFree - - return nil -} - -func (self *Swap) Get() error { - - table, err := parseMeminfo() - if err != nil { - return err - } - self.Total, _ = table["SwapTotal"] - self.Free, _ = table["SwapFree"] - - self.Used = self.Total - self.Free - return nil -} - -func (self *Cpu) Get() error { - return readFile(Procd+"/stat", func(line string) bool { - if len(line) > 4 && line[0:4] == "cpu " { - parseCpuStat(self, line) - return false - } - return true - - }) -} - -func (self *CpuList) Get() error { - capacity := len(self.List) - if capacity == 0 { - capacity = 4 - } - list := make([]Cpu, 0, capacity) - - err := readFile(Procd+"/stat", func(line string) bool { - if len(line) > 3 && line[0:3] == "cpu" && line[3] != ' ' { - cpu := Cpu{} - parseCpuStat(&cpu, line) - list = append(list, cpu) - } - return true - }) - - self.List = list - - return err -} - -func (self *FileSystemList) Get() error { - capacity := len(self.List) - if capacity == 0 { - capacity = 10 - } - fslist := make([]FileSystem, 0, capacity) - - err := readFile(getMountTableFileName(), func(line string) bool { - fields := strings.Fields(line) - - fs := FileSystem{} - fs.DevName = fields[0] - fs.DirName = fields[1] - fs.SysTypeName = fields[2] - fs.Options = fields[3] - - fslist = append(fslist, fs) - - return true - }) - - self.List = fslist - - return err -} - -func (self *ProcList) Get() error { - dir, err := os.Open(Procd) - if err != nil { - return err - } - defer dir.Close() - - const readAllDirnames = -1 // see os.File.Readdirnames doc - - names, err := dir.Readdirnames(readAllDirnames) - if err != nil { - return err - } - - capacity := len(names) - list := make([]int, 0, capacity) - - for _, name := range names { - if name[0] < '0' || name[0] > '9' { - continue - } - pid, err := strconv.Atoi(name) - if err == nil { - list = append(list, pid) - } - } - - self.List = list - - return nil -} - -func (self *ProcState) Get(pid int) error { - data, err := readProcFile(pid, "stat") - if err != nil { - return err - } - - // Extract the comm value with is surrounded by parentheses. - lIdx := bytes.Index(data, []byte("(")) - rIdx := bytes.LastIndex(data, []byte(")")) - if lIdx < 0 || rIdx < 0 || lIdx >= rIdx || rIdx+2 >= len(data) { - return fmt.Errorf("failed to extract comm for pid %d from '%v'", pid, string(data)) - } - self.Name = string(data[lIdx+1 : rIdx]) - - // Extract the rest of the fields that we are interested in. - fields := bytes.Fields(data[rIdx+2:]) - if len(fields) <= 36 { - return fmt.Errorf("expected more stat fields for pid %d from '%v'", pid, string(data)) - } - - interests := bytes.Join([][]byte{ - fields[0], // state - fields[1], // ppid - fields[2], // pgrp - fields[4], // tty_nr - fields[15], // priority - fields[16], // nice - fields[36], // processor (last processor executed on) - }, []byte(" ")) - - var state string - _, err = fmt.Fscan(bytes.NewBuffer(interests), - &state, - &self.Ppid, - &self.Pgid, - &self.Tty, - &self.Priority, - &self.Nice, - &self.Processor, - ) - if err != nil { - return fmt.Errorf("failed to parse stat fields for pid %d from '%v': %v", pid, string(data), err) - } - self.State = RunState(state[0]) - - // Read /proc/[pid]/status to get the uid, then lookup uid to get username. - status, err := getProcStatus(pid) - if err != nil { - return fmt.Errorf("failed to read process status for pid %d: %v", pid, err) - } - uids, err := getUIDs(status) - if err != nil { - return fmt.Errorf("failed to read process status for pid %d: %v", pid, err) - } - user, err := user.LookupId(uids[0]) - if err == nil { - self.Username = user.Username - } else { - self.Username = uids[0] - } - - return nil -} - -func (self *ProcMem) Get(pid int) error { - contents, err := readProcFile(pid, "statm") - if err != nil { - return err - } - - fields := strings.Fields(string(contents)) - - size, _ := strtoull(fields[0]) - self.Size = size << 12 - - rss, _ := strtoull(fields[1]) - self.Resident = rss << 12 - - share, _ := strtoull(fields[2]) - self.Share = share << 12 - - contents, err = readProcFile(pid, "stat") - if err != nil { - return err - } - - fields = strings.Fields(string(contents)) - - self.MinorFaults, _ = strtoull(fields[10]) - self.MajorFaults, _ = strtoull(fields[12]) - self.PageFaults = self.MinorFaults + self.MajorFaults - - return nil -} - -func (self *ProcTime) Get(pid int) error { - contents, err := readProcFile(pid, "stat") - if err != nil { - return err - } - - fields := strings.Fields(string(contents)) - - user, _ := strtoull(fields[13]) - sys, _ := strtoull(fields[14]) - // convert to millis - self.User = user * (1000 / system.ticks) - self.Sys = sys * (1000 / system.ticks) - self.Total = self.User + self.Sys - - // convert to millis - self.StartTime, _ = strtoull(fields[21]) - self.StartTime /= system.ticks - self.StartTime += system.btime - self.StartTime *= 1000 - - return nil -} - -func (self *ProcArgs) Get(pid int) error { - contents, err := readProcFile(pid, "cmdline") - if err != nil { - return err - } - - bbuf := bytes.NewBuffer(contents) - - var args []string - - for { - arg, err := bbuf.ReadBytes(0) - if err == io.EOF { - break - } - args = append(args, string(chop(arg))) - } - - self.List = args - - return nil -} - -func (self *ProcEnv) Get(pid int) error { - contents, err := readProcFile(pid, "environ") - if err != nil { - return err - } - - if self.Vars == nil { - self.Vars = map[string]string{} - } - - pairs := bytes.Split(contents, []byte{0}) - for _, kv := range pairs { - parts := bytes.SplitN(kv, []byte{'='}, 2) - if len(parts) != 2 { - continue - } - - key := string(bytes.TrimSpace(parts[0])) - if key == "" { - continue - } - - self.Vars[key] = string(bytes.TrimSpace(parts[1])) - } - - return nil -} - -func (self *ProcExe) Get(pid int) error { - fields := map[string]*string{ - "exe": &self.Name, - "cwd": &self.Cwd, - "root": &self.Root, - } - - for name, field := range fields { - val, err := os.Readlink(procFileName(pid, name)) - - if err != nil { - return err - } - - *field = val - } - - return nil -} - -func parseMeminfo() (map[string]uint64, error) { - table := map[string]uint64{} - - err := readFile(Procd+"/meminfo", func(line string) bool { - fields := strings.Split(line, ":") - - if len(fields) != 2 { - return true // skip on errors - } - - valueUnit := strings.Fields(fields[1]) - value, err := strtoull(valueUnit[0]) - if err != nil { - return true // skip on errors - } - - if len(valueUnit) > 1 && valueUnit[1] == "kB" { - value *= 1024 - } - table[fields[0]] = value - - return true - }) - return table, err -} - -func readFile(file string, handler func(string) bool) error { - contents, err := ioutil.ReadFile(file) - if err != nil { - return err - } - - reader := bufio.NewReader(bytes.NewBuffer(contents)) - - for { - line, _, err := reader.ReadLine() - if err == io.EOF { - break - } - if !handler(string(line)) { - break - } - } - - return nil -} - -func strtoull(val string) (uint64, error) { - return strconv.ParseUint(val, 10, 64) -} - -func procFileName(pid int, name string) string { - return Procd + "/" + strconv.Itoa(pid) + "/" + name -} - -func readProcFile(pid int, name string) (content []byte, err error) { - path := procFileName(pid, name) - - // Panics have been reported when reading proc files, let's recover and - // report the path if this happens - // See https://github.com/elastic/beats/issues/6692 - defer func() { - if r := recover(); r != nil { - content = nil - err = fmt.Errorf("recovered panic when reading proc file '%s': %v", path, r) - } - }() - contents, err := ioutil.ReadFile(path) - - if err != nil { - if perr, ok := err.(*os.PathError); ok { - if perr.Err == syscall.ENOENT { - return nil, syscall.ESRCH - } - } - } - - return contents, err -} - -// getProcStatus reads /proc/[pid]/status which contains process status -// information in human readable form. -func getProcStatus(pid int) (map[string]string, error) { - status := make(map[string]string, 42) - path := filepath.Join(Procd, strconv.Itoa(pid), "status") - err := readFile(path, func(line string) bool { - fields := strings.SplitN(line, ":", 2) - if len(fields) == 2 { - status[fields[0]] = strings.TrimSpace(fields[1]) - } - - return true - }) - return status, err -} - -// getUIDs reads the "Uid" value from status and splits it into four values -- -// real, effective, saved set, and file system UIDs. -func getUIDs(status map[string]string) ([]string, error) { - uidLine, ok := status["Uid"] - if !ok { - return nil, fmt.Errorf("Uid not found in proc status") - } - - uidStrs := strings.Fields(uidLine) - if len(uidStrs) != 4 { - return nil, fmt.Errorf("Uid line ('%s') did not contain four values", uidLine) - } - - return uidStrs, nil -} diff --git a/vendor/github.com/elastic/gosigar/sigar_openbsd.go b/vendor/github.com/elastic/gosigar/sigar_openbsd.go deleted file mode 100644 index e4371b8b6884..000000000000 --- a/vendor/github.com/elastic/gosigar/sigar_openbsd.go +++ /dev/null @@ -1,426 +0,0 @@ -// Copyright (c) 2016 Jasper Lievisse Adriaanse . - -// +build openbsd - -package gosigar - -/* -#include -#include -#include -#include -#include -#include -#include -#include -*/ -import "C" - -//import "github.com/davecgh/go-spew/spew" - -import ( - "runtime" - "syscall" - "time" - "unsafe" -) - -type Uvmexp struct { - pagesize uint32 - pagemask uint32 - pageshift uint32 - npages uint32 - free uint32 - active uint32 - inactive uint32 - paging uint32 - wired uint32 - zeropages uint32 - reserve_pagedaemon uint32 - reserve_kernel uint32 - anonpages uint32 - vnodepages uint32 - vtextpages uint32 - freemin uint32 - freetarg uint32 - inactarg uint32 - wiredmax uint32 - anonmin uint32 - vtextmin uint32 - vnodemin uint32 - anonminpct uint32 - vtextmi uint32 - npct uint32 - vnodeminpct uint32 - nswapdev uint32 - swpages uint32 - swpginuse uint32 - swpgonly uint32 - nswget uint32 - nanon uint32 - nanonneeded uint32 - nfreeanon uint32 - faults uint32 - traps uint32 - intrs uint32 - swtch uint32 - softs uint32 - syscalls uint32 - pageins uint32 - obsolete_swapins uint32 - obsolete_swapouts uint32 - pgswapin uint32 - pgswapout uint32 - forks uint32 - forks_ppwait uint32 - forks_sharevm uint32 - pga_zerohit uint32 - pga_zeromiss uint32 - zeroaborts uint32 - fltnoram uint32 - fltnoanon uint32 - fltpgwait uint32 - fltpgrele uint32 - fltrelck uint32 - fltrelckok uint32 - fltanget uint32 - fltanretry uint32 - fltamcopy uint32 - fltnamap uint32 - fltnomap uint32 - fltlget uint32 - fltget uint32 - flt_anon uint32 - flt_acow uint32 - flt_obj uint32 - flt_prcopy uint32 - flt_przero uint32 - pdwoke uint32 - pdrevs uint32 - pdswout uint32 - pdfreed uint32 - pdscans uint32 - pdanscan uint32 - pdobscan uint32 - pdreact uint32 - pdbusy uint32 - pdpageouts uint32 - pdpending uint32 - pddeact uint32 - pdreanon uint32 - pdrevnode uint32 - pdrevtext uint32 - fpswtch uint32 - kmapent uint32 -} - -type Bcachestats struct { - numbufs uint64 - numbufpages uint64 - numdirtypages uint64 - numcleanpages uint64 - pendingwrites uint64 - pendingreads uint64 - numwrites uint64 - numreads uint64 - cachehits uint64 - busymapped uint64 - dmapages uint64 - highpages uint64 - delwribufs uint64 - kvaslots uint64 - kvaslots_avail uint64 -} - -type Swapent struct { - se_dev C.dev_t - se_flags int32 - se_nblks int32 - se_inuse int32 - se_priority int32 - sw_path []byte -} - -func (self *FileSystemList) Get() error { - num, err := syscall.Getfsstat(nil, C.MNT_NOWAIT) - if err != nil { - return err - } - - buf := make([]syscall.Statfs_t, num) - - _, err = syscall.Getfsstat(buf, C.MNT_NOWAIT) - if err != nil { - return err - } - - fslist := make([]FileSystem, 0, num) - - for i := 0; i < num; i++ { - fs := FileSystem{} - - fs.DirName = bytePtrToString(&buf[i].F_mntonname[0]) - fs.DevName = bytePtrToString(&buf[i].F_mntfromname[0]) - fs.SysTypeName = bytePtrToString(&buf[i].F_fstypename[0]) - - fslist = append(fslist, fs) - } - - self.List = fslist - - return err -} - -func (self *FileSystemUsage) Get(path string) error { - stat := syscall.Statfs_t{} - err := syscall.Statfs(path, &stat) - if err != nil { - return err - } - - self.Total = uint64(stat.F_blocks) * uint64(stat.F_bsize) - self.Free = uint64(stat.F_bfree) * uint64(stat.F_bsize) - self.Avail = uint64(stat.F_bavail) * uint64(stat.F_bsize) - self.Used = self.Total - self.Free - self.Files = stat.F_files - self.FreeFiles = stat.F_ffree - - return nil -} - -func (self *FDUsage) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *LoadAverage) Get() error { - avg := []C.double{0, 0, 0} - - C.getloadavg(&avg[0], C.int(len(avg))) - - self.One = float64(avg[0]) - self.Five = float64(avg[1]) - self.Fifteen = float64(avg[2]) - - return nil -} - -func (self *Uptime) Get() error { - tv := syscall.Timeval{} - mib := [2]int32{C.CTL_KERN, C.KERN_BOOTTIME} - - n := uintptr(0) - // First we determine how much memory we'll need to pass later on (via `n`) - _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0) - - if errno != 0 || n == 0 { - return nil - } - - // Now perform the actual sysctl(3) call, storing the result in tv - _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&tv)), uintptr(unsafe.Pointer(&n)), 0, 0) - - if errno != 0 || n == 0 { - return nil - } - - self.Length = time.Since(time.Unix(int64(tv.Sec), int64(tv.Usec)*1000)).Seconds() - - return nil -} - -func (self *Mem) Get() error { - n := uintptr(0) - - var uvmexp Uvmexp - mib := [2]int32{C.CTL_VM, C.VM_UVMEXP} - n = uintptr(0) - // First we determine how much memory we'll need to pass later on (via `n`) - _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0) - if errno != 0 || n == 0 { - return nil - } - - _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&uvmexp)), uintptr(unsafe.Pointer(&n)), 0, 0) - if errno != 0 || n == 0 { - return nil - } - - var bcachestats Bcachestats - mib3 := [3]int32{C.CTL_VFS, C.VFS_GENERIC, C.VFS_BCACHESTAT} - n = uintptr(0) - _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib3[0])), 3, 0, uintptr(unsafe.Pointer(&n)), 0, 0) - if errno != 0 || n == 0 { - return nil - } - _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib3[0])), 3, uintptr(unsafe.Pointer(&bcachestats)), uintptr(unsafe.Pointer(&n)), 0, 0) - if errno != 0 || n == 0 { - return nil - } - - self.Total = uint64(uvmexp.npages) << uvmexp.pageshift - self.Used = uint64(uvmexp.npages-uvmexp.free) << uvmexp.pageshift - self.Free = uint64(uvmexp.free) << uvmexp.pageshift - - self.ActualFree = self.Free + (uint64(bcachestats.numbufpages) << uvmexp.pageshift) - self.ActualUsed = self.Used - (uint64(bcachestats.numbufpages) << uvmexp.pageshift) - - return nil -} - -func (self *Swap) Get() error { - nswap := C.swapctl(C.SWAP_NSWAP, unsafe.Pointer(uintptr(0)), 0) - - // If there are no swap devices, nothing to do here. - if nswap == 0 { - return nil - } - - swdev := make([]Swapent, nswap) - - rnswap := C.swapctl(C.SWAP_STATS, unsafe.Pointer(&swdev[0]), nswap) - if rnswap == 0 { - return nil - } - - for i := 0; i < int(nswap); i++ { - if swdev[i].se_flags&C.SWF_ENABLE == 2 { - self.Used = self.Used + uint64(swdev[i].se_inuse/(1024/C.DEV_BSIZE)) - self.Total = self.Total + uint64(swdev[i].se_nblks/(1024/C.DEV_BSIZE)) - } - } - - self.Free = self.Total - self.Used - - return nil -} - -func (self *HugeTLBPages) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *Cpu) Get() error { - load := [C.CPUSTATES]C.long{C.CP_USER, C.CP_NICE, C.CP_SYS, C.CP_INTR, C.CP_IDLE} - - mib := [2]int32{C.CTL_KERN, C.KERN_CPTIME} - n := uintptr(0) - // First we determine how much memory we'll need to pass later on (via `n`) - _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0) - if errno != 0 || n == 0 { - return nil - } - - _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&load)), uintptr(unsafe.Pointer(&n)), 0, 0) - if errno != 0 || n == 0 { - return nil - } - - self.User = uint64(load[0]) - self.Nice = uint64(load[1]) - self.Sys = uint64(load[2]) - self.Irq = uint64(load[3]) - self.Idle = uint64(load[4]) - - return nil -} - -func (self *CpuList) Get() error { - mib := [2]int32{C.CTL_HW, C.HW_NCPU} - var ncpu int - - n := uintptr(0) - // First we determine how much memory we'll need to pass later on (via `n`) - _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, 0, uintptr(unsafe.Pointer(&n)), 0, 0) - - if errno != 0 || n == 0 { - return nil - } - - // Now perform the actual sysctl(3) call, storing the result in ncpu - _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), 2, uintptr(unsafe.Pointer(&ncpu)), uintptr(unsafe.Pointer(&n)), 0, 0) - - if errno != 0 || n == 0 { - return nil - } - - load := [C.CPUSTATES]C.long{C.CP_USER, C.CP_NICE, C.CP_SYS, C.CP_INTR, C.CP_IDLE} - - self.List = make([]Cpu, ncpu) - for curcpu := range self.List { - sysctlCptime(ncpu, curcpu, &load) - fillCpu(&self.List[curcpu], load) - } - - return nil -} - -func (self *ProcList) Get() error { - return nil -} - -func (self *ProcArgs) Get(pid int) error { - return nil -} - -func (self *ProcEnv) Get(pid int) error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *ProcState) Get(pid int) error { - return nil -} - -func (self *ProcMem) Get(pid int) error { - return nil -} - -func (self *ProcTime) Get(pid int) error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *ProcExe) Get(pid int) error { - return nil -} - -func (self *ProcFDUsage) Get(pid int) error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *Rusage) Get(pid int) error { - return ErrNotImplemented{runtime.GOOS} -} - -func fillCpu(cpu *Cpu, load [C.CPUSTATES]C.long) { - cpu.User = uint64(load[0]) - cpu.Nice = uint64(load[1]) - cpu.Sys = uint64(load[2]) - cpu.Irq = uint64(load[3]) - cpu.Idle = uint64(load[4]) -} - -func sysctlCptime(ncpu int, curcpu int, load *[C.CPUSTATES]C.long) error { - var mib []int32 - - // Use the correct mib based on the number of CPUs and fill out the - // current CPU number in case of SMP. (0 indexed cf. self.List) - if ncpu == 0 { - mib = []int32{C.CTL_KERN, C.KERN_CPTIME} - } else { - mib = []int32{C.CTL_KERN, C.KERN_CPTIME2, int32(curcpu)} - } - - len := len(mib) - - n := uintptr(0) - // First we determine how much memory we'll need to pass later on (via `n`) - _, _, errno := syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), uintptr(len), 0, uintptr(unsafe.Pointer(&n)), 0, 0) - if errno != 0 || n == 0 { - return nil - } - - _, _, errno = syscall.Syscall6(syscall.SYS___SYSCTL, uintptr(unsafe.Pointer(&mib[0])), uintptr(len), uintptr(unsafe.Pointer(load)), uintptr(unsafe.Pointer(&n)), 0, 0) - if errno != 0 || n == 0 { - return nil - } - - return nil -} diff --git a/vendor/github.com/elastic/gosigar/sigar_stub.go b/vendor/github.com/elastic/gosigar/sigar_stub.go deleted file mode 100644 index de9565aec4f5..000000000000 --- a/vendor/github.com/elastic/gosigar/sigar_stub.go +++ /dev/null @@ -1,75 +0,0 @@ -// +build !darwin,!freebsd,!linux,!openbsd,!windows - -package gosigar - -import ( - "runtime" -) - -func (c *Cpu) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func (l *LoadAverage) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func (m *Mem) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func (s *Swap) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func (s *HugeTLBPages) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func (f *FDUsage) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func (p *ProcTime) Get(int) error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *FileSystemUsage) Get(path string) error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *CpuList) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func (p *ProcState) Get(int) error { - return ErrNotImplemented{runtime.GOOS} -} - -func (p *ProcExe) Get(int) error { - return ErrNotImplemented{runtime.GOOS} -} - -func (p *ProcMem) Get(int) error { - return ErrNotImplemented{runtime.GOOS} -} - -func (p *ProcFDUsage) Get(int) error { - return ErrNotImplemented{runtime.GOOS} -} - -func (p *ProcEnv) Get(int) error { - return ErrNotImplemented{runtime.GOOS} -} - -func (p *ProcList) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func (p *ProcArgs) Get(int) error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *Rusage) Get(int) error { - return ErrNotImplemented{runtime.GOOS} -} diff --git a/vendor/github.com/elastic/gosigar/sigar_unix.go b/vendor/github.com/elastic/gosigar/sigar_unix.go deleted file mode 100644 index 3f3a9f7ff2c2..000000000000 --- a/vendor/github.com/elastic/gosigar/sigar_unix.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2012 VMware, Inc. - -// +build darwin freebsd linux - -package gosigar - -import ( - "syscall" - "time" - - "golang.org/x/sys/unix" -) - -func (self *FileSystemUsage) Get(path string) error { - stat := syscall.Statfs_t{} - err := syscall.Statfs(path, &stat) - if err != nil { - return err - } - - self.Total = uint64(stat.Blocks) * uint64(stat.Bsize) - self.Free = uint64(stat.Bfree) * uint64(stat.Bsize) - self.Avail = uint64(stat.Bavail) * uint64(stat.Bsize) - self.Used = self.Total - self.Free - self.Files = stat.Files - self.FreeFiles = uint64(stat.Ffree) - - return nil -} - -func (r *Rusage) Get(who int) error { - ru, err := getResourceUsage(who) - if err != nil { - return err - } - - uTime := convertRtimeToDur(ru.Utime) - sTime := convertRtimeToDur(ru.Stime) - - r.Utime = uTime - r.Stime = sTime - r.Maxrss = int64(ru.Maxrss) - r.Ixrss = int64(ru.Ixrss) - r.Idrss = int64(ru.Idrss) - r.Isrss = int64(ru.Isrss) - r.Minflt = int64(ru.Minflt) - r.Majflt = int64(ru.Majflt) - r.Nswap = int64(ru.Nswap) - r.Inblock = int64(ru.Inblock) - r.Oublock = int64(ru.Oublock) - r.Msgsnd = int64(ru.Msgsnd) - r.Msgrcv = int64(ru.Msgrcv) - r.Nsignals = int64(ru.Nsignals) - r.Nvcsw = int64(ru.Nvcsw) - r.Nivcsw = int64(ru.Nivcsw) - - return nil -} - -func getResourceUsage(who int) (unix.Rusage, error) { - r := unix.Rusage{} - err := unix.Getrusage(who, &r) - - return r, err -} - -func convertRtimeToDur(t unix.Timeval) time.Duration { - return time.Duration(t.Nano()) -} diff --git a/vendor/github.com/elastic/gosigar/sigar_util.go b/vendor/github.com/elastic/gosigar/sigar_util.go deleted file mode 100644 index bf93b02b247f..000000000000 --- a/vendor/github.com/elastic/gosigar/sigar_util.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2012 VMware, Inc. - -package gosigar - -import ( - "unsafe" -) - -func bytePtrToString(ptr *int8) string { - bytes := (*[10000]byte)(unsafe.Pointer(ptr)) - - n := 0 - for bytes[n] != 0 { - n++ - } - - return string(bytes[0:n]) -} - -func chop(buf []byte) []byte { - return buf[0 : len(buf)-1] -} diff --git a/vendor/github.com/elastic/gosigar/sigar_windows.go b/vendor/github.com/elastic/gosigar/sigar_windows.go deleted file mode 100644 index c2b54d8d7f77..000000000000 --- a/vendor/github.com/elastic/gosigar/sigar_windows.go +++ /dev/null @@ -1,441 +0,0 @@ -// Copyright (c) 2012 VMware, Inc. - -package gosigar - -import ( - "fmt" - "os" - "path/filepath" - "runtime" - "strings" - "sync" - "syscall" - "time" - - "github.com/StackExchange/wmi" - "github.com/elastic/gosigar/sys/windows" - "github.com/pkg/errors" -) - -// Win32_Process represents a process on the Windows operating system. If -// additional fields are added here (that match the Windows struct) they will -// automatically be populated when calling getWin32Process. -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa394372(v=vs.85).aspx -type Win32_Process struct { - CommandLine string -} - -// Win32_OperatingSystem WMI class represents a Windows-based operating system -// installed on a computer. -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa394239(v=vs.85).aspx -type Win32_OperatingSystem struct { - LastBootUpTime time.Time -} - -var ( - // version is Windows version of the host OS. - version = windows.GetWindowsVersion() - - // processQueryLimitedInfoAccess is set to PROCESS_QUERY_INFORMATION for Windows - // 2003 and XP where PROCESS_QUERY_LIMITED_INFORMATION is unknown. For all newer - // OS versions it is set to PROCESS_QUERY_LIMITED_INFORMATION. - processQueryLimitedInfoAccess = windows.PROCESS_QUERY_LIMITED_INFORMATION - - // bootTime is the time when the OS was last booted. This value may be nil - // on operating systems that do not support the WMI query used to obtain it. - bootTime *time.Time - bootTimeLock sync.Mutex -) - -func init() { - if !version.IsWindowsVistaOrGreater() { - // PROCESS_QUERY_LIMITED_INFORMATION cannot be used on 2003 or XP. - processQueryLimitedInfoAccess = syscall.PROCESS_QUERY_INFORMATION - } -} - -func (self *LoadAverage) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *FDUsage) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *ProcEnv) Get(pid int) error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *ProcExe) Get(pid int) error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *ProcFDUsage) Get(pid int) error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *Uptime) Get() error { - // Minimum supported OS is Windows Vista. - if !version.IsWindowsVistaOrGreater() { - return ErrNotImplemented{runtime.GOOS} - } - - bootTimeLock.Lock() - defer bootTimeLock.Unlock() - if bootTime == nil { - os, err := getWin32OperatingSystem() - if err != nil { - return errors.Wrap(err, "failed to get boot time using WMI") - } - bootTime = &os.LastBootUpTime - } - - self.Length = time.Since(*bootTime).Seconds() - return nil -} - -func (self *Mem) Get() error { - memoryStatusEx, err := windows.GlobalMemoryStatusEx() - if err != nil { - return errors.Wrap(err, "GlobalMemoryStatusEx failed") - } - - self.Total = memoryStatusEx.TotalPhys - self.Free = memoryStatusEx.AvailPhys - self.Used = self.Total - self.Free - self.ActualFree = self.Free - self.ActualUsed = self.Used - return nil -} - -func (self *Swap) Get() error { - memoryStatusEx, err := windows.GlobalMemoryStatusEx() - if err != nil { - return errors.Wrap(err, "GlobalMemoryStatusEx failed") - } - - self.Total = memoryStatusEx.TotalPageFile - self.Free = memoryStatusEx.AvailPageFile - self.Used = self.Total - self.Free - return nil -} - -func (self *HugeTLBPages) Get() error { - return ErrNotImplemented{runtime.GOOS} -} - -func (self *Cpu) Get() error { - idle, kernel, user, err := windows.GetSystemTimes() - if err != nil { - return errors.Wrap(err, "GetSystemTimes failed") - } - - // CPU times are reported in milliseconds by gosigar. - self.Idle = uint64(idle / time.Millisecond) - self.Sys = uint64(kernel / time.Millisecond) - self.User = uint64(user / time.Millisecond) - return nil -} - -func (self *CpuList) Get() error { - cpus, err := windows.NtQuerySystemProcessorPerformanceInformation() - if err != nil { - return errors.Wrap(err, "NtQuerySystemProcessorPerformanceInformation failed") - } - - self.List = make([]Cpu, 0, len(cpus)) - for _, cpu := range cpus { - self.List = append(self.List, Cpu{ - Idle: uint64(cpu.IdleTime / time.Millisecond), - Sys: uint64(cpu.KernelTime / time.Millisecond), - User: uint64(cpu.UserTime / time.Millisecond), - }) - } - return nil -} - -func (self *FileSystemList) Get() error { - drives, err := windows.GetLogicalDriveStrings() - if err != nil { - return errors.Wrap(err, "GetLogicalDriveStrings failed") - } - - for _, drive := range drives { - dt, err := windows.GetDriveType(drive) - if err != nil { - return errors.Wrapf(err, "GetDriveType failed") - } - - self.List = append(self.List, FileSystem{ - DirName: drive, - DevName: drive, - TypeName: dt.String(), - }) - } - return nil -} - -// Get retrieves a list of all process identifiers (PIDs) in the system. -func (self *ProcList) Get() error { - pids, err := windows.EnumProcesses() - if err != nil { - return errors.Wrap(err, "EnumProcesses failed") - } - - // Convert uint32 PIDs to int. - self.List = make([]int, 0, len(pids)) - for _, pid := range pids { - self.List = append(self.List, int(pid)) - } - return nil -} - -func (self *ProcState) Get(pid int) error { - var errs []error - - var err error - self.Name, err = getProcName(pid) - if err != nil { - errs = append(errs, errors.Wrap(err, "getProcName failed")) - } - - self.State, err = getProcStatus(pid) - if err != nil { - errs = append(errs, errors.Wrap(err, "getProcStatus failed")) - } - - self.Ppid, err = getParentPid(pid) - if err != nil { - errs = append(errs, errors.Wrap(err, "getParentPid failed")) - } - - self.Username, err = getProcCredName(pid) - if err != nil { - errs = append(errs, errors.Wrap(err, "getProcCredName failed")) - } - - if len(errs) > 0 { - errStrs := make([]string, 0, len(errs)) - for _, e := range errs { - errStrs = append(errStrs, e.Error()) - } - return errors.New(strings.Join(errStrs, "; ")) - } - return nil -} - -// getProcName returns the process name associated with the PID. -func getProcName(pid int) (string, error) { - handle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid)) - if err != nil { - return "", errors.Wrapf(err, "OpenProcess failed for pid=%v", pid) - } - defer syscall.CloseHandle(handle) - - filename, err := windows.GetProcessImageFileName(handle) - if err != nil { - return "", errors.Wrapf(err, "GetProcessImageFileName failed for pid=%v", pid) - } - - return filepath.Base(filename), nil -} - -// getProcStatus returns the status of a process. -func getProcStatus(pid int) (RunState, error) { - handle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid)) - if err != nil { - return RunStateUnknown, errors.Wrapf(err, "OpenProcess failed for pid=%v", pid) - } - defer syscall.CloseHandle(handle) - - var exitCode uint32 - err = syscall.GetExitCodeProcess(handle, &exitCode) - if err != nil { - return RunStateUnknown, errors.Wrapf(err, "GetExitCodeProcess failed for pid=%v") - } - - if exitCode == 259 { //still active - return RunStateRun, nil - } - return RunStateSleep, nil -} - -// getParentPid returns the parent process ID of a process. -func getParentPid(pid int) (int, error) { - handle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid)) - if err != nil { - return RunStateUnknown, errors.Wrapf(err, "OpenProcess failed for pid=%v", pid) - } - defer syscall.CloseHandle(handle) - - procInfo, err := windows.NtQueryProcessBasicInformation(handle) - if err != nil { - return 0, errors.Wrapf(err, "NtQueryProcessBasicInformation failed for pid=%v", pid) - } - - return int(procInfo.InheritedFromUniqueProcessID), nil -} - -func getProcCredName(pid int) (string, error) { - handle, err := syscall.OpenProcess(syscall.PROCESS_QUERY_INFORMATION, false, uint32(pid)) - if err != nil { - return "", errors.Wrapf(err, "OpenProcess failed for pid=%v", pid) - } - defer syscall.CloseHandle(handle) - - // Find process token via win32. - var token syscall.Token - err = syscall.OpenProcessToken(handle, syscall.TOKEN_QUERY, &token) - if err != nil { - return "", errors.Wrapf(err, "OpenProcessToken failed for pid=%v", pid) - } - - // Find the token user. - tokenUser, err := token.GetTokenUser() - if err != nil { - return "", errors.Wrapf(err, "GetTokenInformation failed for pid=%v", pid) - } - - // Close token to prevent handle leaks. - err = token.Close() - if err != nil { - return "", errors.Wrapf(err, "failed while closing process token handle for pid=%v", pid) - } - - // Look up domain account by SID. - account, domain, _, err := tokenUser.User.Sid.LookupAccount("") - if err != nil { - sid, sidErr := tokenUser.User.Sid.String() - if sidErr != nil { - return "", errors.Wrapf(err, "failed while looking up account name for pid=%v", pid) - } - return "", errors.Wrapf(err, "failed while looking up account name for SID=%v of pid=%v", sid, pid) - } - - return fmt.Sprintf(`%s\%s`, domain, account), nil -} - -func (self *ProcMem) Get(pid int) error { - handle, err := syscall.OpenProcess(processQueryLimitedInfoAccess|windows.PROCESS_VM_READ, false, uint32(pid)) - if err != nil { - return errors.Wrapf(err, "OpenProcess failed for pid=%v", pid) - } - defer syscall.CloseHandle(handle) - - counters, err := windows.GetProcessMemoryInfo(handle) - if err != nil { - return errors.Wrapf(err, "GetProcessMemoryInfo failed for pid=%v", pid) - } - - self.Resident = uint64(counters.WorkingSetSize) - self.Size = uint64(counters.PrivateUsage) - return nil -} - -func (self *ProcTime) Get(pid int) error { - cpu, err := getProcTimes(pid) - if err != nil { - return err - } - - // Windows epoch times are expressed as time elapsed since midnight on - // January 1, 1601 at Greenwich, England. This converts the Filetime to - // unix epoch in milliseconds. - self.StartTime = uint64(cpu.CreationTime.Nanoseconds() / 1e6) - - // Convert to millis. - self.User = uint64(windows.FiletimeToDuration(&cpu.UserTime).Nanoseconds() / 1e6) - self.Sys = uint64(windows.FiletimeToDuration(&cpu.KernelTime).Nanoseconds() / 1e6) - self.Total = self.User + self.Sys - - return nil -} - -func getProcTimes(pid int) (*syscall.Rusage, error) { - handle, err := syscall.OpenProcess(processQueryLimitedInfoAccess, false, uint32(pid)) - if err != nil { - return nil, errors.Wrapf(err, "OpenProcess failed for pid=%v", pid) - } - defer syscall.CloseHandle(handle) - - var cpu syscall.Rusage - if err := syscall.GetProcessTimes(handle, &cpu.CreationTime, &cpu.ExitTime, &cpu.KernelTime, &cpu.UserTime); err != nil { - return nil, errors.Wrapf(err, "GetProcessTimes failed for pid=%v", pid) - } - - return &cpu, nil -} - -func (self *ProcArgs) Get(pid int) error { - // The minimum supported client for Win32_Process is Windows Vista. - if !version.IsWindowsVistaOrGreater() { - return ErrNotImplemented{runtime.GOOS} - } - - process, err := getWin32Process(int32(pid)) - if err != nil { - return errors.Wrapf(err, "ProcArgs failed for pid=%v", pid) - } - - self.List = []string{process.CommandLine} - return nil -} - -func (self *FileSystemUsage) Get(path string) error { - freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes, err := windows.GetDiskFreeSpaceEx(path) - if err != nil { - return errors.Wrap(err, "GetDiskFreeSpaceEx failed") - } - - self.Total = totalNumberOfBytes - self.Free = totalNumberOfFreeBytes - self.Used = self.Total - self.Free - self.Avail = freeBytesAvailable - return nil -} - -// getWin32Process gets information about the process with the given process ID. -// It uses a WMI query to get the information from the local system. -func getWin32Process(pid int32) (Win32_Process, error) { - var dst []Win32_Process - query := fmt.Sprintf("WHERE ProcessId = %d", pid) - q := wmi.CreateQuery(&dst, query) - err := wmi.Query(q, &dst) - if err != nil { - return Win32_Process{}, fmt.Errorf("could not get Win32_Process %s: %v", query, err) - } - if len(dst) < 1 { - return Win32_Process{}, fmt.Errorf("could not get Win32_Process %s: Process not found", query) - } - return dst[0], nil -} - -func getWin32OperatingSystem() (Win32_OperatingSystem, error) { - var dst []Win32_OperatingSystem - q := wmi.CreateQuery(&dst, "") - err := wmi.Query(q, &dst) - if err != nil { - return Win32_OperatingSystem{}, errors.Wrap(err, "wmi query for Win32_OperatingSystem failed") - } - if len(dst) != 1 { - return Win32_OperatingSystem{}, errors.New("wmi query for Win32_OperatingSystem failed") - } - return dst[0], nil -} - -func (self *Rusage) Get(who int) error { - if who != 0 { - return ErrNotImplemented{runtime.GOOS} - } - - pid := os.Getpid() - cpu, err := getProcTimes(pid) - if err != nil { - return err - } - - self.Utime = windows.FiletimeToDuration(&cpu.UserTime) - self.Stime = windows.FiletimeToDuration(&cpu.KernelTime) - - return nil -} diff --git a/vendor/github.com/elastic/gosigar/sys/windows/doc.go b/vendor/github.com/elastic/gosigar/sys/windows/doc.go deleted file mode 100644 index dda57aa830ac..000000000000 --- a/vendor/github.com/elastic/gosigar/sys/windows/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package windows contains various Windows system call. -package windows diff --git a/vendor/github.com/elastic/gosigar/sys/windows/ntquery.go b/vendor/github.com/elastic/gosigar/sys/windows/ntquery.go deleted file mode 100644 index 85de365e1a89..000000000000 --- a/vendor/github.com/elastic/gosigar/sys/windows/ntquery.go +++ /dev/null @@ -1,132 +0,0 @@ -// +build windows - -package windows - -import ( - "bytes" - "encoding/binary" - "io" - "runtime" - "syscall" - "time" - "unsafe" - - "github.com/pkg/errors" -) - -// On both 32-bit and 64-bit systems NtQuerySystemInformation expects the -// size of SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION to be 48. -const sizeofSystemProcessorPerformanceInformation = 48 - -// ProcessBasicInformation is an equivalent representation of -// PROCESS_BASIC_INFORMATION in the Windows API. -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280(v=vs.85).aspx -type ProcessBasicInformation struct { - ExitStatus uint - PebBaseAddress uintptr - AffinityMask uint - BasePriority uint - UniqueProcessID uint - InheritedFromUniqueProcessID uint -} - -// NtQueryProcessBasicInformation queries basic information about the process -// associated with the given handle (provided by OpenProcess). It uses the -// NtQueryInformationProcess function to collect the data. -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684280(v=vs.85).aspx -func NtQueryProcessBasicInformation(handle syscall.Handle) (ProcessBasicInformation, error) { - var processBasicInfo ProcessBasicInformation - processBasicInfoPtr := (*byte)(unsafe.Pointer(&processBasicInfo)) - size := uint32(unsafe.Sizeof(processBasicInfo)) - ntStatus, _ := _NtQueryInformationProcess(handle, 0, processBasicInfoPtr, size, nil) - if ntStatus != 0 { - return ProcessBasicInformation{}, errors.Errorf("NtQueryInformationProcess failed, NTSTATUS=0x%X", ntStatus) - } - - return processBasicInfo, nil -} - -// SystemProcessorPerformanceInformation contains CPU performance information -// for a single CPU. -type SystemProcessorPerformanceInformation struct { - IdleTime time.Duration // Amount of time spent idle. - KernelTime time.Duration // Kernel time does NOT include time spent in idle. - UserTime time.Duration // Amount of time spent executing in user mode. -} - -// _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION is an equivalent representation of -// SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION in the Windows API. This struct is -// used internally with NtQuerySystemInformation call and is not exported. The -// exported equivalent is SystemProcessorPerformanceInformation. -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724509(v=vs.85).aspx -type _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION struct { - IdleTime int64 - KernelTime int64 - UserTime int64 - Reserved1 [2]int64 - Reserved2 uint32 -} - -// NtQuerySystemProcessorPerformanceInformation queries CPU performance -// information for each CPU. It uses the NtQuerySystemInformation function to -// collect the SystemProcessorPerformanceInformation. -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724509(v=vs.85).aspx -func NtQuerySystemProcessorPerformanceInformation() ([]SystemProcessorPerformanceInformation, error) { - // NTSTATUS code for success. - // https://msdn.microsoft.com/en-us/library/cc704588.aspx - const STATUS_SUCCESS = 0 - - // From the _SYSTEM_INFORMATION_CLASS enum. - // http://processhacker.sourceforge.net/doc/ntexapi_8h.html#ad5d815b48e8f4da1ef2eb7a2f18a54e0 - const systemProcessorPerformanceInformation = 8 - - // Create a buffer large enough to hold an entry for each processor. - b := make([]byte, runtime.NumCPU()*sizeofSystemProcessorPerformanceInformation) - - // Query the performance information. Note that this function uses 0 to - // indicate success. Most other Windows functions use non-zero for success. - var returnLength uint32 - ntStatus, _ := _NtQuerySystemInformation(systemProcessorPerformanceInformation, &b[0], uint32(len(b)), &returnLength) - if ntStatus != STATUS_SUCCESS { - return nil, errors.Errorf("NtQuerySystemInformation failed, NTSTATUS=0x%X, bufLength=%v, returnLength=%v", ntStatus, len(b), returnLength) - } - - return readSystemProcessorPerformanceInformationBuffer(b) -} - -// readSystemProcessorPerformanceInformationBuffer reads from a buffer -// containing SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION data. The buffer should -// contain one entry for each CPU. -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724509(v=vs.85).aspx -func readSystemProcessorPerformanceInformationBuffer(b []byte) ([]SystemProcessorPerformanceInformation, error) { - n := len(b) / sizeofSystemProcessorPerformanceInformation - r := bytes.NewReader(b) - - rtn := make([]SystemProcessorPerformanceInformation, 0, n) - for i := 0; i < n; i++ { - _, err := r.Seek(int64(i*sizeofSystemProcessorPerformanceInformation), io.SeekStart) - if err != nil { - return nil, errors.Wrapf(err, "failed to seek to cpuN=%v in buffer", i) - } - - times := make([]uint64, 3) - for j := range times { - err := binary.Read(r, binary.LittleEndian, ×[j]) - if err != nil { - return nil, errors.Wrapf(err, "failed reading cpu times for cpuN=%v", i) - } - } - - idleTime := time.Duration(times[0] * 100) - kernelTime := time.Duration(times[1] * 100) - userTime := time.Duration(times[2] * 100) - - rtn = append(rtn, SystemProcessorPerformanceInformation{ - IdleTime: idleTime, - KernelTime: kernelTime - idleTime, // Subtract out idle time from kernel time. - UserTime: userTime, - }) - } - - return rtn, nil -} diff --git a/vendor/github.com/elastic/gosigar/sys/windows/privileges.go b/vendor/github.com/elastic/gosigar/sys/windows/privileges.go deleted file mode 100644 index 28c78fd228e3..000000000000 --- a/vendor/github.com/elastic/gosigar/sys/windows/privileges.go +++ /dev/null @@ -1,272 +0,0 @@ -// +build windows - -package windows - -import ( - "bytes" - "encoding/binary" - "encoding/json" - "fmt" - "runtime" - "strings" - "sync" - "syscall" - - "github.com/pkg/errors" - "golang.org/x/sys/windows" -) - -// Cache of privilege names to LUIDs. -var ( - privNames = make(map[string]int64) - privNameMutex sync.Mutex -) - -const ( - // SeDebugPrivilege is the name of the privilege used to debug programs. - SeDebugPrivilege = "SeDebugPrivilege" -) - -// Errors returned by AdjustTokenPrivileges. -const ( - ERROR_NOT_ALL_ASSIGNED syscall.Errno = 1300 -) - -// Attribute bits for privileges. -const ( - _SE_PRIVILEGE_ENABLED_BY_DEFAULT uint32 = 0x00000001 - _SE_PRIVILEGE_ENABLED uint32 = 0x00000002 - _SE_PRIVILEGE_REMOVED uint32 = 0x00000004 - _SE_PRIVILEGE_USED_FOR_ACCESS uint32 = 0x80000000 -) - -// Privilege contains information about a single privilege associated with a -// Token. -type Privilege struct { - LUID int64 `json:"-"` // Locally unique identifier (guaranteed only until the system is restarted). - Name string `json:"-"` - EnabledByDefault bool `json:"enabled_by_default,omitempty"` - Enabled bool `json:"enabled"` - Removed bool `json:"removed,omitempty"` - Used bool `json:"used,omitempty"` -} - -func (p Privilege) String() string { - var buf bytes.Buffer - buf.WriteString(p.Name) - buf.WriteString("=(") - - opts := make([]string, 0, 4) - if p.EnabledByDefault { - opts = append(opts, "Default") - } - if p.Enabled { - opts = append(opts, "Enabled") - } - if !p.EnabledByDefault && !p.Enabled { - opts = append(opts, "Disabled") - } - if p.Removed { - opts = append(opts, "Removed") - } - if p.Used { - opts = append(opts, "Used") - } - - buf.WriteString(strings.Join(opts, ", ")) - buf.WriteString(")") - - // Example: SeDebugPrivilege=(Default, Enabled) - return buf.String() -} - -// User represent the information about a Windows account. -type User struct { - SID string - Account string - Domain string - Type uint32 -} - -func (u User) String() string { - return fmt.Sprintf(`User:%v\%v, SID:%v, Type:%v`, u.Domain, u.Account, u.SID, u.Type) -} - -// DebugInfo contains general debug info about the current process. -type DebugInfo struct { - OSVersion Version // OS version info. - Arch string // Architecture of the machine. - NumCPU int // Number of CPUs. - User User // User that this process is running as. - ProcessPrivs map[string]Privilege // Privileges held by the process. -} - -func (d DebugInfo) String() string { - bytes, _ := json.Marshal(d) - return string(bytes) -} - -// LookupPrivilegeName looks up a privilege name given a LUID value. -func LookupPrivilegeName(systemName string, luid int64) (string, error) { - buf := make([]uint16, 256) - bufSize := uint32(len(buf)) - err := _LookupPrivilegeName(systemName, &luid, &buf[0], &bufSize) - if err != nil { - return "", errors.Wrapf(err, "LookupPrivilegeName failed for luid=%v", luid) - } - - return syscall.UTF16ToString(buf), nil -} - -// mapPrivileges maps privilege names to LUID values. -func mapPrivileges(names []string) ([]int64, error) { - var privileges []int64 - privNameMutex.Lock() - defer privNameMutex.Unlock() - for _, name := range names { - p, ok := privNames[name] - if !ok { - err := _LookupPrivilegeValue("", name, &p) - if err != nil { - return nil, errors.Wrapf(err, "LookupPrivilegeValue failed on '%v'", name) - } - privNames[name] = p - } - privileges = append(privileges, p) - } - return privileges, nil -} - -// EnableTokenPrivileges enables the specified privileges in the given -// Token. The token must have TOKEN_ADJUST_PRIVILEGES access. If the token -// does not already contain the privilege it cannot be enabled. -func EnableTokenPrivileges(token syscall.Token, privileges ...string) error { - privValues, err := mapPrivileges(privileges) - if err != nil { - return err - } - - var b bytes.Buffer - binary.Write(&b, binary.LittleEndian, uint32(len(privValues))) - for _, p := range privValues { - binary.Write(&b, binary.LittleEndian, p) - binary.Write(&b, binary.LittleEndian, uint32(_SE_PRIVILEGE_ENABLED)) - } - - success, err := _AdjustTokenPrivileges(token, false, &b.Bytes()[0], uint32(b.Len()), nil, nil) - if !success { - return err - } - if err == ERROR_NOT_ALL_ASSIGNED { - return errors.Wrap(err, "error not all privileges were assigned") - } - - return nil -} - -// GetTokenPrivileges returns a list of privileges associated with a token. -// The provided token must have at a minimum TOKEN_QUERY access. This is a -// wrapper around the GetTokenInformation function. -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa446671(v=vs.85).aspx -func GetTokenPrivileges(token syscall.Token) (map[string]Privilege, error) { - // Determine the required buffer size. - var size uint32 - syscall.GetTokenInformation(token, syscall.TokenPrivileges, nil, 0, &size) - - // This buffer will receive a TOKEN_PRIVILEGE structure. - b := bytes.NewBuffer(make([]byte, size)) - err := syscall.GetTokenInformation(token, syscall.TokenPrivileges, &b.Bytes()[0], uint32(b.Len()), &size) - if err != nil { - return nil, errors.Wrap(err, "GetTokenInformation failed") - } - - var privilegeCount uint32 - err = binary.Read(b, binary.LittleEndian, &privilegeCount) - if err != nil { - return nil, errors.Wrap(err, "failed to read PrivilegeCount") - } - - rtn := make(map[string]Privilege, privilegeCount) - for i := 0; i < int(privilegeCount); i++ { - var luid int64 - err = binary.Read(b, binary.LittleEndian, &luid) - if err != nil { - return nil, errors.Wrap(err, "failed to read LUID value") - } - - var attributes uint32 - err = binary.Read(b, binary.LittleEndian, &attributes) - if err != nil { - return nil, errors.Wrap(err, "failed to read attributes") - } - - name, err := LookupPrivilegeName("", luid) - if err != nil { - return nil, errors.Wrapf(err, "LookupPrivilegeName failed for LUID=%v", luid) - } - - rtn[name] = Privilege{ - LUID: luid, - Name: name, - EnabledByDefault: (attributes & _SE_PRIVILEGE_ENABLED_BY_DEFAULT) > 0, - Enabled: (attributes & _SE_PRIVILEGE_ENABLED) > 0, - Removed: (attributes & _SE_PRIVILEGE_REMOVED) > 0, - Used: (attributes & _SE_PRIVILEGE_USED_FOR_ACCESS) > 0, - } - } - - return rtn, nil -} - -// GetTokenUser returns the User associated with the given Token. -func GetTokenUser(token syscall.Token) (User, error) { - tokenUser, err := token.GetTokenUser() - if err != nil { - return User{}, errors.Wrap(err, "GetTokenUser failed") - } - - var user User - user.SID, err = tokenUser.User.Sid.String() - if err != nil { - return user, errors.Wrap(err, "ConvertSidToStringSid failed") - } - - user.Account, user.Domain, user.Type, err = tokenUser.User.Sid.LookupAccount("") - if err != nil { - return user, errors.Wrap(err, "LookupAccountSid failed") - } - - return user, nil -} - -// GetDebugInfo returns general debug info about the current process. -func GetDebugInfo() (*DebugInfo, error) { - h, err := windows.GetCurrentProcess() - if err != nil { - return nil, err - } - - var token syscall.Token - err = syscall.OpenProcessToken(syscall.Handle(h), syscall.TOKEN_QUERY, &token) - if err != nil { - return nil, err - } - - privs, err := GetTokenPrivileges(token) - if err != nil { - return nil, err - } - - user, err := GetTokenUser(token) - if err != nil { - return nil, err - } - - return &DebugInfo{ - User: user, - ProcessPrivs: privs, - OSVersion: GetWindowsVersion(), - Arch: runtime.GOARCH, - NumCPU: runtime.NumCPU(), - }, nil -} diff --git a/vendor/github.com/elastic/gosigar/sys/windows/syscall_windows.go b/vendor/github.com/elastic/gosigar/sys/windows/syscall_windows.go deleted file mode 100644 index 88df0febfa04..000000000000 --- a/vendor/github.com/elastic/gosigar/sys/windows/syscall_windows.go +++ /dev/null @@ -1,385 +0,0 @@ -package windows - -import ( - "fmt" - "syscall" - "time" - "unsafe" - - "github.com/pkg/errors" -) - -var ( - sizeofUint32 = 4 - sizeofProcessEntry32 = uint32(unsafe.Sizeof(ProcessEntry32{})) - sizeofProcessMemoryCountersEx = uint32(unsafe.Sizeof(ProcessMemoryCountersEx{})) - sizeofMemoryStatusEx = uint32(unsafe.Sizeof(MemoryStatusEx{})) -) - -// Process-specific access rights. Others are declared in the syscall package. -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684880(v=vs.85).aspx -const ( - PROCESS_QUERY_LIMITED_INFORMATION uint32 = 0x1000 - PROCESS_VM_READ uint32 = 0x0010 -) - -// MAX_PATH is the maximum length for a path in Windows. -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx -const MAX_PATH = 260 - -// DriveType represents a type of drive (removable, fixed, CD-ROM, RAM disk, or -// network drive). -type DriveType uint32 - -// Drive types as returned by GetDriveType. -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364939(v=vs.85).aspx -const ( - DRIVE_UNKNOWN DriveType = iota - DRIVE_NO_ROOT_DIR - DRIVE_REMOVABLE - DRIVE_FIXED - DRIVE_REMOTE - DRIVE_CDROM - DRIVE_RAMDISK -) - -func (dt DriveType) String() string { - names := map[DriveType]string{ - DRIVE_UNKNOWN: "unknown", - DRIVE_NO_ROOT_DIR: "invalid", - DRIVE_REMOVABLE: "removable", - DRIVE_FIXED: "fixed", - DRIVE_REMOTE: "remote", - DRIVE_CDROM: "cdrom", - DRIVE_RAMDISK: "ramdisk", - } - - name, found := names[dt] - if !found { - return "unknown DriveType value" - } - return name -} - -// Flags that can be used with CreateToolhelp32Snapshot. -const ( - TH32CS_INHERIT uint32 = 0x80000000 // Indicates that the snapshot handle is to be inheritable. - TH32CS_SNAPHEAPLIST uint32 = 0x00000001 // Includes all heaps of the process specified in th32ProcessID in the snapshot. - TH32CS_SNAPMODULE uint32 = 0x00000008 // Includes all modules of the process specified in th32ProcessID in the snapshot. - TH32CS_SNAPMODULE32 uint32 = 0x00000010 // Includes all 32-bit modules of the process specified in th32ProcessID in the snapshot when called from a 64-bit process. - TH32CS_SNAPPROCESS uint32 = 0x00000002 // Includes all processes in the system in the snapshot. - TH32CS_SNAPTHREAD uint32 = 0x00000004 // Includes all threads in the system in the snapshot. -) - -// ProcessEntry32 is an equivalent representation of PROCESSENTRY32 in the -// Windows API. It contains a process's information. Do not modify or reorder. -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684839(v=vs.85).aspx -type ProcessEntry32 struct { - size uint32 - CntUsage uint32 - ProcessID uint32 - DefaultHeapID uintptr - ModuleID uint32 - CntThreads uint32 - ParentProcessID uint32 - PriorityClassBase int32 - Flags uint32 - exeFile [MAX_PATH]uint16 -} - -// ExeFile returns the name of the executable file for the process. It does -// not contain the full path. -func (p ProcessEntry32) ExeFile() string { - return syscall.UTF16ToString(p.exeFile[:]) -} - -func (p ProcessEntry32) String() string { - return fmt.Sprintf("{CntUsage:%v ProcessID:%v DefaultHeapID:%v ModuleID:%v "+ - "CntThreads:%v ParentProcessID:%v PriorityClassBase:%v Flags:%v ExeFile:%v", - p.CntUsage, p.ProcessID, p.DefaultHeapID, p.ModuleID, p.CntThreads, - p.ParentProcessID, p.PriorityClassBase, p.Flags, p.ExeFile()) -} - -// MemoryStatusEx is an equivalent representation of MEMORYSTATUSEX in the -// Windows API. It contains information about the current state of both physical -// and virtual memory, including extended memory. -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366770 -type MemoryStatusEx struct { - length uint32 - MemoryLoad uint32 - TotalPhys uint64 - AvailPhys uint64 - TotalPageFile uint64 - AvailPageFile uint64 - TotalVirtual uint64 - AvailVirtual uint64 - AvailExtendedVirtual uint64 -} - -// ProcessMemoryCountersEx is an equivalent representation of -// PROCESS_MEMORY_COUNTERS_EX in the Windows API. -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684874(v=vs.85).aspx -type ProcessMemoryCountersEx struct { - cb uint32 - PageFaultCount uint32 - PeakWorkingSetSize uintptr - WorkingSetSize uintptr - QuotaPeakPagedPoolUsage uintptr - QuotaPagedPoolUsage uintptr - QuotaPeakNonPagedPoolUsage uintptr - QuotaNonPagedPoolUsage uintptr - PagefileUsage uintptr - PeakPagefileUsage uintptr - PrivateUsage uintptr -} - -// GetLogicalDriveStrings returns a list of drives in the system. -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364975(v=vs.85).aspx -func GetLogicalDriveStrings() ([]string, error) { - // Determine the size of the buffer required to receive all drives. - bufferLength, err := _GetLogicalDriveStringsW(0, nil) - if err != nil { - return nil, errors.Wrap(err, "GetLogicalDriveStringsW failed to get buffer length") - } - if bufferLength < 0 { - return nil, errors.New("GetLogicalDriveStringsW returned an invalid buffer length") - } - - buffer := make([]uint16, bufferLength) - _, err = _GetLogicalDriveStringsW(uint32(len(buffer)), &buffer[0]) - if err != nil { - return nil, errors.Wrap(err, "GetLogicalDriveStringsW failed") - } - - // Split the uint16 slice at null-terminators. - var startIdx int - var drivesUTF16 [][]uint16 - for i, value := range buffer { - if value == 0 { - drivesUTF16 = append(drivesUTF16, buffer[startIdx:i]) - startIdx = i + 1 - } - } - - // Convert the utf16 slices to strings. - drives := make([]string, 0, len(drivesUTF16)) - for _, driveUTF16 := range drivesUTF16 { - if len(driveUTF16) > 0 { - drives = append(drives, syscall.UTF16ToString(driveUTF16)) - } - } - - return drives, nil -} - -// GlobalMemoryStatusEx retrieves information about the system's current usage -// of both physical and virtual memory. -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366589(v=vs.85).aspx -func GlobalMemoryStatusEx() (MemoryStatusEx, error) { - memoryStatusEx := MemoryStatusEx{length: sizeofMemoryStatusEx} - err := _GlobalMemoryStatusEx(&memoryStatusEx) - if err != nil { - return MemoryStatusEx{}, errors.Wrap(err, "GlobalMemoryStatusEx failed") - } - - return memoryStatusEx, nil -} - -// GetProcessMemoryInfo retrieves information about the memory usage of the -// specified process. -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms683219(v=vs.85).aspx -func GetProcessMemoryInfo(handle syscall.Handle) (ProcessMemoryCountersEx, error) { - processMemoryCountersEx := ProcessMemoryCountersEx{cb: sizeofProcessMemoryCountersEx} - err := _GetProcessMemoryInfo(handle, &processMemoryCountersEx, processMemoryCountersEx.cb) - if err != nil { - return ProcessMemoryCountersEx{}, errors.Wrap(err, "GetProcessMemoryInfo failed") - } - - return processMemoryCountersEx, nil -} - -// GetProcessImageFileName Retrieves the name of the executable file for the -// specified process. -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms683217(v=vs.85).aspx -func GetProcessImageFileName(handle syscall.Handle) (string, error) { - buffer := make([]uint16, MAX_PATH) - _, err := _GetProcessImageFileName(handle, &buffer[0], uint32(len(buffer))) - if err != nil { - return "", errors.Wrap(err, "GetProcessImageFileName failed") - } - - return syscall.UTF16ToString(buffer), nil -} - -// GetSystemTimes retrieves system timing information. On a multiprocessor -// system, the values returned are the sum of the designated times across all -// processors. The returned kernel time does not include the system idle time. -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724400(v=vs.85).aspx -func GetSystemTimes() (idle, kernel, user time.Duration, err error) { - var idleTime, kernelTime, userTime syscall.Filetime - err = _GetSystemTimes(&idleTime, &kernelTime, &userTime) - if err != nil { - return 0, 0, 0, errors.Wrap(err, "GetSystemTimes failed") - } - - idle = FiletimeToDuration(&idleTime) - kernel = FiletimeToDuration(&kernelTime) // Kernel time includes idle time so we subtract it out. - user = FiletimeToDuration(&userTime) - - return idle, kernel - idle, user, nil -} - -// FiletimeToDuration converts a Filetime to a time.Duration. Do not use this -// method to convert a Filetime to an actual clock time, for that use -// Filetime.Nanosecond(). -func FiletimeToDuration(ft *syscall.Filetime) time.Duration { - n := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime) // in 100-nanosecond intervals - return time.Duration(n * 100) -} - -// GetDriveType Determines whether a disk drive is a removable, fixed, CD-ROM, -// RAM disk, or network drive. A trailing backslash is required on the -// rootPathName. -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364939 -func GetDriveType(rootPathName string) (DriveType, error) { - rootPathNamePtr, err := syscall.UTF16PtrFromString(rootPathName) - if err != nil { - return DRIVE_UNKNOWN, errors.Wrapf(err, "UTF16PtrFromString failed for rootPathName=%v", rootPathName) - } - - dt, err := _GetDriveType(rootPathNamePtr) - if err != nil { - return DRIVE_UNKNOWN, errors.Wrapf(err, "GetDriveType failed for rootPathName=%v", rootPathName) - } - - return dt, nil -} - -// EnumProcesses retrieves the process identifier for each process object in the -// system. This function can return a max of 65536 PIDs. If there are more -// processes than that then this will not return them all. -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms682629(v=vs.85).aspx -func EnumProcesses() ([]uint32, error) { - enumProcesses := func(size int) ([]uint32, error) { - var ( - pids = make([]uint32, size) - sizeBytes = len(pids) * sizeofUint32 - bytesWritten uint32 - ) - - err := _EnumProcesses(&pids[0], uint32(sizeBytes), &bytesWritten) - - pidsWritten := int(bytesWritten) / sizeofUint32 - if int(bytesWritten)%sizeofUint32 != 0 || pidsWritten > len(pids) { - return nil, errors.Errorf("EnumProcesses returned an invalid bytesWritten value of %v", bytesWritten) - } - pids = pids[:pidsWritten] - - return pids, err - } - - // Retry the EnumProcesses call with larger arrays if needed. - size := 2048 - var pids []uint32 - for tries := 0; tries < 5; tries++ { - var err error - pids, err = enumProcesses(size) - if err != nil { - return nil, errors.Wrap(err, "EnumProcesses failed") - } - - if len(pids) < size { - break - } - - // Increase the size the pids array and retry the enumProcesses call - // because the array wasn't large enough to hold all of the processes. - size *= 2 - } - - return pids, nil -} - -// GetDiskFreeSpaceEx retrieves information about the amount of space that is -// available on a disk volume, which is the total amount of space, the total -// amount of free space, and the total amount of free space available to the -// user that is associated with the calling thread. -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364937(v=vs.85).aspx -func GetDiskFreeSpaceEx(directoryName string) (freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes uint64, err error) { - directoryNamePtr, err := syscall.UTF16PtrFromString(directoryName) - if err != nil { - return 0, 0, 0, errors.Wrapf(err, "UTF16PtrFromString failed for directoryName=%v", directoryName) - } - - err = _GetDiskFreeSpaceEx(directoryNamePtr, &freeBytesAvailable, &totalNumberOfBytes, &totalNumberOfFreeBytes) - if err != nil { - return 0, 0, 0, err - } - - return freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes, nil -} - -// CreateToolhelp32Snapshot takes a snapshot of the specified processes, as well -// as the heaps, modules, and threads used by these processes. -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms682489(v=vs.85).aspx -func CreateToolhelp32Snapshot(flags, pid uint32) (syscall.Handle, error) { - h, err := _CreateToolhelp32Snapshot(flags, pid) - if err != nil { - return syscall.InvalidHandle, err - } - if h == syscall.InvalidHandle { - return syscall.InvalidHandle, syscall.GetLastError() - } - - return h, nil -} - -// Process32First retrieves information about the first process encountered in a -// system snapshot. -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684834 -func Process32First(handle syscall.Handle) (ProcessEntry32, error) { - processEntry32 := ProcessEntry32{size: sizeofProcessEntry32} - err := _Process32First(handle, &processEntry32) - if err != nil { - return ProcessEntry32{}, errors.Wrap(err, "Process32First failed") - } - - return processEntry32, nil -} - -// Process32Next retrieves information about the next process recorded in a -// system snapshot. When there are no more processes to iterate then -// syscall.ERROR_NO_MORE_FILES is returned (use errors.Cause() to unwrap). -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms684836 -func Process32Next(handle syscall.Handle) (ProcessEntry32, error) { - processEntry32 := ProcessEntry32{size: sizeofProcessEntry32} - err := _Process32Next(handle, &processEntry32) - if err != nil { - return ProcessEntry32{}, errors.Wrap(err, "Process32Next failed") - } - - return processEntry32, nil -} - -// Use "GOOS=windows go generate -v -x ." to generate the source. - -// Add -trace to enable debug prints around syscalls. -//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go syscall_windows.go - -// Windows API calls -//sys _GlobalMemoryStatusEx(buffer *MemoryStatusEx) (err error) = kernel32.GlobalMemoryStatusEx -//sys _GetLogicalDriveStringsW(bufferLength uint32, buffer *uint16) (length uint32, err error) = kernel32.GetLogicalDriveStringsW -//sys _GetProcessMemoryInfo(handle syscall.Handle, psmemCounters *ProcessMemoryCountersEx, cb uint32) (err error) = psapi.GetProcessMemoryInfo -//sys _GetProcessImageFileName(handle syscall.Handle, outImageFileName *uint16, size uint32) (length uint32, err error) = psapi.GetProcessImageFileNameW -//sys _GetSystemTimes(idleTime *syscall.Filetime, kernelTime *syscall.Filetime, userTime *syscall.Filetime) (err error) = kernel32.GetSystemTimes -//sys _GetDriveType(rootPathName *uint16) (dt DriveType, err error) = kernel32.GetDriveTypeW -//sys _EnumProcesses(processIds *uint32, sizeBytes uint32, bytesReturned *uint32) (err error) = psapi.EnumProcesses -//sys _GetDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailable *uint64, totalNumberOfBytes *uint64, totalNumberOfFreeBytes *uint64) (err error) = kernel32.GetDiskFreeSpaceExW -//sys _Process32First(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) = kernel32.Process32FirstW -//sys _Process32Next(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) = kernel32.Process32NextW -//sys _CreateToolhelp32Snapshot(flags uint32, processID uint32) (handle syscall.Handle, err error) = kernel32.CreateToolhelp32Snapshot -//sys _NtQuerySystemInformation(systemInformationClass uint32, systemInformation *byte, systemInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) = ntdll.NtQuerySystemInformation -//sys _NtQueryInformationProcess(processHandle syscall.Handle, processInformationClass uint32, processInformation *byte, processInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) = ntdll.NtQueryInformationProcess -//sys _LookupPrivilegeName(systemName string, luid *int64, buffer *uint16, size *uint32) (err error) = advapi32.LookupPrivilegeNameW -//sys _LookupPrivilegeValue(systemName string, name string, luid *int64) (err error) = advapi32.LookupPrivilegeValueW -//sys _AdjustTokenPrivileges(token syscall.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) [true] = advapi32.AdjustTokenPrivileges diff --git a/vendor/github.com/elastic/gosigar/sys/windows/version.go b/vendor/github.com/elastic/gosigar/sys/windows/version.go deleted file mode 100644 index d0bca89c141b..000000000000 --- a/vendor/github.com/elastic/gosigar/sys/windows/version.go +++ /dev/null @@ -1,43 +0,0 @@ -// +build windows - -package windows - -import ( - "fmt" - "syscall" -) - -// Version identifies a Windows version by major, minor, and build number. -type Version struct { - Major int - Minor int - Build int -} - -// GetWindowsVersion returns the Windows version information. Applications not -// manifested for Windows 8.1 or Windows 10 will return the Windows 8 OS version -// value (6.2). -// -// For a table of version numbers see: -// https://msdn.microsoft.com/en-us/library/windows/desktop/ms724833(v=vs.85).aspx -func GetWindowsVersion() Version { - // https://msdn.microsoft.com/en-us/library/windows/desktop/ms724439(v=vs.85).aspx - ver, err := syscall.GetVersion() - if err != nil { - // GetVersion should never return an error. - panic(fmt.Errorf("GetVersion failed: %v", err)) - } - - return Version{ - Major: int(ver & 0xFF), - Minor: int(ver >> 8 & 0xFF), - Build: int(ver >> 16), - } -} - -// IsWindowsVistaOrGreater returns true if the Windows version is Vista or -// greater. -func (v Version) IsWindowsVistaOrGreater() bool { - // Vista is 6.0. - return v.Major >= 6 && v.Minor >= 0 -} diff --git a/vendor/github.com/elastic/gosigar/sys/windows/zsyscall_windows.go b/vendor/github.com/elastic/gosigar/sys/windows/zsyscall_windows.go deleted file mode 100644 index 53fae4e3ba82..000000000000 --- a/vendor/github.com/elastic/gosigar/sys/windows/zsyscall_windows.go +++ /dev/null @@ -1,260 +0,0 @@ -// MACHINE GENERATED BY 'go generate' COMMAND; DO NOT EDIT - -package windows - -import "unsafe" -import "syscall" - -var _ unsafe.Pointer - -var ( - modkernel32 = syscall.NewLazyDLL("kernel32.dll") - modpsapi = syscall.NewLazyDLL("psapi.dll") - modntdll = syscall.NewLazyDLL("ntdll.dll") - modadvapi32 = syscall.NewLazyDLL("advapi32.dll") - - procGlobalMemoryStatusEx = modkernel32.NewProc("GlobalMemoryStatusEx") - procGetLogicalDriveStringsW = modkernel32.NewProc("GetLogicalDriveStringsW") - procGetProcessMemoryInfo = modpsapi.NewProc("GetProcessMemoryInfo") - procGetProcessImageFileNameW = modpsapi.NewProc("GetProcessImageFileNameW") - procGetSystemTimes = modkernel32.NewProc("GetSystemTimes") - procGetDriveTypeW = modkernel32.NewProc("GetDriveTypeW") - procEnumProcesses = modpsapi.NewProc("EnumProcesses") - procGetDiskFreeSpaceExW = modkernel32.NewProc("GetDiskFreeSpaceExW") - procProcess32FirstW = modkernel32.NewProc("Process32FirstW") - procProcess32NextW = modkernel32.NewProc("Process32NextW") - procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot") - procNtQuerySystemInformation = modntdll.NewProc("NtQuerySystemInformation") - procNtQueryInformationProcess = modntdll.NewProc("NtQueryInformationProcess") - procLookupPrivilegeNameW = modadvapi32.NewProc("LookupPrivilegeNameW") - procLookupPrivilegeValueW = modadvapi32.NewProc("LookupPrivilegeValueW") - procAdjustTokenPrivileges = modadvapi32.NewProc("AdjustTokenPrivileges") -) - -func _GlobalMemoryStatusEx(buffer *MemoryStatusEx) (err error) { - r1, _, e1 := syscall.Syscall(procGlobalMemoryStatusEx.Addr(), 1, uintptr(unsafe.Pointer(buffer)), 0, 0) - if r1 == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func _GetLogicalDriveStringsW(bufferLength uint32, buffer *uint16) (length uint32, err error) { - r0, _, e1 := syscall.Syscall(procGetLogicalDriveStringsW.Addr(), 2, uintptr(bufferLength), uintptr(unsafe.Pointer(buffer)), 0) - length = uint32(r0) - if length == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func _GetProcessMemoryInfo(handle syscall.Handle, psmemCounters *ProcessMemoryCountersEx, cb uint32) (err error) { - r1, _, e1 := syscall.Syscall(procGetProcessMemoryInfo.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(psmemCounters)), uintptr(cb)) - if r1 == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func _GetProcessImageFileName(handle syscall.Handle, outImageFileName *uint16, size uint32) (length uint32, err error) { - r0, _, e1 := syscall.Syscall(procGetProcessImageFileNameW.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(outImageFileName)), uintptr(size)) - length = uint32(r0) - if length == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func _GetSystemTimes(idleTime *syscall.Filetime, kernelTime *syscall.Filetime, userTime *syscall.Filetime) (err error) { - r1, _, e1 := syscall.Syscall(procGetSystemTimes.Addr(), 3, uintptr(unsafe.Pointer(idleTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime))) - if r1 == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func _GetDriveType(rootPathName *uint16) (dt DriveType, err error) { - r0, _, e1 := syscall.Syscall(procGetDriveTypeW.Addr(), 1, uintptr(unsafe.Pointer(rootPathName)), 0, 0) - dt = DriveType(r0) - if dt == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func _EnumProcesses(processIds *uint32, sizeBytes uint32, bytesReturned *uint32) (err error) { - r1, _, e1 := syscall.Syscall(procEnumProcesses.Addr(), 3, uintptr(unsafe.Pointer(processIds)), uintptr(sizeBytes), uintptr(unsafe.Pointer(bytesReturned))) - if r1 == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func _GetDiskFreeSpaceEx(directoryName *uint16, freeBytesAvailable *uint64, totalNumberOfBytes *uint64, totalNumberOfFreeBytes *uint64) (err error) { - r1, _, e1 := syscall.Syscall6(procGetDiskFreeSpaceExW.Addr(), 4, uintptr(unsafe.Pointer(directoryName)), uintptr(unsafe.Pointer(freeBytesAvailable)), uintptr(unsafe.Pointer(totalNumberOfBytes)), uintptr(unsafe.Pointer(totalNumberOfFreeBytes)), 0, 0) - if r1 == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func _Process32First(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) { - r1, _, e1 := syscall.Syscall(procProcess32FirstW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(processEntry32)), 0) - if r1 == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func _Process32Next(handle syscall.Handle, processEntry32 *ProcessEntry32) (err error) { - r1, _, e1 := syscall.Syscall(procProcess32NextW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(processEntry32)), 0) - if r1 == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func _CreateToolhelp32Snapshot(flags uint32, processID uint32) (handle syscall.Handle, err error) { - r0, _, e1 := syscall.Syscall(procCreateToolhelp32Snapshot.Addr(), 2, uintptr(flags), uintptr(processID), 0) - handle = syscall.Handle(r0) - if handle == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func _NtQuerySystemInformation(systemInformationClass uint32, systemInformation *byte, systemInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) { - r0, _, e1 := syscall.Syscall6(procNtQuerySystemInformation.Addr(), 4, uintptr(systemInformationClass), uintptr(unsafe.Pointer(systemInformation)), uintptr(systemInformationLength), uintptr(unsafe.Pointer(returnLength)), 0, 0) - ntstatus = uint32(r0) - if ntstatus == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func _NtQueryInformationProcess(processHandle syscall.Handle, processInformationClass uint32, processInformation *byte, processInformationLength uint32, returnLength *uint32) (ntstatus uint32, err error) { - r0, _, e1 := syscall.Syscall6(procNtQueryInformationProcess.Addr(), 5, uintptr(processHandle), uintptr(processInformationClass), uintptr(unsafe.Pointer(processInformation)), uintptr(processInformationLength), uintptr(unsafe.Pointer(returnLength)), 0) - ntstatus = uint32(r0) - if ntstatus == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func _LookupPrivilegeName(systemName string, luid *int64, buffer *uint16, size *uint32) (err error) { - var _p0 *uint16 - _p0, err = syscall.UTF16PtrFromString(systemName) - if err != nil { - return - } - return __LookupPrivilegeName(_p0, luid, buffer, size) -} - -func __LookupPrivilegeName(systemName *uint16, luid *int64, buffer *uint16, size *uint32) (err error) { - r1, _, e1 := syscall.Syscall6(procLookupPrivilegeNameW.Addr(), 4, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(luid)), uintptr(unsafe.Pointer(buffer)), uintptr(unsafe.Pointer(size)), 0, 0) - if r1 == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func _LookupPrivilegeValue(systemName string, name string, luid *int64) (err error) { - var _p0 *uint16 - _p0, err = syscall.UTF16PtrFromString(systemName) - if err != nil { - return - } - var _p1 *uint16 - _p1, err = syscall.UTF16PtrFromString(name) - if err != nil { - return - } - return __LookupPrivilegeValue(_p0, _p1, luid) -} - -func __LookupPrivilegeValue(systemName *uint16, name *uint16, luid *int64) (err error) { - r1, _, e1 := syscall.Syscall(procLookupPrivilegeValueW.Addr(), 3, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(luid))) - if r1 == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func _AdjustTokenPrivileges(token syscall.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) { - var _p0 uint32 - if releaseAll { - _p0 = 1 - } else { - _p0 = 0 - } - r0, _, e1 := syscall.Syscall6(procAdjustTokenPrivileges.Addr(), 6, uintptr(token), uintptr(_p0), uintptr(unsafe.Pointer(input)), uintptr(outputSize), uintptr(unsafe.Pointer(output)), uintptr(unsafe.Pointer(requiredSize))) - success = r0 != 0 - if true { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} diff --git a/vendor/github.com/ethereum/ethash/src/libethash/CMakeLists.txt b/vendor/github.com/ethereum/ethash/src/libethash/CMakeLists.txt deleted file mode 100644 index a65621c3e9e6..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/CMakeLists.txt +++ /dev/null @@ -1,44 +0,0 @@ -set(LIBRARY ethash) - -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 - ethash.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 5.6.2) -endif() - -if (CRYPTOPP_FOUND) - add_definitions(-DWITH_CRYPTOPP) - include_directories( ${CRYPTOPP_INCLUDE_DIRS} ) - list(APPEND FILES sha3_cryptopp.cpp sha3_cryptopp.h) -else() - list(APPEND FILES sha3.c sha3.h) -endif() - -add_library(${LIBRARY} ${FILES}) - -if (CRYPTOPP_FOUND) - TARGET_LINK_LIBRARIES(${LIBRARY} ${CRYPTOPP_LIBRARIES}) -endif() diff --git a/vendor/github.com/ethereum/ethash/src/libethash/compiler.h b/vendor/github.com/ethereum/ethash/src/libethash/compiler.h deleted file mode 100644 index 9695871cdc8a..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/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/ethereum/ethash/src/libethash/data_sizes.h b/vendor/github.com/ethereum/ethash/src/libethash/data_sizes.h deleted file mode 100644 index 83cc30bcbabe..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/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/ethereum/ethash/src/libethash/endian.h b/vendor/github.com/ethereum/ethash/src/libethash/endian.h deleted file mode 100644 index 5b8abf03d309..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/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 ethash_swap_u32(input_) _byteswap_ulong(input_) -#define ethash_swap_u64(input_) _byteswap_uint64(input_) -#elif defined(__APPLE__) -#include -#define ethash_swap_u32(input_) OSSwapInt32(input_) -#define ethash_swap_u64(input_) OSSwapInt64(input_) -#elif defined(__FreeBSD__) || defined(__DragonFly__) || defined(__NetBSD__) -#define ethash_swap_u32(input_) bswap32(input_) -#define ethash_swap_u64(input_) bswap64(input_) -#elif defined(__OpenBSD__) -#include -#define ethash_swap_u32(input_) swap32(input_) -#define ethash_swap_u64(input_) swap64(input_) -#else // posix -#include -#define ethash_swap_u32(input_) bswap_32(input_) -#define ethash_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_ = ethash_swap_u32(src_) -#define fix_endian32_same(val_) val_ = ethash_swap_u32(val_) -#define fix_endian64(dst_, src_) dst_ = ethash_swap_u64(src_) -#define fix_endian64_same(val_) val_ = ethash_swap_u64(val_) -#define fix_endian_arr32(arr_, size_) \ - do { \ - for (unsigned i_ = 0; i_ < (size_); ++i_) { \ - arr_[i_] = ethash_swap_u32(arr_[i_]); \ - } \ - } while (0) -#define fix_endian_arr64(arr_, size_) \ - do { \ - for (unsigned i_ = 0; i_ < (size_); ++i_) { \ - arr_[i_] = ethash_swap_u64(arr_[i_]); \ - } \ - } while (0) -#else -# error "endian not supported" -#endif // BYTE_ORDER diff --git a/vendor/github.com/ethereum/ethash/src/libethash/ethash.h b/vendor/github.com/ethereum/ethash/src/libethash/ethash.h deleted file mode 100644 index 0c6a1f9e90a9..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/ethash.h +++ /dev/null @@ -1,147 +0,0 @@ -/* - This file is part of ethash. - - ethash 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. - - ethash 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 ethash. If not, see . -*/ - -/** @file ethash.h -* @date 2015 -*/ -#pragma once - -#include -#include -#include -#include -#include "compiler.h" - -#define ETHASH_REVISION 23 -#define ETHASH_DATASET_BYTES_INIT 1073741824U // 2**30 -#define ETHASH_DATASET_BYTES_GROWTH 8388608U // 2**23 -#define ETHASH_CACHE_BYTES_INIT 1073741824U // 2**24 -#define ETHASH_CACHE_BYTES_GROWTH 131072U // 2**17 -#define ETHASH_EPOCH_LENGTH 30000U -#define ETHASH_MIX_BYTES 128 -#define ETHASH_HASH_BYTES 64 -#define ETHASH_DATASET_PARENTS 256 -#define ETHASH_CACHE_ROUNDS 3 -#define ETHASH_ACCESSES 64 -#define ETHASH_DAG_MAGIC_NUM_SIZE 8 -#define ETHASH_DAG_MAGIC_NUM 0xFEE1DEADBADDCAFE - -#ifdef __cplusplus -extern "C" { -#endif - -/// Type of a seedhash/blockhash e.t.c. -typedef struct ethash_h256 { uint8_t b[32]; } ethash_h256_t; - -// convenience macro to statically initialize an h256_t -// usage: -// ethash_h256_t a = ethash_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 ethash_h256_static_init(...) \ - { {__VA_ARGS__} } - -struct ethash_light; -typedef struct ethash_light* ethash_light_t; -struct ethash_full; -typedef struct ethash_full* ethash_full_t; -typedef int(*ethash_callback_t)(unsigned); - -typedef struct ethash_return_value { - ethash_h256_t result; - ethash_h256_t mix_hash; - bool success; -} ethash_return_value_t; - -/** - * Allocate and initialize a new ethash_light handler - * - * @param block_number The block number for which to create the handler - * @return Newly allocated ethash_light handler or NULL in case of - * ERRNOMEM or invalid parameters used for @ref ethash_compute_cache_nodes() - */ -ethash_light_t ethash_light_new(uint64_t block_number); -/** - * Frees a previously allocated ethash_light handler - * @param light The light handler to free - */ -void ethash_light_delete(ethash_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 ethash_return_value_t holding the return values - */ -ethash_return_value_t ethash_light_compute( - ethash_light_t light, - ethash_h256_t const header_hash, - uint64_t nonce -); - -/** - * Allocate and initialize a new ethash_full handler - * - * @param light The light handler containing the cache. - * @param callback A callback function with signature of @ref ethash_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 ethash_full handler or NULL in case of - * ERRNOMEM or invalid parameters used for @ref ethash_compute_full_data() - */ -ethash_full_t ethash_full_new(ethash_light_t light, ethash_callback_t callback); - -/** - * Frees a previously allocated ethash_full handler - * @param full The light handler to free - */ -void ethash_full_delete(ethash_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 ethash_return_value to hold the return value - */ -ethash_return_value_t ethash_full_compute( - ethash_full_t full, - ethash_h256_t const header_hash, - uint64_t nonce -); -/** - * Get a pointer to the full DAG data - */ -void const* ethash_full_dag(ethash_full_t full); -/** - * Get the size of the DAG data - */ -uint64_t ethash_full_dag_size(ethash_full_t full); - -/** - * Calculate the seedhash for a given block number - */ -ethash_h256_t ethash_get_seedhash(uint64_t block_number); - -#ifdef __cplusplus -} -#endif diff --git a/vendor/github.com/ethereum/ethash/src/libethash/fnv.h b/vendor/github.com/ethereum/ethash/src/libethash/fnv.h deleted file mode 100644 index 82cd655c41c9..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/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/ethereum/ethash/src/libethash/internal.c b/vendor/github.com/ethereum/ethash/src/libethash/internal.c deleted file mode 100644 index 0a830fc824dc..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/internal.c +++ /dev/null @@ -1,507 +0,0 @@ -/* - This file is part of ethash. - - ethash 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. - - ethash 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 "ethash.h" -#include "fnv.h" -#include "endian.h" -#include "internal.h" -#include "data_sizes.h" -#include "io.h" - -#ifdef WITH_CRYPTOPP - -#include "sha3_cryptopp.h" - -#else -#include "sha3.h" -#endif // WITH_CRYPTOPP - -uint64_t ethash_get_datasize(uint64_t const block_number) -{ - assert(block_number / ETHASH_EPOCH_LENGTH < 2048); - return dag_sizes[block_number / ETHASH_EPOCH_LENGTH]; -} - -uint64_t ethash_get_cachesize(uint64_t const block_number) -{ - assert(block_number / ETHASH_EPOCH_LENGTH < 2048); - return cache_sizes[block_number / ETHASH_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 ethash_compute_cache_nodes( - node* const nodes, - uint64_t cache_size, - ethash_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 != ETHASH_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; -} - -void ethash_calculate_dag_item( - node* const ret, - uint32_t node_index, - ethash_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 != ETHASH_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 ethash_compute_full_data( - void* mem, - uint64_t full_size, - ethash_light_t const light, - ethash_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; - ethash_calculate_dag_item(&(full_nodes[n]), n, light); - } - return true; -} - -static bool ethash_hash( - ethash_return_value_t* ret, - node const* full_nodes, - ethash_light_t const light, - uint64_t full_size, - ethash_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 != ETHASH_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; - ethash_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 ethash_quick_hash( - ethash_h256_t* return_hash, - ethash_h256_t const* header_hash, - uint64_t nonce, - ethash_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); -} - -ethash_h256_t ethash_get_seedhash(uint64_t block_number) -{ - ethash_h256_t ret; - ethash_h256_reset(&ret); - uint64_t const epochs = block_number / ETHASH_EPOCH_LENGTH; - for (uint32_t i = 0; i < epochs; ++i) - SHA3_256(&ret, (uint8_t*)&ret, 32); - return ret; -} - -bool ethash_quick_check_difficulty( - ethash_h256_t const* header_hash, - uint64_t const nonce, - ethash_h256_t const* mix_hash, - ethash_h256_t const* boundary -) -{ - - ethash_h256_t return_hash; - ethash_quick_hash(&return_hash, header_hash, nonce, mix_hash); - return ethash_check_difficulty(&return_hash, boundary); -} - -ethash_light_t ethash_light_new_internal(uint64_t cache_size, ethash_h256_t const* seed) -{ - struct ethash_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 (!ethash_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; -} - -ethash_light_t ethash_light_new(uint64_t block_number) -{ - ethash_h256_t seedhash = ethash_get_seedhash(block_number); - ethash_light_t ret; - ret = ethash_light_new_internal(ethash_get_cachesize(block_number), &seedhash); - ret->block_number = block_number; - return ret; -} - -void ethash_light_delete(ethash_light_t light) -{ - if (light->cache) { - free(light->cache); - } - free(light); -} - -ethash_return_value_t ethash_light_compute_internal( - ethash_light_t light, - uint64_t full_size, - ethash_h256_t const header_hash, - uint64_t nonce -) -{ - ethash_return_value_t ret; - ret.success = true; - if (!ethash_hash(&ret, NULL, light, full_size, header_hash, nonce)) { - ret.success = false; - } - return ret; -} - -ethash_return_value_t ethash_light_compute( - ethash_light_t light, - ethash_h256_t const header_hash, - uint64_t nonce -) -{ - uint64_t full_size = ethash_get_datasize(light->block_number); - return ethash_light_compute_internal(light, full_size, header_hash, nonce); -} - -static bool ethash_mmap(struct ethash_full* ret, FILE* f) -{ - int fd; - char* mmapped_data; - errno = 0; - ret->file = f; - if ((fd = ethash_fileno(ret->file)) == -1) { - return false; - } - mmapped_data= mmap( - NULL, - (size_t)ret->file_size + ETHASH_DAG_MAGIC_NUM_SIZE, - PROT_READ | PROT_WRITE, - MAP_SHARED, - fd, - 0 - ); - if (mmapped_data == MAP_FAILED) { - return false; - } - ret->data = (node*)(mmapped_data + ETHASH_DAG_MAGIC_NUM_SIZE); - return true; -} - -ethash_full_t ethash_full_new_internal( - char const* dirname, - ethash_h256_t const seed_hash, - uint64_t full_size, - ethash_light_t const light, - ethash_callback_t callback -) -{ - struct ethash_full* ret; - FILE *f = NULL; - ret = calloc(sizeof(*ret), 1); - if (!ret) { - return NULL; - } - ret->file_size = (size_t)full_size; - switch (ethash_io_prepare(dirname, seed_hash, &f, (size_t)full_size, false)) { - case ETHASH_IO_FAIL: - // ethash_io_prepare will do all ETHASH_CRITICAL() logging in fail case - goto fail_free_full; - case ETHASH_IO_MEMO_MATCH: - if (!ethash_mmap(ret, f)) { - ETHASH_CRITICAL("mmap failure()"); - goto fail_close_file; - } - return ret; - case ETHASH_IO_MEMO_SIZE_MISMATCH: - // if a DAG of same filename but unexpected size is found, silently force new file creation - if (ethash_io_prepare(dirname, seed_hash, &f, (size_t)full_size, true) != ETHASH_IO_MEMO_MISMATCH) { - ETHASH_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 ETHASH_IO_MEMO_MISMATCH: - if (!ethash_mmap(ret, f)) { - ETHASH_CRITICAL("mmap failure()"); - goto fail_close_file; - } - break; - } - - if (!ethash_compute_full_data(ret->data, full_size, light, callback)) { - ETHASH_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) { - ETHASH_CRITICAL("Could not seek to DAG file start to write magic number."); - goto fail_free_full_data; - } - uint64_t const magic_num = ETHASH_DAG_MAGIC_NUM; - if (fwrite(&magic_num, ETHASH_DAG_MAGIC_NUM_SIZE, 1, f) != 1) { - ETHASH_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 - ETHASH_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; -} - -ethash_full_t ethash_full_new(ethash_light_t light, ethash_callback_t callback) -{ - char strbuf[256]; - if (!ethash_get_default_dirname(strbuf, 256)) { - return NULL; - } - uint64_t full_size = ethash_get_datasize(light->block_number); - ethash_h256_t seedhash = ethash_get_seedhash(light->block_number); - return ethash_full_new_internal(strbuf, seedhash, full_size, light, callback); -} - -void ethash_full_delete(ethash_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); -} - -ethash_return_value_t ethash_full_compute( - ethash_full_t full, - ethash_h256_t const header_hash, - uint64_t nonce -) -{ - ethash_return_value_t ret; - ret.success = true; - if (!ethash_hash( - &ret, - (node const*)full->data, - NULL, - full->file_size, - header_hash, - nonce)) { - ret.success = false; - } - return ret; -} - -void const* ethash_full_dag(ethash_full_t full) -{ - return full->data; -} - -uint64_t ethash_full_dag_size(ethash_full_t full) -{ - return full->file_size; -} diff --git a/vendor/github.com/ethereum/ethash/src/libethash/internal.h b/vendor/github.com/ethereum/ethash/src/libethash/internal.h deleted file mode 100644 index 26c395ad6f0e..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/internal.h +++ /dev/null @@ -1,179 +0,0 @@ -#pragma once -#include "compiler.h" -#include "endian.h" -#include "ethash.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 (ETHASH_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 ethash_h256_get(ethash_h256_t const* hash, unsigned int i) -{ - return hash->b[i]; -} - -static inline void ethash_h256_set(ethash_h256_t* hash, unsigned int i, uint8_t v) -{ - hash->b[i] = v; -} - -static inline void ethash_h256_reset(ethash_h256_t* hash) -{ - memset(hash, 0, 32); -} - -// Returns if hash is less than or equal to boundary (2^256/difficulty) -static inline bool ethash_check_difficulty( - ethash_h256_t const* hash, - ethash_h256_t const* boundary -) -{ - // Boundary is big endian - for (int i = 0; i < 32; i++) { - if (ethash_h256_get(hash, i) == ethash_h256_get(boundary, i)) { - continue; - } - return ethash_h256_get(hash, i) < ethash_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 ethash_quick_check_difficulty( - ethash_h256_t const* header_hash, - uint64_t const nonce, - ethash_h256_t const* mix_hash, - ethash_h256_t const* boundary -); - -struct ethash_light { - void* cache; - uint64_t cache_size; - uint64_t block_number; -}; - -/** - * Allocate and initialize a new ethash_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 ethash_light handler or NULL in case of - * ERRNOMEM or invalid parameters used for @ref ethash_compute_cache_nodes() - */ -ethash_light_t ethash_light_new_internal(uint64_t cache_size, ethash_h256_t const* seed); - -/** - * 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. - */ -ethash_return_value_t ethash_light_compute_internal( - ethash_light_t light, - uint64_t full_size, - ethash_h256_t const header_hash, - uint64_t nonce -); - -struct ethash_full { - FILE* file; - uint64_t file_size; - node* data; -}; - -/** - * Allocate and initialize a new ethash_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 ethash_cache_new(). - * Iff this function succeeds the ethash_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 ethash_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 ethash_full handler or NULL in case of - * ERRNOMEM or invalid parameters used for @ref ethash_compute_full_data() - */ -ethash_full_t ethash_full_new_internal( - char const* dirname, - ethash_h256_t const seed_hash, - uint64_t full_size, - ethash_light_t const light, - ethash_callback_t callback -); - -void ethash_calculate_dag_item( - node* const ret, - uint32_t node_index, - ethash_light_t const cache -); - -void ethash_quick_hash( - ethash_h256_t* return_hash, - ethash_h256_t const* header_hash, - const uint64_t nonce, - ethash_h256_t const* mix_hash -); - -uint64_t ethash_get_datasize(uint64_t const block_number); -uint64_t ethash_get_cachesize(uint64_t const block_number); - -/** - * Compute the memory data for a full node's memory - * - * @param mem A pointer to an ethash 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 ethash_full_new() for details. - * @return true if all went fine and false for invalid parameters - */ -bool ethash_compute_full_data( - void* mem, - uint64_t full_size, - ethash_light_t const light, - ethash_callback_t callback -); - -#ifdef __cplusplus -} -#endif diff --git a/vendor/github.com/ethereum/ethash/src/libethash/io.c b/vendor/github.com/ethereum/ethash/src/libethash/io.c deleted file mode 100644 index f4db477c200b..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/io.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - This file is part of ethash. - - ethash 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. - - ethash 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 ethash. If not, see . -*/ -/** @file io.c - * @author Lefteris Karapetsas - * @date 2015 - */ -#include "io.h" -#include -#include -#include - -enum ethash_io_rc ethash_io_prepare( - char const* dirname, - ethash_h256_t const seedhash, - FILE** output_file, - uint64_t file_size, - bool force_create -) -{ - char mutable_name[DAG_MUTABLE_NAME_MAX_SIZE]; - enum ethash_io_rc ret = ETHASH_IO_FAIL; - // reset errno before io calls - errno = 0; - - // assert directory exists - if (!ethash_mkdir(dirname)) { - ETHASH_CRITICAL("Could not create the ethash directory"); - goto end; - } - - ethash_io_mutable_name(ETHASH_REVISION, &seedhash, mutable_name); - char* tmpfile = ethash_io_create_filename(dirname, mutable_name, strlen(mutable_name)); - if (!tmpfile) { - ETHASH_CRITICAL("Could not create the full DAG pathname"); - goto end; - } - - FILE *f; - if (!force_create) { - // try to open the file - f = ethash_fopen(tmpfile, "rb+"); - if (f) { - size_t found_size; - if (!ethash_file_size(f, &found_size)) { - fclose(f); - ETHASH_CRITICAL("Could not query size of DAG file: \"%s\"", tmpfile); - goto free_memo; - } - if (file_size != found_size - ETHASH_DAG_MAGIC_NUM_SIZE) { - fclose(f); - ret = ETHASH_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, ETHASH_DAG_MAGIC_NUM_SIZE, 1, f) != 1) { - // I/O error - fclose(f); - ETHASH_CRITICAL("Could not read from DAG file: \"%s\"", tmpfile); - ret = ETHASH_IO_MEMO_SIZE_MISMATCH; - goto free_memo; - } - if (magic_num != ETHASH_DAG_MAGIC_NUM) { - fclose(f); - ret = ETHASH_IO_MEMO_SIZE_MISMATCH; - goto free_memo; - } - ret = ETHASH_IO_MEMO_MATCH; - goto set_file; - } - } - - // file does not exist, will need to be created - f = ethash_fopen(tmpfile, "wb+"); - if (!f) { - ETHASH_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 + ETHASH_DAG_MAGIC_NUM_SIZE - 1), SEEK_SET) != 0) { - fclose(f); - ETHASH_CRITICAL("Could not seek to the end of DAG file: \"%s\". Insufficient space?", tmpfile); - goto free_memo; - } - if (fputc('\n', f) == EOF) { - fclose(f); - ETHASH_CRITICAL("Could not write in the end of DAG file: \"%s\". Insufficient space?", tmpfile); - goto free_memo; - } - if (fflush(f) != 0) { - fclose(f); - ETHASH_CRITICAL("Could not flush at end of DAG file: \"%s\". Insufficient space?", tmpfile); - goto free_memo; - } - ret = ETHASH_IO_MEMO_MISMATCH; - goto set_file; - - ret = ETHASH_IO_MEMO_MATCH; -set_file: - *output_file = f; -free_memo: - free(tmpfile); -end: - return ret; -} diff --git a/vendor/github.com/ethereum/ethash/src/libethash/io.h b/vendor/github.com/ethereum/ethash/src/libethash/io.h deleted file mode 100644 index 7a27089c7d2b..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/io.h +++ /dev/null @@ -1,202 +0,0 @@ -/* - This file is part of ethash. - - ethash 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. - - ethash 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 ethash. 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 "ethash.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/Ethash-DAG -#define DAG_MUTABLE_NAME_MAX_SIZE (6 + 10 + 1 + 16 + 1) -/// Possible return values of @see ethash_io_prepare -enum ethash_io_rc { - ETHASH_IO_FAIL = 0, ///< There has been an IO failure - ETHASH_IO_MEMO_SIZE_MISMATCH, ///< DAG with revision/hash match, but file size was wrong. - ETHASH_IO_MEMO_MISMATCH, ///< The DAG file did not exist or there was revision/hash mismatch - ETHASH_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 ethash. Should mostly help - * figure out what kind of problem (I/O, memory e.t.c.) causes a NULL - * ethash_full_t - */ -#ifdef ETHASH_PRINT_CRITICAL_OUTPUT -#define ETHASH_CRITICAL(...) \ - do \ - { \ - printf("ETHASH CRITICAL ERROR: "__VA_ARGS__); \ - printf("\n"); \ - fflush(stdout); \ - } while (0) -#else -#define ETHASH_CRITICAL(...) -#endif - -/** - * Prepares io for ethash - * - * 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 ethash - * 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/Ethash-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 ethash_io_rc - */ -enum ethash_io_rc ethash_io_prepare( - char const* dirname, - ethash_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* ethash_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* ethash_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 ethash_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 ethash_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 ethash_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* ethash_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/Ethash-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 ethash_get_default_dirname(char* strbuf, size_t buffsize); - -static inline bool ethash_io_mutable_name( - uint32_t revision, - ethash_h256_t const* seed_hash, - char* output -) -{ - uint64_t hash = *((uint64_t*)seed_hash); -#if LITTLE_ENDIAN == BYTE_ORDER - hash = ethash_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/ethereum/ethash/src/libethash/io_posix.c b/vendor/github.com/ethereum/ethash/src/libethash/io_posix.c deleted file mode 100644 index c9a17d845efa..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/io_posix.c +++ /dev/null @@ -1,111 +0,0 @@ -/* - This file is part of ethash. - - ethash 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. - - ethash 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 ethash. If not, see . -*/ -/** @file io_posix.c - * @author Lefteris Karapetsas - * @date 2015 - */ - -#include "io.h" -#include -#include -#include -#include -#include -#include -#include -#include - -FILE* ethash_fopen(char const* file_name, char const* mode) -{ - return fopen(file_name, mode); -} - -char* ethash_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 ethash_mkdir(char const* dirname) -{ - int rc = mkdir(dirname, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); - return rc != -1 || errno == EEXIST; -} - -int ethash_fileno(FILE *f) -{ - return fileno(f); -} - -char* ethash_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'; - ethash_strncat(name, dest_size, dirname, dirlen); - if (dirname[dirlen] != '/') { - ethash_strncat(name, dest_size, "/", 1); - } - ethash_strncat(name, dest_size, filename, filename_length); - return name; -} - -bool ethash_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 ethash_get_default_dirname(char* strbuf, size_t buffsize) -{ - static const char dir_suffix[] = ".ethash/"; - 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 (!ethash_strncat(strbuf, buffsize, home_dir, len)) { - return false; - } - if (home_dir[len] != '/') { - if (!ethash_strncat(strbuf, buffsize, "/", 1)) { - return false; - } - } - return ethash_strncat(strbuf, buffsize, dir_suffix, sizeof(dir_suffix)); -} diff --git a/vendor/github.com/ethereum/ethash/src/libethash/io_win32.c b/vendor/github.com/ethereum/ethash/src/libethash/io_win32.c deleted file mode 100644 index 34f1aaa774b6..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/io_win32.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - This file is part of ethash. - - ethash 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. - - ethash 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 ethash. If not, see . -*/ -/** @file io_win32.c - * @author Lefteris Karapetsas - * @date 2015 - */ - -#include "io.h" -#include -#include -#include -#include -#include -#include - -FILE* ethash_fopen(char const* file_name, char const* mode) -{ - FILE* f; - return fopen_s(&f, file_name, mode) == 0 ? f : NULL; -} - -char* ethash_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 ethash_mkdir(char const* dirname) -{ - int rc = _mkdir(dirname); - return rc != -1 || errno == EEXIST; -} - -int ethash_fileno(FILE* f) -{ - return _fileno(f); -} - -char* ethash_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'; - ethash_strncat(name, dest_size, dirname, dirlen); - if (dirname[dirlen] != '\\' || dirname[dirlen] != '/') { - ethash_strncat(name, dest_size, "\\", 1); - } - ethash_strncat(name, dest_size, filename, filename_length); - return name; -} - -bool ethash_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 ethash_get_default_dirname(char* strbuf, size_t buffsize) -{ - static const char dir_suffix[] = "Ethash\\"; - strbuf[0] = '\0'; - if (!SUCCEEDED(SHGetFolderPathA(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, (CHAR*)strbuf))) { - return false; - } - if (!ethash_strncat(strbuf, buffsize, "\\", 1)) { - return false; - } - - return ethash_strncat(strbuf, buffsize, dir_suffix, sizeof(dir_suffix)); -} diff --git a/vendor/github.com/ethereum/ethash/src/libethash/mmap.h b/vendor/github.com/ethereum/ethash/src/libethash/mmap.h deleted file mode 100644 index 1e226e83fdce..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/mmap.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - This file is part of ethash. - - ethash 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. - - ethash 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 ethash. 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/ethereum/ethash/src/libethash/mmap_win32.c b/vendor/github.com/ethereum/ethash/src/libethash/mmap_win32.c deleted file mode 100644 index 42968b98a495..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/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/ethereum/ethash/src/libethash/sha3.c b/vendor/github.com/ethereum/ethash/src/libethash/sha3.c deleted file mode 100644 index e72fe10184f5..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/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/ethereum/ethash/src/libethash/sha3.h b/vendor/github.com/ethereum/ethash/src/libethash/sha3.h deleted file mode 100644 index a38006292f43..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/sha3.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -#include "compiler.h" -#include -#include - -struct ethash_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 ethash_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/ethereum/ethash/src/libethash/sha3_cryptopp.cpp b/vendor/github.com/ethereum/ethash/src/libethash/sha3_cryptopp.cpp deleted file mode 100644 index 2a7c02664cd6..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/sha3_cryptopp.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/* - This file is part of ethash. - - ethash 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. - - ethash 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 ethash. If not, see . -*/ - -/** @file sha3.cpp -* @author Tim Hughes -* @date 2015 -*/ -#include -#include - -extern "C" { -struct ethash_h256; -typedef struct ethash_h256 ethash_h256_t; -void SHA3_256(ethash_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/ethereum/ethash/src/libethash/sha3_cryptopp.h b/vendor/github.com/ethereum/ethash/src/libethash/sha3_cryptopp.h deleted file mode 100644 index 9edc407d50eb..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/sha3_cryptopp.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#include "compiler.h" -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -struct ethash_h256; - -void SHA3_256(struct ethash_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/ethereum/ethash/src/libethash/util.h b/vendor/github.com/ethereum/ethash/src/libethash/util.h deleted file mode 100644 index c5fc6e55b5fc..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/util.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - This file is part of ethash. - - ethash 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. - - ethash 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 ethash. 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/ethereum/ethash/src/libethash/util_win32.c b/vendor/github.com/ethereum/ethash/src/libethash/util_win32.c deleted file mode 100644 index 268e6db056b2..000000000000 --- a/vendor/github.com/ethereum/ethash/src/libethash/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/fatih/color/LICENSE.md b/vendor/github.com/fatih/color/LICENSE.md deleted file mode 100644 index 25fdaf639dfc..000000000000 --- a/vendor/github.com/fatih/color/LICENSE.md +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Fatih Arslan - -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/fatih/color/README.md b/vendor/github.com/fatih/color/README.md deleted file mode 100644 index 25abbca3f844..000000000000 --- a/vendor/github.com/fatih/color/README.md +++ /dev/null @@ -1,175 +0,0 @@ -# Color [![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](http://godoc.org/github.com/fatih/color) [![Build Status](http://img.shields.io/travis/fatih/color.svg?style=flat-square)](https://travis-ci.org/fatih/color) - - - -Color lets you use colorized outputs in terms of [ANSI Escape -Codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) in Go (Golang). It -has support for Windows too! The API can be used in several ways, pick one that -suits you. - - - -![Color](http://i.imgur.com/c1JI0lA.png) - - -## Install - -```bash -go get github.com/fatih/color -``` - -## Examples - -### Standard colors - -```go -// Print with default helper functions -color.Cyan("Prints text in cyan.") - -// A newline will be appended automatically -color.Blue("Prints %s in blue.", "text") - -// These are using the default foreground colors -color.Red("We have red") -color.Magenta("And many others ..") - -``` - -### Mix and reuse colors - -```go -// Create a new color object -c := color.New(color.FgCyan).Add(color.Underline) -c.Println("Prints cyan text with an underline.") - -// Or just add them to New() -d := color.New(color.FgCyan, color.Bold) -d.Printf("This prints bold cyan %s\n", "too!.") - -// Mix up foreground and background colors, create new mixes! -red := color.New(color.FgRed) - -boldRed := red.Add(color.Bold) -boldRed.Println("This will print text in bold red.") - -whiteBackground := red.Add(color.BgWhite) -whiteBackground.Println("Red text with white background.") -``` - -### Use your own output (io.Writer) - -```go -// Use your own io.Writer output -color.New(color.FgBlue).Fprintln(myWriter, "blue color!") - -blue := color.New(color.FgBlue) -blue.Fprint(writer, "This will print text in blue.") -``` - -### Custom print functions (PrintFunc) - -```go -// Create a custom print function for convenience -red := color.New(color.FgRed).PrintfFunc() -red("Warning") -red("Error: %s", err) - -// Mix up multiple attributes -notice := color.New(color.Bold, color.FgGreen).PrintlnFunc() -notice("Don't forget this...") -``` - -### Custom fprint functions (FprintFunc) - -```go -blue := color.New(FgBlue).FprintfFunc() -blue(myWriter, "important notice: %s", stars) - -// Mix up with multiple attributes -success := color.New(color.Bold, color.FgGreen).FprintlnFunc() -success(myWriter, "Don't forget this...") -``` - -### Insert into noncolor strings (SprintFunc) - -```go -// Create SprintXxx functions to mix strings with other non-colorized strings: -yellow := color.New(color.FgYellow).SprintFunc() -red := color.New(color.FgRed).SprintFunc() -fmt.Printf("This is a %s and this is %s.\n", yellow("warning"), red("error")) - -info := color.New(color.FgWhite, color.BgGreen).SprintFunc() -fmt.Printf("This %s rocks!\n", info("package")) - -// Use helper functions -fmt.Println("This", color.RedString("warning"), "should be not neglected.") -fmt.Printf("%v %v\n", color.GreenString("Info:"), "an important message.") - -// Windows supported too! Just don't forget to change the output to color.Output -fmt.Fprintf(color.Output, "Windows support: %s", color.GreenString("PASS")) -``` - -### Plug into existing code - -```go -// Use handy standard colors -color.Set(color.FgYellow) - -fmt.Println("Existing text will now be in yellow") -fmt.Printf("This one %s\n", "too") - -color.Unset() // Don't forget to unset - -// You can mix up parameters -color.Set(color.FgMagenta, color.Bold) -defer color.Unset() // Use it in your function - -fmt.Println("All text will now be bold magenta.") -``` - -### Disable color - -There might be a case where you want to disable color output (for example to -pipe the standard output of your app to somewhere else). `Color` has support to -disable colors both globally and for single color definition. For example -suppose you have a CLI app and a `--no-color` bool flag. You can easily disable -the color output with: - -```go - -var flagNoColor = flag.Bool("no-color", false, "Disable color output") - -if *flagNoColor { - color.NoColor = true // disables colorized output -} -``` - -It also has support for single color definitions (local). You can -disable/enable color output on the fly: - -```go -c := color.New(color.FgCyan) -c.Println("Prints cyan text") - -c.DisableColor() -c.Println("This is printed without any color") - -c.EnableColor() -c.Println("This prints again cyan...") -``` - -## Todo - -* Save/Return previous values -* Evaluate fmt.Formatter interface - - -## Credits - - * [Fatih Arslan](https://github.com/fatih) - * Windows support via @mattn: [colorable](https://github.com/mattn/go-colorable) - -## License - -The MIT License (MIT) - see [`LICENSE.md`](https://github.com/fatih/color/blob/master/LICENSE.md) for more details - diff --git a/vendor/github.com/fatih/color/color.go b/vendor/github.com/fatih/color/color.go deleted file mode 100644 index 34cd8e4c8ac1..000000000000 --- a/vendor/github.com/fatih/color/color.go +++ /dev/null @@ -1,525 +0,0 @@ -package color - -import ( - "fmt" - "io" - "os" - "strconv" - "strings" - "sync" - - "github.com/mattn/go-colorable" - "github.com/mattn/go-isatty" -) - -var ( - // NoColor defines if the output is colorized or not. It's dynamically set to - // false or true based on the stdout's file descriptor referring to a terminal - // or not. This is a global option and affects all colors. For more control - // over each color block use the methods DisableColor() individually. - NoColor = !isatty.IsTerminal(os.Stdout.Fd()) || os.Getenv("TERM") == "dumb" - - // Output defines the standard output of the print functions. By default - // os.Stdout is used. - Output = colorable.NewColorableStdout() - - // colorsCache is used to reduce the count of created Color objects and - // allows to reuse already created objects with required Attribute. - colorsCache = make(map[Attribute]*Color) - colorsCacheMu sync.Mutex // protects colorsCache -) - -// Color defines a custom color object which is defined by SGR parameters. -type Color struct { - params []Attribute - noColor *bool -} - -// Attribute defines a single SGR Code -type Attribute int - -const escape = "\x1b" - -// Base attributes -const ( - Reset Attribute = iota - Bold - Faint - Italic - Underline - BlinkSlow - BlinkRapid - ReverseVideo - Concealed - CrossedOut -) - -// Foreground text colors -const ( - FgBlack Attribute = iota + 30 - FgRed - FgGreen - FgYellow - FgBlue - FgMagenta - FgCyan - FgWhite -) - -// Foreground Hi-Intensity text colors -const ( - FgHiBlack Attribute = iota + 90 - FgHiRed - FgHiGreen - FgHiYellow - FgHiBlue - FgHiMagenta - FgHiCyan - FgHiWhite -) - -// Background text colors -const ( - BgBlack Attribute = iota + 40 - BgRed - BgGreen - BgYellow - BgBlue - BgMagenta - BgCyan - BgWhite -) - -// Background Hi-Intensity text colors -const ( - BgHiBlack Attribute = iota + 100 - BgHiRed - BgHiGreen - BgHiYellow - BgHiBlue - BgHiMagenta - BgHiCyan - BgHiWhite -) - -// New returns a newly created color object. -func New(value ...Attribute) *Color { - c := &Color{params: make([]Attribute, 0)} - c.Add(value...) - return c -} - -// Set sets the given parameters immediately. It will change the color of -// output with the given SGR parameters until color.Unset() is called. -func Set(p ...Attribute) *Color { - c := New(p...) - c.Set() - return c -} - -// Unset resets all escape attributes and clears the output. Usually should -// be called after Set(). -func Unset() { - if NoColor { - return - } - - fmt.Fprintf(Output, "%s[%dm", escape, Reset) -} - -// Set sets the SGR sequence. -func (c *Color) Set() *Color { - if c.isNoColorSet() { - return c - } - - fmt.Fprintf(Output, c.format()) - return c -} - -func (c *Color) unset() { - if c.isNoColorSet() { - return - } - - Unset() -} - -func (c *Color) setWriter(w io.Writer) *Color { - if c.isNoColorSet() { - return c - } - - fmt.Fprintf(w, c.format()) - return c -} - -func (c *Color) unsetWriter(w io.Writer) { - if c.isNoColorSet() { - return - } - - if NoColor { - return - } - - fmt.Fprintf(w, "%s[%dm", escape, Reset) -} - -// Add is used to chain SGR parameters. Use as many as parameters to combine -// and create custom color objects. Example: Add(color.FgRed, color.Underline). -func (c *Color) Add(value ...Attribute) *Color { - c.params = append(c.params, value...) - return c -} - -func (c *Color) prepend(value Attribute) { - c.params = append(c.params, 0) - copy(c.params[1:], c.params[0:]) - c.params[0] = value -} - -// Fprint formats using the default formats for its operands and writes to w. -// Spaces are added between operands when neither is a string. -// It returns the number of bytes written and any write error encountered. -// On Windows, users should wrap w with colorable.NewColorable() if w is of -// type *os.File. -func (c *Color) Fprint(w io.Writer, a ...interface{}) (n int, err error) { - c.setWriter(w) - defer c.unsetWriter(w) - - return fmt.Fprint(w, a...) -} - -// Print formats using the default formats for its operands and writes to -// standard output. Spaces are added between operands when neither is a -// string. It returns the number of bytes written and any write error -// encountered. This is the standard fmt.Print() method wrapped with the given -// color. -func (c *Color) Print(a ...interface{}) (n int, err error) { - c.Set() - defer c.unset() - - return fmt.Fprint(Output, a...) -} - -// Fprintf formats according to a format specifier and writes to w. -// It returns the number of bytes written and any write error encountered. -// On Windows, users should wrap w with colorable.NewColorable() if w is of -// type *os.File. -func (c *Color) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) { - c.setWriter(w) - defer c.unsetWriter(w) - - return fmt.Fprintf(w, format, a...) -} - -// Printf formats according to a format specifier and writes to standard output. -// It returns the number of bytes written and any write error encountered. -// This is the standard fmt.Printf() method wrapped with the given color. -func (c *Color) Printf(format string, a ...interface{}) (n int, err error) { - c.Set() - defer c.unset() - - return fmt.Fprintf(Output, format, a...) -} - -// Fprintln formats using the default formats for its operands and writes to w. -// Spaces are always added between operands and a newline is appended. -// On Windows, users should wrap w with colorable.NewColorable() if w is of -// type *os.File. -func (c *Color) Fprintln(w io.Writer, a ...interface{}) (n int, err error) { - c.setWriter(w) - defer c.unsetWriter(w) - - return fmt.Fprintln(w, a...) -} - -// Println formats using the default formats for its operands and writes to -// standard output. Spaces are always added between operands and a newline is -// appended. It returns the number of bytes written and any write error -// encountered. This is the standard fmt.Print() method wrapped with the given -// color. -func (c *Color) Println(a ...interface{}) (n int, err error) { - c.Set() - defer c.unset() - - return fmt.Fprintln(Output, a...) -} - -// Sprint is just like Print, but returns a string instead of printing it. -func (c *Color) Sprint(a ...interface{}) string { - return c.wrap(fmt.Sprint(a...)) -} - -// Sprintln is just like Println, but returns a string instead of printing it. -func (c *Color) Sprintln(a ...interface{}) string { - return c.wrap(fmt.Sprintln(a...)) -} - -// Sprintf is just like Printf, but returns a string instead of printing it. -func (c *Color) Sprintf(format string, a ...interface{}) string { - return c.wrap(fmt.Sprintf(format, a...)) -} - -// FprintFunc returns a new function that prints the passed arguments as -// colorized with color.Fprint(). -func (c *Color) FprintFunc() func(w io.Writer, a ...interface{}) { - return func(w io.Writer, a ...interface{}) { - c.Fprint(w, a...) - } -} - -// PrintFunc returns a new function that prints the passed arguments as -// colorized with color.Print(). -func (c *Color) PrintFunc() func(a ...interface{}) { - return func(a ...interface{}) { - c.Print(a...) - } -} - -// FprintfFunc returns a new function that prints the passed arguments as -// colorized with color.Fprintf(). -func (c *Color) FprintfFunc() func(w io.Writer, format string, a ...interface{}) { - return func(w io.Writer, format string, a ...interface{}) { - c.Fprintf(w, format, a...) - } -} - -// PrintfFunc returns a new function that prints the passed arguments as -// colorized with color.Printf(). -func (c *Color) PrintfFunc() func(format string, a ...interface{}) { - return func(format string, a ...interface{}) { - c.Printf(format, a...) - } -} - -// FprintlnFunc returns a new function that prints the passed arguments as -// colorized with color.Fprintln(). -func (c *Color) FprintlnFunc() func(w io.Writer, a ...interface{}) { - return func(w io.Writer, a ...interface{}) { - c.Fprintln(w, a...) - } -} - -// PrintlnFunc returns a new function that prints the passed arguments as -// colorized with color.Println(). -func (c *Color) PrintlnFunc() func(a ...interface{}) { - return func(a ...interface{}) { - c.Println(a...) - } -} - -// SprintFunc returns a new function that returns colorized strings for the -// given arguments with fmt.Sprint(). Useful to put into or mix into other -// string. Windows users should use this in conjunction with color.Output, example: -// -// put := New(FgYellow).SprintFunc() -// fmt.Fprintf(color.Output, "This is a %s", put("warning")) -func (c *Color) SprintFunc() func(a ...interface{}) string { - return func(a ...interface{}) string { - return c.wrap(fmt.Sprint(a...)) - } -} - -// SprintfFunc returns a new function that returns colorized strings for the -// given arguments with fmt.Sprintf(). Useful to put into or mix into other -// string. Windows users should use this in conjunction with color.Output. -func (c *Color) SprintfFunc() func(format string, a ...interface{}) string { - return func(format string, a ...interface{}) string { - return c.wrap(fmt.Sprintf(format, a...)) - } -} - -// SprintlnFunc returns a new function that returns colorized strings for the -// given arguments with fmt.Sprintln(). Useful to put into or mix into other -// string. Windows users should use this in conjunction with color.Output. -func (c *Color) SprintlnFunc() func(a ...interface{}) string { - return func(a ...interface{}) string { - return c.wrap(fmt.Sprintln(a...)) - } -} - -// sequence returns a formated SGR sequence to be plugged into a "\x1b[...m" -// an example output might be: "1;36" -> bold cyan -func (c *Color) sequence() string { - format := make([]string, len(c.params)) - for i, v := range c.params { - format[i] = strconv.Itoa(int(v)) - } - - return strings.Join(format, ";") -} - -// wrap wraps the s string with the colors attributes. The string is ready to -// be printed. -func (c *Color) wrap(s string) string { - if c.isNoColorSet() { - return s - } - - return c.format() + s + c.unformat() -} - -func (c *Color) format() string { - return fmt.Sprintf("%s[%sm", escape, c.sequence()) -} - -func (c *Color) unformat() string { - return fmt.Sprintf("%s[%dm", escape, Reset) -} - -// DisableColor disables the color output. Useful to not change any existing -// code and still being able to output. Can be used for flags like -// "--no-color". To enable back use EnableColor() method. -func (c *Color) DisableColor() { - c.noColor = boolPtr(true) -} - -// EnableColor enables the color output. Use it in conjunction with -// DisableColor(). Otherwise this method has no side effects. -func (c *Color) EnableColor() { - c.noColor = boolPtr(false) -} - -func (c *Color) isNoColorSet() bool { - // check first if we have user setted action - if c.noColor != nil { - return *c.noColor - } - - // if not return the global option, which is disabled by default - return NoColor -} - -// Equals returns a boolean value indicating whether two colors are equal. -func (c *Color) Equals(c2 *Color) bool { - if len(c.params) != len(c2.params) { - return false - } - - for _, attr := range c.params { - if !c2.attrExists(attr) { - return false - } - } - - return true -} - -func (c *Color) attrExists(a Attribute) bool { - for _, attr := range c.params { - if attr == a { - return true - } - } - - return false -} - -func boolPtr(v bool) *bool { - return &v -} - -func getCachedColor(p Attribute) *Color { - colorsCacheMu.Lock() - defer colorsCacheMu.Unlock() - - c, ok := colorsCache[p] - if !ok { - c = New(p) - colorsCache[p] = c - } - - return c -} - -func colorPrint(format string, p Attribute, a ...interface{}) { - c := getCachedColor(p) - - if !strings.HasSuffix(format, "\n") { - format += "\n" - } - - if len(a) == 0 { - c.Print(format) - } else { - c.Printf(format, a...) - } -} - -func colorString(format string, p Attribute, a ...interface{}) string { - c := getCachedColor(p) - - if len(a) == 0 { - return c.SprintFunc()(format) - } - - return c.SprintfFunc()(format, a...) -} - -// Black is an convenient helper function to print with black foreground. A -// newline is appended to format by default. -func Black(format string, a ...interface{}) { colorPrint(format, FgBlack, a...) } - -// Red is an convenient helper function to print with red foreground. A -// newline is appended to format by default. -func Red(format string, a ...interface{}) { colorPrint(format, FgRed, a...) } - -// Green is an convenient helper function to print with green foreground. A -// newline is appended to format by default. -func Green(format string, a ...interface{}) { colorPrint(format, FgGreen, a...) } - -// Yellow is an convenient helper function to print with yellow foreground. -// A newline is appended to format by default. -func Yellow(format string, a ...interface{}) { colorPrint(format, FgYellow, a...) } - -// Blue is an convenient helper function to print with blue foreground. A -// newline is appended to format by default. -func Blue(format string, a ...interface{}) { colorPrint(format, FgBlue, a...) } - -// Magenta is an convenient helper function to print with magenta foreground. -// A newline is appended to format by default. -func Magenta(format string, a ...interface{}) { colorPrint(format, FgMagenta, a...) } - -// Cyan is an convenient helper function to print with cyan foreground. A -// newline is appended to format by default. -func Cyan(format string, a ...interface{}) { colorPrint(format, FgCyan, a...) } - -// White is an convenient helper function to print with white foreground. A -// newline is appended to format by default. -func White(format string, a ...interface{}) { colorPrint(format, FgWhite, a...) } - -// BlackString is an convenient helper function to return a string with black -// foreground. -func BlackString(format string, a ...interface{}) string { return colorString(format, FgBlack, a...) } - -// RedString is an convenient helper function to return a string with red -// foreground. -func RedString(format string, a ...interface{}) string { return colorString(format, FgRed, a...) } - -// GreenString is an convenient helper function to return a string with green -// foreground. -func GreenString(format string, a ...interface{}) string { return colorString(format, FgGreen, a...) } - -// YellowString is an convenient helper function to return a string with yellow -// foreground. -func YellowString(format string, a ...interface{}) string { return colorString(format, FgYellow, a...) } - -// BlueString is an convenient helper function to return a string with blue -// foreground. -func BlueString(format string, a ...interface{}) string { return colorString(format, FgBlue, a...) } - -// MagentaString is an convenient helper function to return a string with magenta -// foreground. -func MagentaString(format string, a ...interface{}) string { - return colorString(format, FgMagenta, a...) -} - -// CyanString is an convenient helper function to return a string with cyan -// foreground. -func CyanString(format string, a ...interface{}) string { return colorString(format, FgCyan, a...) } - -// WhiteString is an convenient helper function to return a string with white -// foreground. -func WhiteString(format string, a ...interface{}) string { return colorString(format, FgWhite, a...) } diff --git a/vendor/github.com/fatih/color/doc.go b/vendor/github.com/fatih/color/doc.go deleted file mode 100644 index 1e57812d7cc7..000000000000 --- a/vendor/github.com/fatih/color/doc.go +++ /dev/null @@ -1,128 +0,0 @@ -/* -Package color is an ANSI color package to output colorized or SGR defined -output to the standard output. The API can be used in several way, pick one -that suits you. - -Use simple and default helper functions with predefined foreground colors: - - color.Cyan("Prints text in cyan.") - - // a newline will be appended automatically - color.Blue("Prints %s in blue.", "text") - - // More default foreground colors.. - color.Red("We have red") - color.Yellow("Yellow color too!") - color.Magenta("And many others ..") - -However there are times where custom color mixes are required. Below are some -examples to create custom color objects and use the print functions of each -separate color object. - - // Create a new color object - c := color.New(color.FgCyan).Add(color.Underline) - c.Println("Prints cyan text with an underline.") - - // Or just add them to New() - d := color.New(color.FgCyan, color.Bold) - d.Printf("This prints bold cyan %s\n", "too!.") - - - // Mix up foreground and background colors, create new mixes! - red := color.New(color.FgRed) - - boldRed := red.Add(color.Bold) - boldRed.Println("This will print text in bold red.") - - whiteBackground := red.Add(color.BgWhite) - whiteBackground.Println("Red text with White background.") - - // Use your own io.Writer output - color.New(color.FgBlue).Fprintln(myWriter, "blue color!") - - blue := color.New(color.FgBlue) - blue.Fprint(myWriter, "This will print text in blue.") - -You can create PrintXxx functions to simplify even more: - - // Create a custom print function for convenient - red := color.New(color.FgRed).PrintfFunc() - red("warning") - red("error: %s", err) - - // Mix up multiple attributes - notice := color.New(color.Bold, color.FgGreen).PrintlnFunc() - notice("don't forget this...") - -You can also FprintXxx functions to pass your own io.Writer: - - blue := color.New(FgBlue).FprintfFunc() - blue(myWriter, "important notice: %s", stars) - - // Mix up with multiple attributes - success := color.New(color.Bold, color.FgGreen).FprintlnFunc() - success(myWriter, don't forget this...") - - -Or create SprintXxx functions to mix strings with other non-colorized strings: - - yellow := New(FgYellow).SprintFunc() - red := New(FgRed).SprintFunc() - - fmt.Printf("this is a %s and this is %s.\n", yellow("warning"), red("error")) - - info := New(FgWhite, BgGreen).SprintFunc() - fmt.Printf("this %s rocks!\n", info("package")) - -Windows support is enabled by default. All Print functions works as intended. -However only for color.SprintXXX functions, user should use fmt.FprintXXX and -set the output to color.Output: - - fmt.Fprintf(color.Output, "Windows support: %s", color.GreenString("PASS")) - - info := New(FgWhite, BgGreen).SprintFunc() - fmt.Fprintf(color.Output, "this %s rocks!\n", info("package")) - -Using with existing code is possible. Just use the Set() method to set the -standard output to the given parameters. That way a rewrite of an existing -code is not required. - - // Use handy standard colors. - color.Set(color.FgYellow) - - fmt.Println("Existing text will be now in Yellow") - fmt.Printf("This one %s\n", "too") - - color.Unset() // don't forget to unset - - // You can mix up parameters - color.Set(color.FgMagenta, color.Bold) - defer color.Unset() // use it in your function - - fmt.Println("All text will be now bold magenta.") - -There might be a case where you want to disable color output (for example to -pipe the standard output of your app to somewhere else). `Color` has support to -disable colors both globally and for single color definition. For example -suppose you have a CLI app and a `--no-color` bool flag. You can easily disable -the color output with: - - var flagNoColor = flag.Bool("no-color", false, "Disable color output") - - if *flagNoColor { - color.NoColor = true // disables colorized output - } - -It also has support for single color definitions (local). You can -disable/enable color output on the fly: - - c := color.New(color.FgCyan) - c.Println("Prints cyan text") - - c.DisableColor() - c.Println("This is printed without any color") - - c.EnableColor() - c.Println("This prints again cyan...") -*/ -package color diff --git a/vendor/github.com/fjl/memsize/LICENSE b/vendor/github.com/fjl/memsize/LICENSE deleted file mode 100644 index 8b8045641902..000000000000 --- a/vendor/github.com/fjl/memsize/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2018 Felix Lange - -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/fjl/memsize/bitmap.go b/vendor/github.com/fjl/memsize/bitmap.go deleted file mode 100644 index 47799ea8d342..000000000000 --- a/vendor/github.com/fjl/memsize/bitmap.go +++ /dev/null @@ -1,119 +0,0 @@ -package memsize - -import ( - "math/bits" -) - -const ( - uintptrBits = 32 << (uint64(^uintptr(0)) >> 63) - uintptrBytes = uintptrBits / 8 - bmBlockRange = 1 * 1024 * 1024 // bytes covered by bmBlock - bmBlockWords = bmBlockRange / uintptrBits -) - -// bitmap is a sparse bitmap. -type bitmap struct { - blocks map[uintptr]*bmBlock -} - -func newBitmap() *bitmap { - return &bitmap{make(map[uintptr]*bmBlock)} -} - -// markRange sets n consecutive bits starting at addr. -func (b *bitmap) markRange(addr, n uintptr) { - for end := addr + n; addr < end; { - block, baddr := b.block(addr) - for i := baddr; i < bmBlockRange && addr < end; i++ { - block.mark(i) - addr++ - } - } -} - -// isMarked returns the value of the bit at the given address. -func (b *bitmap) isMarked(addr uintptr) bool { - block, baddr := b.block(addr) - return block.isMarked(baddr) -} - -// countRange returns the number of set bits in the range (addr,addr+n). -func (b *bitmap) countRange(addr, n uintptr) uintptr { - c := uintptr(0) - for end := addr + n; addr < end; { - block, baddr := b.block(addr) - bend := uintptr(bmBlockRange - 1) - if baddr+(end-addr) < bmBlockRange { - bend = baddr + (end - addr) - } - c += uintptr(block.count(baddr, bend)) - // Move addr to next block. - addr += bmBlockRange - baddr - } - return c -} - -// block finds the block corresponding to the given memory address. -// It also returns the block's starting address. -func (b *bitmap) block(addr uintptr) (*bmBlock, uintptr) { - index := addr / bmBlockRange - block := b.blocks[index] - if block == nil { - block = new(bmBlock) - b.blocks[index] = block - } - return block, addr % bmBlockRange -} - -// size returns the sum of the byte sizes of all blocks. -func (b *bitmap) size() uintptr { - return uintptr(len(b.blocks)) * bmBlockWords * uintptrBytes -} - -// utilization returns the mean percentage of one bits across all blocks. -func (b *bitmap) utilization() float32 { - var avg float32 - for _, block := range b.blocks { - avg += float32(block.count(0, bmBlockRange-1)) / float32(bmBlockRange) - } - return avg / float32(len(b.blocks)) -} - -// bmBlock is a bitmap block. -type bmBlock [bmBlockWords]uintptr - -// mark sets the i'th bit to one. -func (b *bmBlock) mark(i uintptr) { - b[i/uintptrBits] |= 1 << (i % uintptrBits) -} - -// isMarked returns the value of the i'th bit. -func (b *bmBlock) isMarked(i uintptr) bool { - return (b[i/uintptrBits] & (1 << (i % uintptrBits))) != 0 -} - -// count returns the number of set bits in the range (start,end). -func (b *bmBlock) count(start, end uintptr) (count int) { - br := b[start/uintptrBits : end/uintptrBits+1] - for i, w := range br { - if i == 0 { - w &= blockmask(start) - } - if i == len(br)-1 { - w &^= blockmask(end) - } - count += onesCountPtr(w) - } - return count -} - -func blockmask(x uintptr) uintptr { - return ^uintptr(0) << (x % uintptrBits) -} - -func onesCountPtr(x uintptr) int { - if uintptrBits == 64 { - return bits.OnesCount64(uint64(x)) - } - return bits.OnesCount32(uint32(x)) -} diff --git a/vendor/github.com/fjl/memsize/doc.go b/vendor/github.com/fjl/memsize/doc.go deleted file mode 100644 index 640cfba5ebf8..000000000000 --- a/vendor/github.com/fjl/memsize/doc.go +++ /dev/null @@ -1,16 +0,0 @@ -/* -Package memsize computes the size of your object graph. - -So you made a spiffy algorithm and it works really well, but geez it's using -way too much memory. Where did it all go? memsize to the rescue! - -To get started, find a value that references all your objects and scan it. -This traverses the graph, counting sizes per type. - - sizes := memsize.Scan(myValue) - fmt.Println(sizes.Total) - -memsize can handle cycles just fine and tracks both private and public struct fields. -Unfortunately function closures cannot be inspected in any way. -*/ -package memsize diff --git a/vendor/github.com/fjl/memsize/memsize.go b/vendor/github.com/fjl/memsize/memsize.go deleted file mode 100644 index 2664e87c4604..000000000000 --- a/vendor/github.com/fjl/memsize/memsize.go +++ /dev/null @@ -1,243 +0,0 @@ -package memsize - -import ( - "bytes" - "fmt" - "reflect" - "sort" - "strings" - "text/tabwriter" - "unsafe" -) - -// Scan traverses all objects reachable from v and counts how much memory -// is used per type. The value must be a non-nil pointer to any value. -func Scan(v interface{}) Sizes { - rv := reflect.ValueOf(v) - if rv.Kind() != reflect.Ptr || rv.IsNil() { - panic("value to scan must be non-nil pointer") - } - - stopTheWorld("memsize scan") - defer startTheWorld() - - ctx := newContext() - ctx.scan(invalidAddr, rv, false) - ctx.s.BitmapSize = ctx.seen.size() - ctx.s.BitmapUtilization = ctx.seen.utilization() - return *ctx.s -} - -// Sizes is the result of a scan. -type Sizes struct { - Total uintptr - ByType map[reflect.Type]*TypeSize - // Internal stats (for debugging) - BitmapSize uintptr - BitmapUtilization float32 -} - -type TypeSize struct { - Total uintptr - Count uintptr -} - -func newSizes() *Sizes { - return &Sizes{ByType: make(map[reflect.Type]*TypeSize)} -} - -// Report returns a human-readable report. -func (s Sizes) Report() string { - type typLine struct { - name string - count uintptr - total uintptr - } - tab := []typLine{{"ALL", 0, s.Total}} - for _, typ := range s.ByType { - tab[0].count += typ.Count - } - maxname := 0 - for typ, s := range s.ByType { - line := typLine{typ.String(), s.Count, s.Total} - tab = append(tab, line) - if len(line.name) > maxname { - maxname = len(line.name) - } - } - sort.Slice(tab, func(i, j int) bool { return tab[i].total > tab[j].total }) - - buf := new(bytes.Buffer) - w := tabwriter.NewWriter(buf, 0, 0, 0, ' ', tabwriter.AlignRight) - for _, line := range tab { - namespace := strings.Repeat(" ", maxname-len(line.name)) - fmt.Fprintf(w, "%s%s\t %v\t %s\t\n", line.name, namespace, line.count, HumanSize(line.total)) - } - w.Flush() - return buf.String() -} - -// addValue is called during scan and adds the memory of given object. -func (s *Sizes) addValue(v reflect.Value, size uintptr) { - s.Total += size - rs := s.ByType[v.Type()] - if rs == nil { - rs = new(TypeSize) - s.ByType[v.Type()] = rs - } - rs.Total += size - rs.Count++ -} - -type context struct { - // We track previously scanned objects to prevent infinite loops - // when scanning cycles and to prevent counting objects more than once. - seen *bitmap - tc typCache - s *Sizes -} - -func newContext() *context { - return &context{seen: newBitmap(), tc: make(typCache), s: newSizes()} -} - -// scan walks all objects below v, determining their size. All scan* functions return the -// amount of 'extra' memory (e.g. slice data) that is referenced by the object. -func (c *context) scan(addr address, v reflect.Value, add bool) (extraSize uintptr) { - size := v.Type().Size() - var marked uintptr - if addr.valid() { - marked = c.seen.countRange(uintptr(addr), size) - if marked == size { - return 0 // Skip if we have already seen the whole object. - } - c.seen.markRange(uintptr(addr), size) - } - // fmt.Printf("%v: %v ⮑ (marked %d)\n", addr, v.Type(), marked) - if c.tc.needScan(v.Type()) { - extraSize = c.scanContent(addr, v) - } - // fmt.Printf("%v: %v %d (add %v, size %d, marked %d, extra %d)\n", addr, v.Type(), size+extraSize, add, v.Type().Size(), marked, extraSize) - if add { - size -= marked - size += extraSize - c.s.addValue(v, size) - } - return extraSize -} - -func (c *context) scanContent(addr address, v reflect.Value) uintptr { - switch v.Kind() { - case reflect.Array: - return c.scanArray(addr, v) - case reflect.Chan: - return c.scanChan(v) - case reflect.Func: - // can't do anything here - return 0 - case reflect.Interface: - return c.scanInterface(v) - case reflect.Map: - return c.scanMap(v) - case reflect.Ptr: - if !v.IsNil() { - c.scan(address(v.Pointer()), v.Elem(), true) - } - return 0 - case reflect.Slice: - return c.scanSlice(v) - case reflect.String: - return uintptr(v.Len()) - case reflect.Struct: - return c.scanStruct(addr, v) - default: - unhandledKind(v.Kind()) - return 0 - } -} - -func (c *context) scanChan(v reflect.Value) uintptr { - etyp := v.Type().Elem() - extra := uintptr(0) - if c.tc.needScan(etyp) { - // Scan the channel buffer. This is unsafe but doesn't race because - // the world is stopped during scan. - hchan := unsafe.Pointer(v.Pointer()) - for i := uint(0); i < uint(v.Cap()); i++ { - addr := chanbuf(hchan, i) - elem := reflect.NewAt(etyp, addr).Elem() - extra += c.scanContent(address(addr), elem) - } - } - return uintptr(v.Cap())*etyp.Size() + extra -} - -func (c *context) scanStruct(base address, v reflect.Value) uintptr { - extra := uintptr(0) - for i := 0; i < v.NumField(); i++ { - f := v.Type().Field(i) - if c.tc.needScan(f.Type) { - addr := base.addOffset(f.Offset) - extra += c.scanContent(addr, v.Field(i)) - } - } - return extra -} - -func (c *context) scanArray(addr address, v reflect.Value) uintptr { - esize := v.Type().Elem().Size() - extra := uintptr(0) - for i := 0; i < v.Len(); i++ { - extra += c.scanContent(addr, v.Index(i)) - addr = addr.addOffset(esize) - } - return extra -} - -func (c *context) scanSlice(v reflect.Value) uintptr { - slice := v.Slice(0, v.Cap()) - esize := slice.Type().Elem().Size() - base := slice.Pointer() - // Add size of the unscanned portion of the backing array to extra. - blen := uintptr(slice.Len()) * esize - marked := c.seen.countRange(base, blen) - extra := blen - marked - c.seen.markRange(uintptr(base), blen) - if c.tc.needScan(slice.Type().Elem()) { - // Elements may contain pointers, scan them individually. - addr := address(base) - for i := 0; i < slice.Len(); i++ { - extra += c.scanContent(addr, slice.Index(i)) - addr = addr.addOffset(esize) - } - } - return extra -} - -func (c *context) scanMap(v reflect.Value) uintptr { - var ( - typ = v.Type() - len = uintptr(v.Len()) - extra = uintptr(0) - ) - if c.tc.needScan(typ.Key()) || c.tc.needScan(typ.Elem()) { - for _, k := range v.MapKeys() { - extra += c.scan(invalidAddr, k, false) - extra += c.scan(invalidAddr, v.MapIndex(k), false) - } - } - return len*typ.Key().Size() + len*typ.Elem().Size() + extra -} - -func (c *context) scanInterface(v reflect.Value) uintptr { - elem := v.Elem() - if !elem.IsValid() { - return 0 // nil interface - } - c.scan(invalidAddr, elem, false) - if !c.tc.isPointer(elem.Type()) { - // Account for non-pointer size of the value. - return elem.Type().Size() - } - return 0 -} diff --git a/vendor/github.com/fjl/memsize/memsizeui/template.go b/vendor/github.com/fjl/memsize/memsizeui/template.go deleted file mode 100644 index b60fe6ba549a..000000000000 --- a/vendor/github.com/fjl/memsize/memsizeui/template.go +++ /dev/null @@ -1,106 +0,0 @@ -package memsizeui - -import ( - "html/template" - "strconv" - "sync" - - "github.com/fjl/memsize" -) - -var ( - base *template.Template // the "base" template - baseInitOnce sync.Once -) - -func baseInit() { - base = template.Must(template.New("base").Parse(` - - - - memsize - - - - {{template "content" .}} - -`)) - - base.Funcs(template.FuncMap{ - "quote": strconv.Quote, - "humansize": memsize.HumanSize, - }) - - template.Must(base.New("rootbuttons").Parse(` -Overview -{{- range $root := .Roots -}} -
- -
-{{- end -}}`)) -} - -func contentTemplate(source string) *template.Template { - baseInitOnce.Do(baseInit) - t := template.Must(base.Clone()) - template.Must(t.New("content").Parse(source)) - return t -} - -var rootTemplate = contentTemplate(` -

Memsize

-{{template "rootbuttons" .}} -
-

Reports

- -`) - -var notFoundTemplate = contentTemplate(` -

{{.Data}}

-{{template "rootbuttons" .}} -`) - -var reportTemplate = contentTemplate(` -{{- $report := .Data -}} -

Memsize Report {{$report.ID}}

-
- Overview - -
-
-Root: {{quote $report.RootName}}
-Date: {{$report.Date}}
-Duration: {{$report.Duration}}
-Bitmap Size: {{$report.Sizes.BitmapSize | humansize}}
-Bitmap Utilization: {{$report.Sizes.BitmapUtilization}}
-
-
-
-{{$report.Sizes.Report}}
-
-`) diff --git a/vendor/github.com/fjl/memsize/memsizeui/ui.go b/vendor/github.com/fjl/memsize/memsizeui/ui.go deleted file mode 100644 index c48fc53f7f6c..000000000000 --- a/vendor/github.com/fjl/memsize/memsizeui/ui.go +++ /dev/null @@ -1,153 +0,0 @@ -package memsizeui - -import ( - "bytes" - "fmt" - "html/template" - "net/http" - "reflect" - "sort" - "strings" - "sync" - "time" - - "github.com/fjl/memsize" -) - -type Handler struct { - init sync.Once - mux http.ServeMux - mu sync.Mutex - reports map[int]Report - roots map[string]interface{} - reportID int -} - -type Report struct { - ID int - Date time.Time - Duration time.Duration - RootName string - Sizes memsize.Sizes -} - -type templateInfo struct { - Roots []string - Reports map[int]Report - PathDepth int - Data interface{} -} - -func (ti *templateInfo) Link(path ...string) string { - prefix := strings.Repeat("../", ti.PathDepth) - return prefix + strings.Join(path, "") -} - -func (h *Handler) Add(name string, v interface{}) { - rv := reflect.ValueOf(v) - if rv.Kind() != reflect.Ptr || rv.IsNil() { - panic("root must be non-nil pointer") - } - h.mu.Lock() - if h.roots == nil { - h.roots = make(map[string]interface{}) - } - h.roots[name] = v - h.mu.Unlock() -} - -func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - h.init.Do(func() { - h.reports = make(map[int]Report) - h.mux.HandleFunc("/", h.handleRoot) - h.mux.HandleFunc("/scan", h.handleScan) - h.mux.HandleFunc("/report/", h.handleReport) - }) - h.mux.ServeHTTP(w, r) -} - -func (h *Handler) templateInfo(r *http.Request, data interface{}) *templateInfo { - h.mu.Lock() - roots := make([]string, 0, len(h.roots)) - for name := range h.roots { - roots = append(roots, name) - } - h.mu.Unlock() - sort.Strings(roots) - - return &templateInfo{ - Roots: roots, - Reports: h.reports, - PathDepth: strings.Count(r.URL.Path, "/") - 1, - Data: data, - } -} - -func (h *Handler) handleRoot(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != "/" { - http.NotFound(w, r) - return - } - serveHTML(w, rootTemplate, http.StatusOK, h.templateInfo(r, nil)) -} - -func (h *Handler) handleScan(w http.ResponseWriter, r *http.Request) { - if r.Method != http.MethodPost { - http.Error(w, "invalid HTTP method, want POST", http.StatusMethodNotAllowed) - return - } - ti := h.templateInfo(r, "Unknown root") - id, ok := h.scan(r.URL.Query().Get("root")) - if !ok { - serveHTML(w, notFoundTemplate, http.StatusNotFound, ti) - return - } - w.Header().Add("Location", ti.Link(fmt.Sprintf("report/%d", id))) - w.WriteHeader(http.StatusSeeOther) -} - -func (h *Handler) handleReport(w http.ResponseWriter, r *http.Request) { - var id int - fmt.Sscan(strings.TrimPrefix(r.URL.Path, "/report/"), &id) - h.mu.Lock() - report, ok := h.reports[id] - h.mu.Unlock() - - if !ok { - serveHTML(w, notFoundTemplate, http.StatusNotFound, h.templateInfo(r, "Report not found")) - } else { - serveHTML(w, reportTemplate, http.StatusOK, h.templateInfo(r, report)) - } -} - -func (h *Handler) scan(root string) (int, bool) { - h.mu.Lock() - defer h.mu.Unlock() - - val, ok := h.roots[root] - if !ok { - return 0, false - } - id := h.reportID - start := time.Now() - sizes := memsize.Scan(val) - h.reports[id] = Report{ - ID: id, - RootName: root, - Date: start.Truncate(1 * time.Second), - Duration: time.Since(start), - Sizes: sizes, - } - h.reportID++ - return id, true -} - -func serveHTML(w http.ResponseWriter, tpl *template.Template, status int, ti *templateInfo) { - w.Header().Set("content-type", "text/html") - var buf bytes.Buffer - if err := tpl.Execute(&buf, ti); err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - buf.WriteTo(w) -} diff --git a/vendor/github.com/fjl/memsize/runtimefunc.go b/vendor/github.com/fjl/memsize/runtimefunc.go deleted file mode 100644 index 912a3e768d4d..000000000000 --- a/vendor/github.com/fjl/memsize/runtimefunc.go +++ /dev/null @@ -1,14 +0,0 @@ -package memsize - -import "unsafe" - -var _ = unsafe.Pointer(nil) - -//go:linkname stopTheWorld runtime.stopTheWorld -func stopTheWorld(reason string) - -//go:linkname startTheWorld runtime.startTheWorld -func startTheWorld() - -//go:linkname chanbuf runtime.chanbuf -func chanbuf(ch unsafe.Pointer, i uint) unsafe.Pointer diff --git a/vendor/github.com/fjl/memsize/runtimefunc.s b/vendor/github.com/fjl/memsize/runtimefunc.s deleted file mode 100644 index a091e2fa7243..000000000000 --- a/vendor/github.com/fjl/memsize/runtimefunc.s +++ /dev/null @@ -1 +0,0 @@ -// This file is required to make stub function declarations work. diff --git a/vendor/github.com/fjl/memsize/type.go b/vendor/github.com/fjl/memsize/type.go deleted file mode 100644 index 5d6f59e9ff2e..000000000000 --- a/vendor/github.com/fjl/memsize/type.go +++ /dev/null @@ -1,119 +0,0 @@ -package memsize - -import ( - "fmt" - "reflect" -) - -// address is a memory location. -// -// Code dealing with uintptr is oblivious to the zero address. -// Code dealing with address is not: it treats the zero address -// as invalid. Offsetting an invalid address doesn't do anything. -// -// This distinction is useful because there are objects that we can't -// get the pointer to. -type address uintptr - -const invalidAddr = address(0) - -func (a address) valid() bool { - return a != 0 -} - -func (a address) addOffset(off uintptr) address { - if !a.valid() { - return invalidAddr - } - return a + address(off) -} - -func (a address) String() string { - if uintptrBits == 32 { - return fmt.Sprintf("%#0.8x", uintptr(a)) - } - return fmt.Sprintf("%#0.16x", uintptr(a)) -} - -type typCache map[reflect.Type]typInfo - -type typInfo struct { - isPointer bool - needScan bool -} - -// isPointer returns true for pointer-ish values. The notion of -// pointer includes everything but plain values, i.e. slices, maps -// channels, interfaces are 'pointer', too. -func (tc *typCache) isPointer(typ reflect.Type) bool { - return tc.info(typ).isPointer -} - -// needScan reports whether a value of the type needs to be scanned -// recursively because it may contain pointers. -func (tc *typCache) needScan(typ reflect.Type) bool { - return tc.info(typ).needScan -} - -func (tc *typCache) info(typ reflect.Type) typInfo { - info, found := (*tc)[typ] - switch { - case found: - return info - case isPointer(typ): - info = typInfo{true, true} - default: - info = typInfo{false, tc.checkNeedScan(typ)} - } - (*tc)[typ] = info - return info -} - -func (tc *typCache) checkNeedScan(typ reflect.Type) bool { - switch k := typ.Kind(); k { - case reflect.Struct: - // Structs don't need scan if none of their fields need it. - for i := 0; i < typ.NumField(); i++ { - if tc.needScan(typ.Field(i).Type) { - return true - } - } - case reflect.Array: - // Arrays don't need scan if their element type doesn't. - return tc.needScan(typ.Elem()) - } - return false -} - -func isPointer(typ reflect.Type) bool { - k := typ.Kind() - switch { - case k <= reflect.Complex128: - return false - case k == reflect.Array: - return false - case k >= reflect.Chan && k <= reflect.String: - return true - case k == reflect.Struct || k == reflect.UnsafePointer: - return false - default: - unhandledKind(k) - return false - } -} - -func unhandledKind(k reflect.Kind) { - panic("unhandled kind " + k.String()) -} - -// HumanSize formats the given number of bytes as a readable string. -func HumanSize(bytes uintptr) string { - switch { - case bytes < 1024: - return fmt.Sprintf("%d B", bytes) - case bytes < 1024*1024: - return fmt.Sprintf("%.3f KB", float64(bytes)/1024) - default: - return fmt.Sprintf("%.3f MB", float64(bytes)/1024/1024) - } -} diff --git a/vendor/github.com/gizak/termui/LICENSE b/vendor/github.com/gizak/termui/LICENSE deleted file mode 100644 index 311ccc74fbfe..000000000000 --- a/vendor/github.com/gizak/termui/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2015 Zack Guo - -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/gizak/termui/README.md b/vendor/github.com/gizak/termui/README.md deleted file mode 100644 index d5f3d9a8f117..000000000000 --- a/vendor/github.com/gizak/termui/README.md +++ /dev/null @@ -1,151 +0,0 @@ -# termui [![Build Status](https://travis-ci.org/gizak/termui.svg?branch=master)](https://travis-ci.org/gizak/termui) [![Doc Status](https://godoc.org/github.com/gizak/termui?status.png)](https://godoc.org/github.com/gizak/termui) - -demo cast under osx 10.10; Terminal.app; Menlo Regular 12pt.) - -`termui` is a cross-platform, easy-to-compile, and fully-customizable terminal dashboard. It is inspired by [blessed-contrib](https://github.com/yaronn/blessed-contrib), but purely in Go. - -Now version v2 has arrived! It brings new event system, new theme system, new `Buffer` interface and specific colour text rendering. (some docs are missing, but it will be completed soon!) - -## Installation - -`master` mirrors v2 branch, to install: - - go get -u github.com/gizak/termui - -It is recommanded to use locked deps by using [glide](https://glide.sh): move to `termui` src directory then run `glide up`. - -For the compatible reason, you can choose to install the legacy version of `termui`: - - go get gopkg.in/gizak/termui.v1 - -## Usage - -### Layout - -To use `termui`, the very first thing you may want to know is how to manage layout. `termui` offers two ways of doing this, known as absolute layout and grid layout. - -__Absolute layout__ - -Each widget has an underlying block structure which basically is a box model. It has border, label and padding properties. A border of a widget can be chosen to hide or display (with its border label), you can pick a different front/back colour for the border as well. To display such a widget at a specific location in terminal window, you need to assign `.X`, `.Y`, `.Height`, `.Width` values for each widget before sending it to `.Render`. Let's demonstrate these by a code snippet: - -`````go - import ui "github.com/gizak/termui" // <- ui shortcut, optional - - func main() { - err := ui.Init() - if err != nil { - panic(err) - } - defer ui.Close() - - p := ui.NewPar(":PRESS q TO QUIT DEMO") - p.Height = 3 - p.Width = 50 - p.TextFgColor = ui.ColorWhite - p.BorderLabel = "Text Box" - p.BorderFg = ui.ColorCyan - - g := ui.NewGauge() - g.Percent = 50 - g.Width = 50 - g.Height = 3 - g.Y = 11 - g.BorderLabel = "Gauge" - g.BarColor = ui.ColorRed - g.BorderFg = ui.ColorWhite - g.BorderLabelFg = ui.ColorCyan - - ui.Render(p, g) // feel free to call Render, it's async and non-block - - // event handler... - } -````` - -Note that components can be overlapped (I'd rather call this a feature...), `Render(rs ...Renderer)` renders its args from left to right (i.e. each component's weight is arising from left to right). - -__Grid layout:__ - -grid - -Grid layout uses [12 columns grid system](http://www.w3schools.com/bootstrap/bootstrap_grid_system.asp) with expressive syntax. To use `Grid`, all we need to do is build a widget tree consisting of `Row`s and `Col`s (Actually a `Col` is also a `Row` but with a widget endpoint attached). - -```go - import ui "github.com/gizak/termui" - // init and create widgets... - - // build - ui.Body.AddRows( - ui.NewRow( - ui.NewCol(6, 0, widget0), - ui.NewCol(6, 0, widget1)), - ui.NewRow( - ui.NewCol(3, 0, widget2), - ui.NewCol(3, 0, widget30, widget31, widget32), - ui.NewCol(6, 0, widget4))) - - // calculate layout - ui.Body.Align() - - ui.Render(ui.Body) -``` - -### Events - -`termui` ships with a http-like event mux handling system. All events are channeled up from different sources (typing, click, windows resize, custom event) and then encoded as universal `Event` object. `Event.Path` indicates the event type and `Event.Data` stores the event data struct. Add a handler to a certain event is easy as below: - -```go - // handle key q pressing - ui.Handle("/sys/kbd/q", func(ui.Event) { - // press q to quit - ui.StopLoop() - }) - - ui.Handle("/sys/kbd/C-x", func(ui.Event) { - // handle Ctrl + x combination - }) - - ui.Handle("/sys/kbd", func(ui.Event) { - // handle all other key pressing - }) - - // handle a 1s timer - ui.Handle("/timer/1s", func(e ui.Event) { - t := e.Data.(ui.EvtTimer) - // t is a EvtTimer - if t.Count%2 ==0 { - // do something - } - }) - - ui.Loop() // block until StopLoop is called -``` - -### Widgets - -Click image to see the corresponding demo codes. - -[par](https://github.com/gizak/termui/blob/master/_example/par.go) -[list](https://github.com/gizak/termui/blob/master/_example/list.go) -[gauge](https://github.com/gizak/termui/blob/master/_example/gauge.go) -[linechart](https://github.com/gizak/termui/blob/master/_example/linechart.go) -[barchart](https://github.com/gizak/termui/blob/master/_example/barchart.go) -[barchart](https://github.com/gizak/termui/blob/master/_example/mbarchart.go) -[sparklines](https://github.com/gizak/termui/blob/master/_example/sparklines.go) -[table](https://github.com/gizak/termui/blob/master/_example/table.go) - -## GoDoc - -[godoc](https://godoc.org/github.com/gizak/termui) - -## TODO - -- [x] Grid layout -- [x] Event system -- [x] Canvas widget -- [x] Refine APIs -- [ ] Focusable widgets - -## Changelog - -## License -This library is under the [MIT License](http://opensource.org/licenses/MIT) diff --git a/vendor/github.com/gizak/termui/barchart.go b/vendor/github.com/gizak/termui/barchart.go deleted file mode 100644 index 6560c8b14e46..000000000000 --- a/vendor/github.com/gizak/termui/barchart.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import "fmt" - -// BarChart creates multiple bars in a widget: -/* - bc := termui.NewBarChart() - data := []int{3, 2, 5, 3, 9, 5} - bclabels := []string{"S0", "S1", "S2", "S3", "S4", "S5"} - bc.BorderLabel = "Bar Chart" - bc.Data = data - bc.Width = 26 - bc.Height = 10 - bc.DataLabels = bclabels - bc.TextColor = termui.ColorGreen - bc.BarColor = termui.ColorRed - bc.NumColor = termui.ColorYellow -*/ -type BarChart struct { - Block - BarColor Attribute - TextColor Attribute - NumColor Attribute - Data []int - DataLabels []string - BarWidth int - BarGap int - CellChar rune - labels [][]rune - dataNum [][]rune - numBar int - scale float64 - max int -} - -// NewBarChart returns a new *BarChart with current theme. -func NewBarChart() *BarChart { - bc := &BarChart{Block: *NewBlock()} - bc.BarColor = ThemeAttr("barchart.bar.bg") - bc.NumColor = ThemeAttr("barchart.num.fg") - bc.TextColor = ThemeAttr("barchart.text.fg") - bc.BarGap = 1 - bc.BarWidth = 3 - bc.CellChar = ' ' - return bc -} - -func (bc *BarChart) layout() { - bc.numBar = bc.innerArea.Dx() / (bc.BarGap + bc.BarWidth) - bc.labels = make([][]rune, bc.numBar) - bc.dataNum = make([][]rune, len(bc.Data)) - - for i := 0; i < bc.numBar && i < len(bc.DataLabels) && i < len(bc.Data); i++ { - bc.labels[i] = trimStr2Runes(bc.DataLabels[i], bc.BarWidth) - n := bc.Data[i] - s := fmt.Sprint(n) - bc.dataNum[i] = trimStr2Runes(s, bc.BarWidth) - } - - //bc.max = bc.Data[0] // what if Data is nil? Sometimes when bar graph is nill it produces panic with panic: runtime error: index out of range - // Asign a negative value to get maxvalue auto-populates - if bc.max == 0 { - bc.max = -1 - } - for i := 0; i < len(bc.Data); i++ { - if bc.max < bc.Data[i] { - bc.max = bc.Data[i] - } - } - bc.scale = float64(bc.max) / float64(bc.innerArea.Dy()-1) -} - -func (bc *BarChart) SetMax(max int) { - - if max > 0 { - bc.max = max - } -} - -// Buffer implements Bufferer interface. -func (bc *BarChart) Buffer() Buffer { - buf := bc.Block.Buffer() - bc.layout() - - for i := 0; i < bc.numBar && i < len(bc.Data) && i < len(bc.DataLabels); i++ { - h := int(float64(bc.Data[i]) / bc.scale) - oftX := i * (bc.BarWidth + bc.BarGap) - - barBg := bc.Bg - barFg := bc.BarColor - - if bc.CellChar == ' ' { - barBg = bc.BarColor - barFg = ColorDefault - if bc.BarColor == ColorDefault { // the same as above - barBg |= AttrReverse - } - } - - // plot bar - for j := 0; j < bc.BarWidth; j++ { - for k := 0; k < h; k++ { - c := Cell{ - Ch: bc.CellChar, - Bg: barBg, - Fg: barFg, - } - - x := bc.innerArea.Min.X + i*(bc.BarWidth+bc.BarGap) + j - y := bc.innerArea.Min.Y + bc.innerArea.Dy() - 2 - k - buf.Set(x, y, c) - } - } - // plot text - for j, k := 0, 0; j < len(bc.labels[i]); j++ { - w := charWidth(bc.labels[i][j]) - c := Cell{ - Ch: bc.labels[i][j], - Bg: bc.Bg, - Fg: bc.TextColor, - } - y := bc.innerArea.Min.Y + bc.innerArea.Dy() - 1 - x := bc.innerArea.Min.X + oftX + k - buf.Set(x, y, c) - k += w - } - // plot num - for j := 0; j < len(bc.dataNum[i]); j++ { - c := Cell{ - Ch: bc.dataNum[i][j], - Fg: bc.NumColor, - Bg: barBg, - } - - if h == 0 { - c.Bg = bc.Bg - } - x := bc.innerArea.Min.X + oftX + (bc.BarWidth-len(bc.dataNum[i]))/2 + j - y := bc.innerArea.Min.Y + bc.innerArea.Dy() - 2 - buf.Set(x, y, c) - } - } - - return buf -} diff --git a/vendor/github.com/gizak/termui/block.go b/vendor/github.com/gizak/termui/block.go deleted file mode 100644 index 3e8571bc2326..000000000000 --- a/vendor/github.com/gizak/termui/block.go +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import "image" - -// Hline is a horizontal line. -type Hline struct { - X int - Y int - Len int - Fg Attribute - Bg Attribute -} - -// Vline is a vertical line. -type Vline struct { - X int - Y int - Len int - Fg Attribute - Bg Attribute -} - -// Buffer draws a horizontal line. -func (l Hline) Buffer() Buffer { - if l.Len <= 0 { - return NewBuffer() - } - return NewFilledBuffer(l.X, l.Y, l.X+l.Len, l.Y+1, HORIZONTAL_LINE, l.Fg, l.Bg) -} - -// Buffer draws a vertical line. -func (l Vline) Buffer() Buffer { - if l.Len <= 0 { - return NewBuffer() - } - return NewFilledBuffer(l.X, l.Y, l.X+1, l.Y+l.Len, VERTICAL_LINE, l.Fg, l.Bg) -} - -// Buffer draws a box border. -func (b Block) drawBorder(buf Buffer) { - if !b.Border { - return - } - - min := b.area.Min - max := b.area.Max - - x0 := min.X - y0 := min.Y - x1 := max.X - 1 - y1 := max.Y - 1 - - // draw lines - if b.BorderTop { - buf.Merge(Hline{x0, y0, x1 - x0, b.BorderFg, b.BorderBg}.Buffer()) - } - if b.BorderBottom { - buf.Merge(Hline{x0, y1, x1 - x0, b.BorderFg, b.BorderBg}.Buffer()) - } - if b.BorderLeft { - buf.Merge(Vline{x0, y0, y1 - y0, b.BorderFg, b.BorderBg}.Buffer()) - } - if b.BorderRight { - buf.Merge(Vline{x1, y0, y1 - y0, b.BorderFg, b.BorderBg}.Buffer()) - } - - // draw corners - if b.BorderTop && b.BorderLeft && b.area.Dx() > 0 && b.area.Dy() > 0 { - buf.Set(x0, y0, Cell{TOP_LEFT, b.BorderFg, b.BorderBg}) - } - if b.BorderTop && b.BorderRight && b.area.Dx() > 1 && b.area.Dy() > 0 { - buf.Set(x1, y0, Cell{TOP_RIGHT, b.BorderFg, b.BorderBg}) - } - if b.BorderBottom && b.BorderLeft && b.area.Dx() > 0 && b.area.Dy() > 1 { - buf.Set(x0, y1, Cell{BOTTOM_LEFT, b.BorderFg, b.BorderBg}) - } - if b.BorderBottom && b.BorderRight && b.area.Dx() > 1 && b.area.Dy() > 1 { - buf.Set(x1, y1, Cell{BOTTOM_RIGHT, b.BorderFg, b.BorderBg}) - } -} - -func (b Block) drawBorderLabel(buf Buffer) { - maxTxtW := b.area.Dx() - 2 - tx := DTrimTxCls(DefaultTxBuilder.Build(b.BorderLabel, b.BorderLabelFg, b.BorderLabelBg), maxTxtW) - - for i, w := 0, 0; i < len(tx); i++ { - buf.Set(b.area.Min.X+1+w, b.area.Min.Y, tx[i]) - w += tx[i].Width() - } -} - -// Block is a base struct for all other upper level widgets, -// consider it as css: display:block. -// Normally you do not need to create it manually. -type Block struct { - area image.Rectangle - innerArea image.Rectangle - X int - Y int - Border bool - BorderFg Attribute - BorderBg Attribute - BorderLeft bool - BorderRight bool - BorderTop bool - BorderBottom bool - BorderLabel string - BorderLabelFg Attribute - BorderLabelBg Attribute - Display bool - Bg Attribute - Width int - Height int - PaddingTop int - PaddingBottom int - PaddingLeft int - PaddingRight int - id string - Float Align -} - -// NewBlock returns a *Block which inherits styles from current theme. -func NewBlock() *Block { - b := Block{} - b.Display = true - b.Border = true - b.BorderLeft = true - b.BorderRight = true - b.BorderTop = true - b.BorderBottom = true - b.BorderBg = ThemeAttr("border.bg") - b.BorderFg = ThemeAttr("border.fg") - b.BorderLabelBg = ThemeAttr("label.bg") - b.BorderLabelFg = ThemeAttr("label.fg") - b.Bg = ThemeAttr("block.bg") - b.Width = 2 - b.Height = 2 - b.id = GenId() - b.Float = AlignNone - return &b -} - -func (b Block) Id() string { - return b.id -} - -// Align computes box model -func (b *Block) Align() { - // outer - b.area.Min.X = 0 - b.area.Min.Y = 0 - b.area.Max.X = b.Width - b.area.Max.Y = b.Height - - // float - b.area = AlignArea(TermRect(), b.area, b.Float) - b.area = MoveArea(b.area, b.X, b.Y) - - // inner - b.innerArea.Min.X = b.area.Min.X + b.PaddingLeft - b.innerArea.Min.Y = b.area.Min.Y + b.PaddingTop - b.innerArea.Max.X = b.area.Max.X - b.PaddingRight - b.innerArea.Max.Y = b.area.Max.Y - b.PaddingBottom - - if b.Border { - if b.BorderLeft { - b.innerArea.Min.X++ - } - if b.BorderRight { - b.innerArea.Max.X-- - } - if b.BorderTop { - b.innerArea.Min.Y++ - } - if b.BorderBottom { - b.innerArea.Max.Y-- - } - } -} - -// InnerBounds returns the internal bounds of the block after aligning and -// calculating the padding and border, if any. -func (b *Block) InnerBounds() image.Rectangle { - b.Align() - return b.innerArea -} - -// Buffer implements Bufferer interface. -// Draw background and border (if any). -func (b *Block) Buffer() Buffer { - b.Align() - - buf := NewBuffer() - buf.SetArea(b.area) - buf.Fill(' ', ColorDefault, b.Bg) - - b.drawBorder(buf) - b.drawBorderLabel(buf) - - return buf -} - -// GetHeight implements GridBufferer. -// It returns current height of the block. -func (b Block) GetHeight() int { - return b.Height -} - -// SetX implements GridBufferer interface, which sets block's x position. -func (b *Block) SetX(x int) { - b.X = x -} - -// SetY implements GridBufferer interface, it sets y position for block. -func (b *Block) SetY(y int) { - b.Y = y -} - -// SetWidth implements GridBuffer interface, it sets block's width. -func (b *Block) SetWidth(w int) { - b.Width = w -} - -func (b Block) InnerWidth() int { - return b.innerArea.Dx() -} - -func (b Block) InnerHeight() int { - return b.innerArea.Dy() -} - -func (b Block) InnerX() int { - return b.innerArea.Min.X -} - -func (b Block) InnerY() int { return b.innerArea.Min.Y } diff --git a/vendor/github.com/gizak/termui/block_common.go b/vendor/github.com/gizak/termui/block_common.go deleted file mode 100644 index 6438bf217dd7..000000000000 --- a/vendor/github.com/gizak/termui/block_common.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -// +build !windows - -package termui - -const TOP_RIGHT = '┐' -const VERTICAL_LINE = '│' -const HORIZONTAL_LINE = '─' -const TOP_LEFT = '┌' -const BOTTOM_RIGHT = '┘' -const BOTTOM_LEFT = '└' -const VERTICAL_LEFT = '┤' -const VERTICAL_RIGHT = '├' -const HORIZONTAL_DOWN = '┬' -const HORIZONTAL_UP = '┴' -const QUOTA_LEFT = '«' -const QUOTA_RIGHT = '»' diff --git a/vendor/github.com/gizak/termui/block_windows.go b/vendor/github.com/gizak/termui/block_windows.go deleted file mode 100644 index a4fba77d7c31..000000000000 --- a/vendor/github.com/gizak/termui/block_windows.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -// +build windows - -package termui - -const TOP_RIGHT = '+' -const VERTICAL_LINE = '|' -const HORIZONTAL_LINE = '-' -const TOP_LEFT = '+' -const BOTTOM_RIGHT = '+' -const BOTTOM_LEFT = '+' diff --git a/vendor/github.com/gizak/termui/buffer.go b/vendor/github.com/gizak/termui/buffer.go deleted file mode 100644 index 9e3a97345d25..000000000000 --- a/vendor/github.com/gizak/termui/buffer.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import "image" - -// Cell is a rune with assigned Fg and Bg -type Cell struct { - Ch rune - Fg Attribute - Bg Attribute -} - -// Buffer is a renderable rectangle cell data container. -type Buffer struct { - Area image.Rectangle // selected drawing area - CellMap map[image.Point]Cell -} - -// At returns the cell at (x,y). -func (b Buffer) At(x, y int) Cell { - return b.CellMap[image.Pt(x, y)] -} - -// Set assigns a char to (x,y) -func (b Buffer) Set(x, y int, c Cell) { - b.CellMap[image.Pt(x, y)] = c -} - -// Bounds returns the domain for which At can return non-zero color. -func (b Buffer) Bounds() image.Rectangle { - x0, y0, x1, y1 := 0, 0, 0, 0 - for p := range b.CellMap { - if p.X > x1 { - x1 = p.X - } - if p.X < x0 { - x0 = p.X - } - if p.Y > y1 { - y1 = p.Y - } - if p.Y < y0 { - y0 = p.Y - } - } - return image.Rect(x0, y0, x1+1, y1+1) -} - -// SetArea assigns a new rect area to Buffer b. -func (b *Buffer) SetArea(r image.Rectangle) { - b.Area.Max = r.Max - b.Area.Min = r.Min -} - -// Sync sets drawing area to the buffer's bound -func (b *Buffer) Sync() { - b.SetArea(b.Bounds()) -} - -// NewCell returns a new cell -func NewCell(ch rune, fg, bg Attribute) Cell { - return Cell{ch, fg, bg} -} - -// Merge merges bs Buffers onto b -func (b *Buffer) Merge(bs ...Buffer) { - for _, buf := range bs { - for p, v := range buf.CellMap { - b.Set(p.X, p.Y, v) - } - b.SetArea(b.Area.Union(buf.Area)) - } -} - -// NewBuffer returns a new Buffer -func NewBuffer() Buffer { - return Buffer{ - CellMap: make(map[image.Point]Cell), - Area: image.Rectangle{}} -} - -// Fill fills the Buffer b with ch,fg and bg. -func (b Buffer) Fill(ch rune, fg, bg Attribute) { - for x := b.Area.Min.X; x < b.Area.Max.X; x++ { - for y := b.Area.Min.Y; y < b.Area.Max.Y; y++ { - b.Set(x, y, Cell{ch, fg, bg}) - } - } -} - -// NewFilledBuffer returns a new Buffer filled with ch, fb and bg. -func NewFilledBuffer(x0, y0, x1, y1 int, ch rune, fg, bg Attribute) Buffer { - buf := NewBuffer() - buf.Area.Min = image.Pt(x0, y0) - buf.Area.Max = image.Pt(x1, y1) - - for x := buf.Area.Min.X; x < buf.Area.Max.X; x++ { - for y := buf.Area.Min.Y; y < buf.Area.Max.Y; y++ { - buf.Set(x, y, Cell{ch, fg, bg}) - } - } - return buf -} diff --git a/vendor/github.com/gizak/termui/canvas.go b/vendor/github.com/gizak/termui/canvas.go deleted file mode 100644 index 6d2513ebd4f1..000000000000 --- a/vendor/github.com/gizak/termui/canvas.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -/* -dots: - ,___, - |1 4| - |2 5| - |3 6| - |7 8| - ````` -*/ - -var brailleBase = '\u2800' - -var brailleOftMap = [4][2]rune{ - {'\u0001', '\u0008'}, - {'\u0002', '\u0010'}, - {'\u0004', '\u0020'}, - {'\u0040', '\u0080'}} - -// Canvas contains drawing map: i,j -> rune -type Canvas map[[2]int]rune - -// NewCanvas returns an empty Canvas -func NewCanvas() Canvas { - return make(map[[2]int]rune) -} - -func chOft(x, y int) rune { - return brailleOftMap[y%4][x%2] -} - -func (c Canvas) rawCh(x, y int) rune { - if ch, ok := c[[2]int{x, y}]; ok { - return ch - } - return '\u0000' //brailleOffset -} - -// return coordinate in terminal -func chPos(x, y int) (int, int) { - return y / 4, x / 2 -} - -// Set sets a point (x,y) in the virtual coordinate -func (c Canvas) Set(x, y int) { - i, j := chPos(x, y) - ch := c.rawCh(i, j) - ch |= chOft(x, y) - c[[2]int{i, j}] = ch -} - -// Unset removes point (x,y) -func (c Canvas) Unset(x, y int) { - i, j := chPos(x, y) - ch := c.rawCh(i, j) - ch &= ^chOft(x, y) - c[[2]int{i, j}] = ch -} - -// Buffer returns un-styled points -func (c Canvas) Buffer() Buffer { - buf := NewBuffer() - for k, v := range c { - buf.Set(k[0], k[1], Cell{Ch: v + brailleBase}) - } - return buf -} diff --git a/vendor/github.com/gizak/termui/config.py b/vendor/github.com/gizak/termui/config.py deleted file mode 100644 index 30fadcf86897..000000000000 --- a/vendor/github.com/gizak/termui/config.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python3 - -import re -import os -import io - -copyright = """// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -""" - -exclude_dirs = [".git", "_docs"] -exclude_files = [] -include_dirs = [".", "debug", "extra", "test", "_example"] - - -def is_target(fpath): - if os.path.splitext(fpath)[-1] == ".go": - return True - return False - - -def update_copyright(fpath): - print("processing " + fpath) - f = io.open(fpath, 'r', encoding='utf-8') - fstr = f.read() - f.close() - - # remove old - m = re.search('^// Copyright .+?\r?\n\r?\n', fstr, re.MULTILINE|re.DOTALL) - if m: - fstr = fstr[m.end():] - - # add new - fstr = copyright + fstr - f = io.open(fpath, 'w',encoding='utf-8') - f.write(fstr) - f.close() - - -def main(): - for d in include_dirs: - files = [ - os.path.join(d, f) for f in os.listdir(d) - if os.path.isfile(os.path.join(d, f)) - ] - for f in files: - if is_target(f): - update_copyright(f) - - -if __name__ == '__main__': - main() diff --git a/vendor/github.com/gizak/termui/doc.go b/vendor/github.com/gizak/termui/doc.go deleted file mode 100644 index 13924eb1f7d7..000000000000 --- a/vendor/github.com/gizak/termui/doc.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -/* -Package termui is a library designed for creating command line UI. For more info, goto http://github.com/gizak/termui - -A simplest example: - package main - - import ui "github.com/gizak/termui" - - func main() { - if err:=ui.Init(); err != nil { - panic(err) - } - defer ui.Close() - - g := ui.NewGauge() - g.Percent = 50 - g.Width = 50 - g.BorderLabel = "Gauge" - - ui.Render(g) - - ui.Loop() - } -*/ -package termui diff --git a/vendor/github.com/gizak/termui/events.go b/vendor/github.com/gizak/termui/events.go deleted file mode 100644 index 16d9bd9cc34a..000000000000 --- a/vendor/github.com/gizak/termui/events.go +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "path" - "strconv" - "sync" - "time" - - "github.com/nsf/termbox-go" -) - -type Event struct { - Type string - Path string - From string - To string - Data interface{} - Time int64 -} - -var sysEvtChs []chan Event - -type EvtKbd struct { - KeyStr string -} - -func evtKbd(e termbox.Event) EvtKbd { - ek := EvtKbd{} - - k := string(e.Ch) - pre := "" - mod := "" - - if e.Mod == termbox.ModAlt { - mod = "M-" - } - if e.Ch == 0 { - if e.Key > 0xFFFF-12 { - k = "" - } else if e.Key > 0xFFFF-25 { - ks := []string{"", "", "", "", "", "", "", "", "", ""} - k = ks[0xFFFF-int(e.Key)-12] - } - - if e.Key <= 0x7F { - pre = "C-" - k = string('a' - 1 + int(e.Key)) - kmap := map[termbox.Key][2]string{ - termbox.KeyCtrlSpace: {"C-", ""}, - termbox.KeyBackspace: {"", ""}, - termbox.KeyTab: {"", ""}, - termbox.KeyEnter: {"", ""}, - termbox.KeyEsc: {"", ""}, - termbox.KeyCtrlBackslash: {"C-", "\\"}, - termbox.KeyCtrlSlash: {"C-", "/"}, - termbox.KeySpace: {"", ""}, - termbox.KeyCtrl8: {"C-", "8"}, - } - if sk, ok := kmap[e.Key]; ok { - pre = sk[0] - k = sk[1] - } - } - } - - ek.KeyStr = pre + mod + k - return ek -} - -func crtTermboxEvt(e termbox.Event) Event { - systypemap := map[termbox.EventType]string{ - termbox.EventKey: "keyboard", - termbox.EventResize: "window", - termbox.EventMouse: "mouse", - termbox.EventError: "error", - termbox.EventInterrupt: "interrupt", - } - ne := Event{From: "/sys", Time: time.Now().Unix()} - typ := e.Type - ne.Type = systypemap[typ] - - switch typ { - case termbox.EventKey: - kbd := evtKbd(e) - ne.Path = "/sys/kbd/" + kbd.KeyStr - ne.Data = kbd - case termbox.EventResize: - wnd := EvtWnd{} - wnd.Width = e.Width - wnd.Height = e.Height - ne.Path = "/sys/wnd/resize" - ne.Data = wnd - case termbox.EventError: - err := EvtErr(e.Err) - ne.Path = "/sys/err" - ne.Data = err - case termbox.EventMouse: - m := EvtMouse{} - m.X = e.MouseX - m.Y = e.MouseY - ne.Path = "/sys/mouse" - ne.Data = m - } - return ne -} - -type EvtWnd struct { - Width int - Height int -} - -type EvtMouse struct { - X int - Y int - Press string -} - -type EvtErr error - -func hookTermboxEvt() { - for { - e := termbox.PollEvent() - - for _, c := range sysEvtChs { - go func(ch chan Event) { - ch <- crtTermboxEvt(e) - }(c) - } - } -} - -func NewSysEvtCh() chan Event { - ec := make(chan Event) - sysEvtChs = append(sysEvtChs, ec) - return ec -} - -var DefaultEvtStream = NewEvtStream() - -type EvtStream struct { - sync.RWMutex - srcMap map[string]chan Event - stream chan Event - wg sync.WaitGroup - sigStopLoop chan Event - Handlers map[string]func(Event) - hook func(Event) -} - -func NewEvtStream() *EvtStream { - return &EvtStream{ - srcMap: make(map[string]chan Event), - stream: make(chan Event), - Handlers: make(map[string]func(Event)), - sigStopLoop: make(chan Event), - } -} - -func (es *EvtStream) Init() { - es.Merge("internal", es.sigStopLoop) - go func() { - es.wg.Wait() - close(es.stream) - }() -} - -func cleanPath(p string) string { - if p == "" { - return "/" - } - if p[0] != '/' { - p = "/" + p - } - return path.Clean(p) -} - -func isPathMatch(pattern, path string) bool { - if len(pattern) == 0 { - return false - } - n := len(pattern) - return len(path) >= n && path[0:n] == pattern -} - -func (es *EvtStream) Merge(name string, ec chan Event) { - es.Lock() - defer es.Unlock() - - es.wg.Add(1) - es.srcMap[name] = ec - - go func(a chan Event) { - for n := range a { - n.From = name - es.stream <- n - } - es.wg.Done() - }(ec) -} - -func (es *EvtStream) Handle(path string, handler func(Event)) { - es.Handlers[cleanPath(path)] = handler -} - -func findMatch(mux map[string]func(Event), path string) string { - n := -1 - pattern := "" - for m := range mux { - if !isPathMatch(m, path) { - continue - } - if len(m) > n { - pattern = m - n = len(m) - } - } - return pattern - -} - -// Remove all existing defined Handlers from the map -func (es *EvtStream) ResetHandlers() { - for Path, _ := range es.Handlers { - delete(es.Handlers, Path) - } - return -} - -func (es *EvtStream) match(path string) string { - return findMatch(es.Handlers, path) -} - -func (es *EvtStream) Hook(f func(Event)) { - es.hook = f -} - -func (es *EvtStream) Loop() { - for e := range es.stream { - switch e.Path { - case "/sig/stoploop": - return - } - go func(a Event) { - es.RLock() - defer es.RUnlock() - if pattern := es.match(a.Path); pattern != "" { - es.Handlers[pattern](a) - } - }(e) - if es.hook != nil { - es.hook(e) - } - } -} - -func (es *EvtStream) StopLoop() { - go func() { - e := Event{ - Path: "/sig/stoploop", - } - es.sigStopLoop <- e - }() -} - -func Merge(name string, ec chan Event) { - DefaultEvtStream.Merge(name, ec) -} - -func Handle(path string, handler func(Event)) { - DefaultEvtStream.Handle(path, handler) -} - -func Loop() { - DefaultEvtStream.Loop() -} - -func StopLoop() { - DefaultEvtStream.StopLoop() -} - -type EvtTimer struct { - Duration time.Duration - Count uint64 -} - -func NewTimerCh(du time.Duration) chan Event { - t := make(chan Event) - - go func(a chan Event) { - n := uint64(0) - for { - n++ - time.Sleep(du) - e := Event{} - e.Type = "timer" - e.Path = "/timer/" + du.String() - e.Time = time.Now().Unix() - e.Data = EvtTimer{ - Duration: du, - Count: n, - } - t <- e - - } - }(t) - return t -} - -var DefaultHandler = func(e Event) { -} - -var usrEvtCh = make(chan Event) - -func SendCustomEvt(path string, data interface{}) { - e := Event{} - e.Path = path - e.Data = data - e.Time = time.Now().Unix() - usrEvtCh <- e -} diff --git a/vendor/github.com/gizak/termui/gauge.go b/vendor/github.com/gizak/termui/gauge.go deleted file mode 100644 index 9f6ce3a706c2..000000000000 --- a/vendor/github.com/gizak/termui/gauge.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "strconv" - "strings" -) - -// Gauge is a progress bar like widget. -// A simple example: -/* - g := termui.NewGauge() - g.Percent = 40 - g.Width = 50 - g.Height = 3 - g.BorderLabel = "Slim Gauge" - g.BarColor = termui.ColorRed - g.PercentColor = termui.ColorBlue -*/ - -const ColorUndef Attribute = Attribute(^uint16(0)) - -type Gauge struct { - Block - Percent int - BarColor Attribute - PercentColor Attribute - PercentColorHighlighted Attribute - Label string - LabelAlign Align -} - -// NewGauge return a new gauge with current theme. -func NewGauge() *Gauge { - g := &Gauge{ - Block: *NewBlock(), - PercentColor: ThemeAttr("gauge.percent.fg"), - BarColor: ThemeAttr("gauge.bar.bg"), - Label: "{{percent}}%", - LabelAlign: AlignCenter, - PercentColorHighlighted: ColorUndef, - } - - g.Width = 12 - g.Height = 5 - return g -} - -// Buffer implements Bufferer interface. -func (g *Gauge) Buffer() Buffer { - buf := g.Block.Buffer() - - // plot bar - w := g.Percent * g.innerArea.Dx() / 100 - for i := 0; i < g.innerArea.Dy(); i++ { - for j := 0; j < w; j++ { - c := Cell{} - c.Ch = ' ' - c.Bg = g.BarColor - if c.Bg == ColorDefault { - c.Bg |= AttrReverse - } - buf.Set(g.innerArea.Min.X+j, g.innerArea.Min.Y+i, c) - } - } - - // plot percentage - s := strings.Replace(g.Label, "{{percent}}", strconv.Itoa(g.Percent), -1) - pry := g.innerArea.Min.Y + g.innerArea.Dy()/2 - rs := str2runes(s) - var pos int - switch g.LabelAlign { - case AlignLeft: - pos = 0 - - case AlignCenter: - pos = (g.innerArea.Dx() - strWidth(s)) / 2 - - case AlignRight: - pos = g.innerArea.Dx() - strWidth(s) - 1 - } - pos += g.innerArea.Min.X - - for i, v := range rs { - c := Cell{ - Ch: v, - Fg: g.PercentColor, - } - - if w+g.innerArea.Min.X > pos+i { - c.Bg = g.BarColor - if c.Bg == ColorDefault { - c.Bg |= AttrReverse - } - - if g.PercentColorHighlighted != ColorUndef { - c.Fg = g.PercentColorHighlighted - } - } else { - c.Bg = g.Block.Bg - } - - buf.Set(1+pos+i, pry, c) - } - return buf -} diff --git a/vendor/github.com/gizak/termui/glide.lock b/vendor/github.com/gizak/termui/glide.lock deleted file mode 100644 index be5952d4666d..000000000000 --- a/vendor/github.com/gizak/termui/glide.lock +++ /dev/null @@ -1,30 +0,0 @@ -hash: 7a754ba100256404a978b2fc8738aee337beb822458e4b6060399fb89ebd215c -updated: 2016-11-03T17:39:24.323773674-04:00 -imports: -- name: github.com/maruel/panicparse - version: ad661195ed0e88491e0f14be6613304e3b1141d6 - subpackages: - - stack -- name: github.com/mattn/go-runewidth - version: 737072b4e32b7a5018b4a7125da8d12de90e8045 -- name: github.com/mitchellh/go-wordwrap - version: ad45545899c7b13c020ea92b2072220eefad42b8 -- name: github.com/nsf/termbox-go - version: b6acae516ace002cb8105a89024544a1480655a5 -- name: golang.org/x/net - version: 569280fa63be4e201b975e5411e30a92178f0118 - subpackages: - - websocket -testImports: -- name: github.com/davecgh/go-spew - version: 346938d642f2ec3594ed81d874461961cd0faa76 - subpackages: - - spew -- name: github.com/pmezard/go-difflib - version: d8ed2627bdf02c080bf22230dbb337003b7aba2d - subpackages: - - difflib -- name: github.com/stretchr/testify - version: 976c720a22c8eb4eb6a0b4348ad85ad12491a506 - subpackages: - - assert diff --git a/vendor/github.com/gizak/termui/glide.yaml b/vendor/github.com/gizak/termui/glide.yaml deleted file mode 100644 index a6812317f7a6..000000000000 --- a/vendor/github.com/gizak/termui/glide.yaml +++ /dev/null @@ -1,9 +0,0 @@ -package: github.com/gizak/termui -import: -- package: github.com/mattn/go-runewidth -- package: github.com/mitchellh/go-wordwrap -- package: github.com/nsf/termbox-go -- package: golang.org/x/net - subpackages: - - websocket -- package: github.com/maruel/panicparse diff --git a/vendor/github.com/gizak/termui/grid.go b/vendor/github.com/gizak/termui/grid.go deleted file mode 100644 index a9502322535a..000000000000 --- a/vendor/github.com/gizak/termui/grid.go +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -// GridBufferer introduces a Bufferer that can be manipulated by Grid. -type GridBufferer interface { - Bufferer - GetHeight() int - SetWidth(int) - SetX(int) - SetY(int) -} - -// Row builds a layout tree -type Row struct { - Cols []*Row //children - Widget GridBufferer // root - X int - Y int - Width int - Height int - Span int - Offset int -} - -// calculate and set the underlying layout tree's x, y, height and width. -func (r *Row) calcLayout() { - r.assignWidth(r.Width) - r.Height = r.solveHeight() - r.assignX(r.X) - r.assignY(r.Y) -} - -// tell if the node is leaf in the tree. -func (r *Row) isLeaf() bool { - return r.Cols == nil || len(r.Cols) == 0 -} - -func (r *Row) isRenderableLeaf() bool { - return r.isLeaf() && r.Widget != nil -} - -// assign widgets' (and their parent rows') width recursively. -func (r *Row) assignWidth(w int) { - r.SetWidth(w) - - accW := 0 // acc span and offset - calcW := make([]int, len(r.Cols)) // calculated width - calcOftX := make([]int, len(r.Cols)) // computated start position of x - - for i, c := range r.Cols { - accW += c.Span + c.Offset - cw := int(float64(c.Span*r.Width) / 12.0) - - if i >= 1 { - calcOftX[i] = calcOftX[i-1] + - calcW[i-1] + - int(float64(r.Cols[i-1].Offset*r.Width)/12.0) - } - - // use up the space if it is the last col - if i == len(r.Cols)-1 && accW == 12 { - cw = r.Width - calcOftX[i] - } - calcW[i] = cw - r.Cols[i].assignWidth(cw) - } -} - -// bottom up calc and set rows' (and their widgets') height, -// return r's total height. -func (r *Row) solveHeight() int { - if r.isRenderableLeaf() { - r.Height = r.Widget.GetHeight() - return r.Widget.GetHeight() - } - - maxh := 0 - if !r.isLeaf() { - for _, c := range r.Cols { - nh := c.solveHeight() - // when embed rows in Cols, row widgets stack up - if r.Widget != nil { - nh += r.Widget.GetHeight() - } - if nh > maxh { - maxh = nh - } - } - } - - r.Height = maxh - return maxh -} - -// recursively assign x position for r tree. -func (r *Row) assignX(x int) { - r.SetX(x) - - if !r.isLeaf() { - acc := 0 - for i, c := range r.Cols { - if c.Offset != 0 { - acc += int(float64(c.Offset*r.Width) / 12.0) - } - r.Cols[i].assignX(x + acc) - acc += c.Width - } - } -} - -// recursively assign y position to r. -func (r *Row) assignY(y int) { - r.SetY(y) - - if r.isLeaf() { - return - } - - for i := range r.Cols { - acc := 0 - if r.Widget != nil { - acc = r.Widget.GetHeight() - } - r.Cols[i].assignY(y + acc) - } - -} - -// GetHeight implements GridBufferer interface. -func (r Row) GetHeight() int { - return r.Height -} - -// SetX implements GridBufferer interface. -func (r *Row) SetX(x int) { - r.X = x - if r.Widget != nil { - r.Widget.SetX(x) - } -} - -// SetY implements GridBufferer interface. -func (r *Row) SetY(y int) { - r.Y = y - if r.Widget != nil { - r.Widget.SetY(y) - } -} - -// SetWidth implements GridBufferer interface. -func (r *Row) SetWidth(w int) { - r.Width = w - if r.Widget != nil { - r.Widget.SetWidth(w) - } -} - -// Buffer implements Bufferer interface, -// recursively merge all widgets buffer -func (r *Row) Buffer() Buffer { - merged := NewBuffer() - - if r.isRenderableLeaf() { - return r.Widget.Buffer() - } - - // for those are not leaves but have a renderable widget - if r.Widget != nil { - merged.Merge(r.Widget.Buffer()) - } - - // collect buffer from children - if !r.isLeaf() { - for _, c := range r.Cols { - merged.Merge(c.Buffer()) - } - } - - return merged -} - -// Grid implements 12 columns system. -// A simple example: -/* - import ui "github.com/gizak/termui" - // init and create widgets... - - // build - ui.Body.AddRows( - ui.NewRow( - ui.NewCol(6, 0, widget0), - ui.NewCol(6, 0, widget1)), - ui.NewRow( - ui.NewCol(3, 0, widget2), - ui.NewCol(3, 0, widget30, widget31, widget32), - ui.NewCol(6, 0, widget4))) - - // calculate layout - ui.Body.Align() - - ui.Render(ui.Body) -*/ -type Grid struct { - Rows []*Row - Width int - X int - Y int - BgColor Attribute -} - -// NewGrid returns *Grid with given rows. -func NewGrid(rows ...*Row) *Grid { - return &Grid{Rows: rows} -} - -// AddRows appends given rows to Grid. -func (g *Grid) AddRows(rs ...*Row) { - g.Rows = append(g.Rows, rs...) -} - -// NewRow creates a new row out of given columns. -func NewRow(cols ...*Row) *Row { - rs := &Row{Span: 12, Cols: cols} - return rs -} - -// NewCol accepts: widgets are LayoutBufferer or widgets is A NewRow. -// Note that if multiple widgets are provided, they will stack up in the col. -func NewCol(span, offset int, widgets ...GridBufferer) *Row { - r := &Row{Span: span, Offset: offset} - - if widgets != nil && len(widgets) == 1 { - wgt := widgets[0] - nw, isRow := wgt.(*Row) - if isRow { - r.Cols = nw.Cols - } else { - r.Widget = wgt - } - return r - } - - r.Cols = []*Row{} - ir := r - for _, w := range widgets { - nr := &Row{Span: 12, Widget: w} - ir.Cols = []*Row{nr} - ir = nr - } - - return r -} - -// Align calculate each rows' layout. -func (g *Grid) Align() { - h := 0 - for _, r := range g.Rows { - r.SetWidth(g.Width) - r.SetX(g.X) - r.SetY(g.Y + h) - r.calcLayout() - h += r.GetHeight() - } -} - -// Buffer implments Bufferer interface. -func (g Grid) Buffer() Buffer { - buf := NewBuffer() - - for _, r := range g.Rows { - buf.Merge(r.Buffer()) - } - return buf -} - -var Body *Grid diff --git a/vendor/github.com/gizak/termui/helper.go b/vendor/github.com/gizak/termui/helper.go deleted file mode 100644 index 18a677043577..000000000000 --- a/vendor/github.com/gizak/termui/helper.go +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "regexp" - "strings" - - tm "github.com/nsf/termbox-go" -) -import rw "github.com/mattn/go-runewidth" - -/* ---------------Port from termbox-go --------------------- */ - -// Attribute is printable cell's color and style. -type Attribute uint16 - -// 8 basic clolrs -const ( - ColorDefault Attribute = iota - ColorBlack - ColorRed - ColorGreen - ColorYellow - ColorBlue - ColorMagenta - ColorCyan - ColorWhite -) - -//Have a constant that defines number of colors -const NumberofColors = 8 - -// Text style -const ( - AttrBold Attribute = 1 << (iota + 9) - AttrUnderline - AttrReverse -) - -var ( - dot = "…" - dotw = rw.StringWidth(dot) -) - -/* ----------------------- End ----------------------------- */ - -func toTmAttr(x Attribute) tm.Attribute { - return tm.Attribute(x) -} - -func str2runes(s string) []rune { - return []rune(s) -} - -// Here for backwards-compatibility. -func trimStr2Runes(s string, w int) []rune { - return TrimStr2Runes(s, w) -} - -// TrimStr2Runes trims string to w[-1 rune], appends …, and returns the runes -// of that string if string is grather then n. If string is small then w, -// return the runes. -func TrimStr2Runes(s string, w int) []rune { - if w <= 0 { - return []rune{} - } - - sw := rw.StringWidth(s) - if sw > w { - return []rune(rw.Truncate(s, w, dot)) - } - return str2runes(s) -} - -// TrimStrIfAppropriate trim string to "s[:-1] + …" -// if string > width otherwise return string -func TrimStrIfAppropriate(s string, w int) string { - if w <= 0 { - return "" - } - - sw := rw.StringWidth(s) - if sw > w { - return rw.Truncate(s, w, dot) - } - - return s -} - -func strWidth(s string) int { - return rw.StringWidth(s) -} - -func charWidth(ch rune) int { - return rw.RuneWidth(ch) -} - -var whiteSpaceRegex = regexp.MustCompile(`\s`) - -// StringToAttribute converts text to a termui attribute. You may specifiy more -// then one attribute like that: "BLACK, BOLD, ...". All whitespaces -// are ignored. -func StringToAttribute(text string) Attribute { - text = whiteSpaceRegex.ReplaceAllString(strings.ToLower(text), "") - attributes := strings.Split(text, ",") - result := Attribute(0) - - for _, theAttribute := range attributes { - var match Attribute - switch theAttribute { - case "reset", "default": - match = ColorDefault - - case "black": - match = ColorBlack - - case "red": - match = ColorRed - - case "green": - match = ColorGreen - - case "yellow": - match = ColorYellow - - case "blue": - match = ColorBlue - - case "magenta": - match = ColorMagenta - - case "cyan": - match = ColorCyan - - case "white": - match = ColorWhite - - case "bold": - match = AttrBold - - case "underline": - match = AttrUnderline - - case "reverse": - match = AttrReverse - } - - result |= match - } - - return result -} - -// TextCells returns a coloured text cells []Cell -func TextCells(s string, fg, bg Attribute) []Cell { - cs := make([]Cell, 0, len(s)) - - // sequence := MarkdownTextRendererFactory{}.TextRenderer(s).Render(fg, bg) - // runes := []rune(sequence.NormalizedText) - runes := str2runes(s) - - for n := range runes { - // point, _ := sequence.PointAt(n, 0, 0) - // cs = append(cs, Cell{point.Ch, point.Fg, point.Bg}) - cs = append(cs, Cell{runes[n], fg, bg}) - } - return cs -} - -// Width returns the actual screen space the cell takes (usually 1 or 2). -func (c Cell) Width() int { - return charWidth(c.Ch) -} - -// Copy return a copy of c -func (c Cell) Copy() Cell { - return c -} - -// TrimTxCells trims the overflowed text cells sequence. -func TrimTxCells(cs []Cell, w int) []Cell { - if len(cs) <= w { - return cs - } - return cs[:w] -} - -// DTrimTxCls trims the overflowed text cells sequence and append dots at the end. -func DTrimTxCls(cs []Cell, w int) []Cell { - l := len(cs) - if l <= 0 { - return []Cell{} - } - - rt := make([]Cell, 0, w) - csw := 0 - for i := 0; i < l && csw <= w; i++ { - c := cs[i] - cw := c.Width() - - if cw+csw < w { - rt = append(rt, c) - csw += cw - } else { - rt = append(rt, Cell{'…', c.Fg, c.Bg}) - break - } - } - - return rt -} - -func CellsToStr(cs []Cell) string { - str := "" - for _, c := range cs { - str += string(c.Ch) - } - return str -} diff --git a/vendor/github.com/gizak/termui/linechart.go b/vendor/github.com/gizak/termui/linechart.go deleted file mode 100644 index f7eea28bbe45..000000000000 --- a/vendor/github.com/gizak/termui/linechart.go +++ /dev/null @@ -1,331 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "fmt" - "math" -) - -// only 16 possible combinations, why bother -var braillePatterns = map[[2]int]rune{ - [2]int{0, 0}: '⣀', - [2]int{0, 1}: '⡠', - [2]int{0, 2}: '⡐', - [2]int{0, 3}: '⡈', - - [2]int{1, 0}: '⢄', - [2]int{1, 1}: '⠤', - [2]int{1, 2}: '⠔', - [2]int{1, 3}: '⠌', - - [2]int{2, 0}: '⢂', - [2]int{2, 1}: '⠢', - [2]int{2, 2}: '⠒', - [2]int{2, 3}: '⠊', - - [2]int{3, 0}: '⢁', - [2]int{3, 1}: '⠡', - [2]int{3, 2}: '⠑', - [2]int{3, 3}: '⠉', -} - -var lSingleBraille = [4]rune{'\u2840', '⠄', '⠂', '⠁'} -var rSingleBraille = [4]rune{'\u2880', '⠠', '⠐', '⠈'} - -// LineChart has two modes: braille(default) and dot. Using braille gives 2x capicity as dot mode, -// because one braille char can represent two data points. -/* - lc := termui.NewLineChart() - lc.BorderLabel = "braille-mode Line Chart" - lc.Data = [1.2, 1.3, 1.5, 1.7, 1.5, 1.6, 1.8, 2.0] - lc.Width = 50 - lc.Height = 12 - lc.AxesColor = termui.ColorWhite - lc.LineColor = termui.ColorGreen | termui.AttrBold - // termui.Render(lc)... -*/ -type LineChart struct { - Block - Data []float64 - DataLabels []string // if unset, the data indices will be used - Mode string // braille | dot - DotStyle rune - LineColor Attribute - scale float64 // data span per cell on y-axis - AxesColor Attribute - drawingX int - drawingY int - axisYHeight int - axisXWidth int - axisYLabelGap int - axisXLabelGap int - topValue float64 - bottomValue float64 - labelX [][]rune - labelY [][]rune - labelYSpace int - maxY float64 - minY float64 - autoLabels bool -} - -// NewLineChart returns a new LineChart with current theme. -func NewLineChart() *LineChart { - lc := &LineChart{Block: *NewBlock()} - lc.AxesColor = ThemeAttr("linechart.axes.fg") - lc.LineColor = ThemeAttr("linechart.line.fg") - lc.Mode = "braille" - lc.DotStyle = '•' - lc.axisXLabelGap = 2 - lc.axisYLabelGap = 1 - lc.bottomValue = math.Inf(1) - lc.topValue = math.Inf(-1) - return lc -} - -// one cell contains two data points -// so the capicity is 2x as dot-mode -func (lc *LineChart) renderBraille() Buffer { - buf := NewBuffer() - - // return: b -> which cell should the point be in - // m -> in the cell, divided into 4 equal height levels, which subcell? - getPos := func(d float64) (b, m int) { - cnt4 := int((d-lc.bottomValue)/(lc.scale/4) + 0.5) - b = cnt4 / 4 - m = cnt4 % 4 - return - } - // plot points - for i := 0; 2*i+1 < len(lc.Data) && i < lc.axisXWidth; i++ { - b0, m0 := getPos(lc.Data[2*i]) - b1, m1 := getPos(lc.Data[2*i+1]) - - if b0 == b1 { - c := Cell{ - Ch: braillePatterns[[2]int{m0, m1}], - Bg: lc.Bg, - Fg: lc.LineColor, - } - y := lc.innerArea.Min.Y + lc.innerArea.Dy() - 3 - b0 - x := lc.innerArea.Min.X + lc.labelYSpace + 1 + i - buf.Set(x, y, c) - } else { - c0 := Cell{Ch: lSingleBraille[m0], - Fg: lc.LineColor, - Bg: lc.Bg} - x0 := lc.innerArea.Min.X + lc.labelYSpace + 1 + i - y0 := lc.innerArea.Min.Y + lc.innerArea.Dy() - 3 - b0 - buf.Set(x0, y0, c0) - - c1 := Cell{Ch: rSingleBraille[m1], - Fg: lc.LineColor, - Bg: lc.Bg} - x1 := lc.innerArea.Min.X + lc.labelYSpace + 1 + i - y1 := lc.innerArea.Min.Y + lc.innerArea.Dy() - 3 - b1 - buf.Set(x1, y1, c1) - } - - } - return buf -} - -func (lc *LineChart) renderDot() Buffer { - buf := NewBuffer() - for i := 0; i < len(lc.Data) && i < lc.axisXWidth; i++ { - c := Cell{ - Ch: lc.DotStyle, - Fg: lc.LineColor, - Bg: lc.Bg, - } - x := lc.innerArea.Min.X + lc.labelYSpace + 1 + i - y := lc.innerArea.Min.Y + lc.innerArea.Dy() - 3 - int((lc.Data[i]-lc.bottomValue)/lc.scale+0.5) - buf.Set(x, y, c) - } - - return buf -} - -func (lc *LineChart) calcLabelX() { - lc.labelX = [][]rune{} - - for i, l := 0, 0; i < len(lc.DataLabels) && l < lc.axisXWidth; i++ { - if lc.Mode == "dot" { - if l >= len(lc.DataLabels) { - break - } - - s := str2runes(lc.DataLabels[l]) - w := strWidth(lc.DataLabels[l]) - if l+w <= lc.axisXWidth { - lc.labelX = append(lc.labelX, s) - } - l += w + lc.axisXLabelGap - } else { // braille - if 2*l >= len(lc.DataLabels) { - break - } - - s := str2runes(lc.DataLabels[2*l]) - w := strWidth(lc.DataLabels[2*l]) - if l+w <= lc.axisXWidth { - lc.labelX = append(lc.labelX, s) - } - l += w + lc.axisXLabelGap - - } - } -} - -func shortenFloatVal(x float64) string { - s := fmt.Sprintf("%.2f", x) - if len(s)-3 > 3 { - s = fmt.Sprintf("%.2e", x) - } - - if x < 0 { - s = fmt.Sprintf("%.2f", x) - } - return s -} - -func (lc *LineChart) calcLabelY() { - span := lc.topValue - lc.bottomValue - lc.scale = span / float64(lc.axisYHeight) - - n := (1 + lc.axisYHeight) / (lc.axisYLabelGap + 1) - lc.labelY = make([][]rune, n) - maxLen := 0 - for i := 0; i < n; i++ { - s := str2runes(shortenFloatVal(lc.bottomValue + float64(i)*span/float64(n))) - if len(s) > maxLen { - maxLen = len(s) - } - lc.labelY[i] = s - } - - lc.labelYSpace = maxLen -} - -func (lc *LineChart) calcLayout() { - // set datalabels if it is not provided - if (lc.DataLabels == nil || len(lc.DataLabels) == 0) || lc.autoLabels { - lc.autoLabels = true - lc.DataLabels = make([]string, len(lc.Data)) - for i := range lc.Data { - lc.DataLabels[i] = fmt.Sprint(i) - } - } - - // lazy increase, to avoid y shaking frequently - // update bound Y when drawing is gonna overflow - lc.minY = lc.Data[0] - lc.maxY = lc.Data[0] - - // valid visible range - vrange := lc.innerArea.Dx() - if lc.Mode == "braille" { - vrange = 2 * lc.innerArea.Dx() - } - if vrange > len(lc.Data) { - vrange = len(lc.Data) - } - - for _, v := range lc.Data[:vrange] { - if v > lc.maxY { - lc.maxY = v - } - if v < lc.minY { - lc.minY = v - } - } - - span := lc.maxY - lc.minY - - if lc.minY < lc.bottomValue { - lc.bottomValue = lc.minY - 0.2*span - } - - if lc.maxY > lc.topValue { - lc.topValue = lc.maxY + 0.2*span - } - - lc.axisYHeight = lc.innerArea.Dy() - 2 - lc.calcLabelY() - - lc.axisXWidth = lc.innerArea.Dx() - 1 - lc.labelYSpace - lc.calcLabelX() - - lc.drawingX = lc.innerArea.Min.X + 1 + lc.labelYSpace - lc.drawingY = lc.innerArea.Min.Y -} - -func (lc *LineChart) plotAxes() Buffer { - buf := NewBuffer() - - origY := lc.innerArea.Min.Y + lc.innerArea.Dy() - 2 - origX := lc.innerArea.Min.X + lc.labelYSpace - - buf.Set(origX, origY, Cell{Ch: ORIGIN, Fg: lc.AxesColor, Bg: lc.Bg}) - - for x := origX + 1; x < origX+lc.axisXWidth; x++ { - buf.Set(x, origY, Cell{Ch: HDASH, Fg: lc.AxesColor, Bg: lc.Bg}) - } - - for dy := 1; dy <= lc.axisYHeight; dy++ { - buf.Set(origX, origY-dy, Cell{Ch: VDASH, Fg: lc.AxesColor, Bg: lc.Bg}) - } - - // x label - oft := 0 - for _, rs := range lc.labelX { - if oft+len(rs) > lc.axisXWidth { - break - } - for j, r := range rs { - c := Cell{ - Ch: r, - Fg: lc.AxesColor, - Bg: lc.Bg, - } - x := origX + oft + j - y := lc.innerArea.Min.Y + lc.innerArea.Dy() - 1 - buf.Set(x, y, c) - } - oft += len(rs) + lc.axisXLabelGap - } - - // y labels - for i, rs := range lc.labelY { - for j, r := range rs { - buf.Set( - lc.innerArea.Min.X+j, - origY-i*(lc.axisYLabelGap+1), - Cell{Ch: r, Fg: lc.AxesColor, Bg: lc.Bg}) - } - } - - return buf -} - -// Buffer implements Bufferer interface. -func (lc *LineChart) Buffer() Buffer { - buf := lc.Block.Buffer() - - if lc.Data == nil || len(lc.Data) == 0 { - return buf - } - lc.calcLayout() - buf.Merge(lc.plotAxes()) - - if lc.Mode == "dot" { - buf.Merge(lc.renderDot()) - } else { - buf.Merge(lc.renderBraille()) - } - - return buf -} diff --git a/vendor/github.com/gizak/termui/linechart_others.go b/vendor/github.com/gizak/termui/linechart_others.go deleted file mode 100644 index 14897ea0f838..000000000000 --- a/vendor/github.com/gizak/termui/linechart_others.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -// +build !windows - -package termui - -const VDASH = '┊' -const HDASH = '┈' -const ORIGIN = '└' diff --git a/vendor/github.com/gizak/termui/linechart_windows.go b/vendor/github.com/gizak/termui/linechart_windows.go deleted file mode 100644 index 994d3e590045..000000000000 --- a/vendor/github.com/gizak/termui/linechart_windows.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -// +build windows - -package termui - -const VDASH = '|' -const HDASH = '-' -const ORIGIN = '+' diff --git a/vendor/github.com/gizak/termui/list.go b/vendor/github.com/gizak/termui/list.go deleted file mode 100644 index ea6635eccc00..000000000000 --- a/vendor/github.com/gizak/termui/list.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import "strings" - -// List displays []string as its items, -// it has a Overflow option (default is "hidden"), when set to "hidden", -// the item exceeding List's width is truncated, but when set to "wrap", -// the overflowed text breaks into next line. -/* - strs := []string{ - "[0] github.com/gizak/termui", - "[1] editbox.go", - "[2] iterrupt.go", - "[3] keyboard.go", - "[4] output.go", - "[5] random_out.go", - "[6] dashboard.go", - "[7] nsf/termbox-go"} - - ls := termui.NewList() - ls.Items = strs - ls.ItemFgColor = termui.ColorYellow - ls.BorderLabel = "List" - ls.Height = 7 - ls.Width = 25 - ls.Y = 0 -*/ -type List struct { - Block - Items []string - Overflow string - ItemFgColor Attribute - ItemBgColor Attribute -} - -// NewList returns a new *List with current theme. -func NewList() *List { - l := &List{Block: *NewBlock()} - l.Overflow = "hidden" - l.ItemFgColor = ThemeAttr("list.item.fg") - l.ItemBgColor = ThemeAttr("list.item.bg") - return l -} - -// Buffer implements Bufferer interface. -func (l *List) Buffer() Buffer { - buf := l.Block.Buffer() - - switch l.Overflow { - case "wrap": - cs := DefaultTxBuilder.Build(strings.Join(l.Items, "\n"), l.ItemFgColor, l.ItemBgColor) - i, j, k := 0, 0, 0 - for i < l.innerArea.Dy() && k < len(cs) { - w := cs[k].Width() - if cs[k].Ch == '\n' || j+w > l.innerArea.Dx() { - i++ - j = 0 - if cs[k].Ch == '\n' { - k++ - } - continue - } - buf.Set(l.innerArea.Min.X+j, l.innerArea.Min.Y+i, cs[k]) - - k++ - j++ - } - - case "hidden": - trimItems := l.Items - if len(trimItems) > l.innerArea.Dy() { - trimItems = trimItems[:l.innerArea.Dy()] - } - for i, v := range trimItems { - cs := DTrimTxCls(DefaultTxBuilder.Build(v, l.ItemFgColor, l.ItemBgColor), l.innerArea.Dx()) - j := 0 - for _, vv := range cs { - w := vv.Width() - buf.Set(l.innerArea.Min.X+j, l.innerArea.Min.Y+i, vv) - j += w - } - } - } - return buf -} diff --git a/vendor/github.com/gizak/termui/mbarchart.go b/vendor/github.com/gizak/termui/mbarchart.go deleted file mode 100644 index 0f91e9713f34..000000000000 --- a/vendor/github.com/gizak/termui/mbarchart.go +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "fmt" -) - -// This is the implemetation of multi-colored or stacked bar graph. This is different from default barGraph which is implemented in bar.go -// Multi-Colored-BarChart creates multiple bars in a widget: -/* - bc := termui.NewMBarChart() - data := make([][]int, 2) - data[0] := []int{3, 2, 5, 7, 9, 4} - data[1] := []int{7, 8, 5, 3, 1, 6} - bclabels := []string{"S0", "S1", "S2", "S3", "S4", "S5"} - bc.BorderLabel = "Bar Chart" - bc.Data = data - bc.Width = 26 - bc.Height = 10 - bc.DataLabels = bclabels - bc.TextColor = termui.ColorGreen - bc.BarColor = termui.ColorRed - bc.NumColor = termui.ColorYellow -*/ -type MBarChart struct { - Block - BarColor [NumberofColors]Attribute - TextColor Attribute - NumColor [NumberofColors]Attribute - Data [NumberofColors][]int - DataLabels []string - BarWidth int - BarGap int - labels [][]rune - dataNum [NumberofColors][][]rune - numBar int - scale float64 - max int - minDataLen int - numStack int - ShowScale bool - maxScale []rune -} - -// NewBarChart returns a new *BarChart with current theme. -func NewMBarChart() *MBarChart { - bc := &MBarChart{Block: *NewBlock()} - bc.BarColor[0] = ThemeAttr("mbarchart.bar.bg") - bc.NumColor[0] = ThemeAttr("mbarchart.num.fg") - bc.TextColor = ThemeAttr("mbarchart.text.fg") - bc.BarGap = 1 - bc.BarWidth = 3 - return bc -} - -func (bc *MBarChart) layout() { - bc.numBar = bc.innerArea.Dx() / (bc.BarGap + bc.BarWidth) - bc.labels = make([][]rune, bc.numBar) - DataLen := 0 - LabelLen := len(bc.DataLabels) - bc.minDataLen = 9999 //Set this to some very hight value so that we find the minimum one We want to know which array among data[][] has got the least length - - // We need to know how many stack/data array data[0] , data[1] are there - for i := 0; i < len(bc.Data); i++ { - if bc.Data[i] == nil { - break - } - DataLen++ - } - bc.numStack = DataLen - - //We need to know what is the mimimum size of data array data[0] could have 10 elements data[1] could have only 5, so we plot only 5 bar graphs - - for i := 0; i < DataLen; i++ { - if bc.minDataLen > len(bc.Data[i]) { - bc.minDataLen = len(bc.Data[i]) - } - } - - if LabelLen > bc.minDataLen { - LabelLen = bc.minDataLen - } - - for i := 0; i < LabelLen && i < bc.numBar; i++ { - bc.labels[i] = trimStr2Runes(bc.DataLabels[i], bc.BarWidth) - } - - for i := 0; i < bc.numStack; i++ { - bc.dataNum[i] = make([][]rune, len(bc.Data[i])) - //For each stack of bar calcualte the rune - for j := 0; j < LabelLen && i < bc.numBar; j++ { - n := bc.Data[i][j] - s := fmt.Sprint(n) - bc.dataNum[i][j] = trimStr2Runes(s, bc.BarWidth) - } - //If color is not defined by default then populate a color that is different from the prevous bar - if bc.BarColor[i] == ColorDefault && bc.NumColor[i] == ColorDefault { - if i == 0 { - bc.BarColor[i] = ColorBlack - } else { - bc.BarColor[i] = bc.BarColor[i-1] + 1 - if bc.BarColor[i] > NumberofColors { - bc.BarColor[i] = ColorBlack - } - } - bc.NumColor[i] = (NumberofColors + 1) - bc.BarColor[i] //Make NumColor opposite of barColor for visibility - } - } - - //If Max value is not set then we have to populate, this time the max value will be max(sum(d1[0],d2[0],d3[0]) .... sum(d1[n], d2[n], d3[n])) - - if bc.max == 0 { - bc.max = -1 - } - for i := 0; i < bc.minDataLen && i < LabelLen; i++ { - var dsum int - for j := 0; j < bc.numStack; j++ { - dsum += bc.Data[j][i] - } - if dsum > bc.max { - bc.max = dsum - } - } - - //Finally Calculate max sale - if bc.ShowScale { - s := fmt.Sprintf("%d", bc.max) - bc.maxScale = trimStr2Runes(s, len(s)) - bc.scale = float64(bc.max) / float64(bc.innerArea.Dy()-2) - } else { - bc.scale = float64(bc.max) / float64(bc.innerArea.Dy()-1) - } - -} - -func (bc *MBarChart) SetMax(max int) { - - if max > 0 { - bc.max = max - } -} - -// Buffer implements Bufferer interface. -func (bc *MBarChart) Buffer() Buffer { - buf := bc.Block.Buffer() - bc.layout() - var oftX int - - for i := 0; i < bc.numBar && i < bc.minDataLen && i < len(bc.DataLabels); i++ { - ph := 0 //Previous Height to stack up - oftX = i * (bc.BarWidth + bc.BarGap) - for i1 := 0; i1 < bc.numStack; i1++ { - h := int(float64(bc.Data[i1][i]) / bc.scale) - // plot bars - for j := 0; j < bc.BarWidth; j++ { - for k := 0; k < h; k++ { - c := Cell{ - Ch: ' ', - Bg: bc.BarColor[i1], - } - if bc.BarColor[i1] == ColorDefault { // when color is default, space char treated as transparent! - c.Bg |= AttrReverse - } - x := bc.innerArea.Min.X + i*(bc.BarWidth+bc.BarGap) + j - y := bc.innerArea.Min.Y + bc.innerArea.Dy() - 2 - k - ph - buf.Set(x, y, c) - - } - } - ph += h - } - // plot text - for j, k := 0, 0; j < len(bc.labels[i]); j++ { - w := charWidth(bc.labels[i][j]) - c := Cell{ - Ch: bc.labels[i][j], - Bg: bc.Bg, - Fg: bc.TextColor, - } - y := bc.innerArea.Min.Y + bc.innerArea.Dy() - 1 - x := bc.innerArea.Max.X + oftX + ((bc.BarWidth - len(bc.labels[i])) / 2) + k - buf.Set(x, y, c) - k += w - } - // plot num - ph = 0 //re-initialize previous height - for i1 := 0; i1 < bc.numStack; i1++ { - h := int(float64(bc.Data[i1][i]) / bc.scale) - for j := 0; j < len(bc.dataNum[i1][i]) && h > 0; j++ { - c := Cell{ - Ch: bc.dataNum[i1][i][j], - Fg: bc.NumColor[i1], - Bg: bc.BarColor[i1], - } - if bc.BarColor[i1] == ColorDefault { // the same as above - c.Bg |= AttrReverse - } - if h == 0 { - c.Bg = bc.Bg - } - x := bc.innerArea.Min.X + oftX + (bc.BarWidth-len(bc.dataNum[i1][i]))/2 + j - y := bc.innerArea.Min.Y + bc.innerArea.Dy() - 2 - ph - buf.Set(x, y, c) - } - ph += h - } - } - - if bc.ShowScale { - //Currently bar graph only supprts data range from 0 to MAX - //Plot 0 - c := Cell{ - Ch: '0', - Bg: bc.Bg, - Fg: bc.TextColor, - } - - y := bc.innerArea.Min.Y + bc.innerArea.Dy() - 2 - x := bc.X - buf.Set(x, y, c) - - //Plot the maximum sacle value - for i := 0; i < len(bc.maxScale); i++ { - c := Cell{ - Ch: bc.maxScale[i], - Bg: bc.Bg, - Fg: bc.TextColor, - } - - y := bc.innerArea.Min.Y - x := bc.X + i - - buf.Set(x, y, c) - } - - } - - return buf -} diff --git a/vendor/github.com/gizak/termui/mkdocs.yml b/vendor/github.com/gizak/termui/mkdocs.yml deleted file mode 100644 index 2ab45f064b15..000000000000 --- a/vendor/github.com/gizak/termui/mkdocs.yml +++ /dev/null @@ -1,28 +0,0 @@ -pages: -- Home: 'index.md' -- Quickstart: 'quickstart.md' -- Recipes: 'recipes.md' -- References: - - Layouts: 'layouts.md' - - Components: 'components.md' - - Events: 'events.md' - - Themes: 'themes.md' -- Versions: 'versions.md' -- About: 'about.md' - -site_name: termui -repo_url: https://github.com/gizak/termui/ -site_description: 'termui user guide' -site_author: gizak - -docs_dir: '_docs' - -theme: readthedocs - -markdown_extensions: - - smarty - - admonition - - toc - -extra: - version: 1.0 diff --git a/vendor/github.com/gizak/termui/par.go b/vendor/github.com/gizak/termui/par.go deleted file mode 100644 index 29b6d462f91b..000000000000 --- a/vendor/github.com/gizak/termui/par.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -// Par displays a paragraph. -/* - par := termui.NewPar("Simple Text") - par.Height = 3 - par.Width = 17 - par.BorderLabel = "Label" -*/ -type Par struct { - Block - Text string - TextFgColor Attribute - TextBgColor Attribute - WrapLength int // words wrap limit. Note it may not work properly with multi-width char -} - -// NewPar returns a new *Par with given text as its content. -func NewPar(s string) *Par { - return &Par{ - Block: *NewBlock(), - Text: s, - TextFgColor: ThemeAttr("par.text.fg"), - TextBgColor: ThemeAttr("par.text.bg"), - WrapLength: 0, - } -} - -// Buffer implements Bufferer interface. -func (p *Par) Buffer() Buffer { - buf := p.Block.Buffer() - - fg, bg := p.TextFgColor, p.TextBgColor - cs := DefaultTxBuilder.Build(p.Text, fg, bg) - - // wrap if WrapLength set - if p.WrapLength < 0 { - cs = wrapTx(cs, p.Width-2) - } else if p.WrapLength > 0 { - cs = wrapTx(cs, p.WrapLength) - } - - y, x, n := 0, 0, 0 - for y < p.innerArea.Dy() && n < len(cs) { - w := cs[n].Width() - if cs[n].Ch == '\n' || x+w > p.innerArea.Dx() { - y++ - x = 0 // set x = 0 - if cs[n].Ch == '\n' { - n++ - } - - if y >= p.innerArea.Dy() { - buf.Set(p.innerArea.Min.X+p.innerArea.Dx()-1, - p.innerArea.Min.Y+p.innerArea.Dy()-1, - Cell{Ch: '…', Fg: p.TextFgColor, Bg: p.TextBgColor}) - break - } - continue - } - - buf.Set(p.innerArea.Min.X+x, p.innerArea.Min.Y+y, cs[n]) - - n++ - x += w - } - - return buf -} diff --git a/vendor/github.com/gizak/termui/pos.go b/vendor/github.com/gizak/termui/pos.go deleted file mode 100644 index c7d647f31b78..000000000000 --- a/vendor/github.com/gizak/termui/pos.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import "image" - -// Align is the position of the gauge's label. -type Align uint - -// All supported positions. -const ( - AlignNone Align = 0 - AlignLeft Align = 1 << iota - AlignRight - AlignBottom - AlignTop - AlignCenterVertical - AlignCenterHorizontal - AlignCenter = AlignCenterVertical | AlignCenterHorizontal -) - -func AlignArea(parent, child image.Rectangle, a Align) image.Rectangle { - w, h := child.Dx(), child.Dy() - - // parent center - pcx, pcy := parent.Min.X+parent.Dx()/2, parent.Min.Y+parent.Dy()/2 - // child center - ccx, ccy := child.Min.X+child.Dx()/2, child.Min.Y+child.Dy()/2 - - if a&AlignLeft == AlignLeft { - child.Min.X = parent.Min.X - child.Max.X = child.Min.X + w - } - - if a&AlignRight == AlignRight { - child.Max.X = parent.Max.X - child.Min.X = child.Max.X - w - } - - if a&AlignBottom == AlignBottom { - child.Max.Y = parent.Max.Y - child.Min.Y = child.Max.Y - h - } - - if a&AlignTop == AlignRight { - child.Min.Y = parent.Min.Y - child.Max.Y = child.Min.Y + h - } - - if a&AlignCenterHorizontal == AlignCenterHorizontal { - child.Min.X += pcx - ccx - child.Max.X = child.Min.X + w - } - - if a&AlignCenterVertical == AlignCenterVertical { - child.Min.Y += pcy - ccy - child.Max.Y = child.Min.Y + h - } - - return child -} - -func MoveArea(a image.Rectangle, dx, dy int) image.Rectangle { - a.Min.X += dx - a.Max.X += dx - a.Min.Y += dy - a.Max.Y += dy - return a -} - -var termWidth int -var termHeight int - -func TermRect() image.Rectangle { - return image.Rect(0, 0, termWidth, termHeight) -} diff --git a/vendor/github.com/gizak/termui/render.go b/vendor/github.com/gizak/termui/render.go deleted file mode 100644 index b9d37d93867f..000000000000 --- a/vendor/github.com/gizak/termui/render.go +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "image" - "io" - "sync" - "time" - - "fmt" - - "os" - - "runtime/debug" - - "bytes" - - "github.com/maruel/panicparse/stack" - tm "github.com/nsf/termbox-go" -) - -// Bufferer should be implemented by all renderable components. -type Bufferer interface { - Buffer() Buffer -} - -// Init initializes termui library. This function should be called before any others. -// After initialization, the library must be finalized by 'Close' function. -func Init() error { - if err := tm.Init(); err != nil { - return err - } - - sysEvtChs = make([]chan Event, 0) - go hookTermboxEvt() - - renderJobs = make(chan []Bufferer) - //renderLock = new(sync.RWMutex) - - Body = NewGrid() - Body.X = 0 - Body.Y = 0 - Body.BgColor = ThemeAttr("bg") - Body.Width = TermWidth() - - DefaultEvtStream.Init() - DefaultEvtStream.Merge("termbox", NewSysEvtCh()) - DefaultEvtStream.Merge("timer", NewTimerCh(time.Second)) - DefaultEvtStream.Merge("custom", usrEvtCh) - - DefaultEvtStream.Handle("/", DefaultHandler) - DefaultEvtStream.Handle("/sys/wnd/resize", func(e Event) { - w := e.Data.(EvtWnd) - Body.Width = w.Width - }) - - DefaultWgtMgr = NewWgtMgr() - DefaultEvtStream.Hook(DefaultWgtMgr.WgtHandlersHook()) - - go func() { - for bs := range renderJobs { - render(bs...) - } - }() - - return nil -} - -// Close finalizes termui library, -// should be called after successful initialization when termui's functionality isn't required anymore. -func Close() { - tm.Close() -} - -var renderLock sync.Mutex - -func termSync() { - renderLock.Lock() - tm.Sync() - termWidth, termHeight = tm.Size() - renderLock.Unlock() -} - -// TermWidth returns the current terminal's width. -func TermWidth() int { - termSync() - return termWidth -} - -// TermHeight returns the current terminal's height. -func TermHeight() int { - termSync() - return termHeight -} - -// Render renders all Bufferer in the given order from left to right, -// right could overlap on left ones. -func render(bs ...Bufferer) { - defer func() { - if e := recover(); e != nil { - Close() - fmt.Fprintf(os.Stderr, "Captured a panic(value=%v) when rendering Bufferer. Exit termui and clean terminal...\nPrint stack trace:\n\n", e) - //debug.PrintStack() - gs, err := stack.ParseDump(bytes.NewReader(debug.Stack()), os.Stderr) - if err != nil { - debug.PrintStack() - os.Exit(1) - } - p := &stack.Palette{} - buckets := stack.SortBuckets(stack.Bucketize(gs, stack.AnyValue)) - srcLen, pkgLen := stack.CalcLengths(buckets, false) - for _, bucket := range buckets { - io.WriteString(os.Stdout, p.BucketHeader(&bucket, false, len(buckets) > 1)) - io.WriteString(os.Stdout, p.StackLines(&bucket.Signature, srcLen, pkgLen, false)) - } - os.Exit(1) - } - }() - for _, b := range bs { - - buf := b.Buffer() - // set cels in buf - for p, c := range buf.CellMap { - if p.In(buf.Area) { - - tm.SetCell(p.X, p.Y, c.Ch, toTmAttr(c.Fg), toTmAttr(c.Bg)) - - } - } - - } - - renderLock.Lock() - // render - tm.Flush() - renderLock.Unlock() -} - -func Clear() { - tm.Clear(tm.ColorDefault, toTmAttr(ThemeAttr("bg"))) -} - -func clearArea(r image.Rectangle, bg Attribute) { - for i := r.Min.X; i < r.Max.X; i++ { - for j := r.Min.Y; j < r.Max.Y; j++ { - tm.SetCell(i, j, ' ', tm.ColorDefault, toTmAttr(bg)) - } - } -} - -func ClearArea(r image.Rectangle, bg Attribute) { - clearArea(r, bg) - tm.Flush() -} - -var renderJobs chan []Bufferer - -func Render(bs ...Bufferer) { - //go func() { renderJobs <- bs }() - renderJobs <- bs -} diff --git a/vendor/github.com/gizak/termui/sparkline.go b/vendor/github.com/gizak/termui/sparkline.go deleted file mode 100644 index d906e49dfca2..000000000000 --- a/vendor/github.com/gizak/termui/sparkline.go +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -// Sparkline is like: ▅▆▂▂▅▇▂▂▃▆▆▆▅▃. The data points should be non-negative integers. -/* - data := []int{4, 2, 1, 6, 3, 9, 1, 4, 2, 15, 14, 9, 8, 6, 10, 13, 15, 12, 10, 5, 3, 6, 1} - spl := termui.NewSparkline() - spl.Data = data - spl.Title = "Sparkline 0" - spl.LineColor = termui.ColorGreen -*/ -type Sparkline struct { - Data []int - Height int - Title string - TitleColor Attribute - LineColor Attribute - displayHeight int - scale float32 - max int -} - -// Sparklines is a renderable widget which groups together the given sparklines. -/* - spls := termui.NewSparklines(spl0,spl1,spl2) //... - spls.Height = 2 - spls.Width = 20 -*/ -type Sparklines struct { - Block - Lines []Sparkline - displayLines int - displayWidth int -} - -var sparks = []rune{'▁', '▂', '▃', '▄', '▅', '▆', '▇', '█'} - -// Add appends a given Sparkline to s *Sparklines. -func (s *Sparklines) Add(sl Sparkline) { - s.Lines = append(s.Lines, sl) -} - -// NewSparkline returns a unrenderable single sparkline that intended to be added into Sparklines. -func NewSparkline() Sparkline { - return Sparkline{ - Height: 1, - TitleColor: ThemeAttr("sparkline.title.fg"), - LineColor: ThemeAttr("sparkline.line.fg")} -} - -// NewSparklines return a new *Spaklines with given Sparkline(s), you can always add a new Sparkline later. -func NewSparklines(ss ...Sparkline) *Sparklines { - s := &Sparklines{Block: *NewBlock(), Lines: ss} - return s -} - -func (sl *Sparklines) update() { - for i, v := range sl.Lines { - if v.Title == "" { - sl.Lines[i].displayHeight = v.Height - } else { - sl.Lines[i].displayHeight = v.Height + 1 - } - } - sl.displayWidth = sl.innerArea.Dx() - - // get how many lines gotta display - h := 0 - sl.displayLines = 0 - for _, v := range sl.Lines { - if h+v.displayHeight <= sl.innerArea.Dy() { - sl.displayLines++ - } else { - break - } - h += v.displayHeight - } - - for i := 0; i < sl.displayLines; i++ { - data := sl.Lines[i].Data - - max := 0 - for _, v := range data { - if max < v { - max = v - } - } - sl.Lines[i].max = max - if max != 0 { - sl.Lines[i].scale = float32(8*sl.Lines[i].Height) / float32(max) - } else { // when all negative - sl.Lines[i].scale = 0 - } - } -} - -// Buffer implements Bufferer interface. -func (sl *Sparklines) Buffer() Buffer { - buf := sl.Block.Buffer() - sl.update() - - oftY := 0 - for i := 0; i < sl.displayLines; i++ { - l := sl.Lines[i] - data := l.Data - - if len(data) > sl.innerArea.Dx() { - data = data[len(data)-sl.innerArea.Dx():] - } - - if l.Title != "" { - rs := trimStr2Runes(l.Title, sl.innerArea.Dx()) - oftX := 0 - for _, v := range rs { - w := charWidth(v) - c := Cell{ - Ch: v, - Fg: l.TitleColor, - Bg: sl.Bg, - } - x := sl.innerArea.Min.X + oftX - y := sl.innerArea.Min.Y + oftY - buf.Set(x, y, c) - oftX += w - } - } - - for j, v := range data { - // display height of the data point, zero when data is negative - h := int(float32(v)*l.scale + 0.5) - if v < 0 { - h = 0 - } - - barCnt := h / 8 - barMod := h % 8 - for jj := 0; jj < barCnt; jj++ { - c := Cell{ - Ch: ' ', // => sparks[7] - Bg: l.LineColor, - } - x := sl.innerArea.Min.X + j - y := sl.innerArea.Min.Y + oftY + l.Height - jj - - //p.Bg = sl.BgColor - buf.Set(x, y, c) - } - if barMod != 0 { - c := Cell{ - Ch: sparks[barMod-1], - Fg: l.LineColor, - Bg: sl.Bg, - } - x := sl.innerArea.Min.X + j - y := sl.innerArea.Min.Y + oftY + l.Height - barCnt - buf.Set(x, y, c) - } - } - - oftY += l.displayHeight - } - - return buf -} diff --git a/vendor/github.com/gizak/termui/table.go b/vendor/github.com/gizak/termui/table.go deleted file mode 100644 index e3d1bbf309a2..000000000000 --- a/vendor/github.com/gizak/termui/table.go +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import "strings" - -/* Table is like: - -┌Awesome Table ────────────────────────────────────────────────┐ -│ Col0 | Col1 | Col2 | Col3 | Col4 | Col5 | Col6 | -│──────────────────────────────────────────────────────────────│ -│ Some Item #1 | AAA | 123 | CCCCC | EEEEE | GGGGG | IIIII | -│──────────────────────────────────────────────────────────────│ -│ Some Item #2 | BBB | 456 | DDDDD | FFFFF | HHHHH | JJJJJ | -└──────────────────────────────────────────────────────────────┘ - -Datapoints are a two dimensional array of strings: [][]string - -Example: - data := [][]string{ - {"Col0", "Col1", "Col3", "Col4", "Col5", "Col6"}, - {"Some Item #1", "AAA", "123", "CCCCC", "EEEEE", "GGGGG", "IIIII"}, - {"Some Item #2", "BBB", "456", "DDDDD", "FFFFF", "HHHHH", "JJJJJ"}, - } - - table := termui.NewTable() - table.Rows = data // type [][]string - table.FgColor = termui.ColorWhite - table.BgColor = termui.ColorDefault - table.Height = 7 - table.Width = 62 - table.Y = 0 - table.X = 0 - table.Border = true -*/ - -// Table tracks all the attributes of a Table instance -type Table struct { - Block - Rows [][]string - CellWidth []int - FgColor Attribute - BgColor Attribute - FgColors []Attribute - BgColors []Attribute - Separator bool - TextAlign Align -} - -// NewTable returns a new Table instance -func NewTable() *Table { - table := &Table{Block: *NewBlock()} - table.FgColor = ColorWhite - table.BgColor = ColorDefault - table.Separator = true - return table -} - -// CellsWidth calculates the width of a cell array and returns an int -func cellsWidth(cells []Cell) int { - width := 0 - for _, c := range cells { - width += c.Width() - } - return width -} - -// Analysis generates and returns an array of []Cell that represent all columns in the Table -func (table *Table) Analysis() [][]Cell { - var rowCells [][]Cell - length := len(table.Rows) - if length < 1 { - return rowCells - } - - if len(table.FgColors) == 0 { - table.FgColors = make([]Attribute, len(table.Rows)) - } - if len(table.BgColors) == 0 { - table.BgColors = make([]Attribute, len(table.Rows)) - } - - cellWidths := make([]int, len(table.Rows[0])) - - for y, row := range table.Rows { - if table.FgColors[y] == 0 { - table.FgColors[y] = table.FgColor - } - if table.BgColors[y] == 0 { - table.BgColors[y] = table.BgColor - } - for x, str := range row { - cells := DefaultTxBuilder.Build(str, table.FgColors[y], table.BgColors[y]) - cw := cellsWidth(cells) - if cellWidths[x] < cw { - cellWidths[x] = cw - } - rowCells = append(rowCells, cells) - } - } - table.CellWidth = cellWidths - return rowCells -} - -// SetSize calculates the table size and sets the internal value -func (table *Table) SetSize() { - length := len(table.Rows) - if table.Separator { - table.Height = length*2 + 1 - } else { - table.Height = length + 2 - } - table.Width = 2 - if length != 0 { - for _, cellWidth := range table.CellWidth { - table.Width += cellWidth + 3 - } - } -} - -// CalculatePosition ... -func (table *Table) CalculatePosition(x int, y int, coordinateX *int, coordinateY *int, cellStart *int) { - if table.Separator { - *coordinateY = table.innerArea.Min.Y + y*2 - } else { - *coordinateY = table.innerArea.Min.Y + y - } - if x == 0 { - *cellStart = table.innerArea.Min.X - } else { - *cellStart += table.CellWidth[x-1] + 3 - } - - switch table.TextAlign { - case AlignRight: - *coordinateX = *cellStart + (table.CellWidth[x] - len(table.Rows[y][x])) + 2 - case AlignCenter: - *coordinateX = *cellStart + (table.CellWidth[x]-len(table.Rows[y][x]))/2 + 2 - default: - *coordinateX = *cellStart + 2 - } -} - -// Buffer ... -func (table *Table) Buffer() Buffer { - buffer := table.Block.Buffer() - rowCells := table.Analysis() - pointerX := table.innerArea.Min.X + 2 - pointerY := table.innerArea.Min.Y - borderPointerX := table.innerArea.Min.X - for y, row := range table.Rows { - for x := range row { - table.CalculatePosition(x, y, &pointerX, &pointerY, &borderPointerX) - background := DefaultTxBuilder.Build(strings.Repeat(" ", table.CellWidth[x]+3), table.BgColors[y], table.BgColors[y]) - cells := rowCells[y*len(row)+x] - for i, back := range background { - buffer.Set(borderPointerX+i, pointerY, back) - } - - coordinateX := pointerX - for _, printer := range cells { - buffer.Set(coordinateX, pointerY, printer) - coordinateX += printer.Width() - } - - if x != 0 { - dividors := DefaultTxBuilder.Build("|", table.FgColors[y], table.BgColors[y]) - for _, dividor := range dividors { - buffer.Set(borderPointerX, pointerY, dividor) - } - } - } - - if table.Separator { - border := DefaultTxBuilder.Build(strings.Repeat("─", table.Width-2), table.FgColor, table.BgColor) - for i, cell := range border { - buffer.Set(i+1, pointerY+1, cell) - } - } - } - - return buffer -} diff --git a/vendor/github.com/gizak/termui/textbuilder.go b/vendor/github.com/gizak/termui/textbuilder.go deleted file mode 100644 index 12e2055b5095..000000000000 --- a/vendor/github.com/gizak/termui/textbuilder.go +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "regexp" - "strings" - - "github.com/mitchellh/go-wordwrap" -) - -// TextBuilder is a minimal interface to produce text []Cell using specific syntax (markdown). -type TextBuilder interface { - Build(s string, fg, bg Attribute) []Cell -} - -// DefaultTxBuilder is set to be MarkdownTxBuilder. -var DefaultTxBuilder = NewMarkdownTxBuilder() - -// MarkdownTxBuilder implements TextBuilder interface, using markdown syntax. -type MarkdownTxBuilder struct { - baseFg Attribute - baseBg Attribute - plainTx []rune - markers []marker -} - -type marker struct { - st int - ed int - fg Attribute - bg Attribute -} - -var colorMap = map[string]Attribute{ - "red": ColorRed, - "blue": ColorBlue, - "black": ColorBlack, - "cyan": ColorCyan, - "yellow": ColorYellow, - "white": ColorWhite, - "default": ColorDefault, - "green": ColorGreen, - "magenta": ColorMagenta, -} - -var attrMap = map[string]Attribute{ - "bold": AttrBold, - "underline": AttrUnderline, - "reverse": AttrReverse, -} - -func rmSpc(s string) string { - reg := regexp.MustCompile(`\s+`) - return reg.ReplaceAllString(s, "") -} - -// readAttr translates strings like `fg-red,fg-bold,bg-white` to fg and bg Attribute -func (mtb MarkdownTxBuilder) readAttr(s string) (Attribute, Attribute) { - fg := mtb.baseFg - bg := mtb.baseBg - - updateAttr := func(a Attribute, attrs []string) Attribute { - for _, s := range attrs { - // replace the color - if c, ok := colorMap[s]; ok { - a &= 0xFF00 // erase clr 0 ~ 8 bits - a |= c // set clr - } - // add attrs - if c, ok := attrMap[s]; ok { - a |= c - } - } - return a - } - - ss := strings.Split(s, ",") - fgs := []string{} - bgs := []string{} - for _, v := range ss { - subs := strings.Split(v, "-") - if len(subs) > 1 { - if subs[0] == "fg" { - fgs = append(fgs, subs[1]) - } - if subs[0] == "bg" { - bgs = append(bgs, subs[1]) - } - } - } - - fg = updateAttr(fg, fgs) - bg = updateAttr(bg, bgs) - return fg, bg -} - -func (mtb *MarkdownTxBuilder) reset() { - mtb.plainTx = []rune{} - mtb.markers = []marker{} -} - -// parse streams and parses text into normalized text and render sequence. -func (mtb *MarkdownTxBuilder) parse(str string) { - rs := str2runes(str) - normTx := []rune{} - square := []rune{} - brackt := []rune{} - accSquare := false - accBrackt := false - cntSquare := 0 - - reset := func() { - square = []rune{} - brackt = []rune{} - accSquare = false - accBrackt = false - cntSquare = 0 - } - // pipe stacks into normTx and clear - rollback := func() { - normTx = append(normTx, square...) - normTx = append(normTx, brackt...) - reset() - } - // chop first and last - chop := func(s []rune) []rune { - return s[1 : len(s)-1] - } - - for i, r := range rs { - switch { - // stacking brackt - case accBrackt: - brackt = append(brackt, r) - if ')' == r { - fg, bg := mtb.readAttr(string(chop(brackt))) - st := len(normTx) - ed := len(normTx) + len(square) - 2 - mtb.markers = append(mtb.markers, marker{st, ed, fg, bg}) - normTx = append(normTx, chop(square)...) - reset() - } else if i+1 == len(rs) { - rollback() - } - // stacking square - case accSquare: - switch { - // squares closed and followed by a '(' - case cntSquare == 0 && '(' == r: - accBrackt = true - brackt = append(brackt, '(') - // squares closed but not followed by a '(' - case cntSquare == 0: - rollback() - if '[' == r { - accSquare = true - cntSquare = 1 - brackt = append(brackt, '[') - } else { - normTx = append(normTx, r) - } - // hit the end - case i+1 == len(rs): - square = append(square, r) - rollback() - case '[' == r: - cntSquare++ - square = append(square, '[') - case ']' == r: - cntSquare-- - square = append(square, ']') - // normal char - default: - square = append(square, r) - } - // stacking normTx - default: - if '[' == r { - accSquare = true - cntSquare = 1 - square = append(square, '[') - } else { - normTx = append(normTx, r) - } - } - } - - mtb.plainTx = normTx -} - -func wrapTx(cs []Cell, wl int) []Cell { - tmpCell := make([]Cell, len(cs)) - copy(tmpCell, cs) - - // get the plaintext - plain := CellsToStr(cs) - - // wrap - plainWrapped := wordwrap.WrapString(plain, uint(wl)) - - // find differences and insert - finalCell := tmpCell // finalcell will get the inserts and is what is returned - - plainRune := []rune(plain) - plainWrappedRune := []rune(plainWrapped) - trigger := "go" - plainRuneNew := plainRune - - for trigger != "stop" { - plainRune = plainRuneNew - for i := range plainRune { - if plainRune[i] == plainWrappedRune[i] { - trigger = "stop" - } else if plainRune[i] != plainWrappedRune[i] && plainWrappedRune[i] == 10 { - trigger = "go" - cell := Cell{10, 0, 0} - j := i - 0 - - // insert a cell into the []Cell in correct position - tmpCell[i] = cell - - // insert the newline into plain so we avoid indexing errors - plainRuneNew = append(plainRune, 10) - copy(plainRuneNew[j+1:], plainRuneNew[j:]) - plainRuneNew[j] = plainWrappedRune[j] - - // restart the inner for loop until plain and plain wrapped are - // the same; yeah, it's inefficient, but the text amounts - // should be small - break - - } else if plainRune[i] != plainWrappedRune[i] && - plainWrappedRune[i-1] == 10 && // if the prior rune is a newline - plainRune[i] == 32 { // and this rune is a space - trigger = "go" - // need to delete plainRune[i] because it gets rid of an extra - // space - plainRuneNew = append(plainRune[:i], plainRune[i+1:]...) - break - - } else { - trigger = "stop" // stops the outer for loop - } - } - } - - finalCell = tmpCell - - return finalCell -} - -// Build implements TextBuilder interface. -func (mtb MarkdownTxBuilder) Build(s string, fg, bg Attribute) []Cell { - mtb.baseFg = fg - mtb.baseBg = bg - mtb.reset() - mtb.parse(s) - cs := make([]Cell, len(mtb.plainTx)) - for i := range cs { - cs[i] = Cell{Ch: mtb.plainTx[i], Fg: fg, Bg: bg} - } - for _, mrk := range mtb.markers { - for i := mrk.st; i < mrk.ed; i++ { - cs[i].Fg = mrk.fg - cs[i].Bg = mrk.bg - } - } - - return cs -} - -// NewMarkdownTxBuilder returns a TextBuilder employing markdown syntax. -func NewMarkdownTxBuilder() TextBuilder { - return MarkdownTxBuilder{} -} diff --git a/vendor/github.com/gizak/termui/theme.go b/vendor/github.com/gizak/termui/theme.go deleted file mode 100644 index 21fb3bfb751a..000000000000 --- a/vendor/github.com/gizak/termui/theme.go +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import "strings" - -/* -// A ColorScheme represents the current look-and-feel of the dashboard. -type ColorScheme struct { - BodyBg Attribute - BlockBg Attribute - HasBorder bool - BorderFg Attribute - BorderBg Attribute - BorderLabelTextFg Attribute - BorderLabelTextBg Attribute - ParTextFg Attribute - ParTextBg Attribute - SparklineLine Attribute - SparklineTitle Attribute - GaugeBar Attribute - GaugePercent Attribute - LineChartLine Attribute - LineChartAxes Attribute - ListItemFg Attribute - ListItemBg Attribute - BarChartBar Attribute - BarChartText Attribute - BarChartNum Attribute - MBarChartBar Attribute - MBarChartText Attribute - MBarChartNum Attribute - TabActiveBg Attribute -} - -// default color scheme depends on the user's terminal setting. -var themeDefault = ColorScheme{HasBorder: true} - -var themeHelloWorld = ColorScheme{ - BodyBg: ColorBlack, - BlockBg: ColorBlack, - HasBorder: true, - BorderFg: ColorWhite, - BorderBg: ColorBlack, - BorderLabelTextBg: ColorBlack, - BorderLabelTextFg: ColorGreen, - ParTextBg: ColorBlack, - ParTextFg: ColorWhite, - SparklineLine: ColorMagenta, - SparklineTitle: ColorWhite, - GaugeBar: ColorRed, - GaugePercent: ColorWhite, - LineChartLine: ColorYellow | AttrBold, - LineChartAxes: ColorWhite, - ListItemBg: ColorBlack, - ListItemFg: ColorYellow, - BarChartBar: ColorRed, - BarChartNum: ColorWhite, - BarChartText: ColorCyan, - MBarChartBar: ColorRed, - MBarChartNum: ColorWhite, - MBarChartText: ColorCyan, - TabActiveBg: ColorMagenta, -} - -var theme = themeDefault // global dep - -// Theme returns the currently used theme. -func Theme() ColorScheme { - return theme -} - -// SetTheme sets a new, custom theme. -func SetTheme(newTheme ColorScheme) { - theme = newTheme -} - -// UseTheme sets a predefined scheme. Currently available: "hello-world" and -// "black-and-white". -func UseTheme(th string) { - switch th { - case "helloworld": - theme = themeHelloWorld - default: - theme = themeDefault - } -} -*/ - -var ColorMap = map[string]Attribute{ - "fg": ColorWhite, - "bg": ColorDefault, - "border.fg": ColorWhite, - "label.fg": ColorGreen, - "par.fg": ColorYellow, - "par.label.bg": ColorWhite, -} - -func ThemeAttr(name string) Attribute { - return lookUpAttr(ColorMap, name) -} - -func lookUpAttr(clrmap map[string]Attribute, name string) Attribute { - - a, ok := clrmap[name] - if ok { - return a - } - - ns := strings.Split(name, ".") - for i := range ns { - nn := strings.Join(ns[i:len(ns)], ".") - a, ok = ColorMap[nn] - if ok { - break - } - } - - return a -} - -// 0<=r,g,b <= 5 -func ColorRGB(r, g, b int) Attribute { - within := func(n int) int { - if n < 0 { - return 0 - } - - if n > 5 { - return 5 - } - - return n - } - - r, b, g = within(r), within(b), within(g) - return Attribute(0x0f + 36*r + 6*g + b) -} diff --git a/vendor/github.com/gizak/termui/widget.go b/vendor/github.com/gizak/termui/widget.go deleted file mode 100644 index 80276bf1f181..000000000000 --- a/vendor/github.com/gizak/termui/widget.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2017 Zack Guo . All rights reserved. -// Use of this source code is governed by a MIT license that can -// be found in the LICENSE file. - -package termui - -import ( - "fmt" - "sync" -) - -// event mixins -type WgtMgr map[string]WgtInfo - -type WgtInfo struct { - Handlers map[string]func(Event) - WgtRef Widget - Id string -} - -type Widget interface { - Id() string -} - -func NewWgtInfo(wgt Widget) WgtInfo { - return WgtInfo{ - Handlers: make(map[string]func(Event)), - WgtRef: wgt, - Id: wgt.Id(), - } -} - -func NewWgtMgr() WgtMgr { - wm := WgtMgr(make(map[string]WgtInfo)) - return wm - -} - -func (wm WgtMgr) AddWgt(wgt Widget) { - wm[wgt.Id()] = NewWgtInfo(wgt) -} - -func (wm WgtMgr) RmWgt(wgt Widget) { - wm.RmWgtById(wgt.Id()) -} - -func (wm WgtMgr) RmWgtById(id string) { - delete(wm, id) -} - -func (wm WgtMgr) AddWgtHandler(id, path string, h func(Event)) { - if w, ok := wm[id]; ok { - w.Handlers[path] = h - } -} - -func (wm WgtMgr) RmWgtHandler(id, path string) { - if w, ok := wm[id]; ok { - delete(w.Handlers, path) - } -} - -var counter struct { - sync.RWMutex - count int -} - -func GenId() string { - counter.Lock() - defer counter.Unlock() - - counter.count += 1 - return fmt.Sprintf("%d", counter.count) -} - -func (wm WgtMgr) WgtHandlersHook() func(Event) { - return func(e Event) { - for _, v := range wm { - if k := findMatch(v.Handlers, e.Path); k != "" { - v.Handlers[k](e) - } - } - } -} - -var DefaultWgtMgr WgtMgr - -func (b *Block) Handle(path string, handler func(Event)) { - if _, ok := DefaultWgtMgr[b.Id()]; !ok { - DefaultWgtMgr.AddWgt(b) - } - - DefaultWgtMgr.AddWgtHandler(b.Id(), path, handler) -} diff --git a/vendor/github.com/go-ole/go-ole/ChangeLog.md b/vendor/github.com/go-ole/go-ole/ChangeLog.md deleted file mode 100644 index 4ba6a8c64d00..000000000000 --- a/vendor/github.com/go-ole/go-ole/ChangeLog.md +++ /dev/null @@ -1,49 +0,0 @@ -# Version 1.x.x - -* **Add more test cases and reference new test COM server project.** (Placeholder for future additions) - -# Version 1.2.0-alphaX - -**Minimum supported version is now Go 1.4. Go 1.1 support is deprecated, but should still build.** - - * Added CI configuration for Travis-CI and AppVeyor. - * Added test InterfaceID and ClassID for the COM Test Server project. - * Added more inline documentation (#83). - * Added IEnumVARIANT implementation (#88). - * Added IEnumVARIANT test cases (#99, #100, #101). - * Added support for retrieving `time.Time` from VARIANT (#92). - * Added test case for IUnknown (#64). - * Added test case for IDispatch (#64). - * Added test cases for scalar variants (#64, #76). - -# Version 1.1.1 - - * Fixes for Linux build. - * Fixes for Windows build. - -# Version 1.1.0 - -The change to provide building on all platforms is a new feature. The increase in minor version reflects that and allows those who wish to stay on 1.0.x to continue to do so. Support for 1.0.x will be limited to bug fixes. - - * Move GUID out of variables.go into its own file to make new documentation available. - * Move OleError out of ole.go into its own file to make new documentation available. - * Add documentation to utility functions. - * Add documentation to variant receiver functions. - * Add documentation to ole structures. - * Make variant available to other systems outside of Windows. - * Make OLE structures available to other systems outside of Windows. - -## New Features - - * Library should now be built on all platforms supported by Go. Library will NOOP on any platform that is not Windows. - * More functions are now documented and available on godoc.org. - -# Version 1.0.1 - - 1. Fix package references from repository location change. - -# Version 1.0.0 - -This version is stable enough for use. The COM API is still incomplete, but provides enough functionality for accessing COM servers using IDispatch interface. - -There is no changelog for this version. Check commits for history. diff --git a/vendor/github.com/go-ole/go-ole/LICENSE b/vendor/github.com/go-ole/go-ole/LICENSE deleted file mode 100644 index 623ec06f91ca..000000000000 --- a/vendor/github.com/go-ole/go-ole/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright © 2013-2017 Yasuhiro Matsumoto, - -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/go-ole/go-ole/README.md b/vendor/github.com/go-ole/go-ole/README.md deleted file mode 100644 index 0ea9db33c798..000000000000 --- a/vendor/github.com/go-ole/go-ole/README.md +++ /dev/null @@ -1,46 +0,0 @@ -#Go OLE - -[![Build status](https://ci.appveyor.com/api/projects/status/qr0u2sf7q43us9fj?svg=true)](https://ci.appveyor.com/project/jacobsantos/go-ole-jgs28) -[![Build Status](https://travis-ci.org/go-ole/go-ole.svg?branch=master)](https://travis-ci.org/go-ole/go-ole) -[![GoDoc](https://godoc.org/github.com/go-ole/go-ole?status.svg)](https://godoc.org/github.com/go-ole/go-ole) - -Go bindings for Windows COM using shared libraries instead of cgo. - -By Yasuhiro Matsumoto. - -## Install - -To experiment with go-ole, you can just compile and run the example program: - -``` -go get github.com/go-ole/go-ole -cd /path/to/go-ole/ -go test - -cd /path/to/go-ole/example/excel -go run excel.go -``` - -## Continuous Integration - -Continuous integration configuration has been added for both Travis-CI and AppVeyor. You will have to add these to your own account for your fork in order for it to run. - -**Travis-CI** - -Travis-CI was added to check builds on Linux to ensure that `go get` works when cross building. Currently, Travis-CI is not used to test cross-building, but this may be changed in the future. It is also not currently possible to test the library on Linux, since COM API is specific to Windows and it is not currently possible to run a COM server on Linux or even connect to a remote COM server. - -**AppVeyor** - -AppVeyor is used to build on Windows using the (in-development) test COM server. It is currently only used to test the build and ensure that the code works on Windows. It will be used to register a COM server and then run the test cases based on the test COM server. - -The tests currently do run and do pass and this should be maintained with commits. - -##Versioning - -Go OLE uses [semantic versioning](http://semver.org) for version numbers, which is similar to the version contract of the Go language. Which means that the major version will always maintain backwards compatibility with minor versions. Minor versions will only add new additions and changes. Fixes will always be in patch. - -This contract should allow you to upgrade to new minor and patch versions without breakage or modifications to your existing code. Leave a ticket, if there is breakage, so that it could be fixed. - -##LICENSE - -Under the MIT License: http://mattn.mit-license.org/2013 diff --git a/vendor/github.com/go-ole/go-ole/appveyor.yml b/vendor/github.com/go-ole/go-ole/appveyor.yml deleted file mode 100644 index 0d557ac2ff55..000000000000 --- a/vendor/github.com/go-ole/go-ole/appveyor.yml +++ /dev/null @@ -1,54 +0,0 @@ -# Notes: -# - Minimal appveyor.yml file is an empty file. All sections are optional. -# - Indent each level of configuration with 2 spaces. Do not use tabs! -# - All section names are case-sensitive. -# - Section names should be unique on each level. - -version: "1.3.0.{build}-alpha-{branch}" - -os: Windows Server 2012 R2 - -branches: - only: - - master - - v1.2 - - v1.1 - - v1.0 - -skip_tags: true - -clone_folder: c:\gopath\src\github.com\go-ole\go-ole - -environment: - GOPATH: c:\gopath - matrix: - - GOARCH: amd64 - GOVERSION: 1.5 - GOROOT: c:\go - DOWNLOADPLATFORM: "x64" - -install: - - choco install mingw - - SET PATH=c:\tools\mingw64\bin;%PATH% - # - Download COM Server - - ps: Start-FileDownload "https://github.com/go-ole/test-com-server/releases/download/v1.0.2/test-com-server-${env:DOWNLOADPLATFORM}.zip" - - 7z e test-com-server-%DOWNLOADPLATFORM%.zip -oc:\gopath\src\github.com\go-ole\go-ole > NUL - - c:\gopath\src\github.com\go-ole\go-ole\build\register-assembly.bat - # - set - - go version - - go env - - go get -u golang.org/x/tools/cmd/cover - - go get -u golang.org/x/tools/cmd/godoc - - go get -u golang.org/x/tools/cmd/stringer - -build_script: - - cd c:\gopath\src\github.com\go-ole\go-ole - - go get -v -t ./... - - go build - - go test -v -cover ./... - -# disable automatic tests -test: off - -# disable deployment -deploy: off diff --git a/vendor/github.com/go-ole/go-ole/com.go b/vendor/github.com/go-ole/go-ole/com.go deleted file mode 100644 index 75ebbf13f6c7..000000000000 --- a/vendor/github.com/go-ole/go-ole/com.go +++ /dev/null @@ -1,329 +0,0 @@ -// +build windows - -package ole - -import ( - "errors" - "syscall" - "time" - "unicode/utf16" - "unsafe" -) - -var ( - procCoInitialize, _ = modole32.FindProc("CoInitialize") - procCoInitializeEx, _ = modole32.FindProc("CoInitializeEx") - procCoUninitialize, _ = modole32.FindProc("CoUninitialize") - procCoCreateInstance, _ = modole32.FindProc("CoCreateInstance") - procCoTaskMemFree, _ = modole32.FindProc("CoTaskMemFree") - procCLSIDFromProgID, _ = modole32.FindProc("CLSIDFromProgID") - procCLSIDFromString, _ = modole32.FindProc("CLSIDFromString") - procStringFromCLSID, _ = modole32.FindProc("StringFromCLSID") - procStringFromIID, _ = modole32.FindProc("StringFromIID") - procIIDFromString, _ = modole32.FindProc("IIDFromString") - procGetUserDefaultLCID, _ = modkernel32.FindProc("GetUserDefaultLCID") - procCopyMemory, _ = modkernel32.FindProc("RtlMoveMemory") - procVariantInit, _ = modoleaut32.FindProc("VariantInit") - procVariantClear, _ = modoleaut32.FindProc("VariantClear") - procVariantTimeToSystemTime, _ = modoleaut32.FindProc("VariantTimeToSystemTime") - procSysAllocString, _ = modoleaut32.FindProc("SysAllocString") - procSysAllocStringLen, _ = modoleaut32.FindProc("SysAllocStringLen") - procSysFreeString, _ = modoleaut32.FindProc("SysFreeString") - procSysStringLen, _ = modoleaut32.FindProc("SysStringLen") - procCreateDispTypeInfo, _ = modoleaut32.FindProc("CreateDispTypeInfo") - procCreateStdDispatch, _ = modoleaut32.FindProc("CreateStdDispatch") - procGetActiveObject, _ = modoleaut32.FindProc("GetActiveObject") - - procGetMessageW, _ = moduser32.FindProc("GetMessageW") - procDispatchMessageW, _ = moduser32.FindProc("DispatchMessageW") -) - -// coInitialize initializes COM library on current thread. -// -// MSDN documentation suggests that this function should not be called. Call -// CoInitializeEx() instead. The reason has to do with threading and this -// function is only for single-threaded apartments. -// -// That said, most users of the library have gotten away with just this -// function. If you are experiencing threading issues, then use -// CoInitializeEx(). -func coInitialize() (err error) { - // http://msdn.microsoft.com/en-us/library/windows/desktop/ms678543(v=vs.85).aspx - // Suggests that no value should be passed to CoInitialized. - // Could just be Call() since the parameter is optional. <-- Needs testing to be sure. - hr, _, _ := procCoInitialize.Call(uintptr(0)) - if hr != 0 { - err = NewError(hr) - } - return -} - -// coInitializeEx initializes COM library with concurrency model. -func coInitializeEx(coinit uint32) (err error) { - // http://msdn.microsoft.com/en-us/library/windows/desktop/ms695279(v=vs.85).aspx - // Suggests that the first parameter is not only optional but should always be NULL. - hr, _, _ := procCoInitializeEx.Call(uintptr(0), uintptr(coinit)) - if hr != 0 { - err = NewError(hr) - } - return -} - -// CoInitialize initializes COM library on current thread. -// -// MSDN documentation suggests that this function should not be called. Call -// CoInitializeEx() instead. The reason has to do with threading and this -// function is only for single-threaded apartments. -// -// That said, most users of the library have gotten away with just this -// function. If you are experiencing threading issues, then use -// CoInitializeEx(). -func CoInitialize(p uintptr) (err error) { - // p is ignored and won't be used. - // Avoid any variable not used errors. - p = uintptr(0) - return coInitialize() -} - -// CoInitializeEx initializes COM library with concurrency model. -func CoInitializeEx(p uintptr, coinit uint32) (err error) { - // Avoid any variable not used errors. - p = uintptr(0) - return coInitializeEx(coinit) -} - -// CoUninitialize uninitializes COM Library. -func CoUninitialize() { - procCoUninitialize.Call() -} - -// CoTaskMemFree frees memory pointer. -func CoTaskMemFree(memptr uintptr) { - procCoTaskMemFree.Call(memptr) -} - -// CLSIDFromProgID retrieves Class Identifier with the given Program Identifier. -// -// The Programmatic Identifier must be registered, because it will be looked up -// in the Windows Registry. The registry entry has the following keys: CLSID, -// Insertable, Protocol and Shell -// (https://msdn.microsoft.com/en-us/library/dd542719(v=vs.85).aspx). -// -// programID identifies the class id with less precision and is not guaranteed -// to be unique. These are usually found in the registry under -// HKEY_LOCAL_MACHINE\SOFTWARE\Classes, usually with the format of -// "Program.Component.Version" with version being optional. -// -// CLSIDFromProgID in Windows API. -func CLSIDFromProgID(progId string) (clsid *GUID, err error) { - var guid GUID - lpszProgID := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(progId))) - hr, _, _ := procCLSIDFromProgID.Call(lpszProgID, uintptr(unsafe.Pointer(&guid))) - if hr != 0 { - err = NewError(hr) - } - clsid = &guid - return -} - -// CLSIDFromString retrieves Class ID from string representation. -// -// This is technically the string version of the GUID and will convert the -// string to object. -// -// CLSIDFromString in Windows API. -func CLSIDFromString(str string) (clsid *GUID, err error) { - var guid GUID - lpsz := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(str))) - hr, _, _ := procCLSIDFromString.Call(lpsz, uintptr(unsafe.Pointer(&guid))) - if hr != 0 { - err = NewError(hr) - } - clsid = &guid - return -} - -// StringFromCLSID returns GUID formated string from GUID object. -func StringFromCLSID(clsid *GUID) (str string, err error) { - var p *uint16 - hr, _, _ := procStringFromCLSID.Call(uintptr(unsafe.Pointer(clsid)), uintptr(unsafe.Pointer(&p))) - if hr != 0 { - err = NewError(hr) - } - str = LpOleStrToString(p) - return -} - -// IIDFromString returns GUID from program ID. -func IIDFromString(progId string) (clsid *GUID, err error) { - var guid GUID - lpsz := uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(progId))) - hr, _, _ := procIIDFromString.Call(lpsz, uintptr(unsafe.Pointer(&guid))) - if hr != 0 { - err = NewError(hr) - } - clsid = &guid - return -} - -// StringFromIID returns GUID formatted string from GUID object. -func StringFromIID(iid *GUID) (str string, err error) { - var p *uint16 - hr, _, _ := procStringFromIID.Call(uintptr(unsafe.Pointer(iid)), uintptr(unsafe.Pointer(&p))) - if hr != 0 { - err = NewError(hr) - } - str = LpOleStrToString(p) - return -} - -// CreateInstance of single uninitialized object with GUID. -func CreateInstance(clsid *GUID, iid *GUID) (unk *IUnknown, err error) { - if iid == nil { - iid = IID_IUnknown - } - hr, _, _ := procCoCreateInstance.Call( - uintptr(unsafe.Pointer(clsid)), - 0, - CLSCTX_SERVER, - uintptr(unsafe.Pointer(iid)), - uintptr(unsafe.Pointer(&unk))) - if hr != 0 { - err = NewError(hr) - } - return -} - -// GetActiveObject retrieves pointer to active object. -func GetActiveObject(clsid *GUID, iid *GUID) (unk *IUnknown, err error) { - if iid == nil { - iid = IID_IUnknown - } - hr, _, _ := procGetActiveObject.Call( - uintptr(unsafe.Pointer(clsid)), - uintptr(unsafe.Pointer(iid)), - uintptr(unsafe.Pointer(&unk))) - if hr != 0 { - err = NewError(hr) - } - return -} - -// VariantInit initializes variant. -func VariantInit(v *VARIANT) (err error) { - hr, _, _ := procVariantInit.Call(uintptr(unsafe.Pointer(v))) - if hr != 0 { - err = NewError(hr) - } - return -} - -// VariantClear clears value in Variant settings to VT_EMPTY. -func VariantClear(v *VARIANT) (err error) { - hr, _, _ := procVariantClear.Call(uintptr(unsafe.Pointer(v))) - if hr != 0 { - err = NewError(hr) - } - return -} - -// SysAllocString allocates memory for string and copies string into memory. -func SysAllocString(v string) (ss *int16) { - pss, _, _ := procSysAllocString.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(v)))) - ss = (*int16)(unsafe.Pointer(pss)) - return -} - -// SysAllocStringLen copies up to length of given string returning pointer. -func SysAllocStringLen(v string) (ss *int16) { - utf16 := utf16.Encode([]rune(v + "\x00")) - ptr := &utf16[0] - - pss, _, _ := procSysAllocStringLen.Call(uintptr(unsafe.Pointer(ptr)), uintptr(len(utf16)-1)) - ss = (*int16)(unsafe.Pointer(pss)) - return -} - -// SysFreeString frees string system memory. This must be called with SysAllocString. -func SysFreeString(v *int16) (err error) { - hr, _, _ := procSysFreeString.Call(uintptr(unsafe.Pointer(v))) - if hr != 0 { - err = NewError(hr) - } - return -} - -// SysStringLen is the length of the system allocated string. -func SysStringLen(v *int16) uint32 { - l, _, _ := procSysStringLen.Call(uintptr(unsafe.Pointer(v))) - return uint32(l) -} - -// CreateStdDispatch provides default IDispatch implementation for IUnknown. -// -// This handles default IDispatch implementation for objects. It haves a few -// limitations with only supporting one language. It will also only return -// default exception codes. -func CreateStdDispatch(unk *IUnknown, v uintptr, ptinfo *IUnknown) (disp *IDispatch, err error) { - hr, _, _ := procCreateStdDispatch.Call( - uintptr(unsafe.Pointer(unk)), - v, - uintptr(unsafe.Pointer(ptinfo)), - uintptr(unsafe.Pointer(&disp))) - if hr != 0 { - err = NewError(hr) - } - return -} - -// CreateDispTypeInfo provides default ITypeInfo implementation for IDispatch. -// -// This will not handle the full implementation of the interface. -func CreateDispTypeInfo(idata *INTERFACEDATA) (pptinfo *IUnknown, err error) { - hr, _, _ := procCreateDispTypeInfo.Call( - uintptr(unsafe.Pointer(idata)), - uintptr(GetUserDefaultLCID()), - uintptr(unsafe.Pointer(&pptinfo))) - if hr != 0 { - err = NewError(hr) - } - return -} - -// copyMemory moves location of a block of memory. -func copyMemory(dest unsafe.Pointer, src unsafe.Pointer, length uint32) { - procCopyMemory.Call(uintptr(dest), uintptr(src), uintptr(length)) -} - -// GetUserDefaultLCID retrieves current user default locale. -func GetUserDefaultLCID() (lcid uint32) { - ret, _, _ := procGetUserDefaultLCID.Call() - lcid = uint32(ret) - return -} - -// GetMessage in message queue from runtime. -// -// This function appears to block. PeekMessage does not block. -func GetMessage(msg *Msg, hwnd uint32, MsgFilterMin uint32, MsgFilterMax uint32) (ret int32, err error) { - r0, _, err := procGetMessageW.Call(uintptr(unsafe.Pointer(msg)), uintptr(hwnd), uintptr(MsgFilterMin), uintptr(MsgFilterMax)) - ret = int32(r0) - return -} - -// DispatchMessage to window procedure. -func DispatchMessage(msg *Msg) (ret int32) { - r0, _, _ := procDispatchMessageW.Call(uintptr(unsafe.Pointer(msg))) - ret = int32(r0) - return -} - -// GetVariantDate converts COM Variant Time value to Go time.Time. -func GetVariantDate(value float64) (time.Time, error) { - var st syscall.Systemtime - r, _, _ := procVariantTimeToSystemTime.Call(uintptr(value), uintptr(unsafe.Pointer(&st))) - if r != 0 { - return time.Date(int(st.Year), time.Month(st.Month), int(st.Day), int(st.Hour), int(st.Minute), int(st.Second), int(st.Milliseconds/1000), time.UTC), nil - } - return time.Now(), errors.New("Could not convert to time, passing current time.") -} diff --git a/vendor/github.com/go-ole/go-ole/com_func.go b/vendor/github.com/go-ole/go-ole/com_func.go deleted file mode 100644 index 425aad323360..000000000000 --- a/vendor/github.com/go-ole/go-ole/com_func.go +++ /dev/null @@ -1,174 +0,0 @@ -// +build !windows - -package ole - -import ( - "time" - "unsafe" -) - -// coInitialize initializes COM library on current thread. -// -// MSDN documentation suggests that this function should not be called. Call -// CoInitializeEx() instead. The reason has to do with threading and this -// function is only for single-threaded apartments. -// -// That said, most users of the library have gotten away with just this -// function. If you are experiencing threading issues, then use -// CoInitializeEx(). -func coInitialize() error { - return NewError(E_NOTIMPL) -} - -// coInitializeEx initializes COM library with concurrency model. -func coInitializeEx(coinit uint32) error { - return NewError(E_NOTIMPL) -} - -// CoInitialize initializes COM library on current thread. -// -// MSDN documentation suggests that this function should not be called. Call -// CoInitializeEx() instead. The reason has to do with threading and this -// function is only for single-threaded apartments. -// -// That said, most users of the library have gotten away with just this -// function. If you are experiencing threading issues, then use -// CoInitializeEx(). -func CoInitialize(p uintptr) error { - return NewError(E_NOTIMPL) -} - -// CoInitializeEx initializes COM library with concurrency model. -func CoInitializeEx(p uintptr, coinit uint32) error { - return NewError(E_NOTIMPL) -} - -// CoUninitialize uninitializes COM Library. -func CoUninitialize() {} - -// CoTaskMemFree frees memory pointer. -func CoTaskMemFree(memptr uintptr) {} - -// CLSIDFromProgID retrieves Class Identifier with the given Program Identifier. -// -// The Programmatic Identifier must be registered, because it will be looked up -// in the Windows Registry. The registry entry has the following keys: CLSID, -// Insertable, Protocol and Shell -// (https://msdn.microsoft.com/en-us/library/dd542719(v=vs.85).aspx). -// -// programID identifies the class id with less precision and is not guaranteed -// to be unique. These are usually found in the registry under -// HKEY_LOCAL_MACHINE\SOFTWARE\Classes, usually with the format of -// "Program.Component.Version" with version being optional. -// -// CLSIDFromProgID in Windows API. -func CLSIDFromProgID(progId string) (*GUID, error) { - return nil, NewError(E_NOTIMPL) -} - -// CLSIDFromString retrieves Class ID from string representation. -// -// This is technically the string version of the GUID and will convert the -// string to object. -// -// CLSIDFromString in Windows API. -func CLSIDFromString(str string) (*GUID, error) { - return nil, NewError(E_NOTIMPL) -} - -// StringFromCLSID returns GUID formated string from GUID object. -func StringFromCLSID(clsid *GUID) (string, error) { - return "", NewError(E_NOTIMPL) -} - -// IIDFromString returns GUID from program ID. -func IIDFromString(progId string) (*GUID, error) { - return nil, NewError(E_NOTIMPL) -} - -// StringFromIID returns GUID formatted string from GUID object. -func StringFromIID(iid *GUID) (string, error) { - return "", NewError(E_NOTIMPL) -} - -// CreateInstance of single uninitialized object with GUID. -func CreateInstance(clsid *GUID, iid *GUID) (*IUnknown, error) { - return nil, NewError(E_NOTIMPL) -} - -// GetActiveObject retrieves pointer to active object. -func GetActiveObject(clsid *GUID, iid *GUID) (*IUnknown, error) { - return nil, NewError(E_NOTIMPL) -} - -// VariantInit initializes variant. -func VariantInit(v *VARIANT) error { - return NewError(E_NOTIMPL) -} - -// VariantClear clears value in Variant settings to VT_EMPTY. -func VariantClear(v *VARIANT) error { - return NewError(E_NOTIMPL) -} - -// SysAllocString allocates memory for string and copies string into memory. -func SysAllocString(v string) *int16 { - u := int16(0) - return &u -} - -// SysAllocStringLen copies up to length of given string returning pointer. -func SysAllocStringLen(v string) *int16 { - u := int16(0) - return &u -} - -// SysFreeString frees string system memory. This must be called with SysAllocString. -func SysFreeString(v *int16) error { - return NewError(E_NOTIMPL) -} - -// SysStringLen is the length of the system allocated string. -func SysStringLen(v *int16) uint32 { - return uint32(0) -} - -// CreateStdDispatch provides default IDispatch implementation for IUnknown. -// -// This handles default IDispatch implementation for objects. It haves a few -// limitations with only supporting one language. It will also only return -// default exception codes. -func CreateStdDispatch(unk *IUnknown, v uintptr, ptinfo *IUnknown) (*IDispatch, error) { - return nil, NewError(E_NOTIMPL) -} - -// CreateDispTypeInfo provides default ITypeInfo implementation for IDispatch. -// -// This will not handle the full implementation of the interface. -func CreateDispTypeInfo(idata *INTERFACEDATA) (*IUnknown, error) { - return nil, NewError(E_NOTIMPL) -} - -// copyMemory moves location of a block of memory. -func copyMemory(dest unsafe.Pointer, src unsafe.Pointer, length uint32) {} - -// GetUserDefaultLCID retrieves current user default locale. -func GetUserDefaultLCID() uint32 { - return uint32(0) -} - -// GetMessage in message queue from runtime. -// -// This function appears to block. PeekMessage does not block. -func GetMessage(msg *Msg, hwnd uint32, MsgFilterMin uint32, MsgFilterMax uint32) (int32, error) { - return int32(0), NewError(E_NOTIMPL) -} - -// DispatchMessage to window procedure. -func DispatchMessage(msg *Msg) int32 { - return int32(0) -} - -func GetVariantDate(value float64) (time.Time, error) { - return time.Now(), NewError(E_NOTIMPL) -} diff --git a/vendor/github.com/go-ole/go-ole/connect.go b/vendor/github.com/go-ole/go-ole/connect.go deleted file mode 100644 index b2ac2ec67ac9..000000000000 --- a/vendor/github.com/go-ole/go-ole/connect.go +++ /dev/null @@ -1,192 +0,0 @@ -package ole - -// Connection contains IUnknown for fluent interface interaction. -// -// Deprecated. Use oleutil package instead. -type Connection struct { - Object *IUnknown // Access COM -} - -// Initialize COM. -func (*Connection) Initialize() (err error) { - return coInitialize() -} - -// Uninitialize COM. -func (*Connection) Uninitialize() { - CoUninitialize() -} - -// Create IUnknown object based first on ProgId and then from String. -func (c *Connection) Create(progId string) (err error) { - var clsid *GUID - clsid, err = CLSIDFromProgID(progId) - if err != nil { - clsid, err = CLSIDFromString(progId) - if err != nil { - return - } - } - - unknown, err := CreateInstance(clsid, IID_IUnknown) - if err != nil { - return - } - c.Object = unknown - - return -} - -// Release IUnknown object. -func (c *Connection) Release() { - c.Object.Release() -} - -// Load COM object from list of programIDs or strings. -func (c *Connection) Load(names ...string) (errors []error) { - var tempErrors []error = make([]error, len(names)) - var numErrors int = 0 - for _, name := range names { - err := c.Create(name) - if err != nil { - tempErrors = append(tempErrors, err) - numErrors += 1 - continue - } - break - } - - copy(errors, tempErrors[0:numErrors]) - return -} - -// Dispatch returns Dispatch object. -func (c *Connection) Dispatch() (object *Dispatch, err error) { - dispatch, err := c.Object.QueryInterface(IID_IDispatch) - if err != nil { - return - } - object = &Dispatch{dispatch} - return -} - -// Dispatch stores IDispatch object. -type Dispatch struct { - Object *IDispatch // Dispatch object. -} - -// Call method on IDispatch with parameters. -func (d *Dispatch) Call(method string, params ...interface{}) (result *VARIANT, err error) { - id, err := d.GetId(method) - if err != nil { - return - } - - result, err = d.Invoke(id, DISPATCH_METHOD, params) - return -} - -// MustCall method on IDispatch with parameters. -func (d *Dispatch) MustCall(method string, params ...interface{}) (result *VARIANT) { - id, err := d.GetId(method) - if err != nil { - panic(err) - } - - result, err = d.Invoke(id, DISPATCH_METHOD, params) - if err != nil { - panic(err) - } - - return -} - -// Get property on IDispatch with parameters. -func (d *Dispatch) Get(name string, params ...interface{}) (result *VARIANT, err error) { - id, err := d.GetId(name) - if err != nil { - return - } - result, err = d.Invoke(id, DISPATCH_PROPERTYGET, params) - return -} - -// MustGet property on IDispatch with parameters. -func (d *Dispatch) MustGet(name string, params ...interface{}) (result *VARIANT) { - id, err := d.GetId(name) - if err != nil { - panic(err) - } - - result, err = d.Invoke(id, DISPATCH_PROPERTYGET, params) - if err != nil { - panic(err) - } - return -} - -// Set property on IDispatch with parameters. -func (d *Dispatch) Set(name string, params ...interface{}) (result *VARIANT, err error) { - id, err := d.GetId(name) - if err != nil { - return - } - result, err = d.Invoke(id, DISPATCH_PROPERTYPUT, params) - return -} - -// MustSet property on IDispatch with parameters. -func (d *Dispatch) MustSet(name string, params ...interface{}) (result *VARIANT) { - id, err := d.GetId(name) - if err != nil { - panic(err) - } - - result, err = d.Invoke(id, DISPATCH_PROPERTYPUT, params) - if err != nil { - panic(err) - } - return -} - -// GetId retrieves ID of name on IDispatch. -func (d *Dispatch) GetId(name string) (id int32, err error) { - var dispid []int32 - dispid, err = d.Object.GetIDsOfName([]string{name}) - if err != nil { - return - } - id = dispid[0] - return -} - -// GetIds retrieves all IDs of names on IDispatch. -func (d *Dispatch) GetIds(names ...string) (dispid []int32, err error) { - dispid, err = d.Object.GetIDsOfName(names) - return -} - -// Invoke IDispatch on DisplayID of dispatch type with parameters. -// -// There have been problems where if send cascading params..., it would error -// out because the parameters would be empty. -func (d *Dispatch) Invoke(id int32, dispatch int16, params []interface{}) (result *VARIANT, err error) { - if len(params) < 1 { - result, err = d.Object.Invoke(id, dispatch) - } else { - result, err = d.Object.Invoke(id, dispatch, params...) - } - return -} - -// Release IDispatch object. -func (d *Dispatch) Release() { - d.Object.Release() -} - -// Connect initializes COM and attempts to load IUnknown based on given names. -func Connect(names ...string) (connection *Connection) { - connection.Initialize() - connection.Load(names...) - return -} diff --git a/vendor/github.com/go-ole/go-ole/constants.go b/vendor/github.com/go-ole/go-ole/constants.go deleted file mode 100644 index fd0c6d74b0e9..000000000000 --- a/vendor/github.com/go-ole/go-ole/constants.go +++ /dev/null @@ -1,153 +0,0 @@ -package ole - -const ( - CLSCTX_INPROC_SERVER = 1 - CLSCTX_INPROC_HANDLER = 2 - CLSCTX_LOCAL_SERVER = 4 - CLSCTX_INPROC_SERVER16 = 8 - CLSCTX_REMOTE_SERVER = 16 - CLSCTX_ALL = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER - CLSCTX_INPROC = CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER - CLSCTX_SERVER = CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER -) - -const ( - COINIT_APARTMENTTHREADED = 0x2 - COINIT_MULTITHREADED = 0x0 - COINIT_DISABLE_OLE1DDE = 0x4 - COINIT_SPEED_OVER_MEMORY = 0x8 -) - -const ( - DISPATCH_METHOD = 1 - DISPATCH_PROPERTYGET = 2 - DISPATCH_PROPERTYPUT = 4 - DISPATCH_PROPERTYPUTREF = 8 -) - -const ( - S_OK = 0x00000000 - E_UNEXPECTED = 0x8000FFFF - E_NOTIMPL = 0x80004001 - E_OUTOFMEMORY = 0x8007000E - E_INVALIDARG = 0x80070057 - E_NOINTERFACE = 0x80004002 - E_POINTER = 0x80004003 - E_HANDLE = 0x80070006 - E_ABORT = 0x80004004 - E_FAIL = 0x80004005 - E_ACCESSDENIED = 0x80070005 - E_PENDING = 0x8000000A - - CO_E_CLASSSTRING = 0x800401F3 -) - -const ( - CC_FASTCALL = iota - CC_CDECL - CC_MSCPASCAL - CC_PASCAL = CC_MSCPASCAL - CC_MACPASCAL - CC_STDCALL - CC_FPFASTCALL - CC_SYSCALL - CC_MPWCDECL - CC_MPWPASCAL - CC_MAX = CC_MPWPASCAL -) - -type VT uint16 - -const ( - VT_EMPTY VT = 0x0 - VT_NULL VT = 0x1 - VT_I2 VT = 0x2 - VT_I4 VT = 0x3 - VT_R4 VT = 0x4 - VT_R8 VT = 0x5 - VT_CY VT = 0x6 - VT_DATE VT = 0x7 - VT_BSTR VT = 0x8 - VT_DISPATCH VT = 0x9 - VT_ERROR VT = 0xa - VT_BOOL VT = 0xb - VT_VARIANT VT = 0xc - VT_UNKNOWN VT = 0xd - VT_DECIMAL VT = 0xe - VT_I1 VT = 0x10 - VT_UI1 VT = 0x11 - VT_UI2 VT = 0x12 - VT_UI4 VT = 0x13 - VT_I8 VT = 0x14 - VT_UI8 VT = 0x15 - VT_INT VT = 0x16 - VT_UINT VT = 0x17 - VT_VOID VT = 0x18 - VT_HRESULT VT = 0x19 - VT_PTR VT = 0x1a - VT_SAFEARRAY VT = 0x1b - VT_CARRAY VT = 0x1c - VT_USERDEFINED VT = 0x1d - VT_LPSTR VT = 0x1e - VT_LPWSTR VT = 0x1f - VT_RECORD VT = 0x24 - VT_INT_PTR VT = 0x25 - VT_UINT_PTR VT = 0x26 - VT_FILETIME VT = 0x40 - VT_BLOB VT = 0x41 - VT_STREAM VT = 0x42 - VT_STORAGE VT = 0x43 - VT_STREAMED_OBJECT VT = 0x44 - VT_STORED_OBJECT VT = 0x45 - VT_BLOB_OBJECT VT = 0x46 - VT_CF VT = 0x47 - VT_CLSID VT = 0x48 - VT_BSTR_BLOB VT = 0xfff - VT_VECTOR VT = 0x1000 - VT_ARRAY VT = 0x2000 - VT_BYREF VT = 0x4000 - VT_RESERVED VT = 0x8000 - VT_ILLEGAL VT = 0xffff - VT_ILLEGALMASKED VT = 0xfff - VT_TYPEMASK VT = 0xfff -) - -const ( - DISPID_UNKNOWN = -1 - DISPID_VALUE = 0 - DISPID_PROPERTYPUT = -3 - DISPID_NEWENUM = -4 - DISPID_EVALUATE = -5 - DISPID_CONSTRUCTOR = -6 - DISPID_DESTRUCTOR = -7 - DISPID_COLLECT = -8 -) - -const ( - TKIND_ENUM = 1 - TKIND_RECORD = 2 - TKIND_MODULE = 3 - TKIND_INTERFACE = 4 - TKIND_DISPATCH = 5 - TKIND_COCLASS = 6 - TKIND_ALIAS = 7 - TKIND_UNION = 8 - TKIND_MAX = 9 -) - -// Safe Array Feature Flags - -const ( - FADF_AUTO = 0x0001 - FADF_STATIC = 0x0002 - FADF_EMBEDDED = 0x0004 - FADF_FIXEDSIZE = 0x0010 - FADF_RECORD = 0x0020 - FADF_HAVEIID = 0x0040 - FADF_HAVEVARTYPE = 0x0080 - FADF_BSTR = 0x0100 - FADF_UNKNOWN = 0x0200 - FADF_DISPATCH = 0x0400 - FADF_VARIANT = 0x0800 - FADF_RESERVED = 0xF008 -) diff --git a/vendor/github.com/go-ole/go-ole/error.go b/vendor/github.com/go-ole/go-ole/error.go deleted file mode 100644 index 096b456d3a1f..000000000000 --- a/vendor/github.com/go-ole/go-ole/error.go +++ /dev/null @@ -1,51 +0,0 @@ -package ole - -// OleError stores COM errors. -type OleError struct { - hr uintptr - description string - subError error -} - -// NewError creates new error with HResult. -func NewError(hr uintptr) *OleError { - return &OleError{hr: hr} -} - -// NewErrorWithDescription creates new COM error with HResult and description. -func NewErrorWithDescription(hr uintptr, description string) *OleError { - return &OleError{hr: hr, description: description} -} - -// NewErrorWithSubError creates new COM error with parent error. -func NewErrorWithSubError(hr uintptr, description string, err error) *OleError { - return &OleError{hr: hr, description: description, subError: err} -} - -// Code is the HResult. -func (v *OleError) Code() uintptr { - return uintptr(v.hr) -} - -// String description, either manually set or format message with error code. -func (v *OleError) String() string { - if v.description != "" { - return errstr(int(v.hr)) + " (" + v.description + ")" - } - return errstr(int(v.hr)) -} - -// Error implements error interface. -func (v *OleError) Error() string { - return v.String() -} - -// Description retrieves error summary, if there is one. -func (v *OleError) Description() string { - return v.description -} - -// SubError returns parent error, if there is one. -func (v *OleError) SubError() error { - return v.subError -} diff --git a/vendor/github.com/go-ole/go-ole/error_func.go b/vendor/github.com/go-ole/go-ole/error_func.go deleted file mode 100644 index 8a2ffaa2724f..000000000000 --- a/vendor/github.com/go-ole/go-ole/error_func.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build !windows - -package ole - -// errstr converts error code to string. -func errstr(errno int) string { - return "" -} diff --git a/vendor/github.com/go-ole/go-ole/error_windows.go b/vendor/github.com/go-ole/go-ole/error_windows.go deleted file mode 100644 index d0e8e68595c4..000000000000 --- a/vendor/github.com/go-ole/go-ole/error_windows.go +++ /dev/null @@ -1,24 +0,0 @@ -// +build windows - -package ole - -import ( - "fmt" - "syscall" - "unicode/utf16" -) - -// errstr converts error code to string. -func errstr(errno int) string { - // ask windows for the remaining errors - var flags uint32 = syscall.FORMAT_MESSAGE_FROM_SYSTEM | syscall.FORMAT_MESSAGE_ARGUMENT_ARRAY | syscall.FORMAT_MESSAGE_IGNORE_INSERTS - b := make([]uint16, 300) - n, err := syscall.FormatMessage(flags, 0, uint32(errno), 0, b, nil) - if err != nil { - return fmt.Sprintf("error %d (FormatMessage failed with: %v)", errno, err) - } - // trim terminating \r and \n - for ; n > 0 && (b[n-1] == '\n' || b[n-1] == '\r'); n-- { - } - return string(utf16.Decode(b[:n])) -} diff --git a/vendor/github.com/go-ole/go-ole/guid.go b/vendor/github.com/go-ole/go-ole/guid.go deleted file mode 100644 index 8d20f68fbf4a..000000000000 --- a/vendor/github.com/go-ole/go-ole/guid.go +++ /dev/null @@ -1,284 +0,0 @@ -package ole - -var ( - // IID_NULL is null Interface ID, used when no other Interface ID is known. - IID_NULL = NewGUID("{00000000-0000-0000-0000-000000000000}") - - // IID_IUnknown is for IUnknown interfaces. - IID_IUnknown = NewGUID("{00000000-0000-0000-C000-000000000046}") - - // IID_IDispatch is for IDispatch interfaces. - IID_IDispatch = NewGUID("{00020400-0000-0000-C000-000000000046}") - - // IID_IEnumVariant is for IEnumVariant interfaces - IID_IEnumVariant = NewGUID("{00020404-0000-0000-C000-000000000046}") - - // IID_IConnectionPointContainer is for IConnectionPointContainer interfaces. - IID_IConnectionPointContainer = NewGUID("{B196B284-BAB4-101A-B69C-00AA00341D07}") - - // IID_IConnectionPoint is for IConnectionPoint interfaces. - IID_IConnectionPoint = NewGUID("{B196B286-BAB4-101A-B69C-00AA00341D07}") - - // IID_IInspectable is for IInspectable interfaces. - IID_IInspectable = NewGUID("{AF86E2E0-B12D-4C6A-9C5A-D7AA65101E90}") - - // IID_IProvideClassInfo is for IProvideClassInfo interfaces. - IID_IProvideClassInfo = NewGUID("{B196B283-BAB4-101A-B69C-00AA00341D07}") -) - -// These are for testing and not part of any library. -var ( - // IID_ICOMTestString is for ICOMTestString interfaces. - // - // {E0133EB4-C36F-469A-9D3D-C66B84BE19ED} - IID_ICOMTestString = NewGUID("{E0133EB4-C36F-469A-9D3D-C66B84BE19ED}") - - // IID_ICOMTestInt8 is for ICOMTestInt8 interfaces. - // - // {BEB06610-EB84-4155-AF58-E2BFF53680B4} - IID_ICOMTestInt8 = NewGUID("{BEB06610-EB84-4155-AF58-E2BFF53680B4}") - - // IID_ICOMTestInt16 is for ICOMTestInt16 interfaces. - // - // {DAA3F9FA-761E-4976-A860-8364CE55F6FC} - IID_ICOMTestInt16 = NewGUID("{DAA3F9FA-761E-4976-A860-8364CE55F6FC}") - - // IID_ICOMTestInt32 is for ICOMTestInt32 interfaces. - // - // {E3DEDEE7-38A2-4540-91D1-2EEF1D8891B0} - IID_ICOMTestInt32 = NewGUID("{E3DEDEE7-38A2-4540-91D1-2EEF1D8891B0}") - - // IID_ICOMTestInt64 is for ICOMTestInt64 interfaces. - // - // {8D437CBC-B3ED-485C-BC32-C336432A1623} - IID_ICOMTestInt64 = NewGUID("{8D437CBC-B3ED-485C-BC32-C336432A1623}") - - // IID_ICOMTestFloat is for ICOMTestFloat interfaces. - // - // {BF1ED004-EA02-456A-AA55-2AC8AC6B054C} - IID_ICOMTestFloat = NewGUID("{BF1ED004-EA02-456A-AA55-2AC8AC6B054C}") - - // IID_ICOMTestDouble is for ICOMTestDouble interfaces. - // - // {BF908A81-8687-4E93-999F-D86FAB284BA0} - IID_ICOMTestDouble = NewGUID("{BF908A81-8687-4E93-999F-D86FAB284BA0}") - - // IID_ICOMTestBoolean is for ICOMTestBoolean interfaces. - // - // {D530E7A6-4EE8-40D1-8931-3D63B8605010} - IID_ICOMTestBoolean = NewGUID("{D530E7A6-4EE8-40D1-8931-3D63B8605010}") - - // IID_ICOMEchoTestObject is for ICOMEchoTestObject interfaces. - // - // {6485B1EF-D780-4834-A4FE-1EBB51746CA3} - IID_ICOMEchoTestObject = NewGUID("{6485B1EF-D780-4834-A4FE-1EBB51746CA3}") - - // IID_ICOMTestTypes is for ICOMTestTypes interfaces. - // - // {CCA8D7AE-91C0-4277-A8B3-FF4EDF28D3C0} - IID_ICOMTestTypes = NewGUID("{CCA8D7AE-91C0-4277-A8B3-FF4EDF28D3C0}") - - // CLSID_COMEchoTestObject is for COMEchoTestObject class. - // - // {3C24506A-AE9E-4D50-9157-EF317281F1B0} - CLSID_COMEchoTestObject = NewGUID("{3C24506A-AE9E-4D50-9157-EF317281F1B0}") - - // CLSID_COMTestScalarClass is for COMTestScalarClass class. - // - // {865B85C5-0334-4AC6-9EF6-AACEC8FC5E86} - CLSID_COMTestScalarClass = NewGUID("{865B85C5-0334-4AC6-9EF6-AACEC8FC5E86}") -) - -const hextable = "0123456789ABCDEF" -const emptyGUID = "{00000000-0000-0000-0000-000000000000}" - -// GUID is Windows API specific GUID type. -// -// This exists to match Windows GUID type for direct passing for COM. -// Format is in xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx. -type GUID struct { - Data1 uint32 - Data2 uint16 - Data3 uint16 - Data4 [8]byte -} - -// NewGUID converts the given string into a globally unique identifier that is -// compliant with the Windows API. -// -// The supplied string may be in any of these formats: -// -// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -// XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX -// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -// -// The conversion of the supplied string is not case-sensitive. -func NewGUID(guid string) *GUID { - d := []byte(guid) - var d1, d2, d3, d4a, d4b []byte - - switch len(d) { - case 38: - if d[0] != '{' || d[37] != '}' { - return nil - } - d = d[1:37] - fallthrough - case 36: - if d[8] != '-' || d[13] != '-' || d[18] != '-' || d[23] != '-' { - return nil - } - d1 = d[0:8] - d2 = d[9:13] - d3 = d[14:18] - d4a = d[19:23] - d4b = d[24:36] - case 32: - d1 = d[0:8] - d2 = d[8:12] - d3 = d[12:16] - d4a = d[16:20] - d4b = d[20:32] - default: - return nil - } - - var g GUID - var ok1, ok2, ok3, ok4 bool - g.Data1, ok1 = decodeHexUint32(d1) - g.Data2, ok2 = decodeHexUint16(d2) - g.Data3, ok3 = decodeHexUint16(d3) - g.Data4, ok4 = decodeHexByte64(d4a, d4b) - if ok1 && ok2 && ok3 && ok4 { - return &g - } - return nil -} - -func decodeHexUint32(src []byte) (value uint32, ok bool) { - var b1, b2, b3, b4 byte - var ok1, ok2, ok3, ok4 bool - b1, ok1 = decodeHexByte(src[0], src[1]) - b2, ok2 = decodeHexByte(src[2], src[3]) - b3, ok3 = decodeHexByte(src[4], src[5]) - b4, ok4 = decodeHexByte(src[6], src[7]) - value = (uint32(b1) << 24) | (uint32(b2) << 16) | (uint32(b3) << 8) | uint32(b4) - ok = ok1 && ok2 && ok3 && ok4 - return -} - -func decodeHexUint16(src []byte) (value uint16, ok bool) { - var b1, b2 byte - var ok1, ok2 bool - b1, ok1 = decodeHexByte(src[0], src[1]) - b2, ok2 = decodeHexByte(src[2], src[3]) - value = (uint16(b1) << 8) | uint16(b2) - ok = ok1 && ok2 - return -} - -func decodeHexByte64(s1 []byte, s2 []byte) (value [8]byte, ok bool) { - var ok1, ok2, ok3, ok4, ok5, ok6, ok7, ok8 bool - value[0], ok1 = decodeHexByte(s1[0], s1[1]) - value[1], ok2 = decodeHexByte(s1[2], s1[3]) - value[2], ok3 = decodeHexByte(s2[0], s2[1]) - value[3], ok4 = decodeHexByte(s2[2], s2[3]) - value[4], ok5 = decodeHexByte(s2[4], s2[5]) - value[5], ok6 = decodeHexByte(s2[6], s2[7]) - value[6], ok7 = decodeHexByte(s2[8], s2[9]) - value[7], ok8 = decodeHexByte(s2[10], s2[11]) - ok = ok1 && ok2 && ok3 && ok4 && ok5 && ok6 && ok7 && ok8 - return -} - -func decodeHexByte(c1, c2 byte) (value byte, ok bool) { - var n1, n2 byte - var ok1, ok2 bool - n1, ok1 = decodeHexChar(c1) - n2, ok2 = decodeHexChar(c2) - value = (n1 << 4) | n2 - ok = ok1 && ok2 - return -} - -func decodeHexChar(c byte) (byte, bool) { - switch { - case '0' <= c && c <= '9': - return c - '0', true - case 'a' <= c && c <= 'f': - return c - 'a' + 10, true - case 'A' <= c && c <= 'F': - return c - 'A' + 10, true - } - - return 0, false -} - -// String converts the GUID to string form. It will adhere to this pattern: -// -// {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -// -// If the GUID is nil, the string representation of an empty GUID is returned: -// -// {00000000-0000-0000-0000-000000000000} -func (guid *GUID) String() string { - if guid == nil { - return emptyGUID - } - - var c [38]byte - c[0] = '{' - putUint32Hex(c[1:9], guid.Data1) - c[9] = '-' - putUint16Hex(c[10:14], guid.Data2) - c[14] = '-' - putUint16Hex(c[15:19], guid.Data3) - c[19] = '-' - putByteHex(c[20:24], guid.Data4[0:2]) - c[24] = '-' - putByteHex(c[25:37], guid.Data4[2:8]) - c[37] = '}' - return string(c[:]) -} - -func putUint32Hex(b []byte, v uint32) { - b[0] = hextable[byte(v>>24)>>4] - b[1] = hextable[byte(v>>24)&0x0f] - b[2] = hextable[byte(v>>16)>>4] - b[3] = hextable[byte(v>>16)&0x0f] - b[4] = hextable[byte(v>>8)>>4] - b[5] = hextable[byte(v>>8)&0x0f] - b[6] = hextable[byte(v)>>4] - b[7] = hextable[byte(v)&0x0f] -} - -func putUint16Hex(b []byte, v uint16) { - b[0] = hextable[byte(v>>8)>>4] - b[1] = hextable[byte(v>>8)&0x0f] - b[2] = hextable[byte(v)>>4] - b[3] = hextable[byte(v)&0x0f] -} - -func putByteHex(dst, src []byte) { - for i := 0; i < len(src); i++ { - dst[i*2] = hextable[src[i]>>4] - dst[i*2+1] = hextable[src[i]&0x0f] - } -} - -// IsEqualGUID compares two GUID. -// -// Not constant time comparison. -func IsEqualGUID(guid1 *GUID, guid2 *GUID) bool { - return guid1.Data1 == guid2.Data1 && - guid1.Data2 == guid2.Data2 && - guid1.Data3 == guid2.Data3 && - guid1.Data4[0] == guid2.Data4[0] && - guid1.Data4[1] == guid2.Data4[1] && - guid1.Data4[2] == guid2.Data4[2] && - guid1.Data4[3] == guid2.Data4[3] && - guid1.Data4[4] == guid2.Data4[4] && - guid1.Data4[5] == guid2.Data4[5] && - guid1.Data4[6] == guid2.Data4[6] && - guid1.Data4[7] == guid2.Data4[7] -} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpoint.go b/vendor/github.com/go-ole/go-ole/iconnectionpoint.go deleted file mode 100644 index 9e6c49f41f0a..000000000000 --- a/vendor/github.com/go-ole/go-ole/iconnectionpoint.go +++ /dev/null @@ -1,20 +0,0 @@ -package ole - -import "unsafe" - -type IConnectionPoint struct { - IUnknown -} - -type IConnectionPointVtbl struct { - IUnknownVtbl - GetConnectionInterface uintptr - GetConnectionPointContainer uintptr - Advise uintptr - Unadvise uintptr - EnumConnections uintptr -} - -func (v *IConnectionPoint) VTable() *IConnectionPointVtbl { - return (*IConnectionPointVtbl)(unsafe.Pointer(v.RawVTable)) -} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go b/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go deleted file mode 100644 index 5414dc3cd3bc..000000000000 --- a/vendor/github.com/go-ole/go-ole/iconnectionpoint_func.go +++ /dev/null @@ -1,21 +0,0 @@ -// +build !windows - -package ole - -import "unsafe" - -func (v *IConnectionPoint) GetConnectionInterface(piid **GUID) int32 { - return int32(0) -} - -func (v *IConnectionPoint) Advise(unknown *IUnknown) (uint32, error) { - return uint32(0), NewError(E_NOTIMPL) -} - -func (v *IConnectionPoint) Unadvise(cookie uint32) error { - return NewError(E_NOTIMPL) -} - -func (v *IConnectionPoint) EnumConnections(p *unsafe.Pointer) (err error) { - return NewError(E_NOTIMPL) -} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go b/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go deleted file mode 100644 index 32bc183248d9..000000000000 --- a/vendor/github.com/go-ole/go-ole/iconnectionpoint_windows.go +++ /dev/null @@ -1,43 +0,0 @@ -// +build windows - -package ole - -import ( - "syscall" - "unsafe" -) - -func (v *IConnectionPoint) GetConnectionInterface(piid **GUID) int32 { - // XXX: This doesn't look like it does what it's supposed to - return release((*IUnknown)(unsafe.Pointer(v))) -} - -func (v *IConnectionPoint) Advise(unknown *IUnknown) (cookie uint32, err error) { - hr, _, _ := syscall.Syscall( - v.VTable().Advise, - 3, - uintptr(unsafe.Pointer(v)), - uintptr(unsafe.Pointer(unknown)), - uintptr(unsafe.Pointer(&cookie))) - if hr != 0 { - err = NewError(hr) - } - return -} - -func (v *IConnectionPoint) Unadvise(cookie uint32) (err error) { - hr, _, _ := syscall.Syscall( - v.VTable().Unadvise, - 2, - uintptr(unsafe.Pointer(v)), - uintptr(cookie), - 0) - if hr != 0 { - err = NewError(hr) - } - return -} - -func (v *IConnectionPoint) EnumConnections(p *unsafe.Pointer) error { - return NewError(E_NOTIMPL) -} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go deleted file mode 100644 index 165860d199e8..000000000000 --- a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer.go +++ /dev/null @@ -1,17 +0,0 @@ -package ole - -import "unsafe" - -type IConnectionPointContainer struct { - IUnknown -} - -type IConnectionPointContainerVtbl struct { - IUnknownVtbl - EnumConnectionPoints uintptr - FindConnectionPoint uintptr -} - -func (v *IConnectionPointContainer) VTable() *IConnectionPointContainerVtbl { - return (*IConnectionPointContainerVtbl)(unsafe.Pointer(v.RawVTable)) -} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go deleted file mode 100644 index 5dfa42aaebb7..000000000000 --- a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_func.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build !windows - -package ole - -func (v *IConnectionPointContainer) EnumConnectionPoints(points interface{}) error { - return NewError(E_NOTIMPL) -} - -func (v *IConnectionPointContainer) FindConnectionPoint(iid *GUID, point **IConnectionPoint) error { - return NewError(E_NOTIMPL) -} diff --git a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go b/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go deleted file mode 100644 index ad30d79efc4e..000000000000 --- a/vendor/github.com/go-ole/go-ole/iconnectionpointcontainer_windows.go +++ /dev/null @@ -1,25 +0,0 @@ -// +build windows - -package ole - -import ( - "syscall" - "unsafe" -) - -func (v *IConnectionPointContainer) EnumConnectionPoints(points interface{}) error { - return NewError(E_NOTIMPL) -} - -func (v *IConnectionPointContainer) FindConnectionPoint(iid *GUID, point **IConnectionPoint) (err error) { - hr, _, _ := syscall.Syscall( - v.VTable().FindConnectionPoint, - 3, - uintptr(unsafe.Pointer(v)), - uintptr(unsafe.Pointer(iid)), - uintptr(unsafe.Pointer(point))) - if hr != 0 { - err = NewError(hr) - } - return -} diff --git a/vendor/github.com/go-ole/go-ole/idispatch.go b/vendor/github.com/go-ole/go-ole/idispatch.go deleted file mode 100644 index d4af1240925d..000000000000 --- a/vendor/github.com/go-ole/go-ole/idispatch.go +++ /dev/null @@ -1,94 +0,0 @@ -package ole - -import "unsafe" - -type IDispatch struct { - IUnknown -} - -type IDispatchVtbl struct { - IUnknownVtbl - GetTypeInfoCount uintptr - GetTypeInfo uintptr - GetIDsOfNames uintptr - Invoke uintptr -} - -func (v *IDispatch) VTable() *IDispatchVtbl { - return (*IDispatchVtbl)(unsafe.Pointer(v.RawVTable)) -} - -func (v *IDispatch) GetIDsOfName(names []string) (dispid []int32, err error) { - dispid, err = getIDsOfName(v, names) - return -} - -func (v *IDispatch) Invoke(dispid int32, dispatch int16, params ...interface{}) (result *VARIANT, err error) { - result, err = invoke(v, dispid, dispatch, params...) - return -} - -func (v *IDispatch) GetTypeInfoCount() (c uint32, err error) { - c, err = getTypeInfoCount(v) - return -} - -func (v *IDispatch) GetTypeInfo() (tinfo *ITypeInfo, err error) { - tinfo, err = getTypeInfo(v) - return -} - -// GetSingleIDOfName is a helper that returns single display ID for IDispatch name. -// -// This replaces the common pattern of attempting to get a single name from the list of available -// IDs. It gives the first ID, if it is available. -func (v *IDispatch) GetSingleIDOfName(name string) (displayID int32, err error) { - var displayIDs []int32 - displayIDs, err = v.GetIDsOfName([]string{name}) - if err != nil { - return - } - displayID = displayIDs[0] - return -} - -// InvokeWithOptionalArgs accepts arguments as an array, works like Invoke. -// -// Accepts name and will attempt to retrieve Display ID to pass to Invoke. -// -// Passing params as an array is a workaround that could be fixed in later versions of Go that -// prevent passing empty params. During testing it was discovered that this is an acceptable way of -// getting around not being able to pass params normally. -func (v *IDispatch) InvokeWithOptionalArgs(name string, dispatch int16, params []interface{}) (result *VARIANT, err error) { - displayID, err := v.GetSingleIDOfName(name) - if err != nil { - return - } - - if len(params) < 1 { - result, err = v.Invoke(displayID, dispatch) - } else { - result, err = v.Invoke(displayID, dispatch, params...) - } - - return -} - -// CallMethod invokes named function with arguments on object. -func (v *IDispatch) CallMethod(name string, params ...interface{}) (*VARIANT, error) { - return v.InvokeWithOptionalArgs(name, DISPATCH_METHOD, params) -} - -// GetProperty retrieves the property with the name with the ability to pass arguments. -// -// Most of the time you will not need to pass arguments as most objects do not allow for this -// feature. Or at least, should not allow for this feature. Some servers don't follow best practices -// and this is provided for those edge cases. -func (v *IDispatch) GetProperty(name string, params ...interface{}) (*VARIANT, error) { - return v.InvokeWithOptionalArgs(name, DISPATCH_PROPERTYGET, params) -} - -// PutProperty attempts to mutate a property in the object. -func (v *IDispatch) PutProperty(name string, params ...interface{}) (*VARIANT, error) { - return v.InvokeWithOptionalArgs(name, DISPATCH_PROPERTYPUT, params) -} diff --git a/vendor/github.com/go-ole/go-ole/idispatch_func.go b/vendor/github.com/go-ole/go-ole/idispatch_func.go deleted file mode 100644 index b8fbbe319f1a..000000000000 --- a/vendor/github.com/go-ole/go-ole/idispatch_func.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build !windows - -package ole - -func getIDsOfName(disp *IDispatch, names []string) ([]int32, error) { - return []int32{}, NewError(E_NOTIMPL) -} - -func getTypeInfoCount(disp *IDispatch) (uint32, error) { - return uint32(0), NewError(E_NOTIMPL) -} - -func getTypeInfo(disp *IDispatch) (*ITypeInfo, error) { - return nil, NewError(E_NOTIMPL) -} - -func invoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (*VARIANT, error) { - return nil, NewError(E_NOTIMPL) -} diff --git a/vendor/github.com/go-ole/go-ole/idispatch_windows.go b/vendor/github.com/go-ole/go-ole/idispatch_windows.go deleted file mode 100644 index 020e4f51b02a..000000000000 --- a/vendor/github.com/go-ole/go-ole/idispatch_windows.go +++ /dev/null @@ -1,197 +0,0 @@ -// +build windows - -package ole - -import ( - "syscall" - "time" - "unsafe" -) - -func getIDsOfName(disp *IDispatch, names []string) (dispid []int32, err error) { - wnames := make([]*uint16, len(names)) - for i := 0; i < len(names); i++ { - wnames[i] = syscall.StringToUTF16Ptr(names[i]) - } - dispid = make([]int32, len(names)) - namelen := uint32(len(names)) - hr, _, _ := syscall.Syscall6( - disp.VTable().GetIDsOfNames, - 6, - uintptr(unsafe.Pointer(disp)), - uintptr(unsafe.Pointer(IID_NULL)), - uintptr(unsafe.Pointer(&wnames[0])), - uintptr(namelen), - uintptr(GetUserDefaultLCID()), - uintptr(unsafe.Pointer(&dispid[0]))) - if hr != 0 { - err = NewError(hr) - } - return -} - -func getTypeInfoCount(disp *IDispatch) (c uint32, err error) { - hr, _, _ := syscall.Syscall( - disp.VTable().GetTypeInfoCount, - 2, - uintptr(unsafe.Pointer(disp)), - uintptr(unsafe.Pointer(&c)), - 0) - if hr != 0 { - err = NewError(hr) - } - return -} - -func getTypeInfo(disp *IDispatch) (tinfo *ITypeInfo, err error) { - hr, _, _ := syscall.Syscall( - disp.VTable().GetTypeInfo, - 3, - uintptr(unsafe.Pointer(disp)), - uintptr(GetUserDefaultLCID()), - uintptr(unsafe.Pointer(&tinfo))) - if hr != 0 { - err = NewError(hr) - } - return -} - -func invoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (result *VARIANT, err error) { - var dispparams DISPPARAMS - - if dispatch&DISPATCH_PROPERTYPUT != 0 { - dispnames := [1]int32{DISPID_PROPERTYPUT} - dispparams.rgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0])) - dispparams.cNamedArgs = 1 - } else if dispatch&DISPATCH_PROPERTYPUTREF != 0 { - dispnames := [1]int32{DISPID_PROPERTYPUT} - dispparams.rgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0])) - dispparams.cNamedArgs = 1 - } - var vargs []VARIANT - if len(params) > 0 { - vargs = make([]VARIANT, len(params)) - for i, v := range params { - //n := len(params)-i-1 - n := len(params) - i - 1 - VariantInit(&vargs[n]) - switch vv := v.(type) { - case bool: - if vv { - vargs[n] = NewVariant(VT_BOOL, 0xffff) - } else { - vargs[n] = NewVariant(VT_BOOL, 0) - } - case *bool: - vargs[n] = NewVariant(VT_BOOL|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*bool))))) - case uint8: - vargs[n] = NewVariant(VT_I1, int64(v.(uint8))) - case *uint8: - vargs[n] = NewVariant(VT_I1|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint8))))) - case int8: - vargs[n] = NewVariant(VT_I1, int64(v.(int8))) - case *int8: - vargs[n] = NewVariant(VT_I1|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint8))))) - case int16: - vargs[n] = NewVariant(VT_I2, int64(v.(int16))) - case *int16: - vargs[n] = NewVariant(VT_I2|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int16))))) - case uint16: - vargs[n] = NewVariant(VT_UI2, int64(v.(uint16))) - case *uint16: - vargs[n] = NewVariant(VT_UI2|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint16))))) - case int32: - vargs[n] = NewVariant(VT_I4, int64(v.(int32))) - case *int32: - vargs[n] = NewVariant(VT_I4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int32))))) - case uint32: - vargs[n] = NewVariant(VT_UI4, int64(v.(uint32))) - case *uint32: - vargs[n] = NewVariant(VT_UI4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint32))))) - case int64: - vargs[n] = NewVariant(VT_I8, int64(v.(int64))) - case *int64: - vargs[n] = NewVariant(VT_I8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int64))))) - case uint64: - vargs[n] = NewVariant(VT_UI8, int64(uintptr(v.(uint64)))) - case *uint64: - vargs[n] = NewVariant(VT_UI8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint64))))) - case int: - vargs[n] = NewVariant(VT_I4, int64(v.(int))) - case *int: - vargs[n] = NewVariant(VT_I4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*int))))) - case uint: - vargs[n] = NewVariant(VT_UI4, int64(v.(uint))) - case *uint: - vargs[n] = NewVariant(VT_UI4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*uint))))) - case float32: - vargs[n] = NewVariant(VT_R4, *(*int64)(unsafe.Pointer(&vv))) - case *float32: - vargs[n] = NewVariant(VT_R4|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*float32))))) - case float64: - vargs[n] = NewVariant(VT_R8, *(*int64)(unsafe.Pointer(&vv))) - case *float64: - vargs[n] = NewVariant(VT_R8|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*float64))))) - case string: - vargs[n] = NewVariant(VT_BSTR, int64(uintptr(unsafe.Pointer(SysAllocStringLen(v.(string)))))) - case *string: - vargs[n] = NewVariant(VT_BSTR|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*string))))) - case time.Time: - s := vv.Format("2006-01-02 15:04:05") - vargs[n] = NewVariant(VT_BSTR, int64(uintptr(unsafe.Pointer(SysAllocStringLen(s))))) - case *time.Time: - s := vv.Format("2006-01-02 15:04:05") - vargs[n] = NewVariant(VT_BSTR|VT_BYREF, int64(uintptr(unsafe.Pointer(&s)))) - case *IDispatch: - vargs[n] = NewVariant(VT_DISPATCH, int64(uintptr(unsafe.Pointer(v.(*IDispatch))))) - case **IDispatch: - vargs[n] = NewVariant(VT_DISPATCH|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(**IDispatch))))) - case nil: - vargs[n] = NewVariant(VT_NULL, 0) - case *VARIANT: - vargs[n] = NewVariant(VT_VARIANT|VT_BYREF, int64(uintptr(unsafe.Pointer(v.(*VARIANT))))) - case []byte: - safeByteArray := safeArrayFromByteSlice(v.([]byte)) - vargs[n] = NewVariant(VT_ARRAY|VT_UI1, int64(uintptr(unsafe.Pointer(safeByteArray)))) - defer VariantClear(&vargs[n]) - case []string: - safeByteArray := safeArrayFromStringSlice(v.([]string)) - vargs[n] = NewVariant(VT_ARRAY|VT_BSTR, int64(uintptr(unsafe.Pointer(safeByteArray)))) - defer VariantClear(&vargs[n]) - default: - panic("unknown type") - } - } - dispparams.rgvarg = uintptr(unsafe.Pointer(&vargs[0])) - dispparams.cArgs = uint32(len(params)) - } - - result = new(VARIANT) - var excepInfo EXCEPINFO - VariantInit(result) - hr, _, _ := syscall.Syscall9( - disp.VTable().Invoke, - 9, - uintptr(unsafe.Pointer(disp)), - uintptr(dispid), - uintptr(unsafe.Pointer(IID_NULL)), - uintptr(GetUserDefaultLCID()), - uintptr(dispatch), - uintptr(unsafe.Pointer(&dispparams)), - uintptr(unsafe.Pointer(result)), - uintptr(unsafe.Pointer(&excepInfo)), - 0) - if hr != 0 { - err = NewErrorWithSubError(hr, BstrToString(excepInfo.bstrDescription), excepInfo) - } - for i, varg := range vargs { - n := len(params) - i - 1 - if varg.VT == VT_BSTR && varg.Val != 0 { - SysFreeString(((*int16)(unsafe.Pointer(uintptr(varg.Val))))) - } - if varg.VT == (VT_BSTR|VT_BYREF) && varg.Val != 0 { - *(params[n].(*string)) = LpOleStrToString(*(**uint16)(unsafe.Pointer(uintptr(varg.Val)))) - } - } - return -} diff --git a/vendor/github.com/go-ole/go-ole/ienumvariant.go b/vendor/github.com/go-ole/go-ole/ienumvariant.go deleted file mode 100644 index 243389754430..000000000000 --- a/vendor/github.com/go-ole/go-ole/ienumvariant.go +++ /dev/null @@ -1,19 +0,0 @@ -package ole - -import "unsafe" - -type IEnumVARIANT struct { - IUnknown -} - -type IEnumVARIANTVtbl struct { - IUnknownVtbl - Next uintptr - Skip uintptr - Reset uintptr - Clone uintptr -} - -func (v *IEnumVARIANT) VTable() *IEnumVARIANTVtbl { - return (*IEnumVARIANTVtbl)(unsafe.Pointer(v.RawVTable)) -} diff --git a/vendor/github.com/go-ole/go-ole/ienumvariant_func.go b/vendor/github.com/go-ole/go-ole/ienumvariant_func.go deleted file mode 100644 index c14848199cb8..000000000000 --- a/vendor/github.com/go-ole/go-ole/ienumvariant_func.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build !windows - -package ole - -func (enum *IEnumVARIANT) Clone() (*IEnumVARIANT, error) { - return nil, NewError(E_NOTIMPL) -} - -func (enum *IEnumVARIANT) Reset() error { - return NewError(E_NOTIMPL) -} - -func (enum *IEnumVARIANT) Skip(celt uint) error { - return NewError(E_NOTIMPL) -} - -func (enum *IEnumVARIANT) Next(celt uint) (VARIANT, uint, error) { - return NewVariant(VT_NULL, int64(0)), 0, NewError(E_NOTIMPL) -} diff --git a/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go b/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go deleted file mode 100644 index 4781f3b8b007..000000000000 --- a/vendor/github.com/go-ole/go-ole/ienumvariant_windows.go +++ /dev/null @@ -1,63 +0,0 @@ -// +build windows - -package ole - -import ( - "syscall" - "unsafe" -) - -func (enum *IEnumVARIANT) Clone() (cloned *IEnumVARIANT, err error) { - hr, _, _ := syscall.Syscall( - enum.VTable().Clone, - 2, - uintptr(unsafe.Pointer(enum)), - uintptr(unsafe.Pointer(&cloned)), - 0) - if hr != 0 { - err = NewError(hr) - } - return -} - -func (enum *IEnumVARIANT) Reset() (err error) { - hr, _, _ := syscall.Syscall( - enum.VTable().Reset, - 1, - uintptr(unsafe.Pointer(enum)), - 0, - 0) - if hr != 0 { - err = NewError(hr) - } - return -} - -func (enum *IEnumVARIANT) Skip(celt uint) (err error) { - hr, _, _ := syscall.Syscall( - enum.VTable().Skip, - 2, - uintptr(unsafe.Pointer(enum)), - uintptr(celt), - 0) - if hr != 0 { - err = NewError(hr) - } - return -} - -func (enum *IEnumVARIANT) Next(celt uint) (array VARIANT, length uint, err error) { - hr, _, _ := syscall.Syscall6( - enum.VTable().Next, - 4, - uintptr(unsafe.Pointer(enum)), - uintptr(celt), - uintptr(unsafe.Pointer(&array)), - uintptr(unsafe.Pointer(&length)), - 0, - 0) - if hr != 0 { - err = NewError(hr) - } - return -} diff --git a/vendor/github.com/go-ole/go-ole/iinspectable.go b/vendor/github.com/go-ole/go-ole/iinspectable.go deleted file mode 100644 index f4a19e253af7..000000000000 --- a/vendor/github.com/go-ole/go-ole/iinspectable.go +++ /dev/null @@ -1,18 +0,0 @@ -package ole - -import "unsafe" - -type IInspectable struct { - IUnknown -} - -type IInspectableVtbl struct { - IUnknownVtbl - GetIIds uintptr - GetRuntimeClassName uintptr - GetTrustLevel uintptr -} - -func (v *IInspectable) VTable() *IInspectableVtbl { - return (*IInspectableVtbl)(unsafe.Pointer(v.RawVTable)) -} diff --git a/vendor/github.com/go-ole/go-ole/iinspectable_func.go b/vendor/github.com/go-ole/go-ole/iinspectable_func.go deleted file mode 100644 index 348829bf062f..000000000000 --- a/vendor/github.com/go-ole/go-ole/iinspectable_func.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build !windows - -package ole - -func (v *IInspectable) GetIids() ([]*GUID, error) { - return []*GUID{}, NewError(E_NOTIMPL) -} - -func (v *IInspectable) GetRuntimeClassName() (string, error) { - return "", NewError(E_NOTIMPL) -} - -func (v *IInspectable) GetTrustLevel() (uint32, error) { - return uint32(0), NewError(E_NOTIMPL) -} diff --git a/vendor/github.com/go-ole/go-ole/iinspectable_windows.go b/vendor/github.com/go-ole/go-ole/iinspectable_windows.go deleted file mode 100644 index 4519a4aa4495..000000000000 --- a/vendor/github.com/go-ole/go-ole/iinspectable_windows.go +++ /dev/null @@ -1,72 +0,0 @@ -// +build windows - -package ole - -import ( - "bytes" - "encoding/binary" - "reflect" - "syscall" - "unsafe" -) - -func (v *IInspectable) GetIids() (iids []*GUID, err error) { - var count uint32 - var array uintptr - hr, _, _ := syscall.Syscall( - v.VTable().GetIIds, - 3, - uintptr(unsafe.Pointer(v)), - uintptr(unsafe.Pointer(&count)), - uintptr(unsafe.Pointer(&array))) - if hr != 0 { - err = NewError(hr) - return - } - defer CoTaskMemFree(array) - - iids = make([]*GUID, count) - byteCount := count * uint32(unsafe.Sizeof(GUID{})) - slicehdr := reflect.SliceHeader{Data: array, Len: int(byteCount), Cap: int(byteCount)} - byteSlice := *(*[]byte)(unsafe.Pointer(&slicehdr)) - reader := bytes.NewReader(byteSlice) - for i := range iids { - guid := GUID{} - err = binary.Read(reader, binary.LittleEndian, &guid) - if err != nil { - return - } - iids[i] = &guid - } - return -} - -func (v *IInspectable) GetRuntimeClassName() (s string, err error) { - var hstring HString - hr, _, _ := syscall.Syscall( - v.VTable().GetRuntimeClassName, - 2, - uintptr(unsafe.Pointer(v)), - uintptr(unsafe.Pointer(&hstring)), - 0) - if hr != 0 { - err = NewError(hr) - return - } - s = hstring.String() - DeleteHString(hstring) - return -} - -func (v *IInspectable) GetTrustLevel() (level uint32, err error) { - hr, _, _ := syscall.Syscall( - v.VTable().GetTrustLevel, - 2, - uintptr(unsafe.Pointer(v)), - uintptr(unsafe.Pointer(&level)), - 0) - if hr != 0 { - err = NewError(hr) - } - return -} diff --git a/vendor/github.com/go-ole/go-ole/iprovideclassinfo.go b/vendor/github.com/go-ole/go-ole/iprovideclassinfo.go deleted file mode 100644 index 25f3a6f24a91..000000000000 --- a/vendor/github.com/go-ole/go-ole/iprovideclassinfo.go +++ /dev/null @@ -1,21 +0,0 @@ -package ole - -import "unsafe" - -type IProvideClassInfo struct { - IUnknown -} - -type IProvideClassInfoVtbl struct { - IUnknownVtbl - GetClassInfo uintptr -} - -func (v *IProvideClassInfo) VTable() *IProvideClassInfoVtbl { - return (*IProvideClassInfoVtbl)(unsafe.Pointer(v.RawVTable)) -} - -func (v *IProvideClassInfo) GetClassInfo() (cinfo *ITypeInfo, err error) { - cinfo, err = getClassInfo(v) - return -} diff --git a/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go deleted file mode 100644 index 7e3cb63ea739..000000000000 --- a/vendor/github.com/go-ole/go-ole/iprovideclassinfo_func.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build !windows - -package ole - -func getClassInfo(disp *IProvideClassInfo) (tinfo *ITypeInfo, err error) { - return nil, NewError(E_NOTIMPL) -} diff --git a/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go b/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go deleted file mode 100644 index 2ad016394974..000000000000 --- a/vendor/github.com/go-ole/go-ole/iprovideclassinfo_windows.go +++ /dev/null @@ -1,21 +0,0 @@ -// +build windows - -package ole - -import ( - "syscall" - "unsafe" -) - -func getClassInfo(disp *IProvideClassInfo) (tinfo *ITypeInfo, err error) { - hr, _, _ := syscall.Syscall( - disp.VTable().GetClassInfo, - 2, - uintptr(unsafe.Pointer(disp)), - uintptr(unsafe.Pointer(&tinfo)), - 0) - if hr != 0 { - err = NewError(hr) - } - return -} diff --git a/vendor/github.com/go-ole/go-ole/itypeinfo.go b/vendor/github.com/go-ole/go-ole/itypeinfo.go deleted file mode 100644 index dd3c5e21bbf3..000000000000 --- a/vendor/github.com/go-ole/go-ole/itypeinfo.go +++ /dev/null @@ -1,34 +0,0 @@ -package ole - -import "unsafe" - -type ITypeInfo struct { - IUnknown -} - -type ITypeInfoVtbl struct { - IUnknownVtbl - GetTypeAttr uintptr - GetTypeComp uintptr - GetFuncDesc uintptr - GetVarDesc uintptr - GetNames uintptr - GetRefTypeOfImplType uintptr - GetImplTypeFlags uintptr - GetIDsOfNames uintptr - Invoke uintptr - GetDocumentation uintptr - GetDllEntry uintptr - GetRefTypeInfo uintptr - AddressOfMember uintptr - CreateInstance uintptr - GetMops uintptr - GetContainingTypeLib uintptr - ReleaseTypeAttr uintptr - ReleaseFuncDesc uintptr - ReleaseVarDesc uintptr -} - -func (v *ITypeInfo) VTable() *ITypeInfoVtbl { - return (*ITypeInfoVtbl)(unsafe.Pointer(v.RawVTable)) -} diff --git a/vendor/github.com/go-ole/go-ole/itypeinfo_func.go b/vendor/github.com/go-ole/go-ole/itypeinfo_func.go deleted file mode 100644 index 8364a659bae1..000000000000 --- a/vendor/github.com/go-ole/go-ole/itypeinfo_func.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build !windows - -package ole - -func (v *ITypeInfo) GetTypeAttr() (*TYPEATTR, error) { - return nil, NewError(E_NOTIMPL) -} diff --git a/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go b/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go deleted file mode 100644 index 54782b3da5dd..000000000000 --- a/vendor/github.com/go-ole/go-ole/itypeinfo_windows.go +++ /dev/null @@ -1,21 +0,0 @@ -// +build windows - -package ole - -import ( - "syscall" - "unsafe" -) - -func (v *ITypeInfo) GetTypeAttr() (tattr *TYPEATTR, err error) { - hr, _, _ := syscall.Syscall( - uintptr(v.VTable().GetTypeAttr), - 2, - uintptr(unsafe.Pointer(v)), - uintptr(unsafe.Pointer(&tattr)), - 0) - if hr != 0 { - err = NewError(hr) - } - return -} diff --git a/vendor/github.com/go-ole/go-ole/iunknown.go b/vendor/github.com/go-ole/go-ole/iunknown.go deleted file mode 100644 index 108f28ea6108..000000000000 --- a/vendor/github.com/go-ole/go-ole/iunknown.go +++ /dev/null @@ -1,57 +0,0 @@ -package ole - -import "unsafe" - -type IUnknown struct { - RawVTable *interface{} -} - -type IUnknownVtbl struct { - QueryInterface uintptr - AddRef uintptr - Release uintptr -} - -type UnknownLike interface { - QueryInterface(iid *GUID) (disp *IDispatch, err error) - AddRef() int32 - Release() int32 -} - -func (v *IUnknown) VTable() *IUnknownVtbl { - return (*IUnknownVtbl)(unsafe.Pointer(v.RawVTable)) -} - -func (v *IUnknown) PutQueryInterface(interfaceID *GUID, obj interface{}) error { - return reflectQueryInterface(v, v.VTable().QueryInterface, interfaceID, obj) -} - -func (v *IUnknown) IDispatch(interfaceID *GUID) (dispatch *IDispatch, err error) { - err = v.PutQueryInterface(interfaceID, &dispatch) - return -} - -func (v *IUnknown) IEnumVARIANT(interfaceID *GUID) (enum *IEnumVARIANT, err error) { - err = v.PutQueryInterface(interfaceID, &enum) - return -} - -func (v *IUnknown) QueryInterface(iid *GUID) (*IDispatch, error) { - return queryInterface(v, iid) -} - -func (v *IUnknown) MustQueryInterface(iid *GUID) (disp *IDispatch) { - unk, err := queryInterface(v, iid) - if err != nil { - panic(err) - } - return unk -} - -func (v *IUnknown) AddRef() int32 { - return addRef(v) -} - -func (v *IUnknown) Release() int32 { - return release(v) -} diff --git a/vendor/github.com/go-ole/go-ole/iunknown_func.go b/vendor/github.com/go-ole/go-ole/iunknown_func.go deleted file mode 100644 index d0a62cfd7302..000000000000 --- a/vendor/github.com/go-ole/go-ole/iunknown_func.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build !windows - -package ole - -func reflectQueryInterface(self interface{}, method uintptr, interfaceID *GUID, obj interface{}) (err error) { - return NewError(E_NOTIMPL) -} - -func queryInterface(unk *IUnknown, iid *GUID) (disp *IDispatch, err error) { - return nil, NewError(E_NOTIMPL) -} - -func addRef(unk *IUnknown) int32 { - return 0 -} - -func release(unk *IUnknown) int32 { - return 0 -} diff --git a/vendor/github.com/go-ole/go-ole/iunknown_windows.go b/vendor/github.com/go-ole/go-ole/iunknown_windows.go deleted file mode 100644 index ede5bb8c1732..000000000000 --- a/vendor/github.com/go-ole/go-ole/iunknown_windows.go +++ /dev/null @@ -1,58 +0,0 @@ -// +build windows - -package ole - -import ( - "reflect" - "syscall" - "unsafe" -) - -func reflectQueryInterface(self interface{}, method uintptr, interfaceID *GUID, obj interface{}) (err error) { - selfValue := reflect.ValueOf(self).Elem() - objValue := reflect.ValueOf(obj).Elem() - - hr, _, _ := syscall.Syscall( - method, - 3, - selfValue.UnsafeAddr(), - uintptr(unsafe.Pointer(interfaceID)), - objValue.Addr().Pointer()) - if hr != 0 { - err = NewError(hr) - } - return -} - -func queryInterface(unk *IUnknown, iid *GUID) (disp *IDispatch, err error) { - hr, _, _ := syscall.Syscall( - unk.VTable().QueryInterface, - 3, - uintptr(unsafe.Pointer(unk)), - uintptr(unsafe.Pointer(iid)), - uintptr(unsafe.Pointer(&disp))) - if hr != 0 { - err = NewError(hr) - } - return -} - -func addRef(unk *IUnknown) int32 { - ret, _, _ := syscall.Syscall( - unk.VTable().AddRef, - 1, - uintptr(unsafe.Pointer(unk)), - 0, - 0) - return int32(ret) -} - -func release(unk *IUnknown) int32 { - ret, _, _ := syscall.Syscall( - unk.VTable().Release, - 1, - uintptr(unsafe.Pointer(unk)), - 0, - 0) - return int32(ret) -} diff --git a/vendor/github.com/go-ole/go-ole/ole.go b/vendor/github.com/go-ole/go-ole/ole.go deleted file mode 100644 index e2ae4f4bbfeb..000000000000 --- a/vendor/github.com/go-ole/go-ole/ole.go +++ /dev/null @@ -1,157 +0,0 @@ -package ole - -import ( - "fmt" - "strings" -) - -// DISPPARAMS are the arguments that passed to methods or property. -type DISPPARAMS struct { - rgvarg uintptr - rgdispidNamedArgs uintptr - cArgs uint32 - cNamedArgs uint32 -} - -// EXCEPINFO defines exception info. -type EXCEPINFO struct { - wCode uint16 - wReserved uint16 - bstrSource *uint16 - bstrDescription *uint16 - bstrHelpFile *uint16 - dwHelpContext uint32 - pvReserved uintptr - pfnDeferredFillIn uintptr - scode uint32 -} - -// WCode return wCode in EXCEPINFO. -func (e EXCEPINFO) WCode() uint16 { - return e.wCode -} - -// SCODE return scode in EXCEPINFO. -func (e EXCEPINFO) SCODE() uint32 { - return e.scode -} - -// String convert EXCEPINFO to string. -func (e EXCEPINFO) String() string { - var src, desc, hlp string - if e.bstrSource == nil { - src = "" - } else { - src = BstrToString(e.bstrSource) - } - - if e.bstrDescription == nil { - desc = "" - } else { - desc = BstrToString(e.bstrDescription) - } - - if e.bstrHelpFile == nil { - hlp = "" - } else { - hlp = BstrToString(e.bstrHelpFile) - } - - return fmt.Sprintf( - "wCode: %#x, bstrSource: %v, bstrDescription: %v, bstrHelpFile: %v, dwHelpContext: %#x, scode: %#x", - e.wCode, src, desc, hlp, e.dwHelpContext, e.scode, - ) -} - -// Error implements error interface and returns error string. -func (e EXCEPINFO) Error() string { - if e.bstrDescription != nil { - return strings.TrimSpace(BstrToString(e.bstrDescription)) - } - - src := "Unknown" - if e.bstrSource != nil { - src = BstrToString(e.bstrSource) - } - - code := e.scode - if e.wCode != 0 { - code = uint32(e.wCode) - } - - return fmt.Sprintf("%v: %#x", src, code) -} - -// PARAMDATA defines parameter data type. -type PARAMDATA struct { - Name *int16 - Vt uint16 -} - -// METHODDATA defines method info. -type METHODDATA struct { - Name *uint16 - Data *PARAMDATA - Dispid int32 - Meth uint32 - CC int32 - CArgs uint32 - Flags uint16 - VtReturn uint32 -} - -// INTERFACEDATA defines interface info. -type INTERFACEDATA struct { - MethodData *METHODDATA - CMembers uint32 -} - -// Point is 2D vector type. -type Point struct { - X int32 - Y int32 -} - -// Msg is message between processes. -type Msg struct { - Hwnd uint32 - Message uint32 - Wparam int32 - Lparam int32 - Time uint32 - Pt Point -} - -// TYPEDESC defines data type. -type TYPEDESC struct { - Hreftype uint32 - VT uint16 -} - -// IDLDESC defines IDL info. -type IDLDESC struct { - DwReserved uint32 - WIDLFlags uint16 -} - -// TYPEATTR defines type info. -type TYPEATTR struct { - Guid GUID - Lcid uint32 - dwReserved uint32 - MemidConstructor int32 - MemidDestructor int32 - LpstrSchema *uint16 - CbSizeInstance uint32 - Typekind int32 - CFuncs uint16 - CVars uint16 - CImplTypes uint16 - CbSizeVft uint16 - CbAlignment uint16 - WTypeFlags uint16 - WMajorVerNum uint16 - WMinorVerNum uint16 - TdescAlias TYPEDESC - IdldescType IDLDESC -} diff --git a/vendor/github.com/go-ole/go-ole/oleutil/connection.go b/vendor/github.com/go-ole/go-ole/oleutil/connection.go deleted file mode 100644 index 60df73cda001..000000000000 --- a/vendor/github.com/go-ole/go-ole/oleutil/connection.go +++ /dev/null @@ -1,100 +0,0 @@ -// +build windows - -package oleutil - -import ( - "reflect" - "unsafe" - - ole "github.com/go-ole/go-ole" -) - -type stdDispatch struct { - lpVtbl *stdDispatchVtbl - ref int32 - iid *ole.GUID - iface interface{} - funcMap map[string]int32 -} - -type stdDispatchVtbl struct { - pQueryInterface uintptr - pAddRef uintptr - pRelease uintptr - pGetTypeInfoCount uintptr - pGetTypeInfo uintptr - pGetIDsOfNames uintptr - pInvoke uintptr -} - -func dispQueryInterface(this *ole.IUnknown, iid *ole.GUID, punk **ole.IUnknown) uint32 { - pthis := (*stdDispatch)(unsafe.Pointer(this)) - *punk = nil - if ole.IsEqualGUID(iid, ole.IID_IUnknown) || - ole.IsEqualGUID(iid, ole.IID_IDispatch) { - dispAddRef(this) - *punk = this - return ole.S_OK - } - if ole.IsEqualGUID(iid, pthis.iid) { - dispAddRef(this) - *punk = this - return ole.S_OK - } - return ole.E_NOINTERFACE -} - -func dispAddRef(this *ole.IUnknown) int32 { - pthis := (*stdDispatch)(unsafe.Pointer(this)) - pthis.ref++ - return pthis.ref -} - -func dispRelease(this *ole.IUnknown) int32 { - pthis := (*stdDispatch)(unsafe.Pointer(this)) - pthis.ref-- - return pthis.ref -} - -func dispGetIDsOfNames(this *ole.IUnknown, iid *ole.GUID, wnames []*uint16, namelen int, lcid int, pdisp []int32) uintptr { - pthis := (*stdDispatch)(unsafe.Pointer(this)) - names := make([]string, len(wnames)) - for i := 0; i < len(names); i++ { - names[i] = ole.LpOleStrToString(wnames[i]) - } - for n := 0; n < namelen; n++ { - if id, ok := pthis.funcMap[names[n]]; ok { - pdisp[n] = id - } - } - return ole.S_OK -} - -func dispGetTypeInfoCount(pcount *int) uintptr { - if pcount != nil { - *pcount = 0 - } - return ole.S_OK -} - -func dispGetTypeInfo(ptypeif *uintptr) uintptr { - return ole.E_NOTIMPL -} - -func dispInvoke(this *ole.IDispatch, dispid int32, riid *ole.GUID, lcid int, flags int16, dispparams *ole.DISPPARAMS, result *ole.VARIANT, pexcepinfo *ole.EXCEPINFO, nerr *uint) uintptr { - pthis := (*stdDispatch)(unsafe.Pointer(this)) - found := "" - for name, id := range pthis.funcMap { - if id == dispid { - found = name - } - } - if found != "" { - rv := reflect.ValueOf(pthis.iface).Elem() - rm := rv.MethodByName(found) - rr := rm.Call([]reflect.Value{}) - println(len(rr)) - return ole.S_OK - } - return ole.E_NOTIMPL -} diff --git a/vendor/github.com/go-ole/go-ole/oleutil/connection_func.go b/vendor/github.com/go-ole/go-ole/oleutil/connection_func.go deleted file mode 100644 index 8818fb8275ad..000000000000 --- a/vendor/github.com/go-ole/go-ole/oleutil/connection_func.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build !windows - -package oleutil - -import ole "github.com/go-ole/go-ole" - -// ConnectObject creates a connection point between two services for communication. -func ConnectObject(disp *ole.IDispatch, iid *ole.GUID, idisp interface{}) (uint32, error) { - return 0, ole.NewError(ole.E_NOTIMPL) -} diff --git a/vendor/github.com/go-ole/go-ole/oleutil/connection_windows.go b/vendor/github.com/go-ole/go-ole/oleutil/connection_windows.go deleted file mode 100644 index ab9c0d8dcbd4..000000000000 --- a/vendor/github.com/go-ole/go-ole/oleutil/connection_windows.go +++ /dev/null @@ -1,58 +0,0 @@ -// +build windows - -package oleutil - -import ( - "reflect" - "syscall" - "unsafe" - - ole "github.com/go-ole/go-ole" -) - -// ConnectObject creates a connection point between two services for communication. -func ConnectObject(disp *ole.IDispatch, iid *ole.GUID, idisp interface{}) (cookie uint32, err error) { - unknown, err := disp.QueryInterface(ole.IID_IConnectionPointContainer) - if err != nil { - return - } - - container := (*ole.IConnectionPointContainer)(unsafe.Pointer(unknown)) - var point *ole.IConnectionPoint - err = container.FindConnectionPoint(iid, &point) - if err != nil { - return - } - if edisp, ok := idisp.(*ole.IUnknown); ok { - cookie, err = point.Advise(edisp) - container.Release() - if err != nil { - return - } - } - rv := reflect.ValueOf(disp).Elem() - if rv.Type().Kind() == reflect.Struct { - dest := &stdDispatch{} - dest.lpVtbl = &stdDispatchVtbl{} - dest.lpVtbl.pQueryInterface = syscall.NewCallback(dispQueryInterface) - dest.lpVtbl.pAddRef = syscall.NewCallback(dispAddRef) - dest.lpVtbl.pRelease = syscall.NewCallback(dispRelease) - dest.lpVtbl.pGetTypeInfoCount = syscall.NewCallback(dispGetTypeInfoCount) - dest.lpVtbl.pGetTypeInfo = syscall.NewCallback(dispGetTypeInfo) - dest.lpVtbl.pGetIDsOfNames = syscall.NewCallback(dispGetIDsOfNames) - dest.lpVtbl.pInvoke = syscall.NewCallback(dispInvoke) - dest.iface = disp - dest.iid = iid - cookie, err = point.Advise((*ole.IUnknown)(unsafe.Pointer(dest))) - container.Release() - if err != nil { - point.Release() - return - } - return - } - - container.Release() - - return 0, ole.NewError(ole.E_INVALIDARG) -} diff --git a/vendor/github.com/go-ole/go-ole/oleutil/go-get.go b/vendor/github.com/go-ole/go-ole/oleutil/go-get.go deleted file mode 100644 index 58347628f24c..000000000000 --- a/vendor/github.com/go-ole/go-ole/oleutil/go-get.go +++ /dev/null @@ -1,6 +0,0 @@ -// This file is here so go get succeeds as without it errors with: -// no buildable Go source files in ... -// -// +build !windows - -package oleutil diff --git a/vendor/github.com/go-ole/go-ole/oleutil/oleutil.go b/vendor/github.com/go-ole/go-ole/oleutil/oleutil.go deleted file mode 100644 index f7803c1e30f2..000000000000 --- a/vendor/github.com/go-ole/go-ole/oleutil/oleutil.go +++ /dev/null @@ -1,127 +0,0 @@ -package oleutil - -import ole "github.com/go-ole/go-ole" - -// ClassIDFrom retrieves class ID whether given is program ID or application string. -func ClassIDFrom(programID string) (classID *ole.GUID, err error) { - return ole.ClassIDFrom(programID) -} - -// CreateObject creates object from programID based on interface type. -// -// Only supports IUnknown. -// -// Program ID can be either program ID or application string. -func CreateObject(programID string) (unknown *ole.IUnknown, err error) { - classID, err := ole.ClassIDFrom(programID) - if err != nil { - return - } - - unknown, err = ole.CreateInstance(classID, ole.IID_IUnknown) - if err != nil { - return - } - - return -} - -// GetActiveObject retrieves active object for program ID and interface ID based -// on interface type. -// -// Only supports IUnknown. -// -// Program ID can be either program ID or application string. -func GetActiveObject(programID string) (unknown *ole.IUnknown, err error) { - classID, err := ole.ClassIDFrom(programID) - if err != nil { - return - } - - unknown, err = ole.GetActiveObject(classID, ole.IID_IUnknown) - if err != nil { - return - } - - return -} - -// CallMethod calls method on IDispatch with parameters. -func CallMethod(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) { - return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_METHOD, params) -} - -// MustCallMethod calls method on IDispatch with parameters or panics. -func MustCallMethod(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) { - r, err := CallMethod(disp, name, params...) - if err != nil { - panic(err.Error()) - } - return r -} - -// GetProperty retrieves property from IDispatch. -func GetProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) { - return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_PROPERTYGET, params) -} - -// MustGetProperty retrieves property from IDispatch or panics. -func MustGetProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) { - r, err := GetProperty(disp, name, params...) - if err != nil { - panic(err.Error()) - } - return r -} - -// PutProperty mutates property. -func PutProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) { - return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_PROPERTYPUT, params) -} - -// MustPutProperty mutates property or panics. -func MustPutProperty(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) { - r, err := PutProperty(disp, name, params...) - if err != nil { - panic(err.Error()) - } - return r -} - -// PutPropertyRef mutates property reference. -func PutPropertyRef(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT, err error) { - return disp.InvokeWithOptionalArgs(name, ole.DISPATCH_PROPERTYPUTREF, params) -} - -// MustPutPropertyRef mutates property reference or panics. -func MustPutPropertyRef(disp *ole.IDispatch, name string, params ...interface{}) (result *ole.VARIANT) { - r, err := PutPropertyRef(disp, name, params...) - if err != nil { - panic(err.Error()) - } - return r -} - -func ForEach(disp *ole.IDispatch, f func(v *ole.VARIANT) error) error { - newEnum, err := disp.GetProperty("_NewEnum") - if err != nil { - return err - } - defer newEnum.Clear() - - enum, err := newEnum.ToIUnknown().IEnumVARIANT(ole.IID_IEnumVariant) - if err != nil { - return err - } - defer enum.Release() - - for item, length, err := enum.Next(1); length > 0; item, length, err = enum.Next(1) { - if err != nil { - return err - } - if ferr := f(&item); ferr != nil { - return ferr - } - } - return nil -} diff --git a/vendor/github.com/go-ole/go-ole/safearray.go b/vendor/github.com/go-ole/go-ole/safearray.go deleted file mode 100644 index a5201b56c3d9..000000000000 --- a/vendor/github.com/go-ole/go-ole/safearray.go +++ /dev/null @@ -1,27 +0,0 @@ -// Package is meant to retrieve and process safe array data returned from COM. - -package ole - -// SafeArrayBound defines the SafeArray boundaries. -type SafeArrayBound struct { - Elements uint32 - LowerBound int32 -} - -// SafeArray is how COM handles arrays. -type SafeArray struct { - Dimensions uint16 - FeaturesFlag uint16 - ElementsSize uint32 - LocksAmount uint32 - Data uint32 - Bounds [16]byte -} - -// SAFEARRAY is obsolete, exists for backwards compatibility. -// Use SafeArray -type SAFEARRAY SafeArray - -// SAFEARRAYBOUND is obsolete, exists for backwards compatibility. -// Use SafeArrayBound -type SAFEARRAYBOUND SafeArrayBound diff --git a/vendor/github.com/go-ole/go-ole/safearray_func.go b/vendor/github.com/go-ole/go-ole/safearray_func.go deleted file mode 100644 index 8ff0baa41ddd..000000000000 --- a/vendor/github.com/go-ole/go-ole/safearray_func.go +++ /dev/null @@ -1,211 +0,0 @@ -// +build !windows - -package ole - -import ( - "unsafe" -) - -// safeArrayAccessData returns raw array pointer. -// -// AKA: SafeArrayAccessData in Windows API. -func safeArrayAccessData(safearray *SafeArray) (uintptr, error) { - return uintptr(0), NewError(E_NOTIMPL) -} - -// safeArrayUnaccessData releases raw array. -// -// AKA: SafeArrayUnaccessData in Windows API. -func safeArrayUnaccessData(safearray *SafeArray) error { - return NewError(E_NOTIMPL) -} - -// safeArrayAllocData allocates SafeArray. -// -// AKA: SafeArrayAllocData in Windows API. -func safeArrayAllocData(safearray *SafeArray) error { - return NewError(E_NOTIMPL) -} - -// safeArrayAllocDescriptor allocates SafeArray. -// -// AKA: SafeArrayAllocDescriptor in Windows API. -func safeArrayAllocDescriptor(dimensions uint32) (*SafeArray, error) { - return nil, NewError(E_NOTIMPL) -} - -// safeArrayAllocDescriptorEx allocates SafeArray. -// -// AKA: SafeArrayAllocDescriptorEx in Windows API. -func safeArrayAllocDescriptorEx(variantType VT, dimensions uint32) (*SafeArray, error) { - return nil, NewError(E_NOTIMPL) -} - -// safeArrayCopy returns copy of SafeArray. -// -// AKA: SafeArrayCopy in Windows API. -func safeArrayCopy(original *SafeArray) (*SafeArray, error) { - return nil, NewError(E_NOTIMPL) -} - -// safeArrayCopyData duplicates SafeArray into another SafeArray object. -// -// AKA: SafeArrayCopyData in Windows API. -func safeArrayCopyData(original *SafeArray, duplicate *SafeArray) error { - return NewError(E_NOTIMPL) -} - -// safeArrayCreate creates SafeArray. -// -// AKA: SafeArrayCreate in Windows API. -func safeArrayCreate(variantType VT, dimensions uint32, bounds *SafeArrayBound) (*SafeArray, error) { - return nil, NewError(E_NOTIMPL) -} - -// safeArrayCreateEx creates SafeArray. -// -// AKA: SafeArrayCreateEx in Windows API. -func safeArrayCreateEx(variantType VT, dimensions uint32, bounds *SafeArrayBound, extra uintptr) (*SafeArray, error) { - return nil, NewError(E_NOTIMPL) -} - -// safeArrayCreateVector creates SafeArray. -// -// AKA: SafeArrayCreateVector in Windows API. -func safeArrayCreateVector(variantType VT, lowerBound int32, length uint32) (*SafeArray, error) { - return nil, NewError(E_NOTIMPL) -} - -// safeArrayCreateVectorEx creates SafeArray. -// -// AKA: SafeArrayCreateVectorEx in Windows API. -func safeArrayCreateVectorEx(variantType VT, lowerBound int32, length uint32, extra uintptr) (*SafeArray, error) { - return nil, NewError(E_NOTIMPL) -} - -// safeArrayDestroy destroys SafeArray object. -// -// AKA: SafeArrayDestroy in Windows API. -func safeArrayDestroy(safearray *SafeArray) error { - return NewError(E_NOTIMPL) -} - -// safeArrayDestroyData destroys SafeArray object. -// -// AKA: SafeArrayDestroyData in Windows API. -func safeArrayDestroyData(safearray *SafeArray) error { - return NewError(E_NOTIMPL) -} - -// safeArrayDestroyDescriptor destroys SafeArray object. -// -// AKA: SafeArrayDestroyDescriptor in Windows API. -func safeArrayDestroyDescriptor(safearray *SafeArray) error { - return NewError(E_NOTIMPL) -} - -// safeArrayGetDim is the amount of dimensions in the SafeArray. -// -// SafeArrays may have multiple dimensions. Meaning, it could be -// multidimensional array. -// -// AKA: SafeArrayGetDim in Windows API. -func safeArrayGetDim(safearray *SafeArray) (*uint32, error) { - u := uint32(0) - return &u, NewError(E_NOTIMPL) -} - -// safeArrayGetElementSize is the element size in bytes. -// -// AKA: SafeArrayGetElemsize in Windows API. -func safeArrayGetElementSize(safearray *SafeArray) (*uint32, error) { - u := uint32(0) - return &u, NewError(E_NOTIMPL) -} - -// safeArrayGetElement retrieves element at given index. -func safeArrayGetElement(safearray *SafeArray, index int64, pv unsafe.Pointer) error { - return NewError(E_NOTIMPL) -} - -// safeArrayGetElement retrieves element at given index and converts to string. -func safeArrayGetElementString(safearray *SafeArray, index int64) (string, error) { - return "", NewError(E_NOTIMPL) -} - -// safeArrayGetIID is the InterfaceID of the elements in the SafeArray. -// -// AKA: SafeArrayGetIID in Windows API. -func safeArrayGetIID(safearray *SafeArray) (*GUID, error) { - return nil, NewError(E_NOTIMPL) -} - -// safeArrayGetLBound returns lower bounds of SafeArray. -// -// SafeArrays may have multiple dimensions. Meaning, it could be -// multidimensional array. -// -// AKA: SafeArrayGetLBound in Windows API. -func safeArrayGetLBound(safearray *SafeArray, dimension uint32) (int64, error) { - return int64(0), NewError(E_NOTIMPL) -} - -// safeArrayGetUBound returns upper bounds of SafeArray. -// -// SafeArrays may have multiple dimensions. Meaning, it could be -// multidimensional array. -// -// AKA: SafeArrayGetUBound in Windows API. -func safeArrayGetUBound(safearray *SafeArray, dimension uint32) (int64, error) { - return int64(0), NewError(E_NOTIMPL) -} - -// safeArrayGetVartype returns data type of SafeArray. -// -// AKA: SafeArrayGetVartype in Windows API. -func safeArrayGetVartype(safearray *SafeArray) (uint16, error) { - return uint16(0), NewError(E_NOTIMPL) -} - -// safeArrayLock locks SafeArray for reading to modify SafeArray. -// -// This must be called during some calls to ensure that another process does not -// read or write to the SafeArray during editing. -// -// AKA: SafeArrayLock in Windows API. -func safeArrayLock(safearray *SafeArray) error { - return NewError(E_NOTIMPL) -} - -// safeArrayUnlock unlocks SafeArray for reading. -// -// AKA: SafeArrayUnlock in Windows API. -func safeArrayUnlock(safearray *SafeArray) error { - return NewError(E_NOTIMPL) -} - -// safeArrayPutElement stores the data element at the specified location in the -// array. -// -// AKA: SafeArrayPutElement in Windows API. -func safeArrayPutElement(safearray *SafeArray, index int64, element uintptr) error { - return NewError(E_NOTIMPL) -} - -// safeArrayGetRecordInfo accesses IRecordInfo info for custom types. -// -// AKA: SafeArrayGetRecordInfo in Windows API. -// -// XXX: Must implement IRecordInfo interface for this to return. -func safeArrayGetRecordInfo(safearray *SafeArray) (interface{}, error) { - return nil, NewError(E_NOTIMPL) -} - -// safeArraySetRecordInfo mutates IRecordInfo info for custom types. -// -// AKA: SafeArraySetRecordInfo in Windows API. -// -// XXX: Must implement IRecordInfo interface for this to return. -func safeArraySetRecordInfo(safearray *SafeArray, recordInfo interface{}) error { - return NewError(E_NOTIMPL) -} diff --git a/vendor/github.com/go-ole/go-ole/safearray_windows.go b/vendor/github.com/go-ole/go-ole/safearray_windows.go deleted file mode 100644 index b27936e24ed0..000000000000 --- a/vendor/github.com/go-ole/go-ole/safearray_windows.go +++ /dev/null @@ -1,337 +0,0 @@ -// +build windows - -package ole - -import ( - "unsafe" -) - -var ( - procSafeArrayAccessData, _ = modoleaut32.FindProc("SafeArrayAccessData") - procSafeArrayAllocData, _ = modoleaut32.FindProc("SafeArrayAllocData") - procSafeArrayAllocDescriptor, _ = modoleaut32.FindProc("SafeArrayAllocDescriptor") - procSafeArrayAllocDescriptorEx, _ = modoleaut32.FindProc("SafeArrayAllocDescriptorEx") - procSafeArrayCopy, _ = modoleaut32.FindProc("SafeArrayCopy") - procSafeArrayCopyData, _ = modoleaut32.FindProc("SafeArrayCopyData") - procSafeArrayCreate, _ = modoleaut32.FindProc("SafeArrayCreate") - procSafeArrayCreateEx, _ = modoleaut32.FindProc("SafeArrayCreateEx") - procSafeArrayCreateVector, _ = modoleaut32.FindProc("SafeArrayCreateVector") - procSafeArrayCreateVectorEx, _ = modoleaut32.FindProc("SafeArrayCreateVectorEx") - procSafeArrayDestroy, _ = modoleaut32.FindProc("SafeArrayDestroy") - procSafeArrayDestroyData, _ = modoleaut32.FindProc("SafeArrayDestroyData") - procSafeArrayDestroyDescriptor, _ = modoleaut32.FindProc("SafeArrayDestroyDescriptor") - procSafeArrayGetDim, _ = modoleaut32.FindProc("SafeArrayGetDim") - procSafeArrayGetElement, _ = modoleaut32.FindProc("SafeArrayGetElement") - procSafeArrayGetElemsize, _ = modoleaut32.FindProc("SafeArrayGetElemsize") - procSafeArrayGetIID, _ = modoleaut32.FindProc("SafeArrayGetIID") - procSafeArrayGetLBound, _ = modoleaut32.FindProc("SafeArrayGetLBound") - procSafeArrayGetUBound, _ = modoleaut32.FindProc("SafeArrayGetUBound") - procSafeArrayGetVartype, _ = modoleaut32.FindProc("SafeArrayGetVartype") - procSafeArrayLock, _ = modoleaut32.FindProc("SafeArrayLock") - procSafeArrayPtrOfIndex, _ = modoleaut32.FindProc("SafeArrayPtrOfIndex") - procSafeArrayUnaccessData, _ = modoleaut32.FindProc("SafeArrayUnaccessData") - procSafeArrayUnlock, _ = modoleaut32.FindProc("SafeArrayUnlock") - procSafeArrayPutElement, _ = modoleaut32.FindProc("SafeArrayPutElement") - //procSafeArrayRedim, _ = modoleaut32.FindProc("SafeArrayRedim") // TODO - //procSafeArraySetIID, _ = modoleaut32.FindProc("SafeArraySetIID") // TODO - procSafeArrayGetRecordInfo, _ = modoleaut32.FindProc("SafeArrayGetRecordInfo") - procSafeArraySetRecordInfo, _ = modoleaut32.FindProc("SafeArraySetRecordInfo") -) - -// safeArrayAccessData returns raw array pointer. -// -// AKA: SafeArrayAccessData in Windows API. -// Todo: Test -func safeArrayAccessData(safearray *SafeArray) (element uintptr, err error) { - err = convertHresultToError( - procSafeArrayAccessData.Call( - uintptr(unsafe.Pointer(safearray)), - uintptr(unsafe.Pointer(&element)))) - return -} - -// safeArrayUnaccessData releases raw array. -// -// AKA: SafeArrayUnaccessData in Windows API. -func safeArrayUnaccessData(safearray *SafeArray) (err error) { - err = convertHresultToError(procSafeArrayUnaccessData.Call(uintptr(unsafe.Pointer(safearray)))) - return -} - -// safeArrayAllocData allocates SafeArray. -// -// AKA: SafeArrayAllocData in Windows API. -func safeArrayAllocData(safearray *SafeArray) (err error) { - err = convertHresultToError(procSafeArrayAllocData.Call(uintptr(unsafe.Pointer(safearray)))) - return -} - -// safeArrayAllocDescriptor allocates SafeArray. -// -// AKA: SafeArrayAllocDescriptor in Windows API. -func safeArrayAllocDescriptor(dimensions uint32) (safearray *SafeArray, err error) { - err = convertHresultToError( - procSafeArrayAllocDescriptor.Call(uintptr(dimensions), uintptr(unsafe.Pointer(&safearray)))) - return -} - -// safeArrayAllocDescriptorEx allocates SafeArray. -// -// AKA: SafeArrayAllocDescriptorEx in Windows API. -func safeArrayAllocDescriptorEx(variantType VT, dimensions uint32) (safearray *SafeArray, err error) { - err = convertHresultToError( - procSafeArrayAllocDescriptorEx.Call( - uintptr(variantType), - uintptr(dimensions), - uintptr(unsafe.Pointer(&safearray)))) - return -} - -// safeArrayCopy returns copy of SafeArray. -// -// AKA: SafeArrayCopy in Windows API. -func safeArrayCopy(original *SafeArray) (safearray *SafeArray, err error) { - err = convertHresultToError( - procSafeArrayCopy.Call( - uintptr(unsafe.Pointer(original)), - uintptr(unsafe.Pointer(&safearray)))) - return -} - -// safeArrayCopyData duplicates SafeArray into another SafeArray object. -// -// AKA: SafeArrayCopyData in Windows API. -func safeArrayCopyData(original *SafeArray, duplicate *SafeArray) (err error) { - err = convertHresultToError( - procSafeArrayCopyData.Call( - uintptr(unsafe.Pointer(original)), - uintptr(unsafe.Pointer(duplicate)))) - return -} - -// safeArrayCreate creates SafeArray. -// -// AKA: SafeArrayCreate in Windows API. -func safeArrayCreate(variantType VT, dimensions uint32, bounds *SafeArrayBound) (safearray *SafeArray, err error) { - sa, _, err := procSafeArrayCreate.Call( - uintptr(variantType), - uintptr(dimensions), - uintptr(unsafe.Pointer(bounds))) - safearray = (*SafeArray)(unsafe.Pointer(&sa)) - return -} - -// safeArrayCreateEx creates SafeArray. -// -// AKA: SafeArrayCreateEx in Windows API. -func safeArrayCreateEx(variantType VT, dimensions uint32, bounds *SafeArrayBound, extra uintptr) (safearray *SafeArray, err error) { - sa, _, err := procSafeArrayCreateEx.Call( - uintptr(variantType), - uintptr(dimensions), - uintptr(unsafe.Pointer(bounds)), - extra) - safearray = (*SafeArray)(unsafe.Pointer(sa)) - return -} - -// safeArrayCreateVector creates SafeArray. -// -// AKA: SafeArrayCreateVector in Windows API. -func safeArrayCreateVector(variantType VT, lowerBound int32, length uint32) (safearray *SafeArray, err error) { - sa, _, err := procSafeArrayCreateVector.Call( - uintptr(variantType), - uintptr(lowerBound), - uintptr(length)) - safearray = (*SafeArray)(unsafe.Pointer(sa)) - return -} - -// safeArrayCreateVectorEx creates SafeArray. -// -// AKA: SafeArrayCreateVectorEx in Windows API. -func safeArrayCreateVectorEx(variantType VT, lowerBound int32, length uint32, extra uintptr) (safearray *SafeArray, err error) { - sa, _, err := procSafeArrayCreateVectorEx.Call( - uintptr(variantType), - uintptr(lowerBound), - uintptr(length), - extra) - safearray = (*SafeArray)(unsafe.Pointer(sa)) - return -} - -// safeArrayDestroy destroys SafeArray object. -// -// AKA: SafeArrayDestroy in Windows API. -func safeArrayDestroy(safearray *SafeArray) (err error) { - err = convertHresultToError(procSafeArrayDestroy.Call(uintptr(unsafe.Pointer(safearray)))) - return -} - -// safeArrayDestroyData destroys SafeArray object. -// -// AKA: SafeArrayDestroyData in Windows API. -func safeArrayDestroyData(safearray *SafeArray) (err error) { - err = convertHresultToError(procSafeArrayDestroyData.Call(uintptr(unsafe.Pointer(safearray)))) - return -} - -// safeArrayDestroyDescriptor destroys SafeArray object. -// -// AKA: SafeArrayDestroyDescriptor in Windows API. -func safeArrayDestroyDescriptor(safearray *SafeArray) (err error) { - err = convertHresultToError(procSafeArrayDestroyDescriptor.Call(uintptr(unsafe.Pointer(safearray)))) - return -} - -// safeArrayGetDim is the amount of dimensions in the SafeArray. -// -// SafeArrays may have multiple dimensions. Meaning, it could be -// multidimensional array. -// -// AKA: SafeArrayGetDim in Windows API. -func safeArrayGetDim(safearray *SafeArray) (dimensions *uint32, err error) { - l, _, err := procSafeArrayGetDim.Call(uintptr(unsafe.Pointer(safearray))) - dimensions = (*uint32)(unsafe.Pointer(l)) - return -} - -// safeArrayGetElementSize is the element size in bytes. -// -// AKA: SafeArrayGetElemsize in Windows API. -func safeArrayGetElementSize(safearray *SafeArray) (length *uint32, err error) { - l, _, err := procSafeArrayGetElemsize.Call(uintptr(unsafe.Pointer(safearray))) - length = (*uint32)(unsafe.Pointer(l)) - return -} - -// safeArrayGetElement retrieves element at given index. -func safeArrayGetElement(safearray *SafeArray, index int64, pv unsafe.Pointer) error { - return convertHresultToError( - procSafeArrayGetElement.Call( - uintptr(unsafe.Pointer(safearray)), - uintptr(unsafe.Pointer(&index)), - uintptr(pv))) -} - -// safeArrayGetElementString retrieves element at given index and converts to string. -func safeArrayGetElementString(safearray *SafeArray, index int64) (str string, err error) { - var element *int16 - err = convertHresultToError( - procSafeArrayGetElement.Call( - uintptr(unsafe.Pointer(safearray)), - uintptr(unsafe.Pointer(&index)), - uintptr(unsafe.Pointer(&element)))) - str = BstrToString(*(**uint16)(unsafe.Pointer(&element))) - SysFreeString(element) - return -} - -// safeArrayGetIID is the InterfaceID of the elements in the SafeArray. -// -// AKA: SafeArrayGetIID in Windows API. -func safeArrayGetIID(safearray *SafeArray) (guid *GUID, err error) { - err = convertHresultToError( - procSafeArrayGetIID.Call( - uintptr(unsafe.Pointer(safearray)), - uintptr(unsafe.Pointer(&guid)))) - return -} - -// safeArrayGetLBound returns lower bounds of SafeArray. -// -// SafeArrays may have multiple dimensions. Meaning, it could be -// multidimensional array. -// -// AKA: SafeArrayGetLBound in Windows API. -func safeArrayGetLBound(safearray *SafeArray, dimension uint32) (lowerBound int64, err error) { - err = convertHresultToError( - procSafeArrayGetLBound.Call( - uintptr(unsafe.Pointer(safearray)), - uintptr(dimension), - uintptr(unsafe.Pointer(&lowerBound)))) - return -} - -// safeArrayGetUBound returns upper bounds of SafeArray. -// -// SafeArrays may have multiple dimensions. Meaning, it could be -// multidimensional array. -// -// AKA: SafeArrayGetUBound in Windows API. -func safeArrayGetUBound(safearray *SafeArray, dimension uint32) (upperBound int64, err error) { - err = convertHresultToError( - procSafeArrayGetUBound.Call( - uintptr(unsafe.Pointer(safearray)), - uintptr(dimension), - uintptr(unsafe.Pointer(&upperBound)))) - return -} - -// safeArrayGetVartype returns data type of SafeArray. -// -// AKA: SafeArrayGetVartype in Windows API. -func safeArrayGetVartype(safearray *SafeArray) (varType uint16, err error) { - err = convertHresultToError( - procSafeArrayGetVartype.Call( - uintptr(unsafe.Pointer(safearray)), - uintptr(unsafe.Pointer(&varType)))) - return -} - -// safeArrayLock locks SafeArray for reading to modify SafeArray. -// -// This must be called during some calls to ensure that another process does not -// read or write to the SafeArray during editing. -// -// AKA: SafeArrayLock in Windows API. -func safeArrayLock(safearray *SafeArray) (err error) { - err = convertHresultToError(procSafeArrayLock.Call(uintptr(unsafe.Pointer(safearray)))) - return -} - -// safeArrayUnlock unlocks SafeArray for reading. -// -// AKA: SafeArrayUnlock in Windows API. -func safeArrayUnlock(safearray *SafeArray) (err error) { - err = convertHresultToError(procSafeArrayUnlock.Call(uintptr(unsafe.Pointer(safearray)))) - return -} - -// safeArrayPutElement stores the data element at the specified location in the -// array. -// -// AKA: SafeArrayPutElement in Windows API. -func safeArrayPutElement(safearray *SafeArray, index int64, element uintptr) (err error) { - err = convertHresultToError( - procSafeArrayPutElement.Call( - uintptr(unsafe.Pointer(safearray)), - uintptr(unsafe.Pointer(&index)), - uintptr(unsafe.Pointer(element)))) - return -} - -// safeArrayGetRecordInfo accesses IRecordInfo info for custom types. -// -// AKA: SafeArrayGetRecordInfo in Windows API. -// -// XXX: Must implement IRecordInfo interface for this to return. -func safeArrayGetRecordInfo(safearray *SafeArray) (recordInfo interface{}, err error) { - err = convertHresultToError( - procSafeArrayGetRecordInfo.Call( - uintptr(unsafe.Pointer(safearray)), - uintptr(unsafe.Pointer(&recordInfo)))) - return -} - -// safeArraySetRecordInfo mutates IRecordInfo info for custom types. -// -// AKA: SafeArraySetRecordInfo in Windows API. -// -// XXX: Must implement IRecordInfo interface for this to return. -func safeArraySetRecordInfo(safearray *SafeArray, recordInfo interface{}) (err error) { - err = convertHresultToError( - procSafeArraySetRecordInfo.Call( - uintptr(unsafe.Pointer(safearray)), - uintptr(unsafe.Pointer(&recordInfo)))) - return -} diff --git a/vendor/github.com/go-ole/go-ole/safearrayconversion.go b/vendor/github.com/go-ole/go-ole/safearrayconversion.go deleted file mode 100644 index ffeb2b97b020..000000000000 --- a/vendor/github.com/go-ole/go-ole/safearrayconversion.go +++ /dev/null @@ -1,140 +0,0 @@ -// Helper for converting SafeArray to array of objects. - -package ole - -import ( - "unsafe" -) - -type SafeArrayConversion struct { - Array *SafeArray -} - -func (sac *SafeArrayConversion) ToStringArray() (strings []string) { - totalElements, _ := sac.TotalElements(0) - strings = make([]string, totalElements) - - for i := int64(0); i < totalElements; i++ { - strings[int32(i)], _ = safeArrayGetElementString(sac.Array, i) - } - - return -} - -func (sac *SafeArrayConversion) ToByteArray() (bytes []byte) { - totalElements, _ := sac.TotalElements(0) - bytes = make([]byte, totalElements) - - for i := int64(0); i < totalElements; i++ { - safeArrayGetElement(sac.Array, i, unsafe.Pointer(&bytes[int32(i)])) - } - - return -} - -func (sac *SafeArrayConversion) ToValueArray() (values []interface{}) { - totalElements, _ := sac.TotalElements(0) - values = make([]interface{}, totalElements) - vt, _ := safeArrayGetVartype(sac.Array) - - for i := 0; i < int(totalElements); i++ { - switch VT(vt) { - case VT_BOOL: - var v bool - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) - values[i] = v - case VT_I1: - var v int8 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) - values[i] = v - case VT_I2: - var v int16 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) - values[i] = v - case VT_I4: - var v int32 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) - values[i] = v - case VT_I8: - var v int64 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) - values[i] = v - case VT_UI1: - var v uint8 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) - values[i] = v - case VT_UI2: - var v uint16 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) - values[i] = v - case VT_UI4: - var v uint32 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) - values[i] = v - case VT_UI8: - var v uint64 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) - values[i] = v - case VT_R4: - var v float32 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) - values[i] = v - case VT_R8: - var v float64 - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) - values[i] = v - case VT_BSTR: - var v string - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) - values[i] = v - case VT_VARIANT: - var v VARIANT - safeArrayGetElement(sac.Array, int64(i), unsafe.Pointer(&v)) - values[i] = v.Value() - default: - // TODO - } - } - - return -} - -func (sac *SafeArrayConversion) GetType() (varType uint16, err error) { - return safeArrayGetVartype(sac.Array) -} - -func (sac *SafeArrayConversion) GetDimensions() (dimensions *uint32, err error) { - return safeArrayGetDim(sac.Array) -} - -func (sac *SafeArrayConversion) GetSize() (length *uint32, err error) { - return safeArrayGetElementSize(sac.Array) -} - -func (sac *SafeArrayConversion) TotalElements(index uint32) (totalElements int64, err error) { - if index < 1 { - index = 1 - } - - // Get array bounds - var LowerBounds int64 - var UpperBounds int64 - - LowerBounds, err = safeArrayGetLBound(sac.Array, index) - if err != nil { - return - } - - UpperBounds, err = safeArrayGetUBound(sac.Array, index) - if err != nil { - return - } - - totalElements = UpperBounds - LowerBounds + 1 - return -} - -// Release Safe Array memory -func (sac *SafeArrayConversion) Release() { - safeArrayDestroy(sac.Array) -} diff --git a/vendor/github.com/go-ole/go-ole/safearrayslices.go b/vendor/github.com/go-ole/go-ole/safearrayslices.go deleted file mode 100644 index a9fa885f1d81..000000000000 --- a/vendor/github.com/go-ole/go-ole/safearrayslices.go +++ /dev/null @@ -1,33 +0,0 @@ -// +build windows - -package ole - -import ( - "unsafe" -) - -func safeArrayFromByteSlice(slice []byte) *SafeArray { - array, _ := safeArrayCreateVector(VT_UI1, 0, uint32(len(slice))) - - if array == nil { - panic("Could not convert []byte to SAFEARRAY") - } - - for i, v := range slice { - safeArrayPutElement(array, int64(i), uintptr(unsafe.Pointer(&v))) - } - return array -} - -func safeArrayFromStringSlice(slice []string) *SafeArray { - array, _ := safeArrayCreateVector(VT_BSTR, 0, uint32(len(slice))) - - if array == nil { - panic("Could not convert []string to SAFEARRAY") - } - // SysAllocStringLen(s) - for i, v := range slice { - safeArrayPutElement(array, int64(i), uintptr(unsafe.Pointer(SysAllocStringLen(v)))) - } - return array -} diff --git a/vendor/github.com/go-ole/go-ole/utility.go b/vendor/github.com/go-ole/go-ole/utility.go deleted file mode 100644 index 99ee82dc3451..000000000000 --- a/vendor/github.com/go-ole/go-ole/utility.go +++ /dev/null @@ -1,101 +0,0 @@ -package ole - -import ( - "unicode/utf16" - "unsafe" -) - -// ClassIDFrom retrieves class ID whether given is program ID or application string. -// -// Helper that provides check against both Class ID from Program ID and Class ID from string. It is -// faster, if you know which you are using, to use the individual functions, but this will check -// against available functions for you. -func ClassIDFrom(programID string) (classID *GUID, err error) { - classID, err = CLSIDFromProgID(programID) - if err != nil { - classID, err = CLSIDFromString(programID) - if err != nil { - return - } - } - return -} - -// BytePtrToString converts byte pointer to a Go string. -func BytePtrToString(p *byte) string { - a := (*[10000]uint8)(unsafe.Pointer(p)) - i := 0 - for a[i] != 0 { - i++ - } - return string(a[:i]) -} - -// UTF16PtrToString is alias for LpOleStrToString. -// -// Kept for compatibility reasons. -func UTF16PtrToString(p *uint16) string { - return LpOleStrToString(p) -} - -// LpOleStrToString converts COM Unicode to Go string. -func LpOleStrToString(p *uint16) string { - if p == nil { - return "" - } - - length := lpOleStrLen(p) - a := make([]uint16, length) - - ptr := unsafe.Pointer(p) - - for i := 0; i < int(length); i++ { - a[i] = *(*uint16)(ptr) - ptr = unsafe.Pointer(uintptr(ptr) + 2) - } - - return string(utf16.Decode(a)) -} - -// BstrToString converts COM binary string to Go string. -func BstrToString(p *uint16) string { - if p == nil { - return "" - } - length := SysStringLen((*int16)(unsafe.Pointer(p))) - a := make([]uint16, length) - - ptr := unsafe.Pointer(p) - - for i := 0; i < int(length); i++ { - a[i] = *(*uint16)(ptr) - ptr = unsafe.Pointer(uintptr(ptr) + 2) - } - return string(utf16.Decode(a)) -} - -// lpOleStrLen returns the length of Unicode string. -func lpOleStrLen(p *uint16) (length int64) { - if p == nil { - return 0 - } - - ptr := unsafe.Pointer(p) - - for i := 0; ; i++ { - if 0 == *(*uint16)(ptr) { - length = int64(i) - break - } - ptr = unsafe.Pointer(uintptr(ptr) + 2) - } - return -} - -// convertHresultToError converts syscall to error, if call is unsuccessful. -func convertHresultToError(hr uintptr, r2 uintptr, ignore error) (err error) { - if hr != 0 { - err = NewError(hr) - } - return -} diff --git a/vendor/github.com/go-ole/go-ole/variables.go b/vendor/github.com/go-ole/go-ole/variables.go deleted file mode 100644 index ebe00f1cfc9b..000000000000 --- a/vendor/github.com/go-ole/go-ole/variables.go +++ /dev/null @@ -1,16 +0,0 @@ -// +build windows - -package ole - -import ( - "syscall" -) - -var ( - modcombase = syscall.NewLazyDLL("combase.dll") - modkernel32, _ = syscall.LoadDLL("kernel32.dll") - modole32, _ = syscall.LoadDLL("ole32.dll") - modoleaut32, _ = syscall.LoadDLL("oleaut32.dll") - modmsvcrt, _ = syscall.LoadDLL("msvcrt.dll") - moduser32, _ = syscall.LoadDLL("user32.dll") -) diff --git a/vendor/github.com/go-ole/go-ole/variant.go b/vendor/github.com/go-ole/go-ole/variant.go deleted file mode 100644 index 36969725eba4..000000000000 --- a/vendor/github.com/go-ole/go-ole/variant.go +++ /dev/null @@ -1,105 +0,0 @@ -package ole - -import "unsafe" - -// NewVariant returns new variant based on type and value. -func NewVariant(vt VT, val int64) VARIANT { - return VARIANT{VT: vt, Val: val} -} - -// ToIUnknown converts Variant to Unknown object. -func (v *VARIANT) ToIUnknown() *IUnknown { - if v.VT != VT_UNKNOWN { - return nil - } - return (*IUnknown)(unsafe.Pointer(uintptr(v.Val))) -} - -// ToIDispatch converts variant to dispatch object. -func (v *VARIANT) ToIDispatch() *IDispatch { - if v.VT != VT_DISPATCH { - return nil - } - return (*IDispatch)(unsafe.Pointer(uintptr(v.Val))) -} - -// ToArray converts variant to SafeArray helper. -func (v *VARIANT) ToArray() *SafeArrayConversion { - if v.VT != VT_SAFEARRAY { - if v.VT&VT_ARRAY == 0 { - return nil - } - } - var safeArray *SafeArray = (*SafeArray)(unsafe.Pointer(uintptr(v.Val))) - return &SafeArrayConversion{safeArray} -} - -// ToString converts variant to Go string. -func (v *VARIANT) ToString() string { - if v.VT != VT_BSTR { - return "" - } - return BstrToString(*(**uint16)(unsafe.Pointer(&v.Val))) -} - -// Clear the memory of variant object. -func (v *VARIANT) Clear() error { - return VariantClear(v) -} - -// Value returns variant value based on its type. -// -// Currently supported types: 2- and 4-byte integers, strings, bools. -// Note that 64-bit integers, datetimes, and other types are stored as strings -// and will be returned as strings. -// -// Needs to be further converted, because this returns an interface{}. -func (v *VARIANT) Value() interface{} { - switch v.VT { - case VT_I1: - return int8(v.Val) - case VT_UI1: - return uint8(v.Val) - case VT_I2: - return int16(v.Val) - case VT_UI2: - return uint16(v.Val) - case VT_I4: - return int32(v.Val) - case VT_UI4: - return uint32(v.Val) - case VT_I8: - return int64(v.Val) - case VT_UI8: - return uint64(v.Val) - case VT_INT: - return int(v.Val) - case VT_UINT: - return uint(v.Val) - case VT_INT_PTR: - return uintptr(v.Val) // TODO - case VT_UINT_PTR: - return uintptr(v.Val) - case VT_R4: - return *(*float32)(unsafe.Pointer(&v.Val)) - case VT_R8: - return *(*float64)(unsafe.Pointer(&v.Val)) - case VT_BSTR: - return v.ToString() - case VT_DATE: - // VT_DATE type will either return float64 or time.Time. - d := float64(v.Val) - date, err := GetVariantDate(d) - if err != nil { - return d - } - return date - case VT_UNKNOWN: - return v.ToIUnknown() - case VT_DISPATCH: - return v.ToIDispatch() - case VT_BOOL: - return v.Val != 0 - } - return nil -} diff --git a/vendor/github.com/go-ole/go-ole/variant_386.go b/vendor/github.com/go-ole/go-ole/variant_386.go deleted file mode 100644 index e73736bf3917..000000000000 --- a/vendor/github.com/go-ole/go-ole/variant_386.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build 386 - -package ole - -type VARIANT struct { - VT VT // 2 - wReserved1 uint16 // 4 - wReserved2 uint16 // 6 - wReserved3 uint16 // 8 - Val int64 // 16 -} diff --git a/vendor/github.com/go-ole/go-ole/variant_amd64.go b/vendor/github.com/go-ole/go-ole/variant_amd64.go deleted file mode 100644 index dccdde132333..000000000000 --- a/vendor/github.com/go-ole/go-ole/variant_amd64.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build amd64 - -package ole - -type VARIANT struct { - VT VT // 2 - wReserved1 uint16 // 4 - wReserved2 uint16 // 6 - wReserved3 uint16 // 8 - Val int64 // 16 - _ [8]byte // 24 -} diff --git a/vendor/github.com/go-ole/go-ole/variant_s390x.go b/vendor/github.com/go-ole/go-ole/variant_s390x.go deleted file mode 100644 index 9874ca66b4f5..000000000000 --- a/vendor/github.com/go-ole/go-ole/variant_s390x.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build s390x - -package ole - -type VARIANT struct { - VT VT // 2 - wReserved1 uint16 // 4 - wReserved2 uint16 // 6 - wReserved3 uint16 // 8 - Val int64 // 16 - _ [8]byte // 24 -} diff --git a/vendor/github.com/go-ole/go-ole/vt_string.go b/vendor/github.com/go-ole/go-ole/vt_string.go deleted file mode 100644 index 729b4a04dd9d..000000000000 --- a/vendor/github.com/go-ole/go-ole/vt_string.go +++ /dev/null @@ -1,58 +0,0 @@ -// generated by stringer -output vt_string.go -type VT; DO NOT EDIT - -package ole - -import "fmt" - -const ( - _VT_name_0 = "VT_EMPTYVT_NULLVT_I2VT_I4VT_R4VT_R8VT_CYVT_DATEVT_BSTRVT_DISPATCHVT_ERRORVT_BOOLVT_VARIANTVT_UNKNOWNVT_DECIMAL" - _VT_name_1 = "VT_I1VT_UI1VT_UI2VT_UI4VT_I8VT_UI8VT_INTVT_UINTVT_VOIDVT_HRESULTVT_PTRVT_SAFEARRAYVT_CARRAYVT_USERDEFINEDVT_LPSTRVT_LPWSTR" - _VT_name_2 = "VT_RECORDVT_INT_PTRVT_UINT_PTR" - _VT_name_3 = "VT_FILETIMEVT_BLOBVT_STREAMVT_STORAGEVT_STREAMED_OBJECTVT_STORED_OBJECTVT_BLOB_OBJECTVT_CFVT_CLSID" - _VT_name_4 = "VT_BSTR_BLOBVT_VECTOR" - _VT_name_5 = "VT_ARRAY" - _VT_name_6 = "VT_BYREF" - _VT_name_7 = "VT_RESERVED" - _VT_name_8 = "VT_ILLEGAL" -) - -var ( - _VT_index_0 = [...]uint8{0, 8, 15, 20, 25, 30, 35, 40, 47, 54, 65, 73, 80, 90, 100, 110} - _VT_index_1 = [...]uint8{0, 5, 11, 17, 23, 28, 34, 40, 47, 54, 64, 70, 82, 91, 105, 113, 122} - _VT_index_2 = [...]uint8{0, 9, 19, 30} - _VT_index_3 = [...]uint8{0, 11, 18, 27, 37, 55, 71, 85, 90, 98} - _VT_index_4 = [...]uint8{0, 12, 21} - _VT_index_5 = [...]uint8{0, 8} - _VT_index_6 = [...]uint8{0, 8} - _VT_index_7 = [...]uint8{0, 11} - _VT_index_8 = [...]uint8{0, 10} -) - -func (i VT) String() string { - switch { - case 0 <= i && i <= 14: - return _VT_name_0[_VT_index_0[i]:_VT_index_0[i+1]] - case 16 <= i && i <= 31: - i -= 16 - return _VT_name_1[_VT_index_1[i]:_VT_index_1[i+1]] - case 36 <= i && i <= 38: - i -= 36 - return _VT_name_2[_VT_index_2[i]:_VT_index_2[i+1]] - case 64 <= i && i <= 72: - i -= 64 - return _VT_name_3[_VT_index_3[i]:_VT_index_3[i+1]] - case 4095 <= i && i <= 4096: - i -= 4095 - return _VT_name_4[_VT_index_4[i]:_VT_index_4[i+1]] - case i == 8192: - return _VT_name_5 - case i == 16384: - return _VT_name_6 - case i == 32768: - return _VT_name_7 - case i == 65535: - return _VT_name_8 - default: - return fmt.Sprintf("VT(%d)", i) - } -} diff --git a/vendor/github.com/go-ole/go-ole/winrt.go b/vendor/github.com/go-ole/go-ole/winrt.go deleted file mode 100644 index 4e9eca73244e..000000000000 --- a/vendor/github.com/go-ole/go-ole/winrt.go +++ /dev/null @@ -1,99 +0,0 @@ -// +build windows - -package ole - -import ( - "reflect" - "syscall" - "unicode/utf8" - "unsafe" -) - -var ( - procRoInitialize = modcombase.NewProc("RoInitialize") - procRoActivateInstance = modcombase.NewProc("RoActivateInstance") - procRoGetActivationFactory = modcombase.NewProc("RoGetActivationFactory") - procWindowsCreateString = modcombase.NewProc("WindowsCreateString") - procWindowsDeleteString = modcombase.NewProc("WindowsDeleteString") - procWindowsGetStringRawBuffer = modcombase.NewProc("WindowsGetStringRawBuffer") -) - -func RoInitialize(thread_type uint32) (err error) { - hr, _, _ := procRoInitialize.Call(uintptr(thread_type)) - if hr != 0 { - err = NewError(hr) - } - return -} - -func RoActivateInstance(clsid string) (ins *IInspectable, err error) { - hClsid, err := NewHString(clsid) - if err != nil { - return nil, err - } - defer DeleteHString(hClsid) - - hr, _, _ := procRoActivateInstance.Call( - uintptr(unsafe.Pointer(hClsid)), - uintptr(unsafe.Pointer(&ins))) - if hr != 0 { - err = NewError(hr) - } - return -} - -func RoGetActivationFactory(clsid string, iid *GUID) (ins *IInspectable, err error) { - hClsid, err := NewHString(clsid) - if err != nil { - return nil, err - } - defer DeleteHString(hClsid) - - hr, _, _ := procRoGetActivationFactory.Call( - uintptr(unsafe.Pointer(hClsid)), - uintptr(unsafe.Pointer(iid)), - uintptr(unsafe.Pointer(&ins))) - if hr != 0 { - err = NewError(hr) - } - return -} - -// HString is handle string for pointers. -type HString uintptr - -// NewHString returns a new HString for Go string. -func NewHString(s string) (hstring HString, err error) { - u16 := syscall.StringToUTF16Ptr(s) - len := uint32(utf8.RuneCountInString(s)) - hr, _, _ := procWindowsCreateString.Call( - uintptr(unsafe.Pointer(u16)), - uintptr(len), - uintptr(unsafe.Pointer(&hstring))) - if hr != 0 { - err = NewError(hr) - } - return -} - -// DeleteHString deletes HString. -func DeleteHString(hstring HString) (err error) { - hr, _, _ := procWindowsDeleteString.Call(uintptr(hstring)) - if hr != 0 { - err = NewError(hr) - } - return -} - -// String returns Go string value of HString. -func (h HString) String() string { - var u16buf uintptr - var u16len uint32 - u16buf, _, _ = procWindowsGetStringRawBuffer.Call( - uintptr(h), - uintptr(unsafe.Pointer(&u16len))) - - u16hdr := reflect.SliceHeader{Data: u16buf, Len: int(u16len), Cap: int(u16len)} - u16 := *(*[]uint16)(unsafe.Pointer(&u16hdr)) - return syscall.UTF16ToString(u16) -} diff --git a/vendor/github.com/go-ole/go-ole/winrt_doc.go b/vendor/github.com/go-ole/go-ole/winrt_doc.go deleted file mode 100644 index 52e6d74c9ab3..000000000000 --- a/vendor/github.com/go-ole/go-ole/winrt_doc.go +++ /dev/null @@ -1,36 +0,0 @@ -// +build !windows - -package ole - -// RoInitialize -func RoInitialize(thread_type uint32) (err error) { - return NewError(E_NOTIMPL) -} - -// RoActivateInstance -func RoActivateInstance(clsid string) (ins *IInspectable, err error) { - return nil, NewError(E_NOTIMPL) -} - -// RoGetActivationFactory -func RoGetActivationFactory(clsid string, iid *GUID) (ins *IInspectable, err error) { - return nil, NewError(E_NOTIMPL) -} - -// HString is handle string for pointers. -type HString uintptr - -// NewHString returns a new HString for Go string. -func NewHString(s string) (hstring HString, err error) { - return HString(uintptr(0)), NewError(E_NOTIMPL) -} - -// DeleteHString deletes HString. -func DeleteHString(hstring HString) (err error) { - return NewError(E_NOTIMPL) -} - -// String returns Go string value of HString. -func (h HString) String() string { - return "" -} diff --git a/vendor/github.com/go-stack/stack/LICENSE.md b/vendor/github.com/go-stack/stack/LICENSE.md deleted file mode 100644 index 2abf98ea835e..000000000000 --- a/vendor/github.com/go-stack/stack/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Chris Hines - -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/go-stack/stack/README.md b/vendor/github.com/go-stack/stack/README.md deleted file mode 100644 index f11ccccaa430..000000000000 --- a/vendor/github.com/go-stack/stack/README.md +++ /dev/null @@ -1,38 +0,0 @@ -[![GoDoc](https://godoc.org/github.com/go-stack/stack?status.svg)](https://godoc.org/github.com/go-stack/stack) -[![Go Report Card](https://goreportcard.com/badge/go-stack/stack)](https://goreportcard.com/report/go-stack/stack) -[![TravisCI](https://travis-ci.org/go-stack/stack.svg?branch=master)](https://travis-ci.org/go-stack/stack) -[![Coverage Status](https://coveralls.io/repos/github/go-stack/stack/badge.svg?branch=master)](https://coveralls.io/github/go-stack/stack?branch=master) - -# stack - -Package stack implements utilities to capture, manipulate, and format call -stacks. It provides a simpler API than package runtime. - -The implementation takes care of the minutia and special cases of interpreting -the program counter (pc) values returned by runtime.Callers. - -## Versioning - -Package stack publishes releases via [semver](http://semver.org/) compatible Git -tags prefixed with a single 'v'. The master branch always contains the latest -release. The develop branch contains unreleased commits. - -## Formatting - -Package stack's types implement fmt.Formatter, which provides a simple and -flexible way to declaratively configure formatting when used with logging or -error tracking packages. - -```go -func DoTheThing() { - c := stack.Caller(0) - log.Print(c) // "source.go:10" - log.Printf("%+v", c) // "pkg/path/source.go:10" - log.Printf("%n", c) // "DoTheThing" - - s := stack.Trace().TrimRuntime() - log.Print(s) // "[source.go:15 caller.go:42 main.go:14]" -} -``` - -See the docs for all of the supported formatting options. diff --git a/vendor/github.com/go-stack/stack/stack.go b/vendor/github.com/go-stack/stack/stack.go deleted file mode 100644 index 8033c4013afb..000000000000 --- a/vendor/github.com/go-stack/stack/stack.go +++ /dev/null @@ -1,322 +0,0 @@ -// Package stack implements utilities to capture, manipulate, and format call -// stacks. It provides a simpler API than package runtime. -// -// The implementation takes care of the minutia and special cases of -// interpreting the program counter (pc) values returned by runtime.Callers. -// -// Package stack's types implement fmt.Formatter, which provides a simple and -// flexible way to declaratively configure formatting when used with logging -// or error tracking packages. -package stack - -import ( - "bytes" - "errors" - "fmt" - "io" - "runtime" - "strconv" - "strings" -) - -// Call records a single function invocation from a goroutine stack. -type Call struct { - fn *runtime.Func - pc uintptr -} - -// Caller returns a Call from the stack of the current goroutine. The argument -// skip is the number of stack frames to ascend, with 0 identifying the -// calling function. -func Caller(skip int) Call { - var pcs [2]uintptr - n := runtime.Callers(skip+1, pcs[:]) - - var c Call - - if n < 2 { - return c - } - - c.pc = pcs[1] - if runtime.FuncForPC(pcs[0]).Name() != "runtime.sigpanic" { - c.pc-- - } - c.fn = runtime.FuncForPC(c.pc) - return c -} - -// String implements fmt.Stinger. It is equivalent to fmt.Sprintf("%v", c). -func (c Call) String() string { - return fmt.Sprint(c) -} - -// MarshalText implements encoding.TextMarshaler. It formats the Call the same -// as fmt.Sprintf("%v", c). -func (c Call) MarshalText() ([]byte, error) { - if c.fn == nil { - return nil, ErrNoFunc - } - buf := bytes.Buffer{} - fmt.Fprint(&buf, c) - return buf.Bytes(), nil -} - -// ErrNoFunc means that the Call has a nil *runtime.Func. The most likely -// cause is a Call with the zero value. -var ErrNoFunc = errors.New("no call stack information") - -// Format implements fmt.Formatter with support for the following verbs. -// -// %s source file -// %d line number -// %n function name -// %v equivalent to %s:%d -// -// It accepts the '+' and '#' flags for most of the verbs as follows. -// -// %+s path of source file relative to the compile time GOPATH -// %#s full path of source file -// %+n import path qualified function name -// %+v equivalent to %+s:%d -// %#v equivalent to %#s:%d -func (c Call) Format(s fmt.State, verb rune) { - if c.fn == nil { - fmt.Fprintf(s, "%%!%c(NOFUNC)", verb) - return - } - - switch verb { - case 's', 'v': - file, line := c.fn.FileLine(c.pc) - switch { - case s.Flag('#'): - // done - case s.Flag('+'): - file = file[pkgIndex(file, c.fn.Name()):] - default: - const sep = "/" - if i := strings.LastIndex(file, sep); i != -1 { - file = file[i+len(sep):] - } - } - io.WriteString(s, file) - if verb == 'v' { - buf := [7]byte{':'} - s.Write(strconv.AppendInt(buf[:1], int64(line), 10)) - } - - case 'd': - _, line := c.fn.FileLine(c.pc) - buf := [6]byte{} - s.Write(strconv.AppendInt(buf[:0], int64(line), 10)) - - case 'n': - name := c.fn.Name() - if !s.Flag('+') { - const pathSep = "/" - if i := strings.LastIndex(name, pathSep); i != -1 { - name = name[i+len(pathSep):] - } - const pkgSep = "." - if i := strings.Index(name, pkgSep); i != -1 { - name = name[i+len(pkgSep):] - } - } - io.WriteString(s, name) - } -} - -// PC returns the program counter for this call frame; multiple frames may -// have the same PC value. -func (c Call) PC() uintptr { - return c.pc -} - -// name returns the import path qualified name of the function containing the -// call. -func (c Call) name() string { - if c.fn == nil { - return "???" - } - return c.fn.Name() -} - -func (c Call) file() string { - if c.fn == nil { - return "???" - } - file, _ := c.fn.FileLine(c.pc) - return file -} - -func (c Call) line() int { - if c.fn == nil { - return 0 - } - _, line := c.fn.FileLine(c.pc) - return line -} - -// CallStack records a sequence of function invocations from a goroutine -// stack. -type CallStack []Call - -// String implements fmt.Stinger. It is equivalent to fmt.Sprintf("%v", cs). -func (cs CallStack) String() string { - return fmt.Sprint(cs) -} - -var ( - openBracketBytes = []byte("[") - closeBracketBytes = []byte("]") - spaceBytes = []byte(" ") -) - -// MarshalText implements encoding.TextMarshaler. It formats the CallStack the -// same as fmt.Sprintf("%v", cs). -func (cs CallStack) MarshalText() ([]byte, error) { - buf := bytes.Buffer{} - buf.Write(openBracketBytes) - for i, pc := range cs { - if pc.fn == nil { - return nil, ErrNoFunc - } - if i > 0 { - buf.Write(spaceBytes) - } - fmt.Fprint(&buf, pc) - } - buf.Write(closeBracketBytes) - return buf.Bytes(), nil -} - -// Format implements fmt.Formatter by printing the CallStack as square brackets -// ([, ]) surrounding a space separated list of Calls each formatted with the -// supplied verb and options. -func (cs CallStack) Format(s fmt.State, verb rune) { - s.Write(openBracketBytes) - for i, pc := range cs { - if i > 0 { - s.Write(spaceBytes) - } - pc.Format(s, verb) - } - s.Write(closeBracketBytes) -} - -// Trace returns a CallStack for the current goroutine with element 0 -// identifying the calling function. -func Trace() CallStack { - var pcs [512]uintptr - n := runtime.Callers(2, pcs[:]) - cs := make([]Call, n) - - for i, pc := range pcs[:n] { - pcFix := pc - if i > 0 && cs[i-1].fn.Name() != "runtime.sigpanic" { - pcFix-- - } - cs[i] = Call{ - fn: runtime.FuncForPC(pcFix), - pc: pcFix, - } - } - - return cs -} - -// TrimBelow returns a slice of the CallStack with all entries below c -// removed. -func (cs CallStack) TrimBelow(c Call) CallStack { - for len(cs) > 0 && cs[0].pc != c.pc { - cs = cs[1:] - } - return cs -} - -// TrimAbove returns a slice of the CallStack with all entries above c -// removed. -func (cs CallStack) TrimAbove(c Call) CallStack { - for len(cs) > 0 && cs[len(cs)-1].pc != c.pc { - cs = cs[:len(cs)-1] - } - return cs -} - -// pkgIndex returns the index that results in file[index:] being the path of -// file relative to the compile time GOPATH, and file[:index] being the -// $GOPATH/src/ portion of file. funcName must be the name of a function in -// file as returned by runtime.Func.Name. -func pkgIndex(file, funcName string) int { - // As of Go 1.6.2 there is no direct way to know the compile time GOPATH - // at runtime, but we can infer the number of path segments in the GOPATH. - // We note that runtime.Func.Name() returns the function name qualified by - // the import path, which does not include the GOPATH. Thus we can trim - // segments from the beginning of the file path until the number of path - // separators remaining is one more than the number of path separators in - // the function name. For example, given: - // - // GOPATH /home/user - // file /home/user/src/pkg/sub/file.go - // fn.Name() pkg/sub.Type.Method - // - // We want to produce: - // - // file[:idx] == /home/user/src/ - // file[idx:] == pkg/sub/file.go - // - // From this we can easily see that fn.Name() has one less path separator - // than our desired result for file[idx:]. We count separators from the - // end of the file path until it finds two more than in the function name - // and then move one character forward to preserve the initial path - // segment without a leading separator. - const sep = "/" - i := len(file) - for n := strings.Count(funcName, sep) + 2; n > 0; n-- { - i = strings.LastIndex(file[:i], sep) - if i == -1 { - i = -len(sep) - break - } - } - // get back to 0 or trim the leading separator - return i + len(sep) -} - -var runtimePath string - -func init() { - var pcs [1]uintptr - runtime.Callers(0, pcs[:]) - fn := runtime.FuncForPC(pcs[0]) - file, _ := fn.FileLine(pcs[0]) - - idx := pkgIndex(file, fn.Name()) - - runtimePath = file[:idx] - if runtime.GOOS == "windows" { - runtimePath = strings.ToLower(runtimePath) - } -} - -func inGoroot(c Call) bool { - file := c.file() - if len(file) == 0 || file[0] == '?' { - return true - } - if runtime.GOOS == "windows" { - file = strings.ToLower(file) - } - return strings.HasPrefix(file, runtimePath) || strings.HasSuffix(file, "/_testmain.go") -} - -// TrimRuntime returns a slice of the CallStack with the topmost entries from -// the go runtime removed. It considers any calls originating from unknown -// files, files under GOROOT, or _testmain.go as part of the runtime. -func (cs CallStack) TrimRuntime() CallStack { - for len(cs) > 0 && inGoroot(cs[len(cs)-1]) { - cs = cs[:len(cs)-1] - } - return cs -} diff --git a/vendor/github.com/golang/protobuf/LICENSE b/vendor/github.com/golang/protobuf/LICENSE deleted file mode 100644 index 1b1b1921efa6..000000000000 --- a/vendor/github.com/golang/protobuf/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -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 deleted file mode 100644 index e2e0651a934d..000000000000 --- a/vendor/github.com/golang/protobuf/proto/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -# 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 deleted file mode 100644 index e392575b353a..000000000000 --- a/vendor/github.com/golang/protobuf/proto/clone.go +++ /dev/null @@ -1,229 +0,0 @@ -// 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 deleted file mode 100644 index aa207298f997..000000000000 --- a/vendor/github.com/golang/protobuf/proto/decode.go +++ /dev/null @@ -1,970 +0,0 @@ -// 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 deleted file mode 100644 index 8b84d1b22d4c..000000000000 --- a/vendor/github.com/golang/protobuf/proto/encode.go +++ /dev/null @@ -1,1362 +0,0 @@ -// 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 deleted file mode 100644 index 2ed1cf596664..000000000000 --- a/vendor/github.com/golang/protobuf/proto/equal.go +++ /dev/null @@ -1,300 +0,0 @@ -// 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 deleted file mode 100644 index eaad21831263..000000000000 --- a/vendor/github.com/golang/protobuf/proto/extensions.go +++ /dev/null @@ -1,587 +0,0 @@ -// 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 deleted file mode 100644 index 1c225504a013..000000000000 --- a/vendor/github.com/golang/protobuf/proto/lib.go +++ /dev/null @@ -1,897 +0,0 @@ -// 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 deleted file mode 100644 index fd982decd66e..000000000000 --- a/vendor/github.com/golang/protobuf/proto/message_set.go +++ /dev/null @@ -1,311 +0,0 @@ -// 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 deleted file mode 100644 index fb512e2e16dc..000000000000 --- a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go +++ /dev/null @@ -1,484 +0,0 @@ -// 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 deleted file mode 100644 index 6b5567d47cd3..000000000000 --- a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go +++ /dev/null @@ -1,270 +0,0 @@ -// 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 deleted file mode 100644 index ec2289c0058e..000000000000 --- a/vendor/github.com/golang/protobuf/proto/properties.go +++ /dev/null @@ -1,872 +0,0 @@ -// 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 deleted file mode 100644 index 965876bf033b..000000000000 --- a/vendor/github.com/golang/protobuf/proto/text.go +++ /dev/null @@ -1,854 +0,0 @@ -// 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 deleted file mode 100644 index 5e14513f28c9..000000000000 --- a/vendor/github.com/golang/protobuf/proto/text_parser.go +++ /dev/null @@ -1,895 +0,0 @@ -// 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 deleted file mode 100644 index 41a2d04d0144..000000000000 --- a/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# 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 deleted file mode 100644 index 63cf2c80aade..000000000000 --- a/vendor/github.com/golang/protobuf/protoc-gen-go/descriptor/descriptor.pb.go +++ /dev/null @@ -1,2152 +0,0 @@ -// 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/golang/snappy/AUTHORS b/vendor/github.com/golang/snappy/AUTHORS deleted file mode 100644 index bcfa19520af9..000000000000 --- a/vendor/github.com/golang/snappy/AUTHORS +++ /dev/null @@ -1,15 +0,0 @@ -# This is the official list of Snappy-Go authors for copyright purposes. -# This file is distinct from the CONTRIBUTORS files. -# See the latter for an explanation. - -# Names should be added to this file as -# Name or Organization -# The email address is not required for organizations. - -# Please keep the list sorted. - -Damian Gryski -Google Inc. -Jan Mercl <0xjnml@gmail.com> -Rodolfo Carvalho -Sebastien Binet diff --git a/vendor/github.com/golang/snappy/CONTRIBUTORS b/vendor/github.com/golang/snappy/CONTRIBUTORS deleted file mode 100644 index 931ae31606f8..000000000000 --- a/vendor/github.com/golang/snappy/CONTRIBUTORS +++ /dev/null @@ -1,37 +0,0 @@ -# This is the official list of people who can contribute -# (and typically have contributed) code to the Snappy-Go repository. -# The AUTHORS file lists the copyright holders; this file -# lists people. For example, Google employees are listed here -# but not in AUTHORS, because Google holds the copyright. -# -# The submission process automatically checks to make sure -# that people submitting code are listed in this file (by email address). -# -# Names should be added to this file only after verifying that -# the individual or the individual's organization has agreed to -# the appropriate Contributor License Agreement, found here: -# -# http://code.google.com/legal/individual-cla-v1.0.html -# http://code.google.com/legal/corporate-cla-v1.0.html -# -# The agreement for individuals can be filled out on the web. -# -# When adding J Random Contributor's name to this file, -# either J's name or J's organization's name should be -# added to the AUTHORS file, depending on whether the -# individual or corporate CLA was used. - -# Names should be added to this file like so: -# Name - -# Please keep the list sorted. - -Damian Gryski -Jan Mercl <0xjnml@gmail.com> -Kai Backman -Marc-Antoine Ruel -Nigel Tao -Rob Pike -Rodolfo Carvalho -Russ Cox -Sebastien Binet diff --git a/vendor/github.com/golang/snappy/LICENSE b/vendor/github.com/golang/snappy/LICENSE deleted file mode 100644 index 6050c10f4c8b..000000000000 --- a/vendor/github.com/golang/snappy/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2011 The Snappy-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. diff --git a/vendor/github.com/golang/snappy/README b/vendor/github.com/golang/snappy/README deleted file mode 100644 index cea12879a0ea..000000000000 --- a/vendor/github.com/golang/snappy/README +++ /dev/null @@ -1,107 +0,0 @@ -The Snappy compression format in the Go programming language. - -To download and install from source: -$ go get github.com/golang/snappy - -Unless otherwise noted, the Snappy-Go source files are distributed -under the BSD-style license found in the LICENSE file. - - - -Benchmarks. - -The golang/snappy benchmarks include compressing (Z) and decompressing (U) ten -or so files, the same set used by the C++ Snappy code (github.com/google/snappy -and note the "google", not "golang"). On an "Intel(R) Core(TM) i7-3770 CPU @ -3.40GHz", Go's GOARCH=amd64 numbers as of 2016-05-29: - -"go test -test.bench=." - -_UFlat0-8 2.19GB/s ± 0% html -_UFlat1-8 1.41GB/s ± 0% urls -_UFlat2-8 23.5GB/s ± 2% jpg -_UFlat3-8 1.91GB/s ± 0% jpg_200 -_UFlat4-8 14.0GB/s ± 1% pdf -_UFlat5-8 1.97GB/s ± 0% html4 -_UFlat6-8 814MB/s ± 0% txt1 -_UFlat7-8 785MB/s ± 0% txt2 -_UFlat8-8 857MB/s ± 0% txt3 -_UFlat9-8 719MB/s ± 1% txt4 -_UFlat10-8 2.84GB/s ± 0% pb -_UFlat11-8 1.05GB/s ± 0% gaviota - -_ZFlat0-8 1.04GB/s ± 0% html -_ZFlat1-8 534MB/s ± 0% urls -_ZFlat2-8 15.7GB/s ± 1% jpg -_ZFlat3-8 740MB/s ± 3% jpg_200 -_ZFlat4-8 9.20GB/s ± 1% pdf -_ZFlat5-8 991MB/s ± 0% html4 -_ZFlat6-8 379MB/s ± 0% txt1 -_ZFlat7-8 352MB/s ± 0% txt2 -_ZFlat8-8 396MB/s ± 1% txt3 -_ZFlat9-8 327MB/s ± 1% txt4 -_ZFlat10-8 1.33GB/s ± 1% pb -_ZFlat11-8 605MB/s ± 1% gaviota - - - -"go test -test.bench=. -tags=noasm" - -_UFlat0-8 621MB/s ± 2% html -_UFlat1-8 494MB/s ± 1% urls -_UFlat2-8 23.2GB/s ± 1% jpg -_UFlat3-8 1.12GB/s ± 1% jpg_200 -_UFlat4-8 4.35GB/s ± 1% pdf -_UFlat5-8 609MB/s ± 0% html4 -_UFlat6-8 296MB/s ± 0% txt1 -_UFlat7-8 288MB/s ± 0% txt2 -_UFlat8-8 309MB/s ± 1% txt3 -_UFlat9-8 280MB/s ± 1% txt4 -_UFlat10-8 753MB/s ± 0% pb -_UFlat11-8 400MB/s ± 0% gaviota - -_ZFlat0-8 409MB/s ± 1% html -_ZFlat1-8 250MB/s ± 1% urls -_ZFlat2-8 12.3GB/s ± 1% jpg -_ZFlat3-8 132MB/s ± 0% jpg_200 -_ZFlat4-8 2.92GB/s ± 0% pdf -_ZFlat5-8 405MB/s ± 1% html4 -_ZFlat6-8 179MB/s ± 1% txt1 -_ZFlat7-8 170MB/s ± 1% txt2 -_ZFlat8-8 189MB/s ± 1% txt3 -_ZFlat9-8 164MB/s ± 1% txt4 -_ZFlat10-8 479MB/s ± 1% pb -_ZFlat11-8 270MB/s ± 1% gaviota - - - -For comparison (Go's encoded output is byte-for-byte identical to C++'s), here -are the numbers from C++ Snappy's - -make CXXFLAGS="-O2 -DNDEBUG -g" clean snappy_unittest.log && cat snappy_unittest.log - -BM_UFlat/0 2.4GB/s html -BM_UFlat/1 1.4GB/s urls -BM_UFlat/2 21.8GB/s jpg -BM_UFlat/3 1.5GB/s jpg_200 -BM_UFlat/4 13.3GB/s pdf -BM_UFlat/5 2.1GB/s html4 -BM_UFlat/6 1.0GB/s txt1 -BM_UFlat/7 959.4MB/s txt2 -BM_UFlat/8 1.0GB/s txt3 -BM_UFlat/9 864.5MB/s txt4 -BM_UFlat/10 2.9GB/s pb -BM_UFlat/11 1.2GB/s gaviota - -BM_ZFlat/0 944.3MB/s html (22.31 %) -BM_ZFlat/1 501.6MB/s urls (47.78 %) -BM_ZFlat/2 14.3GB/s jpg (99.95 %) -BM_ZFlat/3 538.3MB/s jpg_200 (73.00 %) -BM_ZFlat/4 8.3GB/s pdf (83.30 %) -BM_ZFlat/5 903.5MB/s html4 (22.52 %) -BM_ZFlat/6 336.0MB/s txt1 (57.88 %) -BM_ZFlat/7 312.3MB/s txt2 (61.91 %) -BM_ZFlat/8 353.1MB/s txt3 (54.99 %) -BM_ZFlat/9 289.9MB/s txt4 (66.26 %) -BM_ZFlat/10 1.2GB/s pb (19.68 %) -BM_ZFlat/11 527.4MB/s gaviota (37.72 %) diff --git a/vendor/github.com/golang/snappy/decode.go b/vendor/github.com/golang/snappy/decode.go deleted file mode 100644 index 72efb0353ddf..000000000000 --- a/vendor/github.com/golang/snappy/decode.go +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright 2011 The Snappy-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 snappy - -import ( - "encoding/binary" - "errors" - "io" -) - -var ( - // ErrCorrupt reports that the input is invalid. - ErrCorrupt = errors.New("snappy: corrupt input") - // ErrTooLarge reports that the uncompressed length is too large. - ErrTooLarge = errors.New("snappy: decoded block is too large") - // ErrUnsupported reports that the input isn't supported. - ErrUnsupported = errors.New("snappy: unsupported input") - - errUnsupportedLiteralLength = errors.New("snappy: unsupported literal length") -) - -// DecodedLen returns the length of the decoded block. -func DecodedLen(src []byte) (int, error) { - v, _, err := decodedLen(src) - return v, err -} - -// decodedLen returns the length of the decoded block and the number of bytes -// that the length header occupied. -func decodedLen(src []byte) (blockLen, headerLen int, err error) { - v, n := binary.Uvarint(src) - if n <= 0 || v > 0xffffffff { - return 0, 0, ErrCorrupt - } - - const wordSize = 32 << (^uint(0) >> 32 & 1) - if wordSize == 32 && v > 0x7fffffff { - return 0, 0, ErrTooLarge - } - return int(v), n, nil -} - -const ( - decodeErrCodeCorrupt = 1 - decodeErrCodeUnsupportedLiteralLength = 2 -) - -// Decode returns the decoded form of src. The returned slice may be a sub- -// slice of dst if dst was large enough to hold the entire decoded block. -// Otherwise, a newly allocated slice will be returned. -// -// The dst and src must not overlap. It is valid to pass a nil dst. -func Decode(dst, src []byte) ([]byte, error) { - dLen, s, err := decodedLen(src) - if err != nil { - return nil, err - } - if dLen <= len(dst) { - dst = dst[:dLen] - } else { - dst = make([]byte, dLen) - } - switch decode(dst, src[s:]) { - case 0: - return dst, nil - case decodeErrCodeUnsupportedLiteralLength: - return nil, errUnsupportedLiteralLength - } - return nil, ErrCorrupt -} - -// NewReader returns a new Reader that decompresses from r, using the framing -// format described at -// https://github.com/google/snappy/blob/master/framing_format.txt -func NewReader(r io.Reader) *Reader { - return &Reader{ - r: r, - decoded: make([]byte, maxBlockSize), - buf: make([]byte, maxEncodedLenOfMaxBlockSize+checksumSize), - } -} - -// Reader is an io.Reader that can read Snappy-compressed bytes. -type Reader struct { - r io.Reader - err error - decoded []byte - buf []byte - // decoded[i:j] contains decoded bytes that have not yet been passed on. - i, j int - readHeader bool -} - -// Reset discards any buffered data, resets all state, and switches the Snappy -// reader to read from r. This permits reusing a Reader rather than allocating -// a new one. -func (r *Reader) Reset(reader io.Reader) { - r.r = reader - r.err = nil - r.i = 0 - r.j = 0 - r.readHeader = false -} - -func (r *Reader) readFull(p []byte, allowEOF bool) (ok bool) { - if _, r.err = io.ReadFull(r.r, p); r.err != nil { - if r.err == io.ErrUnexpectedEOF || (r.err == io.EOF && !allowEOF) { - r.err = ErrCorrupt - } - return false - } - return true -} - -// Read satisfies the io.Reader interface. -func (r *Reader) Read(p []byte) (int, error) { - if r.err != nil { - return 0, r.err - } - for { - if r.i < r.j { - n := copy(p, r.decoded[r.i:r.j]) - r.i += n - return n, nil - } - if !r.readFull(r.buf[:4], true) { - return 0, r.err - } - chunkType := r.buf[0] - if !r.readHeader { - if chunkType != chunkTypeStreamIdentifier { - r.err = ErrCorrupt - return 0, r.err - } - r.readHeader = true - } - chunkLen := int(r.buf[1]) | int(r.buf[2])<<8 | int(r.buf[3])<<16 - if chunkLen > len(r.buf) { - r.err = ErrUnsupported - return 0, r.err - } - - // The chunk types are specified at - // https://github.com/google/snappy/blob/master/framing_format.txt - switch chunkType { - case chunkTypeCompressedData: - // Section 4.2. Compressed data (chunk type 0x00). - if chunkLen < checksumSize { - r.err = ErrCorrupt - return 0, r.err - } - buf := r.buf[:chunkLen] - if !r.readFull(buf, false) { - return 0, r.err - } - checksum := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2])<<16 | uint32(buf[3])<<24 - buf = buf[checksumSize:] - - n, err := DecodedLen(buf) - if err != nil { - r.err = err - return 0, r.err - } - if n > len(r.decoded) { - r.err = ErrCorrupt - return 0, r.err - } - if _, err := Decode(r.decoded, buf); err != nil { - r.err = err - return 0, r.err - } - if crc(r.decoded[:n]) != checksum { - r.err = ErrCorrupt - return 0, r.err - } - r.i, r.j = 0, n - continue - - case chunkTypeUncompressedData: - // Section 4.3. Uncompressed data (chunk type 0x01). - if chunkLen < checksumSize { - r.err = ErrCorrupt - return 0, r.err - } - buf := r.buf[:checksumSize] - if !r.readFull(buf, false) { - return 0, r.err - } - checksum := uint32(buf[0]) | uint32(buf[1])<<8 | uint32(buf[2])<<16 | uint32(buf[3])<<24 - // Read directly into r.decoded instead of via r.buf. - n := chunkLen - checksumSize - if n > len(r.decoded) { - r.err = ErrCorrupt - return 0, r.err - } - if !r.readFull(r.decoded[:n], false) { - return 0, r.err - } - if crc(r.decoded[:n]) != checksum { - r.err = ErrCorrupt - return 0, r.err - } - r.i, r.j = 0, n - continue - - case chunkTypeStreamIdentifier: - // Section 4.1. Stream identifier (chunk type 0xff). - if chunkLen != len(magicBody) { - r.err = ErrCorrupt - return 0, r.err - } - if !r.readFull(r.buf[:len(magicBody)], false) { - return 0, r.err - } - for i := 0; i < len(magicBody); i++ { - if r.buf[i] != magicBody[i] { - r.err = ErrCorrupt - return 0, r.err - } - } - continue - } - - if chunkType <= 0x7f { - // Section 4.5. Reserved unskippable chunks (chunk types 0x02-0x7f). - r.err = ErrUnsupported - return 0, r.err - } - // Section 4.4 Padding (chunk type 0xfe). - // Section 4.6. Reserved skippable chunks (chunk types 0x80-0xfd). - if !r.readFull(r.buf[:chunkLen], false) { - return 0, r.err - } - } -} diff --git a/vendor/github.com/golang/snappy/decode_amd64.go b/vendor/github.com/golang/snappy/decode_amd64.go deleted file mode 100644 index fcd192b849ed..000000000000 --- a/vendor/github.com/golang/snappy/decode_amd64.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2016 The Snappy-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 !appengine -// +build gc -// +build !noasm - -package snappy - -// decode has the same semantics as in decode_other.go. -// -//go:noescape -func decode(dst, src []byte) int diff --git a/vendor/github.com/golang/snappy/decode_amd64.s b/vendor/github.com/golang/snappy/decode_amd64.s deleted file mode 100644 index e6179f65e351..000000000000 --- a/vendor/github.com/golang/snappy/decode_amd64.s +++ /dev/null @@ -1,490 +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 !appengine -// +build gc -// +build !noasm - -#include "textflag.h" - -// The asm code generally follows the pure Go code in decode_other.go, except -// where marked with a "!!!". - -// func decode(dst, src []byte) int -// -// All local variables fit into registers. The non-zero stack size is only to -// spill registers and push args when issuing a CALL. The register allocation: -// - AX scratch -// - BX scratch -// - CX length or x -// - DX offset -// - SI &src[s] -// - DI &dst[d] -// + R8 dst_base -// + R9 dst_len -// + R10 dst_base + dst_len -// + R11 src_base -// + R12 src_len -// + R13 src_base + src_len -// - R14 used by doCopy -// - R15 used by doCopy -// -// The registers R8-R13 (marked with a "+") are set at the start of the -// function, and after a CALL returns, and are not otherwise modified. -// -// The d variable is implicitly DI - R8, and len(dst)-d is R10 - DI. -// The s variable is implicitly SI - R11, and len(src)-s is R13 - SI. -TEXT ·decode(SB), NOSPLIT, $48-56 - // Initialize SI, DI and R8-R13. - MOVQ dst_base+0(FP), R8 - MOVQ dst_len+8(FP), R9 - MOVQ R8, DI - MOVQ R8, R10 - ADDQ R9, R10 - MOVQ src_base+24(FP), R11 - MOVQ src_len+32(FP), R12 - MOVQ R11, SI - MOVQ R11, R13 - ADDQ R12, R13 - -loop: - // for s < len(src) - CMPQ SI, R13 - JEQ end - - // CX = uint32(src[s]) - // - // switch src[s] & 0x03 - MOVBLZX (SI), CX - MOVL CX, BX - ANDL $3, BX - CMPL BX, $1 - JAE tagCopy - - // ---------------------------------------- - // The code below handles literal tags. - - // case tagLiteral: - // x := uint32(src[s] >> 2) - // switch - SHRL $2, CX - CMPL CX, $60 - JAE tagLit60Plus - - // case x < 60: - // s++ - INCQ SI - -doLit: - // This is the end of the inner "switch", when we have a literal tag. - // - // We assume that CX == x and x fits in a uint32, where x is the variable - // used in the pure Go decode_other.go code. - - // length = int(x) + 1 - // - // Unlike the pure Go code, we don't need to check if length <= 0 because - // CX can hold 64 bits, so the increment cannot overflow. - INCQ CX - - // Prepare to check if copying length bytes will run past the end of dst or - // src. - // - // AX = len(dst) - d - // BX = len(src) - s - MOVQ R10, AX - SUBQ DI, AX - MOVQ R13, BX - SUBQ SI, BX - - // !!! Try a faster technique for short (16 or fewer bytes) copies. - // - // if length > 16 || len(dst)-d < 16 || len(src)-s < 16 { - // goto callMemmove // Fall back on calling runtime·memmove. - // } - // - // The C++ snappy code calls this TryFastAppend. It also checks len(src)-s - // against 21 instead of 16, because it cannot assume that all of its input - // is contiguous in memory and so it needs to leave enough source bytes to - // read the next tag without refilling buffers, but Go's Decode assumes - // contiguousness (the src argument is a []byte). - CMPQ CX, $16 - JGT callMemmove - CMPQ AX, $16 - JLT callMemmove - CMPQ BX, $16 - JLT callMemmove - - // !!! Implement the copy from src to dst as a 16-byte load and store. - // (Decode's documentation says that dst and src must not overlap.) - // - // This always copies 16 bytes, instead of only length bytes, but that's - // OK. If the input is a valid Snappy encoding then subsequent iterations - // will fix up the overrun. Otherwise, Decode returns a nil []byte (and a - // non-nil error), so the overrun will be ignored. - // - // Note that on amd64, it is legal and cheap to issue unaligned 8-byte or - // 16-byte loads and stores. This technique probably wouldn't be as - // effective on architectures that are fussier about alignment. - MOVOU 0(SI), X0 - MOVOU X0, 0(DI) - - // d += length - // s += length - ADDQ CX, DI - ADDQ CX, SI - JMP loop - -callMemmove: - // if length > len(dst)-d || length > len(src)-s { etc } - CMPQ CX, AX - JGT errCorrupt - CMPQ CX, BX - JGT errCorrupt - - // copy(dst[d:], src[s:s+length]) - // - // This means calling runtime·memmove(&dst[d], &src[s], length), so we push - // DI, SI and CX as arguments. Coincidentally, we also need to spill those - // three registers to the stack, to save local variables across the CALL. - MOVQ DI, 0(SP) - MOVQ SI, 8(SP) - MOVQ CX, 16(SP) - MOVQ DI, 24(SP) - MOVQ SI, 32(SP) - MOVQ CX, 40(SP) - CALL runtime·memmove(SB) - - // Restore local variables: unspill registers from the stack and - // re-calculate R8-R13. - MOVQ 24(SP), DI - MOVQ 32(SP), SI - MOVQ 40(SP), CX - MOVQ dst_base+0(FP), R8 - MOVQ dst_len+8(FP), R9 - MOVQ R8, R10 - ADDQ R9, R10 - MOVQ src_base+24(FP), R11 - MOVQ src_len+32(FP), R12 - MOVQ R11, R13 - ADDQ R12, R13 - - // d += length - // s += length - ADDQ CX, DI - ADDQ CX, SI - JMP loop - -tagLit60Plus: - // !!! This fragment does the - // - // s += x - 58; if uint(s) > uint(len(src)) { etc } - // - // checks. In the asm version, we code it once instead of once per switch case. - ADDQ CX, SI - SUBQ $58, SI - MOVQ SI, BX - SUBQ R11, BX - CMPQ BX, R12 - JA errCorrupt - - // case x == 60: - CMPL CX, $61 - JEQ tagLit61 - JA tagLit62Plus - - // x = uint32(src[s-1]) - MOVBLZX -1(SI), CX - JMP doLit - -tagLit61: - // case x == 61: - // x = uint32(src[s-2]) | uint32(src[s-1])<<8 - MOVWLZX -2(SI), CX - JMP doLit - -tagLit62Plus: - CMPL CX, $62 - JA tagLit63 - - // case x == 62: - // x = uint32(src[s-3]) | uint32(src[s-2])<<8 | uint32(src[s-1])<<16 - MOVWLZX -3(SI), CX - MOVBLZX -1(SI), BX - SHLL $16, BX - ORL BX, CX - JMP doLit - -tagLit63: - // case x == 63: - // x = uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24 - MOVL -4(SI), CX - JMP doLit - -// The code above handles literal tags. -// ---------------------------------------- -// The code below handles copy tags. - -tagCopy4: - // case tagCopy4: - // s += 5 - ADDQ $5, SI - - // if uint(s) > uint(len(src)) { etc } - MOVQ SI, BX - SUBQ R11, BX - CMPQ BX, R12 - JA errCorrupt - - // length = 1 + int(src[s-5])>>2 - SHRQ $2, CX - INCQ CX - - // offset = int(uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24) - MOVLQZX -4(SI), DX - JMP doCopy - -tagCopy2: - // case tagCopy2: - // s += 3 - ADDQ $3, SI - - // if uint(s) > uint(len(src)) { etc } - MOVQ SI, BX - SUBQ R11, BX - CMPQ BX, R12 - JA errCorrupt - - // length = 1 + int(src[s-3])>>2 - SHRQ $2, CX - INCQ CX - - // offset = int(uint32(src[s-2]) | uint32(src[s-1])<<8) - MOVWQZX -2(SI), DX - JMP doCopy - -tagCopy: - // We have a copy tag. We assume that: - // - BX == src[s] & 0x03 - // - CX == src[s] - CMPQ BX, $2 - JEQ tagCopy2 - JA tagCopy4 - - // case tagCopy1: - // s += 2 - ADDQ $2, SI - - // if uint(s) > uint(len(src)) { etc } - MOVQ SI, BX - SUBQ R11, BX - CMPQ BX, R12 - JA errCorrupt - - // offset = int(uint32(src[s-2])&0xe0<<3 | uint32(src[s-1])) - MOVQ CX, DX - ANDQ $0xe0, DX - SHLQ $3, DX - MOVBQZX -1(SI), BX - ORQ BX, DX - - // length = 4 + int(src[s-2])>>2&0x7 - SHRQ $2, CX - ANDQ $7, CX - ADDQ $4, CX - -doCopy: - // This is the end of the outer "switch", when we have a copy tag. - // - // We assume that: - // - CX == length && CX > 0 - // - DX == offset - - // if offset <= 0 { etc } - CMPQ DX, $0 - JLE errCorrupt - - // if d < offset { etc } - MOVQ DI, BX - SUBQ R8, BX - CMPQ BX, DX - JLT errCorrupt - - // if length > len(dst)-d { etc } - MOVQ R10, BX - SUBQ DI, BX - CMPQ CX, BX - JGT errCorrupt - - // forwardCopy(dst[d:d+length], dst[d-offset:]); d += length - // - // Set: - // - R14 = len(dst)-d - // - R15 = &dst[d-offset] - MOVQ R10, R14 - SUBQ DI, R14 - MOVQ DI, R15 - SUBQ DX, R15 - - // !!! Try a faster technique for short (16 or fewer bytes) forward copies. - // - // First, try using two 8-byte load/stores, similar to the doLit technique - // above. Even if dst[d:d+length] and dst[d-offset:] can overlap, this is - // still OK if offset >= 8. Note that this has to be two 8-byte load/stores - // and not one 16-byte load/store, and the first store has to be before the - // second load, due to the overlap if offset is in the range [8, 16). - // - // if length > 16 || offset < 8 || len(dst)-d < 16 { - // goto slowForwardCopy - // } - // copy 16 bytes - // d += length - CMPQ CX, $16 - JGT slowForwardCopy - CMPQ DX, $8 - JLT slowForwardCopy - CMPQ R14, $16 - JLT slowForwardCopy - MOVQ 0(R15), AX - MOVQ AX, 0(DI) - MOVQ 8(R15), BX - MOVQ BX, 8(DI) - ADDQ CX, DI - JMP loop - -slowForwardCopy: - // !!! If the forward copy is longer than 16 bytes, or if offset < 8, we - // can still try 8-byte load stores, provided we can overrun up to 10 extra - // bytes. As above, the overrun will be fixed up by subsequent iterations - // of the outermost loop. - // - // The C++ snappy code calls this technique IncrementalCopyFastPath. Its - // commentary says: - // - // ---- - // - // The main part of this loop is a simple copy of eight bytes at a time - // until we've copied (at least) the requested amount of bytes. However, - // if d and d-offset are less than eight bytes apart (indicating a - // repeating pattern of length < 8), we first need to expand the pattern in - // order to get the correct results. For instance, if the buffer looks like - // this, with the eight-byte and patterns marked as - // intervals: - // - // abxxxxxxxxxxxx - // [------] d-offset - // [------] d - // - // a single eight-byte copy from to will repeat the pattern - // once, after which we can move two bytes without moving : - // - // ababxxxxxxxxxx - // [------] d-offset - // [------] d - // - // and repeat the exercise until the two no longer overlap. - // - // This allows us to do very well in the special case of one single byte - // repeated many times, without taking a big hit for more general cases. - // - // The worst case of extra writing past the end of the match occurs when - // offset == 1 and length == 1; the last copy will read from byte positions - // [0..7] and write to [4..11], whereas it was only supposed to write to - // position 1. Thus, ten excess bytes. - // - // ---- - // - // That "10 byte overrun" worst case is confirmed by Go's - // TestSlowForwardCopyOverrun, which also tests the fixUpSlowForwardCopy - // and finishSlowForwardCopy algorithm. - // - // if length > len(dst)-d-10 { - // goto verySlowForwardCopy - // } - SUBQ $10, R14 - CMPQ CX, R14 - JGT verySlowForwardCopy - -makeOffsetAtLeast8: - // !!! As above, expand the pattern so that offset >= 8 and we can use - // 8-byte load/stores. - // - // for offset < 8 { - // copy 8 bytes from dst[d-offset:] to dst[d:] - // length -= offset - // d += offset - // offset += offset - // // The two previous lines together means that d-offset, and therefore - // // R15, is unchanged. - // } - CMPQ DX, $8 - JGE fixUpSlowForwardCopy - MOVQ (R15), BX - MOVQ BX, (DI) - SUBQ DX, CX - ADDQ DX, DI - ADDQ DX, DX - JMP makeOffsetAtLeast8 - -fixUpSlowForwardCopy: - // !!! Add length (which might be negative now) to d (implied by DI being - // &dst[d]) so that d ends up at the right place when we jump back to the - // top of the loop. Before we do that, though, we save DI to AX so that, if - // length is positive, copying the remaining length bytes will write to the - // right place. - MOVQ DI, AX - ADDQ CX, DI - -finishSlowForwardCopy: - // !!! Repeat 8-byte load/stores until length <= 0. Ending with a negative - // length means that we overrun, but as above, that will be fixed up by - // subsequent iterations of the outermost loop. - CMPQ CX, $0 - JLE loop - MOVQ (R15), BX - MOVQ BX, (AX) - ADDQ $8, R15 - ADDQ $8, AX - SUBQ $8, CX - JMP finishSlowForwardCopy - -verySlowForwardCopy: - // verySlowForwardCopy is a simple implementation of forward copy. In C - // parlance, this is a do/while loop instead of a while loop, since we know - // that length > 0. In Go syntax: - // - // for { - // dst[d] = dst[d - offset] - // d++ - // length-- - // if length == 0 { - // break - // } - // } - MOVB (R15), BX - MOVB BX, (DI) - INCQ R15 - INCQ DI - DECQ CX - JNZ verySlowForwardCopy - JMP loop - -// The code above handles copy tags. -// ---------------------------------------- - -end: - // This is the end of the "for s < len(src)". - // - // if d != len(dst) { etc } - CMPQ DI, R10 - JNE errCorrupt - - // return 0 - MOVQ $0, ret+48(FP) - RET - -errCorrupt: - // return decodeErrCodeCorrupt - MOVQ $1, ret+48(FP) - RET diff --git a/vendor/github.com/golang/snappy/decode_other.go b/vendor/github.com/golang/snappy/decode_other.go deleted file mode 100644 index 8c9f2049bc7b..000000000000 --- a/vendor/github.com/golang/snappy/decode_other.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2016 The Snappy-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 !amd64 appengine !gc noasm - -package snappy - -// decode writes the decoding of src to dst. It assumes that the varint-encoded -// length of the decompressed bytes has already been read, and that len(dst) -// equals that length. -// -// It returns 0 on success or a decodeErrCodeXxx error code on failure. -func decode(dst, src []byte) int { - var d, s, offset, length int - for s < len(src) { - switch src[s] & 0x03 { - case tagLiteral: - x := uint32(src[s] >> 2) - switch { - case x < 60: - s++ - case x == 60: - s += 2 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-1]) - case x == 61: - s += 3 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-2]) | uint32(src[s-1])<<8 - case x == 62: - s += 4 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-3]) | uint32(src[s-2])<<8 | uint32(src[s-1])<<16 - case x == 63: - s += 5 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - x = uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24 - } - length = int(x) + 1 - if length <= 0 { - return decodeErrCodeUnsupportedLiteralLength - } - if length > len(dst)-d || length > len(src)-s { - return decodeErrCodeCorrupt - } - copy(dst[d:], src[s:s+length]) - d += length - s += length - continue - - case tagCopy1: - s += 2 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - length = 4 + int(src[s-2])>>2&0x7 - offset = int(uint32(src[s-2])&0xe0<<3 | uint32(src[s-1])) - - case tagCopy2: - s += 3 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - length = 1 + int(src[s-3])>>2 - offset = int(uint32(src[s-2]) | uint32(src[s-1])<<8) - - case tagCopy4: - s += 5 - if uint(s) > uint(len(src)) { // The uint conversions catch overflow from the previous line. - return decodeErrCodeCorrupt - } - length = 1 + int(src[s-5])>>2 - offset = int(uint32(src[s-4]) | uint32(src[s-3])<<8 | uint32(src[s-2])<<16 | uint32(src[s-1])<<24) - } - - if offset <= 0 || d < offset || length > len(dst)-d { - return decodeErrCodeCorrupt - } - // Copy from an earlier sub-slice of dst to a later sub-slice. Unlike - // the built-in copy function, this byte-by-byte copy always runs - // forwards, even if the slices overlap. Conceptually, this is: - // - // d += forwardCopy(dst[d:d+length], dst[d-offset:]) - for end := d + length; d != end; d++ { - dst[d] = dst[d-offset] - } - } - if d != len(dst) { - return decodeErrCodeCorrupt - } - return 0 -} diff --git a/vendor/github.com/golang/snappy/encode.go b/vendor/github.com/golang/snappy/encode.go deleted file mode 100644 index 8d393e904bb3..000000000000 --- a/vendor/github.com/golang/snappy/encode.go +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright 2011 The Snappy-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 snappy - -import ( - "encoding/binary" - "errors" - "io" -) - -// Encode returns the encoded form of src. The returned slice may be a sub- -// slice of dst if dst was large enough to hold the entire encoded block. -// Otherwise, a newly allocated slice will be returned. -// -// The dst and src must not overlap. It is valid to pass a nil dst. -func Encode(dst, src []byte) []byte { - if n := MaxEncodedLen(len(src)); n < 0 { - panic(ErrTooLarge) - } else if len(dst) < n { - dst = make([]byte, n) - } - - // The block starts with the varint-encoded length of the decompressed bytes. - d := binary.PutUvarint(dst, uint64(len(src))) - - for len(src) > 0 { - p := src - src = nil - if len(p) > maxBlockSize { - p, src = p[:maxBlockSize], p[maxBlockSize:] - } - if len(p) < minNonLiteralBlockSize { - d += emitLiteral(dst[d:], p) - } else { - d += encodeBlock(dst[d:], p) - } - } - return dst[:d] -} - -// inputMargin is the minimum number of extra input bytes to keep, inside -// encodeBlock's inner loop. On some architectures, this margin lets us -// implement a fast path for emitLiteral, where the copy of short (<= 16 byte) -// literals can be implemented as a single load to and store from a 16-byte -// register. That literal's actual length can be as short as 1 byte, so this -// can copy up to 15 bytes too much, but that's OK as subsequent iterations of -// the encoding loop will fix up the copy overrun, and this inputMargin ensures -// that we don't overrun the dst and src buffers. -const inputMargin = 16 - 1 - -// minNonLiteralBlockSize is the minimum size of the input to encodeBlock that -// could be encoded with a copy tag. This is the minimum with respect to the -// algorithm used by encodeBlock, not a minimum enforced by the file format. -// -// The encoded output must start with at least a 1 byte literal, as there are -// no previous bytes to copy. A minimal (1 byte) copy after that, generated -// from an emitCopy call in encodeBlock's main loop, would require at least -// another inputMargin bytes, for the reason above: we want any emitLiteral -// calls inside encodeBlock's main loop to use the fast path if possible, which -// requires being able to overrun by inputMargin bytes. Thus, -// minNonLiteralBlockSize equals 1 + 1 + inputMargin. -// -// The C++ code doesn't use this exact threshold, but it could, as discussed at -// https://groups.google.com/d/topic/snappy-compression/oGbhsdIJSJ8/discussion -// The difference between Go (2+inputMargin) and C++ (inputMargin) is purely an -// optimization. It should not affect the encoded form. This is tested by -// TestSameEncodingAsCppShortCopies. -const minNonLiteralBlockSize = 1 + 1 + inputMargin - -// MaxEncodedLen returns the maximum length of a snappy block, given its -// uncompressed length. -// -// It will return a negative value if srcLen is too large to encode. -func MaxEncodedLen(srcLen int) int { - n := uint64(srcLen) - if n > 0xffffffff { - return -1 - } - // Compressed data can be defined as: - // compressed := item* literal* - // item := literal* copy - // - // The trailing literal sequence has a space blowup of at most 62/60 - // since a literal of length 60 needs one tag byte + one extra byte - // for length information. - // - // Item blowup is trickier to measure. Suppose the "copy" op copies - // 4 bytes of data. Because of a special check in the encoding code, - // we produce a 4-byte copy only if the offset is < 65536. Therefore - // the copy op takes 3 bytes to encode, and this type of item leads - // to at most the 62/60 blowup for representing literals. - // - // Suppose the "copy" op copies 5 bytes of data. If the offset is big - // enough, it will take 5 bytes to encode the copy op. Therefore the - // worst case here is a one-byte literal followed by a five-byte copy. - // That is, 6 bytes of input turn into 7 bytes of "compressed" data. - // - // This last factor dominates the blowup, so the final estimate is: - n = 32 + n + n/6 - if n > 0xffffffff { - return -1 - } - return int(n) -} - -var errClosed = errors.New("snappy: Writer is closed") - -// NewWriter returns a new Writer that compresses to w. -// -// The Writer returned does not buffer writes. There is no need to Flush or -// Close such a Writer. -// -// Deprecated: the Writer returned is not suitable for many small writes, only -// for few large writes. Use NewBufferedWriter instead, which is efficient -// regardless of the frequency and shape of the writes, and remember to Close -// that Writer when done. -func NewWriter(w io.Writer) *Writer { - return &Writer{ - w: w, - obuf: make([]byte, obufLen), - } -} - -// NewBufferedWriter returns a new Writer that compresses to w, using the -// framing format described at -// https://github.com/google/snappy/blob/master/framing_format.txt -// -// The Writer returned buffers writes. Users must call Close to guarantee all -// data has been forwarded to the underlying io.Writer. They may also call -// Flush zero or more times before calling Close. -func NewBufferedWriter(w io.Writer) *Writer { - return &Writer{ - w: w, - ibuf: make([]byte, 0, maxBlockSize), - obuf: make([]byte, obufLen), - } -} - -// Writer is an io.Writer that can write Snappy-compressed bytes. -type Writer struct { - w io.Writer - err error - - // ibuf is a buffer for the incoming (uncompressed) bytes. - // - // Its use is optional. For backwards compatibility, Writers created by the - // NewWriter function have ibuf == nil, do not buffer incoming bytes, and - // therefore do not need to be Flush'ed or Close'd. - ibuf []byte - - // obuf is a buffer for the outgoing (compressed) bytes. - obuf []byte - - // wroteStreamHeader is whether we have written the stream header. - wroteStreamHeader bool -} - -// Reset discards the writer's state and switches the Snappy writer to write to -// w. This permits reusing a Writer rather than allocating a new one. -func (w *Writer) Reset(writer io.Writer) { - w.w = writer - w.err = nil - if w.ibuf != nil { - w.ibuf = w.ibuf[:0] - } - w.wroteStreamHeader = false -} - -// Write satisfies the io.Writer interface. -func (w *Writer) Write(p []byte) (nRet int, errRet error) { - if w.ibuf == nil { - // Do not buffer incoming bytes. This does not perform or compress well - // if the caller of Writer.Write writes many small slices. This - // behavior is therefore deprecated, but still supported for backwards - // compatibility with code that doesn't explicitly Flush or Close. - return w.write(p) - } - - // The remainder of this method is based on bufio.Writer.Write from the - // standard library. - - for len(p) > (cap(w.ibuf)-len(w.ibuf)) && w.err == nil { - var n int - if len(w.ibuf) == 0 { - // Large write, empty buffer. - // Write directly from p to avoid copy. - n, _ = w.write(p) - } else { - n = copy(w.ibuf[len(w.ibuf):cap(w.ibuf)], p) - w.ibuf = w.ibuf[:len(w.ibuf)+n] - w.Flush() - } - nRet += n - p = p[n:] - } - if w.err != nil { - return nRet, w.err - } - n := copy(w.ibuf[len(w.ibuf):cap(w.ibuf)], p) - w.ibuf = w.ibuf[:len(w.ibuf)+n] - nRet += n - return nRet, nil -} - -func (w *Writer) write(p []byte) (nRet int, errRet error) { - if w.err != nil { - return 0, w.err - } - for len(p) > 0 { - obufStart := len(magicChunk) - if !w.wroteStreamHeader { - w.wroteStreamHeader = true - copy(w.obuf, magicChunk) - obufStart = 0 - } - - var uncompressed []byte - if len(p) > maxBlockSize { - uncompressed, p = p[:maxBlockSize], p[maxBlockSize:] - } else { - uncompressed, p = p, nil - } - checksum := crc(uncompressed) - - // Compress the buffer, discarding the result if the improvement - // isn't at least 12.5%. - compressed := Encode(w.obuf[obufHeaderLen:], uncompressed) - chunkType := uint8(chunkTypeCompressedData) - chunkLen := 4 + len(compressed) - obufEnd := obufHeaderLen + len(compressed) - if len(compressed) >= len(uncompressed)-len(uncompressed)/8 { - chunkType = chunkTypeUncompressedData - chunkLen = 4 + len(uncompressed) - obufEnd = obufHeaderLen - } - - // Fill in the per-chunk header that comes before the body. - w.obuf[len(magicChunk)+0] = chunkType - w.obuf[len(magicChunk)+1] = uint8(chunkLen >> 0) - w.obuf[len(magicChunk)+2] = uint8(chunkLen >> 8) - w.obuf[len(magicChunk)+3] = uint8(chunkLen >> 16) - w.obuf[len(magicChunk)+4] = uint8(checksum >> 0) - w.obuf[len(magicChunk)+5] = uint8(checksum >> 8) - w.obuf[len(magicChunk)+6] = uint8(checksum >> 16) - w.obuf[len(magicChunk)+7] = uint8(checksum >> 24) - - if _, err := w.w.Write(w.obuf[obufStart:obufEnd]); err != nil { - w.err = err - return nRet, err - } - if chunkType == chunkTypeUncompressedData { - if _, err := w.w.Write(uncompressed); err != nil { - w.err = err - return nRet, err - } - } - nRet += len(uncompressed) - } - return nRet, nil -} - -// Flush flushes the Writer to its underlying io.Writer. -func (w *Writer) Flush() error { - if w.err != nil { - return w.err - } - if len(w.ibuf) == 0 { - return nil - } - w.write(w.ibuf) - w.ibuf = w.ibuf[:0] - return w.err -} - -// Close calls Flush and then closes the Writer. -func (w *Writer) Close() error { - w.Flush() - ret := w.err - if w.err == nil { - w.err = errClosed - } - return ret -} diff --git a/vendor/github.com/golang/snappy/encode_amd64.go b/vendor/github.com/golang/snappy/encode_amd64.go deleted file mode 100644 index 150d91bc8be5..000000000000 --- a/vendor/github.com/golang/snappy/encode_amd64.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2016 The Snappy-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 !appengine -// +build gc -// +build !noasm - -package snappy - -// emitLiteral has the same semantics as in encode_other.go. -// -//go:noescape -func emitLiteral(dst, lit []byte) int - -// emitCopy has the same semantics as in encode_other.go. -// -//go:noescape -func emitCopy(dst []byte, offset, length int) int - -// extendMatch has the same semantics as in encode_other.go. -// -//go:noescape -func extendMatch(src []byte, i, j int) int - -// encodeBlock has the same semantics as in encode_other.go. -// -//go:noescape -func encodeBlock(dst, src []byte) (d int) diff --git a/vendor/github.com/golang/snappy/encode_amd64.s b/vendor/github.com/golang/snappy/encode_amd64.s deleted file mode 100644 index adfd979fe277..000000000000 --- a/vendor/github.com/golang/snappy/encode_amd64.s +++ /dev/null @@ -1,730 +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 !appengine -// +build gc -// +build !noasm - -#include "textflag.h" - -// The XXX lines assemble on Go 1.4, 1.5 and 1.7, but not 1.6, due to a -// Go toolchain regression. See https://github.com/golang/go/issues/15426 and -// https://github.com/golang/snappy/issues/29 -// -// As a workaround, the package was built with a known good assembler, and -// those instructions were disassembled by "objdump -d" to yield the -// 4e 0f b7 7c 5c 78 movzwq 0x78(%rsp,%r11,2),%r15 -// style comments, in AT&T asm syntax. Note that rsp here is a physical -// register, not Go/asm's SP pseudo-register (see https://golang.org/doc/asm). -// The instructions were then encoded as "BYTE $0x.." sequences, which assemble -// fine on Go 1.6. - -// The asm code generally follows the pure Go code in encode_other.go, except -// where marked with a "!!!". - -// ---------------------------------------------------------------------------- - -// func emitLiteral(dst, lit []byte) int -// -// All local variables fit into registers. The register allocation: -// - AX len(lit) -// - BX n -// - DX return value -// - DI &dst[i] -// - R10 &lit[0] -// -// The 24 bytes of stack space is to call runtime·memmove. -// -// The unusual register allocation of local variables, such as R10 for the -// source pointer, matches the allocation used at the call site in encodeBlock, -// which makes it easier to manually inline this function. -TEXT ·emitLiteral(SB), NOSPLIT, $24-56 - MOVQ dst_base+0(FP), DI - MOVQ lit_base+24(FP), R10 - MOVQ lit_len+32(FP), AX - MOVQ AX, DX - MOVL AX, BX - SUBL $1, BX - - CMPL BX, $60 - JLT oneByte - CMPL BX, $256 - JLT twoBytes - -threeBytes: - MOVB $0xf4, 0(DI) - MOVW BX, 1(DI) - ADDQ $3, DI - ADDQ $3, DX - JMP memmove - -twoBytes: - MOVB $0xf0, 0(DI) - MOVB BX, 1(DI) - ADDQ $2, DI - ADDQ $2, DX - JMP memmove - -oneByte: - SHLB $2, BX - MOVB BX, 0(DI) - ADDQ $1, DI - ADDQ $1, DX - -memmove: - MOVQ DX, ret+48(FP) - - // copy(dst[i:], lit) - // - // This means calling runtime·memmove(&dst[i], &lit[0], len(lit)), so we push - // DI, R10 and AX as arguments. - MOVQ DI, 0(SP) - MOVQ R10, 8(SP) - MOVQ AX, 16(SP) - CALL runtime·memmove(SB) - RET - -// ---------------------------------------------------------------------------- - -// func emitCopy(dst []byte, offset, length int) int -// -// All local variables fit into registers. The register allocation: -// - AX length -// - SI &dst[0] -// - DI &dst[i] -// - R11 offset -// -// The unusual register allocation of local variables, such as R11 for the -// offset, matches the allocation used at the call site in encodeBlock, which -// makes it easier to manually inline this function. -TEXT ·emitCopy(SB), NOSPLIT, $0-48 - MOVQ dst_base+0(FP), DI - MOVQ DI, SI - MOVQ offset+24(FP), R11 - MOVQ length+32(FP), AX - -loop0: - // for length >= 68 { etc } - CMPL AX, $68 - JLT step1 - - // Emit a length 64 copy, encoded as 3 bytes. - MOVB $0xfe, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - SUBL $64, AX - JMP loop0 - -step1: - // if length > 64 { etc } - CMPL AX, $64 - JLE step2 - - // Emit a length 60 copy, encoded as 3 bytes. - MOVB $0xee, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - SUBL $60, AX - -step2: - // if length >= 12 || offset >= 2048 { goto step3 } - CMPL AX, $12 - JGE step3 - CMPL R11, $2048 - JGE step3 - - // Emit the remaining copy, encoded as 2 bytes. - MOVB R11, 1(DI) - SHRL $8, R11 - SHLB $5, R11 - SUBB $4, AX - SHLB $2, AX - ORB AX, R11 - ORB $1, R11 - MOVB R11, 0(DI) - ADDQ $2, DI - - // Return the number of bytes written. - SUBQ SI, DI - MOVQ DI, ret+40(FP) - RET - -step3: - // Emit the remaining copy, encoded as 3 bytes. - SUBL $1, AX - SHLB $2, AX - ORB $2, AX - MOVB AX, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - - // Return the number of bytes written. - SUBQ SI, DI - MOVQ DI, ret+40(FP) - RET - -// ---------------------------------------------------------------------------- - -// func extendMatch(src []byte, i, j int) int -// -// All local variables fit into registers. The register allocation: -// - DX &src[0] -// - SI &src[j] -// - R13 &src[len(src) - 8] -// - R14 &src[len(src)] -// - R15 &src[i] -// -// The unusual register allocation of local variables, such as R15 for a source -// pointer, matches the allocation used at the call site in encodeBlock, which -// makes it easier to manually inline this function. -TEXT ·extendMatch(SB), NOSPLIT, $0-48 - MOVQ src_base+0(FP), DX - MOVQ src_len+8(FP), R14 - MOVQ i+24(FP), R15 - MOVQ j+32(FP), SI - ADDQ DX, R14 - ADDQ DX, R15 - ADDQ DX, SI - MOVQ R14, R13 - SUBQ $8, R13 - -cmp8: - // As long as we are 8 or more bytes before the end of src, we can load and - // compare 8 bytes at a time. If those 8 bytes are equal, repeat. - CMPQ SI, R13 - JA cmp1 - MOVQ (R15), AX - MOVQ (SI), BX - CMPQ AX, BX - JNE bsf - ADDQ $8, R15 - ADDQ $8, SI - JMP cmp8 - -bsf: - // If those 8 bytes were not equal, XOR the two 8 byte values, and return - // the index of the first byte that differs. The BSF instruction finds the - // least significant 1 bit, the amd64 architecture is little-endian, and - // the shift by 3 converts a bit index to a byte index. - XORQ AX, BX - BSFQ BX, BX - SHRQ $3, BX - ADDQ BX, SI - - // Convert from &src[ret] to ret. - SUBQ DX, SI - MOVQ SI, ret+40(FP) - RET - -cmp1: - // In src's tail, compare 1 byte at a time. - CMPQ SI, R14 - JAE extendMatchEnd - MOVB (R15), AX - MOVB (SI), BX - CMPB AX, BX - JNE extendMatchEnd - ADDQ $1, R15 - ADDQ $1, SI - JMP cmp1 - -extendMatchEnd: - // Convert from &src[ret] to ret. - SUBQ DX, SI - MOVQ SI, ret+40(FP) - RET - -// ---------------------------------------------------------------------------- - -// func encodeBlock(dst, src []byte) (d int) -// -// All local variables fit into registers, other than "var table". The register -// allocation: -// - AX . . -// - BX . . -// - CX 56 shift (note that amd64 shifts by non-immediates must use CX). -// - DX 64 &src[0], tableSize -// - SI 72 &src[s] -// - DI 80 &dst[d] -// - R9 88 sLimit -// - R10 . &src[nextEmit] -// - R11 96 prevHash, currHash, nextHash, offset -// - R12 104 &src[base], skip -// - R13 . &src[nextS], &src[len(src) - 8] -// - R14 . len(src), bytesBetweenHashLookups, &src[len(src)], x -// - R15 112 candidate -// -// The second column (56, 64, etc) is the stack offset to spill the registers -// when calling other functions. We could pack this slightly tighter, but it's -// simpler to have a dedicated spill map independent of the function called. -// -// "var table [maxTableSize]uint16" takes up 32768 bytes of stack space. An -// extra 56 bytes, to call other functions, and an extra 64 bytes, to spill -// local variables (registers) during calls gives 32768 + 56 + 64 = 32888. -TEXT ·encodeBlock(SB), 0, $32888-56 - MOVQ dst_base+0(FP), DI - MOVQ src_base+24(FP), SI - MOVQ src_len+32(FP), R14 - - // shift, tableSize := uint32(32-8), 1<<8 - MOVQ $24, CX - MOVQ $256, DX - -calcShift: - // for ; tableSize < maxTableSize && tableSize < len(src); tableSize *= 2 { - // shift-- - // } - CMPQ DX, $16384 - JGE varTable - CMPQ DX, R14 - JGE varTable - SUBQ $1, CX - SHLQ $1, DX - JMP calcShift - -varTable: - // var table [maxTableSize]uint16 - // - // In the asm code, unlike the Go code, we can zero-initialize only the - // first tableSize elements. Each uint16 element is 2 bytes and each MOVOU - // writes 16 bytes, so we can do only tableSize/8 writes instead of the - // 2048 writes that would zero-initialize all of table's 32768 bytes. - SHRQ $3, DX - LEAQ table-32768(SP), BX - PXOR X0, X0 - -memclr: - MOVOU X0, 0(BX) - ADDQ $16, BX - SUBQ $1, DX - JNZ memclr - - // !!! DX = &src[0] - MOVQ SI, DX - - // sLimit := len(src) - inputMargin - MOVQ R14, R9 - SUBQ $15, R9 - - // !!! Pre-emptively spill CX, DX and R9 to the stack. Their values don't - // change for the rest of the function. - MOVQ CX, 56(SP) - MOVQ DX, 64(SP) - MOVQ R9, 88(SP) - - // nextEmit := 0 - MOVQ DX, R10 - - // s := 1 - ADDQ $1, SI - - // nextHash := hash(load32(src, s), shift) - MOVL 0(SI), R11 - IMULL $0x1e35a7bd, R11 - SHRL CX, R11 - -outer: - // for { etc } - - // skip := 32 - MOVQ $32, R12 - - // nextS := s - MOVQ SI, R13 - - // candidate := 0 - MOVQ $0, R15 - -inner0: - // for { etc } - - // s := nextS - MOVQ R13, SI - - // bytesBetweenHashLookups := skip >> 5 - MOVQ R12, R14 - SHRQ $5, R14 - - // nextS = s + bytesBetweenHashLookups - ADDQ R14, R13 - - // skip += bytesBetweenHashLookups - ADDQ R14, R12 - - // if nextS > sLimit { goto emitRemainder } - MOVQ R13, AX - SUBQ DX, AX - CMPQ AX, R9 - JA emitRemainder - - // candidate = int(table[nextHash]) - // XXX: MOVWQZX table-32768(SP)(R11*2), R15 - // XXX: 4e 0f b7 7c 5c 78 movzwq 0x78(%rsp,%r11,2),%r15 - BYTE $0x4e - BYTE $0x0f - BYTE $0xb7 - BYTE $0x7c - BYTE $0x5c - BYTE $0x78 - - // table[nextHash] = uint16(s) - MOVQ SI, AX - SUBQ DX, AX - - // XXX: MOVW AX, table-32768(SP)(R11*2) - // XXX: 66 42 89 44 5c 78 mov %ax,0x78(%rsp,%r11,2) - BYTE $0x66 - BYTE $0x42 - BYTE $0x89 - BYTE $0x44 - BYTE $0x5c - BYTE $0x78 - - // nextHash = hash(load32(src, nextS), shift) - MOVL 0(R13), R11 - IMULL $0x1e35a7bd, R11 - SHRL CX, R11 - - // if load32(src, s) != load32(src, candidate) { continue } break - MOVL 0(SI), AX - MOVL (DX)(R15*1), BX - CMPL AX, BX - JNE inner0 - -fourByteMatch: - // As per the encode_other.go code: - // - // A 4-byte match has been found. We'll later see etc. - - // !!! Jump to a fast path for short (<= 16 byte) literals. See the comment - // on inputMargin in encode.go. - MOVQ SI, AX - SUBQ R10, AX - CMPQ AX, $16 - JLE emitLiteralFastPath - - // ---------------------------------------- - // Begin inline of the emitLiteral call. - // - // d += emitLiteral(dst[d:], src[nextEmit:s]) - - MOVL AX, BX - SUBL $1, BX - - CMPL BX, $60 - JLT inlineEmitLiteralOneByte - CMPL BX, $256 - JLT inlineEmitLiteralTwoBytes - -inlineEmitLiteralThreeBytes: - MOVB $0xf4, 0(DI) - MOVW BX, 1(DI) - ADDQ $3, DI - JMP inlineEmitLiteralMemmove - -inlineEmitLiteralTwoBytes: - MOVB $0xf0, 0(DI) - MOVB BX, 1(DI) - ADDQ $2, DI - JMP inlineEmitLiteralMemmove - -inlineEmitLiteralOneByte: - SHLB $2, BX - MOVB BX, 0(DI) - ADDQ $1, DI - -inlineEmitLiteralMemmove: - // Spill local variables (registers) onto the stack; call; unspill. - // - // copy(dst[i:], lit) - // - // This means calling runtime·memmove(&dst[i], &lit[0], len(lit)), so we push - // DI, R10 and AX as arguments. - MOVQ DI, 0(SP) - MOVQ R10, 8(SP) - MOVQ AX, 16(SP) - ADDQ AX, DI // Finish the "d +=" part of "d += emitLiteral(etc)". - MOVQ SI, 72(SP) - MOVQ DI, 80(SP) - MOVQ R15, 112(SP) - CALL runtime·memmove(SB) - MOVQ 56(SP), CX - MOVQ 64(SP), DX - MOVQ 72(SP), SI - MOVQ 80(SP), DI - MOVQ 88(SP), R9 - MOVQ 112(SP), R15 - JMP inner1 - -inlineEmitLiteralEnd: - // End inline of the emitLiteral call. - // ---------------------------------------- - -emitLiteralFastPath: - // !!! Emit the 1-byte encoding "uint8(len(lit)-1)<<2". - MOVB AX, BX - SUBB $1, BX - SHLB $2, BX - MOVB BX, (DI) - ADDQ $1, DI - - // !!! Implement the copy from lit to dst as a 16-byte load and store. - // (Encode's documentation says that dst and src must not overlap.) - // - // This always copies 16 bytes, instead of only len(lit) bytes, but that's - // OK. Subsequent iterations will fix up the overrun. - // - // Note that on amd64, it is legal and cheap to issue unaligned 8-byte or - // 16-byte loads and stores. This technique probably wouldn't be as - // effective on architectures that are fussier about alignment. - MOVOU 0(R10), X0 - MOVOU X0, 0(DI) - ADDQ AX, DI - -inner1: - // for { etc } - - // base := s - MOVQ SI, R12 - - // !!! offset := base - candidate - MOVQ R12, R11 - SUBQ R15, R11 - SUBQ DX, R11 - - // ---------------------------------------- - // Begin inline of the extendMatch call. - // - // s = extendMatch(src, candidate+4, s+4) - - // !!! R14 = &src[len(src)] - MOVQ src_len+32(FP), R14 - ADDQ DX, R14 - - // !!! R13 = &src[len(src) - 8] - MOVQ R14, R13 - SUBQ $8, R13 - - // !!! R15 = &src[candidate + 4] - ADDQ $4, R15 - ADDQ DX, R15 - - // !!! s += 4 - ADDQ $4, SI - -inlineExtendMatchCmp8: - // As long as we are 8 or more bytes before the end of src, we can load and - // compare 8 bytes at a time. If those 8 bytes are equal, repeat. - CMPQ SI, R13 - JA inlineExtendMatchCmp1 - MOVQ (R15), AX - MOVQ (SI), BX - CMPQ AX, BX - JNE inlineExtendMatchBSF - ADDQ $8, R15 - ADDQ $8, SI - JMP inlineExtendMatchCmp8 - -inlineExtendMatchBSF: - // If those 8 bytes were not equal, XOR the two 8 byte values, and return - // the index of the first byte that differs. The BSF instruction finds the - // least significant 1 bit, the amd64 architecture is little-endian, and - // the shift by 3 converts a bit index to a byte index. - XORQ AX, BX - BSFQ BX, BX - SHRQ $3, BX - ADDQ BX, SI - JMP inlineExtendMatchEnd - -inlineExtendMatchCmp1: - // In src's tail, compare 1 byte at a time. - CMPQ SI, R14 - JAE inlineExtendMatchEnd - MOVB (R15), AX - MOVB (SI), BX - CMPB AX, BX - JNE inlineExtendMatchEnd - ADDQ $1, R15 - ADDQ $1, SI - JMP inlineExtendMatchCmp1 - -inlineExtendMatchEnd: - // End inline of the extendMatch call. - // ---------------------------------------- - - // ---------------------------------------- - // Begin inline of the emitCopy call. - // - // d += emitCopy(dst[d:], base-candidate, s-base) - - // !!! length := s - base - MOVQ SI, AX - SUBQ R12, AX - -inlineEmitCopyLoop0: - // for length >= 68 { etc } - CMPL AX, $68 - JLT inlineEmitCopyStep1 - - // Emit a length 64 copy, encoded as 3 bytes. - MOVB $0xfe, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - SUBL $64, AX - JMP inlineEmitCopyLoop0 - -inlineEmitCopyStep1: - // if length > 64 { etc } - CMPL AX, $64 - JLE inlineEmitCopyStep2 - - // Emit a length 60 copy, encoded as 3 bytes. - MOVB $0xee, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - SUBL $60, AX - -inlineEmitCopyStep2: - // if length >= 12 || offset >= 2048 { goto inlineEmitCopyStep3 } - CMPL AX, $12 - JGE inlineEmitCopyStep3 - CMPL R11, $2048 - JGE inlineEmitCopyStep3 - - // Emit the remaining copy, encoded as 2 bytes. - MOVB R11, 1(DI) - SHRL $8, R11 - SHLB $5, R11 - SUBB $4, AX - SHLB $2, AX - ORB AX, R11 - ORB $1, R11 - MOVB R11, 0(DI) - ADDQ $2, DI - JMP inlineEmitCopyEnd - -inlineEmitCopyStep3: - // Emit the remaining copy, encoded as 3 bytes. - SUBL $1, AX - SHLB $2, AX - ORB $2, AX - MOVB AX, 0(DI) - MOVW R11, 1(DI) - ADDQ $3, DI - -inlineEmitCopyEnd: - // End inline of the emitCopy call. - // ---------------------------------------- - - // nextEmit = s - MOVQ SI, R10 - - // if s >= sLimit { goto emitRemainder } - MOVQ SI, AX - SUBQ DX, AX - CMPQ AX, R9 - JAE emitRemainder - - // As per the encode_other.go code: - // - // We could immediately etc. - - // x := load64(src, s-1) - MOVQ -1(SI), R14 - - // prevHash := hash(uint32(x>>0), shift) - MOVL R14, R11 - IMULL $0x1e35a7bd, R11 - SHRL CX, R11 - - // table[prevHash] = uint16(s-1) - MOVQ SI, AX - SUBQ DX, AX - SUBQ $1, AX - - // XXX: MOVW AX, table-32768(SP)(R11*2) - // XXX: 66 42 89 44 5c 78 mov %ax,0x78(%rsp,%r11,2) - BYTE $0x66 - BYTE $0x42 - BYTE $0x89 - BYTE $0x44 - BYTE $0x5c - BYTE $0x78 - - // currHash := hash(uint32(x>>8), shift) - SHRQ $8, R14 - MOVL R14, R11 - IMULL $0x1e35a7bd, R11 - SHRL CX, R11 - - // candidate = int(table[currHash]) - // XXX: MOVWQZX table-32768(SP)(R11*2), R15 - // XXX: 4e 0f b7 7c 5c 78 movzwq 0x78(%rsp,%r11,2),%r15 - BYTE $0x4e - BYTE $0x0f - BYTE $0xb7 - BYTE $0x7c - BYTE $0x5c - BYTE $0x78 - - // table[currHash] = uint16(s) - ADDQ $1, AX - - // XXX: MOVW AX, table-32768(SP)(R11*2) - // XXX: 66 42 89 44 5c 78 mov %ax,0x78(%rsp,%r11,2) - BYTE $0x66 - BYTE $0x42 - BYTE $0x89 - BYTE $0x44 - BYTE $0x5c - BYTE $0x78 - - // if uint32(x>>8) == load32(src, candidate) { continue } - MOVL (DX)(R15*1), BX - CMPL R14, BX - JEQ inner1 - - // nextHash = hash(uint32(x>>16), shift) - SHRQ $8, R14 - MOVL R14, R11 - IMULL $0x1e35a7bd, R11 - SHRL CX, R11 - - // s++ - ADDQ $1, SI - - // break out of the inner1 for loop, i.e. continue the outer loop. - JMP outer - -emitRemainder: - // if nextEmit < len(src) { etc } - MOVQ src_len+32(FP), AX - ADDQ DX, AX - CMPQ R10, AX - JEQ encodeBlockEnd - - // d += emitLiteral(dst[d:], src[nextEmit:]) - // - // Push args. - MOVQ DI, 0(SP) - MOVQ $0, 8(SP) // Unnecessary, as the callee ignores it, but conservative. - MOVQ $0, 16(SP) // Unnecessary, as the callee ignores it, but conservative. - MOVQ R10, 24(SP) - SUBQ R10, AX - MOVQ AX, 32(SP) - MOVQ AX, 40(SP) // Unnecessary, as the callee ignores it, but conservative. - - // Spill local variables (registers) onto the stack; call; unspill. - MOVQ DI, 80(SP) - CALL ·emitLiteral(SB) - MOVQ 80(SP), DI - - // Finish the "d +=" part of "d += emitLiteral(etc)". - ADDQ 48(SP), DI - -encodeBlockEnd: - MOVQ dst_base+0(FP), AX - SUBQ AX, DI - MOVQ DI, d+48(FP) - RET diff --git a/vendor/github.com/golang/snappy/encode_other.go b/vendor/github.com/golang/snappy/encode_other.go deleted file mode 100644 index dbcae905e6e0..000000000000 --- a/vendor/github.com/golang/snappy/encode_other.go +++ /dev/null @@ -1,238 +0,0 @@ -// Copyright 2016 The Snappy-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 !amd64 appengine !gc noasm - -package snappy - -func load32(b []byte, i int) uint32 { - b = b[i : i+4 : len(b)] // Help the compiler eliminate bounds checks on the next line. - return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 -} - -func load64(b []byte, i int) uint64 { - b = b[i : i+8 : len(b)] // Help the compiler eliminate bounds checks on the next line. - 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 -} - -// emitLiteral writes a literal chunk and returns the number of bytes written. -// -// It assumes that: -// dst is long enough to hold the encoded bytes -// 1 <= len(lit) && len(lit) <= 65536 -func emitLiteral(dst, lit []byte) int { - i, n := 0, uint(len(lit)-1) - switch { - case n < 60: - dst[0] = uint8(n)<<2 | tagLiteral - i = 1 - case n < 1<<8: - dst[0] = 60<<2 | tagLiteral - dst[1] = uint8(n) - i = 2 - default: - dst[0] = 61<<2 | tagLiteral - dst[1] = uint8(n) - dst[2] = uint8(n >> 8) - i = 3 - } - return i + copy(dst[i:], lit) -} - -// emitCopy writes a copy chunk and returns the number of bytes written. -// -// It assumes that: -// dst is long enough to hold the encoded bytes -// 1 <= offset && offset <= 65535 -// 4 <= length && length <= 65535 -func emitCopy(dst []byte, offset, length int) int { - i := 0 - // The maximum length for a single tagCopy1 or tagCopy2 op is 64 bytes. The - // threshold for this loop is a little higher (at 68 = 64 + 4), and the - // length emitted down below is is a little lower (at 60 = 64 - 4), because - // it's shorter to encode a length 67 copy as a length 60 tagCopy2 followed - // by a length 7 tagCopy1 (which encodes as 3+2 bytes) than to encode it as - // a length 64 tagCopy2 followed by a length 3 tagCopy2 (which encodes as - // 3+3 bytes). The magic 4 in the 64±4 is because the minimum length for a - // tagCopy1 op is 4 bytes, which is why a length 3 copy has to be an - // encodes-as-3-bytes tagCopy2 instead of an encodes-as-2-bytes tagCopy1. - for length >= 68 { - // Emit a length 64 copy, encoded as 3 bytes. - dst[i+0] = 63<<2 | tagCopy2 - dst[i+1] = uint8(offset) - dst[i+2] = uint8(offset >> 8) - i += 3 - length -= 64 - } - if length > 64 { - // Emit a length 60 copy, encoded as 3 bytes. - dst[i+0] = 59<<2 | tagCopy2 - dst[i+1] = uint8(offset) - dst[i+2] = uint8(offset >> 8) - i += 3 - length -= 60 - } - if length >= 12 || offset >= 2048 { - // Emit the remaining copy, encoded as 3 bytes. - dst[i+0] = uint8(length-1)<<2 | tagCopy2 - dst[i+1] = uint8(offset) - dst[i+2] = uint8(offset >> 8) - return i + 3 - } - // Emit the remaining copy, encoded as 2 bytes. - dst[i+0] = uint8(offset>>8)<<5 | uint8(length-4)<<2 | tagCopy1 - dst[i+1] = uint8(offset) - return i + 2 -} - -// extendMatch returns the largest k such that k <= len(src) and that -// src[i:i+k-j] and src[j:k] have the same contents. -// -// It assumes that: -// 0 <= i && i < j && j <= len(src) -func extendMatch(src []byte, i, j int) int { - for ; j < len(src) && src[i] == src[j]; i, j = i+1, j+1 { - } - return j -} - -func hash(u, shift uint32) uint32 { - return (u * 0x1e35a7bd) >> shift -} - -// encodeBlock encodes a non-empty src to a guaranteed-large-enough dst. It -// assumes that the varint-encoded length of the decompressed bytes has already -// been written. -// -// It also assumes that: -// len(dst) >= MaxEncodedLen(len(src)) && -// minNonLiteralBlockSize <= len(src) && len(src) <= maxBlockSize -func encodeBlock(dst, src []byte) (d int) { - // Initialize the hash table. Its size ranges from 1<<8 to 1<<14 inclusive. - // The table element type is uint16, as s < sLimit and sLimit < len(src) - // and len(src) <= maxBlockSize and maxBlockSize == 65536. - const ( - maxTableSize = 1 << 14 - // tableMask is redundant, but helps the compiler eliminate bounds - // checks. - tableMask = maxTableSize - 1 - ) - shift := uint32(32 - 8) - for tableSize := 1 << 8; tableSize < maxTableSize && tableSize < len(src); tableSize *= 2 { - shift-- - } - // In Go, all array elements are zero-initialized, so there is no advantage - // to a smaller tableSize per se. However, it matches the C++ algorithm, - // and in the asm versions of this code, we can get away with zeroing only - // the first tableSize elements. - var table [maxTableSize]uint16 - - // sLimit is when to stop looking for offset/length copies. The inputMargin - // lets us use a fast path for emitLiteral in the main loop, while we are - // looking for copies. - sLimit := len(src) - inputMargin - - // nextEmit is where in src the next emitLiteral should start from. - nextEmit := 0 - - // The encoded form must start with a literal, as there are no previous - // bytes to copy, so we start looking for hash matches at s == 1. - s := 1 - nextHash := hash(load32(src, s), shift) - - for { - // Copied from the C++ snappy implementation: - // - // Heuristic match skipping: If 32 bytes are scanned with no matches - // found, start looking only at every other byte. If 32 more bytes are - // scanned (or skipped), look at every third byte, etc.. When a match - // is found, immediately go back to looking at every byte. This is a - // small loss (~5% performance, ~0.1% density) for compressible data - // due to more bookkeeping, but for non-compressible data (such as - // JPEG) it's a huge win since the compressor quickly "realizes" the - // data is incompressible and doesn't bother looking for matches - // everywhere. - // - // The "skip" variable keeps track of how many bytes there are since - // the last match; dividing it by 32 (ie. right-shifting by five) gives - // the number of bytes to move ahead for each iteration. - skip := 32 - - nextS := s - candidate := 0 - for { - s = nextS - bytesBetweenHashLookups := skip >> 5 - nextS = s + bytesBetweenHashLookups - skip += bytesBetweenHashLookups - if nextS > sLimit { - goto emitRemainder - } - candidate = int(table[nextHash&tableMask]) - table[nextHash&tableMask] = uint16(s) - nextHash = hash(load32(src, nextS), shift) - if load32(src, s) == load32(src, candidate) { - break - } - } - - // A 4-byte match has been found. We'll later see if more than 4 bytes - // match. But, prior to the match, src[nextEmit:s] are unmatched. Emit - // them as literal bytes. - d += emitLiteral(dst[d:], src[nextEmit:s]) - - // Call emitCopy, and then see if another emitCopy could be our next - // move. Repeat until we find no match for the input immediately after - // what was consumed by the last emitCopy call. - // - // If we exit this loop normally then we need to call emitLiteral next, - // though we don't yet know how big the literal will be. We handle that - // by proceeding to the next iteration of the main loop. We also can - // exit this loop via goto if we get close to exhausting the input. - for { - // Invariant: we have a 4-byte match at s, and no need to emit any - // literal bytes prior to s. - base := s - - // Extend the 4-byte match as long as possible. - // - // This is an inlined version of: - // s = extendMatch(src, candidate+4, s+4) - s += 4 - for i := candidate + 4; s < len(src) && src[i] == src[s]; i, s = i+1, s+1 { - } - - d += emitCopy(dst[d:], base-candidate, s-base) - nextEmit = s - if s >= sLimit { - goto emitRemainder - } - - // We could immediately start working at s now, but to improve - // compression we first update the hash table at s-1 and at s. If - // another emitCopy is not our next move, also calculate nextHash - // at s+1. At least on GOARCH=amd64, these three hash calculations - // are faster as one load64 call (with some shifts) instead of - // three load32 calls. - x := load64(src, s-1) - prevHash := hash(uint32(x>>0), shift) - table[prevHash&tableMask] = uint16(s - 1) - currHash := hash(uint32(x>>8), shift) - candidate = int(table[currHash&tableMask]) - table[currHash&tableMask] = uint16(s) - if uint32(x>>8) != load32(src, candidate) { - nextHash = hash(uint32(x>>16), shift) - s++ - break - } - } - } - -emitRemainder: - if nextEmit < len(src) { - d += emitLiteral(dst[d:], src[nextEmit:]) - } - return d -} diff --git a/vendor/github.com/golang/snappy/snappy.go b/vendor/github.com/golang/snappy/snappy.go deleted file mode 100644 index 0cf5e379c47f..000000000000 --- a/vendor/github.com/golang/snappy/snappy.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2011 The Snappy-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 snappy implements the snappy block-based compression format. -// It aims for very high speeds and reasonable compression. -// -// The C++ snappy implementation is at https://github.com/google/snappy -package snappy // import "github.com/golang/snappy" - -import ( - "hash/crc32" -) - -/* -Each encoded block begins with the varint-encoded length of the decoded data, -followed by a sequence of chunks. Chunks begin and end on byte boundaries. The -first byte of each chunk is broken into its 2 least and 6 most significant bits -called l and m: l ranges in [0, 4) and m ranges in [0, 64). l is the chunk tag. -Zero means a literal tag. All other values mean a copy tag. - -For literal tags: - - If m < 60, the next 1 + m bytes are literal bytes. - - Otherwise, let n be the little-endian unsigned integer denoted by the next - m - 59 bytes. The next 1 + n bytes after that are literal bytes. - -For copy tags, length bytes are copied from offset bytes ago, in the style of -Lempel-Ziv compression algorithms. In particular: - - For l == 1, the offset ranges in [0, 1<<11) and the length in [4, 12). - The length is 4 + the low 3 bits of m. The high 3 bits of m form bits 8-10 - of the offset. The next byte is bits 0-7 of the offset. - - For l == 2, the offset ranges in [0, 1<<16) and the length in [1, 65). - The length is 1 + m. The offset is the little-endian unsigned integer - denoted by the next 2 bytes. - - For l == 3, this tag is a legacy format that is no longer issued by most - encoders. Nonetheless, the offset ranges in [0, 1<<32) and the length in - [1, 65). The length is 1 + m. The offset is the little-endian unsigned - integer denoted by the next 4 bytes. -*/ -const ( - tagLiteral = 0x00 - tagCopy1 = 0x01 - tagCopy2 = 0x02 - tagCopy4 = 0x03 -) - -const ( - checksumSize = 4 - chunkHeaderSize = 4 - magicChunk = "\xff\x06\x00\x00" + magicBody - magicBody = "sNaPpY" - - // maxBlockSize is the maximum size of the input to encodeBlock. It is not - // part of the wire format per se, but some parts of the encoder assume - // that an offset fits into a uint16. - // - // Also, for the framing format (Writer type instead of Encode function), - // https://github.com/google/snappy/blob/master/framing_format.txt says - // that "the uncompressed data in a chunk must be no longer than 65536 - // bytes". - maxBlockSize = 65536 - - // maxEncodedLenOfMaxBlockSize equals MaxEncodedLen(maxBlockSize), but is - // hard coded to be a const instead of a variable, so that obufLen can also - // be a const. Their equivalence is confirmed by - // TestMaxEncodedLenOfMaxBlockSize. - maxEncodedLenOfMaxBlockSize = 76490 - - obufHeaderLen = len(magicChunk) + checksumSize + chunkHeaderSize - obufLen = obufHeaderLen + maxEncodedLenOfMaxBlockSize -) - -const ( - chunkTypeCompressedData = 0x00 - chunkTypeUncompressedData = 0x01 - chunkTypePadding = 0xfe - chunkTypeStreamIdentifier = 0xff -) - -var crcTable = crc32.MakeTable(crc32.Castagnoli) - -// crc implements the checksum specified in section 3 of -// https://github.com/google/snappy/blob/master/framing_format.txt -func crc(b []byte) uint32 { - c := crc32.Update(0, crcTable, b) - return uint32(c>>15|c<<17) + 0xa282ead8 -} diff --git a/vendor/github.com/hashicorp/golang-lru/2q.go b/vendor/github.com/hashicorp/golang-lru/2q.go deleted file mode 100644 index 337d963296cd..000000000000 --- a/vendor/github.com/hashicorp/golang-lru/2q.go +++ /dev/null @@ -1,212 +0,0 @@ -package lru - -import ( - "fmt" - "sync" - - "github.com/hashicorp/golang-lru/simplelru" -) - -const ( - // Default2QRecentRatio is the ratio of the 2Q cache dedicated - // to recently added entries that have only been accessed once. - Default2QRecentRatio = 0.25 - - // Default2QGhostEntries is the default ratio of ghost - // entries kept to track entries recently evicted - Default2QGhostEntries = 0.50 -) - -// TwoQueueCache is a thread-safe fixed size 2Q cache. -// 2Q is an enhancement over the standard LRU cache -// in that it tracks both frequently and recently used -// entries separately. This avoids a burst in access to new -// entries from evicting frequently used entries. It adds some -// additional tracking overhead to the standard LRU cache, and is -// computationally about 2x the cost, and adds some metadata over -// head. The ARCCache is similar, but does not require setting any -// parameters. -type TwoQueueCache struct { - size int - recentSize int - - recent *simplelru.LRU - frequent *simplelru.LRU - recentEvict *simplelru.LRU - lock sync.RWMutex -} - -// New2Q creates a new TwoQueueCache using the default -// values for the parameters. -func New2Q(size int) (*TwoQueueCache, error) { - return New2QParams(size, Default2QRecentRatio, Default2QGhostEntries) -} - -// New2QParams creates a new TwoQueueCache using the provided -// parameter values. -func New2QParams(size int, recentRatio float64, ghostRatio float64) (*TwoQueueCache, error) { - if size <= 0 { - return nil, fmt.Errorf("invalid size") - } - if recentRatio < 0.0 || recentRatio > 1.0 { - return nil, fmt.Errorf("invalid recent ratio") - } - if ghostRatio < 0.0 || ghostRatio > 1.0 { - return nil, fmt.Errorf("invalid ghost ratio") - } - - // Determine the sub-sizes - recentSize := int(float64(size) * recentRatio) - evictSize := int(float64(size) * ghostRatio) - - // Allocate the LRUs - recent, err := simplelru.NewLRU(size, nil) - if err != nil { - return nil, err - } - frequent, err := simplelru.NewLRU(size, nil) - if err != nil { - return nil, err - } - recentEvict, err := simplelru.NewLRU(evictSize, nil) - if err != nil { - return nil, err - } - - // Initialize the cache - c := &TwoQueueCache{ - size: size, - recentSize: recentSize, - recent: recent, - frequent: frequent, - recentEvict: recentEvict, - } - return c, nil -} - -func (c *TwoQueueCache) Get(key interface{}) (interface{}, bool) { - c.lock.Lock() - defer c.lock.Unlock() - - // Check if this is a frequent value - if val, ok := c.frequent.Get(key); ok { - return val, ok - } - - // If the value is contained in recent, then we - // promote it to frequent - if val, ok := c.recent.Peek(key); ok { - c.recent.Remove(key) - c.frequent.Add(key, val) - return val, ok - } - - // No hit - return nil, false -} - -func (c *TwoQueueCache) Add(key, value interface{}) { - c.lock.Lock() - defer c.lock.Unlock() - - // Check if the value is frequently used already, - // and just update the value - if c.frequent.Contains(key) { - c.frequent.Add(key, value) - return - } - - // Check if the value is recently used, and promote - // the value into the frequent list - if c.recent.Contains(key) { - c.recent.Remove(key) - c.frequent.Add(key, value) - return - } - - // If the value was recently evicted, add it to the - // frequently used list - if c.recentEvict.Contains(key) { - c.ensureSpace(true) - c.recentEvict.Remove(key) - c.frequent.Add(key, value) - return - } - - // Add to the recently seen list - c.ensureSpace(false) - c.recent.Add(key, value) - return -} - -// ensureSpace is used to ensure we have space in the cache -func (c *TwoQueueCache) ensureSpace(recentEvict bool) { - // If we have space, nothing to do - recentLen := c.recent.Len() - freqLen := c.frequent.Len() - if recentLen+freqLen < c.size { - return - } - - // If the recent buffer is larger than - // the target, evict from there - if recentLen > 0 && (recentLen > c.recentSize || (recentLen == c.recentSize && !recentEvict)) { - k, _, _ := c.recent.RemoveOldest() - c.recentEvict.Add(k, nil) - return - } - - // Remove from the frequent list otherwise - c.frequent.RemoveOldest() -} - -func (c *TwoQueueCache) Len() int { - c.lock.RLock() - defer c.lock.RUnlock() - return c.recent.Len() + c.frequent.Len() -} - -func (c *TwoQueueCache) Keys() []interface{} { - c.lock.RLock() - defer c.lock.RUnlock() - k1 := c.frequent.Keys() - k2 := c.recent.Keys() - return append(k1, k2...) -} - -func (c *TwoQueueCache) Remove(key interface{}) { - c.lock.Lock() - defer c.lock.Unlock() - if c.frequent.Remove(key) { - return - } - if c.recent.Remove(key) { - return - } - if c.recentEvict.Remove(key) { - return - } -} - -func (c *TwoQueueCache) Purge() { - c.lock.Lock() - defer c.lock.Unlock() - c.recent.Purge() - c.frequent.Purge() - c.recentEvict.Purge() -} - -func (c *TwoQueueCache) Contains(key interface{}) bool { - c.lock.RLock() - defer c.lock.RUnlock() - return c.frequent.Contains(key) || c.recent.Contains(key) -} - -func (c *TwoQueueCache) Peek(key interface{}) (interface{}, bool) { - c.lock.RLock() - defer c.lock.RUnlock() - if val, ok := c.frequent.Peek(key); ok { - return val, ok - } - return c.recent.Peek(key) -} diff --git a/vendor/github.com/hashicorp/golang-lru/LICENSE b/vendor/github.com/hashicorp/golang-lru/LICENSE deleted file mode 100644 index be2cc4dfb609..000000000000 --- a/vendor/github.com/hashicorp/golang-lru/LICENSE +++ /dev/null @@ -1,362 +0,0 @@ -Mozilla Public License, version 2.0 - -1. Definitions - -1.1. "Contributor" - - means each individual or legal entity that creates, contributes to the - creation of, or owns Covered Software. - -1.2. "Contributor Version" - - means the combination of the Contributions of others (if any) used by a - Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - - means Source Code Form to which the initial Contributor has attached the - notice in Exhibit A, the Executable Form of such Source Code Form, and - Modifications of such Source Code Form, in each case including portions - thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - a. that the initial Contributor has attached the notice described in - Exhibit B to the Covered Software; or - - b. that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the terms of - a Secondary License. - -1.6. "Executable Form" - - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - - means a work that combines Covered Software with other material, in a - separate file or files, that is not Covered Software. - -1.8. "License" - - means this document. - -1.9. "Licensable" - - means having the right to grant, to the maximum extent possible, whether - at the time of the initial grant or subsequently, any and all of the - rights conveyed by this License. - -1.10. "Modifications" - - means any of the following: - - a. any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered Software; or - - b. any new file in Source Code Form that contains any Covered Software. - -1.11. "Patent Claims" of a Contributor - - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the License, - by the making, using, selling, offering for sale, having made, import, - or transfer of either its Contributions or its Contributor Version. - -1.12. "Secondary License" - - means either the GNU General Public License, Version 2.0, the GNU Lesser - General Public License, Version 2.1, the GNU Affero General Public - License, Version 3.0, or any later versions of those licenses. - -1.13. "Source Code Form" - - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that controls, is - controlled by, or is under common control with You. For purposes of this - definition, "control" means (a) the power, direct or indirect, to cause - the direction or management of such entity, whether by contract or - otherwise, or (b) ownership of more than fifty percent (50%) of the - outstanding shares or beneficial ownership of such entity. - - -2. License Grants and Conditions - -2.1. Grants - - Each Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: - - a. under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - - b. under Patent Claims of such Contributor to make, use, sell, offer for - sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - - The licenses granted in Section 2.1 with respect to any Contribution - become effective for each Contribution on the date the Contributor first - distributes such Contribution. - -2.3. Limitations on Grant Scope - - The licenses granted in this Section 2 are the only rights granted under - this License. No additional rights or licenses will be implied from the - distribution or licensing of Covered Software under this License. - Notwithstanding Section 2.1(b) above, no patent license is granted by a - Contributor: - - a. for any code that a Contributor has removed from Covered Software; or - - b. for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - - c. under Patent Claims infringed by Covered Software in the absence of - its Contributions. - - This License does not grant any rights in the trademarks, service marks, - or logos of any Contributor (except as may be necessary to comply with - the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - - No Contributor makes additional grants as a result of Your choice to - distribute the Covered Software under a subsequent version of this - License (see Section 10.2) or under the terms of a Secondary License (if - permitted under the terms of Section 3.3). - -2.5. Representation - - Each Contributor represents that the Contributor believes its - Contributions are its original creation(s) or it has sufficient rights to - grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - - This License is not intended to limit any rights You have under - applicable copyright doctrines of fair use, fair dealing, or other - equivalents. - -2.7. Conditions - - Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in - Section 2.1. - - -3. Responsibilities - -3.1. Distribution of Source Form - - All distribution of Covered Software in Source Code Form, including any - Modifications that You create or to which You contribute, must be under - the terms of this License. You must inform recipients that the Source - Code Form of the Covered Software is governed by the terms of this - License, and how they can obtain a copy of this License. You may not - attempt to alter or restrict the recipients' rights in the Source Code - Form. - -3.2. Distribution of Executable Form - - If You distribute Covered Software in Executable Form then: - - a. such Covered Software must also be made available in Source Code Form, - as described in Section 3.1, and You must inform recipients of the - Executable Form how they can obtain a copy of such Source Code Form by - reasonable means in a timely manner, at a charge no more than the cost - of distribution to the recipient; and - - b. You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter the - recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - - You may create and distribute a Larger Work under terms of Your choice, - provided that You also comply with the requirements of this License for - the Covered Software. If the Larger Work is a combination of Covered - Software with a work governed by one or more Secondary Licenses, and the - Covered Software is not Incompatible With Secondary Licenses, this - License permits You to additionally distribute such Covered Software - under the terms of such Secondary License(s), so that the recipient of - the Larger Work may, at their option, further distribute the Covered - Software under the terms of either this License or such Secondary - License(s). - -3.4. Notices - - You may not remove or alter the substance of any license notices - (including copyright notices, patent notices, disclaimers of warranty, or - limitations of liability) contained within the Source Code Form of the - Covered Software, except that You may alter any license notices to the - extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - - You may choose to offer, and to charge a fee for, warranty, support, - indemnity or liability obligations to one or more recipients of Covered - Software. However, You may do so only on Your own behalf, and not on - behalf of any Contributor. You must make it absolutely clear that any - such warranty, support, indemnity, or liability obligation is offered by - You alone, and You hereby agree to indemnify every Contributor for any - liability incurred by such Contributor as a result of warranty, support, - indemnity or liability terms You offer. You may include additional - disclaimers of warranty and limitations of liability specific to any - jurisdiction. - -4. Inability to Comply Due to Statute or Regulation - - If it is impossible for You to comply with any of the terms of this License - with respect to some or all of the Covered Software due to statute, - judicial order, or regulation then You must: (a) comply with the terms of - this License to the maximum extent possible; and (b) describe the - limitations and the code they affect. Such description must be placed in a - text file included with all distributions of the Covered Software under - this License. Except to the extent prohibited by statute or regulation, - such description must be sufficiently detailed for a recipient of ordinary - skill to be able to understand it. - -5. Termination - -5.1. The rights granted under this License will terminate automatically if You - fail to comply with any of its terms. However, if You become compliant, - then the rights granted under this License from a particular Contributor - are reinstated (a) provisionally, unless and until such Contributor - explicitly and finally terminates Your grants, and (b) on an ongoing - basis, if such Contributor fails to notify You of the non-compliance by - some reasonable means prior to 60 days after You have come back into - compliance. Moreover, Your grants from a particular Contributor are - reinstated on an ongoing basis if such Contributor notifies You of the - non-compliance by some reasonable means, this is the first time You have - received notice of non-compliance with this License from such - Contributor, and You become compliant prior to 30 days after Your receipt - of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent - infringement claim (excluding declaratory judgment actions, - counter-claims, and cross-claims) alleging that a Contributor Version - directly or indirectly infringes any patent, then the rights granted to - You by any and all Contributors for the Covered Software under Section - 2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user - license agreements (excluding distributors and resellers) which have been - validly granted by You or Your distributors under this License prior to - termination shall survive termination. - -6. Disclaimer of Warranty - - Covered Software is provided under this License on an "as is" basis, - without warranty of any kind, either expressed, implied, or statutory, - including, without limitation, warranties that the Covered Software is free - of defects, merchantable, fit for a particular purpose or non-infringing. - The entire risk as to the quality and performance of the Covered Software - is with You. Should any Covered Software prove defective in any respect, - You (not any Contributor) assume the cost of any necessary servicing, - repair, or correction. This disclaimer of warranty constitutes an essential - part of this License. No use of any Covered Software is authorized under - this License except under this disclaimer. - -7. Limitation of Liability - - Under no circumstances and under no legal theory, whether tort (including - negligence), contract, or otherwise, shall any Contributor, or anyone who - distributes Covered Software as permitted above, be liable to You for any - direct, indirect, special, incidental, or consequential damages of any - character including, without limitation, damages for lost profits, loss of - goodwill, work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses, even if such party shall have been - informed of the possibility of such damages. This limitation of liability - shall not apply to liability for death or personal injury resulting from - such party's negligence to the extent applicable law prohibits such - limitation. Some jurisdictions do not allow the exclusion or limitation of - incidental or consequential damages, so this exclusion and limitation may - not apply to You. - -8. Litigation - - Any litigation relating to this License may be brought only in the courts - of a jurisdiction where the defendant maintains its principal place of - business and such litigation shall be governed by laws of that - jurisdiction, without reference to its conflict-of-law provisions. Nothing - in this Section shall prevent a party's ability to bring cross-claims or - counter-claims. - -9. Miscellaneous - - This License represents the complete agreement concerning the subject - matter hereof. If any provision of this License is held to be - unenforceable, such provision shall be reformed only to the extent - necessary to make it enforceable. Any law or regulation which provides that - the language of a contract shall be construed against the drafter shall not - be used to construe this License against a Contributor. - - -10. Versions of the License - -10.1. New Versions - - Mozilla Foundation is the license steward. Except as provided in Section - 10.3, no one other than the license steward has the right to modify or - publish new versions of this License. Each version will be given a - distinguishing version number. - -10.2. Effect of New Versions - - You may distribute the Covered Software under the terms of the version - of the License under which You originally received the Covered Software, - or under the terms of any subsequent version published by the license - steward. - -10.3. Modified Versions - - If you create software not governed by this License, and you want to - create a new license for such software, you may create and use a - modified version of this License if you rename the license and remove - any references to the name of the license steward (except to note that - such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary - Licenses If You choose to distribute Source Code Form that is - Incompatible With Secondary Licenses under the terms of this version of - the License, the notice described in Exhibit B of this License must be - attached. - -Exhibit A - Source Code Form License Notice - - This Source Code Form is subject to the - terms of the Mozilla Public License, v. - 2.0. If a copy of the MPL was not - distributed with this file, You can - obtain one at - http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular file, -then You may include the notice in a location (such as a LICENSE file in a -relevant directory) where a recipient would be likely to look for such a -notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice - - This Source Code Form is "Incompatible - With Secondary Licenses", as defined by - the Mozilla Public License, v. 2.0. diff --git a/vendor/github.com/hashicorp/golang-lru/README.md b/vendor/github.com/hashicorp/golang-lru/README.md deleted file mode 100644 index 33e58cfaf97e..000000000000 --- a/vendor/github.com/hashicorp/golang-lru/README.md +++ /dev/null @@ -1,25 +0,0 @@ -golang-lru -========== - -This provides the `lru` package which implements a fixed-size -thread safe LRU cache. It is based on the cache in Groupcache. - -Documentation -============= - -Full docs are available on [Godoc](http://godoc.org/github.com/hashicorp/golang-lru) - -Example -======= - -Using the LRU is very simple: - -```go -l, _ := New(128) -for i := 0; i < 256; i++ { - l.Add(i, nil) -} -if l.Len() != 128 { - panic(fmt.Sprintf("bad len: %v", l.Len())) -} -``` diff --git a/vendor/github.com/hashicorp/golang-lru/arc.go b/vendor/github.com/hashicorp/golang-lru/arc.go deleted file mode 100644 index a2a252817333..000000000000 --- a/vendor/github.com/hashicorp/golang-lru/arc.go +++ /dev/null @@ -1,257 +0,0 @@ -package lru - -import ( - "sync" - - "github.com/hashicorp/golang-lru/simplelru" -) - -// ARCCache is a thread-safe fixed size Adaptive Replacement Cache (ARC). -// ARC is an enhancement over the standard LRU cache in that tracks both -// frequency and recency of use. This avoids a burst in access to new -// entries from evicting the frequently used older entries. It adds some -// additional tracking overhead to a standard LRU cache, computationally -// it is roughly 2x the cost, and the extra memory overhead is linear -// with the size of the cache. ARC has been patented by IBM, but is -// similar to the TwoQueueCache (2Q) which requires setting parameters. -type ARCCache struct { - size int // Size is the total capacity of the cache - p int // P is the dynamic preference towards T1 or T2 - - t1 *simplelru.LRU // T1 is the LRU for recently accessed items - b1 *simplelru.LRU // B1 is the LRU for evictions from t1 - - t2 *simplelru.LRU // T2 is the LRU for frequently accessed items - b2 *simplelru.LRU // B2 is the LRU for evictions from t2 - - lock sync.RWMutex -} - -// NewARC creates an ARC of the given size -func NewARC(size int) (*ARCCache, error) { - // Create the sub LRUs - b1, err := simplelru.NewLRU(size, nil) - if err != nil { - return nil, err - } - b2, err := simplelru.NewLRU(size, nil) - if err != nil { - return nil, err - } - t1, err := simplelru.NewLRU(size, nil) - if err != nil { - return nil, err - } - t2, err := simplelru.NewLRU(size, nil) - if err != nil { - return nil, err - } - - // Initialize the ARC - c := &ARCCache{ - size: size, - p: 0, - t1: t1, - b1: b1, - t2: t2, - b2: b2, - } - return c, nil -} - -// Get looks up a key's value from the cache. -func (c *ARCCache) Get(key interface{}) (interface{}, bool) { - c.lock.Lock() - defer c.lock.Unlock() - - // Ff the value is contained in T1 (recent), then - // promote it to T2 (frequent) - if val, ok := c.t1.Peek(key); ok { - c.t1.Remove(key) - c.t2.Add(key, val) - return val, ok - } - - // Check if the value is contained in T2 (frequent) - if val, ok := c.t2.Get(key); ok { - return val, ok - } - - // No hit - return nil, false -} - -// Add adds a value to the cache. -func (c *ARCCache) Add(key, value interface{}) { - c.lock.Lock() - defer c.lock.Unlock() - - // Check if the value is contained in T1 (recent), and potentially - // promote it to frequent T2 - if c.t1.Contains(key) { - c.t1.Remove(key) - c.t2.Add(key, value) - return - } - - // Check if the value is already in T2 (frequent) and update it - if c.t2.Contains(key) { - c.t2.Add(key, value) - return - } - - // Check if this value was recently evicted as part of the - // recently used list - if c.b1.Contains(key) { - // T1 set is too small, increase P appropriately - delta := 1 - b1Len := c.b1.Len() - b2Len := c.b2.Len() - if b2Len > b1Len { - delta = b2Len / b1Len - } - if c.p+delta >= c.size { - c.p = c.size - } else { - c.p += delta - } - - // Potentially need to make room in the cache - if c.t1.Len()+c.t2.Len() >= c.size { - c.replace(false) - } - - // Remove from B1 - c.b1.Remove(key) - - // Add the key to the frequently used list - c.t2.Add(key, value) - return - } - - // Check if this value was recently evicted as part of the - // frequently used list - if c.b2.Contains(key) { - // T2 set is too small, decrease P appropriately - delta := 1 - b1Len := c.b1.Len() - b2Len := c.b2.Len() - if b1Len > b2Len { - delta = b1Len / b2Len - } - if delta >= c.p { - c.p = 0 - } else { - c.p -= delta - } - - // Potentially need to make room in the cache - if c.t1.Len()+c.t2.Len() >= c.size { - c.replace(true) - } - - // Remove from B2 - c.b2.Remove(key) - - // Add the key to the frequntly used list - c.t2.Add(key, value) - return - } - - // Potentially need to make room in the cache - if c.t1.Len()+c.t2.Len() >= c.size { - c.replace(false) - } - - // Keep the size of the ghost buffers trim - if c.b1.Len() > c.size-c.p { - c.b1.RemoveOldest() - } - if c.b2.Len() > c.p { - c.b2.RemoveOldest() - } - - // Add to the recently seen list - c.t1.Add(key, value) - return -} - -// replace is used to adaptively evict from either T1 or T2 -// based on the current learned value of P -func (c *ARCCache) replace(b2ContainsKey bool) { - t1Len := c.t1.Len() - if t1Len > 0 && (t1Len > c.p || (t1Len == c.p && b2ContainsKey)) { - k, _, ok := c.t1.RemoveOldest() - if ok { - c.b1.Add(k, nil) - } - } else { - k, _, ok := c.t2.RemoveOldest() - if ok { - c.b2.Add(k, nil) - } - } -} - -// Len returns the number of cached entries -func (c *ARCCache) Len() int { - c.lock.RLock() - defer c.lock.RUnlock() - return c.t1.Len() + c.t2.Len() -} - -// Keys returns all the cached keys -func (c *ARCCache) Keys() []interface{} { - c.lock.RLock() - defer c.lock.RUnlock() - k1 := c.t1.Keys() - k2 := c.t2.Keys() - return append(k1, k2...) -} - -// Remove is used to purge a key from the cache -func (c *ARCCache) Remove(key interface{}) { - c.lock.Lock() - defer c.lock.Unlock() - if c.t1.Remove(key) { - return - } - if c.t2.Remove(key) { - return - } - if c.b1.Remove(key) { - return - } - if c.b2.Remove(key) { - return - } -} - -// Purge is used to clear the cache -func (c *ARCCache) Purge() { - c.lock.Lock() - defer c.lock.Unlock() - c.t1.Purge() - c.t2.Purge() - c.b1.Purge() - c.b2.Purge() -} - -// Contains is used to check if the cache contains a key -// without updating recency or frequency. -func (c *ARCCache) Contains(key interface{}) bool { - c.lock.RLock() - defer c.lock.RUnlock() - return c.t1.Contains(key) || c.t2.Contains(key) -} - -// Peek is used to inspect the cache value of a key -// without updating recency or frequency. -func (c *ARCCache) Peek(key interface{}) (interface{}, bool) { - c.lock.RLock() - defer c.lock.RUnlock() - if val, ok := c.t1.Peek(key); ok { - return val, ok - } - return c.t2.Peek(key) -} diff --git a/vendor/github.com/hashicorp/golang-lru/lru.go b/vendor/github.com/hashicorp/golang-lru/lru.go deleted file mode 100644 index a6285f989e0a..000000000000 --- a/vendor/github.com/hashicorp/golang-lru/lru.go +++ /dev/null @@ -1,114 +0,0 @@ -// This package provides a simple LRU cache. It is based on the -// LRU implementation in groupcache: -// https://github.com/golang/groupcache/tree/master/lru -package lru - -import ( - "sync" - - "github.com/hashicorp/golang-lru/simplelru" -) - -// Cache is a thread-safe fixed size LRU cache. -type Cache struct { - lru *simplelru.LRU - lock sync.RWMutex -} - -// New creates an LRU of the given size -func New(size int) (*Cache, error) { - return NewWithEvict(size, nil) -} - -// NewWithEvict constructs a fixed size cache with the given eviction -// callback. -func NewWithEvict(size int, onEvicted func(key interface{}, value interface{})) (*Cache, error) { - lru, err := simplelru.NewLRU(size, simplelru.EvictCallback(onEvicted)) - if err != nil { - return nil, err - } - c := &Cache{ - lru: lru, - } - return c, nil -} - -// Purge is used to completely clear the cache -func (c *Cache) Purge() { - c.lock.Lock() - c.lru.Purge() - c.lock.Unlock() -} - -// Add adds a value to the cache. Returns true if an eviction occurred. -func (c *Cache) Add(key, value interface{}) bool { - c.lock.Lock() - defer c.lock.Unlock() - return c.lru.Add(key, value) -} - -// Get looks up a key's value from the cache. -func (c *Cache) Get(key interface{}) (interface{}, bool) { - c.lock.Lock() - defer c.lock.Unlock() - return c.lru.Get(key) -} - -// Check if a key is in the cache, without updating the recent-ness -// or deleting it for being stale. -func (c *Cache) Contains(key interface{}) bool { - c.lock.RLock() - defer c.lock.RUnlock() - return c.lru.Contains(key) -} - -// Returns the key value (or undefined if not found) without updating -// the "recently used"-ness of the key. -func (c *Cache) Peek(key interface{}) (interface{}, bool) { - c.lock.RLock() - defer c.lock.RUnlock() - return c.lru.Peek(key) -} - -// ContainsOrAdd checks if a key is in the cache without updating the -// recent-ness or deleting it for being stale, and if not, adds the value. -// Returns whether found and whether an eviction occurred. -func (c *Cache) ContainsOrAdd(key, value interface{}) (ok, evict bool) { - c.lock.Lock() - defer c.lock.Unlock() - - if c.lru.Contains(key) { - return true, false - } else { - evict := c.lru.Add(key, value) - return false, evict - } -} - -// Remove removes the provided key from the cache. -func (c *Cache) Remove(key interface{}) { - c.lock.Lock() - c.lru.Remove(key) - c.lock.Unlock() -} - -// RemoveOldest removes the oldest item from the cache. -func (c *Cache) RemoveOldest() { - c.lock.Lock() - c.lru.RemoveOldest() - c.lock.Unlock() -} - -// Keys returns a slice of the keys in the cache, from oldest to newest. -func (c *Cache) Keys() []interface{} { - c.lock.RLock() - defer c.lock.RUnlock() - return c.lru.Keys() -} - -// Len returns the number of items in the cache. -func (c *Cache) Len() int { - c.lock.RLock() - defer c.lock.RUnlock() - return c.lru.Len() -} diff --git a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go b/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go deleted file mode 100644 index cb416b394f27..000000000000 --- a/vendor/github.com/hashicorp/golang-lru/simplelru/lru.go +++ /dev/null @@ -1,160 +0,0 @@ -package simplelru - -import ( - "container/list" - "errors" -) - -// EvictCallback is used to get a callback when a cache entry is evicted -type EvictCallback func(key interface{}, value interface{}) - -// LRU implements a non-thread safe fixed size LRU cache -type LRU struct { - size int - evictList *list.List - items map[interface{}]*list.Element - onEvict EvictCallback -} - -// entry is used to hold a value in the evictList -type entry struct { - key interface{} - value interface{} -} - -// NewLRU constructs an LRU of the given size -func NewLRU(size int, onEvict EvictCallback) (*LRU, error) { - if size <= 0 { - return nil, errors.New("Must provide a positive size") - } - c := &LRU{ - size: size, - evictList: list.New(), - items: make(map[interface{}]*list.Element), - onEvict: onEvict, - } - return c, nil -} - -// Purge is used to completely clear the cache -func (c *LRU) Purge() { - for k, v := range c.items { - if c.onEvict != nil { - c.onEvict(k, v.Value.(*entry).value) - } - delete(c.items, k) - } - c.evictList.Init() -} - -// Add adds a value to the cache. Returns true if an eviction occurred. -func (c *LRU) Add(key, value interface{}) bool { - // Check for existing item - if ent, ok := c.items[key]; ok { - c.evictList.MoveToFront(ent) - ent.Value.(*entry).value = value - return false - } - - // Add new item - ent := &entry{key, value} - entry := c.evictList.PushFront(ent) - c.items[key] = entry - - evict := c.evictList.Len() > c.size - // Verify size not exceeded - if evict { - c.removeOldest() - } - return evict -} - -// Get looks up a key's value from the cache. -func (c *LRU) Get(key interface{}) (value interface{}, ok bool) { - if ent, ok := c.items[key]; ok { - c.evictList.MoveToFront(ent) - return ent.Value.(*entry).value, true - } - return -} - -// Check if a key is in the cache, without updating the recent-ness -// or deleting it for being stale. -func (c *LRU) Contains(key interface{}) (ok bool) { - _, ok = c.items[key] - return ok -} - -// Returns the key value (or undefined if not found) without updating -// the "recently used"-ness of the key. -func (c *LRU) Peek(key interface{}) (value interface{}, ok bool) { - if ent, ok := c.items[key]; ok { - return ent.Value.(*entry).value, true - } - return nil, ok -} - -// Remove removes the provided key from the cache, returning if the -// key was contained. -func (c *LRU) Remove(key interface{}) bool { - if ent, ok := c.items[key]; ok { - c.removeElement(ent) - return true - } - return false -} - -// RemoveOldest removes the oldest item from the cache. -func (c *LRU) RemoveOldest() (interface{}, interface{}, bool) { - ent := c.evictList.Back() - if ent != nil { - c.removeElement(ent) - kv := ent.Value.(*entry) - return kv.key, kv.value, true - } - return nil, nil, false -} - -// GetOldest returns the oldest entry -func (c *LRU) GetOldest() (interface{}, interface{}, bool) { - ent := c.evictList.Back() - if ent != nil { - kv := ent.Value.(*entry) - return kv.key, kv.value, true - } - return nil, nil, false -} - -// Keys returns a slice of the keys in the cache, from oldest to newest. -func (c *LRU) Keys() []interface{} { - keys := make([]interface{}, len(c.items)) - i := 0 - for ent := c.evictList.Back(); ent != nil; ent = ent.Prev() { - keys[i] = ent.Value.(*entry).key - i++ - } - return keys -} - -// Len returns the number of items in the cache. -func (c *LRU) Len() int { - return c.evictList.Len() -} - -// removeOldest removes the oldest item from the cache. -func (c *LRU) removeOldest() { - ent := c.evictList.Back() - if ent != nil { - c.removeElement(ent) - } -} - -// removeElement is used to remove a given list element from the cache -func (c *LRU) removeElement(e *list.Element) { - c.evictList.Remove(e) - kv := e.Value.(*entry) - delete(c.items, kv.key) - if c.onEvict != nil { - c.onEvict(kv.key, kv.value) - } -} diff --git a/vendor/github.com/huin/goupnp/LICENSE b/vendor/github.com/huin/goupnp/LICENSE deleted file mode 100644 index 252e3d639784..000000000000 --- a/vendor/github.com/huin/goupnp/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2013, John Beisley -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. - -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/huin/goupnp/README.md b/vendor/github.com/huin/goupnp/README.md deleted file mode 100644 index 433ba5c68258..000000000000 --- a/vendor/github.com/huin/goupnp/README.md +++ /dev/null @@ -1,44 +0,0 @@ -goupnp is a UPnP client library for Go - -Installation ------------- - -Run `go get -u github.com/huin/goupnp`. - -Documentation -------------- - -Supported DCPs (you probably want to start with one of these): - -* [![GoDoc](https://godoc.org/github.com/huin/goupnp?status.svg) av1](https://godoc.org/github.com/huin/goupnp/dcps/av1) - Client for UPnP Device Control Protocol MediaServer v1 and MediaRenderer v1. -* [![GoDoc](https://godoc.org/github.com/huin/goupnp?status.svg) internetgateway1](https://godoc.org/github.com/huin/goupnp/dcps/internetgateway1) - Client for UPnP Device Control Protocol Internet Gateway Device v1. -* [![GoDoc](https://godoc.org/github.com/huin/goupnp?status.svg) internetgateway2](https://godoc.org/github.com/huin/goupnp/dcps/internetgateway2) - Client for UPnP Device Control Protocol Internet Gateway Device v2. - -Core components: - -* [![GoDoc](https://godoc.org/github.com/huin/goupnp?status.svg) (goupnp)](https://godoc.org/github.com/huin/goupnp) core library - contains datastructures and utilities typically used by the implemented DCPs. -* [![GoDoc](https://godoc.org/github.com/huin/goupnp?status.svg) httpu](https://godoc.org/github.com/huin/goupnp/httpu) HTTPU implementation, underlies SSDP. -* [![GoDoc](https://godoc.org/github.com/huin/goupnp?status.svg) ssdp](https://godoc.org/github.com/huin/goupnp/ssdp) SSDP client implementation (simple service discovery protocol) - used to discover UPnP services on a network. -* [![GoDoc](https://godoc.org/github.com/huin/goupnp?status.svg) soap](https://godoc.org/github.com/huin/goupnp/soap) SOAP client implementation (simple object access protocol) - used to communicate with discovered services. - - -Regenerating dcps generated source code: ----------------------------------------- - -1. Install gotasks: `go get -u github.com/jingweno/gotask` -2. Change to the gotasks directory: `cd gotasks` -3. Run specgen task: `gotask specgen` - -Supporting additional UPnP devices and services: ------------------------------------------------- - -Supporting additional services is, in the trivial case, simply a matter of -adding the service to the `dcpMetadata` whitelist in `gotasks/specgen_task.go`, -regenerating the source code (see above), and committing that source code. - -However, it would be helpful if anyone needing such a service could test the -service against the service they have, and then reporting any trouble -encountered as an [issue on this -project](https://github.com/huin/goupnp/issues/new). If it just works, then -please report at least minimal working functionality as an issue, and -optionally contribute the metadata upstream. diff --git a/vendor/github.com/huin/goupnp/dcps/internetgateway1/internetgateway1.go b/vendor/github.com/huin/goupnp/dcps/internetgateway1/internetgateway1.go deleted file mode 100644 index 1e0802cd4e2c..000000000000 --- a/vendor/github.com/huin/goupnp/dcps/internetgateway1/internetgateway1.go +++ /dev/null @@ -1,3717 +0,0 @@ -// Client for UPnP Device Control Protocol Internet Gateway Device v1. -// -// This DCP is documented in detail at: http://upnp.org/specs/gw/UPnP-gw-InternetGatewayDevice-v1-Device.pdf -// -// Typically, use one of the New* functions to create clients for services. -package internetgateway1 - -// Generated file - do not edit by hand. See README.md - -import ( - "net/url" - "time" - - "github.com/huin/goupnp" - "github.com/huin/goupnp/soap" -) - -// Hack to avoid Go complaining if time isn't used. -var _ time.Time - -// Device URNs: -const ( - URN_LANDevice_1 = "urn:schemas-upnp-org:device:LANDevice:1" - URN_WANConnectionDevice_1 = "urn:schemas-upnp-org:device:WANConnectionDevice:1" - URN_WANDevice_1 = "urn:schemas-upnp-org:device:WANDevice:1" -) - -// Service URNs: -const ( - URN_LANHostConfigManagement_1 = "urn:schemas-upnp-org:service:LANHostConfigManagement:1" - URN_Layer3Forwarding_1 = "urn:schemas-upnp-org:service:Layer3Forwarding:1" - URN_WANCableLinkConfig_1 = "urn:schemas-upnp-org:service:WANCableLinkConfig:1" - URN_WANCommonInterfaceConfig_1 = "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1" - URN_WANDSLLinkConfig_1 = "urn:schemas-upnp-org:service:WANDSLLinkConfig:1" - URN_WANEthernetLinkConfig_1 = "urn:schemas-upnp-org:service:WANEthernetLinkConfig:1" - URN_WANIPConnection_1 = "urn:schemas-upnp-org:service:WANIPConnection:1" - URN_WANPOTSLinkConfig_1 = "urn:schemas-upnp-org:service:WANPOTSLinkConfig:1" - URN_WANPPPConnection_1 = "urn:schemas-upnp-org:service:WANPPPConnection:1" -) - -// LANHostConfigManagement1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:LANHostConfigManagement:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type LANHostConfigManagement1 struct { - goupnp.ServiceClient -} - -// NewLANHostConfigManagement1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewLANHostConfigManagement1Clients() (clients []*LANHostConfigManagement1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_LANHostConfigManagement_1); err != nil { - return - } - clients = newLANHostConfigManagement1ClientsFromGenericClients(genericClients) - return -} - -// NewLANHostConfigManagement1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewLANHostConfigManagement1ClientsByURL(loc *url.URL) ([]*LANHostConfigManagement1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_LANHostConfigManagement_1) - if err != nil { - return nil, err - } - return newLANHostConfigManagement1ClientsFromGenericClients(genericClients), nil -} - -// NewLANHostConfigManagement1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewLANHostConfigManagement1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*LANHostConfigManagement1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_LANHostConfigManagement_1) - if err != nil { - return nil, err - } - return newLANHostConfigManagement1ClientsFromGenericClients(genericClients), nil -} - -func newLANHostConfigManagement1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*LANHostConfigManagement1 { - clients := make([]*LANHostConfigManagement1, len(genericClients)) - for i := range genericClients { - clients[i] = &LANHostConfigManagement1{genericClients[i]} - } - return clients -} - -func (client *LANHostConfigManagement1) SetDHCPServerConfigurable(NewDHCPServerConfigurable bool) (err error) { - // Request structure. - request := &struct { - NewDHCPServerConfigurable string - }{} - // BEGIN Marshal arguments into request. - - if request.NewDHCPServerConfigurable, err = soap.MarshalBoolean(NewDHCPServerConfigurable); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetDHCPServerConfigurable", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetDHCPServerConfigurable() (NewDHCPServerConfigurable bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDHCPServerConfigurable string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetDHCPServerConfigurable", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDHCPServerConfigurable, err = soap.UnmarshalBoolean(response.NewDHCPServerConfigurable); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) SetDHCPRelay(NewDHCPRelay bool) (err error) { - // Request structure. - request := &struct { - NewDHCPRelay string - }{} - // BEGIN Marshal arguments into request. - - if request.NewDHCPRelay, err = soap.MarshalBoolean(NewDHCPRelay); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetDHCPRelay", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetDHCPRelay() (NewDHCPRelay bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDHCPRelay string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetDHCPRelay", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDHCPRelay, err = soap.UnmarshalBoolean(response.NewDHCPRelay); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) SetSubnetMask(NewSubnetMask string) (err error) { - // Request structure. - request := &struct { - NewSubnetMask string - }{} - // BEGIN Marshal arguments into request. - - if request.NewSubnetMask, err = soap.MarshalString(NewSubnetMask); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetSubnetMask", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetSubnetMask() (NewSubnetMask string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewSubnetMask string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetSubnetMask", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewSubnetMask, err = soap.UnmarshalString(response.NewSubnetMask); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) SetIPRouter(NewIPRouters string) (err error) { - // Request structure. - request := &struct { - NewIPRouters string - }{} - // BEGIN Marshal arguments into request. - - if request.NewIPRouters, err = soap.MarshalString(NewIPRouters); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetIPRouter", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) DeleteIPRouter(NewIPRouters string) (err error) { - // Request structure. - request := &struct { - NewIPRouters string - }{} - // BEGIN Marshal arguments into request. - - if request.NewIPRouters, err = soap.MarshalString(NewIPRouters); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "DeleteIPRouter", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetIPRoutersList() (NewIPRouters string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewIPRouters string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetIPRoutersList", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewIPRouters, err = soap.UnmarshalString(response.NewIPRouters); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) SetDomainName(NewDomainName string) (err error) { - // Request structure. - request := &struct { - NewDomainName string - }{} - // BEGIN Marshal arguments into request. - - if request.NewDomainName, err = soap.MarshalString(NewDomainName); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetDomainName", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetDomainName() (NewDomainName string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDomainName string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetDomainName", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDomainName, err = soap.UnmarshalString(response.NewDomainName); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) SetAddressRange(NewMinAddress string, NewMaxAddress string) (err error) { - // Request structure. - request := &struct { - NewMinAddress string - - NewMaxAddress string - }{} - // BEGIN Marshal arguments into request. - - if request.NewMinAddress, err = soap.MarshalString(NewMinAddress); err != nil { - return - } - if request.NewMaxAddress, err = soap.MarshalString(NewMaxAddress); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetAddressRange", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetAddressRange() (NewMinAddress string, NewMaxAddress string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewMinAddress string - - NewMaxAddress string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetAddressRange", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewMinAddress, err = soap.UnmarshalString(response.NewMinAddress); err != nil { - return - } - if NewMaxAddress, err = soap.UnmarshalString(response.NewMaxAddress); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) SetReservedAddress(NewReservedAddresses string) (err error) { - // Request structure. - request := &struct { - NewReservedAddresses string - }{} - // BEGIN Marshal arguments into request. - - if request.NewReservedAddresses, err = soap.MarshalString(NewReservedAddresses); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetReservedAddress", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) DeleteReservedAddress(NewReservedAddresses string) (err error) { - // Request structure. - request := &struct { - NewReservedAddresses string - }{} - // BEGIN Marshal arguments into request. - - if request.NewReservedAddresses, err = soap.MarshalString(NewReservedAddresses); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "DeleteReservedAddress", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetReservedAddresses() (NewReservedAddresses string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewReservedAddresses string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetReservedAddresses", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewReservedAddresses, err = soap.UnmarshalString(response.NewReservedAddresses); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) SetDNSServer(NewDNSServers string) (err error) { - // Request structure. - request := &struct { - NewDNSServers string - }{} - // BEGIN Marshal arguments into request. - - if request.NewDNSServers, err = soap.MarshalString(NewDNSServers); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetDNSServer", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) DeleteDNSServer(NewDNSServers string) (err error) { - // Request structure. - request := &struct { - NewDNSServers string - }{} - // BEGIN Marshal arguments into request. - - if request.NewDNSServers, err = soap.MarshalString(NewDNSServers); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "DeleteDNSServer", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetDNSServers() (NewDNSServers string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDNSServers string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetDNSServers", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDNSServers, err = soap.UnmarshalString(response.NewDNSServers); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// Layer3Forwarding1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:Layer3Forwarding:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type Layer3Forwarding1 struct { - goupnp.ServiceClient -} - -// NewLayer3Forwarding1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewLayer3Forwarding1Clients() (clients []*Layer3Forwarding1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_Layer3Forwarding_1); err != nil { - return - } - clients = newLayer3Forwarding1ClientsFromGenericClients(genericClients) - return -} - -// NewLayer3Forwarding1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewLayer3Forwarding1ClientsByURL(loc *url.URL) ([]*Layer3Forwarding1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_Layer3Forwarding_1) - if err != nil { - return nil, err - } - return newLayer3Forwarding1ClientsFromGenericClients(genericClients), nil -} - -// NewLayer3Forwarding1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewLayer3Forwarding1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*Layer3Forwarding1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_Layer3Forwarding_1) - if err != nil { - return nil, err - } - return newLayer3Forwarding1ClientsFromGenericClients(genericClients), nil -} - -func newLayer3Forwarding1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*Layer3Forwarding1 { - clients := make([]*Layer3Forwarding1, len(genericClients)) - for i := range genericClients { - clients[i] = &Layer3Forwarding1{genericClients[i]} - } - return clients -} - -func (client *Layer3Forwarding1) SetDefaultConnectionService(NewDefaultConnectionService string) (err error) { - // Request structure. - request := &struct { - NewDefaultConnectionService string - }{} - // BEGIN Marshal arguments into request. - - if request.NewDefaultConnectionService, err = soap.MarshalString(NewDefaultConnectionService); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_Layer3Forwarding_1, "SetDefaultConnectionService", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *Layer3Forwarding1) GetDefaultConnectionService() (NewDefaultConnectionService string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDefaultConnectionService string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_Layer3Forwarding_1, "GetDefaultConnectionService", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDefaultConnectionService, err = soap.UnmarshalString(response.NewDefaultConnectionService); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANCableLinkConfig1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANCableLinkConfig:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANCableLinkConfig1 struct { - goupnp.ServiceClient -} - -// NewWANCableLinkConfig1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANCableLinkConfig1Clients() (clients []*WANCableLinkConfig1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANCableLinkConfig_1); err != nil { - return - } - clients = newWANCableLinkConfig1ClientsFromGenericClients(genericClients) - return -} - -// NewWANCableLinkConfig1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANCableLinkConfig1ClientsByURL(loc *url.URL) ([]*WANCableLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANCableLinkConfig_1) - if err != nil { - return nil, err - } - return newWANCableLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -// NewWANCableLinkConfig1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANCableLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANCableLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANCableLinkConfig_1) - if err != nil { - return nil, err - } - return newWANCableLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -func newWANCableLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANCableLinkConfig1 { - clients := make([]*WANCableLinkConfig1, len(genericClients)) - for i := range genericClients { - clients[i] = &WANCableLinkConfig1{genericClients[i]} - } - return clients -} - -// -// Return values: -// -// * NewCableLinkConfigState: allowed values: notReady, dsSyncComplete, usParamAcquired, rangingComplete, ipComplete, todEstablished, paramTransferComplete, registrationComplete, operational, accessDenied -// -// * NewLinkType: allowed values: Ethernet -func (client *WANCableLinkConfig1) GetCableLinkConfigInfo() (NewCableLinkConfigState string, NewLinkType string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewCableLinkConfigState string - - NewLinkType string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetCableLinkConfigInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewCableLinkConfigState, err = soap.UnmarshalString(response.NewCableLinkConfigState); err != nil { - return - } - if NewLinkType, err = soap.UnmarshalString(response.NewLinkType); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCableLinkConfig1) GetDownstreamFrequency() (NewDownstreamFrequency uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDownstreamFrequency string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetDownstreamFrequency", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDownstreamFrequency, err = soap.UnmarshalUi4(response.NewDownstreamFrequency); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewDownstreamModulation: allowed values: 64QAM, 256QAM -func (client *WANCableLinkConfig1) GetDownstreamModulation() (NewDownstreamModulation string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDownstreamModulation string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetDownstreamModulation", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDownstreamModulation, err = soap.UnmarshalString(response.NewDownstreamModulation); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCableLinkConfig1) GetUpstreamFrequency() (NewUpstreamFrequency uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewUpstreamFrequency string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetUpstreamFrequency", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewUpstreamFrequency, err = soap.UnmarshalUi4(response.NewUpstreamFrequency); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewUpstreamModulation: allowed values: QPSK, 16QAM -func (client *WANCableLinkConfig1) GetUpstreamModulation() (NewUpstreamModulation string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewUpstreamModulation string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetUpstreamModulation", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewUpstreamModulation, err = soap.UnmarshalString(response.NewUpstreamModulation); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCableLinkConfig1) GetUpstreamChannelID() (NewUpstreamChannelID uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewUpstreamChannelID string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetUpstreamChannelID", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewUpstreamChannelID, err = soap.UnmarshalUi4(response.NewUpstreamChannelID); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCableLinkConfig1) GetUpstreamPowerLevel() (NewUpstreamPowerLevel uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewUpstreamPowerLevel string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetUpstreamPowerLevel", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewUpstreamPowerLevel, err = soap.UnmarshalUi4(response.NewUpstreamPowerLevel); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCableLinkConfig1) GetBPIEncryptionEnabled() (NewBPIEncryptionEnabled bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewBPIEncryptionEnabled string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetBPIEncryptionEnabled", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewBPIEncryptionEnabled, err = soap.UnmarshalBoolean(response.NewBPIEncryptionEnabled); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCableLinkConfig1) GetConfigFile() (NewConfigFile string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewConfigFile string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetConfigFile", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewConfigFile, err = soap.UnmarshalString(response.NewConfigFile); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCableLinkConfig1) GetTFTPServer() (NewTFTPServer string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewTFTPServer string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetTFTPServer", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewTFTPServer, err = soap.UnmarshalString(response.NewTFTPServer); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANCommonInterfaceConfig1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANCommonInterfaceConfig1 struct { - goupnp.ServiceClient -} - -// NewWANCommonInterfaceConfig1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANCommonInterfaceConfig1Clients() (clients []*WANCommonInterfaceConfig1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANCommonInterfaceConfig_1); err != nil { - return - } - clients = newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients) - return -} - -// NewWANCommonInterfaceConfig1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANCommonInterfaceConfig1ClientsByURL(loc *url.URL) ([]*WANCommonInterfaceConfig1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANCommonInterfaceConfig_1) - if err != nil { - return nil, err - } - return newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients), nil -} - -// NewWANCommonInterfaceConfig1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANCommonInterfaceConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANCommonInterfaceConfig1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANCommonInterfaceConfig_1) - if err != nil { - return nil, err - } - return newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients), nil -} - -func newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANCommonInterfaceConfig1 { - clients := make([]*WANCommonInterfaceConfig1, len(genericClients)) - for i := range genericClients { - clients[i] = &WANCommonInterfaceConfig1{genericClients[i]} - } - return clients -} - -func (client *WANCommonInterfaceConfig1) SetEnabledForInternet(NewEnabledForInternet bool) (err error) { - // Request structure. - request := &struct { - NewEnabledForInternet string - }{} - // BEGIN Marshal arguments into request. - - if request.NewEnabledForInternet, err = soap.MarshalBoolean(NewEnabledForInternet); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "SetEnabledForInternet", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANCommonInterfaceConfig1) GetEnabledForInternet() (NewEnabledForInternet bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewEnabledForInternet string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetEnabledForInternet", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewEnabledForInternet, err = soap.UnmarshalBoolean(response.NewEnabledForInternet); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewWANAccessType: allowed values: DSL, POTS, Cable, Ethernet -// -// * NewPhysicalLinkStatus: allowed values: Up, Down -func (client *WANCommonInterfaceConfig1) GetCommonLinkProperties() (NewWANAccessType string, NewLayer1UpstreamMaxBitRate uint32, NewLayer1DownstreamMaxBitRate uint32, NewPhysicalLinkStatus string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewWANAccessType string - - NewLayer1UpstreamMaxBitRate string - - NewLayer1DownstreamMaxBitRate string - - NewPhysicalLinkStatus string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetCommonLinkProperties", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewWANAccessType, err = soap.UnmarshalString(response.NewWANAccessType); err != nil { - return - } - if NewLayer1UpstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewLayer1UpstreamMaxBitRate); err != nil { - return - } - if NewLayer1DownstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewLayer1DownstreamMaxBitRate); err != nil { - return - } - if NewPhysicalLinkStatus, err = soap.UnmarshalString(response.NewPhysicalLinkStatus); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCommonInterfaceConfig1) GetWANAccessProvider() (NewWANAccessProvider string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewWANAccessProvider string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetWANAccessProvider", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewWANAccessProvider, err = soap.UnmarshalString(response.NewWANAccessProvider); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewMaximumActiveConnections: allowed value range: minimum=1, step=1 -func (client *WANCommonInterfaceConfig1) GetMaximumActiveConnections() (NewMaximumActiveConnections uint16, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewMaximumActiveConnections string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetMaximumActiveConnections", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewMaximumActiveConnections, err = soap.UnmarshalUi2(response.NewMaximumActiveConnections); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCommonInterfaceConfig1) GetTotalBytesSent() (NewTotalBytesSent uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewTotalBytesSent string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetTotalBytesSent", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewTotalBytesSent, err = soap.UnmarshalUi4(response.NewTotalBytesSent); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCommonInterfaceConfig1) GetTotalBytesReceived() (NewTotalBytesReceived uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewTotalBytesReceived string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetTotalBytesReceived", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewTotalBytesReceived, err = soap.UnmarshalUi4(response.NewTotalBytesReceived); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCommonInterfaceConfig1) GetTotalPacketsSent() (NewTotalPacketsSent uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewTotalPacketsSent string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetTotalPacketsSent", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewTotalPacketsSent, err = soap.UnmarshalUi4(response.NewTotalPacketsSent); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCommonInterfaceConfig1) GetTotalPacketsReceived() (NewTotalPacketsReceived uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewTotalPacketsReceived string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetTotalPacketsReceived", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewTotalPacketsReceived, err = soap.UnmarshalUi4(response.NewTotalPacketsReceived); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCommonInterfaceConfig1) GetActiveConnection(NewActiveConnectionIndex uint16) (NewActiveConnDeviceContainer string, NewActiveConnectionServiceID string, err error) { - // Request structure. - request := &struct { - NewActiveConnectionIndex string - }{} - // BEGIN Marshal arguments into request. - - if request.NewActiveConnectionIndex, err = soap.MarshalUi2(NewActiveConnectionIndex); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewActiveConnDeviceContainer string - - NewActiveConnectionServiceID string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetActiveConnection", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewActiveConnDeviceContainer, err = soap.UnmarshalString(response.NewActiveConnDeviceContainer); err != nil { - return - } - if NewActiveConnectionServiceID, err = soap.UnmarshalString(response.NewActiveConnectionServiceID); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANDSLLinkConfig1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANDSLLinkConfig:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANDSLLinkConfig1 struct { - goupnp.ServiceClient -} - -// NewWANDSLLinkConfig1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANDSLLinkConfig1Clients() (clients []*WANDSLLinkConfig1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANDSLLinkConfig_1); err != nil { - return - } - clients = newWANDSLLinkConfig1ClientsFromGenericClients(genericClients) - return -} - -// NewWANDSLLinkConfig1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANDSLLinkConfig1ClientsByURL(loc *url.URL) ([]*WANDSLLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANDSLLinkConfig_1) - if err != nil { - return nil, err - } - return newWANDSLLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -// NewWANDSLLinkConfig1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANDSLLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANDSLLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANDSLLinkConfig_1) - if err != nil { - return nil, err - } - return newWANDSLLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -func newWANDSLLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANDSLLinkConfig1 { - clients := make([]*WANDSLLinkConfig1, len(genericClients)) - for i := range genericClients { - clients[i] = &WANDSLLinkConfig1{genericClients[i]} - } - return clients -} - -func (client *WANDSLLinkConfig1) SetDSLLinkType(NewLinkType string) (err error) { - // Request structure. - request := &struct { - NewLinkType string - }{} - // BEGIN Marshal arguments into request. - - if request.NewLinkType, err = soap.MarshalString(NewLinkType); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "SetDSLLinkType", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewLinkStatus: allowed values: Up, Down -func (client *WANDSLLinkConfig1) GetDSLLinkInfo() (NewLinkType string, NewLinkStatus string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewLinkType string - - NewLinkStatus string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "GetDSLLinkInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewLinkType, err = soap.UnmarshalString(response.NewLinkType); err != nil { - return - } - if NewLinkStatus, err = soap.UnmarshalString(response.NewLinkStatus); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) GetAutoConfig() (NewAutoConfig bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewAutoConfig string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "GetAutoConfig", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewAutoConfig, err = soap.UnmarshalBoolean(response.NewAutoConfig); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) GetModulationType() (NewModulationType string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewModulationType string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "GetModulationType", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewModulationType, err = soap.UnmarshalString(response.NewModulationType); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) SetDestinationAddress(NewDestinationAddress string) (err error) { - // Request structure. - request := &struct { - NewDestinationAddress string - }{} - // BEGIN Marshal arguments into request. - - if request.NewDestinationAddress, err = soap.MarshalString(NewDestinationAddress); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "SetDestinationAddress", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) GetDestinationAddress() (NewDestinationAddress string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDestinationAddress string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "GetDestinationAddress", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDestinationAddress, err = soap.UnmarshalString(response.NewDestinationAddress); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) SetATMEncapsulation(NewATMEncapsulation string) (err error) { - // Request structure. - request := &struct { - NewATMEncapsulation string - }{} - // BEGIN Marshal arguments into request. - - if request.NewATMEncapsulation, err = soap.MarshalString(NewATMEncapsulation); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "SetATMEncapsulation", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) GetATMEncapsulation() (NewATMEncapsulation string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewATMEncapsulation string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "GetATMEncapsulation", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewATMEncapsulation, err = soap.UnmarshalString(response.NewATMEncapsulation); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) SetFCSPreserved(NewFCSPreserved bool) (err error) { - // Request structure. - request := &struct { - NewFCSPreserved string - }{} - // BEGIN Marshal arguments into request. - - if request.NewFCSPreserved, err = soap.MarshalBoolean(NewFCSPreserved); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "SetFCSPreserved", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) GetFCSPreserved() (NewFCSPreserved bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewFCSPreserved string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "GetFCSPreserved", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewFCSPreserved, err = soap.UnmarshalBoolean(response.NewFCSPreserved); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANEthernetLinkConfig1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANEthernetLinkConfig:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANEthernetLinkConfig1 struct { - goupnp.ServiceClient -} - -// NewWANEthernetLinkConfig1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANEthernetLinkConfig1Clients() (clients []*WANEthernetLinkConfig1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANEthernetLinkConfig_1); err != nil { - return - } - clients = newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients) - return -} - -// NewWANEthernetLinkConfig1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANEthernetLinkConfig1ClientsByURL(loc *url.URL) ([]*WANEthernetLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANEthernetLinkConfig_1) - if err != nil { - return nil, err - } - return newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -// NewWANEthernetLinkConfig1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANEthernetLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANEthernetLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANEthernetLinkConfig_1) - if err != nil { - return nil, err - } - return newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -func newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANEthernetLinkConfig1 { - clients := make([]*WANEthernetLinkConfig1, len(genericClients)) - for i := range genericClients { - clients[i] = &WANEthernetLinkConfig1{genericClients[i]} - } - return clients -} - -// -// Return values: -// -// * NewEthernetLinkStatus: allowed values: Up, Down -func (client *WANEthernetLinkConfig1) GetEthernetLinkStatus() (NewEthernetLinkStatus string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewEthernetLinkStatus string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANEthernetLinkConfig_1, "GetEthernetLinkStatus", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewEthernetLinkStatus, err = soap.UnmarshalString(response.NewEthernetLinkStatus); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANIPConnection1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANIPConnection:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANIPConnection1 struct { - goupnp.ServiceClient -} - -// NewWANIPConnection1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANIPConnection1Clients() (clients []*WANIPConnection1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANIPConnection_1); err != nil { - return - } - clients = newWANIPConnection1ClientsFromGenericClients(genericClients) - return -} - -// NewWANIPConnection1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANIPConnection1ClientsByURL(loc *url.URL) ([]*WANIPConnection1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANIPConnection_1) - if err != nil { - return nil, err - } - return newWANIPConnection1ClientsFromGenericClients(genericClients), nil -} - -// NewWANIPConnection1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANIPConnection1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANIPConnection1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANIPConnection_1) - if err != nil { - return nil, err - } - return newWANIPConnection1ClientsFromGenericClients(genericClients), nil -} - -func newWANIPConnection1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANIPConnection1 { - clients := make([]*WANIPConnection1, len(genericClients)) - for i := range genericClients { - clients[i] = &WANIPConnection1{genericClients[i]} - } - return clients -} - -func (client *WANIPConnection1) SetConnectionType(NewConnectionType string) (err error) { - // Request structure. - request := &struct { - NewConnectionType string - }{} - // BEGIN Marshal arguments into request. - - if request.NewConnectionType, err = soap.MarshalString(NewConnectionType); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "SetConnectionType", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewPossibleConnectionTypes: allowed values: Unconfigured, IP_Routed, IP_Bridged -func (client *WANIPConnection1) GetConnectionTypeInfo() (NewConnectionType string, NewPossibleConnectionTypes string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewConnectionType string - - NewPossibleConnectionTypes string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetConnectionTypeInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewConnectionType, err = soap.UnmarshalString(response.NewConnectionType); err != nil { - return - } - if NewPossibleConnectionTypes, err = soap.UnmarshalString(response.NewPossibleConnectionTypes); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) RequestConnection() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "RequestConnection", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) RequestTermination() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "RequestTermination", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) ForceTermination() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "ForceTermination", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) SetAutoDisconnectTime(NewAutoDisconnectTime uint32) (err error) { - // Request structure. - request := &struct { - NewAutoDisconnectTime string - }{} - // BEGIN Marshal arguments into request. - - if request.NewAutoDisconnectTime, err = soap.MarshalUi4(NewAutoDisconnectTime); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "SetAutoDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) SetIdleDisconnectTime(NewIdleDisconnectTime uint32) (err error) { - // Request structure. - request := &struct { - NewIdleDisconnectTime string - }{} - // BEGIN Marshal arguments into request. - - if request.NewIdleDisconnectTime, err = soap.MarshalUi4(NewIdleDisconnectTime); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "SetIdleDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) SetWarnDisconnectDelay(NewWarnDisconnectDelay uint32) (err error) { - // Request structure. - request := &struct { - NewWarnDisconnectDelay string - }{} - // BEGIN Marshal arguments into request. - - if request.NewWarnDisconnectDelay, err = soap.MarshalUi4(NewWarnDisconnectDelay); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "SetWarnDisconnectDelay", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewConnectionStatus: allowed values: Unconfigured, Connected, Disconnected -// -// * NewLastConnectionError: allowed values: ERROR_NONE -func (client *WANIPConnection1) GetStatusInfo() (NewConnectionStatus string, NewLastConnectionError string, NewUptime uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewConnectionStatus string - - NewLastConnectionError string - - NewUptime string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetStatusInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewConnectionStatus, err = soap.UnmarshalString(response.NewConnectionStatus); err != nil { - return - } - if NewLastConnectionError, err = soap.UnmarshalString(response.NewLastConnectionError); err != nil { - return - } - if NewUptime, err = soap.UnmarshalUi4(response.NewUptime); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) GetAutoDisconnectTime() (NewAutoDisconnectTime uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewAutoDisconnectTime string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetAutoDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewAutoDisconnectTime, err = soap.UnmarshalUi4(response.NewAutoDisconnectTime); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) GetIdleDisconnectTime() (NewIdleDisconnectTime uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewIdleDisconnectTime string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetIdleDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewIdleDisconnectTime, err = soap.UnmarshalUi4(response.NewIdleDisconnectTime); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) GetWarnDisconnectDelay() (NewWarnDisconnectDelay uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewWarnDisconnectDelay string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetWarnDisconnectDelay", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewWarnDisconnectDelay, err = soap.UnmarshalUi4(response.NewWarnDisconnectDelay); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) GetNATRSIPStatus() (NewRSIPAvailable bool, NewNATEnabled bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewRSIPAvailable string - - NewNATEnabled string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetNATRSIPStatus", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewRSIPAvailable, err = soap.UnmarshalBoolean(response.NewRSIPAvailable); err != nil { - return - } - if NewNATEnabled, err = soap.UnmarshalBoolean(response.NewNATEnabled); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewProtocol: allowed values: TCP, UDP -func (client *WANIPConnection1) GetGenericPortMappingEntry(NewPortMappingIndex uint16) (NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) { - // Request structure. - request := &struct { - NewPortMappingIndex string - }{} - // BEGIN Marshal arguments into request. - - if request.NewPortMappingIndex, err = soap.MarshalUi2(NewPortMappingIndex); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetGenericPortMappingEntry", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewRemoteHost, err = soap.UnmarshalString(response.NewRemoteHost); err != nil { - return - } - if NewExternalPort, err = soap.UnmarshalUi2(response.NewExternalPort); err != nil { - return - } - if NewProtocol, err = soap.UnmarshalString(response.NewProtocol); err != nil { - return - } - if NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil { - return - } - if NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil { - return - } - if NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil { - return - } - if NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil { - return - } - if NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANIPConnection1) GetSpecificPortMappingEntry(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetSpecificPortMappingEntry", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil { - return - } - if NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil { - return - } - if NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil { - return - } - if NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil { - return - } - if NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANIPConnection1) AddPortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32) (err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - if request.NewInternalPort, err = soap.MarshalUi2(NewInternalPort); err != nil { - return - } - if request.NewInternalClient, err = soap.MarshalString(NewInternalClient); err != nil { - return - } - if request.NewEnabled, err = soap.MarshalBoolean(NewEnabled); err != nil { - return - } - if request.NewPortMappingDescription, err = soap.MarshalString(NewPortMappingDescription); err != nil { - return - } - if request.NewLeaseDuration, err = soap.MarshalUi4(NewLeaseDuration); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "AddPortMapping", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANIPConnection1) DeletePortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "DeletePortMapping", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) GetExternalIPAddress() (NewExternalIPAddress string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewExternalIPAddress string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetExternalIPAddress", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewExternalIPAddress, err = soap.UnmarshalString(response.NewExternalIPAddress); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANPOTSLinkConfig1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANPOTSLinkConfig:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANPOTSLinkConfig1 struct { - goupnp.ServiceClient -} - -// NewWANPOTSLinkConfig1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANPOTSLinkConfig1Clients() (clients []*WANPOTSLinkConfig1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANPOTSLinkConfig_1); err != nil { - return - } - clients = newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients) - return -} - -// NewWANPOTSLinkConfig1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANPOTSLinkConfig1ClientsByURL(loc *url.URL) ([]*WANPOTSLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANPOTSLinkConfig_1) - if err != nil { - return nil, err - } - return newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -// NewWANPOTSLinkConfig1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANPOTSLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANPOTSLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANPOTSLinkConfig_1) - if err != nil { - return nil, err - } - return newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -func newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANPOTSLinkConfig1 { - clients := make([]*WANPOTSLinkConfig1, len(genericClients)) - for i := range genericClients { - clients[i] = &WANPOTSLinkConfig1{genericClients[i]} - } - return clients -} - -// -// Arguments: -// -// * NewLinkType: allowed values: PPP_Dialup - -func (client *WANPOTSLinkConfig1) SetISPInfo(NewISPPhoneNumber string, NewISPInfo string, NewLinkType string) (err error) { - // Request structure. - request := &struct { - NewISPPhoneNumber string - - NewISPInfo string - - NewLinkType string - }{} - // BEGIN Marshal arguments into request. - - if request.NewISPPhoneNumber, err = soap.MarshalString(NewISPPhoneNumber); err != nil { - return - } - if request.NewISPInfo, err = soap.MarshalString(NewISPInfo); err != nil { - return - } - if request.NewLinkType, err = soap.MarshalString(NewLinkType); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "SetISPInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPOTSLinkConfig1) SetCallRetryInfo(NewNumberOfRetries uint32, NewDelayBetweenRetries uint32) (err error) { - // Request structure. - request := &struct { - NewNumberOfRetries string - - NewDelayBetweenRetries string - }{} - // BEGIN Marshal arguments into request. - - if request.NewNumberOfRetries, err = soap.MarshalUi4(NewNumberOfRetries); err != nil { - return - } - if request.NewDelayBetweenRetries, err = soap.MarshalUi4(NewDelayBetweenRetries); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "SetCallRetryInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewLinkType: allowed values: PPP_Dialup -func (client *WANPOTSLinkConfig1) GetISPInfo() (NewISPPhoneNumber string, NewISPInfo string, NewLinkType string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewISPPhoneNumber string - - NewISPInfo string - - NewLinkType string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "GetISPInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewISPPhoneNumber, err = soap.UnmarshalString(response.NewISPPhoneNumber); err != nil { - return - } - if NewISPInfo, err = soap.UnmarshalString(response.NewISPInfo); err != nil { - return - } - if NewLinkType, err = soap.UnmarshalString(response.NewLinkType); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPOTSLinkConfig1) GetCallRetryInfo() (NewNumberOfRetries uint32, NewDelayBetweenRetries uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewNumberOfRetries string - - NewDelayBetweenRetries string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "GetCallRetryInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewNumberOfRetries, err = soap.UnmarshalUi4(response.NewNumberOfRetries); err != nil { - return - } - if NewDelayBetweenRetries, err = soap.UnmarshalUi4(response.NewDelayBetweenRetries); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPOTSLinkConfig1) GetFclass() (NewFclass string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewFclass string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "GetFclass", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewFclass, err = soap.UnmarshalString(response.NewFclass); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPOTSLinkConfig1) GetDataModulationSupported() (NewDataModulationSupported string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDataModulationSupported string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "GetDataModulationSupported", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDataModulationSupported, err = soap.UnmarshalString(response.NewDataModulationSupported); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPOTSLinkConfig1) GetDataProtocol() (NewDataProtocol string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDataProtocol string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "GetDataProtocol", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDataProtocol, err = soap.UnmarshalString(response.NewDataProtocol); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPOTSLinkConfig1) GetDataCompression() (NewDataCompression string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDataCompression string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "GetDataCompression", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDataCompression, err = soap.UnmarshalString(response.NewDataCompression); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPOTSLinkConfig1) GetPlusVTRCommandSupported() (NewPlusVTRCommandSupported bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewPlusVTRCommandSupported string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "GetPlusVTRCommandSupported", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewPlusVTRCommandSupported, err = soap.UnmarshalBoolean(response.NewPlusVTRCommandSupported); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANPPPConnection1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANPPPConnection:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANPPPConnection1 struct { - goupnp.ServiceClient -} - -// NewWANPPPConnection1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANPPPConnection1Clients() (clients []*WANPPPConnection1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANPPPConnection_1); err != nil { - return - } - clients = newWANPPPConnection1ClientsFromGenericClients(genericClients) - return -} - -// NewWANPPPConnection1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANPPPConnection1ClientsByURL(loc *url.URL) ([]*WANPPPConnection1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANPPPConnection_1) - if err != nil { - return nil, err - } - return newWANPPPConnection1ClientsFromGenericClients(genericClients), nil -} - -// NewWANPPPConnection1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANPPPConnection1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANPPPConnection1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANPPPConnection_1) - if err != nil { - return nil, err - } - return newWANPPPConnection1ClientsFromGenericClients(genericClients), nil -} - -func newWANPPPConnection1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANPPPConnection1 { - clients := make([]*WANPPPConnection1, len(genericClients)) - for i := range genericClients { - clients[i] = &WANPPPConnection1{genericClients[i]} - } - return clients -} - -func (client *WANPPPConnection1) SetConnectionType(NewConnectionType string) (err error) { - // Request structure. - request := &struct { - NewConnectionType string - }{} - // BEGIN Marshal arguments into request. - - if request.NewConnectionType, err = soap.MarshalString(NewConnectionType); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "SetConnectionType", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewPossibleConnectionTypes: allowed values: Unconfigured, IP_Routed, DHCP_Spoofed, PPPoE_Bridged, PPTP_Relay, L2TP_Relay, PPPoE_Relay -func (client *WANPPPConnection1) GetConnectionTypeInfo() (NewConnectionType string, NewPossibleConnectionTypes string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewConnectionType string - - NewPossibleConnectionTypes string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetConnectionTypeInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewConnectionType, err = soap.UnmarshalString(response.NewConnectionType); err != nil { - return - } - if NewPossibleConnectionTypes, err = soap.UnmarshalString(response.NewPossibleConnectionTypes); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) ConfigureConnection(NewUserName string, NewPassword string) (err error) { - // Request structure. - request := &struct { - NewUserName string - - NewPassword string - }{} - // BEGIN Marshal arguments into request. - - if request.NewUserName, err = soap.MarshalString(NewUserName); err != nil { - return - } - if request.NewPassword, err = soap.MarshalString(NewPassword); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "ConfigureConnection", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) RequestConnection() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "RequestConnection", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) RequestTermination() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "RequestTermination", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) ForceTermination() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "ForceTermination", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) SetAutoDisconnectTime(NewAutoDisconnectTime uint32) (err error) { - // Request structure. - request := &struct { - NewAutoDisconnectTime string - }{} - // BEGIN Marshal arguments into request. - - if request.NewAutoDisconnectTime, err = soap.MarshalUi4(NewAutoDisconnectTime); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "SetAutoDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) SetIdleDisconnectTime(NewIdleDisconnectTime uint32) (err error) { - // Request structure. - request := &struct { - NewIdleDisconnectTime string - }{} - // BEGIN Marshal arguments into request. - - if request.NewIdleDisconnectTime, err = soap.MarshalUi4(NewIdleDisconnectTime); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "SetIdleDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) SetWarnDisconnectDelay(NewWarnDisconnectDelay uint32) (err error) { - // Request structure. - request := &struct { - NewWarnDisconnectDelay string - }{} - // BEGIN Marshal arguments into request. - - if request.NewWarnDisconnectDelay, err = soap.MarshalUi4(NewWarnDisconnectDelay); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "SetWarnDisconnectDelay", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewConnectionStatus: allowed values: Unconfigured, Connected, Disconnected -// -// * NewLastConnectionError: allowed values: ERROR_NONE -func (client *WANPPPConnection1) GetStatusInfo() (NewConnectionStatus string, NewLastConnectionError string, NewUptime uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewConnectionStatus string - - NewLastConnectionError string - - NewUptime string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetStatusInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewConnectionStatus, err = soap.UnmarshalString(response.NewConnectionStatus); err != nil { - return - } - if NewLastConnectionError, err = soap.UnmarshalString(response.NewLastConnectionError); err != nil { - return - } - if NewUptime, err = soap.UnmarshalUi4(response.NewUptime); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetLinkLayerMaxBitRates() (NewUpstreamMaxBitRate uint32, NewDownstreamMaxBitRate uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewUpstreamMaxBitRate string - - NewDownstreamMaxBitRate string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetLinkLayerMaxBitRates", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewUpstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewUpstreamMaxBitRate); err != nil { - return - } - if NewDownstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewDownstreamMaxBitRate); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetPPPEncryptionProtocol() (NewPPPEncryptionProtocol string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewPPPEncryptionProtocol string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetPPPEncryptionProtocol", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewPPPEncryptionProtocol, err = soap.UnmarshalString(response.NewPPPEncryptionProtocol); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetPPPCompressionProtocol() (NewPPPCompressionProtocol string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewPPPCompressionProtocol string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetPPPCompressionProtocol", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewPPPCompressionProtocol, err = soap.UnmarshalString(response.NewPPPCompressionProtocol); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetPPPAuthenticationProtocol() (NewPPPAuthenticationProtocol string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewPPPAuthenticationProtocol string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetPPPAuthenticationProtocol", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewPPPAuthenticationProtocol, err = soap.UnmarshalString(response.NewPPPAuthenticationProtocol); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetUserName() (NewUserName string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewUserName string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetUserName", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewUserName, err = soap.UnmarshalString(response.NewUserName); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetPassword() (NewPassword string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewPassword string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetPassword", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewPassword, err = soap.UnmarshalString(response.NewPassword); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetAutoDisconnectTime() (NewAutoDisconnectTime uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewAutoDisconnectTime string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetAutoDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewAutoDisconnectTime, err = soap.UnmarshalUi4(response.NewAutoDisconnectTime); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetIdleDisconnectTime() (NewIdleDisconnectTime uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewIdleDisconnectTime string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetIdleDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewIdleDisconnectTime, err = soap.UnmarshalUi4(response.NewIdleDisconnectTime); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetWarnDisconnectDelay() (NewWarnDisconnectDelay uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewWarnDisconnectDelay string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetWarnDisconnectDelay", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewWarnDisconnectDelay, err = soap.UnmarshalUi4(response.NewWarnDisconnectDelay); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetNATRSIPStatus() (NewRSIPAvailable bool, NewNATEnabled bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewRSIPAvailable string - - NewNATEnabled string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetNATRSIPStatus", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewRSIPAvailable, err = soap.UnmarshalBoolean(response.NewRSIPAvailable); err != nil { - return - } - if NewNATEnabled, err = soap.UnmarshalBoolean(response.NewNATEnabled); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewProtocol: allowed values: TCP, UDP -func (client *WANPPPConnection1) GetGenericPortMappingEntry(NewPortMappingIndex uint16) (NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) { - // Request structure. - request := &struct { - NewPortMappingIndex string - }{} - // BEGIN Marshal arguments into request. - - if request.NewPortMappingIndex, err = soap.MarshalUi2(NewPortMappingIndex); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetGenericPortMappingEntry", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewRemoteHost, err = soap.UnmarshalString(response.NewRemoteHost); err != nil { - return - } - if NewExternalPort, err = soap.UnmarshalUi2(response.NewExternalPort); err != nil { - return - } - if NewProtocol, err = soap.UnmarshalString(response.NewProtocol); err != nil { - return - } - if NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil { - return - } - if NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil { - return - } - if NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil { - return - } - if NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil { - return - } - if NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANPPPConnection1) GetSpecificPortMappingEntry(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetSpecificPortMappingEntry", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil { - return - } - if NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil { - return - } - if NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil { - return - } - if NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil { - return - } - if NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANPPPConnection1) AddPortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32) (err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - if request.NewInternalPort, err = soap.MarshalUi2(NewInternalPort); err != nil { - return - } - if request.NewInternalClient, err = soap.MarshalString(NewInternalClient); err != nil { - return - } - if request.NewEnabled, err = soap.MarshalBoolean(NewEnabled); err != nil { - return - } - if request.NewPortMappingDescription, err = soap.MarshalString(NewPortMappingDescription); err != nil { - return - } - if request.NewLeaseDuration, err = soap.MarshalUi4(NewLeaseDuration); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "AddPortMapping", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANPPPConnection1) DeletePortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "DeletePortMapping", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetExternalIPAddress() (NewExternalIPAddress string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewExternalIPAddress string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetExternalIPAddress", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewExternalIPAddress, err = soap.UnmarshalString(response.NewExternalIPAddress); err != nil { - return - } - // END Unmarshal arguments from response. - return -} diff --git a/vendor/github.com/huin/goupnp/dcps/internetgateway2/internetgateway2.go b/vendor/github.com/huin/goupnp/dcps/internetgateway2/internetgateway2.go deleted file mode 100644 index 2d67a4a2e2c8..000000000000 --- a/vendor/github.com/huin/goupnp/dcps/internetgateway2/internetgateway2.go +++ /dev/null @@ -1,5378 +0,0 @@ -// Client for UPnP Device Control Protocol Internet Gateway Device v2. -// -// This DCP is documented in detail at: http://upnp.org/specs/gw/UPnP-gw-InternetGatewayDevice-v2-Device.pdf -// -// Typically, use one of the New* functions to create clients for services. -package internetgateway2 - -// Generated file - do not edit by hand. See README.md - -import ( - "net/url" - "time" - - "github.com/huin/goupnp" - "github.com/huin/goupnp/soap" -) - -// Hack to avoid Go complaining if time isn't used. -var _ time.Time - -// Device URNs: -const ( - URN_LANDevice_1 = "urn:schemas-upnp-org:device:LANDevice:1" - URN_WANConnectionDevice_1 = "urn:schemas-upnp-org:device:WANConnectionDevice:1" - URN_WANConnectionDevice_2 = "urn:schemas-upnp-org:device:WANConnectionDevice:2" - URN_WANDevice_1 = "urn:schemas-upnp-org:device:WANDevice:1" - URN_WANDevice_2 = "urn:schemas-upnp-org:device:WANDevice:2" -) - -// Service URNs: -const ( - URN_DeviceProtection_1 = "urn:schemas-upnp-org:service:DeviceProtection:1" - URN_LANHostConfigManagement_1 = "urn:schemas-upnp-org:service:LANHostConfigManagement:1" - URN_Layer3Forwarding_1 = "urn:schemas-upnp-org:service:Layer3Forwarding:1" - URN_WANCableLinkConfig_1 = "urn:schemas-upnp-org:service:WANCableLinkConfig:1" - URN_WANCommonInterfaceConfig_1 = "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1" - URN_WANDSLLinkConfig_1 = "urn:schemas-upnp-org:service:WANDSLLinkConfig:1" - URN_WANEthernetLinkConfig_1 = "urn:schemas-upnp-org:service:WANEthernetLinkConfig:1" - URN_WANIPConnection_1 = "urn:schemas-upnp-org:service:WANIPConnection:1" - URN_WANIPConnection_2 = "urn:schemas-upnp-org:service:WANIPConnection:2" - URN_WANIPv6FirewallControl_1 = "urn:schemas-upnp-org:service:WANIPv6FirewallControl:1" - URN_WANPOTSLinkConfig_1 = "urn:schemas-upnp-org:service:WANPOTSLinkConfig:1" - URN_WANPPPConnection_1 = "urn:schemas-upnp-org:service:WANPPPConnection:1" -) - -// DeviceProtection1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:DeviceProtection:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type DeviceProtection1 struct { - goupnp.ServiceClient -} - -// NewDeviceProtection1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewDeviceProtection1Clients() (clients []*DeviceProtection1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_DeviceProtection_1); err != nil { - return - } - clients = newDeviceProtection1ClientsFromGenericClients(genericClients) - return -} - -// NewDeviceProtection1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewDeviceProtection1ClientsByURL(loc *url.URL) ([]*DeviceProtection1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_DeviceProtection_1) - if err != nil { - return nil, err - } - return newDeviceProtection1ClientsFromGenericClients(genericClients), nil -} - -// NewDeviceProtection1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewDeviceProtection1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*DeviceProtection1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_DeviceProtection_1) - if err != nil { - return nil, err - } - return newDeviceProtection1ClientsFromGenericClients(genericClients), nil -} - -func newDeviceProtection1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*DeviceProtection1 { - clients := make([]*DeviceProtection1, len(genericClients)) - for i := range genericClients { - clients[i] = &DeviceProtection1{genericClients[i]} - } - return clients -} - -func (client *DeviceProtection1) SendSetupMessage(ProtocolType string, InMessage []byte) (OutMessage []byte, err error) { - // Request structure. - request := &struct { - ProtocolType string - - InMessage string - }{} - // BEGIN Marshal arguments into request. - - if request.ProtocolType, err = soap.MarshalString(ProtocolType); err != nil { - return - } - if request.InMessage, err = soap.MarshalBinBase64(InMessage); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - OutMessage string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, "SendSetupMessage", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if OutMessage, err = soap.UnmarshalBinBase64(response.OutMessage); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *DeviceProtection1) GetSupportedProtocols() (ProtocolList string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - ProtocolList string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, "GetSupportedProtocols", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if ProtocolList, err = soap.UnmarshalString(response.ProtocolList); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *DeviceProtection1) GetAssignedRoles() (RoleList string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - RoleList string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, "GetAssignedRoles", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if RoleList, err = soap.UnmarshalString(response.RoleList); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *DeviceProtection1) GetRolesForAction(DeviceUDN string, ServiceId string, ActionName string) (RoleList string, RestrictedRoleList string, err error) { - // Request structure. - request := &struct { - DeviceUDN string - - ServiceId string - - ActionName string - }{} - // BEGIN Marshal arguments into request. - - if request.DeviceUDN, err = soap.MarshalString(DeviceUDN); err != nil { - return - } - if request.ServiceId, err = soap.MarshalString(ServiceId); err != nil { - return - } - if request.ActionName, err = soap.MarshalString(ActionName); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - RoleList string - - RestrictedRoleList string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, "GetRolesForAction", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if RoleList, err = soap.UnmarshalString(response.RoleList); err != nil { - return - } - if RestrictedRoleList, err = soap.UnmarshalString(response.RestrictedRoleList); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *DeviceProtection1) GetUserLoginChallenge(ProtocolType string, Name string) (Salt []byte, Challenge []byte, err error) { - // Request structure. - request := &struct { - ProtocolType string - - Name string - }{} - // BEGIN Marshal arguments into request. - - if request.ProtocolType, err = soap.MarshalString(ProtocolType); err != nil { - return - } - if request.Name, err = soap.MarshalString(Name); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - Salt string - - Challenge string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, "GetUserLoginChallenge", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if Salt, err = soap.UnmarshalBinBase64(response.Salt); err != nil { - return - } - if Challenge, err = soap.UnmarshalBinBase64(response.Challenge); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *DeviceProtection1) UserLogin(ProtocolType string, Challenge []byte, Authenticator []byte) (err error) { - // Request structure. - request := &struct { - ProtocolType string - - Challenge string - - Authenticator string - }{} - // BEGIN Marshal arguments into request. - - if request.ProtocolType, err = soap.MarshalString(ProtocolType); err != nil { - return - } - if request.Challenge, err = soap.MarshalBinBase64(Challenge); err != nil { - return - } - if request.Authenticator, err = soap.MarshalBinBase64(Authenticator); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, "UserLogin", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *DeviceProtection1) UserLogout() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, "UserLogout", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *DeviceProtection1) GetACLData() (ACL string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - ACL string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, "GetACLData", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if ACL, err = soap.UnmarshalString(response.ACL); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *DeviceProtection1) AddIdentityList(IdentityList string) (IdentityListResult string, err error) { - // Request structure. - request := &struct { - IdentityList string - }{} - // BEGIN Marshal arguments into request. - - if request.IdentityList, err = soap.MarshalString(IdentityList); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - IdentityListResult string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, "AddIdentityList", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if IdentityListResult, err = soap.UnmarshalString(response.IdentityListResult); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *DeviceProtection1) RemoveIdentity(Identity string) (err error) { - // Request structure. - request := &struct { - Identity string - }{} - // BEGIN Marshal arguments into request. - - if request.Identity, err = soap.MarshalString(Identity); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, "RemoveIdentity", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *DeviceProtection1) SetUserLoginPassword(ProtocolType string, Name string, Stored []byte, Salt []byte) (err error) { - // Request structure. - request := &struct { - ProtocolType string - - Name string - - Stored string - - Salt string - }{} - // BEGIN Marshal arguments into request. - - if request.ProtocolType, err = soap.MarshalString(ProtocolType); err != nil { - return - } - if request.Name, err = soap.MarshalString(Name); err != nil { - return - } - if request.Stored, err = soap.MarshalBinBase64(Stored); err != nil { - return - } - if request.Salt, err = soap.MarshalBinBase64(Salt); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, "SetUserLoginPassword", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *DeviceProtection1) AddRolesForIdentity(Identity string, RoleList string) (err error) { - // Request structure. - request := &struct { - Identity string - - RoleList string - }{} - // BEGIN Marshal arguments into request. - - if request.Identity, err = soap.MarshalString(Identity); err != nil { - return - } - if request.RoleList, err = soap.MarshalString(RoleList); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, "AddRolesForIdentity", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *DeviceProtection1) RemoveRolesForIdentity(Identity string, RoleList string) (err error) { - // Request structure. - request := &struct { - Identity string - - RoleList string - }{} - // BEGIN Marshal arguments into request. - - if request.Identity, err = soap.MarshalString(Identity); err != nil { - return - } - if request.RoleList, err = soap.MarshalString(RoleList); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_DeviceProtection_1, "RemoveRolesForIdentity", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// LANHostConfigManagement1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:LANHostConfigManagement:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type LANHostConfigManagement1 struct { - goupnp.ServiceClient -} - -// NewLANHostConfigManagement1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewLANHostConfigManagement1Clients() (clients []*LANHostConfigManagement1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_LANHostConfigManagement_1); err != nil { - return - } - clients = newLANHostConfigManagement1ClientsFromGenericClients(genericClients) - return -} - -// NewLANHostConfigManagement1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewLANHostConfigManagement1ClientsByURL(loc *url.URL) ([]*LANHostConfigManagement1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_LANHostConfigManagement_1) - if err != nil { - return nil, err - } - return newLANHostConfigManagement1ClientsFromGenericClients(genericClients), nil -} - -// NewLANHostConfigManagement1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewLANHostConfigManagement1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*LANHostConfigManagement1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_LANHostConfigManagement_1) - if err != nil { - return nil, err - } - return newLANHostConfigManagement1ClientsFromGenericClients(genericClients), nil -} - -func newLANHostConfigManagement1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*LANHostConfigManagement1 { - clients := make([]*LANHostConfigManagement1, len(genericClients)) - for i := range genericClients { - clients[i] = &LANHostConfigManagement1{genericClients[i]} - } - return clients -} - -func (client *LANHostConfigManagement1) SetDHCPServerConfigurable(NewDHCPServerConfigurable bool) (err error) { - // Request structure. - request := &struct { - NewDHCPServerConfigurable string - }{} - // BEGIN Marshal arguments into request. - - if request.NewDHCPServerConfigurable, err = soap.MarshalBoolean(NewDHCPServerConfigurable); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetDHCPServerConfigurable", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetDHCPServerConfigurable() (NewDHCPServerConfigurable bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDHCPServerConfigurable string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetDHCPServerConfigurable", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDHCPServerConfigurable, err = soap.UnmarshalBoolean(response.NewDHCPServerConfigurable); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) SetDHCPRelay(NewDHCPRelay bool) (err error) { - // Request structure. - request := &struct { - NewDHCPRelay string - }{} - // BEGIN Marshal arguments into request. - - if request.NewDHCPRelay, err = soap.MarshalBoolean(NewDHCPRelay); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetDHCPRelay", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetDHCPRelay() (NewDHCPRelay bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDHCPRelay string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetDHCPRelay", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDHCPRelay, err = soap.UnmarshalBoolean(response.NewDHCPRelay); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) SetSubnetMask(NewSubnetMask string) (err error) { - // Request structure. - request := &struct { - NewSubnetMask string - }{} - // BEGIN Marshal arguments into request. - - if request.NewSubnetMask, err = soap.MarshalString(NewSubnetMask); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetSubnetMask", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetSubnetMask() (NewSubnetMask string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewSubnetMask string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetSubnetMask", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewSubnetMask, err = soap.UnmarshalString(response.NewSubnetMask); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) SetIPRouter(NewIPRouters string) (err error) { - // Request structure. - request := &struct { - NewIPRouters string - }{} - // BEGIN Marshal arguments into request. - - if request.NewIPRouters, err = soap.MarshalString(NewIPRouters); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetIPRouter", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) DeleteIPRouter(NewIPRouters string) (err error) { - // Request structure. - request := &struct { - NewIPRouters string - }{} - // BEGIN Marshal arguments into request. - - if request.NewIPRouters, err = soap.MarshalString(NewIPRouters); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "DeleteIPRouter", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetIPRoutersList() (NewIPRouters string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewIPRouters string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetIPRoutersList", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewIPRouters, err = soap.UnmarshalString(response.NewIPRouters); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) SetDomainName(NewDomainName string) (err error) { - // Request structure. - request := &struct { - NewDomainName string - }{} - // BEGIN Marshal arguments into request. - - if request.NewDomainName, err = soap.MarshalString(NewDomainName); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetDomainName", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetDomainName() (NewDomainName string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDomainName string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetDomainName", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDomainName, err = soap.UnmarshalString(response.NewDomainName); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) SetAddressRange(NewMinAddress string, NewMaxAddress string) (err error) { - // Request structure. - request := &struct { - NewMinAddress string - - NewMaxAddress string - }{} - // BEGIN Marshal arguments into request. - - if request.NewMinAddress, err = soap.MarshalString(NewMinAddress); err != nil { - return - } - if request.NewMaxAddress, err = soap.MarshalString(NewMaxAddress); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetAddressRange", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetAddressRange() (NewMinAddress string, NewMaxAddress string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewMinAddress string - - NewMaxAddress string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetAddressRange", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewMinAddress, err = soap.UnmarshalString(response.NewMinAddress); err != nil { - return - } - if NewMaxAddress, err = soap.UnmarshalString(response.NewMaxAddress); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) SetReservedAddress(NewReservedAddresses string) (err error) { - // Request structure. - request := &struct { - NewReservedAddresses string - }{} - // BEGIN Marshal arguments into request. - - if request.NewReservedAddresses, err = soap.MarshalString(NewReservedAddresses); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetReservedAddress", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) DeleteReservedAddress(NewReservedAddresses string) (err error) { - // Request structure. - request := &struct { - NewReservedAddresses string - }{} - // BEGIN Marshal arguments into request. - - if request.NewReservedAddresses, err = soap.MarshalString(NewReservedAddresses); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "DeleteReservedAddress", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetReservedAddresses() (NewReservedAddresses string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewReservedAddresses string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetReservedAddresses", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewReservedAddresses, err = soap.UnmarshalString(response.NewReservedAddresses); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) SetDNSServer(NewDNSServers string) (err error) { - // Request structure. - request := &struct { - NewDNSServers string - }{} - // BEGIN Marshal arguments into request. - - if request.NewDNSServers, err = soap.MarshalString(NewDNSServers); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "SetDNSServer", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) DeleteDNSServer(NewDNSServers string) (err error) { - // Request structure. - request := &struct { - NewDNSServers string - }{} - // BEGIN Marshal arguments into request. - - if request.NewDNSServers, err = soap.MarshalString(NewDNSServers); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "DeleteDNSServer", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *LANHostConfigManagement1) GetDNSServers() (NewDNSServers string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDNSServers string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_LANHostConfigManagement_1, "GetDNSServers", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDNSServers, err = soap.UnmarshalString(response.NewDNSServers); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// Layer3Forwarding1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:Layer3Forwarding:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type Layer3Forwarding1 struct { - goupnp.ServiceClient -} - -// NewLayer3Forwarding1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewLayer3Forwarding1Clients() (clients []*Layer3Forwarding1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_Layer3Forwarding_1); err != nil { - return - } - clients = newLayer3Forwarding1ClientsFromGenericClients(genericClients) - return -} - -// NewLayer3Forwarding1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewLayer3Forwarding1ClientsByURL(loc *url.URL) ([]*Layer3Forwarding1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_Layer3Forwarding_1) - if err != nil { - return nil, err - } - return newLayer3Forwarding1ClientsFromGenericClients(genericClients), nil -} - -// NewLayer3Forwarding1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewLayer3Forwarding1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*Layer3Forwarding1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_Layer3Forwarding_1) - if err != nil { - return nil, err - } - return newLayer3Forwarding1ClientsFromGenericClients(genericClients), nil -} - -func newLayer3Forwarding1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*Layer3Forwarding1 { - clients := make([]*Layer3Forwarding1, len(genericClients)) - for i := range genericClients { - clients[i] = &Layer3Forwarding1{genericClients[i]} - } - return clients -} - -func (client *Layer3Forwarding1) SetDefaultConnectionService(NewDefaultConnectionService string) (err error) { - // Request structure. - request := &struct { - NewDefaultConnectionService string - }{} - // BEGIN Marshal arguments into request. - - if request.NewDefaultConnectionService, err = soap.MarshalString(NewDefaultConnectionService); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_Layer3Forwarding_1, "SetDefaultConnectionService", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *Layer3Forwarding1) GetDefaultConnectionService() (NewDefaultConnectionService string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDefaultConnectionService string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_Layer3Forwarding_1, "GetDefaultConnectionService", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDefaultConnectionService, err = soap.UnmarshalString(response.NewDefaultConnectionService); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANCableLinkConfig1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANCableLinkConfig:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANCableLinkConfig1 struct { - goupnp.ServiceClient -} - -// NewWANCableLinkConfig1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANCableLinkConfig1Clients() (clients []*WANCableLinkConfig1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANCableLinkConfig_1); err != nil { - return - } - clients = newWANCableLinkConfig1ClientsFromGenericClients(genericClients) - return -} - -// NewWANCableLinkConfig1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANCableLinkConfig1ClientsByURL(loc *url.URL) ([]*WANCableLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANCableLinkConfig_1) - if err != nil { - return nil, err - } - return newWANCableLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -// NewWANCableLinkConfig1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANCableLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANCableLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANCableLinkConfig_1) - if err != nil { - return nil, err - } - return newWANCableLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -func newWANCableLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANCableLinkConfig1 { - clients := make([]*WANCableLinkConfig1, len(genericClients)) - for i := range genericClients { - clients[i] = &WANCableLinkConfig1{genericClients[i]} - } - return clients -} - -// -// Return values: -// -// * NewCableLinkConfigState: allowed values: notReady, dsSyncComplete, usParamAcquired, rangingComplete, ipComplete, todEstablished, paramTransferComplete, registrationComplete, operational, accessDenied -// -// * NewLinkType: allowed values: Ethernet -func (client *WANCableLinkConfig1) GetCableLinkConfigInfo() (NewCableLinkConfigState string, NewLinkType string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewCableLinkConfigState string - - NewLinkType string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetCableLinkConfigInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewCableLinkConfigState, err = soap.UnmarshalString(response.NewCableLinkConfigState); err != nil { - return - } - if NewLinkType, err = soap.UnmarshalString(response.NewLinkType); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCableLinkConfig1) GetDownstreamFrequency() (NewDownstreamFrequency uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDownstreamFrequency string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetDownstreamFrequency", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDownstreamFrequency, err = soap.UnmarshalUi4(response.NewDownstreamFrequency); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewDownstreamModulation: allowed values: 64QAM, 256QAM -func (client *WANCableLinkConfig1) GetDownstreamModulation() (NewDownstreamModulation string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDownstreamModulation string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetDownstreamModulation", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDownstreamModulation, err = soap.UnmarshalString(response.NewDownstreamModulation); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCableLinkConfig1) GetUpstreamFrequency() (NewUpstreamFrequency uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewUpstreamFrequency string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetUpstreamFrequency", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewUpstreamFrequency, err = soap.UnmarshalUi4(response.NewUpstreamFrequency); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewUpstreamModulation: allowed values: QPSK, 16QAM -func (client *WANCableLinkConfig1) GetUpstreamModulation() (NewUpstreamModulation string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewUpstreamModulation string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetUpstreamModulation", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewUpstreamModulation, err = soap.UnmarshalString(response.NewUpstreamModulation); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCableLinkConfig1) GetUpstreamChannelID() (NewUpstreamChannelID uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewUpstreamChannelID string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetUpstreamChannelID", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewUpstreamChannelID, err = soap.UnmarshalUi4(response.NewUpstreamChannelID); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCableLinkConfig1) GetUpstreamPowerLevel() (NewUpstreamPowerLevel uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewUpstreamPowerLevel string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetUpstreamPowerLevel", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewUpstreamPowerLevel, err = soap.UnmarshalUi4(response.NewUpstreamPowerLevel); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCableLinkConfig1) GetBPIEncryptionEnabled() (NewBPIEncryptionEnabled bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewBPIEncryptionEnabled string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetBPIEncryptionEnabled", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewBPIEncryptionEnabled, err = soap.UnmarshalBoolean(response.NewBPIEncryptionEnabled); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCableLinkConfig1) GetConfigFile() (NewConfigFile string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewConfigFile string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetConfigFile", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewConfigFile, err = soap.UnmarshalString(response.NewConfigFile); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCableLinkConfig1) GetTFTPServer() (NewTFTPServer string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewTFTPServer string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCableLinkConfig_1, "GetTFTPServer", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewTFTPServer, err = soap.UnmarshalString(response.NewTFTPServer); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANCommonInterfaceConfig1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANCommonInterfaceConfig1 struct { - goupnp.ServiceClient -} - -// NewWANCommonInterfaceConfig1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANCommonInterfaceConfig1Clients() (clients []*WANCommonInterfaceConfig1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANCommonInterfaceConfig_1); err != nil { - return - } - clients = newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients) - return -} - -// NewWANCommonInterfaceConfig1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANCommonInterfaceConfig1ClientsByURL(loc *url.URL) ([]*WANCommonInterfaceConfig1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANCommonInterfaceConfig_1) - if err != nil { - return nil, err - } - return newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients), nil -} - -// NewWANCommonInterfaceConfig1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANCommonInterfaceConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANCommonInterfaceConfig1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANCommonInterfaceConfig_1) - if err != nil { - return nil, err - } - return newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients), nil -} - -func newWANCommonInterfaceConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANCommonInterfaceConfig1 { - clients := make([]*WANCommonInterfaceConfig1, len(genericClients)) - for i := range genericClients { - clients[i] = &WANCommonInterfaceConfig1{genericClients[i]} - } - return clients -} - -func (client *WANCommonInterfaceConfig1) SetEnabledForInternet(NewEnabledForInternet bool) (err error) { - // Request structure. - request := &struct { - NewEnabledForInternet string - }{} - // BEGIN Marshal arguments into request. - - if request.NewEnabledForInternet, err = soap.MarshalBoolean(NewEnabledForInternet); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "SetEnabledForInternet", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANCommonInterfaceConfig1) GetEnabledForInternet() (NewEnabledForInternet bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewEnabledForInternet string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetEnabledForInternet", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewEnabledForInternet, err = soap.UnmarshalBoolean(response.NewEnabledForInternet); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewWANAccessType: allowed values: DSL, POTS, Cable, Ethernet -// -// * NewPhysicalLinkStatus: allowed values: Up, Down -func (client *WANCommonInterfaceConfig1) GetCommonLinkProperties() (NewWANAccessType string, NewLayer1UpstreamMaxBitRate uint32, NewLayer1DownstreamMaxBitRate uint32, NewPhysicalLinkStatus string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewWANAccessType string - - NewLayer1UpstreamMaxBitRate string - - NewLayer1DownstreamMaxBitRate string - - NewPhysicalLinkStatus string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetCommonLinkProperties", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewWANAccessType, err = soap.UnmarshalString(response.NewWANAccessType); err != nil { - return - } - if NewLayer1UpstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewLayer1UpstreamMaxBitRate); err != nil { - return - } - if NewLayer1DownstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewLayer1DownstreamMaxBitRate); err != nil { - return - } - if NewPhysicalLinkStatus, err = soap.UnmarshalString(response.NewPhysicalLinkStatus); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCommonInterfaceConfig1) GetWANAccessProvider() (NewWANAccessProvider string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewWANAccessProvider string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetWANAccessProvider", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewWANAccessProvider, err = soap.UnmarshalString(response.NewWANAccessProvider); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewMaximumActiveConnections: allowed value range: minimum=1, step=1 -func (client *WANCommonInterfaceConfig1) GetMaximumActiveConnections() (NewMaximumActiveConnections uint16, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewMaximumActiveConnections string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetMaximumActiveConnections", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewMaximumActiveConnections, err = soap.UnmarshalUi2(response.NewMaximumActiveConnections); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCommonInterfaceConfig1) GetTotalBytesSent() (NewTotalBytesSent uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewTotalBytesSent string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetTotalBytesSent", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewTotalBytesSent, err = soap.UnmarshalUi4(response.NewTotalBytesSent); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCommonInterfaceConfig1) GetTotalBytesReceived() (NewTotalBytesReceived uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewTotalBytesReceived string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetTotalBytesReceived", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewTotalBytesReceived, err = soap.UnmarshalUi4(response.NewTotalBytesReceived); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCommonInterfaceConfig1) GetTotalPacketsSent() (NewTotalPacketsSent uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewTotalPacketsSent string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetTotalPacketsSent", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewTotalPacketsSent, err = soap.UnmarshalUi4(response.NewTotalPacketsSent); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCommonInterfaceConfig1) GetTotalPacketsReceived() (NewTotalPacketsReceived uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewTotalPacketsReceived string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetTotalPacketsReceived", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewTotalPacketsReceived, err = soap.UnmarshalUi4(response.NewTotalPacketsReceived); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANCommonInterfaceConfig1) GetActiveConnection(NewActiveConnectionIndex uint16) (NewActiveConnDeviceContainer string, NewActiveConnectionServiceID string, err error) { - // Request structure. - request := &struct { - NewActiveConnectionIndex string - }{} - // BEGIN Marshal arguments into request. - - if request.NewActiveConnectionIndex, err = soap.MarshalUi2(NewActiveConnectionIndex); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewActiveConnDeviceContainer string - - NewActiveConnectionServiceID string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANCommonInterfaceConfig_1, "GetActiveConnection", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewActiveConnDeviceContainer, err = soap.UnmarshalString(response.NewActiveConnDeviceContainer); err != nil { - return - } - if NewActiveConnectionServiceID, err = soap.UnmarshalString(response.NewActiveConnectionServiceID); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANDSLLinkConfig1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANDSLLinkConfig:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANDSLLinkConfig1 struct { - goupnp.ServiceClient -} - -// NewWANDSLLinkConfig1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANDSLLinkConfig1Clients() (clients []*WANDSLLinkConfig1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANDSLLinkConfig_1); err != nil { - return - } - clients = newWANDSLLinkConfig1ClientsFromGenericClients(genericClients) - return -} - -// NewWANDSLLinkConfig1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANDSLLinkConfig1ClientsByURL(loc *url.URL) ([]*WANDSLLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANDSLLinkConfig_1) - if err != nil { - return nil, err - } - return newWANDSLLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -// NewWANDSLLinkConfig1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANDSLLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANDSLLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANDSLLinkConfig_1) - if err != nil { - return nil, err - } - return newWANDSLLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -func newWANDSLLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANDSLLinkConfig1 { - clients := make([]*WANDSLLinkConfig1, len(genericClients)) - for i := range genericClients { - clients[i] = &WANDSLLinkConfig1{genericClients[i]} - } - return clients -} - -func (client *WANDSLLinkConfig1) SetDSLLinkType(NewLinkType string) (err error) { - // Request structure. - request := &struct { - NewLinkType string - }{} - // BEGIN Marshal arguments into request. - - if request.NewLinkType, err = soap.MarshalString(NewLinkType); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "SetDSLLinkType", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewLinkStatus: allowed values: Up, Down -func (client *WANDSLLinkConfig1) GetDSLLinkInfo() (NewLinkType string, NewLinkStatus string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewLinkType string - - NewLinkStatus string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "GetDSLLinkInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewLinkType, err = soap.UnmarshalString(response.NewLinkType); err != nil { - return - } - if NewLinkStatus, err = soap.UnmarshalString(response.NewLinkStatus); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) GetAutoConfig() (NewAutoConfig bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewAutoConfig string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "GetAutoConfig", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewAutoConfig, err = soap.UnmarshalBoolean(response.NewAutoConfig); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) GetModulationType() (NewModulationType string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewModulationType string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "GetModulationType", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewModulationType, err = soap.UnmarshalString(response.NewModulationType); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) SetDestinationAddress(NewDestinationAddress string) (err error) { - // Request structure. - request := &struct { - NewDestinationAddress string - }{} - // BEGIN Marshal arguments into request. - - if request.NewDestinationAddress, err = soap.MarshalString(NewDestinationAddress); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "SetDestinationAddress", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) GetDestinationAddress() (NewDestinationAddress string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDestinationAddress string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "GetDestinationAddress", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDestinationAddress, err = soap.UnmarshalString(response.NewDestinationAddress); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) SetATMEncapsulation(NewATMEncapsulation string) (err error) { - // Request structure. - request := &struct { - NewATMEncapsulation string - }{} - // BEGIN Marshal arguments into request. - - if request.NewATMEncapsulation, err = soap.MarshalString(NewATMEncapsulation); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "SetATMEncapsulation", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) GetATMEncapsulation() (NewATMEncapsulation string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewATMEncapsulation string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "GetATMEncapsulation", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewATMEncapsulation, err = soap.UnmarshalString(response.NewATMEncapsulation); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) SetFCSPreserved(NewFCSPreserved bool) (err error) { - // Request structure. - request := &struct { - NewFCSPreserved string - }{} - // BEGIN Marshal arguments into request. - - if request.NewFCSPreserved, err = soap.MarshalBoolean(NewFCSPreserved); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "SetFCSPreserved", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANDSLLinkConfig1) GetFCSPreserved() (NewFCSPreserved bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewFCSPreserved string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANDSLLinkConfig_1, "GetFCSPreserved", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewFCSPreserved, err = soap.UnmarshalBoolean(response.NewFCSPreserved); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANEthernetLinkConfig1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANEthernetLinkConfig:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANEthernetLinkConfig1 struct { - goupnp.ServiceClient -} - -// NewWANEthernetLinkConfig1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANEthernetLinkConfig1Clients() (clients []*WANEthernetLinkConfig1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANEthernetLinkConfig_1); err != nil { - return - } - clients = newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients) - return -} - -// NewWANEthernetLinkConfig1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANEthernetLinkConfig1ClientsByURL(loc *url.URL) ([]*WANEthernetLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANEthernetLinkConfig_1) - if err != nil { - return nil, err - } - return newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -// NewWANEthernetLinkConfig1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANEthernetLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANEthernetLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANEthernetLinkConfig_1) - if err != nil { - return nil, err - } - return newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -func newWANEthernetLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANEthernetLinkConfig1 { - clients := make([]*WANEthernetLinkConfig1, len(genericClients)) - for i := range genericClients { - clients[i] = &WANEthernetLinkConfig1{genericClients[i]} - } - return clients -} - -// -// Return values: -// -// * NewEthernetLinkStatus: allowed values: Up, Down -func (client *WANEthernetLinkConfig1) GetEthernetLinkStatus() (NewEthernetLinkStatus string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewEthernetLinkStatus string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANEthernetLinkConfig_1, "GetEthernetLinkStatus", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewEthernetLinkStatus, err = soap.UnmarshalString(response.NewEthernetLinkStatus); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANIPConnection1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANIPConnection:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANIPConnection1 struct { - goupnp.ServiceClient -} - -// NewWANIPConnection1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANIPConnection1Clients() (clients []*WANIPConnection1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANIPConnection_1); err != nil { - return - } - clients = newWANIPConnection1ClientsFromGenericClients(genericClients) - return -} - -// NewWANIPConnection1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANIPConnection1ClientsByURL(loc *url.URL) ([]*WANIPConnection1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANIPConnection_1) - if err != nil { - return nil, err - } - return newWANIPConnection1ClientsFromGenericClients(genericClients), nil -} - -// NewWANIPConnection1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANIPConnection1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANIPConnection1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANIPConnection_1) - if err != nil { - return nil, err - } - return newWANIPConnection1ClientsFromGenericClients(genericClients), nil -} - -func newWANIPConnection1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANIPConnection1 { - clients := make([]*WANIPConnection1, len(genericClients)) - for i := range genericClients { - clients[i] = &WANIPConnection1{genericClients[i]} - } - return clients -} - -func (client *WANIPConnection1) SetConnectionType(NewConnectionType string) (err error) { - // Request structure. - request := &struct { - NewConnectionType string - }{} - // BEGIN Marshal arguments into request. - - if request.NewConnectionType, err = soap.MarshalString(NewConnectionType); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "SetConnectionType", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewPossibleConnectionTypes: allowed values: Unconfigured, IP_Routed, IP_Bridged -func (client *WANIPConnection1) GetConnectionTypeInfo() (NewConnectionType string, NewPossibleConnectionTypes string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewConnectionType string - - NewPossibleConnectionTypes string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetConnectionTypeInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewConnectionType, err = soap.UnmarshalString(response.NewConnectionType); err != nil { - return - } - if NewPossibleConnectionTypes, err = soap.UnmarshalString(response.NewPossibleConnectionTypes); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) RequestConnection() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "RequestConnection", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) RequestTermination() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "RequestTermination", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) ForceTermination() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "ForceTermination", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) SetAutoDisconnectTime(NewAutoDisconnectTime uint32) (err error) { - // Request structure. - request := &struct { - NewAutoDisconnectTime string - }{} - // BEGIN Marshal arguments into request. - - if request.NewAutoDisconnectTime, err = soap.MarshalUi4(NewAutoDisconnectTime); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "SetAutoDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) SetIdleDisconnectTime(NewIdleDisconnectTime uint32) (err error) { - // Request structure. - request := &struct { - NewIdleDisconnectTime string - }{} - // BEGIN Marshal arguments into request. - - if request.NewIdleDisconnectTime, err = soap.MarshalUi4(NewIdleDisconnectTime); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "SetIdleDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) SetWarnDisconnectDelay(NewWarnDisconnectDelay uint32) (err error) { - // Request structure. - request := &struct { - NewWarnDisconnectDelay string - }{} - // BEGIN Marshal arguments into request. - - if request.NewWarnDisconnectDelay, err = soap.MarshalUi4(NewWarnDisconnectDelay); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "SetWarnDisconnectDelay", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewConnectionStatus: allowed values: Unconfigured, Connected, Disconnected -// -// * NewLastConnectionError: allowed values: ERROR_NONE -func (client *WANIPConnection1) GetStatusInfo() (NewConnectionStatus string, NewLastConnectionError string, NewUptime uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewConnectionStatus string - - NewLastConnectionError string - - NewUptime string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetStatusInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewConnectionStatus, err = soap.UnmarshalString(response.NewConnectionStatus); err != nil { - return - } - if NewLastConnectionError, err = soap.UnmarshalString(response.NewLastConnectionError); err != nil { - return - } - if NewUptime, err = soap.UnmarshalUi4(response.NewUptime); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) GetAutoDisconnectTime() (NewAutoDisconnectTime uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewAutoDisconnectTime string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetAutoDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewAutoDisconnectTime, err = soap.UnmarshalUi4(response.NewAutoDisconnectTime); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) GetIdleDisconnectTime() (NewIdleDisconnectTime uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewIdleDisconnectTime string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetIdleDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewIdleDisconnectTime, err = soap.UnmarshalUi4(response.NewIdleDisconnectTime); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) GetWarnDisconnectDelay() (NewWarnDisconnectDelay uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewWarnDisconnectDelay string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetWarnDisconnectDelay", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewWarnDisconnectDelay, err = soap.UnmarshalUi4(response.NewWarnDisconnectDelay); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) GetNATRSIPStatus() (NewRSIPAvailable bool, NewNATEnabled bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewRSIPAvailable string - - NewNATEnabled string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetNATRSIPStatus", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewRSIPAvailable, err = soap.UnmarshalBoolean(response.NewRSIPAvailable); err != nil { - return - } - if NewNATEnabled, err = soap.UnmarshalBoolean(response.NewNATEnabled); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewProtocol: allowed values: TCP, UDP -func (client *WANIPConnection1) GetGenericPortMappingEntry(NewPortMappingIndex uint16) (NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) { - // Request structure. - request := &struct { - NewPortMappingIndex string - }{} - // BEGIN Marshal arguments into request. - - if request.NewPortMappingIndex, err = soap.MarshalUi2(NewPortMappingIndex); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetGenericPortMappingEntry", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewRemoteHost, err = soap.UnmarshalString(response.NewRemoteHost); err != nil { - return - } - if NewExternalPort, err = soap.UnmarshalUi2(response.NewExternalPort); err != nil { - return - } - if NewProtocol, err = soap.UnmarshalString(response.NewProtocol); err != nil { - return - } - if NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil { - return - } - if NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil { - return - } - if NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil { - return - } - if NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil { - return - } - if NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANIPConnection1) GetSpecificPortMappingEntry(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetSpecificPortMappingEntry", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil { - return - } - if NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil { - return - } - if NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil { - return - } - if NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil { - return - } - if NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANIPConnection1) AddPortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32) (err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - if request.NewInternalPort, err = soap.MarshalUi2(NewInternalPort); err != nil { - return - } - if request.NewInternalClient, err = soap.MarshalString(NewInternalClient); err != nil { - return - } - if request.NewEnabled, err = soap.MarshalBoolean(NewEnabled); err != nil { - return - } - if request.NewPortMappingDescription, err = soap.MarshalString(NewPortMappingDescription); err != nil { - return - } - if request.NewLeaseDuration, err = soap.MarshalUi4(NewLeaseDuration); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "AddPortMapping", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANIPConnection1) DeletePortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "DeletePortMapping", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection1) GetExternalIPAddress() (NewExternalIPAddress string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewExternalIPAddress string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_1, "GetExternalIPAddress", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewExternalIPAddress, err = soap.UnmarshalString(response.NewExternalIPAddress); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANIPConnection2 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANIPConnection:2". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANIPConnection2 struct { - goupnp.ServiceClient -} - -// NewWANIPConnection2Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANIPConnection2Clients() (clients []*WANIPConnection2, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANIPConnection_2); err != nil { - return - } - clients = newWANIPConnection2ClientsFromGenericClients(genericClients) - return -} - -// NewWANIPConnection2ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANIPConnection2ClientsByURL(loc *url.URL) ([]*WANIPConnection2, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANIPConnection_2) - if err != nil { - return nil, err - } - return newWANIPConnection2ClientsFromGenericClients(genericClients), nil -} - -// NewWANIPConnection2ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANIPConnection2ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANIPConnection2, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANIPConnection_2) - if err != nil { - return nil, err - } - return newWANIPConnection2ClientsFromGenericClients(genericClients), nil -} - -func newWANIPConnection2ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANIPConnection2 { - clients := make([]*WANIPConnection2, len(genericClients)) - for i := range genericClients { - clients[i] = &WANIPConnection2{genericClients[i]} - } - return clients -} - -func (client *WANIPConnection2) SetConnectionType(NewConnectionType string) (err error) { - // Request structure. - request := &struct { - NewConnectionType string - }{} - // BEGIN Marshal arguments into request. - - if request.NewConnectionType, err = soap.MarshalString(NewConnectionType); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "SetConnectionType", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection2) GetConnectionTypeInfo() (NewConnectionType string, NewPossibleConnectionTypes string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewConnectionType string - - NewPossibleConnectionTypes string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "GetConnectionTypeInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewConnectionType, err = soap.UnmarshalString(response.NewConnectionType); err != nil { - return - } - if NewPossibleConnectionTypes, err = soap.UnmarshalString(response.NewPossibleConnectionTypes); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection2) RequestConnection() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "RequestConnection", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection2) RequestTermination() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "RequestTermination", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection2) ForceTermination() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "ForceTermination", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection2) SetAutoDisconnectTime(NewAutoDisconnectTime uint32) (err error) { - // Request structure. - request := &struct { - NewAutoDisconnectTime string - }{} - // BEGIN Marshal arguments into request. - - if request.NewAutoDisconnectTime, err = soap.MarshalUi4(NewAutoDisconnectTime); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "SetAutoDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection2) SetIdleDisconnectTime(NewIdleDisconnectTime uint32) (err error) { - // Request structure. - request := &struct { - NewIdleDisconnectTime string - }{} - // BEGIN Marshal arguments into request. - - if request.NewIdleDisconnectTime, err = soap.MarshalUi4(NewIdleDisconnectTime); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "SetIdleDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection2) SetWarnDisconnectDelay(NewWarnDisconnectDelay uint32) (err error) { - // Request structure. - request := &struct { - NewWarnDisconnectDelay string - }{} - // BEGIN Marshal arguments into request. - - if request.NewWarnDisconnectDelay, err = soap.MarshalUi4(NewWarnDisconnectDelay); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "SetWarnDisconnectDelay", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewConnectionStatus: allowed values: Unconfigured, Connecting, Connected, PendingDisconnect, Disconnecting, Disconnected -// -// * NewLastConnectionError: allowed values: ERROR_NONE, ERROR_COMMAND_ABORTED, ERROR_NOT_ENABLED_FOR_INTERNET, ERROR_USER_DISCONNECT, ERROR_ISP_DISCONNECT, ERROR_IDLE_DISCONNECT, ERROR_FORCED_DISCONNECT, ERROR_NO_CARRIER, ERROR_IP_CONFIGURATION, ERROR_UNKNOWN -func (client *WANIPConnection2) GetStatusInfo() (NewConnectionStatus string, NewLastConnectionError string, NewUptime uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewConnectionStatus string - - NewLastConnectionError string - - NewUptime string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "GetStatusInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewConnectionStatus, err = soap.UnmarshalString(response.NewConnectionStatus); err != nil { - return - } - if NewLastConnectionError, err = soap.UnmarshalString(response.NewLastConnectionError); err != nil { - return - } - if NewUptime, err = soap.UnmarshalUi4(response.NewUptime); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection2) GetAutoDisconnectTime() (NewAutoDisconnectTime uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewAutoDisconnectTime string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "GetAutoDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewAutoDisconnectTime, err = soap.UnmarshalUi4(response.NewAutoDisconnectTime); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection2) GetIdleDisconnectTime() (NewIdleDisconnectTime uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewIdleDisconnectTime string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "GetIdleDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewIdleDisconnectTime, err = soap.UnmarshalUi4(response.NewIdleDisconnectTime); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection2) GetWarnDisconnectDelay() (NewWarnDisconnectDelay uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewWarnDisconnectDelay string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "GetWarnDisconnectDelay", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewWarnDisconnectDelay, err = soap.UnmarshalUi4(response.NewWarnDisconnectDelay); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection2) GetNATRSIPStatus() (NewRSIPAvailable bool, NewNATEnabled bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewRSIPAvailable string - - NewNATEnabled string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "GetNATRSIPStatus", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewRSIPAvailable, err = soap.UnmarshalBoolean(response.NewRSIPAvailable); err != nil { - return - } - if NewNATEnabled, err = soap.UnmarshalBoolean(response.NewNATEnabled); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewProtocol: allowed values: TCP, UDP -func (client *WANIPConnection2) GetGenericPortMappingEntry(NewPortMappingIndex uint16) (NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) { - // Request structure. - request := &struct { - NewPortMappingIndex string - }{} - // BEGIN Marshal arguments into request. - - if request.NewPortMappingIndex, err = soap.MarshalUi2(NewPortMappingIndex); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "GetGenericPortMappingEntry", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewRemoteHost, err = soap.UnmarshalString(response.NewRemoteHost); err != nil { - return - } - if NewExternalPort, err = soap.UnmarshalUi2(response.NewExternalPort); err != nil { - return - } - if NewProtocol, err = soap.UnmarshalString(response.NewProtocol); err != nil { - return - } - if NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil { - return - } - if NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil { - return - } - if NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil { - return - } - if NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil { - return - } - if NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANIPConnection2) GetSpecificPortMappingEntry(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "GetSpecificPortMappingEntry", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil { - return - } - if NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil { - return - } - if NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil { - return - } - if NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil { - return - } - if NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANIPConnection2) AddPortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32) (err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - if request.NewInternalPort, err = soap.MarshalUi2(NewInternalPort); err != nil { - return - } - if request.NewInternalClient, err = soap.MarshalString(NewInternalClient); err != nil { - return - } - if request.NewEnabled, err = soap.MarshalBoolean(NewEnabled); err != nil { - return - } - if request.NewPortMappingDescription, err = soap.MarshalString(NewPortMappingDescription); err != nil { - return - } - if request.NewLeaseDuration, err = soap.MarshalUi4(NewLeaseDuration); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "AddPortMapping", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANIPConnection2) DeletePortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "DeletePortMapping", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANIPConnection2) DeletePortMappingRange(NewStartPort uint16, NewEndPort uint16, NewProtocol string, NewManage bool) (err error) { - // Request structure. - request := &struct { - NewStartPort string - - NewEndPort string - - NewProtocol string - - NewManage string - }{} - // BEGIN Marshal arguments into request. - - if request.NewStartPort, err = soap.MarshalUi2(NewStartPort); err != nil { - return - } - if request.NewEndPort, err = soap.MarshalUi2(NewEndPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - if request.NewManage, err = soap.MarshalBoolean(NewManage); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "DeletePortMappingRange", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPConnection2) GetExternalIPAddress() (NewExternalIPAddress string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewExternalIPAddress string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "GetExternalIPAddress", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewExternalIPAddress, err = soap.UnmarshalString(response.NewExternalIPAddress); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANIPConnection2) GetListOfPortMappings(NewStartPort uint16, NewEndPort uint16, NewProtocol string, NewManage bool, NewNumberOfPorts uint16) (NewPortListing string, err error) { - // Request structure. - request := &struct { - NewStartPort string - - NewEndPort string - - NewProtocol string - - NewManage string - - NewNumberOfPorts string - }{} - // BEGIN Marshal arguments into request. - - if request.NewStartPort, err = soap.MarshalUi2(NewStartPort); err != nil { - return - } - if request.NewEndPort, err = soap.MarshalUi2(NewEndPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - if request.NewManage, err = soap.MarshalBoolean(NewManage); err != nil { - return - } - if request.NewNumberOfPorts, err = soap.MarshalUi2(NewNumberOfPorts); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewPortListing string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "GetListOfPortMappings", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewPortListing, err = soap.UnmarshalString(response.NewPortListing); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANIPConnection2) AddAnyPortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32) (NewReservedPort uint16, err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - if request.NewInternalPort, err = soap.MarshalUi2(NewInternalPort); err != nil { - return - } - if request.NewInternalClient, err = soap.MarshalString(NewInternalClient); err != nil { - return - } - if request.NewEnabled, err = soap.MarshalBoolean(NewEnabled); err != nil { - return - } - if request.NewPortMappingDescription, err = soap.MarshalString(NewPortMappingDescription); err != nil { - return - } - if request.NewLeaseDuration, err = soap.MarshalUi4(NewLeaseDuration); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewReservedPort string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPConnection_2, "AddAnyPortMapping", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewReservedPort, err = soap.UnmarshalUi2(response.NewReservedPort); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANIPv6FirewallControl1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANIPv6FirewallControl:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANIPv6FirewallControl1 struct { - goupnp.ServiceClient -} - -// NewWANIPv6FirewallControl1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANIPv6FirewallControl1Clients() (clients []*WANIPv6FirewallControl1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANIPv6FirewallControl_1); err != nil { - return - } - clients = newWANIPv6FirewallControl1ClientsFromGenericClients(genericClients) - return -} - -// NewWANIPv6FirewallControl1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANIPv6FirewallControl1ClientsByURL(loc *url.URL) ([]*WANIPv6FirewallControl1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANIPv6FirewallControl_1) - if err != nil { - return nil, err - } - return newWANIPv6FirewallControl1ClientsFromGenericClients(genericClients), nil -} - -// NewWANIPv6FirewallControl1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANIPv6FirewallControl1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANIPv6FirewallControl1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANIPv6FirewallControl_1) - if err != nil { - return nil, err - } - return newWANIPv6FirewallControl1ClientsFromGenericClients(genericClients), nil -} - -func newWANIPv6FirewallControl1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANIPv6FirewallControl1 { - clients := make([]*WANIPv6FirewallControl1, len(genericClients)) - for i := range genericClients { - clients[i] = &WANIPv6FirewallControl1{genericClients[i]} - } - return clients -} - -func (client *WANIPv6FirewallControl1) GetFirewallStatus() (FirewallEnabled bool, InboundPinholeAllowed bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - FirewallEnabled string - - InboundPinholeAllowed string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPv6FirewallControl_1, "GetFirewallStatus", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if FirewallEnabled, err = soap.UnmarshalBoolean(response.FirewallEnabled); err != nil { - return - } - if InboundPinholeAllowed, err = soap.UnmarshalBoolean(response.InboundPinholeAllowed); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPv6FirewallControl1) GetOutboundPinholeTimeout(RemoteHost string, RemotePort uint16, InternalClient string, InternalPort uint16, Protocol uint16) (OutboundPinholeTimeout uint32, err error) { - // Request structure. - request := &struct { - RemoteHost string - - RemotePort string - - InternalClient string - - InternalPort string - - Protocol string - }{} - // BEGIN Marshal arguments into request. - - if request.RemoteHost, err = soap.MarshalString(RemoteHost); err != nil { - return - } - if request.RemotePort, err = soap.MarshalUi2(RemotePort); err != nil { - return - } - if request.InternalClient, err = soap.MarshalString(InternalClient); err != nil { - return - } - if request.InternalPort, err = soap.MarshalUi2(InternalPort); err != nil { - return - } - if request.Protocol, err = soap.MarshalUi2(Protocol); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - OutboundPinholeTimeout string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPv6FirewallControl_1, "GetOutboundPinholeTimeout", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if OutboundPinholeTimeout, err = soap.UnmarshalUi4(response.OutboundPinholeTimeout); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * LeaseTime: allowed value range: minimum=1, maximum=86400 - -func (client *WANIPv6FirewallControl1) AddPinhole(RemoteHost string, RemotePort uint16, InternalClient string, InternalPort uint16, Protocol uint16, LeaseTime uint32) (UniqueID uint16, err error) { - // Request structure. - request := &struct { - RemoteHost string - - RemotePort string - - InternalClient string - - InternalPort string - - Protocol string - - LeaseTime string - }{} - // BEGIN Marshal arguments into request. - - if request.RemoteHost, err = soap.MarshalString(RemoteHost); err != nil { - return - } - if request.RemotePort, err = soap.MarshalUi2(RemotePort); err != nil { - return - } - if request.InternalClient, err = soap.MarshalString(InternalClient); err != nil { - return - } - if request.InternalPort, err = soap.MarshalUi2(InternalPort); err != nil { - return - } - if request.Protocol, err = soap.MarshalUi2(Protocol); err != nil { - return - } - if request.LeaseTime, err = soap.MarshalUi4(LeaseTime); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - UniqueID string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPv6FirewallControl_1, "AddPinhole", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if UniqueID, err = soap.UnmarshalUi2(response.UniqueID); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewLeaseTime: allowed value range: minimum=1, maximum=86400 - -func (client *WANIPv6FirewallControl1) UpdatePinhole(UniqueID uint16, NewLeaseTime uint32) (err error) { - // Request structure. - request := &struct { - UniqueID string - - NewLeaseTime string - }{} - // BEGIN Marshal arguments into request. - - if request.UniqueID, err = soap.MarshalUi2(UniqueID); err != nil { - return - } - if request.NewLeaseTime, err = soap.MarshalUi4(NewLeaseTime); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPv6FirewallControl_1, "UpdatePinhole", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPv6FirewallControl1) DeletePinhole(UniqueID uint16) (err error) { - // Request structure. - request := &struct { - UniqueID string - }{} - // BEGIN Marshal arguments into request. - - if request.UniqueID, err = soap.MarshalUi2(UniqueID); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPv6FirewallControl_1, "DeletePinhole", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANIPv6FirewallControl1) GetPinholePackets(UniqueID uint16) (PinholePackets uint32, err error) { - // Request structure. - request := &struct { - UniqueID string - }{} - // BEGIN Marshal arguments into request. - - if request.UniqueID, err = soap.MarshalUi2(UniqueID); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - PinholePackets string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPv6FirewallControl_1, "GetPinholePackets", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if PinholePackets, err = soap.UnmarshalUi4(response.PinholePackets); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANIPv6FirewallControl1) CheckPinholeWorking(UniqueID uint16) (IsWorking bool, err error) { - // Request structure. - request := &struct { - UniqueID string - }{} - // BEGIN Marshal arguments into request. - - if request.UniqueID, err = soap.MarshalUi2(UniqueID); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - IsWorking string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANIPv6FirewallControl_1, "CheckPinholeWorking", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if IsWorking, err = soap.UnmarshalBoolean(response.IsWorking); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANPOTSLinkConfig1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANPOTSLinkConfig:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANPOTSLinkConfig1 struct { - goupnp.ServiceClient -} - -// NewWANPOTSLinkConfig1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANPOTSLinkConfig1Clients() (clients []*WANPOTSLinkConfig1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANPOTSLinkConfig_1); err != nil { - return - } - clients = newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients) - return -} - -// NewWANPOTSLinkConfig1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANPOTSLinkConfig1ClientsByURL(loc *url.URL) ([]*WANPOTSLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANPOTSLinkConfig_1) - if err != nil { - return nil, err - } - return newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -// NewWANPOTSLinkConfig1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANPOTSLinkConfig1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANPOTSLinkConfig1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANPOTSLinkConfig_1) - if err != nil { - return nil, err - } - return newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients), nil -} - -func newWANPOTSLinkConfig1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANPOTSLinkConfig1 { - clients := make([]*WANPOTSLinkConfig1, len(genericClients)) - for i := range genericClients { - clients[i] = &WANPOTSLinkConfig1{genericClients[i]} - } - return clients -} - -// -// Arguments: -// -// * NewLinkType: allowed values: PPP_Dialup - -func (client *WANPOTSLinkConfig1) SetISPInfo(NewISPPhoneNumber string, NewISPInfo string, NewLinkType string) (err error) { - // Request structure. - request := &struct { - NewISPPhoneNumber string - - NewISPInfo string - - NewLinkType string - }{} - // BEGIN Marshal arguments into request. - - if request.NewISPPhoneNumber, err = soap.MarshalString(NewISPPhoneNumber); err != nil { - return - } - if request.NewISPInfo, err = soap.MarshalString(NewISPInfo); err != nil { - return - } - if request.NewLinkType, err = soap.MarshalString(NewLinkType); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "SetISPInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPOTSLinkConfig1) SetCallRetryInfo(NewNumberOfRetries uint32, NewDelayBetweenRetries uint32) (err error) { - // Request structure. - request := &struct { - NewNumberOfRetries string - - NewDelayBetweenRetries string - }{} - // BEGIN Marshal arguments into request. - - if request.NewNumberOfRetries, err = soap.MarshalUi4(NewNumberOfRetries); err != nil { - return - } - if request.NewDelayBetweenRetries, err = soap.MarshalUi4(NewDelayBetweenRetries); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "SetCallRetryInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewLinkType: allowed values: PPP_Dialup -func (client *WANPOTSLinkConfig1) GetISPInfo() (NewISPPhoneNumber string, NewISPInfo string, NewLinkType string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewISPPhoneNumber string - - NewISPInfo string - - NewLinkType string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "GetISPInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewISPPhoneNumber, err = soap.UnmarshalString(response.NewISPPhoneNumber); err != nil { - return - } - if NewISPInfo, err = soap.UnmarshalString(response.NewISPInfo); err != nil { - return - } - if NewLinkType, err = soap.UnmarshalString(response.NewLinkType); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPOTSLinkConfig1) GetCallRetryInfo() (NewNumberOfRetries uint32, NewDelayBetweenRetries uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewNumberOfRetries string - - NewDelayBetweenRetries string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "GetCallRetryInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewNumberOfRetries, err = soap.UnmarshalUi4(response.NewNumberOfRetries); err != nil { - return - } - if NewDelayBetweenRetries, err = soap.UnmarshalUi4(response.NewDelayBetweenRetries); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPOTSLinkConfig1) GetFclass() (NewFclass string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewFclass string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "GetFclass", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewFclass, err = soap.UnmarshalString(response.NewFclass); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPOTSLinkConfig1) GetDataModulationSupported() (NewDataModulationSupported string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDataModulationSupported string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "GetDataModulationSupported", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDataModulationSupported, err = soap.UnmarshalString(response.NewDataModulationSupported); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPOTSLinkConfig1) GetDataProtocol() (NewDataProtocol string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDataProtocol string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "GetDataProtocol", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDataProtocol, err = soap.UnmarshalString(response.NewDataProtocol); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPOTSLinkConfig1) GetDataCompression() (NewDataCompression string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewDataCompression string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "GetDataCompression", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewDataCompression, err = soap.UnmarshalString(response.NewDataCompression); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPOTSLinkConfig1) GetPlusVTRCommandSupported() (NewPlusVTRCommandSupported bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewPlusVTRCommandSupported string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPOTSLinkConfig_1, "GetPlusVTRCommandSupported", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewPlusVTRCommandSupported, err = soap.UnmarshalBoolean(response.NewPlusVTRCommandSupported); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// WANPPPConnection1 is a client for UPnP SOAP service with URN "urn:schemas-upnp-org:service:WANPPPConnection:1". See -// goupnp.ServiceClient, which contains RootDevice and Service attributes which -// are provided for informational value. -type WANPPPConnection1 struct { - goupnp.ServiceClient -} - -// NewWANPPPConnection1Clients discovers instances of the service on the network, -// and returns clients to any that are found. errors will contain an error for -// any devices that replied but which could not be queried, and err will be set -// if the discovery process failed outright. -// -// This is a typical entry calling point into this package. -func NewWANPPPConnection1Clients() (clients []*WANPPPConnection1, errors []error, err error) { - var genericClients []goupnp.ServiceClient - if genericClients, errors, err = goupnp.NewServiceClients(URN_WANPPPConnection_1); err != nil { - return - } - clients = newWANPPPConnection1ClientsFromGenericClients(genericClients) - return -} - -// NewWANPPPConnection1ClientsByURL discovers instances of the service at the given -// URL, and returns clients to any that are found. An error is returned if -// there was an error probing the service. -// -// This is a typical entry calling point into this package when reusing an -// previously discovered service URL. -func NewWANPPPConnection1ClientsByURL(loc *url.URL) ([]*WANPPPConnection1, error) { - genericClients, err := goupnp.NewServiceClientsByURL(loc, URN_WANPPPConnection_1) - if err != nil { - return nil, err - } - return newWANPPPConnection1ClientsFromGenericClients(genericClients), nil -} - -// NewWANPPPConnection1ClientsFromRootDevice discovers instances of the service in -// a given root device, and returns clients to any that are found. An error is -// returned if there was not at least one instance of the service within the -// device. The location parameter is simply assigned to the Location attribute -// of the wrapped ServiceClient(s). -// -// This is a typical entry calling point into this package when reusing an -// previously discovered root device. -func NewWANPPPConnection1ClientsFromRootDevice(rootDevice *goupnp.RootDevice, loc *url.URL) ([]*WANPPPConnection1, error) { - genericClients, err := goupnp.NewServiceClientsFromRootDevice(rootDevice, loc, URN_WANPPPConnection_1) - if err != nil { - return nil, err - } - return newWANPPPConnection1ClientsFromGenericClients(genericClients), nil -} - -func newWANPPPConnection1ClientsFromGenericClients(genericClients []goupnp.ServiceClient) []*WANPPPConnection1 { - clients := make([]*WANPPPConnection1, len(genericClients)) - for i := range genericClients { - clients[i] = &WANPPPConnection1{genericClients[i]} - } - return clients -} - -func (client *WANPPPConnection1) SetConnectionType(NewConnectionType string) (err error) { - // Request structure. - request := &struct { - NewConnectionType string - }{} - // BEGIN Marshal arguments into request. - - if request.NewConnectionType, err = soap.MarshalString(NewConnectionType); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "SetConnectionType", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewPossibleConnectionTypes: allowed values: Unconfigured, IP_Routed, DHCP_Spoofed, PPPoE_Bridged, PPTP_Relay, L2TP_Relay, PPPoE_Relay -func (client *WANPPPConnection1) GetConnectionTypeInfo() (NewConnectionType string, NewPossibleConnectionTypes string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewConnectionType string - - NewPossibleConnectionTypes string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetConnectionTypeInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewConnectionType, err = soap.UnmarshalString(response.NewConnectionType); err != nil { - return - } - if NewPossibleConnectionTypes, err = soap.UnmarshalString(response.NewPossibleConnectionTypes); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) ConfigureConnection(NewUserName string, NewPassword string) (err error) { - // Request structure. - request := &struct { - NewUserName string - - NewPassword string - }{} - // BEGIN Marshal arguments into request. - - if request.NewUserName, err = soap.MarshalString(NewUserName); err != nil { - return - } - if request.NewPassword, err = soap.MarshalString(NewPassword); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "ConfigureConnection", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) RequestConnection() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "RequestConnection", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) RequestTermination() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "RequestTermination", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) ForceTermination() (err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "ForceTermination", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) SetAutoDisconnectTime(NewAutoDisconnectTime uint32) (err error) { - // Request structure. - request := &struct { - NewAutoDisconnectTime string - }{} - // BEGIN Marshal arguments into request. - - if request.NewAutoDisconnectTime, err = soap.MarshalUi4(NewAutoDisconnectTime); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "SetAutoDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) SetIdleDisconnectTime(NewIdleDisconnectTime uint32) (err error) { - // Request structure. - request := &struct { - NewIdleDisconnectTime string - }{} - // BEGIN Marshal arguments into request. - - if request.NewIdleDisconnectTime, err = soap.MarshalUi4(NewIdleDisconnectTime); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "SetIdleDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) SetWarnDisconnectDelay(NewWarnDisconnectDelay uint32) (err error) { - // Request structure. - request := &struct { - NewWarnDisconnectDelay string - }{} - // BEGIN Marshal arguments into request. - - if request.NewWarnDisconnectDelay, err = soap.MarshalUi4(NewWarnDisconnectDelay); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "SetWarnDisconnectDelay", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewConnectionStatus: allowed values: Unconfigured, Connected, Disconnected -// -// * NewLastConnectionError: allowed values: ERROR_NONE -func (client *WANPPPConnection1) GetStatusInfo() (NewConnectionStatus string, NewLastConnectionError string, NewUptime uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewConnectionStatus string - - NewLastConnectionError string - - NewUptime string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetStatusInfo", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewConnectionStatus, err = soap.UnmarshalString(response.NewConnectionStatus); err != nil { - return - } - if NewLastConnectionError, err = soap.UnmarshalString(response.NewLastConnectionError); err != nil { - return - } - if NewUptime, err = soap.UnmarshalUi4(response.NewUptime); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetLinkLayerMaxBitRates() (NewUpstreamMaxBitRate uint32, NewDownstreamMaxBitRate uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewUpstreamMaxBitRate string - - NewDownstreamMaxBitRate string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetLinkLayerMaxBitRates", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewUpstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewUpstreamMaxBitRate); err != nil { - return - } - if NewDownstreamMaxBitRate, err = soap.UnmarshalUi4(response.NewDownstreamMaxBitRate); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetPPPEncryptionProtocol() (NewPPPEncryptionProtocol string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewPPPEncryptionProtocol string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetPPPEncryptionProtocol", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewPPPEncryptionProtocol, err = soap.UnmarshalString(response.NewPPPEncryptionProtocol); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetPPPCompressionProtocol() (NewPPPCompressionProtocol string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewPPPCompressionProtocol string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetPPPCompressionProtocol", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewPPPCompressionProtocol, err = soap.UnmarshalString(response.NewPPPCompressionProtocol); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetPPPAuthenticationProtocol() (NewPPPAuthenticationProtocol string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewPPPAuthenticationProtocol string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetPPPAuthenticationProtocol", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewPPPAuthenticationProtocol, err = soap.UnmarshalString(response.NewPPPAuthenticationProtocol); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetUserName() (NewUserName string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewUserName string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetUserName", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewUserName, err = soap.UnmarshalString(response.NewUserName); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetPassword() (NewPassword string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewPassword string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetPassword", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewPassword, err = soap.UnmarshalString(response.NewPassword); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetAutoDisconnectTime() (NewAutoDisconnectTime uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewAutoDisconnectTime string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetAutoDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewAutoDisconnectTime, err = soap.UnmarshalUi4(response.NewAutoDisconnectTime); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetIdleDisconnectTime() (NewIdleDisconnectTime uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewIdleDisconnectTime string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetIdleDisconnectTime", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewIdleDisconnectTime, err = soap.UnmarshalUi4(response.NewIdleDisconnectTime); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetWarnDisconnectDelay() (NewWarnDisconnectDelay uint32, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewWarnDisconnectDelay string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetWarnDisconnectDelay", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewWarnDisconnectDelay, err = soap.UnmarshalUi4(response.NewWarnDisconnectDelay); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetNATRSIPStatus() (NewRSIPAvailable bool, NewNATEnabled bool, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewRSIPAvailable string - - NewNATEnabled string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetNATRSIPStatus", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewRSIPAvailable, err = soap.UnmarshalBoolean(response.NewRSIPAvailable); err != nil { - return - } - if NewNATEnabled, err = soap.UnmarshalBoolean(response.NewNATEnabled); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Return values: -// -// * NewProtocol: allowed values: TCP, UDP -func (client *WANPPPConnection1) GetGenericPortMappingEntry(NewPortMappingIndex uint16) (NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) { - // Request structure. - request := &struct { - NewPortMappingIndex string - }{} - // BEGIN Marshal arguments into request. - - if request.NewPortMappingIndex, err = soap.MarshalUi2(NewPortMappingIndex); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetGenericPortMappingEntry", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewRemoteHost, err = soap.UnmarshalString(response.NewRemoteHost); err != nil { - return - } - if NewExternalPort, err = soap.UnmarshalUi2(response.NewExternalPort); err != nil { - return - } - if NewProtocol, err = soap.UnmarshalString(response.NewProtocol); err != nil { - return - } - if NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil { - return - } - if NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil { - return - } - if NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil { - return - } - if NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil { - return - } - if NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANPPPConnection1) GetSpecificPortMappingEntry(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32, err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetSpecificPortMappingEntry", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewInternalPort, err = soap.UnmarshalUi2(response.NewInternalPort); err != nil { - return - } - if NewInternalClient, err = soap.UnmarshalString(response.NewInternalClient); err != nil { - return - } - if NewEnabled, err = soap.UnmarshalBoolean(response.NewEnabled); err != nil { - return - } - if NewPortMappingDescription, err = soap.UnmarshalString(response.NewPortMappingDescription); err != nil { - return - } - if NewLeaseDuration, err = soap.UnmarshalUi4(response.NewLeaseDuration); err != nil { - return - } - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANPPPConnection1) AddPortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string, NewInternalPort uint16, NewInternalClient string, NewEnabled bool, NewPortMappingDescription string, NewLeaseDuration uint32) (err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - - NewInternalPort string - - NewInternalClient string - - NewEnabled string - - NewPortMappingDescription string - - NewLeaseDuration string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - if request.NewInternalPort, err = soap.MarshalUi2(NewInternalPort); err != nil { - return - } - if request.NewInternalClient, err = soap.MarshalString(NewInternalClient); err != nil { - return - } - if request.NewEnabled, err = soap.MarshalBoolean(NewEnabled); err != nil { - return - } - if request.NewPortMappingDescription, err = soap.MarshalString(NewPortMappingDescription); err != nil { - return - } - if request.NewLeaseDuration, err = soap.MarshalUi4(NewLeaseDuration); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "AddPortMapping", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -// -// Arguments: -// -// * NewProtocol: allowed values: TCP, UDP - -func (client *WANPPPConnection1) DeletePortMapping(NewRemoteHost string, NewExternalPort uint16, NewProtocol string) (err error) { - // Request structure. - request := &struct { - NewRemoteHost string - - NewExternalPort string - - NewProtocol string - }{} - // BEGIN Marshal arguments into request. - - if request.NewRemoteHost, err = soap.MarshalString(NewRemoteHost); err != nil { - return - } - if request.NewExternalPort, err = soap.MarshalUi2(NewExternalPort); err != nil { - return - } - if request.NewProtocol, err = soap.MarshalString(NewProtocol); err != nil { - return - } - // END Marshal arguments into request. - - // Response structure. - response := interface{}(nil) - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "DeletePortMapping", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - // END Unmarshal arguments from response. - return -} - -func (client *WANPPPConnection1) GetExternalIPAddress() (NewExternalIPAddress string, err error) { - // Request structure. - request := interface{}(nil) - // BEGIN Marshal arguments into request. - - // END Marshal arguments into request. - - // Response structure. - response := &struct { - NewExternalIPAddress string - }{} - - // Perform the SOAP call. - if err = client.SOAPClient.PerformAction(URN_WANPPPConnection_1, "GetExternalIPAddress", request, response); err != nil { - return - } - - // BEGIN Unmarshal arguments from response. - - if NewExternalIPAddress, err = soap.UnmarshalString(response.NewExternalIPAddress); err != nil { - return - } - // END Unmarshal arguments from response. - return -} diff --git a/vendor/github.com/huin/goupnp/device.go b/vendor/github.com/huin/goupnp/device.go deleted file mode 100644 index e5b658b21ad0..000000000000 --- a/vendor/github.com/huin/goupnp/device.go +++ /dev/null @@ -1,184 +0,0 @@ -// This file contains XML structures for communicating with UPnP devices. - -package goupnp - -import ( - "encoding/xml" - "errors" - "fmt" - "net/url" - - "github.com/huin/goupnp/scpd" - "github.com/huin/goupnp/soap" -) - -const ( - DeviceXMLNamespace = "urn:schemas-upnp-org:device-1-0" -) - -// RootDevice is the device description as described by section 2.3 "Device -// description" in -// http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf -type RootDevice struct { - XMLName xml.Name `xml:"root"` - SpecVersion SpecVersion `xml:"specVersion"` - URLBase url.URL `xml:"-"` - URLBaseStr string `xml:"URLBase"` - Device Device `xml:"device"` -} - -// SetURLBase sets the URLBase for the RootDevice and its underlying components. -func (root *RootDevice) SetURLBase(urlBase *url.URL) { - root.URLBase = *urlBase - root.URLBaseStr = urlBase.String() - root.Device.SetURLBase(urlBase) -} - -// SpecVersion is part of a RootDevice, describes the version of the -// specification that the data adheres to. -type SpecVersion struct { - Major int32 `xml:"major"` - Minor int32 `xml:"minor"` -} - -// Device is a UPnP device. It can have child devices. -type Device struct { - DeviceType string `xml:"deviceType"` - FriendlyName string `xml:"friendlyName"` - Manufacturer string `xml:"manufacturer"` - ManufacturerURL URLField `xml:"manufacturerURL"` - ModelDescription string `xml:"modelDescription"` - ModelName string `xml:"modelName"` - ModelNumber string `xml:"modelNumber"` - ModelURL URLField `xml:"modelURL"` - SerialNumber string `xml:"serialNumber"` - UDN string `xml:"UDN"` - UPC string `xml:"UPC,omitempty"` - Icons []Icon `xml:"iconList>icon,omitempty"` - Services []Service `xml:"serviceList>service,omitempty"` - Devices []Device `xml:"deviceList>device,omitempty"` - - // Extra observed elements: - PresentationURL URLField `xml:"presentationURL"` -} - -// VisitDevices calls visitor for the device, and all its descendent devices. -func (device *Device) VisitDevices(visitor func(*Device)) { - visitor(device) - for i := range device.Devices { - device.Devices[i].VisitDevices(visitor) - } -} - -// VisitServices calls visitor for all Services under the device and all its -// descendent devices. -func (device *Device) VisitServices(visitor func(*Service)) { - device.VisitDevices(func(d *Device) { - for i := range d.Services { - visitor(&d.Services[i]) - } - }) -} - -// FindService finds all (if any) Services under the device and its descendents -// that have the given ServiceType. -func (device *Device) FindService(serviceType string) []*Service { - var services []*Service - device.VisitServices(func(s *Service) { - if s.ServiceType == serviceType { - services = append(services, s) - } - }) - return services -} - -// SetURLBase sets the URLBase for the Device and its underlying components. -func (device *Device) SetURLBase(urlBase *url.URL) { - device.ManufacturerURL.SetURLBase(urlBase) - device.ModelURL.SetURLBase(urlBase) - device.PresentationURL.SetURLBase(urlBase) - for i := range device.Icons { - device.Icons[i].SetURLBase(urlBase) - } - for i := range device.Services { - device.Services[i].SetURLBase(urlBase) - } - for i := range device.Devices { - device.Devices[i].SetURLBase(urlBase) - } -} - -func (device *Device) String() string { - return fmt.Sprintf("Device ID %s : %s (%s)", device.UDN, device.DeviceType, device.FriendlyName) -} - -// Icon is a representative image that a device might include in its -// description. -type Icon struct { - Mimetype string `xml:"mimetype"` - Width int32 `xml:"width"` - Height int32 `xml:"height"` - Depth int32 `xml:"depth"` - URL URLField `xml:"url"` -} - -// SetURLBase sets the URLBase for the Icon. -func (icon *Icon) SetURLBase(url *url.URL) { - icon.URL.SetURLBase(url) -} - -// Service is a service provided by a UPnP Device. -type Service struct { - ServiceType string `xml:"serviceType"` - ServiceId string `xml:"serviceId"` - SCPDURL URLField `xml:"SCPDURL"` - ControlURL URLField `xml:"controlURL"` - EventSubURL URLField `xml:"eventSubURL"` -} - -// SetURLBase sets the URLBase for the Service. -func (srv *Service) SetURLBase(urlBase *url.URL) { - srv.SCPDURL.SetURLBase(urlBase) - srv.ControlURL.SetURLBase(urlBase) - srv.EventSubURL.SetURLBase(urlBase) -} - -func (srv *Service) String() string { - return fmt.Sprintf("Service ID %s : %s", srv.ServiceId, srv.ServiceType) -} - -// RequestSCDP requests the SCPD (soap actions and state variables description) -// for the service. -func (srv *Service) RequestSCDP() (*scpd.SCPD, error) { - if !srv.SCPDURL.Ok { - return nil, errors.New("bad/missing SCPD URL, or no URLBase has been set") - } - s := new(scpd.SCPD) - if err := requestXml(srv.SCPDURL.URL.String(), scpd.SCPDXMLNamespace, s); err != nil { - return nil, err - } - return s, nil -} - -func (srv *Service) NewSOAPClient() *soap.SOAPClient { - return soap.NewSOAPClient(srv.ControlURL.URL) -} - -// URLField is a URL that is part of a device description. -type URLField struct { - URL url.URL `xml:"-"` - Ok bool `xml:"-"` - Str string `xml:",chardata"` -} - -func (uf *URLField) SetURLBase(urlBase *url.URL) { - refUrl, err := url.Parse(uf.Str) - if err != nil { - uf.URL = url.URL{} - uf.Ok = false - return - } - - uf.URL = *urlBase.ResolveReference(refUrl) - uf.Ok = true -} diff --git a/vendor/github.com/huin/goupnp/goupnp.go b/vendor/github.com/huin/goupnp/goupnp.go deleted file mode 100644 index fcb8dcd23ded..000000000000 --- a/vendor/github.com/huin/goupnp/goupnp.go +++ /dev/null @@ -1,131 +0,0 @@ -// goupnp is an implementation of a client for various UPnP services. -// -// For most uses, it is recommended to use the code-generated packages under -// github.com/huin/goupnp/dcps. Example use is shown at -// http://godoc.org/github.com/huin/goupnp/example -// -// A commonly used client is internetgateway1.WANPPPConnection1: -// http://godoc.org/github.com/huin/goupnp/dcps/internetgateway1#WANPPPConnection1 -// -// Currently only a couple of schemas have code generated for them from the -// UPnP example XML specifications. Not all methods will work on these clients, -// because the generated stubs contain the full set of specified methods from -// the XML specifications, and the discovered services will likely support a -// subset of those methods. -package goupnp - -import ( - "encoding/xml" - "fmt" - "net/http" - "net/url" - "time" - - "golang.org/x/net/html/charset" - - "github.com/huin/goupnp/httpu" - "github.com/huin/goupnp/ssdp" -) - -// ContextError is an error that wraps an error with some context information. -type ContextError struct { - Context string - Err error -} - -func (err ContextError) Error() string { - return fmt.Sprintf("%s: %v", err.Context, err.Err) -} - -// MaybeRootDevice contains either a RootDevice or an error. -type MaybeRootDevice struct { - // Set iff Err == nil. - Root *RootDevice - - // The location the device was discovered at. This can be used with - // DeviceByURL, assuming the device is still present. A location represents - // the discovery of a device, regardless of if there was an error probing it. - Location *url.URL - - // Any error encountered probing a discovered device. - Err error -} - -// DiscoverDevices attempts to find targets of the given type. This is -// typically the entry-point for this package. searchTarget is typically a URN -// in the form "urn:schemas-upnp-org:device:..." or -// "urn:schemas-upnp-org:service:...". A single error is returned for errors -// while attempting to send the query. An error or RootDevice is returned for -// each discovered RootDevice. -func DiscoverDevices(searchTarget string) ([]MaybeRootDevice, error) { - httpu, err := httpu.NewHTTPUClient() - if err != nil { - return nil, err - } - defer httpu.Close() - responses, err := ssdp.SSDPRawSearch(httpu, string(searchTarget), 2, 3) - if err != nil { - return nil, err - } - - results := make([]MaybeRootDevice, len(responses)) - for i, response := range responses { - maybe := &results[i] - loc, err := response.Location() - if err != nil { - maybe.Err = ContextError{"unexpected bad location from search", err} - continue - } - maybe.Location = loc - if root, err := DeviceByURL(loc); err != nil { - maybe.Err = err - } else { - maybe.Root = root - } - } - - return results, nil -} - -func DeviceByURL(loc *url.URL) (*RootDevice, error) { - locStr := loc.String() - root := new(RootDevice) - if err := requestXml(locStr, DeviceXMLNamespace, root); err != nil { - return nil, ContextError{fmt.Sprintf("error requesting root device details from %q", locStr), err} - } - var urlBaseStr string - if root.URLBaseStr != "" { - urlBaseStr = root.URLBaseStr - } else { - urlBaseStr = locStr - } - urlBase, err := url.Parse(urlBaseStr) - if err != nil { - return nil, ContextError{fmt.Sprintf("error parsing location URL %q", locStr), err} - } - root.SetURLBase(urlBase) - return root, nil -} - -func requestXml(url string, defaultSpace string, doc interface{}) error { - timeout := time.Duration(3 * time.Second) - client := http.Client{ - Timeout: timeout, - } - resp, err := client.Get(url) - if err != nil { - return err - } - defer resp.Body.Close() - - if resp.StatusCode != 200 { - return fmt.Errorf("goupnp: got response status %s from %q", - resp.Status, url) - } - - decoder := xml.NewDecoder(resp.Body) - decoder.DefaultSpace = defaultSpace - decoder.CharsetReader = charset.NewReaderLabel - - return decoder.Decode(doc) -} diff --git a/vendor/github.com/huin/goupnp/httpu/httpu.go b/vendor/github.com/huin/goupnp/httpu/httpu.go deleted file mode 100644 index f52dad68b102..000000000000 --- a/vendor/github.com/huin/goupnp/httpu/httpu.go +++ /dev/null @@ -1,132 +0,0 @@ -package httpu - -import ( - "bufio" - "bytes" - "errors" - "fmt" - "log" - "net" - "net/http" - "sync" - "time" -) - -// HTTPUClient is a client for dealing with HTTPU (HTTP over UDP). Its typical -// function is for HTTPMU, and particularly SSDP. -type HTTPUClient struct { - connLock sync.Mutex // Protects use of conn. - conn net.PacketConn -} - -// NewHTTPUClient creates a new HTTPUClient, opening up a new UDP socket for the -// purpose. -func NewHTTPUClient() (*HTTPUClient, error) { - conn, err := net.ListenPacket("udp", ":0") - if err != nil { - return nil, err - } - return &HTTPUClient{conn: conn}, nil -} - -// NewHTTPUClientAddr creates a new HTTPUClient which will broadcast packets -// from the specified address, opening up a new UDP socket for the purpose -func NewHTTPUClientAddr(addr string) (*HTTPUClient, error) { - ip := net.ParseIP(addr) - if ip == nil { - return nil, errors.New("Invalid listening address") - } - conn, err := net.ListenPacket("udp", ip.String()+":0") - if err != nil { - return nil, err - } - return &HTTPUClient{conn: conn}, nil -} - -// Close shuts down the client. The client will no longer be useful following -// this. -func (httpu *HTTPUClient) Close() error { - httpu.connLock.Lock() - defer httpu.connLock.Unlock() - return httpu.conn.Close() -} - -// Do performs a request. The timeout is how long to wait for before returning -// the responses that were received. An error is only returned for failing to -// send the request. Failures in receipt simply do not add to the resulting -// responses. -// -// Note that at present only one concurrent connection will happen per -// HTTPUClient. -func (httpu *HTTPUClient) Do(req *http.Request, timeout time.Duration, numSends int) ([]*http.Response, error) { - httpu.connLock.Lock() - defer httpu.connLock.Unlock() - - // Create the request. This is a subset of what http.Request.Write does - // deliberately to avoid creating extra fields which may confuse some - // devices. - var requestBuf bytes.Buffer - method := req.Method - if method == "" { - method = "GET" - } - if _, err := fmt.Fprintf(&requestBuf, "%s %s HTTP/1.1\r\n", method, req.URL.RequestURI()); err != nil { - return nil, err - } - if err := req.Header.Write(&requestBuf); err != nil { - return nil, err - } - if _, err := requestBuf.Write([]byte{'\r', '\n'}); err != nil { - return nil, err - } - - destAddr, err := net.ResolveUDPAddr("udp", req.Host) - if err != nil { - return nil, err - } - if err = httpu.conn.SetDeadline(time.Now().Add(timeout)); err != nil { - return nil, err - } - - // Send request. - for i := 0; i < numSends; i++ { - if n, err := httpu.conn.WriteTo(requestBuf.Bytes(), destAddr); err != nil { - return nil, err - } else if n < len(requestBuf.Bytes()) { - return nil, fmt.Errorf("httpu: wrote %d bytes rather than full %d in request", - n, len(requestBuf.Bytes())) - } - time.Sleep(5 * time.Millisecond) - } - - // Await responses until timeout. - var responses []*http.Response - responseBytes := make([]byte, 2048) - for { - // 2048 bytes should be sufficient for most networks. - n, _, err := httpu.conn.ReadFrom(responseBytes) - if err != nil { - if err, ok := err.(net.Error); ok { - if err.Timeout() { - break - } - if err.Temporary() { - // Sleep in case this is a persistent error to avoid pegging CPU until deadline. - time.Sleep(10 * time.Millisecond) - continue - } - } - return nil, err - } - - // Parse response. - response, err := http.ReadResponse(bufio.NewReader(bytes.NewBuffer(responseBytes[:n])), req) - if err != nil { - log.Print("httpu: error while parsing response: %v", err) - continue - } - - responses = append(responses, response) - } - return responses, err -} diff --git a/vendor/github.com/huin/goupnp/httpu/serve.go b/vendor/github.com/huin/goupnp/httpu/serve.go deleted file mode 100644 index 9f67af85b74d..000000000000 --- a/vendor/github.com/huin/goupnp/httpu/serve.go +++ /dev/null @@ -1,108 +0,0 @@ -package httpu - -import ( - "bufio" - "bytes" - "log" - "net" - "net/http" - "regexp" -) - -const ( - DefaultMaxMessageBytes = 2048 -) - -var ( - trailingWhitespaceRx = regexp.MustCompile(" +\r\n") - crlf = []byte("\r\n") -) - -// Handler is the interface by which received HTTPU messages are passed to -// handling code. -type Handler interface { - // ServeMessage is called for each HTTPU message received. peerAddr contains - // the address that the message was received from. - ServeMessage(r *http.Request) -} - -// HandlerFunc is a function-to-Handler adapter. -type HandlerFunc func(r *http.Request) - -func (f HandlerFunc) ServeMessage(r *http.Request) { - f(r) -} - -// A Server defines parameters for running an HTTPU server. -type Server struct { - Addr string // UDP address to listen on - Multicast bool // Should listen for multicast? - Interface *net.Interface // Network interface to listen on for multicast, nil for default multicast interface - Handler Handler // handler to invoke - MaxMessageBytes int // maximum number of bytes to read from a packet, DefaultMaxMessageBytes if 0 -} - -// ListenAndServe listens on the UDP network address srv.Addr. If srv.Multicast -// is true, then a multicast UDP listener will be used on srv.Interface (or -// default interface if nil). -func (srv *Server) ListenAndServe() error { - var err error - - var addr *net.UDPAddr - if addr, err = net.ResolveUDPAddr("udp", srv.Addr); err != nil { - log.Fatal(err) - } - - var conn net.PacketConn - if srv.Multicast { - if conn, err = net.ListenMulticastUDP("udp", srv.Interface, addr); err != nil { - return err - } - } else { - if conn, err = net.ListenUDP("udp", addr); err != nil { - return err - } - } - - return srv.Serve(conn) -} - -// Serve messages received on the given packet listener to the srv.Handler. -func (srv *Server) Serve(l net.PacketConn) error { - maxMessageBytes := DefaultMaxMessageBytes - if srv.MaxMessageBytes != 0 { - maxMessageBytes = srv.MaxMessageBytes - } - for { - buf := make([]byte, maxMessageBytes) - n, peerAddr, err := l.ReadFrom(buf) - if err != nil { - return err - } - buf = buf[:n] - - go func(buf []byte, peerAddr net.Addr) { - // At least one router's UPnP implementation has added a trailing space - // after "HTTP/1.1" - trim it. - buf = trailingWhitespaceRx.ReplaceAllLiteral(buf, crlf) - - req, err := http.ReadRequest(bufio.NewReader(bytes.NewBuffer(buf))) - if err != nil { - log.Printf("httpu: Failed to parse request: %v", err) - return - } - req.RemoteAddr = peerAddr.String() - srv.Handler.ServeMessage(req) - // No need to call req.Body.Close - underlying reader is bytes.Buffer. - }(buf, peerAddr) - } -} - -// Serve messages received on the given packet listener to the given handler. -func Serve(l net.PacketConn, handler Handler) error { - srv := Server{ - Handler: handler, - MaxMessageBytes: DefaultMaxMessageBytes, - } - return srv.Serve(l) -} diff --git a/vendor/github.com/huin/goupnp/scpd/scpd.go b/vendor/github.com/huin/goupnp/scpd/scpd.go deleted file mode 100644 index c9d2e69e81c3..000000000000 --- a/vendor/github.com/huin/goupnp/scpd/scpd.go +++ /dev/null @@ -1,167 +0,0 @@ -package scpd - -import ( - "encoding/xml" - "strings" -) - -const ( - SCPDXMLNamespace = "urn:schemas-upnp-org:service-1-0" -) - -func cleanWhitespace(s *string) { - *s = strings.TrimSpace(*s) -} - -// SCPD is the service description as described by section 2.5 "Service -// description" in -// http://upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf -type SCPD struct { - XMLName xml.Name `xml:"scpd"` - ConfigId string `xml:"configId,attr"` - SpecVersion SpecVersion `xml:"specVersion"` - Actions []Action `xml:"actionList>action"` - StateVariables []StateVariable `xml:"serviceStateTable>stateVariable"` -} - -// Clean attempts to remove stray whitespace etc. in the structure. It seems -// unfortunately common for stray whitespace to be present in SCPD documents, -// this method attempts to make it easy to clean them out. -func (scpd *SCPD) Clean() { - cleanWhitespace(&scpd.ConfigId) - for i := range scpd.Actions { - scpd.Actions[i].clean() - } - for i := range scpd.StateVariables { - scpd.StateVariables[i].clean() - } -} - -func (scpd *SCPD) GetStateVariable(variable string) *StateVariable { - for i := range scpd.StateVariables { - v := &scpd.StateVariables[i] - if v.Name == variable { - return v - } - } - return nil -} - -func (scpd *SCPD) GetAction(action string) *Action { - for i := range scpd.Actions { - a := &scpd.Actions[i] - if a.Name == action { - return a - } - } - return nil -} - -// SpecVersion is part of a SCPD document, describes the version of the -// specification that the data adheres to. -type SpecVersion struct { - Major int32 `xml:"major"` - Minor int32 `xml:"minor"` -} - -type Action struct { - Name string `xml:"name"` - Arguments []Argument `xml:"argumentList>argument"` -} - -func (action *Action) clean() { - cleanWhitespace(&action.Name) - for i := range action.Arguments { - action.Arguments[i].clean() - } -} - -func (action *Action) InputArguments() []*Argument { - var result []*Argument - for i := range action.Arguments { - arg := &action.Arguments[i] - if arg.IsInput() { - result = append(result, arg) - } - } - return result -} - -func (action *Action) OutputArguments() []*Argument { - var result []*Argument - for i := range action.Arguments { - arg := &action.Arguments[i] - if arg.IsOutput() { - result = append(result, arg) - } - } - return result -} - -type Argument struct { - Name string `xml:"name"` - Direction string `xml:"direction"` // in|out - RelatedStateVariable string `xml:"relatedStateVariable"` // ? - Retval string `xml:"retval"` // ? -} - -func (arg *Argument) clean() { - cleanWhitespace(&arg.Name) - cleanWhitespace(&arg.Direction) - cleanWhitespace(&arg.RelatedStateVariable) - cleanWhitespace(&arg.Retval) -} - -func (arg *Argument) IsInput() bool { - return arg.Direction == "in" -} - -func (arg *Argument) IsOutput() bool { - return arg.Direction == "out" -} - -type StateVariable struct { - Name string `xml:"name"` - SendEvents string `xml:"sendEvents,attr"` // yes|no - Multicast string `xml:"multicast,attr"` // yes|no - DataType DataType `xml:"dataType"` - DefaultValue string `xml:"defaultValue"` - AllowedValueRange *AllowedValueRange `xml:"allowedValueRange"` - AllowedValues []string `xml:"allowedValueList>allowedValue"` -} - -func (v *StateVariable) clean() { - cleanWhitespace(&v.Name) - cleanWhitespace(&v.SendEvents) - cleanWhitespace(&v.Multicast) - v.DataType.clean() - cleanWhitespace(&v.DefaultValue) - if v.AllowedValueRange != nil { - v.AllowedValueRange.clean() - } - for i := range v.AllowedValues { - cleanWhitespace(&v.AllowedValues[i]) - } -} - -type AllowedValueRange struct { - Minimum string `xml:"minimum"` - Maximum string `xml:"maximum"` - Step string `xml:"step"` -} - -func (r *AllowedValueRange) clean() { - cleanWhitespace(&r.Minimum) - cleanWhitespace(&r.Maximum) - cleanWhitespace(&r.Step) -} - -type DataType struct { - Name string `xml:",chardata"` - Type string `xml:"type,attr"` -} - -func (dt *DataType) clean() { - cleanWhitespace(&dt.Name) - cleanWhitespace(&dt.Type) -} diff --git a/vendor/github.com/huin/goupnp/service_client.go b/vendor/github.com/huin/goupnp/service_client.go deleted file mode 100644 index 9111c93cb566..000000000000 --- a/vendor/github.com/huin/goupnp/service_client.go +++ /dev/null @@ -1,88 +0,0 @@ -package goupnp - -import ( - "fmt" - "net/url" - - "github.com/huin/goupnp/soap" -) - -// ServiceClient is a SOAP client, root device and the service for the SOAP -// client rolled into one value. The root device, location, and service are -// intended to be informational. Location can be used to later recreate a -// ServiceClient with NewServiceClientByURL if the service is still present; -// bypassing the discovery process. -type ServiceClient struct { - SOAPClient *soap.SOAPClient - RootDevice *RootDevice - Location *url.URL - Service *Service -} - -// NewServiceClients discovers services, and returns clients for them. err will -// report any error with the discovery process (blocking any device/service -// discovery), errors reports errors on a per-root-device basis. -func NewServiceClients(searchTarget string) (clients []ServiceClient, errors []error, err error) { - var maybeRootDevices []MaybeRootDevice - if maybeRootDevices, err = DiscoverDevices(searchTarget); err != nil { - return - } - - clients = make([]ServiceClient, 0, len(maybeRootDevices)) - - for _, maybeRootDevice := range maybeRootDevices { - if maybeRootDevice.Err != nil { - errors = append(errors, maybeRootDevice.Err) - continue - } - - deviceClients, err := NewServiceClientsFromRootDevice(maybeRootDevice.Root, maybeRootDevice.Location, searchTarget) - if err != nil { - errors = append(errors, err) - continue - } - clients = append(clients, deviceClients...) - } - - return -} - -// NewServiceClientsByURL creates client(s) for the given service URN, for a -// root device at the given URL. -func NewServiceClientsByURL(loc *url.URL, searchTarget string) ([]ServiceClient, error) { - rootDevice, err := DeviceByURL(loc) - if err != nil { - return nil, err - } - return NewServiceClientsFromRootDevice(rootDevice, loc, searchTarget) -} - -// NewServiceClientsFromDevice creates client(s) for the given service URN, in -// a given root device. The loc parameter is simply assigned to the -// Location attribute of the returned ServiceClient(s). -func NewServiceClientsFromRootDevice(rootDevice *RootDevice, loc *url.URL, searchTarget string) ([]ServiceClient, error) { - device := &rootDevice.Device - srvs := device.FindService(searchTarget) - if len(srvs) == 0 { - return nil, fmt.Errorf("goupnp: service %q not found within device %q (UDN=%q)", - searchTarget, device.FriendlyName, device.UDN) - } - - clients := make([]ServiceClient, 0, len(srvs)) - for _, srv := range srvs { - clients = append(clients, ServiceClient{ - SOAPClient: srv.NewSOAPClient(), - RootDevice: rootDevice, - Location: loc, - Service: srv, - }) - } - return clients, nil -} - -// GetServiceClient returns the ServiceClient itself. This is provided so that the -// service client attributes can be accessed via an interface method on a -// wrapping type. -func (client *ServiceClient) GetServiceClient() *ServiceClient { - return client -} diff --git a/vendor/github.com/huin/goupnp/soap/soap.go b/vendor/github.com/huin/goupnp/soap/soap.go deleted file mode 100644 index 815610734cf6..000000000000 --- a/vendor/github.com/huin/goupnp/soap/soap.go +++ /dev/null @@ -1,157 +0,0 @@ -// Definition for the SOAP structure required for UPnP's SOAP usage. - -package soap - -import ( - "bytes" - "encoding/xml" - "fmt" - "io/ioutil" - "net/http" - "net/url" - "reflect" -) - -const ( - soapEncodingStyle = "http://schemas.xmlsoap.org/soap/encoding/" - soapPrefix = xml.Header + `` - soapSuffix = `` -) - -type SOAPClient struct { - EndpointURL url.URL - HTTPClient http.Client -} - -func NewSOAPClient(endpointURL url.URL) *SOAPClient { - return &SOAPClient{ - EndpointURL: endpointURL, - } -} - -// PerformSOAPAction makes a SOAP request, with the given action. -// inAction and outAction must both be pointers to structs with string fields -// only. -func (client *SOAPClient) PerformAction(actionNamespace, actionName string, inAction interface{}, outAction interface{}) error { - requestBytes, err := encodeRequestAction(actionNamespace, actionName, inAction) - if err != nil { - return err - } - - response, err := client.HTTPClient.Do(&http.Request{ - Method: "POST", - URL: &client.EndpointURL, - Header: http.Header{ - "SOAPACTION": []string{`"` + actionNamespace + "#" + actionName + `"`}, - "CONTENT-TYPE": []string{"text/xml; charset=\"utf-8\""}, - }, - Body: ioutil.NopCloser(bytes.NewBuffer(requestBytes)), - // Set ContentLength to avoid chunked encoding - some servers might not support it. - ContentLength: int64(len(requestBytes)), - }) - if err != nil { - return fmt.Errorf("goupnp: error performing SOAP HTTP request: %v", err) - } - defer response.Body.Close() - if response.StatusCode != 200 { - return fmt.Errorf("goupnp: SOAP request got HTTP %s", response.Status) - } - - responseEnv := newSOAPEnvelope() - decoder := xml.NewDecoder(response.Body) - if err := decoder.Decode(responseEnv); err != nil { - return fmt.Errorf("goupnp: error decoding response body: %v", err) - } - - if responseEnv.Body.Fault != nil { - return responseEnv.Body.Fault - } - - if outAction != nil { - if err := xml.Unmarshal(responseEnv.Body.RawAction, outAction); err != nil { - return fmt.Errorf("goupnp: error unmarshalling out action: %v, %v", err, responseEnv.Body.RawAction) - } - } - - return nil -} - -// newSOAPAction creates a soapEnvelope with the given action and arguments. -func newSOAPEnvelope() *soapEnvelope { - return &soapEnvelope{ - EncodingStyle: soapEncodingStyle, - } -} - -// encodeRequestAction is a hacky way to create an encoded SOAP envelope -// containing the given action. Experiments with one router have shown that it -// 500s for requests where the outer default xmlns is set to the SOAP -// namespace, and then reassigning the default namespace within that to the -// service namespace. Hand-coding the outer XML to work-around this. -func encodeRequestAction(actionNamespace, actionName string, inAction interface{}) ([]byte, error) { - requestBuf := new(bytes.Buffer) - requestBuf.WriteString(soapPrefix) - requestBuf.WriteString(``) - if inAction != nil { - if err := encodeRequestArgs(requestBuf, inAction); err != nil { - return nil, err - } - } - requestBuf.WriteString(``) - requestBuf.WriteString(soapSuffix) - return requestBuf.Bytes(), nil -} - -func encodeRequestArgs(w *bytes.Buffer, inAction interface{}) error { - in := reflect.Indirect(reflect.ValueOf(inAction)) - if in.Kind() != reflect.Struct { - return fmt.Errorf("goupnp: SOAP inAction is not a struct but of type %v", in.Type()) - } - enc := xml.NewEncoder(w) - nFields := in.NumField() - inType := in.Type() - for i := 0; i < nFields; i++ { - field := inType.Field(i) - argName := field.Name - if nameOverride := field.Tag.Get("soap"); nameOverride != "" { - argName = nameOverride - } - value := in.Field(i) - if value.Kind() != reflect.String { - return fmt.Errorf("goupnp: SOAP arg %q is not of type string, but of type %v", argName, value.Type()) - } - if err := enc.EncodeElement(value.Interface(), xml.StartElement{xml.Name{"", argName}, nil}); err != nil { - return fmt.Errorf("goupnp: error encoding SOAP arg %q: %v", argName, err) - } - } - enc.Flush() - return nil -} - -type soapEnvelope struct { - XMLName xml.Name `xml:"http://schemas.xmlsoap.org/soap/envelope/ Envelope"` - EncodingStyle string `xml:"http://schemas.xmlsoap.org/soap/envelope/ encodingStyle,attr"` - Body soapBody `xml:"http://schemas.xmlsoap.org/soap/envelope/ Body"` -} - -type soapBody struct { - Fault *SOAPFaultError `xml:"Fault"` - RawAction []byte `xml:",innerxml"` -} - -// SOAPFaultError implements error, and contains SOAP fault information. -type SOAPFaultError struct { - FaultCode string `xml:"faultcode"` - FaultString string `xml:"faultstring"` - Detail string `xml:"detail"` -} - -func (err *SOAPFaultError) Error() string { - return fmt.Sprintf("SOAP fault: %s", err.FaultString) -} diff --git a/vendor/github.com/huin/goupnp/soap/types.go b/vendor/github.com/huin/goupnp/soap/types.go deleted file mode 100644 index fdbeec8d42d5..000000000000 --- a/vendor/github.com/huin/goupnp/soap/types.go +++ /dev/null @@ -1,519 +0,0 @@ -package soap - -import ( - "encoding/base64" - "encoding/hex" - "errors" - "fmt" - "net/url" - "regexp" - "strconv" - "strings" - "time" - "unicode/utf8" -) - -var ( - // localLoc acts like time.Local for this package, but is faked out by the - // unit tests to ensure that things stay constant (especially when running - // this test in a place where local time is UTC which might mask bugs). - localLoc = time.Local -) - -func MarshalUi1(v uint8) (string, error) { - return strconv.FormatUint(uint64(v), 10), nil -} - -func UnmarshalUi1(s string) (uint8, error) { - v, err := strconv.ParseUint(s, 10, 8) - return uint8(v), err -} - -func MarshalUi2(v uint16) (string, error) { - return strconv.FormatUint(uint64(v), 10), nil -} - -func UnmarshalUi2(s string) (uint16, error) { - v, err := strconv.ParseUint(s, 10, 16) - return uint16(v), err -} - -func MarshalUi4(v uint32) (string, error) { - return strconv.FormatUint(uint64(v), 10), nil -} - -func UnmarshalUi4(s string) (uint32, error) { - v, err := strconv.ParseUint(s, 10, 32) - return uint32(v), err -} - -func MarshalI1(v int8) (string, error) { - return strconv.FormatInt(int64(v), 10), nil -} - -func UnmarshalI1(s string) (int8, error) { - v, err := strconv.ParseInt(s, 10, 8) - return int8(v), err -} - -func MarshalI2(v int16) (string, error) { - return strconv.FormatInt(int64(v), 10), nil -} - -func UnmarshalI2(s string) (int16, error) { - v, err := strconv.ParseInt(s, 10, 16) - return int16(v), err -} - -func MarshalI4(v int32) (string, error) { - return strconv.FormatInt(int64(v), 10), nil -} - -func UnmarshalI4(s string) (int32, error) { - v, err := strconv.ParseInt(s, 10, 32) - return int32(v), err -} - -func MarshalInt(v int64) (string, error) { - return strconv.FormatInt(v, 10), nil -} - -func UnmarshalInt(s string) (int64, error) { - return strconv.ParseInt(s, 10, 64) -} - -func MarshalR4(v float32) (string, error) { - return strconv.FormatFloat(float64(v), 'G', -1, 32), nil -} - -func UnmarshalR4(s string) (float32, error) { - v, err := strconv.ParseFloat(s, 32) - return float32(v), err -} - -func MarshalR8(v float64) (string, error) { - return strconv.FormatFloat(v, 'G', -1, 64), nil -} - -func UnmarshalR8(s string) (float64, error) { - v, err := strconv.ParseFloat(s, 64) - return float64(v), err -} - -// MarshalFixed14_4 marshals float64 to SOAP "fixed.14.4" type. -func MarshalFixed14_4(v float64) (string, error) { - if v >= 1e14 || v <= -1e14 { - return "", fmt.Errorf("soap fixed14.4: value %v out of bounds", v) - } - return strconv.FormatFloat(v, 'f', 4, 64), nil -} - -// UnmarshalFixed14_4 unmarshals float64 from SOAP "fixed.14.4" type. -func UnmarshalFixed14_4(s string) (float64, error) { - v, err := strconv.ParseFloat(s, 64) - if err != nil { - return 0, err - } - if v >= 1e14 || v <= -1e14 { - return 0, fmt.Errorf("soap fixed14.4: value %q out of bounds", s) - } - return v, nil -} - -// MarshalChar marshals rune to SOAP "char" type. -func MarshalChar(v rune) (string, error) { - if v == 0 { - return "", errors.New("soap char: rune 0 is not allowed") - } - return string(v), nil -} - -// UnmarshalChar unmarshals rune from SOAP "char" type. -func UnmarshalChar(s string) (rune, error) { - if len(s) == 0 { - return 0, errors.New("soap char: got empty string") - } - r, n := utf8.DecodeRune([]byte(s)) - if n != len(s) { - return 0, fmt.Errorf("soap char: value %q is not a single rune", s) - } - return r, nil -} - -func MarshalString(v string) (string, error) { - return v, nil -} - -func UnmarshalString(v string) (string, error) { - return v, nil -} - -func parseInt(s string, err *error) int { - v, parseErr := strconv.ParseInt(s, 10, 64) - if parseErr != nil { - *err = parseErr - } - return int(v) -} - -var dateRegexps = []*regexp.Regexp{ - // yyyy[-mm[-dd]] - regexp.MustCompile(`^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?$`), - // yyyy[mm[dd]] - regexp.MustCompile(`^(\d{4})(?:(\d{2})(?:(\d{2}))?)?$`), -} - -func parseDateParts(s string) (year, month, day int, err error) { - var parts []string - for _, re := range dateRegexps { - parts = re.FindStringSubmatch(s) - if parts != nil { - break - } - } - if parts == nil { - err = fmt.Errorf("soap date: value %q is not in a recognized ISO8601 date format", s) - return - } - - year = parseInt(parts[1], &err) - month = 1 - day = 1 - if len(parts[2]) != 0 { - month = parseInt(parts[2], &err) - if len(parts[3]) != 0 { - day = parseInt(parts[3], &err) - } - } - - if err != nil { - err = fmt.Errorf("soap date: %q: %v", s, err) - } - - return -} - -var timeRegexps = []*regexp.Regexp{ - // hh[:mm[:ss]] - regexp.MustCompile(`^(\d{2})(?::(\d{2})(?::(\d{2}))?)?$`), - // hh[mm[ss]] - regexp.MustCompile(`^(\d{2})(?:(\d{2})(?:(\d{2}))?)?$`), -} - -func parseTimeParts(s string) (hour, minute, second int, err error) { - var parts []string - for _, re := range timeRegexps { - parts = re.FindStringSubmatch(s) - if parts != nil { - break - } - } - if parts == nil { - err = fmt.Errorf("soap time: value %q is not in ISO8601 time format", s) - return - } - - hour = parseInt(parts[1], &err) - if len(parts[2]) != 0 { - minute = parseInt(parts[2], &err) - if len(parts[3]) != 0 { - second = parseInt(parts[3], &err) - } - } - - if err != nil { - err = fmt.Errorf("soap time: %q: %v", s, err) - } - - return -} - -// (+|-)hh[[:]mm] -var timezoneRegexp = regexp.MustCompile(`^([+-])(\d{2})(?::?(\d{2}))?$`) - -func parseTimezone(s string) (offset int, err error) { - if s == "Z" { - return 0, nil - } - parts := timezoneRegexp.FindStringSubmatch(s) - if parts == nil { - err = fmt.Errorf("soap timezone: value %q is not in ISO8601 timezone format", s) - return - } - - offset = parseInt(parts[2], &err) * 3600 - if len(parts[3]) != 0 { - offset += parseInt(parts[3], &err) * 60 - } - if parts[1] == "-" { - offset = -offset - } - - if err != nil { - err = fmt.Errorf("soap timezone: %q: %v", s, err) - } - - return -} - -var completeDateTimeZoneRegexp = regexp.MustCompile(`^([^T]+)(?:T([^-+Z]+)(.+)?)?$`) - -// splitCompleteDateTimeZone splits date, time and timezone apart from an -// ISO8601 string. It does not ensure that the contents of each part are -// correct, it merely splits on certain delimiters. -// e.g "2010-09-08T12:15:10+0700" => "2010-09-08", "12:15:10", "+0700". -// Timezone can only be present if time is also present. -func splitCompleteDateTimeZone(s string) (dateStr, timeStr, zoneStr string, err error) { - parts := completeDateTimeZoneRegexp.FindStringSubmatch(s) - if parts == nil { - err = fmt.Errorf("soap date/time/zone: value %q is not in ISO8601 datetime format", s) - return - } - dateStr = parts[1] - timeStr = parts[2] - zoneStr = parts[3] - return -} - -// MarshalDate marshals time.Time to SOAP "date" type. Note that this converts -// to local time, and discards the time-of-day components. -func MarshalDate(v time.Time) (string, error) { - return v.In(localLoc).Format("2006-01-02"), nil -} - -var dateFmts = []string{"2006-01-02", "20060102"} - -// UnmarshalDate unmarshals time.Time from SOAP "date" type. This outputs the -// date as midnight in the local time zone. -func UnmarshalDate(s string) (time.Time, error) { - year, month, day, err := parseDateParts(s) - if err != nil { - return time.Time{}, err - } - return time.Date(year, time.Month(month), day, 0, 0, 0, 0, localLoc), nil -} - -// TimeOfDay is used in cases where SOAP "time" or "time.tz" is used. -type TimeOfDay struct { - // Duration of time since midnight. - FromMidnight time.Duration - - // Set to true if Offset is specified. If false, then the timezone is - // unspecified (and by ISO8601 - implies some "local" time). - HasOffset bool - - // Offset is non-zero only if time.tz is used. It is otherwise ignored. If - // non-zero, then it is regarded as a UTC offset in seconds. Note that the - // sub-minutes is ignored by the marshal function. - Offset int -} - -// MarshalTimeOfDay marshals TimeOfDay to the "time" type. -func MarshalTimeOfDay(v TimeOfDay) (string, error) { - d := int64(v.FromMidnight / time.Second) - hour := d / 3600 - d = d % 3600 - minute := d / 60 - second := d % 60 - - return fmt.Sprintf("%02d:%02d:%02d", hour, minute, second), nil -} - -// UnmarshalTimeOfDay unmarshals TimeOfDay from the "time" type. -func UnmarshalTimeOfDay(s string) (TimeOfDay, error) { - t, err := UnmarshalTimeOfDayTz(s) - if err != nil { - return TimeOfDay{}, err - } else if t.HasOffset { - return TimeOfDay{}, fmt.Errorf("soap time: value %q contains unexpected timezone") - } - return t, nil -} - -// MarshalTimeOfDayTz marshals TimeOfDay to the "time.tz" type. -func MarshalTimeOfDayTz(v TimeOfDay) (string, error) { - d := int64(v.FromMidnight / time.Second) - hour := d / 3600 - d = d % 3600 - minute := d / 60 - second := d % 60 - - tz := "" - if v.HasOffset { - if v.Offset == 0 { - tz = "Z" - } else { - offsetMins := v.Offset / 60 - sign := '+' - if offsetMins < 1 { - offsetMins = -offsetMins - sign = '-' - } - tz = fmt.Sprintf("%c%02d:%02d", sign, offsetMins/60, offsetMins%60) - } - } - - return fmt.Sprintf("%02d:%02d:%02d%s", hour, minute, second, tz), nil -} - -// UnmarshalTimeOfDayTz unmarshals TimeOfDay from the "time.tz" type. -func UnmarshalTimeOfDayTz(s string) (tod TimeOfDay, err error) { - zoneIndex := strings.IndexAny(s, "Z+-") - var timePart string - var hasOffset bool - var offset int - if zoneIndex == -1 { - hasOffset = false - timePart = s - } else { - hasOffset = true - timePart = s[:zoneIndex] - if offset, err = parseTimezone(s[zoneIndex:]); err != nil { - return - } - } - - hour, minute, second, err := parseTimeParts(timePart) - if err != nil { - return - } - - fromMidnight := time.Duration(hour*3600+minute*60+second) * time.Second - - // ISO8601 special case - values up to 24:00:00 are allowed, so using - // strictly greater-than for the maximum value. - if fromMidnight > 24*time.Hour || minute >= 60 || second >= 60 { - return TimeOfDay{}, fmt.Errorf("soap time.tz: value %q has value(s) out of range", s) - } - - return TimeOfDay{ - FromMidnight: time.Duration(hour*3600+minute*60+second) * time.Second, - HasOffset: hasOffset, - Offset: offset, - }, nil -} - -// MarshalDateTime marshals time.Time to SOAP "dateTime" type. Note that this -// converts to local time. -func MarshalDateTime(v time.Time) (string, error) { - return v.In(localLoc).Format("2006-01-02T15:04:05"), nil -} - -// UnmarshalDateTime unmarshals time.Time from the SOAP "dateTime" type. This -// returns a value in the local timezone. -func UnmarshalDateTime(s string) (result time.Time, err error) { - dateStr, timeStr, zoneStr, err := splitCompleteDateTimeZone(s) - if err != nil { - return - } - - if len(zoneStr) != 0 { - err = fmt.Errorf("soap datetime: unexpected timezone in %q", s) - return - } - - year, month, day, err := parseDateParts(dateStr) - if err != nil { - return - } - - var hour, minute, second int - if len(timeStr) != 0 { - hour, minute, second, err = parseTimeParts(timeStr) - if err != nil { - return - } - } - - result = time.Date(year, time.Month(month), day, hour, minute, second, 0, localLoc) - return -} - -// MarshalDateTimeTz marshals time.Time to SOAP "dateTime.tz" type. -func MarshalDateTimeTz(v time.Time) (string, error) { - return v.Format("2006-01-02T15:04:05-07:00"), nil -} - -// UnmarshalDateTimeTz unmarshals time.Time from the SOAP "dateTime.tz" type. -// This returns a value in the local timezone when the timezone is unspecified. -func UnmarshalDateTimeTz(s string) (result time.Time, err error) { - dateStr, timeStr, zoneStr, err := splitCompleteDateTimeZone(s) - if err != nil { - return - } - - year, month, day, err := parseDateParts(dateStr) - if err != nil { - return - } - - var hour, minute, second int - var location *time.Location = localLoc - if len(timeStr) != 0 { - hour, minute, second, err = parseTimeParts(timeStr) - if err != nil { - return - } - if len(zoneStr) != 0 { - var offset int - offset, err = parseTimezone(zoneStr) - if offset == 0 { - location = time.UTC - } else { - location = time.FixedZone("", offset) - } - } - } - - result = time.Date(year, time.Month(month), day, hour, minute, second, 0, location) - return -} - -// MarshalBoolean marshals bool to SOAP "boolean" type. -func MarshalBoolean(v bool) (string, error) { - if v { - return "1", nil - } - return "0", nil -} - -// UnmarshalBoolean unmarshals bool from the SOAP "boolean" type. -func UnmarshalBoolean(s string) (bool, error) { - switch s { - case "0", "false", "no": - return false, nil - case "1", "true", "yes": - return true, nil - } - return false, fmt.Errorf("soap boolean: %q is not a valid boolean value", s) -} - -// MarshalBinBase64 marshals []byte to SOAP "bin.base64" type. -func MarshalBinBase64(v []byte) (string, error) { - return base64.StdEncoding.EncodeToString(v), nil -} - -// UnmarshalBinBase64 unmarshals []byte from the SOAP "bin.base64" type. -func UnmarshalBinBase64(s string) ([]byte, error) { - return base64.StdEncoding.DecodeString(s) -} - -// MarshalBinHex marshals []byte to SOAP "bin.hex" type. -func MarshalBinHex(v []byte) (string, error) { - return hex.EncodeToString(v), nil -} - -// UnmarshalBinHex unmarshals []byte from the SOAP "bin.hex" type. -func UnmarshalBinHex(s string) ([]byte, error) { - return hex.DecodeString(s) -} - -// MarshalURI marshals *url.URL to SOAP "uri" type. -func MarshalURI(v *url.URL) (string, error) { - return v.String(), nil -} - -// UnmarshalURI unmarshals *url.URL from the SOAP "uri" type. -func UnmarshalURI(s string) (*url.URL, error) { - return url.Parse(s) -} diff --git a/vendor/github.com/huin/goupnp/ssdp/registry.go b/vendor/github.com/huin/goupnp/ssdp/registry.go deleted file mode 100644 index d3bc114463a8..000000000000 --- a/vendor/github.com/huin/goupnp/ssdp/registry.go +++ /dev/null @@ -1,312 +0,0 @@ -package ssdp - -import ( - "fmt" - "log" - "net/http" - "net/url" - "regexp" - "strconv" - "sync" - "time" - - "github.com/huin/goupnp/httpu" -) - -const ( - maxExpiryTimeSeconds = 24 * 60 * 60 -) - -var ( - maxAgeRx = regexp.MustCompile("max-age= *([0-9]+)") -) - -const ( - EventAlive = EventType(iota) - EventUpdate - EventByeBye -) - -type EventType int8 - -func (et EventType) String() string { - switch et { - case EventAlive: - return "EventAlive" - case EventUpdate: - return "EventUpdate" - case EventByeBye: - return "EventByeBye" - default: - return fmt.Sprintf("EventUnknown(%d)", int8(et)) - } -} - -type Update struct { - // The USN of the service. - USN string - // What happened. - EventType EventType - // The entry, which is nil if the service was not known and - // EventType==EventByeBye. The contents of this must not be modified as it is - // shared with the registry and other listeners. Once created, the Registry - // does not modify the Entry value - any updates are replaced with a new - // Entry value. - Entry *Entry -} - -type Entry struct { - // The address that the entry data was actually received from. - RemoteAddr string - // Unique Service Name. Identifies a unique instance of a device or service. - USN string - // Notfication Type. The type of device or service being announced. - NT string - // Server's self-identifying string. - Server string - Host string - // Location of the UPnP root device description. - Location url.URL - - // Despite BOOTID,CONFIGID being required fields, apparently they are not - // always set by devices. Set to -1 if not present. - - BootID int32 - ConfigID int32 - - SearchPort uint16 - - // When the last update was received for this entry identified by this USN. - LastUpdate time.Time - // When the last update's cached values are advised to expire. - CacheExpiry time.Time -} - -func newEntryFromRequest(r *http.Request) (*Entry, error) { - now := time.Now() - expiryDuration, err := parseCacheControlMaxAge(r.Header.Get("CACHE-CONTROL")) - if err != nil { - return nil, fmt.Errorf("ssdp: error parsing CACHE-CONTROL max age: %v", err) - } - - loc, err := url.Parse(r.Header.Get("LOCATION")) - if err != nil { - return nil, fmt.Errorf("ssdp: error parsing entry Location URL: %v", err) - } - - bootID, err := parseUpnpIntHeader(r.Header, "BOOTID.UPNP.ORG", -1) - if err != nil { - return nil, err - } - configID, err := parseUpnpIntHeader(r.Header, "CONFIGID.UPNP.ORG", -1) - if err != nil { - return nil, err - } - searchPort, err := parseUpnpIntHeader(r.Header, "SEARCHPORT.UPNP.ORG", ssdpSearchPort) - if err != nil { - return nil, err - } - - if searchPort < 1 || searchPort > 65535 { - return nil, fmt.Errorf("ssdp: search port %d is out of range", searchPort) - } - - return &Entry{ - RemoteAddr: r.RemoteAddr, - USN: r.Header.Get("USN"), - NT: r.Header.Get("NT"), - Server: r.Header.Get("SERVER"), - Host: r.Header.Get("HOST"), - Location: *loc, - BootID: bootID, - ConfigID: configID, - SearchPort: uint16(searchPort), - LastUpdate: now, - CacheExpiry: now.Add(expiryDuration), - }, nil -} - -func parseCacheControlMaxAge(cc string) (time.Duration, error) { - matches := maxAgeRx.FindStringSubmatch(cc) - if len(matches) != 2 { - return 0, fmt.Errorf("did not find exactly one max-age in cache control header: %q", cc) - } - expirySeconds, err := strconv.ParseInt(matches[1], 10, 16) - if err != nil { - return 0, err - } - if expirySeconds < 1 || expirySeconds > maxExpiryTimeSeconds { - return 0, fmt.Errorf("rejecting bad expiry time of %d seconds", expirySeconds) - } - return time.Duration(expirySeconds) * time.Second, nil -} - -// parseUpnpIntHeader is intended to parse the -// {BOOT,CONFIGID,SEARCHPORT}.UPNP.ORG header fields. It returns the def if -// the head is empty or missing. -func parseUpnpIntHeader(headers http.Header, headerName string, def int32) (int32, error) { - s := headers.Get(headerName) - if s == "" { - return def, nil - } - v, err := strconv.ParseInt(s, 10, 32) - if err != nil { - return 0, fmt.Errorf("ssdp: could not parse header %s: %v", headerName, err) - } - return int32(v), nil -} - -var _ httpu.Handler = new(Registry) - -// Registry maintains knowledge of discovered devices and services. -// -// NOTE: the interface for this is experimental and may change, or go away -// entirely. -type Registry struct { - lock sync.Mutex - byUSN map[string]*Entry - - listenersLock sync.RWMutex - listeners map[chan<- Update]struct{} -} - -func NewRegistry() *Registry { - return &Registry{ - byUSN: make(map[string]*Entry), - listeners: make(map[chan<- Update]struct{}), - } -} - -// NewServerAndRegistry is a convenience function to create a registry, and an -// httpu server to pass it messages. Call ListenAndServe on the server for -// messages to be processed. -func NewServerAndRegistry() (*httpu.Server, *Registry) { - reg := NewRegistry() - srv := &httpu.Server{ - Addr: ssdpUDP4Addr, - Multicast: true, - Handler: reg, - } - return srv, reg -} - -func (reg *Registry) AddListener(c chan<- Update) { - reg.listenersLock.Lock() - defer reg.listenersLock.Unlock() - reg.listeners[c] = struct{}{} -} - -func (reg *Registry) RemoveListener(c chan<- Update) { - reg.listenersLock.Lock() - defer reg.listenersLock.Unlock() - delete(reg.listeners, c) -} - -func (reg *Registry) sendUpdate(u Update) { - reg.listenersLock.RLock() - defer reg.listenersLock.RUnlock() - for c := range reg.listeners { - c <- u - } -} - -// GetService returns known service (or device) entries for the given service -// URN. -func (reg *Registry) GetService(serviceURN string) []*Entry { - // Currently assumes that the map is small, so we do a linear search rather - // than indexed to avoid maintaining two maps. - var results []*Entry - reg.lock.Lock() - defer reg.lock.Unlock() - for _, entry := range reg.byUSN { - if entry.NT == serviceURN { - results = append(results, entry) - } - } - return results -} - -// ServeMessage implements httpu.Handler, and uses SSDP NOTIFY requests to -// maintain the registry of devices and services. -func (reg *Registry) ServeMessage(r *http.Request) { - if r.Method != methodNotify { - return - } - - nts := r.Header.Get("nts") - - var err error - switch nts { - case ntsAlive: - err = reg.handleNTSAlive(r) - case ntsUpdate: - err = reg.handleNTSUpdate(r) - case ntsByebye: - err = reg.handleNTSByebye(r) - default: - err = fmt.Errorf("unknown NTS value: %q", nts) - } - if err != nil { - log.Printf("goupnp/ssdp: failed to handle %s message from %s: %v", nts, r.RemoteAddr, err) - } -} - -func (reg *Registry) handleNTSAlive(r *http.Request) error { - entry, err := newEntryFromRequest(r) - if err != nil { - return err - } - - reg.lock.Lock() - reg.byUSN[entry.USN] = entry - reg.lock.Unlock() - - reg.sendUpdate(Update{ - USN: entry.USN, - EventType: EventAlive, - Entry: entry, - }) - - return nil -} - -func (reg *Registry) handleNTSUpdate(r *http.Request) error { - entry, err := newEntryFromRequest(r) - if err != nil { - return err - } - nextBootID, err := parseUpnpIntHeader(r.Header, "NEXTBOOTID.UPNP.ORG", -1) - if err != nil { - return err - } - entry.BootID = nextBootID - - reg.lock.Lock() - reg.byUSN[entry.USN] = entry - reg.lock.Unlock() - - reg.sendUpdate(Update{ - USN: entry.USN, - EventType: EventUpdate, - Entry: entry, - }) - - return nil -} - -func (reg *Registry) handleNTSByebye(r *http.Request) error { - usn := r.Header.Get("USN") - - reg.lock.Lock() - entry := reg.byUSN[usn] - delete(reg.byUSN, usn) - reg.lock.Unlock() - - reg.sendUpdate(Update{ - USN: usn, - EventType: EventByeBye, - Entry: entry, - }) - - return nil -} diff --git a/vendor/github.com/huin/goupnp/ssdp/ssdp.go b/vendor/github.com/huin/goupnp/ssdp/ssdp.go deleted file mode 100644 index 8178f5d9486f..000000000000 --- a/vendor/github.com/huin/goupnp/ssdp/ssdp.go +++ /dev/null @@ -1,83 +0,0 @@ -package ssdp - -import ( - "errors" - "log" - "net/http" - "net/url" - "strconv" - "time" - - "github.com/huin/goupnp/httpu" -) - -const ( - ssdpDiscover = `"ssdp:discover"` - ntsAlive = `ssdp:alive` - ntsByebye = `ssdp:byebye` - ntsUpdate = `ssdp:update` - ssdpUDP4Addr = "239.255.255.250:1900" - ssdpSearchPort = 1900 - methodSearch = "M-SEARCH" - methodNotify = "NOTIFY" -) - -// SSDPRawSearch performs a fairly raw SSDP search request, and returns the -// unique response(s) that it receives. Each response has the requested -// searchTarget, a USN, and a valid location. maxWaitSeconds states how long to -// wait for responses in seconds, and must be a minimum of 1 (the -// implementation waits an additional 100ms for responses to arrive), 2 is a -// reasonable value for this. numSends is the number of requests to send - 3 is -// a reasonable value for this. -func SSDPRawSearch(httpu *httpu.HTTPUClient, searchTarget string, maxWaitSeconds int, numSends int) ([]*http.Response, error) { - if maxWaitSeconds < 1 { - return nil, errors.New("ssdp: maxWaitSeconds must be >= 1") - } - - seenUsns := make(map[string]bool) - var responses []*http.Response - req := http.Request{ - Method: methodSearch, - // TODO: Support both IPv4 and IPv6. - Host: ssdpUDP4Addr, - URL: &url.URL{Opaque: "*"}, - Header: http.Header{ - // Putting headers in here avoids them being title-cased. - // (The UPnP discovery protocol uses case-sensitive headers) - "HOST": []string{ssdpUDP4Addr}, - "MX": []string{strconv.FormatInt(int64(maxWaitSeconds), 10)}, - "MAN": []string{ssdpDiscover}, - "ST": []string{searchTarget}, - }, - } - allResponses, err := httpu.Do(&req, time.Duration(maxWaitSeconds)*time.Second+100*time.Millisecond, numSends) - if err != nil { - return nil, err - } - for _, response := range allResponses { - if response.StatusCode != 200 { - log.Printf("ssdp: got response status code %q in search response", response.Status) - continue - } - if st := response.Header.Get("ST"); st != searchTarget { - log.Printf("ssdp: got unexpected search target result %q", st) - continue - } - location, err := response.Location() - if err != nil { - log.Printf("ssdp: no usable location in search response (discarding): %v", err) - continue - } - usn := response.Header.Get("USN") - if usn == "" { - log.Printf("ssdp: empty/missing USN in search response (using location instead): %v", err) - usn = location.String() - } - if _, alreadySeen := seenUsns[usn]; !alreadySeen { - seenUsns[usn] = true - responses = append(responses, response) - } - } - - return responses, nil -} diff --git a/vendor/github.com/influxdata/influxdb/LICENSE b/vendor/github.com/influxdata/influxdb/LICENSE deleted file mode 100644 index 63cef79ba6f6..000000000000 --- a/vendor/github.com/influxdata/influxdb/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013-2016 Errplane Inc. - -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/influxdata/influxdb/LICENSE_OF_DEPENDENCIES.md b/vendor/github.com/influxdata/influxdb/LICENSE_OF_DEPENDENCIES.md deleted file mode 100644 index ea6fc69f30d1..000000000000 --- a/vendor/github.com/influxdata/influxdb/LICENSE_OF_DEPENDENCIES.md +++ /dev/null @@ -1,62 +0,0 @@ -- # List -- bootstrap 3.3.5 [MIT LICENSE](https://github.com/twbs/bootstrap/blob/master/LICENSE) -- collectd.org [ISC LICENSE](https://github.com/collectd/go-collectd/blob/master/LICENSE) -- github.com/BurntSushi/toml [MIT LICENSE](https://github.com/BurntSushi/toml/blob/master/COPYING) -- github.com/RoaringBitmap/roaring [APACHE LICENSE](https://github.com/RoaringBitmap/roaring/blob/master/LICENSE) -- github.com/beorn7/perks [MIT LICENSE](https://github.com/beorn7/perks/blob/master/LICENSE) -- github.com/bmizerany/pat [MIT LICENSE](https://github.com/bmizerany/pat#license) -- github.com/boltdb/bolt [MIT LICENSE](https://github.com/boltdb/bolt/blob/master/LICENSE) -- github.com/cespare/xxhash [MIT LICENSE](https://github.com/cespare/xxhash/blob/master/LICENSE.txt) -- github.com/clarkduvall/hyperloglog [MIT LICENSE](https://github.com/clarkduvall/hyperloglog/blob/master/LICENSE) -- github.com/davecgh/go-spew/spew [ISC LICENSE](https://github.com/davecgh/go-spew/blob/master/LICENSE) -- github.com/dgrijalva/jwt-go [MIT LICENSE](https://github.com/dgrijalva/jwt-go/blob/master/LICENSE) -- github.com/dgryski/go-bits [MIT LICENSE](https://github.com/dgryski/go-bits/blob/master/LICENSE) -- github.com/dgryski/go-bitstream [MIT LICENSE](https://github.com/dgryski/go-bitstream/blob/master/LICENSE) -- github.com/glycerine/go-unsnap-stream [MIT LICENSE](https://github.com/glycerine/go-unsnap-stream/blob/master/LICENSE) -- github.com/gogo/protobuf/proto [BSD LICENSE](https://github.com/gogo/protobuf/blob/master/LICENSE) -- github.com/golang/protobuf [BSD LICENSE](https://github.com/golang/protobuf/blob/master/LICENSE) -- github.com/golang/snappy [BSD LICENSE](https://github.com/golang/snappy/blob/master/LICENSE) -- github.com/google/go-cmp [BSD LICENSE](https://github.com/google/go-cmp/blob/master/LICENSE) -- github.com/influxdata/influxql [MIT LICENSE](https://github.com/influxdata/influxql/blob/master/LICENSE) -- github.com/influxdata/usage-client [MIT LICENSE](https://github.com/influxdata/usage-client/blob/master/LICENSE.txt) -- github.com/influxdata/yamux [MOZILLA PUBLIC LICENSE](https://github.com/influxdata/yamux/blob/master/LICENSE) -- github.com/influxdata/yarpc [MIT LICENSE](https://github.com/influxdata/yarpc/blob/master/LICENSE) -- github.com/jsternberg/zap-logfmt [MIT LICENSE](https://github.com/jsternberg/zap-logfmt/blob/master/LICENSE) -- github.com/jwilder/encoding [MIT LICENSE](https://github.com/jwilder/encoding/blob/master/LICENSE) -- github.com/mattn/go-isatty [MIT LICENSE](https://github.com/mattn/go-isatty/blob/master/LICENSE) -- github.com/matttproud/golang_protobuf_extensions [APACHE LICENSE](https://github.com/matttproud/golang_protobuf_extensions/blob/master/LICENSE) -- github.com/opentracing/opentracing-go [MIT LICENSE](https://github.com/opentracing/opentracing-go/blob/master/LICENSE) -- github.com/paulbellamy/ratecounter [MIT LICENSE](https://github.com/paulbellamy/ratecounter/blob/master/LICENSE) -- github.com/peterh/liner [MIT LICENSE](https://github.com/peterh/liner/blob/master/COPYING) -- github.com/philhofer/fwd [MIT LICENSE](https://github.com/philhofer/fwd/blob/master/LICENSE.md) -- github.com/prometheus/client_golang [MIT LICENSE](https://github.com/prometheus/client_golang/blob/master/LICENSE) -- github.com/prometheus/client_model [MIT LICENSE](https://github.com/prometheus/client_model/blob/master/LICENSE) -- github.com/prometheus/common [APACHE LICENSE](https://github.com/prometheus/common/blob/master/LICENSE) -- github.com/prometheus/procfs [APACHE LICENSE](https://github.com/prometheus/procfs/blob/master/LICENSE) -- github.com/rakyll/statik [APACHE LICENSE](https://github.com/rakyll/statik/blob/master/LICENSE) -- github.com/retailnext/hllpp [BSD LICENSE](https://github.com/retailnext/hllpp/blob/master/LICENSE) -- github.com/tinylib/msgp [MIT LICENSE](https://github.com/tinylib/msgp/blob/master/LICENSE) -- go.uber.org/atomic [MIT LICENSE](https://github.com/uber-go/atomic/blob/master/LICENSE.txt) -- go.uber.org/multierr [MIT LICENSE](https://github.com/uber-go/multierr/blob/master/LICENSE.txt) -- go.uber.org/zap [MIT LICENSE](https://github.com/uber-go/zap/blob/master/LICENSE.txt) -- golang.org/x/crypto [BSD LICENSE](https://github.com/golang/crypto/blob/master/LICENSE) -- golang.org/x/net [BSD LICENSE](https://github.com/golang/net/blob/master/LICENSE) -- golang.org/x/sys [BSD LICENSE](https://github.com/golang/sys/blob/master/LICENSE) -- golang.org/x/text [BSD LICENSE](https://github.com/golang/text/blob/master/LICENSE) -- golang.org/x/time [BSD LICENSE](https://github.com/golang/time/blob/master/LICENSE) -- jquery 2.1.4 [MIT LICENSE](https://github.com/jquery/jquery/blob/master/LICENSE.txt) -- github.com/xlab/treeprint [MIT LICENSE](https://github.com/xlab/treeprint/blob/master/LICENSE) - - - - - - - - - - - - - - diff --git a/vendor/github.com/influxdata/influxdb/client/README.md b/vendor/github.com/influxdata/influxdb/client/README.md deleted file mode 100644 index 773a1112289a..000000000000 --- a/vendor/github.com/influxdata/influxdb/client/README.md +++ /dev/null @@ -1,306 +0,0 @@ -# InfluxDB Client - -[![GoDoc](https://godoc.org/github.com/influxdata/influxdb?status.svg)](http://godoc.org/github.com/influxdata/influxdb/client/v2) - -## Description - -**NOTE:** The Go client library now has a "v2" version, with the old version -being deprecated. The new version can be imported at -`import "github.com/influxdata/influxdb/client/v2"`. It is not backwards-compatible. - -A Go client library written and maintained by the **InfluxDB** team. -This package provides convenience functions to read and write time series data. -It uses the HTTP protocol to communicate with your **InfluxDB** cluster. - - -## Getting Started - -### Connecting To Your Database - -Connecting to an **InfluxDB** database is straightforward. You will need a host -name, a port and the cluster user credentials if applicable. The default port is -8086. You can customize these settings to your specific installation via the -**InfluxDB** configuration file. - -Though not necessary for experimentation, you may want to create a new user -and authenticate the connection to your database. - -For more information please check out the -[Admin Docs](https://docs.influxdata.com/influxdb/latest/administration/). - -For the impatient, you can create a new admin user _bubba_ by firing off the -[InfluxDB CLI](https://github.com/influxdata/influxdb/blob/master/cmd/influx/main.go). - -```shell -influx -> create user bubba with password 'bumblebeetuna' -> grant all privileges to bubba -``` - -And now for good measure set the credentials in you shell environment. -In the example below we will use $INFLUX_USER and $INFLUX_PWD - -Now with the administrivia out of the way, let's connect to our database. - -NOTE: If you've opted out of creating a user, you can omit Username and Password in -the configuration below. - -```go -package main - -import ( - "log" - "time" - - "github.com/influxdata/influxdb/client/v2" -) - -const ( - MyDB = "square_holes" - username = "bubba" - password = "bumblebeetuna" -) - - -func main() { - // Create a new HTTPClient - c, err := client.NewHTTPClient(client.HTTPConfig{ - Addr: "http://localhost:8086", - Username: username, - Password: password, - }) - if err != nil { - log.Fatal(err) - } - - // Create a new point batch - bp, err := client.NewBatchPoints(client.BatchPointsConfig{ - Database: MyDB, - Precision: "s", - }) - if err != nil { - log.Fatal(err) - } - - // Create a point and add to batch - tags := map[string]string{"cpu": "cpu-total"} - fields := map[string]interface{}{ - "idle": 10.1, - "system": 53.3, - "user": 46.6, - } - - pt, err := client.NewPoint("cpu_usage", tags, fields, time.Now()) - if err != nil { - log.Fatal(err) - } - bp.AddPoint(pt) - - // Write the batch - if err := c.Write(bp); err != nil { - log.Fatal(err) - } -} - -``` - -### Inserting Data - -Time series data aka *points* are written to the database using batch inserts. -The mechanism is to create one or more points and then create a batch aka -*batch points* and write these to a given database and series. A series is a -combination of a measurement (time/values) and a set of tags. - -In this sample we will create a batch of a 1,000 points. Each point has a time and -a single value as well as 2 tags indicating a shape and color. We write these points -to a database called _square_holes_ using a measurement named _shapes_. - -NOTE: You can specify a RetentionPolicy as part of the batch points. If not -provided InfluxDB will use the database _default_ retention policy. - -```go - -func writePoints(clnt client.Client) { - sampleSize := 1000 - - bp, err := client.NewBatchPoints(client.BatchPointsConfig{ - Database: "systemstats", - Precision: "us", - }) - if err != nil { - log.Fatal(err) - } - - rand.Seed(time.Now().UnixNano()) - for i := 0; i < sampleSize; i++ { - regions := []string{"us-west1", "us-west2", "us-west3", "us-east1"} - tags := map[string]string{ - "cpu": "cpu-total", - "host": fmt.Sprintf("host%d", rand.Intn(1000)), - "region": regions[rand.Intn(len(regions))], - } - - idle := rand.Float64() * 100.0 - fields := map[string]interface{}{ - "idle": idle, - "busy": 100.0 - idle, - } - - pt, err := client.NewPoint( - "cpu_usage", - tags, - fields, - time.Now(), - ) - if err != nil { - log.Fatal(err) - } - bp.AddPoint(pt) - } - - if err := clnt.Write(bp); err != nil { - log.Fatal(err) - } -} -``` - -#### Uint64 Support - -The `uint64` data type is supported if your server is version `1.4.0` or -greater. To write a data point as an unsigned integer, you must insert -the point as `uint64`. You cannot use `uint` or any of the other -derivatives because previous versions of the client have supported -writing those types as an integer. - -### Querying Data - -One nice advantage of using **InfluxDB** the ability to query your data using familiar -SQL constructs. In this example we can create a convenience function to query the database -as follows: - -```go -// queryDB convenience function to query the database -func queryDB(clnt client.Client, cmd string) (res []client.Result, err error) { - q := client.Query{ - Command: cmd, - Database: MyDB, - } - if response, err := clnt.Query(q); err == nil { - if response.Error() != nil { - return res, response.Error() - } - res = response.Results - } else { - return res, err - } - return res, nil -} -``` - -#### Creating a Database - -```go -_, err := queryDB(clnt, fmt.Sprintf("CREATE DATABASE %s", MyDB)) -if err != nil { - log.Fatal(err) -} -``` - -#### Count Records - -```go -q := fmt.Sprintf("SELECT count(%s) FROM %s", "value", MyMeasurement) -res, err := queryDB(clnt, q) -if err != nil { - log.Fatal(err) -} -count := res[0].Series[0].Values[0][1] -log.Printf("Found a total of %v records\n", count) -``` - -#### Find the last 10 _shapes_ records - -```go -q := fmt.Sprintf("SELECT * FROM %s LIMIT %d", MyMeasurement, 10) -res, err = queryDB(clnt, q) -if err != nil { - log.Fatal(err) -} - -for i, row := range res[0].Series[0].Values { - t, err := time.Parse(time.RFC3339, row[0].(string)) - if err != nil { - log.Fatal(err) - } - val := row[1].(string) - log.Printf("[%2d] %s: %s\n", i, t.Format(time.Stamp), val) -} -``` - -### Using the UDP Client - -The **InfluxDB** client also supports writing over UDP. - -```go -func WriteUDP() { - // Make client - c, err := client.NewUDPClient("localhost:8089") - if err != nil { - panic(err.Error()) - } - - // Create a new point batch - bp, _ := client.NewBatchPoints(client.BatchPointsConfig{ - Precision: "s", - }) - - // Create a point and add to batch - tags := map[string]string{"cpu": "cpu-total"} - fields := map[string]interface{}{ - "idle": 10.1, - "system": 53.3, - "user": 46.6, - } - pt, err := client.NewPoint("cpu_usage", tags, fields, time.Now()) - if err != nil { - panic(err.Error()) - } - bp.AddPoint(pt) - - // Write the batch - c.Write(bp) -} -``` - -### Point Splitting - -The UDP client now supports splitting single points that exceed the configured -payload size. The logic for processing each point is listed here, starting with -an empty payload. - -1. If adding the point to the current (non-empty) payload would exceed the - configured size, send the current payload. Otherwise, add it to the current - payload. -1. If the point is smaller than the configured size, add it to the payload. -1. If the point has no timestamp, just try to send the entire point as a single - UDP payload, and process the next point. -1. Since the point has a timestamp, re-use the existing measurement name, - tagset, and timestamp and create multiple new points by splitting up the - fields. The per-point length will be kept close to the configured size, - staying under it if possible. This does mean that one large field, maybe a - long string, could be sent as a larger-than-configured payload. - -The above logic attempts to respect configured payload sizes, but not sacrifice -any data integrity. Points without a timestamp can't be split, as that may -cause fields to have differing timestamps when processed by the server. - -## Go Docs - -Please refer to -[http://godoc.org/github.com/influxdata/influxdb/client/v2](http://godoc.org/github.com/influxdata/influxdb/client/v2) -for documentation. - -## See Also - -You can also examine how the client library is used by the -[InfluxDB CLI](https://github.com/influxdata/influxdb/blob/master/cmd/influx/main.go). diff --git a/vendor/github.com/influxdata/influxdb/client/influxdb.go b/vendor/github.com/influxdata/influxdb/client/influxdb.go deleted file mode 100644 index 98d362d50ac1..000000000000 --- a/vendor/github.com/influxdata/influxdb/client/influxdb.go +++ /dev/null @@ -1,840 +0,0 @@ -// Package client implements a now-deprecated client for InfluxDB; -// use github.com/influxdata/influxdb/client/v2 instead. -package client // import "github.com/influxdata/influxdb/client" - -import ( - "bytes" - "context" - "crypto/tls" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "net" - "net/http" - "net/url" - "strconv" - "strings" - "time" - - "github.com/influxdata/influxdb/models" -) - -const ( - // DefaultHost is the default host used to connect to an InfluxDB instance - DefaultHost = "localhost" - - // DefaultPort is the default port used to connect to an InfluxDB instance - DefaultPort = 8086 - - // DefaultTimeout is the default connection timeout used to connect to an InfluxDB instance - DefaultTimeout = 0 -) - -// Query is used to send a command to the server. Both Command and Database are required. -type Query struct { - Command string - Database string - - // Chunked tells the server to send back chunked responses. This places - // less load on the server by sending back chunks of the response rather - // than waiting for the entire response all at once. - Chunked bool - - // ChunkSize sets the maximum number of rows that will be returned per - // chunk. Chunks are either divided based on their series or if they hit - // the chunk size limit. - // - // Chunked must be set to true for this option to be used. - ChunkSize int -} - -// ParseConnectionString will parse a string to create a valid connection URL -func ParseConnectionString(path string, ssl bool) (url.URL, error) { - var host string - var port int - - h, p, err := net.SplitHostPort(path) - if err != nil { - if path == "" { - host = DefaultHost - } else { - host = path - } - // If they didn't specify a port, always use the default port - port = DefaultPort - } else { - host = h - port, err = strconv.Atoi(p) - if err != nil { - return url.URL{}, fmt.Errorf("invalid port number %q: %s\n", path, err) - } - } - - u := url.URL{ - Scheme: "http", - } - if ssl { - u.Scheme = "https" - } - - u.Host = net.JoinHostPort(host, strconv.Itoa(port)) - - return u, nil -} - -// Config is used to specify what server to connect to. -// URL: The URL of the server connecting to. -// Username/Password are optional. They will be passed via basic auth if provided. -// UserAgent: If not provided, will default "InfluxDBClient", -// Timeout: If not provided, will default to 0 (no timeout) -type Config struct { - URL url.URL - UnixSocket string - Username string - Password string - UserAgent string - Timeout time.Duration - Precision string - WriteConsistency string - UnsafeSsl bool -} - -// NewConfig will create a config to be used in connecting to the client -func NewConfig() Config { - return Config{ - Timeout: DefaultTimeout, - } -} - -// Client is used to make calls to the server. -type Client struct { - url url.URL - unixSocket string - username string - password string - httpClient *http.Client - userAgent string - precision string -} - -const ( - // ConsistencyOne requires at least one data node acknowledged a write. - ConsistencyOne = "one" - - // ConsistencyAll requires all data nodes to acknowledge a write. - ConsistencyAll = "all" - - // ConsistencyQuorum requires a quorum of data nodes to acknowledge a write. - ConsistencyQuorum = "quorum" - - // ConsistencyAny allows for hinted hand off, potentially no write happened yet. - ConsistencyAny = "any" -) - -// NewClient will instantiate and return a connected client to issue commands to the server. -func NewClient(c Config) (*Client, error) { - tlsConfig := &tls.Config{ - InsecureSkipVerify: c.UnsafeSsl, - } - - tr := &http.Transport{ - TLSClientConfig: tlsConfig, - } - - if c.UnixSocket != "" { - // No need for compression in local communications. - tr.DisableCompression = true - - tr.DialContext = func(_ context.Context, _, _ string) (net.Conn, error) { - return net.Dial("unix", c.UnixSocket) - } - } - - client := Client{ - url: c.URL, - unixSocket: c.UnixSocket, - username: c.Username, - password: c.Password, - httpClient: &http.Client{Timeout: c.Timeout, Transport: tr}, - userAgent: c.UserAgent, - precision: c.Precision, - } - if client.userAgent == "" { - client.userAgent = "InfluxDBClient" - } - return &client, nil -} - -// SetAuth will update the username and passwords -func (c *Client) SetAuth(u, p string) { - c.username = u - c.password = p -} - -// SetPrecision will update the precision -func (c *Client) SetPrecision(precision string) { - c.precision = precision -} - -// Query sends a command to the server and returns the Response -func (c *Client) Query(q Query) (*Response, error) { - return c.QueryContext(context.Background(), q) -} - -// QueryContext sends a command to the server and returns the Response -// It uses a context that can be cancelled by the command line client -func (c *Client) QueryContext(ctx context.Context, q Query) (*Response, error) { - u := c.url - - u.Path = "query" - values := u.Query() - values.Set("q", q.Command) - values.Set("db", q.Database) - if q.Chunked { - values.Set("chunked", "true") - if q.ChunkSize > 0 { - values.Set("chunk_size", strconv.Itoa(q.ChunkSize)) - } - } - if c.precision != "" { - values.Set("epoch", c.precision) - } - u.RawQuery = values.Encode() - - req, err := http.NewRequest("POST", u.String(), nil) - if err != nil { - return nil, err - } - req.Header.Set("User-Agent", c.userAgent) - if c.username != "" { - req.SetBasicAuth(c.username, c.password) - } - - req = req.WithContext(ctx) - - resp, err := c.httpClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - var response Response - if q.Chunked { - cr := NewChunkedResponse(resp.Body) - for { - r, err := cr.NextResponse() - if err != nil { - // If we got an error while decoding the response, send that back. - return nil, err - } - - if r == nil { - break - } - - response.Results = append(response.Results, r.Results...) - if r.Err != nil { - response.Err = r.Err - break - } - } - } else { - dec := json.NewDecoder(resp.Body) - dec.UseNumber() - if err := dec.Decode(&response); err != nil { - // Ignore EOF errors if we got an invalid status code. - if !(err == io.EOF && resp.StatusCode != http.StatusOK) { - return nil, err - } - } - } - - // If we don't have an error in our json response, and didn't get StatusOK, - // then send back an error. - if resp.StatusCode != http.StatusOK && response.Error() == nil { - return &response, fmt.Errorf("received status code %d from server", resp.StatusCode) - } - return &response, nil -} - -// Write takes BatchPoints and allows for writing of multiple points with defaults -// If successful, error is nil and Response is nil -// If an error occurs, Response may contain additional information if populated. -func (c *Client) Write(bp BatchPoints) (*Response, error) { - u := c.url - u.Path = "write" - - var b bytes.Buffer - for _, p := range bp.Points { - err := checkPointTypes(p) - if err != nil { - return nil, err - } - if p.Raw != "" { - if _, err := b.WriteString(p.Raw); err != nil { - return nil, err - } - } else { - for k, v := range bp.Tags { - if p.Tags == nil { - p.Tags = make(map[string]string, len(bp.Tags)) - } - p.Tags[k] = v - } - - if _, err := b.WriteString(p.MarshalString()); err != nil { - return nil, err - } - } - - if err := b.WriteByte('\n'); err != nil { - return nil, err - } - } - - req, err := http.NewRequest("POST", u.String(), &b) - if err != nil { - return nil, err - } - req.Header.Set("Content-Type", "") - req.Header.Set("User-Agent", c.userAgent) - if c.username != "" { - req.SetBasicAuth(c.username, c.password) - } - - precision := bp.Precision - if precision == "" { - precision = "ns" - } - - params := req.URL.Query() - params.Set("db", bp.Database) - params.Set("rp", bp.RetentionPolicy) - params.Set("precision", precision) - params.Set("consistency", bp.WriteConsistency) - req.URL.RawQuery = params.Encode() - - resp, err := c.httpClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - var response Response - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, err - } - - if resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusOK { - var err = fmt.Errorf(string(body)) - response.Err = err - return &response, err - } - - return nil, nil -} - -// WriteLineProtocol takes a string with line returns to delimit each write -// If successful, error is nil and Response is nil -// If an error occurs, Response may contain additional information if populated. -func (c *Client) WriteLineProtocol(data, database, retentionPolicy, precision, writeConsistency string) (*Response, error) { - u := c.url - u.Path = "write" - - r := strings.NewReader(data) - - req, err := http.NewRequest("POST", u.String(), r) - if err != nil { - return nil, err - } - req.Header.Set("Content-Type", "") - req.Header.Set("User-Agent", c.userAgent) - if c.username != "" { - req.SetBasicAuth(c.username, c.password) - } - params := req.URL.Query() - params.Set("db", database) - params.Set("rp", retentionPolicy) - params.Set("precision", precision) - params.Set("consistency", writeConsistency) - req.URL.RawQuery = params.Encode() - - resp, err := c.httpClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - var response Response - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return nil, err - } - - if resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusOK { - err := fmt.Errorf(string(body)) - response.Err = err - return &response, err - } - - return nil, nil -} - -// Ping will check to see if the server is up -// Ping returns how long the request took, the version of the server it connected to, and an error if one occurred. -func (c *Client) Ping() (time.Duration, string, error) { - now := time.Now() - u := c.url - u.Path = "ping" - - req, err := http.NewRequest("GET", u.String(), nil) - if err != nil { - return 0, "", err - } - req.Header.Set("User-Agent", c.userAgent) - if c.username != "" { - req.SetBasicAuth(c.username, c.password) - } - - resp, err := c.httpClient.Do(req) - if err != nil { - return 0, "", err - } - defer resp.Body.Close() - - version := resp.Header.Get("X-Influxdb-Version") - return time.Since(now), version, nil -} - -// Structs - -// Message represents a user message. -type Message struct { - Level string `json:"level,omitempty"` - Text string `json:"text,omitempty"` -} - -// Result represents a resultset returned from a single statement. -type Result struct { - Series []models.Row - Messages []*Message - Err error -} - -// MarshalJSON encodes the result into JSON. -func (r *Result) MarshalJSON() ([]byte, error) { - // Define a struct that outputs "error" as a string. - var o struct { - Series []models.Row `json:"series,omitempty"` - Messages []*Message `json:"messages,omitempty"` - Err string `json:"error,omitempty"` - } - - // Copy fields to output struct. - o.Series = r.Series - o.Messages = r.Messages - if r.Err != nil { - o.Err = r.Err.Error() - } - - return json.Marshal(&o) -} - -// UnmarshalJSON decodes the data into the Result struct -func (r *Result) UnmarshalJSON(b []byte) error { - var o struct { - Series []models.Row `json:"series,omitempty"` - Messages []*Message `json:"messages,omitempty"` - Err string `json:"error,omitempty"` - } - - dec := json.NewDecoder(bytes.NewBuffer(b)) - dec.UseNumber() - err := dec.Decode(&o) - if err != nil { - return err - } - r.Series = o.Series - r.Messages = o.Messages - if o.Err != "" { - r.Err = errors.New(o.Err) - } - return nil -} - -// Response represents a list of statement results. -type Response struct { - Results []Result - Err error -} - -// MarshalJSON encodes the response into JSON. -func (r *Response) MarshalJSON() ([]byte, error) { - // Define a struct that outputs "error" as a string. - var o struct { - Results []Result `json:"results,omitempty"` - Err string `json:"error,omitempty"` - } - - // Copy fields to output struct. - o.Results = r.Results - if r.Err != nil { - o.Err = r.Err.Error() - } - - return json.Marshal(&o) -} - -// UnmarshalJSON decodes the data into the Response struct -func (r *Response) UnmarshalJSON(b []byte) error { - var o struct { - Results []Result `json:"results,omitempty"` - Err string `json:"error,omitempty"` - } - - dec := json.NewDecoder(bytes.NewBuffer(b)) - dec.UseNumber() - err := dec.Decode(&o) - if err != nil { - return err - } - r.Results = o.Results - if o.Err != "" { - r.Err = errors.New(o.Err) - } - return nil -} - -// Error returns the first error from any statement. -// Returns nil if no errors occurred on any statements. -func (r *Response) Error() error { - if r.Err != nil { - return r.Err - } - for _, result := range r.Results { - if result.Err != nil { - return result.Err - } - } - return nil -} - -// duplexReader reads responses and writes it to another writer while -// satisfying the reader interface. -type duplexReader struct { - r io.Reader - w io.Writer -} - -func (r *duplexReader) Read(p []byte) (n int, err error) { - n, err = r.r.Read(p) - if err == nil { - r.w.Write(p[:n]) - } - return n, err -} - -// ChunkedResponse represents a response from the server that -// uses chunking to stream the output. -type ChunkedResponse struct { - dec *json.Decoder - duplex *duplexReader - buf bytes.Buffer -} - -// NewChunkedResponse reads a stream and produces responses from the stream. -func NewChunkedResponse(r io.Reader) *ChunkedResponse { - resp := &ChunkedResponse{} - resp.duplex = &duplexReader{r: r, w: &resp.buf} - resp.dec = json.NewDecoder(resp.duplex) - resp.dec.UseNumber() - return resp -} - -// NextResponse reads the next line of the stream and returns a response. -func (r *ChunkedResponse) NextResponse() (*Response, error) { - var response Response - if err := r.dec.Decode(&response); err != nil { - if err == io.EOF { - return nil, nil - } - // A decoding error happened. This probably means the server crashed - // and sent a last-ditch error message to us. Ensure we have read the - // entirety of the connection to get any remaining error text. - io.Copy(ioutil.Discard, r.duplex) - return nil, errors.New(strings.TrimSpace(r.buf.String())) - } - r.buf.Reset() - return &response, nil -} - -// Point defines the fields that will be written to the database -// Measurement, Time, and Fields are required -// Precision can be specified if the time is in epoch format (integer). -// Valid values for Precision are n, u, ms, s, m, and h -type Point struct { - Measurement string - Tags map[string]string - Time time.Time - Fields map[string]interface{} - Precision string - Raw string -} - -// MarshalJSON will format the time in RFC3339Nano -// Precision is also ignored as it is only used for writing, not reading -// Or another way to say it is we always send back in nanosecond precision -func (p *Point) MarshalJSON() ([]byte, error) { - point := struct { - Measurement string `json:"measurement,omitempty"` - Tags map[string]string `json:"tags,omitempty"` - Time string `json:"time,omitempty"` - Fields map[string]interface{} `json:"fields,omitempty"` - Precision string `json:"precision,omitempty"` - }{ - Measurement: p.Measurement, - Tags: p.Tags, - Fields: p.Fields, - Precision: p.Precision, - } - // Let it omit empty if it's really zero - if !p.Time.IsZero() { - point.Time = p.Time.UTC().Format(time.RFC3339Nano) - } - return json.Marshal(&point) -} - -// MarshalString renders string representation of a Point with specified -// precision. The default precision is nanoseconds. -func (p *Point) MarshalString() string { - pt, err := models.NewPoint(p.Measurement, models.NewTags(p.Tags), p.Fields, p.Time) - if err != nil { - return "# ERROR: " + err.Error() + " " + p.Measurement - } - if p.Precision == "" || p.Precision == "ns" || p.Precision == "n" { - return pt.String() - } - return pt.PrecisionString(p.Precision) -} - -// UnmarshalJSON decodes the data into the Point struct -func (p *Point) UnmarshalJSON(b []byte) error { - var normal struct { - Measurement string `json:"measurement"` - Tags map[string]string `json:"tags"` - Time time.Time `json:"time"` - Precision string `json:"precision"` - Fields map[string]interface{} `json:"fields"` - } - var epoch struct { - Measurement string `json:"measurement"` - Tags map[string]string `json:"tags"` - Time *int64 `json:"time"` - Precision string `json:"precision"` - Fields map[string]interface{} `json:"fields"` - } - - if err := func() error { - var err error - dec := json.NewDecoder(bytes.NewBuffer(b)) - dec.UseNumber() - if err = dec.Decode(&epoch); err != nil { - return err - } - // Convert from epoch to time.Time, but only if Time - // was actually set. - var ts time.Time - if epoch.Time != nil { - ts, err = EpochToTime(*epoch.Time, epoch.Precision) - if err != nil { - return err - } - } - p.Measurement = epoch.Measurement - p.Tags = epoch.Tags - p.Time = ts - p.Precision = epoch.Precision - p.Fields = normalizeFields(epoch.Fields) - return nil - }(); err == nil { - return nil - } - - dec := json.NewDecoder(bytes.NewBuffer(b)) - dec.UseNumber() - if err := dec.Decode(&normal); err != nil { - return err - } - normal.Time = SetPrecision(normal.Time, normal.Precision) - p.Measurement = normal.Measurement - p.Tags = normal.Tags - p.Time = normal.Time - p.Precision = normal.Precision - p.Fields = normalizeFields(normal.Fields) - - return nil -} - -// Remove any notion of json.Number -func normalizeFields(fields map[string]interface{}) map[string]interface{} { - newFields := map[string]interface{}{} - - for k, v := range fields { - switch v := v.(type) { - case json.Number: - jv, e := v.Float64() - if e != nil { - panic(fmt.Sprintf("unable to convert json.Number to float64: %s", e)) - } - newFields[k] = jv - default: - newFields[k] = v - } - } - return newFields -} - -// BatchPoints is used to send batched data in a single write. -// Database and Points are required -// If no retention policy is specified, it will use the databases default retention policy. -// If tags are specified, they will be "merged" with all points. If a point already has that tag, it will be ignored. -// If time is specified, it will be applied to any point with an empty time. -// Precision can be specified if the time is in epoch format (integer). -// Valid values for Precision are n, u, ms, s, m, and h -type BatchPoints struct { - Points []Point `json:"points,omitempty"` - Database string `json:"database,omitempty"` - RetentionPolicy string `json:"retentionPolicy,omitempty"` - Tags map[string]string `json:"tags,omitempty"` - Time time.Time `json:"time,omitempty"` - Precision string `json:"precision,omitempty"` - WriteConsistency string `json:"-"` -} - -// UnmarshalJSON decodes the data into the BatchPoints struct -func (bp *BatchPoints) UnmarshalJSON(b []byte) error { - var normal struct { - Points []Point `json:"points"` - Database string `json:"database"` - RetentionPolicy string `json:"retentionPolicy"` - Tags map[string]string `json:"tags"` - Time time.Time `json:"time"` - Precision string `json:"precision"` - } - var epoch struct { - Points []Point `json:"points"` - Database string `json:"database"` - RetentionPolicy string `json:"retentionPolicy"` - Tags map[string]string `json:"tags"` - Time *int64 `json:"time"` - Precision string `json:"precision"` - } - - if err := func() error { - var err error - if err = json.Unmarshal(b, &epoch); err != nil { - return err - } - // Convert from epoch to time.Time - var ts time.Time - if epoch.Time != nil { - ts, err = EpochToTime(*epoch.Time, epoch.Precision) - if err != nil { - return err - } - } - bp.Points = epoch.Points - bp.Database = epoch.Database - bp.RetentionPolicy = epoch.RetentionPolicy - bp.Tags = epoch.Tags - bp.Time = ts - bp.Precision = epoch.Precision - return nil - }(); err == nil { - return nil - } - - if err := json.Unmarshal(b, &normal); err != nil { - return err - } - normal.Time = SetPrecision(normal.Time, normal.Precision) - bp.Points = normal.Points - bp.Database = normal.Database - bp.RetentionPolicy = normal.RetentionPolicy - bp.Tags = normal.Tags - bp.Time = normal.Time - bp.Precision = normal.Precision - - return nil -} - -// utility functions - -// Addr provides the current url as a string of the server the client is connected to. -func (c *Client) Addr() string { - if c.unixSocket != "" { - return c.unixSocket - } - return c.url.String() -} - -// checkPointTypes ensures no unsupported types are submitted to influxdb, returning error if they are found. -func checkPointTypes(p Point) error { - for _, v := range p.Fields { - switch v.(type) { - case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64, bool, string, nil: - return nil - default: - return fmt.Errorf("unsupported point type: %T", v) - } - } - return nil -} - -// helper functions - -// EpochToTime takes a unix epoch time and uses precision to return back a time.Time -func EpochToTime(epoch int64, precision string) (time.Time, error) { - if precision == "" { - precision = "s" - } - var t time.Time - switch precision { - case "h": - t = time.Unix(0, epoch*int64(time.Hour)) - case "m": - t = time.Unix(0, epoch*int64(time.Minute)) - case "s": - t = time.Unix(0, epoch*int64(time.Second)) - case "ms": - t = time.Unix(0, epoch*int64(time.Millisecond)) - case "u": - t = time.Unix(0, epoch*int64(time.Microsecond)) - case "n": - t = time.Unix(0, epoch) - default: - return time.Time{}, fmt.Errorf("Unknown precision %q", precision) - } - return t, nil -} - -// SetPrecision will round a time to the specified precision -func SetPrecision(t time.Time, precision string) time.Time { - switch precision { - case "n": - case "u": - return t.Round(time.Microsecond) - case "ms": - return t.Round(time.Millisecond) - case "s": - return t.Round(time.Second) - case "m": - return t.Round(time.Minute) - case "h": - return t.Round(time.Hour) - } - return t -} diff --git a/vendor/github.com/influxdata/influxdb/client/v2/client.go b/vendor/github.com/influxdata/influxdb/client/v2/client.go deleted file mode 100644 index 77d44f2b34fb..000000000000 --- a/vendor/github.com/influxdata/influxdb/client/v2/client.go +++ /dev/null @@ -1,635 +0,0 @@ -// Package client (v2) is the current official Go client for InfluxDB. -package client // import "github.com/influxdata/influxdb/client/v2" - -import ( - "bytes" - "crypto/tls" - "encoding/json" - "errors" - "fmt" - "io" - "io/ioutil" - "mime" - "net/http" - "net/url" - "strconv" - "strings" - "time" - - "github.com/influxdata/influxdb/models" -) - -// HTTPConfig is the config data needed to create an HTTP Client. -type HTTPConfig struct { - // Addr should be of the form "http://host:port" - // or "http://[ipv6-host%zone]:port". - Addr string - - // Username is the influxdb username, optional. - Username string - - // Password is the influxdb password, optional. - Password string - - // UserAgent is the http User Agent, defaults to "InfluxDBClient". - UserAgent string - - // Timeout for influxdb writes, defaults to no timeout. - Timeout time.Duration - - // InsecureSkipVerify gets passed to the http client, if true, it will - // skip https certificate verification. Defaults to false. - InsecureSkipVerify bool - - // TLSConfig allows the user to set their own TLS config for the HTTP - // Client. If set, this option overrides InsecureSkipVerify. - TLSConfig *tls.Config -} - -// BatchPointsConfig is the config data needed to create an instance of the BatchPoints struct. -type BatchPointsConfig struct { - // Precision is the write precision of the points, defaults to "ns". - Precision string - - // Database is the database to write points to. - Database string - - // RetentionPolicy is the retention policy of the points. - RetentionPolicy string - - // Write consistency is the number of servers required to confirm write. - WriteConsistency string -} - -// Client is a client interface for writing & querying the database. -type Client interface { - // Ping checks that status of cluster, and will always return 0 time and no - // error for UDP clients. - Ping(timeout time.Duration) (time.Duration, string, error) - - // Write takes a BatchPoints object and writes all Points to InfluxDB. - Write(bp BatchPoints) error - - // Query makes an InfluxDB Query on the database. This will fail if using - // the UDP client. - Query(q Query) (*Response, error) - - // Close releases any resources a Client may be using. - Close() error -} - -// NewHTTPClient returns a new Client from the provided config. -// Client is safe for concurrent use by multiple goroutines. -func NewHTTPClient(conf HTTPConfig) (Client, error) { - if conf.UserAgent == "" { - conf.UserAgent = "InfluxDBClient" - } - - u, err := url.Parse(conf.Addr) - if err != nil { - return nil, err - } else if u.Scheme != "http" && u.Scheme != "https" { - m := fmt.Sprintf("Unsupported protocol scheme: %s, your address"+ - " must start with http:// or https://", u.Scheme) - return nil, errors.New(m) - } - - tr := &http.Transport{ - TLSClientConfig: &tls.Config{ - InsecureSkipVerify: conf.InsecureSkipVerify, - }, - } - if conf.TLSConfig != nil { - tr.TLSClientConfig = conf.TLSConfig - } - return &client{ - url: *u, - username: conf.Username, - password: conf.Password, - useragent: conf.UserAgent, - httpClient: &http.Client{ - Timeout: conf.Timeout, - Transport: tr, - }, - transport: tr, - }, nil -} - -// Ping will check to see if the server is up with an optional timeout on waiting for leader. -// Ping returns how long the request took, the version of the server it connected to, and an error if one occurred. -func (c *client) Ping(timeout time.Duration) (time.Duration, string, error) { - now := time.Now() - u := c.url - u.Path = "ping" - - req, err := http.NewRequest("GET", u.String(), nil) - if err != nil { - return 0, "", err - } - - req.Header.Set("User-Agent", c.useragent) - - if c.username != "" { - req.SetBasicAuth(c.username, c.password) - } - - if timeout > 0 { - params := req.URL.Query() - params.Set("wait_for_leader", fmt.Sprintf("%.0fs", timeout.Seconds())) - req.URL.RawQuery = params.Encode() - } - - resp, err := c.httpClient.Do(req) - if err != nil { - return 0, "", err - } - defer resp.Body.Close() - - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return 0, "", err - } - - if resp.StatusCode != http.StatusNoContent { - var err = fmt.Errorf(string(body)) - return 0, "", err - } - - version := resp.Header.Get("X-Influxdb-Version") - return time.Since(now), version, nil -} - -// Close releases the client's resources. -func (c *client) Close() error { - c.transport.CloseIdleConnections() - return nil -} - -// client is safe for concurrent use as the fields are all read-only -// once the client is instantiated. -type client struct { - // N.B - if url.UserInfo is accessed in future modifications to the - // methods on client, you will need to syncronise access to url. - url url.URL - username string - password string - useragent string - httpClient *http.Client - transport *http.Transport -} - -// BatchPoints is an interface into a batched grouping of points to write into -// InfluxDB together. BatchPoints is NOT thread-safe, you must create a separate -// batch for each goroutine. -type BatchPoints interface { - // AddPoint adds the given point to the Batch of points. - AddPoint(p *Point) - // AddPoints adds the given points to the Batch of points. - AddPoints(ps []*Point) - // Points lists the points in the Batch. - Points() []*Point - - // Precision returns the currently set precision of this Batch. - Precision() string - // SetPrecision sets the precision of this batch. - SetPrecision(s string) error - - // Database returns the currently set database of this Batch. - Database() string - // SetDatabase sets the database of this Batch. - SetDatabase(s string) - - // WriteConsistency returns the currently set write consistency of this Batch. - WriteConsistency() string - // SetWriteConsistency sets the write consistency of this Batch. - SetWriteConsistency(s string) - - // RetentionPolicy returns the currently set retention policy of this Batch. - RetentionPolicy() string - // SetRetentionPolicy sets the retention policy of this Batch. - SetRetentionPolicy(s string) -} - -// NewBatchPoints returns a BatchPoints interface based on the given config. -func NewBatchPoints(conf BatchPointsConfig) (BatchPoints, error) { - if conf.Precision == "" { - conf.Precision = "ns" - } - if _, err := time.ParseDuration("1" + conf.Precision); err != nil { - return nil, err - } - bp := &batchpoints{ - database: conf.Database, - precision: conf.Precision, - retentionPolicy: conf.RetentionPolicy, - writeConsistency: conf.WriteConsistency, - } - return bp, nil -} - -type batchpoints struct { - points []*Point - database string - precision string - retentionPolicy string - writeConsistency string -} - -func (bp *batchpoints) AddPoint(p *Point) { - bp.points = append(bp.points, p) -} - -func (bp *batchpoints) AddPoints(ps []*Point) { - bp.points = append(bp.points, ps...) -} - -func (bp *batchpoints) Points() []*Point { - return bp.points -} - -func (bp *batchpoints) Precision() string { - return bp.precision -} - -func (bp *batchpoints) Database() string { - return bp.database -} - -func (bp *batchpoints) WriteConsistency() string { - return bp.writeConsistency -} - -func (bp *batchpoints) RetentionPolicy() string { - return bp.retentionPolicy -} - -func (bp *batchpoints) SetPrecision(p string) error { - if _, err := time.ParseDuration("1" + p); err != nil { - return err - } - bp.precision = p - return nil -} - -func (bp *batchpoints) SetDatabase(db string) { - bp.database = db -} - -func (bp *batchpoints) SetWriteConsistency(wc string) { - bp.writeConsistency = wc -} - -func (bp *batchpoints) SetRetentionPolicy(rp string) { - bp.retentionPolicy = rp -} - -// Point represents a single data point. -type Point struct { - pt models.Point -} - -// NewPoint returns a point with the given timestamp. If a timestamp is not -// given, then data is sent to the database without a timestamp, in which case -// the server will assign local time upon reception. NOTE: it is recommended to -// send data with a timestamp. -func NewPoint( - name string, - tags map[string]string, - fields map[string]interface{}, - t ...time.Time, -) (*Point, error) { - var T time.Time - if len(t) > 0 { - T = t[0] - } - - pt, err := models.NewPoint(name, models.NewTags(tags), fields, T) - if err != nil { - return nil, err - } - return &Point{ - pt: pt, - }, nil -} - -// String returns a line-protocol string of the Point. -func (p *Point) String() string { - return p.pt.String() -} - -// PrecisionString returns a line-protocol string of the Point, -// with the timestamp formatted for the given precision. -func (p *Point) PrecisionString(precison string) string { - return p.pt.PrecisionString(precison) -} - -// Name returns the measurement name of the point. -func (p *Point) Name() string { - return string(p.pt.Name()) -} - -// Tags returns the tags associated with the point. -func (p *Point) Tags() map[string]string { - return p.pt.Tags().Map() -} - -// Time return the timestamp for the point. -func (p *Point) Time() time.Time { - return p.pt.Time() -} - -// UnixNano returns timestamp of the point in nanoseconds since Unix epoch. -func (p *Point) UnixNano() int64 { - return p.pt.UnixNano() -} - -// Fields returns the fields for the point. -func (p *Point) Fields() (map[string]interface{}, error) { - return p.pt.Fields() -} - -// NewPointFrom returns a point from the provided models.Point. -func NewPointFrom(pt models.Point) *Point { - return &Point{pt: pt} -} - -func (c *client) Write(bp BatchPoints) error { - var b bytes.Buffer - - for _, p := range bp.Points() { - if _, err := b.WriteString(p.pt.PrecisionString(bp.Precision())); err != nil { - return err - } - - if err := b.WriteByte('\n'); err != nil { - return err - } - } - - u := c.url - u.Path = "write" - req, err := http.NewRequest("POST", u.String(), &b) - if err != nil { - return err - } - req.Header.Set("Content-Type", "") - req.Header.Set("User-Agent", c.useragent) - if c.username != "" { - req.SetBasicAuth(c.username, c.password) - } - - params := req.URL.Query() - params.Set("db", bp.Database()) - params.Set("rp", bp.RetentionPolicy()) - params.Set("precision", bp.Precision()) - params.Set("consistency", bp.WriteConsistency()) - req.URL.RawQuery = params.Encode() - - resp, err := c.httpClient.Do(req) - if err != nil { - return err - } - defer resp.Body.Close() - - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusOK { - var err = fmt.Errorf(string(body)) - return err - } - - return nil -} - -// Query defines a query to send to the server. -type Query struct { - Command string - Database string - Precision string - Chunked bool - ChunkSize int - Parameters map[string]interface{} -} - -// NewQuery returns a query object. -// The database and precision arguments can be empty strings if they are not needed for the query. -func NewQuery(command, database, precision string) Query { - return Query{ - Command: command, - Database: database, - Precision: precision, - Parameters: make(map[string]interface{}), - } -} - -// NewQueryWithParameters returns a query object. -// The database and precision arguments can be empty strings if they are not needed for the query. -// parameters is a map of the parameter names used in the command to their values. -func NewQueryWithParameters(command, database, precision string, parameters map[string]interface{}) Query { - return Query{ - Command: command, - Database: database, - Precision: precision, - Parameters: parameters, - } -} - -// Response represents a list of statement results. -type Response struct { - Results []Result - Err string `json:"error,omitempty"` -} - -// Error returns the first error from any statement. -// It returns nil if no errors occurred on any statements. -func (r *Response) Error() error { - if r.Err != "" { - return fmt.Errorf(r.Err) - } - for _, result := range r.Results { - if result.Err != "" { - return fmt.Errorf(result.Err) - } - } - return nil -} - -// Message represents a user message. -type Message struct { - Level string - Text string -} - -// Result represents a resultset returned from a single statement. -type Result struct { - Series []models.Row - Messages []*Message - Err string `json:"error,omitempty"` -} - -// Query sends a command to the server and returns the Response. -func (c *client) Query(q Query) (*Response, error) { - u := c.url - u.Path = "query" - - jsonParameters, err := json.Marshal(q.Parameters) - - if err != nil { - return nil, err - } - - req, err := http.NewRequest("POST", u.String(), nil) - if err != nil { - return nil, err - } - - req.Header.Set("Content-Type", "") - req.Header.Set("User-Agent", c.useragent) - - if c.username != "" { - req.SetBasicAuth(c.username, c.password) - } - - params := req.URL.Query() - params.Set("q", q.Command) - params.Set("db", q.Database) - params.Set("params", string(jsonParameters)) - if q.Chunked { - params.Set("chunked", "true") - if q.ChunkSize > 0 { - params.Set("chunk_size", strconv.Itoa(q.ChunkSize)) - } - } - - if q.Precision != "" { - params.Set("epoch", q.Precision) - } - req.URL.RawQuery = params.Encode() - - resp, err := c.httpClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - // If we lack a X-Influxdb-Version header, then we didn't get a response from influxdb - // but instead some other service. If the error code is also a 500+ code, then some - // downstream loadbalancer/proxy/etc had an issue and we should report that. - if resp.Header.Get("X-Influxdb-Version") == "" && resp.StatusCode >= http.StatusInternalServerError { - body, err := ioutil.ReadAll(resp.Body) - if err != nil || len(body) == 0 { - return nil, fmt.Errorf("received status code %d from downstream server", resp.StatusCode) - } - - return nil, fmt.Errorf("received status code %d from downstream server, with response body: %q", resp.StatusCode, body) - } - - // If we get an unexpected content type, then it is also not from influx direct and therefore - // we want to know what we received and what status code was returned for debugging purposes. - if cType, _, _ := mime.ParseMediaType(resp.Header.Get("Content-Type")); cType != "application/json" { - // Read up to 1kb of the body to help identify downstream errors and limit the impact of things - // like downstream serving a large file - body, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1024)) - if err != nil || len(body) == 0 { - return nil, fmt.Errorf("expected json response, got empty body, with status: %v", resp.StatusCode) - } - - return nil, fmt.Errorf("expected json response, got %q, with status: %v and response body: %q", cType, resp.StatusCode, body) - } - - var response Response - if q.Chunked { - cr := NewChunkedResponse(resp.Body) - for { - r, err := cr.NextResponse() - if err != nil { - // If we got an error while decoding the response, send that back. - return nil, err - } - - if r == nil { - break - } - - response.Results = append(response.Results, r.Results...) - if r.Err != "" { - response.Err = r.Err - break - } - } - } else { - dec := json.NewDecoder(resp.Body) - dec.UseNumber() - decErr := dec.Decode(&response) - - // ignore this error if we got an invalid status code - if decErr != nil && decErr.Error() == "EOF" && resp.StatusCode != http.StatusOK { - decErr = nil - } - // If we got a valid decode error, send that back - if decErr != nil { - return nil, fmt.Errorf("unable to decode json: received status code %d err: %s", resp.StatusCode, decErr) - } - } - - // If we don't have an error in our json response, and didn't get statusOK - // then send back an error - if resp.StatusCode != http.StatusOK && response.Error() == nil { - return &response, fmt.Errorf("received status code %d from server", resp.StatusCode) - } - return &response, nil -} - -// duplexReader reads responses and writes it to another writer while -// satisfying the reader interface. -type duplexReader struct { - r io.Reader - w io.Writer -} - -func (r *duplexReader) Read(p []byte) (n int, err error) { - n, err = r.r.Read(p) - if err == nil { - r.w.Write(p[:n]) - } - return n, err -} - -// ChunkedResponse represents a response from the server that -// uses chunking to stream the output. -type ChunkedResponse struct { - dec *json.Decoder - duplex *duplexReader - buf bytes.Buffer -} - -// NewChunkedResponse reads a stream and produces responses from the stream. -func NewChunkedResponse(r io.Reader) *ChunkedResponse { - resp := &ChunkedResponse{} - resp.duplex = &duplexReader{r: r, w: &resp.buf} - resp.dec = json.NewDecoder(resp.duplex) - resp.dec.UseNumber() - return resp -} - -// NextResponse reads the next line of the stream and returns a response. -func (r *ChunkedResponse) NextResponse() (*Response, error) { - var response Response - - if err := r.dec.Decode(&response); err != nil { - if err == io.EOF { - return nil, nil - } - // A decoding error happened. This probably means the server crashed - // and sent a last-ditch error message to us. Ensure we have read the - // entirety of the connection to get any remaining error text. - io.Copy(ioutil.Discard, r.duplex) - return nil, errors.New(strings.TrimSpace(r.buf.String())) - } - - r.buf.Reset() - return &response, nil -} diff --git a/vendor/github.com/influxdata/influxdb/client/v2/udp.go b/vendor/github.com/influxdata/influxdb/client/v2/udp.go deleted file mode 100644 index 779a28b33f34..000000000000 --- a/vendor/github.com/influxdata/influxdb/client/v2/udp.go +++ /dev/null @@ -1,112 +0,0 @@ -package client - -import ( - "fmt" - "io" - "net" - "time" -) - -const ( - // UDPPayloadSize is a reasonable default payload size for UDP packets that - // could be travelling over the internet. - UDPPayloadSize = 512 -) - -// UDPConfig is the config data needed to create a UDP Client. -type UDPConfig struct { - // Addr should be of the form "host:port" - // or "[ipv6-host%zone]:port". - Addr string - - // PayloadSize is the maximum size of a UDP client message, optional - // Tune this based on your network. Defaults to UDPPayloadSize. - PayloadSize int -} - -// NewUDPClient returns a client interface for writing to an InfluxDB UDP -// service from the given config. -func NewUDPClient(conf UDPConfig) (Client, error) { - var udpAddr *net.UDPAddr - udpAddr, err := net.ResolveUDPAddr("udp", conf.Addr) - if err != nil { - return nil, err - } - - conn, err := net.DialUDP("udp", nil, udpAddr) - if err != nil { - return nil, err - } - - payloadSize := conf.PayloadSize - if payloadSize == 0 { - payloadSize = UDPPayloadSize - } - - return &udpclient{ - conn: conn, - payloadSize: payloadSize, - }, nil -} - -// Close releases the udpclient's resources. -func (uc *udpclient) Close() error { - return uc.conn.Close() -} - -type udpclient struct { - conn io.WriteCloser - payloadSize int -} - -func (uc *udpclient) Write(bp BatchPoints) error { - var b = make([]byte, 0, uc.payloadSize) // initial buffer size, it will grow as needed - var d, _ = time.ParseDuration("1" + bp.Precision()) - - var delayedError error - - var checkBuffer = func(n int) { - if len(b) > 0 && len(b)+n > uc.payloadSize { - if _, err := uc.conn.Write(b); err != nil { - delayedError = err - } - b = b[:0] - } - } - - for _, p := range bp.Points() { - p.pt.Round(d) - pointSize := p.pt.StringSize() + 1 // include newline in size - //point := p.pt.RoundedString(d) + "\n" - - checkBuffer(pointSize) - - if p.Time().IsZero() || pointSize <= uc.payloadSize { - b = p.pt.AppendString(b) - b = append(b, '\n') - continue - } - - points := p.pt.Split(uc.payloadSize - 1) // account for newline character - for _, sp := range points { - checkBuffer(sp.StringSize() + 1) - b = sp.AppendString(b) - b = append(b, '\n') - } - } - - if len(b) > 0 { - if _, err := uc.conn.Write(b); err != nil { - return err - } - } - return delayedError -} - -func (uc *udpclient) Query(q Query) (*Response, error) { - return nil, fmt.Errorf("Querying via UDP is not supported") -} - -func (uc *udpclient) Ping(timeout time.Duration) (time.Duration, string, error) { - return 0, "", nil -} diff --git a/vendor/github.com/influxdata/influxdb/models/consistency.go b/vendor/github.com/influxdata/influxdb/models/consistency.go deleted file mode 100644 index 2a3269bca11b..000000000000 --- a/vendor/github.com/influxdata/influxdb/models/consistency.go +++ /dev/null @@ -1,48 +0,0 @@ -package models - -import ( - "errors" - "strings" -) - -// ConsistencyLevel represent a required replication criteria before a write can -// be returned as successful. -// -// The consistency level is handled in open-source InfluxDB but only applicable to clusters. -type ConsistencyLevel int - -const ( - // ConsistencyLevelAny allows for hinted handoff, potentially no write happened yet. - ConsistencyLevelAny ConsistencyLevel = iota - - // ConsistencyLevelOne requires at least one data node acknowledged a write. - ConsistencyLevelOne - - // ConsistencyLevelQuorum requires a quorum of data nodes to acknowledge a write. - ConsistencyLevelQuorum - - // ConsistencyLevelAll requires all data nodes to acknowledge a write. - ConsistencyLevelAll -) - -var ( - // ErrInvalidConsistencyLevel is returned when parsing the string version - // of a consistency level. - ErrInvalidConsistencyLevel = errors.New("invalid consistency level") -) - -// ParseConsistencyLevel converts a consistency level string to the corresponding ConsistencyLevel const. -func ParseConsistencyLevel(level string) (ConsistencyLevel, error) { - switch strings.ToLower(level) { - case "any": - return ConsistencyLevelAny, nil - case "one": - return ConsistencyLevelOne, nil - case "quorum": - return ConsistencyLevelQuorum, nil - case "all": - return ConsistencyLevelAll, nil - default: - return 0, ErrInvalidConsistencyLevel - } -} diff --git a/vendor/github.com/influxdata/influxdb/models/inline_fnv.go b/vendor/github.com/influxdata/influxdb/models/inline_fnv.go deleted file mode 100644 index eec1ae8b0131..000000000000 --- a/vendor/github.com/influxdata/influxdb/models/inline_fnv.go +++ /dev/null @@ -1,32 +0,0 @@ -package models // import "github.com/influxdata/influxdb/models" - -// from stdlib hash/fnv/fnv.go -const ( - prime64 = 1099511628211 - offset64 = 14695981039346656037 -) - -// InlineFNV64a is an alloc-free port of the standard library's fnv64a. -// See https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function. -type InlineFNV64a uint64 - -// NewInlineFNV64a returns a new instance of InlineFNV64a. -func NewInlineFNV64a() InlineFNV64a { - return offset64 -} - -// Write adds data to the running hash. -func (s *InlineFNV64a) Write(data []byte) (int, error) { - hash := uint64(*s) - for _, c := range data { - hash ^= uint64(c) - hash *= prime64 - } - *s = InlineFNV64a(hash) - return len(data), nil -} - -// Sum64 returns the uint64 of the current resulting hash. -func (s *InlineFNV64a) Sum64() uint64 { - return uint64(*s) -} diff --git a/vendor/github.com/influxdata/influxdb/models/inline_strconv_parse.go b/vendor/github.com/influxdata/influxdb/models/inline_strconv_parse.go deleted file mode 100644 index 8db4837384aa..000000000000 --- a/vendor/github.com/influxdata/influxdb/models/inline_strconv_parse.go +++ /dev/null @@ -1,44 +0,0 @@ -package models // import "github.com/influxdata/influxdb/models" - -import ( - "reflect" - "strconv" - "unsafe" -) - -// parseIntBytes is a zero-alloc wrapper around strconv.ParseInt. -func parseIntBytes(b []byte, base int, bitSize int) (i int64, err error) { - s := unsafeBytesToString(b) - return strconv.ParseInt(s, base, bitSize) -} - -// parseUintBytes is a zero-alloc wrapper around strconv.ParseUint. -func parseUintBytes(b []byte, base int, bitSize int) (i uint64, err error) { - s := unsafeBytesToString(b) - return strconv.ParseUint(s, base, bitSize) -} - -// parseFloatBytes is a zero-alloc wrapper around strconv.ParseFloat. -func parseFloatBytes(b []byte, bitSize int) (float64, error) { - s := unsafeBytesToString(b) - return strconv.ParseFloat(s, bitSize) -} - -// parseBoolBytes is a zero-alloc wrapper around strconv.ParseBool. -func parseBoolBytes(b []byte) (bool, error) { - return strconv.ParseBool(unsafeBytesToString(b)) -} - -// unsafeBytesToString converts a []byte to a string without a heap allocation. -// -// It is unsafe, and is intended to prepare input to short-lived functions -// that require strings. -func unsafeBytesToString(in []byte) string { - src := *(*reflect.SliceHeader)(unsafe.Pointer(&in)) - dst := reflect.StringHeader{ - Data: src.Data, - Len: src.Len, - } - s := *(*string)(unsafe.Pointer(&dst)) - return s -} diff --git a/vendor/github.com/influxdata/influxdb/models/points.go b/vendor/github.com/influxdata/influxdb/models/points.go deleted file mode 100644 index ad80a816bf1b..000000000000 --- a/vendor/github.com/influxdata/influxdb/models/points.go +++ /dev/null @@ -1,2337 +0,0 @@ -// Package models implements basic objects used throughout the TICK stack. -package models // import "github.com/influxdata/influxdb/models" - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" - "io" - "math" - "sort" - "strconv" - "strings" - "time" - - "github.com/influxdata/influxdb/pkg/escape" -) - -var ( - measurementEscapeCodes = map[byte][]byte{ - ',': []byte(`\,`), - ' ': []byte(`\ `), - } - - tagEscapeCodes = map[byte][]byte{ - ',': []byte(`\,`), - ' ': []byte(`\ `), - '=': []byte(`\=`), - } - - // ErrPointMustHaveAField is returned when operating on a point that does not have any fields. - ErrPointMustHaveAField = errors.New("point without fields is unsupported") - - // ErrInvalidNumber is returned when a number is expected but not provided. - ErrInvalidNumber = errors.New("invalid number") - - // ErrInvalidPoint is returned when a point cannot be parsed correctly. - ErrInvalidPoint = errors.New("point is invalid") -) - -const ( - // MaxKeyLength is the largest allowed size of the combined measurement and tag keys. - MaxKeyLength = 65535 -) - -// enableUint64Support will enable uint64 support if set to true. -var enableUint64Support = false - -// EnableUintSupport manually enables uint support for the point parser. -// This function will be removed in the future and only exists for unit tests during the -// transition. -func EnableUintSupport() { - enableUint64Support = true -} - -// Point defines the values that will be written to the database. -type Point interface { - // Name return the measurement name for the point. - Name() []byte - - // SetName updates the measurement name for the point. - SetName(string) - - // Tags returns the tag set for the point. - Tags() Tags - - // AddTag adds or replaces a tag value for a point. - AddTag(key, value string) - - // SetTags replaces the tags for the point. - SetTags(tags Tags) - - // HasTag returns true if the tag exists for the point. - HasTag(tag []byte) bool - - // Fields returns the fields for the point. - Fields() (Fields, error) - - // Time return the timestamp for the point. - Time() time.Time - - // SetTime updates the timestamp for the point. - SetTime(t time.Time) - - // UnixNano returns the timestamp of the point as nanoseconds since Unix epoch. - UnixNano() int64 - - // HashID returns a non-cryptographic checksum of the point's key. - HashID() uint64 - - // Key returns the key (measurement joined with tags) of the point. - Key() []byte - - // String returns a string representation of the point. If there is a - // timestamp associated with the point then it will be specified with the default - // precision of nanoseconds. - String() string - - // MarshalBinary returns a binary representation of the point. - MarshalBinary() ([]byte, error) - - // PrecisionString returns a string representation of the point. If there - // is a timestamp associated with the point then it will be specified in the - // given unit. - PrecisionString(precision string) string - - // RoundedString returns a string representation of the point. If there - // is a timestamp associated with the point, then it will be rounded to the - // given duration. - RoundedString(d time.Duration) string - - // Split will attempt to return multiple points with the same timestamp whose - // string representations are no longer than size. Points with a single field or - // a point without a timestamp may exceed the requested size. - Split(size int) []Point - - // Round will round the timestamp of the point to the given duration. - Round(d time.Duration) - - // StringSize returns the length of the string that would be returned by String(). - StringSize() int - - // AppendString appends the result of String() to the provided buffer and returns - // the result, potentially reducing string allocations. - AppendString(buf []byte) []byte - - // FieldIterator retuns a FieldIterator that can be used to traverse the - // fields of a point without constructing the in-memory map. - FieldIterator() FieldIterator -} - -// FieldType represents the type of a field. -type FieldType int - -const ( - // Integer indicates the field's type is integer. - Integer FieldType = iota - - // Float indicates the field's type is float. - Float - - // Boolean indicates the field's type is boolean. - Boolean - - // String indicates the field's type is string. - String - - // Empty is used to indicate that there is no field. - Empty - - // Unsigned indicates the field's type is an unsigned integer. - Unsigned -) - -// FieldIterator provides a low-allocation interface to iterate through a point's fields. -type FieldIterator interface { - // Next indicates whether there any fields remaining. - Next() bool - - // FieldKey returns the key of the current field. - FieldKey() []byte - - // Type returns the FieldType of the current field. - Type() FieldType - - // StringValue returns the string value of the current field. - StringValue() string - - // IntegerValue returns the integer value of the current field. - IntegerValue() (int64, error) - - // UnsignedValue returns the unsigned value of the current field. - UnsignedValue() (uint64, error) - - // BooleanValue returns the boolean value of the current field. - BooleanValue() (bool, error) - - // FloatValue returns the float value of the current field. - FloatValue() (float64, error) - - // Reset resets the iterator to its initial state. - Reset() -} - -// Points represents a sortable list of points by timestamp. -type Points []Point - -// Len implements sort.Interface. -func (a Points) Len() int { return len(a) } - -// Less implements sort.Interface. -func (a Points) Less(i, j int) bool { return a[i].Time().Before(a[j].Time()) } - -// Swap implements sort.Interface. -func (a Points) Swap(i, j int) { a[i], a[j] = a[j], a[i] } - -// point is the default implementation of Point. -type point struct { - time time.Time - - // text encoding of measurement and tags - // key must always be stored sorted by tags, if the original line was not sorted, - // we need to resort it - key []byte - - // text encoding of field data - fields []byte - - // text encoding of timestamp - ts []byte - - // cached version of parsed fields from data - cachedFields map[string]interface{} - - // cached version of parsed name from key - cachedName string - - // cached version of parsed tags - cachedTags Tags - - it fieldIterator -} - -// type assertions -var ( - _ Point = (*point)(nil) - _ FieldIterator = (*point)(nil) -) - -const ( - // the number of characters for the largest possible int64 (9223372036854775807) - maxInt64Digits = 19 - - // the number of characters for the smallest possible int64 (-9223372036854775808) - minInt64Digits = 20 - - // the number of characters for the largest possible uint64 (18446744073709551615) - maxUint64Digits = 20 - - // the number of characters required for the largest float64 before a range check - // would occur during parsing - maxFloat64Digits = 25 - - // the number of characters required for smallest float64 before a range check occur - // would occur during parsing - minFloat64Digits = 27 -) - -// ParsePoints returns a slice of Points from a text representation of a point -// with each point separated by newlines. If any points fail to parse, a non-nil error -// will be returned in addition to the points that parsed successfully. -func ParsePoints(buf []byte) ([]Point, error) { - return ParsePointsWithPrecision(buf, time.Now().UTC(), "n") -} - -// ParsePointsString is identical to ParsePoints but accepts a string. -func ParsePointsString(buf string) ([]Point, error) { - return ParsePoints([]byte(buf)) -} - -// ParseKey returns the measurement name and tags from a point. -// -// NOTE: to minimize heap allocations, the returned Tags will refer to subslices of buf. -// This can have the unintended effect preventing buf from being garbage collected. -func ParseKey(buf []byte) (string, Tags) { - meas, tags := ParseKeyBytes(buf) - return string(meas), tags -} - -func ParseKeyBytes(buf []byte) ([]byte, Tags) { - // Ignore the error because scanMeasurement returns "missing fields" which we ignore - // when just parsing a key - state, i, _ := scanMeasurement(buf, 0) - - var tags Tags - if state == tagKeyState { - tags = parseTags(buf) - // scanMeasurement returns the location of the comma if there are tags, strip that off - return buf[:i-1], tags - } - return buf[:i], tags -} - -func ParseTags(buf []byte) Tags { - return parseTags(buf) -} - -func ParseName(buf []byte) ([]byte, error) { - // Ignore the error because scanMeasurement returns "missing fields" which we ignore - // when just parsing a key - state, i, _ := scanMeasurement(buf, 0) - if state == tagKeyState { - return buf[:i-1], nil - } - return buf[:i], nil -} - -// ParsePointsWithPrecision is similar to ParsePoints, but allows the -// caller to provide a precision for time. -// -// NOTE: to minimize heap allocations, the returned Points will refer to subslices of buf. -// This can have the unintended effect preventing buf from being garbage collected. -func ParsePointsWithPrecision(buf []byte, defaultTime time.Time, precision string) ([]Point, error) { - points := make([]Point, 0, bytes.Count(buf, []byte{'\n'})+1) - var ( - pos int - block []byte - failed []string - ) - for pos < len(buf) { - pos, block = scanLine(buf, pos) - pos++ - - if len(block) == 0 { - continue - } - - // lines which start with '#' are comments - start := skipWhitespace(block, 0) - - // If line is all whitespace, just skip it - if start >= len(block) { - continue - } - - if block[start] == '#' { - continue - } - - // strip the newline if one is present - if block[len(block)-1] == '\n' { - block = block[:len(block)-1] - } - - pt, err := parsePoint(block[start:], defaultTime, precision) - if err != nil { - failed = append(failed, fmt.Sprintf("unable to parse '%s': %v", string(block[start:]), err)) - } else { - points = append(points, pt) - } - - } - if len(failed) > 0 { - return points, fmt.Errorf("%s", strings.Join(failed, "\n")) - } - return points, nil - -} - -func parsePoint(buf []byte, defaultTime time.Time, precision string) (Point, error) { - // scan the first block which is measurement[,tag1=value1,tag2=value=2...] - pos, key, err := scanKey(buf, 0) - if err != nil { - return nil, err - } - - // measurement name is required - if len(key) == 0 { - return nil, fmt.Errorf("missing measurement") - } - - if len(key) > MaxKeyLength { - return nil, fmt.Errorf("max key length exceeded: %v > %v", len(key), MaxKeyLength) - } - - // scan the second block is which is field1=value1[,field2=value2,...] - pos, fields, err := scanFields(buf, pos) - if err != nil { - return nil, err - } - - // at least one field is required - if len(fields) == 0 { - return nil, fmt.Errorf("missing fields") - } - - var maxKeyErr error - walkFields(fields, func(k, v []byte) bool { - if sz := seriesKeySize(key, k); sz > MaxKeyLength { - maxKeyErr = fmt.Errorf("max key length exceeded: %v > %v", sz, MaxKeyLength) - return false - } - return true - }) - - if maxKeyErr != nil { - return nil, maxKeyErr - } - - // scan the last block which is an optional integer timestamp - pos, ts, err := scanTime(buf, pos) - if err != nil { - return nil, err - } - - pt := &point{ - key: key, - fields: fields, - ts: ts, - } - - if len(ts) == 0 { - pt.time = defaultTime - pt.SetPrecision(precision) - } else { - ts, err := parseIntBytes(ts, 10, 64) - if err != nil { - return nil, err - } - pt.time, err = SafeCalcTime(ts, precision) - if err != nil { - return nil, err - } - - // Determine if there are illegal non-whitespace characters after the - // timestamp block. - for pos < len(buf) { - if buf[pos] != ' ' { - return nil, ErrInvalidPoint - } - pos++ - } - } - return pt, nil -} - -// GetPrecisionMultiplier will return a multiplier for the precision specified. -func GetPrecisionMultiplier(precision string) int64 { - d := time.Nanosecond - switch precision { - case "u": - d = time.Microsecond - case "ms": - d = time.Millisecond - case "s": - d = time.Second - case "m": - d = time.Minute - case "h": - d = time.Hour - } - return int64(d) -} - -// scanKey scans buf starting at i for the measurement and tag portion of the point. -// It returns the ending position and the byte slice of key within buf. If there -// are tags, they will be sorted if they are not already. -func scanKey(buf []byte, i int) (int, []byte, error) { - start := skipWhitespace(buf, i) - - i = start - - // Determines whether the tags are sort, assume they are - sorted := true - - // indices holds the indexes within buf of the start of each tag. For example, - // a buf of 'cpu,host=a,region=b,zone=c' would have indices slice of [4,11,20] - // which indicates that the first tag starts at buf[4], seconds at buf[11], and - // last at buf[20] - indices := make([]int, 100) - - // tracks how many commas we've seen so we know how many values are indices. - // Since indices is an arbitrarily large slice, - // we need to know how many values in the buffer are in use. - commas := 0 - - // First scan the Point's measurement. - state, i, err := scanMeasurement(buf, i) - if err != nil { - return i, buf[start:i], err - } - - // Optionally scan tags if needed. - if state == tagKeyState { - i, commas, indices, err = scanTags(buf, i, indices) - if err != nil { - return i, buf[start:i], err - } - } - - // Now we know where the key region is within buf, and the location of tags, we - // need to determine if duplicate tags exist and if the tags are sorted. This iterates - // over the list comparing each tag in the sequence with each other. - for j := 0; j < commas-1; j++ { - // get the left and right tags - _, left := scanTo(buf[indices[j]:indices[j+1]-1], 0, '=') - _, right := scanTo(buf[indices[j+1]:indices[j+2]-1], 0, '=') - - // If left is greater than right, the tags are not sorted. We do not have to - // continue because the short path no longer works. - // If the tags are equal, then there are duplicate tags, and we should abort. - // If the tags are not sorted, this pass may not find duplicate tags and we - // need to do a more exhaustive search later. - if cmp := bytes.Compare(left, right); cmp > 0 { - sorted = false - break - } else if cmp == 0 { - return i, buf[start:i], fmt.Errorf("duplicate tags") - } - } - - // If the tags are not sorted, then sort them. This sort is inline and - // uses the tag indices we created earlier. The actual buffer is not sorted, the - // indices are using the buffer for value comparison. After the indices are sorted, - // the buffer is reconstructed from the sorted indices. - if !sorted && commas > 0 { - // Get the measurement name for later - measurement := buf[start : indices[0]-1] - - // Sort the indices - indices := indices[:commas] - insertionSort(0, commas, buf, indices) - - // Create a new key using the measurement and sorted indices - b := make([]byte, len(buf[start:i])) - pos := copy(b, measurement) - for _, i := range indices { - b[pos] = ',' - pos++ - _, v := scanToSpaceOr(buf, i, ',') - pos += copy(b[pos:], v) - } - - // Check again for duplicate tags now that the tags are sorted. - for j := 0; j < commas-1; j++ { - // get the left and right tags - _, left := scanTo(buf[indices[j]:], 0, '=') - _, right := scanTo(buf[indices[j+1]:], 0, '=') - - // If the tags are equal, then there are duplicate tags, and we should abort. - // If the tags are not sorted, this pass may not find duplicate tags and we - // need to do a more exhaustive search later. - if bytes.Equal(left, right) { - return i, b, fmt.Errorf("duplicate tags") - } - } - - return i, b, nil - } - - return i, buf[start:i], nil -} - -// The following constants allow us to specify which state to move to -// next, when scanning sections of a Point. -const ( - tagKeyState = iota - tagValueState - fieldsState -) - -// scanMeasurement examines the measurement part of a Point, returning -// the next state to move to, and the current location in the buffer. -func scanMeasurement(buf []byte, i int) (int, int, error) { - // Check first byte of measurement, anything except a comma is fine. - // It can't be a space, since whitespace is stripped prior to this - // function call. - if i >= len(buf) || buf[i] == ',' { - return -1, i, fmt.Errorf("missing measurement") - } - - for { - i++ - if i >= len(buf) { - // cpu - return -1, i, fmt.Errorf("missing fields") - } - - if buf[i-1] == '\\' { - // Skip character (it's escaped). - continue - } - - // Unescaped comma; move onto scanning the tags. - if buf[i] == ',' { - return tagKeyState, i + 1, nil - } - - // Unescaped space; move onto scanning the fields. - if buf[i] == ' ' { - // cpu value=1.0 - return fieldsState, i, nil - } - } -} - -// scanTags examines all the tags in a Point, keeping track of and -// returning the updated indices slice, number of commas and location -// in buf where to start examining the Point fields. -func scanTags(buf []byte, i int, indices []int) (int, int, []int, error) { - var ( - err error - commas int - state = tagKeyState - ) - - for { - switch state { - case tagKeyState: - // Grow our indices slice if we have too many tags. - if commas >= len(indices) { - newIndics := make([]int, cap(indices)*2) - copy(newIndics, indices) - indices = newIndics - } - indices[commas] = i - commas++ - - i, err = scanTagsKey(buf, i) - state = tagValueState // tag value always follows a tag key - case tagValueState: - state, i, err = scanTagsValue(buf, i) - case fieldsState: - indices[commas] = i + 1 - return i, commas, indices, nil - } - - if err != nil { - return i, commas, indices, err - } - } -} - -// scanTagsKey scans each character in a tag key. -func scanTagsKey(buf []byte, i int) (int, error) { - // First character of the key. - if i >= len(buf) || buf[i] == ' ' || buf[i] == ',' || buf[i] == '=' { - // cpu,{'', ' ', ',', '='} - return i, fmt.Errorf("missing tag key") - } - - // Examine each character in the tag key until we hit an unescaped - // equals (the tag value), or we hit an error (i.e., unescaped - // space or comma). - for { - i++ - - // Either we reached the end of the buffer or we hit an - // unescaped comma or space. - if i >= len(buf) || - ((buf[i] == ' ' || buf[i] == ',') && buf[i-1] != '\\') { - // cpu,tag{'', ' ', ','} - return i, fmt.Errorf("missing tag value") - } - - if buf[i] == '=' && buf[i-1] != '\\' { - // cpu,tag= - return i + 1, nil - } - } -} - -// scanTagsValue scans each character in a tag value. -func scanTagsValue(buf []byte, i int) (int, int, error) { - // Tag value cannot be empty. - if i >= len(buf) || buf[i] == ',' || buf[i] == ' ' { - // cpu,tag={',', ' '} - return -1, i, fmt.Errorf("missing tag value") - } - - // Examine each character in the tag value until we hit an unescaped - // comma (move onto next tag key), an unescaped space (move onto - // fields), or we error out. - for { - i++ - if i >= len(buf) { - // cpu,tag=value - return -1, i, fmt.Errorf("missing fields") - } - - // An unescaped equals sign is an invalid tag value. - if buf[i] == '=' && buf[i-1] != '\\' { - // cpu,tag={'=', 'fo=o'} - return -1, i, fmt.Errorf("invalid tag format") - } - - if buf[i] == ',' && buf[i-1] != '\\' { - // cpu,tag=foo, - return tagKeyState, i + 1, nil - } - - // cpu,tag=foo value=1.0 - // cpu, tag=foo\= value=1.0 - if buf[i] == ' ' && buf[i-1] != '\\' { - return fieldsState, i, nil - } - } -} - -func insertionSort(l, r int, buf []byte, indices []int) { - for i := l + 1; i < r; i++ { - for j := i; j > l && less(buf, indices, j, j-1); j-- { - indices[j], indices[j-1] = indices[j-1], indices[j] - } - } -} - -func less(buf []byte, indices []int, i, j int) bool { - // This grabs the tag names for i & j, it ignores the values - _, a := scanTo(buf, indices[i], '=') - _, b := scanTo(buf, indices[j], '=') - return bytes.Compare(a, b) < 0 -} - -// scanFields scans buf, starting at i for the fields section of a point. It returns -// the ending position and the byte slice of the fields within buf. -func scanFields(buf []byte, i int) (int, []byte, error) { - start := skipWhitespace(buf, i) - i = start - quoted := false - - // tracks how many '=' we've seen - equals := 0 - - // tracks how many commas we've seen - commas := 0 - - for { - // reached the end of buf? - if i >= len(buf) { - break - } - - // escaped characters? - if buf[i] == '\\' && i+1 < len(buf) { - i += 2 - continue - } - - // If the value is quoted, scan until we get to the end quote - // Only quote values in the field value since quotes are not significant - // in the field key - if buf[i] == '"' && equals > commas { - quoted = !quoted - i++ - continue - } - - // If we see an =, ensure that there is at least on char before and after it - if buf[i] == '=' && !quoted { - equals++ - - // check for "... =123" but allow "a\ =123" - if buf[i-1] == ' ' && buf[i-2] != '\\' { - return i, buf[start:i], fmt.Errorf("missing field key") - } - - // check for "...a=123,=456" but allow "a=123,a\,=456" - if buf[i-1] == ',' && buf[i-2] != '\\' { - return i, buf[start:i], fmt.Errorf("missing field key") - } - - // check for "... value=" - if i+1 >= len(buf) { - return i, buf[start:i], fmt.Errorf("missing field value") - } - - // check for "... value=,value2=..." - if buf[i+1] == ',' || buf[i+1] == ' ' { - return i, buf[start:i], fmt.Errorf("missing field value") - } - - if isNumeric(buf[i+1]) || buf[i+1] == '-' || buf[i+1] == 'N' || buf[i+1] == 'n' { - var err error - i, err = scanNumber(buf, i+1) - if err != nil { - return i, buf[start:i], err - } - continue - } - // If next byte is not a double-quote, the value must be a boolean - if buf[i+1] != '"' { - var err error - i, _, err = scanBoolean(buf, i+1) - if err != nil { - return i, buf[start:i], err - } - continue - } - } - - if buf[i] == ',' && !quoted { - commas++ - } - - // reached end of block? - if buf[i] == ' ' && !quoted { - break - } - i++ - } - - if quoted { - return i, buf[start:i], fmt.Errorf("unbalanced quotes") - } - - // check that all field sections had key and values (e.g. prevent "a=1,b" - if equals == 0 || commas != equals-1 { - return i, buf[start:i], fmt.Errorf("invalid field format") - } - - return i, buf[start:i], nil -} - -// scanTime scans buf, starting at i for the time section of a point. It -// returns the ending position and the byte slice of the timestamp within buf -// and and error if the timestamp is not in the correct numeric format. -func scanTime(buf []byte, i int) (int, []byte, error) { - start := skipWhitespace(buf, i) - i = start - - for { - // reached the end of buf? - if i >= len(buf) { - break - } - - // Reached end of block or trailing whitespace? - if buf[i] == '\n' || buf[i] == ' ' { - break - } - - // Handle negative timestamps - if i == start && buf[i] == '-' { - i++ - continue - } - - // Timestamps should be integers, make sure they are so we don't need - // to actually parse the timestamp until needed. - if buf[i] < '0' || buf[i] > '9' { - return i, buf[start:i], fmt.Errorf("bad timestamp") - } - i++ - } - return i, buf[start:i], nil -} - -func isNumeric(b byte) bool { - return (b >= '0' && b <= '9') || b == '.' -} - -// scanNumber returns the end position within buf, start at i after -// scanning over buf for an integer, or float. It returns an -// error if a invalid number is scanned. -func scanNumber(buf []byte, i int) (int, error) { - start := i - var isInt, isUnsigned bool - - // Is negative number? - if i < len(buf) && buf[i] == '-' { - i++ - // There must be more characters now, as just '-' is illegal. - if i == len(buf) { - return i, ErrInvalidNumber - } - } - - // how many decimal points we've see - decimal := false - - // indicates the number is float in scientific notation - scientific := false - - for { - if i >= len(buf) { - break - } - - if buf[i] == ',' || buf[i] == ' ' { - break - } - - if buf[i] == 'i' && i > start && !(isInt || isUnsigned) { - isInt = true - i++ - continue - } else if buf[i] == 'u' && i > start && !(isInt || isUnsigned) { - isUnsigned = true - i++ - continue - } - - if buf[i] == '.' { - // Can't have more than 1 decimal (e.g. 1.1.1 should fail) - if decimal { - return i, ErrInvalidNumber - } - decimal = true - } - - // `e` is valid for floats but not as the first char - if i > start && (buf[i] == 'e' || buf[i] == 'E') { - scientific = true - i++ - continue - } - - // + and - are only valid at this point if they follow an e (scientific notation) - if (buf[i] == '+' || buf[i] == '-') && (buf[i-1] == 'e' || buf[i-1] == 'E') { - i++ - continue - } - - // NaN is an unsupported value - if i+2 < len(buf) && (buf[i] == 'N' || buf[i] == 'n') { - return i, ErrInvalidNumber - } - - if !isNumeric(buf[i]) { - return i, ErrInvalidNumber - } - i++ - } - - if (isInt || isUnsigned) && (decimal || scientific) { - return i, ErrInvalidNumber - } - - numericDigits := i - start - if isInt { - numericDigits-- - } - if decimal { - numericDigits-- - } - if buf[start] == '-' { - numericDigits-- - } - - if numericDigits == 0 { - return i, ErrInvalidNumber - } - - // It's more common that numbers will be within min/max range for their type but we need to prevent - // out or range numbers from being parsed successfully. This uses some simple heuristics to decide - // if we should parse the number to the actual type. It does not do it all the time because it incurs - // extra allocations and we end up converting the type again when writing points to disk. - if isInt { - // Make sure the last char is an 'i' for integers (e.g. 9i10 is not valid) - if buf[i-1] != 'i' { - return i, ErrInvalidNumber - } - // Parse the int to check bounds the number of digits could be larger than the max range - // We subtract 1 from the index to remove the `i` from our tests - if len(buf[start:i-1]) >= maxInt64Digits || len(buf[start:i-1]) >= minInt64Digits { - if _, err := parseIntBytes(buf[start:i-1], 10, 64); err != nil { - return i, fmt.Errorf("unable to parse integer %s: %s", buf[start:i-1], err) - } - } - } else if isUnsigned { - // Return an error if uint64 support has not been enabled. - if !enableUint64Support { - return i, ErrInvalidNumber - } - // Make sure the last char is a 'u' for unsigned - if buf[i-1] != 'u' { - return i, ErrInvalidNumber - } - // Make sure the first char is not a '-' for unsigned - if buf[start] == '-' { - return i, ErrInvalidNumber - } - // Parse the uint to check bounds the number of digits could be larger than the max range - // We subtract 1 from the index to remove the `u` from our tests - if len(buf[start:i-1]) >= maxUint64Digits { - if _, err := parseUintBytes(buf[start:i-1], 10, 64); err != nil { - return i, fmt.Errorf("unable to parse unsigned %s: %s", buf[start:i-1], err) - } - } - } else { - // Parse the float to check bounds if it's scientific or the number of digits could be larger than the max range - if scientific || len(buf[start:i]) >= maxFloat64Digits || len(buf[start:i]) >= minFloat64Digits { - if _, err := parseFloatBytes(buf[start:i], 10); err != nil { - return i, fmt.Errorf("invalid float") - } - } - } - - return i, nil -} - -// scanBoolean returns the end position within buf, start at i after -// scanning over buf for boolean. Valid values for a boolean are -// t, T, true, TRUE, f, F, false, FALSE. It returns an error if a invalid boolean -// is scanned. -func scanBoolean(buf []byte, i int) (int, []byte, error) { - start := i - - if i < len(buf) && (buf[i] != 't' && buf[i] != 'f' && buf[i] != 'T' && buf[i] != 'F') { - return i, buf[start:i], fmt.Errorf("invalid boolean") - } - - i++ - for { - if i >= len(buf) { - break - } - - if buf[i] == ',' || buf[i] == ' ' { - break - } - i++ - } - - // Single char bool (t, T, f, F) is ok - if i-start == 1 { - return i, buf[start:i], nil - } - - // length must be 4 for true or TRUE - if (buf[start] == 't' || buf[start] == 'T') && i-start != 4 { - return i, buf[start:i], fmt.Errorf("invalid boolean") - } - - // length must be 5 for false or FALSE - if (buf[start] == 'f' || buf[start] == 'F') && i-start != 5 { - return i, buf[start:i], fmt.Errorf("invalid boolean") - } - - // Otherwise - valid := false - switch buf[start] { - case 't': - valid = bytes.Equal(buf[start:i], []byte("true")) - case 'f': - valid = bytes.Equal(buf[start:i], []byte("false")) - case 'T': - valid = bytes.Equal(buf[start:i], []byte("TRUE")) || bytes.Equal(buf[start:i], []byte("True")) - case 'F': - valid = bytes.Equal(buf[start:i], []byte("FALSE")) || bytes.Equal(buf[start:i], []byte("False")) - } - - if !valid { - return i, buf[start:i], fmt.Errorf("invalid boolean") - } - - return i, buf[start:i], nil - -} - -// skipWhitespace returns the end position within buf, starting at i after -// scanning over spaces in tags. -func skipWhitespace(buf []byte, i int) int { - for i < len(buf) { - if buf[i] != ' ' && buf[i] != '\t' && buf[i] != 0 { - break - } - i++ - } - return i -} - -// scanLine returns the end position in buf and the next line found within -// buf. -func scanLine(buf []byte, i int) (int, []byte) { - start := i - quoted := false - fields := false - - // tracks how many '=' and commas we've seen - // this duplicates some of the functionality in scanFields - equals := 0 - commas := 0 - for { - // reached the end of buf? - if i >= len(buf) { - break - } - - // skip past escaped characters - if buf[i] == '\\' && i+2 < len(buf) { - i += 2 - continue - } - - if buf[i] == ' ' { - fields = true - } - - // If we see a double quote, makes sure it is not escaped - if fields { - if !quoted && buf[i] == '=' { - i++ - equals++ - continue - } else if !quoted && buf[i] == ',' { - i++ - commas++ - continue - } else if buf[i] == '"' && equals > commas { - i++ - quoted = !quoted - continue - } - } - - if buf[i] == '\n' && !quoted { - break - } - - i++ - } - - return i, buf[start:i] -} - -// scanTo returns the end position in buf and the next consecutive block -// of bytes, starting from i and ending with stop byte, where stop byte -// has not been escaped. -// -// If there are leading spaces, they are skipped. -func scanTo(buf []byte, i int, stop byte) (int, []byte) { - start := i - for { - // reached the end of buf? - if i >= len(buf) { - break - } - - // Reached unescaped stop value? - if buf[i] == stop && (i == 0 || buf[i-1] != '\\') { - break - } - i++ - } - - return i, buf[start:i] -} - -// scanTo returns the end position in buf and the next consecutive block -// of bytes, starting from i and ending with stop byte. If there are leading -// spaces, they are skipped. -func scanToSpaceOr(buf []byte, i int, stop byte) (int, []byte) { - start := i - if buf[i] == stop || buf[i] == ' ' { - return i, buf[start:i] - } - - for { - i++ - if buf[i-1] == '\\' { - continue - } - - // reached the end of buf? - if i >= len(buf) { - return i, buf[start:i] - } - - // reached end of block? - if buf[i] == stop || buf[i] == ' ' { - return i, buf[start:i] - } - } -} - -func scanTagValue(buf []byte, i int) (int, []byte) { - start := i - for { - if i >= len(buf) { - break - } - - if buf[i] == ',' && buf[i-1] != '\\' { - break - } - i++ - } - if i > len(buf) { - return i, nil - } - return i, buf[start:i] -} - -func scanFieldValue(buf []byte, i int) (int, []byte) { - start := i - quoted := false - for i < len(buf) { - // Only escape char for a field value is a double-quote and backslash - if buf[i] == '\\' && i+1 < len(buf) && (buf[i+1] == '"' || buf[i+1] == '\\') { - i += 2 - continue - } - - // Quoted value? (e.g. string) - if buf[i] == '"' { - i++ - quoted = !quoted - continue - } - - if buf[i] == ',' && !quoted { - break - } - i++ - } - return i, buf[start:i] -} - -func EscapeMeasurement(in []byte) []byte { - for b, esc := range measurementEscapeCodes { - in = bytes.Replace(in, []byte{b}, esc, -1) - } - return in -} - -func unescapeMeasurement(in []byte) []byte { - for b, esc := range measurementEscapeCodes { - in = bytes.Replace(in, esc, []byte{b}, -1) - } - return in -} - -func escapeTag(in []byte) []byte { - for b, esc := range tagEscapeCodes { - if bytes.IndexByte(in, b) != -1 { - in = bytes.Replace(in, []byte{b}, esc, -1) - } - } - return in -} - -func unescapeTag(in []byte) []byte { - if bytes.IndexByte(in, '\\') == -1 { - return in - } - - for b, esc := range tagEscapeCodes { - if bytes.IndexByte(in, b) != -1 { - in = bytes.Replace(in, esc, []byte{b}, -1) - } - } - return in -} - -// escapeStringFieldReplacer replaces double quotes and backslashes -// with the same character preceded by a backslash. -// As of Go 1.7 this benchmarked better in allocations and CPU time -// compared to iterating through a string byte-by-byte and appending to a new byte slice, -// calling strings.Replace twice, and better than (*Regex).ReplaceAllString. -var escapeStringFieldReplacer = strings.NewReplacer(`"`, `\"`, `\`, `\\`) - -// EscapeStringField returns a copy of in with any double quotes or -// backslashes with escaped values. -func EscapeStringField(in string) string { - return escapeStringFieldReplacer.Replace(in) -} - -// unescapeStringField returns a copy of in with any escaped double-quotes -// or backslashes unescaped. -func unescapeStringField(in string) string { - if strings.IndexByte(in, '\\') == -1 { - return in - } - - var out []byte - i := 0 - for { - if i >= len(in) { - break - } - // unescape backslashes - if in[i] == '\\' && i+1 < len(in) && in[i+1] == '\\' { - out = append(out, '\\') - i += 2 - continue - } - // unescape double-quotes - if in[i] == '\\' && i+1 < len(in) && in[i+1] == '"' { - out = append(out, '"') - i += 2 - continue - } - out = append(out, in[i]) - i++ - - } - return string(out) -} - -// NewPoint returns a new point with the given measurement name, tags, fields and timestamp. If -// an unsupported field value (NaN) or out of range time is passed, this function returns an error. -func NewPoint(name string, tags Tags, fields Fields, t time.Time) (Point, error) { - key, err := pointKey(name, tags, fields, t) - if err != nil { - return nil, err - } - - return &point{ - key: key, - time: t, - fields: fields.MarshalBinary(), - }, nil -} - -// pointKey checks some basic requirements for valid points, and returns the -// key, along with an possible error. -func pointKey(measurement string, tags Tags, fields Fields, t time.Time) ([]byte, error) { - if len(fields) == 0 { - return nil, ErrPointMustHaveAField - } - - if !t.IsZero() { - if err := CheckTime(t); err != nil { - return nil, err - } - } - - for key, value := range fields { - switch value := value.(type) { - case float64: - // Ensure the caller validates and handles invalid field values - if math.IsNaN(value) { - return nil, fmt.Errorf("NaN is an unsupported value for field %s", key) - } - case float32: - // Ensure the caller validates and handles invalid field values - if math.IsNaN(float64(value)) { - return nil, fmt.Errorf("NaN is an unsupported value for field %s", key) - } - } - if len(key) == 0 { - return nil, fmt.Errorf("all fields must have non-empty names") - } - } - - key := MakeKey([]byte(measurement), tags) - for field := range fields { - sz := seriesKeySize(key, []byte(field)) - if sz > MaxKeyLength { - return nil, fmt.Errorf("max key length exceeded: %v > %v", sz, MaxKeyLength) - } - } - - return key, nil -} - -func seriesKeySize(key, field []byte) int { - // 4 is the length of the tsm1.fieldKeySeparator constant. It's inlined here to avoid a circular - // dependency. - return len(key) + 4 + len(field) -} - -// NewPointFromBytes returns a new Point from a marshalled Point. -func NewPointFromBytes(b []byte) (Point, error) { - p := &point{} - if err := p.UnmarshalBinary(b); err != nil { - return nil, err - } - - // This does some basic validation to ensure there are fields and they - // can be unmarshalled as well. - iter := p.FieldIterator() - var hasField bool - for iter.Next() { - if len(iter.FieldKey()) == 0 { - continue - } - hasField = true - switch iter.Type() { - case Float: - _, err := iter.FloatValue() - if err != nil { - return nil, fmt.Errorf("unable to unmarshal field %s: %s", string(iter.FieldKey()), err) - } - case Integer: - _, err := iter.IntegerValue() - if err != nil { - return nil, fmt.Errorf("unable to unmarshal field %s: %s", string(iter.FieldKey()), err) - } - case Unsigned: - _, err := iter.UnsignedValue() - if err != nil { - return nil, fmt.Errorf("unable to unmarshal field %s: %s", string(iter.FieldKey()), err) - } - case String: - // Skip since this won't return an error - case Boolean: - _, err := iter.BooleanValue() - if err != nil { - return nil, fmt.Errorf("unable to unmarshal field %s: %s", string(iter.FieldKey()), err) - } - } - } - - if !hasField { - return nil, ErrPointMustHaveAField - } - - return p, nil -} - -// MustNewPoint returns a new point with the given measurement name, tags, fields and timestamp. If -// an unsupported field value (NaN) is passed, this function panics. -func MustNewPoint(name string, tags Tags, fields Fields, time time.Time) Point { - pt, err := NewPoint(name, tags, fields, time) - if err != nil { - panic(err.Error()) - } - return pt -} - -// Key returns the key (measurement joined with tags) of the point. -func (p *point) Key() []byte { - return p.key -} - -func (p *point) name() []byte { - _, name := scanTo(p.key, 0, ',') - return name -} - -func (p *point) Name() []byte { - return escape.Unescape(p.name()) -} - -// SetName updates the measurement name for the point. -func (p *point) SetName(name string) { - p.cachedName = "" - p.key = MakeKey([]byte(name), p.Tags()) -} - -// Time return the timestamp for the point. -func (p *point) Time() time.Time { - return p.time -} - -// SetTime updates the timestamp for the point. -func (p *point) SetTime(t time.Time) { - p.time = t -} - -// Round will round the timestamp of the point to the given duration. -func (p *point) Round(d time.Duration) { - p.time = p.time.Round(d) -} - -// Tags returns the tag set for the point. -func (p *point) Tags() Tags { - if p.cachedTags != nil { - return p.cachedTags - } - p.cachedTags = parseTags(p.key) - return p.cachedTags -} - -func (p *point) HasTag(tag []byte) bool { - if len(p.key) == 0 { - return false - } - - var exists bool - walkTags(p.key, func(key, value []byte) bool { - if bytes.Equal(tag, key) { - exists = true - return false - } - return true - }) - - return exists -} - -func walkTags(buf []byte, fn func(key, value []byte) bool) { - if len(buf) == 0 { - return - } - - pos, name := scanTo(buf, 0, ',') - - // it's an empty key, so there are no tags - if len(name) == 0 { - return - } - - hasEscape := bytes.IndexByte(buf, '\\') != -1 - i := pos + 1 - var key, value []byte - for { - if i >= len(buf) { - break - } - i, key = scanTo(buf, i, '=') - i, value = scanTagValue(buf, i+1) - - if len(value) == 0 { - continue - } - - if hasEscape { - if !fn(unescapeTag(key), unescapeTag(value)) { - return - } - } else { - if !fn(key, value) { - return - } - } - - i++ - } -} - -// walkFields walks each field key and value via fn. If fn returns false, the iteration -// is stopped. The values are the raw byte slices and not the converted types. -func walkFields(buf []byte, fn func(key, value []byte) bool) { - var i int - var key, val []byte - for len(buf) > 0 { - i, key = scanTo(buf, 0, '=') - buf = buf[i+1:] - i, val = scanFieldValue(buf, 0) - buf = buf[i:] - if !fn(key, val) { - break - } - - // slice off comma - if len(buf) > 0 { - buf = buf[1:] - } - } -} - -func parseTags(buf []byte) Tags { - if len(buf) == 0 { - return nil - } - - tags := make(Tags, bytes.Count(buf, []byte(","))) - p := 0 - walkTags(buf, func(key, value []byte) bool { - tags[p].Key = key - tags[p].Value = value - p++ - return true - }) - return tags -} - -// MakeKey creates a key for a set of tags. -func MakeKey(name []byte, tags Tags) []byte { - // unescape the name and then re-escape it to avoid double escaping. - // The key should always be stored in escaped form. - return append(EscapeMeasurement(unescapeMeasurement(name)), tags.HashKey()...) -} - -// SetTags replaces the tags for the point. -func (p *point) SetTags(tags Tags) { - p.key = MakeKey(p.Name(), tags) - p.cachedTags = tags -} - -// AddTag adds or replaces a tag value for a point. -func (p *point) AddTag(key, value string) { - tags := p.Tags() - tags = append(tags, Tag{Key: []byte(key), Value: []byte(value)}) - sort.Sort(tags) - p.cachedTags = tags - p.key = MakeKey(p.Name(), tags) -} - -// Fields returns the fields for the point. -func (p *point) Fields() (Fields, error) { - if p.cachedFields != nil { - return p.cachedFields, nil - } - cf, err := p.unmarshalBinary() - if err != nil { - return nil, err - } - p.cachedFields = cf - return p.cachedFields, nil -} - -// SetPrecision will round a time to the specified precision. -func (p *point) SetPrecision(precision string) { - switch precision { - case "n": - case "u": - p.SetTime(p.Time().Truncate(time.Microsecond)) - case "ms": - p.SetTime(p.Time().Truncate(time.Millisecond)) - case "s": - p.SetTime(p.Time().Truncate(time.Second)) - case "m": - p.SetTime(p.Time().Truncate(time.Minute)) - case "h": - p.SetTime(p.Time().Truncate(time.Hour)) - } -} - -// String returns the string representation of the point. -func (p *point) String() string { - if p.Time().IsZero() { - return string(p.Key()) + " " + string(p.fields) - } - return string(p.Key()) + " " + string(p.fields) + " " + strconv.FormatInt(p.UnixNano(), 10) -} - -// AppendString appends the string representation of the point to buf. -func (p *point) AppendString(buf []byte) []byte { - buf = append(buf, p.key...) - buf = append(buf, ' ') - buf = append(buf, p.fields...) - - if !p.time.IsZero() { - buf = append(buf, ' ') - buf = strconv.AppendInt(buf, p.UnixNano(), 10) - } - - return buf -} - -// StringSize returns the length of the string that would be returned by String(). -func (p *point) StringSize() int { - size := len(p.key) + len(p.fields) + 1 - - if !p.time.IsZero() { - digits := 1 // even "0" has one digit - t := p.UnixNano() - if t < 0 { - // account for negative sign, then negate - digits++ - t = -t - } - for t > 9 { // already accounted for one digit - digits++ - t /= 10 - } - size += digits + 1 // digits and a space - } - - return size -} - -// MarshalBinary returns a binary representation of the point. -func (p *point) MarshalBinary() ([]byte, error) { - if len(p.fields) == 0 { - return nil, ErrPointMustHaveAField - } - - tb, err := p.time.MarshalBinary() - if err != nil { - return nil, err - } - - b := make([]byte, 8+len(p.key)+len(p.fields)+len(tb)) - i := 0 - - binary.BigEndian.PutUint32(b[i:], uint32(len(p.key))) - i += 4 - - i += copy(b[i:], p.key) - - binary.BigEndian.PutUint32(b[i:i+4], uint32(len(p.fields))) - i += 4 - - i += copy(b[i:], p.fields) - - copy(b[i:], tb) - return b, nil -} - -// UnmarshalBinary decodes a binary representation of the point into a point struct. -func (p *point) UnmarshalBinary(b []byte) error { - var n int - - // Read key length. - if len(b) < 4 { - return io.ErrShortBuffer - } - n, b = int(binary.BigEndian.Uint32(b[:4])), b[4:] - - // Read key. - if len(b) < n { - return io.ErrShortBuffer - } - p.key, b = b[:n], b[n:] - - // Read fields length. - if len(b) < 4 { - return io.ErrShortBuffer - } - n, b = int(binary.BigEndian.Uint32(b[:4])), b[4:] - - // Read fields. - if len(b) < n { - return io.ErrShortBuffer - } - p.fields, b = b[:n], b[n:] - - // Read timestamp. - if err := p.time.UnmarshalBinary(b); err != nil { - return err - } - return nil -} - -// PrecisionString returns a string representation of the point. If there -// is a timestamp associated with the point then it will be specified in the -// given unit. -func (p *point) PrecisionString(precision string) string { - if p.Time().IsZero() { - return fmt.Sprintf("%s %s", p.Key(), string(p.fields)) - } - return fmt.Sprintf("%s %s %d", p.Key(), string(p.fields), - p.UnixNano()/GetPrecisionMultiplier(precision)) -} - -// RoundedString returns a string representation of the point. If there -// is a timestamp associated with the point, then it will be rounded to the -// given duration. -func (p *point) RoundedString(d time.Duration) string { - if p.Time().IsZero() { - return fmt.Sprintf("%s %s", p.Key(), string(p.fields)) - } - return fmt.Sprintf("%s %s %d", p.Key(), string(p.fields), - p.time.Round(d).UnixNano()) -} - -func (p *point) unmarshalBinary() (Fields, error) { - iter := p.FieldIterator() - fields := make(Fields, 8) - for iter.Next() { - if len(iter.FieldKey()) == 0 { - continue - } - switch iter.Type() { - case Float: - v, err := iter.FloatValue() - if err != nil { - return nil, fmt.Errorf("unable to unmarshal field %s: %s", string(iter.FieldKey()), err) - } - fields[string(iter.FieldKey())] = v - case Integer: - v, err := iter.IntegerValue() - if err != nil { - return nil, fmt.Errorf("unable to unmarshal field %s: %s", string(iter.FieldKey()), err) - } - fields[string(iter.FieldKey())] = v - case Unsigned: - v, err := iter.UnsignedValue() - if err != nil { - return nil, fmt.Errorf("unable to unmarshal field %s: %s", string(iter.FieldKey()), err) - } - fields[string(iter.FieldKey())] = v - case String: - fields[string(iter.FieldKey())] = iter.StringValue() - case Boolean: - v, err := iter.BooleanValue() - if err != nil { - return nil, fmt.Errorf("unable to unmarshal field %s: %s", string(iter.FieldKey()), err) - } - fields[string(iter.FieldKey())] = v - } - } - return fields, nil -} - -// HashID returns a non-cryptographic checksum of the point's key. -func (p *point) HashID() uint64 { - h := NewInlineFNV64a() - h.Write(p.key) - sum := h.Sum64() - return sum -} - -// UnixNano returns the timestamp of the point as nanoseconds since Unix epoch. -func (p *point) UnixNano() int64 { - return p.Time().UnixNano() -} - -// Split will attempt to return multiple points with the same timestamp whose -// string representations are no longer than size. Points with a single field or -// a point without a timestamp may exceed the requested size. -func (p *point) Split(size int) []Point { - if p.time.IsZero() || p.StringSize() <= size { - return []Point{p} - } - - // key string, timestamp string, spaces - size -= len(p.key) + len(strconv.FormatInt(p.time.UnixNano(), 10)) + 2 - - var points []Point - var start, cur int - - for cur < len(p.fields) { - end, _ := scanTo(p.fields, cur, '=') - end, _ = scanFieldValue(p.fields, end+1) - - if cur > start && end-start > size { - points = append(points, &point{ - key: p.key, - time: p.time, - fields: p.fields[start : cur-1], - }) - start = cur - } - - cur = end + 1 - } - - points = append(points, &point{ - key: p.key, - time: p.time, - fields: p.fields[start:], - }) - - return points -} - -// Tag represents a single key/value tag pair. -type Tag struct { - Key []byte - Value []byte -} - -// NewTag returns a new Tag. -func NewTag(key, value []byte) Tag { - return Tag{ - Key: key, - Value: value, - } -} - -// Size returns the size of the key and value. -func (t Tag) Size() int { return len(t.Key) + len(t.Value) } - -// Clone returns a shallow copy of Tag. -// -// Tags associated with a Point created by ParsePointsWithPrecision will hold references to the byte slice that was parsed. -// Use Clone to create a Tag with new byte slices that do not refer to the argument to ParsePointsWithPrecision. -func (t Tag) Clone() Tag { - other := Tag{ - Key: make([]byte, len(t.Key)), - Value: make([]byte, len(t.Value)), - } - - copy(other.Key, t.Key) - copy(other.Value, t.Value) - - return other -} - -// String returns the string reprsentation of the tag. -func (t *Tag) String() string { - var buf bytes.Buffer - buf.WriteByte('{') - buf.WriteString(string(t.Key)) - buf.WriteByte(' ') - buf.WriteString(string(t.Value)) - buf.WriteByte('}') - return buf.String() -} - -// Tags represents a sorted list of tags. -type Tags []Tag - -// NewTags returns a new Tags from a map. -func NewTags(m map[string]string) Tags { - if len(m) == 0 { - return nil - } - a := make(Tags, 0, len(m)) - for k, v := range m { - a = append(a, NewTag([]byte(k), []byte(v))) - } - sort.Sort(a) - return a -} - -// Keys returns the list of keys for a tag set. -func (a Tags) Keys() []string { - if len(a) == 0 { - return nil - } - keys := make([]string, len(a)) - for i, tag := range a { - keys[i] = string(tag.Key) - } - return keys -} - -// Values returns the list of values for a tag set. -func (a Tags) Values() []string { - if len(a) == 0 { - return nil - } - values := make([]string, len(a)) - for i, tag := range a { - values[i] = string(tag.Value) - } - return values -} - -// String returns the string representation of the tags. -func (a Tags) String() string { - var buf bytes.Buffer - buf.WriteByte('[') - for i := range a { - buf.WriteString(a[i].String()) - if i < len(a)-1 { - buf.WriteByte(' ') - } - } - buf.WriteByte(']') - return buf.String() -} - -// Size returns the number of bytes needed to store all tags. Note, this is -// the number of bytes needed to store all keys and values and does not account -// for data structures or delimiters for example. -func (a Tags) Size() int { - var total int - for _, t := range a { - total += t.Size() - } - return total -} - -// Clone returns a copy of the slice where the elements are a result of calling `Clone` on the original elements -// -// Tags associated with a Point created by ParsePointsWithPrecision will hold references to the byte slice that was parsed. -// Use Clone to create Tags with new byte slices that do not refer to the argument to ParsePointsWithPrecision. -func (a Tags) Clone() Tags { - if len(a) == 0 { - return nil - } - - others := make(Tags, len(a)) - for i := range a { - others[i] = a[i].Clone() - } - - return others -} - -func (a Tags) Len() int { return len(a) } -func (a Tags) Less(i, j int) bool { return bytes.Compare(a[i].Key, a[j].Key) == -1 } -func (a Tags) Swap(i, j int) { a[i], a[j] = a[j], a[i] } - -// Equal returns true if a equals other. -func (a Tags) Equal(other Tags) bool { - if len(a) != len(other) { - return false - } - for i := range a { - if !bytes.Equal(a[i].Key, other[i].Key) || !bytes.Equal(a[i].Value, other[i].Value) { - return false - } - } - return true -} - -// CompareTags returns -1 if a < b, 1 if a > b, and 0 if a == b. -func CompareTags(a, b Tags) int { - // Compare each key & value until a mismatch. - for i := 0; i < len(a) && i < len(b); i++ { - if cmp := bytes.Compare(a[i].Key, b[i].Key); cmp != 0 { - return cmp - } - if cmp := bytes.Compare(a[i].Value, b[i].Value); cmp != 0 { - return cmp - } - } - - // If all tags are equal up to this point then return shorter tagset. - if len(a) < len(b) { - return -1 - } else if len(a) > len(b) { - return 1 - } - - // All tags are equal. - return 0 -} - -// Get returns the value for a key. -func (a Tags) Get(key []byte) []byte { - // OPTIMIZE: Use sort.Search if tagset is large. - - for _, t := range a { - if bytes.Equal(t.Key, key) { - return t.Value - } - } - return nil -} - -// GetString returns the string value for a string key. -func (a Tags) GetString(key string) string { - return string(a.Get([]byte(key))) -} - -// Set sets the value for a key. -func (a *Tags) Set(key, value []byte) { - for i, t := range *a { - if bytes.Equal(t.Key, key) { - (*a)[i].Value = value - return - } - } - *a = append(*a, Tag{Key: key, Value: value}) - sort.Sort(*a) -} - -// SetString sets the string value for a string key. -func (a *Tags) SetString(key, value string) { - a.Set([]byte(key), []byte(value)) -} - -// Delete removes a tag by key. -func (a *Tags) Delete(key []byte) { - for i, t := range *a { - if bytes.Equal(t.Key, key) { - copy((*a)[i:], (*a)[i+1:]) - (*a)[len(*a)-1] = Tag{} - *a = (*a)[:len(*a)-1] - return - } - } -} - -// Map returns a map representation of the tags. -func (a Tags) Map() map[string]string { - m := make(map[string]string, len(a)) - for _, t := range a { - m[string(t.Key)] = string(t.Value) - } - return m -} - -// Merge merges the tags combining the two. If both define a tag with the -// same key, the merged value overwrites the old value. -// A new map is returned. -func (a Tags) Merge(other map[string]string) Tags { - merged := make(map[string]string, len(a)+len(other)) - for _, t := range a { - merged[string(t.Key)] = string(t.Value) - } - for k, v := range other { - merged[k] = v - } - return NewTags(merged) -} - -// HashKey hashes all of a tag's keys. -func (a Tags) HashKey() []byte { - // Empty maps marshal to empty bytes. - if len(a) == 0 { - return nil - } - - // Type invariant: Tags are sorted - - escaped := make(Tags, 0, len(a)) - sz := 0 - for _, t := range a { - ek := escapeTag(t.Key) - ev := escapeTag(t.Value) - - if len(ev) > 0 { - escaped = append(escaped, Tag{Key: ek, Value: ev}) - sz += len(ek) + len(ev) - } - } - - sz += len(escaped) + (len(escaped) * 2) // separators - - // Generate marshaled bytes. - b := make([]byte, sz) - buf := b - idx := 0 - for _, k := range escaped { - buf[idx] = ',' - idx++ - copy(buf[idx:idx+len(k.Key)], k.Key) - idx += len(k.Key) - buf[idx] = '=' - idx++ - copy(buf[idx:idx+len(k.Value)], k.Value) - idx += len(k.Value) - } - return b[:idx] -} - -// CopyTags returns a shallow copy of tags. -func CopyTags(a Tags) Tags { - other := make(Tags, len(a)) - copy(other, a) - return other -} - -// DeepCopyTags returns a deep copy of tags. -func DeepCopyTags(a Tags) Tags { - // Calculate size of keys/values in bytes. - var n int - for _, t := range a { - n += len(t.Key) + len(t.Value) - } - - // Build single allocation for all key/values. - buf := make([]byte, n) - - // Copy tags to new set. - other := make(Tags, len(a)) - for i, t := range a { - copy(buf, t.Key) - other[i].Key, buf = buf[:len(t.Key)], buf[len(t.Key):] - - copy(buf, t.Value) - other[i].Value, buf = buf[:len(t.Value)], buf[len(t.Value):] - } - - return other -} - -// Fields represents a mapping between a Point's field names and their -// values. -type Fields map[string]interface{} - -// FieldIterator retuns a FieldIterator that can be used to traverse the -// fields of a point without constructing the in-memory map. -func (p *point) FieldIterator() FieldIterator { - p.Reset() - return p -} - -type fieldIterator struct { - start, end int - key, keybuf []byte - valueBuf []byte - fieldType FieldType -} - -// Next indicates whether there any fields remaining. -func (p *point) Next() bool { - p.it.start = p.it.end - if p.it.start >= len(p.fields) { - return false - } - - p.it.end, p.it.key = scanTo(p.fields, p.it.start, '=') - if escape.IsEscaped(p.it.key) { - p.it.keybuf = escape.AppendUnescaped(p.it.keybuf[:0], p.it.key) - p.it.key = p.it.keybuf - } - - p.it.end, p.it.valueBuf = scanFieldValue(p.fields, p.it.end+1) - p.it.end++ - - if len(p.it.valueBuf) == 0 { - p.it.fieldType = Empty - return true - } - - c := p.it.valueBuf[0] - - if c == '"' { - p.it.fieldType = String - return true - } - - if strings.IndexByte(`0123456789-.nNiIu`, c) >= 0 { - if p.it.valueBuf[len(p.it.valueBuf)-1] == 'i' { - p.it.fieldType = Integer - p.it.valueBuf = p.it.valueBuf[:len(p.it.valueBuf)-1] - } else if p.it.valueBuf[len(p.it.valueBuf)-1] == 'u' { - p.it.fieldType = Unsigned - p.it.valueBuf = p.it.valueBuf[:len(p.it.valueBuf)-1] - } else { - p.it.fieldType = Float - } - return true - } - - // to keep the same behavior that currently exists, default to boolean - p.it.fieldType = Boolean - return true -} - -// FieldKey returns the key of the current field. -func (p *point) FieldKey() []byte { - return p.it.key -} - -// Type returns the FieldType of the current field. -func (p *point) Type() FieldType { - return p.it.fieldType -} - -// StringValue returns the string value of the current field. -func (p *point) StringValue() string { - return unescapeStringField(string(p.it.valueBuf[1 : len(p.it.valueBuf)-1])) -} - -// IntegerValue returns the integer value of the current field. -func (p *point) IntegerValue() (int64, error) { - n, err := parseIntBytes(p.it.valueBuf, 10, 64) - if err != nil { - return 0, fmt.Errorf("unable to parse integer value %q: %v", p.it.valueBuf, err) - } - return n, nil -} - -// UnsignedValue returns the unsigned value of the current field. -func (p *point) UnsignedValue() (uint64, error) { - n, err := parseUintBytes(p.it.valueBuf, 10, 64) - if err != nil { - return 0, fmt.Errorf("unable to parse unsigned value %q: %v", p.it.valueBuf, err) - } - return n, nil -} - -// BooleanValue returns the boolean value of the current field. -func (p *point) BooleanValue() (bool, error) { - b, err := parseBoolBytes(p.it.valueBuf) - if err != nil { - return false, fmt.Errorf("unable to parse bool value %q: %v", p.it.valueBuf, err) - } - return b, nil -} - -// FloatValue returns the float value of the current field. -func (p *point) FloatValue() (float64, error) { - f, err := parseFloatBytes(p.it.valueBuf, 64) - if err != nil { - return 0, fmt.Errorf("unable to parse floating point value %q: %v", p.it.valueBuf, err) - } - return f, nil -} - -// Reset resets the iterator to its initial state. -func (p *point) Reset() { - p.it.fieldType = Empty - p.it.key = nil - p.it.valueBuf = nil - p.it.start = 0 - p.it.end = 0 -} - -// MarshalBinary encodes all the fields to their proper type and returns the binary -// represenation -// NOTE: uint64 is specifically not supported due to potential overflow when we decode -// again later to an int64 -// NOTE2: uint is accepted, and may be 64 bits, and is for some reason accepted... -func (p Fields) MarshalBinary() []byte { - var b []byte - keys := make([]string, 0, len(p)) - - for k := range p { - keys = append(keys, k) - } - - // Not really necessary, can probably be removed. - sort.Strings(keys) - - for i, k := range keys { - if i > 0 { - b = append(b, ',') - } - b = appendField(b, k, p[k]) - } - - return b -} - -func appendField(b []byte, k string, v interface{}) []byte { - b = append(b, []byte(escape.String(k))...) - b = append(b, '=') - - // check popular types first - switch v := v.(type) { - case float64: - b = strconv.AppendFloat(b, v, 'f', -1, 64) - case int64: - b = strconv.AppendInt(b, v, 10) - b = append(b, 'i') - case string: - b = append(b, '"') - b = append(b, []byte(EscapeStringField(v))...) - b = append(b, '"') - case bool: - b = strconv.AppendBool(b, v) - case int32: - b = strconv.AppendInt(b, int64(v), 10) - b = append(b, 'i') - case int16: - b = strconv.AppendInt(b, int64(v), 10) - b = append(b, 'i') - case int8: - b = strconv.AppendInt(b, int64(v), 10) - b = append(b, 'i') - case int: - b = strconv.AppendInt(b, int64(v), 10) - b = append(b, 'i') - case uint64: - b = strconv.AppendUint(b, v, 10) - b = append(b, 'u') - case uint32: - b = strconv.AppendInt(b, int64(v), 10) - b = append(b, 'i') - case uint16: - b = strconv.AppendInt(b, int64(v), 10) - b = append(b, 'i') - case uint8: - b = strconv.AppendInt(b, int64(v), 10) - b = append(b, 'i') - case uint: - // TODO: 'uint' should be converted to writing as an unsigned integer, - // but we cannot since that would break backwards compatibility. - b = strconv.AppendInt(b, int64(v), 10) - b = append(b, 'i') - case float32: - b = strconv.AppendFloat(b, float64(v), 'f', -1, 32) - case []byte: - b = append(b, v...) - case nil: - // skip - default: - // Can't determine the type, so convert to string - b = append(b, '"') - b = append(b, []byte(EscapeStringField(fmt.Sprintf("%v", v)))...) - b = append(b, '"') - - } - - return b -} - -type byteSlices [][]byte - -func (a byteSlices) Len() int { return len(a) } -func (a byteSlices) Less(i, j int) bool { return bytes.Compare(a[i], a[j]) == -1 } -func (a byteSlices) Swap(i, j int) { a[i], a[j] = a[j], a[i] } diff --git a/vendor/github.com/influxdata/influxdb/models/rows.go b/vendor/github.com/influxdata/influxdb/models/rows.go deleted file mode 100644 index c087a4882d0d..000000000000 --- a/vendor/github.com/influxdata/influxdb/models/rows.go +++ /dev/null @@ -1,62 +0,0 @@ -package models - -import ( - "sort" -) - -// Row represents a single row returned from the execution of a statement. -type Row struct { - Name string `json:"name,omitempty"` - Tags map[string]string `json:"tags,omitempty"` - Columns []string `json:"columns,omitempty"` - Values [][]interface{} `json:"values,omitempty"` - Partial bool `json:"partial,omitempty"` -} - -// SameSeries returns true if r contains values for the same series as o. -func (r *Row) SameSeries(o *Row) bool { - return r.tagsHash() == o.tagsHash() && r.Name == o.Name -} - -// tagsHash returns a hash of tag key/value pairs. -func (r *Row) tagsHash() uint64 { - h := NewInlineFNV64a() - keys := r.tagsKeys() - for _, k := range keys { - h.Write([]byte(k)) - h.Write([]byte(r.Tags[k])) - } - return h.Sum64() -} - -// tagKeys returns a sorted list of tag keys. -func (r *Row) tagsKeys() []string { - a := make([]string, 0, len(r.Tags)) - for k := range r.Tags { - a = append(a, k) - } - sort.Strings(a) - return a -} - -// Rows represents a collection of rows. Rows implements sort.Interface. -type Rows []*Row - -// Len implements sort.Interface. -func (p Rows) Len() int { return len(p) } - -// Less implements sort.Interface. -func (p Rows) Less(i, j int) bool { - // Sort by name first. - if p[i].Name != p[j].Name { - return p[i].Name < p[j].Name - } - - // Sort by tag set hash. Tags don't have a meaningful sort order so we - // just compute a hash and sort by that instead. This allows the tests - // to receive rows in a predictable order every time. - return p[i].tagsHash() < p[j].tagsHash() -} - -// Swap implements sort.Interface. -func (p Rows) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/vendor/github.com/influxdata/influxdb/models/statistic.go b/vendor/github.com/influxdata/influxdb/models/statistic.go deleted file mode 100644 index 553e9d09fb64..000000000000 --- a/vendor/github.com/influxdata/influxdb/models/statistic.go +++ /dev/null @@ -1,42 +0,0 @@ -package models - -// Statistic is the representation of a statistic used by the monitoring service. -type Statistic struct { - Name string `json:"name"` - Tags map[string]string `json:"tags"` - Values map[string]interface{} `json:"values"` -} - -// NewStatistic returns an initialized Statistic. -func NewStatistic(name string) Statistic { - return Statistic{ - Name: name, - Tags: make(map[string]string), - Values: make(map[string]interface{}), - } -} - -// StatisticTags is a map that can be merged with others without causing -// mutations to either map. -type StatisticTags map[string]string - -// Merge creates a new map containing the merged contents of tags and t. -// If both tags and the receiver map contain the same key, the value in tags -// is used in the resulting map. -// -// Merge always returns a usable map. -func (t StatisticTags) Merge(tags map[string]string) map[string]string { - // Add everything in tags to the result. - out := make(map[string]string, len(tags)) - for k, v := range tags { - out[k] = v - } - - // Only add values from t that don't appear in tags. - for k, v := range t { - if _, ok := tags[k]; !ok { - out[k] = v - } - } - return out -} diff --git a/vendor/github.com/influxdata/influxdb/models/time.go b/vendor/github.com/influxdata/influxdb/models/time.go deleted file mode 100644 index e98f2cb33635..000000000000 --- a/vendor/github.com/influxdata/influxdb/models/time.go +++ /dev/null @@ -1,74 +0,0 @@ -package models - -// Helper time methods since parsing time can easily overflow and we only support a -// specific time range. - -import ( - "fmt" - "math" - "time" -) - -const ( - // MinNanoTime is the minumum time that can be represented. - // - // 1677-09-21 00:12:43.145224194 +0000 UTC - // - // The two lowest minimum integers are used as sentinel values. The - // minimum value needs to be used as a value lower than any other value for - // comparisons and another separate value is needed to act as a sentinel - // default value that is unusable by the user, but usable internally. - // Because these two values need to be used for a special purpose, we do - // not allow users to write points at these two times. - MinNanoTime = int64(math.MinInt64) + 2 - - // MaxNanoTime is the maximum time that can be represented. - // - // 2262-04-11 23:47:16.854775806 +0000 UTC - // - // The highest time represented by a nanosecond needs to be used for an - // exclusive range in the shard group, so the maximum time needs to be one - // less than the possible maximum number of nanoseconds representable by an - // int64 so that we don't lose a point at that one time. - MaxNanoTime = int64(math.MaxInt64) - 1 -) - -var ( - minNanoTime = time.Unix(0, MinNanoTime).UTC() - maxNanoTime = time.Unix(0, MaxNanoTime).UTC() - - // ErrTimeOutOfRange gets returned when time is out of the representable range using int64 nanoseconds since the epoch. - ErrTimeOutOfRange = fmt.Errorf("time outside range %d - %d", MinNanoTime, MaxNanoTime) -) - -// SafeCalcTime safely calculates the time given. Will return error if the time is outside the -// supported range. -func SafeCalcTime(timestamp int64, precision string) (time.Time, error) { - mult := GetPrecisionMultiplier(precision) - if t, ok := safeSignedMult(timestamp, mult); ok { - tme := time.Unix(0, t).UTC() - return tme, CheckTime(tme) - } - - return time.Time{}, ErrTimeOutOfRange -} - -// CheckTime checks that a time is within the safe range. -func CheckTime(t time.Time) error { - if t.Before(minNanoTime) || t.After(maxNanoTime) { - return ErrTimeOutOfRange - } - return nil -} - -// Perform the multiplication and check to make sure it didn't overflow. -func safeSignedMult(a, b int64) (int64, bool) { - if a == 0 || b == 0 || a == 1 || b == 1 { - return a * b, true - } - if a == MinNanoTime || b == MaxNanoTime { - return 0, false - } - c := a * b - return c, c/b == a -} diff --git a/vendor/github.com/influxdata/influxdb/models/uint_support.go b/vendor/github.com/influxdata/influxdb/models/uint_support.go deleted file mode 100644 index 18d1ca06e2dc..000000000000 --- a/vendor/github.com/influxdata/influxdb/models/uint_support.go +++ /dev/null @@ -1,7 +0,0 @@ -// +build uint uint64 - -package models - -func init() { - EnableUintSupport() -} diff --git a/vendor/github.com/influxdata/influxdb/pkg/escape/bytes.go b/vendor/github.com/influxdata/influxdb/pkg/escape/bytes.go deleted file mode 100644 index f3b31f42d368..000000000000 --- a/vendor/github.com/influxdata/influxdb/pkg/escape/bytes.go +++ /dev/null @@ -1,115 +0,0 @@ -// Package escape contains utilities for escaping parts of InfluxQL -// and InfluxDB line protocol. -package escape // import "github.com/influxdata/influxdb/pkg/escape" - -import ( - "bytes" - "strings" -) - -// Codes is a map of bytes to be escaped. -var Codes = map[byte][]byte{ - ',': []byte(`\,`), - '"': []byte(`\"`), - ' ': []byte(`\ `), - '=': []byte(`\=`), -} - -// Bytes escapes characters on the input slice, as defined by Codes. -func Bytes(in []byte) []byte { - for b, esc := range Codes { - in = bytes.Replace(in, []byte{b}, esc, -1) - } - return in -} - -const escapeChars = `," =` - -// IsEscaped returns whether b has any escaped characters, -// i.e. whether b seems to have been processed by Bytes. -func IsEscaped(b []byte) bool { - for len(b) > 0 { - i := bytes.IndexByte(b, '\\') - if i < 0 { - return false - } - - if i+1 < len(b) && strings.IndexByte(escapeChars, b[i+1]) >= 0 { - return true - } - b = b[i+1:] - } - return false -} - -// AppendUnescaped appends the unescaped version of src to dst -// and returns the resulting slice. -func AppendUnescaped(dst, src []byte) []byte { - var pos int - for len(src) > 0 { - next := bytes.IndexByte(src[pos:], '\\') - if next < 0 || pos+next+1 >= len(src) { - return append(dst, src...) - } - - if pos+next+1 < len(src) && strings.IndexByte(escapeChars, src[pos+next+1]) >= 0 { - if pos+next > 0 { - dst = append(dst, src[:pos+next]...) - } - src = src[pos+next+1:] - pos = 0 - } else { - pos += next + 1 - } - } - - return dst -} - -// Unescape returns a new slice containing the unescaped version of in. -func Unescape(in []byte) []byte { - if len(in) == 0 { - return nil - } - - if bytes.IndexByte(in, '\\') == -1 { - return in - } - - i := 0 - inLen := len(in) - - // The output size will be no more than inLen. Preallocating the - // capacity of the output is faster and uses less memory than - // letting append() do its own (over)allocation. - out := make([]byte, 0, inLen) - - for { - if i >= inLen { - break - } - if in[i] == '\\' && i+1 < inLen { - switch in[i+1] { - case ',': - out = append(out, ',') - i += 2 - continue - case '"': - out = append(out, '"') - i += 2 - continue - case ' ': - out = append(out, ' ') - i += 2 - continue - case '=': - out = append(out, '=') - i += 2 - continue - } - } - out = append(out, in[i]) - i += 1 - } - return out -} diff --git a/vendor/github.com/influxdata/influxdb/pkg/escape/strings.go b/vendor/github.com/influxdata/influxdb/pkg/escape/strings.go deleted file mode 100644 index db98033b0d7a..000000000000 --- a/vendor/github.com/influxdata/influxdb/pkg/escape/strings.go +++ /dev/null @@ -1,21 +0,0 @@ -package escape - -import "strings" - -var ( - escaper = strings.NewReplacer(`,`, `\,`, `"`, `\"`, ` `, `\ `, `=`, `\=`) - unescaper = strings.NewReplacer(`\,`, `,`, `\"`, `"`, `\ `, ` `, `\=`, `=`) -) - -// UnescapeString returns unescaped version of in. -func UnescapeString(in string) string { - if strings.IndexByte(in, '\\') == -1 { - return in - } - return unescaper.Replace(in) -} - -// String returns the escaped version of in. -func String(in string) string { - return escaper.Replace(in) -} diff --git a/vendor/github.com/jackpal/go-nat-pmp/LICENSE b/vendor/github.com/jackpal/go-nat-pmp/LICENSE deleted file mode 100644 index 249514b0fbfc..000000000000 --- a/vendor/github.com/jackpal/go-nat-pmp/LICENSE +++ /dev/null @@ -1,13 +0,0 @@ - Copyright 2013 John Howard Palevich - - 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/jackpal/go-nat-pmp/README.md b/vendor/github.com/jackpal/go-nat-pmp/README.md deleted file mode 100644 index 3ca687f0b78e..000000000000 --- a/vendor/github.com/jackpal/go-nat-pmp/README.md +++ /dev/null @@ -1,52 +0,0 @@ -go-nat-pmp -========== - -A Go language client for the NAT-PMP internet protocol for port mapping and discovering the external -IP address of a firewall. - -NAT-PMP is supported by Apple brand routers and open source routers like Tomato and DD-WRT. - -See http://tools.ietf.org/html/draft-cheshire-nat-pmp-03 - - -[![Build Status](https://travis-ci.org/jackpal/go-nat-pmp.svg)](https://travis-ci.org/jackpal/go-nat-pmp) - -Get the package ---------------- - - go get -u github.com/jackpal/go-nat-pmp - -Usage ------ - - import ( - "github.com/jackpal/gateway" - natpmp "github.com/jackpal/go-nat-pmp" - ) - - gatewayIP, err = gateway.DiscoverGateway() - if err != nil { - return - } - - client := natpmp.NewClient(gatewayIP) - response, err := client.GetExternalAddress() - if err != nil { - return - } - print("External IP address:", response.ExternalIPAddress) - -Clients -------- - -This library is used in the Taipei Torrent BitTorrent client http://github.com/jackpal/Taipei-Torrent - -Complete documentation ----------------------- - - http://godoc.org/github.com/jackpal/go-nat-pmp - -License -------- - -This project is licensed under the Apache License 2.0. diff --git a/vendor/github.com/jackpal/go-nat-pmp/natpmp.go b/vendor/github.com/jackpal/go-nat-pmp/natpmp.go deleted file mode 100644 index 5ca7680e4190..000000000000 --- a/vendor/github.com/jackpal/go-nat-pmp/natpmp.go +++ /dev/null @@ -1,153 +0,0 @@ -package natpmp - -import ( - "fmt" - "net" - "time" -) - -// Implement the NAT-PMP protocol, typically supported by Apple routers and open source -// routers such as DD-WRT and Tomato. -// -// See http://tools.ietf.org/html/draft-cheshire-nat-pmp-03 -// -// Usage: -// -// client := natpmp.NewClient(gatewayIP) -// response, err := client.GetExternalAddress() - -// The recommended mapping lifetime for AddPortMapping -const RECOMMENDED_MAPPING_LIFETIME_SECONDS = 3600 - -// Interface used to make remote procedure calls. -type caller interface { - call(msg []byte, timeout time.Duration) (result []byte, err error) -} - -// Client is a NAT-PMP protocol client. -type Client struct { - caller caller - timeout time.Duration -} - -// Create a NAT-PMP client for the NAT-PMP server at the gateway. -// Uses default timeout which is around 128 seconds. -func NewClient(gateway net.IP) (nat *Client) { - return &Client{&network{gateway}, 0} -} - -// Create a NAT-PMP client for the NAT-PMP server at the gateway, with a timeout. -// Timeout defines the total amount of time we will keep retrying before giving up. -func NewClientWithTimeout(gateway net.IP, timeout time.Duration) (nat *Client) { - return &Client{&network{gateway}, timeout} -} - -// Results of the NAT-PMP GetExternalAddress operation. -type GetExternalAddressResult struct { - SecondsSinceStartOfEpoc uint32 - ExternalIPAddress [4]byte -} - -// Get the external address of the router. -func (n *Client) GetExternalAddress() (result *GetExternalAddressResult, err error) { - msg := make([]byte, 2) - msg[0] = 0 // Version 0 - msg[1] = 0 // OP Code 0 - response, err := n.rpc(msg, 12) - if err != nil { - return - } - result = &GetExternalAddressResult{} - result.SecondsSinceStartOfEpoc = readNetworkOrderUint32(response[4:8]) - copy(result.ExternalIPAddress[:], response[8:12]) - return -} - -// Results of the NAT-PMP AddPortMapping operation -type AddPortMappingResult struct { - SecondsSinceStartOfEpoc uint32 - InternalPort uint16 - MappedExternalPort uint16 - PortMappingLifetimeInSeconds uint32 -} - -// Add (or delete) a port mapping. To delete a mapping, set the requestedExternalPort and lifetime to 0 -func (n *Client) AddPortMapping(protocol string, internalPort, requestedExternalPort int, lifetime int) (result *AddPortMappingResult, err error) { - var opcode byte - if protocol == "udp" { - opcode = 1 - } else if protocol == "tcp" { - opcode = 2 - } else { - err = fmt.Errorf("unknown protocol %v", protocol) - return - } - msg := make([]byte, 12) - msg[0] = 0 // Version 0 - msg[1] = opcode - writeNetworkOrderUint16(msg[4:6], uint16(internalPort)) - writeNetworkOrderUint16(msg[6:8], uint16(requestedExternalPort)) - writeNetworkOrderUint32(msg[8:12], uint32(lifetime)) - response, err := n.rpc(msg, 16) - if err != nil { - return - } - result = &AddPortMappingResult{} - result.SecondsSinceStartOfEpoc = readNetworkOrderUint32(response[4:8]) - result.InternalPort = readNetworkOrderUint16(response[8:10]) - result.MappedExternalPort = readNetworkOrderUint16(response[10:12]) - result.PortMappingLifetimeInSeconds = readNetworkOrderUint32(response[12:16]) - return -} - -func (n *Client) rpc(msg []byte, resultSize int) (result []byte, err error) { - result, err = n.caller.call(msg, n.timeout) - if err != nil { - return - } - err = protocolChecks(msg, resultSize, result) - return -} - -func protocolChecks(msg []byte, resultSize int, result []byte) (err error) { - if len(result) != resultSize { - err = fmt.Errorf("unexpected result size %d, expected %d", len(result), resultSize) - return - } - if result[0] != 0 { - err = fmt.Errorf("unknown protocol version %d", result[0]) - return - } - expectedOp := msg[1] | 0x80 - if result[1] != expectedOp { - err = fmt.Errorf("Unexpected opcode %d. Expected %d", result[1], expectedOp) - return - } - resultCode := readNetworkOrderUint16(result[2:4]) - if resultCode != 0 { - err = fmt.Errorf("Non-zero result code %d", resultCode) - return - } - // If we got here the RPC is good. - return -} - -func writeNetworkOrderUint16(buf []byte, d uint16) { - buf[0] = byte(d >> 8) - buf[1] = byte(d) -} - -func writeNetworkOrderUint32(buf []byte, d uint32) { - buf[0] = byte(d >> 24) - buf[1] = byte(d >> 16) - buf[2] = byte(d >> 8) - buf[3] = byte(d) -} - -func readNetworkOrderUint16(buf []byte) uint16 { - return (uint16(buf[0]) << 8) | uint16(buf[1]) -} - -func readNetworkOrderUint32(buf []byte) uint32 { - return (uint32(buf[0]) << 24) | (uint32(buf[1]) << 16) | (uint32(buf[2]) << 8) | uint32(buf[3]) -} diff --git a/vendor/github.com/jackpal/go-nat-pmp/network.go b/vendor/github.com/jackpal/go-nat-pmp/network.go deleted file mode 100644 index c42b4fee9d42..000000000000 --- a/vendor/github.com/jackpal/go-nat-pmp/network.go +++ /dev/null @@ -1,89 +0,0 @@ -package natpmp - -import ( - "fmt" - "net" - "time" -) - -const nAT_PMP_PORT = 5351 -const nAT_TRIES = 9 -const nAT_INITIAL_MS = 250 - -// A caller that implements the NAT-PMP RPC protocol. -type network struct { - gateway net.IP -} - -func (n *network) call(msg []byte, timeout time.Duration) (result []byte, err error) { - var server net.UDPAddr - server.IP = n.gateway - server.Port = nAT_PMP_PORT - conn, err := net.DialUDP("udp", nil, &server) - if err != nil { - return - } - defer conn.Close() - - // 16 bytes is the maximum result size. - result = make([]byte, 16) - - var finalTimeout time.Time - if timeout != 0 { - finalTimeout = time.Now().Add(timeout) - } - - needNewDeadline := true - - var tries uint - for tries = 0; (tries < nAT_TRIES && finalTimeout.IsZero()) || time.Now().Before(finalTimeout); { - if needNewDeadline { - nextDeadline := time.Now().Add((nAT_INITIAL_MS << tries) * time.Millisecond) - err = conn.SetDeadline(minTime(nextDeadline, finalTimeout)) - if err != nil { - return - } - needNewDeadline = false - } - _, err = conn.Write(msg) - if err != nil { - return - } - var bytesRead int - var remoteAddr *net.UDPAddr - bytesRead, remoteAddr, err = conn.ReadFromUDP(result) - if err != nil { - if err.(net.Error).Timeout() { - tries++ - needNewDeadline = true - continue - } - return - } - if !remoteAddr.IP.Equal(n.gateway) { - // Ignore this packet. - // Continue without increasing retransmission timeout or deadline. - continue - } - // Trim result to actual number of bytes received - if bytesRead < len(result) { - result = result[:bytesRead] - } - return - } - err = fmt.Errorf("Timed out trying to contact gateway") - return -} - -func minTime(a, b time.Time) time.Time { - if a.IsZero() { - return b - } - if b.IsZero() { - return a - } - if a.Before(b) { - return a - } - return b -} diff --git a/vendor/github.com/jackpal/go-nat-pmp/recorder.go b/vendor/github.com/jackpal/go-nat-pmp/recorder.go deleted file mode 100644 index 845703672b73..000000000000 --- a/vendor/github.com/jackpal/go-nat-pmp/recorder.go +++ /dev/null @@ -1,19 +0,0 @@ -package natpmp - -import "time" - -type callObserver interface { - observeCall(msg []byte, result []byte, err error) -} - -// A caller that records the RPC call. -type recorder struct { - child caller - observer callObserver -} - -func (n *recorder) call(msg []byte, timeout time.Duration) (result []byte, err error) { - result, err = n.child.call(msg, timeout) - n.observer.observeCall(msg, result, err) - return -} diff --git a/vendor/github.com/julienschmidt/httprouter/LICENSE b/vendor/github.com/julienschmidt/httprouter/LICENSE deleted file mode 100644 index b829abc8a17f..000000000000 --- a/vendor/github.com/julienschmidt/httprouter/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -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 deleted file mode 100644 index 92885470b9e7..000000000000 --- a/vendor/github.com/julienschmidt/httprouter/README.md +++ /dev/null @@ -1,266 +0,0 @@ -# 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 deleted file mode 100644 index 486134db379a..000000000000 --- a/vendor/github.com/julienschmidt/httprouter/path.go +++ /dev/null @@ -1,123 +0,0 @@ -// 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 deleted file mode 100644 index bb1733005bd4..000000000000 --- a/vendor/github.com/julienschmidt/httprouter/router.go +++ /dev/null @@ -1,411 +0,0 @@ -// 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 deleted file mode 100644 index a8fa98b04fb0..000000000000 --- a/vendor/github.com/julienschmidt/httprouter/tree.go +++ /dev/null @@ -1,656 +0,0 @@ -// 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/LICENSE.md b/vendor/github.com/karalabe/hid/LICENSE.md deleted file mode 100644 index 230d1daeb619..000000000000 --- a/vendor/github.com/karalabe/hid/LICENSE.md +++ /dev/null @@ -1,8 +0,0 @@ -The components of `hid` are licensed as such: - - * `hidapi` is released under the [3-clause BSD](https://github.com/signal11/hidapi/blob/master/LICENSE-bsd.txt) license. - * `libusb` is released under the [GNU LGPL 2.1](https://github.com/libusb/libusb/blob/master/COPYING)license. - * `go.hid` is released under the [2-clause BSD](https://github.com/GeertJohan/go.hid/blob/master/LICENSE) license. - * `gowchar` is released under the [3-clause BSD](https://github.com/orofarne/gowchar/blob/master/LICENSE) license. - -Given the above, `hid` is licensed under GNU LGPL 2.1 or later on Linux and 3-clause BSD on other platforms. diff --git a/vendor/github.com/karalabe/hid/README.md b/vendor/github.com/karalabe/hid/README.md deleted file mode 100644 index 2851ffe4200f..000000000000 --- a/vendor/github.com/karalabe/hid/README.md +++ /dev/null @@ -1,53 +0,0 @@ -[![Travis][travisimg]][travisurl] -[![AppVeyor][appveyorimg]][appveyorurl] -[![GoDoc][docimg]][docurl] - -[travisimg]: https://travis-ci.org/karalabe/hid.svg?branch=master -[travisurl]: https://travis-ci.org/karalabe/hid -[appveyorimg]: https://ci.appveyor.com/api/projects/status/plroy54odykb0ch3/branch/master?svg=true -[appveyorurl]: https://ci.appveyor.com/project/karalabe/hid -[docimg]: https://godoc.org/github.com/karalabe/hid?status.svg -[docurl]: https://godoc.org/github.com/karalabe/hid - -# Gopher Interface Devices (USB HID) - -The `hid` package is a cross platform library for accessing and communicating with USB Human Interface -Devices (HID). It is an alternative package to [`gousb`](https://github.com/karalabe/gousb) for use -cases where devices support this ligher mode of operation (e.g. input devices, hardware crypto wallets). - -The package wraps [`hidapi`](https://github.com/signal11/hidapi) for accessing OS specific USB HID APIs -directly instead of using low level USB constructs, which might have permission issues on some platforms. -On Linux the package also wraps [`libusb`](https://github.com/libusb/libusb). Both of these dependencies -are vendored directly into the repository and wrapped using CGO, making the `hid` package self-contained -and go-gettable. - -Supported platforms at the moment are Linux, macOS and Windows (exclude constraints are also specified -for Android and iOS to allow smoother vendoring into cross platform projects). - -## Cross-compiling - -Using `go get` the embedded C library is compiled into the binary format of your host OS. Cross compiling to a different platform or architecture entails disabling CGO by default in Go, causing device enumeration `hid.Enumerate()` to yield no results. - -To cross compile a functional version of this library, you'll need to enable CGO during cross compilation via `CGO_ENABLED=1` and you'll need to install and set a cross compilation enabled C toolkit via `CC=your-cross-gcc`. - -## Acknowledgements - -Although the `hid` package is an implementation from scratch, it was heavily inspired by the existing -[`go.hid`](https://github.com/GeertJohan/go.hid) library, which seems abandoned since 2015; is incompatible -with Go 1.6+; and has various external dependencies. Given its inspirational roots, I thought it important -to give credit to the author of said package too. - -Wide character support in the `hid` package is done via the [`gowchar`](https://github.com/orofarne/gowchar) -library, unmaintained since 2013; non buildable with a modern Go release and failing `go vet` checks. As -such, `gowchar` was also vendored in inline (copyright headers and origins preserved). - -## License - -The components of `hid` are licensed as such: - - * `hidapi` is released under the [3-clause BSD](https://github.com/signal11/hidapi/blob/master/LICENSE-bsd.txt) license. - * `libusb` is released under the [GNU LGPL 2.1](https://github.com/libusb/libusb/blob/master/COPYING)license. - * `go.hid` is released under the [2-clause BSD](https://github.com/GeertJohan/go.hid/blob/master/LICENSE) license. - * `gowchar` is released under the [3-clause BSD](https://github.com/orofarne/gowchar/blob/master/LICENSE) license. - -Given the above, `hid` is licensed under GNU LGPL 2.1 or later on Linux and 3-clause BSD on other platforms. diff --git a/vendor/github.com/karalabe/hid/appveyor.yml b/vendor/github.com/karalabe/hid/appveyor.yml deleted file mode 100644 index 84b3c95ff7c9..000000000000 --- a/vendor/github.com/karalabe/hid/appveyor.yml +++ /dev/null @@ -1,32 +0,0 @@ -os: Visual Studio 2015 - -# Clone directly into GOPATH. -clone_folder: C:\gopath\src\github.com\karalabe\hid -clone_depth: 1 -version: "{branch}.{build}" -environment: - global: - GOPATH: C:\gopath - CC: gcc.exe - matrix: - - GOARCH: amd64 - MSYS2_ARCH: x86_64 - MSYS2_BITS: 64 - MSYSTEM: MINGW64 - PATH: C:\msys64\mingw64\bin\;%PATH% - - GOARCH: 386 - MSYS2_ARCH: i686 - MSYS2_BITS: 32 - MSYSTEM: MINGW32 - PATH: C:\msys64\mingw32\bin\;%PATH% - -install: - - rmdir C:\go /s /q - - appveyor DownloadFile https://storage.googleapis.com/golang/go1.10.1.windows-%GOARCH%.zip - - 7z x go1.10.1.windows-%GOARCH%.zip -y -oC:\ > NUL - - go version - - gcc --version - -build_script: - - go install ./... - - go test -v ./... diff --git a/vendor/github.com/karalabe/hid/hid.go b/vendor/github.com/karalabe/hid/hid.go deleted file mode 100644 index 60a40b8c24af..000000000000 --- a/vendor/github.com/karalabe/hid/hid.go +++ /dev/null @@ -1,37 +0,0 @@ -// hid - Gopher Interface Devices (USB HID) -// Copyright (c) 2017 Péter Szilágyi. All rights reserved. -// -// This file is released under the 3-clause BSD license. Note however that Linux -// support depends on libusb, released under GNU LGPL 2.1 or later. - -// Package hid provides an interface for USB HID devices. -package hid - -import "errors" - -// ErrDeviceClosed is returned for operations where the device closed before or -// during the execution. -var ErrDeviceClosed = errors.New("hid: device closed") - -// ErrUnsupportedPlatform is returned for all operations where the underlying -// operating system is not supported by the library. -var ErrUnsupportedPlatform = errors.New("hid: unsupported platform") - -// DeviceInfo is a hidapi info structure. -type DeviceInfo struct { - Path string // Platform-specific device path - VendorID uint16 // Device Vendor ID - ProductID uint16 // Device Product ID - Release uint16 // Device Release Number in binary-coded decimal, also known as Device Version Number - Serial string // Serial Number - Manufacturer string // Manufacturer String - Product string // Product string - UsagePage uint16 // Usage Page for this Device/Interface (Windows/Mac only) - Usage uint16 // Usage for this Device/Interface (Windows/Mac only) - - // The USB interface which this logical device - // represents. Valid on both Linux implementations - // in all cases, and valid on the Windows implementation - // only if the device contains more than one interface. - Interface int -} diff --git a/vendor/github.com/karalabe/hid/hid_disabled.go b/vendor/github.com/karalabe/hid/hid_disabled.go deleted file mode 100644 index 0f266ba58a0a..000000000000 --- a/vendor/github.com/karalabe/hid/hid_disabled.go +++ /dev/null @@ -1,51 +0,0 @@ -// hid - Gopher Interface Devices (USB HID) -// Copyright (c) 2017 Péter Szilágyi. All rights reserved. -// -// This file is released under the 3-clause BSD license. Note however that Linux -// support depends on libusb, released under GNU LGPL 2.1 or later. - -// +build !linux,!darwin,!windows ios !cgo - -package hid - -// 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. -func Supported() bool { - return false -} - -// Enumerate returns a list of all the HID devices attached to the system which -// match the vendor and product id. On platforms that this file implements the -// function is a noop and returns an empty list always. -func Enumerate(vendorID uint16, productID uint16) []DeviceInfo { - return nil -} - -// Device is a live HID USB connected device handle. On platforms that this file -// implements the type lacks the actual HID device and all methods are noop. -type Device struct { - DeviceInfo // Embed the infos for easier access -} - -// Open connects to an HID device by its path name. On platforms that this file -// implements the method just returns an error. -func (info DeviceInfo) Open() (*Device, error) { - return nil, ErrUnsupportedPlatform -} - -// Close releases the HID USB device handle. On platforms that this file implements -// the method is just a noop. -func (dev *Device) Close() error { return nil } - -// Write sends an output report to a HID device. On platforms that this file -// implements the method just returns an error. -func (dev *Device) Write(b []byte) (int, error) { - return 0, ErrUnsupportedPlatform -} - -// Read retrieves an input report from a HID device. On platforms that this file -// implements the method just returns an error. -func (dev *Device) Read(b []byte) (int, error) { - return 0, ErrUnsupportedPlatform -} diff --git a/vendor/github.com/karalabe/hid/hid_enabled.go b/vendor/github.com/karalabe/hid/hid_enabled.go deleted file mode 100644 index e95e5792d91e..000000000000 --- a/vendor/github.com/karalabe/hid/hid_enabled.go +++ /dev/null @@ -1,228 +0,0 @@ -// hid - Gopher Interface Devices (USB HID) -// Copyright (c) 2017 Péter Szilágyi. All rights reserved. -// -// This file is released under the 3-clause BSD license. Note however that Linux -// support depends on libusb, released under LGNU GPL 2.1 or later. - -// +build linux,cgo darwin,!ios,cgo windows,cgo - -package hid - -/* -#cgo CFLAGS: -I./hidapi/hidapi - -#cgo linux CFLAGS: -I./libusb/libusb -DDEFAULT_VISIBILITY="" -DOS_LINUX -D_GNU_SOURCE -DPOLL_NFDS_TYPE=int -#cgo linux,!android LDFLAGS: -lrt -#cgo darwin CFLAGS: -DOS_DARWIN -#cgo darwin LDFLAGS: -framework CoreFoundation -framework IOKit -#cgo windows CFLAGS: -DOS_WINDOWS -#cgo windows LDFLAGS: -lsetupapi - -#ifdef OS_LINUX - #include - #include "os/threads_posix.c" - #include "os/poll_posix.c" - - #include "os/linux_usbfs.c" - #include "os/linux_netlink.c" - - #include "core.c" - #include "descriptor.c" - #include "hotplug.c" - #include "io.c" - #include "strerror.c" - #include "sync.c" - - #include "hidapi/libusb/hid.c" -#elif OS_DARWIN - #include "hidapi/mac/hid.c" -#elif OS_WINDOWS - #include "hidapi/windows/hid.c" -#endif -*/ -import "C" - -import ( - "errors" - "runtime" - "sync" - "unsafe" -) - -// enumerateLock is a mutex serializing access to USB device enumeration needed -// by the macOS USB HID system calls, which require 2 consecutive method calls -// for enumeration, causing crashes if called concurrently. -// -// For more details, see: -// https://developer.apple.com/documentation/iokit/1438371-iohidmanagersetdevicematching -// > "subsequent calls will cause the hid manager to release previously enumerated devices" -var enumerateLock sync.Mutex - -// 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. -func Supported() bool { - return true -} - -// Enumerate returns a list of all the HID devices attached to the system which -// match the vendor and product id: -// - If the vendor id is set to 0 then any vendor matches. -// - If the product id is set to 0 then any product matches. -// - If the vendor and product id are both 0, all HID devices are returned. -func Enumerate(vendorID uint16, productID uint16) []DeviceInfo { - enumerateLock.Lock() - defer enumerateLock.Unlock() - - // Gather all device infos and ensure they are freed before returning - head := C.hid_enumerate(C.ushort(vendorID), C.ushort(productID)) - if head == nil { - return nil - } - defer C.hid_free_enumeration(head) - - // Iterate the list and retrieve the device details - var infos []DeviceInfo - for ; head != nil; head = head.next { - info := DeviceInfo{ - Path: C.GoString(head.path), - VendorID: uint16(head.vendor_id), - ProductID: uint16(head.product_id), - Release: uint16(head.release_number), - UsagePage: uint16(head.usage_page), - Usage: uint16(head.usage), - Interface: int(head.interface_number), - } - if head.serial_number != nil { - info.Serial, _ = wcharTToString(head.serial_number) - } - if head.product_string != nil { - info.Product, _ = wcharTToString(head.product_string) - } - if head.manufacturer_string != nil { - info.Manufacturer, _ = wcharTToString(head.manufacturer_string) - } - infos = append(infos, info) - } - return infos -} - -// Open connects to an HID device by its path name. -func (info DeviceInfo) Open() (*Device, error) { - enumerateLock.Lock() - defer enumerateLock.Unlock() - - path := C.CString(info.Path) - defer C.free(unsafe.Pointer(path)) - - device := C.hid_open_path(path) - if device == nil { - return nil, errors.New("hidapi: failed to open device") - } - return &Device{ - DeviceInfo: info, - device: device, - }, nil -} - -// Device is a live HID USB connected device handle. -type Device struct { - DeviceInfo // Embed the infos for easier access - - device *C.hid_device // Low level HID device to communicate through - lock sync.Mutex -} - -// Close releases the HID USB device handle. -func (dev *Device) Close() error { - dev.lock.Lock() - defer dev.lock.Unlock() - - if dev.device != nil { - C.hid_close(dev.device) - dev.device = nil - } - return nil -} - -// Write sends an output report to a HID device. -// -// Write will send the data on the first OUT endpoint, if one exists. If it does -// not, it will send the data through the Control Endpoint (Endpoint 0). -func (dev *Device) Write(b []byte) (int, error) { - // Abort if nothing to write - if len(b) == 0 { - return 0, nil - } - // Abort if device closed in between - dev.lock.Lock() - device := dev.device - dev.lock.Unlock() - - if device == nil { - return 0, ErrDeviceClosed - } - // Prepend a HID report ID on Windows, other OSes don't need it - var report []byte - if runtime.GOOS == "windows" { - report = append([]byte{0x00}, b...) - } else { - report = b - } - // Execute the write operation - written := int(C.hid_write(device, (*C.uchar)(&report[0]), C.size_t(len(report)))) - if written == -1 { - // If the write failed, verify if closed or other error - dev.lock.Lock() - device = dev.device - dev.lock.Unlock() - - if device == nil { - return 0, ErrDeviceClosed - } - // Device not closed, some other error occurred - message := C.hid_error(device) - if message == nil { - return 0, errors.New("hidapi: unknown failure") - } - failure, _ := wcharTToString(message) - return 0, errors.New("hidapi: " + failure) - } - return written, nil -} - -// Read retrieves an input report from a HID device. -func (dev *Device) Read(b []byte) (int, error) { - // Aborth if nothing to read - if len(b) == 0 { - return 0, nil - } - // Abort if device closed in between - dev.lock.Lock() - device := dev.device - dev.lock.Unlock() - - if device == nil { - return 0, ErrDeviceClosed - } - // Execute the read operation - read := int(C.hid_read(device, (*C.uchar)(&b[0]), C.size_t(len(b)))) - if read == -1 { - // If the read failed, verify if closed or other error - dev.lock.Lock() - device = dev.device - dev.lock.Unlock() - - if device == nil { - return 0, ErrDeviceClosed - } - // Device not closed, some other error occurred - message := C.hid_error(device) - if message == nil { - return 0, errors.New("hidapi: unknown failure") - } - failure, _ := wcharTToString(message) - return 0, errors.New("hidapi: " + failure) - } - return read, nil -} diff --git a/vendor/github.com/karalabe/hid/hidapi/AUTHORS.txt b/vendor/github.com/karalabe/hid/hidapi/AUTHORS.txt deleted file mode 100644 index 7acafd78c3fb..000000000000 --- a/vendor/github.com/karalabe/hid/hidapi/AUTHORS.txt +++ /dev/null @@ -1,16 +0,0 @@ - -HIDAPI Authors: - -Alan Ott : - Original Author and Maintainer - Linux, Windows, and Mac implementations - -Ludovic Rousseau : - Formatting for Doxygen documentation - Bug fixes - Correctness fixes - - -For a comprehensive list of contributions, see the commit list at github: - http://github.com/signal11/hidapi/commits/master - diff --git a/vendor/github.com/karalabe/hid/hidapi/LICENSE-bsd.txt b/vendor/github.com/karalabe/hid/hidapi/LICENSE-bsd.txt deleted file mode 100644 index 538cdf95cf63..000000000000 --- a/vendor/github.com/karalabe/hid/hidapi/LICENSE-bsd.txt +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2010, Alan Ott, Signal 11 Software -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 Signal 11 Software 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 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/karalabe/hid/hidapi/LICENSE-gpl3.txt b/vendor/github.com/karalabe/hid/hidapi/LICENSE-gpl3.txt deleted file mode 100644 index 94a9ed024d38..000000000000 --- a/vendor/github.com/karalabe/hid/hidapi/LICENSE-gpl3.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program 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. - - This program 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 this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/vendor/github.com/karalabe/hid/hidapi/LICENSE-orig.txt b/vendor/github.com/karalabe/hid/hidapi/LICENSE-orig.txt deleted file mode 100644 index e3f338082996..000000000000 --- a/vendor/github.com/karalabe/hid/hidapi/LICENSE-orig.txt +++ /dev/null @@ -1,9 +0,0 @@ - HIDAPI - Multi-Platform library for - communication with HID devices. - - Copyright 2009, Alan Ott, Signal 11 Software. - All Rights Reserved. - - This software may be used by anyone for any reason so - long as the copyright notice in the source files - remains intact. diff --git a/vendor/github.com/karalabe/hid/hidapi/LICENSE.txt b/vendor/github.com/karalabe/hid/hidapi/LICENSE.txt deleted file mode 100644 index e1676d4c42d6..000000000000 --- a/vendor/github.com/karalabe/hid/hidapi/LICENSE.txt +++ /dev/null @@ -1,13 +0,0 @@ -HIDAPI can be used under one of three licenses. - -1. The GNU General Public License, version 3.0, in LICENSE-gpl3.txt -2. A BSD-Style License, in LICENSE-bsd.txt. -3. The more liberal original HIDAPI license. LICENSE-orig.txt - -The license chosen is at the discretion of the user of HIDAPI. For example: -1. An author of GPL software would likely use HIDAPI under the terms of the -GPL. - -2. An author of commercial closed-source software would likely use HIDAPI -under the terms of the BSD-style license or the original HIDAPI license. - diff --git a/vendor/github.com/karalabe/hid/hidapi/README.txt b/vendor/github.com/karalabe/hid/hidapi/README.txt deleted file mode 100644 index f19dae4ab729..000000000000 --- a/vendor/github.com/karalabe/hid/hidapi/README.txt +++ /dev/null @@ -1,339 +0,0 @@ - HIDAPI library for Windows, Linux, FreeBSD and Mac OS X - ========================================================= - -About -====== - -HIDAPI is a multi-platform library which allows an application to interface -with USB and Bluetooth HID-Class devices on Windows, Linux, FreeBSD, and Mac -OS X. HIDAPI can be either built as a shared library (.so or .dll) or -can be embedded directly into a target application by adding a single source -file (per platform) and a single header. - -HIDAPI has four back-ends: - * Windows (using hid.dll) - * Linux/hidraw (using the Kernel's hidraw driver) - * Linux/libusb (using libusb-1.0) - * FreeBSD (using libusb-1.0) - * Mac (using IOHidManager) - -On Linux, either the hidraw or the libusb back-end can be used. There are -tradeoffs, and the functionality supported is slightly different. - -Linux/hidraw (linux/hid.c): -This back-end uses the hidraw interface in the Linux kernel. While this -back-end will support both USB and Bluetooth, it has some limitations on -kernels prior to 2.6.39, including the inability to send or receive feature -reports. In addition, it will only communicate with devices which have -hidraw nodes associated with them. Keyboards, mice, and some other devices -which are blacklisted from having hidraw nodes will not work. Fortunately, -for nearly all the uses of hidraw, this is not a problem. - -Linux/FreeBSD/libusb (libusb/hid.c): -This back-end uses libusb-1.0 to communicate directly to a USB device. This -back-end will of course not work with Bluetooth devices. - -HIDAPI also comes with a Test GUI. The Test GUI is cross-platform and uses -Fox Toolkit (http://www.fox-toolkit.org). It will build on every platform -which HIDAPI supports. Since it relies on a 3rd party library, building it -is optional but recommended because it is so useful when debugging hardware. - -What Does the API Look Like? -============================= -The API provides the the most commonly used HID functions including sending -and receiving of input, output, and feature reports. The sample program, -which communicates with a heavily hacked up version of the Microchip USB -Generic HID sample looks like this (with error checking removed for -simplicity): - -#ifdef WIN32 -#include -#endif -#include -#include -#include "hidapi.h" - -#define MAX_STR 255 - -int main(int argc, char* argv[]) -{ - int res; - unsigned char buf[65]; - wchar_t wstr[MAX_STR]; - hid_device *handle; - int i; - - // Initialize the hidapi library - res = hid_init(); - - // Open the device using the VID, PID, - // and optionally the Serial number. - handle = hid_open(0x4d8, 0x3f, NULL); - - // Read the Manufacturer String - res = hid_get_manufacturer_string(handle, wstr, MAX_STR); - wprintf(L"Manufacturer String: %s\n", wstr); - - // Read the Product String - res = hid_get_product_string(handle, wstr, MAX_STR); - wprintf(L"Product String: %s\n", wstr); - - // Read the Serial Number String - res = hid_get_serial_number_string(handle, wstr, MAX_STR); - wprintf(L"Serial Number String: (%d) %s\n", wstr[0], wstr); - - // Read Indexed String 1 - res = hid_get_indexed_string(handle, 1, wstr, MAX_STR); - wprintf(L"Indexed String 1: %s\n", wstr); - - // Toggle LED (cmd 0x80). The first byte is the report number (0x0). - buf[0] = 0x0; - buf[1] = 0x80; - res = hid_write(handle, buf, 65); - - // Request state (cmd 0x81). The first byte is the report number (0x0). - buf[0] = 0x0; - buf[1] = 0x81; - res = hid_write(handle, buf, 65); - - // Read requested state - res = hid_read(handle, buf, 65); - - // Print out the returned buffer. - for (i = 0; i < 4; i++) - printf("buf[%d]: %d\n", i, buf[i]); - - // Finalize the hidapi library - res = hid_exit(); - - return 0; -} - -If you have your own simple test programs which communicate with standard -hardware development boards (such as those from Microchip, TI, Atmel, -FreeScale and others), please consider sending me something like the above -for inclusion into the HIDAPI source. This will help others who have the -same hardware as you do. - -License -======== -HIDAPI may be used by one of three licenses as outlined in LICENSE.txt. - -Download -========= -HIDAPI can be downloaded from github - git clone git://github.com/signal11/hidapi.git - -Build Instructions -=================== - -This section is long. Don't be put off by this. It's not long because it's -complicated to build HIDAPI; it's quite the opposite. This section is long -because of the flexibility of HIDAPI and the large number of ways in which -it can be built and used. You will likely pick a single build method. - -HIDAPI can be built in several different ways. If you elect to build a -shared library, you will need to build it from the HIDAPI source -distribution. If you choose instead to embed HIDAPI directly into your -application, you can skip the building and look at the provided platform -Makefiles for guidance. These platform Makefiles are located in linux/ -libusb/ mac/ and windows/ and are called Makefile-manual. In addition, -Visual Studio projects are provided. Even if you're going to embed HIDAPI -into your project, it is still beneficial to build the example programs. - - -Prerequisites: ---------------- - - Linux: - ------- - On Linux, you will need to install development packages for libudev, - libusb and optionally Fox-toolkit (for the test GUI). On - Debian/Ubuntu systems these can be installed by running: - sudo apt-get install libudev-dev libusb-1.0-0-dev libfox-1.6-dev - - If you downloaded the source directly from the git repository (using - git clone), you'll need Autotools: - sudo apt-get install autotools-dev autoconf automake libtool - - FreeBSD: - --------- - On FreeBSD you will need to install GNU make, libiconv, and - optionally Fox-Toolkit (for the test GUI). This is done by running - the following: - pkg_add -r gmake libiconv fox16 - - If you downloaded the source directly from the git repository (using - git clone), you'll need Autotools: - pkg_add -r autotools - - Mac: - ----- - On Mac, you will need to install Fox-Toolkit if you wish to build - the Test GUI. There are two ways to do this, and each has a slight - complication. Which method you use depends on your use case. - - If you wish to build the Test GUI just for your own testing on your - own computer, then the easiest method is to install Fox-Toolkit - using ports: - sudo port install fox - - If you wish to build the TestGUI app bundle to redistribute to - others, you will need to install Fox-toolkit from source. This is - because the version of fox that gets installed using ports uses the - ports X11 libraries which are not compatible with the Apple X11 - libraries. If you install Fox with ports and then try to distribute - your built app bundle, it will simply fail to run on other systems. - To install Fox-Toolkit manually, download the source package from - http://www.fox-toolkit.org, extract it, and run the following from - within the extracted source: - ./configure && make && make install - - Windows: - --------- - On Windows, if you want to build the test GUI, you will need to get - the hidapi-externals.zip package from the download site. This - contains pre-built binaries for Fox-toolkit. Extract - hidapi-externals.zip just outside of hidapi, so that - hidapi-externals and hidapi are on the same level, as shown: - - Parent_Folder - | - +hidapi - +hidapi-externals - - Again, this step is not required if you do not wish to build the - test GUI. - - -Building HIDAPI into a shared library on Unix Platforms: ---------------------------------------------------------- - -On Unix-like systems such as Linux, FreeBSD, Mac, and even Windows, using -Mingw or Cygwin, the easiest way to build a standard system-installed shared -library is to use the GNU Autotools build system. If you checked out the -source from the git repository, run the following: - - ./bootstrap - ./configure - make - make install <----- as root, or using sudo - -If you downloaded a source package (ie: if you did not run git clone), you -can skip the ./bootstrap step. - -./configure can take several arguments which control the build. The two most -likely to be used are: - --enable-testgui - Enable build of the Test GUI. This requires Fox toolkit to - be installed. Instructions for installing Fox-Toolkit on - each platform are in the Prerequisites section above. - - --prefix=/usr - Specify where you want the output headers and libraries to - be installed. The example above will put the headers in - /usr/include and the binaries in /usr/lib. The default is to - install into /usr/local which is fine on most systems. - -Building the manual way on Unix platforms: -------------------------------------------- - -Manual Makefiles are provided mostly to give the user and idea what it takes -to build a program which embeds HIDAPI directly inside of it. These should -really be used as examples only. If you want to build a system-wide shared -library, use the Autotools method described above. - - To build HIDAPI using the manual makefiles, change to the directory - of your platform and run make. For example, on Linux run: - cd linux/ - make -f Makefile-manual - - To build the Test GUI using the manual makefiles: - cd testgui/ - make -f Makefile-manual - -Building on Windows: ---------------------- - -To build the HIDAPI DLL on Windows using Visual Studio, build the .sln file -in the windows/ directory. - -To build the Test GUI on windows using Visual Studio, build the .sln file in -the testgui/ directory. - -To build HIDAPI using MinGW or Cygwin using Autotools, use the instructions -in the section titled "Building HIDAPI into a shared library on Unix -Platforms" above. Note that building the Test GUI with MinGW or Cygwin will -require the Windows procedure in the Prerequisites section above (ie: -hidapi-externals.zip). - -To build HIDAPI using MinGW using the Manual Makefiles, see the section -"Building the manual way on Unix platforms" above. - -HIDAPI can also be built using the Windows DDK (now also called the Windows -Driver Kit or WDK). This method was originally required for the HIDAPI build -but not anymore. However, some users still prefer this method. It is not as -well supported anymore but should still work. Patches are welcome if it does -not. To build using the DDK: - - 1. Install the Windows Driver Kit (WDK) from Microsoft. - 2. From the Start menu, in the Windows Driver Kits folder, select Build - Environments, then your operating system, then the x86 Free Build - Environment (or one that is appropriate for your system). - 3. From the console, change directory to the windows/ddk_build/ directory, - which is part of the HIDAPI distribution. - 4. Type build. - 5. You can find the output files (DLL and LIB) in a subdirectory created - by the build system which is appropriate for your environment. On - Windows XP, this directory is objfre_wxp_x86/i386. - -Cross Compiling -================ - -This section talks about cross compiling HIDAPI for Linux using autotools. -This is useful for using HIDAPI on embedded Linux targets. These -instructions assume the most raw kind of embedded Linux build, where all -prerequisites will need to be built first. This process will of course vary -based on your embedded Linux build system if you are using one, such as -OpenEmbedded or Buildroot. - -For the purpose of this section, it will be assumed that the following -environment variables are exported. - - $ export STAGING=$HOME/out - $ export HOST=arm-linux - -STAGING and HOST can be modified to suit your setup. - -Prerequisites --------------- - -Note that the build of libudev is the very basic configuration. - -Build Libusb. From the libusb source directory, run: - ./configure --host=$HOST --prefix=$STAGING - make - make install - -Build libudev. From the libudev source directory, run: - ./configure --disable-gudev --disable-introspection --disable-hwdb \ - --host=$HOST --prefix=$STAGING - make - make install - -Building HIDAPI ----------------- - -Build HIDAPI: - - PKG_CONFIG_DIR= \ - PKG_CONFIG_LIBDIR=$STAGING/lib/pkgconfig:$STAGING/share/pkgconfig \ - PKG_CONFIG_SYSROOT_DIR=$STAGING \ - ./configure --host=$HOST --prefix=$STAGING - - -Signal 11 Software - 2010-04-11 - 2010-07-28 - 2011-09-10 - 2012-05-01 - 2012-07-03 diff --git a/vendor/github.com/karalabe/hid/hidapi/hidapi/hidapi.h b/vendor/github.com/karalabe/hid/hidapi/hidapi/hidapi.h deleted file mode 100644 index e5bc2dc40a98..000000000000 --- a/vendor/github.com/karalabe/hid/hidapi/hidapi/hidapi.h +++ /dev/null @@ -1,391 +0,0 @@ -/******************************************************* - HIDAPI - Multi-Platform library for - communication with HID devices. - - Alan Ott - Signal 11 Software - - 8/22/2009 - - Copyright 2009, All Rights Reserved. - - At the discretion of the user of this library, - this software may be licensed under the terms of the - GNU General Public License v3, a BSD-Style license, or the - original HIDAPI license as outlined in the LICENSE.txt, - LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt - files located at the root of the source distribution. - These files may also be found in the public source - code repository located at: - http://github.com/signal11/hidapi . -********************************************************/ - -/** @file - * @defgroup API hidapi API - */ - -#ifndef HIDAPI_H__ -#define HIDAPI_H__ - -#include - -#ifdef _WIN32 - #define HID_API_EXPORT __declspec(dllexport) - #define HID_API_CALL -#else - #define HID_API_EXPORT /**< API export macro */ - #define HID_API_CALL /**< API call macro */ -#endif - -#define HID_API_EXPORT_CALL HID_API_EXPORT HID_API_CALL /**< API export and call macro*/ - -#ifdef __cplusplus -extern "C" { -#endif - struct hid_device_; - typedef struct hid_device_ hid_device; /**< opaque hidapi structure */ - - /** hidapi info structure */ - struct hid_device_info { - /** Platform-specific device path */ - char *path; - /** Device Vendor ID */ - unsigned short vendor_id; - /** Device Product ID */ - unsigned short product_id; - /** Serial Number */ - wchar_t *serial_number; - /** Device Release Number in binary-coded decimal, - also known as Device Version Number */ - unsigned short release_number; - /** Manufacturer String */ - wchar_t *manufacturer_string; - /** Product string */ - wchar_t *product_string; - /** Usage Page for this Device/Interface - (Windows/Mac only). */ - unsigned short usage_page; - /** Usage for this Device/Interface - (Windows/Mac only).*/ - unsigned short usage; - /** The USB interface which this logical device - represents. Valid on both Linux implementations - in all cases, and valid on the Windows implementation - only if the device contains more than one interface. */ - int interface_number; - - /** Pointer to the next device */ - struct hid_device_info *next; - }; - - - /** @brief Initialize the HIDAPI library. - - This function initializes the HIDAPI library. Calling it is not - strictly necessary, as it will be called automatically by - hid_enumerate() and any of the hid_open_*() functions if it is - needed. This function should be called at the beginning of - execution however, if there is a chance of HIDAPI handles - being opened by different threads simultaneously. - - @ingroup API - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_init(void); - - /** @brief Finalize the HIDAPI library. - - This function frees all of the static data associated with - HIDAPI. It should be called at the end of execution to avoid - memory leaks. - - @ingroup API - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_exit(void); - - /** @brief Enumerate the HID Devices. - - This function returns a linked list of all the HID devices - attached to the system which match vendor_id and product_id. - If @p vendor_id is set to 0 then any vendor matches. - If @p product_id is set to 0 then any product matches. - If @p vendor_id and @p product_id are both set to 0, then - all HID devices will be returned. - - @ingroup API - @param vendor_id The Vendor ID (VID) of the types of device - to open. - @param product_id The Product ID (PID) of the types of - device to open. - - @returns - This function returns a pointer to a linked list of type - struct #hid_device, containing information about the HID devices - attached to the system, or NULL in the case of failure. Free - this linked list by calling hid_free_enumeration(). - */ - struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id); - - /** @brief Free an enumeration Linked List - - This function frees a linked list created by hid_enumerate(). - - @ingroup API - @param devs Pointer to a list of struct_device returned from - hid_enumerate(). - */ - void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs); - - /** @brief Open a HID device using a Vendor ID (VID), Product ID - (PID) and optionally a serial number. - - If @p serial_number is NULL, the first device with the - specified VID and PID is opened. - - @ingroup API - @param vendor_id The Vendor ID (VID) of the device to open. - @param product_id The Product ID (PID) of the device to open. - @param serial_number The Serial Number of the device to open - (Optionally NULL). - - @returns - This function returns a pointer to a #hid_device object on - success or NULL on failure. - */ - HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number); - - /** @brief Open a HID device by its path name. - - The path name be determined by calling hid_enumerate(), or a - platform-specific path name can be used (eg: /dev/hidraw0 on - Linux). - - @ingroup API - @param path The path name of the device to open - - @returns - This function returns a pointer to a #hid_device object on - success or NULL on failure. - */ - HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path); - - /** @brief Write an Output report to a HID device. - - The first byte of @p data[] must contain the Report ID. For - devices which only support a single report, this must be set - to 0x0. The remaining bytes contain the report data. Since - the Report ID is mandatory, calls to hid_write() will always - contain one more byte than the report contains. For example, - if a hid report is 16 bytes long, 17 bytes must be passed to - hid_write(), the Report ID (or 0x0, for devices with a - single report), followed by the report data (16 bytes). In - this example, the length passed in would be 17. - - hid_write() will send the data on the first OUT endpoint, if - one exists. If it does not, it will send the data through - the Control Endpoint (Endpoint 0). - - @ingroup API - @param device A device handle returned from hid_open(). - @param data The data to send, including the report number as - the first byte. - @param length The length in bytes of the data to send. - - @returns - This function returns the actual number of bytes written and - -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_write(hid_device *device, const unsigned char *data, size_t length); - - /** @brief Read an Input report from a HID device with timeout. - - Input reports are returned - to the host through the INTERRUPT IN endpoint. The first byte will - contain the Report number if the device uses numbered reports. - - @ingroup API - @param device A device handle returned from hid_open(). - @param data A buffer to put the read data into. - @param length The number of bytes to read. For devices with - multiple reports, make sure to read an extra byte for - the report number. - @param milliseconds timeout in milliseconds or -1 for blocking wait. - - @returns - This function returns the actual number of bytes read and - -1 on error. If no packet was available to be read within - the timeout period, this function returns 0. - */ - int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds); - - /** @brief Read an Input report from a HID device. - - Input reports are returned - to the host through the INTERRUPT IN endpoint. The first byte will - contain the Report number if the device uses numbered reports. - - @ingroup API - @param device A device handle returned from hid_open(). - @param data A buffer to put the read data into. - @param length The number of bytes to read. For devices with - multiple reports, make sure to read an extra byte for - the report number. - - @returns - This function returns the actual number of bytes read and - -1 on error. If no packet was available to be read and - the handle is in non-blocking mode, this function returns 0. - */ - int HID_API_EXPORT HID_API_CALL hid_read(hid_device *device, unsigned char *data, size_t length); - - /** @brief Set the device handle to be non-blocking. - - In non-blocking mode calls to hid_read() will return - immediately with a value of 0 if there is no data to be - read. In blocking mode, hid_read() will wait (block) until - there is data to read before returning. - - Nonblocking can be turned on and off at any time. - - @ingroup API - @param device A device handle returned from hid_open(). - @param nonblock enable or not the nonblocking reads - - 1 to enable nonblocking - - 0 to disable nonblocking. - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *device, int nonblock); - - /** @brief Send a Feature report to the device. - - Feature reports are sent over the Control endpoint as a - Set_Report transfer. The first byte of @p data[] must - contain the Report ID. For devices which only support a - single report, this must be set to 0x0. The remaining bytes - contain the report data. Since the Report ID is mandatory, - calls to hid_send_feature_report() will always contain one - more byte than the report contains. For example, if a hid - report is 16 bytes long, 17 bytes must be passed to - hid_send_feature_report(): the Report ID (or 0x0, for - devices which do not use numbered reports), followed by the - report data (16 bytes). In this example, the length passed - in would be 17. - - @ingroup API - @param device A device handle returned from hid_open(). - @param data The data to send, including the report number as - the first byte. - @param length The length in bytes of the data to send, including - the report number. - - @returns - This function returns the actual number of bytes written and - -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *device, const unsigned char *data, size_t length); - - /** @brief Get a feature report from a HID device. - - Set the first byte of @p data[] to the Report ID of the - report to be read. Make sure to allow space for this - extra byte in @p data[]. Upon return, the first byte will - still contain the Report ID, and the report data will - start in data[1]. - - @ingroup API - @param device A device handle returned from hid_open(). - @param data A buffer to put the read data into, including - the Report ID. Set the first byte of @p data[] to the - Report ID of the report to be read, or set it to zero - if your device does not use numbered reports. - @param length The number of bytes to read, including an - extra byte for the report ID. The buffer can be longer - than the actual report. - - @returns - This function returns the number of bytes read plus - one for the report ID (which is still in the first - byte), or -1 on error. - */ - int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *device, unsigned char *data, size_t length); - - /** @brief Close a HID device. - - @ingroup API - @param device A device handle returned from hid_open(). - */ - void HID_API_EXPORT HID_API_CALL hid_close(hid_device *device); - - /** @brief Get The Manufacturer String from a HID device. - - @ingroup API - @param device A device handle returned from hid_open(). - @param string A wide string buffer to put the data into. - @param maxlen The length of the buffer in multiples of wchar_t. - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *device, wchar_t *string, size_t maxlen); - - /** @brief Get The Product String from a HID device. - - @ingroup API - @param device A device handle returned from hid_open(). - @param string A wide string buffer to put the data into. - @param maxlen The length of the buffer in multiples of wchar_t. - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT_CALL hid_get_product_string(hid_device *device, wchar_t *string, size_t maxlen); - - /** @brief Get The Serial Number String from a HID device. - - @ingroup API - @param device A device handle returned from hid_open(). - @param string A wide string buffer to put the data into. - @param maxlen The length of the buffer in multiples of wchar_t. - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *device, wchar_t *string, size_t maxlen); - - /** @brief Get a string from a HID device, based on its string index. - - @ingroup API - @param device A device handle returned from hid_open(). - @param string_index The index of the string to get. - @param string A wide string buffer to put the data into. - @param maxlen The length of the buffer in multiples of wchar_t. - - @returns - This function returns 0 on success and -1 on error. - */ - int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *device, int string_index, wchar_t *string, size_t maxlen); - - /** @brief Get a string describing the last error which occurred. - - @ingroup API - @param device A device handle returned from hid_open(). - - @returns - This function returns a string containing the last error - which occurred or NULL if none has occurred. - */ - HID_API_EXPORT const wchar_t* HID_API_CALL hid_error(hid_device *device); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/vendor/github.com/karalabe/hid/hidapi/libusb/hid.c b/vendor/github.com/karalabe/hid/hidapi/libusb/hid.c deleted file mode 100644 index 474dff41c1c5..000000000000 --- a/vendor/github.com/karalabe/hid/hidapi/libusb/hid.c +++ /dev/null @@ -1,1512 +0,0 @@ -/******************************************************* - HIDAPI - Multi-Platform library for - communication with HID devices. - - Alan Ott - Signal 11 Software - - 8/22/2009 - Linux Version - 6/2/2010 - Libusb Version - 8/13/2010 - FreeBSD Version - 11/1/2011 - - Copyright 2009, All Rights Reserved. - - At the discretion of the user of this library, - this software may be licensed under the terms of the - GNU General Public License v3, a BSD-Style license, or the - original HIDAPI license as outlined in the LICENSE.txt, - LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt - files located at the root of the source distribution. - These files may also be found in the public source - code repository located at: - http://github.com/signal11/hidapi . -********************************************************/ - -/* C */ -#include -#include -#include -#include -#include -#include - -/* Unix */ -#include -#include -#include -#include -#include -#include -#include -#include - -/* GNU / LibUSB */ -#include -#ifndef __ANDROID__ -#include -#endif - -#include "hidapi.h" - -#ifdef __ANDROID__ - -/* Barrier implementation because Android/Bionic don't have pthread_barrier. - This implementation came from Brent Priddy and was posted on - StackOverflow. It is used with his permission. */ -typedef int pthread_barrierattr_t; -typedef struct pthread_barrier { - pthread_mutex_t mutex; - pthread_cond_t cond; - int count; - int trip_count; -} pthread_barrier_t; - -static int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count) -{ - if(count == 0) { - errno = EINVAL; - return -1; - } - - if(pthread_mutex_init(&barrier->mutex, 0) < 0) { - return -1; - } - if(pthread_cond_init(&barrier->cond, 0) < 0) { - pthread_mutex_destroy(&barrier->mutex); - return -1; - } - barrier->trip_count = count; - barrier->count = 0; - - return 0; -} - -static int pthread_barrier_destroy(pthread_barrier_t *barrier) -{ - pthread_cond_destroy(&barrier->cond); - pthread_mutex_destroy(&barrier->mutex); - return 0; -} - -static int pthread_barrier_wait(pthread_barrier_t *barrier) -{ - pthread_mutex_lock(&barrier->mutex); - ++(barrier->count); - if(barrier->count >= barrier->trip_count) - { - barrier->count = 0; - pthread_cond_broadcast(&barrier->cond); - pthread_mutex_unlock(&barrier->mutex); - return 1; - } - else - { - pthread_cond_wait(&barrier->cond, &(barrier->mutex)); - pthread_mutex_unlock(&barrier->mutex); - return 0; - } -} - -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef DEBUG_PRINTF -#define LOG(...) fprintf(stderr, __VA_ARGS__) -#else -#define LOG(...) do {} while (0) -#endif - -#ifndef __FreeBSD__ -#define DETACH_KERNEL_DRIVER -#endif - -/* Uncomment to enable the retrieval of Usage and Usage Page in -hid_enumerate(). Warning, on platforms different from FreeBSD -this is very invasive as it requires the detach -and re-attach of the kernel driver. See comments inside hid_enumerate(). -libusb HIDAPI programs are encouraged to use the interface number -instead to differentiate between interfaces on a composite HID device. */ -/*#define INVASIVE_GET_USAGE*/ - -/* Linked List of input reports received from the device. */ -struct input_report { - uint8_t *data; - size_t len; - struct input_report *next; -}; - - -struct hid_device_ { - /* Handle to the actual device. */ - libusb_device_handle *device_handle; - - /* Endpoint information */ - int input_endpoint; - int output_endpoint; - int input_ep_max_packet_size; - - /* The interface number of the HID */ - int interface; - - /* Indexes of Strings */ - int manufacturer_index; - int product_index; - int serial_index; - - /* Whether blocking reads are used */ - int blocking; /* boolean */ - - /* Read thread objects */ - pthread_t thread; - pthread_mutex_t mutex; /* Protects input_reports */ - pthread_cond_t condition; - pthread_barrier_t barrier; /* Ensures correct startup sequence */ - int shutdown_thread; - int cancelled; - struct libusb_transfer *transfer; - - /* List of received input reports. */ - struct input_report *input_reports; -}; - -static libusb_context *usb_context = NULL; - -uint16_t get_usb_code_for_current_locale(void); -static int return_data(hid_device *dev, unsigned char *data, size_t length); - -static hid_device *new_hid_device(void) -{ - hid_device *dev = calloc(1, sizeof(hid_device)); - dev->blocking = 1; - - pthread_mutex_init(&dev->mutex, NULL); - pthread_cond_init(&dev->condition, NULL); - pthread_barrier_init(&dev->barrier, NULL, 2); - - return dev; -} - -static void free_hid_device(hid_device *dev) -{ - /* Clean up the thread objects */ - pthread_barrier_destroy(&dev->barrier); - pthread_cond_destroy(&dev->condition); - pthread_mutex_destroy(&dev->mutex); - - /* Free the device itself */ - free(dev); -} - -#if 0 -/*TODO: Implement this funciton on hidapi/libusb.. */ -static void register_error(hid_device *device, const char *op) -{ - -} -#endif - -#ifdef INVASIVE_GET_USAGE -/* Get bytes from a HID Report Descriptor. - Only call with a num_bytes of 0, 1, 2, or 4. */ -static uint32_t get_bytes(uint8_t *rpt, size_t len, size_t num_bytes, size_t cur) -{ - /* Return if there aren't enough bytes. */ - if (cur + num_bytes >= len) - return 0; - - if (num_bytes == 0) - return 0; - else if (num_bytes == 1) { - return rpt[cur+1]; - } - else if (num_bytes == 2) { - return (rpt[cur+2] * 256 + rpt[cur+1]); - } - else if (num_bytes == 4) { - return (rpt[cur+4] * 0x01000000 + - rpt[cur+3] * 0x00010000 + - rpt[cur+2] * 0x00000100 + - rpt[cur+1] * 0x00000001); - } - else - return 0; -} - -/* Retrieves the device's Usage Page and Usage from the report - descriptor. The algorithm is simple, as it just returns the first - Usage and Usage Page that it finds in the descriptor. - The return value is 0 on success and -1 on failure. */ -static int get_usage(uint8_t *report_descriptor, size_t size, - unsigned short *usage_page, unsigned short *usage) -{ - unsigned int i = 0; - int size_code; - int data_len, key_size; - int usage_found = 0, usage_page_found = 0; - - while (i < size) { - int key = report_descriptor[i]; - int key_cmd = key & 0xfc; - - //printf("key: %02hhx\n", key); - - if ((key & 0xf0) == 0xf0) { - /* This is a Long Item. The next byte contains the - length of the data section (value) for this key. - See the HID specification, version 1.11, section - 6.2.2.3, titled "Long Items." */ - if (i+1 < size) - data_len = report_descriptor[i+1]; - else - data_len = 0; /* malformed report */ - key_size = 3; - } - else { - /* This is a Short Item. The bottom two bits of the - key contain the size code for the data section - (value) for this key. Refer to the HID - specification, version 1.11, section 6.2.2.2, - titled "Short Items." */ - size_code = key & 0x3; - switch (size_code) { - case 0: - case 1: - case 2: - data_len = size_code; - break; - case 3: - data_len = 4; - break; - default: - /* Can't ever happen since size_code is & 0x3 */ - data_len = 0; - break; - }; - key_size = 1; - } - - if (key_cmd == 0x4) { - *usage_page = get_bytes(report_descriptor, size, data_len, i); - usage_page_found = 1; - //printf("Usage Page: %x\n", (uint32_t)*usage_page); - } - if (key_cmd == 0x8) { - *usage = get_bytes(report_descriptor, size, data_len, i); - usage_found = 1; - //printf("Usage: %x\n", (uint32_t)*usage); - } - - if (usage_page_found && usage_found) - return 0; /* success */ - - /* Skip over this key and it's associated data */ - i += data_len + key_size; - } - - return -1; /* failure */ -} -#endif /* INVASIVE_GET_USAGE */ - -#if defined(__FreeBSD__) && __FreeBSD__ < 10 -/* The libusb version included in FreeBSD < 10 doesn't have this function. In - mainline libusb, it's inlined in libusb.h. This function will bear a striking - resemblance to that one, because there's about one way to code it. - - Note that the data parameter is Unicode in UTF-16LE encoding. - Return value is the number of bytes in data, or LIBUSB_ERROR_*. - */ -static inline int libusb_get_string_descriptor(libusb_device_handle *dev, - uint8_t descriptor_index, uint16_t lang_id, - unsigned char *data, int length) -{ - return libusb_control_transfer(dev, - LIBUSB_ENDPOINT_IN | 0x0, /* Endpoint 0 IN */ - LIBUSB_REQUEST_GET_DESCRIPTOR, - (LIBUSB_DT_STRING << 8) | descriptor_index, - lang_id, data, (uint16_t) length, 1000); -} - -#endif - - -/* Get the first language the device says it reports. This comes from - USB string #0. */ -static uint16_t get_first_language(libusb_device_handle *dev) -{ - uint16_t buf[32]; - int len; - - /* Get the string from libusb. */ - len = libusb_get_string_descriptor(dev, - 0x0, /* String ID */ - 0x0, /* Language */ - (unsigned char*)buf, - sizeof(buf)); - if (len < 4) - return 0x0; - - return buf[1]; /* First two bytes are len and descriptor type. */ -} - -static int is_language_supported(libusb_device_handle *dev, uint16_t lang) -{ - uint16_t buf[32]; - int len; - int i; - - /* Get the string from libusb. */ - len = libusb_get_string_descriptor(dev, - 0x0, /* String ID */ - 0x0, /* Language */ - (unsigned char*)buf, - sizeof(buf)); - if (len < 4) - return 0x0; - - - len /= 2; /* language IDs are two-bytes each. */ - /* Start at index 1 because there are two bytes of protocol data. */ - for (i = 1; i < len; i++) { - if (buf[i] == lang) - return 1; - } - - return 0; -} - - -/* This function returns a newly allocated wide string containing the USB - device string numbered by the index. The returned string must be freed - by using free(). */ -static wchar_t *get_usb_string(libusb_device_handle *dev, uint8_t idx) -{ - char buf[512]; - int len; - wchar_t *str = NULL; - -#ifndef __ANDROID__ /* we don't use iconv on Android */ - wchar_t wbuf[256]; - /* iconv variables */ - iconv_t ic; - size_t inbytes; - size_t outbytes; - size_t res; -#ifdef __FreeBSD__ - const char *inptr; -#else - char *inptr; -#endif - char *outptr; -#endif - - /* Determine which language to use. */ - uint16_t lang; - lang = get_usb_code_for_current_locale(); - if (!is_language_supported(dev, lang)) - lang = get_first_language(dev); - - /* Get the string from libusb. */ - len = libusb_get_string_descriptor(dev, - idx, - lang, - (unsigned char*)buf, - sizeof(buf)); - if (len < 0) - return NULL; - -#ifdef __ANDROID__ - - /* Bionic does not have iconv support nor wcsdup() function, so it - has to be done manually. The following code will only work for - code points that can be represented as a single UTF-16 character, - and will incorrectly convert any code points which require more - than one UTF-16 character. - - Skip over the first character (2-bytes). */ - len -= 2; - str = malloc((len / 2 + 1) * sizeof(wchar_t)); - int i; - for (i = 0; i < len / 2; i++) { - str[i] = buf[i * 2 + 2] | (buf[i * 2 + 3] << 8); - } - str[len / 2] = 0x00000000; - -#else - - /* buf does not need to be explicitly NULL-terminated because - it is only passed into iconv() which does not need it. */ - - /* Initialize iconv. */ - ic = iconv_open("WCHAR_T", "UTF-16LE"); - if (ic == (iconv_t)-1) { - LOG("iconv_open() failed\n"); - return NULL; - } - - /* Convert to native wchar_t (UTF-32 on glibc/BSD systems). - Skip the first character (2-bytes). */ - inptr = buf+2; - inbytes = len-2; - outptr = (char*) wbuf; - outbytes = sizeof(wbuf); - res = iconv(ic, &inptr, &inbytes, &outptr, &outbytes); - if (res == (size_t)-1) { - LOG("iconv() failed\n"); - goto err; - } - - /* Write the terminating NULL. */ - wbuf[sizeof(wbuf)/sizeof(wbuf[0])-1] = 0x00000000; - if (outbytes >= sizeof(wbuf[0])) - *((wchar_t*)outptr) = 0x00000000; - - /* Allocate and copy the string. */ - str = wcsdup(wbuf); - -err: - iconv_close(ic); - -#endif - - return str; -} - -static char *make_path(libusb_device *dev, int interface_number) -{ - char str[64]; - snprintf(str, sizeof(str), "%04x:%04x:%02x", - libusb_get_bus_number(dev), - libusb_get_device_address(dev), - interface_number); - str[sizeof(str)-1] = '\0'; - - return strdup(str); -} - - -int HID_API_EXPORT hid_init(void) -{ - if (!usb_context) { - const char *locale; - - /* Init Libusb */ - if (libusb_init(&usb_context)) - return -1; - - /* Set the locale if it's not set. */ - locale = setlocale(LC_CTYPE, NULL); - if (!locale) - setlocale(LC_CTYPE, ""); - } - - return 0; -} - -int HID_API_EXPORT hid_exit(void) -{ - if (usb_context) { - libusb_exit(usb_context); - usb_context = NULL; - } - - return 0; -} - -struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) -{ - libusb_device **devs; - libusb_device *dev; - libusb_device_handle *handle; - ssize_t num_devs; - int i = 0; - - struct hid_device_info *root = NULL; /* return object */ - struct hid_device_info *cur_dev = NULL; - - if(hid_init() < 0) - return NULL; - - num_devs = libusb_get_device_list(usb_context, &devs); - if (num_devs < 0) - return NULL; - while ((dev = devs[i++]) != NULL) { - struct libusb_device_descriptor desc; - struct libusb_config_descriptor *conf_desc = NULL; - int j, k; - int interface_num = 0; - - int res = libusb_get_device_descriptor(dev, &desc); - unsigned short dev_vid = desc.idVendor; - unsigned short dev_pid = desc.idProduct; - - res = libusb_get_active_config_descriptor(dev, &conf_desc); - if (res < 0) - libusb_get_config_descriptor(dev, 0, &conf_desc); - if (conf_desc) { - for (j = 0; j < conf_desc->bNumInterfaces; j++) { - const struct libusb_interface *intf = &conf_desc->interface[j]; - for (k = 0; k < intf->num_altsetting; k++) { - const struct libusb_interface_descriptor *intf_desc; - intf_desc = &intf->altsetting[k]; - if (intf_desc->bInterfaceClass == LIBUSB_CLASS_HID) { - interface_num = intf_desc->bInterfaceNumber; - - /* Check the VID/PID against the arguments */ - if ((vendor_id == 0x0 || vendor_id == dev_vid) && - (product_id == 0x0 || product_id == dev_pid)) { - struct hid_device_info *tmp; - - /* VID/PID match. Create the record. */ - tmp = calloc(1, sizeof(struct hid_device_info)); - if (cur_dev) { - cur_dev->next = tmp; - } - else { - root = tmp; - } - cur_dev = tmp; - - /* Fill out the record */ - cur_dev->next = NULL; - cur_dev->path = make_path(dev, interface_num); - - res = libusb_open(dev, &handle); - - if (res >= 0) { - /* Serial Number */ - if (desc.iSerialNumber > 0) - cur_dev->serial_number = - get_usb_string(handle, desc.iSerialNumber); - - /* Manufacturer and Product strings */ - if (desc.iManufacturer > 0) - cur_dev->manufacturer_string = - get_usb_string(handle, desc.iManufacturer); - if (desc.iProduct > 0) - cur_dev->product_string = - get_usb_string(handle, desc.iProduct); - -#ifdef INVASIVE_GET_USAGE -{ - /* - This section is removed because it is too - invasive on the system. Getting a Usage Page - and Usage requires parsing the HID Report - descriptor. Getting a HID Report descriptor - involves claiming the interface. Claiming the - interface involves detaching the kernel driver. - Detaching the kernel driver is hard on the system - because it will unclaim interfaces (if another - app has them claimed) and the re-attachment of - the driver will sometimes change /dev entry names. - It is for these reasons that this section is - #if 0. For composite devices, use the interface - field in the hid_device_info struct to distinguish - between interfaces. */ - unsigned char data[256]; -#ifdef DETACH_KERNEL_DRIVER - int detached = 0; - /* Usage Page and Usage */ - res = libusb_kernel_driver_active(handle, interface_num); - if (res == 1) { - res = libusb_detach_kernel_driver(handle, interface_num); - if (res < 0) - LOG("Couldn't detach kernel driver, even though a kernel driver was attached."); - else - detached = 1; - } -#endif - res = libusb_claim_interface(handle, interface_num); - if (res >= 0) { - /* Get the HID Report Descriptor. */ - res = libusb_control_transfer(handle, LIBUSB_ENDPOINT_IN|LIBUSB_RECIPIENT_INTERFACE, LIBUSB_REQUEST_GET_DESCRIPTOR, (LIBUSB_DT_REPORT << 8)|interface_num, 0, data, sizeof(data), 5000); - if (res >= 0) { - unsigned short page=0, usage=0; - /* Parse the usage and usage page - out of the report descriptor. */ - get_usage(data, res, &page, &usage); - cur_dev->usage_page = page; - cur_dev->usage = usage; - } - else - LOG("libusb_control_transfer() for getting the HID report failed with %d\n", res); - - /* Release the interface */ - res = libusb_release_interface(handle, interface_num); - if (res < 0) - LOG("Can't release the interface.\n"); - } - else - LOG("Can't claim interface %d\n", res); -#ifdef DETACH_KERNEL_DRIVER - /* Re-attach kernel driver if necessary. */ - if (detached) { - res = libusb_attach_kernel_driver(handle, interface_num); - if (res < 0) - LOG("Couldn't re-attach kernel driver.\n"); - } -#endif -} -#endif /* INVASIVE_GET_USAGE */ - - libusb_close(handle); - } - /* VID/PID */ - cur_dev->vendor_id = dev_vid; - cur_dev->product_id = dev_pid; - - /* Release Number */ - cur_dev->release_number = desc.bcdDevice; - - /* Interface Number */ - cur_dev->interface_number = interface_num; - } - } - } /* altsettings */ - } /* interfaces */ - libusb_free_config_descriptor(conf_desc); - } - } - - libusb_free_device_list(devs, 1); - - return root; -} - -void HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs) -{ - struct hid_device_info *d = devs; - while (d) { - struct hid_device_info *next = d->next; - free(d->path); - free(d->serial_number); - free(d->manufacturer_string); - free(d->product_string); - free(d); - d = next; - } -} - -hid_device * hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) -{ - struct hid_device_info *devs, *cur_dev; - const char *path_to_open = NULL; - hid_device *handle = NULL; - - devs = hid_enumerate(vendor_id, product_id); - cur_dev = devs; - while (cur_dev) { - if (cur_dev->vendor_id == vendor_id && - cur_dev->product_id == product_id) { - if (serial_number) { - if (cur_dev->serial_number && - wcscmp(serial_number, cur_dev->serial_number) == 0) { - path_to_open = cur_dev->path; - break; - } - } - else { - path_to_open = cur_dev->path; - break; - } - } - cur_dev = cur_dev->next; - } - - if (path_to_open) { - /* Open the device */ - handle = hid_open_path(path_to_open); - } - - hid_free_enumeration(devs); - - return handle; -} - -static void read_callback(struct libusb_transfer *transfer) -{ - hid_device *dev = transfer->user_data; - int res; - - if (transfer->status == LIBUSB_TRANSFER_COMPLETED) { - - struct input_report *rpt = malloc(sizeof(*rpt)); - rpt->data = malloc(transfer->actual_length); - memcpy(rpt->data, transfer->buffer, transfer->actual_length); - rpt->len = transfer->actual_length; - rpt->next = NULL; - - pthread_mutex_lock(&dev->mutex); - - /* Attach the new report object to the end of the list. */ - if (dev->input_reports == NULL) { - /* The list is empty. Put it at the root. */ - dev->input_reports = rpt; - pthread_cond_signal(&dev->condition); - } - else { - /* Find the end of the list and attach. */ - struct input_report *cur = dev->input_reports; - int num_queued = 0; - while (cur->next != NULL) { - cur = cur->next; - num_queued++; - } - cur->next = rpt; - - /* Pop one off if we've reached 30 in the queue. This - way we don't grow forever if the user never reads - anything from the device. */ - if (num_queued > 30) { - return_data(dev, NULL, 0); - } - } - pthread_mutex_unlock(&dev->mutex); - } - else if (transfer->status == LIBUSB_TRANSFER_CANCELLED) { - dev->shutdown_thread = 1; - dev->cancelled = 1; - return; - } - else if (transfer->status == LIBUSB_TRANSFER_NO_DEVICE) { - dev->shutdown_thread = 1; - dev->cancelled = 1; - return; - } - else if (transfer->status == LIBUSB_TRANSFER_TIMED_OUT) { - //LOG("Timeout (normal)\n"); - } - else { - LOG("Unknown transfer code: %d\n", transfer->status); - } - - /* Re-submit the transfer object. */ - res = libusb_submit_transfer(transfer); - if (res != 0) { - LOG("Unable to submit URB. libusb error code: %d\n", res); - dev->shutdown_thread = 1; - dev->cancelled = 1; - } -} - - -static void *read_thread(void *param) -{ - hid_device *dev = param; - unsigned char *buf; - const size_t length = dev->input_ep_max_packet_size; - - /* Set up the transfer object. */ - buf = malloc(length); - dev->transfer = libusb_alloc_transfer(0); - libusb_fill_interrupt_transfer(dev->transfer, - dev->device_handle, - dev->input_endpoint, - buf, - length, - read_callback, - dev, - 5000/*timeout*/); - - /* Make the first submission. Further submissions are made - from inside read_callback() */ - libusb_submit_transfer(dev->transfer); - - /* Notify the main thread that the read thread is up and running. */ - pthread_barrier_wait(&dev->barrier); - - /* Handle all the events. */ - while (!dev->shutdown_thread) { - int res; - res = libusb_handle_events(usb_context); - if (res < 0) { - /* There was an error. */ - LOG("read_thread(): libusb reports error # %d\n", res); - - /* Break out of this loop only on fatal error.*/ - if (res != LIBUSB_ERROR_BUSY && - res != LIBUSB_ERROR_TIMEOUT && - res != LIBUSB_ERROR_OVERFLOW && - res != LIBUSB_ERROR_INTERRUPTED) { - break; - } - } - } - - /* Cancel any transfer that may be pending. This call will fail - if no transfers are pending, but that's OK. */ - libusb_cancel_transfer(dev->transfer); - - while (!dev->cancelled) - libusb_handle_events_completed(usb_context, &dev->cancelled); - - /* Now that the read thread is stopping, Wake any threads which are - waiting on data (in hid_read_timeout()). Do this under a mutex to - make sure that a thread which is about to go to sleep waiting on - the condition actually will go to sleep before the condition is - signaled. */ - pthread_mutex_lock(&dev->mutex); - pthread_cond_broadcast(&dev->condition); - pthread_mutex_unlock(&dev->mutex); - - /* The dev->transfer->buffer and dev->transfer objects are cleaned up - in hid_close(). They are not cleaned up here because this thread - could end either due to a disconnect or due to a user - call to hid_close(). In both cases the objects can be safely - cleaned up after the call to pthread_join() (in hid_close()), but - since hid_close() calls libusb_cancel_transfer(), on these objects, - they can not be cleaned up here. */ - - return NULL; -} - - -hid_device * HID_API_EXPORT hid_open_path(const char *path) -{ - hid_device *dev = NULL; - - libusb_device **devs; - libusb_device *usb_dev; - int res; - int d = 0; - int good_open = 0; - - if(hid_init() < 0) - return NULL; - - dev = new_hid_device(); - - libusb_get_device_list(usb_context, &devs); - while ((usb_dev = devs[d++]) != NULL) { - struct libusb_device_descriptor desc; - struct libusb_config_descriptor *conf_desc = NULL; - int i,j,k; - libusb_get_device_descriptor(usb_dev, &desc); - - if (libusb_get_active_config_descriptor(usb_dev, &conf_desc) < 0) - continue; - for (j = 0; j < conf_desc->bNumInterfaces; j++) { - const struct libusb_interface *intf = &conf_desc->interface[j]; - for (k = 0; k < intf->num_altsetting; k++) { - const struct libusb_interface_descriptor *intf_desc; - intf_desc = &intf->altsetting[k]; - if (intf_desc->bInterfaceClass == LIBUSB_CLASS_HID) { - char *dev_path = make_path(usb_dev, intf_desc->bInterfaceNumber); - if (!strcmp(dev_path, path)) { - /* Matched Paths. Open this device */ - - /* OPEN HERE */ - res = libusb_open(usb_dev, &dev->device_handle); - if (res < 0) { - LOG("can't open device\n"); - free(dev_path); - break; - } - good_open = 1; -#ifdef DETACH_KERNEL_DRIVER - /* Detach the kernel driver, but only if the - device is managed by the kernel */ - if (libusb_kernel_driver_active(dev->device_handle, intf_desc->bInterfaceNumber) == 1) { - res = libusb_detach_kernel_driver(dev->device_handle, intf_desc->bInterfaceNumber); - if (res < 0) { - libusb_close(dev->device_handle); - LOG("Unable to detach Kernel Driver\n"); - free(dev_path); - good_open = 0; - break; - } - } -#endif - res = libusb_claim_interface(dev->device_handle, intf_desc->bInterfaceNumber); - if (res < 0) { - LOG("can't claim interface %d: %d\n", intf_desc->bInterfaceNumber, res); - free(dev_path); - libusb_close(dev->device_handle); - good_open = 0; - break; - } - - /* Store off the string descriptor indexes */ - dev->manufacturer_index = desc.iManufacturer; - dev->product_index = desc.iProduct; - dev->serial_index = desc.iSerialNumber; - - /* Store off the interface number */ - dev->interface = intf_desc->bInterfaceNumber; - - /* Find the INPUT and OUTPUT endpoints. An - OUTPUT endpoint is not required. */ - for (i = 0; i < intf_desc->bNumEndpoints; i++) { - const struct libusb_endpoint_descriptor *ep - = &intf_desc->endpoint[i]; - - /* Determine the type and direction of this - endpoint. */ - int is_interrupt = - (ep->bmAttributes & LIBUSB_TRANSFER_TYPE_MASK) - == LIBUSB_TRANSFER_TYPE_INTERRUPT; - int is_output = - (ep->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) - == LIBUSB_ENDPOINT_OUT; - int is_input = - (ep->bEndpointAddress & LIBUSB_ENDPOINT_DIR_MASK) - == LIBUSB_ENDPOINT_IN; - - /* Decide whether to use it for input or output. */ - if (dev->input_endpoint == 0 && - is_interrupt && is_input) { - /* Use this endpoint for INPUT */ - dev->input_endpoint = ep->bEndpointAddress; - dev->input_ep_max_packet_size = ep->wMaxPacketSize; - } - if (dev->output_endpoint == 0 && - is_interrupt && is_output) { - /* Use this endpoint for OUTPUT */ - dev->output_endpoint = ep->bEndpointAddress; - } - } - - pthread_create(&dev->thread, NULL, read_thread, dev); - - /* Wait here for the read thread to be initialized. */ - pthread_barrier_wait(&dev->barrier); - - } - free(dev_path); - } - } - } - libusb_free_config_descriptor(conf_desc); - - } - - libusb_free_device_list(devs, 1); - - /* If we have a good handle, return it. */ - if (good_open) { - return dev; - } - else { - /* Unable to open any devices. */ - free_hid_device(dev); - return NULL; - } -} - - -int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length) -{ - int res; - int report_number = data[0]; - int skipped_report_id = 0; - - if (report_number == 0x0) { - data++; - length--; - skipped_report_id = 1; - } - - - if (dev->output_endpoint <= 0) { - /* No interrupt out endpoint. Use the Control Endpoint */ - res = libusb_control_transfer(dev->device_handle, - LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_OUT, - 0x09/*HID Set_Report*/, - (2/*HID output*/ << 8) | report_number, - dev->interface, - (unsigned char *)data, length, - 1000/*timeout millis*/); - - if (res < 0) - return -1; - - if (skipped_report_id) - length++; - - return length; - } - else { - /* Use the interrupt out endpoint */ - int actual_length; - res = libusb_interrupt_transfer(dev->device_handle, - dev->output_endpoint, - (unsigned char*)data, - length, - &actual_length, 1000); - - if (res < 0) - return -1; - - if (skipped_report_id) - actual_length++; - - return actual_length; - } -} - -/* Helper function, to simplify hid_read(). - This should be called with dev->mutex locked. */ -static int return_data(hid_device *dev, unsigned char *data, size_t length) -{ - /* Copy the data out of the linked list item (rpt) into the - return buffer (data), and delete the liked list item. */ - struct input_report *rpt = dev->input_reports; - size_t len = (length < rpt->len)? length: rpt->len; - if (len > 0) - memcpy(data, rpt->data, len); - dev->input_reports = rpt->next; - free(rpt->data); - free(rpt); - return len; -} - -static void cleanup_mutex(void *param) -{ - hid_device *dev = param; - pthread_mutex_unlock(&dev->mutex); -} - - -int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) -{ - int bytes_read = -1; - -#if 0 - int transferred; - int res = libusb_interrupt_transfer(dev->device_handle, dev->input_endpoint, data, length, &transferred, 5000); - LOG("transferred: %d\n", transferred); - return transferred; -#endif - - pthread_mutex_lock(&dev->mutex); - pthread_cleanup_push(&cleanup_mutex, dev); - - /* There's an input report queued up. Return it. */ - if (dev->input_reports) { - /* Return the first one */ - bytes_read = return_data(dev, data, length); - goto ret; - } - - if (dev->shutdown_thread) { - /* This means the device has been disconnected. - An error code of -1 should be returned. */ - bytes_read = -1; - goto ret; - } - - if (milliseconds == -1) { - /* Blocking */ - while (!dev->input_reports && !dev->shutdown_thread) { - pthread_cond_wait(&dev->condition, &dev->mutex); - } - if (dev->input_reports) { - bytes_read = return_data(dev, data, length); - } - } - else if (milliseconds > 0) { - /* Non-blocking, but called with timeout. */ - int res; - struct timespec ts; - clock_gettime(CLOCK_REALTIME, &ts); - ts.tv_sec += milliseconds / 1000; - ts.tv_nsec += (milliseconds % 1000) * 1000000; - if (ts.tv_nsec >= 1000000000L) { - ts.tv_sec++; - ts.tv_nsec -= 1000000000L; - } - - while (!dev->input_reports && !dev->shutdown_thread) { - res = pthread_cond_timedwait(&dev->condition, &dev->mutex, &ts); - if (res == 0) { - if (dev->input_reports) { - bytes_read = return_data(dev, data, length); - break; - } - - /* If we're here, there was a spurious wake up - or the read thread was shutdown. Run the - loop again (ie: don't break). */ - } - else if (res == ETIMEDOUT) { - /* Timed out. */ - bytes_read = 0; - break; - } - else { - /* Error. */ - bytes_read = -1; - break; - } - } - } - else { - /* Purely non-blocking */ - bytes_read = 0; - } - -ret: - pthread_mutex_unlock(&dev->mutex); - pthread_cleanup_pop(0); - - return bytes_read; -} - -int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) -{ - return hid_read_timeout(dev, data, length, dev->blocking ? -1 : 0); -} - -int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) -{ - dev->blocking = !nonblock; - - return 0; -} - - -int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) -{ - int res = -1; - int skipped_report_id = 0; - int report_number = data[0]; - - if (report_number == 0x0) { - data++; - length--; - skipped_report_id = 1; - } - - res = libusb_control_transfer(dev->device_handle, - LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_OUT, - 0x09/*HID set_report*/, - (3/*HID feature*/ << 8) | report_number, - dev->interface, - (unsigned char *)data, length, - 1000/*timeout millis*/); - - if (res < 0) - return -1; - - /* Account for the report ID */ - if (skipped_report_id) - length++; - - return length; -} - -int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) -{ - int res = -1; - int skipped_report_id = 0; - int report_number = data[0]; - - if (report_number == 0x0) { - /* Offset the return buffer by 1, so that the report ID - will remain in byte 0. */ - data++; - length--; - skipped_report_id = 1; - } - res = libusb_control_transfer(dev->device_handle, - LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE|LIBUSB_ENDPOINT_IN, - 0x01/*HID get_report*/, - (3/*HID feature*/ << 8) | report_number, - dev->interface, - (unsigned char *)data, length, - 1000/*timeout millis*/); - - if (res < 0) - return -1; - - if (skipped_report_id) - res++; - - return res; -} - - -void HID_API_EXPORT hid_close(hid_device *dev) -{ - if (!dev) - return; - - /* Cause read_thread() to stop. */ - dev->shutdown_thread = 1; - libusb_cancel_transfer(dev->transfer); - - /* Wait for read_thread() to end. */ - pthread_join(dev->thread, NULL); - - /* Clean up the Transfer objects allocated in read_thread(). */ - free(dev->transfer->buffer); - libusb_free_transfer(dev->transfer); - - /* release the interface */ - libusb_release_interface(dev->device_handle, dev->interface); - - /* Close the handle */ - libusb_close(dev->device_handle); - - /* Clear out the queue of received reports. */ - pthread_mutex_lock(&dev->mutex); - while (dev->input_reports) { - return_data(dev, NULL, 0); - } - pthread_mutex_unlock(&dev->mutex); - - free_hid_device(dev); -} - - -int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - return hid_get_indexed_string(dev, dev->manufacturer_index, string, maxlen); -} - -int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - return hid_get_indexed_string(dev, dev->product_index, string, maxlen); -} - -int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - return hid_get_indexed_string(dev, dev->serial_index, string, maxlen); -} - -int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) -{ - wchar_t *str; - - str = get_usb_string(dev->device_handle, string_index); - if (str) { - wcsncpy(string, str, maxlen); - string[maxlen-1] = L'\0'; - free(str); - return 0; - } - else - return -1; -} - - -HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) -{ - return NULL; -} - - -struct lang_map_entry { - const char *name; - const char *string_code; - uint16_t usb_code; -}; - -#define LANG(name,code,usb_code) { name, code, usb_code } -static struct lang_map_entry lang_map[] = { - LANG("Afrikaans", "af", 0x0436), - LANG("Albanian", "sq", 0x041C), - LANG("Arabic - United Arab Emirates", "ar_ae", 0x3801), - LANG("Arabic - Bahrain", "ar_bh", 0x3C01), - LANG("Arabic - Algeria", "ar_dz", 0x1401), - LANG("Arabic - Egypt", "ar_eg", 0x0C01), - LANG("Arabic - Iraq", "ar_iq", 0x0801), - LANG("Arabic - Jordan", "ar_jo", 0x2C01), - LANG("Arabic - Kuwait", "ar_kw", 0x3401), - LANG("Arabic - Lebanon", "ar_lb", 0x3001), - LANG("Arabic - Libya", "ar_ly", 0x1001), - LANG("Arabic - Morocco", "ar_ma", 0x1801), - LANG("Arabic - Oman", "ar_om", 0x2001), - LANG("Arabic - Qatar", "ar_qa", 0x4001), - LANG("Arabic - Saudi Arabia", "ar_sa", 0x0401), - LANG("Arabic - Syria", "ar_sy", 0x2801), - LANG("Arabic - Tunisia", "ar_tn", 0x1C01), - LANG("Arabic - Yemen", "ar_ye", 0x2401), - LANG("Armenian", "hy", 0x042B), - LANG("Azeri - Latin", "az_az", 0x042C), - LANG("Azeri - Cyrillic", "az_az", 0x082C), - LANG("Basque", "eu", 0x042D), - LANG("Belarusian", "be", 0x0423), - LANG("Bulgarian", "bg", 0x0402), - LANG("Catalan", "ca", 0x0403), - LANG("Chinese - China", "zh_cn", 0x0804), - LANG("Chinese - Hong Kong SAR", "zh_hk", 0x0C04), - LANG("Chinese - Macau SAR", "zh_mo", 0x1404), - LANG("Chinese - Singapore", "zh_sg", 0x1004), - LANG("Chinese - Taiwan", "zh_tw", 0x0404), - LANG("Croatian", "hr", 0x041A), - LANG("Czech", "cs", 0x0405), - LANG("Danish", "da", 0x0406), - LANG("Dutch - Netherlands", "nl_nl", 0x0413), - LANG("Dutch - Belgium", "nl_be", 0x0813), - LANG("English - Australia", "en_au", 0x0C09), - LANG("English - Belize", "en_bz", 0x2809), - LANG("English - Canada", "en_ca", 0x1009), - LANG("English - Caribbean", "en_cb", 0x2409), - LANG("English - Ireland", "en_ie", 0x1809), - LANG("English - Jamaica", "en_jm", 0x2009), - LANG("English - New Zealand", "en_nz", 0x1409), - LANG("English - Phillippines", "en_ph", 0x3409), - LANG("English - Southern Africa", "en_za", 0x1C09), - LANG("English - Trinidad", "en_tt", 0x2C09), - LANG("English - Great Britain", "en_gb", 0x0809), - LANG("English - United States", "en_us", 0x0409), - LANG("Estonian", "et", 0x0425), - LANG("Farsi", "fa", 0x0429), - LANG("Finnish", "fi", 0x040B), - LANG("Faroese", "fo", 0x0438), - LANG("French - France", "fr_fr", 0x040C), - LANG("French - Belgium", "fr_be", 0x080C), - LANG("French - Canada", "fr_ca", 0x0C0C), - LANG("French - Luxembourg", "fr_lu", 0x140C), - LANG("French - Switzerland", "fr_ch", 0x100C), - LANG("Gaelic - Ireland", "gd_ie", 0x083C), - LANG("Gaelic - Scotland", "gd", 0x043C), - LANG("German - Germany", "de_de", 0x0407), - LANG("German - Austria", "de_at", 0x0C07), - LANG("German - Liechtenstein", "de_li", 0x1407), - LANG("German - Luxembourg", "de_lu", 0x1007), - LANG("German - Switzerland", "de_ch", 0x0807), - LANG("Greek", "el", 0x0408), - LANG("Hebrew", "he", 0x040D), - LANG("Hindi", "hi", 0x0439), - LANG("Hungarian", "hu", 0x040E), - LANG("Icelandic", "is", 0x040F), - LANG("Indonesian", "id", 0x0421), - LANG("Italian - Italy", "it_it", 0x0410), - LANG("Italian - Switzerland", "it_ch", 0x0810), - LANG("Japanese", "ja", 0x0411), - LANG("Korean", "ko", 0x0412), - LANG("Latvian", "lv", 0x0426), - LANG("Lithuanian", "lt", 0x0427), - LANG("F.Y.R.O. Macedonia", "mk", 0x042F), - LANG("Malay - Malaysia", "ms_my", 0x043E), - LANG("Malay – Brunei", "ms_bn", 0x083E), - LANG("Maltese", "mt", 0x043A), - LANG("Marathi", "mr", 0x044E), - LANG("Norwegian - Bokml", "no_no", 0x0414), - LANG("Norwegian - Nynorsk", "no_no", 0x0814), - LANG("Polish", "pl", 0x0415), - LANG("Portuguese - Portugal", "pt_pt", 0x0816), - LANG("Portuguese - Brazil", "pt_br", 0x0416), - LANG("Raeto-Romance", "rm", 0x0417), - LANG("Romanian - Romania", "ro", 0x0418), - LANG("Romanian - Republic of Moldova", "ro_mo", 0x0818), - LANG("Russian", "ru", 0x0419), - LANG("Russian - Republic of Moldova", "ru_mo", 0x0819), - LANG("Sanskrit", "sa", 0x044F), - LANG("Serbian - Cyrillic", "sr_sp", 0x0C1A), - LANG("Serbian - Latin", "sr_sp", 0x081A), - LANG("Setsuana", "tn", 0x0432), - LANG("Slovenian", "sl", 0x0424), - LANG("Slovak", "sk", 0x041B), - LANG("Sorbian", "sb", 0x042E), - LANG("Spanish - Spain (Traditional)", "es_es", 0x040A), - LANG("Spanish - Argentina", "es_ar", 0x2C0A), - LANG("Spanish - Bolivia", "es_bo", 0x400A), - LANG("Spanish - Chile", "es_cl", 0x340A), - LANG("Spanish - Colombia", "es_co", 0x240A), - LANG("Spanish - Costa Rica", "es_cr", 0x140A), - LANG("Spanish - Dominican Republic", "es_do", 0x1C0A), - LANG("Spanish - Ecuador", "es_ec", 0x300A), - LANG("Spanish - Guatemala", "es_gt", 0x100A), - LANG("Spanish - Honduras", "es_hn", 0x480A), - LANG("Spanish - Mexico", "es_mx", 0x080A), - LANG("Spanish - Nicaragua", "es_ni", 0x4C0A), - LANG("Spanish - Panama", "es_pa", 0x180A), - LANG("Spanish - Peru", "es_pe", 0x280A), - LANG("Spanish - Puerto Rico", "es_pr", 0x500A), - LANG("Spanish - Paraguay", "es_py", 0x3C0A), - LANG("Spanish - El Salvador", "es_sv", 0x440A), - LANG("Spanish - Uruguay", "es_uy", 0x380A), - LANG("Spanish - Venezuela", "es_ve", 0x200A), - LANG("Southern Sotho", "st", 0x0430), - LANG("Swahili", "sw", 0x0441), - LANG("Swedish - Sweden", "sv_se", 0x041D), - LANG("Swedish - Finland", "sv_fi", 0x081D), - LANG("Tamil", "ta", 0x0449), - LANG("Tatar", "tt", 0X0444), - LANG("Thai", "th", 0x041E), - LANG("Turkish", "tr", 0x041F), - LANG("Tsonga", "ts", 0x0431), - LANG("Ukrainian", "uk", 0x0422), - LANG("Urdu", "ur", 0x0420), - LANG("Uzbek - Cyrillic", "uz_uz", 0x0843), - LANG("Uzbek – Latin", "uz_uz", 0x0443), - LANG("Vietnamese", "vi", 0x042A), - LANG("Xhosa", "xh", 0x0434), - LANG("Yiddish", "yi", 0x043D), - LANG("Zulu", "zu", 0x0435), - LANG(NULL, NULL, 0x0), -}; - -uint16_t get_usb_code_for_current_locale(void) -{ - char *locale; - char search_string[64]; - char *ptr; - struct lang_map_entry *lang; - - /* Get the current locale. */ - locale = setlocale(0, NULL); - if (!locale) - return 0x0; - - /* Make a copy of the current locale string. */ - strncpy(search_string, locale, sizeof(search_string)); - search_string[sizeof(search_string)-1] = '\0'; - - /* Chop off the encoding part, and make it lower case. */ - ptr = search_string; - while (*ptr) { - *ptr = tolower(*ptr); - if (*ptr == '.') { - *ptr = '\0'; - break; - } - ptr++; - } - - /* Find the entry which matches the string code of our locale. */ - lang = lang_map; - while (lang->string_code) { - if (!strcmp(lang->string_code, search_string)) { - return lang->usb_code; - } - lang++; - } - - /* There was no match. Find with just the language only. */ - /* Chop off the variant. Chop it off at the '_'. */ - ptr = search_string; - while (*ptr) { - *ptr = tolower(*ptr); - if (*ptr == '_') { - *ptr = '\0'; - break; - } - ptr++; - } - -#if 0 /* TODO: Do we need this? */ - /* Find the entry which matches the string code of our language. */ - lang = lang_map; - while (lang->string_code) { - if (!strcmp(lang->string_code, search_string)) { - return lang->usb_code; - } - lang++; - } -#endif - - /* Found nothing. */ - return 0x0; -} - -#ifdef __cplusplus -} -#endif diff --git a/vendor/github.com/karalabe/hid/hidapi/mac/hid.c b/vendor/github.com/karalabe/hid/hidapi/mac/hid.c deleted file mode 100644 index e0756a1588a5..000000000000 --- a/vendor/github.com/karalabe/hid/hidapi/mac/hid.c +++ /dev/null @@ -1,1110 +0,0 @@ -/******************************************************* - HIDAPI - Multi-Platform library for - communication with HID devices. - - Alan Ott - Signal 11 Software - - 2010-07-03 - - Copyright 2010, All Rights Reserved. - - At the discretion of the user of this library, - this software may be licensed under the terms of the - GNU General Public License v3, a BSD-Style license, or the - original HIDAPI license as outlined in the LICENSE.txt, - LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt - files located at the root of the source distribution. - These files may also be found in the public source - code repository located at: - http://github.com/signal11/hidapi . -********************************************************/ - -/* See Apple Technical Note TN2187 for details on IOHidManager. */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "hidapi.h" - -/* Barrier implementation because Mac OSX doesn't have pthread_barrier. - It also doesn't have clock_gettime(). So much for POSIX and SUSv2. - This implementation came from Brent Priddy and was posted on - StackOverflow. It is used with his permission. */ -typedef int pthread_barrierattr_t; -typedef struct pthread_barrier { - pthread_mutex_t mutex; - pthread_cond_t cond; - int count; - int trip_count; -} pthread_barrier_t; - -static int pthread_barrier_init(pthread_barrier_t *barrier, const pthread_barrierattr_t *attr, unsigned int count) -{ - if(count == 0) { - errno = EINVAL; - return -1; - } - - if(pthread_mutex_init(&barrier->mutex, 0) < 0) { - return -1; - } - if(pthread_cond_init(&barrier->cond, 0) < 0) { - pthread_mutex_destroy(&barrier->mutex); - return -1; - } - barrier->trip_count = count; - barrier->count = 0; - - return 0; -} - -static int pthread_barrier_destroy(pthread_barrier_t *barrier) -{ - pthread_cond_destroy(&barrier->cond); - pthread_mutex_destroy(&barrier->mutex); - return 0; -} - -static int pthread_barrier_wait(pthread_barrier_t *barrier) -{ - pthread_mutex_lock(&barrier->mutex); - ++(barrier->count); - if(barrier->count >= barrier->trip_count) - { - barrier->count = 0; - pthread_cond_broadcast(&barrier->cond); - pthread_mutex_unlock(&barrier->mutex); - return 1; - } - else - { - pthread_cond_wait(&barrier->cond, &(barrier->mutex)); - pthread_mutex_unlock(&barrier->mutex); - return 0; - } -} - -static int return_data(hid_device *dev, unsigned char *data, size_t length); - -/* Linked List of input reports received from the device. */ -struct input_report { - uint8_t *data; - size_t len; - struct input_report *next; -}; - -struct hid_device_ { - IOHIDDeviceRef device_handle; - int blocking; - int uses_numbered_reports; - int disconnected; - CFStringRef run_loop_mode; - CFRunLoopRef run_loop; - CFRunLoopSourceRef source; - uint8_t *input_report_buf; - CFIndex max_input_report_len; - struct input_report *input_reports; - - pthread_t thread; - pthread_mutex_t mutex; /* Protects input_reports */ - pthread_cond_t condition; - pthread_barrier_t barrier; /* Ensures correct startup sequence */ - pthread_barrier_t shutdown_barrier; /* Ensures correct shutdown sequence */ - int shutdown_thread; -}; - -static hid_device *new_hid_device(void) -{ - hid_device *dev = calloc(1, sizeof(hid_device)); - dev->device_handle = NULL; - dev->blocking = 1; - dev->uses_numbered_reports = 0; - dev->disconnected = 0; - dev->run_loop_mode = NULL; - dev->run_loop = NULL; - dev->source = NULL; - dev->input_report_buf = NULL; - dev->input_reports = NULL; - dev->shutdown_thread = 0; - - /* Thread objects */ - pthread_mutex_init(&dev->mutex, NULL); - pthread_cond_init(&dev->condition, NULL); - pthread_barrier_init(&dev->barrier, NULL, 2); - pthread_barrier_init(&dev->shutdown_barrier, NULL, 2); - - return dev; -} - -static void free_hid_device(hid_device *dev) -{ - if (!dev) - return; - - /* Delete any input reports still left over. */ - struct input_report *rpt = dev->input_reports; - while (rpt) { - struct input_report *next = rpt->next; - free(rpt->data); - free(rpt); - rpt = next; - } - - /* Free the string and the report buffer. The check for NULL - is necessary here as CFRelease() doesn't handle NULL like - free() and others do. */ - if (dev->run_loop_mode) - CFRelease(dev->run_loop_mode); - if (dev->source) - CFRelease(dev->source); - free(dev->input_report_buf); - - /* Clean up the thread objects */ - pthread_barrier_destroy(&dev->shutdown_barrier); - pthread_barrier_destroy(&dev->barrier); - pthread_cond_destroy(&dev->condition); - pthread_mutex_destroy(&dev->mutex); - - /* Free the structure itself. */ - free(dev); -} - -static IOHIDManagerRef hid_mgr = 0x0; - - -#if 0 -static void register_error(hid_device *device, const char *op) -{ - -} -#endif - - -static int32_t get_int_property(IOHIDDeviceRef device, CFStringRef key) -{ - CFTypeRef ref; - int32_t value; - - ref = IOHIDDeviceGetProperty(device, key); - if (ref) { - if (CFGetTypeID(ref) == CFNumberGetTypeID()) { - CFNumberGetValue((CFNumberRef) ref, kCFNumberSInt32Type, &value); - return value; - } - } - return 0; -} - -static unsigned short get_vendor_id(IOHIDDeviceRef device) -{ - return get_int_property(device, CFSTR(kIOHIDVendorIDKey)); -} - -static unsigned short get_product_id(IOHIDDeviceRef device) -{ - return get_int_property(device, CFSTR(kIOHIDProductIDKey)); -} - -static int32_t get_max_report_length(IOHIDDeviceRef device) -{ - return get_int_property(device, CFSTR(kIOHIDMaxInputReportSizeKey)); -} - -static int get_string_property(IOHIDDeviceRef device, CFStringRef prop, wchar_t *buf, size_t len) -{ - CFStringRef str; - - if (!len) - return 0; - - str = IOHIDDeviceGetProperty(device, prop); - - buf[0] = 0; - - if (str) { - CFIndex str_len = CFStringGetLength(str); - CFRange range; - CFIndex used_buf_len; - CFIndex chars_copied; - - len --; - - range.location = 0; - range.length = ((size_t)str_len > len)? len: (size_t)str_len; - chars_copied = CFStringGetBytes(str, - range, - kCFStringEncodingUTF32LE, - (char)'?', - FALSE, - (UInt8*)buf, - len * sizeof(wchar_t), - &used_buf_len); - - if (chars_copied == len) - buf[len] = 0; /* len is decremented above */ - else - buf[chars_copied] = 0; - - return 0; - } - else - return -1; - -} - -static int get_serial_number(IOHIDDeviceRef device, wchar_t *buf, size_t len) -{ - return get_string_property(device, CFSTR(kIOHIDSerialNumberKey), buf, len); -} - -static int get_manufacturer_string(IOHIDDeviceRef device, wchar_t *buf, size_t len) -{ - return get_string_property(device, CFSTR(kIOHIDManufacturerKey), buf, len); -} - -static int get_product_string(IOHIDDeviceRef device, wchar_t *buf, size_t len) -{ - return get_string_property(device, CFSTR(kIOHIDProductKey), buf, len); -} - - -/* Implementation of wcsdup() for Mac. */ -static wchar_t *dup_wcs(const wchar_t *s) -{ - size_t len = wcslen(s); - wchar_t *ret = malloc((len+1)*sizeof(wchar_t)); - wcscpy(ret, s); - - return ret; -} - -/* hidapi_IOHIDDeviceGetService() - * - * Return the io_service_t corresponding to a given IOHIDDeviceRef, either by: - * - on OS X 10.6 and above, calling IOHIDDeviceGetService() - * - on OS X 10.5, extract it from the IOHIDDevice struct - */ -static io_service_t hidapi_IOHIDDeviceGetService(IOHIDDeviceRef device) -{ - static void *iokit_framework = NULL; - static io_service_t (*dynamic_IOHIDDeviceGetService)(IOHIDDeviceRef device) = NULL; - - /* Use dlopen()/dlsym() to get a pointer to IOHIDDeviceGetService() if it exists. - * If any of these steps fail, dynamic_IOHIDDeviceGetService will be left NULL - * and the fallback method will be used. - */ - if (iokit_framework == NULL) { - iokit_framework = dlopen("/System/Library/IOKit.framework/IOKit", RTLD_LAZY); - - if (iokit_framework != NULL) - dynamic_IOHIDDeviceGetService = dlsym(iokit_framework, "IOHIDDeviceGetService"); - } - - if (dynamic_IOHIDDeviceGetService != NULL) { - /* Running on OS X 10.6 and above: IOHIDDeviceGetService() exists */ - return dynamic_IOHIDDeviceGetService(device); - } - else - { - /* Running on OS X 10.5: IOHIDDeviceGetService() doesn't exist. - * - * Be naughty and pull the service out of the IOHIDDevice. - * IOHIDDevice is an opaque struct not exposed to applications, but its - * layout is stable through all available versions of OS X. - * Tested and working on OS X 10.5.8 i386, x86_64, and ppc. - */ - struct IOHIDDevice_internal { - /* The first field of the IOHIDDevice struct is a - * CFRuntimeBase (which is a private CF struct). - * - * a, b, and c are the 3 fields that make up a CFRuntimeBase. - * See http://opensource.apple.com/source/CF/CF-476.18/CFRuntime.h - * - * The second field of the IOHIDDevice is the io_service_t we're looking for. - */ - uintptr_t a; - uint8_t b[4]; -#if __LP64__ - uint32_t c; -#endif - io_service_t service; - }; - struct IOHIDDevice_internal *tmp = (struct IOHIDDevice_internal *)device; - - return tmp->service; - } -} - -/* Initialize the IOHIDManager. Return 0 for success and -1 for failure. */ -static int init_hid_manager(void) -{ - /* Initialize all the HID Manager Objects */ - hid_mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); - if (hid_mgr) { - IOHIDManagerSetDeviceMatching(hid_mgr, NULL); - IOHIDManagerScheduleWithRunLoop(hid_mgr, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode); - return 0; - } - - return -1; -} - -/* Initialize the IOHIDManager if necessary. This is the public function, and - it is safe to call this function repeatedly. Return 0 for success and -1 - for failure. */ -int HID_API_EXPORT hid_init(void) -{ - if (!hid_mgr) { - return init_hid_manager(); - } - - /* Already initialized. */ - return 0; -} - -int HID_API_EXPORT hid_exit(void) -{ - if (hid_mgr) { - /* Close the HID manager. */ - IOHIDManagerClose(hid_mgr, kIOHIDOptionsTypeNone); - CFRelease(hid_mgr); - hid_mgr = NULL; - } - - return 0; -} - -static void process_pending_events(void) { - SInt32 res; - do { - res = CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.001, FALSE); - } while(res != kCFRunLoopRunFinished && res != kCFRunLoopRunTimedOut); -} - -struct hid_device_info HID_API_EXPORT *hid_enumerate(unsigned short vendor_id, unsigned short product_id) -{ - struct hid_device_info *root = NULL; /* return object */ - struct hid_device_info *cur_dev = NULL; - CFIndex num_devices; - int i; - - /* Set up the HID Manager if it hasn't been done */ - if (hid_init() < 0) - return NULL; - - /* give the IOHIDManager a chance to update itself */ - process_pending_events(); - - /* Get a list of the Devices */ - IOHIDManagerSetDeviceMatching(hid_mgr, NULL); - CFSetRef device_set = IOHIDManagerCopyDevices(hid_mgr); - - /* Convert the list into a C array so we can iterate easily. */ - num_devices = CFSetGetCount(device_set); - IOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef)); - CFSetGetValues(device_set, (const void **) device_array); - - /* Iterate over each device, making an entry for it. */ - for (i = 0; i < num_devices; i++) { - unsigned short dev_vid; - unsigned short dev_pid; - #define BUF_LEN 256 - wchar_t buf[BUF_LEN]; - - IOHIDDeviceRef dev = device_array[i]; - - if (!dev) { - continue; - } - dev_vid = get_vendor_id(dev); - dev_pid = get_product_id(dev); - - /* Check the VID/PID against the arguments */ - if ((vendor_id == 0x0 || vendor_id == dev_vid) && - (product_id == 0x0 || product_id == dev_pid)) { - struct hid_device_info *tmp; - io_object_t iokit_dev; - kern_return_t res; - io_string_t path; - - /* VID/PID match. Create the record. */ - tmp = malloc(sizeof(struct hid_device_info)); - if (cur_dev) { - cur_dev->next = tmp; - } - else { - root = tmp; - } - cur_dev = tmp; - - /* Get the Usage Page and Usage for this device. */ - cur_dev->usage_page = get_int_property(dev, CFSTR(kIOHIDPrimaryUsagePageKey)); - cur_dev->usage = get_int_property(dev, CFSTR(kIOHIDPrimaryUsageKey)); - - /* Fill out the record */ - cur_dev->next = NULL; - - /* Fill in the path (IOService plane) */ - iokit_dev = hidapi_IOHIDDeviceGetService(dev); - res = IORegistryEntryGetPath(iokit_dev, kIOServicePlane, path); - if (res == KERN_SUCCESS) - cur_dev->path = strdup(path); - else - cur_dev->path = strdup(""); - - /* Serial Number */ - get_serial_number(dev, buf, BUF_LEN); - cur_dev->serial_number = dup_wcs(buf); - - /* Manufacturer and Product strings */ - get_manufacturer_string(dev, buf, BUF_LEN); - cur_dev->manufacturer_string = dup_wcs(buf); - get_product_string(dev, buf, BUF_LEN); - cur_dev->product_string = dup_wcs(buf); - - /* VID/PID */ - cur_dev->vendor_id = dev_vid; - cur_dev->product_id = dev_pid; - - /* Release Number */ - cur_dev->release_number = get_int_property(dev, CFSTR(kIOHIDVersionNumberKey)); - - /* Interface Number (Unsupported on Mac)*/ - cur_dev->interface_number = -1; - } - } - - free(device_array); - CFRelease(device_set); - - return root; -} - -void HID_API_EXPORT hid_free_enumeration(struct hid_device_info *devs) -{ - /* This function is identical to the Linux version. Platform independent. */ - struct hid_device_info *d = devs; - while (d) { - struct hid_device_info *next = d->next; - free(d->path); - free(d->serial_number); - free(d->manufacturer_string); - free(d->product_string); - free(d); - d = next; - } -} - -hid_device * HID_API_EXPORT hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) -{ - /* This function is identical to the Linux version. Platform independent. */ - struct hid_device_info *devs, *cur_dev; - const char *path_to_open = NULL; - hid_device * handle = NULL; - - devs = hid_enumerate(vendor_id, product_id); - cur_dev = devs; - while (cur_dev) { - if (cur_dev->vendor_id == vendor_id && - cur_dev->product_id == product_id) { - if (serial_number) { - if (wcscmp(serial_number, cur_dev->serial_number) == 0) { - path_to_open = cur_dev->path; - break; - } - } - else { - path_to_open = cur_dev->path; - break; - } - } - cur_dev = cur_dev->next; - } - - if (path_to_open) { - /* Open the device */ - handle = hid_open_path(path_to_open); - } - - hid_free_enumeration(devs); - - return handle; -} - -static void hid_device_removal_callback(void *context, IOReturn result, - void *sender) -{ - /* Stop the Run Loop for this device. */ - hid_device *d = context; - - d->disconnected = 1; - CFRunLoopStop(d->run_loop); -} - -/* The Run Loop calls this function for each input report received. - This function puts the data into a linked list to be picked up by - hid_read(). */ -static void hid_report_callback(void *context, IOReturn result, void *sender, - IOHIDReportType report_type, uint32_t report_id, - uint8_t *report, CFIndex report_length) -{ - struct input_report *rpt; - hid_device *dev = context; - - /* Make a new Input Report object */ - rpt = calloc(1, sizeof(struct input_report)); - rpt->data = calloc(1, report_length); - memcpy(rpt->data, report, report_length); - rpt->len = report_length; - rpt->next = NULL; - - /* Lock this section */ - pthread_mutex_lock(&dev->mutex); - - /* Attach the new report object to the end of the list. */ - if (dev->input_reports == NULL) { - /* The list is empty. Put it at the root. */ - dev->input_reports = rpt; - } - else { - /* Find the end of the list and attach. */ - struct input_report *cur = dev->input_reports; - int num_queued = 0; - while (cur->next != NULL) { - cur = cur->next; - num_queued++; - } - cur->next = rpt; - - /* Pop one off if we've reached 30 in the queue. This - way we don't grow forever if the user never reads - anything from the device. */ - if (num_queued > 30) { - return_data(dev, NULL, 0); - } - } - - /* Signal a waiting thread that there is data. */ - pthread_cond_signal(&dev->condition); - - /* Unlock */ - pthread_mutex_unlock(&dev->mutex); - -} - -/* This gets called when the read_thread's run loop gets signaled by - hid_close(), and serves to stop the read_thread's run loop. */ -static void perform_signal_callback(void *context) -{ - hid_device *dev = context; - CFRunLoopStop(dev->run_loop); /*TODO: CFRunLoopGetCurrent()*/ -} - -static void *read_thread(void *param) -{ - hid_device *dev = param; - SInt32 code; - - /* Move the device's run loop to this thread. */ - IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetCurrent(), dev->run_loop_mode); - - /* Create the RunLoopSource which is used to signal the - event loop to stop when hid_close() is called. */ - CFRunLoopSourceContext ctx; - memset(&ctx, 0, sizeof(ctx)); - ctx.version = 0; - ctx.info = dev; - ctx.perform = &perform_signal_callback; - dev->source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0/*order*/, &ctx); - CFRunLoopAddSource(CFRunLoopGetCurrent(), dev->source, dev->run_loop_mode); - - /* Store off the Run Loop so it can be stopped from hid_close() - and on device disconnection. */ - dev->run_loop = CFRunLoopGetCurrent(); - - /* Notify the main thread that the read thread is up and running. */ - pthread_barrier_wait(&dev->barrier); - - /* Run the Event Loop. CFRunLoopRunInMode() will dispatch HID input - reports into the hid_report_callback(). */ - while (!dev->shutdown_thread && !dev->disconnected) { - code = CFRunLoopRunInMode(dev->run_loop_mode, 1000/*sec*/, FALSE); - /* Return if the device has been disconnected */ - if (code == kCFRunLoopRunFinished) { - dev->disconnected = 1; - break; - } - - - /* Break if The Run Loop returns Finished or Stopped. */ - if (code != kCFRunLoopRunTimedOut && - code != kCFRunLoopRunHandledSource) { - /* There was some kind of error. Setting - shutdown seems to make sense, but - there may be something else more appropriate */ - dev->shutdown_thread = 1; - break; - } - } - - /* Now that the read thread is stopping, Wake any threads which are - waiting on data (in hid_read_timeout()). Do this under a mutex to - make sure that a thread which is about to go to sleep waiting on - the condition actually will go to sleep before the condition is - signaled. */ - pthread_mutex_lock(&dev->mutex); - pthread_cond_broadcast(&dev->condition); - pthread_mutex_unlock(&dev->mutex); - - /* Wait here until hid_close() is called and makes it past - the call to CFRunLoopWakeUp(). This thread still needs to - be valid when that function is called on the other thread. */ - pthread_barrier_wait(&dev->shutdown_barrier); - - return NULL; -} - -/* hid_open_path() - * - * path must be a valid path to an IOHIDDevice in the IOService plane - * Example: "IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/EHC1@1D,7/AppleUSBEHCI/PLAYSTATION(R)3 Controller@fd120000/IOUSBInterface@0/IOUSBHIDDriver" - */ -hid_device * HID_API_EXPORT hid_open_path(const char *path) -{ - hid_device *dev = NULL; - io_registry_entry_t entry = MACH_PORT_NULL; - - dev = new_hid_device(); - - /* Set up the HID Manager if it hasn't been done */ - if (hid_init() < 0) - return NULL; - - /* Get the IORegistry entry for the given path */ - entry = IORegistryEntryFromPath(kIOMasterPortDefault, path); - if (entry == MACH_PORT_NULL) { - /* Path wasn't valid (maybe device was removed?) */ - goto return_error; - } - - /* Create an IOHIDDevice for the entry */ - dev->device_handle = IOHIDDeviceCreate(kCFAllocatorDefault, entry); - if (dev->device_handle == NULL) { - /* Error creating the HID device */ - goto return_error; - } - - /* Open the IOHIDDevice */ - IOReturn ret = IOHIDDeviceOpen(dev->device_handle, kIOHIDOptionsTypeSeizeDevice); - if (ret == kIOReturnSuccess) { - char str[32]; - - /* Create the buffers for receiving data */ - dev->max_input_report_len = (CFIndex) get_max_report_length(dev->device_handle); - dev->input_report_buf = calloc(dev->max_input_report_len, sizeof(uint8_t)); - - /* Create the Run Loop Mode for this device. - printing the reference seems to work. */ - sprintf(str, "HIDAPI_%p", dev->device_handle); - dev->run_loop_mode = - CFStringCreateWithCString(NULL, str, kCFStringEncodingASCII); - - /* Attach the device to a Run Loop */ - IOHIDDeviceRegisterInputReportCallback( - dev->device_handle, dev->input_report_buf, dev->max_input_report_len, - &hid_report_callback, dev); - IOHIDDeviceRegisterRemovalCallback(dev->device_handle, hid_device_removal_callback, dev); - - /* Start the read thread */ - pthread_create(&dev->thread, NULL, read_thread, dev); - - /* Wait here for the read thread to be initialized. */ - pthread_barrier_wait(&dev->barrier); - - IOObjectRelease(entry); - return dev; - } - else { - goto return_error; - } - -return_error: - if (dev->device_handle != NULL) - CFRelease(dev->device_handle); - - if (entry != MACH_PORT_NULL) - IOObjectRelease(entry); - - free_hid_device(dev); - return NULL; -} - -static int set_report(hid_device *dev, IOHIDReportType type, const unsigned char *data, size_t length) -{ - const unsigned char *data_to_send; - size_t length_to_send; - IOReturn res; - - /* Return if the device has been disconnected. */ - if (dev->disconnected) - return -1; - - if (data[0] == 0x0) { - /* Not using numbered Reports. - Don't send the report number. */ - data_to_send = data+1; - length_to_send = length-1; - } - else { - /* Using numbered Reports. - Send the Report Number */ - data_to_send = data; - length_to_send = length; - } - - if (!dev->disconnected) { - res = IOHIDDeviceSetReport(dev->device_handle, - type, - data[0], /* Report ID*/ - data_to_send, length_to_send); - - if (res == kIOReturnSuccess) { - return length; - } - else - return -1; - } - - return -1; -} - -int HID_API_EXPORT hid_write(hid_device *dev, const unsigned char *data, size_t length) -{ - return set_report(dev, kIOHIDReportTypeOutput, data, length); -} - -/* Helper function, so that this isn't duplicated in hid_read(). */ -static int return_data(hid_device *dev, unsigned char *data, size_t length) -{ - /* Copy the data out of the linked list item (rpt) into the - return buffer (data), and delete the liked list item. */ - struct input_report *rpt = dev->input_reports; - size_t len = (length < rpt->len)? length: rpt->len; - memcpy(data, rpt->data, len); - dev->input_reports = rpt->next; - free(rpt->data); - free(rpt); - return len; -} - -static int cond_wait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex) -{ - while (!dev->input_reports) { - int res = pthread_cond_wait(cond, mutex); - if (res != 0) - return res; - - /* A res of 0 means we may have been signaled or it may - be a spurious wakeup. Check to see that there's acutally - data in the queue before returning, and if not, go back - to sleep. See the pthread_cond_timedwait() man page for - details. */ - - if (dev->shutdown_thread || dev->disconnected) - return -1; - } - - return 0; -} - -static int cond_timedwait(const hid_device *dev, pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime) -{ - while (!dev->input_reports) { - int res = pthread_cond_timedwait(cond, mutex, abstime); - if (res != 0) - return res; - - /* A res of 0 means we may have been signaled or it may - be a spurious wakeup. Check to see that there's acutally - data in the queue before returning, and if not, go back - to sleep. See the pthread_cond_timedwait() man page for - details. */ - - if (dev->shutdown_thread || dev->disconnected) - return -1; - } - - return 0; - -} - -int HID_API_EXPORT hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) -{ - int bytes_read = -1; - - /* Lock the access to the report list. */ - pthread_mutex_lock(&dev->mutex); - - /* There's an input report queued up. Return it. */ - if (dev->input_reports) { - /* Return the first one */ - bytes_read = return_data(dev, data, length); - goto ret; - } - - /* Return if the device has been disconnected. */ - if (dev->disconnected) { - bytes_read = -1; - goto ret; - } - - if (dev->shutdown_thread) { - /* This means the device has been closed (or there - has been an error. An error code of -1 should - be returned. */ - bytes_read = -1; - goto ret; - } - - /* There is no data. Go to sleep and wait for data. */ - - if (milliseconds == -1) { - /* Blocking */ - int res; - res = cond_wait(dev, &dev->condition, &dev->mutex); - if (res == 0) - bytes_read = return_data(dev, data, length); - else { - /* There was an error, or a device disconnection. */ - bytes_read = -1; - } - } - else if (milliseconds > 0) { - /* Non-blocking, but called with timeout. */ - int res; - struct timespec ts; - struct timeval tv; - gettimeofday(&tv, NULL); - TIMEVAL_TO_TIMESPEC(&tv, &ts); - ts.tv_sec += milliseconds / 1000; - ts.tv_nsec += (milliseconds % 1000) * 1000000; - if (ts.tv_nsec >= 1000000000L) { - ts.tv_sec++; - ts.tv_nsec -= 1000000000L; - } - - res = cond_timedwait(dev, &dev->condition, &dev->mutex, &ts); - if (res == 0) - bytes_read = return_data(dev, data, length); - else if (res == ETIMEDOUT) - bytes_read = 0; - else - bytes_read = -1; - } - else { - /* Purely non-blocking */ - bytes_read = 0; - } - -ret: - /* Unlock */ - pthread_mutex_unlock(&dev->mutex); - return bytes_read; -} - -int HID_API_EXPORT hid_read(hid_device *dev, unsigned char *data, size_t length) -{ - return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); -} - -int HID_API_EXPORT hid_set_nonblocking(hid_device *dev, int nonblock) -{ - /* All Nonblocking operation is handled by the library. */ - dev->blocking = !nonblock; - - return 0; -} - -int HID_API_EXPORT hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) -{ - return set_report(dev, kIOHIDReportTypeFeature, data, length); -} - -int HID_API_EXPORT hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) -{ - CFIndex len = length; - IOReturn res; - - /* Return if the device has been unplugged. */ - if (dev->disconnected) - return -1; - - res = IOHIDDeviceGetReport(dev->device_handle, - kIOHIDReportTypeFeature, - data[0], /* Report ID */ - data, &len); - if (res == kIOReturnSuccess) - return len; - else - return -1; -} - - -void HID_API_EXPORT hid_close(hid_device *dev) -{ - if (!dev) - return; - - /* Disconnect the report callback before close. */ - if (!dev->disconnected) { - IOHIDDeviceRegisterInputReportCallback( - dev->device_handle, dev->input_report_buf, dev->max_input_report_len, - NULL, dev); - IOHIDDeviceRegisterRemovalCallback(dev->device_handle, NULL, dev); - IOHIDDeviceUnscheduleFromRunLoop(dev->device_handle, dev->run_loop, dev->run_loop_mode); - IOHIDDeviceScheduleWithRunLoop(dev->device_handle, CFRunLoopGetMain(), kCFRunLoopDefaultMode); - } - - /* Cause read_thread() to stop. */ - dev->shutdown_thread = 1; - - /* Wake up the run thread's event loop so that the thread can exit. */ - CFRunLoopSourceSignal(dev->source); - CFRunLoopWakeUp(dev->run_loop); - - /* Notify the read thread that it can shut down now. */ - pthread_barrier_wait(&dev->shutdown_barrier); - - /* Wait for read_thread() to end. */ - pthread_join(dev->thread, NULL); - - /* Close the OS handle to the device, but only if it's not - been unplugged. If it's been unplugged, then calling - IOHIDDeviceClose() will crash. */ - if (!dev->disconnected) { - IOHIDDeviceClose(dev->device_handle, kIOHIDOptionsTypeSeizeDevice); - } - - /* Clear out the queue of received reports. */ - pthread_mutex_lock(&dev->mutex); - while (dev->input_reports) { - return_data(dev, NULL, 0); - } - pthread_mutex_unlock(&dev->mutex); - CFRelease(dev->device_handle); - - free_hid_device(dev); -} - -int HID_API_EXPORT_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - return get_manufacturer_string(dev->device_handle, string, maxlen); -} - -int HID_API_EXPORT_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - return get_product_string(dev->device_handle, string, maxlen); -} - -int HID_API_EXPORT_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - return get_serial_number(dev->device_handle, string, maxlen); -} - -int HID_API_EXPORT_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) -{ - /* TODO: */ - - return 0; -} - - -HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) -{ - /* TODO: */ - - return NULL; -} - - - - - - - -#if 0 -static int32_t get_location_id(IOHIDDeviceRef device) -{ - return get_int_property(device, CFSTR(kIOHIDLocationIDKey)); -} - -static int32_t get_usage(IOHIDDeviceRef device) -{ - int32_t res; - res = get_int_property(device, CFSTR(kIOHIDDeviceUsageKey)); - if (!res) - res = get_int_property(device, CFSTR(kIOHIDPrimaryUsageKey)); - return res; -} - -static int32_t get_usage_page(IOHIDDeviceRef device) -{ - int32_t res; - res = get_int_property(device, CFSTR(kIOHIDDeviceUsagePageKey)); - if (!res) - res = get_int_property(device, CFSTR(kIOHIDPrimaryUsagePageKey)); - return res; -} - -static int get_transport(IOHIDDeviceRef device, wchar_t *buf, size_t len) -{ - return get_string_property(device, CFSTR(kIOHIDTransportKey), buf, len); -} - - -int main(void) -{ - IOHIDManagerRef mgr; - int i; - - mgr = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); - IOHIDManagerSetDeviceMatching(mgr, NULL); - IOHIDManagerOpen(mgr, kIOHIDOptionsTypeNone); - - CFSetRef device_set = IOHIDManagerCopyDevices(mgr); - - CFIndex num_devices = CFSetGetCount(device_set); - IOHIDDeviceRef *device_array = calloc(num_devices, sizeof(IOHIDDeviceRef)); - CFSetGetValues(device_set, (const void **) device_array); - - for (i = 0; i < num_devices; i++) { - IOHIDDeviceRef dev = device_array[i]; - printf("Device: %p\n", dev); - printf(" %04hx %04hx\n", get_vendor_id(dev), get_product_id(dev)); - - wchar_t serial[256], buf[256]; - char cbuf[256]; - get_serial_number(dev, serial, 256); - - - printf(" Serial: %ls\n", serial); - printf(" Loc: %ld\n", get_location_id(dev)); - get_transport(dev, buf, 256); - printf(" Trans: %ls\n", buf); - make_path(dev, cbuf, 256); - printf(" Path: %s\n", cbuf); - - } - - return 0; -} -#endif diff --git a/vendor/github.com/karalabe/hid/hidapi/windows/hid.c b/vendor/github.com/karalabe/hid/hidapi/windows/hid.c deleted file mode 100755 index 86810d7e567c..000000000000 --- a/vendor/github.com/karalabe/hid/hidapi/windows/hid.c +++ /dev/null @@ -1,944 +0,0 @@ -/******************************************************* - HIDAPI - Multi-Platform library for - communication with HID devices. - - Alan Ott - Signal 11 Software - - 8/22/2009 - - Copyright 2009, All Rights Reserved. - - At the discretion of the user of this library, - this software may be licensed under the terms of the - GNU General Public License v3, a BSD-Style license, or the - original HIDAPI license as outlined in the LICENSE.txt, - LICENSE-gpl3.txt, LICENSE-bsd.txt, and LICENSE-orig.txt - files located at the root of the source distribution. - These files may also be found in the public source - code repository located at: - http://github.com/signal11/hidapi . -********************************************************/ - -#include - -#ifndef _NTDEF_ -typedef LONG NTSTATUS; -#endif - -#ifdef __MINGW32__ -#include -#include -#endif - -#ifdef __CYGWIN__ -#include -#define _wcsdup wcsdup -#endif - -/* The maximum number of characters that can be passed into the - HidD_Get*String() functions without it failing.*/ -#define MAX_STRING_WCHARS 0xFFF - -/*#define HIDAPI_USE_DDK*/ - -#ifdef __cplusplus -extern "C" { -#endif - #include - #include - #ifdef HIDAPI_USE_DDK - #include - #endif - - /* Copied from inc/ddk/hidclass.h, part of the Windows DDK. */ - #define HID_OUT_CTL_CODE(id) \ - CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS) - #define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100) - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#include -#include - - -#include "hidapi.h" - -#undef MIN -#define MIN(x,y) ((x) < (y)? (x): (y)) - -#ifdef _MSC_VER - /* Thanks Microsoft, but I know how to use strncpy(). */ - #pragma warning(disable:4996) -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef HIDAPI_USE_DDK - /* Since we're not building with the DDK, and the HID header - files aren't part of the SDK, we have to define all this - stuff here. In lookup_functions(), the function pointers - defined below are set. */ - typedef struct _HIDD_ATTRIBUTES{ - ULONG Size; - USHORT VendorID; - USHORT ProductID; - USHORT VersionNumber; - } HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; - - typedef USHORT USAGE; - typedef struct _HIDP_CAPS { - USAGE Usage; - USAGE UsagePage; - USHORT InputReportByteLength; - USHORT OutputReportByteLength; - USHORT FeatureReportByteLength; - USHORT Reserved[17]; - USHORT fields_not_used_by_hidapi[10]; - } HIDP_CAPS, *PHIDP_CAPS; - typedef void* PHIDP_PREPARSED_DATA; - #define HIDP_STATUS_SUCCESS 0x110000 - - typedef BOOLEAN (__stdcall *HidD_GetAttributes_)(HANDLE device, PHIDD_ATTRIBUTES attrib); - typedef BOOLEAN (__stdcall *HidD_GetSerialNumberString_)(HANDLE device, PVOID buffer, ULONG buffer_len); - typedef BOOLEAN (__stdcall *HidD_GetManufacturerString_)(HANDLE handle, PVOID buffer, ULONG buffer_len); - typedef BOOLEAN (__stdcall *HidD_GetProductString_)(HANDLE handle, PVOID buffer, ULONG buffer_len); - typedef BOOLEAN (__stdcall *HidD_SetFeature_)(HANDLE handle, PVOID data, ULONG length); - typedef BOOLEAN (__stdcall *HidD_GetFeature_)(HANDLE handle, PVOID data, ULONG length); - typedef BOOLEAN (__stdcall *HidD_GetIndexedString_)(HANDLE handle, ULONG string_index, PVOID buffer, ULONG buffer_len); - typedef BOOLEAN (__stdcall *HidD_GetPreparsedData_)(HANDLE handle, PHIDP_PREPARSED_DATA *preparsed_data); - typedef BOOLEAN (__stdcall *HidD_FreePreparsedData_)(PHIDP_PREPARSED_DATA preparsed_data); - typedef NTSTATUS (__stdcall *HidP_GetCaps_)(PHIDP_PREPARSED_DATA preparsed_data, HIDP_CAPS *caps); - typedef BOOLEAN (__stdcall *HidD_SetNumInputBuffers_)(HANDLE handle, ULONG number_buffers); - - static HidD_GetAttributes_ HidD_GetAttributes; - static HidD_GetSerialNumberString_ HidD_GetSerialNumberString; - static HidD_GetManufacturerString_ HidD_GetManufacturerString; - static HidD_GetProductString_ HidD_GetProductString; - static HidD_SetFeature_ HidD_SetFeature; - static HidD_GetFeature_ HidD_GetFeature; - static HidD_GetIndexedString_ HidD_GetIndexedString; - static HidD_GetPreparsedData_ HidD_GetPreparsedData; - static HidD_FreePreparsedData_ HidD_FreePreparsedData; - static HidP_GetCaps_ HidP_GetCaps; - static HidD_SetNumInputBuffers_ HidD_SetNumInputBuffers; - - static HMODULE lib_handle = NULL; - static BOOLEAN initialized = FALSE; -#endif /* HIDAPI_USE_DDK */ - -struct hid_device_ { - HANDLE device_handle; - BOOL blocking; - USHORT output_report_length; - size_t input_report_length; - void *last_error_str; - DWORD last_error_num; - BOOL read_pending; - char *read_buf; - OVERLAPPED ol; -}; - -static hid_device *new_hid_device() -{ - hid_device *dev = (hid_device*) calloc(1, sizeof(hid_device)); - dev->device_handle = INVALID_HANDLE_VALUE; - dev->blocking = TRUE; - dev->output_report_length = 0; - dev->input_report_length = 0; - dev->last_error_str = NULL; - dev->last_error_num = 0; - dev->read_pending = FALSE; - dev->read_buf = NULL; - memset(&dev->ol, 0, sizeof(dev->ol)); - dev->ol.hEvent = CreateEvent(NULL, FALSE, FALSE /*initial state f=nonsignaled*/, NULL); - - return dev; -} - -static void free_hid_device(hid_device *dev) -{ - CloseHandle(dev->ol.hEvent); - CloseHandle(dev->device_handle); - LocalFree(dev->last_error_str); - free(dev->read_buf); - free(dev); -} - -static void register_error(hid_device *device, const char *op) -{ - WCHAR *ptr, *msg; - - FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | - FORMAT_MESSAGE_FROM_SYSTEM | - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - GetLastError(), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPVOID)&msg, 0/*sz*/, - NULL); - - /* Get rid of the CR and LF that FormatMessage() sticks at the - end of the message. Thanks Microsoft! */ - ptr = msg; - while (*ptr) { - if (*ptr == '\r') { - *ptr = 0x0000; - break; - } - ptr++; - } - - /* Store the message off in the Device entry so that - the hid_error() function can pick it up. */ - LocalFree(device->last_error_str); - device->last_error_str = msg; -} - -#ifndef HIDAPI_USE_DDK -static int lookup_functions() -{ - lib_handle = LoadLibraryA("hid.dll"); - if (lib_handle) { -#define RESOLVE(x) x = (x##_)GetProcAddress(lib_handle, #x); if (!x) return -1; - RESOLVE(HidD_GetAttributes); - RESOLVE(HidD_GetSerialNumberString); - RESOLVE(HidD_GetManufacturerString); - RESOLVE(HidD_GetProductString); - RESOLVE(HidD_SetFeature); - RESOLVE(HidD_GetFeature); - RESOLVE(HidD_GetIndexedString); - RESOLVE(HidD_GetPreparsedData); - RESOLVE(HidD_FreePreparsedData); - RESOLVE(HidP_GetCaps); - RESOLVE(HidD_SetNumInputBuffers); -#undef RESOLVE - } - else - return -1; - - return 0; -} -#endif - -static HANDLE open_device(const char *path, BOOL enumerate) -{ - HANDLE handle; - DWORD desired_access = (enumerate)? 0: (GENERIC_WRITE | GENERIC_READ); - DWORD share_mode = FILE_SHARE_READ|FILE_SHARE_WRITE; - - handle = CreateFileA(path, - desired_access, - share_mode, - NULL, - OPEN_EXISTING, - FILE_FLAG_OVERLAPPED,/*FILE_ATTRIBUTE_NORMAL,*/ - 0); - - return handle; -} - -int HID_API_EXPORT hid_init(void) -{ -#ifndef HIDAPI_USE_DDK - if (!initialized) { - if (lookup_functions() < 0) { - hid_exit(); - return -1; - } - initialized = TRUE; - } -#endif - return 0; -} - -int HID_API_EXPORT hid_exit(void) -{ -#ifndef HIDAPI_USE_DDK - if (lib_handle) - FreeLibrary(lib_handle); - lib_handle = NULL; - initialized = FALSE; -#endif - return 0; -} - -struct hid_device_info HID_API_EXPORT * HID_API_CALL hid_enumerate(unsigned short vendor_id, unsigned short product_id) -{ - BOOL res; - struct hid_device_info *root = NULL; /* return object */ - struct hid_device_info *cur_dev = NULL; - - /* Windows objects for interacting with the driver. */ - GUID InterfaceClassGuid = {0x4d1e55b2, 0xf16f, 0x11cf, {0x88, 0xcb, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30} }; - SP_DEVINFO_DATA devinfo_data; - SP_DEVICE_INTERFACE_DATA device_interface_data; - SP_DEVICE_INTERFACE_DETAIL_DATA_A *device_interface_detail_data = NULL; - HDEVINFO device_info_set = INVALID_HANDLE_VALUE; - int device_index = 0; - int i; - - if (hid_init() < 0) - return NULL; - - /* Initialize the Windows objects. */ - memset(&devinfo_data, 0x0, sizeof(devinfo_data)); - devinfo_data.cbSize = sizeof(SP_DEVINFO_DATA); - device_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); - - /* Get information for all the devices belonging to the HID class. */ - device_info_set = SetupDiGetClassDevsA(&InterfaceClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); - - /* Iterate over each device in the HID class, looking for the right one. */ - - for (;;) { - HANDLE write_handle = INVALID_HANDLE_VALUE; - DWORD required_size = 0; - HIDD_ATTRIBUTES attrib; - - res = SetupDiEnumDeviceInterfaces(device_info_set, - NULL, - &InterfaceClassGuid, - device_index, - &device_interface_data); - - if (!res) { - /* A return of FALSE from this function means that - there are no more devices. */ - break; - } - - /* Call with 0-sized detail size, and let the function - tell us how long the detail struct needs to be. The - size is put in &required_size. */ - res = SetupDiGetDeviceInterfaceDetailA(device_info_set, - &device_interface_data, - NULL, - 0, - &required_size, - NULL); - - /* Allocate a long enough structure for device_interface_detail_data. */ - device_interface_detail_data = (SP_DEVICE_INTERFACE_DETAIL_DATA_A*) malloc(required_size); - device_interface_detail_data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); - - /* Get the detailed data for this device. The detail data gives us - the device path for this device, which is then passed into - CreateFile() to get a handle to the device. */ - res = SetupDiGetDeviceInterfaceDetailA(device_info_set, - &device_interface_data, - device_interface_detail_data, - required_size, - NULL, - NULL); - - if (!res) { - /* register_error(dev, "Unable to call SetupDiGetDeviceInterfaceDetail"); - Continue to the next device. */ - goto cont; - } - - /* Make sure this device is of Setup Class "HIDClass" and has a - driver bound to it. */ - for (i = 0; ; i++) { - char driver_name[256]; - - /* Populate devinfo_data. This function will return failure - when there are no more interfaces left. */ - res = SetupDiEnumDeviceInfo(device_info_set, i, &devinfo_data); - if (!res) - goto cont; - - res = SetupDiGetDeviceRegistryPropertyA(device_info_set, &devinfo_data, - SPDRP_CLASS, NULL, (PBYTE)driver_name, sizeof(driver_name), NULL); - if (!res) - goto cont; - - if (strcmp(driver_name, "HIDClass") == 0) { - /* See if there's a driver bound. */ - res = SetupDiGetDeviceRegistryPropertyA(device_info_set, &devinfo_data, - SPDRP_DRIVER, NULL, (PBYTE)driver_name, sizeof(driver_name), NULL); - if (res) - break; - } - } - - //wprintf(L"HandleName: %s\n", device_interface_detail_data->DevicePath); - - /* Open a handle to the device */ - write_handle = open_device(device_interface_detail_data->DevicePath, TRUE); - - /* Check validity of write_handle. */ - if (write_handle == INVALID_HANDLE_VALUE) { - /* Unable to open the device. */ - //register_error(dev, "CreateFile"); - goto cont_close; - } - - - /* Get the Vendor ID and Product ID for this device. */ - attrib.Size = sizeof(HIDD_ATTRIBUTES); - HidD_GetAttributes(write_handle, &attrib); - //wprintf(L"Product/Vendor: %x %x\n", attrib.ProductID, attrib.VendorID); - - /* Check the VID/PID to see if we should add this - device to the enumeration list. */ - if ((vendor_id == 0x0 || attrib.VendorID == vendor_id) && - (product_id == 0x0 || attrib.ProductID == product_id)) { - - #define WSTR_LEN 512 - const char *str; - struct hid_device_info *tmp; - PHIDP_PREPARSED_DATA pp_data = NULL; - HIDP_CAPS caps; - BOOLEAN res; - NTSTATUS nt_res; - wchar_t wstr[WSTR_LEN]; /* TODO: Determine Size */ - size_t len; - - /* VID/PID match. Create the record. */ - tmp = (struct hid_device_info*) calloc(1, sizeof(struct hid_device_info)); - if (cur_dev) { - cur_dev->next = tmp; - } - else { - root = tmp; - } - cur_dev = tmp; - - /* Get the Usage Page and Usage for this device. */ - res = HidD_GetPreparsedData(write_handle, &pp_data); - if (res) { - nt_res = HidP_GetCaps(pp_data, &caps); - if (nt_res == HIDP_STATUS_SUCCESS) { - cur_dev->usage_page = caps.UsagePage; - cur_dev->usage = caps.Usage; - } - - HidD_FreePreparsedData(pp_data); - } - - /* Fill out the record */ - cur_dev->next = NULL; - str = device_interface_detail_data->DevicePath; - if (str) { - len = strlen(str); - cur_dev->path = (char*) calloc(len+1, sizeof(char)); - strncpy(cur_dev->path, str, len+1); - cur_dev->path[len] = '\0'; - } - else - cur_dev->path = NULL; - - /* Serial Number */ - res = HidD_GetSerialNumberString(write_handle, wstr, sizeof(wstr)); - wstr[WSTR_LEN-1] = 0x0000; - if (res) { - cur_dev->serial_number = _wcsdup(wstr); - } - - /* Manufacturer String */ - res = HidD_GetManufacturerString(write_handle, wstr, sizeof(wstr)); - wstr[WSTR_LEN-1] = 0x0000; - if (res) { - cur_dev->manufacturer_string = _wcsdup(wstr); - } - - /* Product String */ - res = HidD_GetProductString(write_handle, wstr, sizeof(wstr)); - wstr[WSTR_LEN-1] = 0x0000; - if (res) { - cur_dev->product_string = _wcsdup(wstr); - } - - /* VID/PID */ - cur_dev->vendor_id = attrib.VendorID; - cur_dev->product_id = attrib.ProductID; - - /* Release Number */ - cur_dev->release_number = attrib.VersionNumber; - - /* Interface Number. It can sometimes be parsed out of the path - on Windows if a device has multiple interfaces. See - http://msdn.microsoft.com/en-us/windows/hardware/gg487473 or - search for "Hardware IDs for HID Devices" at MSDN. If it's not - in the path, it's set to -1. */ - cur_dev->interface_number = -1; - if (cur_dev->path) { - char *interface_component = strstr(cur_dev->path, "&mi_"); - if (interface_component) { - char *hex_str = interface_component + 4; - char *endptr = NULL; - cur_dev->interface_number = strtol(hex_str, &endptr, 16); - if (endptr == hex_str) { - /* The parsing failed. Set interface_number to -1. */ - cur_dev->interface_number = -1; - } - } - } - } - -cont_close: - CloseHandle(write_handle); -cont: - /* We no longer need the detail data. It can be freed */ - free(device_interface_detail_data); - - device_index++; - - } - - /* Close the device information handle. */ - SetupDiDestroyDeviceInfoList(device_info_set); - - return root; - -} - -void HID_API_EXPORT HID_API_CALL hid_free_enumeration(struct hid_device_info *devs) -{ - /* TODO: Merge this with the Linux version. This function is platform-independent. */ - struct hid_device_info *d = devs; - while (d) { - struct hid_device_info *next = d->next; - free(d->path); - free(d->serial_number); - free(d->manufacturer_string); - free(d->product_string); - free(d); - d = next; - } -} - - -HID_API_EXPORT hid_device * HID_API_CALL hid_open(unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number) -{ - /* TODO: Merge this functions with the Linux version. This function should be platform independent. */ - struct hid_device_info *devs, *cur_dev; - const char *path_to_open = NULL; - hid_device *handle = NULL; - - devs = hid_enumerate(vendor_id, product_id); - cur_dev = devs; - while (cur_dev) { - if (cur_dev->vendor_id == vendor_id && - cur_dev->product_id == product_id) { - if (serial_number) { - if (wcscmp(serial_number, cur_dev->serial_number) == 0) { - path_to_open = cur_dev->path; - break; - } - } - else { - path_to_open = cur_dev->path; - break; - } - } - cur_dev = cur_dev->next; - } - - if (path_to_open) { - /* Open the device */ - handle = hid_open_path(path_to_open); - } - - hid_free_enumeration(devs); - - return handle; -} - -HID_API_EXPORT hid_device * HID_API_CALL hid_open_path(const char *path) -{ - hid_device *dev; - HIDP_CAPS caps; - PHIDP_PREPARSED_DATA pp_data = NULL; - BOOLEAN res; - NTSTATUS nt_res; - - if (hid_init() < 0) { - return NULL; - } - - dev = new_hid_device(); - - /* Open a handle to the device */ - dev->device_handle = open_device(path, FALSE); - - /* Check validity of write_handle. */ - if (dev->device_handle == INVALID_HANDLE_VALUE) { - /* Unable to open the device. */ - register_error(dev, "CreateFile"); - goto err; - } - - /* Set the Input Report buffer size to 64 reports. */ - res = HidD_SetNumInputBuffers(dev->device_handle, 64); - if (!res) { - register_error(dev, "HidD_SetNumInputBuffers"); - goto err; - } - - /* Get the Input Report length for the device. */ - res = HidD_GetPreparsedData(dev->device_handle, &pp_data); - if (!res) { - register_error(dev, "HidD_GetPreparsedData"); - goto err; - } - nt_res = HidP_GetCaps(pp_data, &caps); - if (nt_res != HIDP_STATUS_SUCCESS) { - register_error(dev, "HidP_GetCaps"); - goto err_pp_data; - } - dev->output_report_length = caps.OutputReportByteLength; - dev->input_report_length = caps.InputReportByteLength; - HidD_FreePreparsedData(pp_data); - - dev->read_buf = (char*) malloc(dev->input_report_length); - - return dev; - -err_pp_data: - HidD_FreePreparsedData(pp_data); -err: - free_hid_device(dev); - return NULL; -} - -int HID_API_EXPORT HID_API_CALL hid_write(hid_device *dev, const unsigned char *data, size_t length) -{ - DWORD bytes_written; - BOOL res; - - OVERLAPPED ol; - unsigned char *buf; - memset(&ol, 0, sizeof(ol)); - - /* Make sure the right number of bytes are passed to WriteFile. Windows - expects the number of bytes which are in the _longest_ report (plus - one for the report number) bytes even if the data is a report - which is shorter than that. Windows gives us this value in - caps.OutputReportByteLength. If a user passes in fewer bytes than this, - create a temporary buffer which is the proper size. */ - if (length >= dev->output_report_length) { - /* The user passed the right number of bytes. Use the buffer as-is. */ - buf = (unsigned char *) data; - } else { - /* Create a temporary buffer and copy the user's data - into it, padding the rest with zeros. */ - buf = (unsigned char *) malloc(dev->output_report_length); - memcpy(buf, data, length); - memset(buf + length, 0, dev->output_report_length - length); - length = dev->output_report_length; - } - - res = WriteFile(dev->device_handle, buf, length, NULL, &ol); - - if (!res) { - if (GetLastError() != ERROR_IO_PENDING) { - /* WriteFile() failed. Return error. */ - register_error(dev, "WriteFile"); - bytes_written = -1; - goto end_of_function; - } - } - - /* Wait here until the write is done. This makes - hid_write() synchronous. */ - res = GetOverlappedResult(dev->device_handle, &ol, &bytes_written, TRUE/*wait*/); - if (!res) { - /* The Write operation failed. */ - register_error(dev, "WriteFile"); - bytes_written = -1; - goto end_of_function; - } - -end_of_function: - if (buf != data) - free(buf); - - return bytes_written; -} - - -int HID_API_EXPORT HID_API_CALL hid_read_timeout(hid_device *dev, unsigned char *data, size_t length, int milliseconds) -{ - DWORD bytes_read = 0; - size_t copy_len = 0; - BOOL res; - - /* Copy the handle for convenience. */ - HANDLE ev = dev->ol.hEvent; - - if (!dev->read_pending) { - /* Start an Overlapped I/O read. */ - dev->read_pending = TRUE; - memset(dev->read_buf, 0, dev->input_report_length); - ResetEvent(ev); - res = ReadFile(dev->device_handle, dev->read_buf, dev->input_report_length, &bytes_read, &dev->ol); - - if (!res) { - if (GetLastError() != ERROR_IO_PENDING) { - /* ReadFile() has failed. - Clean up and return error. */ - CancelIo(dev->device_handle); - dev->read_pending = FALSE; - goto end_of_function; - } - } - } - - if (milliseconds >= 0) { - /* See if there is any data yet. */ - res = WaitForSingleObject(ev, milliseconds); - if (res != WAIT_OBJECT_0) { - /* There was no data this time. Return zero bytes available, - but leave the Overlapped I/O running. */ - return 0; - } - } - - /* Either WaitForSingleObject() told us that ReadFile has completed, or - we are in non-blocking mode. Get the number of bytes read. The actual - data has been copied to the data[] array which was passed to ReadFile(). */ - res = GetOverlappedResult(dev->device_handle, &dev->ol, &bytes_read, TRUE/*wait*/); - - /* Set pending back to false, even if GetOverlappedResult() returned error. */ - dev->read_pending = FALSE; - - if (res && bytes_read > 0) { - if (dev->read_buf[0] == 0x0) { - /* If report numbers aren't being used, but Windows sticks a report - number (0x0) on the beginning of the report anyway. To make this - work like the other platforms, and to make it work more like the - HID spec, we'll skip over this byte. */ - bytes_read--; - copy_len = length > bytes_read ? bytes_read : length; - memcpy(data, dev->read_buf+1, copy_len); - } - else { - /* Copy the whole buffer, report number and all. */ - copy_len = length > bytes_read ? bytes_read : length; - memcpy(data, dev->read_buf, copy_len); - } - } - -end_of_function: - if (!res) { - register_error(dev, "GetOverlappedResult"); - return -1; - } - - return copy_len; -} - -int HID_API_EXPORT HID_API_CALL hid_read(hid_device *dev, unsigned char *data, size_t length) -{ - return hid_read_timeout(dev, data, length, (dev->blocking)? -1: 0); -} - -int HID_API_EXPORT HID_API_CALL hid_set_nonblocking(hid_device *dev, int nonblock) -{ - dev->blocking = !nonblock; - return 0; /* Success */ -} - -int HID_API_EXPORT HID_API_CALL hid_send_feature_report(hid_device *dev, const unsigned char *data, size_t length) -{ - BOOL res = HidD_SetFeature(dev->device_handle, (PVOID)data, length); - if (!res) { - register_error(dev, "HidD_SetFeature"); - return -1; - } - - return length; -} - - -int HID_API_EXPORT HID_API_CALL hid_get_feature_report(hid_device *dev, unsigned char *data, size_t length) -{ - BOOL res; -#if 0 - res = HidD_GetFeature(dev->device_handle, data, length); - if (!res) { - register_error(dev, "HidD_GetFeature"); - return -1; - } - return 0; /* HidD_GetFeature() doesn't give us an actual length, unfortunately */ -#else - DWORD bytes_returned; - - OVERLAPPED ol; - memset(&ol, 0, sizeof(ol)); - - res = DeviceIoControl(dev->device_handle, - IOCTL_HID_GET_FEATURE, - data, length, - data, length, - &bytes_returned, &ol); - - if (!res) { - if (GetLastError() != ERROR_IO_PENDING) { - /* DeviceIoControl() failed. Return error. */ - register_error(dev, "Send Feature Report DeviceIoControl"); - return -1; - } - } - - /* Wait here until the write is done. This makes - hid_get_feature_report() synchronous. */ - res = GetOverlappedResult(dev->device_handle, &ol, &bytes_returned, TRUE/*wait*/); - if (!res) { - /* The operation failed. */ - register_error(dev, "Send Feature Report GetOverLappedResult"); - return -1; - } - - /* bytes_returned does not include the first byte which contains the - report ID. The data buffer actually contains one more byte than - bytes_returned. */ - bytes_returned++; - - return bytes_returned; -#endif -} - -void HID_API_EXPORT HID_API_CALL hid_close(hid_device *dev) -{ - if (!dev) - return; - CancelIo(dev->device_handle); - free_hid_device(dev); -} - -int HID_API_EXPORT_CALL HID_API_CALL hid_get_manufacturer_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - BOOL res; - - res = HidD_GetManufacturerString(dev->device_handle, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS)); - if (!res) { - register_error(dev, "HidD_GetManufacturerString"); - return -1; - } - - return 0; -} - -int HID_API_EXPORT_CALL HID_API_CALL hid_get_product_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - BOOL res; - - res = HidD_GetProductString(dev->device_handle, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS)); - if (!res) { - register_error(dev, "HidD_GetProductString"); - return -1; - } - - return 0; -} - -int HID_API_EXPORT_CALL HID_API_CALL hid_get_serial_number_string(hid_device *dev, wchar_t *string, size_t maxlen) -{ - BOOL res; - - res = HidD_GetSerialNumberString(dev->device_handle, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS)); - if (!res) { - register_error(dev, "HidD_GetSerialNumberString"); - return -1; - } - - return 0; -} - -int HID_API_EXPORT_CALL HID_API_CALL hid_get_indexed_string(hid_device *dev, int string_index, wchar_t *string, size_t maxlen) -{ - BOOL res; - - res = HidD_GetIndexedString(dev->device_handle, string_index, string, sizeof(wchar_t) * MIN(maxlen, MAX_STRING_WCHARS)); - if (!res) { - register_error(dev, "HidD_GetIndexedString"); - return -1; - } - - return 0; -} - - -HID_API_EXPORT const wchar_t * HID_API_CALL hid_error(hid_device *dev) -{ - return (wchar_t*)dev->last_error_str; -} - - -/*#define PICPGM*/ -/*#define S11*/ -#define P32 -#ifdef S11 - unsigned short VendorID = 0xa0a0; - unsigned short ProductID = 0x0001; -#endif - -#ifdef P32 - unsigned short VendorID = 0x04d8; - unsigned short ProductID = 0x3f; -#endif - - -#ifdef PICPGM - unsigned short VendorID = 0x04d8; - unsigned short ProductID = 0x0033; -#endif - - -#if 0 -int __cdecl main(int argc, char* argv[]) -{ - int res; - unsigned char buf[65]; - - UNREFERENCED_PARAMETER(argc); - UNREFERENCED_PARAMETER(argv); - - /* Set up the command buffer. */ - memset(buf,0x00,sizeof(buf)); - buf[0] = 0; - buf[1] = 0x81; - - - /* Open the device. */ - int handle = open(VendorID, ProductID, L"12345"); - if (handle < 0) - printf("unable to open device\n"); - - - /* Toggle LED (cmd 0x80) */ - buf[1] = 0x80; - res = write(handle, buf, 65); - if (res < 0) - printf("Unable to write()\n"); - - /* Request state (cmd 0x81) */ - buf[1] = 0x81; - write(handle, buf, 65); - if (res < 0) - printf("Unable to write() (2)\n"); - - /* Read requested state */ - read(handle, buf, 65); - if (res < 0) - printf("Unable to read()\n"); - - /* Print out the returned buffer. */ - for (int i = 0; i < 4; i++) - printf("buf[%d]: %d\n", i, buf[i]); - - return 0; -} -#endif - -#ifdef __cplusplus -} /* extern "C" */ -#endif diff --git a/vendor/github.com/karalabe/hid/libusb/AUTHORS b/vendor/github.com/karalabe/hid/libusb/AUTHORS deleted file mode 100644 index 70d407bd19f9..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/AUTHORS +++ /dev/null @@ -1,89 +0,0 @@ -Copyright © 2001 Johannes Erdfelt -Copyright © 2007-2009 Daniel Drake -Copyright © 2010-2012 Peter Stuge -Copyright © 2008-2016 Nathan Hjelm -Copyright © 2009-2013 Pete Batard -Copyright © 2009-2013 Ludovic Rousseau -Copyright © 2010-2012 Michael Plante -Copyright © 2011-2013 Hans de Goede -Copyright © 2012-2013 Martin Pieuchot -Copyright © 2012-2013 Toby Gray -Copyright © 2013-2015 Chris Dickens - -Other contributors: -Akshay Jaggi -Alan Ott -Alan Stern -Alex Vatchenko -Andrew Fernandes -Anthony Clay -Antonio Ospite -Artem Egorkine -Aurelien Jarno -Bastien Nocera -Bei Zhang -Benjamin Dobell -Carl Karsten -Colin Walters -Dave Camarillo -David Engraf -David Moore -Davidlohr Bueso -Federico Manzan -Felipe Balbi -Florian Albrechtskirchinger -Francesco Montorsi -Francisco Facioni -Gaurav Gupta -Graeme Gill -Gustavo Zacarias -Hans Ulrich Niedermann -Hector Martin -Hoi-Ho Chan -Ilya Konstantinov -James Hanko -John Sheu -Joshua Blake -Justin Bischoff -Karsten Koenig -Konrad Rzepecki -Kuangye Guo -Lars Kanis -Lars Wirzenius -Luca Longinotti -Marcus Meissner -Markus Heidelberg -Martin Ettl -Martin Koegler -Matthias Bolte -Mike Frysinger -Mikhail Gusarov -Moritz Fischer -Ларионов Даниил -Nicholas Corgan -Omri Iluz -Orin Eman -Paul Fertser -Pekka Nikander -Rob Walker -Sean McBride -Sebastian Pipping -Simon Haggett -Simon Newton -Thomas Röfer -Tim Hutt -Tim Roberts -Tobias Klauser -Toby Peterson -Tormod Volden -Trygve Laugstøl -Uri Lublin -Vasily Khoruzhick -Vegard Storheil Eriksen -Venkatesh Shukla -Vitali Lovich -Xiaofan Chen -Zoltán Kovács -Роман Донченко -parafin -xantares diff --git a/vendor/github.com/karalabe/hid/libusb/COPYING b/vendor/github.com/karalabe/hid/libusb/COPYING deleted file mode 100644 index 5ab7695ab8ca..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/COPYING +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This 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 2.1 of the License, or (at your option) any later version. - - This 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 this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/config.h b/vendor/github.com/karalabe/hid/libusb/libusb/config.h deleted file mode 100644 index e004f03cd460..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/config.h +++ /dev/null @@ -1,3 +0,0 @@ -#ifndef CONFIG_H -#define CONFIG_H -#endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/core.c b/vendor/github.com/karalabe/hid/libusb/libusb/core.c deleted file mode 100644 index d45bfe177e7b..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/core.c +++ /dev/null @@ -1,2523 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ -/* - * Core functions for libusb - * Copyright © 2012-2013 Nathan Hjelm - * Copyright © 2007-2008 Daniel Drake - * Copyright © 2001 Johannes Erdfelt - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "config.h" - -#include -#include -#include -#include -#include -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#ifdef HAVE_SYS_TIME_H -#include -#endif -#ifdef HAVE_SYSLOG_H -#include -#endif - -#ifdef __ANDROID__ -#include -#endif - -#include "libusbi.h" -#include "hotplug.h" - -#if defined(OS_LINUX) -const struct usbi_os_backend * const usbi_backend = &linux_usbfs_backend; -#elif defined(OS_DARWIN) -const struct usbi_os_backend * const usbi_backend = &darwin_backend; -#elif defined(OS_OPENBSD) -const struct usbi_os_backend * const usbi_backend = &openbsd_backend; -#elif defined(OS_NETBSD) -const struct usbi_os_backend * const usbi_backend = &netbsd_backend; -#elif defined(OS_WINDOWS) - -#if defined(USE_USBDK) -const struct usbi_os_backend * const usbi_backend = &usbdk_backend; -#else -const struct usbi_os_backend * const usbi_backend = &windows_backend; -#endif - -#elif defined(OS_WINCE) -const struct usbi_os_backend * const usbi_backend = &wince_backend; -#elif defined(OS_HAIKU) -const struct usbi_os_backend * const usbi_backend = &haiku_usb_raw_backend; -#elif defined (OS_SUNOS) -const struct usbi_os_backend * const usbi_backend = &sunos_backend; -#else -#error "Unsupported OS" -#endif - -struct libusb_context *usbi_default_context = NULL; -static const struct libusb_version libusb_version_internal = - { LIBUSB_MAJOR, LIBUSB_MINOR, LIBUSB_MICRO, LIBUSB_NANO, - LIBUSB_RC, "http://libusb.info" }; -static int default_context_refcnt = 0; -static usbi_mutex_static_t default_context_lock = USBI_MUTEX_INITIALIZER; -static struct timespec timestamp_origin = { 0, 0 }; - -usbi_mutex_static_t active_contexts_lock = USBI_MUTEX_INITIALIZER; -struct list_head active_contexts_list; - -/** - * \mainpage libusb-1.0 API Reference - * - * \section intro Introduction - * - * libusb is an open source library that allows you to communicate with USB - * devices from userspace. For more info, see the - * libusb homepage. - * - * This documentation is aimed at application developers wishing to - * communicate with USB peripherals from their own software. After reviewing - * this documentation, feedback and questions can be sent to the - * libusb-devel mailing list. - * - * This documentation assumes knowledge of how to operate USB devices from - * a software standpoint (descriptors, configurations, interfaces, endpoints, - * control/bulk/interrupt/isochronous transfers, etc). Full information - * can be found in the USB 3.0 - * Specification which is available for free download. You can probably - * find less verbose introductions by searching the web. - * - * \section API Application Programming Interface (API) - * - * See the \ref libusb_api page for a complete list of the libusb functions. - * - * \section features Library features - * - * - All transfer types supported (control/bulk/interrupt/isochronous) - * - 2 transfer interfaces: - * -# Synchronous (simple) - * -# Asynchronous (more complicated, but more powerful) - * - Thread safe (although the asynchronous interface means that you - * usually won't need to thread) - * - Lightweight with lean API - * - Compatible with libusb-0.1 through the libusb-compat-0.1 translation layer - * - Hotplug support (on some platforms). See \ref libusb_hotplug. - * - * \section gettingstarted Getting Started - * - * To begin reading the API documentation, start with the Modules page which - * links to the different categories of libusb's functionality. - * - * One decision you will have to make is whether to use the synchronous - * or the asynchronous data transfer interface. The \ref libusb_io documentation - * provides some insight into this topic. - * - * Some example programs can be found in the libusb source distribution under - * the "examples" subdirectory. The libusb homepage includes a list of - * real-life project examples which use libusb. - * - * \section errorhandling Error handling - * - * libusb functions typically return 0 on success or a negative error code - * on failure. These negative error codes relate to LIBUSB_ERROR constants - * which are listed on the \ref libusb_misc "miscellaneous" documentation page. - * - * \section msglog Debug message logging - * - * libusb uses stderr for all logging. By default, logging is set to NONE, - * which means that no output will be produced. However, unless the library - * has been compiled with logging disabled, then any application calls to - * libusb_set_debug(), or the setting of the environmental variable - * LIBUSB_DEBUG outside of the application, can result in logging being - * produced. Your application should therefore not close stderr, but instead - * direct it to the null device if its output is undesirable. - * - * The libusb_set_debug() function can be used to enable logging of certain - * messages. Under standard configuration, libusb doesn't really log much - * so you are advised to use this function to enable all error/warning/ - * informational messages. It will help debug problems with your software. - * - * The logged messages are unstructured. There is no one-to-one correspondence - * between messages being logged and success or failure return codes from - * libusb functions. There is no format to the messages, so you should not - * try to capture or parse them. They are not and will not be localized. - * These messages are not intended to being passed to your application user; - * instead, you should interpret the error codes returned from libusb functions - * and provide appropriate notification to the user. The messages are simply - * there to aid you as a programmer, and if you're confused because you're - * getting a strange error code from a libusb function, enabling message - * logging may give you a suitable explanation. - * - * The LIBUSB_DEBUG environment variable can be used to enable message logging - * at run-time. This environment variable should be set to a log level number, - * which is interpreted the same as the libusb_set_debug() parameter. When this - * environment variable is set, the message logging verbosity level is fixed - * and libusb_set_debug() effectively does nothing. - * - * libusb can be compiled without any logging functions, useful for embedded - * systems. In this case, libusb_set_debug() and the LIBUSB_DEBUG environment - * variable have no effects. - * - * libusb can also be compiled with verbose debugging messages always. When - * the library is compiled in this way, all messages of all verbosities are - * always logged. libusb_set_debug() and the LIBUSB_DEBUG environment variable - * have no effects. - * - * \section remarks Other remarks - * - * libusb does have imperfections. The \ref libusb_caveats "caveats" page attempts - * to document these. - */ - -/** - * \page libusb_caveats Caveats - * - * \section devresets Device resets - * - * The libusb_reset_device() function allows you to reset a device. If your - * program has to call such a function, it should obviously be aware that - * the reset will cause device state to change (e.g. register values may be - * reset). - * - * The problem is that any other program could reset the device your program - * is working with, at any time. libusb does not offer a mechanism to inform - * you when this has happened, so if someone else resets your device it will - * not be clear to your own program why the device state has changed. - * - * Ultimately, this is a limitation of writing drivers in userspace. - * Separation from the USB stack in the underlying kernel makes it difficult - * for the operating system to deliver such notifications to your program. - * The Linux kernel USB stack allows such reset notifications to be delivered - * to in-kernel USB drivers, but it is not clear how such notifications could - * be delivered to second-class drivers that live in userspace. - * - * \section blockonly Blocking-only functionality - * - * The functionality listed below is only available through synchronous, - * blocking functions. There are no asynchronous/non-blocking alternatives, - * and no clear ways of implementing these. - * - * - Configuration activation (libusb_set_configuration()) - * - Interface/alternate setting activation (libusb_set_interface_alt_setting()) - * - Releasing of interfaces (libusb_release_interface()) - * - Clearing of halt/stall condition (libusb_clear_halt()) - * - Device resets (libusb_reset_device()) - * - * \section configsel Configuration selection and handling - * - * When libusb presents a device handle to an application, there is a chance - * that the corresponding device may be in unconfigured state. For devices - * with multiple configurations, there is also a chance that the configuration - * currently selected is not the one that the application wants to use. - * - * The obvious solution is to add a call to libusb_set_configuration() early - * on during your device initialization routines, but there are caveats to - * be aware of: - * -# If the device is already in the desired configuration, calling - * libusb_set_configuration() using the same configuration value will cause - * a lightweight device reset. This may not be desirable behaviour. - * -# In the case where the desired configuration is already active, libusb - * may not even be able to perform a lightweight device reset. For example, - * take my USB keyboard with fingerprint reader: I'm interested in driving - * the fingerprint reader interface through libusb, but the kernel's - * USB-HID driver will almost always have claimed the keyboard interface. - * Because the kernel has claimed an interface, it is not even possible to - * perform the lightweight device reset, so libusb_set_configuration() will - * fail. (Luckily the device in question only has a single configuration.) - * -# libusb will be unable to set a configuration if other programs or - * drivers have claimed interfaces. In particular, this means that kernel - * drivers must be detached from all the interfaces before - * libusb_set_configuration() may succeed. - * - * One solution to some of the above problems is to consider the currently - * active configuration. If the configuration we want is already active, then - * we don't have to select any configuration: -\code -cfg = -1; -libusb_get_configuration(dev, &cfg); -if (cfg != desired) - libusb_set_configuration(dev, desired); -\endcode - * - * This is probably suitable for most scenarios, but is inherently racy: - * another application or driver may change the selected configuration - * after the libusb_get_configuration() call. - * - * Even in cases where libusb_set_configuration() succeeds, consider that other - * applications or drivers may change configuration after your application - * calls libusb_set_configuration(). - * - * One possible way to lock your device into a specific configuration is as - * follows: - * -# Set the desired configuration (or use the logic above to realise that - * it is already in the desired configuration) - * -# Claim the interface that you wish to use - * -# Check that the currently active configuration is the one that you want - * to use. - * - * The above method works because once an interface is claimed, no application - * or driver is able to select another configuration. - * - * \section earlycomp Early transfer completion - * - * NOTE: This section is currently Linux-centric. I am not sure if any of these - * considerations apply to Darwin or other platforms. - * - * When a transfer completes early (i.e. when less data is received/sent in - * any one packet than the transfer buffer allows for) then libusb is designed - * to terminate the transfer immediately, not transferring or receiving any - * more data unless other transfers have been queued by the user. - * - * On legacy platforms, libusb is unable to do this in all situations. After - * the incomplete packet occurs, "surplus" data may be transferred. For recent - * versions of libusb, this information is kept (the data length of the - * transfer is updated) and, for device-to-host transfers, any surplus data was - * added to the buffer. Still, this is not a nice solution because it loses the - * information about the end of the short packet, and the user probably wanted - * that surplus data to arrive in the next logical transfer. - * - * - * \section zlp Zero length packets - * - * - libusb is able to send a packet of zero length to an endpoint simply by - * submitting a transfer of zero length. - * - The \ref libusb_transfer_flags::LIBUSB_TRANSFER_ADD_ZERO_PACKET - * "LIBUSB_TRANSFER_ADD_ZERO_PACKET" flag is currently only supported on Linux. - */ - -/** - * \page libusb_contexts Contexts - * - * It is possible that libusb may be used simultaneously from two independent - * libraries linked into the same executable. For example, if your application - * has a plugin-like system which allows the user to dynamically load a range - * of modules into your program, it is feasible that two independently - * developed modules may both use libusb. - * - * libusb is written to allow for these multiple user scenarios. The two - * "instances" of libusb will not interfere: libusb_set_debug() calls - * from one user will not affect the same settings for other users, other - * users can continue using libusb after one of them calls libusb_exit(), etc. - * - * This is made possible through libusb's context concept. When you - * call libusb_init(), you are (optionally) given a context. You can then pass - * this context pointer back into future libusb functions. - * - * In order to keep things simple for more simplistic applications, it is - * legal to pass NULL to all functions requiring a context pointer (as long as - * you're sure no other code will attempt to use libusb from the same process). - * When you pass NULL, the default context will be used. The default context - * is created the first time a process calls libusb_init() when no other - * context is alive. Contexts are destroyed during libusb_exit(). - * - * The default context is reference-counted and can be shared. That means that - * if libusb_init(NULL) is called twice within the same process, the two - * users end up sharing the same context. The deinitialization and freeing of - * the default context will only happen when the last user calls libusb_exit(). - * In other words, the default context is created and initialized when its - * reference count goes from 0 to 1, and is deinitialized and destroyed when - * its reference count goes from 1 to 0. - * - * You may be wondering why only a subset of libusb functions require a - * context pointer in their function definition. Internally, libusb stores - * context pointers in other objects (e.g. libusb_device instances) and hence - * can infer the context from those objects. - */ - - /** - * \page libusb_api Application Programming Interface - * - * This is the complete list of libusb functions, structures and - * enumerations in alphabetical order. - * - * \section Functions - * - libusb_alloc_streams() - * - libusb_alloc_transfer() - * - libusb_attach_kernel_driver() - * - libusb_bulk_transfer() - * - libusb_cancel_transfer() - * - libusb_claim_interface() - * - libusb_clear_halt() - * - libusb_close() - * - libusb_control_transfer() - * - libusb_control_transfer_get_data() - * - libusb_control_transfer_get_setup() - * - libusb_cpu_to_le16() - * - libusb_detach_kernel_driver() - * - libusb_dev_mem_alloc() - * - libusb_dev_mem_free() - * - libusb_error_name() - * - libusb_event_handler_active() - * - libusb_event_handling_ok() - * - libusb_exit() - * - libusb_fill_bulk_stream_transfer() - * - libusb_fill_bulk_transfer() - * - libusb_fill_control_setup() - * - libusb_fill_control_transfer() - * - libusb_fill_interrupt_transfer() - * - libusb_fill_iso_transfer() - * - libusb_free_bos_descriptor() - * - libusb_free_config_descriptor() - * - libusb_free_container_id_descriptor() - * - libusb_free_device_list() - * - libusb_free_pollfds() - * - libusb_free_ss_endpoint_companion_descriptor() - * - libusb_free_ss_usb_device_capability_descriptor() - * - libusb_free_streams() - * - libusb_free_transfer() - * - libusb_free_usb_2_0_extension_descriptor() - * - libusb_get_active_config_descriptor() - * - libusb_get_bos_descriptor() - * - libusb_get_bus_number() - * - libusb_get_config_descriptor() - * - libusb_get_config_descriptor_by_value() - * - libusb_get_configuration() - * - libusb_get_container_id_descriptor() - * - libusb_get_descriptor() - * - libusb_get_device() - * - libusb_get_device_address() - * - libusb_get_device_descriptor() - * - libusb_get_device_list() - * - libusb_get_device_speed() - * - libusb_get_iso_packet_buffer() - * - libusb_get_iso_packet_buffer_simple() - * - libusb_get_max_iso_packet_size() - * - libusb_get_max_packet_size() - * - libusb_get_next_timeout() - * - libusb_get_parent() - * - libusb_get_pollfds() - * - libusb_get_port_number() - * - libusb_get_port_numbers() - * - libusb_get_port_path() - * - libusb_get_ss_endpoint_companion_descriptor() - * - libusb_get_ss_usb_device_capability_descriptor() - * - libusb_get_string_descriptor() - * - libusb_get_string_descriptor_ascii() - * - libusb_get_usb_2_0_extension_descriptor() - * - libusb_get_version() - * - libusb_handle_events() - * - libusb_handle_events_completed() - * - libusb_handle_events_locked() - * - libusb_handle_events_timeout() - * - libusb_handle_events_timeout_completed() - * - libusb_has_capability() - * - libusb_hotplug_deregister_callback() - * - libusb_hotplug_register_callback() - * - libusb_init() - * - libusb_interrupt_event_handler() - * - libusb_interrupt_transfer() - * - libusb_kernel_driver_active() - * - libusb_lock_events() - * - libusb_lock_event_waiters() - * - libusb_open() - * - libusb_open_device_with_vid_pid() - * - libusb_pollfds_handle_timeouts() - * - libusb_ref_device() - * - libusb_release_interface() - * - libusb_reset_device() - * - libusb_set_auto_detach_kernel_driver() - * - libusb_set_configuration() - * - libusb_set_debug() - * - libusb_set_interface_alt_setting() - * - libusb_set_iso_packet_lengths() - * - libusb_setlocale() - * - libusb_set_pollfd_notifiers() - * - libusb_strerror() - * - libusb_submit_transfer() - * - libusb_transfer_get_stream_id() - * - libusb_transfer_set_stream_id() - * - libusb_try_lock_events() - * - libusb_unlock_events() - * - libusb_unlock_event_waiters() - * - libusb_unref_device() - * - libusb_wait_for_event() - * - * \section Structures - * - libusb_bos_descriptor - * - libusb_bos_dev_capability_descriptor - * - libusb_config_descriptor - * - libusb_container_id_descriptor - * - \ref libusb_context - * - libusb_control_setup - * - \ref libusb_device - * - libusb_device_descriptor - * - \ref libusb_device_handle - * - libusb_endpoint_descriptor - * - libusb_interface - * - libusb_interface_descriptor - * - libusb_iso_packet_descriptor - * - libusb_pollfd - * - libusb_ss_endpoint_companion_descriptor - * - libusb_ss_usb_device_capability_descriptor - * - libusb_transfer - * - libusb_usb_2_0_extension_descriptor - * - libusb_version - * - * \section Enums - * - \ref libusb_bos_type - * - \ref libusb_capability - * - \ref libusb_class_code - * - \ref libusb_descriptor_type - * - \ref libusb_endpoint_direction - * - \ref libusb_error - * - \ref libusb_iso_sync_type - * - \ref libusb_iso_usage_type - * - \ref libusb_log_level - * - \ref libusb_request_recipient - * - \ref libusb_request_type - * - \ref libusb_speed - * - \ref libusb_ss_usb_device_capability_attributes - * - \ref libusb_standard_request - * - \ref libusb_supported_speed - * - \ref libusb_transfer_flags - * - \ref libusb_transfer_status - * - \ref libusb_transfer_type - * - \ref libusb_usb_2_0_extension_attributes - */ - -/** - * @defgroup libusb_lib Library initialization/deinitialization - * This page details how to initialize and deinitialize libusb. Initialization - * must be performed before using any libusb functionality, and similarly you - * must not call any libusb functions after deinitialization. - */ - -/** - * @defgroup libusb_dev Device handling and enumeration - * The functionality documented below is designed to help with the following - * operations: - * - Enumerating the USB devices currently attached to the system - * - Choosing a device to operate from your software - * - Opening and closing the chosen device - * - * \section nutshell In a nutshell... - * - * The description below really makes things sound more complicated than they - * actually are. The following sequence of function calls will be suitable - * for almost all scenarios and does not require you to have such a deep - * understanding of the resource management issues: - * \code -// discover devices -libusb_device **list; -libusb_device *found = NULL; -ssize_t cnt = libusb_get_device_list(NULL, &list); -ssize_t i = 0; -int err = 0; -if (cnt < 0) - error(); - -for (i = 0; i < cnt; i++) { - libusb_device *device = list[i]; - if (is_interesting(device)) { - found = device; - break; - } -} - -if (found) { - libusb_device_handle *handle; - - err = libusb_open(found, &handle); - if (err) - error(); - // etc -} - -libusb_free_device_list(list, 1); -\endcode - * - * The two important points: - * - You asked libusb_free_device_list() to unreference the devices (2nd - * parameter) - * - You opened the device before freeing the list and unreferencing the - * devices - * - * If you ended up with a handle, you can now proceed to perform I/O on the - * device. - * - * \section devshandles Devices and device handles - * libusb has a concept of a USB device, represented by the - * \ref libusb_device opaque type. A device represents a USB device that - * is currently or was previously connected to the system. Using a reference - * to a device, you can determine certain information about the device (e.g. - * you can read the descriptor data). - * - * The libusb_get_device_list() function can be used to obtain a list of - * devices currently connected to the system. This is known as device - * discovery. - * - * Just because you have a reference to a device does not mean it is - * necessarily usable. The device may have been unplugged, you may not have - * permission to operate such device, or another program or driver may be - * using the device. - * - * When you've found a device that you'd like to operate, you must ask - * libusb to open the device using the libusb_open() function. Assuming - * success, libusb then returns you a device handle - * (a \ref libusb_device_handle pointer). All "real" I/O operations then - * operate on the handle rather than the original device pointer. - * - * \section devref Device discovery and reference counting - * - * Device discovery (i.e. calling libusb_get_device_list()) returns a - * freshly-allocated list of devices. The list itself must be freed when - * you are done with it. libusb also needs to know when it is OK to free - * the contents of the list - the devices themselves. - * - * To handle these issues, libusb provides you with two separate items: - * - A function to free the list itself - * - A reference counting system for the devices inside - * - * New devices presented by the libusb_get_device_list() function all have a - * reference count of 1. You can increase and decrease reference count using - * libusb_ref_device() and libusb_unref_device(). A device is destroyed when - * its reference count reaches 0. - * - * With the above information in mind, the process of opening a device can - * be viewed as follows: - * -# Discover devices using libusb_get_device_list(). - * -# Choose the device that you want to operate, and call libusb_open(). - * -# Unref all devices in the discovered device list. - * -# Free the discovered device list. - * - * The order is important - you must not unreference the device before - * attempting to open it, because unreferencing it may destroy the device. - * - * For convenience, the libusb_free_device_list() function includes a - * parameter to optionally unreference all the devices in the list before - * freeing the list itself. This combines steps 3 and 4 above. - * - * As an implementation detail, libusb_open() actually adds a reference to - * the device in question. This is because the device remains available - * through the handle via libusb_get_device(). The reference is deleted during - * libusb_close(). - */ - -/** @defgroup libusb_misc Miscellaneous */ - -/* we traverse usbfs without knowing how many devices we are going to find. - * so we create this discovered_devs model which is similar to a linked-list - * which grows when required. it can be freed once discovery has completed, - * eliminating the need for a list node in the libusb_device structure - * itself. */ -#define DISCOVERED_DEVICES_SIZE_STEP 8 - -static struct discovered_devs *discovered_devs_alloc(void) -{ - struct discovered_devs *ret = - malloc(sizeof(*ret) + (sizeof(void *) * DISCOVERED_DEVICES_SIZE_STEP)); - - if (ret) { - ret->len = 0; - ret->capacity = DISCOVERED_DEVICES_SIZE_STEP; - } - return ret; -} - -static void discovered_devs_free(struct discovered_devs *discdevs) -{ - size_t i; - - for (i = 0; i < discdevs->len; i++) - libusb_unref_device(discdevs->devices[i]); - - free(discdevs); -} - -/* append a device to the discovered devices collection. may realloc itself, - * returning new discdevs. returns NULL on realloc failure. */ -struct discovered_devs *discovered_devs_append( - struct discovered_devs *discdevs, struct libusb_device *dev) -{ - size_t len = discdevs->len; - size_t capacity; - struct discovered_devs *new_discdevs; - - /* if there is space, just append the device */ - if (len < discdevs->capacity) { - discdevs->devices[len] = libusb_ref_device(dev); - discdevs->len++; - return discdevs; - } - - /* exceeded capacity, need to grow */ - usbi_dbg("need to increase capacity"); - capacity = discdevs->capacity + DISCOVERED_DEVICES_SIZE_STEP; - /* can't use usbi_reallocf here because in failure cases it would - * free the existing discdevs without unreferencing its devices. */ - new_discdevs = realloc(discdevs, - sizeof(*discdevs) + (sizeof(void *) * capacity)); - if (!new_discdevs) { - discovered_devs_free(discdevs); - return NULL; - } - - discdevs = new_discdevs; - discdevs->capacity = capacity; - discdevs->devices[len] = libusb_ref_device(dev); - discdevs->len++; - - return discdevs; -} - -/* Allocate a new device with a specific session ID. The returned device has - * a reference count of 1. */ -struct libusb_device *usbi_alloc_device(struct libusb_context *ctx, - unsigned long session_id) -{ - size_t priv_size = usbi_backend->device_priv_size; - struct libusb_device *dev = calloc(1, sizeof(*dev) + priv_size); - int r; - - if (!dev) - return NULL; - - r = usbi_mutex_init(&dev->lock); - if (r) { - free(dev); - return NULL; - } - - dev->ctx = ctx; - dev->refcnt = 1; - dev->session_data = session_id; - dev->speed = LIBUSB_SPEED_UNKNOWN; - - if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { - usbi_connect_device (dev); - } - - return dev; -} - -void usbi_connect_device(struct libusb_device *dev) -{ - struct libusb_context *ctx = DEVICE_CTX(dev); - - dev->attached = 1; - - usbi_mutex_lock(&dev->ctx->usb_devs_lock); - list_add(&dev->list, &dev->ctx->usb_devs); - usbi_mutex_unlock(&dev->ctx->usb_devs_lock); - - /* Signal that an event has occurred for this device if we support hotplug AND - * the hotplug message list is ready. This prevents an event from getting raised - * during initial enumeration. */ - if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->hotplug_msgs.next) { - usbi_hotplug_notification(ctx, dev, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED); - } -} - -void usbi_disconnect_device(struct libusb_device *dev) -{ - struct libusb_context *ctx = DEVICE_CTX(dev); - - usbi_mutex_lock(&dev->lock); - dev->attached = 0; - usbi_mutex_unlock(&dev->lock); - - usbi_mutex_lock(&ctx->usb_devs_lock); - list_del(&dev->list); - usbi_mutex_unlock(&ctx->usb_devs_lock); - - /* Signal that an event has occurred for this device if we support hotplug AND - * the hotplug message list is ready. This prevents an event from getting raised - * during initial enumeration. libusb_handle_events will take care of dereferencing - * the device. */ - if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG) && dev->ctx->hotplug_msgs.next) { - usbi_hotplug_notification(ctx, dev, LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT); - } -} - -/* Perform some final sanity checks on a newly discovered device. If this - * function fails (negative return code), the device should not be added - * to the discovered device list. */ -int usbi_sanitize_device(struct libusb_device *dev) -{ - int r; - uint8_t num_configurations; - - r = usbi_device_cache_descriptor(dev); - if (r < 0) - return r; - - num_configurations = dev->device_descriptor.bNumConfigurations; - if (num_configurations > USB_MAXCONFIG) { - usbi_err(DEVICE_CTX(dev), "too many configurations"); - return LIBUSB_ERROR_IO; - } else if (0 == num_configurations) - usbi_dbg("zero configurations, maybe an unauthorized device"); - - dev->num_configurations = num_configurations; - return 0; -} - -/* Examine libusb's internal list of known devices, looking for one with - * a specific session ID. Returns the matching device if it was found, and - * NULL otherwise. */ -struct libusb_device *usbi_get_device_by_session_id(struct libusb_context *ctx, - unsigned long session_id) -{ - struct libusb_device *dev; - struct libusb_device *ret = NULL; - - usbi_mutex_lock(&ctx->usb_devs_lock); - list_for_each_entry(dev, &ctx->usb_devs, list, struct libusb_device) - if (dev->session_data == session_id) { - ret = libusb_ref_device(dev); - break; - } - usbi_mutex_unlock(&ctx->usb_devs_lock); - - return ret; -} - -/** @ingroup libusb_dev - * Returns a list of USB devices currently attached to the system. This is - * your entry point into finding a USB device to operate. - * - * You are expected to unreference all the devices when you are done with - * them, and then free the list with libusb_free_device_list(). Note that - * libusb_free_device_list() can unref all the devices for you. Be careful - * not to unreference a device you are about to open until after you have - * opened it. - * - * This return value of this function indicates the number of devices in - * the resultant list. The list is actually one element larger, as it is - * NULL-terminated. - * - * \param ctx the context to operate on, or NULL for the default context - * \param list output location for a list of devices. Must be later freed with - * libusb_free_device_list(). - * \returns the number of devices in the outputted list, or any - * \ref libusb_error according to errors encountered by the backend. - */ -ssize_t API_EXPORTED libusb_get_device_list(libusb_context *ctx, - libusb_device ***list) -{ - struct discovered_devs *discdevs = discovered_devs_alloc(); - struct libusb_device **ret; - int r = 0; - ssize_t i, len; - USBI_GET_CONTEXT(ctx); - usbi_dbg(""); - - if (!discdevs) - return LIBUSB_ERROR_NO_MEM; - - if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { - /* backend provides hotplug support */ - struct libusb_device *dev; - - if (usbi_backend->hotplug_poll) - usbi_backend->hotplug_poll(); - - usbi_mutex_lock(&ctx->usb_devs_lock); - list_for_each_entry(dev, &ctx->usb_devs, list, struct libusb_device) { - discdevs = discovered_devs_append(discdevs, dev); - - if (!discdevs) { - r = LIBUSB_ERROR_NO_MEM; - break; - } - } - usbi_mutex_unlock(&ctx->usb_devs_lock); - } else { - /* backend does not provide hotplug support */ - r = usbi_backend->get_device_list(ctx, &discdevs); - } - - if (r < 0) { - len = r; - goto out; - } - - /* convert discovered_devs into a list */ - len = discdevs->len; - ret = calloc(len + 1, sizeof(struct libusb_device *)); - if (!ret) { - len = LIBUSB_ERROR_NO_MEM; - goto out; - } - - ret[len] = NULL; - for (i = 0; i < len; i++) { - struct libusb_device *dev = discdevs->devices[i]; - ret[i] = libusb_ref_device(dev); - } - *list = ret; - -out: - if (discdevs) - discovered_devs_free(discdevs); - return len; -} - -/** \ingroup libusb_dev - * Frees a list of devices previously discovered using - * libusb_get_device_list(). If the unref_devices parameter is set, the - * reference count of each device in the list is decremented by 1. - * \param list the list to free - * \param unref_devices whether to unref the devices in the list - */ -void API_EXPORTED libusb_free_device_list(libusb_device **list, - int unref_devices) -{ - if (!list) - return; - - if (unref_devices) { - int i = 0; - struct libusb_device *dev; - - while ((dev = list[i++]) != NULL) - libusb_unref_device(dev); - } - free(list); -} - -/** \ingroup libusb_dev - * Get the number of the bus that a device is connected to. - * \param dev a device - * \returns the bus number - */ -uint8_t API_EXPORTED libusb_get_bus_number(libusb_device *dev) -{ - return dev->bus_number; -} - -/** \ingroup libusb_dev - * Get the number of the port that a device is connected to. - * Unless the OS does something funky, or you are hot-plugging USB extension cards, - * the port number returned by this call is usually guaranteed to be uniquely tied - * to a physical port, meaning that different devices plugged on the same physical - * port should return the same port number. - * - * But outside of this, there is no guarantee that the port number returned by this - * call will remain the same, or even match the order in which ports have been - * numbered by the HUB/HCD manufacturer. - * - * \param dev a device - * \returns the port number (0 if not available) - */ -uint8_t API_EXPORTED libusb_get_port_number(libusb_device *dev) -{ - return dev->port_number; -} - -/** \ingroup libusb_dev - * Get the list of all port numbers from root for the specified device - * - * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 - * \param dev a device - * \param port_numbers the array that should contain the port numbers - * \param port_numbers_len the maximum length of the array. As per the USB 3.0 - * specs, the current maximum limit for the depth is 7. - * \returns the number of elements filled - * \returns LIBUSB_ERROR_OVERFLOW if the array is too small - */ -int API_EXPORTED libusb_get_port_numbers(libusb_device *dev, - uint8_t* port_numbers, int port_numbers_len) -{ - int i = port_numbers_len; - struct libusb_context *ctx = DEVICE_CTX(dev); - - if (port_numbers_len <= 0) - return LIBUSB_ERROR_INVALID_PARAM; - - // HCDs can be listed as devices with port #0 - while((dev) && (dev->port_number != 0)) { - if (--i < 0) { - usbi_warn(ctx, "port numbers array is too small"); - return LIBUSB_ERROR_OVERFLOW; - } - port_numbers[i] = dev->port_number; - dev = dev->parent_dev; - } - if (i < port_numbers_len) - memmove(port_numbers, &port_numbers[i], port_numbers_len - i); - return port_numbers_len - i; -} - -/** \ingroup libusb_dev - * Deprecated please use libusb_get_port_numbers instead. - */ -int API_EXPORTED libusb_get_port_path(libusb_context *ctx, libusb_device *dev, - uint8_t* port_numbers, uint8_t port_numbers_len) -{ - UNUSED(ctx); - - return libusb_get_port_numbers(dev, port_numbers, port_numbers_len); -} - -/** \ingroup libusb_dev - * Get the the parent from the specified device. - * \param dev a device - * \returns the device parent or NULL if not available - * You should issue a \ref libusb_get_device_list() before calling this - * function and make sure that you only access the parent before issuing - * \ref libusb_free_device_list(). The reason is that libusb currently does - * not maintain a permanent list of device instances, and therefore can - * only guarantee that parents are fully instantiated within a - * libusb_get_device_list() - libusb_free_device_list() block. - */ -DEFAULT_VISIBILITY -libusb_device * LIBUSB_CALL libusb_get_parent(libusb_device *dev) -{ - return dev->parent_dev; -} - -/** \ingroup libusb_dev - * Get the address of the device on the bus it is connected to. - * \param dev a device - * \returns the device address - */ -uint8_t API_EXPORTED libusb_get_device_address(libusb_device *dev) -{ - return dev->device_address; -} - -/** \ingroup libusb_dev - * Get the negotiated connection speed for a device. - * \param dev a device - * \returns a \ref libusb_speed code, where LIBUSB_SPEED_UNKNOWN means that - * the OS doesn't know or doesn't support returning the negotiated speed. - */ -int API_EXPORTED libusb_get_device_speed(libusb_device *dev) -{ - return dev->speed; -} - -static const struct libusb_endpoint_descriptor *find_endpoint( - struct libusb_config_descriptor *config, unsigned char endpoint) -{ - int iface_idx; - for (iface_idx = 0; iface_idx < config->bNumInterfaces; iface_idx++) { - const struct libusb_interface *iface = &config->interface[iface_idx]; - int altsetting_idx; - - for (altsetting_idx = 0; altsetting_idx < iface->num_altsetting; - altsetting_idx++) { - const struct libusb_interface_descriptor *altsetting - = &iface->altsetting[altsetting_idx]; - int ep_idx; - - for (ep_idx = 0; ep_idx < altsetting->bNumEndpoints; ep_idx++) { - const struct libusb_endpoint_descriptor *ep = - &altsetting->endpoint[ep_idx]; - if (ep->bEndpointAddress == endpoint) - return ep; - } - } - } - return NULL; -} - -/** \ingroup libusb_dev - * Convenience function to retrieve the wMaxPacketSize value for a particular - * endpoint in the active device configuration. - * - * This function was originally intended to be of assistance when setting up - * isochronous transfers, but a design mistake resulted in this function - * instead. It simply returns the wMaxPacketSize value without considering - * its contents. If you're dealing with isochronous transfers, you probably - * want libusb_get_max_iso_packet_size() instead. - * - * \param dev a device - * \param endpoint address of the endpoint in question - * \returns the wMaxPacketSize value - * \returns LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist - * \returns LIBUSB_ERROR_OTHER on other failure - */ -int API_EXPORTED libusb_get_max_packet_size(libusb_device *dev, - unsigned char endpoint) -{ - struct libusb_config_descriptor *config; - const struct libusb_endpoint_descriptor *ep; - int r; - - r = libusb_get_active_config_descriptor(dev, &config); - if (r < 0) { - usbi_err(DEVICE_CTX(dev), - "could not retrieve active config descriptor"); - return LIBUSB_ERROR_OTHER; - } - - ep = find_endpoint(config, endpoint); - if (!ep) { - r = LIBUSB_ERROR_NOT_FOUND; - goto out; - } - - r = ep->wMaxPacketSize; - -out: - libusb_free_config_descriptor(config); - return r; -} - -/** \ingroup libusb_dev - * Calculate the maximum packet size which a specific endpoint is capable is - * sending or receiving in the duration of 1 microframe - * - * Only the active configuration is examined. The calculation is based on the - * wMaxPacketSize field in the endpoint descriptor as described in section - * 9.6.6 in the USB 2.0 specifications. - * - * If acting on an isochronous or interrupt endpoint, this function will - * multiply the value found in bits 0:10 by the number of transactions per - * microframe (determined by bits 11:12). Otherwise, this function just - * returns the numeric value found in bits 0:10. - * - * This function is useful for setting up isochronous transfers, for example - * you might pass the return value from this function to - * libusb_set_iso_packet_lengths() in order to set the length field of every - * isochronous packet in a transfer. - * - * Since v1.0.3. - * - * \param dev a device - * \param endpoint address of the endpoint in question - * \returns the maximum packet size which can be sent/received on this endpoint - * \returns LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist - * \returns LIBUSB_ERROR_OTHER on other failure - */ -int API_EXPORTED libusb_get_max_iso_packet_size(libusb_device *dev, - unsigned char endpoint) -{ - struct libusb_config_descriptor *config; - const struct libusb_endpoint_descriptor *ep; - enum libusb_transfer_type ep_type; - uint16_t val; - int r; - - r = libusb_get_active_config_descriptor(dev, &config); - if (r < 0) { - usbi_err(DEVICE_CTX(dev), - "could not retrieve active config descriptor"); - return LIBUSB_ERROR_OTHER; - } - - ep = find_endpoint(config, endpoint); - if (!ep) { - r = LIBUSB_ERROR_NOT_FOUND; - goto out; - } - - val = ep->wMaxPacketSize; - ep_type = (enum libusb_transfer_type) (ep->bmAttributes & 0x3); - - r = val & 0x07ff; - if (ep_type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS - || ep_type == LIBUSB_TRANSFER_TYPE_INTERRUPT) - r *= (1 + ((val >> 11) & 3)); - -out: - libusb_free_config_descriptor(config); - return r; -} - -/** \ingroup libusb_dev - * Increment the reference count of a device. - * \param dev the device to reference - * \returns the same device - */ -DEFAULT_VISIBILITY -libusb_device * LIBUSB_CALL libusb_ref_device(libusb_device *dev) -{ - usbi_mutex_lock(&dev->lock); - dev->refcnt++; - usbi_mutex_unlock(&dev->lock); - return dev; -} - -/** \ingroup libusb_dev - * Decrement the reference count of a device. If the decrement operation - * causes the reference count to reach zero, the device shall be destroyed. - * \param dev the device to unreference - */ -void API_EXPORTED libusb_unref_device(libusb_device *dev) -{ - int refcnt; - - if (!dev) - return; - - usbi_mutex_lock(&dev->lock); - refcnt = --dev->refcnt; - usbi_mutex_unlock(&dev->lock); - - if (refcnt == 0) { - usbi_dbg("destroy device %d.%d", dev->bus_number, dev->device_address); - - libusb_unref_device(dev->parent_dev); - - if (usbi_backend->destroy_device) - usbi_backend->destroy_device(dev); - - if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { - /* backend does not support hotplug */ - usbi_disconnect_device(dev); - } - - usbi_mutex_destroy(&dev->lock); - free(dev); - } -} - -/* - * Signal the event pipe so that the event handling thread will be - * interrupted to process an internal event. - */ -int usbi_signal_event(struct libusb_context *ctx) -{ - unsigned char dummy = 1; - ssize_t r; - - /* write some data on event pipe to interrupt event handlers */ - r = usbi_write(ctx->event_pipe[1], &dummy, sizeof(dummy)); - if (r != sizeof(dummy)) { - usbi_warn(ctx, "internal signalling write failed"); - return LIBUSB_ERROR_IO; - } - - return 0; -} - -/* - * Clear the event pipe so that the event handling will no longer be - * interrupted. - */ -int usbi_clear_event(struct libusb_context *ctx) -{ - unsigned char dummy; - ssize_t r; - - /* read some data on event pipe to clear it */ - r = usbi_read(ctx->event_pipe[0], &dummy, sizeof(dummy)); - if (r != sizeof(dummy)) { - usbi_warn(ctx, "internal signalling read failed"); - return LIBUSB_ERROR_IO; - } - - return 0; -} - -/** \ingroup libusb_dev - * Open a device and obtain a device handle. A handle allows you to perform - * I/O on the device in question. - * - * Internally, this function adds a reference to the device and makes it - * available to you through libusb_get_device(). This reference is removed - * during libusb_close(). - * - * This is a non-blocking function; no requests are sent over the bus. - * - * \param dev the device to open - * \param dev_handle output location for the returned device handle pointer. Only - * populated when the return code is 0. - * \returns 0 on success - * \returns LIBUSB_ERROR_NO_MEM on memory allocation failure - * \returns LIBUSB_ERROR_ACCESS if the user has insufficient permissions - * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected - * \returns another LIBUSB_ERROR code on other failure - */ -int API_EXPORTED libusb_open(libusb_device *dev, - libusb_device_handle **dev_handle) -{ - struct libusb_context *ctx = DEVICE_CTX(dev); - struct libusb_device_handle *_dev_handle; - size_t priv_size = usbi_backend->device_handle_priv_size; - int r; - usbi_dbg("open %d.%d", dev->bus_number, dev->device_address); - - if (!dev->attached) { - return LIBUSB_ERROR_NO_DEVICE; - } - - _dev_handle = malloc(sizeof(*_dev_handle) + priv_size); - if (!_dev_handle) - return LIBUSB_ERROR_NO_MEM; - - r = usbi_mutex_init(&_dev_handle->lock); - if (r) { - free(_dev_handle); - return LIBUSB_ERROR_OTHER; - } - - _dev_handle->dev = libusb_ref_device(dev); - _dev_handle->auto_detach_kernel_driver = 0; - _dev_handle->claimed_interfaces = 0; - memset(&_dev_handle->os_priv, 0, priv_size); - - r = usbi_backend->open(_dev_handle); - if (r < 0) { - usbi_dbg("open %d.%d returns %d", dev->bus_number, dev->device_address, r); - libusb_unref_device(dev); - usbi_mutex_destroy(&_dev_handle->lock); - free(_dev_handle); - return r; - } - - usbi_mutex_lock(&ctx->open_devs_lock); - list_add(&_dev_handle->list, &ctx->open_devs); - usbi_mutex_unlock(&ctx->open_devs_lock); - *dev_handle = _dev_handle; - - return 0; -} - -/** \ingroup libusb_dev - * Convenience function for finding a device with a particular - * idVendor/idProduct combination. This function is intended - * for those scenarios where you are using libusb to knock up a quick test - * application - it allows you to avoid calling libusb_get_device_list() and - * worrying about traversing/freeing the list. - * - * This function has limitations and is hence not intended for use in real - * applications: if multiple devices have the same IDs it will only - * give you the first one, etc. - * - * \param ctx the context to operate on, or NULL for the default context - * \param vendor_id the idVendor value to search for - * \param product_id the idProduct value to search for - * \returns a device handle for the first found device, or NULL on error - * or if the device could not be found. */ -DEFAULT_VISIBILITY -libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid( - libusb_context *ctx, uint16_t vendor_id, uint16_t product_id) -{ - struct libusb_device **devs; - struct libusb_device *found = NULL; - struct libusb_device *dev; - struct libusb_device_handle *dev_handle = NULL; - size_t i = 0; - int r; - - if (libusb_get_device_list(ctx, &devs) < 0) - return NULL; - - while ((dev = devs[i++]) != NULL) { - struct libusb_device_descriptor desc; - r = libusb_get_device_descriptor(dev, &desc); - if (r < 0) - goto out; - if (desc.idVendor == vendor_id && desc.idProduct == product_id) { - found = dev; - break; - } - } - - if (found) { - r = libusb_open(found, &dev_handle); - if (r < 0) - dev_handle = NULL; - } - -out: - libusb_free_device_list(devs, 1); - return dev_handle; -} - -static void do_close(struct libusb_context *ctx, - struct libusb_device_handle *dev_handle) -{ - struct usbi_transfer *itransfer; - struct usbi_transfer *tmp; - - /* remove any transfers in flight that are for this device */ - usbi_mutex_lock(&ctx->flying_transfers_lock); - - /* safe iteration because transfers may be being deleted */ - list_for_each_entry_safe(itransfer, tmp, &ctx->flying_transfers, list, struct usbi_transfer) { - struct libusb_transfer *transfer = - USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - if (transfer->dev_handle != dev_handle) - continue; - - usbi_mutex_lock(&itransfer->lock); - if (!(itransfer->state_flags & USBI_TRANSFER_DEVICE_DISAPPEARED)) { - usbi_err(ctx, "Device handle closed while transfer was still being processed, but the device is still connected as far as we know"); - - if (itransfer->state_flags & USBI_TRANSFER_CANCELLING) - usbi_warn(ctx, "A cancellation for an in-flight transfer hasn't completed but closing the device handle"); - else - usbi_err(ctx, "A cancellation hasn't even been scheduled on the transfer for which the device is closing"); - } - usbi_mutex_unlock(&itransfer->lock); - - /* remove from the list of in-flight transfers and make sure - * we don't accidentally use the device handle in the future - * (or that such accesses will be easily caught and identified as a crash) - */ - list_del(&itransfer->list); - transfer->dev_handle = NULL; - - /* it is up to the user to free up the actual transfer struct. this is - * just making sure that we don't attempt to process the transfer after - * the device handle is invalid - */ - usbi_dbg("Removed transfer %p from the in-flight list because device handle %p closed", - transfer, dev_handle); - } - usbi_mutex_unlock(&ctx->flying_transfers_lock); - - usbi_mutex_lock(&ctx->open_devs_lock); - list_del(&dev_handle->list); - usbi_mutex_unlock(&ctx->open_devs_lock); - - usbi_backend->close(dev_handle); - libusb_unref_device(dev_handle->dev); - usbi_mutex_destroy(&dev_handle->lock); - free(dev_handle); -} - -/** \ingroup libusb_dev - * Close a device handle. Should be called on all open handles before your - * application exits. - * - * Internally, this function destroys the reference that was added by - * libusb_open() on the given device. - * - * This is a non-blocking function; no requests are sent over the bus. - * - * \param dev_handle the device handle to close - */ -void API_EXPORTED libusb_close(libusb_device_handle *dev_handle) -{ - struct libusb_context *ctx; - int handling_events; - int pending_events; - - if (!dev_handle) - return; - usbi_dbg(""); - - ctx = HANDLE_CTX(dev_handle); - handling_events = usbi_handling_events(ctx); - - /* Similarly to libusb_open(), we want to interrupt all event handlers - * at this point. More importantly, we want to perform the actual close of - * the device while holding the event handling lock (preventing any other - * thread from doing event handling) because we will be removing a file - * descriptor from the polling loop. If this is being called by the current - * event handler, we can bypass the interruption code because we already - * hold the event handling lock. */ - - if (!handling_events) { - /* Record that we are closing a device. - * Only signal an event if there are no prior pending events. */ - usbi_mutex_lock(&ctx->event_data_lock); - pending_events = usbi_pending_events(ctx); - ctx->device_close++; - if (!pending_events) - usbi_signal_event(ctx); - usbi_mutex_unlock(&ctx->event_data_lock); - - /* take event handling lock */ - libusb_lock_events(ctx); - } - - /* Close the device */ - do_close(ctx, dev_handle); - - if (!handling_events) { - /* We're done with closing this device. - * Clear the event pipe if there are no further pending events. */ - usbi_mutex_lock(&ctx->event_data_lock); - ctx->device_close--; - pending_events = usbi_pending_events(ctx); - if (!pending_events) - usbi_clear_event(ctx); - usbi_mutex_unlock(&ctx->event_data_lock); - - /* Release event handling lock and wake up event waiters */ - libusb_unlock_events(ctx); - } -} - -/** \ingroup libusb_dev - * Get the underlying device for a device handle. This function does not modify - * the reference count of the returned device, so do not feel compelled to - * unreference it when you are done. - * \param dev_handle a device handle - * \returns the underlying device - */ -DEFAULT_VISIBILITY -libusb_device * LIBUSB_CALL libusb_get_device(libusb_device_handle *dev_handle) -{ - return dev_handle->dev; -} - -/** \ingroup libusb_dev - * Determine the bConfigurationValue of the currently active configuration. - * - * You could formulate your own control request to obtain this information, - * but this function has the advantage that it may be able to retrieve the - * information from operating system caches (no I/O involved). - * - * If the OS does not cache this information, then this function will block - * while a control transfer is submitted to retrieve the information. - * - * This function will return a value of 0 in the config output - * parameter if the device is in unconfigured state. - * - * \param dev_handle a device handle - * \param config output location for the bConfigurationValue of the active - * configuration (only valid for return code 0) - * \returns 0 on success - * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected - * \returns another LIBUSB_ERROR code on other failure - */ -int API_EXPORTED libusb_get_configuration(libusb_device_handle *dev_handle, - int *config) -{ - int r = LIBUSB_ERROR_NOT_SUPPORTED; - - usbi_dbg(""); - if (usbi_backend->get_configuration) - r = usbi_backend->get_configuration(dev_handle, config); - - if (r == LIBUSB_ERROR_NOT_SUPPORTED) { - uint8_t tmp = 0; - usbi_dbg("falling back to control message"); - r = libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_IN, - LIBUSB_REQUEST_GET_CONFIGURATION, 0, 0, &tmp, 1, 1000); - if (r == 0) { - usbi_err(HANDLE_CTX(dev_handle), "zero bytes returned in ctrl transfer?"); - r = LIBUSB_ERROR_IO; - } else if (r == 1) { - r = 0; - *config = tmp; - } else { - usbi_dbg("control failed, error %d", r); - } - } - - if (r == 0) - usbi_dbg("active config %d", *config); - - return r; -} - -/** \ingroup libusb_dev - * Set the active configuration for a device. - * - * The operating system may or may not have already set an active - * configuration on the device. It is up to your application to ensure the - * correct configuration is selected before you attempt to claim interfaces - * and perform other operations. - * - * If you call this function on a device already configured with the selected - * configuration, then this function will act as a lightweight device reset: - * it will issue a SET_CONFIGURATION request using the current configuration, - * causing most USB-related device state to be reset (altsetting reset to zero, - * endpoint halts cleared, toggles reset). - * - * You cannot change/reset configuration if your application has claimed - * interfaces. It is advised to set the desired configuration before claiming - * interfaces. - * - * Alternatively you can call libusb_release_interface() first. Note if you - * do things this way you must ensure that auto_detach_kernel_driver for - * dev is 0, otherwise the kernel driver will be re-attached when you - * release the interface(s). - * - * You cannot change/reset configuration if other applications or drivers have - * claimed interfaces. - * - * A configuration value of -1 will put the device in unconfigured state. - * The USB specifications state that a configuration value of 0 does this, - * however buggy devices exist which actually have a configuration 0. - * - * You should always use this function rather than formulating your own - * SET_CONFIGURATION control request. This is because the underlying operating - * system needs to know when such changes happen. - * - * This is a blocking function. - * - * \param dev_handle a device handle - * \param configuration the bConfigurationValue of the configuration you - * wish to activate, or -1 if you wish to put the device in an unconfigured - * state - * \returns 0 on success - * \returns LIBUSB_ERROR_NOT_FOUND if the requested configuration does not exist - * \returns LIBUSB_ERROR_BUSY if interfaces are currently claimed - * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected - * \returns another LIBUSB_ERROR code on other failure - * \see libusb_set_auto_detach_kernel_driver() - */ -int API_EXPORTED libusb_set_configuration(libusb_device_handle *dev_handle, - int configuration) -{ - usbi_dbg("configuration %d", configuration); - return usbi_backend->set_configuration(dev_handle, configuration); -} - -/** \ingroup libusb_dev - * Claim an interface on a given device handle. You must claim the interface - * you wish to use before you can perform I/O on any of its endpoints. - * - * It is legal to attempt to claim an already-claimed interface, in which - * case libusb just returns 0 without doing anything. - * - * If auto_detach_kernel_driver is set to 1 for dev, the kernel driver - * will be detached if necessary, on failure the detach error is returned. - * - * Claiming of interfaces is a purely logical operation; it does not cause - * any requests to be sent over the bus. Interface claiming is used to - * instruct the underlying operating system that your application wishes - * to take ownership of the interface. - * - * This is a non-blocking function. - * - * \param dev_handle a device handle - * \param interface_number the bInterfaceNumber of the interface you - * wish to claim - * \returns 0 on success - * \returns LIBUSB_ERROR_NOT_FOUND if the requested interface does not exist - * \returns LIBUSB_ERROR_BUSY if another program or driver has claimed the - * interface - * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected - * \returns a LIBUSB_ERROR code on other failure - * \see libusb_set_auto_detach_kernel_driver() - */ -int API_EXPORTED libusb_claim_interface(libusb_device_handle *dev_handle, - int interface_number) -{ - int r = 0; - - usbi_dbg("interface %d", interface_number); - if (interface_number >= USB_MAXINTERFACES) - return LIBUSB_ERROR_INVALID_PARAM; - - if (!dev_handle->dev->attached) - return LIBUSB_ERROR_NO_DEVICE; - - usbi_mutex_lock(&dev_handle->lock); - if (dev_handle->claimed_interfaces & (1 << interface_number)) - goto out; - - r = usbi_backend->claim_interface(dev_handle, interface_number); - if (r == 0) - dev_handle->claimed_interfaces |= 1 << interface_number; - -out: - usbi_mutex_unlock(&dev_handle->lock); - return r; -} - -/** \ingroup libusb_dev - * Release an interface previously claimed with libusb_claim_interface(). You - * should release all claimed interfaces before closing a device handle. - * - * This is a blocking function. A SET_INTERFACE control request will be sent - * to the device, resetting interface state to the first alternate setting. - * - * If auto_detach_kernel_driver is set to 1 for dev, the kernel - * driver will be re-attached after releasing the interface. - * - * \param dev_handle a device handle - * \param interface_number the bInterfaceNumber of the - * previously-claimed interface - * \returns 0 on success - * \returns LIBUSB_ERROR_NOT_FOUND if the interface was not claimed - * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected - * \returns another LIBUSB_ERROR code on other failure - * \see libusb_set_auto_detach_kernel_driver() - */ -int API_EXPORTED libusb_release_interface(libusb_device_handle *dev_handle, - int interface_number) -{ - int r; - - usbi_dbg("interface %d", interface_number); - if (interface_number >= USB_MAXINTERFACES) - return LIBUSB_ERROR_INVALID_PARAM; - - usbi_mutex_lock(&dev_handle->lock); - if (!(dev_handle->claimed_interfaces & (1 << interface_number))) { - r = LIBUSB_ERROR_NOT_FOUND; - goto out; - } - - r = usbi_backend->release_interface(dev_handle, interface_number); - if (r == 0) - dev_handle->claimed_interfaces &= ~(1 << interface_number); - -out: - usbi_mutex_unlock(&dev_handle->lock); - return r; -} - -/** \ingroup libusb_dev - * Activate an alternate setting for an interface. The interface must have - * been previously claimed with libusb_claim_interface(). - * - * You should always use this function rather than formulating your own - * SET_INTERFACE control request. This is because the underlying operating - * system needs to know when such changes happen. - * - * This is a blocking function. - * - * \param dev_handle a device handle - * \param interface_number the bInterfaceNumber of the - * previously-claimed interface - * \param alternate_setting the bAlternateSetting of the alternate - * setting to activate - * \returns 0 on success - * \returns LIBUSB_ERROR_NOT_FOUND if the interface was not claimed, or the - * requested alternate setting does not exist - * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected - * \returns another LIBUSB_ERROR code on other failure - */ -int API_EXPORTED libusb_set_interface_alt_setting(libusb_device_handle *dev_handle, - int interface_number, int alternate_setting) -{ - usbi_dbg("interface %d altsetting %d", - interface_number, alternate_setting); - if (interface_number >= USB_MAXINTERFACES) - return LIBUSB_ERROR_INVALID_PARAM; - - usbi_mutex_lock(&dev_handle->lock); - if (!dev_handle->dev->attached) { - usbi_mutex_unlock(&dev_handle->lock); - return LIBUSB_ERROR_NO_DEVICE; - } - - if (!(dev_handle->claimed_interfaces & (1 << interface_number))) { - usbi_mutex_unlock(&dev_handle->lock); - return LIBUSB_ERROR_NOT_FOUND; - } - usbi_mutex_unlock(&dev_handle->lock); - - return usbi_backend->set_interface_altsetting(dev_handle, interface_number, - alternate_setting); -} - -/** \ingroup libusb_dev - * Clear the halt/stall condition for an endpoint. Endpoints with halt status - * are unable to receive or transmit data until the halt condition is stalled. - * - * You should cancel all pending transfers before attempting to clear the halt - * condition. - * - * This is a blocking function. - * - * \param dev_handle a device handle - * \param endpoint the endpoint to clear halt status - * \returns 0 on success - * \returns LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist - * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected - * \returns another LIBUSB_ERROR code on other failure - */ -int API_EXPORTED libusb_clear_halt(libusb_device_handle *dev_handle, - unsigned char endpoint) -{ - usbi_dbg("endpoint %x", endpoint); - if (!dev_handle->dev->attached) - return LIBUSB_ERROR_NO_DEVICE; - - return usbi_backend->clear_halt(dev_handle, endpoint); -} - -/** \ingroup libusb_dev - * Perform a USB port reset to reinitialize a device. The system will attempt - * to restore the previous configuration and alternate settings after the - * reset has completed. - * - * If the reset fails, the descriptors change, or the previous state cannot be - * restored, the device will appear to be disconnected and reconnected. This - * means that the device handle is no longer valid (you should close it) and - * rediscover the device. A return code of LIBUSB_ERROR_NOT_FOUND indicates - * when this is the case. - * - * This is a blocking function which usually incurs a noticeable delay. - * - * \param dev_handle a handle of the device to reset - * \returns 0 on success - * \returns LIBUSB_ERROR_NOT_FOUND if re-enumeration is required, or if the - * device has been disconnected - * \returns another LIBUSB_ERROR code on other failure - */ -int API_EXPORTED libusb_reset_device(libusb_device_handle *dev_handle) -{ - usbi_dbg(""); - if (!dev_handle->dev->attached) - return LIBUSB_ERROR_NO_DEVICE; - - return usbi_backend->reset_device(dev_handle); -} - -/** \ingroup libusb_asyncio - * Allocate up to num_streams usb bulk streams on the specified endpoints. This - * function takes an array of endpoints rather then a single endpoint because - * some protocols require that endpoints are setup with similar stream ids. - * All endpoints passed in must belong to the same interface. - * - * Note this function may return less streams then requested. Also note that the - * same number of streams are allocated for each endpoint in the endpoint array. - * - * Stream id 0 is reserved, and should not be used to communicate with devices. - * If libusb_alloc_streams() returns with a value of N, you may use stream ids - * 1 to N. - * - * Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103 - * - * \param dev_handle a device handle - * \param num_streams number of streams to try to allocate - * \param endpoints array of endpoints to allocate streams on - * \param num_endpoints length of the endpoints array - * \returns number of streams allocated, or a LIBUSB_ERROR code on failure - */ -int API_EXPORTED libusb_alloc_streams(libusb_device_handle *dev_handle, - uint32_t num_streams, unsigned char *endpoints, int num_endpoints) -{ - usbi_dbg("streams %u eps %d", (unsigned) num_streams, num_endpoints); - - if (!dev_handle->dev->attached) - return LIBUSB_ERROR_NO_DEVICE; - - if (usbi_backend->alloc_streams) - return usbi_backend->alloc_streams(dev_handle, num_streams, endpoints, - num_endpoints); - else - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -/** \ingroup libusb_asyncio - * Free usb bulk streams allocated with libusb_alloc_streams(). - * - * Note streams are automatically free-ed when releasing an interface. - * - * Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103 - * - * \param dev_handle a device handle - * \param endpoints array of endpoints to free streams on - * \param num_endpoints length of the endpoints array - * \returns LIBUSB_SUCCESS, or a LIBUSB_ERROR code on failure - */ -int API_EXPORTED libusb_free_streams(libusb_device_handle *dev_handle, - unsigned char *endpoints, int num_endpoints) -{ - usbi_dbg("eps %d", num_endpoints); - - if (!dev_handle->dev->attached) - return LIBUSB_ERROR_NO_DEVICE; - - if (usbi_backend->free_streams) - return usbi_backend->free_streams(dev_handle, endpoints, - num_endpoints); - else - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -/** \ingroup libusb_asyncio - * Attempts to allocate a block of persistent DMA memory suitable for transfers - * against the given device. If successful, will return a block of memory - * that is suitable for use as "buffer" in \ref libusb_transfer against this - * device. Using this memory instead of regular memory means that the host - * controller can use DMA directly into the buffer to increase performance, and - * also that transfers can no longer fail due to kernel memory fragmentation. - * - * Note that this means you should not modify this memory (or even data on - * the same cache lines) when a transfer is in progress, although it is legal - * to have several transfers going on within the same memory block. - * - * Will return NULL on failure. Many systems do not support such zerocopy - * and will always return NULL. Memory allocated with this function must be - * freed with \ref libusb_dev_mem_free. Specifically, this means that the - * flag \ref LIBUSB_TRANSFER_FREE_BUFFER cannot be used to free memory allocated - * with this function. - * - * Since version 1.0.21, \ref LIBUSB_API_VERSION >= 0x01000105 - * - * \param dev_handle a device handle - * \param length size of desired data buffer - * \returns a pointer to the newly allocated memory, or NULL on failure - */ -DEFAULT_VISIBILITY -unsigned char * LIBUSB_CALL libusb_dev_mem_alloc(libusb_device_handle *dev_handle, - size_t length) -{ - if (!dev_handle->dev->attached) - return NULL; - - if (usbi_backend->dev_mem_alloc) - return usbi_backend->dev_mem_alloc(dev_handle, length); - else - return NULL; -} - -/** \ingroup libusb_asyncio - * Free device memory allocated with libusb_dev_mem_alloc(). - * - * \param dev_handle a device handle - * \param buffer pointer to the previously allocated memory - * \param length size of previously allocated memory - * \returns LIBUSB_SUCCESS, or a LIBUSB_ERROR code on failure - */ -int API_EXPORTED libusb_dev_mem_free(libusb_device_handle *dev_handle, - unsigned char *buffer, size_t length) -{ - if (usbi_backend->dev_mem_free) - return usbi_backend->dev_mem_free(dev_handle, buffer, length); - else - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -/** \ingroup libusb_dev - * Determine if a kernel driver is active on an interface. If a kernel driver - * is active, you cannot claim the interface, and libusb will be unable to - * perform I/O. - * - * This functionality is not available on Windows. - * - * \param dev_handle a device handle - * \param interface_number the interface to check - * \returns 0 if no kernel driver is active - * \returns 1 if a kernel driver is active - * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected - * \returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality - * is not available - * \returns another LIBUSB_ERROR code on other failure - * \see libusb_detach_kernel_driver() - */ -int API_EXPORTED libusb_kernel_driver_active(libusb_device_handle *dev_handle, - int interface_number) -{ - usbi_dbg("interface %d", interface_number); - - if (!dev_handle->dev->attached) - return LIBUSB_ERROR_NO_DEVICE; - - if (usbi_backend->kernel_driver_active) - return usbi_backend->kernel_driver_active(dev_handle, interface_number); - else - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -/** \ingroup libusb_dev - * Detach a kernel driver from an interface. If successful, you will then be - * able to claim the interface and perform I/O. - * - * This functionality is not available on Darwin or Windows. - * - * Note that libusb itself also talks to the device through a special kernel - * driver, if this driver is already attached to the device, this call will - * not detach it and return LIBUSB_ERROR_NOT_FOUND. - * - * \param dev_handle a device handle - * \param interface_number the interface to detach the driver from - * \returns 0 on success - * \returns LIBUSB_ERROR_NOT_FOUND if no kernel driver was active - * \returns LIBUSB_ERROR_INVALID_PARAM if the interface does not exist - * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected - * \returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality - * is not available - * \returns another LIBUSB_ERROR code on other failure - * \see libusb_kernel_driver_active() - */ -int API_EXPORTED libusb_detach_kernel_driver(libusb_device_handle *dev_handle, - int interface_number) -{ - usbi_dbg("interface %d", interface_number); - - if (!dev_handle->dev->attached) - return LIBUSB_ERROR_NO_DEVICE; - - if (usbi_backend->detach_kernel_driver) - return usbi_backend->detach_kernel_driver(dev_handle, interface_number); - else - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -/** \ingroup libusb_dev - * Re-attach an interface's kernel driver, which was previously detached - * using libusb_detach_kernel_driver(). This call is only effective on - * Linux and returns LIBUSB_ERROR_NOT_SUPPORTED on all other platforms. - * - * This functionality is not available on Darwin or Windows. - * - * \param dev_handle a device handle - * \param interface_number the interface to attach the driver from - * \returns 0 on success - * \returns LIBUSB_ERROR_NOT_FOUND if no kernel driver was active - * \returns LIBUSB_ERROR_INVALID_PARAM if the interface does not exist - * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected - * \returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality - * is not available - * \returns LIBUSB_ERROR_BUSY if the driver cannot be attached because the - * interface is claimed by a program or driver - * \returns another LIBUSB_ERROR code on other failure - * \see libusb_kernel_driver_active() - */ -int API_EXPORTED libusb_attach_kernel_driver(libusb_device_handle *dev_handle, - int interface_number) -{ - usbi_dbg("interface %d", interface_number); - - if (!dev_handle->dev->attached) - return LIBUSB_ERROR_NO_DEVICE; - - if (usbi_backend->attach_kernel_driver) - return usbi_backend->attach_kernel_driver(dev_handle, interface_number); - else - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -/** \ingroup libusb_dev - * Enable/disable libusb's automatic kernel driver detachment. When this is - * enabled libusb will automatically detach the kernel driver on an interface - * when claiming the interface, and attach it when releasing the interface. - * - * Automatic kernel driver detachment is disabled on newly opened device - * handles by default. - * - * On platforms which do not have LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER - * this function will return LIBUSB_ERROR_NOT_SUPPORTED, and libusb will - * continue as if this function was never called. - * - * \param dev_handle a device handle - * \param enable whether to enable or disable auto kernel driver detachment - * - * \returns LIBUSB_SUCCESS on success - * \returns LIBUSB_ERROR_NOT_SUPPORTED on platforms where the functionality - * is not available - * \see libusb_claim_interface() - * \see libusb_release_interface() - * \see libusb_set_configuration() - */ -int API_EXPORTED libusb_set_auto_detach_kernel_driver( - libusb_device_handle *dev_handle, int enable) -{ - if (!(usbi_backend->caps & USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER)) - return LIBUSB_ERROR_NOT_SUPPORTED; - - dev_handle->auto_detach_kernel_driver = enable; - return LIBUSB_SUCCESS; -} - -/** \ingroup libusb_lib - * Set log message verbosity. - * - * The default level is LIBUSB_LOG_LEVEL_NONE, which means no messages are ever - * printed. If you choose to increase the message verbosity level, ensure - * that your application does not close the stdout/stderr file descriptors. - * - * You are advised to use level LIBUSB_LOG_LEVEL_WARNING. libusb is conservative - * with its message logging and most of the time, will only log messages that - * explain error conditions and other oddities. This will help you debug - * your software. - * - * If the LIBUSB_DEBUG environment variable was set when libusb was - * initialized, this function does nothing: the message verbosity is fixed - * to the value in the environment variable. - * - * If libusb was compiled without any message logging, this function does - * nothing: you'll never get any messages. - * - * If libusb was compiled with verbose debug message logging, this function - * does nothing: you'll always get messages from all levels. - * - * \param ctx the context to operate on, or NULL for the default context - * \param level debug level to set - */ -void API_EXPORTED libusb_set_debug(libusb_context *ctx, int level) -{ - USBI_GET_CONTEXT(ctx); - if (!ctx->debug_fixed) - ctx->debug = level; -} - -/** \ingroup libusb_lib - * Initialize libusb. This function must be called before calling any other - * libusb function. - * - * If you do not provide an output location for a context pointer, a default - * context will be created. If there was already a default context, it will - * be reused (and nothing will be initialized/reinitialized). - * - * \param context Optional output location for context pointer. - * Only valid on return code 0. - * \returns 0 on success, or a LIBUSB_ERROR code on failure - * \see libusb_contexts - */ -int API_EXPORTED libusb_init(libusb_context **context) -{ - struct libusb_device *dev, *next; - char *dbg = getenv("LIBUSB_DEBUG"); - struct libusb_context *ctx; - static int first_init = 1; - int r = 0; - - usbi_mutex_static_lock(&default_context_lock); - - if (!timestamp_origin.tv_sec) { - usbi_backend->clock_gettime(USBI_CLOCK_REALTIME, ×tamp_origin); - } - - if (!context && usbi_default_context) { - usbi_dbg("reusing default context"); - default_context_refcnt++; - usbi_mutex_static_unlock(&default_context_lock); - return 0; - } - - ctx = calloc(1, sizeof(*ctx)); - if (!ctx) { - r = LIBUSB_ERROR_NO_MEM; - goto err_unlock; - } - -#ifdef ENABLE_DEBUG_LOGGING - ctx->debug = LIBUSB_LOG_LEVEL_DEBUG; -#endif - - if (dbg) { - ctx->debug = atoi(dbg); - if (ctx->debug) - ctx->debug_fixed = 1; - } - - /* default context should be initialized before calling usbi_dbg */ - if (!usbi_default_context) { - usbi_default_context = ctx; - default_context_refcnt++; - usbi_dbg("created default context"); - } - - usbi_dbg("libusb v%u.%u.%u.%u%s", libusb_version_internal.major, libusb_version_internal.minor, - libusb_version_internal.micro, libusb_version_internal.nano, libusb_version_internal.rc); - - usbi_mutex_init(&ctx->usb_devs_lock); - usbi_mutex_init(&ctx->open_devs_lock); - usbi_mutex_init(&ctx->hotplug_cbs_lock); - list_init(&ctx->usb_devs); - list_init(&ctx->open_devs); - list_init(&ctx->hotplug_cbs); - - usbi_mutex_static_lock(&active_contexts_lock); - if (first_init) { - first_init = 0; - list_init (&active_contexts_list); - } - list_add (&ctx->list, &active_contexts_list); - usbi_mutex_static_unlock(&active_contexts_lock); - - if (usbi_backend->init) { - r = usbi_backend->init(ctx); - if (r) - goto err_free_ctx; - } - - r = usbi_io_init(ctx); - if (r < 0) - goto err_backend_exit; - - usbi_mutex_static_unlock(&default_context_lock); - - if (context) - *context = ctx; - - return 0; - -err_backend_exit: - if (usbi_backend->exit) - usbi_backend->exit(); -err_free_ctx: - if (ctx == usbi_default_context) { - usbi_default_context = NULL; - default_context_refcnt--; - } - - usbi_mutex_static_lock(&active_contexts_lock); - list_del (&ctx->list); - usbi_mutex_static_unlock(&active_contexts_lock); - - usbi_mutex_lock(&ctx->usb_devs_lock); - list_for_each_entry_safe(dev, next, &ctx->usb_devs, list, struct libusb_device) { - list_del(&dev->list); - libusb_unref_device(dev); - } - usbi_mutex_unlock(&ctx->usb_devs_lock); - - usbi_mutex_destroy(&ctx->open_devs_lock); - usbi_mutex_destroy(&ctx->usb_devs_lock); - usbi_mutex_destroy(&ctx->hotplug_cbs_lock); - - free(ctx); -err_unlock: - usbi_mutex_static_unlock(&default_context_lock); - return r; -} - -/** \ingroup libusb_lib - * Deinitialize libusb. Should be called after closing all open devices and - * before your application terminates. - * \param ctx the context to deinitialize, or NULL for the default context - */ -void API_EXPORTED libusb_exit(struct libusb_context *ctx) -{ - struct libusb_device *dev, *next; - struct timeval tv = { 0, 0 }; - - usbi_dbg(""); - USBI_GET_CONTEXT(ctx); - - /* if working with default context, only actually do the deinitialization - * if we're the last user */ - usbi_mutex_static_lock(&default_context_lock); - if (ctx == usbi_default_context) { - if (--default_context_refcnt > 0) { - usbi_dbg("not destroying default context"); - usbi_mutex_static_unlock(&default_context_lock); - return; - } - usbi_dbg("destroying default context"); - usbi_default_context = NULL; - } - usbi_mutex_static_unlock(&default_context_lock); - - usbi_mutex_static_lock(&active_contexts_lock); - list_del (&ctx->list); - usbi_mutex_static_unlock(&active_contexts_lock); - - if (libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { - usbi_hotplug_deregister_all(ctx); - - /* - * Ensure any pending unplug events are read from the hotplug - * pipe. The usb_device-s hold in the events are no longer part - * of usb_devs, but the events still hold a reference! - * - * Note we don't do this if the application has left devices - * open (which implies a buggy app) to avoid packet completion - * handlers running when the app does not expect them to run. - */ - if (list_empty(&ctx->open_devs)) - libusb_handle_events_timeout(ctx, &tv); - - usbi_mutex_lock(&ctx->usb_devs_lock); - list_for_each_entry_safe(dev, next, &ctx->usb_devs, list, struct libusb_device) { - list_del(&dev->list); - libusb_unref_device(dev); - } - usbi_mutex_unlock(&ctx->usb_devs_lock); - } - - /* a few sanity checks. don't bother with locking because unless - * there is an application bug, nobody will be accessing these. */ - if (!list_empty(&ctx->usb_devs)) - usbi_warn(ctx, "some libusb_devices were leaked"); - if (!list_empty(&ctx->open_devs)) - usbi_warn(ctx, "application left some devices open"); - - usbi_io_exit(ctx); - if (usbi_backend->exit) - usbi_backend->exit(); - - usbi_mutex_destroy(&ctx->open_devs_lock); - usbi_mutex_destroy(&ctx->usb_devs_lock); - usbi_mutex_destroy(&ctx->hotplug_cbs_lock); - free(ctx); -} - -/** \ingroup libusb_misc - * Check at runtime if the loaded library has a given capability. - * This call should be performed after \ref libusb_init(), to ensure the - * backend has updated its capability set. - * - * \param capability the \ref libusb_capability to check for - * \returns nonzero if the running library has the capability, 0 otherwise - */ -int API_EXPORTED libusb_has_capability(uint32_t capability) -{ - switch (capability) { - case LIBUSB_CAP_HAS_CAPABILITY: - return 1; - case LIBUSB_CAP_HAS_HOTPLUG: - return !(usbi_backend->get_device_list); - case LIBUSB_CAP_HAS_HID_ACCESS: - return (usbi_backend->caps & USBI_CAP_HAS_HID_ACCESS); - case LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER: - return (usbi_backend->caps & USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER); - } - return 0; -} - -/* this is defined in libusbi.h if needed */ -#ifdef LIBUSB_PRINTF_WIN32 -/* - * Prior to VS2015, Microsoft did not provide the snprintf() function and - * provided a vsnprintf() that did not guarantee NULL-terminated output. - * Microsoft did provide a _snprintf() function, but again it did not - * guarantee NULL-terminated output. - * - * The below implementations guarantee NULL-terminated output and are - * C99 compliant. - */ - -int usbi_snprintf(char *str, size_t size, const char *format, ...) -{ - va_list ap; - int ret; - - va_start(ap, format); - ret = usbi_vsnprintf(str, size, format, ap); - va_end(ap); - - return ret; -} - -int usbi_vsnprintf(char *str, size_t size, const char *format, va_list ap) -{ - int ret; - - ret = _vsnprintf(str, size, format, ap); - if (ret < 0 || ret == (int)size) { - /* Output is truncated, ensure buffer is NULL-terminated and - * determine how many characters would have been written. */ - str[size - 1] = '\0'; - if (ret < 0) - ret = _vsnprintf(NULL, 0, format, ap); - } - - return ret; -} -#endif - -static void usbi_log_str(struct libusb_context *ctx, - enum libusb_log_level level, const char * str) -{ -#if defined(USE_SYSTEM_LOGGING_FACILITY) -#if defined(OS_WINDOWS) - OutputDebugString(str); -#elif defined(OS_WINCE) - /* Windows CE only supports the Unicode version of OutputDebugString. */ - WCHAR wbuf[USBI_MAX_LOG_LEN]; - MultiByteToWideChar(CP_UTF8, 0, str, -1, wbuf, sizeof(wbuf)); - OutputDebugStringW(wbuf); -#elif defined(__ANDROID__) - int priority = ANDROID_LOG_UNKNOWN; - switch (level) { - case LIBUSB_LOG_LEVEL_INFO: priority = ANDROID_LOG_INFO; break; - case LIBUSB_LOG_LEVEL_WARNING: priority = ANDROID_LOG_WARN; break; - case LIBUSB_LOG_LEVEL_ERROR: priority = ANDROID_LOG_ERROR; break; - case LIBUSB_LOG_LEVEL_DEBUG: priority = ANDROID_LOG_DEBUG; break; - } - __android_log_write(priority, "libusb", str); -#elif defined(HAVE_SYSLOG_FUNC) - int syslog_level = LOG_INFO; - switch (level) { - case LIBUSB_LOG_LEVEL_INFO: syslog_level = LOG_INFO; break; - case LIBUSB_LOG_LEVEL_WARNING: syslog_level = LOG_WARNING; break; - case LIBUSB_LOG_LEVEL_ERROR: syslog_level = LOG_ERR; break; - case LIBUSB_LOG_LEVEL_DEBUG: syslog_level = LOG_DEBUG; break; - } - syslog(syslog_level, "%s", str); -#else /* All of gcc, Clang, XCode seem to use #warning */ -#warning System logging is not supported on this platform. Logging to stderr will be used instead. - fputs(str, stderr); -#endif -#else - fputs(str, stderr); -#endif /* USE_SYSTEM_LOGGING_FACILITY */ - UNUSED(ctx); - UNUSED(level); -} - -void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, - const char *function, const char *format, va_list args) -{ - const char *prefix = ""; - char buf[USBI_MAX_LOG_LEN]; - struct timespec now; - int global_debug, header_len, text_len; - static int has_debug_header_been_displayed = 0; - -#ifdef ENABLE_DEBUG_LOGGING - global_debug = 1; - UNUSED(ctx); -#else - int ctx_level = 0; - - USBI_GET_CONTEXT(ctx); - if (ctx) { - ctx_level = ctx->debug; - } else { - char *dbg = getenv("LIBUSB_DEBUG"); - if (dbg) - ctx_level = atoi(dbg); - } - global_debug = (ctx_level == LIBUSB_LOG_LEVEL_DEBUG); - if (!ctx_level) - return; - if (level == LIBUSB_LOG_LEVEL_WARNING && ctx_level < LIBUSB_LOG_LEVEL_WARNING) - return; - if (level == LIBUSB_LOG_LEVEL_INFO && ctx_level < LIBUSB_LOG_LEVEL_INFO) - return; - if (level == LIBUSB_LOG_LEVEL_DEBUG && ctx_level < LIBUSB_LOG_LEVEL_DEBUG) - return; -#endif - - usbi_backend->clock_gettime(USBI_CLOCK_REALTIME, &now); - if ((global_debug) && (!has_debug_header_been_displayed)) { - has_debug_header_been_displayed = 1; - usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "[timestamp] [threadID] facility level [function call] " USBI_LOG_LINE_END); - usbi_log_str(ctx, LIBUSB_LOG_LEVEL_DEBUG, "--------------------------------------------------------------------------------" USBI_LOG_LINE_END); - } - if (now.tv_nsec < timestamp_origin.tv_nsec) { - now.tv_sec--; - now.tv_nsec += 1000000000L; - } - now.tv_sec -= timestamp_origin.tv_sec; - now.tv_nsec -= timestamp_origin.tv_nsec; - - switch (level) { - case LIBUSB_LOG_LEVEL_INFO: - prefix = "info"; - break; - case LIBUSB_LOG_LEVEL_WARNING: - prefix = "warning"; - break; - case LIBUSB_LOG_LEVEL_ERROR: - prefix = "error"; - break; - case LIBUSB_LOG_LEVEL_DEBUG: - prefix = "debug"; - break; - case LIBUSB_LOG_LEVEL_NONE: - return; - default: - prefix = "unknown"; - break; - } - - if (global_debug) { - header_len = snprintf(buf, sizeof(buf), - "[%2d.%06d] [%08x] libusb: %s [%s] ", - (int)now.tv_sec, (int)(now.tv_nsec / 1000L), usbi_get_tid(), prefix, function); - } else { - header_len = snprintf(buf, sizeof(buf), - "libusb: %s [%s] ", prefix, function); - } - - if (header_len < 0 || header_len >= (int)sizeof(buf)) { - /* Somehow snprintf failed to write to the buffer, - * remove the header so something useful is output. */ - header_len = 0; - } - /* Make sure buffer is NUL terminated */ - buf[header_len] = '\0'; - text_len = vsnprintf(buf + header_len, sizeof(buf) - header_len, - format, args); - if (text_len < 0 || text_len + header_len >= (int)sizeof(buf)) { - /* Truncated log output. On some platforms a -1 return value means - * that the output was truncated. */ - text_len = sizeof(buf) - header_len; - } - if (header_len + text_len + sizeof(USBI_LOG_LINE_END) >= sizeof(buf)) { - /* Need to truncate the text slightly to fit on the terminator. */ - text_len -= (header_len + text_len + sizeof(USBI_LOG_LINE_END)) - sizeof(buf); - } - strcpy(buf + header_len + text_len, USBI_LOG_LINE_END); - - usbi_log_str(ctx, level, buf); -} - -void usbi_log(struct libusb_context *ctx, enum libusb_log_level level, - const char *function, const char *format, ...) -{ - va_list args; - - va_start (args, format); - usbi_log_v(ctx, level, function, format, args); - va_end (args); -} - -/** \ingroup libusb_misc - * Returns a constant NULL-terminated string with the ASCII name of a libusb - * error or transfer status code. The caller must not free() the returned - * string. - * - * \param error_code The \ref libusb_error or libusb_transfer_status code to - * return the name of. - * \returns The error name, or the string **UNKNOWN** if the value of - * error_code is not a known error / status code. - */ -DEFAULT_VISIBILITY const char * LIBUSB_CALL libusb_error_name(int error_code) -{ - switch (error_code) { - case LIBUSB_ERROR_IO: - return "LIBUSB_ERROR_IO"; - case LIBUSB_ERROR_INVALID_PARAM: - return "LIBUSB_ERROR_INVALID_PARAM"; - case LIBUSB_ERROR_ACCESS: - return "LIBUSB_ERROR_ACCESS"; - case LIBUSB_ERROR_NO_DEVICE: - return "LIBUSB_ERROR_NO_DEVICE"; - case LIBUSB_ERROR_NOT_FOUND: - return "LIBUSB_ERROR_NOT_FOUND"; - case LIBUSB_ERROR_BUSY: - return "LIBUSB_ERROR_BUSY"; - case LIBUSB_ERROR_TIMEOUT: - return "LIBUSB_ERROR_TIMEOUT"; - case LIBUSB_ERROR_OVERFLOW: - return "LIBUSB_ERROR_OVERFLOW"; - case LIBUSB_ERROR_PIPE: - return "LIBUSB_ERROR_PIPE"; - case LIBUSB_ERROR_INTERRUPTED: - return "LIBUSB_ERROR_INTERRUPTED"; - case LIBUSB_ERROR_NO_MEM: - return "LIBUSB_ERROR_NO_MEM"; - case LIBUSB_ERROR_NOT_SUPPORTED: - return "LIBUSB_ERROR_NOT_SUPPORTED"; - case LIBUSB_ERROR_OTHER: - return "LIBUSB_ERROR_OTHER"; - - case LIBUSB_TRANSFER_ERROR: - return "LIBUSB_TRANSFER_ERROR"; - case LIBUSB_TRANSFER_TIMED_OUT: - return "LIBUSB_TRANSFER_TIMED_OUT"; - case LIBUSB_TRANSFER_CANCELLED: - return "LIBUSB_TRANSFER_CANCELLED"; - case LIBUSB_TRANSFER_STALL: - return "LIBUSB_TRANSFER_STALL"; - case LIBUSB_TRANSFER_NO_DEVICE: - return "LIBUSB_TRANSFER_NO_DEVICE"; - case LIBUSB_TRANSFER_OVERFLOW: - return "LIBUSB_TRANSFER_OVERFLOW"; - - case 0: - return "LIBUSB_SUCCESS / LIBUSB_TRANSFER_COMPLETED"; - default: - return "**UNKNOWN**"; - } -} - -/** \ingroup libusb_misc - * Returns a pointer to const struct libusb_version with the version - * (major, minor, micro, nano and rc) of the running library. - */ -DEFAULT_VISIBILITY -const struct libusb_version * LIBUSB_CALL libusb_get_version(void) -{ - return &libusb_version_internal; -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/descriptor.c b/vendor/github.com/karalabe/hid/libusb/libusb/descriptor.c deleted file mode 100644 index 4c9435fffe4f..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/descriptor.c +++ /dev/null @@ -1,1191 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ -/* - * USB descriptor handling functions for libusb - * Copyright © 2007 Daniel Drake - * Copyright © 2001 Johannes Erdfelt - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include -#include -#include - -#include "libusbi.h" - -#define DESC_HEADER_LENGTH 2 -#define DEVICE_DESC_LENGTH 18 -#define CONFIG_DESC_LENGTH 9 -#define INTERFACE_DESC_LENGTH 9 -#define ENDPOINT_DESC_LENGTH 7 -#define ENDPOINT_AUDIO_DESC_LENGTH 9 - -/** @defgroup libusb_desc USB descriptors - * This page details how to examine the various standard USB descriptors - * for detected devices - */ - -/* set host_endian if the w values are already in host endian format, - * as opposed to bus endian. */ -int usbi_parse_descriptor(const unsigned char *source, const char *descriptor, - void *dest, int host_endian) -{ - const unsigned char *sp = source; - unsigned char *dp = dest; - uint16_t w; - const char *cp; - uint32_t d; - - for (cp = descriptor; *cp; cp++) { - switch (*cp) { - case 'b': /* 8-bit byte */ - *dp++ = *sp++; - break; - case 'w': /* 16-bit word, convert from little endian to CPU */ - dp += ((uintptr_t)dp & 1); /* Align to word boundary */ - - if (host_endian) { - memcpy(dp, sp, 2); - } else { - w = (sp[1] << 8) | sp[0]; - *((uint16_t *)dp) = w; - } - sp += 2; - dp += 2; - break; - case 'd': /* 32-bit word, convert from little endian to CPU */ - dp += ((uintptr_t)dp & 1); /* Align to word boundary */ - - if (host_endian) { - memcpy(dp, sp, 4); - } else { - d = (sp[3] << 24) | (sp[2] << 16) | - (sp[1] << 8) | sp[0]; - *((uint32_t *)dp) = d; - } - sp += 4; - dp += 4; - break; - case 'u': /* 16 byte UUID */ - memcpy(dp, sp, 16); - sp += 16; - dp += 16; - break; - } - } - - return (int) (sp - source); -} - -static void clear_endpoint(struct libusb_endpoint_descriptor *endpoint) -{ - free((void *) endpoint->extra); -} - -static int parse_endpoint(struct libusb_context *ctx, - struct libusb_endpoint_descriptor *endpoint, unsigned char *buffer, - int size, int host_endian) -{ - struct usb_descriptor_header header; - unsigned char *extra; - unsigned char *begin; - int parsed = 0; - int len; - - if (size < DESC_HEADER_LENGTH) { - usbi_err(ctx, "short endpoint descriptor read %d/%d", - size, DESC_HEADER_LENGTH); - return LIBUSB_ERROR_IO; - } - - usbi_parse_descriptor(buffer, "bb", &header, 0); - if (header.bDescriptorType != LIBUSB_DT_ENDPOINT) { - usbi_err(ctx, "unexpected descriptor %x (expected %x)", - header.bDescriptorType, LIBUSB_DT_ENDPOINT); - return parsed; - } - if (header.bLength > size) { - usbi_warn(ctx, "short endpoint descriptor read %d/%d", - size, header.bLength); - return parsed; - } - if (header.bLength >= ENDPOINT_AUDIO_DESC_LENGTH) - usbi_parse_descriptor(buffer, "bbbbwbbb", endpoint, host_endian); - else if (header.bLength >= ENDPOINT_DESC_LENGTH) - usbi_parse_descriptor(buffer, "bbbbwb", endpoint, host_endian); - else { - usbi_err(ctx, "invalid endpoint bLength (%d)", header.bLength); - return LIBUSB_ERROR_IO; - } - - buffer += header.bLength; - size -= header.bLength; - parsed += header.bLength; - - /* Skip over the rest of the Class Specific or Vendor Specific */ - /* descriptors */ - begin = buffer; - while (size >= DESC_HEADER_LENGTH) { - usbi_parse_descriptor(buffer, "bb", &header, 0); - if (header.bLength < DESC_HEADER_LENGTH) { - usbi_err(ctx, "invalid extra ep desc len (%d)", - header.bLength); - return LIBUSB_ERROR_IO; - } else if (header.bLength > size) { - usbi_warn(ctx, "short extra ep desc read %d/%d", - size, header.bLength); - return parsed; - } - - /* If we find another "proper" descriptor then we're done */ - if ((header.bDescriptorType == LIBUSB_DT_ENDPOINT) || - (header.bDescriptorType == LIBUSB_DT_INTERFACE) || - (header.bDescriptorType == LIBUSB_DT_CONFIG) || - (header.bDescriptorType == LIBUSB_DT_DEVICE)) - break; - - usbi_dbg("skipping descriptor %x", header.bDescriptorType); - buffer += header.bLength; - size -= header.bLength; - parsed += header.bLength; - } - - /* Copy any unknown descriptors into a storage area for drivers */ - /* to later parse */ - len = (int)(buffer - begin); - if (!len) { - endpoint->extra = NULL; - endpoint->extra_length = 0; - return parsed; - } - - extra = malloc(len); - endpoint->extra = extra; - if (!extra) { - endpoint->extra_length = 0; - return LIBUSB_ERROR_NO_MEM; - } - - memcpy(extra, begin, len); - endpoint->extra_length = len; - - return parsed; -} - -static void clear_interface(struct libusb_interface *usb_interface) -{ - int i; - int j; - - if (usb_interface->altsetting) { - for (i = 0; i < usb_interface->num_altsetting; i++) { - struct libusb_interface_descriptor *ifp = - (struct libusb_interface_descriptor *) - usb_interface->altsetting + i; - free((void *) ifp->extra); - if (ifp->endpoint) { - for (j = 0; j < ifp->bNumEndpoints; j++) - clear_endpoint((struct libusb_endpoint_descriptor *) - ifp->endpoint + j); - } - free((void *) ifp->endpoint); - } - } - free((void *) usb_interface->altsetting); - usb_interface->altsetting = NULL; -} - -static int parse_interface(libusb_context *ctx, - struct libusb_interface *usb_interface, unsigned char *buffer, int size, - int host_endian) -{ - int i; - int len; - int r; - int parsed = 0; - int interface_number = -1; - struct usb_descriptor_header header; - struct libusb_interface_descriptor *ifp; - unsigned char *begin; - - usb_interface->num_altsetting = 0; - - while (size >= INTERFACE_DESC_LENGTH) { - struct libusb_interface_descriptor *altsetting = - (struct libusb_interface_descriptor *) usb_interface->altsetting; - altsetting = usbi_reallocf(altsetting, - sizeof(struct libusb_interface_descriptor) * - (usb_interface->num_altsetting + 1)); - if (!altsetting) { - r = LIBUSB_ERROR_NO_MEM; - goto err; - } - usb_interface->altsetting = altsetting; - - ifp = altsetting + usb_interface->num_altsetting; - usbi_parse_descriptor(buffer, "bbbbbbbbb", ifp, 0); - if (ifp->bDescriptorType != LIBUSB_DT_INTERFACE) { - usbi_err(ctx, "unexpected descriptor %x (expected %x)", - ifp->bDescriptorType, LIBUSB_DT_INTERFACE); - return parsed; - } - if (ifp->bLength < INTERFACE_DESC_LENGTH) { - usbi_err(ctx, "invalid interface bLength (%d)", - ifp->bLength); - r = LIBUSB_ERROR_IO; - goto err; - } - if (ifp->bLength > size) { - usbi_warn(ctx, "short intf descriptor read %d/%d", - size, ifp->bLength); - return parsed; - } - if (ifp->bNumEndpoints > USB_MAXENDPOINTS) { - usbi_err(ctx, "too many endpoints (%d)", ifp->bNumEndpoints); - r = LIBUSB_ERROR_IO; - goto err; - } - - usb_interface->num_altsetting++; - ifp->extra = NULL; - ifp->extra_length = 0; - ifp->endpoint = NULL; - - if (interface_number == -1) - interface_number = ifp->bInterfaceNumber; - - /* Skip over the interface */ - buffer += ifp->bLength; - parsed += ifp->bLength; - size -= ifp->bLength; - - begin = buffer; - - /* Skip over any interface, class or vendor descriptors */ - while (size >= DESC_HEADER_LENGTH) { - usbi_parse_descriptor(buffer, "bb", &header, 0); - if (header.bLength < DESC_HEADER_LENGTH) { - usbi_err(ctx, - "invalid extra intf desc len (%d)", - header.bLength); - r = LIBUSB_ERROR_IO; - goto err; - } else if (header.bLength > size) { - usbi_warn(ctx, - "short extra intf desc read %d/%d", - size, header.bLength); - return parsed; - } - - /* If we find another "proper" descriptor then we're done */ - if ((header.bDescriptorType == LIBUSB_DT_INTERFACE) || - (header.bDescriptorType == LIBUSB_DT_ENDPOINT) || - (header.bDescriptorType == LIBUSB_DT_CONFIG) || - (header.bDescriptorType == LIBUSB_DT_DEVICE)) - break; - - buffer += header.bLength; - parsed += header.bLength; - size -= header.bLength; - } - - /* Copy any unknown descriptors into a storage area for */ - /* drivers to later parse */ - len = (int)(buffer - begin); - if (len) { - ifp->extra = malloc(len); - if (!ifp->extra) { - r = LIBUSB_ERROR_NO_MEM; - goto err; - } - memcpy((unsigned char *) ifp->extra, begin, len); - ifp->extra_length = len; - } - - if (ifp->bNumEndpoints > 0) { - struct libusb_endpoint_descriptor *endpoint; - endpoint = calloc(ifp->bNumEndpoints, sizeof(struct libusb_endpoint_descriptor)); - ifp->endpoint = endpoint; - if (!endpoint) { - r = LIBUSB_ERROR_NO_MEM; - goto err; - } - - for (i = 0; i < ifp->bNumEndpoints; i++) { - r = parse_endpoint(ctx, endpoint + i, buffer, size, - host_endian); - if (r < 0) - goto err; - if (r == 0) { - ifp->bNumEndpoints = (uint8_t)i; - break;; - } - - buffer += r; - parsed += r; - size -= r; - } - } - - /* We check to see if it's an alternate to this one */ - ifp = (struct libusb_interface_descriptor *) buffer; - if (size < LIBUSB_DT_INTERFACE_SIZE || - ifp->bDescriptorType != LIBUSB_DT_INTERFACE || - ifp->bInterfaceNumber != interface_number) - return parsed; - } - - return parsed; -err: - clear_interface(usb_interface); - return r; -} - -static void clear_configuration(struct libusb_config_descriptor *config) -{ - int i; - if (config->interface) { - for (i = 0; i < config->bNumInterfaces; i++) - clear_interface((struct libusb_interface *) - config->interface + i); - } - free((void *) config->interface); - free((void *) config->extra); -} - -static int parse_configuration(struct libusb_context *ctx, - struct libusb_config_descriptor *config, unsigned char *buffer, - int size, int host_endian) -{ - int i; - int r; - struct usb_descriptor_header header; - struct libusb_interface *usb_interface; - - if (size < LIBUSB_DT_CONFIG_SIZE) { - usbi_err(ctx, "short config descriptor read %d/%d", - size, LIBUSB_DT_CONFIG_SIZE); - return LIBUSB_ERROR_IO; - } - - usbi_parse_descriptor(buffer, "bbwbbbbb", config, host_endian); - if (config->bDescriptorType != LIBUSB_DT_CONFIG) { - usbi_err(ctx, "unexpected descriptor %x (expected %x)", - config->bDescriptorType, LIBUSB_DT_CONFIG); - return LIBUSB_ERROR_IO; - } - if (config->bLength < LIBUSB_DT_CONFIG_SIZE) { - usbi_err(ctx, "invalid config bLength (%d)", config->bLength); - return LIBUSB_ERROR_IO; - } - if (config->bLength > size) { - usbi_err(ctx, "short config descriptor read %d/%d", - size, config->bLength); - return LIBUSB_ERROR_IO; - } - if (config->bNumInterfaces > USB_MAXINTERFACES) { - usbi_err(ctx, "too many interfaces (%d)", config->bNumInterfaces); - return LIBUSB_ERROR_IO; - } - - usb_interface = calloc(config->bNumInterfaces, sizeof(struct libusb_interface)); - config->interface = usb_interface; - if (!usb_interface) - return LIBUSB_ERROR_NO_MEM; - - buffer += config->bLength; - size -= config->bLength; - - config->extra = NULL; - config->extra_length = 0; - - for (i = 0; i < config->bNumInterfaces; i++) { - int len; - unsigned char *begin; - - /* Skip over the rest of the Class Specific or Vendor */ - /* Specific descriptors */ - begin = buffer; - while (size >= DESC_HEADER_LENGTH) { - usbi_parse_descriptor(buffer, "bb", &header, 0); - - if (header.bLength < DESC_HEADER_LENGTH) { - usbi_err(ctx, - "invalid extra config desc len (%d)", - header.bLength); - r = LIBUSB_ERROR_IO; - goto err; - } else if (header.bLength > size) { - usbi_warn(ctx, - "short extra config desc read %d/%d", - size, header.bLength); - config->bNumInterfaces = (uint8_t)i; - return size; - } - - /* If we find another "proper" descriptor then we're done */ - if ((header.bDescriptorType == LIBUSB_DT_ENDPOINT) || - (header.bDescriptorType == LIBUSB_DT_INTERFACE) || - (header.bDescriptorType == LIBUSB_DT_CONFIG) || - (header.bDescriptorType == LIBUSB_DT_DEVICE)) - break; - - usbi_dbg("skipping descriptor 0x%x", header.bDescriptorType); - buffer += header.bLength; - size -= header.bLength; - } - - /* Copy any unknown descriptors into a storage area for */ - /* drivers to later parse */ - len = (int)(buffer - begin); - if (len) { - /* FIXME: We should realloc and append here */ - if (!config->extra_length) { - config->extra = malloc(len); - if (!config->extra) { - r = LIBUSB_ERROR_NO_MEM; - goto err; - } - - memcpy((unsigned char *) config->extra, begin, len); - config->extra_length = len; - } - } - - r = parse_interface(ctx, usb_interface + i, buffer, size, host_endian); - if (r < 0) - goto err; - if (r == 0) { - config->bNumInterfaces = (uint8_t)i; - break; - } - - buffer += r; - size -= r; - } - - return size; - -err: - clear_configuration(config); - return r; -} - -static int raw_desc_to_config(struct libusb_context *ctx, - unsigned char *buf, int size, int host_endian, - struct libusb_config_descriptor **config) -{ - struct libusb_config_descriptor *_config = malloc(sizeof(*_config)); - int r; - - if (!_config) - return LIBUSB_ERROR_NO_MEM; - - r = parse_configuration(ctx, _config, buf, size, host_endian); - if (r < 0) { - usbi_err(ctx, "parse_configuration failed with error %d", r); - free(_config); - return r; - } else if (r > 0) { - usbi_warn(ctx, "still %d bytes of descriptor data left", r); - } - - *config = _config; - return LIBUSB_SUCCESS; -} - -int usbi_device_cache_descriptor(libusb_device *dev) -{ - int r, host_endian = 0; - - r = usbi_backend->get_device_descriptor(dev, (unsigned char *) &dev->device_descriptor, - &host_endian); - if (r < 0) - return r; - - if (!host_endian) { - dev->device_descriptor.bcdUSB = libusb_le16_to_cpu(dev->device_descriptor.bcdUSB); - dev->device_descriptor.idVendor = libusb_le16_to_cpu(dev->device_descriptor.idVendor); - dev->device_descriptor.idProduct = libusb_le16_to_cpu(dev->device_descriptor.idProduct); - dev->device_descriptor.bcdDevice = libusb_le16_to_cpu(dev->device_descriptor.bcdDevice); - } - - return LIBUSB_SUCCESS; -} - -/** \ingroup libusb_desc - * Get the USB device descriptor for a given device. - * - * This is a non-blocking function; the device descriptor is cached in memory. - * - * Note since libusb-1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102, this - * function always succeeds. - * - * \param dev the device - * \param desc output location for the descriptor data - * \returns 0 on success or a LIBUSB_ERROR code on failure - */ -int API_EXPORTED libusb_get_device_descriptor(libusb_device *dev, - struct libusb_device_descriptor *desc) -{ - usbi_dbg(""); - memcpy((unsigned char *) desc, (unsigned char *) &dev->device_descriptor, - sizeof (dev->device_descriptor)); - return 0; -} - -/** \ingroup libusb_desc - * Get the USB configuration descriptor for the currently active configuration. - * This is a non-blocking function which does not involve any requests being - * sent to the device. - * - * \param dev a device - * \param config output location for the USB configuration descriptor. Only - * valid if 0 was returned. Must be freed with libusb_free_config_descriptor() - * after use. - * \returns 0 on success - * \returns LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state - * \returns another LIBUSB_ERROR code on error - * \see libusb_get_config_descriptor - */ -int API_EXPORTED libusb_get_active_config_descriptor(libusb_device *dev, - struct libusb_config_descriptor **config) -{ - struct libusb_config_descriptor _config; - unsigned char tmp[LIBUSB_DT_CONFIG_SIZE]; - unsigned char *buf = NULL; - int host_endian = 0; - int r; - - r = usbi_backend->get_active_config_descriptor(dev, tmp, - LIBUSB_DT_CONFIG_SIZE, &host_endian); - if (r < 0) - return r; - if (r < LIBUSB_DT_CONFIG_SIZE) { - usbi_err(dev->ctx, "short config descriptor read %d/%d", - r, LIBUSB_DT_CONFIG_SIZE); - return LIBUSB_ERROR_IO; - } - - usbi_parse_descriptor(tmp, "bbw", &_config, host_endian); - buf = malloc(_config.wTotalLength); - if (!buf) - return LIBUSB_ERROR_NO_MEM; - - r = usbi_backend->get_active_config_descriptor(dev, buf, - _config.wTotalLength, &host_endian); - if (r >= 0) - r = raw_desc_to_config(dev->ctx, buf, r, host_endian, config); - - free(buf); - return r; -} - -/** \ingroup libusb_desc - * Get a USB configuration descriptor based on its index. - * This is a non-blocking function which does not involve any requests being - * sent to the device. - * - * \param dev a device - * \param config_index the index of the configuration you wish to retrieve - * \param config output location for the USB configuration descriptor. Only - * valid if 0 was returned. Must be freed with libusb_free_config_descriptor() - * after use. - * \returns 0 on success - * \returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist - * \returns another LIBUSB_ERROR code on error - * \see libusb_get_active_config_descriptor() - * \see libusb_get_config_descriptor_by_value() - */ -int API_EXPORTED libusb_get_config_descriptor(libusb_device *dev, - uint8_t config_index, struct libusb_config_descriptor **config) -{ - struct libusb_config_descriptor _config; - unsigned char tmp[LIBUSB_DT_CONFIG_SIZE]; - unsigned char *buf = NULL; - int host_endian = 0; - int r; - - usbi_dbg("index %d", config_index); - if (config_index >= dev->num_configurations) - return LIBUSB_ERROR_NOT_FOUND; - - r = usbi_backend->get_config_descriptor(dev, config_index, tmp, - LIBUSB_DT_CONFIG_SIZE, &host_endian); - if (r < 0) - return r; - if (r < LIBUSB_DT_CONFIG_SIZE) { - usbi_err(dev->ctx, "short config descriptor read %d/%d", - r, LIBUSB_DT_CONFIG_SIZE); - return LIBUSB_ERROR_IO; - } - - usbi_parse_descriptor(tmp, "bbw", &_config, host_endian); - buf = malloc(_config.wTotalLength); - if (!buf) - return LIBUSB_ERROR_NO_MEM; - - r = usbi_backend->get_config_descriptor(dev, config_index, buf, - _config.wTotalLength, &host_endian); - if (r >= 0) - r = raw_desc_to_config(dev->ctx, buf, r, host_endian, config); - - free(buf); - return r; -} - -/* iterate through all configurations, returning the index of the configuration - * matching a specific bConfigurationValue in the idx output parameter, or -1 - * if the config was not found. - * returns 0 on success or a LIBUSB_ERROR code - */ -int usbi_get_config_index_by_value(struct libusb_device *dev, - uint8_t bConfigurationValue, int *idx) -{ - uint8_t i; - - usbi_dbg("value %d", bConfigurationValue); - for (i = 0; i < dev->num_configurations; i++) { - unsigned char tmp[6]; - int host_endian; - int r = usbi_backend->get_config_descriptor(dev, i, tmp, sizeof(tmp), - &host_endian); - if (r < 0) { - *idx = -1; - return r; - } - if (tmp[5] == bConfigurationValue) { - *idx = i; - return 0; - } - } - - *idx = -1; - return 0; -} - -/** \ingroup libusb_desc - * Get a USB configuration descriptor with a specific bConfigurationValue. - * This is a non-blocking function which does not involve any requests being - * sent to the device. - * - * \param dev a device - * \param bConfigurationValue the bConfigurationValue of the configuration you - * wish to retrieve - * \param config output location for the USB configuration descriptor. Only - * valid if 0 was returned. Must be freed with libusb_free_config_descriptor() - * after use. - * \returns 0 on success - * \returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist - * \returns another LIBUSB_ERROR code on error - * \see libusb_get_active_config_descriptor() - * \see libusb_get_config_descriptor() - */ -int API_EXPORTED libusb_get_config_descriptor_by_value(libusb_device *dev, - uint8_t bConfigurationValue, struct libusb_config_descriptor **config) -{ - int r, idx, host_endian; - unsigned char *buf = NULL; - - if (usbi_backend->get_config_descriptor_by_value) { - r = usbi_backend->get_config_descriptor_by_value(dev, - bConfigurationValue, &buf, &host_endian); - if (r < 0) - return r; - return raw_desc_to_config(dev->ctx, buf, r, host_endian, config); - } - - r = usbi_get_config_index_by_value(dev, bConfigurationValue, &idx); - if (r < 0) - return r; - else if (idx == -1) - return LIBUSB_ERROR_NOT_FOUND; - else - return libusb_get_config_descriptor(dev, (uint8_t) idx, config); -} - -/** \ingroup libusb_desc - * Free a configuration descriptor obtained from - * libusb_get_active_config_descriptor() or libusb_get_config_descriptor(). - * It is safe to call this function with a NULL config parameter, in which - * case the function simply returns. - * - * \param config the configuration descriptor to free - */ -void API_EXPORTED libusb_free_config_descriptor( - struct libusb_config_descriptor *config) -{ - if (!config) - return; - - clear_configuration(config); - free(config); -} - -/** \ingroup libusb_desc - * Get an endpoints superspeed endpoint companion descriptor (if any) - * - * \param ctx the context to operate on, or NULL for the default context - * \param endpoint endpoint descriptor from which to get the superspeed - * endpoint companion descriptor - * \param ep_comp output location for the superspeed endpoint companion - * descriptor. Only valid if 0 was returned. Must be freed with - * libusb_free_ss_endpoint_companion_descriptor() after use. - * \returns 0 on success - * \returns LIBUSB_ERROR_NOT_FOUND if the configuration does not exist - * \returns another LIBUSB_ERROR code on error - */ -int API_EXPORTED libusb_get_ss_endpoint_companion_descriptor( - struct libusb_context *ctx, - const struct libusb_endpoint_descriptor *endpoint, - struct libusb_ss_endpoint_companion_descriptor **ep_comp) -{ - struct usb_descriptor_header header; - int size = endpoint->extra_length; - const unsigned char *buffer = endpoint->extra; - - *ep_comp = NULL; - - while (size >= DESC_HEADER_LENGTH) { - usbi_parse_descriptor(buffer, "bb", &header, 0); - if (header.bLength < 2 || header.bLength > size) { - usbi_err(ctx, "invalid descriptor length %d", - header.bLength); - return LIBUSB_ERROR_IO; - } - if (header.bDescriptorType != LIBUSB_DT_SS_ENDPOINT_COMPANION) { - buffer += header.bLength; - size -= header.bLength; - continue; - } - if (header.bLength < LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE) { - usbi_err(ctx, "invalid ss-ep-comp-desc length %d", - header.bLength); - return LIBUSB_ERROR_IO; - } - *ep_comp = malloc(sizeof(**ep_comp)); - if (*ep_comp == NULL) - return LIBUSB_ERROR_NO_MEM; - usbi_parse_descriptor(buffer, "bbbbw", *ep_comp, 0); - return LIBUSB_SUCCESS; - } - return LIBUSB_ERROR_NOT_FOUND; -} - -/** \ingroup libusb_desc - * Free a superspeed endpoint companion descriptor obtained from - * libusb_get_ss_endpoint_companion_descriptor(). - * It is safe to call this function with a NULL ep_comp parameter, in which - * case the function simply returns. - * - * \param ep_comp the superspeed endpoint companion descriptor to free - */ -void API_EXPORTED libusb_free_ss_endpoint_companion_descriptor( - struct libusb_ss_endpoint_companion_descriptor *ep_comp) -{ - free(ep_comp); -} - -static int parse_bos(struct libusb_context *ctx, - struct libusb_bos_descriptor **bos, - unsigned char *buffer, int size, int host_endian) -{ - struct libusb_bos_descriptor bos_header, *_bos; - struct libusb_bos_dev_capability_descriptor dev_cap; - int i; - - if (size < LIBUSB_DT_BOS_SIZE) { - usbi_err(ctx, "short bos descriptor read %d/%d", - size, LIBUSB_DT_BOS_SIZE); - return LIBUSB_ERROR_IO; - } - - usbi_parse_descriptor(buffer, "bbwb", &bos_header, host_endian); - if (bos_header.bDescriptorType != LIBUSB_DT_BOS) { - usbi_err(ctx, "unexpected descriptor %x (expected %x)", - bos_header.bDescriptorType, LIBUSB_DT_BOS); - return LIBUSB_ERROR_IO; - } - if (bos_header.bLength < LIBUSB_DT_BOS_SIZE) { - usbi_err(ctx, "invalid bos bLength (%d)", bos_header.bLength); - return LIBUSB_ERROR_IO; - } - if (bos_header.bLength > size) { - usbi_err(ctx, "short bos descriptor read %d/%d", - size, bos_header.bLength); - return LIBUSB_ERROR_IO; - } - - _bos = calloc (1, - sizeof(*_bos) + bos_header.bNumDeviceCaps * sizeof(void *)); - if (!_bos) - return LIBUSB_ERROR_NO_MEM; - - usbi_parse_descriptor(buffer, "bbwb", _bos, host_endian); - buffer += bos_header.bLength; - size -= bos_header.bLength; - - /* Get the device capability descriptors */ - for (i = 0; i < bos_header.bNumDeviceCaps; i++) { - if (size < LIBUSB_DT_DEVICE_CAPABILITY_SIZE) { - usbi_warn(ctx, "short dev-cap descriptor read %d/%d", - size, LIBUSB_DT_DEVICE_CAPABILITY_SIZE); - break; - } - usbi_parse_descriptor(buffer, "bbb", &dev_cap, host_endian); - if (dev_cap.bDescriptorType != LIBUSB_DT_DEVICE_CAPABILITY) { - usbi_warn(ctx, "unexpected descriptor %x (expected %x)", - dev_cap.bDescriptorType, LIBUSB_DT_DEVICE_CAPABILITY); - break; - } - if (dev_cap.bLength < LIBUSB_DT_DEVICE_CAPABILITY_SIZE) { - usbi_err(ctx, "invalid dev-cap bLength (%d)", - dev_cap.bLength); - libusb_free_bos_descriptor(_bos); - return LIBUSB_ERROR_IO; - } - if (dev_cap.bLength > size) { - usbi_warn(ctx, "short dev-cap descriptor read %d/%d", - size, dev_cap.bLength); - break; - } - - _bos->dev_capability[i] = malloc(dev_cap.bLength); - if (!_bos->dev_capability[i]) { - libusb_free_bos_descriptor(_bos); - return LIBUSB_ERROR_NO_MEM; - } - memcpy(_bos->dev_capability[i], buffer, dev_cap.bLength); - buffer += dev_cap.bLength; - size -= dev_cap.bLength; - } - _bos->bNumDeviceCaps = (uint8_t)i; - *bos = _bos; - - return LIBUSB_SUCCESS; -} - -/** \ingroup libusb_desc - * Get a Binary Object Store (BOS) descriptor - * This is a BLOCKING function, which will send requests to the device. - * - * \param dev_handle the handle of an open libusb device - * \param bos output location for the BOS descriptor. Only valid if 0 was returned. - * Must be freed with \ref libusb_free_bos_descriptor() after use. - * \returns 0 on success - * \returns LIBUSB_ERROR_NOT_FOUND if the device doesn't have a BOS descriptor - * \returns another LIBUSB_ERROR code on error - */ -int API_EXPORTED libusb_get_bos_descriptor(libusb_device_handle *dev_handle, - struct libusb_bos_descriptor **bos) -{ - struct libusb_bos_descriptor _bos; - uint8_t bos_header[LIBUSB_DT_BOS_SIZE] = {0}; - unsigned char *bos_data = NULL; - const int host_endian = 0; - int r; - - /* Read the BOS. This generates 2 requests on the bus, - * one for the header, and one for the full BOS */ - r = libusb_get_descriptor(dev_handle, LIBUSB_DT_BOS, 0, bos_header, - LIBUSB_DT_BOS_SIZE); - if (r < 0) { - if (r != LIBUSB_ERROR_PIPE) - usbi_err(HANDLE_CTX(dev_handle), "failed to read BOS (%d)", r); - return r; - } - if (r < LIBUSB_DT_BOS_SIZE) { - usbi_err(HANDLE_CTX(dev_handle), "short BOS read %d/%d", - r, LIBUSB_DT_BOS_SIZE); - return LIBUSB_ERROR_IO; - } - - usbi_parse_descriptor(bos_header, "bbwb", &_bos, host_endian); - usbi_dbg("found BOS descriptor: size %d bytes, %d capabilities", - _bos.wTotalLength, _bos.bNumDeviceCaps); - bos_data = calloc(_bos.wTotalLength, 1); - if (bos_data == NULL) - return LIBUSB_ERROR_NO_MEM; - - r = libusb_get_descriptor(dev_handle, LIBUSB_DT_BOS, 0, bos_data, - _bos.wTotalLength); - if (r >= 0) - r = parse_bos(HANDLE_CTX(dev_handle), bos, bos_data, r, host_endian); - else - usbi_err(HANDLE_CTX(dev_handle), "failed to read BOS (%d)", r); - - free(bos_data); - return r; -} - -/** \ingroup libusb_desc - * Free a BOS descriptor obtained from libusb_get_bos_descriptor(). - * It is safe to call this function with a NULL bos parameter, in which - * case the function simply returns. - * - * \param bos the BOS descriptor to free - */ -void API_EXPORTED libusb_free_bos_descriptor(struct libusb_bos_descriptor *bos) -{ - int i; - - if (!bos) - return; - - for (i = 0; i < bos->bNumDeviceCaps; i++) - free(bos->dev_capability[i]); - free(bos); -} - -/** \ingroup libusb_desc - * Get an USB 2.0 Extension descriptor - * - * \param ctx the context to operate on, or NULL for the default context - * \param dev_cap Device Capability descriptor with a bDevCapabilityType of - * \ref libusb_capability_type::LIBUSB_BT_USB_2_0_EXTENSION - * LIBUSB_BT_USB_2_0_EXTENSION - * \param usb_2_0_extension output location for the USB 2.0 Extension - * descriptor. Only valid if 0 was returned. Must be freed with - * libusb_free_usb_2_0_extension_descriptor() after use. - * \returns 0 on success - * \returns a LIBUSB_ERROR code on error - */ -int API_EXPORTED libusb_get_usb_2_0_extension_descriptor( - struct libusb_context *ctx, - struct libusb_bos_dev_capability_descriptor *dev_cap, - struct libusb_usb_2_0_extension_descriptor **usb_2_0_extension) -{ - struct libusb_usb_2_0_extension_descriptor *_usb_2_0_extension; - const int host_endian = 0; - - if (dev_cap->bDevCapabilityType != LIBUSB_BT_USB_2_0_EXTENSION) { - usbi_err(ctx, "unexpected bDevCapabilityType %x (expected %x)", - dev_cap->bDevCapabilityType, - LIBUSB_BT_USB_2_0_EXTENSION); - return LIBUSB_ERROR_INVALID_PARAM; - } - if (dev_cap->bLength < LIBUSB_BT_USB_2_0_EXTENSION_SIZE) { - usbi_err(ctx, "short dev-cap descriptor read %d/%d", - dev_cap->bLength, LIBUSB_BT_USB_2_0_EXTENSION_SIZE); - return LIBUSB_ERROR_IO; - } - - _usb_2_0_extension = malloc(sizeof(*_usb_2_0_extension)); - if (!_usb_2_0_extension) - return LIBUSB_ERROR_NO_MEM; - - usbi_parse_descriptor((unsigned char *)dev_cap, "bbbd", - _usb_2_0_extension, host_endian); - - *usb_2_0_extension = _usb_2_0_extension; - return LIBUSB_SUCCESS; -} - -/** \ingroup libusb_desc - * Free a USB 2.0 Extension descriptor obtained from - * libusb_get_usb_2_0_extension_descriptor(). - * It is safe to call this function with a NULL usb_2_0_extension parameter, - * in which case the function simply returns. - * - * \param usb_2_0_extension the USB 2.0 Extension descriptor to free - */ -void API_EXPORTED libusb_free_usb_2_0_extension_descriptor( - struct libusb_usb_2_0_extension_descriptor *usb_2_0_extension) -{ - free(usb_2_0_extension); -} - -/** \ingroup libusb_desc - * Get a SuperSpeed USB Device Capability descriptor - * - * \param ctx the context to operate on, or NULL for the default context - * \param dev_cap Device Capability descriptor with a bDevCapabilityType of - * \ref libusb_capability_type::LIBUSB_BT_SS_USB_DEVICE_CAPABILITY - * LIBUSB_BT_SS_USB_DEVICE_CAPABILITY - * \param ss_usb_device_cap output location for the SuperSpeed USB Device - * Capability descriptor. Only valid if 0 was returned. Must be freed with - * libusb_free_ss_usb_device_capability_descriptor() after use. - * \returns 0 on success - * \returns a LIBUSB_ERROR code on error - */ -int API_EXPORTED libusb_get_ss_usb_device_capability_descriptor( - struct libusb_context *ctx, - struct libusb_bos_dev_capability_descriptor *dev_cap, - struct libusb_ss_usb_device_capability_descriptor **ss_usb_device_cap) -{ - struct libusb_ss_usb_device_capability_descriptor *_ss_usb_device_cap; - const int host_endian = 0; - - if (dev_cap->bDevCapabilityType != LIBUSB_BT_SS_USB_DEVICE_CAPABILITY) { - usbi_err(ctx, "unexpected bDevCapabilityType %x (expected %x)", - dev_cap->bDevCapabilityType, - LIBUSB_BT_SS_USB_DEVICE_CAPABILITY); - return LIBUSB_ERROR_INVALID_PARAM; - } - if (dev_cap->bLength < LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE) { - usbi_err(ctx, "short dev-cap descriptor read %d/%d", - dev_cap->bLength, LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE); - return LIBUSB_ERROR_IO; - } - - _ss_usb_device_cap = malloc(sizeof(*_ss_usb_device_cap)); - if (!_ss_usb_device_cap) - return LIBUSB_ERROR_NO_MEM; - - usbi_parse_descriptor((unsigned char *)dev_cap, "bbbbwbbw", - _ss_usb_device_cap, host_endian); - - *ss_usb_device_cap = _ss_usb_device_cap; - return LIBUSB_SUCCESS; -} - -/** \ingroup libusb_desc - * Free a SuperSpeed USB Device Capability descriptor obtained from - * libusb_get_ss_usb_device_capability_descriptor(). - * It is safe to call this function with a NULL ss_usb_device_cap - * parameter, in which case the function simply returns. - * - * \param ss_usb_device_cap the USB 2.0 Extension descriptor to free - */ -void API_EXPORTED libusb_free_ss_usb_device_capability_descriptor( - struct libusb_ss_usb_device_capability_descriptor *ss_usb_device_cap) -{ - free(ss_usb_device_cap); -} - -/** \ingroup libusb_desc - * Get a Container ID descriptor - * - * \param ctx the context to operate on, or NULL for the default context - * \param dev_cap Device Capability descriptor with a bDevCapabilityType of - * \ref libusb_capability_type::LIBUSB_BT_CONTAINER_ID - * LIBUSB_BT_CONTAINER_ID - * \param container_id output location for the Container ID descriptor. - * Only valid if 0 was returned. Must be freed with - * libusb_free_container_id_descriptor() after use. - * \returns 0 on success - * \returns a LIBUSB_ERROR code on error - */ -int API_EXPORTED libusb_get_container_id_descriptor(struct libusb_context *ctx, - struct libusb_bos_dev_capability_descriptor *dev_cap, - struct libusb_container_id_descriptor **container_id) -{ - struct libusb_container_id_descriptor *_container_id; - const int host_endian = 0; - - if (dev_cap->bDevCapabilityType != LIBUSB_BT_CONTAINER_ID) { - usbi_err(ctx, "unexpected bDevCapabilityType %x (expected %x)", - dev_cap->bDevCapabilityType, - LIBUSB_BT_CONTAINER_ID); - return LIBUSB_ERROR_INVALID_PARAM; - } - if (dev_cap->bLength < LIBUSB_BT_CONTAINER_ID_SIZE) { - usbi_err(ctx, "short dev-cap descriptor read %d/%d", - dev_cap->bLength, LIBUSB_BT_CONTAINER_ID_SIZE); - return LIBUSB_ERROR_IO; - } - - _container_id = malloc(sizeof(*_container_id)); - if (!_container_id) - return LIBUSB_ERROR_NO_MEM; - - usbi_parse_descriptor((unsigned char *)dev_cap, "bbbbu", - _container_id, host_endian); - - *container_id = _container_id; - return LIBUSB_SUCCESS; -} - -/** \ingroup libusb_desc - * Free a Container ID descriptor obtained from - * libusb_get_container_id_descriptor(). - * It is safe to call this function with a NULL container_id parameter, - * in which case the function simply returns. - * - * \param container_id the USB 2.0 Extension descriptor to free - */ -void API_EXPORTED libusb_free_container_id_descriptor( - struct libusb_container_id_descriptor *container_id) -{ - free(container_id); -} - -/** \ingroup libusb_desc - * Retrieve a string descriptor in C style ASCII. - * - * Wrapper around libusb_get_string_descriptor(). Uses the first language - * supported by the device. - * - * \param dev_handle a device handle - * \param desc_index the index of the descriptor to retrieve - * \param data output buffer for ASCII string descriptor - * \param length size of data buffer - * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure - */ -int API_EXPORTED libusb_get_string_descriptor_ascii(libusb_device_handle *dev_handle, - uint8_t desc_index, unsigned char *data, int length) -{ - unsigned char tbuf[255]; /* Some devices choke on size > 255 */ - int r, si, di; - uint16_t langid; - - /* Asking for the zero'th index is special - it returns a string - * descriptor that contains all the language IDs supported by the - * device. Typically there aren't many - often only one. Language - * IDs are 16 bit numbers, and they start at the third byte in the - * descriptor. There's also no point in trying to read descriptor 0 - * with this function. See USB 2.0 specification section 9.6.7 for - * more information. - */ - - if (desc_index == 0) - return LIBUSB_ERROR_INVALID_PARAM; - - r = libusb_get_string_descriptor(dev_handle, 0, 0, tbuf, sizeof(tbuf)); - if (r < 0) - return r; - - if (r < 4) - return LIBUSB_ERROR_IO; - - langid = tbuf[2] | (tbuf[3] << 8); - - r = libusb_get_string_descriptor(dev_handle, desc_index, langid, tbuf, - sizeof(tbuf)); - if (r < 0) - return r; - - if (tbuf[1] != LIBUSB_DT_STRING) - return LIBUSB_ERROR_IO; - - if (tbuf[0] > r) - return LIBUSB_ERROR_IO; - - for (di = 0, si = 2; si < tbuf[0]; si += 2) { - if (di >= (length - 1)) - break; - - if ((tbuf[si] & 0x80) || (tbuf[si + 1])) /* non-ASCII */ - data[di++] = '?'; - else - data[di++] = tbuf[si]; - } - - data[di] = 0; - return di; -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/hotplug.c b/vendor/github.com/karalabe/hid/libusb/libusb/hotplug.c deleted file mode 100644 index bbfd6e79a1a9..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/hotplug.c +++ /dev/null @@ -1,350 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ -/* - * Hotplug functions for libusb - * Copyright © 2012-2013 Nathan Hjelm - * Copyright © 2012-2013 Peter Stuge - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include -#include -#include -#ifdef HAVE_SYS_TYPES_H -#include -#endif -#include - -#include "libusbi.h" -#include "hotplug.h" - -/** - * @defgroup libusb_hotplug Device hotplug event notification - * This page details how to use the libusb hotplug interface, where available. - * - * Be mindful that not all platforms currently implement hotplug notification and - * that you should first call on \ref libusb_has_capability() with parameter - * \ref LIBUSB_CAP_HAS_HOTPLUG to confirm that hotplug support is available. - * - * \page libusb_hotplug Device hotplug event notification - * - * \section hotplug_intro Introduction - * - * Version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102, has added support - * for hotplug events on some platforms (you should test if your platform - * supports hotplug notification by calling \ref libusb_has_capability() with - * parameter \ref LIBUSB_CAP_HAS_HOTPLUG). - * - * This interface allows you to request notification for the arrival and departure - * of matching USB devices. - * - * To receive hotplug notification you register a callback by calling - * \ref libusb_hotplug_register_callback(). This function will optionally return - * a callback handle that can be passed to \ref libusb_hotplug_deregister_callback(). - * - * A callback function must return an int (0 or 1) indicating whether the callback is - * expecting additional events. Returning 0 will rearm the callback and 1 will cause - * the callback to be deregistered. Note that when callbacks are called from - * libusb_hotplug_register_callback() because of the \ref LIBUSB_HOTPLUG_ENUMERATE - * flag, the callback return value is ignored, iow you cannot cause a callback - * to be deregistered by returning 1 when it is called from - * libusb_hotplug_register_callback(). - * - * Callbacks for a particular context are automatically deregistered by libusb_exit(). - * - * As of 1.0.16 there are two supported hotplug events: - * - LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED: A device has arrived and is ready to use - * - LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT: A device has left and is no longer available - * - * A hotplug event can listen for either or both of these events. - * - * Note: If you receive notification that a device has left and you have any - * a libusb_device_handles for the device it is up to you to call libusb_close() - * on each device handle to free up any remaining resources associated with the device. - * Once a device has left any libusb_device_handle associated with the device - * are invalid and will remain so even if the device comes back. - * - * When handling a LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED event it is considered - * safe to call any libusb function that takes a libusb_device. It also safe to - * open a device and submit asynchronous transfers. However, most other functions - * that take a libusb_device_handle are not safe to call. Examples of such - * functions are any of the \ref libusb_syncio "synchronous API" functions or the blocking - * functions that retrieve various \ref libusb_desc "USB descriptors". These functions must - * be used outside of the context of the hotplug callback. - * - * When handling a LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT event the only safe function - * is libusb_get_device_descriptor(). - * - * The following code provides an example of the usage of the hotplug interface: -\code -#include -#include -#include -#include - -static int count = 0; - -int hotplug_callback(struct libusb_context *ctx, struct libusb_device *dev, - libusb_hotplug_event event, void *user_data) { - static libusb_device_handle *dev_handle = NULL; - struct libusb_device_descriptor desc; - int rc; - - (void)libusb_get_device_descriptor(dev, &desc); - - if (LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED == event) { - rc = libusb_open(dev, &dev_handle); - if (LIBUSB_SUCCESS != rc) { - printf("Could not open USB device\n"); - } - } else if (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == event) { - if (dev_handle) { - libusb_close(dev_handle); - dev_handle = NULL; - } - } else { - printf("Unhandled event %d\n", event); - } - count++; - - return 0; -} - -int main (void) { - libusb_hotplug_callback_handle callback_handle; - int rc; - - libusb_init(NULL); - - rc = libusb_hotplug_register_callback(NULL, LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED | - LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT, 0, 0x045a, 0x5005, - LIBUSB_HOTPLUG_MATCH_ANY, hotplug_callback, NULL, - &callback_handle); - if (LIBUSB_SUCCESS != rc) { - printf("Error creating a hotplug callback\n"); - libusb_exit(NULL); - return EXIT_FAILURE; - } - - while (count < 2) { - libusb_handle_events_completed(NULL, NULL); - nanosleep(&(struct timespec){0, 10000000UL}, NULL); - } - - libusb_hotplug_deregister_callback(NULL, callback_handle); - libusb_exit(NULL); - - return 0; -} -\endcode - */ - -static int usbi_hotplug_match_cb (struct libusb_context *ctx, - struct libusb_device *dev, libusb_hotplug_event event, - struct libusb_hotplug_callback *hotplug_cb) -{ - /* Handle lazy deregistration of callback */ - if (hotplug_cb->needs_free) { - /* Free callback */ - return 1; - } - - if (!(hotplug_cb->events & event)) { - return 0; - } - - if (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->vendor_id && - hotplug_cb->vendor_id != dev->device_descriptor.idVendor) { - return 0; - } - - if (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->product_id && - hotplug_cb->product_id != dev->device_descriptor.idProduct) { - return 0; - } - - if (LIBUSB_HOTPLUG_MATCH_ANY != hotplug_cb->dev_class && - hotplug_cb->dev_class != dev->device_descriptor.bDeviceClass) { - return 0; - } - - return hotplug_cb->cb (ctx, dev, event, hotplug_cb->user_data); -} - -void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev, - libusb_hotplug_event event) -{ - struct libusb_hotplug_callback *hotplug_cb, *next; - int ret; - - usbi_mutex_lock(&ctx->hotplug_cbs_lock); - - list_for_each_entry_safe(hotplug_cb, next, &ctx->hotplug_cbs, list, struct libusb_hotplug_callback) { - usbi_mutex_unlock(&ctx->hotplug_cbs_lock); - ret = usbi_hotplug_match_cb (ctx, dev, event, hotplug_cb); - usbi_mutex_lock(&ctx->hotplug_cbs_lock); - - if (ret) { - list_del(&hotplug_cb->list); - free(hotplug_cb); - } - } - - usbi_mutex_unlock(&ctx->hotplug_cbs_lock); - - /* the backend is expected to call the callback for each active transfer */ -} - -void usbi_hotplug_notification(struct libusb_context *ctx, struct libusb_device *dev, - libusb_hotplug_event event) -{ - int pending_events; - libusb_hotplug_message *message = calloc(1, sizeof(*message)); - - if (!message) { - usbi_err(ctx, "error allocating hotplug message"); - return; - } - - message->event = event; - message->device = dev; - - /* Take the event data lock and add this message to the list. - * Only signal an event if there are no prior pending events. */ - usbi_mutex_lock(&ctx->event_data_lock); - pending_events = usbi_pending_events(ctx); - list_add_tail(&message->list, &ctx->hotplug_msgs); - if (!pending_events) - usbi_signal_event(ctx); - usbi_mutex_unlock(&ctx->event_data_lock); -} - -int API_EXPORTED libusb_hotplug_register_callback(libusb_context *ctx, - libusb_hotplug_event events, libusb_hotplug_flag flags, - int vendor_id, int product_id, int dev_class, - libusb_hotplug_callback_fn cb_fn, void *user_data, - libusb_hotplug_callback_handle *callback_handle) -{ - libusb_hotplug_callback *new_callback; - static int handle_id = 1; - - /* check for hotplug support */ - if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { - return LIBUSB_ERROR_NOT_SUPPORTED; - } - - /* check for sane values */ - if ((LIBUSB_HOTPLUG_MATCH_ANY != vendor_id && (~0xffff & vendor_id)) || - (LIBUSB_HOTPLUG_MATCH_ANY != product_id && (~0xffff & product_id)) || - (LIBUSB_HOTPLUG_MATCH_ANY != dev_class && (~0xff & dev_class)) || - !cb_fn) { - return LIBUSB_ERROR_INVALID_PARAM; - } - - USBI_GET_CONTEXT(ctx); - - new_callback = (libusb_hotplug_callback *)calloc(1, sizeof (*new_callback)); - if (!new_callback) { - return LIBUSB_ERROR_NO_MEM; - } - - new_callback->ctx = ctx; - new_callback->vendor_id = vendor_id; - new_callback->product_id = product_id; - new_callback->dev_class = dev_class; - new_callback->flags = flags; - new_callback->events = events; - new_callback->cb = cb_fn; - new_callback->user_data = user_data; - new_callback->needs_free = 0; - - usbi_mutex_lock(&ctx->hotplug_cbs_lock); - - /* protect the handle by the context hotplug lock. it doesn't matter if the same handle - * is used for different contexts only that the handle is unique for this context */ - new_callback->handle = handle_id++; - - list_add(&new_callback->list, &ctx->hotplug_cbs); - - usbi_mutex_unlock(&ctx->hotplug_cbs_lock); - - - if (flags & LIBUSB_HOTPLUG_ENUMERATE) { - int i, len; - struct libusb_device **devs; - - len = (int) libusb_get_device_list(ctx, &devs); - if (len < 0) { - libusb_hotplug_deregister_callback(ctx, - new_callback->handle); - return len; - } - - for (i = 0; i < len; i++) { - usbi_hotplug_match_cb(ctx, devs[i], - LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED, - new_callback); - } - - libusb_free_device_list(devs, 1); - } - - - if (callback_handle) - *callback_handle = new_callback->handle; - - return LIBUSB_SUCCESS; -} - -void API_EXPORTED libusb_hotplug_deregister_callback (struct libusb_context *ctx, - libusb_hotplug_callback_handle callback_handle) -{ - struct libusb_hotplug_callback *hotplug_cb; - - /* check for hotplug support */ - if (!libusb_has_capability(LIBUSB_CAP_HAS_HOTPLUG)) { - return; - } - - USBI_GET_CONTEXT(ctx); - - usbi_mutex_lock(&ctx->hotplug_cbs_lock); - list_for_each_entry(hotplug_cb, &ctx->hotplug_cbs, list, - struct libusb_hotplug_callback) { - if (callback_handle == hotplug_cb->handle) { - /* Mark this callback for deregistration */ - hotplug_cb->needs_free = 1; - } - } - usbi_mutex_unlock(&ctx->hotplug_cbs_lock); - - usbi_hotplug_notification(ctx, NULL, 0); -} - -void usbi_hotplug_deregister_all(struct libusb_context *ctx) { - struct libusb_hotplug_callback *hotplug_cb, *next; - - usbi_mutex_lock(&ctx->hotplug_cbs_lock); - list_for_each_entry_safe(hotplug_cb, next, &ctx->hotplug_cbs, list, - struct libusb_hotplug_callback) { - list_del(&hotplug_cb->list); - free(hotplug_cb); - } - - usbi_mutex_unlock(&ctx->hotplug_cbs_lock); -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/hotplug.h b/vendor/github.com/karalabe/hid/libusb/libusb/hotplug.h deleted file mode 100644 index 2bec81b06c42..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/hotplug.h +++ /dev/null @@ -1,90 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ -/* - * Hotplug support for libusb - * Copyright © 2012-2013 Nathan Hjelm - * Copyright © 2012-2013 Peter Stuge - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#if !defined(USBI_HOTPLUG_H) -#define USBI_HOTPLUG_H - -#ifndef LIBUSBI_H -#include "libusbi.h" -#endif - -/** \ingroup hotplug - * The hotplug callback structure. The user populates this structure with - * libusb_hotplug_prepare_callback() and then calls libusb_hotplug_register_callback() - * to receive notification of hotplug events. - */ -struct libusb_hotplug_callback { - /** Context this callback is associated with */ - struct libusb_context *ctx; - - /** Vendor ID to match or LIBUSB_HOTPLUG_MATCH_ANY */ - int vendor_id; - - /** Product ID to match or LIBUSB_HOTPLUG_MATCH_ANY */ - int product_id; - - /** Device class to match or LIBUSB_HOTPLUG_MATCH_ANY */ - int dev_class; - - /** Hotplug callback flags */ - libusb_hotplug_flag flags; - - /** Event(s) that will trigger this callback */ - libusb_hotplug_event events; - - /** Callback function to invoke for matching event/device */ - libusb_hotplug_callback_fn cb; - - /** Handle for this callback (used to match on deregister) */ - libusb_hotplug_callback_handle handle; - - /** User data that will be passed to the callback function */ - void *user_data; - - /** Callback is marked for deletion */ - int needs_free; - - /** List this callback is registered in (ctx->hotplug_cbs) */ - struct list_head list; -}; - -typedef struct libusb_hotplug_callback libusb_hotplug_callback; - -struct libusb_hotplug_message { - /** The hotplug event that occurred */ - libusb_hotplug_event event; - - /** The device for which this hotplug event occurred */ - struct libusb_device *device; - - /** List this message is contained in (ctx->hotplug_msgs) */ - struct list_head list; -}; - -typedef struct libusb_hotplug_message libusb_hotplug_message; - -void usbi_hotplug_deregister_all(struct libusb_context *ctx); -void usbi_hotplug_match(struct libusb_context *ctx, struct libusb_device *dev, - libusb_hotplug_event event); -void usbi_hotplug_notification(struct libusb_context *ctx, struct libusb_device *dev, - libusb_hotplug_event event); - -#endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/io.c b/vendor/github.com/karalabe/hid/libusb/libusb/io.c deleted file mode 100644 index eb1eabf1cb74..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/io.c +++ /dev/null @@ -1,2819 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode:t ; c-basic-offset:8 -*- */ -/* - * I/O functions for libusb - * Copyright © 2007-2009 Daniel Drake - * Copyright © 2001 Johannes Erdfelt - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include -#include -#include -#include -#include -#ifdef HAVE_SYS_TIME_H -#include -#endif -#ifdef USBI_TIMERFD_AVAILABLE -#include -#endif - -#include "libusbi.h" -#include "hotplug.h" - -/** - * \page libusb_io Synchronous and asynchronous device I/O - * - * \section io_intro Introduction - * - * If you're using libusb in your application, you're probably wanting to - * perform I/O with devices - you want to perform USB data transfers. - * - * libusb offers two separate interfaces for device I/O. This page aims to - * introduce the two in order to help you decide which one is more suitable - * for your application. You can also choose to use both interfaces in your - * application by considering each transfer on a case-by-case basis. - * - * Once you have read through the following discussion, you should consult the - * detailed API documentation pages for the details: - * - \ref libusb_syncio - * - \ref libusb_asyncio - * - * \section theory Transfers at a logical level - * - * At a logical level, USB transfers typically happen in two parts. For - * example, when reading data from a endpoint: - * -# A request for data is sent to the device - * -# Some time later, the incoming data is received by the host - * - * or when writing data to an endpoint: - * - * -# The data is sent to the device - * -# Some time later, the host receives acknowledgement from the device that - * the data has been transferred. - * - * There may be an indefinite delay between the two steps. Consider a - * fictional USB input device with a button that the user can press. In order - * to determine when the button is pressed, you would likely submit a request - * to read data on a bulk or interrupt endpoint and wait for data to arrive. - * Data will arrive when the button is pressed by the user, which is - * potentially hours later. - * - * libusb offers both a synchronous and an asynchronous interface to performing - * USB transfers. The main difference is that the synchronous interface - * combines both steps indicated above into a single function call, whereas - * the asynchronous interface separates them. - * - * \section sync The synchronous interface - * - * The synchronous I/O interface allows you to perform a USB transfer with - * a single function call. When the function call returns, the transfer has - * completed and you can parse the results. - * - * If you have used the libusb-0.1 before, this I/O style will seem familar to - * you. libusb-0.1 only offered a synchronous interface. - * - * In our input device example, to read button presses you might write code - * in the following style: -\code -unsigned char data[4]; -int actual_length; -int r = libusb_bulk_transfer(dev_handle, LIBUSB_ENDPOINT_IN, data, sizeof(data), &actual_length, 0); -if (r == 0 && actual_length == sizeof(data)) { - // results of the transaction can now be found in the data buffer - // parse them here and report button press -} else { - error(); -} -\endcode - * - * The main advantage of this model is simplicity: you did everything with - * a single simple function call. - * - * However, this interface has its limitations. Your application will sleep - * inside libusb_bulk_transfer() until the transaction has completed. If it - * takes the user 3 hours to press the button, your application will be - * sleeping for that long. Execution will be tied up inside the library - - * the entire thread will be useless for that duration. - * - * Another issue is that by tieing up the thread with that single transaction - * there is no possibility of performing I/O with multiple endpoints and/or - * multiple devices simultaneously, unless you resort to creating one thread - * per transaction. - * - * Additionally, there is no opportunity to cancel the transfer after the - * request has been submitted. - * - * For details on how to use the synchronous API, see the - * \ref libusb_syncio "synchronous I/O API documentation" pages. - * - * \section async The asynchronous interface - * - * Asynchronous I/O is the most significant new feature in libusb-1.0. - * Although it is a more complex interface, it solves all the issues detailed - * above. - * - * Instead of providing which functions that block until the I/O has complete, - * libusb's asynchronous interface presents non-blocking functions which - * begin a transfer and then return immediately. Your application passes a - * callback function pointer to this non-blocking function, which libusb will - * call with the results of the transaction when it has completed. - * - * Transfers which have been submitted through the non-blocking functions - * can be cancelled with a separate function call. - * - * The non-blocking nature of this interface allows you to be simultaneously - * performing I/O to multiple endpoints on multiple devices, without having - * to use threads. - * - * This added flexibility does come with some complications though: - * - In the interest of being a lightweight library, libusb does not create - * threads and can only operate when your application is calling into it. Your - * application must call into libusb from it's main loop when events are ready - * to be handled, or you must use some other scheme to allow libusb to - * undertake whatever work needs to be done. - * - libusb also needs to be called into at certain fixed points in time in - * order to accurately handle transfer timeouts. - * - Memory handling becomes more complex. You cannot use stack memory unless - * the function with that stack is guaranteed not to return until the transfer - * callback has finished executing. - * - You generally lose some linearity from your code flow because submitting - * the transfer request is done in a separate function from where the transfer - * results are handled. This becomes particularly obvious when you want to - * submit a second transfer based on the results of an earlier transfer. - * - * Internally, libusb's synchronous interface is expressed in terms of function - * calls to the asynchronous interface. - * - * For details on how to use the asynchronous API, see the - * \ref libusb_asyncio "asynchronous I/O API" documentation pages. - */ - - -/** - * \page libusb_packetoverflow Packets and overflows - * - * \section packets Packet abstraction - * - * The USB specifications describe how data is transmitted in packets, with - * constraints on packet size defined by endpoint descriptors. The host must - * not send data payloads larger than the endpoint's maximum packet size. - * - * libusb and the underlying OS abstract out the packet concept, allowing you - * to request transfers of any size. Internally, the request will be divided - * up into correctly-sized packets. You do not have to be concerned with - * packet sizes, but there is one exception when considering overflows. - * - * \section overflow Bulk/interrupt transfer overflows - * - * When requesting data on a bulk endpoint, libusb requires you to supply a - * buffer and the maximum number of bytes of data that libusb can put in that - * buffer. However, the size of the buffer is not communicated to the device - - * the device is just asked to send any amount of data. - * - * There is no problem if the device sends an amount of data that is less than - * or equal to the buffer size. libusb reports this condition to you through - * the \ref libusb_transfer::actual_length "libusb_transfer.actual_length" - * field. - * - * Problems may occur if the device attempts to send more data than can fit in - * the buffer. libusb reports LIBUSB_TRANSFER_OVERFLOW for this condition but - * other behaviour is largely undefined: actual_length may or may not be - * accurate, the chunk of data that can fit in the buffer (before overflow) - * may or may not have been transferred. - * - * Overflows are nasty, but can be avoided. Even though you were told to - * ignore packets above, think about the lower level details: each transfer is - * split into packets (typically small, with a maximum size of 512 bytes). - * Overflows can only happen if the final packet in an incoming data transfer - * is smaller than the actual packet that the device wants to transfer. - * Therefore, you will never see an overflow if your transfer buffer size is a - * multiple of the endpoint's packet size: the final packet will either - * fill up completely or will be only partially filled. - */ - -/** - * @defgroup libusb_asyncio Asynchronous device I/O - * - * This page details libusb's asynchronous (non-blocking) API for USB device - * I/O. This interface is very powerful but is also quite complex - you will - * need to read this page carefully to understand the necessary considerations - * and issues surrounding use of this interface. Simplistic applications - * may wish to consider the \ref libusb_syncio "synchronous I/O API" instead. - * - * The asynchronous interface is built around the idea of separating transfer - * submission and handling of transfer completion (the synchronous model - * combines both of these into one). There may be a long delay between - * submission and completion, however the asynchronous submission function - * is non-blocking so will return control to your application during that - * potentially long delay. - * - * \section asyncabstraction Transfer abstraction - * - * For the asynchronous I/O, libusb implements the concept of a generic - * transfer entity for all types of I/O (control, bulk, interrupt, - * isochronous). The generic transfer object must be treated slightly - * differently depending on which type of I/O you are performing with it. - * - * This is represented by the public libusb_transfer structure type. - * - * \section asynctrf Asynchronous transfers - * - * We can view asynchronous I/O as a 5 step process: - * -# Allocation: allocate a libusb_transfer - * -# Filling: populate the libusb_transfer instance with information - * about the transfer you wish to perform - * -# Submission: ask libusb to submit the transfer - * -# Completion handling: examine transfer results in the - * libusb_transfer structure - * -# Deallocation: clean up resources - * - * - * \subsection asyncalloc Allocation - * - * This step involves allocating memory for a USB transfer. This is the - * generic transfer object mentioned above. At this stage, the transfer - * is "blank" with no details about what type of I/O it will be used for. - * - * Allocation is done with the libusb_alloc_transfer() function. You must use - * this function rather than allocating your own transfers. - * - * \subsection asyncfill Filling - * - * This step is where you take a previously allocated transfer and fill it - * with information to determine the message type and direction, data buffer, - * callback function, etc. - * - * You can either fill the required fields yourself or you can use the - * helper functions: libusb_fill_control_transfer(), libusb_fill_bulk_transfer() - * and libusb_fill_interrupt_transfer(). - * - * \subsection asyncsubmit Submission - * - * When you have allocated a transfer and filled it, you can submit it using - * libusb_submit_transfer(). This function returns immediately but can be - * regarded as firing off the I/O request in the background. - * - * \subsection asynccomplete Completion handling - * - * After a transfer has been submitted, one of four things can happen to it: - * - * - The transfer completes (i.e. some data was transferred) - * - The transfer has a timeout and the timeout expires before all data is - * transferred - * - The transfer fails due to an error - * - The transfer is cancelled - * - * Each of these will cause the user-specified transfer callback function to - * be invoked. It is up to the callback function to determine which of the - * above actually happened and to act accordingly. - * - * The user-specified callback is passed a pointer to the libusb_transfer - * structure which was used to setup and submit the transfer. At completion - * time, libusb has populated this structure with results of the transfer: - * success or failure reason, number of bytes of data transferred, etc. See - * the libusb_transfer structure documentation for more information. - * - * Important Note: The user-specified callback is called from an event - * handling context. It is therefore important that no calls are made into - * libusb that will attempt to perform any event handling. Examples of such - * functions are any listed in the \ref libusb_syncio "synchronous API" and any of - * the blocking functions that retrieve \ref libusb_desc "USB descriptors". - * - * \subsection Deallocation - * - * When a transfer has completed (i.e. the callback function has been invoked), - * you are advised to free the transfer (unless you wish to resubmit it, see - * below). Transfers are deallocated with libusb_free_transfer(). - * - * It is undefined behaviour to free a transfer which has not completed. - * - * \section asyncresubmit Resubmission - * - * You may be wondering why allocation, filling, and submission are all - * separated above where they could reasonably be combined into a single - * operation. - * - * The reason for separation is to allow you to resubmit transfers without - * having to allocate new ones every time. This is especially useful for - * common situations dealing with interrupt endpoints - you allocate one - * transfer, fill and submit it, and when it returns with results you just - * resubmit it for the next interrupt. - * - * \section asynccancel Cancellation - * - * Another advantage of using the asynchronous interface is that you have - * the ability to cancel transfers which have not yet completed. This is - * done by calling the libusb_cancel_transfer() function. - * - * libusb_cancel_transfer() is asynchronous/non-blocking in itself. When the - * cancellation actually completes, the transfer's callback function will - * be invoked, and the callback function should check the transfer status to - * determine that it was cancelled. - * - * Freeing the transfer after it has been cancelled but before cancellation - * has completed will result in undefined behaviour. - * - * When a transfer is cancelled, some of the data may have been transferred. - * libusb will communicate this to you in the transfer callback. Do not assume - * that no data was transferred. - * - * \section bulk_overflows Overflows on device-to-host bulk/interrupt endpoints - * - * If your device does not have predictable transfer sizes (or it misbehaves), - * your application may submit a request for data on an IN endpoint which is - * smaller than the data that the device wishes to send. In some circumstances - * this will cause an overflow, which is a nasty condition to deal with. See - * the \ref libusb_packetoverflow page for discussion. - * - * \section asyncctrl Considerations for control transfers - * - * The libusb_transfer structure is generic and hence does not - * include specific fields for the control-specific setup packet structure. - * - * In order to perform a control transfer, you must place the 8-byte setup - * packet at the start of the data buffer. To simplify this, you could - * cast the buffer pointer to type struct libusb_control_setup, or you can - * use the helper function libusb_fill_control_setup(). - * - * The wLength field placed in the setup packet must be the length you would - * expect to be sent in the setup packet: the length of the payload that - * follows (or the expected maximum number of bytes to receive). However, - * the length field of the libusb_transfer object must be the length of - * the data buffer - i.e. it should be wLength plus the size of - * the setup packet (LIBUSB_CONTROL_SETUP_SIZE). - * - * If you use the helper functions, this is simplified for you: - * -# Allocate a buffer of size LIBUSB_CONTROL_SETUP_SIZE plus the size of the - * data you are sending/requesting. - * -# Call libusb_fill_control_setup() on the data buffer, using the transfer - * request size as the wLength value (i.e. do not include the extra space you - * allocated for the control setup). - * -# If this is a host-to-device transfer, place the data to be transferred - * in the data buffer, starting at offset LIBUSB_CONTROL_SETUP_SIZE. - * -# Call libusb_fill_control_transfer() to associate the data buffer with - * the transfer (and to set the remaining details such as callback and timeout). - * - Note that there is no parameter to set the length field of the transfer. - * The length is automatically inferred from the wLength field of the setup - * packet. - * -# Submit the transfer. - * - * The multi-byte control setup fields (wValue, wIndex and wLength) must - * be given in little-endian byte order (the endianness of the USB bus). - * Endianness conversion is transparently handled by - * libusb_fill_control_setup() which is documented to accept host-endian - * values. - * - * Further considerations are needed when handling transfer completion in - * your callback function: - * - As you might expect, the setup packet will still be sitting at the start - * of the data buffer. - * - If this was a device-to-host transfer, the received data will be sitting - * at offset LIBUSB_CONTROL_SETUP_SIZE into the buffer. - * - The actual_length field of the transfer structure is relative to the - * wLength of the setup packet, rather than the size of the data buffer. So, - * if your wLength was 4, your transfer's length was 12, then you - * should expect an actual_length of 4 to indicate that the data was - * transferred in entirity. - * - * To simplify parsing of setup packets and obtaining the data from the - * correct offset, you may wish to use the libusb_control_transfer_get_data() - * and libusb_control_transfer_get_setup() functions within your transfer - * callback. - * - * Even though control endpoints do not halt, a completed control transfer - * may have a LIBUSB_TRANSFER_STALL status code. This indicates the control - * request was not supported. - * - * \section asyncintr Considerations for interrupt transfers - * - * All interrupt transfers are performed using the polling interval presented - * by the bInterval value of the endpoint descriptor. - * - * \section asynciso Considerations for isochronous transfers - * - * Isochronous transfers are more complicated than transfers to - * non-isochronous endpoints. - * - * To perform I/O to an isochronous endpoint, allocate the transfer by calling - * libusb_alloc_transfer() with an appropriate number of isochronous packets. - * - * During filling, set \ref libusb_transfer::type "type" to - * \ref libusb_transfer_type::LIBUSB_TRANSFER_TYPE_ISOCHRONOUS - * "LIBUSB_TRANSFER_TYPE_ISOCHRONOUS", and set - * \ref libusb_transfer::num_iso_packets "num_iso_packets" to a value less than - * or equal to the number of packets you requested during allocation. - * libusb_alloc_transfer() does not set either of these fields for you, given - * that you might not even use the transfer on an isochronous endpoint. - * - * Next, populate the length field for the first num_iso_packets entries in - * the \ref libusb_transfer::iso_packet_desc "iso_packet_desc" array. Section - * 5.6.3 of the USB2 specifications describe how the maximum isochronous - * packet length is determined by the wMaxPacketSize field in the endpoint - * descriptor. - * Two functions can help you here: - * - * - libusb_get_max_iso_packet_size() is an easy way to determine the max - * packet size for an isochronous endpoint. Note that the maximum packet - * size is actually the maximum number of bytes that can be transmitted in - * a single microframe, therefore this function multiplies the maximum number - * of bytes per transaction by the number of transaction opportunities per - * microframe. - * - libusb_set_iso_packet_lengths() assigns the same length to all packets - * within a transfer, which is usually what you want. - * - * For outgoing transfers, you'll obviously fill the buffer and populate the - * packet descriptors in hope that all the data gets transferred. For incoming - * transfers, you must ensure the buffer has sufficient capacity for - * the situation where all packets transfer the full amount of requested data. - * - * Completion handling requires some extra consideration. The - * \ref libusb_transfer::actual_length "actual_length" field of the transfer - * is meaningless and should not be examined; instead you must refer to the - * \ref libusb_iso_packet_descriptor::actual_length "actual_length" field of - * each individual packet. - * - * The \ref libusb_transfer::status "status" field of the transfer is also a - * little misleading: - * - If the packets were submitted and the isochronous data microframes - * completed normally, status will have value - * \ref libusb_transfer_status::LIBUSB_TRANSFER_COMPLETED - * "LIBUSB_TRANSFER_COMPLETED". Note that bus errors and software-incurred - * delays are not counted as transfer errors; the transfer.status field may - * indicate COMPLETED even if some or all of the packets failed. Refer to - * the \ref libusb_iso_packet_descriptor::status "status" field of each - * individual packet to determine packet failures. - * - The status field will have value - * \ref libusb_transfer_status::LIBUSB_TRANSFER_ERROR - * "LIBUSB_TRANSFER_ERROR" only when serious errors were encountered. - * - Other transfer status codes occur with normal behaviour. - * - * The data for each packet will be found at an offset into the buffer that - * can be calculated as if each prior packet completed in full. The - * libusb_get_iso_packet_buffer() and libusb_get_iso_packet_buffer_simple() - * functions may help you here. - * - * Note: Some operating systems (e.g. Linux) may impose limits on the - * length of individual isochronous packets and/or the total length of the - * isochronous transfer. Such limits can be difficult for libusb to detect, - * so the library will simply try and submit the transfer as set up by you. - * If the transfer fails to submit because it is too large, - * libusb_submit_transfer() will return - * \ref libusb_error::LIBUSB_ERROR_INVALID_PARAM "LIBUSB_ERROR_INVALID_PARAM". - * - * \section asyncmem Memory caveats - * - * In most circumstances, it is not safe to use stack memory for transfer - * buffers. This is because the function that fired off the asynchronous - * transfer may return before libusb has finished using the buffer, and when - * the function returns it's stack gets destroyed. This is true for both - * host-to-device and device-to-host transfers. - * - * The only case in which it is safe to use stack memory is where you can - * guarantee that the function owning the stack space for the buffer does not - * return until after the transfer's callback function has completed. In every - * other case, you need to use heap memory instead. - * - * \section asyncflags Fine control - * - * Through using this asynchronous interface, you may find yourself repeating - * a few simple operations many times. You can apply a bitwise OR of certain - * flags to a transfer to simplify certain things: - * - \ref libusb_transfer_flags::LIBUSB_TRANSFER_SHORT_NOT_OK - * "LIBUSB_TRANSFER_SHORT_NOT_OK" results in transfers which transferred - * less than the requested amount of data being marked with status - * \ref libusb_transfer_status::LIBUSB_TRANSFER_ERROR "LIBUSB_TRANSFER_ERROR" - * (they would normally be regarded as COMPLETED) - * - \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_BUFFER - * "LIBUSB_TRANSFER_FREE_BUFFER" allows you to ask libusb to free the transfer - * buffer when freeing the transfer. - * - \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_TRANSFER - * "LIBUSB_TRANSFER_FREE_TRANSFER" causes libusb to automatically free the - * transfer after the transfer callback returns. - * - * \section asyncevent Event handling - * - * An asynchronous model requires that libusb perform work at various - * points in time - namely processing the results of previously-submitted - * transfers and invoking the user-supplied callback function. - * - * This gives rise to the libusb_handle_events() function which your - * application must call into when libusb has work do to. This gives libusb - * the opportunity to reap pending transfers, invoke callbacks, etc. - * - * There are 2 different approaches to dealing with libusb_handle_events: - * - * -# Repeatedly call libusb_handle_events() in blocking mode from a dedicated - * thread. - * -# Integrate libusb with your application's main event loop. libusb - * exposes a set of file descriptors which allow you to do this. - * - * The first approach has the big advantage that it will also work on Windows - * were libusb' poll API for select / poll integration is not available. So - * if you want to support Windows and use the async API, you must use this - * approach, see the \ref eventthread "Using an event handling thread" section - * below for details. - * - * If you prefer a single threaded approach with a single central event loop, - * see the \ref libusb_poll "polling and timing" section for how to integrate libusb - * into your application's main event loop. - * - * \section eventthread Using an event handling thread - * - * Lets begin with stating the obvious: If you're going to use a separate - * thread for libusb event handling, your callback functions MUST be - * threadsafe. - * - * Other then that doing event handling from a separate thread, is mostly - * simple. You can use an event thread function as follows: -\code -void *event_thread_func(void *ctx) -{ - while (event_thread_run) - libusb_handle_events(ctx); - - return NULL; -} -\endcode - * - * There is one caveat though, stopping this thread requires setting the - * event_thread_run variable to 0, and after that libusb_handle_events() needs - * to return control to event_thread_func. But unless some event happens, - * libusb_handle_events() will not return. - * - * There are 2 different ways of dealing with this, depending on if your - * application uses libusb' \ref libusb_hotplug "hotplug" support or not. - * - * Applications which do not use hotplug support, should not start the event - * thread until after their first call to libusb_open(), and should stop the - * thread when closing the last open device as follows: -\code -void my_close_handle(libusb_device_handle *dev_handle) -{ - if (open_devs == 1) - event_thread_run = 0; - - libusb_close(dev_handle); // This wakes up libusb_handle_events() - - if (open_devs == 1) - pthread_join(event_thread); - - open_devs--; -} -\endcode - * - * Applications using hotplug support should start the thread at program init, - * after having successfully called libusb_hotplug_register_callback(), and - * should stop the thread at program exit as follows: -\code -void my_libusb_exit(void) -{ - event_thread_run = 0; - libusb_hotplug_deregister_callback(ctx, hotplug_cb_handle); // This wakes up libusb_handle_events() - pthread_join(event_thread); - libusb_exit(ctx); -} -\endcode - */ - -/** - * @defgroup libusb_poll Polling and timing - * - * This page documents libusb's functions for polling events and timing. - * These functions are only necessary for users of the - * \ref libusb_asyncio "asynchronous API". If you are only using the simpler - * \ref libusb_syncio "synchronous API" then you do not need to ever call these - * functions. - * - * The justification for the functionality described here has already been - * discussed in the \ref asyncevent "event handling" section of the - * asynchronous API documentation. In summary, libusb does not create internal - * threads for event processing and hence relies on your application calling - * into libusb at certain points in time so that pending events can be handled. - * - * Your main loop is probably already calling poll() or select() or a - * variant on a set of file descriptors for other event sources (e.g. keyboard - * button presses, mouse movements, network sockets, etc). You then add - * libusb's file descriptors to your poll()/select() calls, and when activity - * is detected on such descriptors you know it is time to call - * libusb_handle_events(). - * - * There is one final event handling complication. libusb supports - * asynchronous transfers which time out after a specified time period. - * - * On some platforms a timerfd is used, so the timeout handling is just another - * fd, on other platforms this requires that libusb is called into at or after - * the timeout to handle it. So, in addition to considering libusb's file - * descriptors in your main event loop, you must also consider that libusb - * sometimes needs to be called into at fixed points in time even when there - * is no file descriptor activity, see \ref polltime details. - * - * In order to know precisely when libusb needs to be called into, libusb - * offers you a set of pollable file descriptors and information about when - * the next timeout expires. - * - * If you are using the asynchronous I/O API, you must take one of the two - * following options, otherwise your I/O will not complete. - * - * \section pollsimple The simple option - * - * If your application revolves solely around libusb and does not need to - * handle other event sources, you can have a program structure as follows: -\code -// initialize libusb -// find and open device -// maybe fire off some initial async I/O - -while (user_has_not_requested_exit) - libusb_handle_events(ctx); - -// clean up and exit -\endcode - * - * With such a simple main loop, you do not have to worry about managing - * sets of file descriptors or handling timeouts. libusb_handle_events() will - * handle those details internally. - * - * \section libusb_pollmain The more advanced option - * - * \note This functionality is currently only available on Unix-like platforms. - * On Windows, libusb_get_pollfds() simply returns NULL. Applications which - * want to support Windows are advised to use an \ref eventthread - * "event handling thread" instead. - * - * In more advanced applications, you will already have a main loop which - * is monitoring other event sources: network sockets, X11 events, mouse - * movements, etc. Through exposing a set of file descriptors, libusb is - * designed to cleanly integrate into such main loops. - * - * In addition to polling file descriptors for the other event sources, you - * take a set of file descriptors from libusb and monitor those too. When you - * detect activity on libusb's file descriptors, you call - * libusb_handle_events_timeout() in non-blocking mode. - * - * What's more, libusb may also need to handle events at specific moments in - * time. No file descriptor activity is generated at these times, so your - * own application needs to be continually aware of when the next one of these - * moments occurs (through calling libusb_get_next_timeout()), and then it - * needs to call libusb_handle_events_timeout() in non-blocking mode when - * these moments occur. This means that you need to adjust your - * poll()/select() timeout accordingly. - * - * libusb provides you with a set of file descriptors to poll and expects you - * to poll all of them, treating them as a single entity. The meaning of each - * file descriptor in the set is an internal implementation detail, - * platform-dependent and may vary from release to release. Don't try and - * interpret the meaning of the file descriptors, just do as libusb indicates, - * polling all of them at once. - * - * In pseudo-code, you want something that looks like: -\code -// initialise libusb - -libusb_get_pollfds(ctx) -while (user has not requested application exit) { - libusb_get_next_timeout(ctx); - poll(on libusb file descriptors plus any other event sources of interest, - using a timeout no larger than the value libusb just suggested) - if (poll() indicated activity on libusb file descriptors) - libusb_handle_events_timeout(ctx, &zero_tv); - if (time has elapsed to or beyond the libusb timeout) - libusb_handle_events_timeout(ctx, &zero_tv); - // handle events from other sources here -} - -// clean up and exit -\endcode - * - * \subsection polltime Notes on time-based events - * - * The above complication with having to track time and call into libusb at - * specific moments is a bit of a headache. For maximum compatibility, you do - * need to write your main loop as above, but you may decide that you can - * restrict the supported platforms of your application and get away with - * a more simplistic scheme. - * - * These time-based event complications are \b not required on the following - * platforms: - * - Darwin - * - Linux, provided that the following version requirements are satisfied: - * - Linux v2.6.27 or newer, compiled with timerfd support - * - glibc v2.9 or newer - * - libusb v1.0.5 or newer - * - * Under these configurations, libusb_get_next_timeout() will \em always return - * 0, so your main loop can be simplified to: -\code -// initialise libusb - -libusb_get_pollfds(ctx) -while (user has not requested application exit) { - poll(on libusb file descriptors plus any other event sources of interest, - using any timeout that you like) - if (poll() indicated activity on libusb file descriptors) - libusb_handle_events_timeout(ctx, &zero_tv); - // handle events from other sources here -} - -// clean up and exit -\endcode - * - * Do remember that if you simplify your main loop to the above, you will - * lose compatibility with some platforms (including legacy Linux platforms, - * and any future platforms supported by libusb which may have time-based - * event requirements). The resultant problems will likely appear as - * strange bugs in your application. - * - * You can use the libusb_pollfds_handle_timeouts() function to do a runtime - * check to see if it is safe to ignore the time-based event complications. - * If your application has taken the shortcut of ignoring libusb's next timeout - * in your main loop, then you are advised to check the return value of - * libusb_pollfds_handle_timeouts() during application startup, and to abort - * if the platform does suffer from these timing complications. - * - * \subsection fdsetchange Changes in the file descriptor set - * - * The set of file descriptors that libusb uses as event sources may change - * during the life of your application. Rather than having to repeatedly - * call libusb_get_pollfds(), you can set up notification functions for when - * the file descriptor set changes using libusb_set_pollfd_notifiers(). - * - * \subsection mtissues Multi-threaded considerations - * - * Unfortunately, the situation is complicated further when multiple threads - * come into play. If two threads are monitoring the same file descriptors, - * the fact that only one thread will be woken up when an event occurs causes - * some headaches. - * - * The events lock, event waiters lock, and libusb_handle_events_locked() - * entities are added to solve these problems. You do not need to be concerned - * with these entities otherwise. - * - * See the extra documentation: \ref libusb_mtasync - */ - -/** \page libusb_mtasync Multi-threaded applications and asynchronous I/O - * - * libusb is a thread-safe library, but extra considerations must be applied - * to applications which interact with libusb from multiple threads. - * - * The underlying issue that must be addressed is that all libusb I/O - * revolves around monitoring file descriptors through the poll()/select() - * system calls. This is directly exposed at the - * \ref libusb_asyncio "asynchronous interface" but it is important to note that the - * \ref libusb_syncio "synchronous interface" is implemented on top of the - * asynchonrous interface, therefore the same considerations apply. - * - * The issue is that if two or more threads are concurrently calling poll() - * or select() on libusb's file descriptors then only one of those threads - * will be woken up when an event arrives. The others will be completely - * oblivious that anything has happened. - * - * Consider the following pseudo-code, which submits an asynchronous transfer - * then waits for its completion. This style is one way you could implement a - * synchronous interface on top of the asynchronous interface (and libusb - * does something similar, albeit more advanced due to the complications - * explained on this page). - * -\code -void cb(struct libusb_transfer *transfer) -{ - int *completed = transfer->user_data; - *completed = 1; -} - -void myfunc() { - struct libusb_transfer *transfer; - unsigned char buffer[LIBUSB_CONTROL_SETUP_SIZE] __attribute__ ((aligned (2))); - int completed = 0; - - transfer = libusb_alloc_transfer(0); - libusb_fill_control_setup(buffer, - LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT, 0x04, 0x01, 0, 0); - libusb_fill_control_transfer(transfer, dev, buffer, cb, &completed, 1000); - libusb_submit_transfer(transfer); - - while (!completed) { - poll(libusb file descriptors, 120*1000); - if (poll indicates activity) - libusb_handle_events_timeout(ctx, &zero_tv); - } - printf("completed!"); - // other code here -} -\endcode - * - * Here we are serializing completion of an asynchronous event - * against a condition - the condition being completion of a specific transfer. - * The poll() loop has a long timeout to minimize CPU usage during situations - * when nothing is happening (it could reasonably be unlimited). - * - * If this is the only thread that is polling libusb's file descriptors, there - * is no problem: there is no danger that another thread will swallow up the - * event that we are interested in. On the other hand, if there is another - * thread polling the same descriptors, there is a chance that it will receive - * the event that we were interested in. In this situation, myfunc() - * will only realise that the transfer has completed on the next iteration of - * the loop, up to 120 seconds later. Clearly a two-minute delay is - * undesirable, and don't even think about using short timeouts to circumvent - * this issue! - * - * The solution here is to ensure that no two threads are ever polling the - * file descriptors at the same time. A naive implementation of this would - * impact the capabilities of the library, so libusb offers the scheme - * documented below to ensure no loss of functionality. - * - * Before we go any further, it is worth mentioning that all libusb-wrapped - * event handling procedures fully adhere to the scheme documented below. - * This includes libusb_handle_events() and its variants, and all the - * synchronous I/O functions - libusb hides this headache from you. - * - * \section Using libusb_handle_events() from multiple threads - * - * Even when only using libusb_handle_events() and synchronous I/O functions, - * you can still have a race condition. You might be tempted to solve the - * above with libusb_handle_events() like so: - * -\code - libusb_submit_transfer(transfer); - - while (!completed) { - libusb_handle_events(ctx); - } - printf("completed!"); -\endcode - * - * This however has a race between the checking of completed and - * libusb_handle_events() acquiring the events lock, so another thread - * could have completed the transfer, resulting in this thread hanging - * until either a timeout or another event occurs. See also commit - * 6696512aade99bb15d6792af90ae329af270eba6 which fixes this in the - * synchronous API implementation of libusb. - * - * Fixing this race requires checking the variable completed only after - * taking the event lock, which defeats the concept of just calling - * libusb_handle_events() without worrying about locking. This is why - * libusb-1.0.9 introduces the new libusb_handle_events_timeout_completed() - * and libusb_handle_events_completed() functions, which handles doing the - * completion check for you after they have acquired the lock: - * -\code - libusb_submit_transfer(transfer); - - while (!completed) { - libusb_handle_events_completed(ctx, &completed); - } - printf("completed!"); -\endcode - * - * This nicely fixes the race in our example. Note that if all you want to - * do is submit a single transfer and wait for its completion, then using - * one of the synchronous I/O functions is much easier. - * - * \section eventlock The events lock - * - * The problem is when we consider the fact that libusb exposes file - * descriptors to allow for you to integrate asynchronous USB I/O into - * existing main loops, effectively allowing you to do some work behind - * libusb's back. If you do take libusb's file descriptors and pass them to - * poll()/select() yourself, you need to be aware of the associated issues. - * - * The first concept to be introduced is the events lock. The events lock - * is used to serialize threads that want to handle events, such that only - * one thread is handling events at any one time. - * - * You must take the events lock before polling libusb file descriptors, - * using libusb_lock_events(). You must release the lock as soon as you have - * aborted your poll()/select() loop, using libusb_unlock_events(). - * - * \section threadwait Letting other threads do the work for you - * - * Although the events lock is a critical part of the solution, it is not - * enough on it's own. You might wonder if the following is sufficient... -\code - libusb_lock_events(ctx); - while (!completed) { - poll(libusb file descriptors, 120*1000); - if (poll indicates activity) - libusb_handle_events_timeout(ctx, &zero_tv); - } - libusb_unlock_events(ctx); -\endcode - * ...and the answer is that it is not. This is because the transfer in the - * code shown above may take a long time (say 30 seconds) to complete, and - * the lock is not released until the transfer is completed. - * - * Another thread with similar code that wants to do event handling may be - * working with a transfer that completes after a few milliseconds. Despite - * having such a quick completion time, the other thread cannot check that - * status of its transfer until the code above has finished (30 seconds later) - * due to contention on the lock. - * - * To solve this, libusb offers you a mechanism to determine when another - * thread is handling events. It also offers a mechanism to block your thread - * until the event handling thread has completed an event (and this mechanism - * does not involve polling of file descriptors). - * - * After determining that another thread is currently handling events, you - * obtain the event waiters lock using libusb_lock_event_waiters(). - * You then re-check that some other thread is still handling events, and if - * so, you call libusb_wait_for_event(). - * - * libusb_wait_for_event() puts your application to sleep until an event - * occurs, or until a thread releases the events lock. When either of these - * things happen, your thread is woken up, and should re-check the condition - * it was waiting on. It should also re-check that another thread is handling - * events, and if not, it should start handling events itself. - * - * This looks like the following, as pseudo-code: -\code -retry: -if (libusb_try_lock_events(ctx) == 0) { - // we obtained the event lock: do our own event handling - while (!completed) { - if (!libusb_event_handling_ok(ctx)) { - libusb_unlock_events(ctx); - goto retry; - } - poll(libusb file descriptors, 120*1000); - if (poll indicates activity) - libusb_handle_events_locked(ctx, 0); - } - libusb_unlock_events(ctx); -} else { - // another thread is doing event handling. wait for it to signal us that - // an event has completed - libusb_lock_event_waiters(ctx); - - while (!completed) { - // now that we have the event waiters lock, double check that another - // thread is still handling events for us. (it may have ceased handling - // events in the time it took us to reach this point) - if (!libusb_event_handler_active(ctx)) { - // whoever was handling events is no longer doing so, try again - libusb_unlock_event_waiters(ctx); - goto retry; - } - - libusb_wait_for_event(ctx, NULL); - } - libusb_unlock_event_waiters(ctx); -} -printf("completed!\n"); -\endcode - * - * A naive look at the above code may suggest that this can only support - * one event waiter (hence a total of 2 competing threads, the other doing - * event handling), because the event waiter seems to have taken the event - * waiters lock while waiting for an event. However, the system does support - * multiple event waiters, because libusb_wait_for_event() actually drops - * the lock while waiting, and reaquires it before continuing. - * - * We have now implemented code which can dynamically handle situations where - * nobody is handling events (so we should do it ourselves), and it can also - * handle situations where another thread is doing event handling (so we can - * piggyback onto them). It is also equipped to handle a combination of - * the two, for example, another thread is doing event handling, but for - * whatever reason it stops doing so before our condition is met, so we take - * over the event handling. - * - * Four functions were introduced in the above pseudo-code. Their importance - * should be apparent from the code shown above. - * -# libusb_try_lock_events() is a non-blocking function which attempts - * to acquire the events lock but returns a failure code if it is contended. - * -# libusb_event_handling_ok() checks that libusb is still happy for your - * thread to be performing event handling. Sometimes, libusb needs to - * interrupt the event handler, and this is how you can check if you have - * been interrupted. If this function returns 0, the correct behaviour is - * for you to give up the event handling lock, and then to repeat the cycle. - * The following libusb_try_lock_events() will fail, so you will become an - * events waiter. For more information on this, read \ref fullstory below. - * -# libusb_handle_events_locked() is a variant of - * libusb_handle_events_timeout() that you can call while holding the - * events lock. libusb_handle_events_timeout() itself implements similar - * logic to the above, so be sure not to call it when you are - * "working behind libusb's back", as is the case here. - * -# libusb_event_handler_active() determines if someone is currently - * holding the events lock - * - * You might be wondering why there is no function to wake up all threads - * blocked on libusb_wait_for_event(). This is because libusb can do this - * internally: it will wake up all such threads when someone calls - * libusb_unlock_events() or when a transfer completes (at the point after its - * callback has returned). - * - * \subsection fullstory The full story - * - * The above explanation should be enough to get you going, but if you're - * really thinking through the issues then you may be left with some more - * questions regarding libusb's internals. If you're curious, read on, and if - * not, skip to the next section to avoid confusing yourself! - * - * The immediate question that may spring to mind is: what if one thread - * modifies the set of file descriptors that need to be polled while another - * thread is doing event handling? - * - * There are 2 situations in which this may happen. - * -# libusb_open() will add another file descriptor to the poll set, - * therefore it is desirable to interrupt the event handler so that it - * restarts, picking up the new descriptor. - * -# libusb_close() will remove a file descriptor from the poll set. There - * are all kinds of race conditions that could arise here, so it is - * important that nobody is doing event handling at this time. - * - * libusb handles these issues internally, so application developers do not - * have to stop their event handlers while opening/closing devices. Here's how - * it works, focusing on the libusb_close() situation first: - * - * -# During initialization, libusb opens an internal pipe, and it adds the read - * end of this pipe to the set of file descriptors to be polled. - * -# During libusb_close(), libusb writes some dummy data on this event pipe. - * This immediately interrupts the event handler. libusb also records - * internally that it is trying to interrupt event handlers for this - * high-priority event. - * -# At this point, some of the functions described above start behaving - * differently: - * - libusb_event_handling_ok() starts returning 1, indicating that it is NOT - * OK for event handling to continue. - * - libusb_try_lock_events() starts returning 1, indicating that another - * thread holds the event handling lock, even if the lock is uncontended. - * - libusb_event_handler_active() starts returning 1, indicating that - * another thread is doing event handling, even if that is not true. - * -# The above changes in behaviour result in the event handler stopping and - * giving up the events lock very quickly, giving the high-priority - * libusb_close() operation a "free ride" to acquire the events lock. All - * threads that are competing to do event handling become event waiters. - * -# With the events lock held inside libusb_close(), libusb can safely remove - * a file descriptor from the poll set, in the safety of knowledge that - * nobody is polling those descriptors or trying to access the poll set. - * -# After obtaining the events lock, the close operation completes very - * quickly (usually a matter of milliseconds) and then immediately releases - * the events lock. - * -# At the same time, the behaviour of libusb_event_handling_ok() and friends - * reverts to the original, documented behaviour. - * -# The release of the events lock causes the threads that are waiting for - * events to be woken up and to start competing to become event handlers - * again. One of them will succeed; it will then re-obtain the list of poll - * descriptors, and USB I/O will then continue as normal. - * - * libusb_open() is similar, and is actually a more simplistic case. Upon a - * call to libusb_open(): - * - * -# The device is opened and a file descriptor is added to the poll set. - * -# libusb sends some dummy data on the event pipe, and records that it - * is trying to modify the poll descriptor set. - * -# The event handler is interrupted, and the same behaviour change as for - * libusb_close() takes effect, causing all event handling threads to become - * event waiters. - * -# The libusb_open() implementation takes its free ride to the events lock. - * -# Happy that it has successfully paused the events handler, libusb_open() - * releases the events lock. - * -# The event waiter threads are all woken up and compete to become event - * handlers again. The one that succeeds will obtain the list of poll - * descriptors again, which will include the addition of the new device. - * - * \subsection concl Closing remarks - * - * The above may seem a little complicated, but hopefully I have made it clear - * why such complications are necessary. Also, do not forget that this only - * applies to applications that take libusb's file descriptors and integrate - * them into their own polling loops. - * - * You may decide that it is OK for your multi-threaded application to ignore - * some of the rules and locks detailed above, because you don't think that - * two threads can ever be polling the descriptors at the same time. If that - * is the case, then that's good news for you because you don't have to worry. - * But be careful here; remember that the synchronous I/O functions do event - * handling internally. If you have one thread doing event handling in a loop - * (without implementing the rules and locking semantics documented above) - * and another trying to send a synchronous USB transfer, you will end up with - * two threads monitoring the same descriptors, and the above-described - * undesirable behaviour occurring. The solution is for your polling thread to - * play by the rules; the synchronous I/O functions do so, and this will result - * in them getting along in perfect harmony. - * - * If you do have a dedicated thread doing event handling, it is perfectly - * legal for it to take the event handling lock for long periods of time. Any - * synchronous I/O functions you call from other threads will transparently - * fall back to the "event waiters" mechanism detailed above. The only - * consideration that your event handling thread must apply is the one related - * to libusb_event_handling_ok(): you must call this before every poll(), and - * give up the events lock if instructed. - */ - -int usbi_io_init(struct libusb_context *ctx) -{ - int r; - - usbi_mutex_init(&ctx->flying_transfers_lock); - usbi_mutex_init(&ctx->events_lock); - usbi_mutex_init(&ctx->event_waiters_lock); - usbi_cond_init(&ctx->event_waiters_cond); - usbi_mutex_init(&ctx->event_data_lock); - usbi_tls_key_create(&ctx->event_handling_key); - list_init(&ctx->flying_transfers); - list_init(&ctx->ipollfds); - list_init(&ctx->hotplug_msgs); - list_init(&ctx->completed_transfers); - - /* FIXME should use an eventfd on kernels that support it */ - r = usbi_pipe(ctx->event_pipe); - if (r < 0) { - r = LIBUSB_ERROR_OTHER; - goto err; - } - - r = usbi_add_pollfd(ctx, ctx->event_pipe[0], POLLIN); - if (r < 0) - goto err_close_pipe; - -#ifdef USBI_TIMERFD_AVAILABLE - ctx->timerfd = timerfd_create(usbi_backend->get_timerfd_clockid(), - TFD_NONBLOCK); - if (ctx->timerfd >= 0) { - usbi_dbg("using timerfd for timeouts"); - r = usbi_add_pollfd(ctx, ctx->timerfd, POLLIN); - if (r < 0) - goto err_close_timerfd; - } else { - usbi_dbg("timerfd not available (code %d error %d)", ctx->timerfd, errno); - ctx->timerfd = -1; - } -#endif - - return 0; - -#ifdef USBI_TIMERFD_AVAILABLE -err_close_timerfd: - close(ctx->timerfd); - usbi_remove_pollfd(ctx, ctx->event_pipe[0]); -#endif -err_close_pipe: - usbi_close(ctx->event_pipe[0]); - usbi_close(ctx->event_pipe[1]); -err: - usbi_mutex_destroy(&ctx->flying_transfers_lock); - usbi_mutex_destroy(&ctx->events_lock); - usbi_mutex_destroy(&ctx->event_waiters_lock); - usbi_cond_destroy(&ctx->event_waiters_cond); - usbi_mutex_destroy(&ctx->event_data_lock); - usbi_tls_key_delete(ctx->event_handling_key); - return r; -} - -void usbi_io_exit(struct libusb_context *ctx) -{ - usbi_remove_pollfd(ctx, ctx->event_pipe[0]); - usbi_close(ctx->event_pipe[0]); - usbi_close(ctx->event_pipe[1]); -#ifdef USBI_TIMERFD_AVAILABLE - if (usbi_using_timerfd(ctx)) { - usbi_remove_pollfd(ctx, ctx->timerfd); - close(ctx->timerfd); - } -#endif - usbi_mutex_destroy(&ctx->flying_transfers_lock); - usbi_mutex_destroy(&ctx->events_lock); - usbi_mutex_destroy(&ctx->event_waiters_lock); - usbi_cond_destroy(&ctx->event_waiters_cond); - usbi_mutex_destroy(&ctx->event_data_lock); - usbi_tls_key_delete(ctx->event_handling_key); - if (ctx->pollfds) - free(ctx->pollfds); -} - -static int calculate_timeout(struct usbi_transfer *transfer) -{ - int r; - struct timespec current_time; - unsigned int timeout = - USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout; - - if (!timeout) - return 0; - - r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, ¤t_time); - if (r < 0) { - usbi_err(ITRANSFER_CTX(transfer), - "failed to read monotonic clock, errno=%d", errno); - return r; - } - - current_time.tv_sec += timeout / 1000; - current_time.tv_nsec += (timeout % 1000) * 1000000; - - while (current_time.tv_nsec >= 1000000000) { - current_time.tv_nsec -= 1000000000; - current_time.tv_sec++; - } - - TIMESPEC_TO_TIMEVAL(&transfer->timeout, ¤t_time); - return 0; -} - -/** \ingroup libusb_asyncio - * Allocate a libusb transfer with a specified number of isochronous packet - * descriptors. The returned transfer is pre-initialized for you. When the new - * transfer is no longer needed, it should be freed with - * libusb_free_transfer(). - * - * Transfers intended for non-isochronous endpoints (e.g. control, bulk, - * interrupt) should specify an iso_packets count of zero. - * - * For transfers intended for isochronous endpoints, specify an appropriate - * number of packet descriptors to be allocated as part of the transfer. - * The returned transfer is not specially initialized for isochronous I/O; - * you are still required to set the - * \ref libusb_transfer::num_iso_packets "num_iso_packets" and - * \ref libusb_transfer::type "type" fields accordingly. - * - * It is safe to allocate a transfer with some isochronous packets and then - * use it on a non-isochronous endpoint. If you do this, ensure that at time - * of submission, num_iso_packets is 0 and that type is set appropriately. - * - * \param iso_packets number of isochronous packet descriptors to allocate - * \returns a newly allocated transfer, or NULL on error - */ -DEFAULT_VISIBILITY -struct libusb_transfer * LIBUSB_CALL libusb_alloc_transfer( - int iso_packets) -{ - struct libusb_transfer *transfer; - size_t os_alloc_size = usbi_backend->transfer_priv_size; - size_t alloc_size = sizeof(struct usbi_transfer) - + sizeof(struct libusb_transfer) - + (sizeof(struct libusb_iso_packet_descriptor) * iso_packets) - + os_alloc_size; - struct usbi_transfer *itransfer = calloc(1, alloc_size); - if (!itransfer) - return NULL; - - itransfer->num_iso_packets = iso_packets; - usbi_mutex_init(&itransfer->lock); - transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - usbi_dbg("transfer %p", transfer); - return transfer; -} - -/** \ingroup libusb_asyncio - * Free a transfer structure. This should be called for all transfers - * allocated with libusb_alloc_transfer(). - * - * If the \ref libusb_transfer_flags::LIBUSB_TRANSFER_FREE_BUFFER - * "LIBUSB_TRANSFER_FREE_BUFFER" flag is set and the transfer buffer is - * non-NULL, this function will also free the transfer buffer using the - * standard system memory allocator (e.g. free()). - * - * It is legal to call this function with a NULL transfer. In this case, - * the function will simply return safely. - * - * It is not legal to free an active transfer (one which has been submitted - * and has not yet completed). - * - * \param transfer the transfer to free - */ -void API_EXPORTED libusb_free_transfer(struct libusb_transfer *transfer) -{ - struct usbi_transfer *itransfer; - if (!transfer) - return; - - usbi_dbg("transfer %p", transfer); - if (transfer->flags & LIBUSB_TRANSFER_FREE_BUFFER && transfer->buffer) - free(transfer->buffer); - - itransfer = LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); - usbi_mutex_destroy(&itransfer->lock); - free(itransfer); -} - -#ifdef USBI_TIMERFD_AVAILABLE -static int disarm_timerfd(struct libusb_context *ctx) -{ - const struct itimerspec disarm_timer = { { 0, 0 }, { 0, 0 } }; - int r; - - usbi_dbg(""); - r = timerfd_settime(ctx->timerfd, 0, &disarm_timer, NULL); - if (r < 0) - return LIBUSB_ERROR_OTHER; - else - return 0; -} - -/* iterates through the flying transfers, and rearms the timerfd based on the - * next upcoming timeout. - * must be called with flying_list locked. - * returns 0 on success or a LIBUSB_ERROR code on failure. - */ -static int arm_timerfd_for_next_timeout(struct libusb_context *ctx) -{ - struct usbi_transfer *transfer; - - list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { - struct timeval *cur_tv = &transfer->timeout; - - /* if we've reached transfers of infinite timeout, then we have no - * arming to do */ - if (!timerisset(cur_tv)) - goto disarm; - - /* act on first transfer that has not already been handled */ - if (!(transfer->timeout_flags & (USBI_TRANSFER_TIMEOUT_HANDLED | USBI_TRANSFER_OS_HANDLES_TIMEOUT))) { - int r; - const struct itimerspec it = { {0, 0}, - { cur_tv->tv_sec, cur_tv->tv_usec * 1000 } }; - usbi_dbg("next timeout originally %dms", USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout); - r = timerfd_settime(ctx->timerfd, TFD_TIMER_ABSTIME, &it, NULL); - if (r < 0) - return LIBUSB_ERROR_OTHER; - return 0; - } - } - -disarm: - return disarm_timerfd(ctx); -} -#else -static int arm_timerfd_for_next_timeout(struct libusb_context *ctx) -{ - UNUSED(ctx); - return 0; -} -#endif - -/* add a transfer to the (timeout-sorted) active transfers list. - * This function will return non 0 if fails to update the timer, - * in which case the transfer is *not* on the flying_transfers list. */ -static int add_to_flying_list(struct usbi_transfer *transfer) -{ - struct usbi_transfer *cur; - struct timeval *timeout = &transfer->timeout; - struct libusb_context *ctx = ITRANSFER_CTX(transfer); - int r; - int first = 1; - - r = calculate_timeout(transfer); - if (r) - return r; - - /* if we have no other flying transfers, start the list with this one */ - if (list_empty(&ctx->flying_transfers)) { - list_add(&transfer->list, &ctx->flying_transfers); - goto out; - } - - /* if we have infinite timeout, append to end of list */ - if (!timerisset(timeout)) { - list_add_tail(&transfer->list, &ctx->flying_transfers); - /* first is irrelevant in this case */ - goto out; - } - - /* otherwise, find appropriate place in list */ - list_for_each_entry(cur, &ctx->flying_transfers, list, struct usbi_transfer) { - /* find first timeout that occurs after the transfer in question */ - struct timeval *cur_tv = &cur->timeout; - - if (!timerisset(cur_tv) || (cur_tv->tv_sec > timeout->tv_sec) || - (cur_tv->tv_sec == timeout->tv_sec && - cur_tv->tv_usec > timeout->tv_usec)) { - list_add_tail(&transfer->list, &cur->list); - goto out; - } - first = 0; - } - /* first is 0 at this stage (list not empty) */ - - /* otherwise we need to be inserted at the end */ - list_add_tail(&transfer->list, &ctx->flying_transfers); -out: -#ifdef USBI_TIMERFD_AVAILABLE - if (first && usbi_using_timerfd(ctx) && timerisset(timeout)) { - /* if this transfer has the lowest timeout of all active transfers, - * rearm the timerfd with this transfer's timeout */ - const struct itimerspec it = { {0, 0}, - { timeout->tv_sec, timeout->tv_usec * 1000 } }; - usbi_dbg("arm timerfd for timeout in %dms (first in line)", - USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer)->timeout); - r = timerfd_settime(ctx->timerfd, TFD_TIMER_ABSTIME, &it, NULL); - if (r < 0) { - usbi_warn(ctx, "failed to arm first timerfd (errno %d)", errno); - r = LIBUSB_ERROR_OTHER; - } - } -#else - UNUSED(first); -#endif - - if (r) - list_del(&transfer->list); - - return r; -} - -/* remove a transfer from the active transfers list. - * This function will *always* remove the transfer from the - * flying_transfers list. It will return a LIBUSB_ERROR code - * if it fails to update the timer for the next timeout. */ -static int remove_from_flying_list(struct usbi_transfer *transfer) -{ - struct libusb_context *ctx = ITRANSFER_CTX(transfer); - int rearm_timerfd; - int r = 0; - - usbi_mutex_lock(&ctx->flying_transfers_lock); - rearm_timerfd = (timerisset(&transfer->timeout) && - list_first_entry(&ctx->flying_transfers, struct usbi_transfer, list) == transfer); - list_del(&transfer->list); - if (usbi_using_timerfd(ctx) && rearm_timerfd) - r = arm_timerfd_for_next_timeout(ctx); - usbi_mutex_unlock(&ctx->flying_transfers_lock); - - return r; -} - -/** \ingroup libusb_asyncio - * Submit a transfer. This function will fire off the USB transfer and then - * return immediately. - * - * \param transfer the transfer to submit - * \returns 0 on success - * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected - * \returns LIBUSB_ERROR_BUSY if the transfer has already been submitted. - * \returns LIBUSB_ERROR_NOT_SUPPORTED if the transfer flags are not supported - * by the operating system. - * \returns LIBUSB_ERROR_INVALID_PARAM if the transfer size is larger than - * the operating system and/or hardware can support - * \returns another LIBUSB_ERROR code on other failure - */ -int API_EXPORTED libusb_submit_transfer(struct libusb_transfer *transfer) -{ - struct usbi_transfer *itransfer = - LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); - struct libusb_context *ctx = TRANSFER_CTX(transfer); - int r; - - usbi_dbg("transfer %p", transfer); - - /* - * Important note on locking, this function takes / releases locks - * in the following order: - * take flying_transfers_lock - * take itransfer->lock - * clear transfer - * add to flying_transfers list - * release flying_transfers_lock - * submit transfer - * release itransfer->lock - * if submit failed: - * take flying_transfers_lock - * remove from flying_transfers list - * release flying_transfers_lock - * - * Note that it takes locks in the order a-b and then releases them - * in the same order a-b. This is somewhat unusual but not wrong, - * release order is not important as long as *all* locks are released - * before re-acquiring any locks. - * - * This means that the ordering of first releasing itransfer->lock - * and then re-acquiring the flying_transfers_list on error is - * important and must not be changed! - * - * This is done this way because when we take both locks we must always - * take flying_transfers_lock first to avoid ab-ba style deadlocks with - * the timeout handling and usbi_handle_disconnect paths. - * - * And we cannot release itransfer->lock before the submission is - * complete otherwise timeout handling for transfers with short - * timeouts may run before submission. - */ - usbi_mutex_lock(&ctx->flying_transfers_lock); - usbi_mutex_lock(&itransfer->lock); - if (itransfer->state_flags & USBI_TRANSFER_IN_FLIGHT) { - usbi_mutex_unlock(&ctx->flying_transfers_lock); - usbi_mutex_unlock(&itransfer->lock); - return LIBUSB_ERROR_BUSY; - } - itransfer->transferred = 0; - itransfer->state_flags = 0; - itransfer->timeout_flags = 0; - r = add_to_flying_list(itransfer); - if (r) { - usbi_mutex_unlock(&ctx->flying_transfers_lock); - usbi_mutex_unlock(&itransfer->lock); - return r; - } - /* - * We must release the flying transfers lock here, because with - * some backends the submit_transfer method is synchroneous. - */ - usbi_mutex_unlock(&ctx->flying_transfers_lock); - - r = usbi_backend->submit_transfer(itransfer); - if (r == LIBUSB_SUCCESS) { - itransfer->state_flags |= USBI_TRANSFER_IN_FLIGHT; - /* keep a reference to this device */ - libusb_ref_device(transfer->dev_handle->dev); - } - usbi_mutex_unlock(&itransfer->lock); - - if (r != LIBUSB_SUCCESS) - remove_from_flying_list(itransfer); - - return r; -} - -/** \ingroup libusb_asyncio - * Asynchronously cancel a previously submitted transfer. - * This function returns immediately, but this does not indicate cancellation - * is complete. Your callback function will be invoked at some later time - * with a transfer status of - * \ref libusb_transfer_status::LIBUSB_TRANSFER_CANCELLED - * "LIBUSB_TRANSFER_CANCELLED." - * - * \param transfer the transfer to cancel - * \returns 0 on success - * \returns LIBUSB_ERROR_NOT_FOUND if the transfer is not in progress, - * already complete, or already cancelled. - * \returns a LIBUSB_ERROR code on failure - */ -int API_EXPORTED libusb_cancel_transfer(struct libusb_transfer *transfer) -{ - struct usbi_transfer *itransfer = - LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); - int r; - - usbi_dbg("transfer %p", transfer ); - usbi_mutex_lock(&itransfer->lock); - if (!(itransfer->state_flags & USBI_TRANSFER_IN_FLIGHT) - || (itransfer->state_flags & USBI_TRANSFER_CANCELLING)) { - r = LIBUSB_ERROR_NOT_FOUND; - goto out; - } - r = usbi_backend->cancel_transfer(itransfer); - if (r < 0) { - if (r != LIBUSB_ERROR_NOT_FOUND && - r != LIBUSB_ERROR_NO_DEVICE) - usbi_err(TRANSFER_CTX(transfer), - "cancel transfer failed error %d", r); - else - usbi_dbg("cancel transfer failed error %d", r); - - if (r == LIBUSB_ERROR_NO_DEVICE) - itransfer->state_flags |= USBI_TRANSFER_DEVICE_DISAPPEARED; - } - - itransfer->state_flags |= USBI_TRANSFER_CANCELLING; - -out: - usbi_mutex_unlock(&itransfer->lock); - return r; -} - -/** \ingroup libusb_asyncio - * Set a transfers bulk stream id. Note users are advised to use - * libusb_fill_bulk_stream_transfer() instead of calling this function - * directly. - * - * Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103 - * - * \param transfer the transfer to set the stream id for - * \param stream_id the stream id to set - * \see libusb_alloc_streams() - */ -void API_EXPORTED libusb_transfer_set_stream_id( - struct libusb_transfer *transfer, uint32_t stream_id) -{ - struct usbi_transfer *itransfer = - LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); - - itransfer->stream_id = stream_id; -} - -/** \ingroup libusb_asyncio - * Get a transfers bulk stream id. - * - * Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103 - * - * \param transfer the transfer to get the stream id for - * \returns the stream id for the transfer - */ -uint32_t API_EXPORTED libusb_transfer_get_stream_id( - struct libusb_transfer *transfer) -{ - struct usbi_transfer *itransfer = - LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer); - - return itransfer->stream_id; -} - -/* Handle completion of a transfer (completion might be an error condition). - * This will invoke the user-supplied callback function, which may end up - * freeing the transfer. Therefore you cannot use the transfer structure - * after calling this function, and you should free all backend-specific - * data before calling it. - * Do not call this function with the usbi_transfer lock held. User-specified - * callback functions may attempt to directly resubmit the transfer, which - * will attempt to take the lock. */ -int usbi_handle_transfer_completion(struct usbi_transfer *itransfer, - enum libusb_transfer_status status) -{ - struct libusb_transfer *transfer = - USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_device_handle *dev_handle = transfer->dev_handle; - uint8_t flags; - int r; - - r = remove_from_flying_list(itransfer); - if (r < 0) - usbi_err(ITRANSFER_CTX(itransfer), "failed to set timer for next timeout, errno=%d", errno); - - usbi_mutex_lock(&itransfer->lock); - itransfer->state_flags &= ~USBI_TRANSFER_IN_FLIGHT; - usbi_mutex_unlock(&itransfer->lock); - - if (status == LIBUSB_TRANSFER_COMPLETED - && transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) { - int rqlen = transfer->length; - if (transfer->type == LIBUSB_TRANSFER_TYPE_CONTROL) - rqlen -= LIBUSB_CONTROL_SETUP_SIZE; - if (rqlen != itransfer->transferred) { - usbi_dbg("interpreting short transfer as error"); - status = LIBUSB_TRANSFER_ERROR; - } - } - - flags = transfer->flags; - transfer->status = status; - transfer->actual_length = itransfer->transferred; - usbi_dbg("transfer %p has callback %p", transfer, transfer->callback); - if (transfer->callback) - transfer->callback(transfer); - /* transfer might have been freed by the above call, do not use from - * this point. */ - if (flags & LIBUSB_TRANSFER_FREE_TRANSFER) - libusb_free_transfer(transfer); - libusb_unref_device(dev_handle->dev); - return r; -} - -/* Similar to usbi_handle_transfer_completion() but exclusively for transfers - * that were asynchronously cancelled. The same concerns w.r.t. freeing of - * transfers exist here. - * Do not call this function with the usbi_transfer lock held. User-specified - * callback functions may attempt to directly resubmit the transfer, which - * will attempt to take the lock. */ -int usbi_handle_transfer_cancellation(struct usbi_transfer *transfer) -{ - struct libusb_context *ctx = ITRANSFER_CTX(transfer); - uint8_t timed_out; - - usbi_mutex_lock(&ctx->flying_transfers_lock); - timed_out = transfer->timeout_flags & USBI_TRANSFER_TIMED_OUT; - usbi_mutex_unlock(&ctx->flying_transfers_lock); - - /* if the URB was cancelled due to timeout, report timeout to the user */ - if (timed_out) { - usbi_dbg("detected timeout cancellation"); - return usbi_handle_transfer_completion(transfer, LIBUSB_TRANSFER_TIMED_OUT); - } - - /* otherwise its a normal async cancel */ - return usbi_handle_transfer_completion(transfer, LIBUSB_TRANSFER_CANCELLED); -} - -/* Add a completed transfer to the completed_transfers list of the - * context and signal the event. The backend's handle_transfer_completion() - * function will be called the next time an event handler runs. */ -void usbi_signal_transfer_completion(struct usbi_transfer *transfer) -{ - struct libusb_context *ctx = ITRANSFER_CTX(transfer); - int pending_events; - - usbi_mutex_lock(&ctx->event_data_lock); - pending_events = usbi_pending_events(ctx); - list_add_tail(&transfer->completed_list, &ctx->completed_transfers); - if (!pending_events) - usbi_signal_event(ctx); - usbi_mutex_unlock(&ctx->event_data_lock); -} - -/** \ingroup libusb_poll - * Attempt to acquire the event handling lock. This lock is used to ensure that - * only one thread is monitoring libusb event sources at any one time. - * - * You only need to use this lock if you are developing an application - * which calls poll() or select() on libusb's file descriptors directly. - * If you stick to libusb's event handling loop functions (e.g. - * libusb_handle_events()) then you do not need to be concerned with this - * locking. - * - * While holding this lock, you are trusted to actually be handling events. - * If you are no longer handling events, you must call libusb_unlock_events() - * as soon as possible. - * - * \param ctx the context to operate on, or NULL for the default context - * \returns 0 if the lock was obtained successfully - * \returns 1 if the lock was not obtained (i.e. another thread holds the lock) - * \ref libusb_mtasync - */ -int API_EXPORTED libusb_try_lock_events(libusb_context *ctx) -{ - int r; - unsigned int ru; - USBI_GET_CONTEXT(ctx); - - /* is someone else waiting to close a device? if so, don't let this thread - * start event handling */ - usbi_mutex_lock(&ctx->event_data_lock); - ru = ctx->device_close; - usbi_mutex_unlock(&ctx->event_data_lock); - if (ru) { - usbi_dbg("someone else is closing a device"); - return 1; - } - - r = usbi_mutex_trylock(&ctx->events_lock); - if (r) - return 1; - - ctx->event_handler_active = 1; - return 0; -} - -/** \ingroup libusb_poll - * Acquire the event handling lock, blocking until successful acquisition if - * it is contended. This lock is used to ensure that only one thread is - * monitoring libusb event sources at any one time. - * - * You only need to use this lock if you are developing an application - * which calls poll() or select() on libusb's file descriptors directly. - * If you stick to libusb's event handling loop functions (e.g. - * libusb_handle_events()) then you do not need to be concerned with this - * locking. - * - * While holding this lock, you are trusted to actually be handling events. - * If you are no longer handling events, you must call libusb_unlock_events() - * as soon as possible. - * - * \param ctx the context to operate on, or NULL for the default context - * \ref libusb_mtasync - */ -void API_EXPORTED libusb_lock_events(libusb_context *ctx) -{ - USBI_GET_CONTEXT(ctx); - usbi_mutex_lock(&ctx->events_lock); - ctx->event_handler_active = 1; -} - -/** \ingroup libusb_poll - * Release the lock previously acquired with libusb_try_lock_events() or - * libusb_lock_events(). Releasing this lock will wake up any threads blocked - * on libusb_wait_for_event(). - * - * \param ctx the context to operate on, or NULL for the default context - * \ref libusb_mtasync - */ -void API_EXPORTED libusb_unlock_events(libusb_context *ctx) -{ - USBI_GET_CONTEXT(ctx); - ctx->event_handler_active = 0; - usbi_mutex_unlock(&ctx->events_lock); - - /* FIXME: perhaps we should be a bit more efficient by not broadcasting - * the availability of the events lock when we are modifying pollfds - * (check ctx->device_close)? */ - usbi_mutex_lock(&ctx->event_waiters_lock); - usbi_cond_broadcast(&ctx->event_waiters_cond); - usbi_mutex_unlock(&ctx->event_waiters_lock); -} - -/** \ingroup libusb_poll - * Determine if it is still OK for this thread to be doing event handling. - * - * Sometimes, libusb needs to temporarily pause all event handlers, and this - * is the function you should use before polling file descriptors to see if - * this is the case. - * - * If this function instructs your thread to give up the events lock, you - * should just continue the usual logic that is documented in \ref libusb_mtasync. - * On the next iteration, your thread will fail to obtain the events lock, - * and will hence become an event waiter. - * - * This function should be called while the events lock is held: you don't - * need to worry about the results of this function if your thread is not - * the current event handler. - * - * \param ctx the context to operate on, or NULL for the default context - * \returns 1 if event handling can start or continue - * \returns 0 if this thread must give up the events lock - * \ref fullstory "Multi-threaded I/O: the full story" - */ -int API_EXPORTED libusb_event_handling_ok(libusb_context *ctx) -{ - unsigned int r; - USBI_GET_CONTEXT(ctx); - - /* is someone else waiting to close a device? if so, don't let this thread - * continue event handling */ - usbi_mutex_lock(&ctx->event_data_lock); - r = ctx->device_close; - usbi_mutex_unlock(&ctx->event_data_lock); - if (r) { - usbi_dbg("someone else is closing a device"); - return 0; - } - - return 1; -} - - -/** \ingroup libusb_poll - * Determine if an active thread is handling events (i.e. if anyone is holding - * the event handling lock). - * - * \param ctx the context to operate on, or NULL for the default context - * \returns 1 if a thread is handling events - * \returns 0 if there are no threads currently handling events - * \ref libusb_mtasync - */ -int API_EXPORTED libusb_event_handler_active(libusb_context *ctx) -{ - unsigned int r; - USBI_GET_CONTEXT(ctx); - - /* is someone else waiting to close a device? if so, don't let this thread - * start event handling -- indicate that event handling is happening */ - usbi_mutex_lock(&ctx->event_data_lock); - r = ctx->device_close; - usbi_mutex_unlock(&ctx->event_data_lock); - if (r) { - usbi_dbg("someone else is closing a device"); - return 1; - } - - return ctx->event_handler_active; -} - -/** \ingroup libusb_poll - * Interrupt any active thread that is handling events. This is mainly useful - * for interrupting a dedicated event handling thread when an application - * wishes to call libusb_exit(). - * - * Since version 1.0.21, \ref LIBUSB_API_VERSION >= 0x01000105 - * - * \param ctx the context to operate on, or NULL for the default context - * \ref libusb_mtasync - */ -void API_EXPORTED libusb_interrupt_event_handler(libusb_context *ctx) -{ - int pending_events; - USBI_GET_CONTEXT(ctx); - - usbi_dbg(""); - usbi_mutex_lock(&ctx->event_data_lock); - - pending_events = usbi_pending_events(ctx); - ctx->event_flags |= USBI_EVENT_USER_INTERRUPT; - if (!pending_events) - usbi_signal_event(ctx); - - usbi_mutex_unlock(&ctx->event_data_lock); -} - -/** \ingroup libusb_poll - * Acquire the event waiters lock. This lock is designed to be obtained under - * the situation where you want to be aware when events are completed, but - * some other thread is event handling so calling libusb_handle_events() is not - * allowed. - * - * You then obtain this lock, re-check that another thread is still handling - * events, then call libusb_wait_for_event(). - * - * You only need to use this lock if you are developing an application - * which calls poll() or select() on libusb's file descriptors directly, - * and may potentially be handling events from 2 threads simultaenously. - * If you stick to libusb's event handling loop functions (e.g. - * libusb_handle_events()) then you do not need to be concerned with this - * locking. - * - * \param ctx the context to operate on, or NULL for the default context - * \ref libusb_mtasync - */ -void API_EXPORTED libusb_lock_event_waiters(libusb_context *ctx) -{ - USBI_GET_CONTEXT(ctx); - usbi_mutex_lock(&ctx->event_waiters_lock); -} - -/** \ingroup libusb_poll - * Release the event waiters lock. - * \param ctx the context to operate on, or NULL for the default context - * \ref libusb_mtasync - */ -void API_EXPORTED libusb_unlock_event_waiters(libusb_context *ctx) -{ - USBI_GET_CONTEXT(ctx); - usbi_mutex_unlock(&ctx->event_waiters_lock); -} - -/** \ingroup libusb_poll - * Wait for another thread to signal completion of an event. Must be called - * with the event waiters lock held, see libusb_lock_event_waiters(). - * - * This function will block until any of the following conditions are met: - * -# The timeout expires - * -# A transfer completes - * -# A thread releases the event handling lock through libusb_unlock_events() - * - * Condition 1 is obvious. Condition 2 unblocks your thread after - * the callback for the transfer has completed. Condition 3 is important - * because it means that the thread that was previously handling events is no - * longer doing so, so if any events are to complete, another thread needs to - * step up and start event handling. - * - * This function releases the event waiters lock before putting your thread - * to sleep, and reacquires the lock as it is being woken up. - * - * \param ctx the context to operate on, or NULL for the default context - * \param tv maximum timeout for this blocking function. A NULL value - * indicates unlimited timeout. - * \returns 0 after a transfer completes or another thread stops event handling - * \returns 1 if the timeout expired - * \ref libusb_mtasync - */ -int API_EXPORTED libusb_wait_for_event(libusb_context *ctx, struct timeval *tv) -{ - int r; - - USBI_GET_CONTEXT(ctx); - if (tv == NULL) { - usbi_cond_wait(&ctx->event_waiters_cond, &ctx->event_waiters_lock); - return 0; - } - - r = usbi_cond_timedwait(&ctx->event_waiters_cond, - &ctx->event_waiters_lock, tv); - - if (r < 0) - return r; - else - return (r == ETIMEDOUT); -} - -static void handle_timeout(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = - USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - int r; - - itransfer->timeout_flags |= USBI_TRANSFER_TIMEOUT_HANDLED; - r = libusb_cancel_transfer(transfer); - if (r == LIBUSB_SUCCESS) - itransfer->timeout_flags |= USBI_TRANSFER_TIMED_OUT; - else - usbi_warn(TRANSFER_CTX(transfer), - "async cancel failed %d errno=%d", r, errno); -} - -static int handle_timeouts_locked(struct libusb_context *ctx) -{ - int r; - struct timespec systime_ts; - struct timeval systime; - struct usbi_transfer *transfer; - - if (list_empty(&ctx->flying_transfers)) - return 0; - - /* get current time */ - r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &systime_ts); - if (r < 0) - return r; - - TIMESPEC_TO_TIMEVAL(&systime, &systime_ts); - - /* iterate through flying transfers list, finding all transfers that - * have expired timeouts */ - list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { - struct timeval *cur_tv = &transfer->timeout; - - /* if we've reached transfers of infinite timeout, we're all done */ - if (!timerisset(cur_tv)) - return 0; - - /* ignore timeouts we've already handled */ - if (transfer->timeout_flags & (USBI_TRANSFER_TIMEOUT_HANDLED | USBI_TRANSFER_OS_HANDLES_TIMEOUT)) - continue; - - /* if transfer has non-expired timeout, nothing more to do */ - if ((cur_tv->tv_sec > systime.tv_sec) || - (cur_tv->tv_sec == systime.tv_sec && - cur_tv->tv_usec > systime.tv_usec)) - return 0; - - /* otherwise, we've got an expired timeout to handle */ - handle_timeout(transfer); - } - return 0; -} - -static int handle_timeouts(struct libusb_context *ctx) -{ - int r; - USBI_GET_CONTEXT(ctx); - usbi_mutex_lock(&ctx->flying_transfers_lock); - r = handle_timeouts_locked(ctx); - usbi_mutex_unlock(&ctx->flying_transfers_lock); - return r; -} - -#ifdef USBI_TIMERFD_AVAILABLE -static int handle_timerfd_trigger(struct libusb_context *ctx) -{ - int r; - - usbi_mutex_lock(&ctx->flying_transfers_lock); - - /* process the timeout that just happened */ - r = handle_timeouts_locked(ctx); - if (r < 0) - goto out; - - /* arm for next timeout*/ - r = arm_timerfd_for_next_timeout(ctx); - -out: - usbi_mutex_unlock(&ctx->flying_transfers_lock); - return r; -} -#endif - -/* do the actual event handling. assumes that no other thread is concurrently - * doing the same thing. */ -static int handle_events(struct libusb_context *ctx, struct timeval *tv) -{ - int r; - struct usbi_pollfd *ipollfd; - POLL_NFDS_TYPE nfds = 0; - POLL_NFDS_TYPE internal_nfds; - struct pollfd *fds = NULL; - int i = -1; - int timeout_ms; - int special_event; - - /* prevent attempts to recursively handle events (e.g. calling into - * libusb_handle_events() from within a hotplug or transfer callback) */ - if (usbi_handling_events(ctx)) - return LIBUSB_ERROR_BUSY; - usbi_start_event_handling(ctx); - - /* there are certain fds that libusb uses internally, currently: - * - * 1) event pipe - * 2) timerfd - * - * the backend will never need to attempt to handle events on these fds, so - * we determine how many fds are in use internally for this context and when - * handle_events() is called in the backend, the pollfd list and count will - * be adjusted to skip over these internal fds */ - if (usbi_using_timerfd(ctx)) - internal_nfds = 2; - else - internal_nfds = 1; - - /* only reallocate the poll fds when the list of poll fds has been modified - * since the last poll, otherwise reuse them to save the additional overhead */ - usbi_mutex_lock(&ctx->event_data_lock); - if (ctx->event_flags & USBI_EVENT_POLLFDS_MODIFIED) { - usbi_dbg("poll fds modified, reallocating"); - - if (ctx->pollfds) { - free(ctx->pollfds); - ctx->pollfds = NULL; - } - - /* sanity check - it is invalid for a context to have fewer than the - * required internal fds (memory corruption?) */ - assert(ctx->pollfds_cnt >= internal_nfds); - - ctx->pollfds = calloc(ctx->pollfds_cnt, sizeof(*ctx->pollfds)); - if (!ctx->pollfds) { - usbi_mutex_unlock(&ctx->event_data_lock); - r = LIBUSB_ERROR_NO_MEM; - goto done; - } - - list_for_each_entry(ipollfd, &ctx->ipollfds, list, struct usbi_pollfd) { - struct libusb_pollfd *pollfd = &ipollfd->pollfd; - i++; - ctx->pollfds[i].fd = pollfd->fd; - ctx->pollfds[i].events = pollfd->events; - } - - /* reset the flag now that we have the updated list */ - ctx->event_flags &= ~USBI_EVENT_POLLFDS_MODIFIED; - - /* if no further pending events, clear the event pipe so that we do - * not immediately return from poll */ - if (!usbi_pending_events(ctx)) - usbi_clear_event(ctx); - } - fds = ctx->pollfds; - nfds = ctx->pollfds_cnt; - usbi_mutex_unlock(&ctx->event_data_lock); - - timeout_ms = (int)(tv->tv_sec * 1000) + (tv->tv_usec / 1000); - - /* round up to next millisecond */ - if (tv->tv_usec % 1000) - timeout_ms++; - -redo_poll: - usbi_dbg("poll() %d fds with timeout in %dms", nfds, timeout_ms); - r = usbi_poll(fds, nfds, timeout_ms); - usbi_dbg("poll() returned %d", r); - if (r == 0) { - r = handle_timeouts(ctx); - goto done; - } - else if (r == -1 && errno == EINTR) { - r = LIBUSB_ERROR_INTERRUPTED; - goto done; - } - else if (r < 0) { - usbi_err(ctx, "poll failed %d err=%d", r, errno); - r = LIBUSB_ERROR_IO; - goto done; - } - - special_event = 0; - - /* fds[0] is always the event pipe */ - if (fds[0].revents) { - libusb_hotplug_message *message = NULL; - struct usbi_transfer *itransfer; - int ret = 0; - - usbi_dbg("caught a fish on the event pipe"); - - /* take the the event data lock while processing events */ - usbi_mutex_lock(&ctx->event_data_lock); - - /* check if someone added a new poll fd */ - if (ctx->event_flags & USBI_EVENT_POLLFDS_MODIFIED) - usbi_dbg("someone updated the poll fds"); - - if (ctx->event_flags & USBI_EVENT_USER_INTERRUPT) { - usbi_dbg("someone purposely interrupted"); - ctx->event_flags &= ~USBI_EVENT_USER_INTERRUPT; - } - - /* check if someone is closing a device */ - if (ctx->device_close) - usbi_dbg("someone is closing a device"); - - /* check for any pending hotplug messages */ - if (!list_empty(&ctx->hotplug_msgs)) { - usbi_dbg("hotplug message received"); - special_event = 1; - message = list_first_entry(&ctx->hotplug_msgs, libusb_hotplug_message, list); - list_del(&message->list); - } - - /* complete any pending transfers */ - while (ret == 0 && !list_empty(&ctx->completed_transfers)) { - itransfer = list_first_entry(&ctx->completed_transfers, struct usbi_transfer, completed_list); - list_del(&itransfer->completed_list); - usbi_mutex_unlock(&ctx->event_data_lock); - ret = usbi_backend->handle_transfer_completion(itransfer); - if (ret) - usbi_err(ctx, "backend handle_transfer_completion failed with error %d", ret); - usbi_mutex_lock(&ctx->event_data_lock); - } - - /* if no further pending events, clear the event pipe */ - if (!usbi_pending_events(ctx)) - usbi_clear_event(ctx); - - usbi_mutex_unlock(&ctx->event_data_lock); - - /* process the hotplug message, if any */ - if (message) { - usbi_hotplug_match(ctx, message->device, message->event); - - /* the device left, dereference the device */ - if (LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT == message->event) - libusb_unref_device(message->device); - - free(message); - } - - if (ret) { - /* return error code */ - r = ret; - goto done; - } - - if (0 == --r) - goto handled; - } - -#ifdef USBI_TIMERFD_AVAILABLE - /* on timerfd configurations, fds[1] is the timerfd */ - if (usbi_using_timerfd(ctx) && fds[1].revents) { - /* timerfd indicates that a timeout has expired */ - int ret; - usbi_dbg("timerfd triggered"); - special_event = 1; - - ret = handle_timerfd_trigger(ctx); - if (ret < 0) { - /* return error code */ - r = ret; - goto done; - } - - if (0 == --r) - goto handled; - } -#endif - - r = usbi_backend->handle_events(ctx, fds + internal_nfds, nfds - internal_nfds, r); - if (r) - usbi_err(ctx, "backend handle_events failed with error %d", r); - -handled: - if (r == 0 && special_event) { - timeout_ms = 0; - goto redo_poll; - } - -done: - usbi_end_event_handling(ctx); - return r; -} - -/* returns the smallest of: - * 1. timeout of next URB - * 2. user-supplied timeout - * returns 1 if there is an already-expired timeout, otherwise returns 0 - * and populates out - */ -static int get_next_timeout(libusb_context *ctx, struct timeval *tv, - struct timeval *out) -{ - struct timeval timeout; - int r = libusb_get_next_timeout(ctx, &timeout); - if (r) { - /* timeout already expired? */ - if (!timerisset(&timeout)) - return 1; - - /* choose the smallest of next URB timeout or user specified timeout */ - if (timercmp(&timeout, tv, <)) - *out = timeout; - else - *out = *tv; - } else { - *out = *tv; - } - return 0; -} - -/** \ingroup libusb_poll - * Handle any pending events. - * - * libusb determines "pending events" by checking if any timeouts have expired - * and by checking the set of file descriptors for activity. - * - * If a zero timeval is passed, this function will handle any already-pending - * events and then immediately return in non-blocking style. - * - * If a non-zero timeval is passed and no events are currently pending, this - * function will block waiting for events to handle up until the specified - * timeout. If an event arrives or a signal is raised, this function will - * return early. - * - * If the parameter completed is not NULL then after obtaining the event - * handling lock this function will return immediately if the integer - * pointed to is not 0. This allows for race free waiting for the completion - * of a specific transfer. - * - * \param ctx the context to operate on, or NULL for the default context - * \param tv the maximum time to block waiting for events, or an all zero - * timeval struct for non-blocking mode - * \param completed pointer to completion integer to check, or NULL - * \returns 0 on success, or a LIBUSB_ERROR code on failure - * \ref libusb_mtasync - */ -int API_EXPORTED libusb_handle_events_timeout_completed(libusb_context *ctx, - struct timeval *tv, int *completed) -{ - int r; - struct timeval poll_timeout; - - USBI_GET_CONTEXT(ctx); - r = get_next_timeout(ctx, tv, &poll_timeout); - if (r) { - /* timeout already expired */ - return handle_timeouts(ctx); - } - -retry: - if (libusb_try_lock_events(ctx) == 0) { - if (completed == NULL || !*completed) { - /* we obtained the event lock: do our own event handling */ - usbi_dbg("doing our own event handling"); - r = handle_events(ctx, &poll_timeout); - } - libusb_unlock_events(ctx); - return r; - } - - /* another thread is doing event handling. wait for thread events that - * notify event completion. */ - libusb_lock_event_waiters(ctx); - - if (completed && *completed) - goto already_done; - - if (!libusb_event_handler_active(ctx)) { - /* we hit a race: whoever was event handling earlier finished in the - * time it took us to reach this point. try the cycle again. */ - libusb_unlock_event_waiters(ctx); - usbi_dbg("event handler was active but went away, retrying"); - goto retry; - } - - usbi_dbg("another thread is doing event handling"); - r = libusb_wait_for_event(ctx, &poll_timeout); - -already_done: - libusb_unlock_event_waiters(ctx); - - if (r < 0) - return r; - else if (r == 1) - return handle_timeouts(ctx); - else - return 0; -} - -/** \ingroup libusb_poll - * Handle any pending events - * - * Like libusb_handle_events_timeout_completed(), but without the completed - * parameter, calling this function is equivalent to calling - * libusb_handle_events_timeout_completed() with a NULL completed parameter. - * - * This function is kept primarily for backwards compatibility. - * All new code should call libusb_handle_events_completed() or - * libusb_handle_events_timeout_completed() to avoid race conditions. - * - * \param ctx the context to operate on, or NULL for the default context - * \param tv the maximum time to block waiting for events, or an all zero - * timeval struct for non-blocking mode - * \returns 0 on success, or a LIBUSB_ERROR code on failure - */ -int API_EXPORTED libusb_handle_events_timeout(libusb_context *ctx, - struct timeval *tv) -{ - return libusb_handle_events_timeout_completed(ctx, tv, NULL); -} - -/** \ingroup libusb_poll - * Handle any pending events in blocking mode. There is currently a timeout - * hardcoded at 60 seconds but we plan to make it unlimited in future. For - * finer control over whether this function is blocking or non-blocking, or - * for control over the timeout, use libusb_handle_events_timeout_completed() - * instead. - * - * This function is kept primarily for backwards compatibility. - * All new code should call libusb_handle_events_completed() or - * libusb_handle_events_timeout_completed() to avoid race conditions. - * - * \param ctx the context to operate on, or NULL for the default context - * \returns 0 on success, or a LIBUSB_ERROR code on failure - */ -int API_EXPORTED libusb_handle_events(libusb_context *ctx) -{ - struct timeval tv; - tv.tv_sec = 60; - tv.tv_usec = 0; - return libusb_handle_events_timeout_completed(ctx, &tv, NULL); -} - -/** \ingroup libusb_poll - * Handle any pending events in blocking mode. - * - * Like libusb_handle_events(), with the addition of a completed parameter - * to allow for race free waiting for the completion of a specific transfer. - * - * See libusb_handle_events_timeout_completed() for details on the completed - * parameter. - * - * \param ctx the context to operate on, or NULL for the default context - * \param completed pointer to completion integer to check, or NULL - * \returns 0 on success, or a LIBUSB_ERROR code on failure - * \ref libusb_mtasync - */ -int API_EXPORTED libusb_handle_events_completed(libusb_context *ctx, - int *completed) -{ - struct timeval tv; - tv.tv_sec = 60; - tv.tv_usec = 0; - return libusb_handle_events_timeout_completed(ctx, &tv, completed); -} - -/** \ingroup libusb_poll - * Handle any pending events by polling file descriptors, without checking if - * any other threads are already doing so. Must be called with the event lock - * held, see libusb_lock_events(). - * - * This function is designed to be called under the situation where you have - * taken the event lock and are calling poll()/select() directly on libusb's - * file descriptors (as opposed to using libusb_handle_events() or similar). - * You detect events on libusb's descriptors, so you then call this function - * with a zero timeout value (while still holding the event lock). - * - * \param ctx the context to operate on, or NULL for the default context - * \param tv the maximum time to block waiting for events, or zero for - * non-blocking mode - * \returns 0 on success, or a LIBUSB_ERROR code on failure - * \ref libusb_mtasync - */ -int API_EXPORTED libusb_handle_events_locked(libusb_context *ctx, - struct timeval *tv) -{ - int r; - struct timeval poll_timeout; - - USBI_GET_CONTEXT(ctx); - r = get_next_timeout(ctx, tv, &poll_timeout); - if (r) { - /* timeout already expired */ - return handle_timeouts(ctx); - } - - return handle_events(ctx, &poll_timeout); -} - -/** \ingroup libusb_poll - * Determines whether your application must apply special timing considerations - * when monitoring libusb's file descriptors. - * - * This function is only useful for applications which retrieve and poll - * libusb's file descriptors in their own main loop (\ref libusb_pollmain). - * - * Ordinarily, libusb's event handler needs to be called into at specific - * moments in time (in addition to times when there is activity on the file - * descriptor set). The usual approach is to use libusb_get_next_timeout() - * to learn about when the next timeout occurs, and to adjust your - * poll()/select() timeout accordingly so that you can make a call into the - * library at that time. - * - * Some platforms supported by libusb do not come with this baggage - any - * events relevant to timing will be represented by activity on the file - * descriptor set, and libusb_get_next_timeout() will always return 0. - * This function allows you to detect whether you are running on such a - * platform. - * - * Since v1.0.5. - * - * \param ctx the context to operate on, or NULL for the default context - * \returns 0 if you must call into libusb at times determined by - * libusb_get_next_timeout(), or 1 if all timeout events are handled internally - * or through regular activity on the file descriptors. - * \ref libusb_pollmain "Polling libusb file descriptors for event handling" - */ -int API_EXPORTED libusb_pollfds_handle_timeouts(libusb_context *ctx) -{ -#if defined(USBI_TIMERFD_AVAILABLE) - USBI_GET_CONTEXT(ctx); - return usbi_using_timerfd(ctx); -#else - UNUSED(ctx); - return 0; -#endif -} - -/** \ingroup libusb_poll - * Determine the next internal timeout that libusb needs to handle. You only - * need to use this function if you are calling poll() or select() or similar - * on libusb's file descriptors yourself - you do not need to use it if you - * are calling libusb_handle_events() or a variant directly. - * - * You should call this function in your main loop in order to determine how - * long to wait for select() or poll() to return results. libusb needs to be - * called into at this timeout, so you should use it as an upper bound on - * your select() or poll() call. - * - * When the timeout has expired, call into libusb_handle_events_timeout() - * (perhaps in non-blocking mode) so that libusb can handle the timeout. - * - * This function may return 1 (success) and an all-zero timeval. If this is - * the case, it indicates that libusb has a timeout that has already expired - * so you should call libusb_handle_events_timeout() or similar immediately. - * A return code of 0 indicates that there are no pending timeouts. - * - * On some platforms, this function will always returns 0 (no pending - * timeouts). See \ref polltime. - * - * \param ctx the context to operate on, or NULL for the default context - * \param tv output location for a relative time against the current - * clock in which libusb must be called into in order to process timeout events - * \returns 0 if there are no pending timeouts, 1 if a timeout was returned, - * or LIBUSB_ERROR_OTHER on failure - */ -int API_EXPORTED libusb_get_next_timeout(libusb_context *ctx, - struct timeval *tv) -{ - struct usbi_transfer *transfer; - struct timespec cur_ts; - struct timeval cur_tv; - struct timeval next_timeout = { 0, 0 }; - int r; - - USBI_GET_CONTEXT(ctx); - if (usbi_using_timerfd(ctx)) - return 0; - - usbi_mutex_lock(&ctx->flying_transfers_lock); - if (list_empty(&ctx->flying_transfers)) { - usbi_mutex_unlock(&ctx->flying_transfers_lock); - usbi_dbg("no URBs, no timeout!"); - return 0; - } - - /* find next transfer which hasn't already been processed as timed out */ - list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { - if (transfer->timeout_flags & (USBI_TRANSFER_TIMEOUT_HANDLED | USBI_TRANSFER_OS_HANDLES_TIMEOUT)) - continue; - - /* if we've reached transfers of infinte timeout, we're done looking */ - if (!timerisset(&transfer->timeout)) - break; - - next_timeout = transfer->timeout; - break; - } - usbi_mutex_unlock(&ctx->flying_transfers_lock); - - if (!timerisset(&next_timeout)) { - usbi_dbg("no URB with timeout or all handled by OS; no timeout!"); - return 0; - } - - r = usbi_backend->clock_gettime(USBI_CLOCK_MONOTONIC, &cur_ts); - if (r < 0) { - usbi_err(ctx, "failed to read monotonic clock, errno=%d", errno); - return 0; - } - TIMESPEC_TO_TIMEVAL(&cur_tv, &cur_ts); - - if (!timercmp(&cur_tv, &next_timeout, <)) { - usbi_dbg("first timeout already expired"); - timerclear(tv); - } else { - timersub(&next_timeout, &cur_tv, tv); - usbi_dbg("next timeout in %d.%06ds", tv->tv_sec, tv->tv_usec); - } - - return 1; -} - -/** \ingroup libusb_poll - * Register notification functions for file descriptor additions/removals. - * These functions will be invoked for every new or removed file descriptor - * that libusb uses as an event source. - * - * To remove notifiers, pass NULL values for the function pointers. - * - * Note that file descriptors may have been added even before you register - * these notifiers (e.g. at libusb_init() time). - * - * Additionally, note that the removal notifier may be called during - * libusb_exit() (e.g. when it is closing file descriptors that were opened - * and added to the poll set at libusb_init() time). If you don't want this, - * remove the notifiers immediately before calling libusb_exit(). - * - * \param ctx the context to operate on, or NULL for the default context - * \param added_cb pointer to function for addition notifications - * \param removed_cb pointer to function for removal notifications - * \param user_data User data to be passed back to callbacks (useful for - * passing context information) - */ -void API_EXPORTED libusb_set_pollfd_notifiers(libusb_context *ctx, - libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, - void *user_data) -{ - USBI_GET_CONTEXT(ctx); - ctx->fd_added_cb = added_cb; - ctx->fd_removed_cb = removed_cb; - ctx->fd_cb_user_data = user_data; -} - -/* - * Interrupt the iteration of the event handling thread, so that it picks - * up the fd change. Callers of this function must hold the event_data_lock. - */ -static void usbi_fd_notification(struct libusb_context *ctx) -{ - int pending_events; - - /* Record that there is a new poll fd. - * Only signal an event if there are no prior pending events. */ - pending_events = usbi_pending_events(ctx); - ctx->event_flags |= USBI_EVENT_POLLFDS_MODIFIED; - if (!pending_events) - usbi_signal_event(ctx); -} - -/* Add a file descriptor to the list of file descriptors to be monitored. - * events should be specified as a bitmask of events passed to poll(), e.g. - * POLLIN and/or POLLOUT. */ -int usbi_add_pollfd(struct libusb_context *ctx, int fd, short events) -{ - struct usbi_pollfd *ipollfd = malloc(sizeof(*ipollfd)); - if (!ipollfd) - return LIBUSB_ERROR_NO_MEM; - - usbi_dbg("add fd %d events %d", fd, events); - ipollfd->pollfd.fd = fd; - ipollfd->pollfd.events = events; - usbi_mutex_lock(&ctx->event_data_lock); - list_add_tail(&ipollfd->list, &ctx->ipollfds); - ctx->pollfds_cnt++; - usbi_fd_notification(ctx); - usbi_mutex_unlock(&ctx->event_data_lock); - - if (ctx->fd_added_cb) - ctx->fd_added_cb(fd, events, ctx->fd_cb_user_data); - return 0; -} - -/* Remove a file descriptor from the list of file descriptors to be polled. */ -void usbi_remove_pollfd(struct libusb_context *ctx, int fd) -{ - struct usbi_pollfd *ipollfd; - int found = 0; - - usbi_dbg("remove fd %d", fd); - usbi_mutex_lock(&ctx->event_data_lock); - list_for_each_entry(ipollfd, &ctx->ipollfds, list, struct usbi_pollfd) - if (ipollfd->pollfd.fd == fd) { - found = 1; - break; - } - - if (!found) { - usbi_dbg("couldn't find fd %d to remove", fd); - usbi_mutex_unlock(&ctx->event_data_lock); - return; - } - - list_del(&ipollfd->list); - ctx->pollfds_cnt--; - usbi_fd_notification(ctx); - usbi_mutex_unlock(&ctx->event_data_lock); - free(ipollfd); - if (ctx->fd_removed_cb) - ctx->fd_removed_cb(fd, ctx->fd_cb_user_data); -} - -/** \ingroup libusb_poll - * Retrieve a list of file descriptors that should be polled by your main loop - * as libusb event sources. - * - * The returned list is NULL-terminated and should be freed with libusb_free_pollfds() - * when done. The actual list contents must not be touched. - * - * As file descriptors are a Unix-specific concept, this function is not - * available on Windows and will always return NULL. - * - * \param ctx the context to operate on, or NULL for the default context - * \returns a NULL-terminated list of libusb_pollfd structures - * \returns NULL on error - * \returns NULL on platforms where the functionality is not available - */ -DEFAULT_VISIBILITY -const struct libusb_pollfd ** LIBUSB_CALL libusb_get_pollfds( - libusb_context *ctx) -{ -#ifndef OS_WINDOWS - struct libusb_pollfd **ret = NULL; - struct usbi_pollfd *ipollfd; - size_t i = 0; - USBI_GET_CONTEXT(ctx); - - usbi_mutex_lock(&ctx->event_data_lock); - - ret = calloc(ctx->pollfds_cnt + 1, sizeof(struct libusb_pollfd *)); - if (!ret) - goto out; - - list_for_each_entry(ipollfd, &ctx->ipollfds, list, struct usbi_pollfd) - ret[i++] = (struct libusb_pollfd *) ipollfd; - ret[ctx->pollfds_cnt] = NULL; - -out: - usbi_mutex_unlock(&ctx->event_data_lock); - return (const struct libusb_pollfd **) ret; -#else - usbi_err(ctx, "external polling of libusb's internal descriptors "\ - "is not yet supported on Windows platforms"); - return NULL; -#endif -} - -/** \ingroup libusb_poll - * Free a list of libusb_pollfd structures. This should be called for all - * pollfd lists allocated with libusb_get_pollfds(). - * - * Since version 1.0.20, \ref LIBUSB_API_VERSION >= 0x01000104 - * - * It is legal to call this function with a NULL pollfd list. In this case, - * the function will simply return safely. - * - * \param pollfds the list of libusb_pollfd structures to free - */ -void API_EXPORTED libusb_free_pollfds(const struct libusb_pollfd **pollfds) -{ - if (!pollfds) - return; - - free((void *)pollfds); -} - -/* Backends may call this from handle_events to report disconnection of a - * device. This function ensures transfers get cancelled appropriately. - * Callers of this function must hold the events_lock. - */ -void usbi_handle_disconnect(struct libusb_device_handle *dev_handle) -{ - struct usbi_transfer *cur; - struct usbi_transfer *to_cancel; - - usbi_dbg("device %d.%d", - dev_handle->dev->bus_number, dev_handle->dev->device_address); - - /* terminate all pending transfers with the LIBUSB_TRANSFER_NO_DEVICE - * status code. - * - * when we find a transfer for this device on the list, there are two - * possible scenarios: - * 1. the transfer is currently in-flight, in which case we terminate the - * transfer here - * 2. the transfer has been added to the flying transfer list by - * libusb_submit_transfer, has failed to submit and - * libusb_submit_transfer is waiting for us to release the - * flying_transfers_lock to remove it, so we ignore it - */ - - while (1) { - to_cancel = NULL; - usbi_mutex_lock(&HANDLE_CTX(dev_handle)->flying_transfers_lock); - list_for_each_entry(cur, &HANDLE_CTX(dev_handle)->flying_transfers, list, struct usbi_transfer) - if (USBI_TRANSFER_TO_LIBUSB_TRANSFER(cur)->dev_handle == dev_handle) { - usbi_mutex_lock(&cur->lock); - if (cur->state_flags & USBI_TRANSFER_IN_FLIGHT) - to_cancel = cur; - usbi_mutex_unlock(&cur->lock); - - if (to_cancel) - break; - } - usbi_mutex_unlock(&HANDLE_CTX(dev_handle)->flying_transfers_lock); - - if (!to_cancel) - break; - - usbi_dbg("cancelling transfer %p from disconnect", - USBI_TRANSFER_TO_LIBUSB_TRANSFER(to_cancel)); - - usbi_mutex_lock(&to_cancel->lock); - usbi_backend->clear_transfer_priv(to_cancel); - usbi_mutex_unlock(&to_cancel->lock); - usbi_handle_transfer_completion(to_cancel, LIBUSB_TRANSFER_NO_DEVICE); - } - -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/libusb.h b/vendor/github.com/karalabe/hid/libusb/libusb/libusb.h deleted file mode 100644 index c562690f9afe..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/libusb.h +++ /dev/null @@ -1,2008 +0,0 @@ -/* - * Public libusb header file - * Copyright © 2001 Johannes Erdfelt - * Copyright © 2007-2008 Daniel Drake - * Copyright © 2012 Pete Batard - * Copyright © 2012 Nathan Hjelm - * For more information, please visit: http://libusb.info - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef LIBUSB_H -#define LIBUSB_H - -#ifdef _MSC_VER -/* on MS environments, the inline keyword is available in C++ only */ -#if !defined(__cplusplus) -#define inline __inline -#endif -/* ssize_t is also not available (copy/paste from MinGW) */ -#ifndef _SSIZE_T_DEFINED -#define _SSIZE_T_DEFINED -#undef ssize_t -#ifdef _WIN64 - typedef __int64 ssize_t; -#else - typedef int ssize_t; -#endif /* _WIN64 */ -#endif /* _SSIZE_T_DEFINED */ -#endif /* _MSC_VER */ - -/* stdint.h is not available on older MSVC */ -#if defined(_MSC_VER) && (_MSC_VER < 1600) && (!defined(_STDINT)) && (!defined(_STDINT_H)) -typedef unsigned __int8 uint8_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int32 uint32_t; -#else -#include -#endif - -#if !defined(_WIN32_WCE) -#include -#endif - -#if defined(__linux) || defined(__APPLE__) || defined(__CYGWIN__) || defined(__HAIKU__) -#include -#endif - -#include -#include - -/* 'interface' might be defined as a macro on Windows, so we need to - * undefine it so as not to break the current libusb API, because - * libusb_config_descriptor has an 'interface' member - * As this can be problematic if you include windows.h after libusb.h - * in your sources, we force windows.h to be included first. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -#include -#if defined(interface) -#undef interface -#endif -#if !defined(__CYGWIN__) -#include -#endif -#endif - -#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) -#define LIBUSB_DEPRECATED_FOR(f) \ - __attribute__((deprecated("Use " #f " instead"))) -#else -#define LIBUSB_DEPRECATED_FOR(f) -#endif /* __GNUC__ */ - -/** \def LIBUSB_CALL - * \ingroup libusb_misc - * libusb's Windows calling convention. - * - * Under Windows, the selection of available compilers and configurations - * means that, unlike other platforms, there is not one true calling - * convention (calling convention: the manner in which parameters are - * passed to functions in the generated assembly code). - * - * Matching the Windows API itself, libusb uses the WINAPI convention (which - * translates to the stdcall convention) and guarantees that the - * library is compiled in this way. The public header file also includes - * appropriate annotations so that your own software will use the right - * convention, even if another convention is being used by default within - * your codebase. - * - * The one consideration that you must apply in your software is to mark - * all functions which you use as libusb callbacks with this LIBUSB_CALL - * annotation, so that they too get compiled for the correct calling - * convention. - * - * On non-Windows operating systems, this macro is defined as nothing. This - * means that you can apply it to your code without worrying about - * cross-platform compatibility. - */ -/* LIBUSB_CALL must be defined on both definition and declaration of libusb - * functions. You'd think that declaration would be enough, but cygwin will - * complain about conflicting types unless both are marked this way. - * The placement of this macro is important too; it must appear after the - * return type, before the function name. See internal documentation for - * API_EXPORTED. - */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -#define LIBUSB_CALL WINAPI -#else -#define LIBUSB_CALL -#endif - -/** \def LIBUSB_API_VERSION - * \ingroup libusb_misc - * libusb's API version. - * - * Since version 1.0.13, to help with feature detection, libusb defines - * a LIBUSB_API_VERSION macro that gets increased every time there is a - * significant change to the API, such as the introduction of a new call, - * the definition of a new macro/enum member, or any other element that - * libusb applications may want to detect at compilation time. - * - * The macro is typically used in an application as follows: - * \code - * #if defined(LIBUSB_API_VERSION) && (LIBUSB_API_VERSION >= 0x01001234) - * // Use one of the newer features from the libusb API - * #endif - * \endcode - * - * Internally, LIBUSB_API_VERSION is defined as follows: - * (libusb major << 24) | (libusb minor << 16) | (16 bit incremental) - */ -#define LIBUSB_API_VERSION 0x01000105 - -/* The following is kept for compatibility, but will be deprecated in the future */ -#define LIBUSBX_API_VERSION LIBUSB_API_VERSION - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * \ingroup libusb_misc - * Convert a 16-bit value from host-endian to little-endian format. On - * little endian systems, this function does nothing. On big endian systems, - * the bytes are swapped. - * \param x the host-endian value to convert - * \returns the value in little-endian byte order - */ -static inline uint16_t libusb_cpu_to_le16(const uint16_t x) -{ - union { - uint8_t b8[2]; - uint16_t b16; - } _tmp; - _tmp.b8[1] = (uint8_t) (x >> 8); - _tmp.b8[0] = (uint8_t) (x & 0xff); - return _tmp.b16; -} - -/** \def libusb_le16_to_cpu - * \ingroup libusb_misc - * Convert a 16-bit value from little-endian to host-endian format. On - * little endian systems, this function does nothing. On big endian systems, - * the bytes are swapped. - * \param x the little-endian value to convert - * \returns the value in host-endian byte order - */ -#define libusb_le16_to_cpu libusb_cpu_to_le16 - -/* standard USB stuff */ - -/** \ingroup libusb_desc - * Device and/or Interface Class codes */ -enum libusb_class_code { - /** In the context of a \ref libusb_device_descriptor "device descriptor", - * this bDeviceClass value indicates that each interface specifies its - * own class information and all interfaces operate independently. - */ - LIBUSB_CLASS_PER_INTERFACE = 0, - - /** Audio class */ - LIBUSB_CLASS_AUDIO = 1, - - /** Communications class */ - LIBUSB_CLASS_COMM = 2, - - /** Human Interface Device class */ - LIBUSB_CLASS_HID = 3, - - /** Physical */ - LIBUSB_CLASS_PHYSICAL = 5, - - /** Printer class */ - LIBUSB_CLASS_PRINTER = 7, - - /** Image class */ - LIBUSB_CLASS_PTP = 6, /* legacy name from libusb-0.1 usb.h */ - LIBUSB_CLASS_IMAGE = 6, - - /** Mass storage class */ - LIBUSB_CLASS_MASS_STORAGE = 8, - - /** Hub class */ - LIBUSB_CLASS_HUB = 9, - - /** Data class */ - LIBUSB_CLASS_DATA = 10, - - /** Smart Card */ - LIBUSB_CLASS_SMART_CARD = 0x0b, - - /** Content Security */ - LIBUSB_CLASS_CONTENT_SECURITY = 0x0d, - - /** Video */ - LIBUSB_CLASS_VIDEO = 0x0e, - - /** Personal Healthcare */ - LIBUSB_CLASS_PERSONAL_HEALTHCARE = 0x0f, - - /** Diagnostic Device */ - LIBUSB_CLASS_DIAGNOSTIC_DEVICE = 0xdc, - - /** Wireless class */ - LIBUSB_CLASS_WIRELESS = 0xe0, - - /** Application class */ - LIBUSB_CLASS_APPLICATION = 0xfe, - - /** Class is vendor-specific */ - LIBUSB_CLASS_VENDOR_SPEC = 0xff -}; - -/** \ingroup libusb_desc - * Descriptor types as defined by the USB specification. */ -enum libusb_descriptor_type { - /** Device descriptor. See libusb_device_descriptor. */ - LIBUSB_DT_DEVICE = 0x01, - - /** Configuration descriptor. See libusb_config_descriptor. */ - LIBUSB_DT_CONFIG = 0x02, - - /** String descriptor */ - LIBUSB_DT_STRING = 0x03, - - /** Interface descriptor. See libusb_interface_descriptor. */ - LIBUSB_DT_INTERFACE = 0x04, - - /** Endpoint descriptor. See libusb_endpoint_descriptor. */ - LIBUSB_DT_ENDPOINT = 0x05, - - /** BOS descriptor */ - LIBUSB_DT_BOS = 0x0f, - - /** Device Capability descriptor */ - LIBUSB_DT_DEVICE_CAPABILITY = 0x10, - - /** HID descriptor */ - LIBUSB_DT_HID = 0x21, - - /** HID report descriptor */ - LIBUSB_DT_REPORT = 0x22, - - /** Physical descriptor */ - LIBUSB_DT_PHYSICAL = 0x23, - - /** Hub descriptor */ - LIBUSB_DT_HUB = 0x29, - - /** SuperSpeed Hub descriptor */ - LIBUSB_DT_SUPERSPEED_HUB = 0x2a, - - /** SuperSpeed Endpoint Companion descriptor */ - LIBUSB_DT_SS_ENDPOINT_COMPANION = 0x30 -}; - -/* Descriptor sizes per descriptor type */ -#define LIBUSB_DT_DEVICE_SIZE 18 -#define LIBUSB_DT_CONFIG_SIZE 9 -#define LIBUSB_DT_INTERFACE_SIZE 9 -#define LIBUSB_DT_ENDPOINT_SIZE 7 -#define LIBUSB_DT_ENDPOINT_AUDIO_SIZE 9 /* Audio extension */ -#define LIBUSB_DT_HUB_NONVAR_SIZE 7 -#define LIBUSB_DT_SS_ENDPOINT_COMPANION_SIZE 6 -#define LIBUSB_DT_BOS_SIZE 5 -#define LIBUSB_DT_DEVICE_CAPABILITY_SIZE 3 - -/* BOS descriptor sizes */ -#define LIBUSB_BT_USB_2_0_EXTENSION_SIZE 7 -#define LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE 10 -#define LIBUSB_BT_CONTAINER_ID_SIZE 20 - -/* We unwrap the BOS => define its max size */ -#define LIBUSB_DT_BOS_MAX_SIZE ((LIBUSB_DT_BOS_SIZE) +\ - (LIBUSB_BT_USB_2_0_EXTENSION_SIZE) +\ - (LIBUSB_BT_SS_USB_DEVICE_CAPABILITY_SIZE) +\ - (LIBUSB_BT_CONTAINER_ID_SIZE)) - -#define LIBUSB_ENDPOINT_ADDRESS_MASK 0x0f /* in bEndpointAddress */ -#define LIBUSB_ENDPOINT_DIR_MASK 0x80 - -/** \ingroup libusb_desc - * Endpoint direction. Values for bit 7 of the - * \ref libusb_endpoint_descriptor::bEndpointAddress "endpoint address" scheme. - */ -enum libusb_endpoint_direction { - /** In: device-to-host */ - LIBUSB_ENDPOINT_IN = 0x80, - - /** Out: host-to-device */ - LIBUSB_ENDPOINT_OUT = 0x00 -}; - -#define LIBUSB_TRANSFER_TYPE_MASK 0x03 /* in bmAttributes */ - -/** \ingroup libusb_desc - * Endpoint transfer type. Values for bits 0:1 of the - * \ref libusb_endpoint_descriptor::bmAttributes "endpoint attributes" field. - */ -enum libusb_transfer_type { - /** Control endpoint */ - LIBUSB_TRANSFER_TYPE_CONTROL = 0, - - /** Isochronous endpoint */ - LIBUSB_TRANSFER_TYPE_ISOCHRONOUS = 1, - - /** Bulk endpoint */ - LIBUSB_TRANSFER_TYPE_BULK = 2, - - /** Interrupt endpoint */ - LIBUSB_TRANSFER_TYPE_INTERRUPT = 3, - - /** Stream endpoint */ - LIBUSB_TRANSFER_TYPE_BULK_STREAM = 4, -}; - -/** \ingroup libusb_misc - * Standard requests, as defined in table 9-5 of the USB 3.0 specifications */ -enum libusb_standard_request { - /** Request status of the specific recipient */ - LIBUSB_REQUEST_GET_STATUS = 0x00, - - /** Clear or disable a specific feature */ - LIBUSB_REQUEST_CLEAR_FEATURE = 0x01, - - /* 0x02 is reserved */ - - /** Set or enable a specific feature */ - LIBUSB_REQUEST_SET_FEATURE = 0x03, - - /* 0x04 is reserved */ - - /** Set device address for all future accesses */ - LIBUSB_REQUEST_SET_ADDRESS = 0x05, - - /** Get the specified descriptor */ - LIBUSB_REQUEST_GET_DESCRIPTOR = 0x06, - - /** Used to update existing descriptors or add new descriptors */ - LIBUSB_REQUEST_SET_DESCRIPTOR = 0x07, - - /** Get the current device configuration value */ - LIBUSB_REQUEST_GET_CONFIGURATION = 0x08, - - /** Set device configuration */ - LIBUSB_REQUEST_SET_CONFIGURATION = 0x09, - - /** Return the selected alternate setting for the specified interface */ - LIBUSB_REQUEST_GET_INTERFACE = 0x0A, - - /** Select an alternate interface for the specified interface */ - LIBUSB_REQUEST_SET_INTERFACE = 0x0B, - - /** Set then report an endpoint's synchronization frame */ - LIBUSB_REQUEST_SYNCH_FRAME = 0x0C, - - /** Sets both the U1 and U2 Exit Latency */ - LIBUSB_REQUEST_SET_SEL = 0x30, - - /** Delay from the time a host transmits a packet to the time it is - * received by the device. */ - LIBUSB_SET_ISOCH_DELAY = 0x31, -}; - -/** \ingroup libusb_misc - * Request type bits of the - * \ref libusb_control_setup::bmRequestType "bmRequestType" field in control - * transfers. */ -enum libusb_request_type { - /** Standard */ - LIBUSB_REQUEST_TYPE_STANDARD = (0x00 << 5), - - /** Class */ - LIBUSB_REQUEST_TYPE_CLASS = (0x01 << 5), - - /** Vendor */ - LIBUSB_REQUEST_TYPE_VENDOR = (0x02 << 5), - - /** Reserved */ - LIBUSB_REQUEST_TYPE_RESERVED = (0x03 << 5) -}; - -/** \ingroup libusb_misc - * Recipient bits of the - * \ref libusb_control_setup::bmRequestType "bmRequestType" field in control - * transfers. Values 4 through 31 are reserved. */ -enum libusb_request_recipient { - /** Device */ - LIBUSB_RECIPIENT_DEVICE = 0x00, - - /** Interface */ - LIBUSB_RECIPIENT_INTERFACE = 0x01, - - /** Endpoint */ - LIBUSB_RECIPIENT_ENDPOINT = 0x02, - - /** Other */ - LIBUSB_RECIPIENT_OTHER = 0x03, -}; - -#define LIBUSB_ISO_SYNC_TYPE_MASK 0x0C - -/** \ingroup libusb_desc - * Synchronization type for isochronous endpoints. Values for bits 2:3 of the - * \ref libusb_endpoint_descriptor::bmAttributes "bmAttributes" field in - * libusb_endpoint_descriptor. - */ -enum libusb_iso_sync_type { - /** No synchronization */ - LIBUSB_ISO_SYNC_TYPE_NONE = 0, - - /** Asynchronous */ - LIBUSB_ISO_SYNC_TYPE_ASYNC = 1, - - /** Adaptive */ - LIBUSB_ISO_SYNC_TYPE_ADAPTIVE = 2, - - /** Synchronous */ - LIBUSB_ISO_SYNC_TYPE_SYNC = 3 -}; - -#define LIBUSB_ISO_USAGE_TYPE_MASK 0x30 - -/** \ingroup libusb_desc - * Usage type for isochronous endpoints. Values for bits 4:5 of the - * \ref libusb_endpoint_descriptor::bmAttributes "bmAttributes" field in - * libusb_endpoint_descriptor. - */ -enum libusb_iso_usage_type { - /** Data endpoint */ - LIBUSB_ISO_USAGE_TYPE_DATA = 0, - - /** Feedback endpoint */ - LIBUSB_ISO_USAGE_TYPE_FEEDBACK = 1, - - /** Implicit feedback Data endpoint */ - LIBUSB_ISO_USAGE_TYPE_IMPLICIT = 2, -}; - -/** \ingroup libusb_desc - * A structure representing the standard USB device descriptor. This - * descriptor is documented in section 9.6.1 of the USB 3.0 specification. - * All multiple-byte fields are represented in host-endian format. - */ -struct libusb_device_descriptor { - /** Size of this descriptor (in bytes) */ - uint8_t bLength; - - /** Descriptor type. Will have value - * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE LIBUSB_DT_DEVICE in this - * context. */ - uint8_t bDescriptorType; - - /** USB specification release number in binary-coded decimal. A value of - * 0x0200 indicates USB 2.0, 0x0110 indicates USB 1.1, etc. */ - uint16_t bcdUSB; - - /** USB-IF class code for the device. See \ref libusb_class_code. */ - uint8_t bDeviceClass; - - /** USB-IF subclass code for the device, qualified by the bDeviceClass - * value */ - uint8_t bDeviceSubClass; - - /** USB-IF protocol code for the device, qualified by the bDeviceClass and - * bDeviceSubClass values */ - uint8_t bDeviceProtocol; - - /** Maximum packet size for endpoint 0 */ - uint8_t bMaxPacketSize0; - - /** USB-IF vendor ID */ - uint16_t idVendor; - - /** USB-IF product ID */ - uint16_t idProduct; - - /** Device release number in binary-coded decimal */ - uint16_t bcdDevice; - - /** Index of string descriptor describing manufacturer */ - uint8_t iManufacturer; - - /** Index of string descriptor describing product */ - uint8_t iProduct; - - /** Index of string descriptor containing device serial number */ - uint8_t iSerialNumber; - - /** Number of possible configurations */ - uint8_t bNumConfigurations; -}; - -/** \ingroup libusb_desc - * A structure representing the standard USB endpoint descriptor. This - * descriptor is documented in section 9.6.6 of the USB 3.0 specification. - * All multiple-byte fields are represented in host-endian format. - */ -struct libusb_endpoint_descriptor { - /** Size of this descriptor (in bytes) */ - uint8_t bLength; - - /** Descriptor type. Will have value - * \ref libusb_descriptor_type::LIBUSB_DT_ENDPOINT LIBUSB_DT_ENDPOINT in - * this context. */ - uint8_t bDescriptorType; - - /** The address of the endpoint described by this descriptor. Bits 0:3 are - * the endpoint number. Bits 4:6 are reserved. Bit 7 indicates direction, - * see \ref libusb_endpoint_direction. - */ - uint8_t bEndpointAddress; - - /** Attributes which apply to the endpoint when it is configured using - * the bConfigurationValue. Bits 0:1 determine the transfer type and - * correspond to \ref libusb_transfer_type. Bits 2:3 are only used for - * isochronous endpoints and correspond to \ref libusb_iso_sync_type. - * Bits 4:5 are also only used for isochronous endpoints and correspond to - * \ref libusb_iso_usage_type. Bits 6:7 are reserved. - */ - uint8_t bmAttributes; - - /** Maximum packet size this endpoint is capable of sending/receiving. */ - uint16_t wMaxPacketSize; - - /** Interval for polling endpoint for data transfers. */ - uint8_t bInterval; - - /** For audio devices only: the rate at which synchronization feedback - * is provided. */ - uint8_t bRefresh; - - /** For audio devices only: the address if the synch endpoint */ - uint8_t bSynchAddress; - - /** Extra descriptors. If libusb encounters unknown endpoint descriptors, - * it will store them here, should you wish to parse them. */ - const unsigned char *extra; - - /** Length of the extra descriptors, in bytes. */ - int extra_length; -}; - -/** \ingroup libusb_desc - * A structure representing the standard USB interface descriptor. This - * descriptor is documented in section 9.6.5 of the USB 3.0 specification. - * All multiple-byte fields are represented in host-endian format. - */ -struct libusb_interface_descriptor { - /** Size of this descriptor (in bytes) */ - uint8_t bLength; - - /** Descriptor type. Will have value - * \ref libusb_descriptor_type::LIBUSB_DT_INTERFACE LIBUSB_DT_INTERFACE - * in this context. */ - uint8_t bDescriptorType; - - /** Number of this interface */ - uint8_t bInterfaceNumber; - - /** Value used to select this alternate setting for this interface */ - uint8_t bAlternateSetting; - - /** Number of endpoints used by this interface (excluding the control - * endpoint). */ - uint8_t bNumEndpoints; - - /** USB-IF class code for this interface. See \ref libusb_class_code. */ - uint8_t bInterfaceClass; - - /** USB-IF subclass code for this interface, qualified by the - * bInterfaceClass value */ - uint8_t bInterfaceSubClass; - - /** USB-IF protocol code for this interface, qualified by the - * bInterfaceClass and bInterfaceSubClass values */ - uint8_t bInterfaceProtocol; - - /** Index of string descriptor describing this interface */ - uint8_t iInterface; - - /** Array of endpoint descriptors. This length of this array is determined - * by the bNumEndpoints field. */ - const struct libusb_endpoint_descriptor *endpoint; - - /** Extra descriptors. If libusb encounters unknown interface descriptors, - * it will store them here, should you wish to parse them. */ - const unsigned char *extra; - - /** Length of the extra descriptors, in bytes. */ - int extra_length; -}; - -/** \ingroup libusb_desc - * A collection of alternate settings for a particular USB interface. - */ -struct libusb_interface { - /** Array of interface descriptors. The length of this array is determined - * by the num_altsetting field. */ - const struct libusb_interface_descriptor *altsetting; - - /** The number of alternate settings that belong to this interface */ - int num_altsetting; -}; - -/** \ingroup libusb_desc - * A structure representing the standard USB configuration descriptor. This - * descriptor is documented in section 9.6.3 of the USB 3.0 specification. - * All multiple-byte fields are represented in host-endian format. - */ -struct libusb_config_descriptor { - /** Size of this descriptor (in bytes) */ - uint8_t bLength; - - /** Descriptor type. Will have value - * \ref libusb_descriptor_type::LIBUSB_DT_CONFIG LIBUSB_DT_CONFIG - * in this context. */ - uint8_t bDescriptorType; - - /** Total length of data returned for this configuration */ - uint16_t wTotalLength; - - /** Number of interfaces supported by this configuration */ - uint8_t bNumInterfaces; - - /** Identifier value for this configuration */ - uint8_t bConfigurationValue; - - /** Index of string descriptor describing this configuration */ - uint8_t iConfiguration; - - /** Configuration characteristics */ - uint8_t bmAttributes; - - /** Maximum power consumption of the USB device from this bus in this - * configuration when the device is fully operation. Expressed in units - * of 2 mA when the device is operating in high-speed mode and in units - * of 8 mA when the device is operating in super-speed mode. */ - uint8_t MaxPower; - - /** Array of interfaces supported by this configuration. The length of - * this array is determined by the bNumInterfaces field. */ - const struct libusb_interface *interface; - - /** Extra descriptors. If libusb encounters unknown configuration - * descriptors, it will store them here, should you wish to parse them. */ - const unsigned char *extra; - - /** Length of the extra descriptors, in bytes. */ - int extra_length; -}; - -/** \ingroup libusb_desc - * A structure representing the superspeed endpoint companion - * descriptor. This descriptor is documented in section 9.6.7 of - * the USB 3.0 specification. All multiple-byte fields are represented in - * host-endian format. - */ -struct libusb_ss_endpoint_companion_descriptor { - - /** Size of this descriptor (in bytes) */ - uint8_t bLength; - - /** Descriptor type. Will have value - * \ref libusb_descriptor_type::LIBUSB_DT_SS_ENDPOINT_COMPANION in - * this context. */ - uint8_t bDescriptorType; - - - /** The maximum number of packets the endpoint can send or - * receive as part of a burst. */ - uint8_t bMaxBurst; - - /** In bulk EP: bits 4:0 represents the maximum number of - * streams the EP supports. In isochronous EP: bits 1:0 - * represents the Mult - a zero based value that determines - * the maximum number of packets within a service interval */ - uint8_t bmAttributes; - - /** The total number of bytes this EP will transfer every - * service interval. valid only for periodic EPs. */ - uint16_t wBytesPerInterval; -}; - -/** \ingroup libusb_desc - * A generic representation of a BOS Device Capability descriptor. It is - * advised to check bDevCapabilityType and call the matching - * libusb_get_*_descriptor function to get a structure fully matching the type. - */ -struct libusb_bos_dev_capability_descriptor { - /** Size of this descriptor (in bytes) */ - uint8_t bLength; - /** Descriptor type. Will have value - * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY - * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ - uint8_t bDescriptorType; - /** Device Capability type */ - uint8_t bDevCapabilityType; - /** Device Capability data (bLength - 3 bytes) */ - uint8_t dev_capability_data -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - [] /* valid C99 code */ -#else - [0] /* non-standard, but usually working code */ -#endif - ; -}; - -/** \ingroup libusb_desc - * A structure representing the Binary Device Object Store (BOS) descriptor. - * This descriptor is documented in section 9.6.2 of the USB 3.0 specification. - * All multiple-byte fields are represented in host-endian format. - */ -struct libusb_bos_descriptor { - /** Size of this descriptor (in bytes) */ - uint8_t bLength; - - /** Descriptor type. Will have value - * \ref libusb_descriptor_type::LIBUSB_DT_BOS LIBUSB_DT_BOS - * in this context. */ - uint8_t bDescriptorType; - - /** Length of this descriptor and all of its sub descriptors */ - uint16_t wTotalLength; - - /** The number of separate device capability descriptors in - * the BOS */ - uint8_t bNumDeviceCaps; - - /** bNumDeviceCap Device Capability Descriptors */ - struct libusb_bos_dev_capability_descriptor *dev_capability -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - [] /* valid C99 code */ -#else - [0] /* non-standard, but usually working code */ -#endif - ; -}; - -/** \ingroup libusb_desc - * A structure representing the USB 2.0 Extension descriptor - * This descriptor is documented in section 9.6.2.1 of the USB 3.0 specification. - * All multiple-byte fields are represented in host-endian format. - */ -struct libusb_usb_2_0_extension_descriptor { - /** Size of this descriptor (in bytes) */ - uint8_t bLength; - - /** Descriptor type. Will have value - * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY - * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ - uint8_t bDescriptorType; - - /** Capability type. Will have value - * \ref libusb_capability_type::LIBUSB_BT_USB_2_0_EXTENSION - * LIBUSB_BT_USB_2_0_EXTENSION in this context. */ - uint8_t bDevCapabilityType; - - /** Bitmap encoding of supported device level features. - * A value of one in a bit location indicates a feature is - * supported; a value of zero indicates it is not supported. - * See \ref libusb_usb_2_0_extension_attributes. */ - uint32_t bmAttributes; -}; - -/** \ingroup libusb_desc - * A structure representing the SuperSpeed USB Device Capability descriptor - * This descriptor is documented in section 9.6.2.2 of the USB 3.0 specification. - * All multiple-byte fields are represented in host-endian format. - */ -struct libusb_ss_usb_device_capability_descriptor { - /** Size of this descriptor (in bytes) */ - uint8_t bLength; - - /** Descriptor type. Will have value - * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY - * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ - uint8_t bDescriptorType; - - /** Capability type. Will have value - * \ref libusb_capability_type::LIBUSB_BT_SS_USB_DEVICE_CAPABILITY - * LIBUSB_BT_SS_USB_DEVICE_CAPABILITY in this context. */ - uint8_t bDevCapabilityType; - - /** Bitmap encoding of supported device level features. - * A value of one in a bit location indicates a feature is - * supported; a value of zero indicates it is not supported. - * See \ref libusb_ss_usb_device_capability_attributes. */ - uint8_t bmAttributes; - - /** Bitmap encoding of the speed supported by this device when - * operating in SuperSpeed mode. See \ref libusb_supported_speed. */ - uint16_t wSpeedSupported; - - /** The lowest speed at which all the functionality supported - * by the device is available to the user. For example if the - * device supports all its functionality when connected at - * full speed and above then it sets this value to 1. */ - uint8_t bFunctionalitySupport; - - /** U1 Device Exit Latency. */ - uint8_t bU1DevExitLat; - - /** U2 Device Exit Latency. */ - uint16_t bU2DevExitLat; -}; - -/** \ingroup libusb_desc - * A structure representing the Container ID descriptor. - * This descriptor is documented in section 9.6.2.3 of the USB 3.0 specification. - * All multiple-byte fields, except UUIDs, are represented in host-endian format. - */ -struct libusb_container_id_descriptor { - /** Size of this descriptor (in bytes) */ - uint8_t bLength; - - /** Descriptor type. Will have value - * \ref libusb_descriptor_type::LIBUSB_DT_DEVICE_CAPABILITY - * LIBUSB_DT_DEVICE_CAPABILITY in this context. */ - uint8_t bDescriptorType; - - /** Capability type. Will have value - * \ref libusb_capability_type::LIBUSB_BT_CONTAINER_ID - * LIBUSB_BT_CONTAINER_ID in this context. */ - uint8_t bDevCapabilityType; - - /** Reserved field */ - uint8_t bReserved; - - /** 128 bit UUID */ - uint8_t ContainerID[16]; -}; - -/** \ingroup libusb_asyncio - * Setup packet for control transfers. */ -struct libusb_control_setup { - /** Request type. Bits 0:4 determine recipient, see - * \ref libusb_request_recipient. Bits 5:6 determine type, see - * \ref libusb_request_type. Bit 7 determines data transfer direction, see - * \ref libusb_endpoint_direction. - */ - uint8_t bmRequestType; - - /** Request. If the type bits of bmRequestType are equal to - * \ref libusb_request_type::LIBUSB_REQUEST_TYPE_STANDARD - * "LIBUSB_REQUEST_TYPE_STANDARD" then this field refers to - * \ref libusb_standard_request. For other cases, use of this field is - * application-specific. */ - uint8_t bRequest; - - /** Value. Varies according to request */ - uint16_t wValue; - - /** Index. Varies according to request, typically used to pass an index - * or offset */ - uint16_t wIndex; - - /** Number of bytes to transfer */ - uint16_t wLength; -}; - -#define LIBUSB_CONTROL_SETUP_SIZE (sizeof(struct libusb_control_setup)) - -/* libusb */ - -struct libusb_context; -struct libusb_device; -struct libusb_device_handle; - -/** \ingroup libusb_lib - * Structure providing the version of the libusb runtime - */ -struct libusb_version { - /** Library major version. */ - const uint16_t major; - - /** Library minor version. */ - const uint16_t minor; - - /** Library micro version. */ - const uint16_t micro; - - /** Library nano version. */ - const uint16_t nano; - - /** Library release candidate suffix string, e.g. "-rc4". */ - const char *rc; - - /** For ABI compatibility only. */ - const char* describe; -}; - -/** \ingroup libusb_lib - * Structure representing a libusb session. The concept of individual libusb - * sessions allows for your program to use two libraries (or dynamically - * load two modules) which both independently use libusb. This will prevent - * interference between the individual libusb users - for example - * libusb_set_debug() will not affect the other user of the library, and - * libusb_exit() will not destroy resources that the other user is still - * using. - * - * Sessions are created by libusb_init() and destroyed through libusb_exit(). - * If your application is guaranteed to only ever include a single libusb - * user (i.e. you), you do not have to worry about contexts: pass NULL in - * every function call where a context is required. The default context - * will be used. - * - * For more information, see \ref libusb_contexts. - */ -typedef struct libusb_context libusb_context; - -/** \ingroup libusb_dev - * Structure representing a USB device detected on the system. This is an - * opaque type for which you are only ever provided with a pointer, usually - * originating from libusb_get_device_list(). - * - * Certain operations can be performed on a device, but in order to do any - * I/O you will have to first obtain a device handle using libusb_open(). - * - * Devices are reference counted with libusb_ref_device() and - * libusb_unref_device(), and are freed when the reference count reaches 0. - * New devices presented by libusb_get_device_list() have a reference count of - * 1, and libusb_free_device_list() can optionally decrease the reference count - * on all devices in the list. libusb_open() adds another reference which is - * later destroyed by libusb_close(). - */ -typedef struct libusb_device libusb_device; - - -/** \ingroup libusb_dev - * Structure representing a handle on a USB device. This is an opaque type for - * which you are only ever provided with a pointer, usually originating from - * libusb_open(). - * - * A device handle is used to perform I/O and other operations. When finished - * with a device handle, you should call libusb_close(). - */ -typedef struct libusb_device_handle libusb_device_handle; - -/** \ingroup libusb_dev - * Speed codes. Indicates the speed at which the device is operating. - */ -enum libusb_speed { - /** The OS doesn't report or know the device speed. */ - LIBUSB_SPEED_UNKNOWN = 0, - - /** The device is operating at low speed (1.5MBit/s). */ - LIBUSB_SPEED_LOW = 1, - - /** The device is operating at full speed (12MBit/s). */ - LIBUSB_SPEED_FULL = 2, - - /** The device is operating at high speed (480MBit/s). */ - LIBUSB_SPEED_HIGH = 3, - - /** The device is operating at super speed (5000MBit/s). */ - LIBUSB_SPEED_SUPER = 4, -}; - -/** \ingroup libusb_dev - * Supported speeds (wSpeedSupported) bitfield. Indicates what - * speeds the device supports. - */ -enum libusb_supported_speed { - /** Low speed operation supported (1.5MBit/s). */ - LIBUSB_LOW_SPEED_OPERATION = 1, - - /** Full speed operation supported (12MBit/s). */ - LIBUSB_FULL_SPEED_OPERATION = 2, - - /** High speed operation supported (480MBit/s). */ - LIBUSB_HIGH_SPEED_OPERATION = 4, - - /** Superspeed operation supported (5000MBit/s). */ - LIBUSB_SUPER_SPEED_OPERATION = 8, -}; - -/** \ingroup libusb_dev - * Masks for the bits of the - * \ref libusb_usb_2_0_extension_descriptor::bmAttributes "bmAttributes" field - * of the USB 2.0 Extension descriptor. - */ -enum libusb_usb_2_0_extension_attributes { - /** Supports Link Power Management (LPM) */ - LIBUSB_BM_LPM_SUPPORT = 2, -}; - -/** \ingroup libusb_dev - * Masks for the bits of the - * \ref libusb_ss_usb_device_capability_descriptor::bmAttributes "bmAttributes" field - * field of the SuperSpeed USB Device Capability descriptor. - */ -enum libusb_ss_usb_device_capability_attributes { - /** Supports Latency Tolerance Messages (LTM) */ - LIBUSB_BM_LTM_SUPPORT = 2, -}; - -/** \ingroup libusb_dev - * USB capability types - */ -enum libusb_bos_type { - /** Wireless USB device capability */ - LIBUSB_BT_WIRELESS_USB_DEVICE_CAPABILITY = 1, - - /** USB 2.0 extensions */ - LIBUSB_BT_USB_2_0_EXTENSION = 2, - - /** SuperSpeed USB device capability */ - LIBUSB_BT_SS_USB_DEVICE_CAPABILITY = 3, - - /** Container ID type */ - LIBUSB_BT_CONTAINER_ID = 4, -}; - -/** \ingroup libusb_misc - * Error codes. Most libusb functions return 0 on success or one of these - * codes on failure. - * You can call libusb_error_name() to retrieve a string representation of an - * error code or libusb_strerror() to get an end-user suitable description of - * an error code. - */ -enum libusb_error { - /** Success (no error) */ - LIBUSB_SUCCESS = 0, - - /** Input/output error */ - LIBUSB_ERROR_IO = -1, - - /** Invalid parameter */ - LIBUSB_ERROR_INVALID_PARAM = -2, - - /** Access denied (insufficient permissions) */ - LIBUSB_ERROR_ACCESS = -3, - - /** No such device (it may have been disconnected) */ - LIBUSB_ERROR_NO_DEVICE = -4, - - /** Entity not found */ - LIBUSB_ERROR_NOT_FOUND = -5, - - /** Resource busy */ - LIBUSB_ERROR_BUSY = -6, - - /** Operation timed out */ - LIBUSB_ERROR_TIMEOUT = -7, - - /** Overflow */ - LIBUSB_ERROR_OVERFLOW = -8, - - /** Pipe error */ - LIBUSB_ERROR_PIPE = -9, - - /** System call interrupted (perhaps due to signal) */ - LIBUSB_ERROR_INTERRUPTED = -10, - - /** Insufficient memory */ - LIBUSB_ERROR_NO_MEM = -11, - - /** Operation not supported or unimplemented on this platform */ - LIBUSB_ERROR_NOT_SUPPORTED = -12, - - /* NB: Remember to update LIBUSB_ERROR_COUNT below as well as the - message strings in strerror.c when adding new error codes here. */ - - /** Other error */ - LIBUSB_ERROR_OTHER = -99, -}; - -/* Total number of error codes in enum libusb_error */ -#define LIBUSB_ERROR_COUNT 14 - -/** \ingroup libusb_asyncio - * Transfer status codes */ -enum libusb_transfer_status { - /** Transfer completed without error. Note that this does not indicate - * that the entire amount of requested data was transferred. */ - LIBUSB_TRANSFER_COMPLETED, - - /** Transfer failed */ - LIBUSB_TRANSFER_ERROR, - - /** Transfer timed out */ - LIBUSB_TRANSFER_TIMED_OUT, - - /** Transfer was cancelled */ - LIBUSB_TRANSFER_CANCELLED, - - /** For bulk/interrupt endpoints: halt condition detected (endpoint - * stalled). For control endpoints: control request not supported. */ - LIBUSB_TRANSFER_STALL, - - /** Device was disconnected */ - LIBUSB_TRANSFER_NO_DEVICE, - - /** Device sent more data than requested */ - LIBUSB_TRANSFER_OVERFLOW, - - /* NB! Remember to update libusb_error_name() - when adding new status codes here. */ -}; - -/** \ingroup libusb_asyncio - * libusb_transfer.flags values */ -enum libusb_transfer_flags { - /** Report short frames as errors */ - LIBUSB_TRANSFER_SHORT_NOT_OK = 1<<0, - - /** Automatically free() transfer buffer during libusb_free_transfer(). - * Note that buffers allocated with libusb_dev_mem_alloc() should not - * be attempted freed in this way, since free() is not an appropriate - * way to release such memory. */ - LIBUSB_TRANSFER_FREE_BUFFER = 1<<1, - - /** Automatically call libusb_free_transfer() after callback returns. - * If this flag is set, it is illegal to call libusb_free_transfer() - * from your transfer callback, as this will result in a double-free - * when this flag is acted upon. */ - LIBUSB_TRANSFER_FREE_TRANSFER = 1<<2, - - /** Terminate transfers that are a multiple of the endpoint's - * wMaxPacketSize with an extra zero length packet. This is useful - * when a device protocol mandates that each logical request is - * terminated by an incomplete packet (i.e. the logical requests are - * not separated by other means). - * - * This flag only affects host-to-device transfers to bulk and interrupt - * endpoints. In other situations, it is ignored. - * - * This flag only affects transfers with a length that is a multiple of - * the endpoint's wMaxPacketSize. On transfers of other lengths, this - * flag has no effect. Therefore, if you are working with a device that - * needs a ZLP whenever the end of the logical request falls on a packet - * boundary, then it is sensible to set this flag on every - * transfer (you do not have to worry about only setting it on transfers - * that end on the boundary). - * - * This flag is currently only supported on Linux. - * On other systems, libusb_submit_transfer() will return - * LIBUSB_ERROR_NOT_SUPPORTED for every transfer where this flag is set. - * - * Available since libusb-1.0.9. - */ - LIBUSB_TRANSFER_ADD_ZERO_PACKET = 1 << 3, -}; - -/** \ingroup libusb_asyncio - * Isochronous packet descriptor. */ -struct libusb_iso_packet_descriptor { - /** Length of data to request in this packet */ - unsigned int length; - - /** Amount of data that was actually transferred */ - unsigned int actual_length; - - /** Status code for this packet */ - enum libusb_transfer_status status; -}; - -struct libusb_transfer; - -/** \ingroup libusb_asyncio - * Asynchronous transfer callback function type. When submitting asynchronous - * transfers, you pass a pointer to a callback function of this type via the - * \ref libusb_transfer::callback "callback" member of the libusb_transfer - * structure. libusb will call this function later, when the transfer has - * completed or failed. See \ref libusb_asyncio for more information. - * \param transfer The libusb_transfer struct the callback function is being - * notified about. - */ -typedef void (LIBUSB_CALL *libusb_transfer_cb_fn)(struct libusb_transfer *transfer); - -/** \ingroup libusb_asyncio - * The generic USB transfer structure. The user populates this structure and - * then submits it in order to request a transfer. After the transfer has - * completed, the library populates the transfer with the results and passes - * it back to the user. - */ -struct libusb_transfer { - /** Handle of the device that this transfer will be submitted to */ - libusb_device_handle *dev_handle; - - /** A bitwise OR combination of \ref libusb_transfer_flags. */ - uint8_t flags; - - /** Address of the endpoint where this transfer will be sent. */ - unsigned char endpoint; - - /** Type of the endpoint from \ref libusb_transfer_type */ - unsigned char type; - - /** Timeout for this transfer in milliseconds. A value of 0 indicates no - * timeout. */ - unsigned int timeout; - - /** The status of the transfer. Read-only, and only for use within - * transfer callback function. - * - * If this is an isochronous transfer, this field may read COMPLETED even - * if there were errors in the frames. Use the - * \ref libusb_iso_packet_descriptor::status "status" field in each packet - * to determine if errors occurred. */ - enum libusb_transfer_status status; - - /** Length of the data buffer */ - int length; - - /** Actual length of data that was transferred. Read-only, and only for - * use within transfer callback function. Not valid for isochronous - * endpoint transfers. */ - int actual_length; - - /** Callback function. This will be invoked when the transfer completes, - * fails, or is cancelled. */ - libusb_transfer_cb_fn callback; - - /** User context data to pass to the callback function. */ - void *user_data; - - /** Data buffer */ - unsigned char *buffer; - - /** Number of isochronous packets. Only used for I/O with isochronous - * endpoints. */ - int num_iso_packets; - - /** Isochronous packet descriptors, for isochronous transfers only. */ - struct libusb_iso_packet_descriptor iso_packet_desc -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - [] /* valid C99 code */ -#else - [0] /* non-standard, but usually working code */ -#endif - ; -}; - -/** \ingroup libusb_misc - * Capabilities supported by an instance of libusb on the current running - * platform. Test if the loaded library supports a given capability by calling - * \ref libusb_has_capability(). - */ -enum libusb_capability { - /** The libusb_has_capability() API is available. */ - LIBUSB_CAP_HAS_CAPABILITY = 0x0000, - /** Hotplug support is available on this platform. */ - LIBUSB_CAP_HAS_HOTPLUG = 0x0001, - /** The library can access HID devices without requiring user intervention. - * Note that before being able to actually access an HID device, you may - * still have to call additional libusb functions such as - * \ref libusb_detach_kernel_driver(). */ - LIBUSB_CAP_HAS_HID_ACCESS = 0x0100, - /** The library supports detaching of the default USB driver, using - * \ref libusb_detach_kernel_driver(), if one is set by the OS kernel */ - LIBUSB_CAP_SUPPORTS_DETACH_KERNEL_DRIVER = 0x0101 -}; - -/** \ingroup libusb_lib - * Log message levels. - * - LIBUSB_LOG_LEVEL_NONE (0) : no messages ever printed by the library (default) - * - LIBUSB_LOG_LEVEL_ERROR (1) : error messages are printed to stderr - * - LIBUSB_LOG_LEVEL_WARNING (2) : warning and error messages are printed to stderr - * - LIBUSB_LOG_LEVEL_INFO (3) : informational messages are printed to stdout, warning - * and error messages are printed to stderr - * - LIBUSB_LOG_LEVEL_DEBUG (4) : debug and informational messages are printed to stdout, - * warnings and errors to stderr - */ -enum libusb_log_level { - LIBUSB_LOG_LEVEL_NONE = 0, - LIBUSB_LOG_LEVEL_ERROR, - LIBUSB_LOG_LEVEL_WARNING, - LIBUSB_LOG_LEVEL_INFO, - LIBUSB_LOG_LEVEL_DEBUG, -}; - -int LIBUSB_CALL libusb_init(libusb_context **ctx); -void LIBUSB_CALL libusb_exit(libusb_context *ctx); -void LIBUSB_CALL libusb_set_debug(libusb_context *ctx, int level); -const struct libusb_version * LIBUSB_CALL libusb_get_version(void); -int LIBUSB_CALL libusb_has_capability(uint32_t capability); -const char * LIBUSB_CALL libusb_error_name(int errcode); -int LIBUSB_CALL libusb_setlocale(const char *locale); -const char * LIBUSB_CALL libusb_strerror(enum libusb_error errcode); - -ssize_t LIBUSB_CALL libusb_get_device_list(libusb_context *ctx, - libusb_device ***list); -void LIBUSB_CALL libusb_free_device_list(libusb_device **list, - int unref_devices); -libusb_device * LIBUSB_CALL libusb_ref_device(libusb_device *dev); -void LIBUSB_CALL libusb_unref_device(libusb_device *dev); - -int LIBUSB_CALL libusb_get_configuration(libusb_device_handle *dev, - int *config); -int LIBUSB_CALL libusb_get_device_descriptor(libusb_device *dev, - struct libusb_device_descriptor *desc); -int LIBUSB_CALL libusb_get_active_config_descriptor(libusb_device *dev, - struct libusb_config_descriptor **config); -int LIBUSB_CALL libusb_get_config_descriptor(libusb_device *dev, - uint8_t config_index, struct libusb_config_descriptor **config); -int LIBUSB_CALL libusb_get_config_descriptor_by_value(libusb_device *dev, - uint8_t bConfigurationValue, struct libusb_config_descriptor **config); -void LIBUSB_CALL libusb_free_config_descriptor( - struct libusb_config_descriptor *config); -int LIBUSB_CALL libusb_get_ss_endpoint_companion_descriptor( - struct libusb_context *ctx, - const struct libusb_endpoint_descriptor *endpoint, - struct libusb_ss_endpoint_companion_descriptor **ep_comp); -void LIBUSB_CALL libusb_free_ss_endpoint_companion_descriptor( - struct libusb_ss_endpoint_companion_descriptor *ep_comp); -int LIBUSB_CALL libusb_get_bos_descriptor(libusb_device_handle *dev_handle, - struct libusb_bos_descriptor **bos); -void LIBUSB_CALL libusb_free_bos_descriptor(struct libusb_bos_descriptor *bos); -int LIBUSB_CALL libusb_get_usb_2_0_extension_descriptor( - struct libusb_context *ctx, - struct libusb_bos_dev_capability_descriptor *dev_cap, - struct libusb_usb_2_0_extension_descriptor **usb_2_0_extension); -void LIBUSB_CALL libusb_free_usb_2_0_extension_descriptor( - struct libusb_usb_2_0_extension_descriptor *usb_2_0_extension); -int LIBUSB_CALL libusb_get_ss_usb_device_capability_descriptor( - struct libusb_context *ctx, - struct libusb_bos_dev_capability_descriptor *dev_cap, - struct libusb_ss_usb_device_capability_descriptor **ss_usb_device_cap); -void LIBUSB_CALL libusb_free_ss_usb_device_capability_descriptor( - struct libusb_ss_usb_device_capability_descriptor *ss_usb_device_cap); -int LIBUSB_CALL libusb_get_container_id_descriptor(struct libusb_context *ctx, - struct libusb_bos_dev_capability_descriptor *dev_cap, - struct libusb_container_id_descriptor **container_id); -void LIBUSB_CALL libusb_free_container_id_descriptor( - struct libusb_container_id_descriptor *container_id); -uint8_t LIBUSB_CALL libusb_get_bus_number(libusb_device *dev); -uint8_t LIBUSB_CALL libusb_get_port_number(libusb_device *dev); -int LIBUSB_CALL libusb_get_port_numbers(libusb_device *dev, uint8_t* port_numbers, int port_numbers_len); -LIBUSB_DEPRECATED_FOR(libusb_get_port_numbers) -int LIBUSB_CALL libusb_get_port_path(libusb_context *ctx, libusb_device *dev, uint8_t* path, uint8_t path_length); -libusb_device * LIBUSB_CALL libusb_get_parent(libusb_device *dev); -uint8_t LIBUSB_CALL libusb_get_device_address(libusb_device *dev); -int LIBUSB_CALL libusb_get_device_speed(libusb_device *dev); -int LIBUSB_CALL libusb_get_max_packet_size(libusb_device *dev, - unsigned char endpoint); -int LIBUSB_CALL libusb_get_max_iso_packet_size(libusb_device *dev, - unsigned char endpoint); - -int LIBUSB_CALL libusb_open(libusb_device *dev, libusb_device_handle **dev_handle); -void LIBUSB_CALL libusb_close(libusb_device_handle *dev_handle); -libusb_device * LIBUSB_CALL libusb_get_device(libusb_device_handle *dev_handle); - -int LIBUSB_CALL libusb_set_configuration(libusb_device_handle *dev_handle, - int configuration); -int LIBUSB_CALL libusb_claim_interface(libusb_device_handle *dev_handle, - int interface_number); -int LIBUSB_CALL libusb_release_interface(libusb_device_handle *dev_handle, - int interface_number); - -libusb_device_handle * LIBUSB_CALL libusb_open_device_with_vid_pid( - libusb_context *ctx, uint16_t vendor_id, uint16_t product_id); - -int LIBUSB_CALL libusb_set_interface_alt_setting(libusb_device_handle *dev_handle, - int interface_number, int alternate_setting); -int LIBUSB_CALL libusb_clear_halt(libusb_device_handle *dev_handle, - unsigned char endpoint); -int LIBUSB_CALL libusb_reset_device(libusb_device_handle *dev_handle); - -int LIBUSB_CALL libusb_alloc_streams(libusb_device_handle *dev_handle, - uint32_t num_streams, unsigned char *endpoints, int num_endpoints); -int LIBUSB_CALL libusb_free_streams(libusb_device_handle *dev_handle, - unsigned char *endpoints, int num_endpoints); - -unsigned char * LIBUSB_CALL libusb_dev_mem_alloc(libusb_device_handle *dev_handle, - size_t length); -int LIBUSB_CALL libusb_dev_mem_free(libusb_device_handle *dev_handle, - unsigned char *buffer, size_t length); - -int LIBUSB_CALL libusb_kernel_driver_active(libusb_device_handle *dev_handle, - int interface_number); -int LIBUSB_CALL libusb_detach_kernel_driver(libusb_device_handle *dev_handle, - int interface_number); -int LIBUSB_CALL libusb_attach_kernel_driver(libusb_device_handle *dev_handle, - int interface_number); -int LIBUSB_CALL libusb_set_auto_detach_kernel_driver( - libusb_device_handle *dev_handle, int enable); - -/* async I/O */ - -/** \ingroup libusb_asyncio - * Get the data section of a control transfer. This convenience function is here - * to remind you that the data does not start until 8 bytes into the actual - * buffer, as the setup packet comes first. - * - * Calling this function only makes sense from a transfer callback function, - * or situations where you have already allocated a suitably sized buffer at - * transfer->buffer. - * - * \param transfer a transfer - * \returns pointer to the first byte of the data section - */ -static inline unsigned char *libusb_control_transfer_get_data( - struct libusb_transfer *transfer) -{ - return transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; -} - -/** \ingroup libusb_asyncio - * Get the control setup packet of a control transfer. This convenience - * function is here to remind you that the control setup occupies the first - * 8 bytes of the transfer data buffer. - * - * Calling this function only makes sense from a transfer callback function, - * or situations where you have already allocated a suitably sized buffer at - * transfer->buffer. - * - * \param transfer a transfer - * \returns a casted pointer to the start of the transfer data buffer - */ -static inline struct libusb_control_setup *libusb_control_transfer_get_setup( - struct libusb_transfer *transfer) -{ - return (struct libusb_control_setup *)(void *) transfer->buffer; -} - -/** \ingroup libusb_asyncio - * Helper function to populate the setup packet (first 8 bytes of the data - * buffer) for a control transfer. The wIndex, wValue and wLength values should - * be given in host-endian byte order. - * - * \param buffer buffer to output the setup packet into - * This pointer must be aligned to at least 2 bytes boundary. - * \param bmRequestType see the - * \ref libusb_control_setup::bmRequestType "bmRequestType" field of - * \ref libusb_control_setup - * \param bRequest see the - * \ref libusb_control_setup::bRequest "bRequest" field of - * \ref libusb_control_setup - * \param wValue see the - * \ref libusb_control_setup::wValue "wValue" field of - * \ref libusb_control_setup - * \param wIndex see the - * \ref libusb_control_setup::wIndex "wIndex" field of - * \ref libusb_control_setup - * \param wLength see the - * \ref libusb_control_setup::wLength "wLength" field of - * \ref libusb_control_setup - */ -static inline void libusb_fill_control_setup(unsigned char *buffer, - uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, - uint16_t wLength) -{ - struct libusb_control_setup *setup = (struct libusb_control_setup *)(void *) buffer; - setup->bmRequestType = bmRequestType; - setup->bRequest = bRequest; - setup->wValue = libusb_cpu_to_le16(wValue); - setup->wIndex = libusb_cpu_to_le16(wIndex); - setup->wLength = libusb_cpu_to_le16(wLength); -} - -struct libusb_transfer * LIBUSB_CALL libusb_alloc_transfer(int iso_packets); -int LIBUSB_CALL libusb_submit_transfer(struct libusb_transfer *transfer); -int LIBUSB_CALL libusb_cancel_transfer(struct libusb_transfer *transfer); -void LIBUSB_CALL libusb_free_transfer(struct libusb_transfer *transfer); -void LIBUSB_CALL libusb_transfer_set_stream_id( - struct libusb_transfer *transfer, uint32_t stream_id); -uint32_t LIBUSB_CALL libusb_transfer_get_stream_id( - struct libusb_transfer *transfer); - -/** \ingroup libusb_asyncio - * Helper function to populate the required \ref libusb_transfer fields - * for a control transfer. - * - * If you pass a transfer buffer to this function, the first 8 bytes will - * be interpreted as a control setup packet, and the wLength field will be - * used to automatically populate the \ref libusb_transfer::length "length" - * field of the transfer. Therefore the recommended approach is: - * -# Allocate a suitably sized data buffer (including space for control setup) - * -# Call libusb_fill_control_setup() - * -# If this is a host-to-device transfer with a data stage, put the data - * in place after the setup packet - * -# Call this function - * -# Call libusb_submit_transfer() - * - * It is also legal to pass a NULL buffer to this function, in which case this - * function will not attempt to populate the length field. Remember that you - * must then populate the buffer and length fields later. - * - * \param transfer the transfer to populate - * \param dev_handle handle of the device that will handle the transfer - * \param buffer data buffer. If provided, this function will interpret the - * first 8 bytes as a setup packet and infer the transfer length from that. - * This pointer must be aligned to at least 2 bytes boundary. - * \param callback callback function to be invoked on transfer completion - * \param user_data user data to pass to callback function - * \param timeout timeout for the transfer in milliseconds - */ -static inline void libusb_fill_control_transfer( - struct libusb_transfer *transfer, libusb_device_handle *dev_handle, - unsigned char *buffer, libusb_transfer_cb_fn callback, void *user_data, - unsigned int timeout) -{ - struct libusb_control_setup *setup = (struct libusb_control_setup *)(void *) buffer; - transfer->dev_handle = dev_handle; - transfer->endpoint = 0; - transfer->type = LIBUSB_TRANSFER_TYPE_CONTROL; - transfer->timeout = timeout; - transfer->buffer = buffer; - if (setup) - transfer->length = (int) (LIBUSB_CONTROL_SETUP_SIZE - + libusb_le16_to_cpu(setup->wLength)); - transfer->user_data = user_data; - transfer->callback = callback; -} - -/** \ingroup libusb_asyncio - * Helper function to populate the required \ref libusb_transfer fields - * for a bulk transfer. - * - * \param transfer the transfer to populate - * \param dev_handle handle of the device that will handle the transfer - * \param endpoint address of the endpoint where this transfer will be sent - * \param buffer data buffer - * \param length length of data buffer - * \param callback callback function to be invoked on transfer completion - * \param user_data user data to pass to callback function - * \param timeout timeout for the transfer in milliseconds - */ -static inline void libusb_fill_bulk_transfer(struct libusb_transfer *transfer, - libusb_device_handle *dev_handle, unsigned char endpoint, - unsigned char *buffer, int length, libusb_transfer_cb_fn callback, - void *user_data, unsigned int timeout) -{ - transfer->dev_handle = dev_handle; - transfer->endpoint = endpoint; - transfer->type = LIBUSB_TRANSFER_TYPE_BULK; - transfer->timeout = timeout; - transfer->buffer = buffer; - transfer->length = length; - transfer->user_data = user_data; - transfer->callback = callback; -} - -/** \ingroup libusb_asyncio - * Helper function to populate the required \ref libusb_transfer fields - * for a bulk transfer using bulk streams. - * - * Since version 1.0.19, \ref LIBUSB_API_VERSION >= 0x01000103 - * - * \param transfer the transfer to populate - * \param dev_handle handle of the device that will handle the transfer - * \param endpoint address of the endpoint where this transfer will be sent - * \param stream_id bulk stream id for this transfer - * \param buffer data buffer - * \param length length of data buffer - * \param callback callback function to be invoked on transfer completion - * \param user_data user data to pass to callback function - * \param timeout timeout for the transfer in milliseconds - */ -static inline void libusb_fill_bulk_stream_transfer( - struct libusb_transfer *transfer, libusb_device_handle *dev_handle, - unsigned char endpoint, uint32_t stream_id, - unsigned char *buffer, int length, libusb_transfer_cb_fn callback, - void *user_data, unsigned int timeout) -{ - libusb_fill_bulk_transfer(transfer, dev_handle, endpoint, buffer, - length, callback, user_data, timeout); - transfer->type = LIBUSB_TRANSFER_TYPE_BULK_STREAM; - libusb_transfer_set_stream_id(transfer, stream_id); -} - -/** \ingroup libusb_asyncio - * Helper function to populate the required \ref libusb_transfer fields - * for an interrupt transfer. - * - * \param transfer the transfer to populate - * \param dev_handle handle of the device that will handle the transfer - * \param endpoint address of the endpoint where this transfer will be sent - * \param buffer data buffer - * \param length length of data buffer - * \param callback callback function to be invoked on transfer completion - * \param user_data user data to pass to callback function - * \param timeout timeout for the transfer in milliseconds - */ -static inline void libusb_fill_interrupt_transfer( - struct libusb_transfer *transfer, libusb_device_handle *dev_handle, - unsigned char endpoint, unsigned char *buffer, int length, - libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) -{ - transfer->dev_handle = dev_handle; - transfer->endpoint = endpoint; - transfer->type = LIBUSB_TRANSFER_TYPE_INTERRUPT; - transfer->timeout = timeout; - transfer->buffer = buffer; - transfer->length = length; - transfer->user_data = user_data; - transfer->callback = callback; -} - -/** \ingroup libusb_asyncio - * Helper function to populate the required \ref libusb_transfer fields - * for an isochronous transfer. - * - * \param transfer the transfer to populate - * \param dev_handle handle of the device that will handle the transfer - * \param endpoint address of the endpoint where this transfer will be sent - * \param buffer data buffer - * \param length length of data buffer - * \param num_iso_packets the number of isochronous packets - * \param callback callback function to be invoked on transfer completion - * \param user_data user data to pass to callback function - * \param timeout timeout for the transfer in milliseconds - */ -static inline void libusb_fill_iso_transfer(struct libusb_transfer *transfer, - libusb_device_handle *dev_handle, unsigned char endpoint, - unsigned char *buffer, int length, int num_iso_packets, - libusb_transfer_cb_fn callback, void *user_data, unsigned int timeout) -{ - transfer->dev_handle = dev_handle; - transfer->endpoint = endpoint; - transfer->type = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS; - transfer->timeout = timeout; - transfer->buffer = buffer; - transfer->length = length; - transfer->num_iso_packets = num_iso_packets; - transfer->user_data = user_data; - transfer->callback = callback; -} - -/** \ingroup libusb_asyncio - * Convenience function to set the length of all packets in an isochronous - * transfer, based on the num_iso_packets field in the transfer structure. - * - * \param transfer a transfer - * \param length the length to set in each isochronous packet descriptor - * \see libusb_get_max_packet_size() - */ -static inline void libusb_set_iso_packet_lengths( - struct libusb_transfer *transfer, unsigned int length) -{ - int i; - for (i = 0; i < transfer->num_iso_packets; i++) - transfer->iso_packet_desc[i].length = length; -} - -/** \ingroup libusb_asyncio - * Convenience function to locate the position of an isochronous packet - * within the buffer of an isochronous transfer. - * - * This is a thorough function which loops through all preceding packets, - * accumulating their lengths to find the position of the specified packet. - * Typically you will assign equal lengths to each packet in the transfer, - * and hence the above method is sub-optimal. You may wish to use - * libusb_get_iso_packet_buffer_simple() instead. - * - * \param transfer a transfer - * \param packet the packet to return the address of - * \returns the base address of the packet buffer inside the transfer buffer, - * or NULL if the packet does not exist. - * \see libusb_get_iso_packet_buffer_simple() - */ -static inline unsigned char *libusb_get_iso_packet_buffer( - struct libusb_transfer *transfer, unsigned int packet) -{ - int i; - size_t offset = 0; - int _packet; - - /* oops..slight bug in the API. packet is an unsigned int, but we use - * signed integers almost everywhere else. range-check and convert to - * signed to avoid compiler warnings. FIXME for libusb-2. */ - if (packet > INT_MAX) - return NULL; - _packet = (int) packet; - - if (_packet >= transfer->num_iso_packets) - return NULL; - - for (i = 0; i < _packet; i++) - offset += transfer->iso_packet_desc[i].length; - - return transfer->buffer + offset; -} - -/** \ingroup libusb_asyncio - * Convenience function to locate the position of an isochronous packet - * within the buffer of an isochronous transfer, for transfers where each - * packet is of identical size. - * - * This function relies on the assumption that every packet within the transfer - * is of identical size to the first packet. Calculating the location of - * the packet buffer is then just a simple calculation: - * buffer + (packet_size * packet) - * - * Do not use this function on transfers other than those that have identical - * packet lengths for each packet. - * - * \param transfer a transfer - * \param packet the packet to return the address of - * \returns the base address of the packet buffer inside the transfer buffer, - * or NULL if the packet does not exist. - * \see libusb_get_iso_packet_buffer() - */ -static inline unsigned char *libusb_get_iso_packet_buffer_simple( - struct libusb_transfer *transfer, unsigned int packet) -{ - int _packet; - - /* oops..slight bug in the API. packet is an unsigned int, but we use - * signed integers almost everywhere else. range-check and convert to - * signed to avoid compiler warnings. FIXME for libusb-2. */ - if (packet > INT_MAX) - return NULL; - _packet = (int) packet; - - if (_packet >= transfer->num_iso_packets) - return NULL; - - return transfer->buffer + ((int) transfer->iso_packet_desc[0].length * _packet); -} - -/* sync I/O */ - -int LIBUSB_CALL libusb_control_transfer(libusb_device_handle *dev_handle, - uint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, - unsigned char *data, uint16_t wLength, unsigned int timeout); - -int LIBUSB_CALL libusb_bulk_transfer(libusb_device_handle *dev_handle, - unsigned char endpoint, unsigned char *data, int length, - int *actual_length, unsigned int timeout); - -int LIBUSB_CALL libusb_interrupt_transfer(libusb_device_handle *dev_handle, - unsigned char endpoint, unsigned char *data, int length, - int *actual_length, unsigned int timeout); - -/** \ingroup libusb_desc - * Retrieve a descriptor from the default control pipe. - * This is a convenience function which formulates the appropriate control - * message to retrieve the descriptor. - * - * \param dev_handle a device handle - * \param desc_type the descriptor type, see \ref libusb_descriptor_type - * \param desc_index the index of the descriptor to retrieve - * \param data output buffer for descriptor - * \param length size of data buffer - * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure - */ -static inline int libusb_get_descriptor(libusb_device_handle *dev_handle, - uint8_t desc_type, uint8_t desc_index, unsigned char *data, int length) -{ - return libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_IN, - LIBUSB_REQUEST_GET_DESCRIPTOR, (uint16_t) ((desc_type << 8) | desc_index), - 0, data, (uint16_t) length, 1000); -} - -/** \ingroup libusb_desc - * Retrieve a descriptor from a device. - * This is a convenience function which formulates the appropriate control - * message to retrieve the descriptor. The string returned is Unicode, as - * detailed in the USB specifications. - * - * \param dev_handle a device handle - * \param desc_index the index of the descriptor to retrieve - * \param langid the language ID for the string descriptor - * \param data output buffer for descriptor - * \param length size of data buffer - * \returns number of bytes returned in data, or LIBUSB_ERROR code on failure - * \see libusb_get_string_descriptor_ascii() - */ -static inline int libusb_get_string_descriptor(libusb_device_handle *dev_handle, - uint8_t desc_index, uint16_t langid, unsigned char *data, int length) -{ - return libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_IN, - LIBUSB_REQUEST_GET_DESCRIPTOR, (uint16_t)((LIBUSB_DT_STRING << 8) | desc_index), - langid, data, (uint16_t) length, 1000); -} - -int LIBUSB_CALL libusb_get_string_descriptor_ascii(libusb_device_handle *dev_handle, - uint8_t desc_index, unsigned char *data, int length); - -/* polling and timeouts */ - -int LIBUSB_CALL libusb_try_lock_events(libusb_context *ctx); -void LIBUSB_CALL libusb_lock_events(libusb_context *ctx); -void LIBUSB_CALL libusb_unlock_events(libusb_context *ctx); -int LIBUSB_CALL libusb_event_handling_ok(libusb_context *ctx); -int LIBUSB_CALL libusb_event_handler_active(libusb_context *ctx); -void LIBUSB_CALL libusb_interrupt_event_handler(libusb_context *ctx); -void LIBUSB_CALL libusb_lock_event_waiters(libusb_context *ctx); -void LIBUSB_CALL libusb_unlock_event_waiters(libusb_context *ctx); -int LIBUSB_CALL libusb_wait_for_event(libusb_context *ctx, struct timeval *tv); - -int LIBUSB_CALL libusb_handle_events_timeout(libusb_context *ctx, - struct timeval *tv); -int LIBUSB_CALL libusb_handle_events_timeout_completed(libusb_context *ctx, - struct timeval *tv, int *completed); -int LIBUSB_CALL libusb_handle_events(libusb_context *ctx); -int LIBUSB_CALL libusb_handle_events_completed(libusb_context *ctx, int *completed); -int LIBUSB_CALL libusb_handle_events_locked(libusb_context *ctx, - struct timeval *tv); -int LIBUSB_CALL libusb_pollfds_handle_timeouts(libusb_context *ctx); -int LIBUSB_CALL libusb_get_next_timeout(libusb_context *ctx, - struct timeval *tv); - -/** \ingroup libusb_poll - * File descriptor for polling - */ -struct libusb_pollfd { - /** Numeric file descriptor */ - int fd; - - /** Event flags to poll for from . POLLIN indicates that you - * should monitor this file descriptor for becoming ready to read from, - * and POLLOUT indicates that you should monitor this file descriptor for - * nonblocking write readiness. */ - short events; -}; - -/** \ingroup libusb_poll - * Callback function, invoked when a new file descriptor should be added - * to the set of file descriptors monitored for events. - * \param fd the new file descriptor - * \param events events to monitor for, see \ref libusb_pollfd for a - * description - * \param user_data User data pointer specified in - * libusb_set_pollfd_notifiers() call - * \see libusb_set_pollfd_notifiers() - */ -typedef void (LIBUSB_CALL *libusb_pollfd_added_cb)(int fd, short events, - void *user_data); - -/** \ingroup libusb_poll - * Callback function, invoked when a file descriptor should be removed from - * the set of file descriptors being monitored for events. After returning - * from this callback, do not use that file descriptor again. - * \param fd the file descriptor to stop monitoring - * \param user_data User data pointer specified in - * libusb_set_pollfd_notifiers() call - * \see libusb_set_pollfd_notifiers() - */ -typedef void (LIBUSB_CALL *libusb_pollfd_removed_cb)(int fd, void *user_data); - -const struct libusb_pollfd ** LIBUSB_CALL libusb_get_pollfds( - libusb_context *ctx); -void LIBUSB_CALL libusb_free_pollfds(const struct libusb_pollfd **pollfds); -void LIBUSB_CALL libusb_set_pollfd_notifiers(libusb_context *ctx, - libusb_pollfd_added_cb added_cb, libusb_pollfd_removed_cb removed_cb, - void *user_data); - -/** \ingroup libusb_hotplug - * Callback handle. - * - * Callbacks handles are generated by libusb_hotplug_register_callback() - * and can be used to deregister callbacks. Callback handles are unique - * per libusb_context and it is safe to call libusb_hotplug_deregister_callback() - * on an already deregisted callback. - * - * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 - * - * For more information, see \ref libusb_hotplug. - */ -typedef int libusb_hotplug_callback_handle; - -/** \ingroup libusb_hotplug - * - * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 - * - * Flags for hotplug events */ -typedef enum { - /** Default value when not using any flags. */ - LIBUSB_HOTPLUG_NO_FLAGS = 0, - - /** Arm the callback and fire it for all matching currently attached devices. */ - LIBUSB_HOTPLUG_ENUMERATE = 1<<0, -} libusb_hotplug_flag; - -/** \ingroup libusb_hotplug - * - * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 - * - * Hotplug events */ -typedef enum { - /** A device has been plugged in and is ready to use */ - LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED = 0x01, - - /** A device has left and is no longer available. - * It is the user's responsibility to call libusb_close on any handle associated with a disconnected device. - * It is safe to call libusb_get_device_descriptor on a device that has left */ - LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT = 0x02, -} libusb_hotplug_event; - -/** \ingroup libusb_hotplug - * Wildcard matching for hotplug events */ -#define LIBUSB_HOTPLUG_MATCH_ANY -1 - -/** \ingroup libusb_hotplug - * Hotplug callback function type. When requesting hotplug event notifications, - * you pass a pointer to a callback function of this type. - * - * This callback may be called by an internal event thread and as such it is - * recommended the callback do minimal processing before returning. - * - * libusb will call this function later, when a matching event had happened on - * a matching device. See \ref libusb_hotplug for more information. - * - * It is safe to call either libusb_hotplug_register_callback() or - * libusb_hotplug_deregister_callback() from within a callback function. - * - * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 - * - * \param ctx context of this notification - * \param device libusb_device this event occurred on - * \param event event that occurred - * \param user_data user data provided when this callback was registered - * \returns bool whether this callback is finished processing events. - * returning 1 will cause this callback to be deregistered - */ -typedef int (LIBUSB_CALL *libusb_hotplug_callback_fn)(libusb_context *ctx, - libusb_device *device, - libusb_hotplug_event event, - void *user_data); - -/** \ingroup libusb_hotplug - * Register a hotplug callback function - * - * Register a callback with the libusb_context. The callback will fire - * when a matching event occurs on a matching device. The callback is - * armed until either it is deregistered with libusb_hotplug_deregister_callback() - * or the supplied callback returns 1 to indicate it is finished processing events. - * - * If the \ref LIBUSB_HOTPLUG_ENUMERATE is passed the callback will be - * called with a \ref LIBUSB_HOTPLUG_EVENT_DEVICE_ARRIVED for all devices - * already plugged into the machine. Note that libusb modifies its internal - * device list from a separate thread, while calling hotplug callbacks from - * libusb_handle_events(), so it is possible for a device to already be present - * on, or removed from, its internal device list, while the hotplug callbacks - * still need to be dispatched. This means that when using \ref - * LIBUSB_HOTPLUG_ENUMERATE, your callback may be called twice for the arrival - * of the same device, once from libusb_hotplug_register_callback() and once - * from libusb_handle_events(); and/or your callback may be called for the - * removal of a device for which an arrived call was never made. - * - * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 - * - * \param[in] ctx context to register this callback with - * \param[in] events bitwise or of events that will trigger this callback. See \ref - * libusb_hotplug_event - * \param[in] flags hotplug callback flags. See \ref libusb_hotplug_flag - * \param[in] vendor_id the vendor id to match or \ref LIBUSB_HOTPLUG_MATCH_ANY - * \param[in] product_id the product id to match or \ref LIBUSB_HOTPLUG_MATCH_ANY - * \param[in] dev_class the device class to match or \ref LIBUSB_HOTPLUG_MATCH_ANY - * \param[in] cb_fn the function to be invoked on a matching event/device - * \param[in] user_data user data to pass to the callback function - * \param[out] callback_handle pointer to store the handle of the allocated callback (can be NULL) - * \returns LIBUSB_SUCCESS on success LIBUSB_ERROR code on failure - */ -int LIBUSB_CALL libusb_hotplug_register_callback(libusb_context *ctx, - libusb_hotplug_event events, - libusb_hotplug_flag flags, - int vendor_id, int product_id, - int dev_class, - libusb_hotplug_callback_fn cb_fn, - void *user_data, - libusb_hotplug_callback_handle *callback_handle); - -/** \ingroup libusb_hotplug - * Deregisters a hotplug callback. - * - * Deregister a callback from a libusb_context. This function is safe to call from within - * a hotplug callback. - * - * Since version 1.0.16, \ref LIBUSB_API_VERSION >= 0x01000102 - * - * \param[in] ctx context this callback is registered with - * \param[in] callback_handle the handle of the callback to deregister - */ -void LIBUSB_CALL libusb_hotplug_deregister_callback(libusb_context *ctx, - libusb_hotplug_callback_handle callback_handle); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/libusbi.h b/vendor/github.com/karalabe/hid/libusb/libusb/libusbi.h deleted file mode 100644 index 752e3988787b..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/libusbi.h +++ /dev/null @@ -1,1149 +0,0 @@ -/* - * Internal header for libusb - * Copyright © 2007-2009 Daniel Drake - * Copyright © 2001 Johannes Erdfelt - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef LIBUSBI_H -#define LIBUSBI_H - -#include - -#include - -#include -#include -#include -#include -#ifdef HAVE_POLL_H -#include -#endif -#ifdef HAVE_MISSING_H -#include -#endif - -#include "libusb.h" -#include "version.h" - -/* Inside the libusb code, mark all public functions as follows: - * return_type API_EXPORTED function_name(params) { ... } - * But if the function returns a pointer, mark it as follows: - * DEFAULT_VISIBILITY return_type * LIBUSB_CALL function_name(params) { ... } - * In the libusb public header, mark all declarations as: - * return_type LIBUSB_CALL function_name(params); - */ -#define API_EXPORTED LIBUSB_CALL DEFAULT_VISIBILITY - -#ifdef __cplusplus -extern "C" { -#endif - -#define DEVICE_DESC_LENGTH 18 - -#define USB_MAXENDPOINTS 32 -#define USB_MAXINTERFACES 32 -#define USB_MAXCONFIG 8 - -/* Backend specific capabilities */ -#define USBI_CAP_HAS_HID_ACCESS 0x00010000 -#define USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER 0x00020000 - -/* Maximum number of bytes in a log line */ -#define USBI_MAX_LOG_LEN 1024 -/* Terminator for log lines */ -#define USBI_LOG_LINE_END "\n" - -/* The following is used to silence warnings for unused variables */ -#define UNUSED(var) do { (void)(var); } while(0) - -#if !defined(ARRAYSIZE) -#define ARRAYSIZE(array) (sizeof(array) / sizeof(array[0])) -#endif - -struct list_head { - struct list_head *prev, *next; -}; - -/* Get an entry from the list - * ptr - the address of this list_head element in "type" - * type - the data type that contains "member" - * member - the list_head element in "type" - */ -#define list_entry(ptr, type, member) \ - ((type *)((uintptr_t)(ptr) - (uintptr_t)offsetof(type, member))) - -#define list_first_entry(ptr, type, member) \ - list_entry((ptr)->next, type, member) - -/* Get each entry from a list - * pos - A structure pointer has a "member" element - * head - list head - * member - the list_head element in "pos" - * type - the type of the first parameter - */ -#define list_for_each_entry(pos, head, member, type) \ - for (pos = list_entry((head)->next, type, member); \ - &pos->member != (head); \ - pos = list_entry(pos->member.next, type, member)) - -#define list_for_each_entry_safe(pos, n, head, member, type) \ - for (pos = list_entry((head)->next, type, member), \ - n = list_entry(pos->member.next, type, member); \ - &pos->member != (head); \ - pos = n, n = list_entry(n->member.next, type, member)) - -#define list_empty(entry) ((entry)->next == (entry)) - -static inline void list_init(struct list_head *entry) -{ - entry->prev = entry->next = entry; -} - -static inline void list_add(struct list_head *entry, struct list_head *head) -{ - entry->next = head->next; - entry->prev = head; - - head->next->prev = entry; - head->next = entry; -} - -static inline void list_add_tail(struct list_head *entry, - struct list_head *head) -{ - entry->next = head; - entry->prev = head->prev; - - head->prev->next = entry; - head->prev = entry; -} - -static inline void list_del(struct list_head *entry) -{ - entry->next->prev = entry->prev; - entry->prev->next = entry->next; - entry->next = entry->prev = NULL; -} - -static inline void *usbi_reallocf(void *ptr, size_t size) -{ - void *ret = realloc(ptr, size); - if (!ret) - free(ptr); - return ret; -} - -#define container_of(ptr, type, member) ({ \ - const typeof( ((type *)0)->member ) *mptr = (ptr); \ - (type *)( (char *)mptr - offsetof(type,member) );}) - -#ifndef MIN -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#endif -#ifndef MAX -#define MAX(a, b) ((a) > (b) ? (a) : (b)) -#endif - -#define TIMESPEC_IS_SET(ts) ((ts)->tv_sec != 0 || (ts)->tv_nsec != 0) - -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -#define TIMEVAL_TV_SEC_TYPE long -#else -#define TIMEVAL_TV_SEC_TYPE time_t -#endif - -/* Some platforms don't have this define */ -#ifndef TIMESPEC_TO_TIMEVAL -#define TIMESPEC_TO_TIMEVAL(tv, ts) \ - do { \ - (tv)->tv_sec = (TIMEVAL_TV_SEC_TYPE) (ts)->tv_sec; \ - (tv)->tv_usec = (ts)->tv_nsec / 1000; \ - } while (0) -#endif - -void usbi_log(struct libusb_context *ctx, enum libusb_log_level level, - const char *function, const char *format, ...); - -void usbi_log_v(struct libusb_context *ctx, enum libusb_log_level level, - const char *function, const char *format, va_list args); - -#if !defined(_MSC_VER) || _MSC_VER >= 1400 - -#ifdef ENABLE_LOGGING -#define _usbi_log(ctx, level, ...) usbi_log(ctx, level, __FUNCTION__, __VA_ARGS__) -#define usbi_dbg(...) _usbi_log(NULL, LIBUSB_LOG_LEVEL_DEBUG, __VA_ARGS__) -#else -#define _usbi_log(ctx, level, ...) do { (void)(ctx); } while(0) -#define usbi_dbg(...) do {} while(0) -#endif - -#define usbi_info(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_INFO, __VA_ARGS__) -#define usbi_warn(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_WARNING, __VA_ARGS__) -#define usbi_err(ctx, ...) _usbi_log(ctx, LIBUSB_LOG_LEVEL_ERROR, __VA_ARGS__) - -#else /* !defined(_MSC_VER) || _MSC_VER >= 1400 */ - -#ifdef ENABLE_LOGGING -#define LOG_BODY(ctxt, level) \ -{ \ - va_list args; \ - va_start(args, format); \ - usbi_log_v(ctxt, level, "", format, args); \ - va_end(args); \ -} -#else -#define LOG_BODY(ctxt, level) \ -{ \ - (void)(ctxt); \ -} -#endif - -static inline void usbi_info(struct libusb_context *ctx, const char *format, ...) - LOG_BODY(ctx, LIBUSB_LOG_LEVEL_INFO) -static inline void usbi_warn(struct libusb_context *ctx, const char *format, ...) - LOG_BODY(ctx, LIBUSB_LOG_LEVEL_WARNING) -static inline void usbi_err(struct libusb_context *ctx, const char *format, ...) - LOG_BODY(ctx, LIBUSB_LOG_LEVEL_ERROR) - -static inline void usbi_dbg(const char *format, ...) - LOG_BODY(NULL, LIBUSB_LOG_LEVEL_DEBUG) - -#endif /* !defined(_MSC_VER) || _MSC_VER >= 1400 */ - -#define USBI_GET_CONTEXT(ctx) \ - do { \ - if (!(ctx)) \ - (ctx) = usbi_default_context; \ - } while(0) - -#define DEVICE_CTX(dev) ((dev)->ctx) -#define HANDLE_CTX(handle) (DEVICE_CTX((handle)->dev)) -#define TRANSFER_CTX(transfer) (HANDLE_CTX((transfer)->dev_handle)) -#define ITRANSFER_CTX(transfer) \ - (TRANSFER_CTX(USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer))) - -#define IS_EPIN(ep) (0 != ((ep) & LIBUSB_ENDPOINT_IN)) -#define IS_EPOUT(ep) (!IS_EPIN(ep)) -#define IS_XFERIN(xfer) (0 != ((xfer)->endpoint & LIBUSB_ENDPOINT_IN)) -#define IS_XFEROUT(xfer) (!IS_XFERIN(xfer)) - -/* Internal abstraction for thread synchronization */ -#if defined(THREADS_POSIX) -#include "os/threads_posix.h" -#elif defined(OS_WINDOWS) || defined(OS_WINCE) -#include "os/threads_windows.h" -#endif - -extern struct libusb_context *usbi_default_context; - -/* Forward declaration for use in context (fully defined inside poll abstraction) */ -struct pollfd; - -struct libusb_context { - int debug; - int debug_fixed; - - /* internal event pipe, used for signalling occurrence of an internal event. */ - int event_pipe[2]; - - struct list_head usb_devs; - usbi_mutex_t usb_devs_lock; - - /* A list of open handles. Backends are free to traverse this if required. - */ - struct list_head open_devs; - usbi_mutex_t open_devs_lock; - - /* A list of registered hotplug callbacks */ - struct list_head hotplug_cbs; - usbi_mutex_t hotplug_cbs_lock; - - /* this is a list of in-flight transfer handles, sorted by timeout - * expiration. URBs to timeout the soonest are placed at the beginning of - * the list, URBs that will time out later are placed after, and urbs with - * infinite timeout are always placed at the very end. */ - struct list_head flying_transfers; - /* Note paths taking both this and usbi_transfer->lock must always - * take this lock first */ - usbi_mutex_t flying_transfers_lock; - - /* user callbacks for pollfd changes */ - libusb_pollfd_added_cb fd_added_cb; - libusb_pollfd_removed_cb fd_removed_cb; - void *fd_cb_user_data; - - /* ensures that only one thread is handling events at any one time */ - usbi_mutex_t events_lock; - - /* used to see if there is an active thread doing event handling */ - int event_handler_active; - - /* A thread-local storage key to track which thread is performing event - * handling */ - usbi_tls_key_t event_handling_key; - - /* used to wait for event completion in threads other than the one that is - * event handling */ - usbi_mutex_t event_waiters_lock; - usbi_cond_t event_waiters_cond; - - /* A lock to protect internal context event data. */ - usbi_mutex_t event_data_lock; - - /* A bitmask of flags that are set to indicate specific events that need to - * be handled. Protected by event_data_lock. */ - unsigned int event_flags; - - /* A counter that is set when we want to interrupt and prevent event handling, - * in order to safely close a device. Protected by event_data_lock. */ - unsigned int device_close; - - /* list and count of poll fds and an array of poll fd structures that is - * (re)allocated as necessary prior to polling. Protected by event_data_lock. */ - struct list_head ipollfds; - struct pollfd *pollfds; - POLL_NFDS_TYPE pollfds_cnt; - - /* A list of pending hotplug messages. Protected by event_data_lock. */ - struct list_head hotplug_msgs; - - /* A list of pending completed transfers. Protected by event_data_lock. */ - struct list_head completed_transfers; - -#ifdef USBI_TIMERFD_AVAILABLE - /* used for timeout handling, if supported by OS. - * this timerfd is maintained to trigger on the next pending timeout */ - int timerfd; -#endif - - struct list_head list; -}; - -enum usbi_event_flags { - /* The list of pollfds has been modified */ - USBI_EVENT_POLLFDS_MODIFIED = 1 << 0, - - /* The user has interrupted the event handler */ - USBI_EVENT_USER_INTERRUPT = 1 << 1, -}; - -/* Macros for managing event handling state */ -#define usbi_handling_events(ctx) \ - (usbi_tls_key_get((ctx)->event_handling_key) != NULL) - -#define usbi_start_event_handling(ctx) \ - usbi_tls_key_set((ctx)->event_handling_key, ctx) - -#define usbi_end_event_handling(ctx) \ - usbi_tls_key_set((ctx)->event_handling_key, NULL) - -/* Update the following macro if new event sources are added */ -#define usbi_pending_events(ctx) \ - ((ctx)->event_flags || (ctx)->device_close \ - || !list_empty(&(ctx)->hotplug_msgs) || !list_empty(&(ctx)->completed_transfers)) - -#ifdef USBI_TIMERFD_AVAILABLE -#define usbi_using_timerfd(ctx) ((ctx)->timerfd >= 0) -#else -#define usbi_using_timerfd(ctx) (0) -#endif - -struct libusb_device { - /* lock protects refcnt, everything else is finalized at initialization - * time */ - usbi_mutex_t lock; - int refcnt; - - struct libusb_context *ctx; - - uint8_t bus_number; - uint8_t port_number; - struct libusb_device* parent_dev; - uint8_t device_address; - uint8_t num_configurations; - enum libusb_speed speed; - - struct list_head list; - unsigned long session_data; - - struct libusb_device_descriptor device_descriptor; - int attached; - - unsigned char os_priv -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - [] /* valid C99 code */ -#else - [0] /* non-standard, but usually working code */ -#endif -#if defined(OS_SUNOS) - __attribute__ ((aligned (8))); -#else - ; -#endif -}; - -struct libusb_device_handle { - /* lock protects claimed_interfaces */ - usbi_mutex_t lock; - unsigned long claimed_interfaces; - - struct list_head list; - struct libusb_device *dev; - int auto_detach_kernel_driver; - unsigned char os_priv -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - [] /* valid C99 code */ -#else - [0] /* non-standard, but usually working code */ -#endif -#if defined(OS_SUNOS) - __attribute__ ((aligned (8))); -#else - ; -#endif -}; - -enum { - USBI_CLOCK_MONOTONIC, - USBI_CLOCK_REALTIME -}; - -/* in-memory transfer layout: - * - * 1. struct usbi_transfer - * 2. struct libusb_transfer (which includes iso packets) [variable size] - * 3. os private data [variable size] - * - * from a libusb_transfer, you can get the usbi_transfer by rewinding the - * appropriate number of bytes. - * the usbi_transfer includes the number of allocated packets, so you can - * determine the size of the transfer and hence the start and length of the - * OS-private data. - */ - -struct usbi_transfer { - int num_iso_packets; - struct list_head list; - struct list_head completed_list; - struct timeval timeout; - int transferred; - uint32_t stream_id; - uint8_t state_flags; /* Protected by usbi_transfer->lock */ - uint8_t timeout_flags; /* Protected by the flying_stransfers_lock */ - - /* this lock is held during libusb_submit_transfer() and - * libusb_cancel_transfer() (allowing the OS backend to prevent duplicate - * cancellation, submission-during-cancellation, etc). the OS backend - * should also take this lock in the handle_events path, to prevent the user - * cancelling the transfer from another thread while you are processing - * its completion (presumably there would be races within your OS backend - * if this were possible). - * Note paths taking both this and the flying_transfers_lock must - * always take the flying_transfers_lock first */ - usbi_mutex_t lock; -}; - -enum usbi_transfer_state_flags { - /* Transfer successfully submitted by backend */ - USBI_TRANSFER_IN_FLIGHT = 1 << 0, - - /* Cancellation was requested via libusb_cancel_transfer() */ - USBI_TRANSFER_CANCELLING = 1 << 1, - - /* Operation on the transfer failed because the device disappeared */ - USBI_TRANSFER_DEVICE_DISAPPEARED = 1 << 2, -}; - -enum usbi_transfer_timeout_flags { - /* Set by backend submit_transfer() if the OS handles timeout */ - USBI_TRANSFER_OS_HANDLES_TIMEOUT = 1 << 0, - - /* The transfer timeout has been handled */ - USBI_TRANSFER_TIMEOUT_HANDLED = 1 << 1, - - /* The transfer timeout was successfully processed */ - USBI_TRANSFER_TIMED_OUT = 1 << 2, -}; - -#define USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer) \ - ((struct libusb_transfer *)(((unsigned char *)(transfer)) \ - + sizeof(struct usbi_transfer))) -#define LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer) \ - ((struct usbi_transfer *)(((unsigned char *)(transfer)) \ - - sizeof(struct usbi_transfer))) - -static inline void *usbi_transfer_get_os_priv(struct usbi_transfer *transfer) -{ - return ((unsigned char *)transfer) + sizeof(struct usbi_transfer) - + sizeof(struct libusb_transfer) - + (transfer->num_iso_packets - * sizeof(struct libusb_iso_packet_descriptor)); -} - -/* bus structures */ - -/* All standard descriptors have these 2 fields in common */ -struct usb_descriptor_header { - uint8_t bLength; - uint8_t bDescriptorType; -}; - -/* shared data and functions */ - -int usbi_io_init(struct libusb_context *ctx); -void usbi_io_exit(struct libusb_context *ctx); - -struct libusb_device *usbi_alloc_device(struct libusb_context *ctx, - unsigned long session_id); -struct libusb_device *usbi_get_device_by_session_id(struct libusb_context *ctx, - unsigned long session_id); -int usbi_sanitize_device(struct libusb_device *dev); -void usbi_handle_disconnect(struct libusb_device_handle *dev_handle); - -int usbi_handle_transfer_completion(struct usbi_transfer *itransfer, - enum libusb_transfer_status status); -int usbi_handle_transfer_cancellation(struct usbi_transfer *transfer); -void usbi_signal_transfer_completion(struct usbi_transfer *transfer); - -int usbi_parse_descriptor(const unsigned char *source, const char *descriptor, - void *dest, int host_endian); -int usbi_device_cache_descriptor(libusb_device *dev); -int usbi_get_config_index_by_value(struct libusb_device *dev, - uint8_t bConfigurationValue, int *idx); - -void usbi_connect_device (struct libusb_device *dev); -void usbi_disconnect_device (struct libusb_device *dev); - -int usbi_signal_event(struct libusb_context *ctx); -int usbi_clear_event(struct libusb_context *ctx); - -/* Internal abstraction for poll (needs struct usbi_transfer on Windows) */ -#if defined(OS_LINUX) || defined(OS_DARWIN) || defined(OS_OPENBSD) || defined(OS_NETBSD) ||\ - defined(OS_HAIKU) || defined(OS_SUNOS) -#include -#include "os/poll_posix.h" -#elif defined(OS_WINDOWS) || defined(OS_WINCE) -#include "os/poll_windows.h" -#endif - -#if defined(_MSC_VER) && (_MSC_VER < 1900) -#define snprintf usbi_snprintf -#define vsnprintf usbi_vsnprintf -int usbi_snprintf(char *dst, size_t size, const char *format, ...); -int usbi_vsnprintf(char *dst, size_t size, const char *format, va_list ap); -#define LIBUSB_PRINTF_WIN32 -#endif - -struct usbi_pollfd { - /* must come first */ - struct libusb_pollfd pollfd; - - struct list_head list; -}; - -int usbi_add_pollfd(struct libusb_context *ctx, int fd, short events); -void usbi_remove_pollfd(struct libusb_context *ctx, int fd); - -/* device discovery */ - -/* we traverse usbfs without knowing how many devices we are going to find. - * so we create this discovered_devs model which is similar to a linked-list - * which grows when required. it can be freed once discovery has completed, - * eliminating the need for a list node in the libusb_device structure - * itself. */ -struct discovered_devs { - size_t len; - size_t capacity; - struct libusb_device *devices -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - [] /* valid C99 code */ -#else - [0] /* non-standard, but usually working code */ -#endif - ; -}; - -struct discovered_devs *discovered_devs_append( - struct discovered_devs *discdevs, struct libusb_device *dev); - -/* OS abstraction */ - -/* This is the interface that OS backends need to implement. - * All fields are mandatory, except ones explicitly noted as optional. */ -struct usbi_os_backend { - /* A human-readable name for your backend, e.g. "Linux usbfs" */ - const char *name; - - /* Binary mask for backend specific capabilities */ - uint32_t caps; - - /* Perform initialization of your backend. You might use this function - * to determine specific capabilities of the system, allocate required - * data structures for later, etc. - * - * This function is called when a libusb user initializes the library - * prior to use. - * - * Return 0 on success, or a LIBUSB_ERROR code on failure. - */ - int (*init)(struct libusb_context *ctx); - - /* Deinitialization. Optional. This function should destroy anything - * that was set up by init. - * - * This function is called when the user deinitializes the library. - */ - void (*exit)(void); - - /* Enumerate all the USB devices on the system, returning them in a list - * of discovered devices. - * - * Your implementation should enumerate all devices on the system, - * regardless of whether they have been seen before or not. - * - * When you have found a device, compute a session ID for it. The session - * ID should uniquely represent that particular device for that particular - * connection session since boot (i.e. if you disconnect and reconnect a - * device immediately after, it should be assigned a different session ID). - * If your OS cannot provide a unique session ID as described above, - * presenting a session ID of (bus_number << 8 | device_address) should - * be sufficient. Bus numbers and device addresses wrap and get reused, - * but that is an unlikely case. - * - * After computing a session ID for a device, call - * usbi_get_device_by_session_id(). This function checks if libusb already - * knows about the device, and if so, it provides you with a reference - * to a libusb_device structure for it. - * - * If usbi_get_device_by_session_id() returns NULL, it is time to allocate - * a new device structure for the device. Call usbi_alloc_device() to - * obtain a new libusb_device structure with reference count 1. Populate - * the bus_number and device_address attributes of the new device, and - * perform any other internal backend initialization you need to do. At - * this point, you should be ready to provide device descriptors and so - * on through the get_*_descriptor functions. Finally, call - * usbi_sanitize_device() to perform some final sanity checks on the - * device. Assuming all of the above succeeded, we can now continue. - * If any of the above failed, remember to unreference the device that - * was returned by usbi_alloc_device(). - * - * At this stage we have a populated libusb_device structure (either one - * that was found earlier, or one that we have just allocated and - * populated). This can now be added to the discovered devices list - * using discovered_devs_append(). Note that discovered_devs_append() - * may reallocate the list, returning a new location for it, and also - * note that reallocation can fail. Your backend should handle these - * error conditions appropriately. - * - * This function should not generate any bus I/O and should not block. - * If I/O is required (e.g. reading the active configuration value), it is - * OK to ignore these suggestions :) - * - * This function is executed when the user wishes to retrieve a list - * of USB devices connected to the system. - * - * If the backend has hotplug support, this function is not used! - * - * Return 0 on success, or a LIBUSB_ERROR code on failure. - */ - int (*get_device_list)(struct libusb_context *ctx, - struct discovered_devs **discdevs); - - /* Apps which were written before hotplug support, may listen for - * hotplug events on their own and call libusb_get_device_list on - * device addition. In this case libusb_get_device_list will likely - * return a list without the new device in there, as the hotplug - * event thread will still be busy enumerating the device, which may - * take a while, or may not even have seen the event yet. - * - * To avoid this libusb_get_device_list will call this optional - * function for backends with hotplug support before copying - * ctx->usb_devs to the user. In this function the backend should - * ensure any pending hotplug events are fully processed before - * returning. - * - * Optional, should be implemented by backends with hotplug support. - */ - void (*hotplug_poll)(void); - - /* Open a device for I/O and other USB operations. The device handle - * is preallocated for you, you can retrieve the device in question - * through handle->dev. - * - * Your backend should allocate any internal resources required for I/O - * and other operations so that those operations can happen (hopefully) - * without hiccup. This is also a good place to inform libusb that it - * should monitor certain file descriptors related to this device - - * see the usbi_add_pollfd() function. - * - * This function should not generate any bus I/O and should not block. - * - * This function is called when the user attempts to obtain a device - * handle for a device. - * - * Return: - * - 0 on success - * - LIBUSB_ERROR_ACCESS if the user has insufficient permissions - * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since - * discovery - * - another LIBUSB_ERROR code on other failure - * - * Do not worry about freeing the handle on failed open, the upper layers - * do this for you. - */ - int (*open)(struct libusb_device_handle *dev_handle); - - /* Close a device such that the handle cannot be used again. Your backend - * should destroy any resources that were allocated in the open path. - * This may also be a good place to call usbi_remove_pollfd() to inform - * libusb of any file descriptors associated with this device that should - * no longer be monitored. - * - * This function is called when the user closes a device handle. - */ - void (*close)(struct libusb_device_handle *dev_handle); - - /* Retrieve the device descriptor from a device. - * - * The descriptor should be retrieved from memory, NOT via bus I/O to the - * device. This means that you may have to cache it in a private structure - * during get_device_list enumeration. Alternatively, you may be able - * to retrieve it from a kernel interface (some Linux setups can do this) - * still without generating bus I/O. - * - * This function is expected to write DEVICE_DESC_LENGTH (18) bytes into - * buffer, which is guaranteed to be big enough. - * - * This function is called when sanity-checking a device before adding - * it to the list of discovered devices, and also when the user requests - * to read the device descriptor. - * - * This function is expected to return the descriptor in bus-endian format - * (LE). If it returns the multi-byte values in host-endian format, - * set the host_endian output parameter to "1". - * - * Return 0 on success or a LIBUSB_ERROR code on failure. - */ - int (*get_device_descriptor)(struct libusb_device *device, - unsigned char *buffer, int *host_endian); - - /* Get the ACTIVE configuration descriptor for a device. - * - * The descriptor should be retrieved from memory, NOT via bus I/O to the - * device. This means that you may have to cache it in a private structure - * during get_device_list enumeration. You may also have to keep track - * of which configuration is active when the user changes it. - * - * This function is expected to write len bytes of data into buffer, which - * is guaranteed to be big enough. If you can only do a partial write, - * return an error code. - * - * This function is expected to return the descriptor in bus-endian format - * (LE). If it returns the multi-byte values in host-endian format, - * set the host_endian output parameter to "1". - * - * Return: - * - 0 on success - * - LIBUSB_ERROR_NOT_FOUND if the device is in unconfigured state - * - another LIBUSB_ERROR code on other failure - */ - int (*get_active_config_descriptor)(struct libusb_device *device, - unsigned char *buffer, size_t len, int *host_endian); - - /* Get a specific configuration descriptor for a device. - * - * The descriptor should be retrieved from memory, NOT via bus I/O to the - * device. This means that you may have to cache it in a private structure - * during get_device_list enumeration. - * - * The requested descriptor is expressed as a zero-based index (i.e. 0 - * indicates that we are requesting the first descriptor). The index does - * not (necessarily) equal the bConfigurationValue of the configuration - * being requested. - * - * This function is expected to write len bytes of data into buffer, which - * is guaranteed to be big enough. If you can only do a partial write, - * return an error code. - * - * This function is expected to return the descriptor in bus-endian format - * (LE). If it returns the multi-byte values in host-endian format, - * set the host_endian output parameter to "1". - * - * Return the length read on success or a LIBUSB_ERROR code on failure. - */ - int (*get_config_descriptor)(struct libusb_device *device, - uint8_t config_index, unsigned char *buffer, size_t len, - int *host_endian); - - /* Like get_config_descriptor but then by bConfigurationValue instead - * of by index. - * - * Optional, if not present the core will call get_config_descriptor - * for all configs until it finds the desired bConfigurationValue. - * - * Returns a pointer to the raw-descriptor in *buffer, this memory - * is valid as long as device is valid. - * - * Returns the length of the returned raw-descriptor on success, - * or a LIBUSB_ERROR code on failure. - */ - int (*get_config_descriptor_by_value)(struct libusb_device *device, - uint8_t bConfigurationValue, unsigned char **buffer, - int *host_endian); - - /* Get the bConfigurationValue for the active configuration for a device. - * Optional. This should only be implemented if you can retrieve it from - * cache (don't generate I/O). - * - * If you cannot retrieve this from cache, either do not implement this - * function, or return LIBUSB_ERROR_NOT_SUPPORTED. This will cause - * libusb to retrieve the information through a standard control transfer. - * - * This function must be non-blocking. - * Return: - * - 0 on success - * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it - * was opened - * - LIBUSB_ERROR_NOT_SUPPORTED if the value cannot be retrieved without - * blocking - * - another LIBUSB_ERROR code on other failure. - */ - int (*get_configuration)(struct libusb_device_handle *dev_handle, int *config); - - /* Set the active configuration for a device. - * - * A configuration value of -1 should put the device in unconfigured state. - * - * This function can block. - * - * Return: - * - 0 on success - * - LIBUSB_ERROR_NOT_FOUND if the configuration does not exist - * - LIBUSB_ERROR_BUSY if interfaces are currently claimed (and hence - * configuration cannot be changed) - * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it - * was opened - * - another LIBUSB_ERROR code on other failure. - */ - int (*set_configuration)(struct libusb_device_handle *dev_handle, int config); - - /* Claim an interface. When claimed, the application can then perform - * I/O to an interface's endpoints. - * - * This function should not generate any bus I/O and should not block. - * Interface claiming is a logical operation that simply ensures that - * no other drivers/applications are using the interface, and after - * claiming, no other drivers/applications can use the interface because - * we now "own" it. - * - * Return: - * - 0 on success - * - LIBUSB_ERROR_NOT_FOUND if the interface does not exist - * - LIBUSB_ERROR_BUSY if the interface is in use by another driver/app - * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it - * was opened - * - another LIBUSB_ERROR code on other failure - */ - int (*claim_interface)(struct libusb_device_handle *dev_handle, int interface_number); - - /* Release a previously claimed interface. - * - * This function should also generate a SET_INTERFACE control request, - * resetting the alternate setting of that interface to 0. It's OK for - * this function to block as a result. - * - * You will only ever be asked to release an interface which was - * successfully claimed earlier. - * - * Return: - * - 0 on success - * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it - * was opened - * - another LIBUSB_ERROR code on other failure - */ - int (*release_interface)(struct libusb_device_handle *dev_handle, int interface_number); - - /* Set the alternate setting for an interface. - * - * You will only ever be asked to set the alternate setting for an - * interface which was successfully claimed earlier. - * - * It's OK for this function to block. - * - * Return: - * - 0 on success - * - LIBUSB_ERROR_NOT_FOUND if the alternate setting does not exist - * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it - * was opened - * - another LIBUSB_ERROR code on other failure - */ - int (*set_interface_altsetting)(struct libusb_device_handle *dev_handle, - int interface_number, int altsetting); - - /* Clear a halt/stall condition on an endpoint. - * - * It's OK for this function to block. - * - * Return: - * - 0 on success - * - LIBUSB_ERROR_NOT_FOUND if the endpoint does not exist - * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it - * was opened - * - another LIBUSB_ERROR code on other failure - */ - int (*clear_halt)(struct libusb_device_handle *dev_handle, - unsigned char endpoint); - - /* Perform a USB port reset to reinitialize a device. - * - * If possible, the device handle should still be usable after the reset - * completes, assuming that the device descriptors did not change during - * reset and all previous interface state can be restored. - * - * If something changes, or you cannot easily locate/verify the resetted - * device, return LIBUSB_ERROR_NOT_FOUND. This prompts the application - * to close the old handle and re-enumerate the device. - * - * Return: - * - 0 on success - * - LIBUSB_ERROR_NOT_FOUND if re-enumeration is required, or if the device - * has been disconnected since it was opened - * - another LIBUSB_ERROR code on other failure - */ - int (*reset_device)(struct libusb_device_handle *dev_handle); - - /* Alloc num_streams usb3 bulk streams on the passed in endpoints */ - int (*alloc_streams)(struct libusb_device_handle *dev_handle, - uint32_t num_streams, unsigned char *endpoints, int num_endpoints); - - /* Free usb3 bulk streams allocated with alloc_streams */ - int (*free_streams)(struct libusb_device_handle *dev_handle, - unsigned char *endpoints, int num_endpoints); - - /* Allocate persistent DMA memory for the given device, suitable for - * zerocopy. May return NULL on failure. Optional to implement. - */ - unsigned char *(*dev_mem_alloc)(struct libusb_device_handle *handle, - size_t len); - - /* Free memory allocated by dev_mem_alloc. */ - int (*dev_mem_free)(struct libusb_device_handle *handle, - unsigned char *buffer, size_t len); - - /* Determine if a kernel driver is active on an interface. Optional. - * - * The presence of a kernel driver on an interface indicates that any - * calls to claim_interface would fail with the LIBUSB_ERROR_BUSY code. - * - * Return: - * - 0 if no driver is active - * - 1 if a driver is active - * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it - * was opened - * - another LIBUSB_ERROR code on other failure - */ - int (*kernel_driver_active)(struct libusb_device_handle *dev_handle, - int interface_number); - - /* Detach a kernel driver from an interface. Optional. - * - * After detaching a kernel driver, the interface should be available - * for claim. - * - * Return: - * - 0 on success - * - LIBUSB_ERROR_NOT_FOUND if no kernel driver was active - * - LIBUSB_ERROR_INVALID_PARAM if the interface does not exist - * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it - * was opened - * - another LIBUSB_ERROR code on other failure - */ - int (*detach_kernel_driver)(struct libusb_device_handle *dev_handle, - int interface_number); - - /* Attach a kernel driver to an interface. Optional. - * - * Reattach a kernel driver to the device. - * - * Return: - * - 0 on success - * - LIBUSB_ERROR_NOT_FOUND if no kernel driver was active - * - LIBUSB_ERROR_INVALID_PARAM if the interface does not exist - * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected since it - * was opened - * - LIBUSB_ERROR_BUSY if a program or driver has claimed the interface, - * preventing reattachment - * - another LIBUSB_ERROR code on other failure - */ - int (*attach_kernel_driver)(struct libusb_device_handle *dev_handle, - int interface_number); - - /* Destroy a device. Optional. - * - * This function is called when the last reference to a device is - * destroyed. It should free any resources allocated in the get_device_list - * path. - */ - void (*destroy_device)(struct libusb_device *dev); - - /* Submit a transfer. Your implementation should take the transfer, - * morph it into whatever form your platform requires, and submit it - * asynchronously. - * - * This function must not block. - * - * This function gets called with the flying_transfers_lock locked! - * - * Return: - * - 0 on success - * - LIBUSB_ERROR_NO_DEVICE if the device has been disconnected - * - another LIBUSB_ERROR code on other failure - */ - int (*submit_transfer)(struct usbi_transfer *itransfer); - - /* Cancel a previously submitted transfer. - * - * This function must not block. The transfer cancellation must complete - * later, resulting in a call to usbi_handle_transfer_cancellation() - * from the context of handle_events. - */ - int (*cancel_transfer)(struct usbi_transfer *itransfer); - - /* Clear a transfer as if it has completed or cancelled, but do not - * report any completion/cancellation to the library. You should free - * all private data from the transfer as if you were just about to report - * completion or cancellation. - * - * This function might seem a bit out of place. It is used when libusb - * detects a disconnected device - it calls this function for all pending - * transfers before reporting completion (with the disconnect code) to - * the user. Maybe we can improve upon this internal interface in future. - */ - void (*clear_transfer_priv)(struct usbi_transfer *itransfer); - - /* Handle any pending events on file descriptors. Optional. - * - * Provide this function when file descriptors directly indicate device - * or transfer activity. If your backend does not have such file descriptors, - * implement the handle_transfer_completion function below. - * - * This involves monitoring any active transfers and processing their - * completion or cancellation. - * - * The function is passed an array of pollfd structures (size nfds) - * as a result of the poll() system call. The num_ready parameter - * indicates the number of file descriptors that have reported events - * (i.e. the poll() return value). This should be enough information - * for you to determine which actions need to be taken on the currently - * active transfers. - * - * For any cancelled transfers, call usbi_handle_transfer_cancellation(). - * For completed transfers, call usbi_handle_transfer_completion(). - * For control/bulk/interrupt transfers, populate the "transferred" - * element of the appropriate usbi_transfer structure before calling the - * above functions. For isochronous transfers, populate the status and - * transferred fields of the iso packet descriptors of the transfer. - * - * This function should also be able to detect disconnection of the - * device, reporting that situation with usbi_handle_disconnect(). - * - * When processing an event related to a transfer, you probably want to - * take usbi_transfer.lock to prevent races. See the documentation for - * the usbi_transfer structure. - * - * Return 0 on success, or a LIBUSB_ERROR code on failure. - */ - int (*handle_events)(struct libusb_context *ctx, - struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready); - - /* Handle transfer completion. Optional. - * - * Provide this function when there are no file descriptors available - * that directly indicate device or transfer activity. If your backend does - * have such file descriptors, implement the handle_events function above. - * - * Your backend must tell the library when a transfer has completed by - * calling usbi_signal_transfer_completion(). You should store any private - * information about the transfer and its completion status in the transfer's - * private backend data. - * - * During event handling, this function will be called on each transfer for - * which usbi_signal_transfer_completion() was called. - * - * For any cancelled transfers, call usbi_handle_transfer_cancellation(). - * For completed transfers, call usbi_handle_transfer_completion(). - * For control/bulk/interrupt transfers, populate the "transferred" - * element of the appropriate usbi_transfer structure before calling the - * above functions. For isochronous transfers, populate the status and - * transferred fields of the iso packet descriptors of the transfer. - * - * Return 0 on success, or a LIBUSB_ERROR code on failure. - */ - int (*handle_transfer_completion)(struct usbi_transfer *itransfer); - - /* Get time from specified clock. At least two clocks must be implemented - by the backend: USBI_CLOCK_REALTIME, and USBI_CLOCK_MONOTONIC. - - Description of clocks: - USBI_CLOCK_REALTIME : clock returns time since system epoch. - USBI_CLOCK_MONOTONIC: clock returns time since unspecified start - time (usually boot). - */ - int (*clock_gettime)(int clkid, struct timespec *tp); - -#ifdef USBI_TIMERFD_AVAILABLE - /* clock ID of the clock that should be used for timerfd */ - clockid_t (*get_timerfd_clockid)(void); -#endif - - /* Number of bytes to reserve for per-device private backend data. - * This private data area is accessible through the "os_priv" field of - * struct libusb_device. */ - size_t device_priv_size; - - /* Number of bytes to reserve for per-handle private backend data. - * This private data area is accessible through the "os_priv" field of - * struct libusb_device. */ - size_t device_handle_priv_size; - - /* Number of bytes to reserve for per-transfer private backend data. - * This private data area is accessible by calling - * usbi_transfer_get_os_priv() on the appropriate usbi_transfer instance. - */ - size_t transfer_priv_size; -}; - -extern const struct usbi_os_backend * const usbi_backend; - -extern const struct usbi_os_backend linux_usbfs_backend; -extern const struct usbi_os_backend darwin_backend; -extern const struct usbi_os_backend openbsd_backend; -extern const struct usbi_os_backend netbsd_backend; -extern const struct usbi_os_backend windows_backend; -extern const struct usbi_os_backend usbdk_backend; -extern const struct usbi_os_backend wince_backend; -extern const struct usbi_os_backend haiku_usb_raw_backend; -extern const struct usbi_os_backend sunos_backend; - -extern struct list_head active_contexts_list; -extern usbi_mutex_static_t active_contexts_lock; - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/darwin_usb.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/darwin_usb.c deleted file mode 100644 index b0219d1b0573..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/darwin_usb.c +++ /dev/null @@ -1,2094 +0,0 @@ -/* -*- Mode: C; indent-tabs-mode:nil -*- */ -/* - * darwin backend for libusb 1.0 - * Copyright © 2008-2016 Nathan Hjelm - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "config.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#include -#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 && MAC_OS_X_VERSION_MIN_REQUIRED < 101200 - #include -#endif - -#if MAC_OS_X_VERSION_MIN_REQUIRED >= 101200 -/* Apple deprecated the darwin atomics in 10.12 in favor of C11 atomics */ -#include -#define libusb_darwin_atomic_fetch_add(x, y) atomic_fetch_add(x, y) - -_Atomic int32_t initCount = ATOMIC_VAR_INIT(0); -#else -/* use darwin atomics if the target is older than 10.12 */ -#include - -/* OSAtomicAdd32Barrier returns the new value */ -#define libusb_darwin_atomic_fetch_add(x, y) (OSAtomicAdd32Barrier(y, x) - y) - -static volatile int32_t initCount = 0; -#endif - -#include "darwin_usb.h" - -/* async event thread */ -static pthread_mutex_t libusb_darwin_at_mutex = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t libusb_darwin_at_cond = PTHREAD_COND_INITIALIZER; - -static pthread_once_t darwin_init_once = PTHREAD_ONCE_INIT; - -static clock_serv_t clock_realtime; -static clock_serv_t clock_monotonic; - -static CFRunLoopRef libusb_darwin_acfl = NULL; /* event cf loop */ -static CFRunLoopSourceRef libusb_darwin_acfls = NULL; /* shutdown signal for event cf loop */ - -static usbi_mutex_t darwin_cached_devices_lock = PTHREAD_MUTEX_INITIALIZER; -static struct list_head darwin_cached_devices = {&darwin_cached_devices, &darwin_cached_devices}; -static char *darwin_device_class = kIOUSBDeviceClassName; - -#define DARWIN_CACHED_DEVICE(a) ((struct darwin_cached_device *) (((struct darwin_device_priv *)((a)->os_priv))->dev)) - -/* async event thread */ -static pthread_t libusb_darwin_at; - -static int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian); -static int darwin_claim_interface(struct libusb_device_handle *dev_handle, int iface); -static int darwin_release_interface(struct libusb_device_handle *dev_handle, int iface); -static int darwin_reset_device(struct libusb_device_handle *dev_handle); -static void darwin_async_io_callback (void *refcon, IOReturn result, void *arg0); - -static int darwin_scan_devices(struct libusb_context *ctx); -static int process_new_device (struct libusb_context *ctx, io_service_t service); - -#if defined(ENABLE_LOGGING) -static const char *darwin_error_str (int result) { - static char string_buffer[50]; - switch (result) { - case kIOReturnSuccess: - return "no error"; - case kIOReturnNotOpen: - return "device not opened for exclusive access"; - case kIOReturnNoDevice: - return "no connection to an IOService"; - case kIOUSBNoAsyncPortErr: - return "no async port has been opened for interface"; - case kIOReturnExclusiveAccess: - return "another process has device opened for exclusive access"; - case kIOUSBPipeStalled: - return "pipe is stalled"; - case kIOReturnError: - return "could not establish a connection to the Darwin kernel"; - case kIOUSBTransactionTimeout: - return "transaction timed out"; - case kIOReturnBadArgument: - return "invalid argument"; - case kIOReturnAborted: - return "transaction aborted"; - case kIOReturnNotResponding: - return "device not responding"; - case kIOReturnOverrun: - return "data overrun"; - case kIOReturnCannotWire: - return "physical memory can not be wired down"; - case kIOReturnNoResources: - return "out of resources"; - case kIOUSBHighSpeedSplitError: - return "high speed split error"; - default: - snprintf(string_buffer, sizeof(string_buffer), "unknown error (0x%x)", result); - return string_buffer; - } -} -#endif - -static int darwin_to_libusb (int result) { - switch (result) { - case kIOReturnUnderrun: - case kIOReturnSuccess: - return LIBUSB_SUCCESS; - case kIOReturnNotOpen: - case kIOReturnNoDevice: - return LIBUSB_ERROR_NO_DEVICE; - case kIOReturnExclusiveAccess: - return LIBUSB_ERROR_ACCESS; - case kIOUSBPipeStalled: - return LIBUSB_ERROR_PIPE; - case kIOReturnBadArgument: - return LIBUSB_ERROR_INVALID_PARAM; - case kIOUSBTransactionTimeout: - return LIBUSB_ERROR_TIMEOUT; - case kIOReturnNotResponding: - case kIOReturnAborted: - case kIOReturnError: - case kIOUSBNoAsyncPortErr: - default: - return LIBUSB_ERROR_OTHER; - } -} - -/* this function must be called with the darwin_cached_devices_lock held */ -static void darwin_deref_cached_device(struct darwin_cached_device *cached_dev) { - cached_dev->refcount--; - /* free the device and remove it from the cache */ - if (0 == cached_dev->refcount) { - list_del(&cached_dev->list); - - (*(cached_dev->device))->Release(cached_dev->device); - free (cached_dev); - } -} - -static void darwin_ref_cached_device(struct darwin_cached_device *cached_dev) { - cached_dev->refcount++; -} - -static int ep_to_pipeRef(struct libusb_device_handle *dev_handle, uint8_t ep, uint8_t *pipep, uint8_t *ifcp, struct darwin_interface **interface_out) { - struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; - - /* current interface */ - struct darwin_interface *cInterface; - - int8_t i, iface; - - usbi_dbg ("converting ep address 0x%02x to pipeRef and interface", ep); - - for (iface = 0 ; iface < USB_MAXINTERFACES ; iface++) { - cInterface = &priv->interfaces[iface]; - - if (dev_handle->claimed_interfaces & (1 << iface)) { - for (i = 0 ; i < cInterface->num_endpoints ; i++) { - if (cInterface->endpoint_addrs[i] == ep) { - *pipep = i + 1; - - if (ifcp) - *ifcp = iface; - - if (interface_out) - *interface_out = cInterface; - - usbi_dbg ("pipe %d on interface %d matches", *pipep, iface); - return 0; - } - } - } - } - - /* No pipe found with the correct endpoint address */ - usbi_warn (HANDLE_CTX(dev_handle), "no pipeRef found with endpoint address 0x%02x.", ep); - - return LIBUSB_ERROR_NOT_FOUND; -} - -static int usb_setup_device_iterator (io_iterator_t *deviceIterator, UInt32 location) { - CFMutableDictionaryRef matchingDict = IOServiceMatching(darwin_device_class); - - if (!matchingDict) - return kIOReturnError; - - if (location) { - CFMutableDictionaryRef propertyMatchDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, - &kCFTypeDictionaryKeyCallBacks, - &kCFTypeDictionaryValueCallBacks); - - if (propertyMatchDict) { - /* there are no unsigned CFNumber types so treat the value as signed. the os seems to do this - internally (CFNumberType of locationID is 3) */ - CFTypeRef locationCF = CFNumberCreate (NULL, kCFNumberSInt32Type, &location); - - CFDictionarySetValue (propertyMatchDict, CFSTR(kUSBDevicePropertyLocationID), locationCF); - /* release our reference to the CFNumber (CFDictionarySetValue retains it) */ - CFRelease (locationCF); - - CFDictionarySetValue (matchingDict, CFSTR(kIOPropertyMatchKey), propertyMatchDict); - /* release out reference to the CFMutableDictionaryRef (CFDictionarySetValue retains it) */ - CFRelease (propertyMatchDict); - } - /* else we can still proceed as long as the caller accounts for the possibility of other devices in the iterator */ - } - - return IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, deviceIterator); -} - -/* Returns 1 on success, 0 on failure. */ -static int get_ioregistry_value_number (io_service_t service, CFStringRef property, CFNumberType type, void *p) { - CFTypeRef cfNumber = IORegistryEntryCreateCFProperty (service, property, kCFAllocatorDefault, 0); - int ret = 0; - - if (cfNumber) { - if (CFGetTypeID(cfNumber) == CFNumberGetTypeID()) { - ret = CFNumberGetValue(cfNumber, type, p); - } - - CFRelease (cfNumber); - } - - return ret; -} - -static int get_ioregistry_value_data (io_service_t service, CFStringRef property, ssize_t size, void *p) { - CFTypeRef cfData = IORegistryEntryCreateCFProperty (service, property, kCFAllocatorDefault, 0); - int ret = 0; - - if (cfData) { - if (CFGetTypeID (cfData) == CFDataGetTypeID ()) { - CFIndex length = CFDataGetLength (cfData); - if (length < size) { - size = length; - } - - CFDataGetBytes (cfData, CFRangeMake(0, size), p); - ret = 1; - } - - CFRelease (cfData); - } - - return ret; -} - -static usb_device_t **darwin_device_from_service (io_service_t service) -{ - io_cf_plugin_ref_t *plugInInterface = NULL; - usb_device_t **device; - kern_return_t result; - SInt32 score; - - result = IOCreatePlugInInterfaceForService(service, kIOUSBDeviceUserClientTypeID, - kIOCFPlugInInterfaceID, &plugInInterface, - &score); - - if (kIOReturnSuccess != result || !plugInInterface) { - usbi_dbg ("could not set up plugin for service: %s", darwin_error_str (result)); - return NULL; - } - - (void)(*plugInInterface)->QueryInterface(plugInInterface, CFUUIDGetUUIDBytes(DeviceInterfaceID), - (LPVOID)&device); - /* Use release instead of IODestroyPlugInInterface to avoid stopping IOServices associated with this device */ - (*plugInInterface)->Release (plugInInterface); - - return device; -} - -static void darwin_devices_attached (void *ptr, io_iterator_t add_devices) { - struct libusb_context *ctx; - io_service_t service; - - usbi_mutex_lock(&active_contexts_lock); - - while ((service = IOIteratorNext(add_devices))) { - /* add this device to each active context's device list */ - list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) { - process_new_device (ctx, service);; - } - - IOObjectRelease(service); - } - - usbi_mutex_unlock(&active_contexts_lock); -} - -static void darwin_devices_detached (void *ptr, io_iterator_t rem_devices) { - struct libusb_device *dev = NULL; - struct libusb_context *ctx; - struct darwin_cached_device *old_device; - - io_service_t device; - UInt64 session; - int ret; - - usbi_mutex_lock(&active_contexts_lock); - - while ((device = IOIteratorNext (rem_devices)) != 0) { - /* get the location from the i/o registry */ - ret = get_ioregistry_value_number (device, CFSTR("sessionID"), kCFNumberSInt64Type, &session); - IOObjectRelease (device); - if (!ret) - continue; - - /* we need to match darwin_ref_cached_device call made in darwin_get_cached_device function - otherwise no cached device will ever get freed */ - usbi_mutex_lock(&darwin_cached_devices_lock); - list_for_each_entry(old_device, &darwin_cached_devices, list, struct darwin_cached_device) { - if (old_device->session == session) { - darwin_deref_cached_device (old_device); - break; - } - } - usbi_mutex_unlock(&darwin_cached_devices_lock); - - list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) { - usbi_dbg ("notifying context %p of device disconnect", ctx); - - dev = usbi_get_device_by_session_id(ctx, (unsigned long) session); - if (dev) { - /* signal the core that this device has been disconnected. the core will tear down this device - when the reference count reaches 0 */ - usbi_disconnect_device(dev); - libusb_unref_device(dev); - } - } - } - - usbi_mutex_unlock(&active_contexts_lock); -} - -static void darwin_hotplug_poll (void) -{ - /* not sure if 5 seconds will be too long/short but it should work ok */ - mach_timespec_t timeout = {.tv_sec = 5, .tv_nsec = 0}; - - /* since a kernel thread may nodify the IOInterators used for - * hotplug notidication we can't just clear the iterators. - * instead just wait until all IOService providers are quiet */ - (void) IOKitWaitQuiet (kIOMasterPortDefault, &timeout); -} - -static void darwin_clear_iterator (io_iterator_t iter) { - io_service_t device; - - while ((device = IOIteratorNext (iter)) != 0) - IOObjectRelease (device); -} - -static void *darwin_event_thread_main (void *arg0) { - IOReturn kresult; - struct libusb_context *ctx = (struct libusb_context *)arg0; - CFRunLoopRef runloop; - -#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 - /* Set this thread's name, so it can be seen in the debugger - and crash reports. */ - pthread_setname_np ("org.libusb.device-hotplug"); -#endif - -#if MAC_OS_X_VERSION_MIN_REQUIRED >= 1060 && MAC_OS_X_VERSION_MIN_REQUIRED < 101200 - /* Tell the Objective-C garbage collector about this thread. - This is required because, unlike NSThreads, pthreads are - not automatically registered. Although we don't use - Objective-C, we use CoreFoundation, which does. - Garbage collection support was entirely removed in 10.12, - so don't bother there. */ - objc_registerThreadWithCollector(); -#endif - - /* hotplug (device arrival/removal) sources */ - CFRunLoopSourceContext libusb_shutdown_cfsourcectx; - CFRunLoopSourceRef libusb_notification_cfsource; - io_notification_port_t libusb_notification_port; - io_iterator_t libusb_rem_device_iterator; - io_iterator_t libusb_add_device_iterator; - - usbi_dbg ("creating hotplug event source"); - - runloop = CFRunLoopGetCurrent (); - CFRetain (runloop); - - /* add the shutdown cfsource to the run loop */ - memset(&libusb_shutdown_cfsourcectx, 0, sizeof(libusb_shutdown_cfsourcectx)); - libusb_shutdown_cfsourcectx.info = runloop; - libusb_shutdown_cfsourcectx.perform = (void (*)(void *))CFRunLoopStop; - libusb_darwin_acfls = CFRunLoopSourceCreate(NULL, 0, &libusb_shutdown_cfsourcectx); - CFRunLoopAddSource(runloop, libusb_darwin_acfls, kCFRunLoopDefaultMode); - - /* add the notification port to the run loop */ - libusb_notification_port = IONotificationPortCreate (kIOMasterPortDefault); - libusb_notification_cfsource = IONotificationPortGetRunLoopSource (libusb_notification_port); - CFRunLoopAddSource(runloop, libusb_notification_cfsource, kCFRunLoopDefaultMode); - - /* create notifications for removed devices */ - kresult = IOServiceAddMatchingNotification (libusb_notification_port, kIOTerminatedNotification, - IOServiceMatching(darwin_device_class), - darwin_devices_detached, - ctx, &libusb_rem_device_iterator); - - if (kresult != kIOReturnSuccess) { - usbi_err (ctx, "could not add hotplug event source: %s", darwin_error_str (kresult)); - - pthread_exit (NULL); - } - - /* create notifications for attached devices */ - kresult = IOServiceAddMatchingNotification(libusb_notification_port, kIOFirstMatchNotification, - IOServiceMatching(darwin_device_class), - darwin_devices_attached, - ctx, &libusb_add_device_iterator); - - if (kresult != kIOReturnSuccess) { - usbi_err (ctx, "could not add hotplug event source: %s", darwin_error_str (kresult)); - - pthread_exit (NULL); - } - - /* arm notifiers */ - darwin_clear_iterator (libusb_rem_device_iterator); - darwin_clear_iterator (libusb_add_device_iterator); - - usbi_dbg ("darwin event thread ready to receive events"); - - /* signal the main thread that the hotplug runloop has been created. */ - pthread_mutex_lock (&libusb_darwin_at_mutex); - libusb_darwin_acfl = runloop; - pthread_cond_signal (&libusb_darwin_at_cond); - pthread_mutex_unlock (&libusb_darwin_at_mutex); - - /* run the runloop */ - CFRunLoopRun(); - - usbi_dbg ("darwin event thread exiting"); - - /* remove the notification cfsource */ - CFRunLoopRemoveSource(runloop, libusb_notification_cfsource, kCFRunLoopDefaultMode); - - /* remove the shutdown cfsource */ - CFRunLoopRemoveSource(runloop, libusb_darwin_acfls, kCFRunLoopDefaultMode); - - /* delete notification port */ - IONotificationPortDestroy (libusb_notification_port); - - /* delete iterators */ - IOObjectRelease (libusb_rem_device_iterator); - IOObjectRelease (libusb_add_device_iterator); - - CFRelease (libusb_darwin_acfls); - CFRelease (runloop); - - libusb_darwin_acfls = NULL; - libusb_darwin_acfl = NULL; - - pthread_exit (NULL); -} - -/* cleanup function to destroy cached devices */ -static void __attribute__((destructor)) _darwin_finalize(void) { - struct darwin_cached_device *dev, *next; - - usbi_mutex_lock(&darwin_cached_devices_lock); - list_for_each_entry_safe(dev, next, &darwin_cached_devices, list, struct darwin_cached_device) { - darwin_deref_cached_device(dev); - } - usbi_mutex_unlock(&darwin_cached_devices_lock); -} - -static void darwin_check_version (void) { - /* adjust for changes in the USB stack in xnu 15 */ - int sysctl_args[] = {CTL_KERN, KERN_OSRELEASE}; - long version; - char version_string[256] = {'\0',}; - size_t length = 256; - - sysctl(sysctl_args, 2, version_string, &length, NULL, 0); - - errno = 0; - version = strtol (version_string, NULL, 10); - if (0 == errno && version >= 15) { - darwin_device_class = "IOUSBHostDevice"; - } -} - -static int darwin_init(struct libusb_context *ctx) { - host_name_port_t host_self; - int rc; - - rc = pthread_once (&darwin_init_once, darwin_check_version); - if (rc) { - return LIBUSB_ERROR_OTHER; - } - - rc = darwin_scan_devices (ctx); - if (LIBUSB_SUCCESS != rc) { - return rc; - } - - if (libusb_darwin_atomic_fetch_add (&initCount, 1) == 0) { - /* create the clocks that will be used */ - - host_self = mach_host_self(); - host_get_clock_service(host_self, CALENDAR_CLOCK, &clock_realtime); - host_get_clock_service(host_self, SYSTEM_CLOCK, &clock_monotonic); - mach_port_deallocate(mach_task_self(), host_self); - - pthread_create (&libusb_darwin_at, NULL, darwin_event_thread_main, ctx); - - pthread_mutex_lock (&libusb_darwin_at_mutex); - while (!libusb_darwin_acfl) - pthread_cond_wait (&libusb_darwin_at_cond, &libusb_darwin_at_mutex); - pthread_mutex_unlock (&libusb_darwin_at_mutex); - } - - return rc; -} - -static void darwin_exit (void) { - if (libusb_darwin_atomic_fetch_add (&initCount, -1) == 1) { - mach_port_deallocate(mach_task_self(), clock_realtime); - mach_port_deallocate(mach_task_self(), clock_monotonic); - - /* stop the event runloop and wait for the thread to terminate. */ - CFRunLoopSourceSignal(libusb_darwin_acfls); - CFRunLoopWakeUp (libusb_darwin_acfl); - pthread_join (libusb_darwin_at, NULL); - } -} - -static int darwin_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian) { - struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev); - - /* return cached copy */ - memmove (buffer, &(priv->dev_descriptor), DEVICE_DESC_LENGTH); - - *host_endian = 0; - - return 0; -} - -static int get_configuration_index (struct libusb_device *dev, int config_value) { - struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev); - UInt8 i, numConfig; - IOUSBConfigurationDescriptorPtr desc; - IOReturn kresult; - - /* is there a simpler way to determine the index? */ - kresult = (*(priv->device))->GetNumberOfConfigurations (priv->device, &numConfig); - if (kresult != kIOReturnSuccess) - return darwin_to_libusb (kresult); - - for (i = 0 ; i < numConfig ; i++) { - (*(priv->device))->GetConfigurationDescriptorPtr (priv->device, i, &desc); - - if (desc->bConfigurationValue == config_value) - return i; - } - - /* configuration not found */ - return LIBUSB_ERROR_NOT_FOUND; -} - -static int darwin_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian) { - struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev); - int config_index; - - if (0 == priv->active_config) - return LIBUSB_ERROR_NOT_FOUND; - - config_index = get_configuration_index (dev, priv->active_config); - if (config_index < 0) - return config_index; - - return darwin_get_config_descriptor (dev, config_index, buffer, len, host_endian); -} - -static int darwin_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) { - struct darwin_cached_device *priv = DARWIN_CACHED_DEVICE(dev); - IOUSBConfigurationDescriptorPtr desc; - IOReturn kresult; - int ret; - - if (!priv || !priv->device) - return LIBUSB_ERROR_OTHER; - - kresult = (*priv->device)->GetConfigurationDescriptorPtr (priv->device, config_index, &desc); - if (kresult == kIOReturnSuccess) { - /* copy descriptor */ - if (libusb_le16_to_cpu(desc->wTotalLength) < len) - len = libusb_le16_to_cpu(desc->wTotalLength); - - memmove (buffer, desc, len); - - /* GetConfigurationDescriptorPtr returns the descriptor in USB bus order */ - *host_endian = 0; - } - - ret = darwin_to_libusb (kresult); - if (ret != LIBUSB_SUCCESS) - return ret; - - return (int) len; -} - -/* check whether the os has configured the device */ -static int darwin_check_configuration (struct libusb_context *ctx, struct darwin_cached_device *dev) { - usb_device_t **darwin_device = dev->device; - - IOUSBConfigurationDescriptorPtr configDesc; - IOUSBFindInterfaceRequest request; - kern_return_t kresult; - io_iterator_t interface_iterator; - io_service_t firstInterface; - - if (dev->dev_descriptor.bNumConfigurations < 1) { - usbi_err (ctx, "device has no configurations"); - return LIBUSB_ERROR_OTHER; /* no configurations at this speed so we can't use it */ - } - - /* checking the configuration of a root hub simulation takes ~1 s in 10.11. the device is - not usable anyway */ - if (0x05ac == dev->dev_descriptor.idVendor && 0x8005 == dev->dev_descriptor.idProduct) { - usbi_dbg ("ignoring configuration on root hub simulation"); - dev->active_config = 0; - return 0; - } - - /* find the first configuration */ - kresult = (*darwin_device)->GetConfigurationDescriptorPtr (darwin_device, 0, &configDesc); - dev->first_config = (kIOReturnSuccess == kresult) ? configDesc->bConfigurationValue : 1; - - /* check if the device is already configured. there is probably a better way than iterating over the - to accomplish this (the trick is we need to avoid a call to GetConfigurations since buggy devices - might lock up on the device request) */ - - /* Setup the Interface Request */ - request.bInterfaceClass = kIOUSBFindInterfaceDontCare; - request.bInterfaceSubClass = kIOUSBFindInterfaceDontCare; - request.bInterfaceProtocol = kIOUSBFindInterfaceDontCare; - request.bAlternateSetting = kIOUSBFindInterfaceDontCare; - - kresult = (*(darwin_device))->CreateInterfaceIterator(darwin_device, &request, &interface_iterator); - if (kresult) - return darwin_to_libusb (kresult); - - /* iterate once */ - firstInterface = IOIteratorNext(interface_iterator); - - /* done with the interface iterator */ - IOObjectRelease(interface_iterator); - - if (firstInterface) { - IOObjectRelease (firstInterface); - - /* device is configured */ - if (dev->dev_descriptor.bNumConfigurations == 1) - /* to avoid problems with some devices get the configurations value from the configuration descriptor */ - dev->active_config = dev->first_config; - else - /* devices with more than one configuration should work with GetConfiguration */ - (*darwin_device)->GetConfiguration (darwin_device, &dev->active_config); - } else - /* not configured */ - dev->active_config = 0; - - usbi_dbg ("active config: %u, first config: %u", dev->active_config, dev->first_config); - - return 0; -} - -static int darwin_request_descriptor (usb_device_t **device, UInt8 desc, UInt8 desc_index, void *buffer, size_t buffer_size) { - IOUSBDevRequestTO req; - - memset (buffer, 0, buffer_size); - - /* Set up request for descriptor/ */ - req.bmRequestType = USBmakebmRequestType(kUSBIn, kUSBStandard, kUSBDevice); - req.bRequest = kUSBRqGetDescriptor; - req.wValue = desc << 8; - req.wIndex = desc_index; - req.wLength = buffer_size; - req.pData = buffer; - req.noDataTimeout = 20; - req.completionTimeout = 100; - - return (*device)->DeviceRequestTO (device, &req); -} - -static int darwin_cache_device_descriptor (struct libusb_context *ctx, struct darwin_cached_device *dev) { - usb_device_t **device = dev->device; - int retries = 1, delay = 30000; - int unsuspended = 0, try_unsuspend = 1, try_reconfigure = 1; - int is_open = 0; - int ret = 0, ret2; - UInt8 bDeviceClass; - UInt16 idProduct, idVendor; - - dev->can_enumerate = 0; - - (*device)->GetDeviceClass (device, &bDeviceClass); - (*device)->GetDeviceProduct (device, &idProduct); - (*device)->GetDeviceVendor (device, &idVendor); - - /* According to Apple's documentation the device must be open for DeviceRequest but we may not be able to open some - * devices and Apple's USB Prober doesn't bother to open the device before issuing a descriptor request. Still, - * to follow the spec as closely as possible, try opening the device */ - is_open = ((*device)->USBDeviceOpenSeize(device) == kIOReturnSuccess); - - do { - /**** retrieve device descriptor ****/ - ret = darwin_request_descriptor (device, kUSBDeviceDesc, 0, &dev->dev_descriptor, sizeof(dev->dev_descriptor)); - - if (kIOReturnOverrun == ret && kUSBDeviceDesc == dev->dev_descriptor.bDescriptorType) - /* received an overrun error but we still received a device descriptor */ - ret = kIOReturnSuccess; - - if (kIOUSBVendorIDAppleComputer == idVendor) { - /* NTH: don't bother retrying or unsuspending Apple devices */ - break; - } - - if (kIOReturnSuccess == ret && (0 == dev->dev_descriptor.bNumConfigurations || - 0 == dev->dev_descriptor.bcdUSB)) { - /* work around for incorrectly configured devices */ - if (try_reconfigure && is_open) { - usbi_dbg("descriptor appears to be invalid. resetting configuration before trying again..."); - - /* set the first configuration */ - (*device)->SetConfiguration(device, 1); - - /* don't try to reconfigure again */ - try_reconfigure = 0; - } - - ret = kIOUSBPipeStalled; - } - - if (kIOReturnSuccess != ret && is_open && try_unsuspend) { - /* device may be suspended. unsuspend it and try again */ -#if DeviceVersion >= 320 - UInt32 info = 0; - - /* IOUSBFamily 320+ provides a way to detect device suspension but earlier versions do not */ - (void)(*device)->GetUSBDeviceInformation (device, &info); - - /* note that the device was suspended */ - if (info & (1 << kUSBInformationDeviceIsSuspendedBit) || 0 == info) - try_unsuspend = 1; -#endif - - if (try_unsuspend) { - /* try to unsuspend the device */ - ret2 = (*device)->USBDeviceSuspend (device, 0); - if (kIOReturnSuccess != ret2) { - /* prevent log spew from poorly behaving devices. this indicates the - os actually had trouble communicating with the device */ - usbi_dbg("could not retrieve device descriptor. failed to unsuspend: %s",darwin_error_str(ret2)); - } else - unsuspended = 1; - - try_unsuspend = 0; - } - } - - if (kIOReturnSuccess != ret) { - usbi_dbg("kernel responded with code: 0x%08x. sleeping for %d ms before trying again", ret, delay/1000); - /* sleep for a little while before trying again */ - nanosleep(&(struct timespec){delay / 1000000, (delay * 1000) % 1000000000UL}, NULL); - } - } while (kIOReturnSuccess != ret && retries--); - - if (unsuspended) - /* resuspend the device */ - (void)(*device)->USBDeviceSuspend (device, 1); - - if (is_open) - (void) (*device)->USBDeviceClose (device); - - if (ret != kIOReturnSuccess) { - /* a debug message was already printed out for this error */ - if (LIBUSB_CLASS_HUB == bDeviceClass) - usbi_dbg ("could not retrieve device descriptor %.4x:%.4x: %s (%x). skipping device", - idVendor, idProduct, darwin_error_str (ret), ret); - else - usbi_warn (ctx, "could not retrieve device descriptor %.4x:%.4x: %s (%x). skipping device", - idVendor, idProduct, darwin_error_str (ret), ret); - return darwin_to_libusb (ret); - } - - /* catch buggy hubs (which appear to be virtual). Apple's own USB prober has problems with these devices. */ - if (libusb_le16_to_cpu (dev->dev_descriptor.idProduct) != idProduct) { - /* not a valid device */ - usbi_warn (ctx, "idProduct from iokit (%04x) does not match idProduct in descriptor (%04x). skipping device", - idProduct, libusb_le16_to_cpu (dev->dev_descriptor.idProduct)); - return LIBUSB_ERROR_NO_DEVICE; - } - - usbi_dbg ("cached device descriptor:"); - usbi_dbg (" bDescriptorType: 0x%02x", dev->dev_descriptor.bDescriptorType); - usbi_dbg (" bcdUSB: 0x%04x", dev->dev_descriptor.bcdUSB); - usbi_dbg (" bDeviceClass: 0x%02x", dev->dev_descriptor.bDeviceClass); - usbi_dbg (" bDeviceSubClass: 0x%02x", dev->dev_descriptor.bDeviceSubClass); - usbi_dbg (" bDeviceProtocol: 0x%02x", dev->dev_descriptor.bDeviceProtocol); - usbi_dbg (" bMaxPacketSize0: 0x%02x", dev->dev_descriptor.bMaxPacketSize0); - usbi_dbg (" idVendor: 0x%04x", dev->dev_descriptor.idVendor); - usbi_dbg (" idProduct: 0x%04x", dev->dev_descriptor.idProduct); - usbi_dbg (" bcdDevice: 0x%04x", dev->dev_descriptor.bcdDevice); - usbi_dbg (" iManufacturer: 0x%02x", dev->dev_descriptor.iManufacturer); - usbi_dbg (" iProduct: 0x%02x", dev->dev_descriptor.iProduct); - usbi_dbg (" iSerialNumber: 0x%02x", dev->dev_descriptor.iSerialNumber); - usbi_dbg (" bNumConfigurations: 0x%02x", dev->dev_descriptor.bNumConfigurations); - - dev->can_enumerate = 1; - - return LIBUSB_SUCCESS; -} - -static int get_device_port (io_service_t service, UInt8 *port) { - kern_return_t result; - io_service_t parent; - int ret = 0; - - if (get_ioregistry_value_number (service, CFSTR("PortNum"), kCFNumberSInt8Type, port)) { - return 1; - } - - result = IORegistryEntryGetParentEntry (service, kIOServicePlane, &parent); - if (kIOReturnSuccess == result) { - ret = get_ioregistry_value_data (parent, CFSTR("port"), 1, port); - IOObjectRelease (parent); - } - - return ret; -} - -static int darwin_get_cached_device(struct libusb_context *ctx, io_service_t service, - struct darwin_cached_device **cached_out) { - struct darwin_cached_device *new_device; - UInt64 sessionID = 0, parent_sessionID = 0; - int ret = LIBUSB_SUCCESS; - usb_device_t **device; - io_service_t parent; - kern_return_t result; - UInt8 port = 0; - - /* get some info from the io registry */ - (void) get_ioregistry_value_number (service, CFSTR("sessionID"), kCFNumberSInt64Type, &sessionID); - if (!get_device_port (service, &port)) { - usbi_dbg("could not get connected port number"); - } - - usbi_dbg("finding cached device for sessionID 0x%" PRIx64, sessionID); - - result = IORegistryEntryGetParentEntry (service, kIOUSBPlane, &parent); - - if (kIOReturnSuccess == result) { - (void) get_ioregistry_value_number (parent, CFSTR("sessionID"), kCFNumberSInt64Type, &parent_sessionID); - IOObjectRelease(parent); - } - - usbi_mutex_lock(&darwin_cached_devices_lock); - do { - *cached_out = NULL; - - list_for_each_entry(new_device, &darwin_cached_devices, list, struct darwin_cached_device) { - usbi_dbg("matching sessionID 0x%" PRIx64 " against cached device with sessionID 0x%" PRIx64, sessionID, new_device->session); - if (new_device->session == sessionID) { - usbi_dbg("using cached device for device"); - *cached_out = new_device; - break; - } - } - - if (*cached_out) - break; - - usbi_dbg("caching new device with sessionID 0x%" PRIx64, sessionID); - - device = darwin_device_from_service (service); - if (!device) { - ret = LIBUSB_ERROR_NO_DEVICE; - break; - } - - new_device = calloc (1, sizeof (*new_device)); - if (!new_device) { - ret = LIBUSB_ERROR_NO_MEM; - break; - } - - /* add this device to the cached device list */ - list_add(&new_device->list, &darwin_cached_devices); - - (*device)->GetDeviceAddress (device, (USBDeviceAddress *)&new_device->address); - - /* keep a reference to this device */ - darwin_ref_cached_device(new_device); - - new_device->device = device; - new_device->session = sessionID; - (*device)->GetLocationID (device, &new_device->location); - new_device->port = port; - new_device->parent_session = parent_sessionID; - - /* cache the device descriptor */ - ret = darwin_cache_device_descriptor(ctx, new_device); - if (ret) - break; - - if (new_device->can_enumerate) { - snprintf(new_device->sys_path, 20, "%03i-%04x-%04x-%02x-%02x", new_device->address, - new_device->dev_descriptor.idVendor, new_device->dev_descriptor.idProduct, - new_device->dev_descriptor.bDeviceClass, new_device->dev_descriptor.bDeviceSubClass); - } - } while (0); - - usbi_mutex_unlock(&darwin_cached_devices_lock); - - /* keep track of devices regardless of if we successfully enumerate them to - prevent them from being enumerated multiple times */ - - *cached_out = new_device; - - return ret; -} - -static int process_new_device (struct libusb_context *ctx, io_service_t service) { - struct darwin_device_priv *priv; - struct libusb_device *dev = NULL; - struct darwin_cached_device *cached_device; - UInt8 devSpeed; - int ret = 0; - - do { - ret = darwin_get_cached_device (ctx, service, &cached_device); - - if (ret < 0 || !cached_device->can_enumerate) { - return ret; - } - - /* check current active configuration (and cache the first configuration value-- - which may be used by claim_interface) */ - ret = darwin_check_configuration (ctx, cached_device); - if (ret) - break; - - usbi_dbg ("allocating new device in context %p for with session 0x%" PRIx64, - ctx, cached_device->session); - - dev = usbi_alloc_device(ctx, (unsigned long) cached_device->session); - if (!dev) { - return LIBUSB_ERROR_NO_MEM; - } - - priv = (struct darwin_device_priv *)dev->os_priv; - - priv->dev = cached_device; - darwin_ref_cached_device (priv->dev); - - if (cached_device->parent_session > 0) { - dev->parent_dev = usbi_get_device_by_session_id (ctx, (unsigned long) cached_device->parent_session); - } else { - dev->parent_dev = NULL; - } - dev->port_number = cached_device->port; - dev->bus_number = cached_device->location >> 24; - dev->device_address = cached_device->address; - - (*(priv->dev->device))->GetDeviceSpeed (priv->dev->device, &devSpeed); - - switch (devSpeed) { - case kUSBDeviceSpeedLow: dev->speed = LIBUSB_SPEED_LOW; break; - case kUSBDeviceSpeedFull: dev->speed = LIBUSB_SPEED_FULL; break; - case kUSBDeviceSpeedHigh: dev->speed = LIBUSB_SPEED_HIGH; break; -#if DeviceVersion >= 500 - case kUSBDeviceSpeedSuper: dev->speed = LIBUSB_SPEED_SUPER; break; -#endif - default: - usbi_warn (ctx, "Got unknown device speed %d", devSpeed); - } - - ret = usbi_sanitize_device (dev); - if (ret < 0) - break; - - usbi_dbg ("found device with address %d port = %d parent = %p at %p", dev->device_address, - dev->port_number, (void *) dev->parent_dev, priv->dev->sys_path); - } while (0); - - if (0 == ret) { - usbi_connect_device (dev); - } else { - libusb_unref_device (dev); - } - - return ret; -} - -static int darwin_scan_devices(struct libusb_context *ctx) { - io_iterator_t deviceIterator; - io_service_t service; - kern_return_t kresult; - - kresult = usb_setup_device_iterator (&deviceIterator, 0); - if (kresult != kIOReturnSuccess) - return darwin_to_libusb (kresult); - - while ((service = IOIteratorNext (deviceIterator))) { - (void) process_new_device (ctx, service); - - IOObjectRelease(service); - } - - IOObjectRelease(deviceIterator); - - return 0; -} - -static int darwin_open (struct libusb_device_handle *dev_handle) { - struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; - struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); - IOReturn kresult; - - if (0 == dpriv->open_count) { - /* try to open the device */ - kresult = (*(dpriv->device))->USBDeviceOpenSeize (dpriv->device); - if (kresult != kIOReturnSuccess) { - usbi_warn (HANDLE_CTX (dev_handle), "USBDeviceOpen: %s", darwin_error_str(kresult)); - - if (kIOReturnExclusiveAccess != kresult) { - return darwin_to_libusb (kresult); - } - - /* it is possible to perform some actions on a device that is not open so do not return an error */ - priv->is_open = 0; - } else { - priv->is_open = 1; - } - - /* create async event source */ - kresult = (*(dpriv->device))->CreateDeviceAsyncEventSource (dpriv->device, &priv->cfSource); - if (kresult != kIOReturnSuccess) { - usbi_err (HANDLE_CTX (dev_handle), "CreateDeviceAsyncEventSource: %s", darwin_error_str(kresult)); - - if (priv->is_open) { - (*(dpriv->device))->USBDeviceClose (dpriv->device); - } - - priv->is_open = 0; - - return darwin_to_libusb (kresult); - } - - CFRetain (libusb_darwin_acfl); - - /* add the cfSource to the aync run loop */ - CFRunLoopAddSource(libusb_darwin_acfl, priv->cfSource, kCFRunLoopCommonModes); - } - - /* device opened successfully */ - dpriv->open_count++; - - usbi_dbg ("device open for access"); - - return 0; -} - -static void darwin_close (struct libusb_device_handle *dev_handle) { - struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; - struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); - IOReturn kresult; - int i; - - if (dpriv->open_count == 0) { - /* something is probably very wrong if this is the case */ - usbi_err (HANDLE_CTX (dev_handle), "Close called on a device that was not open!"); - return; - } - - dpriv->open_count--; - - /* make sure all interfaces are released */ - for (i = 0 ; i < USB_MAXINTERFACES ; i++) - if (dev_handle->claimed_interfaces & (1 << i)) - libusb_release_interface (dev_handle, i); - - if (0 == dpriv->open_count) { - /* delete the device's async event source */ - if (priv->cfSource) { - CFRunLoopRemoveSource (libusb_darwin_acfl, priv->cfSource, kCFRunLoopDefaultMode); - CFRelease (priv->cfSource); - priv->cfSource = NULL; - CFRelease (libusb_darwin_acfl); - } - - if (priv->is_open) { - /* close the device */ - kresult = (*(dpriv->device))->USBDeviceClose(dpriv->device); - if (kresult) { - /* Log the fact that we had a problem closing the file, however failing a - * close isn't really an error, so return success anyway */ - usbi_warn (HANDLE_CTX (dev_handle), "USBDeviceClose: %s", darwin_error_str(kresult)); - } - } - } -} - -static int darwin_get_configuration(struct libusb_device_handle *dev_handle, int *config) { - struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); - - *config = (int) dpriv->active_config; - - return 0; -} - -static int darwin_set_configuration(struct libusb_device_handle *dev_handle, int config) { - struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); - IOReturn kresult; - int i; - - /* Setting configuration will invalidate the interface, so we need - to reclaim it. First, dispose of existing interfaces, if any. */ - for (i = 0 ; i < USB_MAXINTERFACES ; i++) - if (dev_handle->claimed_interfaces & (1 << i)) - darwin_release_interface (dev_handle, i); - - kresult = (*(dpriv->device))->SetConfiguration (dpriv->device, config); - if (kresult != kIOReturnSuccess) - return darwin_to_libusb (kresult); - - /* Reclaim any interfaces. */ - for (i = 0 ; i < USB_MAXINTERFACES ; i++) - if (dev_handle->claimed_interfaces & (1 << i)) - darwin_claim_interface (dev_handle, i); - - dpriv->active_config = config; - - return 0; -} - -static int darwin_get_interface (usb_device_t **darwin_device, uint8_t ifc, io_service_t *usbInterfacep) { - IOUSBFindInterfaceRequest request; - kern_return_t kresult; - io_iterator_t interface_iterator; - UInt8 bInterfaceNumber; - int ret; - - *usbInterfacep = IO_OBJECT_NULL; - - /* Setup the Interface Request */ - request.bInterfaceClass = kIOUSBFindInterfaceDontCare; - request.bInterfaceSubClass = kIOUSBFindInterfaceDontCare; - request.bInterfaceProtocol = kIOUSBFindInterfaceDontCare; - request.bAlternateSetting = kIOUSBFindInterfaceDontCare; - - kresult = (*(darwin_device))->CreateInterfaceIterator(darwin_device, &request, &interface_iterator); - if (kresult) - return kresult; - - while ((*usbInterfacep = IOIteratorNext(interface_iterator))) { - /* find the interface number */ - ret = get_ioregistry_value_number (*usbInterfacep, CFSTR("bInterfaceNumber"), kCFNumberSInt8Type, - &bInterfaceNumber); - - if (ret && bInterfaceNumber == ifc) { - break; - } - - (void) IOObjectRelease (*usbInterfacep); - } - - /* done with the interface iterator */ - IOObjectRelease(interface_iterator); - - return 0; -} - -static int get_endpoints (struct libusb_device_handle *dev_handle, int iface) { - struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; - - /* current interface */ - struct darwin_interface *cInterface = &priv->interfaces[iface]; - - kern_return_t kresult; - - u_int8_t numep, direction, number; - u_int8_t dont_care1, dont_care3; - u_int16_t dont_care2; - int rc; - - usbi_dbg ("building table of endpoints."); - - /* retrieve the total number of endpoints on this interface */ - kresult = (*(cInterface->interface))->GetNumEndpoints(cInterface->interface, &numep); - if (kresult) { - usbi_err (HANDLE_CTX (dev_handle), "can't get number of endpoints for interface: %s", darwin_error_str(kresult)); - return darwin_to_libusb (kresult); - } - - /* iterate through pipe references */ - for (int i = 1 ; i <= numep ; i++) { - kresult = (*(cInterface->interface))->GetPipeProperties(cInterface->interface, i, &direction, &number, &dont_care1, - &dont_care2, &dont_care3); - - if (kresult != kIOReturnSuccess) { - /* probably a buggy device. try to get the endpoint address from the descriptors */ - struct libusb_config_descriptor *config; - const struct libusb_endpoint_descriptor *endpoint_desc; - UInt8 alt_setting; - - kresult = (*(cInterface->interface))->GetAlternateSetting (cInterface->interface, &alt_setting); - if (kresult) { - usbi_err (HANDLE_CTX (dev_handle), "can't get alternate setting for interface"); - return darwin_to_libusb (kresult); - } - - rc = libusb_get_active_config_descriptor (dev_handle->dev, &config); - if (LIBUSB_SUCCESS != rc) { - return rc; - } - - endpoint_desc = config->interface[iface].altsetting[alt_setting].endpoint + i - 1; - - cInterface->endpoint_addrs[i - 1] = endpoint_desc->bEndpointAddress; - } else { - cInterface->endpoint_addrs[i - 1] = (((kUSBIn == direction) << kUSBRqDirnShift) | (number & LIBUSB_ENDPOINT_ADDRESS_MASK)); - } - - usbi_dbg ("interface: %i pipe %i: dir: %i number: %i", iface, i, cInterface->endpoint_addrs[i - 1] >> kUSBRqDirnShift, - cInterface->endpoint_addrs[i - 1] & LIBUSB_ENDPOINT_ADDRESS_MASK); - } - - cInterface->num_endpoints = numep; - - return 0; -} - -static int darwin_claim_interface(struct libusb_device_handle *dev_handle, int iface) { - struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); - struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; - io_service_t usbInterface = IO_OBJECT_NULL; - IOReturn kresult; - IOCFPlugInInterface **plugInInterface = NULL; - SInt32 score; - - /* current interface */ - struct darwin_interface *cInterface = &priv->interfaces[iface]; - - kresult = darwin_get_interface (dpriv->device, iface, &usbInterface); - if (kresult != kIOReturnSuccess) - return darwin_to_libusb (kresult); - - /* make sure we have an interface */ - if (!usbInterface && dpriv->first_config != 0) { - usbi_info (HANDLE_CTX (dev_handle), "no interface found; setting configuration: %d", dpriv->first_config); - - /* set the configuration */ - kresult = darwin_set_configuration (dev_handle, dpriv->first_config); - if (kresult != LIBUSB_SUCCESS) { - usbi_err (HANDLE_CTX (dev_handle), "could not set configuration"); - return kresult; - } - - kresult = darwin_get_interface (dpriv->device, iface, &usbInterface); - if (kresult) { - usbi_err (HANDLE_CTX (dev_handle), "darwin_get_interface: %s", darwin_error_str(kresult)); - return darwin_to_libusb (kresult); - } - } - - if (!usbInterface) { - usbi_err (HANDLE_CTX (dev_handle), "interface not found"); - return LIBUSB_ERROR_NOT_FOUND; - } - - /* get an interface to the device's interface */ - kresult = IOCreatePlugInInterfaceForService (usbInterface, kIOUSBInterfaceUserClientTypeID, - kIOCFPlugInInterfaceID, &plugInInterface, &score); - - /* ignore release error */ - (void)IOObjectRelease (usbInterface); - - if (kresult) { - usbi_err (HANDLE_CTX (dev_handle), "IOCreatePlugInInterfaceForService: %s", darwin_error_str(kresult)); - return darwin_to_libusb (kresult); - } - - if (!plugInInterface) { - usbi_err (HANDLE_CTX (dev_handle), "plugin interface not found"); - return LIBUSB_ERROR_NOT_FOUND; - } - - /* Do the actual claim */ - kresult = (*plugInInterface)->QueryInterface(plugInInterface, - CFUUIDGetUUIDBytes(kIOUSBInterfaceInterfaceID), - (LPVOID)&cInterface->interface); - /* We no longer need the intermediate plug-in */ - /* Use release instead of IODestroyPlugInInterface to avoid stopping IOServices associated with this device */ - (*plugInInterface)->Release (plugInInterface); - if (kresult || !cInterface->interface) { - usbi_err (HANDLE_CTX (dev_handle), "QueryInterface: %s", darwin_error_str(kresult)); - return darwin_to_libusb (kresult); - } - - /* claim the interface */ - kresult = (*(cInterface->interface))->USBInterfaceOpen(cInterface->interface); - if (kresult) { - usbi_err (HANDLE_CTX (dev_handle), "USBInterfaceOpen: %s", darwin_error_str(kresult)); - return darwin_to_libusb (kresult); - } - - /* update list of endpoints */ - kresult = get_endpoints (dev_handle, iface); - if (kresult) { - /* this should not happen */ - darwin_release_interface (dev_handle, iface); - usbi_err (HANDLE_CTX (dev_handle), "could not build endpoint table"); - return kresult; - } - - cInterface->cfSource = NULL; - - /* create async event source */ - kresult = (*(cInterface->interface))->CreateInterfaceAsyncEventSource (cInterface->interface, &cInterface->cfSource); - if (kresult != kIOReturnSuccess) { - usbi_err (HANDLE_CTX (dev_handle), "could not create async event source"); - - /* can't continue without an async event source */ - (void)darwin_release_interface (dev_handle, iface); - - return darwin_to_libusb (kresult); - } - - /* add the cfSource to the async thread's run loop */ - CFRunLoopAddSource(libusb_darwin_acfl, cInterface->cfSource, kCFRunLoopDefaultMode); - - usbi_dbg ("interface opened"); - - return 0; -} - -static int darwin_release_interface(struct libusb_device_handle *dev_handle, int iface) { - struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; - IOReturn kresult; - - /* current interface */ - struct darwin_interface *cInterface = &priv->interfaces[iface]; - - /* Check to see if an interface is open */ - if (!cInterface->interface) - return LIBUSB_SUCCESS; - - /* clean up endpoint data */ - cInterface->num_endpoints = 0; - - /* delete the interface's async event source */ - if (cInterface->cfSource) { - CFRunLoopRemoveSource (libusb_darwin_acfl, cInterface->cfSource, kCFRunLoopDefaultMode); - CFRelease (cInterface->cfSource); - } - - kresult = (*(cInterface->interface))->USBInterfaceClose(cInterface->interface); - if (kresult) - usbi_warn (HANDLE_CTX (dev_handle), "USBInterfaceClose: %s", darwin_error_str(kresult)); - - kresult = (*(cInterface->interface))->Release(cInterface->interface); - if (kresult != kIOReturnSuccess) - usbi_warn (HANDLE_CTX (dev_handle), "Release: %s", darwin_error_str(kresult)); - - cInterface->interface = (usb_interface_t **) IO_OBJECT_NULL; - - return darwin_to_libusb (kresult); -} - -static int darwin_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) { - struct darwin_device_handle_priv *priv = (struct darwin_device_handle_priv *)dev_handle->os_priv; - IOReturn kresult; - - /* current interface */ - struct darwin_interface *cInterface = &priv->interfaces[iface]; - - if (!cInterface->interface) - return LIBUSB_ERROR_NO_DEVICE; - - kresult = (*(cInterface->interface))->SetAlternateInterface (cInterface->interface, altsetting); - if (kresult != kIOReturnSuccess) - darwin_reset_device (dev_handle); - - /* update list of endpoints */ - kresult = get_endpoints (dev_handle, iface); - if (kresult) { - /* this should not happen */ - darwin_release_interface (dev_handle, iface); - usbi_err (HANDLE_CTX (dev_handle), "could not build endpoint table"); - return kresult; - } - - return darwin_to_libusb (kresult); -} - -static int darwin_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) { - /* current interface */ - struct darwin_interface *cInterface; - IOReturn kresult; - uint8_t pipeRef; - - /* determine the interface/endpoint to use */ - if (ep_to_pipeRef (dev_handle, endpoint, &pipeRef, NULL, &cInterface) != 0) { - usbi_err (HANDLE_CTX (dev_handle), "endpoint not found on any open interface"); - - return LIBUSB_ERROR_NOT_FOUND; - } - - /* newer versions of darwin support clearing additional bits on the device's endpoint */ - kresult = (*(cInterface->interface))->ClearPipeStallBothEnds(cInterface->interface, pipeRef); - if (kresult) - usbi_warn (HANDLE_CTX (dev_handle), "ClearPipeStall: %s", darwin_error_str (kresult)); - - return darwin_to_libusb (kresult); -} - -static int darwin_reset_device(struct libusb_device_handle *dev_handle) { - struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); - IOUSBDeviceDescriptor descriptor; - IOUSBConfigurationDescriptorPtr cached_configuration; - IOUSBConfigurationDescriptor configuration; - bool reenumerate = false; - IOReturn kresult; - int i; - - kresult = (*(dpriv->device))->ResetDevice (dpriv->device); - if (kresult) { - usbi_err (HANDLE_CTX (dev_handle), "ResetDevice: %s", darwin_error_str (kresult)); - return darwin_to_libusb (kresult); - } - - do { - usbi_dbg ("darwin/reset_device: checking if device descriptor changed"); - - /* ignore return code. if we can't get a descriptor it might be worthwhile re-enumerating anway */ - (void) darwin_request_descriptor (dpriv->device, kUSBDeviceDesc, 0, &descriptor, sizeof (descriptor)); - - /* check if the device descriptor has changed */ - if (0 != memcmp (&dpriv->dev_descriptor, &descriptor, sizeof (descriptor))) { - reenumerate = true; - break; - } - - /* check if any configuration descriptor has changed */ - for (i = 0 ; i < descriptor.bNumConfigurations ; ++i) { - usbi_dbg ("darwin/reset_device: checking if configuration descriptor %d changed", i); - - (void) darwin_request_descriptor (dpriv->device, kUSBConfDesc, i, &configuration, sizeof (configuration)); - (*(dpriv->device))->GetConfigurationDescriptorPtr (dpriv->device, i, &cached_configuration); - - if (!cached_configuration || 0 != memcmp (cached_configuration, &configuration, sizeof (configuration))) { - reenumerate = true; - break; - } - } - } while (0); - - if (reenumerate) { - usbi_dbg ("darwin/reset_device: device requires reenumeration"); - (void) (*(dpriv->device))->USBDeviceReEnumerate (dpriv->device, 0); - return LIBUSB_ERROR_NOT_FOUND; - } - - usbi_dbg ("darwin/reset_device: device reset complete"); - - return LIBUSB_SUCCESS; -} - -static int darwin_kernel_driver_active(struct libusb_device_handle *dev_handle, int interface) { - struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(dev_handle->dev); - io_service_t usbInterface; - CFTypeRef driver; - IOReturn kresult; - - kresult = darwin_get_interface (dpriv->device, interface, &usbInterface); - if (kresult) { - usbi_err (HANDLE_CTX (dev_handle), "darwin_get_interface: %s", darwin_error_str(kresult)); - - return darwin_to_libusb (kresult); - } - - driver = IORegistryEntryCreateCFProperty (usbInterface, kIOBundleIdentifierKey, kCFAllocatorDefault, 0); - IOObjectRelease (usbInterface); - - if (driver) { - CFRelease (driver); - - return 1; - } - - /* no driver */ - return 0; -} - -/* attaching/detaching kernel drivers is not currently supported (maybe in the future?) */ -static int darwin_attach_kernel_driver (struct libusb_device_handle *dev_handle, int interface) { - UNUSED(dev_handle); - UNUSED(interface); - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static int darwin_detach_kernel_driver (struct libusb_device_handle *dev_handle, int interface) { - UNUSED(dev_handle); - UNUSED(interface); - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static void darwin_destroy_device(struct libusb_device *dev) { - struct darwin_device_priv *dpriv = (struct darwin_device_priv *) dev->os_priv; - - if (dpriv->dev) { - /* need to hold the lock in case this is the last reference to the device */ - usbi_mutex_lock(&darwin_cached_devices_lock); - darwin_deref_cached_device (dpriv->dev); - dpriv->dev = NULL; - usbi_mutex_unlock(&darwin_cached_devices_lock); - } -} - -static int submit_bulk_transfer(struct usbi_transfer *itransfer) { - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - IOReturn ret; - uint8_t transferType; - /* None of the values below are used in libusbx for bulk transfers */ - uint8_t direction, number, interval, pipeRef; - uint16_t maxPacketSize; - - struct darwin_interface *cInterface; - - if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) { - usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); - - return LIBUSB_ERROR_NOT_FOUND; - } - - ret = (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number, - &transferType, &maxPacketSize, &interval); - - if (ret) { - usbi_err (TRANSFER_CTX (transfer), "bulk transfer failed (dir = %s): %s (code = 0x%08x)", IS_XFERIN(transfer) ? "In" : "Out", - darwin_error_str(ret), ret); - return darwin_to_libusb (ret); - } - - if (0 != (transfer->length % maxPacketSize)) { - /* do not need a zero packet */ - transfer->flags &= ~LIBUSB_TRANSFER_ADD_ZERO_PACKET; - } - - /* submit the request */ - /* timeouts are unavailable on interrupt endpoints */ - if (transferType == kUSBInterrupt) { - if (IS_XFERIN(transfer)) - ret = (*(cInterface->interface))->ReadPipeAsync(cInterface->interface, pipeRef, transfer->buffer, - transfer->length, darwin_async_io_callback, itransfer); - else - ret = (*(cInterface->interface))->WritePipeAsync(cInterface->interface, pipeRef, transfer->buffer, - transfer->length, darwin_async_io_callback, itransfer); - } else { - itransfer->timeout_flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT; - - if (IS_XFERIN(transfer)) - ret = (*(cInterface->interface))->ReadPipeAsyncTO(cInterface->interface, pipeRef, transfer->buffer, - transfer->length, transfer->timeout, transfer->timeout, - darwin_async_io_callback, (void *)itransfer); - else - ret = (*(cInterface->interface))->WritePipeAsyncTO(cInterface->interface, pipeRef, transfer->buffer, - transfer->length, transfer->timeout, transfer->timeout, - darwin_async_io_callback, (void *)itransfer); - } - - if (ret) - usbi_err (TRANSFER_CTX (transfer), "bulk transfer failed (dir = %s): %s (code = 0x%08x)", IS_XFERIN(transfer) ? "In" : "Out", - darwin_error_str(ret), ret); - - return darwin_to_libusb (ret); -} - -#if InterfaceVersion >= 550 -static int submit_stream_transfer(struct usbi_transfer *itransfer) { - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct darwin_interface *cInterface; - uint8_t pipeRef; - IOReturn ret; - - if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) { - usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); - - return LIBUSB_ERROR_NOT_FOUND; - } - - itransfer->timeout_flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT; - - if (IS_XFERIN(transfer)) - ret = (*(cInterface->interface))->ReadStreamsPipeAsyncTO(cInterface->interface, pipeRef, itransfer->stream_id, - transfer->buffer, transfer->length, transfer->timeout, - transfer->timeout, darwin_async_io_callback, (void *)itransfer); - else - ret = (*(cInterface->interface))->WriteStreamsPipeAsyncTO(cInterface->interface, pipeRef, itransfer->stream_id, - transfer->buffer, transfer->length, transfer->timeout, - transfer->timeout, darwin_async_io_callback, (void *)itransfer); - - if (ret) - usbi_err (TRANSFER_CTX (transfer), "bulk stream transfer failed (dir = %s): %s (code = 0x%08x)", IS_XFERIN(transfer) ? "In" : "Out", - darwin_error_str(ret), ret); - - return darwin_to_libusb (ret); -} -#endif - -static int submit_iso_transfer(struct usbi_transfer *itransfer) { - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); - - IOReturn kresult; - uint8_t direction, number, interval, pipeRef, transferType; - uint16_t maxPacketSize; - UInt64 frame; - AbsoluteTime atTime; - int i; - - struct darwin_interface *cInterface; - - /* construct an array of IOUSBIsocFrames, reuse the old one if possible */ - if (tpriv->isoc_framelist && tpriv->num_iso_packets != transfer->num_iso_packets) { - free(tpriv->isoc_framelist); - tpriv->isoc_framelist = NULL; - } - - if (!tpriv->isoc_framelist) { - tpriv->num_iso_packets = transfer->num_iso_packets; - tpriv->isoc_framelist = (IOUSBIsocFrame*) calloc (transfer->num_iso_packets, sizeof(IOUSBIsocFrame)); - if (!tpriv->isoc_framelist) - return LIBUSB_ERROR_NO_MEM; - } - - /* copy the frame list from the libusb descriptor (the structures differ only is member order) */ - for (i = 0 ; i < transfer->num_iso_packets ; i++) - tpriv->isoc_framelist[i].frReqCount = transfer->iso_packet_desc[i].length; - - /* determine the interface/endpoint to use */ - if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) { - usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); - - return LIBUSB_ERROR_NOT_FOUND; - } - - /* determine the properties of this endpoint and the speed of the device */ - (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number, - &transferType, &maxPacketSize, &interval); - - /* Last but not least we need the bus frame number */ - kresult = (*(cInterface->interface))->GetBusFrameNumber(cInterface->interface, &frame, &atTime); - if (kresult) { - usbi_err (TRANSFER_CTX (transfer), "failed to get bus frame number: %d", kresult); - free(tpriv->isoc_framelist); - tpriv->isoc_framelist = NULL; - - return darwin_to_libusb (kresult); - } - - (*(cInterface->interface))->GetPipeProperties (cInterface->interface, pipeRef, &direction, &number, - &transferType, &maxPacketSize, &interval); - - /* schedule for a frame a little in the future */ - frame += 4; - - if (cInterface->frames[transfer->endpoint] && frame < cInterface->frames[transfer->endpoint]) - frame = cInterface->frames[transfer->endpoint]; - - /* submit the request */ - if (IS_XFERIN(transfer)) - kresult = (*(cInterface->interface))->ReadIsochPipeAsync(cInterface->interface, pipeRef, transfer->buffer, frame, - transfer->num_iso_packets, tpriv->isoc_framelist, darwin_async_io_callback, - itransfer); - else - kresult = (*(cInterface->interface))->WriteIsochPipeAsync(cInterface->interface, pipeRef, transfer->buffer, frame, - transfer->num_iso_packets, tpriv->isoc_framelist, darwin_async_io_callback, - itransfer); - - if (LIBUSB_SPEED_FULL == transfer->dev_handle->dev->speed) - /* Full speed */ - cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets * (1 << (interval - 1)); - else - /* High/super speed */ - cInterface->frames[transfer->endpoint] = frame + transfer->num_iso_packets * (1 << (interval - 1)) / 8; - - if (kresult != kIOReturnSuccess) { - usbi_err (TRANSFER_CTX (transfer), "isochronous transfer failed (dir: %s): %s", IS_XFERIN(transfer) ? "In" : "Out", - darwin_error_str(kresult)); - free (tpriv->isoc_framelist); - tpriv->isoc_framelist = NULL; - } - - return darwin_to_libusb (kresult); -} - -static int submit_control_transfer(struct usbi_transfer *itransfer) { - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_control_setup *setup = (struct libusb_control_setup *) transfer->buffer; - struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(transfer->dev_handle->dev); - struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); - - IOReturn kresult; - - memset(&tpriv->req, 0, sizeof(tpriv->req)); - - /* IOUSBDeviceInterface expects the request in cpu endianness */ - tpriv->req.bmRequestType = setup->bmRequestType; - tpriv->req.bRequest = setup->bRequest; - /* these values should be in bus order from libusb_fill_control_setup */ - tpriv->req.wValue = OSSwapLittleToHostInt16 (setup->wValue); - tpriv->req.wIndex = OSSwapLittleToHostInt16 (setup->wIndex); - tpriv->req.wLength = OSSwapLittleToHostInt16 (setup->wLength); - /* data is stored after the libusb control block */ - tpriv->req.pData = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; - tpriv->req.completionTimeout = transfer->timeout; - tpriv->req.noDataTimeout = transfer->timeout; - - itransfer->timeout_flags |= USBI_TRANSFER_OS_HANDLES_TIMEOUT; - - /* all transfers in libusb-1.0 are async */ - - if (transfer->endpoint) { - struct darwin_interface *cInterface; - uint8_t pipeRef; - - if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface) != 0) { - usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); - - return LIBUSB_ERROR_NOT_FOUND; - } - - kresult = (*(cInterface->interface))->ControlRequestAsyncTO (cInterface->interface, pipeRef, &(tpriv->req), darwin_async_io_callback, itransfer); - } else - /* control request on endpoint 0 */ - kresult = (*(dpriv->device))->DeviceRequestAsyncTO(dpriv->device, &(tpriv->req), darwin_async_io_callback, itransfer); - - if (kresult != kIOReturnSuccess) - usbi_err (TRANSFER_CTX (transfer), "control request failed: %s", darwin_error_str(kresult)); - - return darwin_to_libusb (kresult); -} - -static int darwin_submit_transfer(struct usbi_transfer *itransfer) { - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - return submit_control_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - return submit_bulk_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - return submit_iso_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: -#if InterfaceVersion >= 550 - return submit_stream_transfer(itransfer); -#else - usbi_err (TRANSFER_CTX(transfer), "IOUSBFamily version does not support bulk stream transfers"); - return LIBUSB_ERROR_NOT_SUPPORTED; -#endif - default: - usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -static int cancel_control_transfer(struct usbi_transfer *itransfer) { - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(transfer->dev_handle->dev); - IOReturn kresult; - - usbi_warn (ITRANSFER_CTX (itransfer), "aborting all transactions control pipe"); - - if (!dpriv->device) - return LIBUSB_ERROR_NO_DEVICE; - - kresult = (*(dpriv->device))->USBDeviceAbortPipeZero (dpriv->device); - - return darwin_to_libusb (kresult); -} - -static int darwin_abort_transfers (struct usbi_transfer *itransfer) { - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct darwin_cached_device *dpriv = DARWIN_CACHED_DEVICE(transfer->dev_handle->dev); - struct darwin_interface *cInterface; - uint8_t pipeRef, iface; - IOReturn kresult; - - if (ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, &iface, &cInterface) != 0) { - usbi_err (TRANSFER_CTX (transfer), "endpoint not found on any open interface"); - - return LIBUSB_ERROR_NOT_FOUND; - } - - if (!dpriv->device) - return LIBUSB_ERROR_NO_DEVICE; - - usbi_warn (ITRANSFER_CTX (itransfer), "aborting all transactions on interface %d pipe %d", iface, pipeRef); - - /* abort transactions */ -#if InterfaceVersion >= 550 - if (LIBUSB_TRANSFER_TYPE_BULK_STREAM == transfer->type) - (*(cInterface->interface))->AbortStreamsPipe (cInterface->interface, pipeRef, itransfer->stream_id); - else -#endif - (*(cInterface->interface))->AbortPipe (cInterface->interface, pipeRef); - - usbi_dbg ("calling clear pipe stall to clear the data toggle bit"); - - /* newer versions of darwin support clearing additional bits on the device's endpoint */ - kresult = (*(cInterface->interface))->ClearPipeStallBothEnds(cInterface->interface, pipeRef); - - return darwin_to_libusb (kresult); -} - -static int darwin_cancel_transfer(struct usbi_transfer *itransfer) { - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - return cancel_control_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - return darwin_abort_transfers (itransfer); - default: - usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -static void darwin_clear_transfer_priv (struct usbi_transfer *itransfer) { - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); - - if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS && tpriv->isoc_framelist) { - free (tpriv->isoc_framelist); - tpriv->isoc_framelist = NULL; - } -} - -static void darwin_async_io_callback (void *refcon, IOReturn result, void *arg0) { - struct usbi_transfer *itransfer = (struct usbi_transfer *)refcon; - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); - - usbi_dbg ("an async io operation has completed"); - - /* if requested write a zero packet */ - if (kIOReturnSuccess == result && IS_XFEROUT(transfer) && transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) { - struct darwin_interface *cInterface; - uint8_t pipeRef; - - (void) ep_to_pipeRef (transfer->dev_handle, transfer->endpoint, &pipeRef, NULL, &cInterface); - - (*(cInterface->interface))->WritePipe (cInterface->interface, pipeRef, transfer->buffer, 0); - } - - tpriv->result = result; - tpriv->size = (UInt32) (uintptr_t) arg0; - - /* signal the core that this transfer is complete */ - usbi_signal_transfer_completion(itransfer); -} - -static int darwin_transfer_status (struct usbi_transfer *itransfer, kern_return_t result) { - if (itransfer->timeout_flags & USBI_TRANSFER_TIMED_OUT) - result = kIOUSBTransactionTimeout; - - switch (result) { - case kIOReturnUnderrun: - case kIOReturnSuccess: - return LIBUSB_TRANSFER_COMPLETED; - case kIOReturnAborted: - return LIBUSB_TRANSFER_CANCELLED; - case kIOUSBPipeStalled: - usbi_dbg ("transfer error: pipe is stalled"); - return LIBUSB_TRANSFER_STALL; - case kIOReturnOverrun: - usbi_warn (ITRANSFER_CTX (itransfer), "transfer error: data overrun"); - return LIBUSB_TRANSFER_OVERFLOW; - case kIOUSBTransactionTimeout: - usbi_warn (ITRANSFER_CTX (itransfer), "transfer error: timed out"); - itransfer->timeout_flags |= USBI_TRANSFER_TIMED_OUT; - return LIBUSB_TRANSFER_TIMED_OUT; - default: - usbi_warn (ITRANSFER_CTX (itransfer), "transfer error: %s (value = 0x%08x)", darwin_error_str (result), result); - return LIBUSB_TRANSFER_ERROR; - } -} - -static int darwin_handle_transfer_completion (struct usbi_transfer *itransfer) { - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct darwin_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); - int isIsoc = LIBUSB_TRANSFER_TYPE_ISOCHRONOUS == transfer->type; - int isBulk = LIBUSB_TRANSFER_TYPE_BULK == transfer->type; - int isControl = LIBUSB_TRANSFER_TYPE_CONTROL == transfer->type; - int isInterrupt = LIBUSB_TRANSFER_TYPE_INTERRUPT == transfer->type; - int i; - - if (!isIsoc && !isBulk && !isControl && !isInterrupt) { - usbi_err (TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); - return LIBUSB_ERROR_INVALID_PARAM; - } - - usbi_dbg ("handling %s completion with kernel status %d", - isControl ? "control" : isBulk ? "bulk" : isIsoc ? "isoc" : "interrupt", tpriv->result); - - if (kIOReturnSuccess == tpriv->result || kIOReturnUnderrun == tpriv->result) { - if (isIsoc && tpriv->isoc_framelist) { - /* copy isochronous results back */ - - for (i = 0; i < transfer->num_iso_packets ; i++) { - struct libusb_iso_packet_descriptor *lib_desc = &transfer->iso_packet_desc[i]; - lib_desc->status = darwin_to_libusb (tpriv->isoc_framelist[i].frStatus); - lib_desc->actual_length = tpriv->isoc_framelist[i].frActCount; - } - } else if (!isIsoc) - itransfer->transferred += tpriv->size; - } - - /* it is ok to handle cancelled transfers without calling usbi_handle_transfer_cancellation (we catch timeout transfers) */ - return usbi_handle_transfer_completion (itransfer, darwin_transfer_status (itransfer, tpriv->result)); -} - -static int darwin_clock_gettime(int clk_id, struct timespec *tp) { - mach_timespec_t sys_time; - clock_serv_t clock_ref; - - switch (clk_id) { - case USBI_CLOCK_REALTIME: - /* CLOCK_REALTIME represents time since the epoch */ - clock_ref = clock_realtime; - break; - case USBI_CLOCK_MONOTONIC: - /* use system boot time as reference for the monotonic clock */ - clock_ref = clock_monotonic; - break; - default: - return LIBUSB_ERROR_INVALID_PARAM; - } - - clock_get_time (clock_ref, &sys_time); - - tp->tv_sec = sys_time.tv_sec; - tp->tv_nsec = sys_time.tv_nsec; - - return 0; -} - -#if InterfaceVersion >= 550 -static int darwin_alloc_streams (struct libusb_device_handle *dev_handle, uint32_t num_streams, unsigned char *endpoints, - int num_endpoints) { - struct darwin_interface *cInterface; - UInt32 supportsStreams; - uint8_t pipeRef; - int rc, i; - - /* find the mimimum number of supported streams on the endpoint list */ - for (i = 0 ; i < num_endpoints ; ++i) { - if (0 != (rc = ep_to_pipeRef (dev_handle, endpoints[i], &pipeRef, NULL, &cInterface))) { - return rc; - } - - (*(cInterface->interface))->SupportsStreams (cInterface->interface, pipeRef, &supportsStreams); - if (num_streams > supportsStreams) - num_streams = supportsStreams; - } - - /* it is an error if any endpoint in endpoints does not support streams */ - if (0 == num_streams) - return LIBUSB_ERROR_INVALID_PARAM; - - /* create the streams */ - for (i = 0 ; i < num_endpoints ; ++i) { - (void) ep_to_pipeRef (dev_handle, endpoints[i], &pipeRef, NULL, &cInterface); - - rc = (*(cInterface->interface))->CreateStreams (cInterface->interface, pipeRef, num_streams); - if (kIOReturnSuccess != rc) - return darwin_to_libusb(rc); - } - - return num_streams; -} - -static int darwin_free_streams (struct libusb_device_handle *dev_handle, unsigned char *endpoints, int num_endpoints) { - struct darwin_interface *cInterface; - UInt32 supportsStreams; - uint8_t pipeRef; - int rc; - - for (int i = 0 ; i < num_endpoints ; ++i) { - if (0 != (rc = ep_to_pipeRef (dev_handle, endpoints[i], &pipeRef, NULL, &cInterface))) - return rc; - - (*(cInterface->interface))->SupportsStreams (cInterface->interface, pipeRef, &supportsStreams); - if (0 == supportsStreams) - return LIBUSB_ERROR_INVALID_PARAM; - - rc = (*(cInterface->interface))->CreateStreams (cInterface->interface, pipeRef, 0); - if (kIOReturnSuccess != rc) - return darwin_to_libusb(rc); - } - - return LIBUSB_SUCCESS; -} -#endif - -const struct usbi_os_backend darwin_backend = { - .name = "Darwin", - .caps = 0, - .init = darwin_init, - .exit = darwin_exit, - .get_device_list = NULL, /* not needed */ - .get_device_descriptor = darwin_get_device_descriptor, - .get_active_config_descriptor = darwin_get_active_config_descriptor, - .get_config_descriptor = darwin_get_config_descriptor, - .hotplug_poll = darwin_hotplug_poll, - - .open = darwin_open, - .close = darwin_close, - .get_configuration = darwin_get_configuration, - .set_configuration = darwin_set_configuration, - .claim_interface = darwin_claim_interface, - .release_interface = darwin_release_interface, - - .set_interface_altsetting = darwin_set_interface_altsetting, - .clear_halt = darwin_clear_halt, - .reset_device = darwin_reset_device, - -#if InterfaceVersion >= 550 - .alloc_streams = darwin_alloc_streams, - .free_streams = darwin_free_streams, -#endif - - .kernel_driver_active = darwin_kernel_driver_active, - .detach_kernel_driver = darwin_detach_kernel_driver, - .attach_kernel_driver = darwin_attach_kernel_driver, - - .destroy_device = darwin_destroy_device, - - .submit_transfer = darwin_submit_transfer, - .cancel_transfer = darwin_cancel_transfer, - .clear_transfer_priv = darwin_clear_transfer_priv, - - .handle_transfer_completion = darwin_handle_transfer_completion, - - .clock_gettime = darwin_clock_gettime, - - .device_priv_size = sizeof(struct darwin_device_priv), - .device_handle_priv_size = sizeof(struct darwin_device_handle_priv), - .transfer_priv_size = sizeof(struct darwin_transfer_priv), -}; diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/darwin_usb.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/darwin_usb.h deleted file mode 100644 index 118043421a3a..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/darwin_usb.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - * darwin backend for libusb 1.0 - * Copyright © 2008-2015 Nathan Hjelm - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#if !defined(LIBUSB_DARWIN_H) -#define LIBUSB_DARWIN_H - -#include "libusbi.h" - -#include -#include -#include -#include - -/* IOUSBInterfaceInferface */ -#if defined (kIOUSBInterfaceInterfaceID700) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9 - -#define usb_interface_t IOUSBInterfaceInterface700 -#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID700 -#define InterfaceVersion 700 - -#elif defined (kIOUSBInterfaceInterfaceID550) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9 - -#define usb_interface_t IOUSBInterfaceInterface550 -#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID550 -#define InterfaceVersion 550 - -#elif defined (kIOUSBInterfaceInterfaceID500) - -#define usb_interface_t IOUSBInterfaceInterface500 -#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID500 -#define InterfaceVersion 500 - -#elif defined (kIOUSBInterfaceInterfaceID300) - -#define usb_interface_t IOUSBInterfaceInterface300 -#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID300 -#define InterfaceVersion 300 - -#elif defined (kIOUSBInterfaceInterfaceID245) - -#define usb_interface_t IOUSBInterfaceInterface245 -#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID245 -#define InterfaceVersion 245 - -#elif defined (kIOUSBInterfaceInterfaceID220) - -#define usb_interface_t IOUSBInterfaceInterface220 -#define InterfaceInterfaceID kIOUSBInterfaceInterfaceID220 -#define InterfaceVersion 220 - -#else - -#error "IOUSBFamily is too old. Please upgrade your OS" - -#endif - -/* IOUSBDeviceInterface */ -#if defined (kIOUSBDeviceInterfaceID500) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_9 - -#define usb_device_t IOUSBDeviceInterface500 -#define DeviceInterfaceID kIOUSBDeviceInterfaceID500 -#define DeviceVersion 500 - -#elif defined (kIOUSBDeviceInterfaceID320) - -#define usb_device_t IOUSBDeviceInterface320 -#define DeviceInterfaceID kIOUSBDeviceInterfaceID320 -#define DeviceVersion 320 - -#elif defined (kIOUSBDeviceInterfaceID300) - -#define usb_device_t IOUSBDeviceInterface300 -#define DeviceInterfaceID kIOUSBDeviceInterfaceID300 -#define DeviceVersion 300 - -#elif defined (kIOUSBDeviceInterfaceID245) - -#define usb_device_t IOUSBDeviceInterface245 -#define DeviceInterfaceID kIOUSBDeviceInterfaceID245 -#define DeviceVersion 245 - -#elif defined (kIOUSBDeviceInterfaceID220) -#define usb_device_t IOUSBDeviceInterface197 -#define DeviceInterfaceID kIOUSBDeviceInterfaceID197 -#define DeviceVersion 197 - -#else - -#error "IOUSBFamily is too old. Please upgrade your OS" - -#endif - -#if !defined(IO_OBJECT_NULL) -#define IO_OBJECT_NULL ((io_object_t) 0) -#endif - -typedef IOCFPlugInInterface *io_cf_plugin_ref_t; -typedef IONotificationPortRef io_notification_port_t; - -/* private structures */ -struct darwin_cached_device { - struct list_head list; - IOUSBDeviceDescriptor dev_descriptor; - UInt32 location; - UInt64 parent_session; - UInt64 session; - UInt16 address; - char sys_path[21]; - usb_device_t **device; - int open_count; - UInt8 first_config, active_config, port; - int can_enumerate; - int refcount; -}; - -struct darwin_device_priv { - struct darwin_cached_device *dev; -}; - -struct darwin_device_handle_priv { - int is_open; - CFRunLoopSourceRef cfSource; - - struct darwin_interface { - usb_interface_t **interface; - uint8_t num_endpoints; - CFRunLoopSourceRef cfSource; - uint64_t frames[256]; - uint8_t endpoint_addrs[USB_MAXENDPOINTS]; - } interfaces[USB_MAXINTERFACES]; -}; - -struct darwin_transfer_priv { - /* Isoc */ - IOUSBIsocFrame *isoc_framelist; - int num_iso_packets; - - /* Control */ - IOUSBDevRequestTO req; - - /* Bulk */ - - /* Completion status */ - IOReturn result; - UInt32 size; -}; - -#endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_pollfs.cpp b/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_pollfs.cpp deleted file mode 100644 index e0c771320619..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_pollfs.cpp +++ /dev/null @@ -1,367 +0,0 @@ -/* - * Copyright 2007-2008, Haiku Inc. All rights reserved. - * Distributed under the terms of the MIT License. - * - * Authors: - * Michael Lotz - */ - -#include "haiku_usb.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -class WatchedEntry { -public: - WatchedEntry(BMessenger *, entry_ref *); - ~WatchedEntry(); - bool EntryCreated(entry_ref *ref); - bool EntryRemoved(ino_t node); - bool InitCheck(); - -private: - BMessenger* fMessenger; - node_ref fNode; - bool fIsDirectory; - USBDevice* fDevice; - WatchedEntry* fEntries; - WatchedEntry* fLink; - bool fInitCheck; -}; - - -class RosterLooper : public BLooper { -public: - RosterLooper(USBRoster *); - void Stop(); - virtual void MessageReceived(BMessage *); - bool InitCheck(); - -private: - USBRoster* fRoster; - WatchedEntry* fRoot; - BMessenger* fMessenger; - bool fInitCheck; -}; - - -WatchedEntry::WatchedEntry(BMessenger *messenger, entry_ref *ref) - : fMessenger(messenger), - fIsDirectory(false), - fDevice(NULL), - fEntries(NULL), - fLink(NULL), - fInitCheck(false) -{ - BEntry entry(ref); - entry.GetNodeRef(&fNode); - - BDirectory directory; - if (entry.IsDirectory() && directory.SetTo(ref) >= B_OK) { - fIsDirectory = true; - - while (directory.GetNextEntry(&entry) >= B_OK) { - if (entry.GetRef(ref) < B_OK) - continue; - - WatchedEntry *child = new(std::nothrow) WatchedEntry(fMessenger, ref); - if (child == NULL) - continue; - if (child->InitCheck() == false) { - delete child; - continue; - } - - child->fLink = fEntries; - fEntries = child; - } - - watch_node(&fNode, B_WATCH_DIRECTORY, *fMessenger); - } - else { - if (strncmp(ref->name, "raw", 3) == 0) - return; - - BPath path, parent_path; - entry.GetPath(&path); - fDevice = new(std::nothrow) USBDevice(path.Path()); - if (fDevice != NULL && fDevice->InitCheck() == true) { - // Add this new device to each active context's device list - struct libusb_context *ctx; - unsigned long session_id = (unsigned long)&fDevice; - - usbi_mutex_lock(&active_contexts_lock); - list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) { - struct libusb_device *dev = usbi_get_device_by_session_id(ctx, session_id); - if (dev) { - usbi_dbg("using previously allocated device with location %lu", session_id); - libusb_unref_device(dev); - continue; - } - usbi_dbg("allocating new device with location %lu", session_id); - dev = usbi_alloc_device(ctx, session_id); - if (!dev) { - usbi_dbg("device allocation failed"); - continue; - } - *((USBDevice **)dev->os_priv) = fDevice; - - // Calculate pseudo-device-address - int addr, tmp; - if (strcmp(path.Leaf(), "hub") == 0) - tmp = 100; //Random Number - else - sscanf(path.Leaf(), "%d", &tmp); - addr = tmp + 1; - path.GetParent(&parent_path); - while (strcmp(parent_path.Leaf(), "usb") != 0) { - sscanf(parent_path.Leaf(), "%d", &tmp); - addr += tmp + 1; - parent_path.GetParent(&parent_path); - } - sscanf(path.Path(), "/dev/bus/usb/%d", &dev->bus_number); - dev->device_address = addr - (dev->bus_number + 1); - - if (usbi_sanitize_device(dev) < 0) { - usbi_dbg("device sanitization failed"); - libusb_unref_device(dev); - continue; - } - usbi_connect_device(dev); - } - usbi_mutex_unlock(&active_contexts_lock); - } - else if (fDevice) { - delete fDevice; - fDevice = NULL; - return; - } - } - fInitCheck = true; -} - - -WatchedEntry::~WatchedEntry() -{ - if (fIsDirectory) { - watch_node(&fNode, B_STOP_WATCHING, *fMessenger); - - WatchedEntry *child = fEntries; - while (child) { - WatchedEntry *next = child->fLink; - delete child; - child = next; - } - } - - if (fDevice) { - // Remove this device from each active context's device list - struct libusb_context *ctx; - struct libusb_device *dev; - unsigned long session_id = (unsigned long)&fDevice; - - usbi_mutex_lock(&active_contexts_lock); - list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) { - dev = usbi_get_device_by_session_id(ctx, session_id); - if (dev != NULL) { - usbi_disconnect_device(dev); - libusb_unref_device(dev); - } else { - usbi_dbg("device with location %lu not found", session_id); - } - } - usbi_mutex_static_unlock(&active_contexts_lock); - delete fDevice; - } -} - - -bool -WatchedEntry::EntryCreated(entry_ref *ref) -{ - if (!fIsDirectory) - return false; - - if (ref->directory != fNode.node) { - WatchedEntry *child = fEntries; - while (child) { - if (child->EntryCreated(ref)) - return true; - child = child->fLink; - } - return false; - } - - WatchedEntry *child = new(std::nothrow) WatchedEntry(fMessenger, ref); - if (child == NULL) - return false; - child->fLink = fEntries; - fEntries = child; - return true; -} - - -bool -WatchedEntry::EntryRemoved(ino_t node) -{ - if (!fIsDirectory) - return false; - - WatchedEntry *child = fEntries; - WatchedEntry *lastChild = NULL; - while (child) { - if (child->fNode.node == node) { - if (lastChild) - lastChild->fLink = child->fLink; - else - fEntries = child->fLink; - delete child; - return true; - } - - if (child->EntryRemoved(node)) - return true; - - lastChild = child; - child = child->fLink; - } - return false; -} - - -bool -WatchedEntry::InitCheck() -{ - return fInitCheck; -} - - -RosterLooper::RosterLooper(USBRoster *roster) - : BLooper("LibusbRoster Looper"), - fRoster(roster), - fRoot(NULL), - fMessenger(NULL), - fInitCheck(false) -{ - BEntry entry("/dev/bus/usb"); - if (!entry.Exists()) { - usbi_err(NULL, "usb_raw not published"); - return; - } - - Run(); - fMessenger = new(std::nothrow) BMessenger(this); - if (fMessenger == NULL) { - usbi_err(NULL, "error creating BMessenger object"); - return; - } - - if (Lock()) { - entry_ref ref; - entry.GetRef(&ref); - fRoot = new(std::nothrow) WatchedEntry(fMessenger, &ref); - Unlock(); - if (fRoot == NULL) - return; - if (fRoot->InitCheck() == false) { - delete fRoot; - fRoot = NULL; - return; - } - } - fInitCheck = true; -} - - -void -RosterLooper::Stop() -{ - Lock(); - delete fRoot; - delete fMessenger; - Quit(); -} - - -void -RosterLooper::MessageReceived(BMessage *message) -{ - int32 opcode; - if (message->FindInt32("opcode", &opcode) < B_OK) - return; - - switch (opcode) { - case B_ENTRY_CREATED: - { - dev_t device; - ino_t directory; - const char *name; - if (message->FindInt32("device", &device) < B_OK || - message->FindInt64("directory", &directory) < B_OK || - message->FindString("name", &name) < B_OK) - break; - - entry_ref ref(device, directory, name); - fRoot->EntryCreated(&ref); - break; - } - case B_ENTRY_REMOVED: - { - ino_t node; - if (message->FindInt64("node", &node) < B_OK) - break; - fRoot->EntryRemoved(node); - break; - } - } -} - - -bool -RosterLooper::InitCheck() -{ - return fInitCheck; -} - - -USBRoster::USBRoster() - : fLooper(NULL) -{ -} - - -USBRoster::~USBRoster() -{ - Stop(); -} - - -int -USBRoster::Start() -{ - if (fLooper == NULL) { - fLooper = new(std::nothrow) RosterLooper(this); - if (fLooper == NULL || ((RosterLooper *)fLooper)->InitCheck() == false) { - if (fLooper) - fLooper = NULL; - return LIBUSB_ERROR_OTHER; - } - } - return LIBUSB_SUCCESS; -} - - -void -USBRoster::Stop() -{ - if (fLooper) { - ((RosterLooper *)fLooper)->Stop(); - fLooper = NULL; - } -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb.h deleted file mode 100644 index d51ae9eae8fa..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Haiku Backend for libusb - * Copyright © 2014 Akshay Jaggi - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include -#include -#include -#include -#include "libusbi.h" -#include "haiku_usb_raw.h" - -using namespace std; - -class USBDevice; -class USBDeviceHandle; -class USBTransfer; - -class USBDevice { -public: - USBDevice(const char *); - virtual ~USBDevice(); - const char* Location() const; - uint8 CountConfigurations() const; - const usb_device_descriptor* Descriptor() const; - const usb_configuration_descriptor* ConfigurationDescriptor(uint32) const; - const usb_configuration_descriptor* ActiveConfiguration() const; - uint8 EndpointToIndex(uint8) const; - uint8 EndpointToInterface(uint8) const; - int ClaimInterface(int); - int ReleaseInterface(int); - int CheckInterfacesFree(int); - int SetActiveConfiguration(int); - int ActiveConfigurationIndex() const; - bool InitCheck(); -private: - int Initialise(); - unsigned int fClaimedInterfaces; // Max Interfaces can be 32. Using a bitmask - usb_device_descriptor fDeviceDescriptor; - unsigned char** fConfigurationDescriptors; - int fActiveConfiguration; - char* fPath; - map fConfigToIndex; - map* fEndpointToIndex; - map* fEndpointToInterface; - bool fInitCheck; -}; - -class USBDeviceHandle { -public: - USBDeviceHandle(USBDevice *dev); - virtual ~USBDeviceHandle(); - int ClaimInterface(int); - int ReleaseInterface(int); - int SetConfiguration(int); - int SetAltSetting(int, int); - status_t SubmitTransfer(struct usbi_transfer *); - status_t CancelTransfer(USBTransfer *); - bool InitCheck(); -private: - int fRawFD; - static status_t TransfersThread(void *); - void TransfersWorker(); - USBDevice* fUSBDevice; - unsigned int fClaimedInterfaces; - BList fTransfers; - BLocker fTransfersLock; - sem_id fTransfersSem; - thread_id fTransfersThread; - bool fInitCheck; -}; - -class USBTransfer { -public: - USBTransfer(struct usbi_transfer *, USBDevice *); - virtual ~USBTransfer(); - void Do(int); - struct usbi_transfer* UsbiTransfer(); - void SetCancelled(); - bool IsCancelled(); -private: - struct usbi_transfer* fUsbiTransfer; - struct libusb_transfer* fLibusbTransfer; - USBDevice* fUSBDevice; - BLocker fStatusLock; - bool fCancelled; -}; - -class USBRoster { -public: - USBRoster(); - virtual ~USBRoster(); - int Start(); - void Stop(); -private: - void* fLooper; -}; diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_backend.cpp b/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_backend.cpp deleted file mode 100644 index d3de8cc08082..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_backend.cpp +++ /dev/null @@ -1,517 +0,0 @@ -/* - * Haiku Backend for libusb - * Copyright © 2014 Akshay Jaggi - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include -#include -#include -#include -#include - -#include "haiku_usb.h" - -int _errno_to_libusb(int status) -{ - return status; -} - -USBTransfer::USBTransfer(struct usbi_transfer *itransfer, USBDevice *device) -{ - fUsbiTransfer = itransfer; - fLibusbTransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - fUSBDevice = device; - fCancelled = false; -} - -USBTransfer::~USBTransfer() -{ -} - -struct usbi_transfer * -USBTransfer::UsbiTransfer() -{ - return fUsbiTransfer; -} - -void -USBTransfer::SetCancelled() -{ - fCancelled = true; -} - -bool -USBTransfer::IsCancelled() -{ - return fCancelled; -} - -void -USBTransfer::Do(int fRawFD) -{ - switch (fLibusbTransfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - { - struct libusb_control_setup *setup = (struct libusb_control_setup *)fLibusbTransfer->buffer; - usb_raw_command command; - command.control.request_type = setup->bmRequestType; - command.control.request = setup->bRequest; - command.control.value = setup->wValue; - command.control.index = setup->wIndex; - command.control.length = setup->wLength; - command.control.data = fLibusbTransfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; - if (fCancelled) - break; - if (ioctl(fRawFD, B_USB_RAW_COMMAND_CONTROL_TRANSFER, &command, sizeof(command)) || - command.control.status != B_USB_RAW_STATUS_SUCCESS) { - fUsbiTransfer->transferred = -1; - usbi_err(TRANSFER_CTX(fLibusbTransfer), "failed control transfer"); - break; - } - fUsbiTransfer->transferred = command.control.length; - } - break; - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - { - usb_raw_command command; - command.transfer.interface = fUSBDevice->EndpointToInterface(fLibusbTransfer->endpoint); - command.transfer.endpoint = fUSBDevice->EndpointToIndex(fLibusbTransfer->endpoint); - command.transfer.data = fLibusbTransfer->buffer; - command.transfer.length = fLibusbTransfer->length; - if (fCancelled) - break; - if (fLibusbTransfer->type == LIBUSB_TRANSFER_TYPE_BULK) { - if (ioctl(fRawFD, B_USB_RAW_COMMAND_BULK_TRANSFER, &command, sizeof(command)) || - command.transfer.status != B_USB_RAW_STATUS_SUCCESS) { - fUsbiTransfer->transferred = -1; - usbi_err(TRANSFER_CTX(fLibusbTransfer), "failed bulk transfer"); - break; - } - } - else { - if (ioctl(fRawFD, B_USB_RAW_COMMAND_INTERRUPT_TRANSFER, &command, sizeof(command)) || - command.transfer.status != B_USB_RAW_STATUS_SUCCESS) { - fUsbiTransfer->transferred = -1; - usbi_err(TRANSFER_CTX(fLibusbTransfer), "failed interrupt transfer"); - break; - } - } - fUsbiTransfer->transferred = command.transfer.length; - } - break; - // IsochronousTransfers not tested - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - { - usb_raw_command command; - command.isochronous.interface = fUSBDevice->EndpointToInterface(fLibusbTransfer->endpoint); - command.isochronous.endpoint = fUSBDevice->EndpointToIndex(fLibusbTransfer->endpoint); - command.isochronous.data = fLibusbTransfer->buffer; - command.isochronous.length = fLibusbTransfer->length; - command.isochronous.packet_count = fLibusbTransfer->num_iso_packets; - int i; - usb_iso_packet_descriptor *packetDescriptors = new usb_iso_packet_descriptor[fLibusbTransfer->num_iso_packets]; - for (i = 0; i < fLibusbTransfer->num_iso_packets; i++) { - if ((int16)(fLibusbTransfer->iso_packet_desc[i]).length != (fLibusbTransfer->iso_packet_desc[i]).length) { - fUsbiTransfer->transferred = -1; - usbi_err(TRANSFER_CTX(fLibusbTransfer), "failed isochronous transfer"); - break; - } - packetDescriptors[i].request_length = (int16)(fLibusbTransfer->iso_packet_desc[i]).length; - } - if (i < fLibusbTransfer->num_iso_packets) - break; // TODO Handle this error - command.isochronous.packet_descriptors = packetDescriptors; - if (fCancelled) - break; - if (ioctl(fRawFD, B_USB_RAW_COMMAND_ISOCHRONOUS_TRANSFER, &command, sizeof(command)) || - command.isochronous.status != B_USB_RAW_STATUS_SUCCESS) { - fUsbiTransfer->transferred = -1; - usbi_err(TRANSFER_CTX(fLibusbTransfer), "failed isochronous transfer"); - break; - } - for (i = 0; i < fLibusbTransfer->num_iso_packets; i++) { - (fLibusbTransfer->iso_packet_desc[i]).actual_length = packetDescriptors[i].actual_length; - switch (packetDescriptors[i].status) { - case B_OK: - (fLibusbTransfer->iso_packet_desc[i]).status = LIBUSB_TRANSFER_COMPLETED; - break; - default: - (fLibusbTransfer->iso_packet_desc[i]).status = LIBUSB_TRANSFER_ERROR; - break; - } - } - delete[] packetDescriptors; - // Do we put the length of transfer here, for isochronous transfers? - fUsbiTransfer->transferred = command.transfer.length; - } - break; - default: - usbi_err(TRANSFER_CTX(fLibusbTransfer), "Unknown type of transfer"); - } -} - -bool -USBDeviceHandle::InitCheck() -{ - return fInitCheck; -} - -status_t -USBDeviceHandle::TransfersThread(void *self) -{ - USBDeviceHandle *handle = (USBDeviceHandle *)self; - handle->TransfersWorker(); - return B_OK; -} - -void -USBDeviceHandle::TransfersWorker() -{ - while (true) { - status_t status = acquire_sem(fTransfersSem); - if (status == B_BAD_SEM_ID) - break; - if (status == B_INTERRUPTED) - continue; - fTransfersLock.Lock(); - USBTransfer *fPendingTransfer = (USBTransfer *) fTransfers.RemoveItem((int32)0); - fTransfersLock.Unlock(); - fPendingTransfer->Do(fRawFD); - usbi_signal_transfer_completion(fPendingTransfer->UsbiTransfer()); - } -} - -status_t -USBDeviceHandle::SubmitTransfer(struct usbi_transfer *itransfer) -{ - USBTransfer *transfer = new USBTransfer(itransfer, fUSBDevice); - *((USBTransfer **)usbi_transfer_get_os_priv(itransfer)) = transfer; - BAutolock locker(fTransfersLock); - fTransfers.AddItem(transfer); - release_sem(fTransfersSem); - return LIBUSB_SUCCESS; -} - -status_t -USBDeviceHandle::CancelTransfer(USBTransfer *transfer) -{ - transfer->SetCancelled(); - fTransfersLock.Lock(); - bool removed = fTransfers.RemoveItem(transfer); - fTransfersLock.Unlock(); - if(removed) - usbi_signal_transfer_completion(transfer->UsbiTransfer()); - return LIBUSB_SUCCESS; -} - -USBDeviceHandle::USBDeviceHandle(USBDevice *dev) - : - fTransfersThread(-1), - fUSBDevice(dev), - fClaimedInterfaces(0), - fInitCheck(false) -{ - fRawFD = open(dev->Location(), O_RDWR | O_CLOEXEC); - if (fRawFD < 0) { - usbi_err(NULL,"failed to open device"); - return; - } - fTransfersSem = create_sem(0, "Transfers Queue Sem"); - fTransfersThread = spawn_thread(TransfersThread, "Transfer Worker", B_NORMAL_PRIORITY, this); - resume_thread(fTransfersThread); - fInitCheck = true; -} - -USBDeviceHandle::~USBDeviceHandle() -{ - if (fRawFD > 0) - close(fRawFD); - for(int i = 0; i < 32; i++) { - if (fClaimedInterfaces & (1 << i)) - ReleaseInterface(i); - } - delete_sem(fTransfersSem); - if (fTransfersThread > 0) - wait_for_thread(fTransfersThread, NULL); -} - -int -USBDeviceHandle::ClaimInterface(int inumber) -{ - int status = fUSBDevice->ClaimInterface(inumber); - if (status == LIBUSB_SUCCESS) - fClaimedInterfaces |= (1 << inumber); - return status; -} - -int -USBDeviceHandle::ReleaseInterface(int inumber) -{ - fUSBDevice->ReleaseInterface(inumber); - fClaimedInterfaces &= ~(1 << inumber); - return LIBUSB_SUCCESS; -} - -int -USBDeviceHandle::SetConfiguration(int config) -{ - int config_index = fUSBDevice->CheckInterfacesFree(config); - if(config_index == LIBUSB_ERROR_BUSY || config_index == LIBUSB_ERROR_NOT_FOUND) - return config_index; - usb_raw_command command; - command.config.config_index = config_index; - if (ioctl(fRawFD, B_USB_RAW_COMMAND_SET_CONFIGURATION, &command, sizeof(command)) || - command.config.status != B_USB_RAW_STATUS_SUCCESS) { - return _errno_to_libusb(command.config.status); - } - fUSBDevice->SetActiveConfiguration(config_index); - return LIBUSB_SUCCESS; -} - -int -USBDeviceHandle::SetAltSetting(int inumber, int alt) -{ - usb_raw_command command; - command.alternate.config_index = fUSBDevice->ActiveConfigurationIndex(); - command.alternate.interface_index = inumber; - if (ioctl(fRawFD, B_USB_RAW_COMMAND_GET_ACTIVE_ALT_INTERFACE_INDEX, &command, sizeof(command)) || - command.alternate.status != B_USB_RAW_STATUS_SUCCESS) { - usbi_err(NULL, "Error retrieving active alternate interface"); - return _errno_to_libusb(command.alternate.status); - } - if (command.alternate.alternate_info == alt) { - usbi_dbg("Setting alternate interface successful"); - return LIBUSB_SUCCESS; - } - command.alternate.alternate_info = alt; - if (ioctl(fRawFD, B_USB_RAW_COMMAND_SET_ALT_INTERFACE, &command, sizeof(command)) || - command.alternate.status != B_USB_RAW_STATUS_SUCCESS) { //IF IOCTL FAILS DEVICE DISONNECTED PROBABLY - usbi_err(NULL, "Error setting alternate interface"); - return _errno_to_libusb(command.alternate.status); - } - usbi_dbg("Setting alternate interface successful"); - return LIBUSB_SUCCESS; -} - - -USBDevice::USBDevice(const char *path) - : - fPath(NULL), - fActiveConfiguration(0), //0? - fConfigurationDescriptors(NULL), - fClaimedInterfaces(0), - fEndpointToIndex(NULL), - fEndpointToInterface(NULL), - fInitCheck(false) -{ - fPath=strdup(path); - Initialise(); -} - -USBDevice::~USBDevice() -{ - free(fPath); - if (fConfigurationDescriptors) { - for(int i = 0; i < fDeviceDescriptor.num_configurations; i++) { - if (fConfigurationDescriptors[i]) - delete fConfigurationDescriptors[i]; - } - delete[] fConfigurationDescriptors; - } - if (fEndpointToIndex) - delete[] fEndpointToIndex; - if (fEndpointToInterface) - delete[] fEndpointToInterface; -} - -bool -USBDevice::InitCheck() -{ - return fInitCheck; -} - -const char * -USBDevice::Location() const -{ - return fPath; -} - -uint8 -USBDevice::CountConfigurations() const -{ - return fDeviceDescriptor.num_configurations; -} - -const usb_device_descriptor * -USBDevice::Descriptor() const -{ - return &fDeviceDescriptor; -} - -const usb_configuration_descriptor * -USBDevice::ConfigurationDescriptor(uint32 index) const -{ - if (index > CountConfigurations()) - return NULL; - return (usb_configuration_descriptor *) fConfigurationDescriptors[index]; -} - -const usb_configuration_descriptor * -USBDevice::ActiveConfiguration() const -{ - return (usb_configuration_descriptor *) fConfigurationDescriptors[fActiveConfiguration]; -} - -int -USBDevice::ActiveConfigurationIndex() const -{ - return fActiveConfiguration; -} - -int USBDevice::ClaimInterface(int interface) -{ - if (interface > ActiveConfiguration()->number_interfaces) - return LIBUSB_ERROR_NOT_FOUND; - if (fClaimedInterfaces & (1 << interface)) - return LIBUSB_ERROR_BUSY; - fClaimedInterfaces |= (1 << interface); - return LIBUSB_SUCCESS; -} - -int USBDevice::ReleaseInterface(int interface) -{ - fClaimedInterfaces &= ~(1 << interface); - return LIBUSB_SUCCESS; -} - -int -USBDevice::CheckInterfacesFree(int config) -{ - if (fConfigToIndex.count(config) == 0) - return LIBUSB_ERROR_NOT_FOUND; - if (fClaimedInterfaces == 0) - return fConfigToIndex[(uint8)config]; - return LIBUSB_ERROR_BUSY; -} - -int -USBDevice::SetActiveConfiguration(int config_index) -{ - fActiveConfiguration = config_index; - return LIBUSB_SUCCESS; -} - -uint8 -USBDevice::EndpointToIndex(uint8 address) const -{ - return fEndpointToIndex[fActiveConfiguration][address]; -} - -uint8 -USBDevice::EndpointToInterface(uint8 address) const -{ - return fEndpointToInterface[fActiveConfiguration][address]; -} - -int -USBDevice::Initialise() //Do we need more error checking, etc? How to report? -{ - int fRawFD = open(fPath, O_RDWR | O_CLOEXEC); - if (fRawFD < 0) - return B_ERROR; - usb_raw_command command; - command.device.descriptor = &fDeviceDescriptor; - if (ioctl(fRawFD, B_USB_RAW_COMMAND_GET_DEVICE_DESCRIPTOR, &command, sizeof(command)) || - command.device.status != B_USB_RAW_STATUS_SUCCESS) { - close(fRawFD); - return B_ERROR; - } - - fConfigurationDescriptors = new(std::nothrow) unsigned char *[fDeviceDescriptor.num_configurations]; - fEndpointToIndex = new(std::nothrow) map [fDeviceDescriptor.num_configurations]; - fEndpointToInterface = new(std::nothrow) map [fDeviceDescriptor.num_configurations]; - for (int i = 0; i < fDeviceDescriptor.num_configurations; i++) { - usb_configuration_descriptor tmp_config; - command.config.descriptor = &tmp_config; - command.config.config_index = i; - if (ioctl(fRawFD, B_USB_RAW_COMMAND_GET_CONFIGURATION_DESCRIPTOR, &command, sizeof(command)) || - command.config.status != B_USB_RAW_STATUS_SUCCESS) { - usbi_err(NULL, "failed retrieving configuration descriptor"); - close(fRawFD); - return B_ERROR; - } - fConfigToIndex[tmp_config.configuration_value] = i; - fConfigurationDescriptors[i] = new(std::nothrow) unsigned char[tmp_config.total_length]; - command.control.request_type = 128; - command.control.request = 6; - command.control.value = (2 << 8) | i; - command.control.index = 0; - command.control.length = tmp_config.total_length; - command.control.data = fConfigurationDescriptors[i]; - if (ioctl(fRawFD, B_USB_RAW_COMMAND_CONTROL_TRANSFER, &command, sizeof(command)) || - command.control.status!=B_USB_RAW_STATUS_SUCCESS) { - usbi_err(NULL, "failed retrieving full configuration descriptor"); - close(fRawFD); - return B_ERROR; - } - for (int j = 0; j < tmp_config.number_interfaces; j++) { - command.alternate.config_index = i; - command.alternate.interface_index = j; - if (ioctl(fRawFD, B_USB_RAW_COMMAND_GET_ALT_INTERFACE_COUNT, &command, sizeof(command)) || - command.config.status != B_USB_RAW_STATUS_SUCCESS) { - usbi_err(NULL, "failed retrieving number of alternate interfaces"); - close(fRawFD); - return B_ERROR; - } - int num_alternate = command.alternate.alternate_info; - for (int k = 0; k < num_alternate; k++) { - usb_interface_descriptor tmp_interface; - command.interface_etc.config_index = i; - command.interface_etc.interface_index = j; - command.interface_etc.alternate_index = k; - command.interface_etc.descriptor = &tmp_interface; - if (ioctl(fRawFD, B_USB_RAW_COMMAND_GET_INTERFACE_DESCRIPTOR_ETC, &command, sizeof(command)) || - command.config.status != B_USB_RAW_STATUS_SUCCESS) { - usbi_err(NULL, "failed retrieving interface descriptor"); - close(fRawFD); - return B_ERROR; - } - for (int l = 0; l < tmp_interface.num_endpoints; l++) { - usb_endpoint_descriptor tmp_endpoint; - command.endpoint_etc.config_index = i; - command.endpoint_etc.interface_index = j; - command.endpoint_etc.alternate_index = k; - command.endpoint_etc.endpoint_index = l; - command.endpoint_etc.descriptor = &tmp_endpoint; - if (ioctl(fRawFD, B_USB_RAW_COMMAND_GET_ENDPOINT_DESCRIPTOR_ETC, &command, sizeof(command)) || - command.config.status != B_USB_RAW_STATUS_SUCCESS) { - usbi_err(NULL, "failed retrieving endpoint descriptor"); - close(fRawFD); - return B_ERROR; - } - fEndpointToIndex[i][tmp_endpoint.endpoint_address] = l; - fEndpointToInterface[i][tmp_endpoint.endpoint_address] = j; - } - } - } - } - close(fRawFD); - fInitCheck = true; - return B_OK; -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_raw.cpp b/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_raw.cpp deleted file mode 100644 index 77adbd1e60e9..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_raw.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Haiku Backend for libusb - * Copyright © 2014 Akshay Jaggi - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - - -#include -#include -#include -#include -#include - -#include "haiku_usb.h" - -USBRoster gUsbRoster; -int32 gInitCount = 0; - -static int -haiku_init(struct libusb_context *ctx) -{ - if (atomic_add(&gInitCount, 1) == 0) - return gUsbRoster.Start(); - return LIBUSB_SUCCESS; -} - -static void -haiku_exit(void) -{ - if (atomic_add(&gInitCount, -1) == 1) - gUsbRoster.Stop(); -} - -static int -haiku_open(struct libusb_device_handle *dev_handle) -{ - USBDevice *dev = *((USBDevice **)dev_handle->dev->os_priv); - USBDeviceHandle *handle = new(std::nothrow) USBDeviceHandle(dev); - if (handle == NULL) - return LIBUSB_ERROR_NO_MEM; - if (handle->InitCheck() == false) { - delete handle; - return LIBUSB_ERROR_NO_DEVICE; - } - *((USBDeviceHandle **)dev_handle->os_priv) = handle; - return LIBUSB_SUCCESS; -} - -static void -haiku_close(struct libusb_device_handle *dev_handle) -{ - USBDeviceHandle *handle = *((USBDeviceHandle **)dev_handle->os_priv); - if (handle == NULL) - return; - delete handle; - *((USBDeviceHandle **)dev_handle->os_priv) = NULL; -} - -static int -haiku_get_device_descriptor(struct libusb_device *device, unsigned char *buffer, int *host_endian) -{ - USBDevice *dev = *((USBDevice **)device->os_priv); - memcpy(buffer, dev->Descriptor(), DEVICE_DESC_LENGTH); - *host_endian = 0; - return LIBUSB_SUCCESS; -} - -static int -haiku_get_active_config_descriptor(struct libusb_device *device, unsigned char *buffer, size_t len, int *host_endian) -{ - USBDevice *dev = *((USBDevice **)device->os_priv); - const usb_configuration_descriptor *act_config = dev->ActiveConfiguration(); - if (len > act_config->total_length) - return LIBUSB_ERROR_OVERFLOW; - memcpy(buffer, act_config, len); - *host_endian = 0; - return LIBUSB_SUCCESS; -} - -static int -haiku_get_config_descriptor(struct libusb_device *device, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) -{ - USBDevice *dev = *((USBDevice **)device->os_priv); - const usb_configuration_descriptor *config = dev->ConfigurationDescriptor(config_index); - if (config == NULL) { - usbi_err(DEVICE_CTX(device), "failed getting configuration descriptor"); - return LIBUSB_ERROR_INVALID_PARAM; - } - if (len > config->total_length) - len = config->total_length; - memcpy(buffer, config, len); - *host_endian = 0; - return len; -} - -static int -haiku_set_configuration(struct libusb_device_handle *dev_handle, int config) -{ - USBDeviceHandle *handle= *((USBDeviceHandle **)dev_handle->os_priv); - return handle->SetConfiguration(config); -} - -static int -haiku_claim_interface(struct libusb_device_handle *dev_handle, int interface_number) -{ - USBDeviceHandle *handle = *((USBDeviceHandle **)dev_handle->os_priv); - return handle->ClaimInterface(interface_number); -} - -static int -haiku_set_altsetting(struct libusb_device_handle *dev_handle, int interface_number, int altsetting) -{ - USBDeviceHandle *handle = *((USBDeviceHandle **)dev_handle->os_priv); - return handle->SetAltSetting(interface_number, altsetting); -} - -static int -haiku_release_interface(struct libusb_device_handle *dev_handle, int interface_number) -{ - USBDeviceHandle *handle = *((USBDeviceHandle **)dev_handle->os_priv); - haiku_set_altsetting(dev_handle,interface_number, 0); - return handle->ReleaseInterface(interface_number); -} - -static int -haiku_submit_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *fLibusbTransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - USBDeviceHandle *fDeviceHandle = *((USBDeviceHandle **)fLibusbTransfer->dev_handle->os_priv); - return fDeviceHandle->SubmitTransfer(itransfer); -} - -static int -haiku_cancel_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *fLibusbTransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - USBDeviceHandle *fDeviceHandle = *((USBDeviceHandle **)fLibusbTransfer->dev_handle->os_priv); - return fDeviceHandle->CancelTransfer(*((USBTransfer **)usbi_transfer_get_os_priv(itransfer))); -} - -static void -haiku_clear_transfer_priv(struct usbi_transfer *itransfer) -{ - USBTransfer *transfer = *((USBTransfer **)usbi_transfer_get_os_priv(itransfer)); - delete transfer; - *((USBTransfer **)usbi_transfer_get_os_priv(itransfer)) = NULL; -} - -static int -haiku_handle_transfer_completion(struct usbi_transfer *itransfer) -{ - USBTransfer *transfer = *((USBTransfer **)usbi_transfer_get_os_priv(itransfer)); - - usbi_mutex_lock(&itransfer->lock); - if (transfer->IsCancelled()) { - delete transfer; - *((USBTransfer **)usbi_transfer_get_os_priv(itransfer)) = NULL; - usbi_mutex_unlock(&itransfer->lock); - if (itransfer->transferred < 0) - itransfer->transferred = 0; - return usbi_handle_transfer_cancellation(itransfer); - } - libusb_transfer_status status = LIBUSB_TRANSFER_COMPLETED; - if (itransfer->transferred < 0) { - usbi_err(ITRANSFER_CTX(itransfer), "error in transfer"); - status = LIBUSB_TRANSFER_ERROR; - itransfer->transferred = 0; - } - delete transfer; - *((USBTransfer **)usbi_transfer_get_os_priv(itransfer)) = NULL; - usbi_mutex_unlock(&itransfer->lock); - return usbi_handle_transfer_completion(itransfer, status); -} - -static int -haiku_clock_gettime(int clkid, struct timespec *tp) -{ - if (clkid == USBI_CLOCK_REALTIME) - return clock_gettime(CLOCK_REALTIME, tp); - if (clkid == USBI_CLOCK_MONOTONIC) - return clock_gettime(CLOCK_MONOTONIC, tp); - return LIBUSB_ERROR_INVALID_PARAM; -} - -const struct usbi_os_backend haiku_usb_raw_backend = { - /*.name =*/ "Haiku usbfs", - /*.caps =*/ 0, - /*.init =*/ haiku_init, - /*.exit =*/ haiku_exit, - /*.get_device_list =*/ NULL, - /*.hotplug_poll =*/ NULL, - /*.open =*/ haiku_open, - /*.close =*/ haiku_close, - /*.get_device_descriptor =*/ haiku_get_device_descriptor, - /*.get_active_config_descriptor =*/ haiku_get_active_config_descriptor, - /*.get_config_descriptor =*/ haiku_get_config_descriptor, - /*.get_config_descriptor_by_value =*/ NULL, - - - /*.get_configuration =*/ NULL, - /*.set_configuration =*/ haiku_set_configuration, - /*.claim_interface =*/ haiku_claim_interface, - /*.release_interface =*/ haiku_release_interface, - - /*.set_interface_altsetting =*/ haiku_set_altsetting, - /*.clear_halt =*/ NULL, - /*.reset_device =*/ NULL, - - /*.alloc_streams =*/ NULL, - /*.free_streams =*/ NULL, - - /*.dev_mem_alloc =*/ NULL, - /*.dev_mem_free =*/ NULL, - - /*.kernel_driver_active =*/ NULL, - /*.detach_kernel_driver =*/ NULL, - /*.attach_kernel_driver =*/ NULL, - - /*.destroy_device =*/ NULL, - - /*.submit_transfer =*/ haiku_submit_transfer, - /*.cancel_transfer =*/ haiku_cancel_transfer, - /*.clear_transfer_priv =*/ haiku_clear_transfer_priv, - - /*.handle_events =*/ NULL, - /*.handle_transfer_completion =*/ haiku_handle_transfer_completion, - - /*.clock_gettime =*/ haiku_clock_gettime, - -#ifdef USBI_TIMERFD_AVAILABLE - /*.get_timerfd_clockid =*/ NULL, -#endif - - /*.device_priv_size =*/ sizeof(USBDevice *), - /*.device_handle_priv_size =*/ sizeof(USBDeviceHandle *), - /*.transfer_priv_size =*/ sizeof(USBTransfer *), -}; diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_raw.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_raw.h deleted file mode 100644 index 5baf53d7c910..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/haiku_usb_raw.h +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright 2006-2008, Haiku Inc. All rights reserved. - * Distributed under the terms of the MIT License. - */ - -#ifndef _USB_RAW_H_ -#define _USB_RAW_H_ - -#include - -#define B_USB_RAW_PROTOCOL_VERSION 0x0015 -#define B_USB_RAW_ACTIVE_ALTERNATE 0xffffffff - -typedef enum { - B_USB_RAW_COMMAND_GET_VERSION = 0x1000, - - B_USB_RAW_COMMAND_GET_DEVICE_DESCRIPTOR = 0x2000, - B_USB_RAW_COMMAND_GET_CONFIGURATION_DESCRIPTOR, - B_USB_RAW_COMMAND_GET_INTERFACE_DESCRIPTOR, - B_USB_RAW_COMMAND_GET_ENDPOINT_DESCRIPTOR, - B_USB_RAW_COMMAND_GET_STRING_DESCRIPTOR, - B_USB_RAW_COMMAND_GET_GENERIC_DESCRIPTOR, - B_USB_RAW_COMMAND_GET_ALT_INTERFACE_COUNT, - B_USB_RAW_COMMAND_GET_ACTIVE_ALT_INTERFACE_INDEX, - B_USB_RAW_COMMAND_GET_INTERFACE_DESCRIPTOR_ETC, - B_USB_RAW_COMMAND_GET_ENDPOINT_DESCRIPTOR_ETC, - B_USB_RAW_COMMAND_GET_GENERIC_DESCRIPTOR_ETC, - - B_USB_RAW_COMMAND_SET_CONFIGURATION = 0x3000, - B_USB_RAW_COMMAND_SET_FEATURE, - B_USB_RAW_COMMAND_CLEAR_FEATURE, - B_USB_RAW_COMMAND_GET_STATUS, - B_USB_RAW_COMMAND_GET_DESCRIPTOR, - B_USB_RAW_COMMAND_SET_ALT_INTERFACE, - - B_USB_RAW_COMMAND_CONTROL_TRANSFER = 0x4000, - B_USB_RAW_COMMAND_INTERRUPT_TRANSFER, - B_USB_RAW_COMMAND_BULK_TRANSFER, - B_USB_RAW_COMMAND_ISOCHRONOUS_TRANSFER -} usb_raw_command_id; - - -typedef enum { - B_USB_RAW_STATUS_SUCCESS = 0, - - B_USB_RAW_STATUS_FAILED, - B_USB_RAW_STATUS_ABORTED, - B_USB_RAW_STATUS_STALLED, - B_USB_RAW_STATUS_CRC_ERROR, - B_USB_RAW_STATUS_TIMEOUT, - - B_USB_RAW_STATUS_INVALID_CONFIGURATION, - B_USB_RAW_STATUS_INVALID_INTERFACE, - B_USB_RAW_STATUS_INVALID_ENDPOINT, - B_USB_RAW_STATUS_INVALID_STRING, - - B_USB_RAW_STATUS_NO_MEMORY -} usb_raw_command_status; - - -typedef union { - struct { - status_t status; - } version; - - struct { - status_t status; - usb_device_descriptor *descriptor; - } device; - - struct { - status_t status; - usb_configuration_descriptor *descriptor; - uint32 config_index; - } config; - - struct { - status_t status; - uint32 alternate_info; - uint32 config_index; - uint32 interface_index; - } alternate; - - struct { - status_t status; - usb_interface_descriptor *descriptor; - uint32 config_index; - uint32 interface_index; - } interface; - - struct { - status_t status; - usb_interface_descriptor *descriptor; - uint32 config_index; - uint32 interface_index; - uint32 alternate_index; - } interface_etc; - - struct { - status_t status; - usb_endpoint_descriptor *descriptor; - uint32 config_index; - uint32 interface_index; - uint32 endpoint_index; - } endpoint; - - struct { - status_t status; - usb_endpoint_descriptor *descriptor; - uint32 config_index; - uint32 interface_index; - uint32 alternate_index; - uint32 endpoint_index; - } endpoint_etc; - - struct { - status_t status; - usb_descriptor *descriptor; - uint32 config_index; - uint32 interface_index; - uint32 generic_index; - size_t length; - } generic; - - struct { - status_t status; - usb_descriptor *descriptor; - uint32 config_index; - uint32 interface_index; - uint32 alternate_index; - uint32 generic_index; - size_t length; - } generic_etc; - - struct { - status_t status; - usb_string_descriptor *descriptor; - uint32 string_index; - size_t length; - } string; - - struct { - status_t status; - uint8 type; - uint8 index; - uint16 language_id; - void *data; - size_t length; - } descriptor; - - struct { - status_t status; - uint8 request_type; - uint8 request; - uint16 value; - uint16 index; - uint16 length; - void *data; - } control; - - struct { - status_t status; - uint32 interface; - uint32 endpoint; - void *data; - size_t length; - } transfer; - - struct { - status_t status; - uint32 interface; - uint32 endpoint; - void *data; - size_t length; - usb_iso_packet_descriptor *packet_descriptors; - uint32 packet_count; - } isochronous; -} usb_raw_command; - -#endif // _USB_RAW_H_ diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_netlink.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_netlink.c deleted file mode 100644 index 60cf3ad1bd0e..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_netlink.c +++ /dev/null @@ -1,400 +0,0 @@ -/* -*- Mode: C; c-basic-offset:8 ; indent-tabs-mode:t -*- */ -/* - * Linux usbfs backend for libusb - * Copyright (C) 2007-2009 Daniel Drake - * Copyright (c) 2001 Johannes Erdfelt - * Copyright (c) 2013 Nathan Hjelm - * Copyright (c) 2016 Chris Dickens - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef HAVE_ASM_TYPES_H -#include -#endif - -#include -#include - -#include "libusbi.h" -#include "linux_usbfs.h" - -#define NL_GROUP_KERNEL 1 - -static int linux_netlink_socket = -1; -static int netlink_control_pipe[2] = { -1, -1 }; -static pthread_t libusb_linux_event_thread; - -static void *linux_netlink_event_thread_main(void *arg); - -static int set_fd_cloexec_nb(int fd) -{ - int flags; - -#if defined(FD_CLOEXEC) - flags = fcntl(fd, F_GETFD); - if (flags == -1) { - usbi_err(NULL, "failed to get netlink fd flags (%d)", errno); - return -1; - } - - if (!(flags & FD_CLOEXEC)) { - if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) == -1) { - usbi_err(NULL, "failed to set netlink fd flags (%d)", errno); - return -1; - } - } -#endif - - flags = fcntl(fd, F_GETFL); - if (flags == -1) { - usbi_err(NULL, "failed to get netlink fd status flags (%d)", errno); - return -1; - } - - if (!(flags & O_NONBLOCK)) { - if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) { - usbi_err(NULL, "failed to set netlink fd status flags (%d)", errno); - return -1; - } - } - - return 0; -} - -int linux_netlink_start_event_monitor(void) -{ - struct sockaddr_nl sa_nl = { .nl_family = AF_NETLINK, .nl_groups = NL_GROUP_KERNEL }; - int socktype = SOCK_RAW; - int opt = 1; - int ret; - -#if defined(SOCK_CLOEXEC) - socktype |= SOCK_CLOEXEC; -#endif -#if defined(SOCK_NONBLOCK) - socktype |= SOCK_NONBLOCK; -#endif - - linux_netlink_socket = socket(PF_NETLINK, socktype, NETLINK_KOBJECT_UEVENT); - if (linux_netlink_socket == -1 && errno == EINVAL) { - usbi_dbg("failed to create netlink socket of type %d, attempting SOCK_RAW", socktype); - linux_netlink_socket = socket(PF_NETLINK, SOCK_RAW, NETLINK_KOBJECT_UEVENT); - } - - if (linux_netlink_socket == -1) { - usbi_err(NULL, "failed to create netlink socket (%d)", errno); - goto err; - } - - ret = set_fd_cloexec_nb(linux_netlink_socket); - if (ret == -1) - goto err_close_socket; - - ret = bind(linux_netlink_socket, (struct sockaddr *)&sa_nl, sizeof(sa_nl)); - if (ret == -1) { - usbi_err(NULL, "failed to bind netlink socket (%d)", errno); - goto err_close_socket; - } - - ret = setsockopt(linux_netlink_socket, SOL_SOCKET, SO_PASSCRED, &opt, sizeof(opt)); - if (ret == -1) { - usbi_err(NULL, "failed to set netlink socket SO_PASSCRED option (%d)", errno); - goto err_close_socket; - } - - ret = usbi_pipe(netlink_control_pipe); - if (ret) { - usbi_err(NULL, "failed to create netlink control pipe"); - goto err_close_socket; - } - - ret = pthread_create(&libusb_linux_event_thread, NULL, linux_netlink_event_thread_main, NULL); - if (ret != 0) { - usbi_err(NULL, "failed to create netlink event thread (%d)", ret); - goto err_close_pipe; - } - - return LIBUSB_SUCCESS; - -err_close_pipe: - close(netlink_control_pipe[0]); - close(netlink_control_pipe[1]); - netlink_control_pipe[0] = -1; - netlink_control_pipe[1] = -1; -err_close_socket: - close(linux_netlink_socket); - linux_netlink_socket = -1; -err: - return LIBUSB_ERROR_OTHER; -} - -int linux_netlink_stop_event_monitor(void) -{ - char dummy = 1; - ssize_t r; - - assert(linux_netlink_socket != -1); - - /* Write some dummy data to the control pipe and - * wait for the thread to exit */ - r = usbi_write(netlink_control_pipe[1], &dummy, sizeof(dummy)); - if (r <= 0) - usbi_warn(NULL, "netlink control pipe signal failed"); - - pthread_join(libusb_linux_event_thread, NULL); - - close(linux_netlink_socket); - linux_netlink_socket = -1; - - /* close and reset control pipe */ - close(netlink_control_pipe[0]); - close(netlink_control_pipe[1]); - netlink_control_pipe[0] = -1; - netlink_control_pipe[1] = -1; - - return LIBUSB_SUCCESS; -} - -static const char *netlink_message_parse(const char *buffer, size_t len, const char *key) -{ - const char *end = buffer + len; - size_t keylen = strlen(key); - - while (buffer < end && *buffer) { - if (strncmp(buffer, key, keylen) == 0 && buffer[keylen] == '=') - return buffer + keylen + 1; - buffer += strlen(buffer) + 1; - } - - return NULL; -} - -/* parse parts of netlink message common to both libudev and the kernel */ -static int linux_netlink_parse(const char *buffer, size_t len, int *detached, - const char **sys_name, uint8_t *busnum, uint8_t *devaddr) -{ - const char *tmp, *slash; - - errno = 0; - - *sys_name = NULL; - *detached = 0; - *busnum = 0; - *devaddr = 0; - - tmp = netlink_message_parse(buffer, len, "ACTION"); - if (!tmp) { - return -1; - } else if (strcmp(tmp, "remove") == 0) { - *detached = 1; - } else if (strcmp(tmp, "add") != 0) { - usbi_dbg("unknown device action %s", tmp); - return -1; - } - - /* check that this is a usb message */ - tmp = netlink_message_parse(buffer, len, "SUBSYSTEM"); - if (!tmp || strcmp(tmp, "usb") != 0) { - /* not usb. ignore */ - return -1; - } - - /* check that this is an actual usb device */ - tmp = netlink_message_parse(buffer, len, "DEVTYPE"); - if (!tmp || strcmp(tmp, "usb_device") != 0) { - /* not usb. ignore */ - return -1; - } - - tmp = netlink_message_parse(buffer, len, "BUSNUM"); - if (tmp) { - *busnum = (uint8_t)(strtoul(tmp, NULL, 10) & 0xff); - if (errno) { - errno = 0; - return -1; - } - - tmp = netlink_message_parse(buffer, len, "DEVNUM"); - if (NULL == tmp) - return -1; - - *devaddr = (uint8_t)(strtoul(tmp, NULL, 10) & 0xff); - if (errno) { - errno = 0; - return -1; - } - } else { - /* no bus number. try "DEVICE" */ - tmp = netlink_message_parse(buffer, len, "DEVICE"); - if (!tmp) { - /* not usb. ignore */ - return -1; - } - - /* Parse a device path such as /dev/bus/usb/003/004 */ - slash = strrchr(tmp, '/'); - if (!slash) - return -1; - - *busnum = (uint8_t)(strtoul(slash - 3, NULL, 10) & 0xff); - if (errno) { - errno = 0; - return -1; - } - - *devaddr = (uint8_t)(strtoul(slash + 1, NULL, 10) & 0xff); - if (errno) { - errno = 0; - return -1; - } - - return 0; - } - - tmp = netlink_message_parse(buffer, len, "DEVPATH"); - if (!tmp) - return -1; - - slash = strrchr(tmp, '/'); - if (slash) - *sys_name = slash + 1; - - /* found a usb device */ - return 0; -} - -static int linux_netlink_read_message(void) -{ - char cred_buffer[CMSG_SPACE(sizeof(struct ucred))]; - char msg_buffer[2048]; - const char *sys_name = NULL; - uint8_t busnum, devaddr; - int detached, r; - ssize_t len; - struct cmsghdr *cmsg; - struct ucred *cred; - struct sockaddr_nl sa_nl; - struct iovec iov = { .iov_base = msg_buffer, .iov_len = sizeof(msg_buffer) }; - struct msghdr msg = { - .msg_iov = &iov, .msg_iovlen = 1, - .msg_control = cred_buffer, .msg_controllen = sizeof(cred_buffer), - .msg_name = &sa_nl, .msg_namelen = sizeof(sa_nl) - }; - - /* read netlink message */ - len = recvmsg(linux_netlink_socket, &msg, 0); - if (len == -1) { - if (errno != EAGAIN && errno != EINTR) - usbi_err(NULL, "error receiving message from netlink (%d)", errno); - return -1; - } - - if (len < 32 || (msg.msg_flags & MSG_TRUNC)) { - usbi_err(NULL, "invalid netlink message length"); - return -1; - } - - if (sa_nl.nl_groups != NL_GROUP_KERNEL || sa_nl.nl_pid != 0) { - usbi_dbg("ignoring netlink message from unknown group/PID (%u/%u)", - (unsigned int)sa_nl.nl_groups, (unsigned int)sa_nl.nl_pid); - return -1; - } - - cmsg = CMSG_FIRSTHDR(&msg); - if (!cmsg || cmsg->cmsg_type != SCM_CREDENTIALS) { - usbi_dbg("ignoring netlink message with no sender credentials"); - return -1; - } - - cred = (struct ucred *)CMSG_DATA(cmsg); - if (cred->uid != 0) { - usbi_dbg("ignoring netlink message with non-zero sender UID %u", (unsigned int)cred->uid); - return -1; - } - - r = linux_netlink_parse(msg_buffer, (size_t)len, &detached, &sys_name, &busnum, &devaddr); - if (r) - return r; - - usbi_dbg("netlink hotplug found device busnum: %hhu, devaddr: %hhu, sys_name: %s, removed: %s", - busnum, devaddr, sys_name, detached ? "yes" : "no"); - - /* signal device is available (or not) to all contexts */ - if (detached) - linux_device_disconnected(busnum, devaddr); - else - linux_hotplug_enumerate(busnum, devaddr, sys_name); - - return 0; -} - -static void *linux_netlink_event_thread_main(void *arg) -{ - char dummy; - ssize_t r; - struct pollfd fds[] = { - { .fd = netlink_control_pipe[0], - .events = POLLIN }, - { .fd = linux_netlink_socket, - .events = POLLIN }, - }; - - UNUSED(arg); - - usbi_dbg("netlink event thread entering"); - - while (poll(fds, 2, -1) >= 0) { - if (fds[0].revents & POLLIN) { - /* activity on control pipe, read the byte and exit */ - r = usbi_read(netlink_control_pipe[0], &dummy, sizeof(dummy)); - if (r <= 0) - usbi_warn(NULL, "netlink control pipe read failed"); - break; - } - if (fds[1].revents & POLLIN) { - usbi_mutex_static_lock(&linux_hotplug_lock); - linux_netlink_read_message(); - usbi_mutex_static_unlock(&linux_hotplug_lock); - } - } - - usbi_dbg("netlink event thread exiting"); - - return NULL; -} - -void linux_netlink_hotplug_poll(void) -{ - int r; - - usbi_mutex_static_lock(&linux_hotplug_lock); - do { - r = linux_netlink_read_message(); - } while (r == 0); - usbi_mutex_static_unlock(&linux_hotplug_lock); -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_udev.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_udev.c deleted file mode 100644 index 61d953d8c2df..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_udev.c +++ /dev/null @@ -1,311 +0,0 @@ -/* -*- Mode: C; c-basic-offset:8 ; indent-tabs-mode:t -*- */ -/* - * Linux usbfs backend for libusb - * Copyright (C) 2007-2009 Daniel Drake - * Copyright (c) 2001 Johannes Erdfelt - * Copyright (c) 2012-2013 Nathan Hjelm - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "libusbi.h" -#include "linux_usbfs.h" - -/* udev context */ -static struct udev *udev_ctx = NULL; -static int udev_monitor_fd = -1; -static int udev_control_pipe[2] = {-1, -1}; -static struct udev_monitor *udev_monitor = NULL; -static pthread_t linux_event_thread; - -static void udev_hotplug_event(struct udev_device* udev_dev); -static void *linux_udev_event_thread_main(void *arg); - -int linux_udev_start_event_monitor(void) -{ - int r; - - assert(udev_ctx == NULL); - udev_ctx = udev_new(); - if (!udev_ctx) { - usbi_err(NULL, "could not create udev context"); - goto err; - } - - udev_monitor = udev_monitor_new_from_netlink(udev_ctx, "udev"); - if (!udev_monitor) { - usbi_err(NULL, "could not initialize udev monitor"); - goto err_free_ctx; - } - - r = udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "usb", "usb_device"); - if (r) { - usbi_err(NULL, "could not initialize udev monitor filter for \"usb\" subsystem"); - goto err_free_monitor; - } - - if (udev_monitor_enable_receiving(udev_monitor)) { - usbi_err(NULL, "failed to enable the udev monitor"); - goto err_free_monitor; - } - - udev_monitor_fd = udev_monitor_get_fd(udev_monitor); - - /* Some older versions of udev are not non-blocking by default, - * so make sure this is set */ - r = fcntl(udev_monitor_fd, F_GETFL); - if (r == -1) { - usbi_err(NULL, "getting udev monitor fd flags (%d)", errno); - goto err_free_monitor; - } - r = fcntl(udev_monitor_fd, F_SETFL, r | O_NONBLOCK); - if (r) { - usbi_err(NULL, "setting udev monitor fd flags (%d)", errno); - goto err_free_monitor; - } - - r = usbi_pipe(udev_control_pipe); - if (r) { - usbi_err(NULL, "could not create udev control pipe"); - goto err_free_monitor; - } - - r = pthread_create(&linux_event_thread, NULL, linux_udev_event_thread_main, NULL); - if (r) { - usbi_err(NULL, "creating hotplug event thread (%d)", r); - goto err_close_pipe; - } - - return LIBUSB_SUCCESS; - -err_close_pipe: - close(udev_control_pipe[0]); - close(udev_control_pipe[1]); -err_free_monitor: - udev_monitor_unref(udev_monitor); - udev_monitor = NULL; - udev_monitor_fd = -1; -err_free_ctx: - udev_unref(udev_ctx); -err: - udev_ctx = NULL; - return LIBUSB_ERROR_OTHER; -} - -int linux_udev_stop_event_monitor(void) -{ - char dummy = 1; - int r; - - assert(udev_ctx != NULL); - assert(udev_monitor != NULL); - assert(udev_monitor_fd != -1); - - /* Write some dummy data to the control pipe and - * wait for the thread to exit */ - r = usbi_write(udev_control_pipe[1], &dummy, sizeof(dummy)); - if (r <= 0) { - usbi_warn(NULL, "udev control pipe signal failed"); - } - pthread_join(linux_event_thread, NULL); - - /* Release the udev monitor */ - udev_monitor_unref(udev_monitor); - udev_monitor = NULL; - udev_monitor_fd = -1; - - /* Clean up the udev context */ - udev_unref(udev_ctx); - udev_ctx = NULL; - - /* close and reset control pipe */ - close(udev_control_pipe[0]); - close(udev_control_pipe[1]); - udev_control_pipe[0] = -1; - udev_control_pipe[1] = -1; - - return LIBUSB_SUCCESS; -} - -static void *linux_udev_event_thread_main(void *arg) -{ - char dummy; - int r; - struct udev_device* udev_dev; - struct pollfd fds[] = { - {.fd = udev_control_pipe[0], - .events = POLLIN}, - {.fd = udev_monitor_fd, - .events = POLLIN}, - }; - - usbi_dbg("udev event thread entering."); - - while ((r = poll(fds, 2, -1)) >= 0 || errno == EINTR) { - if (r < 0) { - /* temporary failure */ - continue; - } - if (fds[0].revents & POLLIN) { - /* activity on control pipe, read the byte and exit */ - r = usbi_read(udev_control_pipe[0], &dummy, sizeof(dummy)); - if (r <= 0) { - usbi_warn(NULL, "udev control pipe read failed"); - } - break; - } - if (fds[1].revents & POLLIN) { - usbi_mutex_static_lock(&linux_hotplug_lock); - udev_dev = udev_monitor_receive_device(udev_monitor); - if (udev_dev) - udev_hotplug_event(udev_dev); - usbi_mutex_static_unlock(&linux_hotplug_lock); - } - } - - usbi_dbg("udev event thread exiting"); - - return NULL; -} - -static int udev_device_info(struct libusb_context *ctx, int detached, - struct udev_device *udev_dev, uint8_t *busnum, - uint8_t *devaddr, const char **sys_name) { - const char *dev_node; - - dev_node = udev_device_get_devnode(udev_dev); - if (!dev_node) { - return LIBUSB_ERROR_OTHER; - } - - *sys_name = udev_device_get_sysname(udev_dev); - if (!*sys_name) { - return LIBUSB_ERROR_OTHER; - } - - return linux_get_device_address(ctx, detached, busnum, devaddr, - dev_node, *sys_name); -} - -static void udev_hotplug_event(struct udev_device* udev_dev) -{ - const char* udev_action; - const char* sys_name = NULL; - uint8_t busnum = 0, devaddr = 0; - int detached; - int r; - - do { - udev_action = udev_device_get_action(udev_dev); - if (!udev_action) { - break; - } - - detached = !strncmp(udev_action, "remove", 6); - - r = udev_device_info(NULL, detached, udev_dev, &busnum, &devaddr, &sys_name); - if (LIBUSB_SUCCESS != r) { - break; - } - - usbi_dbg("udev hotplug event. action: %s.", udev_action); - - if (strncmp(udev_action, "add", 3) == 0) { - linux_hotplug_enumerate(busnum, devaddr, sys_name); - } else if (detached) { - linux_device_disconnected(busnum, devaddr); - } else { - usbi_err(NULL, "ignoring udev action %s", udev_action); - } - } while (0); - - udev_device_unref(udev_dev); -} - -int linux_udev_scan_devices(struct libusb_context *ctx) -{ - struct udev_enumerate *enumerator; - struct udev_list_entry *devices, *entry; - struct udev_device *udev_dev; - const char *sys_name; - int r; - - assert(udev_ctx != NULL); - - enumerator = udev_enumerate_new(udev_ctx); - if (NULL == enumerator) { - usbi_err(ctx, "error creating udev enumerator"); - return LIBUSB_ERROR_OTHER; - } - - udev_enumerate_add_match_subsystem(enumerator, "usb"); - udev_enumerate_add_match_property(enumerator, "DEVTYPE", "usb_device"); - udev_enumerate_scan_devices(enumerator); - devices = udev_enumerate_get_list_entry(enumerator); - - udev_list_entry_foreach(entry, devices) { - const char *path = udev_list_entry_get_name(entry); - uint8_t busnum = 0, devaddr = 0; - - udev_dev = udev_device_new_from_syspath(udev_ctx, path); - - r = udev_device_info(ctx, 0, udev_dev, &busnum, &devaddr, &sys_name); - if (r) { - udev_device_unref(udev_dev); - continue; - } - - linux_enumerate_device(ctx, busnum, devaddr, sys_name); - udev_device_unref(udev_dev); - } - - udev_enumerate_unref(enumerator); - - return LIBUSB_SUCCESS; -} - -void linux_udev_hotplug_poll(void) -{ - struct udev_device* udev_dev; - - usbi_mutex_static_lock(&linux_hotplug_lock); - do { - udev_dev = udev_monitor_receive_device(udev_monitor); - if (udev_dev) { - usbi_dbg("Handling hotplug event from hotplug_poll"); - udev_hotplug_event(udev_dev); - } - } while (udev_dev); - usbi_mutex_static_unlock(&linux_hotplug_lock); -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_usbfs.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_usbfs.c deleted file mode 100644 index 6b89ba2889fb..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_usbfs.c +++ /dev/null @@ -1,2738 +0,0 @@ -/* -*- Mode: C; c-basic-offset:8 ; indent-tabs-mode:t -*- */ -/* - * Linux usbfs backend for libusb - * Copyright © 2007-2009 Daniel Drake - * Copyright © 2001 Johannes Erdfelt - * Copyright © 2013 Nathan Hjelm - * Copyright © 2012-2013 Hans de Goede - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "config.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "libusbi.h" -#include "linux_usbfs.h" - -/* sysfs vs usbfs: - * opening a usbfs node causes the device to be resumed, so we attempt to - * avoid this during enumeration. - * - * sysfs allows us to read the kernel's in-memory copies of device descriptors - * and so forth, avoiding the need to open the device: - * - The binary "descriptors" file contains all config descriptors since - * 2.6.26, commit 217a9081d8e69026186067711131b77f0ce219ed - * - The binary "descriptors" file was added in 2.6.23, commit - * 69d42a78f935d19384d1f6e4f94b65bb162b36df, but it only contains the - * active config descriptors - * - The "busnum" file was added in 2.6.22, commit - * 83f7d958eab2fbc6b159ee92bf1493924e1d0f72 - * - The "devnum" file has been present since pre-2.6.18 - * - the "bConfigurationValue" file has been present since pre-2.6.18 - * - * If we have bConfigurationValue, busnum, and devnum, then we can determine - * the active configuration without having to open the usbfs node in RDWR mode. - * The busnum file is important as that is the only way we can relate sysfs - * devices to usbfs nodes. - * - * If we also have all descriptors, we can obtain the device descriptor and - * configuration without touching usbfs at all. - */ - -/* endianness for multi-byte fields: - * - * Descriptors exposed by usbfs have the multi-byte fields in the device - * descriptor as host endian. Multi-byte fields in the other descriptors are - * bus-endian. The kernel documentation says otherwise, but it is wrong. - * - * In sysfs all descriptors are bus-endian. - */ - -static const char *usbfs_path = NULL; - -/* use usbdev*.* device names in /dev instead of the usbfs bus directories */ -static int usbdev_names = 0; - -/* Linux 2.6.32 adds support for a bulk continuation URB flag. this basically - * allows us to mark URBs as being part of a specific logical transfer when - * we submit them to the kernel. then, on any error except a cancellation, all - * URBs within that transfer will be cancelled and no more URBs will be - * accepted for the transfer, meaning that no more data can creep in. - * - * The BULK_CONTINUATION flag must be set on all URBs within a bulk transfer - * (in either direction) except the first. - * For IN transfers, we must also set SHORT_NOT_OK on all URBs except the - * last; it means that the kernel should treat a short reply as an error. - * For OUT transfers, SHORT_NOT_OK must not be set. it isn't needed (OUT - * transfers can't be short unless there's already some sort of error), and - * setting this flag is disallowed (a kernel with USB debugging enabled will - * reject such URBs). - */ -static int supports_flag_bulk_continuation = -1; - -/* Linux 2.6.31 fixes support for the zero length packet URB flag. This - * allows us to mark URBs that should be followed by a zero length data - * packet, which can be required by device- or class-specific protocols. - */ -static int supports_flag_zero_packet = -1; - -/* clock ID for monotonic clock, as not all clock sources are available on all - * systems. appropriate choice made at initialization time. */ -static clockid_t monotonic_clkid = -1; - -/* Linux 2.6.22 (commit 83f7d958eab2fbc6b159ee92bf1493924e1d0f72) adds a busnum - * to sysfs, so we can relate devices. This also implies that we can read - * the active configuration through bConfigurationValue */ -static int sysfs_can_relate_devices = -1; - -/* Linux 2.6.26 (commit 217a9081d8e69026186067711131b77f0ce219ed) adds all - * config descriptors (rather then just the active config) to the sysfs - * descriptors file, so from then on we can use them. */ -static int sysfs_has_descriptors = -1; - -/* how many times have we initted (and not exited) ? */ -static int init_count = 0; - -/* Serialize hotplug start/stop */ -static usbi_mutex_static_t linux_hotplug_startstop_lock = USBI_MUTEX_INITIALIZER; -/* Serialize scan-devices, event-thread, and poll */ -usbi_mutex_static_t linux_hotplug_lock = USBI_MUTEX_INITIALIZER; - -static int linux_start_event_monitor(void); -static int linux_stop_event_monitor(void); -static int linux_scan_devices(struct libusb_context *ctx); -static int sysfs_scan_device(struct libusb_context *ctx, const char *devname); -static int detach_kernel_driver_and_claim(struct libusb_device_handle *, int); - -#if !defined(USE_UDEV) -static int linux_default_scan_devices (struct libusb_context *ctx); -#endif - -struct linux_device_priv { - char *sysfs_dir; - unsigned char *descriptors; - int descriptors_len; - int active_config; /* cache val for !sysfs_can_relate_devices */ -}; - -struct linux_device_handle_priv { - int fd; - int fd_removed; - uint32_t caps; -}; - -enum reap_action { - NORMAL = 0, - /* submission failed after the first URB, so await cancellation/completion - * of all the others */ - SUBMIT_FAILED, - - /* cancelled by user or timeout */ - CANCELLED, - - /* completed multi-URB transfer in non-final URB */ - COMPLETED_EARLY, - - /* one or more urbs encountered a low-level error */ - ERROR, -}; - -struct linux_transfer_priv { - union { - struct usbfs_urb *urbs; - struct usbfs_urb **iso_urbs; - }; - - enum reap_action reap_action; - int num_urbs; - int num_retired; - enum libusb_transfer_status reap_status; - - /* next iso packet in user-supplied transfer to be populated */ - int iso_packet_offset; -}; - -static int _get_usbfs_fd(struct libusb_device *dev, mode_t mode, int silent) -{ - struct libusb_context *ctx = DEVICE_CTX(dev); - char path[PATH_MAX]; - int fd; - int delay = 10000; - - if (usbdev_names) - snprintf(path, PATH_MAX, "%s/usbdev%d.%d", - usbfs_path, dev->bus_number, dev->device_address); - else - snprintf(path, PATH_MAX, "%s/%03d/%03d", - usbfs_path, dev->bus_number, dev->device_address); - - fd = open(path, mode); - if (fd != -1) - return fd; /* Success */ - - if (errno == ENOENT) { - if (!silent) - usbi_err(ctx, "File doesn't exist, wait %d ms and try again", delay/1000); - - /* Wait 10ms for USB device path creation.*/ - nanosleep(&(struct timespec){delay / 1000000, (delay * 1000) % 1000000000UL}, NULL); - - fd = open(path, mode); - if (fd != -1) - return fd; /* Success */ - } - - if (!silent) { - usbi_err(ctx, "libusb couldn't open USB device %s: %s", - path, strerror(errno)); - if (errno == EACCES && mode == O_RDWR) - usbi_err(ctx, "libusb requires write access to USB " - "device nodes."); - } - - if (errno == EACCES) - return LIBUSB_ERROR_ACCESS; - if (errno == ENOENT) - return LIBUSB_ERROR_NO_DEVICE; - return LIBUSB_ERROR_IO; -} - -static struct linux_device_priv *_device_priv(struct libusb_device *dev) -{ - return (struct linux_device_priv *) dev->os_priv; -} - -static struct linux_device_handle_priv *_device_handle_priv( - struct libusb_device_handle *handle) -{ - return (struct linux_device_handle_priv *) handle->os_priv; -} - -/* check dirent for a /dev/usbdev%d.%d name - * optionally return bus/device on success */ -static int _is_usbdev_entry(struct dirent *entry, int *bus_p, int *dev_p) -{ - int busnum, devnum; - - if (sscanf(entry->d_name, "usbdev%d.%d", &busnum, &devnum) != 2) - return 0; - - usbi_dbg("found: %s", entry->d_name); - if (bus_p != NULL) - *bus_p = busnum; - if (dev_p != NULL) - *dev_p = devnum; - return 1; -} - -static int check_usb_vfs(const char *dirname) -{ - DIR *dir; - struct dirent *entry; - int found = 0; - - dir = opendir(dirname); - if (!dir) - return 0; - - while ((entry = readdir(dir)) != NULL) { - if (entry->d_name[0] == '.') - continue; - - /* We assume if we find any files that it must be the right place */ - found = 1; - break; - } - - closedir(dir); - return found; -} - -static const char *find_usbfs_path(void) -{ - const char *path = "/dev/bus/usb"; - const char *ret = NULL; - - if (check_usb_vfs(path)) { - ret = path; - } else { - path = "/proc/bus/usb"; - if (check_usb_vfs(path)) - ret = path; - } - - /* look for /dev/usbdev*.* if the normal places fail */ - if (ret == NULL) { - struct dirent *entry; - DIR *dir; - - path = "/dev"; - dir = opendir(path); - if (dir != NULL) { - while ((entry = readdir(dir)) != NULL) { - if (_is_usbdev_entry(entry, NULL, NULL)) { - /* found one; that's enough */ - ret = path; - usbdev_names = 1; - break; - } - } - closedir(dir); - } - } - -/* On udev based systems without any usb-devices /dev/bus/usb will not - * exist. So if we've not found anything and we're using udev for hotplug - * simply assume /dev/bus/usb rather then making libusb_init fail. */ -#if defined(USE_UDEV) - if (ret == NULL) - ret = "/dev/bus/usb"; -#endif - - if (ret != NULL) - usbi_dbg("found usbfs at %s", ret); - - return ret; -} - -/* the monotonic clock is not usable on all systems (e.g. embedded ones often - * seem to lack it). fall back to REALTIME if we have to. */ -static clockid_t find_monotonic_clock(void) -{ -#ifdef CLOCK_MONOTONIC - struct timespec ts; - int r; - - /* Linux 2.6.28 adds CLOCK_MONOTONIC_RAW but we don't use it - * because it's not available through timerfd */ - r = clock_gettime(CLOCK_MONOTONIC, &ts); - if (r == 0) - return CLOCK_MONOTONIC; - usbi_dbg("monotonic clock doesn't work, errno %d", errno); -#endif - - return CLOCK_REALTIME; -} - -static int kernel_version_ge(int major, int minor, int sublevel) -{ - struct utsname uts; - int atoms, kmajor, kminor, ksublevel; - - if (uname(&uts) < 0) - return -1; - atoms = sscanf(uts.release, "%d.%d.%d", &kmajor, &kminor, &ksublevel); - if (atoms < 1) - return -1; - - if (kmajor > major) - return 1; - if (kmajor < major) - return 0; - - /* kmajor == major */ - if (atoms < 2) - return 0 == minor && 0 == sublevel; - if (kminor > minor) - return 1; - if (kminor < minor) - return 0; - - /* kminor == minor */ - if (atoms < 3) - return 0 == sublevel; - - return ksublevel >= sublevel; -} - -static int op_init(struct libusb_context *ctx) -{ - struct stat statbuf; - int r; - - usbfs_path = find_usbfs_path(); - if (!usbfs_path) { - usbi_err(ctx, "could not find usbfs"); - return LIBUSB_ERROR_OTHER; - } - - if (monotonic_clkid == -1) - monotonic_clkid = find_monotonic_clock(); - - if (supports_flag_bulk_continuation == -1) { - /* bulk continuation URB flag available from Linux 2.6.32 */ - supports_flag_bulk_continuation = kernel_version_ge(2,6,32); - if (supports_flag_bulk_continuation == -1) { - usbi_err(ctx, "error checking for bulk continuation support"); - return LIBUSB_ERROR_OTHER; - } - } - - if (supports_flag_bulk_continuation) - usbi_dbg("bulk continuation flag supported"); - - if (-1 == supports_flag_zero_packet) { - /* zero length packet URB flag fixed since Linux 2.6.31 */ - supports_flag_zero_packet = kernel_version_ge(2,6,31); - if (-1 == supports_flag_zero_packet) { - usbi_err(ctx, "error checking for zero length packet support"); - return LIBUSB_ERROR_OTHER; - } - } - - if (supports_flag_zero_packet) - usbi_dbg("zero length packet flag supported"); - - if (-1 == sysfs_has_descriptors) { - /* sysfs descriptors has all descriptors since Linux 2.6.26 */ - sysfs_has_descriptors = kernel_version_ge(2,6,26); - if (-1 == sysfs_has_descriptors) { - usbi_err(ctx, "error checking for sysfs descriptors"); - return LIBUSB_ERROR_OTHER; - } - } - - if (-1 == sysfs_can_relate_devices) { - /* sysfs has busnum since Linux 2.6.22 */ - sysfs_can_relate_devices = kernel_version_ge(2,6,22); - if (-1 == sysfs_can_relate_devices) { - usbi_err(ctx, "error checking for sysfs busnum"); - return LIBUSB_ERROR_OTHER; - } - } - - if (sysfs_can_relate_devices || sysfs_has_descriptors) { - r = stat(SYSFS_DEVICE_PATH, &statbuf); - if (r != 0 || !S_ISDIR(statbuf.st_mode)) { - usbi_warn(ctx, "sysfs not mounted"); - sysfs_can_relate_devices = 0; - sysfs_has_descriptors = 0; - } - } - - if (sysfs_can_relate_devices) - usbi_dbg("sysfs can relate devices"); - - if (sysfs_has_descriptors) - usbi_dbg("sysfs has complete descriptors"); - - usbi_mutex_static_lock(&linux_hotplug_startstop_lock); - r = LIBUSB_SUCCESS; - if (init_count == 0) { - /* start up hotplug event handler */ - r = linux_start_event_monitor(); - } - if (r == LIBUSB_SUCCESS) { - r = linux_scan_devices(ctx); - if (r == LIBUSB_SUCCESS) - init_count++; - else if (init_count == 0) - linux_stop_event_monitor(); - } else - usbi_err(ctx, "error starting hotplug event monitor"); - usbi_mutex_static_unlock(&linux_hotplug_startstop_lock); - - return r; -} - -static void op_exit(void) -{ - usbi_mutex_static_lock(&linux_hotplug_startstop_lock); - assert(init_count != 0); - if (!--init_count) { - /* tear down event handler */ - (void)linux_stop_event_monitor(); - } - usbi_mutex_static_unlock(&linux_hotplug_startstop_lock); -} - -static int linux_start_event_monitor(void) -{ -#if defined(USE_UDEV) - return linux_udev_start_event_monitor(); -#else - return linux_netlink_start_event_monitor(); -#endif -} - -static int linux_stop_event_monitor(void) -{ -#if defined(USE_UDEV) - return linux_udev_stop_event_monitor(); -#else - return linux_netlink_stop_event_monitor(); -#endif -} - -static int linux_scan_devices(struct libusb_context *ctx) -{ - int ret; - - usbi_mutex_static_lock(&linux_hotplug_lock); - -#if defined(USE_UDEV) - ret = linux_udev_scan_devices(ctx); -#else - ret = linux_default_scan_devices(ctx); -#endif - - usbi_mutex_static_unlock(&linux_hotplug_lock); - - return ret; -} - -static void op_hotplug_poll(void) -{ -#if defined(USE_UDEV) - linux_udev_hotplug_poll(); -#else - linux_netlink_hotplug_poll(); -#endif -} - -static int _open_sysfs_attr(struct libusb_device *dev, const char *attr) -{ - struct linux_device_priv *priv = _device_priv(dev); - char filename[PATH_MAX]; - int fd; - - snprintf(filename, PATH_MAX, "%s/%s/%s", - SYSFS_DEVICE_PATH, priv->sysfs_dir, attr); - fd = open(filename, O_RDONLY); - if (fd < 0) { - usbi_err(DEVICE_CTX(dev), - "open %s failed ret=%d errno=%d", filename, fd, errno); - return LIBUSB_ERROR_IO; - } - - return fd; -} - -/* Note only suitable for attributes which always read >= 0, < 0 is error */ -static int __read_sysfs_attr(struct libusb_context *ctx, - const char *devname, const char *attr) -{ - char filename[PATH_MAX]; - FILE *f; - int r, value; - - snprintf(filename, PATH_MAX, "%s/%s/%s", SYSFS_DEVICE_PATH, - devname, attr); - f = fopen(filename, "r"); - if (f == NULL) { - if (errno == ENOENT) { - /* File doesn't exist. Assume the device has been - disconnected (see trac ticket #70). */ - return LIBUSB_ERROR_NO_DEVICE; - } - usbi_err(ctx, "open %s failed errno=%d", filename, errno); - return LIBUSB_ERROR_IO; - } - - r = fscanf(f, "%d", &value); - fclose(f); - if (r != 1) { - usbi_err(ctx, "fscanf %s returned %d, errno=%d", attr, r, errno); - return LIBUSB_ERROR_NO_DEVICE; /* For unplug race (trac #70) */ - } - if (value < 0) { - usbi_err(ctx, "%s contains a negative value", filename); - return LIBUSB_ERROR_IO; - } - - return value; -} - -static int op_get_device_descriptor(struct libusb_device *dev, - unsigned char *buffer, int *host_endian) -{ - struct linux_device_priv *priv = _device_priv(dev); - - *host_endian = sysfs_has_descriptors ? 0 : 1; - memcpy(buffer, priv->descriptors, DEVICE_DESC_LENGTH); - - return 0; -} - -/* read the bConfigurationValue for a device */ -static int sysfs_get_active_config(struct libusb_device *dev, int *config) -{ - char *endptr; - char tmp[5] = {0, 0, 0, 0, 0}; - long num; - int fd; - ssize_t r; - - fd = _open_sysfs_attr(dev, "bConfigurationValue"); - if (fd < 0) - return fd; - - r = read(fd, tmp, sizeof(tmp)); - close(fd); - if (r < 0) { - usbi_err(DEVICE_CTX(dev), - "read bConfigurationValue failed ret=%d errno=%d", r, errno); - return LIBUSB_ERROR_IO; - } else if (r == 0) { - usbi_dbg("device unconfigured"); - *config = -1; - return 0; - } - - if (tmp[sizeof(tmp) - 1] != 0) { - usbi_err(DEVICE_CTX(dev), "not null-terminated?"); - return LIBUSB_ERROR_IO; - } else if (tmp[0] == 0) { - usbi_err(DEVICE_CTX(dev), "no configuration value?"); - return LIBUSB_ERROR_IO; - } - - num = strtol(tmp, &endptr, 10); - if (endptr == tmp) { - usbi_err(DEVICE_CTX(dev), "error converting '%s' to integer", tmp); - return LIBUSB_ERROR_IO; - } - - *config = (int) num; - return 0; -} - -int linux_get_device_address (struct libusb_context *ctx, int detached, - uint8_t *busnum, uint8_t *devaddr,const char *dev_node, - const char *sys_name) -{ - int sysfs_attr; - - usbi_dbg("getting address for device: %s detached: %d", sys_name, detached); - /* can't use sysfs to read the bus and device number if the - * device has been detached */ - if (!sysfs_can_relate_devices || detached || NULL == sys_name) { - if (NULL == dev_node) { - return LIBUSB_ERROR_OTHER; - } - - /* will this work with all supported kernel versions? */ - if (!strncmp(dev_node, "/dev/bus/usb", 12)) { - sscanf (dev_node, "/dev/bus/usb/%hhu/%hhu", busnum, devaddr); - } else if (!strncmp(dev_node, "/proc/bus/usb", 13)) { - sscanf (dev_node, "/proc/bus/usb/%hhu/%hhu", busnum, devaddr); - } - - return LIBUSB_SUCCESS; - } - - usbi_dbg("scan %s", sys_name); - - sysfs_attr = __read_sysfs_attr(ctx, sys_name, "busnum"); - if (0 > sysfs_attr) - return sysfs_attr; - if (sysfs_attr > 255) - return LIBUSB_ERROR_INVALID_PARAM; - *busnum = (uint8_t) sysfs_attr; - - sysfs_attr = __read_sysfs_attr(ctx, sys_name, "devnum"); - if (0 > sysfs_attr) - return sysfs_attr; - if (sysfs_attr > 255) - return LIBUSB_ERROR_INVALID_PARAM; - - *devaddr = (uint8_t) sysfs_attr; - - usbi_dbg("bus=%d dev=%d", *busnum, *devaddr); - - return LIBUSB_SUCCESS; -} - -/* Return offset of the next descriptor with the given type */ -static int seek_to_next_descriptor(struct libusb_context *ctx, - uint8_t descriptor_type, unsigned char *buffer, int size) -{ - struct usb_descriptor_header header; - int i; - - for (i = 0; size >= 0; i += header.bLength, size -= header.bLength) { - if (size == 0) - return LIBUSB_ERROR_NOT_FOUND; - - if (size < 2) { - usbi_err(ctx, "short descriptor read %d/2", size); - return LIBUSB_ERROR_IO; - } - usbi_parse_descriptor(buffer + i, "bb", &header, 0); - - if (i && header.bDescriptorType == descriptor_type) - return i; - } - usbi_err(ctx, "bLength overflow by %d bytes", -size); - return LIBUSB_ERROR_IO; -} - -/* Return offset to next config */ -static int seek_to_next_config(struct libusb_context *ctx, - unsigned char *buffer, int size) -{ - struct libusb_config_descriptor config; - - if (size == 0) - return LIBUSB_ERROR_NOT_FOUND; - - if (size < LIBUSB_DT_CONFIG_SIZE) { - usbi_err(ctx, "short descriptor read %d/%d", - size, LIBUSB_DT_CONFIG_SIZE); - return LIBUSB_ERROR_IO; - } - - usbi_parse_descriptor(buffer, "bbwbbbbb", &config, 0); - if (config.bDescriptorType != LIBUSB_DT_CONFIG) { - usbi_err(ctx, "descriptor is not a config desc (type 0x%02x)", - config.bDescriptorType); - return LIBUSB_ERROR_IO; - } - - /* - * In usbfs the config descriptors are config.wTotalLength bytes apart, - * with any short reads from the device appearing as holes in the file. - * - * In sysfs wTotalLength is ignored, instead the kernel returns a - * config descriptor with verified bLength fields, with descriptors - * with an invalid bLength removed. - */ - if (sysfs_has_descriptors) { - int next = seek_to_next_descriptor(ctx, LIBUSB_DT_CONFIG, - buffer, size); - if (next == LIBUSB_ERROR_NOT_FOUND) - next = size; - if (next < 0) - return next; - - if (next != config.wTotalLength) - usbi_warn(ctx, "config length mismatch wTotalLength " - "%d real %d", config.wTotalLength, next); - return next; - } else { - if (config.wTotalLength < LIBUSB_DT_CONFIG_SIZE) { - usbi_err(ctx, "invalid wTotalLength %d", - config.wTotalLength); - return LIBUSB_ERROR_IO; - } else if (config.wTotalLength > size) { - usbi_warn(ctx, "short descriptor read %d/%d", - size, config.wTotalLength); - return size; - } else - return config.wTotalLength; - } -} - -static int op_get_config_descriptor_by_value(struct libusb_device *dev, - uint8_t value, unsigned char **buffer, int *host_endian) -{ - struct libusb_context *ctx = DEVICE_CTX(dev); - struct linux_device_priv *priv = _device_priv(dev); - unsigned char *descriptors = priv->descriptors; - int size = priv->descriptors_len; - struct libusb_config_descriptor *config; - - *buffer = NULL; - /* Unlike the device desc. config descs. are always in raw format */ - *host_endian = 0; - - /* Skip device header */ - descriptors += DEVICE_DESC_LENGTH; - size -= DEVICE_DESC_LENGTH; - - /* Seek till the config is found, or till "EOF" */ - while (1) { - int next = seek_to_next_config(ctx, descriptors, size); - if (next < 0) - return next; - config = (struct libusb_config_descriptor *)descriptors; - if (config->bConfigurationValue == value) { - *buffer = descriptors; - return next; - } - size -= next; - descriptors += next; - } -} - -static int op_get_active_config_descriptor(struct libusb_device *dev, - unsigned char *buffer, size_t len, int *host_endian) -{ - int r, config; - unsigned char *config_desc; - - if (sysfs_can_relate_devices) { - r = sysfs_get_active_config(dev, &config); - if (r < 0) - return r; - } else { - /* Use cached bConfigurationValue */ - struct linux_device_priv *priv = _device_priv(dev); - config = priv->active_config; - } - if (config == -1) - return LIBUSB_ERROR_NOT_FOUND; - - r = op_get_config_descriptor_by_value(dev, config, &config_desc, - host_endian); - if (r < 0) - return r; - - len = MIN(len, r); - memcpy(buffer, config_desc, len); - return len; -} - -static int op_get_config_descriptor(struct libusb_device *dev, - uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) -{ - struct linux_device_priv *priv = _device_priv(dev); - unsigned char *descriptors = priv->descriptors; - int i, r, size = priv->descriptors_len; - - /* Unlike the device desc. config descs. are always in raw format */ - *host_endian = 0; - - /* Skip device header */ - descriptors += DEVICE_DESC_LENGTH; - size -= DEVICE_DESC_LENGTH; - - /* Seek till the config is found, or till "EOF" */ - for (i = 0; ; i++) { - r = seek_to_next_config(DEVICE_CTX(dev), descriptors, size); - if (r < 0) - return r; - if (i == config_index) - break; - size -= r; - descriptors += r; - } - - len = MIN(len, r); - memcpy(buffer, descriptors, len); - return len; -} - -/* send a control message to retrieve active configuration */ -static int usbfs_get_active_config(struct libusb_device *dev, int fd) -{ - struct linux_device_priv *priv = _device_priv(dev); - unsigned char active_config = 0; - int r; - - struct usbfs_ctrltransfer ctrl = { - .bmRequestType = LIBUSB_ENDPOINT_IN, - .bRequest = LIBUSB_REQUEST_GET_CONFIGURATION, - .wValue = 0, - .wIndex = 0, - .wLength = 1, - .timeout = 1000, - .data = &active_config - }; - - r = ioctl(fd, IOCTL_USBFS_CONTROL, &ctrl); - if (r < 0) { - if (errno == ENODEV) - return LIBUSB_ERROR_NO_DEVICE; - - /* we hit this error path frequently with buggy devices :( */ - usbi_warn(DEVICE_CTX(dev), - "get_configuration failed ret=%d errno=%d", r, errno); - priv->active_config = -1; - } else { - if (active_config > 0) { - priv->active_config = active_config; - } else { - /* some buggy devices have a configuration 0, but we're - * reaching into the corner of a corner case here, so let's - * not support buggy devices in these circumstances. - * stick to the specs: a configuration value of 0 means - * unconfigured. */ - usbi_warn(DEVICE_CTX(dev), - "active cfg 0? assuming unconfigured device"); - priv->active_config = -1; - } - } - - return LIBUSB_SUCCESS; -} - -static int initialize_device(struct libusb_device *dev, uint8_t busnum, - uint8_t devaddr, const char *sysfs_dir) -{ - struct linux_device_priv *priv = _device_priv(dev); - struct libusb_context *ctx = DEVICE_CTX(dev); - int descriptors_size = 512; /* Begin with a 1024 byte alloc */ - int fd, speed; - ssize_t r; - - dev->bus_number = busnum; - dev->device_address = devaddr; - - if (sysfs_dir) { - priv->sysfs_dir = strdup(sysfs_dir); - if (!priv->sysfs_dir) - return LIBUSB_ERROR_NO_MEM; - - /* Note speed can contain 1.5, in this case __read_sysfs_attr - will stop parsing at the '.' and return 1 */ - speed = __read_sysfs_attr(DEVICE_CTX(dev), sysfs_dir, "speed"); - if (speed >= 0) { - switch (speed) { - case 1: dev->speed = LIBUSB_SPEED_LOW; break; - case 12: dev->speed = LIBUSB_SPEED_FULL; break; - case 480: dev->speed = LIBUSB_SPEED_HIGH; break; - case 5000: dev->speed = LIBUSB_SPEED_SUPER; break; - default: - usbi_warn(DEVICE_CTX(dev), "Unknown device speed: %d Mbps", speed); - } - } - } - - /* cache descriptors in memory */ - if (sysfs_has_descriptors) - fd = _open_sysfs_attr(dev, "descriptors"); - else - fd = _get_usbfs_fd(dev, O_RDONLY, 0); - if (fd < 0) - return fd; - - do { - descriptors_size *= 2; - priv->descriptors = usbi_reallocf(priv->descriptors, - descriptors_size); - if (!priv->descriptors) { - close(fd); - return LIBUSB_ERROR_NO_MEM; - } - /* usbfs has holes in the file */ - if (!sysfs_has_descriptors) { - memset(priv->descriptors + priv->descriptors_len, - 0, descriptors_size - priv->descriptors_len); - } - r = read(fd, priv->descriptors + priv->descriptors_len, - descriptors_size - priv->descriptors_len); - if (r < 0) { - usbi_err(ctx, "read descriptor failed ret=%d errno=%d", - fd, errno); - close(fd); - return LIBUSB_ERROR_IO; - } - priv->descriptors_len += r; - } while (priv->descriptors_len == descriptors_size); - - close(fd); - - if (priv->descriptors_len < DEVICE_DESC_LENGTH) { - usbi_err(ctx, "short descriptor read (%d)", - priv->descriptors_len); - return LIBUSB_ERROR_IO; - } - - if (sysfs_can_relate_devices) - return LIBUSB_SUCCESS; - - /* cache active config */ - fd = _get_usbfs_fd(dev, O_RDWR, 1); - if (fd < 0) { - /* cannot send a control message to determine the active - * config. just assume the first one is active. */ - usbi_warn(ctx, "Missing rw usbfs access; cannot determine " - "active configuration descriptor"); - if (priv->descriptors_len >= - (DEVICE_DESC_LENGTH + LIBUSB_DT_CONFIG_SIZE)) { - struct libusb_config_descriptor config; - usbi_parse_descriptor( - priv->descriptors + DEVICE_DESC_LENGTH, - "bbwbbbbb", &config, 0); - priv->active_config = config.bConfigurationValue; - } else - priv->active_config = -1; /* No config dt */ - - return LIBUSB_SUCCESS; - } - - r = usbfs_get_active_config(dev, fd); - close(fd); - - return r; -} - -static int linux_get_parent_info(struct libusb_device *dev, const char *sysfs_dir) -{ - struct libusb_context *ctx = DEVICE_CTX(dev); - struct libusb_device *it; - char *parent_sysfs_dir, *tmp; - int ret, add_parent = 1; - - /* XXX -- can we figure out the topology when using usbfs? */ - if (NULL == sysfs_dir || 0 == strncmp(sysfs_dir, "usb", 3)) { - /* either using usbfs or finding the parent of a root hub */ - return LIBUSB_SUCCESS; - } - - parent_sysfs_dir = strdup(sysfs_dir); - if (NULL == parent_sysfs_dir) { - return LIBUSB_ERROR_NO_MEM; - } - if (NULL != (tmp = strrchr(parent_sysfs_dir, '.')) || - NULL != (tmp = strrchr(parent_sysfs_dir, '-'))) { - dev->port_number = atoi(tmp + 1); - *tmp = '\0'; - } else { - usbi_warn(ctx, "Can not parse sysfs_dir: %s, no parent info", - parent_sysfs_dir); - free (parent_sysfs_dir); - return LIBUSB_SUCCESS; - } - - /* is the parent a root hub? */ - if (NULL == strchr(parent_sysfs_dir, '-')) { - tmp = parent_sysfs_dir; - ret = asprintf (&parent_sysfs_dir, "usb%s", tmp); - free (tmp); - if (0 > ret) { - return LIBUSB_ERROR_NO_MEM; - } - } - -retry: - /* find the parent in the context */ - usbi_mutex_lock(&ctx->usb_devs_lock); - list_for_each_entry(it, &ctx->usb_devs, list, struct libusb_device) { - struct linux_device_priv *priv = _device_priv(it); - if (priv->sysfs_dir) { - if (0 == strcmp (priv->sysfs_dir, parent_sysfs_dir)) { - dev->parent_dev = libusb_ref_device(it); - break; - } - } - } - usbi_mutex_unlock(&ctx->usb_devs_lock); - - if (!dev->parent_dev && add_parent) { - usbi_dbg("parent_dev %s not enumerated yet, enumerating now", - parent_sysfs_dir); - sysfs_scan_device(ctx, parent_sysfs_dir); - add_parent = 0; - goto retry; - } - - usbi_dbg("Dev %p (%s) has parent %p (%s) port %d", dev, sysfs_dir, - dev->parent_dev, parent_sysfs_dir, dev->port_number); - - free (parent_sysfs_dir); - - return LIBUSB_SUCCESS; -} - -int linux_enumerate_device(struct libusb_context *ctx, - uint8_t busnum, uint8_t devaddr, const char *sysfs_dir) -{ - unsigned long session_id; - struct libusb_device *dev; - int r = 0; - - /* FIXME: session ID is not guaranteed unique as addresses can wrap and - * will be reused. instead we should add a simple sysfs attribute with - * a session ID. */ - session_id = busnum << 8 | devaddr; - usbi_dbg("busnum %d devaddr %d session_id %ld", busnum, devaddr, - session_id); - - dev = usbi_get_device_by_session_id(ctx, session_id); - if (dev) { - /* device already exists in the context */ - usbi_dbg("session_id %ld already exists", session_id); - libusb_unref_device(dev); - return LIBUSB_SUCCESS; - } - - usbi_dbg("allocating new device for %d/%d (session %ld)", - busnum, devaddr, session_id); - dev = usbi_alloc_device(ctx, session_id); - if (!dev) - return LIBUSB_ERROR_NO_MEM; - - r = initialize_device(dev, busnum, devaddr, sysfs_dir); - if (r < 0) - goto out; - r = usbi_sanitize_device(dev); - if (r < 0) - goto out; - - r = linux_get_parent_info(dev, sysfs_dir); - if (r < 0) - goto out; -out: - if (r < 0) - libusb_unref_device(dev); - else - usbi_connect_device(dev); - - return r; -} - -void linux_hotplug_enumerate(uint8_t busnum, uint8_t devaddr, const char *sys_name) -{ - struct libusb_context *ctx; - - usbi_mutex_static_lock(&active_contexts_lock); - list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) { - linux_enumerate_device(ctx, busnum, devaddr, sys_name); - } - usbi_mutex_static_unlock(&active_contexts_lock); -} - -void linux_device_disconnected(uint8_t busnum, uint8_t devaddr) -{ - struct libusb_context *ctx; - struct libusb_device *dev; - unsigned long session_id = busnum << 8 | devaddr; - - usbi_mutex_static_lock(&active_contexts_lock); - list_for_each_entry(ctx, &active_contexts_list, list, struct libusb_context) { - dev = usbi_get_device_by_session_id (ctx, session_id); - if (NULL != dev) { - usbi_disconnect_device (dev); - libusb_unref_device(dev); - } else { - usbi_dbg("device not found for session %x", session_id); - } - } - usbi_mutex_static_unlock(&active_contexts_lock); -} - -#if !defined(USE_UDEV) -/* open a bus directory and adds all discovered devices to the context */ -static int usbfs_scan_busdir(struct libusb_context *ctx, uint8_t busnum) -{ - DIR *dir; - char dirpath[PATH_MAX]; - struct dirent *entry; - int r = LIBUSB_ERROR_IO; - - snprintf(dirpath, PATH_MAX, "%s/%03d", usbfs_path, busnum); - usbi_dbg("%s", dirpath); - dir = opendir(dirpath); - if (!dir) { - usbi_err(ctx, "opendir '%s' failed, errno=%d", dirpath, errno); - /* FIXME: should handle valid race conditions like hub unplugged - * during directory iteration - this is not an error */ - return r; - } - - while ((entry = readdir(dir))) { - int devaddr; - - if (entry->d_name[0] == '.') - continue; - - devaddr = atoi(entry->d_name); - if (devaddr == 0) { - usbi_dbg("unknown dir entry %s", entry->d_name); - continue; - } - - if (linux_enumerate_device(ctx, busnum, (uint8_t) devaddr, NULL)) { - usbi_dbg("failed to enumerate dir entry %s", entry->d_name); - continue; - } - - r = 0; - } - - closedir(dir); - return r; -} - -static int usbfs_get_device_list(struct libusb_context *ctx) -{ - struct dirent *entry; - DIR *buses = opendir(usbfs_path); - int r = 0; - - if (!buses) { - usbi_err(ctx, "opendir buses failed errno=%d", errno); - return LIBUSB_ERROR_IO; - } - - while ((entry = readdir(buses))) { - int busnum; - - if (entry->d_name[0] == '.') - continue; - - if (usbdev_names) { - int devaddr; - if (!_is_usbdev_entry(entry, &busnum, &devaddr)) - continue; - - r = linux_enumerate_device(ctx, busnum, (uint8_t) devaddr, NULL); - if (r < 0) { - usbi_dbg("failed to enumerate dir entry %s", entry->d_name); - continue; - } - } else { - busnum = atoi(entry->d_name); - if (busnum == 0) { - usbi_dbg("unknown dir entry %s", entry->d_name); - continue; - } - - r = usbfs_scan_busdir(ctx, busnum); - if (r < 0) - break; - } - } - - closedir(buses); - return r; - -} -#endif - -static int sysfs_scan_device(struct libusb_context *ctx, const char *devname) -{ - uint8_t busnum, devaddr; - int ret; - - ret = linux_get_device_address (ctx, 0, &busnum, &devaddr, NULL, devname); - if (LIBUSB_SUCCESS != ret) { - return ret; - } - - return linux_enumerate_device(ctx, busnum & 0xff, devaddr & 0xff, - devname); -} - -#if !defined(USE_UDEV) -static int sysfs_get_device_list(struct libusb_context *ctx) -{ - DIR *devices = opendir(SYSFS_DEVICE_PATH); - struct dirent *entry; - int r = LIBUSB_ERROR_IO; - - if (!devices) { - usbi_err(ctx, "opendir devices failed errno=%d", errno); - return r; - } - - while ((entry = readdir(devices))) { - if ((!isdigit(entry->d_name[0]) && strncmp(entry->d_name, "usb", 3)) - || strchr(entry->d_name, ':')) - continue; - - if (sysfs_scan_device(ctx, entry->d_name)) { - usbi_dbg("failed to enumerate dir entry %s", entry->d_name); - continue; - } - - r = 0; - } - - closedir(devices); - return r; -} - -static int linux_default_scan_devices (struct libusb_context *ctx) -{ - /* we can retrieve device list and descriptors from sysfs or usbfs. - * sysfs is preferable, because if we use usbfs we end up resuming - * any autosuspended USB devices. however, sysfs is not available - * everywhere, so we need a usbfs fallback too. - * - * as described in the "sysfs vs usbfs" comment at the top of this - * file, sometimes we have sysfs but not enough information to - * relate sysfs devices to usbfs nodes. op_init() determines the - * adequacy of sysfs and sets sysfs_can_relate_devices. - */ - if (sysfs_can_relate_devices != 0) - return sysfs_get_device_list(ctx); - else - return usbfs_get_device_list(ctx); -} -#endif - -static int op_open(struct libusb_device_handle *handle) -{ - struct linux_device_handle_priv *hpriv = _device_handle_priv(handle); - int r; - - hpriv->fd = _get_usbfs_fd(handle->dev, O_RDWR, 0); - if (hpriv->fd < 0) { - if (hpriv->fd == LIBUSB_ERROR_NO_DEVICE) { - /* device will still be marked as attached if hotplug monitor thread - * hasn't processed remove event yet */ - usbi_mutex_static_lock(&linux_hotplug_lock); - if (handle->dev->attached) { - usbi_dbg("open failed with no device, but device still attached"); - linux_device_disconnected(handle->dev->bus_number, - handle->dev->device_address); - } - usbi_mutex_static_unlock(&linux_hotplug_lock); - } - return hpriv->fd; - } - - r = ioctl(hpriv->fd, IOCTL_USBFS_GET_CAPABILITIES, &hpriv->caps); - if (r < 0) { - if (errno == ENOTTY) - usbi_dbg("getcap not available"); - else - usbi_err(HANDLE_CTX(handle), "getcap failed (%d)", errno); - hpriv->caps = 0; - if (supports_flag_zero_packet) - hpriv->caps |= USBFS_CAP_ZERO_PACKET; - if (supports_flag_bulk_continuation) - hpriv->caps |= USBFS_CAP_BULK_CONTINUATION; - } - - r = usbi_add_pollfd(HANDLE_CTX(handle), hpriv->fd, POLLOUT); - if (r < 0) - close(hpriv->fd); - - return r; -} - -static void op_close(struct libusb_device_handle *dev_handle) -{ - struct linux_device_handle_priv *hpriv = _device_handle_priv(dev_handle); - /* fd may have already been removed by POLLERR condition in op_handle_events() */ - if (!hpriv->fd_removed) - usbi_remove_pollfd(HANDLE_CTX(dev_handle), hpriv->fd); - close(hpriv->fd); -} - -static int op_get_configuration(struct libusb_device_handle *handle, - int *config) -{ - int r; - - if (sysfs_can_relate_devices) { - r = sysfs_get_active_config(handle->dev, config); - } else { - r = usbfs_get_active_config(handle->dev, - _device_handle_priv(handle)->fd); - if (r == LIBUSB_SUCCESS) - *config = _device_priv(handle->dev)->active_config; - } - if (r < 0) - return r; - - if (*config == -1) { - usbi_err(HANDLE_CTX(handle), "device unconfigured"); - *config = 0; - } - - return 0; -} - -static int op_set_configuration(struct libusb_device_handle *handle, int config) -{ - struct linux_device_priv *priv = _device_priv(handle->dev); - int fd = _device_handle_priv(handle)->fd; - int r = ioctl(fd, IOCTL_USBFS_SETCONFIG, &config); - if (r) { - if (errno == EINVAL) - return LIBUSB_ERROR_NOT_FOUND; - else if (errno == EBUSY) - return LIBUSB_ERROR_BUSY; - else if (errno == ENODEV) - return LIBUSB_ERROR_NO_DEVICE; - - usbi_err(HANDLE_CTX(handle), "failed, error %d errno %d", r, errno); - return LIBUSB_ERROR_OTHER; - } - - /* update our cached active config descriptor */ - priv->active_config = config; - - return LIBUSB_SUCCESS; -} - -static int claim_interface(struct libusb_device_handle *handle, int iface) -{ - int fd = _device_handle_priv(handle)->fd; - int r = ioctl(fd, IOCTL_USBFS_CLAIMINTF, &iface); - if (r) { - if (errno == ENOENT) - return LIBUSB_ERROR_NOT_FOUND; - else if (errno == EBUSY) - return LIBUSB_ERROR_BUSY; - else if (errno == ENODEV) - return LIBUSB_ERROR_NO_DEVICE; - - usbi_err(HANDLE_CTX(handle), - "claim interface failed, error %d errno %d", r, errno); - return LIBUSB_ERROR_OTHER; - } - return 0; -} - -static int release_interface(struct libusb_device_handle *handle, int iface) -{ - int fd = _device_handle_priv(handle)->fd; - int r = ioctl(fd, IOCTL_USBFS_RELEASEINTF, &iface); - if (r) { - if (errno == ENODEV) - return LIBUSB_ERROR_NO_DEVICE; - - usbi_err(HANDLE_CTX(handle), - "release interface failed, error %d errno %d", r, errno); - return LIBUSB_ERROR_OTHER; - } - return 0; -} - -static int op_set_interface(struct libusb_device_handle *handle, int iface, - int altsetting) -{ - int fd = _device_handle_priv(handle)->fd; - struct usbfs_setinterface setintf; - int r; - - setintf.interface = iface; - setintf.altsetting = altsetting; - r = ioctl(fd, IOCTL_USBFS_SETINTF, &setintf); - if (r) { - if (errno == EINVAL) - return LIBUSB_ERROR_NOT_FOUND; - else if (errno == ENODEV) - return LIBUSB_ERROR_NO_DEVICE; - - usbi_err(HANDLE_CTX(handle), - "setintf failed error %d errno %d", r, errno); - return LIBUSB_ERROR_OTHER; - } - - return 0; -} - -static int op_clear_halt(struct libusb_device_handle *handle, - unsigned char endpoint) -{ - int fd = _device_handle_priv(handle)->fd; - unsigned int _endpoint = endpoint; - int r = ioctl(fd, IOCTL_USBFS_CLEAR_HALT, &_endpoint); - if (r) { - if (errno == ENOENT) - return LIBUSB_ERROR_NOT_FOUND; - else if (errno == ENODEV) - return LIBUSB_ERROR_NO_DEVICE; - - usbi_err(HANDLE_CTX(handle), - "clear_halt failed error %d errno %d", r, errno); - return LIBUSB_ERROR_OTHER; - } - - return 0; -} - -static int op_reset_device(struct libusb_device_handle *handle) -{ - int fd = _device_handle_priv(handle)->fd; - int i, r, ret = 0; - - /* Doing a device reset will cause the usbfs driver to get unbound - from any interfaces it is bound to. By voluntarily unbinding - the usbfs driver ourself, we stop the kernel from rebinding - the interface after reset (which would end up with the interface - getting bound to the in kernel driver if any). */ - for (i = 0; i < USB_MAXINTERFACES; i++) { - if (handle->claimed_interfaces & (1L << i)) { - release_interface(handle, i); - } - } - - usbi_mutex_lock(&handle->lock); - r = ioctl(fd, IOCTL_USBFS_RESET, NULL); - if (r) { - if (errno == ENODEV) { - ret = LIBUSB_ERROR_NOT_FOUND; - goto out; - } - - usbi_err(HANDLE_CTX(handle), - "reset failed error %d errno %d", r, errno); - ret = LIBUSB_ERROR_OTHER; - goto out; - } - - /* And re-claim any interfaces which were claimed before the reset */ - for (i = 0; i < USB_MAXINTERFACES; i++) { - if (handle->claimed_interfaces & (1L << i)) { - /* - * A driver may have completed modprobing during - * IOCTL_USBFS_RESET, and bound itself as soon as - * IOCTL_USBFS_RESET released the device lock - */ - r = detach_kernel_driver_and_claim(handle, i); - if (r) { - usbi_warn(HANDLE_CTX(handle), - "failed to re-claim interface %d after reset: %s", - i, libusb_error_name(r)); - handle->claimed_interfaces &= ~(1L << i); - ret = LIBUSB_ERROR_NOT_FOUND; - } - } - } -out: - usbi_mutex_unlock(&handle->lock); - return ret; -} - -static int do_streams_ioctl(struct libusb_device_handle *handle, long req, - uint32_t num_streams, unsigned char *endpoints, int num_endpoints) -{ - int r, fd = _device_handle_priv(handle)->fd; - struct usbfs_streams *streams; - - if (num_endpoints > 30) /* Max 15 in + 15 out eps */ - return LIBUSB_ERROR_INVALID_PARAM; - - streams = malloc(sizeof(struct usbfs_streams) + num_endpoints); - if (!streams) - return LIBUSB_ERROR_NO_MEM; - - streams->num_streams = num_streams; - streams->num_eps = num_endpoints; - memcpy(streams->eps, endpoints, num_endpoints); - - r = ioctl(fd, req, streams); - - free(streams); - - if (r < 0) { - if (errno == ENOTTY) - return LIBUSB_ERROR_NOT_SUPPORTED; - else if (errno == EINVAL) - return LIBUSB_ERROR_INVALID_PARAM; - else if (errno == ENODEV) - return LIBUSB_ERROR_NO_DEVICE; - - usbi_err(HANDLE_CTX(handle), - "streams-ioctl failed error %d errno %d", r, errno); - return LIBUSB_ERROR_OTHER; - } - return r; -} - -static int op_alloc_streams(struct libusb_device_handle *handle, - uint32_t num_streams, unsigned char *endpoints, int num_endpoints) -{ - return do_streams_ioctl(handle, IOCTL_USBFS_ALLOC_STREAMS, - num_streams, endpoints, num_endpoints); -} - -static int op_free_streams(struct libusb_device_handle *handle, - unsigned char *endpoints, int num_endpoints) -{ - return do_streams_ioctl(handle, IOCTL_USBFS_FREE_STREAMS, 0, - endpoints, num_endpoints); -} - -static unsigned char *op_dev_mem_alloc(struct libusb_device_handle *handle, - size_t len) -{ - struct linux_device_handle_priv *hpriv = _device_handle_priv(handle); - unsigned char *buffer = (unsigned char *)mmap(NULL, len, - PROT_READ | PROT_WRITE, MAP_SHARED, hpriv->fd, 0); - if (buffer == MAP_FAILED) { - usbi_err(HANDLE_CTX(handle), "alloc dev mem failed errno %d", - errno); - return NULL; - } - return buffer; -} - -static int op_dev_mem_free(struct libusb_device_handle *handle, - unsigned char *buffer, size_t len) -{ - if (munmap(buffer, len) != 0) { - usbi_err(HANDLE_CTX(handle), "free dev mem failed errno %d", - errno); - return LIBUSB_ERROR_OTHER; - } else { - return LIBUSB_SUCCESS; - } -} - -static int op_kernel_driver_active(struct libusb_device_handle *handle, - int interface) -{ - int fd = _device_handle_priv(handle)->fd; - struct usbfs_getdriver getdrv; - int r; - - getdrv.interface = interface; - r = ioctl(fd, IOCTL_USBFS_GETDRIVER, &getdrv); - if (r) { - if (errno == ENODATA) - return 0; - else if (errno == ENODEV) - return LIBUSB_ERROR_NO_DEVICE; - - usbi_err(HANDLE_CTX(handle), - "get driver failed error %d errno %d", r, errno); - return LIBUSB_ERROR_OTHER; - } - - return (strcmp(getdrv.driver, "usbfs") == 0) ? 0 : 1; -} - -static int op_detach_kernel_driver(struct libusb_device_handle *handle, - int interface) -{ - int fd = _device_handle_priv(handle)->fd; - struct usbfs_ioctl command; - struct usbfs_getdriver getdrv; - int r; - - command.ifno = interface; - command.ioctl_code = IOCTL_USBFS_DISCONNECT; - command.data = NULL; - - getdrv.interface = interface; - r = ioctl(fd, IOCTL_USBFS_GETDRIVER, &getdrv); - if (r == 0 && strcmp(getdrv.driver, "usbfs") == 0) - return LIBUSB_ERROR_NOT_FOUND; - - r = ioctl(fd, IOCTL_USBFS_IOCTL, &command); - if (r) { - if (errno == ENODATA) - return LIBUSB_ERROR_NOT_FOUND; - else if (errno == EINVAL) - return LIBUSB_ERROR_INVALID_PARAM; - else if (errno == ENODEV) - return LIBUSB_ERROR_NO_DEVICE; - - usbi_err(HANDLE_CTX(handle), - "detach failed error %d errno %d", r, errno); - return LIBUSB_ERROR_OTHER; - } - - return 0; -} - -static int op_attach_kernel_driver(struct libusb_device_handle *handle, - int interface) -{ - int fd = _device_handle_priv(handle)->fd; - struct usbfs_ioctl command; - int r; - - command.ifno = interface; - command.ioctl_code = IOCTL_USBFS_CONNECT; - command.data = NULL; - - r = ioctl(fd, IOCTL_USBFS_IOCTL, &command); - if (r < 0) { - if (errno == ENODATA) - return LIBUSB_ERROR_NOT_FOUND; - else if (errno == EINVAL) - return LIBUSB_ERROR_INVALID_PARAM; - else if (errno == ENODEV) - return LIBUSB_ERROR_NO_DEVICE; - else if (errno == EBUSY) - return LIBUSB_ERROR_BUSY; - - usbi_err(HANDLE_CTX(handle), - "attach failed error %d errno %d", r, errno); - return LIBUSB_ERROR_OTHER; - } else if (r == 0) { - return LIBUSB_ERROR_NOT_FOUND; - } - - return 0; -} - -static int detach_kernel_driver_and_claim(struct libusb_device_handle *handle, - int interface) -{ - struct usbfs_disconnect_claim dc; - int r, fd = _device_handle_priv(handle)->fd; - - dc.interface = interface; - strcpy(dc.driver, "usbfs"); - dc.flags = USBFS_DISCONNECT_CLAIM_EXCEPT_DRIVER; - r = ioctl(fd, IOCTL_USBFS_DISCONNECT_CLAIM, &dc); - if (r == 0 || (r != 0 && errno != ENOTTY)) { - if (r == 0) - return 0; - - switch (errno) { - case EBUSY: - return LIBUSB_ERROR_BUSY; - case EINVAL: - return LIBUSB_ERROR_INVALID_PARAM; - case ENODEV: - return LIBUSB_ERROR_NO_DEVICE; - } - usbi_err(HANDLE_CTX(handle), - "disconnect-and-claim failed errno %d", errno); - return LIBUSB_ERROR_OTHER; - } - - /* Fallback code for kernels which don't support the - disconnect-and-claim ioctl */ - r = op_detach_kernel_driver(handle, interface); - if (r != 0 && r != LIBUSB_ERROR_NOT_FOUND) - return r; - - return claim_interface(handle, interface); -} - -static int op_claim_interface(struct libusb_device_handle *handle, int iface) -{ - if (handle->auto_detach_kernel_driver) - return detach_kernel_driver_and_claim(handle, iface); - else - return claim_interface(handle, iface); -} - -static int op_release_interface(struct libusb_device_handle *handle, int iface) -{ - int r; - - r = release_interface(handle, iface); - if (r) - return r; - - if (handle->auto_detach_kernel_driver) - op_attach_kernel_driver(handle, iface); - - return 0; -} - -static void op_destroy_device(struct libusb_device *dev) -{ - struct linux_device_priv *priv = _device_priv(dev); - if (priv->descriptors) - free(priv->descriptors); - if (priv->sysfs_dir) - free(priv->sysfs_dir); -} - -/* URBs are discarded in reverse order of submission to avoid races. */ -static int discard_urbs(struct usbi_transfer *itransfer, int first, int last_plus_one) -{ - struct libusb_transfer *transfer = - USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct linux_transfer_priv *tpriv = - usbi_transfer_get_os_priv(itransfer); - struct linux_device_handle_priv *dpriv = - _device_handle_priv(transfer->dev_handle); - int i, ret = 0; - struct usbfs_urb *urb; - - for (i = last_plus_one - 1; i >= first; i--) { - if (LIBUSB_TRANSFER_TYPE_ISOCHRONOUS == transfer->type) - urb = tpriv->iso_urbs[i]; - else - urb = &tpriv->urbs[i]; - - if (0 == ioctl(dpriv->fd, IOCTL_USBFS_DISCARDURB, urb)) - continue; - - if (EINVAL == errno) { - usbi_dbg("URB not found --> assuming ready to be reaped"); - if (i == (last_plus_one - 1)) - ret = LIBUSB_ERROR_NOT_FOUND; - } else if (ENODEV == errno) { - usbi_dbg("Device not found for URB --> assuming ready to be reaped"); - ret = LIBUSB_ERROR_NO_DEVICE; - } else { - usbi_warn(TRANSFER_CTX(transfer), - "unrecognised discard errno %d", errno); - ret = LIBUSB_ERROR_OTHER; - } - } - return ret; -} - -static void free_iso_urbs(struct linux_transfer_priv *tpriv) -{ - int i; - for (i = 0; i < tpriv->num_urbs; i++) { - struct usbfs_urb *urb = tpriv->iso_urbs[i]; - if (!urb) - break; - free(urb); - } - - free(tpriv->iso_urbs); - tpriv->iso_urbs = NULL; -} - -static int submit_bulk_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = - USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); - struct linux_device_handle_priv *dpriv = - _device_handle_priv(transfer->dev_handle); - struct usbfs_urb *urbs; - int is_out = (transfer->endpoint & LIBUSB_ENDPOINT_DIR_MASK) - == LIBUSB_ENDPOINT_OUT; - int bulk_buffer_len, use_bulk_continuation; - int r; - int i; - - if (is_out && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) && - !(dpriv->caps & USBFS_CAP_ZERO_PACKET)) - return LIBUSB_ERROR_NOT_SUPPORTED; - - /* - * Older versions of usbfs place a 16kb limit on bulk URBs. We work - * around this by splitting large transfers into 16k blocks, and then - * submit all urbs at once. it would be simpler to submit one urb at - * a time, but there is a big performance gain doing it this way. - * - * Newer versions lift the 16k limit (USBFS_CAP_NO_PACKET_SIZE_LIM), - * using arbritary large transfers can still be a bad idea though, as - * the kernel needs to allocate physical contiguous memory for this, - * which may fail for large buffers. - * - * The kernel solves this problem by splitting the transfer into - * blocks itself when the host-controller is scatter-gather capable - * (USBFS_CAP_BULK_SCATTER_GATHER), which most controllers are. - * - * Last, there is the issue of short-transfers when splitting, for - * short split-transfers to work reliable USBFS_CAP_BULK_CONTINUATION - * is needed, but this is not always available. - */ - if (dpriv->caps & USBFS_CAP_BULK_SCATTER_GATHER) { - /* Good! Just submit everything in one go */ - bulk_buffer_len = transfer->length ? transfer->length : 1; - use_bulk_continuation = 0; - } else if (dpriv->caps & USBFS_CAP_BULK_CONTINUATION) { - /* Split the transfers and use bulk-continuation to - avoid issues with short-transfers */ - bulk_buffer_len = MAX_BULK_BUFFER_LENGTH; - use_bulk_continuation = 1; - } else if (dpriv->caps & USBFS_CAP_NO_PACKET_SIZE_LIM) { - /* Don't split, assume the kernel can alloc the buffer - (otherwise the submit will fail with -ENOMEM) */ - bulk_buffer_len = transfer->length ? transfer->length : 1; - use_bulk_continuation = 0; - } else { - /* Bad, splitting without bulk-continuation, short transfers - which end before the last urb will not work reliable! */ - /* Note we don't warn here as this is "normal" on kernels < - 2.6.32 and not a problem for most applications */ - bulk_buffer_len = MAX_BULK_BUFFER_LENGTH; - use_bulk_continuation = 0; - } - - int num_urbs = transfer->length / bulk_buffer_len; - int last_urb_partial = 0; - - if (transfer->length == 0) { - num_urbs = 1; - } else if ((transfer->length % bulk_buffer_len) > 0) { - last_urb_partial = 1; - num_urbs++; - } - usbi_dbg("need %d urbs for new transfer with length %d", num_urbs, - transfer->length); - urbs = calloc(num_urbs, sizeof(struct usbfs_urb)); - if (!urbs) - return LIBUSB_ERROR_NO_MEM; - tpriv->urbs = urbs; - tpriv->num_urbs = num_urbs; - tpriv->num_retired = 0; - tpriv->reap_action = NORMAL; - tpriv->reap_status = LIBUSB_TRANSFER_COMPLETED; - - for (i = 0; i < num_urbs; i++) { - struct usbfs_urb *urb = &urbs[i]; - urb->usercontext = itransfer; - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_BULK: - urb->type = USBFS_URB_TYPE_BULK; - urb->stream_id = 0; - break; - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - urb->type = USBFS_URB_TYPE_BULK; - urb->stream_id = itransfer->stream_id; - break; - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - urb->type = USBFS_URB_TYPE_INTERRUPT; - break; - } - urb->endpoint = transfer->endpoint; - urb->buffer = transfer->buffer + (i * bulk_buffer_len); - /* don't set the short not ok flag for the last URB */ - if (use_bulk_continuation && !is_out && (i < num_urbs - 1)) - urb->flags = USBFS_URB_SHORT_NOT_OK; - if (i == num_urbs - 1 && last_urb_partial) - urb->buffer_length = transfer->length % bulk_buffer_len; - else if (transfer->length == 0) - urb->buffer_length = 0; - else - urb->buffer_length = bulk_buffer_len; - - if (i > 0 && use_bulk_continuation) - urb->flags |= USBFS_URB_BULK_CONTINUATION; - - /* we have already checked that the flag is supported */ - if (is_out && i == num_urbs - 1 && - transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) - urb->flags |= USBFS_URB_ZERO_PACKET; - - r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urb); - if (r < 0) { - if (errno == ENODEV) { - r = LIBUSB_ERROR_NO_DEVICE; - } else { - usbi_err(TRANSFER_CTX(transfer), - "submiturb failed error %d errno=%d", r, errno); - r = LIBUSB_ERROR_IO; - } - - /* if the first URB submission fails, we can simply free up and - * return failure immediately. */ - if (i == 0) { - usbi_dbg("first URB failed, easy peasy"); - free(urbs); - tpriv->urbs = NULL; - return r; - } - - /* if it's not the first URB that failed, the situation is a bit - * tricky. we may need to discard all previous URBs. there are - * complications: - * - discarding is asynchronous - discarded urbs will be reaped - * later. the user must not have freed the transfer when the - * discarded URBs are reaped, otherwise libusb will be using - * freed memory. - * - the earlier URBs may have completed successfully and we do - * not want to throw away any data. - * - this URB failing may be no error; EREMOTEIO means that - * this transfer simply didn't need all the URBs we submitted - * so, we report that the transfer was submitted successfully and - * in case of error we discard all previous URBs. later when - * the final reap completes we can report error to the user, - * or success if an earlier URB was completed successfully. - */ - tpriv->reap_action = EREMOTEIO == errno ? COMPLETED_EARLY : SUBMIT_FAILED; - - /* The URBs we haven't submitted yet we count as already - * retired. */ - tpriv->num_retired += num_urbs - i; - - /* If we completed short then don't try to discard. */ - if (COMPLETED_EARLY == tpriv->reap_action) - return 0; - - discard_urbs(itransfer, 0, i); - - usbi_dbg("reporting successful submission but waiting for %d " - "discards before reporting error", i); - return 0; - } - } - - return 0; -} - -static int submit_iso_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = - USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); - struct linux_device_handle_priv *dpriv = - _device_handle_priv(transfer->dev_handle); - struct usbfs_urb **urbs; - size_t alloc_size; - int num_packets = transfer->num_iso_packets; - int i; - int this_urb_len = 0; - int num_urbs = 1; - int packet_offset = 0; - unsigned int packet_len; - unsigned char *urb_buffer = transfer->buffer; - - /* usbfs places arbitrary limits on iso URBs. this limit has changed - * at least three times, and it's difficult to accurately detect which - * limit this running kernel might impose. so we attempt to submit - * whatever the user has provided. if the kernel rejects the request - * due to its size, we return an error indicating such to the user. - */ - - /* calculate how many URBs we need */ - for (i = 0; i < num_packets; i++) { - unsigned int space_remaining = MAX_ISO_BUFFER_LENGTH - this_urb_len; - packet_len = transfer->iso_packet_desc[i].length; - - if (packet_len > space_remaining) { - num_urbs++; - this_urb_len = packet_len; - /* check that we can actually support this packet length */ - if (this_urb_len > MAX_ISO_BUFFER_LENGTH) - return LIBUSB_ERROR_INVALID_PARAM; - } else { - this_urb_len += packet_len; - } - } - usbi_dbg("need %d %dk URBs for transfer", num_urbs, MAX_ISO_BUFFER_LENGTH / 1024); - - urbs = calloc(num_urbs, sizeof(*urbs)); - if (!urbs) - return LIBUSB_ERROR_NO_MEM; - - tpriv->iso_urbs = urbs; - tpriv->num_urbs = num_urbs; - tpriv->num_retired = 0; - tpriv->reap_action = NORMAL; - tpriv->iso_packet_offset = 0; - - /* allocate + initialize each URB with the correct number of packets */ - for (i = 0; i < num_urbs; i++) { - struct usbfs_urb *urb; - unsigned int space_remaining_in_urb = MAX_ISO_BUFFER_LENGTH; - int urb_packet_offset = 0; - unsigned char *urb_buffer_orig = urb_buffer; - int j; - int k; - - /* swallow up all the packets we can fit into this URB */ - while (packet_offset < transfer->num_iso_packets) { - packet_len = transfer->iso_packet_desc[packet_offset].length; - if (packet_len <= space_remaining_in_urb) { - /* throw it in */ - urb_packet_offset++; - packet_offset++; - space_remaining_in_urb -= packet_len; - urb_buffer += packet_len; - } else { - /* it can't fit, save it for the next URB */ - break; - } - } - - alloc_size = sizeof(*urb) - + (urb_packet_offset * sizeof(struct usbfs_iso_packet_desc)); - urb = calloc(1, alloc_size); - if (!urb) { - free_iso_urbs(tpriv); - return LIBUSB_ERROR_NO_MEM; - } - urbs[i] = urb; - - /* populate packet lengths */ - for (j = 0, k = packet_offset - urb_packet_offset; - k < packet_offset; k++, j++) { - packet_len = transfer->iso_packet_desc[k].length; - urb->iso_frame_desc[j].length = packet_len; - } - - urb->usercontext = itransfer; - urb->type = USBFS_URB_TYPE_ISO; - /* FIXME: interface for non-ASAP data? */ - urb->flags = USBFS_URB_ISO_ASAP; - urb->endpoint = transfer->endpoint; - urb->number_of_packets = urb_packet_offset; - urb->buffer = urb_buffer_orig; - } - - /* submit URBs */ - for (i = 0; i < num_urbs; i++) { - int r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urbs[i]); - if (r < 0) { - if (errno == ENODEV) { - r = LIBUSB_ERROR_NO_DEVICE; - } else if (errno == EINVAL) { - usbi_warn(TRANSFER_CTX(transfer), - "submiturb failed, transfer too large"); - r = LIBUSB_ERROR_INVALID_PARAM; - } else { - usbi_err(TRANSFER_CTX(transfer), - "submiturb failed error %d errno=%d", r, errno); - r = LIBUSB_ERROR_IO; - } - - /* if the first URB submission fails, we can simply free up and - * return failure immediately. */ - if (i == 0) { - usbi_dbg("first URB failed, easy peasy"); - free_iso_urbs(tpriv); - return r; - } - - /* if it's not the first URB that failed, the situation is a bit - * tricky. we must discard all previous URBs. there are - * complications: - * - discarding is asynchronous - discarded urbs will be reaped - * later. the user must not have freed the transfer when the - * discarded URBs are reaped, otherwise libusb will be using - * freed memory. - * - the earlier URBs may have completed successfully and we do - * not want to throw away any data. - * so, in this case we discard all the previous URBs BUT we report - * that the transfer was submitted successfully. then later when - * the final discard completes we can report error to the user. - */ - tpriv->reap_action = SUBMIT_FAILED; - - /* The URBs we haven't submitted yet we count as already - * retired. */ - tpriv->num_retired = num_urbs - i; - discard_urbs(itransfer, 0, i); - - usbi_dbg("reporting successful submission but waiting for %d " - "discards before reporting error", i); - return 0; - } - } - - return 0; -} - -static int submit_control_transfer(struct usbi_transfer *itransfer) -{ - struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); - struct libusb_transfer *transfer = - USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct linux_device_handle_priv *dpriv = - _device_handle_priv(transfer->dev_handle); - struct usbfs_urb *urb; - int r; - - if (transfer->length - LIBUSB_CONTROL_SETUP_SIZE > MAX_CTRL_BUFFER_LENGTH) - return LIBUSB_ERROR_INVALID_PARAM; - - urb = calloc(1, sizeof(struct usbfs_urb)); - if (!urb) - return LIBUSB_ERROR_NO_MEM; - tpriv->urbs = urb; - tpriv->num_urbs = 1; - tpriv->reap_action = NORMAL; - - urb->usercontext = itransfer; - urb->type = USBFS_URB_TYPE_CONTROL; - urb->endpoint = transfer->endpoint; - urb->buffer = transfer->buffer; - urb->buffer_length = transfer->length; - - r = ioctl(dpriv->fd, IOCTL_USBFS_SUBMITURB, urb); - if (r < 0) { - free(urb); - tpriv->urbs = NULL; - if (errno == ENODEV) - return LIBUSB_ERROR_NO_DEVICE; - - usbi_err(TRANSFER_CTX(transfer), - "submiturb failed error %d errno=%d", r, errno); - return LIBUSB_ERROR_IO; - } - return 0; -} - -static int op_submit_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = - USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - return submit_control_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - return submit_bulk_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - return submit_bulk_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - return submit_iso_transfer(itransfer); - default: - usbi_err(TRANSFER_CTX(transfer), - "unknown endpoint type %d", transfer->type); - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -static int op_cancel_transfer(struct usbi_transfer *itransfer) -{ - struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); - struct libusb_transfer *transfer = - USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - int r; - - if (!tpriv->urbs) - return LIBUSB_ERROR_NOT_FOUND; - - r = discard_urbs(itransfer, 0, tpriv->num_urbs); - if (r != 0) - return r; - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - if (tpriv->reap_action == ERROR) - break; - /* else, fall through */ - default: - tpriv->reap_action = CANCELLED; - } - - return 0; -} - -static void op_clear_transfer_priv(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = - USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); - - /* urbs can be freed also in submit_transfer so lock mutex first */ - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - if (tpriv->urbs) { - free(tpriv->urbs); - tpriv->urbs = NULL; - } - break; - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - if (tpriv->iso_urbs) { - free_iso_urbs(tpriv); - tpriv->iso_urbs = NULL; - } - break; - default: - usbi_err(TRANSFER_CTX(transfer), - "unknown endpoint type %d", transfer->type); - } -} - -static int handle_bulk_completion(struct usbi_transfer *itransfer, - struct usbfs_urb *urb) -{ - struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - int urb_idx = urb - tpriv->urbs; - - usbi_mutex_lock(&itransfer->lock); - usbi_dbg("handling completion status %d of bulk urb %d/%d", urb->status, - urb_idx + 1, tpriv->num_urbs); - - tpriv->num_retired++; - - if (tpriv->reap_action != NORMAL) { - /* cancelled, submit_fail, or completed early */ - usbi_dbg("abnormal reap: urb status %d", urb->status); - - /* even though we're in the process of cancelling, it's possible that - * we may receive some data in these URBs that we don't want to lose. - * examples: - * 1. while the kernel is cancelling all the packets that make up an - * URB, a few of them might complete. so we get back a successful - * cancellation *and* some data. - * 2. we receive a short URB which marks the early completion condition, - * so we start cancelling the remaining URBs. however, we're too - * slow and another URB completes (or at least completes partially). - * (this can't happen since we always use BULK_CONTINUATION.) - * - * When this happens, our objectives are not to lose any "surplus" data, - * and also to stick it at the end of the previously-received data - * (closing any holes), so that libusb reports the total amount of - * transferred data and presents it in a contiguous chunk. - */ - if (urb->actual_length > 0) { - unsigned char *target = transfer->buffer + itransfer->transferred; - usbi_dbg("received %d bytes of surplus data", urb->actual_length); - if (urb->buffer != target) { - usbi_dbg("moving surplus data from offset %d to offset %d", - (unsigned char *) urb->buffer - transfer->buffer, - target - transfer->buffer); - memmove(target, urb->buffer, urb->actual_length); - } - itransfer->transferred += urb->actual_length; - } - - if (tpriv->num_retired == tpriv->num_urbs) { - usbi_dbg("abnormal reap: last URB handled, reporting"); - if (tpriv->reap_action != COMPLETED_EARLY && - tpriv->reap_status == LIBUSB_TRANSFER_COMPLETED) - tpriv->reap_status = LIBUSB_TRANSFER_ERROR; - goto completed; - } - goto out_unlock; - } - - itransfer->transferred += urb->actual_length; - - /* Many of these errors can occur on *any* urb of a multi-urb - * transfer. When they do, we tear down the rest of the transfer. - */ - switch (urb->status) { - case 0: - break; - case -EREMOTEIO: /* short transfer */ - break; - case -ENOENT: /* cancelled */ - case -ECONNRESET: - break; - case -ENODEV: - case -ESHUTDOWN: - usbi_dbg("device removed"); - tpriv->reap_status = LIBUSB_TRANSFER_NO_DEVICE; - goto cancel_remaining; - case -EPIPE: - usbi_dbg("detected endpoint stall"); - if (tpriv->reap_status == LIBUSB_TRANSFER_COMPLETED) - tpriv->reap_status = LIBUSB_TRANSFER_STALL; - goto cancel_remaining; - case -EOVERFLOW: - /* overflow can only ever occur in the last urb */ - usbi_dbg("overflow, actual_length=%d", urb->actual_length); - if (tpriv->reap_status == LIBUSB_TRANSFER_COMPLETED) - tpriv->reap_status = LIBUSB_TRANSFER_OVERFLOW; - goto completed; - case -ETIME: - case -EPROTO: - case -EILSEQ: - case -ECOMM: - case -ENOSR: - usbi_dbg("low level error %d", urb->status); - tpriv->reap_action = ERROR; - goto cancel_remaining; - default: - usbi_warn(ITRANSFER_CTX(itransfer), - "unrecognised urb status %d", urb->status); - tpriv->reap_action = ERROR; - goto cancel_remaining; - } - - /* if we're the last urb or we got less data than requested then we're - * done */ - if (urb_idx == tpriv->num_urbs - 1) { - usbi_dbg("last URB in transfer --> complete!"); - goto completed; - } else if (urb->actual_length < urb->buffer_length) { - usbi_dbg("short transfer %d/%d --> complete!", - urb->actual_length, urb->buffer_length); - if (tpriv->reap_action == NORMAL) - tpriv->reap_action = COMPLETED_EARLY; - } else - goto out_unlock; - -cancel_remaining: - if (ERROR == tpriv->reap_action && LIBUSB_TRANSFER_COMPLETED == tpriv->reap_status) - tpriv->reap_status = LIBUSB_TRANSFER_ERROR; - - if (tpriv->num_retired == tpriv->num_urbs) /* nothing to cancel */ - goto completed; - - /* cancel remaining urbs and wait for their completion before - * reporting results */ - discard_urbs(itransfer, urb_idx + 1, tpriv->num_urbs); - -out_unlock: - usbi_mutex_unlock(&itransfer->lock); - return 0; - -completed: - free(tpriv->urbs); - tpriv->urbs = NULL; - usbi_mutex_unlock(&itransfer->lock); - return CANCELLED == tpriv->reap_action ? - usbi_handle_transfer_cancellation(itransfer) : - usbi_handle_transfer_completion(itransfer, tpriv->reap_status); -} - -static int handle_iso_completion(struct usbi_transfer *itransfer, - struct usbfs_urb *urb) -{ - struct libusb_transfer *transfer = - USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); - int num_urbs = tpriv->num_urbs; - int urb_idx = 0; - int i; - enum libusb_transfer_status status = LIBUSB_TRANSFER_COMPLETED; - - usbi_mutex_lock(&itransfer->lock); - for (i = 0; i < num_urbs; i++) { - if (urb == tpriv->iso_urbs[i]) { - urb_idx = i + 1; - break; - } - } - if (urb_idx == 0) { - usbi_err(TRANSFER_CTX(transfer), "could not locate urb!"); - usbi_mutex_unlock(&itransfer->lock); - return LIBUSB_ERROR_NOT_FOUND; - } - - usbi_dbg("handling completion status %d of iso urb %d/%d", urb->status, - urb_idx, num_urbs); - - /* copy isochronous results back in */ - - for (i = 0; i < urb->number_of_packets; i++) { - struct usbfs_iso_packet_desc *urb_desc = &urb->iso_frame_desc[i]; - struct libusb_iso_packet_descriptor *lib_desc = - &transfer->iso_packet_desc[tpriv->iso_packet_offset++]; - lib_desc->status = LIBUSB_TRANSFER_COMPLETED; - switch (urb_desc->status) { - case 0: - break; - case -ENOENT: /* cancelled */ - case -ECONNRESET: - break; - case -ENODEV: - case -ESHUTDOWN: - usbi_dbg("device removed"); - lib_desc->status = LIBUSB_TRANSFER_NO_DEVICE; - break; - case -EPIPE: - usbi_dbg("detected endpoint stall"); - lib_desc->status = LIBUSB_TRANSFER_STALL; - break; - case -EOVERFLOW: - usbi_dbg("overflow error"); - lib_desc->status = LIBUSB_TRANSFER_OVERFLOW; - break; - case -ETIME: - case -EPROTO: - case -EILSEQ: - case -ECOMM: - case -ENOSR: - case -EXDEV: - usbi_dbg("low-level USB error %d", urb_desc->status); - lib_desc->status = LIBUSB_TRANSFER_ERROR; - break; - default: - usbi_warn(TRANSFER_CTX(transfer), - "unrecognised urb status %d", urb_desc->status); - lib_desc->status = LIBUSB_TRANSFER_ERROR; - break; - } - lib_desc->actual_length = urb_desc->actual_length; - } - - tpriv->num_retired++; - - if (tpriv->reap_action != NORMAL) { /* cancelled or submit_fail */ - usbi_dbg("CANCEL: urb status %d", urb->status); - - if (tpriv->num_retired == num_urbs) { - usbi_dbg("CANCEL: last URB handled, reporting"); - free_iso_urbs(tpriv); - if (tpriv->reap_action == CANCELLED) { - usbi_mutex_unlock(&itransfer->lock); - return usbi_handle_transfer_cancellation(itransfer); - } else { - usbi_mutex_unlock(&itransfer->lock); - return usbi_handle_transfer_completion(itransfer, - LIBUSB_TRANSFER_ERROR); - } - } - goto out; - } - - switch (urb->status) { - case 0: - break; - case -ENOENT: /* cancelled */ - case -ECONNRESET: - break; - case -ESHUTDOWN: - usbi_dbg("device removed"); - status = LIBUSB_TRANSFER_NO_DEVICE; - break; - default: - usbi_warn(TRANSFER_CTX(transfer), - "unrecognised urb status %d", urb->status); - status = LIBUSB_TRANSFER_ERROR; - break; - } - - /* if we're the last urb then we're done */ - if (urb_idx == num_urbs) { - usbi_dbg("last URB in transfer --> complete!"); - free_iso_urbs(tpriv); - usbi_mutex_unlock(&itransfer->lock); - return usbi_handle_transfer_completion(itransfer, status); - } - -out: - usbi_mutex_unlock(&itransfer->lock); - return 0; -} - -static int handle_control_completion(struct usbi_transfer *itransfer, - struct usbfs_urb *urb) -{ - struct linux_transfer_priv *tpriv = usbi_transfer_get_os_priv(itransfer); - int status; - - usbi_mutex_lock(&itransfer->lock); - usbi_dbg("handling completion status %d", urb->status); - - itransfer->transferred += urb->actual_length; - - if (tpriv->reap_action == CANCELLED) { - if (urb->status != 0 && urb->status != -ENOENT) - usbi_warn(ITRANSFER_CTX(itransfer), - "cancel: unrecognised urb status %d", urb->status); - free(tpriv->urbs); - tpriv->urbs = NULL; - usbi_mutex_unlock(&itransfer->lock); - return usbi_handle_transfer_cancellation(itransfer); - } - - switch (urb->status) { - case 0: - status = LIBUSB_TRANSFER_COMPLETED; - break; - case -ENOENT: /* cancelled */ - status = LIBUSB_TRANSFER_CANCELLED; - break; - case -ENODEV: - case -ESHUTDOWN: - usbi_dbg("device removed"); - status = LIBUSB_TRANSFER_NO_DEVICE; - break; - case -EPIPE: - usbi_dbg("unsupported control request"); - status = LIBUSB_TRANSFER_STALL; - break; - case -EOVERFLOW: - usbi_dbg("control overflow error"); - status = LIBUSB_TRANSFER_OVERFLOW; - break; - case -ETIME: - case -EPROTO: - case -EILSEQ: - case -ECOMM: - case -ENOSR: - usbi_dbg("low-level bus error occurred"); - status = LIBUSB_TRANSFER_ERROR; - break; - default: - usbi_warn(ITRANSFER_CTX(itransfer), - "unrecognised urb status %d", urb->status); - status = LIBUSB_TRANSFER_ERROR; - break; - } - - free(tpriv->urbs); - tpriv->urbs = NULL; - usbi_mutex_unlock(&itransfer->lock); - return usbi_handle_transfer_completion(itransfer, status); -} - -static int reap_for_handle(struct libusb_device_handle *handle) -{ - struct linux_device_handle_priv *hpriv = _device_handle_priv(handle); - int r; - struct usbfs_urb *urb; - struct usbi_transfer *itransfer; - struct libusb_transfer *transfer; - - r = ioctl(hpriv->fd, IOCTL_USBFS_REAPURBNDELAY, &urb); - if (r == -1 && errno == EAGAIN) - return 1; - if (r < 0) { - if (errno == ENODEV) - return LIBUSB_ERROR_NO_DEVICE; - - usbi_err(HANDLE_CTX(handle), "reap failed error %d errno=%d", - r, errno); - return LIBUSB_ERROR_IO; - } - - itransfer = urb->usercontext; - transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - usbi_dbg("urb type=%d status=%d transferred=%d", urb->type, urb->status, - urb->actual_length); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - return handle_iso_completion(itransfer, urb); - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - return handle_bulk_completion(itransfer, urb); - case LIBUSB_TRANSFER_TYPE_CONTROL: - return handle_control_completion(itransfer, urb); - default: - usbi_err(HANDLE_CTX(handle), "unrecognised endpoint type %x", - transfer->type); - return LIBUSB_ERROR_OTHER; - } -} - -static int op_handle_events(struct libusb_context *ctx, - struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) -{ - int r; - unsigned int i = 0; - - usbi_mutex_lock(&ctx->open_devs_lock); - for (i = 0; i < nfds && num_ready > 0; i++) { - struct pollfd *pollfd = &fds[i]; - struct libusb_device_handle *handle; - struct linux_device_handle_priv *hpriv = NULL; - - if (!pollfd->revents) - continue; - - num_ready--; - list_for_each_entry(handle, &ctx->open_devs, list, struct libusb_device_handle) { - hpriv = _device_handle_priv(handle); - if (hpriv->fd == pollfd->fd) - break; - } - - if (!hpriv || hpriv->fd != pollfd->fd) { - usbi_err(ctx, "cannot find handle for fd %d", - pollfd->fd); - continue; - } - - if (pollfd->revents & POLLERR) { - /* remove the fd from the pollfd set so that it doesn't continuously - * trigger an event, and flag that it has been removed so op_close() - * doesn't try to remove it a second time */ - usbi_remove_pollfd(HANDLE_CTX(handle), hpriv->fd); - hpriv->fd_removed = 1; - - /* device will still be marked as attached if hotplug monitor thread - * hasn't processed remove event yet */ - usbi_mutex_static_lock(&linux_hotplug_lock); - if (handle->dev->attached) - linux_device_disconnected(handle->dev->bus_number, - handle->dev->device_address); - usbi_mutex_static_unlock(&linux_hotplug_lock); - - if (hpriv->caps & USBFS_CAP_REAP_AFTER_DISCONNECT) { - do { - r = reap_for_handle(handle); - } while (r == 0); - } - - usbi_handle_disconnect(handle); - continue; - } - - do { - r = reap_for_handle(handle); - } while (r == 0); - if (r == 1 || r == LIBUSB_ERROR_NO_DEVICE) - continue; - else if (r < 0) - goto out; - } - - r = 0; -out: - usbi_mutex_unlock(&ctx->open_devs_lock); - return r; -} - -static int op_clock_gettime(int clk_id, struct timespec *tp) -{ - switch (clk_id) { - case USBI_CLOCK_MONOTONIC: - return clock_gettime(monotonic_clkid, tp); - case USBI_CLOCK_REALTIME: - return clock_gettime(CLOCK_REALTIME, tp); - default: - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -#ifdef USBI_TIMERFD_AVAILABLE -static clockid_t op_get_timerfd_clockid(void) -{ - return monotonic_clkid; - -} -#endif - -const struct usbi_os_backend linux_usbfs_backend = { - .name = "Linux usbfs", - .caps = USBI_CAP_HAS_HID_ACCESS|USBI_CAP_SUPPORTS_DETACH_KERNEL_DRIVER, - .init = op_init, - .exit = op_exit, - .get_device_list = NULL, - .hotplug_poll = op_hotplug_poll, - .get_device_descriptor = op_get_device_descriptor, - .get_active_config_descriptor = op_get_active_config_descriptor, - .get_config_descriptor = op_get_config_descriptor, - .get_config_descriptor_by_value = op_get_config_descriptor_by_value, - - .open = op_open, - .close = op_close, - .get_configuration = op_get_configuration, - .set_configuration = op_set_configuration, - .claim_interface = op_claim_interface, - .release_interface = op_release_interface, - - .set_interface_altsetting = op_set_interface, - .clear_halt = op_clear_halt, - .reset_device = op_reset_device, - - .alloc_streams = op_alloc_streams, - .free_streams = op_free_streams, - - .dev_mem_alloc = op_dev_mem_alloc, - .dev_mem_free = op_dev_mem_free, - - .kernel_driver_active = op_kernel_driver_active, - .detach_kernel_driver = op_detach_kernel_driver, - .attach_kernel_driver = op_attach_kernel_driver, - - .destroy_device = op_destroy_device, - - .submit_transfer = op_submit_transfer, - .cancel_transfer = op_cancel_transfer, - .clear_transfer_priv = op_clear_transfer_priv, - - .handle_events = op_handle_events, - - .clock_gettime = op_clock_gettime, - -#ifdef USBI_TIMERFD_AVAILABLE - .get_timerfd_clockid = op_get_timerfd_clockid, -#endif - - .device_priv_size = sizeof(struct linux_device_priv), - .device_handle_priv_size = sizeof(struct linux_device_handle_priv), - .transfer_priv_size = sizeof(struct linux_transfer_priv), -}; diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_usbfs.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_usbfs.h deleted file mode 100644 index 8bd3ebcb163e..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/linux_usbfs.h +++ /dev/null @@ -1,193 +0,0 @@ -/* - * usbfs header structures - * Copyright © 2007 Daniel Drake - * Copyright © 2001 Johannes Erdfelt - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef LIBUSB_USBFS_H -#define LIBUSB_USBFS_H - -#include - -#define SYSFS_DEVICE_PATH "/sys/bus/usb/devices" - -struct usbfs_ctrltransfer { - /* keep in sync with usbdevice_fs.h:usbdevfs_ctrltransfer */ - uint8_t bmRequestType; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; - - uint32_t timeout; /* in milliseconds */ - - /* pointer to data */ - void *data; -}; - -struct usbfs_bulktransfer { - /* keep in sync with usbdevice_fs.h:usbdevfs_bulktransfer */ - unsigned int ep; - unsigned int len; - unsigned int timeout; /* in milliseconds */ - - /* pointer to data */ - void *data; -}; - -struct usbfs_setinterface { - /* keep in sync with usbdevice_fs.h:usbdevfs_setinterface */ - unsigned int interface; - unsigned int altsetting; -}; - -#define USBFS_MAXDRIVERNAME 255 - -struct usbfs_getdriver { - unsigned int interface; - char driver[USBFS_MAXDRIVERNAME + 1]; -}; - -#define USBFS_URB_SHORT_NOT_OK 0x01 -#define USBFS_URB_ISO_ASAP 0x02 -#define USBFS_URB_BULK_CONTINUATION 0x04 -#define USBFS_URB_QUEUE_BULK 0x10 -#define USBFS_URB_ZERO_PACKET 0x40 - -enum usbfs_urb_type { - USBFS_URB_TYPE_ISO = 0, - USBFS_URB_TYPE_INTERRUPT = 1, - USBFS_URB_TYPE_CONTROL = 2, - USBFS_URB_TYPE_BULK = 3, -}; - -struct usbfs_iso_packet_desc { - unsigned int length; - unsigned int actual_length; - unsigned int status; -}; - -#define MAX_ISO_BUFFER_LENGTH 49152 * 128 -#define MAX_BULK_BUFFER_LENGTH 16384 -#define MAX_CTRL_BUFFER_LENGTH 4096 - -struct usbfs_urb { - unsigned char type; - unsigned char endpoint; - int status; - unsigned int flags; - void *buffer; - int buffer_length; - int actual_length; - int start_frame; - union { - int number_of_packets; /* Only used for isoc urbs */ - unsigned int stream_id; /* Only used with bulk streams */ - }; - int error_count; - unsigned int signr; - void *usercontext; - struct usbfs_iso_packet_desc iso_frame_desc[0]; -}; - -struct usbfs_connectinfo { - unsigned int devnum; - unsigned char slow; -}; - -struct usbfs_ioctl { - int ifno; /* interface 0..N ; negative numbers reserved */ - int ioctl_code; /* MUST encode size + direction of data so the - * macros in give correct values */ - void *data; /* param buffer (in, or out) */ -}; - -struct usbfs_hub_portinfo { - unsigned char numports; - unsigned char port[127]; /* port to device num mapping */ -}; - -#define USBFS_CAP_ZERO_PACKET 0x01 -#define USBFS_CAP_BULK_CONTINUATION 0x02 -#define USBFS_CAP_NO_PACKET_SIZE_LIM 0x04 -#define USBFS_CAP_BULK_SCATTER_GATHER 0x08 -#define USBFS_CAP_REAP_AFTER_DISCONNECT 0x10 - -#define USBFS_DISCONNECT_CLAIM_IF_DRIVER 0x01 -#define USBFS_DISCONNECT_CLAIM_EXCEPT_DRIVER 0x02 - -struct usbfs_disconnect_claim { - unsigned int interface; - unsigned int flags; - char driver[USBFS_MAXDRIVERNAME + 1]; -}; - -struct usbfs_streams { - unsigned int num_streams; /* Not used by USBDEVFS_FREE_STREAMS */ - unsigned int num_eps; - unsigned char eps[0]; -}; - -#define IOCTL_USBFS_CONTROL _IOWR('U', 0, struct usbfs_ctrltransfer) -#define IOCTL_USBFS_BULK _IOWR('U', 2, struct usbfs_bulktransfer) -#define IOCTL_USBFS_RESETEP _IOR('U', 3, unsigned int) -#define IOCTL_USBFS_SETINTF _IOR('U', 4, struct usbfs_setinterface) -#define IOCTL_USBFS_SETCONFIG _IOR('U', 5, unsigned int) -#define IOCTL_USBFS_GETDRIVER _IOW('U', 8, struct usbfs_getdriver) -#define IOCTL_USBFS_SUBMITURB _IOR('U', 10, struct usbfs_urb) -#define IOCTL_USBFS_DISCARDURB _IO('U', 11) -#define IOCTL_USBFS_REAPURB _IOW('U', 12, void *) -#define IOCTL_USBFS_REAPURBNDELAY _IOW('U', 13, void *) -#define IOCTL_USBFS_CLAIMINTF _IOR('U', 15, unsigned int) -#define IOCTL_USBFS_RELEASEINTF _IOR('U', 16, unsigned int) -#define IOCTL_USBFS_CONNECTINFO _IOW('U', 17, struct usbfs_connectinfo) -#define IOCTL_USBFS_IOCTL _IOWR('U', 18, struct usbfs_ioctl) -#define IOCTL_USBFS_HUB_PORTINFO _IOR('U', 19, struct usbfs_hub_portinfo) -#define IOCTL_USBFS_RESET _IO('U', 20) -#define IOCTL_USBFS_CLEAR_HALT _IOR('U', 21, unsigned int) -#define IOCTL_USBFS_DISCONNECT _IO('U', 22) -#define IOCTL_USBFS_CONNECT _IO('U', 23) -#define IOCTL_USBFS_CLAIM_PORT _IOR('U', 24, unsigned int) -#define IOCTL_USBFS_RELEASE_PORT _IOR('U', 25, unsigned int) -#define IOCTL_USBFS_GET_CAPABILITIES _IOR('U', 26, __u32) -#define IOCTL_USBFS_DISCONNECT_CLAIM _IOR('U', 27, struct usbfs_disconnect_claim) -#define IOCTL_USBFS_ALLOC_STREAMS _IOR('U', 28, struct usbfs_streams) -#define IOCTL_USBFS_FREE_STREAMS _IOR('U', 29, struct usbfs_streams) - -extern usbi_mutex_static_t linux_hotplug_lock; - -#if defined(HAVE_LIBUDEV) -int linux_udev_start_event_monitor(void); -int linux_udev_stop_event_monitor(void); -int linux_udev_scan_devices(struct libusb_context *ctx); -void linux_udev_hotplug_poll(void); -#else -int linux_netlink_start_event_monitor(void); -int linux_netlink_stop_event_monitor(void); -void linux_netlink_hotplug_poll(void); -#endif - -void linux_hotplug_enumerate(uint8_t busnum, uint8_t devaddr, const char *sys_name); -void linux_device_disconnected(uint8_t busnum, uint8_t devaddr); - -int linux_get_device_address (struct libusb_context *ctx, int detached, - uint8_t *busnum, uint8_t *devaddr, const char *dev_node, - const char *sys_name); -int linux_enumerate_device(struct libusb_context *ctx, - uint8_t busnum, uint8_t devaddr, const char *sysfs_dir); - -#endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/netbsd_usb.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/netbsd_usb.c deleted file mode 100644 index ad1ede73e10f..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/netbsd_usb.c +++ /dev/null @@ -1,677 +0,0 @@ -/* - * Copyright © 2011 Martin Pieuchot - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include "libusbi.h" - -struct device_priv { - char devnode[16]; - int fd; - - unsigned char *cdesc; /* active config descriptor */ - usb_device_descriptor_t ddesc; /* usb device descriptor */ -}; - -struct handle_priv { - int endpoints[USB_MAX_ENDPOINTS]; -}; - -/* - * Backend functions - */ -static int netbsd_get_device_list(struct libusb_context *, - struct discovered_devs **); -static int netbsd_open(struct libusb_device_handle *); -static void netbsd_close(struct libusb_device_handle *); - -static int netbsd_get_device_descriptor(struct libusb_device *, unsigned char *, - int *); -static int netbsd_get_active_config_descriptor(struct libusb_device *, - unsigned char *, size_t, int *); -static int netbsd_get_config_descriptor(struct libusb_device *, uint8_t, - unsigned char *, size_t, int *); - -static int netbsd_get_configuration(struct libusb_device_handle *, int *); -static int netbsd_set_configuration(struct libusb_device_handle *, int); - -static int netbsd_claim_interface(struct libusb_device_handle *, int); -static int netbsd_release_interface(struct libusb_device_handle *, int); - -static int netbsd_set_interface_altsetting(struct libusb_device_handle *, int, - int); -static int netbsd_clear_halt(struct libusb_device_handle *, unsigned char); -static int netbsd_reset_device(struct libusb_device_handle *); -static void netbsd_destroy_device(struct libusb_device *); - -static int netbsd_submit_transfer(struct usbi_transfer *); -static int netbsd_cancel_transfer(struct usbi_transfer *); -static void netbsd_clear_transfer_priv(struct usbi_transfer *); -static int netbsd_handle_transfer_completion(struct usbi_transfer *); -static int netbsd_clock_gettime(int, struct timespec *); - -/* - * Private functions - */ -static int _errno_to_libusb(int); -static int _cache_active_config_descriptor(struct libusb_device *, int); -static int _sync_control_transfer(struct usbi_transfer *); -static int _sync_gen_transfer(struct usbi_transfer *); -static int _access_endpoint(struct libusb_transfer *); - -const struct usbi_os_backend netbsd_backend = { - "Synchronous NetBSD backend", - 0, - NULL, /* init() */ - NULL, /* exit() */ - netbsd_get_device_list, - NULL, /* hotplug_poll */ - netbsd_open, - netbsd_close, - - netbsd_get_device_descriptor, - netbsd_get_active_config_descriptor, - netbsd_get_config_descriptor, - NULL, /* get_config_descriptor_by_value() */ - - netbsd_get_configuration, - netbsd_set_configuration, - - netbsd_claim_interface, - netbsd_release_interface, - - netbsd_set_interface_altsetting, - netbsd_clear_halt, - netbsd_reset_device, - - NULL, /* alloc_streams */ - NULL, /* free_streams */ - - NULL, /* dev_mem_alloc() */ - NULL, /* dev_mem_free() */ - - NULL, /* kernel_driver_active() */ - NULL, /* detach_kernel_driver() */ - NULL, /* attach_kernel_driver() */ - - netbsd_destroy_device, - - netbsd_submit_transfer, - netbsd_cancel_transfer, - netbsd_clear_transfer_priv, - - NULL, /* handle_events() */ - netbsd_handle_transfer_completion, - - netbsd_clock_gettime, - sizeof(struct device_priv), - sizeof(struct handle_priv), - 0, /* transfer_priv_size */ -}; - -int -netbsd_get_device_list(struct libusb_context * ctx, - struct discovered_devs **discdevs) -{ - struct libusb_device *dev; - struct device_priv *dpriv; - struct usb_device_info di; - unsigned long session_id; - char devnode[16]; - int fd, err, i; - - usbi_dbg(""); - - /* Only ugen(4) is supported */ - for (i = 0; i < USB_MAX_DEVICES; i++) { - /* Control endpoint is always .00 */ - snprintf(devnode, sizeof(devnode), "/dev/ugen%d.00", i); - - if ((fd = open(devnode, O_RDONLY)) < 0) { - if (errno != ENOENT && errno != ENXIO) - usbi_err(ctx, "could not open %s", devnode); - continue; - } - - if (ioctl(fd, USB_GET_DEVICEINFO, &di) < 0) - continue; - - session_id = (di.udi_bus << 8 | di.udi_addr); - dev = usbi_get_device_by_session_id(ctx, session_id); - - if (dev == NULL) { - dev = usbi_alloc_device(ctx, session_id); - if (dev == NULL) - return (LIBUSB_ERROR_NO_MEM); - - dev->bus_number = di.udi_bus; - dev->device_address = di.udi_addr; - dev->speed = di.udi_speed; - - dpriv = (struct device_priv *)dev->os_priv; - strlcpy(dpriv->devnode, devnode, sizeof(devnode)); - dpriv->fd = -1; - - if (ioctl(fd, USB_GET_DEVICE_DESC, &dpriv->ddesc) < 0) { - err = errno; - goto error; - } - - dpriv->cdesc = NULL; - if (_cache_active_config_descriptor(dev, fd)) { - err = errno; - goto error; - } - - if ((err = usbi_sanitize_device(dev))) - goto error; - } - close(fd); - - if (discovered_devs_append(*discdevs, dev) == NULL) - return (LIBUSB_ERROR_NO_MEM); - - libusb_unref_device(dev); - } - - return (LIBUSB_SUCCESS); - -error: - close(fd); - libusb_unref_device(dev); - return _errno_to_libusb(err); -} - -int -netbsd_open(struct libusb_device_handle *handle) -{ - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - - dpriv->fd = open(dpriv->devnode, O_RDWR); - if (dpriv->fd < 0) { - dpriv->fd = open(dpriv->devnode, O_RDONLY); - if (dpriv->fd < 0) - return _errno_to_libusb(errno); - } - - usbi_dbg("open %s: fd %d", dpriv->devnode, dpriv->fd); - - return (LIBUSB_SUCCESS); -} - -void -netbsd_close(struct libusb_device_handle *handle) -{ - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - - usbi_dbg("close: fd %d", dpriv->fd); - - close(dpriv->fd); - dpriv->fd = -1; -} - -int -netbsd_get_device_descriptor(struct libusb_device *dev, unsigned char *buf, - int *host_endian) -{ - struct device_priv *dpriv = (struct device_priv *)dev->os_priv; - - usbi_dbg(""); - - memcpy(buf, &dpriv->ddesc, DEVICE_DESC_LENGTH); - - *host_endian = 0; - - return (LIBUSB_SUCCESS); -} - -int -netbsd_get_active_config_descriptor(struct libusb_device *dev, - unsigned char *buf, size_t len, int *host_endian) -{ - struct device_priv *dpriv = (struct device_priv *)dev->os_priv; - usb_config_descriptor_t *ucd; - - ucd = (usb_config_descriptor_t *) dpriv->cdesc; - len = MIN(len, UGETW(ucd->wTotalLength)); - - usbi_dbg("len %d", len); - - memcpy(buf, dpriv->cdesc, len); - - *host_endian = 0; - - return len; -} - -int -netbsd_get_config_descriptor(struct libusb_device *dev, uint8_t idx, - unsigned char *buf, size_t len, int *host_endian) -{ - struct device_priv *dpriv = (struct device_priv *)dev->os_priv; - struct usb_full_desc ufd; - int fd, err; - - usbi_dbg("index %d, len %d", idx, len); - - /* A config descriptor may be requested before opening the device */ - if (dpriv->fd >= 0) { - fd = dpriv->fd; - } else { - fd = open(dpriv->devnode, O_RDONLY); - if (fd < 0) - return _errno_to_libusb(errno); - } - - ufd.ufd_config_index = idx; - ufd.ufd_size = len; - ufd.ufd_data = buf; - - if ((ioctl(fd, USB_GET_FULL_DESC, &ufd)) < 0) { - err = errno; - if (dpriv->fd < 0) - close(fd); - return _errno_to_libusb(err); - } - - if (dpriv->fd < 0) - close(fd); - - *host_endian = 0; - - return len; -} - -int -netbsd_get_configuration(struct libusb_device_handle *handle, int *config) -{ - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - - usbi_dbg(""); - - if (ioctl(dpriv->fd, USB_GET_CONFIG, config) < 0) - return _errno_to_libusb(errno); - - usbi_dbg("configuration %d", *config); - - return (LIBUSB_SUCCESS); -} - -int -netbsd_set_configuration(struct libusb_device_handle *handle, int config) -{ - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - - usbi_dbg("configuration %d", config); - - if (ioctl(dpriv->fd, USB_SET_CONFIG, &config) < 0) - return _errno_to_libusb(errno); - - return _cache_active_config_descriptor(handle->dev, dpriv->fd); -} - -int -netbsd_claim_interface(struct libusb_device_handle *handle, int iface) -{ - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; - int i; - - for (i = 0; i < USB_MAX_ENDPOINTS; i++) - hpriv->endpoints[i] = -1; - - return (LIBUSB_SUCCESS); -} - -int -netbsd_release_interface(struct libusb_device_handle *handle, int iface) -{ - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; - int i; - - for (i = 0; i < USB_MAX_ENDPOINTS; i++) - if (hpriv->endpoints[i] >= 0) - close(hpriv->endpoints[i]); - - return (LIBUSB_SUCCESS); -} - -int -netbsd_set_interface_altsetting(struct libusb_device_handle *handle, int iface, - int altsetting) -{ - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - struct usb_alt_interface intf; - - usbi_dbg("iface %d, setting %d", iface, altsetting); - - memset(&intf, 0, sizeof(intf)); - - intf.uai_interface_index = iface; - intf.uai_alt_no = altsetting; - - if (ioctl(dpriv->fd, USB_SET_ALTINTERFACE, &intf) < 0) - return _errno_to_libusb(errno); - - return (LIBUSB_SUCCESS); -} - -int -netbsd_clear_halt(struct libusb_device_handle *handle, unsigned char endpoint) -{ - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - struct usb_ctl_request req; - - usbi_dbg(""); - - req.ucr_request.bmRequestType = UT_WRITE_ENDPOINT; - req.ucr_request.bRequest = UR_CLEAR_FEATURE; - USETW(req.ucr_request.wValue, UF_ENDPOINT_HALT); - USETW(req.ucr_request.wIndex, endpoint); - USETW(req.ucr_request.wLength, 0); - - if (ioctl(dpriv->fd, USB_DO_REQUEST, &req) < 0) - return _errno_to_libusb(errno); - - return (LIBUSB_SUCCESS); -} - -int -netbsd_reset_device(struct libusb_device_handle *handle) -{ - usbi_dbg(""); - - return (LIBUSB_ERROR_NOT_SUPPORTED); -} - -void -netbsd_destroy_device(struct libusb_device *dev) -{ - struct device_priv *dpriv = (struct device_priv *)dev->os_priv; - - usbi_dbg(""); - - free(dpriv->cdesc); -} - -int -netbsd_submit_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer; - struct handle_priv *hpriv; - int err = 0; - - usbi_dbg(""); - - transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - hpriv = (struct handle_priv *)transfer->dev_handle->os_priv; - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - err = _sync_control_transfer(itransfer); - break; - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - if (IS_XFEROUT(transfer)) { - /* Isochronous write is not supported */ - err = LIBUSB_ERROR_NOT_SUPPORTED; - break; - } - err = _sync_gen_transfer(itransfer); - break; - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - if (IS_XFEROUT(transfer) && - transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) { - err = LIBUSB_ERROR_NOT_SUPPORTED; - break; - } - err = _sync_gen_transfer(itransfer); - break; - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - err = LIBUSB_ERROR_NOT_SUPPORTED; - break; - } - - if (err) - return (err); - - usbi_signal_transfer_completion(itransfer); - - return (LIBUSB_SUCCESS); -} - -int -netbsd_cancel_transfer(struct usbi_transfer *itransfer) -{ - usbi_dbg(""); - - return (LIBUSB_ERROR_NOT_SUPPORTED); -} - -void -netbsd_clear_transfer_priv(struct usbi_transfer *itransfer) -{ - usbi_dbg(""); - - /* Nothing to do */ -} - -int -netbsd_handle_transfer_completion(struct usbi_transfer *itransfer) -{ - return usbi_handle_transfer_completion(itransfer, LIBUSB_TRANSFER_COMPLETED); -} - -int -netbsd_clock_gettime(int clkid, struct timespec *tp) -{ - usbi_dbg("clock %d", clkid); - - if (clkid == USBI_CLOCK_REALTIME) - return clock_gettime(CLOCK_REALTIME, tp); - - if (clkid == USBI_CLOCK_MONOTONIC) - return clock_gettime(CLOCK_MONOTONIC, tp); - - return (LIBUSB_ERROR_INVALID_PARAM); -} - -int -_errno_to_libusb(int err) -{ - switch (err) { - case EIO: - return (LIBUSB_ERROR_IO); - case EACCES: - return (LIBUSB_ERROR_ACCESS); - case ENOENT: - return (LIBUSB_ERROR_NO_DEVICE); - case ENOMEM: - return (LIBUSB_ERROR_NO_MEM); - } - - usbi_dbg("error: %s", strerror(err)); - - return (LIBUSB_ERROR_OTHER); -} - -int -_cache_active_config_descriptor(struct libusb_device *dev, int fd) -{ - struct device_priv *dpriv = (struct device_priv *)dev->os_priv; - struct usb_config_desc ucd; - struct usb_full_desc ufd; - unsigned char* buf; - int len; - - usbi_dbg("fd %d", fd); - - ucd.ucd_config_index = USB_CURRENT_CONFIG_INDEX; - - if ((ioctl(fd, USB_GET_CONFIG_DESC, &ucd)) < 0) - return _errno_to_libusb(errno); - - usbi_dbg("active bLength %d", ucd.ucd_desc.bLength); - - len = UGETW(ucd.ucd_desc.wTotalLength); - buf = malloc(len); - if (buf == NULL) - return (LIBUSB_ERROR_NO_MEM); - - ufd.ufd_config_index = ucd.ucd_config_index; - ufd.ufd_size = len; - ufd.ufd_data = buf; - - usbi_dbg("index %d, len %d", ufd.ufd_config_index, len); - - if ((ioctl(fd, USB_GET_FULL_DESC, &ufd)) < 0) { - free(buf); - return _errno_to_libusb(errno); - } - - if (dpriv->cdesc) - free(dpriv->cdesc); - dpriv->cdesc = buf; - - return (0); -} - -int -_sync_control_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer; - struct libusb_control_setup *setup; - struct device_priv *dpriv; - struct usb_ctl_request req; - - transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - dpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv; - setup = (struct libusb_control_setup *)transfer->buffer; - - usbi_dbg("type %d request %d value %d index %d length %d timeout %d", - setup->bmRequestType, setup->bRequest, - libusb_le16_to_cpu(setup->wValue), - libusb_le16_to_cpu(setup->wIndex), - libusb_le16_to_cpu(setup->wLength), transfer->timeout); - - req.ucr_request.bmRequestType = setup->bmRequestType; - req.ucr_request.bRequest = setup->bRequest; - /* Don't use USETW, libusb already deals with the endianness */ - (*(uint16_t *)req.ucr_request.wValue) = setup->wValue; - (*(uint16_t *)req.ucr_request.wIndex) = setup->wIndex; - (*(uint16_t *)req.ucr_request.wLength) = setup->wLength; - req.ucr_data = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; - - if ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0) - req.ucr_flags = USBD_SHORT_XFER_OK; - - if ((ioctl(dpriv->fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0) - return _errno_to_libusb(errno); - - if ((ioctl(dpriv->fd, USB_DO_REQUEST, &req)) < 0) - return _errno_to_libusb(errno); - - itransfer->transferred = req.ucr_actlen; - - usbi_dbg("transferred %d", itransfer->transferred); - - return (0); -} - -int -_access_endpoint(struct libusb_transfer *transfer) -{ - struct handle_priv *hpriv; - struct device_priv *dpriv; - char *s, devnode[16]; - int fd, endpt; - mode_t mode; - - hpriv = (struct handle_priv *)transfer->dev_handle->os_priv; - dpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv; - - endpt = UE_GET_ADDR(transfer->endpoint); - mode = IS_XFERIN(transfer) ? O_RDONLY : O_WRONLY; - - usbi_dbg("endpoint %d mode %d", endpt, mode); - - if (hpriv->endpoints[endpt] < 0) { - /* Pick the right node given the control one */ - strlcpy(devnode, dpriv->devnode, sizeof(devnode)); - s = strchr(devnode, '.'); - snprintf(s, 4, ".%02d", endpt); - - /* We may need to read/write to the same endpoint later. */ - if (((fd = open(devnode, O_RDWR)) < 0) && (errno == ENXIO)) - if ((fd = open(devnode, mode)) < 0) - return (-1); - - hpriv->endpoints[endpt] = fd; - } - - return (hpriv->endpoints[endpt]); -} - -int -_sync_gen_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer; - int fd, nr = 1; - - transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - /* - * Bulk, Interrupt or Isochronous transfer depends on the - * endpoint and thus the node to open. - */ - if ((fd = _access_endpoint(transfer)) < 0) - return _errno_to_libusb(errno); - - if ((ioctl(fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0) - return _errno_to_libusb(errno); - - if (IS_XFERIN(transfer)) { - if ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0) - if ((ioctl(fd, USB_SET_SHORT_XFER, &nr)) < 0) - return _errno_to_libusb(errno); - - nr = read(fd, transfer->buffer, transfer->length); - } else { - nr = write(fd, transfer->buffer, transfer->length); - } - - if (nr < 0) - return _errno_to_libusb(errno); - - itransfer->transferred = nr; - - return (0); -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/openbsd_usb.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/openbsd_usb.c deleted file mode 100644 index c660257114b5..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/openbsd_usb.c +++ /dev/null @@ -1,771 +0,0 @@ -/* - * Copyright © 2011-2013 Martin Pieuchot - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include "libusbi.h" - -struct device_priv { - char *devname; /* name of the ugen(4) node */ - int fd; /* device file descriptor */ - - unsigned char *cdesc; /* active config descriptor */ - usb_device_descriptor_t ddesc; /* usb device descriptor */ -}; - -struct handle_priv { - int endpoints[USB_MAX_ENDPOINTS]; -}; - -/* - * Backend functions - */ -static int obsd_get_device_list(struct libusb_context *, - struct discovered_devs **); -static int obsd_open(struct libusb_device_handle *); -static void obsd_close(struct libusb_device_handle *); - -static int obsd_get_device_descriptor(struct libusb_device *, unsigned char *, - int *); -static int obsd_get_active_config_descriptor(struct libusb_device *, - unsigned char *, size_t, int *); -static int obsd_get_config_descriptor(struct libusb_device *, uint8_t, - unsigned char *, size_t, int *); - -static int obsd_get_configuration(struct libusb_device_handle *, int *); -static int obsd_set_configuration(struct libusb_device_handle *, int); - -static int obsd_claim_interface(struct libusb_device_handle *, int); -static int obsd_release_interface(struct libusb_device_handle *, int); - -static int obsd_set_interface_altsetting(struct libusb_device_handle *, int, - int); -static int obsd_clear_halt(struct libusb_device_handle *, unsigned char); -static int obsd_reset_device(struct libusb_device_handle *); -static void obsd_destroy_device(struct libusb_device *); - -static int obsd_submit_transfer(struct usbi_transfer *); -static int obsd_cancel_transfer(struct usbi_transfer *); -static void obsd_clear_transfer_priv(struct usbi_transfer *); -static int obsd_handle_transfer_completion(struct usbi_transfer *); -static int obsd_clock_gettime(int, struct timespec *); - -/* - * Private functions - */ -static int _errno_to_libusb(int); -static int _cache_active_config_descriptor(struct libusb_device *); -static int _sync_control_transfer(struct usbi_transfer *); -static int _sync_gen_transfer(struct usbi_transfer *); -static int _access_endpoint(struct libusb_transfer *); - -static int _bus_open(int); - - -const struct usbi_os_backend openbsd_backend = { - "Synchronous OpenBSD backend", - 0, - NULL, /* init() */ - NULL, /* exit() */ - obsd_get_device_list, - NULL, /* hotplug_poll */ - obsd_open, - obsd_close, - - obsd_get_device_descriptor, - obsd_get_active_config_descriptor, - obsd_get_config_descriptor, - NULL, /* get_config_descriptor_by_value() */ - - obsd_get_configuration, - obsd_set_configuration, - - obsd_claim_interface, - obsd_release_interface, - - obsd_set_interface_altsetting, - obsd_clear_halt, - obsd_reset_device, - - NULL, /* alloc_streams */ - NULL, /* free_streams */ - - NULL, /* dev_mem_alloc() */ - NULL, /* dev_mem_free() */ - - NULL, /* kernel_driver_active() */ - NULL, /* detach_kernel_driver() */ - NULL, /* attach_kernel_driver() */ - - obsd_destroy_device, - - obsd_submit_transfer, - obsd_cancel_transfer, - obsd_clear_transfer_priv, - - NULL, /* handle_events() */ - obsd_handle_transfer_completion, - - obsd_clock_gettime, - sizeof(struct device_priv), - sizeof(struct handle_priv), - 0, /* transfer_priv_size */ -}; - -#define DEVPATH "/dev/" -#define USBDEV DEVPATH "usb" - -int -obsd_get_device_list(struct libusb_context * ctx, - struct discovered_devs **discdevs) -{ - struct discovered_devs *ddd; - struct libusb_device *dev; - struct device_priv *dpriv; - struct usb_device_info di; - struct usb_device_ddesc dd; - unsigned long session_id; - char devices[USB_MAX_DEVICES]; - char busnode[16]; - char *udevname; - int fd, addr, i, j; - - usbi_dbg(""); - - for (i = 0; i < 8; i++) { - snprintf(busnode, sizeof(busnode), USBDEV "%d", i); - - if ((fd = open(busnode, O_RDWR)) < 0) { - if (errno != ENOENT && errno != ENXIO) - usbi_err(ctx, "could not open %s", busnode); - continue; - } - - bzero(devices, sizeof(devices)); - for (addr = 1; addr < USB_MAX_DEVICES; addr++) { - if (devices[addr]) - continue; - - di.udi_addr = addr; - if (ioctl(fd, USB_DEVICEINFO, &di) < 0) - continue; - - /* - * XXX If ugen(4) is attached to the USB device - * it will be used. - */ - udevname = NULL; - for (j = 0; j < USB_MAX_DEVNAMES; j++) - if (!strncmp("ugen", di.udi_devnames[j], 4)) { - udevname = strdup(di.udi_devnames[j]); - break; - } - - session_id = (di.udi_bus << 8 | di.udi_addr); - dev = usbi_get_device_by_session_id(ctx, session_id); - - if (dev == NULL) { - dev = usbi_alloc_device(ctx, session_id); - if (dev == NULL) { - close(fd); - return (LIBUSB_ERROR_NO_MEM); - } - - dev->bus_number = di.udi_bus; - dev->device_address = di.udi_addr; - dev->speed = di.udi_speed; - - dpriv = (struct device_priv *)dev->os_priv; - dpriv->fd = -1; - dpriv->cdesc = NULL; - dpriv->devname = udevname; - - dd.udd_bus = di.udi_bus; - dd.udd_addr = di.udi_addr; - if (ioctl(fd, USB_DEVICE_GET_DDESC, &dd) < 0) { - libusb_unref_device(dev); - continue; - } - dpriv->ddesc = dd.udd_desc; - - if (_cache_active_config_descriptor(dev)) { - libusb_unref_device(dev); - continue; - } - - if (usbi_sanitize_device(dev)) { - libusb_unref_device(dev); - continue; - } - } - - ddd = discovered_devs_append(*discdevs, dev); - if (ddd == NULL) { - close(fd); - return (LIBUSB_ERROR_NO_MEM); - } - libusb_unref_device(dev); - - *discdevs = ddd; - devices[addr] = 1; - } - - close(fd); - } - - return (LIBUSB_SUCCESS); -} - -int -obsd_open(struct libusb_device_handle *handle) -{ - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - char devnode[16]; - - if (dpriv->devname) { - /* - * Only open ugen(4) attached devices read-write, all - * read-only operations are done through the bus node. - */ - snprintf(devnode, sizeof(devnode), DEVPATH "%s.00", - dpriv->devname); - dpriv->fd = open(devnode, O_RDWR); - if (dpriv->fd < 0) - return _errno_to_libusb(errno); - - usbi_dbg("open %s: fd %d", devnode, dpriv->fd); - } - - return (LIBUSB_SUCCESS); -} - -void -obsd_close(struct libusb_device_handle *handle) -{ - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - - if (dpriv->devname) { - usbi_dbg("close: fd %d", dpriv->fd); - - close(dpriv->fd); - dpriv->fd = -1; - } -} - -int -obsd_get_device_descriptor(struct libusb_device *dev, unsigned char *buf, - int *host_endian) -{ - struct device_priv *dpriv = (struct device_priv *)dev->os_priv; - - usbi_dbg(""); - - memcpy(buf, &dpriv->ddesc, DEVICE_DESC_LENGTH); - - *host_endian = 0; - - return (LIBUSB_SUCCESS); -} - -int -obsd_get_active_config_descriptor(struct libusb_device *dev, - unsigned char *buf, size_t len, int *host_endian) -{ - struct device_priv *dpriv = (struct device_priv *)dev->os_priv; - usb_config_descriptor_t *ucd = (usb_config_descriptor_t *)dpriv->cdesc; - - len = MIN(len, UGETW(ucd->wTotalLength)); - - usbi_dbg("len %d", len); - - memcpy(buf, dpriv->cdesc, len); - - *host_endian = 0; - - return (len); -} - -int -obsd_get_config_descriptor(struct libusb_device *dev, uint8_t idx, - unsigned char *buf, size_t len, int *host_endian) -{ - struct usb_device_fdesc udf; - int fd, err; - - if ((fd = _bus_open(dev->bus_number)) < 0) - return _errno_to_libusb(errno); - - udf.udf_bus = dev->bus_number; - udf.udf_addr = dev->device_address; - udf.udf_config_index = idx; - udf.udf_size = len; - udf.udf_data = buf; - - usbi_dbg("index %d, len %d", udf.udf_config_index, len); - - if (ioctl(fd, USB_DEVICE_GET_FDESC, &udf) < 0) { - err = errno; - close(fd); - return _errno_to_libusb(err); - } - close(fd); - - *host_endian = 0; - - return (len); -} - -int -obsd_get_configuration(struct libusb_device_handle *handle, int *config) -{ - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - usb_config_descriptor_t *ucd = (usb_config_descriptor_t *)dpriv->cdesc; - - *config = ucd->bConfigurationValue; - - usbi_dbg("bConfigurationValue %d", *config); - - return (LIBUSB_SUCCESS); -} - -int -obsd_set_configuration(struct libusb_device_handle *handle, int config) -{ - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - - if (dpriv->devname == NULL) - return (LIBUSB_ERROR_NOT_SUPPORTED); - - usbi_dbg("bConfigurationValue %d", config); - - if (ioctl(dpriv->fd, USB_SET_CONFIG, &config) < 0) - return _errno_to_libusb(errno); - - return _cache_active_config_descriptor(handle->dev); -} - -int -obsd_claim_interface(struct libusb_device_handle *handle, int iface) -{ - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; - int i; - - for (i = 0; i < USB_MAX_ENDPOINTS; i++) - hpriv->endpoints[i] = -1; - - return (LIBUSB_SUCCESS); -} - -int -obsd_release_interface(struct libusb_device_handle *handle, int iface) -{ - struct handle_priv *hpriv = (struct handle_priv *)handle->os_priv; - int i; - - for (i = 0; i < USB_MAX_ENDPOINTS; i++) - if (hpriv->endpoints[i] >= 0) - close(hpriv->endpoints[i]); - - return (LIBUSB_SUCCESS); -} - -int -obsd_set_interface_altsetting(struct libusb_device_handle *handle, int iface, - int altsetting) -{ - struct device_priv *dpriv = (struct device_priv *)handle->dev->os_priv; - struct usb_alt_interface intf; - - if (dpriv->devname == NULL) - return (LIBUSB_ERROR_NOT_SUPPORTED); - - usbi_dbg("iface %d, setting %d", iface, altsetting); - - memset(&intf, 0, sizeof(intf)); - - intf.uai_interface_index = iface; - intf.uai_alt_no = altsetting; - - if (ioctl(dpriv->fd, USB_SET_ALTINTERFACE, &intf) < 0) - return _errno_to_libusb(errno); - - return (LIBUSB_SUCCESS); -} - -int -obsd_clear_halt(struct libusb_device_handle *handle, unsigned char endpoint) -{ - struct usb_ctl_request req; - int fd, err; - - if ((fd = _bus_open(handle->dev->bus_number)) < 0) - return _errno_to_libusb(errno); - - usbi_dbg(""); - - req.ucr_addr = handle->dev->device_address; - req.ucr_request.bmRequestType = UT_WRITE_ENDPOINT; - req.ucr_request.bRequest = UR_CLEAR_FEATURE; - USETW(req.ucr_request.wValue, UF_ENDPOINT_HALT); - USETW(req.ucr_request.wIndex, endpoint); - USETW(req.ucr_request.wLength, 0); - - if (ioctl(fd, USB_REQUEST, &req) < 0) { - err = errno; - close(fd); - return _errno_to_libusb(err); - } - close(fd); - - return (LIBUSB_SUCCESS); -} - -int -obsd_reset_device(struct libusb_device_handle *handle) -{ - usbi_dbg(""); - - return (LIBUSB_ERROR_NOT_SUPPORTED); -} - -void -obsd_destroy_device(struct libusb_device *dev) -{ - struct device_priv *dpriv = (struct device_priv *)dev->os_priv; - - usbi_dbg(""); - - free(dpriv->cdesc); - free(dpriv->devname); -} - -int -obsd_submit_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer; - struct handle_priv *hpriv; - int err = 0; - - usbi_dbg(""); - - transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - hpriv = (struct handle_priv *)transfer->dev_handle->os_priv; - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - err = _sync_control_transfer(itransfer); - break; - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - if (IS_XFEROUT(transfer)) { - /* Isochronous write is not supported */ - err = LIBUSB_ERROR_NOT_SUPPORTED; - break; - } - err = _sync_gen_transfer(itransfer); - break; - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - if (IS_XFEROUT(transfer) && - transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) { - err = LIBUSB_ERROR_NOT_SUPPORTED; - break; - } - err = _sync_gen_transfer(itransfer); - break; - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - err = LIBUSB_ERROR_NOT_SUPPORTED; - break; - } - - if (err) - return (err); - - usbi_signal_transfer_completion(itransfer); - - return (LIBUSB_SUCCESS); -} - -int -obsd_cancel_transfer(struct usbi_transfer *itransfer) -{ - usbi_dbg(""); - - return (LIBUSB_ERROR_NOT_SUPPORTED); -} - -void -obsd_clear_transfer_priv(struct usbi_transfer *itransfer) -{ - usbi_dbg(""); - - /* Nothing to do */ -} - -int -obsd_handle_transfer_completion(struct usbi_transfer *itransfer) -{ - return usbi_handle_transfer_completion(itransfer, LIBUSB_TRANSFER_COMPLETED); -} - -int -obsd_clock_gettime(int clkid, struct timespec *tp) -{ - usbi_dbg("clock %d", clkid); - - if (clkid == USBI_CLOCK_REALTIME) - return clock_gettime(CLOCK_REALTIME, tp); - - if (clkid == USBI_CLOCK_MONOTONIC) - return clock_gettime(CLOCK_MONOTONIC, tp); - - return (LIBUSB_ERROR_INVALID_PARAM); -} - -int -_errno_to_libusb(int err) -{ - usbi_dbg("error: %s (%d)", strerror(err), err); - - switch (err) { - case EIO: - return (LIBUSB_ERROR_IO); - case EACCES: - return (LIBUSB_ERROR_ACCESS); - case ENOENT: - return (LIBUSB_ERROR_NO_DEVICE); - case ENOMEM: - return (LIBUSB_ERROR_NO_MEM); - case ETIMEDOUT: - return (LIBUSB_ERROR_TIMEOUT); - } - - return (LIBUSB_ERROR_OTHER); -} - -int -_cache_active_config_descriptor(struct libusb_device *dev) -{ - struct device_priv *dpriv = (struct device_priv *)dev->os_priv; - struct usb_device_cdesc udc; - struct usb_device_fdesc udf; - unsigned char* buf; - int fd, len, err; - - if ((fd = _bus_open(dev->bus_number)) < 0) - return _errno_to_libusb(errno); - - usbi_dbg("fd %d, addr %d", fd, dev->device_address); - - udc.udc_bus = dev->bus_number; - udc.udc_addr = dev->device_address; - udc.udc_config_index = USB_CURRENT_CONFIG_INDEX; - if (ioctl(fd, USB_DEVICE_GET_CDESC, &udc) < 0) { - err = errno; - close(fd); - return _errno_to_libusb(errno); - } - - usbi_dbg("active bLength %d", udc.udc_desc.bLength); - - len = UGETW(udc.udc_desc.wTotalLength); - buf = malloc(len); - if (buf == NULL) - return (LIBUSB_ERROR_NO_MEM); - - udf.udf_bus = dev->bus_number; - udf.udf_addr = dev->device_address; - udf.udf_config_index = udc.udc_config_index; - udf.udf_size = len; - udf.udf_data = buf; - - usbi_dbg("index %d, len %d", udf.udf_config_index, len); - - if (ioctl(fd, USB_DEVICE_GET_FDESC, &udf) < 0) { - err = errno; - close(fd); - free(buf); - return _errno_to_libusb(err); - } - close(fd); - - if (dpriv->cdesc) - free(dpriv->cdesc); - dpriv->cdesc = buf; - - return (LIBUSB_SUCCESS); -} - -int -_sync_control_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer; - struct libusb_control_setup *setup; - struct device_priv *dpriv; - struct usb_ctl_request req; - - transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - dpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv; - setup = (struct libusb_control_setup *)transfer->buffer; - - usbi_dbg("type %x request %x value %x index %d length %d timeout %d", - setup->bmRequestType, setup->bRequest, - libusb_le16_to_cpu(setup->wValue), - libusb_le16_to_cpu(setup->wIndex), - libusb_le16_to_cpu(setup->wLength), transfer->timeout); - - req.ucr_addr = transfer->dev_handle->dev->device_address; - req.ucr_request.bmRequestType = setup->bmRequestType; - req.ucr_request.bRequest = setup->bRequest; - /* Don't use USETW, libusb already deals with the endianness */ - (*(uint16_t *)req.ucr_request.wValue) = setup->wValue; - (*(uint16_t *)req.ucr_request.wIndex) = setup->wIndex; - (*(uint16_t *)req.ucr_request.wLength) = setup->wLength; - req.ucr_data = transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE; - - if ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0) - req.ucr_flags = USBD_SHORT_XFER_OK; - - if (dpriv->devname == NULL) { - /* - * XXX If the device is not attached to ugen(4) it is - * XXX still possible to submit a control transfer but - * XXX with the default timeout only. - */ - int fd, err; - - if ((fd = _bus_open(transfer->dev_handle->dev->bus_number)) < 0) - return _errno_to_libusb(errno); - - if ((ioctl(fd, USB_REQUEST, &req)) < 0) { - err = errno; - close(fd); - return _errno_to_libusb(err); - } - close(fd); - } else { - if ((ioctl(dpriv->fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0) - return _errno_to_libusb(errno); - - if ((ioctl(dpriv->fd, USB_DO_REQUEST, &req)) < 0) - return _errno_to_libusb(errno); - } - - itransfer->transferred = req.ucr_actlen; - - usbi_dbg("transferred %d", itransfer->transferred); - - return (0); -} - -int -_access_endpoint(struct libusb_transfer *transfer) -{ - struct handle_priv *hpriv; - struct device_priv *dpriv; - char devnode[16]; - int fd, endpt; - mode_t mode; - - hpriv = (struct handle_priv *)transfer->dev_handle->os_priv; - dpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv; - - endpt = UE_GET_ADDR(transfer->endpoint); - mode = IS_XFERIN(transfer) ? O_RDONLY : O_WRONLY; - - usbi_dbg("endpoint %d mode %d", endpt, mode); - - if (hpriv->endpoints[endpt] < 0) { - /* Pick the right endpoint node */ - snprintf(devnode, sizeof(devnode), DEVPATH "%s.%02d", - dpriv->devname, endpt); - - /* We may need to read/write to the same endpoint later. */ - if (((fd = open(devnode, O_RDWR)) < 0) && (errno == ENXIO)) - if ((fd = open(devnode, mode)) < 0) - return (-1); - - hpriv->endpoints[endpt] = fd; - } - - return (hpriv->endpoints[endpt]); -} - -int -_sync_gen_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer; - struct device_priv *dpriv; - int fd, nr = 1; - - transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - dpriv = (struct device_priv *)transfer->dev_handle->dev->os_priv; - - if (dpriv->devname == NULL) - return (LIBUSB_ERROR_NOT_SUPPORTED); - - /* - * Bulk, Interrupt or Isochronous transfer depends on the - * endpoint and thus the node to open. - */ - if ((fd = _access_endpoint(transfer)) < 0) - return _errno_to_libusb(errno); - - if ((ioctl(fd, USB_SET_TIMEOUT, &transfer->timeout)) < 0) - return _errno_to_libusb(errno); - - if (IS_XFERIN(transfer)) { - if ((transfer->flags & LIBUSB_TRANSFER_SHORT_NOT_OK) == 0) - if ((ioctl(fd, USB_SET_SHORT_XFER, &nr)) < 0) - return _errno_to_libusb(errno); - - nr = read(fd, transfer->buffer, transfer->length); - } else { - nr = write(fd, transfer->buffer, transfer->length); - } - - if (nr < 0) - return _errno_to_libusb(errno); - - itransfer->transferred = nr; - - return (0); -} - -int -_bus_open(int number) -{ - char busnode[16]; - - snprintf(busnode, sizeof(busnode), USBDEV "%d", number); - - return open(busnode, O_RDWR); -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_posix.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_posix.c deleted file mode 100644 index e2f55a57a140..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_posix.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * poll_posix: poll compatibility wrapper for POSIX systems - * Copyright © 2013 RealVNC Ltd. - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include - -#include -#include -#include -#include - -#include "libusbi.h" - -int usbi_pipe(int pipefd[2]) -{ - int ret = pipe(pipefd); - if (ret != 0) { - return ret; - } - ret = fcntl(pipefd[1], F_GETFL); - if (ret == -1) { - usbi_dbg("Failed to get pipe fd flags: %d", errno); - goto err_close_pipe; - } - ret = fcntl(pipefd[1], F_SETFL, ret | O_NONBLOCK); - if (ret != 0) { - usbi_dbg("Failed to set non-blocking on new pipe: %d", errno); - goto err_close_pipe; - } - - return 0; - -err_close_pipe: - usbi_close(pipefd[0]); - usbi_close(pipefd[1]); - return ret; -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_posix.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_posix.h deleted file mode 100644 index 5b4b2c905e7a..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_posix.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef LIBUSB_POLL_POSIX_H -#define LIBUSB_POLL_POSIX_H - -#define usbi_write write -#define usbi_read read -#define usbi_close close -#define usbi_poll poll - -int usbi_pipe(int pipefd[2]); - -#endif /* LIBUSB_POLL_POSIX_H */ diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_windows.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_windows.c deleted file mode 100644 index 982560751217..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_windows.c +++ /dev/null @@ -1,728 +0,0 @@ -/* - * poll_windows: poll compatibility wrapper for Windows - * Copyright © 2012-2013 RealVNC Ltd. - * Copyright © 2009-2010 Pete Batard - * With contributions from Michael Plante, Orin Eman et al. - * Parts of poll implementation from libusb-win32, by Stephan Meyer et al. - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -/* - * poll() and pipe() Windows compatibility layer for libusb 1.0 - * - * The way this layer works is by using OVERLAPPED with async I/O transfers, as - * OVERLAPPED have an associated event which is flagged for I/O completion. - * - * For USB pollable async I/O, you would typically: - * - obtain a Windows HANDLE to a file or device that has been opened in - * OVERLAPPED mode - * - call usbi_create_fd with this handle to obtain a custom fd. - * Note that if you need simultaneous R/W access, you need to call create_fd - * twice, once in RW_READ and once in RW_WRITE mode to obtain 2 separate - * pollable fds - * - leave the core functions call the poll routine and flag POLLIN/POLLOUT - * - * The pipe pollable synchronous I/O works using the overlapped event associated - * with a fake pipe. The read/write functions are only meant to be used in that - * context. - */ -#include - -#include -#include -#include - -#include "libusbi.h" - -// Uncomment to debug the polling layer -//#define DEBUG_POLL_WINDOWS -#if defined(DEBUG_POLL_WINDOWS) -#define poll_dbg usbi_dbg -#else -// MSVC++ < 2005 cannot use a variadic argument and non MSVC -// compilers produce warnings if parenthesis are omitted. -#if defined(_MSC_VER) && (_MSC_VER < 1400) -#define poll_dbg -#else -#define poll_dbg(...) -#endif -#endif - -#if defined(_PREFAST_) -#pragma warning(disable:28719) -#endif - -#define CHECK_INIT_POLLING do {if(!is_polling_set) init_polling();} while(0) - -// public fd data -const struct winfd INVALID_WINFD = {-1, INVALID_HANDLE_VALUE, NULL, NULL, NULL, RW_NONE}; -struct winfd poll_fd[MAX_FDS]; -// internal fd data -struct { - CRITICAL_SECTION mutex; // lock for fds - // Additional variables for XP CancelIoEx partial emulation - HANDLE original_handle; - DWORD thread_id; -} _poll_fd[MAX_FDS]; - -// globals -BOOLEAN is_polling_set = FALSE; -LONG pipe_number = 0; -static volatile LONG compat_spinlock = 0; - -#if !defined(_WIN32_WCE) -// CancelIoEx, available on Vista and later only, provides the ability to cancel -// a single transfer (OVERLAPPED) when used. As it may not be part of any of the -// platform headers, we hook into the Kernel32 system DLL directly to seek it. -static BOOL (__stdcall *pCancelIoEx)(HANDLE, LPOVERLAPPED) = NULL; -#define Use_Duplicate_Handles (pCancelIoEx == NULL) - -static inline void setup_cancel_io(void) -{ - HMODULE hKernel32 = GetModuleHandleA("KERNEL32"); - if (hKernel32 != NULL) { - pCancelIoEx = (BOOL (__stdcall *)(HANDLE,LPOVERLAPPED)) - GetProcAddress(hKernel32, "CancelIoEx"); - } - usbi_dbg("Will use CancelIo%s for I/O cancellation", - Use_Duplicate_Handles?"":"Ex"); -} - -static inline BOOL cancel_io(int _index) -{ - if ((_index < 0) || (_index >= MAX_FDS)) { - return FALSE; - } - - if ( (poll_fd[_index].fd < 0) || (poll_fd[_index].handle == INVALID_HANDLE_VALUE) - || (poll_fd[_index].handle == 0) || (poll_fd[_index].overlapped == NULL) ) { - return TRUE; - } - if (poll_fd[_index].itransfer && poll_fd[_index].cancel_fn) { - // Cancel outstanding transfer via the specific callback - (*poll_fd[_index].cancel_fn)(poll_fd[_index].itransfer); - return TRUE; - } - if (pCancelIoEx != NULL) { - return (*pCancelIoEx)(poll_fd[_index].handle, poll_fd[_index].overlapped); - } - if (_poll_fd[_index].thread_id == GetCurrentThreadId()) { - return CancelIo(poll_fd[_index].handle); - } - usbi_warn(NULL, "Unable to cancel I/O that was started from another thread"); - return FALSE; -} -#else -#define Use_Duplicate_Handles FALSE - -static __inline void setup_cancel_io() -{ - // No setup needed on WinCE -} - -static __inline BOOL cancel_io(int _index) -{ - if ((_index < 0) || (_index >= MAX_FDS)) { - return FALSE; - } - if ( (poll_fd[_index].fd < 0) || (poll_fd[_index].handle == INVALID_HANDLE_VALUE) - || (poll_fd[_index].handle == 0) || (poll_fd[_index].overlapped == NULL) ) { - return TRUE; - } - if (poll_fd[_index].itransfer && poll_fd[_index].cancel_fn) { - // Cancel outstanding transfer via the specific callback - (*poll_fd[_index].cancel_fn)(poll_fd[_index].itransfer); - } - return TRUE; -} -#endif - -// Init -void init_polling(void) -{ - int i; - - while (InterlockedExchange((LONG *)&compat_spinlock, 1) == 1) { - SleepEx(0, TRUE); - } - if (!is_polling_set) { - setup_cancel_io(); - for (i=0; ihEvent = CreateEvent(NULL, TRUE, FALSE, NULL); - if(overlapped->hEvent == NULL) { - free (overlapped); - return NULL; - } - return overlapped; -} - -static void free_overlapped(OVERLAPPED *overlapped) -{ - if (overlapped == NULL) - return; - - if ( (overlapped->hEvent != 0) - && (overlapped->hEvent != INVALID_HANDLE_VALUE) ) { - CloseHandle(overlapped->hEvent); - } - free(overlapped); -} - -void exit_polling(void) -{ - int i; - - while (InterlockedExchange((LONG *)&compat_spinlock, 1) == 1) { - SleepEx(0, TRUE); - } - if (is_polling_set) { - is_polling_set = FALSE; - - for (i=0; iInternal = STATUS_PENDING; - overlapped->InternalHigh = 0; - - for (i=0; i= 0) { - LeaveCriticalSection(&_poll_fd[i].mutex); - continue; - } - - // Use index as the unique fd number - poll_fd[i].fd = i; - // Read end of the "pipe" - filedes[0] = poll_fd[i].fd; - // We can use the same handle for both ends - filedes[1] = filedes[0]; - - poll_fd[i].handle = DUMMY_HANDLE; - poll_fd[i].overlapped = overlapped; - // There's no polling on the write end, so we just use READ for our needs - poll_fd[i].rw = RW_READ; - _poll_fd[i].original_handle = INVALID_HANDLE_VALUE; - LeaveCriticalSection(&_poll_fd[i].mutex); - return 0; - } - } - free_overlapped(overlapped); - return -1; -} - -/* - * Create both an fd and an OVERLAPPED from an open Windows handle, so that - * it can be used with our polling function - * The handle MUST support overlapped transfers (usually requires CreateFile - * with FILE_FLAG_OVERLAPPED) - * Return a pollable file descriptor struct, or INVALID_WINFD on error - * - * Note that the fd returned by this function is a per-transfer fd, rather - * than a per-session fd and cannot be used for anything else but our - * custom functions (the fd itself points to the NUL: device) - * if you plan to do R/W on the same handle, you MUST create 2 fds: one for - * read and one for write. Using a single R/W fd is unsupported and will - * produce unexpected results - */ -struct winfd usbi_create_fd(HANDLE handle, int access_mode, struct usbi_transfer *itransfer, cancel_transfer *cancel_fn) -{ - int i; - struct winfd wfd = INVALID_WINFD; - OVERLAPPED* overlapped = NULL; - - CHECK_INIT_POLLING; - - if ((handle == 0) || (handle == INVALID_HANDLE_VALUE)) { - return INVALID_WINFD; - } - - wfd.itransfer = itransfer; - wfd.cancel_fn = cancel_fn; - - if ((access_mode != RW_READ) && (access_mode != RW_WRITE)) { - usbi_warn(NULL, "only one of RW_READ or RW_WRITE are supported. " - "If you want to poll for R/W simultaneously, create multiple fds from the same handle."); - return INVALID_WINFD; - } - if (access_mode == RW_READ) { - wfd.rw = RW_READ; - } else { - wfd.rw = RW_WRITE; - } - - overlapped = create_overlapped(); - if(overlapped == NULL) { - return INVALID_WINFD; - } - - for (i=0; i= 0) { - LeaveCriticalSection(&_poll_fd[i].mutex); - continue; - } - // Use index as the unique fd number - wfd.fd = i; - // Attempt to emulate some of the CancelIoEx behaviour on platforms - // that don't have it - if (Use_Duplicate_Handles) { - _poll_fd[i].thread_id = GetCurrentThreadId(); - if (!DuplicateHandle(GetCurrentProcess(), handle, GetCurrentProcess(), - &wfd.handle, 0, TRUE, DUPLICATE_SAME_ACCESS)) { - usbi_dbg("could not duplicate handle for CancelIo - using original one"); - wfd.handle = handle; - // Make sure we won't close the original handle on fd deletion then - _poll_fd[i].original_handle = INVALID_HANDLE_VALUE; - } else { - _poll_fd[i].original_handle = handle; - } - } else { - wfd.handle = handle; - } - wfd.overlapped = overlapped; - memcpy(&poll_fd[i], &wfd, sizeof(struct winfd)); - LeaveCriticalSection(&_poll_fd[i].mutex); - return wfd; - } - } - free_overlapped(overlapped); - return INVALID_WINFD; -} - -static void _free_index(int _index) -{ - // Cancel any async IO (Don't care about the validity of our handles for this) - cancel_io(_index); - // close the duplicate handle (if we have an actual duplicate) - if (Use_Duplicate_Handles) { - if (_poll_fd[_index].original_handle != INVALID_HANDLE_VALUE) { - CloseHandle(poll_fd[_index].handle); - } - _poll_fd[_index].original_handle = INVALID_HANDLE_VALUE; - _poll_fd[_index].thread_id = 0; - } - free_overlapped(poll_fd[_index].overlapped); - poll_fd[_index] = INVALID_WINFD; -} - -/* - * Release a pollable file descriptor. - * - * Note that the associated Windows handle is not closed by this call - */ -void usbi_free_fd(struct winfd *wfd) -{ - int _index; - - CHECK_INIT_POLLING; - - _index = _fd_to_index_and_lock(wfd->fd); - if (_index < 0) { - return; - } - _free_index(_index); - *wfd = INVALID_WINFD; - LeaveCriticalSection(&_poll_fd[_index].mutex); -} - -/* - * The functions below perform various conversions between fd, handle and OVERLAPPED - */ -struct winfd fd_to_winfd(int fd) -{ - int i; - struct winfd wfd; - - CHECK_INIT_POLLING; - - if (fd < 0) - return INVALID_WINFD; - - for (i=0; i= 0) { - LeaveCriticalSection(&_poll_fd[_index].mutex); - } - usbi_warn(NULL, "invalid fd"); - triggered = -1; - goto poll_exit; - } - - // IN or OUT must match our fd direction - if ((fds[i].events & POLLIN) && (poll_fd[_index].rw != RW_READ)) { - fds[i].revents |= POLLNVAL | POLLERR; - errno = EBADF; - usbi_warn(NULL, "attempted POLLIN on fd without READ access"); - LeaveCriticalSection(&_poll_fd[_index].mutex); - triggered = -1; - goto poll_exit; - } - - if ((fds[i].events & POLLOUT) && (poll_fd[_index].rw != RW_WRITE)) { - fds[i].revents |= POLLNVAL | POLLERR; - errno = EBADF; - usbi_warn(NULL, "attempted POLLOUT on fd without WRITE access"); - LeaveCriticalSection(&_poll_fd[_index].mutex); - triggered = -1; - goto poll_exit; - } - - // The following macro only works if overlapped I/O was reported pending - if ( (HasOverlappedIoCompleted(poll_fd[_index].overlapped)) - || (HasOverlappedIoCompletedSync(poll_fd[_index].overlapped)) ) { - poll_dbg(" completed"); - // checks above should ensure this works: - fds[i].revents = fds[i].events; - triggered++; - } else { - handles_to_wait_on[nb_handles_to_wait_on] = poll_fd[_index].overlapped->hEvent; - handle_to_index[nb_handles_to_wait_on] = i; - nb_handles_to_wait_on++; - } - LeaveCriticalSection(&_poll_fd[_index].mutex); - } - - // If nothing was triggered, wait on all fds that require it - if ((timeout != 0) && (triggered == 0) && (nb_handles_to_wait_on != 0)) { - if (timeout < 0) { - poll_dbg("starting infinite wait for %u handles...", (unsigned int)nb_handles_to_wait_on); - } else { - poll_dbg("starting %d ms wait for %u handles...", timeout, (unsigned int)nb_handles_to_wait_on); - } - ret = WaitForMultipleObjects(nb_handles_to_wait_on, handles_to_wait_on, - FALSE, (timeout<0)?INFINITE:(DWORD)timeout); - object_index = ret-WAIT_OBJECT_0; - if ((object_index >= 0) && ((DWORD)object_index < nb_handles_to_wait_on)) { - poll_dbg(" completed after wait"); - i = handle_to_index[object_index]; - _index = _fd_to_index_and_lock(fds[i].fd); - fds[i].revents = fds[i].events; - triggered++; - if (_index >= 0) { - LeaveCriticalSection(&_poll_fd[_index].mutex); - } - } else if (ret == WAIT_TIMEOUT) { - poll_dbg(" timed out"); - triggered = 0; // 0 = timeout - } else { - errno = EIO; - triggered = -1; // error - } - } - -poll_exit: - if (handles_to_wait_on != NULL) { - free(handles_to_wait_on); - } - if (handle_to_index != NULL) { - free(handle_to_index); - } - return triggered; -} - -/* - * close a fake pipe fd - */ -int usbi_close(int fd) -{ - int _index; - int r = -1; - - CHECK_INIT_POLLING; - - _index = _fd_to_index_and_lock(fd); - - if (_index < 0) { - errno = EBADF; - } else { - free_overlapped(poll_fd[_index].overlapped); - poll_fd[_index] = INVALID_WINFD; - LeaveCriticalSection(&_poll_fd[_index].mutex); - } - return r; -} - -/* - * synchronous write for fake "pipe" signaling - */ -ssize_t usbi_write(int fd, const void *buf, size_t count) -{ - int _index; - UNUSED(buf); - - CHECK_INIT_POLLING; - - if (count != sizeof(unsigned char)) { - usbi_err(NULL, "this function should only used for signaling"); - return -1; - } - - _index = _fd_to_index_and_lock(fd); - - if ( (_index < 0) || (poll_fd[_index].overlapped == NULL) ) { - errno = EBADF; - if (_index >= 0) { - LeaveCriticalSection(&_poll_fd[_index].mutex); - } - return -1; - } - - poll_dbg("set pipe event (fd = %d, thread = %08X)", _index, (unsigned int)GetCurrentThreadId()); - SetEvent(poll_fd[_index].overlapped->hEvent); - poll_fd[_index].overlapped->Internal = STATUS_WAIT_0; - // If two threads write on the pipe at the same time, we need to - // process two separate reads => use the overlapped as a counter - poll_fd[_index].overlapped->InternalHigh++; - - LeaveCriticalSection(&_poll_fd[_index].mutex); - return sizeof(unsigned char); -} - -/* - * synchronous read for fake "pipe" signaling - */ -ssize_t usbi_read(int fd, void *buf, size_t count) -{ - int _index; - ssize_t r = -1; - UNUSED(buf); - - CHECK_INIT_POLLING; - - if (count != sizeof(unsigned char)) { - usbi_err(NULL, "this function should only used for signaling"); - return -1; - } - - _index = _fd_to_index_and_lock(fd); - - if (_index < 0) { - errno = EBADF; - return -1; - } - - if (WaitForSingleObject(poll_fd[_index].overlapped->hEvent, INFINITE) != WAIT_OBJECT_0) { - usbi_warn(NULL, "waiting for event failed: %u", (unsigned int)GetLastError()); - errno = EIO; - goto out; - } - - poll_dbg("clr pipe event (fd = %d, thread = %08X)", _index, (unsigned int)GetCurrentThreadId()); - poll_fd[_index].overlapped->InternalHigh--; - // Don't reset unless we don't have any more events to process - if (poll_fd[_index].overlapped->InternalHigh <= 0) { - ResetEvent(poll_fd[_index].overlapped->hEvent); - poll_fd[_index].overlapped->Internal = STATUS_PENDING; - } - - r = sizeof(unsigned char); - -out: - LeaveCriticalSection(&_poll_fd[_index].mutex); - return r; -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_windows.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_windows.h deleted file mode 100644 index aa4c985daecd..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/poll_windows.h +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Windows compat: POSIX compatibility wrapper - * Copyright © 2012-2013 RealVNC Ltd. - * Copyright © 2009-2010 Pete Batard - * With contributions from Michael Plante, Orin Eman et al. - * Parts of poll implementation from libusb-win32, by Stephan Meyer et al. - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ -#pragma once - -#if defined(_MSC_VER) -// disable /W4 MSVC warnings that are benign -#pragma warning(disable:4127) // conditional expression is constant -#endif - -// Handle synchronous completion through the overlapped structure -#if !defined(STATUS_REPARSE) // reuse the REPARSE status code -#define STATUS_REPARSE ((LONG)0x00000104L) -#endif -#define STATUS_COMPLETED_SYNCHRONOUSLY STATUS_REPARSE -#if defined(_WIN32_WCE) -// WinCE doesn't have a HasOverlappedIoCompleted() macro, so attempt to emulate it -#define HasOverlappedIoCompleted(lpOverlapped) (((DWORD)(lpOverlapped)->Internal) != STATUS_PENDING) -#endif -#define HasOverlappedIoCompletedSync(lpOverlapped) (((DWORD)(lpOverlapped)->Internal) == STATUS_COMPLETED_SYNCHRONOUSLY) - -#define DUMMY_HANDLE ((HANDLE)(LONG_PTR)-2) - -/* Windows versions */ -enum windows_version { - WINDOWS_CE = -2, - WINDOWS_UNDEFINED = -1, - WINDOWS_UNSUPPORTED = 0, - WINDOWS_XP = 0x51, - WINDOWS_2003 = 0x52, // Also XP x64 - WINDOWS_VISTA = 0x60, - WINDOWS_7 = 0x61, - WINDOWS_8 = 0x62, - WINDOWS_8_1_OR_LATER = 0x63, - WINDOWS_MAX -}; -extern int windows_version; - -#define MAX_FDS 256 - -#define POLLIN 0x0001 /* There is data to read */ -#define POLLPRI 0x0002 /* There is urgent data to read */ -#define POLLOUT 0x0004 /* Writing now will not block */ -#define POLLERR 0x0008 /* Error condition */ -#define POLLHUP 0x0010 /* Hung up */ -#define POLLNVAL 0x0020 /* Invalid request: fd not open */ - -struct pollfd { - int fd; /* file descriptor */ - short events; /* requested events */ - short revents; /* returned events */ -}; - -// access modes -enum rw_type { - RW_NONE, - RW_READ, - RW_WRITE, -}; - -// fd struct that can be used for polling on Windows -typedef int cancel_transfer(struct usbi_transfer *itransfer); - -struct winfd { - int fd; // what's exposed to libusb core - HANDLE handle; // what we need to attach overlapped to the I/O op, so we can poll it - OVERLAPPED* overlapped; // what will report our I/O status - struct usbi_transfer *itransfer; // Associated transfer, or NULL if completed - cancel_transfer *cancel_fn; // Function pointer to cancel transfer API - enum rw_type rw; // I/O transfer direction: read *XOR* write (NOT BOTH) -}; -extern const struct winfd INVALID_WINFD; - -int usbi_pipe(int pipefd[2]); -int usbi_poll(struct pollfd *fds, unsigned int nfds, int timeout); -ssize_t usbi_write(int fd, const void *buf, size_t count); -ssize_t usbi_read(int fd, void *buf, size_t count); -int usbi_close(int fd); - -void init_polling(void); -void exit_polling(void); -struct winfd usbi_create_fd(HANDLE handle, int access_mode, - struct usbi_transfer *transfer, cancel_transfer *cancel_fn); -void usbi_free_fd(struct winfd* winfd); -struct winfd fd_to_winfd(int fd); -struct winfd handle_to_winfd(HANDLE handle); -struct winfd overlapped_to_winfd(OVERLAPPED* overlapped); - -/* - * Timeval operations - */ -#if defined(DDKBUILD) -#include // defines timeval functions on DDK -#endif - -#if !defined(TIMESPEC_TO_TIMEVAL) -#define TIMESPEC_TO_TIMEVAL(tv, ts) { \ - (tv)->tv_sec = (long)(ts)->tv_sec; \ - (tv)->tv_usec = (long)(ts)->tv_nsec / 1000; \ -} -#endif -#if !defined(timersub) -#define timersub(a, b, result) \ -do { \ - (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ - (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ - if ((result)->tv_usec < 0) { \ - --(result)->tv_sec; \ - (result)->tv_usec += 1000000; \ - } \ -} while (0) -#endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/sunos_usb.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/sunos_usb.c deleted file mode 100644 index cb608976b642..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/sunos_usb.c +++ /dev/null @@ -1,1292 +0,0 @@ -/* - * - * Copyright (c) 2016, Oracle and/or its affiliates. - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "libusbi.h" -#include "sunos_usb.h" - -/* - * Backend functions - */ -static int sunos_init(struct libusb_context *); -static void sunos_exit(void); -static int sunos_get_device_list(struct libusb_context *, - struct discovered_devs **); -static int sunos_open(struct libusb_device_handle *); -static void sunos_close(struct libusb_device_handle *); -static int sunos_get_device_descriptor(struct libusb_device *, - uint8_t*, int *); -static int sunos_get_active_config_descriptor(struct libusb_device *, - uint8_t*, size_t, int *); -static int sunos_get_config_descriptor(struct libusb_device *, uint8_t, - uint8_t*, size_t, int *); -static int sunos_get_configuration(struct libusb_device_handle *, int *); -static int sunos_set_configuration(struct libusb_device_handle *, int); -static int sunos_claim_interface(struct libusb_device_handle *, int); -static int sunos_release_interface(struct libusb_device_handle *, int); -static int sunos_set_interface_altsetting(struct libusb_device_handle *, - int, int); -static int sunos_clear_halt(struct libusb_device_handle *, uint8_t); -static int sunos_reset_device(struct libusb_device_handle *); -static void sunos_destroy_device(struct libusb_device *); -static int sunos_submit_transfer(struct usbi_transfer *); -static int sunos_cancel_transfer(struct usbi_transfer *); -static void sunos_clear_transfer_priv(struct usbi_transfer *); -static int sunos_handle_transfer_completion(struct usbi_transfer *); -static int sunos_clock_gettime(int, struct timespec *); - -/* - * Private functions - */ -static int _errno_to_libusb(int); -static int sunos_usb_get_status(int fd); - -static int sunos_init(struct libusb_context *ctx) -{ - return (LIBUSB_SUCCESS); -} - -static void sunos_exit(void) -{ - usbi_dbg(""); -} - -static int -sunos_fill_in_dev_info(di_node_t node, struct libusb_device *dev) -{ - int proplen; - int n, *addr, *port_prop; - char *phypath; - uint8_t *rdata; - struct libusb_device_descriptor *descr; - sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv; - - /* Device descriptors */ - proplen = di_prop_lookup_bytes(DDI_DEV_T_ANY, node, - "usb-dev-descriptor", &rdata); - if (proplen <= 0) { - - return (LIBUSB_ERROR_IO); - } - - descr = (struct libusb_device_descriptor *)rdata; - bcopy(descr, &dpriv->dev_descr, LIBUSB_DT_DEVICE_SIZE); - dpriv->dev_descr.bcdUSB = libusb_cpu_to_le16(descr->bcdUSB); - dpriv->dev_descr.idVendor = libusb_cpu_to_le16(descr->idVendor); - dpriv->dev_descr.idProduct = libusb_cpu_to_le16(descr->idProduct); - dpriv->dev_descr.bcdDevice = libusb_cpu_to_le16(descr->bcdDevice); - - /* Raw configuration descriptors */ - proplen = di_prop_lookup_bytes(DDI_DEV_T_ANY, node, - "usb-raw-cfg-descriptors", &rdata); - if (proplen <= 0) { - usbi_dbg("can't find raw config descriptors"); - - return (LIBUSB_ERROR_IO); - } - dpriv->raw_cfgdescr = calloc(1, proplen); - if (dpriv->raw_cfgdescr == NULL) { - return (LIBUSB_ERROR_NO_MEM); - } else { - bcopy(rdata, dpriv->raw_cfgdescr, proplen); - dpriv->cfgvalue = ((struct libusb_config_descriptor *) - rdata)->bConfigurationValue; - } - - n = di_prop_lookup_ints(DDI_DEV_T_ANY, node, "reg", &port_prop); - - if ((n != 1) || (*port_prop <= 0)) { - return (LIBUSB_ERROR_IO); - } - dev->port_number = *port_prop; - - /* device physical path */ - phypath = di_devfs_path(node); - if (phypath) { - dpriv->phypath = strdup(phypath); - di_devfs_path_free(phypath); - } else { - free(dpriv->raw_cfgdescr); - - return (LIBUSB_ERROR_IO); - } - - /* address */ - n = di_prop_lookup_ints(DDI_DEV_T_ANY, node, "assigned-address", &addr); - if (n != 1 || *addr == 0) { - usbi_dbg("can't get address"); - } else { - dev->device_address = *addr; - } - - /* speed */ - if (di_prop_exists(DDI_DEV_T_ANY, node, "low-speed") == 1) { - dev->speed = LIBUSB_SPEED_LOW; - } else if (di_prop_exists(DDI_DEV_T_ANY, node, "high-speed") == 1) { - dev->speed = LIBUSB_SPEED_HIGH; - } else if (di_prop_exists(DDI_DEV_T_ANY, node, "full-speed") == 1) { - dev->speed = LIBUSB_SPEED_FULL; - } else if (di_prop_exists(DDI_DEV_T_ANY, node, "super-speed") == 1) { - dev->speed = LIBUSB_SPEED_SUPER; - } - - usbi_dbg("vid=%x pid=%x, path=%s, bus_nmber=0x%x, port_number=%d, " - "speed=%d", dpriv->dev_descr.idVendor, dpriv->dev_descr.idProduct, - dpriv->phypath, dev->bus_number, dev->port_number, dev->speed); - - return (LIBUSB_SUCCESS); -} - - -static int -sunos_add_devices(di_devlink_t link, void *arg) -{ - struct devlink_cbarg *largs = (struct devlink_cbarg *)arg; - struct node_args *nargs; - di_node_t myself, pnode; - uint64_t session_id = 0; - uint16_t bdf = 0; - struct libusb_device *dev; - sunos_dev_priv_t *devpriv; - const char *path, *newpath; - int n, i; - int *addr_prop; - uint8_t bus_number = 0; - - nargs = (struct node_args *)largs->nargs; - myself = largs->myself; - if (nargs->last_ugenpath) { - /* the same node's links */ - return (DI_WALK_CONTINUE); - } - - /* - * Construct session ID. - * session ID = ...parent hub addr|hub addr|dev addr. - */ - pnode = myself; - i = 0; - while (pnode != DI_NODE_NIL) { - if (di_prop_exists(DDI_DEV_T_ANY, pnode, "root-hub") == 1) { - /* walk to root */ - uint32_t *regbuf = NULL; - uint32_t reg; - - n = di_prop_lookup_ints(DDI_DEV_T_ANY, pnode, "reg", - (int **)®buf); - reg = regbuf[0]; - bdf = (PCI_REG_BUS_G(reg) << 8) | - (PCI_REG_DEV_G(reg) << 3) | PCI_REG_FUNC_G(reg); - session_id |= (bdf << i * 8); - - /* same as 'unit-address' property */ - bus_number = - (PCI_REG_DEV_G(reg) << 3) | PCI_REG_FUNC_G(reg); - - usbi_dbg("device bus address=%s:%x", - di_bus_addr(pnode), bus_number); - - break; - } - - /* usb_addr */ - n = di_prop_lookup_ints(DDI_DEV_T_ANY, pnode, - "assigned-address", &addr_prop); - if ((n != 1) || (addr_prop[0] == 0)) { - usbi_dbg("cannot get valid usb_addr"); - - return (DI_WALK_CONTINUE); - } - - session_id |= ((addr_prop[0] & 0xff) << i * 8); - if (++i > 7) - break; - - pnode = di_parent_node(pnode); - } - - path = di_devlink_path(link); - dev = usbi_get_device_by_session_id(nargs->ctx, session_id); - if (dev == NULL) { - dev = usbi_alloc_device(nargs->ctx, session_id); - if (dev == NULL) { - usbi_dbg("can't alloc device"); - - return (DI_WALK_TERMINATE); - } - devpriv = (sunos_dev_priv_t *)dev->os_priv; - if ((newpath = strrchr(path, '/')) == NULL) { - libusb_unref_device(dev); - - return (DI_WALK_TERMINATE); - } - devpriv->ugenpath = strndup(path, strlen(path) - - strlen(newpath)); - dev->bus_number = bus_number; - - if (sunos_fill_in_dev_info(myself, dev) != LIBUSB_SUCCESS) { - libusb_unref_device(dev); - - return (DI_WALK_TERMINATE); - } - if (usbi_sanitize_device(dev) < 0) { - libusb_unref_device(dev); - usbi_dbg("sanatize failed: "); - return (DI_WALK_TERMINATE); - } - } else { - usbi_dbg("Dev %s exists", path); - } - - devpriv = (sunos_dev_priv_t *)dev->os_priv; - if (nargs->last_ugenpath == NULL) { - /* first device */ - nargs->last_ugenpath = devpriv->ugenpath; - - if (discovered_devs_append(*(nargs->discdevs), dev) == NULL) { - usbi_dbg("cannot append device"); - } - - /* - * we alloc and hence ref this dev. We don't need to ref it - * hereafter. Front end or app should take care of their ref. - */ - libusb_unref_device(dev); - } - - usbi_dbg("Device %s %s id=0x%llx, devcount:%d, bdf=%x", - devpriv->ugenpath, path, (uint64_t)session_id, - (*nargs->discdevs)->len, bdf); - - return (DI_WALK_CONTINUE); -} - -static int -sunos_walk_minor_node_link(di_node_t node, void *args) -{ - di_minor_t minor = DI_MINOR_NIL; - char *minor_path; - struct devlink_cbarg arg; - struct node_args *nargs = (struct node_args *)args; - di_devlink_handle_t devlink_hdl = nargs->dlink_hdl; - - /* walk each minor to find ugen devices */ - while ((minor = di_minor_next(node, minor)) != DI_MINOR_NIL) { - minor_path = di_devfs_minor_path(minor); - arg.nargs = args; - arg.myself = node; - arg.minor = minor; - (void) di_devlink_walk(devlink_hdl, - "^usb/[0-9a-f]+[.][0-9a-f]+", minor_path, - DI_PRIMARY_LINK, (void *)&arg, sunos_add_devices); - di_devfs_path_free(minor_path); - } - - /* switch to a different node */ - nargs->last_ugenpath = NULL; - - return (DI_WALK_CONTINUE); -} - -int -sunos_get_device_list(struct libusb_context * ctx, - struct discovered_devs **discdevs) -{ - di_node_t root_node; - struct node_args args; - di_devlink_handle_t devlink_hdl; - - args.ctx = ctx; - args.discdevs = discdevs; - args.last_ugenpath = NULL; - if ((root_node = di_init("/", DINFOCPYALL)) == DI_NODE_NIL) { - usbi_dbg("di_int() failed: %s", strerror(errno)); - return (LIBUSB_ERROR_IO); - } - - if ((devlink_hdl = di_devlink_init(NULL, 0)) == NULL) { - di_fini(root_node); - usbi_dbg("di_devlink_init() failed: %s", strerror(errno)); - - return (LIBUSB_ERROR_IO); - } - args.dlink_hdl = devlink_hdl; - - /* walk each node to find USB devices */ - if (di_walk_node(root_node, DI_WALK_SIBFIRST, &args, - sunos_walk_minor_node_link) == -1) { - usbi_dbg("di_walk_node() failed: %s", strerror(errno)); - di_fini(root_node); - - return (LIBUSB_ERROR_IO); - } - - di_fini(root_node); - di_devlink_fini(&devlink_hdl); - - usbi_dbg("%d devices", (*discdevs)->len); - - return ((*discdevs)->len); -} - -static int -sunos_usb_open_ep0(sunos_dev_handle_priv_t *hpriv, sunos_dev_priv_t *dpriv) -{ - char filename[PATH_MAX + 1]; - - if (hpriv->eps[0].datafd > 0) { - - return (LIBUSB_SUCCESS); - } - snprintf(filename, PATH_MAX, "%s/cntrl0", dpriv->ugenpath); - - usbi_dbg("opening %s", filename); - hpriv->eps[0].datafd = open(filename, O_RDWR); - if (hpriv->eps[0].datafd < 0) { - return(_errno_to_libusb(errno)); - } - - snprintf(filename, PATH_MAX, "%s/cntrl0stat", dpriv->ugenpath); - hpriv->eps[0].statfd = open(filename, O_RDONLY); - if (hpriv->eps[0].statfd < 0) { - close(hpriv->eps[0].datafd); - hpriv->eps[0].datafd = -1; - - return(_errno_to_libusb(errno)); - } - - return (LIBUSB_SUCCESS); -} - -static void -sunos_usb_close_all_eps(sunos_dev_handle_priv_t *hdev) -{ - int i; - - /* not close ep0 */ - for (i = 1; i < USB_MAXENDPOINTS; i++) { - if (hdev->eps[i].datafd != -1) { - (void) close(hdev->eps[i].datafd); - hdev->eps[i].datafd = -1; - } - if (hdev->eps[i].statfd != -1) { - (void) close(hdev->eps[i].statfd); - hdev->eps[i].statfd = -1; - } - } -} - -static void -sunos_usb_close_ep0(sunos_dev_handle_priv_t *hdev, sunos_dev_priv_t *dpriv) -{ - if (hdev->eps[0].datafd >= 0) { - close(hdev->eps[0].datafd); - close(hdev->eps[0].statfd); - hdev->eps[0].datafd = -1; - hdev->eps[0].statfd = -1; - } -} - -static uchar_t -sunos_usb_ep_index(uint8_t ep_addr) -{ - return ((ep_addr & LIBUSB_ENDPOINT_ADDRESS_MASK) + - ((ep_addr & LIBUSB_ENDPOINT_DIR_MASK) ? 16 : 0)); -} - -static int -sunos_find_interface(struct libusb_device_handle *hdev, - uint8_t endpoint, uint8_t *interface) -{ - struct libusb_config_descriptor *config; - int r; - int iface_idx; - - r = libusb_get_active_config_descriptor(hdev->dev, &config); - if (r < 0) { - return (LIBUSB_ERROR_INVALID_PARAM); - } - - for (iface_idx = 0; iface_idx < config->bNumInterfaces; iface_idx++) { - const struct libusb_interface *iface = - &config->interface[iface_idx]; - int altsetting_idx; - - for (altsetting_idx = 0; altsetting_idx < iface->num_altsetting; - altsetting_idx++) { - const struct libusb_interface_descriptor *altsetting = - &iface->altsetting[altsetting_idx]; - int ep_idx; - - for (ep_idx = 0; ep_idx < altsetting->bNumEndpoints; - ep_idx++) { - const struct libusb_endpoint_descriptor *ep = - &altsetting->endpoint[ep_idx]; - if (ep->bEndpointAddress == endpoint) { - *interface = iface_idx; - libusb_free_config_descriptor(config); - - return (LIBUSB_SUCCESS); - } - } - } - } - libusb_free_config_descriptor(config); - - return (LIBUSB_ERROR_INVALID_PARAM); -} - -static int -sunos_check_device_and_status_open(struct libusb_device_handle *hdl, - uint8_t ep_addr, int ep_type) -{ - char filename[PATH_MAX + 1], statfilename[PATH_MAX + 1]; - char cfg_num[16], alt_num[16]; - int fd, fdstat, mode; - uint8_t ifc = 0; - uint8_t ep_index; - sunos_dev_handle_priv_t *hpriv; - - usbi_dbg("open ep 0x%02x", ep_addr); - hpriv = (sunos_dev_handle_priv_t *)hdl->os_priv; - ep_index = sunos_usb_ep_index(ep_addr); - /* ep already opened */ - if ((hpriv->eps[ep_index].datafd > 0) && - (hpriv->eps[ep_index].statfd > 0)) { - usbi_dbg("ep 0x%02x already opened, return success", - ep_addr); - - return (0); - } - - if (sunos_find_interface(hdl, ep_addr, &ifc) < 0) { - usbi_dbg("can't find interface for endpoint 0x%02x", - ep_addr); - - return (LIBUSB_ERROR_ACCESS); - } - - /* create filename */ - if (hpriv->config_index > 0) { - (void) snprintf(cfg_num, sizeof (cfg_num), "cfg%d", - hpriv->config_index + 1); - } else { - bzero(cfg_num, sizeof (cfg_num)); - } - - if (hpriv->altsetting[ifc] > 0) { - (void) snprintf(alt_num, sizeof (alt_num), ".%d", - hpriv->altsetting[ifc]); - } else { - bzero(alt_num, sizeof (alt_num)); - } - - (void) snprintf(filename, PATH_MAX, "%s/%sif%d%s%s%d", - hpriv->dpriv->ugenpath, cfg_num, ifc, alt_num, - (ep_addr & LIBUSB_ENDPOINT_DIR_MASK) ? "in" : - "out", (ep_addr & LIBUSB_ENDPOINT_ADDRESS_MASK)); - (void) snprintf(statfilename, PATH_MAX, "%sstat", filename); - - /* - * for interrupt IN endpoints, we need to enable one xfer - * mode before opening the endpoint - */ - if ((ep_type == LIBUSB_TRANSFER_TYPE_INTERRUPT) && - (ep_addr & LIBUSB_ENDPOINT_IN)) { - char control = USB_EP_INTR_ONE_XFER; - int count; - - /* open the status device node for the ep first RDWR */ - if ((fdstat = open(statfilename, O_RDWR)) == -1) { - usbi_dbg("can't open %s RDWR: %d", - statfilename, errno); - } else { - count = write(fdstat, &control, sizeof (control)); - if (count != 1) { - /* this should have worked */ - usbi_dbg("can't write to %s: %d", - statfilename, errno); - (void) close(fdstat); - - return (errno); - } - /* close status node and open xfer node first */ - close (fdstat); - } - } - - /* open the xfer node first in case alt needs to be changed */ - if (ep_type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) { - mode = O_RDWR; - } else if (ep_addr & LIBUSB_ENDPOINT_IN) { - mode = O_RDONLY; - } else { - mode = O_WRONLY; - } - - /* - * IMPORTANT: must open data xfer node first and then open stat node - * Otherwise, it will fail on multi-config or multi-altsetting devices - * with "Device Busy" error. See ugen_epxs_switch_cfg_alt() and - * ugen_epxs_check_alt_switch() in ugen driver source code. - */ - if ((fd = open(filename, mode)) == -1) { - usbi_dbg("can't open %s: %d(%s)", filename, errno, - strerror(errno)); - - return (errno); - } - /* open the status node */ - if ((fdstat = open(statfilename, O_RDONLY)) == -1) { - usbi_dbg("can't open %s: %d", statfilename, errno); - - (void) close(fd); - - return (errno); - } - - hpriv->eps[ep_index].datafd = fd; - hpriv->eps[ep_index].statfd = fdstat; - usbi_dbg("ep=0x%02x datafd=%d, statfd=%d", ep_addr, fd, fdstat); - - return (0); -} - -int -sunos_open(struct libusb_device_handle *handle) -{ - sunos_dev_handle_priv_t *hpriv; - sunos_dev_priv_t *dpriv; - int i; - int ret; - - hpriv = (sunos_dev_handle_priv_t *)handle->os_priv; - dpriv = (sunos_dev_priv_t *)handle->dev->os_priv; - hpriv->dpriv = dpriv; - - /* set all file descriptors to "closed" */ - for (i = 0; i < USB_MAXENDPOINTS; i++) { - hpriv->eps[i].datafd = -1; - hpriv->eps[i].statfd = -1; - } - - if ((ret = sunos_usb_open_ep0(hpriv, dpriv)) != LIBUSB_SUCCESS) { - usbi_dbg("fail: %d", ret); - return (ret); - } - - return (LIBUSB_SUCCESS); -} - -void -sunos_close(struct libusb_device_handle *handle) -{ - sunos_dev_handle_priv_t *hpriv; - sunos_dev_priv_t *dpriv; - - usbi_dbg(""); - if (!handle) { - return; - } - - hpriv = (sunos_dev_handle_priv_t *)handle->os_priv; - if (!hpriv) { - return; - } - dpriv = (sunos_dev_priv_t *)handle->dev->os_priv; - if (!dpriv) { - return; - } - - sunos_usb_close_all_eps(hpriv); - sunos_usb_close_ep0(hpriv, dpriv); -} - -int -sunos_get_device_descriptor(struct libusb_device *dev, uint8_t *buf, - int *host_endian) -{ - sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv; - - memcpy(buf, &dpriv->dev_descr, LIBUSB_DT_DEVICE_SIZE); - *host_endian = 0; - - return (LIBUSB_SUCCESS); -} - -int -sunos_get_active_config_descriptor(struct libusb_device *dev, - uint8_t *buf, size_t len, int *host_endian) -{ - sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv; - struct libusb_config_descriptor *cfg; - int proplen; - di_node_t node; - uint8_t *rdata; - - /* - * Keep raw configuration descriptors updated, in case config - * has ever been changed through setCfg. - */ - if ((node = di_init(dpriv->phypath, DINFOCPYALL)) == DI_NODE_NIL) { - usbi_dbg("di_int() failed: %s", strerror(errno)); - return (LIBUSB_ERROR_IO); - } - proplen = di_prop_lookup_bytes(DDI_DEV_T_ANY, node, - "usb-raw-cfg-descriptors", &rdata); - if (proplen <= 0) { - usbi_dbg("can't find raw config descriptors"); - - return (LIBUSB_ERROR_IO); - } - dpriv->raw_cfgdescr = realloc(dpriv->raw_cfgdescr, proplen); - if (dpriv->raw_cfgdescr == NULL) { - return (LIBUSB_ERROR_NO_MEM); - } else { - bcopy(rdata, dpriv->raw_cfgdescr, proplen); - dpriv->cfgvalue = ((struct libusb_config_descriptor *) - rdata)->bConfigurationValue; - } - di_fini(node); - - cfg = (struct libusb_config_descriptor *)dpriv->raw_cfgdescr; - len = MIN(len, libusb_le16_to_cpu(cfg->wTotalLength)); - memcpy(buf, dpriv->raw_cfgdescr, len); - *host_endian = 0; - usbi_dbg("path:%s len %d", dpriv->phypath, len); - - return (len); -} - -int -sunos_get_config_descriptor(struct libusb_device *dev, uint8_t idx, - uint8_t *buf, size_t len, int *host_endian) -{ - /* XXX */ - return(sunos_get_active_config_descriptor(dev, buf, len, host_endian)); -} - -int -sunos_get_configuration(struct libusb_device_handle *handle, int *config) -{ - sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)handle->dev->os_priv; - - *config = dpriv->cfgvalue; - - usbi_dbg("bConfigurationValue %d", *config); - - return (LIBUSB_SUCCESS); -} - -int -sunos_set_configuration(struct libusb_device_handle *handle, int config) -{ - sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)handle->dev->os_priv; - sunos_dev_handle_priv_t *hpriv; - - usbi_dbg("bConfigurationValue %d", config); - hpriv = (sunos_dev_handle_priv_t *)handle->os_priv; - - if (dpriv->ugenpath == NULL) - return (LIBUSB_ERROR_NOT_SUPPORTED); - - if (config < 1 || config > dpriv->dev_descr.bNumConfigurations) - return (LIBUSB_ERROR_INVALID_PARAM); - - dpriv->cfgvalue = config; - hpriv->config_index = config - 1; - - return (LIBUSB_SUCCESS); -} - -int -sunos_claim_interface(struct libusb_device_handle *handle, int iface) -{ - usbi_dbg("iface %d", iface); - if (iface < 0) { - return (LIBUSB_ERROR_INVALID_PARAM); - } - - return (LIBUSB_SUCCESS); -} - -int -sunos_release_interface(struct libusb_device_handle *handle, int iface) -{ - sunos_dev_handle_priv_t *hpriv = - (sunos_dev_handle_priv_t *)handle->os_priv; - - usbi_dbg("iface %d", iface); - if (iface < 0) { - return (LIBUSB_ERROR_INVALID_PARAM); - } - - /* XXX: can we release it? */ - hpriv->altsetting[iface] = 0; - - return (LIBUSB_SUCCESS); -} - -int -sunos_set_interface_altsetting(struct libusb_device_handle *handle, int iface, - int altsetting) -{ - sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)handle->dev->os_priv; - sunos_dev_handle_priv_t *hpriv = - (sunos_dev_handle_priv_t *)handle->os_priv; - - usbi_dbg("iface %d, setting %d", iface, altsetting); - - if (iface < 0 || altsetting < 0) { - return (LIBUSB_ERROR_INVALID_PARAM); - } - if (dpriv->ugenpath == NULL) - return (LIBUSB_ERROR_NOT_FOUND); - - /* XXX: can we switch altsetting? */ - hpriv->altsetting[iface] = altsetting; - - return (LIBUSB_SUCCESS); -} - -static void -usb_dump_data(unsigned char *data, size_t size) -{ - int i; - - if (getenv("LIBUSB_DEBUG") == NULL) { - return; - } - - (void) fprintf(stderr, "data dump:"); - for (i = 0; i < size; i++) { - if (i % 16 == 0) { - (void) fprintf(stderr, "\n%08x ", i); - } - (void) fprintf(stderr, "%02x ", (uchar_t)data[i]); - } - (void) fprintf(stderr, "\n"); -} - -static void -sunos_async_callback(union sigval arg) -{ - struct sunos_transfer_priv *tpriv = - (struct sunos_transfer_priv *)arg.sival_ptr; - struct libusb_transfer *xfer = tpriv->transfer; - struct aiocb *aiocb = &tpriv->aiocb; - int ret; - sunos_dev_handle_priv_t *hpriv; - uint8_t ep; - - hpriv = (sunos_dev_handle_priv_t *)xfer->dev_handle->os_priv; - ep = sunos_usb_ep_index(xfer->endpoint); - - ret = aio_error(aiocb); - if (ret != 0) { - xfer->status = sunos_usb_get_status(hpriv->eps[ep].statfd); - } else { - xfer->actual_length = - LIBUSB_TRANSFER_TO_USBI_TRANSFER(xfer)->transferred = - aio_return(aiocb); - } - - usb_dump_data(xfer->buffer, xfer->actual_length); - - usbi_dbg("ret=%d, len=%d, actual_len=%d", ret, xfer->length, - xfer->actual_length); - - /* async notification */ - usbi_signal_transfer_completion(LIBUSB_TRANSFER_TO_USBI_TRANSFER(xfer)); -} - -static int -sunos_do_async_io(struct libusb_transfer *transfer) -{ - int ret = -1; - struct aiocb *aiocb; - sunos_dev_handle_priv_t *hpriv; - uint8_t ep; - struct sunos_transfer_priv *tpriv; - - usbi_dbg(""); - - tpriv = usbi_transfer_get_os_priv(LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer)); - hpriv = (sunos_dev_handle_priv_t *)transfer->dev_handle->os_priv; - ep = sunos_usb_ep_index(transfer->endpoint); - - tpriv->transfer = transfer; - aiocb = &tpriv->aiocb; - bzero(aiocb, sizeof (*aiocb)); - aiocb->aio_fildes = hpriv->eps[ep].datafd; - aiocb->aio_buf = transfer->buffer; - aiocb->aio_nbytes = transfer->length; - aiocb->aio_lio_opcode = - ((transfer->endpoint & LIBUSB_ENDPOINT_DIR_MASK) == - LIBUSB_ENDPOINT_IN) ? LIO_READ:LIO_WRITE; - aiocb->aio_sigevent.sigev_notify = SIGEV_THREAD; - aiocb->aio_sigevent.sigev_value.sival_ptr = tpriv; - aiocb->aio_sigevent.sigev_notify_function = sunos_async_callback; - - if (aiocb->aio_lio_opcode == LIO_READ) { - ret = aio_read(aiocb); - } else { - ret = aio_write(aiocb); - } - - return (ret); -} - -/* return the number of bytes read/written */ -static int -usb_do_io(int fd, int stat_fd, char *data, size_t size, int flag, int *status) -{ - int error; - int ret = -1; - - usbi_dbg("usb_do_io(): datafd=%d statfd=%d size=0x%x flag=%s", - fd, stat_fd, size, flag? "WRITE":"READ"); - - switch (flag) { - case READ: - errno = 0; - ret = read(fd, data, size); - usb_dump_data(data, size); - break; - case WRITE: - usb_dump_data(data, size); - errno = 0; - ret = write(fd, data, size); - break; - } - - usbi_dbg("usb_do_io(): amount=%d", ret); - - if (ret < 0) { - int save_errno = errno; - - usbi_dbg("TID=%x io %s errno=%d(%s) ret=%d", pthread_self(), - flag?"WRITE":"READ", errno, strerror(errno), ret); - - /* sunos_usb_get_status will do a read and overwrite errno */ - error = sunos_usb_get_status(stat_fd); - usbi_dbg("io status=%d errno=%d(%s)", error, - save_errno, strerror(save_errno)); - - if (status) { - *status = save_errno; - } - - return (save_errno); - - } else if (status) { - *status = 0; - } - - return (ret); -} - -static int -solaris_submit_ctrl_on_default(struct libusb_transfer *transfer) -{ - int ret = -1, setup_ret; - int status; - sunos_dev_handle_priv_t *hpriv; - struct libusb_device_handle *hdl = transfer->dev_handle; - uint16_t wLength; - uint8_t *data = transfer->buffer; - - hpriv = (sunos_dev_handle_priv_t *)hdl->os_priv; - wLength = transfer->length - LIBUSB_CONTROL_SETUP_SIZE; - - if (hpriv->eps[0].datafd == -1) { - usbi_dbg("ep0 not opened"); - - return (LIBUSB_ERROR_NOT_FOUND); - } - - if ((data[0] & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN) { - usbi_dbg("IN request"); - ret = usb_do_io(hpriv->eps[0].datafd, - hpriv->eps[0].statfd, (char *)data, LIBUSB_CONTROL_SETUP_SIZE, - WRITE, (int *)&status); - } else { - usbi_dbg("OUT request"); - ret = usb_do_io(hpriv->eps[0].datafd, hpriv->eps[0].statfd, - transfer->buffer, transfer->length, WRITE, - (int *)&transfer->status); - } - - setup_ret = ret; - if (ret < LIBUSB_CONTROL_SETUP_SIZE) { - usbi_dbg("error sending control msg: %d", ret); - - return (LIBUSB_ERROR_IO); - } - - ret = transfer->length - LIBUSB_CONTROL_SETUP_SIZE; - - /* Read the remaining bytes for IN request */ - if ((wLength) && ((data[0] & LIBUSB_ENDPOINT_DIR_MASK) == - LIBUSB_ENDPOINT_IN)) { - usbi_dbg("DATA: %d", transfer->length - setup_ret); - ret = usb_do_io(hpriv->eps[0].datafd, - hpriv->eps[0].statfd, - (char *)transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, - wLength, READ, (int *)&transfer->status); - } - - if (ret >= 0) { - transfer->actual_length = ret; - LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer)->transferred = ret; - } - usbi_dbg("Done: ctrl data bytes %d", ret); - - /* sync transfer handling */ - ret = usbi_handle_transfer_completion(LIBUSB_TRANSFER_TO_USBI_TRANSFER(transfer), - transfer->status); - - return (ret); -} - -int -sunos_clear_halt(struct libusb_device_handle *handle, uint8_t endpoint) -{ - int ret; - - usbi_dbg("endpoint=0x%02x", endpoint); - - ret = libusb_control_transfer(handle, LIBUSB_ENDPOINT_OUT | - LIBUSB_RECIPIENT_ENDPOINT | LIBUSB_REQUEST_TYPE_STANDARD, - LIBUSB_REQUEST_CLEAR_FEATURE, 0, endpoint, NULL, 0, 1000); - - usbi_dbg("ret=%d", ret); - - return (ret); -} - -int -sunos_reset_device(struct libusb_device_handle *handle) -{ - usbi_dbg(""); - - return (LIBUSB_ERROR_NOT_SUPPORTED); -} - -void -sunos_destroy_device(struct libusb_device *dev) -{ - sunos_dev_priv_t *dpriv = (sunos_dev_priv_t *)dev->os_priv; - - usbi_dbg(""); - - free(dpriv->raw_cfgdescr); - free(dpriv->ugenpath); - free(dpriv->phypath); -} - -int -sunos_submit_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer; - struct libusb_device_handle *hdl; - int err = 0; - - transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - hdl = transfer->dev_handle; - - err = sunos_check_device_and_status_open(hdl, - transfer->endpoint, transfer->type); - if (err < 0) { - - return (_errno_to_libusb(err)); - } - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - /* sync transfer */ - usbi_dbg("CTRL transfer: %d", transfer->length); - err = solaris_submit_ctrl_on_default(transfer); - break; - - case LIBUSB_TRANSFER_TYPE_BULK: - /* fallthru */ - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - if (transfer->type == LIBUSB_TRANSFER_TYPE_BULK) - usbi_dbg("BULK transfer: %d", transfer->length); - else - usbi_dbg("INTR transfer: %d", transfer->length); - err = sunos_do_async_io(transfer); - break; - - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - /* Isochronous/Stream is not supported */ - - /* fallthru */ - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) - usbi_dbg("ISOC transfer: %d", transfer->length); - else - usbi_dbg("BULK STREAM transfer: %d", transfer->length); - err = LIBUSB_ERROR_NOT_SUPPORTED; - break; - } - - return (err); -} - -int -sunos_cancel_transfer(struct usbi_transfer *itransfer) -{ - sunos_xfer_priv_t *tpriv; - sunos_dev_handle_priv_t *hpriv; - struct libusb_transfer *transfer; - struct aiocb *aiocb; - uint8_t ep; - int ret; - - tpriv = usbi_transfer_get_os_priv(itransfer); - aiocb = &tpriv->aiocb; - transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - hpriv = (sunos_dev_handle_priv_t *)transfer->dev_handle->os_priv; - ep = sunos_usb_ep_index(transfer->endpoint); - - ret = aio_cancel(hpriv->eps[ep].datafd, aiocb); - - usbi_dbg("aio->fd=%d fd=%d ret = %d, %s", aiocb->aio_fildes, - hpriv->eps[ep].datafd, ret, (ret == AIO_CANCELED)? - strerror(0):strerror(errno)); - - if (ret != AIO_CANCELED) { - ret = _errno_to_libusb(errno); - } else { - /* - * we don't need to call usbi_handle_transfer_cancellation(), - * because we'll handle everything in sunos_async_callback. - */ - ret = LIBUSB_SUCCESS; - } - - return (ret); -} - -void -sunos_clear_transfer_priv(struct usbi_transfer *itransfer) -{ - usbi_dbg(""); - - /* Nothing to do */ -} - -int -sunos_handle_transfer_completion(struct usbi_transfer *itransfer) -{ - return usbi_handle_transfer_completion(itransfer, LIBUSB_TRANSFER_COMPLETED); -} - -int -sunos_clock_gettime(int clkid, struct timespec *tp) -{ - usbi_dbg("clock %d", clkid); - - if (clkid == USBI_CLOCK_REALTIME) - return clock_gettime(CLOCK_REALTIME, tp); - - if (clkid == USBI_CLOCK_MONOTONIC) - return clock_gettime(CLOCK_MONOTONIC, tp); - - return (LIBUSB_ERROR_INVALID_PARAM); -} - -int -_errno_to_libusb(int err) -{ - usbi_dbg("error: %s (%d)", strerror(err), err); - - switch (err) { - case EIO: - return (LIBUSB_ERROR_IO); - case EACCES: - return (LIBUSB_ERROR_ACCESS); - case ENOENT: - return (LIBUSB_ERROR_NO_DEVICE); - case ENOMEM: - return (LIBUSB_ERROR_NO_MEM); - case ETIMEDOUT: - return (LIBUSB_ERROR_TIMEOUT); - } - - return (LIBUSB_ERROR_OTHER); -} - -/* - * sunos_usb_get_status: - * gets status of endpoint - * - * Returns: ugen's last cmd status - */ -static int -sunos_usb_get_status(int fd) -{ - int status, ret; - - usbi_dbg("sunos_usb_get_status(): fd=%d", fd); - - ret = read(fd, &status, sizeof (status)); - if (ret == sizeof (status)) { - switch (status) { - case USB_LC_STAT_NOERROR: - usbi_dbg("No Error"); - break; - case USB_LC_STAT_CRC: - usbi_dbg("CRC Timeout Detected\n"); - break; - case USB_LC_STAT_BITSTUFFING: - usbi_dbg("Bit Stuffing Violation\n"); - break; - case USB_LC_STAT_DATA_TOGGLE_MM: - usbi_dbg("Data Toggle Mismatch\n"); - break; - case USB_LC_STAT_STALL: - usbi_dbg("End Point Stalled\n"); - break; - case USB_LC_STAT_DEV_NOT_RESP: - usbi_dbg("Device is Not Responding\n"); - break; - case USB_LC_STAT_PID_CHECKFAILURE: - usbi_dbg("PID Check Failure\n"); - break; - case USB_LC_STAT_UNEXP_PID: - usbi_dbg("Unexpected PID\n"); - break; - case USB_LC_STAT_DATA_OVERRUN: - usbi_dbg("Data Exceeded Size\n"); - break; - case USB_LC_STAT_DATA_UNDERRUN: - usbi_dbg("Less data received\n"); - break; - case USB_LC_STAT_BUFFER_OVERRUN: - usbi_dbg("Buffer Size Exceeded\n"); - break; - case USB_LC_STAT_BUFFER_UNDERRUN: - usbi_dbg("Buffer Underrun\n"); - break; - case USB_LC_STAT_TIMEOUT: - usbi_dbg("Command Timed Out\n"); - break; - case USB_LC_STAT_NOT_ACCESSED: - usbi_dbg("Not Accessed by h/w\n"); - break; - case USB_LC_STAT_UNSPECIFIED_ERR: - usbi_dbg("Unspecified Error\n"); - break; - case USB_LC_STAT_NO_BANDWIDTH: - usbi_dbg("No Bandwidth\n"); - break; - case USB_LC_STAT_HW_ERR: - usbi_dbg("Host Controller h/w Error\n"); - break; - case USB_LC_STAT_SUSPENDED: - usbi_dbg("Device was Suspended\n"); - break; - case USB_LC_STAT_DISCONNECTED: - usbi_dbg("Device was Disconnected\n"); - break; - case USB_LC_STAT_INTR_BUF_FULL: - usbi_dbg("Interrupt buffer was full\n"); - break; - case USB_LC_STAT_INVALID_REQ: - usbi_dbg("Request was Invalid\n"); - break; - case USB_LC_STAT_INTERRUPTED: - usbi_dbg("Request was Interrupted\n"); - break; - case USB_LC_STAT_NO_RESOURCES: - usbi_dbg("No resources available for " - "request\n"); - break; - case USB_LC_STAT_INTR_POLLING_FAILED: - usbi_dbg("Failed to Restart Poll"); - break; - default: - usbi_dbg("Error Not Determined %d\n", - status); - break; - } - } else { - usbi_dbg("read stat error: %s",strerror(errno)); - status = -1; - } - - return (status); -} - -const struct usbi_os_backend sunos_backend = { - .name = "Solaris", - .caps = 0, - .init = sunos_init, - .exit = sunos_exit, - .get_device_list = sunos_get_device_list, - .get_device_descriptor = sunos_get_device_descriptor, - .get_active_config_descriptor = sunos_get_active_config_descriptor, - .get_config_descriptor = sunos_get_config_descriptor, - .hotplug_poll = NULL, - .open = sunos_open, - .close = sunos_close, - .get_configuration = sunos_get_configuration, - .set_configuration = sunos_set_configuration, - - .claim_interface = sunos_claim_interface, - .release_interface = sunos_release_interface, - .set_interface_altsetting = sunos_set_interface_altsetting, - .clear_halt = sunos_clear_halt, - .reset_device = sunos_reset_device, /* TODO */ - .alloc_streams = NULL, - .free_streams = NULL, - .kernel_driver_active = NULL, - .detach_kernel_driver = NULL, - .attach_kernel_driver = NULL, - .destroy_device = sunos_destroy_device, - .submit_transfer = sunos_submit_transfer, - .cancel_transfer = sunos_cancel_transfer, - .handle_events = NULL, - .clear_transfer_priv = sunos_clear_transfer_priv, - .handle_transfer_completion = sunos_handle_transfer_completion, - .clock_gettime = sunos_clock_gettime, - .device_priv_size = sizeof(sunos_dev_priv_t), - .device_handle_priv_size = sizeof(sunos_dev_handle_priv_t), - .transfer_priv_size = sizeof(sunos_xfer_priv_t), -}; diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/sunos_usb.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/sunos_usb.h deleted file mode 100644 index 574166031994..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/sunos_usb.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * - * Copyright (c) 2016, Oracle and/or its affiliates. - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef LIBUSB_SUNOS_H -#define LIBUSB_SUNOS_H - -#include -#include -#include "libusbi.h" - -#define READ 0 -#define WRITE 1 - -typedef struct sunos_device_priv { - uint8_t cfgvalue; /* active config value */ - uint8_t *raw_cfgdescr; /* active config descriptor */ - struct libusb_device_descriptor dev_descr; /* usb device descriptor */ - char *ugenpath; /* name of the ugen(4) node */ - char *phypath; /* physical path */ -} sunos_dev_priv_t; - -typedef struct endpoint { - int datafd; /* data file */ - int statfd; /* state file */ -} sunos_ep_priv_t; - -typedef struct sunos_device_handle_priv { - uint8_t altsetting[USB_MAXINTERFACES]; /* a interface's alt */ - uint8_t config_index; - sunos_ep_priv_t eps[USB_MAXENDPOINTS]; - sunos_dev_priv_t *dpriv; /* device private */ -} sunos_dev_handle_priv_t; - -typedef struct sunos_transfer_priv { - struct aiocb aiocb; - struct libusb_transfer *transfer; -} sunos_xfer_priv_t; - -struct node_args { - struct libusb_context *ctx; - struct discovered_devs **discdevs; - const char *last_ugenpath; - di_devlink_handle_t dlink_hdl; -}; - -struct devlink_cbarg { - struct node_args *nargs; /* di node walk arguments */ - di_node_t myself; /* the di node */ - di_minor_t minor; -}; - -/* AIO callback args */ -struct aio_callback_args{ - struct libusb_transfer *transfer; - struct aiocb aiocb; -}; - -#endif /* LIBUSB_SUNOS_H */ diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_posix.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_posix.c deleted file mode 100644 index a4f270bbe5bd..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_posix.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * libusb synchronization using POSIX Threads - * - * Copyright © 2011 Vitali Lovich - * Copyright © 2011 Peter Stuge - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#if defined(__linux__) || defined(__OpenBSD__) -# if defined(__OpenBSD__) -# define _BSD_SOURCE -# endif -# include -# include -#elif defined(__APPLE__) -# include -#elif defined(__CYGWIN__) -# include -#endif - -#include "threads_posix.h" -#include "libusbi.h" - -int usbi_cond_timedwait(pthread_cond_t *cond, - pthread_mutex_t *mutex, const struct timeval *tv) -{ - struct timespec timeout; - int r; - - r = usbi_backend->clock_gettime(USBI_CLOCK_REALTIME, &timeout); - if (r < 0) - return r; - - timeout.tv_sec += tv->tv_sec; - timeout.tv_nsec += tv->tv_usec * 1000; - while (timeout.tv_nsec >= 1000000000L) { - timeout.tv_nsec -= 1000000000L; - timeout.tv_sec++; - } - - return pthread_cond_timedwait(cond, mutex, &timeout); -} - -int usbi_get_tid(void) -{ - int ret = -1; -#if defined(__ANDROID__) - ret = gettid(); -#elif defined(__linux__) - ret = syscall(SYS_gettid); -#elif defined(__OpenBSD__) - /* The following only works with OpenBSD > 5.1 as it requires - real thread support. For 5.1 and earlier, -1 is returned. */ - ret = syscall(SYS_getthrid); -#elif defined(__APPLE__) - ret = mach_thread_self(); - mach_port_deallocate(mach_task_self(), ret); -#elif defined(__CYGWIN__) - ret = GetCurrentThreadId(); -#endif -/* TODO: NetBSD thread ID support */ - return ret; -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_posix.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_posix.h deleted file mode 100644 index 4c1514ea612c..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_posix.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * libusb synchronization using POSIX Threads - * - * Copyright © 2010 Peter Stuge - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef LIBUSB_THREADS_POSIX_H -#define LIBUSB_THREADS_POSIX_H - -#include -#ifdef HAVE_SYS_TIME_H -#include -#endif - -#define usbi_mutex_static_t pthread_mutex_t -#define USBI_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER -#define usbi_mutex_static_lock pthread_mutex_lock -#define usbi_mutex_static_unlock pthread_mutex_unlock - -#define usbi_mutex_t pthread_mutex_t -#define usbi_mutex_init(mutex) pthread_mutex_init((mutex), NULL) -#define usbi_mutex_lock pthread_mutex_lock -#define usbi_mutex_unlock pthread_mutex_unlock -#define usbi_mutex_trylock pthread_mutex_trylock -#define usbi_mutex_destroy pthread_mutex_destroy - -#define usbi_cond_t pthread_cond_t -#define usbi_cond_init(cond) pthread_cond_init((cond), NULL) -#define usbi_cond_wait pthread_cond_wait -#define usbi_cond_broadcast pthread_cond_broadcast -#define usbi_cond_destroy pthread_cond_destroy - -#define usbi_tls_key_t pthread_key_t -#define usbi_tls_key_create(key) pthread_key_create((key), NULL) -#define usbi_tls_key_get pthread_getspecific -#define usbi_tls_key_set pthread_setspecific -#define usbi_tls_key_delete pthread_key_delete - -int usbi_get_tid(void); - -#endif /* LIBUSB_THREADS_POSIX_H */ diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_windows.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_windows.c deleted file mode 100644 index 7c2e52dba6a2..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_windows.c +++ /dev/null @@ -1,259 +0,0 @@ -/* - * libusb synchronization on Microsoft Windows - * - * Copyright © 2010 Michael Plante - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include - -#include "libusbi.h" - -struct usbi_cond_perthread { - struct list_head list; - DWORD tid; - HANDLE event; -}; - -int usbi_mutex_static_lock(usbi_mutex_static_t *mutex) -{ - if (!mutex) - return EINVAL; - while (InterlockedExchange(mutex, 1) == 1) - SleepEx(0, TRUE); - return 0; -} - -int usbi_mutex_static_unlock(usbi_mutex_static_t *mutex) -{ - if (!mutex) - return EINVAL; - InterlockedExchange(mutex, 0); - return 0; -} - -int usbi_mutex_init(usbi_mutex_t *mutex) -{ - if (!mutex) - return EINVAL; - *mutex = CreateMutex(NULL, FALSE, NULL); - if (!*mutex) - return ENOMEM; - return 0; -} - -int usbi_mutex_lock(usbi_mutex_t *mutex) -{ - DWORD result; - - if (!mutex) - return EINVAL; - result = WaitForSingleObject(*mutex, INFINITE); - if (result == WAIT_OBJECT_0 || result == WAIT_ABANDONED) - return 0; // acquired (ToDo: check that abandoned is ok) - else - return EINVAL; // don't know how this would happen - // so don't know proper errno -} - -int usbi_mutex_unlock(usbi_mutex_t *mutex) -{ - if (!mutex) - return EINVAL; - if (ReleaseMutex(*mutex)) - return 0; - else - return EPERM; -} - -int usbi_mutex_trylock(usbi_mutex_t *mutex) -{ - DWORD result; - - if (!mutex) - return EINVAL; - result = WaitForSingleObject(*mutex, 0); - if (result == WAIT_OBJECT_0 || result == WAIT_ABANDONED) - return 0; // acquired (ToDo: check that abandoned is ok) - else if (result == WAIT_TIMEOUT) - return EBUSY; - else - return EINVAL; // don't know how this would happen - // so don't know proper error -} - -int usbi_mutex_destroy(usbi_mutex_t *mutex) -{ - // It is not clear if CloseHandle failure is due to failure to unlock. - // If so, this should be errno=EBUSY. - if (!mutex || !CloseHandle(*mutex)) - return EINVAL; - *mutex = NULL; - return 0; -} - -int usbi_cond_init(usbi_cond_t *cond) -{ - if (!cond) - return EINVAL; - list_init(&cond->waiters); - list_init(&cond->not_waiting); - return 0; -} - -int usbi_cond_destroy(usbi_cond_t *cond) -{ - // This assumes no one is using this anymore. The check MAY NOT BE safe. - struct usbi_cond_perthread *pos, *next_pos; - - if(!cond) - return EINVAL; - if (!list_empty(&cond->waiters)) - return EBUSY; // (!see above!) - list_for_each_entry_safe(pos, next_pos, &cond->not_waiting, list, struct usbi_cond_perthread) { - CloseHandle(pos->event); - list_del(&pos->list); - free(pos); - } - return 0; -} - -int usbi_cond_broadcast(usbi_cond_t *cond) -{ - // Assumes mutex is locked; this is not in keeping with POSIX spec, but - // libusb does this anyway, so we simplify by not adding more sync - // primitives to the CV definition! - int fail = 0; - struct usbi_cond_perthread *pos; - - if (!cond) - return EINVAL; - list_for_each_entry(pos, &cond->waiters, list, struct usbi_cond_perthread) { - if (!SetEvent(pos->event)) - fail = 1; - } - // The wait function will remove its respective item from the list. - return fail ? EINVAL : 0; -} - -__inline static int usbi_cond_intwait(usbi_cond_t *cond, - usbi_mutex_t *mutex, DWORD timeout_ms) -{ - struct usbi_cond_perthread *pos; - int r, found = 0; - DWORD r2, tid = GetCurrentThreadId(); - - if (!cond || !mutex) - return EINVAL; - list_for_each_entry(pos, &cond->not_waiting, list, struct usbi_cond_perthread) { - if(tid == pos->tid) { - found = 1; - break; - } - } - - if (!found) { - pos = calloc(1, sizeof(struct usbi_cond_perthread)); - if (!pos) - return ENOMEM; // This errno is not POSIX-allowed. - pos->tid = tid; - pos->event = CreateEvent(NULL, FALSE, FALSE, NULL); // auto-reset. - if (!pos->event) { - free(pos); - return ENOMEM; - } - list_add(&pos->list, &cond->not_waiting); - } - - list_del(&pos->list); // remove from not_waiting list. - list_add(&pos->list, &cond->waiters); - - r = usbi_mutex_unlock(mutex); - if (r) - return r; - - r2 = WaitForSingleObject(pos->event, timeout_ms); - r = usbi_mutex_lock(mutex); - if (r) - return r; - - list_del(&pos->list); - list_add(&pos->list, &cond->not_waiting); - - if (r2 == WAIT_OBJECT_0) - return 0; - else if (r2 == WAIT_TIMEOUT) - return ETIMEDOUT; - else - return EINVAL; -} -// N.B.: usbi_cond_*wait() can also return ENOMEM, even though pthread_cond_*wait cannot! -int usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex) -{ - return usbi_cond_intwait(cond, mutex, INFINITE); -} - -int usbi_cond_timedwait(usbi_cond_t *cond, - usbi_mutex_t *mutex, const struct timeval *tv) -{ - DWORD millis; - - millis = (DWORD)(tv->tv_sec * 1000) + (tv->tv_usec / 1000); - /* round up to next millisecond */ - if (tv->tv_usec % 1000) - millis++; - return usbi_cond_intwait(cond, mutex, millis); -} - -int usbi_tls_key_create(usbi_tls_key_t *key) -{ - if (!key) - return EINVAL; - *key = TlsAlloc(); - if (*key == TLS_OUT_OF_INDEXES) - return ENOMEM; - else - return 0; -} - -void *usbi_tls_key_get(usbi_tls_key_t key) -{ - return TlsGetValue(key); -} - -int usbi_tls_key_set(usbi_tls_key_t key, void *value) -{ - if (TlsSetValue(key, value)) - return 0; - else - return EINVAL; -} - -int usbi_tls_key_delete(usbi_tls_key_t key) -{ - if (TlsFree(key)) - return 0; - else - return EINVAL; -} - -int usbi_get_tid(void) -{ - return (int)GetCurrentThreadId(); -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_windows.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_windows.h deleted file mode 100644 index e97ee787572d..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/threads_windows.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * libusb synchronization on Microsoft Windows - * - * Copyright © 2010 Michael Plante - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef LIBUSB_THREADS_WINDOWS_H -#define LIBUSB_THREADS_WINDOWS_H - -#define usbi_mutex_static_t volatile LONG -#define USBI_MUTEX_INITIALIZER 0 - -#define usbi_mutex_t HANDLE - -typedef struct usbi_cond { - // Every time a thread touches the CV, it winds up in one of these lists. - // It stays there until the CV is destroyed, even if the thread terminates. - struct list_head waiters; - struct list_head not_waiting; -} usbi_cond_t; - -// We *were* getting timespec from pthread.h: -#if (!defined(HAVE_STRUCT_TIMESPEC) && !defined(_TIMESPEC_DEFINED)) -#define HAVE_STRUCT_TIMESPEC 1 -#define _TIMESPEC_DEFINED 1 -struct timespec { - long tv_sec; - long tv_nsec; -}; -#endif /* HAVE_STRUCT_TIMESPEC | _TIMESPEC_DEFINED */ - -// We *were* getting ETIMEDOUT from pthread.h: -#ifndef ETIMEDOUT -# define ETIMEDOUT 10060 /* This is the value in winsock.h. */ -#endif - -#define usbi_tls_key_t DWORD - -int usbi_mutex_static_lock(usbi_mutex_static_t *mutex); -int usbi_mutex_static_unlock(usbi_mutex_static_t *mutex); - -int usbi_mutex_init(usbi_mutex_t *mutex); -int usbi_mutex_lock(usbi_mutex_t *mutex); -int usbi_mutex_unlock(usbi_mutex_t *mutex); -int usbi_mutex_trylock(usbi_mutex_t *mutex); -int usbi_mutex_destroy(usbi_mutex_t *mutex); - -int usbi_cond_init(usbi_cond_t *cond); -int usbi_cond_wait(usbi_cond_t *cond, usbi_mutex_t *mutex); -int usbi_cond_timedwait(usbi_cond_t *cond, - usbi_mutex_t *mutex, const struct timeval *tv); -int usbi_cond_broadcast(usbi_cond_t *cond); -int usbi_cond_destroy(usbi_cond_t *cond); - -int usbi_tls_key_create(usbi_tls_key_t *key); -void *usbi_tls_key_get(usbi_tls_key_t key); -int usbi_tls_key_set(usbi_tls_key_t key, void *value); -int usbi_tls_key_delete(usbi_tls_key_t key); - -int usbi_get_tid(void); - -#endif /* LIBUSB_THREADS_WINDOWS_H */ diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/wince_usb.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/wince_usb.c deleted file mode 100644 index 0d466b8c9c9a..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/wince_usb.c +++ /dev/null @@ -1,899 +0,0 @@ -/* - * Windows CE backend for libusb 1.0 - * Copyright © 2011-2013 RealVNC Ltd. - * Large portions taken from Windows backend, which is - * Copyright © 2009-2010 Pete Batard - * With contributions from Michael Plante, Orin Eman et al. - * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer - * Major code testing contribution by Xiaofan Chen - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include - -#include "libusbi.h" -#include "wince_usb.h" - -// Global variables -int windows_version = WINDOWS_CE; -static uint64_t hires_frequency, hires_ticks_to_ps; -static HANDLE driver_handle = INVALID_HANDLE_VALUE; -static int concurrent_usage = -1; - -/* - * Converts a windows error to human readable string - * uses retval as errorcode, or, if 0, use GetLastError() - */ -#if defined(ENABLE_LOGGING) -static const char *windows_error_str(DWORD error_code) -{ - static TCHAR wErr_string[ERR_BUFFER_SIZE]; - static char err_string[ERR_BUFFER_SIZE]; - - DWORD size; - int len; - - if (error_code == 0) - error_code = GetLastError(); - - len = sprintf(err_string, "[%u] ", (unsigned int)error_code); - - size = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - wErr_string, ERR_BUFFER_SIZE, NULL); - if (size == 0) { - DWORD format_error = GetLastError(); - if (format_error) - snprintf(err_string, ERR_BUFFER_SIZE, - "Windows error code %u (FormatMessage error code %u)", - (unsigned int)error_code, (unsigned int)format_error); - else - snprintf(err_string, ERR_BUFFER_SIZE, "Unknown error code %u", (unsigned int)error_code); - } else { - // Remove CR/LF terminators, if present - size_t pos = size - 2; - if (wErr_string[pos] == 0x0D) - wErr_string[pos] = 0; - - if (!WideCharToMultiByte(CP_ACP, 0, wErr_string, -1, &err_string[len], ERR_BUFFER_SIZE - len, NULL, NULL)) - strcpy(err_string, "Unable to convert error string"); - } - - return err_string; -} -#endif - -static struct wince_device_priv *_device_priv(struct libusb_device *dev) -{ - return (struct wince_device_priv *)dev->os_priv; -} - -// ceusbkwrapper to libusb error code mapping -static int translate_driver_error(DWORD error) -{ - switch (error) { - case ERROR_INVALID_PARAMETER: - return LIBUSB_ERROR_INVALID_PARAM; - case ERROR_CALL_NOT_IMPLEMENTED: - case ERROR_NOT_SUPPORTED: - return LIBUSB_ERROR_NOT_SUPPORTED; - case ERROR_NOT_ENOUGH_MEMORY: - return LIBUSB_ERROR_NO_MEM; - case ERROR_INVALID_HANDLE: - return LIBUSB_ERROR_NO_DEVICE; - case ERROR_BUSY: - return LIBUSB_ERROR_BUSY; - - // Error codes that are either unexpected, or have - // no suitable LIBUSB_ERROR equivalent. - case ERROR_CANCELLED: - case ERROR_INTERNAL_ERROR: - default: - return LIBUSB_ERROR_OTHER; - } -} - -static int init_dllimports(void) -{ - DLL_GET_HANDLE(ceusbkwrapper); - DLL_LOAD_FUNC(ceusbkwrapper, UkwOpenDriver, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwGetDeviceList, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwReleaseDeviceList, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwGetDeviceAddress, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwGetDeviceDescriptor, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwGetConfigDescriptor, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwCloseDriver, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwCancelTransfer, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwIssueControlTransfer, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwClaimInterface, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwReleaseInterface, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwSetInterfaceAlternateSetting, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwClearHaltHost, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwClearHaltDevice, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwGetConfig, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwSetConfig, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwResetDevice, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwKernelDriverActive, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwAttachKernelDriver, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwDetachKernelDriver, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwIssueBulkTransfer, TRUE); - DLL_LOAD_FUNC(ceusbkwrapper, UkwIsPipeHalted, TRUE); - - return LIBUSB_SUCCESS; -} - -static void exit_dllimports(void) -{ - DLL_FREE_HANDLE(ceusbkwrapper); -} - -static int init_device( - struct libusb_device *dev, UKW_DEVICE drv_dev, - unsigned char bus_addr, unsigned char dev_addr) -{ - struct wince_device_priv *priv = _device_priv(dev); - int r = LIBUSB_SUCCESS; - - dev->bus_number = bus_addr; - dev->device_address = dev_addr; - priv->dev = drv_dev; - - if (!UkwGetDeviceDescriptor(priv->dev, &(priv->desc))) - r = translate_driver_error(GetLastError()); - - return r; -} - -// Internal API functions -static int wince_init(struct libusb_context *ctx) -{ - int r = LIBUSB_ERROR_OTHER; - HANDLE semaphore; - LARGE_INTEGER li_frequency; - TCHAR sem_name[11 + 8 + 1]; // strlen("libusb_init") + (32-bit hex PID) + '\0' - - _stprintf(sem_name, _T("libusb_init%08X"), (unsigned int)(GetCurrentProcessId() & 0xFFFFFFFF)); - semaphore = CreateSemaphore(NULL, 1, 1, sem_name); - if (semaphore == NULL) { - usbi_err(ctx, "could not create semaphore: %s", windows_error_str(0)); - return LIBUSB_ERROR_NO_MEM; - } - - // A successful wait brings our semaphore count to 0 (unsignaled) - // => any concurent wait stalls until the semaphore's release - if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { - usbi_err(ctx, "failure to access semaphore: %s", windows_error_str(0)); - CloseHandle(semaphore); - return LIBUSB_ERROR_NO_MEM; - } - - // NB: concurrent usage supposes that init calls are equally balanced with - // exit calls. If init is called more than exit, we will not exit properly - if ( ++concurrent_usage == 0 ) { // First init? - // Initialize pollable file descriptors - init_polling(); - - // Load DLL imports - if (init_dllimports() != LIBUSB_SUCCESS) { - usbi_err(ctx, "could not resolve DLL functions"); - r = LIBUSB_ERROR_NOT_SUPPORTED; - goto init_exit; - } - - // try to open a handle to the driver - driver_handle = UkwOpenDriver(); - if (driver_handle == INVALID_HANDLE_VALUE) { - usbi_err(ctx, "could not connect to driver"); - r = LIBUSB_ERROR_NOT_SUPPORTED; - goto init_exit; - } - - // find out if we have access to a monotonic (hires) timer - if (QueryPerformanceFrequency(&li_frequency)) { - hires_frequency = li_frequency.QuadPart; - // The hires frequency can go as high as 4 GHz, so we'll use a conversion - // to picoseconds to compute the tv_nsecs part in clock_gettime - hires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency; - usbi_dbg("hires timer available (Frequency: %"PRIu64" Hz)", hires_frequency); - } else { - usbi_dbg("no hires timer available on this platform"); - hires_frequency = 0; - hires_ticks_to_ps = UINT64_C(0); - } - } - // At this stage, either we went through full init successfully, or didn't need to - r = LIBUSB_SUCCESS; - -init_exit: // Holds semaphore here. - if (!concurrent_usage && r != LIBUSB_SUCCESS) { // First init failed? - exit_dllimports(); - exit_polling(); - - if (driver_handle != INVALID_HANDLE_VALUE) { - UkwCloseDriver(driver_handle); - driver_handle = INVALID_HANDLE_VALUE; - } - } - - if (r != LIBUSB_SUCCESS) - --concurrent_usage; // Not expected to call libusb_exit if we failed. - - ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 - CloseHandle(semaphore); - return r; -} - -static void wince_exit(void) -{ - HANDLE semaphore; - TCHAR sem_name[11 + 8 + 1]; // strlen("libusb_init") + (32-bit hex PID) + '\0' - - _stprintf(sem_name, _T("libusb_init%08X"), (unsigned int)(GetCurrentProcessId() & 0xFFFFFFFF)); - semaphore = CreateSemaphore(NULL, 1, 1, sem_name); - if (semaphore == NULL) - return; - - // A successful wait brings our semaphore count to 0 (unsignaled) - // => any concurent wait stalls until the semaphore release - if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { - CloseHandle(semaphore); - return; - } - - // Only works if exits and inits are balanced exactly - if (--concurrent_usage < 0) { // Last exit - exit_dllimports(); - exit_polling(); - - if (driver_handle != INVALID_HANDLE_VALUE) { - UkwCloseDriver(driver_handle); - driver_handle = INVALID_HANDLE_VALUE; - } - } - - ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 - CloseHandle(semaphore); -} - -static int wince_get_device_list( - struct libusb_context *ctx, - struct discovered_devs **discdevs) -{ - UKW_DEVICE devices[MAX_DEVICE_COUNT]; - struct discovered_devs *new_devices = *discdevs; - DWORD count = 0, i; - struct libusb_device *dev = NULL; - unsigned char bus_addr, dev_addr; - unsigned long session_id; - BOOL success; - DWORD release_list_offset = 0; - int r = LIBUSB_SUCCESS; - - success = UkwGetDeviceList(driver_handle, devices, MAX_DEVICE_COUNT, &count); - if (!success) { - int libusbErr = translate_driver_error(GetLastError()); - usbi_err(ctx, "could not get devices: %s", windows_error_str(0)); - return libusbErr; - } - - for (i = 0; i < count; ++i) { - release_list_offset = i; - success = UkwGetDeviceAddress(devices[i], &bus_addr, &dev_addr, &session_id); - if (!success) { - r = translate_driver_error(GetLastError()); - usbi_err(ctx, "could not get device address for %u: %s", (unsigned int)i, windows_error_str(0)); - goto err_out; - } - - dev = usbi_get_device_by_session_id(ctx, session_id); - if (dev) { - usbi_dbg("using existing device for %u/%u (session %lu)", - bus_addr, dev_addr, session_id); - // Release just this element in the device list (as we already hold a - // reference to it). - UkwReleaseDeviceList(driver_handle, &devices[i], 1); - release_list_offset++; - } else { - usbi_dbg("allocating new device for %u/%u (session %lu)", - bus_addr, dev_addr, session_id); - dev = usbi_alloc_device(ctx, session_id); - if (!dev) { - r = LIBUSB_ERROR_NO_MEM; - goto err_out; - } - - r = init_device(dev, devices[i], bus_addr, dev_addr); - if (r < 0) - goto err_out; - - r = usbi_sanitize_device(dev); - if (r < 0) - goto err_out; - } - - new_devices = discovered_devs_append(new_devices, dev); - if (!discdevs) { - r = LIBUSB_ERROR_NO_MEM; - goto err_out; - } - - libusb_unref_device(dev); - } - - *discdevs = new_devices; - return r; -err_out: - *discdevs = new_devices; - libusb_unref_device(dev); - // Release the remainder of the unprocessed device list. - // The devices added to new_devices already will still be passed up to libusb, - // which can dispose of them at its leisure. - UkwReleaseDeviceList(driver_handle, &devices[release_list_offset], count - release_list_offset); - return r; -} - -static int wince_open(struct libusb_device_handle *handle) -{ - // Nothing to do to open devices as a handle to it has - // been retrieved by wince_get_device_list - return LIBUSB_SUCCESS; -} - -static void wince_close(struct libusb_device_handle *handle) -{ - // Nothing to do as wince_open does nothing. -} - -static int wince_get_device_descriptor( - struct libusb_device *device, - unsigned char *buffer, int *host_endian) -{ - struct wince_device_priv *priv = _device_priv(device); - - *host_endian = 1; - memcpy(buffer, &priv->desc, DEVICE_DESC_LENGTH); - return LIBUSB_SUCCESS; -} - -static int wince_get_active_config_descriptor( - struct libusb_device *device, - unsigned char *buffer, size_t len, int *host_endian) -{ - struct wince_device_priv *priv = _device_priv(device); - DWORD actualSize = len; - - *host_endian = 0; - if (!UkwGetConfigDescriptor(priv->dev, UKW_ACTIVE_CONFIGURATION, buffer, len, &actualSize)) - return translate_driver_error(GetLastError()); - - return actualSize; -} - -static int wince_get_config_descriptor( - struct libusb_device *device, - uint8_t config_index, - unsigned char *buffer, size_t len, int *host_endian) -{ - struct wince_device_priv *priv = _device_priv(device); - DWORD actualSize = len; - - *host_endian = 0; - if (!UkwGetConfigDescriptor(priv->dev, config_index, buffer, len, &actualSize)) - return translate_driver_error(GetLastError()); - - return actualSize; -} - -static int wince_get_configuration( - struct libusb_device_handle *handle, - int *config) -{ - struct wince_device_priv *priv = _device_priv(handle->dev); - UCHAR cv = 0; - - if (!UkwGetConfig(priv->dev, &cv)) - return translate_driver_error(GetLastError()); - - (*config) = cv; - return LIBUSB_SUCCESS; -} - -static int wince_set_configuration( - struct libusb_device_handle *handle, - int config) -{ - struct wince_device_priv *priv = _device_priv(handle->dev); - // Setting configuration 0 places the device in Address state. - // This should correspond to the "unconfigured state" required by - // libusb when the specified configuration is -1. - UCHAR cv = (config < 0) ? 0 : config; - if (!UkwSetConfig(priv->dev, cv)) - return translate_driver_error(GetLastError()); - - return LIBUSB_SUCCESS; -} - -static int wince_claim_interface( - struct libusb_device_handle *handle, - int interface_number) -{ - struct wince_device_priv *priv = _device_priv(handle->dev); - - if (!UkwClaimInterface(priv->dev, interface_number)) - return translate_driver_error(GetLastError()); - - return LIBUSB_SUCCESS; -} - -static int wince_release_interface( - struct libusb_device_handle *handle, - int interface_number) -{ - struct wince_device_priv *priv = _device_priv(handle->dev); - - if (!UkwSetInterfaceAlternateSetting(priv->dev, interface_number, 0)) - return translate_driver_error(GetLastError()); - - if (!UkwReleaseInterface(priv->dev, interface_number)) - return translate_driver_error(GetLastError()); - - return LIBUSB_SUCCESS; -} - -static int wince_set_interface_altsetting( - struct libusb_device_handle *handle, - int interface_number, int altsetting) -{ - struct wince_device_priv *priv = _device_priv(handle->dev); - - if (!UkwSetInterfaceAlternateSetting(priv->dev, interface_number, altsetting)) - return translate_driver_error(GetLastError()); - - return LIBUSB_SUCCESS; -} - -static int wince_clear_halt( - struct libusb_device_handle *handle, - unsigned char endpoint) -{ - struct wince_device_priv *priv = _device_priv(handle->dev); - - if (!UkwClearHaltHost(priv->dev, endpoint)) - return translate_driver_error(GetLastError()); - - if (!UkwClearHaltDevice(priv->dev, endpoint)) - return translate_driver_error(GetLastError()); - - return LIBUSB_SUCCESS; -} - -static int wince_reset_device( - struct libusb_device_handle *handle) -{ - struct wince_device_priv *priv = _device_priv(handle->dev); - - if (!UkwResetDevice(priv->dev)) - return translate_driver_error(GetLastError()); - - return LIBUSB_SUCCESS; -} - -static int wince_kernel_driver_active( - struct libusb_device_handle *handle, - int interface_number) -{ - struct wince_device_priv *priv = _device_priv(handle->dev); - BOOL result = FALSE; - - if (!UkwKernelDriverActive(priv->dev, interface_number, &result)) - return translate_driver_error(GetLastError()); - - return result ? 1 : 0; -} - -static int wince_detach_kernel_driver( - struct libusb_device_handle *handle, - int interface_number) -{ - struct wince_device_priv *priv = _device_priv(handle->dev); - - if (!UkwDetachKernelDriver(priv->dev, interface_number)) - return translate_driver_error(GetLastError()); - - return LIBUSB_SUCCESS; -} - -static int wince_attach_kernel_driver( - struct libusb_device_handle *handle, - int interface_number) -{ - struct wince_device_priv *priv = _device_priv(handle->dev); - - if (!UkwAttachKernelDriver(priv->dev, interface_number)) - return translate_driver_error(GetLastError()); - - return LIBUSB_SUCCESS; -} - -static void wince_destroy_device(struct libusb_device *dev) -{ - struct wince_device_priv *priv = _device_priv(dev); - - UkwReleaseDeviceList(driver_handle, &priv->dev, 1); -} - -static void wince_clear_transfer_priv(struct usbi_transfer *itransfer) -{ - struct wince_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct winfd wfd = fd_to_winfd(transfer_priv->pollable_fd.fd); - - // No need to cancel transfer as it is either complete or abandoned - wfd.itransfer = NULL; - CloseHandle(wfd.handle); - usbi_free_fd(&transfer_priv->pollable_fd); -} - -static int wince_cancel_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct wince_device_priv *priv = _device_priv(transfer->dev_handle->dev); - struct wince_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - - if (!UkwCancelTransfer(priv->dev, transfer_priv->pollable_fd.overlapped, UKW_TF_NO_WAIT)) - return translate_driver_error(GetLastError()); - - return LIBUSB_SUCCESS; -} - -static int wince_submit_control_or_bulk_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct wince_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct wince_device_priv *priv = _device_priv(transfer->dev_handle->dev); - BOOL direction_in, ret; - struct winfd wfd; - DWORD flags; - HANDLE eventHandle; - PUKW_CONTROL_HEADER setup = NULL; - const BOOL control_transfer = transfer->type == LIBUSB_TRANSFER_TYPE_CONTROL; - - transfer_priv->pollable_fd = INVALID_WINFD; - if (control_transfer) { - setup = (PUKW_CONTROL_HEADER) transfer->buffer; - direction_in = setup->bmRequestType & LIBUSB_ENDPOINT_IN; - } else { - direction_in = transfer->endpoint & LIBUSB_ENDPOINT_IN; - } - flags = direction_in ? UKW_TF_IN_TRANSFER : UKW_TF_OUT_TRANSFER; - flags |= UKW_TF_SHORT_TRANSFER_OK; - - eventHandle = CreateEvent(NULL, FALSE, FALSE, NULL); - if (eventHandle == NULL) { - usbi_err(ctx, "Failed to create event for async transfer"); - return LIBUSB_ERROR_NO_MEM; - } - - wfd = usbi_create_fd(eventHandle, direction_in ? RW_READ : RW_WRITE, itransfer, &wince_cancel_transfer); - if (wfd.fd < 0) { - CloseHandle(eventHandle); - return LIBUSB_ERROR_NO_MEM; - } - - transfer_priv->pollable_fd = wfd; - if (control_transfer) { - // Split out control setup header and data buffer - DWORD bufLen = transfer->length - sizeof(UKW_CONTROL_HEADER); - PVOID buf = (PVOID) &transfer->buffer[sizeof(UKW_CONTROL_HEADER)]; - - ret = UkwIssueControlTransfer(priv->dev, flags, setup, buf, bufLen, &transfer->actual_length, wfd.overlapped); - } else { - ret = UkwIssueBulkTransfer(priv->dev, flags, transfer->endpoint, transfer->buffer, - transfer->length, &transfer->actual_length, wfd.overlapped); - } - - if (!ret) { - int libusbErr = translate_driver_error(GetLastError()); - usbi_err(ctx, "UkwIssue%sTransfer failed: error %u", - control_transfer ? "Control" : "Bulk", (unsigned int)GetLastError()); - wince_clear_transfer_priv(itransfer); - return libusbErr; - } - usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, direction_in ? POLLIN : POLLOUT); - - return LIBUSB_SUCCESS; -} - -static int wince_submit_iso_transfer(struct usbi_transfer *itransfer) -{ - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static int wince_submit_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - return wince_submit_control_or_bulk_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - return wince_submit_iso_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - return LIBUSB_ERROR_NOT_SUPPORTED; - default: - usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -static void wince_transfer_callback( - struct usbi_transfer *itransfer, - uint32_t io_result, uint32_t io_size) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct wince_transfer_priv *transfer_priv = (struct wince_transfer_priv*)usbi_transfer_get_os_priv(itransfer); - struct wince_device_priv *priv = _device_priv(transfer->dev_handle->dev); - int status; - - usbi_dbg("handling I/O completion with errcode %u", io_result); - - if (io_result == ERROR_NOT_SUPPORTED && - transfer->type != LIBUSB_TRANSFER_TYPE_CONTROL) { - /* For functional stalls, the WinCE USB layer (and therefore the USB Kernel Wrapper - * Driver) will report USB_ERROR_STALL/ERROR_NOT_SUPPORTED in situations where the - * endpoint isn't actually stalled. - * - * One example of this is that some devices will occasionally fail to reply to an IN - * token. The WinCE USB layer carries on with the transaction until it is completed - * (or cancelled) but then completes it with USB_ERROR_STALL. - * - * This code therefore needs to confirm that there really is a stall error, by both - * checking the pipe status and requesting the endpoint status from the device. - */ - BOOL halted = FALSE; - usbi_dbg("checking I/O completion with errcode ERROR_NOT_SUPPORTED is really a stall"); - if (UkwIsPipeHalted(priv->dev, transfer->endpoint, &halted)) { - /* Pipe status retrieved, so now request endpoint status by sending a GET_STATUS - * control request to the device. This is done synchronously, which is a bit - * naughty, but this is a special corner case. - */ - WORD wStatus = 0; - DWORD written = 0; - UKW_CONTROL_HEADER ctrlHeader; - ctrlHeader.bmRequestType = LIBUSB_REQUEST_TYPE_STANDARD | - LIBUSB_ENDPOINT_IN | LIBUSB_RECIPIENT_ENDPOINT; - ctrlHeader.bRequest = LIBUSB_REQUEST_GET_STATUS; - ctrlHeader.wValue = 0; - ctrlHeader.wIndex = transfer->endpoint; - ctrlHeader.wLength = sizeof(wStatus); - if (UkwIssueControlTransfer(priv->dev, - UKW_TF_IN_TRANSFER | UKW_TF_SEND_TO_ENDPOINT, - &ctrlHeader, &wStatus, sizeof(wStatus), &written, NULL)) { - if (written == sizeof(wStatus) && - (wStatus & STATUS_HALT_FLAG) == 0) { - if (!halted || UkwClearHaltHost(priv->dev, transfer->endpoint)) { - usbi_dbg("Endpoint doesn't appear to be stalled, overriding error with success"); - io_result = ERROR_SUCCESS; - } else { - usbi_dbg("Endpoint doesn't appear to be stalled, but the host is halted, changing error"); - io_result = ERROR_IO_DEVICE; - } - } - } - } - } - - switch(io_result) { - case ERROR_SUCCESS: - itransfer->transferred += io_size; - status = LIBUSB_TRANSFER_COMPLETED; - break; - case ERROR_CANCELLED: - usbi_dbg("detected transfer cancel"); - status = LIBUSB_TRANSFER_CANCELLED; - break; - case ERROR_NOT_SUPPORTED: - case ERROR_GEN_FAILURE: - usbi_dbg("detected endpoint stall"); - status = LIBUSB_TRANSFER_STALL; - break; - case ERROR_SEM_TIMEOUT: - usbi_dbg("detected semaphore timeout"); - status = LIBUSB_TRANSFER_TIMED_OUT; - break; - case ERROR_OPERATION_ABORTED: - usbi_dbg("detected operation aborted"); - status = LIBUSB_TRANSFER_CANCELLED; - break; - default: - usbi_err(ITRANSFER_CTX(itransfer), "detected I/O error: %s", windows_error_str(io_result)); - status = LIBUSB_TRANSFER_ERROR; - break; - } - - wince_clear_transfer_priv(itransfer); - if (status == LIBUSB_TRANSFER_CANCELLED) - usbi_handle_transfer_cancellation(itransfer); - else - usbi_handle_transfer_completion(itransfer, (enum libusb_transfer_status)status); -} - -static void wince_handle_callback( - struct usbi_transfer *itransfer, - uint32_t io_result, uint32_t io_size) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - wince_transfer_callback (itransfer, io_result, io_size); - break; - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - break; - default: - usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); - } -} - -static int wince_handle_events( - struct libusb_context *ctx, - struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) -{ - struct wince_transfer_priv* transfer_priv = NULL; - POLL_NFDS_TYPE i = 0; - BOOL found = FALSE; - struct usbi_transfer *transfer; - DWORD io_size, io_result; - int r = LIBUSB_SUCCESS; - - usbi_mutex_lock(&ctx->open_devs_lock); - for (i = 0; i < nfds && num_ready > 0; i++) { - - usbi_dbg("checking fd %d with revents = %04x", fds[i].fd, fds[i].revents); - - if (!fds[i].revents) - continue; - - num_ready--; - - // Because a Windows OVERLAPPED is used for poll emulation, - // a pollable fd is created and stored with each transfer - usbi_mutex_lock(&ctx->flying_transfers_lock); - list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { - transfer_priv = usbi_transfer_get_os_priv(transfer); - if (transfer_priv->pollable_fd.fd == fds[i].fd) { - found = TRUE; - break; - } - } - usbi_mutex_unlock(&ctx->flying_transfers_lock); - - if (found && HasOverlappedIoCompleted(transfer_priv->pollable_fd.overlapped)) { - io_result = (DWORD)transfer_priv->pollable_fd.overlapped->Internal; - io_size = (DWORD)transfer_priv->pollable_fd.overlapped->InternalHigh; - usbi_remove_pollfd(ctx, transfer_priv->pollable_fd.fd); - // let handle_callback free the event using the transfer wfd - // If you don't use the transfer wfd, you run a risk of trying to free a - // newly allocated wfd that took the place of the one from the transfer. - wince_handle_callback(transfer, io_result, io_size); - } else if (found) { - usbi_err(ctx, "matching transfer for fd %d has not completed", fds[i]); - r = LIBUSB_ERROR_OTHER; - break; - } else { - usbi_err(ctx, "could not find a matching transfer for fd %d", fds[i]); - r = LIBUSB_ERROR_NOT_FOUND; - break; - } - } - usbi_mutex_unlock(&ctx->open_devs_lock); - - return r; -} - -/* - * Monotonic and real time functions - */ -static int wince_clock_gettime(int clk_id, struct timespec *tp) -{ - LARGE_INTEGER hires_counter; - ULARGE_INTEGER rtime; - FILETIME filetime; - SYSTEMTIME st; - - switch(clk_id) { - case USBI_CLOCK_MONOTONIC: - if (hires_frequency != 0 && QueryPerformanceCounter(&hires_counter)) { - tp->tv_sec = (long)(hires_counter.QuadPart / hires_frequency); - tp->tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency) / 1000) * hires_ticks_to_ps); - return LIBUSB_SUCCESS; - } - // Fall through and return real-time if monotonic read failed or was not detected @ init - case USBI_CLOCK_REALTIME: - // We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx - // with a predef epoch time to have an epoch that starts at 1970.01.01 00:00 - // Note however that our resolution is bounded by the Windows system time - // functions and is at best of the order of 1 ms (or, usually, worse) - GetSystemTime(&st); - SystemTimeToFileTime(&st, &filetime); - rtime.LowPart = filetime.dwLowDateTime; - rtime.HighPart = filetime.dwHighDateTime; - rtime.QuadPart -= EPOCH_TIME; - tp->tv_sec = (long)(rtime.QuadPart / 10000000); - tp->tv_nsec = (long)((rtime.QuadPart % 10000000)*100); - return LIBUSB_SUCCESS; - default: - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -const struct usbi_os_backend wince_backend = { - "Windows CE", - 0, - wince_init, - wince_exit, - - wince_get_device_list, - NULL, /* hotplug_poll */ - wince_open, - wince_close, - - wince_get_device_descriptor, - wince_get_active_config_descriptor, - wince_get_config_descriptor, - NULL, /* get_config_descriptor_by_value() */ - - wince_get_configuration, - wince_set_configuration, - wince_claim_interface, - wince_release_interface, - - wince_set_interface_altsetting, - wince_clear_halt, - wince_reset_device, - - NULL, /* alloc_streams */ - NULL, /* free_streams */ - - NULL, /* dev_mem_alloc() */ - NULL, /* dev_mem_free() */ - - wince_kernel_driver_active, - wince_detach_kernel_driver, - wince_attach_kernel_driver, - - wince_destroy_device, - - wince_submit_transfer, - wince_cancel_transfer, - wince_clear_transfer_priv, - - wince_handle_events, - NULL, /* handle_transfer_completion() */ - - wince_clock_gettime, - sizeof(struct wince_device_priv), - 0, - sizeof(struct wince_transfer_priv), -}; diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/wince_usb.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/wince_usb.h deleted file mode 100644 index edcb9fcc4005..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/wince_usb.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Windows CE backend for libusb 1.0 - * Copyright © 2011-2013 RealVNC Ltd. - * Portions taken from Windows backend, which is - * Copyright © 2009-2010 Pete Batard - * With contributions from Michael Plante, Orin Eman et al. - * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer - * Major code testing contribution by Xiaofan Chen - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ -#pragma once - -#include "windows_common.h" - -#include -#include "poll_windows.h" - -#define MAX_DEVICE_COUNT 256 - -// This is a modified dump of the types in the ceusbkwrapper.h library header -// with functions transformed into extern pointers. -// -// This backend dynamically loads ceusbkwrapper.dll and doesn't include -// ceusbkwrapper.h directly to simplify the build process. The kernel -// side wrapper driver is built using the platform image build tools, -// which makes it difficult to reference directly from the libusb build -// system. -struct UKW_DEVICE_PRIV; -typedef struct UKW_DEVICE_PRIV *UKW_DEVICE; -typedef UKW_DEVICE *PUKW_DEVICE, *LPUKW_DEVICE; - -typedef struct { - UINT8 bLength; - UINT8 bDescriptorType; - UINT16 bcdUSB; - UINT8 bDeviceClass; - UINT8 bDeviceSubClass; - UINT8 bDeviceProtocol; - UINT8 bMaxPacketSize0; - UINT16 idVendor; - UINT16 idProduct; - UINT16 bcdDevice; - UINT8 iManufacturer; - UINT8 iProduct; - UINT8 iSerialNumber; - UINT8 bNumConfigurations; -} UKW_DEVICE_DESCRIPTOR, *PUKW_DEVICE_DESCRIPTOR, *LPUKW_DEVICE_DESCRIPTOR; - -typedef struct { - UINT8 bmRequestType; - UINT8 bRequest; - UINT16 wValue; - UINT16 wIndex; - UINT16 wLength; -} UKW_CONTROL_HEADER, *PUKW_CONTROL_HEADER, *LPUKW_CONTROL_HEADER; - -// Collection of flags which can be used when issuing transfer requests -/* Indicates that the transfer direction is 'in' */ -#define UKW_TF_IN_TRANSFER 0x00000001 -/* Indicates that the transfer direction is 'out' */ -#define UKW_TF_OUT_TRANSFER 0x00000000 -/* Specifies that the transfer should complete as soon as possible, - * even if no OVERLAPPED structure has been provided. */ -#define UKW_TF_NO_WAIT 0x00000100 -/* Indicates that transfers shorter than the buffer are ok */ -#define UKW_TF_SHORT_TRANSFER_OK 0x00000200 -#define UKW_TF_SEND_TO_DEVICE 0x00010000 -#define UKW_TF_SEND_TO_INTERFACE 0x00020000 -#define UKW_TF_SEND_TO_ENDPOINT 0x00040000 -/* Don't block when waiting for memory allocations */ -#define UKW_TF_DONT_BLOCK_FOR_MEM 0x00080000 - -/* Value to use when dealing with configuration values, such as UkwGetConfigDescriptor, - * to specify the currently active configuration for the device. */ -#define UKW_ACTIVE_CONFIGURATION -1 - -DLL_DECLARE_HANDLE(ceusbkwrapper); -DLL_DECLARE_FUNC(WINAPI, HANDLE, UkwOpenDriver, ()); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwGetDeviceList, (HANDLE, LPUKW_DEVICE, DWORD, LPDWORD)); -DLL_DECLARE_FUNC(WINAPI, void, UkwReleaseDeviceList, (HANDLE, LPUKW_DEVICE, DWORD)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwGetDeviceAddress, (UKW_DEVICE, unsigned char*, unsigned char*, unsigned long*)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwGetDeviceDescriptor, (UKW_DEVICE, LPUKW_DEVICE_DESCRIPTOR)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwGetConfigDescriptor, (UKW_DEVICE, DWORD, LPVOID, DWORD, LPDWORD)); -DLL_DECLARE_FUNC(WINAPI, void, UkwCloseDriver, (HANDLE)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwCancelTransfer, (UKW_DEVICE, LPOVERLAPPED, DWORD)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwIssueControlTransfer, (UKW_DEVICE, DWORD, LPUKW_CONTROL_HEADER, LPVOID, DWORD, LPDWORD, LPOVERLAPPED)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwClaimInterface, (UKW_DEVICE, DWORD)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwReleaseInterface, (UKW_DEVICE, DWORD)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwSetInterfaceAlternateSetting, (UKW_DEVICE, DWORD, DWORD)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwClearHaltHost, (UKW_DEVICE, UCHAR)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwClearHaltDevice, (UKW_DEVICE, UCHAR)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwGetConfig, (UKW_DEVICE, PUCHAR)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwSetConfig, (UKW_DEVICE, UCHAR)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwResetDevice, (UKW_DEVICE)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwKernelDriverActive, (UKW_DEVICE, DWORD, PBOOL)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwAttachKernelDriver, (UKW_DEVICE, DWORD)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwDetachKernelDriver, (UKW_DEVICE, DWORD)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwIssueBulkTransfer, (UKW_DEVICE, DWORD, UCHAR, LPVOID, DWORD, LPDWORD, LPOVERLAPPED)); -DLL_DECLARE_FUNC(WINAPI, BOOL, UkwIsPipeHalted, (UKW_DEVICE, UCHAR, LPBOOL)); - -// Used to determine if an endpoint status really is halted on a failed transfer. -#define STATUS_HALT_FLAG 0x1 - -struct wince_device_priv { - UKW_DEVICE dev; - UKW_DEVICE_DESCRIPTOR desc; -}; - -struct wince_transfer_priv { - struct winfd pollable_fd; - uint8_t interface_number; -}; - diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_common.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_common.h deleted file mode 100644 index 55344ca264e2..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_common.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Windows backend common header for libusb 1.0 - * - * This file brings together header code common between - * the desktop Windows and Windows CE backends. - * Copyright © 2012-2013 RealVNC Ltd. - * Copyright © 2009-2012 Pete Batard - * With contributions from Michael Plante, Orin Eman et al. - * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer - * Major code testing contribution by Xiaofan Chen - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#pragma once - -// Windows API default is uppercase - ugh! -#if !defined(bool) -#define bool BOOL -#endif -#if !defined(true) -#define true TRUE -#endif -#if !defined(false) -#define false FALSE -#endif - -#define EPOCH_TIME UINT64_C(116444736000000000) // 1970.01.01 00:00:000 in MS Filetime - -#if defined(__CYGWIN__ ) -#define _stricmp strcasecmp -#define _strdup strdup -// _beginthreadex is MSVCRT => unavailable for cygwin. Fallback to using CreateThread -#define _beginthreadex(a, b, c, d, e, f) CreateThread(a, b, (LPTHREAD_START_ROUTINE)c, d, e, (LPDWORD)f) -#endif - -#define safe_free(p) do {if (p != NULL) {free((void *)p); p = NULL;}} while (0) - -#ifndef ARRAYSIZE -#define ARRAYSIZE(A) (sizeof(A)/sizeof((A)[0])) -#endif - -#define ERR_BUFFER_SIZE 256 - -/* - * API macros - leveraged from libusb-win32 1.x - */ -#ifndef _WIN32_WCE -#define DLL_STRINGIFY(s) #s -#define DLL_LOAD_LIBRARY(name) LoadLibraryA(DLL_STRINGIFY(name)) -#else -#define DLL_STRINGIFY(s) L#s -#define DLL_LOAD_LIBRARY(name) LoadLibrary(DLL_STRINGIFY(name)) -#endif - -/* - * Macros for handling DLL themselves - */ -#define DLL_DECLARE_HANDLE(name) \ - static HMODULE __dll_##name##_handle = NULL - -#define DLL_GET_HANDLE(name) \ - do { \ - __dll_##name##_handle = DLL_LOAD_LIBRARY(name); \ - if (!__dll_##name##_handle) \ - return LIBUSB_ERROR_OTHER; \ - } while (0) - -#define DLL_FREE_HANDLE(name) \ - do { \ - if (__dll_##name##_handle) { \ - FreeLibrary(__dll_##name##_handle); \ - __dll_##name##_handle = NULL; \ - } \ - } while(0) - - -/* - * Macros for handling functions within a DLL - */ -#define DLL_DECLARE_FUNC_PREFIXNAME(api, ret, prefixname, name, args) \ - typedef ret (api * __dll_##name##_func_t)args; \ - static __dll_##name##_func_t prefixname = NULL - -#define DLL_DECLARE_FUNC(api, ret, name, args) \ - DLL_DECLARE_FUNC_PREFIXNAME(api, ret, name, name, args) -#define DLL_DECLARE_FUNC_PREFIXED(api, ret, prefix, name, args) \ - DLL_DECLARE_FUNC_PREFIXNAME(api, ret, prefix##name, name, args) - -#define DLL_LOAD_FUNC_PREFIXNAME(dll, prefixname, name, ret_on_failure) \ - do { \ - HMODULE h = __dll_##dll##_handle; \ - prefixname = (__dll_##name##_func_t)GetProcAddress(h, \ - DLL_STRINGIFY(name)); \ - if (prefixname) \ - break; \ - prefixname = (__dll_##name##_func_t)GetProcAddress(h, \ - DLL_STRINGIFY(name) DLL_STRINGIFY(A)); \ - if (prefixname) \ - break; \ - prefixname = (__dll_##name##_func_t)GetProcAddress(h, \ - DLL_STRINGIFY(name) DLL_STRINGIFY(W)); \ - if (prefixname) \ - break; \ - if (ret_on_failure) \ - return LIBUSB_ERROR_NOT_FOUND; \ - } while(0) - -#define DLL_LOAD_FUNC(dll, name, ret_on_failure) \ - DLL_LOAD_FUNC_PREFIXNAME(dll, name, name, ret_on_failure) -#define DLL_LOAD_FUNC_PREFIXED(dll, prefix, name, ret_on_failure) \ - DLL_LOAD_FUNC_PREFIXNAME(dll, prefix##name, name, ret_on_failure) diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_nt_common.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_nt_common.c deleted file mode 100644 index d935394a65b2..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_nt_common.c +++ /dev/null @@ -1,591 +0,0 @@ -/* - * windows backend for libusb 1.0 - * Copyright © 2009-2012 Pete Batard - * With contributions from Michael Plante, Orin Eman et al. - * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer - * HID Reports IOCTLs inspired from HIDAPI by Alan Ott, Signal 11 Software - * Hash table functions adapted from glibc, by Ulrich Drepper et al. - * Major code testing contribution by Xiaofan Chen - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include -#include - -#include "libusbi.h" -#include "windows_common.h" -#include "windows_nt_common.h" - -// Global variables for clock_gettime mechanism -static uint64_t hires_ticks_to_ps; -static uint64_t hires_frequency; - -#define TIMER_REQUEST_RETRY_MS 100 -#define WM_TIMER_REQUEST (WM_USER + 1) -#define WM_TIMER_EXIT (WM_USER + 2) - -// used for monotonic clock_gettime() -struct timer_request { - struct timespec *tp; - HANDLE event; -}; - -// Timer thread -static HANDLE timer_thread = NULL; -static DWORD timer_thread_id = 0; - -/* User32 dependencies */ -DLL_DECLARE_HANDLE(User32); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, GetMessageA, (LPMSG, HWND, UINT, UINT)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, PeekMessageA, (LPMSG, HWND, UINT, UINT, UINT)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, PostThreadMessageA, (DWORD, UINT, WPARAM, LPARAM)); - -static unsigned __stdcall windows_clock_gettime_threaded(void *param); - -/* -* Converts a windows error to human readable string -* uses retval as errorcode, or, if 0, use GetLastError() -*/ -#if defined(ENABLE_LOGGING) -const char *windows_error_str(DWORD error_code) -{ - static char err_string[ERR_BUFFER_SIZE]; - - DWORD size; - int len; - - if (error_code == 0) - error_code = GetLastError(); - - len = sprintf(err_string, "[%u] ", (unsigned int)error_code); - - // Translate codes returned by SetupAPI. The ones we are dealing with are either - // in 0x0000xxxx or 0xE000xxxx and can be distinguished from standard error codes. - // See http://msdn.microsoft.com/en-us/library/windows/hardware/ff545011.aspx - switch (error_code & 0xE0000000) { - case 0: - error_code = HRESULT_FROM_WIN32(error_code); // Still leaves ERROR_SUCCESS unmodified - break; - case 0xE0000000: - error_code = 0x80000000 | (FACILITY_SETUPAPI << 16) | (error_code & 0x0000FFFF); - break; - default: - break; - } - - size = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, error_code, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - &err_string[len], ERR_BUFFER_SIZE - len, NULL); - if (size == 0) { - DWORD format_error = GetLastError(); - if (format_error) - snprintf(err_string, ERR_BUFFER_SIZE, - "Windows error code %u (FormatMessage error code %u)", - (unsigned int)error_code, (unsigned int)format_error); - else - snprintf(err_string, ERR_BUFFER_SIZE, "Unknown error code %u", (unsigned int)error_code); - } else { - // Remove CRLF from end of message, if present - size_t pos = len + size - 2; - if (err_string[pos] == '\r') - err_string[pos] = '\0'; - } - - return err_string; -} -#endif - -/* Hash table functions - modified From glibc 2.3.2: - [Aho,Sethi,Ullman] Compilers: Principles, Techniques and Tools, 1986 - [Knuth] The Art of Computer Programming, part 3 (6.4) */ - -#define HTAB_SIZE 1021UL // *MUST* be a prime number!! - -typedef struct htab_entry { - unsigned long used; - char *str; -} htab_entry; - -static htab_entry *htab_table = NULL; -static usbi_mutex_t htab_mutex = NULL; -static unsigned long htab_filled; - -/* Before using the hash table we must allocate memory for it. - We allocate one element more as the found prime number says. - This is done for more effective indexing as explained in the - comment for the hash function. */ -static bool htab_create(struct libusb_context *ctx) -{ - if (htab_table != NULL) { - usbi_err(ctx, "hash table already allocated"); - return true; - } - - // Create a mutex - usbi_mutex_init(&htab_mutex); - - usbi_dbg("using %lu entries hash table", HTAB_SIZE); - htab_filled = 0; - - // allocate memory and zero out. - htab_table = calloc(HTAB_SIZE + 1, sizeof(htab_entry)); - if (htab_table == NULL) { - usbi_err(ctx, "could not allocate space for hash table"); - return false; - } - - return true; -} - -/* After using the hash table it has to be destroyed. */ -static void htab_destroy(void) -{ - unsigned long i; - - if (htab_table == NULL) - return; - - for (i = 0; i < HTAB_SIZE; i++) - free(htab_table[i].str); - - safe_free(htab_table); - - usbi_mutex_destroy(&htab_mutex); -} - -/* This is the search function. It uses double hashing with open addressing. - We use a trick to speed up the lookup. The table is created with one - more element available. This enables us to use the index zero special. - This index will never be used because we store the first hash index in - the field used where zero means not used. Every other value means used. - The used field can be used as a first fast comparison for equality of - the stored and the parameter value. This helps to prevent unnecessary - expensive calls of strcmp. */ -unsigned long htab_hash(const char *str) -{ - unsigned long hval, hval2; - unsigned long idx; - unsigned long r = 5381; - int c; - const char *sz = str; - - if (str == NULL) - return 0; - - // Compute main hash value (algorithm suggested by Nokia) - while ((c = *sz++) != 0) - r = ((r << 5) + r) + c; - if (r == 0) - ++r; - - // compute table hash: simply take the modulus - hval = r % HTAB_SIZE; - if (hval == 0) - ++hval; - - // Try the first index - idx = hval; - - // Mutually exclusive access (R/W lock would be better) - usbi_mutex_lock(&htab_mutex); - - if (htab_table[idx].used) { - if ((htab_table[idx].used == hval) && (strcmp(str, htab_table[idx].str) == 0)) - goto out_unlock; // existing hash - - usbi_dbg("hash collision ('%s' vs '%s')", str, htab_table[idx].str); - - // Second hash function, as suggested in [Knuth] - hval2 = 1 + hval % (HTAB_SIZE - 2); - - do { - // Because size is prime this guarantees to step through all available indexes - if (idx <= hval2) - idx = HTAB_SIZE + idx - hval2; - else - idx -= hval2; - - // If we visited all entries leave the loop unsuccessfully - if (idx == hval) - break; - - // If entry is found use it. - if ((htab_table[idx].used == hval) && (strcmp(str, htab_table[idx].str) == 0)) - goto out_unlock; - } while (htab_table[idx].used); - } - - // Not found => New entry - - // If the table is full return an error - if (htab_filled >= HTAB_SIZE) { - usbi_err(NULL, "hash table is full (%lu entries)", HTAB_SIZE); - idx = 0; - goto out_unlock; - } - - htab_table[idx].str = _strdup(str); - if (htab_table[idx].str == NULL) { - usbi_err(NULL, "could not duplicate string for hash table"); - idx = 0; - goto out_unlock; - } - - htab_table[idx].used = hval; - ++htab_filled; - -out_unlock: - usbi_mutex_unlock(&htab_mutex); - - return idx; -} - -static int windows_init_dlls(void) -{ - DLL_GET_HANDLE(User32); - DLL_LOAD_FUNC_PREFIXED(User32, p, GetMessageA, TRUE); - DLL_LOAD_FUNC_PREFIXED(User32, p, PeekMessageA, TRUE); - DLL_LOAD_FUNC_PREFIXED(User32, p, PostThreadMessageA, TRUE); - - return LIBUSB_SUCCESS; -} - -static void windows_exit_dlls(void) -{ - DLL_FREE_HANDLE(User32); -} - -static bool windows_init_clock(struct libusb_context *ctx) -{ - DWORD_PTR affinity, dummy; - HANDLE event = NULL; - LARGE_INTEGER li_frequency; - int i; - - if (QueryPerformanceFrequency(&li_frequency)) { - // Load DLL imports - if (windows_init_dlls() != LIBUSB_SUCCESS) { - usbi_err(ctx, "could not resolve DLL functions"); - return false; - } - - // The hires frequency can go as high as 4 GHz, so we'll use a conversion - // to picoseconds to compute the tv_nsecs part in clock_gettime - hires_frequency = li_frequency.QuadPart; - hires_ticks_to_ps = UINT64_C(1000000000000) / hires_frequency; - usbi_dbg("hires timer available (Frequency: %"PRIu64" Hz)", hires_frequency); - - // Because QueryPerformanceCounter might report different values when - // running on different cores, we create a separate thread for the timer - // calls, which we glue to the first available core always to prevent timing discrepancies. - if (!GetProcessAffinityMask(GetCurrentProcess(), &affinity, &dummy) || (affinity == 0)) { - usbi_err(ctx, "could not get process affinity: %s", windows_error_str(0)); - return false; - } - - // The process affinity mask is a bitmask where each set bit represents a core on - // which this process is allowed to run, so we find the first set bit - for (i = 0; !(affinity & (DWORD_PTR)(1 << i)); i++); - affinity = (DWORD_PTR)(1 << i); - - usbi_dbg("timer thread will run on core #%d", i); - - event = CreateEvent(NULL, FALSE, FALSE, NULL); - if (event == NULL) { - usbi_err(ctx, "could not create event: %s", windows_error_str(0)); - return false; - } - - timer_thread = (HANDLE)_beginthreadex(NULL, 0, windows_clock_gettime_threaded, (void *)event, - 0, (unsigned int *)&timer_thread_id); - if (timer_thread == NULL) { - usbi_err(ctx, "unable to create timer thread - aborting"); - CloseHandle(event); - return false; - } - - if (!SetThreadAffinityMask(timer_thread, affinity)) - usbi_warn(ctx, "unable to set timer thread affinity, timer discrepancies may arise"); - - // Wait for timer thread to init before continuing. - if (WaitForSingleObject(event, INFINITE) != WAIT_OBJECT_0) { - usbi_err(ctx, "failed to wait for timer thread to become ready - aborting"); - CloseHandle(event); - return false; - } - - CloseHandle(event); - } else { - usbi_dbg("no hires timer available on this platform"); - hires_frequency = 0; - hires_ticks_to_ps = UINT64_C(0); - } - - return true; -} - -void windows_destroy_clock(void) -{ - if (timer_thread) { - // actually the signal to quit the thread. - if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_EXIT, 0, 0) - || (WaitForSingleObject(timer_thread, INFINITE) != WAIT_OBJECT_0)) { - usbi_dbg("could not wait for timer thread to quit"); - TerminateThread(timer_thread, 1); - // shouldn't happen, but we're destroying - // all objects it might have held anyway. - } - CloseHandle(timer_thread); - timer_thread = NULL; - timer_thread_id = 0; - } -} - -/* -* Monotonic and real time functions -*/ -static unsigned __stdcall windows_clock_gettime_threaded(void *param) -{ - struct timer_request *request; - LARGE_INTEGER hires_counter; - MSG msg; - - // The following call will create this thread's message queue - // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644946.aspx - pPeekMessageA(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); - - // Signal windows_init_clock() that we're ready to service requests - if (!SetEvent((HANDLE)param)) - usbi_dbg("SetEvent failed for timer init event: %s", windows_error_str(0)); - param = NULL; - - // Main loop - wait for requests - while (1) { - if (pGetMessageA(&msg, NULL, WM_TIMER_REQUEST, WM_TIMER_EXIT) == -1) { - usbi_err(NULL, "GetMessage failed for timer thread: %s", windows_error_str(0)); - return 1; - } - - switch (msg.message) { - case WM_TIMER_REQUEST: - // Requests to this thread are for hires always - // Microsoft says that this function always succeeds on XP and later - // See https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904.aspx - request = (struct timer_request *)msg.lParam; - QueryPerformanceCounter(&hires_counter); - request->tp->tv_sec = (long)(hires_counter.QuadPart / hires_frequency); - request->tp->tv_nsec = (long)(((hires_counter.QuadPart % hires_frequency) / 1000) * hires_ticks_to_ps); - if (!SetEvent(request->event)) - usbi_err(NULL, "SetEvent failed for timer request: %s", windows_error_str(0)); - break; - case WM_TIMER_EXIT: - usbi_dbg("timer thread quitting"); - return 0; - } - } -} - -int windows_clock_gettime(int clk_id, struct timespec *tp) -{ - struct timer_request request; -#if !defined(_MSC_VER) || (_MSC_VER < 1900) - FILETIME filetime; - ULARGE_INTEGER rtime; -#endif - DWORD r; - - switch (clk_id) { - case USBI_CLOCK_MONOTONIC: - if (timer_thread) { - request.tp = tp; - request.event = CreateEvent(NULL, FALSE, FALSE, NULL); - if (request.event == NULL) - return LIBUSB_ERROR_NO_MEM; - - if (!pPostThreadMessageA(timer_thread_id, WM_TIMER_REQUEST, 0, (LPARAM)&request)) { - usbi_err(NULL, "PostThreadMessage failed for timer thread: %s", windows_error_str(0)); - CloseHandle(request.event); - return LIBUSB_ERROR_OTHER; - } - - do { - r = WaitForSingleObject(request.event, TIMER_REQUEST_RETRY_MS); - if (r == WAIT_TIMEOUT) - usbi_dbg("could not obtain a timer value within reasonable timeframe - too much load?"); - else if (r == WAIT_FAILED) - usbi_err(NULL, "WaitForSingleObject failed: %s", windows_error_str(0)); - } while (r == WAIT_TIMEOUT); - CloseHandle(request.event); - - if (r == WAIT_OBJECT_0) - return LIBUSB_SUCCESS; - else - return LIBUSB_ERROR_OTHER; - } - // Fall through and return real-time if monotonic was not detected @ timer init - case USBI_CLOCK_REALTIME: -#if defined(_MSC_VER) && (_MSC_VER >= 1900) - timespec_get(tp, TIME_UTC); -#else - // We follow http://msdn.microsoft.com/en-us/library/ms724928%28VS.85%29.aspx - // with a predef epoch time to have an epoch that starts at 1970.01.01 00:00 - // Note however that our resolution is bounded by the Windows system time - // functions and is at best of the order of 1 ms (or, usually, worse) - GetSystemTimeAsFileTime(&filetime); - rtime.LowPart = filetime.dwLowDateTime; - rtime.HighPart = filetime.dwHighDateTime; - rtime.QuadPart -= EPOCH_TIME; - tp->tv_sec = (long)(rtime.QuadPart / 10000000); - tp->tv_nsec = (long)((rtime.QuadPart % 10000000) * 100); -#endif - return LIBUSB_SUCCESS; - default: - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -static void windows_transfer_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) -{ - int status, istatus; - - usbi_dbg("handling I/O completion with errcode %u, size %u", io_result, io_size); - - switch (io_result) { - case NO_ERROR: - status = windows_copy_transfer_data(itransfer, io_size); - break; - case ERROR_GEN_FAILURE: - usbi_dbg("detected endpoint stall"); - status = LIBUSB_TRANSFER_STALL; - break; - case ERROR_SEM_TIMEOUT: - usbi_dbg("detected semaphore timeout"); - status = LIBUSB_TRANSFER_TIMED_OUT; - break; - case ERROR_OPERATION_ABORTED: - istatus = windows_copy_transfer_data(itransfer, io_size); - if (istatus != LIBUSB_TRANSFER_COMPLETED) - usbi_dbg("Failed to copy partial data in aborted operation: %d", istatus); - - usbi_dbg("detected operation aborted"); - status = LIBUSB_TRANSFER_CANCELLED; - break; - default: - usbi_err(ITRANSFER_CTX(itransfer), "detected I/O error %u: %s", io_result, windows_error_str(io_result)); - status = LIBUSB_TRANSFER_ERROR; - break; - } - windows_clear_transfer_priv(itransfer); // Cancel polling - if (status == LIBUSB_TRANSFER_CANCELLED) - usbi_handle_transfer_cancellation(itransfer); - else - usbi_handle_transfer_completion(itransfer, (enum libusb_transfer_status)status); -} - -void windows_handle_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - windows_transfer_callback(itransfer, io_result, io_size); - break; - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - usbi_warn(ITRANSFER_CTX(itransfer), "bulk stream transfers are not yet supported on this platform"); - break; - default: - usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); - } -} - -int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready) -{ - POLL_NFDS_TYPE i; - bool found = false; - struct usbi_transfer *transfer; - struct winfd *pollable_fd = NULL; - DWORD io_size, io_result; - int r = LIBUSB_SUCCESS; - - usbi_mutex_lock(&ctx->open_devs_lock); - for (i = 0; i < nfds && num_ready > 0; i++) { - - usbi_dbg("checking fd %d with revents = %04x", fds[i].fd, fds[i].revents); - - if (!fds[i].revents) - continue; - - num_ready--; - - // Because a Windows OVERLAPPED is used for poll emulation, - // a pollable fd is created and stored with each transfer - usbi_mutex_lock(&ctx->flying_transfers_lock); - found = false; - list_for_each_entry(transfer, &ctx->flying_transfers, list, struct usbi_transfer) { - pollable_fd = windows_get_fd(transfer); - if (pollable_fd->fd == fds[i].fd) { - found = true; - break; - } - } - usbi_mutex_unlock(&ctx->flying_transfers_lock); - - if (found) { - windows_get_overlapped_result(transfer, pollable_fd, &io_result, &io_size); - - usbi_remove_pollfd(ctx, pollable_fd->fd); - // let handle_callback free the event using the transfer wfd - // If you don't use the transfer wfd, you run a risk of trying to free a - // newly allocated wfd that took the place of the one from the transfer. - windows_handle_callback(transfer, io_result, io_size); - } else { - usbi_err(ctx, "could not find a matching transfer for fd %d", fds[i]); - r = LIBUSB_ERROR_NOT_FOUND; - break; - } - } - usbi_mutex_unlock(&ctx->open_devs_lock); - - return r; -} - -int windows_common_init(struct libusb_context *ctx) -{ - if (!windows_init_clock(ctx)) - goto error_roll_back; - - if (!htab_create(ctx)) - goto error_roll_back; - - return LIBUSB_SUCCESS; - -error_roll_back: - windows_common_exit(); - return LIBUSB_ERROR_NO_MEM; -} - -void windows_common_exit(void) -{ - htab_destroy(); - windows_destroy_clock(); - windows_exit_dlls(); -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_nt_common.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_nt_common.h deleted file mode 100644 index 52ea8708b043..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_nt_common.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Windows backend common header for libusb 1.0 - * - * This file brings together header code common between - * the desktop Windows backends. - * Copyright © 2012-2013 RealVNC Ltd. - * Copyright © 2009-2012 Pete Batard - * With contributions from Michael Plante, Orin Eman et al. - * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer - * Major code testing contribution by Xiaofan Chen - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#pragma once - -// Missing from MinGW -#if !defined(FACILITY_SETUPAPI) -#define FACILITY_SETUPAPI 15 -#endif - -typedef struct USB_CONFIGURATION_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; - USHORT wTotalLength; - UCHAR bNumInterfaces; - UCHAR bConfigurationValue; - UCHAR iConfiguration; - UCHAR bmAttributes; - UCHAR MaxPower; -} USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR; - -typedef struct libusb_device_descriptor USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR; - -int windows_common_init(struct libusb_context *ctx); -void windows_common_exit(void); - -unsigned long htab_hash(const char *str); -int windows_clock_gettime(int clk_id, struct timespec *tp); - -void windows_clear_transfer_priv(struct usbi_transfer *itransfer); -int windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size); -struct winfd *windows_get_fd(struct usbi_transfer *transfer); -void windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size); - -void windows_handle_callback(struct usbi_transfer *itransfer, uint32_t io_result, uint32_t io_size); -int windows_handle_events(struct libusb_context *ctx, struct pollfd *fds, POLL_NFDS_TYPE nfds, int num_ready); - -#if defined(ENABLE_LOGGING) -const char *windows_error_str(DWORD error_code); -#endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_usbdk.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_usbdk.c deleted file mode 100644 index 7cc5793872a3..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_usbdk.c +++ /dev/null @@ -1,905 +0,0 @@ -/* - * windows UsbDk backend for libusb 1.0 - * Copyright © 2014 Red Hat, Inc. - - * Authors: - * Dmitry Fleytman - * Pavel Gurvich - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#if defined(USE_USBDK) - -#include -#include -#include - -#include "libusbi.h" -#include "windows_common.h" -#include "windows_nt_common.h" - -#define ULONG64 uint64_t -#define PVOID64 uint64_t - -typedef CONST WCHAR *PCWCHAR; -#define wcsncpy_s wcsncpy - -#include "windows_usbdk.h" - -#if !defined(STATUS_SUCCESS) -typedef LONG NTSTATUS; -#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) -#endif - -#if !defined(STATUS_CANCELLED) -#define STATUS_CANCELLED ((NTSTATUS)0xC0000120L) -#endif - -#if !defined(STATUS_REQUEST_CANCELED) -#define STATUS_REQUEST_CANCELED ((NTSTATUS)0xC0000703L) -#endif - -#if !defined(USBD_SUCCESS) -typedef int32_t USBD_STATUS; -#define USBD_SUCCESS(Status) ((USBD_STATUS) (Status) >= 0) -#define USBD_PENDING(Status) ((ULONG) (Status) >> 30 == 1) -#define USBD_ERROR(Status) ((USBD_STATUS) (Status) < 0) -#define USBD_STATUS_STALL_PID ((USBD_STATUS) 0xc0000004) -#define USBD_STATUS_ENDPOINT_HALTED ((USBD_STATUS) 0xc0000030) -#define USBD_STATUS_BAD_START_FRAME ((USBD_STATUS) 0xc0000a00) -#define USBD_STATUS_TIMEOUT ((USBD_STATUS) 0xc0006000) -#define USBD_STATUS_CANCELED ((USBD_STATUS) 0xc0010000) -#endif - -static int concurrent_usage = -1; - -struct usbdk_device_priv { - USB_DK_DEVICE_INFO info; - PUSB_CONFIGURATION_DESCRIPTOR *config_descriptors; - HANDLE redirector_handle; - uint8_t active_configuration; -}; - -struct usbdk_transfer_priv { - USB_DK_TRANSFER_REQUEST request; - struct winfd pollable_fd; - PULONG64 IsochronousPacketsArray; - PUSB_DK_ISO_TRANSFER_RESULT IsochronousResultsArray; -}; - -static inline struct usbdk_device_priv *_usbdk_device_priv(struct libusb_device *dev) -{ - return (struct usbdk_device_priv *)dev->os_priv; -} - -static inline struct usbdk_transfer_priv *_usbdk_transfer_priv(struct usbi_transfer *itransfer) -{ - return (struct usbdk_transfer_priv *)usbi_transfer_get_os_priv(itransfer); -} - -static struct { - HMODULE module; - - USBDK_GET_DEVICES_LIST GetDevicesList; - USBDK_RELEASE_DEVICES_LIST ReleaseDevicesList; - USBDK_START_REDIRECT StartRedirect; - USBDK_STOP_REDIRECT StopRedirect; - USBDK_GET_CONFIGURATION_DESCRIPTOR GetConfigurationDescriptor; - USBDK_RELEASE_CONFIGURATION_DESCRIPTOR ReleaseConfigurationDescriptor; - USBDK_READ_PIPE ReadPipe; - USBDK_WRITE_PIPE WritePipe; - USBDK_ABORT_PIPE AbortPipe; - USBDK_RESET_PIPE ResetPipe; - USBDK_SET_ALTSETTING SetAltsetting; - USBDK_RESET_DEVICE ResetDevice; - USBDK_GET_REDIRECTOR_SYSTEM_HANDLE GetRedirectorSystemHandle; -} usbdk_helper; - -static FARPROC get_usbdk_proc_addr(struct libusb_context *ctx, LPCSTR api_name) -{ - FARPROC api_ptr = GetProcAddress(usbdk_helper.module, api_name); - - if (api_ptr == NULL) - usbi_err(ctx, "UsbDkHelper API %s not found, error %d", api_name, GetLastError()); - - return api_ptr; -} - -static void unload_usbdk_helper_dll(void) -{ - if (usbdk_helper.module != NULL) { - FreeLibrary(usbdk_helper.module); - usbdk_helper.module = NULL; - } -} - -static int load_usbdk_helper_dll(struct libusb_context *ctx) -{ - usbdk_helper.module = LoadLibraryA("UsbDkHelper"); - if (usbdk_helper.module == NULL) { - usbi_err(ctx, "Failed to load UsbDkHelper.dll, error %d", GetLastError()); - return LIBUSB_ERROR_NOT_FOUND; - } - - usbdk_helper.GetDevicesList = (USBDK_GET_DEVICES_LIST)get_usbdk_proc_addr(ctx, "UsbDk_GetDevicesList"); - if (usbdk_helper.GetDevicesList == NULL) - goto error_unload; - - usbdk_helper.ReleaseDevicesList = (USBDK_RELEASE_DEVICES_LIST)get_usbdk_proc_addr(ctx, "UsbDk_ReleaseDevicesList"); - if (usbdk_helper.ReleaseDevicesList == NULL) - goto error_unload; - - usbdk_helper.StartRedirect = (USBDK_START_REDIRECT)get_usbdk_proc_addr(ctx, "UsbDk_StartRedirect"); - if (usbdk_helper.StartRedirect == NULL) - goto error_unload; - - usbdk_helper.StopRedirect = (USBDK_STOP_REDIRECT)get_usbdk_proc_addr(ctx, "UsbDk_StopRedirect"); - if (usbdk_helper.StopRedirect == NULL) - goto error_unload; - - usbdk_helper.GetConfigurationDescriptor = (USBDK_GET_CONFIGURATION_DESCRIPTOR)get_usbdk_proc_addr(ctx, "UsbDk_GetConfigurationDescriptor"); - if (usbdk_helper.GetConfigurationDescriptor == NULL) - goto error_unload; - - usbdk_helper.ReleaseConfigurationDescriptor = (USBDK_RELEASE_CONFIGURATION_DESCRIPTOR)get_usbdk_proc_addr(ctx, "UsbDk_ReleaseConfigurationDescriptor"); - if (usbdk_helper.ReleaseConfigurationDescriptor == NULL) - goto error_unload; - - usbdk_helper.ReadPipe = (USBDK_READ_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_ReadPipe"); - if (usbdk_helper.ReadPipe == NULL) - goto error_unload; - - usbdk_helper.WritePipe = (USBDK_WRITE_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_WritePipe"); - if (usbdk_helper.WritePipe == NULL) - goto error_unload; - - usbdk_helper.AbortPipe = (USBDK_ABORT_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_AbortPipe"); - if (usbdk_helper.AbortPipe == NULL) - goto error_unload; - - usbdk_helper.ResetPipe = (USBDK_RESET_PIPE)get_usbdk_proc_addr(ctx, "UsbDk_ResetPipe"); - if (usbdk_helper.ResetPipe == NULL) - goto error_unload; - - usbdk_helper.SetAltsetting = (USBDK_SET_ALTSETTING)get_usbdk_proc_addr(ctx, "UsbDk_SetAltsetting"); - if (usbdk_helper.SetAltsetting == NULL) - goto error_unload; - - usbdk_helper.ResetDevice = (USBDK_RESET_DEVICE)get_usbdk_proc_addr(ctx, "UsbDk_ResetDevice"); - if (usbdk_helper.ResetDevice == NULL) - goto error_unload; - - usbdk_helper.GetRedirectorSystemHandle = (USBDK_GET_REDIRECTOR_SYSTEM_HANDLE)get_usbdk_proc_addr(ctx, "UsbDk_GetRedirectorSystemHandle"); - if (usbdk_helper.GetRedirectorSystemHandle == NULL) - goto error_unload; - - return LIBUSB_SUCCESS; - -error_unload: - FreeLibrary(usbdk_helper.module); - usbdk_helper.module = NULL; - return LIBUSB_ERROR_NOT_FOUND; -} - -static int usbdk_init(struct libusb_context *ctx) -{ - int r; - - if (++concurrent_usage == 0) { // First init? - r = load_usbdk_helper_dll(ctx); - if (r) - goto init_exit; - - init_polling(); - - r = windows_common_init(ctx); - if (r) - goto init_exit; - } - // At this stage, either we went through full init successfully, or didn't need to - r = LIBUSB_SUCCESS; - -init_exit: - if (!concurrent_usage && r != LIBUSB_SUCCESS) { // First init failed? - exit_polling(); - windows_common_exit(); - unload_usbdk_helper_dll(); - } - - if (r != LIBUSB_SUCCESS) - --concurrent_usage; // Not expected to call libusb_exit if we failed. - - return r; -} - -static int usbdk_get_session_id_for_device(struct libusb_context *ctx, - PUSB_DK_DEVICE_ID id, unsigned long *session_id) -{ - char dev_identity[ARRAYSIZE(id->DeviceID) + ARRAYSIZE(id->InstanceID)]; - - if (sprintf(dev_identity, "%S%S", id->DeviceID, id->InstanceID) == -1) { - usbi_warn(ctx, "cannot form device identity", id->DeviceID); - return LIBUSB_ERROR_NOT_SUPPORTED; - } - - *session_id = htab_hash(dev_identity); - - return LIBUSB_SUCCESS; -} - -static void usbdk_release_config_descriptors(struct usbdk_device_priv *p, uint8_t count) -{ - uint8_t i; - - for (i = 0; i < count; i++) - usbdk_helper.ReleaseConfigurationDescriptor(p->config_descriptors[i]); - - free(p->config_descriptors); - p->config_descriptors = NULL; -} - -static int usbdk_cache_config_descriptors(struct libusb_context *ctx, - struct usbdk_device_priv *p, PUSB_DK_DEVICE_INFO info) -{ - uint8_t i; - USB_DK_CONFIG_DESCRIPTOR_REQUEST Request; - Request.ID = info->ID; - - p->config_descriptors = calloc(info->DeviceDescriptor.bNumConfigurations, sizeof(PUSB_CONFIGURATION_DESCRIPTOR)); - if (p->config_descriptors == NULL) { - usbi_err(ctx, "failed to allocate configuration descriptors holder"); - return LIBUSB_ERROR_NO_MEM; - } - - for (i = 0; i < info->DeviceDescriptor.bNumConfigurations; i++) { - ULONG Length; - - Request.Index = i; - if (!usbdk_helper.GetConfigurationDescriptor(&Request, &p->config_descriptors[i], &Length)) { - usbi_err(ctx, "failed to retrieve configuration descriptors"); - usbdk_release_config_descriptors(p, i); - return LIBUSB_ERROR_OTHER; - } - } - - return LIBUSB_SUCCESS; -} - -static inline int usbdk_device_priv_init(struct libusb_context *ctx, struct libusb_device *dev, PUSB_DK_DEVICE_INFO info) -{ - struct usbdk_device_priv *p = _usbdk_device_priv(dev); - - p->info = *info; - p->active_configuration = 0; - - return usbdk_cache_config_descriptors(ctx, p, info); -} - -static void usbdk_device_init(libusb_device *dev, PUSB_DK_DEVICE_INFO info) -{ - dev->bus_number = (uint8_t)info->FilterID; - dev->port_number = (uint8_t)info->Port; - dev->parent_dev = NULL; - - //Addresses in libusb are 1-based - dev->device_address = (uint8_t)(info->Port + 1); - - dev->num_configurations = info->DeviceDescriptor.bNumConfigurations; - dev->device_descriptor = info->DeviceDescriptor; - - switch (info->Speed) { - case LowSpeed: - dev->speed = LIBUSB_SPEED_LOW; - break; - case FullSpeed: - dev->speed = LIBUSB_SPEED_FULL; - break; - case HighSpeed: - dev->speed = LIBUSB_SPEED_HIGH; - break; - case SuperSpeed: - dev->speed = LIBUSB_SPEED_SUPER; - break; - case NoSpeed: - default: - dev->speed = LIBUSB_SPEED_UNKNOWN; - break; - } -} - -static int usbdk_get_device_list(struct libusb_context *ctx, struct discovered_devs **_discdevs) -{ - int r = LIBUSB_SUCCESS; - ULONG i; - struct discovered_devs *discdevs = NULL; - ULONG dev_number; - PUSB_DK_DEVICE_INFO devices; - - if(!usbdk_helper.GetDevicesList(&devices, &dev_number)) - return LIBUSB_ERROR_OTHER; - - for (i = 0; i < dev_number; i++) { - unsigned long session_id; - struct libusb_device *dev = NULL; - - if (usbdk_get_session_id_for_device(ctx, &devices[i].ID, &session_id)) - continue; - - dev = usbi_get_device_by_session_id(ctx, session_id); - if (dev == NULL) { - dev = usbi_alloc_device(ctx, session_id); - if (dev == NULL) { - usbi_err(ctx, "failed to allocate a new device structure"); - continue; - } - - usbdk_device_init(dev, &devices[i]); - if (usbdk_device_priv_init(ctx, dev, &devices[i]) != LIBUSB_SUCCESS) { - libusb_unref_device(dev); - continue; - } - } - - discdevs = discovered_devs_append(*_discdevs, dev); - libusb_unref_device(dev); - if (!discdevs) { - usbi_err(ctx, "cannot append new device to list"); - r = LIBUSB_ERROR_NO_MEM; - goto func_exit; - } - - *_discdevs = discdevs; - } - -func_exit: - usbdk_helper.ReleaseDevicesList(devices); - return r; -} - -static void usbdk_exit(void) -{ - if (--concurrent_usage < 0) { - windows_common_exit(); - exit_polling(); - unload_usbdk_helper_dll(); - } -} - -static int usbdk_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian) -{ - struct usbdk_device_priv *priv = _usbdk_device_priv(dev); - - memcpy(buffer, &priv->info.DeviceDescriptor, DEVICE_DESC_LENGTH); - *host_endian = 0; - - return LIBUSB_SUCCESS; -} - -static int usbdk_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) -{ - struct usbdk_device_priv *priv = _usbdk_device_priv(dev); - PUSB_CONFIGURATION_DESCRIPTOR config_header; - size_t size; - - if (config_index >= dev->num_configurations) - return LIBUSB_ERROR_INVALID_PARAM; - - config_header = (PUSB_CONFIGURATION_DESCRIPTOR)priv->config_descriptors[config_index]; - - size = min(config_header->wTotalLength, len); - memcpy(buffer, config_header, size); - *host_endian = 0; - - return (int)size; -} - -static inline int usbdk_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian) -{ - return usbdk_get_config_descriptor(dev, _usbdk_device_priv(dev)->active_configuration, - buffer, len, host_endian); -} - -static int usbdk_open(struct libusb_device_handle *dev_handle) -{ - struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); - - priv->redirector_handle = usbdk_helper.StartRedirect(&priv->info.ID); - if (priv->redirector_handle == INVALID_HANDLE_VALUE) { - usbi_err(DEVICE_CTX(dev_handle->dev), "Redirector startup failed"); - return LIBUSB_ERROR_OTHER; - } - - return LIBUSB_SUCCESS; -} - -static void usbdk_close(struct libusb_device_handle *dev_handle) -{ - struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); - - if (!usbdk_helper.StopRedirect(priv->redirector_handle)) { - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - usbi_err(ctx, "Redirector shutdown failed"); - } -} - -static int usbdk_get_configuration(struct libusb_device_handle *dev_handle, int *config) -{ - *config = _usbdk_device_priv(dev_handle->dev)->active_configuration; - - return LIBUSB_SUCCESS; -} - -static int usbdk_set_configuration(struct libusb_device_handle *dev_handle, int config) -{ - UNUSED(dev_handle); - UNUSED(config); - return LIBUSB_SUCCESS; -} - -static int usbdk_claim_interface(struct libusb_device_handle *dev_handle, int iface) -{ - UNUSED(dev_handle); - UNUSED(iface); - return LIBUSB_SUCCESS; -} - -static int usbdk_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); - - if (!usbdk_helper.SetAltsetting(priv->redirector_handle, iface, altsetting)) { - usbi_err(ctx, "SetAltsetting failed: %s", windows_error_str(0)); - return LIBUSB_ERROR_NO_DEVICE; - } - - return LIBUSB_SUCCESS; -} - -static int usbdk_release_interface(struct libusb_device_handle *dev_handle, int iface) -{ - UNUSED(dev_handle); - UNUSED(iface); - return LIBUSB_SUCCESS; -} - -static int usbdk_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); - - if (!usbdk_helper.ResetPipe(priv->redirector_handle, endpoint)) { - usbi_err(ctx, "ResetPipe failed: %s", windows_error_str(0)); - return LIBUSB_ERROR_NO_DEVICE; - } - - return LIBUSB_SUCCESS; -} - -static int usbdk_reset_device(struct libusb_device_handle *dev_handle) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct usbdk_device_priv *priv = _usbdk_device_priv(dev_handle->dev); - - if (!usbdk_helper.ResetDevice(priv->redirector_handle)) { - usbi_err(ctx, "ResetDevice failed: %s", windows_error_str(0)); - return LIBUSB_ERROR_NO_DEVICE; - } - - return LIBUSB_SUCCESS; -} - -static int usbdk_kernel_driver_active(struct libusb_device_handle *dev_handle, int iface) -{ - UNUSED(dev_handle); - UNUSED(iface); - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static int usbdk_attach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) -{ - UNUSED(dev_handle); - UNUSED(iface); - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static int usbdk_detach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) -{ - UNUSED(dev_handle); - UNUSED(iface); - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static void usbdk_destroy_device(struct libusb_device *dev) -{ - struct usbdk_device_priv* p = _usbdk_device_priv(dev); - - if (p->config_descriptors != NULL) - usbdk_release_config_descriptors(p, p->info.DeviceDescriptor.bNumConfigurations); -} - -void windows_clear_transfer_priv(struct usbi_transfer *itransfer) -{ - struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - usbi_free_fd(&transfer_priv->pollable_fd); - - if (transfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) { - safe_free(transfer_priv->IsochronousPacketsArray); - safe_free(transfer_priv->IsochronousResultsArray); - } -} - -static int usbdk_do_control_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); - struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct winfd wfd; - ULONG Length; - TransferResult transResult; - HANDLE sysHandle; - - sysHandle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle); - - wfd = usbi_create_fd(sysHandle, RW_READ, NULL, NULL); - // Always use the handle returned from usbi_create_fd (wfd.handle) - if (wfd.fd < 0) - return LIBUSB_ERROR_NO_MEM; - - transfer_priv->request.Buffer = (PVOID64)(uintptr_t)transfer->buffer; - transfer_priv->request.BufferLength = transfer->length; - transfer_priv->request.TransferType = ControlTransferType; - transfer_priv->pollable_fd = INVALID_WINFD; - Length = (ULONG)transfer->length; - - if (IS_XFERIN(transfer)) - transResult = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); - else - transResult = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); - - switch (transResult) { - case TransferSuccess: - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - wfd.overlapped->InternalHigh = (DWORD)Length; - break; - case TransferSuccessAsync: - break; - case TransferFailure: - usbi_err(ctx, "ControlTransfer failed: %s", windows_error_str(0)); - usbi_free_fd(&wfd); - return LIBUSB_ERROR_IO; - } - - // Use priv_transfer to store data needed for async polling - transfer_priv->pollable_fd = wfd; - usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, POLLIN); - - return LIBUSB_SUCCESS; -} - -static int usbdk_do_bulk_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); - struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct winfd wfd; - TransferResult transferRes; - HANDLE sysHandle; - - transfer_priv->request.Buffer = (PVOID64)(uintptr_t)transfer->buffer; - transfer_priv->request.BufferLength = transfer->length; - transfer_priv->request.EndpointAddress = transfer->endpoint; - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_BULK: - transfer_priv->request.TransferType = BulkTransferType; - break; - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - transfer_priv->request.TransferType = IntertuptTransferType; - break; - default: - usbi_err(ctx, "Wrong transfer type (%d) in usbdk_do_bulk_transfer. %s", transfer->type, windows_error_str(0)); - return LIBUSB_ERROR_INVALID_PARAM; - } - - transfer_priv->pollable_fd = INVALID_WINFD; - - sysHandle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle); - - wfd = usbi_create_fd(sysHandle, IS_XFERIN(transfer) ? RW_READ : RW_WRITE, NULL, NULL); - // Always use the handle returned from usbi_create_fd (wfd.handle) - if (wfd.fd < 0) - return LIBUSB_ERROR_NO_MEM; - - if (IS_XFERIN(transfer)) - transferRes = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); - else - transferRes = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); - - switch (transferRes) { - case TransferSuccess: - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - break; - case TransferSuccessAsync: - break; - case TransferFailure: - usbi_err(ctx, "ReadPipe/WritePipe failed: %s", windows_error_str(0)); - usbi_free_fd(&wfd); - return LIBUSB_ERROR_IO; - } - - transfer_priv->pollable_fd = wfd; - usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, IS_XFERIN(transfer) ? POLLIN : POLLOUT); - - return LIBUSB_SUCCESS; -} - -static int usbdk_do_iso_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); - struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct winfd wfd; - TransferResult transferRes; - int i; - HANDLE sysHandle; - - transfer_priv->request.Buffer = (PVOID64)(uintptr_t)transfer->buffer; - transfer_priv->request.BufferLength = transfer->length; - transfer_priv->request.EndpointAddress = transfer->endpoint; - transfer_priv->request.TransferType = IsochronousTransferType; - transfer_priv->request.IsochronousPacketsArraySize = transfer->num_iso_packets; - transfer_priv->IsochronousPacketsArray = malloc(transfer->num_iso_packets * sizeof(ULONG64)); - transfer_priv->request.IsochronousPacketsArray = (PVOID64)(uintptr_t)transfer_priv->IsochronousPacketsArray; - if (!transfer_priv->IsochronousPacketsArray) { - usbi_err(ctx, "Allocation of IsochronousPacketsArray is failed, %s", windows_error_str(0)); - return LIBUSB_ERROR_IO; - } - - transfer_priv->IsochronousResultsArray = malloc(transfer->num_iso_packets * sizeof(USB_DK_ISO_TRANSFER_RESULT)); - transfer_priv->request.Result.IsochronousResultsArray = (PVOID64)(uintptr_t)transfer_priv->IsochronousResultsArray; - if (!transfer_priv->IsochronousResultsArray) { - usbi_err(ctx, "Allocation of isochronousResultsArray is failed, %s", windows_error_str(0)); - free(transfer_priv->IsochronousPacketsArray); - return LIBUSB_ERROR_IO; - } - - for (i = 0; i < transfer->num_iso_packets; i++) - transfer_priv->IsochronousPacketsArray[i] = transfer->iso_packet_desc[i].length; - - transfer_priv->pollable_fd = INVALID_WINFD; - - sysHandle = usbdk_helper.GetRedirectorSystemHandle(priv->redirector_handle); - - wfd = usbi_create_fd(sysHandle, IS_XFERIN(transfer) ? RW_READ : RW_WRITE, NULL, NULL); - // Always use the handle returned from usbi_create_fd (wfd.handle) - if (wfd.fd < 0) { - free(transfer_priv->IsochronousPacketsArray); - free(transfer_priv->IsochronousResultsArray); - return LIBUSB_ERROR_NO_MEM; - } - - if (IS_XFERIN(transfer)) - transferRes = usbdk_helper.ReadPipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); - else - transferRes = usbdk_helper.WritePipe(priv->redirector_handle, &transfer_priv->request, wfd.overlapped); - - switch (transferRes) { - case TransferSuccess: - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - break; - case TransferSuccessAsync: - break; - case TransferFailure: - usbi_err(ctx, "ReadPipe/WritePipe failed: %s", windows_error_str(0)); - usbi_free_fd(&wfd); - free(transfer_priv->IsochronousPacketsArray); - free(transfer_priv->IsochronousResultsArray); - return LIBUSB_ERROR_IO; - } - - transfer_priv->pollable_fd = wfd; - usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, IS_XFERIN(transfer) ? POLLIN : POLLOUT); - - return LIBUSB_SUCCESS; -} - -static int usbdk_submit_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - return usbdk_do_control_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - if (IS_XFEROUT(transfer) && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET)) - return LIBUSB_ERROR_NOT_SUPPORTED; //TODO: Check whether we can support this in UsbDk - else - return usbdk_do_bulk_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - return usbdk_do_iso_transfer(itransfer); - default: - usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -static int usbdk_abort_transfers(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct usbdk_device_priv *priv = _usbdk_device_priv(transfer->dev_handle->dev); - - if (!usbdk_helper.AbortPipe(priv->redirector_handle, transfer->endpoint)) { - usbi_err(ctx, "AbortPipe failed: %s", windows_error_str(0)); - return LIBUSB_ERROR_NO_DEVICE; - } - - return LIBUSB_SUCCESS; -} - -static int usbdk_cancel_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - // Control transfers cancelled by IoCancelXXX() API - // No special treatment needed - return LIBUSB_SUCCESS; - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - return usbdk_abort_transfers(itransfer); - default: - usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -int windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size) -{ - itransfer->transferred += io_size; - return LIBUSB_TRANSFER_COMPLETED; -} - -struct winfd *windows_get_fd(struct usbi_transfer *transfer) -{ - struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(transfer); - return &transfer_priv->pollable_fd; -} - -static DWORD usbdk_translate_usbd_status(USBD_STATUS UsbdStatus) -{ - if (USBD_SUCCESS(UsbdStatus)) - return NO_ERROR; - - switch (UsbdStatus) { - case USBD_STATUS_STALL_PID: - case USBD_STATUS_ENDPOINT_HALTED: - case USBD_STATUS_BAD_START_FRAME: - return ERROR_GEN_FAILURE; - case USBD_STATUS_TIMEOUT: - return ERROR_SEM_TIMEOUT; - case USBD_STATUS_CANCELED: - return ERROR_OPERATION_ABORTED; - default: - return ERROR_FUNCTION_FAILED; - } -} - -void windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size) -{ - if (HasOverlappedIoCompletedSync(pollable_fd->overlapped) // Handle async requests that completed synchronously first - || GetOverlappedResult(pollable_fd->handle, pollable_fd->overlapped, io_size, false)) { // Regular async overlapped - struct libusb_transfer *ltransfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(transfer); - struct usbdk_transfer_priv *transfer_priv = _usbdk_transfer_priv(transfer); - - if (ltransfer->type == LIBUSB_TRANSFER_TYPE_ISOCHRONOUS) { - int i; - for (i = 0; i < transfer_priv->request.IsochronousPacketsArraySize; i++) { - struct libusb_iso_packet_descriptor *lib_desc = <ransfer->iso_packet_desc[i]; - - switch (transfer_priv->IsochronousResultsArray[i].TransferResult) { - case STATUS_SUCCESS: - case STATUS_CANCELLED: - case STATUS_REQUEST_CANCELED: - lib_desc->status = LIBUSB_TRANSFER_COMPLETED; // == ERROR_SUCCESS - break; - default: - lib_desc->status = LIBUSB_TRANSFER_ERROR; // ERROR_UNKNOWN_EXCEPTION; - break; - } - - lib_desc->actual_length = (unsigned int)transfer_priv->IsochronousResultsArray[i].ActualLength; - } - } - - *io_size = (DWORD) transfer_priv->request.Result.GenResult.BytesTransferred; - *io_result = usbdk_translate_usbd_status((USBD_STATUS) transfer_priv->request.Result.GenResult.UsbdStatus); - } - else { - *io_result = GetLastError(); - } -} - -static int usbdk_clock_gettime(int clk_id, struct timespec *tp) -{ - return windows_clock_gettime(clk_id, tp); -} - -const struct usbi_os_backend usbdk_backend = { - "Windows", - USBI_CAP_HAS_HID_ACCESS, - usbdk_init, - usbdk_exit, - - usbdk_get_device_list, - NULL, - usbdk_open, - usbdk_close, - - usbdk_get_device_descriptor, - usbdk_get_active_config_descriptor, - usbdk_get_config_descriptor, - NULL, - - usbdk_get_configuration, - usbdk_set_configuration, - usbdk_claim_interface, - usbdk_release_interface, - - usbdk_set_interface_altsetting, - usbdk_clear_halt, - usbdk_reset_device, - - NULL, - NULL, - - NULL, // dev_mem_alloc() - NULL, // dev_mem_free() - - usbdk_kernel_driver_active, - usbdk_detach_kernel_driver, - usbdk_attach_kernel_driver, - - usbdk_destroy_device, - - usbdk_submit_transfer, - usbdk_cancel_transfer, - windows_clear_transfer_priv, - - windows_handle_events, - NULL, - - usbdk_clock_gettime, -#if defined(USBI_TIMERFD_AVAILABLE) - NULL, -#endif - sizeof(struct usbdk_device_priv), - 0, - sizeof(struct usbdk_transfer_priv), -}; - -#endif /* USE_USBDK */ diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_usbdk.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_usbdk.h deleted file mode 100644 index 04a9787f2d6b..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_usbdk.h +++ /dev/null @@ -1,146 +0,0 @@ -/* -* windows UsbDk backend for libusb 1.0 -* Copyright © 2014 Red Hat, Inc. - -* Authors: -* Dmitry Fleytman -* Pavel Gurvich -* -* This 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 2.1 of the License, or (at your option) any later version. -* -* This 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 this library; if not, write to the Free Software -* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#pragma once - -typedef struct tag_USB_DK_DEVICE_ID { - WCHAR DeviceID[MAX_DEVICE_ID_LEN]; - WCHAR InstanceID[MAX_DEVICE_ID_LEN]; -} USB_DK_DEVICE_ID, *PUSB_DK_DEVICE_ID; - -static inline void UsbDkFillIDStruct(USB_DK_DEVICE_ID *ID, PCWCHAR DeviceID, PCWCHAR InstanceID) -{ - wcsncpy_s(ID->DeviceID, DeviceID, MAX_DEVICE_ID_LEN); - wcsncpy_s(ID->InstanceID, InstanceID, MAX_DEVICE_ID_LEN); -} - -typedef struct tag_USB_DK_DEVICE_INFO { - USB_DK_DEVICE_ID ID; - ULONG64 FilterID; - ULONG64 Port; - ULONG64 Speed; - USB_DEVICE_DESCRIPTOR DeviceDescriptor; -} USB_DK_DEVICE_INFO, *PUSB_DK_DEVICE_INFO; - -typedef struct tag_USB_DK_CONFIG_DESCRIPTOR_REQUEST { - USB_DK_DEVICE_ID ID; - ULONG64 Index; -} USB_DK_CONFIG_DESCRIPTOR_REQUEST, *PUSB_DK_CONFIG_DESCRIPTOR_REQUEST; - -typedef struct tag_USB_DK_ISO_TRANSFER_RESULT { - ULONG64 ActualLength; - ULONG64 TransferResult; -} USB_DK_ISO_TRANSFER_RESULT, *PUSB_DK_ISO_TRANSFER_RESULT; - -typedef struct tag_USB_DK_GEN_TRANSFER_RESULT { - ULONG64 BytesTransferred; - ULONG64 UsbdStatus; // USBD_STATUS code -} USB_DK_GEN_TRANSFER_RESULT, *PUSB_DK_GEN_TRANSFER_RESULT; - -typedef struct tag_USB_DK_TRANSFER_RESULT { - USB_DK_GEN_TRANSFER_RESULT GenResult; - PVOID64 IsochronousResultsArray; // array of USB_DK_ISO_TRANSFER_RESULT -} USB_DK_TRANSFER_RESULT, *PUSB_DK_TRANSFER_RESULT; - -typedef struct tag_USB_DK_TRANSFER_REQUEST { - ULONG64 EndpointAddress; - PVOID64 Buffer; - ULONG64 BufferLength; - ULONG64 TransferType; - ULONG64 IsochronousPacketsArraySize; - PVOID64 IsochronousPacketsArray; - - USB_DK_TRANSFER_RESULT Result; -} USB_DK_TRANSFER_REQUEST, *PUSB_DK_TRANSFER_REQUEST; - -typedef enum { - TransferFailure = 0, - TransferSuccess, - TransferSuccessAsync -} TransferResult; - -typedef enum { - NoSpeed = 0, - LowSpeed, - FullSpeed, - HighSpeed, - SuperSpeed -} USB_DK_DEVICE_SPEED; - -typedef enum { - ControlTransferType, - BulkTransferType, - IntertuptTransferType, - IsochronousTransferType -} USB_DK_TRANSFER_TYPE; - -typedef BOOL (__cdecl *USBDK_GET_DEVICES_LIST)( - PUSB_DK_DEVICE_INFO *DeviceInfo, - PULONG DeviceNumber -); -typedef void (__cdecl *USBDK_RELEASE_DEVICES_LIST)( - PUSB_DK_DEVICE_INFO DeviceInfo -); -typedef HANDLE (__cdecl *USBDK_START_REDIRECT)( - PUSB_DK_DEVICE_ID DeviceId -); -typedef BOOL (__cdecl *USBDK_STOP_REDIRECT)( - HANDLE DeviceHandle -); -typedef BOOL (__cdecl *USBDK_GET_CONFIGURATION_DESCRIPTOR)( - PUSB_DK_CONFIG_DESCRIPTOR_REQUEST Request, - PUSB_CONFIGURATION_DESCRIPTOR *Descriptor, - PULONG Length -); -typedef void (__cdecl *USBDK_RELEASE_CONFIGURATION_DESCRIPTOR)( - PUSB_CONFIGURATION_DESCRIPTOR Descriptor -); -typedef TransferResult (__cdecl *USBDK_WRITE_PIPE)( - HANDLE DeviceHandle, - PUSB_DK_TRANSFER_REQUEST Request, - LPOVERLAPPED lpOverlapped -); -typedef TransferResult (__cdecl *USBDK_READ_PIPE)( - HANDLE DeviceHandle, - PUSB_DK_TRANSFER_REQUEST Request, - LPOVERLAPPED lpOverlapped -); -typedef BOOL (__cdecl *USBDK_ABORT_PIPE)( - HANDLE DeviceHandle, - ULONG64 PipeAddress -); -typedef BOOL (__cdecl *USBDK_RESET_PIPE)( - HANDLE DeviceHandle, - ULONG64 PipeAddress -); -typedef BOOL (__cdecl *USBDK_SET_ALTSETTING)( - HANDLE DeviceHandle, - ULONG64 InterfaceIdx, - ULONG64 AltSettingIdx -); -typedef BOOL (__cdecl *USBDK_RESET_DEVICE)( - HANDLE DeviceHandle -); -typedef HANDLE (__cdecl *USBDK_GET_REDIRECTOR_SYSTEM_HANDLE)( - HANDLE DeviceHandle -); diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_winusb.c b/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_winusb.c deleted file mode 100644 index 0dce0ea6cb68..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_winusb.c +++ /dev/null @@ -1,4290 +0,0 @@ -/* - * windows backend for libusb 1.0 - * Copyright © 2009-2012 Pete Batard - * With contributions from Michael Plante, Orin Eman et al. - * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer - * HID Reports IOCTLs inspired from HIDAPI by Alan Ott, Signal 11 Software - * Hash table functions adapted from glibc, by Ulrich Drepper et al. - * Major code testing contribution by Xiaofan Chen - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#if !defined(USE_USBDK) - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "libusbi.h" -#include "poll_windows.h" -#include "windows_winusb.h" - -#define HANDLE_VALID(h) (((h) != 0) && ((h) != INVALID_HANDLE_VALUE)) - -// The 2 macros below are used in conjunction with safe loops. -#define LOOP_CHECK(fcall) \ - { \ - r = fcall; \ - if (r != LIBUSB_SUCCESS) \ - continue; \ - } -#define LOOP_BREAK(err) \ - { \ - r = err; \ - continue; \ - } - -// WinUSB-like API prototypes -static int winusbx_init(int sub_api, struct libusb_context *ctx); -static int winusbx_exit(int sub_api); -static int winusbx_open(int sub_api, struct libusb_device_handle *dev_handle); -static void winusbx_close(int sub_api, struct libusb_device_handle *dev_handle); -static int winusbx_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface); -static int winusbx_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); -static int winusbx_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); -static int winusbx_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer); -static int winusbx_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); -static int winusbx_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer); -static int winusbx_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); -static int winusbx_abort_transfers(int sub_api, struct usbi_transfer *itransfer); -static int winusbx_abort_control(int sub_api, struct usbi_transfer *itransfer); -static int winusbx_reset_device(int sub_api, struct libusb_device_handle *dev_handle); -static int winusbx_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); -// HID API prototypes -static int hid_init(int sub_api, struct libusb_context *ctx); -static int hid_exit(int sub_api); -static int hid_open(int sub_api, struct libusb_device_handle *dev_handle); -static void hid_close(int sub_api, struct libusb_device_handle *dev_handle); -static int hid_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); -static int hid_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); -static int hid_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); -static int hid_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer); -static int hid_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer); -static int hid_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); -static int hid_abort_transfers(int sub_api, struct usbi_transfer *itransfer); -static int hid_reset_device(int sub_api, struct libusb_device_handle *dev_handle); -static int hid_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); -// Composite API prototypes -static int composite_init(int sub_api, struct libusb_context *ctx); -static int composite_exit(int sub_api); -static int composite_open(int sub_api, struct libusb_device_handle *dev_handle); -static void composite_close(int sub_api, struct libusb_device_handle *dev_handle); -static int composite_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); -static int composite_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); -static int composite_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface); -static int composite_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer); -static int composite_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer); -static int composite_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer); -static int composite_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); -static int composite_abort_transfers(int sub_api, struct usbi_transfer *itransfer); -static int composite_abort_control(int sub_api, struct usbi_transfer *itransfer); -static int composite_reset_device(int sub_api, struct libusb_device_handle *dev_handle); -static int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); - - -// Global variables -int windows_version = WINDOWS_UNDEFINED; -static char windows_version_str[128] = "Undefined"; -// Concurrency -static int concurrent_usage = -1; -static usbi_mutex_t autoclaim_lock; -// API globals -#define CHECK_WINUSBX_AVAILABLE(sub_api) \ - do { \ - if (sub_api == SUB_API_NOTSET) \ - sub_api = priv->sub_api; \ - if (!WinUSBX[sub_api].initialized) \ - return LIBUSB_ERROR_ACCESS; \ - } while(0) - -static HMODULE WinUSBX_handle = NULL; -static struct winusb_interface WinUSBX[SUB_API_MAX]; -static const char *sub_api_name[SUB_API_MAX] = WINUSBX_DRV_NAMES; - -static bool api_hid_available = false; -#define CHECK_HID_AVAILABLE \ - do { \ - if (!api_hid_available) \ - return LIBUSB_ERROR_ACCESS; \ - } while (0) - -static inline BOOLEAN guid_eq(const GUID *guid1, const GUID *guid2) -{ - if ((guid1 != NULL) && (guid2 != NULL)) - return (memcmp(guid1, guid2, sizeof(GUID)) == 0); - - return false; -} - -#if defined(ENABLE_LOGGING) -static char *guid_to_string(const GUID *guid) -{ - static char guid_string[MAX_GUID_STRING_LENGTH]; - - if (guid == NULL) - return NULL; - - sprintf(guid_string, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", - (unsigned int)guid->Data1, guid->Data2, guid->Data3, - guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], - guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]); - - return guid_string; -} -#endif - -/* - * Sanitize Microsoft's paths: convert to uppercase, add prefix and fix backslashes. - * Return an allocated sanitized string or NULL on error. - */ -static char *sanitize_path(const char *path) -{ - const char root_prefix[] = { '\\', '\\', '.', '\\' }; - size_t j, size; - char *ret_path; - size_t add_root = 0; - - if (path == NULL) - return NULL; - - size = strlen(path) + 1; - - // Microsoft indiscriminately uses '\\?\', '\\.\', '##?#" or "##.#" for root prefixes. - if (!((size > 3) && (((path[0] == '\\') && (path[1] == '\\') && (path[3] == '\\')) - || ((path[0] == '#') && (path[1] == '#') && (path[3] == '#'))))) { - add_root = sizeof(root_prefix); - size += add_root; - } - - ret_path = malloc(size); - if (ret_path == NULL) - return NULL; - - strcpy(&ret_path[add_root], path); - - // Ensure consistency with root prefix - memcpy(ret_path, root_prefix, sizeof(root_prefix)); - - // Same goes for '\' and '#' after the root prefix. Ensure '#' is used - for (j = sizeof(root_prefix); j < size; j++) { - ret_path[j] = (char)toupper((int)ret_path[j]); // Fix case too - if (ret_path[j] == '\\') - ret_path[j] = '#'; - } - - return ret_path; -} - -/* - * Cfgmgr32, OLE32 and SetupAPI DLL functions - */ -static int init_dlls(void) -{ - DLL_GET_HANDLE(Cfgmgr32); - DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Parent, TRUE); - DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Child, TRUE); - DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Sibling, TRUE); - DLL_LOAD_FUNC(Cfgmgr32, CM_Get_Device_IDA, TRUE); - - // Prefixed to avoid conflict with header files - DLL_GET_HANDLE(AdvAPI32); - DLL_LOAD_FUNC_PREFIXED(AdvAPI32, p, RegQueryValueExW, TRUE); - DLL_LOAD_FUNC_PREFIXED(AdvAPI32, p, RegCloseKey, TRUE); - - DLL_GET_HANDLE(Kernel32); - DLL_LOAD_FUNC_PREFIXED(Kernel32, p, IsWow64Process, FALSE); - - DLL_GET_HANDLE(OLE32); - DLL_LOAD_FUNC_PREFIXED(OLE32, p, CLSIDFromString, TRUE); - - DLL_GET_HANDLE(SetupAPI); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetClassDevsA, TRUE); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiEnumDeviceInfo, TRUE); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiEnumDeviceInterfaces, TRUE); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetDeviceInterfaceDetailA, TRUE); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiDestroyDeviceInfoList, TRUE); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiOpenDevRegKey, TRUE); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiGetDeviceRegistryPropertyA, TRUE); - DLL_LOAD_FUNC_PREFIXED(SetupAPI, p, SetupDiOpenDeviceInterfaceRegKey, TRUE); - - return LIBUSB_SUCCESS; -} - -static void exit_dlls(void) -{ - DLL_FREE_HANDLE(Cfgmgr32); - DLL_FREE_HANDLE(AdvAPI32); - DLL_FREE_HANDLE(Kernel32); - DLL_FREE_HANDLE(OLE32); - DLL_FREE_HANDLE(SetupAPI); -} - -/* - * enumerate interfaces for the whole USB class - * - * Parameters: - * dev_info: a pointer to a dev_info list - * dev_info_data: a pointer to an SP_DEVINFO_DATA to be filled (or NULL if not needed) - * usb_class: the generic USB class for which to retrieve interface details - * index: zero based index of the interface in the device info list - * - * Note: it is the responsibility of the caller to free the DEVICE_INTERFACE_DETAIL_DATA - * structure returned and call this function repeatedly using the same guid (with an - * incremented index starting at zero) until all interfaces have been returned. - */ -static bool get_devinfo_data(struct libusb_context *ctx, - HDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const char *usb_class, unsigned _index) -{ - if (_index <= 0) { - *dev_info = pSetupDiGetClassDevsA(NULL, usb_class, NULL, DIGCF_PRESENT|DIGCF_ALLCLASSES); - if (*dev_info == INVALID_HANDLE_VALUE) - return false; - } - - dev_info_data->cbSize = sizeof(SP_DEVINFO_DATA); - if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { - if (GetLastError() != ERROR_NO_MORE_ITEMS) - usbi_err(ctx, "Could not obtain device info data for index %u: %s", - _index, windows_error_str(0)); - - pSetupDiDestroyDeviceInfoList(*dev_info); - *dev_info = INVALID_HANDLE_VALUE; - return false; - } - return true; -} - -/* - * enumerate interfaces for a specific GUID - * - * Parameters: - * dev_info: a pointer to a dev_info list - * dev_info_data: a pointer to an SP_DEVINFO_DATA to be filled (or NULL if not needed) - * guid: the GUID for which to retrieve interface details - * index: zero based index of the interface in the device info list - * - * Note: it is the responsibility of the caller to free the DEVICE_INTERFACE_DETAIL_DATA - * structure returned and call this function repeatedly using the same guid (with an - * incremented index starting at zero) until all interfaces have been returned. - */ -static SP_DEVICE_INTERFACE_DETAIL_DATA_A *get_interface_details(struct libusb_context *ctx, - HDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const GUID *guid, unsigned _index) -{ - SP_DEVICE_INTERFACE_DATA dev_interface_data; - SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details; - DWORD size; - - if (_index <= 0) - *dev_info = pSetupDiGetClassDevsA(guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); - - if (dev_info_data != NULL) { - dev_info_data->cbSize = sizeof(SP_DEVINFO_DATA); - if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { - if (GetLastError() != ERROR_NO_MORE_ITEMS) - usbi_err(ctx, "Could not obtain device info data for index %u: %s", - _index, windows_error_str(0)); - - pSetupDiDestroyDeviceInfoList(*dev_info); - *dev_info = INVALID_HANDLE_VALUE; - return NULL; - } - } - - dev_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); - if (!pSetupDiEnumDeviceInterfaces(*dev_info, NULL, guid, _index, &dev_interface_data)) { - if (GetLastError() != ERROR_NO_MORE_ITEMS) - usbi_err(ctx, "Could not obtain interface data for index %u: %s", - _index, windows_error_str(0)); - - pSetupDiDestroyDeviceInfoList(*dev_info); - *dev_info = INVALID_HANDLE_VALUE; - return NULL; - } - - // Read interface data (dummy + actual) to access the device path - if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, NULL, 0, &size, NULL)) { - // The dummy call should fail with ERROR_INSUFFICIENT_BUFFER - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { - usbi_err(ctx, "could not access interface data (dummy) for index %u: %s", - _index, windows_error_str(0)); - goto err_exit; - } - } else { - usbi_err(ctx, "program assertion failed - http://msdn.microsoft.com/en-us/library/ms792901.aspx is wrong."); - goto err_exit; - } - - dev_interface_details = calloc(1, size); - if (dev_interface_details == NULL) { - usbi_err(ctx, "could not allocate interface data for index %u.", _index); - goto err_exit; - } - - dev_interface_details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); - if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, - dev_interface_details, size, &size, NULL)) { - usbi_err(ctx, "could not access interface data (actual) for index %u: %s", - _index, windows_error_str(0)); - } - - return dev_interface_details; - -err_exit: - pSetupDiDestroyDeviceInfoList(*dev_info); - *dev_info = INVALID_HANDLE_VALUE; - return NULL; -} - -/* For libusb0 filter */ -static SP_DEVICE_INTERFACE_DETAIL_DATA_A *get_interface_details_filter(struct libusb_context *ctx, - HDEVINFO *dev_info, SP_DEVINFO_DATA *dev_info_data, const GUID *guid, unsigned _index, char *filter_path) -{ - SP_DEVICE_INTERFACE_DATA dev_interface_data; - SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details; - DWORD size; - - if (_index <= 0) - *dev_info = pSetupDiGetClassDevsA(guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); - - if (dev_info_data != NULL) { - dev_info_data->cbSize = sizeof(SP_DEVINFO_DATA); - if (!pSetupDiEnumDeviceInfo(*dev_info, _index, dev_info_data)) { - if (GetLastError() != ERROR_NO_MORE_ITEMS) - usbi_err(ctx, "Could not obtain device info data for index %u: %s", - _index, windows_error_str(0)); - - pSetupDiDestroyDeviceInfoList(*dev_info); - *dev_info = INVALID_HANDLE_VALUE; - return NULL; - } - } - - dev_interface_data.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); - if (!pSetupDiEnumDeviceInterfaces(*dev_info, NULL, guid, _index, &dev_interface_data)) { - if (GetLastError() != ERROR_NO_MORE_ITEMS) - usbi_err(ctx, "Could not obtain interface data for index %u: %s", - _index, windows_error_str(0)); - - pSetupDiDestroyDeviceInfoList(*dev_info); - *dev_info = INVALID_HANDLE_VALUE; - return NULL; - } - - // Read interface data (dummy + actual) to access the device path - if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, NULL, 0, &size, NULL)) { - // The dummy call should fail with ERROR_INSUFFICIENT_BUFFER - if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) { - usbi_err(ctx, "could not access interface data (dummy) for index %u: %s", - _index, windows_error_str(0)); - goto err_exit; - } - } else { - usbi_err(ctx, "program assertion failed - http://msdn.microsoft.com/en-us/library/ms792901.aspx is wrong."); - goto err_exit; - } - - dev_interface_details = calloc(1, size); - if (dev_interface_details == NULL) { - usbi_err(ctx, "could not allocate interface data for index %u.", _index); - goto err_exit; - } - - dev_interface_details->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A); - if (!pSetupDiGetDeviceInterfaceDetailA(*dev_info, &dev_interface_data, dev_interface_details, size, &size, NULL)) - usbi_err(ctx, "could not access interface data (actual) for index %u: %s", - _index, windows_error_str(0)); - - // [trobinso] lookup the libusb0 symbolic index. - if (dev_interface_details) { - HKEY hkey_device_interface = pSetupDiOpenDeviceInterfaceRegKey(*dev_info, &dev_interface_data, 0, KEY_READ); - if (hkey_device_interface != INVALID_HANDLE_VALUE) { - DWORD libusb0_symboliclink_index = 0; - DWORD value_length = sizeof(DWORD); - DWORD value_type = 0; - LONG status; - - status = pRegQueryValueExW(hkey_device_interface, L"LUsb0", NULL, &value_type, - (LPBYTE)&libusb0_symboliclink_index, &value_length); - if (status == ERROR_SUCCESS) { - if (libusb0_symboliclink_index < 256) { - // libusb0.sys is connected to this device instance. - // If the the device interface guid is {F9F3FF14-AE21-48A0-8A25-8011A7A931D9} then it's a filter. - sprintf(filter_path, "\\\\.\\libusb0-%04u", (unsigned int)libusb0_symboliclink_index); - usbi_dbg("assigned libusb0 symbolic link %s", filter_path); - } else { - // libusb0.sys was connected to this device instance at one time; but not anymore. - } - } - pRegCloseKey(hkey_device_interface); - } - } - - return dev_interface_details; - -err_exit: - pSetupDiDestroyDeviceInfoList(*dev_info); - *dev_info = INVALID_HANDLE_VALUE; - return NULL; -} - -/* - * Returns the session ID of a device's nth level ancestor - * If there's no device at the nth level, return 0 - */ -static unsigned long get_ancestor_session_id(DWORD devinst, unsigned level) -{ - DWORD parent_devinst; - unsigned long session_id; - char *sanitized_path; - char path[MAX_PATH_LENGTH]; - unsigned i; - - if (level < 1) - return 0; - - for (i = 0; i < level; i++) { - if (CM_Get_Parent(&parent_devinst, devinst, 0) != CR_SUCCESS) - return 0; - devinst = parent_devinst; - } - - if (CM_Get_Device_IDA(devinst, path, MAX_PATH_LENGTH, 0) != CR_SUCCESS) - return 0; - - // TODO: (post hotplug): try without sanitizing - sanitized_path = sanitize_path(path); - if (sanitized_path == NULL) - return 0; - - session_id = htab_hash(sanitized_path); - free(sanitized_path); - return session_id; -} - -/* - * Determine which interface the given endpoint address belongs to - */ -static int get_interface_by_endpoint(struct libusb_config_descriptor *conf_desc, uint8_t ep) -{ - const struct libusb_interface *intf; - const struct libusb_interface_descriptor *intf_desc; - int i, j, k; - - for (i = 0; i < conf_desc->bNumInterfaces; i++) { - intf = &conf_desc->interface[i]; - for (j = 0; j < intf->num_altsetting; j++) { - intf_desc = &intf->altsetting[j]; - for (k = 0; k < intf_desc->bNumEndpoints; k++) { - if (intf_desc->endpoint[k].bEndpointAddress == ep) { - usbi_dbg("found endpoint %02X on interface %d", intf_desc->bInterfaceNumber, i); - return intf_desc->bInterfaceNumber; - } - } - } - } - - usbi_dbg("endpoint %02X not found on any interface", ep); - return LIBUSB_ERROR_NOT_FOUND; -} - -/* - * Populate the endpoints addresses of the device_priv interface helper structs - */ -static int windows_assign_endpoints(struct libusb_device_handle *dev_handle, int iface, int altsetting) -{ - int i, r; - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - struct libusb_config_descriptor *conf_desc; - const struct libusb_interface_descriptor *if_desc; - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - - r = libusb_get_active_config_descriptor(dev_handle->dev, &conf_desc); - if (r != LIBUSB_SUCCESS) { - usbi_warn(ctx, "could not read config descriptor: error %d", r); - return r; - } - - if_desc = &conf_desc->interface[iface].altsetting[altsetting]; - safe_free(priv->usb_interface[iface].endpoint); - - if (if_desc->bNumEndpoints == 0) { - usbi_dbg("no endpoints found for interface %d", iface); - libusb_free_config_descriptor(conf_desc); - return LIBUSB_SUCCESS; - } - - priv->usb_interface[iface].endpoint = malloc(if_desc->bNumEndpoints); - if (priv->usb_interface[iface].endpoint == NULL) { - libusb_free_config_descriptor(conf_desc); - return LIBUSB_ERROR_NO_MEM; - } - - priv->usb_interface[iface].nb_endpoints = if_desc->bNumEndpoints; - for (i = 0; i < if_desc->bNumEndpoints; i++) { - priv->usb_interface[iface].endpoint[i] = if_desc->endpoint[i].bEndpointAddress; - usbi_dbg("(re)assigned endpoint %02X to interface %d", priv->usb_interface[iface].endpoint[i], iface); - } - libusb_free_config_descriptor(conf_desc); - - // Extra init may be required to configure endpoints - return priv->apib->configure_endpoints(SUB_API_NOTSET, dev_handle, iface); -} - -// Lookup for a match in the list of API driver names -// return -1 if not found, driver match number otherwise -static int get_sub_api(char *driver, int api) -{ - int i; - const char sep_str[2] = {LIST_SEPARATOR, 0}; - char *tok, *tmp_str; - size_t len = strlen(driver); - - if (len == 0) - return SUB_API_NOTSET; - - tmp_str = _strdup(driver); - if (tmp_str == NULL) - return SUB_API_NOTSET; - - tok = strtok(tmp_str, sep_str); - while (tok != NULL) { - for (i = 0; i < usb_api_backend[api].nb_driver_names; i++) { - if (_stricmp(tok, usb_api_backend[api].driver_name_list[i]) == 0) { - free(tmp_str); - return i; - } - } - tok = strtok(NULL, sep_str); - } - - free(tmp_str); - return SUB_API_NOTSET; -} - -/* - * auto-claiming and auto-release helper functions - */ -static int auto_claim(struct libusb_transfer *transfer, int *interface_number, int api_type) -{ - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv( - transfer->dev_handle); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - int current_interface = *interface_number; - int r = LIBUSB_SUCCESS; - - switch(api_type) { - case USB_API_WINUSBX: - case USB_API_HID: - break; - default: - return LIBUSB_ERROR_INVALID_PARAM; - } - - usbi_mutex_lock(&autoclaim_lock); - if (current_interface < 0) { // No serviceable interface was found - for (current_interface = 0; current_interface < USB_MAXINTERFACES; current_interface++) { - // Must claim an interface of the same API type - if ((priv->usb_interface[current_interface].apib->id == api_type) - && (libusb_claim_interface(transfer->dev_handle, current_interface) == LIBUSB_SUCCESS)) { - usbi_dbg("auto-claimed interface %d for control request", current_interface); - if (handle_priv->autoclaim_count[current_interface] != 0) - usbi_warn(ctx, "program assertion failed - autoclaim_count was nonzero"); - handle_priv->autoclaim_count[current_interface]++; - break; - } - } - if (current_interface == USB_MAXINTERFACES) { - usbi_err(ctx, "could not auto-claim any interface"); - r = LIBUSB_ERROR_NOT_FOUND; - } - } else { - // If we have a valid interface that was autoclaimed, we must increment - // its autoclaim count so that we can prevent an early release. - if (handle_priv->autoclaim_count[current_interface] != 0) - handle_priv->autoclaim_count[current_interface]++; - } - usbi_mutex_unlock(&autoclaim_lock); - - *interface_number = current_interface; - return r; -} - -static void auto_release(struct usbi_transfer *itransfer) -{ - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - libusb_device_handle *dev_handle = transfer->dev_handle; - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - int r; - - usbi_mutex_lock(&autoclaim_lock); - if (handle_priv->autoclaim_count[transfer_priv->interface_number] > 0) { - handle_priv->autoclaim_count[transfer_priv->interface_number]--; - if (handle_priv->autoclaim_count[transfer_priv->interface_number] == 0) { - r = libusb_release_interface(dev_handle, transfer_priv->interface_number); - if (r == LIBUSB_SUCCESS) - usbi_dbg("auto-released interface %d", transfer_priv->interface_number); - else - usbi_dbg("failed to auto-release interface %d (%s)", - transfer_priv->interface_number, libusb_error_name((enum libusb_error)r)); - } - } - usbi_mutex_unlock(&autoclaim_lock); -} - -/* Windows version dtection */ -static BOOL is_x64(void) -{ - BOOL ret = FALSE; - - // Detect if we're running a 32 or 64 bit system - if (sizeof(uintptr_t) < 8) { - if (pIsWow64Process != NULL) - pIsWow64Process(GetCurrentProcess(), &ret); - } else { - ret = TRUE; - } - - return ret; -} - -static void get_windows_version(void) -{ - OSVERSIONINFOEXA vi, vi2; - const char *arch, *w = NULL; - unsigned major, minor; - ULONGLONG major_equal, minor_equal; - BOOL ws; - - memset(&vi, 0, sizeof(vi)); - vi.dwOSVersionInfoSize = sizeof(vi); - if (!GetVersionExA((OSVERSIONINFOA *)&vi)) { - memset(&vi, 0, sizeof(vi)); - vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA); - if (!GetVersionExA((OSVERSIONINFOA *)&vi)) - return; - } - - if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT) { - if (vi.dwMajorVersion > 6 || (vi.dwMajorVersion == 6 && vi.dwMinorVersion >= 2)) { - // Starting with Windows 8.1 Preview, GetVersionEx() does no longer report the actual OS version - // See: http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx - - major_equal = VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL); - for (major = vi.dwMajorVersion; major <= 9; major++) { - memset(&vi2, 0, sizeof(vi2)); - vi2.dwOSVersionInfoSize = sizeof(vi2); - vi2.dwMajorVersion = major; - if (!VerifyVersionInfoA(&vi2, VER_MAJORVERSION, major_equal)) - continue; - - if (vi.dwMajorVersion < major) { - vi.dwMajorVersion = major; - vi.dwMinorVersion = 0; - } - - minor_equal = VerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL); - for (minor = vi.dwMinorVersion; minor <= 9; minor++) { - memset(&vi2, 0, sizeof(vi2)); - vi2.dwOSVersionInfoSize = sizeof(vi2); - vi2.dwMinorVersion = minor; - if (!VerifyVersionInfoA(&vi2, VER_MINORVERSION, minor_equal)) - continue; - - vi.dwMinorVersion = minor; - break; - } - - break; - } - } - - if (vi.dwMajorVersion <= 0xf && vi.dwMinorVersion <= 0xf) { - ws = (vi.wProductType <= VER_NT_WORKSTATION); - windows_version = vi.dwMajorVersion << 4 | vi.dwMinorVersion; - switch (windows_version) { - case 0x50: w = "2000"; break; - case 0x51: w = "XP"; break; - case 0x52: w = "2003"; break; - case 0x60: w = (ws ? "Vista" : "2008"); break; - case 0x61: w = (ws ? "7" : "2008_R2"); break; - case 0x62: w = (ws ? "8" : "2012"); break; - case 0x63: w = (ws ? "8.1" : "2012_R2"); break; - case 0x64: w = (ws ? "10" : "2015"); break; - default: - if (windows_version < 0x50) - windows_version = WINDOWS_UNSUPPORTED; - else - w = "11 or later"; - break; - } - } - } - - arch = is_x64() ? "64-bit" : "32-bit"; - - if (w == NULL) - snprintf(windows_version_str, sizeof(windows_version_str), "%s %u.%u %s", - (vi.dwPlatformId == VER_PLATFORM_WIN32_NT ? "NT" : "??"), - (unsigned int)vi.dwMajorVersion, (unsigned int)vi.dwMinorVersion, arch); - else if (vi.wServicePackMinor) - snprintf(windows_version_str, sizeof(windows_version_str), "%s SP%u.%u %s", - w, vi.wServicePackMajor, vi.wServicePackMinor, arch); - else if (vi.wServicePackMajor) - snprintf(windows_version_str, sizeof(windows_version_str), "%s SP%u %s", - w, vi.wServicePackMajor, arch); - else - snprintf(windows_version_str, sizeof(windows_version_str), "%s %s", - w, arch); -} - -/* - * init: libusb backend init function - * - * This function enumerates the HCDs (Host Controller Drivers) and populates our private HCD list - * In our implementation, we equate Windows' "HCD" to libusb's "bus". Note that bus is zero indexed. - * HCDs are not expected to change after init (might not hold true for hot pluggable USB PCI card?) - */ -static int windows_init(struct libusb_context *ctx) -{ - int i, r = LIBUSB_ERROR_OTHER; - HANDLE semaphore; - char sem_name[11 + 8 + 1]; // strlen("libusb_init") + (32-bit hex PID) + '\0' - - sprintf(sem_name, "libusb_init%08X", (unsigned int)(GetCurrentProcessId() & 0xFFFFFFFF)); - semaphore = CreateSemaphoreA(NULL, 1, 1, sem_name); - if (semaphore == NULL) { - usbi_err(ctx, "could not create semaphore: %s", windows_error_str(0)); - return LIBUSB_ERROR_NO_MEM; - } - - // A successful wait brings our semaphore count to 0 (unsignaled) - // => any concurent wait stalls until the semaphore's release - if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { - usbi_err(ctx, "failure to access semaphore: %s", windows_error_str(0)); - CloseHandle(semaphore); - return LIBUSB_ERROR_NO_MEM; - } - - // NB: concurrent usage supposes that init calls are equally balanced with - // exit calls. If init is called more than exit, we will not exit properly - if (++concurrent_usage == 0) { // First init? - get_windows_version(); - usbi_dbg("Windows %s", windows_version_str); - - if (windows_version == WINDOWS_UNSUPPORTED) { - usbi_err(ctx, "This version of Windows is NOT supported"); - r = LIBUSB_ERROR_NOT_SUPPORTED; - goto init_exit; - } - - // We need a lock for proper auto-release - usbi_mutex_init(&autoclaim_lock); - - // Initialize pollable file descriptors - init_polling(); - - // Load DLL imports - if (init_dlls() != LIBUSB_SUCCESS) { - usbi_err(ctx, "could not resolve DLL functions"); - goto init_exit; - } - - // Initialize the low level APIs (we don't care about errors at this stage) - for (i = 0; i < USB_API_MAX; i++) - usb_api_backend[i].init(SUB_API_NOTSET, ctx); - - r = windows_common_init(ctx); - if (r) - goto init_exit; - } - // At this stage, either we went through full init successfully, or didn't need to - r = LIBUSB_SUCCESS; - -init_exit: // Holds semaphore here. - if (!concurrent_usage && r != LIBUSB_SUCCESS) { // First init failed? - for (i = 0; i < USB_API_MAX; i++) - usb_api_backend[i].exit(SUB_API_NOTSET); - exit_dlls(); - exit_polling(); - windows_common_exit(); - usbi_mutex_destroy(&autoclaim_lock); - } - - if (r != LIBUSB_SUCCESS) - --concurrent_usage; // Not expected to call libusb_exit if we failed. - - ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 - CloseHandle(semaphore); - return r; -} - -/* - * HCD (root) hubs need to have their device descriptor manually populated - * - * Note that, like Microsoft does in the device manager, we populate the - * Vendor and Device ID for HCD hubs with the ones from the PCI HCD device. - */ -static int force_hcd_device_descriptor(struct libusb_device *dev) -{ - struct windows_device_priv *parent_priv, *priv = _device_priv(dev); - struct libusb_context *ctx = DEVICE_CTX(dev); - int vid, pid; - - dev->num_configurations = 1; - priv->dev_descriptor.bLength = sizeof(USB_DEVICE_DESCRIPTOR); - priv->dev_descriptor.bDescriptorType = USB_DEVICE_DESCRIPTOR_TYPE; - priv->dev_descriptor.bNumConfigurations = 1; - priv->active_config = 1; - - if (dev->parent_dev == NULL) { - usbi_err(ctx, "program assertion failed - HCD hub has no parent"); - return LIBUSB_ERROR_NO_DEVICE; - } - - parent_priv = _device_priv(dev->parent_dev); - if (sscanf(parent_priv->path, "\\\\.\\PCI#VEN_%04x&DEV_%04x%*s", &vid, &pid) == 2) { - priv->dev_descriptor.idVendor = (uint16_t)vid; - priv->dev_descriptor.idProduct = (uint16_t)pid; - } else { - usbi_warn(ctx, "could not infer VID/PID of HCD hub from '%s'", parent_priv->path); - priv->dev_descriptor.idVendor = 0x1d6b; // Linux Foundation root hub - priv->dev_descriptor.idProduct = 1; - } - - return LIBUSB_SUCCESS; -} - -/* - * fetch and cache all the config descriptors through I/O - */ -static int cache_config_descriptors(struct libusb_device *dev, HANDLE hub_handle, char *device_id) -{ - DWORD size, ret_size; - struct libusb_context *ctx = DEVICE_CTX(dev); - struct windows_device_priv *priv = _device_priv(dev); - int r; - uint8_t i; - - USB_CONFIGURATION_DESCRIPTOR_SHORT cd_buf_short; // dummy request - PUSB_DESCRIPTOR_REQUEST cd_buf_actual = NULL; // actual request - PUSB_CONFIGURATION_DESCRIPTOR cd_data = NULL; - - if (dev->num_configurations == 0) - return LIBUSB_ERROR_INVALID_PARAM; - - priv->config_descriptor = calloc(dev->num_configurations, sizeof(unsigned char *)); - if (priv->config_descriptor == NULL) - return LIBUSB_ERROR_NO_MEM; - - for (i = 0; i < dev->num_configurations; i++) - priv->config_descriptor[i] = NULL; - - for (i = 0, r = LIBUSB_SUCCESS; ; i++) { - // safe loop: release all dynamic resources - safe_free(cd_buf_actual); - - // safe loop: end of loop condition - if ((i >= dev->num_configurations) || (r != LIBUSB_SUCCESS)) - break; - - size = sizeof(USB_CONFIGURATION_DESCRIPTOR_SHORT); - memset(&cd_buf_short, 0, size); - - cd_buf_short.req.ConnectionIndex = (ULONG)priv->port; - cd_buf_short.req.SetupPacket.bmRequest = LIBUSB_ENDPOINT_IN; - cd_buf_short.req.SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR; - cd_buf_short.req.SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8) | i; - cd_buf_short.req.SetupPacket.wIndex = 0; - cd_buf_short.req.SetupPacket.wLength = (USHORT)(size - sizeof(USB_DESCRIPTOR_REQUEST)); - - // Dummy call to get the required data size. Initial failures are reported as info rather - // than error as they can occur for non-penalizing situations, such as with some hubs. - // coverity[tainted_data_argument] - if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, &cd_buf_short, size, - &cd_buf_short, size, &ret_size, NULL)) { - usbi_info(ctx, "could not access configuration descriptor (dummy) for '%s': %s", device_id, windows_error_str(0)); - LOOP_BREAK(LIBUSB_ERROR_IO); - } - - if ((ret_size != size) || (cd_buf_short.data.wTotalLength < sizeof(USB_CONFIGURATION_DESCRIPTOR))) { - usbi_info(ctx, "unexpected configuration descriptor size (dummy) for '%s'.", device_id); - LOOP_BREAK(LIBUSB_ERROR_IO); - } - - size = sizeof(USB_DESCRIPTOR_REQUEST) + cd_buf_short.data.wTotalLength; - cd_buf_actual = calloc(1, size); - if (cd_buf_actual == NULL) { - usbi_err(ctx, "could not allocate configuration descriptor buffer for '%s'.", device_id); - LOOP_BREAK(LIBUSB_ERROR_NO_MEM); - } - - // Actual call - cd_buf_actual->ConnectionIndex = (ULONG)priv->port; - cd_buf_actual->SetupPacket.bmRequest = LIBUSB_ENDPOINT_IN; - cd_buf_actual->SetupPacket.bRequest = USB_REQUEST_GET_DESCRIPTOR; - cd_buf_actual->SetupPacket.wValue = (USB_CONFIGURATION_DESCRIPTOR_TYPE << 8) | i; - cd_buf_actual->SetupPacket.wIndex = 0; - cd_buf_actual->SetupPacket.wLength = (USHORT)(size - sizeof(USB_DESCRIPTOR_REQUEST)); - - if (!DeviceIoControl(hub_handle, IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, cd_buf_actual, size, - cd_buf_actual, size, &ret_size, NULL)) { - usbi_err(ctx, "could not access configuration descriptor (actual) for '%s': %s", device_id, windows_error_str(0)); - LOOP_BREAK(LIBUSB_ERROR_IO); - } - - cd_data = (PUSB_CONFIGURATION_DESCRIPTOR)((UCHAR *)cd_buf_actual + sizeof(USB_DESCRIPTOR_REQUEST)); - - if ((size != ret_size) || (cd_data->wTotalLength != cd_buf_short.data.wTotalLength)) { - usbi_err(ctx, "unexpected configuration descriptor size (actual) for '%s'.", device_id); - LOOP_BREAK(LIBUSB_ERROR_IO); - } - - if (cd_data->bDescriptorType != USB_CONFIGURATION_DESCRIPTOR_TYPE) { - usbi_err(ctx, "not a configuration descriptor for '%s'", device_id); - LOOP_BREAK(LIBUSB_ERROR_IO); - } - - usbi_dbg("cached config descriptor %d (bConfigurationValue=%u, %u bytes)", - i, cd_data->bConfigurationValue, cd_data->wTotalLength); - - // Cache the descriptor - priv->config_descriptor[i] = malloc(cd_data->wTotalLength); - if (priv->config_descriptor[i] == NULL) - LOOP_BREAK(LIBUSB_ERROR_NO_MEM); - memcpy(priv->config_descriptor[i], cd_data, cd_data->wTotalLength); - } - return LIBUSB_SUCCESS; -} - -/* - * Populate a libusb device structure - */ -static int init_device(struct libusb_device *dev, struct libusb_device *parent_dev, - uint8_t port_number, char *device_id, DWORD devinst) -{ - HANDLE handle; - DWORD size; - USB_NODE_CONNECTION_INFORMATION_EX conn_info; - USB_NODE_CONNECTION_INFORMATION_EX_V2 conn_info_v2; - struct windows_device_priv *priv, *parent_priv; - struct libusb_context *ctx; - struct libusb_device *tmp_dev; - unsigned long tmp_id; - unsigned i; - - if ((dev == NULL) || (parent_dev == NULL)) - return LIBUSB_ERROR_NOT_FOUND; - - ctx = DEVICE_CTX(dev); - priv = _device_priv(dev); - parent_priv = _device_priv(parent_dev); - if (parent_priv->apib->id != USB_API_HUB) { - usbi_warn(ctx, "parent for device '%s' is not a hub", device_id); - return LIBUSB_ERROR_NOT_FOUND; - } - - // It is possible for the parent hub not to have been initialized yet - // If that's the case, lookup the ancestors to set the bus number - if (parent_dev->bus_number == 0) { - for (i = 2; ; i++) { - tmp_id = get_ancestor_session_id(devinst, i); - if (tmp_id == 0) - break; - - tmp_dev = usbi_get_device_by_session_id(ctx, tmp_id); - if (tmp_dev == NULL) - continue; - - if (tmp_dev->bus_number != 0) { - usbi_dbg("got bus number from ancestor #%u", i); - parent_dev->bus_number = tmp_dev->bus_number; - libusb_unref_device(tmp_dev); - break; - } - - libusb_unref_device(tmp_dev); - } - } - - if (parent_dev->bus_number == 0) { - usbi_err(ctx, "program assertion failed: unable to find ancestor bus number for '%s'", device_id); - return LIBUSB_ERROR_NOT_FOUND; - } - - dev->bus_number = parent_dev->bus_number; - priv->port = port_number; - dev->port_number = port_number; - priv->depth = parent_priv->depth + 1; - dev->parent_dev = parent_dev; - - // If the device address is already set, we can stop here - if (dev->device_address != 0) - return LIBUSB_SUCCESS; - - memset(&conn_info, 0, sizeof(conn_info)); - if (priv->depth != 0) { // Not a HCD hub - handle = CreateFileA(parent_priv->path, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, - FILE_FLAG_OVERLAPPED, NULL); - if (handle == INVALID_HANDLE_VALUE) { - usbi_warn(ctx, "could not open hub %s: %s", parent_priv->path, windows_error_str(0)); - return LIBUSB_ERROR_ACCESS; - } - - size = sizeof(conn_info); - conn_info.ConnectionIndex = (ULONG)port_number; - // coverity[tainted_data_argument] - if (!DeviceIoControl(handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX, &conn_info, size, - &conn_info, size, &size, NULL)) { - usbi_warn(ctx, "could not get node connection information for device '%s': %s", - device_id, windows_error_str(0)); - CloseHandle(handle); - return LIBUSB_ERROR_NO_DEVICE; - } - - if (conn_info.ConnectionStatus == NoDeviceConnected) { - usbi_err(ctx, "device '%s' is no longer connected!", device_id); - CloseHandle(handle); - return LIBUSB_ERROR_NO_DEVICE; - } - - memcpy(&priv->dev_descriptor, &(conn_info.DeviceDescriptor), sizeof(USB_DEVICE_DESCRIPTOR)); - dev->num_configurations = priv->dev_descriptor.bNumConfigurations; - priv->active_config = conn_info.CurrentConfigurationValue; - usbi_dbg("found %u configurations (active conf: %u)", dev->num_configurations, priv->active_config); - - // If we can't read the config descriptors, just set the number of confs to zero - if (cache_config_descriptors(dev, handle, device_id) != LIBUSB_SUCCESS) { - dev->num_configurations = 0; - priv->dev_descriptor.bNumConfigurations = 0; - } - - // In their great wisdom, Microsoft decided to BREAK the USB speed report between Windows 7 and Windows 8 - if (windows_version >= WINDOWS_8) { - memset(&conn_info_v2, 0, sizeof(conn_info_v2)); - size = sizeof(conn_info_v2); - conn_info_v2.ConnectionIndex = (ULONG)port_number; - conn_info_v2.Length = size; - conn_info_v2.SupportedUsbProtocols.Usb300 = 1; - if (!DeviceIoControl(handle, IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2, - &conn_info_v2, size, &conn_info_v2, size, &size, NULL)) { - usbi_warn(ctx, "could not get node connection information (V2) for device '%s': %s", - device_id, windows_error_str(0)); - } else if (conn_info_v2.Flags.DeviceIsOperatingAtSuperSpeedOrHigher) { - conn_info.Speed = 3; - } - } - - CloseHandle(handle); - - if (conn_info.DeviceAddress > UINT8_MAX) - usbi_err(ctx, "program assertion failed: device address overflow"); - - dev->device_address = (uint8_t)conn_info.DeviceAddress + 1; - if (dev->device_address == 1) - usbi_err(ctx, "program assertion failed: device address collision with root hub"); - - switch (conn_info.Speed) { - case 0: dev->speed = LIBUSB_SPEED_LOW; break; - case 1: dev->speed = LIBUSB_SPEED_FULL; break; - case 2: dev->speed = LIBUSB_SPEED_HIGH; break; - case 3: dev->speed = LIBUSB_SPEED_SUPER; break; - default: - usbi_warn(ctx, "Got unknown device speed %u", conn_info.Speed); - break; - } - } else { - dev->device_address = 1; // root hubs are set to use device number 1 - force_hcd_device_descriptor(dev); - } - - usbi_sanitize_device(dev); - - usbi_dbg("(bus: %u, addr: %u, depth: %u, port: %u): '%s'", - dev->bus_number, dev->device_address, priv->depth, priv->port, device_id); - - return LIBUSB_SUCCESS; -} - -// Returns the api type, or 0 if not found/unsupported -static void get_api_type(struct libusb_context *ctx, HDEVINFO *dev_info, - SP_DEVINFO_DATA *dev_info_data, int *api, int *sub_api) -{ - // Precedence for filter drivers vs driver is in the order of this array - struct driver_lookup lookup[3] = { - {"\0\0", SPDRP_SERVICE, "driver"}, - {"\0\0", SPDRP_UPPERFILTERS, "upper filter driver"}, - {"\0\0", SPDRP_LOWERFILTERS, "lower filter driver"} - }; - DWORD size, reg_type; - unsigned k, l; - int i, j; - - *api = USB_API_UNSUPPORTED; - *sub_api = SUB_API_NOTSET; - - // Check the service & filter names to know the API we should use - for (k = 0; k < 3; k++) { - if (pSetupDiGetDeviceRegistryPropertyA(*dev_info, dev_info_data, lookup[k].reg_prop, - ®_type, (BYTE *)lookup[k].list, MAX_KEY_LENGTH, &size)) { - // Turn the REG_SZ SPDRP_SERVICE into REG_MULTI_SZ - if (lookup[k].reg_prop == SPDRP_SERVICE) - // our buffers are MAX_KEY_LENGTH + 1 so we can overflow if needed - lookup[k].list[strlen(lookup[k].list) + 1] = 0; - - // MULTI_SZ is a pain to work with. Turn it into something much more manageable - // NB: none of the driver names we check against contain LIST_SEPARATOR, - // (currently ';'), so even if an unsuported one does, it's not an issue - for (l = 0; (lookup[k].list[l] != 0) || (lookup[k].list[l + 1] != 0); l++) { - if (lookup[k].list[l] == 0) - lookup[k].list[l] = LIST_SEPARATOR; - } - usbi_dbg("%s(s): %s", lookup[k].designation, lookup[k].list); - } else { - if (GetLastError() != ERROR_INVALID_DATA) - usbi_dbg("could not access %s: %s", lookup[k].designation, windows_error_str(0)); - lookup[k].list[0] = 0; - } - } - - for (i = 1; i < USB_API_MAX; i++) { - for (k = 0; k < 3; k++) { - j = get_sub_api(lookup[k].list, i); - if (j >= 0) { - usbi_dbg("matched %s name against %s", lookup[k].designation, - (i != USB_API_WINUSBX) ? usb_api_backend[i].designation : sub_api_name[j]); - *api = i; - *sub_api = j; - return; - } - } - } -} - -static int set_composite_interface(struct libusb_context *ctx, struct libusb_device *dev, - char *dev_interface_path, char *device_id, int api, int sub_api) -{ - unsigned i; - struct windows_device_priv *priv = _device_priv(dev); - int interface_number; - - if (priv->apib->id != USB_API_COMPOSITE) { - usbi_err(ctx, "program assertion failed: '%s' is not composite", device_id); - return LIBUSB_ERROR_NO_DEVICE; - } - - // Because MI_## are not necessarily in sequential order (some composite - // devices will have only MI_00 & MI_03 for instance), we retrieve the actual - // interface number from the path's MI value - interface_number = 0; - for (i = 0; device_id[i] != 0; ) { - if ((device_id[i++] == 'M') && (device_id[i++] == 'I') - && (device_id[i++] == '_')) { - interface_number = (device_id[i++] - '0') * 10; - interface_number += device_id[i] - '0'; - break; - } - } - - if (device_id[i] == 0) - usbi_warn(ctx, "failure to read interface number for %s. Using default value %d", - device_id, interface_number); - - if (priv->usb_interface[interface_number].path != NULL) { - if (api == USB_API_HID) { - // HID devices can have multiple collections (COL##) for each MI_## interface - usbi_dbg("interface[%d] already set - ignoring HID collection: %s", - interface_number, device_id); - return LIBUSB_ERROR_ACCESS; - } - // In other cases, just use the latest data - safe_free(priv->usb_interface[interface_number].path); - } - - usbi_dbg("interface[%d] = %s", interface_number, dev_interface_path); - priv->usb_interface[interface_number].path = dev_interface_path; - priv->usb_interface[interface_number].apib = &usb_api_backend[api]; - priv->usb_interface[interface_number].sub_api = sub_api; - if ((api == USB_API_HID) && (priv->hid == NULL)) { - priv->hid = calloc(1, sizeof(struct hid_device_priv)); - if (priv->hid == NULL) - return LIBUSB_ERROR_NO_MEM; - } - - return LIBUSB_SUCCESS; -} - -static int set_hid_interface(struct libusb_context *ctx, struct libusb_device *dev, - char *dev_interface_path) -{ - int i; - struct windows_device_priv *priv = _device_priv(dev); - - if (priv->hid == NULL) { - usbi_err(ctx, "program assertion failed: parent is not HID"); - return LIBUSB_ERROR_NO_DEVICE; - } else if (priv->hid->nb_interfaces == USB_MAXINTERFACES) { - usbi_err(ctx, "program assertion failed: max USB interfaces reached for HID device"); - return LIBUSB_ERROR_NO_DEVICE; - } - - for (i = 0; i < priv->hid->nb_interfaces; i++) { - if ((priv->usb_interface[i].path != NULL) && strcmp(priv->usb_interface[i].path, dev_interface_path) == 0) { - usbi_dbg("interface[%d] already set to %s", i, dev_interface_path); - return LIBUSB_ERROR_ACCESS; - } - } - - priv->usb_interface[priv->hid->nb_interfaces].path = dev_interface_path; - priv->usb_interface[priv->hid->nb_interfaces].apib = &usb_api_backend[USB_API_HID]; - usbi_dbg("interface[%u] = %s", priv->hid->nb_interfaces, dev_interface_path); - priv->hid->nb_interfaces++; - return LIBUSB_SUCCESS; -} - -/* - * get_device_list: libusb backend device enumeration function - */ -static int windows_get_device_list(struct libusb_context *ctx, struct discovered_devs **_discdevs) -{ - struct discovered_devs *discdevs; - HDEVINFO dev_info = { 0 }; - const char *usb_class[] = {"USB", "NUSB3", "IUSB3", "IARUSB3"}; - SP_DEVINFO_DATA dev_info_data = { 0 }; - SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL; - GUID hid_guid; -#define MAX_ENUM_GUIDS 64 - const GUID *guid[MAX_ENUM_GUIDS]; -#define HCD_PASS 0 -#define HUB_PASS 1 -#define GEN_PASS 2 -#define DEV_PASS 3 -#define HID_PASS 4 - int r = LIBUSB_SUCCESS; - int api, sub_api; - size_t class_index = 0; - unsigned int nb_guids, pass, i, j, ancestor; - char path[MAX_PATH_LENGTH]; - char strbuf[MAX_PATH_LENGTH]; - struct libusb_device *dev, *parent_dev; - struct windows_device_priv *priv, *parent_priv; - char *dev_interface_path = NULL; - char *dev_id_path = NULL; - unsigned long session_id; - DWORD size, reg_type, port_nr, install_state; - HKEY key; - WCHAR guid_string_w[MAX_GUID_STRING_LENGTH]; - GUID *if_guid; - LONG s; - // Keep a list of newly allocated devs to unref - libusb_device **unref_list, **new_unref_list; - unsigned int unref_size = 64; - unsigned int unref_cur = 0; - - // PASS 1 : (re)enumerate HCDs (allows for HCD hotplug) - // PASS 2 : (re)enumerate HUBS - // PASS 3 : (re)enumerate generic USB devices (including driverless) - // and list additional USB device interface GUIDs to explore - // PASS 4 : (re)enumerate master USB devices that have a device interface - // PASS 5+: (re)enumerate device interfaced GUIDs (including HID) and - // set the device interfaces. - - // Init the GUID table - guid[HCD_PASS] = &GUID_DEVINTERFACE_USB_HOST_CONTROLLER; - guid[HUB_PASS] = &GUID_DEVINTERFACE_USB_HUB; - guid[GEN_PASS] = NULL; - guid[DEV_PASS] = &GUID_DEVINTERFACE_USB_DEVICE; - HidD_GetHidGuid(&hid_guid); - guid[HID_PASS] = &hid_guid; - nb_guids = HID_PASS + 1; - - unref_list = calloc(unref_size, sizeof(libusb_device *)); - if (unref_list == NULL) - return LIBUSB_ERROR_NO_MEM; - - for (pass = 0; ((pass < nb_guids) && (r == LIBUSB_SUCCESS)); pass++) { -//#define ENUM_DEBUG -#if defined(ENABLE_LOGGING) && defined(ENUM_DEBUG) - const char *passname[] = { "HCD", "HUB", "GEN", "DEV", "HID", "EXT" }; - usbi_dbg("#### PROCESSING %ss %s", passname[(pass <= HID_PASS) ? pass : (HID_PASS + 1)], - (pass != GEN_PASS) ? guid_to_string(guid[pass]) : ""); -#endif - for (i = 0; ; i++) { - // safe loop: free up any (unprotected) dynamic resource - // NB: this is always executed before breaking the loop - safe_free(dev_interface_details); - safe_free(dev_interface_path); - safe_free(dev_id_path); - priv = parent_priv = NULL; - dev = parent_dev = NULL; - - // Safe loop: end of loop conditions - if (r != LIBUSB_SUCCESS) - break; - - if ((pass == HCD_PASS) && (i == UINT8_MAX)) { - usbi_warn(ctx, "program assertion failed - found more than %d buses, skipping the rest.", UINT8_MAX); - break; - } - - if (pass != GEN_PASS) { - // Except for GEN, all passes deal with device interfaces - dev_interface_details = get_interface_details(ctx, &dev_info, &dev_info_data, guid[pass], i); - if (dev_interface_details == NULL) - break; - - dev_interface_path = sanitize_path(dev_interface_details->DevicePath); - if (dev_interface_path == NULL) { - usbi_warn(ctx, "could not sanitize device interface path for '%s'", dev_interface_details->DevicePath); - continue; - } - } else { - // Workaround for a Nec/Renesas USB 3.0 driver bug where root hubs are - // being listed under the "NUSB3" PnP Symbolic Name rather than "USB". - // The Intel USB 3.0 driver behaves similar, but uses "IUSB3" - // The Intel Alpine Ridge USB 3.1 driver uses "IARUSB3" - for (; class_index < ARRAYSIZE(usb_class); class_index++) { - if (get_devinfo_data(ctx, &dev_info, &dev_info_data, usb_class[class_index], i)) - break; - i = 0; - } - if (class_index >= ARRAYSIZE(usb_class)) - break; - } - - // Read the Device ID path. This is what we'll use as UID - // Note that if the device is plugged in a different port or hub, the Device ID changes - if (CM_Get_Device_IDA(dev_info_data.DevInst, path, sizeof(path), 0) != CR_SUCCESS) { - usbi_warn(ctx, "could not read the device id path for devinst %X, skipping", - (unsigned int)dev_info_data.DevInst); - continue; - } - - dev_id_path = sanitize_path(path); - if (dev_id_path == NULL) { - usbi_warn(ctx, "could not sanitize device id path for devinst %X, skipping", - (unsigned int)dev_info_data.DevInst); - continue; - } -#ifdef ENUM_DEBUG - usbi_dbg("PRO: %s", dev_id_path); -#endif - - // The SPDRP_ADDRESS for USB devices is the device port number on the hub - port_nr = 0; - if ((pass >= HUB_PASS) && (pass <= GEN_PASS)) { - if ((!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_ADDRESS, - ®_type, (BYTE *)&port_nr, 4, &size)) || (size != 4)) { - usbi_warn(ctx, "could not retrieve port number for device '%s', skipping: %s", - dev_id_path, windows_error_str(0)); - continue; - } - } - - // Set API to use or get additional data from generic pass - api = USB_API_UNSUPPORTED; - sub_api = SUB_API_NOTSET; - switch (pass) { - case HCD_PASS: - break; - case GEN_PASS: - // We use the GEN pass to detect driverless devices... - size = sizeof(strbuf); - if (!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_DRIVER, - ®_type, (BYTE *)strbuf, size, &size)) { - usbi_info(ctx, "The following device has no driver: '%s'", dev_id_path); - usbi_info(ctx, "libusb will not be able to access it."); - } - // ...and to add the additional device interface GUIDs - key = pSetupDiOpenDevRegKey(dev_info, &dev_info_data, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ); - if (key != INVALID_HANDLE_VALUE) { - size = sizeof(guid_string_w); - s = pRegQueryValueExW(key, L"DeviceInterfaceGUIDs", NULL, ®_type, - (BYTE *)guid_string_w, &size); - pRegCloseKey(key); - if (s == ERROR_SUCCESS) { - if (nb_guids >= MAX_ENUM_GUIDS) { - // If this assert is ever reported, grow a GUID table dynamically - usbi_err(ctx, "program assertion failed: too many GUIDs"); - LOOP_BREAK(LIBUSB_ERROR_OVERFLOW); - } - if_guid = calloc(1, sizeof(GUID)); - if (if_guid == NULL) { - usbi_err(ctx, "could not calloc for if_guid: not enough memory"); - LOOP_BREAK(LIBUSB_ERROR_NO_MEM); - } - pCLSIDFromString(guid_string_w, if_guid); - guid[nb_guids++] = if_guid; - usbi_dbg("extra GUID: %s", guid_to_string(if_guid)); - } - } - break; - case HID_PASS: - api = USB_API_HID; - break; - default: - // Get the API type (after checking that the driver installation is OK) - if ((!pSetupDiGetDeviceRegistryPropertyA(dev_info, &dev_info_data, SPDRP_INSTALL_STATE, - ®_type, (BYTE *)&install_state, 4, &size)) || (size != 4)) { - usbi_warn(ctx, "could not detect installation state of driver for '%s': %s", - dev_id_path, windows_error_str(0)); - } else if (install_state != 0) { - usbi_warn(ctx, "driver for device '%s' is reporting an issue (code: %u) - skipping", - dev_id_path, (unsigned int)install_state); - continue; - } - get_api_type(ctx, &dev_info, &dev_info_data, &api, &sub_api); - break; - } - - // Find parent device (for the passes that need it) - switch (pass) { - case HCD_PASS: - case DEV_PASS: - case HUB_PASS: - break; - default: - // Go through the ancestors until we see a face we recognize - parent_dev = NULL; - for (ancestor = 1; parent_dev == NULL; ancestor++) { - session_id = get_ancestor_session_id(dev_info_data.DevInst, ancestor); - if (session_id == 0) - break; - - parent_dev = usbi_get_device_by_session_id(ctx, session_id); - } - - if (parent_dev == NULL) { - usbi_dbg("unlisted ancestor for '%s' (non USB HID, newly connected, etc.) - ignoring", dev_id_path); - continue; - } - - parent_priv = _device_priv(parent_dev); - // virtual USB devices are also listed during GEN - don't process these yet - if ((pass == GEN_PASS) && (parent_priv->apib->id != USB_API_HUB)) { - libusb_unref_device(parent_dev); - continue; - } - - break; - } - - // Create new or match existing device, using the (hashed) device_id as session id - if (pass <= DEV_PASS) { // For subsequent passes, we'll lookup the parent - // These are the passes that create "new" devices - session_id = htab_hash(dev_id_path); - dev = usbi_get_device_by_session_id(ctx, session_id); - if (dev == NULL) { - if (pass == DEV_PASS) { - // This can occur if the OS only reports a newly plugged device after we started enum - usbi_warn(ctx, "'%s' was only detected in late pass (newly connected device?)" - " - ignoring", dev_id_path); - continue; - } - - usbi_dbg("allocating new device for session [%lX]", session_id); - dev = usbi_alloc_device(ctx, session_id); - if (dev == NULL) - LOOP_BREAK(LIBUSB_ERROR_NO_MEM); - - priv = windows_device_priv_init(dev); - } else { - usbi_dbg("found existing device for session [%lX] (%u.%u)", - session_id, dev->bus_number, dev->device_address); - - priv = _device_priv(dev); - if ((parent_dev != NULL) && (dev->parent_dev != NULL)) { - if (dev->parent_dev != parent_dev) { - // It is possible for the actual parent device to not have existed at the - // time of enumeration, so the currently assigned parent may in fact be a - // grandparent. If the devices differ, we assume the "new" parent device - // is in fact closer to the device. - usbi_dbg("updating parent device [session %lX -> %lX]", - dev->parent_dev->session_data, parent_dev->session_data); - libusb_unref_device(dev->parent_dev); - dev->parent_dev = parent_dev; - } else { - // We hold a reference to parent_dev instance, but this device already - // has a parent_dev reference (only one per child) - libusb_unref_device(parent_dev); - } - } - } - - // Keep track of devices that need unref - unref_list[unref_cur++] = dev; - if (unref_cur >= unref_size) { - unref_size += 64; - new_unref_list = usbi_reallocf(unref_list, unref_size * sizeof(libusb_device *)); - if (new_unref_list == NULL) { - usbi_err(ctx, "could not realloc list for unref - aborting."); - LOOP_BREAK(LIBUSB_ERROR_NO_MEM); - } else { - unref_list = new_unref_list; - } - } - } - - // Setup device - switch (pass) { - case HCD_PASS: - // If the hcd has already been setup, don't do it again - if (priv->path != NULL) - break; - dev->bus_number = (uint8_t)(i + 1); // bus 0 is reserved for disconnected - dev->device_address = 0; - dev->num_configurations = 0; - priv->apib = &usb_api_backend[USB_API_HUB]; - priv->sub_api = SUB_API_NOTSET; - priv->depth = UINT8_MAX; // Overflow to 0 for HCD Hubs - priv->path = dev_interface_path; - dev_interface_path = NULL; - break; - case HUB_PASS: - case DEV_PASS: - // If the device has already been setup, don't do it again - if (priv->path != NULL) - break; - // Take care of API initialization - priv->path = dev_interface_path; - dev_interface_path = NULL; - priv->apib = &usb_api_backend[api]; - priv->sub_api = sub_api; - switch(api) { - case USB_API_COMPOSITE: - case USB_API_HUB: - break; - case USB_API_HID: - priv->hid = calloc(1, sizeof(struct hid_device_priv)); - if (priv->hid == NULL) - LOOP_BREAK(LIBUSB_ERROR_NO_MEM); - - priv->hid->nb_interfaces = 0; - break; - default: - // For other devices, the first interface is the same as the device - priv->usb_interface[0].path = _strdup(priv->path); - if (priv->usb_interface[0].path == NULL) - usbi_warn(ctx, "could not duplicate interface path '%s'", priv->path); - // The following is needed if we want API calls to work for both simple - // and composite devices. - for (j = 0; j < USB_MAXINTERFACES; j++) - priv->usb_interface[j].apib = &usb_api_backend[api]; - - break; - } - break; - case GEN_PASS: - r = init_device(dev, parent_dev, (uint8_t)port_nr, dev_id_path, dev_info_data.DevInst); - if (r == LIBUSB_SUCCESS) { - // Append device to the list of discovered devices - discdevs = discovered_devs_append(*_discdevs, dev); - if (!discdevs) - LOOP_BREAK(LIBUSB_ERROR_NO_MEM); - - *_discdevs = discdevs; - } else if (r == LIBUSB_ERROR_NO_DEVICE) { - // This can occur if the device was disconnected but Windows hasn't - // refreshed its enumeration yet - in that case, we ignore the device - r = LIBUSB_SUCCESS; - } - break; - default: // HID_PASS and later - if (parent_priv->apib->id == USB_API_HID || parent_priv->apib->id == USB_API_COMPOSITE) { - if (parent_priv->apib->id == USB_API_HID) { - usbi_dbg("setting HID interface for [%lX]:", parent_dev->session_data); - r = set_hid_interface(ctx, parent_dev, dev_interface_path); - } else { - usbi_dbg("setting composite interface for [%lX]:", parent_dev->session_data); - r = set_composite_interface(ctx, parent_dev, dev_interface_path, dev_id_path, api, sub_api); - } - switch (r) { - case LIBUSB_SUCCESS: - dev_interface_path = NULL; - break; - case LIBUSB_ERROR_ACCESS: - // interface has already been set => make sure dev_interface_path is freed then - r = LIBUSB_SUCCESS; - break; - default: - LOOP_BREAK(r); - break; - } - } - libusb_unref_device(parent_dev); - break; - } - } - } - - // Free any additional GUIDs - for (pass = HID_PASS + 1; pass < nb_guids; pass++) - free((void *)guid[pass]); - - // Unref newly allocated devs - for (i = 0; i < unref_cur; i++) - libusb_unref_device(unref_list[i]); - free(unref_list); - - return r; -} - -/* - * exit: libusb backend deinitialization function - */ -static void windows_exit(void) -{ - int i; - HANDLE semaphore; - char sem_name[11 + 8 + 1]; // strlen("libusb_init") + (32-bit hex PID) + '\0' - - sprintf(sem_name, "libusb_init%08X", (unsigned int)(GetCurrentProcessId() & 0xFFFFFFFF)); - semaphore = CreateSemaphoreA(NULL, 1, 1, sem_name); - if (semaphore == NULL) - return; - - // A successful wait brings our semaphore count to 0 (unsignaled) - // => any concurent wait stalls until the semaphore release - if (WaitForSingleObject(semaphore, INFINITE) != WAIT_OBJECT_0) { - CloseHandle(semaphore); - return; - } - - // Only works if exits and inits are balanced exactly - if (--concurrent_usage < 0) { // Last exit - for (i = 0; i < USB_API_MAX; i++) - usb_api_backend[i].exit(SUB_API_NOTSET); - exit_dlls(); - exit_polling(); - windows_common_exit(); - usbi_mutex_destroy(&autoclaim_lock); - } - - ReleaseSemaphore(semaphore, 1, NULL); // increase count back to 1 - CloseHandle(semaphore); -} - -static int windows_get_device_descriptor(struct libusb_device *dev, unsigned char *buffer, int *host_endian) -{ - struct windows_device_priv *priv = _device_priv(dev); - - memcpy(buffer, &priv->dev_descriptor, DEVICE_DESC_LENGTH); - *host_endian = 0; - - return LIBUSB_SUCCESS; -} - -static int windows_get_config_descriptor(struct libusb_device *dev, uint8_t config_index, unsigned char *buffer, size_t len, int *host_endian) -{ - struct windows_device_priv *priv = _device_priv(dev); - PUSB_CONFIGURATION_DESCRIPTOR config_header; - size_t size; - - // config index is zero based - if (config_index >= dev->num_configurations) - return LIBUSB_ERROR_INVALID_PARAM; - - if ((priv->config_descriptor == NULL) || (priv->config_descriptor[config_index] == NULL)) - return LIBUSB_ERROR_NOT_FOUND; - - config_header = (PUSB_CONFIGURATION_DESCRIPTOR)priv->config_descriptor[config_index]; - - size = MIN(config_header->wTotalLength, len); - memcpy(buffer, priv->config_descriptor[config_index], size); - *host_endian = 0; - - return (int)size; -} - -static int windows_get_config_descriptor_by_value(struct libusb_device *dev, uint8_t bConfigurationValue, - unsigned char **buffer, int *host_endian) -{ - struct windows_device_priv *priv = _device_priv(dev); - PUSB_CONFIGURATION_DESCRIPTOR config_header; - uint8_t index; - - *buffer = NULL; - *host_endian = 0; - - if (priv->config_descriptor == NULL) - return LIBUSB_ERROR_NOT_FOUND; - - for (index = 0; index < dev->num_configurations; index++) { - config_header = (PUSB_CONFIGURATION_DESCRIPTOR)priv->config_descriptor[index]; - if (config_header->bConfigurationValue == bConfigurationValue) { - *buffer = priv->config_descriptor[index]; - return (int)config_header->wTotalLength; - } - } - - return LIBUSB_ERROR_NOT_FOUND; -} - -/* - * return the cached copy of the active config descriptor - */ -static int windows_get_active_config_descriptor(struct libusb_device *dev, unsigned char *buffer, size_t len, int *host_endian) -{ - struct windows_device_priv *priv = _device_priv(dev); - unsigned char *config_desc; - int r; - - if (priv->active_config == 0) - return LIBUSB_ERROR_NOT_FOUND; - - r = windows_get_config_descriptor_by_value(dev, priv->active_config, &config_desc, host_endian); - if (r < 0) - return r; - - len = MIN((size_t)r, len); - memcpy(buffer, config_desc, len); - return (int)len; -} - -static int windows_open(struct libusb_device_handle *dev_handle) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - - if (priv->apib == NULL) { - usbi_err(ctx, "program assertion failed - device is not initialized"); - return LIBUSB_ERROR_NO_DEVICE; - } - - return priv->apib->open(SUB_API_NOTSET, dev_handle); -} - -static void windows_close(struct libusb_device_handle *dev_handle) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - priv->apib->close(SUB_API_NOTSET, dev_handle); -} - -static int windows_get_configuration(struct libusb_device_handle *dev_handle, int *config) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - if (priv->active_config == 0) { - *config = 0; - return LIBUSB_ERROR_NOT_FOUND; - } - - *config = priv->active_config; - return LIBUSB_SUCCESS; -} - -/* - * from http://msdn.microsoft.com/en-us/library/ms793522.aspx: "The port driver - * does not currently expose a service that allows higher-level drivers to set - * the configuration." - */ -static int windows_set_configuration(struct libusb_device_handle *dev_handle, int config) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - int r = LIBUSB_SUCCESS; - - if (config >= USB_MAXCONFIG) - return LIBUSB_ERROR_INVALID_PARAM; - - r = libusb_control_transfer(dev_handle, LIBUSB_ENDPOINT_OUT | - LIBUSB_REQUEST_TYPE_STANDARD | LIBUSB_RECIPIENT_DEVICE, - LIBUSB_REQUEST_SET_CONFIGURATION, (uint16_t)config, - 0, NULL, 0, 1000); - - if (r == LIBUSB_SUCCESS) - priv->active_config = (uint8_t)config; - - return r; -} - -static int windows_claim_interface(struct libusb_device_handle *dev_handle, int iface) -{ - int r = LIBUSB_SUCCESS; - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - safe_free(priv->usb_interface[iface].endpoint); - priv->usb_interface[iface].nb_endpoints = 0; - - r = priv->apib->claim_interface(SUB_API_NOTSET, dev_handle, iface); - - if (r == LIBUSB_SUCCESS) - r = windows_assign_endpoints(dev_handle, iface, 0); - - return r; -} - -static int windows_set_interface_altsetting(struct libusb_device_handle *dev_handle, int iface, int altsetting) -{ - int r = LIBUSB_SUCCESS; - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - safe_free(priv->usb_interface[iface].endpoint); - priv->usb_interface[iface].nb_endpoints = 0; - - r = priv->apib->set_interface_altsetting(SUB_API_NOTSET, dev_handle, iface, altsetting); - - if (r == LIBUSB_SUCCESS) - r = windows_assign_endpoints(dev_handle, iface, altsetting); - - return r; -} - -static int windows_release_interface(struct libusb_device_handle *dev_handle, int iface) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - return priv->apib->release_interface(SUB_API_NOTSET, dev_handle, iface); -} - -static int windows_clear_halt(struct libusb_device_handle *dev_handle, unsigned char endpoint) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - return priv->apib->clear_halt(SUB_API_NOTSET, dev_handle, endpoint); -} - -static int windows_reset_device(struct libusb_device_handle *dev_handle) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - return priv->apib->reset_device(SUB_API_NOTSET, dev_handle); -} - -// The 3 functions below are unlikely to ever get supported on Windows -static int windows_kernel_driver_active(struct libusb_device_handle *dev_handle, int iface) -{ - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static int windows_attach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) -{ - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static int windows_detach_kernel_driver(struct libusb_device_handle *dev_handle, int iface) -{ - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static void windows_destroy_device(struct libusb_device *dev) -{ - windows_device_priv_release(dev); -} - -void windows_clear_transfer_priv(struct usbi_transfer *itransfer) -{ - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - - usbi_free_fd(&transfer_priv->pollable_fd); - safe_free(transfer_priv->hid_buffer); - // When auto claim is in use, attempt to release the auto-claimed interface - auto_release(itransfer); -} - -static int submit_bulk_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - int r; - - r = priv->apib->submit_bulk_transfer(SUB_API_NOTSET, itransfer); - if (r != LIBUSB_SUCCESS) - return r; - - usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, - (short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT)); - - return LIBUSB_SUCCESS; -} - -static int submit_iso_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - int r; - - r = priv->apib->submit_iso_transfer(SUB_API_NOTSET, itransfer); - if (r != LIBUSB_SUCCESS) - return r; - - usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, - (short)(IS_XFERIN(transfer) ? POLLIN : POLLOUT)); - - return LIBUSB_SUCCESS; -} - -static int submit_control_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - int r; - - r = priv->apib->submit_control_transfer(SUB_API_NOTSET, itransfer); - if (r != LIBUSB_SUCCESS) - return r; - - usbi_add_pollfd(ctx, transfer_priv->pollable_fd.fd, POLLIN); - - return LIBUSB_SUCCESS; -} - -static int windows_submit_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - return submit_control_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - if (IS_XFEROUT(transfer) && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET)) - return LIBUSB_ERROR_NOT_SUPPORTED; - return submit_bulk_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - return submit_iso_transfer(itransfer); - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - return LIBUSB_ERROR_NOT_SUPPORTED; - default: - usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -static int windows_abort_control(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - - return priv->apib->abort_control(SUB_API_NOTSET, itransfer); -} - -static int windows_abort_transfers(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - - return priv->apib->abort_transfers(SUB_API_NOTSET, itransfer); -} - -static int windows_cancel_transfer(struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - - switch (transfer->type) { - case LIBUSB_TRANSFER_TYPE_CONTROL: - return windows_abort_control(itransfer); - case LIBUSB_TRANSFER_TYPE_BULK: - case LIBUSB_TRANSFER_TYPE_INTERRUPT: - case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: - return windows_abort_transfers(itransfer); - case LIBUSB_TRANSFER_TYPE_BULK_STREAM: - return LIBUSB_ERROR_NOT_SUPPORTED; - default: - usbi_err(ITRANSFER_CTX(itransfer), "unknown endpoint type %d", transfer->type); - return LIBUSB_ERROR_INVALID_PARAM; - } -} - -int windows_copy_transfer_data(struct usbi_transfer *itransfer, uint32_t io_size) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - return priv->apib->copy_transfer_data(SUB_API_NOTSET, itransfer, io_size); -} - -struct winfd *windows_get_fd(struct usbi_transfer *transfer) -{ - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(transfer); - return &transfer_priv->pollable_fd; -} - -void windows_get_overlapped_result(struct usbi_transfer *transfer, struct winfd *pollable_fd, DWORD *io_result, DWORD *io_size) -{ - if (HasOverlappedIoCompletedSync(pollable_fd->overlapped)) { - *io_result = NO_ERROR; - *io_size = (DWORD)pollable_fd->overlapped->InternalHigh; - } else if (GetOverlappedResult(pollable_fd->handle, pollable_fd->overlapped, io_size, false)) { - // Regular async overlapped - *io_result = NO_ERROR; - } else { - *io_result = GetLastError(); - } -} - -// NB: MSVC6 does not support named initializers. -const struct usbi_os_backend windows_backend = { - "Windows", - USBI_CAP_HAS_HID_ACCESS, - windows_init, - windows_exit, - - windows_get_device_list, - NULL, /* hotplug_poll */ - windows_open, - windows_close, - - windows_get_device_descriptor, - windows_get_active_config_descriptor, - windows_get_config_descriptor, - windows_get_config_descriptor_by_value, - - windows_get_configuration, - windows_set_configuration, - windows_claim_interface, - windows_release_interface, - - windows_set_interface_altsetting, - windows_clear_halt, - windows_reset_device, - - NULL, /* alloc_streams */ - NULL, /* free_streams */ - - NULL, /* dev_mem_alloc */ - NULL, /* dev_mem_free */ - - windows_kernel_driver_active, - windows_detach_kernel_driver, - windows_attach_kernel_driver, - - windows_destroy_device, - - windows_submit_transfer, - windows_cancel_transfer, - windows_clear_transfer_priv, - - windows_handle_events, - NULL, - - windows_clock_gettime, -#if defined(USBI_TIMERFD_AVAILABLE) - NULL, -#endif - sizeof(struct windows_device_priv), - sizeof(struct windows_device_handle_priv), - sizeof(struct windows_transfer_priv), -}; - - -/* - * USB API backends - */ -static int unsupported_init(int sub_api, struct libusb_context *ctx) -{ - return LIBUSB_SUCCESS; -} - -static int unsupported_exit(int sub_api) -{ - return LIBUSB_SUCCESS; -} - -static int unsupported_open(int sub_api, struct libusb_device_handle *dev_handle) -{ - PRINT_UNSUPPORTED_API(open); -} - -static void unsupported_close(int sub_api, struct libusb_device_handle *dev_handle) -{ - usbi_dbg("unsupported API call for 'close'"); -} - -static int unsupported_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - PRINT_UNSUPPORTED_API(configure_endpoints); -} - -static int unsupported_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - PRINT_UNSUPPORTED_API(claim_interface); -} - -static int unsupported_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) -{ - PRINT_UNSUPPORTED_API(set_interface_altsetting); -} - -static int unsupported_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - PRINT_UNSUPPORTED_API(release_interface); -} - -static int unsupported_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) -{ - PRINT_UNSUPPORTED_API(clear_halt); -} - -static int unsupported_reset_device(int sub_api, struct libusb_device_handle *dev_handle) -{ - PRINT_UNSUPPORTED_API(reset_device); -} - -static int unsupported_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - PRINT_UNSUPPORTED_API(submit_bulk_transfer); -} - -static int unsupported_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - PRINT_UNSUPPORTED_API(submit_iso_transfer); -} - -static int unsupported_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - PRINT_UNSUPPORTED_API(submit_control_transfer); -} - -static int unsupported_abort_control(int sub_api, struct usbi_transfer *itransfer) -{ - PRINT_UNSUPPORTED_API(abort_control); -} - -static int unsupported_abort_transfers(int sub_api, struct usbi_transfer *itransfer) -{ - PRINT_UNSUPPORTED_API(abort_transfers); -} - -static int unsupported_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) -{ - PRINT_UNSUPPORTED_API(copy_transfer_data); -} - -static int common_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - return LIBUSB_SUCCESS; -} - -// These names must be uppercase -static const char *hub_driver_names[] = {"USBHUB", "USBHUB3", "USB3HUB", "NUSB3HUB", "RUSB3HUB", "FLXHCIH", "TIHUB3", "ETRONHUB3", "VIAHUB3", "ASMTHUB3", "IUSB3HUB", "VUSB3HUB", "AMDHUB30", "VHHUB", "AUSB3HUB"}; -static const char *composite_driver_names[] = {"USBCCGP"}; -static const char *winusbx_driver_names[] = WINUSBX_DRV_NAMES; -static const char *hid_driver_names[] = {"HIDUSB", "MOUHID", "KBDHID"}; -const struct windows_usb_api_backend usb_api_backend[USB_API_MAX] = { - { - USB_API_UNSUPPORTED, - "Unsupported API", - NULL, - 0, - unsupported_init, - unsupported_exit, - unsupported_open, - unsupported_close, - unsupported_configure_endpoints, - unsupported_claim_interface, - unsupported_set_interface_altsetting, - unsupported_release_interface, - unsupported_clear_halt, - unsupported_reset_device, - unsupported_submit_bulk_transfer, - unsupported_submit_iso_transfer, - unsupported_submit_control_transfer, - unsupported_abort_control, - unsupported_abort_transfers, - unsupported_copy_transfer_data, - }, - { - USB_API_HUB, - "HUB API", - hub_driver_names, - ARRAYSIZE(hub_driver_names), - unsupported_init, - unsupported_exit, - unsupported_open, - unsupported_close, - unsupported_configure_endpoints, - unsupported_claim_interface, - unsupported_set_interface_altsetting, - unsupported_release_interface, - unsupported_clear_halt, - unsupported_reset_device, - unsupported_submit_bulk_transfer, - unsupported_submit_iso_transfer, - unsupported_submit_control_transfer, - unsupported_abort_control, - unsupported_abort_transfers, - unsupported_copy_transfer_data, - }, - { - USB_API_COMPOSITE, - "Composite API", - composite_driver_names, - ARRAYSIZE(composite_driver_names), - composite_init, - composite_exit, - composite_open, - composite_close, - common_configure_endpoints, - composite_claim_interface, - composite_set_interface_altsetting, - composite_release_interface, - composite_clear_halt, - composite_reset_device, - composite_submit_bulk_transfer, - composite_submit_iso_transfer, - composite_submit_control_transfer, - composite_abort_control, - composite_abort_transfers, - composite_copy_transfer_data, - }, - { - USB_API_WINUSBX, - "WinUSB-like APIs", - winusbx_driver_names, - ARRAYSIZE(winusbx_driver_names), - winusbx_init, - winusbx_exit, - winusbx_open, - winusbx_close, - winusbx_configure_endpoints, - winusbx_claim_interface, - winusbx_set_interface_altsetting, - winusbx_release_interface, - winusbx_clear_halt, - winusbx_reset_device, - winusbx_submit_bulk_transfer, - unsupported_submit_iso_transfer, - winusbx_submit_control_transfer, - winusbx_abort_control, - winusbx_abort_transfers, - winusbx_copy_transfer_data, - }, - { - USB_API_HID, - "HID API", - hid_driver_names, - ARRAYSIZE(hid_driver_names), - hid_init, - hid_exit, - hid_open, - hid_close, - common_configure_endpoints, - hid_claim_interface, - hid_set_interface_altsetting, - hid_release_interface, - hid_clear_halt, - hid_reset_device, - hid_submit_bulk_transfer, - unsupported_submit_iso_transfer, - hid_submit_control_transfer, - hid_abort_transfers, - hid_abort_transfers, - hid_copy_transfer_data, - }, -}; - - -/* - * WinUSB-like (WinUSB, libusb0/libusbK through libusbk DLL) API functions - */ -#define WinUSBX_Set(fn) \ - do { \ - if (native_winusb) \ - WinUSBX[i].fn = (WinUsb_##fn##_t)GetProcAddress(h, "WinUsb_" #fn); \ - else \ - pLibK_GetProcAddress((PVOID *)&WinUSBX[i].fn, i, KUSB_FNID_##fn); \ - } while (0) - -static int winusbx_init(int sub_api, struct libusb_context *ctx) -{ - HMODULE h; - bool native_winusb; - int i; - KLIB_VERSION LibK_Version; - LibK_GetProcAddress_t pLibK_GetProcAddress = NULL; - LibK_GetVersion_t pLibK_GetVersion; - - h = LoadLibraryA("libusbK"); - - if (h == NULL) { - usbi_info(ctx, "libusbK DLL is not available, will use native WinUSB"); - h = LoadLibraryA("WinUSB"); - - if (h == NULL) { - usbi_warn(ctx, "WinUSB DLL is not available either, " - "you will not be able to access devices outside of enumeration"); - return LIBUSB_ERROR_NOT_FOUND; - } - } else { - usbi_dbg("using libusbK DLL for universal access"); - pLibK_GetVersion = (LibK_GetVersion_t)GetProcAddress(h, "LibK_GetVersion"); - if (pLibK_GetVersion != NULL) { - pLibK_GetVersion(&LibK_Version); - usbi_dbg("libusbK version: %d.%d.%d.%d", LibK_Version.Major, LibK_Version.Minor, - LibK_Version.Micro, LibK_Version.Nano); - } - pLibK_GetProcAddress = (LibK_GetProcAddress_t)GetProcAddress(h, "LibK_GetProcAddress"); - if (pLibK_GetProcAddress == NULL) { - usbi_err(ctx, "LibK_GetProcAddress() not found in libusbK DLL"); - FreeLibrary(h); - return LIBUSB_ERROR_NOT_FOUND; - } - } - - native_winusb = (pLibK_GetProcAddress == NULL); - for (i = SUB_API_LIBUSBK; i < SUB_API_MAX; i++) { - WinUSBX_Set(AbortPipe); - WinUSBX_Set(ControlTransfer); - WinUSBX_Set(FlushPipe); - WinUSBX_Set(Free); - WinUSBX_Set(GetAssociatedInterface); - WinUSBX_Set(GetCurrentAlternateSetting); - WinUSBX_Set(GetDescriptor); - WinUSBX_Set(GetOverlappedResult); - WinUSBX_Set(GetPipePolicy); - WinUSBX_Set(GetPowerPolicy); - WinUSBX_Set(Initialize); - WinUSBX_Set(QueryDeviceInformation); - WinUSBX_Set(QueryInterfaceSettings); - WinUSBX_Set(QueryPipe); - WinUSBX_Set(ReadPipe); - WinUSBX_Set(ResetPipe); - WinUSBX_Set(SetCurrentAlternateSetting); - WinUSBX_Set(SetPipePolicy); - WinUSBX_Set(SetPowerPolicy); - WinUSBX_Set(WritePipe); - if (!native_winusb) - WinUSBX_Set(ResetDevice); - - if (WinUSBX[i].Initialize != NULL) { - WinUSBX[i].initialized = true; - usbi_dbg("initalized sub API %s", sub_api_name[i]); - } else { - usbi_warn(ctx, "Failed to initalize sub API %s", sub_api_name[i]); - WinUSBX[i].initialized = false; - } - } - - WinUSBX_handle = h; - return LIBUSB_SUCCESS; -} - -static int winusbx_exit(int sub_api) -{ - if (WinUSBX_handle != NULL) { - FreeLibrary(WinUSBX_handle); - WinUSBX_handle = NULL; - - /* Reset the WinUSBX API structures */ - memset(&WinUSBX, 0, sizeof(WinUSBX)); - } - - return LIBUSB_SUCCESS; -} - -// NB: open and close must ensure that they only handle interface of -// the right API type, as these functions can be called wholesale from -// composite_open(), with interfaces belonging to different APIs -static int winusbx_open(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - - HANDLE file_handle; - int i; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - // WinUSB requires a separate handle for each interface - for (i = 0; i < USB_MAXINTERFACES; i++) { - if ((priv->usb_interface[i].path != NULL) - && (priv->usb_interface[i].apib->id == USB_API_WINUSBX)) { - file_handle = CreateFileA(priv->usb_interface[i].path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); - if (file_handle == INVALID_HANDLE_VALUE) { - usbi_err(ctx, "could not open device %s (interface %d): %s", priv->usb_interface[i].path, i, windows_error_str(0)); - switch(GetLastError()) { - case ERROR_FILE_NOT_FOUND: // The device was disconnected - return LIBUSB_ERROR_NO_DEVICE; - case ERROR_ACCESS_DENIED: - return LIBUSB_ERROR_ACCESS; - default: - return LIBUSB_ERROR_IO; - } - } - handle_priv->interface_handle[i].dev_handle = file_handle; - } - } - - return LIBUSB_SUCCESS; -} - -static void winusbx_close(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - HANDLE handle; - int i; - - if (sub_api == SUB_API_NOTSET) - sub_api = priv->sub_api; - - if (!WinUSBX[sub_api].initialized) - return; - - if (priv->apib->id == USB_API_COMPOSITE) { - // If this is a composite device, just free and close all WinUSB-like - // interfaces directly (each is independent and not associated with another) - for (i = 0; i < USB_MAXINTERFACES; i++) { - if (priv->usb_interface[i].apib->id == USB_API_WINUSBX) { - handle = handle_priv->interface_handle[i].api_handle; - if (HANDLE_VALID(handle)) - WinUSBX[sub_api].Free(handle); - - handle = handle_priv->interface_handle[i].dev_handle; - if (HANDLE_VALID(handle)) - CloseHandle(handle); - } - } - } else { - // If this is a WinUSB device, free all interfaces above interface 0, - // then free and close interface 0 last - for (i = 1; i < USB_MAXINTERFACES; i++) { - handle = handle_priv->interface_handle[i].api_handle; - if (HANDLE_VALID(handle)) - WinUSBX[sub_api].Free(handle); - } - handle = handle_priv->interface_handle[0].api_handle; - if (HANDLE_VALID(handle)) - WinUSBX[sub_api].Free(handle); - - handle = handle_priv->interface_handle[0].dev_handle; - if (HANDLE_VALID(handle)) - CloseHandle(handle); - } -} - -static int winusbx_configure_endpoints(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - HANDLE winusb_handle = handle_priv->interface_handle[iface].api_handle; - UCHAR policy; - ULONG timeout = 0; - uint8_t endpoint_address; - int i; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - // With handle and enpoints set (in parent), we can setup the default pipe properties - // see http://download.microsoft.com/download/D/1/D/D1DD7745-426B-4CC3-A269-ABBBE427C0EF/DVC-T705_DDC08.pptx - for (i = -1; i < priv->usb_interface[iface].nb_endpoints; i++) { - endpoint_address = (i == -1) ? 0 : priv->usb_interface[iface].endpoint[i]; - if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, - PIPE_TRANSFER_TIMEOUT, sizeof(ULONG), &timeout)) - usbi_dbg("failed to set PIPE_TRANSFER_TIMEOUT for control endpoint %02X", endpoint_address); - - if ((i == -1) || (sub_api == SUB_API_LIBUSB0)) - continue; // Other policies don't apply to control endpoint or libusb0 - - policy = false; - if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, - SHORT_PACKET_TERMINATE, sizeof(UCHAR), &policy)) - usbi_dbg("failed to disable SHORT_PACKET_TERMINATE for endpoint %02X", endpoint_address); - - if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, - IGNORE_SHORT_PACKETS, sizeof(UCHAR), &policy)) - usbi_dbg("failed to disable IGNORE_SHORT_PACKETS for endpoint %02X", endpoint_address); - - policy = true; - /* ALLOW_PARTIAL_READS must be enabled due to likely libusbK bug. See: - https://sourceforge.net/mailarchive/message.php?msg_id=29736015 */ - if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, - ALLOW_PARTIAL_READS, sizeof(UCHAR), &policy)) - usbi_dbg("failed to enable ALLOW_PARTIAL_READS for endpoint %02X", endpoint_address); - - if (!WinUSBX[sub_api].SetPipePolicy(winusb_handle, endpoint_address, - AUTO_CLEAR_STALL, sizeof(UCHAR), &policy)) - usbi_dbg("failed to enable AUTO_CLEAR_STALL for endpoint %02X", endpoint_address); - } - - return LIBUSB_SUCCESS; -} - -static int winusbx_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - bool is_using_usbccgp = (priv->apib->id == USB_API_COMPOSITE); - SP_DEVICE_INTERFACE_DETAIL_DATA_A *dev_interface_details = NULL; - HDEVINFO dev_info = INVALID_HANDLE_VALUE; - SP_DEVINFO_DATA dev_info_data; - char *dev_path_no_guid = NULL; - char filter_path[] = "\\\\.\\libusb0-0000"; - bool found_filter = false; - HANDLE file_handle, winusb_handle; - DWORD err; - int i; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - // If the device is composite, but using the default Windows composite parent driver (usbccgp) - // or if it's the first WinUSB-like interface, we get a handle through Initialize(). - if ((is_using_usbccgp) || (iface == 0)) { - // composite device (independent interfaces) or interface 0 - file_handle = handle_priv->interface_handle[iface].dev_handle; - if (!HANDLE_VALID(file_handle)) - return LIBUSB_ERROR_NOT_FOUND; - - if (!WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) { - handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; - err = GetLastError(); - switch(err) { - case ERROR_BAD_COMMAND: - // The device was disconnected - usbi_err(ctx, "could not access interface %d: %s", iface, windows_error_str(0)); - return LIBUSB_ERROR_NO_DEVICE; - default: - // it may be that we're using the libusb0 filter driver. - // TODO: can we move this whole business into the K/0 DLL? - for (i = 0; ; i++) { - safe_free(dev_interface_details); - safe_free(dev_path_no_guid); - - dev_interface_details = get_interface_details_filter(ctx, &dev_info, &dev_info_data, &GUID_DEVINTERFACE_LIBUSB0_FILTER, i, filter_path); - if ((found_filter) || (dev_interface_details == NULL)) - break; - - // ignore GUID part - dev_path_no_guid = sanitize_path(strtok(dev_interface_details->DevicePath, "{")); - if (dev_path_no_guid == NULL) - continue; - - if (strncmp(dev_path_no_guid, priv->usb_interface[iface].path, strlen(dev_path_no_guid)) == 0) { - file_handle = CreateFileA(filter_path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); - if (file_handle != INVALID_HANDLE_VALUE) { - if (WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) { - // Replace the existing file handle with the working one - CloseHandle(handle_priv->interface_handle[iface].dev_handle); - handle_priv->interface_handle[iface].dev_handle = file_handle; - found_filter = true; - } else { - usbi_err(ctx, "could not initialize filter driver for %s", filter_path); - CloseHandle(file_handle); - } - } else { - usbi_err(ctx, "could not open device %s: %s", filter_path, windows_error_str(0)); - } - } - } - free(dev_interface_details); - if (!found_filter) { - usbi_err(ctx, "could not access interface %d: %s", iface, windows_error_str(err)); - return LIBUSB_ERROR_ACCESS; - } - } - } - handle_priv->interface_handle[iface].api_handle = winusb_handle; - } else { - // For all other interfaces, use GetAssociatedInterface() - winusb_handle = handle_priv->interface_handle[0].api_handle; - // It is a requirement for multiple interface devices on Windows that, to you - // must first claim the first interface before you claim the others - if (!HANDLE_VALID(winusb_handle)) { - file_handle = handle_priv->interface_handle[0].dev_handle; - if (WinUSBX[sub_api].Initialize(file_handle, &winusb_handle)) { - handle_priv->interface_handle[0].api_handle = winusb_handle; - usbi_warn(ctx, "auto-claimed interface 0 (required to claim %d with WinUSB)", iface); - } else { - usbi_warn(ctx, "failed to auto-claim interface 0 (required to claim %d with WinUSB): %s", iface, windows_error_str(0)); - return LIBUSB_ERROR_ACCESS; - } - } - if (!WinUSBX[sub_api].GetAssociatedInterface(winusb_handle, (UCHAR)(iface - 1), - &handle_priv->interface_handle[iface].api_handle)) { - handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; - switch(GetLastError()) { - case ERROR_NO_MORE_ITEMS: // invalid iface - return LIBUSB_ERROR_NOT_FOUND; - case ERROR_BAD_COMMAND: // The device was disconnected - return LIBUSB_ERROR_NO_DEVICE; - case ERROR_ALREADY_EXISTS: // already claimed - return LIBUSB_ERROR_BUSY; - default: - usbi_err(ctx, "could not claim interface %d: %s", iface, windows_error_str(0)); - return LIBUSB_ERROR_ACCESS; - } - } - } - usbi_dbg("claimed interface %d", iface); - handle_priv->active_interface = iface; - - return LIBUSB_SUCCESS; -} - -static int winusbx_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - HANDLE winusb_handle; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - winusb_handle = handle_priv->interface_handle[iface].api_handle; - if (!HANDLE_VALID(winusb_handle)) - return LIBUSB_ERROR_NOT_FOUND; - - WinUSBX[sub_api].Free(winusb_handle); - handle_priv->interface_handle[iface].api_handle = INVALID_HANDLE_VALUE; - - return LIBUSB_SUCCESS; -} - -/* - * Return the first valid interface (of the same API type), for control transfers - */ -static int get_valid_interface(struct libusb_device_handle *dev_handle, int api_id) -{ - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - int i; - - if ((api_id < USB_API_WINUSBX) || (api_id > USB_API_HID)) { - usbi_dbg("unsupported API ID"); - return -1; - } - - for (i = 0; i < USB_MAXINTERFACES; i++) { - if (HANDLE_VALID(handle_priv->interface_handle[i].dev_handle) - && HANDLE_VALID(handle_priv->interface_handle[i].api_handle) - && (priv->usb_interface[i].apib->id == api_id)) - return i; - } - - return -1; -} - -/* - * Lookup interface by endpoint address. -1 if not found - */ -static int interface_by_endpoint(struct windows_device_priv *priv, - struct windows_device_handle_priv *handle_priv, uint8_t endpoint_address) -{ - int i, j; - - for (i = 0; i < USB_MAXINTERFACES; i++) { - if (!HANDLE_VALID(handle_priv->interface_handle[i].api_handle)) - continue; - if (priv->usb_interface[i].endpoint == NULL) - continue; - for (j = 0; j < priv->usb_interface[i].nb_endpoints; j++) { - if (priv->usb_interface[i].endpoint[j] == endpoint_address) - return i; - } - } - - return -1; -} - -static int winusbx_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - WINUSB_SETUP_PACKET *setup = (WINUSB_SETUP_PACKET *)transfer->buffer; - ULONG size; - HANDLE winusb_handle; - int current_interface; - struct winfd wfd; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - transfer_priv->pollable_fd = INVALID_WINFD; - size = transfer->length - LIBUSB_CONTROL_SETUP_SIZE; - - // Windows places upper limits on the control transfer size - // See: https://msdn.microsoft.com/en-us/library/windows/hardware/ff538112.aspx - if (size > MAX_CTRL_BUFFER_LENGTH) - return LIBUSB_ERROR_INVALID_PARAM; - - current_interface = get_valid_interface(transfer->dev_handle, USB_API_WINUSBX); - if (current_interface < 0) { - if (auto_claim(transfer, ¤t_interface, USB_API_WINUSBX) != LIBUSB_SUCCESS) - return LIBUSB_ERROR_NOT_FOUND; - } - - usbi_dbg("will use interface %d", current_interface); - winusb_handle = handle_priv->interface_handle[current_interface].api_handle; - - wfd = usbi_create_fd(winusb_handle, RW_READ, NULL, NULL); - // Always use the handle returned from usbi_create_fd (wfd.handle) - if (wfd.fd < 0) - return LIBUSB_ERROR_NO_MEM; - - // Sending of set configuration control requests from WinUSB creates issues - if (((setup->request_type & (0x03 << 5)) == LIBUSB_REQUEST_TYPE_STANDARD) - && (setup->request == LIBUSB_REQUEST_SET_CONFIGURATION)) { - if (setup->value != priv->active_config) { - usbi_warn(ctx, "cannot set configuration other than the default one"); - usbi_free_fd(&wfd); - return LIBUSB_ERROR_INVALID_PARAM; - } - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - wfd.overlapped->InternalHigh = 0; - } else { - if (!WinUSBX[sub_api].ControlTransfer(wfd.handle, *setup, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, size, NULL, wfd.overlapped)) { - if (GetLastError() != ERROR_IO_PENDING) { - usbi_warn(ctx, "ControlTransfer failed: %s", windows_error_str(0)); - usbi_free_fd(&wfd); - return LIBUSB_ERROR_IO; - } - } else { - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - wfd.overlapped->InternalHigh = (DWORD)size; - } - } - - // Use priv_transfer to store data needed for async polling - transfer_priv->pollable_fd = wfd; - transfer_priv->interface_number = (uint8_t)current_interface; - - return LIBUSB_SUCCESS; -} - -static int winusbx_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - HANDLE winusb_handle; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - if (altsetting > 255) - return LIBUSB_ERROR_INVALID_PARAM; - - winusb_handle = handle_priv->interface_handle[iface].api_handle; - if (!HANDLE_VALID(winusb_handle)) { - usbi_err(ctx, "interface must be claimed first"); - return LIBUSB_ERROR_NOT_FOUND; - } - - if (!WinUSBX[sub_api].SetCurrentAlternateSetting(winusb_handle, (UCHAR)altsetting)) { - usbi_err(ctx, "SetCurrentAlternateSetting failed: %s", windows_error_str(0)); - return LIBUSB_ERROR_IO; - } - - return LIBUSB_SUCCESS; -} - -static int winusbx_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - HANDLE winusb_handle; - bool ret; - int current_interface; - struct winfd wfd; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - transfer_priv->pollable_fd = INVALID_WINFD; - - current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); - if (current_interface < 0) { - usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); - return LIBUSB_ERROR_NOT_FOUND; - } - - usbi_dbg("matched endpoint %02X with interface %d", transfer->endpoint, current_interface); - - winusb_handle = handle_priv->interface_handle[current_interface].api_handle; - - wfd = usbi_create_fd(winusb_handle, IS_XFERIN(transfer) ? RW_READ : RW_WRITE, NULL, NULL); - // Always use the handle returned from usbi_create_fd (wfd.handle) - if (wfd.fd < 0) - return LIBUSB_ERROR_NO_MEM; - - if (IS_XFERIN(transfer)) { - usbi_dbg("reading %d bytes", transfer->length); - ret = WinUSBX[sub_api].ReadPipe(wfd.handle, transfer->endpoint, transfer->buffer, transfer->length, NULL, wfd.overlapped); - } else { - usbi_dbg("writing %d bytes", transfer->length); - ret = WinUSBX[sub_api].WritePipe(wfd.handle, transfer->endpoint, transfer->buffer, transfer->length, NULL, wfd.overlapped); - } - - if (!ret) { - if (GetLastError() != ERROR_IO_PENDING) { - usbi_err(ctx, "ReadPipe/WritePipe failed: %s", windows_error_str(0)); - usbi_free_fd(&wfd); - return LIBUSB_ERROR_IO; - } - } else { - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - wfd.overlapped->InternalHigh = (DWORD)transfer->length; - } - - transfer_priv->pollable_fd = wfd; - transfer_priv->interface_number = (uint8_t)current_interface; - - return LIBUSB_SUCCESS; -} - -static int winusbx_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - HANDLE winusb_handle; - int current_interface; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - current_interface = interface_by_endpoint(priv, handle_priv, endpoint); - if (current_interface < 0) { - usbi_err(ctx, "unable to match endpoint to an open interface - cannot clear"); - return LIBUSB_ERROR_NOT_FOUND; - } - - usbi_dbg("matched endpoint %02X with interface %d", endpoint, current_interface); - winusb_handle = handle_priv->interface_handle[current_interface].api_handle; - - if (!WinUSBX[sub_api].ResetPipe(winusb_handle, endpoint)) { - usbi_err(ctx, "ResetPipe failed: %s", windows_error_str(0)); - return LIBUSB_ERROR_NO_DEVICE; - } - - return LIBUSB_SUCCESS; -} - -/* - * from http://www.winvistatips.com/winusb-bugchecks-t335323.html (confirmed - * through testing as well): - * "You can not call WinUsb_AbortPipe on control pipe. You can possibly cancel - * the control transfer using CancelIo" - */ -static int winusbx_abort_control(int sub_api, struct usbi_transfer *itransfer) -{ - // Cancelling of the I/O is done in the parent - return LIBUSB_SUCCESS; -} - -static int winusbx_abort_transfers(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - HANDLE winusb_handle; - int current_interface; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - current_interface = transfer_priv->interface_number; - if ((current_interface < 0) || (current_interface >= USB_MAXINTERFACES)) { - usbi_err(ctx, "program assertion failed: invalid interface_number"); - return LIBUSB_ERROR_NOT_FOUND; - } - usbi_dbg("will use interface %d", current_interface); - - winusb_handle = handle_priv->interface_handle[current_interface].api_handle; - - if (!WinUSBX[sub_api].AbortPipe(winusb_handle, transfer->endpoint)) { - usbi_err(ctx, "AbortPipe failed: %s", windows_error_str(0)); - return LIBUSB_ERROR_NO_DEVICE; - } - - return LIBUSB_SUCCESS; -} - -/* - * from the "How to Use WinUSB to Communicate with a USB Device" Microsoft white paper - * (http://www.microsoft.com/whdc/connect/usb/winusb_howto.mspx): - * "WinUSB does not support host-initiated reset port and cycle port operations" and - * IOCTL_INTERNAL_USB_CYCLE_PORT is only available in kernel mode and the - * IOCTL_USB_HUB_CYCLE_PORT ioctl was removed from Vista => the best we can do is - * cycle the pipes (and even then, the control pipe can not be reset using WinUSB) - */ -// TODO: (post hotplug): see if we can force eject the device and redetect it (reuse hotplug?) -static int winusbx_reset_device(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - struct winfd wfd; - HANDLE winusb_handle; - int i, j; - - CHECK_WINUSBX_AVAILABLE(sub_api); - - // Reset any available pipe (except control) - for (i = 0; i < USB_MAXINTERFACES; i++) { - winusb_handle = handle_priv->interface_handle[i].api_handle; - for (wfd = handle_to_winfd(winusb_handle); wfd.fd > 0; ) { - // Cancel any pollable I/O - usbi_remove_pollfd(ctx, wfd.fd); - usbi_free_fd(&wfd); - wfd = handle_to_winfd(winusb_handle); - } - - if (HANDLE_VALID(winusb_handle)) { - for (j = 0; j < priv->usb_interface[i].nb_endpoints; j++) { - usbi_dbg("resetting ep %02X", priv->usb_interface[i].endpoint[j]); - if (!WinUSBX[sub_api].AbortPipe(winusb_handle, priv->usb_interface[i].endpoint[j])) - usbi_err(ctx, "AbortPipe (pipe address %02X) failed: %s", - priv->usb_interface[i].endpoint[j], windows_error_str(0)); - - // FlushPipe seems to fail on OUT pipes - if (IS_EPIN(priv->usb_interface[i].endpoint[j]) - && (!WinUSBX[sub_api].FlushPipe(winusb_handle, priv->usb_interface[i].endpoint[j]))) - usbi_err(ctx, "FlushPipe (pipe address %02X) failed: %s", - priv->usb_interface[i].endpoint[j], windows_error_str(0)); - - if (!WinUSBX[sub_api].ResetPipe(winusb_handle, priv->usb_interface[i].endpoint[j])) - usbi_err(ctx, "ResetPipe (pipe address %02X) failed: %s", - priv->usb_interface[i].endpoint[j], windows_error_str(0)); - } - } - } - - // libusbK & libusb0 have the ability to issue an actual device reset - if (WinUSBX[sub_api].ResetDevice != NULL) { - winusb_handle = handle_priv->interface_handle[0].api_handle; - if (HANDLE_VALID(winusb_handle)) - WinUSBX[sub_api].ResetDevice(winusb_handle); - } - - return LIBUSB_SUCCESS; -} - -static int winusbx_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) -{ - itransfer->transferred += io_size; - return LIBUSB_TRANSFER_COMPLETED; -} - -/* - * Internal HID Support functions (from libusb-win32) - * Note that functions that complete data transfer synchronously must return - * LIBUSB_COMPLETED instead of LIBUSB_SUCCESS - */ -static int _hid_get_hid_descriptor(struct hid_device_priv *dev, void *data, size_t *size); -static int _hid_get_report_descriptor(struct hid_device_priv *dev, void *data, size_t *size); - -static int _hid_wcslen(WCHAR *str) -{ - int i = 0; - - while (str[i] && (str[i] != 0x409)) - i++; - - return i; -} - -static int _hid_get_device_descriptor(struct hid_device_priv *dev, void *data, size_t *size) -{ - struct libusb_device_descriptor d; - - d.bLength = LIBUSB_DT_DEVICE_SIZE; - d.bDescriptorType = LIBUSB_DT_DEVICE; - d.bcdUSB = 0x0200; /* 2.00 */ - d.bDeviceClass = 0; - d.bDeviceSubClass = 0; - d.bDeviceProtocol = 0; - d.bMaxPacketSize0 = 64; /* fix this! */ - d.idVendor = (uint16_t)dev->vid; - d.idProduct = (uint16_t)dev->pid; - d.bcdDevice = 0x0100; - d.iManufacturer = dev->string_index[0]; - d.iProduct = dev->string_index[1]; - d.iSerialNumber = dev->string_index[2]; - d.bNumConfigurations = 1; - - if (*size > LIBUSB_DT_DEVICE_SIZE) - *size = LIBUSB_DT_DEVICE_SIZE; - memcpy(data, &d, *size); - - return LIBUSB_COMPLETED; -} - -static int _hid_get_config_descriptor(struct hid_device_priv *dev, void *data, size_t *size) -{ - char num_endpoints = 0; - size_t config_total_len = 0; - char tmp[HID_MAX_CONFIG_DESC_SIZE]; - struct libusb_config_descriptor *cd; - struct libusb_interface_descriptor *id; - struct libusb_hid_descriptor *hd; - struct libusb_endpoint_descriptor *ed; - size_t tmp_size; - - if (dev->input_report_size) - num_endpoints++; - if (dev->output_report_size) - num_endpoints++; - - config_total_len = LIBUSB_DT_CONFIG_SIZE + LIBUSB_DT_INTERFACE_SIZE - + LIBUSB_DT_HID_SIZE + num_endpoints * LIBUSB_DT_ENDPOINT_SIZE; - - cd = (struct libusb_config_descriptor *)tmp; - id = (struct libusb_interface_descriptor *)(tmp + LIBUSB_DT_CONFIG_SIZE); - hd = (struct libusb_hid_descriptor *)(tmp + LIBUSB_DT_CONFIG_SIZE - + LIBUSB_DT_INTERFACE_SIZE); - ed = (struct libusb_endpoint_descriptor *)(tmp + LIBUSB_DT_CONFIG_SIZE - + LIBUSB_DT_INTERFACE_SIZE - + LIBUSB_DT_HID_SIZE); - - cd->bLength = LIBUSB_DT_CONFIG_SIZE; - cd->bDescriptorType = LIBUSB_DT_CONFIG; - cd->wTotalLength = (uint16_t)config_total_len; - cd->bNumInterfaces = 1; - cd->bConfigurationValue = 1; - cd->iConfiguration = 0; - cd->bmAttributes = 1 << 7; /* bus powered */ - cd->MaxPower = 50; - - id->bLength = LIBUSB_DT_INTERFACE_SIZE; - id->bDescriptorType = LIBUSB_DT_INTERFACE; - id->bInterfaceNumber = 0; - id->bAlternateSetting = 0; - id->bNumEndpoints = num_endpoints; - id->bInterfaceClass = 3; - id->bInterfaceSubClass = 0; - id->bInterfaceProtocol = 0; - id->iInterface = 0; - - tmp_size = LIBUSB_DT_HID_SIZE; - _hid_get_hid_descriptor(dev, hd, &tmp_size); - - if (dev->input_report_size) { - ed->bLength = LIBUSB_DT_ENDPOINT_SIZE; - ed->bDescriptorType = LIBUSB_DT_ENDPOINT; - ed->bEndpointAddress = HID_IN_EP; - ed->bmAttributes = 3; - ed->wMaxPacketSize = dev->input_report_size - 1; - ed->bInterval = 10; - ed = (struct libusb_endpoint_descriptor *)((char *)ed + LIBUSB_DT_ENDPOINT_SIZE); - } - - if (dev->output_report_size) { - ed->bLength = LIBUSB_DT_ENDPOINT_SIZE; - ed->bDescriptorType = LIBUSB_DT_ENDPOINT; - ed->bEndpointAddress = HID_OUT_EP; - ed->bmAttributes = 3; - ed->wMaxPacketSize = dev->output_report_size - 1; - ed->bInterval = 10; - } - - if (*size > config_total_len) - *size = config_total_len; - memcpy(data, tmp, *size); - - return LIBUSB_COMPLETED; -} - -static int _hid_get_string_descriptor(struct hid_device_priv *dev, int _index, - void *data, size_t *size) -{ - void *tmp = NULL; - size_t tmp_size = 0; - int i; - - /* language ID, EN-US */ - char string_langid[] = {0x09, 0x04}; - - if ((*size < 2) || (*size > 255)) - return LIBUSB_ERROR_OVERFLOW; - - if (_index == 0) { - tmp = string_langid; - tmp_size = sizeof(string_langid) + 2; - } else { - for (i = 0; i < 3; i++) { - if (_index == (dev->string_index[i])) { - tmp = dev->string[i]; - tmp_size = (_hid_wcslen(dev->string[i]) + 1) * sizeof(WCHAR); - break; - } - } - - if (i == 3) // not found - return LIBUSB_ERROR_INVALID_PARAM; - } - - if (!tmp_size) - return LIBUSB_ERROR_INVALID_PARAM; - - if (tmp_size < *size) - *size = tmp_size; - - // 2 byte header - ((uint8_t *)data)[0] = (uint8_t)*size; - ((uint8_t *)data)[1] = LIBUSB_DT_STRING; - memcpy((uint8_t *)data + 2, tmp, *size - 2); - - return LIBUSB_COMPLETED; -} - -static int _hid_get_hid_descriptor(struct hid_device_priv *dev, void *data, size_t *size) -{ - struct libusb_hid_descriptor d; - uint8_t tmp[MAX_HID_DESCRIPTOR_SIZE]; - size_t report_len = MAX_HID_DESCRIPTOR_SIZE; - - _hid_get_report_descriptor(dev, tmp, &report_len); - - d.bLength = LIBUSB_DT_HID_SIZE; - d.bDescriptorType = LIBUSB_DT_HID; - d.bcdHID = 0x0110; /* 1.10 */ - d.bCountryCode = 0; - d.bNumDescriptors = 1; - d.bClassDescriptorType = LIBUSB_DT_REPORT; - d.wClassDescriptorLength = (uint16_t)report_len; - - if (*size > LIBUSB_DT_HID_SIZE) - *size = LIBUSB_DT_HID_SIZE; - memcpy(data, &d, *size); - - return LIBUSB_COMPLETED; -} - -static int _hid_get_report_descriptor(struct hid_device_priv *dev, void *data, size_t *size) -{ - uint8_t d[MAX_HID_DESCRIPTOR_SIZE]; - size_t i = 0; - - /* usage page (0xFFA0 == vendor defined) */ - d[i++] = 0x06; d[i++] = 0xA0; d[i++] = 0xFF; - /* usage (vendor defined) */ - d[i++] = 0x09; d[i++] = 0x01; - /* start collection (application) */ - d[i++] = 0xA1; d[i++] = 0x01; - /* input report */ - if (dev->input_report_size) { - /* usage (vendor defined) */ - d[i++] = 0x09; d[i++] = 0x01; - /* logical minimum (0) */ - d[i++] = 0x15; d[i++] = 0x00; - /* logical maximum (255) */ - d[i++] = 0x25; d[i++] = 0xFF; - /* report size (8 bits) */ - d[i++] = 0x75; d[i++] = 0x08; - /* report count */ - d[i++] = 0x95; d[i++] = (uint8_t)dev->input_report_size - 1; - /* input (data, variable, absolute) */ - d[i++] = 0x81; d[i++] = 0x00; - } - /* output report */ - if (dev->output_report_size) { - /* usage (vendor defined) */ - d[i++] = 0x09; d[i++] = 0x02; - /* logical minimum (0) */ - d[i++] = 0x15; d[i++] = 0x00; - /* logical maximum (255) */ - d[i++] = 0x25; d[i++] = 0xFF; - /* report size (8 bits) */ - d[i++] = 0x75; d[i++] = 0x08; - /* report count */ - d[i++] = 0x95; d[i++] = (uint8_t)dev->output_report_size - 1; - /* output (data, variable, absolute) */ - d[i++] = 0x91; d[i++] = 0x00; - } - /* feature report */ - if (dev->feature_report_size) { - /* usage (vendor defined) */ - d[i++] = 0x09; d[i++] = 0x03; - /* logical minimum (0) */ - d[i++] = 0x15; d[i++] = 0x00; - /* logical maximum (255) */ - d[i++] = 0x25; d[i++] = 0xFF; - /* report size (8 bits) */ - d[i++] = 0x75; d[i++] = 0x08; - /* report count */ - d[i++] = 0x95; d[i++] = (uint8_t)dev->feature_report_size - 1; - /* feature (data, variable, absolute) */ - d[i++] = 0xb2; d[i++] = 0x02; d[i++] = 0x01; - } - - /* end collection */ - d[i++] = 0xC0; - - if (*size > i) - *size = i; - memcpy(data, d, *size); - - return LIBUSB_COMPLETED; -} - -static int _hid_get_descriptor(struct hid_device_priv *dev, HANDLE hid_handle, int recipient, - int type, int _index, void *data, size_t *size) -{ - switch(type) { - case LIBUSB_DT_DEVICE: - usbi_dbg("LIBUSB_DT_DEVICE"); - return _hid_get_device_descriptor(dev, data, size); - case LIBUSB_DT_CONFIG: - usbi_dbg("LIBUSB_DT_CONFIG"); - if (!_index) - return _hid_get_config_descriptor(dev, data, size); - return LIBUSB_ERROR_INVALID_PARAM; - case LIBUSB_DT_STRING: - usbi_dbg("LIBUSB_DT_STRING"); - return _hid_get_string_descriptor(dev, _index, data, size); - case LIBUSB_DT_HID: - usbi_dbg("LIBUSB_DT_HID"); - if (!_index) - return _hid_get_hid_descriptor(dev, data, size); - return LIBUSB_ERROR_INVALID_PARAM; - case LIBUSB_DT_REPORT: - usbi_dbg("LIBUSB_DT_REPORT"); - if (!_index) - return _hid_get_report_descriptor(dev, data, size); - return LIBUSB_ERROR_INVALID_PARAM; - case LIBUSB_DT_PHYSICAL: - usbi_dbg("LIBUSB_DT_PHYSICAL"); - if (HidD_GetPhysicalDescriptor(hid_handle, data, (ULONG)*size)) - return LIBUSB_COMPLETED; - return LIBUSB_ERROR_OTHER; - } - - usbi_dbg("unsupported"); - return LIBUSB_ERROR_NOT_SUPPORTED; -} - -static int _hid_get_report(struct hid_device_priv *dev, HANDLE hid_handle, int id, void *data, - struct windows_transfer_priv *tp, size_t *size, OVERLAPPED *overlapped, int report_type) -{ - uint8_t *buf; - DWORD ioctl_code, read_size, expected_size = (DWORD)*size; - int r = LIBUSB_SUCCESS; - - if (tp->hid_buffer != NULL) - usbi_dbg("program assertion failed: hid_buffer is not NULL"); - - if ((*size == 0) || (*size > MAX_HID_REPORT_SIZE)) { - usbi_dbg("invalid size (%u)", *size); - return LIBUSB_ERROR_INVALID_PARAM; - } - - switch (report_type) { - case HID_REPORT_TYPE_INPUT: - ioctl_code = IOCTL_HID_GET_INPUT_REPORT; - break; - case HID_REPORT_TYPE_FEATURE: - ioctl_code = IOCTL_HID_GET_FEATURE; - break; - default: - usbi_dbg("unknown HID report type %d", report_type); - return LIBUSB_ERROR_INVALID_PARAM; - } - - // Add a trailing byte to detect overflows - buf = calloc(1, expected_size + 1); - if (buf == NULL) - return LIBUSB_ERROR_NO_MEM; - - buf[0] = (uint8_t)id; // Must be set always - usbi_dbg("report ID: 0x%02X", buf[0]); - - tp->hid_expected_size = expected_size; - read_size = expected_size; - - // NB: The size returned by DeviceIoControl doesn't include report IDs when not in use (0) - if (!DeviceIoControl(hid_handle, ioctl_code, buf, expected_size + 1, - buf, expected_size + 1, &read_size, overlapped)) { - if (GetLastError() != ERROR_IO_PENDING) { - usbi_dbg("Failed to Read HID Report: %s", windows_error_str(0)); - free(buf); - return LIBUSB_ERROR_IO; - } - // Asynchronous wait - tp->hid_buffer = buf; - tp->hid_dest = data; // copy dest, as not necessarily the start of the transfer buffer - return LIBUSB_SUCCESS; - } - - // Transfer completed synchronously => copy and discard extra buffer - if (read_size == 0) { - usbi_warn(NULL, "program assertion failed - read completed synchronously, but no data was read"); - *size = 0; - } else { - if (buf[0] != id) - usbi_warn(NULL, "mismatched report ID (data is %02X, parameter is %02X)", buf[0], id); - - if ((size_t)read_size > expected_size) { - r = LIBUSB_ERROR_OVERFLOW; - usbi_dbg("OVERFLOW!"); - } else { - r = LIBUSB_COMPLETED; - } - - *size = MIN((size_t)read_size, *size); - if (id == 0) - memcpy(data, buf + 1, *size); // Discard report ID - else - memcpy(data, buf, *size); - } - - free(buf); - return r; -} - -static int _hid_set_report(struct hid_device_priv *dev, HANDLE hid_handle, int id, void *data, - struct windows_transfer_priv *tp, size_t *size, OVERLAPPED *overlapped, int report_type) -{ - uint8_t *buf = NULL; - DWORD ioctl_code, write_size = (DWORD)*size; - - if (tp->hid_buffer != NULL) - usbi_dbg("program assertion failed: hid_buffer is not NULL"); - - if ((*size == 0) || (*size > MAX_HID_REPORT_SIZE)) { - usbi_dbg("invalid size (%u)", *size); - return LIBUSB_ERROR_INVALID_PARAM; - } - - switch (report_type) { - case HID_REPORT_TYPE_OUTPUT: - ioctl_code = IOCTL_HID_SET_OUTPUT_REPORT; - break; - case HID_REPORT_TYPE_FEATURE: - ioctl_code = IOCTL_HID_SET_FEATURE; - break; - default: - usbi_dbg("unknown HID report type %d", report_type); - return LIBUSB_ERROR_INVALID_PARAM; - } - - usbi_dbg("report ID: 0x%02X", id); - // When report IDs are not used (i.e. when id == 0), we must add - // a null report ID. Otherwise, we just use original data buffer - if (id == 0) - write_size++; - - buf = malloc(write_size); - if (buf == NULL) - return LIBUSB_ERROR_NO_MEM; - - if (id == 0) { - buf[0] = 0; - memcpy(buf + 1, data, *size); - } else { - // This seems like a waste, but if we don't duplicate the - // data, we'll get issues when freeing hid_buffer - memcpy(buf, data, *size); - if (buf[0] != id) - usbi_warn(NULL, "mismatched report ID (data is %02X, parameter is %02X)", buf[0], id); - } - - // NB: The size returned by DeviceIoControl doesn't include report IDs when not in use (0) - if (!DeviceIoControl(hid_handle, ioctl_code, buf, write_size, - buf, write_size, &write_size, overlapped)) { - if (GetLastError() != ERROR_IO_PENDING) { - usbi_dbg("Failed to Write HID Output Report: %s", windows_error_str(0)); - free(buf); - return LIBUSB_ERROR_IO; - } - tp->hid_buffer = buf; - tp->hid_dest = NULL; - return LIBUSB_SUCCESS; - } - - // Transfer completed synchronously - *size = write_size; - if (write_size == 0) - usbi_dbg("program assertion failed - write completed synchronously, but no data was written"); - - free(buf); - return LIBUSB_COMPLETED; -} - -static int _hid_class_request(struct hid_device_priv *dev, HANDLE hid_handle, int request_type, - int request, int value, int _index, void *data, struct windows_transfer_priv *tp, - size_t *size, OVERLAPPED *overlapped) -{ - int report_type = (value >> 8) & 0xFF; - int report_id = value & 0xFF; - - if ((LIBUSB_REQ_RECIPIENT(request_type) != LIBUSB_RECIPIENT_INTERFACE) - && (LIBUSB_REQ_RECIPIENT(request_type) != LIBUSB_RECIPIENT_DEVICE)) - return LIBUSB_ERROR_INVALID_PARAM; - - if (LIBUSB_REQ_OUT(request_type) && request == HID_REQ_SET_REPORT) - return _hid_set_report(dev, hid_handle, report_id, data, tp, size, overlapped, report_type); - - if (LIBUSB_REQ_IN(request_type) && request == HID_REQ_GET_REPORT) - return _hid_get_report(dev, hid_handle, report_id, data, tp, size, overlapped, report_type); - - return LIBUSB_ERROR_INVALID_PARAM; -} - - -/* - * HID API functions - */ -static int hid_init(int sub_api, struct libusb_context *ctx) -{ - DLL_GET_HANDLE(hid); - DLL_LOAD_FUNC(hid, HidD_GetAttributes, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetHidGuid, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetPreparsedData, TRUE); - DLL_LOAD_FUNC(hid, HidD_FreePreparsedData, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetManufacturerString, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetProductString, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetSerialNumberString, TRUE); - DLL_LOAD_FUNC(hid, HidP_GetCaps, TRUE); - DLL_LOAD_FUNC(hid, HidD_SetNumInputBuffers, TRUE); - DLL_LOAD_FUNC(hid, HidD_SetFeature, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetFeature, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetPhysicalDescriptor, TRUE); - DLL_LOAD_FUNC(hid, HidD_GetInputReport, FALSE); - DLL_LOAD_FUNC(hid, HidD_SetOutputReport, FALSE); - DLL_LOAD_FUNC(hid, HidD_FlushQueue, TRUE); - DLL_LOAD_FUNC(hid, HidP_GetValueCaps, TRUE); - - api_hid_available = true; - return LIBUSB_SUCCESS; -} - -static int hid_exit(int sub_api) -{ - DLL_FREE_HANDLE(hid); - - return LIBUSB_SUCCESS; -} - -// NB: open and close must ensure that they only handle interface of -// the right API type, as these functions can be called wholesale from -// composite_open(), with interfaces belonging to different APIs -static int hid_open(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - HIDD_ATTRIBUTES hid_attributes; - PHIDP_PREPARSED_DATA preparsed_data = NULL; - HIDP_CAPS capabilities; - HIDP_VALUE_CAPS *value_caps; - HANDLE hid_handle = INVALID_HANDLE_VALUE; - int i, j; - // report IDs handling - ULONG size[3]; - int nb_ids[2]; // zero and nonzero report IDs -#if defined(ENABLE_LOGGING) - const char *type[3] = {"input", "output", "feature"}; -#endif - - CHECK_HID_AVAILABLE; - - if (priv->hid == NULL) { - usbi_err(ctx, "program assertion failed - private HID structure is unitialized"); - return LIBUSB_ERROR_NOT_FOUND; - } - - for (i = 0; i < USB_MAXINTERFACES; i++) { - if ((priv->usb_interface[i].path != NULL) - && (priv->usb_interface[i].apib->id == USB_API_HID)) { - hid_handle = CreateFileA(priv->usb_interface[i].path, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); - /* - * http://www.lvr.com/hidfaq.htm: Why do I receive "Access denied" when attempting to access my HID? - * "Windows 2000 and later have exclusive read/write access to HIDs that are configured as a system - * keyboards or mice. An application can obtain a handle to a system keyboard or mouse by not - * requesting READ or WRITE access with CreateFile. Applications can then use HidD_SetFeature and - * HidD_GetFeature (if the device supports Feature reports)." - */ - if (hid_handle == INVALID_HANDLE_VALUE) { - usbi_warn(ctx, "could not open HID device in R/W mode (keyboard or mouse?) - trying without"); - hid_handle = CreateFileA(priv->usb_interface[i].path, 0, FILE_SHARE_WRITE | FILE_SHARE_READ, - NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); - if (hid_handle == INVALID_HANDLE_VALUE) { - usbi_err(ctx, "could not open device %s (interface %d): %s", priv->path, i, windows_error_str(0)); - switch(GetLastError()) { - case ERROR_FILE_NOT_FOUND: // The device was disconnected - return LIBUSB_ERROR_NO_DEVICE; - case ERROR_ACCESS_DENIED: - return LIBUSB_ERROR_ACCESS; - default: - return LIBUSB_ERROR_IO; - } - } - priv->usb_interface[i].restricted_functionality = true; - } - handle_priv->interface_handle[i].api_handle = hid_handle; - } - } - - hid_attributes.Size = sizeof(hid_attributes); - do { - if (!HidD_GetAttributes(hid_handle, &hid_attributes)) { - usbi_err(ctx, "could not gain access to HID top collection (HidD_GetAttributes)"); - break; - } - - priv->hid->vid = hid_attributes.VendorID; - priv->hid->pid = hid_attributes.ProductID; - - // Set the maximum available input buffer size - for (i = 32; HidD_SetNumInputBuffers(hid_handle, i); i *= 2); - usbi_dbg("set maximum input buffer size to %d", i / 2); - - // Get the maximum input and output report size - if (!HidD_GetPreparsedData(hid_handle, &preparsed_data) || !preparsed_data) { - usbi_err(ctx, "could not read HID preparsed data (HidD_GetPreparsedData)"); - break; - } - if (HidP_GetCaps(preparsed_data, &capabilities) != HIDP_STATUS_SUCCESS) { - usbi_err(ctx, "could not parse HID capabilities (HidP_GetCaps)"); - break; - } - - // Find out if interrupt will need report IDs - size[0] = capabilities.NumberInputValueCaps; - size[1] = capabilities.NumberOutputValueCaps; - size[2] = capabilities.NumberFeatureValueCaps; - for (j = HidP_Input; j <= HidP_Feature; j++) { - usbi_dbg("%u HID %s report value(s) found", (unsigned int)size[j], type[j]); - priv->hid->uses_report_ids[j] = false; - if (size[j] > 0) { - value_caps = calloc(size[j], sizeof(HIDP_VALUE_CAPS)); - if ((value_caps != NULL) - && (HidP_GetValueCaps((HIDP_REPORT_TYPE)j, value_caps, &size[j], preparsed_data) == HIDP_STATUS_SUCCESS) - && (size[j] >= 1)) { - nb_ids[0] = 0; - nb_ids[1] = 0; - for (i = 0; i < (int)size[j]; i++) { - usbi_dbg(" Report ID: 0x%02X", value_caps[i].ReportID); - if (value_caps[i].ReportID != 0) - nb_ids[1]++; - else - nb_ids[0]++; - } - if (nb_ids[1] != 0) { - if (nb_ids[0] != 0) - usbi_warn(ctx, "program assertion failed: zero and nonzero report IDs used for %s", - type[j]); - priv->hid->uses_report_ids[j] = true; - } - } else { - usbi_warn(ctx, " could not process %s report IDs", type[j]); - } - free(value_caps); - } - } - - // Set the report sizes - priv->hid->input_report_size = capabilities.InputReportByteLength; - priv->hid->output_report_size = capabilities.OutputReportByteLength; - priv->hid->feature_report_size = capabilities.FeatureReportByteLength; - - // Fetch string descriptors - priv->hid->string_index[0] = priv->dev_descriptor.iManufacturer; - if (priv->hid->string_index[0] != 0) - HidD_GetManufacturerString(hid_handle, priv->hid->string[0], sizeof(priv->hid->string[0])); - else - priv->hid->string[0][0] = 0; - - priv->hid->string_index[1] = priv->dev_descriptor.iProduct; - if (priv->hid->string_index[1] != 0) - HidD_GetProductString(hid_handle, priv->hid->string[1], sizeof(priv->hid->string[1])); - else - priv->hid->string[1][0] = 0; - - priv->hid->string_index[2] = priv->dev_descriptor.iSerialNumber; - if (priv->hid->string_index[2] != 0) - HidD_GetSerialNumberString(hid_handle, priv->hid->string[2], sizeof(priv->hid->string[2])); - else - priv->hid->string[2][0] = 0; - } while(0); - - if (preparsed_data) - HidD_FreePreparsedData(preparsed_data); - - return LIBUSB_SUCCESS; -} - -static void hid_close(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - HANDLE file_handle; - int i; - - if (!api_hid_available) - return; - - for (i = 0; i < USB_MAXINTERFACES; i++) { - if (priv->usb_interface[i].apib->id == USB_API_HID) { - file_handle = handle_priv->interface_handle[i].api_handle; - if (HANDLE_VALID(file_handle)) - CloseHandle(file_handle); - } - } -} - -static int hid_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - CHECK_HID_AVAILABLE; - - // NB: Disconnection detection is not possible in this function - if (priv->usb_interface[iface].path == NULL) - return LIBUSB_ERROR_NOT_FOUND; // invalid iface - - // We use dev_handle as a flag for interface claimed - if (handle_priv->interface_handle[iface].dev_handle == INTERFACE_CLAIMED) - return LIBUSB_ERROR_BUSY; // already claimed - - - handle_priv->interface_handle[iface].dev_handle = INTERFACE_CLAIMED; - - usbi_dbg("claimed interface %d", iface); - handle_priv->active_interface = iface; - - return LIBUSB_SUCCESS; -} - -static int hid_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - CHECK_HID_AVAILABLE; - - if (priv->usb_interface[iface].path == NULL) - return LIBUSB_ERROR_NOT_FOUND; // invalid iface - - if (handle_priv->interface_handle[iface].dev_handle != INTERFACE_CLAIMED) - return LIBUSB_ERROR_NOT_FOUND; // invalid iface - - handle_priv->interface_handle[iface].dev_handle = INVALID_HANDLE_VALUE; - - return LIBUSB_SUCCESS; -} - -static int hid_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - - CHECK_HID_AVAILABLE; - - if (altsetting > 255) - return LIBUSB_ERROR_INVALID_PARAM; - - if (altsetting != 0) { - usbi_err(ctx, "set interface altsetting not supported for altsetting >0"); - return LIBUSB_ERROR_NOT_SUPPORTED; - } - - return LIBUSB_SUCCESS; -} - -static int hid_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - WINUSB_SETUP_PACKET *setup = (WINUSB_SETUP_PACKET *)transfer->buffer; - HANDLE hid_handle; - struct winfd wfd; - int current_interface, config; - size_t size; - int r = LIBUSB_ERROR_INVALID_PARAM; - - CHECK_HID_AVAILABLE; - - transfer_priv->pollable_fd = INVALID_WINFD; - safe_free(transfer_priv->hid_buffer); - transfer_priv->hid_dest = NULL; - size = transfer->length - LIBUSB_CONTROL_SETUP_SIZE; - - if (size > MAX_CTRL_BUFFER_LENGTH) - return LIBUSB_ERROR_INVALID_PARAM; - - current_interface = get_valid_interface(transfer->dev_handle, USB_API_HID); - if (current_interface < 0) { - if (auto_claim(transfer, ¤t_interface, USB_API_HID) != LIBUSB_SUCCESS) - return LIBUSB_ERROR_NOT_FOUND; - } - - usbi_dbg("will use interface %d", current_interface); - hid_handle = handle_priv->interface_handle[current_interface].api_handle; - // Always use the handle returned from usbi_create_fd (wfd.handle) - wfd = usbi_create_fd(hid_handle, RW_READ, NULL, NULL); - if (wfd.fd < 0) - return LIBUSB_ERROR_NOT_FOUND; - - switch(LIBUSB_REQ_TYPE(setup->request_type)) { - case LIBUSB_REQUEST_TYPE_STANDARD: - switch(setup->request) { - case LIBUSB_REQUEST_GET_DESCRIPTOR: - r = _hid_get_descriptor(priv->hid, wfd.handle, LIBUSB_REQ_RECIPIENT(setup->request_type), - (setup->value >> 8) & 0xFF, setup->value & 0xFF, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, &size); - break; - case LIBUSB_REQUEST_GET_CONFIGURATION: - r = windows_get_configuration(transfer->dev_handle, &config); - if (r == LIBUSB_SUCCESS) { - size = 1; - ((uint8_t *)transfer->buffer)[LIBUSB_CONTROL_SETUP_SIZE] = (uint8_t)config; - r = LIBUSB_COMPLETED; - } - break; - case LIBUSB_REQUEST_SET_CONFIGURATION: - if (setup->value == priv->active_config) { - r = LIBUSB_COMPLETED; - } else { - usbi_warn(ctx, "cannot set configuration other than the default one"); - r = LIBUSB_ERROR_NOT_SUPPORTED; - } - break; - case LIBUSB_REQUEST_GET_INTERFACE: - size = 1; - ((uint8_t *)transfer->buffer)[LIBUSB_CONTROL_SETUP_SIZE] = 0; - r = LIBUSB_COMPLETED; - break; - case LIBUSB_REQUEST_SET_INTERFACE: - r = hid_set_interface_altsetting(0, transfer->dev_handle, setup->index, setup->value); - if (r == LIBUSB_SUCCESS) - r = LIBUSB_COMPLETED; - break; - default: - usbi_warn(ctx, "unsupported HID control request"); - r = LIBUSB_ERROR_NOT_SUPPORTED; - break; - } - break; - case LIBUSB_REQUEST_TYPE_CLASS: - r = _hid_class_request(priv->hid, wfd.handle, setup->request_type, setup->request, setup->value, - setup->index, transfer->buffer + LIBUSB_CONTROL_SETUP_SIZE, transfer_priv, - &size, wfd.overlapped); - break; - default: - usbi_warn(ctx, "unsupported HID control request"); - r = LIBUSB_ERROR_NOT_SUPPORTED; - break; - } - - if (r == LIBUSB_COMPLETED) { - // Force request to be completed synchronously. Transferred size has been set by previous call - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - // http://msdn.microsoft.com/en-us/library/ms684342%28VS.85%29.aspx - // set InternalHigh to the number of bytes transferred - wfd.overlapped->InternalHigh = (DWORD)size; - r = LIBUSB_SUCCESS; - } - - if (r == LIBUSB_SUCCESS) { - // Use priv_transfer to store data needed for async polling - transfer_priv->pollable_fd = wfd; - transfer_priv->interface_number = (uint8_t)current_interface; - } else { - usbi_free_fd(&wfd); - } - - return r; -} - -static int hid_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - struct winfd wfd; - HANDLE hid_handle; - bool direction_in, ret; - int current_interface, length; - DWORD size; - int r = LIBUSB_SUCCESS; - - CHECK_HID_AVAILABLE; - - transfer_priv->pollable_fd = INVALID_WINFD; - transfer_priv->hid_dest = NULL; - safe_free(transfer_priv->hid_buffer); - - current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); - if (current_interface < 0) { - usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); - return LIBUSB_ERROR_NOT_FOUND; - } - - usbi_dbg("matched endpoint %02X with interface %d", transfer->endpoint, current_interface); - - hid_handle = handle_priv->interface_handle[current_interface].api_handle; - direction_in = transfer->endpoint & LIBUSB_ENDPOINT_IN; - - wfd = usbi_create_fd(hid_handle, direction_in?RW_READ:RW_WRITE, NULL, NULL); - // Always use the handle returned from usbi_create_fd (wfd.handle) - if (wfd.fd < 0) - return LIBUSB_ERROR_NO_MEM; - - // If report IDs are not in use, an extra prefix byte must be added - if (((direction_in) && (!priv->hid->uses_report_ids[0])) - || ((!direction_in) && (!priv->hid->uses_report_ids[1]))) - length = transfer->length + 1; - else - length = transfer->length; - - // Add a trailing byte to detect overflows on input - transfer_priv->hid_buffer = calloc(1, length + 1); - if (transfer_priv->hid_buffer == NULL) - return LIBUSB_ERROR_NO_MEM; - - transfer_priv->hid_expected_size = length; - - if (direction_in) { - transfer_priv->hid_dest = transfer->buffer; - usbi_dbg("reading %d bytes (report ID: 0x00)", length); - ret = ReadFile(wfd.handle, transfer_priv->hid_buffer, length + 1, &size, wfd.overlapped); - } else { - if (!priv->hid->uses_report_ids[1]) - memcpy(transfer_priv->hid_buffer + 1, transfer->buffer, transfer->length); - else - // We could actually do without the calloc and memcpy in this case - memcpy(transfer_priv->hid_buffer, transfer->buffer, transfer->length); - - usbi_dbg("writing %d bytes (report ID: 0x%02X)", length, transfer_priv->hid_buffer[0]); - ret = WriteFile(wfd.handle, transfer_priv->hid_buffer, length, &size, wfd.overlapped); - } - - if (!ret) { - if (GetLastError() != ERROR_IO_PENDING) { - usbi_err(ctx, "HID transfer failed: %s", windows_error_str(0)); - usbi_free_fd(&wfd); - safe_free(transfer_priv->hid_buffer); - return LIBUSB_ERROR_IO; - } - } else { - // Only write operations that completed synchronously need to free up - // hid_buffer. For reads, copy_transfer_data() handles that process. - if (!direction_in) - safe_free(transfer_priv->hid_buffer); - - if (size == 0) { - usbi_err(ctx, "program assertion failed - no data was transferred"); - size = 1; - } - if (size > (size_t)length) { - usbi_err(ctx, "OVERFLOW!"); - r = LIBUSB_ERROR_OVERFLOW; - } - wfd.overlapped->Internal = STATUS_COMPLETED_SYNCHRONOUSLY; - wfd.overlapped->InternalHigh = size; - } - - transfer_priv->pollable_fd = wfd; - transfer_priv->interface_number = (uint8_t)current_interface; - - return r; -} - -static int hid_abort_transfers(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - HANDLE hid_handle; - int current_interface; - - CHECK_HID_AVAILABLE; - - current_interface = transfer_priv->interface_number; - hid_handle = handle_priv->interface_handle[current_interface].api_handle; - CancelIo(hid_handle); - - return LIBUSB_SUCCESS; -} - -static int hid_reset_device(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - HANDLE hid_handle; - int current_interface; - - CHECK_HID_AVAILABLE; - - // Flushing the queues on all interfaces is the best we can achieve - for (current_interface = 0; current_interface < USB_MAXINTERFACES; current_interface++) { - hid_handle = handle_priv->interface_handle[current_interface].api_handle; - if (HANDLE_VALID(hid_handle)) - HidD_FlushQueue(hid_handle); - } - - return LIBUSB_SUCCESS; -} - -static int hid_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - HANDLE hid_handle; - int current_interface; - - CHECK_HID_AVAILABLE; - - current_interface = interface_by_endpoint(priv, handle_priv, endpoint); - if (current_interface < 0) { - usbi_err(ctx, "unable to match endpoint to an open interface - cannot clear"); - return LIBUSB_ERROR_NOT_FOUND; - } - - usbi_dbg("matched endpoint %02X with interface %d", endpoint, current_interface); - hid_handle = handle_priv->interface_handle[current_interface].api_handle; - - // No endpoint selection with Microsoft's implementation, so we try to flush the - // whole interface. Should be OK for most case scenarios - if (!HidD_FlushQueue(hid_handle)) { - usbi_err(ctx, "Flushing of HID queue failed: %s", windows_error_str(0)); - // Device was probably disconnected - return LIBUSB_ERROR_NO_DEVICE; - } - - return LIBUSB_SUCCESS; -} - -// This extra function is only needed for HID -static int hid_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - int r = LIBUSB_TRANSFER_COMPLETED; - uint32_t corrected_size = io_size; - - if (transfer_priv->hid_buffer != NULL) { - // If we have a valid hid_buffer, it means the transfer was async - if (transfer_priv->hid_dest != NULL) { // Data readout - if (corrected_size > 0) { - // First, check for overflow - if (corrected_size > transfer_priv->hid_expected_size) { - usbi_err(ctx, "OVERFLOW!"); - corrected_size = (uint32_t)transfer_priv->hid_expected_size; - r = LIBUSB_TRANSFER_OVERFLOW; - } - - if (transfer_priv->hid_buffer[0] == 0) { - // Discard the 1 byte report ID prefix - corrected_size--; - memcpy(transfer_priv->hid_dest, transfer_priv->hid_buffer + 1, corrected_size); - } else { - memcpy(transfer_priv->hid_dest, transfer_priv->hid_buffer, corrected_size); - } - } - transfer_priv->hid_dest = NULL; - } - // For write, we just need to free the hid buffer - safe_free(transfer_priv->hid_buffer); - } - - itransfer->transferred += corrected_size; - return r; -} - - -/* - * Composite API functions - */ -static int composite_init(int sub_api, struct libusb_context *ctx) -{ - return LIBUSB_SUCCESS; -} - -static int composite_exit(int sub_api) -{ - return LIBUSB_SUCCESS; -} - -static int composite_open(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - int r = LIBUSB_ERROR_NOT_FOUND; - uint8_t i; - // SUB_API_MAX + 1 as the SUB_API_MAX pos is used to indicate availability of HID - bool available[SUB_API_MAX + 1] = { 0 }; - - for (i = 0; i < USB_MAXINTERFACES; i++) { - switch (priv->usb_interface[i].apib->id) { - case USB_API_WINUSBX: - if (priv->usb_interface[i].sub_api != SUB_API_NOTSET) - available[priv->usb_interface[i].sub_api] = true; - break; - case USB_API_HID: - available[SUB_API_MAX] = true; - break; - default: - break; - } - } - - for (i = 0; i < SUB_API_MAX; i++) { // WinUSB-like drivers - if (available[i]) { - r = usb_api_backend[USB_API_WINUSBX].open(i, dev_handle); - if (r != LIBUSB_SUCCESS) - return r; - } - } - - if (available[SUB_API_MAX]) // HID driver - r = hid_open(SUB_API_NOTSET, dev_handle); - - return r; -} - -static void composite_close(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - uint8_t i; - // SUB_API_MAX + 1 as the SUB_API_MAX pos is used to indicate availability of HID - bool available[SUB_API_MAX + 1] = { 0 }; - - for (i = 0; i < USB_MAXINTERFACES; i++) { - switch (priv->usb_interface[i].apib->id) { - case USB_API_WINUSBX: - if (priv->usb_interface[i].sub_api != SUB_API_NOTSET) - available[priv->usb_interface[i].sub_api] = true; - break; - case USB_API_HID: - available[SUB_API_MAX] = true; - break; - default: - break; - } - } - - for (i = 0; i < SUB_API_MAX; i++) { // WinUSB-like drivers - if (available[i]) - usb_api_backend[USB_API_WINUSBX].close(i, dev_handle); - } - - if (available[SUB_API_MAX]) // HID driver - hid_close(SUB_API_NOTSET, dev_handle); -} - -static int composite_claim_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - return priv->usb_interface[iface].apib-> - claim_interface(priv->usb_interface[iface].sub_api, dev_handle, iface); -} - -static int composite_set_interface_altsetting(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - return priv->usb_interface[iface].apib-> - set_interface_altsetting(priv->usb_interface[iface].sub_api, dev_handle, iface, altsetting); -} - -static int composite_release_interface(int sub_api, struct libusb_device_handle *dev_handle, int iface) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - - return priv->usb_interface[iface].apib-> - release_interface(priv->usb_interface[iface].sub_api, dev_handle, iface); -} - -static int composite_submit_control_transfer(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - struct libusb_config_descriptor *conf_desc; - WINUSB_SETUP_PACKET *setup = (WINUSB_SETUP_PACKET *)transfer->buffer; - int iface, pass, r; - - // Interface shouldn't matter for control, but it does in practice, with Windows' - // restrictions with regards to accessing HID keyboards and mice. Try to target - // a specific interface first, if possible. - switch (LIBUSB_REQ_RECIPIENT(setup->request_type)) { - case LIBUSB_RECIPIENT_INTERFACE: - iface = setup->index & 0xFF; - break; - case LIBUSB_RECIPIENT_ENDPOINT: - r = libusb_get_active_config_descriptor(transfer->dev_handle->dev, &conf_desc); - if (r == LIBUSB_SUCCESS) { - iface = get_interface_by_endpoint(conf_desc, (setup->index & 0xFF)); - libusb_free_config_descriptor(conf_desc); - break; - } - // Fall through if not able to determine interface - default: - iface = -1; - break; - } - - // Try and target a specific interface if the control setup indicates such - if ((iface >= 0) && (iface < USB_MAXINTERFACES)) { - usbi_dbg("attempting control transfer targeted to interface %d", iface); - if (priv->usb_interface[iface].path != NULL) { - r = priv->usb_interface[iface].apib->submit_control_transfer(priv->usb_interface[iface].sub_api, itransfer); - if (r == LIBUSB_SUCCESS) - return r; - } - } - - // Either not targeted to a specific interface or no luck in doing so. - // Try a 2 pass approach with all interfaces. - for (pass = 0; pass < 2; pass++) { - for (iface = 0; iface < USB_MAXINTERFACES; iface++) { - if (priv->usb_interface[iface].path != NULL) { - if ((pass == 0) && (priv->usb_interface[iface].restricted_functionality)) { - usbi_dbg("trying to skip restricted interface #%d (HID keyboard or mouse?)", iface); - continue; - } - usbi_dbg("using interface %d", iface); - r = priv->usb_interface[iface].apib->submit_control_transfer(priv->usb_interface[iface].sub_api, itransfer); - // If not supported on this API, it may be supported on another, so don't give up yet!! - if (r == LIBUSB_ERROR_NOT_SUPPORTED) - continue; - return r; - } - } - } - - usbi_err(ctx, "no libusb supported interfaces to complete request"); - return LIBUSB_ERROR_NOT_FOUND; -} - -static int composite_submit_bulk_transfer(int sub_api, struct usbi_transfer *itransfer) { - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - int current_interface; - - current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); - if (current_interface < 0) { - usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); - return LIBUSB_ERROR_NOT_FOUND; - } - - return priv->usb_interface[current_interface].apib-> - submit_bulk_transfer(priv->usb_interface[current_interface].sub_api, itransfer); -} - -static int composite_submit_iso_transfer(int sub_api, struct usbi_transfer *itransfer) { - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct libusb_context *ctx = DEVICE_CTX(transfer->dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(transfer->dev_handle); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - int current_interface; - - current_interface = interface_by_endpoint(priv, handle_priv, transfer->endpoint); - if (current_interface < 0) { - usbi_err(ctx, "unable to match endpoint to an open interface - cancelling transfer"); - return LIBUSB_ERROR_NOT_FOUND; - } - - return priv->usb_interface[current_interface].apib-> - submit_iso_transfer(priv->usb_interface[current_interface].sub_api, itransfer); -} - -static int composite_clear_halt(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint) -{ - struct libusb_context *ctx = DEVICE_CTX(dev_handle->dev); - struct windows_device_handle_priv *handle_priv = _device_handle_priv(dev_handle); - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - int current_interface; - - current_interface = interface_by_endpoint(priv, handle_priv, endpoint); - if (current_interface < 0) { - usbi_err(ctx, "unable to match endpoint to an open interface - cannot clear"); - return LIBUSB_ERROR_NOT_FOUND; - } - - return priv->usb_interface[current_interface].apib-> - clear_halt(priv->usb_interface[current_interface].sub_api, dev_handle, endpoint); -} - -static int composite_abort_control(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - - return priv->usb_interface[transfer_priv->interface_number].apib-> - abort_control(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer); -} - -static int composite_abort_transfers(int sub_api, struct usbi_transfer *itransfer) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - - return priv->usb_interface[transfer_priv->interface_number].apib-> - abort_transfers(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer); -} - -static int composite_reset_device(int sub_api, struct libusb_device_handle *dev_handle) -{ - struct windows_device_priv *priv = _device_priv(dev_handle->dev); - int r; - uint8_t i; - bool available[SUB_API_MAX]; - - for (i = 0; i < SUB_API_MAX; i++) - available[i] = false; - - for (i = 0; i < USB_MAXINTERFACES; i++) { - if ((priv->usb_interface[i].apib->id == USB_API_WINUSBX) - && (priv->usb_interface[i].sub_api != SUB_API_NOTSET)) - available[priv->usb_interface[i].sub_api] = true; - } - - for (i = 0; i < SUB_API_MAX; i++) { - if (available[i]) { - r = usb_api_backend[USB_API_WINUSBX].reset_device(i, dev_handle); - if (r != LIBUSB_SUCCESS) - return r; - } - } - - return LIBUSB_SUCCESS; -} - -static int composite_copy_transfer_data(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size) -{ - struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); - struct windows_transfer_priv *transfer_priv = usbi_transfer_get_os_priv(itransfer); - struct windows_device_priv *priv = _device_priv(transfer->dev_handle->dev); - - return priv->usb_interface[transfer_priv->interface_number].apib-> - copy_transfer_data(priv->usb_interface[transfer_priv->interface_number].sub_api, itransfer, io_size); -} - -#endif /* !USE_USBDK */ diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_winusb.h b/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_winusb.h deleted file mode 100644 index b7b9cd919a98..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/os/windows_winusb.h +++ /dev/null @@ -1,937 +0,0 @@ -/* - * Windows backend for libusb 1.0 - * Copyright © 2009-2012 Pete Batard - * With contributions from Michael Plante, Orin Eman et al. - * Parts of this code adapted from libusb-win32-v1 by Stephan Meyer - * Major code testing contribution by Xiaofan Chen - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#pragma once - -#include "windows_common.h" -#include "windows_nt_common.h" - -#if defined(_MSC_VER) -// disable /W4 MSVC warnings that are benign -#pragma warning(disable:4100) // unreferenced formal parameter -#pragma warning(disable:4127) // conditional expression is constant -#pragma warning(disable:4201) // nameless struct/union -#pragma warning(disable:4214) // bit field types other than int -#pragma warning(disable:4996) // deprecated API calls -#pragma warning(disable:28159) // more deprecated API calls -#endif - -// Missing from MSVC6 setupapi.h -#if !defined(SPDRP_ADDRESS) -#define SPDRP_ADDRESS 28 -#endif -#if !defined(SPDRP_INSTALL_STATE) -#define SPDRP_INSTALL_STATE 34 -#endif - -#define MAX_CTRL_BUFFER_LENGTH 4096 -#define MAX_USB_DEVICES 256 -#define MAX_USB_STRING_LENGTH 128 -#define MAX_HID_REPORT_SIZE 1024 -#define MAX_HID_DESCRIPTOR_SIZE 256 -#define MAX_GUID_STRING_LENGTH 40 -#define MAX_PATH_LENGTH 128 -#define MAX_KEY_LENGTH 256 -#define LIST_SEPARATOR ';' - -// Handle code for HID interface that have been claimed ("dibs") -#define INTERFACE_CLAIMED ((HANDLE)(intptr_t)0xD1B5) -// Additional return code for HID operations that completed synchronously -#define LIBUSB_COMPLETED (LIBUSB_SUCCESS + 1) - -// http://msdn.microsoft.com/en-us/library/ff545978.aspx -// http://msdn.microsoft.com/en-us/library/ff545972.aspx -// http://msdn.microsoft.com/en-us/library/ff545982.aspx -#if !defined(GUID_DEVINTERFACE_USB_HOST_CONTROLLER) -const GUID GUID_DEVINTERFACE_USB_HOST_CONTROLLER = { 0x3ABF6F2D, 0x71C4, 0x462A, {0x8A, 0x92, 0x1E, 0x68, 0x61, 0xE6, 0xAF, 0x27} }; -#endif -#if !defined(GUID_DEVINTERFACE_USB_DEVICE) -const GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED} }; -#endif -#if !defined(GUID_DEVINTERFACE_USB_HUB) -const GUID GUID_DEVINTERFACE_USB_HUB = { 0xF18A0E88, 0xC30C, 0x11D0, {0x88, 0x15, 0x00, 0xA0, 0xC9, 0x06, 0xBE, 0xD8} }; -#endif -#if !defined(GUID_DEVINTERFACE_LIBUSB0_FILTER) -const GUID GUID_DEVINTERFACE_LIBUSB0_FILTER = { 0xF9F3FF14, 0xAE21, 0x48A0, {0x8A, 0x25, 0x80, 0x11, 0xA7, 0xA9, 0x31, 0xD9} }; -#endif - - -/* - * Multiple USB API backend support - */ -#define USB_API_UNSUPPORTED 0 -#define USB_API_HUB 1 -#define USB_API_COMPOSITE 2 -#define USB_API_WINUSBX 3 -#define USB_API_HID 4 -#define USB_API_MAX 5 -// The following is used to indicate if the HID or composite extra props have already been set. -#define USB_API_SET (1 << USB_API_MAX) - -// Sub-APIs for WinUSB-like driver APIs (WinUSB, libusbK, libusb-win32 through the libusbK DLL) -// Must have the same values as the KUSB_DRVID enum from libusbk.h -#define SUB_API_NOTSET -1 -#define SUB_API_LIBUSBK 0 -#define SUB_API_LIBUSB0 1 -#define SUB_API_WINUSB 2 -#define SUB_API_MAX 3 - -#define WINUSBX_DRV_NAMES {"libusbK", "libusb0", "WinUSB"} - -struct windows_usb_api_backend { - const uint8_t id; - const char *designation; - const char **driver_name_list; // Driver name, without .sys, e.g. "usbccgp" - const uint8_t nb_driver_names; - int (*init)(int sub_api, struct libusb_context *ctx); - int (*exit)(int sub_api); - int (*open)(int sub_api, struct libusb_device_handle *dev_handle); - void (*close)(int sub_api, struct libusb_device_handle *dev_handle); - int (*configure_endpoints)(int sub_api, struct libusb_device_handle *dev_handle, int iface); - int (*claim_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface); - int (*set_interface_altsetting)(int sub_api, struct libusb_device_handle *dev_handle, int iface, int altsetting); - int (*release_interface)(int sub_api, struct libusb_device_handle *dev_handle, int iface); - int (*clear_halt)(int sub_api, struct libusb_device_handle *dev_handle, unsigned char endpoint); - int (*reset_device)(int sub_api, struct libusb_device_handle *dev_handle); - int (*submit_bulk_transfer)(int sub_api, struct usbi_transfer *itransfer); - int (*submit_iso_transfer)(int sub_api, struct usbi_transfer *itransfer); - int (*submit_control_transfer)(int sub_api, struct usbi_transfer *itransfer); - int (*abort_control)(int sub_api, struct usbi_transfer *itransfer); - int (*abort_transfers)(int sub_api, struct usbi_transfer *itransfer); - int (*copy_transfer_data)(int sub_api, struct usbi_transfer *itransfer, uint32_t io_size); -}; - -extern const struct windows_usb_api_backend usb_api_backend[USB_API_MAX]; - -#define PRINT_UNSUPPORTED_API(fname) \ - usbi_dbg("unsupported API call for '" \ - #fname "' (unrecognized device driver)"); \ - return LIBUSB_ERROR_NOT_SUPPORTED; - -/* - * private structures definition - * with inline pseudo constructors/destructors - */ - -// TODO (v2+): move hid desc to libusb.h? -struct libusb_hid_descriptor { - uint8_t bLength; - uint8_t bDescriptorType; - uint16_t bcdHID; - uint8_t bCountryCode; - uint8_t bNumDescriptors; - uint8_t bClassDescriptorType; - uint16_t wClassDescriptorLength; -}; - -#define LIBUSB_DT_HID_SIZE 9 -#define HID_MAX_CONFIG_DESC_SIZE (LIBUSB_DT_CONFIG_SIZE + LIBUSB_DT_INTERFACE_SIZE \ - + LIBUSB_DT_HID_SIZE + 2 * LIBUSB_DT_ENDPOINT_SIZE) -#define HID_MAX_REPORT_SIZE 1024 -#define HID_IN_EP 0x81 -#define HID_OUT_EP 0x02 -#define LIBUSB_REQ_RECIPIENT(request_type) ((request_type) & 0x1F) -#define LIBUSB_REQ_TYPE(request_type) ((request_type) & (0x03 << 5)) -#define LIBUSB_REQ_IN(request_type) ((request_type) & LIBUSB_ENDPOINT_IN) -#define LIBUSB_REQ_OUT(request_type) (!LIBUSB_REQ_IN(request_type)) - -// The following are used for HID reports IOCTLs -#define HID_CTL_CODE(id) \ - CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_NEITHER, FILE_ANY_ACCESS) -#define HID_BUFFER_CTL_CODE(id) \ - CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_BUFFERED, FILE_ANY_ACCESS) -#define HID_IN_CTL_CODE(id) \ - CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_IN_DIRECT, FILE_ANY_ACCESS) -#define HID_OUT_CTL_CODE(id) \ - CTL_CODE (FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS) - -#define IOCTL_HID_GET_FEATURE HID_OUT_CTL_CODE(100) -#define IOCTL_HID_GET_INPUT_REPORT HID_OUT_CTL_CODE(104) -#define IOCTL_HID_SET_FEATURE HID_IN_CTL_CODE(100) -#define IOCTL_HID_SET_OUTPUT_REPORT HID_IN_CTL_CODE(101) - -enum libusb_hid_request_type { - HID_REQ_GET_REPORT = 0x01, - HID_REQ_GET_IDLE = 0x02, - HID_REQ_GET_PROTOCOL = 0x03, - HID_REQ_SET_REPORT = 0x09, - HID_REQ_SET_IDLE = 0x0A, - HID_REQ_SET_PROTOCOL = 0x0B -}; - -enum libusb_hid_report_type { - HID_REPORT_TYPE_INPUT = 0x01, - HID_REPORT_TYPE_OUTPUT = 0x02, - HID_REPORT_TYPE_FEATURE = 0x03 -}; - -struct hid_device_priv { - uint16_t vid; - uint16_t pid; - uint8_t config; - uint8_t nb_interfaces; - bool uses_report_ids[3]; // input, ouptput, feature - uint16_t input_report_size; - uint16_t output_report_size; - uint16_t feature_report_size; - WCHAR string[3][MAX_USB_STRING_LENGTH]; - uint8_t string_index[3]; // man, prod, ser -}; - -struct windows_device_priv { - uint8_t depth; // distance to HCD - uint8_t port; // port number on the hub - uint8_t active_config; - struct windows_usb_api_backend const *apib; - char *path; // device interface path - int sub_api; // for WinUSB-like APIs - struct { - char *path; // each interface needs a device interface path, - struct windows_usb_api_backend const *apib; // an API backend (multiple drivers support), - int sub_api; - int8_t nb_endpoints; // and a set of endpoint addresses (USB_MAXENDPOINTS) - uint8_t *endpoint; - bool restricted_functionality; // indicates if the interface functionality is restricted - // by Windows (eg. HID keyboards or mice cannot do R/W) - } usb_interface[USB_MAXINTERFACES]; - struct hid_device_priv *hid; - USB_DEVICE_DESCRIPTOR dev_descriptor; - unsigned char **config_descriptor; // list of pointers to the cached config descriptors -}; - -static inline struct windows_device_priv *_device_priv(struct libusb_device *dev) -{ - return (struct windows_device_priv *)dev->os_priv; -} - -static inline struct windows_device_priv *windows_device_priv_init(struct libusb_device *dev) -{ - struct windows_device_priv *p = _device_priv(dev); - int i; - - p->apib = &usb_api_backend[USB_API_UNSUPPORTED]; - p->sub_api = SUB_API_NOTSET; - for (i = 0; i < USB_MAXINTERFACES; i++) { - p->usb_interface[i].apib = &usb_api_backend[USB_API_UNSUPPORTED]; - p->usb_interface[i].sub_api = SUB_API_NOTSET; - } - - return p; -} - -static inline void windows_device_priv_release(struct libusb_device *dev) -{ - struct windows_device_priv *p = _device_priv(dev); - int i; - - free(p->path); - if ((dev->num_configurations > 0) && (p->config_descriptor != NULL)) { - for (i = 0; i < dev->num_configurations; i++) - free(p->config_descriptor[i]); - } - free(p->config_descriptor); - free(p->hid); - for (i = 0; i < USB_MAXINTERFACES; i++) { - free(p->usb_interface[i].path); - free(p->usb_interface[i].endpoint); - } -} - -struct interface_handle_t { - HANDLE dev_handle; // WinUSB needs an extra handle for the file - HANDLE api_handle; // used by the API to communicate with the device -}; - -struct windows_device_handle_priv { - int active_interface; - struct interface_handle_t interface_handle[USB_MAXINTERFACES]; - int autoclaim_count[USB_MAXINTERFACES]; // For auto-release -}; - -static inline struct windows_device_handle_priv *_device_handle_priv( - struct libusb_device_handle *handle) -{ - return (struct windows_device_handle_priv *)handle->os_priv; -} - -// used for async polling functions -struct windows_transfer_priv { - struct winfd pollable_fd; - uint8_t interface_number; - uint8_t *hid_buffer; // 1 byte extended data buffer, required for HID - uint8_t *hid_dest; // transfer buffer destination, required for HID - size_t hid_expected_size; -}; - -// used to match a device driver (including filter drivers) against a supported API -struct driver_lookup { - char list[MAX_KEY_LENGTH + 1]; // REG_MULTI_SZ list of services (driver) names - const DWORD reg_prop; // SPDRP registry key to use to retrieve list - const char* designation; // internal designation (for debug output) -}; - -/* OLE32 dependency */ -DLL_DECLARE_HANDLE(OLE32); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, HRESULT, p, CLSIDFromString, (LPCOLESTR, LPCLSID)); - -/* Kernel32 dependencies */ -DLL_DECLARE_HANDLE(Kernel32); -/* This call is only available from XP SP2 */ -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, IsWow64Process, (HANDLE, PBOOL)); - -/* SetupAPI dependencies */ -DLL_DECLARE_HANDLE(SetupAPI); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, HDEVINFO, p, SetupDiGetClassDevsA, (const GUID*, PCSTR, HWND, DWORD)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInfo, (HDEVINFO, DWORD, PSP_DEVINFO_DATA)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiEnumDeviceInterfaces, (HDEVINFO, PSP_DEVINFO_DATA, - const GUID*, DWORD, PSP_DEVICE_INTERFACE_DATA)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceInterfaceDetailA, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, - PSP_DEVICE_INTERFACE_DETAIL_DATA_A, DWORD, PDWORD, PSP_DEVINFO_DATA)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiDestroyDeviceInfoList, (HDEVINFO)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDevRegKey, (HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, BOOL, p, SetupDiGetDeviceRegistryPropertyA, (HDEVINFO, - PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, HKEY, p, SetupDiOpenDeviceInterfaceRegKey, (HDEVINFO, PSP_DEVICE_INTERFACE_DATA, DWORD, DWORD)); - -/* AdvAPI32 dependencies */ -DLL_DECLARE_HANDLE(AdvAPI32); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, LONG, p, RegQueryValueExW, (HKEY, LPCWSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD)); -DLL_DECLARE_FUNC_PREFIXED(WINAPI, LONG, p, RegCloseKey, (HKEY)); - -/* - * Windows DDK API definitions. Most of it copied from MinGW's includes - */ -typedef DWORD DEVNODE, DEVINST; -typedef DEVNODE *PDEVNODE, *PDEVINST; -typedef DWORD RETURN_TYPE; -typedef RETURN_TYPE CONFIGRET; - -#define CR_SUCCESS 0x00000000 -#define CR_NO_SUCH_DEVNODE 0x0000000D - -#define USB_DEVICE_DESCRIPTOR_TYPE LIBUSB_DT_DEVICE -#define USB_CONFIGURATION_DESCRIPTOR_TYPE LIBUSB_DT_CONFIG -#define USB_STRING_DESCRIPTOR_TYPE LIBUSB_DT_STRING -#define USB_INTERFACE_DESCRIPTOR_TYPE LIBUSB_DT_INTERFACE -#define USB_ENDPOINT_DESCRIPTOR_TYPE LIBUSB_DT_ENDPOINT - -#define USB_REQUEST_GET_STATUS LIBUSB_REQUEST_GET_STATUS -#define USB_REQUEST_CLEAR_FEATURE LIBUSB_REQUEST_CLEAR_FEATURE -#define USB_REQUEST_SET_FEATURE LIBUSB_REQUEST_SET_FEATURE -#define USB_REQUEST_SET_ADDRESS LIBUSB_REQUEST_SET_ADDRESS -#define USB_REQUEST_GET_DESCRIPTOR LIBUSB_REQUEST_GET_DESCRIPTOR -#define USB_REQUEST_SET_DESCRIPTOR LIBUSB_REQUEST_SET_DESCRIPTOR -#define USB_REQUEST_GET_CONFIGURATION LIBUSB_REQUEST_GET_CONFIGURATION -#define USB_REQUEST_SET_CONFIGURATION LIBUSB_REQUEST_SET_CONFIGURATION -#define USB_REQUEST_GET_INTERFACE LIBUSB_REQUEST_GET_INTERFACE -#define USB_REQUEST_SET_INTERFACE LIBUSB_REQUEST_SET_INTERFACE -#define USB_REQUEST_SYNC_FRAME LIBUSB_REQUEST_SYNCH_FRAME - -#define USB_GET_NODE_INFORMATION 258 -#define USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION 260 -#define USB_GET_NODE_CONNECTION_NAME 261 -#define USB_GET_HUB_CAPABILITIES 271 -#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX) -#define USB_GET_NODE_CONNECTION_INFORMATION_EX 274 -#endif -#if !defined(USB_GET_HUB_CAPABILITIES_EX) -#define USB_GET_HUB_CAPABILITIES_EX 276 -#endif -#if !defined(USB_GET_NODE_CONNECTION_INFORMATION_EX_V2) -#define USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 279 -#endif - -#ifndef METHOD_BUFFERED -#define METHOD_BUFFERED 0 -#endif -#ifndef FILE_ANY_ACCESS -#define FILE_ANY_ACCESS 0x00000000 -#endif -#ifndef FILE_DEVICE_UNKNOWN -#define FILE_DEVICE_UNKNOWN 0x00000022 -#endif -#ifndef FILE_DEVICE_USB -#define FILE_DEVICE_USB FILE_DEVICE_UNKNOWN -#endif - -#ifndef CTL_CODE -#define CTL_CODE(DeviceType, Function, Method, Access) \ - (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method)) -#endif - -typedef enum USB_CONNECTION_STATUS { - NoDeviceConnected, - DeviceConnected, - DeviceFailedEnumeration, - DeviceGeneralFailure, - DeviceCausedOvercurrent, - DeviceNotEnoughPower, - DeviceNotEnoughBandwidth, - DeviceHubNestedTooDeeply, - DeviceInLegacyHub -} USB_CONNECTION_STATUS, *PUSB_CONNECTION_STATUS; - -typedef enum USB_HUB_NODE { - UsbHub, - UsbMIParent -} USB_HUB_NODE; - -/* Cfgmgr32.dll interface */ -DLL_DECLARE_HANDLE(Cfgmgr32); -DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Parent, (PDEVINST, DEVINST, ULONG)); -DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Child, (PDEVINST, DEVINST, ULONG)); -DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Sibling, (PDEVINST, DEVINST, ULONG)); -DLL_DECLARE_FUNC(WINAPI, CONFIGRET, CM_Get_Device_IDA, (DEVINST, PCHAR, ULONG, ULONG)); - -#define IOCTL_USB_GET_HUB_CAPABILITIES_EX \ - CTL_CODE( FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_HUB_CAPABILITIES \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_HUB_CAPABILITIES, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_DESCRIPTOR_FROM_NODE_CONNECTION, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_ROOT_HUB_NAME \ - CTL_CODE(FILE_DEVICE_USB, HCD_GET_ROOT_HUB_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_NODE_INFORMATION \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_INFORMATION, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX_V2 \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_INFORMATION_EX_V2, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_NODE_CONNECTION_ATTRIBUTES \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_ATTRIBUTES, METHOD_BUFFERED, FILE_ANY_ACCESS) - -#define IOCTL_USB_GET_NODE_CONNECTION_NAME \ - CTL_CODE(FILE_DEVICE_USB, USB_GET_NODE_CONNECTION_NAME, METHOD_BUFFERED, FILE_ANY_ACCESS) - -// Most of the structures below need to be packed -#pragma pack(push, 1) - -typedef struct USB_INTERFACE_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; - UCHAR bInterfaceNumber; - UCHAR bAlternateSetting; - UCHAR bNumEndpoints; - UCHAR bInterfaceClass; - UCHAR bInterfaceSubClass; - UCHAR bInterfaceProtocol; - UCHAR iInterface; -} USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR; - -typedef struct USB_CONFIGURATION_DESCRIPTOR_SHORT { - struct { - ULONG ConnectionIndex; - struct { - UCHAR bmRequest; - UCHAR bRequest; - USHORT wValue; - USHORT wIndex; - USHORT wLength; - } SetupPacket; - } req; - USB_CONFIGURATION_DESCRIPTOR data; -} USB_CONFIGURATION_DESCRIPTOR_SHORT; - -typedef struct USB_ENDPOINT_DESCRIPTOR { - UCHAR bLength; - UCHAR bDescriptorType; - UCHAR bEndpointAddress; - UCHAR bmAttributes; - USHORT wMaxPacketSize; - UCHAR bInterval; -} USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR; - -typedef struct USB_DESCRIPTOR_REQUEST { - ULONG ConnectionIndex; - struct { - UCHAR bmRequest; - UCHAR bRequest; - USHORT wValue; - USHORT wIndex; - USHORT wLength; - } SetupPacket; -// UCHAR Data[0]; -} USB_DESCRIPTOR_REQUEST, *PUSB_DESCRIPTOR_REQUEST; - -typedef struct USB_HUB_DESCRIPTOR { - UCHAR bDescriptorLength; - UCHAR bDescriptorType; - UCHAR bNumberOfPorts; - USHORT wHubCharacteristics; - UCHAR bPowerOnToPowerGood; - UCHAR bHubControlCurrent; - UCHAR bRemoveAndPowerMask[64]; -} USB_HUB_DESCRIPTOR, *PUSB_HUB_DESCRIPTOR; - -typedef struct USB_ROOT_HUB_NAME { - ULONG ActualLength; - WCHAR RootHubName[1]; -} USB_ROOT_HUB_NAME, *PUSB_ROOT_HUB_NAME; - -typedef struct USB_ROOT_HUB_NAME_FIXED { - ULONG ActualLength; - WCHAR RootHubName[MAX_PATH_LENGTH]; -} USB_ROOT_HUB_NAME_FIXED; - -typedef struct USB_NODE_CONNECTION_NAME { - ULONG ConnectionIndex; - ULONG ActualLength; - WCHAR NodeName[1]; -} USB_NODE_CONNECTION_NAME, *PUSB_NODE_CONNECTION_NAME; - -typedef struct USB_NODE_CONNECTION_NAME_FIXED { - ULONG ConnectionIndex; - ULONG ActualLength; - WCHAR NodeName[MAX_PATH_LENGTH]; -} USB_NODE_CONNECTION_NAME_FIXED; - -typedef struct USB_HUB_NAME_FIXED { - union { - USB_ROOT_HUB_NAME_FIXED root; - USB_NODE_CONNECTION_NAME_FIXED node; - } u; -} USB_HUB_NAME_FIXED; - -typedef struct USB_HUB_INFORMATION { - USB_HUB_DESCRIPTOR HubDescriptor; - BOOLEAN HubIsBusPowered; -} USB_HUB_INFORMATION, *PUSB_HUB_INFORMATION; - -typedef struct USB_MI_PARENT_INFORMATION { - ULONG NumberOfInterfaces; -} USB_MI_PARENT_INFORMATION, *PUSB_MI_PARENT_INFORMATION; - -typedef struct USB_NODE_INFORMATION { - USB_HUB_NODE NodeType; - union { - USB_HUB_INFORMATION HubInformation; - USB_MI_PARENT_INFORMATION MiParentInformation; - } u; -} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION; - -typedef struct USB_PIPE_INFO { - USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; - ULONG ScheduleOffset; -} USB_PIPE_INFO, *PUSB_PIPE_INFO; - -typedef struct USB_NODE_CONNECTION_INFORMATION_EX { - ULONG ConnectionIndex; - USB_DEVICE_DESCRIPTOR DeviceDescriptor; - UCHAR CurrentConfigurationValue; - UCHAR Speed; - BOOLEAN DeviceIsHub; - USHORT DeviceAddress; - ULONG NumberOfOpenPipes; - USB_CONNECTION_STATUS ConnectionStatus; -// USB_PIPE_INFO PipeList[0]; -} USB_NODE_CONNECTION_INFORMATION_EX, *PUSB_NODE_CONNECTION_INFORMATION_EX; - -typedef union _USB_PROTOCOLS { - ULONG ul; - struct { - ULONG Usb110:1; - ULONG Usb200:1; - ULONG Usb300:1; - ULONG ReservedMBZ:29; - }; -} USB_PROTOCOLS, *PUSB_PROTOCOLS; - -typedef union _USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS { - ULONG ul; - struct { - ULONG DeviceIsOperatingAtSuperSpeedOrHigher:1; - ULONG DeviceIsSuperSpeedCapableOrHigher:1; - ULONG ReservedMBZ:30; - }; -} USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS; - -typedef struct _USB_NODE_CONNECTION_INFORMATION_EX_V2 { - ULONG ConnectionIndex; - ULONG Length; - USB_PROTOCOLS SupportedUsbProtocols; - USB_NODE_CONNECTION_INFORMATION_EX_V2_FLAGS Flags; -} USB_NODE_CONNECTION_INFORMATION_EX_V2, *PUSB_NODE_CONNECTION_INFORMATION_EX_V2; - -typedef struct USB_HUB_CAP_FLAGS { - ULONG HubIsHighSpeedCapable:1; - ULONG HubIsHighSpeed:1; - ULONG HubIsMultiTtCapable:1; - ULONG HubIsMultiTt:1; - ULONG HubIsRoot:1; - ULONG HubIsArmedWakeOnConnect:1; - ULONG ReservedMBZ:26; -} USB_HUB_CAP_FLAGS, *PUSB_HUB_CAP_FLAGS; - -typedef struct USB_HUB_CAPABILITIES { - ULONG HubIs2xCapable:1; -} USB_HUB_CAPABILITIES, *PUSB_HUB_CAPABILITIES; - -typedef struct USB_HUB_CAPABILITIES_EX { - USB_HUB_CAP_FLAGS CapabilityFlags; -} USB_HUB_CAPABILITIES_EX, *PUSB_HUB_CAPABILITIES_EX; - -#pragma pack(pop) - -/* winusb.dll interface */ - -#define SHORT_PACKET_TERMINATE 0x01 -#define AUTO_CLEAR_STALL 0x02 -#define PIPE_TRANSFER_TIMEOUT 0x03 -#define IGNORE_SHORT_PACKETS 0x04 -#define ALLOW_PARTIAL_READS 0x05 -#define AUTO_FLUSH 0x06 -#define RAW_IO 0x07 -#define MAXIMUM_TRANSFER_SIZE 0x08 -#define AUTO_SUSPEND 0x81 -#define SUSPEND_DELAY 0x83 -#define DEVICE_SPEED 0x01 -#define LowSpeed 0x01 -#define FullSpeed 0x02 -#define HighSpeed 0x03 - -typedef enum USBD_PIPE_TYPE { - UsbdPipeTypeControl, - UsbdPipeTypeIsochronous, - UsbdPipeTypeBulk, - UsbdPipeTypeInterrupt -} USBD_PIPE_TYPE; - -typedef struct { - USBD_PIPE_TYPE PipeType; - UCHAR PipeId; - USHORT MaximumPacketSize; - UCHAR Interval; -} WINUSB_PIPE_INFORMATION, *PWINUSB_PIPE_INFORMATION; - -#pragma pack(1) -typedef struct { - UCHAR request_type; - UCHAR request; - USHORT value; - USHORT index; - USHORT length; -} WINUSB_SETUP_PACKET, *PWINUSB_SETUP_PACKET; -#pragma pack() - -typedef void *WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE; - -typedef BOOL (WINAPI *WinUsb_AbortPipe_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID -); -typedef BOOL (WINAPI *WinUsb_ControlTransfer_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - WINUSB_SETUP_PACKET SetupPacket, - PUCHAR Buffer, - ULONG BufferLength, - PULONG LengthTransferred, - LPOVERLAPPED Overlapped -); -typedef BOOL (WINAPI *WinUsb_FlushPipe_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID -); -typedef BOOL (WINAPI *WinUsb_Free_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle -); -typedef BOOL (WINAPI *WinUsb_GetAssociatedInterface_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR AssociatedInterfaceIndex, - PWINUSB_INTERFACE_HANDLE AssociatedInterfaceHandle -); -typedef BOOL (WINAPI *WinUsb_GetCurrentAlternateSetting_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - PUCHAR AlternateSetting -); -typedef BOOL (WINAPI *WinUsb_GetDescriptor_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR DescriptorType, - UCHAR Index, - USHORT LanguageID, - PUCHAR Buffer, - ULONG BufferLength, - PULONG LengthTransferred -); -typedef BOOL (WINAPI *WinUsb_GetOverlappedResult_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - LPOVERLAPPED lpOverlapped, - LPDWORD lpNumberOfBytesTransferred, - BOOL bWait -); -typedef BOOL (WINAPI *WinUsb_GetPipePolicy_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID, - ULONG PolicyType, - PULONG ValueLength, - PVOID Value -); -typedef BOOL (WINAPI *WinUsb_GetPowerPolicy_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - ULONG PolicyType, - PULONG ValueLength, - PVOID Value -); -typedef BOOL (WINAPI *WinUsb_Initialize_t)( - HANDLE DeviceHandle, - PWINUSB_INTERFACE_HANDLE InterfaceHandle -); -typedef BOOL (WINAPI *WinUsb_QueryDeviceInformation_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - ULONG InformationType, - PULONG BufferLength, - PVOID Buffer -); -typedef BOOL (WINAPI *WinUsb_QueryInterfaceSettings_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR AlternateSettingNumber, - PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor -); -typedef BOOL (WINAPI *WinUsb_QueryPipe_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR AlternateInterfaceNumber, - UCHAR PipeIndex, - PWINUSB_PIPE_INFORMATION PipeInformation -); -typedef BOOL (WINAPI *WinUsb_ReadPipe_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID, - PUCHAR Buffer, - ULONG BufferLength, - PULONG LengthTransferred, - LPOVERLAPPED Overlapped -); -typedef BOOL (WINAPI *WinUsb_ResetPipe_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID -); -typedef BOOL (WINAPI *WinUsb_SetCurrentAlternateSetting_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR AlternateSetting -); -typedef BOOL (WINAPI *WinUsb_SetPipePolicy_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID, - ULONG PolicyType, - ULONG ValueLength, - PVOID Value -); -typedef BOOL (WINAPI *WinUsb_SetPowerPolicy_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - ULONG PolicyType, - ULONG ValueLength, - PVOID Value -); -typedef BOOL (WINAPI *WinUsb_WritePipe_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle, - UCHAR PipeID, - PUCHAR Buffer, - ULONG BufferLength, - PULONG LengthTransferred, - LPOVERLAPPED Overlapped -); -typedef BOOL (WINAPI *WinUsb_ResetDevice_t)( - WINUSB_INTERFACE_HANDLE InterfaceHandle -); - -/* /!\ These must match the ones from the official libusbk.h */ -typedef enum _KUSB_FNID { - KUSB_FNID_Init, - KUSB_FNID_Free, - KUSB_FNID_ClaimInterface, - KUSB_FNID_ReleaseInterface, - KUSB_FNID_SetAltInterface, - KUSB_FNID_GetAltInterface, - KUSB_FNID_GetDescriptor, - KUSB_FNID_ControlTransfer, - KUSB_FNID_SetPowerPolicy, - KUSB_FNID_GetPowerPolicy, - KUSB_FNID_SetConfiguration, - KUSB_FNID_GetConfiguration, - KUSB_FNID_ResetDevice, - KUSB_FNID_Initialize, - KUSB_FNID_SelectInterface, - KUSB_FNID_GetAssociatedInterface, - KUSB_FNID_Clone, - KUSB_FNID_QueryInterfaceSettings, - KUSB_FNID_QueryDeviceInformation, - KUSB_FNID_SetCurrentAlternateSetting, - KUSB_FNID_GetCurrentAlternateSetting, - KUSB_FNID_QueryPipe, - KUSB_FNID_SetPipePolicy, - KUSB_FNID_GetPipePolicy, - KUSB_FNID_ReadPipe, - KUSB_FNID_WritePipe, - KUSB_FNID_ResetPipe, - KUSB_FNID_AbortPipe, - KUSB_FNID_FlushPipe, - KUSB_FNID_IsoReadPipe, - KUSB_FNID_IsoWritePipe, - KUSB_FNID_GetCurrentFrameNumber, - KUSB_FNID_GetOverlappedResult, - KUSB_FNID_GetProperty, - KUSB_FNID_COUNT, -} KUSB_FNID; - -typedef struct _KLIB_VERSION { - INT Major; - INT Minor; - INT Micro; - INT Nano; -} KLIB_VERSION; -typedef KLIB_VERSION* PKLIB_VERSION; - -typedef BOOL (WINAPI *LibK_GetProcAddress_t)( - PVOID *ProcAddress, - ULONG DriverID, - ULONG FunctionID -); - -typedef VOID (WINAPI *LibK_GetVersion_t)( - PKLIB_VERSION Version -); - -struct winusb_interface { - bool initialized; - WinUsb_AbortPipe_t AbortPipe; - WinUsb_ControlTransfer_t ControlTransfer; - WinUsb_FlushPipe_t FlushPipe; - WinUsb_Free_t Free; - WinUsb_GetAssociatedInterface_t GetAssociatedInterface; - WinUsb_GetCurrentAlternateSetting_t GetCurrentAlternateSetting; - WinUsb_GetDescriptor_t GetDescriptor; - WinUsb_GetOverlappedResult_t GetOverlappedResult; - WinUsb_GetPipePolicy_t GetPipePolicy; - WinUsb_GetPowerPolicy_t GetPowerPolicy; - WinUsb_Initialize_t Initialize; - WinUsb_QueryDeviceInformation_t QueryDeviceInformation; - WinUsb_QueryInterfaceSettings_t QueryInterfaceSettings; - WinUsb_QueryPipe_t QueryPipe; - WinUsb_ReadPipe_t ReadPipe; - WinUsb_ResetPipe_t ResetPipe; - WinUsb_SetCurrentAlternateSetting_t SetCurrentAlternateSetting; - WinUsb_SetPipePolicy_t SetPipePolicy; - WinUsb_SetPowerPolicy_t SetPowerPolicy; - WinUsb_WritePipe_t WritePipe; - WinUsb_ResetDevice_t ResetDevice; -}; - -/* hid.dll interface */ - -#define HIDP_STATUS_SUCCESS 0x110000 -typedef void * PHIDP_PREPARSED_DATA; - -#pragma pack(1) -typedef struct { - ULONG Size; - USHORT VendorID; - USHORT ProductID; - USHORT VersionNumber; -} HIDD_ATTRIBUTES, *PHIDD_ATTRIBUTES; -#pragma pack() - -typedef USHORT USAGE; -typedef struct { - USAGE Usage; - USAGE UsagePage; - USHORT InputReportByteLength; - USHORT OutputReportByteLength; - USHORT FeatureReportByteLength; - USHORT Reserved[17]; - USHORT NumberLinkCollectionNodes; - USHORT NumberInputButtonCaps; - USHORT NumberInputValueCaps; - USHORT NumberInputDataIndices; - USHORT NumberOutputButtonCaps; - USHORT NumberOutputValueCaps; - USHORT NumberOutputDataIndices; - USHORT NumberFeatureButtonCaps; - USHORT NumberFeatureValueCaps; - USHORT NumberFeatureDataIndices; -} HIDP_CAPS, *PHIDP_CAPS; - -typedef enum _HIDP_REPORT_TYPE { - HidP_Input, - HidP_Output, - HidP_Feature -} HIDP_REPORT_TYPE; - -typedef struct _HIDP_VALUE_CAPS { - USAGE UsagePage; - UCHAR ReportID; - BOOLEAN IsAlias; - USHORT BitField; - USHORT LinkCollection; - USAGE LinkUsage; - USAGE LinkUsagePage; - BOOLEAN IsRange; - BOOLEAN IsStringRange; - BOOLEAN IsDesignatorRange; - BOOLEAN IsAbsolute; - BOOLEAN HasNull; - UCHAR Reserved; - USHORT BitSize; - USHORT ReportCount; - USHORT Reserved2[5]; - ULONG UnitsExp; - ULONG Units; - LONG LogicalMin, LogicalMax; - LONG PhysicalMin, PhysicalMax; - union { - struct { - USAGE UsageMin, UsageMax; - USHORT StringMin, StringMax; - USHORT DesignatorMin, DesignatorMax; - USHORT DataIndexMin, DataIndexMax; - } Range; - struct { - USAGE Usage, Reserved1; - USHORT StringIndex, Reserved2; - USHORT DesignatorIndex, Reserved3; - USHORT DataIndex, Reserved4; - } NotRange; - } u; -} HIDP_VALUE_CAPS, *PHIDP_VALUE_CAPS; - -DLL_DECLARE_HANDLE(hid); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetAttributes, (HANDLE, PHIDD_ATTRIBUTES)); -DLL_DECLARE_FUNC(WINAPI, VOID, HidD_GetHidGuid, (LPGUID)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetPreparsedData, (HANDLE, PHIDP_PREPARSED_DATA *)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_FreePreparsedData, (PHIDP_PREPARSED_DATA)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetManufacturerString, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetProductString, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetSerialNumberString, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, LONG, HidP_GetCaps, (PHIDP_PREPARSED_DATA, PHIDP_CAPS)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_SetNumInputBuffers, (HANDLE, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_SetFeature, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetFeature, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetPhysicalDescriptor, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_GetInputReport, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_SetOutputReport, (HANDLE, PVOID, ULONG)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidD_FlushQueue, (HANDLE)); -DLL_DECLARE_FUNC(WINAPI, BOOL, HidP_GetValueCaps, (HIDP_REPORT_TYPE, PHIDP_VALUE_CAPS, PULONG, PHIDP_PREPARSED_DATA)); \ No newline at end of file diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/strerror.c b/vendor/github.com/karalabe/hid/libusb/libusb/strerror.c deleted file mode 100644 index d2be0e2a0088..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/strerror.c +++ /dev/null @@ -1,202 +0,0 @@ -/* - * libusb strerror code - * Copyright © 2013 Hans de Goede - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include -#include -#if defined(HAVE_STRINGS_H) -#include -#endif - -#include "libusbi.h" - -#if defined(_MSC_VER) -#define strncasecmp _strnicmp -#endif - -static size_t usbi_locale = 0; - -/** \ingroup libusb_misc - * How to add a new \ref libusb_strerror() translation: - *
    - *
  1. Download the latest \c strerror.c from:
    - * https://raw.github.com/libusb/libusb/master/libusb/sterror.c
  2. - *
  3. Open the file in an UTF-8 capable editor
  4. - *
  5. Add the 2 letter ISO 639-1 - * code for your locale at the end of \c usbi_locale_supported[]
    - * Eg. for Chinese, you would add "zh" so that: - * \code... usbi_locale_supported[] = { "en", "nl", "fr" };\endcode - * becomes: - * \code... usbi_locale_supported[] = { "en", "nl", "fr", "zh" };\endcode
  6. - *
  7. Copy the { / * English (en) * / ... } section and add it at the end of \c usbi_localized_errors
    - * Eg. for Chinese, the last section of \c usbi_localized_errors could look like: - * \code - * }, { / * Chinese (zh) * / - * "Success", - * ... - * "Other error", - * } - * };\endcode
  8. - *
  9. Translate each of the English messages from the section you copied into your language
  10. - *
  11. Save the file (in UTF-8 format) and send it to \c libusb-devel\@lists.sourceforge.net
  12. - *
- */ - -static const char* usbi_locale_supported[] = { "en", "nl", "fr", "ru" }; -static const char* usbi_localized_errors[ARRAYSIZE(usbi_locale_supported)][LIBUSB_ERROR_COUNT] = { - { /* English (en) */ - "Success", - "Input/Output Error", - "Invalid parameter", - "Access denied (insufficient permissions)", - "No such device (it may have been disconnected)", - "Entity not found", - "Resource busy", - "Operation timed out", - "Overflow", - "Pipe error", - "System call interrupted (perhaps due to signal)", - "Insufficient memory", - "Operation not supported or unimplemented on this platform", - "Other error", - }, { /* Dutch (nl) */ - "Gelukt", - "Invoer-/uitvoerfout", - "Ongeldig argument", - "Toegang geweigerd (onvoldoende toegangsrechten)", - "Apparaat bestaat niet (verbinding met apparaat verbroken?)", - "Niet gevonden", - "Apparaat of hulpbron is bezig", - "Bewerking verlopen", - "Waarde is te groot", - "Gebroken pijp", - "Onderbroken systeemaanroep", - "Onvoldoende geheugen beschikbaar", - "Bewerking wordt niet ondersteund", - "Andere fout", - }, { /* French (fr) */ - "Succès", - "Erreur d'entrée/sortie", - "Paramètre invalide", - "Accès refusé (permissions insuffisantes)", - "Périphérique introuvable (peut-être déconnecté)", - "Elément introuvable", - "Resource déjà occupée", - "Operation expirée", - "Débordement", - "Erreur de pipe", - "Appel système abandonné (peut-être à cause d’un signal)", - "Mémoire insuffisante", - "Opération non supportée or non implémentée sur cette plateforme", - "Autre erreur", - }, { /* Russian (ru) */ - "Успех", - "Ошибка ввода/вывода", - "Неверный параметр", - "Доступ запрещён (не хватает прав)", - "Устройство отсутствует (возможно, оно было отсоединено)", - "Элемент не найден", - "Ресурс занят", - "Истекло время ожидания операции", - "Переполнение", - "Ошибка канала", - "Системный вызов прерван (возможно, сигналом)", - "Память исчерпана", - "Операция не поддерживается данной платформой", - "Неизвестная ошибка" - } -}; - -/** \ingroup libusb_misc - * Set the language, and only the language, not the encoding! used for - * translatable libusb messages. - * - * This takes a locale string in the default setlocale format: lang[-region] - * or lang[_country_region][.codeset]. Only the lang part of the string is - * used, and only 2 letter ISO 639-1 codes are accepted for it, such as "de". - * The optional region, country_region or codeset parts are ignored. This - * means that functions which return translatable strings will NOT honor the - * specified encoding. - * All strings returned are encoded as UTF-8 strings. - * - * If libusb_setlocale() is not called, all messages will be in English. - * - * The following functions return translatable strings: libusb_strerror(). - * Note that the libusb log messages controlled through libusb_set_debug() - * are not translated, they are always in English. - * - * For POSIX UTF-8 environments if you want libusb to follow the standard - * locale settings, call libusb_setlocale(setlocale(LC_MESSAGES, NULL)), - * after your app has done its locale setup. - * - * \param locale locale-string in the form of lang[_country_region][.codeset] - * or lang[-region], where lang is a 2 letter ISO 639-1 code - * \returns LIBUSB_SUCCESS on success - * \returns LIBUSB_ERROR_INVALID_PARAM if the locale doesn't meet the requirements - * \returns LIBUSB_ERROR_NOT_FOUND if the requested language is not supported - * \returns a LIBUSB_ERROR code on other errors - */ - -int API_EXPORTED libusb_setlocale(const char *locale) -{ - size_t i; - - if ( (locale == NULL) || (strlen(locale) < 2) - || ((strlen(locale) > 2) && (locale[2] != '-') && (locale[2] != '_') && (locale[2] != '.')) ) - return LIBUSB_ERROR_INVALID_PARAM; - - for (i=0; i= ARRAYSIZE(usbi_locale_supported)) { - return LIBUSB_ERROR_NOT_FOUND; - } - - usbi_locale = i; - - return LIBUSB_SUCCESS; -} - -/** \ingroup libusb_misc - * Returns a constant string with a short description of the given error code, - * this description is intended for displaying to the end user and will be in - * the language set by libusb_setlocale(). - * - * The returned string is encoded in UTF-8. - * - * The messages always start with a capital letter and end without any dot. - * The caller must not free() the returned string. - * - * \param errcode the error code whose description is desired - * \returns a short description of the error code in UTF-8 encoding - */ -DEFAULT_VISIBILITY const char* LIBUSB_CALL libusb_strerror(enum libusb_error errcode) -{ - int errcode_index = -errcode; - - if ((errcode_index < 0) || (errcode_index >= LIBUSB_ERROR_COUNT)) { - /* "Other Error", which should always be our last message, is returned */ - errcode_index = LIBUSB_ERROR_COUNT - 1; - } - - return usbi_localized_errors[usbi_locale][errcode_index]; -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/sync.c b/vendor/github.com/karalabe/hid/libusb/libusb/sync.c deleted file mode 100644 index a609f65f44f4..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/sync.c +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Synchronous I/O functions for libusb - * Copyright © 2007-2008 Daniel Drake - * - * This 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 2.1 of the License, or (at your option) any later version. - * - * This 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 this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include - -#include -#include -#include -#include - -#include "libusbi.h" - -/** - * @defgroup libusb_syncio Synchronous device I/O - * - * This page documents libusb's synchronous (blocking) API for USB device I/O. - * This interface is easy to use but has some limitations. More advanced users - * may wish to consider using the \ref libusb_asyncio "asynchronous I/O API" instead. - */ - -static void LIBUSB_CALL sync_transfer_cb(struct libusb_transfer *transfer) -{ - int *completed = transfer->user_data; - *completed = 1; - usbi_dbg("actual_length=%d", transfer->actual_length); - /* caller interprets result and frees transfer */ -} - -static void sync_transfer_wait_for_completion(struct libusb_transfer *transfer) -{ - int r, *completed = transfer->user_data; - struct libusb_context *ctx = HANDLE_CTX(transfer->dev_handle); - - while (!*completed) { - r = libusb_handle_events_completed(ctx, completed); - if (r < 0) { - if (r == LIBUSB_ERROR_INTERRUPTED) - continue; - usbi_err(ctx, "libusb_handle_events failed: %s, cancelling transfer and retrying", - libusb_error_name(r)); - libusb_cancel_transfer(transfer); - continue; - } - } -} - -/** \ingroup libusb_syncio - * Perform a USB control transfer. - * - * The direction of the transfer is inferred from the bmRequestType field of - * the setup packet. - * - * The wValue, wIndex and wLength fields values should be given in host-endian - * byte order. - * - * \param dev_handle a handle for the device to communicate with - * \param bmRequestType the request type field for the setup packet - * \param bRequest the request field for the setup packet - * \param wValue the value field for the setup packet - * \param wIndex the index field for the setup packet - * \param data a suitably-sized data buffer for either input or output - * (depending on direction bits within bmRequestType) - * \param wLength the length field for the setup packet. The data buffer should - * be at least this size. - * \param timeout timeout (in millseconds) that this function should wait - * before giving up due to no response being received. For an unlimited - * timeout, use value 0. - * \returns on success, the number of bytes actually transferred - * \returns LIBUSB_ERROR_TIMEOUT if the transfer timed out - * \returns LIBUSB_ERROR_PIPE if the control request was not supported by the - * device - * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected - * \returns LIBUSB_ERROR_BUSY if called from event handling context - * \returns LIBUSB_ERROR_INVALID_PARAM if the transfer size is larger than - * the operating system and/or hardware can support - * \returns another LIBUSB_ERROR code on other failures - */ -int API_EXPORTED libusb_control_transfer(libusb_device_handle *dev_handle, - uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, - unsigned char *data, uint16_t wLength, unsigned int timeout) -{ - struct libusb_transfer *transfer; - unsigned char *buffer; - int completed = 0; - int r; - - if (usbi_handling_events(HANDLE_CTX(dev_handle))) - return LIBUSB_ERROR_BUSY; - - transfer = libusb_alloc_transfer(0); - if (!transfer) - return LIBUSB_ERROR_NO_MEM; - - buffer = (unsigned char*) malloc(LIBUSB_CONTROL_SETUP_SIZE + wLength); - if (!buffer) { - libusb_free_transfer(transfer); - return LIBUSB_ERROR_NO_MEM; - } - - libusb_fill_control_setup(buffer, bmRequestType, bRequest, wValue, wIndex, - wLength); - if ((bmRequestType & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_OUT) - memcpy(buffer + LIBUSB_CONTROL_SETUP_SIZE, data, wLength); - - libusb_fill_control_transfer(transfer, dev_handle, buffer, - sync_transfer_cb, &completed, timeout); - transfer->flags = LIBUSB_TRANSFER_FREE_BUFFER; - r = libusb_submit_transfer(transfer); - if (r < 0) { - libusb_free_transfer(transfer); - return r; - } - - sync_transfer_wait_for_completion(transfer); - - if ((bmRequestType & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN) - memcpy(data, libusb_control_transfer_get_data(transfer), - transfer->actual_length); - - switch (transfer->status) { - case LIBUSB_TRANSFER_COMPLETED: - r = transfer->actual_length; - break; - case LIBUSB_TRANSFER_TIMED_OUT: - r = LIBUSB_ERROR_TIMEOUT; - break; - case LIBUSB_TRANSFER_STALL: - r = LIBUSB_ERROR_PIPE; - break; - case LIBUSB_TRANSFER_NO_DEVICE: - r = LIBUSB_ERROR_NO_DEVICE; - break; - case LIBUSB_TRANSFER_OVERFLOW: - r = LIBUSB_ERROR_OVERFLOW; - break; - case LIBUSB_TRANSFER_ERROR: - case LIBUSB_TRANSFER_CANCELLED: - r = LIBUSB_ERROR_IO; - break; - default: - usbi_warn(HANDLE_CTX(dev_handle), - "unrecognised status code %d", transfer->status); - r = LIBUSB_ERROR_OTHER; - } - - libusb_free_transfer(transfer); - return r; -} - -static int do_sync_bulk_transfer(struct libusb_device_handle *dev_handle, - unsigned char endpoint, unsigned char *buffer, int length, - int *transferred, unsigned int timeout, unsigned char type) -{ - struct libusb_transfer *transfer; - int completed = 0; - int r; - - if (usbi_handling_events(HANDLE_CTX(dev_handle))) - return LIBUSB_ERROR_BUSY; - - transfer = libusb_alloc_transfer(0); - if (!transfer) - return LIBUSB_ERROR_NO_MEM; - - libusb_fill_bulk_transfer(transfer, dev_handle, endpoint, buffer, length, - sync_transfer_cb, &completed, timeout); - transfer->type = type; - - r = libusb_submit_transfer(transfer); - if (r < 0) { - libusb_free_transfer(transfer); - return r; - } - - sync_transfer_wait_for_completion(transfer); - - if (transferred) - *transferred = transfer->actual_length; - - switch (transfer->status) { - case LIBUSB_TRANSFER_COMPLETED: - r = 0; - break; - case LIBUSB_TRANSFER_TIMED_OUT: - r = LIBUSB_ERROR_TIMEOUT; - break; - case LIBUSB_TRANSFER_STALL: - r = LIBUSB_ERROR_PIPE; - break; - case LIBUSB_TRANSFER_OVERFLOW: - r = LIBUSB_ERROR_OVERFLOW; - break; - case LIBUSB_TRANSFER_NO_DEVICE: - r = LIBUSB_ERROR_NO_DEVICE; - break; - case LIBUSB_TRANSFER_ERROR: - case LIBUSB_TRANSFER_CANCELLED: - r = LIBUSB_ERROR_IO; - break; - default: - usbi_warn(HANDLE_CTX(dev_handle), - "unrecognised status code %d", transfer->status); - r = LIBUSB_ERROR_OTHER; - } - - libusb_free_transfer(transfer); - return r; -} - -/** \ingroup libusb_syncio - * Perform a USB bulk transfer. The direction of the transfer is inferred from - * the direction bits of the endpoint address. - * - * For bulk reads, the length field indicates the maximum length of - * data you are expecting to receive. If less data arrives than expected, - * this function will return that data, so be sure to check the - * transferred output parameter. - * - * You should also check the transferred parameter for bulk writes. - * Not all of the data may have been written. - * - * Also check transferred when dealing with a timeout error code. - * libusb may have to split your transfer into a number of chunks to satisfy - * underlying O/S requirements, meaning that the timeout may expire after - * the first few chunks have completed. libusb is careful not to lose any data - * that may have been transferred; do not assume that timeout conditions - * indicate a complete lack of I/O. - * - * \param dev_handle a handle for the device to communicate with - * \param endpoint the address of a valid endpoint to communicate with - * \param data a suitably-sized data buffer for either input or output - * (depending on endpoint) - * \param length for bulk writes, the number of bytes from data to be sent. for - * bulk reads, the maximum number of bytes to receive into the data buffer. - * \param transferred output location for the number of bytes actually - * transferred. Since version 1.0.21 (\ref LIBUSB_API_VERSION >= 0x01000105), - * it is legal to pass a NULL pointer if you do not wish to receive this - * information. - * \param timeout timeout (in millseconds) that this function should wait - * before giving up due to no response being received. For an unlimited - * timeout, use value 0. - * - * \returns 0 on success (and populates transferred) - * \returns LIBUSB_ERROR_TIMEOUT if the transfer timed out (and populates - * transferred) - * \returns LIBUSB_ERROR_PIPE if the endpoint halted - * \returns LIBUSB_ERROR_OVERFLOW if the device offered more data, see - * \ref libusb_packetoverflow - * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected - * \returns LIBUSB_ERROR_BUSY if called from event handling context - * \returns another LIBUSB_ERROR code on other failures - */ -int API_EXPORTED libusb_bulk_transfer(struct libusb_device_handle *dev_handle, - unsigned char endpoint, unsigned char *data, int length, int *transferred, - unsigned int timeout) -{ - return do_sync_bulk_transfer(dev_handle, endpoint, data, length, - transferred, timeout, LIBUSB_TRANSFER_TYPE_BULK); -} - -/** \ingroup libusb_syncio - * Perform a USB interrupt transfer. The direction of the transfer is inferred - * from the direction bits of the endpoint address. - * - * For interrupt reads, the length field indicates the maximum length - * of data you are expecting to receive. If less data arrives than expected, - * this function will return that data, so be sure to check the - * transferred output parameter. - * - * You should also check the transferred parameter for interrupt - * writes. Not all of the data may have been written. - * - * Also check transferred when dealing with a timeout error code. - * libusb may have to split your transfer into a number of chunks to satisfy - * underlying O/S requirements, meaning that the timeout may expire after - * the first few chunks have completed. libusb is careful not to lose any data - * that may have been transferred; do not assume that timeout conditions - * indicate a complete lack of I/O. - * - * The default endpoint bInterval value is used as the polling interval. - * - * \param dev_handle a handle for the device to communicate with - * \param endpoint the address of a valid endpoint to communicate with - * \param data a suitably-sized data buffer for either input or output - * (depending on endpoint) - * \param length for bulk writes, the number of bytes from data to be sent. for - * bulk reads, the maximum number of bytes to receive into the data buffer. - * \param transferred output location for the number of bytes actually - * transferred. Since version 1.0.21 (\ref LIBUSB_API_VERSION >= 0x01000105), - * it is legal to pass a NULL pointer if you do not wish to receive this - * information. - * \param timeout timeout (in millseconds) that this function should wait - * before giving up due to no response being received. For an unlimited - * timeout, use value 0. - * - * \returns 0 on success (and populates transferred) - * \returns LIBUSB_ERROR_TIMEOUT if the transfer timed out - * \returns LIBUSB_ERROR_PIPE if the endpoint halted - * \returns LIBUSB_ERROR_OVERFLOW if the device offered more data, see - * \ref libusb_packetoverflow - * \returns LIBUSB_ERROR_NO_DEVICE if the device has been disconnected - * \returns LIBUSB_ERROR_BUSY if called from event handling context - * \returns another LIBUSB_ERROR code on other error - */ -int API_EXPORTED libusb_interrupt_transfer( - struct libusb_device_handle *dev_handle, unsigned char endpoint, - unsigned char *data, int length, int *transferred, unsigned int timeout) -{ - return do_sync_bulk_transfer(dev_handle, endpoint, data, length, - transferred, timeout, LIBUSB_TRANSFER_TYPE_INTERRUPT); -} diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/version.h b/vendor/github.com/karalabe/hid/libusb/libusb/version.h deleted file mode 100644 index 6ce48a7d01ad..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/version.h +++ /dev/null @@ -1,18 +0,0 @@ -/* This file is parsed by m4 and windres and RC.EXE so please keep it simple. */ -#include "version_nano.h" -#ifndef LIBUSB_MAJOR -#define LIBUSB_MAJOR 1 -#endif -#ifndef LIBUSB_MINOR -#define LIBUSB_MINOR 0 -#endif -#ifndef LIBUSB_MICRO -#define LIBUSB_MICRO 21 -#endif -#ifndef LIBUSB_NANO -#define LIBUSB_NANO 0 -#endif -/* LIBUSB_RC is the release candidate suffix. Should normally be empty. */ -#ifndef LIBUSB_RC -#define LIBUSB_RC "" -#endif diff --git a/vendor/github.com/karalabe/hid/libusb/libusb/version_nano.h b/vendor/github.com/karalabe/hid/libusb/libusb/version_nano.h deleted file mode 100644 index 0a5d1c992640..000000000000 --- a/vendor/github.com/karalabe/hid/libusb/libusb/version_nano.h +++ /dev/null @@ -1 +0,0 @@ -#define LIBUSB_NANO 11182 diff --git a/vendor/github.com/karalabe/hid/wchar.go b/vendor/github.com/karalabe/hid/wchar.go deleted file mode 100644 index d103beff5ee5..000000000000 --- a/vendor/github.com/karalabe/hid/wchar.go +++ /dev/null @@ -1,227 +0,0 @@ -// This file is https://github.com/orofarne/gowchar/blob/master/gowchar.go -// -// It was vendored inline to work around CGO limitations that don't allow C types -// to directly cross package API boundaries. -// -// The vendored file is licensed under the 3-clause BSD license, according to: -// https://github.com/orofarne/gowchar/blob/master/LICENSE - -// +build !ios -// +build linux darwin windows - -package hid - -/* -#include - -const size_t SIZEOF_WCHAR_T = sizeof(wchar_t); - -void gowchar_set (wchar_t *arr, int pos, wchar_t val) -{ - arr[pos] = val; -} - -wchar_t gowchar_get (wchar_t *arr, int pos) -{ - return arr[pos]; -} -*/ -import "C" - -import ( - "fmt" - "unicode/utf16" - "unicode/utf8" -) - -var sizeofWcharT C.size_t = C.size_t(C.SIZEOF_WCHAR_T) - -func stringToWcharT(s string) (*C.wchar_t, C.size_t) { - switch sizeofWcharT { - case 2: - return stringToWchar2(s) // Windows - case 4: - return stringToWchar4(s) // Unix - default: - panic(fmt.Sprintf("Invalid sizeof(wchar_t) = %v", sizeofWcharT)) - } -} - -func wcharTToString(s *C.wchar_t) (string, error) { - switch sizeofWcharT { - case 2: - return wchar2ToString(s) // Windows - case 4: - return wchar4ToString(s) // Unix - default: - panic(fmt.Sprintf("Invalid sizeof(wchar_t) = %v", sizeofWcharT)) - } -} - -func wcharTNToString(s *C.wchar_t, size C.size_t) (string, error) { - switch sizeofWcharT { - case 2: - return wchar2NToString(s, size) // Windows - case 4: - return wchar4NToString(s, size) // Unix - default: - panic(fmt.Sprintf("Invalid sizeof(wchar_t) = %v", sizeofWcharT)) - } -} - -// Windows -func stringToWchar2(s string) (*C.wchar_t, C.size_t) { - var slen int - s1 := s - for len(s1) > 0 { - r, size := utf8.DecodeRuneInString(s1) - if er, _ := utf16.EncodeRune(r); er == '\uFFFD' { - slen += 1 - } else { - slen += 2 - } - s1 = s1[size:] - } - slen++ // \0 - res := C.malloc(C.size_t(slen) * sizeofWcharT) - var i int - for len(s) > 0 { - r, size := utf8.DecodeRuneInString(s) - if r1, r2 := utf16.EncodeRune(r); r1 != '\uFFFD' { - C.gowchar_set((*C.wchar_t)(res), C.int(i), C.wchar_t(r1)) - i++ - C.gowchar_set((*C.wchar_t)(res), C.int(i), C.wchar_t(r2)) - i++ - } else { - C.gowchar_set((*C.wchar_t)(res), C.int(i), C.wchar_t(r)) - i++ - } - s = s[size:] - } - C.gowchar_set((*C.wchar_t)(res), C.int(slen-1), C.wchar_t(0)) // \0 - return (*C.wchar_t)(res), C.size_t(slen) -} - -// Unix -func stringToWchar4(s string) (*C.wchar_t, C.size_t) { - slen := utf8.RuneCountInString(s) - slen++ // \0 - res := C.malloc(C.size_t(slen) * sizeofWcharT) - var i int - for len(s) > 0 { - r, size := utf8.DecodeRuneInString(s) - C.gowchar_set((*C.wchar_t)(res), C.int(i), C.wchar_t(r)) - s = s[size:] - i++ - } - C.gowchar_set((*C.wchar_t)(res), C.int(slen-1), C.wchar_t(0)) // \0 - return (*C.wchar_t)(res), C.size_t(slen) -} - -// Windows -func wchar2ToString(s *C.wchar_t) (string, error) { - var i int - var res string - for { - ch := C.gowchar_get(s, C.int(i)) - if ch == 0 { - break - } - r := rune(ch) - i++ - if !utf16.IsSurrogate(r) { - if !utf8.ValidRune(r) { - err := fmt.Errorf("Invalid rune at position %v", i) - return "", err - } - res += string(r) - } else { - ch2 := C.gowchar_get(s, C.int(i)) - r2 := rune(ch2) - r12 := utf16.DecodeRune(r, r2) - if r12 == '\uFFFD' { - err := fmt.Errorf("Invalid surrogate pair at position %v", i-1) - return "", err - } - res += string(r12) - i++ - } - } - return res, nil -} - -// Unix -func wchar4ToString(s *C.wchar_t) (string, error) { - var i int - var res string - for { - ch := C.gowchar_get(s, C.int(i)) - if ch == 0 { - break - } - r := rune(ch) - if !utf8.ValidRune(r) { - err := fmt.Errorf("Invalid rune at position %v", i) - return "", err - } - res += string(r) - i++ - } - return res, nil -} - -// Windows -func wchar2NToString(s *C.wchar_t, size C.size_t) (string, error) { - var i int - var res string - N := int(size) - for i < N { - ch := C.gowchar_get(s, C.int(i)) - if ch == 0 { - break - } - r := rune(ch) - i++ - if !utf16.IsSurrogate(r) { - if !utf8.ValidRune(r) { - err := fmt.Errorf("Invalid rune at position %v", i) - return "", err - } - - res += string(r) - } else { - if i >= N { - err := fmt.Errorf("Invalid surrogate pair at position %v", i-1) - return "", err - } - ch2 := C.gowchar_get(s, C.int(i)) - r2 := rune(ch2) - r12 := utf16.DecodeRune(r, r2) - if r12 == '\uFFFD' { - err := fmt.Errorf("Invalid surrogate pair at position %v", i-1) - return "", err - } - res += string(r12) - i++ - } - } - return res, nil -} - -// Unix -func wchar4NToString(s *C.wchar_t, size C.size_t) (string, error) { - var i int - var res string - N := int(size) - for i < N { - ch := C.gowchar_get(s, C.int(i)) - r := rune(ch) - if !utf8.ValidRune(r) { - err := fmt.Errorf("Invalid rune at position %v", i) - return "", err - } - res += string(r) - i++ - } - return res, nil -} diff --git a/vendor/github.com/maruel/panicparse/.travis.yml b/vendor/github.com/maruel/panicparse/.travis.yml deleted file mode 100644 index c6da8f0b8c00..000000000000 --- a/vendor/github.com/maruel/panicparse/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright 2014 Marc-Antoine Ruel. All rights reserved. -# Use of this source code is governed under the Apache License, Version 2.0 -# that can be found in the LICENSE file. - -sudo: false -language: go - -go: -- tip - -before_install: - - go get github.com/maruel/pre-commit-go/cmd/pcg - -script: - - pcg diff --git a/vendor/github.com/maruel/panicparse/LICENSE b/vendor/github.com/maruel/panicparse/LICENSE deleted file mode 100644 index b76840c25822..000000000000 --- a/vendor/github.com/maruel/panicparse/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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 2015 Marc-Antoine Ruel - - 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/maruel/panicparse/README.md b/vendor/github.com/maruel/panicparse/README.md deleted file mode 100644 index 9fc039cd9ccc..000000000000 --- a/vendor/github.com/maruel/panicparse/README.md +++ /dev/null @@ -1,123 +0,0 @@ -panicparse -========== - -Parses panic stack traces, densifies and deduplicates goroutines with similar -stack traces. Helps debugging crashes and deadlocks in heavily parallelized -process. - -[![Build Status](https://travis-ci.org/maruel/panicparse.svg?branch=master)](https://travis-ci.org/maruel/panicparse) - -panicparse helps make sense of Go crash dumps: - -![Screencast](https://raw.githubusercontent.com/wiki/maruel/panicparse/parse.gif "Screencast") - - -Features --------- - - * >50% more compact output than original stack dump yet more readable. - * Exported symbols are bold, private symbols are darker. - * Stdlib is green, main is yellow, rest is red. - * Deduplicates redundant goroutine stacks. Useful for large server crashes. - * Arguments as pointer IDs instead of raw pointer values. - * Pushes stdlib-only stacks at the bottom to help focus on important code. - * Usable as a library! - [![GoDoc](https://godoc.org/github.com/maruel/panicparse/stack?status.svg)](https://godoc.org/github.com/maruel/panicparse/stack) - * Warning: please pin the version (e.g. vendor it). Breaking changes are - not planned but may happen. - * Parses the source files if available to augment the output. - * Works on Windows. - - -Installation ------------- - - go get github.com/maruel/panicparse/cmd/pp - - -Usage ------ - -### Piping a stack trace from another process - -#### TL;DR - - * Ubuntu (bash v4 or zsh): `|&` - * OSX, [install bash 4+](README.md#updating-bash-on-osx), then: `|&` - * Windows _or_ OSX with stock bash v3: `2>&1 |` - * [Fish](http://fishshell.com/) shell: `^|` - - -#### Longer version - -`pp` streams its stdin to stdout as long as it doesn't detect any panic. -`panic()` and Go's native deadlock detector [print to -stderr](https://golang.org/src/runtime/panic1.go) via the native [`print()` -function](https://golang.org/pkg/builtin/#print). - - -**Bash v4** or **zsh**: `|&` tells the shell to redirect stderr to stdout, -it's an alias for `2>&1 |` ([bash -v4](https://www.gnu.org/software/bash/manual/bash.html#Pipelines), -[zsh](http://zsh.sourceforge.net/Doc/Release/Shell-Grammar.html#Simple-Commands-_0026-Pipelines)): - - go test -v |&pp - - -**Windows or OSX native bash** [(which is -3.2.57)](http://meta.ath0.com/2012/02/05/apples-great-gpl-purge/): They don't -have this shortcut, so use the long form: - - go test -v 2>&1 | pp - - -**Fish**: It uses [^ for stderr -redirection](http://fishshell.com/docs/current/tutorial.html#tut_pipes_and_redirections) -so the shortcut is `^|`: - - go test -v ^|pp - - -**PowerShell**: [It has broken `2>&1` redirection](https://connect.microsoft.com/PowerShell/feedback/details/765551/in-powershell-v3-you-cant-redirect-stderr-to-stdout-without-generating-error-records). The workaround is to shell out to cmd.exe. :( - - -### Investigate deadlock - -On POSIX, use `Ctrl-\` to send SIGQUIT to your process, `pp` will ignore -the signal and will parse the stack trace. - - -### Parsing from a file - -To dump to a file then parse, pass the file path of a stack trace - - go test 2> stack.txt - pp stack.txt - - -Tips ----- - -### GOTRACEBACK - -Starting with Go 1.6, [`GOTRACEBACK`](https://golang.org/pkg/runtime/) defaults -to `single` instead of `all` / `1` that was used in 1.5 and before. To get all -goroutines trace and not just the crashing one, set the environment variable: - - export GOTRACEBACK=all - -or `set GOTRACEBACK=all` on Windows. Probably worth to put it in your `.bashrc`. - - -### Updating bash on OSX - -Install bash v4+ on OSX via [homebrew](http://brew.sh) or -[macports](https://www.macports.org/). Your future self will appreciate having -done that. - - -### If you have `/usr/bin/pp` installed - -You may have the Perl PAR Packager installed. Use long name `panicparse` then; - - go get github.com/maruel/panicparse diff --git a/vendor/github.com/maruel/panicparse/stack/source.go b/vendor/github.com/maruel/panicparse/stack/source.go deleted file mode 100644 index f09e67336a09..000000000000 --- a/vendor/github.com/maruel/panicparse/stack/source.go +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright 2015 Marc-Antoine Ruel. All rights reserved. -// Use of this source code is governed under the Apache License, Version 2.0 -// that can be found in the LICENSE file. - -// This file contains the code to process sources, to be able to deduct the -// original types. - -package stack - -import ( - "bytes" - "fmt" - "go/ast" - "go/parser" - "go/token" - "io/ioutil" - "log" - "math" - "strings" -) - -// cache is a cache of sources on the file system. -type cache struct { - files map[string][]byte - parsed map[string]*parsedFile -} - -// Augment processes source files to improve calls to be more descriptive. -// -// It modifies goroutines in place. -func Augment(goroutines []Goroutine) { - c := &cache{} - for i := range goroutines { - c.augmentGoroutine(&goroutines[i]) - } -} - -// augmentGoroutine processes source files to improve call to be more -// descriptive. -// -// It modifies the routine. -func (c *cache) augmentGoroutine(goroutine *Goroutine) { - if c.files == nil { - c.files = map[string][]byte{} - } - if c.parsed == nil { - c.parsed = map[string]*parsedFile{} - } - // For each call site, look at the next call and populate it. Then we can - // walk back and reformat things. - for i := range goroutine.Stack.Calls { - c.load(goroutine.Stack.Calls[i].SourcePath) - } - - // Once all loaded, we can look at the next call when available. - for i := 1; i < len(goroutine.Stack.Calls); i++ { - // Get the AST from the previous call and process the call line with it. - if f := c.getFuncAST(&goroutine.Stack.Calls[i]); f != nil { - processCall(&goroutine.Stack.Calls[i], f) - } - } -} - -// Private stuff. - -// load loads a source file and parses the AST tree. Failures are ignored. -func (c *cache) load(fileName string) { - if _, ok := c.parsed[fileName]; ok { - return - } - c.parsed[fileName] = nil - if !strings.HasSuffix(fileName, ".go") { - // Ignore C and assembly. - c.files[fileName] = nil - return - } - log.Printf("load(%s)", fileName) - if _, ok := c.files[fileName]; !ok { - var err error - if c.files[fileName], err = ioutil.ReadFile(fileName); err != nil { - log.Printf("Failed to read %s: %s", fileName, err) - c.files[fileName] = nil - return - } - } - fset := token.NewFileSet() - src := c.files[fileName] - parsed, err := parser.ParseFile(fset, fileName, src, 0) - if err != nil { - log.Printf("Failed to parse %s: %s", fileName, err) - return - } - // Convert the line number into raw file offset. - offsets := []int{0, 0} - start := 0 - for l := 1; start < len(src); l++ { - start += bytes.IndexByte(src[start:], '\n') + 1 - offsets = append(offsets, start) - } - c.parsed[fileName] = &parsedFile{offsets, parsed} -} - -func (c *cache) getFuncAST(call *Call) *ast.FuncDecl { - if p := c.parsed[call.SourcePath]; p != nil { - return p.getFuncAST(call.Func.Name(), call.Line) - } - return nil -} - -type parsedFile struct { - lineToByteOffset []int - parsed *ast.File -} - -// getFuncAST gets the callee site function AST representation for the code -// inside the function f at line l. -func (p *parsedFile) getFuncAST(f string, l int) (d *ast.FuncDecl) { - // Walk the AST to find the lineToByteOffset that fits the line number. - var lastFunc *ast.FuncDecl - var found ast.Node - // Inspect() goes depth first. This means for example that a function like: - // func a() { - // b := func() {} - // c() - // } - // - // Were we are looking at the c() call can return confused values. It is - // important to look at the actual ast.Node hierarchy. - ast.Inspect(p.parsed, func(n ast.Node) bool { - if d != nil { - return false - } - if n == nil { - return true - } - if found != nil { - // We are walking up. - } - if int(n.Pos()) >= p.lineToByteOffset[l] { - // We are expecting a ast.CallExpr node. It can be harder to figure out - // when there are multiple calls on a single line, as the stack trace - // doesn't have file byte offset information, only line based. - // gofmt will always format to one function call per line but there can - // be edge cases, like: - // a = A{Foo(), Bar()} - d = lastFunc - //p.processNode(call, n) - return false - } else if f, ok := n.(*ast.FuncDecl); ok { - lastFunc = f - } - return true - }) - return -} - -func name(n ast.Node) string { - if _, ok := n.(*ast.InterfaceType); ok { - return "interface{}" - } - if i, ok := n.(*ast.Ident); ok { - return i.Name - } - if _, ok := n.(*ast.FuncType); ok { - return "func" - } - if s, ok := n.(*ast.SelectorExpr); ok { - return s.Sel.Name - } - // TODO(maruel): Implement anything missing. - return "" -} - -// fieldToType returns the type name and whether if it's an ellipsis. -func fieldToType(f *ast.Field) (string, bool) { - switch arg := f.Type.(type) { - case *ast.ArrayType: - return "[]" + name(arg.Elt), false - case *ast.Ellipsis: - return name(arg.Elt), true - case *ast.FuncType: - // Do not print the function signature to not overload the trace. - return "func", false - case *ast.Ident: - return arg.Name, false - case *ast.InterfaceType: - return "interface{}", false - case *ast.SelectorExpr: - return arg.Sel.Name, false - case *ast.StarExpr: - return "*" + name(arg.X), false - default: - // TODO(maruel): Implement anything missing. - return "", false - } -} - -// extractArgumentsType returns the name of the type of each input argument. -func extractArgumentsType(f *ast.FuncDecl) ([]string, bool) { - var fields []*ast.Field - if f.Recv != nil { - if len(f.Recv.List) != 1 { - panic("Expect only one receiver; please fix panicparse's code") - } - // If it is an object receiver (vs a pointer receiver), its address is not - // printed in the stack trace so it needs to be ignored. - if _, ok := f.Recv.List[0].Type.(*ast.StarExpr); ok { - fields = append(fields, f.Recv.List[0]) - } - } - var types []string - extra := false - for _, arg := range append(fields, f.Type.Params.List...) { - // Assert that extra is only set on the last item of fields? - var t string - t, extra = fieldToType(arg) - mult := len(arg.Names) - if mult == 0 { - mult = 1 - } - for i := 0; i < mult; i++ { - types = append(types, t) - } - } - return types, extra -} - -// processCall walks the function and populate call accordingly. -func processCall(call *Call, f *ast.FuncDecl) { - values := make([]uint64, len(call.Args.Values)) - for i := range call.Args.Values { - values[i] = call.Args.Values[i].Value - } - index := 0 - pop := func() uint64 { - if len(values) != 0 { - x := values[0] - values = values[1:] - index++ - return x - } - return 0 - } - popName := func() string { - n := call.Args.Values[index].Name - v := pop() - if len(n) == 0 { - return fmt.Sprintf("0x%x", v) - } - return n - } - - types, extra := extractArgumentsType(f) - for i := 0; len(values) != 0; i++ { - var t string - if i >= len(types) { - if !extra { - // These are unexpected value! Print them as hex. - call.Args.Processed = append(call.Args.Processed, popName()) - continue - } - t = types[len(types)-1] - } else { - t = types[i] - } - switch t { - case "float32": - call.Args.Processed = append(call.Args.Processed, fmt.Sprintf("%g", math.Float32frombits(uint32(pop())))) - case "float64": - call.Args.Processed = append(call.Args.Processed, fmt.Sprintf("%g", math.Float64frombits(pop()))) - case "int", "int8", "int16", "int32", "int64", "uint", "uint8", "uint16", "uint32", "uint64": - call.Args.Processed = append(call.Args.Processed, fmt.Sprintf("%d", pop())) - case "string": - call.Args.Processed = append(call.Args.Processed, fmt.Sprintf("%s(%s, len=%d)", t, popName(), pop())) - default: - if strings.HasPrefix(t, "*") { - call.Args.Processed = append(call.Args.Processed, fmt.Sprintf("%s(%s)", t, popName())) - } else if strings.HasPrefix(t, "[]") { - call.Args.Processed = append(call.Args.Processed, fmt.Sprintf("%s(%s len=%d cap=%d)", t, popName(), pop(), pop())) - } else { - // Assumes it's an interface. For now, discard the object value, which - // is probably not a good idea. - call.Args.Processed = append(call.Args.Processed, fmt.Sprintf("%s(%s)", t, popName())) - pop() - } - } - if len(values) == 0 && call.Args.Elided { - return - } - } -} diff --git a/vendor/github.com/maruel/panicparse/stack/stack.go b/vendor/github.com/maruel/panicparse/stack/stack.go deleted file mode 100644 index cfb502e6639a..000000000000 --- a/vendor/github.com/maruel/panicparse/stack/stack.go +++ /dev/null @@ -1,832 +0,0 @@ -// Copyright 2015 Marc-Antoine Ruel. All rights reserved. -// Use of this source code is governed under the Apache License, Version 2.0 -// that can be found in the LICENSE file. - -// Package stack analyzes stack dump of Go processes and simplifies it. -// -// It is mostly useful on servers will large number of identical goroutines, -// making the crash dump harder to read than strictly necesary. -package stack - -import ( - "bufio" - "bytes" - "errors" - "fmt" - "io" - "math" - "net/url" - "os" - "path/filepath" - "regexp" - "runtime" - "sort" - "strconv" - "strings" - "unicode" - "unicode/utf8" -) - -const lockedToThread = "locked to thread" - -var ( - // TODO(maruel): Handle corrupted stack cases: - // - missed stack barrier - // - found next stack barrier at 0x123; expected - // - runtime: unexpected return pc for FUNC_NAME called from 0x123 - - reRoutineHeader = regexp.MustCompile("^goroutine (\\d+) \\[([^\\]]+)\\]\\:\n$") - reMinutes = regexp.MustCompile("^(\\d+) minutes$") - reUnavail = regexp.MustCompile("^(?:\t| +)goroutine running on other thread; stack unavailable") - // See gentraceback() in src/runtime/traceback.go for more information. - // - Sometimes the source file comes up as "". It is the - // compiler than generated these, not the runtime. - // - The tab may be replaced with spaces when a user copy-paste it, handle - // this transparently. - // - "runtime.gopanic" is explicitly replaced with "panic" by gentraceback(). - // - The +0x123 byte offset is printed when frame.pc > _func.entry. _func is - // generated by the linker. - // - The +0x123 byte offset is not included with generated code, e.g. unnamed - // functions "func·006()" which is generally go func() { ... }() - // statements. Since the _func is generated at runtime, it's probably why - // _func.entry is not set. - // - C calls may have fp=0x123 sp=0x123 appended. I think it normally happens - // when a signal is not correctly handled. It is printed with m.throwing>0. - // These are discarded. - // - For cgo, the source file may be "??". - reFile = regexp.MustCompile("^(?:\t| +)(\\?\\?|\\|.+\\.(?:c|go|s))\\:(\\d+)(?:| \\+0x[0-9a-f]+)(?:| fp=0x[0-9a-f]+ sp=0x[0-9a-f]+)\n$") - // Sadly, it doesn't note the goroutine number so we could cascade them per - // parenthood. - reCreated = regexp.MustCompile("^created by (.+)\n$") - reFunc = regexp.MustCompile("^(.+)\\((.*)\\)\n$") - reElided = regexp.MustCompile("^\\.\\.\\.additional frames elided\\.\\.\\.\n$") - // Include frequent GOROOT value on Windows, distro provided and user - // installed path. This simplifies the user's life when processing a trace - // generated on another VM. - // TODO(maruel): Guess the path automatically via traces containing the - // 'runtime' package, which is very frequent. This would be "less bad" than - // throwing up random values at the parser. - goroots = []string{runtime.GOROOT(), "c:/go", "/usr/lib/go", "/usr/local/go"} -) - -// Similarity is the level at which two call lines arguments must match to be -// considered similar enough to coalesce them. -type Similarity int - -const ( - // ExactFlags requires same bits (e.g. Locked). - ExactFlags Similarity = iota - // ExactLines requests the exact same arguments on the call line. - ExactLines - // AnyPointer considers different pointers a similar call line. - AnyPointer - // AnyValue accepts any value as similar call line. - AnyValue -) - -// Function is a function call. -// -// Go stack traces print a mangled function call, this wrapper unmangle the -// string before printing and adds other filtering methods. -type Function struct { - Raw string -} - -// String is the fully qualified function name. -// -// Sadly Go is a bit confused when the package name doesn't match the directory -// containing the source file and will use the directory name instead of the -// real package name. -func (f Function) String() string { - s, _ := url.QueryUnescape(f.Raw) - return s -} - -// Name is the naked function name. -func (f Function) Name() string { - parts := strings.SplitN(filepath.Base(f.Raw), ".", 2) - if len(parts) == 1 { - return parts[0] - } - return parts[1] -} - -// PkgName is the package name for this function reference. -func (f Function) PkgName() string { - parts := strings.SplitN(filepath.Base(f.Raw), ".", 2) - if len(parts) == 1 { - return "" - } - s, _ := url.QueryUnescape(parts[0]) - return s -} - -// PkgDotName returns "." format. -func (f Function) PkgDotName() string { - parts := strings.SplitN(filepath.Base(f.Raw), ".", 2) - s, _ := url.QueryUnescape(parts[0]) - if len(parts) == 1 { - return parts[0] - } - if s != "" || parts[1] != "" { - return s + "." + parts[1] - } - return "" -} - -// IsExported returns true if the function is exported. -func (f Function) IsExported() bool { - name := f.Name() - parts := strings.Split(name, ".") - r, _ := utf8.DecodeRuneInString(parts[len(parts)-1]) - if unicode.ToUpper(r) == r { - return true - } - return f.PkgName() == "main" && name == "main" -} - -// Arg is an argument on a Call. -type Arg struct { - Value uint64 // Value is the raw value as found in the stack trace - Name string // Name is a pseudo name given to the argument -} - -// IsPtr returns true if we guess it's a pointer. It's only a guess, it can be -// easily be confused by a bitmask. -func (a *Arg) IsPtr() bool { - // Assumes all pointers are above 16Mb and positive. - return a.Value > 16*1024*1024 && a.Value < math.MaxInt64 -} - -func (a Arg) String() string { - if a.Name != "" { - return a.Name - } - if a.Value == 0 { - return "0" - } - return fmt.Sprintf("0x%x", a.Value) -} - -// Args is a series of function call arguments. -type Args struct { - Values []Arg // Values is the arguments as shown on the stack trace. They are mangled via simplification. - Processed []string // Processed is the arguments generated from processing the source files. It can have a length lower than Values. - Elided bool // If set, it means there was a trailing ", ..." -} - -func (a Args) String() string { - var v []string - if len(a.Processed) != 0 { - v = make([]string, 0, len(a.Processed)) - for _, item := range a.Processed { - v = append(v, item) - } - } else { - v = make([]string, 0, len(a.Values)) - for _, item := range a.Values { - v = append(v, item.String()) - } - } - if a.Elided { - v = append(v, "...") - } - return strings.Join(v, ", ") -} - -// Equal returns true only if both arguments are exactly equal. -func (a *Args) Equal(r *Args) bool { - if a.Elided != r.Elided || len(a.Values) != len(r.Values) { - return false - } - for i, l := range a.Values { - if l != r.Values[i] { - return false - } - } - return true -} - -// Similar returns true if the two Args are equal or almost but not quite -// equal. -func (a *Args) Similar(r *Args, similar Similarity) bool { - if a.Elided != r.Elided || len(a.Values) != len(r.Values) { - return false - } - if similar == AnyValue { - return true - } - for i, l := range a.Values { - switch similar { - case ExactFlags, ExactLines: - if l != r.Values[i] { - return false - } - default: - if l.IsPtr() != r.Values[i].IsPtr() || (!l.IsPtr() && l != r.Values[i]) { - return false - } - } - } - return true -} - -// Merge merges two similar Args, zapping out differences. -func (a *Args) Merge(r *Args) Args { - out := Args{ - Values: make([]Arg, len(a.Values)), - Elided: a.Elided, - } - for i, l := range a.Values { - if l != r.Values[i] { - out.Values[i].Name = "*" - out.Values[i].Value = l.Value - } else { - out.Values[i] = l - } - } - return out -} - -// Call is an item in the stack trace. -type Call struct { - SourcePath string // Full path name of the source file - Line int // Line number - Func Function // Fully qualified function name (encoded). - Args Args // Call arguments -} - -// Equal returns true only if both calls are exactly equal. -func (c *Call) Equal(r *Call) bool { - return c.SourcePath == r.SourcePath && c.Line == r.Line && c.Func == r.Func && c.Args.Equal(&r.Args) -} - -// Similar returns true if the two Call are equal or almost but not quite -// equal. -func (c *Call) Similar(r *Call, similar Similarity) bool { - return c.SourcePath == r.SourcePath && c.Line == r.Line && c.Func == r.Func && c.Args.Similar(&r.Args, similar) -} - -// Merge merges two similar Call, zapping out differences. -func (c *Call) Merge(r *Call) Call { - return Call{ - SourcePath: c.SourcePath, - Line: c.Line, - Func: c.Func, - Args: c.Args.Merge(&r.Args), - } -} - -// SourceName returns the base file name of the source file. -func (c *Call) SourceName() string { - return filepath.Base(c.SourcePath) -} - -// SourceLine returns "source.go:line", including only the base file name. -func (c *Call) SourceLine() string { - return fmt.Sprintf("%s:%d", c.SourceName(), c.Line) -} - -// FullSourceLine returns "/path/to/source.go:line". -func (c *Call) FullSourceLine() string { - return fmt.Sprintf("%s:%d", c.SourcePath, c.Line) -} - -// PkgSource is one directory plus the file name of the source file. -func (c *Call) PkgSource() string { - return filepath.Join(filepath.Base(filepath.Dir(c.SourcePath)), c.SourceName()) -} - -const testMainSource = "_test" + string(os.PathSeparator) + "_testmain.go" - -// IsStdlib returns true if it is a Go standard library function. This includes -// the 'go test' generated main executable. -func (c *Call) IsStdlib() bool { - for _, goroot := range goroots { - if strings.HasPrefix(c.SourcePath, goroot) { - return true - } - } - // Consider _test/_testmain.go as stdlib since it's injected by "go test". - return c.PkgSource() == testMainSource -} - -// IsPkgMain returns true if it is in the main package. -func (c *Call) IsPkgMain() bool { - return c.Func.PkgName() == "main" -} - -// Stack is a call stack. -type Stack struct { - Calls []Call // Call stack. First is original function, last is leaf function. - Elided bool // Happens when there's >100 items in Stack, currently hardcoded in package runtime. -} - -// Equal returns true on if both call stacks are exactly equal. -func (s *Stack) Equal(r *Stack) bool { - if len(s.Calls) != len(r.Calls) || s.Elided != r.Elided { - return false - } - for i := range s.Calls { - if !s.Calls[i].Equal(&r.Calls[i]) { - return false - } - } - return true -} - -// Similar returns true if the two Stack are equal or almost but not quite -// equal. -func (s *Stack) Similar(r *Stack, similar Similarity) bool { - if len(s.Calls) != len(r.Calls) || s.Elided != r.Elided { - return false - } - for i := range s.Calls { - if !s.Calls[i].Similar(&r.Calls[i], similar) { - return false - } - } - return true -} - -// Merge merges two similar Stack, zapping out differences. -func (s *Stack) Merge(r *Stack) *Stack { - // Assumes similar stacks have the same length. - out := &Stack{ - Calls: make([]Call, len(s.Calls)), - Elided: s.Elided, - } - for i := range s.Calls { - out.Calls[i] = s.Calls[i].Merge(&r.Calls[i]) - } - return out -} - -// Less compares two Stack, where the ones that are less are more -// important, so they come up front. A Stack with more private functions is -// 'less' so it is at the top. Inversely, a Stack with only public -// functions is 'more' so it is at the bottom. -func (s *Stack) Less(r *Stack) bool { - lStdlib := 0 - lPrivate := 0 - for _, c := range s.Calls { - if c.IsStdlib() { - lStdlib++ - } else { - lPrivate++ - } - } - rStdlib := 0 - rPrivate := 0 - for _, s := range r.Calls { - if s.IsStdlib() { - rStdlib++ - } else { - rPrivate++ - } - } - if lPrivate > rPrivate { - return true - } - if lPrivate < rPrivate { - return false - } - if lStdlib > rStdlib { - return false - } - if lStdlib < rStdlib { - return true - } - - // Stack lengths are the same. - for x := range s.Calls { - if s.Calls[x].Func.Raw < r.Calls[x].Func.Raw { - return true - } - if s.Calls[x].Func.Raw > r.Calls[x].Func.Raw { - return true - } - if s.Calls[x].PkgSource() < r.Calls[x].PkgSource() { - return true - } - if s.Calls[x].PkgSource() > r.Calls[x].PkgSource() { - return true - } - if s.Calls[x].Line < r.Calls[x].Line { - return true - } - if s.Calls[x].Line > r.Calls[x].Line { - return true - } - } - return false -} - -// Signature represents the signature of one or multiple goroutines. -// -// It is effectively the stack trace plus the goroutine internal bits, like -// it's state, if it is thread locked, which call site created this goroutine, -// etc. -type Signature struct { - // Use git grep 'gopark(|unlock)\(' to find them all plus everything listed - // in runtime/traceback.go. Valid values includes: - // - chan send, chan receive, select - // - finalizer wait, mark wait (idle), - // - Concurrent GC wait, GC sweep wait, force gc (idle) - // - IO wait, panicwait - // - semacquire, semarelease - // - sleep, timer goroutine (idle) - // - trace reader (blocked) - // Stuck cases: - // - chan send (nil chan), chan receive (nil chan), select (no cases) - // Runnable states: - // - idle, runnable, running, syscall, waiting, dead, enqueue, copystack, - // Scan states: - // - scan, scanrunnable, scanrunning, scansyscall, scanwaiting, scandead, - // scanenqueue - State string - CreatedBy Call // Which other goroutine which created this one. - SleepMin int // Wait time in minutes, if applicable. - SleepMax int // Wait time in minutes, if applicable. - Stack Stack - Locked bool // Locked to an OS thread. -} - -// Equal returns true only if both signatures are exactly equal. -func (s *Signature) Equal(r *Signature) bool { - if s.State != r.State || !s.CreatedBy.Equal(&r.CreatedBy) || s.Locked != r.Locked || s.SleepMin != r.SleepMin || s.SleepMax != r.SleepMax { - return false - } - return s.Stack.Equal(&r.Stack) -} - -// Similar returns true if the two Signature are equal or almost but not quite -// equal. -func (s *Signature) Similar(r *Signature, similar Similarity) bool { - if s.State != r.State || !s.CreatedBy.Similar(&r.CreatedBy, similar) { - return false - } - if similar == ExactFlags && s.Locked != r.Locked { - return false - } - return s.Stack.Similar(&r.Stack, similar) -} - -// Merge merges two similar Signature, zapping out differences. -func (s *Signature) Merge(r *Signature) *Signature { - min := s.SleepMin - if r.SleepMin < min { - min = r.SleepMin - } - max := s.SleepMax - if r.SleepMax > max { - max = r.SleepMax - } - return &Signature{ - State: s.State, // Drop right side. - CreatedBy: s.CreatedBy, // Drop right side. - SleepMin: min, - SleepMax: max, - Stack: *s.Stack.Merge(&r.Stack), - Locked: s.Locked || r.Locked, // TODO(maruel): This is weirdo. - } -} - -// Less compares two Signature, where the ones that are less are more -// important, so they come up front. A Signature with more private functions is -// 'less' so it is at the top. Inversely, a Signature with only public -// functions is 'more' so it is at the bottom. -func (s *Signature) Less(r *Signature) bool { - if s.Stack.Less(&r.Stack) { - return true - } - if r.Stack.Less(&s.Stack) { - return false - } - if s.Locked && !r.Locked { - return true - } - if r.Locked && !s.Locked { - return false - } - if s.State < r.State { - return true - } - if s.State > r.State { - return false - } - return false -} - -// Goroutine represents the state of one goroutine, including the stack trace. -type Goroutine struct { - Signature // It's stack trace, internal bits, state, which call site created it, etc. - ID int // Goroutine ID. - First bool // First is the goroutine first printed, normally the one that crashed. -} - -// Bucketize returns the number of similar goroutines. -func Bucketize(goroutines []Goroutine, similar Similarity) map[*Signature][]Goroutine { - out := map[*Signature][]Goroutine{} - // O(n²). Fix eventually. - for _, routine := range goroutines { - found := false - for key := range out { - // When a match is found, this effectively drops the other goroutine ID. - if key.Similar(&routine.Signature, similar) { - found = true - if !key.Equal(&routine.Signature) { - // Almost but not quite equal. There's different pointers passed - // around but the same values. Zap out the different values. - newKey := key.Merge(&routine.Signature) - out[newKey] = append(out[key], routine) - delete(out, key) - } else { - out[key] = append(out[key], routine) - } - break - } - } - if !found { - key := &Signature{} - *key = routine.Signature - out[key] = []Goroutine{routine} - } - } - return out -} - -// Bucket is a stack trace signature and the list of goroutines that fits this -// signature. -type Bucket struct { - Signature - Routines []Goroutine -} - -// First returns true if it contains the first goroutine, e.g. the ones that -// likely generated the panic() call, if any. -func (b *Bucket) First() bool { - for _, r := range b.Routines { - if r.First { - return true - } - } - return false -} - -// Less does reverse sort. -func (b *Bucket) Less(r *Bucket) bool { - if b.First() { - return true - } - if r.First() { - return false - } - return b.Signature.Less(&r.Signature) -} - -// Buckets is a list of Bucket sorted by repeation count. -type Buckets []Bucket - -func (b Buckets) Len() int { - return len(b) -} - -func (b Buckets) Less(i, j int) bool { - return b[i].Less(&b[j]) -} - -func (b Buckets) Swap(i, j int) { - b[j], b[i] = b[i], b[j] -} - -// SortBuckets creates a list of Bucket from each goroutine stack trace count. -func SortBuckets(buckets map[*Signature][]Goroutine) Buckets { - out := make(Buckets, 0, len(buckets)) - for signature, count := range buckets { - out = append(out, Bucket{*signature, count}) - } - sort.Sort(out) - return out -} - -// scanLines is similar to bufio.ScanLines except that it: -// - doesn't drop '\n' -// - doesn't strip '\r' -// - returns when the data is bufio.MaxScanTokenSize bytes -func scanLines(data []byte, atEOF bool) (advance int, token []byte, err error) { - if atEOF && len(data) == 0 { - return 0, nil, nil - } - if i := bytes.IndexByte(data, '\n'); i >= 0 { - return i + 1, data[0 : i+1], nil - } - if atEOF { - return len(data), data, nil - } - if len(data) >= bufio.MaxScanTokenSize { - // Returns the line even if it is not at EOF nor has a '\n', otherwise the - // scanner will return bufio.ErrTooLong which is definitely not what we - // want. - return len(data), data, nil - } - return 0, nil, nil -} - -// ParseDump processes the output from runtime.Stack(). -// -// It supports piping from another command and assumes there is junk before the -// actual stack trace. The junk is streamed to out. -func ParseDump(r io.Reader, out io.Writer) ([]Goroutine, error) { - goroutines := make([]Goroutine, 0, 16) - var goroutine *Goroutine - scanner := bufio.NewScanner(r) - scanner.Split(scanLines) - // TODO(maruel): Use a formal state machine. Patterns follows: - // - reRoutineHeader - // Either: - // - reUnavail - // - reFunc + reFile in a loop - // - reElided - // Optionally ends with: - // - reCreated + reFile - // Between each goroutine stack dump: an empty line - created := false - // firstLine is the first line after the reRoutineHeader header line. - firstLine := false - for scanner.Scan() { - line := scanner.Text() - if line == "\n" { - if goroutine != nil { - goroutine = nil - continue - } - } else if line[len(line)-1] == '\n' { - if goroutine == nil { - if match := reRoutineHeader.FindStringSubmatch(line); match != nil { - if id, err := strconv.Atoi(match[1]); err == nil { - // See runtime/traceback.go. - // ", \d+ minutes, locked to thread" - items := strings.Split(match[2], ", ") - sleep := 0 - locked := false - for i := 1; i < len(items); i++ { - if items[i] == lockedToThread { - locked = true - continue - } - // Look for duration, if any. - if match2 := reMinutes.FindStringSubmatch(items[i]); match2 != nil { - sleep, _ = strconv.Atoi(match2[1]) - } - } - goroutines = append(goroutines, Goroutine{ - Signature: Signature{ - State: items[0], - SleepMin: sleep, - SleepMax: sleep, - Locked: locked, - }, - ID: id, - First: len(goroutines) == 0, - }) - goroutine = &goroutines[len(goroutines)-1] - firstLine = true - continue - } - } - } else { - if firstLine { - firstLine = false - if match := reUnavail.FindStringSubmatch(line); match != nil { - // Generate a fake stack entry. - goroutine.Stack.Calls = []Call{{SourcePath: ""}} - continue - } - } - - if match := reFile.FindStringSubmatch(line); match != nil { - // Triggers after a reFunc or a reCreated. - num, err := strconv.Atoi(match[2]) - if err != nil { - return goroutines, fmt.Errorf("failed to parse int on line: \"%s\"", line) - } - if created { - created = false - goroutine.CreatedBy.SourcePath = match[1] - goroutine.CreatedBy.Line = num - } else { - i := len(goroutine.Stack.Calls) - 1 - if i < 0 { - return goroutines, errors.New("unexpected order") - } - goroutine.Stack.Calls[i].SourcePath = match[1] - goroutine.Stack.Calls[i].Line = num - } - continue - } - - if match := reCreated.FindStringSubmatch(line); match != nil { - created = true - goroutine.CreatedBy.Func.Raw = match[1] - continue - } - - if match := reFunc.FindStringSubmatch(line); match != nil { - args := Args{} - for _, a := range strings.Split(match[2], ", ") { - if a == "..." { - args.Elided = true - continue - } - if a == "" { - // Remaining values were dropped. - break - } - v, err := strconv.ParseUint(a, 0, 64) - if err != nil { - return goroutines, fmt.Errorf("failed to parse int on line: \"%s\"", line) - } - args.Values = append(args.Values, Arg{Value: v}) - } - goroutine.Stack.Calls = append(goroutine.Stack.Calls, Call{Func: Function{match[1]}, Args: args}) - continue - } - - if match := reElided.FindStringSubmatch(line); match != nil { - goroutine.Stack.Elided = true - continue - } - } - } - _, _ = io.WriteString(out, line) - goroutine = nil - } - nameArguments(goroutines) - return goroutines, scanner.Err() -} - -// Private stuff. - -func nameArguments(goroutines []Goroutine) { - // Set a name for any pointer occuring more than once. - type object struct { - args []*Arg - inPrimary bool - id int - } - objects := map[uint64]object{} - // Enumerate all the arguments. - for i := range goroutines { - for j := range goroutines[i].Stack.Calls { - for k := range goroutines[i].Stack.Calls[j].Args.Values { - arg := goroutines[i].Stack.Calls[j].Args.Values[k] - if arg.IsPtr() { - objects[arg.Value] = object{ - args: append(objects[arg.Value].args, &goroutines[i].Stack.Calls[j].Args.Values[k]), - inPrimary: objects[arg.Value].inPrimary || i == 0, - } - } - } - } - // CreatedBy.Args is never set. - } - order := uint64Slice{} - for k, obj := range objects { - if len(obj.args) > 1 && obj.inPrimary { - order = append(order, k) - } - } - sort.Sort(order) - nextID := 1 - for _, k := range order { - for _, arg := range objects[k].args { - arg.Name = fmt.Sprintf("#%d", nextID) - } - nextID++ - } - - // Now do the rest. This is done so the output is deterministic. - order = uint64Slice{} - for k := range objects { - order = append(order, k) - } - sort.Sort(order) - for _, k := range order { - // Process the remaining pointers, they were not referenced by primary - // thread so will have higher IDs. - if objects[k].inPrimary { - continue - } - for _, arg := range objects[k].args { - arg.Name = fmt.Sprintf("#%d", nextID) - } - nextID++ - } -} - -type uint64Slice []uint64 - -func (a uint64Slice) Len() int { return len(a) } -func (a uint64Slice) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a uint64Slice) Less(i, j int) bool { return a[i] < a[j] } diff --git a/vendor/github.com/maruel/panicparse/stack/ui.go b/vendor/github.com/maruel/panicparse/stack/ui.go deleted file mode 100644 index b125fc940687..000000000000 --- a/vendor/github.com/maruel/panicparse/stack/ui.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2016 Marc-Antoine Ruel. All rights reserved. -// Use of this source code is governed under the Apache License, Version 2.0 -// that can be found in the LICENSE file. - -package stack - -import ( - "fmt" - "strings" -) - -// Palette defines the color used. -// -// An empty object Palette{} can be used to disable coloring. -type Palette struct { - EOLReset string - - // Routine header. - RoutineFirst string // The first routine printed. - Routine string // Following routines. - CreatedBy string - - // Call line. - Package string - SourceFile string - FunctionStdLib string - FunctionStdLibExported string - FunctionMain string - FunctionOther string - FunctionOtherExported string - Arguments string -} - -// CalcLengths returns the maximum length of the source lines and package names. -func CalcLengths(buckets Buckets, fullPath bool) (int, int) { - srcLen := 0 - pkgLen := 0 - for _, bucket := range buckets { - for _, line := range bucket.Signature.Stack.Calls { - l := 0 - if fullPath { - l = len(line.FullSourceLine()) - } else { - l = len(line.SourceLine()) - } - if l > srcLen { - srcLen = l - } - l = len(line.Func.PkgName()) - if l > pkgLen { - pkgLen = l - } - } - } - return srcLen, pkgLen -} - -// functionColor returns the color to be used for the function name based on -// the type of package the function is in. -func (p *Palette) functionColor(line *Call) string { - if line.IsStdlib() { - if line.Func.IsExported() { - return p.FunctionStdLibExported - } - return p.FunctionStdLib - } else if line.IsPkgMain() { - return p.FunctionMain - } else if line.Func.IsExported() { - return p.FunctionOtherExported - } - return p.FunctionOther -} - -// routineColor returns the color for the header of the goroutines bucket. -func (p *Palette) routineColor(bucket *Bucket, multipleBuckets bool) string { - if bucket.First() && multipleBuckets { - return p.RoutineFirst - } - return p.Routine -} - -// BucketHeader prints the header of a goroutine signature. -func (p *Palette) BucketHeader(bucket *Bucket, fullPath, multipleBuckets bool) string { - extra := "" - if bucket.SleepMax != 0 { - if bucket.SleepMin != bucket.SleepMax { - extra += fmt.Sprintf(" [%d~%d minutes]", bucket.SleepMin, bucket.SleepMax) - } else { - extra += fmt.Sprintf(" [%d minutes]", bucket.SleepMax) - } - } - if bucket.Locked { - extra += " [locked]" - } - created := bucket.CreatedBy.Func.PkgDotName() - if created != "" { - created += " @ " - if fullPath { - created += bucket.CreatedBy.FullSourceLine() - } else { - created += bucket.CreatedBy.SourceLine() - } - extra += p.CreatedBy + " [Created by " + created + "]" - } - return fmt.Sprintf( - "%s%d: %s%s%s\n", - p.routineColor(bucket, multipleBuckets), len(bucket.Routines), - bucket.State, extra, - p.EOLReset) -} - -// callLine prints one stack line. -func (p *Palette) callLine(line *Call, srcLen, pkgLen int, fullPath bool) string { - src := "" - if fullPath { - src = line.FullSourceLine() - } else { - src = line.SourceLine() - } - return fmt.Sprintf( - " %s%-*s %s%-*s %s%s%s(%s)%s", - p.Package, pkgLen, line.Func.PkgName(), - p.SourceFile, srcLen, src, - p.functionColor(line), line.Func.Name(), - p.Arguments, line.Args, - p.EOLReset) -} - -// StackLines prints one complete stack trace, without the header. -func (p *Palette) StackLines(signature *Signature, srcLen, pkgLen int, fullPath bool) string { - out := make([]string, len(signature.Stack.Calls)) - for i := range signature.Stack.Calls { - out[i] = p.callLine(&signature.Stack.Calls[i], srcLen, pkgLen, fullPath) - } - if signature.Stack.Elided { - out = append(out, " (...)") - } - return strings.Join(out, "\n") + "\n" -} diff --git a/vendor/github.com/maruel/panicparse/vendor.yml b/vendor/github.com/maruel/panicparse/vendor.yml deleted file mode 100644 index ff3d43f5f2d7..000000000000 --- a/vendor/github.com/maruel/panicparse/vendor.yml +++ /dev/null @@ -1,17 +0,0 @@ -vendors: -- path: github.com/kr/pretty - rev: 737b74a46c4bf788349f72cb256fed10aea4d0ac -- path: github.com/kr/text - rev: 7cafcd837844e784b526369c9bce262804aebc60 -- path: github.com/maruel/ut - rev: a9c9f15ccfa6f8b90182a53df32f4745586fbae3 -- path: github.com/mattn/go-colorable - rev: 9056b7a9f2d1f2d96498d6d146acd1f9d5ed3d59 -- path: github.com/mattn/go-isatty - rev: 56b76bdf51f7708750eac80fa38b952bb9f32639 -- path: github.com/mgutz/ansi - rev: c286dcecd19ff979eeb73ea444e479b903f2cfcb -- path: github.com/pmezard/go-difflib - rev: 792786c7400a136282c1664665ae0a8db921c6c2 -- path: golang.org/x/sys - rev: a646d33e2ee3172a661fc09bca23bb4889a41bc8 diff --git a/vendor/github.com/mattn/go-colorable/LICENSE b/vendor/github.com/mattn/go-colorable/LICENSE deleted file mode 100644 index 91b5cef30ebd..000000000000 --- a/vendor/github.com/mattn/go-colorable/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Yasuhiro Matsumoto - -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/mattn/go-colorable/README.md b/vendor/github.com/mattn/go-colorable/README.md deleted file mode 100644 index 56729a92ca62..000000000000 --- a/vendor/github.com/mattn/go-colorable/README.md +++ /dev/null @@ -1,48 +0,0 @@ -# go-colorable - -[![Godoc Reference](https://godoc.org/github.com/mattn/go-colorable?status.svg)](http://godoc.org/github.com/mattn/go-colorable) -[![Build Status](https://travis-ci.org/mattn/go-colorable.svg?branch=master)](https://travis-ci.org/mattn/go-colorable) -[![Coverage Status](https://coveralls.io/repos/github/mattn/go-colorable/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-colorable?branch=master) -[![Go Report Card](https://goreportcard.com/badge/mattn/go-colorable)](https://goreportcard.com/report/mattn/go-colorable) - -Colorable writer for windows. - -For example, most of logger packages doesn't show colors on windows. (I know we can do it with ansicon. But I don't want.) -This package is possible to handle escape sequence for ansi color on windows. - -## Too Bad! - -![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/bad.png) - - -## So Good! - -![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/good.png) - -## Usage - -```go -logrus.SetFormatter(&logrus.TextFormatter{ForceColors: true}) -logrus.SetOutput(colorable.NewColorableStdout()) - -logrus.Info("succeeded") -logrus.Warn("not correct") -logrus.Error("something error") -logrus.Fatal("panic") -``` - -You can compile above code on non-windows OSs. - -## Installation - -``` -$ go get github.com/mattn/go-colorable -``` - -# License - -MIT - -# Author - -Yasuhiro Matsumoto (a.k.a mattn) diff --git a/vendor/github.com/mattn/go-colorable/colorable_others.go b/vendor/github.com/mattn/go-colorable/colorable_others.go deleted file mode 100644 index 887f203dc7fa..000000000000 --- a/vendor/github.com/mattn/go-colorable/colorable_others.go +++ /dev/null @@ -1,30 +0,0 @@ -// +build !windows -// +build !appengine - -package colorable - -import ( - "io" - "os" - - _ "github.com/mattn/go-isatty" -) - -// NewColorable return new instance of Writer which handle escape sequence. -func NewColorable(file *os.File) io.Writer { - if file == nil { - panic("nil passed instead of *os.File to NewColorable()") - } - - return file -} - -// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. -func NewColorableStdout() io.Writer { - return os.Stdout -} - -// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. -func NewColorableStderr() io.Writer { - return os.Stderr -} diff --git a/vendor/github.com/mattn/go-colorable/colorable_windows.go b/vendor/github.com/mattn/go-colorable/colorable_windows.go deleted file mode 100644 index 404e10ca02b1..000000000000 --- a/vendor/github.com/mattn/go-colorable/colorable_windows.go +++ /dev/null @@ -1,980 +0,0 @@ -// +build windows -// +build !appengine - -package colorable - -import ( - "bytes" - "io" - "math" - "os" - "strconv" - "strings" - "syscall" - "unsafe" - - "github.com/mattn/go-isatty" -) - -const ( - foregroundBlue = 0x1 - foregroundGreen = 0x2 - foregroundRed = 0x4 - foregroundIntensity = 0x8 - foregroundMask = (foregroundRed | foregroundBlue | foregroundGreen | foregroundIntensity) - backgroundBlue = 0x10 - backgroundGreen = 0x20 - backgroundRed = 0x40 - backgroundIntensity = 0x80 - backgroundMask = (backgroundRed | backgroundBlue | backgroundGreen | backgroundIntensity) -) - -const ( - genericRead = 0x80000000 - genericWrite = 0x40000000 -) - -const ( - consoleTextmodeBuffer = 0x1 -) - -type wchar uint16 -type short int16 -type dword uint32 -type word uint16 - -type coord struct { - x short - y short -} - -type smallRect struct { - left short - top short - right short - bottom short -} - -type consoleScreenBufferInfo struct { - size coord - cursorPosition coord - attributes word - window smallRect - maximumWindowSize coord -} - -type consoleCursorInfo struct { - size dword - visible int32 -} - -var ( - kernel32 = syscall.NewLazyDLL("kernel32.dll") - procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") - procSetConsoleTextAttribute = kernel32.NewProc("SetConsoleTextAttribute") - procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition") - procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW") - procFillConsoleOutputAttribute = kernel32.NewProc("FillConsoleOutputAttribute") - procGetConsoleCursorInfo = kernel32.NewProc("GetConsoleCursorInfo") - procSetConsoleCursorInfo = kernel32.NewProc("SetConsoleCursorInfo") - procSetConsoleTitle = kernel32.NewProc("SetConsoleTitleW") - procCreateConsoleScreenBuffer = kernel32.NewProc("CreateConsoleScreenBuffer") -) - -// Writer provide colorable Writer to the console -type Writer struct { - out io.Writer - handle syscall.Handle - althandle syscall.Handle - oldattr word - oldpos coord - rest bytes.Buffer -} - -// NewColorable return new instance of Writer which handle escape sequence from File. -func NewColorable(file *os.File) io.Writer { - if file == nil { - panic("nil passed instead of *os.File to NewColorable()") - } - - if isatty.IsTerminal(file.Fd()) { - var csbi consoleScreenBufferInfo - handle := syscall.Handle(file.Fd()) - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - return &Writer{out: file, handle: handle, oldattr: csbi.attributes, oldpos: coord{0, 0}} - } - return file -} - -// NewColorableStdout return new instance of Writer which handle escape sequence for stdout. -func NewColorableStdout() io.Writer { - return NewColorable(os.Stdout) -} - -// NewColorableStderr return new instance of Writer which handle escape sequence for stderr. -func NewColorableStderr() io.Writer { - return NewColorable(os.Stderr) -} - -var color256 = map[int]int{ - 0: 0x000000, - 1: 0x800000, - 2: 0x008000, - 3: 0x808000, - 4: 0x000080, - 5: 0x800080, - 6: 0x008080, - 7: 0xc0c0c0, - 8: 0x808080, - 9: 0xff0000, - 10: 0x00ff00, - 11: 0xffff00, - 12: 0x0000ff, - 13: 0xff00ff, - 14: 0x00ffff, - 15: 0xffffff, - 16: 0x000000, - 17: 0x00005f, - 18: 0x000087, - 19: 0x0000af, - 20: 0x0000d7, - 21: 0x0000ff, - 22: 0x005f00, - 23: 0x005f5f, - 24: 0x005f87, - 25: 0x005faf, - 26: 0x005fd7, - 27: 0x005fff, - 28: 0x008700, - 29: 0x00875f, - 30: 0x008787, - 31: 0x0087af, - 32: 0x0087d7, - 33: 0x0087ff, - 34: 0x00af00, - 35: 0x00af5f, - 36: 0x00af87, - 37: 0x00afaf, - 38: 0x00afd7, - 39: 0x00afff, - 40: 0x00d700, - 41: 0x00d75f, - 42: 0x00d787, - 43: 0x00d7af, - 44: 0x00d7d7, - 45: 0x00d7ff, - 46: 0x00ff00, - 47: 0x00ff5f, - 48: 0x00ff87, - 49: 0x00ffaf, - 50: 0x00ffd7, - 51: 0x00ffff, - 52: 0x5f0000, - 53: 0x5f005f, - 54: 0x5f0087, - 55: 0x5f00af, - 56: 0x5f00d7, - 57: 0x5f00ff, - 58: 0x5f5f00, - 59: 0x5f5f5f, - 60: 0x5f5f87, - 61: 0x5f5faf, - 62: 0x5f5fd7, - 63: 0x5f5fff, - 64: 0x5f8700, - 65: 0x5f875f, - 66: 0x5f8787, - 67: 0x5f87af, - 68: 0x5f87d7, - 69: 0x5f87ff, - 70: 0x5faf00, - 71: 0x5faf5f, - 72: 0x5faf87, - 73: 0x5fafaf, - 74: 0x5fafd7, - 75: 0x5fafff, - 76: 0x5fd700, - 77: 0x5fd75f, - 78: 0x5fd787, - 79: 0x5fd7af, - 80: 0x5fd7d7, - 81: 0x5fd7ff, - 82: 0x5fff00, - 83: 0x5fff5f, - 84: 0x5fff87, - 85: 0x5fffaf, - 86: 0x5fffd7, - 87: 0x5fffff, - 88: 0x870000, - 89: 0x87005f, - 90: 0x870087, - 91: 0x8700af, - 92: 0x8700d7, - 93: 0x8700ff, - 94: 0x875f00, - 95: 0x875f5f, - 96: 0x875f87, - 97: 0x875faf, - 98: 0x875fd7, - 99: 0x875fff, - 100: 0x878700, - 101: 0x87875f, - 102: 0x878787, - 103: 0x8787af, - 104: 0x8787d7, - 105: 0x8787ff, - 106: 0x87af00, - 107: 0x87af5f, - 108: 0x87af87, - 109: 0x87afaf, - 110: 0x87afd7, - 111: 0x87afff, - 112: 0x87d700, - 113: 0x87d75f, - 114: 0x87d787, - 115: 0x87d7af, - 116: 0x87d7d7, - 117: 0x87d7ff, - 118: 0x87ff00, - 119: 0x87ff5f, - 120: 0x87ff87, - 121: 0x87ffaf, - 122: 0x87ffd7, - 123: 0x87ffff, - 124: 0xaf0000, - 125: 0xaf005f, - 126: 0xaf0087, - 127: 0xaf00af, - 128: 0xaf00d7, - 129: 0xaf00ff, - 130: 0xaf5f00, - 131: 0xaf5f5f, - 132: 0xaf5f87, - 133: 0xaf5faf, - 134: 0xaf5fd7, - 135: 0xaf5fff, - 136: 0xaf8700, - 137: 0xaf875f, - 138: 0xaf8787, - 139: 0xaf87af, - 140: 0xaf87d7, - 141: 0xaf87ff, - 142: 0xafaf00, - 143: 0xafaf5f, - 144: 0xafaf87, - 145: 0xafafaf, - 146: 0xafafd7, - 147: 0xafafff, - 148: 0xafd700, - 149: 0xafd75f, - 150: 0xafd787, - 151: 0xafd7af, - 152: 0xafd7d7, - 153: 0xafd7ff, - 154: 0xafff00, - 155: 0xafff5f, - 156: 0xafff87, - 157: 0xafffaf, - 158: 0xafffd7, - 159: 0xafffff, - 160: 0xd70000, - 161: 0xd7005f, - 162: 0xd70087, - 163: 0xd700af, - 164: 0xd700d7, - 165: 0xd700ff, - 166: 0xd75f00, - 167: 0xd75f5f, - 168: 0xd75f87, - 169: 0xd75faf, - 170: 0xd75fd7, - 171: 0xd75fff, - 172: 0xd78700, - 173: 0xd7875f, - 174: 0xd78787, - 175: 0xd787af, - 176: 0xd787d7, - 177: 0xd787ff, - 178: 0xd7af00, - 179: 0xd7af5f, - 180: 0xd7af87, - 181: 0xd7afaf, - 182: 0xd7afd7, - 183: 0xd7afff, - 184: 0xd7d700, - 185: 0xd7d75f, - 186: 0xd7d787, - 187: 0xd7d7af, - 188: 0xd7d7d7, - 189: 0xd7d7ff, - 190: 0xd7ff00, - 191: 0xd7ff5f, - 192: 0xd7ff87, - 193: 0xd7ffaf, - 194: 0xd7ffd7, - 195: 0xd7ffff, - 196: 0xff0000, - 197: 0xff005f, - 198: 0xff0087, - 199: 0xff00af, - 200: 0xff00d7, - 201: 0xff00ff, - 202: 0xff5f00, - 203: 0xff5f5f, - 204: 0xff5f87, - 205: 0xff5faf, - 206: 0xff5fd7, - 207: 0xff5fff, - 208: 0xff8700, - 209: 0xff875f, - 210: 0xff8787, - 211: 0xff87af, - 212: 0xff87d7, - 213: 0xff87ff, - 214: 0xffaf00, - 215: 0xffaf5f, - 216: 0xffaf87, - 217: 0xffafaf, - 218: 0xffafd7, - 219: 0xffafff, - 220: 0xffd700, - 221: 0xffd75f, - 222: 0xffd787, - 223: 0xffd7af, - 224: 0xffd7d7, - 225: 0xffd7ff, - 226: 0xffff00, - 227: 0xffff5f, - 228: 0xffff87, - 229: 0xffffaf, - 230: 0xffffd7, - 231: 0xffffff, - 232: 0x080808, - 233: 0x121212, - 234: 0x1c1c1c, - 235: 0x262626, - 236: 0x303030, - 237: 0x3a3a3a, - 238: 0x444444, - 239: 0x4e4e4e, - 240: 0x585858, - 241: 0x626262, - 242: 0x6c6c6c, - 243: 0x767676, - 244: 0x808080, - 245: 0x8a8a8a, - 246: 0x949494, - 247: 0x9e9e9e, - 248: 0xa8a8a8, - 249: 0xb2b2b2, - 250: 0xbcbcbc, - 251: 0xc6c6c6, - 252: 0xd0d0d0, - 253: 0xdadada, - 254: 0xe4e4e4, - 255: 0xeeeeee, -} - -// `\033]0;TITLESTR\007` -func doTitleSequence(er *bytes.Reader) error { - var c byte - var err error - - c, err = er.ReadByte() - if err != nil { - return err - } - if c != '0' && c != '2' { - return nil - } - c, err = er.ReadByte() - if err != nil { - return err - } - if c != ';' { - return nil - } - title := make([]byte, 0, 80) - for { - c, err = er.ReadByte() - if err != nil { - return err - } - if c == 0x07 || c == '\n' { - break - } - title = append(title, c) - } - if len(title) > 0 { - title8, err := syscall.UTF16PtrFromString(string(title)) - if err == nil { - procSetConsoleTitle.Call(uintptr(unsafe.Pointer(title8))) - } - } - return nil -} - -// Write write data on console -func (w *Writer) Write(data []byte) (n int, err error) { - var csbi consoleScreenBufferInfo - procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi))) - - handle := w.handle - - var er *bytes.Reader - if w.rest.Len() > 0 { - var rest bytes.Buffer - w.rest.WriteTo(&rest) - w.rest.Reset() - rest.Write(data) - er = bytes.NewReader(rest.Bytes()) - } else { - er = bytes.NewReader(data) - } - var bw [1]byte -loop: - for { - c1, err := er.ReadByte() - if err != nil { - break loop - } - if c1 != 0x1b { - bw[0] = c1 - w.out.Write(bw[:]) - continue - } - c2, err := er.ReadByte() - if err != nil { - break loop - } - - switch c2 { - case '>': - continue - case ']': - w.rest.WriteByte(c1) - w.rest.WriteByte(c2) - er.WriteTo(&w.rest) - if bytes.IndexByte(w.rest.Bytes(), 0x07) == -1 { - break loop - } - er = bytes.NewReader(w.rest.Bytes()[2:]) - err := doTitleSequence(er) - if err != nil { - break loop - } - w.rest.Reset() - continue - // https://github.com/mattn/go-colorable/issues/27 - case '7': - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - w.oldpos = csbi.cursorPosition - continue - case '8': - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&w.oldpos))) - continue - case 0x5b: - // execute part after switch - default: - continue - } - - w.rest.WriteByte(c1) - w.rest.WriteByte(c2) - er.WriteTo(&w.rest) - - var buf bytes.Buffer - var m byte - for i, c := range w.rest.Bytes()[2:] { - if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { - m = c - er = bytes.NewReader(w.rest.Bytes()[2+i+1:]) - w.rest.Reset() - break - } - buf.Write([]byte(string(c))) - } - if m == 0 { - break loop - } - - switch m { - case 'A': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.y -= short(n) - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'B': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.y += short(n) - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'C': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x += short(n) - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'D': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x -= short(n) - if csbi.cursorPosition.x < 0 { - csbi.cursorPosition.x = 0 - } - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'E': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x = 0 - csbi.cursorPosition.y += short(n) - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'F': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x = 0 - csbi.cursorPosition.y -= short(n) - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'G': - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - csbi.cursorPosition.x = short(n - 1) - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'H', 'f': - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - if buf.Len() > 0 { - token := strings.Split(buf.String(), ";") - switch len(token) { - case 1: - n1, err := strconv.Atoi(token[0]) - if err != nil { - continue - } - csbi.cursorPosition.y = short(n1 - 1) - case 2: - n1, err := strconv.Atoi(token[0]) - if err != nil { - continue - } - n2, err := strconv.Atoi(token[1]) - if err != nil { - continue - } - csbi.cursorPosition.x = short(n2 - 1) - csbi.cursorPosition.y = short(n1 - 1) - } - } else { - csbi.cursorPosition.y = 0 - } - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition))) - case 'J': - n := 0 - if buf.Len() > 0 { - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - } - var count, written dword - var cursor coord - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - switch n { - case 0: - cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} - count = dword(csbi.size.x) - dword(csbi.cursorPosition.x) + dword(csbi.size.y-csbi.cursorPosition.y)*dword(csbi.size.x) - case 1: - cursor = coord{x: csbi.window.left, y: csbi.window.top} - count = dword(csbi.size.x) - dword(csbi.cursorPosition.x) + dword(csbi.window.top-csbi.cursorPosition.y)*dword(csbi.size.x) - case 2: - cursor = coord{x: csbi.window.left, y: csbi.window.top} - count = dword(csbi.size.x) - dword(csbi.cursorPosition.x) + dword(csbi.size.y-csbi.cursorPosition.y)*dword(csbi.size.x) - } - procFillConsoleOutputCharacter.Call(uintptr(handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - procFillConsoleOutputAttribute.Call(uintptr(handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - case 'K': - n := 0 - if buf.Len() > 0 { - n, err = strconv.Atoi(buf.String()) - if err != nil { - continue - } - } - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - var cursor coord - var count, written dword - switch n { - case 0: - cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y} - count = dword(csbi.size.x - csbi.cursorPosition.x) - case 1: - cursor = coord{x: csbi.window.left, y: csbi.cursorPosition.y} - count = dword(csbi.size.x - csbi.cursorPosition.x) - case 2: - cursor = coord{x: csbi.window.left, y: csbi.cursorPosition.y} - count = dword(csbi.size.x) - } - procFillConsoleOutputCharacter.Call(uintptr(handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - procFillConsoleOutputAttribute.Call(uintptr(handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written))) - case 'm': - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - attr := csbi.attributes - cs := buf.String() - if cs == "" { - procSetConsoleTextAttribute.Call(uintptr(handle), uintptr(w.oldattr)) - continue - } - token := strings.Split(cs, ";") - for i := 0; i < len(token); i++ { - ns := token[i] - if n, err = strconv.Atoi(ns); err == nil { - switch { - case n == 0 || n == 100: - attr = w.oldattr - case 1 <= n && n <= 5: - attr |= foregroundIntensity - case n == 7: - attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4) - case n == 22 || n == 25: - attr |= foregroundIntensity - case n == 27: - attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4) - case 30 <= n && n <= 37: - attr &= backgroundMask - if (n-30)&1 != 0 { - attr |= foregroundRed - } - if (n-30)&2 != 0 { - attr |= foregroundGreen - } - if (n-30)&4 != 0 { - attr |= foregroundBlue - } - case n == 38: // set foreground color. - if i < len(token)-2 && (token[i+1] == "5" || token[i+1] == "05") { - if n256, err := strconv.Atoi(token[i+2]); err == nil { - if n256foreAttr == nil { - n256setup() - } - attr &= backgroundMask - attr |= n256foreAttr[n256] - i += 2 - } - } else if len(token) == 5 && token[i+1] == "2" { - var r, g, b int - r, _ = strconv.Atoi(token[i+2]) - g, _ = strconv.Atoi(token[i+3]) - b, _ = strconv.Atoi(token[i+4]) - i += 4 - if r > 127 { - attr |= foregroundRed - } - if g > 127 { - attr |= foregroundGreen - } - if b > 127 { - attr |= foregroundBlue - } - } else { - attr = attr & (w.oldattr & backgroundMask) - } - case n == 39: // reset foreground color. - attr &= backgroundMask - attr |= w.oldattr & foregroundMask - case 40 <= n && n <= 47: - attr &= foregroundMask - if (n-40)&1 != 0 { - attr |= backgroundRed - } - if (n-40)&2 != 0 { - attr |= backgroundGreen - } - if (n-40)&4 != 0 { - attr |= backgroundBlue - } - case n == 48: // set background color. - if i < len(token)-2 && token[i+1] == "5" { - if n256, err := strconv.Atoi(token[i+2]); err == nil { - if n256backAttr == nil { - n256setup() - } - attr &= foregroundMask - attr |= n256backAttr[n256] - i += 2 - } - } else if len(token) == 5 && token[i+1] == "2" { - var r, g, b int - r, _ = strconv.Atoi(token[i+2]) - g, _ = strconv.Atoi(token[i+3]) - b, _ = strconv.Atoi(token[i+4]) - i += 4 - if r > 127 { - attr |= backgroundRed - } - if g > 127 { - attr |= backgroundGreen - } - if b > 127 { - attr |= backgroundBlue - } - } else { - attr = attr & (w.oldattr & foregroundMask) - } - case n == 49: // reset foreground color. - attr &= foregroundMask - attr |= w.oldattr & backgroundMask - case 90 <= n && n <= 97: - attr = (attr & backgroundMask) - attr |= foregroundIntensity - if (n-90)&1 != 0 { - attr |= foregroundRed - } - if (n-90)&2 != 0 { - attr |= foregroundGreen - } - if (n-90)&4 != 0 { - attr |= foregroundBlue - } - case 100 <= n && n <= 107: - attr = (attr & foregroundMask) - attr |= backgroundIntensity - if (n-100)&1 != 0 { - attr |= backgroundRed - } - if (n-100)&2 != 0 { - attr |= backgroundGreen - } - if (n-100)&4 != 0 { - attr |= backgroundBlue - } - } - procSetConsoleTextAttribute.Call(uintptr(handle), uintptr(attr)) - } - } - case 'h': - var ci consoleCursorInfo - cs := buf.String() - if cs == "5>" { - procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - ci.visible = 0 - procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - } else if cs == "?25" { - procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - ci.visible = 1 - procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - } else if cs == "?1049" { - if w.althandle == 0 { - h, _, _ := procCreateConsoleScreenBuffer.Call(uintptr(genericRead|genericWrite), 0, 0, uintptr(consoleTextmodeBuffer), 0, 0) - w.althandle = syscall.Handle(h) - if w.althandle != 0 { - handle = w.althandle - } - } - } - case 'l': - var ci consoleCursorInfo - cs := buf.String() - if cs == "5>" { - procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - ci.visible = 1 - procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - } else if cs == "?25" { - procGetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - ci.visible = 0 - procSetConsoleCursorInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&ci))) - } else if cs == "?1049" { - if w.althandle != 0 { - syscall.CloseHandle(w.althandle) - w.althandle = 0 - handle = w.handle - } - } - case 's': - procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi))) - w.oldpos = csbi.cursorPosition - case 'u': - procSetConsoleCursorPosition.Call(uintptr(handle), *(*uintptr)(unsafe.Pointer(&w.oldpos))) - } - } - - return len(data), nil -} - -type consoleColor struct { - rgb int - red bool - green bool - blue bool - intensity bool -} - -func (c consoleColor) foregroundAttr() (attr word) { - if c.red { - attr |= foregroundRed - } - if c.green { - attr |= foregroundGreen - } - if c.blue { - attr |= foregroundBlue - } - if c.intensity { - attr |= foregroundIntensity - } - return -} - -func (c consoleColor) backgroundAttr() (attr word) { - if c.red { - attr |= backgroundRed - } - if c.green { - attr |= backgroundGreen - } - if c.blue { - attr |= backgroundBlue - } - if c.intensity { - attr |= backgroundIntensity - } - return -} - -var color16 = []consoleColor{ - {0x000000, false, false, false, false}, - {0x000080, false, false, true, false}, - {0x008000, false, true, false, false}, - {0x008080, false, true, true, false}, - {0x800000, true, false, false, false}, - {0x800080, true, false, true, false}, - {0x808000, true, true, false, false}, - {0xc0c0c0, true, true, true, false}, - {0x808080, false, false, false, true}, - {0x0000ff, false, false, true, true}, - {0x00ff00, false, true, false, true}, - {0x00ffff, false, true, true, true}, - {0xff0000, true, false, false, true}, - {0xff00ff, true, false, true, true}, - {0xffff00, true, true, false, true}, - {0xffffff, true, true, true, true}, -} - -type hsv struct { - h, s, v float32 -} - -func (a hsv) dist(b hsv) float32 { - dh := a.h - b.h - switch { - case dh > 0.5: - dh = 1 - dh - case dh < -0.5: - dh = -1 - dh - } - ds := a.s - b.s - dv := a.v - b.v - return float32(math.Sqrt(float64(dh*dh + ds*ds + dv*dv))) -} - -func toHSV(rgb int) hsv { - r, g, b := float32((rgb&0xFF0000)>>16)/256.0, - float32((rgb&0x00FF00)>>8)/256.0, - float32(rgb&0x0000FF)/256.0 - min, max := minmax3f(r, g, b) - h := max - min - if h > 0 { - if max == r { - h = (g - b) / h - if h < 0 { - h += 6 - } - } else if max == g { - h = 2 + (b-r)/h - } else { - h = 4 + (r-g)/h - } - } - h /= 6.0 - s := max - min - if max != 0 { - s /= max - } - v := max - return hsv{h: h, s: s, v: v} -} - -type hsvTable []hsv - -func toHSVTable(rgbTable []consoleColor) hsvTable { - t := make(hsvTable, len(rgbTable)) - for i, c := range rgbTable { - t[i] = toHSV(c.rgb) - } - return t -} - -func (t hsvTable) find(rgb int) consoleColor { - hsv := toHSV(rgb) - n := 7 - l := float32(5.0) - for i, p := range t { - d := hsv.dist(p) - if d < l { - l, n = d, i - } - } - return color16[n] -} - -func minmax3f(a, b, c float32) (min, max float32) { - if a < b { - if b < c { - return a, c - } else if a < c { - return a, b - } else { - return c, b - } - } else { - if a < c { - return b, c - } else if b < c { - return b, a - } else { - return c, a - } - } -} - -var n256foreAttr []word -var n256backAttr []word - -func n256setup() { - n256foreAttr = make([]word, 256) - n256backAttr = make([]word, 256) - t := toHSVTable(color16) - for i, rgb := range color256 { - c := t.find(rgb) - n256foreAttr[i] = c.foregroundAttr() - n256backAttr[i] = c.backgroundAttr() - } -} diff --git a/vendor/github.com/mattn/go-colorable/noncolorable.go b/vendor/github.com/mattn/go-colorable/noncolorable.go deleted file mode 100644 index 9721e16f4bf4..000000000000 --- a/vendor/github.com/mattn/go-colorable/noncolorable.go +++ /dev/null @@ -1,55 +0,0 @@ -package colorable - -import ( - "bytes" - "io" -) - -// NonColorable hold writer but remove escape sequence. -type NonColorable struct { - out io.Writer -} - -// NewNonColorable return new instance of Writer which remove escape sequence from Writer. -func NewNonColorable(w io.Writer) io.Writer { - return &NonColorable{out: w} -} - -// Write write data on console -func (w *NonColorable) Write(data []byte) (n int, err error) { - er := bytes.NewReader(data) - var bw [1]byte -loop: - for { - c1, err := er.ReadByte() - if err != nil { - break loop - } - if c1 != 0x1b { - bw[0] = c1 - w.out.Write(bw[:]) - continue - } - c2, err := er.ReadByte() - if err != nil { - break loop - } - if c2 != 0x5b { - continue - } - - var buf bytes.Buffer - for { - c, err := er.ReadByte() - if err != nil { - break loop - } - if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' { - break - } - buf.Write([]byte(string(c))) - } - } - - return len(data), nil -} diff --git a/vendor/github.com/mattn/go-isatty/LICENSE b/vendor/github.com/mattn/go-isatty/LICENSE deleted file mode 100644 index 65dc692b6b17..000000000000 --- a/vendor/github.com/mattn/go-isatty/LICENSE +++ /dev/null @@ -1,9 +0,0 @@ -Copyright (c) Yasuhiro MATSUMOTO - -MIT License (Expat) - -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/mattn/go-isatty/README.md b/vendor/github.com/mattn/go-isatty/README.md deleted file mode 100644 index 1e69004bb039..000000000000 --- a/vendor/github.com/mattn/go-isatty/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# go-isatty - -[![Godoc Reference](https://godoc.org/github.com/mattn/go-isatty?status.svg)](http://godoc.org/github.com/mattn/go-isatty) -[![Build Status](https://travis-ci.org/mattn/go-isatty.svg?branch=master)](https://travis-ci.org/mattn/go-isatty) -[![Coverage Status](https://coveralls.io/repos/github/mattn/go-isatty/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-isatty?branch=master) -[![Go Report Card](https://goreportcard.com/badge/mattn/go-isatty)](https://goreportcard.com/report/mattn/go-isatty) - -isatty for golang - -## Usage - -```go -package main - -import ( - "fmt" - "github.com/mattn/go-isatty" - "os" -) - -func main() { - if isatty.IsTerminal(os.Stdout.Fd()) { - fmt.Println("Is Terminal") - } else if isatty.IsCygwinTerminal(os.Stdout.Fd()) { - fmt.Println("Is Cygwin/MSYS2 Terminal") - } else { - fmt.Println("Is Not Terminal") - } -} -``` - -## Installation - -``` -$ go get github.com/mattn/go-isatty -``` - -## License - -MIT - -## Author - -Yasuhiro Matsumoto (a.k.a mattn) - -## Thanks - -* k-takata: base idea for IsCygwinTerminal - - https://github.com/k-takata/go-iscygpty diff --git a/vendor/github.com/mattn/go-isatty/doc.go b/vendor/github.com/mattn/go-isatty/doc.go deleted file mode 100644 index 17d4f90ebcc7..000000000000 --- a/vendor/github.com/mattn/go-isatty/doc.go +++ /dev/null @@ -1,2 +0,0 @@ -// Package isatty implements interface to isatty -package isatty diff --git a/vendor/github.com/mattn/go-isatty/isatty_bsd.go b/vendor/github.com/mattn/go-isatty/isatty_bsd.go deleted file mode 100644 index 07e93039dbe3..000000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_bsd.go +++ /dev/null @@ -1,24 +0,0 @@ -// +build darwin freebsd openbsd netbsd dragonfly -// +build !appengine - -package isatty - -import ( - "syscall" - "unsafe" -) - -const ioctlReadTermios = syscall.TIOCGETA - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_linux.go b/vendor/github.com/mattn/go-isatty/isatty_linux.go deleted file mode 100644 index 1f4002617a53..000000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_linux.go +++ /dev/null @@ -1,24 +0,0 @@ -// +build linux -// +build !appengine,!ppc64,!ppc64le - -package isatty - -import ( - "syscall" - "unsafe" -) - -const ioctlReadTermios = syscall.TCGETS - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go b/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go deleted file mode 100644 index bb7d3c42245b..000000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_linux_ppc64x.go +++ /dev/null @@ -1,25 +0,0 @@ -// +build linux -// +build ppc64 ppc64le - -package isatty - -import ( - "unsafe" - - syscall "golang.org/x/sys/unix" -) - -const ioctlReadTermios = syscall.TCGETS - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var termios syscall.Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_others.go b/vendor/github.com/mattn/go-isatty/isatty_others.go deleted file mode 100644 index f02849c56f22..000000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_others.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build appengine js - -package isatty - -// IsTerminal returns true if the file descriptor is terminal which -// is always false on js and appengine classic which is a sandboxed PaaS. -func IsTerminal(fd uintptr) bool { - return false -} - -// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_solaris.go b/vendor/github.com/mattn/go-isatty/isatty_solaris.go deleted file mode 100644 index bdd5c79a07fc..000000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_solaris.go +++ /dev/null @@ -1,22 +0,0 @@ -// +build solaris -// +build !appengine - -package isatty - -import ( - "golang.org/x/sys/unix" -) - -// IsTerminal returns true if the given file descriptor is a terminal. -// see: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libbc/libc/gen/common/isatty.c -func IsTerminal(fd uintptr) bool { - var termio unix.Termio - err := unix.IoctlSetTermio(int(fd), unix.TCGETA, &termio) - return err == nil -} - -// IsCygwinTerminal return true if the file descriptor is a cygwin or msys2 -// terminal. This is also always false on this environment. -func IsCygwinTerminal(fd uintptr) bool { - return false -} diff --git a/vendor/github.com/mattn/go-isatty/isatty_windows.go b/vendor/github.com/mattn/go-isatty/isatty_windows.go deleted file mode 100644 index af51cbcaa485..000000000000 --- a/vendor/github.com/mattn/go-isatty/isatty_windows.go +++ /dev/null @@ -1,94 +0,0 @@ -// +build windows -// +build !appengine - -package isatty - -import ( - "strings" - "syscall" - "unicode/utf16" - "unsafe" -) - -const ( - fileNameInfo uintptr = 2 - fileTypePipe = 3 -) - -var ( - kernel32 = syscall.NewLazyDLL("kernel32.dll") - procGetConsoleMode = kernel32.NewProc("GetConsoleMode") - procGetFileInformationByHandleEx = kernel32.NewProc("GetFileInformationByHandleEx") - procGetFileType = kernel32.NewProc("GetFileType") -) - -func init() { - // Check if GetFileInformationByHandleEx is available. - if procGetFileInformationByHandleEx.Find() != nil { - procGetFileInformationByHandleEx = nil - } -} - -// IsTerminal return true if the file descriptor is terminal. -func IsTerminal(fd uintptr) bool { - var st uint32 - r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, fd, uintptr(unsafe.Pointer(&st)), 0) - return r != 0 && e == 0 -} - -// Check pipe name is used for cygwin/msys2 pty. -// Cygwin/MSYS2 PTY has a name like: -// \{cygwin,msys}-XXXXXXXXXXXXXXXX-ptyN-{from,to}-master -func isCygwinPipeName(name string) bool { - token := strings.Split(name, "-") - if len(token) < 5 { - return false - } - - if token[0] != `\msys` && token[0] != `\cygwin` { - return false - } - - if token[1] == "" { - return false - } - - if !strings.HasPrefix(token[2], "pty") { - return false - } - - if token[3] != `from` && token[3] != `to` { - return false - } - - if token[4] != "master" { - return false - } - - return true -} - -// IsCygwinTerminal() return true if the file descriptor is a cygwin or msys2 -// terminal. -func IsCygwinTerminal(fd uintptr) bool { - if procGetFileInformationByHandleEx == nil { - return false - } - - // Cygwin/msys's pty is a pipe. - ft, _, e := syscall.Syscall(procGetFileType.Addr(), 1, fd, 0, 0) - if ft != fileTypePipe || e != 0 { - return false - } - - var buf [2 + syscall.MAX_PATH]uint16 - r, _, e := syscall.Syscall6(procGetFileInformationByHandleEx.Addr(), - 4, fd, fileNameInfo, uintptr(unsafe.Pointer(&buf)), - uintptr(len(buf)*2), 0, 0) - if r == 0 || e != 0 { - return false - } - - l := *(*uint32)(unsafe.Pointer(&buf)) - return isCygwinPipeName(string(utf16.Decode(buf[2 : 2+l/2]))) -} diff --git a/vendor/github.com/mattn/go-runewidth/LICENSE b/vendor/github.com/mattn/go-runewidth/LICENSE deleted file mode 100644 index 91b5cef30ebd..000000000000 --- a/vendor/github.com/mattn/go-runewidth/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Yasuhiro Matsumoto - -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/mattn/go-runewidth/README.mkd b/vendor/github.com/mattn/go-runewidth/README.mkd deleted file mode 100644 index 66663a94b0b4..000000000000 --- a/vendor/github.com/mattn/go-runewidth/README.mkd +++ /dev/null @@ -1,27 +0,0 @@ -go-runewidth -============ - -[![Build Status](https://travis-ci.org/mattn/go-runewidth.png?branch=master)](https://travis-ci.org/mattn/go-runewidth) -[![Coverage Status](https://coveralls.io/repos/mattn/go-runewidth/badge.png?branch=HEAD)](https://coveralls.io/r/mattn/go-runewidth?branch=HEAD) -[![GoDoc](https://godoc.org/github.com/mattn/go-runewidth?status.svg)](http://godoc.org/github.com/mattn/go-runewidth) -[![Go Report Card](https://goreportcard.com/badge/github.com/mattn/go-runewidth)](https://goreportcard.com/report/github.com/mattn/go-runewidth) - -Provides functions to get fixed width of the character or string. - -Usage ------ - -```go -runewidth.StringWidth("つのだ☆HIRO") == 12 -``` - - -Author ------- - -Yasuhiro Matsumoto - -License -------- - -under the MIT License: http://mattn.mit-license.org/2013 diff --git a/vendor/github.com/mattn/go-runewidth/runewidth.go b/vendor/github.com/mattn/go-runewidth/runewidth.go deleted file mode 100644 index 82568a1bb904..000000000000 --- a/vendor/github.com/mattn/go-runewidth/runewidth.go +++ /dev/null @@ -1,1235 +0,0 @@ -package runewidth - -import "os" - -var ( - // EastAsianWidth will be set true if the current locale is CJK - EastAsianWidth bool - - // DefaultCondition is a condition in current locale - DefaultCondition = &Condition{EastAsianWidth} -) - -func init() { - env := os.Getenv("RUNEWIDTH_EASTASIAN") - if env == "" { - EastAsianWidth = IsEastAsian() - } else { - EastAsianWidth = env == "1" - } -} - -type interval struct { - first rune - last rune -} - -type table []interval - -func inTables(r rune, ts ...table) bool { - for _, t := range ts { - if inTable(r, t) { - return true - } - } - return false -} - -func inTable(r rune, t table) bool { - // func (t table) IncludesRune(r rune) bool { - if r < t[0].first { - return false - } - - bot := 0 - top := len(t) - 1 - for top >= bot { - mid := (bot + top) / 2 - - switch { - case t[mid].last < r: - bot = mid + 1 - case t[mid].first > r: - top = mid - 1 - default: - return true - } - } - - return false -} - -var private = table{ - {0x00E000, 0x00F8FF}, {0x0F0000, 0x0FFFFD}, {0x100000, 0x10FFFD}, -} - -var nonprint = table{ - {0x0000, 0x001F}, {0x007F, 0x009F}, {0x00AD, 0x00AD}, - {0x070F, 0x070F}, {0x180B, 0x180E}, {0x200B, 0x200F}, - {0x2028, 0x2029}, - {0x202A, 0x202E}, {0x206A, 0x206F}, {0xD800, 0xDFFF}, - {0xFEFF, 0xFEFF}, {0xFFF9, 0xFFFB}, {0xFFFE, 0xFFFF}, -} - -var combining = table{ - {0x0300, 0x036F}, {0x0483, 0x0489}, {0x0591, 0x05BD}, - {0x05BF, 0x05BF}, {0x05C1, 0x05C2}, {0x05C4, 0x05C5}, - {0x05C7, 0x05C7}, {0x0610, 0x061A}, {0x064B, 0x065F}, - {0x0670, 0x0670}, {0x06D6, 0x06DC}, {0x06DF, 0x06E4}, - {0x06E7, 0x06E8}, {0x06EA, 0x06ED}, {0x0711, 0x0711}, - {0x0730, 0x074A}, {0x07A6, 0x07B0}, {0x07EB, 0x07F3}, - {0x0816, 0x0819}, {0x081B, 0x0823}, {0x0825, 0x0827}, - {0x0829, 0x082D}, {0x0859, 0x085B}, {0x08D4, 0x08E1}, - {0x08E3, 0x0903}, {0x093A, 0x093C}, {0x093E, 0x094F}, - {0x0951, 0x0957}, {0x0962, 0x0963}, {0x0981, 0x0983}, - {0x09BC, 0x09BC}, {0x09BE, 0x09C4}, {0x09C7, 0x09C8}, - {0x09CB, 0x09CD}, {0x09D7, 0x09D7}, {0x09E2, 0x09E3}, - {0x0A01, 0x0A03}, {0x0A3C, 0x0A3C}, {0x0A3E, 0x0A42}, - {0x0A47, 0x0A48}, {0x0A4B, 0x0A4D}, {0x0A51, 0x0A51}, - {0x0A70, 0x0A71}, {0x0A75, 0x0A75}, {0x0A81, 0x0A83}, - {0x0ABC, 0x0ABC}, {0x0ABE, 0x0AC5}, {0x0AC7, 0x0AC9}, - {0x0ACB, 0x0ACD}, {0x0AE2, 0x0AE3}, {0x0B01, 0x0B03}, - {0x0B3C, 0x0B3C}, {0x0B3E, 0x0B44}, {0x0B47, 0x0B48}, - {0x0B4B, 0x0B4D}, {0x0B56, 0x0B57}, {0x0B62, 0x0B63}, - {0x0B82, 0x0B82}, {0x0BBE, 0x0BC2}, {0x0BC6, 0x0BC8}, - {0x0BCA, 0x0BCD}, {0x0BD7, 0x0BD7}, {0x0C00, 0x0C03}, - {0x0C3E, 0x0C44}, {0x0C46, 0x0C48}, {0x0C4A, 0x0C4D}, - {0x0C55, 0x0C56}, {0x0C62, 0x0C63}, {0x0C81, 0x0C83}, - {0x0CBC, 0x0CBC}, {0x0CBE, 0x0CC4}, {0x0CC6, 0x0CC8}, - {0x0CCA, 0x0CCD}, {0x0CD5, 0x0CD6}, {0x0CE2, 0x0CE3}, - {0x0D01, 0x0D03}, {0x0D3E, 0x0D44}, {0x0D46, 0x0D48}, - {0x0D4A, 0x0D4D}, {0x0D57, 0x0D57}, {0x0D62, 0x0D63}, - {0x0D82, 0x0D83}, {0x0DCA, 0x0DCA}, {0x0DCF, 0x0DD4}, - {0x0DD6, 0x0DD6}, {0x0DD8, 0x0DDF}, {0x0DF2, 0x0DF3}, - {0x0E31, 0x0E31}, {0x0E34, 0x0E3A}, {0x0E47, 0x0E4E}, - {0x0EB1, 0x0EB1}, {0x0EB4, 0x0EB9}, {0x0EBB, 0x0EBC}, - {0x0EC8, 0x0ECD}, {0x0F18, 0x0F19}, {0x0F35, 0x0F35}, - {0x0F37, 0x0F37}, {0x0F39, 0x0F39}, {0x0F3E, 0x0F3F}, - {0x0F71, 0x0F84}, {0x0F86, 0x0F87}, {0x0F8D, 0x0F97}, - {0x0F99, 0x0FBC}, {0x0FC6, 0x0FC6}, {0x102B, 0x103E}, - {0x1056, 0x1059}, {0x105E, 0x1060}, {0x1062, 0x1064}, - {0x1067, 0x106D}, {0x1071, 0x1074}, {0x1082, 0x108D}, - {0x108F, 0x108F}, {0x109A, 0x109D}, {0x135D, 0x135F}, - {0x1712, 0x1714}, {0x1732, 0x1734}, {0x1752, 0x1753}, - {0x1772, 0x1773}, {0x17B4, 0x17D3}, {0x17DD, 0x17DD}, - {0x180B, 0x180D}, {0x1885, 0x1886}, {0x18A9, 0x18A9}, - {0x1920, 0x192B}, {0x1930, 0x193B}, {0x1A17, 0x1A1B}, - {0x1A55, 0x1A5E}, {0x1A60, 0x1A7C}, {0x1A7F, 0x1A7F}, - {0x1AB0, 0x1ABE}, {0x1B00, 0x1B04}, {0x1B34, 0x1B44}, - {0x1B6B, 0x1B73}, {0x1B80, 0x1B82}, {0x1BA1, 0x1BAD}, - {0x1BE6, 0x1BF3}, {0x1C24, 0x1C37}, {0x1CD0, 0x1CD2}, - {0x1CD4, 0x1CE8}, {0x1CED, 0x1CED}, {0x1CF2, 0x1CF4}, - {0x1CF8, 0x1CF9}, {0x1DC0, 0x1DF5}, {0x1DFB, 0x1DFF}, - {0x20D0, 0x20F0}, {0x2CEF, 0x2CF1}, {0x2D7F, 0x2D7F}, - {0x2DE0, 0x2DFF}, {0x302A, 0x302F}, {0x3099, 0x309A}, - {0xA66F, 0xA672}, {0xA674, 0xA67D}, {0xA69E, 0xA69F}, - {0xA6F0, 0xA6F1}, {0xA802, 0xA802}, {0xA806, 0xA806}, - {0xA80B, 0xA80B}, {0xA823, 0xA827}, {0xA880, 0xA881}, - {0xA8B4, 0xA8C5}, {0xA8E0, 0xA8F1}, {0xA926, 0xA92D}, - {0xA947, 0xA953}, {0xA980, 0xA983}, {0xA9B3, 0xA9C0}, - {0xA9E5, 0xA9E5}, {0xAA29, 0xAA36}, {0xAA43, 0xAA43}, - {0xAA4C, 0xAA4D}, {0xAA7B, 0xAA7D}, {0xAAB0, 0xAAB0}, - {0xAAB2, 0xAAB4}, {0xAAB7, 0xAAB8}, {0xAABE, 0xAABF}, - {0xAAC1, 0xAAC1}, {0xAAEB, 0xAAEF}, {0xAAF5, 0xAAF6}, - {0xABE3, 0xABEA}, {0xABEC, 0xABED}, {0xFB1E, 0xFB1E}, - {0xFE00, 0xFE0F}, {0xFE20, 0xFE2F}, {0x101FD, 0x101FD}, - {0x102E0, 0x102E0}, {0x10376, 0x1037A}, {0x10A01, 0x10A03}, - {0x10A05, 0x10A06}, {0x10A0C, 0x10A0F}, {0x10A38, 0x10A3A}, - {0x10A3F, 0x10A3F}, {0x10AE5, 0x10AE6}, {0x11000, 0x11002}, - {0x11038, 0x11046}, {0x1107F, 0x11082}, {0x110B0, 0x110BA}, - {0x11100, 0x11102}, {0x11127, 0x11134}, {0x11173, 0x11173}, - {0x11180, 0x11182}, {0x111B3, 0x111C0}, {0x111CA, 0x111CC}, - {0x1122C, 0x11237}, {0x1123E, 0x1123E}, {0x112DF, 0x112EA}, - {0x11300, 0x11303}, {0x1133C, 0x1133C}, {0x1133E, 0x11344}, - {0x11347, 0x11348}, {0x1134B, 0x1134D}, {0x11357, 0x11357}, - {0x11362, 0x11363}, {0x11366, 0x1136C}, {0x11370, 0x11374}, - {0x11435, 0x11446}, {0x114B0, 0x114C3}, {0x115AF, 0x115B5}, - {0x115B8, 0x115C0}, {0x115DC, 0x115DD}, {0x11630, 0x11640}, - {0x116AB, 0x116B7}, {0x1171D, 0x1172B}, {0x11C2F, 0x11C36}, - {0x11C38, 0x11C3F}, {0x11C92, 0x11CA7}, {0x11CA9, 0x11CB6}, - {0x16AF0, 0x16AF4}, {0x16B30, 0x16B36}, {0x16F51, 0x16F7E}, - {0x16F8F, 0x16F92}, {0x1BC9D, 0x1BC9E}, {0x1D165, 0x1D169}, - {0x1D16D, 0x1D172}, {0x1D17B, 0x1D182}, {0x1D185, 0x1D18B}, - {0x1D1AA, 0x1D1AD}, {0x1D242, 0x1D244}, {0x1DA00, 0x1DA36}, - {0x1DA3B, 0x1DA6C}, {0x1DA75, 0x1DA75}, {0x1DA84, 0x1DA84}, - {0x1DA9B, 0x1DA9F}, {0x1DAA1, 0x1DAAF}, {0x1E000, 0x1E006}, - {0x1E008, 0x1E018}, {0x1E01B, 0x1E021}, {0x1E023, 0x1E024}, - {0x1E026, 0x1E02A}, {0x1E8D0, 0x1E8D6}, {0x1E944, 0x1E94A}, - {0xE0100, 0xE01EF}, -} - -var doublewidth = table{ - {0x1100, 0x115F}, {0x231A, 0x231B}, {0x2329, 0x232A}, - {0x23E9, 0x23EC}, {0x23F0, 0x23F0}, {0x23F3, 0x23F3}, - {0x25FD, 0x25FE}, {0x2614, 0x2615}, {0x2648, 0x2653}, - {0x267F, 0x267F}, {0x2693, 0x2693}, {0x26A1, 0x26A1}, - {0x26AA, 0x26AB}, {0x26BD, 0x26BE}, {0x26C4, 0x26C5}, - {0x26CE, 0x26CE}, {0x26D4, 0x26D4}, {0x26EA, 0x26EA}, - {0x26F2, 0x26F3}, {0x26F5, 0x26F5}, {0x26FA, 0x26FA}, - {0x26FD, 0x26FD}, {0x2705, 0x2705}, {0x270A, 0x270B}, - {0x2728, 0x2728}, {0x274C, 0x274C}, {0x274E, 0x274E}, - {0x2753, 0x2755}, {0x2757, 0x2757}, {0x2795, 0x2797}, - {0x27B0, 0x27B0}, {0x27BF, 0x27BF}, {0x2B1B, 0x2B1C}, - {0x2B50, 0x2B50}, {0x2B55, 0x2B55}, {0x2E80, 0x2E99}, - {0x2E9B, 0x2EF3}, {0x2F00, 0x2FD5}, {0x2FF0, 0x2FFB}, - {0x3000, 0x303E}, {0x3041, 0x3096}, {0x3099, 0x30FF}, - {0x3105, 0x312D}, {0x3131, 0x318E}, {0x3190, 0x31BA}, - {0x31C0, 0x31E3}, {0x31F0, 0x321E}, {0x3220, 0x3247}, - {0x3250, 0x32FE}, {0x3300, 0x4DBF}, {0x4E00, 0xA48C}, - {0xA490, 0xA4C6}, {0xA960, 0xA97C}, {0xAC00, 0xD7A3}, - {0xF900, 0xFAFF}, {0xFE10, 0xFE19}, {0xFE30, 0xFE52}, - {0xFE54, 0xFE66}, {0xFE68, 0xFE6B}, {0xFF01, 0xFF60}, - {0xFFE0, 0xFFE6}, {0x16FE0, 0x16FE0}, {0x17000, 0x187EC}, - {0x18800, 0x18AF2}, {0x1B000, 0x1B001}, {0x1F004, 0x1F004}, - {0x1F0CF, 0x1F0CF}, {0x1F18E, 0x1F18E}, {0x1F191, 0x1F19A}, - {0x1F200, 0x1F202}, {0x1F210, 0x1F23B}, {0x1F240, 0x1F248}, - {0x1F250, 0x1F251}, {0x1F300, 0x1F320}, {0x1F32D, 0x1F335}, - {0x1F337, 0x1F37C}, {0x1F37E, 0x1F393}, {0x1F3A0, 0x1F3CA}, - {0x1F3CF, 0x1F3D3}, {0x1F3E0, 0x1F3F0}, {0x1F3F4, 0x1F3F4}, - {0x1F3F8, 0x1F43E}, {0x1F440, 0x1F440}, {0x1F442, 0x1F4FC}, - {0x1F4FF, 0x1F53D}, {0x1F54B, 0x1F54E}, {0x1F550, 0x1F567}, - {0x1F57A, 0x1F57A}, {0x1F595, 0x1F596}, {0x1F5A4, 0x1F5A4}, - {0x1F5FB, 0x1F64F}, {0x1F680, 0x1F6C5}, {0x1F6CC, 0x1F6CC}, - {0x1F6D0, 0x1F6D2}, {0x1F6EB, 0x1F6EC}, {0x1F6F4, 0x1F6F6}, - {0x1F910, 0x1F91E}, {0x1F920, 0x1F927}, {0x1F930, 0x1F930}, - {0x1F933, 0x1F93E}, {0x1F940, 0x1F94B}, {0x1F950, 0x1F95E}, - {0x1F980, 0x1F991}, {0x1F9C0, 0x1F9C0}, {0x20000, 0x2FFFD}, - {0x30000, 0x3FFFD}, -} - -var ambiguous = table{ - {0x00A1, 0x00A1}, {0x00A4, 0x00A4}, {0x00A7, 0x00A8}, - {0x00AA, 0x00AA}, {0x00AD, 0x00AE}, {0x00B0, 0x00B4}, - {0x00B6, 0x00BA}, {0x00BC, 0x00BF}, {0x00C6, 0x00C6}, - {0x00D0, 0x00D0}, {0x00D7, 0x00D8}, {0x00DE, 0x00E1}, - {0x00E6, 0x00E6}, {0x00E8, 0x00EA}, {0x00EC, 0x00ED}, - {0x00F0, 0x00F0}, {0x00F2, 0x00F3}, {0x00F7, 0x00FA}, - {0x00FC, 0x00FC}, {0x00FE, 0x00FE}, {0x0101, 0x0101}, - {0x0111, 0x0111}, {0x0113, 0x0113}, {0x011B, 0x011B}, - {0x0126, 0x0127}, {0x012B, 0x012B}, {0x0131, 0x0133}, - {0x0138, 0x0138}, {0x013F, 0x0142}, {0x0144, 0x0144}, - {0x0148, 0x014B}, {0x014D, 0x014D}, {0x0152, 0x0153}, - {0x0166, 0x0167}, {0x016B, 0x016B}, {0x01CE, 0x01CE}, - {0x01D0, 0x01D0}, {0x01D2, 0x01D2}, {0x01D4, 0x01D4}, - {0x01D6, 0x01D6}, {0x01D8, 0x01D8}, {0x01DA, 0x01DA}, - {0x01DC, 0x01DC}, {0x0251, 0x0251}, {0x0261, 0x0261}, - {0x02C4, 0x02C4}, {0x02C7, 0x02C7}, {0x02C9, 0x02CB}, - {0x02CD, 0x02CD}, {0x02D0, 0x02D0}, {0x02D8, 0x02DB}, - {0x02DD, 0x02DD}, {0x02DF, 0x02DF}, {0x0300, 0x036F}, - {0x0391, 0x03A1}, {0x03A3, 0x03A9}, {0x03B1, 0x03C1}, - {0x03C3, 0x03C9}, {0x0401, 0x0401}, {0x0410, 0x044F}, - {0x0451, 0x0451}, {0x2010, 0x2010}, {0x2013, 0x2016}, - {0x2018, 0x2019}, {0x201C, 0x201D}, {0x2020, 0x2022}, - {0x2024, 0x2027}, {0x2030, 0x2030}, {0x2032, 0x2033}, - {0x2035, 0x2035}, {0x203B, 0x203B}, {0x203E, 0x203E}, - {0x2074, 0x2074}, {0x207F, 0x207F}, {0x2081, 0x2084}, - {0x20AC, 0x20AC}, {0x2103, 0x2103}, {0x2105, 0x2105}, - {0x2109, 0x2109}, {0x2113, 0x2113}, {0x2116, 0x2116}, - {0x2121, 0x2122}, {0x2126, 0x2126}, {0x212B, 0x212B}, - {0x2153, 0x2154}, {0x215B, 0x215E}, {0x2160, 0x216B}, - {0x2170, 0x2179}, {0x2189, 0x2189}, {0x2190, 0x2199}, - {0x21B8, 0x21B9}, {0x21D2, 0x21D2}, {0x21D4, 0x21D4}, - {0x21E7, 0x21E7}, {0x2200, 0x2200}, {0x2202, 0x2203}, - {0x2207, 0x2208}, {0x220B, 0x220B}, {0x220F, 0x220F}, - {0x2211, 0x2211}, {0x2215, 0x2215}, {0x221A, 0x221A}, - {0x221D, 0x2220}, {0x2223, 0x2223}, {0x2225, 0x2225}, - {0x2227, 0x222C}, {0x222E, 0x222E}, {0x2234, 0x2237}, - {0x223C, 0x223D}, {0x2248, 0x2248}, {0x224C, 0x224C}, - {0x2252, 0x2252}, {0x2260, 0x2261}, {0x2264, 0x2267}, - {0x226A, 0x226B}, {0x226E, 0x226F}, {0x2282, 0x2283}, - {0x2286, 0x2287}, {0x2295, 0x2295}, {0x2299, 0x2299}, - {0x22A5, 0x22A5}, {0x22BF, 0x22BF}, {0x2312, 0x2312}, - {0x2460, 0x24E9}, {0x24EB, 0x254B}, {0x2550, 0x2573}, - {0x2580, 0x258F}, {0x2592, 0x2595}, {0x25A0, 0x25A1}, - {0x25A3, 0x25A9}, {0x25B2, 0x25B3}, {0x25B6, 0x25B7}, - {0x25BC, 0x25BD}, {0x25C0, 0x25C1}, {0x25C6, 0x25C8}, - {0x25CB, 0x25CB}, {0x25CE, 0x25D1}, {0x25E2, 0x25E5}, - {0x25EF, 0x25EF}, {0x2605, 0x2606}, {0x2609, 0x2609}, - {0x260E, 0x260F}, {0x261C, 0x261C}, {0x261E, 0x261E}, - {0x2640, 0x2640}, {0x2642, 0x2642}, {0x2660, 0x2661}, - {0x2663, 0x2665}, {0x2667, 0x266A}, {0x266C, 0x266D}, - {0x266F, 0x266F}, {0x269E, 0x269F}, {0x26BF, 0x26BF}, - {0x26C6, 0x26CD}, {0x26CF, 0x26D3}, {0x26D5, 0x26E1}, - {0x26E3, 0x26E3}, {0x26E8, 0x26E9}, {0x26EB, 0x26F1}, - {0x26F4, 0x26F4}, {0x26F6, 0x26F9}, {0x26FB, 0x26FC}, - {0x26FE, 0x26FF}, {0x273D, 0x273D}, {0x2776, 0x277F}, - {0x2B56, 0x2B59}, {0x3248, 0x324F}, {0xE000, 0xF8FF}, - {0xFE00, 0xFE0F}, {0xFFFD, 0xFFFD}, {0x1F100, 0x1F10A}, - {0x1F110, 0x1F12D}, {0x1F130, 0x1F169}, {0x1F170, 0x1F18D}, - {0x1F18F, 0x1F190}, {0x1F19B, 0x1F1AC}, {0xE0100, 0xE01EF}, - {0xF0000, 0xFFFFD}, {0x100000, 0x10FFFD}, -} - -var emoji = table{ - {0x1F1E6, 0x1F1FF}, {0x1F321, 0x1F321}, {0x1F324, 0x1F32C}, - {0x1F336, 0x1F336}, {0x1F37D, 0x1F37D}, {0x1F396, 0x1F397}, - {0x1F399, 0x1F39B}, {0x1F39E, 0x1F39F}, {0x1F3CB, 0x1F3CE}, - {0x1F3D4, 0x1F3DF}, {0x1F3F3, 0x1F3F5}, {0x1F3F7, 0x1F3F7}, - {0x1F43F, 0x1F43F}, {0x1F441, 0x1F441}, {0x1F4FD, 0x1F4FD}, - {0x1F549, 0x1F54A}, {0x1F56F, 0x1F570}, {0x1F573, 0x1F579}, - {0x1F587, 0x1F587}, {0x1F58A, 0x1F58D}, {0x1F590, 0x1F590}, - {0x1F5A5, 0x1F5A5}, {0x1F5A8, 0x1F5A8}, {0x1F5B1, 0x1F5B2}, - {0x1F5BC, 0x1F5BC}, {0x1F5C2, 0x1F5C4}, {0x1F5D1, 0x1F5D3}, - {0x1F5DC, 0x1F5DE}, {0x1F5E1, 0x1F5E1}, {0x1F5E3, 0x1F5E3}, - {0x1F5E8, 0x1F5E8}, {0x1F5EF, 0x1F5EF}, {0x1F5F3, 0x1F5F3}, - {0x1F5FA, 0x1F5FA}, {0x1F6CB, 0x1F6CF}, {0x1F6E0, 0x1F6E5}, - {0x1F6E9, 0x1F6E9}, {0x1F6F0, 0x1F6F0}, {0x1F6F3, 0x1F6F3}, -} - -var notassigned = table{ - {0x0378, 0x0379}, {0x0380, 0x0383}, {0x038B, 0x038B}, - {0x038D, 0x038D}, {0x03A2, 0x03A2}, {0x0530, 0x0530}, - {0x0557, 0x0558}, {0x0560, 0x0560}, {0x0588, 0x0588}, - {0x058B, 0x058C}, {0x0590, 0x0590}, {0x05C8, 0x05CF}, - {0x05EB, 0x05EF}, {0x05F5, 0x05FF}, {0x061D, 0x061D}, - {0x070E, 0x070E}, {0x074B, 0x074C}, {0x07B2, 0x07BF}, - {0x07FB, 0x07FF}, {0x082E, 0x082F}, {0x083F, 0x083F}, - {0x085C, 0x085D}, {0x085F, 0x089F}, {0x08B5, 0x08B5}, - {0x08BE, 0x08D3}, {0x0984, 0x0984}, {0x098D, 0x098E}, - {0x0991, 0x0992}, {0x09A9, 0x09A9}, {0x09B1, 0x09B1}, - {0x09B3, 0x09B5}, {0x09BA, 0x09BB}, {0x09C5, 0x09C6}, - {0x09C9, 0x09CA}, {0x09CF, 0x09D6}, {0x09D8, 0x09DB}, - {0x09DE, 0x09DE}, {0x09E4, 0x09E5}, {0x09FC, 0x0A00}, - {0x0A04, 0x0A04}, {0x0A0B, 0x0A0E}, {0x0A11, 0x0A12}, - {0x0A29, 0x0A29}, {0x0A31, 0x0A31}, {0x0A34, 0x0A34}, - {0x0A37, 0x0A37}, {0x0A3A, 0x0A3B}, {0x0A3D, 0x0A3D}, - {0x0A43, 0x0A46}, {0x0A49, 0x0A4A}, {0x0A4E, 0x0A50}, - {0x0A52, 0x0A58}, {0x0A5D, 0x0A5D}, {0x0A5F, 0x0A65}, - {0x0A76, 0x0A80}, {0x0A84, 0x0A84}, {0x0A8E, 0x0A8E}, - {0x0A92, 0x0A92}, {0x0AA9, 0x0AA9}, {0x0AB1, 0x0AB1}, - {0x0AB4, 0x0AB4}, {0x0ABA, 0x0ABB}, {0x0AC6, 0x0AC6}, - {0x0ACA, 0x0ACA}, {0x0ACE, 0x0ACF}, {0x0AD1, 0x0ADF}, - {0x0AE4, 0x0AE5}, {0x0AF2, 0x0AF8}, {0x0AFA, 0x0B00}, - {0x0B04, 0x0B04}, {0x0B0D, 0x0B0E}, {0x0B11, 0x0B12}, - {0x0B29, 0x0B29}, {0x0B31, 0x0B31}, {0x0B34, 0x0B34}, - {0x0B3A, 0x0B3B}, {0x0B45, 0x0B46}, {0x0B49, 0x0B4A}, - {0x0B4E, 0x0B55}, {0x0B58, 0x0B5B}, {0x0B5E, 0x0B5E}, - {0x0B64, 0x0B65}, {0x0B78, 0x0B81}, {0x0B84, 0x0B84}, - {0x0B8B, 0x0B8D}, {0x0B91, 0x0B91}, {0x0B96, 0x0B98}, - {0x0B9B, 0x0B9B}, {0x0B9D, 0x0B9D}, {0x0BA0, 0x0BA2}, - {0x0BA5, 0x0BA7}, {0x0BAB, 0x0BAD}, {0x0BBA, 0x0BBD}, - {0x0BC3, 0x0BC5}, {0x0BC9, 0x0BC9}, {0x0BCE, 0x0BCF}, - {0x0BD1, 0x0BD6}, {0x0BD8, 0x0BE5}, {0x0BFB, 0x0BFF}, - {0x0C04, 0x0C04}, {0x0C0D, 0x0C0D}, {0x0C11, 0x0C11}, - {0x0C29, 0x0C29}, {0x0C3A, 0x0C3C}, {0x0C45, 0x0C45}, - {0x0C49, 0x0C49}, {0x0C4E, 0x0C54}, {0x0C57, 0x0C57}, - {0x0C5B, 0x0C5F}, {0x0C64, 0x0C65}, {0x0C70, 0x0C77}, - {0x0C84, 0x0C84}, {0x0C8D, 0x0C8D}, {0x0C91, 0x0C91}, - {0x0CA9, 0x0CA9}, {0x0CB4, 0x0CB4}, {0x0CBA, 0x0CBB}, - {0x0CC5, 0x0CC5}, {0x0CC9, 0x0CC9}, {0x0CCE, 0x0CD4}, - {0x0CD7, 0x0CDD}, {0x0CDF, 0x0CDF}, {0x0CE4, 0x0CE5}, - {0x0CF0, 0x0CF0}, {0x0CF3, 0x0D00}, {0x0D04, 0x0D04}, - {0x0D0D, 0x0D0D}, {0x0D11, 0x0D11}, {0x0D3B, 0x0D3C}, - {0x0D45, 0x0D45}, {0x0D49, 0x0D49}, {0x0D50, 0x0D53}, - {0x0D64, 0x0D65}, {0x0D80, 0x0D81}, {0x0D84, 0x0D84}, - {0x0D97, 0x0D99}, {0x0DB2, 0x0DB2}, {0x0DBC, 0x0DBC}, - {0x0DBE, 0x0DBF}, {0x0DC7, 0x0DC9}, {0x0DCB, 0x0DCE}, - {0x0DD5, 0x0DD5}, {0x0DD7, 0x0DD7}, {0x0DE0, 0x0DE5}, - {0x0DF0, 0x0DF1}, {0x0DF5, 0x0E00}, {0x0E3B, 0x0E3E}, - {0x0E5C, 0x0E80}, {0x0E83, 0x0E83}, {0x0E85, 0x0E86}, - {0x0E89, 0x0E89}, {0x0E8B, 0x0E8C}, {0x0E8E, 0x0E93}, - {0x0E98, 0x0E98}, {0x0EA0, 0x0EA0}, {0x0EA4, 0x0EA4}, - {0x0EA6, 0x0EA6}, {0x0EA8, 0x0EA9}, {0x0EAC, 0x0EAC}, - {0x0EBA, 0x0EBA}, {0x0EBE, 0x0EBF}, {0x0EC5, 0x0EC5}, - {0x0EC7, 0x0EC7}, {0x0ECE, 0x0ECF}, {0x0EDA, 0x0EDB}, - {0x0EE0, 0x0EFF}, {0x0F48, 0x0F48}, {0x0F6D, 0x0F70}, - {0x0F98, 0x0F98}, {0x0FBD, 0x0FBD}, {0x0FCD, 0x0FCD}, - {0x0FDB, 0x0FFF}, {0x10C6, 0x10C6}, {0x10C8, 0x10CC}, - {0x10CE, 0x10CF}, {0x1249, 0x1249}, {0x124E, 0x124F}, - {0x1257, 0x1257}, {0x1259, 0x1259}, {0x125E, 0x125F}, - {0x1289, 0x1289}, {0x128E, 0x128F}, {0x12B1, 0x12B1}, - {0x12B6, 0x12B7}, {0x12BF, 0x12BF}, {0x12C1, 0x12C1}, - {0x12C6, 0x12C7}, {0x12D7, 0x12D7}, {0x1311, 0x1311}, - {0x1316, 0x1317}, {0x135B, 0x135C}, {0x137D, 0x137F}, - {0x139A, 0x139F}, {0x13F6, 0x13F7}, {0x13FE, 0x13FF}, - {0x169D, 0x169F}, {0x16F9, 0x16FF}, {0x170D, 0x170D}, - {0x1715, 0x171F}, {0x1737, 0x173F}, {0x1754, 0x175F}, - {0x176D, 0x176D}, {0x1771, 0x1771}, {0x1774, 0x177F}, - {0x17DE, 0x17DF}, {0x17EA, 0x17EF}, {0x17FA, 0x17FF}, - {0x180F, 0x180F}, {0x181A, 0x181F}, {0x1878, 0x187F}, - {0x18AB, 0x18AF}, {0x18F6, 0x18FF}, {0x191F, 0x191F}, - {0x192C, 0x192F}, {0x193C, 0x193F}, {0x1941, 0x1943}, - {0x196E, 0x196F}, {0x1975, 0x197F}, {0x19AC, 0x19AF}, - {0x19CA, 0x19CF}, {0x19DB, 0x19DD}, {0x1A1C, 0x1A1D}, - {0x1A5F, 0x1A5F}, {0x1A7D, 0x1A7E}, {0x1A8A, 0x1A8F}, - {0x1A9A, 0x1A9F}, {0x1AAE, 0x1AAF}, {0x1ABF, 0x1AFF}, - {0x1B4C, 0x1B4F}, {0x1B7D, 0x1B7F}, {0x1BF4, 0x1BFB}, - {0x1C38, 0x1C3A}, {0x1C4A, 0x1C4C}, {0x1C89, 0x1CBF}, - {0x1CC8, 0x1CCF}, {0x1CF7, 0x1CF7}, {0x1CFA, 0x1CFF}, - {0x1DF6, 0x1DFA}, {0x1F16, 0x1F17}, {0x1F1E, 0x1F1F}, - {0x1F46, 0x1F47}, {0x1F4E, 0x1F4F}, {0x1F58, 0x1F58}, - {0x1F5A, 0x1F5A}, {0x1F5C, 0x1F5C}, {0x1F5E, 0x1F5E}, - {0x1F7E, 0x1F7F}, {0x1FB5, 0x1FB5}, {0x1FC5, 0x1FC5}, - {0x1FD4, 0x1FD5}, {0x1FDC, 0x1FDC}, {0x1FF0, 0x1FF1}, - {0x1FF5, 0x1FF5}, {0x1FFF, 0x1FFF}, {0x2065, 0x2065}, - {0x2072, 0x2073}, {0x208F, 0x208F}, {0x209D, 0x209F}, - {0x20BF, 0x20CF}, {0x20F1, 0x20FF}, {0x218C, 0x218F}, - {0x23FF, 0x23FF}, {0x2427, 0x243F}, {0x244B, 0x245F}, - {0x2B74, 0x2B75}, {0x2B96, 0x2B97}, {0x2BBA, 0x2BBC}, - {0x2BC9, 0x2BC9}, {0x2BD2, 0x2BEB}, {0x2BF0, 0x2BFF}, - {0x2C2F, 0x2C2F}, {0x2C5F, 0x2C5F}, {0x2CF4, 0x2CF8}, - {0x2D26, 0x2D26}, {0x2D28, 0x2D2C}, {0x2D2E, 0x2D2F}, - {0x2D68, 0x2D6E}, {0x2D71, 0x2D7E}, {0x2D97, 0x2D9F}, - {0x2DA7, 0x2DA7}, {0x2DAF, 0x2DAF}, {0x2DB7, 0x2DB7}, - {0x2DBF, 0x2DBF}, {0x2DC7, 0x2DC7}, {0x2DCF, 0x2DCF}, - {0x2DD7, 0x2DD7}, {0x2DDF, 0x2DDF}, {0x2E45, 0x2E7F}, - {0x2E9A, 0x2E9A}, {0x2EF4, 0x2EFF}, {0x2FD6, 0x2FEF}, - {0x2FFC, 0x2FFF}, {0x3040, 0x3040}, {0x3097, 0x3098}, - {0x3100, 0x3104}, {0x312E, 0x3130}, {0x318F, 0x318F}, - {0x31BB, 0x31BF}, {0x31E4, 0x31EF}, {0x321F, 0x321F}, - {0x32FF, 0x32FF}, {0x4DB6, 0x4DBF}, {0x9FD6, 0x9FFF}, - {0xA48D, 0xA48F}, {0xA4C7, 0xA4CF}, {0xA62C, 0xA63F}, - {0xA6F8, 0xA6FF}, {0xA7AF, 0xA7AF}, {0xA7B8, 0xA7F6}, - {0xA82C, 0xA82F}, {0xA83A, 0xA83F}, {0xA878, 0xA87F}, - {0xA8C6, 0xA8CD}, {0xA8DA, 0xA8DF}, {0xA8FE, 0xA8FF}, - {0xA954, 0xA95E}, {0xA97D, 0xA97F}, {0xA9CE, 0xA9CE}, - {0xA9DA, 0xA9DD}, {0xA9FF, 0xA9FF}, {0xAA37, 0xAA3F}, - {0xAA4E, 0xAA4F}, {0xAA5A, 0xAA5B}, {0xAAC3, 0xAADA}, - {0xAAF7, 0xAB00}, {0xAB07, 0xAB08}, {0xAB0F, 0xAB10}, - {0xAB17, 0xAB1F}, {0xAB27, 0xAB27}, {0xAB2F, 0xAB2F}, - {0xAB66, 0xAB6F}, {0xABEE, 0xABEF}, {0xABFA, 0xABFF}, - {0xD7A4, 0xD7AF}, {0xD7C7, 0xD7CA}, {0xD7FC, 0xD7FF}, - {0xFA6E, 0xFA6F}, {0xFADA, 0xFAFF}, {0xFB07, 0xFB12}, - {0xFB18, 0xFB1C}, {0xFB37, 0xFB37}, {0xFB3D, 0xFB3D}, - {0xFB3F, 0xFB3F}, {0xFB42, 0xFB42}, {0xFB45, 0xFB45}, - {0xFBC2, 0xFBD2}, {0xFD40, 0xFD4F}, {0xFD90, 0xFD91}, - {0xFDC8, 0xFDEF}, {0xFDFE, 0xFDFF}, {0xFE1A, 0xFE1F}, - {0xFE53, 0xFE53}, {0xFE67, 0xFE67}, {0xFE6C, 0xFE6F}, - {0xFE75, 0xFE75}, {0xFEFD, 0xFEFE}, {0xFF00, 0xFF00}, - {0xFFBF, 0xFFC1}, {0xFFC8, 0xFFC9}, {0xFFD0, 0xFFD1}, - {0xFFD8, 0xFFD9}, {0xFFDD, 0xFFDF}, {0xFFE7, 0xFFE7}, - {0xFFEF, 0xFFF8}, {0xFFFE, 0xFFFF}, {0x1000C, 0x1000C}, - {0x10027, 0x10027}, {0x1003B, 0x1003B}, {0x1003E, 0x1003E}, - {0x1004E, 0x1004F}, {0x1005E, 0x1007F}, {0x100FB, 0x100FF}, - {0x10103, 0x10106}, {0x10134, 0x10136}, {0x1018F, 0x1018F}, - {0x1019C, 0x1019F}, {0x101A1, 0x101CF}, {0x101FE, 0x1027F}, - {0x1029D, 0x1029F}, {0x102D1, 0x102DF}, {0x102FC, 0x102FF}, - {0x10324, 0x1032F}, {0x1034B, 0x1034F}, {0x1037B, 0x1037F}, - {0x1039E, 0x1039E}, {0x103C4, 0x103C7}, {0x103D6, 0x103FF}, - {0x1049E, 0x1049F}, {0x104AA, 0x104AF}, {0x104D4, 0x104D7}, - {0x104FC, 0x104FF}, {0x10528, 0x1052F}, {0x10564, 0x1056E}, - {0x10570, 0x105FF}, {0x10737, 0x1073F}, {0x10756, 0x1075F}, - {0x10768, 0x107FF}, {0x10806, 0x10807}, {0x10809, 0x10809}, - {0x10836, 0x10836}, {0x10839, 0x1083B}, {0x1083D, 0x1083E}, - {0x10856, 0x10856}, {0x1089F, 0x108A6}, {0x108B0, 0x108DF}, - {0x108F3, 0x108F3}, {0x108F6, 0x108FA}, {0x1091C, 0x1091E}, - {0x1093A, 0x1093E}, {0x10940, 0x1097F}, {0x109B8, 0x109BB}, - {0x109D0, 0x109D1}, {0x10A04, 0x10A04}, {0x10A07, 0x10A0B}, - {0x10A14, 0x10A14}, {0x10A18, 0x10A18}, {0x10A34, 0x10A37}, - {0x10A3B, 0x10A3E}, {0x10A48, 0x10A4F}, {0x10A59, 0x10A5F}, - {0x10AA0, 0x10ABF}, {0x10AE7, 0x10AEA}, {0x10AF7, 0x10AFF}, - {0x10B36, 0x10B38}, {0x10B56, 0x10B57}, {0x10B73, 0x10B77}, - {0x10B92, 0x10B98}, {0x10B9D, 0x10BA8}, {0x10BB0, 0x10BFF}, - {0x10C49, 0x10C7F}, {0x10CB3, 0x10CBF}, {0x10CF3, 0x10CF9}, - {0x10D00, 0x10E5F}, {0x10E7F, 0x10FFF}, {0x1104E, 0x11051}, - {0x11070, 0x1107E}, {0x110C2, 0x110CF}, {0x110E9, 0x110EF}, - {0x110FA, 0x110FF}, {0x11135, 0x11135}, {0x11144, 0x1114F}, - {0x11177, 0x1117F}, {0x111CE, 0x111CF}, {0x111E0, 0x111E0}, - {0x111F5, 0x111FF}, {0x11212, 0x11212}, {0x1123F, 0x1127F}, - {0x11287, 0x11287}, {0x11289, 0x11289}, {0x1128E, 0x1128E}, - {0x1129E, 0x1129E}, {0x112AA, 0x112AF}, {0x112EB, 0x112EF}, - {0x112FA, 0x112FF}, {0x11304, 0x11304}, {0x1130D, 0x1130E}, - {0x11311, 0x11312}, {0x11329, 0x11329}, {0x11331, 0x11331}, - {0x11334, 0x11334}, {0x1133A, 0x1133B}, {0x11345, 0x11346}, - {0x11349, 0x1134A}, {0x1134E, 0x1134F}, {0x11351, 0x11356}, - {0x11358, 0x1135C}, {0x11364, 0x11365}, {0x1136D, 0x1136F}, - {0x11375, 0x113FF}, {0x1145A, 0x1145A}, {0x1145C, 0x1145C}, - {0x1145E, 0x1147F}, {0x114C8, 0x114CF}, {0x114DA, 0x1157F}, - {0x115B6, 0x115B7}, {0x115DE, 0x115FF}, {0x11645, 0x1164F}, - {0x1165A, 0x1165F}, {0x1166D, 0x1167F}, {0x116B8, 0x116BF}, - {0x116CA, 0x116FF}, {0x1171A, 0x1171C}, {0x1172C, 0x1172F}, - {0x11740, 0x1189F}, {0x118F3, 0x118FE}, {0x11900, 0x11ABF}, - {0x11AF9, 0x11BFF}, {0x11C09, 0x11C09}, {0x11C37, 0x11C37}, - {0x11C46, 0x11C4F}, {0x11C6D, 0x11C6F}, {0x11C90, 0x11C91}, - {0x11CA8, 0x11CA8}, {0x11CB7, 0x11FFF}, {0x1239A, 0x123FF}, - {0x1246F, 0x1246F}, {0x12475, 0x1247F}, {0x12544, 0x12FFF}, - {0x1342F, 0x143FF}, {0x14647, 0x167FF}, {0x16A39, 0x16A3F}, - {0x16A5F, 0x16A5F}, {0x16A6A, 0x16A6D}, {0x16A70, 0x16ACF}, - {0x16AEE, 0x16AEF}, {0x16AF6, 0x16AFF}, {0x16B46, 0x16B4F}, - {0x16B5A, 0x16B5A}, {0x16B62, 0x16B62}, {0x16B78, 0x16B7C}, - {0x16B90, 0x16EFF}, {0x16F45, 0x16F4F}, {0x16F7F, 0x16F8E}, - {0x16FA0, 0x16FDF}, {0x16FE1, 0x16FFF}, {0x187ED, 0x187FF}, - {0x18AF3, 0x1AFFF}, {0x1B002, 0x1BBFF}, {0x1BC6B, 0x1BC6F}, - {0x1BC7D, 0x1BC7F}, {0x1BC89, 0x1BC8F}, {0x1BC9A, 0x1BC9B}, - {0x1BCA4, 0x1CFFF}, {0x1D0F6, 0x1D0FF}, {0x1D127, 0x1D128}, - {0x1D1E9, 0x1D1FF}, {0x1D246, 0x1D2FF}, {0x1D357, 0x1D35F}, - {0x1D372, 0x1D3FF}, {0x1D455, 0x1D455}, {0x1D49D, 0x1D49D}, - {0x1D4A0, 0x1D4A1}, {0x1D4A3, 0x1D4A4}, {0x1D4A7, 0x1D4A8}, - {0x1D4AD, 0x1D4AD}, {0x1D4BA, 0x1D4BA}, {0x1D4BC, 0x1D4BC}, - {0x1D4C4, 0x1D4C4}, {0x1D506, 0x1D506}, {0x1D50B, 0x1D50C}, - {0x1D515, 0x1D515}, {0x1D51D, 0x1D51D}, {0x1D53A, 0x1D53A}, - {0x1D53F, 0x1D53F}, {0x1D545, 0x1D545}, {0x1D547, 0x1D549}, - {0x1D551, 0x1D551}, {0x1D6A6, 0x1D6A7}, {0x1D7CC, 0x1D7CD}, - {0x1DA8C, 0x1DA9A}, {0x1DAA0, 0x1DAA0}, {0x1DAB0, 0x1DFFF}, - {0x1E007, 0x1E007}, {0x1E019, 0x1E01A}, {0x1E022, 0x1E022}, - {0x1E025, 0x1E025}, {0x1E02B, 0x1E7FF}, {0x1E8C5, 0x1E8C6}, - {0x1E8D7, 0x1E8FF}, {0x1E94B, 0x1E94F}, {0x1E95A, 0x1E95D}, - {0x1E960, 0x1EDFF}, {0x1EE04, 0x1EE04}, {0x1EE20, 0x1EE20}, - {0x1EE23, 0x1EE23}, {0x1EE25, 0x1EE26}, {0x1EE28, 0x1EE28}, - {0x1EE33, 0x1EE33}, {0x1EE38, 0x1EE38}, {0x1EE3A, 0x1EE3A}, - {0x1EE3C, 0x1EE41}, {0x1EE43, 0x1EE46}, {0x1EE48, 0x1EE48}, - {0x1EE4A, 0x1EE4A}, {0x1EE4C, 0x1EE4C}, {0x1EE50, 0x1EE50}, - {0x1EE53, 0x1EE53}, {0x1EE55, 0x1EE56}, {0x1EE58, 0x1EE58}, - {0x1EE5A, 0x1EE5A}, {0x1EE5C, 0x1EE5C}, {0x1EE5E, 0x1EE5E}, - {0x1EE60, 0x1EE60}, {0x1EE63, 0x1EE63}, {0x1EE65, 0x1EE66}, - {0x1EE6B, 0x1EE6B}, {0x1EE73, 0x1EE73}, {0x1EE78, 0x1EE78}, - {0x1EE7D, 0x1EE7D}, {0x1EE7F, 0x1EE7F}, {0x1EE8A, 0x1EE8A}, - {0x1EE9C, 0x1EEA0}, {0x1EEA4, 0x1EEA4}, {0x1EEAA, 0x1EEAA}, - {0x1EEBC, 0x1EEEF}, {0x1EEF2, 0x1EFFF}, {0x1F02C, 0x1F02F}, - {0x1F094, 0x1F09F}, {0x1F0AF, 0x1F0B0}, {0x1F0C0, 0x1F0C0}, - {0x1F0D0, 0x1F0D0}, {0x1F0F6, 0x1F0FF}, {0x1F10D, 0x1F10F}, - {0x1F12F, 0x1F12F}, {0x1F16C, 0x1F16F}, {0x1F1AD, 0x1F1E5}, - {0x1F203, 0x1F20F}, {0x1F23C, 0x1F23F}, {0x1F249, 0x1F24F}, - {0x1F252, 0x1F2FF}, {0x1F6D3, 0x1F6DF}, {0x1F6ED, 0x1F6EF}, - {0x1F6F7, 0x1F6FF}, {0x1F774, 0x1F77F}, {0x1F7D5, 0x1F7FF}, - {0x1F80C, 0x1F80F}, {0x1F848, 0x1F84F}, {0x1F85A, 0x1F85F}, - {0x1F888, 0x1F88F}, {0x1F8AE, 0x1F90F}, {0x1F91F, 0x1F91F}, - {0x1F928, 0x1F92F}, {0x1F931, 0x1F932}, {0x1F93F, 0x1F93F}, - {0x1F94C, 0x1F94F}, {0x1F95F, 0x1F97F}, {0x1F992, 0x1F9BF}, - {0x1F9C1, 0x1FFFF}, {0x2A6D7, 0x2A6FF}, {0x2B735, 0x2B73F}, - {0x2B81E, 0x2B81F}, {0x2CEA2, 0x2F7FF}, {0x2FA1E, 0xE0000}, - {0xE0002, 0xE001F}, {0xE0080, 0xE00FF}, {0xE01F0, 0xEFFFF}, - {0xFFFFE, 0xFFFFF}, -} - -var neutral = table{ - {0x0000, 0x001F}, {0x007F, 0x007F}, {0x0080, 0x009F}, - {0x00A0, 0x00A0}, {0x00A9, 0x00A9}, {0x00AB, 0x00AB}, - {0x00B5, 0x00B5}, {0x00BB, 0x00BB}, {0x00C0, 0x00C5}, - {0x00C7, 0x00CF}, {0x00D1, 0x00D6}, {0x00D9, 0x00DD}, - {0x00E2, 0x00E5}, {0x00E7, 0x00E7}, {0x00EB, 0x00EB}, - {0x00EE, 0x00EF}, {0x00F1, 0x00F1}, {0x00F4, 0x00F6}, - {0x00FB, 0x00FB}, {0x00FD, 0x00FD}, {0x00FF, 0x00FF}, - {0x0100, 0x0100}, {0x0102, 0x0110}, {0x0112, 0x0112}, - {0x0114, 0x011A}, {0x011C, 0x0125}, {0x0128, 0x012A}, - {0x012C, 0x0130}, {0x0134, 0x0137}, {0x0139, 0x013E}, - {0x0143, 0x0143}, {0x0145, 0x0147}, {0x014C, 0x014C}, - {0x014E, 0x0151}, {0x0154, 0x0165}, {0x0168, 0x016A}, - {0x016C, 0x017F}, {0x0180, 0x01BA}, {0x01BB, 0x01BB}, - {0x01BC, 0x01BF}, {0x01C0, 0x01C3}, {0x01C4, 0x01CD}, - {0x01CF, 0x01CF}, {0x01D1, 0x01D1}, {0x01D3, 0x01D3}, - {0x01D5, 0x01D5}, {0x01D7, 0x01D7}, {0x01D9, 0x01D9}, - {0x01DB, 0x01DB}, {0x01DD, 0x024F}, {0x0250, 0x0250}, - {0x0252, 0x0260}, {0x0262, 0x0293}, {0x0294, 0x0294}, - {0x0295, 0x02AF}, {0x02B0, 0x02C1}, {0x02C2, 0x02C3}, - {0x02C5, 0x02C5}, {0x02C6, 0x02C6}, {0x02C8, 0x02C8}, - {0x02CC, 0x02CC}, {0x02CE, 0x02CF}, {0x02D1, 0x02D1}, - {0x02D2, 0x02D7}, {0x02DC, 0x02DC}, {0x02DE, 0x02DE}, - {0x02E0, 0x02E4}, {0x02E5, 0x02EB}, {0x02EC, 0x02EC}, - {0x02ED, 0x02ED}, {0x02EE, 0x02EE}, {0x02EF, 0x02FF}, - {0x0370, 0x0373}, {0x0374, 0x0374}, {0x0375, 0x0375}, - {0x0376, 0x0377}, {0x037A, 0x037A}, {0x037B, 0x037D}, - {0x037E, 0x037E}, {0x037F, 0x037F}, {0x0384, 0x0385}, - {0x0386, 0x0386}, {0x0387, 0x0387}, {0x0388, 0x038A}, - {0x038C, 0x038C}, {0x038E, 0x0390}, {0x03AA, 0x03B0}, - {0x03C2, 0x03C2}, {0x03CA, 0x03F5}, {0x03F6, 0x03F6}, - {0x03F7, 0x03FF}, {0x0400, 0x0400}, {0x0402, 0x040F}, - {0x0450, 0x0450}, {0x0452, 0x0481}, {0x0482, 0x0482}, - {0x0483, 0x0487}, {0x0488, 0x0489}, {0x048A, 0x04FF}, - {0x0500, 0x052F}, {0x0531, 0x0556}, {0x0559, 0x0559}, - {0x055A, 0x055F}, {0x0561, 0x0587}, {0x0589, 0x0589}, - {0x058A, 0x058A}, {0x058D, 0x058E}, {0x058F, 0x058F}, - {0x0591, 0x05BD}, {0x05BE, 0x05BE}, {0x05BF, 0x05BF}, - {0x05C0, 0x05C0}, {0x05C1, 0x05C2}, {0x05C3, 0x05C3}, - {0x05C4, 0x05C5}, {0x05C6, 0x05C6}, {0x05C7, 0x05C7}, - {0x05D0, 0x05EA}, {0x05F0, 0x05F2}, {0x05F3, 0x05F4}, - {0x0600, 0x0605}, {0x0606, 0x0608}, {0x0609, 0x060A}, - {0x060B, 0x060B}, {0x060C, 0x060D}, {0x060E, 0x060F}, - {0x0610, 0x061A}, {0x061B, 0x061B}, {0x061C, 0x061C}, - {0x061E, 0x061F}, {0x0620, 0x063F}, {0x0640, 0x0640}, - {0x0641, 0x064A}, {0x064B, 0x065F}, {0x0660, 0x0669}, - {0x066A, 0x066D}, {0x066E, 0x066F}, {0x0670, 0x0670}, - {0x0671, 0x06D3}, {0x06D4, 0x06D4}, {0x06D5, 0x06D5}, - {0x06D6, 0x06DC}, {0x06DD, 0x06DD}, {0x06DE, 0x06DE}, - {0x06DF, 0x06E4}, {0x06E5, 0x06E6}, {0x06E7, 0x06E8}, - {0x06E9, 0x06E9}, {0x06EA, 0x06ED}, {0x06EE, 0x06EF}, - {0x06F0, 0x06F9}, {0x06FA, 0x06FC}, {0x06FD, 0x06FE}, - {0x06FF, 0x06FF}, {0x0700, 0x070D}, {0x070F, 0x070F}, - {0x0710, 0x0710}, {0x0711, 0x0711}, {0x0712, 0x072F}, - {0x0730, 0x074A}, {0x074D, 0x074F}, {0x0750, 0x077F}, - {0x0780, 0x07A5}, {0x07A6, 0x07B0}, {0x07B1, 0x07B1}, - {0x07C0, 0x07C9}, {0x07CA, 0x07EA}, {0x07EB, 0x07F3}, - {0x07F4, 0x07F5}, {0x07F6, 0x07F6}, {0x07F7, 0x07F9}, - {0x07FA, 0x07FA}, {0x0800, 0x0815}, {0x0816, 0x0819}, - {0x081A, 0x081A}, {0x081B, 0x0823}, {0x0824, 0x0824}, - {0x0825, 0x0827}, {0x0828, 0x0828}, {0x0829, 0x082D}, - {0x0830, 0x083E}, {0x0840, 0x0858}, {0x0859, 0x085B}, - {0x085E, 0x085E}, {0x08A0, 0x08B4}, {0x08B6, 0x08BD}, - {0x08D4, 0x08E1}, {0x08E2, 0x08E2}, {0x08E3, 0x08FF}, - {0x0900, 0x0902}, {0x0903, 0x0903}, {0x0904, 0x0939}, - {0x093A, 0x093A}, {0x093B, 0x093B}, {0x093C, 0x093C}, - {0x093D, 0x093D}, {0x093E, 0x0940}, {0x0941, 0x0948}, - {0x0949, 0x094C}, {0x094D, 0x094D}, {0x094E, 0x094F}, - {0x0950, 0x0950}, {0x0951, 0x0957}, {0x0958, 0x0961}, - {0x0962, 0x0963}, {0x0964, 0x0965}, {0x0966, 0x096F}, - {0x0970, 0x0970}, {0x0971, 0x0971}, {0x0972, 0x097F}, - {0x0980, 0x0980}, {0x0981, 0x0981}, {0x0982, 0x0983}, - {0x0985, 0x098C}, {0x098F, 0x0990}, {0x0993, 0x09A8}, - {0x09AA, 0x09B0}, {0x09B2, 0x09B2}, {0x09B6, 0x09B9}, - {0x09BC, 0x09BC}, {0x09BD, 0x09BD}, {0x09BE, 0x09C0}, - {0x09C1, 0x09C4}, {0x09C7, 0x09C8}, {0x09CB, 0x09CC}, - {0x09CD, 0x09CD}, {0x09CE, 0x09CE}, {0x09D7, 0x09D7}, - {0x09DC, 0x09DD}, {0x09DF, 0x09E1}, {0x09E2, 0x09E3}, - {0x09E6, 0x09EF}, {0x09F0, 0x09F1}, {0x09F2, 0x09F3}, - {0x09F4, 0x09F9}, {0x09FA, 0x09FA}, {0x09FB, 0x09FB}, - {0x0A01, 0x0A02}, {0x0A03, 0x0A03}, {0x0A05, 0x0A0A}, - {0x0A0F, 0x0A10}, {0x0A13, 0x0A28}, {0x0A2A, 0x0A30}, - {0x0A32, 0x0A33}, {0x0A35, 0x0A36}, {0x0A38, 0x0A39}, - {0x0A3C, 0x0A3C}, {0x0A3E, 0x0A40}, {0x0A41, 0x0A42}, - {0x0A47, 0x0A48}, {0x0A4B, 0x0A4D}, {0x0A51, 0x0A51}, - {0x0A59, 0x0A5C}, {0x0A5E, 0x0A5E}, {0x0A66, 0x0A6F}, - {0x0A70, 0x0A71}, {0x0A72, 0x0A74}, {0x0A75, 0x0A75}, - {0x0A81, 0x0A82}, {0x0A83, 0x0A83}, {0x0A85, 0x0A8D}, - {0x0A8F, 0x0A91}, {0x0A93, 0x0AA8}, {0x0AAA, 0x0AB0}, - {0x0AB2, 0x0AB3}, {0x0AB5, 0x0AB9}, {0x0ABC, 0x0ABC}, - {0x0ABD, 0x0ABD}, {0x0ABE, 0x0AC0}, {0x0AC1, 0x0AC5}, - {0x0AC7, 0x0AC8}, {0x0AC9, 0x0AC9}, {0x0ACB, 0x0ACC}, - {0x0ACD, 0x0ACD}, {0x0AD0, 0x0AD0}, {0x0AE0, 0x0AE1}, - {0x0AE2, 0x0AE3}, {0x0AE6, 0x0AEF}, {0x0AF0, 0x0AF0}, - {0x0AF1, 0x0AF1}, {0x0AF9, 0x0AF9}, {0x0B01, 0x0B01}, - {0x0B02, 0x0B03}, {0x0B05, 0x0B0C}, {0x0B0F, 0x0B10}, - {0x0B13, 0x0B28}, {0x0B2A, 0x0B30}, {0x0B32, 0x0B33}, - {0x0B35, 0x0B39}, {0x0B3C, 0x0B3C}, {0x0B3D, 0x0B3D}, - {0x0B3E, 0x0B3E}, {0x0B3F, 0x0B3F}, {0x0B40, 0x0B40}, - {0x0B41, 0x0B44}, {0x0B47, 0x0B48}, {0x0B4B, 0x0B4C}, - {0x0B4D, 0x0B4D}, {0x0B56, 0x0B56}, {0x0B57, 0x0B57}, - {0x0B5C, 0x0B5D}, {0x0B5F, 0x0B61}, {0x0B62, 0x0B63}, - {0x0B66, 0x0B6F}, {0x0B70, 0x0B70}, {0x0B71, 0x0B71}, - {0x0B72, 0x0B77}, {0x0B82, 0x0B82}, {0x0B83, 0x0B83}, - {0x0B85, 0x0B8A}, {0x0B8E, 0x0B90}, {0x0B92, 0x0B95}, - {0x0B99, 0x0B9A}, {0x0B9C, 0x0B9C}, {0x0B9E, 0x0B9F}, - {0x0BA3, 0x0BA4}, {0x0BA8, 0x0BAA}, {0x0BAE, 0x0BB9}, - {0x0BBE, 0x0BBF}, {0x0BC0, 0x0BC0}, {0x0BC1, 0x0BC2}, - {0x0BC6, 0x0BC8}, {0x0BCA, 0x0BCC}, {0x0BCD, 0x0BCD}, - {0x0BD0, 0x0BD0}, {0x0BD7, 0x0BD7}, {0x0BE6, 0x0BEF}, - {0x0BF0, 0x0BF2}, {0x0BF3, 0x0BF8}, {0x0BF9, 0x0BF9}, - {0x0BFA, 0x0BFA}, {0x0C00, 0x0C00}, {0x0C01, 0x0C03}, - {0x0C05, 0x0C0C}, {0x0C0E, 0x0C10}, {0x0C12, 0x0C28}, - {0x0C2A, 0x0C39}, {0x0C3D, 0x0C3D}, {0x0C3E, 0x0C40}, - {0x0C41, 0x0C44}, {0x0C46, 0x0C48}, {0x0C4A, 0x0C4D}, - {0x0C55, 0x0C56}, {0x0C58, 0x0C5A}, {0x0C60, 0x0C61}, - {0x0C62, 0x0C63}, {0x0C66, 0x0C6F}, {0x0C78, 0x0C7E}, - {0x0C7F, 0x0C7F}, {0x0C80, 0x0C80}, {0x0C81, 0x0C81}, - {0x0C82, 0x0C83}, {0x0C85, 0x0C8C}, {0x0C8E, 0x0C90}, - {0x0C92, 0x0CA8}, {0x0CAA, 0x0CB3}, {0x0CB5, 0x0CB9}, - {0x0CBC, 0x0CBC}, {0x0CBD, 0x0CBD}, {0x0CBE, 0x0CBE}, - {0x0CBF, 0x0CBF}, {0x0CC0, 0x0CC4}, {0x0CC6, 0x0CC6}, - {0x0CC7, 0x0CC8}, {0x0CCA, 0x0CCB}, {0x0CCC, 0x0CCD}, - {0x0CD5, 0x0CD6}, {0x0CDE, 0x0CDE}, {0x0CE0, 0x0CE1}, - {0x0CE2, 0x0CE3}, {0x0CE6, 0x0CEF}, {0x0CF1, 0x0CF2}, - {0x0D01, 0x0D01}, {0x0D02, 0x0D03}, {0x0D05, 0x0D0C}, - {0x0D0E, 0x0D10}, {0x0D12, 0x0D3A}, {0x0D3D, 0x0D3D}, - {0x0D3E, 0x0D40}, {0x0D41, 0x0D44}, {0x0D46, 0x0D48}, - {0x0D4A, 0x0D4C}, {0x0D4D, 0x0D4D}, {0x0D4E, 0x0D4E}, - {0x0D4F, 0x0D4F}, {0x0D54, 0x0D56}, {0x0D57, 0x0D57}, - {0x0D58, 0x0D5E}, {0x0D5F, 0x0D61}, {0x0D62, 0x0D63}, - {0x0D66, 0x0D6F}, {0x0D70, 0x0D78}, {0x0D79, 0x0D79}, - {0x0D7A, 0x0D7F}, {0x0D82, 0x0D83}, {0x0D85, 0x0D96}, - {0x0D9A, 0x0DB1}, {0x0DB3, 0x0DBB}, {0x0DBD, 0x0DBD}, - {0x0DC0, 0x0DC6}, {0x0DCA, 0x0DCA}, {0x0DCF, 0x0DD1}, - {0x0DD2, 0x0DD4}, {0x0DD6, 0x0DD6}, {0x0DD8, 0x0DDF}, - {0x0DE6, 0x0DEF}, {0x0DF2, 0x0DF3}, {0x0DF4, 0x0DF4}, - {0x0E01, 0x0E30}, {0x0E31, 0x0E31}, {0x0E32, 0x0E33}, - {0x0E34, 0x0E3A}, {0x0E3F, 0x0E3F}, {0x0E40, 0x0E45}, - {0x0E46, 0x0E46}, {0x0E47, 0x0E4E}, {0x0E4F, 0x0E4F}, - {0x0E50, 0x0E59}, {0x0E5A, 0x0E5B}, {0x0E81, 0x0E82}, - {0x0E84, 0x0E84}, {0x0E87, 0x0E88}, {0x0E8A, 0x0E8A}, - {0x0E8D, 0x0E8D}, {0x0E94, 0x0E97}, {0x0E99, 0x0E9F}, - {0x0EA1, 0x0EA3}, {0x0EA5, 0x0EA5}, {0x0EA7, 0x0EA7}, - {0x0EAA, 0x0EAB}, {0x0EAD, 0x0EB0}, {0x0EB1, 0x0EB1}, - {0x0EB2, 0x0EB3}, {0x0EB4, 0x0EB9}, {0x0EBB, 0x0EBC}, - {0x0EBD, 0x0EBD}, {0x0EC0, 0x0EC4}, {0x0EC6, 0x0EC6}, - {0x0EC8, 0x0ECD}, {0x0ED0, 0x0ED9}, {0x0EDC, 0x0EDF}, - {0x0F00, 0x0F00}, {0x0F01, 0x0F03}, {0x0F04, 0x0F12}, - {0x0F13, 0x0F13}, {0x0F14, 0x0F14}, {0x0F15, 0x0F17}, - {0x0F18, 0x0F19}, {0x0F1A, 0x0F1F}, {0x0F20, 0x0F29}, - {0x0F2A, 0x0F33}, {0x0F34, 0x0F34}, {0x0F35, 0x0F35}, - {0x0F36, 0x0F36}, {0x0F37, 0x0F37}, {0x0F38, 0x0F38}, - {0x0F39, 0x0F39}, {0x0F3A, 0x0F3A}, {0x0F3B, 0x0F3B}, - {0x0F3C, 0x0F3C}, {0x0F3D, 0x0F3D}, {0x0F3E, 0x0F3F}, - {0x0F40, 0x0F47}, {0x0F49, 0x0F6C}, {0x0F71, 0x0F7E}, - {0x0F7F, 0x0F7F}, {0x0F80, 0x0F84}, {0x0F85, 0x0F85}, - {0x0F86, 0x0F87}, {0x0F88, 0x0F8C}, {0x0F8D, 0x0F97}, - {0x0F99, 0x0FBC}, {0x0FBE, 0x0FC5}, {0x0FC6, 0x0FC6}, - {0x0FC7, 0x0FCC}, {0x0FCE, 0x0FCF}, {0x0FD0, 0x0FD4}, - {0x0FD5, 0x0FD8}, {0x0FD9, 0x0FDA}, {0x1000, 0x102A}, - {0x102B, 0x102C}, {0x102D, 0x1030}, {0x1031, 0x1031}, - {0x1032, 0x1037}, {0x1038, 0x1038}, {0x1039, 0x103A}, - {0x103B, 0x103C}, {0x103D, 0x103E}, {0x103F, 0x103F}, - {0x1040, 0x1049}, {0x104A, 0x104F}, {0x1050, 0x1055}, - {0x1056, 0x1057}, {0x1058, 0x1059}, {0x105A, 0x105D}, - {0x105E, 0x1060}, {0x1061, 0x1061}, {0x1062, 0x1064}, - {0x1065, 0x1066}, {0x1067, 0x106D}, {0x106E, 0x1070}, - {0x1071, 0x1074}, {0x1075, 0x1081}, {0x1082, 0x1082}, - {0x1083, 0x1084}, {0x1085, 0x1086}, {0x1087, 0x108C}, - {0x108D, 0x108D}, {0x108E, 0x108E}, {0x108F, 0x108F}, - {0x1090, 0x1099}, {0x109A, 0x109C}, {0x109D, 0x109D}, - {0x109E, 0x109F}, {0x10A0, 0x10C5}, {0x10C7, 0x10C7}, - {0x10CD, 0x10CD}, {0x10D0, 0x10FA}, {0x10FB, 0x10FB}, - {0x10FC, 0x10FC}, {0x10FD, 0x10FF}, {0x1160, 0x11FF}, - {0x1200, 0x1248}, {0x124A, 0x124D}, {0x1250, 0x1256}, - {0x1258, 0x1258}, {0x125A, 0x125D}, {0x1260, 0x1288}, - {0x128A, 0x128D}, {0x1290, 0x12B0}, {0x12B2, 0x12B5}, - {0x12B8, 0x12BE}, {0x12C0, 0x12C0}, {0x12C2, 0x12C5}, - {0x12C8, 0x12D6}, {0x12D8, 0x1310}, {0x1312, 0x1315}, - {0x1318, 0x135A}, {0x135D, 0x135F}, {0x1360, 0x1368}, - {0x1369, 0x137C}, {0x1380, 0x138F}, {0x1390, 0x1399}, - {0x13A0, 0x13F5}, {0x13F8, 0x13FD}, {0x1400, 0x1400}, - {0x1401, 0x166C}, {0x166D, 0x166E}, {0x166F, 0x167F}, - {0x1680, 0x1680}, {0x1681, 0x169A}, {0x169B, 0x169B}, - {0x169C, 0x169C}, {0x16A0, 0x16EA}, {0x16EB, 0x16ED}, - {0x16EE, 0x16F0}, {0x16F1, 0x16F8}, {0x1700, 0x170C}, - {0x170E, 0x1711}, {0x1712, 0x1714}, {0x1720, 0x1731}, - {0x1732, 0x1734}, {0x1735, 0x1736}, {0x1740, 0x1751}, - {0x1752, 0x1753}, {0x1760, 0x176C}, {0x176E, 0x1770}, - {0x1772, 0x1773}, {0x1780, 0x17B3}, {0x17B4, 0x17B5}, - {0x17B6, 0x17B6}, {0x17B7, 0x17BD}, {0x17BE, 0x17C5}, - {0x17C6, 0x17C6}, {0x17C7, 0x17C8}, {0x17C9, 0x17D3}, - {0x17D4, 0x17D6}, {0x17D7, 0x17D7}, {0x17D8, 0x17DA}, - {0x17DB, 0x17DB}, {0x17DC, 0x17DC}, {0x17DD, 0x17DD}, - {0x17E0, 0x17E9}, {0x17F0, 0x17F9}, {0x1800, 0x1805}, - {0x1806, 0x1806}, {0x1807, 0x180A}, {0x180B, 0x180D}, - {0x180E, 0x180E}, {0x1810, 0x1819}, {0x1820, 0x1842}, - {0x1843, 0x1843}, {0x1844, 0x1877}, {0x1880, 0x1884}, - {0x1885, 0x1886}, {0x1887, 0x18A8}, {0x18A9, 0x18A9}, - {0x18AA, 0x18AA}, {0x18B0, 0x18F5}, {0x1900, 0x191E}, - {0x1920, 0x1922}, {0x1923, 0x1926}, {0x1927, 0x1928}, - {0x1929, 0x192B}, {0x1930, 0x1931}, {0x1932, 0x1932}, - {0x1933, 0x1938}, {0x1939, 0x193B}, {0x1940, 0x1940}, - {0x1944, 0x1945}, {0x1946, 0x194F}, {0x1950, 0x196D}, - {0x1970, 0x1974}, {0x1980, 0x19AB}, {0x19B0, 0x19C9}, - {0x19D0, 0x19D9}, {0x19DA, 0x19DA}, {0x19DE, 0x19DF}, - {0x19E0, 0x19FF}, {0x1A00, 0x1A16}, {0x1A17, 0x1A18}, - {0x1A19, 0x1A1A}, {0x1A1B, 0x1A1B}, {0x1A1E, 0x1A1F}, - {0x1A20, 0x1A54}, {0x1A55, 0x1A55}, {0x1A56, 0x1A56}, - {0x1A57, 0x1A57}, {0x1A58, 0x1A5E}, {0x1A60, 0x1A60}, - {0x1A61, 0x1A61}, {0x1A62, 0x1A62}, {0x1A63, 0x1A64}, - {0x1A65, 0x1A6C}, {0x1A6D, 0x1A72}, {0x1A73, 0x1A7C}, - {0x1A7F, 0x1A7F}, {0x1A80, 0x1A89}, {0x1A90, 0x1A99}, - {0x1AA0, 0x1AA6}, {0x1AA7, 0x1AA7}, {0x1AA8, 0x1AAD}, - {0x1AB0, 0x1ABD}, {0x1ABE, 0x1ABE}, {0x1B00, 0x1B03}, - {0x1B04, 0x1B04}, {0x1B05, 0x1B33}, {0x1B34, 0x1B34}, - {0x1B35, 0x1B35}, {0x1B36, 0x1B3A}, {0x1B3B, 0x1B3B}, - {0x1B3C, 0x1B3C}, {0x1B3D, 0x1B41}, {0x1B42, 0x1B42}, - {0x1B43, 0x1B44}, {0x1B45, 0x1B4B}, {0x1B50, 0x1B59}, - {0x1B5A, 0x1B60}, {0x1B61, 0x1B6A}, {0x1B6B, 0x1B73}, - {0x1B74, 0x1B7C}, {0x1B80, 0x1B81}, {0x1B82, 0x1B82}, - {0x1B83, 0x1BA0}, {0x1BA1, 0x1BA1}, {0x1BA2, 0x1BA5}, - {0x1BA6, 0x1BA7}, {0x1BA8, 0x1BA9}, {0x1BAA, 0x1BAA}, - {0x1BAB, 0x1BAD}, {0x1BAE, 0x1BAF}, {0x1BB0, 0x1BB9}, - {0x1BBA, 0x1BBF}, {0x1BC0, 0x1BE5}, {0x1BE6, 0x1BE6}, - {0x1BE7, 0x1BE7}, {0x1BE8, 0x1BE9}, {0x1BEA, 0x1BEC}, - {0x1BED, 0x1BED}, {0x1BEE, 0x1BEE}, {0x1BEF, 0x1BF1}, - {0x1BF2, 0x1BF3}, {0x1BFC, 0x1BFF}, {0x1C00, 0x1C23}, - {0x1C24, 0x1C2B}, {0x1C2C, 0x1C33}, {0x1C34, 0x1C35}, - {0x1C36, 0x1C37}, {0x1C3B, 0x1C3F}, {0x1C40, 0x1C49}, - {0x1C4D, 0x1C4F}, {0x1C50, 0x1C59}, {0x1C5A, 0x1C77}, - {0x1C78, 0x1C7D}, {0x1C7E, 0x1C7F}, {0x1C80, 0x1C88}, - {0x1CC0, 0x1CC7}, {0x1CD0, 0x1CD2}, {0x1CD3, 0x1CD3}, - {0x1CD4, 0x1CE0}, {0x1CE1, 0x1CE1}, {0x1CE2, 0x1CE8}, - {0x1CE9, 0x1CEC}, {0x1CED, 0x1CED}, {0x1CEE, 0x1CF1}, - {0x1CF2, 0x1CF3}, {0x1CF4, 0x1CF4}, {0x1CF5, 0x1CF6}, - {0x1CF8, 0x1CF9}, {0x1D00, 0x1D2B}, {0x1D2C, 0x1D6A}, - {0x1D6B, 0x1D77}, {0x1D78, 0x1D78}, {0x1D79, 0x1D7F}, - {0x1D80, 0x1D9A}, {0x1D9B, 0x1DBF}, {0x1DC0, 0x1DF5}, - {0x1DFB, 0x1DFF}, {0x1E00, 0x1EFF}, {0x1F00, 0x1F15}, - {0x1F18, 0x1F1D}, {0x1F20, 0x1F45}, {0x1F48, 0x1F4D}, - {0x1F50, 0x1F57}, {0x1F59, 0x1F59}, {0x1F5B, 0x1F5B}, - {0x1F5D, 0x1F5D}, {0x1F5F, 0x1F7D}, {0x1F80, 0x1FB4}, - {0x1FB6, 0x1FBC}, {0x1FBD, 0x1FBD}, {0x1FBE, 0x1FBE}, - {0x1FBF, 0x1FC1}, {0x1FC2, 0x1FC4}, {0x1FC6, 0x1FCC}, - {0x1FCD, 0x1FCF}, {0x1FD0, 0x1FD3}, {0x1FD6, 0x1FDB}, - {0x1FDD, 0x1FDF}, {0x1FE0, 0x1FEC}, {0x1FED, 0x1FEF}, - {0x1FF2, 0x1FF4}, {0x1FF6, 0x1FFC}, {0x1FFD, 0x1FFE}, - {0x2000, 0x200A}, {0x200B, 0x200F}, {0x2011, 0x2012}, - {0x2017, 0x2017}, {0x201A, 0x201A}, {0x201B, 0x201B}, - {0x201E, 0x201E}, {0x201F, 0x201F}, {0x2023, 0x2023}, - {0x2028, 0x2028}, {0x2029, 0x2029}, {0x202A, 0x202E}, - {0x202F, 0x202F}, {0x2031, 0x2031}, {0x2034, 0x2034}, - {0x2036, 0x2038}, {0x2039, 0x2039}, {0x203A, 0x203A}, - {0x203C, 0x203D}, {0x203F, 0x2040}, {0x2041, 0x2043}, - {0x2044, 0x2044}, {0x2045, 0x2045}, {0x2046, 0x2046}, - {0x2047, 0x2051}, {0x2052, 0x2052}, {0x2053, 0x2053}, - {0x2054, 0x2054}, {0x2055, 0x205E}, {0x205F, 0x205F}, - {0x2060, 0x2064}, {0x2066, 0x206F}, {0x2070, 0x2070}, - {0x2071, 0x2071}, {0x2075, 0x2079}, {0x207A, 0x207C}, - {0x207D, 0x207D}, {0x207E, 0x207E}, {0x2080, 0x2080}, - {0x2085, 0x2089}, {0x208A, 0x208C}, {0x208D, 0x208D}, - {0x208E, 0x208E}, {0x2090, 0x209C}, {0x20A0, 0x20A8}, - {0x20AA, 0x20AB}, {0x20AD, 0x20BE}, {0x20D0, 0x20DC}, - {0x20DD, 0x20E0}, {0x20E1, 0x20E1}, {0x20E2, 0x20E4}, - {0x20E5, 0x20F0}, {0x2100, 0x2101}, {0x2102, 0x2102}, - {0x2104, 0x2104}, {0x2106, 0x2106}, {0x2107, 0x2107}, - {0x2108, 0x2108}, {0x210A, 0x2112}, {0x2114, 0x2114}, - {0x2115, 0x2115}, {0x2117, 0x2117}, {0x2118, 0x2118}, - {0x2119, 0x211D}, {0x211E, 0x2120}, {0x2123, 0x2123}, - {0x2124, 0x2124}, {0x2125, 0x2125}, {0x2127, 0x2127}, - {0x2128, 0x2128}, {0x2129, 0x2129}, {0x212A, 0x212A}, - {0x212C, 0x212D}, {0x212E, 0x212E}, {0x212F, 0x2134}, - {0x2135, 0x2138}, {0x2139, 0x2139}, {0x213A, 0x213B}, - {0x213C, 0x213F}, {0x2140, 0x2144}, {0x2145, 0x2149}, - {0x214A, 0x214A}, {0x214B, 0x214B}, {0x214C, 0x214D}, - {0x214E, 0x214E}, {0x214F, 0x214F}, {0x2150, 0x2152}, - {0x2155, 0x215A}, {0x215F, 0x215F}, {0x216C, 0x216F}, - {0x217A, 0x2182}, {0x2183, 0x2184}, {0x2185, 0x2188}, - {0x218A, 0x218B}, {0x219A, 0x219B}, {0x219C, 0x219F}, - {0x21A0, 0x21A0}, {0x21A1, 0x21A2}, {0x21A3, 0x21A3}, - {0x21A4, 0x21A5}, {0x21A6, 0x21A6}, {0x21A7, 0x21AD}, - {0x21AE, 0x21AE}, {0x21AF, 0x21B7}, {0x21BA, 0x21CD}, - {0x21CE, 0x21CF}, {0x21D0, 0x21D1}, {0x21D3, 0x21D3}, - {0x21D5, 0x21E6}, {0x21E8, 0x21F3}, {0x21F4, 0x21FF}, - {0x2201, 0x2201}, {0x2204, 0x2206}, {0x2209, 0x220A}, - {0x220C, 0x220E}, {0x2210, 0x2210}, {0x2212, 0x2214}, - {0x2216, 0x2219}, {0x221B, 0x221C}, {0x2221, 0x2222}, - {0x2224, 0x2224}, {0x2226, 0x2226}, {0x222D, 0x222D}, - {0x222F, 0x2233}, {0x2238, 0x223B}, {0x223E, 0x2247}, - {0x2249, 0x224B}, {0x224D, 0x2251}, {0x2253, 0x225F}, - {0x2262, 0x2263}, {0x2268, 0x2269}, {0x226C, 0x226D}, - {0x2270, 0x2281}, {0x2284, 0x2285}, {0x2288, 0x2294}, - {0x2296, 0x2298}, {0x229A, 0x22A4}, {0x22A6, 0x22BE}, - {0x22C0, 0x22FF}, {0x2300, 0x2307}, {0x2308, 0x2308}, - {0x2309, 0x2309}, {0x230A, 0x230A}, {0x230B, 0x230B}, - {0x230C, 0x2311}, {0x2313, 0x2319}, {0x231C, 0x231F}, - {0x2320, 0x2321}, {0x2322, 0x2328}, {0x232B, 0x237B}, - {0x237C, 0x237C}, {0x237D, 0x239A}, {0x239B, 0x23B3}, - {0x23B4, 0x23DB}, {0x23DC, 0x23E1}, {0x23E2, 0x23E8}, - {0x23ED, 0x23EF}, {0x23F1, 0x23F2}, {0x23F4, 0x23FE}, - {0x2400, 0x2426}, {0x2440, 0x244A}, {0x24EA, 0x24EA}, - {0x254C, 0x254F}, {0x2574, 0x257F}, {0x2590, 0x2591}, - {0x2596, 0x259F}, {0x25A2, 0x25A2}, {0x25AA, 0x25B1}, - {0x25B4, 0x25B5}, {0x25B8, 0x25BB}, {0x25BE, 0x25BF}, - {0x25C2, 0x25C5}, {0x25C9, 0x25CA}, {0x25CC, 0x25CD}, - {0x25D2, 0x25E1}, {0x25E6, 0x25EE}, {0x25F0, 0x25F7}, - {0x25F8, 0x25FC}, {0x25FF, 0x25FF}, {0x2600, 0x2604}, - {0x2607, 0x2608}, {0x260A, 0x260D}, {0x2610, 0x2613}, - {0x2616, 0x261B}, {0x261D, 0x261D}, {0x261F, 0x263F}, - {0x2641, 0x2641}, {0x2643, 0x2647}, {0x2654, 0x265F}, - {0x2662, 0x2662}, {0x2666, 0x2666}, {0x266B, 0x266B}, - {0x266E, 0x266E}, {0x2670, 0x267E}, {0x2680, 0x2692}, - {0x2694, 0x269D}, {0x26A0, 0x26A0}, {0x26A2, 0x26A9}, - {0x26AC, 0x26BC}, {0x26C0, 0x26C3}, {0x26E2, 0x26E2}, - {0x26E4, 0x26E7}, {0x2700, 0x2704}, {0x2706, 0x2709}, - {0x270C, 0x2727}, {0x2729, 0x273C}, {0x273E, 0x274B}, - {0x274D, 0x274D}, {0x274F, 0x2752}, {0x2756, 0x2756}, - {0x2758, 0x2767}, {0x2768, 0x2768}, {0x2769, 0x2769}, - {0x276A, 0x276A}, {0x276B, 0x276B}, {0x276C, 0x276C}, - {0x276D, 0x276D}, {0x276E, 0x276E}, {0x276F, 0x276F}, - {0x2770, 0x2770}, {0x2771, 0x2771}, {0x2772, 0x2772}, - {0x2773, 0x2773}, {0x2774, 0x2774}, {0x2775, 0x2775}, - {0x2780, 0x2793}, {0x2794, 0x2794}, {0x2798, 0x27AF}, - {0x27B1, 0x27BE}, {0x27C0, 0x27C4}, {0x27C5, 0x27C5}, - {0x27C6, 0x27C6}, {0x27C7, 0x27E5}, {0x27EE, 0x27EE}, - {0x27EF, 0x27EF}, {0x27F0, 0x27FF}, {0x2800, 0x28FF}, - {0x2900, 0x297F}, {0x2980, 0x2982}, {0x2983, 0x2983}, - {0x2984, 0x2984}, {0x2987, 0x2987}, {0x2988, 0x2988}, - {0x2989, 0x2989}, {0x298A, 0x298A}, {0x298B, 0x298B}, - {0x298C, 0x298C}, {0x298D, 0x298D}, {0x298E, 0x298E}, - {0x298F, 0x298F}, {0x2990, 0x2990}, {0x2991, 0x2991}, - {0x2992, 0x2992}, {0x2993, 0x2993}, {0x2994, 0x2994}, - {0x2995, 0x2995}, {0x2996, 0x2996}, {0x2997, 0x2997}, - {0x2998, 0x2998}, {0x2999, 0x29D7}, {0x29D8, 0x29D8}, - {0x29D9, 0x29D9}, {0x29DA, 0x29DA}, {0x29DB, 0x29DB}, - {0x29DC, 0x29FB}, {0x29FC, 0x29FC}, {0x29FD, 0x29FD}, - {0x29FE, 0x29FF}, {0x2A00, 0x2AFF}, {0x2B00, 0x2B1A}, - {0x2B1D, 0x2B2F}, {0x2B30, 0x2B44}, {0x2B45, 0x2B46}, - {0x2B47, 0x2B4C}, {0x2B4D, 0x2B4F}, {0x2B51, 0x2B54}, - {0x2B5A, 0x2B73}, {0x2B76, 0x2B95}, {0x2B98, 0x2BB9}, - {0x2BBD, 0x2BC8}, {0x2BCA, 0x2BD1}, {0x2BEC, 0x2BEF}, - {0x2C00, 0x2C2E}, {0x2C30, 0x2C5E}, {0x2C60, 0x2C7B}, - {0x2C7C, 0x2C7D}, {0x2C7E, 0x2C7F}, {0x2C80, 0x2CE4}, - {0x2CE5, 0x2CEA}, {0x2CEB, 0x2CEE}, {0x2CEF, 0x2CF1}, - {0x2CF2, 0x2CF3}, {0x2CF9, 0x2CFC}, {0x2CFD, 0x2CFD}, - {0x2CFE, 0x2CFF}, {0x2D00, 0x2D25}, {0x2D27, 0x2D27}, - {0x2D2D, 0x2D2D}, {0x2D30, 0x2D67}, {0x2D6F, 0x2D6F}, - {0x2D70, 0x2D70}, {0x2D7F, 0x2D7F}, {0x2D80, 0x2D96}, - {0x2DA0, 0x2DA6}, {0x2DA8, 0x2DAE}, {0x2DB0, 0x2DB6}, - {0x2DB8, 0x2DBE}, {0x2DC0, 0x2DC6}, {0x2DC8, 0x2DCE}, - {0x2DD0, 0x2DD6}, {0x2DD8, 0x2DDE}, {0x2DE0, 0x2DFF}, - {0x2E00, 0x2E01}, {0x2E02, 0x2E02}, {0x2E03, 0x2E03}, - {0x2E04, 0x2E04}, {0x2E05, 0x2E05}, {0x2E06, 0x2E08}, - {0x2E09, 0x2E09}, {0x2E0A, 0x2E0A}, {0x2E0B, 0x2E0B}, - {0x2E0C, 0x2E0C}, {0x2E0D, 0x2E0D}, {0x2E0E, 0x2E16}, - {0x2E17, 0x2E17}, {0x2E18, 0x2E19}, {0x2E1A, 0x2E1A}, - {0x2E1B, 0x2E1B}, {0x2E1C, 0x2E1C}, {0x2E1D, 0x2E1D}, - {0x2E1E, 0x2E1F}, {0x2E20, 0x2E20}, {0x2E21, 0x2E21}, - {0x2E22, 0x2E22}, {0x2E23, 0x2E23}, {0x2E24, 0x2E24}, - {0x2E25, 0x2E25}, {0x2E26, 0x2E26}, {0x2E27, 0x2E27}, - {0x2E28, 0x2E28}, {0x2E29, 0x2E29}, {0x2E2A, 0x2E2E}, - {0x2E2F, 0x2E2F}, {0x2E30, 0x2E39}, {0x2E3A, 0x2E3B}, - {0x2E3C, 0x2E3F}, {0x2E40, 0x2E40}, {0x2E41, 0x2E41}, - {0x2E42, 0x2E42}, {0x2E43, 0x2E44}, {0x303F, 0x303F}, - {0x4DC0, 0x4DFF}, {0xA4D0, 0xA4F7}, {0xA4F8, 0xA4FD}, - {0xA4FE, 0xA4FF}, {0xA500, 0xA60B}, {0xA60C, 0xA60C}, - {0xA60D, 0xA60F}, {0xA610, 0xA61F}, {0xA620, 0xA629}, - {0xA62A, 0xA62B}, {0xA640, 0xA66D}, {0xA66E, 0xA66E}, - {0xA66F, 0xA66F}, {0xA670, 0xA672}, {0xA673, 0xA673}, - {0xA674, 0xA67D}, {0xA67E, 0xA67E}, {0xA67F, 0xA67F}, - {0xA680, 0xA69B}, {0xA69C, 0xA69D}, {0xA69E, 0xA69F}, - {0xA6A0, 0xA6E5}, {0xA6E6, 0xA6EF}, {0xA6F0, 0xA6F1}, - {0xA6F2, 0xA6F7}, {0xA700, 0xA716}, {0xA717, 0xA71F}, - {0xA720, 0xA721}, {0xA722, 0xA76F}, {0xA770, 0xA770}, - {0xA771, 0xA787}, {0xA788, 0xA788}, {0xA789, 0xA78A}, - {0xA78B, 0xA78E}, {0xA78F, 0xA78F}, {0xA790, 0xA7AE}, - {0xA7B0, 0xA7B7}, {0xA7F7, 0xA7F7}, {0xA7F8, 0xA7F9}, - {0xA7FA, 0xA7FA}, {0xA7FB, 0xA7FF}, {0xA800, 0xA801}, - {0xA802, 0xA802}, {0xA803, 0xA805}, {0xA806, 0xA806}, - {0xA807, 0xA80A}, {0xA80B, 0xA80B}, {0xA80C, 0xA822}, - {0xA823, 0xA824}, {0xA825, 0xA826}, {0xA827, 0xA827}, - {0xA828, 0xA82B}, {0xA830, 0xA835}, {0xA836, 0xA837}, - {0xA838, 0xA838}, {0xA839, 0xA839}, {0xA840, 0xA873}, - {0xA874, 0xA877}, {0xA880, 0xA881}, {0xA882, 0xA8B3}, - {0xA8B4, 0xA8C3}, {0xA8C4, 0xA8C5}, {0xA8CE, 0xA8CF}, - {0xA8D0, 0xA8D9}, {0xA8E0, 0xA8F1}, {0xA8F2, 0xA8F7}, - {0xA8F8, 0xA8FA}, {0xA8FB, 0xA8FB}, {0xA8FC, 0xA8FC}, - {0xA8FD, 0xA8FD}, {0xA900, 0xA909}, {0xA90A, 0xA925}, - {0xA926, 0xA92D}, {0xA92E, 0xA92F}, {0xA930, 0xA946}, - {0xA947, 0xA951}, {0xA952, 0xA953}, {0xA95F, 0xA95F}, - {0xA980, 0xA982}, {0xA983, 0xA983}, {0xA984, 0xA9B2}, - {0xA9B3, 0xA9B3}, {0xA9B4, 0xA9B5}, {0xA9B6, 0xA9B9}, - {0xA9BA, 0xA9BB}, {0xA9BC, 0xA9BC}, {0xA9BD, 0xA9C0}, - {0xA9C1, 0xA9CD}, {0xA9CF, 0xA9CF}, {0xA9D0, 0xA9D9}, - {0xA9DE, 0xA9DF}, {0xA9E0, 0xA9E4}, {0xA9E5, 0xA9E5}, - {0xA9E6, 0xA9E6}, {0xA9E7, 0xA9EF}, {0xA9F0, 0xA9F9}, - {0xA9FA, 0xA9FE}, {0xAA00, 0xAA28}, {0xAA29, 0xAA2E}, - {0xAA2F, 0xAA30}, {0xAA31, 0xAA32}, {0xAA33, 0xAA34}, - {0xAA35, 0xAA36}, {0xAA40, 0xAA42}, {0xAA43, 0xAA43}, - {0xAA44, 0xAA4B}, {0xAA4C, 0xAA4C}, {0xAA4D, 0xAA4D}, - {0xAA50, 0xAA59}, {0xAA5C, 0xAA5F}, {0xAA60, 0xAA6F}, - {0xAA70, 0xAA70}, {0xAA71, 0xAA76}, {0xAA77, 0xAA79}, - {0xAA7A, 0xAA7A}, {0xAA7B, 0xAA7B}, {0xAA7C, 0xAA7C}, - {0xAA7D, 0xAA7D}, {0xAA7E, 0xAA7F}, {0xAA80, 0xAAAF}, - {0xAAB0, 0xAAB0}, {0xAAB1, 0xAAB1}, {0xAAB2, 0xAAB4}, - {0xAAB5, 0xAAB6}, {0xAAB7, 0xAAB8}, {0xAAB9, 0xAABD}, - {0xAABE, 0xAABF}, {0xAAC0, 0xAAC0}, {0xAAC1, 0xAAC1}, - {0xAAC2, 0xAAC2}, {0xAADB, 0xAADC}, {0xAADD, 0xAADD}, - {0xAADE, 0xAADF}, {0xAAE0, 0xAAEA}, {0xAAEB, 0xAAEB}, - {0xAAEC, 0xAAED}, {0xAAEE, 0xAAEF}, {0xAAF0, 0xAAF1}, - {0xAAF2, 0xAAF2}, {0xAAF3, 0xAAF4}, {0xAAF5, 0xAAF5}, - {0xAAF6, 0xAAF6}, {0xAB01, 0xAB06}, {0xAB09, 0xAB0E}, - {0xAB11, 0xAB16}, {0xAB20, 0xAB26}, {0xAB28, 0xAB2E}, - {0xAB30, 0xAB5A}, {0xAB5B, 0xAB5B}, {0xAB5C, 0xAB5F}, - {0xAB60, 0xAB65}, {0xAB70, 0xABBF}, {0xABC0, 0xABE2}, - {0xABE3, 0xABE4}, {0xABE5, 0xABE5}, {0xABE6, 0xABE7}, - {0xABE8, 0xABE8}, {0xABE9, 0xABEA}, {0xABEB, 0xABEB}, - {0xABEC, 0xABEC}, {0xABED, 0xABED}, {0xABF0, 0xABF9}, - {0xD7B0, 0xD7C6}, {0xD7CB, 0xD7FB}, {0xD800, 0xDB7F}, - {0xDB80, 0xDBFF}, {0xDC00, 0xDFFF}, {0xFB00, 0xFB06}, - {0xFB13, 0xFB17}, {0xFB1D, 0xFB1D}, {0xFB1E, 0xFB1E}, - {0xFB1F, 0xFB28}, {0xFB29, 0xFB29}, {0xFB2A, 0xFB36}, - {0xFB38, 0xFB3C}, {0xFB3E, 0xFB3E}, {0xFB40, 0xFB41}, - {0xFB43, 0xFB44}, {0xFB46, 0xFB4F}, {0xFB50, 0xFBB1}, - {0xFBB2, 0xFBC1}, {0xFBD3, 0xFD3D}, {0xFD3E, 0xFD3E}, - {0xFD3F, 0xFD3F}, {0xFD50, 0xFD8F}, {0xFD92, 0xFDC7}, - {0xFDF0, 0xFDFB}, {0xFDFC, 0xFDFC}, {0xFDFD, 0xFDFD}, - {0xFE20, 0xFE2F}, {0xFE70, 0xFE74}, {0xFE76, 0xFEFC}, - {0xFEFF, 0xFEFF}, {0xFFF9, 0xFFFB}, {0xFFFC, 0xFFFC}, - {0x10000, 0x1000B}, {0x1000D, 0x10026}, {0x10028, 0x1003A}, - {0x1003C, 0x1003D}, {0x1003F, 0x1004D}, {0x10050, 0x1005D}, - {0x10080, 0x100FA}, {0x10100, 0x10102}, {0x10107, 0x10133}, - {0x10137, 0x1013F}, {0x10140, 0x10174}, {0x10175, 0x10178}, - {0x10179, 0x10189}, {0x1018A, 0x1018B}, {0x1018C, 0x1018E}, - {0x10190, 0x1019B}, {0x101A0, 0x101A0}, {0x101D0, 0x101FC}, - {0x101FD, 0x101FD}, {0x10280, 0x1029C}, {0x102A0, 0x102D0}, - {0x102E0, 0x102E0}, {0x102E1, 0x102FB}, {0x10300, 0x1031F}, - {0x10320, 0x10323}, {0x10330, 0x10340}, {0x10341, 0x10341}, - {0x10342, 0x10349}, {0x1034A, 0x1034A}, {0x10350, 0x10375}, - {0x10376, 0x1037A}, {0x10380, 0x1039D}, {0x1039F, 0x1039F}, - {0x103A0, 0x103C3}, {0x103C8, 0x103CF}, {0x103D0, 0x103D0}, - {0x103D1, 0x103D5}, {0x10400, 0x1044F}, {0x10450, 0x1047F}, - {0x10480, 0x1049D}, {0x104A0, 0x104A9}, {0x104B0, 0x104D3}, - {0x104D8, 0x104FB}, {0x10500, 0x10527}, {0x10530, 0x10563}, - {0x1056F, 0x1056F}, {0x10600, 0x10736}, {0x10740, 0x10755}, - {0x10760, 0x10767}, {0x10800, 0x10805}, {0x10808, 0x10808}, - {0x1080A, 0x10835}, {0x10837, 0x10838}, {0x1083C, 0x1083C}, - {0x1083F, 0x1083F}, {0x10840, 0x10855}, {0x10857, 0x10857}, - {0x10858, 0x1085F}, {0x10860, 0x10876}, {0x10877, 0x10878}, - {0x10879, 0x1087F}, {0x10880, 0x1089E}, {0x108A7, 0x108AF}, - {0x108E0, 0x108F2}, {0x108F4, 0x108F5}, {0x108FB, 0x108FF}, - {0x10900, 0x10915}, {0x10916, 0x1091B}, {0x1091F, 0x1091F}, - {0x10920, 0x10939}, {0x1093F, 0x1093F}, {0x10980, 0x1099F}, - {0x109A0, 0x109B7}, {0x109BC, 0x109BD}, {0x109BE, 0x109BF}, - {0x109C0, 0x109CF}, {0x109D2, 0x109FF}, {0x10A00, 0x10A00}, - {0x10A01, 0x10A03}, {0x10A05, 0x10A06}, {0x10A0C, 0x10A0F}, - {0x10A10, 0x10A13}, {0x10A15, 0x10A17}, {0x10A19, 0x10A33}, - {0x10A38, 0x10A3A}, {0x10A3F, 0x10A3F}, {0x10A40, 0x10A47}, - {0x10A50, 0x10A58}, {0x10A60, 0x10A7C}, {0x10A7D, 0x10A7E}, - {0x10A7F, 0x10A7F}, {0x10A80, 0x10A9C}, {0x10A9D, 0x10A9F}, - {0x10AC0, 0x10AC7}, {0x10AC8, 0x10AC8}, {0x10AC9, 0x10AE4}, - {0x10AE5, 0x10AE6}, {0x10AEB, 0x10AEF}, {0x10AF0, 0x10AF6}, - {0x10B00, 0x10B35}, {0x10B39, 0x10B3F}, {0x10B40, 0x10B55}, - {0x10B58, 0x10B5F}, {0x10B60, 0x10B72}, {0x10B78, 0x10B7F}, - {0x10B80, 0x10B91}, {0x10B99, 0x10B9C}, {0x10BA9, 0x10BAF}, - {0x10C00, 0x10C48}, {0x10C80, 0x10CB2}, {0x10CC0, 0x10CF2}, - {0x10CFA, 0x10CFF}, {0x10E60, 0x10E7E}, {0x11000, 0x11000}, - {0x11001, 0x11001}, {0x11002, 0x11002}, {0x11003, 0x11037}, - {0x11038, 0x11046}, {0x11047, 0x1104D}, {0x11052, 0x11065}, - {0x11066, 0x1106F}, {0x1107F, 0x1107F}, {0x11080, 0x11081}, - {0x11082, 0x11082}, {0x11083, 0x110AF}, {0x110B0, 0x110B2}, - {0x110B3, 0x110B6}, {0x110B7, 0x110B8}, {0x110B9, 0x110BA}, - {0x110BB, 0x110BC}, {0x110BD, 0x110BD}, {0x110BE, 0x110C1}, - {0x110D0, 0x110E8}, {0x110F0, 0x110F9}, {0x11100, 0x11102}, - {0x11103, 0x11126}, {0x11127, 0x1112B}, {0x1112C, 0x1112C}, - {0x1112D, 0x11134}, {0x11136, 0x1113F}, {0x11140, 0x11143}, - {0x11150, 0x11172}, {0x11173, 0x11173}, {0x11174, 0x11175}, - {0x11176, 0x11176}, {0x11180, 0x11181}, {0x11182, 0x11182}, - {0x11183, 0x111B2}, {0x111B3, 0x111B5}, {0x111B6, 0x111BE}, - {0x111BF, 0x111C0}, {0x111C1, 0x111C4}, {0x111C5, 0x111C9}, - {0x111CA, 0x111CC}, {0x111CD, 0x111CD}, {0x111D0, 0x111D9}, - {0x111DA, 0x111DA}, {0x111DB, 0x111DB}, {0x111DC, 0x111DC}, - {0x111DD, 0x111DF}, {0x111E1, 0x111F4}, {0x11200, 0x11211}, - {0x11213, 0x1122B}, {0x1122C, 0x1122E}, {0x1122F, 0x11231}, - {0x11232, 0x11233}, {0x11234, 0x11234}, {0x11235, 0x11235}, - {0x11236, 0x11237}, {0x11238, 0x1123D}, {0x1123E, 0x1123E}, - {0x11280, 0x11286}, {0x11288, 0x11288}, {0x1128A, 0x1128D}, - {0x1128F, 0x1129D}, {0x1129F, 0x112A8}, {0x112A9, 0x112A9}, - {0x112B0, 0x112DE}, {0x112DF, 0x112DF}, {0x112E0, 0x112E2}, - {0x112E3, 0x112EA}, {0x112F0, 0x112F9}, {0x11300, 0x11301}, - {0x11302, 0x11303}, {0x11305, 0x1130C}, {0x1130F, 0x11310}, - {0x11313, 0x11328}, {0x1132A, 0x11330}, {0x11332, 0x11333}, - {0x11335, 0x11339}, {0x1133C, 0x1133C}, {0x1133D, 0x1133D}, - {0x1133E, 0x1133F}, {0x11340, 0x11340}, {0x11341, 0x11344}, - {0x11347, 0x11348}, {0x1134B, 0x1134D}, {0x11350, 0x11350}, - {0x11357, 0x11357}, {0x1135D, 0x11361}, {0x11362, 0x11363}, - {0x11366, 0x1136C}, {0x11370, 0x11374}, {0x11400, 0x11434}, - {0x11435, 0x11437}, {0x11438, 0x1143F}, {0x11440, 0x11441}, - {0x11442, 0x11444}, {0x11445, 0x11445}, {0x11446, 0x11446}, - {0x11447, 0x1144A}, {0x1144B, 0x1144F}, {0x11450, 0x11459}, - {0x1145B, 0x1145B}, {0x1145D, 0x1145D}, {0x11480, 0x114AF}, - {0x114B0, 0x114B2}, {0x114B3, 0x114B8}, {0x114B9, 0x114B9}, - {0x114BA, 0x114BA}, {0x114BB, 0x114BE}, {0x114BF, 0x114C0}, - {0x114C1, 0x114C1}, {0x114C2, 0x114C3}, {0x114C4, 0x114C5}, - {0x114C6, 0x114C6}, {0x114C7, 0x114C7}, {0x114D0, 0x114D9}, - {0x11580, 0x115AE}, {0x115AF, 0x115B1}, {0x115B2, 0x115B5}, - {0x115B8, 0x115BB}, {0x115BC, 0x115BD}, {0x115BE, 0x115BE}, - {0x115BF, 0x115C0}, {0x115C1, 0x115D7}, {0x115D8, 0x115DB}, - {0x115DC, 0x115DD}, {0x11600, 0x1162F}, {0x11630, 0x11632}, - {0x11633, 0x1163A}, {0x1163B, 0x1163C}, {0x1163D, 0x1163D}, - {0x1163E, 0x1163E}, {0x1163F, 0x11640}, {0x11641, 0x11643}, - {0x11644, 0x11644}, {0x11650, 0x11659}, {0x11660, 0x1166C}, - {0x11680, 0x116AA}, {0x116AB, 0x116AB}, {0x116AC, 0x116AC}, - {0x116AD, 0x116AD}, {0x116AE, 0x116AF}, {0x116B0, 0x116B5}, - {0x116B6, 0x116B6}, {0x116B7, 0x116B7}, {0x116C0, 0x116C9}, - {0x11700, 0x11719}, {0x1171D, 0x1171F}, {0x11720, 0x11721}, - {0x11722, 0x11725}, {0x11726, 0x11726}, {0x11727, 0x1172B}, - {0x11730, 0x11739}, {0x1173A, 0x1173B}, {0x1173C, 0x1173E}, - {0x1173F, 0x1173F}, {0x118A0, 0x118DF}, {0x118E0, 0x118E9}, - {0x118EA, 0x118F2}, {0x118FF, 0x118FF}, {0x11AC0, 0x11AF8}, - {0x11C00, 0x11C08}, {0x11C0A, 0x11C2E}, {0x11C2F, 0x11C2F}, - {0x11C30, 0x11C36}, {0x11C38, 0x11C3D}, {0x11C3E, 0x11C3E}, - {0x11C3F, 0x11C3F}, {0x11C40, 0x11C40}, {0x11C41, 0x11C45}, - {0x11C50, 0x11C59}, {0x11C5A, 0x11C6C}, {0x11C70, 0x11C71}, - {0x11C72, 0x11C8F}, {0x11C92, 0x11CA7}, {0x11CA9, 0x11CA9}, - {0x11CAA, 0x11CB0}, {0x11CB1, 0x11CB1}, {0x11CB2, 0x11CB3}, - {0x11CB4, 0x11CB4}, {0x11CB5, 0x11CB6}, {0x12000, 0x12399}, - {0x12400, 0x1246E}, {0x12470, 0x12474}, {0x12480, 0x12543}, - {0x13000, 0x1342E}, {0x14400, 0x14646}, {0x16800, 0x16A38}, - {0x16A40, 0x16A5E}, {0x16A60, 0x16A69}, {0x16A6E, 0x16A6F}, - {0x16AD0, 0x16AED}, {0x16AF0, 0x16AF4}, {0x16AF5, 0x16AF5}, - {0x16B00, 0x16B2F}, {0x16B30, 0x16B36}, {0x16B37, 0x16B3B}, - {0x16B3C, 0x16B3F}, {0x16B40, 0x16B43}, {0x16B44, 0x16B44}, - {0x16B45, 0x16B45}, {0x16B50, 0x16B59}, {0x16B5B, 0x16B61}, - {0x16B63, 0x16B77}, {0x16B7D, 0x16B8F}, {0x16F00, 0x16F44}, - {0x16F50, 0x16F50}, {0x16F51, 0x16F7E}, {0x16F8F, 0x16F92}, - {0x16F93, 0x16F9F}, {0x1BC00, 0x1BC6A}, {0x1BC70, 0x1BC7C}, - {0x1BC80, 0x1BC88}, {0x1BC90, 0x1BC99}, {0x1BC9C, 0x1BC9C}, - {0x1BC9D, 0x1BC9E}, {0x1BC9F, 0x1BC9F}, {0x1BCA0, 0x1BCA3}, - {0x1D000, 0x1D0F5}, {0x1D100, 0x1D126}, {0x1D129, 0x1D164}, - {0x1D165, 0x1D166}, {0x1D167, 0x1D169}, {0x1D16A, 0x1D16C}, - {0x1D16D, 0x1D172}, {0x1D173, 0x1D17A}, {0x1D17B, 0x1D182}, - {0x1D183, 0x1D184}, {0x1D185, 0x1D18B}, {0x1D18C, 0x1D1A9}, - {0x1D1AA, 0x1D1AD}, {0x1D1AE, 0x1D1E8}, {0x1D200, 0x1D241}, - {0x1D242, 0x1D244}, {0x1D245, 0x1D245}, {0x1D300, 0x1D356}, - {0x1D360, 0x1D371}, {0x1D400, 0x1D454}, {0x1D456, 0x1D49C}, - {0x1D49E, 0x1D49F}, {0x1D4A2, 0x1D4A2}, {0x1D4A5, 0x1D4A6}, - {0x1D4A9, 0x1D4AC}, {0x1D4AE, 0x1D4B9}, {0x1D4BB, 0x1D4BB}, - {0x1D4BD, 0x1D4C3}, {0x1D4C5, 0x1D505}, {0x1D507, 0x1D50A}, - {0x1D50D, 0x1D514}, {0x1D516, 0x1D51C}, {0x1D51E, 0x1D539}, - {0x1D53B, 0x1D53E}, {0x1D540, 0x1D544}, {0x1D546, 0x1D546}, - {0x1D54A, 0x1D550}, {0x1D552, 0x1D6A5}, {0x1D6A8, 0x1D6C0}, - {0x1D6C1, 0x1D6C1}, {0x1D6C2, 0x1D6DA}, {0x1D6DB, 0x1D6DB}, - {0x1D6DC, 0x1D6FA}, {0x1D6FB, 0x1D6FB}, {0x1D6FC, 0x1D714}, - {0x1D715, 0x1D715}, {0x1D716, 0x1D734}, {0x1D735, 0x1D735}, - {0x1D736, 0x1D74E}, {0x1D74F, 0x1D74F}, {0x1D750, 0x1D76E}, - {0x1D76F, 0x1D76F}, {0x1D770, 0x1D788}, {0x1D789, 0x1D789}, - {0x1D78A, 0x1D7A8}, {0x1D7A9, 0x1D7A9}, {0x1D7AA, 0x1D7C2}, - {0x1D7C3, 0x1D7C3}, {0x1D7C4, 0x1D7CB}, {0x1D7CE, 0x1D7FF}, - {0x1D800, 0x1D9FF}, {0x1DA00, 0x1DA36}, {0x1DA37, 0x1DA3A}, - {0x1DA3B, 0x1DA6C}, {0x1DA6D, 0x1DA74}, {0x1DA75, 0x1DA75}, - {0x1DA76, 0x1DA83}, {0x1DA84, 0x1DA84}, {0x1DA85, 0x1DA86}, - {0x1DA87, 0x1DA8B}, {0x1DA9B, 0x1DA9F}, {0x1DAA1, 0x1DAAF}, - {0x1E000, 0x1E006}, {0x1E008, 0x1E018}, {0x1E01B, 0x1E021}, - {0x1E023, 0x1E024}, {0x1E026, 0x1E02A}, {0x1E800, 0x1E8C4}, - {0x1E8C7, 0x1E8CF}, {0x1E8D0, 0x1E8D6}, {0x1E900, 0x1E943}, - {0x1E944, 0x1E94A}, {0x1E950, 0x1E959}, {0x1E95E, 0x1E95F}, - {0x1EE00, 0x1EE03}, {0x1EE05, 0x1EE1F}, {0x1EE21, 0x1EE22}, - {0x1EE24, 0x1EE24}, {0x1EE27, 0x1EE27}, {0x1EE29, 0x1EE32}, - {0x1EE34, 0x1EE37}, {0x1EE39, 0x1EE39}, {0x1EE3B, 0x1EE3B}, - {0x1EE42, 0x1EE42}, {0x1EE47, 0x1EE47}, {0x1EE49, 0x1EE49}, - {0x1EE4B, 0x1EE4B}, {0x1EE4D, 0x1EE4F}, {0x1EE51, 0x1EE52}, - {0x1EE54, 0x1EE54}, {0x1EE57, 0x1EE57}, {0x1EE59, 0x1EE59}, - {0x1EE5B, 0x1EE5B}, {0x1EE5D, 0x1EE5D}, {0x1EE5F, 0x1EE5F}, - {0x1EE61, 0x1EE62}, {0x1EE64, 0x1EE64}, {0x1EE67, 0x1EE6A}, - {0x1EE6C, 0x1EE72}, {0x1EE74, 0x1EE77}, {0x1EE79, 0x1EE7C}, - {0x1EE7E, 0x1EE7E}, {0x1EE80, 0x1EE89}, {0x1EE8B, 0x1EE9B}, - {0x1EEA1, 0x1EEA3}, {0x1EEA5, 0x1EEA9}, {0x1EEAB, 0x1EEBB}, - {0x1EEF0, 0x1EEF1}, {0x1F000, 0x1F003}, {0x1F005, 0x1F02B}, - {0x1F030, 0x1F093}, {0x1F0A0, 0x1F0AE}, {0x1F0B1, 0x1F0BF}, - {0x1F0C1, 0x1F0CE}, {0x1F0D1, 0x1F0F5}, {0x1F10B, 0x1F10C}, - {0x1F12E, 0x1F12E}, {0x1F16A, 0x1F16B}, {0x1F1E6, 0x1F1FF}, - {0x1F321, 0x1F32C}, {0x1F336, 0x1F336}, {0x1F37D, 0x1F37D}, - {0x1F394, 0x1F39F}, {0x1F3CB, 0x1F3CE}, {0x1F3D4, 0x1F3DF}, - {0x1F3F1, 0x1F3F3}, {0x1F3F5, 0x1F3F7}, {0x1F43F, 0x1F43F}, - {0x1F441, 0x1F441}, {0x1F4FD, 0x1F4FE}, {0x1F53E, 0x1F54A}, - {0x1F54F, 0x1F54F}, {0x1F568, 0x1F579}, {0x1F57B, 0x1F594}, - {0x1F597, 0x1F5A3}, {0x1F5A5, 0x1F5FA}, {0x1F650, 0x1F67F}, - {0x1F6C6, 0x1F6CB}, {0x1F6CD, 0x1F6CF}, {0x1F6E0, 0x1F6EA}, - {0x1F6F0, 0x1F6F3}, {0x1F700, 0x1F773}, {0x1F780, 0x1F7D4}, - {0x1F800, 0x1F80B}, {0x1F810, 0x1F847}, {0x1F850, 0x1F859}, - {0x1F860, 0x1F887}, {0x1F890, 0x1F8AD}, {0xE0001, 0xE0001}, - {0xE0020, 0xE007F}, -} - -// Condition have flag EastAsianWidth whether the current locale is CJK or not. -type Condition struct { - EastAsianWidth bool -} - -// NewCondition return new instance of Condition which is current locale. -func NewCondition() *Condition { - return &Condition{EastAsianWidth} -} - -// RuneWidth returns the number of cells in r. -// See http://www.unicode.org/reports/tr11/ -func (c *Condition) RuneWidth(r rune) int { - switch { - case r < 0 || r > 0x10FFFF || - inTables(r, nonprint, combining, notassigned): - return 0 - case (c.EastAsianWidth && IsAmbiguousWidth(r)) || - inTables(r, doublewidth, emoji): - return 2 - default: - return 1 - } -} - -// StringWidth return width as you can see -func (c *Condition) StringWidth(s string) (width int) { - for _, r := range []rune(s) { - width += c.RuneWidth(r) - } - return width -} - -// Truncate return string truncated with w cells -func (c *Condition) Truncate(s string, w int, tail string) string { - if c.StringWidth(s) <= w { - return s - } - r := []rune(s) - tw := c.StringWidth(tail) - w -= tw - width := 0 - i := 0 - for ; i < len(r); i++ { - cw := c.RuneWidth(r[i]) - if width+cw > w { - break - } - width += cw - } - return string(r[0:i]) + tail -} - -// Wrap return string wrapped with w cells -func (c *Condition) Wrap(s string, w int) string { - width := 0 - out := "" - for _, r := range []rune(s) { - cw := RuneWidth(r) - if r == '\n' { - out += string(r) - width = 0 - continue - } else if width+cw > w { - out += "\n" - width = 0 - out += string(r) - width += cw - continue - } - out += string(r) - width += cw - } - return out -} - -// FillLeft return string filled in left by spaces in w cells -func (c *Condition) FillLeft(s string, w int) string { - width := c.StringWidth(s) - count := w - width - if count > 0 { - b := make([]byte, count) - for i := range b { - b[i] = ' ' - } - return string(b) + s - } - return s -} - -// FillRight return string filled in left by spaces in w cells -func (c *Condition) FillRight(s string, w int) string { - width := c.StringWidth(s) - count := w - width - if count > 0 { - b := make([]byte, count) - for i := range b { - b[i] = ' ' - } - return s + string(b) - } - return s -} - -// RuneWidth returns the number of cells in r. -// See http://www.unicode.org/reports/tr11/ -func RuneWidth(r rune) int { - return DefaultCondition.RuneWidth(r) -} - -// IsAmbiguousWidth returns whether is ambiguous width or not. -func IsAmbiguousWidth(r rune) bool { - return inTables(r, private, ambiguous) -} - -// IsNeutralWidth returns whether is neutral width or not. -func IsNeutralWidth(r rune) bool { - return inTable(r, neutral) -} - -// StringWidth return width as you can see -func StringWidth(s string) (width int) { - return DefaultCondition.StringWidth(s) -} - -// Truncate return string truncated with w cells -func Truncate(s string, w int, tail string) string { - return DefaultCondition.Truncate(s, w, tail) -} - -// Wrap return string wrapped with w cells -func Wrap(s string, w int) string { - return DefaultCondition.Wrap(s, w) -} - -// FillLeft return string filled in left by spaces in w cells -func FillLeft(s string, w int) string { - return DefaultCondition.FillLeft(s, w) -} - -// FillRight return string filled in left by spaces in w cells -func FillRight(s string, w int) string { - return DefaultCondition.FillRight(s, w) -} diff --git a/vendor/github.com/mattn/go-runewidth/runewidth_js.go b/vendor/github.com/mattn/go-runewidth/runewidth_js.go deleted file mode 100644 index 0ce32c5e7b71..000000000000 --- a/vendor/github.com/mattn/go-runewidth/runewidth_js.go +++ /dev/null @@ -1,8 +0,0 @@ -// +build js - -package runewidth - -func IsEastAsian() bool { - // TODO: Implement this for the web. Detect east asian in a compatible way, and return true. - return false -} diff --git a/vendor/github.com/mattn/go-runewidth/runewidth_posix.go b/vendor/github.com/mattn/go-runewidth/runewidth_posix.go deleted file mode 100644 index c579e9a31443..000000000000 --- a/vendor/github.com/mattn/go-runewidth/runewidth_posix.go +++ /dev/null @@ -1,77 +0,0 @@ -// +build !windows,!js - -package runewidth - -import ( - "os" - "regexp" - "strings" -) - -var reLoc = regexp.MustCompile(`^[a-z][a-z][a-z]?(?:_[A-Z][A-Z])?\.(.+)`) - -var mblenTable = map[string]int{ - "utf-8": 6, - "utf8": 6, - "jis": 8, - "eucjp": 3, - "euckr": 2, - "euccn": 2, - "sjis": 2, - "cp932": 2, - "cp51932": 2, - "cp936": 2, - "cp949": 2, - "cp950": 2, - "big5": 2, - "gbk": 2, - "gb2312": 2, -} - -func isEastAsian(locale string) bool { - charset := strings.ToLower(locale) - r := reLoc.FindStringSubmatch(locale) - if len(r) == 2 { - charset = strings.ToLower(r[1]) - } - - if strings.HasSuffix(charset, "@cjk_narrow") { - return false - } - - for pos, b := range []byte(charset) { - if b == '@' { - charset = charset[:pos] - break - } - } - max := 1 - if m, ok := mblenTable[charset]; ok { - max = m - } - if max > 1 && (charset[0] != 'u' || - strings.HasPrefix(locale, "ja") || - strings.HasPrefix(locale, "ko") || - strings.HasPrefix(locale, "zh")) { - return true - } - return false -} - -// IsEastAsian return true if the current locale is CJK -func IsEastAsian() bool { - locale := os.Getenv("LC_CTYPE") - if locale == "" { - locale = os.Getenv("LANG") - } - - // ignore C locale - if locale == "POSIX" || locale == "C" { - return false - } - if len(locale) > 1 && locale[0] == 'C' && (locale[1] == '.' || locale[1] == '-') { - return false - } - - return isEastAsian(locale) -} diff --git a/vendor/github.com/mattn/go-runewidth/runewidth_windows.go b/vendor/github.com/mattn/go-runewidth/runewidth_windows.go deleted file mode 100644 index 0258876b99dd..000000000000 --- a/vendor/github.com/mattn/go-runewidth/runewidth_windows.go +++ /dev/null @@ -1,25 +0,0 @@ -package runewidth - -import ( - "syscall" -) - -var ( - kernel32 = syscall.NewLazyDLL("kernel32") - procGetConsoleOutputCP = kernel32.NewProc("GetConsoleOutputCP") -) - -// IsEastAsian return true if the current locale is CJK -func IsEastAsian() bool { - r1, _, _ := procGetConsoleOutputCP.Call() - if r1 == 0 { - return false - } - - switch int(r1) { - case 932, 51932, 936, 949, 950: - return true - } - - return false -} diff --git a/vendor/github.com/mitchellh/go-wordwrap/LICENSE.md b/vendor/github.com/mitchellh/go-wordwrap/LICENSE.md deleted file mode 100644 index 229851590442..000000000000 --- a/vendor/github.com/mitchellh/go-wordwrap/LICENSE.md +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Mitchell Hashimoto - -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/mitchellh/go-wordwrap/README.md b/vendor/github.com/mitchellh/go-wordwrap/README.md deleted file mode 100644 index 60ae3117008d..000000000000 --- a/vendor/github.com/mitchellh/go-wordwrap/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# go-wordwrap - -`go-wordwrap` (Golang package: `wordwrap`) is a package for Go that -automatically wraps words into multiple lines. The primary use case for this -is in formatting CLI output, but of course word wrapping is a generally useful -thing to do. - -## Installation and Usage - -Install using `go get github.com/mitchellh/go-wordwrap`. - -Full documentation is available at -http://godoc.org/github.com/mitchellh/go-wordwrap - -Below is an example of its usage ignoring errors: - -```go -wrapped := wordwrap.WrapString("foo bar baz", 3) -fmt.Println(wrapped) -``` - -Would output: - -``` -foo -bar -baz -``` - -## Word Wrap Algorithm - -This library doesn't use any clever algorithm for word wrapping. The wrapping -is actually very naive: whenever there is whitespace or an explicit linebreak. -The goal of this library is for word wrapping CLI output, so the input is -typically pretty well controlled human language. Because of this, the naive -approach typically works just fine. - -In the future, we'd like to make the algorithm more advanced. We would do -so without breaking the API. diff --git a/vendor/github.com/mitchellh/go-wordwrap/wordwrap.go b/vendor/github.com/mitchellh/go-wordwrap/wordwrap.go deleted file mode 100644 index ac67205bc2e5..000000000000 --- a/vendor/github.com/mitchellh/go-wordwrap/wordwrap.go +++ /dev/null @@ -1,73 +0,0 @@ -package wordwrap - -import ( - "bytes" - "unicode" -) - -// WrapString wraps the given string within lim width in characters. -// -// Wrapping is currently naive and only happens at white-space. A future -// version of the library will implement smarter wrapping. This means that -// pathological cases can dramatically reach past the limit, such as a very -// long word. -func WrapString(s string, lim uint) string { - // Initialize a buffer with a slightly larger size to account for breaks - init := make([]byte, 0, len(s)) - buf := bytes.NewBuffer(init) - - var current uint - var wordBuf, spaceBuf bytes.Buffer - - for _, char := range s { - if char == '\n' { - if wordBuf.Len() == 0 { - if current+uint(spaceBuf.Len()) > lim { - current = 0 - } else { - current += uint(spaceBuf.Len()) - spaceBuf.WriteTo(buf) - } - spaceBuf.Reset() - } else { - current += uint(spaceBuf.Len() + wordBuf.Len()) - spaceBuf.WriteTo(buf) - spaceBuf.Reset() - wordBuf.WriteTo(buf) - wordBuf.Reset() - } - buf.WriteRune(char) - current = 0 - } else if unicode.IsSpace(char) { - if spaceBuf.Len() == 0 || wordBuf.Len() > 0 { - current += uint(spaceBuf.Len() + wordBuf.Len()) - spaceBuf.WriteTo(buf) - spaceBuf.Reset() - wordBuf.WriteTo(buf) - wordBuf.Reset() - } - - spaceBuf.WriteRune(char) - } else { - - wordBuf.WriteRune(char) - - if current+uint(spaceBuf.Len()+wordBuf.Len()) > lim && uint(wordBuf.Len()) < lim { - buf.WriteRune('\n') - current = 0 - spaceBuf.Reset() - } - } - } - - if wordBuf.Len() == 0 { - if current+uint(spaceBuf.Len()) <= lim { - spaceBuf.WriteTo(buf) - } - } else { - spaceBuf.WriteTo(buf) - wordBuf.WriteTo(buf) - } - - return buf.String() -} diff --git a/vendor/github.com/mohae/deepcopy/LICENSE b/vendor/github.com/mohae/deepcopy/LICENSE deleted file mode 100644 index 419673f005e6..000000000000 --- a/vendor/github.com/mohae/deepcopy/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Joel - -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/mohae/deepcopy/README.md b/vendor/github.com/mohae/deepcopy/README.md deleted file mode 100644 index f81841885b4e..000000000000 --- a/vendor/github.com/mohae/deepcopy/README.md +++ /dev/null @@ -1,8 +0,0 @@ -deepCopy -======== -[![GoDoc](https://godoc.org/github.com/mohae/deepcopy?status.svg)](https://godoc.org/github.com/mohae/deepcopy)[![Build Status](https://travis-ci.org/mohae/deepcopy.png)](https://travis-ci.org/mohae/deepcopy) - -DeepCopy makes deep copies of things: unexported field values are not copied. - -## Usage - cpy := deepcopy.Copy(orig) diff --git a/vendor/github.com/mohae/deepcopy/deepcopy.go b/vendor/github.com/mohae/deepcopy/deepcopy.go deleted file mode 100644 index ba763ad091e2..000000000000 --- a/vendor/github.com/mohae/deepcopy/deepcopy.go +++ /dev/null @@ -1,125 +0,0 @@ -// deepcopy makes deep copies of things. A standard copy will copy the -// pointers: deep copy copies the values pointed to. Unexported field -// values are not copied. -// -// Copyright (c)2014-2016, Joel Scoble (github.com/mohae), all rights reserved. -// License: MIT, for more details check the included LICENSE file. -package deepcopy - -import ( - "reflect" - "time" -) - -// Interface for delegating copy process to type -type Interface interface { - DeepCopy() interface{} -} - -// Iface is an alias to Copy; this exists for backwards compatibility reasons. -func Iface(iface interface{}) interface{} { - return Copy(iface) -} - -// Copy creates a deep copy of whatever is passed to it and returns the copy -// in an interface{}. The returned value will need to be asserted to the -// correct type. -func Copy(src interface{}) interface{} { - if src == nil { - return nil - } - - // Make the interface a reflect.Value - original := reflect.ValueOf(src) - - // Make a copy of the same type as the original. - cpy := reflect.New(original.Type()).Elem() - - // Recursively copy the original. - copyRecursive(original, cpy) - - // Return the copy as an interface. - return cpy.Interface() -} - -// copyRecursive does the actual copying of the interface. It currently has -// limited support for what it can handle. Add as needed. -func copyRecursive(original, cpy reflect.Value) { - // check for implement deepcopy.Interface - if original.CanInterface() { - if copier, ok := original.Interface().(Interface); ok { - cpy.Set(reflect.ValueOf(copier.DeepCopy())) - return - } - } - - // handle according to original's Kind - switch original.Kind() { - case reflect.Ptr: - // Get the actual value being pointed to. - originalValue := original.Elem() - - // if it isn't valid, return. - if !originalValue.IsValid() { - return - } - cpy.Set(reflect.New(originalValue.Type())) - copyRecursive(originalValue, cpy.Elem()) - - case reflect.Interface: - // If this is a nil, don't do anything - if original.IsNil() { - return - } - // Get the value for the interface, not the pointer. - originalValue := original.Elem() - - // Get the value by calling Elem(). - copyValue := reflect.New(originalValue.Type()).Elem() - copyRecursive(originalValue, copyValue) - cpy.Set(copyValue) - - case reflect.Struct: - t, ok := original.Interface().(time.Time) - if ok { - cpy.Set(reflect.ValueOf(t)) - return - } - // Go through each field of the struct and copy it. - for i := 0; i < original.NumField(); i++ { - // The Type's StructField for a given field is checked to see if StructField.PkgPath - // is set to determine if the field is exported or not because CanSet() returns false - // for settable fields. I'm not sure why. -mohae - if original.Type().Field(i).PkgPath != "" { - continue - } - copyRecursive(original.Field(i), cpy.Field(i)) - } - - case reflect.Slice: - if original.IsNil() { - return - } - // Make a new slice and copy each element. - cpy.Set(reflect.MakeSlice(original.Type(), original.Len(), original.Cap())) - for i := 0; i < original.Len(); i++ { - copyRecursive(original.Index(i), cpy.Index(i)) - } - - case reflect.Map: - if original.IsNil() { - return - } - cpy.Set(reflect.MakeMap(original.Type())) - for _, key := range original.MapKeys() { - originalValue := original.MapIndex(key) - copyValue := reflect.New(originalValue.Type()).Elem() - copyRecursive(originalValue, copyValue) - copyKey := Copy(key.Interface()) - cpy.SetMapIndex(reflect.ValueOf(copyKey), copyValue) - } - - default: - cpy.Set(original) - } -} diff --git a/vendor/github.com/naoina/go-stringutil/LICENSE b/vendor/github.com/naoina/go-stringutil/LICENSE deleted file mode 100644 index 0fff1c58b73a..000000000000 --- a/vendor/github.com/naoina/go-stringutil/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015 Naoya Inada - -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/naoina/go-stringutil/README.md b/vendor/github.com/naoina/go-stringutil/README.md deleted file mode 100644 index ecf7a5fae3d5..000000000000 --- a/vendor/github.com/naoina/go-stringutil/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# stringutil [![Build Status](https://travis-ci.org/naoina/go-stringutil.svg?branch=master)](https://travis-ci.org/naoina/go-stringutil) - -## Installation - - go get -u github.com/naoina/go-stringutil - -## Documentation - -See https://godoc.org/github.com/naoina/go-stringutil - -## License - -MIT diff --git a/vendor/github.com/naoina/go-stringutil/da.go b/vendor/github.com/naoina/go-stringutil/da.go deleted file mode 100644 index 8fe65165962e..000000000000 --- a/vendor/github.com/naoina/go-stringutil/da.go +++ /dev/null @@ -1,253 +0,0 @@ -package stringutil - -import ( - "fmt" - "sort" - "unicode/utf8" -) - -const ( - terminationCharacter = '#' -) - -func mustDoubleArray(da *doubleArray, err error) *doubleArray { - if err != nil { - panic(err) - } - return da -} - -func (da *doubleArray) Build(keys []string) error { - records := makeRecords(keys) - if err := da.build(records, 1, 0, make(map[int]struct{})); err != nil { - return err - } - return nil -} - -type doubleArray struct { - bc []baseCheck - node []int -} - -func newDoubleArray(keys []string) (*doubleArray, error) { - da := &doubleArray{ - bc: []baseCheck{0}, - node: []int{-1}, // A start index is adjusting to 1 because 0 will be used as a mark of non-existent node. - } - if err := da.Build(keys); err != nil { - return nil, err - } - return da, nil -} - -// baseCheck contains BASE, CHECK and Extra flags. -// From the top, 22bits of BASE, 2bits of Extra flags and 8bits of CHECK. -// -// BASE (22bit) | Extra flags (2bit) | CHECK (8bit) -// |----------------------|--|--------| -// 32 10 8 0 -type baseCheck uint32 - -func (bc baseCheck) Base() int { - return int(bc >> 10) -} - -func (bc *baseCheck) SetBase(base int) { - *bc |= baseCheck(base) << 10 -} - -func (bc baseCheck) Check() byte { - return byte(bc) -} - -func (bc *baseCheck) SetCheck(check byte) { - *bc |= baseCheck(check) -} - -func (bc baseCheck) IsEmpty() bool { - return bc&0xfffffcff == 0 -} - -func (da *doubleArray) Lookup(path string) (length int) { - idx := 1 - tmpIdx := idx - for i := 0; i < len(path); i++ { - c := path[i] - tmpIdx = da.nextIndex(da.bc[tmpIdx].Base(), c) - if tmpIdx >= len(da.bc) || da.bc[tmpIdx].Check() != c { - break - } - idx = tmpIdx - } - if next := da.nextIndex(da.bc[idx].Base(), terminationCharacter); next < len(da.bc) && da.bc[next].Check() == terminationCharacter { - return da.node[da.bc[next].Base()] - } - return -1 -} - -func (da *doubleArray) LookupByBytes(path []byte) (length int) { - idx := 1 - tmpIdx := idx - for i := 0; i < len(path); i++ { - c := path[i] - tmpIdx = da.nextIndex(da.bc[tmpIdx].Base(), c) - if tmpIdx >= len(da.bc) || da.bc[tmpIdx].Check() != c { - break - } - idx = tmpIdx - } - if next := da.nextIndex(da.bc[idx].Base(), terminationCharacter); next < len(da.bc) && da.bc[next].Check() == terminationCharacter { - return da.node[da.bc[next].Base()] - } - return -1 -} - -func (da *doubleArray) build(srcs []record, idx, depth int, usedBase map[int]struct{}) error { - sort.Stable(recordSlice(srcs)) - base, siblings, leaf, err := da.arrange(srcs, idx, depth, usedBase) - if err != nil { - return err - } - if leaf != nil { - da.bc[idx].SetBase(len(da.node)) - da.node = append(da.node, leaf.value) - } - for _, sib := range siblings { - da.setCheck(da.nextIndex(base, sib.c), sib.c) - } - for _, sib := range siblings { - if err := da.build(srcs[sib.start:sib.end], da.nextIndex(base, sib.c), depth+1, usedBase); err != nil { - return err - } - } - return nil -} - -func (da *doubleArray) setBase(i, base int) { - da.bc[i].SetBase(base) -} - -func (da *doubleArray) setCheck(i int, check byte) { - da.bc[i].SetCheck(check) -} - -func (da *doubleArray) findEmptyIndex(start int) int { - i := start - for ; i < len(da.bc); i++ { - if da.bc[i].IsEmpty() { - break - } - } - return i -} - -// findBase returns good BASE. -func (da *doubleArray) findBase(siblings []sibling, start int, usedBase map[int]struct{}) (base int) { - for idx, firstChar := start+1, siblings[0].c; ; idx = da.findEmptyIndex(idx + 1) { - base = da.nextIndex(idx, firstChar) - if _, used := usedBase[base]; used { - continue - } - i := 0 - for ; i < len(siblings); i++ { - next := da.nextIndex(base, siblings[i].c) - if len(da.bc) <= next { - da.bc = append(da.bc, make([]baseCheck, next-len(da.bc)+1)...) - } - if !da.bc[next].IsEmpty() { - break - } - } - if i == len(siblings) { - break - } - } - usedBase[base] = struct{}{} - return base -} - -func (da *doubleArray) arrange(records []record, idx, depth int, usedBase map[int]struct{}) (base int, siblings []sibling, leaf *record, err error) { - siblings, leaf, err = makeSiblings(records, depth) - if err != nil { - return -1, nil, nil, err - } - if len(siblings) < 1 { - return -1, nil, leaf, nil - } - base = da.findBase(siblings, idx, usedBase) - da.setBase(idx, base) - return base, siblings, leaf, err -} - -type sibling struct { - start int - end int - c byte -} - -func (da *doubleArray) nextIndex(base int, c byte) int { - return base ^ int(c) -} - -func makeSiblings(records []record, depth int) (sib []sibling, leaf *record, err error) { - var ( - pc byte - n int - ) - for i, r := range records { - if len(r.key) <= depth { - leaf = &r - continue - } - c := r.key[depth] - switch { - case pc < c: - sib = append(sib, sibling{start: i, c: c}) - case pc == c: - continue - default: - return nil, nil, fmt.Errorf("stringutil: BUG: records hasn't been sorted") - } - if n > 0 { - sib[n-1].end = i - } - pc = c - n++ - } - if n == 0 { - return nil, leaf, nil - } - sib[n-1].end = len(records) - return sib, leaf, nil -} - -type record struct { - key string - value int -} - -func makeRecords(srcs []string) (records []record) { - termChar := string(terminationCharacter) - for _, s := range srcs { - records = append(records, record{ - key: string(s + termChar), - value: utf8.RuneCountInString(s), - }) - } - return records -} - -type recordSlice []record - -func (rs recordSlice) Len() int { - return len(rs) -} - -func (rs recordSlice) Less(i, j int) bool { - return rs[i].key < rs[j].key -} - -func (rs recordSlice) Swap(i, j int) { - rs[i], rs[j] = rs[j], rs[i] -} diff --git a/vendor/github.com/naoina/go-stringutil/strings.go b/vendor/github.com/naoina/go-stringutil/strings.go deleted file mode 100644 index 881ca2c8f670..000000000000 --- a/vendor/github.com/naoina/go-stringutil/strings.go +++ /dev/null @@ -1,320 +0,0 @@ -package stringutil - -import ( - "sync" - "unicode" - "unicode/utf8" -) - -var ( - mu sync.Mutex - - // Based on https://github.com/golang/lint/blob/32a87160691b3c96046c0c678fe57c5bef761456/lint.go#L702 - commonInitialismMap = map[string]struct{}{ - "API": struct{}{}, - "ASCII": struct{}{}, - "CPU": struct{}{}, - "CSRF": struct{}{}, - "CSS": struct{}{}, - "DNS": struct{}{}, - "EOF": struct{}{}, - "GUID": struct{}{}, - "HTML": struct{}{}, - "HTTP": struct{}{}, - "HTTPS": struct{}{}, - "ID": struct{}{}, - "IP": struct{}{}, - "JSON": struct{}{}, - "LHS": struct{}{}, - "QPS": struct{}{}, - "RAM": struct{}{}, - "RHS": struct{}{}, - "RPC": struct{}{}, - "SLA": struct{}{}, - "SMTP": struct{}{}, - "SQL": struct{}{}, - "SSH": struct{}{}, - "TCP": struct{}{}, - "TLS": struct{}{}, - "TTL": struct{}{}, - "UDP": struct{}{}, - "UI": struct{}{}, - "UID": struct{}{}, - "UUID": struct{}{}, - "URI": struct{}{}, - "URL": struct{}{}, - "UTF8": struct{}{}, - "VM": struct{}{}, - "XML": struct{}{}, - "XSRF": struct{}{}, - "XSS": struct{}{}, - } - commonInitialisms = keys(commonInitialismMap) - commonInitialism = mustDoubleArray(newDoubleArray(commonInitialisms)) - longestLen = longestLength(commonInitialisms) - shortestLen = shortestLength(commonInitialisms, longestLen) -) - -// ToUpperCamelCase returns a copy of the string s with all Unicode letters mapped to their camel case. -// It will convert to upper case previous letter of '_' and first letter, and remove letter of '_'. -func ToUpperCamelCase(s string) string { - if s == "" { - return "" - } - upper := true - start := 0 - result := make([]byte, 0, len(s)) - var runeBuf [utf8.UTFMax]byte - var initialism []byte - for _, c := range s { - if c == '_' { - upper = true - candidate := string(result[start:]) - initialism = initialism[:0] - for _, r := range candidate { - if r < utf8.RuneSelf { - initialism = append(initialism, toUpperASCII(byte(r))) - } else { - n := utf8.EncodeRune(runeBuf[:], unicode.ToUpper(r)) - initialism = append(initialism, runeBuf[:n]...) - } - } - if length := commonInitialism.LookupByBytes(initialism); length > 0 { - result = append(result[:start], initialism...) - } - start = len(result) - continue - } - if upper { - if c < utf8.RuneSelf { - result = append(result, toUpperASCII(byte(c))) - } else { - n := utf8.EncodeRune(runeBuf[:], unicode.ToUpper(c)) - result = append(result, runeBuf[:n]...) - } - upper = false - continue - } - if c < utf8.RuneSelf { - result = append(result, byte(c)) - } else { - n := utf8.EncodeRune(runeBuf[:], c) - result = append(result, runeBuf[:n]...) - } - } - candidate := string(result[start:]) - initialism = initialism[:0] - for _, r := range candidate { - if r < utf8.RuneSelf { - initialism = append(initialism, toUpperASCII(byte(r))) - } else { - n := utf8.EncodeRune(runeBuf[:], unicode.ToUpper(r)) - initialism = append(initialism, runeBuf[:n]...) - } - } - if length := commonInitialism.LookupByBytes(initialism); length > 0 { - result = append(result[:start], initialism...) - } - return string(result) -} - -// ToUpperCamelCaseASCII is similar to ToUpperCamelCase, but optimized for -// only the ASCII characters. -// ToUpperCamelCaseASCII is faster than ToUpperCamelCase, but doesn't work if -// contains non-ASCII characters. -func ToUpperCamelCaseASCII(s string) string { - if s == "" { - return "" - } - upper := true - start := 0 - result := make([]byte, 0, len(s)) - var initialism []byte - for i := 0; i < len(s); i++ { - c := s[i] - if c == '_' { - upper = true - candidate := result[start:] - initialism = initialism[:0] - for _, b := range candidate { - initialism = append(initialism, toUpperASCII(b)) - } - if length := commonInitialism.LookupByBytes(initialism); length > 0 { - result = append(result[:start], initialism...) - } - start = len(result) - continue - } - if upper { - result = append(result, toUpperASCII(c)) - upper = false - continue - } - result = append(result, c) - } - candidate := result[start:] - initialism = initialism[:0] - for _, b := range candidate { - initialism = append(initialism, toUpperASCII(b)) - } - if length := commonInitialism.LookupByBytes(initialism); length > 0 { - result = append(result[:start], initialism...) - } - return string(result) -} - -// ToSnakeCase returns a copy of the string s with all Unicode letters mapped to their snake case. -// It will insert letter of '_' at position of previous letter of uppercase and all -// letters convert to lower case. -// ToSnakeCase does not insert '_' letter into a common initialism word like ID, URL and so on. -func ToSnakeCase(s string) string { - if s == "" { - return "" - } - result := make([]byte, 0, len(s)) - var runeBuf [utf8.UTFMax]byte - var j, skipCount int - for i, c := range s { - if i < skipCount { - continue - } - if unicode.IsUpper(c) { - if i != 0 { - result = append(result, '_') - } - next := nextIndex(j, len(s)) - if length := commonInitialism.Lookup(s[j:next]); length > 0 { - for _, r := range s[j : j+length] { - if r < utf8.RuneSelf { - result = append(result, toLowerASCII(byte(r))) - } else { - n := utf8.EncodeRune(runeBuf[:], unicode.ToLower(r)) - result = append(result, runeBuf[:n]...) - } - } - j += length - 1 - skipCount = i + length - continue - } - } - if c < utf8.RuneSelf { - result = append(result, toLowerASCII(byte(c))) - } else { - n := utf8.EncodeRune(runeBuf[:], unicode.ToLower(c)) - result = append(result, runeBuf[:n]...) - } - j++ - } - return string(result) -} - -// ToSnakeCaseASCII is similar to ToSnakeCase, but optimized for only the ASCII -// characters. -// ToSnakeCaseASCII is faster than ToSnakeCase, but doesn't work correctly if -// contains non-ASCII characters. -func ToSnakeCaseASCII(s string) string { - if s == "" { - return "" - } - result := make([]byte, 0, len(s)) - for i := 0; i < len(s); i++ { - c := s[i] - if isUpperASCII(c) { - if i != 0 { - result = append(result, '_') - } - if k := i + shortestLen - 1; k < len(s) && isUpperASCII(s[k]) { - if length := commonInitialism.Lookup(s[i:nextIndex(i, len(s))]); length > 0 { - for j, buf := 0, s[i:i+length]; j < len(buf); j++ { - result = append(result, toLowerASCII(buf[j])) - } - i += length - 1 - continue - } - } - } - result = append(result, toLowerASCII(c)) - } - return string(result) -} - -// AddCommonInitialism adds ss to list of common initialisms. -func AddCommonInitialism(ss ...string) { - mu.Lock() - defer mu.Unlock() - for _, s := range ss { - commonInitialismMap[s] = struct{}{} - } - commonInitialisms = keys(commonInitialismMap) - commonInitialism = mustDoubleArray(newDoubleArray(commonInitialisms)) - longestLen = longestLength(commonInitialisms) - shortestLen = shortestLength(commonInitialisms, longestLen) -} - -// DelCommonInitialism deletes ss from list of common initialisms. -func DelCommonInitialism(ss ...string) { - mu.Lock() - defer mu.Unlock() - for _, s := range ss { - delete(commonInitialismMap, s) - } - commonInitialisms = keys(commonInitialismMap) - commonInitialism = mustDoubleArray(newDoubleArray(commonInitialisms)) - longestLen = longestLength(commonInitialisms) - shortestLen = shortestLength(commonInitialisms, longestLen) -} - -func isUpperASCII(c byte) bool { - return 'A' <= c && c <= 'Z' -} - -func isLowerASCII(c byte) bool { - return 'a' <= c && c <= 'z' -} - -func toUpperASCII(c byte) byte { - if isLowerASCII(c) { - return c - ('a' - 'A') - } - return c -} - -func toLowerASCII(c byte) byte { - if isUpperASCII(c) { - return c + 'a' - 'A' - } - return c -} - -func nextIndex(i, maxlen int) int { - if n := i + longestLen; n < maxlen { - return n - } - return maxlen -} - -func keys(m map[string]struct{}) []string { - result := make([]string, 0, len(m)) - for k := range m { - result = append(result, k) - } - return result -} - -func shortestLength(strs []string, shortest int) int { - for _, s := range strs { - if candidate := utf8.RuneCountInString(s); candidate < shortest { - shortest = candidate - } - } - return shortest -} - -func longestLength(strs []string) (longest int) { - for _, s := range strs { - if candidate := utf8.RuneCountInString(s); candidate > longest { - longest = candidate - } - } - return longest -} diff --git a/vendor/github.com/naoina/toml/LICENSE b/vendor/github.com/naoina/toml/LICENSE deleted file mode 100644 index e65039ad84ca..000000000000 --- a/vendor/github.com/naoina/toml/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2014 Naoya Inada - -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/naoina/toml/README.md b/vendor/github.com/naoina/toml/README.md deleted file mode 100644 index 1c01433489b1..000000000000 --- a/vendor/github.com/naoina/toml/README.md +++ /dev/null @@ -1,392 +0,0 @@ -# TOML parser and encoder library for Golang [![Build Status](https://travis-ci.org/naoina/toml.png?branch=master)](https://travis-ci.org/naoina/toml) - -[TOML](https://github.com/toml-lang/toml) parser and encoder library for [Golang](http://golang.org/). - -This library is compatible with TOML version [v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md). - -## Installation - - go get -u github.com/naoina/toml - -## Usage - -The following TOML save as `example.toml`. - -```toml -# This is a TOML document. Boom. - -title = "TOML Example" - -[owner] -name = "Lance Uppercut" -dob = 1979-05-27T07:32:00-08:00 # First class dates? Why not? - -[database] -server = "192.168.1.1" -ports = [ 8001, 8001, 8002 ] -connection_max = 5000 -enabled = true - -[servers] - - # You can indent as you please. Tabs or spaces. TOML don't care. - [servers.alpha] - ip = "10.0.0.1" - dc = "eqdc10" - - [servers.beta] - ip = "10.0.0.2" - dc = "eqdc10" - -[clients] -data = [ ["gamma", "delta"], [1, 2] ] - -# Line breaks are OK when inside arrays -hosts = [ - "alpha", - "omega" -] -``` - -Then above TOML will mapping to `tomlConfig` struct using `toml.Unmarshal`. - -```go -package main - -import ( - "io/ioutil" - "os" - "time" - - "github.com/naoina/toml" -) - -type tomlConfig struct { - Title string - Owner struct { - Name string - Dob time.Time - } - Database struct { - Server string - Ports []int - ConnectionMax uint - Enabled bool - } - Servers map[string]ServerInfo - Clients struct { - Data [][]interface{} - Hosts []string - } -} - -type ServerInfo struct { - IP net.IP - DC string -} - -func main() { - f, err := os.Open("example.toml") - if err != nil { - panic(err) - } - defer f.Close() - var config Config - if err := toml.NewDecoder(f).Decode(&config); err != nil { - panic(err) - } - - // then to use the unmarshaled config... - fmt.Println("IP of server 'alpha':", config.Servers["alpha"].IP) -} -``` - -## Mappings - -A key and value of TOML will map to the corresponding field. -The fields of struct for mapping must be exported. - -The rules of the mapping of key are following: - -#### Exact matching - -```toml -timeout_seconds = 256 -``` - -```go -type Config struct { - Timeout_seconds int -} -``` - -#### Camelcase matching - -```toml -server_name = "srv1" -``` - -```go -type Config struct { - ServerName string -} -``` - -#### Uppercase matching - -```toml -ip = "10.0.0.1" -``` - -```go -type Config struct { - IP string -} -``` - -See the following examples for the value mappings. - -### String - -```toml -val = "string" -``` - -```go -type Config struct { - Val string -} -``` - -### Integer - -```toml -val = 100 -``` - -```go -type Config struct { - Val int -} -``` - -All types that can be used are following: - -* int8 (from `-128` to `127`) -* int16 (from `-32768` to `32767`) -* int32 (from `-2147483648` to `2147483647`) -* int64 (from `-9223372036854775808` to `9223372036854775807`) -* int (same as `int32` on 32bit environment, or `int64` on 64bit environment) -* uint8 (from `0` to `255`) -* uint16 (from `0` to `65535`) -* uint32 (from `0` to `4294967295`) -* uint64 (from `0` to `18446744073709551615`) -* uint (same as `uint` on 32bit environment, or `uint64` on 64bit environment) - -### Float - -```toml -val = 3.1415 -``` - -```go -type Config struct { - Val float32 -} -``` - -All types that can be used are following: - -* float32 -* float64 - -### Boolean - -```toml -val = true -``` - -```go -type Config struct { - Val bool -} -``` - -### Datetime - -```toml -val = 2014-09-28T21:27:39Z -``` - -```go -type Config struct { - Val time.Time -} -``` - -### Array - -```toml -val = ["a", "b", "c"] -``` - -```go -type Config struct { - Val []string -} -``` - -Also following examples all can be mapped: - -```toml -val1 = [1, 2, 3] -val2 = [["a", "b"], ["c", "d"]] -val3 = [[1, 2, 3], ["a", "b", "c"]] -val4 = [[1, 2, 3], [["a", "b"], [true, false]]] -``` - -```go -type Config struct { - Val1 []int - Val2 [][]string - Val3 [][]interface{} - Val4 [][]interface{} -} -``` - -### Table - -```toml -[server] -type = "app" - - [server.development] - ip = "10.0.0.1" - - [server.production] - ip = "10.0.0.2" -``` - -```go -type Config struct { - Server map[string]Server -} - -type Server struct { - IP string -} -``` - -You can also use the following struct instead of map of struct. - -```go -type Config struct { - Server struct { - Development Server - Production Server - } -} - -type Server struct { - IP string -} -``` - -### Array of Tables - -```toml -[[fruit]] - name = "apple" - - [fruit.physical] - color = "red" - shape = "round" - - [[fruit.variety]] - name = "red delicious" - - [[fruit.variety]] - name = "granny smith" - -[[fruit]] - name = "banana" - - [[fruit.variety]] - name = "plantain" -``` - -```go -type Config struct { - Fruit []struct { - Name string - Physical struct { - Color string - Shape string - } - Variety []struct { - Name string - } - } -} -``` - -### Using the `encoding.TextUnmarshaler` interface - -Package toml supports `encoding.TextUnmarshaler` (and `encoding.TextMarshaler`). You can -use it to apply custom marshaling rules for certain types. The `UnmarshalText` method is -called with the value text found in the TOML input. TOML strings are passed unquoted. - -```toml -duration = "10s" -``` - -```go -import time - -type Duration time.Duration - -// UnmarshalText implements encoding.TextUnmarshaler -func (d *Duration) UnmarshalText(data []byte) error { - duration, err := time.ParseDuration(string(data)) - if err == nil { - *d = Duration(duration) - } - return err -} - -// MarshalText implements encoding.TextMarshaler -func (d Duration) MarshalText() ([]byte, error) { - return []byte(time.Duration(d).String()), nil -} - -type ConfigWithDuration struct { - Duration Duration -} -``` -### Using the `toml.UnmarshalerRec` interface - -You can also override marshaling rules specifically for TOML using the `UnmarshalerRec` -and `MarshalerRec` interfaces. These are useful if you want to control how structs or -arrays are handled. You can apply additional validation or set unexported struct fields. - -Note: `encoding.TextUnmarshaler` and `encoding.TextMarshaler` should be preferred for -simple (scalar) values because they're also compatible with other formats like JSON or -YAML. - -[See the UnmarshalerRec example](https://godoc.org/github.com/naoina/toml/#example_UnmarshalerRec). - -### Using the `toml.Unmarshaler` interface - -If you want to deal with raw TOML syntax, use the `Unmarshaler` and `Marshaler` -interfaces. Their input and output is raw TOML syntax. As such, these interfaces are -useful if you want to handle TOML at the syntax level. - -[See the Unmarshaler example](https://godoc.org/github.com/naoina/toml/#example_Unmarshaler). - -## API documentation - -See [Godoc](http://godoc.org/github.com/naoina/toml). - -## License - -MIT diff --git a/vendor/github.com/naoina/toml/ast/ast.go b/vendor/github.com/naoina/toml/ast/ast.go deleted file mode 100644 index 4868e2e1ae2b..000000000000 --- a/vendor/github.com/naoina/toml/ast/ast.go +++ /dev/null @@ -1,192 +0,0 @@ -package ast - -import ( - "strconv" - "strings" - "time" -) - -type Position struct { - Begin int - End int -} - -type Value interface { - Pos() int - End() int - Source() string -} - -type String struct { - Position Position - Value string - Data []rune -} - -func (s *String) Pos() int { - return s.Position.Begin -} - -func (s *String) End() int { - return s.Position.End -} - -func (s *String) Source() string { - return string(s.Data) -} - -type Integer struct { - Position Position - Value string - Data []rune -} - -func (i *Integer) Pos() int { - return i.Position.Begin -} - -func (i *Integer) End() int { - return i.Position.End -} - -func (i *Integer) Source() string { - return string(i.Data) -} - -func (i *Integer) Int() (int64, error) { - return strconv.ParseInt(i.Value, 10, 64) -} - -type Float struct { - Position Position - Value string - Data []rune -} - -func (f *Float) Pos() int { - return f.Position.Begin -} - -func (f *Float) End() int { - return f.Position.End -} - -func (f *Float) Source() string { - return string(f.Data) -} - -func (f *Float) Float() (float64, error) { - return strconv.ParseFloat(f.Value, 64) -} - -type Boolean struct { - Position Position - Value string - Data []rune -} - -func (b *Boolean) Pos() int { - return b.Position.Begin -} - -func (b *Boolean) End() int { - return b.Position.End -} - -func (b *Boolean) Source() string { - return string(b.Data) -} - -func (b *Boolean) Boolean() (bool, error) { - return strconv.ParseBool(b.Value) -} - -type Datetime struct { - Position Position - Value string - Data []rune -} - -func (d *Datetime) Pos() int { - return d.Position.Begin -} - -func (d *Datetime) End() int { - return d.Position.End -} - -func (d *Datetime) Source() string { - return string(d.Data) -} - -func (d *Datetime) Time() (time.Time, error) { - switch { - case !strings.Contains(d.Value, ":"): - return time.Parse("2006-01-02", d.Value) - case !strings.Contains(d.Value, "-"): - return time.Parse("15:04:05.999999999", d.Value) - default: - return time.Parse(time.RFC3339Nano, d.Value) - } -} - -type Array struct { - Position Position - Value []Value - Data []rune -} - -func (a *Array) Pos() int { - return a.Position.Begin -} - -func (a *Array) End() int { - return a.Position.End -} - -func (a *Array) Source() string { - return string(a.Data) -} - -type TableType uint8 - -const ( - TableTypeNormal TableType = iota - TableTypeArray -) - -var tableTypes = [...]string{ - "normal", - "array", -} - -func (t TableType) String() string { - return tableTypes[t] -} - -type Table struct { - Position Position - Line int - Name string - Fields map[string]interface{} - Type TableType - Data []rune -} - -func (t *Table) Pos() int { - return t.Position.Begin -} - -func (t *Table) End() int { - return t.Position.End -} - -func (t *Table) Source() string { - return string(t.Data) -} - -type KeyValue struct { - Key string - Value Value - Line int -} diff --git a/vendor/github.com/naoina/toml/config.go b/vendor/github.com/naoina/toml/config.go deleted file mode 100644 index 06bb9493b89a..000000000000 --- a/vendor/github.com/naoina/toml/config.go +++ /dev/null @@ -1,86 +0,0 @@ -package toml - -import ( - "fmt" - "io" - "reflect" - "strings" - - stringutil "github.com/naoina/go-stringutil" - "github.com/naoina/toml/ast" -) - -// Config contains options for encoding and decoding. -type Config struct { - // NormFieldName is used to match TOML keys to struct fields. The function runs for - // both input keys and struct field names and should return a string that makes the - // two match. You must set this field to use the decoder. - // - // Example: The function in the default config removes _ and lowercases all keys. This - // allows a key called 'api_key' to match the struct field 'APIKey' because both are - // normalized to 'apikey'. - // - // Note that NormFieldName is not used for fields which define a TOML - // key through the struct tag. - NormFieldName func(typ reflect.Type, keyOrField string) string - - // FieldToKey determines the TOML key of a struct field when encoding. - // You must set this field to use the encoder. - // - // Note that FieldToKey is not used for fields which define a TOML - // key through the struct tag. - FieldToKey func(typ reflect.Type, field string) string - - // MissingField, if non-nil, is called when the decoder encounters a key for which no - // matching struct field exists. The default behavior is to return an error. - MissingField func(typ reflect.Type, key string) error -} - -// DefaultConfig contains the default options for encoding and decoding. -// Snake case (i.e. 'foo_bar') is used for key names. -var DefaultConfig = Config{ - NormFieldName: defaultNormFieldName, - FieldToKey: snakeCase, -} - -func defaultNormFieldName(typ reflect.Type, s string) string { - return strings.Replace(strings.ToLower(s), "_", "", -1) -} - -func snakeCase(typ reflect.Type, s string) string { - return stringutil.ToSnakeCase(s) -} - -func defaultMissingField(typ reflect.Type, key string) error { - return fmt.Errorf("field corresponding to `%s' is not defined in %v", key, typ) -} - -// NewEncoder returns a new Encoder that writes to w. -// It is shorthand for DefaultConfig.NewEncoder(w). -func NewEncoder(w io.Writer) *Encoder { - return DefaultConfig.NewEncoder(w) -} - -// Marshal returns the TOML encoding of v. -// It is shorthand for DefaultConfig.Marshal(v). -func Marshal(v interface{}) ([]byte, error) { - return DefaultConfig.Marshal(v) -} - -// Unmarshal parses the TOML data and stores the result in the value pointed to by v. -// It is shorthand for DefaultConfig.Unmarshal(data, v). -func Unmarshal(data []byte, v interface{}) error { - return DefaultConfig.Unmarshal(data, v) -} - -// UnmarshalTable applies the contents of an ast.Table to the value pointed at by v. -// It is shorthand for DefaultConfig.UnmarshalTable(t, v). -func UnmarshalTable(t *ast.Table, v interface{}) error { - return DefaultConfig.UnmarshalTable(t, v) -} - -// NewDecoder returns a new Decoder that reads from r. -// It is shorthand for DefaultConfig.NewDecoder(r). -func NewDecoder(r io.Reader) *Decoder { - return DefaultConfig.NewDecoder(r) -} diff --git a/vendor/github.com/naoina/toml/decode.go b/vendor/github.com/naoina/toml/decode.go deleted file mode 100644 index b3c169eb1c6f..000000000000 --- a/vendor/github.com/naoina/toml/decode.go +++ /dev/null @@ -1,478 +0,0 @@ -// Package toml encodes and decodes the TOML configuration format using reflection. -// -// This library is compatible with TOML version v0.4.0. -package toml - -import ( - "encoding" - "fmt" - "io" - "io/ioutil" - "reflect" - "strconv" - "strings" - "time" - - "github.com/naoina/toml/ast" -) - -const ( - tableSeparator = '.' -) - -var ( - escapeReplacer = strings.NewReplacer( - "\b", "\\n", - "\f", "\\f", - "\n", "\\n", - "\r", "\\r", - "\t", "\\t", - ) - underscoreReplacer = strings.NewReplacer( - "_", "", - ) -) - -var timeType = reflect.TypeOf(time.Time{}) - -// Unmarshal parses the TOML data and stores the result in the value pointed to by v. -// -// Unmarshal will mapped to v that according to following rules: -// -// TOML strings to string -// TOML integers to any int type -// TOML floats to float32 or float64 -// TOML booleans to bool -// TOML datetimes to time.Time -// TOML arrays to any type of slice -// TOML tables to struct or map -// TOML array tables to slice of struct or map -func (cfg *Config) Unmarshal(data []byte, v interface{}) error { - table, err := Parse(data) - if err != nil { - return err - } - if err := cfg.UnmarshalTable(table, v); err != nil { - return err - } - return nil -} - -// A Decoder reads and decodes TOML from an input stream. -type Decoder struct { - r io.Reader - cfg *Config -} - -// NewDecoder returns a new Decoder that reads from r. -// Note that it reads all from r before parsing it. -func (cfg *Config) NewDecoder(r io.Reader) *Decoder { - return &Decoder{r, cfg} -} - -// Decode parses the TOML data from its input and stores it in the value pointed to by v. -// See the documentation for Unmarshal for details about the conversion of TOML into a Go value. -func (d *Decoder) Decode(v interface{}) error { - b, err := ioutil.ReadAll(d.r) - if err != nil { - return err - } - return d.cfg.Unmarshal(b, v) -} - -// UnmarshalerRec may be implemented by types to customize their behavior when being -// unmarshaled from TOML. You can use it to implement custom validation or to set -// unexported fields. -// -// UnmarshalTOML receives a function that can be called to unmarshal the original TOML -// value into a field or variable. It is safe to call the function more than once if -// necessary. -type UnmarshalerRec interface { - UnmarshalTOML(fn func(interface{}) error) error -} - -// Unmarshaler can be used to capture and process raw TOML source of a table or value. -// UnmarshalTOML must copy the input if it wishes to retain it after returning. -// -// Note: this interface is retained for backwards compatibility. You probably want -// to implement encoding.TextUnmarshaler or UnmarshalerRec instead. -type Unmarshaler interface { - UnmarshalTOML(input []byte) error -} - -// UnmarshalTable applies the contents of an ast.Table to the value pointed at by v. -// -// UnmarshalTable will mapped to v that according to following rules: -// -// TOML strings to string -// TOML integers to any int type -// TOML floats to float32 or float64 -// TOML booleans to bool -// TOML datetimes to time.Time -// TOML arrays to any type of slice -// TOML tables to struct or map -// TOML array tables to slice of struct or map -func (cfg *Config) UnmarshalTable(t *ast.Table, v interface{}) error { - rv := reflect.ValueOf(v) - toplevelMap := rv.Kind() == reflect.Map - if (!toplevelMap && rv.Kind() != reflect.Ptr) || rv.IsNil() { - return &invalidUnmarshalError{reflect.TypeOf(v)} - } - return unmarshalTable(cfg, rv, t, toplevelMap) -} - -// used for UnmarshalerRec. -func unmarshalTableOrValue(cfg *Config, rv reflect.Value, av interface{}) error { - if (rv.Kind() != reflect.Ptr && rv.Kind() != reflect.Map) || rv.IsNil() { - return &invalidUnmarshalError{rv.Type()} - } - rv = indirect(rv) - - switch av.(type) { - case *ast.KeyValue, *ast.Table, []*ast.Table: - if err := unmarshalField(cfg, rv, av); err != nil { - return lineError(fieldLineNumber(av), err) - } - return nil - case ast.Value: - return setValue(cfg, rv, av.(ast.Value)) - default: - panic(fmt.Sprintf("BUG: unhandled AST node type %T", av)) - } -} - -// unmarshalTable unmarshals the fields of a table into a struct or map. -// -// toplevelMap is true when rv is an (unadressable) map given to UnmarshalTable. In this -// (special) case, the map is used as-is instead of creating a new map. -func unmarshalTable(cfg *Config, rv reflect.Value, t *ast.Table, toplevelMap bool) error { - rv = indirect(rv) - if err, ok := setUnmarshaler(cfg, rv, t); ok { - return lineError(t.Line, err) - } - switch { - case rv.Kind() == reflect.Struct: - fc := makeFieldCache(cfg, rv.Type()) - for key, fieldAst := range t.Fields { - fv, fieldName, err := fc.findField(cfg, rv, key) - if err != nil { - return lineError(fieldLineNumber(fieldAst), err) - } - if fv.IsValid() { - if err := unmarshalField(cfg, fv, fieldAst); err != nil { - return lineErrorField(fieldLineNumber(fieldAst), rv.Type().String()+"."+fieldName, err) - } - } - } - case rv.Kind() == reflect.Map || isEface(rv): - m := rv - if !toplevelMap { - if rv.Kind() == reflect.Interface { - m = reflect.ValueOf(make(map[string]interface{})) - } else { - m = reflect.MakeMap(rv.Type()) - } - } - elemtyp := m.Type().Elem() - for key, fieldAst := range t.Fields { - kv, err := unmarshalMapKey(m.Type().Key(), key) - if err != nil { - return lineError(fieldLineNumber(fieldAst), err) - } - fv := reflect.New(elemtyp).Elem() - if err := unmarshalField(cfg, fv, fieldAst); err != nil { - return lineError(fieldLineNumber(fieldAst), err) - } - m.SetMapIndex(kv, fv) - } - if !toplevelMap { - rv.Set(m) - } - default: - return lineError(t.Line, &unmarshalTypeError{"table", "struct or map", rv.Type()}) - } - return nil -} - -func fieldLineNumber(fieldAst interface{}) int { - switch av := fieldAst.(type) { - case *ast.KeyValue: - return av.Line - case *ast.Table: - return av.Line - case []*ast.Table: - return av[0].Line - default: - panic(fmt.Sprintf("BUG: unhandled node type %T", fieldAst)) - } -} - -func unmarshalField(cfg *Config, rv reflect.Value, fieldAst interface{}) error { - switch av := fieldAst.(type) { - case *ast.KeyValue: - return setValue(cfg, rv, av.Value) - case *ast.Table: - return unmarshalTable(cfg, rv, av, false) - case []*ast.Table: - rv = indirect(rv) - if err, ok := setUnmarshaler(cfg, rv, fieldAst); ok { - return err - } - var slice reflect.Value - switch { - case rv.Kind() == reflect.Slice: - slice = reflect.MakeSlice(rv.Type(), len(av), len(av)) - case isEface(rv): - slice = reflect.ValueOf(make([]interface{}, len(av))) - default: - return &unmarshalTypeError{"array table", "slice", rv.Type()} - } - for i, tbl := range av { - vv := reflect.New(slice.Type().Elem()).Elem() - if err := unmarshalTable(cfg, vv, tbl, false); err != nil { - return err - } - slice.Index(i).Set(vv) - } - rv.Set(slice) - default: - panic(fmt.Sprintf("BUG: unhandled AST node type %T", av)) - } - return nil -} - -func unmarshalMapKey(typ reflect.Type, key string) (reflect.Value, error) { - rv := reflect.New(typ).Elem() - if u, ok := rv.Addr().Interface().(encoding.TextUnmarshaler); ok { - return rv, u.UnmarshalText([]byte(key)) - } - switch typ.Kind() { - case reflect.String: - rv.SetString(key) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - i, err := strconv.ParseInt(key, 10, int(typ.Size()*8)) - if err != nil { - return rv, convertNumError(typ.Kind(), err) - } - rv.SetInt(i) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - i, err := strconv.ParseUint(key, 10, int(typ.Size()*8)) - if err != nil { - return rv, convertNumError(typ.Kind(), err) - } - rv.SetUint(i) - default: - return rv, fmt.Errorf("invalid map key type %s", typ) - } - return rv, nil -} - -func setValue(cfg *Config, lhs reflect.Value, val ast.Value) error { - lhs = indirect(lhs) - if err, ok := setUnmarshaler(cfg, lhs, val); ok { - return err - } - if err, ok := setTextUnmarshaler(lhs, val); ok { - return err - } - switch v := val.(type) { - case *ast.Integer: - return setInt(lhs, v) - case *ast.Float: - return setFloat(lhs, v) - case *ast.String: - return setString(lhs, v) - case *ast.Boolean: - return setBoolean(lhs, v) - case *ast.Datetime: - return setDatetime(lhs, v) - case *ast.Array: - return setArray(cfg, lhs, v) - default: - panic(fmt.Sprintf("BUG: unhandled node type %T", v)) - } -} - -func indirect(rv reflect.Value) reflect.Value { - for rv.Kind() == reflect.Ptr { - if rv.IsNil() { - rv.Set(reflect.New(rv.Type().Elem())) - } - rv = rv.Elem() - } - return rv -} - -func setUnmarshaler(cfg *Config, lhs reflect.Value, av interface{}) (error, bool) { - if lhs.CanAddr() { - if u, ok := lhs.Addr().Interface().(UnmarshalerRec); ok { - err := u.UnmarshalTOML(func(v interface{}) error { - return unmarshalTableOrValue(cfg, reflect.ValueOf(v), av) - }) - return err, true - } - if u, ok := lhs.Addr().Interface().(Unmarshaler); ok { - return u.UnmarshalTOML(unmarshalerSource(av)), true - } - } - return nil, false -} - -func unmarshalerSource(av interface{}) []byte { - var source []byte - switch av := av.(type) { - case []*ast.Table: - for i, tab := range av { - source = append(source, tab.Source()...) - if i != len(av)-1 { - source = append(source, '\n') - } - } - case ast.Value: - source = []byte(av.Source()) - default: - panic(fmt.Sprintf("BUG: unhandled node type %T", av)) - } - return source -} - -func setTextUnmarshaler(lhs reflect.Value, val ast.Value) (error, bool) { - if !lhs.CanAddr() { - return nil, false - } - u, ok := lhs.Addr().Interface().(encoding.TextUnmarshaler) - if !ok || lhs.Type() == timeType { - return nil, false - } - var data string - switch val := val.(type) { - case *ast.Array: - return &unmarshalTypeError{"array", "", lhs.Type()}, true - case *ast.String: - data = val.Value - default: - data = val.Source() - } - return u.UnmarshalText([]byte(data)), true -} - -func setInt(fv reflect.Value, v *ast.Integer) error { - k := fv.Kind() - switch { - case k >= reflect.Int && k <= reflect.Int64: - i, err := strconv.ParseInt(v.Value, 10, int(fv.Type().Size()*8)) - if err != nil { - return convertNumError(fv.Kind(), err) - } - fv.SetInt(i) - case k >= reflect.Uint && k <= reflect.Uintptr: - i, err := strconv.ParseUint(v.Value, 10, int(fv.Type().Size()*8)) - if err != nil { - return convertNumError(fv.Kind(), err) - } - fv.SetUint(i) - case isEface(fv): - i, err := strconv.ParseInt(v.Value, 10, 64) - if err != nil { - return convertNumError(reflect.Int64, err) - } - fv.Set(reflect.ValueOf(i)) - default: - return &unmarshalTypeError{"integer", "", fv.Type()} - } - return nil -} - -func setFloat(fv reflect.Value, v *ast.Float) error { - f, err := v.Float() - if err != nil { - return err - } - switch { - case fv.Kind() == reflect.Float32 || fv.Kind() == reflect.Float64: - if fv.OverflowFloat(f) { - return &overflowError{fv.Kind(), v.Value} - } - fv.SetFloat(f) - case isEface(fv): - fv.Set(reflect.ValueOf(f)) - default: - return &unmarshalTypeError{"float", "", fv.Type()} - } - return nil -} - -func setString(fv reflect.Value, v *ast.String) error { - switch { - case fv.Kind() == reflect.String: - fv.SetString(v.Value) - case isEface(fv): - fv.Set(reflect.ValueOf(v.Value)) - default: - return &unmarshalTypeError{"string", "", fv.Type()} - } - return nil -} - -func setBoolean(fv reflect.Value, v *ast.Boolean) error { - b, _ := v.Boolean() - switch { - case fv.Kind() == reflect.Bool: - fv.SetBool(b) - case isEface(fv): - fv.Set(reflect.ValueOf(b)) - default: - return &unmarshalTypeError{"boolean", "", fv.Type()} - } - return nil -} - -func setDatetime(rv reflect.Value, v *ast.Datetime) error { - t, err := v.Time() - if err != nil { - return err - } - if !timeType.AssignableTo(rv.Type()) { - return &unmarshalTypeError{"datetime", "", rv.Type()} - } - rv.Set(reflect.ValueOf(t)) - return nil -} - -func setArray(cfg *Config, rv reflect.Value, v *ast.Array) error { - var slicetyp reflect.Type - switch { - case rv.Kind() == reflect.Slice: - slicetyp = rv.Type() - case isEface(rv): - slicetyp = reflect.SliceOf(rv.Type()) - default: - return &unmarshalTypeError{"array", "slice", rv.Type()} - } - - if len(v.Value) == 0 { - // Ensure defined slices are always set to a non-nil value. - rv.Set(reflect.MakeSlice(slicetyp, 0, 0)) - return nil - } - - tomltyp := reflect.TypeOf(v.Value[0]) - slice := reflect.MakeSlice(slicetyp, len(v.Value), len(v.Value)) - typ := slicetyp.Elem() - for i, vv := range v.Value { - if i > 0 && tomltyp != reflect.TypeOf(vv) { - return errArrayMultiType - } - tmp := reflect.New(typ).Elem() - if err := setValue(cfg, tmp, vv); err != nil { - return err - } - slice.Index(i).Set(tmp) - } - rv.Set(slice) - return nil -} - -func isEface(rv reflect.Value) bool { - return rv.Kind() == reflect.Interface && rv.Type().NumMethod() == 0 -} diff --git a/vendor/github.com/naoina/toml/encode.go b/vendor/github.com/naoina/toml/encode.go deleted file mode 100644 index 15602f005a80..000000000000 --- a/vendor/github.com/naoina/toml/encode.go +++ /dev/null @@ -1,404 +0,0 @@ -package toml - -import ( - "bytes" - "encoding" - "fmt" - "io" - "reflect" - "sort" - "strconv" - "time" - - "github.com/naoina/toml/ast" -) - -const ( - tagOmitempty = "omitempty" - tagSkip = "-" -) - -// Marshal returns the TOML encoding of v. -// -// Struct values encode as TOML. Each exported struct field becomes a field of -// the TOML structure unless -// - the field's tag is "-", or -// - the field is empty and its tag specifies the "omitempty" option. -// -// The "toml" key in the struct field's tag value is the key name, followed by -// an optional comma and options. Examples: -// -// // Field is ignored by this package. -// Field int `toml:"-"` -// -// // Field appears in TOML as key "myName". -// Field int `toml:"myName"` -// -// // Field appears in TOML as key "myName" and the field is omitted from the -// // result of encoding if its value is empty. -// Field int `toml:"myName,omitempty"` -// -// // Field appears in TOML as key "field", but the field is skipped if -// // empty. Note the leading comma. -// Field int `toml:",omitempty"` -func (cfg *Config) Marshal(v interface{}) ([]byte, error) { - buf := new(bytes.Buffer) - err := cfg.NewEncoder(buf).Encode(v) - return buf.Bytes(), err -} - -// A Encoder writes TOML to an output stream. -type Encoder struct { - w io.Writer - cfg *Config -} - -// NewEncoder returns a new Encoder that writes to w. -func (cfg *Config) NewEncoder(w io.Writer) *Encoder { - return &Encoder{w, cfg} -} - -// Encode writes the TOML of v to the stream. -// See the documentation for Marshal for details about the conversion of Go values to TOML. -func (e *Encoder) Encode(v interface{}) error { - var ( - buf = &tableBuf{typ: ast.TableTypeNormal} - rv = reflect.ValueOf(v) - err error - ) - - for rv.Kind() == reflect.Ptr { - if rv.IsNil() { - return &marshalNilError{rv.Type()} - } - rv = rv.Elem() - } - - switch rv.Kind() { - case reflect.Struct: - err = buf.structFields(e.cfg, rv) - case reflect.Map: - err = buf.mapFields(e.cfg, rv) - case reflect.Interface: - return e.Encode(rv.Interface()) - default: - err = &marshalTableError{rv.Type()} - } - if err != nil { - return err - } - return buf.writeTo(e.w, "") -} - -// Marshaler can be implemented to override the encoding of TOML values. The returned text -// must be a simple TOML value (i.e. not a table) and is inserted into marshaler output. -// -// This interface exists for backwards-compatibility reasons. You probably want to -// implement encoding.TextMarshaler or MarshalerRec instead. -type Marshaler interface { - MarshalTOML() ([]byte, error) -} - -// MarshalerRec can be implemented to override the TOML encoding of a type. -// The returned value is marshaled in place of the receiver. -type MarshalerRec interface { - MarshalTOML() (interface{}, error) -} - -type tableBuf struct { - name string // already escaped / quoted - body []byte - children []*tableBuf - typ ast.TableType - arrayDepth int -} - -func (b *tableBuf) writeTo(w io.Writer, prefix string) error { - key := b.name // TODO: escape dots - if prefix != "" { - key = prefix + "." + key - } - - if b.name != "" { - head := "[" + key + "]" - if b.typ == ast.TableTypeArray { - head = "[" + head + "]" - } - head += "\n" - if _, err := io.WriteString(w, head); err != nil { - return err - } - } - if _, err := w.Write(b.body); err != nil { - return err - } - - for i, child := range b.children { - if len(b.body) > 0 || i > 0 { - if _, err := w.Write([]byte("\n")); err != nil { - return err - } - } - if err := child.writeTo(w, key); err != nil { - return err - } - } - return nil -} - -func (b *tableBuf) newChild(name string) *tableBuf { - child := &tableBuf{name: quoteName(name), typ: ast.TableTypeNormal} - if b.arrayDepth > 0 { - child.typ = ast.TableTypeArray - } - return child -} - -func (b *tableBuf) addChild(child *tableBuf) { - // Empty table elision: we can avoid writing a table that doesn't have any keys on its - // own. Array tables can't be elided because they define array elements (which would - // be missing if elided). - if len(child.body) == 0 && child.typ == ast.TableTypeNormal { - for _, gchild := range child.children { - gchild.name = child.name + "." + gchild.name - b.addChild(gchild) - } - return - } - b.children = append(b.children, child) -} - -func (b *tableBuf) structFields(cfg *Config, rv reflect.Value) error { - rt := rv.Type() - for i := 0; i < rv.NumField(); i++ { - ft := rt.Field(i) - if ft.PkgPath != "" && !ft.Anonymous { // not exported - continue - } - name, rest := extractTag(ft.Tag.Get(fieldTagName)) - if name == tagSkip { - continue - } - fv := rv.Field(i) - if rest == tagOmitempty && isEmptyValue(fv) { - continue - } - if name == "" { - name = cfg.FieldToKey(rt, ft.Name) - } - if err := b.field(cfg, name, fv); err != nil { - return err - } - } - return nil -} - -type mapKeyList []struct { - key string - value reflect.Value -} - -func (l mapKeyList) Len() int { return len(l) } -func (l mapKeyList) Swap(i, j int) { l[i], l[j] = l[j], l[i] } -func (l mapKeyList) Less(i, j int) bool { return l[i].key < l[j].key } - -func (b *tableBuf) mapFields(cfg *Config, rv reflect.Value) error { - keys := rv.MapKeys() - keylist := make(mapKeyList, len(keys)) - for i, key := range keys { - var err error - keylist[i].key, err = encodeMapKey(key) - if err != nil { - return err - } - keylist[i].value = rv.MapIndex(key) - } - sort.Sort(keylist) - - for _, kv := range keylist { - if err := b.field(cfg, kv.key, kv.value); err != nil { - return err - } - } - return nil -} - -func (b *tableBuf) field(cfg *Config, name string, rv reflect.Value) error { - off := len(b.body) - b.body = append(b.body, quoteName(name)...) - b.body = append(b.body, " = "...) - isTable, err := b.value(cfg, rv, name) - if isTable { - b.body = b.body[:off] // rub out "key =" - } else { - b.body = append(b.body, '\n') - } - return err -} - -func (b *tableBuf) value(cfg *Config, rv reflect.Value, name string) (bool, error) { - isMarshaler, isTable, err := b.marshaler(cfg, rv, name) - if isMarshaler { - return isTable, err - } - switch rv.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - b.body = strconv.AppendInt(b.body, rv.Int(), 10) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - b.body = strconv.AppendUint(b.body, rv.Uint(), 10) - case reflect.Float32, reflect.Float64: - b.body = strconv.AppendFloat(b.body, rv.Float(), 'e', -1, 64) - case reflect.Bool: - b.body = strconv.AppendBool(b.body, rv.Bool()) - case reflect.String: - b.body = strconv.AppendQuote(b.body, rv.String()) - case reflect.Ptr, reflect.Interface: - if rv.IsNil() { - return false, &marshalNilError{rv.Type()} - } - return b.value(cfg, rv.Elem(), name) - case reflect.Slice, reflect.Array: - rvlen := rv.Len() - if rvlen == 0 { - b.body = append(b.body, '[', ']') - return false, nil - } - - b.arrayDepth++ - wroteElem := false - b.body = append(b.body, '[') - for i := 0; i < rvlen; i++ { - isTable, err := b.value(cfg, rv.Index(i), name) - if err != nil { - return isTable, err - } - wroteElem = wroteElem || !isTable - if wroteElem { - if i < rvlen-1 { - b.body = append(b.body, ',', ' ') - } else { - b.body = append(b.body, ']') - } - } - } - if !wroteElem { - b.body = b.body[:len(b.body)-1] // rub out '[' - } - b.arrayDepth-- - return !wroteElem, nil - case reflect.Struct: - child := b.newChild(name) - err := child.structFields(cfg, rv) - b.addChild(child) - return true, err - case reflect.Map: - child := b.newChild(name) - err := child.mapFields(cfg, rv) - b.addChild(child) - return true, err - default: - return false, fmt.Errorf("toml: marshal: unsupported type %v", rv.Kind()) - } - return false, nil -} - -func (b *tableBuf) marshaler(cfg *Config, rv reflect.Value, name string) (handled, isTable bool, err error) { - switch t := rv.Interface().(type) { - case encoding.TextMarshaler: - enc, err := t.MarshalText() - if err != nil { - return true, false, err - } - b.body = encodeTextMarshaler(b.body, string(enc)) - return true, false, nil - case MarshalerRec: - newval, err := t.MarshalTOML() - if err != nil { - return true, false, err - } - isTable, err = b.value(cfg, reflect.ValueOf(newval), name) - return true, isTable, err - case Marshaler: - enc, err := t.MarshalTOML() - if err != nil { - return true, false, err - } - b.body = append(b.body, enc...) - return true, false, nil - } - return false, false, nil -} - -func encodeTextMarshaler(buf []byte, v string) []byte { - // Emit the value without quotes if possible. - if v == "true" || v == "false" { - return append(buf, v...) - } else if _, err := time.Parse(time.RFC3339Nano, v); err == nil { - return append(buf, v...) - } else if _, err := strconv.ParseInt(v, 10, 64); err == nil { - return append(buf, v...) - } else if _, err := strconv.ParseUint(v, 10, 64); err == nil { - return append(buf, v...) - } else if _, err := strconv.ParseFloat(v, 64); err == nil { - return append(buf, v...) - } - return strconv.AppendQuote(buf, v) -} - -func encodeMapKey(rv reflect.Value) (string, error) { - if rv.Kind() == reflect.String { - return rv.String(), nil - } - if tm, ok := rv.Interface().(encoding.TextMarshaler); ok { - b, err := tm.MarshalText() - return string(b), err - } - switch rv.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return strconv.FormatInt(rv.Int(), 10), nil - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return strconv.FormatUint(rv.Uint(), 10), nil - } - return "", fmt.Errorf("toml: invalid map key type %v", rv.Type()) -} - -func isEmptyValue(v reflect.Value) bool { - switch v.Kind() { - case reflect.Array: - // encoding/json treats all arrays with non-zero length as non-empty. We check the - // array content here because zero-length arrays are almost never used. - len := v.Len() - for i := 0; i < len; i++ { - if !isEmptyValue(v.Index(i)) { - return false - } - } - return true - case reflect.Map, reflect.Slice, reflect.String: - return v.Len() == 0 - case reflect.Bool: - return !v.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Interface, reflect.Ptr: - return v.IsNil() - } - return false -} - -func quoteName(s string) string { - if len(s) == 0 { - return strconv.Quote(s) - } - for _, r := range s { - if r >= '0' && r <= '9' || r >= 'A' && r <= 'Z' || r >= 'a' && r <= 'z' || r == '-' || r == '_' { - continue - } - return strconv.Quote(s) - } - return s -} diff --git a/vendor/github.com/naoina/toml/error.go b/vendor/github.com/naoina/toml/error.go deleted file mode 100644 index cb73b5e0aa46..000000000000 --- a/vendor/github.com/naoina/toml/error.go +++ /dev/null @@ -1,107 +0,0 @@ -package toml - -import ( - "errors" - "fmt" - "reflect" - "strconv" -) - -var ( - errArrayMultiType = errors.New("array can't contain multiple types") -) - -// LineError is returned by Unmarshal, UnmarshalTable and Parse -// if the error is local to a line. -type LineError struct { - Line int - StructField string - Err error -} - -func (err *LineError) Error() string { - field := "" - if err.StructField != "" { - field = "(" + err.StructField + ") " - } - return fmt.Sprintf("line %d: %s%v", err.Line, field, err.Err) -} - -func lineError(line int, err error) error { - if err == nil { - return nil - } - if _, ok := err.(*LineError); ok { - return err - } - return &LineError{Line: line, Err: err} -} - -func lineErrorField(line int, field string, err error) error { - if lerr, ok := err.(*LineError); ok { - return lerr - } else if err != nil { - err = &LineError{Line: line, StructField: field, Err: err} - } - return err -} - -type overflowError struct { - kind reflect.Kind - v string -} - -func (err *overflowError) Error() string { - return fmt.Sprintf("value %s is out of range for %v", err.v, err.kind) -} - -func convertNumError(kind reflect.Kind, err error) error { - if numerr, ok := err.(*strconv.NumError); ok && numerr.Err == strconv.ErrRange { - return &overflowError{kind, numerr.Num} - } - return err -} - -type invalidUnmarshalError struct { - typ reflect.Type -} - -func (err *invalidUnmarshalError) Error() string { - if err.typ == nil { - return "toml: Unmarshal(nil)" - } - if err.typ.Kind() != reflect.Ptr { - return "toml: Unmarshal(non-pointer " + err.typ.String() + ")" - } - return "toml: Unmarshal(nil " + err.typ.String() + ")" -} - -type unmarshalTypeError struct { - what string - want string - typ reflect.Type -} - -func (err *unmarshalTypeError) Error() string { - msg := fmt.Sprintf("cannot unmarshal TOML %s into %s", err.what, err.typ) - if err.want != "" { - msg += " (need " + err.want + ")" - } - return msg -} - -type marshalNilError struct { - typ reflect.Type -} - -func (err *marshalNilError) Error() string { - return fmt.Sprintf("toml: cannot marshal nil %s", err.typ) -} - -type marshalTableError struct { - typ reflect.Type -} - -func (err *marshalTableError) Error() string { - return fmt.Sprintf("toml: cannot marshal %s as table, want struct or map type", err.typ) -} diff --git a/vendor/github.com/naoina/toml/parse.go b/vendor/github.com/naoina/toml/parse.go deleted file mode 100644 index de9108566b82..000000000000 --- a/vendor/github.com/naoina/toml/parse.go +++ /dev/null @@ -1,362 +0,0 @@ -package toml - -import ( - "errors" - "fmt" - "strconv" - "strings" - - "github.com/naoina/toml/ast" -) - -// The parser is generated by github.com/pointlander/peg. To regenerate it, do: -// -// go get -u github.com/pointlander/peg -// go generate . - -//go:generate peg -switch -inline parse.peg - -var errParse = errors.New("invalid TOML syntax") - -// Parse returns an AST representation of TOML. -// The toplevel is represented by a table. -func Parse(data []byte) (*ast.Table, error) { - d := &parseState{p: &tomlParser{Buffer: string(data)}} - d.init() - - if err := d.parse(); err != nil { - return nil, err - } - - return d.p.toml.table, nil -} - -type parseState struct { - p *tomlParser -} - -func (d *parseState) init() { - d.p.Init() - d.p.toml.init(d.p.buffer) -} - -func (d *parseState) parse() error { - if err := d.p.Parse(); err != nil { - if err, ok := err.(*parseError); ok { - return lineError(err.Line(), errParse) - } - return err - } - return d.execute() -} - -func (d *parseState) execute() (err error) { - defer func() { - if e := recover(); e != nil { - lerr, ok := e.(*LineError) - if !ok { - panic(e) - } - err = lerr - } - }() - d.p.Execute() - return nil -} - -func (e *parseError) Line() int { - tokens := []token32{e.max} - positions, p := make([]int, 2*len(tokens)), 0 - for _, token := range tokens { - positions[p], p = int(token.begin), p+1 - positions[p], p = int(token.end), p+1 - } - for _, t := range translatePositions(e.p.buffer, positions) { - if e.p.line < t.line { - e.p.line = t.line - } - } - return e.p.line -} - -type stack struct { - key string - table *ast.Table -} - -type array struct { - parent *array - child *array - current *ast.Array - line int -} - -type toml struct { - table *ast.Table - line int - currentTable *ast.Table - s string - key string - tableKeys []string - val ast.Value - arr *array - stack []*stack - skip bool -} - -func (p *toml) init(data []rune) { - p.line = 1 - p.table = p.newTable(ast.TableTypeNormal, "") - p.table.Position.End = len(data) - 1 - p.table.Data = data[:len(data)-1] // truncate the end_symbol added by PEG parse generator. - p.currentTable = p.table -} - -func (p *toml) Error(err error) { - panic(lineError(p.line, err)) -} - -func (p *tomlParser) SetTime(begin, end int) { - p.val = &ast.Datetime{ - Position: ast.Position{Begin: begin, End: end}, - Data: p.buffer[begin:end], - Value: string(p.buffer[begin:end]), - } -} - -func (p *tomlParser) SetFloat64(begin, end int) { - p.val = &ast.Float{ - Position: ast.Position{Begin: begin, End: end}, - Data: p.buffer[begin:end], - Value: underscoreReplacer.Replace(string(p.buffer[begin:end])), - } -} - -func (p *tomlParser) SetInt64(begin, end int) { - p.val = &ast.Integer{ - Position: ast.Position{Begin: begin, End: end}, - Data: p.buffer[begin:end], - Value: underscoreReplacer.Replace(string(p.buffer[begin:end])), - } -} - -func (p *tomlParser) SetString(begin, end int) { - p.val = &ast.String{ - Position: ast.Position{Begin: begin, End: end}, - Data: p.buffer[begin:end], - Value: p.s, - } - p.s = "" -} - -func (p *tomlParser) SetBool(begin, end int) { - p.val = &ast.Boolean{ - Position: ast.Position{Begin: begin, End: end}, - Data: p.buffer[begin:end], - Value: string(p.buffer[begin:end]), - } -} - -func (p *tomlParser) StartArray() { - if p.arr == nil { - p.arr = &array{line: p.line, current: &ast.Array{}} - return - } - p.arr.child = &array{parent: p.arr, line: p.line, current: &ast.Array{}} - p.arr = p.arr.child -} - -func (p *tomlParser) AddArrayVal() { - if p.arr.current == nil { - p.arr.current = &ast.Array{} - } - p.arr.current.Value = append(p.arr.current.Value, p.val) -} - -func (p *tomlParser) SetArray(begin, end int) { - p.arr.current.Position = ast.Position{Begin: begin, End: end} - p.arr.current.Data = p.buffer[begin:end] - p.val = p.arr.current - p.arr = p.arr.parent -} - -func (p *toml) SetTable(buf []rune, begin, end int) { - rawName := string(buf[begin:end]) - p.setTable(p.table, rawName, p.tableKeys) - p.tableKeys = nil -} - -func (p *toml) setTable(parent *ast.Table, name string, names []string) { - parent, err := p.lookupTable(parent, names[:len(names)-1]) - if err != nil { - p.Error(err) - } - last := names[len(names)-1] - tbl := p.newTable(ast.TableTypeNormal, last) - switch v := parent.Fields[last].(type) { - case nil: - parent.Fields[last] = tbl - case []*ast.Table: - p.Error(fmt.Errorf("table `%s' is in conflict with array table in line %d", name, v[0].Line)) - case *ast.Table: - if (v.Position == ast.Position{}) { - // This table was created as an implicit parent. - // Replace it with the real defined table. - tbl.Fields = v.Fields - parent.Fields[last] = tbl - } else { - p.Error(fmt.Errorf("table `%s' is in conflict with table in line %d", name, v.Line)) - } - case *ast.KeyValue: - p.Error(fmt.Errorf("table `%s' is in conflict with line %d", name, v.Line)) - default: - p.Error(fmt.Errorf("BUG: table `%s' is in conflict but it's unknown type `%T'", last, v)) - } - p.currentTable = tbl -} - -func (p *toml) newTable(typ ast.TableType, name string) *ast.Table { - return &ast.Table{ - Line: p.line, - Name: name, - Type: typ, - Fields: make(map[string]interface{}), - } -} - -func (p *tomlParser) SetTableString(begin, end int) { - p.currentTable.Data = p.buffer[begin:end] - p.currentTable.Position.Begin = begin - p.currentTable.Position.End = end -} - -func (p *toml) SetArrayTable(buf []rune, begin, end int) { - rawName := string(buf[begin:end]) - p.setArrayTable(p.table, rawName, p.tableKeys) - p.tableKeys = nil -} - -func (p *toml) setArrayTable(parent *ast.Table, name string, names []string) { - parent, err := p.lookupTable(parent, names[:len(names)-1]) - if err != nil { - p.Error(err) - } - last := names[len(names)-1] - tbl := p.newTable(ast.TableTypeArray, last) - switch v := parent.Fields[last].(type) { - case nil: - parent.Fields[last] = []*ast.Table{tbl} - case []*ast.Table: - parent.Fields[last] = append(v, tbl) - case *ast.Table: - p.Error(fmt.Errorf("array table `%s' is in conflict with table in line %d", name, v.Line)) - case *ast.KeyValue: - p.Error(fmt.Errorf("array table `%s' is in conflict with line %d", name, v.Line)) - default: - p.Error(fmt.Errorf("BUG: array table `%s' is in conflict but it's unknown type `%T'", name, v)) - } - p.currentTable = tbl -} - -func (p *toml) StartInlineTable() { - p.skip = false - p.stack = append(p.stack, &stack{p.key, p.currentTable}) - names := []string{p.key} - if p.arr == nil { - p.setTable(p.currentTable, names[0], names) - } else { - p.setArrayTable(p.currentTable, names[0], names) - } -} - -func (p *toml) EndInlineTable() { - st := p.stack[len(p.stack)-1] - p.key, p.currentTable = st.key, st.table - p.stack[len(p.stack)-1] = nil - p.stack = p.stack[:len(p.stack)-1] - p.skip = true -} - -func (p *toml) AddLineCount(i int) { - p.line += i -} - -func (p *toml) SetKey(buf []rune, begin, end int) { - p.key = string(buf[begin:end]) - if len(p.key) > 0 && p.key[0] == '"' { - p.key = p.unquote(p.key) - } -} - -func (p *toml) AddTableKey() { - p.tableKeys = append(p.tableKeys, p.key) -} - -func (p *toml) AddKeyValue() { - if p.skip { - p.skip = false - return - } - if val, exists := p.currentTable.Fields[p.key]; exists { - switch v := val.(type) { - case *ast.Table: - p.Error(fmt.Errorf("key `%s' is in conflict with table in line %d", p.key, v.Line)) - case *ast.KeyValue: - p.Error(fmt.Errorf("key `%s' is in conflict with line %xd", p.key, v.Line)) - default: - p.Error(fmt.Errorf("BUG: key `%s' is in conflict but it's unknown type `%T'", p.key, v)) - } - } - p.currentTable.Fields[p.key] = &ast.KeyValue{Key: p.key, Value: p.val, Line: p.line} -} - -func (p *toml) SetBasicString(buf []rune, begin, end int) { - p.s = p.unquote(string(buf[begin:end])) -} - -func (p *toml) SetMultilineString() { - p.s = p.unquote(`"` + escapeReplacer.Replace(strings.TrimLeft(p.s, "\r\n")) + `"`) -} - -func (p *toml) AddMultilineBasicBody(buf []rune, begin, end int) { - p.s += string(buf[begin:end]) -} - -func (p *toml) SetLiteralString(buf []rune, begin, end int) { - p.s = string(buf[begin:end]) -} - -func (p *toml) SetMultilineLiteralString(buf []rune, begin, end int) { - p.s = strings.TrimLeft(string(buf[begin:end]), "\r\n") -} - -func (p *toml) unquote(s string) string { - s, err := strconv.Unquote(s) - if err != nil { - p.Error(err) - } - return s -} - -func (p *toml) lookupTable(t *ast.Table, keys []string) (*ast.Table, error) { - for _, s := range keys { - val, exists := t.Fields[s] - if !exists { - tbl := p.newTable(ast.TableTypeNormal, s) - t.Fields[s] = tbl - t = tbl - continue - } - switch v := val.(type) { - case *ast.Table: - t = v - case []*ast.Table: - t = v[len(v)-1] - case *ast.KeyValue: - return nil, fmt.Errorf("key `%s' is in conflict with line %d", s, v.Line) - default: - return nil, fmt.Errorf("BUG: key `%s' is in conflict but it's unknown type `%T'", s, v) - } - } - return t, nil -} diff --git a/vendor/github.com/naoina/toml/parse.peg b/vendor/github.com/naoina/toml/parse.peg deleted file mode 100644 index 860ada3732c2..000000000000 --- a/vendor/github.com/naoina/toml/parse.peg +++ /dev/null @@ -1,147 +0,0 @@ -package toml - -type tomlParser Peg { - toml -} - -TOML <- Expression (newline Expression)* newline? !. { _ = buffer } - -Expression <- ( - { p.SetTableString(begin, end) } - / ws keyval ws comment? - / ws comment? - / ws -) - -newline <- <[\r\n]+> { p.AddLineCount(end - begin) } - -ws <- [ \t]* -wsnl <- ( - [ \t] - / <[\r\n]> { p.AddLineCount(end - begin) } -)* - -comment <- '#' <[\t -\0x10FFFF]*> - -keyval <- key ws '=' ws val { p.AddKeyValue() } - -key <- bareKey / quotedKey - -bareKey <- <[0-9A-Za-z\-_]+> { p.SetKey(p.buffer, begin, end) } - -quotedKey <- < '"' basicChar* '"' > { p.SetKey(p.buffer, begin, end) } - -val <- ( - { p.SetTime(begin, end) } - / { p.SetFloat64(begin, end) } - / { p.SetInt64(begin, end) } - / { p.SetString(begin, end) } - / { p.SetBool(begin, end) } - / { p.SetArray(begin, end) } - / inlineTable -) - -table <- stdTable / arrayTable - -stdTable <- '[' ws ws ']' { p.SetTable(p.buffer, begin, end) } - -arrayTable <- '[[' ws ws ']]' { p.SetArrayTable(p.buffer, begin, end) } - -inlineTable <- ( - '{' { p.StartInlineTable() } - ws inlineTableKeyValues ws - '}' { p.EndInlineTable() } -) - -inlineTableKeyValues <- (keyval inlineTableValSep?)* - -tableKey <- tableKeyComp (tableKeySep tableKeyComp)* - -tableKeyComp <- key { p.AddTableKey() } - -tableKeySep <- ws '.' ws - -inlineTableValSep <- ws ',' ws - -integer <- [\-+]? int -int <- [1-9] (digit / '_' digit)+ / digit - -float <- integer (frac exp? / frac? exp) -frac <- '.' digit (digit / '_' digit)* -exp <- [eE] [\-+]? digit (digit / '_' digit)* - -string <- ( - mlLiteralString - / literalString - / mlBasicString - / basicString -) - -basicString <- <'"' basicChar* '"'> { p.SetBasicString(p.buffer, begin, end) } - -basicChar <- basicUnescaped / escaped -escaped <- escape ([btnfr"/\\] / 'u' hexQuad / 'U' hexQuad hexQuad) - -basicUnescaped <- [ -!#-\[\]-\0x10FFFF] - -escape <- '\\' - -mlBasicString <- '"""' mlBasicBody '"""' { p.SetMultilineString() } - -mlBasicBody <- ( - { p.AddMultilineBasicBody(p.buffer, begin, end) } - / escape newline wsnl -)* - -literalString <- "'" "'" { p.SetLiteralString(p.buffer, begin, end) } - -literalChar <- [\t -&(-\0x10FFFF] - -mlLiteralString <- "'''" "'''" { p.SetMultilineLiteralString(p.buffer, begin, end) } - -mlLiteralBody <- (!"'''" (mlLiteralChar / newline))* - -mlLiteralChar <- [\t -\0x10FFFF] - -hexdigit <- [0-9A-Fa-f] -hexQuad <- hexdigit hexdigit hexdigit hexdigit - -boolean <- 'true' / 'false' - -dateFullYear <- digitQuad -dateMonth <- digitDual -dateMDay <- digitDual -timeHour <- digitDual -timeMinute <- digitDual -timeSecond <- digitDual -timeSecfrac <- '.' digit+ -timeNumoffset <- [\-+] timeHour ':' timeMinute -timeOffset <- 'Z' / timeNumoffset -partialTime <- timeHour ':' timeMinute ':' timeSecond timeSecfrac? -fullDate <- dateFullYear '-' dateMonth '-' dateMDay -fullTime <- partialTime timeOffset? -datetime <- (fullDate ('T' fullTime)?) / partialTime - -digit <- [0-9] -digitDual <- digit digit -digitQuad <- digitDual digitDual - -array <- ( - '[' { p.StartArray() } - wsnl arrayValues? wsnl - ']' -) - -arrayValues <- ( - val { p.AddArrayVal() } - ( - wsnl comment? - wsnl arraySep - wsnl comment? - wsnl val { p.AddArrayVal() } - )* - wsnl arraySep? - wsnl comment? -) - -arraySep <- ',' diff --git a/vendor/github.com/naoina/toml/parse.peg.go b/vendor/github.com/naoina/toml/parse.peg.go deleted file mode 100644 index fa377b19bd74..000000000000 --- a/vendor/github.com/naoina/toml/parse.peg.go +++ /dev/null @@ -1,2586 +0,0 @@ -package toml - -import ( - "fmt" - "math" - "sort" - "strconv" -) - -const endSymbol rune = 1114112 - -/* The rule types inferred from the grammar are below. */ -type pegRule uint8 - -const ( - ruleUnknown pegRule = iota - ruleTOML - ruleExpression - rulenewline - rulews - rulewsnl - rulecomment - rulekeyval - rulekey - rulebareKey - rulequotedKey - ruleval - ruletable - rulestdTable - rulearrayTable - ruleinlineTable - ruleinlineTableKeyValues - ruletableKey - ruletableKeyComp - ruletableKeySep - ruleinlineTableValSep - ruleinteger - ruleint - rulefloat - rulefrac - ruleexp - rulestring - rulebasicString - rulebasicChar - ruleescaped - rulebasicUnescaped - ruleescape - rulemlBasicString - rulemlBasicBody - ruleliteralString - ruleliteralChar - rulemlLiteralString - rulemlLiteralBody - rulemlLiteralChar - rulehexdigit - rulehexQuad - ruleboolean - ruledateFullYear - ruledateMonth - ruledateMDay - ruletimeHour - ruletimeMinute - ruletimeSecond - ruletimeSecfrac - ruletimeNumoffset - ruletimeOffset - rulepartialTime - rulefullDate - rulefullTime - ruledatetime - ruledigit - ruledigitDual - ruledigitQuad - rulearray - rulearrayValues - rulearraySep - ruleAction0 - rulePegText - ruleAction1 - ruleAction2 - ruleAction3 - ruleAction4 - ruleAction5 - ruleAction6 - ruleAction7 - ruleAction8 - ruleAction9 - ruleAction10 - ruleAction11 - ruleAction12 - ruleAction13 - ruleAction14 - ruleAction15 - ruleAction16 - ruleAction17 - ruleAction18 - ruleAction19 - ruleAction20 - ruleAction21 - ruleAction22 - ruleAction23 - ruleAction24 - ruleAction25 -) - -var rul3s = [...]string{ - "Unknown", - "TOML", - "Expression", - "newline", - "ws", - "wsnl", - "comment", - "keyval", - "key", - "bareKey", - "quotedKey", - "val", - "table", - "stdTable", - "arrayTable", - "inlineTable", - "inlineTableKeyValues", - "tableKey", - "tableKeyComp", - "tableKeySep", - "inlineTableValSep", - "integer", - "int", - "float", - "frac", - "exp", - "string", - "basicString", - "basicChar", - "escaped", - "basicUnescaped", - "escape", - "mlBasicString", - "mlBasicBody", - "literalString", - "literalChar", - "mlLiteralString", - "mlLiteralBody", - "mlLiteralChar", - "hexdigit", - "hexQuad", - "boolean", - "dateFullYear", - "dateMonth", - "dateMDay", - "timeHour", - "timeMinute", - "timeSecond", - "timeSecfrac", - "timeNumoffset", - "timeOffset", - "partialTime", - "fullDate", - "fullTime", - "datetime", - "digit", - "digitDual", - "digitQuad", - "array", - "arrayValues", - "arraySep", - "Action0", - "PegText", - "Action1", - "Action2", - "Action3", - "Action4", - "Action5", - "Action6", - "Action7", - "Action8", - "Action9", - "Action10", - "Action11", - "Action12", - "Action13", - "Action14", - "Action15", - "Action16", - "Action17", - "Action18", - "Action19", - "Action20", - "Action21", - "Action22", - "Action23", - "Action24", - "Action25", -} - -type token32 struct { - pegRule - begin, end uint32 -} - -func (t *token32) String() string { - return fmt.Sprintf("\x1B[34m%v\x1B[m %v %v", rul3s[t.pegRule], t.begin, t.end) -} - -type node32 struct { - token32 - up, next *node32 -} - -func (node *node32) print(pretty bool, buffer string) { - var print func(node *node32, depth int) - print = func(node *node32, depth int) { - for node != nil { - for c := 0; c < depth; c++ { - fmt.Printf(" ") - } - rule := rul3s[node.pegRule] - quote := strconv.Quote(string(([]rune(buffer)[node.begin:node.end]))) - if !pretty { - fmt.Printf("%v %v\n", rule, quote) - } else { - fmt.Printf("\x1B[34m%v\x1B[m %v\n", rule, quote) - } - if node.up != nil { - print(node.up, depth+1) - } - node = node.next - } - } - print(node, 0) -} - -func (node *node32) Print(buffer string) { - node.print(false, buffer) -} - -func (node *node32) PrettyPrint(buffer string) { - node.print(true, buffer) -} - -type tokens32 struct { - tree []token32 -} - -func (t *tokens32) Trim(length uint32) { - t.tree = t.tree[:length] -} - -func (t *tokens32) Print() { - for _, token := range t.tree { - fmt.Println(token.String()) - } -} - -func (t *tokens32) AST() *node32 { - type element struct { - node *node32 - down *element - } - tokens := t.Tokens() - var stack *element - for _, token := range tokens { - if token.begin == token.end { - continue - } - node := &node32{token32: token} - for stack != nil && stack.node.begin >= token.begin && stack.node.end <= token.end { - stack.node.next = node.up - node.up = stack.node - stack = stack.down - } - stack = &element{node: node, down: stack} - } - if stack != nil { - return stack.node - } - return nil -} - -func (t *tokens32) PrintSyntaxTree(buffer string) { - t.AST().Print(buffer) -} - -func (t *tokens32) PrettyPrintSyntaxTree(buffer string) { - t.AST().PrettyPrint(buffer) -} - -func (t *tokens32) Add(rule pegRule, begin, end, index uint32) { - if tree := t.tree; int(index) >= len(tree) { - expanded := make([]token32, 2*len(tree)) - copy(expanded, tree) - t.tree = expanded - } - t.tree[index] = token32{ - pegRule: rule, - begin: begin, - end: end, - } -} - -func (t *tokens32) Tokens() []token32 { - return t.tree -} - -type tomlParser struct { - toml - - Buffer string - buffer []rune - rules [88]func() bool - parse func(rule ...int) error - reset func() - Pretty bool - tokens32 -} - -func (p *tomlParser) Parse(rule ...int) error { - return p.parse(rule...) -} - -func (p *tomlParser) Reset() { - p.reset() -} - -type textPosition struct { - line, symbol int -} - -type textPositionMap map[int]textPosition - -func translatePositions(buffer []rune, positions []int) textPositionMap { - length, translations, j, line, symbol := len(positions), make(textPositionMap, len(positions)), 0, 1, 0 - sort.Ints(positions) - -search: - for i, c := range buffer { - if c == '\n' { - line, symbol = line+1, 0 - } else { - symbol++ - } - if i == positions[j] { - translations[positions[j]] = textPosition{line, symbol} - for j++; j < length; j++ { - if i != positions[j] { - continue search - } - } - break search - } - } - - return translations -} - -type parseError struct { - p *tomlParser - max token32 -} - -func (e *parseError) Error() string { - tokens, error := []token32{e.max}, "\n" - positions, p := make([]int, 2*len(tokens)), 0 - for _, token := range tokens { - positions[p], p = int(token.begin), p+1 - positions[p], p = int(token.end), p+1 - } - translations := translatePositions(e.p.buffer, positions) - format := "parse error near %v (line %v symbol %v - line %v symbol %v):\n%v\n" - if e.p.Pretty { - format = "parse error near \x1B[34m%v\x1B[m (line %v symbol %v - line %v symbol %v):\n%v\n" - } - for _, token := range tokens { - begin, end := int(token.begin), int(token.end) - error += fmt.Sprintf(format, - rul3s[token.pegRule], - translations[begin].line, translations[begin].symbol, - translations[end].line, translations[end].symbol, - strconv.Quote(string(e.p.buffer[begin:end]))) - } - - return error -} - -func (p *tomlParser) PrintSyntaxTree() { - if p.Pretty { - p.tokens32.PrettyPrintSyntaxTree(p.Buffer) - } else { - p.tokens32.PrintSyntaxTree(p.Buffer) - } -} - -func (p *tomlParser) Execute() { - buffer, _buffer, text, begin, end := p.Buffer, p.buffer, "", 0, 0 - for _, token := range p.Tokens() { - switch token.pegRule { - - case rulePegText: - begin, end = int(token.begin), int(token.end) - text = string(_buffer[begin:end]) - - case ruleAction0: - _ = buffer - case ruleAction1: - p.SetTableString(begin, end) - case ruleAction2: - p.AddLineCount(end - begin) - case ruleAction3: - p.AddLineCount(end - begin) - case ruleAction4: - p.AddKeyValue() - case ruleAction5: - p.SetKey(p.buffer, begin, end) - case ruleAction6: - p.SetKey(p.buffer, begin, end) - case ruleAction7: - p.SetTime(begin, end) - case ruleAction8: - p.SetFloat64(begin, end) - case ruleAction9: - p.SetInt64(begin, end) - case ruleAction10: - p.SetString(begin, end) - case ruleAction11: - p.SetBool(begin, end) - case ruleAction12: - p.SetArray(begin, end) - case ruleAction13: - p.SetTable(p.buffer, begin, end) - case ruleAction14: - p.SetArrayTable(p.buffer, begin, end) - case ruleAction15: - p.StartInlineTable() - case ruleAction16: - p.EndInlineTable() - case ruleAction17: - p.AddTableKey() - case ruleAction18: - p.SetBasicString(p.buffer, begin, end) - case ruleAction19: - p.SetMultilineString() - case ruleAction20: - p.AddMultilineBasicBody(p.buffer, begin, end) - case ruleAction21: - p.SetLiteralString(p.buffer, begin, end) - case ruleAction22: - p.SetMultilineLiteralString(p.buffer, begin, end) - case ruleAction23: - p.StartArray() - case ruleAction24: - p.AddArrayVal() - case ruleAction25: - p.AddArrayVal() - - } - } - _, _, _, _, _ = buffer, _buffer, text, begin, end -} - -func (p *tomlParser) Init() { - var ( - max token32 - position, tokenIndex uint32 - buffer []rune - ) - p.reset = func() { - max = token32{} - position, tokenIndex = 0, 0 - - p.buffer = []rune(p.Buffer) - if len(p.buffer) == 0 || p.buffer[len(p.buffer)-1] != endSymbol { - p.buffer = append(p.buffer, endSymbol) - } - buffer = p.buffer - } - p.reset() - - _rules := p.rules - tree := tokens32{tree: make([]token32, math.MaxInt16)} - p.parse = func(rule ...int) error { - r := 1 - if len(rule) > 0 { - r = rule[0] - } - matches := p.rules[r]() - p.tokens32 = tree - if matches { - p.Trim(tokenIndex) - return nil - } - return &parseError{p, max} - } - - add := func(rule pegRule, begin uint32) { - tree.Add(rule, begin, position, tokenIndex) - tokenIndex++ - if begin != position && position > max.end { - max = token32{rule, begin, position} - } - } - - matchDot := func() bool { - if buffer[position] != endSymbol { - position++ - return true - } - return false - } - - /*matchChar := func(c byte) bool { - if buffer[position] == c { - position++ - return true - } - return false - }*/ - - /*matchRange := func(lower byte, upper byte) bool { - if c := buffer[position]; c >= lower && c <= upper { - position++ - return true - } - return false - }*/ - - _rules = [...]func() bool{ - nil, - /* 0 TOML <- <(Expression (newline Expression)* newline? !. Action0)> */ - func() bool { - position0, tokenIndex0 := position, tokenIndex - { - position1 := position - if !_rules[ruleExpression]() { - goto l0 - } - l2: - { - position3, tokenIndex3 := position, tokenIndex - if !_rules[rulenewline]() { - goto l3 - } - if !_rules[ruleExpression]() { - goto l3 - } - goto l2 - l3: - position, tokenIndex = position3, tokenIndex3 - } - { - position4, tokenIndex4 := position, tokenIndex - if !_rules[rulenewline]() { - goto l4 - } - goto l5 - l4: - position, tokenIndex = position4, tokenIndex4 - } - l5: - { - position6, tokenIndex6 := position, tokenIndex - if !matchDot() { - goto l6 - } - goto l0 - l6: - position, tokenIndex = position6, tokenIndex6 - } - { - add(ruleAction0, position) - } - add(ruleTOML, position1) - } - return true - l0: - position, tokenIndex = position0, tokenIndex0 - return false - }, - /* 1 Expression <- <((<(ws table ws comment? (wsnl keyval ws comment?)*)> Action1) / (ws keyval ws comment?) / (ws comment?) / ws)> */ - func() bool { - position8, tokenIndex8 := position, tokenIndex - { - position9 := position - { - position10, tokenIndex10 := position, tokenIndex - { - position12 := position - if !_rules[rulews]() { - goto l11 - } - { - position13 := position - { - position14, tokenIndex14 := position, tokenIndex - { - position16 := position - if buffer[position] != rune('[') { - goto l15 - } - position++ - if !_rules[rulews]() { - goto l15 - } - { - position17 := position - if !_rules[ruletableKey]() { - goto l15 - } - add(rulePegText, position17) - } - if !_rules[rulews]() { - goto l15 - } - if buffer[position] != rune(']') { - goto l15 - } - position++ - { - add(ruleAction13, position) - } - add(rulestdTable, position16) - } - goto l14 - l15: - position, tokenIndex = position14, tokenIndex14 - { - position19 := position - if buffer[position] != rune('[') { - goto l11 - } - position++ - if buffer[position] != rune('[') { - goto l11 - } - position++ - if !_rules[rulews]() { - goto l11 - } - { - position20 := position - if !_rules[ruletableKey]() { - goto l11 - } - add(rulePegText, position20) - } - if !_rules[rulews]() { - goto l11 - } - if buffer[position] != rune(']') { - goto l11 - } - position++ - if buffer[position] != rune(']') { - goto l11 - } - position++ - { - add(ruleAction14, position) - } - add(rulearrayTable, position19) - } - } - l14: - add(ruletable, position13) - } - if !_rules[rulews]() { - goto l11 - } - { - position22, tokenIndex22 := position, tokenIndex - if !_rules[rulecomment]() { - goto l22 - } - goto l23 - l22: - position, tokenIndex = position22, tokenIndex22 - } - l23: - l24: - { - position25, tokenIndex25 := position, tokenIndex - if !_rules[rulewsnl]() { - goto l25 - } - if !_rules[rulekeyval]() { - goto l25 - } - if !_rules[rulews]() { - goto l25 - } - { - position26, tokenIndex26 := position, tokenIndex - if !_rules[rulecomment]() { - goto l26 - } - goto l27 - l26: - position, tokenIndex = position26, tokenIndex26 - } - l27: - goto l24 - l25: - position, tokenIndex = position25, tokenIndex25 - } - add(rulePegText, position12) - } - { - add(ruleAction1, position) - } - goto l10 - l11: - position, tokenIndex = position10, tokenIndex10 - if !_rules[rulews]() { - goto l29 - } - if !_rules[rulekeyval]() { - goto l29 - } - if !_rules[rulews]() { - goto l29 - } - { - position30, tokenIndex30 := position, tokenIndex - if !_rules[rulecomment]() { - goto l30 - } - goto l31 - l30: - position, tokenIndex = position30, tokenIndex30 - } - l31: - goto l10 - l29: - position, tokenIndex = position10, tokenIndex10 - if !_rules[rulews]() { - goto l32 - } - { - position33, tokenIndex33 := position, tokenIndex - if !_rules[rulecomment]() { - goto l33 - } - goto l34 - l33: - position, tokenIndex = position33, tokenIndex33 - } - l34: - goto l10 - l32: - position, tokenIndex = position10, tokenIndex10 - if !_rules[rulews]() { - goto l8 - } - } - l10: - add(ruleExpression, position9) - } - return true - l8: - position, tokenIndex = position8, tokenIndex8 - return false - }, - /* 2 newline <- <(<('\r' / '\n')+> Action2)> */ - func() bool { - position35, tokenIndex35 := position, tokenIndex - { - position36 := position - { - position37 := position - { - position40, tokenIndex40 := position, tokenIndex - if buffer[position] != rune('\r') { - goto l41 - } - position++ - goto l40 - l41: - position, tokenIndex = position40, tokenIndex40 - if buffer[position] != rune('\n') { - goto l35 - } - position++ - } - l40: - l38: - { - position39, tokenIndex39 := position, tokenIndex - { - position42, tokenIndex42 := position, tokenIndex - if buffer[position] != rune('\r') { - goto l43 - } - position++ - goto l42 - l43: - position, tokenIndex = position42, tokenIndex42 - if buffer[position] != rune('\n') { - goto l39 - } - position++ - } - l42: - goto l38 - l39: - position, tokenIndex = position39, tokenIndex39 - } - add(rulePegText, position37) - } - { - add(ruleAction2, position) - } - add(rulenewline, position36) - } - return true - l35: - position, tokenIndex = position35, tokenIndex35 - return false - }, - /* 3 ws <- <(' ' / '\t')*> */ - func() bool { - { - position46 := position - l47: - { - position48, tokenIndex48 := position, tokenIndex - { - position49, tokenIndex49 := position, tokenIndex - if buffer[position] != rune(' ') { - goto l50 - } - position++ - goto l49 - l50: - position, tokenIndex = position49, tokenIndex49 - if buffer[position] != rune('\t') { - goto l48 - } - position++ - } - l49: - goto l47 - l48: - position, tokenIndex = position48, tokenIndex48 - } - add(rulews, position46) - } - return true - }, - /* 4 wsnl <- <((&('\t') '\t') | (&(' ') ' ') | (&('\n' | '\r') (<('\r' / '\n')> Action3)))*> */ - func() bool { - { - position52 := position - l53: - { - position54, tokenIndex54 := position, tokenIndex - { - switch buffer[position] { - case '\t': - if buffer[position] != rune('\t') { - goto l54 - } - position++ - break - case ' ': - if buffer[position] != rune(' ') { - goto l54 - } - position++ - break - default: - { - position56 := position - { - position57, tokenIndex57 := position, tokenIndex - if buffer[position] != rune('\r') { - goto l58 - } - position++ - goto l57 - l58: - position, tokenIndex = position57, tokenIndex57 - if buffer[position] != rune('\n') { - goto l54 - } - position++ - } - l57: - add(rulePegText, position56) - } - { - add(ruleAction3, position) - } - break - } - } - - goto l53 - l54: - position, tokenIndex = position54, tokenIndex54 - } - add(rulewsnl, position52) - } - return true - }, - /* 5 comment <- <('#' <('\t' / [ -\U0010ffff])*>)> */ - func() bool { - position60, tokenIndex60 := position, tokenIndex - { - position61 := position - if buffer[position] != rune('#') { - goto l60 - } - position++ - { - position62 := position - l63: - { - position64, tokenIndex64 := position, tokenIndex - { - position65, tokenIndex65 := position, tokenIndex - if buffer[position] != rune('\t') { - goto l66 - } - position++ - goto l65 - l66: - position, tokenIndex = position65, tokenIndex65 - if c := buffer[position]; c < rune(' ') || c > rune('\U0010ffff') { - goto l64 - } - position++ - } - l65: - goto l63 - l64: - position, tokenIndex = position64, tokenIndex64 - } - add(rulePegText, position62) - } - add(rulecomment, position61) - } - return true - l60: - position, tokenIndex = position60, tokenIndex60 - return false - }, - /* 6 keyval <- <(key ws '=' ws val Action4)> */ - func() bool { - position67, tokenIndex67 := position, tokenIndex - { - position68 := position - if !_rules[rulekey]() { - goto l67 - } - if !_rules[rulews]() { - goto l67 - } - if buffer[position] != rune('=') { - goto l67 - } - position++ - if !_rules[rulews]() { - goto l67 - } - if !_rules[ruleval]() { - goto l67 - } - { - add(ruleAction4, position) - } - add(rulekeyval, position68) - } - return true - l67: - position, tokenIndex = position67, tokenIndex67 - return false - }, - /* 7 key <- <(bareKey / quotedKey)> */ - func() bool { - position70, tokenIndex70 := position, tokenIndex - { - position71 := position - { - position72, tokenIndex72 := position, tokenIndex - { - position74 := position - { - position75 := position - { - switch buffer[position] { - case '_': - if buffer[position] != rune('_') { - goto l73 - } - position++ - break - case '-': - if buffer[position] != rune('-') { - goto l73 - } - position++ - break - case 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z': - if c := buffer[position]; c < rune('a') || c > rune('z') { - goto l73 - } - position++ - break - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l73 - } - position++ - break - default: - if c := buffer[position]; c < rune('A') || c > rune('Z') { - goto l73 - } - position++ - break - } - } - - l76: - { - position77, tokenIndex77 := position, tokenIndex - { - switch buffer[position] { - case '_': - if buffer[position] != rune('_') { - goto l77 - } - position++ - break - case '-': - if buffer[position] != rune('-') { - goto l77 - } - position++ - break - case 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z': - if c := buffer[position]; c < rune('a') || c > rune('z') { - goto l77 - } - position++ - break - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l77 - } - position++ - break - default: - if c := buffer[position]; c < rune('A') || c > rune('Z') { - goto l77 - } - position++ - break - } - } - - goto l76 - l77: - position, tokenIndex = position77, tokenIndex77 - } - add(rulePegText, position75) - } - { - add(ruleAction5, position) - } - add(rulebareKey, position74) - } - goto l72 - l73: - position, tokenIndex = position72, tokenIndex72 - { - position81 := position - { - position82 := position - if buffer[position] != rune('"') { - goto l70 - } - position++ - l83: - { - position84, tokenIndex84 := position, tokenIndex - if !_rules[rulebasicChar]() { - goto l84 - } - goto l83 - l84: - position, tokenIndex = position84, tokenIndex84 - } - if buffer[position] != rune('"') { - goto l70 - } - position++ - add(rulePegText, position82) - } - { - add(ruleAction6, position) - } - add(rulequotedKey, position81) - } - } - l72: - add(rulekey, position71) - } - return true - l70: - position, tokenIndex = position70, tokenIndex70 - return false - }, - /* 8 bareKey <- <(<((&('_') '_') | (&('-') '-') | (&('a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z') [a-z]) | (&('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') [0-9]) | (&('A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z') [A-Z]))+> Action5)> */ - nil, - /* 9 quotedKey <- <(<('"' basicChar* '"')> Action6)> */ - nil, - /* 10 val <- <(( Action7) / ( Action8) / ((&('{') inlineTable) | (&('[') ( Action12)) | (&('f' | 't') ( Action11)) | (&('"' | '\'') ( Action10)) | (&('+' | '-' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') ( Action9))))> */ - func() bool { - position88, tokenIndex88 := position, tokenIndex - { - position89 := position - { - position90, tokenIndex90 := position, tokenIndex - { - position92 := position - { - position93 := position - { - position94, tokenIndex94 := position, tokenIndex - { - position96 := position - { - position97 := position - { - position98 := position - if !_rules[ruledigitDual]() { - goto l95 - } - if !_rules[ruledigitDual]() { - goto l95 - } - add(ruledigitQuad, position98) - } - add(ruledateFullYear, position97) - } - if buffer[position] != rune('-') { - goto l95 - } - position++ - { - position99 := position - if !_rules[ruledigitDual]() { - goto l95 - } - add(ruledateMonth, position99) - } - if buffer[position] != rune('-') { - goto l95 - } - position++ - { - position100 := position - if !_rules[ruledigitDual]() { - goto l95 - } - add(ruledateMDay, position100) - } - add(rulefullDate, position96) - } - { - position101, tokenIndex101 := position, tokenIndex - if buffer[position] != rune('T') { - goto l101 - } - position++ - { - position103 := position - if !_rules[rulepartialTime]() { - goto l101 - } - { - position104, tokenIndex104 := position, tokenIndex - { - position106 := position - { - position107, tokenIndex107 := position, tokenIndex - if buffer[position] != rune('Z') { - goto l108 - } - position++ - goto l107 - l108: - position, tokenIndex = position107, tokenIndex107 - { - position109 := position - { - position110, tokenIndex110 := position, tokenIndex - if buffer[position] != rune('-') { - goto l111 - } - position++ - goto l110 - l111: - position, tokenIndex = position110, tokenIndex110 - if buffer[position] != rune('+') { - goto l104 - } - position++ - } - l110: - if !_rules[ruletimeHour]() { - goto l104 - } - if buffer[position] != rune(':') { - goto l104 - } - position++ - if !_rules[ruletimeMinute]() { - goto l104 - } - add(ruletimeNumoffset, position109) - } - } - l107: - add(ruletimeOffset, position106) - } - goto l105 - l104: - position, tokenIndex = position104, tokenIndex104 - } - l105: - add(rulefullTime, position103) - } - goto l102 - l101: - position, tokenIndex = position101, tokenIndex101 - } - l102: - goto l94 - l95: - position, tokenIndex = position94, tokenIndex94 - if !_rules[rulepartialTime]() { - goto l91 - } - } - l94: - add(ruledatetime, position93) - } - add(rulePegText, position92) - } - { - add(ruleAction7, position) - } - goto l90 - l91: - position, tokenIndex = position90, tokenIndex90 - { - position114 := position - { - position115 := position - if !_rules[ruleinteger]() { - goto l113 - } - { - position116, tokenIndex116 := position, tokenIndex - if !_rules[rulefrac]() { - goto l117 - } - { - position118, tokenIndex118 := position, tokenIndex - if !_rules[ruleexp]() { - goto l118 - } - goto l119 - l118: - position, tokenIndex = position118, tokenIndex118 - } - l119: - goto l116 - l117: - position, tokenIndex = position116, tokenIndex116 - { - position120, tokenIndex120 := position, tokenIndex - if !_rules[rulefrac]() { - goto l120 - } - goto l121 - l120: - position, tokenIndex = position120, tokenIndex120 - } - l121: - if !_rules[ruleexp]() { - goto l113 - } - } - l116: - add(rulefloat, position115) - } - add(rulePegText, position114) - } - { - add(ruleAction8, position) - } - goto l90 - l113: - position, tokenIndex = position90, tokenIndex90 - { - switch buffer[position] { - case '{': - { - position124 := position - if buffer[position] != rune('{') { - goto l88 - } - position++ - { - add(ruleAction15, position) - } - if !_rules[rulews]() { - goto l88 - } - { - position126 := position - l127: - { - position128, tokenIndex128 := position, tokenIndex - if !_rules[rulekeyval]() { - goto l128 - } - { - position129, tokenIndex129 := position, tokenIndex - { - position131 := position - if !_rules[rulews]() { - goto l129 - } - if buffer[position] != rune(',') { - goto l129 - } - position++ - if !_rules[rulews]() { - goto l129 - } - add(ruleinlineTableValSep, position131) - } - goto l130 - l129: - position, tokenIndex = position129, tokenIndex129 - } - l130: - goto l127 - l128: - position, tokenIndex = position128, tokenIndex128 - } - add(ruleinlineTableKeyValues, position126) - } - if !_rules[rulews]() { - goto l88 - } - if buffer[position] != rune('}') { - goto l88 - } - position++ - { - add(ruleAction16, position) - } - add(ruleinlineTable, position124) - } - break - case '[': - { - position133 := position - { - position134 := position - if buffer[position] != rune('[') { - goto l88 - } - position++ - { - add(ruleAction23, position) - } - if !_rules[rulewsnl]() { - goto l88 - } - { - position136, tokenIndex136 := position, tokenIndex - { - position138 := position - if !_rules[ruleval]() { - goto l136 - } - { - add(ruleAction24, position) - } - l140: - { - position141, tokenIndex141 := position, tokenIndex - if !_rules[rulewsnl]() { - goto l141 - } - { - position142, tokenIndex142 := position, tokenIndex - if !_rules[rulecomment]() { - goto l142 - } - goto l143 - l142: - position, tokenIndex = position142, tokenIndex142 - } - l143: - if !_rules[rulewsnl]() { - goto l141 - } - if !_rules[rulearraySep]() { - goto l141 - } - if !_rules[rulewsnl]() { - goto l141 - } - { - position144, tokenIndex144 := position, tokenIndex - if !_rules[rulecomment]() { - goto l144 - } - goto l145 - l144: - position, tokenIndex = position144, tokenIndex144 - } - l145: - if !_rules[rulewsnl]() { - goto l141 - } - if !_rules[ruleval]() { - goto l141 - } - { - add(ruleAction25, position) - } - goto l140 - l141: - position, tokenIndex = position141, tokenIndex141 - } - if !_rules[rulewsnl]() { - goto l136 - } - { - position147, tokenIndex147 := position, tokenIndex - if !_rules[rulearraySep]() { - goto l147 - } - goto l148 - l147: - position, tokenIndex = position147, tokenIndex147 - } - l148: - if !_rules[rulewsnl]() { - goto l136 - } - { - position149, tokenIndex149 := position, tokenIndex - if !_rules[rulecomment]() { - goto l149 - } - goto l150 - l149: - position, tokenIndex = position149, tokenIndex149 - } - l150: - add(rulearrayValues, position138) - } - goto l137 - l136: - position, tokenIndex = position136, tokenIndex136 - } - l137: - if !_rules[rulewsnl]() { - goto l88 - } - if buffer[position] != rune(']') { - goto l88 - } - position++ - add(rulearray, position134) - } - add(rulePegText, position133) - } - { - add(ruleAction12, position) - } - break - case 'f', 't': - { - position152 := position - { - position153 := position - { - position154, tokenIndex154 := position, tokenIndex - if buffer[position] != rune('t') { - goto l155 - } - position++ - if buffer[position] != rune('r') { - goto l155 - } - position++ - if buffer[position] != rune('u') { - goto l155 - } - position++ - if buffer[position] != rune('e') { - goto l155 - } - position++ - goto l154 - l155: - position, tokenIndex = position154, tokenIndex154 - if buffer[position] != rune('f') { - goto l88 - } - position++ - if buffer[position] != rune('a') { - goto l88 - } - position++ - if buffer[position] != rune('l') { - goto l88 - } - position++ - if buffer[position] != rune('s') { - goto l88 - } - position++ - if buffer[position] != rune('e') { - goto l88 - } - position++ - } - l154: - add(ruleboolean, position153) - } - add(rulePegText, position152) - } - { - add(ruleAction11, position) - } - break - case '"', '\'': - { - position157 := position - { - position158 := position - { - position159, tokenIndex159 := position, tokenIndex - { - position161 := position - if buffer[position] != rune('\'') { - goto l160 - } - position++ - if buffer[position] != rune('\'') { - goto l160 - } - position++ - if buffer[position] != rune('\'') { - goto l160 - } - position++ - { - position162 := position - { - position163 := position - l164: - { - position165, tokenIndex165 := position, tokenIndex - { - position166, tokenIndex166 := position, tokenIndex - if buffer[position] != rune('\'') { - goto l166 - } - position++ - if buffer[position] != rune('\'') { - goto l166 - } - position++ - if buffer[position] != rune('\'') { - goto l166 - } - position++ - goto l165 - l166: - position, tokenIndex = position166, tokenIndex166 - } - { - position167, tokenIndex167 := position, tokenIndex - { - position169 := position - { - position170, tokenIndex170 := position, tokenIndex - if buffer[position] != rune('\t') { - goto l171 - } - position++ - goto l170 - l171: - position, tokenIndex = position170, tokenIndex170 - if c := buffer[position]; c < rune(' ') || c > rune('\U0010ffff') { - goto l168 - } - position++ - } - l170: - add(rulemlLiteralChar, position169) - } - goto l167 - l168: - position, tokenIndex = position167, tokenIndex167 - if !_rules[rulenewline]() { - goto l165 - } - } - l167: - goto l164 - l165: - position, tokenIndex = position165, tokenIndex165 - } - add(rulemlLiteralBody, position163) - } - add(rulePegText, position162) - } - if buffer[position] != rune('\'') { - goto l160 - } - position++ - if buffer[position] != rune('\'') { - goto l160 - } - position++ - if buffer[position] != rune('\'') { - goto l160 - } - position++ - { - add(ruleAction22, position) - } - add(rulemlLiteralString, position161) - } - goto l159 - l160: - position, tokenIndex = position159, tokenIndex159 - { - position174 := position - if buffer[position] != rune('\'') { - goto l173 - } - position++ - { - position175 := position - l176: - { - position177, tokenIndex177 := position, tokenIndex - { - position178 := position - { - switch buffer[position] { - case '\t': - if buffer[position] != rune('\t') { - goto l177 - } - position++ - break - case ' ', '!', '"', '#', '$', '%', '&': - if c := buffer[position]; c < rune(' ') || c > rune('&') { - goto l177 - } - position++ - break - default: - if c := buffer[position]; c < rune('(') || c > rune('\U0010ffff') { - goto l177 - } - position++ - break - } - } - - add(ruleliteralChar, position178) - } - goto l176 - l177: - position, tokenIndex = position177, tokenIndex177 - } - add(rulePegText, position175) - } - if buffer[position] != rune('\'') { - goto l173 - } - position++ - { - add(ruleAction21, position) - } - add(ruleliteralString, position174) - } - goto l159 - l173: - position, tokenIndex = position159, tokenIndex159 - { - position182 := position - if buffer[position] != rune('"') { - goto l181 - } - position++ - if buffer[position] != rune('"') { - goto l181 - } - position++ - if buffer[position] != rune('"') { - goto l181 - } - position++ - { - position183 := position - l184: - { - position185, tokenIndex185 := position, tokenIndex - { - position186, tokenIndex186 := position, tokenIndex - { - position188 := position - { - position189, tokenIndex189 := position, tokenIndex - if !_rules[rulebasicChar]() { - goto l190 - } - goto l189 - l190: - position, tokenIndex = position189, tokenIndex189 - if !_rules[rulenewline]() { - goto l187 - } - } - l189: - add(rulePegText, position188) - } - { - add(ruleAction20, position) - } - goto l186 - l187: - position, tokenIndex = position186, tokenIndex186 - if !_rules[ruleescape]() { - goto l185 - } - if !_rules[rulenewline]() { - goto l185 - } - if !_rules[rulewsnl]() { - goto l185 - } - } - l186: - goto l184 - l185: - position, tokenIndex = position185, tokenIndex185 - } - add(rulemlBasicBody, position183) - } - if buffer[position] != rune('"') { - goto l181 - } - position++ - if buffer[position] != rune('"') { - goto l181 - } - position++ - if buffer[position] != rune('"') { - goto l181 - } - position++ - { - add(ruleAction19, position) - } - add(rulemlBasicString, position182) - } - goto l159 - l181: - position, tokenIndex = position159, tokenIndex159 - { - position193 := position - { - position194 := position - if buffer[position] != rune('"') { - goto l88 - } - position++ - l195: - { - position196, tokenIndex196 := position, tokenIndex - if !_rules[rulebasicChar]() { - goto l196 - } - goto l195 - l196: - position, tokenIndex = position196, tokenIndex196 - } - if buffer[position] != rune('"') { - goto l88 - } - position++ - add(rulePegText, position194) - } - { - add(ruleAction18, position) - } - add(rulebasicString, position193) - } - } - l159: - add(rulestring, position158) - } - add(rulePegText, position157) - } - { - add(ruleAction10, position) - } - break - default: - { - position199 := position - if !_rules[ruleinteger]() { - goto l88 - } - add(rulePegText, position199) - } - { - add(ruleAction9, position) - } - break - } - } - - } - l90: - add(ruleval, position89) - } - return true - l88: - position, tokenIndex = position88, tokenIndex88 - return false - }, - /* 11 table <- <(stdTable / arrayTable)> */ - nil, - /* 12 stdTable <- <('[' ws ws ']' Action13)> */ - nil, - /* 13 arrayTable <- <('[' '[' ws ws (']' ']') Action14)> */ - nil, - /* 14 inlineTable <- <('{' Action15 ws inlineTableKeyValues ws '}' Action16)> */ - nil, - /* 15 inlineTableKeyValues <- <(keyval inlineTableValSep?)*> */ - nil, - /* 16 tableKey <- <(tableKeyComp (tableKeySep tableKeyComp)*)> */ - func() bool { - position206, tokenIndex206 := position, tokenIndex - { - position207 := position - if !_rules[ruletableKeyComp]() { - goto l206 - } - l208: - { - position209, tokenIndex209 := position, tokenIndex - { - position210 := position - if !_rules[rulews]() { - goto l209 - } - if buffer[position] != rune('.') { - goto l209 - } - position++ - if !_rules[rulews]() { - goto l209 - } - add(ruletableKeySep, position210) - } - if !_rules[ruletableKeyComp]() { - goto l209 - } - goto l208 - l209: - position, tokenIndex = position209, tokenIndex209 - } - add(ruletableKey, position207) - } - return true - l206: - position, tokenIndex = position206, tokenIndex206 - return false - }, - /* 17 tableKeyComp <- <(key Action17)> */ - func() bool { - position211, tokenIndex211 := position, tokenIndex - { - position212 := position - if !_rules[rulekey]() { - goto l211 - } - { - add(ruleAction17, position) - } - add(ruletableKeyComp, position212) - } - return true - l211: - position, tokenIndex = position211, tokenIndex211 - return false - }, - /* 18 tableKeySep <- <(ws '.' ws)> */ - nil, - /* 19 inlineTableValSep <- <(ws ',' ws)> */ - nil, - /* 20 integer <- <(('-' / '+')? int)> */ - func() bool { - position216, tokenIndex216 := position, tokenIndex - { - position217 := position - { - position218, tokenIndex218 := position, tokenIndex - { - position220, tokenIndex220 := position, tokenIndex - if buffer[position] != rune('-') { - goto l221 - } - position++ - goto l220 - l221: - position, tokenIndex = position220, tokenIndex220 - if buffer[position] != rune('+') { - goto l218 - } - position++ - } - l220: - goto l219 - l218: - position, tokenIndex = position218, tokenIndex218 - } - l219: - { - position222 := position - { - position223, tokenIndex223 := position, tokenIndex - if c := buffer[position]; c < rune('1') || c > rune('9') { - goto l224 - } - position++ - { - position227, tokenIndex227 := position, tokenIndex - if !_rules[ruledigit]() { - goto l228 - } - goto l227 - l228: - position, tokenIndex = position227, tokenIndex227 - if buffer[position] != rune('_') { - goto l224 - } - position++ - if !_rules[ruledigit]() { - goto l224 - } - } - l227: - l225: - { - position226, tokenIndex226 := position, tokenIndex - { - position229, tokenIndex229 := position, tokenIndex - if !_rules[ruledigit]() { - goto l230 - } - goto l229 - l230: - position, tokenIndex = position229, tokenIndex229 - if buffer[position] != rune('_') { - goto l226 - } - position++ - if !_rules[ruledigit]() { - goto l226 - } - } - l229: - goto l225 - l226: - position, tokenIndex = position226, tokenIndex226 - } - goto l223 - l224: - position, tokenIndex = position223, tokenIndex223 - if !_rules[ruledigit]() { - goto l216 - } - } - l223: - add(ruleint, position222) - } - add(ruleinteger, position217) - } - return true - l216: - position, tokenIndex = position216, tokenIndex216 - return false - }, - /* 21 int <- <(([1-9] (digit / ('_' digit))+) / digit)> */ - nil, - /* 22 float <- <(integer ((frac exp?) / (frac? exp)))> */ - nil, - /* 23 frac <- <('.' digit (digit / ('_' digit))*)> */ - func() bool { - position233, tokenIndex233 := position, tokenIndex - { - position234 := position - if buffer[position] != rune('.') { - goto l233 - } - position++ - if !_rules[ruledigit]() { - goto l233 - } - l235: - { - position236, tokenIndex236 := position, tokenIndex - { - position237, tokenIndex237 := position, tokenIndex - if !_rules[ruledigit]() { - goto l238 - } - goto l237 - l238: - position, tokenIndex = position237, tokenIndex237 - if buffer[position] != rune('_') { - goto l236 - } - position++ - if !_rules[ruledigit]() { - goto l236 - } - } - l237: - goto l235 - l236: - position, tokenIndex = position236, tokenIndex236 - } - add(rulefrac, position234) - } - return true - l233: - position, tokenIndex = position233, tokenIndex233 - return false - }, - /* 24 exp <- <(('e' / 'E') ('-' / '+')? digit (digit / ('_' digit))*)> */ - func() bool { - position239, tokenIndex239 := position, tokenIndex - { - position240 := position - { - position241, tokenIndex241 := position, tokenIndex - if buffer[position] != rune('e') { - goto l242 - } - position++ - goto l241 - l242: - position, tokenIndex = position241, tokenIndex241 - if buffer[position] != rune('E') { - goto l239 - } - position++ - } - l241: - { - position243, tokenIndex243 := position, tokenIndex - { - position245, tokenIndex245 := position, tokenIndex - if buffer[position] != rune('-') { - goto l246 - } - position++ - goto l245 - l246: - position, tokenIndex = position245, tokenIndex245 - if buffer[position] != rune('+') { - goto l243 - } - position++ - } - l245: - goto l244 - l243: - position, tokenIndex = position243, tokenIndex243 - } - l244: - if !_rules[ruledigit]() { - goto l239 - } - l247: - { - position248, tokenIndex248 := position, tokenIndex - { - position249, tokenIndex249 := position, tokenIndex - if !_rules[ruledigit]() { - goto l250 - } - goto l249 - l250: - position, tokenIndex = position249, tokenIndex249 - if buffer[position] != rune('_') { - goto l248 - } - position++ - if !_rules[ruledigit]() { - goto l248 - } - } - l249: - goto l247 - l248: - position, tokenIndex = position248, tokenIndex248 - } - add(ruleexp, position240) - } - return true - l239: - position, tokenIndex = position239, tokenIndex239 - return false - }, - /* 25 string <- <(mlLiteralString / literalString / mlBasicString / basicString)> */ - nil, - /* 26 basicString <- <(<('"' basicChar* '"')> Action18)> */ - nil, - /* 27 basicChar <- <(basicUnescaped / escaped)> */ - func() bool { - position253, tokenIndex253 := position, tokenIndex - { - position254 := position - { - position255, tokenIndex255 := position, tokenIndex - { - position257 := position - { - switch buffer[position] { - case ' ', '!': - if c := buffer[position]; c < rune(' ') || c > rune('!') { - goto l256 - } - position++ - break - case '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[': - if c := buffer[position]; c < rune('#') || c > rune('[') { - goto l256 - } - position++ - break - default: - if c := buffer[position]; c < rune(']') || c > rune('\U0010ffff') { - goto l256 - } - position++ - break - } - } - - add(rulebasicUnescaped, position257) - } - goto l255 - l256: - position, tokenIndex = position255, tokenIndex255 - { - position259 := position - if !_rules[ruleescape]() { - goto l253 - } - { - switch buffer[position] { - case 'U': - if buffer[position] != rune('U') { - goto l253 - } - position++ - if !_rules[rulehexQuad]() { - goto l253 - } - if !_rules[rulehexQuad]() { - goto l253 - } - break - case 'u': - if buffer[position] != rune('u') { - goto l253 - } - position++ - if !_rules[rulehexQuad]() { - goto l253 - } - break - case '\\': - if buffer[position] != rune('\\') { - goto l253 - } - position++ - break - case '/': - if buffer[position] != rune('/') { - goto l253 - } - position++ - break - case '"': - if buffer[position] != rune('"') { - goto l253 - } - position++ - break - case 'r': - if buffer[position] != rune('r') { - goto l253 - } - position++ - break - case 'f': - if buffer[position] != rune('f') { - goto l253 - } - position++ - break - case 'n': - if buffer[position] != rune('n') { - goto l253 - } - position++ - break - case 't': - if buffer[position] != rune('t') { - goto l253 - } - position++ - break - default: - if buffer[position] != rune('b') { - goto l253 - } - position++ - break - } - } - - add(ruleescaped, position259) - } - } - l255: - add(rulebasicChar, position254) - } - return true - l253: - position, tokenIndex = position253, tokenIndex253 - return false - }, - /* 28 escaped <- <(escape ((&('U') ('U' hexQuad hexQuad)) | (&('u') ('u' hexQuad)) | (&('\\') '\\') | (&('/') '/') | (&('"') '"') | (&('r') 'r') | (&('f') 'f') | (&('n') 'n') | (&('t') 't') | (&('b') 'b')))> */ - nil, - /* 29 basicUnescaped <- <((&(' ' | '!') [ -!]) | (&('#' | '$' | '%' | '&' | '\'' | '(' | ')' | '*' | '+' | ',' | '-' | '.' | '/' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | ':' | ';' | '<' | '=' | '>' | '?' | '@' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z' | '[') [#-[]) | (&(']' | '^' | '_' | '`' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' | '{' | '|' | '}' | '~' | '\u007f' | '\u0080' | '\u0081' | '\u0082' | '\u0083' | '\u0084' | '\u0085' | '\u0086' | '\u0087' | '\u0088' | '\u0089' | '\u008a' | '\u008b' | '\u008c' | '\u008d' | '\u008e' | '\u008f' | '\u0090' | '\u0091' | '\u0092' | '\u0093' | '\u0094' | '\u0095' | '\u0096' | '\u0097' | '\u0098' | '\u0099' | '\u009a' | '\u009b' | '\u009c' | '\u009d' | '\u009e' | '\u009f' | '\u00a0' | '¡' | '¢' | '£' | '¤' | '¥' | '¦' | '§' | '¨' | '©' | 'ª' | '«' | '¬' | '\u00ad' | '®' | '¯' | '°' | '±' | '²' | '³' | '´' | 'µ' | '¶' | '·' | '¸' | '¹' | 'º' | '»' | '¼' | '½' | '¾' | '¿' | 'À' | 'Á' | 'Â' | 'Ã' | 'Ä' | 'Å' | 'Æ' | 'Ç' | 'È' | 'É' | 'Ê' | 'Ë' | 'Ì' | 'Í' | 'Î' | 'Ï' | 'Ð' | 'Ñ' | 'Ò' | 'Ó' | 'Ô' | 'Õ' | 'Ö' | '×' | 'Ø' | 'Ù' | 'Ú' | 'Û' | 'Ü' | 'Ý' | 'Þ' | 'ß' | 'à' | 'á' | 'â' | 'ã' | 'ä' | 'å' | 'æ' | 'ç' | 'è' | 'é' | 'ê' | 'ë' | 'ì' | 'í' | 'î' | 'ï' | 'ð' | 'ñ' | 'ò' | 'ó' | 'ô' | 'õ' | 'ö' | '÷' | 'ø' | 'ù' | 'ú' | 'û' | 'ü' | 'ý' | 'þ' | 'ÿ') []-\U0010ffff]))> */ - nil, - /* 30 escape <- <'\\'> */ - func() bool { - position263, tokenIndex263 := position, tokenIndex - { - position264 := position - if buffer[position] != rune('\\') { - goto l263 - } - position++ - add(ruleescape, position264) - } - return true - l263: - position, tokenIndex = position263, tokenIndex263 - return false - }, - /* 31 mlBasicString <- <('"' '"' '"' mlBasicBody ('"' '"' '"') Action19)> */ - nil, - /* 32 mlBasicBody <- <((<(basicChar / newline)> Action20) / (escape newline wsnl))*> */ - nil, - /* 33 literalString <- <('\'' '\'' Action21)> */ - nil, - /* 34 literalChar <- <((&('\t') '\t') | (&(' ' | '!' | '"' | '#' | '$' | '%' | '&') [ -&]) | (&('(' | ')' | '*' | '+' | ',' | '-' | '.' | '/' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | ':' | ';' | '<' | '=' | '>' | '?' | '@' | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z' | '[' | '\\' | ']' | '^' | '_' | '`' | 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' | '{' | '|' | '}' | '~' | '\u007f' | '\u0080' | '\u0081' | '\u0082' | '\u0083' | '\u0084' | '\u0085' | '\u0086' | '\u0087' | '\u0088' | '\u0089' | '\u008a' | '\u008b' | '\u008c' | '\u008d' | '\u008e' | '\u008f' | '\u0090' | '\u0091' | '\u0092' | '\u0093' | '\u0094' | '\u0095' | '\u0096' | '\u0097' | '\u0098' | '\u0099' | '\u009a' | '\u009b' | '\u009c' | '\u009d' | '\u009e' | '\u009f' | '\u00a0' | '¡' | '¢' | '£' | '¤' | '¥' | '¦' | '§' | '¨' | '©' | 'ª' | '«' | '¬' | '\u00ad' | '®' | '¯' | '°' | '±' | '²' | '³' | '´' | 'µ' | '¶' | '·' | '¸' | '¹' | 'º' | '»' | '¼' | '½' | '¾' | '¿' | 'À' | 'Á' | 'Â' | 'Ã' | 'Ä' | 'Å' | 'Æ' | 'Ç' | 'È' | 'É' | 'Ê' | 'Ë' | 'Ì' | 'Í' | 'Î' | 'Ï' | 'Ð' | 'Ñ' | 'Ò' | 'Ó' | 'Ô' | 'Õ' | 'Ö' | '×' | 'Ø' | 'Ù' | 'Ú' | 'Û' | 'Ü' | 'Ý' | 'Þ' | 'ß' | 'à' | 'á' | 'â' | 'ã' | 'ä' | 'å' | 'æ' | 'ç' | 'è' | 'é' | 'ê' | 'ë' | 'ì' | 'í' | 'î' | 'ï' | 'ð' | 'ñ' | 'ò' | 'ó' | 'ô' | 'õ' | 'ö' | '÷' | 'ø' | 'ù' | 'ú' | 'û' | 'ü' | 'ý' | 'þ' | 'ÿ') [(-\U0010ffff]))> */ - nil, - /* 35 mlLiteralString <- <('\'' '\'' '\'' ('\'' '\'' '\'') Action22)> */ - nil, - /* 36 mlLiteralBody <- <(!('\'' '\'' '\'') (mlLiteralChar / newline))*> */ - nil, - /* 37 mlLiteralChar <- <('\t' / [ -\U0010ffff])> */ - nil, - /* 38 hexdigit <- <((&('a' | 'b' | 'c' | 'd' | 'e' | 'f') [a-f]) | (&('A' | 'B' | 'C' | 'D' | 'E' | 'F') [A-F]) | (&('0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') [0-9]))> */ - func() bool { - position272, tokenIndex272 := position, tokenIndex - { - position273 := position - { - switch buffer[position] { - case 'a', 'b', 'c', 'd', 'e', 'f': - if c := buffer[position]; c < rune('a') || c > rune('f') { - goto l272 - } - position++ - break - case 'A', 'B', 'C', 'D', 'E', 'F': - if c := buffer[position]; c < rune('A') || c > rune('F') { - goto l272 - } - position++ - break - default: - if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l272 - } - position++ - break - } - } - - add(rulehexdigit, position273) - } - return true - l272: - position, tokenIndex = position272, tokenIndex272 - return false - }, - /* 39 hexQuad <- <(hexdigit hexdigit hexdigit hexdigit)> */ - func() bool { - position275, tokenIndex275 := position, tokenIndex - { - position276 := position - if !_rules[rulehexdigit]() { - goto l275 - } - if !_rules[rulehexdigit]() { - goto l275 - } - if !_rules[rulehexdigit]() { - goto l275 - } - if !_rules[rulehexdigit]() { - goto l275 - } - add(rulehexQuad, position276) - } - return true - l275: - position, tokenIndex = position275, tokenIndex275 - return false - }, - /* 40 boolean <- <(('t' 'r' 'u' 'e') / ('f' 'a' 'l' 's' 'e'))> */ - nil, - /* 41 dateFullYear <- */ - nil, - /* 42 dateMonth <- */ - nil, - /* 43 dateMDay <- */ - nil, - /* 44 timeHour <- */ - func() bool { - position281, tokenIndex281 := position, tokenIndex - { - position282 := position - if !_rules[ruledigitDual]() { - goto l281 - } - add(ruletimeHour, position282) - } - return true - l281: - position, tokenIndex = position281, tokenIndex281 - return false - }, - /* 45 timeMinute <- */ - func() bool { - position283, tokenIndex283 := position, tokenIndex - { - position284 := position - if !_rules[ruledigitDual]() { - goto l283 - } - add(ruletimeMinute, position284) - } - return true - l283: - position, tokenIndex = position283, tokenIndex283 - return false - }, - /* 46 timeSecond <- */ - nil, - /* 47 timeSecfrac <- <('.' digit+)> */ - nil, - /* 48 timeNumoffset <- <(('-' / '+') timeHour ':' timeMinute)> */ - nil, - /* 49 timeOffset <- <('Z' / timeNumoffset)> */ - nil, - /* 50 partialTime <- <(timeHour ':' timeMinute ':' timeSecond timeSecfrac?)> */ - func() bool { - position289, tokenIndex289 := position, tokenIndex - { - position290 := position - if !_rules[ruletimeHour]() { - goto l289 - } - if buffer[position] != rune(':') { - goto l289 - } - position++ - if !_rules[ruletimeMinute]() { - goto l289 - } - if buffer[position] != rune(':') { - goto l289 - } - position++ - { - position291 := position - if !_rules[ruledigitDual]() { - goto l289 - } - add(ruletimeSecond, position291) - } - { - position292, tokenIndex292 := position, tokenIndex - { - position294 := position - if buffer[position] != rune('.') { - goto l292 - } - position++ - if !_rules[ruledigit]() { - goto l292 - } - l295: - { - position296, tokenIndex296 := position, tokenIndex - if !_rules[ruledigit]() { - goto l296 - } - goto l295 - l296: - position, tokenIndex = position296, tokenIndex296 - } - add(ruletimeSecfrac, position294) - } - goto l293 - l292: - position, tokenIndex = position292, tokenIndex292 - } - l293: - add(rulepartialTime, position290) - } - return true - l289: - position, tokenIndex = position289, tokenIndex289 - return false - }, - /* 51 fullDate <- <(dateFullYear '-' dateMonth '-' dateMDay)> */ - nil, - /* 52 fullTime <- <(partialTime timeOffset?)> */ - nil, - /* 53 datetime <- <((fullDate ('T' fullTime)?) / partialTime)> */ - nil, - /* 54 digit <- <[0-9]> */ - func() bool { - position300, tokenIndex300 := position, tokenIndex - { - position301 := position - if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l300 - } - position++ - add(ruledigit, position301) - } - return true - l300: - position, tokenIndex = position300, tokenIndex300 - return false - }, - /* 55 digitDual <- <(digit digit)> */ - func() bool { - position302, tokenIndex302 := position, tokenIndex - { - position303 := position - if !_rules[ruledigit]() { - goto l302 - } - if !_rules[ruledigit]() { - goto l302 - } - add(ruledigitDual, position303) - } - return true - l302: - position, tokenIndex = position302, tokenIndex302 - return false - }, - /* 56 digitQuad <- <(digitDual digitDual)> */ - nil, - /* 57 array <- <('[' Action23 wsnl arrayValues? wsnl ']')> */ - nil, - /* 58 arrayValues <- <(val Action24 (wsnl comment? wsnl arraySep wsnl comment? wsnl val Action25)* wsnl arraySep? wsnl comment?)> */ - nil, - /* 59 arraySep <- <','> */ - func() bool { - position307, tokenIndex307 := position, tokenIndex - { - position308 := position - if buffer[position] != rune(',') { - goto l307 - } - position++ - add(rulearraySep, position308) - } - return true - l307: - position, tokenIndex = position307, tokenIndex307 - return false - }, - /* 61 Action0 <- <{ _ = buffer }> */ - nil, - nil, - /* 63 Action1 <- <{ p.SetTableString(begin, end) }> */ - nil, - /* 64 Action2 <- <{ p.AddLineCount(end - begin) }> */ - nil, - /* 65 Action3 <- <{ p.AddLineCount(end - begin) }> */ - nil, - /* 66 Action4 <- <{ p.AddKeyValue() }> */ - nil, - /* 67 Action5 <- <{ p.SetKey(p.buffer, begin, end) }> */ - nil, - /* 68 Action6 <- <{ p.SetKey(p.buffer, begin, end) }> */ - nil, - /* 69 Action7 <- <{ p.SetTime(begin, end) }> */ - nil, - /* 70 Action8 <- <{ p.SetFloat64(begin, end) }> */ - nil, - /* 71 Action9 <- <{ p.SetInt64(begin, end) }> */ - nil, - /* 72 Action10 <- <{ p.SetString(begin, end) }> */ - nil, - /* 73 Action11 <- <{ p.SetBool(begin, end) }> */ - nil, - /* 74 Action12 <- <{ p.SetArray(begin, end) }> */ - nil, - /* 75 Action13 <- <{ p.SetTable(p.buffer, begin, end) }> */ - nil, - /* 76 Action14 <- <{ p.SetArrayTable(p.buffer, begin, end) }> */ - nil, - /* 77 Action15 <- <{ p.StartInlineTable() }> */ - nil, - /* 78 Action16 <- <{ p.EndInlineTable() }> */ - nil, - /* 79 Action17 <- <{ p.AddTableKey() }> */ - nil, - /* 80 Action18 <- <{ p.SetBasicString(p.buffer, begin, end) }> */ - nil, - /* 81 Action19 <- <{ p.SetMultilineString() }> */ - nil, - /* 82 Action20 <- <{ p.AddMultilineBasicBody(p.buffer, begin, end) }> */ - nil, - /* 83 Action21 <- <{ p.SetLiteralString(p.buffer, begin, end) }> */ - nil, - /* 84 Action22 <- <{ p.SetMultilineLiteralString(p.buffer, begin, end) }> */ - nil, - /* 85 Action23 <- <{ p.StartArray() }> */ - nil, - /* 86 Action24 <- <{ p.AddArrayVal() }> */ - nil, - /* 87 Action25 <- <{ p.AddArrayVal() }> */ - nil, - } - p.rules = _rules -} diff --git a/vendor/github.com/naoina/toml/util.go b/vendor/github.com/naoina/toml/util.go deleted file mode 100644 index f882f4e5f83e..000000000000 --- a/vendor/github.com/naoina/toml/util.go +++ /dev/null @@ -1,65 +0,0 @@ -package toml - -import ( - "fmt" - "reflect" - "strings" -) - -const fieldTagName = "toml" - -// fieldCache maps normalized field names to their position in a struct. -type fieldCache struct { - named map[string]fieldInfo // fields with an explicit name in tag - auto map[string]fieldInfo // fields with auto-assigned normalized names -} - -type fieldInfo struct { - index []int - name string - ignored bool -} - -func makeFieldCache(cfg *Config, rt reflect.Type) fieldCache { - named, auto := make(map[string]fieldInfo), make(map[string]fieldInfo) - for i := 0; i < rt.NumField(); i++ { - ft := rt.Field(i) - // skip unexported fields - if ft.PkgPath != "" && !ft.Anonymous { - continue - } - col, _ := extractTag(ft.Tag.Get(fieldTagName)) - info := fieldInfo{index: ft.Index, name: ft.Name, ignored: col == "-"} - if col == "" || col == "-" { - auto[cfg.NormFieldName(rt, ft.Name)] = info - } else { - named[col] = info - } - } - return fieldCache{named, auto} -} - -func (fc fieldCache) findField(cfg *Config, rv reflect.Value, name string) (reflect.Value, string, error) { - info, found := fc.named[name] - if !found { - info, found = fc.auto[cfg.NormFieldName(rv.Type(), name)] - } - if !found { - if cfg.MissingField == nil { - return reflect.Value{}, "", fmt.Errorf("field corresponding to `%s' is not defined in %v", name, rv.Type()) - } else { - return reflect.Value{}, "", cfg.MissingField(rv.Type(), name) - } - } else if info.ignored { - return reflect.Value{}, "", fmt.Errorf("field corresponding to `%s' in %v cannot be set through TOML", name, rv.Type()) - } - return rv.FieldByIndex(info.index), info.name, nil -} - -func extractTag(tag string) (col, rest string) { - tags := strings.SplitN(tag, ",", 2) - if len(tags) == 2 { - return strings.TrimSpace(tags[0]), strings.TrimSpace(tags[1]) - } - return strings.TrimSpace(tags[0]), "" -} diff --git a/vendor/github.com/nsf/termbox-go/AUTHORS b/vendor/github.com/nsf/termbox-go/AUTHORS deleted file mode 100644 index fe26fb0fb058..000000000000 --- a/vendor/github.com/nsf/termbox-go/AUTHORS +++ /dev/null @@ -1,4 +0,0 @@ -# Please keep this file sorted. - -Georg Reinke -nsf diff --git a/vendor/github.com/nsf/termbox-go/LICENSE b/vendor/github.com/nsf/termbox-go/LICENSE deleted file mode 100644 index d9bc068ce748..000000000000 --- a/vendor/github.com/nsf/termbox-go/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2012 termbox-go authors - -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/nsf/termbox-go/README.md b/vendor/github.com/nsf/termbox-go/README.md deleted file mode 100644 index 4b2e73ccc13a..000000000000 --- a/vendor/github.com/nsf/termbox-go/README.md +++ /dev/null @@ -1,31 +0,0 @@ -## Termbox -Termbox is a library that provides a minimalistic API which allows the programmer to write text-based user interfaces. The library is crossplatform and has both terminal-based implementations on *nix operating systems and a winapi console based implementation for windows operating systems. The basic idea is an abstraction of the greatest common subset of features available on all major terminals and other terminal-like APIs in a minimalistic fashion. Small API means it is easy to implement, test, maintain and learn it, that's what makes the termbox a distinct library in its area. - -### Installation -Install and update this go package with `go get -u github.com/nsf/termbox-go` - -### Examples -For examples of what can be done take a look at demos in the _demos directory. You can try them with go run: `go run _demos/keyboard.go` - -There are also some interesting projects using termbox-go: - - [godit](https://github.com/nsf/godit) is an emacsish lightweight text editor written using termbox. - - [gomatrix](https://github.com/GeertJohan/gomatrix) connects to The Matrix and displays its data streams in your terminal. - - [gotetris](https://github.com/jjinux/gotetris) is an implementation of Tetris. - - [sokoban-go](https://github.com/rn2dy/sokoban-go) is an implementation of sokoban game. - - [hecate](https://github.com/evanmiller/hecate) is a hex editor designed by Satan. - - [httopd](https://github.com/verdverm/httopd) is top for httpd logs. - - [mop](https://github.com/michaeldv/mop) is stock market tracker for hackers. - - [termui](https://github.com/gizak/termui) is a terminal dashboard. - - [termloop](https://github.com/JoelOtter/termloop) is a terminal game engine. - - [xterm-color-chart](https://github.com/kutuluk/xterm-color-chart) is a XTerm 256 color chart. - - [gocui](https://github.com/jroimartin/gocui) is a minimalist Go library aimed at creating console user interfaces. - - [dry](https://github.com/moncho/dry) is an interactive cli to manage Docker containers. - - [pxl](https://github.com/ichinaski/pxl) displays images in the terminal. - - [snake-game](https://github.com/DyegoCosta/snake-game) is an implementation of the Snake game. - - [gone](https://github.com/guillaumebreton/gone) is a CLI pomodoro® timer. - - [Spoof.go](https://github.com/sabey/spoofgo) controllable movement spoofing from the cli - - [lf](https://github.com/gokcehan/lf) is a terminal file manager - - [rat](https://github.com/ericfreese/rat) lets you compose shell commands to build terminal applications. - -### API reference -[godoc.org/github.com/nsf/termbox-go](http://godoc.org/github.com/nsf/termbox-go) diff --git a/vendor/github.com/nsf/termbox-go/api.go b/vendor/github.com/nsf/termbox-go/api.go deleted file mode 100644 index b242ddcf3a23..000000000000 --- a/vendor/github.com/nsf/termbox-go/api.go +++ /dev/null @@ -1,457 +0,0 @@ -// +build !windows - -package termbox - -import "github.com/mattn/go-runewidth" -import "fmt" -import "os" -import "os/signal" -import "syscall" -import "runtime" - -// public API - -// Initializes termbox library. This function should be called before any other functions. -// After successful initialization, the library must be finalized using 'Close' function. -// -// Example usage: -// err := termbox.Init() -// if err != nil { -// panic(err) -// } -// defer termbox.Close() -func Init() error { - var err error - - out, err = os.OpenFile("/dev/tty", syscall.O_WRONLY, 0) - if err != nil { - return err - } - in, err = syscall.Open("/dev/tty", syscall.O_RDONLY, 0) - if err != nil { - return err - } - - err = setup_term() - if err != nil { - return fmt.Errorf("termbox: error while reading terminfo data: %v", err) - } - - signal.Notify(sigwinch, syscall.SIGWINCH) - signal.Notify(sigio, syscall.SIGIO) - - _, err = fcntl(in, syscall.F_SETFL, syscall.O_ASYNC|syscall.O_NONBLOCK) - if err != nil { - return err - } - _, err = fcntl(in, syscall.F_SETOWN, syscall.Getpid()) - if runtime.GOOS != "darwin" && err != nil { - return err - } - err = tcgetattr(out.Fd(), &orig_tios) - if err != nil { - return err - } - - tios := orig_tios - tios.Iflag &^= syscall_IGNBRK | syscall_BRKINT | syscall_PARMRK | - syscall_ISTRIP | syscall_INLCR | syscall_IGNCR | - syscall_ICRNL | syscall_IXON - tios.Lflag &^= syscall_ECHO | syscall_ECHONL | syscall_ICANON | - syscall_ISIG | syscall_IEXTEN - tios.Cflag &^= syscall_CSIZE | syscall_PARENB - tios.Cflag |= syscall_CS8 - tios.Cc[syscall_VMIN] = 1 - tios.Cc[syscall_VTIME] = 0 - - err = tcsetattr(out.Fd(), &tios) - if err != nil { - return err - } - - out.WriteString(funcs[t_enter_ca]) - out.WriteString(funcs[t_enter_keypad]) - out.WriteString(funcs[t_hide_cursor]) - out.WriteString(funcs[t_clear_screen]) - - termw, termh = get_term_size(out.Fd()) - back_buffer.init(termw, termh) - front_buffer.init(termw, termh) - back_buffer.clear() - front_buffer.clear() - - go func() { - buf := make([]byte, 128) - for { - select { - case <-sigio: - for { - n, err := syscall.Read(in, buf) - if err == syscall.EAGAIN || err == syscall.EWOULDBLOCK { - break - } - select { - case input_comm <- input_event{buf[:n], err}: - ie := <-input_comm - buf = ie.data[:128] - case <-quit: - return - } - } - case <-quit: - return - } - } - }() - - IsInit = true - return nil -} - -// Interrupt an in-progress call to PollEvent by causing it to return -// EventInterrupt. Note that this function will block until the PollEvent -// function has successfully been interrupted. -func Interrupt() { - interrupt_comm <- struct{}{} -} - -// Finalizes termbox library, should be called after successful initialization -// when termbox's functionality isn't required anymore. -func Close() { - quit <- 1 - out.WriteString(funcs[t_show_cursor]) - out.WriteString(funcs[t_sgr0]) - out.WriteString(funcs[t_clear_screen]) - out.WriteString(funcs[t_exit_ca]) - out.WriteString(funcs[t_exit_keypad]) - out.WriteString(funcs[t_exit_mouse]) - tcsetattr(out.Fd(), &orig_tios) - - out.Close() - syscall.Close(in) - - // reset the state, so that on next Init() it will work again - termw = 0 - termh = 0 - input_mode = InputEsc - out = nil - in = 0 - lastfg = attr_invalid - lastbg = attr_invalid - lastx = coord_invalid - lasty = coord_invalid - cursor_x = cursor_hidden - cursor_y = cursor_hidden - foreground = ColorDefault - background = ColorDefault - IsInit = false -} - -// Synchronizes the internal back buffer with the terminal. -func Flush() error { - // invalidate cursor position - lastx = coord_invalid - lasty = coord_invalid - - update_size_maybe() - - for y := 0; y < front_buffer.height; y++ { - line_offset := y * front_buffer.width - for x := 0; x < front_buffer.width; { - cell_offset := line_offset + x - back := &back_buffer.cells[cell_offset] - front := &front_buffer.cells[cell_offset] - if back.Ch < ' ' { - back.Ch = ' ' - } - w := runewidth.RuneWidth(back.Ch) - if w == 0 || w == 2 && runewidth.IsAmbiguousWidth(back.Ch) { - w = 1 - } - if *back == *front { - x += w - continue - } - *front = *back - send_attr(back.Fg, back.Bg) - - if w == 2 && x == front_buffer.width-1 { - // there's not enough space for 2-cells rune, - // let's just put a space in there - send_char(x, y, ' ') - } else { - send_char(x, y, back.Ch) - if w == 2 { - next := cell_offset + 1 - front_buffer.cells[next] = Cell{ - Ch: 0, - Fg: back.Fg, - Bg: back.Bg, - } - } - } - x += w - } - } - if !is_cursor_hidden(cursor_x, cursor_y) { - write_cursor(cursor_x, cursor_y) - } - return flush() -} - -// Sets the position of the cursor. See also HideCursor(). -func SetCursor(x, y int) { - if is_cursor_hidden(cursor_x, cursor_y) && !is_cursor_hidden(x, y) { - outbuf.WriteString(funcs[t_show_cursor]) - } - - if !is_cursor_hidden(cursor_x, cursor_y) && is_cursor_hidden(x, y) { - outbuf.WriteString(funcs[t_hide_cursor]) - } - - cursor_x, cursor_y = x, y - if !is_cursor_hidden(cursor_x, cursor_y) { - write_cursor(cursor_x, cursor_y) - } -} - -// The shortcut for SetCursor(-1, -1). -func HideCursor() { - SetCursor(cursor_hidden, cursor_hidden) -} - -// Changes cell's parameters in the internal back buffer at the specified -// position. -func SetCell(x, y int, ch rune, fg, bg Attribute) { - if x < 0 || x >= back_buffer.width { - return - } - if y < 0 || y >= back_buffer.height { - return - } - - back_buffer.cells[y*back_buffer.width+x] = Cell{ch, fg, bg} -} - -// Returns a slice into the termbox's back buffer. You can get its dimensions -// using 'Size' function. The slice remains valid as long as no 'Clear' or -// 'Flush' function calls were made after call to this function. -func CellBuffer() []Cell { - return back_buffer.cells -} - -// After getting a raw event from PollRawEvent function call, you can parse it -// again into an ordinary one using termbox logic. That is parse an event as -// termbox would do it. Returned event in addition to usual Event struct fields -// sets N field to the amount of bytes used within 'data' slice. If the length -// of 'data' slice is zero or event cannot be parsed for some other reason, the -// function will return a special event type: EventNone. -// -// IMPORTANT: EventNone may contain a non-zero N, which means you should skip -// these bytes, because termbox cannot recognize them. -// -// NOTE: This API is experimental and may change in future. -func ParseEvent(data []byte) Event { - event := Event{Type: EventKey} - ok := extract_event(data, &event) - if !ok { - return Event{Type: EventNone, N: event.N} - } - return event -} - -// Wait for an event and return it. This is a blocking function call. Instead -// of EventKey and EventMouse it returns EventRaw events. Raw event is written -// into `data` slice and Event's N field is set to the amount of bytes written. -// The minimum required length of the 'data' slice is 1. This requirement may -// vary on different platforms. -// -// NOTE: This API is experimental and may change in future. -func PollRawEvent(data []byte) Event { - if len(data) == 0 { - panic("len(data) >= 1 is a requirement") - } - - var event Event - if extract_raw_event(data, &event) { - return event - } - - for { - select { - case ev := <-input_comm: - if ev.err != nil { - return Event{Type: EventError, Err: ev.err} - } - - inbuf = append(inbuf, ev.data...) - input_comm <- ev - if extract_raw_event(data, &event) { - return event - } - case <-interrupt_comm: - event.Type = EventInterrupt - return event - - case <-sigwinch: - event.Type = EventResize - event.Width, event.Height = get_term_size(out.Fd()) - return event - } - } -} - -// Wait for an event and return it. This is a blocking function call. -func PollEvent() Event { - var event Event - - // try to extract event from input buffer, return on success - event.Type = EventKey - ok := extract_event(inbuf, &event) - if event.N != 0 { - copy(inbuf, inbuf[event.N:]) - inbuf = inbuf[:len(inbuf)-event.N] - } - if ok { - return event - } - - for { - select { - case ev := <-input_comm: - if ev.err != nil { - return Event{Type: EventError, Err: ev.err} - } - - inbuf = append(inbuf, ev.data...) - input_comm <- ev - ok := extract_event(inbuf, &event) - if event.N != 0 { - copy(inbuf, inbuf[event.N:]) - inbuf = inbuf[:len(inbuf)-event.N] - } - if ok { - return event - } - case <-interrupt_comm: - event.Type = EventInterrupt - return event - - case <-sigwinch: - event.Type = EventResize - event.Width, event.Height = get_term_size(out.Fd()) - return event - } - } -} - -// Returns the size of the internal back buffer (which is mostly the same as -// terminal's window size in characters). But it doesn't always match the size -// of the terminal window, after the terminal size has changed, the internal -// back buffer will get in sync only after Clear or Flush function calls. -func Size() (width int, height int) { - return termw, termh -} - -// Clears the internal back buffer. -func Clear(fg, bg Attribute) error { - foreground, background = fg, bg - err := update_size_maybe() - back_buffer.clear() - return err -} - -// Sets termbox input mode. Termbox has two input modes: -// -// 1. Esc input mode. When ESC sequence is in the buffer and it doesn't match -// any known sequence. ESC means KeyEsc. This is the default input mode. -// -// 2. Alt input mode. When ESC sequence is in the buffer and it doesn't match -// any known sequence. ESC enables ModAlt modifier for the next keyboard event. -// -// Both input modes can be OR'ed with Mouse mode. Setting Mouse mode bit up will -// enable mouse button press/release and drag events. -// -// If 'mode' is InputCurrent, returns the current input mode. See also Input* -// constants. -func SetInputMode(mode InputMode) InputMode { - if mode == InputCurrent { - return input_mode - } - if mode&(InputEsc|InputAlt) == 0 { - mode |= InputEsc - } - if mode&(InputEsc|InputAlt) == InputEsc|InputAlt { - mode &^= InputAlt - } - if mode&InputMouse != 0 { - out.WriteString(funcs[t_enter_mouse]) - } else { - out.WriteString(funcs[t_exit_mouse]) - } - - input_mode = mode - return input_mode -} - -// Sets the termbox output mode. Termbox has four output options: -// -// 1. OutputNormal => [1..8] -// This mode provides 8 different colors: -// black, red, green, yellow, blue, magenta, cyan, white -// Shortcut: ColorBlack, ColorRed, ... -// Attributes: AttrBold, AttrUnderline, AttrReverse -// -// Example usage: -// SetCell(x, y, '@', ColorBlack | AttrBold, ColorRed); -// -// 2. Output256 => [1..256] -// In this mode you can leverage the 256 terminal mode: -// 0x01 - 0x08: the 8 colors as in OutputNormal -// 0x09 - 0x10: Color* | AttrBold -// 0x11 - 0xe8: 216 different colors -// 0xe9 - 0x1ff: 24 different shades of grey -// -// Example usage: -// SetCell(x, y, '@', 184, 240); -// SetCell(x, y, '@', 0xb8, 0xf0); -// -// 3. Output216 => [1..216] -// This mode supports the 3rd range of the 256 mode only. -// But you dont need to provide an offset. -// -// 4. OutputGrayscale => [1..26] -// This mode supports the 4th range of the 256 mode -// and black and white colors from 3th range of the 256 mode -// But you dont need to provide an offset. -// -// In all modes, 0x00 represents the default color. -// -// `go run _demos/output.go` to see its impact on your terminal. -// -// If 'mode' is OutputCurrent, it returns the current output mode. -// -// Note that this may return a different OutputMode than the one requested, -// as the requested mode may not be available on the target platform. -func SetOutputMode(mode OutputMode) OutputMode { - if mode == OutputCurrent { - return output_mode - } - - output_mode = mode - return output_mode -} - -// Sync comes handy when something causes desync between termbox's understanding -// of a terminal buffer and the reality. Such as a third party process. Sync -// forces a complete resync between the termbox and a terminal, it may not be -// visually pretty though. -func Sync() error { - front_buffer.clear() - err := send_clear() - if err != nil { - return err - } - - return Flush() -} diff --git a/vendor/github.com/nsf/termbox-go/api_common.go b/vendor/github.com/nsf/termbox-go/api_common.go deleted file mode 100644 index 9f23661f561e..000000000000 --- a/vendor/github.com/nsf/termbox-go/api_common.go +++ /dev/null @@ -1,187 +0,0 @@ -// termbox is a library for creating cross-platform text-based interfaces -package termbox - -// public API, common OS agnostic part - -type ( - InputMode int - OutputMode int - EventType uint8 - Modifier uint8 - Key uint16 - Attribute uint16 -) - -// This type represents a termbox event. The 'Mod', 'Key' and 'Ch' fields are -// valid if 'Type' is EventKey. The 'Width' and 'Height' fields are valid if -// 'Type' is EventResize. The 'Err' field is valid if 'Type' is EventError. -type Event struct { - Type EventType // one of Event* constants - Mod Modifier // one of Mod* constants or 0 - Key Key // one of Key* constants, invalid if 'Ch' is not 0 - Ch rune // a unicode character - Width int // width of the screen - Height int // height of the screen - Err error // error in case if input failed - MouseX int // x coord of mouse - MouseY int // y coord of mouse - N int // number of bytes written when getting a raw event -} - -// A cell, single conceptual entity on the screen. The screen is basically a 2d -// array of cells. 'Ch' is a unicode character, 'Fg' and 'Bg' are foreground -// and background attributes respectively. -type Cell struct { - Ch rune - Fg Attribute - Bg Attribute -} - -// To know if termbox has been initialized or not -var ( - IsInit bool = false -) - -// Key constants, see Event.Key field. -const ( - KeyF1 Key = 0xFFFF - iota - KeyF2 - KeyF3 - KeyF4 - KeyF5 - KeyF6 - KeyF7 - KeyF8 - KeyF9 - KeyF10 - KeyF11 - KeyF12 - KeyInsert - KeyDelete - KeyHome - KeyEnd - KeyPgup - KeyPgdn - KeyArrowUp - KeyArrowDown - KeyArrowLeft - KeyArrowRight - key_min // see terminfo - MouseLeft - MouseMiddle - MouseRight - MouseRelease - MouseWheelUp - MouseWheelDown -) - -const ( - KeyCtrlTilde Key = 0x00 - KeyCtrl2 Key = 0x00 - KeyCtrlSpace Key = 0x00 - KeyCtrlA Key = 0x01 - KeyCtrlB Key = 0x02 - KeyCtrlC Key = 0x03 - KeyCtrlD Key = 0x04 - KeyCtrlE Key = 0x05 - KeyCtrlF Key = 0x06 - KeyCtrlG Key = 0x07 - KeyBackspace Key = 0x08 - KeyCtrlH Key = 0x08 - KeyTab Key = 0x09 - KeyCtrlI Key = 0x09 - KeyCtrlJ Key = 0x0A - KeyCtrlK Key = 0x0B - KeyCtrlL Key = 0x0C - KeyEnter Key = 0x0D - KeyCtrlM Key = 0x0D - KeyCtrlN Key = 0x0E - KeyCtrlO Key = 0x0F - KeyCtrlP Key = 0x10 - KeyCtrlQ Key = 0x11 - KeyCtrlR Key = 0x12 - KeyCtrlS Key = 0x13 - KeyCtrlT Key = 0x14 - KeyCtrlU Key = 0x15 - KeyCtrlV Key = 0x16 - KeyCtrlW Key = 0x17 - KeyCtrlX Key = 0x18 - KeyCtrlY Key = 0x19 - KeyCtrlZ Key = 0x1A - KeyEsc Key = 0x1B - KeyCtrlLsqBracket Key = 0x1B - KeyCtrl3 Key = 0x1B - KeyCtrl4 Key = 0x1C - KeyCtrlBackslash Key = 0x1C - KeyCtrl5 Key = 0x1D - KeyCtrlRsqBracket Key = 0x1D - KeyCtrl6 Key = 0x1E - KeyCtrl7 Key = 0x1F - KeyCtrlSlash Key = 0x1F - KeyCtrlUnderscore Key = 0x1F - KeySpace Key = 0x20 - KeyBackspace2 Key = 0x7F - KeyCtrl8 Key = 0x7F -) - -// Alt modifier constant, see Event.Mod field and SetInputMode function. -const ( - ModAlt Modifier = 1 << iota - ModMotion -) - -// Cell colors, you can combine a color with multiple attributes using bitwise -// OR ('|'). -const ( - ColorDefault Attribute = iota - ColorBlack - ColorRed - ColorGreen - ColorYellow - ColorBlue - ColorMagenta - ColorCyan - ColorWhite -) - -// Cell attributes, it is possible to use multiple attributes by combining them -// using bitwise OR ('|'). Although, colors cannot be combined. But you can -// combine attributes and a single color. -// -// It's worth mentioning that some platforms don't support certain attibutes. -// For example windows console doesn't support AttrUnderline. And on some -// terminals applying AttrBold to background may result in blinking text. Use -// them with caution and test your code on various terminals. -const ( - AttrBold Attribute = 1 << (iota + 9) - AttrUnderline - AttrReverse -) - -// Input mode. See SetInputMode function. -const ( - InputEsc InputMode = 1 << iota - InputAlt - InputMouse - InputCurrent InputMode = 0 -) - -// Output mode. See SetOutputMode function. -const ( - OutputCurrent OutputMode = iota - OutputNormal - Output256 - Output216 - OutputGrayscale -) - -// Event type. See Event.Type field. -const ( - EventKey EventType = iota - EventResize - EventMouse - EventError - EventInterrupt - EventRaw - EventNone -) diff --git a/vendor/github.com/nsf/termbox-go/api_windows.go b/vendor/github.com/nsf/termbox-go/api_windows.go deleted file mode 100644 index 7def30a67df0..000000000000 --- a/vendor/github.com/nsf/termbox-go/api_windows.go +++ /dev/null @@ -1,239 +0,0 @@ -package termbox - -import ( - "syscall" -) - -// public API - -// Initializes termbox library. This function should be called before any other functions. -// After successful initialization, the library must be finalized using 'Close' function. -// -// Example usage: -// err := termbox.Init() -// if err != nil { -// panic(err) -// } -// defer termbox.Close() -func Init() error { - var err error - - interrupt, err = create_event() - if err != nil { - return err - } - - in, err = syscall.Open("CONIN$", syscall.O_RDWR, 0) - if err != nil { - return err - } - out, err = syscall.Open("CONOUT$", syscall.O_RDWR, 0) - if err != nil { - return err - } - - err = get_console_mode(in, &orig_mode) - if err != nil { - return err - } - - err = set_console_mode(in, enable_window_input) - if err != nil { - return err - } - - orig_size = get_term_size(out) - win_size := get_win_size(out) - - err = set_console_screen_buffer_size(out, win_size) - if err != nil { - return err - } - - err = get_console_cursor_info(out, &orig_cursor_info) - if err != nil { - return err - } - - show_cursor(false) - term_size = get_term_size(out) - back_buffer.init(int(term_size.x), int(term_size.y)) - front_buffer.init(int(term_size.x), int(term_size.y)) - back_buffer.clear() - front_buffer.clear() - clear() - - diffbuf = make([]diff_msg, 0, 32) - - go input_event_producer() - IsInit = true - return nil -} - -// Finalizes termbox library, should be called after successful initialization -// when termbox's functionality isn't required anymore. -func Close() { - // we ignore errors here, because we can't really do anything about them - Clear(0, 0) - Flush() - - // stop event producer - cancel_comm <- true - set_event(interrupt) - select { - case <-input_comm: - default: - } - <-cancel_done_comm - - set_console_cursor_info(out, &orig_cursor_info) - set_console_cursor_position(out, coord{}) - set_console_screen_buffer_size(out, orig_size) - set_console_mode(in, orig_mode) - syscall.Close(in) - syscall.Close(out) - syscall.Close(interrupt) - IsInit = false -} - -// Interrupt an in-progress call to PollEvent by causing it to return -// EventInterrupt. Note that this function will block until the PollEvent -// function has successfully been interrupted. -func Interrupt() { - interrupt_comm <- struct{}{} -} - -// Synchronizes the internal back buffer with the terminal. -func Flush() error { - update_size_maybe() - prepare_diff_messages() - for _, diff := range diffbuf { - r := small_rect{ - left: 0, - top: diff.pos, - right: term_size.x - 1, - bottom: diff.pos + diff.lines - 1, - } - write_console_output(out, diff.chars, r) - } - if !is_cursor_hidden(cursor_x, cursor_y) { - move_cursor(cursor_x, cursor_y) - } - return nil -} - -// Sets the position of the cursor. See also HideCursor(). -func SetCursor(x, y int) { - if is_cursor_hidden(cursor_x, cursor_y) && !is_cursor_hidden(x, y) { - show_cursor(true) - } - - if !is_cursor_hidden(cursor_x, cursor_y) && is_cursor_hidden(x, y) { - show_cursor(false) - } - - cursor_x, cursor_y = x, y - if !is_cursor_hidden(cursor_x, cursor_y) { - move_cursor(cursor_x, cursor_y) - } -} - -// The shortcut for SetCursor(-1, -1). -func HideCursor() { - SetCursor(cursor_hidden, cursor_hidden) -} - -// Changes cell's parameters in the internal back buffer at the specified -// position. -func SetCell(x, y int, ch rune, fg, bg Attribute) { - if x < 0 || x >= back_buffer.width { - return - } - if y < 0 || y >= back_buffer.height { - return - } - - back_buffer.cells[y*back_buffer.width+x] = Cell{ch, fg, bg} -} - -// Returns a slice into the termbox's back buffer. You can get its dimensions -// using 'Size' function. The slice remains valid as long as no 'Clear' or -// 'Flush' function calls were made after call to this function. -func CellBuffer() []Cell { - return back_buffer.cells -} - -// Wait for an event and return it. This is a blocking function call. -func PollEvent() Event { - select { - case ev := <-input_comm: - return ev - case <-interrupt_comm: - return Event{Type: EventInterrupt} - } -} - -// Returns the size of the internal back buffer (which is mostly the same as -// console's window size in characters). But it doesn't always match the size -// of the console window, after the console size has changed, the internal back -// buffer will get in sync only after Clear or Flush function calls. -func Size() (int, int) { - return int(term_size.x), int(term_size.y) -} - -// Clears the internal back buffer. -func Clear(fg, bg Attribute) error { - foreground, background = fg, bg - update_size_maybe() - back_buffer.clear() - return nil -} - -// Sets termbox input mode. Termbox has two input modes: -// -// 1. Esc input mode. When ESC sequence is in the buffer and it doesn't match -// any known sequence. ESC means KeyEsc. This is the default input mode. -// -// 2. Alt input mode. When ESC sequence is in the buffer and it doesn't match -// any known sequence. ESC enables ModAlt modifier for the next keyboard event. -// -// Both input modes can be OR'ed with Mouse mode. Setting Mouse mode bit up will -// enable mouse button press/release and drag events. -// -// If 'mode' is InputCurrent, returns the current input mode. See also Input* -// constants. -func SetInputMode(mode InputMode) InputMode { - if mode == InputCurrent { - return input_mode - } - if mode&InputMouse != 0 { - err := set_console_mode(in, enable_window_input|enable_mouse_input|enable_extended_flags) - if err != nil { - panic(err) - } - } else { - err := set_console_mode(in, enable_window_input) - if err != nil { - panic(err) - } - } - - input_mode = mode - return input_mode -} - -// Sets the termbox output mode. -// -// Windows console does not support extra colour modes, -// so this will always set and return OutputNormal. -func SetOutputMode(mode OutputMode) OutputMode { - return OutputNormal -} - -// Sync comes handy when something causes desync between termbox's understanding -// of a terminal buffer and the reality. Such as a third party process. Sync -// forces a complete resync between the termbox and a terminal, it may not be -// visually pretty though. At the moment on Windows it does nothing. -func Sync() error { - return nil -} diff --git a/vendor/github.com/nsf/termbox-go/collect_terminfo.py b/vendor/github.com/nsf/termbox-go/collect_terminfo.py deleted file mode 100755 index 5e50975e63ab..000000000000 --- a/vendor/github.com/nsf/termbox-go/collect_terminfo.py +++ /dev/null @@ -1,110 +0,0 @@ -#!/usr/bin/env python - -import sys, os, subprocess - -def escaped(s): - return repr(s)[1:-1] - -def tput(term, name): - try: - return subprocess.check_output(['tput', '-T%s' % term, name]).decode() - except subprocess.CalledProcessError as e: - return e.output.decode() - - -def w(s): - if s == None: - return - sys.stdout.write(s) - -terminals = { - 'xterm' : 'xterm', - 'rxvt-256color' : 'rxvt_256color', - 'rxvt-unicode' : 'rxvt_unicode', - 'linux' : 'linux', - 'Eterm' : 'eterm', - 'screen' : 'screen' -} - -keys = [ - "F1", "kf1", - "F2", "kf2", - "F3", "kf3", - "F4", "kf4", - "F5", "kf5", - "F6", "kf6", - "F7", "kf7", - "F8", "kf8", - "F9", "kf9", - "F10", "kf10", - "F11", "kf11", - "F12", "kf12", - "INSERT", "kich1", - "DELETE", "kdch1", - "HOME", "khome", - "END", "kend", - "PGUP", "kpp", - "PGDN", "knp", - "KEY_UP", "kcuu1", - "KEY_DOWN", "kcud1", - "KEY_LEFT", "kcub1", - "KEY_RIGHT", "kcuf1" -] - -funcs = [ - "T_ENTER_CA", "smcup", - "T_EXIT_CA", "rmcup", - "T_SHOW_CURSOR", "cnorm", - "T_HIDE_CURSOR", "civis", - "T_CLEAR_SCREEN", "clear", - "T_SGR0", "sgr0", - "T_UNDERLINE", "smul", - "T_BOLD", "bold", - "T_BLINK", "blink", - "T_REVERSE", "rev", - "T_ENTER_KEYPAD", "smkx", - "T_EXIT_KEYPAD", "rmkx" -] - -def iter_pairs(iterable): - iterable = iter(iterable) - while True: - yield (next(iterable), next(iterable)) - -def do_term(term, nick): - w("// %s\n" % term) - w("var %s_keys = []string{\n\t" % nick) - for k, v in iter_pairs(keys): - w('"') - w(escaped(tput(term, v))) - w('",') - w("\n}\n") - w("var %s_funcs = []string{\n\t" % nick) - for k,v in iter_pairs(funcs): - w('"') - if v == "sgr": - w("\\033[3%d;4%dm") - elif v == "cup": - w("\\033[%d;%dH") - else: - w(escaped(tput(term, v))) - w('", ') - w("\n}\n\n") - -def do_terms(d): - w("var terms = []struct {\n") - w("\tname string\n") - w("\tkeys []string\n") - w("\tfuncs []string\n") - w("}{\n") - for k, v in d.items(): - w('\t{"%s", %s_keys, %s_funcs},\n' % (k, v, v)) - w("}\n\n") - -w("// +build !windows\n\npackage termbox\n\n") - -for k,v in terminals.items(): - do_term(k, v) - -do_terms(terminals) - diff --git a/vendor/github.com/nsf/termbox-go/syscalls.go b/vendor/github.com/nsf/termbox-go/syscalls.go deleted file mode 100644 index 4f52bb9af9a1..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls.go +++ /dev/null @@ -1,39 +0,0 @@ -// +build ignore - -package termbox - -/* -#include -#include -*/ -import "C" - -type syscall_Termios C.struct_termios - -const ( - syscall_IGNBRK = C.IGNBRK - syscall_BRKINT = C.BRKINT - syscall_PARMRK = C.PARMRK - syscall_ISTRIP = C.ISTRIP - syscall_INLCR = C.INLCR - syscall_IGNCR = C.IGNCR - syscall_ICRNL = C.ICRNL - syscall_IXON = C.IXON - syscall_OPOST = C.OPOST - syscall_ECHO = C.ECHO - syscall_ECHONL = C.ECHONL - syscall_ICANON = C.ICANON - syscall_ISIG = C.ISIG - syscall_IEXTEN = C.IEXTEN - syscall_CSIZE = C.CSIZE - syscall_PARENB = C.PARENB - syscall_CS8 = C.CS8 - syscall_VMIN = C.VMIN - syscall_VTIME = C.VTIME - - // on darwin change these to (on *bsd too?): - // C.TIOCGETA - // C.TIOCSETA - syscall_TCGETS = C.TCGETS - syscall_TCSETS = C.TCSETS -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_darwin.go b/vendor/github.com/nsf/termbox-go/syscalls_darwin.go deleted file mode 100644 index 25b78f7ab70b..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_darwin.go +++ /dev/null @@ -1,41 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs syscalls.go - -// +build !amd64 - -package termbox - -type syscall_Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]uint8 - Ispeed uint32 - Ospeed uint32 -} - -const ( - syscall_IGNBRK = 0x1 - syscall_BRKINT = 0x2 - syscall_PARMRK = 0x8 - syscall_ISTRIP = 0x20 - syscall_INLCR = 0x40 - syscall_IGNCR = 0x80 - syscall_ICRNL = 0x100 - syscall_IXON = 0x200 - syscall_OPOST = 0x1 - syscall_ECHO = 0x8 - syscall_ECHONL = 0x10 - syscall_ICANON = 0x100 - syscall_ISIG = 0x80 - syscall_IEXTEN = 0x400 - syscall_CSIZE = 0x300 - syscall_PARENB = 0x1000 - syscall_CS8 = 0x300 - syscall_VMIN = 0x10 - syscall_VTIME = 0x11 - - syscall_TCGETS = 0x402c7413 - syscall_TCSETS = 0x802c7414 -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_darwin_amd64.go b/vendor/github.com/nsf/termbox-go/syscalls_darwin_amd64.go deleted file mode 100644 index 11f25be79a4b..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_darwin_amd64.go +++ /dev/null @@ -1,40 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs syscalls.go - -package termbox - -type syscall_Termios struct { - Iflag uint64 - Oflag uint64 - Cflag uint64 - Lflag uint64 - Cc [20]uint8 - Pad_cgo_0 [4]byte - Ispeed uint64 - Ospeed uint64 -} - -const ( - syscall_IGNBRK = 0x1 - syscall_BRKINT = 0x2 - syscall_PARMRK = 0x8 - syscall_ISTRIP = 0x20 - syscall_INLCR = 0x40 - syscall_IGNCR = 0x80 - syscall_ICRNL = 0x100 - syscall_IXON = 0x200 - syscall_OPOST = 0x1 - syscall_ECHO = 0x8 - syscall_ECHONL = 0x10 - syscall_ICANON = 0x100 - syscall_ISIG = 0x80 - syscall_IEXTEN = 0x400 - syscall_CSIZE = 0x300 - syscall_PARENB = 0x1000 - syscall_CS8 = 0x300 - syscall_VMIN = 0x10 - syscall_VTIME = 0x11 - - syscall_TCGETS = 0x40487413 - syscall_TCSETS = 0x80487414 -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_dragonfly.go b/vendor/github.com/nsf/termbox-go/syscalls_dragonfly.go deleted file mode 100644 index e03624ebc71a..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_dragonfly.go +++ /dev/null @@ -1,39 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs syscalls.go - -package termbox - -type syscall_Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]uint8 - Ispeed uint32 - Ospeed uint32 -} - -const ( - syscall_IGNBRK = 0x1 - syscall_BRKINT = 0x2 - syscall_PARMRK = 0x8 - syscall_ISTRIP = 0x20 - syscall_INLCR = 0x40 - syscall_IGNCR = 0x80 - syscall_ICRNL = 0x100 - syscall_IXON = 0x200 - syscall_OPOST = 0x1 - syscall_ECHO = 0x8 - syscall_ECHONL = 0x10 - syscall_ICANON = 0x100 - syscall_ISIG = 0x80 - syscall_IEXTEN = 0x400 - syscall_CSIZE = 0x300 - syscall_PARENB = 0x1000 - syscall_CS8 = 0x300 - syscall_VMIN = 0x10 - syscall_VTIME = 0x11 - - syscall_TCGETS = 0x402c7413 - syscall_TCSETS = 0x802c7414 -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_freebsd.go b/vendor/github.com/nsf/termbox-go/syscalls_freebsd.go deleted file mode 100644 index e03624ebc71a..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_freebsd.go +++ /dev/null @@ -1,39 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs syscalls.go - -package termbox - -type syscall_Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]uint8 - Ispeed uint32 - Ospeed uint32 -} - -const ( - syscall_IGNBRK = 0x1 - syscall_BRKINT = 0x2 - syscall_PARMRK = 0x8 - syscall_ISTRIP = 0x20 - syscall_INLCR = 0x40 - syscall_IGNCR = 0x80 - syscall_ICRNL = 0x100 - syscall_IXON = 0x200 - syscall_OPOST = 0x1 - syscall_ECHO = 0x8 - syscall_ECHONL = 0x10 - syscall_ICANON = 0x100 - syscall_ISIG = 0x80 - syscall_IEXTEN = 0x400 - syscall_CSIZE = 0x300 - syscall_PARENB = 0x1000 - syscall_CS8 = 0x300 - syscall_VMIN = 0x10 - syscall_VTIME = 0x11 - - syscall_TCGETS = 0x402c7413 - syscall_TCSETS = 0x802c7414 -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_linux.go b/vendor/github.com/nsf/termbox-go/syscalls_linux.go deleted file mode 100644 index b88960de617c..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_linux.go +++ /dev/null @@ -1,33 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs syscalls.go - -package termbox - -import "syscall" - -type syscall_Termios syscall.Termios - -const ( - syscall_IGNBRK = syscall.IGNBRK - syscall_BRKINT = syscall.BRKINT - syscall_PARMRK = syscall.PARMRK - syscall_ISTRIP = syscall.ISTRIP - syscall_INLCR = syscall.INLCR - syscall_IGNCR = syscall.IGNCR - syscall_ICRNL = syscall.ICRNL - syscall_IXON = syscall.IXON - syscall_OPOST = syscall.OPOST - syscall_ECHO = syscall.ECHO - syscall_ECHONL = syscall.ECHONL - syscall_ICANON = syscall.ICANON - syscall_ISIG = syscall.ISIG - syscall_IEXTEN = syscall.IEXTEN - syscall_CSIZE = syscall.CSIZE - syscall_PARENB = syscall.PARENB - syscall_CS8 = syscall.CS8 - syscall_VMIN = syscall.VMIN - syscall_VTIME = syscall.VTIME - - syscall_TCGETS = syscall.TCGETS - syscall_TCSETS = syscall.TCSETS -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_netbsd.go b/vendor/github.com/nsf/termbox-go/syscalls_netbsd.go deleted file mode 100644 index 49a3355b9a2d..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_netbsd.go +++ /dev/null @@ -1,39 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs syscalls.go - -package termbox - -type syscall_Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]uint8 - Ispeed int32 - Ospeed int32 -} - -const ( - syscall_IGNBRK = 0x1 - syscall_BRKINT = 0x2 - syscall_PARMRK = 0x8 - syscall_ISTRIP = 0x20 - syscall_INLCR = 0x40 - syscall_IGNCR = 0x80 - syscall_ICRNL = 0x100 - syscall_IXON = 0x200 - syscall_OPOST = 0x1 - syscall_ECHO = 0x8 - syscall_ECHONL = 0x10 - syscall_ICANON = 0x100 - syscall_ISIG = 0x80 - syscall_IEXTEN = 0x400 - syscall_CSIZE = 0x300 - syscall_PARENB = 0x1000 - syscall_CS8 = 0x300 - syscall_VMIN = 0x10 - syscall_VTIME = 0x11 - - syscall_TCGETS = 0x402c7413 - syscall_TCSETS = 0x802c7414 -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_openbsd.go b/vendor/github.com/nsf/termbox-go/syscalls_openbsd.go deleted file mode 100644 index 49a3355b9a2d..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_openbsd.go +++ /dev/null @@ -1,39 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs syscalls.go - -package termbox - -type syscall_Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]uint8 - Ispeed int32 - Ospeed int32 -} - -const ( - syscall_IGNBRK = 0x1 - syscall_BRKINT = 0x2 - syscall_PARMRK = 0x8 - syscall_ISTRIP = 0x20 - syscall_INLCR = 0x40 - syscall_IGNCR = 0x80 - syscall_ICRNL = 0x100 - syscall_IXON = 0x200 - syscall_OPOST = 0x1 - syscall_ECHO = 0x8 - syscall_ECHONL = 0x10 - syscall_ICANON = 0x100 - syscall_ISIG = 0x80 - syscall_IEXTEN = 0x400 - syscall_CSIZE = 0x300 - syscall_PARENB = 0x1000 - syscall_CS8 = 0x300 - syscall_VMIN = 0x10 - syscall_VTIME = 0x11 - - syscall_TCGETS = 0x402c7413 - syscall_TCSETS = 0x802c7414 -) diff --git a/vendor/github.com/nsf/termbox-go/syscalls_windows.go b/vendor/github.com/nsf/termbox-go/syscalls_windows.go deleted file mode 100644 index 472d002a56aa..000000000000 --- a/vendor/github.com/nsf/termbox-go/syscalls_windows.go +++ /dev/null @@ -1,61 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs -- -DUNICODE syscalls.go - -package termbox - -const ( - foreground_blue = 0x1 - foreground_green = 0x2 - foreground_red = 0x4 - foreground_intensity = 0x8 - background_blue = 0x10 - background_green = 0x20 - background_red = 0x40 - background_intensity = 0x80 - std_input_handle = -0xa - std_output_handle = -0xb - key_event = 0x1 - mouse_event = 0x2 - window_buffer_size_event = 0x4 - enable_window_input = 0x8 - enable_mouse_input = 0x10 - enable_extended_flags = 0x80 - - vk_f1 = 0x70 - vk_f2 = 0x71 - vk_f3 = 0x72 - vk_f4 = 0x73 - vk_f5 = 0x74 - vk_f6 = 0x75 - vk_f7 = 0x76 - vk_f8 = 0x77 - vk_f9 = 0x78 - vk_f10 = 0x79 - vk_f11 = 0x7a - vk_f12 = 0x7b - vk_insert = 0x2d - vk_delete = 0x2e - vk_home = 0x24 - vk_end = 0x23 - vk_pgup = 0x21 - vk_pgdn = 0x22 - vk_arrow_up = 0x26 - vk_arrow_down = 0x28 - vk_arrow_left = 0x25 - vk_arrow_right = 0x27 - vk_backspace = 0x8 - vk_tab = 0x9 - vk_enter = 0xd - vk_esc = 0x1b - vk_space = 0x20 - - left_alt_pressed = 0x2 - left_ctrl_pressed = 0x8 - right_alt_pressed = 0x1 - right_ctrl_pressed = 0x4 - shift_pressed = 0x10 - - generic_read = 0x80000000 - generic_write = 0x40000000 - console_textmode_buffer = 0x1 -) diff --git a/vendor/github.com/nsf/termbox-go/termbox.go b/vendor/github.com/nsf/termbox-go/termbox.go deleted file mode 100644 index c2d86c6584e3..000000000000 --- a/vendor/github.com/nsf/termbox-go/termbox.go +++ /dev/null @@ -1,511 +0,0 @@ -// +build !windows - -package termbox - -import "unicode/utf8" -import "bytes" -import "syscall" -import "unsafe" -import "strings" -import "strconv" -import "os" -import "io" - -// private API - -const ( - t_enter_ca = iota - t_exit_ca - t_show_cursor - t_hide_cursor - t_clear_screen - t_sgr0 - t_underline - t_bold - t_blink - t_reverse - t_enter_keypad - t_exit_keypad - t_enter_mouse - t_exit_mouse - t_max_funcs -) - -const ( - coord_invalid = -2 - attr_invalid = Attribute(0xFFFF) -) - -type input_event struct { - data []byte - err error -} - -var ( - // term specific sequences - keys []string - funcs []string - - // termbox inner state - orig_tios syscall_Termios - back_buffer cellbuf - front_buffer cellbuf - termw int - termh int - input_mode = InputEsc - output_mode = OutputNormal - out *os.File - in int - lastfg = attr_invalid - lastbg = attr_invalid - lastx = coord_invalid - lasty = coord_invalid - cursor_x = cursor_hidden - cursor_y = cursor_hidden - foreground = ColorDefault - background = ColorDefault - inbuf = make([]byte, 0, 64) - outbuf bytes.Buffer - sigwinch = make(chan os.Signal, 1) - sigio = make(chan os.Signal, 1) - quit = make(chan int) - input_comm = make(chan input_event) - interrupt_comm = make(chan struct{}) - intbuf = make([]byte, 0, 16) - - // grayscale indexes - grayscale = []Attribute{ - 0, 17, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, - 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 232, - } -) - -func write_cursor(x, y int) { - outbuf.WriteString("\033[") - outbuf.Write(strconv.AppendUint(intbuf, uint64(y+1), 10)) - outbuf.WriteString(";") - outbuf.Write(strconv.AppendUint(intbuf, uint64(x+1), 10)) - outbuf.WriteString("H") -} - -func write_sgr_fg(a Attribute) { - switch output_mode { - case Output256, Output216, OutputGrayscale: - outbuf.WriteString("\033[38;5;") - outbuf.Write(strconv.AppendUint(intbuf, uint64(a-1), 10)) - outbuf.WriteString("m") - default: - outbuf.WriteString("\033[3") - outbuf.Write(strconv.AppendUint(intbuf, uint64(a-1), 10)) - outbuf.WriteString("m") - } -} - -func write_sgr_bg(a Attribute) { - switch output_mode { - case Output256, Output216, OutputGrayscale: - outbuf.WriteString("\033[48;5;") - outbuf.Write(strconv.AppendUint(intbuf, uint64(a-1), 10)) - outbuf.WriteString("m") - default: - outbuf.WriteString("\033[4") - outbuf.Write(strconv.AppendUint(intbuf, uint64(a-1), 10)) - outbuf.WriteString("m") - } -} - -func write_sgr(fg, bg Attribute) { - switch output_mode { - case Output256, Output216, OutputGrayscale: - outbuf.WriteString("\033[38;5;") - outbuf.Write(strconv.AppendUint(intbuf, uint64(fg-1), 10)) - outbuf.WriteString("m") - outbuf.WriteString("\033[48;5;") - outbuf.Write(strconv.AppendUint(intbuf, uint64(bg-1), 10)) - outbuf.WriteString("m") - default: - outbuf.WriteString("\033[3") - outbuf.Write(strconv.AppendUint(intbuf, uint64(fg-1), 10)) - outbuf.WriteString(";4") - outbuf.Write(strconv.AppendUint(intbuf, uint64(bg-1), 10)) - outbuf.WriteString("m") - } -} - -type winsize struct { - rows uint16 - cols uint16 - xpixels uint16 - ypixels uint16 -} - -func get_term_size(fd uintptr) (int, int) { - var sz winsize - _, _, _ = syscall.Syscall(syscall.SYS_IOCTL, - fd, uintptr(syscall.TIOCGWINSZ), uintptr(unsafe.Pointer(&sz))) - return int(sz.cols), int(sz.rows) -} - -func send_attr(fg, bg Attribute) { - if fg == lastfg && bg == lastbg { - return - } - - outbuf.WriteString(funcs[t_sgr0]) - - var fgcol, bgcol Attribute - - switch output_mode { - case Output256: - fgcol = fg & 0x1FF - bgcol = bg & 0x1FF - case Output216: - fgcol = fg & 0xFF - bgcol = bg & 0xFF - if fgcol > 216 { - fgcol = ColorDefault - } - if bgcol > 216 { - bgcol = ColorDefault - } - if fgcol != ColorDefault { - fgcol += 0x10 - } - if bgcol != ColorDefault { - bgcol += 0x10 - } - case OutputGrayscale: - fgcol = fg & 0x1F - bgcol = bg & 0x1F - if fgcol > 26 { - fgcol = ColorDefault - } - if bgcol > 26 { - bgcol = ColorDefault - } - if fgcol != ColorDefault { - fgcol = grayscale[fgcol] - } - if bgcol != ColorDefault { - bgcol = grayscale[bgcol] - } - default: - fgcol = fg & 0x0F - bgcol = bg & 0x0F - } - - if fgcol != ColorDefault { - if bgcol != ColorDefault { - write_sgr(fgcol, bgcol) - } else { - write_sgr_fg(fgcol) - } - } else if bgcol != ColorDefault { - write_sgr_bg(bgcol) - } - - if fg&AttrBold != 0 { - outbuf.WriteString(funcs[t_bold]) - } - if bg&AttrBold != 0 { - outbuf.WriteString(funcs[t_blink]) - } - if fg&AttrUnderline != 0 { - outbuf.WriteString(funcs[t_underline]) - } - if fg&AttrReverse|bg&AttrReverse != 0 { - outbuf.WriteString(funcs[t_reverse]) - } - - lastfg, lastbg = fg, bg -} - -func send_char(x, y int, ch rune) { - var buf [8]byte - n := utf8.EncodeRune(buf[:], ch) - if x-1 != lastx || y != lasty { - write_cursor(x, y) - } - lastx, lasty = x, y - outbuf.Write(buf[:n]) -} - -func flush() error { - _, err := io.Copy(out, &outbuf) - outbuf.Reset() - return err -} - -func send_clear() error { - send_attr(foreground, background) - outbuf.WriteString(funcs[t_clear_screen]) - if !is_cursor_hidden(cursor_x, cursor_y) { - write_cursor(cursor_x, cursor_y) - } - - // we need to invalidate cursor position too and these two vars are - // used only for simple cursor positioning optimization, cursor - // actually may be in the correct place, but we simply discard - // optimization once and it gives us simple solution for the case when - // cursor moved - lastx = coord_invalid - lasty = coord_invalid - - return flush() -} - -func update_size_maybe() error { - w, h := get_term_size(out.Fd()) - if w != termw || h != termh { - termw, termh = w, h - back_buffer.resize(termw, termh) - front_buffer.resize(termw, termh) - front_buffer.clear() - return send_clear() - } - return nil -} - -func tcsetattr(fd uintptr, termios *syscall_Termios) error { - r, _, e := syscall.Syscall(syscall.SYS_IOCTL, - fd, uintptr(syscall_TCSETS), uintptr(unsafe.Pointer(termios))) - if r != 0 { - return os.NewSyscallError("SYS_IOCTL", e) - } - return nil -} - -func tcgetattr(fd uintptr, termios *syscall_Termios) error { - r, _, e := syscall.Syscall(syscall.SYS_IOCTL, - fd, uintptr(syscall_TCGETS), uintptr(unsafe.Pointer(termios))) - if r != 0 { - return os.NewSyscallError("SYS_IOCTL", e) - } - return nil -} - -func parse_mouse_event(event *Event, buf string) (int, bool) { - if strings.HasPrefix(buf, "\033[M") && len(buf) >= 6 { - // X10 mouse encoding, the simplest one - // \033 [ M Cb Cx Cy - b := buf[3] - 32 - switch b & 3 { - case 0: - if b&64 != 0 { - event.Key = MouseWheelUp - } else { - event.Key = MouseLeft - } - case 1: - if b&64 != 0 { - event.Key = MouseWheelDown - } else { - event.Key = MouseMiddle - } - case 2: - event.Key = MouseRight - case 3: - event.Key = MouseRelease - default: - return 6, false - } - event.Type = EventMouse // KeyEvent by default - if b&32 != 0 { - event.Mod |= ModMotion - } - - // the coord is 1,1 for upper left - event.MouseX = int(buf[4]) - 1 - 32 - event.MouseY = int(buf[5]) - 1 - 32 - return 6, true - } else if strings.HasPrefix(buf, "\033[<") || strings.HasPrefix(buf, "\033[") { - // xterm 1006 extended mode or urxvt 1015 extended mode - // xterm: \033 [ < Cb ; Cx ; Cy (M or m) - // urxvt: \033 [ Cb ; Cx ; Cy M - - // find the first M or m, that's where we stop - mi := strings.IndexAny(buf, "Mm") - if mi == -1 { - return 0, false - } - - // whether it's a capital M or not - isM := buf[mi] == 'M' - - // whether it's urxvt or not - isU := false - - // buf[2] is safe here, because having M or m found means we have at - // least 3 bytes in a string - if buf[2] == '<' { - buf = buf[3:mi] - } else { - isU = true - buf = buf[2:mi] - } - - s1 := strings.Index(buf, ";") - s2 := strings.LastIndex(buf, ";") - // not found or only one ';' - if s1 == -1 || s2 == -1 || s1 == s2 { - return 0, false - } - - n1, err := strconv.ParseInt(buf[0:s1], 10, 64) - if err != nil { - return 0, false - } - n2, err := strconv.ParseInt(buf[s1+1:s2], 10, 64) - if err != nil { - return 0, false - } - n3, err := strconv.ParseInt(buf[s2+1:], 10, 64) - if err != nil { - return 0, false - } - - // on urxvt, first number is encoded exactly as in X10, but we need to - // make it zero-based, on xterm it is zero-based already - if isU { - n1 -= 32 - } - switch n1 & 3 { - case 0: - if n1&64 != 0 { - event.Key = MouseWheelUp - } else { - event.Key = MouseLeft - } - case 1: - if n1&64 != 0 { - event.Key = MouseWheelDown - } else { - event.Key = MouseMiddle - } - case 2: - event.Key = MouseRight - case 3: - event.Key = MouseRelease - default: - return mi + 1, false - } - if !isM { - // on xterm mouse release is signaled by lowercase m - event.Key = MouseRelease - } - - event.Type = EventMouse // KeyEvent by default - if n1&32 != 0 { - event.Mod |= ModMotion - } - - event.MouseX = int(n2) - 1 - event.MouseY = int(n3) - 1 - return mi + 1, true - } - - return 0, false -} - -func parse_escape_sequence(event *Event, buf []byte) (int, bool) { - bufstr := string(buf) - for i, key := range keys { - if strings.HasPrefix(bufstr, key) { - event.Ch = 0 - event.Key = Key(0xFFFF - i) - return len(key), true - } - } - - // if none of the keys match, let's try mouse seqences - return parse_mouse_event(event, bufstr) -} - -func extract_raw_event(data []byte, event *Event) bool { - if len(inbuf) == 0 { - return false - } - - n := len(data) - if n == 0 { - return false - } - - n = copy(data, inbuf) - copy(inbuf, inbuf[n:]) - inbuf = inbuf[:len(inbuf)-n] - - event.N = n - event.Type = EventRaw - return true -} - -func extract_event(inbuf []byte, event *Event) bool { - if len(inbuf) == 0 { - event.N = 0 - return false - } - - if inbuf[0] == '\033' { - // possible escape sequence - if n, ok := parse_escape_sequence(event, inbuf); n != 0 { - event.N = n - return ok - } - - // it's not escape sequence, then it's Alt or Esc, check input_mode - switch { - case input_mode&InputEsc != 0: - // if we're in escape mode, fill Esc event, pop buffer, return success - event.Ch = 0 - event.Key = KeyEsc - event.Mod = 0 - event.N = 1 - return true - case input_mode&InputAlt != 0: - // if we're in alt mode, set Alt modifier to event and redo parsing - event.Mod = ModAlt - ok := extract_event(inbuf[1:], event) - if ok { - event.N++ - } else { - event.N = 0 - } - return ok - default: - panic("unreachable") - } - } - - // if we're here, this is not an escape sequence and not an alt sequence - // so, it's a FUNCTIONAL KEY or a UNICODE character - - // first of all check if it's a functional key - if Key(inbuf[0]) <= KeySpace || Key(inbuf[0]) == KeyBackspace2 { - // fill event, pop buffer, return success - event.Ch = 0 - event.Key = Key(inbuf[0]) - event.N = 1 - return true - } - - // the only possible option is utf8 rune - if r, n := utf8.DecodeRune(inbuf); r != utf8.RuneError { - event.Ch = r - event.Key = 0 - event.N = n - return true - } - - return false -} - -func fcntl(fd int, cmd int, arg int) (val int, err error) { - r, _, e := syscall.Syscall(syscall.SYS_FCNTL, uintptr(fd), uintptr(cmd), - uintptr(arg)) - val = int(r) - if e != 0 { - err = e - } - return -} diff --git a/vendor/github.com/nsf/termbox-go/termbox_common.go b/vendor/github.com/nsf/termbox-go/termbox_common.go deleted file mode 100644 index c3355cc25e38..000000000000 --- a/vendor/github.com/nsf/termbox-go/termbox_common.go +++ /dev/null @@ -1,59 +0,0 @@ -package termbox - -// private API, common OS agnostic part - -type cellbuf struct { - width int - height int - cells []Cell -} - -func (this *cellbuf) init(width, height int) { - this.width = width - this.height = height - this.cells = make([]Cell, width*height) -} - -func (this *cellbuf) resize(width, height int) { - if this.width == width && this.height == height { - return - } - - oldw := this.width - oldh := this.height - oldcells := this.cells - - this.init(width, height) - this.clear() - - minw, minh := oldw, oldh - - if width < minw { - minw = width - } - if height < minh { - minh = height - } - - for i := 0; i < minh; i++ { - srco, dsto := i*oldw, i*width - src := oldcells[srco : srco+minw] - dst := this.cells[dsto : dsto+minw] - copy(dst, src) - } -} - -func (this *cellbuf) clear() { - for i := range this.cells { - c := &this.cells[i] - c.Ch = ' ' - c.Fg = foreground - c.Bg = background - } -} - -const cursor_hidden = -1 - -func is_cursor_hidden(x, y int) bool { - return x == cursor_hidden || y == cursor_hidden -} diff --git a/vendor/github.com/nsf/termbox-go/termbox_windows.go b/vendor/github.com/nsf/termbox-go/termbox_windows.go deleted file mode 100644 index f7dad7b8a5fb..000000000000 --- a/vendor/github.com/nsf/termbox-go/termbox_windows.go +++ /dev/null @@ -1,856 +0,0 @@ -package termbox - -import "syscall" -import "unsafe" -import "unicode/utf16" -import "github.com/mattn/go-runewidth" - -type ( - wchar uint16 - short int16 - dword uint32 - word uint16 - char_info struct { - char wchar - attr word - } - coord struct { - x short - y short - } - small_rect struct { - left short - top short - right short - bottom short - } - console_screen_buffer_info struct { - size coord - cursor_position coord - attributes word - window small_rect - maximum_window_size coord - } - console_cursor_info struct { - size dword - visible int32 - } - input_record struct { - event_type word - _ [2]byte - event [16]byte - } - key_event_record struct { - key_down int32 - repeat_count word - virtual_key_code word - virtual_scan_code word - unicode_char wchar - control_key_state dword - } - window_buffer_size_record struct { - size coord - } - mouse_event_record struct { - mouse_pos coord - button_state dword - control_key_state dword - event_flags dword - } -) - -const ( - mouse_lmb = 0x1 - mouse_rmb = 0x2 - mouse_mmb = 0x4 | 0x8 | 0x10 -) - -func (this coord) uintptr() uintptr { - return uintptr(*(*int32)(unsafe.Pointer(&this))) -} - -var kernel32 = syscall.NewLazyDLL("kernel32.dll") -var is_cjk = runewidth.IsEastAsian() - -var ( - proc_set_console_active_screen_buffer = kernel32.NewProc("SetConsoleActiveScreenBuffer") - proc_set_console_screen_buffer_size = kernel32.NewProc("SetConsoleScreenBufferSize") - proc_create_console_screen_buffer = kernel32.NewProc("CreateConsoleScreenBuffer") - proc_get_console_screen_buffer_info = kernel32.NewProc("GetConsoleScreenBufferInfo") - proc_write_console_output = kernel32.NewProc("WriteConsoleOutputW") - proc_write_console_output_character = kernel32.NewProc("WriteConsoleOutputCharacterW") - proc_write_console_output_attribute = kernel32.NewProc("WriteConsoleOutputAttribute") - proc_set_console_cursor_info = kernel32.NewProc("SetConsoleCursorInfo") - proc_set_console_cursor_position = kernel32.NewProc("SetConsoleCursorPosition") - proc_get_console_cursor_info = kernel32.NewProc("GetConsoleCursorInfo") - proc_read_console_input = kernel32.NewProc("ReadConsoleInputW") - proc_get_console_mode = kernel32.NewProc("GetConsoleMode") - proc_set_console_mode = kernel32.NewProc("SetConsoleMode") - proc_fill_console_output_character = kernel32.NewProc("FillConsoleOutputCharacterW") - proc_fill_console_output_attribute = kernel32.NewProc("FillConsoleOutputAttribute") - proc_create_event = kernel32.NewProc("CreateEventW") - proc_wait_for_multiple_objects = kernel32.NewProc("WaitForMultipleObjects") - proc_set_event = kernel32.NewProc("SetEvent") -) - -func set_console_active_screen_buffer(h syscall.Handle) (err error) { - r0, _, e1 := syscall.Syscall(proc_set_console_active_screen_buffer.Addr(), - 1, uintptr(h), 0, 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func set_console_screen_buffer_size(h syscall.Handle, size coord) (err error) { - r0, _, e1 := syscall.Syscall(proc_set_console_screen_buffer_size.Addr(), - 2, uintptr(h), size.uintptr(), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func create_console_screen_buffer() (h syscall.Handle, err error) { - r0, _, e1 := syscall.Syscall6(proc_create_console_screen_buffer.Addr(), - 5, uintptr(generic_read|generic_write), 0, 0, console_textmode_buffer, 0, 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return syscall.Handle(r0), err -} - -func get_console_screen_buffer_info(h syscall.Handle, info *console_screen_buffer_info) (err error) { - r0, _, e1 := syscall.Syscall(proc_get_console_screen_buffer_info.Addr(), - 2, uintptr(h), uintptr(unsafe.Pointer(info)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func write_console_output(h syscall.Handle, chars []char_info, dst small_rect) (err error) { - tmp_coord = coord{dst.right - dst.left + 1, dst.bottom - dst.top + 1} - tmp_rect = dst - r0, _, e1 := syscall.Syscall6(proc_write_console_output.Addr(), - 5, uintptr(h), uintptr(unsafe.Pointer(&chars[0])), tmp_coord.uintptr(), - tmp_coord0.uintptr(), uintptr(unsafe.Pointer(&tmp_rect)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func write_console_output_character(h syscall.Handle, chars []wchar, pos coord) (err error) { - r0, _, e1 := syscall.Syscall6(proc_write_console_output_character.Addr(), - 5, uintptr(h), uintptr(unsafe.Pointer(&chars[0])), uintptr(len(chars)), - pos.uintptr(), uintptr(unsafe.Pointer(&tmp_arg)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func write_console_output_attribute(h syscall.Handle, attrs []word, pos coord) (err error) { - r0, _, e1 := syscall.Syscall6(proc_write_console_output_attribute.Addr(), - 5, uintptr(h), uintptr(unsafe.Pointer(&attrs[0])), uintptr(len(attrs)), - pos.uintptr(), uintptr(unsafe.Pointer(&tmp_arg)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func set_console_cursor_info(h syscall.Handle, info *console_cursor_info) (err error) { - r0, _, e1 := syscall.Syscall(proc_set_console_cursor_info.Addr(), - 2, uintptr(h), uintptr(unsafe.Pointer(info)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func get_console_cursor_info(h syscall.Handle, info *console_cursor_info) (err error) { - r0, _, e1 := syscall.Syscall(proc_get_console_cursor_info.Addr(), - 2, uintptr(h), uintptr(unsafe.Pointer(info)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func set_console_cursor_position(h syscall.Handle, pos coord) (err error) { - r0, _, e1 := syscall.Syscall(proc_set_console_cursor_position.Addr(), - 2, uintptr(h), pos.uintptr(), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func read_console_input(h syscall.Handle, record *input_record) (err error) { - r0, _, e1 := syscall.Syscall6(proc_read_console_input.Addr(), - 4, uintptr(h), uintptr(unsafe.Pointer(record)), 1, uintptr(unsafe.Pointer(&tmp_arg)), 0, 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func get_console_mode(h syscall.Handle, mode *dword) (err error) { - r0, _, e1 := syscall.Syscall(proc_get_console_mode.Addr(), - 2, uintptr(h), uintptr(unsafe.Pointer(mode)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func set_console_mode(h syscall.Handle, mode dword) (err error) { - r0, _, e1 := syscall.Syscall(proc_set_console_mode.Addr(), - 2, uintptr(h), uintptr(mode), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func fill_console_output_character(h syscall.Handle, char wchar, n int) (err error) { - r0, _, e1 := syscall.Syscall6(proc_fill_console_output_character.Addr(), - 5, uintptr(h), uintptr(char), uintptr(n), tmp_coord.uintptr(), - uintptr(unsafe.Pointer(&tmp_arg)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func fill_console_output_attribute(h syscall.Handle, attr word, n int) (err error) { - r0, _, e1 := syscall.Syscall6(proc_fill_console_output_attribute.Addr(), - 5, uintptr(h), uintptr(attr), uintptr(n), tmp_coord.uintptr(), - uintptr(unsafe.Pointer(&tmp_arg)), 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func create_event() (out syscall.Handle, err error) { - r0, _, e1 := syscall.Syscall6(proc_create_event.Addr(), - 4, 0, 0, 0, 0, 0, 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return syscall.Handle(r0), err -} - -func wait_for_multiple_objects(objects []syscall.Handle) (err error) { - r0, _, e1 := syscall.Syscall6(proc_wait_for_multiple_objects.Addr(), - 4, uintptr(len(objects)), uintptr(unsafe.Pointer(&objects[0])), - 0, 0xFFFFFFFF, 0, 0) - if uint32(r0) == 0xFFFFFFFF { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -func set_event(ev syscall.Handle) (err error) { - r0, _, e1 := syscall.Syscall(proc_set_event.Addr(), - 1, uintptr(ev), 0, 0) - if int(r0) == 0 { - if e1 != 0 { - err = error(e1) - } else { - err = syscall.EINVAL - } - } - return -} - -type diff_msg struct { - pos short - lines short - chars []char_info -} - -type input_event struct { - event Event - err error -} - -var ( - orig_cursor_info console_cursor_info - orig_size coord - orig_mode dword - orig_screen syscall.Handle - back_buffer cellbuf - front_buffer cellbuf - term_size coord - input_mode = InputEsc - cursor_x = cursor_hidden - cursor_y = cursor_hidden - foreground = ColorDefault - background = ColorDefault - in syscall.Handle - out syscall.Handle - interrupt syscall.Handle - charbuf []char_info - diffbuf []diff_msg - beg_x = -1 - beg_y = -1 - beg_i = -1 - input_comm = make(chan Event) - interrupt_comm = make(chan struct{}) - cancel_comm = make(chan bool, 1) - cancel_done_comm = make(chan bool) - alt_mode_esc = false - - // these ones just to prevent heap allocs at all costs - tmp_info console_screen_buffer_info - tmp_arg dword - tmp_coord0 = coord{0, 0} - tmp_coord = coord{0, 0} - tmp_rect = small_rect{0, 0, 0, 0} -) - -func get_cursor_position(out syscall.Handle) coord { - err := get_console_screen_buffer_info(out, &tmp_info) - if err != nil { - panic(err) - } - return tmp_info.cursor_position -} - -func get_term_size(out syscall.Handle) coord { - err := get_console_screen_buffer_info(out, &tmp_info) - if err != nil { - panic(err) - } - return tmp_info.size -} - -func get_win_size(out syscall.Handle) coord { - err := get_console_screen_buffer_info(out, &tmp_info) - if err != nil { - panic(err) - } - return coord{ - x: tmp_info.window.right - tmp_info.window.left + 1, - y: tmp_info.window.bottom - tmp_info.window.top + 1, - } -} - -func update_size_maybe() { - size := get_term_size(out) - if size.x != term_size.x || size.y != term_size.y { - term_size = size - back_buffer.resize(int(size.x), int(size.y)) - front_buffer.resize(int(size.x), int(size.y)) - front_buffer.clear() - clear() - - area := int(size.x) * int(size.y) - if cap(charbuf) < area { - charbuf = make([]char_info, 0, area) - } - } -} - -var color_table_bg = []word{ - 0, // default (black) - 0, // black - background_red, - background_green, - background_red | background_green, // yellow - background_blue, - background_red | background_blue, // magenta - background_green | background_blue, // cyan - background_red | background_blue | background_green, // white -} - -var color_table_fg = []word{ - foreground_red | foreground_blue | foreground_green, // default (white) - 0, - foreground_red, - foreground_green, - foreground_red | foreground_green, // yellow - foreground_blue, - foreground_red | foreground_blue, // magenta - foreground_green | foreground_blue, // cyan - foreground_red | foreground_blue | foreground_green, // white -} - -const ( - replacement_char = '\uFFFD' - max_rune = '\U0010FFFF' - surr1 = 0xd800 - surr2 = 0xdc00 - surr3 = 0xe000 - surr_self = 0x10000 -) - -func append_diff_line(y int) int { - n := 0 - for x := 0; x < front_buffer.width; { - cell_offset := y*front_buffer.width + x - back := &back_buffer.cells[cell_offset] - front := &front_buffer.cells[cell_offset] - attr, char := cell_to_char_info(*back) - charbuf = append(charbuf, char_info{attr: attr, char: char[0]}) - *front = *back - n++ - w := runewidth.RuneWidth(back.Ch) - if w == 0 || w == 2 && runewidth.IsAmbiguousWidth(back.Ch) { - w = 1 - } - x += w - // If not CJK, fill trailing space with whitespace - if !is_cjk && w == 2 { - charbuf = append(charbuf, char_info{attr: attr, char: ' '}) - } - } - return n -} - -// compares 'back_buffer' with 'front_buffer' and prepares all changes in the form of -// 'diff_msg's in the 'diff_buf' -func prepare_diff_messages() { - // clear buffers - diffbuf = diffbuf[:0] - charbuf = charbuf[:0] - - var diff diff_msg - gbeg := 0 - for y := 0; y < front_buffer.height; y++ { - same := true - line_offset := y * front_buffer.width - for x := 0; x < front_buffer.width; x++ { - cell_offset := line_offset + x - back := &back_buffer.cells[cell_offset] - front := &front_buffer.cells[cell_offset] - if *back != *front { - same = false - break - } - } - if same && diff.lines > 0 { - diffbuf = append(diffbuf, diff) - diff = diff_msg{} - } - if !same { - beg := len(charbuf) - end := beg + append_diff_line(y) - if diff.lines == 0 { - diff.pos = short(y) - gbeg = beg - } - diff.lines++ - diff.chars = charbuf[gbeg:end] - } - } - if diff.lines > 0 { - diffbuf = append(diffbuf, diff) - diff = diff_msg{} - } -} - -func get_ct(table []word, idx int) word { - idx = idx & 0x0F - if idx >= len(table) { - idx = len(table) - 1 - } - return table[idx] -} - -func cell_to_char_info(c Cell) (attr word, wc [2]wchar) { - attr = get_ct(color_table_fg, int(c.Fg)) | get_ct(color_table_bg, int(c.Bg)) - if c.Fg&AttrReverse|c.Bg&AttrReverse != 0 { - attr = (attr&0xF0)>>4 | (attr&0x0F)<<4 - } - if c.Fg&AttrBold != 0 { - attr |= foreground_intensity - } - if c.Bg&AttrBold != 0 { - attr |= background_intensity - } - - r0, r1 := utf16.EncodeRune(c.Ch) - if r0 == 0xFFFD { - wc[0] = wchar(c.Ch) - wc[1] = ' ' - } else { - wc[0] = wchar(r0) - wc[1] = wchar(r1) - } - return -} - -func move_cursor(x, y int) { - err := set_console_cursor_position(out, coord{short(x), short(y)}) - if err != nil { - panic(err) - } -} - -func show_cursor(visible bool) { - var v int32 - if visible { - v = 1 - } - - var info console_cursor_info - info.size = 100 - info.visible = v - err := set_console_cursor_info(out, &info) - if err != nil { - panic(err) - } -} - -func clear() { - var err error - attr, char := cell_to_char_info(Cell{ - ' ', - foreground, - background, - }) - - area := int(term_size.x) * int(term_size.y) - err = fill_console_output_attribute(out, attr, area) - if err != nil { - panic(err) - } - err = fill_console_output_character(out, char[0], area) - if err != nil { - panic(err) - } - if !is_cursor_hidden(cursor_x, cursor_y) { - move_cursor(cursor_x, cursor_y) - } -} - -func key_event_record_to_event(r *key_event_record) (Event, bool) { - if r.key_down == 0 { - return Event{}, false - } - - e := Event{Type: EventKey} - if input_mode&InputAlt != 0 { - if alt_mode_esc { - e.Mod = ModAlt - alt_mode_esc = false - } - if r.control_key_state&(left_alt_pressed|right_alt_pressed) != 0 { - e.Mod = ModAlt - } - } - - ctrlpressed := r.control_key_state&(left_ctrl_pressed|right_ctrl_pressed) != 0 - - if r.virtual_key_code >= vk_f1 && r.virtual_key_code <= vk_f12 { - switch r.virtual_key_code { - case vk_f1: - e.Key = KeyF1 - case vk_f2: - e.Key = KeyF2 - case vk_f3: - e.Key = KeyF3 - case vk_f4: - e.Key = KeyF4 - case vk_f5: - e.Key = KeyF5 - case vk_f6: - e.Key = KeyF6 - case vk_f7: - e.Key = KeyF7 - case vk_f8: - e.Key = KeyF8 - case vk_f9: - e.Key = KeyF9 - case vk_f10: - e.Key = KeyF10 - case vk_f11: - e.Key = KeyF11 - case vk_f12: - e.Key = KeyF12 - default: - panic("unreachable") - } - - return e, true - } - - if r.virtual_key_code <= vk_delete { - switch r.virtual_key_code { - case vk_insert: - e.Key = KeyInsert - case vk_delete: - e.Key = KeyDelete - case vk_home: - e.Key = KeyHome - case vk_end: - e.Key = KeyEnd - case vk_pgup: - e.Key = KeyPgup - case vk_pgdn: - e.Key = KeyPgdn - case vk_arrow_up: - e.Key = KeyArrowUp - case vk_arrow_down: - e.Key = KeyArrowDown - case vk_arrow_left: - e.Key = KeyArrowLeft - case vk_arrow_right: - e.Key = KeyArrowRight - case vk_backspace: - if ctrlpressed { - e.Key = KeyBackspace2 - } else { - e.Key = KeyBackspace - } - case vk_tab: - e.Key = KeyTab - case vk_enter: - e.Key = KeyEnter - case vk_esc: - switch { - case input_mode&InputEsc != 0: - e.Key = KeyEsc - case input_mode&InputAlt != 0: - alt_mode_esc = true - return Event{}, false - } - case vk_space: - if ctrlpressed { - // manual return here, because KeyCtrlSpace is zero - e.Key = KeyCtrlSpace - return e, true - } else { - e.Key = KeySpace - } - } - - if e.Key != 0 { - return e, true - } - } - - if ctrlpressed { - if Key(r.unicode_char) >= KeyCtrlA && Key(r.unicode_char) <= KeyCtrlRsqBracket { - e.Key = Key(r.unicode_char) - if input_mode&InputAlt != 0 && e.Key == KeyEsc { - alt_mode_esc = true - return Event{}, false - } - return e, true - } - switch r.virtual_key_code { - case 192, 50: - // manual return here, because KeyCtrl2 is zero - e.Key = KeyCtrl2 - return e, true - case 51: - if input_mode&InputAlt != 0 { - alt_mode_esc = true - return Event{}, false - } - e.Key = KeyCtrl3 - case 52: - e.Key = KeyCtrl4 - case 53: - e.Key = KeyCtrl5 - case 54: - e.Key = KeyCtrl6 - case 189, 191, 55: - e.Key = KeyCtrl7 - case 8, 56: - e.Key = KeyCtrl8 - } - - if e.Key != 0 { - return e, true - } - } - - if r.unicode_char != 0 { - e.Ch = rune(r.unicode_char) - return e, true - } - - return Event{}, false -} - -func input_event_producer() { - var r input_record - var err error - var last_button Key - var last_button_pressed Key - var last_state = dword(0) - var last_x, last_y = -1, -1 - handles := []syscall.Handle{in, interrupt} - for { - err = wait_for_multiple_objects(handles) - if err != nil { - input_comm <- Event{Type: EventError, Err: err} - } - - select { - case <-cancel_comm: - cancel_done_comm <- true - return - default: - } - - err = read_console_input(in, &r) - if err != nil { - input_comm <- Event{Type: EventError, Err: err} - } - - switch r.event_type { - case key_event: - kr := (*key_event_record)(unsafe.Pointer(&r.event)) - ev, ok := key_event_record_to_event(kr) - if ok { - for i := 0; i < int(kr.repeat_count); i++ { - input_comm <- ev - } - } - case window_buffer_size_event: - sr := *(*window_buffer_size_record)(unsafe.Pointer(&r.event)) - input_comm <- Event{ - Type: EventResize, - Width: int(sr.size.x), - Height: int(sr.size.y), - } - case mouse_event: - mr := *(*mouse_event_record)(unsafe.Pointer(&r.event)) - ev := Event{Type: EventMouse} - switch mr.event_flags { - case 0, 2: - // single or double click - cur_state := mr.button_state - switch { - case last_state&mouse_lmb == 0 && cur_state&mouse_lmb != 0: - last_button = MouseLeft - last_button_pressed = last_button - case last_state&mouse_rmb == 0 && cur_state&mouse_rmb != 0: - last_button = MouseRight - last_button_pressed = last_button - case last_state&mouse_mmb == 0 && cur_state&mouse_mmb != 0: - last_button = MouseMiddle - last_button_pressed = last_button - case last_state&mouse_lmb != 0 && cur_state&mouse_lmb == 0: - last_button = MouseRelease - case last_state&mouse_rmb != 0 && cur_state&mouse_rmb == 0: - last_button = MouseRelease - case last_state&mouse_mmb != 0 && cur_state&mouse_mmb == 0: - last_button = MouseRelease - default: - last_state = cur_state - continue - } - last_state = cur_state - ev.Key = last_button - last_x, last_y = int(mr.mouse_pos.x), int(mr.mouse_pos.y) - ev.MouseX = last_x - ev.MouseY = last_y - case 1: - // mouse motion - x, y := int(mr.mouse_pos.x), int(mr.mouse_pos.y) - if last_state != 0 && (last_x != x || last_y != y) { - ev.Key = last_button_pressed - ev.Mod = ModMotion - ev.MouseX = x - ev.MouseY = y - last_x, last_y = x, y - } else { - ev.Type = EventNone - } - case 4: - // mouse wheel - n := int16(mr.button_state >> 16) - if n > 0 { - ev.Key = MouseWheelUp - } else { - ev.Key = MouseWheelDown - } - last_x, last_y = int(mr.mouse_pos.x), int(mr.mouse_pos.y) - ev.MouseX = last_x - ev.MouseY = last_y - default: - ev.Type = EventNone - } - if ev.Type != EventNone { - input_comm <- ev - } - } - } -} diff --git a/vendor/github.com/nsf/termbox-go/terminfo.go b/vendor/github.com/nsf/termbox-go/terminfo.go deleted file mode 100644 index 35dbd70b8941..000000000000 --- a/vendor/github.com/nsf/termbox-go/terminfo.go +++ /dev/null @@ -1,221 +0,0 @@ -// +build !windows -// This file contains a simple and incomplete implementation of the terminfo -// database. Information was taken from the ncurses manpages term(5) and -// terminfo(5). Currently, only the string capabilities for special keys and for -// functions without parameters are actually used. Colors are still done with -// ANSI escape sequences. Other special features that are not (yet?) supported -// are reading from ~/.terminfo, the TERMINFO_DIRS variable, Berkeley database -// format and extended capabilities. - -package termbox - -import ( - "bytes" - "encoding/binary" - "encoding/hex" - "errors" - "fmt" - "io/ioutil" - "os" - "strings" -) - -const ( - ti_magic = 0432 - ti_header_length = 12 - ti_mouse_enter = "\x1b[?1000h\x1b[?1002h\x1b[?1015h\x1b[?1006h" - ti_mouse_leave = "\x1b[?1006l\x1b[?1015l\x1b[?1002l\x1b[?1000l" -) - -func load_terminfo() ([]byte, error) { - var data []byte - var err error - - term := os.Getenv("TERM") - if term == "" { - return nil, fmt.Errorf("termbox: TERM not set") - } - - // The following behaviour follows the one described in terminfo(5) as - // distributed by ncurses. - - terminfo := os.Getenv("TERMINFO") - if terminfo != "" { - // if TERMINFO is set, no other directory should be searched - return ti_try_path(terminfo) - } - - // next, consider ~/.terminfo - home := os.Getenv("HOME") - if home != "" { - data, err = ti_try_path(home + "/.terminfo") - if err == nil { - return data, nil - } - } - - // next, TERMINFO_DIRS - dirs := os.Getenv("TERMINFO_DIRS") - if dirs != "" { - for _, dir := range strings.Split(dirs, ":") { - if dir == "" { - // "" -> "/usr/share/terminfo" - dir = "/usr/share/terminfo" - } - data, err = ti_try_path(dir) - if err == nil { - return data, nil - } - } - } - - // fall back to /usr/share/terminfo - return ti_try_path("/usr/share/terminfo") -} - -func ti_try_path(path string) (data []byte, err error) { - // load_terminfo already made sure it is set - term := os.Getenv("TERM") - - // first try, the typical *nix path - terminfo := path + "/" + term[0:1] + "/" + term - data, err = ioutil.ReadFile(terminfo) - if err == nil { - return - } - - // fallback to darwin specific dirs structure - terminfo = path + "/" + hex.EncodeToString([]byte(term[:1])) + "/" + term - data, err = ioutil.ReadFile(terminfo) - return -} - -func setup_term_builtin() error { - name := os.Getenv("TERM") - if name == "" { - return errors.New("termbox: TERM environment variable not set") - } - - for _, t := range terms { - if t.name == name { - keys = t.keys - funcs = t.funcs - return nil - } - } - - compat_table := []struct { - partial string - keys []string - funcs []string - }{ - {"xterm", xterm_keys, xterm_funcs}, - {"rxvt", rxvt_unicode_keys, rxvt_unicode_funcs}, - {"linux", linux_keys, linux_funcs}, - {"Eterm", eterm_keys, eterm_funcs}, - {"screen", screen_keys, screen_funcs}, - // let's assume that 'cygwin' is xterm compatible - {"cygwin", xterm_keys, xterm_funcs}, - {"st", xterm_keys, xterm_funcs}, - } - - // try compatibility variants - for _, it := range compat_table { - if strings.Contains(name, it.partial) { - keys = it.keys - funcs = it.funcs - return nil - } - } - - return errors.New("termbox: unsupported terminal") -} - -func setup_term() (err error) { - var data []byte - var header [6]int16 - var str_offset, table_offset int16 - - data, err = load_terminfo() - if err != nil { - return setup_term_builtin() - } - - rd := bytes.NewReader(data) - // 0: magic number, 1: size of names section, 2: size of boolean section, 3: - // size of numbers section (in integers), 4: size of the strings section (in - // integers), 5: size of the string table - - err = binary.Read(rd, binary.LittleEndian, header[:]) - if err != nil { - return - } - - if (header[1]+header[2])%2 != 0 { - // old quirk to align everything on word boundaries - header[2] += 1 - } - str_offset = ti_header_length + header[1] + header[2] + 2*header[3] - table_offset = str_offset + 2*header[4] - - keys = make([]string, 0xFFFF-key_min) - for i, _ := range keys { - keys[i], err = ti_read_string(rd, str_offset+2*ti_keys[i], table_offset) - if err != nil { - return - } - } - funcs = make([]string, t_max_funcs) - // the last two entries are reserved for mouse. because the table offset is - // not there, the two entries have to fill in manually - for i, _ := range funcs[:len(funcs)-2] { - funcs[i], err = ti_read_string(rd, str_offset+2*ti_funcs[i], table_offset) - if err != nil { - return - } - } - funcs[t_max_funcs-2] = ti_mouse_enter - funcs[t_max_funcs-1] = ti_mouse_leave - return nil -} - -func ti_read_string(rd *bytes.Reader, str_off, table int16) (string, error) { - var off int16 - - _, err := rd.Seek(int64(str_off), 0) - if err != nil { - return "", err - } - err = binary.Read(rd, binary.LittleEndian, &off) - if err != nil { - return "", err - } - _, err = rd.Seek(int64(table+off), 0) - if err != nil { - return "", err - } - var bs []byte - for { - b, err := rd.ReadByte() - if err != nil { - return "", err - } - if b == byte(0x00) { - break - } - bs = append(bs, b) - } - return string(bs), nil -} - -// "Maps" the function constants from termbox.go to the number of the respective -// string capability in the terminfo file. Taken from (ncurses) term.h. -var ti_funcs = []int16{ - 28, 40, 16, 13, 5, 39, 36, 27, 26, 34, 89, 88, -} - -// Same as above for the special keys. -var ti_keys = []int16{ - 66, 68 /* apparently not a typo; 67 is F10 for whatever reason */, 69, 70, - 71, 72, 73, 74, 75, 67, 216, 217, 77, 59, 76, 164, 82, 81, 87, 61, 79, 83, -} diff --git a/vendor/github.com/nsf/termbox-go/terminfo_builtin.go b/vendor/github.com/nsf/termbox-go/terminfo_builtin.go deleted file mode 100644 index a94866067bae..000000000000 --- a/vendor/github.com/nsf/termbox-go/terminfo_builtin.go +++ /dev/null @@ -1,64 +0,0 @@ -// +build !windows - -package termbox - -// Eterm -var eterm_keys = []string{ - "\x1b[11~", "\x1b[12~", "\x1b[13~", "\x1b[14~", "\x1b[15~", "\x1b[17~", "\x1b[18~", "\x1b[19~", "\x1b[20~", "\x1b[21~", "\x1b[23~", "\x1b[24~", "\x1b[2~", "\x1b[3~", "\x1b[7~", "\x1b[8~", "\x1b[5~", "\x1b[6~", "\x1b[A", "\x1b[B", "\x1b[D", "\x1b[C", -} -var eterm_funcs = []string{ - "\x1b7\x1b[?47h", "\x1b[2J\x1b[?47l\x1b8", "\x1b[?25h", "\x1b[?25l", "\x1b[H\x1b[2J", "\x1b[m\x0f", "\x1b[4m", "\x1b[1m", "\x1b[5m", "\x1b[7m", "", "", "", "", -} - -// screen -var screen_keys = []string{ - "\x1bOP", "\x1bOQ", "\x1bOR", "\x1bOS", "\x1b[15~", "\x1b[17~", "\x1b[18~", "\x1b[19~", "\x1b[20~", "\x1b[21~", "\x1b[23~", "\x1b[24~", "\x1b[2~", "\x1b[3~", "\x1b[1~", "\x1b[4~", "\x1b[5~", "\x1b[6~", "\x1bOA", "\x1bOB", "\x1bOD", "\x1bOC", -} -var screen_funcs = []string{ - "\x1b[?1049h", "\x1b[?1049l", "\x1b[34h\x1b[?25h", "\x1b[?25l", "\x1b[H\x1b[J", "\x1b[m\x0f", "\x1b[4m", "\x1b[1m", "\x1b[5m", "\x1b[7m", "\x1b[?1h\x1b=", "\x1b[?1l\x1b>", ti_mouse_enter, ti_mouse_leave, -} - -// xterm -var xterm_keys = []string{ - "\x1bOP", "\x1bOQ", "\x1bOR", "\x1bOS", "\x1b[15~", "\x1b[17~", "\x1b[18~", "\x1b[19~", "\x1b[20~", "\x1b[21~", "\x1b[23~", "\x1b[24~", "\x1b[2~", "\x1b[3~", "\x1bOH", "\x1bOF", "\x1b[5~", "\x1b[6~", "\x1bOA", "\x1bOB", "\x1bOD", "\x1bOC", -} -var xterm_funcs = []string{ - "\x1b[?1049h", "\x1b[?1049l", "\x1b[?12l\x1b[?25h", "\x1b[?25l", "\x1b[H\x1b[2J", "\x1b(B\x1b[m", "\x1b[4m", "\x1b[1m", "\x1b[5m", "\x1b[7m", "\x1b[?1h\x1b=", "\x1b[?1l\x1b>", ti_mouse_enter, ti_mouse_leave, -} - -// rxvt-unicode -var rxvt_unicode_keys = []string{ - "\x1b[11~", "\x1b[12~", "\x1b[13~", "\x1b[14~", "\x1b[15~", "\x1b[17~", "\x1b[18~", "\x1b[19~", "\x1b[20~", "\x1b[21~", "\x1b[23~", "\x1b[24~", "\x1b[2~", "\x1b[3~", "\x1b[7~", "\x1b[8~", "\x1b[5~", "\x1b[6~", "\x1b[A", "\x1b[B", "\x1b[D", "\x1b[C", -} -var rxvt_unicode_funcs = []string{ - "\x1b[?1049h", "\x1b[r\x1b[?1049l", "\x1b[?25h", "\x1b[?25l", "\x1b[H\x1b[2J", "\x1b[m\x1b(B", "\x1b[4m", "\x1b[1m", "\x1b[5m", "\x1b[7m", "\x1b=", "\x1b>", ti_mouse_enter, ti_mouse_leave, -} - -// linux -var linux_keys = []string{ - "\x1b[[A", "\x1b[[B", "\x1b[[C", "\x1b[[D", "\x1b[[E", "\x1b[17~", "\x1b[18~", "\x1b[19~", "\x1b[20~", "\x1b[21~", "\x1b[23~", "\x1b[24~", "\x1b[2~", "\x1b[3~", "\x1b[1~", "\x1b[4~", "\x1b[5~", "\x1b[6~", "\x1b[A", "\x1b[B", "\x1b[D", "\x1b[C", -} -var linux_funcs = []string{ - "", "", "\x1b[?25h\x1b[?0c", "\x1b[?25l\x1b[?1c", "\x1b[H\x1b[J", "\x1b[0;10m", "\x1b[4m", "\x1b[1m", "\x1b[5m", "\x1b[7m", "", "", "", "", -} - -// rxvt-256color -var rxvt_256color_keys = []string{ - "\x1b[11~", "\x1b[12~", "\x1b[13~", "\x1b[14~", "\x1b[15~", "\x1b[17~", "\x1b[18~", "\x1b[19~", "\x1b[20~", "\x1b[21~", "\x1b[23~", "\x1b[24~", "\x1b[2~", "\x1b[3~", "\x1b[7~", "\x1b[8~", "\x1b[5~", "\x1b[6~", "\x1b[A", "\x1b[B", "\x1b[D", "\x1b[C", -} -var rxvt_256color_funcs = []string{ - "\x1b7\x1b[?47h", "\x1b[2J\x1b[?47l\x1b8", "\x1b[?25h", "\x1b[?25l", "\x1b[H\x1b[2J", "\x1b[m\x0f", "\x1b[4m", "\x1b[1m", "\x1b[5m", "\x1b[7m", "\x1b=", "\x1b>", ti_mouse_enter, ti_mouse_leave, -} - -var terms = []struct { - name string - keys []string - funcs []string -}{ - {"Eterm", eterm_keys, eterm_funcs}, - {"screen", screen_keys, screen_funcs}, - {"xterm", xterm_keys, xterm_funcs}, - {"rxvt-unicode", rxvt_unicode_keys, rxvt_unicode_funcs}, - {"linux", linux_keys, linux_funcs}, - {"rxvt-256color", rxvt_256color_keys, rxvt_256color_funcs}, -} diff --git a/vendor/github.com/olekukonko/tablewriter/LICENCE.md b/vendor/github.com/olekukonko/tablewriter/LICENCE.md deleted file mode 100644 index 1fd8484253fb..000000000000 --- a/vendor/github.com/olekukonko/tablewriter/LICENCE.md +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (C) 2014 by Oleku Konko - -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. \ No newline at end of file diff --git a/vendor/github.com/olekukonko/tablewriter/README.md b/vendor/github.com/olekukonko/tablewriter/README.md deleted file mode 100644 index 805330adcd37..000000000000 --- a/vendor/github.com/olekukonko/tablewriter/README.md +++ /dev/null @@ -1,204 +0,0 @@ -ASCII Table Writer -========= - -[![Build Status](https://travis-ci.org/olekukonko/tablewriter.png?branch=master)](https://travis-ci.org/olekukonko/tablewriter) [![Total views](https://sourcegraph.com/api/repos/github.com/olekukonko/tablewriter/counters/views.png)](https://sourcegraph.com/github.com/olekukonko/tablewriter) - -Generate ASCII table on the fly ... Installation is simple as - - go get github.com/olekukonko/tablewriter - - -#### Features -- Automatic Padding -- Support Multiple Lines -- Supports Alignment -- Support Custom Separators -- Automatic Alignment of numbers & percentage -- Write directly to http , file etc via `io.Writer` -- Read directly from CSV file -- Optional row line via `SetRowLine` -- Normalise table header -- Make CSV Headers optional -- Enable or disable table border -- Set custom footer support -- Optional identical cells merging - - -#### Example 1 - Basic -```go -data := [][]string{ - []string{"A", "The Good", "500"}, - []string{"B", "The Very very Bad Man", "288"}, - []string{"C", "The Ugly", "120"}, - []string{"D", "The Gopher", "800"}, -} - -table := tablewriter.NewWriter(os.Stdout) -table.SetHeader([]string{"Name", "Sign", "Rating"}) - -for _, v := range data { - table.Append(v) -} -table.Render() // Send output -``` - -##### Output 1 -``` -+------+-----------------------+--------+ -| NAME | SIGN | RATING | -+------+-----------------------+--------+ -| A | The Good | 500 | -| B | The Very very Bad Man | 288 | -| C | The Ugly | 120 | -| D | The Gopher | 800 | -+------+-----------------------+--------+ -``` - -#### Example 2 - Without Border / Footer / Bulk Append -```go -data := [][]string{ - []string{"1/1/2014", "Domain name", "2233", "$10.98"}, - []string{"1/1/2014", "January Hosting", "2233", "$54.95"}, - []string{"1/4/2014", "February Hosting", "2233", "$51.00"}, - []string{"1/4/2014", "February Extra Bandwidth", "2233", "$30.00"}, -} - -table := tablewriter.NewWriter(os.Stdout) -table.SetHeader([]string{"Date", "Description", "CV2", "Amount"}) -table.SetFooter([]string{"", "", "Total", "$146.93"}) // Add Footer -table.SetBorder(false) // Set Border to false -table.AppendBulk(data) // Add Bulk Data -table.Render() -``` - -##### Output 2 -``` - - DATE | DESCRIPTION | CV2 | AMOUNT -+----------+--------------------------+-------+---------+ - 1/1/2014 | Domain name | 2233 | $10.98 - 1/1/2014 | January Hosting | 2233 | $54.95 - 1/4/2014 | February Hosting | 2233 | $51.00 - 1/4/2014 | February Extra Bandwidth | 2233 | $30.00 -+----------+--------------------------+-------+---------+ - TOTAL | $146 93 - +-------+---------+ - -``` - - -#### Example 3 - CSV -```go -table, _ := tablewriter.NewCSV(os.Stdout, "test_info.csv", true) -table.SetAlignment(tablewriter.ALIGN_LEFT) // Set Alignment -table.Render() -``` - -##### Output 3 -``` -+----------+--------------+------+-----+---------+----------------+ -| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | -+----------+--------------+------+-----+---------+----------------+ -| user_id | smallint(5) | NO | PRI | NULL | auto_increment | -| username | varchar(10) | NO | | NULL | | -| password | varchar(100) | NO | | NULL | | -+----------+--------------+------+-----+---------+----------------+ -``` - -#### Example 4 - Custom Separator -```go -table, _ := tablewriter.NewCSV(os.Stdout, "test.csv", true) -table.SetRowLine(true) // Enable row line - -// Change table lines -table.SetCenterSeparator("*") -table.SetColumnSeparator("‡") -table.SetRowSeparator("-") - -table.SetAlignment(tablewriter.ALIGN_LEFT) -table.Render() -``` - -##### Output 4 -``` -*------------*-----------*---------* -╪ FIRST NAME ╪ LAST NAME ╪ SSN ╪ -*------------*-----------*---------* -╪ John ╪ Barry ╪ 123456 ╪ -*------------*-----------*---------* -╪ Kathy ╪ Smith ╪ 687987 ╪ -*------------*-----------*---------* -╪ Bob ╪ McCornick ╪ 3979870 ╪ -*------------*-----------*---------* -``` - -##### Example 5 - Markdown Format -```go -data := [][]string{ - []string{"1/1/2014", "Domain name", "2233", "$10.98"}, - []string{"1/1/2014", "January Hosting", "2233", "$54.95"}, - []string{"1/4/2014", "February Hosting", "2233", "$51.00"}, - []string{"1/4/2014", "February Extra Bandwidth", "2233", "$30.00"}, -} - -table := tablewriter.NewWriter(os.Stdout) -table.SetHeader([]string{"Date", "Description", "CV2", "Amount"}) -table.SetBorders(tablewriter.Border{Left: true, Top: false, Right: true, Bottom: false}) -table.SetCenterSeparator("|") -table.AppendBulk(data) // Add Bulk Data -table.Render() -``` - -##### Output 5 -``` -| DATE | DESCRIPTION | CV2 | AMOUNT | -|----------|--------------------------|------|--------| -| 1/1/2014 | Domain name | 2233 | $10.98 | -| 1/1/2014 | January Hosting | 2233 | $54.95 | -| 1/4/2014 | February Hosting | 2233 | $51.00 | -| 1/4/2014 | February Extra Bandwidth | 2233 | $30.00 | -``` - -#### Example 6 - Identical cells merging -```go -data := [][]string{ - []string{"1/1/2014", "Domain name", "1234", "$10.98"}, - []string{"1/1/2014", "January Hosting", "2345", "$54.95"}, - []string{"1/4/2014", "February Hosting", "3456", "$51.00"}, - []string{"1/4/2014", "February Extra Bandwidth", "4567", "$30.00"}, -} - -table := tablewriter.NewWriter(os.Stdout) -table.SetHeader([]string{"Date", "Description", "CV2", "Amount"}) -table.SetFooter([]string{"", "", "Total", "$146.93"}) -table.SetAutoMergeCells(true) -table.SetRowLine(true) -table.AppendBulk(data) -table.Render() -``` - -##### Output 6 -``` -+----------+--------------------------+-------+---------+ -| DATE | DESCRIPTION | CV2 | AMOUNT | -+----------+--------------------------+-------+---------+ -| 1/1/2014 | Domain name | 1234 | $10.98 | -+ +--------------------------+-------+---------+ -| | January Hosting | 2345 | $54.95 | -+----------+--------------------------+-------+---------+ -| 1/4/2014 | February Hosting | 3456 | $51.00 | -+ +--------------------------+-------+---------+ -| | February Extra Bandwidth | 4567 | $30.00 | -+----------+--------------------------+-------+---------+ -| TOTAL | $146 93 | -+----------+--------------------------+-------+---------+ -``` - -#### TODO -- ~~Import Directly from CSV~~ - `done` -- ~~Support for `SetFooter`~~ - `done` -- ~~Support for `SetBorder`~~ - `done` -- ~~Support table with uneven rows~~ - `done` -- Support custom alignment -- General Improvement & Optimisation -- `NewHTML` Parse table from HTML diff --git a/vendor/github.com/olekukonko/tablewriter/csv.go b/vendor/github.com/olekukonko/tablewriter/csv.go deleted file mode 100644 index 98878303bc48..000000000000 --- a/vendor/github.com/olekukonko/tablewriter/csv.go +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright 2014 Oleku Konko All rights reserved. -// Use of this source code is governed by a MIT -// license that can be found in the LICENSE file. - -// This module is a Table Writer API for the Go Programming Language. -// The protocols were written in pure Go and works on windows and unix systems - -package tablewriter - -import ( - "encoding/csv" - "io" - "os" -) - -// Start A new table by importing from a CSV file -// Takes io.Writer and csv File name -func NewCSV(writer io.Writer, fileName string, hasHeader bool) (*Table, error) { - file, err := os.Open(fileName) - if err != nil { - return &Table{}, err - } - defer file.Close() - csvReader := csv.NewReader(file) - t, err := NewCSVReader(writer, csvReader, hasHeader) - return t, err -} - -// Start a New Table Writer with csv.Reader -// This enables customisation such as reader.Comma = ';' -// See http://golang.org/src/pkg/encoding/csv/reader.go?s=3213:3671#L94 -func NewCSVReader(writer io.Writer, csvReader *csv.Reader, hasHeader bool) (*Table, error) { - t := NewWriter(writer) - if hasHeader { - // Read the first row - headers, err := csvReader.Read() - if err != nil { - return &Table{}, err - } - t.SetHeader(headers) - } - for { - record, err := csvReader.Read() - if err == io.EOF { - break - } else if err != nil { - return &Table{}, err - } - t.Append(record) - } - return t, nil -} diff --git a/vendor/github.com/olekukonko/tablewriter/table.go b/vendor/github.com/olekukonko/tablewriter/table.go deleted file mode 100644 index 3314bfba5cf8..000000000000 --- a/vendor/github.com/olekukonko/tablewriter/table.go +++ /dev/null @@ -1,662 +0,0 @@ -// Copyright 2014 Oleku Konko All rights reserved. -// Use of this source code is governed by a MIT -// license that can be found in the LICENSE file. - -// This module is a Table Writer API for the Go Programming Language. -// The protocols were written in pure Go and works on windows and unix systems - -// Create & Generate text based table -package tablewriter - -import ( - "bytes" - "fmt" - "io" - "regexp" - "strings" -) - -const ( - MAX_ROW_WIDTH = 30 -) - -const ( - CENTER = "+" - ROW = "-" - COLUMN = "|" - SPACE = " " - NEWLINE = "\n" -) - -const ( - ALIGN_DEFAULT = iota - ALIGN_CENTER - ALIGN_RIGHT - ALIGN_LEFT -) - -var ( - decimal = regexp.MustCompile(`^-*\d*\.?\d*$`) - percent = regexp.MustCompile(`^-*\d*\.?\d*$%$`) -) - -type Border struct { - Left bool - Right bool - Top bool - Bottom bool -} - -type Table struct { - out io.Writer - rows [][]string - lines [][][]string - cs map[int]int - rs map[int]int - headers []string - footers []string - autoFmt bool - autoWrap bool - mW int - pCenter string - pRow string - pColumn string - tColumn int - tRow int - hAlign int - fAlign int - align int - newLine string - rowLine bool - autoMergeCells bool - hdrLine bool - borders Border - colSize int -} - -// Start New Table -// Take io.Writer Directly -func NewWriter(writer io.Writer) *Table { - t := &Table{ - out: writer, - rows: [][]string{}, - lines: [][][]string{}, - cs: make(map[int]int), - rs: make(map[int]int), - headers: []string{}, - footers: []string{}, - autoFmt: true, - autoWrap: true, - mW: MAX_ROW_WIDTH, - pCenter: CENTER, - pRow: ROW, - pColumn: COLUMN, - tColumn: -1, - tRow: -1, - hAlign: ALIGN_DEFAULT, - fAlign: ALIGN_DEFAULT, - align: ALIGN_DEFAULT, - newLine: NEWLINE, - rowLine: false, - hdrLine: true, - borders: Border{Left: true, Right: true, Bottom: true, Top: true}, - colSize: -1} - return t -} - -// Render table output -func (t Table) Render() { - if t.borders.Top { - t.printLine(true) - } - t.printHeading() - if t.autoMergeCells { - t.printRowsMergeCells() - } else { - t.printRows() - } - - if !t.rowLine && t.borders.Bottom { - t.printLine(true) - } - t.printFooter() - -} - -// Set table header -func (t *Table) SetHeader(keys []string) { - t.colSize = len(keys) - for i, v := range keys { - t.parseDimension(v, i, -1) - t.headers = append(t.headers, v) - } -} - -// Set table Footer -func (t *Table) SetFooter(keys []string) { - //t.colSize = len(keys) - for i, v := range keys { - t.parseDimension(v, i, -1) - t.footers = append(t.footers, v) - } -} - -// Turn header autoformatting on/off. Default is on (true). -func (t *Table) SetAutoFormatHeaders(auto bool) { - t.autoFmt = auto -} - -// Turn automatic multiline text adjustment on/off. Default is on (true). -func (t *Table) SetAutoWrapText(auto bool) { - t.autoWrap = auto -} - -// Set the Default column width -func (t *Table) SetColWidth(width int) { - t.mW = width -} - -// Set the Column Separator -func (t *Table) SetColumnSeparator(sep string) { - t.pColumn = sep -} - -// Set the Row Separator -func (t *Table) SetRowSeparator(sep string) { - t.pRow = sep -} - -// Set the center Separator -func (t *Table) SetCenterSeparator(sep string) { - t.pCenter = sep -} - -// Set Header Alignment -func (t *Table) SetHeaderAlignment(hAlign int) { - t.hAlign = hAlign -} - -// Set Footer Alignment -func (t *Table) SetFooterAlignment(fAlign int) { - t.fAlign = fAlign -} - -// Set Table Alignment -func (t *Table) SetAlignment(align int) { - t.align = align -} - -// Set New Line -func (t *Table) SetNewLine(nl string) { - t.newLine = nl -} - -// Set Header Line -// This would enable / disable a line after the header -func (t *Table) SetHeaderLine(line bool) { - t.hdrLine = line -} - -// Set Row Line -// This would enable / disable a line on each row of the table -func (t *Table) SetRowLine(line bool) { - t.rowLine = line -} - -// Set Auto Merge Cells -// This would enable / disable the merge of cells with identical values -func (t *Table) SetAutoMergeCells(auto bool) { - t.autoMergeCells = auto -} - -// Set Table Border -// This would enable / disable line around the table -func (t *Table) SetBorder(border bool) { - t.SetBorders(Border{border, border, border, border}) -} - -func (t *Table) SetBorders(border Border) { - t.borders = border -} - -// Append row to table -func (t *Table) Append(row []string) { - rowSize := len(t.headers) - if rowSize > t.colSize { - t.colSize = rowSize - } - - n := len(t.lines) - line := [][]string{} - for i, v := range row { - - // Detect string width - // Detect String height - // Break strings into words - out := t.parseDimension(v, i, n) - - // Append broken words - line = append(line, out) - } - t.lines = append(t.lines, line) -} - -// Allow Support for Bulk Append -// Eliminates repeated for loops -func (t *Table) AppendBulk(rows [][]string) { - for _, row := range rows { - t.Append(row) - } -} - -// Print line based on row width -func (t Table) printLine(nl bool) { - fmt.Fprint(t.out, t.pCenter) - for i := 0; i < len(t.cs); i++ { - v := t.cs[i] - fmt.Fprintf(t.out, "%s%s%s%s", - t.pRow, - strings.Repeat(string(t.pRow), v), - t.pRow, - t.pCenter) - } - if nl { - fmt.Fprint(t.out, t.newLine) - } -} - -// Print line based on row width with our without cell separator -func (t Table) printLineOptionalCellSeparators(nl bool, displayCellSeparator []bool) { - fmt.Fprint(t.out, t.pCenter) - for i := 0; i < len(t.cs); i++ { - v := t.cs[i] - if i > len(displayCellSeparator) || displayCellSeparator[i] { - // Display the cell separator - fmt.Fprintf(t.out, "%s%s%s%s", - t.pRow, - strings.Repeat(string(t.pRow), v), - t.pRow, - t.pCenter) - } else { - // Don't display the cell separator for this cell - fmt.Fprintf(t.out, "%s%s", - strings.Repeat(" ", v+2), - t.pCenter) - } - } - if nl { - fmt.Fprint(t.out, t.newLine) - } -} - -// Return the PadRight function if align is left, PadLeft if align is right, -// and Pad by default -func pad(align int) func(string, string, int) string { - padFunc := Pad - switch align { - case ALIGN_LEFT: - padFunc = PadRight - case ALIGN_RIGHT: - padFunc = PadLeft - } - return padFunc -} - -// Print heading information -func (t Table) printHeading() { - // Check if headers is available - if len(t.headers) < 1 { - return - } - - // Check if border is set - // Replace with space if not set - fmt.Fprint(t.out, ConditionString(t.borders.Left, t.pColumn, SPACE)) - - // Identify last column - end := len(t.cs) - 1 - - // Get pad function - padFunc := pad(t.hAlign) - - // Print Heading column - for i := 0; i <= end; i++ { - v := t.cs[i] - h := t.headers[i] - if t.autoFmt { - h = Title(h) - } - pad := ConditionString((i == end && !t.borders.Left), SPACE, t.pColumn) - fmt.Fprintf(t.out, " %s %s", - padFunc(h, SPACE, v), - pad) - } - // Next line - fmt.Fprint(t.out, t.newLine) - if t.hdrLine { - t.printLine(true) - } -} - -// Print heading information -func (t Table) printFooter() { - // Check if headers is available - if len(t.footers) < 1 { - return - } - - // Only print line if border is not set - if !t.borders.Bottom { - t.printLine(true) - } - // Check if border is set - // Replace with space if not set - fmt.Fprint(t.out, ConditionString(t.borders.Bottom, t.pColumn, SPACE)) - - // Identify last column - end := len(t.cs) - 1 - - // Get pad function - padFunc := pad(t.fAlign) - - // Print Heading column - for i := 0; i <= end; i++ { - v := t.cs[i] - f := t.footers[i] - if t.autoFmt { - f = Title(f) - } - pad := ConditionString((i == end && !t.borders.Top), SPACE, t.pColumn) - - if len(t.footers[i]) == 0 { - pad = SPACE - } - fmt.Fprintf(t.out, " %s %s", - padFunc(f, SPACE, v), - pad) - } - // Next line - fmt.Fprint(t.out, t.newLine) - //t.printLine(true) - - hasPrinted := false - - for i := 0; i <= end; i++ { - v := t.cs[i] - pad := t.pRow - center := t.pCenter - length := len(t.footers[i]) - - if length > 0 { - hasPrinted = true - } - - // Set center to be space if length is 0 - if length == 0 && !t.borders.Right { - center = SPACE - } - - // Print first junction - if i == 0 { - fmt.Fprint(t.out, center) - } - - // Pad With space of length is 0 - if length == 0 { - pad = SPACE - } - // Ignore left space of it has printed before - if hasPrinted || t.borders.Left { - pad = t.pRow - center = t.pCenter - } - - // Change Center start position - if center == SPACE { - if i < end && len(t.footers[i+1]) != 0 { - center = t.pCenter - } - } - - // Print the footer - fmt.Fprintf(t.out, "%s%s%s%s", - pad, - strings.Repeat(string(pad), v), - pad, - center) - - } - - fmt.Fprint(t.out, t.newLine) - -} - -func (t Table) printRows() { - for i, lines := range t.lines { - t.printRow(lines, i) - } - -} - -// Print Row Information -// Adjust column alignment based on type - -func (t Table) printRow(columns [][]string, colKey int) { - // Get Maximum Height - max := t.rs[colKey] - total := len(columns) - - // TODO Fix uneven col size - // if total < t.colSize { - // for n := t.colSize - total; n < t.colSize ; n++ { - // columns = append(columns, []string{SPACE}) - // t.cs[n] = t.mW - // } - //} - - // Pad Each Height - // pads := []int{} - pads := []int{} - - for i, line := range columns { - length := len(line) - pad := max - length - pads = append(pads, pad) - for n := 0; n < pad; n++ { - columns[i] = append(columns[i], " ") - } - } - //fmt.Println(max, "\n") - for x := 0; x < max; x++ { - for y := 0; y < total; y++ { - - // Check if border is set - fmt.Fprint(t.out, ConditionString((!t.borders.Left && y == 0), SPACE, t.pColumn)) - - fmt.Fprintf(t.out, SPACE) - str := columns[y][x] - - // This would print alignment - // Default alignment would use multiple configuration - switch t.align { - case ALIGN_CENTER: // - fmt.Fprintf(t.out, "%s", Pad(str, SPACE, t.cs[y])) - case ALIGN_RIGHT: - fmt.Fprintf(t.out, "%s", PadLeft(str, SPACE, t.cs[y])) - case ALIGN_LEFT: - fmt.Fprintf(t.out, "%s", PadRight(str, SPACE, t.cs[y])) - default: - if decimal.MatchString(strings.TrimSpace(str)) || percent.MatchString(strings.TrimSpace(str)) { - fmt.Fprintf(t.out, "%s", PadLeft(str, SPACE, t.cs[y])) - } else { - fmt.Fprintf(t.out, "%s", PadRight(str, SPACE, t.cs[y])) - - // TODO Custom alignment per column - //if max == 1 || pads[y] > 0 { - // fmt.Fprintf(t.out, "%s", Pad(str, SPACE, t.cs[y])) - //} else { - // fmt.Fprintf(t.out, "%s", PadRight(str, SPACE, t.cs[y])) - //} - - } - } - fmt.Fprintf(t.out, SPACE) - } - // Check if border is set - // Replace with space if not set - fmt.Fprint(t.out, ConditionString(t.borders.Left, t.pColumn, SPACE)) - fmt.Fprint(t.out, t.newLine) - } - - if t.rowLine { - t.printLine(true) - } -} - -// Print the rows of the table and merge the cells that are identical -func (t Table) printRowsMergeCells() { - var previousLine []string - var displayCellBorder []bool - var tmpWriter bytes.Buffer - for i, lines := range t.lines { - // We store the display of the current line in a tmp writer, as we need to know which border needs to be print above - previousLine, displayCellBorder = t.printRowMergeCells(&tmpWriter, lines, i, previousLine) - if i > 0 { //We don't need to print borders above first line - if t.rowLine { - t.printLineOptionalCellSeparators(true, displayCellBorder) - } - } - tmpWriter.WriteTo(t.out) - } - //Print the end of the table - if t.rowLine { - t.printLine(true) - } -} - -// Print Row Information to a writer and merge identical cells. -// Adjust column alignment based on type - -func (t Table) printRowMergeCells(writer io.Writer, columns [][]string, colKey int, previousLine []string) ([]string, []bool) { - // Get Maximum Height - max := t.rs[colKey] - total := len(columns) - - // Pad Each Height - pads := []int{} - - for i, line := range columns { - length := len(line) - pad := max - length - pads = append(pads, pad) - for n := 0; n < pad; n++ { - columns[i] = append(columns[i], " ") - } - } - - var displayCellBorder []bool - for x := 0; x < max; x++ { - for y := 0; y < total; y++ { - - // Check if border is set - fmt.Fprint(writer, ConditionString((!t.borders.Left && y == 0), SPACE, t.pColumn)) - - fmt.Fprintf(writer, SPACE) - - str := columns[y][x] - - if t.autoMergeCells { - //Store the full line to merge mutli-lines cells - fullLine := strings.Join(columns[y], " ") - if len(previousLine) > y && fullLine == previousLine[y] && fullLine != "" { - // If this cell is identical to the one above but not empty, we don't display the border and keep the cell empty. - displayCellBorder = append(displayCellBorder, false) - str = "" - } else { - // First line or different content, keep the content and print the cell border - displayCellBorder = append(displayCellBorder, true) - } - } - - // This would print alignment - // Default alignment would use multiple configuration - switch t.align { - case ALIGN_CENTER: // - fmt.Fprintf(writer, "%s", Pad(str, SPACE, t.cs[y])) - case ALIGN_RIGHT: - fmt.Fprintf(writer, "%s", PadLeft(str, SPACE, t.cs[y])) - case ALIGN_LEFT: - fmt.Fprintf(writer, "%s", PadRight(str, SPACE, t.cs[y])) - default: - if decimal.MatchString(strings.TrimSpace(str)) || percent.MatchString(strings.TrimSpace(str)) { - fmt.Fprintf(writer, "%s", PadLeft(str, SPACE, t.cs[y])) - } else { - fmt.Fprintf(writer, "%s", PadRight(str, SPACE, t.cs[y])) - } - } - fmt.Fprintf(writer, SPACE) - } - // Check if border is set - // Replace with space if not set - fmt.Fprint(writer, ConditionString(t.borders.Left, t.pColumn, SPACE)) - fmt.Fprint(writer, t.newLine) - } - - //The new previous line is the current one - previousLine = make([]string, total) - for y := 0; y < total; y++ { - previousLine[y] = strings.Join(columns[y], " ") //Store the full line for multi-lines cells - } - //Returns the newly added line and wether or not a border should be displayed above. - return previousLine, displayCellBorder -} - -func (t *Table) parseDimension(str string, colKey, rowKey int) []string { - var ( - raw []string - max int - ) - w := DisplayWidth(str) - // Calculate Width - // Check if with is grater than maximum width - if w > t.mW { - w = t.mW - } - - // Check if width exists - v, ok := t.cs[colKey] - if !ok || v < w || v == 0 { - t.cs[colKey] = w - } - - if rowKey == -1 { - return raw - } - // Calculate Height - if t.autoWrap { - raw, _ = WrapString(str, t.cs[colKey]) - } else { - raw = getLines(str) - } - - for _, line := range raw { - if w := DisplayWidth(line); w > max { - max = w - } - } - - // Make sure the with is the same length as maximum word - // Important for cases where the width is smaller than maxu word - if max > t.cs[colKey] { - t.cs[colKey] = max - } - - h := len(raw) - v, ok = t.rs[rowKey] - - if !ok || v < h || v == 0 { - t.rs[rowKey] = h - } - //fmt.Printf("Raw %+v %d\n", raw, len(raw)) - return raw -} diff --git a/vendor/github.com/olekukonko/tablewriter/test.csv b/vendor/github.com/olekukonko/tablewriter/test.csv deleted file mode 100644 index 1609327e930f..000000000000 --- a/vendor/github.com/olekukonko/tablewriter/test.csv +++ /dev/null @@ -1,4 +0,0 @@ -first_name,last_name,ssn -John,Barry,123456 -Kathy,Smith,687987 -Bob,McCornick,3979870 \ No newline at end of file diff --git a/vendor/github.com/olekukonko/tablewriter/test_info.csv b/vendor/github.com/olekukonko/tablewriter/test_info.csv deleted file mode 100644 index e4c40e983aca..000000000000 --- a/vendor/github.com/olekukonko/tablewriter/test_info.csv +++ /dev/null @@ -1,4 +0,0 @@ -Field,Type,Null,Key,Default,Extra -user_id,smallint(5),NO,PRI,NULL,auto_increment -username,varchar(10),NO,,NULL, -password,varchar(100),NO,,NULL, \ No newline at end of file diff --git a/vendor/github.com/olekukonko/tablewriter/util.go b/vendor/github.com/olekukonko/tablewriter/util.go deleted file mode 100644 index 2deefbc52a0a..000000000000 --- a/vendor/github.com/olekukonko/tablewriter/util.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2014 Oleku Konko All rights reserved. -// Use of this source code is governed by a MIT -// license that can be found in the LICENSE file. - -// This module is a Table Writer API for the Go Programming Language. -// The protocols were written in pure Go and works on windows and unix systems - -package tablewriter - -import ( - "math" - "regexp" - "strings" - - "github.com/mattn/go-runewidth" -) - -var ansi = regexp.MustCompile("\033\\[(?:[0-9]{1,3}(?:;[0-9]{1,3})*)?[m|K]") - -func DisplayWidth(str string) int { - return runewidth.StringWidth(ansi.ReplaceAllLiteralString(str, "")) -} - -// Simple Condition for string -// Returns value based on condition -func ConditionString(cond bool, valid, inValid string) string { - if cond { - return valid - } - return inValid -} - -// Format Table Header -// Replace _ , . and spaces -func Title(name string) string { - name = strings.Replace(name, "_", " ", -1) - name = strings.Replace(name, ".", " ", -1) - name = strings.TrimSpace(name) - return strings.ToUpper(name) -} - -// Pad String -// Attempts to play string in the center -func Pad(s, pad string, width int) string { - gap := width - DisplayWidth(s) - if gap > 0 { - gapLeft := int(math.Ceil(float64(gap / 2))) - gapRight := gap - gapLeft - return strings.Repeat(string(pad), gapLeft) + s + strings.Repeat(string(pad), gapRight) - } - return s -} - -// Pad String Right position -// This would pace string at the left side fo the screen -func PadRight(s, pad string, width int) string { - gap := width - DisplayWidth(s) - if gap > 0 { - return s + strings.Repeat(string(pad), gap) - } - return s -} - -// Pad String Left position -// This would pace string at the right side fo the screen -func PadLeft(s, pad string, width int) string { - gap := width - DisplayWidth(s) - if gap > 0 { - return strings.Repeat(string(pad), gap) + s - } - return s -} diff --git a/vendor/github.com/olekukonko/tablewriter/wrap.go b/vendor/github.com/olekukonko/tablewriter/wrap.go deleted file mode 100644 index 5290fb65a279..000000000000 --- a/vendor/github.com/olekukonko/tablewriter/wrap.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2014 Oleku Konko All rights reserved. -// Use of this source code is governed by a MIT -// license that can be found in the LICENSE file. - -// This module is a Table Writer API for the Go Programming Language. -// The protocols were written in pure Go and works on windows and unix systems - -package tablewriter - -import ( - "math" - "strings" - "unicode/utf8" -) - -var ( - nl = "\n" - sp = " " -) - -const defaultPenalty = 1e5 - -// Wrap wraps s into a paragraph of lines of length lim, with minimal -// raggedness. -func WrapString(s string, lim int) ([]string, int) { - words := strings.Split(strings.Replace(s, nl, sp, -1), sp) - var lines []string - max := 0 - for _, v := range words { - max = len(v) - if max > lim { - lim = max - } - } - for _, line := range WrapWords(words, 1, lim, defaultPenalty) { - lines = append(lines, strings.Join(line, sp)) - } - return lines, lim -} - -// WrapWords is the low-level line-breaking algorithm, useful if you need more -// control over the details of the text wrapping process. For most uses, -// WrapString will be sufficient and more convenient. -// -// WrapWords splits a list of words into lines with minimal "raggedness", -// treating each rune as one unit, accounting for spc units between adjacent -// words on each line, and attempting to limit lines to lim units. Raggedness -// is the total error over all lines, where error is the square of the -// difference of the length of the line and lim. Too-long lines (which only -// happen when a single word is longer than lim units) have pen penalty units -// added to the error. -func WrapWords(words []string, spc, lim, pen int) [][]string { - n := len(words) - - length := make([][]int, n) - for i := 0; i < n; i++ { - length[i] = make([]int, n) - length[i][i] = utf8.RuneCountInString(words[i]) - for j := i + 1; j < n; j++ { - length[i][j] = length[i][j-1] + spc + utf8.RuneCountInString(words[j]) - } - } - nbrk := make([]int, n) - cost := make([]int, n) - for i := range cost { - cost[i] = math.MaxInt32 - } - for i := n - 1; i >= 0; i-- { - if length[i][n-1] <= lim { - cost[i] = 0 - nbrk[i] = n - } else { - for j := i + 1; j < n; j++ { - d := lim - length[i][j-1] - c := d*d + cost[j] - if length[i][j-1] > lim { - c += pen // too-long lines get a worse penalty - } - if c < cost[i] { - cost[i] = c - nbrk[i] = j - } - } - } - } - var lines [][]string - i := 0 - for i < n { - lines = append(lines, words[i:nbrk[i]]) - i = nbrk[i] - } - return lines -} - -// getLines decomposes a multiline string into a slice of strings. -func getLines(s string) []string { - var lines []string - - for _, line := range strings.Split(s, nl) { - lines = append(lines, line) - } - return lines -} diff --git a/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md b/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md deleted file mode 100644 index 1fc9fdf7f36a..000000000000 --- a/vendor/github.com/opentracing/opentracing-go/CHANGELOG.md +++ /dev/null @@ -1,14 +0,0 @@ -Changes by Version -================== - -1.1.0 (unreleased) -------------------- - -- Deprecate InitGlobalTracer() in favor of SetGlobalTracer() - - -1.0.0 (2016-09-26) -------------------- - -- This release implements OpenTracing Specification 1.0 (http://opentracing.io/spec) - diff --git a/vendor/github.com/opentracing/opentracing-go/LICENSE b/vendor/github.com/opentracing/opentracing-go/LICENSE deleted file mode 100644 index f0027349e830..000000000000 --- a/vendor/github.com/opentracing/opentracing-go/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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 2016 The OpenTracing 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. diff --git a/vendor/github.com/opentracing/opentracing-go/Makefile b/vendor/github.com/opentracing/opentracing-go/Makefile deleted file mode 100644 index d49a5c0d44fb..000000000000 --- a/vendor/github.com/opentracing/opentracing-go/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -PACKAGES := . ./mocktracer/... ./ext/... - -.DEFAULT_GOAL := test-and-lint - -.PHONE: test-and-lint - -test-and-lint: test lint - -.PHONY: test -test: - go test -v -cover -race ./... - -cover: - @rm -rf cover-all.out - $(foreach pkg, $(PACKAGES), $(MAKE) cover-pkg PKG=$(pkg) || true;) - @grep mode: cover.out > coverage.out - @cat cover-all.out >> coverage.out - go tool cover -html=coverage.out -o cover.html - @rm -rf cover.out cover-all.out coverage.out - -cover-pkg: - go test -coverprofile cover.out $(PKG) - @grep -v mode: cover.out >> cover-all.out - -.PHONY: lint -lint: - go fmt ./... - golint ./... - @# Run again with magic to exit non-zero if golint outputs anything. - @! (golint ./... | read dummy) - go vet ./... - diff --git a/vendor/github.com/opentracing/opentracing-go/README.md b/vendor/github.com/opentracing/opentracing-go/README.md deleted file mode 100644 index 007ee237c8a1..000000000000 --- a/vendor/github.com/opentracing/opentracing-go/README.md +++ /dev/null @@ -1,171 +0,0 @@ -[![Gitter chat](http://img.shields.io/badge/gitter-join%20chat%20%E2%86%92-brightgreen.svg)](https://gitter.im/opentracing/public) [![Build Status](https://travis-ci.org/opentracing/opentracing-go.svg?branch=master)](https://travis-ci.org/opentracing/opentracing-go) [![GoDoc](https://godoc.org/github.com/opentracing/opentracing-go?status.svg)](http://godoc.org/github.com/opentracing/opentracing-go) -[![Sourcegraph Badge](https://sourcegraph.com/github.com/opentracing/opentracing-go/-/badge.svg)](https://sourcegraph.com/github.com/opentracing/opentracing-go?badge) - -# OpenTracing API for Go - -This package is a Go platform API for OpenTracing. - -## Required Reading - -In order to understand the Go platform API, one must first be familiar with the -[OpenTracing project](http://opentracing.io) and -[terminology](http://opentracing.io/documentation/pages/spec.html) more specifically. - -## API overview for those adding instrumentation - -Everyday consumers of this `opentracing` package really only need to worry -about a couple of key abstractions: the `StartSpan` function, the `Span` -interface, and binding a `Tracer` at `main()`-time. Here are code snippets -demonstrating some important use cases. - -#### Singleton initialization - -The simplest starting point is `./default_tracer.go`. As early as possible, call - -```go - import "github.com/opentracing/opentracing-go" - import ".../some_tracing_impl" - - func main() { - opentracing.SetGlobalTracer( - // tracing impl specific: - some_tracing_impl.New(...), - ) - ... - } -``` - -#### Non-Singleton initialization - -If you prefer direct control to singletons, manage ownership of the -`opentracing.Tracer` implementation explicitly. - -#### Creating a Span given an existing Go `context.Context` - -If you use `context.Context` in your application, OpenTracing's Go library will -happily rely on it for `Span` propagation. To start a new (blocking child) -`Span`, you can use `StartSpanFromContext`. - -```go - func xyz(ctx context.Context, ...) { - ... - span, ctx := opentracing.StartSpanFromContext(ctx, "operation_name") - defer span.Finish() - span.LogFields( - log.String("event", "soft error"), - log.String("type", "cache timeout"), - log.Int("waited.millis", 1500)) - ... - } -``` - -#### Starting an empty trace by creating a "root span" - -It's always possible to create a "root" `Span` with no parent or other causal -reference. - -```go - func xyz() { - ... - sp := opentracing.StartSpan("operation_name") - defer sp.Finish() - ... - } -``` - -#### Creating a (child) Span given an existing (parent) Span - -```go - func xyz(parentSpan opentracing.Span, ...) { - ... - sp := opentracing.StartSpan( - "operation_name", - opentracing.ChildOf(parentSpan.Context())) - defer sp.Finish() - ... - } -``` - -#### Serializing to the wire - -```go - func makeSomeRequest(ctx context.Context) ... { - if span := opentracing.SpanFromContext(ctx); span != nil { - httpClient := &http.Client{} - httpReq, _ := http.NewRequest("GET", "http://myservice/", nil) - - // Transmit the span's TraceContext as HTTP headers on our - // outbound request. - opentracing.GlobalTracer().Inject( - span.Context(), - opentracing.HTTPHeaders, - opentracing.HTTPHeadersCarrier(httpReq.Header)) - - resp, err := httpClient.Do(httpReq) - ... - } - ... - } -``` - -#### Deserializing from the wire - -```go - http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { - var serverSpan opentracing.Span - appSpecificOperationName := ... - wireContext, err := opentracing.GlobalTracer().Extract( - opentracing.HTTPHeaders, - opentracing.HTTPHeadersCarrier(req.Header)) - if err != nil { - // Optionally record something about err here - } - - // Create the span referring to the RPC client if available. - // If wireContext == nil, a root span will be created. - serverSpan = opentracing.StartSpan( - appSpecificOperationName, - ext.RPCServerOption(wireContext)) - - defer serverSpan.Finish() - - ctx := opentracing.ContextWithSpan(context.Background(), serverSpan) - ... - } -``` - -#### Conditionally capture a field using `log.Noop` - -In some situations, you may want to dynamically decide whether or not -to log a field. For example, you may want to capture additional data, -such as a customer ID, in non-production environments: - -```go - func Customer(order *Order) log.Field { - if os.Getenv("ENVIRONMENT") == "dev" { - return log.String("customer", order.Customer.ID) - } - return log.Noop() - } -``` - -#### Goroutine-safety - -The entire public API is goroutine-safe and does not require external -synchronization. - -## API pointers for those implementing a tracing system - -Tracing system implementors may be able to reuse or copy-paste-modify the `basictracer` package, found [here](https://github.com/opentracing/basictracer-go). In particular, see `basictracer.New(...)`. - -## API compatibility - -For the time being, "mild" backwards-incompatible changes may be made without changing the major version number. As OpenTracing and `opentracing-go` mature, backwards compatibility will become more of a priority. - -## Tracer test suite - -A test suite is available in the [harness](https://godoc.org/github.com/opentracing/opentracing-go/harness) package that can assist Tracer implementors to assert that their Tracer is working correctly. - -## Licensing - -[Apache 2.0 License](./LICENSE). diff --git a/vendor/github.com/opentracing/opentracing-go/ext/tags.go b/vendor/github.com/opentracing/opentracing-go/ext/tags.go deleted file mode 100644 index 8800129a237d..000000000000 --- a/vendor/github.com/opentracing/opentracing-go/ext/tags.go +++ /dev/null @@ -1,210 +0,0 @@ -package ext - -import opentracing "github.com/opentracing/opentracing-go" - -// These constants define common tag names recommended for better portability across -// tracing systems and languages/platforms. -// -// The tag names are defined as typed strings, so that in addition to the usual use -// -// span.setTag(TagName, value) -// -// they also support value type validation via this additional syntax: -// -// TagName.Set(span, value) -// -var ( - ////////////////////////////////////////////////////////////////////// - // SpanKind (client/server or producer/consumer) - ////////////////////////////////////////////////////////////////////// - - // SpanKind hints at relationship between spans, e.g. client/server - SpanKind = spanKindTagName("span.kind") - - // SpanKindRPCClient marks a span representing the client-side of an RPC - // or other remote call - SpanKindRPCClientEnum = SpanKindEnum("client") - SpanKindRPCClient = opentracing.Tag{Key: string(SpanKind), Value: SpanKindRPCClientEnum} - - // SpanKindRPCServer marks a span representing the server-side of an RPC - // or other remote call - SpanKindRPCServerEnum = SpanKindEnum("server") - SpanKindRPCServer = opentracing.Tag{Key: string(SpanKind), Value: SpanKindRPCServerEnum} - - // SpanKindProducer marks a span representing the producer-side of a - // message bus - SpanKindProducerEnum = SpanKindEnum("producer") - SpanKindProducer = opentracing.Tag{Key: string(SpanKind), Value: SpanKindProducerEnum} - - // SpanKindConsumer marks a span representing the consumer-side of a - // message bus - SpanKindConsumerEnum = SpanKindEnum("consumer") - SpanKindConsumer = opentracing.Tag{Key: string(SpanKind), Value: SpanKindConsumerEnum} - - ////////////////////////////////////////////////////////////////////// - // Component name - ////////////////////////////////////////////////////////////////////// - - // Component is a low-cardinality identifier of the module, library, - // or package that is generating a span. - Component = stringTagName("component") - - ////////////////////////////////////////////////////////////////////// - // Sampling hint - ////////////////////////////////////////////////////////////////////// - - // SamplingPriority determines the priority of sampling this Span. - SamplingPriority = uint16TagName("sampling.priority") - - ////////////////////////////////////////////////////////////////////// - // Peer tags. These tags can be emitted by either client-side of - // server-side to describe the other side/service in a peer-to-peer - // communications, like an RPC call. - ////////////////////////////////////////////////////////////////////// - - // PeerService records the service name of the peer. - PeerService = stringTagName("peer.service") - - // PeerAddress records the address name of the peer. This may be a "ip:port", - // a bare "hostname", a FQDN or even a database DSN substring - // like "mysql://username@127.0.0.1:3306/dbname" - PeerAddress = stringTagName("peer.address") - - // PeerHostname records the host name of the peer - PeerHostname = stringTagName("peer.hostname") - - // PeerHostIPv4 records IP v4 host address of the peer - PeerHostIPv4 = ipv4Tag("peer.ipv4") - - // PeerHostIPv6 records IP v6 host address of the peer - PeerHostIPv6 = stringTagName("peer.ipv6") - - // PeerPort records port number of the peer - PeerPort = uint16TagName("peer.port") - - ////////////////////////////////////////////////////////////////////// - // HTTP Tags - ////////////////////////////////////////////////////////////////////// - - // HTTPUrl should be the URL of the request being handled in this segment - // of the trace, in standard URI format. The protocol is optional. - HTTPUrl = stringTagName("http.url") - - // HTTPMethod is the HTTP method of the request, and is case-insensitive. - HTTPMethod = stringTagName("http.method") - - // HTTPStatusCode is the numeric HTTP status code (200, 404, etc) of the - // HTTP response. - HTTPStatusCode = uint16TagName("http.status_code") - - ////////////////////////////////////////////////////////////////////// - // DB Tags - ////////////////////////////////////////////////////////////////////// - - // DBInstance is database instance name. - DBInstance = stringTagName("db.instance") - - // DBStatement is a database statement for the given database type. - // It can be a query or a prepared statement (i.e., before substitution). - DBStatement = stringTagName("db.statement") - - // DBType is a database type. For any SQL database, "sql". - // For others, the lower-case database category, e.g. "redis" - DBType = stringTagName("db.type") - - // DBUser is a username for accessing database. - DBUser = stringTagName("db.user") - - ////////////////////////////////////////////////////////////////////// - // Message Bus Tag - ////////////////////////////////////////////////////////////////////// - - // MessageBusDestination is an address at which messages can be exchanged - MessageBusDestination = stringTagName("message_bus.destination") - - ////////////////////////////////////////////////////////////////////// - // Error Tag - ////////////////////////////////////////////////////////////////////// - - // Error indicates that operation represented by the span resulted in an error. - Error = boolTagName("error") -) - -// --- - -// SpanKindEnum represents common span types -type SpanKindEnum string - -type spanKindTagName string - -// Set adds a string tag to the `span` -func (tag spanKindTagName) Set(span opentracing.Span, value SpanKindEnum) { - span.SetTag(string(tag), value) -} - -type rpcServerOption struct { - clientContext opentracing.SpanContext -} - -func (r rpcServerOption) Apply(o *opentracing.StartSpanOptions) { - if r.clientContext != nil { - opentracing.ChildOf(r.clientContext).Apply(o) - } - SpanKindRPCServer.Apply(o) -} - -// RPCServerOption returns a StartSpanOption appropriate for an RPC server span -// with `client` representing the metadata for the remote peer Span if available. -// In case client == nil, due to the client not being instrumented, this RPC -// server span will be a root span. -func RPCServerOption(client opentracing.SpanContext) opentracing.StartSpanOption { - return rpcServerOption{client} -} - -// --- - -type stringTagName string - -// Set adds a string tag to the `span` -func (tag stringTagName) Set(span opentracing.Span, value string) { - span.SetTag(string(tag), value) -} - -// --- - -type uint32TagName string - -// Set adds a uint32 tag to the `span` -func (tag uint32TagName) Set(span opentracing.Span, value uint32) { - span.SetTag(string(tag), value) -} - -// --- - -type uint16TagName string - -// Set adds a uint16 tag to the `span` -func (tag uint16TagName) Set(span opentracing.Span, value uint16) { - span.SetTag(string(tag), value) -} - -// --- - -type boolTagName string - -// Add adds a bool tag to the `span` -func (tag boolTagName) Set(span opentracing.Span, value bool) { - span.SetTag(string(tag), value) -} - -type ipv4Tag string - -// Set adds IP v4 host address of the peer as an uint32 value to the `span`, keep this for backward and zipkin compatibility -func (tag ipv4Tag) Set(span opentracing.Span, value uint32) { - span.SetTag(string(tag), value) -} - -// SetString records IP v4 host address of the peer as a .-separated tuple to the `span`. E.g., "127.0.0.1" -func (tag ipv4Tag) SetString(span opentracing.Span, value string) { - span.SetTag(string(tag), value) -} diff --git a/vendor/github.com/opentracing/opentracing-go/globaltracer.go b/vendor/github.com/opentracing/opentracing-go/globaltracer.go deleted file mode 100644 index 8c8e793ff23c..000000000000 --- a/vendor/github.com/opentracing/opentracing-go/globaltracer.go +++ /dev/null @@ -1,32 +0,0 @@ -package opentracing - -var ( - globalTracer Tracer = NoopTracer{} -) - -// SetGlobalTracer sets the [singleton] opentracing.Tracer returned by -// GlobalTracer(). Those who use GlobalTracer (rather than directly manage an -// opentracing.Tracer instance) should call SetGlobalTracer as early as -// possible in main(), prior to calling the `StartSpan` global func below. -// Prior to calling `SetGlobalTracer`, any Spans started via the `StartSpan` -// (etc) globals are noops. -func SetGlobalTracer(tracer Tracer) { - globalTracer = tracer -} - -// GlobalTracer returns the global singleton `Tracer` implementation. -// Before `SetGlobalTracer()` is called, the `GlobalTracer()` is a noop -// implementation that drops all data handed to it. -func GlobalTracer() Tracer { - return globalTracer -} - -// StartSpan defers to `Tracer.StartSpan`. See `GlobalTracer()`. -func StartSpan(operationName string, opts ...StartSpanOption) Span { - return globalTracer.StartSpan(operationName, opts...) -} - -// InitGlobalTracer is deprecated. Please use SetGlobalTracer. -func InitGlobalTracer(tracer Tracer) { - SetGlobalTracer(tracer) -} diff --git a/vendor/github.com/opentracing/opentracing-go/gocontext.go b/vendor/github.com/opentracing/opentracing-go/gocontext.go deleted file mode 100644 index 05a62e70b11a..000000000000 --- a/vendor/github.com/opentracing/opentracing-go/gocontext.go +++ /dev/null @@ -1,54 +0,0 @@ -package opentracing - -import "context" - -type contextKey struct{} - -var activeSpanKey = contextKey{} - -// ContextWithSpan returns a new `context.Context` that holds a reference to -// `span`'s SpanContext. -func ContextWithSpan(ctx context.Context, span Span) context.Context { - return context.WithValue(ctx, activeSpanKey, span) -} - -// SpanFromContext returns the `Span` previously associated with `ctx`, or -// `nil` if no such `Span` could be found. -// -// NOTE: context.Context != SpanContext: the former is Go's intra-process -// context propagation mechanism, and the latter houses OpenTracing's per-Span -// identity and baggage information. -func SpanFromContext(ctx context.Context) Span { - val := ctx.Value(activeSpanKey) - if sp, ok := val.(Span); ok { - return sp - } - return nil -} - -// StartSpanFromContext starts and returns a Span with `operationName`, using -// any Span found within `ctx` as a ChildOfRef. If no such parent could be -// found, StartSpanFromContext creates a root (parentless) Span. -// -// The second return value is a context.Context object built around the -// returned Span. -// -// Example usage: -// -// SomeFunction(ctx context.Context, ...) { -// sp, ctx := opentracing.StartSpanFromContext(ctx, "SomeFunction") -// defer sp.Finish() -// ... -// } -func StartSpanFromContext(ctx context.Context, operationName string, opts ...StartSpanOption) (Span, context.Context) { - return startSpanFromContextWithTracer(ctx, GlobalTracer(), operationName, opts...) -} - -// startSpanFromContextWithTracer is factored out for testing purposes. -func startSpanFromContextWithTracer(ctx context.Context, tracer Tracer, operationName string, opts ...StartSpanOption) (Span, context.Context) { - if parentSpan := SpanFromContext(ctx); parentSpan != nil { - opts = append(opts, ChildOf(parentSpan.Context())) - } - span := tracer.StartSpan(operationName, opts...) - return span, ContextWithSpan(ctx, span) -} diff --git a/vendor/github.com/opentracing/opentracing-go/log/field.go b/vendor/github.com/opentracing/opentracing-go/log/field.go deleted file mode 100644 index 50feea341a73..000000000000 --- a/vendor/github.com/opentracing/opentracing-go/log/field.go +++ /dev/null @@ -1,269 +0,0 @@ -package log - -import ( - "fmt" - "math" -) - -type fieldType int - -const ( - stringType fieldType = iota - boolType - intType - int32Type - uint32Type - int64Type - uint64Type - float32Type - float64Type - errorType - objectType - lazyLoggerType - noopType -) - -// Field instances are constructed via LogBool, LogString, and so on. -// Tracing implementations may then handle them via the Field.Marshal -// method. -// -// "heavily influenced by" (i.e., partially stolen from) -// https://github.com/uber-go/zap -type Field struct { - key string - fieldType fieldType - numericVal int64 - stringVal string - interfaceVal interface{} -} - -// String adds a string-valued key:value pair to a Span.LogFields() record -func String(key, val string) Field { - return Field{ - key: key, - fieldType: stringType, - stringVal: val, - } -} - -// Bool adds a bool-valued key:value pair to a Span.LogFields() record -func Bool(key string, val bool) Field { - var numericVal int64 - if val { - numericVal = 1 - } - return Field{ - key: key, - fieldType: boolType, - numericVal: numericVal, - } -} - -// Int adds an int-valued key:value pair to a Span.LogFields() record -func Int(key string, val int) Field { - return Field{ - key: key, - fieldType: intType, - numericVal: int64(val), - } -} - -// Int32 adds an int32-valued key:value pair to a Span.LogFields() record -func Int32(key string, val int32) Field { - return Field{ - key: key, - fieldType: int32Type, - numericVal: int64(val), - } -} - -// Int64 adds an int64-valued key:value pair to a Span.LogFields() record -func Int64(key string, val int64) Field { - return Field{ - key: key, - fieldType: int64Type, - numericVal: val, - } -} - -// Uint32 adds a uint32-valued key:value pair to a Span.LogFields() record -func Uint32(key string, val uint32) Field { - return Field{ - key: key, - fieldType: uint32Type, - numericVal: int64(val), - } -} - -// Uint64 adds a uint64-valued key:value pair to a Span.LogFields() record -func Uint64(key string, val uint64) Field { - return Field{ - key: key, - fieldType: uint64Type, - numericVal: int64(val), - } -} - -// Float32 adds a float32-valued key:value pair to a Span.LogFields() record -func Float32(key string, val float32) Field { - return Field{ - key: key, - fieldType: float32Type, - numericVal: int64(math.Float32bits(val)), - } -} - -// Float64 adds a float64-valued key:value pair to a Span.LogFields() record -func Float64(key string, val float64) Field { - return Field{ - key: key, - fieldType: float64Type, - numericVal: int64(math.Float64bits(val)), - } -} - -// Error adds an error with the key "error" to a Span.LogFields() record -func Error(err error) Field { - return Field{ - key: "error", - fieldType: errorType, - interfaceVal: err, - } -} - -// Object adds an object-valued key:value pair to a Span.LogFields() record -func Object(key string, obj interface{}) Field { - return Field{ - key: key, - fieldType: objectType, - interfaceVal: obj, - } -} - -// LazyLogger allows for user-defined, late-bound logging of arbitrary data -type LazyLogger func(fv Encoder) - -// Lazy adds a LazyLogger to a Span.LogFields() record; the tracing -// implementation will call the LazyLogger function at an indefinite time in -// the future (after Lazy() returns). -func Lazy(ll LazyLogger) Field { - return Field{ - fieldType: lazyLoggerType, - interfaceVal: ll, - } -} - -// Noop creates a no-op log field that should be ignored by the tracer. -// It can be used to capture optional fields, for example those that should -// only be logged in non-production environment: -// -// func customerField(order *Order) log.Field { -// if os.Getenv("ENVIRONMENT") == "dev" { -// return log.String("customer", order.Customer.ID) -// } -// return log.Noop() -// } -// -// span.LogFields(log.String("event", "purchase"), customerField(order)) -// -func Noop() Field { - return Field{ - fieldType: noopType, - } -} - -// Encoder allows access to the contents of a Field (via a call to -// Field.Marshal). -// -// Tracer implementations typically provide an implementation of Encoder; -// OpenTracing callers typically do not need to concern themselves with it. -type Encoder interface { - EmitString(key, value string) - EmitBool(key string, value bool) - EmitInt(key string, value int) - EmitInt32(key string, value int32) - EmitInt64(key string, value int64) - EmitUint32(key string, value uint32) - EmitUint64(key string, value uint64) - EmitFloat32(key string, value float32) - EmitFloat64(key string, value float64) - EmitObject(key string, value interface{}) - EmitLazyLogger(value LazyLogger) -} - -// Marshal passes a Field instance through to the appropriate -// field-type-specific method of an Encoder. -func (lf Field) Marshal(visitor Encoder) { - switch lf.fieldType { - case stringType: - visitor.EmitString(lf.key, lf.stringVal) - case boolType: - visitor.EmitBool(lf.key, lf.numericVal != 0) - case intType: - visitor.EmitInt(lf.key, int(lf.numericVal)) - case int32Type: - visitor.EmitInt32(lf.key, int32(lf.numericVal)) - case int64Type: - visitor.EmitInt64(lf.key, int64(lf.numericVal)) - case uint32Type: - visitor.EmitUint32(lf.key, uint32(lf.numericVal)) - case uint64Type: - visitor.EmitUint64(lf.key, uint64(lf.numericVal)) - case float32Type: - visitor.EmitFloat32(lf.key, math.Float32frombits(uint32(lf.numericVal))) - case float64Type: - visitor.EmitFloat64(lf.key, math.Float64frombits(uint64(lf.numericVal))) - case errorType: - if err, ok := lf.interfaceVal.(error); ok { - visitor.EmitString(lf.key, err.Error()) - } else { - visitor.EmitString(lf.key, "") - } - case objectType: - visitor.EmitObject(lf.key, lf.interfaceVal) - case lazyLoggerType: - visitor.EmitLazyLogger(lf.interfaceVal.(LazyLogger)) - case noopType: - // intentionally left blank - } -} - -// Key returns the field's key. -func (lf Field) Key() string { - return lf.key -} - -// Value returns the field's value as interface{}. -func (lf Field) Value() interface{} { - switch lf.fieldType { - case stringType: - return lf.stringVal - case boolType: - return lf.numericVal != 0 - case intType: - return int(lf.numericVal) - case int32Type: - return int32(lf.numericVal) - case int64Type: - return int64(lf.numericVal) - case uint32Type: - return uint32(lf.numericVal) - case uint64Type: - return uint64(lf.numericVal) - case float32Type: - return math.Float32frombits(uint32(lf.numericVal)) - case float64Type: - return math.Float64frombits(uint64(lf.numericVal)) - case errorType, objectType, lazyLoggerType: - return lf.interfaceVal - case noopType: - return nil - default: - return nil - } -} - -// String returns a string representation of the key and value. -func (lf Field) String() string { - return fmt.Sprint(lf.key, ":", lf.Value()) -} diff --git a/vendor/github.com/opentracing/opentracing-go/log/util.go b/vendor/github.com/opentracing/opentracing-go/log/util.go deleted file mode 100644 index 3832feb5ceb2..000000000000 --- a/vendor/github.com/opentracing/opentracing-go/log/util.go +++ /dev/null @@ -1,54 +0,0 @@ -package log - -import "fmt" - -// InterleavedKVToFields converts keyValues a la Span.LogKV() to a Field slice -// a la Span.LogFields(). -func InterleavedKVToFields(keyValues ...interface{}) ([]Field, error) { - if len(keyValues)%2 != 0 { - return nil, fmt.Errorf("non-even keyValues len: %d", len(keyValues)) - } - fields := make([]Field, len(keyValues)/2) - for i := 0; i*2 < len(keyValues); i++ { - key, ok := keyValues[i*2].(string) - if !ok { - return nil, fmt.Errorf( - "non-string key (pair #%d): %T", - i, keyValues[i*2]) - } - switch typedVal := keyValues[i*2+1].(type) { - case bool: - fields[i] = Bool(key, typedVal) - case string: - fields[i] = String(key, typedVal) - case int: - fields[i] = Int(key, typedVal) - case int8: - fields[i] = Int32(key, int32(typedVal)) - case int16: - fields[i] = Int32(key, int32(typedVal)) - case int32: - fields[i] = Int32(key, typedVal) - case int64: - fields[i] = Int64(key, typedVal) - case uint: - fields[i] = Uint64(key, uint64(typedVal)) - case uint64: - fields[i] = Uint64(key, typedVal) - case uint8: - fields[i] = Uint32(key, uint32(typedVal)) - case uint16: - fields[i] = Uint32(key, uint32(typedVal)) - case uint32: - fields[i] = Uint32(key, typedVal) - case float32: - fields[i] = Float32(key, typedVal) - case float64: - fields[i] = Float64(key, typedVal) - default: - // When in doubt, coerce to a string - fields[i] = String(key, fmt.Sprint(typedVal)) - } - } - return fields, nil -} diff --git a/vendor/github.com/opentracing/opentracing-go/noop.go b/vendor/github.com/opentracing/opentracing-go/noop.go deleted file mode 100644 index 0d32f692c410..000000000000 --- a/vendor/github.com/opentracing/opentracing-go/noop.go +++ /dev/null @@ -1,64 +0,0 @@ -package opentracing - -import "github.com/opentracing/opentracing-go/log" - -// A NoopTracer is a trivial, minimum overhead implementation of Tracer -// for which all operations are no-ops. -// -// The primary use of this implementation is in libraries, such as RPC -// frameworks, that make tracing an optional feature controlled by the -// end user. A no-op implementation allows said libraries to use it -// as the default Tracer and to write instrumentation that does -// not need to keep checking if the tracer instance is nil. -// -// For the same reason, the NoopTracer is the default "global" tracer -// (see GlobalTracer and SetGlobalTracer functions). -// -// WARNING: NoopTracer does not support baggage propagation. -type NoopTracer struct{} - -type noopSpan struct{} -type noopSpanContext struct{} - -var ( - defaultNoopSpanContext = noopSpanContext{} - defaultNoopSpan = noopSpan{} - defaultNoopTracer = NoopTracer{} -) - -const ( - emptyString = "" -) - -// noopSpanContext: -func (n noopSpanContext) ForeachBaggageItem(handler func(k, v string) bool) {} - -// noopSpan: -func (n noopSpan) Context() SpanContext { return defaultNoopSpanContext } -func (n noopSpan) SetBaggageItem(key, val string) Span { return defaultNoopSpan } -func (n noopSpan) BaggageItem(key string) string { return emptyString } -func (n noopSpan) SetTag(key string, value interface{}) Span { return n } -func (n noopSpan) LogFields(fields ...log.Field) {} -func (n noopSpan) LogKV(keyVals ...interface{}) {} -func (n noopSpan) Finish() {} -func (n noopSpan) FinishWithOptions(opts FinishOptions) {} -func (n noopSpan) SetOperationName(operationName string) Span { return n } -func (n noopSpan) Tracer() Tracer { return defaultNoopTracer } -func (n noopSpan) LogEvent(event string) {} -func (n noopSpan) LogEventWithPayload(event string, payload interface{}) {} -func (n noopSpan) Log(data LogData) {} - -// StartSpan belongs to the Tracer interface. -func (n NoopTracer) StartSpan(operationName string, opts ...StartSpanOption) Span { - return defaultNoopSpan -} - -// Inject belongs to the Tracer interface. -func (n NoopTracer) Inject(sp SpanContext, format interface{}, carrier interface{}) error { - return nil -} - -// Extract belongs to the Tracer interface. -func (n NoopTracer) Extract(format interface{}, carrier interface{}) (SpanContext, error) { - return nil, ErrSpanContextNotFound -} diff --git a/vendor/github.com/opentracing/opentracing-go/propagation.go b/vendor/github.com/opentracing/opentracing-go/propagation.go deleted file mode 100644 index 0dd466a373ef..000000000000 --- a/vendor/github.com/opentracing/opentracing-go/propagation.go +++ /dev/null @@ -1,176 +0,0 @@ -package opentracing - -import ( - "errors" - "net/http" -) - -/////////////////////////////////////////////////////////////////////////////// -// CORE PROPAGATION INTERFACES: -/////////////////////////////////////////////////////////////////////////////// - -var ( - // ErrUnsupportedFormat occurs when the `format` passed to Tracer.Inject() or - // Tracer.Extract() is not recognized by the Tracer implementation. - ErrUnsupportedFormat = errors.New("opentracing: Unknown or unsupported Inject/Extract format") - - // ErrSpanContextNotFound occurs when the `carrier` passed to - // Tracer.Extract() is valid and uncorrupted but has insufficient - // information to extract a SpanContext. - ErrSpanContextNotFound = errors.New("opentracing: SpanContext not found in Extract carrier") - - // ErrInvalidSpanContext errors occur when Tracer.Inject() is asked to - // operate on a SpanContext which it is not prepared to handle (for - // example, since it was created by a different tracer implementation). - ErrInvalidSpanContext = errors.New("opentracing: SpanContext type incompatible with tracer") - - // ErrInvalidCarrier errors occur when Tracer.Inject() or Tracer.Extract() - // implementations expect a different type of `carrier` than they are - // given. - ErrInvalidCarrier = errors.New("opentracing: Invalid Inject/Extract carrier") - - // ErrSpanContextCorrupted occurs when the `carrier` passed to - // Tracer.Extract() is of the expected type but is corrupted. - ErrSpanContextCorrupted = errors.New("opentracing: SpanContext data corrupted in Extract carrier") -) - -/////////////////////////////////////////////////////////////////////////////// -// BUILTIN PROPAGATION FORMATS: -/////////////////////////////////////////////////////////////////////////////// - -// BuiltinFormat is used to demarcate the values within package `opentracing` -// that are intended for use with the Tracer.Inject() and Tracer.Extract() -// methods. -type BuiltinFormat byte - -const ( - // Binary represents SpanContexts as opaque binary data. - // - // For Tracer.Inject(): the carrier must be an `io.Writer`. - // - // For Tracer.Extract(): the carrier must be an `io.Reader`. - Binary BuiltinFormat = iota - - // TextMap represents SpanContexts as key:value string pairs. - // - // Unlike HTTPHeaders, the TextMap format does not restrict the key or - // value character sets in any way. - // - // For Tracer.Inject(): the carrier must be a `TextMapWriter`. - // - // For Tracer.Extract(): the carrier must be a `TextMapReader`. - TextMap - - // HTTPHeaders represents SpanContexts as HTTP header string pairs. - // - // Unlike TextMap, the HTTPHeaders format requires that the keys and values - // be valid as HTTP headers as-is (i.e., character casing may be unstable - // and special characters are disallowed in keys, values should be - // URL-escaped, etc). - // - // For Tracer.Inject(): the carrier must be a `TextMapWriter`. - // - // For Tracer.Extract(): the carrier must be a `TextMapReader`. - // - // See HTTPHeadersCarrier for an implementation of both TextMapWriter - // and TextMapReader that defers to an http.Header instance for storage. - // For example, Inject(): - // - // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) - // err := span.Tracer().Inject( - // span.Context(), opentracing.HTTPHeaders, carrier) - // - // Or Extract(): - // - // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) - // clientContext, err := tracer.Extract( - // opentracing.HTTPHeaders, carrier) - // - HTTPHeaders -) - -// TextMapWriter is the Inject() carrier for the TextMap builtin format. With -// it, the caller can encode a SpanContext for propagation as entries in a map -// of unicode strings. -type TextMapWriter interface { - // Set a key:value pair to the carrier. Multiple calls to Set() for the - // same key leads to undefined behavior. - // - // NOTE: The backing store for the TextMapWriter may contain data unrelated - // to SpanContext. As such, Inject() and Extract() implementations that - // call the TextMapWriter and TextMapReader interfaces must agree on a - // prefix or other convention to distinguish their own key:value pairs. - Set(key, val string) -} - -// TextMapReader is the Extract() carrier for the TextMap builtin format. With it, -// the caller can decode a propagated SpanContext as entries in a map of -// unicode strings. -type TextMapReader interface { - // ForeachKey returns TextMap contents via repeated calls to the `handler` - // function. If any call to `handler` returns a non-nil error, ForeachKey - // terminates and returns that error. - // - // NOTE: The backing store for the TextMapReader may contain data unrelated - // to SpanContext. As such, Inject() and Extract() implementations that - // call the TextMapWriter and TextMapReader interfaces must agree on a - // prefix or other convention to distinguish their own key:value pairs. - // - // The "foreach" callback pattern reduces unnecessary copying in some cases - // and also allows implementations to hold locks while the map is read. - ForeachKey(handler func(key, val string) error) error -} - -// TextMapCarrier allows the use of regular map[string]string -// as both TextMapWriter and TextMapReader. -type TextMapCarrier map[string]string - -// ForeachKey conforms to the TextMapReader interface. -func (c TextMapCarrier) ForeachKey(handler func(key, val string) error) error { - for k, v := range c { - if err := handler(k, v); err != nil { - return err - } - } - return nil -} - -// Set implements Set() of opentracing.TextMapWriter -func (c TextMapCarrier) Set(key, val string) { - c[key] = val -} - -// HTTPHeadersCarrier satisfies both TextMapWriter and TextMapReader. -// -// Example usage for server side: -// -// carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) -// clientContext, err := tracer.Extract(opentracing.HTTPHeaders, carrier) -// -// Example usage for client side: -// -// carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) -// err := tracer.Inject( -// span.Context(), -// opentracing.HTTPHeaders, -// carrier) -// -type HTTPHeadersCarrier http.Header - -// Set conforms to the TextMapWriter interface. -func (c HTTPHeadersCarrier) Set(key, val string) { - h := http.Header(c) - h.Add(key, val) -} - -// ForeachKey conforms to the TextMapReader interface. -func (c HTTPHeadersCarrier) ForeachKey(handler func(key, val string) error) error { - for k, vals := range c { - for _, v := range vals { - if err := handler(k, v); err != nil { - return err - } - } - } - return nil -} diff --git a/vendor/github.com/opentracing/opentracing-go/span.go b/vendor/github.com/opentracing/opentracing-go/span.go deleted file mode 100644 index 0d3fb5341838..000000000000 --- a/vendor/github.com/opentracing/opentracing-go/span.go +++ /dev/null @@ -1,189 +0,0 @@ -package opentracing - -import ( - "time" - - "github.com/opentracing/opentracing-go/log" -) - -// SpanContext represents Span state that must propagate to descendant Spans and across process -// boundaries (e.g., a tuple). -type SpanContext interface { - // ForeachBaggageItem grants access to all baggage items stored in the - // SpanContext. - // The handler function will be called for each baggage key/value pair. - // The ordering of items is not guaranteed. - // - // The bool return value indicates if the handler wants to continue iterating - // through the rest of the baggage items; for example if the handler is trying to - // find some baggage item by pattern matching the name, it can return false - // as soon as the item is found to stop further iterations. - ForeachBaggageItem(handler func(k, v string) bool) -} - -// Span represents an active, un-finished span in the OpenTracing system. -// -// Spans are created by the Tracer interface. -type Span interface { - // Sets the end timestamp and finalizes Span state. - // - // With the exception of calls to Context() (which are always allowed), - // Finish() must be the last call made to any span instance, and to do - // otherwise leads to undefined behavior. - Finish() - // FinishWithOptions is like Finish() but with explicit control over - // timestamps and log data. - FinishWithOptions(opts FinishOptions) - - // Context() yields the SpanContext for this Span. Note that the return - // value of Context() is still valid after a call to Span.Finish(), as is - // a call to Span.Context() after a call to Span.Finish(). - Context() SpanContext - - // Sets or changes the operation name. - // - // Returns a reference to this Span for chaining. - SetOperationName(operationName string) Span - - // Adds a tag to the span. - // - // If there is a pre-existing tag set for `key`, it is overwritten. - // - // Tag values can be numeric types, strings, or bools. The behavior of - // other tag value types is undefined at the OpenTracing level. If a - // tracing system does not know how to handle a particular value type, it - // may ignore the tag, but shall not panic. - // - // Returns a reference to this Span for chaining. - SetTag(key string, value interface{}) Span - - // LogFields is an efficient and type-checked way to record key:value - // logging data about a Span, though the programming interface is a little - // more verbose than LogKV(). Here's an example: - // - // span.LogFields( - // log.String("event", "soft error"), - // log.String("type", "cache timeout"), - // log.Int("waited.millis", 1500)) - // - // Also see Span.FinishWithOptions() and FinishOptions.BulkLogData. - LogFields(fields ...log.Field) - - // LogKV is a concise, readable way to record key:value logging data about - // a Span, though unfortunately this also makes it less efficient and less - // type-safe than LogFields(). Here's an example: - // - // span.LogKV( - // "event", "soft error", - // "type", "cache timeout", - // "waited.millis", 1500) - // - // For LogKV (as opposed to LogFields()), the parameters must appear as - // key-value pairs, like - // - // span.LogKV(key1, val1, key2, val2, key3, val3, ...) - // - // The keys must all be strings. The values may be strings, numeric types, - // bools, Go error instances, or arbitrary structs. - // - // (Note to implementors: consider the log.InterleavedKVToFields() helper) - LogKV(alternatingKeyValues ...interface{}) - - // SetBaggageItem sets a key:value pair on this Span and its SpanContext - // that also propagates to descendants of this Span. - // - // SetBaggageItem() enables powerful functionality given a full-stack - // opentracing integration (e.g., arbitrary application data from a mobile - // app can make it, transparently, all the way into the depths of a storage - // system), and with it some powerful costs: use this feature with care. - // - // IMPORTANT NOTE #1: SetBaggageItem() will only propagate baggage items to - // *future* causal descendants of the associated Span. - // - // IMPORTANT NOTE #2: Use this thoughtfully and with care. Every key and - // value is copied into every local *and remote* child of the associated - // Span, and that can add up to a lot of network and cpu overhead. - // - // Returns a reference to this Span for chaining. - SetBaggageItem(restrictedKey, value string) Span - - // Gets the value for a baggage item given its key. Returns the empty string - // if the value isn't found in this Span. - BaggageItem(restrictedKey string) string - - // Provides access to the Tracer that created this Span. - Tracer() Tracer - - // Deprecated: use LogFields or LogKV - LogEvent(event string) - // Deprecated: use LogFields or LogKV - LogEventWithPayload(event string, payload interface{}) - // Deprecated: use LogFields or LogKV - Log(data LogData) -} - -// LogRecord is data associated with a single Span log. Every LogRecord -// instance must specify at least one Field. -type LogRecord struct { - Timestamp time.Time - Fields []log.Field -} - -// FinishOptions allows Span.FinishWithOptions callers to override the finish -// timestamp and provide log data via a bulk interface. -type FinishOptions struct { - // FinishTime overrides the Span's finish time, or implicitly becomes - // time.Now() if FinishTime.IsZero(). - // - // FinishTime must resolve to a timestamp that's >= the Span's StartTime - // (per StartSpanOptions). - FinishTime time.Time - - // LogRecords allows the caller to specify the contents of many LogFields() - // calls with a single slice. May be nil. - // - // None of the LogRecord.Timestamp values may be .IsZero() (i.e., they must - // be set explicitly). Also, they must be >= the Span's start timestamp and - // <= the FinishTime (or time.Now() if FinishTime.IsZero()). Otherwise the - // behavior of FinishWithOptions() is undefined. - // - // If specified, the caller hands off ownership of LogRecords at - // FinishWithOptions() invocation time. - // - // If specified, the (deprecated) BulkLogData must be nil or empty. - LogRecords []LogRecord - - // BulkLogData is DEPRECATED. - BulkLogData []LogData -} - -// LogData is DEPRECATED -type LogData struct { - Timestamp time.Time - Event string - Payload interface{} -} - -// ToLogRecord converts a deprecated LogData to a non-deprecated LogRecord -func (ld *LogData) ToLogRecord() LogRecord { - var literalTimestamp time.Time - if ld.Timestamp.IsZero() { - literalTimestamp = time.Now() - } else { - literalTimestamp = ld.Timestamp - } - rval := LogRecord{ - Timestamp: literalTimestamp, - } - if ld.Payload == nil { - rval.Fields = []log.Field{ - log.String("event", ld.Event), - } - } else { - rval.Fields = []log.Field{ - log.String("event", ld.Event), - log.Object("payload", ld.Payload), - } - } - return rval -} diff --git a/vendor/github.com/opentracing/opentracing-go/tracer.go b/vendor/github.com/opentracing/opentracing-go/tracer.go deleted file mode 100644 index 7bca1f73676d..000000000000 --- a/vendor/github.com/opentracing/opentracing-go/tracer.go +++ /dev/null @@ -1,305 +0,0 @@ -package opentracing - -import "time" - -// Tracer is a simple, thin interface for Span creation and SpanContext -// propagation. -type Tracer interface { - - // Create, start, and return a new Span with the given `operationName` and - // incorporate the given StartSpanOption `opts`. (Note that `opts` borrows - // from the "functional options" pattern, per - // http://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis) - // - // A Span with no SpanReference options (e.g., opentracing.ChildOf() or - // opentracing.FollowsFrom()) becomes the root of its own trace. - // - // Examples: - // - // var tracer opentracing.Tracer = ... - // - // // The root-span case: - // sp := tracer.StartSpan("GetFeed") - // - // // The vanilla child span case: - // sp := tracer.StartSpan( - // "GetFeed", - // opentracing.ChildOf(parentSpan.Context())) - // - // // All the bells and whistles: - // sp := tracer.StartSpan( - // "GetFeed", - // opentracing.ChildOf(parentSpan.Context()), - // opentracing.Tag{"user_agent", loggedReq.UserAgent}, - // opentracing.StartTime(loggedReq.Timestamp), - // ) - // - StartSpan(operationName string, opts ...StartSpanOption) Span - - // Inject() takes the `sm` SpanContext instance and injects it for - // propagation within `carrier`. The actual type of `carrier` depends on - // the value of `format`. - // - // OpenTracing defines a common set of `format` values (see BuiltinFormat), - // and each has an expected carrier type. - // - // Other packages may declare their own `format` values, much like the keys - // used by `context.Context` (see - // https://godoc.org/golang.org/x/net/context#WithValue). - // - // Example usage (sans error handling): - // - // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) - // err := tracer.Inject( - // span.Context(), - // opentracing.HTTPHeaders, - // carrier) - // - // NOTE: All opentracing.Tracer implementations MUST support all - // BuiltinFormats. - // - // Implementations may return opentracing.ErrUnsupportedFormat if `format` - // is not supported by (or not known by) the implementation. - // - // Implementations may return opentracing.ErrInvalidCarrier or any other - // implementation-specific error if the format is supported but injection - // fails anyway. - // - // See Tracer.Extract(). - Inject(sm SpanContext, format interface{}, carrier interface{}) error - - // Extract() returns a SpanContext instance given `format` and `carrier`. - // - // OpenTracing defines a common set of `format` values (see BuiltinFormat), - // and each has an expected carrier type. - // - // Other packages may declare their own `format` values, much like the keys - // used by `context.Context` (see - // https://godoc.org/golang.org/x/net/context#WithValue). - // - // Example usage (with StartSpan): - // - // - // carrier := opentracing.HTTPHeadersCarrier(httpReq.Header) - // clientContext, err := tracer.Extract(opentracing.HTTPHeaders, carrier) - // - // // ... assuming the ultimate goal here is to resume the trace with a - // // server-side Span: - // var serverSpan opentracing.Span - // if err == nil { - // span = tracer.StartSpan( - // rpcMethodName, ext.RPCServerOption(clientContext)) - // } else { - // span = tracer.StartSpan(rpcMethodName) - // } - // - // - // NOTE: All opentracing.Tracer implementations MUST support all - // BuiltinFormats. - // - // Return values: - // - A successful Extract returns a SpanContext instance and a nil error - // - If there was simply no SpanContext to extract in `carrier`, Extract() - // returns (nil, opentracing.ErrSpanContextNotFound) - // - If `format` is unsupported or unrecognized, Extract() returns (nil, - // opentracing.ErrUnsupportedFormat) - // - If there are more fundamental problems with the `carrier` object, - // Extract() may return opentracing.ErrInvalidCarrier, - // opentracing.ErrSpanContextCorrupted, or implementation-specific - // errors. - // - // See Tracer.Inject(). - Extract(format interface{}, carrier interface{}) (SpanContext, error) -} - -// StartSpanOptions allows Tracer.StartSpan() callers and implementors a -// mechanism to override the start timestamp, specify Span References, and make -// a single Tag or multiple Tags available at Span start time. -// -// StartSpan() callers should look at the StartSpanOption interface and -// implementations available in this package. -// -// Tracer implementations can convert a slice of `StartSpanOption` instances -// into a `StartSpanOptions` struct like so: -// -// func StartSpan(opName string, opts ...opentracing.StartSpanOption) { -// sso := opentracing.StartSpanOptions{} -// for _, o := range opts { -// o.Apply(&sso) -// } -// ... -// } -// -type StartSpanOptions struct { - // Zero or more causal references to other Spans (via their SpanContext). - // If empty, start a "root" Span (i.e., start a new trace). - References []SpanReference - - // StartTime overrides the Span's start time, or implicitly becomes - // time.Now() if StartTime.IsZero(). - StartTime time.Time - - // Tags may have zero or more entries; the restrictions on map values are - // identical to those for Span.SetTag(). May be nil. - // - // If specified, the caller hands off ownership of Tags at - // StartSpan() invocation time. - Tags map[string]interface{} -} - -// StartSpanOption instances (zero or more) may be passed to Tracer.StartSpan. -// -// StartSpanOption borrows from the "functional options" pattern, per -// http://dave.cheney.net/2014/10/17/functional-options-for-friendly-apis -type StartSpanOption interface { - Apply(*StartSpanOptions) -} - -// SpanReferenceType is an enum type describing different categories of -// relationships between two Spans. If Span-2 refers to Span-1, the -// SpanReferenceType describes Span-1 from Span-2's perspective. For example, -// ChildOfRef means that Span-1 created Span-2. -// -// NOTE: Span-1 and Span-2 do *not* necessarily depend on each other for -// completion; e.g., Span-2 may be part of a background job enqueued by Span-1, -// or Span-2 may be sitting in a distributed queue behind Span-1. -type SpanReferenceType int - -const ( - // ChildOfRef refers to a parent Span that caused *and* somehow depends - // upon the new child Span. Often (but not always), the parent Span cannot - // finish until the child Span does. - // - // An timing diagram for a ChildOfRef that's blocked on the new Span: - // - // [-Parent Span---------] - // [-Child Span----] - // - // See http://opentracing.io/spec/ - // - // See opentracing.ChildOf() - ChildOfRef SpanReferenceType = iota - - // FollowsFromRef refers to a parent Span that does not depend in any way - // on the result of the new child Span. For instance, one might use - // FollowsFromRefs to describe pipeline stages separated by queues, - // or a fire-and-forget cache insert at the tail end of a web request. - // - // A FollowsFromRef Span is part of the same logical trace as the new Span: - // i.e., the new Span is somehow caused by the work of its FollowsFromRef. - // - // All of the following could be valid timing diagrams for children that - // "FollowFrom" a parent. - // - // [-Parent Span-] [-Child Span-] - // - // - // [-Parent Span--] - // [-Child Span-] - // - // - // [-Parent Span-] - // [-Child Span-] - // - // See http://opentracing.io/spec/ - // - // See opentracing.FollowsFrom() - FollowsFromRef -) - -// SpanReference is a StartSpanOption that pairs a SpanReferenceType and a -// referenced SpanContext. See the SpanReferenceType documentation for -// supported relationships. If SpanReference is created with -// ReferencedContext==nil, it has no effect. Thus it allows for a more concise -// syntax for starting spans: -// -// sc, _ := tracer.Extract(someFormat, someCarrier) -// span := tracer.StartSpan("operation", opentracing.ChildOf(sc)) -// -// The `ChildOf(sc)` option above will not panic if sc == nil, it will just -// not add the parent span reference to the options. -type SpanReference struct { - Type SpanReferenceType - ReferencedContext SpanContext -} - -// Apply satisfies the StartSpanOption interface. -func (r SpanReference) Apply(o *StartSpanOptions) { - if r.ReferencedContext != nil { - o.References = append(o.References, r) - } -} - -// ChildOf returns a StartSpanOption pointing to a dependent parent span. -// If sc == nil, the option has no effect. -// -// See ChildOfRef, SpanReference -func ChildOf(sc SpanContext) SpanReference { - return SpanReference{ - Type: ChildOfRef, - ReferencedContext: sc, - } -} - -// FollowsFrom returns a StartSpanOption pointing to a parent Span that caused -// the child Span but does not directly depend on its result in any way. -// If sc == nil, the option has no effect. -// -// See FollowsFromRef, SpanReference -func FollowsFrom(sc SpanContext) SpanReference { - return SpanReference{ - Type: FollowsFromRef, - ReferencedContext: sc, - } -} - -// StartTime is a StartSpanOption that sets an explicit start timestamp for the -// new Span. -type StartTime time.Time - -// Apply satisfies the StartSpanOption interface. -func (t StartTime) Apply(o *StartSpanOptions) { - o.StartTime = time.Time(t) -} - -// Tags are a generic map from an arbitrary string key to an opaque value type. -// The underlying tracing system is responsible for interpreting and -// serializing the values. -type Tags map[string]interface{} - -// Apply satisfies the StartSpanOption interface. -func (t Tags) Apply(o *StartSpanOptions) { - if o.Tags == nil { - o.Tags = make(map[string]interface{}) - } - for k, v := range t { - o.Tags[k] = v - } -} - -// Tag may be passed as a StartSpanOption to add a tag to new spans, -// or its Set method may be used to apply the tag to an existing Span, -// for example: -// -// tracer.StartSpan("opName", Tag{"Key", value}) -// -// or -// -// Tag{"key", value}.Set(span) -type Tag struct { - Key string - Value interface{} -} - -// Apply satisfies the StartSpanOption interface. -func (t Tag) Apply(o *StartSpanOptions) { - if o.Tags == nil { - o.Tags = make(map[string]interface{}) - } - o.Tags[t.Key] = t.Value -} - -// Set applies the tag to an existing Span. -func (t Tag) Set(s Span) { - s.SetTag(t.Key, t.Value) -} diff --git a/vendor/github.com/pborman/uuid/CONTRIBUTING.md b/vendor/github.com/pborman/uuid/CONTRIBUTING.md deleted file mode 100644 index 04fdf09f136b..000000000000 --- a/vendor/github.com/pborman/uuid/CONTRIBUTING.md +++ /dev/null @@ -1,10 +0,0 @@ -# How to contribute - -We definitely welcome patches and contribution to this project! - -### Legal requirements - -In order to protect both you and ourselves, you will need to sign the -[Contributor License Agreement](https://cla.developers.google.com/clas). - -You may have already signed it for other Google projects. diff --git a/vendor/github.com/pborman/uuid/CONTRIBUTORS b/vendor/github.com/pborman/uuid/CONTRIBUTORS deleted file mode 100644 index b382a04eda9d..000000000000 --- a/vendor/github.com/pborman/uuid/CONTRIBUTORS +++ /dev/null @@ -1 +0,0 @@ -Paul Borman diff --git a/vendor/github.com/pborman/uuid/LICENSE b/vendor/github.com/pborman/uuid/LICENSE deleted file mode 100644 index 5dc68268d900..000000000000 --- a/vendor/github.com/pborman/uuid/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009,2014 Google Inc. 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. diff --git a/vendor/github.com/pborman/uuid/README.md b/vendor/github.com/pborman/uuid/README.md deleted file mode 100644 index b0396b2747c3..000000000000 --- a/vendor/github.com/pborman/uuid/README.md +++ /dev/null @@ -1,13 +0,0 @@ -This project was automatically exported from code.google.com/p/go-uuid - -# uuid ![build status](https://travis-ci.org/pborman/uuid.svg?branch=master) -The uuid package generates and inspects UUIDs based on [RFC 4122](http://tools.ietf.org/html/rfc4122) and DCE 1.1: Authentication and Security Services. - -###### Install -`go get github.com/pborman/uuid` - -###### Documentation -[![GoDoc](https://godoc.org/github.com/pborman/uuid?status.svg)](http://godoc.org/github.com/pborman/uuid) - -Full `go doc` style documentation for the package can be viewed online without installing this package by using the GoDoc site here: -http://godoc.org/github.com/pborman/uuid diff --git a/vendor/github.com/pborman/uuid/dce.go b/vendor/github.com/pborman/uuid/dce.go deleted file mode 100644 index 50a0f2d09924..000000000000 --- a/vendor/github.com/pborman/uuid/dce.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package uuid - -import ( - "encoding/binary" - "fmt" - "os" -) - -// A Domain represents a Version 2 domain -type Domain byte - -// Domain constants for DCE Security (Version 2) UUIDs. -const ( - Person = Domain(0) - Group = Domain(1) - Org = Domain(2) -) - -// NewDCESecurity returns a DCE Security (Version 2) UUID. -// -// The domain should be one of Person, Group or Org. -// On a POSIX system the id should be the users UID for the Person -// domain and the users GID for the Group. The meaning of id for -// the domain Org or on non-POSIX systems is site defined. -// -// For a given domain/id pair the same token may be returned for up to -// 7 minutes and 10 seconds. -func NewDCESecurity(domain Domain, id uint32) UUID { - uuid := NewUUID() - if uuid != nil { - uuid[6] = (uuid[6] & 0x0f) | 0x20 // Version 2 - uuid[9] = byte(domain) - binary.BigEndian.PutUint32(uuid[0:], id) - } - return uuid -} - -// NewDCEPerson returns a DCE Security (Version 2) UUID in the person -// domain with the id returned by os.Getuid. -// -// NewDCEPerson(Person, uint32(os.Getuid())) -func NewDCEPerson() UUID { - return NewDCESecurity(Person, uint32(os.Getuid())) -} - -// NewDCEGroup returns a DCE Security (Version 2) UUID in the group -// domain with the id returned by os.Getgid. -// -// NewDCEGroup(Group, uint32(os.Getgid())) -func NewDCEGroup() UUID { - return NewDCESecurity(Group, uint32(os.Getgid())) -} - -// Domain returns the domain for a Version 2 UUID or false. -func (uuid UUID) Domain() (Domain, bool) { - if v, _ := uuid.Version(); v != 2 { - return 0, false - } - return Domain(uuid[9]), true -} - -// Id returns the id for a Version 2 UUID or false. -func (uuid UUID) Id() (uint32, bool) { - if v, _ := uuid.Version(); v != 2 { - return 0, false - } - return binary.BigEndian.Uint32(uuid[0:4]), true -} - -func (d Domain) String() string { - switch d { - case Person: - return "Person" - case Group: - return "Group" - case Org: - return "Org" - } - return fmt.Sprintf("Domain%d", int(d)) -} diff --git a/vendor/github.com/pborman/uuid/doc.go b/vendor/github.com/pborman/uuid/doc.go deleted file mode 100644 index d8bd013e6890..000000000000 --- a/vendor/github.com/pborman/uuid/doc.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// The uuid package generates and inspects UUIDs. -// -// UUIDs are based on RFC 4122 and DCE 1.1: Authentication and Security Services. -package uuid diff --git a/vendor/github.com/pborman/uuid/hash.go b/vendor/github.com/pborman/uuid/hash.go deleted file mode 100644 index a0420c1ef3a9..000000000000 --- a/vendor/github.com/pborman/uuid/hash.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package uuid - -import ( - "crypto/md5" - "crypto/sha1" - "hash" -) - -// Well known Name Space IDs and UUIDs -var ( - NameSpace_DNS = Parse("6ba7b810-9dad-11d1-80b4-00c04fd430c8") - NameSpace_URL = Parse("6ba7b811-9dad-11d1-80b4-00c04fd430c8") - NameSpace_OID = Parse("6ba7b812-9dad-11d1-80b4-00c04fd430c8") - NameSpace_X500 = Parse("6ba7b814-9dad-11d1-80b4-00c04fd430c8") - NIL = Parse("00000000-0000-0000-0000-000000000000") -) - -// NewHash returns a new UUID derived from the hash of space concatenated with -// data generated by h. The hash should be at least 16 byte in length. The -// first 16 bytes of the hash are used to form the UUID. The version of the -// UUID will be the lower 4 bits of version. NewHash is used to implement -// NewMD5 and NewSHA1. -func NewHash(h hash.Hash, space UUID, data []byte, version int) UUID { - h.Reset() - h.Write(space) - h.Write([]byte(data)) - s := h.Sum(nil) - uuid := make([]byte, 16) - copy(uuid, s) - uuid[6] = (uuid[6] & 0x0f) | uint8((version&0xf)<<4) - uuid[8] = (uuid[8] & 0x3f) | 0x80 // RFC 4122 variant - return uuid -} - -// NewMD5 returns a new MD5 (Version 3) UUID based on the -// supplied name space and data. -// -// NewHash(md5.New(), space, data, 3) -func NewMD5(space UUID, data []byte) UUID { - return NewHash(md5.New(), space, data, 3) -} - -// NewSHA1 returns a new SHA1 (Version 5) UUID based on the -// supplied name space and data. -// -// NewHash(sha1.New(), space, data, 5) -func NewSHA1(space UUID, data []byte) UUID { - return NewHash(sha1.New(), space, data, 5) -} diff --git a/vendor/github.com/pborman/uuid/marshal.go b/vendor/github.com/pborman/uuid/marshal.go deleted file mode 100644 index 6621dd54bebd..000000000000 --- a/vendor/github.com/pborman/uuid/marshal.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2016 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package uuid - -import ( - "errors" - "fmt" -) - -// MarshalText implements encoding.TextMarshaler. -func (u UUID) MarshalText() ([]byte, error) { - if len(u) != 16 { - return nil, nil - } - var js [36]byte - encodeHex(js[:], u) - return js[:], nil -} - -// UnmarshalText implements encoding.TextUnmarshaler. -func (u *UUID) UnmarshalText(data []byte) error { - if len(data) == 0 { - return nil - } - id := Parse(string(data)) - if id == nil { - return errors.New("invalid UUID") - } - *u = id - return nil -} - -// MarshalBinary implements encoding.BinaryMarshaler. -func (u UUID) MarshalBinary() ([]byte, error) { - return u[:], nil -} - -// UnmarshalBinary implements encoding.BinaryUnmarshaler. -func (u *UUID) UnmarshalBinary(data []byte) error { - if len(data) == 0 { - return nil - } - if len(data) != 16 { - return fmt.Errorf("invalid UUID (got %d bytes)", len(data)) - } - var id [16]byte - copy(id[:], data) - *u = id[:] - return nil -} - -// MarshalText implements encoding.TextMarshaler. -func (u Array) MarshalText() ([]byte, error) { - var js [36]byte - encodeHex(js[:], u[:]) - return js[:], nil -} - -// UnmarshalText implements encoding.TextUnmarshaler. -func (u *Array) UnmarshalText(data []byte) error { - id := Parse(string(data)) - if id == nil { - return errors.New("invalid UUID") - } - *u = id.Array() - return nil -} - -// MarshalBinary implements encoding.BinaryMarshaler. -func (u Array) MarshalBinary() ([]byte, error) { - return u[:], nil -} - -// UnmarshalBinary implements encoding.BinaryUnmarshaler. -func (u *Array) UnmarshalBinary(data []byte) error { - if len(data) != 16 { - return fmt.Errorf("invalid UUID (got %d bytes)", len(data)) - } - copy(u[:], data) - return nil -} diff --git a/vendor/github.com/pborman/uuid/node.go b/vendor/github.com/pborman/uuid/node.go deleted file mode 100644 index 42d60da8f10f..000000000000 --- a/vendor/github.com/pborman/uuid/node.go +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package uuid - -import ( - "net" - "sync" -) - -var ( - nodeMu sync.Mutex - interfaces []net.Interface // cached list of interfaces - ifname string // name of interface being used - nodeID []byte // hardware for version 1 UUIDs -) - -// NodeInterface returns the name of the interface from which the NodeID was -// derived. The interface "user" is returned if the NodeID was set by -// SetNodeID. -func NodeInterface() string { - defer nodeMu.Unlock() - nodeMu.Lock() - return ifname -} - -// SetNodeInterface selects the hardware address to be used for Version 1 UUIDs. -// If name is "" then the first usable interface found will be used or a random -// Node ID will be generated. If a named interface cannot be found then false -// is returned. -// -// SetNodeInterface never fails when name is "". -func SetNodeInterface(name string) bool { - defer nodeMu.Unlock() - nodeMu.Lock() - return setNodeInterface(name) -} - -func setNodeInterface(name string) bool { - if interfaces == nil { - var err error - interfaces, err = net.Interfaces() - if err != nil && name != "" { - return false - } - } - - for _, ifs := range interfaces { - if len(ifs.HardwareAddr) >= 6 && (name == "" || name == ifs.Name) { - if setNodeID(ifs.HardwareAddr) { - ifname = ifs.Name - return true - } - } - } - - // We found no interfaces with a valid hardware address. If name - // does not specify a specific interface generate a random Node ID - // (section 4.1.6) - if name == "" { - if nodeID == nil { - nodeID = make([]byte, 6) - } - randomBits(nodeID) - return true - } - return false -} - -// NodeID returns a slice of a copy of the current Node ID, setting the Node ID -// if not already set. -func NodeID() []byte { - defer nodeMu.Unlock() - nodeMu.Lock() - if nodeID == nil { - setNodeInterface("") - } - nid := make([]byte, 6) - copy(nid, nodeID) - return nid -} - -// SetNodeID sets the Node ID to be used for Version 1 UUIDs. The first 6 bytes -// of id are used. If id is less than 6 bytes then false is returned and the -// Node ID is not set. -func SetNodeID(id []byte) bool { - defer nodeMu.Unlock() - nodeMu.Lock() - if setNodeID(id) { - ifname = "user" - return true - } - return false -} - -func setNodeID(id []byte) bool { - if len(id) < 6 { - return false - } - if nodeID == nil { - nodeID = make([]byte, 6) - } - copy(nodeID, id) - return true -} - -// NodeID returns the 6 byte node id encoded in uuid. It returns nil if uuid is -// not valid. The NodeID is only well defined for version 1 and 2 UUIDs. -func (uuid UUID) NodeID() []byte { - if len(uuid) != 16 { - return nil - } - node := make([]byte, 6) - copy(node, uuid[10:]) - return node -} diff --git a/vendor/github.com/pborman/uuid/sql.go b/vendor/github.com/pborman/uuid/sql.go deleted file mode 100644 index d015bfd13278..000000000000 --- a/vendor/github.com/pborman/uuid/sql.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2015 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package uuid - -import ( - "database/sql/driver" - "errors" - "fmt" -) - -// Scan implements sql.Scanner so UUIDs can be read from databases transparently -// Currently, database types that map to string and []byte are supported. Please -// consult database-specific driver documentation for matching types. -func (uuid *UUID) Scan(src interface{}) error { - switch src.(type) { - case string: - // if an empty UUID comes from a table, we return a null UUID - if src.(string) == "" { - return nil - } - - // see uuid.Parse for required string format - parsed := Parse(src.(string)) - - if parsed == nil { - return errors.New("Scan: invalid UUID format") - } - - *uuid = parsed - case []byte: - b := src.([]byte) - - // if an empty UUID comes from a table, we return a null UUID - if len(b) == 0 { - return nil - } - - // assumes a simple slice of bytes if 16 bytes - // otherwise attempts to parse - if len(b) == 16 { - *uuid = UUID(b) - } else { - u := Parse(string(b)) - - if u == nil { - return errors.New("Scan: invalid UUID format") - } - - *uuid = u - } - - default: - return fmt.Errorf("Scan: unable to scan type %T into UUID", src) - } - - return nil -} - -// Value implements sql.Valuer so that UUIDs can be written to databases -// transparently. Currently, UUIDs map to strings. Please consult -// database-specific driver documentation for matching types. -func (uuid UUID) Value() (driver.Value, error) { - return uuid.String(), nil -} diff --git a/vendor/github.com/pborman/uuid/time.go b/vendor/github.com/pborman/uuid/time.go deleted file mode 100644 index eedf242194b2..000000000000 --- a/vendor/github.com/pborman/uuid/time.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright 2014 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package uuid - -import ( - "encoding/binary" - "sync" - "time" -) - -// A Time represents a time as the number of 100's of nanoseconds since 15 Oct -// 1582. -type Time int64 - -const ( - lillian = 2299160 // Julian day of 15 Oct 1582 - unix = 2440587 // Julian day of 1 Jan 1970 - epoch = unix - lillian // Days between epochs - g1582 = epoch * 86400 // seconds between epochs - g1582ns100 = g1582 * 10000000 // 100s of a nanoseconds between epochs -) - -var ( - timeMu sync.Mutex - lasttime uint64 // last time we returned - clock_seq uint16 // clock sequence for this run - - timeNow = time.Now // for testing -) - -// UnixTime converts t the number of seconds and nanoseconds using the Unix -// epoch of 1 Jan 1970. -func (t Time) UnixTime() (sec, nsec int64) { - sec = int64(t - g1582ns100) - nsec = (sec % 10000000) * 100 - sec /= 10000000 - return sec, nsec -} - -// GetTime returns the current Time (100s of nanoseconds since 15 Oct 1582) and -// clock sequence as well as adjusting the clock sequence as needed. An error -// is returned if the current time cannot be determined. -func GetTime() (Time, uint16, error) { - defer timeMu.Unlock() - timeMu.Lock() - return getTime() -} - -func getTime() (Time, uint16, error) { - t := timeNow() - - // If we don't have a clock sequence already, set one. - if clock_seq == 0 { - setClockSequence(-1) - } - now := uint64(t.UnixNano()/100) + g1582ns100 - - // If time has gone backwards with this clock sequence then we - // increment the clock sequence - if now <= lasttime { - clock_seq = ((clock_seq + 1) & 0x3fff) | 0x8000 - } - lasttime = now - return Time(now), clock_seq, nil -} - -// ClockSequence returns the current clock sequence, generating one if not -// already set. The clock sequence is only used for Version 1 UUIDs. -// -// The uuid package does not use global static storage for the clock sequence or -// the last time a UUID was generated. Unless SetClockSequence a new random -// clock sequence is generated the first time a clock sequence is requested by -// ClockSequence, GetTime, or NewUUID. (section 4.2.1.1) sequence is generated -// for -func ClockSequence() int { - defer timeMu.Unlock() - timeMu.Lock() - return clockSequence() -} - -func clockSequence() int { - if clock_seq == 0 { - setClockSequence(-1) - } - return int(clock_seq & 0x3fff) -} - -// SetClockSeq sets the clock sequence to the lower 14 bits of seq. Setting to -// -1 causes a new sequence to be generated. -func SetClockSequence(seq int) { - defer timeMu.Unlock() - timeMu.Lock() - setClockSequence(seq) -} - -func setClockSequence(seq int) { - if seq == -1 { - var b [2]byte - randomBits(b[:]) // clock sequence - seq = int(b[0])<<8 | int(b[1]) - } - old_seq := clock_seq - clock_seq = uint16(seq&0x3fff) | 0x8000 // Set our variant - if old_seq != clock_seq { - lasttime = 0 - } -} - -// Time returns the time in 100s of nanoseconds since 15 Oct 1582 encoded in -// uuid. It returns false if uuid is not valid. The time is only well defined -// for version 1 and 2 UUIDs. -func (uuid UUID) Time() (Time, bool) { - if len(uuid) != 16 { - return 0, false - } - time := int64(binary.BigEndian.Uint32(uuid[0:4])) - time |= int64(binary.BigEndian.Uint16(uuid[4:6])) << 32 - time |= int64(binary.BigEndian.Uint16(uuid[6:8])&0xfff) << 48 - return Time(time), true -} - -// ClockSequence returns the clock sequence encoded in uuid. It returns false -// if uuid is not valid. The clock sequence is only well defined for version 1 -// and 2 UUIDs. -func (uuid UUID) ClockSequence() (int, bool) { - if len(uuid) != 16 { - return 0, false - } - return int(binary.BigEndian.Uint16(uuid[8:10])) & 0x3fff, true -} diff --git a/vendor/github.com/pborman/uuid/util.go b/vendor/github.com/pborman/uuid/util.go deleted file mode 100644 index fc8e052c7a6b..000000000000 --- a/vendor/github.com/pborman/uuid/util.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package uuid - -import ( - "io" -) - -// randomBits completely fills slice b with random data. -func randomBits(b []byte) { - if _, err := io.ReadFull(rander, b); err != nil { - panic(err.Error()) // rand should never fail - } -} - -// xvalues returns the value of a byte as a hexadecimal digit or 255. -var xvalues = [256]byte{ - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 255, 255, 255, 255, 255, 255, - 255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 10, 11, 12, 13, 14, 15, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, -} - -// xtob converts the the first two hex bytes of x into a byte. -func xtob(x string) (byte, bool) { - b1 := xvalues[x[0]] - b2 := xvalues[x[1]] - return (b1 << 4) | b2, b1 != 255 && b2 != 255 -} diff --git a/vendor/github.com/pborman/uuid/uuid.go b/vendor/github.com/pborman/uuid/uuid.go deleted file mode 100644 index 7c643cf0a38e..000000000000 --- a/vendor/github.com/pborman/uuid/uuid.go +++ /dev/null @@ -1,201 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package uuid - -import ( - "bytes" - "crypto/rand" - "encoding/hex" - "fmt" - "io" - "strings" -) - -// Array is a pass-by-value UUID that can be used as an effecient key in a map. -type Array [16]byte - -// UUID converts uuid into a slice. -func (uuid Array) UUID() UUID { - return uuid[:] -} - -// String returns the string representation of uuid, -// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. -func (uuid Array) String() string { - return uuid.UUID().String() -} - -// A UUID is a 128 bit (16 byte) Universal Unique IDentifier as defined in RFC -// 4122. -type UUID []byte - -// A Version represents a UUIDs version. -type Version byte - -// A Variant represents a UUIDs variant. -type Variant byte - -// Constants returned by Variant. -const ( - Invalid = Variant(iota) // Invalid UUID - RFC4122 // The variant specified in RFC4122 - Reserved // Reserved, NCS backward compatibility. - Microsoft // Reserved, Microsoft Corporation backward compatibility. - Future // Reserved for future definition. -) - -var rander = rand.Reader // random function - -// New returns a new random (version 4) UUID as a string. It is a convenience -// function for NewRandom().String(). -func New() string { - return NewRandom().String() -} - -// Parse decodes s into a UUID or returns nil. Both the UUID form of -// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx and -// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx are decoded. -func Parse(s string) UUID { - if len(s) == 36+9 { - if strings.ToLower(s[:9]) != "urn:uuid:" { - return nil - } - s = s[9:] - } else if len(s) != 36 { - return nil - } - if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { - return nil - } - var uuid [16]byte - for i, x := range [16]int{ - 0, 2, 4, 6, - 9, 11, - 14, 16, - 19, 21, - 24, 26, 28, 30, 32, 34} { - if v, ok := xtob(s[x:]); !ok { - return nil - } else { - uuid[i] = v - } - } - return uuid[:] -} - -// Equal returns true if uuid1 and uuid2 are equal. -func Equal(uuid1, uuid2 UUID) bool { - return bytes.Equal(uuid1, uuid2) -} - -// Array returns an array representation of uuid that can be used as a map key. -// Array panics if uuid is not valid. -func (uuid UUID) Array() Array { - if len(uuid) != 16 { - panic("invalid uuid") - } - var a Array - copy(a[:], uuid) - return a -} - -// String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -// , or "" if uuid is invalid. -func (uuid UUID) String() string { - if len(uuid) != 16 { - return "" - } - var buf [36]byte - encodeHex(buf[:], uuid) - return string(buf[:]) -} - -// URN returns the RFC 2141 URN form of uuid, -// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, or "" if uuid is invalid. -func (uuid UUID) URN() string { - if len(uuid) != 16 { - return "" - } - var buf [36 + 9]byte - copy(buf[:], "urn:uuid:") - encodeHex(buf[9:], uuid) - return string(buf[:]) -} - -func encodeHex(dst []byte, uuid UUID) { - hex.Encode(dst[:], uuid[:4]) - dst[8] = '-' - hex.Encode(dst[9:13], uuid[4:6]) - dst[13] = '-' - hex.Encode(dst[14:18], uuid[6:8]) - dst[18] = '-' - hex.Encode(dst[19:23], uuid[8:10]) - dst[23] = '-' - hex.Encode(dst[24:], uuid[10:]) -} - -// Variant returns the variant encoded in uuid. It returns Invalid if -// uuid is invalid. -func (uuid UUID) Variant() Variant { - if len(uuid) != 16 { - return Invalid - } - switch { - case (uuid[8] & 0xc0) == 0x80: - return RFC4122 - case (uuid[8] & 0xe0) == 0xc0: - return Microsoft - case (uuid[8] & 0xe0) == 0xe0: - return Future - default: - return Reserved - } -} - -// Version returns the version of uuid. It returns false if uuid is not -// valid. -func (uuid UUID) Version() (Version, bool) { - if len(uuid) != 16 { - return 0, false - } - return Version(uuid[6] >> 4), true -} - -func (v Version) String() string { - if v > 15 { - return fmt.Sprintf("BAD_VERSION_%d", v) - } - return fmt.Sprintf("VERSION_%d", v) -} - -func (v Variant) String() string { - switch v { - case RFC4122: - return "RFC4122" - case Reserved: - return "Reserved" - case Microsoft: - return "Microsoft" - case Future: - return "Future" - case Invalid: - return "Invalid" - } - return fmt.Sprintf("BadVariant%d", int(v)) -} - -// SetRand sets the random number generator to r, which implements io.Reader. -// If r.Read returns an error when the package requests random data then -// a panic will be issued. -// -// Calling SetRand with nil sets the random number generator to the default -// generator. -func SetRand(r io.Reader) { - if r == nil { - rander = rand.Reader - return - } - rander = r -} diff --git a/vendor/github.com/pborman/uuid/version1.go b/vendor/github.com/pborman/uuid/version1.go deleted file mode 100644 index 0127eacfab8a..000000000000 --- a/vendor/github.com/pborman/uuid/version1.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package uuid - -import ( - "encoding/binary" -) - -// NewUUID returns a Version 1 UUID based on the current NodeID and clock -// sequence, and the current time. If the NodeID has not been set by SetNodeID -// or SetNodeInterface then it will be set automatically. If the NodeID cannot -// be set NewUUID returns nil. If clock sequence has not been set by -// SetClockSequence then it will be set automatically. If GetTime fails to -// return the current NewUUID returns nil. -func NewUUID() UUID { - if nodeID == nil { - SetNodeInterface("") - } - - now, seq, err := GetTime() - if err != nil { - return nil - } - - uuid := make([]byte, 16) - - time_low := uint32(now & 0xffffffff) - time_mid := uint16((now >> 32) & 0xffff) - time_hi := uint16((now >> 48) & 0x0fff) - time_hi |= 0x1000 // Version 1 - - binary.BigEndian.PutUint32(uuid[0:], time_low) - binary.BigEndian.PutUint16(uuid[4:], time_mid) - binary.BigEndian.PutUint16(uuid[6:], time_hi) - binary.BigEndian.PutUint16(uuid[8:], seq) - copy(uuid[10:], nodeID) - - return uuid -} diff --git a/vendor/github.com/pborman/uuid/version4.go b/vendor/github.com/pborman/uuid/version4.go deleted file mode 100644 index b3d4a368dd0e..000000000000 --- a/vendor/github.com/pborman/uuid/version4.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2011 Google Inc. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package uuid - -// Random returns a Random (Version 4) UUID or panics. -// -// The strength of the UUIDs is based on the strength of the crypto/rand -// package. -// -// A note about uniqueness derived from from the UUID Wikipedia entry: -// -// Randomly generated UUIDs have 122 random bits. One's annual risk of being -// hit by a meteorite is estimated to be one chance in 17 billion, that -// means the probability is about 0.00000000006 (6 × 10−11), -// equivalent to the odds of creating a few tens of trillions of UUIDs in a -// year and having one duplicate. -func NewRandom() UUID { - uuid := make([]byte, 16) - randomBits([]byte(uuid)) - uuid[6] = (uuid[6] & 0x0f) | 0x40 // Version 4 - uuid[8] = (uuid[8] & 0x3f) | 0x80 // Variant is 10 - return uuid -} diff --git a/vendor/github.com/peterh/liner/COPYING b/vendor/github.com/peterh/liner/COPYING deleted file mode 100644 index 9e8c9f20666c..000000000000 --- a/vendor/github.com/peterh/liner/COPYING +++ /dev/null @@ -1,21 +0,0 @@ -Copyright © 2012 Peter Harris - -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 (including the next -paragraph) 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/peterh/liner/README.md b/vendor/github.com/peterh/liner/README.md deleted file mode 100644 index 9148b249298e..000000000000 --- a/vendor/github.com/peterh/liner/README.md +++ /dev/null @@ -1,100 +0,0 @@ -Liner -===== - -Liner is a command line editor with history. It was inspired by linenoise; -everything Unix-like is a VT100 (or is trying very hard to be). If your -terminal is not pretending to be a VT100, change it. Liner also support -Windows. - -Liner is released under the X11 license (which is similar to the new BSD -license). - -Line Editing ------------- - -The following line editing commands are supported on platforms and terminals -that Liner supports: - -Keystroke | Action ---------- | ------ -Ctrl-A, Home | Move cursor to beginning of line -Ctrl-E, End | Move cursor to end of line -Ctrl-B, Left | Move cursor one character left -Ctrl-F, Right| Move cursor one character right -Ctrl-Left, Alt-B | Move cursor to previous word -Ctrl-Right, Alt-F | Move cursor to next word -Ctrl-D, Del | (if line is *not* empty) Delete character under cursor -Ctrl-D | (if line *is* empty) End of File - usually quits application -Ctrl-C | Reset input (create new empty prompt) -Ctrl-L | Clear screen (line is unmodified) -Ctrl-T | Transpose previous character with current character -Ctrl-H, BackSpace | Delete character before cursor -Ctrl-W | Delete word leading up to cursor -Ctrl-K | Delete from cursor to end of line -Ctrl-U | Delete from start of line to cursor -Ctrl-P, Up | Previous match from history -Ctrl-N, Down | Next match from history -Ctrl-R | Reverse Search history (Ctrl-S forward, Ctrl-G cancel) -Ctrl-Y | Paste from Yank buffer (Alt-Y to paste next yank instead) -Tab | Next completion -Shift-Tab | (after Tab) Previous completion - -Getting started ------------------ - -```go -package main - -import ( - "log" - "os" - "path/filepath" - "strings" - - "github.com/peterh/liner" -) - -var ( - history_fn = filepath.Join(os.TempDir(), ".liner_example_history") - names = []string{"john", "james", "mary", "nancy"} -) - -func main() { - line := liner.NewLiner() - defer line.Close() - - line.SetCtrlCAborts(true) - - line.SetCompleter(func(line string) (c []string) { - for _, n := range names { - if strings.HasPrefix(n, strings.ToLower(line)) { - c = append(c, n) - } - } - return - }) - - if f, err := os.Open(history_fn); err == nil { - line.ReadHistory(f) - f.Close() - } - - if name, err := line.Prompt("What is your name? "); err == nil { - log.Print("Got: ", name) - line.AppendHistory(name) - } else if err == liner.ErrPromptAborted { - log.Print("Aborted") - } else { - log.Print("Error reading line: ", err) - } - - if f, err := os.Create(history_fn); err != nil { - log.Print("Error writing history file: ", err) - } else { - line.WriteHistory(f) - f.Close() - } -} -``` - -For documentation, see http://godoc.org/github.com/peterh/liner diff --git a/vendor/github.com/peterh/liner/bsdinput.go b/vendor/github.com/peterh/liner/bsdinput.go deleted file mode 100644 index 35933982f184..000000000000 --- a/vendor/github.com/peterh/liner/bsdinput.go +++ /dev/null @@ -1,41 +0,0 @@ -// +build openbsd freebsd netbsd - -package liner - -import "syscall" - -const ( - getTermios = syscall.TIOCGETA - setTermios = syscall.TIOCSETA -) - -const ( - // Input flags - inpck = 0x010 - istrip = 0x020 - icrnl = 0x100 - ixon = 0x200 - - // Output flags - opost = 0x1 - - // Control flags - cs8 = 0x300 - - // Local flags - isig = 0x080 - icanon = 0x100 - iexten = 0x400 -) - -type termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]byte - Ispeed int32 - Ospeed int32 -} - -const cursorColumn = false diff --git a/vendor/github.com/peterh/liner/common.go b/vendor/github.com/peterh/liner/common.go deleted file mode 100644 index e16ecbc069ad..000000000000 --- a/vendor/github.com/peterh/liner/common.go +++ /dev/null @@ -1,255 +0,0 @@ -/* -Package liner implements a simple command line editor, inspired by linenoise -(https://github.com/antirez/linenoise/). This package supports WIN32 in -addition to the xterm codes supported by everything else. -*/ -package liner - -import ( - "bufio" - "container/ring" - "errors" - "fmt" - "io" - "strings" - "sync" - "unicode/utf8" -) - -type commonState struct { - terminalSupported bool - outputRedirected bool - inputRedirected bool - history []string - historyMutex sync.RWMutex - completer WordCompleter - columns int - killRing *ring.Ring - ctrlCAborts bool - r *bufio.Reader - tabStyle TabStyle - multiLineMode bool - cursorRows int - maxRows int - shouldRestart ShouldRestart - needRefresh bool -} - -// TabStyle is used to select how tab completions are displayed. -type TabStyle int - -// Two tab styles are currently available: -// -// TabCircular cycles through each completion item and displays it directly on -// the prompt -// -// TabPrints prints the list of completion items to the screen after a second -// tab key is pressed. This behaves similar to GNU readline and BASH (which -// uses readline) -const ( - TabCircular TabStyle = iota - TabPrints -) - -// ErrPromptAborted is returned from Prompt or PasswordPrompt when the user presses Ctrl-C -// if SetCtrlCAborts(true) has been called on the State -var ErrPromptAborted = errors.New("prompt aborted") - -// ErrNotTerminalOutput is returned from Prompt or PasswordPrompt if the -// platform is normally supported, but stdout has been redirected -var ErrNotTerminalOutput = errors.New("standard output is not a terminal") - -// ErrInvalidPrompt is returned from Prompt or PasswordPrompt if the -// prompt contains any unprintable runes (including substrings that could -// 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 - -// HistoryLimit is the maximum number of entries saved in the scrollback history. -const HistoryLimit = 1000 - -// ReadHistory reads scrollback history from r. Returns the number of lines -// read, and any read error (except io.EOF). -func (s *State) ReadHistory(r io.Reader) (num int, err error) { - s.historyMutex.Lock() - defer s.historyMutex.Unlock() - - in := bufio.NewReader(r) - num = 0 - for { - line, part, err := in.ReadLine() - if err == io.EOF { - break - } - if err != nil { - return num, err - } - if part { - return num, fmt.Errorf("line %d is too long", num+1) - } - if !utf8.Valid(line) { - return num, fmt.Errorf("invalid string at line %d", num+1) - } - num++ - s.history = append(s.history, string(line)) - if len(s.history) > HistoryLimit { - s.history = s.history[1:] - } - } - return num, nil -} - -// WriteHistory writes scrollback history to w. Returns the number of lines -// successfully written, and any write error. -// -// Unlike the rest of liner's API, WriteHistory is safe to call -// from another goroutine while Prompt is in progress. -// This exception is to facilitate the saving of the history buffer -// during an unexpected exit (for example, due to Ctrl-C being invoked) -func (s *State) WriteHistory(w io.Writer) (num int, err error) { - s.historyMutex.RLock() - defer s.historyMutex.RUnlock() - - for _, item := range s.history { - _, err := fmt.Fprintln(w, item) - if err != nil { - return num, err - } - num++ - } - return num, nil -} - -// AppendHistory appends an entry to the scrollback history. AppendHistory -// should be called iff Prompt returns a valid command. -func (s *State) AppendHistory(item string) { - s.historyMutex.Lock() - defer s.historyMutex.Unlock() - - if len(s.history) > 0 { - if item == s.history[len(s.history)-1] { - return - } - } - s.history = append(s.history, item) - if len(s.history) > HistoryLimit { - s.history = s.history[1:] - } -} - -// ClearHistory clears the scroollback history. -func (s *State) ClearHistory() { - s.historyMutex.Lock() - defer s.historyMutex.Unlock() - s.history = nil -} - -// Returns the history lines starting with prefix -func (s *State) getHistoryByPrefix(prefix string) (ph []string) { - for _, h := range s.history { - if strings.HasPrefix(h, prefix) { - ph = append(ph, h) - } - } - return -} - -// Returns the history lines matching the intelligent search -func (s *State) getHistoryByPattern(pattern string) (ph []string, pos []int) { - if pattern == "" { - return - } - for _, h := range s.history { - if i := strings.Index(h, pattern); i >= 0 { - ph = append(ph, h) - pos = append(pos, i) - } - } - return -} - -// Completer takes the currently edited line content at the left of the cursor -// and returns a list of completion candidates. -// If the line is "Hello, wo!!!" and the cursor is before the first '!', "Hello, wo" is passed -// to the completer which may return {"Hello, world", "Hello, Word"} to have "Hello, world!!!". -type Completer func(line string) []string - -// WordCompleter takes the currently edited line with the cursor position and -// returns the completion candidates for the partial word to be completed. -// If the line is "Hello, wo!!!" and the cursor is before the first '!', ("Hello, wo!!!", 9) is passed -// to the completer which may returns ("Hello, ", {"world", "Word"}, "!!!") to have "Hello, world!!!". -type WordCompleter func(line string, pos int) (head string, completions []string, tail string) - -// SetCompleter sets the completion function that Liner will call to -// fetch completion candidates when the user presses tab. -func (s *State) SetCompleter(f Completer) { - if f == nil { - s.completer = nil - return - } - s.completer = func(line string, pos int) (string, []string, string) { - return "", f(string([]rune(line)[:pos])), string([]rune(line)[pos:]) - } -} - -// SetWordCompleter sets the completion function that Liner will call to -// fetch completion candidates when the user presses tab. -func (s *State) SetWordCompleter(f WordCompleter) { - s.completer = f -} - -// SetTabCompletionStyle sets the behvavior when the Tab key is pressed -// for auto-completion. TabCircular is the default behavior and cycles -// through the list of candidates at the prompt. TabPrints will print -// the available completion candidates to the screen similar to BASH -// and GNU Readline -func (s *State) SetTabCompletionStyle(tabStyle TabStyle) { - s.tabStyle = tabStyle -} - -// ModeApplier is the interface that wraps a representation of the terminal -// mode. ApplyMode sets the terminal to this mode. -type ModeApplier interface { - ApplyMode() error -} - -// SetCtrlCAborts sets whether Prompt on a supported terminal will return an -// ErrPromptAborted when Ctrl-C is pressed. The default is false (will not -// return when Ctrl-C is pressed). Unsupported terminals typically raise SIGINT -// (and Prompt does not return) regardless of the value passed to SetCtrlCAborts. -func (s *State) SetCtrlCAborts(aborts bool) { - s.ctrlCAborts = aborts -} - -// SetMultiLineMode sets whether line is auto-wrapped. The default is false (single line). -func (s *State) SetMultiLineMode(mlmode bool) { - s.multiLineMode = mlmode -} - -// ShouldRestart is passed the error generated by readNext and returns true if -// the the read should be restarted or false if the error should be returned. -type ShouldRestart func(err error) bool - -// SetShouldRestart sets the restart function that Liner will call to determine -// whether to retry the call to, or return the error returned by, readNext. -func (s *State) SetShouldRestart(f ShouldRestart) { - s.shouldRestart = f -} - -func (s *State) promptUnsupported(p string) (string, error) { - if !s.inputRedirected || !s.terminalSupported { - fmt.Print(p) - } - linebuf, _, err := s.r.ReadLine() - if err != nil { - return "", err - } - return string(linebuf), nil -} diff --git a/vendor/github.com/peterh/liner/fallbackinput.go b/vendor/github.com/peterh/liner/fallbackinput.go deleted file mode 100644 index d9eb79d9e055..000000000000 --- a/vendor/github.com/peterh/liner/fallbackinput.go +++ /dev/null @@ -1,57 +0,0 @@ -// +build !windows,!linux,!darwin,!openbsd,!freebsd,!netbsd - -package liner - -import ( - "bufio" - "errors" - "os" -) - -// State represents an open terminal -type State struct { - commonState -} - -// Prompt displays p, and then waits for user input. Prompt does not support -// line editing on this operating system. -func (s *State) Prompt(p string) (string, error) { - return s.promptUnsupported(p) -} - -// PasswordPrompt is not supported in this OS. -func (s *State) PasswordPrompt(p string) (string, error) { - return "", errors.New("liner: function not supported in this terminal") -} - -// NewLiner initializes a new *State -// -// Note that this operating system uses a fallback mode without line -// editing. Patches welcome. -func NewLiner() *State { - var s State - s.r = bufio.NewReader(os.Stdin) - return &s -} - -// Close returns the terminal to its previous mode -func (s *State) Close() error { - return nil -} - -// TerminalSupported returns false because line editing is not -// supported on this platform. -func TerminalSupported() bool { - return false -} - -type noopMode struct{} - -func (n noopMode) ApplyMode() error { - return nil -} - -// TerminalMode returns a noop InputModeSetter on this platform. -func TerminalMode() (ModeApplier, error) { - return noopMode{}, nil -} diff --git a/vendor/github.com/peterh/liner/input.go b/vendor/github.com/peterh/liner/input.go deleted file mode 100644 index 95dd5d14357c..000000000000 --- a/vendor/github.com/peterh/liner/input.go +++ /dev/null @@ -1,364 +0,0 @@ -// +build linux darwin openbsd freebsd netbsd - -package liner - -import ( - "bufio" - "errors" - "os" - "os/signal" - "strconv" - "strings" - "syscall" - "time" -) - -type nexter struct { - r rune - err error -} - -// State represents an open terminal -type State struct { - commonState - origMode termios - defaultMode termios - next <-chan nexter - winch chan os.Signal - pending []rune - useCHA bool -} - -// NewLiner initializes a new *State, and sets the terminal into raw mode. To -// restore the terminal to its previous state, call State.Close(). -func NewLiner() *State { - var s State - s.r = bufio.NewReader(os.Stdin) - - s.terminalSupported = TerminalSupported() - if m, err := TerminalMode(); err == nil { - s.origMode = *m.(*termios) - } else { - s.inputRedirected = true - } - if _, err := getMode(syscall.Stdout); err != 0 { - s.outputRedirected = true - } - if s.inputRedirected && s.outputRedirected { - s.terminalSupported = false - } - if s.terminalSupported && !s.inputRedirected && !s.outputRedirected { - mode := s.origMode - mode.Iflag &^= icrnl | inpck | istrip | ixon - mode.Cflag |= cs8 - mode.Lflag &^= syscall.ECHO | icanon | iexten - mode.ApplyMode() - - winch := make(chan os.Signal, 1) - signal.Notify(winch, syscall.SIGWINCH) - s.winch = winch - - s.checkOutput() - } - - if !s.outputRedirected { - s.outputRedirected = !s.getColumns() - } - - return &s -} - -var errTimedOut = errors.New("timeout") - -func (s *State) startPrompt() { - if s.terminalSupported { - if m, err := TerminalMode(); err == nil { - s.defaultMode = *m.(*termios) - mode := s.defaultMode - mode.Lflag &^= isig - mode.ApplyMode() - } - } - s.restartPrompt() -} - -func (s *State) inputWaiting() bool { - return len(s.next) > 0 -} - -func (s *State) restartPrompt() { - next := make(chan nexter, 200) - go func() { - for { - var n nexter - n.r, _, n.err = s.r.ReadRune() - next <- n - // Shut down nexter loop when an end condition has been reached - if n.err != nil || n.r == '\n' || n.r == '\r' || n.r == ctrlC || n.r == ctrlD { - close(next) - return - } - } - }() - s.next = next -} - -func (s *State) stopPrompt() { - if s.terminalSupported { - s.defaultMode.ApplyMode() - } -} - -func (s *State) nextPending(timeout <-chan time.Time) (rune, error) { - select { - case thing, ok := <-s.next: - if !ok { - return 0, ErrInternal - } - if thing.err != nil { - return 0, thing.err - } - s.pending = append(s.pending, thing.r) - return thing.r, nil - case <-timeout: - rv := s.pending[0] - s.pending = s.pending[1:] - return rv, errTimedOut - } -} - -func (s *State) readNext() (interface{}, error) { - if len(s.pending) > 0 { - rv := s.pending[0] - s.pending = s.pending[1:] - return rv, nil - } - var r rune - select { - case thing, ok := <-s.next: - if !ok { - return 0, ErrInternal - } - if thing.err != nil { - return nil, thing.err - } - r = thing.r - case <-s.winch: - s.getColumns() - return winch, nil - } - if r != esc { - return r, nil - } - s.pending = append(s.pending, r) - - // Wait at most 50 ms for the rest of the escape sequence - // If nothing else arrives, it was an actual press of the esc key - timeout := time.After(50 * time.Millisecond) - flag, err := s.nextPending(timeout) - if err != nil { - if err == errTimedOut { - return flag, nil - } - return unknown, err - } - - switch flag { - case '[': - code, err := s.nextPending(timeout) - if err != nil { - if err == errTimedOut { - return code, nil - } - return unknown, err - } - switch code { - case 'A': - s.pending = s.pending[:0] // escape code complete - return up, nil - case 'B': - s.pending = s.pending[:0] // escape code complete - return down, nil - case 'C': - s.pending = s.pending[:0] // escape code complete - return right, nil - case 'D': - s.pending = s.pending[:0] // escape code complete - return left, nil - case 'F': - s.pending = s.pending[:0] // escape code complete - return end, nil - case 'H': - s.pending = s.pending[:0] // escape code complete - return home, nil - case 'Z': - s.pending = s.pending[:0] // escape code complete - return shiftTab, nil - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - num := []rune{code} - for { - code, err := s.nextPending(timeout) - if err != nil { - if err == errTimedOut { - return code, nil - } - return nil, err - } - switch code { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - num = append(num, code) - case ';': - // Modifier code to follow - // This only supports Ctrl-left and Ctrl-right for now - x, _ := strconv.ParseInt(string(num), 10, 32) - if x != 1 { - // Can't be left or right - rv := s.pending[0] - s.pending = s.pending[1:] - return rv, nil - } - num = num[:0] - for { - code, err = s.nextPending(timeout) - if err != nil { - if err == errTimedOut { - rv := s.pending[0] - s.pending = s.pending[1:] - return rv, nil - } - return nil, err - } - switch code { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - num = append(num, code) - case 'C', 'D': - // right, left - mod, _ := strconv.ParseInt(string(num), 10, 32) - if mod != 5 { - // Not bare Ctrl - rv := s.pending[0] - s.pending = s.pending[1:] - return rv, nil - } - s.pending = s.pending[:0] // escape code complete - if code == 'C' { - return wordRight, nil - } - return wordLeft, nil - default: - // Not left or right - rv := s.pending[0] - s.pending = s.pending[1:] - return rv, nil - } - } - case '~': - s.pending = s.pending[:0] // escape code complete - x, _ := strconv.ParseInt(string(num), 10, 32) - switch x { - case 2: - return insert, nil - case 3: - return del, nil - case 5: - return pageUp, nil - case 6: - return pageDown, nil - case 7: - return home, nil - case 8: - return end, nil - case 15: - return f5, nil - case 17: - return f6, nil - case 18: - return f7, nil - case 19: - return f8, nil - case 20: - return f9, nil - case 21: - return f10, nil - case 23: - return f11, nil - case 24: - return f12, nil - default: - return unknown, nil - } - default: - // unrecognized escape code - rv := s.pending[0] - s.pending = s.pending[1:] - return rv, nil - } - } - } - - case 'O': - code, err := s.nextPending(timeout) - if err != nil { - if err == errTimedOut { - return code, nil - } - return nil, err - } - s.pending = s.pending[:0] // escape code complete - switch code { - case 'c': - return wordRight, nil - case 'd': - return wordLeft, nil - case 'H': - return home, nil - case 'F': - return end, nil - case 'P': - return f1, nil - case 'Q': - return f2, nil - case 'R': - return f3, nil - case 'S': - return f4, nil - default: - return unknown, nil - } - case 'b': - s.pending = s.pending[:0] // escape code complete - return altB, nil - case 'f': - s.pending = s.pending[:0] // escape code complete - return altF, nil - case 'y': - s.pending = s.pending[:0] // escape code complete - return altY, nil - default: - rv := s.pending[0] - s.pending = s.pending[1:] - return rv, nil - } - - // not reached - return r, nil -} - -// Close returns the terminal to its previous mode -func (s *State) Close() error { - signal.Stop(s.winch) - if !s.inputRedirected { - s.origMode.ApplyMode() - } - return nil -} - -// TerminalSupported returns true if the current terminal supports -// line editing features, and false if liner will use the 'dumb' -// fallback for input. -// Note that TerminalSupported does not check all factors that may -// cause liner to not fully support the terminal (such as stdin redirection) -func TerminalSupported() bool { - bad := map[string]bool{"": true, "dumb": true, "cons25": true} - return !bad[strings.ToLower(os.Getenv("TERM"))] -} diff --git a/vendor/github.com/peterh/liner/input_darwin.go b/vendor/github.com/peterh/liner/input_darwin.go deleted file mode 100644 index e98ab4a49fe2..000000000000 --- a/vendor/github.com/peterh/liner/input_darwin.go +++ /dev/null @@ -1,43 +0,0 @@ -// +build darwin - -package liner - -import "syscall" - -const ( - getTermios = syscall.TIOCGETA - setTermios = syscall.TIOCSETA -) - -const ( - // Input flags - inpck = 0x010 - istrip = 0x020 - icrnl = 0x100 - ixon = 0x200 - - // Output flags - opost = 0x1 - - // Control flags - cs8 = 0x300 - - // Local flags - isig = 0x080 - icanon = 0x100 - iexten = 0x400 -) - -type termios struct { - Iflag uintptr - Oflag uintptr - Cflag uintptr - Lflag uintptr - Cc [20]byte - Ispeed uintptr - Ospeed uintptr -} - -// Terminal.app needs a column for the cursor when the input line is at the -// bottom of the window. -const cursorColumn = true diff --git a/vendor/github.com/peterh/liner/input_linux.go b/vendor/github.com/peterh/liner/input_linux.go deleted file mode 100644 index 56ed185fadbd..000000000000 --- a/vendor/github.com/peterh/liner/input_linux.go +++ /dev/null @@ -1,28 +0,0 @@ -// +build linux - -package liner - -import "syscall" - -const ( - getTermios = syscall.TCGETS - setTermios = syscall.TCSETS -) - -const ( - icrnl = syscall.ICRNL - inpck = syscall.INPCK - istrip = syscall.ISTRIP - ixon = syscall.IXON - opost = syscall.OPOST - cs8 = syscall.CS8 - isig = syscall.ISIG - icanon = syscall.ICANON - iexten = syscall.IEXTEN -) - -type termios struct { - syscall.Termios -} - -const cursorColumn = false diff --git a/vendor/github.com/peterh/liner/input_windows.go b/vendor/github.com/peterh/liner/input_windows.go deleted file mode 100644 index a48eb0f1d2cd..000000000000 --- a/vendor/github.com/peterh/liner/input_windows.go +++ /dev/null @@ -1,339 +0,0 @@ -package liner - -import ( - "bufio" - "os" - "syscall" - "unsafe" -) - -var ( - kernel32 = syscall.NewLazyDLL("kernel32.dll") - - procGetStdHandle = kernel32.NewProc("GetStdHandle") - procReadConsoleInput = kernel32.NewProc("ReadConsoleInputW") - procGetNumberOfConsoleInputEvents = kernel32.NewProc("GetNumberOfConsoleInputEvents") - procGetConsoleMode = kernel32.NewProc("GetConsoleMode") - procSetConsoleMode = kernel32.NewProc("SetConsoleMode") - procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition") - procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo") - procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW") -) - -// These names are from the Win32 api, so they use underscores (contrary to -// what golint suggests) -const ( - std_input_handle = uint32(-10 & 0xFFFFFFFF) - std_output_handle = uint32(-11 & 0xFFFFFFFF) - std_error_handle = uint32(-12 & 0xFFFFFFFF) - invalid_handle_value = ^uintptr(0) -) - -type inputMode uint32 - -// State represents an open terminal -type State struct { - commonState - handle syscall.Handle - hOut syscall.Handle - origMode inputMode - defaultMode inputMode - key interface{} - repeat uint16 -} - -const ( - enableEchoInput = 0x4 - enableInsertMode = 0x20 - enableLineInput = 0x2 - enableMouseInput = 0x10 - enableProcessedInput = 0x1 - enableQuickEditMode = 0x40 - enableWindowInput = 0x8 -) - -// NewLiner initializes a new *State, and sets the terminal into raw mode. To -// restore the terminal to its previous state, call State.Close(). -func NewLiner() *State { - var s State - hIn, _, _ := procGetStdHandle.Call(uintptr(std_input_handle)) - s.handle = syscall.Handle(hIn) - hOut, _, _ := procGetStdHandle.Call(uintptr(std_output_handle)) - s.hOut = syscall.Handle(hOut) - - s.terminalSupported = true - if m, err := TerminalMode(); err == nil { - s.origMode = m.(inputMode) - mode := s.origMode - mode &^= enableEchoInput - mode &^= enableInsertMode - mode &^= enableLineInput - mode &^= enableMouseInput - mode |= enableWindowInput - mode.ApplyMode() - } else { - s.inputRedirected = true - s.r = bufio.NewReader(os.Stdin) - } - - s.getColumns() - s.outputRedirected = s.columns <= 0 - - return &s -} - -// These names are from the Win32 api, so they use underscores (contrary to -// what golint suggests) -const ( - focus_event = 0x0010 - key_event = 0x0001 - menu_event = 0x0008 - mouse_event = 0x0002 - window_buffer_size_event = 0x0004 -) - -type input_record struct { - eventType uint16 - pad uint16 - blob [16]byte -} - -type key_event_record struct { - KeyDown int32 - RepeatCount uint16 - VirtualKeyCode uint16 - VirtualScanCode uint16 - Char int16 - ControlKeyState uint32 -} - -// These names are from the Win32 api, so they use underscores (contrary to -// what golint suggests) -const ( - vk_tab = 0x09 - vk_prior = 0x21 - vk_next = 0x22 - vk_end = 0x23 - vk_home = 0x24 - vk_left = 0x25 - vk_up = 0x26 - vk_right = 0x27 - vk_down = 0x28 - vk_insert = 0x2d - vk_delete = 0x2e - vk_f1 = 0x70 - vk_f2 = 0x71 - vk_f3 = 0x72 - vk_f4 = 0x73 - vk_f5 = 0x74 - vk_f6 = 0x75 - vk_f7 = 0x76 - vk_f8 = 0x77 - vk_f9 = 0x78 - vk_f10 = 0x79 - vk_f11 = 0x7a - vk_f12 = 0x7b - bKey = 0x42 - fKey = 0x46 - yKey = 0x59 -) - -const ( - shiftPressed = 0x0010 - leftAltPressed = 0x0002 - leftCtrlPressed = 0x0008 - rightAltPressed = 0x0001 - rightCtrlPressed = 0x0004 - - modKeys = shiftPressed | leftAltPressed | rightAltPressed | leftCtrlPressed | rightCtrlPressed -) - -// inputWaiting only returns true if the next call to readNext will return immediately. -func (s *State) inputWaiting() bool { - var num uint32 - ok, _, _ := procGetNumberOfConsoleInputEvents.Call(uintptr(s.handle), uintptr(unsafe.Pointer(&num))) - if ok == 0 { - // call failed, so we cannot guarantee a non-blocking readNext - return false - } - - // during a "paste" input events are always an odd number, and - // the last one results in a blocking readNext, so return false - // when num is 1 or 0. - return num > 1 -} - -func (s *State) readNext() (interface{}, error) { - if s.repeat > 0 { - s.repeat-- - return s.key, nil - } - - var input input_record - pbuf := uintptr(unsafe.Pointer(&input)) - var rv uint32 - prv := uintptr(unsafe.Pointer(&rv)) - - for { - ok, _, err := procReadConsoleInput.Call(uintptr(s.handle), pbuf, 1, prv) - - if ok == 0 { - return nil, err - } - - if input.eventType == window_buffer_size_event { - xy := (*coord)(unsafe.Pointer(&input.blob[0])) - s.columns = int(xy.x) - if s.columns > 1 { - s.columns-- - } - return winch, nil - } - if input.eventType != key_event { - continue - } - ke := (*key_event_record)(unsafe.Pointer(&input.blob[0])) - if ke.KeyDown == 0 { - continue - } - - if ke.VirtualKeyCode == vk_tab && ke.ControlKeyState&modKeys == shiftPressed { - s.key = shiftTab - } else if ke.VirtualKeyCode == bKey && (ke.ControlKeyState&modKeys == leftAltPressed || - ke.ControlKeyState&modKeys == rightAltPressed) { - s.key = altB - } else if ke.VirtualKeyCode == fKey && (ke.ControlKeyState&modKeys == leftAltPressed || - ke.ControlKeyState&modKeys == rightAltPressed) { - s.key = altF - } else if ke.VirtualKeyCode == yKey && (ke.ControlKeyState&modKeys == leftAltPressed || - ke.ControlKeyState&modKeys == rightAltPressed) { - s.key = altY - } else if ke.Char > 0 { - s.key = rune(ke.Char) - } else { - switch ke.VirtualKeyCode { - case vk_prior: - s.key = pageUp - case vk_next: - s.key = pageDown - case vk_end: - s.key = end - case vk_home: - s.key = home - case vk_left: - s.key = left - if ke.ControlKeyState&(leftCtrlPressed|rightCtrlPressed) != 0 { - if ke.ControlKeyState&modKeys == ke.ControlKeyState&(leftCtrlPressed|rightCtrlPressed) { - s.key = wordLeft - } - } - case vk_right: - s.key = right - if ke.ControlKeyState&(leftCtrlPressed|rightCtrlPressed) != 0 { - if ke.ControlKeyState&modKeys == ke.ControlKeyState&(leftCtrlPressed|rightCtrlPressed) { - s.key = wordRight - } - } - case vk_up: - s.key = up - case vk_down: - s.key = down - case vk_insert: - s.key = insert - case vk_delete: - s.key = del - case vk_f1: - s.key = f1 - case vk_f2: - s.key = f2 - case vk_f3: - s.key = f3 - case vk_f4: - s.key = f4 - case vk_f5: - s.key = f5 - case vk_f6: - s.key = f6 - case vk_f7: - s.key = f7 - case vk_f8: - s.key = f8 - case vk_f9: - s.key = f9 - case vk_f10: - s.key = f10 - case vk_f11: - s.key = f11 - case vk_f12: - s.key = f12 - default: - // Eat modifier keys - // TODO: return Action(Unknown) if the key isn't a - // modifier. - continue - } - } - - if ke.RepeatCount > 1 { - s.repeat = ke.RepeatCount - 1 - } - return s.key, nil - } -} - -// Close returns the terminal to its previous mode -func (s *State) Close() error { - s.origMode.ApplyMode() - return nil -} - -func (s *State) startPrompt() { - if m, err := TerminalMode(); err == nil { - s.defaultMode = m.(inputMode) - mode := s.defaultMode - mode &^= enableProcessedInput - mode.ApplyMode() - } -} - -func (s *State) restartPrompt() { -} - -func (s *State) stopPrompt() { - s.defaultMode.ApplyMode() -} - -// TerminalSupported returns true because line editing is always -// supported on Windows. -func TerminalSupported() bool { - return true -} - -func (mode inputMode) ApplyMode() error { - hIn, _, err := procGetStdHandle.Call(uintptr(std_input_handle)) - if hIn == invalid_handle_value || hIn == 0 { - return err - } - ok, _, err := procSetConsoleMode.Call(hIn, uintptr(mode)) - if ok != 0 { - err = nil - } - return err -} - -// TerminalMode returns the current terminal input mode as an InputModeSetter. -// -// This function is provided for convenience, and should -// not be necessary for most users of liner. -func TerminalMode() (ModeApplier, error) { - var mode inputMode - hIn, _, err := procGetStdHandle.Call(uintptr(std_input_handle)) - if hIn == invalid_handle_value || hIn == 0 { - return nil, err - } - ok, _, err := procGetConsoleMode.Call(hIn, uintptr(unsafe.Pointer(&mode))) - if ok != 0 { - err = nil - } - return mode, err -} diff --git a/vendor/github.com/peterh/liner/line.go b/vendor/github.com/peterh/liner/line.go deleted file mode 100644 index d61f0696b0e8..000000000000 --- a/vendor/github.com/peterh/liner/line.go +++ /dev/null @@ -1,1129 +0,0 @@ -// +build windows linux darwin openbsd freebsd netbsd - -package liner - -import ( - "bufio" - "container/ring" - "errors" - "fmt" - "io" - "os" - "strings" - "unicode" - "unicode/utf8" -) - -type action int - -const ( - left action = iota - right - up - down - home - end - insert - del - pageUp - pageDown - f1 - f2 - f3 - f4 - f5 - f6 - f7 - f8 - f9 - f10 - f11 - f12 - altB - altF - altY - shiftTab - wordLeft - wordRight - winch - unknown -) - -const ( - ctrlA = 1 - ctrlB = 2 - ctrlC = 3 - ctrlD = 4 - ctrlE = 5 - ctrlF = 6 - ctrlG = 7 - ctrlH = 8 - tab = 9 - lf = 10 - ctrlK = 11 - ctrlL = 12 - cr = 13 - ctrlN = 14 - ctrlO = 15 - ctrlP = 16 - ctrlQ = 17 - ctrlR = 18 - ctrlS = 19 - ctrlT = 20 - ctrlU = 21 - ctrlV = 22 - ctrlW = 23 - ctrlX = 24 - ctrlY = 25 - ctrlZ = 26 - esc = 27 - bs = 127 -) - -const ( - beep = "\a" -) - -type tabDirection int - -const ( - tabForward tabDirection = iota - tabReverse -) - -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) - } - return s.refreshSingleLine(prompt, buf, pos) -} - -func (s *State) refreshSingleLine(prompt []rune, buf []rune, pos int) error { - s.cursorPos(0) - _, err := fmt.Print(string(prompt)) - if err != nil { - return err - } - - pLen := countGlyphs(prompt) - bLen := countGlyphs(buf) - pos = countGlyphs(buf[:pos]) - if pLen+bLen < s.columns { - _, err = fmt.Print(string(buf)) - s.eraseLine() - s.cursorPos(pLen + pos) - } else { - // Find space available - space := s.columns - pLen - space-- // space for cursor - start := pos - space/2 - end := start + space - if end > bLen { - end = bLen - start = end - space - } - if start < 0 { - start = 0 - end = space - } - pos -= start - - // Leave space for markers - if start > 0 { - start++ - } - if end < bLen { - end-- - } - startRune := len(getPrefixGlyphs(buf, start)) - line := getPrefixGlyphs(buf[startRune:], end-start) - - // Output - if start > 0 { - fmt.Print("{") - } - fmt.Print(string(line)) - if end < bLen { - fmt.Print("}") - } - - // Set cursor position - s.eraseLine() - s.cursorPos(pLen + pos) - } - return err -} - -func (s *State) refreshMultiLine(prompt []rune, buf []rune, pos int) error { - promptColumns := countMultiLineGlyphs(prompt, s.columns, 0) - totalColumns := countMultiLineGlyphs(buf, s.columns, promptColumns) - totalRows := (totalColumns + s.columns - 1) / s.columns - maxRows := s.maxRows - if totalRows > s.maxRows { - s.maxRows = totalRows - } - cursorRows := s.cursorRows - if cursorRows == 0 { - cursorRows = 1 - } - - /* First step: clear all the lines used before. To do so start by - * going to the last row. */ - if maxRows-cursorRows > 0 { - s.moveDown(maxRows - cursorRows) - } - - /* Now for every row clear it, go up. */ - for i := 0; i < maxRows-1; i++ { - s.cursorPos(0) - s.eraseLine() - s.moveUp(1) - } - - /* Clean the top line. */ - s.cursorPos(0) - s.eraseLine() - - /* Write the prompt and the current buffer content */ - if _, err := fmt.Print(string(prompt)); err != nil { - return err - } - if _, err := fmt.Print(string(buf)); err != nil { - return err - } - - /* If we are at the very end of the screen with our prompt, we need to - * emit a newline and move the prompt to the first column. */ - cursorColumns := countMultiLineGlyphs(buf[:pos], s.columns, promptColumns) - if cursorColumns == totalColumns && totalColumns%s.columns == 0 { - s.emitNewLine() - s.cursorPos(0) - totalRows++ - if totalRows > s.maxRows { - s.maxRows = totalRows - } - } - - /* Move cursor to right position. */ - cursorRows = (cursorColumns + s.columns) / s.columns - if s.cursorRows > 0 && totalRows-cursorRows > 0 { - s.moveUp(totalRows - cursorRows) - } - /* Set column. */ - s.cursorPos(cursorColumns % s.columns) - - s.cursorRows = cursorRows - return nil -} - -func (s *State) resetMultiLine(prompt []rune, buf []rune, pos int) { - columns := countMultiLineGlyphs(prompt, s.columns, 0) - columns = countMultiLineGlyphs(buf[:pos], s.columns, columns) - columns += 2 // ^C - cursorRows := (columns + s.columns) / s.columns - if s.maxRows-cursorRows > 0 { - for i := 0; i < s.maxRows-cursorRows; i++ { - fmt.Println() // always moves the cursor down or scrolls the window up as needed - } - } - s.maxRows = 1 - s.cursorRows = 0 -} - -func longestCommonPrefix(strs []string) string { - if len(strs) == 0 { - return "" - } - longest := strs[0] - - for _, str := range strs[1:] { - for !strings.HasPrefix(str, longest) { - longest = longest[:len(longest)-1] - } - } - // Remove trailing partial runes - longest = strings.TrimRight(longest, "\uFFFD") - return longest -} - -func (s *State) circularTabs(items []string) func(tabDirection) (string, error) { - item := -1 - return func(direction tabDirection) (string, error) { - if direction == tabForward { - if item < len(items)-1 { - item++ - } else { - item = 0 - } - } else if direction == tabReverse { - if item > 0 { - item-- - } else { - item = len(items) - 1 - } - } - return items[item], nil - } -} - -func calculateColumns(screenWidth int, items []string) (numColumns, numRows, maxWidth int) { - for _, item := range items { - if len(item) >= screenWidth { - return 1, len(items), screenWidth - 1 - } - if len(item) >= maxWidth { - maxWidth = len(item) + 1 - } - } - - numColumns = screenWidth / maxWidth - numRows = len(items) / numColumns - if len(items)%numColumns > 0 { - numRows++ - } - - if len(items) <= numColumns { - maxWidth = 0 - } - - return -} - -func (s *State) printedTabs(items []string) func(tabDirection) (string, error) { - numTabs := 1 - prefix := longestCommonPrefix(items) - return func(direction tabDirection) (string, error) { - if len(items) == 1 { - return items[0], nil - } - - if numTabs == 2 { - if len(items) > 100 { - fmt.Printf("\nDisplay all %d possibilities? (y or n) ", len(items)) - prompt: - for { - next, err := s.readNext() - if err != nil { - return prefix, err - } - - if key, ok := next.(rune); ok { - switch key { - case 'n', 'N': - return prefix, nil - case 'y', 'Y': - break prompt - case ctrlC, ctrlD, cr, lf: - s.restartPrompt() - } - } - } - } - fmt.Println("") - - numColumns, numRows, maxWidth := calculateColumns(s.columns, items) - - for i := 0; i < numRows; i++ { - for j := 0; j < numColumns*numRows; j += numRows { - if i+j < len(items) { - if maxWidth > 0 { - fmt.Printf("%-*.[1]*s", maxWidth, items[i+j]) - } else { - fmt.Printf("%v ", items[i+j]) - } - } - } - fmt.Println("") - } - } else { - numTabs++ - } - return prefix, nil - } -} - -func (s *State) tabComplete(p []rune, line []rune, pos int) ([]rune, int, interface{}, error) { - if s.completer == nil { - return line, pos, rune(esc), nil - } - head, list, tail := s.completer(string(line), pos) - if len(list) <= 0 { - return line, pos, rune(esc), nil - } - hl := utf8.RuneCountInString(head) - if len(list) == 1 { - 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 - tabPrinter := s.circularTabs(list) - if s.tabStyle == TabPrints { - tabPrinter = s.printedTabs(list) - } - - for { - pick, err := tabPrinter(direction) - if err != nil { - return line, pos, rune(esc), err - } - 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 { - return line, pos, rune(esc), err - } - if key, ok := next.(rune); ok { - if key == tab { - direction = tabForward - continue - } - if key == esc { - return line, pos, rune(esc), nil - } - } - if a, ok := next.(action); ok && a == shiftTab { - direction = tabReverse - continue - } - return []rune(head + pick + tail), hl + utf8.RuneCountInString(pick), next, nil - } -} - -// 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)`': " - err := s.refresh([]rune(p), origLine, origPos) - if err != nil { - return origLine, origPos, rune(esc), err - } - - line := []rune{} - pos := 0 - foundLine := string(origLine) - foundPos := origPos - - getLine := func() ([]rune, []rune, int) { - search := string(line) - prompt := "(reverse-i-search)`%s': " - return []rune(fmt.Sprintf(prompt, search)), []rune(foundLine), foundPos - } - - history, positions := s.getHistoryByPattern(string(line)) - historyPos := len(history) - 1 - - for { - next, err := s.readNext() - if err != nil { - return []rune(foundLine), foundPos, rune(esc), err - } - - switch v := next.(type) { - case rune: - switch v { - case ctrlR: // Search backwards - if historyPos > 0 && historyPos < len(history) { - historyPos-- - foundLine = history[historyPos] - foundPos = positions[historyPos] - } else { - fmt.Print(beep) - } - case ctrlS: // Search forward - if historyPos < len(history)-1 && historyPos >= 0 { - historyPos++ - foundLine = history[historyPos] - foundPos = positions[historyPos] - } else { - fmt.Print(beep) - } - case ctrlH, bs: // Backspace - if pos <= 0 { - fmt.Print(beep) - } else { - n := len(getSuffixGlyphs(line[:pos], 1)) - line = append(line[:pos-n], line[pos:]...) - pos -= n - - // For each char deleted, display the last matching line of history - history, positions := s.getHistoryByPattern(string(line)) - historyPos = len(history) - 1 - if len(history) > 0 { - foundLine = history[historyPos] - foundPos = positions[historyPos] - } else { - foundLine = "" - foundPos = 0 - } - } - case ctrlG: // Cancel - return origLine, origPos, rune(esc), err - - case tab, cr, lf, ctrlA, ctrlB, ctrlD, ctrlE, ctrlF, ctrlK, - ctrlL, ctrlN, ctrlO, ctrlP, ctrlQ, ctrlT, ctrlU, ctrlV, ctrlW, ctrlX, ctrlY, ctrlZ: - fallthrough - case 0, ctrlC, esc, 28, 29, 30, 31: - return []rune(foundLine), foundPos, next, err - default: - line = append(line[:pos], append([]rune{v}, line[pos:]...)...) - pos++ - - // For each keystroke typed, display the last matching line of history - history, positions = s.getHistoryByPattern(string(line)) - historyPos = len(history) - 1 - if len(history) > 0 { - foundLine = history[historyPos] - foundPos = positions[historyPos] - } else { - foundLine = "" - foundPos = 0 - } - } - case action: - return []rune(foundLine), foundPos, next, err - } - err = s.refresh(getLine()) - if err != nil { - return []rune(foundLine), foundPos, rune(esc), err - } - } -} - -// addToKillRing adds some text to the kill ring. If mode is 0 it adds it to a -// new node in the end of the kill ring, and move the current pointer to the new -// node. If mode is 1 or 2 it appends or prepends the text to the current entry -// of the killRing. -func (s *State) addToKillRing(text []rune, mode int) { - // Don't use the same underlying array as text - killLine := make([]rune, len(text)) - copy(killLine, text) - - // Point killRing to a newNode, procedure depends on the killring state and - // append mode. - if mode == 0 { // Add new node to killRing - if s.killRing == nil { // if killring is empty, create a new one - s.killRing = ring.New(1) - } else if s.killRing.Len() >= KillRingMax { // if killring is "full" - s.killRing = s.killRing.Next() - } else { // Normal case - s.killRing.Link(ring.New(1)) - s.killRing = s.killRing.Next() - } - } else { - if s.killRing == nil { // if killring is empty, create a new one - s.killRing = ring.New(1) - s.killRing.Value = []rune{} - } - if mode == 1 { // Append to last entry - killLine = append(s.killRing.Value.([]rune), killLine...) - } else if mode == 2 { // Prepend to last entry - killLine = append(killLine, s.killRing.Value.([]rune)...) - } - } - - // Save text in the current killring node - s.killRing.Value = killLine -} - -func (s *State) yank(p []rune, text []rune, pos int) ([]rune, int, interface{}, error) { - if s.killRing == nil { - return text, pos, rune(esc), nil - } - - lineStart := text[:pos] - lineEnd := text[pos:] - var line []rune - - for { - value := s.killRing.Value.([]rune) - line = make([]rune, 0) - line = append(line, lineStart...) - line = append(line, value...) - line = append(line, lineEnd...) - - pos = len(lineStart) + len(value) - err := s.refresh(p, line, pos) - if err != nil { - return line, pos, 0, err - } - - next, err := s.readNext() - if err != nil { - return line, pos, next, err - } - - switch v := next.(type) { - case rune: - return line, pos, next, nil - case action: - switch v { - case altY: - s.killRing = s.killRing.Prev() - default: - return line, pos, next, nil - } - } - } -} - -// Prompt displays p and returns a line of user input, not including a trailing -// newline character. An io.EOF error is returned if the user signals end-of-file -// by pressing Ctrl-D. Prompt allows line editing if the terminal supports it. -func (s *State) Prompt(prompt string) (string, error) { - return s.PromptWithSuggestion(prompt, "", 0) -} - -// PromptWithSuggestion displays prompt and an editable text with cursor at -// given position. The cursor will be set to the end of the line if given position -// is negative or greater than length of text. Returns a line of user input, not -// including a trailing newline character. An io.EOF error is returned if the user -// signals end-of-file by pressing Ctrl-D. -func (s *State) PromptWithSuggestion(prompt string, text string, pos int) (string, error) { - for _, r := range prompt { - if unicode.Is(unicode.C, r) { - return "", ErrInvalidPrompt - } - } - 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 - } - - s.historyMutex.RLock() - defer s.historyMutex.RUnlock() - - fmt.Print(prompt) - var line = []rune(text) - historyEnd := "" - var historyPrefix []string - historyPos := 0 - historyStale := true - historyAction := false // used to mark history related actions - killAction := 0 // used to mark kill related actions - - defer s.stopPrompt() - - if pos < 0 || len(text) < pos { - pos = len(text) - } - if len(line) > 0 { - err := s.refresh(p, line, pos) - if err != nil { - return "", err - } - } - -restart: - s.startPrompt() - s.getColumns() - -mainLoop: - for { - next, err := s.readNext() - haveNext: - if err != nil { - if s.shouldRestart != nil && s.shouldRestart(err) { - goto restart - } - return "", err - } - - historyAction = false - switch v := next.(type) { - case rune: - switch v { - case cr, lf: - if s.needRefresh { - err := s.refresh(p, line, pos) - if err != nil { - return "", err - } - } - if s.multiLineMode { - s.resetMultiLine(p, line, pos) - } - fmt.Println() - break mainLoop - case ctrlA: // Start of line - pos = 0 - s.needRefresh = true - case ctrlE: // End of line - pos = len(line) - s.needRefresh = true - case ctrlB: // left - if pos > 0 { - pos -= len(getSuffixGlyphs(line[:pos], 1)) - s.needRefresh = true - } else { - fmt.Print(beep) - } - case ctrlF: // right - if pos < len(line) { - pos += len(getPrefixGlyphs(line[pos:], 1)) - s.needRefresh = true - } else { - fmt.Print(beep) - } - case ctrlD: // del - if pos == 0 && len(line) == 0 { - // exit - return "", io.EOF - } - - // ctrlD is a potential EOF, so the rune reader shuts down. - // Therefore, if it isn't actually an EOF, we must re-startPrompt. - s.restartPrompt() - - if pos >= len(line) { - fmt.Print(beep) - } else { - n := len(getPrefixGlyphs(line[pos:], 1)) - line = append(line[:pos], line[pos+n:]...) - s.needRefresh = true - } - case ctrlK: // delete remainder of line - if pos >= len(line) { - fmt.Print(beep) - } else { - if killAction > 0 { - s.addToKillRing(line[pos:], 1) // Add in apend mode - } else { - s.addToKillRing(line[pos:], 0) // Add in normal mode - } - - killAction = 2 // Mark that there was a kill action - line = line[:pos] - s.needRefresh = true - } - case ctrlP: // up - historyAction = true - if historyStale { - historyPrefix = s.getHistoryByPrefix(string(line)) - historyPos = len(historyPrefix) - historyStale = false - } - if historyPos > 0 { - if historyPos == len(historyPrefix) { - historyEnd = string(line) - } - historyPos-- - line = []rune(historyPrefix[historyPos]) - pos = len(line) - s.needRefresh = true - } else { - fmt.Print(beep) - } - case ctrlN: // down - historyAction = true - if historyStale { - historyPrefix = s.getHistoryByPrefix(string(line)) - historyPos = len(historyPrefix) - historyStale = false - } - if historyPos < len(historyPrefix) { - historyPos++ - if historyPos == len(historyPrefix) { - line = []rune(historyEnd) - } else { - line = []rune(historyPrefix[historyPos]) - } - pos = len(line) - s.needRefresh = true - } else { - fmt.Print(beep) - } - case ctrlT: // transpose prev glyph with glyph under cursor - if len(line) < 2 || pos < 1 { - fmt.Print(beep) - } else { - if pos == len(line) { - pos -= len(getSuffixGlyphs(line, 1)) - } - prev := getSuffixGlyphs(line[:pos], 1) - next := getPrefixGlyphs(line[pos:], 1) - scratch := make([]rune, len(prev)) - copy(scratch, prev) - copy(line[pos-len(prev):], next) - copy(line[pos-len(prev)+len(next):], scratch) - pos += len(next) - s.needRefresh = true - } - case ctrlL: // clear screen - s.eraseScreen() - s.needRefresh = true - case ctrlC: // reset - fmt.Println("^C") - if s.multiLineMode { - s.resetMultiLine(p, line, pos) - } - if s.ctrlCAborts { - return "", ErrPromptAborted - } - line = line[:0] - pos = 0 - fmt.Print(prompt) - s.restartPrompt() - case ctrlH, bs: // Backspace - if pos <= 0 { - fmt.Print(beep) - } else { - n := len(getSuffixGlyphs(line[:pos], 1)) - line = append(line[:pos-n], line[pos:]...) - pos -= n - s.needRefresh = true - } - case ctrlU: // Erase line before cursor - if killAction > 0 { - s.addToKillRing(line[:pos], 2) // Add in prepend mode - } else { - s.addToKillRing(line[:pos], 0) // Add in normal mode - } - - killAction = 2 // Mark that there was some killing - line = line[pos:] - pos = 0 - s.needRefresh = true - case ctrlW: // Erase word - if pos == 0 { - fmt.Print(beep) - break - } - // Remove whitespace to the left - var buf []rune // Store the deleted chars in a buffer - for { - if pos == 0 || !unicode.IsSpace(line[pos-1]) { - break - } - buf = append(buf, line[pos-1]) - line = append(line[:pos-1], line[pos:]...) - pos-- - } - // Remove non-whitespace to the left - for { - if pos == 0 || unicode.IsSpace(line[pos-1]) { - break - } - buf = append(buf, line[pos-1]) - line = append(line[:pos-1], line[pos:]...) - pos-- - } - // Invert the buffer and save the result on the killRing - var newBuf []rune - for i := len(buf) - 1; i >= 0; i-- { - newBuf = append(newBuf, buf[i]) - } - if killAction > 0 { - s.addToKillRing(newBuf, 2) // Add in prepend mode - } else { - s.addToKillRing(newBuf, 0) // Add in normal mode - } - killAction = 2 // Mark that there was some killing - - s.needRefresh = true - case ctrlY: // Paste from Yank buffer - line, pos, next, err = s.yank(p, line, pos) - goto haveNext - case ctrlR: // Reverse Search - line, pos, next, err = s.reverseISearch(line, pos) - s.needRefresh = true - goto haveNext - case tab: // Tab completion - line, pos, next, err = s.tabComplete(p, line, pos) - goto haveNext - // Catch keys that do nothing, but you don't want them to beep - case esc: - // DO NOTHING - // Unused keys - case ctrlG, ctrlO, ctrlQ, ctrlS, ctrlV, ctrlX, ctrlZ: - fallthrough - // Catch unhandled control codes (anything <= 31) - case 0, 28, 29, 30, 31: - fmt.Print(beep) - default: - if pos == len(line) && !s.multiLineMode && - len(p)+len(line) < s.columns*4 && // Avoid countGlyphs on large lines - countGlyphs(p)+countGlyphs(line) < s.columns-1 { - line = append(line, v) - fmt.Printf("%c", v) - pos++ - } else { - line = append(line[:pos], append([]rune{v}, line[pos:]...)...) - pos++ - s.needRefresh = true - } - } - case action: - switch v { - case del: - if pos >= len(line) { - fmt.Print(beep) - } else { - n := len(getPrefixGlyphs(line[pos:], 1)) - line = append(line[:pos], line[pos+n:]...) - } - case left: - if pos > 0 { - pos -= len(getSuffixGlyphs(line[:pos], 1)) - } else { - fmt.Print(beep) - } - case wordLeft, altB: - if pos > 0 { - var spaceHere, spaceLeft, leftKnown bool - for { - pos-- - if pos == 0 { - break - } - if leftKnown { - spaceHere = spaceLeft - } else { - spaceHere = unicode.IsSpace(line[pos]) - } - spaceLeft, leftKnown = unicode.IsSpace(line[pos-1]), true - if !spaceHere && spaceLeft { - break - } - } - } else { - fmt.Print(beep) - } - case right: - if pos < len(line) { - pos += len(getPrefixGlyphs(line[pos:], 1)) - } else { - fmt.Print(beep) - } - case wordRight, altF: - if pos < len(line) { - var spaceHere, spaceLeft, hereKnown bool - for { - pos++ - if pos == len(line) { - break - } - if hereKnown { - spaceLeft = spaceHere - } else { - spaceLeft = unicode.IsSpace(line[pos-1]) - } - spaceHere, hereKnown = unicode.IsSpace(line[pos]), true - if spaceHere && !spaceLeft { - break - } - } - } else { - fmt.Print(beep) - } - case up: - historyAction = true - if historyStale { - historyPrefix = s.getHistoryByPrefix(string(line)) - historyPos = len(historyPrefix) - historyStale = false - } - if historyPos > 0 { - if historyPos == len(historyPrefix) { - historyEnd = string(line) - } - historyPos-- - line = []rune(historyPrefix[historyPos]) - pos = len(line) - } else { - fmt.Print(beep) - } - case down: - historyAction = true - if historyStale { - historyPrefix = s.getHistoryByPrefix(string(line)) - historyPos = len(historyPrefix) - historyStale = false - } - if historyPos < len(historyPrefix) { - historyPos++ - if historyPos == len(historyPrefix) { - line = []rune(historyEnd) - } else { - line = []rune(historyPrefix[historyPos]) - } - pos = len(line) - } else { - fmt.Print(beep) - } - case home: // Start of line - pos = 0 - case end: // End of line - pos = len(line) - case winch: // Window change - if s.multiLineMode { - if s.maxRows-s.cursorRows > 0 { - s.moveDown(s.maxRows - s.cursorRows) - } - for i := 0; i < s.maxRows-1; i++ { - s.cursorPos(0) - s.eraseLine() - s.moveUp(1) - } - s.maxRows = 1 - s.cursorRows = 1 - } - } - s.needRefresh = true - } - if s.needRefresh && !s.inputWaiting() { - err := s.refresh(p, line, pos) - if err != nil { - return "", err - } - } - if !historyAction { - historyStale = true - } - if killAction > 0 { - killAction-- - } - } - return string(line), nil -} - -// PasswordPrompt displays p, and then waits for user input. The input typed by -// the user is not displayed in the terminal. -func (s *State) PasswordPrompt(prompt string) (string, error) { - for _, r := range prompt { - if unicode.Is(unicode.C, r) { - return "", ErrInvalidPrompt - } - } - if !s.terminalSupported || s.columns == 0 { - return "", errors.New("liner: function not supported in this terminal") - } - if s.inputRedirected { - return s.promptUnsupported(prompt) - } - if s.outputRedirected { - return "", ErrNotTerminalOutput - } - - p := []rune(prompt) - const minWorkingSpace = 1 - if s.columns < countGlyphs(p)+minWorkingSpace { - return s.tooNarrow(prompt) - } - - defer s.stopPrompt() - -restart: - s.startPrompt() - s.getColumns() - - fmt.Print(prompt) - var line []rune - pos := 0 - -mainLoop: - for { - next, err := s.readNext() - if err != nil { - if s.shouldRestart != nil && s.shouldRestart(err) { - goto restart - } - return "", err - } - - switch v := next.(type) { - case rune: - switch v { - case cr, lf: - if s.needRefresh { - err := s.refresh(p, line, pos) - if err != nil { - return "", err - } - } - if s.multiLineMode { - s.resetMultiLine(p, line, pos) - } - fmt.Println() - break mainLoop - case ctrlD: // del - if pos == 0 && len(line) == 0 { - // exit - return "", io.EOF - } - - // ctrlD is a potential EOF, so the rune reader shuts down. - // Therefore, if it isn't actually an EOF, we must re-startPrompt. - s.restartPrompt() - case ctrlL: // clear screen - s.eraseScreen() - err := s.refresh(p, []rune{}, 0) - if err != nil { - return "", err - } - case ctrlH, bs: // Backspace - if pos <= 0 { - fmt.Print(beep) - } else { - n := len(getSuffixGlyphs(line[:pos], 1)) - line = append(line[:pos-n], line[pos:]...) - pos -= n - } - case ctrlC: - fmt.Println("^C") - if s.multiLineMode { - s.resetMultiLine(p, line, pos) - } - if s.ctrlCAborts { - return "", ErrPromptAborted - } - line = line[:0] - pos = 0 - fmt.Print(prompt) - s.restartPrompt() - // Unused keys - case esc, tab, ctrlA, ctrlB, ctrlE, ctrlF, ctrlG, ctrlK, ctrlN, ctrlO, ctrlP, ctrlQ, ctrlR, ctrlS, - ctrlT, ctrlU, ctrlV, ctrlW, ctrlX, ctrlY, ctrlZ: - fallthrough - // Catch unhandled control codes (anything <= 31) - case 0, 28, 29, 30, 31: - fmt.Print(beep) - default: - line = append(line[:pos], append([]rune{v}, line[pos:]...)...) - pos++ - } - } - } - 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/peterh/liner/output.go b/vendor/github.com/peterh/liner/output.go deleted file mode 100644 index 6d83d4ebfd7c..000000000000 --- a/vendor/github.com/peterh/liner/output.go +++ /dev/null @@ -1,79 +0,0 @@ -// +build linux darwin openbsd freebsd netbsd - -package liner - -import ( - "fmt" - "os" - "strings" - "syscall" - "unsafe" -) - -func (s *State) cursorPos(x int) { - if s.useCHA { - // 'G' is "Cursor Character Absolute (CHA)" - fmt.Printf("\x1b[%dG", x+1) - } else { - // 'C' is "Cursor Forward (CUF)" - fmt.Print("\r") - if x > 0 { - fmt.Printf("\x1b[%dC", x) - } - } -} - -func (s *State) eraseLine() { - fmt.Print("\x1b[0K") -} - -func (s *State) eraseScreen() { - fmt.Print("\x1b[H\x1b[2J") -} - -func (s *State) moveUp(lines int) { - fmt.Printf("\x1b[%dA", lines) -} - -func (s *State) moveDown(lines int) { - fmt.Printf("\x1b[%dB", lines) -} - -func (s *State) emitNewLine() { - fmt.Print("\n") -} - -type winSize struct { - row, col uint16 - xpixel, ypixel uint16 -} - -func (s *State) getColumns() bool { - var ws winSize - ok, _, _ := syscall.Syscall(syscall.SYS_IOCTL, uintptr(syscall.Stdout), - syscall.TIOCGWINSZ, uintptr(unsafe.Pointer(&ws))) - if int(ok) < 0 { - return false - } - s.columns = int(ws.col) - if cursorColumn && s.columns > 1 { - s.columns-- - } - return true -} - -func (s *State) checkOutput() { - // xterm is known to support CHA - if strings.Contains(strings.ToLower(os.Getenv("TERM")), "xterm") { - s.useCHA = true - return - } - - // The test for functional ANSI CHA is unreliable (eg the Windows - // telnet command does not support reading the cursor position with - // an ANSI DSR request, despite setting TERM=ansi) - - // Assume CHA isn't supported (which should be safe, although it - // does result in occasional visible cursor jitter) - s.useCHA = false -} diff --git a/vendor/github.com/peterh/liner/output_windows.go b/vendor/github.com/peterh/liner/output_windows.go deleted file mode 100644 index 63c9c5d75713..000000000000 --- a/vendor/github.com/peterh/liner/output_windows.go +++ /dev/null @@ -1,76 +0,0 @@ -package liner - -import ( - "unsafe" -) - -type coord struct { - x, y int16 -} -type smallRect struct { - left, top, right, bottom int16 -} - -type consoleScreenBufferInfo struct { - dwSize coord - dwCursorPosition coord - wAttributes int16 - srWindow smallRect - dwMaximumWindowSize coord -} - -func (s *State) cursorPos(x int) { - var sbi consoleScreenBufferInfo - procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi))) - procSetConsoleCursorPosition.Call(uintptr(s.hOut), - uintptr(int(x)&0xFFFF|int(sbi.dwCursorPosition.y)<<16)) -} - -func (s *State) eraseLine() { - var sbi consoleScreenBufferInfo - procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi))) - var numWritten uint32 - procFillConsoleOutputCharacter.Call(uintptr(s.hOut), uintptr(' '), - uintptr(sbi.dwSize.x-sbi.dwCursorPosition.x), - uintptr(int(sbi.dwCursorPosition.x)&0xFFFF|int(sbi.dwCursorPosition.y)<<16), - uintptr(unsafe.Pointer(&numWritten))) -} - -func (s *State) eraseScreen() { - var sbi consoleScreenBufferInfo - procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi))) - var numWritten uint32 - procFillConsoleOutputCharacter.Call(uintptr(s.hOut), uintptr(' '), - uintptr(sbi.dwSize.x)*uintptr(sbi.dwSize.y), - 0, - uintptr(unsafe.Pointer(&numWritten))) - procSetConsoleCursorPosition.Call(uintptr(s.hOut), 0) -} - -func (s *State) moveUp(lines int) { - var sbi consoleScreenBufferInfo - procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi))) - procSetConsoleCursorPosition.Call(uintptr(s.hOut), - uintptr(int(sbi.dwCursorPosition.x)&0xFFFF|(int(sbi.dwCursorPosition.y)-lines)<<16)) -} - -func (s *State) moveDown(lines int) { - var sbi consoleScreenBufferInfo - procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi))) - procSetConsoleCursorPosition.Call(uintptr(s.hOut), - uintptr(int(sbi.dwCursorPosition.x)&0xFFFF|(int(sbi.dwCursorPosition.y)+lines)<<16)) -} - -func (s *State) emitNewLine() { - // windows doesn't need to omit a new line -} - -func (s *State) getColumns() { - var sbi consoleScreenBufferInfo - procGetConsoleScreenBufferInfo.Call(uintptr(s.hOut), uintptr(unsafe.Pointer(&sbi))) - s.columns = int(sbi.dwSize.x) - if s.columns > 1 { - // Windows 10 needs a spare column for the cursor - s.columns-- - } -} diff --git a/vendor/github.com/peterh/liner/unixmode.go b/vendor/github.com/peterh/liner/unixmode.go deleted file mode 100644 index 9838923f5db4..000000000000 --- a/vendor/github.com/peterh/liner/unixmode.go +++ /dev/null @@ -1,37 +0,0 @@ -// +build linux darwin freebsd openbsd netbsd - -package liner - -import ( - "syscall" - "unsafe" -) - -func (mode *termios) ApplyMode() error { - _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(syscall.Stdin), setTermios, uintptr(unsafe.Pointer(mode))) - - if errno != 0 { - return errno - } - return nil -} - -// TerminalMode returns the current terminal input mode as an InputModeSetter. -// -// This function is provided for convenience, and should -// not be necessary for most users of liner. -func TerminalMode() (ModeApplier, error) { - mode, errno := getMode(syscall.Stdin) - - if errno != 0 { - return nil, errno - } - return mode, nil -} - -func getMode(handle int) (*termios, syscall.Errno) { - var mode termios - _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(handle), getTermios, uintptr(unsafe.Pointer(&mode))) - - return &mode, errno -} diff --git a/vendor/github.com/peterh/liner/width.go b/vendor/github.com/peterh/liner/width.go deleted file mode 100644 index 42e89998341b..000000000000 --- a/vendor/github.com/peterh/liner/width.go +++ /dev/null @@ -1,99 +0,0 @@ -package liner - -import "unicode" - -// These character classes are mostly zero width (when combined). -// A few might not be, depending on the user's font. Fixing this -// is non-trivial, given that some terminals don't support -// ANSI DSR/CPR -var zeroWidth = []*unicode.RangeTable{ - unicode.Mn, - unicode.Me, - unicode.Cc, - unicode.Cf, -} - -var doubleWidth = []*unicode.RangeTable{ - unicode.Han, - unicode.Hangul, - unicode.Hiragana, - unicode.Katakana, -} - -// countGlyphs considers zero-width characters to be zero glyphs wide, -// and members of Chinese, Japanese, and Korean scripts to be 2 glyphs wide. -func countGlyphs(s []rune) int { - n := 0 - for _, r := range s { - // speed up the common case - if r < 127 { - n++ - continue - } - - switch { - case unicode.IsOneOf(zeroWidth, r): - case unicode.IsOneOf(doubleWidth, r): - n += 2 - default: - n++ - } - } - return n -} - -func countMultiLineGlyphs(s []rune, columns int, start int) int { - n := start - for _, r := range s { - if r < 127 { - n++ - continue - } - switch { - case unicode.IsOneOf(zeroWidth, r): - case unicode.IsOneOf(doubleWidth, r): - n += 2 - // no room for a 2-glyphs-wide char in the ending - // so skip a column and display it at the beginning - if n%columns == 1 { - n++ - } - default: - n++ - } - } - return n -} - -func getPrefixGlyphs(s []rune, num int) []rune { - p := 0 - for n := 0; n < num && p < len(s); p++ { - // speed up the common case - if s[p] < 127 { - n++ - continue - } - if !unicode.IsOneOf(zeroWidth, s[p]) { - n++ - } - } - for p < len(s) && unicode.IsOneOf(zeroWidth, s[p]) { - p++ - } - return s[:p] -} - -func getSuffixGlyphs(s []rune, num int) []rune { - p := len(s) - for n := 0; n < num && p > 0; p-- { - // speed up the common case - if s[p-1] < 127 { - n++ - continue - } - if !unicode.IsOneOf(zeroWidth, s[p-1]) { - n++ - } - } - return s[p:] -} diff --git a/vendor/github.com/pkg/errors/LICENSE b/vendor/github.com/pkg/errors/LICENSE deleted file mode 100644 index 835ba3e755ce..000000000000 --- a/vendor/github.com/pkg/errors/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2015, Dave Cheney -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. - -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/pkg/errors/README.md b/vendor/github.com/pkg/errors/README.md deleted file mode 100644 index 6483ba2afb51..000000000000 --- a/vendor/github.com/pkg/errors/README.md +++ /dev/null @@ -1,52 +0,0 @@ -# errors [![Travis-CI](https://travis-ci.org/pkg/errors.svg)](https://travis-ci.org/pkg/errors) [![AppVeyor](https://ci.appveyor.com/api/projects/status/b98mptawhudj53ep/branch/master?svg=true)](https://ci.appveyor.com/project/davecheney/errors/branch/master) [![GoDoc](https://godoc.org/github.com/pkg/errors?status.svg)](http://godoc.org/github.com/pkg/errors) [![Report card](https://goreportcard.com/badge/github.com/pkg/errors)](https://goreportcard.com/report/github.com/pkg/errors) [![Sourcegraph](https://sourcegraph.com/github.com/pkg/errors/-/badge.svg)](https://sourcegraph.com/github.com/pkg/errors?badge) - -Package errors provides simple error handling primitives. - -`go get github.com/pkg/errors` - -The traditional error handling idiom in Go is roughly akin to -```go -if err != nil { - return err -} -``` -which applied recursively up the call stack results in error reports without context or debugging information. The errors package allows programmers to add context to the failure path in their code in a way that does not destroy the original value of the error. - -## Adding context to an error - -The errors.Wrap function returns a new error that adds context to the original error. For example -```go -_, err := ioutil.ReadAll(r) -if err != nil { - return errors.Wrap(err, "read failed") -} -``` -## Retrieving the cause of an error - -Using `errors.Wrap` constructs a stack of errors, adding context to the preceding error. Depending on the nature of the error it may be necessary to reverse the operation of errors.Wrap to retrieve the original error for inspection. Any error value which implements this interface can be inspected by `errors.Cause`. -```go -type causer interface { - Cause() error -} -``` -`errors.Cause` will recursively retrieve the topmost error which does not implement `causer`, which is assumed to be the original cause. For example: -```go -switch err := errors.Cause(err).(type) { -case *MyError: - // handle specifically -default: - // unknown error -} -``` - -[Read the package documentation for more information](https://godoc.org/github.com/pkg/errors). - -## Contributing - -We welcome pull requests, bug fixes and issue reports. With that said, the bar for adding new symbols to this package is intentionally set high. - -Before proposing a change, please discuss your change by raising an issue. - -## License - -BSD-2-Clause diff --git a/vendor/github.com/pkg/errors/appveyor.yml b/vendor/github.com/pkg/errors/appveyor.yml deleted file mode 100644 index a932eade0240..000000000000 --- a/vendor/github.com/pkg/errors/appveyor.yml +++ /dev/null @@ -1,32 +0,0 @@ -version: build-{build}.{branch} - -clone_folder: C:\gopath\src\github.com\pkg\errors -shallow_clone: true # for startup speed - -environment: - GOPATH: C:\gopath - -platform: - - x64 - -# http://www.appveyor.com/docs/installed-software -install: - # some helpful output for debugging builds - - go version - - go env - # pre-installed MinGW at C:\MinGW is 32bit only - # but MSYS2 at C:\msys64 has mingw64 - - set PATH=C:\msys64\mingw64\bin;%PATH% - - gcc --version - - g++ --version - -build_script: - - go install -v ./... - -test_script: - - set PATH=C:\gopath\bin;%PATH% - - go test -v ./... - -#artifacts: -# - path: '%GOPATH%\bin\*.exe' -deploy: off diff --git a/vendor/github.com/pkg/errors/errors.go b/vendor/github.com/pkg/errors/errors.go deleted file mode 100644 index 842ee80456db..000000000000 --- a/vendor/github.com/pkg/errors/errors.go +++ /dev/null @@ -1,269 +0,0 @@ -// Package errors provides simple error handling primitives. -// -// The traditional error handling idiom in Go is roughly akin to -// -// if err != nil { -// return err -// } -// -// which applied recursively up the call stack results in error reports -// without context or debugging information. The errors package allows -// programmers to add context to the failure path in their code in a way -// that does not destroy the original value of the error. -// -// Adding context to an error -// -// The errors.Wrap function returns a new error that adds context to the -// original error by recording a stack trace at the point Wrap is called, -// and the supplied message. For example -// -// _, err := ioutil.ReadAll(r) -// if err != nil { -// return errors.Wrap(err, "read failed") -// } -// -// If additional control is required the errors.WithStack and errors.WithMessage -// functions destructure errors.Wrap into its component operations of annotating -// an error with a stack trace and an a message, respectively. -// -// Retrieving the cause of an error -// -// Using errors.Wrap constructs a stack of errors, adding context to the -// preceding error. Depending on the nature of the error it may be necessary -// to reverse the operation of errors.Wrap to retrieve the original error -// for inspection. Any error value which implements this interface -// -// type causer interface { -// Cause() error -// } -// -// can be inspected by errors.Cause. errors.Cause will recursively retrieve -// the topmost error which does not implement causer, which is assumed to be -// the original cause. For example: -// -// switch err := errors.Cause(err).(type) { -// case *MyError: -// // handle specifically -// default: -// // unknown error -// } -// -// causer interface is not exported by this package, but is considered a part -// of stable public API. -// -// Formatted printing of errors -// -// All error values returned from this package implement fmt.Formatter and can -// be formatted by the fmt package. The following verbs are supported -// -// %s print the error. If the error has a Cause it will be -// printed recursively -// %v see %s -// %+v extended format. Each Frame of the error's StackTrace will -// be printed in detail. -// -// Retrieving the stack trace of an error or wrapper -// -// New, Errorf, Wrap, and Wrapf record a stack trace at the point they are -// invoked. This information can be retrieved with the following interface. -// -// type stackTracer interface { -// StackTrace() errors.StackTrace -// } -// -// Where errors.StackTrace is defined as -// -// type StackTrace []Frame -// -// The Frame type represents a call site in the stack trace. Frame supports -// the fmt.Formatter interface that can be used for printing information about -// the stack trace of this error. For example: -// -// if err, ok := err.(stackTracer); ok { -// for _, f := range err.StackTrace() { -// fmt.Printf("%+s:%d", f) -// } -// } -// -// stackTracer interface is not exported by this package, but is considered a part -// of stable public API. -// -// See the documentation for Frame.Format for more details. -package errors - -import ( - "fmt" - "io" -) - -// New returns an error with the supplied message. -// New also records the stack trace at the point it was called. -func New(message string) error { - return &fundamental{ - msg: message, - stack: callers(), - } -} - -// Errorf formats according to a format specifier and returns the string -// as a value that satisfies error. -// Errorf also records the stack trace at the point it was called. -func Errorf(format string, args ...interface{}) error { - return &fundamental{ - msg: fmt.Sprintf(format, args...), - stack: callers(), - } -} - -// fundamental is an error that has a message and a stack, but no caller. -type fundamental struct { - msg string - *stack -} - -func (f *fundamental) Error() string { return f.msg } - -func (f *fundamental) Format(s fmt.State, verb rune) { - switch verb { - case 'v': - if s.Flag('+') { - io.WriteString(s, f.msg) - f.stack.Format(s, verb) - return - } - fallthrough - case 's': - io.WriteString(s, f.msg) - case 'q': - fmt.Fprintf(s, "%q", f.msg) - } -} - -// WithStack annotates err with a stack trace at the point WithStack was called. -// If err is nil, WithStack returns nil. -func WithStack(err error) error { - if err == nil { - return nil - } - return &withStack{ - err, - callers(), - } -} - -type withStack struct { - error - *stack -} - -func (w *withStack) Cause() error { return w.error } - -func (w *withStack) Format(s fmt.State, verb rune) { - switch verb { - case 'v': - if s.Flag('+') { - fmt.Fprintf(s, "%+v", w.Cause()) - w.stack.Format(s, verb) - return - } - fallthrough - case 's': - io.WriteString(s, w.Error()) - case 'q': - fmt.Fprintf(s, "%q", w.Error()) - } -} - -// Wrap returns an error annotating err with a stack trace -// at the point Wrap is called, and the supplied message. -// If err is nil, Wrap returns nil. -func Wrap(err error, message string) error { - if err == nil { - return nil - } - err = &withMessage{ - cause: err, - msg: message, - } - return &withStack{ - err, - callers(), - } -} - -// Wrapf returns an error annotating err with a stack trace -// at the point Wrapf is call, and the format specifier. -// If err is nil, Wrapf returns nil. -func Wrapf(err error, format string, args ...interface{}) error { - if err == nil { - return nil - } - err = &withMessage{ - cause: err, - msg: fmt.Sprintf(format, args...), - } - return &withStack{ - err, - callers(), - } -} - -// WithMessage annotates err with a new message. -// If err is nil, WithMessage returns nil. -func WithMessage(err error, message string) error { - if err == nil { - return nil - } - return &withMessage{ - cause: err, - msg: message, - } -} - -type withMessage struct { - cause error - msg string -} - -func (w *withMessage) Error() string { return w.msg + ": " + w.cause.Error() } -func (w *withMessage) Cause() error { return w.cause } - -func (w *withMessage) Format(s fmt.State, verb rune) { - switch verb { - case 'v': - if s.Flag('+') { - fmt.Fprintf(s, "%+v\n", w.Cause()) - io.WriteString(s, w.msg) - return - } - fallthrough - case 's', 'q': - io.WriteString(s, w.Error()) - } -} - -// Cause returns the underlying cause of the error, if possible. -// An error value has a cause if it implements the following -// interface: -// -// type causer interface { -// Cause() error -// } -// -// If the error does not implement Cause, the original error will -// be returned. If the error is nil, nil will be returned without further -// investigation. -func Cause(err error) error { - type causer interface { - Cause() error - } - - for err != nil { - cause, ok := err.(causer) - if !ok { - break - } - err = cause.Cause() - } - return err -} diff --git a/vendor/github.com/pkg/errors/stack.go b/vendor/github.com/pkg/errors/stack.go deleted file mode 100644 index b485761a7cbe..000000000000 --- a/vendor/github.com/pkg/errors/stack.go +++ /dev/null @@ -1,187 +0,0 @@ -package errors - -import ( - "fmt" - "io" - "path" - "runtime" - "strings" -) - -// Frame represents a program counter inside a stack frame. -type Frame uintptr - -// pc returns the program counter for this frame; -// multiple frames may have the same PC value. -func (f Frame) pc() uintptr { return uintptr(f) - 1 } - -// file returns the full path to the file that contains the -// function for this Frame's pc. -func (f Frame) file() string { - fn := runtime.FuncForPC(f.pc()) - if fn == nil { - return "unknown" - } - file, _ := fn.FileLine(f.pc()) - return file -} - -// line returns the line number of source code of the -// function for this Frame's pc. -func (f Frame) line() int { - fn := runtime.FuncForPC(f.pc()) - if fn == nil { - return 0 - } - _, line := fn.FileLine(f.pc()) - return line -} - -// Format formats the frame according to the fmt.Formatter interface. -// -// %s source file -// %d source line -// %n function name -// %v equivalent to %s:%d -// -// Format accepts flags that alter the printing of some verbs, as follows: -// -// %+s function name and path of source file relative to the compile time -// GOPATH separated by \n\t (\n\t) -// %+v equivalent to %+s:%d -func (f Frame) Format(s fmt.State, verb rune) { - switch verb { - case 's': - switch { - case s.Flag('+'): - pc := f.pc() - fn := runtime.FuncForPC(pc) - if fn == nil { - io.WriteString(s, "unknown") - } else { - file, _ := fn.FileLine(pc) - fmt.Fprintf(s, "%s\n\t%s", fn.Name(), file) - } - default: - io.WriteString(s, path.Base(f.file())) - } - case 'd': - fmt.Fprintf(s, "%d", f.line()) - case 'n': - name := runtime.FuncForPC(f.pc()).Name() - io.WriteString(s, funcname(name)) - case 'v': - f.Format(s, 's') - io.WriteString(s, ":") - f.Format(s, 'd') - } -} - -// StackTrace is stack of Frames from innermost (newest) to outermost (oldest). -type StackTrace []Frame - -// Format formats the stack of Frames according to the fmt.Formatter interface. -// -// %s lists source files for each Frame in the stack -// %v lists the source file and line number for each Frame in the stack -// -// Format accepts flags that alter the printing of some verbs, as follows: -// -// %+v Prints filename, function, and line number for each Frame in the stack. -func (st StackTrace) Format(s fmt.State, verb rune) { - switch verb { - case 'v': - switch { - case s.Flag('+'): - for _, f := range st { - fmt.Fprintf(s, "\n%+v", f) - } - case s.Flag('#'): - fmt.Fprintf(s, "%#v", []Frame(st)) - default: - fmt.Fprintf(s, "%v", []Frame(st)) - } - case 's': - fmt.Fprintf(s, "%s", []Frame(st)) - } -} - -// stack represents a stack of program counters. -type stack []uintptr - -func (s *stack) Format(st fmt.State, verb rune) { - switch verb { - case 'v': - switch { - case st.Flag('+'): - for _, pc := range *s { - f := Frame(pc) - fmt.Fprintf(st, "\n%+v", f) - } - } - } -} - -func (s *stack) StackTrace() StackTrace { - f := make([]Frame, len(*s)) - for i := 0; i < len(f); i++ { - f[i] = Frame((*s)[i]) - } - return f -} - -func callers() *stack { - const depth = 32 - var pcs [depth]uintptr - n := runtime.Callers(3, pcs[:]) - var st stack = pcs[0:n] - return &st -} - -// funcname removes the path prefix component of a function's name reported by func.Name(). -func funcname(name string) string { - i := strings.LastIndex(name, "/") - name = name[i+1:] - i = strings.Index(name, ".") - return name[i+1:] -} - -func trimGOPATH(name, file string) string { - // Here we want to get the source file path relative to the compile time - // GOPATH. As of Go 1.6.x there is no direct way to know the compiled - // GOPATH at runtime, but we can infer the number of path segments in the - // GOPATH. We note that fn.Name() returns the function name qualified by - // the import path, which does not include the GOPATH. Thus we can trim - // segments from the beginning of the file path until the number of path - // separators remaining is one more than the number of path separators in - // the function name. For example, given: - // - // GOPATH /home/user - // file /home/user/src/pkg/sub/file.go - // fn.Name() pkg/sub.Type.Method - // - // We want to produce: - // - // pkg/sub/file.go - // - // From this we can easily see that fn.Name() has one less path separator - // than our desired output. We count separators from the end of the file - // path until it finds two more than in the function name and then move - // one character forward to preserve the initial path segment without a - // leading separator. - const sep = "/" - goal := strings.Count(name, sep) + 2 - i := len(file) - for n := 0; n < goal; n++ { - i = strings.LastIndex(file[:i], sep) - if i == -1 { - // not enough separators found, set i so that the slice expression - // below leaves file unmodified - i = -len(sep) - break - } - } - // get back to 0 or trim the leading separator - file = file[i+len(sep):] - return file -} diff --git a/vendor/github.com/pmezard/go-difflib/LICENSE b/vendor/github.com/pmezard/go-difflib/LICENSE deleted file mode 100644 index c67dad612a3d..000000000000 --- a/vendor/github.com/pmezard/go-difflib/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -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 deleted file mode 100644 index 003e99fadb4f..000000000000 --- a/vendor/github.com/pmezard/go-difflib/difflib/difflib.go +++ /dev/null @@ -1,772 +0,0 @@ -// 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 deleted file mode 100644 index 261eeb9e9f8b..000000000000 --- a/vendor/github.com/prometheus/prometheus/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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 deleted file mode 100644 index 47de2415e1b6..000000000000 --- a/vendor/github.com/prometheus/prometheus/NOTICE +++ /dev/null @@ -1,87 +0,0 @@ -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 deleted file mode 100644 index 5dc22a2fae8f..000000000000 --- a/vendor/github.com/prometheus/prometheus/util/flock/flock.go +++ /dev/null @@ -1,46 +0,0 @@ -// 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 deleted file mode 100644 index 004e85c0fe4a..000000000000 --- a/vendor/github.com/prometheus/prometheus/util/flock/flock_plan9.go +++ /dev/null @@ -1,32 +0,0 @@ -// 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 deleted file mode 100644 index 299fc874465f..000000000000 --- a/vendor/github.com/prometheus/prometheus/util/flock/flock_solaris.go +++ /dev/null @@ -1,59 +0,0 @@ -// 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 deleted file mode 100644 index 7d71f8fc095a..000000000000 --- a/vendor/github.com/prometheus/prometheus/util/flock/flock_unix.go +++ /dev/null @@ -1,54 +0,0 @@ -// 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 deleted file mode 100644 index bf7266f14ca1..000000000000 --- a/vendor/github.com/prometheus/prometheus/util/flock/flock_windows.go +++ /dev/null @@ -1,36 +0,0 @@ -// 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/rjeczalik/notify/AUTHORS b/vendor/github.com/rjeczalik/notify/AUTHORS deleted file mode 100644 index 9262eae69db9..000000000000 --- a/vendor/github.com/rjeczalik/notify/AUTHORS +++ /dev/null @@ -1,10 +0,0 @@ -# List of individuals who contributed to the Notify package. -# -# The up-to-date list of the authors one may obtain with: -# -# ~ $ git shortlog -es | cut -f2 | rev | uniq -f1 | rev -# - -Pawel Blaszczyk -Pawel Knap -Rafal Jeczalik diff --git a/vendor/github.com/rjeczalik/notify/LICENSE b/vendor/github.com/rjeczalik/notify/LICENSE deleted file mode 100644 index 3e678817bf71..000000000000 --- a/vendor/github.com/rjeczalik/notify/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2015 The Notify Authors - -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/rjeczalik/notify/README.md b/vendor/github.com/rjeczalik/notify/README.md deleted file mode 100644 index ad743b2a2440..000000000000 --- a/vendor/github.com/rjeczalik/notify/README.md +++ /dev/null @@ -1,22 +0,0 @@ -notify [![GoDoc](https://godoc.org/github.com/rjeczalik/notify?status.svg)](https://godoc.org/github.com/rjeczalik/notify) [![Build Status](https://img.shields.io/travis/rjeczalik/notify/master.svg)](https://travis-ci.org/rjeczalik/notify "inotify + FSEvents + kqueue") [![Build status](https://img.shields.io/appveyor/ci/rjeczalik/notify-246.svg)](https://ci.appveyor.com/project/rjeczalik/notify-246 "ReadDirectoryChangesW") [![Coverage Status](https://img.shields.io/coveralls/rjeczalik/notify/master.svg)](https://coveralls.io/r/rjeczalik/notify?branch=master) -====== - -Filesystem event notification library on steroids. (under active development) - -*Documentation* - -[godoc.org/github.com/rjeczalik/notify](https://godoc.org/github.com/rjeczalik/notify) - -*Installation* - -``` -~ $ go get -u github.com/rjeczalik/notify -``` - -*Projects using notify* - -- [github.com/rjeczalik/cmd/notify](https://godoc.org/github.com/rjeczalik/cmd/notify) -- [github.com/cortesi/devd](https://github.com/cortesi/devd) -- [github.com/cortesi/modd](https://github.com/cortesi/modd) -- [github.com/syncthing/syncthing-inotify](https://github.com/syncthing/syncthing-inotify) -- [github.com/OrlovEvgeny/TinyJPG](https://github.com/OrlovEvgeny/TinyJPG) diff --git a/vendor/github.com/rjeczalik/notify/appveyor.yml b/vendor/github.com/rjeczalik/notify/appveyor.yml deleted file mode 100644 index a0bdc37a389a..000000000000 --- a/vendor/github.com/rjeczalik/notify/appveyor.yml +++ /dev/null @@ -1,27 +0,0 @@ -version: "{build}" - -os: Windows Server 2012 R2 - -clone_folder: c:\projects\src\github.com\rjeczalik\notify - -environment: - PATH: c:\projects\bin;%PATH% - GOPATH: c:\projects - NOTIFY_TIMEOUT: 10s - GOVERSION: 1.10.3 - -install: - - rmdir c:\go /s /q - - appveyor DownloadFile https://storage.googleapis.com/golang/go%GOVERSION%.windows-amd64.zip - - 7z x go%GOVERSION%.windows-amd64.zip -y -oC:\ > NUL - - - cd %APPVEYOR_BUILD_FOLDER% - - go version - -build_script: - - go build ./... - - go test -v -timeout 120s -race ./... - -test: off - -deploy: off diff --git a/vendor/github.com/rjeczalik/notify/debug.go b/vendor/github.com/rjeczalik/notify/debug.go deleted file mode 100644 index 2a3eb33700ec..000000000000 --- a/vendor/github.com/rjeczalik/notify/debug.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -package notify - -import ( - "log" - "os" - "runtime" - "strings" -) - -var dbgprint func(...interface{}) - -var dbgprintf func(string, ...interface{}) - -var dbgcallstack func(max int) []string - -func init() { - if _, ok := os.LookupEnv("NOTIFY_DEBUG"); ok || debugTag { - log.SetOutput(os.Stdout) - log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds) - dbgprint = func(v ...interface{}) { - v = append([]interface{}{"[D] "}, v...) - log.Println(v...) - } - dbgprintf = func(format string, v ...interface{}) { - format = "[D] " + format - log.Printf(format, v...) - } - dbgcallstack = func(max int) []string { - pc, stack := make([]uintptr, max), make([]string, 0, max) - runtime.Callers(2, pc) - for _, pc := range pc { - if f := runtime.FuncForPC(pc); f != nil { - fname := f.Name() - idx := strings.LastIndex(fname, string(os.PathSeparator)) - if idx != -1 { - stack = append(stack, fname[idx+1:]) - } else { - stack = append(stack, fname) - } - } - } - return stack - } - return - } - dbgprint = func(v ...interface{}) {} - dbgprintf = func(format string, v ...interface{}) {} - dbgcallstack = func(max int) []string { return nil } -} diff --git a/vendor/github.com/rjeczalik/notify/debug_debug.go b/vendor/github.com/rjeczalik/notify/debug_debug.go deleted file mode 100644 index 9d234cedda4f..000000000000 --- a/vendor/github.com/rjeczalik/notify/debug_debug.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright (c) 2014-2018 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build debug - -package notify - -var debugTag = true diff --git a/vendor/github.com/rjeczalik/notify/debug_nodebug.go b/vendor/github.com/rjeczalik/notify/debug_nodebug.go deleted file mode 100644 index 9ebf880d880b..000000000000 --- a/vendor/github.com/rjeczalik/notify/debug_nodebug.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright (c) 2014-2018 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build !debug - -package notify - -var debugTag = false diff --git a/vendor/github.com/rjeczalik/notify/doc.go b/vendor/github.com/rjeczalik/notify/doc.go deleted file mode 100644 index 60543c0838b7..000000000000 --- a/vendor/github.com/rjeczalik/notify/doc.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// Package notify implements access to filesystem events. -// -// Notify is a high-level abstraction over filesystem watchers like inotify, -// kqueue, FSEvents, FEN or ReadDirectoryChangesW. Watcher implementations are -// split into two groups: ones that natively support recursive notifications -// (FSEvents and ReadDirectoryChangesW) and ones that do not (inotify, kqueue, FEN). -// For more details see watcher and recursiveWatcher interfaces in watcher.go -// source file. -// -// On top of filesystem watchers notify maintains a watchpoint tree, which provides -// a strategy for creating and closing filesystem watches and dispatching filesystem -// events to user channels. -// -// An event set is just an event list joint using bitwise OR operator -// into a single event value. -// Both the platform-independent (see Constants) and specific events can be used. -// Refer to the event_*.go source files for information about the available -// events. -// -// A filesystem watch or just a watch is platform-specific entity which represents -// a single path registered for notifications for specific event set. Setting a watch -// means using platform-specific API calls for creating / initializing said watch. -// For each watcher the API call is: -// -// - FSEvents: FSEventStreamCreate -// - inotify: notify_add_watch -// - kqueue: kevent -// - ReadDirectoryChangesW: CreateFile+ReadDirectoryChangesW -// - FEN: port_get -// -// To rewatch means to either shrink or expand an event set that was previously -// registered during watch operation for particular filesystem watch. -// -// A watchpoint is a list of user channel and event set pairs for particular -// path (watchpoint tree's node). A single watchpoint can contain multiple -// different user channels registered to listen for one or more events. A single -// user channel can be registered in one or more watchpoints, recursive and -// non-recursive ones as well. -package notify diff --git a/vendor/github.com/rjeczalik/notify/event.go b/vendor/github.com/rjeczalik/notify/event.go deleted file mode 100644 index c128841972a7..000000000000 --- a/vendor/github.com/rjeczalik/notify/event.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -package notify - -import ( - "fmt" - "strings" -) - -// Event represents the type of filesystem action. -// -// Number of available event values is dependent on the target system or the -// watcher implmenetation used (e.g. it's possible to use either kqueue or -// FSEvents on Darwin). -// -// Please consult documentation for your target platform to see list of all -// available events. -type Event uint32 - -// Create, Remove, Write and Rename are the only event values guaranteed to be -// present on all platforms. -const ( - Create = osSpecificCreate - Remove = osSpecificRemove - Write = osSpecificWrite - Rename = osSpecificRename - - // All is handful alias for all platform-independent event values. - All = Create | Remove | Write | Rename -) - -const internal = recursive | omit - -// String implements fmt.Stringer interface. -func (e Event) String() string { - var s []string - for _, strmap := range []map[Event]string{estr, osestr} { - for ev, str := range strmap { - if e&ev == ev { - s = append(s, str) - } - } - } - return strings.Join(s, "|") -} - -// EventInfo describes an event reported by the underlying filesystem notification -// subsystem. -// -// It always describes single event, even if the OS reported a coalesced action. -// Reported path is absolute and clean. -// -// For non-recursive watchpoints its base is always equal to the path passed -// to corresponding Watch call. -// -// The value of Sys if system-dependent and can be nil. -// -// Sys -// -// Under Darwin (FSEvents) Sys() always returns a non-nil *notify.FSEvent value, -// which is defined as: -// -// type FSEvent struct { -// Path string // real path of the file or directory -// ID uint64 // ID of the event (FSEventStreamEventId) -// Flags uint32 // joint FSEvents* flags (FSEventStreamEventFlags) -// } -// -// For possible values of Flags see Darwin godoc for notify or FSEvents -// documentation for FSEventStreamEventFlags constants: -// -// https://developer.apple.com/library/mac/documentation/Darwin/Reference/FSEvents_Ref/index.html#//apple_ref/doc/constant_group/FSEventStreamEventFlags -// -// Under Linux (inotify) Sys() always returns a non-nil *unix.InotifyEvent -// value, defined as: -// -// type InotifyEvent struct { -// Wd int32 // Watch descriptor -// Mask uint32 // Mask describing event -// Cookie uint32 // Unique cookie associating related events (for rename(2)) -// Len uint32 // Size of name field -// Name [0]uint8 // Optional null-terminated name -// } -// -// More information about inotify masks and the usage of inotify_event structure -// can be found at: -// -// http://man7.org/linux/man-pages/man7/inotify.7.html -// -// Under Darwin, DragonFlyBSD, FreeBSD, NetBSD, OpenBSD (kqueue) Sys() always -// returns a non-nil *notify.Kevent value, which is defined as: -// -// type Kevent struct { -// Kevent *syscall.Kevent_t // Kevent is a kqueue specific structure -// FI os.FileInfo // FI describes file/dir -// } -// -// More information about syscall.Kevent_t can be found at: -// -// https://www.freebsd.org/cgi/man.cgi?query=kqueue -// -// Under Windows (ReadDirectoryChangesW) Sys() always returns nil. The documentation -// of watcher's WinAPI function can be found at: -// -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365465%28v=vs.85%29.aspx -type EventInfo interface { - Event() Event // event value for the filesystem action - Path() string // real path of the file or directory - Sys() interface{} // underlying data source (can return nil) -} - -type isDirer interface { - isDir() (bool, error) -} - -var _ fmt.Stringer = (*event)(nil) -var _ isDirer = (*event)(nil) - -// String implements fmt.Stringer interface. -func (e *event) String() string { - return e.Event().String() + `: "` + e.Path() + `"` -} - -var estr = map[Event]string{ - Create: "notify.Create", - Remove: "notify.Remove", - Write: "notify.Write", - Rename: "notify.Rename", - // Display name for recursive event is added only for debugging - // purposes. It's an internal event after all and won't be exposed to the - // user. Having Recursive event printable is helpful, e.g. for reading - // testing failure messages: - // - // --- FAIL: TestWatchpoint (0.00 seconds) - // watchpoint_test.go:64: want diff=[notify.Remove notify.Create|notify.Remove]; - // got [notify.Remove notify.Remove|notify.Create] (i=1) - // - // Yup, here the diff have Recursive event inside. Go figure. - recursive: "recursive", - omit: "omit", -} diff --git a/vendor/github.com/rjeczalik/notify/event_fen.go b/vendor/github.com/rjeczalik/notify/event_fen.go deleted file mode 100644 index 767f04fa8763..000000000000 --- a/vendor/github.com/rjeczalik/notify/event_fen.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build solaris - -package notify - -const ( - osSpecificCreate Event = 0x00000100 << iota - osSpecificRemove - osSpecificWrite - osSpecificRename - // internal - // recursive is used to distinguish recursive eventsets from non-recursive ones - recursive - // omit is used for dispatching internal events; only those events are sent - // for which both the event and the watchpoint has omit in theirs event sets. - omit -) - -const ( - // FileAccess is an event reported when monitored file/directory was accessed. - FileAccess = fileAccess - // FileModified is an event reported when monitored file/directory was modified. - FileModified = fileModified - // FileAttrib is an event reported when monitored file/directory's ATTRIB - // was changed. - FileAttrib = fileAttrib - // FileDelete is an event reported when monitored file/directory was deleted. - FileDelete = fileDelete - // FileRenameTo to is an event reported when monitored file/directory was renamed. - FileRenameTo = fileRenameTo - // FileRenameFrom is an event reported when monitored file/directory was renamed. - FileRenameFrom = fileRenameFrom - // FileTrunc is an event reported when monitored file/directory was truncated. - FileTrunc = fileTrunc - // FileNoFollow is an flag to indicate not to follow symbolic links. - FileNoFollow = fileNoFollow - // Unmounted is an event reported when monitored filesystem was unmounted. - Unmounted = unmounted - // MountedOver is an event reported when monitored file/directory was mounted on. - MountedOver = mountedOver -) - -var osestr = map[Event]string{ - FileAccess: "notify.FileAccess", - FileModified: "notify.FileModified", - FileAttrib: "notify.FileAttrib", - FileDelete: "notify.FileDelete", - FileRenameTo: "notify.FileRenameTo", - FileRenameFrom: "notify.FileRenameFrom", - FileTrunc: "notify.FileTrunc", - FileNoFollow: "notify.FileNoFollow", - Unmounted: "notify.Unmounted", - MountedOver: "notify.MountedOver", -} diff --git a/vendor/github.com/rjeczalik/notify/event_fsevents.go b/vendor/github.com/rjeczalik/notify/event_fsevents.go deleted file mode 100644 index 6ded80b2c6d1..000000000000 --- a/vendor/github.com/rjeczalik/notify/event_fsevents.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build darwin,!kqueue - -package notify - -const ( - osSpecificCreate = Event(FSEventsCreated) - osSpecificRemove = Event(FSEventsRemoved) - osSpecificWrite = Event(FSEventsModified) - osSpecificRename = Event(FSEventsRenamed) - // internal = Event(0x100000) - // recursive is used to distinguish recursive eventsets from non-recursive ones - recursive = Event(0x200000) - // omit is used for dispatching internal events; only those events are sent - // for which both the event and the watchpoint has omit in theirs event sets. - omit = Event(0x400000) -) - -// FSEvents specific event values. -const ( - FSEventsMustScanSubDirs Event = 0x00001 - FSEventsUserDropped = 0x00002 - FSEventsKernelDropped = 0x00004 - FSEventsEventIdsWrapped = 0x00008 - FSEventsHistoryDone = 0x00010 - FSEventsRootChanged = 0x00020 - FSEventsMount = 0x00040 - FSEventsUnmount = 0x00080 - FSEventsCreated = 0x00100 - FSEventsRemoved = 0x00200 - FSEventsInodeMetaMod = 0x00400 - FSEventsRenamed = 0x00800 - FSEventsModified = 0x01000 - FSEventsFinderInfoMod = 0x02000 - FSEventsChangeOwner = 0x04000 - FSEventsXattrMod = 0x08000 - FSEventsIsFile = 0x10000 - FSEventsIsDir = 0x20000 - FSEventsIsSymlink = 0x40000 -) - -var osestr = map[Event]string{ - FSEventsMustScanSubDirs: "notify.FSEventsMustScanSubDirs", - FSEventsUserDropped: "notify.FSEventsUserDropped", - FSEventsKernelDropped: "notify.FSEventsKernelDropped", - FSEventsEventIdsWrapped: "notify.FSEventsEventIdsWrapped", - FSEventsHistoryDone: "notify.FSEventsHistoryDone", - FSEventsRootChanged: "notify.FSEventsRootChanged", - FSEventsMount: "notify.FSEventsMount", - FSEventsUnmount: "notify.FSEventsUnmount", - FSEventsInodeMetaMod: "notify.FSEventsInodeMetaMod", - FSEventsFinderInfoMod: "notify.FSEventsFinderInfoMod", - FSEventsChangeOwner: "notify.FSEventsChangeOwner", - FSEventsXattrMod: "notify.FSEventsXattrMod", - FSEventsIsFile: "notify.FSEventsIsFile", - FSEventsIsDir: "notify.FSEventsIsDir", - FSEventsIsSymlink: "notify.FSEventsIsSymlink", -} - -type event struct { - fse FSEvent - event Event -} - -func (ei *event) Event() Event { return ei.event } -func (ei *event) Path() string { return ei.fse.Path } -func (ei *event) Sys() interface{} { return &ei.fse } -func (ei *event) isDir() (bool, error) { return ei.fse.Flags&FSEventsIsDir != 0, nil } diff --git a/vendor/github.com/rjeczalik/notify/event_inotify.go b/vendor/github.com/rjeczalik/notify/event_inotify.go deleted file mode 100644 index 1f32bb73e0f2..000000000000 --- a/vendor/github.com/rjeczalik/notify/event_inotify.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build linux - -package notify - -import "golang.org/x/sys/unix" - -// Platform independent event values. -const ( - osSpecificCreate Event = 0x100000 << iota - osSpecificRemove - osSpecificWrite - osSpecificRename - // internal - // recursive is used to distinguish recursive eventsets from non-recursive ones - recursive - // omit is used for dispatching internal events; only those events are sent - // for which both the event and the watchpoint has omit in theirs event sets. - omit -) - -// Inotify specific masks are legal, implemented events that are guaranteed to -// work with notify package on linux-based systems. -const ( - InAccess = Event(unix.IN_ACCESS) // File was accessed - InModify = Event(unix.IN_MODIFY) // File was modified - InAttrib = Event(unix.IN_ATTRIB) // Metadata changed - InCloseWrite = Event(unix.IN_CLOSE_WRITE) // Writtable file was closed - InCloseNowrite = Event(unix.IN_CLOSE_NOWRITE) // Unwrittable file closed - InOpen = Event(unix.IN_OPEN) // File was opened - InMovedFrom = Event(unix.IN_MOVED_FROM) // File was moved from X - InMovedTo = Event(unix.IN_MOVED_TO) // File was moved to Y - InCreate = Event(unix.IN_CREATE) // Subfile was created - InDelete = Event(unix.IN_DELETE) // Subfile was deleted - InDeleteSelf = Event(unix.IN_DELETE_SELF) // Self was deleted - InMoveSelf = Event(unix.IN_MOVE_SELF) // Self was moved -) - -var osestr = map[Event]string{ - InAccess: "notify.InAccess", - InModify: "notify.InModify", - InAttrib: "notify.InAttrib", - InCloseWrite: "notify.InCloseWrite", - InCloseNowrite: "notify.InCloseNowrite", - InOpen: "notify.InOpen", - InMovedFrom: "notify.InMovedFrom", - InMovedTo: "notify.InMovedTo", - InCreate: "notify.InCreate", - InDelete: "notify.InDelete", - InDeleteSelf: "notify.InDeleteSelf", - InMoveSelf: "notify.InMoveSelf", -} - -// Inotify behavior events are not **currently** supported by notify package. -const ( - inDontFollow = Event(unix.IN_DONT_FOLLOW) - inExclUnlink = Event(unix.IN_EXCL_UNLINK) - inMaskAdd = Event(unix.IN_MASK_ADD) - inOneshot = Event(unix.IN_ONESHOT) - inOnlydir = Event(unix.IN_ONLYDIR) -) - -type event struct { - sys unix.InotifyEvent - path string - event Event -} - -func (e *event) Event() Event { return e.event } -func (e *event) Path() string { return e.path } -func (e *event) Sys() interface{} { return &e.sys } -func (e *event) isDir() (bool, error) { return e.sys.Mask&unix.IN_ISDIR != 0, nil } diff --git a/vendor/github.com/rjeczalik/notify/event_kqueue.go b/vendor/github.com/rjeczalik/notify/event_kqueue.go deleted file mode 100644 index 422ac87f66fa..000000000000 --- a/vendor/github.com/rjeczalik/notify/event_kqueue.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build darwin,kqueue dragonfly freebsd netbsd openbsd - -package notify - -import "syscall" - -// TODO(pblaszczyk): ensure in runtime notify built-in event values do not -// overlap with platform-defined ones. - -// Platform independent event values. -const ( - osSpecificCreate Event = 0x0100 << iota - osSpecificRemove - osSpecificWrite - osSpecificRename - // internal - // recursive is used to distinguish recursive eventsets from non-recursive ones - recursive - // omit is used for dispatching internal events; only those events are sent - // for which both the event and the watchpoint has omit in theirs event sets. - omit -) - -const ( - // NoteDelete is an event reported when the unlink() system call was called - // on the file referenced by the descriptor. - NoteDelete = Event(syscall.NOTE_DELETE) - // NoteWrite is an event reported when a write occurred on the file - // referenced by the descriptor. - NoteWrite = Event(syscall.NOTE_WRITE) - // NoteExtend is an event reported when the file referenced by the - // descriptor was extended. - NoteExtend = Event(syscall.NOTE_EXTEND) - // NoteAttrib is an event reported when the file referenced - // by the descriptor had its attributes changed. - NoteAttrib = Event(syscall.NOTE_ATTRIB) - // NoteLink is an event reported when the link count on the file changed. - NoteLink = Event(syscall.NOTE_LINK) - // NoteRename is an event reported when the file referenced - // by the descriptor was renamed. - NoteRename = Event(syscall.NOTE_RENAME) - // NoteRevoke is an event reported when access to the file was revoked via - // revoke(2) or the underlying file system was unmounted. - NoteRevoke = Event(syscall.NOTE_REVOKE) -) - -var osestr = map[Event]string{ - NoteDelete: "notify.NoteDelete", - NoteWrite: "notify.NoteWrite", - NoteExtend: "notify.NoteExtend", - NoteAttrib: "notify.NoteAttrib", - NoteLink: "notify.NoteLink", - NoteRename: "notify.NoteRename", - NoteRevoke: "notify.NoteRevoke", -} diff --git a/vendor/github.com/rjeczalik/notify/event_readdcw.go b/vendor/github.com/rjeczalik/notify/event_readdcw.go deleted file mode 100644 index f7b82de0c4ab..000000000000 --- a/vendor/github.com/rjeczalik/notify/event_readdcw.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build windows - -package notify - -import ( - "os" - "path/filepath" - "syscall" -) - -// Platform independent event values. -const ( - osSpecificCreate Event = 1 << (20 + iota) - osSpecificRemove - osSpecificWrite - osSpecificRename - // recursive is used to distinguish recursive eventsets from non-recursive ones - recursive - // omit is used for dispatching internal events; only those events are sent - // for which both the event and the watchpoint has omit in theirs event sets. - omit - // dirmarker TODO(pknap) - dirmarker -) - -// ReadDirectoryChangesW filters -// On Windows the following events can be passed to Watch. A different set of -// events (see actions below) are received on the channel passed to Watch. -// For more information refer to -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa365465(v=vs.85).aspx -const ( - FileNotifyChangeFileName = Event(syscall.FILE_NOTIFY_CHANGE_FILE_NAME) - FileNotifyChangeDirName = Event(syscall.FILE_NOTIFY_CHANGE_DIR_NAME) - FileNotifyChangeAttributes = Event(syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES) - FileNotifyChangeSize = Event(syscall.FILE_NOTIFY_CHANGE_SIZE) - FileNotifyChangeLastWrite = Event(syscall.FILE_NOTIFY_CHANGE_LAST_WRITE) - FileNotifyChangeLastAccess = Event(syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS) - FileNotifyChangeCreation = Event(syscall.FILE_NOTIFY_CHANGE_CREATION) - FileNotifyChangeSecurity = Event(syscallFileNotifyChangeSecurity) -) - -const ( - fileNotifyChangeAll = 0x17f // logical sum of all FileNotifyChange* events. - fileNotifyChangeModified = fileNotifyChangeAll &^ (FileNotifyChangeFileName | FileNotifyChangeDirName) -) - -// according to: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365465(v=vs.85).aspx -// this flag should be declared in: http://golang.org/src/pkg/syscall/ztypes_windows.go -const syscallFileNotifyChangeSecurity = 0x00000100 - -// ReadDirectoryChangesW actions -// The following events are returned on the channel passed to Watch, but cannot -// be passed to Watch itself (see filters above). You can find a table showing -// the relation between actions and filteres at -// https://github.com/rjeczalik/notify/issues/10#issuecomment-66179535 -// The msdn documentation on actions is part of -// https://msdn.microsoft.com/en-us/library/windows/desktop/aa364391(v=vs.85).aspx -const ( - FileActionAdded = Event(syscall.FILE_ACTION_ADDED) << 12 - FileActionRemoved = Event(syscall.FILE_ACTION_REMOVED) << 12 - FileActionModified = Event(syscall.FILE_ACTION_MODIFIED) << 14 - FileActionRenamedOldName = Event(syscall.FILE_ACTION_RENAMED_OLD_NAME) << 15 - FileActionRenamedNewName = Event(syscall.FILE_ACTION_RENAMED_NEW_NAME) << 16 -) - -const fileActionAll = 0x7f000 // logical sum of all FileAction* events. - -var osestr = map[Event]string{ - FileNotifyChangeFileName: "notify.FileNotifyChangeFileName", - FileNotifyChangeDirName: "notify.FileNotifyChangeDirName", - FileNotifyChangeAttributes: "notify.FileNotifyChangeAttributes", - FileNotifyChangeSize: "notify.FileNotifyChangeSize", - FileNotifyChangeLastWrite: "notify.FileNotifyChangeLastWrite", - FileNotifyChangeLastAccess: "notify.FileNotifyChangeLastAccess", - FileNotifyChangeCreation: "notify.FileNotifyChangeCreation", - FileNotifyChangeSecurity: "notify.FileNotifyChangeSecurity", - - FileActionAdded: "notify.FileActionAdded", - FileActionRemoved: "notify.FileActionRemoved", - FileActionModified: "notify.FileActionModified", - FileActionRenamedOldName: "notify.FileActionRenamedOldName", - FileActionRenamedNewName: "notify.FileActionRenamedNewName", -} - -const ( - fTypeUnknown uint8 = iota - fTypeFile - fTypeDirectory -) - -// TODO(ppknap) : doc. -type event struct { - pathw []uint16 - name string - ftype uint8 - action uint32 - filter uint32 - e Event -} - -func (e *event) Event() Event { return e.e } -func (e *event) Path() string { return filepath.Join(syscall.UTF16ToString(e.pathw), e.name) } -func (e *event) Sys() interface{} { return e.ftype } - -func (e *event) isDir() (bool, error) { - if e.ftype != fTypeUnknown { - return e.ftype == fTypeDirectory, nil - } - fi, err := os.Stat(e.Path()) - if err != nil { - return false, err - } - return fi.IsDir(), nil -} diff --git a/vendor/github.com/rjeczalik/notify/event_stub.go b/vendor/github.com/rjeczalik/notify/event_stub.go deleted file mode 100644 index faac7c7cb5a6..000000000000 --- a/vendor/github.com/rjeczalik/notify/event_stub.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build !darwin,!linux,!freebsd,!dragonfly,!netbsd,!openbsd,!windows -// +build !kqueue,!solaris - -package notify - -// Platform independent event values. -const ( - osSpecificCreate Event = 1 << iota - osSpecificRemove - osSpecificWrite - osSpecificRename - // internal - // recursive is used to distinguish recursive eventsets from non-recursive ones - recursive - // omit is used for dispatching internal events; only those events are sent - // for which both the event and the watchpoint has omit in theirs event sets. - omit -) - -var osestr = map[Event]string{} - -type event struct{} - -func (e *event) Event() (_ Event) { return } -func (e *event) Path() (_ string) { return } -func (e *event) Sys() (_ interface{}) { return } -func (e *event) isDir() (_ bool, _ error) { return } diff --git a/vendor/github.com/rjeczalik/notify/event_trigger.go b/vendor/github.com/rjeczalik/notify/event_trigger.go deleted file mode 100644 index 94470fd37942..000000000000 --- a/vendor/github.com/rjeczalik/notify/event_trigger.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build darwin,kqueue dragonfly freebsd netbsd openbsd solaris - -package notify - -type event struct { - p string - e Event - d bool - pe interface{} -} - -func (e *event) Event() Event { return e.e } - -func (e *event) Path() string { return e.p } - -func (e *event) Sys() interface{} { return e.pe } - -func (e *event) isDir() (bool, error) { return e.d, nil } diff --git a/vendor/github.com/rjeczalik/notify/node.go b/vendor/github.com/rjeczalik/notify/node.go deleted file mode 100644 index aced8b9c44a1..000000000000 --- a/vendor/github.com/rjeczalik/notify/node.go +++ /dev/null @@ -1,275 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -package notify - -import ( - "errors" - "io/ioutil" - "os" - "path/filepath" -) - -var errSkip = errors.New("notify: skip") - -type walkPathFunc func(nd node, isbase bool) error - -type walkFunc func(node) error - -func errnotexist(name string) error { - return &os.PathError{ - Op: "Node", - Path: name, - Err: os.ErrNotExist, - } -} - -type node struct { - Name string - Watch watchpoint - Child map[string]node -} - -func newnode(name string) node { - return node{ - Name: name, - Watch: make(watchpoint), - Child: make(map[string]node), - } -} - -func (nd node) addchild(name, base string) node { - child, ok := nd.Child[base] - if !ok { - child = newnode(name) - nd.Child[base] = child - } - return child -} - -func (nd node) Add(name string) node { - i := indexbase(nd.Name, name) - if i == -1 { - return node{} - } - for j := indexSep(name[i:]); j != -1; j = indexSep(name[i:]) { - nd = nd.addchild(name[:i+j], name[i:i+j]) - i += j + 1 - } - return nd.addchild(name, name[i:]) -} - -func (nd node) AddDir(fn walkFunc) error { - stack := []node{nd} -Traverse: - for n := len(stack); n != 0; n = len(stack) { - nd, stack = stack[n-1], stack[:n-1] - switch err := fn(nd); err { - case nil: - case errSkip: - continue Traverse - default: - return &os.PathError{ - Op: "error while traversing", - Path: nd.Name, - Err: err, - } - } - // TODO(rjeczalik): tolerate open failures - add failed names to - // AddDirError and notify users which names are not added to the tree. - fi, err := ioutil.ReadDir(nd.Name) - if err != nil { - return err - } - for _, fi := range fi { - if fi.Mode()&(os.ModeSymlink|os.ModeDir) == os.ModeDir { - name := filepath.Join(nd.Name, fi.Name()) - stack = append(stack, nd.addchild(name, name[len(nd.Name)+1:])) - } - } - } - return nil -} - -func (nd node) Get(name string) (node, error) { - i := indexbase(nd.Name, name) - if i == -1 { - return node{}, errnotexist(name) - } - ok := false - for j := indexSep(name[i:]); j != -1; j = indexSep(name[i:]) { - if nd, ok = nd.Child[name[i:i+j]]; !ok { - return node{}, errnotexist(name) - } - i += j + 1 - } - if nd, ok = nd.Child[name[i:]]; !ok { - return node{}, errnotexist(name) - } - return nd, nil -} - -func (nd node) Del(name string) error { - i := indexbase(nd.Name, name) - if i == -1 { - return errnotexist(name) - } - stack := []node{nd} - ok := false - for j := indexSep(name[i:]); j != -1; j = indexSep(name[i:]) { - if nd, ok = nd.Child[name[i:i+j]]; !ok { - return errnotexist(name[:i+j]) - } - stack = append(stack, nd) - } - if nd, ok = nd.Child[name[i:]]; !ok { - return errnotexist(name) - } - nd.Child = nil - nd.Watch = nil - for name, i = base(nd.Name), len(stack); i != 0; name, i = base(nd.Name), i-1 { - nd = stack[i-1] - if nd := nd.Child[name]; len(nd.Watch) > 1 || len(nd.Child) != 0 { - break - } else { - nd.Child = nil - nd.Watch = nil - } - delete(nd.Child, name) - } - return nil -} - -func (nd node) Walk(fn walkFunc) error { - stack := []node{nd} -Traverse: - for n := len(stack); n != 0; n = len(stack) { - nd, stack = stack[n-1], stack[:n-1] - switch err := fn(nd); err { - case nil: - case errSkip: - continue Traverse - default: - return err - } - for name, nd := range nd.Child { - if name == "" { - // Node storing inactive watchpoints has empty name, skip it - // form traversing. Root node has also an empty name, but it - // never has a parent node. - continue - } - stack = append(stack, nd) - } - } - return nil -} - -func (nd node) WalkPath(name string, fn walkPathFunc) error { - i := indexbase(nd.Name, name) - if i == -1 { - return errnotexist(name) - } - ok := false - for j := indexSep(name[i:]); j != -1; j = indexSep(name[i:]) { - switch err := fn(nd, false); err { - case nil: - case errSkip: - return nil - default: - return err - } - if nd, ok = nd.Child[name[i:i+j]]; !ok { - return errnotexist(name[:i+j]) - } - i += j + 1 - } - switch err := fn(nd, false); err { - case nil: - case errSkip: - return nil - default: - return err - } - if nd, ok = nd.Child[name[i:]]; !ok { - return errnotexist(name) - } - switch err := fn(nd, true); err { - case nil, errSkip: - return nil - default: - return err - } -} - -type root struct { - nd node -} - -func (r root) addroot(name string) node { - if vol := filepath.VolumeName(name); vol != "" { - root, ok := r.nd.Child[vol] - if !ok { - root = r.nd.addchild(vol, vol) - } - return root - } - return r.nd -} - -func (r root) root(name string) (node, error) { - if vol := filepath.VolumeName(name); vol != "" { - nd, ok := r.nd.Child[vol] - if !ok { - return node{}, errnotexist(name) - } - return nd, nil - } - return r.nd, nil -} - -func (r root) Add(name string) node { - return r.addroot(name).Add(name) -} - -func (r root) AddDir(dir string, fn walkFunc) error { - return r.Add(dir).AddDir(fn) -} - -func (r root) Del(name string) error { - nd, err := r.root(name) - if err != nil { - return err - } - return nd.Del(name) -} - -func (r root) Get(name string) (node, error) { - nd, err := r.root(name) - if err != nil { - return node{}, err - } - if nd.Name != name { - if nd, err = nd.Get(name); err != nil { - return node{}, err - } - } - return nd, nil -} - -func (r root) Walk(name string, fn walkFunc) error { - nd, err := r.Get(name) - if err != nil { - return err - } - return nd.Walk(fn) -} - -func (r root) WalkPath(name string, fn walkPathFunc) error { - nd, err := r.root(name) - if err != nil { - return err - } - return nd.WalkPath(name, fn) -} diff --git a/vendor/github.com/rjeczalik/notify/notify.go b/vendor/github.com/rjeczalik/notify/notify.go deleted file mode 100644 index 7d2eec3a2471..000000000000 --- a/vendor/github.com/rjeczalik/notify/notify.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// BUG(rjeczalik): Notify does not collect watchpoints, when underlying watches -// were removed by their os-specific watcher implementations. Instead users are -// advised to listen on persistent paths to have guarantee they receive events -// for the whole lifetime of their applications (to discuss see #69). - -// BUG(ppknap): Linux (inotify) does not support watcher behavior masks like -// InOneshot, InOnlydir etc. Instead users are advised to perform the filtering -// themselves (to discuss see #71). - -// BUG(ppknap): Notify was not tested for short path name support under Windows -// (ReadDirectoryChangesW). - -// BUG(ppknap): Windows (ReadDirectoryChangesW) cannot recognize which notification -// triggers FileActionModified event. (to discuss see #75). - -package notify - -var defaultTree = newTree() - -// Watch sets up a watchpoint on path listening for events given by the events -// argument. -// -// File or directory given by the path must exist, otherwise Watch will fail -// with non-nil error. Notify resolves, for its internal purpose, any symlinks -// the provided path may contain, so it may fail if the symlinks form a cycle. -// It does so, since not all watcher implementations treat passed paths as-is. -// E.g. FSEvents reports a real path for every event, setting a watchpoint -// on /tmp will report events with paths rooted at /private/tmp etc. -// -// The c almost always is a buffered channel. Watch will not block sending to c -// - the caller must ensure that c has sufficient buffer space to keep up with -// the expected event rate. -// -// It is allowed to pass the same channel multiple times with different event -// list or different paths. Calling Watch with different event lists for a single -// watchpoint expands its event set. The only way to shrink it, is to call -// Stop on its channel. -// -// Calling Watch with empty event list does expand nor shrink watchpoint's event -// set. If c is the first channel to listen for events on the given path, Watch -// will seamlessly create a watch on the filesystem. -// -// Notify dispatches copies of single filesystem event to all channels registered -// for each path. If a single filesystem event contains multiple coalesced events, -// each of them is dispatched separately. E.g. the following filesystem change: -// -// ~ $ echo Hello > Notify.txt -// -// dispatches two events - notify.Create and notify.Write. However, it may depend -// on the underlying watcher implementation whether OS reports both of them. -// -// Windows and recursive watches -// -// If a directory which path was used to create recursive watch under Windows -// gets deleted, the OS will not report such event. It is advised to keep in -// mind this limitation while setting recursive watchpoints for your application, -// e.g. use persistent paths like %userprofile% or watch additionally parent -// directory of a recursive watchpoint in order to receive delete events for it. -func Watch(path string, c chan<- EventInfo, events ...Event) error { - return defaultTree.Watch(path, c, events...) -} - -// Stop removes all watchpoints registered for c. All underlying watches are -// also removed, for which c was the last channel listening for events. -// -// Stop does not close c. When Stop returns, it is guaranteed that c will -// receive no more signals. -func Stop(c chan<- EventInfo) { - defaultTree.Stop(c) -} diff --git a/vendor/github.com/rjeczalik/notify/tree.go b/vendor/github.com/rjeczalik/notify/tree.go deleted file mode 100644 index cd6afd60d09f..000000000000 --- a/vendor/github.com/rjeczalik/notify/tree.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -package notify - -const buffer = 128 - -type tree interface { - Watch(string, chan<- EventInfo, ...Event) error - Stop(chan<- EventInfo) - Close() error -} - -func newTree() tree { - c := make(chan EventInfo, buffer) - w := newWatcher(c) - if rw, ok := w.(recursiveWatcher); ok { - return newRecursiveTree(rw, c) - } - return newNonrecursiveTree(w, c, make(chan EventInfo, buffer)) -} diff --git a/vendor/github.com/rjeczalik/notify/tree_nonrecursive.go b/vendor/github.com/rjeczalik/notify/tree_nonrecursive.go deleted file mode 100644 index dfa72d1d2dd4..000000000000 --- a/vendor/github.com/rjeczalik/notify/tree_nonrecursive.go +++ /dev/null @@ -1,292 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -package notify - -import "sync" - -// nonrecursiveTree TODO(rjeczalik) -type nonrecursiveTree struct { - rw sync.RWMutex // protects root - root root - w watcher - c chan EventInfo - rec chan EventInfo -} - -// newNonrecursiveTree TODO(rjeczalik) -func newNonrecursiveTree(w watcher, c, rec chan EventInfo) *nonrecursiveTree { - if rec == nil { - rec = make(chan EventInfo, buffer) - } - t := &nonrecursiveTree{ - root: root{nd: newnode("")}, - w: w, - c: c, - rec: rec, - } - go t.dispatch(c) - go t.internal(rec) - return t -} - -// dispatch TODO(rjeczalik) -func (t *nonrecursiveTree) dispatch(c <-chan EventInfo) { - for ei := range c { - dbgprintf("dispatching %v on %q", ei.Event(), ei.Path()) - go func(ei EventInfo) { - var nd node - var isrec bool - dir, base := split(ei.Path()) - fn := func(it node, isbase bool) error { - isrec = isrec || it.Watch.IsRecursive() - if isbase { - nd = it - } else { - it.Watch.Dispatch(ei, recursive) - } - return nil - } - t.rw.RLock() - // Notify recursive watchpoints found on the path. - if err := t.root.WalkPath(dir, fn); err != nil { - dbgprint("dispatch did not reach leaf:", err) - t.rw.RUnlock() - return - } - // Notify parent watchpoint. - nd.Watch.Dispatch(ei, 0) - isrec = isrec || nd.Watch.IsRecursive() - // If leaf watchpoint exists, notify it. - if nd, ok := nd.Child[base]; ok { - isrec = isrec || nd.Watch.IsRecursive() - nd.Watch.Dispatch(ei, 0) - } - t.rw.RUnlock() - // If the event describes newly leaf directory created within - if !isrec || ei.Event() != Create { - return - } - if ok, err := ei.(isDirer).isDir(); !ok || err != nil { - return - } - t.rec <- ei - }(ei) - } -} - -// internal TODO(rjeczalik) -func (t *nonrecursiveTree) internal(rec <-chan EventInfo) { - for ei := range rec { - var nd node - var eset = internal - t.rw.Lock() - t.root.WalkPath(ei.Path(), func(it node, _ bool) error { - if e := it.Watch[t.rec]; e != 0 && e > eset { - eset = e - } - nd = it - return nil - }) - if eset == internal { - t.rw.Unlock() - continue - } - err := nd.Add(ei.Path()).AddDir(t.recFunc(eset)) - t.rw.Unlock() - if err != nil { - dbgprintf("internal(%p) error: %v", rec, err) - } - } -} - -// watchAdd TODO(rjeczalik) -func (t *nonrecursiveTree) watchAdd(nd node, c chan<- EventInfo, e Event) eventDiff { - if e&recursive != 0 { - diff := nd.Watch.Add(t.rec, e|Create|omit) - nd.Watch.Add(c, e) - return diff - } - return nd.Watch.Add(c, e) -} - -// watchDelMin TODO(rjeczalik) -func (t *nonrecursiveTree) watchDelMin(min Event, nd node, c chan<- EventInfo, e Event) eventDiff { - old, ok := nd.Watch[t.rec] - if ok { - nd.Watch[t.rec] = min - } - diff := nd.Watch.Del(c, e) - if ok { - switch old &^= diff[0] &^ diff[1]; { - case old|internal == internal: - delete(nd.Watch, t.rec) - if set, ok := nd.Watch[nil]; ok && len(nd.Watch) == 1 && set == 0 { - delete(nd.Watch, nil) - } - default: - nd.Watch.Add(t.rec, old|Create) - switch { - case diff == none: - case diff[1]|Create == diff[0]: - diff = none - default: - diff[1] |= Create - } - } - } - return diff -} - -// watchDel TODO(rjeczalik) -func (t *nonrecursiveTree) watchDel(nd node, c chan<- EventInfo, e Event) eventDiff { - return t.watchDelMin(0, nd, c, e) -} - -// Watch TODO(rjeczalik) -func (t *nonrecursiveTree) Watch(path string, c chan<- EventInfo, events ...Event) error { - if c == nil { - panic("notify: Watch using nil channel") - } - // Expanding with empty event set is a nop. - if len(events) == 0 { - return nil - } - path, isrec, err := cleanpath(path) - if err != nil { - return err - } - eset := joinevents(events) - t.rw.Lock() - defer t.rw.Unlock() - nd := t.root.Add(path) - if isrec { - return t.watchrec(nd, c, eset|recursive) - } - return t.watch(nd, c, eset) -} - -func (t *nonrecursiveTree) watch(nd node, c chan<- EventInfo, e Event) (err error) { - diff := nd.Watch.Add(c, e) - switch { - case diff == none: - return nil - case diff[1] == 0: - // TODO(rjeczalik): cleanup this panic after implementation is stable - panic("eset is empty: " + nd.Name) - case diff[0] == 0: - err = t.w.Watch(nd.Name, diff[1]) - default: - err = t.w.Rewatch(nd.Name, diff[0], diff[1]) - } - if err != nil { - nd.Watch.Del(c, diff.Event()) - return err - } - return nil -} - -func (t *nonrecursiveTree) recFunc(e Event) walkFunc { - return func(nd node) error { - switch diff := nd.Watch.Add(t.rec, e|omit|Create); { - case diff == none: - case diff[1] == 0: - // TODO(rjeczalik): cleanup this panic after implementation is stable - panic("eset is empty: " + nd.Name) - case diff[0] == 0: - t.w.Watch(nd.Name, diff[1]) - default: - t.w.Rewatch(nd.Name, diff[0], diff[1]) - } - return nil - } -} - -func (t *nonrecursiveTree) watchrec(nd node, c chan<- EventInfo, e Event) error { - var traverse func(walkFunc) error - // Non-recursive tree listens on Create event for every recursive - // watchpoint in order to automagically set a watch for every - // created directory. - switch diff := nd.Watch.dryAdd(t.rec, e|Create); { - case diff == none: - t.watchAdd(nd, c, e) - nd.Watch.Add(t.rec, e|omit|Create) - return nil - case diff[1] == 0: - // TODO(rjeczalik): cleanup this panic after implementation is stable - panic("eset is empty: " + nd.Name) - case diff[0] == 0: - // TODO(rjeczalik): BFS into directories and skip subtree as soon as first - // recursive watchpoint is encountered. - traverse = nd.AddDir - default: - traverse = nd.Walk - } - // TODO(rjeczalik): account every path that failed to be (re)watched - // and retry. - if err := traverse(t.recFunc(e)); err != nil { - return err - } - t.watchAdd(nd, c, e) - return nil -} - -type walkWatchpointFunc func(Event, node) error - -func (t *nonrecursiveTree) walkWatchpoint(nd node, fn walkWatchpointFunc) error { - type minode struct { - min Event - nd node - } - mnd := minode{nd: nd} - stack := []minode{mnd} -Traverse: - for n := len(stack); n != 0; n = len(stack) { - mnd, stack = stack[n-1], stack[:n-1] - // There must be no recursive watchpoints if the node has no watchpoints - // itself (every node in subtree rooted at recursive watchpoints must - // have at least nil (total) and t.rec watchpoints). - if len(mnd.nd.Watch) != 0 { - switch err := fn(mnd.min, mnd.nd); err { - case nil: - case errSkip: - continue Traverse - default: - return err - } - } - for _, nd := range mnd.nd.Child { - stack = append(stack, minode{mnd.nd.Watch[t.rec], nd}) - } - } - return nil -} - -// Stop TODO(rjeczalik) -func (t *nonrecursiveTree) Stop(c chan<- EventInfo) { - fn := func(min Event, nd node) error { - // TODO(rjeczalik): aggregate watcher errors and retry; in worst case - // forward to the user. - switch diff := t.watchDelMin(min, nd, c, all); { - case diff == none: - return nil - case diff[1] == 0: - t.w.Unwatch(nd.Name) - default: - t.w.Rewatch(nd.Name, diff[0], diff[1]) - } - return nil - } - t.rw.Lock() - err := t.walkWatchpoint(t.root.nd, fn) // TODO(rjeczalik): store max root per c - t.rw.Unlock() - dbgprintf("Stop(%p) error: %v\n", c, err) -} - -// Close TODO(rjeczalik) -func (t *nonrecursiveTree) Close() error { - err := t.w.Close() - close(t.c) - return err -} diff --git a/vendor/github.com/rjeczalik/notify/tree_recursive.go b/vendor/github.com/rjeczalik/notify/tree_recursive.go deleted file mode 100644 index 7f00dfe35a2c..000000000000 --- a/vendor/github.com/rjeczalik/notify/tree_recursive.go +++ /dev/null @@ -1,354 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -package notify - -import "sync" - -// watchAdd TODO(rjeczalik) -func watchAdd(nd node, c chan<- EventInfo, e Event) eventDiff { - diff := nd.Watch.Add(c, e) - if wp := nd.Child[""].Watch; len(wp) != 0 { - e = wp.Total() - diff[0] |= e - diff[1] |= e - if diff[0] == diff[1] { - return none - } - } - return diff -} - -// watchAddInactive TODO(rjeczalik) -func watchAddInactive(nd node, c chan<- EventInfo, e Event) eventDiff { - wp := nd.Child[""].Watch - if wp == nil { - wp = make(watchpoint) - nd.Child[""] = node{Watch: wp} - } - diff := wp.Add(c, e) - e = nd.Watch.Total() - diff[0] |= e - diff[1] |= e - if diff[0] == diff[1] { - return none - } - return diff -} - -// watchCopy TODO(rjeczalik) -func watchCopy(src, dst node) { - for c, e := range src.Watch { - if c == nil { - continue - } - watchAddInactive(dst, c, e) - } - if wpsrc := src.Child[""].Watch; len(wpsrc) != 0 { - wpdst := dst.Child[""].Watch - for c, e := range wpsrc { - if c == nil { - continue - } - wpdst.Add(c, e) - } - } -} - -// watchDel TODO(rjeczalik) -func watchDel(nd node, c chan<- EventInfo, e Event) eventDiff { - diff := nd.Watch.Del(c, e) - if wp := nd.Child[""].Watch; len(wp) != 0 { - diffInactive := wp.Del(c, e) - e = wp.Total() - // TODO(rjeczalik): add e if e != all? - diff[0] |= diffInactive[0] | e - diff[1] |= diffInactive[1] | e - if diff[0] == diff[1] { - return none - } - } - return diff -} - -// watchTotal TODO(rjeczalik) -func watchTotal(nd node) Event { - e := nd.Watch.Total() - if wp := nd.Child[""].Watch; len(wp) != 0 { - e |= wp.Total() - } - return e -} - -// watchIsRecursive TODO(rjeczalik) -func watchIsRecursive(nd node) bool { - ok := nd.Watch.IsRecursive() - // TODO(rjeczalik): add a test for len(wp) != 0 change the condition. - if wp := nd.Child[""].Watch; len(wp) != 0 { - // If a watchpoint holds inactive watchpoints, it means it's a parent - // one, which is recursive by nature even though it may be not recursive - // itself. - ok = true - } - return ok -} - -// recursiveTree TODO(rjeczalik) -type recursiveTree struct { - rw sync.RWMutex // protects root - root root - // TODO(rjeczalik): merge watcher + recursiveWatcher after #5 and #6 - w interface { - watcher - recursiveWatcher - } - c chan EventInfo -} - -// newRecursiveTree TODO(rjeczalik) -func newRecursiveTree(w recursiveWatcher, c chan EventInfo) *recursiveTree { - t := &recursiveTree{ - root: root{nd: newnode("")}, - w: struct { - watcher - recursiveWatcher - }{w.(watcher), w}, - c: c, - } - go t.dispatch() - return t -} - -// dispatch TODO(rjeczalik) -func (t *recursiveTree) dispatch() { - for ei := range t.c { - dbgprintf("dispatching %v on %q", ei.Event(), ei.Path()) - go func(ei EventInfo) { - nd, ok := node{}, false - dir, base := split(ei.Path()) - fn := func(it node, isbase bool) error { - if isbase { - nd = it - } else { - it.Watch.Dispatch(ei, recursive) - } - return nil - } - t.rw.RLock() - defer t.rw.RUnlock() - // Notify recursive watchpoints found on the path. - if err := t.root.WalkPath(dir, fn); err != nil { - dbgprint("dispatch did not reach leaf:", err) - return - } - // Notify parent watchpoint. - nd.Watch.Dispatch(ei, 0) - // If leaf watchpoint exists, notify it. - if nd, ok = nd.Child[base]; ok { - nd.Watch.Dispatch(ei, 0) - } - }(ei) - } -} - -// Watch TODO(rjeczalik) -func (t *recursiveTree) Watch(path string, c chan<- EventInfo, events ...Event) error { - if c == nil { - panic("notify: Watch using nil channel") - } - // Expanding with empty event set is a nop. - if len(events) == 0 { - return nil - } - path, isrec, err := cleanpath(path) - if err != nil { - return err - } - eventset := joinevents(events) - if isrec { - eventset |= recursive - } - t.rw.Lock() - defer t.rw.Unlock() - // case 1: cur is a child - // - // Look for parent watch which already covers the given path. - parent := node{} - self := false - err = t.root.WalkPath(path, func(nd node, isbase bool) error { - if watchTotal(nd) != 0 { - parent = nd - self = isbase - return errSkip - } - return nil - }) - cur := t.root.Add(path) // add after the walk, so it's less to traverse - if err == nil && parent.Watch != nil { - // Parent watch found. Register inactive watchpoint, so we have enough - // information to shrink the eventset on eventual Stop. - // return t.resetwatchpoint(parent, parent, c, eventset|inactive) - var diff eventDiff - if self { - diff = watchAdd(cur, c, eventset) - } else { - diff = watchAddInactive(parent, c, eventset) - } - switch { - case diff == none: - // the parent watchpoint already covers requested subtree with its - // eventset - case diff[0] == 0: - // TODO(rjeczalik): cleanup this panic after implementation is stable - panic("dangling watchpoint: " + parent.Name) - default: - if isrec || watchIsRecursive(parent) { - err = t.w.RecursiveRewatch(parent.Name, parent.Name, diff[0], diff[1]) - } else { - err = t.w.Rewatch(parent.Name, diff[0], diff[1]) - } - if err != nil { - watchDel(parent, c, diff.Event()) - return err - } - watchAdd(cur, c, eventset) - // TODO(rjeczalik): account top-most path for c - return nil - } - if !self { - watchAdd(cur, c, eventset) - } - return nil - } - // case 2: cur is new parent - // - // Look for children nodes, unwatch n-1 of them and rewatch the last one. - var children []node - fn := func(nd node) error { - if len(nd.Watch) == 0 { - return nil - } - children = append(children, nd) - return errSkip - } - switch must(cur.Walk(fn)); len(children) { - case 0: - // no child watches, cur holds a new watch - case 1: - watchAdd(cur, c, eventset) // TODO(rjeczalik): update cache c subtree root? - watchCopy(children[0], cur) - err = t.w.RecursiveRewatch(children[0].Name, cur.Name, watchTotal(children[0]), - watchTotal(cur)) - if err != nil { - // Clean inactive watchpoint. The c chan did not exist before. - cur.Child[""] = node{} - delete(cur.Watch, c) - return err - } - return nil - default: - watchAdd(cur, c, eventset) - // Copy children inactive watchpoints to the new parent. - for _, nd := range children { - watchCopy(nd, cur) - } - // Watch parent subtree. - if err = t.w.RecursiveWatch(cur.Name, watchTotal(cur)); err != nil { - // Clean inactive watchpoint. The c chan did not exist before. - cur.Child[""] = node{} - delete(cur.Watch, c) - return err - } - // Unwatch children subtrees. - var e error - for _, nd := range children { - if watchIsRecursive(nd) { - e = t.w.RecursiveUnwatch(nd.Name) - } else { - e = t.w.Unwatch(nd.Name) - } - if e != nil { - err = nonil(err, e) - // TODO(rjeczalik): child is still watched, warn all its watchpoints - // about possible duplicate events via Error event - } - } - return err - } - // case 3: cur is new, alone node - switch diff := watchAdd(cur, c, eventset); { - case diff == none: - // TODO(rjeczalik): cleanup this panic after implementation is stable - panic("watch requested but no parent watchpoint found: " + cur.Name) - case diff[0] == 0: - if isrec { - err = t.w.RecursiveWatch(cur.Name, diff[1]) - } else { - err = t.w.Watch(cur.Name, diff[1]) - } - if err != nil { - watchDel(cur, c, diff.Event()) - return err - } - default: - // TODO(rjeczalik): cleanup this panic after implementation is stable - panic("watch requested but no parent watchpoint found: " + cur.Name) - } - return nil -} - -// Stop TODO(rjeczalik) -// -// TODO(rjeczalik): Split parent watchpoint - transfer watches to children -// if parent is no longer needed. This carries a risk that underlying -// watcher calls could fail - reconsider if it's worth the effort. -func (t *recursiveTree) Stop(c chan<- EventInfo) { - var err error - fn := func(nd node) (e error) { - diff := watchDel(nd, c, all) - switch { - case diff == none && watchTotal(nd) == 0: - // TODO(rjeczalik): There's no watchpoints deeper in the tree, - // probably we should remove the nodes as well. - return nil - case diff == none: - // Removing c from nd does not require shrinking its eventset. - case diff[1] == 0: - if watchIsRecursive(nd) { - e = t.w.RecursiveUnwatch(nd.Name) - } else { - e = t.w.Unwatch(nd.Name) - } - default: - if watchIsRecursive(nd) { - e = t.w.RecursiveRewatch(nd.Name, nd.Name, diff[0], diff[1]) - } else { - e = t.w.Rewatch(nd.Name, diff[0], diff[1]) - } - } - fn := func(nd node) error { - watchDel(nd, c, all) - return nil - } - err = nonil(err, e, nd.Walk(fn)) - // TODO(rjeczalik): if e != nil store dummy chan in nd.Watch just to - // retry un/rewatching next time and/or let the user handle the failure - // vie Error event? - return errSkip - } - t.rw.Lock() - e := t.root.Walk("", fn) // TODO(rjeczalik): use max root per c - t.rw.Unlock() - if e != nil { - err = nonil(err, e) - } - dbgprintf("Stop(%p) error: %v\n", c, err) -} - -// Close TODO(rjeczalik) -func (t *recursiveTree) Close() error { - err := t.w.Close() - close(t.c) - return err -} diff --git a/vendor/github.com/rjeczalik/notify/util.go b/vendor/github.com/rjeczalik/notify/util.go deleted file mode 100644 index 67e01fbbd08e..000000000000 --- a/vendor/github.com/rjeczalik/notify/util.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -package notify - -import ( - "errors" - "os" - "path/filepath" - "strings" -) - -const all = ^Event(0) -const sep = string(os.PathSeparator) - -var errDepth = errors.New("exceeded allowed iteration count (circular symlink?)") - -func min(i, j int) int { - if i > j { - return j - } - return i -} - -func max(i, j int) int { - if i < j { - return j - } - return i -} - -// must panics if err is non-nil. -func must(err error) { - if err != nil { - panic(err) - } -} - -// nonil gives first non-nil error from the given arguments. -func nonil(err ...error) error { - for _, err := range err { - if err != nil { - return err - } - } - return nil -} - -func cleanpath(path string) (realpath string, isrec bool, err error) { - if strings.HasSuffix(path, "...") { - isrec = true - path = path[:len(path)-3] - } - if path, err = filepath.Abs(path); err != nil { - return "", false, err - } - if path, err = canonical(path); err != nil { - return "", false, err - } - return path, isrec, nil -} - -// canonical resolves any symlink in the given path and returns it in a clean form. -// It expects the path to be absolute. It fails to resolve circular symlinks by -// maintaining a simple iteration limit. -func canonical(p string) (string, error) { - p, err := filepath.Abs(p) - if err != nil { - return "", err - } - for i, j, depth := 1, 0, 1; i < len(p); i, depth = i+1, depth+1 { - if depth > 128 { - return "", &os.PathError{Op: "canonical", Path: p, Err: errDepth} - } - if j = strings.IndexRune(p[i:], '/'); j == -1 { - j, i = i, len(p) - } else { - j, i = i, i+j - } - fi, err := os.Lstat(p[:i]) - if err != nil { - return "", err - } - if fi.Mode()&os.ModeSymlink == os.ModeSymlink { - s, err := os.Readlink(p[:i]) - if err != nil { - return "", err - } - if filepath.IsAbs(s) { - p = "/" + s + p[i:] - } else { - p = p[:j] + s + p[i:] - } - i = 1 // no guarantee s is canonical, start all over - } - } - return filepath.Clean(p), nil -} - -func joinevents(events []Event) (e Event) { - if len(events) == 0 { - e = All - } else { - for _, event := range events { - e |= event - } - } - return -} - -func split(s string) (string, string) { - if i := lastIndexSep(s); i != -1 { - return s[:i], s[i+1:] - } - return "", s -} - -func base(s string) string { - if i := lastIndexSep(s); i != -1 { - return s[i+1:] - } - return s -} - -func indexbase(root, name string) int { - if n, m := len(root), len(name); m >= n && name[:n] == root && - (n == m || name[n] == os.PathSeparator) { - return min(n+1, m) - } - return -1 -} - -func indexSep(s string) int { - for i := 0; i < len(s); i++ { - if s[i] == os.PathSeparator { - return i - } - } - return -1 -} - -func lastIndexSep(s string) int { - for i := len(s) - 1; i >= 0; i-- { - if s[i] == os.PathSeparator { - return i - } - } - return -1 -} diff --git a/vendor/github.com/rjeczalik/notify/watcher.go b/vendor/github.com/rjeczalik/notify/watcher.go deleted file mode 100644 index 34148eff399e..000000000000 --- a/vendor/github.com/rjeczalik/notify/watcher.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -package notify - -import "errors" - -var ( - errAlreadyWatched = errors.New("path is already watched") - errNotWatched = errors.New("path is not being watched") - errInvalidEventSet = errors.New("invalid event set provided") -) - -// Watcher is a intermediate interface for wrapping inotify, ReadDirChangesW, -// FSEvents, kqueue and poller implementations. -// -// The watcher implementation is expected to do its own mapping between paths and -// create watchers if underlying event notification does not support it. For -// the ease of implementation it is guaranteed that paths provided via Watch and -// Unwatch methods are absolute and clean. -type watcher interface { - // Watch requests a watcher creation for the given path and given event set. - Watch(path string, event Event) error - - // Unwatch requests a watcher deletion for the given path and given event set. - Unwatch(path string) error - - // Rewatch provides a functionality for modifying existing watch-points, like - // expanding its event set. - // - // Rewatch modifies existing watch-point under for the given path. It passes - // the existing event set currently registered for the given path, and the - // new, requested event set. - // - // It is guaranteed that Tree will not pass to Rewatch zero value for any - // of its arguments. If old == new and watcher can be upgraded to - // recursiveWatcher interface, a watch for the corresponding path is expected - // to be changed from recursive to the non-recursive one. - Rewatch(path string, old, new Event) error - - // Close unwatches all paths that are registered. When Close returns, it - // is expected it will report no more events. - Close() error -} - -// RecursiveWatcher is an interface for a Watcher for those OS, which do support -// recursive watching over directories. -type recursiveWatcher interface { - RecursiveWatch(path string, event Event) error - - // RecursiveUnwatch removes a recursive watch-point given by the path. For - // native recursive implementation there is no difference in functionality - // between Unwatch and RecursiveUnwatch, however for those platforms, that - // requires emulation for recursive watch-points, the implementation differs. - RecursiveUnwatch(path string) error - - // RecursiveRewatcher provides a functionality for modifying and/or relocating - // existing recursive watch-points. - // - // To relocate a watch-point means to unwatch oldpath and set a watch-point on - // newpath. - // - // To modify a watch-point means either to expand or shrink its event set. - // - // Tree can want to either relocate, modify or relocate and modify a watch-point - // via single RecursiveRewatch call. - // - // If oldpath == newpath, the watch-point is expected to change its event set value - // from oldevent to newevent. - // - // If oldevent == newevent, the watch-point is expected to relocate from oldpath - // to the newpath. - // - // If oldpath != newpath and oldevent != newevent, the watch-point is expected - // to relocate from oldpath to the newpath first and then change its event set - // value from oldevent to the newevent. In other words the end result must be - // a watch-point set on newpath with newevent value of its event set. - // - // It is guaranteed that Tree will not pass to RecurisveRewatcha zero value - // for any of its arguments. If oldpath == newpath and oldevent == newevent, - // a watch for the corresponding path is expected to be changed for - // non-recursive to the recursive one. - RecursiveRewatch(oldpath, newpath string, oldevent, newevent Event) error -} diff --git a/vendor/github.com/rjeczalik/notify/watcher_fen.go b/vendor/github.com/rjeczalik/notify/watcher_fen.go deleted file mode 100644 index dfe77f2f1d92..000000000000 --- a/vendor/github.com/rjeczalik/notify/watcher_fen.go +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build solaris - -package notify - -import ( - "fmt" - "os" - "syscall" -) - -// newTrigger returns implementation of trigger. -func newTrigger(pthLkp map[string]*watched) trigger { - return &fen{ - pthLkp: pthLkp, - cf: newCfen(), - } -} - -// fen is a structure implementing trigger for FEN. -type fen struct { - // p is a FEN port identifier - p int - // pthLkp is a structure mapping monitored files/dir with data about them, - // shared with parent trg structure - pthLkp map[string]*watched - // cf wraps C operations for FEN - cf cfen -} - -// watched is a data structure representing watched file/directory. -type watched struct { - trgWatched -} - -// Stop implements trigger. -func (f *fen) Stop() error { - return f.cf.portAlert(f.p) -} - -// Close implements trigger. -func (f *fen) Close() (err error) { - return syscall.Close(f.p) -} - -// NewWatched implements trigger. -func (*fen) NewWatched(p string, fi os.FileInfo) (*watched, error) { - return &watched{trgWatched{p: p, fi: fi}}, nil -} - -// Record implements trigger. -func (f *fen) Record(w *watched) { - f.pthLkp[w.p] = w -} - -// Del implements trigger. -func (f *fen) Del(w *watched) { - delete(f.pthLkp, w.p) -} - -func inter2pe(n interface{}) PortEvent { - pe, ok := n.(PortEvent) - if !ok { - panic(fmt.Sprintf("fen: type should be PortEvent, %T instead", n)) - } - return pe -} - -// Watched implements trigger. -func (f *fen) Watched(n interface{}) (*watched, int64, error) { - pe := inter2pe(n) - fo, ok := pe.PortevObject.(*FileObj) - if !ok || fo == nil { - panic(fmt.Sprintf("fen: type should be *FileObj, %T instead", fo)) - } - w, ok := f.pthLkp[fo.Name] - if !ok { - return nil, 0, errNotWatched - } - return w, int64(pe.PortevEvents), nil -} - -// init initializes FEN. -func (f *fen) Init() (err error) { - f.p, err = f.cf.portCreate() - return -} - -func fi2fo(fi os.FileInfo, p string) FileObj { - st, ok := fi.Sys().(*syscall.Stat_t) - if !ok { - panic(fmt.Sprintf("fen: type should be *syscall.Stat_t, %T instead", st)) - } - return FileObj{Name: p, Atim: st.Atim, Mtim: st.Mtim, Ctim: st.Ctim} -} - -// Unwatch implements trigger. -func (f *fen) Unwatch(w *watched) error { - return f.cf.portDissociate(f.p, FileObj{Name: w.p}) -} - -// Watch implements trigger. -func (f *fen) Watch(fi os.FileInfo, w *watched, e int64) error { - return f.cf.portAssociate(f.p, fi2fo(fi, w.p), int(e)) -} - -// Wait implements trigger. -func (f *fen) Wait() (interface{}, error) { - var ( - pe PortEvent - err error - ) - err = f.cf.portGet(f.p, &pe) - return pe, err -} - -// IsStop implements trigger. -func (f *fen) IsStop(n interface{}, err error) bool { - return err == syscall.EBADF || inter2pe(n).PortevSource == srcAlert -} - -func init() { - encode = func(e Event, dir bool) (o int64) { - // Create event is not supported by FEN. Instead FileModified event will - // be registered. If this event will be reported on dir which is to be - // monitored for Create, dir will be rescanned and Create events will - // be generated and returned for new files. In case of files, - // if not requested FileModified event is reported, it will be ignored. - o = int64(e &^ Create) - if (e&Create != 0 && dir) || e&Write != 0 { - o = (o &^ int64(Write)) | int64(FileModified) - } - // Following events are 'exception events' and as such cannot be requested - // explicitly for monitoring or filtered out. If the will be reported - // by FEN and not subscribed with by user, they will be filtered out by - // watcher's logic. - o &= int64(^Rename & ^Remove &^ FileDelete &^ FileRenameTo &^ - FileRenameFrom &^ Unmounted &^ MountedOver) - return - } - nat2not = map[Event]Event{ - FileModified: Write, - FileRenameFrom: Rename, - FileDelete: Remove, - FileAccess: Event(0), - FileAttrib: Event(0), - FileRenameTo: Event(0), - FileTrunc: Event(0), - FileNoFollow: Event(0), - Unmounted: Event(0), - MountedOver: Event(0), - } - not2nat = map[Event]Event{ - Write: FileModified, - Rename: FileRenameFrom, - Remove: FileDelete, - } -} diff --git a/vendor/github.com/rjeczalik/notify/watcher_fen_cgo.go b/vendor/github.com/rjeczalik/notify/watcher_fen_cgo.go deleted file mode 100644 index 8ec8ead34396..000000000000 --- a/vendor/github.com/rjeczalik/notify/watcher_fen_cgo.go +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build solaris - -package notify - -// #include -// #include -// #include -// struct file_obj* newFo() { return (struct file_obj*) malloc(sizeof(struct file_obj)); } -// port_event_t* newPe() { return (port_event_t*) malloc(sizeof(port_event_t)); } -// uintptr_t conv(struct file_obj* fo) { return (uintptr_t) fo; } -// struct file_obj* dconv(uintptr_t fo) { return (struct file_obj*) fo; } -import "C" - -import ( - "syscall" - "unsafe" -) - -const ( - fileAccess = Event(C.FILE_ACCESS) - fileModified = Event(C.FILE_MODIFIED) - fileAttrib = Event(C.FILE_ATTRIB) - fileDelete = Event(C.FILE_DELETE) - fileRenameTo = Event(C.FILE_RENAME_TO) - fileRenameFrom = Event(C.FILE_RENAME_FROM) - fileTrunc = Event(C.FILE_TRUNC) - fileNoFollow = Event(C.FILE_NOFOLLOW) - unmounted = Event(C.UNMOUNTED) - mountedOver = Event(C.MOUNTEDOVER) -) - -// PortEvent is a notify's equivalent of port_event_t. -type PortEvent struct { - PortevEvents int // PortevEvents is an equivalent of portev_events. - PortevSource uint8 // PortevSource is an equivalent of portev_source. - PortevPad uint8 // Portevpad is an equivalent of portev_pad. - PortevObject interface{} // PortevObject is an equivalent of portev_object. - PortevUser uintptr // PortevUser is an equivalent of portev_user. -} - -// FileObj is a notify's equivalent of file_obj. -type FileObj struct { - Atim syscall.Timespec // Atim is an equivalent of fo_atime. - Mtim syscall.Timespec // Mtim is an equivalent of fo_mtime. - Ctim syscall.Timespec // Ctim is an equivalent of fo_ctime. - Pad [3]uintptr // Pad is an equivalent of fo_pad. - Name string // Name is an equivalent of fo_name. -} - -type cfen struct { - p2pe map[string]*C.port_event_t - p2fo map[string]*C.struct_file_obj -} - -func newCfen() cfen { - return cfen{ - p2pe: make(map[string]*C.port_event_t), - p2fo: make(map[string]*C.struct_file_obj), - } -} - -func unix2C(sec int64, nsec int64) (C.time_t, C.long) { - return C.time_t(sec), C.long(nsec) -} - -func (c *cfen) portAssociate(p int, fo FileObj, e int) (err error) { - cfo := C.newFo() - cfo.fo_atime.tv_sec, cfo.fo_atime.tv_nsec = unix2C(fo.Atim.Unix()) - cfo.fo_mtime.tv_sec, cfo.fo_mtime.tv_nsec = unix2C(fo.Mtim.Unix()) - cfo.fo_ctime.tv_sec, cfo.fo_ctime.tv_nsec = unix2C(fo.Ctim.Unix()) - cfo.fo_name = C.CString(fo.Name) - c.p2fo[fo.Name] = cfo - _, err = C.port_associate(C.int(p), srcFile, C.conv(cfo), C.int(e), nil) - return -} - -func (c *cfen) portDissociate(port int, fo FileObj) (err error) { - cfo, ok := c.p2fo[fo.Name] - if !ok { - return errNotWatched - } - _, err = C.port_dissociate(C.int(port), srcFile, C.conv(cfo)) - C.free(unsafe.Pointer(cfo.fo_name)) - C.free(unsafe.Pointer(cfo)) - delete(c.p2fo, fo.Name) - return -} - -const srcAlert = C.PORT_SOURCE_ALERT -const srcFile = C.PORT_SOURCE_FILE -const alertSet = C.PORT_ALERT_SET - -func cfo2fo(cfo *C.struct_file_obj) *FileObj { - // Currently remaining attributes are not used. - if cfo == nil { - return nil - } - var fo FileObj - fo.Name = C.GoString(cfo.fo_name) - return &fo -} - -func (c *cfen) portGet(port int, pe *PortEvent) (err error) { - cpe := C.newPe() - if _, err = C.port_get(C.int(port), cpe, nil); err != nil { - C.free(unsafe.Pointer(cpe)) - return - } - pe.PortevEvents, pe.PortevSource, pe.PortevPad = - int(cpe.portev_events), uint8(cpe.portev_source), uint8(cpe.portev_pad) - pe.PortevObject = cfo2fo(C.dconv(cpe.portev_object)) - pe.PortevUser = uintptr(cpe.portev_user) - C.free(unsafe.Pointer(cpe)) - return -} - -func (c *cfen) portCreate() (int, error) { - p, err := C.port_create() - return int(p), err -} - -func (c *cfen) portAlert(p int) (err error) { - _, err = C.port_alert(C.int(p), alertSet, C.int(666), nil) - return -} - -func (c *cfen) free() { - for i := range c.p2fo { - C.free(unsafe.Pointer(c.p2fo[i].fo_name)) - C.free(unsafe.Pointer(c.p2fo[i])) - } - for i := range c.p2pe { - C.free(unsafe.Pointer(c.p2pe[i])) - } - c.p2fo = make(map[string]*C.struct_file_obj) - c.p2pe = make(map[string]*C.port_event_t) -} diff --git a/vendor/github.com/rjeczalik/notify/watcher_fsevents.go b/vendor/github.com/rjeczalik/notify/watcher_fsevents.go deleted file mode 100644 index 7d9b97b65d02..000000000000 --- a/vendor/github.com/rjeczalik/notify/watcher_fsevents.go +++ /dev/null @@ -1,311 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build darwin,!kqueue - -package notify - -import ( - "errors" - "strings" - "sync/atomic" -) - -const ( - failure = uint32(FSEventsMustScanSubDirs | FSEventsUserDropped | FSEventsKernelDropped) - filter = uint32(FSEventsCreated | FSEventsRemoved | FSEventsRenamed | - FSEventsModified | FSEventsInodeMetaMod) -) - -// FSEvent represents single file event. It is created out of values passed by -// FSEvents to FSEventStreamCallback function. -type FSEvent struct { - Path string // real path of the file or directory - ID uint64 // ID of the event (FSEventStreamEventId) - Flags uint32 // joint FSEvents* flags (FSEventStreamEventFlags) -} - -// splitflags separates event flags from single set into slice of flags. -func splitflags(set uint32) (e []uint32) { - for i := uint32(1); set != 0; i, set = i<<1, set>>1 { - if (set & 1) != 0 { - e = append(e, i) - } - } - return -} - -// watch represents a filesystem watchpoint. It is a higher level abstraction -// over FSEvents' stream, which implements filtering of file events based -// on path and event set. It emulates non-recursive watch-point by filtering out -// events which paths are more than 1 level deeper than the watched path. -type watch struct { - // prev stores last event set per path in order to filter out old flags - // for new events, which appratenly FSEvents likes to retain. It's a disgusting - // hack, it should be researched how to get rid of it. - prev map[string]uint32 - c chan<- EventInfo - stream *stream - path string - events uint32 - isrec int32 - flushed bool -} - -// Example format: -// -// ~ $ (trigger command) # (event set) -> (effective event set) -// -// Heuristics: -// -// 1. Create event is removed when it was present in previous event set. -// Example: -// -// ~ $ echo > file # Create|Write -> Create|Write -// ~ $ echo > file # Create|Write|InodeMetaMod -> Write|InodeMetaMod -// -// 2. Remove event is removed if it was present in previouse event set. -// Example: -// -// ~ $ touch file # Create -> Create -// ~ $ rm file # Create|Remove -> Remove -// ~ $ touch file # Create|Remove -> Create -// -// 3. Write event is removed if not followed by InodeMetaMod on existing -// file. Example: -// -// ~ $ echo > file # Create|Write -> Create|Write -// ~ $ chmod +x file # Create|Write|ChangeOwner -> ChangeOwner -// -// 4. Write&InodeMetaMod is removed when effective event set contain Remove event. -// Example: -// -// ~ $ echo > file # Write|InodeMetaMod -> Write|InodeMetaMod -// ~ $ rm file # Remove|Write|InodeMetaMod -> Remove -// -func (w *watch) strip(base string, set uint32) uint32 { - const ( - write = FSEventsModified | FSEventsInodeMetaMod - both = FSEventsCreated | FSEventsRemoved - ) - switch w.prev[base] { - case FSEventsCreated: - set &^= FSEventsCreated - if set&FSEventsRemoved != 0 { - w.prev[base] = FSEventsRemoved - set &^= write - } - case FSEventsRemoved: - set &^= FSEventsRemoved - if set&FSEventsCreated != 0 { - w.prev[base] = FSEventsCreated - } - default: - switch set & both { - case FSEventsCreated: - w.prev[base] = FSEventsCreated - case FSEventsRemoved: - w.prev[base] = FSEventsRemoved - set &^= write - } - } - dbgprintf("split()=%v\n", Event(set)) - return set -} - -// Dispatch is a stream function which forwards given file events for the watched -// path to underlying FileInfo channel. -func (w *watch) Dispatch(ev []FSEvent) { - events := atomic.LoadUint32(&w.events) - isrec := (atomic.LoadInt32(&w.isrec) == 1) - for i := range ev { - if ev[i].Flags&FSEventsHistoryDone != 0 { - w.flushed = true - continue - } - if !w.flushed { - continue - } - dbgprintf("%v (0x%x) (%s, i=%d, ID=%d, len=%d)\n", Event(ev[i].Flags), - ev[i].Flags, ev[i].Path, i, ev[i].ID, len(ev)) - if ev[i].Flags&failure != 0 { - // TODO(rjeczalik): missing error handling - continue - } - if !strings.HasPrefix(ev[i].Path, w.path) { - continue - } - n := len(w.path) - base := "" - if len(ev[i].Path) > n { - if ev[i].Path[n] != '/' { - continue - } - base = ev[i].Path[n+1:] - if !isrec && strings.IndexByte(base, '/') != -1 { - continue - } - } - // TODO(rjeczalik): get diff only from filtered events? - e := w.strip(string(base), ev[i].Flags) & events - if e == 0 { - continue - } - for _, e := range splitflags(e) { - dbgprintf("%d: single event: %v", ev[i].ID, Event(e)) - w.c <- &event{ - fse: ev[i], - event: Event(e), - } - } - } -} - -// Stop closes underlying FSEvents stream and stops dispatching events. -func (w *watch) Stop() { - w.stream.Stop() - // TODO(rjeczalik): make (*stream).Stop flush synchronously undelivered events, - // so the following hack can be removed. It should flush all the streams - // concurrently as we care not to block too much here. - atomic.StoreUint32(&w.events, 0) - atomic.StoreInt32(&w.isrec, 0) -} - -// fsevents implements Watcher and RecursiveWatcher interfaces backed by FSEvents -// framework. -type fsevents struct { - watches map[string]*watch - c chan<- EventInfo -} - -func newWatcher(c chan<- EventInfo) watcher { - return &fsevents{ - watches: make(map[string]*watch), - c: c, - } -} - -func (fse *fsevents) watch(path string, event Event, isrec int32) (err error) { - if _, ok := fse.watches[path]; ok { - return errAlreadyWatched - } - w := &watch{ - prev: make(map[string]uint32), - c: fse.c, - path: path, - events: uint32(event), - isrec: isrec, - } - w.stream = newStream(path, w.Dispatch) - if err = w.stream.Start(); err != nil { - return err - } - fse.watches[path] = w - return nil -} - -func (fse *fsevents) unwatch(path string) (err error) { - w, ok := fse.watches[path] - if !ok { - return errNotWatched - } - w.stream.Stop() - delete(fse.watches, path) - return nil -} - -// Watch implements Watcher interface. It fails with non-nil error when setting -// the watch-point by FSEvents fails or with errAlreadyWatched error when -// the given path is already watched. -func (fse *fsevents) Watch(path string, event Event) error { - return fse.watch(path, event, 0) -} - -// Unwatch implements Watcher interface. It fails with errNotWatched when -// the given path is not being watched. -func (fse *fsevents) Unwatch(path string) error { - return fse.unwatch(path) -} - -// Rewatch implements Watcher interface. It fails with errNotWatched when -// the given path is not being watched or with errInvalidEventSet when oldevent -// does not match event set the watch-point currently holds. -func (fse *fsevents) Rewatch(path string, oldevent, newevent Event) error { - w, ok := fse.watches[path] - if !ok { - return errNotWatched - } - if !atomic.CompareAndSwapUint32(&w.events, uint32(oldevent), uint32(newevent)) { - return errInvalidEventSet - } - atomic.StoreInt32(&w.isrec, 0) - return nil -} - -// RecursiveWatch implements RecursiveWatcher interface. It fails with non-nil -// error when setting the watch-point by FSEvents fails or with errAlreadyWatched -// error when the given path is already watched. -func (fse *fsevents) RecursiveWatch(path string, event Event) error { - return fse.watch(path, event, 1) -} - -// RecursiveUnwatch implements RecursiveWatcher interface. It fails with -// errNotWatched when the given path is not being watched. -// -// TODO(rjeczalik): fail if w.isrec == 0? -func (fse *fsevents) RecursiveUnwatch(path string) error { - return fse.unwatch(path) -} - -// RecrusiveRewatch implements RecursiveWatcher interface. It fails: -// -// * with errNotWatched when the given path is not being watched -// * with errInvalidEventSet when oldevent does not match the current event set -// * with errAlreadyWatched when watch-point given by the oldpath was meant to -// be relocated to newpath, but the newpath is already watched -// * a non-nil error when setting the watch-point with FSEvents fails -// -// TODO(rjeczalik): Improve handling of watch-point relocation? See two TODOs -// that follows. -func (fse *fsevents) RecursiveRewatch(oldpath, newpath string, oldevent, newevent Event) error { - switch [2]bool{oldpath == newpath, oldevent == newevent} { - case [2]bool{true, true}: - w, ok := fse.watches[oldpath] - if !ok { - return errNotWatched - } - atomic.StoreInt32(&w.isrec, 1) - return nil - case [2]bool{true, false}: - w, ok := fse.watches[oldpath] - if !ok { - return errNotWatched - } - if !atomic.CompareAndSwapUint32(&w.events, uint32(oldevent), uint32(newevent)) { - return errors.New("invalid event state diff") - } - atomic.StoreInt32(&w.isrec, 1) - return nil - default: - // TODO(rjeczalik): rewatch newpath only if exists? - // TODO(rjeczalik): migrate w.prev to new watch? - if _, ok := fse.watches[newpath]; ok { - return errAlreadyWatched - } - if err := fse.Unwatch(oldpath); err != nil { - return err - } - // TODO(rjeczalik): revert unwatch if watch fails? - return fse.watch(newpath, newevent, 1) - } -} - -// Close unwatches all watch-points. -func (fse *fsevents) Close() error { - for _, w := range fse.watches { - w.Stop() - } - fse.watches = nil - return nil -} diff --git a/vendor/github.com/rjeczalik/notify/watcher_fsevents_cgo.go b/vendor/github.com/rjeczalik/notify/watcher_fsevents_cgo.go deleted file mode 100644 index cf0416c37e67..000000000000 --- a/vendor/github.com/rjeczalik/notify/watcher_fsevents_cgo.go +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build darwin,!kqueue - -package notify - -/* -#include - -typedef void (*CFRunLoopPerformCallBack)(void*); - -void gosource(void *); -void gostream(uintptr_t, uintptr_t, size_t, uintptr_t, uintptr_t, uintptr_t); - -static FSEventStreamRef EventStreamCreate(FSEventStreamContext * context, uintptr_t info, CFArrayRef paths, FSEventStreamEventId since, CFTimeInterval latency, FSEventStreamCreateFlags flags) { - context->info = (void*) info; - return FSEventStreamCreate(NULL, (FSEventStreamCallback) gostream, context, paths, since, latency, flags); -} - -#cgo LDFLAGS: -framework CoreServices -*/ -import "C" - -import ( - "errors" - "os" - "runtime" - "sync" - "sync/atomic" - "unsafe" -) - -var nilstream C.FSEventStreamRef - -// Default arguments for FSEventStreamCreate function. -var ( - latency C.CFTimeInterval - flags = C.FSEventStreamCreateFlags(C.kFSEventStreamCreateFlagFileEvents | C.kFSEventStreamCreateFlagNoDefer) - since = uint64(C.FSEventsGetCurrentEventId()) -) - -var runloop C.CFRunLoopRef // global runloop which all streams are registered with -var wg sync.WaitGroup // used to wait until the runloop starts - -// source is used for synchronization purposes - it signals when runloop has -// started and is ready via the wg. It also serves purpose of a dummy source, -// thanks to it the runloop does not return as it also has at least one source -// registered. -var source = C.CFRunLoopSourceCreate(C.kCFAllocatorDefault, 0, &C.CFRunLoopSourceContext{ - perform: (C.CFRunLoopPerformCallBack)(C.gosource), -}) - -// Errors returned when FSEvents functions fail. -var ( - errCreate = os.NewSyscallError("FSEventStreamCreate", errors.New("NULL")) - errStart = os.NewSyscallError("FSEventStreamStart", errors.New("false")) -) - -// initializes the global runloop and ensures any created stream awaits its -// readiness. -func init() { - wg.Add(1) - go func() { - // There is exactly one run loop per thread. Lock this goroutine to its - // thread to ensure that it's not rescheduled on a different thread while - // setting up the run loop. - runtime.LockOSThread() - runloop = C.CFRunLoopGetCurrent() - C.CFRunLoopAddSource(runloop, source, C.kCFRunLoopDefaultMode) - C.CFRunLoopRun() - panic("runloop has just unexpectedly stopped") - }() - C.CFRunLoopSourceSignal(source) -} - -//export gosource -func gosource(unsafe.Pointer) { - wg.Done() -} - -//export gostream -func gostream(_, info uintptr, n C.size_t, paths, flags, ids uintptr) { - const ( - offchar = unsafe.Sizeof((*C.char)(nil)) - offflag = unsafe.Sizeof(C.FSEventStreamEventFlags(0)) - offid = unsafe.Sizeof(C.FSEventStreamEventId(0)) - ) - if n == 0 { - return - } - fn := streamFuncs.get(info) - if fn == nil { - return - } - ev := make([]FSEvent, 0, int(n)) - for i := uintptr(0); i < uintptr(n); i++ { - switch flags := *(*uint32)(unsafe.Pointer((flags + i*offflag))); { - case flags&uint32(FSEventsEventIdsWrapped) != 0: - atomic.StoreUint64(&since, uint64(C.FSEventsGetCurrentEventId())) - default: - ev = append(ev, FSEvent{ - Path: C.GoString(*(**C.char)(unsafe.Pointer(paths + i*offchar))), - Flags: flags, - ID: *(*uint64)(unsafe.Pointer(ids + i*offid)), - }) - } - - } - fn(ev) -} - -// StreamFunc is a callback called when stream receives file events. -type streamFunc func([]FSEvent) - -var streamFuncs = streamFuncRegistry{m: map[uintptr]streamFunc{}} - -type streamFuncRegistry struct { - mu sync.Mutex - m map[uintptr]streamFunc - i uintptr -} - -func (r *streamFuncRegistry) get(id uintptr) streamFunc { - r.mu.Lock() - defer r.mu.Unlock() - return r.m[id] -} - -func (r *streamFuncRegistry) add(fn streamFunc) uintptr { - r.mu.Lock() - defer r.mu.Unlock() - r.i++ - r.m[r.i] = fn - return r.i -} - -func (r *streamFuncRegistry) delete(id uintptr) { - r.mu.Lock() - defer r.mu.Unlock() - delete(r.m, id) -} - -// Stream represents single watch-point which listens for events scheduled by -// the global runloop. -type stream struct { - path string - ref C.FSEventStreamRef - info uintptr -} - -// NewStream creates a stream for given path, listening for file events and -// calling fn upon receiving any. -func newStream(path string, fn streamFunc) *stream { - return &stream{ - path: path, - info: streamFuncs.add(fn), - } -} - -// Start creates a FSEventStream for the given path and schedules it with -// global runloop. It's a nop if the stream was already started. -func (s *stream) Start() error { - if s.ref != nilstream { - return nil - } - wg.Wait() - p := C.CFStringCreateWithCStringNoCopy(C.kCFAllocatorDefault, C.CString(s.path), C.kCFStringEncodingUTF8, C.kCFAllocatorDefault) - path := C.CFArrayCreate(C.kCFAllocatorDefault, (*unsafe.Pointer)(unsafe.Pointer(&p)), 1, nil) - ctx := C.FSEventStreamContext{} - ref := C.EventStreamCreate(&ctx, C.uintptr_t(s.info), path, C.FSEventStreamEventId(atomic.LoadUint64(&since)), latency, flags) - if ref == nilstream { - return errCreate - } - C.FSEventStreamScheduleWithRunLoop(ref, runloop, C.kCFRunLoopDefaultMode) - if C.FSEventStreamStart(ref) == C.Boolean(0) { - C.FSEventStreamInvalidate(ref) - return errStart - } - C.CFRunLoopWakeUp(runloop) - s.ref = ref - return nil -} - -// Stop stops underlying FSEventStream and unregisters it from global runloop. -func (s *stream) Stop() { - if s.ref == nilstream { - return - } - wg.Wait() - C.FSEventStreamStop(s.ref) - C.FSEventStreamInvalidate(s.ref) - C.CFRunLoopWakeUp(runloop) - s.ref = nilstream - streamFuncs.delete(s.info) -} diff --git a/vendor/github.com/rjeczalik/notify/watcher_inotify.go b/vendor/github.com/rjeczalik/notify/watcher_inotify.go deleted file mode 100644 index d082baca0f9a..000000000000 --- a/vendor/github.com/rjeczalik/notify/watcher_inotify.go +++ /dev/null @@ -1,405 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build linux - -package notify - -import ( - "bytes" - "errors" - "path/filepath" - "runtime" - "sync" - "sync/atomic" - "unsafe" - - "golang.org/x/sys/unix" -) - -// eventBufferSize defines the size of the buffer given to read(2) function. One -// should not depend on this value, since it was arbitrary chosen and may be -// changed in the future. -const eventBufferSize = 64 * (unix.SizeofInotifyEvent + unix.PathMax + 1) - -// consumersCount defines the number of consumers in producer-consumer based -// implementation. Each consumer is run in a separate goroutine and has read -// access to watched files map. -const consumersCount = 2 - -const invalidDescriptor = -1 - -// watched is a pair of file path and inotify mask used as a value in -// watched files map. -type watched struct { - path string - mask uint32 -} - -// inotify implements Watcher interface. -type inotify struct { - sync.RWMutex // protects inotify.m map - m map[int32]*watched // watch descriptor to watched object - fd int32 // inotify file descriptor - pipefd []int // pipe's read and write descriptors - epfd int // epoll descriptor - epes []unix.EpollEvent // epoll events - buffer [eventBufferSize]byte // inotify event buffer - wg sync.WaitGroup // wait group used to close main loop - c chan<- EventInfo // event dispatcher channel -} - -// NewWatcher creates new non-recursive inotify backed by inotify. -func newWatcher(c chan<- EventInfo) watcher { - i := &inotify{ - m: make(map[int32]*watched), - fd: invalidDescriptor, - pipefd: []int{invalidDescriptor, invalidDescriptor}, - epfd: invalidDescriptor, - epes: make([]unix.EpollEvent, 0), - c: c, - } - runtime.SetFinalizer(i, func(i *inotify) { - i.epollclose() - if i.fd != invalidDescriptor { - unix.Close(int(i.fd)) - } - }) - return i -} - -// Watch implements notify.watcher interface. -func (i *inotify) Watch(path string, e Event) error { - return i.watch(path, e) -} - -// Rewatch implements notify.watcher interface. -func (i *inotify) Rewatch(path string, _, newevent Event) error { - return i.watch(path, newevent) -} - -// watch adds a new watcher to the set of watched objects or modifies the existing -// one. If called for the first time, this function initializes inotify filesystem -// monitor and starts producer-consumers goroutines. -func (i *inotify) watch(path string, e Event) (err error) { - if e&^(All|Event(unix.IN_ALL_EVENTS)) != 0 { - return errors.New("notify: unknown event") - } - if err = i.lazyinit(); err != nil { - return - } - iwd, err := unix.InotifyAddWatch(int(i.fd), path, encode(e)) - if err != nil { - return - } - i.RLock() - wd := i.m[int32(iwd)] - i.RUnlock() - if wd == nil { - i.Lock() - if i.m[int32(iwd)] == nil { - i.m[int32(iwd)] = &watched{path: path, mask: uint32(e)} - } - i.Unlock() - } else { - i.Lock() - wd.mask = uint32(e) - i.Unlock() - } - return nil -} - -// lazyinit sets up all required file descriptors and starts 1+consumersCount -// goroutines. The producer goroutine blocks until file-system notifications -// occur. Then, all events are read from system buffer and sent to consumer -// goroutines which construct valid notify events. This method uses -// Double-Checked Locking optimization. -func (i *inotify) lazyinit() error { - if atomic.LoadInt32(&i.fd) == invalidDescriptor { - i.Lock() - defer i.Unlock() - if atomic.LoadInt32(&i.fd) == invalidDescriptor { - fd, err := unix.InotifyInit1(unix.IN_CLOEXEC) - if err != nil { - return err - } - i.fd = int32(fd) - if err = i.epollinit(); err != nil { - _, _ = i.epollclose(), unix.Close(int(fd)) // Ignore errors. - i.fd = invalidDescriptor - return err - } - esch := make(chan []*event) - go i.loop(esch) - i.wg.Add(consumersCount) - for n := 0; n < consumersCount; n++ { - go i.send(esch) - } - } - } - return nil -} - -// epollinit opens an epoll file descriptor and creates a pipe which will be -// used to wake up the epoll_wait(2) function. Then, file descriptor associated -// with inotify event queue and the read end of the pipe are added to epoll set. -// Note that `fd` member must be set before this function is called. -func (i *inotify) epollinit() (err error) { - if i.epfd, err = unix.EpollCreate1(0); err != nil { - return - } - if err = unix.Pipe(i.pipefd); err != nil { - return - } - i.epes = []unix.EpollEvent{ - {Events: unix.EPOLLIN, Fd: i.fd}, - {Events: unix.EPOLLIN, Fd: int32(i.pipefd[0])}, - } - if err = unix.EpollCtl(i.epfd, unix.EPOLL_CTL_ADD, int(i.fd), &i.epes[0]); err != nil { - return - } - return unix.EpollCtl(i.epfd, unix.EPOLL_CTL_ADD, i.pipefd[0], &i.epes[1]) -} - -// epollclose closes the file descriptor created by the call to epoll_create(2) -// and two file descriptors opened by pipe(2) function. -func (i *inotify) epollclose() (err error) { - if i.epfd != invalidDescriptor { - if err = unix.Close(i.epfd); err == nil { - i.epfd = invalidDescriptor - } - } - for n, fd := range i.pipefd { - if fd != invalidDescriptor { - switch e := unix.Close(fd); { - case e != nil && err == nil: - err = e - case e == nil: - i.pipefd[n] = invalidDescriptor - } - } - } - return -} - -// loop blocks until either inotify or pipe file descriptor is ready for I/O. -// All read operations triggered by filesystem notifications are forwarded to -// one of the event's consumers. If pipe fd became ready, loop function closes -// all file descriptors opened by lazyinit method and returns afterwards. -func (i *inotify) loop(esch chan<- []*event) { - epes := make([]unix.EpollEvent, 1) - fd := atomic.LoadInt32(&i.fd) - for { - switch _, err := unix.EpollWait(i.epfd, epes, -1); err { - case nil: - switch epes[0].Fd { - case fd: - esch <- i.read() - epes[0].Fd = 0 - case int32(i.pipefd[0]): - i.Lock() - defer i.Unlock() - if err = unix.Close(int(fd)); err != nil && err != unix.EINTR { - panic("notify: close(2) error " + err.Error()) - } - atomic.StoreInt32(&i.fd, invalidDescriptor) - if err = i.epollclose(); err != nil && err != unix.EINTR { - panic("notify: epollclose error " + err.Error()) - } - close(esch) - return - } - case unix.EINTR: - continue - default: // We should never reach this line. - panic("notify: epoll_wait(2) error " + err.Error()) - } - } -} - -// read reads events from an inotify file descriptor. It does not handle errors -// returned from read(2) function since they are not critical to watcher logic. -func (i *inotify) read() (es []*event) { - n, err := unix.Read(int(i.fd), i.buffer[:]) - if err != nil || n < unix.SizeofInotifyEvent { - return - } - var sys *unix.InotifyEvent - nmin := n - unix.SizeofInotifyEvent - for pos, path := 0, ""; pos <= nmin; { - sys = (*unix.InotifyEvent)(unsafe.Pointer(&i.buffer[pos])) - pos += unix.SizeofInotifyEvent - if path = ""; sys.Len > 0 { - endpos := pos + int(sys.Len) - path = string(bytes.TrimRight(i.buffer[pos:endpos], "\x00")) - pos = endpos - } - es = append(es, &event{ - sys: unix.InotifyEvent{ - Wd: sys.Wd, - Mask: sys.Mask, - Cookie: sys.Cookie, - }, - path: path, - }) - } - return -} - -// send is a consumer function which sends events to event dispatcher channel. -// It is run in a separate goroutine in order to not block loop method when -// possibly expensive write operations are performed on inotify map. -func (i *inotify) send(esch <-chan []*event) { - for es := range esch { - for _, e := range i.transform(es) { - if e != nil { - i.c <- e - } - } - } - i.wg.Done() -} - -// transform prepares events read from inotify file descriptor for sending to -// user. It removes invalid events and these which are no longer present in -// inotify map. This method may also split one raw event into two different ones -// when system-dependent result is required. -func (i *inotify) transform(es []*event) []*event { - var multi []*event - i.RLock() - for idx, e := range es { - if e.sys.Mask&(unix.IN_IGNORED|unix.IN_Q_OVERFLOW) != 0 { - es[idx] = nil - continue - } - wd, ok := i.m[e.sys.Wd] - if !ok || e.sys.Mask&encode(Event(wd.mask)) == 0 { - es[idx] = nil - continue - } - if e.path == "" { - e.path = wd.path - } else { - e.path = filepath.Join(wd.path, e.path) - } - multi = append(multi, decode(Event(wd.mask), e)) - if e.event == 0 { - es[idx] = nil - } - } - i.RUnlock() - es = append(es, multi...) - return es -} - -// encode converts notify system-independent events to valid inotify mask -// which can be passed to inotify_add_watch(2) function. -func encode(e Event) uint32 { - if e&Create != 0 { - e = (e ^ Create) | InCreate | InMovedTo - } - if e&Remove != 0 { - e = (e ^ Remove) | InDelete | InDeleteSelf - } - if e&Write != 0 { - e = (e ^ Write) | InModify - } - if e&Rename != 0 { - e = (e ^ Rename) | InMovedFrom | InMoveSelf - } - return uint32(e) -} - -// decode uses internally stored mask to distinguish whether system-independent -// or system-dependent event is requested. The first one is created by modifying -// `e` argument. decode method sets e.event value to 0 when an event should be -// skipped. System-dependent event is set as the function's return value which -// can be nil when the event should not be passed on. -func decode(mask Event, e *event) (syse *event) { - if sysmask := uint32(mask) & e.sys.Mask; sysmask != 0 { - syse = &event{sys: unix.InotifyEvent{ - Wd: e.sys.Wd, - Mask: e.sys.Mask, - Cookie: e.sys.Cookie, - }, event: Event(sysmask), path: e.path} - } - imask := encode(mask) - switch { - case mask&Create != 0 && imask&uint32(InCreate|InMovedTo)&e.sys.Mask != 0: - e.event = Create - case mask&Remove != 0 && imask&uint32(InDelete|InDeleteSelf)&e.sys.Mask != 0: - e.event = Remove - case mask&Write != 0 && imask&uint32(InModify)&e.sys.Mask != 0: - e.event = Write - case mask&Rename != 0 && imask&uint32(InMovedFrom|InMoveSelf)&e.sys.Mask != 0: - e.event = Rename - default: - e.event = 0 - } - return -} - -// Unwatch implements notify.watcher interface. It looks for watch descriptor -// related to registered path and if found, calls inotify_rm_watch(2) function. -// This method is allowed to return EINVAL error when concurrently requested to -// delete identical path. -func (i *inotify) Unwatch(path string) (err error) { - iwd := int32(invalidDescriptor) - i.RLock() - for iwdkey, wd := range i.m { - if wd.path == path { - iwd = iwdkey - break - } - } - i.RUnlock() - if iwd == invalidDescriptor { - return errors.New("notify: path " + path + " is already watched") - } - fd := atomic.LoadInt32(&i.fd) - if err = removeInotifyWatch(fd, iwd); err != nil { - return - } - i.Lock() - delete(i.m, iwd) - i.Unlock() - return nil -} - -// Close implements notify.watcher interface. It removes all existing watch -// descriptors and wakes up producer goroutine by sending data to the write end -// of the pipe. The function waits for a signal from producer which means that -// all operations on current monitoring instance are done. -func (i *inotify) Close() (err error) { - i.Lock() - if fd := atomic.LoadInt32(&i.fd); fd == invalidDescriptor { - i.Unlock() - return nil - } - for iwd := range i.m { - if e := removeInotifyWatch(i.fd, iwd); e != nil && err == nil { - err = e - } - delete(i.m, iwd) - } - switch _, errwrite := unix.Write(i.pipefd[1], []byte{0x00}); { - case errwrite != nil && err == nil: - err = errwrite - fallthrough - case errwrite != nil: - i.Unlock() - default: - i.Unlock() - i.wg.Wait() - } - return -} - -// if path was removed, notify already removed the watch and returns EINVAL error -func removeInotifyWatch(fd int32, iwd int32) (err error) { - if _, err = unix.InotifyRmWatch(int(fd), uint32(iwd)); err != nil && err != unix.EINVAL { - return - } - return nil -} diff --git a/vendor/github.com/rjeczalik/notify/watcher_kqueue.go b/vendor/github.com/rjeczalik/notify/watcher_kqueue.go deleted file mode 100644 index 22e3c2c4a460..000000000000 --- a/vendor/github.com/rjeczalik/notify/watcher_kqueue.go +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build darwin,kqueue dragonfly freebsd netbsd openbsd - -package notify - -import ( - "fmt" - "os" - "syscall" -) - -// newTrigger returns implementation of trigger. -func newTrigger(pthLkp map[string]*watched) trigger { - return &kq{ - pthLkp: pthLkp, - idLkp: make(map[int]*watched), - } -} - -// kq is a structure implementing trigger for kqueue. -type kq struct { - // fd is a kqueue file descriptor - fd int - // pipefds are file descriptors used to stop `Kevent` call. - pipefds [2]int - // idLkp is a data structure mapping file descriptors with data about watching - // represented by them files/directories. - idLkp map[int]*watched - // pthLkp is a structure mapping monitored files/dir with data about them, - // shared with parent trg structure - pthLkp map[string]*watched -} - -// watched is a data structure representing watched file/directory. -type watched struct { - trgWatched - // fd is a file descriptor for watched file/directory. - fd int -} - -// Stop implements trigger. -func (k *kq) Stop() (err error) { - // trigger event used to interrupt Kevent call. - _, err = syscall.Write(k.pipefds[1], []byte{0x00}) - return -} - -// Close implements trigger. -func (k *kq) Close() error { - return syscall.Close(k.fd) -} - -// NewWatched implements trigger. -func (*kq) NewWatched(p string, fi os.FileInfo) (*watched, error) { - fd, err := syscall.Open(p, syscall.O_NONBLOCK|syscall.O_RDONLY, 0) - if err != nil { - return nil, err - } - return &watched{ - trgWatched: trgWatched{p: p, fi: fi}, - fd: fd, - }, nil -} - -// Record implements trigger. -func (k *kq) Record(w *watched) { - k.idLkp[w.fd], k.pthLkp[w.p] = w, w -} - -// Del implements trigger. -func (k *kq) Del(w *watched) { - syscall.Close(w.fd) - delete(k.idLkp, w.fd) - delete(k.pthLkp, w.p) -} - -func inter2kq(n interface{}) syscall.Kevent_t { - kq, ok := n.(syscall.Kevent_t) - if !ok { - panic(fmt.Sprintf("kqueue: type should be Kevent_t, %T instead", n)) - } - return kq -} - -// Init implements trigger. -func (k *kq) Init() (err error) { - if k.fd, err = syscall.Kqueue(); err != nil { - return - } - // Creates pipe used to stop `Kevent` call by registering it, - // watching read end and writing to other end of it. - if err = syscall.Pipe(k.pipefds[:]); err != nil { - return nonil(err, k.Close()) - } - var kevn [1]syscall.Kevent_t - syscall.SetKevent(&kevn[0], k.pipefds[0], syscall.EVFILT_READ, syscall.EV_ADD) - if _, err = syscall.Kevent(k.fd, kevn[:], nil, nil); err != nil { - return nonil(err, k.Close()) - } - return -} - -// Unwatch implements trigger. -func (k *kq) Unwatch(w *watched) (err error) { - var kevn [1]syscall.Kevent_t - syscall.SetKevent(&kevn[0], w.fd, syscall.EVFILT_VNODE, syscall.EV_DELETE) - - _, err = syscall.Kevent(k.fd, kevn[:], nil, nil) - return -} - -// Watch implements trigger. -func (k *kq) Watch(fi os.FileInfo, w *watched, e int64) (err error) { - var kevn [1]syscall.Kevent_t - syscall.SetKevent(&kevn[0], w.fd, syscall.EVFILT_VNODE, - syscall.EV_ADD|syscall.EV_CLEAR) - kevn[0].Fflags = uint32(e) - - _, err = syscall.Kevent(k.fd, kevn[:], nil, nil) - return -} - -// Wait implements trigger. -func (k *kq) Wait() (interface{}, error) { - var ( - kevn [1]syscall.Kevent_t - err error - ) - kevn[0] = syscall.Kevent_t{} - _, err = syscall.Kevent(k.fd, nil, kevn[:], nil) - - return kevn[0], err -} - -// Watched implements trigger. -func (k *kq) Watched(n interface{}) (*watched, int64, error) { - kevn, ok := n.(syscall.Kevent_t) - if !ok { - panic(fmt.Sprintf("kq: type should be syscall.Kevent_t, %T instead", kevn)) - } - if _, ok = k.idLkp[int(kevn.Ident)]; !ok { - return nil, 0, errNotWatched - } - return k.idLkp[int(kevn.Ident)], int64(kevn.Fflags), nil -} - -// IsStop implements trigger. -func (k *kq) IsStop(n interface{}, err error) bool { - return int(inter2kq(n).Ident) == k.pipefds[0] -} - -func init() { - encode = func(e Event, dir bool) (o int64) { - // Create event is not supported by kqueue. Instead NoteWrite event will - // be registered for a directory. If this event will be reported on dir - // which is to be monitored for Create, dir will be rescanned - // and Create events will be generated and returned for new files. - // In case of files, if not requested NoteRename event is reported, - // it will be ignored. - o = int64(e &^ Create) - if (e&Create != 0 && dir) || e&Write != 0 { - o = (o &^ int64(Write)) | int64(NoteWrite) - } - if e&Rename != 0 { - o = (o &^ int64(Rename)) | int64(NoteRename) - } - if e&Remove != 0 { - o = (o &^ int64(Remove)) | int64(NoteDelete) - } - return - } - nat2not = map[Event]Event{ - NoteWrite: Write, - NoteRename: Rename, - NoteDelete: Remove, - NoteExtend: Event(0), - NoteAttrib: Event(0), - NoteRevoke: Event(0), - NoteLink: Event(0), - } - not2nat = map[Event]Event{ - Write: NoteWrite, - Rename: NoteRename, - Remove: NoteDelete, - } -} diff --git a/vendor/github.com/rjeczalik/notify/watcher_notimplemented.go b/vendor/github.com/rjeczalik/notify/watcher_notimplemented.go deleted file mode 100644 index bb0672fd88bc..000000000000 --- a/vendor/github.com/rjeczalik/notify/watcher_notimplemented.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) 2014-2018 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build !darwin,!linux,!freebsd,!dragonfly,!netbsd,!openbsd,!windows -// +build !kqueue,!solaris - -package notify - -import "errors" - -// newWatcher stub. -func newWatcher(chan<- EventInfo) watcher { - return watcherStub{errors.New("notify: not implemented")} -} diff --git a/vendor/github.com/rjeczalik/notify/watcher_readdcw.go b/vendor/github.com/rjeczalik/notify/watcher_readdcw.go deleted file mode 100644 index b69811a690f9..000000000000 --- a/vendor/github.com/rjeczalik/notify/watcher_readdcw.go +++ /dev/null @@ -1,605 +0,0 @@ -// Copyright (c) 2014-2018 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build windows - -package notify - -import ( - "errors" - "runtime" - "sync" - "sync/atomic" - "syscall" - "unsafe" -) - -// readBufferSize defines the size of an array in which read statuses are stored. -// The buffer have to be DWORD-aligned and, if notify is used in monitoring a -// directory over the network, its size must not be greater than 64KB. Each of -// watched directories uses its own buffer for storing events. -const readBufferSize = 4096 - -// Since all operations which go through the Windows completion routine are done -// asynchronously, filter may set one of the constants below. They were defined -// in order to distinguish whether current folder should be re-registered in -// ReadDirectoryChangesW function or some control operations need to be executed. -const ( - stateRewatch uint32 = 1 << (28 + iota) - stateUnwatch - stateCPClose -) - -// Filter used in current implementation was split into four segments: -// - bits 0-11 store ReadDirectoryChangesW filters, -// - bits 12-19 store File notify actions, -// - bits 20-27 store notify specific events and flags, -// - bits 28-31 store states which are used in loop's FSM. -// Constants below are used as masks to retrieve only specific filter parts. -const ( - onlyNotifyChanges uint32 = 0x00000FFF - onlyNGlobalEvents uint32 = 0x0FF00000 - onlyMachineStates uint32 = 0xF0000000 -) - -// grip represents a single watched directory. It stores the data required by -// ReadDirectoryChangesW function. Only the filter, recursive, and handle members -// may by modified by watcher implementation. Rest of the them have to remain -// constant since they are used by Windows completion routine. This indicates that -// grip can be removed only when all operations on the file handle are finished. -type grip struct { - handle syscall.Handle - filter uint32 - recursive bool - pathw []uint16 - buffer [readBufferSize]byte - parent *watched - ovlapped *overlappedEx -} - -// overlappedEx stores information used in asynchronous input and output. -// Additionally, overlappedEx contains a pointer to 'grip' item which is used in -// order to gather the structure in which the overlappedEx object was created. -type overlappedEx struct { - syscall.Overlapped - parent *grip -} - -// newGrip creates a new file handle that can be used in overlapped operations. -// Then, the handle is associated with I/O completion port 'cph' and its value -// is stored in newly created 'grip' object. -func newGrip(cph syscall.Handle, parent *watched, filter uint32) (*grip, error) { - g := &grip{ - handle: syscall.InvalidHandle, - filter: filter, - recursive: parent.recursive, - pathw: parent.pathw, - parent: parent, - ovlapped: &overlappedEx{}, - } - if err := g.register(cph); err != nil { - return nil, err - } - g.ovlapped.parent = g - return g, nil -} - -// NOTE : Thread safe -func (g *grip) register(cph syscall.Handle) (err error) { - if g.handle, err = syscall.CreateFile( - &g.pathw[0], - syscall.FILE_LIST_DIRECTORY, - syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - nil, - syscall.OPEN_EXISTING, - syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, - 0, - ); err != nil { - return - } - if _, err = syscall.CreateIoCompletionPort(g.handle, cph, 0, 0); err != nil { - syscall.CloseHandle(g.handle) - return - } - return g.readDirChanges() -} - -// readDirChanges tells the system to store file change information in grip's -// buffer. Directory changes that occur between calls to this function are added -// to the buffer and then, returned with the next call. -func (g *grip) readDirChanges() error { - handle := syscall.Handle(atomic.LoadUintptr((*uintptr)(&g.handle))) - if handle == syscall.InvalidHandle { - return nil // Handle was closed. - } - - return syscall.ReadDirectoryChanges( - handle, - &g.buffer[0], - uint32(unsafe.Sizeof(g.buffer)), - g.recursive, - encode(g.filter), - nil, - (*syscall.Overlapped)(unsafe.Pointer(g.ovlapped)), - 0, - ) -} - -// encode transforms a generic filter, which contains platform independent and -// implementation specific bit fields, to value that can be used as NotifyFilter -// parameter in ReadDirectoryChangesW function. -func encode(filter uint32) uint32 { - e := Event(filter & (onlyNGlobalEvents | onlyNotifyChanges)) - if e&dirmarker != 0 { - return uint32(FileNotifyChangeDirName) - } - if e&Create != 0 { - e = (e ^ Create) | FileNotifyChangeFileName - } - if e&Remove != 0 { - e = (e ^ Remove) | FileNotifyChangeFileName - } - if e&Write != 0 { - e = (e ^ Write) | FileNotifyChangeAttributes | FileNotifyChangeSize | - FileNotifyChangeCreation | FileNotifyChangeSecurity - } - if e&Rename != 0 { - e = (e ^ Rename) | FileNotifyChangeFileName - } - return uint32(e) -} - -// watched is made in order to check whether an action comes from a directory or -// file. This approach requires two file handlers per single monitored folder. The -// second grip handles actions which include creating or deleting a directory. If -// these processes are not monitored, only the first grip is created. -type watched struct { - filter uint32 - recursive bool - count uint8 - pathw []uint16 - digrip [2]*grip -} - -// newWatched creates a new watched instance. It splits the filter variable into -// two parts. The first part is responsible for watching all events which can be -// created for a file in watched directory structure and the second one watches -// only directory Create/Remove actions. If all operations succeed, the Create -// message is sent to I/O completion port queue for further processing. -func newWatched(cph syscall.Handle, filter uint32, recursive bool, - path string) (wd *watched, err error) { - wd = &watched{ - filter: filter, - recursive: recursive, - } - if wd.pathw, err = syscall.UTF16FromString(path); err != nil { - return - } - if err = wd.recreate(cph); err != nil { - return - } - return wd, nil -} - -// TODO : doc -func (wd *watched) recreate(cph syscall.Handle) (err error) { - filefilter := wd.filter &^ uint32(FileNotifyChangeDirName) - if err = wd.updateGrip(0, cph, filefilter == 0, filefilter); err != nil { - return - } - dirfilter := wd.filter & uint32(FileNotifyChangeDirName|Create|Remove) - if err = wd.updateGrip(1, cph, dirfilter == 0, wd.filter|uint32(dirmarker)); err != nil { - return - } - wd.filter &^= onlyMachineStates - return -} - -// TODO : doc -func (wd *watched) updateGrip(idx int, cph syscall.Handle, reset bool, - newflag uint32) (err error) { - if reset { - wd.digrip[idx] = nil - } else { - if wd.digrip[idx] == nil { - if wd.digrip[idx], err = newGrip(cph, wd, newflag); err != nil { - wd.closeHandle() - return - } - } else { - wd.digrip[idx].filter = newflag - wd.digrip[idx].recursive = wd.recursive - if err = wd.digrip[idx].register(cph); err != nil { - wd.closeHandle() - return - } - } - wd.count++ - } - return -} - -// closeHandle closes handles that are stored in digrip array. Function always -// tries to close all of the handlers before it exits, even when there are errors -// returned from the operating system kernel. -func (wd *watched) closeHandle() (err error) { - for _, g := range wd.digrip { - if g == nil { - continue - } - - for { - handle := syscall.Handle(atomic.LoadUintptr((*uintptr)(&g.handle))) - if handle == syscall.InvalidHandle { - break // Already closed. - } - - e := syscall.CloseHandle(handle) - if e != nil && err == nil { - err = e - } - - // Set invalid handle even when CloseHandle fails. This will leak - // the handle but, since we can't close it anyway, there won't be - // any difference. - if atomic.CompareAndSwapUintptr((*uintptr)(&g.handle), - (uintptr)(handle), (uintptr)(syscall.InvalidHandle)) { - break - } - } - } - return -} - -// watcher implements Watcher interface. It stores a set of watched directories. -// All operations which remove watched objects from map `m` must be performed in -// loop goroutine since these structures are used internally by operating system. -type readdcw struct { - sync.Mutex - m map[string]*watched - cph syscall.Handle - start bool - wg sync.WaitGroup - c chan<- EventInfo -} - -// NewWatcher creates new non-recursive watcher backed by ReadDirectoryChangesW. -func newWatcher(c chan<- EventInfo) watcher { - r := &readdcw{ - m: make(map[string]*watched), - cph: syscall.InvalidHandle, - c: c, - } - runtime.SetFinalizer(r, func(r *readdcw) { - if r.cph != syscall.InvalidHandle { - syscall.CloseHandle(r.cph) - } - }) - return r -} - -// Watch implements notify.Watcher interface. -func (r *readdcw) Watch(path string, event Event) error { - return r.watch(path, event, false) -} - -// RecursiveWatch implements notify.RecursiveWatcher interface. -func (r *readdcw) RecursiveWatch(path string, event Event) error { - return r.watch(path, event, true) -} - -// watch inserts a directory to the group of watched folders. If watched folder -// already exists, function tries to rewatch it with new filters(NOT VALID). Moreover, -// watch starts the main event loop goroutine when called for the first time. -func (r *readdcw) watch(path string, event Event, recursive bool) error { - if event&^(All|fileNotifyChangeAll) != 0 { - return errors.New("notify: unknown event") - } - - r.Lock() - defer r.Unlock() - - if wd, ok := r.m[path]; ok { - dbgprint("watch: already exists") - wd.filter &^= stateUnwatch - return nil - } - - if err := r.lazyinit(); err != nil { - return err - } - - wd, err := newWatched(r.cph, uint32(event), recursive, path) - if err != nil { - return err - } - - r.m[path] = wd - dbgprint("watch: new watch added") - - return nil -} - -// lazyinit creates an I/O completion port and starts the main event loop. -func (r *readdcw) lazyinit() (err error) { - invalid := uintptr(syscall.InvalidHandle) - - if atomic.LoadUintptr((*uintptr)(&r.cph)) == invalid { - cph := syscall.InvalidHandle - if cph, err = syscall.CreateIoCompletionPort(cph, 0, 0, 0); err != nil { - return - } - - r.cph, r.start = cph, true - go r.loop() - } - - return -} - -// TODO(pknap) : doc -func (r *readdcw) loop() { - var n, key uint32 - var overlapped *syscall.Overlapped - for { - err := syscall.GetQueuedCompletionStatus(r.cph, &n, &key, &overlapped, syscall.INFINITE) - if key == stateCPClose { - r.Lock() - handle := r.cph - r.cph = syscall.InvalidHandle - r.Unlock() - syscall.CloseHandle(handle) - r.wg.Done() - return - } - if overlapped == nil { - // TODO: check key == rewatch delete or 0(panic) - continue - } - overEx := (*overlappedEx)(unsafe.Pointer(overlapped)) - if n != 0 { - r.loopevent(n, overEx) - if err = overEx.parent.readDirChanges(); err != nil { - // TODO: error handling - } - } - r.loopstate(overEx) - } -} - -// TODO(pknap) : doc -func (r *readdcw) loopstate(overEx *overlappedEx) { - r.Lock() - defer r.Unlock() - filter := overEx.parent.parent.filter - if filter&onlyMachineStates == 0 { - return - } - if overEx.parent.parent.count--; overEx.parent.parent.count == 0 { - switch filter & onlyMachineStates { - case stateRewatch: - dbgprint("loopstate rewatch") - overEx.parent.parent.recreate(r.cph) - case stateUnwatch: - dbgprint("loopstate unwatch") - overEx.parent.parent.closeHandle() - delete(r.m, syscall.UTF16ToString(overEx.parent.pathw)) - case stateCPClose: - default: - panic(`notify: windows loopstate logic error`) - } - } -} - -// TODO(pknap) : doc -func (r *readdcw) loopevent(n uint32, overEx *overlappedEx) { - events := []*event{} - var currOffset uint32 - for { - raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&overEx.parent.buffer[currOffset])) - name := syscall.UTF16ToString((*[syscall.MAX_LONG_PATH]uint16)(unsafe.Pointer(&raw.FileName))[:raw.FileNameLength>>1]) - events = append(events, &event{ - pathw: overEx.parent.pathw, - filter: overEx.parent.filter, - action: raw.Action, - name: name, - }) - if raw.NextEntryOffset == 0 { - break - } - if currOffset += raw.NextEntryOffset; currOffset >= n { - break - } - } - r.send(events) -} - -// TODO(pknap) : doc -func (r *readdcw) send(es []*event) { - for _, e := range es { - var syse Event - if e.e, syse = decode(e.filter, e.action); e.e == 0 && syse == 0 { - continue - } - switch { - case e.action == syscall.FILE_ACTION_MODIFIED: - e.ftype = fTypeUnknown - case e.filter&uint32(dirmarker) != 0: - e.ftype = fTypeDirectory - default: - e.ftype = fTypeFile - } - switch { - case e.e == 0: - e.e = syse - case syse != 0: - r.c <- &event{ - pathw: e.pathw, - name: e.name, - ftype: e.ftype, - action: e.action, - filter: e.filter, - e: syse, - } - } - r.c <- e - } -} - -// Rewatch implements notify.Rewatcher interface. -func (r *readdcw) Rewatch(path string, oldevent, newevent Event) error { - return r.rewatch(path, uint32(oldevent), uint32(newevent), false) -} - -// RecursiveRewatch implements notify.RecursiveRewatcher interface. -func (r *readdcw) RecursiveRewatch(oldpath, newpath string, oldevent, - newevent Event) error { - if oldpath != newpath { - if err := r.unwatch(oldpath); err != nil { - return err - } - return r.watch(newpath, newevent, true) - } - return r.rewatch(newpath, uint32(oldevent), uint32(newevent), true) -} - -// TODO : (pknap) doc. -func (r *readdcw) rewatch(path string, oldevent, newevent uint32, recursive bool) (err error) { - if Event(newevent)&^(All|fileNotifyChangeAll) != 0 { - return errors.New("notify: unknown event") - } - var wd *watched - r.Lock() - defer r.Unlock() - if wd, err = r.nonStateWatchedLocked(path); err != nil { - return - } - if wd.filter&(onlyNotifyChanges|onlyNGlobalEvents) != oldevent { - panic(`notify: windows re-watcher logic error`) - } - wd.filter = stateRewatch | newevent - wd.recursive, recursive = recursive, wd.recursive - if err = wd.closeHandle(); err != nil { - wd.filter = oldevent - wd.recursive = recursive - return - } - return -} - -// TODO : pknap -func (r *readdcw) nonStateWatchedLocked(path string) (wd *watched, err error) { - wd, ok := r.m[path] - if !ok || wd == nil { - err = errors.New(`notify: ` + path + ` path is unwatched`) - return - } - if wd.filter&onlyMachineStates != 0 { - err = errors.New(`notify: another re/unwatching operation in progress`) - return - } - return -} - -// Unwatch implements notify.Watcher interface. -func (r *readdcw) Unwatch(path string) error { - return r.unwatch(path) -} - -// RecursiveUnwatch implements notify.RecursiveWatcher interface. -func (r *readdcw) RecursiveUnwatch(path string) error { - return r.unwatch(path) -} - -// TODO : pknap -func (r *readdcw) unwatch(path string) (err error) { - var wd *watched - - r.Lock() - defer r.Unlock() - if wd, err = r.nonStateWatchedLocked(path); err != nil { - return - } - - wd.filter |= stateUnwatch - dbgprint("unwatch: set unwatch state") - - if _, attrErr := syscall.GetFileAttributes(&wd.pathw[0]); attrErr != nil { - for _, g := range wd.digrip { - if g == nil { - continue - } - - dbgprint("unwatch: posting") - if err = syscall.PostQueuedCompletionStatus(r.cph, 0, 0, (*syscall.Overlapped)(unsafe.Pointer(g.ovlapped))); err != nil { - wd.filter &^= stateUnwatch - return - } - } - } - - return -} - -// Close resets the whole watcher object, closes all existing file descriptors, -// and sends stateCPClose state as completion key to the main watcher's loop. -func (r *readdcw) Close() (err error) { - r.Lock() - if !r.start { - r.Unlock() - return nil - } - for _, wd := range r.m { - wd.filter &^= onlyMachineStates - wd.filter |= stateCPClose - if e := wd.closeHandle(); e != nil && err == nil { - err = e - } - } - r.start = false - r.Unlock() - r.wg.Add(1) - if e := syscall.PostQueuedCompletionStatus(r.cph, 0, stateCPClose, nil); e != nil && err == nil { - return e - } - r.wg.Wait() - return -} - -// decode creates a notify event from both non-raw filter and action which was -// returned from completion routine. Function may return Event(0) in case when -// filter was replaced by a new value which does not contain fields that are -// valid with passed action. -func decode(filter, action uint32) (Event, Event) { - switch action { - case syscall.FILE_ACTION_ADDED: - return gensys(filter, Create, FileActionAdded) - case syscall.FILE_ACTION_REMOVED: - return gensys(filter, Remove, FileActionRemoved) - case syscall.FILE_ACTION_MODIFIED: - return gensys(filter, Write, FileActionModified) - case syscall.FILE_ACTION_RENAMED_OLD_NAME: - return gensys(filter, Rename, FileActionRenamedOldName) - case syscall.FILE_ACTION_RENAMED_NEW_NAME: - return gensys(filter, Rename, FileActionRenamedNewName) - } - panic(`notify: cannot decode internal mask`) -} - -// gensys decides whether the Windows action, system-independent event or both -// of them should be returned. Since the grip's filter may be atomically changed -// during watcher lifetime, it is possible that neither Windows nor notify masks -// are watched by the user when this function is called. -func gensys(filter uint32, ge, se Event) (gene, syse Event) { - isdir := filter&uint32(dirmarker) != 0 - if isdir && filter&uint32(FileNotifyChangeDirName) != 0 || - !isdir && filter&uint32(FileNotifyChangeFileName) != 0 || - filter&uint32(fileNotifyChangeModified) != 0 { - syse = se - } - if filter&uint32(ge) != 0 { - gene = ge - } - return -} diff --git a/vendor/github.com/rjeczalik/notify/watcher_stub.go b/vendor/github.com/rjeczalik/notify/watcher_stub.go deleted file mode 100644 index 9b284ddc85f3..000000000000 --- a/vendor/github.com/rjeczalik/notify/watcher_stub.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) 2014-2018 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -package notify - -type watcherStub struct{ error } - -// Following methods implement notify.watcher interface. -func (s watcherStub) Watch(string, Event) error { return s } -func (s watcherStub) Rewatch(string, Event, Event) error { return s } -func (s watcherStub) Unwatch(string) (err error) { return s } -func (s watcherStub) Close() error { return s } diff --git a/vendor/github.com/rjeczalik/notify/watcher_trigger.go b/vendor/github.com/rjeczalik/notify/watcher_trigger.go deleted file mode 100644 index 1ebe04829ee6..000000000000 --- a/vendor/github.com/rjeczalik/notify/watcher_trigger.go +++ /dev/null @@ -1,450 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build darwin,kqueue dragonfly freebsd netbsd openbsd solaris - -// watcher_trigger is used for FEN and kqueue which behave similarly: -// only files and dirs can be watched directly, but not files inside dirs. -// As a result Create events have to be generated by implementation when -// after Write event is returned for watched dir, it is rescanned and Create -// event is returned for new files and these are automatically added -// to watchlist. In case of removal of watched directory, native system returns -// events for all files, but for Rename, they also need to be generated. -// As a result native system works as something like trigger for rescan, -// but contains additional data about dir in which changes occurred. For files -// detailed data is returned. -// Usage of watcher_trigger requires: -// - trigger implementation, -// - encode func, -// - not2nat, nat2not maps. -// Required manual operations on filesystem can lead to loss of precision. - -package notify - -import ( - "fmt" - "os" - "path/filepath" - "strings" - "sync" - "syscall" -) - -// trigger is to be implemented by platform implementation like FEN or kqueue. -type trigger interface { - // Close closes watcher's main native file descriptor. - Close() error - // Stop waiting for new events. - Stop() error - // Create new instance of watched. - NewWatched(string, os.FileInfo) (*watched, error) - // Record internally new *watched instance. - Record(*watched) - // Del removes internal copy of *watched instance. - Del(*watched) - // Watched returns *watched instance and native events for native type. - Watched(interface{}) (*watched, int64, error) - // Init initializes native watcher call. - Init() error - // Watch starts watching provided file/dir. - Watch(os.FileInfo, *watched, int64) error - // Unwatch stops watching provided file/dir. - Unwatch(*watched) error - // Wait for new events. - Wait() (interface{}, error) - // IsStop checks if Wait finished because of request watcher's stop. - IsStop(n interface{}, err error) bool -} - -// trgWatched is a the base data structure representing watched file/directory. -// The platform specific full data structure (watched) must embed this type. -type trgWatched struct { - // p is a path to watched file/directory. - p string - // fi provides information about watched file/dir. - fi os.FileInfo - // eDir represents events watched directly. - eDir Event - // eNonDir represents events watched indirectly. - eNonDir Event -} - -// encode Event to native representation. Implementation is to be provided by -// platform specific implementation. -var encode func(Event, bool) int64 - -var ( - // nat2not matches native events to notify's ones. To be initialized by - // platform dependent implementation. - nat2not map[Event]Event - // not2nat matches notify's events to native ones. To be initialized by - // platform dependent implementation. - not2nat map[Event]Event -) - -// trg is a main structure implementing watcher. -type trg struct { - sync.Mutex - // s is a channel used to stop monitoring. - s chan struct{} - // c is a channel used to pass events further. - c chan<- EventInfo - // pthLkp is a data structure mapping file names with data about watching - // represented by them files/directories. - pthLkp map[string]*watched - // t is a platform dependent implementation of trigger. - t trigger -} - -// newWatcher returns new watcher's implementation. -func newWatcher(c chan<- EventInfo) watcher { - t := &trg{ - s: make(chan struct{}, 1), - pthLkp: make(map[string]*watched, 0), - c: c, - } - t.t = newTrigger(t.pthLkp) - if err := t.t.Init(); err != nil { - t.Close() - return watcherStub{fmt.Errorf("failed setting up watcher: %v", err)} - } - go t.monitor() - return t -} - -// Close implements watcher. -func (t *trg) Close() (err error) { - t.Lock() - if err = t.t.Stop(); err != nil { - t.Unlock() - return - } - <-t.s - var e error - for _, w := range t.pthLkp { - if e = t.unwatch(w.p, w.fi); e != nil { - dbgprintf("trg: unwatch %q failed: %q\n", w.p, e) - err = nonil(err, e) - } - } - if e = t.t.Close(); e != nil { - dbgprintf("trg: closing native watch failed: %q\n", e) - err = nonil(err, e) - } - if remaining := len(t.pthLkp); remaining != 0 { - err = nonil(err, fmt.Errorf("Not all watches were removed: len(t.pthLkp) == %v", len(t.pthLkp))) - } - t.Unlock() - return -} - -// send reported events one by one through chan. -func (t *trg) send(evn []event) { - for i := range evn { - t.c <- &evn[i] - } -} - -// singlewatch starts to watch given p file/directory. -func (t *trg) singlewatch(p string, e Event, direct mode, fi os.FileInfo) (err error) { - w, ok := t.pthLkp[p] - if !ok { - if w, err = t.t.NewWatched(p, fi); err != nil { - return - } - } - switch direct { - case dir: - w.eDir |= e - case ndir: - w.eNonDir |= e - case both: - w.eDir |= e - w.eNonDir |= e - } - if err = t.t.Watch(fi, w, encode(w.eDir|w.eNonDir, fi.IsDir())); err != nil { - return - } - if !ok { - t.t.Record(w) - return nil - } - return errAlreadyWatched -} - -// decode converts event received from native to notify.Event -// representation taking into account requested events (w). -func decode(o int64, w Event) (e Event) { - for f, n := range nat2not { - if o&int64(f) != 0 { - if w&f != 0 { - e |= f - } - if w&n != 0 { - e |= n - } - } - } - - return -} - -func (t *trg) watch(p string, e Event, fi os.FileInfo) error { - if err := t.singlewatch(p, e, dir, fi); err != nil { - if err != errAlreadyWatched { - return err - } - } - if fi.IsDir() { - err := t.walk(p, func(fi os.FileInfo) (err error) { - if err = t.singlewatch(filepath.Join(p, fi.Name()), e, ndir, - fi); err != nil { - if err != errAlreadyWatched { - return - } - } - return nil - }) - if err != nil { - return err - } - } - return nil -} - -// walk runs f func on each file/dir from p directory. -func (t *trg) walk(p string, fn func(os.FileInfo) error) error { - fp, err := os.Open(p) - if err != nil { - return err - } - ls, err := fp.Readdir(0) - fp.Close() - if err != nil { - return err - } - for i := range ls { - if err := fn(ls[i]); err != nil { - return err - } - } - return nil -} - -func (t *trg) unwatch(p string, fi os.FileInfo) error { - if fi.IsDir() { - err := t.walk(p, func(fi os.FileInfo) error { - err := t.singleunwatch(filepath.Join(p, fi.Name()), ndir) - if err != errNotWatched { - return err - } - return nil - }) - if err != nil { - return err - } - } - return t.singleunwatch(p, dir) -} - -// Watch implements Watcher interface. -func (t *trg) Watch(p string, e Event) error { - fi, err := os.Stat(p) - if err != nil { - return err - } - t.Lock() - err = t.watch(p, e, fi) - t.Unlock() - return err -} - -// Unwatch implements Watcher interface. -func (t *trg) Unwatch(p string) error { - fi, err := os.Stat(p) - if err != nil { - return err - } - t.Lock() - err = t.unwatch(p, fi) - t.Unlock() - return err -} - -// Rewatch implements Watcher interface. -// -// TODO(rjeczalik): This is a naive hack. Rewrite might help. -func (t *trg) Rewatch(p string, _, e Event) error { - fi, err := os.Stat(p) - if err != nil { - return err - } - t.Lock() - if err = t.unwatch(p, fi); err == nil { - // TODO(rjeczalik): If watch fails then we leave trigger in inconsistent - // state. Handle? Panic? Native version of rewatch? - err = t.watch(p, e, fi) - } - t.Unlock() - return nil -} - -func (*trg) file(w *watched, n interface{}, e Event) (evn []event) { - evn = append(evn, event{w.p, e, w.fi.IsDir(), n}) - return -} - -func (t *trg) dir(w *watched, n interface{}, e, ge Event) (evn []event) { - // If it's dir and delete we have to send it and continue, because - // other processing relies on opening (in this case not existing) dir. - // Events for contents of this dir are reported by native impl. - // However events for rename must be generated for all monitored files - // inside of moved directory, because native impl does not report it independently - // for each file descriptor being moved in result of move action on - // parent directory. - if (ge & (not2nat[Rename] | not2nat[Remove])) != 0 { - // Write is reported also for Remove on directory. Because of that - // we have to filter it out explicitly. - evn = append(evn, event{w.p, e & ^Write & ^not2nat[Write], true, n}) - if ge¬2nat[Rename] != 0 { - for p := range t.pthLkp { - if strings.HasPrefix(p, w.p+string(os.PathSeparator)) { - if err := t.singleunwatch(p, both); err != nil && err != errNotWatched && - !os.IsNotExist(err) { - dbgprintf("trg: failed stop watching moved file (%q): %q\n", - p, err) - } - if (w.eDir|w.eNonDir)&(not2nat[Rename]|Rename) != 0 { - evn = append(evn, event{ - p, (w.eDir | w.eNonDir) & e &^ Write &^ not2nat[Write], - w.fi.IsDir(), nil, - }) - } - } - } - } - t.t.Del(w) - return - } - if (ge & not2nat[Write]) != 0 { - switch err := t.walk(w.p, func(fi os.FileInfo) error { - p := filepath.Join(w.p, fi.Name()) - switch err := t.singlewatch(p, w.eDir, ndir, fi); { - case os.IsNotExist(err) && ((w.eDir & Remove) != 0): - evn = append(evn, event{p, Remove, fi.IsDir(), n}) - case err == errAlreadyWatched: - case err != nil: - dbgprintf("trg: watching %q failed: %q", p, err) - case (w.eDir & Create) != 0: - evn = append(evn, event{p, Create, fi.IsDir(), n}) - default: - } - return nil - }); { - case os.IsNotExist(err): - return - case err != nil: - dbgprintf("trg: dir processing failed: %q", err) - default: - } - } - return -} - -type mode uint - -const ( - dir mode = iota - ndir - both -) - -// unwatch stops watching p file/directory. -func (t *trg) singleunwatch(p string, direct mode) error { - w, ok := t.pthLkp[p] - if !ok { - return errNotWatched - } - switch direct { - case dir: - w.eDir = 0 - case ndir: - w.eNonDir = 0 - case both: - w.eDir, w.eNonDir = 0, 0 - } - if err := t.t.Unwatch(w); err != nil { - return err - } - if w.eNonDir|w.eDir != 0 { - mod := dir - if w.eNonDir != 0 { - mod = ndir - } - if err := t.singlewatch(p, w.eNonDir|w.eDir, mod, - w.fi); err != nil && err != errAlreadyWatched { - return err - } - } else { - t.t.Del(w) - } - return nil -} - -func (t *trg) monitor() { - var ( - n interface{} - err error - ) - for { - switch n, err = t.t.Wait(); { - case err == syscall.EINTR: - case t.t.IsStop(n, err): - t.s <- struct{}{} - return - case err != nil: - dbgprintf("trg: failed to read events: %q\n", err) - default: - t.send(t.process(n)) - } - } -} - -// process event returned by native call. -func (t *trg) process(n interface{}) (evn []event) { - t.Lock() - w, ge, err := t.t.Watched(n) - if err != nil { - t.Unlock() - dbgprintf("trg: %v event lookup failed: %q", Event(ge), err) - return - } - - e := decode(ge, w.eDir|w.eNonDir) - if ge&int64(not2nat[Remove]|not2nat[Rename]) == 0 { - switch fi, err := os.Stat(w.p); { - case err != nil: - default: - if err = t.t.Watch(fi, w, encode(w.eDir|w.eNonDir, fi.IsDir())); err != nil { - dbgprintf("trg: %q is no longer watched: %q", w.p, err) - t.t.Del(w) - } - } - } - if e == Event(0) && (!w.fi.IsDir() || (ge&int64(not2nat[Write])) == 0) { - t.Unlock() - return - } - - if w.fi.IsDir() { - evn = append(evn, t.dir(w, n, e, Event(ge))...) - } else { - evn = append(evn, t.file(w, n, e)...) - } - if Event(ge)&(not2nat[Remove]|not2nat[Rename]) != 0 { - t.t.Del(w) - } - t.Unlock() - return -} diff --git a/vendor/github.com/rjeczalik/notify/watchpoint.go b/vendor/github.com/rjeczalik/notify/watchpoint.go deleted file mode 100644 index 5afc914f4957..000000000000 --- a/vendor/github.com/rjeczalik/notify/watchpoint.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -package notify - -// EventDiff describes a change to an event set - EventDiff[0] is an old state, -// while EventDiff[1] is a new state. If event set has not changed (old == new), -// functions typically return the None value. -type eventDiff [2]Event - -func (diff eventDiff) Event() Event { - return diff[1] &^ diff[0] -} - -// Watchpoint -// -// The nil key holds total event set - logical sum for all registered events. -// It speeds up computing EventDiff for Add method. -// -// The rec key holds an event set for a watchpoints created by RecursiveWatch -// for a Watcher implementation which is not natively recursive. -type watchpoint map[chan<- EventInfo]Event - -// None is an empty event diff, think null object. -var none eventDiff - -// rec is just a placeholder -var rec = func() (ch chan<- EventInfo) { - ch = make(chan<- EventInfo) - close(ch) - return -}() - -func (wp watchpoint) dryAdd(ch chan<- EventInfo, e Event) eventDiff { - if e &^= internal; wp[ch]&e == e { - return none - } - total := wp[ch] &^ internal - return eventDiff{total, total | e} -} - -// Add assumes neither c nor e are nil or zero values. -func (wp watchpoint) Add(c chan<- EventInfo, e Event) (diff eventDiff) { - wp[c] |= e - diff[0] = wp[nil] - diff[1] = diff[0] | e - wp[nil] = diff[1] &^ omit - // Strip diff from internal events. - diff[0] &^= internal - diff[1] &^= internal - if diff[0] == diff[1] { - return none - } - return -} - -func (wp watchpoint) Del(c chan<- EventInfo, e Event) (diff eventDiff) { - wp[c] &^= e - if wp[c] == 0 { - delete(wp, c) - } - diff[0] = wp[nil] - delete(wp, nil) - if len(wp) != 0 { - // Recalculate total event set. - for _, e := range wp { - diff[1] |= e - } - wp[nil] = diff[1] &^ omit - } - // Strip diff from internal events. - diff[0] &^= internal - diff[1] &^= internal - if diff[0] == diff[1] { - return none - } - return -} - -func (wp watchpoint) Dispatch(ei EventInfo, extra Event) { - e := eventmask(ei, extra) - if !matches(wp[nil], e) { - return - } - for ch, eset := range wp { - if ch != nil && matches(eset, e) { - select { - case ch <- ei: - default: // Drop event if receiver is too slow - dbgprintf("dropped %s on %q: receiver too slow", ei.Event(), ei.Path()) - } - } - } -} - -func (wp watchpoint) Total() Event { - return wp[nil] &^ internal -} - -func (wp watchpoint) IsRecursive() bool { - return wp[nil]&recursive != 0 -} diff --git a/vendor/github.com/rjeczalik/notify/watchpoint_other.go b/vendor/github.com/rjeczalik/notify/watchpoint_other.go deleted file mode 100644 index 9bb381db7763..000000000000 --- a/vendor/github.com/rjeczalik/notify/watchpoint_other.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build !windows - -package notify - -// eventmask uses ei to create a new event which contains internal flags used by -// notify package logic. -func eventmask(ei EventInfo, extra Event) Event { - return ei.Event() | extra -} - -// matches reports a match only when: -// -// - for user events, when event is present in the given set -// - for internal events, when additionally both event and set have omit bit set -// -// Internal events must not be sent to user channels and vice versa. -func matches(set, event Event) bool { - return (set&omit)^(event&omit) == 0 && set&event == event -} diff --git a/vendor/github.com/rjeczalik/notify/watchpoint_readdcw.go b/vendor/github.com/rjeczalik/notify/watchpoint_readdcw.go deleted file mode 100644 index 9fd1e1df349f..000000000000 --- a/vendor/github.com/rjeczalik/notify/watchpoint_readdcw.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2014-2015 The Notify Authors. All rights reserved. -// Use of this source code is governed by the MIT license that can be -// found in the LICENSE file. - -// +build windows - -package notify - -// eventmask uses ei to create a new event which contains internal flags used by -// notify package logic. If one of FileAction* masks is detected, this function -// adds corresponding FileNotifyChange* values. This allows non registered -// FileAction* events to be passed on. -func eventmask(ei EventInfo, extra Event) (e Event) { - if e = ei.Event() | extra; e&fileActionAll != 0 { - if ev, ok := ei.(*event); ok { - switch ev.ftype { - case fTypeFile: - e |= FileNotifyChangeFileName - case fTypeDirectory: - e |= FileNotifyChangeDirName - case fTypeUnknown: - e |= fileNotifyChangeModified - } - return e &^ fileActionAll - } - } - return -} - -// matches reports a match only when: -// -// - for user events, when event is present in the given set -// - for internal events, when additionally both event and set have omit bit set -// -// Internal events must not be sent to user channels and vice versa. -func matches(set, event Event) bool { - return (set&omit)^(event&omit) == 0 && (set&event == event || set&fileNotifyChangeModified&event != 0) -} diff --git a/vendor/github.com/robertkrimen/otto/DESIGN.markdown b/vendor/github.com/robertkrimen/otto/DESIGN.markdown deleted file mode 100644 index 288752987817..000000000000 --- a/vendor/github.com/robertkrimen/otto/DESIGN.markdown +++ /dev/null @@ -1 +0,0 @@ -* Designate the filename of "anonymous" source code by the hash (md5/sha1, etc.) diff --git a/vendor/github.com/robertkrimen/otto/LICENSE b/vendor/github.com/robertkrimen/otto/LICENSE deleted file mode 100644 index b6179fe38708..000000000000 --- a/vendor/github.com/robertkrimen/otto/LICENSE +++ /dev/null @@ -1,7 +0,0 @@ -Copyright (c) 2012 Robert Krimen - -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/robertkrimen/otto/Makefile b/vendor/github.com/robertkrimen/otto/Makefile deleted file mode 100644 index 9868db3cac37..000000000000 --- a/vendor/github.com/robertkrimen/otto/Makefile +++ /dev/null @@ -1,63 +0,0 @@ -.PHONY: test test-race test-release release release-check test-262 -.PHONY: parser -.PHONY: otto assets underscore - -TESTS := \ - ~ - -TEST := -v --run -TEST := -v -TEST := -v --run Test\($(subst $(eval) ,\|,$(TESTS))\) -TEST := . - -test: parser inline.go - go test -i - go test $(TEST) - @echo PASS - -parser: - $(MAKE) -C parser - -inline.go: inline.pl - ./$< > $@ - -################# -# release, test # -################# - -release: test-race test-release - for package in . parser token ast file underscore registry; do (cd $$package && godocdown --signature > README.markdown); done - @echo \*\*\* make release-check - @echo PASS - -release-check: .test - $(MAKE) -C test build test - $(MAKE) -C .test/test262 build test - @echo PASS - -test-262: .test - $(MAKE) -C .test/test262 build test - @echo PASS - -test-release: - go test -i - go test - -test-race: - go test -race -i - go test -race - -################################# -# otto, assets, underscore, ... # -################################# - -otto: - $(MAKE) -C otto - -assets: - mkdir -p .assets - for file in underscore/test/*.js; do tr "\`" "_" < $$file > .assets/`basename $$file`; done - -underscore: - $(MAKE) -C $@ - diff --git a/vendor/github.com/robertkrimen/otto/README.markdown b/vendor/github.com/robertkrimen/otto/README.markdown deleted file mode 100644 index a1ae7d1ae60b..000000000000 --- a/vendor/github.com/robertkrimen/otto/README.markdown +++ /dev/null @@ -1,871 +0,0 @@ -# otto --- -```go -import "github.com/robertkrimen/otto" -``` - -Package otto is a JavaScript parser and interpreter written natively in Go. - -http://godoc.org/github.com/robertkrimen/otto - -```go -import ( - "github.com/robertkrimen/otto" -) -``` - -Run something in the VM - -```go -vm := otto.New() -vm.Run(` - abc = 2 + 2; - console.log("The value of abc is " + abc); // 4 -`) -``` - -Get a value out of the VM - -```go -if value, err := vm.Get("abc"); err == nil { - if value_int, err := value.ToInteger(); err == nil { - fmt.Printf("", value_int, err) - } -} -``` - -Set a number - -```go -vm.Set("def", 11) -vm.Run(` - console.log("The value of def is " + def); - // The value of def is 11 -`) -``` - -Set a string - -```go -vm.Set("xyzzy", "Nothing happens.") -vm.Run(` - console.log(xyzzy.length); // 16 -`) -``` - -Get the value of an expression - -```go -value, _ = vm.Run("xyzzy.length") -{ - // value is an int64 with a value of 16 - value, _ := value.ToInteger() -} -``` - -An error happens - -```go -value, err = vm.Run("abcdefghijlmnopqrstuvwxyz.length") -if err != nil { - // err = ReferenceError: abcdefghijlmnopqrstuvwxyz is not defined - // If there is an error, then value.IsUndefined() is true - ... -} -``` - -Set a Go function - -```go -vm.Set("sayHello", func(call otto.FunctionCall) otto.Value { - fmt.Printf("Hello, %s.\n", call.Argument(0).String()) - return otto.Value{} -}) -``` - -Set a Go function that returns something useful - -```go -vm.Set("twoPlus", func(call otto.FunctionCall) otto.Value { - right, _ := call.Argument(0).ToInteger() - result, _ := vm.ToValue(2 + right) - return result -}) -``` - -Use the functions in JavaScript - -```go -result, _ = vm.Run(` - sayHello("Xyzzy"); // Hello, Xyzzy. - sayHello(); // Hello, undefined - - result = twoPlus(2.0); // 4 -`) -``` - -### Parser - -A separate parser is available in the parser package if you're just interested -in building an AST. - -http://godoc.org/github.com/robertkrimen/otto/parser - -Parse and return an AST - -```go -filename := "" // A filename is optional -src := ` - // Sample xyzzy example - (function(){ - if (3.14159 > 0) { - console.log("Hello, World."); - return; - } - - var xyzzy = NaN; - console.log("Nothing happens."); - return xyzzy; - })(); -` - -// Parse some JavaScript, yielding a *ast.Program and/or an ErrorList -program, err := parser.ParseFile(nil, filename, src, 0) -``` - -### otto - -You can run (Go) JavaScript from the commandline with: -http://github.com/robertkrimen/otto/tree/master/otto - - $ go get -v github.com/robertkrimen/otto/otto - -Run JavaScript by entering some source on stdin or by giving otto a filename: - - $ otto example.js - -### underscore - -Optionally include the JavaScript utility-belt library, underscore, with this -import: - -```go -import ( - "github.com/robertkrimen/otto" - _ "github.com/robertkrimen/otto/underscore" -) - -// Now every otto runtime will come loaded with underscore -``` - -For more information: http://github.com/robertkrimen/otto/tree/master/underscore - - -### Caveat Emptor - -The following are some limitations with otto: - - * "use strict" will parse, but does nothing. - * The regular expression engine (re2/regexp) is not fully compatible with the ECMA5 specification. - * Otto targets ES5. ES6 features (eg: Typed Arrays) are not supported. - - -### Regular Expression Incompatibility - -Go translates JavaScript-style regular expressions into something that is -"regexp" compatible via `parser.TransformRegExp`. Unfortunately, RegExp requires -backtracking for some patterns, and backtracking is not supported by the -standard Go engine: https://code.google.com/p/re2/wiki/Syntax - -Therefore, the following syntax is incompatible: - - (?=) // Lookahead (positive), currently a parsing error - (?!) // Lookahead (backhead), currently a parsing error - \1 // Backreference (\1, \2, \3, ...), currently a parsing error - -A brief discussion of these limitations: "Regexp (?!re)" -https://groups.google.com/forum/?fromgroups=#%21topic/golang-nuts/7qgSDWPIh_E - -More information about re2: https://code.google.com/p/re2/ - -In addition to the above, re2 (Go) has a different definition for \s: [\t\n\f\r -]. The JavaScript definition, on the other hand, also includes \v, Unicode -"Separator, Space", etc. - - -### Halting Problem - -If you want to stop long running executions (like third-party code), you can use -the interrupt channel to do this: - -```go -package main - -import ( - "errors" - "fmt" - "os" - "time" - - "github.com/robertkrimen/otto" -) - -var halt = errors.New("Stahp") - -func main() { - runUnsafe(`var abc = [];`) - runUnsafe(` - while (true) { - // Loop forever - }`) -} - -func runUnsafe(unsafe string) { - start := time.Now() - defer func() { - duration := time.Since(start) - if caught := recover(); caught != nil { - if caught == halt { - fmt.Fprintf(os.Stderr, "Some code took to long! Stopping after: %v\n", duration) - return - } - panic(caught) // Something else happened, repanic! - } - fmt.Fprintf(os.Stderr, "Ran code successfully: %v\n", duration) - }() - - vm := otto.New() - vm.Interrupt = make(chan func(), 1) // The buffer prevents blocking - - go func() { - time.Sleep(2 * time.Second) // Stop after two seconds - vm.Interrupt <- func() { - panic(halt) - } - }() - - vm.Run(unsafe) // Here be dragons (risky code) -} -``` - -Where is setTimeout/setInterval? - -These timing functions are not actually part of the ECMA-262 specification. -Typically, they belong to the `window` object (in the browser). It would not be -difficult to provide something like these via Go, but you probably want to wrap -otto in an event loop in that case. - -For an example of how this could be done in Go with otto, see natto: - -http://github.com/robertkrimen/natto - -Here is some more discussion of the issue: - -* http://book.mixu.net/node/ch2.html - -* http://en.wikipedia.org/wiki/Reentrancy_%28computing%29 - -* http://aaroncrane.co.uk/2009/02/perl_safe_signals/ - -## Usage - -```go -var ErrVersion = errors.New("version mismatch") -``` - -#### type Error - -```go -type Error struct { -} -``` - -An Error represents a runtime error, e.g. a TypeError, a ReferenceError, etc. - -#### func (Error) Error - -```go -func (err Error) Error() string -``` -Error returns a description of the error - - TypeError: 'def' is not a function - -#### func (Error) String - -```go -func (err Error) String() string -``` -String returns a description of the error and a trace of where the error -occurred. - - TypeError: 'def' is not a function - at xyz (:3:9) - at :7:1/ - -#### type FunctionCall - -```go -type FunctionCall struct { - This Value - ArgumentList []Value - Otto *Otto -} -``` - -FunctionCall is an encapsulation of a JavaScript function call. - -#### func (FunctionCall) Argument - -```go -func (self FunctionCall) Argument(index int) Value -``` -Argument will return the value of the argument at the given index. - -If no such argument exists, undefined is returned. - -#### type Object - -```go -type Object struct { -} -``` - -Object is the representation of a JavaScript object. - -#### func (Object) Call - -```go -func (self Object) Call(name string, argumentList ...interface{}) (Value, error) -``` -Call a method on the object. - -It is essentially equivalent to: - - var method, _ := object.Get(name) - method.Call(object, argumentList...) - -An undefined value and an error will result if: - - 1. There is an error during conversion of the argument list - 2. The property is not actually a function - 3. An (uncaught) exception is thrown - -#### func (Object) Class - -```go -func (self Object) Class() string -``` -Class will return the class string of the object. - -The return value will (generally) be one of: - - Object - Function - Array - String - Number - Boolean - Date - RegExp - -#### func (Object) Get - -```go -func (self Object) Get(name string) (Value, error) -``` -Get the value of the property with the given name. - -#### func (Object) Keys - -```go -func (self Object) Keys() []string -``` -Get the keys for the object - -Equivalent to calling Object.keys on the object - -#### func (Object) Set - -```go -func (self Object) Set(name string, value interface{}) error -``` -Set the property of the given name to the given value. - -An error will result if the setting the property triggers an exception (i.e. -read-only), or there is an error during conversion of the given value. - -#### func (Object) Value - -```go -func (self Object) Value() Value -``` -Value will return self as a value. - -#### type Otto - -```go -type Otto struct { - // Interrupt is a channel for interrupting the runtime. You can use this to halt a long running execution, for example. - // See "Halting Problem" for more information. - Interrupt chan func() -} -``` - -Otto is the representation of the JavaScript runtime. Each instance of Otto has -a self-contained namespace. - -#### func New - -```go -func New() *Otto -``` -New will allocate a new JavaScript runtime - -#### func Run - -```go -func Run(src interface{}) (*Otto, Value, error) -``` -Run will allocate a new JavaScript runtime, run the given source on the -allocated runtime, and return the runtime, resulting value, and error (if any). - -src may be a string, a byte slice, a bytes.Buffer, or an io.Reader, but it MUST -always be in UTF-8. - -src may also be a Script. - -src may also be a Program, but if the AST has been modified, then runtime -behavior is undefined. - -#### func (Otto) Call - -```go -func (self Otto) Call(source string, this interface{}, argumentList ...interface{}) (Value, error) -``` -Call the given JavaScript with a given this and arguments. - -If this is nil, then some special handling takes place to determine the proper -this value, falling back to a "standard" invocation if necessary (where this is -undefined). - -If source begins with "new " (A lowercase new followed by a space), then Call -will invoke the function constructor rather than performing a function call. In -this case, the this argument has no effect. - -```go -// value is a String object -value, _ := vm.Call("Object", nil, "Hello, World.") - -// Likewise... -value, _ := vm.Call("new Object", nil, "Hello, World.") - -// This will perform a concat on the given array and return the result -// value is [ 1, 2, 3, undefined, 4, 5, 6, 7, "abc" ] -value, _ := vm.Call(`[ 1, 2, 3, undefined, 4 ].concat`, nil, 5, 6, 7, "abc") -``` - -#### func (*Otto) Compile - -```go -func (self *Otto) Compile(filename string, src interface{}) (*Script, error) -``` -Compile will parse the given source and return a Script value or nil and an -error if there was a problem during compilation. - -```go -script, err := vm.Compile("", `var abc; if (!abc) abc = 0; abc += 2; abc;`) -vm.Run(script) -``` - -#### func (*Otto) Copy - -```go -func (in *Otto) Copy() *Otto -``` -Copy will create a copy/clone of the runtime. - -Copy is useful for saving some time when creating many similar runtimes. - -This method works by walking the original runtime and cloning each object, -scope, stash, etc. into a new runtime. - -Be on the lookout for memory leaks or inadvertent sharing of resources. - -#### func (Otto) Get - -```go -func (self Otto) Get(name string) (Value, error) -``` -Get the value of the top-level binding of the given name. - -If there is an error (like the binding does not exist), then the value will be -undefined. - -#### func (Otto) Object - -```go -func (self Otto) Object(source string) (*Object, error) -``` -Object will run the given source and return the result as an object. - -For example, accessing an existing object: - -```go -object, _ := vm.Object(`Number`) -``` - -Or, creating a new object: - -```go -object, _ := vm.Object(`({ xyzzy: "Nothing happens." })`) -``` - -Or, creating and assigning an object: - -```go -object, _ := vm.Object(`xyzzy = {}`) -object.Set("volume", 11) -``` - -If there is an error (like the source does not result in an object), then nil -and an error is returned. - -#### func (Otto) Run - -```go -func (self Otto) Run(src interface{}) (Value, error) -``` -Run will run the given source (parsing it first if necessary), returning the -resulting value and error (if any) - -src may be a string, a byte slice, a bytes.Buffer, or an io.Reader, but it MUST -always be in UTF-8. - -If the runtime is unable to parse source, then this function will return -undefined and the parse error (nothing will be evaluated in this case). - -src may also be a Script. - -src may also be a Program, but if the AST has been modified, then runtime -behavior is undefined. - -#### func (Otto) Set - -```go -func (self Otto) Set(name string, value interface{}) error -``` -Set the top-level binding of the given name to the given value. - -Set will automatically apply ToValue to the given value in order to convert it -to a JavaScript value (type Value). - -If there is an error (like the binding is read-only, or the ToValue conversion -fails), then an error is returned. - -If the top-level binding does not exist, it will be created. - -#### func (Otto) ToValue - -```go -func (self Otto) ToValue(value interface{}) (Value, error) -``` -ToValue will convert an interface{} value to a value digestible by -otto/JavaScript. - -#### type Script - -```go -type Script struct { -} -``` - -Script is a handle for some (reusable) JavaScript. Passing a Script value to a -run method will evaluate the JavaScript. - -#### func (*Script) String - -```go -func (self *Script) String() string -``` - -#### type Value - -```go -type Value struct { -} -``` - -Value is the representation of a JavaScript value. - -#### func FalseValue - -```go -func FalseValue() Value -``` -FalseValue will return a value representing false. - -It is equivalent to: - -```go -ToValue(false) -``` - -#### func NaNValue - -```go -func NaNValue() Value -``` -NaNValue will return a value representing NaN. - -It is equivalent to: - -```go -ToValue(math.NaN()) -``` - -#### func NullValue - -```go -func NullValue() Value -``` -NullValue will return a Value representing null. - -#### func ToValue - -```go -func ToValue(value interface{}) (Value, error) -``` -ToValue will convert an interface{} value to a value digestible by -otto/JavaScript - -This function will not work for advanced types (struct, map, slice/array, etc.) -and you should use Otto.ToValue instead. - -#### func TrueValue - -```go -func TrueValue() Value -``` -TrueValue will return a value representing true. - -It is equivalent to: - -```go -ToValue(true) -``` - -#### func UndefinedValue - -```go -func UndefinedValue() Value -``` -UndefinedValue will return a Value representing undefined. - -#### func (Value) Call - -```go -func (value Value) Call(this Value, argumentList ...interface{}) (Value, error) -``` -Call the value as a function with the given this value and argument list and -return the result of invocation. It is essentially equivalent to: - - value.apply(thisValue, argumentList) - -An undefined value and an error will result if: - - 1. There is an error during conversion of the argument list - 2. The value is not actually a function - 3. An (uncaught) exception is thrown - -#### func (Value) Class - -```go -func (value Value) Class() string -``` -Class will return the class string of the value or the empty string if value is -not an object. - -The return value will (generally) be one of: - - Object - Function - Array - String - Number - Boolean - Date - RegExp - -#### func (Value) Export - -```go -func (self Value) Export() (interface{}, error) -``` -Export will attempt to convert the value to a Go representation and return it -via an interface{} kind. - -Export returns an error, but it will always be nil. It is present for backwards -compatibility. - -If a reasonable conversion is not possible, then the original value is returned. - - undefined -> nil (FIXME?: Should be Value{}) - null -> nil - boolean -> bool - number -> A number type (int, float32, uint64, ...) - string -> string - Array -> []interface{} - Object -> map[string]interface{} - -#### func (Value) IsBoolean - -```go -func (value Value) IsBoolean() bool -``` -IsBoolean will return true if value is a boolean (primitive). - -#### func (Value) IsDefined - -```go -func (value Value) IsDefined() bool -``` -IsDefined will return false if the value is undefined, and true otherwise. - -#### func (Value) IsFunction - -```go -func (value Value) IsFunction() bool -``` -IsFunction will return true if value is a function. - -#### func (Value) IsNaN - -```go -func (value Value) IsNaN() bool -``` -IsNaN will return true if value is NaN (or would convert to NaN). - -#### func (Value) IsNull - -```go -func (value Value) IsNull() bool -``` -IsNull will return true if the value is null, and false otherwise. - -#### func (Value) IsNumber - -```go -func (value Value) IsNumber() bool -``` -IsNumber will return true if value is a number (primitive). - -#### func (Value) IsObject - -```go -func (value Value) IsObject() bool -``` -IsObject will return true if value is an object. - -#### func (Value) IsPrimitive - -```go -func (value Value) IsPrimitive() bool -``` -IsPrimitive will return true if value is a primitive (any kind of primitive). - -#### func (Value) IsString - -```go -func (value Value) IsString() bool -``` -IsString will return true if value is a string (primitive). - -#### func (Value) IsUndefined - -```go -func (value Value) IsUndefined() bool -``` -IsUndefined will return true if the value is undefined, and false otherwise. - -#### func (Value) Object - -```go -func (value Value) Object() *Object -``` -Object will return the object of the value, or nil if value is not an object. - -This method will not do any implicit conversion. For example, calling this -method on a string primitive value will not return a String object. - -#### func (Value) String - -```go -func (value Value) String() string -``` -String will return the value as a string. - -This method will make return the empty string if there is an error. - -#### func (Value) ToBoolean - -```go -func (value Value) ToBoolean() (bool, error) -``` -ToBoolean will convert the value to a boolean (bool). - - ToValue(0).ToBoolean() => false - ToValue("").ToBoolean() => false - ToValue(true).ToBoolean() => true - ToValue(1).ToBoolean() => true - ToValue("Nothing happens").ToBoolean() => true - -If there is an error during the conversion process (like an uncaught exception), -then the result will be false and an error. - -#### func (Value) ToFloat - -```go -func (value Value) ToFloat() (float64, error) -``` -ToFloat will convert the value to a number (float64). - - ToValue(0).ToFloat() => 0. - ToValue(1.1).ToFloat() => 1.1 - ToValue("11").ToFloat() => 11. - -If there is an error during the conversion process (like an uncaught exception), -then the result will be 0 and an error. - -#### func (Value) ToInteger - -```go -func (value Value) ToInteger() (int64, error) -``` -ToInteger will convert the value to a number (int64). - - ToValue(0).ToInteger() => 0 - ToValue(1.1).ToInteger() => 1 - ToValue("11").ToInteger() => 11 - -If there is an error during the conversion process (like an uncaught exception), -then the result will be 0 and an error. - -#### func (Value) ToString - -```go -func (value Value) ToString() (string, error) -``` -ToString will convert the value to a string (string). - - ToValue(0).ToString() => "0" - ToValue(false).ToString() => "false" - ToValue(1.1).ToString() => "1.1" - ToValue("11").ToString() => "11" - ToValue('Nothing happens.').ToString() => "Nothing happens." - -If there is an error during the conversion process (like an uncaught exception), -then the result will be the empty string ("") and an error. - --- -**godocdown** http://github.com/robertkrimen/godocdown diff --git a/vendor/github.com/robertkrimen/otto/ast/README.markdown b/vendor/github.com/robertkrimen/otto/ast/README.markdown deleted file mode 100644 index a785da9112d0..000000000000 --- a/vendor/github.com/robertkrimen/otto/ast/README.markdown +++ /dev/null @@ -1,1068 +0,0 @@ -# ast --- - import "github.com/robertkrimen/otto/ast" - -Package ast declares types representing a JavaScript AST. - - -### Warning - -The parser and AST interfaces are still works-in-progress (particularly where -node types are concerned) and may change in the future. - -## Usage - -#### type ArrayLiteral - -```go -type ArrayLiteral struct { - LeftBracket file.Idx - RightBracket file.Idx - Value []Expression -} -``` - - -#### func (*ArrayLiteral) Idx0 - -```go -func (self *ArrayLiteral) Idx0() file.Idx -``` - -#### func (*ArrayLiteral) Idx1 - -```go -func (self *ArrayLiteral) Idx1() file.Idx -``` - -#### type AssignExpression - -```go -type AssignExpression struct { - Operator token.Token - Left Expression - Right Expression -} -``` - - -#### func (*AssignExpression) Idx0 - -```go -func (self *AssignExpression) Idx0() file.Idx -``` - -#### func (*AssignExpression) Idx1 - -```go -func (self *AssignExpression) Idx1() file.Idx -``` - -#### type BadExpression - -```go -type BadExpression struct { - From file.Idx - To file.Idx -} -``` - - -#### func (*BadExpression) Idx0 - -```go -func (self *BadExpression) Idx0() file.Idx -``` - -#### func (*BadExpression) Idx1 - -```go -func (self *BadExpression) Idx1() file.Idx -``` - -#### type BadStatement - -```go -type BadStatement struct { - From file.Idx - To file.Idx -} -``` - - -#### func (*BadStatement) Idx0 - -```go -func (self *BadStatement) Idx0() file.Idx -``` - -#### func (*BadStatement) Idx1 - -```go -func (self *BadStatement) Idx1() file.Idx -``` - -#### type BinaryExpression - -```go -type BinaryExpression struct { - Operator token.Token - Left Expression - Right Expression - Comparison bool -} -``` - - -#### func (*BinaryExpression) Idx0 - -```go -func (self *BinaryExpression) Idx0() file.Idx -``` - -#### func (*BinaryExpression) Idx1 - -```go -func (self *BinaryExpression) Idx1() file.Idx -``` - -#### type BlockStatement - -```go -type BlockStatement struct { - LeftBrace file.Idx - List []Statement - RightBrace file.Idx -} -``` - - -#### func (*BlockStatement) Idx0 - -```go -func (self *BlockStatement) Idx0() file.Idx -``` - -#### func (*BlockStatement) Idx1 - -```go -func (self *BlockStatement) Idx1() file.Idx -``` - -#### type BooleanLiteral - -```go -type BooleanLiteral struct { - Idx file.Idx - Literal string - Value bool -} -``` - - -#### func (*BooleanLiteral) Idx0 - -```go -func (self *BooleanLiteral) Idx0() file.Idx -``` - -#### func (*BooleanLiteral) Idx1 - -```go -func (self *BooleanLiteral) Idx1() file.Idx -``` - -#### type BracketExpression - -```go -type BracketExpression struct { - Left Expression - Member Expression - LeftBracket file.Idx - RightBracket file.Idx -} -``` - - -#### func (*BracketExpression) Idx0 - -```go -func (self *BracketExpression) Idx0() file.Idx -``` - -#### func (*BracketExpression) Idx1 - -```go -func (self *BracketExpression) Idx1() file.Idx -``` - -#### type BranchStatement - -```go -type BranchStatement struct { - Idx file.Idx - Token token.Token - Label *Identifier -} -``` - - -#### func (*BranchStatement) Idx0 - -```go -func (self *BranchStatement) Idx0() file.Idx -``` - -#### func (*BranchStatement) Idx1 - -```go -func (self *BranchStatement) Idx1() file.Idx -``` - -#### type CallExpression - -```go -type CallExpression struct { - Callee Expression - LeftParenthesis file.Idx - ArgumentList []Expression - RightParenthesis file.Idx -} -``` - - -#### func (*CallExpression) Idx0 - -```go -func (self *CallExpression) Idx0() file.Idx -``` - -#### func (*CallExpression) Idx1 - -```go -func (self *CallExpression) Idx1() file.Idx -``` - -#### type CaseStatement - -```go -type CaseStatement struct { - Case file.Idx - Test Expression - Consequent []Statement -} -``` - - -#### func (*CaseStatement) Idx0 - -```go -func (self *CaseStatement) Idx0() file.Idx -``` - -#### func (*CaseStatement) Idx1 - -```go -func (self *CaseStatement) Idx1() file.Idx -``` - -#### type CatchStatement - -```go -type CatchStatement struct { - Catch file.Idx - Parameter *Identifier - Body Statement -} -``` - - -#### func (*CatchStatement) Idx0 - -```go -func (self *CatchStatement) Idx0() file.Idx -``` - -#### func (*CatchStatement) Idx1 - -```go -func (self *CatchStatement) Idx1() file.Idx -``` - -#### type ConditionalExpression - -```go -type ConditionalExpression struct { - Test Expression - Consequent Expression - Alternate Expression -} -``` - - -#### func (*ConditionalExpression) Idx0 - -```go -func (self *ConditionalExpression) Idx0() file.Idx -``` - -#### func (*ConditionalExpression) Idx1 - -```go -func (self *ConditionalExpression) Idx1() file.Idx -``` - -#### type DebuggerStatement - -```go -type DebuggerStatement struct { - Debugger file.Idx -} -``` - - -#### func (*DebuggerStatement) Idx0 - -```go -func (self *DebuggerStatement) Idx0() file.Idx -``` - -#### func (*DebuggerStatement) Idx1 - -```go -func (self *DebuggerStatement) Idx1() file.Idx -``` - -#### type Declaration - -```go -type Declaration interface { - // contains filtered or unexported methods -} -``` - -All declaration nodes implement the Declaration interface. - -#### type DoWhileStatement - -```go -type DoWhileStatement struct { - Do file.Idx - Test Expression - Body Statement -} -``` - - -#### func (*DoWhileStatement) Idx0 - -```go -func (self *DoWhileStatement) Idx0() file.Idx -``` - -#### func (*DoWhileStatement) Idx1 - -```go -func (self *DoWhileStatement) Idx1() file.Idx -``` - -#### type DotExpression - -```go -type DotExpression struct { - Left Expression - Identifier Identifier -} -``` - - -#### func (*DotExpression) Idx0 - -```go -func (self *DotExpression) Idx0() file.Idx -``` - -#### func (*DotExpression) Idx1 - -```go -func (self *DotExpression) Idx1() file.Idx -``` - -#### type EmptyStatement - -```go -type EmptyStatement struct { - Semicolon file.Idx -} -``` - - -#### func (*EmptyStatement) Idx0 - -```go -func (self *EmptyStatement) Idx0() file.Idx -``` - -#### func (*EmptyStatement) Idx1 - -```go -func (self *EmptyStatement) Idx1() file.Idx -``` - -#### type Expression - -```go -type Expression interface { - Node - // contains filtered or unexported methods -} -``` - -All expression nodes implement the Expression interface. - -#### type ExpressionStatement - -```go -type ExpressionStatement struct { - Expression Expression -} -``` - - -#### func (*ExpressionStatement) Idx0 - -```go -func (self *ExpressionStatement) Idx0() file.Idx -``` - -#### func (*ExpressionStatement) Idx1 - -```go -func (self *ExpressionStatement) Idx1() file.Idx -``` - -#### type ForInStatement - -```go -type ForInStatement struct { - For file.Idx - Into Expression - Source Expression - Body Statement -} -``` - - -#### func (*ForInStatement) Idx0 - -```go -func (self *ForInStatement) Idx0() file.Idx -``` - -#### func (*ForInStatement) Idx1 - -```go -func (self *ForInStatement) Idx1() file.Idx -``` - -#### type ForStatement - -```go -type ForStatement struct { - For file.Idx - Initializer Expression - Update Expression - Test Expression - Body Statement -} -``` - - -#### func (*ForStatement) Idx0 - -```go -func (self *ForStatement) Idx0() file.Idx -``` - -#### func (*ForStatement) Idx1 - -```go -func (self *ForStatement) Idx1() file.Idx -``` - -#### type FunctionDeclaration - -```go -type FunctionDeclaration struct { - Function *FunctionLiteral -} -``` - - -#### type FunctionLiteral - -```go -type FunctionLiteral struct { - Function file.Idx - Name *Identifier - ParameterList *ParameterList - Body Statement - Source string - - DeclarationList []Declaration -} -``` - - -#### func (*FunctionLiteral) Idx0 - -```go -func (self *FunctionLiteral) Idx0() file.Idx -``` - -#### func (*FunctionLiteral) Idx1 - -```go -func (self *FunctionLiteral) Idx1() file.Idx -``` - -#### type Identifier - -```go -type Identifier struct { - Name string - Idx file.Idx -} -``` - - -#### func (*Identifier) Idx0 - -```go -func (self *Identifier) Idx0() file.Idx -``` - -#### func (*Identifier) Idx1 - -```go -func (self *Identifier) Idx1() file.Idx -``` - -#### type IfStatement - -```go -type IfStatement struct { - If file.Idx - Test Expression - Consequent Statement - Alternate Statement -} -``` - - -#### func (*IfStatement) Idx0 - -```go -func (self *IfStatement) Idx0() file.Idx -``` - -#### func (*IfStatement) Idx1 - -```go -func (self *IfStatement) Idx1() file.Idx -``` - -#### type LabelledStatement - -```go -type LabelledStatement struct { - Label *Identifier - Colon file.Idx - Statement Statement -} -``` - - -#### func (*LabelledStatement) Idx0 - -```go -func (self *LabelledStatement) Idx0() file.Idx -``` - -#### func (*LabelledStatement) Idx1 - -```go -func (self *LabelledStatement) Idx1() file.Idx -``` - -#### type NewExpression - -```go -type NewExpression struct { - New file.Idx - Callee Expression - LeftParenthesis file.Idx - ArgumentList []Expression - RightParenthesis file.Idx -} -``` - - -#### func (*NewExpression) Idx0 - -```go -func (self *NewExpression) Idx0() file.Idx -``` - -#### func (*NewExpression) Idx1 - -```go -func (self *NewExpression) Idx1() file.Idx -``` - -#### type Node - -```go -type Node interface { - Idx0() file.Idx // The index of the first character belonging to the node - Idx1() file.Idx // The index of the first character immediately after the node -} -``` - -All nodes implement the Node interface. - -#### type NullLiteral - -```go -type NullLiteral struct { - Idx file.Idx - Literal string -} -``` - - -#### func (*NullLiteral) Idx0 - -```go -func (self *NullLiteral) Idx0() file.Idx -``` - -#### func (*NullLiteral) Idx1 - -```go -func (self *NullLiteral) Idx1() file.Idx -``` - -#### type NumberLiteral - -```go -type NumberLiteral struct { - Idx file.Idx - Literal string - Value interface{} -} -``` - - -#### func (*NumberLiteral) Idx0 - -```go -func (self *NumberLiteral) Idx0() file.Idx -``` - -#### func (*NumberLiteral) Idx1 - -```go -func (self *NumberLiteral) Idx1() file.Idx -``` - -#### type ObjectLiteral - -```go -type ObjectLiteral struct { - LeftBrace file.Idx - RightBrace file.Idx - Value []Property -} -``` - - -#### func (*ObjectLiteral) Idx0 - -```go -func (self *ObjectLiteral) Idx0() file.Idx -``` - -#### func (*ObjectLiteral) Idx1 - -```go -func (self *ObjectLiteral) Idx1() file.Idx -``` - -#### type ParameterList - -```go -type ParameterList struct { - Opening file.Idx - List []*Identifier - Closing file.Idx -} -``` - - -#### type Program - -```go -type Program struct { - Body []Statement - - DeclarationList []Declaration - - File *file.File -} -``` - - -#### func (*Program) Idx0 - -```go -func (self *Program) Idx0() file.Idx -``` - -#### func (*Program) Idx1 - -```go -func (self *Program) Idx1() file.Idx -``` - -#### type Property - -```go -type Property struct { - Key string - Kind string - Value Expression -} -``` - - -#### type RegExpLiteral - -```go -type RegExpLiteral struct { - Idx file.Idx - Literal string - Pattern string - Flags string - Value string -} -``` - - -#### func (*RegExpLiteral) Idx0 - -```go -func (self *RegExpLiteral) Idx0() file.Idx -``` - -#### func (*RegExpLiteral) Idx1 - -```go -func (self *RegExpLiteral) Idx1() file.Idx -``` - -#### type ReturnStatement - -```go -type ReturnStatement struct { - Return file.Idx - Argument Expression -} -``` - - -#### func (*ReturnStatement) Idx0 - -```go -func (self *ReturnStatement) Idx0() file.Idx -``` - -#### func (*ReturnStatement) Idx1 - -```go -func (self *ReturnStatement) Idx1() file.Idx -``` - -#### type SequenceExpression - -```go -type SequenceExpression struct { - Sequence []Expression -} -``` - - -#### func (*SequenceExpression) Idx0 - -```go -func (self *SequenceExpression) Idx0() file.Idx -``` - -#### func (*SequenceExpression) Idx1 - -```go -func (self *SequenceExpression) Idx1() file.Idx -``` - -#### type Statement - -```go -type Statement interface { - Node - // contains filtered or unexported methods -} -``` - -All statement nodes implement the Statement interface. - -#### type StringLiteral - -```go -type StringLiteral struct { - Idx file.Idx - Literal string - Value string -} -``` - - -#### func (*StringLiteral) Idx0 - -```go -func (self *StringLiteral) Idx0() file.Idx -``` - -#### func (*StringLiteral) Idx1 - -```go -func (self *StringLiteral) Idx1() file.Idx -``` - -#### type SwitchStatement - -```go -type SwitchStatement struct { - Switch file.Idx - Discriminant Expression - Default int - Body []*CaseStatement -} -``` - - -#### func (*SwitchStatement) Idx0 - -```go -func (self *SwitchStatement) Idx0() file.Idx -``` - -#### func (*SwitchStatement) Idx1 - -```go -func (self *SwitchStatement) Idx1() file.Idx -``` - -#### type ThisExpression - -```go -type ThisExpression struct { - Idx file.Idx -} -``` - - -#### func (*ThisExpression) Idx0 - -```go -func (self *ThisExpression) Idx0() file.Idx -``` - -#### func (*ThisExpression) Idx1 - -```go -func (self *ThisExpression) Idx1() file.Idx -``` - -#### type ThrowStatement - -```go -type ThrowStatement struct { - Throw file.Idx - Argument Expression -} -``` - - -#### func (*ThrowStatement) Idx0 - -```go -func (self *ThrowStatement) Idx0() file.Idx -``` - -#### func (*ThrowStatement) Idx1 - -```go -func (self *ThrowStatement) Idx1() file.Idx -``` - -#### type TryStatement - -```go -type TryStatement struct { - Try file.Idx - Body Statement - Catch *CatchStatement - Finally Statement -} -``` - - -#### func (*TryStatement) Idx0 - -```go -func (self *TryStatement) Idx0() file.Idx -``` - -#### func (*TryStatement) Idx1 - -```go -func (self *TryStatement) Idx1() file.Idx -``` - -#### type UnaryExpression - -```go -type UnaryExpression struct { - Operator token.Token - Idx file.Idx // If a prefix operation - Operand Expression - Postfix bool -} -``` - - -#### func (*UnaryExpression) Idx0 - -```go -func (self *UnaryExpression) Idx0() file.Idx -``` - -#### func (*UnaryExpression) Idx1 - -```go -func (self *UnaryExpression) Idx1() file.Idx -``` - -#### type VariableDeclaration - -```go -type VariableDeclaration struct { - Var file.Idx - List []*VariableExpression -} -``` - - -#### type VariableExpression - -```go -type VariableExpression struct { - Name string - Idx file.Idx - Initializer Expression -} -``` - - -#### func (*VariableExpression) Idx0 - -```go -func (self *VariableExpression) Idx0() file.Idx -``` - -#### func (*VariableExpression) Idx1 - -```go -func (self *VariableExpression) Idx1() file.Idx -``` - -#### type VariableStatement - -```go -type VariableStatement struct { - Var file.Idx - List []Expression -} -``` - - -#### func (*VariableStatement) Idx0 - -```go -func (self *VariableStatement) Idx0() file.Idx -``` - -#### func (*VariableStatement) Idx1 - -```go -func (self *VariableStatement) Idx1() file.Idx -``` - -#### type WhileStatement - -```go -type WhileStatement struct { - While file.Idx - Test Expression - Body Statement -} -``` - - -#### func (*WhileStatement) Idx0 - -```go -func (self *WhileStatement) Idx0() file.Idx -``` - -#### func (*WhileStatement) Idx1 - -```go -func (self *WhileStatement) Idx1() file.Idx -``` - -#### type WithStatement - -```go -type WithStatement struct { - With file.Idx - Object Expression - Body Statement -} -``` - - -#### func (*WithStatement) Idx0 - -```go -func (self *WithStatement) Idx0() file.Idx -``` - -#### func (*WithStatement) Idx1 - -```go -func (self *WithStatement) Idx1() file.Idx -``` - --- -**godocdown** http://github.com/robertkrimen/godocdown diff --git a/vendor/github.com/robertkrimen/otto/ast/comments.go b/vendor/github.com/robertkrimen/otto/ast/comments.go deleted file mode 100644 index ef2cc3d89b92..000000000000 --- a/vendor/github.com/robertkrimen/otto/ast/comments.go +++ /dev/null @@ -1,278 +0,0 @@ -package ast - -import ( - "fmt" - "github.com/robertkrimen/otto/file" -) - -// CommentPosition determines where the comment is in a given context -type CommentPosition int - -const ( - _ CommentPosition = iota - LEADING // Before the pertinent expression - TRAILING // After the pertinent expression - KEY // Before a key in an object - COLON // After a colon in a field declaration - FINAL // Final comments in a block, not belonging to a specific expression or the comment after a trailing , in an array or object literal - IF // After an if keyword - WHILE // After a while keyword - DO // After do keyword - FOR // After a for keyword - WITH // After a with keyword - TBD -) - -// Comment contains the data of the comment -type Comment struct { - Begin file.Idx - Text string - Position CommentPosition -} - -// NewComment creates a new comment -func NewComment(text string, idx file.Idx) *Comment { - comment := &Comment{ - Begin: idx, - Text: text, - Position: TBD, - } - - return comment -} - -// String returns a stringified version of the position -func (cp CommentPosition) String() string { - switch cp { - case LEADING: - return "Leading" - case TRAILING: - return "Trailing" - case KEY: - return "Key" - case COLON: - return "Colon" - case FINAL: - return "Final" - case IF: - return "If" - case WHILE: - return "While" - case DO: - return "Do" - case FOR: - return "For" - case WITH: - return "With" - default: - return "???" - } -} - -// String returns a stringified version of the comment -func (c Comment) String() string { - return fmt.Sprintf("Comment: %v", c.Text) -} - -// Comments defines the current view of comments from the parser -type Comments struct { - // CommentMap is a reference to the parser comment map - CommentMap CommentMap - // Comments lists the comments scanned, not linked to a node yet - Comments []*Comment - // future lists the comments after a line break during a sequence of comments - future []*Comment - // Current is node for which comments are linked to - Current Expression - - // wasLineBreak determines if a line break occured while scanning for comments - wasLineBreak bool - // primary determines whether or not processing a primary expression - primary bool - // afterBlock determines whether or not being after a block statement - afterBlock bool -} - -func NewComments() *Comments { - comments := &Comments{ - CommentMap: CommentMap{}, - } - - return comments -} - -func (c *Comments) String() string { - return fmt.Sprintf("NODE: %v, Comments: %v, Future: %v(LINEBREAK:%v)", c.Current, len(c.Comments), len(c.future), c.wasLineBreak) -} - -// FetchAll returns all the currently scanned comments, -// including those from the next line -func (c *Comments) FetchAll() []*Comment { - defer func() { - c.Comments = nil - c.future = nil - }() - - return append(c.Comments, c.future...) -} - -// Fetch returns all the currently scanned comments -func (c *Comments) Fetch() []*Comment { - defer func() { - c.Comments = nil - }() - - return c.Comments -} - -// ResetLineBreak marks the beginning of a new statement -func (c *Comments) ResetLineBreak() { - c.wasLineBreak = false -} - -// MarkPrimary will mark the context as processing a primary expression -func (c *Comments) MarkPrimary() { - c.primary = true - c.wasLineBreak = false -} - -// AfterBlock will mark the context as being after a block. -func (c *Comments) AfterBlock() { - c.afterBlock = true -} - -// AddComment adds a comment to the view. -// Depending on the context, comments are added normally or as post line break. -func (c *Comments) AddComment(comment *Comment) { - if c.primary { - if !c.wasLineBreak { - c.Comments = append(c.Comments, comment) - } else { - c.future = append(c.future, comment) - } - } else { - if !c.wasLineBreak || (c.Current == nil && !c.afterBlock) { - c.Comments = append(c.Comments, comment) - } else { - c.future = append(c.future, comment) - } - } -} - -// MarkComments will mark the found comments as the given position. -func (c *Comments) MarkComments(position CommentPosition) { - for _, comment := range c.Comments { - if comment.Position == TBD { - comment.Position = position - } - } - for _, c := range c.future { - if c.Position == TBD { - c.Position = position - } - } -} - -// Unset the current node and apply the comments to the current expression. -// Resets context variables. -func (c *Comments) Unset() { - if c.Current != nil { - c.applyComments(c.Current, c.Current, TRAILING) - c.Current = nil - } - c.wasLineBreak = false - c.primary = false - c.afterBlock = false -} - -// SetExpression sets the current expression. -// It is applied the found comments, unless the previous expression has not been unset. -// It is skipped if the node is already set or if it is a part of the previous node. -func (c *Comments) SetExpression(node Expression) { - // Skipping same node - if c.Current == node { - return - } - if c.Current != nil && c.Current.Idx1() == node.Idx1() { - c.Current = node - return - } - previous := c.Current - c.Current = node - - // Apply the found comments and futures to the node and the previous. - c.applyComments(node, previous, TRAILING) -} - -// PostProcessNode applies all found comments to the given node -func (c *Comments) PostProcessNode(node Node) { - c.applyComments(node, nil, TRAILING) -} - -// applyComments applies both the comments and the future comments to the given node and the previous one, -// based on the context. -func (c *Comments) applyComments(node, previous Node, position CommentPosition) { - if previous != nil { - c.CommentMap.AddComments(previous, c.Comments, position) - c.Comments = nil - } else { - c.CommentMap.AddComments(node, c.Comments, position) - c.Comments = nil - } - // Only apply the future comments to the node if the previous is set. - // This is for detecting end of line comments and which node comments on the following lines belongs to - if previous != nil { - c.CommentMap.AddComments(node, c.future, position) - c.future = nil - } -} - -// AtLineBreak will mark a line break -func (c *Comments) AtLineBreak() { - c.wasLineBreak = true -} - -// CommentMap is the data structure where all found comments are stored -type CommentMap map[Node][]*Comment - -// AddComment adds a single comment to the map -func (cm CommentMap) AddComment(node Node, comment *Comment) { - list := cm[node] - list = append(list, comment) - - cm[node] = list -} - -// AddComments adds a slice of comments, given a node and an updated position -func (cm CommentMap) AddComments(node Node, comments []*Comment, position CommentPosition) { - for _, comment := range comments { - if comment.Position == TBD { - comment.Position = position - } - cm.AddComment(node, comment) - } -} - -// Size returns the size of the map -func (cm CommentMap) Size() int { - size := 0 - for _, comments := range cm { - size += len(comments) - } - - return size -} - -// MoveComments moves comments with a given position from a node to another -func (cm CommentMap) MoveComments(from, to Node, position CommentPosition) { - for i, c := range cm[from] { - if c.Position == position { - cm.AddComment(to, c) - - // Remove the comment from the "from" slice - cm[from][i] = cm[from][len(cm[from])-1] - cm[from][len(cm[from])-1] = nil - cm[from] = cm[from][:len(cm[from])-1] - } - } -} diff --git a/vendor/github.com/robertkrimen/otto/ast/node.go b/vendor/github.com/robertkrimen/otto/ast/node.go deleted file mode 100644 index 49ae375d12df..000000000000 --- a/vendor/github.com/robertkrimen/otto/ast/node.go +++ /dev/null @@ -1,515 +0,0 @@ -/* -Package ast declares types representing a JavaScript AST. - -Warning - -The parser and AST interfaces are still works-in-progress (particularly where -node types are concerned) and may change in the future. - -*/ -package ast - -import ( - "github.com/robertkrimen/otto/file" - "github.com/robertkrimen/otto/token" -) - -// All nodes implement the Node interface. -type Node interface { - Idx0() file.Idx // The index of the first character belonging to the node - Idx1() file.Idx // The index of the first character immediately after the node -} - -// ========== // -// Expression // -// ========== // - -type ( - // All expression nodes implement the Expression interface. - Expression interface { - Node - _expressionNode() - } - - ArrayLiteral struct { - LeftBracket file.Idx - RightBracket file.Idx - Value []Expression - } - - AssignExpression struct { - Operator token.Token - Left Expression - Right Expression - } - - BadExpression struct { - From file.Idx - To file.Idx - } - - BinaryExpression struct { - Operator token.Token - Left Expression - Right Expression - Comparison bool - } - - BooleanLiteral struct { - Idx file.Idx - Literal string - Value bool - } - - BracketExpression struct { - Left Expression - Member Expression - LeftBracket file.Idx - RightBracket file.Idx - } - - CallExpression struct { - Callee Expression - LeftParenthesis file.Idx - ArgumentList []Expression - RightParenthesis file.Idx - } - - ConditionalExpression struct { - Test Expression - Consequent Expression - Alternate Expression - } - - DotExpression struct { - Left Expression - Identifier *Identifier - } - - EmptyExpression struct { - Begin file.Idx - End file.Idx - } - - FunctionLiteral struct { - Function file.Idx - Name *Identifier - ParameterList *ParameterList - Body Statement - Source string - - DeclarationList []Declaration - } - - Identifier struct { - Name string - Idx file.Idx - } - - NewExpression struct { - New file.Idx - Callee Expression - LeftParenthesis file.Idx - ArgumentList []Expression - RightParenthesis file.Idx - } - - NullLiteral struct { - Idx file.Idx - Literal string - } - - NumberLiteral struct { - Idx file.Idx - Literal string - Value interface{} - } - - ObjectLiteral struct { - LeftBrace file.Idx - RightBrace file.Idx - Value []Property - } - - ParameterList struct { - Opening file.Idx - List []*Identifier - Closing file.Idx - } - - Property struct { - Key string - Kind string - Value Expression - } - - RegExpLiteral struct { - Idx file.Idx - Literal string - Pattern string - Flags string - Value string - } - - SequenceExpression struct { - Sequence []Expression - } - - StringLiteral struct { - Idx file.Idx - Literal string - Value string - } - - ThisExpression struct { - Idx file.Idx - } - - UnaryExpression struct { - Operator token.Token - Idx file.Idx // If a prefix operation - Operand Expression - Postfix bool - } - - VariableExpression struct { - Name string - Idx file.Idx - Initializer Expression - } -) - -// _expressionNode - -func (*ArrayLiteral) _expressionNode() {} -func (*AssignExpression) _expressionNode() {} -func (*BadExpression) _expressionNode() {} -func (*BinaryExpression) _expressionNode() {} -func (*BooleanLiteral) _expressionNode() {} -func (*BracketExpression) _expressionNode() {} -func (*CallExpression) _expressionNode() {} -func (*ConditionalExpression) _expressionNode() {} -func (*DotExpression) _expressionNode() {} -func (*EmptyExpression) _expressionNode() {} -func (*FunctionLiteral) _expressionNode() {} -func (*Identifier) _expressionNode() {} -func (*NewExpression) _expressionNode() {} -func (*NullLiteral) _expressionNode() {} -func (*NumberLiteral) _expressionNode() {} -func (*ObjectLiteral) _expressionNode() {} -func (*RegExpLiteral) _expressionNode() {} -func (*SequenceExpression) _expressionNode() {} -func (*StringLiteral) _expressionNode() {} -func (*ThisExpression) _expressionNode() {} -func (*UnaryExpression) _expressionNode() {} -func (*VariableExpression) _expressionNode() {} - -// ========= // -// Statement // -// ========= // - -type ( - // All statement nodes implement the Statement interface. - Statement interface { - Node - _statementNode() - } - - BadStatement struct { - From file.Idx - To file.Idx - } - - BlockStatement struct { - LeftBrace file.Idx - List []Statement - RightBrace file.Idx - } - - BranchStatement struct { - Idx file.Idx - Token token.Token - Label *Identifier - } - - CaseStatement struct { - Case file.Idx - Test Expression - Consequent []Statement - } - - CatchStatement struct { - Catch file.Idx - Parameter *Identifier - Body Statement - } - - DebuggerStatement struct { - Debugger file.Idx - } - - DoWhileStatement struct { - Do file.Idx - Test Expression - Body Statement - } - - EmptyStatement struct { - Semicolon file.Idx - } - - ExpressionStatement struct { - Expression Expression - } - - ForInStatement struct { - For file.Idx - Into Expression - Source Expression - Body Statement - } - - ForStatement struct { - For file.Idx - Initializer Expression - Update Expression - Test Expression - Body Statement - } - - FunctionStatement struct { - Function *FunctionLiteral - } - - IfStatement struct { - If file.Idx - Test Expression - Consequent Statement - Alternate Statement - } - - LabelledStatement struct { - Label *Identifier - Colon file.Idx - Statement Statement - } - - ReturnStatement struct { - Return file.Idx - Argument Expression - } - - SwitchStatement struct { - Switch file.Idx - Discriminant Expression - Default int - Body []*CaseStatement - } - - ThrowStatement struct { - Throw file.Idx - Argument Expression - } - - TryStatement struct { - Try file.Idx - Body Statement - Catch *CatchStatement - Finally Statement - } - - VariableStatement struct { - Var file.Idx - List []Expression - } - - WhileStatement struct { - While file.Idx - Test Expression - Body Statement - } - - WithStatement struct { - With file.Idx - Object Expression - Body Statement - } -) - -// _statementNode - -func (*BadStatement) _statementNode() {} -func (*BlockStatement) _statementNode() {} -func (*BranchStatement) _statementNode() {} -func (*CaseStatement) _statementNode() {} -func (*CatchStatement) _statementNode() {} -func (*DebuggerStatement) _statementNode() {} -func (*DoWhileStatement) _statementNode() {} -func (*EmptyStatement) _statementNode() {} -func (*ExpressionStatement) _statementNode() {} -func (*ForInStatement) _statementNode() {} -func (*ForStatement) _statementNode() {} -func (*FunctionStatement) _statementNode() {} -func (*IfStatement) _statementNode() {} -func (*LabelledStatement) _statementNode() {} -func (*ReturnStatement) _statementNode() {} -func (*SwitchStatement) _statementNode() {} -func (*ThrowStatement) _statementNode() {} -func (*TryStatement) _statementNode() {} -func (*VariableStatement) _statementNode() {} -func (*WhileStatement) _statementNode() {} -func (*WithStatement) _statementNode() {} - -// =========== // -// Declaration // -// =========== // - -type ( - // All declaration nodes implement the Declaration interface. - Declaration interface { - _declarationNode() - } - - FunctionDeclaration struct { - Function *FunctionLiteral - } - - VariableDeclaration struct { - Var file.Idx - List []*VariableExpression - } -) - -// _declarationNode - -func (*FunctionDeclaration) _declarationNode() {} -func (*VariableDeclaration) _declarationNode() {} - -// ==== // -// Node // -// ==== // - -type Program struct { - Body []Statement - - DeclarationList []Declaration - - File *file.File - - Comments CommentMap -} - -// ==== // -// Idx0 // -// ==== // - -func (self *ArrayLiteral) Idx0() file.Idx { return self.LeftBracket } -func (self *AssignExpression) Idx0() file.Idx { return self.Left.Idx0() } -func (self *BadExpression) Idx0() file.Idx { return self.From } -func (self *BinaryExpression) Idx0() file.Idx { return self.Left.Idx0() } -func (self *BooleanLiteral) Idx0() file.Idx { return self.Idx } -func (self *BracketExpression) Idx0() file.Idx { return self.Left.Idx0() } -func (self *CallExpression) Idx0() file.Idx { return self.Callee.Idx0() } -func (self *ConditionalExpression) Idx0() file.Idx { return self.Test.Idx0() } -func (self *DotExpression) Idx0() file.Idx { return self.Left.Idx0() } -func (self *EmptyExpression) Idx0() file.Idx { return self.Begin } -func (self *FunctionLiteral) Idx0() file.Idx { return self.Function } -func (self *Identifier) Idx0() file.Idx { return self.Idx } -func (self *NewExpression) Idx0() file.Idx { return self.New } -func (self *NullLiteral) Idx0() file.Idx { return self.Idx } -func (self *NumberLiteral) Idx0() file.Idx { return self.Idx } -func (self *ObjectLiteral) Idx0() file.Idx { return self.LeftBrace } -func (self *RegExpLiteral) Idx0() file.Idx { return self.Idx } -func (self *SequenceExpression) Idx0() file.Idx { return self.Sequence[0].Idx0() } -func (self *StringLiteral) Idx0() file.Idx { return self.Idx } -func (self *ThisExpression) Idx0() file.Idx { return self.Idx } -func (self *UnaryExpression) Idx0() file.Idx { return self.Idx } -func (self *VariableExpression) Idx0() file.Idx { return self.Idx } - -func (self *BadStatement) Idx0() file.Idx { return self.From } -func (self *BlockStatement) Idx0() file.Idx { return self.LeftBrace } -func (self *BranchStatement) Idx0() file.Idx { return self.Idx } -func (self *CaseStatement) Idx0() file.Idx { return self.Case } -func (self *CatchStatement) Idx0() file.Idx { return self.Catch } -func (self *DebuggerStatement) Idx0() file.Idx { return self.Debugger } -func (self *DoWhileStatement) Idx0() file.Idx { return self.Do } -func (self *EmptyStatement) Idx0() file.Idx { return self.Semicolon } -func (self *ExpressionStatement) Idx0() file.Idx { return self.Expression.Idx0() } -func (self *ForInStatement) Idx0() file.Idx { return self.For } -func (self *ForStatement) Idx0() file.Idx { return self.For } -func (self *FunctionStatement) Idx0() file.Idx { return self.Function.Idx0() } -func (self *IfStatement) Idx0() file.Idx { return self.If } -func (self *LabelledStatement) Idx0() file.Idx { return self.Label.Idx0() } -func (self *Program) Idx0() file.Idx { return self.Body[0].Idx0() } -func (self *ReturnStatement) Idx0() file.Idx { return self.Return } -func (self *SwitchStatement) Idx0() file.Idx { return self.Switch } -func (self *ThrowStatement) Idx0() file.Idx { return self.Throw } -func (self *TryStatement) Idx0() file.Idx { return self.Try } -func (self *VariableStatement) Idx0() file.Idx { return self.Var } -func (self *WhileStatement) Idx0() file.Idx { return self.While } -func (self *WithStatement) Idx0() file.Idx { return self.With } - -// ==== // -// Idx1 // -// ==== // - -func (self *ArrayLiteral) Idx1() file.Idx { return self.RightBracket } -func (self *AssignExpression) Idx1() file.Idx { return self.Right.Idx1() } -func (self *BadExpression) Idx1() file.Idx { return self.To } -func (self *BinaryExpression) Idx1() file.Idx { return self.Right.Idx1() } -func (self *BooleanLiteral) Idx1() file.Idx { return file.Idx(int(self.Idx) + len(self.Literal)) } -func (self *BracketExpression) Idx1() file.Idx { return self.RightBracket + 1 } -func (self *CallExpression) Idx1() file.Idx { return self.RightParenthesis + 1 } -func (self *ConditionalExpression) Idx1() file.Idx { return self.Test.Idx1() } -func (self *DotExpression) Idx1() file.Idx { return self.Identifier.Idx1() } -func (self *EmptyExpression) Idx1() file.Idx { return self.End } -func (self *FunctionLiteral) Idx1() file.Idx { return self.Body.Idx1() } -func (self *Identifier) Idx1() file.Idx { return file.Idx(int(self.Idx) + len(self.Name)) } -func (self *NewExpression) Idx1() file.Idx { return self.RightParenthesis + 1 } -func (self *NullLiteral) Idx1() file.Idx { return file.Idx(int(self.Idx) + 4) } // "null" -func (self *NumberLiteral) Idx1() file.Idx { return file.Idx(int(self.Idx) + len(self.Literal)) } -func (self *ObjectLiteral) Idx1() file.Idx { return self.RightBrace } -func (self *RegExpLiteral) Idx1() file.Idx { return file.Idx(int(self.Idx) + len(self.Literal)) } -func (self *SequenceExpression) Idx1() file.Idx { return self.Sequence[0].Idx1() } -func (self *StringLiteral) Idx1() file.Idx { return file.Idx(int(self.Idx) + len(self.Literal)) } -func (self *ThisExpression) Idx1() file.Idx { return self.Idx } -func (self *UnaryExpression) Idx1() file.Idx { - if self.Postfix { - return self.Operand.Idx1() + 2 // ++ -- - } - return self.Operand.Idx1() -} -func (self *VariableExpression) Idx1() file.Idx { - if self.Initializer == nil { - return file.Idx(int(self.Idx) + len(self.Name) + 1) - } - return self.Initializer.Idx1() -} - -func (self *BadStatement) Idx1() file.Idx { return self.To } -func (self *BlockStatement) Idx1() file.Idx { return self.RightBrace + 1 } -func (self *BranchStatement) Idx1() file.Idx { return self.Idx } -func (self *CaseStatement) Idx1() file.Idx { return self.Consequent[len(self.Consequent)-1].Idx1() } -func (self *CatchStatement) Idx1() file.Idx { return self.Body.Idx1() } -func (self *DebuggerStatement) Idx1() file.Idx { return self.Debugger + 8 } -func (self *DoWhileStatement) Idx1() file.Idx { return self.Test.Idx1() } -func (self *EmptyStatement) Idx1() file.Idx { return self.Semicolon + 1 } -func (self *ExpressionStatement) Idx1() file.Idx { return self.Expression.Idx1() } -func (self *ForInStatement) Idx1() file.Idx { return self.Body.Idx1() } -func (self *ForStatement) Idx1() file.Idx { return self.Body.Idx1() } -func (self *FunctionStatement) Idx1() file.Idx { return self.Function.Idx1() } -func (self *IfStatement) Idx1() file.Idx { - if self.Alternate != nil { - return self.Alternate.Idx1() - } - return self.Consequent.Idx1() -} -func (self *LabelledStatement) Idx1() file.Idx { return self.Colon + 1 } -func (self *Program) Idx1() file.Idx { return self.Body[len(self.Body)-1].Idx1() } -func (self *ReturnStatement) Idx1() file.Idx { return self.Return } -func (self *SwitchStatement) Idx1() file.Idx { return self.Body[len(self.Body)-1].Idx1() } -func (self *ThrowStatement) Idx1() file.Idx { return self.Throw } -func (self *TryStatement) Idx1() file.Idx { return self.Try } -func (self *VariableStatement) Idx1() file.Idx { return self.List[len(self.List)-1].Idx1() } -func (self *WhileStatement) Idx1() file.Idx { return self.Body.Idx1() } -func (self *WithStatement) Idx1() file.Idx { return self.Body.Idx1() } diff --git a/vendor/github.com/robertkrimen/otto/builtin.go b/vendor/github.com/robertkrimen/otto/builtin.go deleted file mode 100644 index 256ee3c555f3..000000000000 --- a/vendor/github.com/robertkrimen/otto/builtin.go +++ /dev/null @@ -1,354 +0,0 @@ -package otto - -import ( - "encoding/hex" - "math" - "net/url" - "regexp" - "strconv" - "strings" - "unicode/utf16" - "unicode/utf8" -) - -// Global -func builtinGlobal_eval(call FunctionCall) Value { - src := call.Argument(0) - if !src.IsString() { - return src - } - runtime := call.runtime - program := runtime.cmpl_parseOrThrow(src.string(), nil) - if !call.eval { - // Not a direct call to eval, so we enter the global ExecutionContext - runtime.enterGlobalScope() - defer runtime.leaveScope() - } - returnValue := runtime.cmpl_evaluate_nodeProgram(program, true) - if returnValue.isEmpty() { - return Value{} - } - return returnValue -} - -func builtinGlobal_isNaN(call FunctionCall) Value { - value := call.Argument(0).float64() - return toValue_bool(math.IsNaN(value)) -} - -func builtinGlobal_isFinite(call FunctionCall) Value { - value := call.Argument(0).float64() - return toValue_bool(!math.IsNaN(value) && !math.IsInf(value, 0)) -} - -// radix 3 => 2 (ASCII 50) +47 -// radix 11 => A/a (ASCII 65/97) +54/+86 -var parseInt_alphabetTable = func() []string { - table := []string{"", "", "01"} - for radix := 3; radix <= 36; radix += 1 { - alphabet := table[radix-1] - if radix <= 10 { - alphabet += string(radix + 47) - } else { - alphabet += string(radix+54) + string(radix+86) - } - table = append(table, alphabet) - } - return table -}() - -func digitValue(chr rune) int { - switch { - case '0' <= chr && chr <= '9': - return int(chr - '0') - case 'a' <= chr && chr <= 'z': - return int(chr - 'a' + 10) - case 'A' <= chr && chr <= 'Z': - return int(chr - 'A' + 10) - } - return 36 // Larger than any legal digit value -} - -func builtinGlobal_parseInt(call FunctionCall) Value { - input := strings.Trim(call.Argument(0).string(), builtinString_trim_whitespace) - if len(input) == 0 { - return NaNValue() - } - - radix := int(toInt32(call.Argument(1))) - - negative := false - switch input[0] { - case '+': - input = input[1:] - case '-': - negative = true - input = input[1:] - } - - strip := true - if radix == 0 { - radix = 10 - } else { - if radix < 2 || radix > 36 { - return NaNValue() - } else if radix != 16 { - strip = false - } - } - - switch len(input) { - case 0: - return NaNValue() - case 1: - default: - if strip { - if input[0] == '0' && (input[1] == 'x' || input[1] == 'X') { - input = input[2:] - radix = 16 - } - } - } - - base := radix - index := 0 - for ; index < len(input); index++ { - digit := digitValue(rune(input[index])) // If not ASCII, then an error anyway - if digit >= base { - break - } - } - input = input[0:index] - - value, err := strconv.ParseInt(input, radix, 64) - if err != nil { - if err.(*strconv.NumError).Err == strconv.ErrRange { - base := float64(base) - // Could just be a very large number (e.g. 0x8000000000000000) - var value float64 - for _, chr := range input { - digit := float64(digitValue(chr)) - if digit >= base { - goto error - } - value = value*base + digit - } - if negative { - value *= -1 - } - return toValue_float64(value) - } - error: - return NaNValue() - } - if negative { - value *= -1 - } - - return toValue_int64(value) -} - -var parseFloat_matchBadSpecial = regexp.MustCompile(`[\+\-]?(?:[Ii]nf$|infinity)`) -var parseFloat_matchValid = regexp.MustCompile(`[0-9eE\+\-\.]|Infinity`) - -func builtinGlobal_parseFloat(call FunctionCall) Value { - // Caveat emptor: This implementation does NOT match the specification - input := strings.Trim(call.Argument(0).string(), builtinString_trim_whitespace) - - if parseFloat_matchBadSpecial.MatchString(input) { - return NaNValue() - } - value, err := strconv.ParseFloat(input, 64) - if err != nil { - for end := len(input); end > 0; end-- { - input := input[0:end] - if !parseFloat_matchValid.MatchString(input) { - return NaNValue() - } - value, err = strconv.ParseFloat(input, 64) - if err == nil { - break - } - } - if err != nil { - return NaNValue() - } - } - return toValue_float64(value) -} - -// encodeURI/decodeURI - -func _builtinGlobal_encodeURI(call FunctionCall, escape *regexp.Regexp) Value { - value := call.Argument(0) - var input []uint16 - switch vl := value.value.(type) { - case []uint16: - input = vl - default: - input = utf16.Encode([]rune(value.string())) - } - if len(input) == 0 { - return toValue_string("") - } - output := []byte{} - length := len(input) - encode := make([]byte, 4) - for index := 0; index < length; { - value := input[index] - decode := utf16.Decode(input[index : index+1]) - if value >= 0xDC00 && value <= 0xDFFF { - panic(call.runtime.panicURIError("URI malformed")) - } - if value >= 0xD800 && value <= 0xDBFF { - index += 1 - if index >= length { - panic(call.runtime.panicURIError("URI malformed")) - } - // input = ..., value, value1, ... - value1 := input[index] - if value1 < 0xDC00 || value1 > 0xDFFF { - panic(call.runtime.panicURIError("URI malformed")) - } - decode = []rune{((rune(value) - 0xD800) * 0x400) + (rune(value1) - 0xDC00) + 0x10000} - } - index += 1 - size := utf8.EncodeRune(encode, decode[0]) - encode := encode[0:size] - output = append(output, encode...) - } - { - value := escape.ReplaceAllFunc(output, func(target []byte) []byte { - // Probably a better way of doing this - if target[0] == ' ' { - return []byte("%20") - } - return []byte(url.QueryEscape(string(target))) - }) - return toValue_string(string(value)) - } -} - -var encodeURI_Regexp = regexp.MustCompile(`([^~!@#$&*()=:/,;?+'])`) - -func builtinGlobal_encodeURI(call FunctionCall) Value { - return _builtinGlobal_encodeURI(call, encodeURI_Regexp) -} - -var encodeURIComponent_Regexp = regexp.MustCompile(`([^~!*()'])`) - -func builtinGlobal_encodeURIComponent(call FunctionCall) Value { - return _builtinGlobal_encodeURI(call, encodeURIComponent_Regexp) -} - -// 3B/2F/3F/3A/40/26/3D/2B/24/2C/23 -var decodeURI_guard = regexp.MustCompile(`(?i)(?:%)(3B|2F|3F|3A|40|26|3D|2B|24|2C|23)`) - -func _decodeURI(input string, reserve bool) (string, bool) { - if reserve { - input = decodeURI_guard.ReplaceAllString(input, "%25$1") - } - input = strings.Replace(input, "+", "%2B", -1) // Ugly hack to make QueryUnescape work with our use case - output, err := url.QueryUnescape(input) - if err != nil || !utf8.ValidString(output) { - return "", true - } - return output, false -} - -func builtinGlobal_decodeURI(call FunctionCall) Value { - output, err := _decodeURI(call.Argument(0).string(), true) - if err { - panic(call.runtime.panicURIError("URI malformed")) - } - return toValue_string(output) -} - -func builtinGlobal_decodeURIComponent(call FunctionCall) Value { - output, err := _decodeURI(call.Argument(0).string(), false) - if err { - panic(call.runtime.panicURIError("URI malformed")) - } - return toValue_string(output) -} - -// escape/unescape - -func builtin_shouldEscape(chr byte) bool { - if 'A' <= chr && chr <= 'Z' || 'a' <= chr && chr <= 'z' || '0' <= chr && chr <= '9' { - return false - } - return !strings.ContainsRune("*_+-./", rune(chr)) -} - -const escapeBase16 = "0123456789ABCDEF" - -func builtin_escape(input string) string { - output := make([]byte, 0, len(input)) - length := len(input) - for index := 0; index < length; { - if builtin_shouldEscape(input[index]) { - chr, width := utf8.DecodeRuneInString(input[index:]) - chr16 := utf16.Encode([]rune{chr})[0] - if 256 > chr16 { - output = append(output, '%', - escapeBase16[chr16>>4], - escapeBase16[chr16&15], - ) - } else { - output = append(output, '%', 'u', - escapeBase16[chr16>>12], - escapeBase16[(chr16>>8)&15], - escapeBase16[(chr16>>4)&15], - escapeBase16[chr16&15], - ) - } - index += width - - } else { - output = append(output, input[index]) - index += 1 - } - } - return string(output) -} - -func builtin_unescape(input string) string { - output := make([]rune, 0, len(input)) - length := len(input) - for index := 0; index < length; { - if input[index] == '%' { - if index <= length-6 && input[index+1] == 'u' { - byte16, err := hex.DecodeString(input[index+2 : index+6]) - if err == nil { - value := uint16(byte16[0])<<8 + uint16(byte16[1]) - chr := utf16.Decode([]uint16{value})[0] - output = append(output, chr) - index += 6 - continue - } - } - if index <= length-3 { - byte8, err := hex.DecodeString(input[index+1 : index+3]) - if err == nil { - value := uint16(byte8[0]) - chr := utf16.Decode([]uint16{value})[0] - output = append(output, chr) - index += 3 - continue - } - } - } - output = append(output, rune(input[index])) - index += 1 - } - return string(output) -} - -func builtinGlobal_escape(call FunctionCall) Value { - return toValue_string(builtin_escape(call.Argument(0).string())) -} - -func builtinGlobal_unescape(call FunctionCall) Value { - return toValue_string(builtin_unescape(call.Argument(0).string())) -} diff --git a/vendor/github.com/robertkrimen/otto/builtin_array.go b/vendor/github.com/robertkrimen/otto/builtin_array.go deleted file mode 100644 index 557ffc02480e..000000000000 --- a/vendor/github.com/robertkrimen/otto/builtin_array.go +++ /dev/null @@ -1,681 +0,0 @@ -package otto - -import ( - "strconv" - "strings" -) - -// Array - -func builtinArray(call FunctionCall) Value { - return toValue_object(builtinNewArrayNative(call.runtime, call.ArgumentList)) -} - -func builtinNewArray(self *_object, argumentList []Value) Value { - return toValue_object(builtinNewArrayNative(self.runtime, argumentList)) -} - -func builtinNewArrayNative(runtime *_runtime, argumentList []Value) *_object { - if len(argumentList) == 1 { - firstArgument := argumentList[0] - if firstArgument.IsNumber() { - return runtime.newArray(arrayUint32(runtime, firstArgument)) - } - } - return runtime.newArrayOf(argumentList) -} - -func builtinArray_toString(call FunctionCall) Value { - thisObject := call.thisObject() - join := thisObject.get("join") - if join.isCallable() { - join := join._object() - return join.call(call.This, call.ArgumentList, false, nativeFrame) - } - return builtinObject_toString(call) -} - -func builtinArray_toLocaleString(call FunctionCall) Value { - separator := "," - thisObject := call.thisObject() - length := int64(toUint32(thisObject.get("length"))) - if length == 0 { - return toValue_string("") - } - stringList := make([]string, 0, length) - for index := int64(0); index < length; index += 1 { - value := thisObject.get(arrayIndexToString(index)) - stringValue := "" - switch value.kind { - case valueEmpty, valueUndefined, valueNull: - default: - object := call.runtime.toObject(value) - toLocaleString := object.get("toLocaleString") - if !toLocaleString.isCallable() { - panic(call.runtime.panicTypeError()) - } - stringValue = toLocaleString.call(call.runtime, toValue_object(object)).string() - } - stringList = append(stringList, stringValue) - } - return toValue_string(strings.Join(stringList, separator)) -} - -func builtinArray_concat(call FunctionCall) Value { - thisObject := call.thisObject() - valueArray := []Value{} - source := append([]Value{toValue_object(thisObject)}, call.ArgumentList...) - for _, item := range source { - switch item.kind { - case valueObject: - object := item._object() - if isArray(object) { - length := object.get("length").number().int64 - for index := int64(0); index < length; index += 1 { - name := strconv.FormatInt(index, 10) - if object.hasProperty(name) { - valueArray = append(valueArray, object.get(name)) - } else { - valueArray = append(valueArray, Value{}) - } - } - continue - } - fallthrough - default: - valueArray = append(valueArray, item) - } - } - return toValue_object(call.runtime.newArrayOf(valueArray)) -} - -func builtinArray_shift(call FunctionCall) Value { - thisObject := call.thisObject() - length := int64(toUint32(thisObject.get("length"))) - if 0 == length { - thisObject.put("length", toValue_int64(0), true) - return Value{} - } - first := thisObject.get("0") - for index := int64(1); index < length; index++ { - from := arrayIndexToString(index) - to := arrayIndexToString(index - 1) - if thisObject.hasProperty(from) { - thisObject.put(to, thisObject.get(from), true) - } else { - thisObject.delete(to, true) - } - } - thisObject.delete(arrayIndexToString(length-1), true) - thisObject.put("length", toValue_int64(length-1), true) - return first -} - -func builtinArray_push(call FunctionCall) Value { - thisObject := call.thisObject() - itemList := call.ArgumentList - index := int64(toUint32(thisObject.get("length"))) - for len(itemList) > 0 { - thisObject.put(arrayIndexToString(index), itemList[0], true) - itemList = itemList[1:] - index += 1 - } - length := toValue_int64(index) - thisObject.put("length", length, true) - return length -} - -func builtinArray_pop(call FunctionCall) Value { - thisObject := call.thisObject() - length := int64(toUint32(thisObject.get("length"))) - if 0 == length { - thisObject.put("length", toValue_uint32(0), true) - return Value{} - } - last := thisObject.get(arrayIndexToString(length - 1)) - thisObject.delete(arrayIndexToString(length-1), true) - thisObject.put("length", toValue_int64(length-1), true) - return last -} - -func builtinArray_join(call FunctionCall) Value { - separator := "," - { - argument := call.Argument(0) - if argument.IsDefined() { - separator = argument.string() - } - } - thisObject := call.thisObject() - length := int64(toUint32(thisObject.get("length"))) - if length == 0 { - return toValue_string("") - } - stringList := make([]string, 0, length) - for index := int64(0); index < length; index += 1 { - value := thisObject.get(arrayIndexToString(index)) - stringValue := "" - switch value.kind { - case valueEmpty, valueUndefined, valueNull: - default: - stringValue = value.string() - } - stringList = append(stringList, stringValue) - } - return toValue_string(strings.Join(stringList, separator)) -} - -func builtinArray_splice(call FunctionCall) Value { - thisObject := call.thisObject() - length := int64(toUint32(thisObject.get("length"))) - - start := valueToRangeIndex(call.Argument(0), length, false) - deleteCount := valueToRangeIndex(call.Argument(1), int64(length)-start, true) - valueArray := make([]Value, deleteCount) - - for index := int64(0); index < deleteCount; index++ { - indexString := arrayIndexToString(int64(start + index)) - if thisObject.hasProperty(indexString) { - valueArray[index] = thisObject.get(indexString) - } - } - - // 0, <1, 2, 3, 4>, 5, 6, 7 - // a, b - // length 8 - delete 4 @ start 1 - - itemList := []Value{} - itemCount := int64(len(call.ArgumentList)) - if itemCount > 2 { - itemCount -= 2 // Less the first two arguments - itemList = call.ArgumentList[2:] - } else { - itemCount = 0 - } - if itemCount < deleteCount { - // The Object/Array is shrinking - stop := int64(length) - deleteCount - // The new length of the Object/Array before - // appending the itemList remainder - // Stopping at the lower bound of the insertion: - // Move an item from the after the deleted portion - // to a position after the inserted portion - for index := start; index < stop; index++ { - from := arrayIndexToString(index + deleteCount) // Position just after deletion - to := arrayIndexToString(index + itemCount) // Position just after splice (insertion) - if thisObject.hasProperty(from) { - thisObject.put(to, thisObject.get(from), true) - } else { - thisObject.delete(to, true) - } - } - // Delete off the end - // We don't bother to delete below (if any) since those - // will be overwritten anyway - for index := int64(length); index > (stop + itemCount); index-- { - thisObject.delete(arrayIndexToString(index-1), true) - } - } else if itemCount > deleteCount { - // The Object/Array is growing - // The itemCount is greater than the deleteCount, so we do - // not have to worry about overwriting what we should be moving - // --- - // Starting from the upper bound of the deletion: - // Move an item from the after the deleted portion - // to a position after the inserted portion - for index := int64(length) - deleteCount; index > start; index-- { - from := arrayIndexToString(index + deleteCount - 1) - to := arrayIndexToString(index + itemCount - 1) - if thisObject.hasProperty(from) { - thisObject.put(to, thisObject.get(from), true) - } else { - thisObject.delete(to, true) - } - } - } - - for index := int64(0); index < itemCount; index++ { - thisObject.put(arrayIndexToString(index+start), itemList[index], true) - } - thisObject.put("length", toValue_int64(int64(length)+itemCount-deleteCount), true) - - return toValue_object(call.runtime.newArrayOf(valueArray)) -} - -func builtinArray_slice(call FunctionCall) Value { - thisObject := call.thisObject() - - length := int64(toUint32(thisObject.get("length"))) - start, end := rangeStartEnd(call.ArgumentList, length, false) - - if start >= end { - // Always an empty array - return toValue_object(call.runtime.newArray(0)) - } - sliceLength := end - start - sliceValueArray := make([]Value, sliceLength) - - for index := int64(0); index < sliceLength; index++ { - from := arrayIndexToString(index + start) - if thisObject.hasProperty(from) { - sliceValueArray[index] = thisObject.get(from) - } - } - - return toValue_object(call.runtime.newArrayOf(sliceValueArray)) -} - -func builtinArray_unshift(call FunctionCall) Value { - thisObject := call.thisObject() - length := int64(toUint32(thisObject.get("length"))) - itemList := call.ArgumentList - itemCount := int64(len(itemList)) - - for index := length; index > 0; index-- { - from := arrayIndexToString(index - 1) - to := arrayIndexToString(index + itemCount - 1) - if thisObject.hasProperty(from) { - thisObject.put(to, thisObject.get(from), true) - } else { - thisObject.delete(to, true) - } - } - - for index := int64(0); index < itemCount; index++ { - thisObject.put(arrayIndexToString(index), itemList[index], true) - } - - newLength := toValue_int64(length + itemCount) - thisObject.put("length", newLength, true) - return newLength -} - -func builtinArray_reverse(call FunctionCall) Value { - thisObject := call.thisObject() - length := int64(toUint32(thisObject.get("length"))) - - lower := struct { - name string - index int64 - exists bool - }{} - upper := lower - - lower.index = 0 - middle := length / 2 // Division will floor - - for lower.index != middle { - lower.name = arrayIndexToString(lower.index) - upper.index = length - lower.index - 1 - upper.name = arrayIndexToString(upper.index) - - lower.exists = thisObject.hasProperty(lower.name) - upper.exists = thisObject.hasProperty(upper.name) - - if lower.exists && upper.exists { - lowerValue := thisObject.get(lower.name) - upperValue := thisObject.get(upper.name) - thisObject.put(lower.name, upperValue, true) - thisObject.put(upper.name, lowerValue, true) - } else if !lower.exists && upper.exists { - value := thisObject.get(upper.name) - thisObject.delete(upper.name, true) - thisObject.put(lower.name, value, true) - } else if lower.exists && !upper.exists { - value := thisObject.get(lower.name) - thisObject.delete(lower.name, true) - thisObject.put(upper.name, value, true) - } else { - // Nothing happens. - } - - lower.index += 1 - } - - return call.This -} - -func sortCompare(thisObject *_object, index0, index1 uint, compare *_object) int { - j := struct { - name string - exists bool - defined bool - value string - }{} - k := j - j.name = arrayIndexToString(int64(index0)) - j.exists = thisObject.hasProperty(j.name) - k.name = arrayIndexToString(int64(index1)) - k.exists = thisObject.hasProperty(k.name) - - if !j.exists && !k.exists { - return 0 - } else if !j.exists { - return 1 - } else if !k.exists { - return -1 - } - - x := thisObject.get(j.name) - y := thisObject.get(k.name) - j.defined = x.IsDefined() - k.defined = y.IsDefined() - - if !j.defined && !k.defined { - return 0 - } else if !j.defined { - return 1 - } else if !k.defined { - return -1 - } - - if compare == nil { - j.value = x.string() - k.value = y.string() - - if j.value == k.value { - return 0 - } else if j.value < k.value { - return -1 - } - - return 1 - } - - return int(toInt32(compare.call(Value{}, []Value{x, y}, false, nativeFrame))) -} - -func arraySortSwap(thisObject *_object, index0, index1 uint) { - - j := struct { - name string - exists bool - }{} - k := j - - j.name = arrayIndexToString(int64(index0)) - j.exists = thisObject.hasProperty(j.name) - k.name = arrayIndexToString(int64(index1)) - k.exists = thisObject.hasProperty(k.name) - - if j.exists && k.exists { - jValue := thisObject.get(j.name) - kValue := thisObject.get(k.name) - thisObject.put(j.name, kValue, true) - thisObject.put(k.name, jValue, true) - } else if !j.exists && k.exists { - value := thisObject.get(k.name) - thisObject.delete(k.name, true) - thisObject.put(j.name, value, true) - } else if j.exists && !k.exists { - value := thisObject.get(j.name) - thisObject.delete(j.name, true) - thisObject.put(k.name, value, true) - } else { - // Nothing happens. - } -} - -func arraySortQuickPartition(thisObject *_object, left, right, pivot uint, compare *_object) (uint, uint) { - arraySortSwap(thisObject, pivot, right) // Right is now the pivot value - cursor := left - cursor2 := left - for index := left; index < right; index++ { - comparison := sortCompare(thisObject, index, right, compare) // Compare to the pivot value - if comparison < 0 { - arraySortSwap(thisObject, index, cursor) - if cursor < cursor2 { - arraySortSwap(thisObject, index, cursor2) - } - cursor += 1 - cursor2 += 1 - } else if comparison == 0 { - arraySortSwap(thisObject, index, cursor2) - cursor2 += 1 - } - } - arraySortSwap(thisObject, cursor2, right) - return cursor, cursor2 -} - -func arraySortQuickSort(thisObject *_object, left, right uint, compare *_object) { - if left < right { - middle := left + (right-left)/2 - pivot, pivot2 := arraySortQuickPartition(thisObject, left, right, middle, compare) - if pivot > 0 { - arraySortQuickSort(thisObject, left, pivot-1, compare) - } - arraySortQuickSort(thisObject, pivot2+1, right, compare) - } -} - -func builtinArray_sort(call FunctionCall) Value { - thisObject := call.thisObject() - length := uint(toUint32(thisObject.get("length"))) - compareValue := call.Argument(0) - compare := compareValue._object() - if compareValue.IsUndefined() { - } else if !compareValue.isCallable() { - panic(call.runtime.panicTypeError()) - } - if length > 1 { - arraySortQuickSort(thisObject, 0, length-1, compare) - } - return call.This -} - -func builtinArray_isArray(call FunctionCall) Value { - return toValue_bool(isArray(call.Argument(0)._object())) -} - -func builtinArray_indexOf(call FunctionCall) Value { - thisObject, matchValue := call.thisObject(), call.Argument(0) - if length := int64(toUint32(thisObject.get("length"))); length > 0 { - index := int64(0) - if len(call.ArgumentList) > 1 { - index = call.Argument(1).number().int64 - } - if index < 0 { - if index += length; index < 0 { - index = 0 - } - } else if index >= length { - index = -1 - } - for ; index >= 0 && index < length; index++ { - name := arrayIndexToString(int64(index)) - if !thisObject.hasProperty(name) { - continue - } - value := thisObject.get(name) - if strictEqualityComparison(matchValue, value) { - return toValue_uint32(uint32(index)) - } - } - } - return toValue_int(-1) -} - -func builtinArray_lastIndexOf(call FunctionCall) Value { - thisObject, matchValue := call.thisObject(), call.Argument(0) - length := int64(toUint32(thisObject.get("length"))) - index := length - 1 - if len(call.ArgumentList) > 1 { - index = call.Argument(1).number().int64 - } - if 0 > index { - index += length - } - if index > length { - index = length - 1 - } else if 0 > index { - return toValue_int(-1) - } - for ; index >= 0; index-- { - name := arrayIndexToString(int64(index)) - if !thisObject.hasProperty(name) { - continue - } - value := thisObject.get(name) - if strictEqualityComparison(matchValue, value) { - return toValue_uint32(uint32(index)) - } - } - return toValue_int(-1) -} - -func builtinArray_every(call FunctionCall) Value { - thisObject := call.thisObject() - this := toValue_object(thisObject) - if iterator := call.Argument(0); iterator.isCallable() { - length := int64(toUint32(thisObject.get("length"))) - callThis := call.Argument(1) - for index := int64(0); index < length; index++ { - if key := arrayIndexToString(index); thisObject.hasProperty(key) { - if value := thisObject.get(key); iterator.call(call.runtime, callThis, value, toValue_int64(index), this).bool() { - continue - } - return falseValue - } - } - return trueValue - } - panic(call.runtime.panicTypeError()) -} - -func builtinArray_some(call FunctionCall) Value { - thisObject := call.thisObject() - this := toValue_object(thisObject) - if iterator := call.Argument(0); iterator.isCallable() { - length := int64(toUint32(thisObject.get("length"))) - callThis := call.Argument(1) - for index := int64(0); index < length; index++ { - if key := arrayIndexToString(index); thisObject.hasProperty(key) { - if value := thisObject.get(key); iterator.call(call.runtime, callThis, value, toValue_int64(index), this).bool() { - return trueValue - } - } - } - return falseValue - } - panic(call.runtime.panicTypeError()) -} - -func builtinArray_forEach(call FunctionCall) Value { - thisObject := call.thisObject() - this := toValue_object(thisObject) - if iterator := call.Argument(0); iterator.isCallable() { - length := int64(toUint32(thisObject.get("length"))) - callThis := call.Argument(1) - for index := int64(0); index < length; index++ { - if key := arrayIndexToString(index); thisObject.hasProperty(key) { - iterator.call(call.runtime, callThis, thisObject.get(key), toValue_int64(index), this) - } - } - return Value{} - } - panic(call.runtime.panicTypeError()) -} - -func builtinArray_map(call FunctionCall) Value { - thisObject := call.thisObject() - this := toValue_object(thisObject) - if iterator := call.Argument(0); iterator.isCallable() { - length := int64(toUint32(thisObject.get("length"))) - callThis := call.Argument(1) - values := make([]Value, length) - for index := int64(0); index < length; index++ { - if key := arrayIndexToString(index); thisObject.hasProperty(key) { - values[index] = iterator.call(call.runtime, callThis, thisObject.get(key), index, this) - } else { - values[index] = Value{} - } - } - return toValue_object(call.runtime.newArrayOf(values)) - } - panic(call.runtime.panicTypeError()) -} - -func builtinArray_filter(call FunctionCall) Value { - thisObject := call.thisObject() - this := toValue_object(thisObject) - if iterator := call.Argument(0); iterator.isCallable() { - length := int64(toUint32(thisObject.get("length"))) - callThis := call.Argument(1) - values := make([]Value, 0) - for index := int64(0); index < length; index++ { - if key := arrayIndexToString(index); thisObject.hasProperty(key) { - value := thisObject.get(key) - if iterator.call(call.runtime, callThis, value, index, this).bool() { - values = append(values, value) - } - } - } - return toValue_object(call.runtime.newArrayOf(values)) - } - panic(call.runtime.panicTypeError()) -} - -func builtinArray_reduce(call FunctionCall) Value { - thisObject := call.thisObject() - this := toValue_object(thisObject) - if iterator := call.Argument(0); iterator.isCallable() { - initial := len(call.ArgumentList) > 1 - start := call.Argument(1) - length := int64(toUint32(thisObject.get("length"))) - index := int64(0) - if length > 0 || initial { - var accumulator Value - if !initial { - for ; index < length; index++ { - if key := arrayIndexToString(index); thisObject.hasProperty(key) { - accumulator = thisObject.get(key) - index++ - break - } - } - } else { - accumulator = start - } - for ; index < length; index++ { - if key := arrayIndexToString(index); thisObject.hasProperty(key) { - accumulator = iterator.call(call.runtime, Value{}, accumulator, thisObject.get(key), key, this) - } - } - return accumulator - } - } - panic(call.runtime.panicTypeError()) -} - -func builtinArray_reduceRight(call FunctionCall) Value { - thisObject := call.thisObject() - this := toValue_object(thisObject) - if iterator := call.Argument(0); iterator.isCallable() { - initial := len(call.ArgumentList) > 1 - start := call.Argument(1) - length := int64(toUint32(thisObject.get("length"))) - if length > 0 || initial { - index := length - 1 - var accumulator Value - if !initial { - for ; index >= 0; index-- { - if key := arrayIndexToString(index); thisObject.hasProperty(key) { - accumulator = thisObject.get(key) - index-- - break - } - } - } else { - accumulator = start - } - for ; index >= 0; index-- { - if key := arrayIndexToString(index); thisObject.hasProperty(key) { - accumulator = iterator.call(call.runtime, Value{}, accumulator, thisObject.get(key), key, this) - } - } - return accumulator - } - } - panic(call.runtime.panicTypeError()) -} diff --git a/vendor/github.com/robertkrimen/otto/builtin_boolean.go b/vendor/github.com/robertkrimen/otto/builtin_boolean.go deleted file mode 100644 index 59b8e789b3e1..000000000000 --- a/vendor/github.com/robertkrimen/otto/builtin_boolean.go +++ /dev/null @@ -1,28 +0,0 @@ -package otto - -// Boolean - -func builtinBoolean(call FunctionCall) Value { - return toValue_bool(call.Argument(0).bool()) -} - -func builtinNewBoolean(self *_object, argumentList []Value) Value { - return toValue_object(self.runtime.newBoolean(valueOfArrayIndex(argumentList, 0))) -} - -func builtinBoolean_toString(call FunctionCall) Value { - value := call.This - if !value.IsBoolean() { - // Will throw a TypeError if ThisObject is not a Boolean - value = call.thisClassObject("Boolean").primitiveValue() - } - return toValue_string(value.string()) -} - -func builtinBoolean_valueOf(call FunctionCall) Value { - value := call.This - if !value.IsBoolean() { - value = call.thisClassObject("Boolean").primitiveValue() - } - return value -} diff --git a/vendor/github.com/robertkrimen/otto/builtin_date.go b/vendor/github.com/robertkrimen/otto/builtin_date.go deleted file mode 100644 index f20bf8e3fa9d..000000000000 --- a/vendor/github.com/robertkrimen/otto/builtin_date.go +++ /dev/null @@ -1,615 +0,0 @@ -package otto - -import ( - "math" - Time "time" -) - -// Date - -const ( - // TODO Be like V8? - // builtinDate_goDateTimeLayout = "Mon Jan 2 2006 15:04:05 GMT-0700 (MST)" - builtinDate_goDateTimeLayout = Time.RFC1123 // "Mon, 02 Jan 2006 15:04:05 MST" - builtinDate_goDateLayout = "Mon, 02 Jan 2006" - builtinDate_goTimeLayout = "15:04:05 MST" -) - -func builtinDate(call FunctionCall) Value { - date := &_dateObject{} - date.Set(newDateTime([]Value{}, Time.Local)) - return toValue_string(date.Time().Format(builtinDate_goDateTimeLayout)) -} - -func builtinNewDate(self *_object, argumentList []Value) Value { - return toValue_object(self.runtime.newDate(newDateTime(argumentList, Time.Local))) -} - -func builtinDate_toString(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return toValue_string("Invalid Date") - } - return toValue_string(date.Time().Local().Format(builtinDate_goDateTimeLayout)) -} - -func builtinDate_toDateString(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return toValue_string("Invalid Date") - } - return toValue_string(date.Time().Local().Format(builtinDate_goDateLayout)) -} - -func builtinDate_toTimeString(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return toValue_string("Invalid Date") - } - return toValue_string(date.Time().Local().Format(builtinDate_goTimeLayout)) -} - -func builtinDate_toUTCString(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return toValue_string("Invalid Date") - } - return toValue_string(date.Time().Format(builtinDate_goDateTimeLayout)) -} - -func builtinDate_toISOString(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return toValue_string("Invalid Date") - } - return toValue_string(date.Time().Format("2006-01-02T15:04:05.000Z")) -} - -func builtinDate_toJSON(call FunctionCall) Value { - object := call.thisObject() - value := object.DefaultValue(defaultValueHintNumber) // FIXME object.primitiveNumberValue - { // FIXME value.isFinite - value := value.float64() - if math.IsNaN(value) || math.IsInf(value, 0) { - return nullValue - } - } - toISOString := object.get("toISOString") - if !toISOString.isCallable() { - // FIXME - panic(call.runtime.panicTypeError()) - } - return toISOString.call(call.runtime, toValue_object(object), []Value{}) -} - -func builtinDate_toGMTString(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return toValue_string("Invalid Date") - } - return toValue_string(date.Time().Format("Mon, 02 Jan 2006 15:04:05 GMT")) -} - -func builtinDate_getTime(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - // We do this (convert away from a float) so the user - // does not get something back in exponential notation - return toValue_int64(int64(date.Epoch())) -} - -func builtinDate_setTime(call FunctionCall) Value { - object := call.thisObject() - date := dateObjectOf(call.runtime, call.thisObject()) - date.Set(call.Argument(0).float64()) - object.value = date - return date.Value() -} - -func _builtinDate_beforeSet(call FunctionCall, argumentLimit int, timeLocal bool) (*_object, *_dateObject, *_ecmaTime, []int) { - object := call.thisObject() - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return nil, nil, nil, nil - } - - if argumentLimit > len(call.ArgumentList) { - argumentLimit = len(call.ArgumentList) - } - - if argumentLimit == 0 { - object.value = invalidDateObject - return nil, nil, nil, nil - } - - valueList := make([]int, argumentLimit) - for index := 0; index < argumentLimit; index++ { - value := call.ArgumentList[index] - nm := value.number() - switch nm.kind { - case numberInteger, numberFloat: - default: - object.value = invalidDateObject - return nil, nil, nil, nil - } - valueList[index] = int(nm.int64) - } - baseTime := date.Time() - if timeLocal { - baseTime = baseTime.Local() - } - ecmaTime := ecmaTime(baseTime) - return object, &date, &ecmaTime, valueList -} - -func builtinDate_parse(call FunctionCall) Value { - date := call.Argument(0).string() - return toValue_float64(dateParse(date)) -} - -func builtinDate_UTC(call FunctionCall) Value { - return toValue_float64(newDateTime(call.ArgumentList, Time.UTC)) -} - -func builtinDate_now(call FunctionCall) Value { - call.ArgumentList = []Value(nil) - return builtinDate_UTC(call) -} - -// This is a placeholder -func builtinDate_toLocaleString(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return toValue_string("Invalid Date") - } - return toValue_string(date.Time().Local().Format("2006-01-02 15:04:05")) -} - -// This is a placeholder -func builtinDate_toLocaleDateString(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return toValue_string("Invalid Date") - } - return toValue_string(date.Time().Local().Format("2006-01-02")) -} - -// This is a placeholder -func builtinDate_toLocaleTimeString(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return toValue_string("Invalid Date") - } - return toValue_string(date.Time().Local().Format("15:04:05")) -} - -func builtinDate_valueOf(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return date.Value() -} - -func builtinDate_getYear(call FunctionCall) Value { - // Will throw a TypeError is ThisObject is nil or - // does not have Class of "Date" - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(date.Time().Local().Year() - 1900) -} - -func builtinDate_getFullYear(call FunctionCall) Value { - // Will throw a TypeError is ThisObject is nil or - // does not have Class of "Date" - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(date.Time().Local().Year()) -} - -func builtinDate_getUTCFullYear(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(date.Time().Year()) -} - -func builtinDate_getMonth(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(dateFromGoMonth(date.Time().Local().Month())) -} - -func builtinDate_getUTCMonth(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(dateFromGoMonth(date.Time().Month())) -} - -func builtinDate_getDate(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(date.Time().Local().Day()) -} - -func builtinDate_getUTCDate(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(date.Time().Day()) -} - -func builtinDate_getDay(call FunctionCall) Value { - // Actually day of the week - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(dateFromGoDay(date.Time().Local().Weekday())) -} - -func builtinDate_getUTCDay(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(dateFromGoDay(date.Time().Weekday())) -} - -func builtinDate_getHours(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(date.Time().Local().Hour()) -} - -func builtinDate_getUTCHours(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(date.Time().Hour()) -} - -func builtinDate_getMinutes(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(date.Time().Local().Minute()) -} - -func builtinDate_getUTCMinutes(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(date.Time().Minute()) -} - -func builtinDate_getSeconds(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(date.Time().Local().Second()) -} - -func builtinDate_getUTCSeconds(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(date.Time().Second()) -} - -func builtinDate_getMilliseconds(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(date.Time().Local().Nanosecond() / (100 * 100 * 100)) -} - -func builtinDate_getUTCMilliseconds(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - return toValue_int(date.Time().Nanosecond() / (100 * 100 * 100)) -} - -func builtinDate_getTimezoneOffset(call FunctionCall) Value { - date := dateObjectOf(call.runtime, call.thisObject()) - if date.isNaN { - return NaNValue() - } - timeLocal := date.Time().Local() - // Is this kosher? - timeLocalAsUTC := Time.Date( - timeLocal.Year(), - timeLocal.Month(), - timeLocal.Day(), - timeLocal.Hour(), - timeLocal.Minute(), - timeLocal.Second(), - timeLocal.Nanosecond(), - Time.UTC, - ) - return toValue_float64(date.Time().Sub(timeLocalAsUTC).Seconds() / 60) -} - -func builtinDate_setMilliseconds(call FunctionCall) Value { - object, date, ecmaTime, value := _builtinDate_beforeSet(call, 1, true) - if ecmaTime == nil { - return NaNValue() - } - - ecmaTime.millisecond = value[0] - - date.SetTime(ecmaTime.goTime()) - object.value = *date - return date.Value() -} - -func builtinDate_setUTCMilliseconds(call FunctionCall) Value { - object, date, ecmaTime, value := _builtinDate_beforeSet(call, 1, false) - if ecmaTime == nil { - return NaNValue() - } - - ecmaTime.millisecond = value[0] - - date.SetTime(ecmaTime.goTime()) - object.value = *date - return date.Value() -} - -func builtinDate_setSeconds(call FunctionCall) Value { - object, date, ecmaTime, value := _builtinDate_beforeSet(call, 2, true) - if ecmaTime == nil { - return NaNValue() - } - - if len(value) > 1 { - ecmaTime.millisecond = value[1] - } - ecmaTime.second = value[0] - - date.SetTime(ecmaTime.goTime()) - object.value = *date - return date.Value() -} - -func builtinDate_setUTCSeconds(call FunctionCall) Value { - object, date, ecmaTime, value := _builtinDate_beforeSet(call, 2, false) - if ecmaTime == nil { - return NaNValue() - } - - if len(value) > 1 { - ecmaTime.millisecond = value[1] - } - ecmaTime.second = value[0] - - date.SetTime(ecmaTime.goTime()) - object.value = *date - return date.Value() -} - -func builtinDate_setMinutes(call FunctionCall) Value { - object, date, ecmaTime, value := _builtinDate_beforeSet(call, 3, true) - if ecmaTime == nil { - return NaNValue() - } - - if len(value) > 2 { - ecmaTime.millisecond = value[2] - ecmaTime.second = value[1] - } else if len(value) > 1 { - ecmaTime.second = value[1] - } - ecmaTime.minute = value[0] - - date.SetTime(ecmaTime.goTime()) - object.value = *date - return date.Value() -} - -func builtinDate_setUTCMinutes(call FunctionCall) Value { - object, date, ecmaTime, value := _builtinDate_beforeSet(call, 3, false) - if ecmaTime == nil { - return NaNValue() - } - - if len(value) > 2 { - ecmaTime.millisecond = value[2] - ecmaTime.second = value[1] - } else if len(value) > 1 { - ecmaTime.second = value[1] - } - ecmaTime.minute = value[0] - - date.SetTime(ecmaTime.goTime()) - object.value = *date - return date.Value() -} - -func builtinDate_setHours(call FunctionCall) Value { - object, date, ecmaTime, value := _builtinDate_beforeSet(call, 4, true) - if ecmaTime == nil { - return NaNValue() - } - - if len(value) > 3 { - ecmaTime.millisecond = value[3] - ecmaTime.second = value[2] - ecmaTime.minute = value[1] - } else if len(value) > 2 { - ecmaTime.second = value[2] - ecmaTime.minute = value[1] - } else if len(value) > 1 { - ecmaTime.minute = value[1] - } - ecmaTime.hour = value[0] - - date.SetTime(ecmaTime.goTime()) - object.value = *date - return date.Value() -} - -func builtinDate_setUTCHours(call FunctionCall) Value { - object, date, ecmaTime, value := _builtinDate_beforeSet(call, 4, false) - if ecmaTime == nil { - return NaNValue() - } - - if len(value) > 3 { - ecmaTime.millisecond = value[3] - ecmaTime.second = value[2] - ecmaTime.minute = value[1] - } else if len(value) > 2 { - ecmaTime.second = value[2] - ecmaTime.minute = value[1] - } else if len(value) > 1 { - ecmaTime.minute = value[1] - } - ecmaTime.hour = value[0] - - date.SetTime(ecmaTime.goTime()) - object.value = *date - return date.Value() -} - -func builtinDate_setDate(call FunctionCall) Value { - object, date, ecmaTime, value := _builtinDate_beforeSet(call, 1, true) - if ecmaTime == nil { - return NaNValue() - } - - ecmaTime.day = value[0] - - date.SetTime(ecmaTime.goTime()) - object.value = *date - return date.Value() -} - -func builtinDate_setUTCDate(call FunctionCall) Value { - object, date, ecmaTime, value := _builtinDate_beforeSet(call, 1, false) - if ecmaTime == nil { - return NaNValue() - } - - ecmaTime.day = value[0] - - date.SetTime(ecmaTime.goTime()) - object.value = *date - return date.Value() -} - -func builtinDate_setMonth(call FunctionCall) Value { - object, date, ecmaTime, value := _builtinDate_beforeSet(call, 2, true) - if ecmaTime == nil { - return NaNValue() - } - - if len(value) > 1 { - ecmaTime.day = value[1] - } - ecmaTime.month = value[0] - - date.SetTime(ecmaTime.goTime()) - object.value = *date - return date.Value() -} - -func builtinDate_setUTCMonth(call FunctionCall) Value { - object, date, ecmaTime, value := _builtinDate_beforeSet(call, 2, false) - if ecmaTime == nil { - return NaNValue() - } - - if len(value) > 1 { - ecmaTime.day = value[1] - } - ecmaTime.month = value[0] - - date.SetTime(ecmaTime.goTime()) - object.value = *date - return date.Value() -} - -func builtinDate_setYear(call FunctionCall) Value { - object, date, ecmaTime, value := _builtinDate_beforeSet(call, 1, true) - if ecmaTime == nil { - return NaNValue() - } - - year := value[0] - if 0 <= year && year <= 99 { - year += 1900 - } - ecmaTime.year = year - - date.SetTime(ecmaTime.goTime()) - object.value = *date - return date.Value() -} - -func builtinDate_setFullYear(call FunctionCall) Value { - object, date, ecmaTime, value := _builtinDate_beforeSet(call, 3, true) - if ecmaTime == nil { - return NaNValue() - } - - if len(value) > 2 { - ecmaTime.day = value[2] - ecmaTime.month = value[1] - } else if len(value) > 1 { - ecmaTime.month = value[1] - } - ecmaTime.year = value[0] - - date.SetTime(ecmaTime.goTime()) - object.value = *date - return date.Value() -} - -func builtinDate_setUTCFullYear(call FunctionCall) Value { - object, date, ecmaTime, value := _builtinDate_beforeSet(call, 3, false) - if ecmaTime == nil { - return NaNValue() - } - - if len(value) > 2 { - ecmaTime.day = value[2] - ecmaTime.month = value[1] - } else if len(value) > 1 { - ecmaTime.month = value[1] - } - ecmaTime.year = value[0] - - date.SetTime(ecmaTime.goTime()) - object.value = *date - return date.Value() -} - -// toUTCString -// toISOString -// toJSONString -// toJSON diff --git a/vendor/github.com/robertkrimen/otto/builtin_error.go b/vendor/github.com/robertkrimen/otto/builtin_error.go deleted file mode 100644 index 41da84ef24ac..000000000000 --- a/vendor/github.com/robertkrimen/otto/builtin_error.go +++ /dev/null @@ -1,126 +0,0 @@ -package otto - -import ( - "fmt" -) - -func builtinError(call FunctionCall) Value { - return toValue_object(call.runtime.newError("Error", call.Argument(0), 1)) -} - -func builtinNewError(self *_object, argumentList []Value) Value { - return toValue_object(self.runtime.newError("Error", valueOfArrayIndex(argumentList, 0), 0)) -} - -func builtinError_toString(call FunctionCall) Value { - thisObject := call.thisObject() - if thisObject == nil { - panic(call.runtime.panicTypeError()) - } - - name := "Error" - nameValue := thisObject.get("name") - if nameValue.IsDefined() { - name = nameValue.string() - } - - message := "" - messageValue := thisObject.get("message") - if messageValue.IsDefined() { - message = messageValue.string() - } - - if len(name) == 0 { - return toValue_string(message) - } - - if len(message) == 0 { - return toValue_string(name) - } - - return toValue_string(fmt.Sprintf("%s: %s", name, message)) -} - -func (runtime *_runtime) newEvalError(message Value) *_object { - self := runtime.newErrorObject("EvalError", message, 0) - self.prototype = runtime.global.EvalErrorPrototype - return self -} - -func builtinEvalError(call FunctionCall) Value { - return toValue_object(call.runtime.newEvalError(call.Argument(0))) -} - -func builtinNewEvalError(self *_object, argumentList []Value) Value { - return toValue_object(self.runtime.newEvalError(valueOfArrayIndex(argumentList, 0))) -} - -func (runtime *_runtime) newTypeError(message Value) *_object { - self := runtime.newErrorObject("TypeError", message, 0) - self.prototype = runtime.global.TypeErrorPrototype - return self -} - -func builtinTypeError(call FunctionCall) Value { - return toValue_object(call.runtime.newTypeError(call.Argument(0))) -} - -func builtinNewTypeError(self *_object, argumentList []Value) Value { - return toValue_object(self.runtime.newTypeError(valueOfArrayIndex(argumentList, 0))) -} - -func (runtime *_runtime) newRangeError(message Value) *_object { - self := runtime.newErrorObject("RangeError", message, 0) - self.prototype = runtime.global.RangeErrorPrototype - return self -} - -func builtinRangeError(call FunctionCall) Value { - return toValue_object(call.runtime.newRangeError(call.Argument(0))) -} - -func builtinNewRangeError(self *_object, argumentList []Value) Value { - return toValue_object(self.runtime.newRangeError(valueOfArrayIndex(argumentList, 0))) -} - -func (runtime *_runtime) newURIError(message Value) *_object { - self := runtime.newErrorObject("URIError", message, 0) - self.prototype = runtime.global.URIErrorPrototype - return self -} - -func (runtime *_runtime) newReferenceError(message Value) *_object { - self := runtime.newErrorObject("ReferenceError", message, 0) - self.prototype = runtime.global.ReferenceErrorPrototype - return self -} - -func builtinReferenceError(call FunctionCall) Value { - return toValue_object(call.runtime.newReferenceError(call.Argument(0))) -} - -func builtinNewReferenceError(self *_object, argumentList []Value) Value { - return toValue_object(self.runtime.newReferenceError(valueOfArrayIndex(argumentList, 0))) -} - -func (runtime *_runtime) newSyntaxError(message Value) *_object { - self := runtime.newErrorObject("SyntaxError", message, 0) - self.prototype = runtime.global.SyntaxErrorPrototype - return self -} - -func builtinSyntaxError(call FunctionCall) Value { - return toValue_object(call.runtime.newSyntaxError(call.Argument(0))) -} - -func builtinNewSyntaxError(self *_object, argumentList []Value) Value { - return toValue_object(self.runtime.newSyntaxError(valueOfArrayIndex(argumentList, 0))) -} - -func builtinURIError(call FunctionCall) Value { - return toValue_object(call.runtime.newURIError(call.Argument(0))) -} - -func builtinNewURIError(self *_object, argumentList []Value) Value { - return toValue_object(self.runtime.newURIError(valueOfArrayIndex(argumentList, 0))) -} diff --git a/vendor/github.com/robertkrimen/otto/builtin_function.go b/vendor/github.com/robertkrimen/otto/builtin_function.go deleted file mode 100644 index 3d07566c6bbf..000000000000 --- a/vendor/github.com/robertkrimen/otto/builtin_function.go +++ /dev/null @@ -1,129 +0,0 @@ -package otto - -import ( - "fmt" - "regexp" - "strings" - "unicode" - - "github.com/robertkrimen/otto/parser" -) - -// Function - -func builtinFunction(call FunctionCall) Value { - return toValue_object(builtinNewFunctionNative(call.runtime, call.ArgumentList)) -} - -func builtinNewFunction(self *_object, argumentList []Value) Value { - return toValue_object(builtinNewFunctionNative(self.runtime, argumentList)) -} - -func argumentList2parameterList(argumentList []Value) []string { - parameterList := make([]string, 0, len(argumentList)) - for _, value := range argumentList { - tmp := strings.FieldsFunc(value.string(), func(chr rune) bool { - return chr == ',' || unicode.IsSpace(chr) - }) - parameterList = append(parameterList, tmp...) - } - return parameterList -} - -var matchIdentifier = regexp.MustCompile(`^[$_\p{L}][$_\p{L}\d}]*$`) - -func builtinNewFunctionNative(runtime *_runtime, argumentList []Value) *_object { - var parameterList, body string - count := len(argumentList) - if count > 0 { - tmp := make([]string, 0, count-1) - for _, value := range argumentList[0 : count-1] { - tmp = append(tmp, value.string()) - } - parameterList = strings.Join(tmp, ",") - body = argumentList[count-1].string() - } - - // FIXME - function, err := parser.ParseFunction(parameterList, body) - runtime.parseThrow(err) // Will panic/throw appropriately - cmpl := _compiler{} - cmpl_function := cmpl.parseExpression(function) - - return runtime.newNodeFunction(cmpl_function.(*_nodeFunctionLiteral), runtime.globalStash) -} - -func builtinFunction_toString(call FunctionCall) Value { - object := call.thisClassObject("Function") // Should throw a TypeError unless Function - switch fn := object.value.(type) { - case _nativeFunctionObject: - return toValue_string(fmt.Sprintf("function %s() { [native code] }", fn.name)) - case _nodeFunctionObject: - return toValue_string(fn.node.source) - case _bindFunctionObject: - return toValue_string("function () { [native code] }") - } - - panic(call.runtime.panicTypeError("Function.toString()")) -} - -func builtinFunction_apply(call FunctionCall) Value { - if !call.This.isCallable() { - panic(call.runtime.panicTypeError()) - } - this := call.Argument(0) - if this.IsUndefined() { - // FIXME Not ECMA5 - this = toValue_object(call.runtime.globalObject) - } - argumentList := call.Argument(1) - switch argumentList.kind { - case valueUndefined, valueNull: - return call.thisObject().call(this, nil, false, nativeFrame) - case valueObject: - default: - panic(call.runtime.panicTypeError()) - } - - arrayObject := argumentList._object() - thisObject := call.thisObject() - length := int64(toUint32(arrayObject.get("length"))) - valueArray := make([]Value, length) - for index := int64(0); index < length; index++ { - valueArray[index] = arrayObject.get(arrayIndexToString(index)) - } - return thisObject.call(this, valueArray, false, nativeFrame) -} - -func builtinFunction_call(call FunctionCall) Value { - if !call.This.isCallable() { - panic(call.runtime.panicTypeError()) - } - thisObject := call.thisObject() - this := call.Argument(0) - if this.IsUndefined() { - // FIXME Not ECMA5 - this = toValue_object(call.runtime.globalObject) - } - if len(call.ArgumentList) >= 1 { - return thisObject.call(this, call.ArgumentList[1:], false, nativeFrame) - } - return thisObject.call(this, nil, false, nativeFrame) -} - -func builtinFunction_bind(call FunctionCall) Value { - target := call.This - if !target.isCallable() { - panic(call.runtime.panicTypeError()) - } - targetObject := target._object() - - this := call.Argument(0) - argumentList := call.slice(1) - if this.IsUndefined() { - // FIXME Do this elsewhere? - this = toValue_object(call.runtime.globalObject) - } - - return toValue_object(call.runtime.newBoundFunction(targetObject, this, argumentList)) -} diff --git a/vendor/github.com/robertkrimen/otto/builtin_json.go b/vendor/github.com/robertkrimen/otto/builtin_json.go deleted file mode 100644 index aed54bf1264f..000000000000 --- a/vendor/github.com/robertkrimen/otto/builtin_json.go +++ /dev/null @@ -1,299 +0,0 @@ -package otto - -import ( - "bytes" - "encoding/json" - "fmt" - "strings" -) - -type _builtinJSON_parseContext struct { - call FunctionCall - reviver Value -} - -func builtinJSON_parse(call FunctionCall) Value { - ctx := _builtinJSON_parseContext{ - call: call, - } - revive := false - if reviver := call.Argument(1); reviver.isCallable() { - revive = true - ctx.reviver = reviver - } - - var root interface{} - err := json.Unmarshal([]byte(call.Argument(0).string()), &root) - if err != nil { - panic(call.runtime.panicSyntaxError(err.Error())) - } - value, exists := builtinJSON_parseWalk(ctx, root) - if !exists { - value = Value{} - } - if revive { - root := ctx.call.runtime.newObject() - root.put("", value, false) - return builtinJSON_reviveWalk(ctx, root, "") - } - return value -} - -func builtinJSON_reviveWalk(ctx _builtinJSON_parseContext, holder *_object, name string) Value { - value := holder.get(name) - if object := value._object(); object != nil { - if isArray(object) { - length := int64(objectLength(object)) - for index := int64(0); index < length; index += 1 { - name := arrayIndexToString(index) - value := builtinJSON_reviveWalk(ctx, object, name) - if value.IsUndefined() { - object.delete(name, false) - } else { - object.defineProperty(name, value, 0111, false) - } - } - } else { - object.enumerate(false, func(name string) bool { - value := builtinJSON_reviveWalk(ctx, object, name) - if value.IsUndefined() { - object.delete(name, false) - } else { - object.defineProperty(name, value, 0111, false) - } - return true - }) - } - } - return ctx.reviver.call(ctx.call.runtime, toValue_object(holder), name, value) -} - -func builtinJSON_parseWalk(ctx _builtinJSON_parseContext, rawValue interface{}) (Value, bool) { - switch value := rawValue.(type) { - case nil: - return nullValue, true - case bool: - return toValue_bool(value), true - case string: - return toValue_string(value), true - case float64: - return toValue_float64(value), true - case []interface{}: - arrayValue := make([]Value, len(value)) - for index, rawValue := range value { - if value, exists := builtinJSON_parseWalk(ctx, rawValue); exists { - arrayValue[index] = value - } - } - return toValue_object(ctx.call.runtime.newArrayOf(arrayValue)), true - case map[string]interface{}: - object := ctx.call.runtime.newObject() - for name, rawValue := range value { - if value, exists := builtinJSON_parseWalk(ctx, rawValue); exists { - object.put(name, value, false) - } - } - return toValue_object(object), true - } - return Value{}, false -} - -type _builtinJSON_stringifyContext struct { - call FunctionCall - stack []*_object - propertyList []string - replacerFunction *Value - gap string -} - -func builtinJSON_stringify(call FunctionCall) Value { - ctx := _builtinJSON_stringifyContext{ - call: call, - stack: []*_object{nil}, - } - replacer := call.Argument(1)._object() - if replacer != nil { - if isArray(replacer) { - length := objectLength(replacer) - seen := map[string]bool{} - propertyList := make([]string, length) - length = 0 - for index, _ := range propertyList { - value := replacer.get(arrayIndexToString(int64(index))) - switch value.kind { - case valueObject: - switch value.value.(*_object).class { - case "String": - case "Number": - default: - continue - } - case valueString: - case valueNumber: - default: - continue - } - name := value.string() - if seen[name] { - continue - } - seen[name] = true - length += 1 - propertyList[index] = name - } - ctx.propertyList = propertyList[0:length] - } else if replacer.class == "Function" { - value := toValue_object(replacer) - ctx.replacerFunction = &value - } - } - if spaceValue, exists := call.getArgument(2); exists { - if spaceValue.kind == valueObject { - switch spaceValue.value.(*_object).class { - case "String": - spaceValue = toValue_string(spaceValue.string()) - case "Number": - spaceValue = spaceValue.numberValue() - } - } - switch spaceValue.kind { - case valueString: - value := spaceValue.string() - if len(value) > 10 { - ctx.gap = value[0:10] - } else { - ctx.gap = value - } - case valueNumber: - value := spaceValue.number().int64 - if value > 10 { - value = 10 - } else if value < 0 { - value = 0 - } - ctx.gap = strings.Repeat(" ", int(value)) - } - } - holder := call.runtime.newObject() - holder.put("", call.Argument(0), false) - value, exists := builtinJSON_stringifyWalk(ctx, "", holder) - if !exists { - return Value{} - } - valueJSON, err := json.Marshal(value) - if err != nil { - panic(call.runtime.panicTypeError(err.Error())) - } - if ctx.gap != "" { - valueJSON1 := bytes.Buffer{} - json.Indent(&valueJSON1, valueJSON, "", ctx.gap) - valueJSON = valueJSON1.Bytes() - } - return toValue_string(string(valueJSON)) -} - -func builtinJSON_stringifyWalk(ctx _builtinJSON_stringifyContext, key string, holder *_object) (interface{}, bool) { - value := holder.get(key) - - if value.IsObject() { - object := value._object() - if toJSON := object.get("toJSON"); toJSON.IsFunction() { - value = toJSON.call(ctx.call.runtime, value, key) - } else { - // If the object is a GoStruct or something that implements json.Marshaler - if object.objectClass.marshalJSON != nil { - marshaler := object.objectClass.marshalJSON(object) - if marshaler != nil { - return marshaler, true - } - } - } - } - - if ctx.replacerFunction != nil { - value = (*ctx.replacerFunction).call(ctx.call.runtime, toValue_object(holder), key, value) - } - - if value.kind == valueObject { - switch value.value.(*_object).class { - case "Boolean": - value = value._object().value.(Value) - case "String": - value = toValue_string(value.string()) - case "Number": - value = value.numberValue() - } - } - - switch value.kind { - case valueBoolean: - return value.bool(), true - case valueString: - return value.string(), true - case valueNumber: - integer := value.number() - switch integer.kind { - case numberInteger: - return integer.int64, true - case numberFloat: - return integer.float64, true - default: - return nil, true - } - case valueNull: - return nil, true - case valueObject: - holder := value._object() - if value := value._object(); nil != value { - for _, object := range ctx.stack { - if holder == object { - panic(ctx.call.runtime.panicTypeError("Converting circular structure to JSON")) - } - } - ctx.stack = append(ctx.stack, value) - defer func() { ctx.stack = ctx.stack[:len(ctx.stack)-1] }() - } - if isArray(holder) { - var length uint32 - switch value := holder.get("length").value.(type) { - case uint32: - length = value - case int: - if value >= 0 { - length = uint32(value) - } - default: - panic(ctx.call.runtime.panicTypeError(fmt.Sprintf("JSON.stringify: invalid length: %v (%[1]T)", value))) - } - array := make([]interface{}, length) - for index, _ := range array { - name := arrayIndexToString(int64(index)) - value, _ := builtinJSON_stringifyWalk(ctx, name, holder) - array[index] = value - } - return array, true - } else if holder.class != "Function" { - object := map[string]interface{}{} - if ctx.propertyList != nil { - for _, name := range ctx.propertyList { - value, exists := builtinJSON_stringifyWalk(ctx, name, holder) - if exists { - object[name] = value - } - } - } else { - // Go maps are without order, so this doesn't conform to the ECMA ordering - // standard, but oh well... - holder.enumerate(false, func(name string) bool { - value, exists := builtinJSON_stringifyWalk(ctx, name, holder) - if exists { - object[name] = value - } - return true - }) - } - return object, true - } - } - return nil, false -} diff --git a/vendor/github.com/robertkrimen/otto/builtin_math.go b/vendor/github.com/robertkrimen/otto/builtin_math.go deleted file mode 100644 index 7ce90c339efb..000000000000 --- a/vendor/github.com/robertkrimen/otto/builtin_math.go +++ /dev/null @@ -1,151 +0,0 @@ -package otto - -import ( - "math" - "math/rand" -) - -// Math - -func builtinMath_abs(call FunctionCall) Value { - number := call.Argument(0).float64() - return toValue_float64(math.Abs(number)) -} - -func builtinMath_acos(call FunctionCall) Value { - number := call.Argument(0).float64() - return toValue_float64(math.Acos(number)) -} - -func builtinMath_asin(call FunctionCall) Value { - number := call.Argument(0).float64() - return toValue_float64(math.Asin(number)) -} - -func builtinMath_atan(call FunctionCall) Value { - number := call.Argument(0).float64() - return toValue_float64(math.Atan(number)) -} - -func builtinMath_atan2(call FunctionCall) Value { - y := call.Argument(0).float64() - if math.IsNaN(y) { - return NaNValue() - } - x := call.Argument(1).float64() - if math.IsNaN(x) { - return NaNValue() - } - return toValue_float64(math.Atan2(y, x)) -} - -func builtinMath_cos(call FunctionCall) Value { - number := call.Argument(0).float64() - return toValue_float64(math.Cos(number)) -} - -func builtinMath_ceil(call FunctionCall) Value { - number := call.Argument(0).float64() - return toValue_float64(math.Ceil(number)) -} - -func builtinMath_exp(call FunctionCall) Value { - number := call.Argument(0).float64() - return toValue_float64(math.Exp(number)) -} - -func builtinMath_floor(call FunctionCall) Value { - number := call.Argument(0).float64() - return toValue_float64(math.Floor(number)) -} - -func builtinMath_log(call FunctionCall) Value { - number := call.Argument(0).float64() - return toValue_float64(math.Log(number)) -} - -func builtinMath_max(call FunctionCall) Value { - switch len(call.ArgumentList) { - case 0: - return negativeInfinityValue() - case 1: - return toValue_float64(call.ArgumentList[0].float64()) - } - result := call.ArgumentList[0].float64() - if math.IsNaN(result) { - return NaNValue() - } - for _, value := range call.ArgumentList[1:] { - value := value.float64() - if math.IsNaN(value) { - return NaNValue() - } - result = math.Max(result, value) - } - return toValue_float64(result) -} - -func builtinMath_min(call FunctionCall) Value { - switch len(call.ArgumentList) { - case 0: - return positiveInfinityValue() - case 1: - return toValue_float64(call.ArgumentList[0].float64()) - } - result := call.ArgumentList[0].float64() - if math.IsNaN(result) { - return NaNValue() - } - for _, value := range call.ArgumentList[1:] { - value := value.float64() - if math.IsNaN(value) { - return NaNValue() - } - result = math.Min(result, value) - } - return toValue_float64(result) -} - -func builtinMath_pow(call FunctionCall) Value { - // TODO Make sure this works according to the specification (15.8.2.13) - x := call.Argument(0).float64() - y := call.Argument(1).float64() - if math.Abs(x) == 1 && math.IsInf(y, 0) { - return NaNValue() - } - return toValue_float64(math.Pow(x, y)) -} - -func builtinMath_random(call FunctionCall) Value { - var v float64 - if call.runtime.random != nil { - v = call.runtime.random() - } else { - v = rand.Float64() - } - return toValue_float64(v) -} - -func builtinMath_round(call FunctionCall) Value { - number := call.Argument(0).float64() - value := math.Floor(number + 0.5) - if value == 0 { - value = math.Copysign(0, number) - } - return toValue_float64(value) -} - -func builtinMath_sin(call FunctionCall) Value { - number := call.Argument(0).float64() - return toValue_float64(math.Sin(number)) -} - -func builtinMath_sqrt(call FunctionCall) Value { - number := call.Argument(0).float64() - return toValue_float64(math.Sqrt(number)) -} - -func builtinMath_tan(call FunctionCall) Value { - number := call.Argument(0).float64() - return toValue_float64(math.Tan(number)) -} diff --git a/vendor/github.com/robertkrimen/otto/builtin_number.go b/vendor/github.com/robertkrimen/otto/builtin_number.go deleted file mode 100644 index f99a42a2fb57..000000000000 --- a/vendor/github.com/robertkrimen/otto/builtin_number.go +++ /dev/null @@ -1,93 +0,0 @@ -package otto - -import ( - "math" - "strconv" -) - -// Number - -func numberValueFromNumberArgumentList(argumentList []Value) Value { - if len(argumentList) > 0 { - return argumentList[0].numberValue() - } - return toValue_int(0) -} - -func builtinNumber(call FunctionCall) Value { - return numberValueFromNumberArgumentList(call.ArgumentList) -} - -func builtinNewNumber(self *_object, argumentList []Value) Value { - return toValue_object(self.runtime.newNumber(numberValueFromNumberArgumentList(argumentList))) -} - -func builtinNumber_toString(call FunctionCall) Value { - // Will throw a TypeError if ThisObject is not a Number - value := call.thisClassObject("Number").primitiveValue() - radix := 10 - radixArgument := call.Argument(0) - if radixArgument.IsDefined() { - integer := toIntegerFloat(radixArgument) - if integer < 2 || integer > 36 { - panic(call.runtime.panicRangeError("toString() radix must be between 2 and 36")) - } - radix = int(integer) - } - if radix == 10 { - return toValue_string(value.string()) - } - return toValue_string(numberToStringRadix(value, radix)) -} - -func builtinNumber_valueOf(call FunctionCall) Value { - return call.thisClassObject("Number").primitiveValue() -} - -func builtinNumber_toFixed(call FunctionCall) Value { - precision := toIntegerFloat(call.Argument(0)) - if 20 < precision || 0 > precision { - panic(call.runtime.panicRangeError("toFixed() precision must be between 0 and 20")) - } - if call.This.IsNaN() { - return toValue_string("NaN") - } - value := call.This.float64() - if math.Abs(value) >= 1e21 { - return toValue_string(floatToString(value, 64)) - } - return toValue_string(strconv.FormatFloat(call.This.float64(), 'f', int(precision), 64)) -} - -func builtinNumber_toExponential(call FunctionCall) Value { - if call.This.IsNaN() { - return toValue_string("NaN") - } - precision := float64(-1) - if value := call.Argument(0); value.IsDefined() { - precision = toIntegerFloat(value) - if 0 > precision { - panic(call.runtime.panicRangeError("toString() radix must be between 2 and 36")) - } - } - return toValue_string(strconv.FormatFloat(call.This.float64(), 'e', int(precision), 64)) -} - -func builtinNumber_toPrecision(call FunctionCall) Value { - if call.This.IsNaN() { - return toValue_string("NaN") - } - value := call.Argument(0) - if value.IsUndefined() { - return toValue_string(call.This.string()) - } - precision := toIntegerFloat(value) - if 1 > precision { - panic(call.runtime.panicRangeError("toPrecision() precision must be greater than 1")) - } - return toValue_string(strconv.FormatFloat(call.This.float64(), 'g', int(precision), 64)) -} - -func builtinNumber_toLocaleString(call FunctionCall) Value { - return builtinNumber_toString(call) -} diff --git a/vendor/github.com/robertkrimen/otto/builtin_object.go b/vendor/github.com/robertkrimen/otto/builtin_object.go deleted file mode 100644 index c2433f7be2b3..000000000000 --- a/vendor/github.com/robertkrimen/otto/builtin_object.go +++ /dev/null @@ -1,289 +0,0 @@ -package otto - -import ( - "fmt" -) - -// Object - -func builtinObject(call FunctionCall) Value { - value := call.Argument(0) - switch value.kind { - case valueUndefined, valueNull: - return toValue_object(call.runtime.newObject()) - } - - return toValue_object(call.runtime.toObject(value)) -} - -func builtinNewObject(self *_object, argumentList []Value) Value { - value := valueOfArrayIndex(argumentList, 0) - switch value.kind { - case valueNull, valueUndefined: - case valueNumber, valueString, valueBoolean: - return toValue_object(self.runtime.toObject(value)) - case valueObject: - return value - default: - } - return toValue_object(self.runtime.newObject()) -} - -func builtinObject_valueOf(call FunctionCall) Value { - return toValue_object(call.thisObject()) -} - -func builtinObject_hasOwnProperty(call FunctionCall) Value { - propertyName := call.Argument(0).string() - thisObject := call.thisObject() - return toValue_bool(thisObject.hasOwnProperty(propertyName)) -} - -func builtinObject_isPrototypeOf(call FunctionCall) Value { - value := call.Argument(0) - if !value.IsObject() { - return falseValue - } - prototype := call.toObject(value).prototype - thisObject := call.thisObject() - for prototype != nil { - if thisObject == prototype { - return trueValue - } - prototype = prototype.prototype - } - return falseValue -} - -func builtinObject_propertyIsEnumerable(call FunctionCall) Value { - propertyName := call.Argument(0).string() - thisObject := call.thisObject() - property := thisObject.getOwnProperty(propertyName) - if property != nil && property.enumerable() { - return trueValue - } - return falseValue -} - -func builtinObject_toString(call FunctionCall) Value { - result := "" - if call.This.IsUndefined() { - result = "[object Undefined]" - } else if call.This.IsNull() { - result = "[object Null]" - } else { - result = fmt.Sprintf("[object %s]", call.thisObject().class) - } - return toValue_string(result) -} - -func builtinObject_toLocaleString(call FunctionCall) Value { - toString := call.thisObject().get("toString") - if !toString.isCallable() { - panic(call.runtime.panicTypeError()) - } - return toString.call(call.runtime, call.This) -} - -func builtinObject_getPrototypeOf(call FunctionCall) Value { - objectValue := call.Argument(0) - object := objectValue._object() - if object == nil { - panic(call.runtime.panicTypeError()) - } - - if object.prototype == nil { - return nullValue - } - - return toValue_object(object.prototype) -} - -func builtinObject_getOwnPropertyDescriptor(call FunctionCall) Value { - objectValue := call.Argument(0) - object := objectValue._object() - if object == nil { - panic(call.runtime.panicTypeError()) - } - - name := call.Argument(1).string() - descriptor := object.getOwnProperty(name) - if descriptor == nil { - return Value{} - } - return toValue_object(call.runtime.fromPropertyDescriptor(*descriptor)) -} - -func builtinObject_defineProperty(call FunctionCall) Value { - objectValue := call.Argument(0) - object := objectValue._object() - if object == nil { - panic(call.runtime.panicTypeError()) - } - name := call.Argument(1).string() - descriptor := toPropertyDescriptor(call.runtime, call.Argument(2)) - object.defineOwnProperty(name, descriptor, true) - return objectValue -} - -func builtinObject_defineProperties(call FunctionCall) Value { - objectValue := call.Argument(0) - object := objectValue._object() - if object == nil { - panic(call.runtime.panicTypeError()) - } - - properties := call.runtime.toObject(call.Argument(1)) - properties.enumerate(false, func(name string) bool { - descriptor := toPropertyDescriptor(call.runtime, properties.get(name)) - object.defineOwnProperty(name, descriptor, true) - return true - }) - - return objectValue -} - -func builtinObject_create(call FunctionCall) Value { - prototypeValue := call.Argument(0) - if !prototypeValue.IsNull() && !prototypeValue.IsObject() { - panic(call.runtime.panicTypeError()) - } - - object := call.runtime.newObject() - object.prototype = prototypeValue._object() - - propertiesValue := call.Argument(1) - if propertiesValue.IsDefined() { - properties := call.runtime.toObject(propertiesValue) - properties.enumerate(false, func(name string) bool { - descriptor := toPropertyDescriptor(call.runtime, properties.get(name)) - object.defineOwnProperty(name, descriptor, true) - return true - }) - } - - return toValue_object(object) -} - -func builtinObject_isExtensible(call FunctionCall) Value { - object := call.Argument(0) - if object := object._object(); object != nil { - return toValue_bool(object.extensible) - } - panic(call.runtime.panicTypeError()) -} - -func builtinObject_preventExtensions(call FunctionCall) Value { - object := call.Argument(0) - if object := object._object(); object != nil { - object.extensible = false - } else { - panic(call.runtime.panicTypeError()) - } - return object -} - -func builtinObject_isSealed(call FunctionCall) Value { - object := call.Argument(0) - if object := object._object(); object != nil { - if object.extensible { - return toValue_bool(false) - } - result := true - object.enumerate(true, func(name string) bool { - property := object.getProperty(name) - if property.configurable() { - result = false - } - return true - }) - return toValue_bool(result) - } - panic(call.runtime.panicTypeError()) -} - -func builtinObject_seal(call FunctionCall) Value { - object := call.Argument(0) - if object := object._object(); object != nil { - object.enumerate(true, func(name string) bool { - if property := object.getOwnProperty(name); nil != property && property.configurable() { - property.configureOff() - object.defineOwnProperty(name, *property, true) - } - return true - }) - object.extensible = false - } else { - panic(call.runtime.panicTypeError()) - } - return object -} - -func builtinObject_isFrozen(call FunctionCall) Value { - object := call.Argument(0) - if object := object._object(); object != nil { - if object.extensible { - return toValue_bool(false) - } - result := true - object.enumerate(true, func(name string) bool { - property := object.getProperty(name) - if property.configurable() || property.writable() { - result = false - } - return true - }) - return toValue_bool(result) - } - panic(call.runtime.panicTypeError()) -} - -func builtinObject_freeze(call FunctionCall) Value { - object := call.Argument(0) - if object := object._object(); object != nil { - object.enumerate(true, func(name string) bool { - if property, update := object.getOwnProperty(name), false; nil != property { - if property.isDataDescriptor() && property.writable() { - property.writeOff() - update = true - } - if property.configurable() { - property.configureOff() - update = true - } - if update { - object.defineOwnProperty(name, *property, true) - } - } - return true - }) - object.extensible = false - } else { - panic(call.runtime.panicTypeError()) - } - return object -} - -func builtinObject_keys(call FunctionCall) Value { - if object, keys := call.Argument(0)._object(), []Value(nil); nil != object { - object.enumerate(false, func(name string) bool { - keys = append(keys, toValue_string(name)) - return true - }) - return toValue_object(call.runtime.newArrayOf(keys)) - } - panic(call.runtime.panicTypeError()) -} - -func builtinObject_getOwnPropertyNames(call FunctionCall) Value { - if object, propertyNames := call.Argument(0)._object(), []Value(nil); nil != object { - object.enumerate(true, func(name string) bool { - if object.hasOwnProperty(name) { - propertyNames = append(propertyNames, toValue_string(name)) - } - return true - }) - return toValue_object(call.runtime.newArrayOf(propertyNames)) - } - panic(call.runtime.panicTypeError()) -} diff --git a/vendor/github.com/robertkrimen/otto/builtin_regexp.go b/vendor/github.com/robertkrimen/otto/builtin_regexp.go deleted file mode 100644 index 99422510d36a..000000000000 --- a/vendor/github.com/robertkrimen/otto/builtin_regexp.go +++ /dev/null @@ -1,65 +0,0 @@ -package otto - -import ( - "fmt" -) - -// RegExp - -func builtinRegExp(call FunctionCall) Value { - pattern := call.Argument(0) - flags := call.Argument(1) - if object := pattern._object(); object != nil { - if object.class == "RegExp" && flags.IsUndefined() { - return pattern - } - } - return toValue_object(call.runtime.newRegExp(pattern, flags)) -} - -func builtinNewRegExp(self *_object, argumentList []Value) Value { - return toValue_object(self.runtime.newRegExp( - valueOfArrayIndex(argumentList, 0), - valueOfArrayIndex(argumentList, 1), - )) -} - -func builtinRegExp_toString(call FunctionCall) Value { - thisObject := call.thisObject() - source := thisObject.get("source").string() - flags := []byte{} - if thisObject.get("global").bool() { - flags = append(flags, 'g') - } - if thisObject.get("ignoreCase").bool() { - flags = append(flags, 'i') - } - if thisObject.get("multiline").bool() { - flags = append(flags, 'm') - } - return toValue_string(fmt.Sprintf("/%s/%s", source, flags)) -} - -func builtinRegExp_exec(call FunctionCall) Value { - thisObject := call.thisObject() - target := call.Argument(0).string() - match, result := execRegExp(thisObject, target) - if !match { - return nullValue - } - return toValue_object(execResultToArray(call.runtime, target, result)) -} - -func builtinRegExp_test(call FunctionCall) Value { - thisObject := call.thisObject() - target := call.Argument(0).string() - match, _ := execRegExp(thisObject, target) - return toValue_bool(match) -} - -func builtinRegExp_compile(call FunctionCall) Value { - // This (useless) function is deprecated, but is here to provide some - // semblance of compatibility. - // Caveat emptor: it may not be around for long. - return Value{} -} diff --git a/vendor/github.com/robertkrimen/otto/builtin_string.go b/vendor/github.com/robertkrimen/otto/builtin_string.go deleted file mode 100644 index 6a17184589dd..000000000000 --- a/vendor/github.com/robertkrimen/otto/builtin_string.go +++ /dev/null @@ -1,500 +0,0 @@ -package otto - -import ( - "bytes" - "regexp" - "strconv" - "strings" - "unicode/utf8" -) - -// String - -func stringValueFromStringArgumentList(argumentList []Value) Value { - if len(argumentList) > 0 { - return toValue_string(argumentList[0].string()) - } - return toValue_string("") -} - -func builtinString(call FunctionCall) Value { - return stringValueFromStringArgumentList(call.ArgumentList) -} - -func builtinNewString(self *_object, argumentList []Value) Value { - return toValue_object(self.runtime.newString(stringValueFromStringArgumentList(argumentList))) -} - -func builtinString_toString(call FunctionCall) Value { - return call.thisClassObject("String").primitiveValue() -} -func builtinString_valueOf(call FunctionCall) Value { - return call.thisClassObject("String").primitiveValue() -} - -func builtinString_fromCharCode(call FunctionCall) Value { - chrList := make([]uint16, len(call.ArgumentList)) - for index, value := range call.ArgumentList { - chrList[index] = toUint16(value) - } - return toValue_string16(chrList) -} - -func builtinString_charAt(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - idx := int(call.Argument(0).number().int64) - chr := stringAt(call.This._object().stringValue(), idx) - if chr == utf8.RuneError { - return toValue_string("") - } - return toValue_string(string(chr)) -} - -func builtinString_charCodeAt(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - idx := int(call.Argument(0).number().int64) - chr := stringAt(call.This._object().stringValue(), idx) - if chr == utf8.RuneError { - return NaNValue() - } - return toValue_uint16(uint16(chr)) -} - -func builtinString_concat(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - var value bytes.Buffer - value.WriteString(call.This.string()) - for _, item := range call.ArgumentList { - value.WriteString(item.string()) - } - return toValue_string(value.String()) -} - -func builtinString_indexOf(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - value := call.This.string() - target := call.Argument(0).string() - if 2 > len(call.ArgumentList) { - return toValue_int(strings.Index(value, target)) - } - start := toIntegerFloat(call.Argument(1)) - if 0 > start { - start = 0 - } else if start >= float64(len(value)) { - if target == "" { - return toValue_int(len(value)) - } - return toValue_int(-1) - } - index := strings.Index(value[int(start):], target) - if index >= 0 { - index += int(start) - } - return toValue_int(index) -} - -func builtinString_lastIndexOf(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - value := call.This.string() - target := call.Argument(0).string() - if 2 > len(call.ArgumentList) || call.ArgumentList[1].IsUndefined() { - return toValue_int(strings.LastIndex(value, target)) - } - length := len(value) - if length == 0 { - return toValue_int(strings.LastIndex(value, target)) - } - start := call.ArgumentList[1].number() - if start.kind == numberInfinity { // FIXME - // startNumber is infinity, so start is the end of string (start = length) - return toValue_int(strings.LastIndex(value, target)) - } - if 0 > start.int64 { - start.int64 = 0 - } - end := int(start.int64) + len(target) - if end > length { - end = length - } - return toValue_int(strings.LastIndex(value[:end], target)) -} - -func builtinString_match(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - target := call.This.string() - matcherValue := call.Argument(0) - matcher := matcherValue._object() - if !matcherValue.IsObject() || matcher.class != "RegExp" { - matcher = call.runtime.newRegExp(matcherValue, Value{}) - } - global := matcher.get("global").bool() - if !global { - match, result := execRegExp(matcher, target) - if !match { - return nullValue - } - return toValue_object(execResultToArray(call.runtime, target, result)) - } - - { - result := matcher.regExpValue().regularExpression.FindAllStringIndex(target, -1) - matchCount := len(result) - if result == nil { - matcher.put("lastIndex", toValue_int(0), true) - return Value{} // !match - } - matchCount = len(result) - valueArray := make([]Value, matchCount) - for index := 0; index < matchCount; index++ { - valueArray[index] = toValue_string(target[result[index][0]:result[index][1]]) - } - matcher.put("lastIndex", toValue_int(result[matchCount-1][1]), true) - return toValue_object(call.runtime.newArrayOf(valueArray)) - } -} - -var builtinString_replace_Regexp = regexp.MustCompile("\\$(?:[\\$\\&\\'\\`1-9]|0[1-9]|[1-9][0-9])") - -func builtinString_findAndReplaceString(input []byte, lastIndex int, match []int, target []byte, replaceValue []byte) (output []byte) { - matchCount := len(match) / 2 - output = input - if match[0] != lastIndex { - output = append(output, target[lastIndex:match[0]]...) - } - replacement := builtinString_replace_Regexp.ReplaceAllFunc(replaceValue, func(part []byte) []byte { - // TODO Check if match[0] or match[1] can be -1 in this scenario - switch part[1] { - case '$': - return []byte{'$'} - case '&': - return target[match[0]:match[1]] - case '`': - return target[:match[0]] - case '\'': - return target[match[1]:len(target)] - } - matchNumberParse, error := strconv.ParseInt(string(part[1:]), 10, 64) - matchNumber := int(matchNumberParse) - if error != nil || matchNumber >= matchCount { - return []byte{} - } - offset := 2 * matchNumber - if match[offset] != -1 { - return target[match[offset]:match[offset+1]] - } - return []byte{} // The empty string - }) - output = append(output, replacement...) - return output -} - -func builtinString_replace(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - target := []byte(call.This.string()) - searchValue := call.Argument(0) - searchObject := searchValue._object() - - // TODO If a capture is -1? - var search *regexp.Regexp - global := false - find := 1 - if searchValue.IsObject() && searchObject.class == "RegExp" { - regExp := searchObject.regExpValue() - search = regExp.regularExpression - if regExp.global { - find = -1 - } - } else { - search = regexp.MustCompile(regexp.QuoteMeta(searchValue.string())) - } - - found := search.FindAllSubmatchIndex(target, find) - if found == nil { - return toValue_string(string(target)) // !match - } - - { - lastIndex := 0 - result := []byte{} - - replaceValue := call.Argument(1) - if replaceValue.isCallable() { - target := string(target) - replace := replaceValue._object() - for _, match := range found { - if match[0] != lastIndex { - result = append(result, target[lastIndex:match[0]]...) - } - matchCount := len(match) / 2 - argumentList := make([]Value, matchCount+2) - for index := 0; index < matchCount; index++ { - offset := 2 * index - if match[offset] != -1 { - argumentList[index] = toValue_string(target[match[offset]:match[offset+1]]) - } else { - argumentList[index] = Value{} - } - } - argumentList[matchCount+0] = toValue_int(match[0]) - argumentList[matchCount+1] = toValue_string(target) - replacement := replace.call(Value{}, argumentList, false, nativeFrame).string() - result = append(result, []byte(replacement)...) - lastIndex = match[1] - } - - } else { - replace := []byte(replaceValue.string()) - for _, match := range found { - result = builtinString_findAndReplaceString(result, lastIndex, match, target, replace) - lastIndex = match[1] - } - } - - if lastIndex != len(target) { - result = append(result, target[lastIndex:]...) - } - - if global && searchObject != nil { - searchObject.put("lastIndex", toValue_int(lastIndex), true) - } - - return toValue_string(string(result)) - } -} - -func builtinString_search(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - target := call.This.string() - searchValue := call.Argument(0) - search := searchValue._object() - if !searchValue.IsObject() || search.class != "RegExp" { - search = call.runtime.newRegExp(searchValue, Value{}) - } - result := search.regExpValue().regularExpression.FindStringIndex(target) - if result == nil { - return toValue_int(-1) - } - return toValue_int(result[0]) -} - -func stringSplitMatch(target string, targetLength int64, index uint, search string, searchLength int64) (bool, uint) { - if int64(index)+searchLength > searchLength { - return false, 0 - } - found := strings.Index(target[index:], search) - if 0 > found { - return false, 0 - } - return true, uint(found) -} - -func builtinString_split(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - target := call.This.string() - - separatorValue := call.Argument(0) - limitValue := call.Argument(1) - limit := -1 - if limitValue.IsDefined() { - limit = int(toUint32(limitValue)) - } - - if limit == 0 { - return toValue_object(call.runtime.newArray(0)) - } - - if separatorValue.IsUndefined() { - return toValue_object(call.runtime.newArrayOf([]Value{toValue_string(target)})) - } - - if separatorValue.isRegExp() { - targetLength := len(target) - search := separatorValue._object().regExpValue().regularExpression - valueArray := []Value{} - result := search.FindAllStringSubmatchIndex(target, -1) - lastIndex := 0 - found := 0 - - for _, match := range result { - if match[0] == match[1] { - // FIXME Ugh, this is a hack - if match[0] == 0 || match[0] == targetLength { - continue - } - } - - if lastIndex != match[0] { - valueArray = append(valueArray, toValue_string(target[lastIndex:match[0]])) - found++ - } else if lastIndex == match[0] { - if lastIndex != -1 { - valueArray = append(valueArray, toValue_string("")) - found++ - } - } - - lastIndex = match[1] - if found == limit { - goto RETURN - } - - captureCount := len(match) / 2 - for index := 1; index < captureCount; index++ { - offset := index * 2 - value := Value{} - if match[offset] != -1 { - value = toValue_string(target[match[offset]:match[offset+1]]) - } - valueArray = append(valueArray, value) - found++ - if found == limit { - goto RETURN - } - } - } - - if found != limit { - if lastIndex != targetLength { - valueArray = append(valueArray, toValue_string(target[lastIndex:targetLength])) - } else { - valueArray = append(valueArray, toValue_string("")) - } - } - - RETURN: - return toValue_object(call.runtime.newArrayOf(valueArray)) - - } else { - separator := separatorValue.string() - - splitLimit := limit - excess := false - if limit > 0 { - splitLimit = limit + 1 - excess = true - } - - split := strings.SplitN(target, separator, splitLimit) - - if excess && len(split) > limit { - split = split[:limit] - } - - valueArray := make([]Value, len(split)) - for index, value := range split { - valueArray[index] = toValue_string(value) - } - - return toValue_object(call.runtime.newArrayOf(valueArray)) - } -} - -func builtinString_slice(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - target := call.This.string() - - length := int64(len(target)) - start, end := rangeStartEnd(call.ArgumentList, length, false) - if end-start <= 0 { - return toValue_string("") - } - return toValue_string(target[start:end]) -} - -func builtinString_substring(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - target := call.This.string() - - length := int64(len(target)) - start, end := rangeStartEnd(call.ArgumentList, length, true) - if start > end { - start, end = end, start - } - return toValue_string(target[start:end]) -} - -func builtinString_substr(call FunctionCall) Value { - target := call.This.string() - - size := int64(len(target)) - start, length := rangeStartLength(call.ArgumentList, size) - - if start >= size { - return toValue_string("") - } - - if length <= 0 { - return toValue_string("") - } - - if start+length >= size { - // Cap length to be to the end of the string - // start = 3, length = 5, size = 4 [0, 1, 2, 3] - // 4 - 3 = 1 - // target[3:4] - length = size - start - } - - return toValue_string(target[start : start+length]) -} - -func builtinString_toLowerCase(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - return toValue_string(strings.ToLower(call.This.string())) -} - -func builtinString_toUpperCase(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - return toValue_string(strings.ToUpper(call.This.string())) -} - -// 7.2 Table 2 — Whitespace Characters & 7.3 Table 3 - Line Terminator Characters -const builtinString_trim_whitespace = "\u0009\u000A\u000B\u000C\u000D\u0020\u00A0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF" - -func builtinString_trim(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - return toValue(strings.Trim(call.This.string(), - builtinString_trim_whitespace)) -} - -// Mozilla extension, not ECMAScript 5 -func builtinString_trimLeft(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - return toValue(strings.TrimLeft(call.This.string(), - builtinString_trim_whitespace)) -} - -// Mozilla extension, not ECMAScript 5 -func builtinString_trimRight(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - return toValue(strings.TrimRight(call.This.string(), - builtinString_trim_whitespace)) -} - -func builtinString_localeCompare(call FunctionCall) Value { - checkObjectCoercible(call.runtime, call.This) - this := call.This.string() - that := call.Argument(0).string() - if this < that { - return toValue_int(-1) - } else if this == that { - return toValue_int(0) - } - return toValue_int(1) -} - -/* -An alternate version of String.trim -func builtinString_trim(call FunctionCall) Value { - checkObjectCoercible(call.This) - return toValue_string(strings.TrimFunc(call.string(.This), isWhiteSpaceOrLineTerminator)) -} -*/ - -func builtinString_toLocaleLowerCase(call FunctionCall) Value { - return builtinString_toLowerCase(call) -} - -func builtinString_toLocaleUpperCase(call FunctionCall) Value { - return builtinString_toUpperCase(call) -} diff --git a/vendor/github.com/robertkrimen/otto/clone.go b/vendor/github.com/robertkrimen/otto/clone.go deleted file mode 100644 index 23b59f8acb70..000000000000 --- a/vendor/github.com/robertkrimen/otto/clone.go +++ /dev/null @@ -1,173 +0,0 @@ -package otto - -import ( - "fmt" -) - -type _clone struct { - runtime *_runtime - _object map[*_object]*_object - _objectStash map[*_objectStash]*_objectStash - _dclStash map[*_dclStash]*_dclStash - _fnStash map[*_fnStash]*_fnStash -} - -func (in *_runtime) clone() *_runtime { - - in.lck.Lock() - defer in.lck.Unlock() - - out := &_runtime{ - debugger: in.debugger, - random: in.random, - stackLimit: in.stackLimit, - traceLimit: in.traceLimit, - } - - clone := _clone{ - runtime: out, - _object: make(map[*_object]*_object), - _objectStash: make(map[*_objectStash]*_objectStash), - _dclStash: make(map[*_dclStash]*_dclStash), - _fnStash: make(map[*_fnStash]*_fnStash), - } - - globalObject := clone.object(in.globalObject) - out.globalStash = out.newObjectStash(globalObject, nil) - out.globalObject = globalObject - out.global = _global{ - clone.object(in.global.Object), - clone.object(in.global.Function), - clone.object(in.global.Array), - clone.object(in.global.String), - clone.object(in.global.Boolean), - clone.object(in.global.Number), - clone.object(in.global.Math), - clone.object(in.global.Date), - clone.object(in.global.RegExp), - clone.object(in.global.Error), - clone.object(in.global.EvalError), - clone.object(in.global.TypeError), - clone.object(in.global.RangeError), - clone.object(in.global.ReferenceError), - clone.object(in.global.SyntaxError), - clone.object(in.global.URIError), - clone.object(in.global.JSON), - - clone.object(in.global.ObjectPrototype), - clone.object(in.global.FunctionPrototype), - clone.object(in.global.ArrayPrototype), - clone.object(in.global.StringPrototype), - clone.object(in.global.BooleanPrototype), - clone.object(in.global.NumberPrototype), - clone.object(in.global.DatePrototype), - clone.object(in.global.RegExpPrototype), - clone.object(in.global.ErrorPrototype), - clone.object(in.global.EvalErrorPrototype), - clone.object(in.global.TypeErrorPrototype), - clone.object(in.global.RangeErrorPrototype), - clone.object(in.global.ReferenceErrorPrototype), - clone.object(in.global.SyntaxErrorPrototype), - clone.object(in.global.URIErrorPrototype), - } - - out.eval = out.globalObject.property["eval"].value.(Value).value.(*_object) - out.globalObject.prototype = out.global.ObjectPrototype - - // Not sure if this is necessary, but give some help to the GC - clone.runtime = nil - clone._object = nil - clone._objectStash = nil - clone._dclStash = nil - clone._fnStash = nil - - return out -} - -func (clone *_clone) object(in *_object) *_object { - if out, exists := clone._object[in]; exists { - return out - } - out := &_object{} - clone._object[in] = out - return in.objectClass.clone(in, out, clone) -} - -func (clone *_clone) dclStash(in *_dclStash) (*_dclStash, bool) { - if out, exists := clone._dclStash[in]; exists { - return out, true - } - out := &_dclStash{} - clone._dclStash[in] = out - return out, false -} - -func (clone *_clone) objectStash(in *_objectStash) (*_objectStash, bool) { - if out, exists := clone._objectStash[in]; exists { - return out, true - } - out := &_objectStash{} - clone._objectStash[in] = out - return out, false -} - -func (clone *_clone) fnStash(in *_fnStash) (*_fnStash, bool) { - if out, exists := clone._fnStash[in]; exists { - return out, true - } - out := &_fnStash{} - clone._fnStash[in] = out - return out, false -} - -func (clone *_clone) value(in Value) Value { - out := in - switch value := in.value.(type) { - case *_object: - out.value = clone.object(value) - } - return out -} - -func (clone *_clone) valueArray(in []Value) []Value { - out := make([]Value, len(in)) - for index, value := range in { - out[index] = clone.value(value) - } - return out -} - -func (clone *_clone) stash(in _stash) _stash { - if in == nil { - return nil - } - return in.clone(clone) -} - -func (clone *_clone) property(in _property) _property { - out := in - - switch value := in.value.(type) { - case Value: - out.value = clone.value(value) - case _propertyGetSet: - p := _propertyGetSet{} - if value[0] != nil { - p[0] = clone.object(value[0]) - } - if value[1] != nil { - p[1] = clone.object(value[1]) - } - out.value = p - default: - panic(fmt.Errorf("in.value.(Value) != true; in.value is %T", in.value)) - } - - return out -} - -func (clone *_clone) dclProperty(in _dclProperty) _dclProperty { - out := in - out.value = clone.value(in.value) - return out -} diff --git a/vendor/github.com/robertkrimen/otto/cmpl.go b/vendor/github.com/robertkrimen/otto/cmpl.go deleted file mode 100644 index c191b4527934..000000000000 --- a/vendor/github.com/robertkrimen/otto/cmpl.go +++ /dev/null @@ -1,24 +0,0 @@ -package otto - -import ( - "github.com/robertkrimen/otto/ast" - "github.com/robertkrimen/otto/file" -) - -type _file struct { - name string - src string - base int // This will always be 1 or greater -} - -type _compiler struct { - file *file.File - program *ast.Program -} - -func (cmpl *_compiler) parse() *_nodeProgram { - if cmpl.program != nil { - cmpl.file = cmpl.program.File - } - return cmpl._parse(cmpl.program) -} diff --git a/vendor/github.com/robertkrimen/otto/cmpl_evaluate.go b/vendor/github.com/robertkrimen/otto/cmpl_evaluate.go deleted file mode 100644 index 6741bf394553..000000000000 --- a/vendor/github.com/robertkrimen/otto/cmpl_evaluate.go +++ /dev/null @@ -1,96 +0,0 @@ -package otto - -import ( - "strconv" -) - -func (self *_runtime) cmpl_evaluate_nodeProgram(node *_nodeProgram, eval bool) Value { - if !eval { - self.enterGlobalScope() - defer func() { - self.leaveScope() - }() - } - self.cmpl_functionDeclaration(node.functionList) - self.cmpl_variableDeclaration(node.varList) - self.scope.frame.file = node.file - return self.cmpl_evaluate_nodeStatementList(node.body) -} - -func (self *_runtime) cmpl_call_nodeFunction(function *_object, stash *_fnStash, node *_nodeFunctionLiteral, this Value, argumentList []Value) Value { - - indexOfParameterName := make([]string, len(argumentList)) - // function(abc, def, ghi) - // indexOfParameterName[0] = "abc" - // indexOfParameterName[1] = "def" - // indexOfParameterName[2] = "ghi" - // ... - - argumentsFound := false - for index, name := range node.parameterList { - if name == "arguments" { - argumentsFound = true - } - value := Value{} - if index < len(argumentList) { - value = argumentList[index] - indexOfParameterName[index] = name - } - // strict = false - self.scope.lexical.setValue(name, value, false) - } - - if !argumentsFound { - arguments := self.newArgumentsObject(indexOfParameterName, stash, len(argumentList)) - arguments.defineProperty("callee", toValue_object(function), 0101, false) - stash.arguments = arguments - // strict = false - self.scope.lexical.setValue("arguments", toValue_object(arguments), false) - for index, _ := range argumentList { - if index < len(node.parameterList) { - continue - } - indexAsString := strconv.FormatInt(int64(index), 10) - arguments.defineProperty(indexAsString, argumentList[index], 0111, false) - } - } - - self.cmpl_functionDeclaration(node.functionList) - self.cmpl_variableDeclaration(node.varList) - - result := self.cmpl_evaluate_nodeStatement(node.body) - if result.kind == valueResult { - return result - } - - return Value{} -} - -func (self *_runtime) cmpl_functionDeclaration(list []*_nodeFunctionLiteral) { - executionContext := self.scope - eval := executionContext.eval - stash := executionContext.variable - - for _, function := range list { - name := function.name - value := self.cmpl_evaluate_nodeExpression(function) - if !stash.hasBinding(name) { - stash.createBinding(name, eval == true, value) - } else { - // TODO 10.5.5.e - stash.setBinding(name, value, false) // TODO strict - } - } -} - -func (self *_runtime) cmpl_variableDeclaration(list []string) { - executionContext := self.scope - eval := executionContext.eval - stash := executionContext.variable - - for _, name := range list { - if !stash.hasBinding(name) { - stash.createBinding(name, eval == true, Value{}) // TODO strict? - } - } -} diff --git a/vendor/github.com/robertkrimen/otto/cmpl_evaluate_expression.go b/vendor/github.com/robertkrimen/otto/cmpl_evaluate_expression.go deleted file mode 100644 index 8586a484f42e..000000000000 --- a/vendor/github.com/robertkrimen/otto/cmpl_evaluate_expression.go +++ /dev/null @@ -1,460 +0,0 @@ -package otto - -import ( - "fmt" - "math" - "runtime" - - "github.com/robertkrimen/otto/token" -) - -func (self *_runtime) cmpl_evaluate_nodeExpression(node _nodeExpression) Value { - // Allow interpreter interruption - // If the Interrupt channel is nil, then - // we avoid runtime.Gosched() overhead (if any) - // FIXME: Test this - if self.otto.Interrupt != nil { - runtime.Gosched() - select { - case value := <-self.otto.Interrupt: - value() - default: - } - } - - switch node := node.(type) { - - case *_nodeArrayLiteral: - return self.cmpl_evaluate_nodeArrayLiteral(node) - - case *_nodeAssignExpression: - return self.cmpl_evaluate_nodeAssignExpression(node) - - case *_nodeBinaryExpression: - if node.comparison { - return self.cmpl_evaluate_nodeBinaryExpression_comparison(node) - } else { - return self.cmpl_evaluate_nodeBinaryExpression(node) - } - - case *_nodeBracketExpression: - return self.cmpl_evaluate_nodeBracketExpression(node) - - case *_nodeCallExpression: - return self.cmpl_evaluate_nodeCallExpression(node, nil) - - case *_nodeConditionalExpression: - return self.cmpl_evaluate_nodeConditionalExpression(node) - - case *_nodeDotExpression: - return self.cmpl_evaluate_nodeDotExpression(node) - - case *_nodeFunctionLiteral: - var local = self.scope.lexical - if node.name != "" { - local = self.newDeclarationStash(local) - } - - value := toValue_object(self.newNodeFunction(node, local)) - if node.name != "" { - local.createBinding(node.name, false, value) - } - return value - - case *_nodeIdentifier: - name := node.name - // TODO Should be true or false (strictness) depending on context - // getIdentifierReference should not return nil, but we check anyway and panic - // so as not to propagate the nil into something else - reference := getIdentifierReference(self, self.scope.lexical, name, false, _at(node.idx)) - if reference == nil { - // Should never get here! - panic(hereBeDragons("referenceError == nil: " + name)) - } - return toValue(reference) - - case *_nodeLiteral: - return node.value - - case *_nodeNewExpression: - return self.cmpl_evaluate_nodeNewExpression(node) - - case *_nodeObjectLiteral: - return self.cmpl_evaluate_nodeObjectLiteral(node) - - case *_nodeRegExpLiteral: - return toValue_object(self._newRegExp(node.pattern, node.flags)) - - case *_nodeSequenceExpression: - return self.cmpl_evaluate_nodeSequenceExpression(node) - - case *_nodeThisExpression: - return toValue_object(self.scope.this) - - case *_nodeUnaryExpression: - return self.cmpl_evaluate_nodeUnaryExpression(node) - - case *_nodeVariableExpression: - return self.cmpl_evaluate_nodeVariableExpression(node) - } - - panic(fmt.Errorf("Here be dragons: evaluate_nodeExpression(%T)", node)) -} - -func (self *_runtime) cmpl_evaluate_nodeArrayLiteral(node *_nodeArrayLiteral) Value { - - valueArray := []Value{} - - for _, node := range node.value { - if node == nil { - valueArray = append(valueArray, emptyValue) - } else { - valueArray = append(valueArray, self.cmpl_evaluate_nodeExpression(node).resolve()) - } - } - - result := self.newArrayOf(valueArray) - - return toValue_object(result) -} - -func (self *_runtime) cmpl_evaluate_nodeAssignExpression(node *_nodeAssignExpression) Value { - - left := self.cmpl_evaluate_nodeExpression(node.left) - right := self.cmpl_evaluate_nodeExpression(node.right) - rightValue := right.resolve() - - result := rightValue - if node.operator != token.ASSIGN { - result = self.calculateBinaryExpression(node.operator, left, rightValue) - } - - self.putValue(left.reference(), result) - - return result -} - -func (self *_runtime) cmpl_evaluate_nodeBinaryExpression(node *_nodeBinaryExpression) Value { - - left := self.cmpl_evaluate_nodeExpression(node.left) - leftValue := left.resolve() - - switch node.operator { - // Logical - case token.LOGICAL_AND: - if !leftValue.bool() { - return leftValue - } - right := self.cmpl_evaluate_nodeExpression(node.right) - return right.resolve() - case token.LOGICAL_OR: - if leftValue.bool() { - return leftValue - } - right := self.cmpl_evaluate_nodeExpression(node.right) - return right.resolve() - } - - return self.calculateBinaryExpression(node.operator, leftValue, self.cmpl_evaluate_nodeExpression(node.right)) -} - -func (self *_runtime) cmpl_evaluate_nodeBinaryExpression_comparison(node *_nodeBinaryExpression) Value { - - left := self.cmpl_evaluate_nodeExpression(node.left).resolve() - right := self.cmpl_evaluate_nodeExpression(node.right).resolve() - - return toValue_bool(self.calculateComparison(node.operator, left, right)) -} - -func (self *_runtime) cmpl_evaluate_nodeBracketExpression(node *_nodeBracketExpression) Value { - target := self.cmpl_evaluate_nodeExpression(node.left) - targetValue := target.resolve() - member := self.cmpl_evaluate_nodeExpression(node.member) - memberValue := member.resolve() - - // TODO Pass in base value as-is, and defer toObject till later? - object, err := self.objectCoerce(targetValue) - if err != nil { - panic(self.panicTypeError("Cannot access member '%s' of %s", memberValue.string(), err.Error(), _at(node.idx))) - } - return toValue(newPropertyReference(self, object, memberValue.string(), false, _at(node.idx))) -} - -func (self *_runtime) cmpl_evaluate_nodeCallExpression(node *_nodeCallExpression, withArgumentList []interface{}) Value { - rt := self - this := Value{} - callee := self.cmpl_evaluate_nodeExpression(node.callee) - - argumentList := []Value{} - if withArgumentList != nil { - argumentList = self.toValueArray(withArgumentList...) - } else { - for _, argumentNode := range node.argumentList { - argumentList = append(argumentList, self.cmpl_evaluate_nodeExpression(argumentNode).resolve()) - } - } - - rf := callee.reference() - vl := callee.resolve() - - eval := false // Whether this call is a (candidate for) direct call to eval - name := "" - if rf != nil { - switch rf := rf.(type) { - case *_propertyReference: - name = rf.name - object := rf.base - this = toValue_object(object) - eval = rf.name == "eval" // Possible direct eval - case *_stashReference: - // TODO ImplicitThisValue - name = rf.name - eval = rf.name == "eval" // Possible direct eval - default: - // FIXME? - panic(rt.panicTypeError("Here be dragons")) - } - } - - at := _at(-1) - switch callee := node.callee.(type) { - case *_nodeIdentifier: - at = _at(callee.idx) - case *_nodeDotExpression: - at = _at(callee.idx) - case *_nodeBracketExpression: - at = _at(callee.idx) - } - - frame := _frame{ - callee: name, - file: self.scope.frame.file, - } - - if !vl.IsFunction() { - if name == "" { - // FIXME Maybe typeof? - panic(rt.panicTypeError("%v is not a function", vl, at)) - } - panic(rt.panicTypeError("'%s' is not a function", name, at)) - } - - self.scope.frame.offset = int(at) - - return vl._object().call(this, argumentList, eval, frame) -} - -func (self *_runtime) cmpl_evaluate_nodeConditionalExpression(node *_nodeConditionalExpression) Value { - test := self.cmpl_evaluate_nodeExpression(node.test) - testValue := test.resolve() - if testValue.bool() { - return self.cmpl_evaluate_nodeExpression(node.consequent) - } - return self.cmpl_evaluate_nodeExpression(node.alternate) -} - -func (self *_runtime) cmpl_evaluate_nodeDotExpression(node *_nodeDotExpression) Value { - target := self.cmpl_evaluate_nodeExpression(node.left) - targetValue := target.resolve() - // TODO Pass in base value as-is, and defer toObject till later? - object, err := self.objectCoerce(targetValue) - if err != nil { - panic(self.panicTypeError("Cannot access member '%s' of %s", node.identifier, err.Error(), _at(node.idx))) - } - return toValue(newPropertyReference(self, object, node.identifier, false, _at(node.idx))) -} - -func (self *_runtime) cmpl_evaluate_nodeNewExpression(node *_nodeNewExpression) Value { - rt := self - callee := self.cmpl_evaluate_nodeExpression(node.callee) - - argumentList := []Value{} - for _, argumentNode := range node.argumentList { - argumentList = append(argumentList, self.cmpl_evaluate_nodeExpression(argumentNode).resolve()) - } - - rf := callee.reference() - vl := callee.resolve() - - name := "" - if rf != nil { - switch rf := rf.(type) { - case *_propertyReference: - name = rf.name - case *_stashReference: - name = rf.name - default: - panic(rt.panicTypeError("Here be dragons")) - } - } - - at := _at(-1) - switch callee := node.callee.(type) { - case *_nodeIdentifier: - at = _at(callee.idx) - case *_nodeDotExpression: - at = _at(callee.idx) - case *_nodeBracketExpression: - at = _at(callee.idx) - } - - if !vl.IsFunction() { - if name == "" { - // FIXME Maybe typeof? - panic(rt.panicTypeError("%v is not a function", vl, at)) - } - panic(rt.panicTypeError("'%s' is not a function", name, at)) - } - - self.scope.frame.offset = int(at) - - return vl._object().construct(argumentList) -} - -func (self *_runtime) cmpl_evaluate_nodeObjectLiteral(node *_nodeObjectLiteral) Value { - - result := self.newObject() - - for _, property := range node.value { - switch property.kind { - case "value": - result.defineProperty(property.key, self.cmpl_evaluate_nodeExpression(property.value).resolve(), 0111, false) - case "get": - getter := self.newNodeFunction(property.value.(*_nodeFunctionLiteral), self.scope.lexical) - descriptor := _property{} - descriptor.mode = 0211 - descriptor.value = _propertyGetSet{getter, nil} - result.defineOwnProperty(property.key, descriptor, false) - case "set": - setter := self.newNodeFunction(property.value.(*_nodeFunctionLiteral), self.scope.lexical) - descriptor := _property{} - descriptor.mode = 0211 - descriptor.value = _propertyGetSet{nil, setter} - result.defineOwnProperty(property.key, descriptor, false) - default: - panic(fmt.Errorf("Here be dragons: evaluate_nodeObjectLiteral: invalid property.Kind: %v", property.kind)) - } - } - - return toValue_object(result) -} - -func (self *_runtime) cmpl_evaluate_nodeSequenceExpression(node *_nodeSequenceExpression) Value { - var result Value - for _, node := range node.sequence { - result = self.cmpl_evaluate_nodeExpression(node) - result = result.resolve() - } - return result -} - -func (self *_runtime) cmpl_evaluate_nodeUnaryExpression(node *_nodeUnaryExpression) Value { - - target := self.cmpl_evaluate_nodeExpression(node.operand) - switch node.operator { - case token.TYPEOF, token.DELETE: - if target.kind == valueReference && target.reference().invalid() { - if node.operator == token.TYPEOF { - return toValue_string("undefined") - } - return trueValue - } - } - - switch node.operator { - case token.NOT: - targetValue := target.resolve() - if targetValue.bool() { - return falseValue - } - return trueValue - case token.BITWISE_NOT: - targetValue := target.resolve() - integerValue := toInt32(targetValue) - return toValue_int32(^integerValue) - case token.PLUS: - targetValue := target.resolve() - return toValue_float64(targetValue.float64()) - case token.MINUS: - targetValue := target.resolve() - value := targetValue.float64() - // TODO Test this - sign := float64(-1) - if math.Signbit(value) { - sign = 1 - } - return toValue_float64(math.Copysign(value, sign)) - case token.INCREMENT: - targetValue := target.resolve() - if node.postfix { - // Postfix++ - oldValue := targetValue.float64() - newValue := toValue_float64(+1 + oldValue) - self.putValue(target.reference(), newValue) - return toValue_float64(oldValue) - } else { - // ++Prefix - newValue := toValue_float64(+1 + targetValue.float64()) - self.putValue(target.reference(), newValue) - return newValue - } - case token.DECREMENT: - targetValue := target.resolve() - if node.postfix { - // Postfix-- - oldValue := targetValue.float64() - newValue := toValue_float64(-1 + oldValue) - self.putValue(target.reference(), newValue) - return toValue_float64(oldValue) - } else { - // --Prefix - newValue := toValue_float64(-1 + targetValue.float64()) - self.putValue(target.reference(), newValue) - return newValue - } - case token.VOID: - target.resolve() // FIXME Side effect? - return Value{} - case token.DELETE: - reference := target.reference() - if reference == nil { - return trueValue - } - return toValue_bool(target.reference().delete()) - case token.TYPEOF: - targetValue := target.resolve() - switch targetValue.kind { - case valueUndefined: - return toValue_string("undefined") - case valueNull: - return toValue_string("object") - case valueBoolean: - return toValue_string("boolean") - case valueNumber: - return toValue_string("number") - case valueString: - return toValue_string("string") - case valueObject: - if targetValue._object().isCall() { - return toValue_string("function") - } - return toValue_string("object") - default: - // FIXME ? - } - } - - panic(hereBeDragons()) -} - -func (self *_runtime) cmpl_evaluate_nodeVariableExpression(node *_nodeVariableExpression) Value { - if node.initializer != nil { - // FIXME If reference is nil - left := getIdentifierReference(self, self.scope.lexical, node.name, false, _at(node.idx)) - right := self.cmpl_evaluate_nodeExpression(node.initializer) - rightValue := right.resolve() - - self.putValue(left, rightValue) - } - return toValue_string(node.name) -} diff --git a/vendor/github.com/robertkrimen/otto/cmpl_evaluate_statement.go b/vendor/github.com/robertkrimen/otto/cmpl_evaluate_statement.go deleted file mode 100644 index e16c6ac6cf31..000000000000 --- a/vendor/github.com/robertkrimen/otto/cmpl_evaluate_statement.go +++ /dev/null @@ -1,424 +0,0 @@ -package otto - -import ( - "fmt" - "runtime" - - "github.com/robertkrimen/otto/token" -) - -func (self *_runtime) cmpl_evaluate_nodeStatement(node _nodeStatement) Value { - // Allow interpreter interruption - // If the Interrupt channel is nil, then - // we avoid runtime.Gosched() overhead (if any) - // FIXME: Test this - if self.otto.Interrupt != nil { - runtime.Gosched() - select { - case value := <-self.otto.Interrupt: - value() - default: - } - } - - switch node := node.(type) { - - case *_nodeBlockStatement: - labels := self.labels - self.labels = nil - - value := self.cmpl_evaluate_nodeStatementList(node.list) - switch value.kind { - case valueResult: - switch value.evaluateBreak(labels) { - case resultBreak: - return emptyValue - } - } - return value - - case *_nodeBranchStatement: - target := node.label - switch node.branch { // FIXME Maybe node.kind? node.operator? - case token.BREAK: - return toValue(newBreakResult(target)) - case token.CONTINUE: - return toValue(newContinueResult(target)) - } - - case *_nodeDebuggerStatement: - if self.debugger != nil { - self.debugger(self.otto) - } - return emptyValue // Nothing happens. - - case *_nodeDoWhileStatement: - return self.cmpl_evaluate_nodeDoWhileStatement(node) - - case *_nodeEmptyStatement: - return emptyValue - - case *_nodeExpressionStatement: - return self.cmpl_evaluate_nodeExpression(node.expression) - - case *_nodeForInStatement: - return self.cmpl_evaluate_nodeForInStatement(node) - - case *_nodeForStatement: - return self.cmpl_evaluate_nodeForStatement(node) - - case *_nodeIfStatement: - return self.cmpl_evaluate_nodeIfStatement(node) - - case *_nodeLabelledStatement: - self.labels = append(self.labels, node.label) - defer func() { - if len(self.labels) > 0 { - self.labels = self.labels[:len(self.labels)-1] // Pop the label - } else { - self.labels = nil - } - }() - return self.cmpl_evaluate_nodeStatement(node.statement) - - case *_nodeReturnStatement: - if node.argument != nil { - return toValue(newReturnResult(self.cmpl_evaluate_nodeExpression(node.argument).resolve())) - } - return toValue(newReturnResult(Value{})) - - case *_nodeSwitchStatement: - return self.cmpl_evaluate_nodeSwitchStatement(node) - - case *_nodeThrowStatement: - value := self.cmpl_evaluate_nodeExpression(node.argument).resolve() - panic(newException(value)) - - case *_nodeTryStatement: - return self.cmpl_evaluate_nodeTryStatement(node) - - case *_nodeVariableStatement: - // Variables are already defined, this is initialization only - for _, variable := range node.list { - self.cmpl_evaluate_nodeVariableExpression(variable.(*_nodeVariableExpression)) - } - return emptyValue - - case *_nodeWhileStatement: - return self.cmpl_evaluate_nodeWhileStatement(node) - - case *_nodeWithStatement: - return self.cmpl_evaluate_nodeWithStatement(node) - - } - - panic(fmt.Errorf("Here be dragons: evaluate_nodeStatement(%T)", node)) -} - -func (self *_runtime) cmpl_evaluate_nodeStatementList(list []_nodeStatement) Value { - var result Value - for _, node := range list { - value := self.cmpl_evaluate_nodeStatement(node) - switch value.kind { - case valueResult: - return value - case valueEmpty: - default: - // We have getValue here to (for example) trigger a - // ReferenceError (of the not defined variety) - // Not sure if this is the best way to error out early - // for such errors or if there is a better way - // TODO Do we still need this? - result = value.resolve() - } - } - return result -} - -func (self *_runtime) cmpl_evaluate_nodeDoWhileStatement(node *_nodeDoWhileStatement) Value { - - labels := append(self.labels, "") - self.labels = nil - - test := node.test - - result := emptyValue -resultBreak: - for { - for _, node := range node.body { - value := self.cmpl_evaluate_nodeStatement(node) - switch value.kind { - case valueResult: - switch value.evaluateBreakContinue(labels) { - case resultReturn: - return value - case resultBreak: - break resultBreak - case resultContinue: - goto resultContinue - } - case valueEmpty: - default: - result = value - } - } - resultContinue: - if !self.cmpl_evaluate_nodeExpression(test).resolve().bool() { - // Stahp: do ... while (false) - break - } - } - return result -} - -func (self *_runtime) cmpl_evaluate_nodeForInStatement(node *_nodeForInStatement) Value { - - labels := append(self.labels, "") - self.labels = nil - - source := self.cmpl_evaluate_nodeExpression(node.source) - sourceValue := source.resolve() - - switch sourceValue.kind { - case valueUndefined, valueNull: - return emptyValue - } - - sourceObject := self.toObject(sourceValue) - - into := node.into - body := node.body - - result := emptyValue - object := sourceObject - for object != nil { - enumerateValue := emptyValue - object.enumerate(false, func(name string) bool { - into := self.cmpl_evaluate_nodeExpression(into) - // In the case of: for (var abc in def) ... - if into.reference() == nil { - identifier := into.string() - // TODO Should be true or false (strictness) depending on context - into = toValue(getIdentifierReference(self, self.scope.lexical, identifier, false, -1)) - } - self.putValue(into.reference(), toValue_string(name)) - for _, node := range body { - value := self.cmpl_evaluate_nodeStatement(node) - switch value.kind { - case valueResult: - switch value.evaluateBreakContinue(labels) { - case resultReturn: - enumerateValue = value - return false - case resultBreak: - object = nil - return false - case resultContinue: - return true - } - case valueEmpty: - default: - enumerateValue = value - } - } - return true - }) - if object == nil { - break - } - object = object.prototype - if !enumerateValue.isEmpty() { - result = enumerateValue - } - } - return result -} - -func (self *_runtime) cmpl_evaluate_nodeForStatement(node *_nodeForStatement) Value { - - labels := append(self.labels, "") - self.labels = nil - - initializer := node.initializer - test := node.test - update := node.update - body := node.body - - if initializer != nil { - initialResult := self.cmpl_evaluate_nodeExpression(initializer) - initialResult.resolve() // Side-effect trigger - } - - result := emptyValue -resultBreak: - for { - if test != nil { - testResult := self.cmpl_evaluate_nodeExpression(test) - testResultValue := testResult.resolve() - if testResultValue.bool() == false { - break - } - } - for _, node := range body { - value := self.cmpl_evaluate_nodeStatement(node) - switch value.kind { - case valueResult: - switch value.evaluateBreakContinue(labels) { - case resultReturn: - return value - case resultBreak: - break resultBreak - case resultContinue: - goto resultContinue - } - case valueEmpty: - default: - result = value - } - } - resultContinue: - if update != nil { - updateResult := self.cmpl_evaluate_nodeExpression(update) - updateResult.resolve() // Side-effect trigger - } - } - return result -} - -func (self *_runtime) cmpl_evaluate_nodeIfStatement(node *_nodeIfStatement) Value { - test := self.cmpl_evaluate_nodeExpression(node.test) - testValue := test.resolve() - if testValue.bool() { - return self.cmpl_evaluate_nodeStatement(node.consequent) - } else if node.alternate != nil { - return self.cmpl_evaluate_nodeStatement(node.alternate) - } - - return emptyValue -} - -func (self *_runtime) cmpl_evaluate_nodeSwitchStatement(node *_nodeSwitchStatement) Value { - - labels := append(self.labels, "") - self.labels = nil - - discriminantResult := self.cmpl_evaluate_nodeExpression(node.discriminant) - target := node.default_ - - for index, clause := range node.body { - test := clause.test - if test != nil { - if self.calculateComparison(token.STRICT_EQUAL, discriminantResult, self.cmpl_evaluate_nodeExpression(test)) { - target = index - break - } - } - } - - result := emptyValue - if target != -1 { - for _, clause := range node.body[target:] { - for _, statement := range clause.consequent { - value := self.cmpl_evaluate_nodeStatement(statement) - switch value.kind { - case valueResult: - switch value.evaluateBreak(labels) { - case resultReturn: - return value - case resultBreak: - return emptyValue - } - case valueEmpty: - default: - result = value - } - } - } - } - - return result -} - -func (self *_runtime) cmpl_evaluate_nodeTryStatement(node *_nodeTryStatement) Value { - tryCatchValue, exception := self.tryCatchEvaluate(func() Value { - return self.cmpl_evaluate_nodeStatement(node.body) - }) - - if exception && node.catch != nil { - outer := self.scope.lexical - self.scope.lexical = self.newDeclarationStash(outer) - defer func() { - self.scope.lexical = outer - }() - // TODO If necessary, convert TypeError => TypeError - // That, is, such errors can be thrown despite not being JavaScript "native" - // strict = false - self.scope.lexical.setValue(node.catch.parameter, tryCatchValue, false) - - // FIXME node.CatchParameter - // FIXME node.Catch - tryCatchValue, exception = self.tryCatchEvaluate(func() Value { - return self.cmpl_evaluate_nodeStatement(node.catch.body) - }) - } - - if node.finally != nil { - finallyValue := self.cmpl_evaluate_nodeStatement(node.finally) - if finallyValue.kind == valueResult { - return finallyValue - } - } - - if exception { - panic(newException(tryCatchValue)) - } - - return tryCatchValue -} - -func (self *_runtime) cmpl_evaluate_nodeWhileStatement(node *_nodeWhileStatement) Value { - - test := node.test - body := node.body - labels := append(self.labels, "") - self.labels = nil - - result := emptyValue -resultBreakContinue: - for { - if !self.cmpl_evaluate_nodeExpression(test).resolve().bool() { - // Stahp: while (false) ... - break - } - for _, node := range body { - value := self.cmpl_evaluate_nodeStatement(node) - switch value.kind { - case valueResult: - switch value.evaluateBreakContinue(labels) { - case resultReturn: - return value - case resultBreak: - break resultBreakContinue - case resultContinue: - continue resultBreakContinue - } - case valueEmpty: - default: - result = value - } - } - } - return result -} - -func (self *_runtime) cmpl_evaluate_nodeWithStatement(node *_nodeWithStatement) Value { - object := self.cmpl_evaluate_nodeExpression(node.object) - outer := self.scope.lexical - lexical := self.newObjectStash(self.toObject(object.resolve()), outer) - self.scope.lexical = lexical - defer func() { - self.scope.lexical = outer - }() - - return self.cmpl_evaluate_nodeStatement(node.body) -} diff --git a/vendor/github.com/robertkrimen/otto/cmpl_parse.go b/vendor/github.com/robertkrimen/otto/cmpl_parse.go deleted file mode 100644 index dc5baa12a83f..000000000000 --- a/vendor/github.com/robertkrimen/otto/cmpl_parse.go +++ /dev/null @@ -1,656 +0,0 @@ -package otto - -import ( - "fmt" - "regexp" - - "github.com/robertkrimen/otto/ast" - "github.com/robertkrimen/otto/file" - "github.com/robertkrimen/otto/token" -) - -var trueLiteral = &_nodeLiteral{value: toValue_bool(true)} -var falseLiteral = &_nodeLiteral{value: toValue_bool(false)} -var nullLiteral = &_nodeLiteral{value: nullValue} -var emptyStatement = &_nodeEmptyStatement{} - -func (cmpl *_compiler) parseExpression(in ast.Expression) _nodeExpression { - if in == nil { - return nil - } - - switch in := in.(type) { - - case *ast.ArrayLiteral: - out := &_nodeArrayLiteral{ - value: make([]_nodeExpression, len(in.Value)), - } - for i, value := range in.Value { - out.value[i] = cmpl.parseExpression(value) - } - return out - - case *ast.AssignExpression: - return &_nodeAssignExpression{ - operator: in.Operator, - left: cmpl.parseExpression(in.Left), - right: cmpl.parseExpression(in.Right), - } - - case *ast.BinaryExpression: - return &_nodeBinaryExpression{ - operator: in.Operator, - left: cmpl.parseExpression(in.Left), - right: cmpl.parseExpression(in.Right), - comparison: in.Comparison, - } - - case *ast.BooleanLiteral: - if in.Value { - return trueLiteral - } - return falseLiteral - - case *ast.BracketExpression: - return &_nodeBracketExpression{ - idx: in.Left.Idx0(), - left: cmpl.parseExpression(in.Left), - member: cmpl.parseExpression(in.Member), - } - - case *ast.CallExpression: - out := &_nodeCallExpression{ - callee: cmpl.parseExpression(in.Callee), - argumentList: make([]_nodeExpression, len(in.ArgumentList)), - } - for i, value := range in.ArgumentList { - out.argumentList[i] = cmpl.parseExpression(value) - } - return out - - case *ast.ConditionalExpression: - return &_nodeConditionalExpression{ - test: cmpl.parseExpression(in.Test), - consequent: cmpl.parseExpression(in.Consequent), - alternate: cmpl.parseExpression(in.Alternate), - } - - case *ast.DotExpression: - return &_nodeDotExpression{ - idx: in.Left.Idx0(), - left: cmpl.parseExpression(in.Left), - identifier: in.Identifier.Name, - } - - case *ast.EmptyExpression: - return nil - - case *ast.FunctionLiteral: - name := "" - if in.Name != nil { - name = in.Name.Name - } - out := &_nodeFunctionLiteral{ - name: name, - body: cmpl.parseStatement(in.Body), - source: in.Source, - file: cmpl.file, - } - if in.ParameterList != nil { - list := in.ParameterList.List - out.parameterList = make([]string, len(list)) - for i, value := range list { - out.parameterList[i] = value.Name - } - } - for _, value := range in.DeclarationList { - switch value := value.(type) { - case *ast.FunctionDeclaration: - out.functionList = append(out.functionList, cmpl.parseExpression(value.Function).(*_nodeFunctionLiteral)) - case *ast.VariableDeclaration: - for _, value := range value.List { - out.varList = append(out.varList, value.Name) - } - default: - panic(fmt.Errorf("Here be dragons: parseProgram.declaration(%T)", value)) - } - } - return out - - case *ast.Identifier: - return &_nodeIdentifier{ - idx: in.Idx, - name: in.Name, - } - - case *ast.NewExpression: - out := &_nodeNewExpression{ - callee: cmpl.parseExpression(in.Callee), - argumentList: make([]_nodeExpression, len(in.ArgumentList)), - } - for i, value := range in.ArgumentList { - out.argumentList[i] = cmpl.parseExpression(value) - } - return out - - case *ast.NullLiteral: - return nullLiteral - - case *ast.NumberLiteral: - return &_nodeLiteral{ - value: toValue(in.Value), - } - - case *ast.ObjectLiteral: - out := &_nodeObjectLiteral{ - value: make([]_nodeProperty, len(in.Value)), - } - for i, value := range in.Value { - out.value[i] = _nodeProperty{ - key: value.Key, - kind: value.Kind, - value: cmpl.parseExpression(value.Value), - } - } - return out - - case *ast.RegExpLiteral: - return &_nodeRegExpLiteral{ - flags: in.Flags, - pattern: in.Pattern, - } - - case *ast.SequenceExpression: - out := &_nodeSequenceExpression{ - sequence: make([]_nodeExpression, len(in.Sequence)), - } - for i, value := range in.Sequence { - out.sequence[i] = cmpl.parseExpression(value) - } - return out - - case *ast.StringLiteral: - return &_nodeLiteral{ - value: toValue_string(in.Value), - } - - case *ast.ThisExpression: - return &_nodeThisExpression{} - - case *ast.UnaryExpression: - return &_nodeUnaryExpression{ - operator: in.Operator, - operand: cmpl.parseExpression(in.Operand), - postfix: in.Postfix, - } - - case *ast.VariableExpression: - return &_nodeVariableExpression{ - idx: in.Idx0(), - name: in.Name, - initializer: cmpl.parseExpression(in.Initializer), - } - - } - - panic(fmt.Errorf("Here be dragons: cmpl.parseExpression(%T)", in)) -} - -func (cmpl *_compiler) parseStatement(in ast.Statement) _nodeStatement { - if in == nil { - return nil - } - - switch in := in.(type) { - - case *ast.BlockStatement: - out := &_nodeBlockStatement{ - list: make([]_nodeStatement, len(in.List)), - } - for i, value := range in.List { - out.list[i] = cmpl.parseStatement(value) - } - return out - - case *ast.BranchStatement: - out := &_nodeBranchStatement{ - branch: in.Token, - } - if in.Label != nil { - out.label = in.Label.Name - } - return out - - case *ast.DebuggerStatement: - return &_nodeDebuggerStatement{} - - case *ast.DoWhileStatement: - out := &_nodeDoWhileStatement{ - test: cmpl.parseExpression(in.Test), - } - body := cmpl.parseStatement(in.Body) - if block, ok := body.(*_nodeBlockStatement); ok { - out.body = block.list - } else { - out.body = append(out.body, body) - } - return out - - case *ast.EmptyStatement: - return emptyStatement - - case *ast.ExpressionStatement: - return &_nodeExpressionStatement{ - expression: cmpl.parseExpression(in.Expression), - } - - case *ast.ForInStatement: - out := &_nodeForInStatement{ - into: cmpl.parseExpression(in.Into), - source: cmpl.parseExpression(in.Source), - } - body := cmpl.parseStatement(in.Body) - if block, ok := body.(*_nodeBlockStatement); ok { - out.body = block.list - } else { - out.body = append(out.body, body) - } - return out - - case *ast.ForStatement: - out := &_nodeForStatement{ - initializer: cmpl.parseExpression(in.Initializer), - update: cmpl.parseExpression(in.Update), - test: cmpl.parseExpression(in.Test), - } - body := cmpl.parseStatement(in.Body) - if block, ok := body.(*_nodeBlockStatement); ok { - out.body = block.list - } else { - out.body = append(out.body, body) - } - return out - - case *ast.FunctionStatement: - return emptyStatement - - case *ast.IfStatement: - return &_nodeIfStatement{ - test: cmpl.parseExpression(in.Test), - consequent: cmpl.parseStatement(in.Consequent), - alternate: cmpl.parseStatement(in.Alternate), - } - - case *ast.LabelledStatement: - return &_nodeLabelledStatement{ - label: in.Label.Name, - statement: cmpl.parseStatement(in.Statement), - } - - case *ast.ReturnStatement: - return &_nodeReturnStatement{ - argument: cmpl.parseExpression(in.Argument), - } - - case *ast.SwitchStatement: - out := &_nodeSwitchStatement{ - discriminant: cmpl.parseExpression(in.Discriminant), - default_: in.Default, - body: make([]*_nodeCaseStatement, len(in.Body)), - } - for i, clause := range in.Body { - out.body[i] = &_nodeCaseStatement{ - test: cmpl.parseExpression(clause.Test), - consequent: make([]_nodeStatement, len(clause.Consequent)), - } - for j, value := range clause.Consequent { - out.body[i].consequent[j] = cmpl.parseStatement(value) - } - } - return out - - case *ast.ThrowStatement: - return &_nodeThrowStatement{ - argument: cmpl.parseExpression(in.Argument), - } - - case *ast.TryStatement: - out := &_nodeTryStatement{ - body: cmpl.parseStatement(in.Body), - finally: cmpl.parseStatement(in.Finally), - } - if in.Catch != nil { - out.catch = &_nodeCatchStatement{ - parameter: in.Catch.Parameter.Name, - body: cmpl.parseStatement(in.Catch.Body), - } - } - return out - - case *ast.VariableStatement: - out := &_nodeVariableStatement{ - list: make([]_nodeExpression, len(in.List)), - } - for i, value := range in.List { - out.list[i] = cmpl.parseExpression(value) - } - return out - - case *ast.WhileStatement: - out := &_nodeWhileStatement{ - test: cmpl.parseExpression(in.Test), - } - body := cmpl.parseStatement(in.Body) - if block, ok := body.(*_nodeBlockStatement); ok { - out.body = block.list - } else { - out.body = append(out.body, body) - } - return out - - case *ast.WithStatement: - return &_nodeWithStatement{ - object: cmpl.parseExpression(in.Object), - body: cmpl.parseStatement(in.Body), - } - - } - - panic(fmt.Errorf("Here be dragons: cmpl.parseStatement(%T)", in)) -} - -func cmpl_parse(in *ast.Program) *_nodeProgram { - cmpl := _compiler{ - program: in, - } - return cmpl.parse() -} - -func (cmpl *_compiler) _parse(in *ast.Program) *_nodeProgram { - out := &_nodeProgram{ - body: make([]_nodeStatement, len(in.Body)), - file: in.File, - } - for i, value := range in.Body { - out.body[i] = cmpl.parseStatement(value) - } - for _, value := range in.DeclarationList { - switch value := value.(type) { - case *ast.FunctionDeclaration: - out.functionList = append(out.functionList, cmpl.parseExpression(value.Function).(*_nodeFunctionLiteral)) - case *ast.VariableDeclaration: - for _, value := range value.List { - out.varList = append(out.varList, value.Name) - } - default: - panic(fmt.Errorf("Here be dragons: cmpl.parseProgram.DeclarationList(%T)", value)) - } - } - return out -} - -type _nodeProgram struct { - body []_nodeStatement - - varList []string - functionList []*_nodeFunctionLiteral - - variableList []_nodeDeclaration - - file *file.File -} - -type _nodeDeclaration struct { - name string - definition _node -} - -type _node interface { -} - -type ( - _nodeExpression interface { - _node - _expressionNode() - } - - _nodeArrayLiteral struct { - value []_nodeExpression - } - - _nodeAssignExpression struct { - operator token.Token - left _nodeExpression - right _nodeExpression - } - - _nodeBinaryExpression struct { - operator token.Token - left _nodeExpression - right _nodeExpression - comparison bool - } - - _nodeBracketExpression struct { - idx file.Idx - left _nodeExpression - member _nodeExpression - } - - _nodeCallExpression struct { - callee _nodeExpression - argumentList []_nodeExpression - } - - _nodeConditionalExpression struct { - test _nodeExpression - consequent _nodeExpression - alternate _nodeExpression - } - - _nodeDotExpression struct { - idx file.Idx - left _nodeExpression - identifier string - } - - _nodeFunctionLiteral struct { - name string - body _nodeStatement - source string - parameterList []string - varList []string - functionList []*_nodeFunctionLiteral - file *file.File - } - - _nodeIdentifier struct { - idx file.Idx - name string - } - - _nodeLiteral struct { - value Value - } - - _nodeNewExpression struct { - callee _nodeExpression - argumentList []_nodeExpression - } - - _nodeObjectLiteral struct { - value []_nodeProperty - } - - _nodeProperty struct { - key string - kind string - value _nodeExpression - } - - _nodeRegExpLiteral struct { - flags string - pattern string // Value? - regexp *regexp.Regexp - } - - _nodeSequenceExpression struct { - sequence []_nodeExpression - } - - _nodeThisExpression struct { - } - - _nodeUnaryExpression struct { - operator token.Token - operand _nodeExpression - postfix bool - } - - _nodeVariableExpression struct { - idx file.Idx - name string - initializer _nodeExpression - } -) - -type ( - _nodeStatement interface { - _node - _statementNode() - } - - _nodeBlockStatement struct { - list []_nodeStatement - } - - _nodeBranchStatement struct { - branch token.Token - label string - } - - _nodeCaseStatement struct { - test _nodeExpression - consequent []_nodeStatement - } - - _nodeCatchStatement struct { - parameter string - body _nodeStatement - } - - _nodeDebuggerStatement struct { - } - - _nodeDoWhileStatement struct { - test _nodeExpression - body []_nodeStatement - } - - _nodeEmptyStatement struct { - } - - _nodeExpressionStatement struct { - expression _nodeExpression - } - - _nodeForInStatement struct { - into _nodeExpression - source _nodeExpression - body []_nodeStatement - } - - _nodeForStatement struct { - initializer _nodeExpression - update _nodeExpression - test _nodeExpression - body []_nodeStatement - } - - _nodeIfStatement struct { - test _nodeExpression - consequent _nodeStatement - alternate _nodeStatement - } - - _nodeLabelledStatement struct { - label string - statement _nodeStatement - } - - _nodeReturnStatement struct { - argument _nodeExpression - } - - _nodeSwitchStatement struct { - discriminant _nodeExpression - default_ int - body []*_nodeCaseStatement - } - - _nodeThrowStatement struct { - argument _nodeExpression - } - - _nodeTryStatement struct { - body _nodeStatement - catch *_nodeCatchStatement - finally _nodeStatement - } - - _nodeVariableStatement struct { - list []_nodeExpression - } - - _nodeWhileStatement struct { - test _nodeExpression - body []_nodeStatement - } - - _nodeWithStatement struct { - object _nodeExpression - body _nodeStatement - } -) - -// _expressionNode - -func (*_nodeArrayLiteral) _expressionNode() {} -func (*_nodeAssignExpression) _expressionNode() {} -func (*_nodeBinaryExpression) _expressionNode() {} -func (*_nodeBracketExpression) _expressionNode() {} -func (*_nodeCallExpression) _expressionNode() {} -func (*_nodeConditionalExpression) _expressionNode() {} -func (*_nodeDotExpression) _expressionNode() {} -func (*_nodeFunctionLiteral) _expressionNode() {} -func (*_nodeIdentifier) _expressionNode() {} -func (*_nodeLiteral) _expressionNode() {} -func (*_nodeNewExpression) _expressionNode() {} -func (*_nodeObjectLiteral) _expressionNode() {} -func (*_nodeRegExpLiteral) _expressionNode() {} -func (*_nodeSequenceExpression) _expressionNode() {} -func (*_nodeThisExpression) _expressionNode() {} -func (*_nodeUnaryExpression) _expressionNode() {} -func (*_nodeVariableExpression) _expressionNode() {} - -// _statementNode - -func (*_nodeBlockStatement) _statementNode() {} -func (*_nodeBranchStatement) _statementNode() {} -func (*_nodeCaseStatement) _statementNode() {} -func (*_nodeCatchStatement) _statementNode() {} -func (*_nodeDebuggerStatement) _statementNode() {} -func (*_nodeDoWhileStatement) _statementNode() {} -func (*_nodeEmptyStatement) _statementNode() {} -func (*_nodeExpressionStatement) _statementNode() {} -func (*_nodeForInStatement) _statementNode() {} -func (*_nodeForStatement) _statementNode() {} -func (*_nodeIfStatement) _statementNode() {} -func (*_nodeLabelledStatement) _statementNode() {} -func (*_nodeReturnStatement) _statementNode() {} -func (*_nodeSwitchStatement) _statementNode() {} -func (*_nodeThrowStatement) _statementNode() {} -func (*_nodeTryStatement) _statementNode() {} -func (*_nodeVariableStatement) _statementNode() {} -func (*_nodeWhileStatement) _statementNode() {} -func (*_nodeWithStatement) _statementNode() {} diff --git a/vendor/github.com/robertkrimen/otto/console.go b/vendor/github.com/robertkrimen/otto/console.go deleted file mode 100644 index 948face77533..000000000000 --- a/vendor/github.com/robertkrimen/otto/console.go +++ /dev/null @@ -1,51 +0,0 @@ -package otto - -import ( - "fmt" - "os" - "strings" -) - -func formatForConsole(argumentList []Value) string { - output := []string{} - for _, argument := range argumentList { - output = append(output, fmt.Sprintf("%v", argument)) - } - return strings.Join(output, " ") -} - -func builtinConsole_log(call FunctionCall) Value { - fmt.Fprintln(os.Stdout, formatForConsole(call.ArgumentList)) - return Value{} -} - -func builtinConsole_error(call FunctionCall) Value { - fmt.Fprintln(os.Stdout, formatForConsole(call.ArgumentList)) - return Value{} -} - -// Nothing happens. -func builtinConsole_dir(call FunctionCall) Value { - return Value{} -} - -func builtinConsole_time(call FunctionCall) Value { - return Value{} -} - -func builtinConsole_timeEnd(call FunctionCall) Value { - return Value{} -} - -func builtinConsole_trace(call FunctionCall) Value { - return Value{} -} - -func builtinConsole_assert(call FunctionCall) Value { - return Value{} -} - -func (runtime *_runtime) newConsole() *_object { - - return newConsoleObject(runtime) -} diff --git a/vendor/github.com/robertkrimen/otto/dbg.go b/vendor/github.com/robertkrimen/otto/dbg.go deleted file mode 100644 index 51fbdc2063d4..000000000000 --- a/vendor/github.com/robertkrimen/otto/dbg.go +++ /dev/null @@ -1,9 +0,0 @@ -// This file was AUTOMATICALLY GENERATED by dbg-import (smuggol) for github.com/robertkrimen/dbg - -package otto - -import ( - Dbg "github.com/robertkrimen/otto/dbg" -) - -var dbg, dbgf = Dbg.New() diff --git a/vendor/github.com/robertkrimen/otto/dbg/dbg.go b/vendor/github.com/robertkrimen/otto/dbg/dbg.go deleted file mode 100644 index 8c27fa293ec8..000000000000 --- a/vendor/github.com/robertkrimen/otto/dbg/dbg.go +++ /dev/null @@ -1,387 +0,0 @@ -// This file was AUTOMATICALLY GENERATED by dbg-import (smuggol) from github.com/robertkrimen/dbg - -/* -Package dbg is a println/printf/log-debugging utility library. - - import ( - Dbg "github.com/robertkrimen/dbg" - ) - - dbg, dbgf := Dbg.New() - - dbg("Emit some debug stuff", []byte{120, 121, 122, 122, 121}, math.Pi) - # "2013/01/28 16:50:03 Emit some debug stuff [120 121 122 122 121] 3.141592653589793" - - dbgf("With a %s formatting %.2f", "little", math.Pi) - # "2013/01/28 16:51:55 With a little formatting (3.14)" - - dbgf("%/fatal//A fatal debug statement: should not be here") - # "A fatal debug statement: should not be here" - # ...and then, os.Exit(1) - - dbgf("%/panic//Can also panic %s", "this") - # "Can also panic this" - # ...as a panic, equivalent to: panic("Can also panic this") - - dbgf("Any %s arguments without a corresponding %%", "extra", "are treated like arguments to dbg()") - # "2013/01/28 17:14:40 Any extra arguments (without a corresponding %) are treated like arguments to dbg()" - - dbgf("%d %d", 1, 2, 3, 4, 5) - # "2013/01/28 17:16:32 Another example: 1 2 3 4 5" - - dbgf("%@: Include the function name for a little context (via %s)", "%@") - # "2013... github.com/robertkrimen/dbg.TestSynopsis: Include the function name for a little context (via %@)" - -By default, dbg uses log (log.Println, log.Printf, log.Panic, etc.) for output. -However, you can also provide your own output destination by invoking dbg.New with -a customization function: - - import ( - "bytes" - Dbg "github.com/robertkrimen/dbg" - "os" - ) - - # dbg to os.Stderr - dbg, dbgf := Dbg.New(func(dbgr *Dbgr) { - dbgr.SetOutput(os.Stderr) - }) - - # A slightly contrived example: - var buffer bytes.Buffer - dbg, dbgf := New(func(dbgr *Dbgr) { - dbgr.SetOutput(&buffer) - }) - -*/ -package dbg - -import ( - "bytes" - "fmt" - "io" - "log" - "os" - "regexp" - "runtime" - "strings" - "unicode" -) - -type _frmt struct { - ctl string - format string - operandCount int - panic bool - fatal bool - check bool -} - -var ( - ctlTest = regexp.MustCompile(`^\s*%/`) - ctlScan = regexp.MustCompile(`%?/(panic|fatal|check)(?:\s|$)`) -) - -func operandCount(format string) int { - count := 0 - end := len(format) - for at := 0; at < end; { - for at < end && format[at] != '%' { - at++ - } - at++ - if at < end { - if format[at] != '%' && format[at] != '@' { - count++ - } - at++ - } - } - return count -} - -func parseFormat(format string) (frmt _frmt) { - if ctlTest.MatchString(format) { - format = strings.TrimLeftFunc(format, unicode.IsSpace) - index := strings.Index(format, "//") - if index != -1 { - frmt.ctl = format[0:index] - format = format[index+2:] // Skip the second slash via +2 (instead of +1) - } else { - frmt.ctl = format - format = "" - } - for _, tmp := range ctlScan.FindAllStringSubmatch(frmt.ctl, -1) { - for _, value := range tmp[1:] { - switch value { - case "panic": - frmt.panic = true - case "fatal": - frmt.fatal = true - case "check": - frmt.check = true - } - } - } - } - frmt.format = format - frmt.operandCount = operandCount(format) - return -} - -type Dbgr struct { - emit _emit -} - -type DbgFunction func(values ...interface{}) - -func NewDbgr() *Dbgr { - self := &Dbgr{} - return self -} - -/* -New will create and return a pair of debugging functions. You can customize where -they output to by passing in an (optional) customization function: - - import ( - Dbg "github.com/robertkrimen/dbg" - "os" - ) - - # dbg to os.Stderr - dbg, dbgf := Dbg.New(func(dbgr *Dbgr) { - dbgr.SetOutput(os.Stderr) - }) - -*/ -func New(options ...interface{}) (dbg DbgFunction, dbgf DbgFunction) { - dbgr := NewDbgr() - if len(options) > 0 { - if fn, ok := options[0].(func(*Dbgr)); ok { - fn(dbgr) - } - } - return dbgr.DbgDbgf() -} - -func (self Dbgr) Dbg(values ...interface{}) { - self.getEmit().emit(_frmt{}, "", values...) -} - -func (self Dbgr) Dbgf(values ...interface{}) { - self.dbgf(values...) -} - -func (self Dbgr) DbgDbgf() (dbg DbgFunction, dbgf DbgFunction) { - dbg = func(vl ...interface{}) { - self.Dbg(vl...) - } - dbgf = func(vl ...interface{}) { - self.dbgf(vl...) - } - return dbg, dbgf // Redundant, but... -} - -func (self Dbgr) dbgf(values ...interface{}) { - - var frmt _frmt - if len(values) > 0 { - tmp := fmt.Sprint(values[0]) - frmt = parseFormat(tmp) - values = values[1:] - } - - buffer_f := bytes.Buffer{} - format := frmt.format - end := len(format) - for at := 0; at < end; { - last := at - for at < end && format[at] != '%' { - at++ - } - if at > last { - buffer_f.WriteString(format[last:at]) - } - if at >= end { - break - } - // format[at] == '%' - at++ - // format[at] == ? - if format[at] == '@' { - depth := 2 - pc, _, _, _ := runtime.Caller(depth) - name := runtime.FuncForPC(pc).Name() - buffer_f.WriteString(name) - } else { - buffer_f.WriteString(format[at-1 : at+1]) - } - at++ - } - - //values_f := append([]interface{}{}, values[0:frmt.operandCount]...) - values_f := values[0:frmt.operandCount] - values_dbg := values[frmt.operandCount:] - if len(values_dbg) > 0 { - // Adjust frmt.format: - // (%v instead of %s because: frmt.check) - { - tmp := format - if len(tmp) > 0 { - if unicode.IsSpace(rune(tmp[len(tmp)-1])) { - buffer_f.WriteString("%v") - } else { - buffer_f.WriteString(" %v") - } - } else if frmt.check { - // Performing a check, so no output - } else { - buffer_f.WriteString("%v") - } - } - - // Adjust values_f: - if !frmt.check { - tmp := []string{} - for _, value := range values_dbg { - tmp = append(tmp, fmt.Sprintf("%v", value)) - } - // First, make a copy of values_f, so we avoid overwriting values_dbg when appending - values_f = append([]interface{}{}, values_f...) - values_f = append(values_f, strings.Join(tmp, " ")) - } - } - - format = buffer_f.String() - if frmt.check { - // We do not actually emit to the log, but panic if - // a non-nil value is detected (e.g. a non-nil error) - for _, value := range values_dbg { - if value != nil { - if format == "" { - panic(value) - } else { - panic(fmt.Sprintf(format, append(values_f, value)...)) - } - } - } - } else { - self.getEmit().emit(frmt, format, values_f...) - } -} - -// Idiot-proof &Dbgr{}, etc. -func (self *Dbgr) getEmit() _emit { - if self.emit == nil { - self.emit = standardEmit() - } - return self.emit -} - -// SetOutput will accept the following as a destination for output: -// -// *log.Logger Print*/Panic*/Fatal* of the logger -// io.Writer - -// nil Reset to the default output (os.Stderr) -// "log" Print*/Panic*/Fatal* via the "log" package -// -func (self *Dbgr) SetOutput(output interface{}) { - if output == nil { - self.emit = standardEmit() - return - } - switch output := output.(type) { - case *log.Logger: - self.emit = _emitLogger{ - logger: output, - } - return - case io.Writer: - self.emit = _emitWriter{ - writer: output, - } - return - case string: - if output == "log" { - self.emit = _emitLog{} - return - } - } - panic(output) -} - -// ======== // -// = emit = // -// ======== // - -func standardEmit() _emit { - return _emitWriter{ - writer: os.Stderr, - } -} - -func ln(tmp string) string { - length := len(tmp) - if length > 0 && tmp[length-1] != '\n' { - return tmp + "\n" - } - return tmp -} - -type _emit interface { - emit(_frmt, string, ...interface{}) -} - -type _emitWriter struct { - writer io.Writer -} - -func (self _emitWriter) emit(frmt _frmt, format string, values ...interface{}) { - if format == "" { - fmt.Fprintln(self.writer, values...) - } else { - if frmt.panic { - panic(fmt.Sprintf(format, values...)) - } - fmt.Fprintf(self.writer, ln(format), values...) - if frmt.fatal { - os.Exit(1) - } - } -} - -type _emitLogger struct { - logger *log.Logger -} - -func (self _emitLogger) emit(frmt _frmt, format string, values ...interface{}) { - if format == "" { - self.logger.Println(values...) - } else { - if frmt.panic { - self.logger.Panicf(format, values...) - } else if frmt.fatal { - self.logger.Fatalf(format, values...) - } else { - self.logger.Printf(format, values...) - } - } -} - -type _emitLog struct { -} - -func (self _emitLog) emit(frmt _frmt, format string, values ...interface{}) { - if format == "" { - log.Println(values...) - } else { - if frmt.panic { - log.Panicf(format, values...) - } else if frmt.fatal { - log.Fatalf(format, values...) - } else { - log.Printf(format, values...) - } - } -} diff --git a/vendor/github.com/robertkrimen/otto/error.go b/vendor/github.com/robertkrimen/otto/error.go deleted file mode 100644 index 41a5c10e7c12..000000000000 --- a/vendor/github.com/robertkrimen/otto/error.go +++ /dev/null @@ -1,252 +0,0 @@ -package otto - -import ( - "errors" - "fmt" - - "github.com/robertkrimen/otto/file" -) - -type _exception struct { - value interface{} -} - -func newException(value interface{}) *_exception { - return &_exception{ - value: value, - } -} - -func (self *_exception) eject() interface{} { - value := self.value - self.value = nil // Prevent Go from holding on to the value, whatever it is - return value -} - -type _error struct { - name string - message string - trace []_frame - - offset int -} - -func (err _error) format() string { - if len(err.name) == 0 { - return err.message - } - if len(err.message) == 0 { - return err.name - } - return fmt.Sprintf("%s: %s", err.name, err.message) -} - -func (err _error) formatWithStack() string { - str := err.format() + "\n" - for _, frame := range err.trace { - str += " at " + frame.location() + "\n" - } - return str -} - -type _frame struct { - native bool - nativeFile string - nativeLine int - file *file.File - offset int - callee string -} - -var ( - nativeFrame = _frame{} -) - -type _at int - -func (fr _frame) location() string { - str := "" - - switch { - case fr.native: - str = "" - if fr.nativeFile != "" && fr.nativeLine != 0 { - str = fmt.Sprintf("%s:%d", fr.nativeFile, fr.nativeLine) - } - case fr.file != nil: - if p := fr.file.Position(file.Idx(fr.offset)); p != nil { - path, line, column := p.Filename, p.Line, p.Column - - if path == "" { - path = "" - } - - str = fmt.Sprintf("%s:%d:%d", path, line, column) - } - } - - if fr.callee != "" { - str = fmt.Sprintf("%s (%s)", fr.callee, str) - } - - return str -} - -// An Error represents a runtime error, e.g. a TypeError, a ReferenceError, etc. -type Error struct { - _error -} - -// Error returns a description of the error -// -// TypeError: 'def' is not a function -// -func (err Error) Error() string { - return err.format() -} - -// String returns a description of the error and a trace of where the -// error occurred. -// -// TypeError: 'def' is not a function -// at xyz (:3:9) -// at :7:1/ -// -func (err Error) String() string { - return err.formatWithStack() -} - -func (err _error) describe(format string, in ...interface{}) string { - return fmt.Sprintf(format, in...) -} - -func (self _error) messageValue() Value { - if self.message == "" { - return Value{} - } - return toValue_string(self.message) -} - -func (rt *_runtime) typeErrorResult(throw bool) bool { - if throw { - panic(rt.panicTypeError()) - } - return false -} - -func newError(rt *_runtime, name string, stackFramesToPop int, in ...interface{}) _error { - err := _error{ - name: name, - offset: -1, - } - description := "" - length := len(in) - - if rt != nil && rt.scope != nil { - scope := rt.scope - - for i := 0; i < stackFramesToPop; i++ { - if scope.outer != nil { - scope = scope.outer - } - } - - frame := scope.frame - - if length > 0 { - if at, ok := in[length-1].(_at); ok { - in = in[0 : length-1] - if scope != nil { - frame.offset = int(at) - } - length-- - } - if length > 0 { - description, in = in[0].(string), in[1:] - } - } - - limit := rt.traceLimit - - err.trace = append(err.trace, frame) - if scope != nil { - for scope = scope.outer; scope != nil; scope = scope.outer { - if limit--; limit == 0 { - break - } - - if scope.frame.offset >= 0 { - err.trace = append(err.trace, scope.frame) - } - } - } - } else { - if length > 0 { - description, in = in[0].(string), in[1:] - } - } - err.message = err.describe(description, in...) - - return err -} - -func (rt *_runtime) panicTypeError(argumentList ...interface{}) *_exception { - return &_exception{ - value: newError(rt, "TypeError", 0, argumentList...), - } -} - -func (rt *_runtime) panicReferenceError(argumentList ...interface{}) *_exception { - return &_exception{ - value: newError(rt, "ReferenceError", 0, argumentList...), - } -} - -func (rt *_runtime) panicURIError(argumentList ...interface{}) *_exception { - return &_exception{ - value: newError(rt, "URIError", 0, argumentList...), - } -} - -func (rt *_runtime) panicSyntaxError(argumentList ...interface{}) *_exception { - return &_exception{ - value: newError(rt, "SyntaxError", 0, argumentList...), - } -} - -func (rt *_runtime) panicRangeError(argumentList ...interface{}) *_exception { - return &_exception{ - value: newError(rt, "RangeError", 0, argumentList...), - } -} - -func catchPanic(function func()) (err error) { - defer func() { - if caught := recover(); caught != nil { - if exception, ok := caught.(*_exception); ok { - caught = exception.eject() - } - switch caught := caught.(type) { - case *Error: - err = caught - return - case _error: - err = &Error{caught} - return - case Value: - if vl := caught._object(); vl != nil { - switch vl := vl.value.(type) { - case _error: - err = &Error{vl} - return - } - } - err = errors.New(caught.string()) - return - } - panic(caught) - } - }() - function() - return nil -} diff --git a/vendor/github.com/robertkrimen/otto/evaluate.go b/vendor/github.com/robertkrimen/otto/evaluate.go deleted file mode 100644 index 093054cc31f6..000000000000 --- a/vendor/github.com/robertkrimen/otto/evaluate.go +++ /dev/null @@ -1,318 +0,0 @@ -package otto - -import ( - "fmt" - "math" - "strings" - - "github.com/robertkrimen/otto/token" -) - -func (self *_runtime) evaluateMultiply(left float64, right float64) Value { - // TODO 11.5.1 - return Value{} -} - -func (self *_runtime) evaluateDivide(left float64, right float64) Value { - if math.IsNaN(left) || math.IsNaN(right) { - return NaNValue() - } - if math.IsInf(left, 0) && math.IsInf(right, 0) { - return NaNValue() - } - if left == 0 && right == 0 { - return NaNValue() - } - if math.IsInf(left, 0) { - if math.Signbit(left) == math.Signbit(right) { - return positiveInfinityValue() - } else { - return negativeInfinityValue() - } - } - if math.IsInf(right, 0) { - if math.Signbit(left) == math.Signbit(right) { - return positiveZeroValue() - } else { - return negativeZeroValue() - } - } - if right == 0 { - if math.Signbit(left) == math.Signbit(right) { - return positiveInfinityValue() - } else { - return negativeInfinityValue() - } - } - return toValue_float64(left / right) -} - -func (self *_runtime) evaluateModulo(left float64, right float64) Value { - // TODO 11.5.3 - return Value{} -} - -func (self *_runtime) calculateBinaryExpression(operator token.Token, left Value, right Value) Value { - - leftValue := left.resolve() - - switch operator { - - // Additive - case token.PLUS: - leftValue = toPrimitive(leftValue) - rightValue := right.resolve() - rightValue = toPrimitive(rightValue) - - if leftValue.IsString() || rightValue.IsString() { - return toValue_string(strings.Join([]string{leftValue.string(), rightValue.string()}, "")) - } else { - return toValue_float64(leftValue.float64() + rightValue.float64()) - } - case token.MINUS: - rightValue := right.resolve() - return toValue_float64(leftValue.float64() - rightValue.float64()) - - // Multiplicative - case token.MULTIPLY: - rightValue := right.resolve() - return toValue_float64(leftValue.float64() * rightValue.float64()) - case token.SLASH: - rightValue := right.resolve() - return self.evaluateDivide(leftValue.float64(), rightValue.float64()) - case token.REMAINDER: - rightValue := right.resolve() - return toValue_float64(math.Mod(leftValue.float64(), rightValue.float64())) - - // Logical - case token.LOGICAL_AND: - left := leftValue.bool() - if !left { - return falseValue - } - return toValue_bool(right.resolve().bool()) - case token.LOGICAL_OR: - left := leftValue.bool() - if left { - return trueValue - } - return toValue_bool(right.resolve().bool()) - - // Bitwise - case token.AND: - rightValue := right.resolve() - return toValue_int32(toInt32(leftValue) & toInt32(rightValue)) - case token.OR: - rightValue := right.resolve() - return toValue_int32(toInt32(leftValue) | toInt32(rightValue)) - case token.EXCLUSIVE_OR: - rightValue := right.resolve() - return toValue_int32(toInt32(leftValue) ^ toInt32(rightValue)) - - // Shift - // (Masking of 0x1f is to restrict the shift to a maximum of 31 places) - case token.SHIFT_LEFT: - rightValue := right.resolve() - return toValue_int32(toInt32(leftValue) << (toUint32(rightValue) & 0x1f)) - case token.SHIFT_RIGHT: - rightValue := right.resolve() - return toValue_int32(toInt32(leftValue) >> (toUint32(rightValue) & 0x1f)) - case token.UNSIGNED_SHIFT_RIGHT: - rightValue := right.resolve() - // Shifting an unsigned integer is a logical shift - return toValue_uint32(toUint32(leftValue) >> (toUint32(rightValue) & 0x1f)) - - case token.INSTANCEOF: - rightValue := right.resolve() - if !rightValue.IsObject() { - panic(self.panicTypeError("Expecting a function in instanceof check, but got: %v", rightValue)) - } - return toValue_bool(rightValue._object().hasInstance(leftValue)) - - case token.IN: - rightValue := right.resolve() - if !rightValue.IsObject() { - panic(self.panicTypeError()) - } - return toValue_bool(rightValue._object().hasProperty(leftValue.string())) - } - - panic(hereBeDragons(operator)) -} - -func valueKindDispatchKey(left _valueKind, right _valueKind) int { - return (int(left) << 2) + int(right) -} - -var equalDispatch map[int](func(Value, Value) bool) = makeEqualDispatch() - -func makeEqualDispatch() map[int](func(Value, Value) bool) { - key := valueKindDispatchKey - return map[int](func(Value, Value) bool){ - - key(valueNumber, valueObject): func(x Value, y Value) bool { return x.float64() == y.float64() }, - key(valueString, valueObject): func(x Value, y Value) bool { return x.float64() == y.float64() }, - key(valueObject, valueNumber): func(x Value, y Value) bool { return x.float64() == y.float64() }, - key(valueObject, valueString): func(x Value, y Value) bool { return x.float64() == y.float64() }, - } -} - -type _lessThanResult int - -const ( - lessThanFalse _lessThanResult = iota - lessThanTrue - lessThanUndefined -) - -func calculateLessThan(left Value, right Value, leftFirst bool) _lessThanResult { - - x := Value{} - y := x - - if leftFirst { - x = toNumberPrimitive(left) - y = toNumberPrimitive(right) - } else { - y = toNumberPrimitive(right) - x = toNumberPrimitive(left) - } - - result := false - if x.kind != valueString || y.kind != valueString { - x, y := x.float64(), y.float64() - if math.IsNaN(x) || math.IsNaN(y) { - return lessThanUndefined - } - result = x < y - } else { - x, y := x.string(), y.string() - result = x < y - } - - if result { - return lessThanTrue - } - - return lessThanFalse -} - -// FIXME Probably a map is not the most efficient way to do this -var lessThanTable [4](map[_lessThanResult]bool) = [4](map[_lessThanResult]bool){ - // < - map[_lessThanResult]bool{ - lessThanFalse: false, - lessThanTrue: true, - lessThanUndefined: false, - }, - - // > - map[_lessThanResult]bool{ - lessThanFalse: false, - lessThanTrue: true, - lessThanUndefined: false, - }, - - // <= - map[_lessThanResult]bool{ - lessThanFalse: true, - lessThanTrue: false, - lessThanUndefined: false, - }, - - // >= - map[_lessThanResult]bool{ - lessThanFalse: true, - lessThanTrue: false, - lessThanUndefined: false, - }, -} - -func (self *_runtime) calculateComparison(comparator token.Token, left Value, right Value) bool { - - // FIXME Use strictEqualityComparison? - // TODO This might be redundant now (with regards to evaluateComparison) - x := left.resolve() - y := right.resolve() - - kindEqualKind := false - result := true - negate := false - - switch comparator { - case token.LESS: - result = lessThanTable[0][calculateLessThan(x, y, true)] - case token.GREATER: - result = lessThanTable[1][calculateLessThan(y, x, false)] - case token.LESS_OR_EQUAL: - result = lessThanTable[2][calculateLessThan(y, x, false)] - case token.GREATER_OR_EQUAL: - result = lessThanTable[3][calculateLessThan(x, y, true)] - case token.STRICT_NOT_EQUAL: - negate = true - fallthrough - case token.STRICT_EQUAL: - if x.kind != y.kind { - result = false - } else { - kindEqualKind = true - } - case token.NOT_EQUAL: - negate = true - fallthrough - case token.EQUAL: - if x.kind == y.kind { - kindEqualKind = true - } else if x.kind <= valueNull && y.kind <= valueNull { - result = true - } else if x.kind <= valueNull || y.kind <= valueNull { - result = false - } else if x.kind <= valueString && y.kind <= valueString { - result = x.float64() == y.float64() - } else if x.kind == valueBoolean { - result = self.calculateComparison(token.EQUAL, toValue_float64(x.float64()), y) - } else if y.kind == valueBoolean { - result = self.calculateComparison(token.EQUAL, x, toValue_float64(y.float64())) - } else if x.kind == valueObject { - result = self.calculateComparison(token.EQUAL, toPrimitive(x), y) - } else if y.kind == valueObject { - result = self.calculateComparison(token.EQUAL, x, toPrimitive(y)) - } else { - panic(hereBeDragons("Unable to test for equality: %v ==? %v", x, y)) - } - default: - panic(fmt.Errorf("Unknown comparator %s", comparator.String())) - } - - if kindEqualKind { - switch x.kind { - case valueUndefined, valueNull: - result = true - case valueNumber: - x := x.float64() - y := y.float64() - if math.IsNaN(x) || math.IsNaN(y) { - result = false - } else { - result = x == y - } - case valueString: - result = x.string() == y.string() - case valueBoolean: - result = x.bool() == y.bool() - case valueObject: - result = x._object() == y._object() - default: - goto ERROR - } - } - - if negate { - result = !result - } - - return result - -ERROR: - panic(hereBeDragons("%v (%v) %s %v (%v)", x, x.kind, comparator, y, y.kind)) -} diff --git a/vendor/github.com/robertkrimen/otto/file/README.markdown b/vendor/github.com/robertkrimen/otto/file/README.markdown deleted file mode 100644 index 79757baa8e5d..000000000000 --- a/vendor/github.com/robertkrimen/otto/file/README.markdown +++ /dev/null @@ -1,110 +0,0 @@ -# file --- - import "github.com/robertkrimen/otto/file" - -Package file encapsulates the file abstractions used by the ast & parser. - -## Usage - -#### type File - -```go -type File struct { -} -``` - - -#### func NewFile - -```go -func NewFile(filename, src string, base int) *File -``` - -#### func (*File) Base - -```go -func (fl *File) Base() int -``` - -#### func (*File) Name - -```go -func (fl *File) Name() string -``` - -#### func (*File) Source - -```go -func (fl *File) Source() string -``` - -#### type FileSet - -```go -type FileSet struct { -} -``` - -A FileSet represents a set of source files. - -#### func (*FileSet) AddFile - -```go -func (self *FileSet) AddFile(filename, src string) int -``` -AddFile adds a new file with the given filename and src. - -This an internal method, but exported for cross-package use. - -#### func (*FileSet) File - -```go -func (self *FileSet) File(idx Idx) *File -``` - -#### func (*FileSet) Position - -```go -func (self *FileSet) Position(idx Idx) *Position -``` -Position converts an Idx in the FileSet into a Position. - -#### type Idx - -```go -type Idx int -``` - -Idx is a compact encoding of a source position within a file set. It can be -converted into a Position for a more convenient, but much larger, -representation. - -#### type Position - -```go -type Position struct { - Filename string // The filename where the error occurred, if any - Offset int // The src offset - Line int // The line number, starting at 1 - Column int // The column number, starting at 1 (The character count) - -} -``` - -Position describes an arbitrary source position including the filename, line, -and column location. - -#### func (*Position) String - -```go -func (self *Position) String() string -``` -String returns a string in one of several forms: - - file:line:column A valid position with filename - line:column A valid position without filename - file An invalid position with filename - - An invalid position without filename - --- -**godocdown** http://github.com/robertkrimen/godocdown diff --git a/vendor/github.com/robertkrimen/otto/file/file.go b/vendor/github.com/robertkrimen/otto/file/file.go deleted file mode 100644 index 9093206e8e59..000000000000 --- a/vendor/github.com/robertkrimen/otto/file/file.go +++ /dev/null @@ -1,164 +0,0 @@ -// Package file encapsulates the file abstractions used by the ast & parser. -// -package file - -import ( - "fmt" - "strings" - - "gopkg.in/sourcemap.v1" -) - -// Idx is a compact encoding of a source position within a file set. -// It can be converted into a Position for a more convenient, but much -// larger, representation. -type Idx int - -// Position describes an arbitrary source position -// including the filename, line, and column location. -type Position struct { - Filename string // The filename where the error occurred, if any - Offset int // The src offset - Line int // The line number, starting at 1 - Column int // The column number, starting at 1 (The character count) - -} - -// A Position is valid if the line number is > 0. - -func (self *Position) isValid() bool { - return self.Line > 0 -} - -// String returns a string in one of several forms: -// -// file:line:column A valid position with filename -// line:column A valid position without filename -// file An invalid position with filename -// - An invalid position without filename -// -func (self *Position) String() string { - str := self.Filename - if self.isValid() { - if str != "" { - str += ":" - } - str += fmt.Sprintf("%d:%d", self.Line, self.Column) - } - if str == "" { - str = "-" - } - return str -} - -// FileSet - -// A FileSet represents a set of source files. -type FileSet struct { - files []*File - last *File -} - -// AddFile adds a new file with the given filename and src. -// -// This an internal method, but exported for cross-package use. -func (self *FileSet) AddFile(filename, src string) int { - base := self.nextBase() - file := &File{ - name: filename, - src: src, - base: base, - } - self.files = append(self.files, file) - self.last = file - return base -} - -func (self *FileSet) nextBase() int { - if self.last == nil { - return 1 - } - return self.last.base + len(self.last.src) + 1 -} - -func (self *FileSet) File(idx Idx) *File { - for _, file := range self.files { - if idx <= Idx(file.base+len(file.src)) { - return file - } - } - return nil -} - -// Position converts an Idx in the FileSet into a Position. -func (self *FileSet) Position(idx Idx) *Position { - for _, file := range self.files { - if idx <= Idx(file.base+len(file.src)) { - return file.Position(idx - Idx(file.base)) - } - } - - return nil -} - -type File struct { - name string - src string - base int // This will always be 1 or greater - sm *sourcemap.Consumer -} - -func NewFile(filename, src string, base int) *File { - return &File{ - name: filename, - src: src, - base: base, - } -} - -func (fl *File) WithSourceMap(sm *sourcemap.Consumer) *File { - fl.sm = sm - return fl -} - -func (fl *File) Name() string { - return fl.name -} - -func (fl *File) Source() string { - return fl.src -} - -func (fl *File) Base() int { - return fl.base -} - -func (fl *File) Position(idx Idx) *Position { - position := &Position{} - - offset := int(idx) - fl.base - - if offset >= len(fl.src) || offset < 0 { - return nil - } - - src := fl.src[:offset] - - position.Filename = fl.name - position.Offset = offset - position.Line = strings.Count(src, "\n") + 1 - - if index := strings.LastIndex(src, "\n"); index >= 0 { - position.Column = offset - index - } else { - position.Column = len(src) + 1 - } - - if fl.sm != nil { - if f, _, l, c, ok := fl.sm.Source(position.Line, position.Column); ok { - position.Filename, position.Line, position.Column = f, l, c - } - } - - return position -} diff --git a/vendor/github.com/robertkrimen/otto/global.go b/vendor/github.com/robertkrimen/otto/global.go deleted file mode 100644 index eb2a2a0fbfb5..000000000000 --- a/vendor/github.com/robertkrimen/otto/global.go +++ /dev/null @@ -1,221 +0,0 @@ -package otto - -import ( - "strconv" - "time" -) - -var ( - prototypeValueObject = interface{}(nil) - prototypeValueFunction = _nativeFunctionObject{ - call: func(_ FunctionCall) Value { - return Value{} - }, - } - prototypeValueString = _stringASCII("") - // TODO Make this just false? - prototypeValueBoolean = Value{ - kind: valueBoolean, - value: false, - } - prototypeValueNumber = Value{ - kind: valueNumber, - value: 0, - } - prototypeValueDate = _dateObject{ - epoch: 0, - isNaN: false, - time: time.Unix(0, 0).UTC(), - value: Value{ - kind: valueNumber, - value: 0, - }, - } - prototypeValueRegExp = _regExpObject{ - regularExpression: nil, - global: false, - ignoreCase: false, - multiline: false, - source: "", - flags: "", - } -) - -func newContext() *_runtime { - - self := &_runtime{} - - self.globalStash = self.newObjectStash(nil, nil) - self.globalObject = self.globalStash.object - - _newContext(self) - - self.eval = self.globalObject.property["eval"].value.(Value).value.(*_object) - self.globalObject.prototype = self.global.ObjectPrototype - - return self -} - -func (runtime *_runtime) newBaseObject() *_object { - self := newObject(runtime, "") - return self -} - -func (runtime *_runtime) newClassObject(class string) *_object { - return newObject(runtime, class) -} - -func (runtime *_runtime) newPrimitiveObject(class string, value Value) *_object { - self := runtime.newClassObject(class) - self.value = value - return self -} - -func (self *_object) primitiveValue() Value { - switch value := self.value.(type) { - case Value: - return value - case _stringObject: - return toValue_string(value.String()) - } - return Value{} -} - -func (self *_object) hasPrimitive() bool { - switch self.value.(type) { - case Value, _stringObject: - return true - } - return false -} - -func (runtime *_runtime) newObject() *_object { - self := runtime.newClassObject("Object") - self.prototype = runtime.global.ObjectPrototype - return self -} - -func (runtime *_runtime) newArray(length uint32) *_object { - self := runtime.newArrayObject(length) - self.prototype = runtime.global.ArrayPrototype - return self -} - -func (runtime *_runtime) newArrayOf(valueArray []Value) *_object { - self := runtime.newArray(uint32(len(valueArray))) - for index, value := range valueArray { - if value.isEmpty() { - continue - } - self.defineProperty(strconv.FormatInt(int64(index), 10), value, 0111, false) - } - return self -} - -func (runtime *_runtime) newString(value Value) *_object { - self := runtime.newStringObject(value) - self.prototype = runtime.global.StringPrototype - return self -} - -func (runtime *_runtime) newBoolean(value Value) *_object { - self := runtime.newBooleanObject(value) - self.prototype = runtime.global.BooleanPrototype - return self -} - -func (runtime *_runtime) newNumber(value Value) *_object { - self := runtime.newNumberObject(value) - self.prototype = runtime.global.NumberPrototype - return self -} - -func (runtime *_runtime) newRegExp(patternValue Value, flagsValue Value) *_object { - - pattern := "" - flags := "" - if object := patternValue._object(); object != nil && object.class == "RegExp" { - if flagsValue.IsDefined() { - panic(runtime.panicTypeError("Cannot supply flags when constructing one RegExp from another")) - } - regExp := object.regExpValue() - pattern = regExp.source - flags = regExp.flags - } else { - if patternValue.IsDefined() { - pattern = patternValue.string() - } - if flagsValue.IsDefined() { - flags = flagsValue.string() - } - } - - return runtime._newRegExp(pattern, flags) -} - -func (runtime *_runtime) _newRegExp(pattern string, flags string) *_object { - self := runtime.newRegExpObject(pattern, flags) - self.prototype = runtime.global.RegExpPrototype - return self -} - -// TODO Should (probably) be one argument, right? This is redundant -func (runtime *_runtime) newDate(epoch float64) *_object { - self := runtime.newDateObject(epoch) - self.prototype = runtime.global.DatePrototype - return self -} - -func (runtime *_runtime) newError(name string, message Value, stackFramesToPop int) *_object { - var self *_object - switch name { - case "EvalError": - return runtime.newEvalError(message) - case "TypeError": - return runtime.newTypeError(message) - case "RangeError": - return runtime.newRangeError(message) - case "ReferenceError": - return runtime.newReferenceError(message) - case "SyntaxError": - return runtime.newSyntaxError(message) - case "URIError": - return runtime.newURIError(message) - } - - self = runtime.newErrorObject(name, message, stackFramesToPop) - self.prototype = runtime.global.ErrorPrototype - if name != "" { - self.defineProperty("name", toValue_string(name), 0111, false) - } - return self -} - -func (runtime *_runtime) newNativeFunction(name, file string, line int, _nativeFunction _nativeFunction) *_object { - self := runtime.newNativeFunctionObject(name, file, line, _nativeFunction, 0) - self.prototype = runtime.global.FunctionPrototype - prototype := runtime.newObject() - self.defineProperty("prototype", toValue_object(prototype), 0100, false) - prototype.defineProperty("constructor", toValue_object(self), 0100, false) - return self -} - -func (runtime *_runtime) newNodeFunction(node *_nodeFunctionLiteral, scopeEnvironment _stash) *_object { - // TODO Implement 13.2 fully - self := runtime.newNodeFunctionObject(node, scopeEnvironment) - self.prototype = runtime.global.FunctionPrototype - prototype := runtime.newObject() - self.defineProperty("prototype", toValue_object(prototype), 0100, false) - prototype.defineProperty("constructor", toValue_object(self), 0101, false) - return self -} - -// FIXME Only in one place... -func (runtime *_runtime) newBoundFunction(target *_object, this Value, argumentList []Value) *_object { - self := runtime.newBoundFunctionObject(target, this, argumentList) - self.prototype = runtime.global.FunctionPrototype - prototype := runtime.newObject() - self.defineProperty("prototype", toValue_object(prototype), 0100, false) - prototype.defineProperty("constructor", toValue_object(self), 0100, false) - return self -} diff --git a/vendor/github.com/robertkrimen/otto/inline.go b/vendor/github.com/robertkrimen/otto/inline.go deleted file mode 100644 index 6e5df8393ee1..000000000000 --- a/vendor/github.com/robertkrimen/otto/inline.go +++ /dev/null @@ -1,6649 +0,0 @@ -package otto - -import ( - "math" -) - -func _newContext(runtime *_runtime) { - { - runtime.global.ObjectPrototype = &_object{ - runtime: runtime, - class: "Object", - objectClass: _classObject, - prototype: nil, - extensible: true, - value: prototypeValueObject, - } - } - { - runtime.global.FunctionPrototype = &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.ObjectPrototype, - extensible: true, - value: prototypeValueFunction, - } - } - { - valueOf_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "valueOf", - call: builtinObject_valueOf, - }, - } - toString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toString", - call: builtinObject_toString, - }, - } - toLocaleString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toLocaleString", - call: builtinObject_toLocaleString, - }, - } - hasOwnProperty_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "hasOwnProperty", - call: builtinObject_hasOwnProperty, - }, - } - isPrototypeOf_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "isPrototypeOf", - call: builtinObject_isPrototypeOf, - }, - } - propertyIsEnumerable_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "propertyIsEnumerable", - call: builtinObject_propertyIsEnumerable, - }, - } - runtime.global.ObjectPrototype.property = map[string]_property{ - "valueOf": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: valueOf_function, - }, - }, - "toString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toString_function, - }, - }, - "toLocaleString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toLocaleString_function, - }, - }, - "hasOwnProperty": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: hasOwnProperty_function, - }, - }, - "isPrototypeOf": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: isPrototypeOf_function, - }, - }, - "propertyIsEnumerable": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: propertyIsEnumerable_function, - }, - }, - "constructor": _property{ - mode: 0101, - value: Value{}, - }, - } - runtime.global.ObjectPrototype.propertyOrder = []string{ - "valueOf", - "toString", - "toLocaleString", - "hasOwnProperty", - "isPrototypeOf", - "propertyIsEnumerable", - "constructor", - } - } - { - toString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toString", - call: builtinFunction_toString, - }, - } - apply_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "apply", - call: builtinFunction_apply, - }, - } - call_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "call", - call: builtinFunction_call, - }, - } - bind_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "bind", - call: builtinFunction_bind, - }, - } - runtime.global.FunctionPrototype.property = map[string]_property{ - "toString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toString_function, - }, - }, - "apply": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: apply_function, - }, - }, - "call": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: call_function, - }, - }, - "bind": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: bind_function, - }, - }, - "constructor": _property{ - mode: 0101, - value: Value{}, - }, - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - } - runtime.global.FunctionPrototype.propertyOrder = []string{ - "toString", - "apply", - "call", - "bind", - "constructor", - "length", - } - } - { - getPrototypeOf_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getPrototypeOf", - call: builtinObject_getPrototypeOf, - }, - } - getOwnPropertyDescriptor_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getOwnPropertyDescriptor", - call: builtinObject_getOwnPropertyDescriptor, - }, - } - defineProperty_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 3, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "defineProperty", - call: builtinObject_defineProperty, - }, - } - defineProperties_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "defineProperties", - call: builtinObject_defineProperties, - }, - } - create_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "create", - call: builtinObject_create, - }, - } - isExtensible_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "isExtensible", - call: builtinObject_isExtensible, - }, - } - preventExtensions_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "preventExtensions", - call: builtinObject_preventExtensions, - }, - } - isSealed_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "isSealed", - call: builtinObject_isSealed, - }, - } - seal_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "seal", - call: builtinObject_seal, - }, - } - isFrozen_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "isFrozen", - call: builtinObject_isFrozen, - }, - } - freeze_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "freeze", - call: builtinObject_freeze, - }, - } - keys_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "keys", - call: builtinObject_keys, - }, - } - getOwnPropertyNames_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getOwnPropertyNames", - call: builtinObject_getOwnPropertyNames, - }, - } - runtime.global.Object = &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: _nativeFunctionObject{ - name: "Object", - call: builtinObject, - construct: builtinNewObject, - }, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - "prototype": _property{ - mode: 0, - value: Value{ - kind: valueObject, - value: runtime.global.ObjectPrototype, - }, - }, - "getPrototypeOf": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getPrototypeOf_function, - }, - }, - "getOwnPropertyDescriptor": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getOwnPropertyDescriptor_function, - }, - }, - "defineProperty": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: defineProperty_function, - }, - }, - "defineProperties": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: defineProperties_function, - }, - }, - "create": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: create_function, - }, - }, - "isExtensible": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: isExtensible_function, - }, - }, - "preventExtensions": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: preventExtensions_function, - }, - }, - "isSealed": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: isSealed_function, - }, - }, - "seal": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: seal_function, - }, - }, - "isFrozen": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: isFrozen_function, - }, - }, - "freeze": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: freeze_function, - }, - }, - "keys": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: keys_function, - }, - }, - "getOwnPropertyNames": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getOwnPropertyNames_function, - }, - }, - }, - propertyOrder: []string{ - "length", - "prototype", - "getPrototypeOf", - "getOwnPropertyDescriptor", - "defineProperty", - "defineProperties", - "create", - "isExtensible", - "preventExtensions", - "isSealed", - "seal", - "isFrozen", - "freeze", - "keys", - "getOwnPropertyNames", - }, - } - runtime.global.ObjectPrototype.property["constructor"] = - _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.Object, - }, - } - } - { - Function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: _nativeFunctionObject{ - name: "Function", - call: builtinFunction, - construct: builtinNewFunction, - }, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - "prototype": _property{ - mode: 0, - value: Value{ - kind: valueObject, - value: runtime.global.FunctionPrototype, - }, - }, - }, - propertyOrder: []string{ - "length", - "prototype", - }, - } - runtime.global.Function = Function - runtime.global.FunctionPrototype.property["constructor"] = - _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.Function, - }, - } - } - { - toString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toString", - call: builtinArray_toString, - }, - } - toLocaleString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toLocaleString", - call: builtinArray_toLocaleString, - }, - } - concat_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "concat", - call: builtinArray_concat, - }, - } - join_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "join", - call: builtinArray_join, - }, - } - splice_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "splice", - call: builtinArray_splice, - }, - } - shift_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "shift", - call: builtinArray_shift, - }, - } - pop_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "pop", - call: builtinArray_pop, - }, - } - push_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "push", - call: builtinArray_push, - }, - } - slice_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "slice", - call: builtinArray_slice, - }, - } - unshift_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "unshift", - call: builtinArray_unshift, - }, - } - reverse_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "reverse", - call: builtinArray_reverse, - }, - } - sort_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "sort", - call: builtinArray_sort, - }, - } - indexOf_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "indexOf", - call: builtinArray_indexOf, - }, - } - lastIndexOf_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "lastIndexOf", - call: builtinArray_lastIndexOf, - }, - } - every_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "every", - call: builtinArray_every, - }, - } - some_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "some", - call: builtinArray_some, - }, - } - forEach_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "forEach", - call: builtinArray_forEach, - }, - } - map_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "map", - call: builtinArray_map, - }, - } - filter_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "filter", - call: builtinArray_filter, - }, - } - reduce_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "reduce", - call: builtinArray_reduce, - }, - } - reduceRight_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "reduceRight", - call: builtinArray_reduceRight, - }, - } - isArray_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "isArray", - call: builtinArray_isArray, - }, - } - runtime.global.ArrayPrototype = &_object{ - runtime: runtime, - class: "Array", - objectClass: _classArray, - prototype: runtime.global.ObjectPrototype, - extensible: true, - value: nil, - property: map[string]_property{ - "length": _property{ - mode: 0100, - value: Value{ - kind: valueNumber, - value: uint32(0), - }, - }, - "toString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toString_function, - }, - }, - "toLocaleString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toLocaleString_function, - }, - }, - "concat": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: concat_function, - }, - }, - "join": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: join_function, - }, - }, - "splice": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: splice_function, - }, - }, - "shift": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: shift_function, - }, - }, - "pop": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: pop_function, - }, - }, - "push": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: push_function, - }, - }, - "slice": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: slice_function, - }, - }, - "unshift": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: unshift_function, - }, - }, - "reverse": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: reverse_function, - }, - }, - "sort": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: sort_function, - }, - }, - "indexOf": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: indexOf_function, - }, - }, - "lastIndexOf": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: lastIndexOf_function, - }, - }, - "every": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: every_function, - }, - }, - "some": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: some_function, - }, - }, - "forEach": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: forEach_function, - }, - }, - "map": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: map_function, - }, - }, - "filter": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: filter_function, - }, - }, - "reduce": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: reduce_function, - }, - }, - "reduceRight": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: reduceRight_function, - }, - }, - }, - propertyOrder: []string{ - "length", - "toString", - "toLocaleString", - "concat", - "join", - "splice", - "shift", - "pop", - "push", - "slice", - "unshift", - "reverse", - "sort", - "indexOf", - "lastIndexOf", - "every", - "some", - "forEach", - "map", - "filter", - "reduce", - "reduceRight", - }, - } - runtime.global.Array = &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: _nativeFunctionObject{ - name: "Array", - call: builtinArray, - construct: builtinNewArray, - }, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - "prototype": _property{ - mode: 0, - value: Value{ - kind: valueObject, - value: runtime.global.ArrayPrototype, - }, - }, - "isArray": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: isArray_function, - }, - }, - }, - propertyOrder: []string{ - "length", - "prototype", - "isArray", - }, - } - runtime.global.ArrayPrototype.property["constructor"] = - _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.Array, - }, - } - } - { - toString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toString", - call: builtinString_toString, - }, - } - valueOf_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "valueOf", - call: builtinString_valueOf, - }, - } - charAt_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "charAt", - call: builtinString_charAt, - }, - } - charCodeAt_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "charCodeAt", - call: builtinString_charCodeAt, - }, - } - concat_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "concat", - call: builtinString_concat, - }, - } - indexOf_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "indexOf", - call: builtinString_indexOf, - }, - } - lastIndexOf_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "lastIndexOf", - call: builtinString_lastIndexOf, - }, - } - match_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "match", - call: builtinString_match, - }, - } - replace_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "replace", - call: builtinString_replace, - }, - } - search_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "search", - call: builtinString_search, - }, - } - split_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "split", - call: builtinString_split, - }, - } - slice_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "slice", - call: builtinString_slice, - }, - } - substring_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "substring", - call: builtinString_substring, - }, - } - toLowerCase_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toLowerCase", - call: builtinString_toLowerCase, - }, - } - toUpperCase_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toUpperCase", - call: builtinString_toUpperCase, - }, - } - substr_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "substr", - call: builtinString_substr, - }, - } - trim_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "trim", - call: builtinString_trim, - }, - } - trimLeft_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "trimLeft", - call: builtinString_trimLeft, - }, - } - trimRight_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "trimRight", - call: builtinString_trimRight, - }, - } - localeCompare_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "localeCompare", - call: builtinString_localeCompare, - }, - } - toLocaleLowerCase_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toLocaleLowerCase", - call: builtinString_toLocaleLowerCase, - }, - } - toLocaleUpperCase_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toLocaleUpperCase", - call: builtinString_toLocaleUpperCase, - }, - } - fromCharCode_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "fromCharCode", - call: builtinString_fromCharCode, - }, - } - runtime.global.StringPrototype = &_object{ - runtime: runtime, - class: "String", - objectClass: _classString, - prototype: runtime.global.ObjectPrototype, - extensible: true, - value: prototypeValueString, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: int(0), - }, - }, - "toString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toString_function, - }, - }, - "valueOf": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: valueOf_function, - }, - }, - "charAt": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: charAt_function, - }, - }, - "charCodeAt": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: charCodeAt_function, - }, - }, - "concat": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: concat_function, - }, - }, - "indexOf": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: indexOf_function, - }, - }, - "lastIndexOf": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: lastIndexOf_function, - }, - }, - "match": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: match_function, - }, - }, - "replace": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: replace_function, - }, - }, - "search": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: search_function, - }, - }, - "split": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: split_function, - }, - }, - "slice": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: slice_function, - }, - }, - "substring": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: substring_function, - }, - }, - "toLowerCase": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toLowerCase_function, - }, - }, - "toUpperCase": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toUpperCase_function, - }, - }, - "substr": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: substr_function, - }, - }, - "trim": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: trim_function, - }, - }, - "trimLeft": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: trimLeft_function, - }, - }, - "trimRight": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: trimRight_function, - }, - }, - "localeCompare": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: localeCompare_function, - }, - }, - "toLocaleLowerCase": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toLocaleLowerCase_function, - }, - }, - "toLocaleUpperCase": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toLocaleUpperCase_function, - }, - }, - }, - propertyOrder: []string{ - "length", - "toString", - "valueOf", - "charAt", - "charCodeAt", - "concat", - "indexOf", - "lastIndexOf", - "match", - "replace", - "search", - "split", - "slice", - "substring", - "toLowerCase", - "toUpperCase", - "substr", - "trim", - "trimLeft", - "trimRight", - "localeCompare", - "toLocaleLowerCase", - "toLocaleUpperCase", - }, - } - runtime.global.String = &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: _nativeFunctionObject{ - name: "String", - call: builtinString, - construct: builtinNewString, - }, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - "prototype": _property{ - mode: 0, - value: Value{ - kind: valueObject, - value: runtime.global.StringPrototype, - }, - }, - "fromCharCode": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: fromCharCode_function, - }, - }, - }, - propertyOrder: []string{ - "length", - "prototype", - "fromCharCode", - }, - } - runtime.global.StringPrototype.property["constructor"] = - _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.String, - }, - } - } - { - toString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toString", - call: builtinBoolean_toString, - }, - } - valueOf_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "valueOf", - call: builtinBoolean_valueOf, - }, - } - runtime.global.BooleanPrototype = &_object{ - runtime: runtime, - class: "Boolean", - objectClass: _classObject, - prototype: runtime.global.ObjectPrototype, - extensible: true, - value: prototypeValueBoolean, - property: map[string]_property{ - "toString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toString_function, - }, - }, - "valueOf": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: valueOf_function, - }, - }, - }, - propertyOrder: []string{ - "toString", - "valueOf", - }, - } - runtime.global.Boolean = &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: _nativeFunctionObject{ - name: "Boolean", - call: builtinBoolean, - construct: builtinNewBoolean, - }, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - "prototype": _property{ - mode: 0, - value: Value{ - kind: valueObject, - value: runtime.global.BooleanPrototype, - }, - }, - }, - propertyOrder: []string{ - "length", - "prototype", - }, - } - runtime.global.BooleanPrototype.property["constructor"] = - _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.Boolean, - }, - } - } - { - toString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toString", - call: builtinNumber_toString, - }, - } - valueOf_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "valueOf", - call: builtinNumber_valueOf, - }, - } - toFixed_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toFixed", - call: builtinNumber_toFixed, - }, - } - toExponential_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toExponential", - call: builtinNumber_toExponential, - }, - } - toPrecision_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toPrecision", - call: builtinNumber_toPrecision, - }, - } - toLocaleString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toLocaleString", - call: builtinNumber_toLocaleString, - }, - } - runtime.global.NumberPrototype = &_object{ - runtime: runtime, - class: "Number", - objectClass: _classObject, - prototype: runtime.global.ObjectPrototype, - extensible: true, - value: prototypeValueNumber, - property: map[string]_property{ - "toString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toString_function, - }, - }, - "valueOf": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: valueOf_function, - }, - }, - "toFixed": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toFixed_function, - }, - }, - "toExponential": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toExponential_function, - }, - }, - "toPrecision": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toPrecision_function, - }, - }, - "toLocaleString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toLocaleString_function, - }, - }, - }, - propertyOrder: []string{ - "toString", - "valueOf", - "toFixed", - "toExponential", - "toPrecision", - "toLocaleString", - }, - } - runtime.global.Number = &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: _nativeFunctionObject{ - name: "Number", - call: builtinNumber, - construct: builtinNewNumber, - }, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - "prototype": _property{ - mode: 0, - value: Value{ - kind: valueObject, - value: runtime.global.NumberPrototype, - }, - }, - "MAX_VALUE": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: math.MaxFloat64, - }, - }, - "MIN_VALUE": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: math.SmallestNonzeroFloat64, - }, - }, - "NaN": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: math.NaN(), - }, - }, - "NEGATIVE_INFINITY": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: math.Inf(-1), - }, - }, - "POSITIVE_INFINITY": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: math.Inf(+1), - }, - }, - }, - propertyOrder: []string{ - "length", - "prototype", - "MAX_VALUE", - "MIN_VALUE", - "NaN", - "NEGATIVE_INFINITY", - "POSITIVE_INFINITY", - }, - } - runtime.global.NumberPrototype.property["constructor"] = - _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.Number, - }, - } - } - { - abs_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "abs", - call: builtinMath_abs, - }, - } - acos_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "acos", - call: builtinMath_acos, - }, - } - asin_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "asin", - call: builtinMath_asin, - }, - } - atan_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "atan", - call: builtinMath_atan, - }, - } - atan2_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "atan2", - call: builtinMath_atan2, - }, - } - ceil_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "ceil", - call: builtinMath_ceil, - }, - } - cos_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "cos", - call: builtinMath_cos, - }, - } - exp_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "exp", - call: builtinMath_exp, - }, - } - floor_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "floor", - call: builtinMath_floor, - }, - } - log_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "log", - call: builtinMath_log, - }, - } - max_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "max", - call: builtinMath_max, - }, - } - min_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "min", - call: builtinMath_min, - }, - } - pow_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "pow", - call: builtinMath_pow, - }, - } - random_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "random", - call: builtinMath_random, - }, - } - round_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "round", - call: builtinMath_round, - }, - } - sin_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "sin", - call: builtinMath_sin, - }, - } - sqrt_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "sqrt", - call: builtinMath_sqrt, - }, - } - tan_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "tan", - call: builtinMath_tan, - }, - } - runtime.global.Math = &_object{ - runtime: runtime, - class: "Math", - objectClass: _classObject, - prototype: runtime.global.ObjectPrototype, - extensible: true, - property: map[string]_property{ - "abs": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: abs_function, - }, - }, - "acos": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: acos_function, - }, - }, - "asin": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: asin_function, - }, - }, - "atan": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: atan_function, - }, - }, - "atan2": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: atan2_function, - }, - }, - "ceil": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: ceil_function, - }, - }, - "cos": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: cos_function, - }, - }, - "exp": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: exp_function, - }, - }, - "floor": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: floor_function, - }, - }, - "log": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: log_function, - }, - }, - "max": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: max_function, - }, - }, - "min": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: min_function, - }, - }, - "pow": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: pow_function, - }, - }, - "random": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: random_function, - }, - }, - "round": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: round_function, - }, - }, - "sin": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: sin_function, - }, - }, - "sqrt": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: sqrt_function, - }, - }, - "tan": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: tan_function, - }, - }, - "E": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: math.E, - }, - }, - "LN10": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: math.Ln10, - }, - }, - "LN2": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: math.Ln2, - }, - }, - "LOG2E": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: math.Log2E, - }, - }, - "LOG10E": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: math.Log10E, - }, - }, - "PI": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: math.Pi, - }, - }, - "SQRT1_2": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: sqrt1_2, - }, - }, - "SQRT2": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: math.Sqrt2, - }, - }, - }, - propertyOrder: []string{ - "abs", - "acos", - "asin", - "atan", - "atan2", - "ceil", - "cos", - "exp", - "floor", - "log", - "max", - "min", - "pow", - "random", - "round", - "sin", - "sqrt", - "tan", - "E", - "LN10", - "LN2", - "LOG2E", - "LOG10E", - "PI", - "SQRT1_2", - "SQRT2", - }, - } - } - { - toString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toString", - call: builtinDate_toString, - }, - } - toDateString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toDateString", - call: builtinDate_toDateString, - }, - } - toTimeString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toTimeString", - call: builtinDate_toTimeString, - }, - } - toUTCString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toUTCString", - call: builtinDate_toUTCString, - }, - } - toISOString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toISOString", - call: builtinDate_toISOString, - }, - } - toJSON_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toJSON", - call: builtinDate_toJSON, - }, - } - toGMTString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toGMTString", - call: builtinDate_toGMTString, - }, - } - toLocaleString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toLocaleString", - call: builtinDate_toLocaleString, - }, - } - toLocaleDateString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toLocaleDateString", - call: builtinDate_toLocaleDateString, - }, - } - toLocaleTimeString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toLocaleTimeString", - call: builtinDate_toLocaleTimeString, - }, - } - valueOf_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "valueOf", - call: builtinDate_valueOf, - }, - } - getTime_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getTime", - call: builtinDate_getTime, - }, - } - getYear_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getYear", - call: builtinDate_getYear, - }, - } - getFullYear_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getFullYear", - call: builtinDate_getFullYear, - }, - } - getUTCFullYear_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getUTCFullYear", - call: builtinDate_getUTCFullYear, - }, - } - getMonth_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getMonth", - call: builtinDate_getMonth, - }, - } - getUTCMonth_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getUTCMonth", - call: builtinDate_getUTCMonth, - }, - } - getDate_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getDate", - call: builtinDate_getDate, - }, - } - getUTCDate_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getUTCDate", - call: builtinDate_getUTCDate, - }, - } - getDay_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getDay", - call: builtinDate_getDay, - }, - } - getUTCDay_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getUTCDay", - call: builtinDate_getUTCDay, - }, - } - getHours_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getHours", - call: builtinDate_getHours, - }, - } - getUTCHours_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getUTCHours", - call: builtinDate_getUTCHours, - }, - } - getMinutes_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getMinutes", - call: builtinDate_getMinutes, - }, - } - getUTCMinutes_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getUTCMinutes", - call: builtinDate_getUTCMinutes, - }, - } - getSeconds_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getSeconds", - call: builtinDate_getSeconds, - }, - } - getUTCSeconds_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getUTCSeconds", - call: builtinDate_getUTCSeconds, - }, - } - getMilliseconds_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getMilliseconds", - call: builtinDate_getMilliseconds, - }, - } - getUTCMilliseconds_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getUTCMilliseconds", - call: builtinDate_getUTCMilliseconds, - }, - } - getTimezoneOffset_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "getTimezoneOffset", - call: builtinDate_getTimezoneOffset, - }, - } - setTime_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setTime", - call: builtinDate_setTime, - }, - } - setMilliseconds_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setMilliseconds", - call: builtinDate_setMilliseconds, - }, - } - setUTCMilliseconds_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setUTCMilliseconds", - call: builtinDate_setUTCMilliseconds, - }, - } - setSeconds_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setSeconds", - call: builtinDate_setSeconds, - }, - } - setUTCSeconds_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setUTCSeconds", - call: builtinDate_setUTCSeconds, - }, - } - setMinutes_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 3, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setMinutes", - call: builtinDate_setMinutes, - }, - } - setUTCMinutes_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 3, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setUTCMinutes", - call: builtinDate_setUTCMinutes, - }, - } - setHours_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 4, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setHours", - call: builtinDate_setHours, - }, - } - setUTCHours_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 4, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setUTCHours", - call: builtinDate_setUTCHours, - }, - } - setDate_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setDate", - call: builtinDate_setDate, - }, - } - setUTCDate_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setUTCDate", - call: builtinDate_setUTCDate, - }, - } - setMonth_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setMonth", - call: builtinDate_setMonth, - }, - } - setUTCMonth_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setUTCMonth", - call: builtinDate_setUTCMonth, - }, - } - setYear_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setYear", - call: builtinDate_setYear, - }, - } - setFullYear_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 3, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setFullYear", - call: builtinDate_setFullYear, - }, - } - setUTCFullYear_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 3, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "setUTCFullYear", - call: builtinDate_setUTCFullYear, - }, - } - parse_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "parse", - call: builtinDate_parse, - }, - } - UTC_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 7, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "UTC", - call: builtinDate_UTC, - }, - } - now_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "now", - call: builtinDate_now, - }, - } - runtime.global.DatePrototype = &_object{ - runtime: runtime, - class: "Date", - objectClass: _classObject, - prototype: runtime.global.ObjectPrototype, - extensible: true, - value: prototypeValueDate, - property: map[string]_property{ - "toString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toString_function, - }, - }, - "toDateString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toDateString_function, - }, - }, - "toTimeString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toTimeString_function, - }, - }, - "toUTCString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toUTCString_function, - }, - }, - "toISOString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toISOString_function, - }, - }, - "toJSON": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toJSON_function, - }, - }, - "toGMTString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toGMTString_function, - }, - }, - "toLocaleString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toLocaleString_function, - }, - }, - "toLocaleDateString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toLocaleDateString_function, - }, - }, - "toLocaleTimeString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toLocaleTimeString_function, - }, - }, - "valueOf": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: valueOf_function, - }, - }, - "getTime": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getTime_function, - }, - }, - "getYear": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getYear_function, - }, - }, - "getFullYear": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getFullYear_function, - }, - }, - "getUTCFullYear": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getUTCFullYear_function, - }, - }, - "getMonth": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getMonth_function, - }, - }, - "getUTCMonth": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getUTCMonth_function, - }, - }, - "getDate": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getDate_function, - }, - }, - "getUTCDate": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getUTCDate_function, - }, - }, - "getDay": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getDay_function, - }, - }, - "getUTCDay": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getUTCDay_function, - }, - }, - "getHours": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getHours_function, - }, - }, - "getUTCHours": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getUTCHours_function, - }, - }, - "getMinutes": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getMinutes_function, - }, - }, - "getUTCMinutes": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getUTCMinutes_function, - }, - }, - "getSeconds": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getSeconds_function, - }, - }, - "getUTCSeconds": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getUTCSeconds_function, - }, - }, - "getMilliseconds": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getMilliseconds_function, - }, - }, - "getUTCMilliseconds": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getUTCMilliseconds_function, - }, - }, - "getTimezoneOffset": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: getTimezoneOffset_function, - }, - }, - "setTime": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setTime_function, - }, - }, - "setMilliseconds": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setMilliseconds_function, - }, - }, - "setUTCMilliseconds": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setUTCMilliseconds_function, - }, - }, - "setSeconds": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setSeconds_function, - }, - }, - "setUTCSeconds": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setUTCSeconds_function, - }, - }, - "setMinutes": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setMinutes_function, - }, - }, - "setUTCMinutes": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setUTCMinutes_function, - }, - }, - "setHours": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setHours_function, - }, - }, - "setUTCHours": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setUTCHours_function, - }, - }, - "setDate": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setDate_function, - }, - }, - "setUTCDate": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setUTCDate_function, - }, - }, - "setMonth": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setMonth_function, - }, - }, - "setUTCMonth": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setUTCMonth_function, - }, - }, - "setYear": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setYear_function, - }, - }, - "setFullYear": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setFullYear_function, - }, - }, - "setUTCFullYear": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: setUTCFullYear_function, - }, - }, - }, - propertyOrder: []string{ - "toString", - "toDateString", - "toTimeString", - "toUTCString", - "toISOString", - "toJSON", - "toGMTString", - "toLocaleString", - "toLocaleDateString", - "toLocaleTimeString", - "valueOf", - "getTime", - "getYear", - "getFullYear", - "getUTCFullYear", - "getMonth", - "getUTCMonth", - "getDate", - "getUTCDate", - "getDay", - "getUTCDay", - "getHours", - "getUTCHours", - "getMinutes", - "getUTCMinutes", - "getSeconds", - "getUTCSeconds", - "getMilliseconds", - "getUTCMilliseconds", - "getTimezoneOffset", - "setTime", - "setMilliseconds", - "setUTCMilliseconds", - "setSeconds", - "setUTCSeconds", - "setMinutes", - "setUTCMinutes", - "setHours", - "setUTCHours", - "setDate", - "setUTCDate", - "setMonth", - "setUTCMonth", - "setYear", - "setFullYear", - "setUTCFullYear", - }, - } - runtime.global.Date = &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: _nativeFunctionObject{ - name: "Date", - call: builtinDate, - construct: builtinNewDate, - }, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 7, - }, - }, - "prototype": _property{ - mode: 0, - value: Value{ - kind: valueObject, - value: runtime.global.DatePrototype, - }, - }, - "parse": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: parse_function, - }, - }, - "UTC": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: UTC_function, - }, - }, - "now": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: now_function, - }, - }, - }, - propertyOrder: []string{ - "length", - "prototype", - "parse", - "UTC", - "now", - }, - } - runtime.global.DatePrototype.property["constructor"] = - _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.Date, - }, - } - } - { - toString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toString", - call: builtinRegExp_toString, - }, - } - exec_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "exec", - call: builtinRegExp_exec, - }, - } - test_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "test", - call: builtinRegExp_test, - }, - } - compile_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "compile", - call: builtinRegExp_compile, - }, - } - runtime.global.RegExpPrototype = &_object{ - runtime: runtime, - class: "RegExp", - objectClass: _classObject, - prototype: runtime.global.ObjectPrototype, - extensible: true, - value: prototypeValueRegExp, - property: map[string]_property{ - "toString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toString_function, - }, - }, - "exec": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: exec_function, - }, - }, - "test": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: test_function, - }, - }, - "compile": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: compile_function, - }, - }, - }, - propertyOrder: []string{ - "toString", - "exec", - "test", - "compile", - }, - } - runtime.global.RegExp = &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: _nativeFunctionObject{ - name: "RegExp", - call: builtinRegExp, - construct: builtinNewRegExp, - }, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - "prototype": _property{ - mode: 0, - value: Value{ - kind: valueObject, - value: runtime.global.RegExpPrototype, - }, - }, - }, - propertyOrder: []string{ - "length", - "prototype", - }, - } - runtime.global.RegExpPrototype.property["constructor"] = - _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.RegExp, - }, - } - } - { - toString_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "toString", - call: builtinError_toString, - }, - } - runtime.global.ErrorPrototype = &_object{ - runtime: runtime, - class: "Error", - objectClass: _classObject, - prototype: runtime.global.ObjectPrototype, - extensible: true, - value: nil, - property: map[string]_property{ - "toString": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: toString_function, - }, - }, - "name": _property{ - mode: 0101, - value: Value{ - kind: valueString, - value: "Error", - }, - }, - "message": _property{ - mode: 0101, - value: Value{ - kind: valueString, - value: "", - }, - }, - }, - propertyOrder: []string{ - "toString", - "name", - "message", - }, - } - runtime.global.Error = &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: _nativeFunctionObject{ - name: "Error", - call: builtinError, - construct: builtinNewError, - }, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - "prototype": _property{ - mode: 0, - value: Value{ - kind: valueObject, - value: runtime.global.ErrorPrototype, - }, - }, - }, - propertyOrder: []string{ - "length", - "prototype", - }, - } - runtime.global.ErrorPrototype.property["constructor"] = - _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.Error, - }, - } - } - { - runtime.global.EvalErrorPrototype = &_object{ - runtime: runtime, - class: "EvalError", - objectClass: _classObject, - prototype: runtime.global.ErrorPrototype, - extensible: true, - value: nil, - property: map[string]_property{ - "name": _property{ - mode: 0101, - value: Value{ - kind: valueString, - value: "EvalError", - }, - }, - }, - propertyOrder: []string{ - "name", - }, - } - runtime.global.EvalError = &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: _nativeFunctionObject{ - name: "EvalError", - call: builtinEvalError, - construct: builtinNewEvalError, - }, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - "prototype": _property{ - mode: 0, - value: Value{ - kind: valueObject, - value: runtime.global.EvalErrorPrototype, - }, - }, - }, - propertyOrder: []string{ - "length", - "prototype", - }, - } - runtime.global.EvalErrorPrototype.property["constructor"] = - _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.EvalError, - }, - } - } - { - runtime.global.TypeErrorPrototype = &_object{ - runtime: runtime, - class: "TypeError", - objectClass: _classObject, - prototype: runtime.global.ErrorPrototype, - extensible: true, - value: nil, - property: map[string]_property{ - "name": _property{ - mode: 0101, - value: Value{ - kind: valueString, - value: "TypeError", - }, - }, - }, - propertyOrder: []string{ - "name", - }, - } - runtime.global.TypeError = &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: _nativeFunctionObject{ - name: "TypeError", - call: builtinTypeError, - construct: builtinNewTypeError, - }, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - "prototype": _property{ - mode: 0, - value: Value{ - kind: valueObject, - value: runtime.global.TypeErrorPrototype, - }, - }, - }, - propertyOrder: []string{ - "length", - "prototype", - }, - } - runtime.global.TypeErrorPrototype.property["constructor"] = - _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.TypeError, - }, - } - } - { - runtime.global.RangeErrorPrototype = &_object{ - runtime: runtime, - class: "RangeError", - objectClass: _classObject, - prototype: runtime.global.ErrorPrototype, - extensible: true, - value: nil, - property: map[string]_property{ - "name": _property{ - mode: 0101, - value: Value{ - kind: valueString, - value: "RangeError", - }, - }, - }, - propertyOrder: []string{ - "name", - }, - } - runtime.global.RangeError = &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: _nativeFunctionObject{ - name: "RangeError", - call: builtinRangeError, - construct: builtinNewRangeError, - }, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - "prototype": _property{ - mode: 0, - value: Value{ - kind: valueObject, - value: runtime.global.RangeErrorPrototype, - }, - }, - }, - propertyOrder: []string{ - "length", - "prototype", - }, - } - runtime.global.RangeErrorPrototype.property["constructor"] = - _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.RangeError, - }, - } - } - { - runtime.global.ReferenceErrorPrototype = &_object{ - runtime: runtime, - class: "ReferenceError", - objectClass: _classObject, - prototype: runtime.global.ErrorPrototype, - extensible: true, - value: nil, - property: map[string]_property{ - "name": _property{ - mode: 0101, - value: Value{ - kind: valueString, - value: "ReferenceError", - }, - }, - }, - propertyOrder: []string{ - "name", - }, - } - runtime.global.ReferenceError = &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: _nativeFunctionObject{ - name: "ReferenceError", - call: builtinReferenceError, - construct: builtinNewReferenceError, - }, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - "prototype": _property{ - mode: 0, - value: Value{ - kind: valueObject, - value: runtime.global.ReferenceErrorPrototype, - }, - }, - }, - propertyOrder: []string{ - "length", - "prototype", - }, - } - runtime.global.ReferenceErrorPrototype.property["constructor"] = - _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.ReferenceError, - }, - } - } - { - runtime.global.SyntaxErrorPrototype = &_object{ - runtime: runtime, - class: "SyntaxError", - objectClass: _classObject, - prototype: runtime.global.ErrorPrototype, - extensible: true, - value: nil, - property: map[string]_property{ - "name": _property{ - mode: 0101, - value: Value{ - kind: valueString, - value: "SyntaxError", - }, - }, - }, - propertyOrder: []string{ - "name", - }, - } - runtime.global.SyntaxError = &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: _nativeFunctionObject{ - name: "SyntaxError", - call: builtinSyntaxError, - construct: builtinNewSyntaxError, - }, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - "prototype": _property{ - mode: 0, - value: Value{ - kind: valueObject, - value: runtime.global.SyntaxErrorPrototype, - }, - }, - }, - propertyOrder: []string{ - "length", - "prototype", - }, - } - runtime.global.SyntaxErrorPrototype.property["constructor"] = - _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.SyntaxError, - }, - } - } - { - runtime.global.URIErrorPrototype = &_object{ - runtime: runtime, - class: "URIError", - objectClass: _classObject, - prototype: runtime.global.ErrorPrototype, - extensible: true, - value: nil, - property: map[string]_property{ - "name": _property{ - mode: 0101, - value: Value{ - kind: valueString, - value: "URIError", - }, - }, - }, - propertyOrder: []string{ - "name", - }, - } - runtime.global.URIError = &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: _nativeFunctionObject{ - name: "URIError", - call: builtinURIError, - construct: builtinNewURIError, - }, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - "prototype": _property{ - mode: 0, - value: Value{ - kind: valueObject, - value: runtime.global.URIErrorPrototype, - }, - }, - }, - propertyOrder: []string{ - "length", - "prototype", - }, - } - runtime.global.URIErrorPrototype.property["constructor"] = - _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.URIError, - }, - } - } - { - parse_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "parse", - call: builtinJSON_parse, - }, - } - stringify_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 3, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "stringify", - call: builtinJSON_stringify, - }, - } - runtime.global.JSON = &_object{ - runtime: runtime, - class: "JSON", - objectClass: _classObject, - prototype: runtime.global.ObjectPrototype, - extensible: true, - property: map[string]_property{ - "parse": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: parse_function, - }, - }, - "stringify": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: stringify_function, - }, - }, - }, - propertyOrder: []string{ - "parse", - "stringify", - }, - } - } - { - eval_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "eval", - call: builtinGlobal_eval, - }, - } - parseInt_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 2, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "parseInt", - call: builtinGlobal_parseInt, - }, - } - parseFloat_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "parseFloat", - call: builtinGlobal_parseFloat, - }, - } - isNaN_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "isNaN", - call: builtinGlobal_isNaN, - }, - } - isFinite_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "isFinite", - call: builtinGlobal_isFinite, - }, - } - decodeURI_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "decodeURI", - call: builtinGlobal_decodeURI, - }, - } - decodeURIComponent_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "decodeURIComponent", - call: builtinGlobal_decodeURIComponent, - }, - } - encodeURI_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "encodeURI", - call: builtinGlobal_encodeURI, - }, - } - encodeURIComponent_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "encodeURIComponent", - call: builtinGlobal_encodeURIComponent, - }, - } - escape_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "escape", - call: builtinGlobal_escape, - }, - } - unescape_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 1, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "unescape", - call: builtinGlobal_unescape, - }, - } - runtime.globalObject.property = map[string]_property{ - "eval": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: eval_function, - }, - }, - "parseInt": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: parseInt_function, - }, - }, - "parseFloat": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: parseFloat_function, - }, - }, - "isNaN": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: isNaN_function, - }, - }, - "isFinite": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: isFinite_function, - }, - }, - "decodeURI": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: decodeURI_function, - }, - }, - "decodeURIComponent": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: decodeURIComponent_function, - }, - }, - "encodeURI": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: encodeURI_function, - }, - }, - "encodeURIComponent": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: encodeURIComponent_function, - }, - }, - "escape": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: escape_function, - }, - }, - "unescape": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: unescape_function, - }, - }, - "Object": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.Object, - }, - }, - "Function": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.Function, - }, - }, - "Array": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.Array, - }, - }, - "String": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.String, - }, - }, - "Boolean": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.Boolean, - }, - }, - "Number": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.Number, - }, - }, - "Math": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.Math, - }, - }, - "Date": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.Date, - }, - }, - "RegExp": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.RegExp, - }, - }, - "Error": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.Error, - }, - }, - "EvalError": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.EvalError, - }, - }, - "TypeError": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.TypeError, - }, - }, - "RangeError": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.RangeError, - }, - }, - "ReferenceError": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.ReferenceError, - }, - }, - "SyntaxError": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.SyntaxError, - }, - }, - "URIError": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.URIError, - }, - }, - "JSON": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: runtime.global.JSON, - }, - }, - "undefined": _property{ - mode: 0, - value: Value{ - kind: valueUndefined, - }, - }, - "NaN": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: math.NaN(), - }, - }, - "Infinity": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: math.Inf(+1), - }, - }, - } - runtime.globalObject.propertyOrder = []string{ - "eval", - "parseInt", - "parseFloat", - "isNaN", - "isFinite", - "decodeURI", - "decodeURIComponent", - "encodeURI", - "encodeURIComponent", - "escape", - "unescape", - "Object", - "Function", - "Array", - "String", - "Boolean", - "Number", - "Math", - "Date", - "RegExp", - "Error", - "EvalError", - "TypeError", - "RangeError", - "ReferenceError", - "SyntaxError", - "URIError", - "JSON", - "undefined", - "NaN", - "Infinity", - } - } -} - -func newConsoleObject(runtime *_runtime) *_object { - { - log_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "log", - call: builtinConsole_log, - }, - } - debug_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "debug", - call: builtinConsole_log, - }, - } - info_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "info", - call: builtinConsole_log, - }, - } - error_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "error", - call: builtinConsole_error, - }, - } - warn_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "warn", - call: builtinConsole_error, - }, - } - dir_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "dir", - call: builtinConsole_dir, - }, - } - time_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "time", - call: builtinConsole_time, - }, - } - timeEnd_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "timeEnd", - call: builtinConsole_timeEnd, - }, - } - trace_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "trace", - call: builtinConsole_trace, - }, - } - assert_function := &_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: map[string]_property{ - "length": _property{ - mode: 0, - value: Value{ - kind: valueNumber, - value: 0, - }, - }, - }, - propertyOrder: []string{ - "length", - }, - value: _nativeFunctionObject{ - name: "assert", - call: builtinConsole_assert, - }, - } - return &_object{ - runtime: runtime, - class: "Object", - objectClass: _classObject, - prototype: runtime.global.ObjectPrototype, - extensible: true, - property: map[string]_property{ - "log": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: log_function, - }, - }, - "debug": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: debug_function, - }, - }, - "info": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: info_function, - }, - }, - "error": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: error_function, - }, - }, - "warn": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: warn_function, - }, - }, - "dir": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: dir_function, - }, - }, - "time": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: time_function, - }, - }, - "timeEnd": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: timeEnd_function, - }, - }, - "trace": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: trace_function, - }, - }, - "assert": _property{ - mode: 0101, - value: Value{ - kind: valueObject, - value: assert_function, - }, - }, - }, - propertyOrder: []string{ - "log", - "debug", - "info", - "error", - "warn", - "dir", - "time", - "timeEnd", - "trace", - "assert", - }, - } - } -} - -func toValue_int(value int) Value { - return Value{ - kind: valueNumber, - value: value, - } -} - -func toValue_int8(value int8) Value { - return Value{ - kind: valueNumber, - value: value, - } -} - -func toValue_int16(value int16) Value { - return Value{ - kind: valueNumber, - value: value, - } -} - -func toValue_int32(value int32) Value { - return Value{ - kind: valueNumber, - value: value, - } -} - -func toValue_int64(value int64) Value { - return Value{ - kind: valueNumber, - value: value, - } -} - -func toValue_uint(value uint) Value { - return Value{ - kind: valueNumber, - value: value, - } -} - -func toValue_uint8(value uint8) Value { - return Value{ - kind: valueNumber, - value: value, - } -} - -func toValue_uint16(value uint16) Value { - return Value{ - kind: valueNumber, - value: value, - } -} - -func toValue_uint32(value uint32) Value { - return Value{ - kind: valueNumber, - value: value, - } -} - -func toValue_uint64(value uint64) Value { - return Value{ - kind: valueNumber, - value: value, - } -} - -func toValue_float32(value float32) Value { - return Value{ - kind: valueNumber, - value: value, - } -} - -func toValue_float64(value float64) Value { - return Value{ - kind: valueNumber, - value: value, - } -} - -func toValue_string(value string) Value { - return Value{ - kind: valueString, - value: value, - } -} - -func toValue_string16(value []uint16) Value { - return Value{ - kind: valueString, - value: value, - } -} - -func toValue_bool(value bool) Value { - return Value{ - kind: valueBoolean, - value: value, - } -} - -func toValue_object(value *_object) Value { - return Value{ - kind: valueObject, - value: value, - } -} diff --git a/vendor/github.com/robertkrimen/otto/inline.pl b/vendor/github.com/robertkrimen/otto/inline.pl deleted file mode 100755 index c3620b4a2b16..000000000000 --- a/vendor/github.com/robertkrimen/otto/inline.pl +++ /dev/null @@ -1,1086 +0,0 @@ -#!/usr/bin/env perl - -my $_fmt; -$_fmt = "gofmt"; -$_fmt = "cat -n" if "cat" eq ($ARGV[0] || ""); - -use strict; -use warnings; -use IO::File; - -my $self = __PACKAGE__; - -sub functionLabel ($) { - return "$_[0]_function"; -} - -sub trim ($) { - local $_ = shift; - s/^\s*//, s/\s*$// for $_; - return $_; -} - -open my $fmt, "|-", "$_fmt" or die $!; - -$fmt->print(<<_END_); -package otto - -import ( - "math" -) - -func _newContext(runtime *_runtime) { -@{[ join "\n", $self->newContext() ]} -} - -func newConsoleObject(runtime *_runtime) *_object { -@{[ join "\n", $self->newConsoleObject() ]} -} -_END_ - -for (qw/int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 float32 float64/) { - $fmt->print(<<_END_); - -func toValue_$_(value $_) Value { - return Value{ - kind: valueNumber, - value: value, - } -} -_END_ -} - -$fmt->print(<<_END_); - -func toValue_string(value string) Value { - return Value{ - kind: valueString, - value: value, - } -} - -func toValue_string16(value []uint16) Value { - return Value{ - kind: valueString, - value: value, - } -} - -func toValue_bool(value bool) Value { - return Value{ - kind: valueBoolean, - value: value, - } -} - -func toValue_object(value *_object) Value { - return Value{ - kind: valueObject, - value: value, - } -} -_END_ - -close $fmt; - -sub newConsoleObject { - my $self = shift; - - return - $self->block(sub { - my $class = "Console"; - my @got = $self->functionDeclare( - $class, - "log", 0, - "debug:log", 0, - "info:log", 0, - "error", 0, - "warn:error", 0, - "dir", 0, - "time", 0, - "timeEnd", 0, - "trace", 0, - "assert", 0, - ); - return - "return @{[ $self->newObject(@got) ]}" - }), - ; -} - -sub newContext { - my $self = shift; - return - # ObjectPrototype - $self->block(sub { - my $class = "Object"; - return - ".${class}Prototype =", - $self->globalPrototype( - $class, - "_classObject", - undef, - "prototypeValueObject", - ), - }), - - # FunctionPrototype - $self->block(sub { - my $class = "Function"; - return - ".${class}Prototype =", - $self->globalPrototype( - $class, - "_classObject", - ".ObjectPrototype", - "prototypeValueFunction", - ), - }), - - # ObjectPrototype - $self->block(sub { - my $class = "Object"; - my @got = $self->functionDeclare( - $class, - "valueOf", 0, - "toString", 0, - "toLocaleString", 0, - "hasOwnProperty", 1, - "isPrototypeOf", 1, - "propertyIsEnumerable", 1, - ); - my @propertyMap = $self->propertyMap( - @got, - $self->property("constructor", undef), - ); - my $propertyOrder = $self->propertyOrder(@propertyMap); - $propertyOrder =~ s/^propertyOrder: //; - return - ".${class}Prototype.property =", @propertyMap, - ".${class}Prototype.propertyOrder =", $propertyOrder, - }), - - # FunctionPrototype - $self->block(sub { - my $class = "Function"; - my @got = $self->functionDeclare( - $class, - "toString", 0, - "apply", 2, - "call", 1, - "bind", 1, - ); - my @propertyMap = $self->propertyMap( - @got, - $self->property("constructor", undef), - $self->property("length", $self->numberValue(0), "0"), - ); - my $propertyOrder = $self->propertyOrder(@propertyMap); - $propertyOrder =~ s/^propertyOrder: //; - return - ".${class}Prototype.property =", @propertyMap, - ".${class}Prototype.propertyOrder =", $propertyOrder, - }), - - # Object - $self->block(sub { - my $class = "Object"; - return - ".$class =", - $self->globalFunction( - $class, - 1, - $self->functionDeclare( - $class, - "getPrototypeOf", 1, - "getOwnPropertyDescriptor", 2, - "defineProperty", 3, - "defineProperties", 2, - "create", 2, - "isExtensible", 1, - "preventExtensions", 1, - "isSealed", 1, - "seal", 1, - "isFrozen", 1, - "freeze", 1, - "keys", 1, - "getOwnPropertyNames", 1, - ), - ), - }), - - # Function - $self->block(sub { - my $class = "Function"; - return - "Function :=", - $self->globalFunction( - $class, - 1, - ), - ".$class = Function", - }), - - # Array - $self->block(sub { - my $class = "Array"; - my @got = $self->functionDeclare( - $class, - "toString", 0, - "toLocaleString", 0, - "concat", 1, - "join", 1, - "splice", 2, - "shift", 0, - "pop", 0, - "push", 1, - "slice", 2, - "unshift", 1, - "reverse", 0, - "sort", 1, - "indexOf", 1, - "lastIndexOf", 1, - "every", 1, - "some", 1, - "forEach", 1, - "map", 1, - "filter", 1, - "reduce", 1, - "reduceRight", 1, - ); - return - ".${class}Prototype =", - $self->globalPrototype( - $class, - "_classArray", - ".ObjectPrototype", - undef, - $self->property("length", $self->numberValue("uint32(0)"), "0100"), - @got, - ), - ".$class =", - $self->globalFunction( - $class, - 1, - $self->functionDeclare( - $class, - "isArray", 1, - ), - ), - }), - - # String - $self->block(sub { - my $class = "String"; - my @got = $self->functionDeclare( - $class, - "toString", 0, - "valueOf", 0, - "charAt", 1, - "charCodeAt", 1, - "concat", 1, - "indexOf", 1, - "lastIndexOf", 1, - "match", 1, - "replace", 2, - "search", 1, - "split", 2, - "slice", 2, - "substring", 2, - "toLowerCase", 0, - "toUpperCase", 0, - "substr", 2, - "trim", 0, - "trimLeft", 0, - "trimRight", 0, - "localeCompare", 1, - "toLocaleLowerCase", 0, - "toLocaleUpperCase", 0, - ); - return - ".${class}Prototype =", - $self->globalPrototype( - $class, - "_classString", - ".ObjectPrototype", - "prototypeValueString", - $self->property("length", $self->numberValue("int(0)"), "0"), - @got, - ), - ".$class =", - $self->globalFunction( - $class, - 1, - $self->functionDeclare( - $class, - "fromCharCode", 1, - ), - ), - }), - - # Boolean - $self->block(sub { - my $class = "Boolean"; - my @got = $self->functionDeclare( - $class, - "toString", 0, - "valueOf", 0, - ); - return - ".${class}Prototype =", - $self->globalPrototype( - $class, - "_classObject", - ".ObjectPrototype", - "prototypeValueBoolean", - @got, - ), - ".$class =", - $self->globalFunction( - $class, - 1, - $self->functionDeclare( - $class, - ), - ), - }), - - # Number - $self->block(sub { - my $class = "Number"; - my @got = $self->functionDeclare( - $class, - "toString", 0, - "valueOf", 0, - "toFixed", 1, - "toExponential", 1, - "toPrecision", 1, - "toLocaleString", 1, - ); - return - ".${class}Prototype =", - $self->globalPrototype( - $class, - "_classObject", - ".ObjectPrototype", - "prototypeValueNumber", - @got, - ), - ".$class =", - $self->globalFunction( - $class, - 1, - $self->functionDeclare( - $class, - ), - $self->numberConstantDeclare( - "MAX_VALUE", "math.MaxFloat64", - "MIN_VALUE", "math.SmallestNonzeroFloat64", - "NaN", "math.NaN()", - "NEGATIVE_INFINITY", "math.Inf(-1)", - "POSITIVE_INFINITY", "math.Inf(+1)", - ), - ), - }), - - # Math - $self->block(sub { - my $class = "Math"; - return - ".$class =", - $self->globalObject( - $class, - $self->functionDeclare( - $class, - "abs", 1, - "acos", 1, - "asin", 1, - "atan", 1, - "atan2", 1, - "ceil", 1, - "cos", 1, - "exp", 1, - "floor", 1, - "log", 1, - "max", 2, - "min", 2, - "pow", 2, - "random", 0, - "round", 1, - "sin", 1, - "sqrt", 1, - "tan", 1, - ), - $self->numberConstantDeclare( - "E", "math.E", - "LN10", "math.Ln10", - "LN2", "math.Ln2", - "LOG2E", "math.Log2E", - "LOG10E", "math.Log10E", - "PI", "math.Pi", - "SQRT1_2", "sqrt1_2", - "SQRT2", "math.Sqrt2", - ) - ), - }), - - # Date - $self->block(sub { - my $class = "Date"; - my @got = $self->functionDeclare( - $class, - "toString", 0, - "toDateString", 0, - "toTimeString", 0, - "toUTCString", 0, - "toISOString", 0, - "toJSON", 1, - "toGMTString", 0, - "toLocaleString", 0, - "toLocaleDateString", 0, - "toLocaleTimeString", 0, - "valueOf", 0, - "getTime", 0, - "getYear", 0, - "getFullYear", 0, - "getUTCFullYear", 0, - "getMonth", 0, - "getUTCMonth", 0, - "getDate", 0, - "getUTCDate", 0, - "getDay", 0, - "getUTCDay", 0, - "getHours", 0, - "getUTCHours", 0, - "getMinutes", 0, - "getUTCMinutes", 0, - "getSeconds", 0, - "getUTCSeconds", 0, - "getMilliseconds", 0, - "getUTCMilliseconds", 0, - "getTimezoneOffset", 0, - "setTime", 1, - "setMilliseconds", 1, - "setUTCMilliseconds", 1, - "setSeconds", 2, - "setUTCSeconds", 2, - "setMinutes", 3, - "setUTCMinutes", 3, - "setHours", 4, - "setUTCHours", 4, - "setDate", 1, - "setUTCDate", 1, - "setMonth", 2, - "setUTCMonth", 2, - "setYear", 1, - "setFullYear", 3, - "setUTCFullYear", 3, - ); - return - ".${class}Prototype =", - $self->globalPrototype( - $class, - "_classObject", - ".ObjectPrototype", - "prototypeValueDate", - @got, - ), - ".$class =", - $self->globalFunction( - $class, - 7, - $self->functionDeclare( - $class, - "parse", 1, - "UTC", 7, - "now", 0, - ), - ), - }), - - # RegExp - $self->block(sub { - my $class = "RegExp"; - my @got = $self->functionDeclare( - $class, - "toString", 0, - "exec", 1, - "test", 1, - "compile", 1, - ); - return - ".${class}Prototype =", - $self->globalPrototype( - $class, - "_classObject", - ".ObjectPrototype", - "prototypeValueRegExp", - @got, - ), - ".$class =", - $self->globalFunction( - $class, - 2, - $self->functionDeclare( - $class, - ), - ), - }), - - # Error - $self->block(sub { - my $class = "Error"; - my @got = $self->functionDeclare( - $class, - "toString", 0, - ); - return - ".${class}Prototype =", - $self->globalPrototype( - $class, - "_classObject", - ".ObjectPrototype", - undef, - @got, - $self->property("name", $self->stringValue("Error")), - $self->property("message", $self->stringValue("")), - ), - ".$class =", - $self->globalFunction( - $class, - 1, - $self->functionDeclare( - $class, - ), - ), - }), - - (map { - my $class = "${_}Error"; - $self->block(sub { - my @got = $self->functionDeclare( - $class, - ); - return - ".${class}Prototype =", - $self->globalPrototype( - $class, - "_classObject", - ".ErrorPrototype", - undef, - @got, - $self->property("name", $self->stringValue($class)), - ), - ".$class =", - $self->globalFunction( - $class, - 1, - $self->functionDeclare( - $class, - ), - ), - }); - } qw/Eval Type Range Reference Syntax URI/), - - # JSON - $self->block(sub { - my $class = "JSON"; - return - ".$class =", - $self->globalObject( - $class, - $self->functionDeclare( - $class, - "parse", 2, - "stringify", 3, - ), - ), - }), - - # Global - $self->block(sub { - my $class = "Global"; - my @got = $self->functionDeclare( - $class, - "eval", 1, - "parseInt", 2, - "parseFloat", 1, - "isNaN", 1, - "isFinite", 1, - "decodeURI", 1, - "decodeURIComponent", 1, - "encodeURI", 1, - "encodeURIComponent", 1, - "escape", 1, - "unescape", 1, - ); - my @propertyMap = $self->propertyMap( - @got, - $self->globalDeclare( - "Object", - "Function", - "Array", - "String", - "Boolean", - "Number", - "Math", - "Date", - "RegExp", - "Error", - "EvalError", - "TypeError", - "RangeError", - "ReferenceError", - "SyntaxError", - "URIError", - "JSON", - ), - $self->property("undefined", $self->undefinedValue(), "0"), - $self->property("NaN", $self->numberValue("math.NaN()"), "0"), - $self->property("Infinity", $self->numberValue("math.Inf(+1)"), "0"), - ); - my $propertyOrder = $self->propertyOrder(@propertyMap); - $propertyOrder =~ s/^propertyOrder: //; - return - "runtime.globalObject.property =", - @propertyMap, - "runtime.globalObject.propertyOrder =", - $propertyOrder, - ; - }), - ; -} - -sub propertyMap { - my $self = shift; - return "map[string]_property{", (join ",\n", @_, ""), "}", -} - -our (@preblock, @postblock); -sub block { - my $self = shift; - local @preblock = (); - local @postblock = (); - my @input = $_[0]->(); - my @output; - while (@input) { - local $_ = shift @input; - if (m/^\./) { - $_ = "runtime.global$_"; - } - if (m/ :?=$/) { - $_ .= shift @input; - } - push @output, $_; - } - return - "{", - @preblock, - @output, - @postblock, - "}", - ; -} - -sub numberConstantDeclare { - my $self = shift; - my @got; - while (@_) { - my $name = shift; - my $value = shift; - push @got, $self->property($name, $self->numberValue($value), "0"), - } - return @got; -} - -sub functionDeclare { - my $self = shift; - my $class = shift; - my $builtin = "builtin${class}"; - my @got; - while (@_) { - my $name = shift; - my $length = shift; - $name = $self->newFunction($name, "${builtin}_", $length); - push @got, $self->functionProperty($name), - } - return @got; -} - -sub globalDeclare { - my $self = shift; - my @got; - while (@_) { - my $name = shift; - push @got, $self->property($name, $self->objectValue("runtime.global.$name"), "0101"), - } - return @got; -} - -sub propertyOrder { - my $self = shift; - my $propertyMap = join "", @_; - - my (@keys) = $propertyMap =~ m/("\w+"):/g; - my $propertyOrder = - join "\n", "propertyOrder: []string{", (join ",\n", @keys, ""), "}"; - return $propertyOrder; -} - -sub globalObject { - my $self = shift; - my $name = shift; - - my $propertyMap = ""; - if (@_) { - $propertyMap = join "\n", $self->propertyMap(@_); - my $propertyOrder = $self->propertyOrder($propertyMap); - $propertyMap = "property: $propertyMap,\n$propertyOrder,"; - } - - return trim <<_END_; -&_object{ - runtime: runtime, - class: "$name", - objectClass: _classObject, - prototype: runtime.global.ObjectPrototype, - extensible: true, - $propertyMap -} -_END_ -} - -sub globalFunction { - my $self = shift; - my $name = shift; - my $length = shift; - - my $builtin = "builtin${name}"; - my $builtinNew = "builtinNew${name}"; - my $prototype = "runtime.global.${name}Prototype"; - my $propertyMap = ""; - unshift @_, - $self->property("length", $self->numberValue($length), "0"), - $self->property("prototype", $self->objectValue($prototype), "0"), - ; - - if (@_) { - $propertyMap = join "\n", $self->propertyMap(@_); - my $propertyOrder = $self->propertyOrder($propertyMap); - $propertyMap = "property: $propertyMap,\n$propertyOrder,"; - } - - push @postblock, $self->statement( - "$prototype.property[\"constructor\"] =", - $self->property(undef, $self->objectValue("runtime.global.${name}"), "0101"), - ); - - return trim <<_END_; -&_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - value: @{[ $self->nativeFunctionOf($name, $builtin, $builtinNew) ]}, - $propertyMap -} -_END_ -} - -sub nativeCallFunction { - my $self = shift; - my $name = shift; - my $func = shift; - return trim <<_END_; -_nativeCallFunction{ "$name", $func } -_END_ -} - -sub globalPrototype { - my $self = shift; - my $class = shift; - my $classObject = shift; - my $prototype = shift; - my $value = shift; - - if (!defined $prototype) { - $prototype = "nil"; - } - - if (!defined $value) { - $value = "nil"; - } - - if ($prototype =~ m/^\./) { - $prototype = "runtime.global$prototype"; - } - - my $propertyMap = ""; - if (@_) { - $propertyMap = join "\n", $self->propertyMap(@_); - my $propertyOrder = $self->propertyOrder($propertyMap); - $propertyMap = "property: $propertyMap,\n$propertyOrder,"; - } - - return trim <<_END_; -&_object{ - runtime: runtime, - class: "$class", - objectClass: $classObject, - prototype: $prototype, - extensible: true, - value: $value, - $propertyMap -} -_END_ -} - -sub newFunction { - my $self = shift; - my $name = shift; - my $func = shift; - my $length = shift; - - my @name = ($name, $name); - if ($name =~ m/^(\w+):(\w+)$/) { - @name = ($1, $2); - $name = $name[0]; - } - - if ($func =~ m/^builtin\w+_$/) { - $func = "$func$name[1]"; - } - - my $propertyOrder = ""; - my @propertyMap = ( - $self->property("length", $self->numberValue($length), "0"), - ); - - if (@propertyMap) { - $propertyOrder = $self->propertyOrder(@propertyMap); - $propertyOrder = "$propertyOrder,"; - } - - my $label = functionLabel($name); - push @preblock, $self->statement( - "$label := @{[ trim <<_END_ ]}", -&_object{ - runtime: runtime, - class: "Function", - objectClass: _classObject, - prototype: runtime.global.FunctionPrototype, - extensible: true, - property: @{[ join "\n", $self->propertyMap(@propertyMap) ]}, - $propertyOrder - value: @{[ $self->nativeFunctionOf($name, $func) ]}, -} -_END_ - ); - - return $name; -} - -sub newObject { - my $self = shift; - - my $propertyMap = join "\n", $self->propertyMap(@_); - my $propertyOrder = $self->propertyOrder($propertyMap); - - return trim <<_END_; -&_object{ - runtime: runtime, - class: "Object", - objectClass: _classObject, - prototype: runtime.global.ObjectPrototype, - extensible: true, - property: $propertyMap, - $propertyOrder, -} -_END_ -} - -sub newPrototypeObject { - my $self = shift; - my $class = shift; - my $objectClass = shift; - my $value = shift; - if (defined $value) { - $value = "value: $value,"; - } - - my $propertyMap = join "\n", $self->propertyMap(@_); - my $propertyOrder = $self->propertyOrder($propertyMap); - - return trim <<_END_; -&_object{ - runtime: runtime, - class: "$class", - objectClass: $objectClass, - prototype: runtime.global.ObjectPrototype, - extensible: true, - property: $propertyMap, - $propertyOrder, - $value -} -_END_ -} - -sub functionProperty { - my $self = shift; - my $name = shift; - - return $self->property( - $name, - $self->objectValue(functionLabel($name)) - ); -} - -sub statement { - my $self = shift; - return join "\n", @_; -} - -sub functionOf { - my $self = shift; - my $call = shift; - my $construct = shift; - if ($construct) { - $construct = "construct: $construct,"; - } else { - $construct = ""; - } - - return trim <<_END_ -_functionObject{ - call: $call, - $construct -} -_END_ -} - -sub nativeFunctionOf { - my $self = shift; - my $name = shift; - my $call = shift; - my $construct = shift; - if ($construct) { - $construct = "construct: $construct,"; - } else { - $construct = ""; - } - - return trim <<_END_ -_nativeFunctionObject{ - name: "$name", - call: $call, - $construct -} -_END_ -} - -sub nameProperty { - my $self = shift; - my $name = shift; - my $value = shift; - - return trim <<_END_; -"$name": _property{ - mode: 0101, - value: $value, -} -_END_ -} - -sub numberValue { - my $self = shift; - my $value = shift; - return trim <<_END_; -Value{ - kind: valueNumber, - value: $value, -} -_END_ -} - -sub property { - my $self = shift; - my $name = shift; - my $value = shift; - my $mode = shift; - $mode = "0101" unless defined $mode; - if (! defined $value) { - $value = "Value{}"; - } - if (defined $name) { - return trim <<_END_; -"$name": _property{ - mode: $mode, - value: $value, -} -_END_ - } else { - return trim <<_END_; -_property{ - mode: $mode, - value: $value, -} -_END_ - } - -} - -sub objectProperty { - my $self = shift; - my $name = shift; - my $value = shift; - - return trim <<_END_; -"$name": _property{ - mode: 0101, - value: @{[ $self->objectValue($value)]}, -} -_END_ -} - -sub objectValue { - my $self = shift; - my $value = shift; - return trim <<_END_ -Value{ - kind: valueObject, - value: $value, -} -_END_ -} - -sub stringValue { - my $self = shift; - my $value = shift; - return trim <<_END_ -Value{ - kind: valueString, - value: "$value", -} -_END_ -} - -sub booleanValue { - my $self = shift; - my $value = shift; - return trim <<_END_ -Value{ - kind: valueBoolean, - value: $value, -} -_END_ -} - -sub undefinedValue { - my $self = shift; - return trim <<_END_ -Value{ - kind: valueUndefined, -} -_END_ -} diff --git a/vendor/github.com/robertkrimen/otto/object.go b/vendor/github.com/robertkrimen/otto/object.go deleted file mode 100644 index 849812c91422..000000000000 --- a/vendor/github.com/robertkrimen/otto/object.go +++ /dev/null @@ -1,156 +0,0 @@ -package otto - -type _object struct { - runtime *_runtime - - class string - objectClass *_objectClass - value interface{} - - prototype *_object - extensible bool - - property map[string]_property - propertyOrder []string -} - -func newObject(runtime *_runtime, class string) *_object { - self := &_object{ - runtime: runtime, - class: class, - objectClass: _classObject, - property: make(map[string]_property), - extensible: true, - } - return self -} - -// 8.12 - -// 8.12.1 -func (self *_object) getOwnProperty(name string) *_property { - return self.objectClass.getOwnProperty(self, name) -} - -// 8.12.2 -func (self *_object) getProperty(name string) *_property { - return self.objectClass.getProperty(self, name) -} - -// 8.12.3 -func (self *_object) get(name string) Value { - return self.objectClass.get(self, name) -} - -// 8.12.4 -func (self *_object) canPut(name string) bool { - return self.objectClass.canPut(self, name) -} - -// 8.12.5 -func (self *_object) put(name string, value Value, throw bool) { - self.objectClass.put(self, name, value, throw) -} - -// 8.12.6 -func (self *_object) hasProperty(name string) bool { - return self.objectClass.hasProperty(self, name) -} - -func (self *_object) hasOwnProperty(name string) bool { - return self.objectClass.hasOwnProperty(self, name) -} - -type _defaultValueHint int - -const ( - defaultValueNoHint _defaultValueHint = iota - defaultValueHintString - defaultValueHintNumber -) - -// 8.12.8 -func (self *_object) DefaultValue(hint _defaultValueHint) Value { - if hint == defaultValueNoHint { - if self.class == "Date" { - // Date exception - hint = defaultValueHintString - } else { - hint = defaultValueHintNumber - } - } - methodSequence := []string{"valueOf", "toString"} - if hint == defaultValueHintString { - methodSequence = []string{"toString", "valueOf"} - } - for _, methodName := range methodSequence { - method := self.get(methodName) - // FIXME This is redundant... - if method.isCallable() { - result := method._object().call(toValue_object(self), nil, false, nativeFrame) - if result.IsPrimitive() { - return result - } - } - } - - panic(self.runtime.panicTypeError()) -} - -func (self *_object) String() string { - return self.DefaultValue(defaultValueHintString).string() -} - -func (self *_object) defineProperty(name string, value Value, mode _propertyMode, throw bool) bool { - return self.defineOwnProperty(name, _property{value, mode}, throw) -} - -// 8.12.9 -func (self *_object) defineOwnProperty(name string, descriptor _property, throw bool) bool { - return self.objectClass.defineOwnProperty(self, name, descriptor, throw) -} - -func (self *_object) delete(name string, throw bool) bool { - return self.objectClass.delete(self, name, throw) -} - -func (self *_object) enumerate(all bool, each func(string) bool) { - self.objectClass.enumerate(self, all, each) -} - -func (self *_object) _exists(name string) bool { - _, exists := self.property[name] - return exists -} - -func (self *_object) _read(name string) (_property, bool) { - property, exists := self.property[name] - return property, exists -} - -func (self *_object) _write(name string, value interface{}, mode _propertyMode) { - if value == nil { - value = Value{} - } - _, exists := self.property[name] - self.property[name] = _property{value, mode} - if !exists { - self.propertyOrder = append(self.propertyOrder, name) - } -} - -func (self *_object) _delete(name string) { - _, exists := self.property[name] - delete(self.property, name) - if exists { - for index, property := range self.propertyOrder { - if name == property { - if index == len(self.propertyOrder)-1 { - self.propertyOrder = self.propertyOrder[:index] - } else { - self.propertyOrder = append(self.propertyOrder[:index], self.propertyOrder[index+1:]...) - } - } - } - } -} diff --git a/vendor/github.com/robertkrimen/otto/object_class.go b/vendor/github.com/robertkrimen/otto/object_class.go deleted file mode 100644 index d18b9cede02f..000000000000 --- a/vendor/github.com/robertkrimen/otto/object_class.go +++ /dev/null @@ -1,493 +0,0 @@ -package otto - -import ( - "encoding/json" -) - -type _objectClass struct { - getOwnProperty func(*_object, string) *_property - getProperty func(*_object, string) *_property - get func(*_object, string) Value - canPut func(*_object, string) bool - put func(*_object, string, Value, bool) - hasProperty func(*_object, string) bool - hasOwnProperty func(*_object, string) bool - defineOwnProperty func(*_object, string, _property, bool) bool - delete func(*_object, string, bool) bool - enumerate func(*_object, bool, func(string) bool) - clone func(*_object, *_object, *_clone) *_object - marshalJSON func(*_object) json.Marshaler -} - -func objectEnumerate(self *_object, all bool, each func(string) bool) { - for _, name := range self.propertyOrder { - if all || self.property[name].enumerable() { - if !each(name) { - return - } - } - } -} - -var ( - _classObject, - _classArray, - _classString, - _classArguments, - _classGoStruct, - _classGoMap, - _classGoArray, - _classGoSlice, - _ *_objectClass -) - -func init() { - _classObject = &_objectClass{ - objectGetOwnProperty, - objectGetProperty, - objectGet, - objectCanPut, - objectPut, - objectHasProperty, - objectHasOwnProperty, - objectDefineOwnProperty, - objectDelete, - objectEnumerate, - objectClone, - nil, - } - - _classArray = &_objectClass{ - objectGetOwnProperty, - objectGetProperty, - objectGet, - objectCanPut, - objectPut, - objectHasProperty, - objectHasOwnProperty, - arrayDefineOwnProperty, - objectDelete, - objectEnumerate, - objectClone, - nil, - } - - _classString = &_objectClass{ - stringGetOwnProperty, - objectGetProperty, - objectGet, - objectCanPut, - objectPut, - objectHasProperty, - objectHasOwnProperty, - objectDefineOwnProperty, - objectDelete, - stringEnumerate, - objectClone, - nil, - } - - _classArguments = &_objectClass{ - argumentsGetOwnProperty, - objectGetProperty, - argumentsGet, - objectCanPut, - objectPut, - objectHasProperty, - objectHasOwnProperty, - argumentsDefineOwnProperty, - argumentsDelete, - objectEnumerate, - objectClone, - nil, - } - - _classGoStruct = &_objectClass{ - goStructGetOwnProperty, - objectGetProperty, - objectGet, - goStructCanPut, - goStructPut, - objectHasProperty, - objectHasOwnProperty, - objectDefineOwnProperty, - objectDelete, - goStructEnumerate, - objectClone, - goStructMarshalJSON, - } - - _classGoMap = &_objectClass{ - goMapGetOwnProperty, - objectGetProperty, - objectGet, - objectCanPut, - objectPut, - objectHasProperty, - objectHasOwnProperty, - goMapDefineOwnProperty, - goMapDelete, - goMapEnumerate, - objectClone, - nil, - } - - _classGoArray = &_objectClass{ - goArrayGetOwnProperty, - objectGetProperty, - objectGet, - objectCanPut, - objectPut, - objectHasProperty, - objectHasOwnProperty, - goArrayDefineOwnProperty, - goArrayDelete, - goArrayEnumerate, - objectClone, - nil, - } - - _classGoSlice = &_objectClass{ - goSliceGetOwnProperty, - objectGetProperty, - objectGet, - objectCanPut, - objectPut, - objectHasProperty, - objectHasOwnProperty, - goSliceDefineOwnProperty, - goSliceDelete, - goSliceEnumerate, - objectClone, - nil, - } -} - -// Allons-y - -// 8.12.1 -func objectGetOwnProperty(self *_object, name string) *_property { - // Return a _copy_ of the property - property, exists := self._read(name) - if !exists { - return nil - } - return &property -} - -// 8.12.2 -func objectGetProperty(self *_object, name string) *_property { - property := self.getOwnProperty(name) - if property != nil { - return property - } - if self.prototype != nil { - return self.prototype.getProperty(name) - } - return nil -} - -// 8.12.3 -func objectGet(self *_object, name string) Value { - property := self.getProperty(name) - if property != nil { - return property.get(self) - } - return Value{} -} - -// 8.12.4 -func objectCanPut(self *_object, name string) bool { - canPut, _, _ := _objectCanPut(self, name) - return canPut -} - -func _objectCanPut(self *_object, name string) (canPut bool, property *_property, setter *_object) { - property = self.getOwnProperty(name) - if property != nil { - switch propertyValue := property.value.(type) { - case Value: - canPut = property.writable() - return - case _propertyGetSet: - setter = propertyValue[1] - canPut = setter != nil - return - default: - panic(self.runtime.panicTypeError()) - } - } - - if self.prototype == nil { - return self.extensible, nil, nil - } - - property = self.prototype.getProperty(name) - if property == nil { - return self.extensible, nil, nil - } - - switch propertyValue := property.value.(type) { - case Value: - if !self.extensible { - return false, nil, nil - } - return property.writable(), nil, nil - case _propertyGetSet: - setter = propertyValue[1] - canPut = setter != nil - return - default: - panic(self.runtime.panicTypeError()) - } -} - -// 8.12.5 -func objectPut(self *_object, name string, value Value, throw bool) { - - if true { - // Shortcut... - // - // So, right now, every class is using objectCanPut and every class - // is using objectPut. - // - // If that were to no longer be the case, we would have to have - // something to detect that here, so that we do not use an - // incompatible canPut routine - canPut, property, setter := _objectCanPut(self, name) - if !canPut { - self.runtime.typeErrorResult(throw) - } else if setter != nil { - setter.call(toValue(self), []Value{value}, false, nativeFrame) - } else if property != nil { - property.value = value - self.defineOwnProperty(name, *property, throw) - } else { - self.defineProperty(name, value, 0111, throw) - } - return - } - - // The long way... - // - // Right now, code should never get here, see above - if !self.canPut(name) { - self.runtime.typeErrorResult(throw) - return - } - - property := self.getOwnProperty(name) - if property == nil { - property = self.getProperty(name) - if property != nil { - if getSet, isAccessor := property.value.(_propertyGetSet); isAccessor { - getSet[1].call(toValue(self), []Value{value}, false, nativeFrame) - return - } - } - self.defineProperty(name, value, 0111, throw) - } else { - switch propertyValue := property.value.(type) { - case Value: - property.value = value - self.defineOwnProperty(name, *property, throw) - case _propertyGetSet: - if propertyValue[1] != nil { - propertyValue[1].call(toValue(self), []Value{value}, false, nativeFrame) - return - } - if throw { - panic(self.runtime.panicTypeError()) - } - default: - panic(self.runtime.panicTypeError()) - } - } -} - -// 8.12.6 -func objectHasProperty(self *_object, name string) bool { - return self.getProperty(name) != nil -} - -func objectHasOwnProperty(self *_object, name string) bool { - return self.getOwnProperty(name) != nil -} - -// 8.12.9 -func objectDefineOwnProperty(self *_object, name string, descriptor _property, throw bool) bool { - property, exists := self._read(name) - { - if !exists { - if !self.extensible { - goto Reject - } - if newGetSet, isAccessor := descriptor.value.(_propertyGetSet); isAccessor { - if newGetSet[0] == &_nilGetSetObject { - newGetSet[0] = nil - } - if newGetSet[1] == &_nilGetSetObject { - newGetSet[1] = nil - } - descriptor.value = newGetSet - } - self._write(name, descriptor.value, descriptor.mode) - return true - } - if descriptor.isEmpty() { - return true - } - - // TODO Per 8.12.9.6 - We should shortcut here (returning true) if - // the current and new (define) properties are the same - - configurable := property.configurable() - if !configurable { - if descriptor.configurable() { - goto Reject - } - // Test that, if enumerable is set on the property descriptor, then it should - // be the same as the existing property - if descriptor.enumerateSet() && descriptor.enumerable() != property.enumerable() { - goto Reject - } - } - value, isDataDescriptor := property.value.(Value) - getSet, _ := property.value.(_propertyGetSet) - if descriptor.isGenericDescriptor() { - // GenericDescriptor - } else if isDataDescriptor != descriptor.isDataDescriptor() { - // DataDescriptor <=> AccessorDescriptor - if !configurable { - goto Reject - } - } else if isDataDescriptor && descriptor.isDataDescriptor() { - // DataDescriptor <=> DataDescriptor - if !configurable { - if !property.writable() && descriptor.writable() { - goto Reject - } - if !property.writable() { - if descriptor.value != nil && !sameValue(value, descriptor.value.(Value)) { - goto Reject - } - } - } - } else { - // AccessorDescriptor <=> AccessorDescriptor - newGetSet, _ := descriptor.value.(_propertyGetSet) - presentGet, presentSet := true, true - if newGetSet[0] == &_nilGetSetObject { - // Present, but nil - newGetSet[0] = nil - } else if newGetSet[0] == nil { - // Missing, not even nil - newGetSet[0] = getSet[0] - presentGet = false - } - if newGetSet[1] == &_nilGetSetObject { - // Present, but nil - newGetSet[1] = nil - } else if newGetSet[1] == nil { - // Missing, not even nil - newGetSet[1] = getSet[1] - presentSet = false - } - if !configurable { - if (presentGet && (getSet[0] != newGetSet[0])) || (presentSet && (getSet[1] != newGetSet[1])) { - goto Reject - } - } - descriptor.value = newGetSet - } - { - // This section will preserve attributes of - // the original property, if necessary - value1 := descriptor.value - if value1 == nil { - value1 = property.value - } else if newGetSet, isAccessor := descriptor.value.(_propertyGetSet); isAccessor { - if newGetSet[0] == &_nilGetSetObject { - newGetSet[0] = nil - } - if newGetSet[1] == &_nilGetSetObject { - newGetSet[1] = nil - } - value1 = newGetSet - } - mode1 := descriptor.mode - if mode1&0222 != 0 { - // TODO Factor this out into somewhere testable - // (Maybe put into switch ...) - mode0 := property.mode - if mode1&0200 != 0 { - if descriptor.isDataDescriptor() { - mode1 &= ^0200 // Turn off "writable" missing - mode1 |= (mode0 & 0100) - } - } - if mode1&020 != 0 { - mode1 |= (mode0 & 010) - } - if mode1&02 != 0 { - mode1 |= (mode0 & 01) - } - mode1 &= 0311 // 0311 to preserve the non-setting on "writable" - } - self._write(name, value1, mode1) - } - return true - } -Reject: - if throw { - panic(self.runtime.panicTypeError()) - } - return false -} - -func objectDelete(self *_object, name string, throw bool) bool { - property_ := self.getOwnProperty(name) - if property_ == nil { - return true - } - if property_.configurable() { - self._delete(name) - return true - } - return self.runtime.typeErrorResult(throw) -} - -func objectClone(in *_object, out *_object, clone *_clone) *_object { - *out = *in - - out.runtime = clone.runtime - if out.prototype != nil { - out.prototype = clone.object(in.prototype) - } - out.property = make(map[string]_property, len(in.property)) - out.propertyOrder = make([]string, len(in.propertyOrder)) - copy(out.propertyOrder, in.propertyOrder) - for index, property := range in.property { - out.property[index] = clone.property(property) - } - - switch value := in.value.(type) { - case _nativeFunctionObject: - out.value = value - case _bindFunctionObject: - out.value = _bindFunctionObject{ - target: clone.object(value.target), - this: clone.value(value.this), - argumentList: clone.valueArray(value.argumentList), - } - case _nodeFunctionObject: - out.value = _nodeFunctionObject{ - node: value.node, - stash: clone.stash(value.stash), - } - case _argumentsObject: - out.value = value.clone(clone) - } - - return out -} diff --git a/vendor/github.com/robertkrimen/otto/otto.go b/vendor/github.com/robertkrimen/otto/otto.go deleted file mode 100644 index b5b528d53b53..000000000000 --- a/vendor/github.com/robertkrimen/otto/otto.go +++ /dev/null @@ -1,770 +0,0 @@ -/* -Package otto is a JavaScript parser and interpreter written natively in Go. - -http://godoc.org/github.com/robertkrimen/otto - - import ( - "github.com/robertkrimen/otto" - ) - -Run something in the VM - - vm := otto.New() - vm.Run(` - abc = 2 + 2; - console.log("The value of abc is " + abc); // 4 - `) - -Get a value out of the VM - - value, err := vm.Get("abc") - value, _ := value.ToInteger() - } - -Set a number - - vm.Set("def", 11) - vm.Run(` - console.log("The value of def is " + def); - // The value of def is 11 - `) - -Set a string - - vm.Set("xyzzy", "Nothing happens.") - vm.Run(` - console.log(xyzzy.length); // 16 - `) - -Get the value of an expression - - value, _ = vm.Run("xyzzy.length") - { - // value is an int64 with a value of 16 - value, _ := value.ToInteger() - } - -An error happens - - value, err = vm.Run("abcdefghijlmnopqrstuvwxyz.length") - if err != nil { - // err = ReferenceError: abcdefghijlmnopqrstuvwxyz is not defined - // If there is an error, then value.IsUndefined() is true - ... - } - -Set a Go function - - vm.Set("sayHello", func(call otto.FunctionCall) otto.Value { - fmt.Printf("Hello, %s.\n", call.Argument(0).String()) - return otto.Value{} - }) - -Set a Go function that returns something useful - - vm.Set("twoPlus", func(call otto.FunctionCall) otto.Value { - right, _ := call.Argument(0).ToInteger() - result, _ := vm.ToValue(2 + right) - return result - }) - -Use the functions in JavaScript - - result, _ = vm.Run(` - sayHello("Xyzzy"); // Hello, Xyzzy. - sayHello(); // Hello, undefined - - result = twoPlus(2.0); // 4 - `) - -Parser - -A separate parser is available in the parser package if you're just interested in building an AST. - -http://godoc.org/github.com/robertkrimen/otto/parser - -Parse and return an AST - - filename := "" // A filename is optional - src := ` - // Sample xyzzy example - (function(){ - if (3.14159 > 0) { - console.log("Hello, World."); - return; - } - - var xyzzy = NaN; - console.log("Nothing happens."); - return xyzzy; - })(); - ` - - // Parse some JavaScript, yielding a *ast.Program and/or an ErrorList - program, err := parser.ParseFile(nil, filename, src, 0) - -otto - -You can run (Go) JavaScript from the commandline with: http://github.com/robertkrimen/otto/tree/master/otto - - $ go get -v github.com/robertkrimen/otto/otto - -Run JavaScript by entering some source on stdin or by giving otto a filename: - - $ otto example.js - -underscore - -Optionally include the JavaScript utility-belt library, underscore, with this import: - - import ( - "github.com/robertkrimen/otto" - _ "github.com/robertkrimen/otto/underscore" - ) - - // Now every otto runtime will come loaded with underscore - -For more information: http://github.com/robertkrimen/otto/tree/master/underscore - -Caveat Emptor - -The following are some limitations with otto: - - * "use strict" will parse, but does nothing. - * The regular expression engine (re2/regexp) is not fully compatible with the ECMA5 specification. - * Otto targets ES5. ES6 features (eg: Typed Arrays) are not supported. - -Regular Expression Incompatibility - -Go translates JavaScript-style regular expressions into something that is "regexp" compatible via `parser.TransformRegExp`. -Unfortunately, RegExp requires backtracking for some patterns, and backtracking is not supported by the standard Go engine: https://code.google.com/p/re2/wiki/Syntax - -Therefore, the following syntax is incompatible: - - (?=) // Lookahead (positive), currently a parsing error - (?!) // Lookahead (backhead), currently a parsing error - \1 // Backreference (\1, \2, \3, ...), currently a parsing error - -A brief discussion of these limitations: "Regexp (?!re)" https://groups.google.com/forum/?fromgroups=#%21topic/golang-nuts/7qgSDWPIh_E - -More information about re2: https://code.google.com/p/re2/ - -In addition to the above, re2 (Go) has a different definition for \s: [\t\n\f\r ]. -The JavaScript definition, on the other hand, also includes \v, Unicode "Separator, Space", etc. - -Halting Problem - -If you want to stop long running executions (like third-party code), you can use the interrupt channel to do this: - - package main - - import ( - "errors" - "fmt" - "os" - "time" - - "github.com/robertkrimen/otto" - ) - - var halt = errors.New("Stahp") - - func main() { - runUnsafe(`var abc = [];`) - runUnsafe(` - while (true) { - // Loop forever - }`) - } - - func runUnsafe(unsafe string) { - start := time.Now() - defer func() { - duration := time.Since(start) - if caught := recover(); caught != nil { - if caught == halt { - fmt.Fprintf(os.Stderr, "Some code took to long! Stopping after: %v\n", duration) - return - } - panic(caught) // Something else happened, repanic! - } - fmt.Fprintf(os.Stderr, "Ran code successfully: %v\n", duration) - }() - - vm := otto.New() - vm.Interrupt = make(chan func(), 1) // The buffer prevents blocking - - go func() { - time.Sleep(2 * time.Second) // Stop after two seconds - vm.Interrupt <- func() { - panic(halt) - } - }() - - vm.Run(unsafe) // Here be dragons (risky code) - } - -Where is setTimeout/setInterval? - -These timing functions are not actually part of the ECMA-262 specification. Typically, they belong to the `windows` object (in the browser). -It would not be difficult to provide something like these via Go, but you probably want to wrap otto in an event loop in that case. - -For an example of how this could be done in Go with otto, see natto: - -http://github.com/robertkrimen/natto - -Here is some more discussion of the issue: - -* http://book.mixu.net/node/ch2.html - -* http://en.wikipedia.org/wiki/Reentrancy_%28computing%29 - -* http://aaroncrane.co.uk/2009/02/perl_safe_signals/ - -*/ -package otto - -import ( - "fmt" - "strings" - - "github.com/robertkrimen/otto/file" - "github.com/robertkrimen/otto/registry" -) - -// Otto is the representation of the JavaScript runtime. Each instance of Otto has a self-contained namespace. -type Otto struct { - // Interrupt is a channel for interrupting the runtime. You can use this to halt a long running execution, for example. - // See "Halting Problem" for more information. - Interrupt chan func() - runtime *_runtime -} - -// New will allocate a new JavaScript runtime -func New() *Otto { - self := &Otto{ - runtime: newContext(), - } - self.runtime.otto = self - self.runtime.traceLimit = 10 - self.Set("console", self.runtime.newConsole()) - - registry.Apply(func(entry registry.Entry) { - self.Run(entry.Source()) - }) - - return self -} - -func (otto *Otto) clone() *Otto { - self := &Otto{ - runtime: otto.runtime.clone(), - } - self.runtime.otto = self - return self -} - -// Run will allocate a new JavaScript runtime, run the given source -// on the allocated runtime, and return the runtime, resulting value, and -// error (if any). -// -// src may be a string, a byte slice, a bytes.Buffer, or an io.Reader, but it MUST always be in UTF-8. -// -// src may also be a Script. -// -// src may also be a Program, but if the AST has been modified, then runtime behavior is undefined. -// -func Run(src interface{}) (*Otto, Value, error) { - otto := New() - value, err := otto.Run(src) // This already does safety checking - return otto, value, err -} - -// Run will run the given source (parsing it first if necessary), returning the resulting value and error (if any) -// -// src may be a string, a byte slice, a bytes.Buffer, or an io.Reader, but it MUST always be in UTF-8. -// -// If the runtime is unable to parse source, then this function will return undefined and the parse error (nothing -// will be evaluated in this case). -// -// src may also be a Script. -// -// src may also be a Program, but if the AST has been modified, then runtime behavior is undefined. -// -func (self Otto) Run(src interface{}) (Value, error) { - value, err := self.runtime.cmpl_run(src, nil) - if !value.safe() { - value = Value{} - } - return value, err -} - -// Eval will do the same thing as Run, except without leaving the current scope. -// -// By staying in the same scope, the code evaluated has access to everything -// already defined in the current stack frame. This is most useful in, for -// example, a debugger call. -func (self Otto) Eval(src interface{}) (Value, error) { - if self.runtime.scope == nil { - self.runtime.enterGlobalScope() - defer self.runtime.leaveScope() - } - - value, err := self.runtime.cmpl_eval(src, nil) - if !value.safe() { - value = Value{} - } - return value, err -} - -// Get the value of the top-level binding of the given name. -// -// If there is an error (like the binding does not exist), then the value -// will be undefined. -func (self Otto) Get(name string) (Value, error) { - value := Value{} - err := catchPanic(func() { - value = self.getValue(name) - }) - if !value.safe() { - value = Value{} - } - return value, err -} - -func (self Otto) getValue(name string) Value { - return self.runtime.globalStash.getBinding(name, false) -} - -// Set the top-level binding of the given name to the given value. -// -// Set will automatically apply ToValue to the given value in order -// to convert it to a JavaScript value (type Value). -// -// If there is an error (like the binding is read-only, or the ToValue conversion -// fails), then an error is returned. -// -// If the top-level binding does not exist, it will be created. -func (self Otto) Set(name string, value interface{}) error { - { - value, err := self.ToValue(value) - if err != nil { - return err - } - err = catchPanic(func() { - self.setValue(name, value) - }) - return err - } -} - -func (self Otto) setValue(name string, value Value) { - self.runtime.globalStash.setValue(name, value, false) -} - -func (self Otto) SetDebuggerHandler(fn func(vm *Otto)) { - self.runtime.debugger = fn -} - -func (self Otto) SetRandomSource(fn func() float64) { - self.runtime.random = fn -} - -// SetStackDepthLimit sets an upper limit to the depth of the JavaScript -// stack. In simpler terms, this limits the number of "nested" function calls -// you can make in a particular interpreter instance. -// -// Note that this doesn't take into account the Go stack depth. If your -// JavaScript makes a call to a Go function, otto won't keep track of what -// happens outside the interpreter. So if your Go function is infinitely -// recursive, you're still in trouble. -func (self Otto) SetStackDepthLimit(limit int) { - self.runtime.stackLimit = limit -} - -// SetStackTraceLimit sets an upper limit to the number of stack frames that -// otto will use when formatting an error's stack trace. By default, the limit -// is 10. This is consistent with V8 and SpiderMonkey. -// -// TODO: expose via `Error.stackTraceLimit` -func (self Otto) SetStackTraceLimit(limit int) { - self.runtime.traceLimit = limit -} - -// MakeCustomError creates a new Error object with the given name and message, -// returning it as a Value. -func (self Otto) MakeCustomError(name, message string) Value { - return self.runtime.toValue(self.runtime.newError(name, self.runtime.toValue(message), 0)) -} - -// MakeRangeError creates a new RangeError object with the given message, -// returning it as a Value. -func (self Otto) MakeRangeError(message string) Value { - return self.runtime.toValue(self.runtime.newRangeError(self.runtime.toValue(message))) -} - -// MakeSyntaxError creates a new SyntaxError object with the given message, -// returning it as a Value. -func (self Otto) MakeSyntaxError(message string) Value { - return self.runtime.toValue(self.runtime.newSyntaxError(self.runtime.toValue(message))) -} - -// MakeTypeError creates a new TypeError object with the given message, -// returning it as a Value. -func (self Otto) MakeTypeError(message string) Value { - return self.runtime.toValue(self.runtime.newTypeError(self.runtime.toValue(message))) -} - -// Context is a structure that contains information about the current execution -// context. -type Context struct { - Filename string - Line int - Column int - Callee string - Symbols map[string]Value - This Value - Stacktrace []string -} - -// Context returns the current execution context of the vm, traversing up to -// ten stack frames, and skipping any innermost native function stack frames. -func (self Otto) Context() Context { - return self.ContextSkip(10, true) -} - -// ContextLimit returns the current execution context of the vm, with a -// specific limit on the number of stack frames to traverse, skipping any -// innermost native function stack frames. -func (self Otto) ContextLimit(limit int) Context { - return self.ContextSkip(limit, true) -} - -// ContextSkip returns the current execution context of the vm, with a -// specific limit on the number of stack frames to traverse, optionally -// skipping any innermost native function stack frames. -func (self Otto) ContextSkip(limit int, skipNative bool) (ctx Context) { - // Ensure we are operating in a scope - if self.runtime.scope == nil { - self.runtime.enterGlobalScope() - defer self.runtime.leaveScope() - } - - scope := self.runtime.scope - frame := scope.frame - - for skipNative && frame.native && scope.outer != nil { - scope = scope.outer - frame = scope.frame - } - - // Get location information - ctx.Filename = "" - ctx.Callee = frame.callee - - switch { - case frame.native: - ctx.Filename = frame.nativeFile - ctx.Line = frame.nativeLine - ctx.Column = 0 - case frame.file != nil: - ctx.Filename = "" - - if p := frame.file.Position(file.Idx(frame.offset)); p != nil { - ctx.Line = p.Line - ctx.Column = p.Column - - if p.Filename != "" { - ctx.Filename = p.Filename - } - } - } - - // Get the current scope this Value - ctx.This = toValue_object(scope.this) - - // Build stacktrace (up to 10 levels deep) - ctx.Symbols = make(map[string]Value) - ctx.Stacktrace = append(ctx.Stacktrace, frame.location()) - for limit != 0 { - // Get variables - stash := scope.lexical - for { - for _, name := range getStashProperties(stash) { - if _, ok := ctx.Symbols[name]; !ok { - ctx.Symbols[name] = stash.getBinding(name, true) - } - } - stash = stash.outer() - if stash == nil || stash.outer() == nil { - break - } - } - - scope = scope.outer - if scope == nil { - break - } - if scope.frame.offset >= 0 { - ctx.Stacktrace = append(ctx.Stacktrace, scope.frame.location()) - } - limit-- - } - - return -} - -// Call the given JavaScript with a given this and arguments. -// -// If this is nil, then some special handling takes place to determine the proper -// this value, falling back to a "standard" invocation if necessary (where this is -// undefined). -// -// If source begins with "new " (A lowercase new followed by a space), then -// Call will invoke the function constructor rather than performing a function call. -// In this case, the this argument has no effect. -// -// // value is a String object -// value, _ := vm.Call("Object", nil, "Hello, World.") -// -// // Likewise... -// value, _ := vm.Call("new Object", nil, "Hello, World.") -// -// // This will perform a concat on the given array and return the result -// // value is [ 1, 2, 3, undefined, 4, 5, 6, 7, "abc" ] -// value, _ := vm.Call(`[ 1, 2, 3, undefined, 4 ].concat`, nil, 5, 6, 7, "abc") -// -func (self Otto) Call(source string, this interface{}, argumentList ...interface{}) (Value, error) { - - thisValue := Value{} - - construct := false - if strings.HasPrefix(source, "new ") { - source = source[4:] - construct = true - } - - // FIXME enterGlobalScope - self.runtime.enterGlobalScope() - defer func() { - self.runtime.leaveScope() - }() - - if !construct && this == nil { - program, err := self.runtime.cmpl_parse("", source+"()", nil) - if err == nil { - if node, ok := program.body[0].(*_nodeExpressionStatement); ok { - if node, ok := node.expression.(*_nodeCallExpression); ok { - var value Value - err := catchPanic(func() { - value = self.runtime.cmpl_evaluate_nodeCallExpression(node, argumentList) - }) - if err != nil { - return Value{}, err - } - return value, nil - } - } - } - } else { - value, err := self.ToValue(this) - if err != nil { - return Value{}, err - } - thisValue = value - } - - { - this := thisValue - - fn, err := self.Run(source) - if err != nil { - return Value{}, err - } - - if construct { - result, err := fn.constructSafe(self.runtime, this, argumentList...) - if err != nil { - return Value{}, err - } - return result, nil - } - - result, err := fn.Call(this, argumentList...) - if err != nil { - return Value{}, err - } - return result, nil - } -} - -// Object will run the given source and return the result as an object. -// -// For example, accessing an existing object: -// -// object, _ := vm.Object(`Number`) -// -// Or, creating a new object: -// -// object, _ := vm.Object(`({ xyzzy: "Nothing happens." })`) -// -// Or, creating and assigning an object: -// -// object, _ := vm.Object(`xyzzy = {}`) -// object.Set("volume", 11) -// -// If there is an error (like the source does not result in an object), then -// nil and an error is returned. -func (self Otto) Object(source string) (*Object, error) { - value, err := self.runtime.cmpl_run(source, nil) - if err != nil { - return nil, err - } - if value.IsObject() { - return value.Object(), nil - } - return nil, fmt.Errorf("value is not an object") -} - -// ToValue will convert an interface{} value to a value digestible by otto/JavaScript. -func (self Otto) ToValue(value interface{}) (Value, error) { - return self.runtime.safeToValue(value) -} - -// Copy will create a copy/clone of the runtime. -// -// Copy is useful for saving some time when creating many similar runtimes. -// -// This method works by walking the original runtime and cloning each object, scope, stash, -// etc. into a new runtime. -// -// Be on the lookout for memory leaks or inadvertent sharing of resources. -func (in *Otto) Copy() *Otto { - out := &Otto{ - runtime: in.runtime.clone(), - } - out.runtime.otto = out - return out -} - -// Object{} - -// Object is the representation of a JavaScript object. -type Object struct { - object *_object - value Value -} - -func _newObject(object *_object, value Value) *Object { - // value MUST contain object! - return &Object{ - object: object, - value: value, - } -} - -// Call a method on the object. -// -// It is essentially equivalent to: -// -// var method, _ := object.Get(name) -// method.Call(object, argumentList...) -// -// An undefined value and an error will result if: -// -// 1. There is an error during conversion of the argument list -// 2. The property is not actually a function -// 3. An (uncaught) exception is thrown -// -func (self Object) Call(name string, argumentList ...interface{}) (Value, error) { - // TODO: Insert an example using JavaScript below... - // e.g., Object("JSON").Call("stringify", ...) - - function, err := self.Get(name) - if err != nil { - return Value{}, err - } - return function.Call(self.Value(), argumentList...) -} - -// Value will return self as a value. -func (self Object) Value() Value { - return self.value -} - -// Get the value of the property with the given name. -func (self Object) Get(name string) (Value, error) { - value := Value{} - err := catchPanic(func() { - value = self.object.get(name) - }) - if !value.safe() { - value = Value{} - } - return value, err -} - -// Set the property of the given name to the given value. -// -// An error will result if the setting the property triggers an exception (i.e. read-only), -// or there is an error during conversion of the given value. -func (self Object) Set(name string, value interface{}) error { - { - value, err := self.object.runtime.safeToValue(value) - if err != nil { - return err - } - err = catchPanic(func() { - self.object.put(name, value, true) - }) - return err - } -} - -// Keys gets the keys for the given object. -// -// Equivalent to calling Object.keys on the object. -func (self Object) Keys() []string { - var keys []string - self.object.enumerate(false, func(name string) bool { - keys = append(keys, name) - return true - }) - return keys -} - -// KeysByParent gets the keys (and those of the parents) for the given object, -// in order of "closest" to "furthest". -func (self Object) KeysByParent() [][]string { - var a [][]string - - for o := self.object; o != nil; o = o.prototype { - var l []string - - o.enumerate(false, func(name string) bool { - l = append(l, name) - return true - }) - - a = append(a, l) - } - - return a -} - -// Class will return the class string of the object. -// -// The return value will (generally) be one of: -// -// Object -// Function -// Array -// String -// Number -// Boolean -// Date -// RegExp -// -func (self Object) Class() string { - return self.object.class -} diff --git a/vendor/github.com/robertkrimen/otto/otto_.go b/vendor/github.com/robertkrimen/otto/otto_.go deleted file mode 100644 index 304a831508ba..000000000000 --- a/vendor/github.com/robertkrimen/otto/otto_.go +++ /dev/null @@ -1,178 +0,0 @@ -package otto - -import ( - "fmt" - "regexp" - runtime_ "runtime" - "strconv" - "strings" -) - -var isIdentifier_Regexp *regexp.Regexp = regexp.MustCompile(`^[a-zA-Z\$][a-zA-Z0-9\$]*$`) - -func isIdentifier(string_ string) bool { - return isIdentifier_Regexp.MatchString(string_) -} - -func (self *_runtime) toValueArray(arguments ...interface{}) []Value { - length := len(arguments) - if length == 1 { - if valueArray, ok := arguments[0].([]Value); ok { - return valueArray - } - return []Value{self.toValue(arguments[0])} - } - - valueArray := make([]Value, length) - for index, value := range arguments { - valueArray[index] = self.toValue(value) - } - - return valueArray -} - -func stringToArrayIndex(name string) int64 { - index, err := strconv.ParseInt(name, 10, 64) - if err != nil { - return -1 - } - if index < 0 { - return -1 - } - if index >= maxUint32 { - // The value 2^32 (or above) is not a valid index because - // you cannot store a uint32 length for an index of uint32 - return -1 - } - return index -} - -func isUint32(value int64) bool { - return value >= 0 && value <= maxUint32 -} - -func arrayIndexToString(index int64) string { - return strconv.FormatInt(index, 10) -} - -func valueOfArrayIndex(array []Value, index int) Value { - value, _ := getValueOfArrayIndex(array, index) - return value -} - -func getValueOfArrayIndex(array []Value, index int) (Value, bool) { - if index >= 0 && index < len(array) { - value := array[index] - if !value.isEmpty() { - return value, true - } - } - return Value{}, false -} - -// A range index can be anything from 0 up to length. It is NOT safe to use as an index -// to an array, but is useful for slicing and in some ECMA algorithms. -func valueToRangeIndex(indexValue Value, length int64, negativeIsZero bool) int64 { - index := indexValue.number().int64 - if negativeIsZero { - if index < 0 { - index = 0 - } - // minimum(index, length) - if index >= length { - index = length - } - return index - } - - if index < 0 { - index += length - if index < 0 { - index = 0 - } - } else { - if index > length { - index = length - } - } - return index -} - -func rangeStartEnd(array []Value, size int64, negativeIsZero bool) (start, end int64) { - start = valueToRangeIndex(valueOfArrayIndex(array, 0), size, negativeIsZero) - if len(array) == 1 { - // If there is only the start argument, then end = size - end = size - return - } - - // Assuming the argument is undefined... - end = size - endValue := valueOfArrayIndex(array, 1) - if !endValue.IsUndefined() { - // Which it is not, so get the value as an array index - end = valueToRangeIndex(endValue, size, negativeIsZero) - } - return -} - -func rangeStartLength(source []Value, size int64) (start, length int64) { - start = valueToRangeIndex(valueOfArrayIndex(source, 0), size, false) - - // Assume the second argument is missing or undefined - length = int64(size) - if len(source) == 1 { - // If there is only the start argument, then length = size - return - } - - lengthValue := valueOfArrayIndex(source, 1) - if !lengthValue.IsUndefined() { - // Which it is not, so get the value as an array index - length = lengthValue.number().int64 - } - return -} - -func boolFields(input string) (result map[string]bool) { - result = map[string]bool{} - for _, word := range strings.Fields(input) { - result[word] = true - } - return result -} - -func hereBeDragons(arguments ...interface{}) string { - pc, _, _, _ := runtime_.Caller(1) - name := runtime_.FuncForPC(pc).Name() - message := fmt.Sprintf("Here be dragons -- %s", name) - if len(arguments) > 0 { - message += ": " - argument0 := fmt.Sprintf("%s", arguments[0]) - if len(arguments) == 1 { - message += argument0 - } else { - message += fmt.Sprintf(argument0, arguments[1:]...) - } - } else { - message += "." - } - return message -} - -func throwHereBeDragons(arguments ...interface{}) { - panic(hereBeDragons(arguments...)) -} - -func eachPair(list []interface{}, fn func(_0, _1 interface{})) { - for len(list) > 0 { - var _0, _1 interface{} - _0 = list[0] - list = list[1:] // Pop off first - if len(list) > 0 { - _1 = list[0] - list = list[1:] // Pop off second - } - fn(_0, _1) - } -} diff --git a/vendor/github.com/robertkrimen/otto/parser/Makefile b/vendor/github.com/robertkrimen/otto/parser/Makefile deleted file mode 100644 index 766fd4d0b3bc..000000000000 --- a/vendor/github.com/robertkrimen/otto/parser/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -.PHONY: test - -test: - go test diff --git a/vendor/github.com/robertkrimen/otto/parser/README.markdown b/vendor/github.com/robertkrimen/otto/parser/README.markdown deleted file mode 100644 index c3cae5b603c9..000000000000 --- a/vendor/github.com/robertkrimen/otto/parser/README.markdown +++ /dev/null @@ -1,190 +0,0 @@ -# parser --- - import "github.com/robertkrimen/otto/parser" - -Package parser implements a parser for JavaScript. - - import ( - "github.com/robertkrimen/otto/parser" - ) - -Parse and return an AST - - filename := "" // A filename is optional - src := ` - // Sample xyzzy example - (function(){ - if (3.14159 > 0) { - console.log("Hello, World."); - return; - } - - var xyzzy = NaN; - console.log("Nothing happens."); - return xyzzy; - })(); - ` - - // Parse some JavaScript, yielding a *ast.Program and/or an ErrorList - program, err := parser.ParseFile(nil, filename, src, 0) - - -### Warning - -The parser and AST interfaces are still works-in-progress (particularly where -node types are concerned) and may change in the future. - -## Usage - -#### func ParseFile - -```go -func ParseFile(fileSet *file.FileSet, filename string, src interface{}, mode Mode) (*ast.Program, error) -``` -ParseFile parses the source code of a single JavaScript/ECMAScript source file -and returns the corresponding ast.Program node. - -If fileSet == nil, ParseFile parses source without a FileSet. If fileSet != nil, -ParseFile first adds filename and src to fileSet. - -The filename argument is optional and is used for labelling errors, etc. - -src may be a string, a byte slice, a bytes.Buffer, or an io.Reader, but it MUST -always be in UTF-8. - - // Parse some JavaScript, yielding a *ast.Program and/or an ErrorList - program, err := parser.ParseFile(nil, "", `if (abc > 1) {}`, 0) - -#### func ParseFunction - -```go -func ParseFunction(parameterList, body string) (*ast.FunctionLiteral, error) -``` -ParseFunction parses a given parameter list and body as a function and returns -the corresponding ast.FunctionLiteral node. - -The parameter list, if any, should be a comma-separated list of identifiers. - -#### func ReadSource - -```go -func ReadSource(filename string, src interface{}) ([]byte, error) -``` - -#### func TransformRegExp - -```go -func TransformRegExp(pattern string) (string, error) -``` -TransformRegExp transforms a JavaScript pattern into a Go "regexp" pattern. - -re2 (Go) cannot do backtracking, so the presence of a lookahead (?=) (?!) or -backreference (\1, \2, ...) will cause an error. - -re2 (Go) has a different definition for \s: [\t\n\f\r ]. The JavaScript -definition, on the other hand, also includes \v, Unicode "Separator, Space", -etc. - -If the pattern is invalid (not valid even in JavaScript), then this function -returns the empty string and an error. - -If the pattern is valid, but incompatible (contains a lookahead or -backreference), then this function returns the transformation (a non-empty -string) AND an error. - -#### type Error - -```go -type Error struct { - Position file.Position - Message string -} -``` - -An Error represents a parsing error. It includes the position where the error -occurred and a message/description. - -#### func (Error) Error - -```go -func (self Error) Error() string -``` - -#### type ErrorList - -```go -type ErrorList []*Error -``` - -ErrorList is a list of *Errors. - -#### func (*ErrorList) Add - -```go -func (self *ErrorList) Add(position file.Position, msg string) -``` -Add adds an Error with given position and message to an ErrorList. - -#### func (ErrorList) Err - -```go -func (self ErrorList) Err() error -``` -Err returns an error equivalent to this ErrorList. If the list is empty, Err -returns nil. - -#### func (ErrorList) Error - -```go -func (self ErrorList) Error() string -``` -Error implements the Error interface. - -#### func (ErrorList) Len - -```go -func (self ErrorList) Len() int -``` - -#### func (ErrorList) Less - -```go -func (self ErrorList) Less(i, j int) bool -``` - -#### func (*ErrorList) Reset - -```go -func (self *ErrorList) Reset() -``` -Reset resets an ErrorList to no errors. - -#### func (ErrorList) Sort - -```go -func (self ErrorList) Sort() -``` - -#### func (ErrorList) Swap - -```go -func (self ErrorList) Swap(i, j int) -``` - -#### type Mode - -```go -type Mode uint -``` - -A Mode value is a set of flags (or 0). They control optional parser -functionality. - -```go -const ( - IgnoreRegExpErrors Mode = 1 << iota // Ignore RegExp compatibility errors (allow backtracking) -) -``` - --- -**godocdown** http://github.com/robertkrimen/godocdown diff --git a/vendor/github.com/robertkrimen/otto/parser/dbg.go b/vendor/github.com/robertkrimen/otto/parser/dbg.go deleted file mode 100644 index 3c5f2f698e9b..000000000000 --- a/vendor/github.com/robertkrimen/otto/parser/dbg.go +++ /dev/null @@ -1,9 +0,0 @@ -// This file was AUTOMATICALLY GENERATED by dbg-import (smuggol) for github.com/robertkrimen/dbg - -package parser - -import ( - Dbg "github.com/robertkrimen/otto/dbg" -) - -var dbg, dbgf = Dbg.New() diff --git a/vendor/github.com/robertkrimen/otto/parser/error.go b/vendor/github.com/robertkrimen/otto/parser/error.go deleted file mode 100644 index e0f74a5cfcd7..000000000000 --- a/vendor/github.com/robertkrimen/otto/parser/error.go +++ /dev/null @@ -1,175 +0,0 @@ -package parser - -import ( - "fmt" - "sort" - - "github.com/robertkrimen/otto/file" - "github.com/robertkrimen/otto/token" -) - -const ( - err_UnexpectedToken = "Unexpected token %v" - err_UnexpectedEndOfInput = "Unexpected end of input" - err_UnexpectedEscape = "Unexpected escape" -) - -// UnexpectedNumber: 'Unexpected number', -// UnexpectedString: 'Unexpected string', -// UnexpectedIdentifier: 'Unexpected identifier', -// UnexpectedReserved: 'Unexpected reserved word', -// NewlineAfterThrow: 'Illegal newline after throw', -// InvalidRegExp: 'Invalid regular expression', -// UnterminatedRegExp: 'Invalid regular expression: missing /', -// InvalidLHSInAssignment: 'Invalid left-hand side in assignment', -// InvalidLHSInForIn: 'Invalid left-hand side in for-in', -// MultipleDefaultsInSwitch: 'More than one default clause in switch statement', -// NoCatchOrFinally: 'Missing catch or finally after try', -// UnknownLabel: 'Undefined label \'%0\'', -// Redeclaration: '%0 \'%1\' has already been declared', -// IllegalContinue: 'Illegal continue statement', -// IllegalBreak: 'Illegal break statement', -// IllegalReturn: 'Illegal return statement', -// StrictModeWith: 'Strict mode code may not include a with statement', -// StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode', -// StrictVarName: 'Variable name may not be eval or arguments in strict mode', -// StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode', -// StrictParamDupe: 'Strict mode function may not have duplicate parameter names', -// StrictFunctionName: 'Function name may not be eval or arguments in strict mode', -// StrictOctalLiteral: 'Octal literals are not allowed in strict mode.', -// StrictDelete: 'Delete of an unqualified identifier in strict mode.', -// StrictDuplicateProperty: 'Duplicate data property in object literal not allowed in strict mode', -// AccessorDataProperty: 'Object literal may not have data and accessor property with the same name', -// AccessorGetSet: 'Object literal may not have multiple get/set accessors with the same name', -// StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode', -// StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode', -// StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode', -// StrictReservedWord: 'Use of future reserved word in strict mode' - -// A SyntaxError is a description of an ECMAScript syntax error. - -// An Error represents a parsing error. It includes the position where the error occurred and a message/description. -type Error struct { - Position file.Position - Message string -} - -// FIXME Should this be "SyntaxError"? - -func (self Error) Error() string { - filename := self.Position.Filename - if filename == "" { - filename = "(anonymous)" - } - return fmt.Sprintf("%s: Line %d:%d %s", - filename, - self.Position.Line, - self.Position.Column, - self.Message, - ) -} - -func (self *_parser) error(place interface{}, msg string, msgValues ...interface{}) *Error { - idx := file.Idx(0) - switch place := place.(type) { - case int: - idx = self.idxOf(place) - case file.Idx: - if place == 0 { - idx = self.idxOf(self.chrOffset) - } else { - idx = place - } - default: - panic(fmt.Errorf("error(%T, ...)", place)) - } - - position := self.position(idx) - msg = fmt.Sprintf(msg, msgValues...) - self.errors.Add(position, msg) - return self.errors[len(self.errors)-1] -} - -func (self *_parser) errorUnexpected(idx file.Idx, chr rune) error { - if chr == -1 { - return self.error(idx, err_UnexpectedEndOfInput) - } - return self.error(idx, err_UnexpectedToken, token.ILLEGAL) -} - -func (self *_parser) errorUnexpectedToken(tkn token.Token) error { - switch tkn { - case token.EOF: - return self.error(file.Idx(0), err_UnexpectedEndOfInput) - } - value := tkn.String() - switch tkn { - case token.BOOLEAN, token.NULL: - value = self.literal - case token.IDENTIFIER: - return self.error(self.idx, "Unexpected identifier") - case token.KEYWORD: - // TODO Might be a future reserved word - return self.error(self.idx, "Unexpected reserved word") - case token.NUMBER: - return self.error(self.idx, "Unexpected number") - case token.STRING: - return self.error(self.idx, "Unexpected string") - } - return self.error(self.idx, err_UnexpectedToken, value) -} - -// ErrorList is a list of *Errors. -// -type ErrorList []*Error - -// Add adds an Error with given position and message to an ErrorList. -func (self *ErrorList) Add(position file.Position, msg string) { - *self = append(*self, &Error{position, msg}) -} - -// Reset resets an ErrorList to no errors. -func (self *ErrorList) Reset() { *self = (*self)[0:0] } - -func (self ErrorList) Len() int { return len(self) } -func (self ErrorList) Swap(i, j int) { self[i], self[j] = self[j], self[i] } -func (self ErrorList) Less(i, j int) bool { - x := &self[i].Position - y := &self[j].Position - if x.Filename < y.Filename { - return true - } - if x.Filename == y.Filename { - if x.Line < y.Line { - return true - } - if x.Line == y.Line { - return x.Column < y.Column - } - } - return false -} - -func (self ErrorList) Sort() { - sort.Sort(self) -} - -// Error implements the Error interface. -func (self ErrorList) Error() string { - switch len(self) { - case 0: - return "no errors" - case 1: - return self[0].Error() - } - return fmt.Sprintf("%s (and %d more errors)", self[0].Error(), len(self)-1) -} - -// Err returns an error equivalent to this ErrorList. -// If the list is empty, Err returns nil. -func (self ErrorList) Err() error { - if len(self) == 0 { - return nil - } - return self -} diff --git a/vendor/github.com/robertkrimen/otto/parser/expression.go b/vendor/github.com/robertkrimen/otto/parser/expression.go deleted file mode 100644 index 63a169d402c0..000000000000 --- a/vendor/github.com/robertkrimen/otto/parser/expression.go +++ /dev/null @@ -1,1005 +0,0 @@ -package parser - -import ( - "regexp" - - "github.com/robertkrimen/otto/ast" - "github.com/robertkrimen/otto/file" - "github.com/robertkrimen/otto/token" -) - -func (self *_parser) parseIdentifier() *ast.Identifier { - literal := self.literal - idx := self.idx - if self.mode&StoreComments != 0 { - self.comments.MarkComments(ast.LEADING) - } - self.next() - exp := &ast.Identifier{ - Name: literal, - Idx: idx, - } - - if self.mode&StoreComments != 0 { - self.comments.SetExpression(exp) - } - - return exp -} - -func (self *_parser) parsePrimaryExpression() ast.Expression { - literal := self.literal - idx := self.idx - switch self.token { - case token.IDENTIFIER: - self.next() - if len(literal) > 1 { - tkn, strict := token.IsKeyword(literal) - if tkn == token.KEYWORD { - if !strict { - self.error(idx, "Unexpected reserved word") - } - } - } - return &ast.Identifier{ - Name: literal, - Idx: idx, - } - case token.NULL: - self.next() - return &ast.NullLiteral{ - Idx: idx, - Literal: literal, - } - case token.BOOLEAN: - self.next() - value := false - switch literal { - case "true": - value = true - case "false": - value = false - default: - self.error(idx, "Illegal boolean literal") - } - return &ast.BooleanLiteral{ - Idx: idx, - Literal: literal, - Value: value, - } - case token.STRING: - self.next() - value, err := parseStringLiteral(literal[1 : len(literal)-1]) - if err != nil { - self.error(idx, err.Error()) - } - return &ast.StringLiteral{ - Idx: idx, - Literal: literal, - Value: value, - } - case token.NUMBER: - self.next() - value, err := parseNumberLiteral(literal) - if err != nil { - self.error(idx, err.Error()) - value = 0 - } - return &ast.NumberLiteral{ - Idx: idx, - Literal: literal, - Value: value, - } - case token.SLASH, token.QUOTIENT_ASSIGN: - return self.parseRegExpLiteral() - case token.LEFT_BRACE: - return self.parseObjectLiteral() - case token.LEFT_BRACKET: - return self.parseArrayLiteral() - case token.LEFT_PARENTHESIS: - self.expect(token.LEFT_PARENTHESIS) - expression := self.parseExpression() - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.expect(token.RIGHT_PARENTHESIS) - return expression - case token.THIS: - self.next() - return &ast.ThisExpression{ - Idx: idx, - } - case token.FUNCTION: - return self.parseFunction(false) - } - - self.errorUnexpectedToken(self.token) - self.nextStatement() - return &ast.BadExpression{From: idx, To: self.idx} -} - -func (self *_parser) parseRegExpLiteral() *ast.RegExpLiteral { - - offset := self.chrOffset - 1 // Opening slash already gotten - if self.token == token.QUOTIENT_ASSIGN { - offset -= 1 // = - } - idx := self.idxOf(offset) - - pattern, err := self.scanString(offset) - endOffset := self.chrOffset - - self.next() - if err == nil { - pattern = pattern[1 : len(pattern)-1] - } - - flags := "" - if self.token == token.IDENTIFIER { // gim - - flags = self.literal - self.next() - endOffset = self.chrOffset - 1 - } - - var value string - // TODO 15.10 - { - // Test during parsing that this is a valid regular expression - // Sorry, (?=) and (?!) are invalid (for now) - pattern, err := TransformRegExp(pattern) - if err != nil { - if pattern == "" || self.mode&IgnoreRegExpErrors == 0 { - self.error(idx, "Invalid regular expression: %s", err.Error()) - } - } else { - _, err = regexp.Compile(pattern) - if err != nil { - // We should not get here, ParseRegExp should catch any errors - self.error(idx, "Invalid regular expression: %s", err.Error()[22:]) // Skip redundant "parse regexp error" - } else { - value = pattern - } - } - } - - literal := self.str[offset:endOffset] - - return &ast.RegExpLiteral{ - Idx: idx, - Literal: literal, - Pattern: pattern, - Flags: flags, - Value: value, - } -} - -func (self *_parser) parseVariableDeclaration(declarationList *[]*ast.VariableExpression) ast.Expression { - - if self.token != token.IDENTIFIER { - idx := self.expect(token.IDENTIFIER) - self.nextStatement() - return &ast.BadExpression{From: idx, To: self.idx} - } - - literal := self.literal - idx := self.idx - self.next() - node := &ast.VariableExpression{ - Name: literal, - Idx: idx, - } - if self.mode&StoreComments != 0 { - self.comments.SetExpression(node) - } - - if declarationList != nil { - *declarationList = append(*declarationList, node) - } - - if self.token == token.ASSIGN { - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - node.Initializer = self.parseAssignmentExpression() - } - - return node -} - -func (self *_parser) parseVariableDeclarationList(var_ file.Idx) []ast.Expression { - - var declarationList []*ast.VariableExpression // Avoid bad expressions - var list []ast.Expression - - for { - if self.mode&StoreComments != 0 { - self.comments.MarkComments(ast.LEADING) - } - decl := self.parseVariableDeclaration(&declarationList) - list = append(list, decl) - if self.token != token.COMMA { - break - } - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - } - - self.scope.declare(&ast.VariableDeclaration{ - Var: var_, - List: declarationList, - }) - - return list -} - -func (self *_parser) parseObjectPropertyKey() (string, string) { - idx, tkn, literal := self.idx, self.token, self.literal - value := "" - if self.mode&StoreComments != 0 { - self.comments.MarkComments(ast.KEY) - } - self.next() - - switch tkn { - case token.IDENTIFIER: - value = literal - case token.NUMBER: - var err error - _, err = parseNumberLiteral(literal) - if err != nil { - self.error(idx, err.Error()) - } else { - value = literal - } - case token.STRING: - var err error - value, err = parseStringLiteral(literal[1 : len(literal)-1]) - if err != nil { - self.error(idx, err.Error()) - } - default: - // null, false, class, etc. - if matchIdentifier.MatchString(literal) { - value = literal - } - } - return literal, value -} - -func (self *_parser) parseObjectProperty() ast.Property { - literal, value := self.parseObjectPropertyKey() - if literal == "get" && self.token != token.COLON { - idx := self.idx - _, value := self.parseObjectPropertyKey() - parameterList := self.parseFunctionParameterList() - - node := &ast.FunctionLiteral{ - Function: idx, - ParameterList: parameterList, - } - self.parseFunctionBlock(node) - return ast.Property{ - Key: value, - Kind: "get", - Value: node, - } - } else if literal == "set" && self.token != token.COLON { - idx := self.idx - _, value := self.parseObjectPropertyKey() - parameterList := self.parseFunctionParameterList() - - node := &ast.FunctionLiteral{ - Function: idx, - ParameterList: parameterList, - } - self.parseFunctionBlock(node) - return ast.Property{ - Key: value, - Kind: "set", - Value: node, - } - } - - if self.mode&StoreComments != 0 { - self.comments.MarkComments(ast.COLON) - } - self.expect(token.COLON) - - exp := ast.Property{ - Key: value, - Kind: "value", - Value: self.parseAssignmentExpression(), - } - - if self.mode&StoreComments != 0 { - self.comments.SetExpression(exp.Value) - } - return exp -} - -func (self *_parser) parseObjectLiteral() ast.Expression { - var value []ast.Property - idx0 := self.expect(token.LEFT_BRACE) - for self.token != token.RIGHT_BRACE && self.token != token.EOF { - value = append(value, self.parseObjectProperty()) - if self.token == token.COMMA { - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - continue - } - } - if self.mode&StoreComments != 0 { - self.comments.MarkComments(ast.FINAL) - } - idx1 := self.expect(token.RIGHT_BRACE) - - return &ast.ObjectLiteral{ - LeftBrace: idx0, - RightBrace: idx1, - Value: value, - } -} - -func (self *_parser) parseArrayLiteral() ast.Expression { - idx0 := self.expect(token.LEFT_BRACKET) - var value []ast.Expression - for self.token != token.RIGHT_BRACKET && self.token != token.EOF { - if self.token == token.COMMA { - // This kind of comment requires a special empty expression node. - empty := &ast.EmptyExpression{self.idx, self.idx} - - if self.mode&StoreComments != 0 { - self.comments.SetExpression(empty) - self.comments.Unset() - } - value = append(value, empty) - self.next() - continue - } - - exp := self.parseAssignmentExpression() - - value = append(value, exp) - if self.token != token.RIGHT_BRACKET { - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.expect(token.COMMA) - } - } - if self.mode&StoreComments != 0 { - self.comments.MarkComments(ast.FINAL) - } - idx1 := self.expect(token.RIGHT_BRACKET) - - return &ast.ArrayLiteral{ - LeftBracket: idx0, - RightBracket: idx1, - Value: value, - } -} - -func (self *_parser) parseArgumentList() (argumentList []ast.Expression, idx0, idx1 file.Idx) { - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - idx0 = self.expect(token.LEFT_PARENTHESIS) - if self.token != token.RIGHT_PARENTHESIS { - for { - exp := self.parseAssignmentExpression() - if self.mode&StoreComments != 0 { - self.comments.SetExpression(exp) - } - argumentList = append(argumentList, exp) - if self.token != token.COMMA { - break - } - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - } - } - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - idx1 = self.expect(token.RIGHT_PARENTHESIS) - return -} - -func (self *_parser) parseCallExpression(left ast.Expression) ast.Expression { - argumentList, idx0, idx1 := self.parseArgumentList() - exp := &ast.CallExpression{ - Callee: left, - LeftParenthesis: idx0, - ArgumentList: argumentList, - RightParenthesis: idx1, - } - - if self.mode&StoreComments != 0 { - self.comments.SetExpression(exp) - } - return exp -} - -func (self *_parser) parseDotMember(left ast.Expression) ast.Expression { - period := self.expect(token.PERIOD) - - literal := self.literal - idx := self.idx - - if !matchIdentifier.MatchString(literal) { - self.expect(token.IDENTIFIER) - self.nextStatement() - return &ast.BadExpression{From: period, To: self.idx} - } - - self.next() - - return &ast.DotExpression{ - Left: left, - Identifier: &ast.Identifier{ - Idx: idx, - Name: literal, - }, - } -} - -func (self *_parser) parseBracketMember(left ast.Expression) ast.Expression { - idx0 := self.expect(token.LEFT_BRACKET) - member := self.parseExpression() - idx1 := self.expect(token.RIGHT_BRACKET) - return &ast.BracketExpression{ - LeftBracket: idx0, - Left: left, - Member: member, - RightBracket: idx1, - } -} - -func (self *_parser) parseNewExpression() ast.Expression { - idx := self.expect(token.NEW) - callee := self.parseLeftHandSideExpression() - node := &ast.NewExpression{ - New: idx, - Callee: callee, - } - if self.token == token.LEFT_PARENTHESIS { - argumentList, idx0, idx1 := self.parseArgumentList() - node.ArgumentList = argumentList - node.LeftParenthesis = idx0 - node.RightParenthesis = idx1 - } - - if self.mode&StoreComments != 0 { - self.comments.SetExpression(node) - } - - return node -} - -func (self *_parser) parseLeftHandSideExpression() ast.Expression { - - var left ast.Expression - if self.token == token.NEW { - left = self.parseNewExpression() - } else { - if self.mode&StoreComments != 0 { - self.comments.MarkComments(ast.LEADING) - self.comments.MarkPrimary() - } - left = self.parsePrimaryExpression() - } - - if self.mode&StoreComments != 0 { - self.comments.SetExpression(left) - } - - for { - if self.token == token.PERIOD { - left = self.parseDotMember(left) - } else if self.token == token.LEFT_BRACKET { - left = self.parseBracketMember(left) - } else { - break - } - } - - return left -} - -func (self *_parser) parseLeftHandSideExpressionAllowCall() ast.Expression { - - allowIn := self.scope.allowIn - self.scope.allowIn = true - defer func() { - self.scope.allowIn = allowIn - }() - - var left ast.Expression - if self.token == token.NEW { - var newComments []*ast.Comment - if self.mode&StoreComments != 0 { - newComments = self.comments.FetchAll() - self.comments.MarkComments(ast.LEADING) - self.comments.MarkPrimary() - } - left = self.parseNewExpression() - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(left, newComments, ast.LEADING) - } - } else { - if self.mode&StoreComments != 0 { - self.comments.MarkComments(ast.LEADING) - self.comments.MarkPrimary() - } - left = self.parsePrimaryExpression() - } - - if self.mode&StoreComments != 0 { - self.comments.SetExpression(left) - } - - for { - if self.token == token.PERIOD { - left = self.parseDotMember(left) - } else if self.token == token.LEFT_BRACKET { - left = self.parseBracketMember(left) - } else if self.token == token.LEFT_PARENTHESIS { - left = self.parseCallExpression(left) - } else { - break - } - } - - return left -} - -func (self *_parser) parsePostfixExpression() ast.Expression { - operand := self.parseLeftHandSideExpressionAllowCall() - - switch self.token { - case token.INCREMENT, token.DECREMENT: - // Make sure there is no line terminator here - if self.implicitSemicolon { - break - } - tkn := self.token - idx := self.idx - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - switch operand.(type) { - case *ast.Identifier, *ast.DotExpression, *ast.BracketExpression: - default: - self.error(idx, "Invalid left-hand side in assignment") - self.nextStatement() - return &ast.BadExpression{From: idx, To: self.idx} - } - exp := &ast.UnaryExpression{ - Operator: tkn, - Idx: idx, - Operand: operand, - Postfix: true, - } - - if self.mode&StoreComments != 0 { - self.comments.SetExpression(exp) - } - - return exp - } - - return operand -} - -func (self *_parser) parseUnaryExpression() ast.Expression { - - switch self.token { - case token.PLUS, token.MINUS, token.NOT, token.BITWISE_NOT: - fallthrough - case token.DELETE, token.VOID, token.TYPEOF: - tkn := self.token - idx := self.idx - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - - return &ast.UnaryExpression{ - Operator: tkn, - Idx: idx, - Operand: self.parseUnaryExpression(), - } - case token.INCREMENT, token.DECREMENT: - tkn := self.token - idx := self.idx - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - operand := self.parseUnaryExpression() - switch operand.(type) { - case *ast.Identifier, *ast.DotExpression, *ast.BracketExpression: - default: - self.error(idx, "Invalid left-hand side in assignment") - self.nextStatement() - return &ast.BadExpression{From: idx, To: self.idx} - } - return &ast.UnaryExpression{ - Operator: tkn, - Idx: idx, - Operand: operand, - } - } - - return self.parsePostfixExpression() -} - -func (self *_parser) parseMultiplicativeExpression() ast.Expression { - next := self.parseUnaryExpression - left := next() - - for self.token == token.MULTIPLY || self.token == token.SLASH || - self.token == token.REMAINDER { - tkn := self.token - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - - left = &ast.BinaryExpression{ - Operator: tkn, - Left: left, - Right: next(), - } - } - - return left -} - -func (self *_parser) parseAdditiveExpression() ast.Expression { - next := self.parseMultiplicativeExpression - left := next() - - for self.token == token.PLUS || self.token == token.MINUS { - tkn := self.token - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - - left = &ast.BinaryExpression{ - Operator: tkn, - Left: left, - Right: next(), - } - } - - return left -} - -func (self *_parser) parseShiftExpression() ast.Expression { - next := self.parseAdditiveExpression - left := next() - - for self.token == token.SHIFT_LEFT || self.token == token.SHIFT_RIGHT || - self.token == token.UNSIGNED_SHIFT_RIGHT { - tkn := self.token - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - - left = &ast.BinaryExpression{ - Operator: tkn, - Left: left, - Right: next(), - } - } - - return left -} - -func (self *_parser) parseRelationalExpression() ast.Expression { - next := self.parseShiftExpression - left := next() - - allowIn := self.scope.allowIn - self.scope.allowIn = true - defer func() { - self.scope.allowIn = allowIn - }() - - switch self.token { - case token.LESS, token.LESS_OR_EQUAL, token.GREATER, token.GREATER_OR_EQUAL: - tkn := self.token - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - - exp := &ast.BinaryExpression{ - Operator: tkn, - Left: left, - Right: self.parseRelationalExpression(), - Comparison: true, - } - return exp - case token.INSTANCEOF: - tkn := self.token - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - - exp := &ast.BinaryExpression{ - Operator: tkn, - Left: left, - Right: self.parseRelationalExpression(), - } - return exp - case token.IN: - if !allowIn { - return left - } - tkn := self.token - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - - exp := &ast.BinaryExpression{ - Operator: tkn, - Left: left, - Right: self.parseRelationalExpression(), - } - return exp - } - - return left -} - -func (self *_parser) parseEqualityExpression() ast.Expression { - next := self.parseRelationalExpression - left := next() - - for self.token == token.EQUAL || self.token == token.NOT_EQUAL || - self.token == token.STRICT_EQUAL || self.token == token.STRICT_NOT_EQUAL { - tkn := self.token - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - - left = &ast.BinaryExpression{ - Operator: tkn, - Left: left, - Right: next(), - Comparison: true, - } - } - - return left -} - -func (self *_parser) parseBitwiseAndExpression() ast.Expression { - next := self.parseEqualityExpression - left := next() - - for self.token == token.AND { - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - tkn := self.token - self.next() - - left = &ast.BinaryExpression{ - Operator: tkn, - Left: left, - Right: next(), - } - } - - return left -} - -func (self *_parser) parseBitwiseExclusiveOrExpression() ast.Expression { - next := self.parseBitwiseAndExpression - left := next() - - for self.token == token.EXCLUSIVE_OR { - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - tkn := self.token - self.next() - - left = &ast.BinaryExpression{ - Operator: tkn, - Left: left, - Right: next(), - } - } - - return left -} - -func (self *_parser) parseBitwiseOrExpression() ast.Expression { - next := self.parseBitwiseExclusiveOrExpression - left := next() - - for self.token == token.OR { - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - tkn := self.token - self.next() - - left = &ast.BinaryExpression{ - Operator: tkn, - Left: left, - Right: next(), - } - } - - return left -} - -func (self *_parser) parseLogicalAndExpression() ast.Expression { - next := self.parseBitwiseOrExpression - left := next() - - for self.token == token.LOGICAL_AND { - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - tkn := self.token - self.next() - - left = &ast.BinaryExpression{ - Operator: tkn, - Left: left, - Right: next(), - } - } - - return left -} - -func (self *_parser) parseLogicalOrExpression() ast.Expression { - next := self.parseLogicalAndExpression - left := next() - - for self.token == token.LOGICAL_OR { - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - tkn := self.token - self.next() - - left = &ast.BinaryExpression{ - Operator: tkn, - Left: left, - Right: next(), - } - } - - return left -} - -func (self *_parser) parseConditionlExpression() ast.Expression { - left := self.parseLogicalOrExpression() - - if self.token == token.QUESTION_MARK { - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - - consequent := self.parseAssignmentExpression() - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.expect(token.COLON) - exp := &ast.ConditionalExpression{ - Test: left, - Consequent: consequent, - Alternate: self.parseAssignmentExpression(), - } - - return exp - } - - return left -} - -func (self *_parser) parseAssignmentExpression() ast.Expression { - left := self.parseConditionlExpression() - var operator token.Token - switch self.token { - case token.ASSIGN: - operator = self.token - case token.ADD_ASSIGN: - operator = token.PLUS - case token.SUBTRACT_ASSIGN: - operator = token.MINUS - case token.MULTIPLY_ASSIGN: - operator = token.MULTIPLY - case token.QUOTIENT_ASSIGN: - operator = token.SLASH - case token.REMAINDER_ASSIGN: - operator = token.REMAINDER - case token.AND_ASSIGN: - operator = token.AND - case token.AND_NOT_ASSIGN: - operator = token.AND_NOT - case token.OR_ASSIGN: - operator = token.OR - case token.EXCLUSIVE_OR_ASSIGN: - operator = token.EXCLUSIVE_OR - case token.SHIFT_LEFT_ASSIGN: - operator = token.SHIFT_LEFT - case token.SHIFT_RIGHT_ASSIGN: - operator = token.SHIFT_RIGHT - case token.UNSIGNED_SHIFT_RIGHT_ASSIGN: - operator = token.UNSIGNED_SHIFT_RIGHT - } - - if operator != 0 { - idx := self.idx - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - switch left.(type) { - case *ast.Identifier, *ast.DotExpression, *ast.BracketExpression: - default: - self.error(left.Idx0(), "Invalid left-hand side in assignment") - self.nextStatement() - return &ast.BadExpression{From: idx, To: self.idx} - } - - exp := &ast.AssignExpression{ - Left: left, - Operator: operator, - Right: self.parseAssignmentExpression(), - } - - if self.mode&StoreComments != 0 { - self.comments.SetExpression(exp) - } - - return exp - } - - return left -} - -func (self *_parser) parseExpression() ast.Expression { - next := self.parseAssignmentExpression - left := next() - - if self.token == token.COMMA { - sequence := []ast.Expression{left} - for { - if self.token != token.COMMA { - break - } - self.next() - sequence = append(sequence, next()) - } - return &ast.SequenceExpression{ - Sequence: sequence, - } - } - - return left -} diff --git a/vendor/github.com/robertkrimen/otto/parser/lexer.go b/vendor/github.com/robertkrimen/otto/parser/lexer.go deleted file mode 100644 index d9d69e124c87..000000000000 --- a/vendor/github.com/robertkrimen/otto/parser/lexer.go +++ /dev/null @@ -1,866 +0,0 @@ -package parser - -import ( - "bytes" - "errors" - "fmt" - "regexp" - "strconv" - "strings" - "unicode" - "unicode/utf8" - - "github.com/robertkrimen/otto/ast" - "github.com/robertkrimen/otto/file" - "github.com/robertkrimen/otto/token" -) - -type _chr struct { - value rune - width int -} - -var matchIdentifier = regexp.MustCompile(`^[$_\p{L}][$_\p{L}\d}]*$`) - -func isDecimalDigit(chr rune) bool { - return '0' <= chr && chr <= '9' -} - -func digitValue(chr rune) int { - switch { - case '0' <= chr && chr <= '9': - return int(chr - '0') - case 'a' <= chr && chr <= 'f': - return int(chr - 'a' + 10) - case 'A' <= chr && chr <= 'F': - return int(chr - 'A' + 10) - } - return 16 // Larger than any legal digit value -} - -func isDigit(chr rune, base int) bool { - return digitValue(chr) < base -} - -func isIdentifierStart(chr rune) bool { - return chr == '$' || chr == '_' || chr == '\\' || - 'a' <= chr && chr <= 'z' || 'A' <= chr && chr <= 'Z' || - chr >= utf8.RuneSelf && unicode.IsLetter(chr) -} - -func isIdentifierPart(chr rune) bool { - return chr == '$' || chr == '_' || chr == '\\' || - 'a' <= chr && chr <= 'z' || 'A' <= chr && chr <= 'Z' || - '0' <= chr && chr <= '9' || - chr >= utf8.RuneSelf && (unicode.IsLetter(chr) || unicode.IsDigit(chr)) -} - -func (self *_parser) scanIdentifier() (string, error) { - offset := self.chrOffset - parse := false - for isIdentifierPart(self.chr) { - if self.chr == '\\' { - distance := self.chrOffset - offset - self.read() - if self.chr != 'u' { - return "", fmt.Errorf("Invalid identifier escape character: %c (%s)", self.chr, string(self.chr)) - } - parse = true - var value rune - for j := 0; j < 4; j++ { - self.read() - decimal, ok := hex2decimal(byte(self.chr)) - if !ok { - return "", fmt.Errorf("Invalid identifier escape character: %c (%s)", self.chr, string(self.chr)) - } - value = value<<4 | decimal - } - if value == '\\' { - return "", fmt.Errorf("Invalid identifier escape value: %c (%s)", value, string(value)) - } else if distance == 0 { - if !isIdentifierStart(value) { - return "", fmt.Errorf("Invalid identifier escape value: %c (%s)", value, string(value)) - } - } else if distance > 0 { - if !isIdentifierPart(value) { - return "", fmt.Errorf("Invalid identifier escape value: %c (%s)", value, string(value)) - } - } - } - self.read() - } - literal := string(self.str[offset:self.chrOffset]) - if parse { - return parseStringLiteral(literal) - } - return literal, nil -} - -// 7.2 -func isLineWhiteSpace(chr rune) bool { - switch chr { - case '\u0009', '\u000b', '\u000c', '\u0020', '\u00a0', '\ufeff': - return true - case '\u000a', '\u000d', '\u2028', '\u2029': - return false - case '\u0085': - return false - } - return unicode.IsSpace(chr) -} - -// 7.3 -func isLineTerminator(chr rune) bool { - switch chr { - case '\u000a', '\u000d', '\u2028', '\u2029': - return true - } - return false -} - -func (self *_parser) scan() (tkn token.Token, literal string, idx file.Idx) { - - self.implicitSemicolon = false - - for { - self.skipWhiteSpace() - - idx = self.idxOf(self.chrOffset) - insertSemicolon := false - - switch chr := self.chr; { - case isIdentifierStart(chr): - var err error - literal, err = self.scanIdentifier() - if err != nil { - tkn = token.ILLEGAL - break - } - if len(literal) > 1 { - // Keywords are longer than 1 character, avoid lookup otherwise - var strict bool - tkn, strict = token.IsKeyword(literal) - - switch tkn { - - case 0: // Not a keyword - if literal == "true" || literal == "false" { - self.insertSemicolon = true - tkn = token.BOOLEAN - return - } else if literal == "null" { - self.insertSemicolon = true - tkn = token.NULL - return - } - - case token.KEYWORD: - tkn = token.KEYWORD - if strict { - // TODO If strict and in strict mode, then this is not a break - break - } - return - - case - token.THIS, - token.BREAK, - token.THROW, // A newline after a throw is not allowed, but we need to detect it - token.RETURN, - token.CONTINUE, - token.DEBUGGER: - self.insertSemicolon = true - return - - default: - return - - } - } - self.insertSemicolon = true - tkn = token.IDENTIFIER - return - case '0' <= chr && chr <= '9': - self.insertSemicolon = true - tkn, literal = self.scanNumericLiteral(false) - return - default: - self.read() - switch chr { - case -1: - if self.insertSemicolon { - self.insertSemicolon = false - self.implicitSemicolon = true - } - tkn = token.EOF - case '\r', '\n', '\u2028', '\u2029': - self.insertSemicolon = false - self.implicitSemicolon = true - self.comments.AtLineBreak() - continue - case ':': - tkn = token.COLON - case '.': - if digitValue(self.chr) < 10 { - insertSemicolon = true - tkn, literal = self.scanNumericLiteral(true) - } else { - tkn = token.PERIOD - } - case ',': - tkn = token.COMMA - case ';': - tkn = token.SEMICOLON - case '(': - tkn = token.LEFT_PARENTHESIS - case ')': - tkn = token.RIGHT_PARENTHESIS - insertSemicolon = true - case '[': - tkn = token.LEFT_BRACKET - case ']': - tkn = token.RIGHT_BRACKET - insertSemicolon = true - case '{': - tkn = token.LEFT_BRACE - case '}': - tkn = token.RIGHT_BRACE - insertSemicolon = true - case '+': - tkn = self.switch3(token.PLUS, token.ADD_ASSIGN, '+', token.INCREMENT) - if tkn == token.INCREMENT { - insertSemicolon = true - } - case '-': - tkn = self.switch3(token.MINUS, token.SUBTRACT_ASSIGN, '-', token.DECREMENT) - if tkn == token.DECREMENT { - insertSemicolon = true - } - case '*': - tkn = self.switch2(token.MULTIPLY, token.MULTIPLY_ASSIGN) - case '/': - if self.chr == '/' { - if self.mode&StoreComments != 0 { - literal := string(self.readSingleLineComment()) - self.comments.AddComment(ast.NewComment(literal, self.idx)) - continue - } - self.skipSingleLineComment() - continue - } else if self.chr == '*' { - if self.mode&StoreComments != 0 { - literal = string(self.readMultiLineComment()) - self.comments.AddComment(ast.NewComment(literal, self.idx)) - continue - } - self.skipMultiLineComment() - continue - } else { - // Could be division, could be RegExp literal - tkn = self.switch2(token.SLASH, token.QUOTIENT_ASSIGN) - insertSemicolon = true - } - case '%': - tkn = self.switch2(token.REMAINDER, token.REMAINDER_ASSIGN) - case '^': - tkn = self.switch2(token.EXCLUSIVE_OR, token.EXCLUSIVE_OR_ASSIGN) - case '<': - tkn = self.switch4(token.LESS, token.LESS_OR_EQUAL, '<', token.SHIFT_LEFT, token.SHIFT_LEFT_ASSIGN) - case '>': - tkn = self.switch6(token.GREATER, token.GREATER_OR_EQUAL, '>', token.SHIFT_RIGHT, token.SHIFT_RIGHT_ASSIGN, '>', token.UNSIGNED_SHIFT_RIGHT, token.UNSIGNED_SHIFT_RIGHT_ASSIGN) - case '=': - tkn = self.switch2(token.ASSIGN, token.EQUAL) - if tkn == token.EQUAL && self.chr == '=' { - self.read() - tkn = token.STRICT_EQUAL - } - case '!': - tkn = self.switch2(token.NOT, token.NOT_EQUAL) - if tkn == token.NOT_EQUAL && self.chr == '=' { - self.read() - tkn = token.STRICT_NOT_EQUAL - } - case '&': - if self.chr == '^' { - self.read() - tkn = self.switch2(token.AND_NOT, token.AND_NOT_ASSIGN) - } else { - tkn = self.switch3(token.AND, token.AND_ASSIGN, '&', token.LOGICAL_AND) - } - case '|': - tkn = self.switch3(token.OR, token.OR_ASSIGN, '|', token.LOGICAL_OR) - case '~': - tkn = token.BITWISE_NOT - case '?': - tkn = token.QUESTION_MARK - case '"', '\'': - insertSemicolon = true - tkn = token.STRING - var err error - literal, err = self.scanString(self.chrOffset - 1) - if err != nil { - tkn = token.ILLEGAL - } - default: - self.errorUnexpected(idx, chr) - tkn = token.ILLEGAL - } - } - self.insertSemicolon = insertSemicolon - return - } -} - -func (self *_parser) switch2(tkn0, tkn1 token.Token) token.Token { - if self.chr == '=' { - self.read() - return tkn1 - } - return tkn0 -} - -func (self *_parser) switch3(tkn0, tkn1 token.Token, chr2 rune, tkn2 token.Token) token.Token { - if self.chr == '=' { - self.read() - return tkn1 - } - if self.chr == chr2 { - self.read() - return tkn2 - } - return tkn0 -} - -func (self *_parser) switch4(tkn0, tkn1 token.Token, chr2 rune, tkn2, tkn3 token.Token) token.Token { - if self.chr == '=' { - self.read() - return tkn1 - } - if self.chr == chr2 { - self.read() - if self.chr == '=' { - self.read() - return tkn3 - } - return tkn2 - } - return tkn0 -} - -func (self *_parser) switch6(tkn0, tkn1 token.Token, chr2 rune, tkn2, tkn3 token.Token, chr3 rune, tkn4, tkn5 token.Token) token.Token { - if self.chr == '=' { - self.read() - return tkn1 - } - if self.chr == chr2 { - self.read() - if self.chr == '=' { - self.read() - return tkn3 - } - if self.chr == chr3 { - self.read() - if self.chr == '=' { - self.read() - return tkn5 - } - return tkn4 - } - return tkn2 - } - return tkn0 -} - -func (self *_parser) chrAt(index int) _chr { - value, width := utf8.DecodeRuneInString(self.str[index:]) - return _chr{ - value: value, - width: width, - } -} - -func (self *_parser) _peek() rune { - if self.offset+1 < self.length { - return rune(self.str[self.offset+1]) - } - return -1 -} - -func (self *_parser) read() { - if self.offset < self.length { - self.chrOffset = self.offset - chr, width := rune(self.str[self.offset]), 1 - if chr >= utf8.RuneSelf { // !ASCII - chr, width = utf8.DecodeRuneInString(self.str[self.offset:]) - if chr == utf8.RuneError && width == 1 { - self.error(self.chrOffset, "Invalid UTF-8 character") - } - } - self.offset += width - self.chr = chr - } else { - self.chrOffset = self.length - self.chr = -1 // EOF - } -} - -// This is here since the functions are so similar -func (self *_RegExp_parser) read() { - if self.offset < self.length { - self.chrOffset = self.offset - chr, width := rune(self.str[self.offset]), 1 - if chr >= utf8.RuneSelf { // !ASCII - chr, width = utf8.DecodeRuneInString(self.str[self.offset:]) - if chr == utf8.RuneError && width == 1 { - self.error(self.chrOffset, "Invalid UTF-8 character") - } - } - self.offset += width - self.chr = chr - } else { - self.chrOffset = self.length - self.chr = -1 // EOF - } -} - -func (self *_parser) readSingleLineComment() (result []rune) { - for self.chr != -1 { - self.read() - if isLineTerminator(self.chr) { - return - } - result = append(result, self.chr) - } - - // Get rid of the trailing -1 - result = result[:len(result)-1] - - return -} - -func (self *_parser) readMultiLineComment() (result []rune) { - self.read() - for self.chr >= 0 { - chr := self.chr - self.read() - if chr == '*' && self.chr == '/' { - self.read() - return - } - - result = append(result, chr) - } - - self.errorUnexpected(0, self.chr) - - return -} - -func (self *_parser) skipSingleLineComment() { - for self.chr != -1 { - self.read() - if isLineTerminator(self.chr) { - return - } - } -} - -func (self *_parser) skipMultiLineComment() { - self.read() - for self.chr >= 0 { - chr := self.chr - self.read() - if chr == '*' && self.chr == '/' { - self.read() - return - } - } - - self.errorUnexpected(0, self.chr) -} - -func (self *_parser) skipWhiteSpace() { - for { - switch self.chr { - case ' ', '\t', '\f', '\v', '\u00a0', '\ufeff': - self.read() - continue - case '\r': - if self._peek() == '\n' { - self.comments.AtLineBreak() - self.read() - } - fallthrough - case '\u2028', '\u2029', '\n': - if self.insertSemicolon { - return - } - self.comments.AtLineBreak() - self.read() - continue - } - if self.chr >= utf8.RuneSelf { - if unicode.IsSpace(self.chr) { - self.read() - continue - } - } - break - } -} - -func (self *_parser) skipLineWhiteSpace() { - for isLineWhiteSpace(self.chr) { - self.read() - } -} - -func (self *_parser) scanMantissa(base int) { - for digitValue(self.chr) < base { - self.read() - } -} - -func (self *_parser) scanEscape(quote rune) { - - var length, base uint32 - switch self.chr { - //case '0', '1', '2', '3', '4', '5', '6', '7': - // Octal: - // length, base, limit = 3, 8, 255 - case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '"', '\'', '0': - self.read() - return - case '\r', '\n', '\u2028', '\u2029': - self.scanNewline() - return - case 'x': - self.read() - length, base = 2, 16 - case 'u': - self.read() - length, base = 4, 16 - default: - self.read() // Always make progress - return - } - - var value uint32 - for ; length > 0 && self.chr != quote && self.chr >= 0; length-- { - digit := uint32(digitValue(self.chr)) - if digit >= base { - break - } - value = value*base + digit - self.read() - } -} - -func (self *_parser) scanString(offset int) (string, error) { - // " ' / - quote := rune(self.str[offset]) - - for self.chr != quote { - chr := self.chr - if chr == '\n' || chr == '\r' || chr == '\u2028' || chr == '\u2029' || chr < 0 { - goto newline - } - self.read() - if chr == '\\' { - if quote == '/' { - if self.chr == '\n' || self.chr == '\r' || self.chr == '\u2028' || self.chr == '\u2029' || self.chr < 0 { - goto newline - } - self.read() - } else { - self.scanEscape(quote) - } - } else if chr == '[' && quote == '/' { - // Allow a slash (/) in a bracket character class ([...]) - // TODO Fix this, this is hacky... - quote = -1 - } else if chr == ']' && quote == -1 { - quote = '/' - } - } - - // " ' / - self.read() - - return string(self.str[offset:self.chrOffset]), nil - -newline: - self.scanNewline() - err := "String not terminated" - if quote == '/' { - err = "Invalid regular expression: missing /" - self.error(self.idxOf(offset), err) - } - return "", errors.New(err) -} - -func (self *_parser) scanNewline() { - if self.chr == '\r' { - self.read() - if self.chr != '\n' { - return - } - } - self.read() -} - -func hex2decimal(chr byte) (value rune, ok bool) { - { - chr := rune(chr) - switch { - case '0' <= chr && chr <= '9': - return chr - '0', true - case 'a' <= chr && chr <= 'f': - return chr - 'a' + 10, true - case 'A' <= chr && chr <= 'F': - return chr - 'A' + 10, true - } - return - } -} - -func parseNumberLiteral(literal string) (value interface{}, err error) { - // TODO Is Uint okay? What about -MAX_UINT - value, err = strconv.ParseInt(literal, 0, 64) - if err == nil { - return - } - - parseIntErr := err // Save this first error, just in case - - value, err = strconv.ParseFloat(literal, 64) - if err == nil { - return - } else if err.(*strconv.NumError).Err == strconv.ErrRange { - // Infinity, etc. - return value, nil - } - - err = parseIntErr - - if err.(*strconv.NumError).Err == strconv.ErrRange { - if len(literal) > 2 && literal[0] == '0' && (literal[1] == 'X' || literal[1] == 'x') { - // Could just be a very large number (e.g. 0x8000000000000000) - var value float64 - literal = literal[2:] - for _, chr := range literal { - digit := digitValue(chr) - if digit >= 16 { - goto error - } - value = value*16 + float64(digit) - } - return value, nil - } - } - -error: - return nil, errors.New("Illegal numeric literal") -} - -func parseStringLiteral(literal string) (string, error) { - // Best case scenario... - if literal == "" { - return "", nil - } - - // Slightly less-best case scenario... - if !strings.ContainsRune(literal, '\\') { - return literal, nil - } - - str := literal - buffer := bytes.NewBuffer(make([]byte, 0, 3*len(literal)/2)) - - for len(str) > 0 { - switch chr := str[0]; { - // We do not explicitly handle the case of the quote - // value, which can be: " ' / - // This assumes we're already passed a partially well-formed literal - case chr >= utf8.RuneSelf: - chr, size := utf8.DecodeRuneInString(str) - buffer.WriteRune(chr) - str = str[size:] - continue - case chr != '\\': - buffer.WriteByte(chr) - str = str[1:] - continue - } - - if len(str) <= 1 { - panic("len(str) <= 1") - } - chr := str[1] - var value rune - if chr >= utf8.RuneSelf { - str = str[1:] - var size int - value, size = utf8.DecodeRuneInString(str) - str = str[size:] // \ + - } else { - str = str[2:] // \ - switch chr { - case 'b': - value = '\b' - case 'f': - value = '\f' - case 'n': - value = '\n' - case 'r': - value = '\r' - case 't': - value = '\t' - case 'v': - value = '\v' - case 'x', 'u': - size := 0 - switch chr { - case 'x': - size = 2 - case 'u': - size = 4 - } - if len(str) < size { - return "", fmt.Errorf("invalid escape: \\%s: len(%q) != %d", string(chr), str, size) - } - for j := 0; j < size; j++ { - decimal, ok := hex2decimal(str[j]) - if !ok { - return "", fmt.Errorf("invalid escape: \\%s: %q", string(chr), str[:size]) - } - value = value<<4 | decimal - } - str = str[size:] - if chr == 'x' { - break - } - if value > utf8.MaxRune { - panic("value > utf8.MaxRune") - } - case '0': - if len(str) == 0 || '0' > str[0] || str[0] > '7' { - value = 0 - break - } - fallthrough - case '1', '2', '3', '4', '5', '6', '7': - // TODO strict - value = rune(chr) - '0' - j := 0 - for ; j < 2; j++ { - if len(str) < j+1 { - break - } - chr := str[j] - if '0' > chr || chr > '7' { - break - } - decimal := rune(str[j]) - '0' - value = (value << 3) | decimal - } - str = str[j:] - case '\\': - value = '\\' - case '\'', '"': - value = rune(chr) - case '\r': - if len(str) > 0 { - if str[0] == '\n' { - str = str[1:] - } - } - fallthrough - case '\n': - continue - default: - value = rune(chr) - } - } - buffer.WriteRune(value) - } - - return buffer.String(), nil -} - -func (self *_parser) scanNumericLiteral(decimalPoint bool) (token.Token, string) { - - offset := self.chrOffset - tkn := token.NUMBER - - if decimalPoint { - offset-- - self.scanMantissa(10) - goto exponent - } - - if self.chr == '0' { - offset := self.chrOffset - self.read() - if self.chr == 'x' || self.chr == 'X' { - // Hexadecimal - self.read() - if isDigit(self.chr, 16) { - self.read() - } else { - return token.ILLEGAL, self.str[offset:self.chrOffset] - } - self.scanMantissa(16) - - if self.chrOffset-offset <= 2 { - // Only "0x" or "0X" - self.error(0, "Illegal hexadecimal number") - } - - goto hexadecimal - } else if self.chr == '.' { - // Float - goto float - } else { - // Octal, Float - if self.chr == 'e' || self.chr == 'E' { - goto exponent - } - self.scanMantissa(8) - if self.chr == '8' || self.chr == '9' { - return token.ILLEGAL, self.str[offset:self.chrOffset] - } - goto octal - } - } - - self.scanMantissa(10) - -float: - if self.chr == '.' { - self.read() - self.scanMantissa(10) - } - -exponent: - if self.chr == 'e' || self.chr == 'E' { - self.read() - if self.chr == '-' || self.chr == '+' { - self.read() - } - if isDecimalDigit(self.chr) { - self.read() - self.scanMantissa(10) - } else { - return token.ILLEGAL, self.str[offset:self.chrOffset] - } - } - -hexadecimal: -octal: - if isIdentifierStart(self.chr) || isDecimalDigit(self.chr) { - return token.ILLEGAL, self.str[offset:self.chrOffset] - } - - return tkn, self.str[offset:self.chrOffset] -} diff --git a/vendor/github.com/robertkrimen/otto/parser/parser.go b/vendor/github.com/robertkrimen/otto/parser/parser.go deleted file mode 100644 index 75b7c500c439..000000000000 --- a/vendor/github.com/robertkrimen/otto/parser/parser.go +++ /dev/null @@ -1,344 +0,0 @@ -/* -Package parser implements a parser for JavaScript. - - import ( - "github.com/robertkrimen/otto/parser" - ) - -Parse and return an AST - - filename := "" // A filename is optional - src := ` - // Sample xyzzy example - (function(){ - if (3.14159 > 0) { - console.log("Hello, World."); - return; - } - - var xyzzy = NaN; - console.log("Nothing happens."); - return xyzzy; - })(); - ` - - // Parse some JavaScript, yielding a *ast.Program and/or an ErrorList - program, err := parser.ParseFile(nil, filename, src, 0) - -Warning - -The parser and AST interfaces are still works-in-progress (particularly where -node types are concerned) and may change in the future. - -*/ -package parser - -import ( - "bytes" - "encoding/base64" - "errors" - "io" - "io/ioutil" - - "github.com/robertkrimen/otto/ast" - "github.com/robertkrimen/otto/file" - "github.com/robertkrimen/otto/token" - "gopkg.in/sourcemap.v1" -) - -// A Mode value is a set of flags (or 0). They control optional parser functionality. -type Mode uint - -const ( - IgnoreRegExpErrors Mode = 1 << iota // Ignore RegExp compatibility errors (allow backtracking) - StoreComments // Store the comments from source to the comments map -) - -type _parser struct { - str string - length int - base int - - chr rune // The current character - chrOffset int // The offset of current character - offset int // The offset after current character (may be greater than 1) - - idx file.Idx // The index of token - token token.Token // The token - literal string // The literal of the token, if any - - scope *_scope - insertSemicolon bool // If we see a newline, then insert an implicit semicolon - implicitSemicolon bool // An implicit semicolon exists - - errors ErrorList - - recover struct { - // Scratch when trying to seek to the next statement, etc. - idx file.Idx - count int - } - - mode Mode - - file *file.File - - comments *ast.Comments -} - -type Parser interface { - Scan() (tkn token.Token, literal string, idx file.Idx) -} - -func _newParser(filename, src string, base int, sm *sourcemap.Consumer) *_parser { - return &_parser{ - chr: ' ', // This is set so we can start scanning by skipping whitespace - str: src, - length: len(src), - base: base, - file: file.NewFile(filename, src, base).WithSourceMap(sm), - comments: ast.NewComments(), - } -} - -// Returns a new Parser. -func NewParser(filename, src string) Parser { - return _newParser(filename, src, 1, nil) -} - -func ReadSource(filename string, src interface{}) ([]byte, error) { - if src != nil { - switch src := src.(type) { - case string: - return []byte(src), nil - case []byte: - return src, nil - case *bytes.Buffer: - if src != nil { - return src.Bytes(), nil - } - case io.Reader: - var bfr bytes.Buffer - if _, err := io.Copy(&bfr, src); err != nil { - return nil, err - } - return bfr.Bytes(), nil - } - return nil, errors.New("invalid source") - } - return ioutil.ReadFile(filename) -} - -func ReadSourceMap(filename string, src interface{}) (*sourcemap.Consumer, error) { - if src == nil { - return nil, nil - } - - switch src := src.(type) { - case string: - return sourcemap.Parse(filename, []byte(src)) - case []byte: - return sourcemap.Parse(filename, src) - case *bytes.Buffer: - if src != nil { - return sourcemap.Parse(filename, src.Bytes()) - } - case io.Reader: - var bfr bytes.Buffer - if _, err := io.Copy(&bfr, src); err != nil { - return nil, err - } - return sourcemap.Parse(filename, bfr.Bytes()) - case *sourcemap.Consumer: - return src, nil - } - - return nil, errors.New("invalid sourcemap type") -} - -func ParseFileWithSourceMap(fileSet *file.FileSet, filename string, javascriptSource, sourcemapSource interface{}, mode Mode) (*ast.Program, error) { - src, err := ReadSource(filename, javascriptSource) - if err != nil { - return nil, err - } - - if sourcemapSource == nil { - lines := bytes.Split(src, []byte("\n")) - lastLine := lines[len(lines)-1] - if bytes.HasPrefix(lastLine, []byte("//# sourceMappingURL=data:application/json")) { - bits := bytes.SplitN(lastLine, []byte(","), 2) - if len(bits) == 2 { - if d, err := base64.StdEncoding.DecodeString(string(bits[1])); err == nil { - sourcemapSource = d - } - } - } - } - - sm, err := ReadSourceMap(filename, sourcemapSource) - if err != nil { - return nil, err - } - - base := 1 - if fileSet != nil { - base = fileSet.AddFile(filename, string(src)) - } - - parser := _newParser(filename, string(src), base, sm) - parser.mode = mode - program, err := parser.parse() - program.Comments = parser.comments.CommentMap - - return program, err -} - -// ParseFile parses the source code of a single JavaScript/ECMAScript source file and returns -// the corresponding ast.Program node. -// -// If fileSet == nil, ParseFile parses source without a FileSet. -// If fileSet != nil, ParseFile first adds filename and src to fileSet. -// -// The filename argument is optional and is used for labelling errors, etc. -// -// src may be a string, a byte slice, a bytes.Buffer, or an io.Reader, but it MUST always be in UTF-8. -// -// // Parse some JavaScript, yielding a *ast.Program and/or an ErrorList -// program, err := parser.ParseFile(nil, "", `if (abc > 1) {}`, 0) -// -func ParseFile(fileSet *file.FileSet, filename string, src interface{}, mode Mode) (*ast.Program, error) { - return ParseFileWithSourceMap(fileSet, filename, src, nil, mode) -} - -// ParseFunction parses a given parameter list and body as a function and returns the -// corresponding ast.FunctionLiteral node. -// -// The parameter list, if any, should be a comma-separated list of identifiers. -// -func ParseFunction(parameterList, body string) (*ast.FunctionLiteral, error) { - - src := "(function(" + parameterList + ") {\n" + body + "\n})" - - parser := _newParser("", src, 1, nil) - program, err := parser.parse() - if err != nil { - return nil, err - } - - return program.Body[0].(*ast.ExpressionStatement).Expression.(*ast.FunctionLiteral), nil -} - -// Scan reads a single token from the source at the current offset, increments the offset and -// returns the token.Token token, a string literal representing the value of the token (if applicable) -// and it's current file.Idx index. -func (self *_parser) Scan() (tkn token.Token, literal string, idx file.Idx) { - return self.scan() -} - -func (self *_parser) slice(idx0, idx1 file.Idx) string { - from := int(idx0) - self.base - to := int(idx1) - self.base - if from >= 0 && to <= len(self.str) { - return self.str[from:to] - } - - return "" -} - -func (self *_parser) parse() (*ast.Program, error) { - self.next() - program := self.parseProgram() - if false { - self.errors.Sort() - } - - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(program, self.comments.FetchAll(), ast.TRAILING) - } - - return program, self.errors.Err() -} - -func (self *_parser) next() { - self.token, self.literal, self.idx = self.scan() -} - -func (self *_parser) optionalSemicolon() { - if self.token == token.SEMICOLON { - self.next() - return - } - - if self.implicitSemicolon { - self.implicitSemicolon = false - return - } - - if self.token != token.EOF && self.token != token.RIGHT_BRACE { - self.expect(token.SEMICOLON) - } -} - -func (self *_parser) semicolon() { - if self.token != token.RIGHT_PARENTHESIS && self.token != token.RIGHT_BRACE { - if self.implicitSemicolon { - self.implicitSemicolon = false - return - } - - self.expect(token.SEMICOLON) - } -} - -func (self *_parser) idxOf(offset int) file.Idx { - return file.Idx(self.base + offset) -} - -func (self *_parser) expect(value token.Token) file.Idx { - idx := self.idx - if self.token != value { - self.errorUnexpectedToken(self.token) - } - self.next() - return idx -} - -func lineCount(str string) (int, int) { - line, last := 0, -1 - pair := false - for index, chr := range str { - switch chr { - case '\r': - line += 1 - last = index - pair = true - continue - case '\n': - if !pair { - line += 1 - } - last = index - case '\u2028', '\u2029': - line += 1 - last = index + 2 - } - pair = false - } - return line, last -} - -func (self *_parser) position(idx file.Idx) file.Position { - position := file.Position{} - offset := int(idx) - self.base - str := self.str[:offset] - position.Filename = self.file.Name() - line, last := lineCount(str) - position.Line = 1 + line - if last >= 0 { - position.Column = offset - last - } else { - position.Column = 1 + len(str) - } - - return position -} diff --git a/vendor/github.com/robertkrimen/otto/parser/regexp.go b/vendor/github.com/robertkrimen/otto/parser/regexp.go deleted file mode 100644 index f614dae74541..000000000000 --- a/vendor/github.com/robertkrimen/otto/parser/regexp.go +++ /dev/null @@ -1,358 +0,0 @@ -package parser - -import ( - "bytes" - "fmt" - "strconv" -) - -type _RegExp_parser struct { - str string - length int - - chr rune // The current character - chrOffset int // The offset of current character - offset int // The offset after current character (may be greater than 1) - - errors []error - invalid bool // The input is an invalid JavaScript RegExp - - goRegexp *bytes.Buffer -} - -// TransformRegExp transforms a JavaScript pattern into a Go "regexp" pattern. -// -// re2 (Go) cannot do backtracking, so the presence of a lookahead (?=) (?!) or -// backreference (\1, \2, ...) will cause an error. -// -// re2 (Go) has a different definition for \s: [\t\n\f\r ]. -// The JavaScript definition, on the other hand, also includes \v, Unicode "Separator, Space", etc. -// -// If the pattern is invalid (not valid even in JavaScript), then this function -// returns the empty string and an error. -// -// If the pattern is valid, but incompatible (contains a lookahead or backreference), -// then this function returns the transformation (a non-empty string) AND an error. -func TransformRegExp(pattern string) (string, error) { - - if pattern == "" { - return "", nil - } - - // TODO If without \, if without (?=, (?!, then another shortcut - - parser := _RegExp_parser{ - str: pattern, - length: len(pattern), - goRegexp: bytes.NewBuffer(make([]byte, 0, 3*len(pattern)/2)), - } - parser.read() // Pull in the first character - parser.scan() - var err error - if len(parser.errors) > 0 { - err = parser.errors[0] - } - if parser.invalid { - return "", err - } - - // Might not be re2 compatible, but is still a valid JavaScript RegExp - return parser.goRegexp.String(), err -} - -func (self *_RegExp_parser) scan() { - for self.chr != -1 { - switch self.chr { - case '\\': - self.read() - self.scanEscape(false) - case '(': - self.pass() - self.scanGroup() - case '[': - self.pass() - self.scanBracket() - case ')': - self.error(-1, "Unmatched ')'") - self.invalid = true - self.pass() - default: - self.pass() - } - } -} - -// (...) -func (self *_RegExp_parser) scanGroup() { - str := self.str[self.chrOffset:] - if len(str) > 1 { // A possibility of (?= or (?! - if str[0] == '?' { - if str[1] == '=' || str[1] == '!' { - self.error(-1, "re2: Invalid (%s) ", self.str[self.chrOffset:self.chrOffset+2]) - } - } - } - for self.chr != -1 && self.chr != ')' { - switch self.chr { - case '\\': - self.read() - self.scanEscape(false) - case '(': - self.pass() - self.scanGroup() - case '[': - self.pass() - self.scanBracket() - default: - self.pass() - continue - } - } - if self.chr != ')' { - self.error(-1, "Unterminated group") - self.invalid = true - return - } - self.pass() -} - -// [...] -func (self *_RegExp_parser) scanBracket() { - for self.chr != -1 { - if self.chr == ']' { - break - } else if self.chr == '\\' { - self.read() - self.scanEscape(true) - continue - } - self.pass() - } - if self.chr != ']' { - self.error(-1, "Unterminated character class") - self.invalid = true - return - } - self.pass() -} - -// \... -func (self *_RegExp_parser) scanEscape(inClass bool) { - offset := self.chrOffset - - var length, base uint32 - switch self.chr { - - case '0', '1', '2', '3', '4', '5', '6', '7': - var value int64 - size := 0 - for { - digit := int64(digitValue(self.chr)) - if digit >= 8 { - // Not a valid digit - break - } - value = value*8 + digit - self.read() - size += 1 - } - if size == 1 { // The number of characters read - _, err := self.goRegexp.Write([]byte{'\\', byte(value) + '0'}) - if err != nil { - self.errors = append(self.errors, err) - } - if value != 0 { - // An invalid backreference - self.error(-1, "re2: Invalid \\%d ", value) - } - return - } - tmp := []byte{'\\', 'x', '0', 0} - if value >= 16 { - tmp = tmp[0:2] - } else { - tmp = tmp[0:3] - } - tmp = strconv.AppendInt(tmp, value, 16) - _, err := self.goRegexp.Write(tmp) - if err != nil { - self.errors = append(self.errors, err) - } - return - - case '8', '9': - size := 0 - for { - digit := digitValue(self.chr) - if digit >= 10 { - // Not a valid digit - break - } - self.read() - size += 1 - } - err := self.goRegexp.WriteByte('\\') - if err != nil { - self.errors = append(self.errors, err) - } - _, err = self.goRegexp.WriteString(self.str[offset:self.chrOffset]) - if err != nil { - self.errors = append(self.errors, err) - } - self.error(-1, "re2: Invalid \\%s ", self.str[offset:self.chrOffset]) - return - - case 'x': - self.read() - length, base = 2, 16 - - case 'u': - self.read() - length, base = 4, 16 - - case 'b': - if inClass { - _, err := self.goRegexp.Write([]byte{'\\', 'x', '0', '8'}) - if err != nil { - self.errors = append(self.errors, err) - } - self.read() - return - } - fallthrough - - case 'B': - fallthrough - - case 'd', 'D', 's', 'S', 'w', 'W': - // This is slightly broken, because ECMAScript - // includes \v in \s, \S, while re2 does not - fallthrough - - case '\\': - fallthrough - - case 'f', 'n', 'r', 't', 'v': - err := self.goRegexp.WriteByte('\\') - if err != nil { - self.errors = append(self.errors, err) - } - self.pass() - return - - case 'c': - self.read() - var value int64 - if 'a' <= self.chr && self.chr <= 'z' { - value = int64(self.chr) - 'a' + 1 - } else if 'A' <= self.chr && self.chr <= 'Z' { - value = int64(self.chr) - 'A' + 1 - } else { - err := self.goRegexp.WriteByte('c') - if err != nil { - self.errors = append(self.errors, err) - } - return - } - tmp := []byte{'\\', 'x', '0', 0} - if value >= 16 { - tmp = tmp[0:2] - } else { - tmp = tmp[0:3] - } - tmp = strconv.AppendInt(tmp, value, 16) - _, err := self.goRegexp.Write(tmp) - if err != nil { - self.errors = append(self.errors, err) - } - self.read() - return - - default: - // $ is an identifier character, so we have to have - // a special case for it here - if self.chr == '$' || !isIdentifierPart(self.chr) { - // A non-identifier character needs escaping - err := self.goRegexp.WriteByte('\\') - if err != nil { - self.errors = append(self.errors, err) - } - } else { - // Unescape the character for re2 - } - self.pass() - return - } - - // Otherwise, we're a \u.... or \x... - valueOffset := self.chrOffset - - var value uint32 - { - length := length - for ; length > 0; length-- { - digit := uint32(digitValue(self.chr)) - if digit >= base { - // Not a valid digit - goto skip - } - value = value*base + digit - self.read() - } - } - - if length == 4 { - _, err := self.goRegexp.Write([]byte{ - '\\', - 'x', - '{', - self.str[valueOffset+0], - self.str[valueOffset+1], - self.str[valueOffset+2], - self.str[valueOffset+3], - '}', - }) - if err != nil { - self.errors = append(self.errors, err) - } - } else if length == 2 { - _, err := self.goRegexp.Write([]byte{ - '\\', - 'x', - self.str[valueOffset+0], - self.str[valueOffset+1], - }) - if err != nil { - self.errors = append(self.errors, err) - } - } else { - // Should never, ever get here... - self.error(-1, "re2: Illegal branch in scanEscape") - goto skip - } - - return - -skip: - _, err := self.goRegexp.WriteString(self.str[offset:self.chrOffset]) - if err != nil { - self.errors = append(self.errors, err) - } -} - -func (self *_RegExp_parser) pass() { - if self.chr != -1 { - _, err := self.goRegexp.WriteRune(self.chr) - if err != nil { - self.errors = append(self.errors, err) - } - } - self.read() -} - -// TODO Better error reporting, use the offset, etc. -func (self *_RegExp_parser) error(offset int, msg string, msgValues ...interface{}) error { - err := fmt.Errorf(msg, msgValues...) - self.errors = append(self.errors, err) - return err -} diff --git a/vendor/github.com/robertkrimen/otto/parser/scope.go b/vendor/github.com/robertkrimen/otto/parser/scope.go deleted file mode 100644 index e1dbdda13213..000000000000 --- a/vendor/github.com/robertkrimen/otto/parser/scope.go +++ /dev/null @@ -1,44 +0,0 @@ -package parser - -import ( - "github.com/robertkrimen/otto/ast" -) - -type _scope struct { - outer *_scope - allowIn bool - inIteration bool - inSwitch bool - inFunction bool - declarationList []ast.Declaration - - labels []string -} - -func (self *_parser) openScope() { - self.scope = &_scope{ - outer: self.scope, - allowIn: true, - } -} - -func (self *_parser) closeScope() { - self.scope = self.scope.outer -} - -func (self *_scope) declare(declaration ast.Declaration) { - self.declarationList = append(self.declarationList, declaration) -} - -func (self *_scope) hasLabel(name string) bool { - for _, label := range self.labels { - if label == name { - return true - } - } - if self.outer != nil && !self.inFunction { - // Crossing a function boundary to look for a label is verboten - return self.outer.hasLabel(name) - } - return false -} diff --git a/vendor/github.com/robertkrimen/otto/parser/statement.go b/vendor/github.com/robertkrimen/otto/parser/statement.go deleted file mode 100644 index 6ff19d9753c1..000000000000 --- a/vendor/github.com/robertkrimen/otto/parser/statement.go +++ /dev/null @@ -1,938 +0,0 @@ -package parser - -import ( - "github.com/robertkrimen/otto/ast" - "github.com/robertkrimen/otto/token" -) - -func (self *_parser) parseBlockStatement() *ast.BlockStatement { - node := &ast.BlockStatement{} - - // Find comments before the leading brace - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(node, self.comments.FetchAll(), ast.LEADING) - self.comments.Unset() - } - - node.LeftBrace = self.expect(token.LEFT_BRACE) - node.List = self.parseStatementList() - - if self.mode&StoreComments != 0 { - self.comments.Unset() - self.comments.CommentMap.AddComments(node, self.comments.FetchAll(), ast.FINAL) - self.comments.AfterBlock() - } - - node.RightBrace = self.expect(token.RIGHT_BRACE) - - // Find comments after the trailing brace - if self.mode&StoreComments != 0 { - self.comments.ResetLineBreak() - self.comments.CommentMap.AddComments(node, self.comments.Fetch(), ast.TRAILING) - } - - return node -} - -func (self *_parser) parseEmptyStatement() ast.Statement { - idx := self.expect(token.SEMICOLON) - return &ast.EmptyStatement{Semicolon: idx} -} - -func (self *_parser) parseStatementList() (list []ast.Statement) { - for self.token != token.RIGHT_BRACE && self.token != token.EOF { - statement := self.parseStatement() - list = append(list, statement) - } - - return -} - -func (self *_parser) parseStatement() ast.Statement { - - if self.token == token.EOF { - self.errorUnexpectedToken(self.token) - return &ast.BadStatement{From: self.idx, To: self.idx + 1} - } - - if self.mode&StoreComments != 0 { - self.comments.ResetLineBreak() - } - - switch self.token { - case token.SEMICOLON: - return self.parseEmptyStatement() - case token.LEFT_BRACE: - return self.parseBlockStatement() - case token.IF: - return self.parseIfStatement() - case token.DO: - statement := self.parseDoWhileStatement() - self.comments.PostProcessNode(statement) - return statement - case token.WHILE: - return self.parseWhileStatement() - case token.FOR: - return self.parseForOrForInStatement() - case token.BREAK: - return self.parseBreakStatement() - case token.CONTINUE: - return self.parseContinueStatement() - case token.DEBUGGER: - return self.parseDebuggerStatement() - case token.WITH: - return self.parseWithStatement() - case token.VAR: - return self.parseVariableStatement() - case token.FUNCTION: - return self.parseFunctionStatement() - case token.SWITCH: - return self.parseSwitchStatement() - case token.RETURN: - return self.parseReturnStatement() - case token.THROW: - return self.parseThrowStatement() - case token.TRY: - return self.parseTryStatement() - } - - var comments []*ast.Comment - if self.mode&StoreComments != 0 { - comments = self.comments.FetchAll() - } - - expression := self.parseExpression() - - if identifier, isIdentifier := expression.(*ast.Identifier); isIdentifier && self.token == token.COLON { - // LabelledStatement - colon := self.idx - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() // : - - label := identifier.Name - for _, value := range self.scope.labels { - if label == value { - self.error(identifier.Idx0(), "Label '%s' already exists", label) - } - } - var labelComments []*ast.Comment - if self.mode&StoreComments != 0 { - labelComments = self.comments.FetchAll() - } - self.scope.labels = append(self.scope.labels, label) // Push the label - statement := self.parseStatement() - self.scope.labels = self.scope.labels[:len(self.scope.labels)-1] // Pop the label - exp := &ast.LabelledStatement{ - Label: identifier, - Colon: colon, - Statement: statement, - } - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(exp, labelComments, ast.LEADING) - } - - return exp - } - - self.optionalSemicolon() - - statement := &ast.ExpressionStatement{ - Expression: expression, - } - - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(statement, comments, ast.LEADING) - } - return statement -} - -func (self *_parser) parseTryStatement() ast.Statement { - var tryComments []*ast.Comment - if self.mode&StoreComments != 0 { - tryComments = self.comments.FetchAll() - } - node := &ast.TryStatement{ - Try: self.expect(token.TRY), - Body: self.parseBlockStatement(), - } - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(node, tryComments, ast.LEADING) - self.comments.CommentMap.AddComments(node.Body, self.comments.FetchAll(), ast.TRAILING) - } - - if self.token == token.CATCH { - catch := self.idx - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - self.expect(token.LEFT_PARENTHESIS) - if self.token != token.IDENTIFIER { - self.expect(token.IDENTIFIER) - self.nextStatement() - return &ast.BadStatement{From: catch, To: self.idx} - } else { - identifier := self.parseIdentifier() - self.expect(token.RIGHT_PARENTHESIS) - node.Catch = &ast.CatchStatement{ - Catch: catch, - Parameter: identifier, - Body: self.parseBlockStatement(), - } - - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(node.Catch.Body, self.comments.FetchAll(), ast.TRAILING) - } - } - } - - if self.token == token.FINALLY { - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() - if self.mode&StoreComments != 0 { - tryComments = self.comments.FetchAll() - } - - node.Finally = self.parseBlockStatement() - - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(node.Finally, tryComments, ast.LEADING) - } - } - - if node.Catch == nil && node.Finally == nil { - self.error(node.Try, "Missing catch or finally after try") - return &ast.BadStatement{From: node.Try, To: node.Body.Idx1()} - } - - return node -} - -func (self *_parser) parseFunctionParameterList() *ast.ParameterList { - opening := self.expect(token.LEFT_PARENTHESIS) - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - var list []*ast.Identifier - for self.token != token.RIGHT_PARENTHESIS && self.token != token.EOF { - if self.token != token.IDENTIFIER { - self.expect(token.IDENTIFIER) - } else { - identifier := self.parseIdentifier() - list = append(list, identifier) - } - if self.token != token.RIGHT_PARENTHESIS { - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.expect(token.COMMA) - } - } - closing := self.expect(token.RIGHT_PARENTHESIS) - - return &ast.ParameterList{ - Opening: opening, - List: list, - Closing: closing, - } -} - -func (self *_parser) parseParameterList() (list []string) { - for self.token != token.EOF { - if self.token != token.IDENTIFIER { - self.expect(token.IDENTIFIER) - } - list = append(list, self.literal) - self.next() - if self.token != token.EOF { - self.expect(token.COMMA) - } - } - return -} - -func (self *_parser) parseFunctionStatement() *ast.FunctionStatement { - var comments []*ast.Comment - if self.mode&StoreComments != 0 { - comments = self.comments.FetchAll() - } - function := &ast.FunctionStatement{ - Function: self.parseFunction(true), - } - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(function, comments, ast.LEADING) - } - - return function -} - -func (self *_parser) parseFunction(declaration bool) *ast.FunctionLiteral { - - node := &ast.FunctionLiteral{ - Function: self.expect(token.FUNCTION), - } - - var name *ast.Identifier - if self.token == token.IDENTIFIER { - name = self.parseIdentifier() - if declaration { - self.scope.declare(&ast.FunctionDeclaration{ - Function: node, - }) - } - } else if declaration { - // Use expect error handling - self.expect(token.IDENTIFIER) - } - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - node.Name = name - node.ParameterList = self.parseFunctionParameterList() - self.parseFunctionBlock(node) - node.Source = self.slice(node.Idx0(), node.Idx1()) - - return node -} - -func (self *_parser) parseFunctionBlock(node *ast.FunctionLiteral) { - { - self.openScope() - inFunction := self.scope.inFunction - self.scope.inFunction = true - defer func() { - self.scope.inFunction = inFunction - self.closeScope() - }() - node.Body = self.parseBlockStatement() - node.DeclarationList = self.scope.declarationList - } -} - -func (self *_parser) parseDebuggerStatement() ast.Statement { - idx := self.expect(token.DEBUGGER) - - node := &ast.DebuggerStatement{ - Debugger: idx, - } - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(node, self.comments.FetchAll(), ast.TRAILING) - } - - self.semicolon() - return node -} - -func (self *_parser) parseReturnStatement() ast.Statement { - idx := self.expect(token.RETURN) - var comments []*ast.Comment - if self.mode&StoreComments != 0 { - comments = self.comments.FetchAll() - } - - if !self.scope.inFunction { - self.error(idx, "Illegal return statement") - self.nextStatement() - return &ast.BadStatement{From: idx, To: self.idx} - } - - node := &ast.ReturnStatement{ - Return: idx, - } - - if !self.implicitSemicolon && self.token != token.SEMICOLON && self.token != token.RIGHT_BRACE && self.token != token.EOF { - node.Argument = self.parseExpression() - } - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(node, comments, ast.LEADING) - } - - self.semicolon() - - return node -} - -func (self *_parser) parseThrowStatement() ast.Statement { - var comments []*ast.Comment - if self.mode&StoreComments != 0 { - comments = self.comments.FetchAll() - } - idx := self.expect(token.THROW) - - if self.implicitSemicolon { - if self.chr == -1 { // Hackish - self.error(idx, "Unexpected end of input") - } else { - self.error(idx, "Illegal newline after throw") - } - self.nextStatement() - return &ast.BadStatement{From: idx, To: self.idx} - } - - node := &ast.ThrowStatement{ - Argument: self.parseExpression(), - } - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(node, comments, ast.LEADING) - } - - self.semicolon() - - return node -} - -func (self *_parser) parseSwitchStatement() ast.Statement { - var comments []*ast.Comment - if self.mode&StoreComments != 0 { - comments = self.comments.FetchAll() - } - self.expect(token.SWITCH) - if self.mode&StoreComments != 0 { - comments = append(comments, self.comments.FetchAll()...) - } - self.expect(token.LEFT_PARENTHESIS) - node := &ast.SwitchStatement{ - Discriminant: self.parseExpression(), - Default: -1, - } - self.expect(token.RIGHT_PARENTHESIS) - if self.mode&StoreComments != 0 { - comments = append(comments, self.comments.FetchAll()...) - } - - self.expect(token.LEFT_BRACE) - - inSwitch := self.scope.inSwitch - self.scope.inSwitch = true - defer func() { - self.scope.inSwitch = inSwitch - }() - - for index := 0; self.token != token.EOF; index++ { - if self.token == token.RIGHT_BRACE { - self.next() - break - } - - clause := self.parseCaseStatement() - if clause.Test == nil { - if node.Default != -1 { - self.error(clause.Case, "Already saw a default in switch") - } - node.Default = index - } - node.Body = append(node.Body, clause) - } - - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(node, comments, ast.LEADING) - } - - return node -} - -func (self *_parser) parseWithStatement() ast.Statement { - var comments []*ast.Comment - if self.mode&StoreComments != 0 { - comments = self.comments.FetchAll() - } - self.expect(token.WITH) - var withComments []*ast.Comment - if self.mode&StoreComments != 0 { - withComments = self.comments.FetchAll() - } - - self.expect(token.LEFT_PARENTHESIS) - - node := &ast.WithStatement{ - Object: self.parseExpression(), - } - self.expect(token.RIGHT_PARENTHESIS) - - if self.mode&StoreComments != 0 { - //comments = append(comments, self.comments.FetchAll()...) - self.comments.CommentMap.AddComments(node, comments, ast.LEADING) - self.comments.CommentMap.AddComments(node, withComments, ast.WITH) - } - - node.Body = self.parseStatement() - - return node -} - -func (self *_parser) parseCaseStatement() *ast.CaseStatement { - node := &ast.CaseStatement{ - Case: self.idx, - } - - var comments []*ast.Comment - if self.mode&StoreComments != 0 { - comments = self.comments.FetchAll() - self.comments.Unset() - } - - if self.token == token.DEFAULT { - self.next() - } else { - self.expect(token.CASE) - node.Test = self.parseExpression() - } - - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.expect(token.COLON) - - for { - if self.token == token.EOF || - self.token == token.RIGHT_BRACE || - self.token == token.CASE || - self.token == token.DEFAULT { - break - } - consequent := self.parseStatement() - node.Consequent = append(node.Consequent, consequent) - } - - // Link the comments to the case statement - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(node, comments, ast.LEADING) - } - - return node -} - -func (self *_parser) parseIterationStatement() ast.Statement { - inIteration := self.scope.inIteration - self.scope.inIteration = true - defer func() { - self.scope.inIteration = inIteration - }() - return self.parseStatement() -} - -func (self *_parser) parseForIn(into ast.Expression) *ast.ForInStatement { - - // Already have consumed " in" - - source := self.parseExpression() - self.expect(token.RIGHT_PARENTHESIS) - body := self.parseIterationStatement() - - forin := &ast.ForInStatement{ - Into: into, - Source: source, - Body: body, - } - - return forin -} - -func (self *_parser) parseFor(initializer ast.Expression) *ast.ForStatement { - - // Already have consumed " ;" - - var test, update ast.Expression - - if self.token != token.SEMICOLON { - test = self.parseExpression() - } - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.expect(token.SEMICOLON) - - if self.token != token.RIGHT_PARENTHESIS { - update = self.parseExpression() - } - self.expect(token.RIGHT_PARENTHESIS) - body := self.parseIterationStatement() - - forstatement := &ast.ForStatement{ - Initializer: initializer, - Test: test, - Update: update, - Body: body, - } - - return forstatement -} - -func (self *_parser) parseForOrForInStatement() ast.Statement { - var comments []*ast.Comment - if self.mode&StoreComments != 0 { - comments = self.comments.FetchAll() - } - idx := self.expect(token.FOR) - var forComments []*ast.Comment - if self.mode&StoreComments != 0 { - forComments = self.comments.FetchAll() - } - self.expect(token.LEFT_PARENTHESIS) - - var left []ast.Expression - - forIn := false - if self.token != token.SEMICOLON { - - allowIn := self.scope.allowIn - self.scope.allowIn = false - if self.token == token.VAR { - var_ := self.idx - var varComments []*ast.Comment - if self.mode&StoreComments != 0 { - varComments = self.comments.FetchAll() - self.comments.Unset() - } - self.next() - list := self.parseVariableDeclarationList(var_) - if len(list) == 1 && self.token == token.IN { - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.next() // in - forIn = true - left = []ast.Expression{list[0]} // There is only one declaration - } else { - left = list - } - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(left[0], varComments, ast.LEADING) - } - } else { - left = append(left, self.parseExpression()) - if self.token == token.IN { - self.next() - forIn = true - } - } - self.scope.allowIn = allowIn - } - - if forIn { - switch left[0].(type) { - case *ast.Identifier, *ast.DotExpression, *ast.BracketExpression, *ast.VariableExpression: - // These are all acceptable - default: - self.error(idx, "Invalid left-hand side in for-in") - self.nextStatement() - return &ast.BadStatement{From: idx, To: self.idx} - } - - forin := self.parseForIn(left[0]) - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(forin, comments, ast.LEADING) - self.comments.CommentMap.AddComments(forin, forComments, ast.FOR) - } - return forin - } - - if self.mode&StoreComments != 0 { - self.comments.Unset() - } - self.expect(token.SEMICOLON) - initializer := &ast.SequenceExpression{Sequence: left} - forstatement := self.parseFor(initializer) - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(forstatement, comments, ast.LEADING) - self.comments.CommentMap.AddComments(forstatement, forComments, ast.FOR) - } - return forstatement -} - -func (self *_parser) parseVariableStatement() *ast.VariableStatement { - var comments []*ast.Comment - if self.mode&StoreComments != 0 { - comments = self.comments.FetchAll() - } - idx := self.expect(token.VAR) - - list := self.parseVariableDeclarationList(idx) - - statement := &ast.VariableStatement{ - Var: idx, - List: list, - } - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(statement, comments, ast.LEADING) - self.comments.Unset() - } - self.semicolon() - - return statement -} - -func (self *_parser) parseDoWhileStatement() ast.Statement { - inIteration := self.scope.inIteration - self.scope.inIteration = true - defer func() { - self.scope.inIteration = inIteration - }() - - var comments []*ast.Comment - if self.mode&StoreComments != 0 { - comments = self.comments.FetchAll() - } - self.expect(token.DO) - var doComments []*ast.Comment - if self.mode&StoreComments != 0 { - doComments = self.comments.FetchAll() - } - - node := &ast.DoWhileStatement{} - if self.token == token.LEFT_BRACE { - node.Body = self.parseBlockStatement() - } else { - node.Body = self.parseStatement() - } - - self.expect(token.WHILE) - var whileComments []*ast.Comment - if self.mode&StoreComments != 0 { - whileComments = self.comments.FetchAll() - } - self.expect(token.LEFT_PARENTHESIS) - node.Test = self.parseExpression() - self.expect(token.RIGHT_PARENTHESIS) - - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(node, comments, ast.LEADING) - self.comments.CommentMap.AddComments(node, doComments, ast.DO) - self.comments.CommentMap.AddComments(node, whileComments, ast.WHILE) - } - - return node -} - -func (self *_parser) parseWhileStatement() ast.Statement { - var comments []*ast.Comment - if self.mode&StoreComments != 0 { - comments = self.comments.FetchAll() - } - self.expect(token.WHILE) - - var whileComments []*ast.Comment - if self.mode&StoreComments != 0 { - whileComments = self.comments.FetchAll() - } - - self.expect(token.LEFT_PARENTHESIS) - node := &ast.WhileStatement{ - Test: self.parseExpression(), - } - self.expect(token.RIGHT_PARENTHESIS) - node.Body = self.parseIterationStatement() - - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(node, comments, ast.LEADING) - self.comments.CommentMap.AddComments(node, whileComments, ast.WHILE) - } - - return node -} - -func (self *_parser) parseIfStatement() ast.Statement { - var comments []*ast.Comment - if self.mode&StoreComments != 0 { - comments = self.comments.FetchAll() - } - self.expect(token.IF) - var ifComments []*ast.Comment - if self.mode&StoreComments != 0 { - ifComments = self.comments.FetchAll() - } - - self.expect(token.LEFT_PARENTHESIS) - node := &ast.IfStatement{ - Test: self.parseExpression(), - } - self.expect(token.RIGHT_PARENTHESIS) - if self.token == token.LEFT_BRACE { - node.Consequent = self.parseBlockStatement() - } else { - node.Consequent = self.parseStatement() - } - - if self.token == token.ELSE { - self.next() - node.Alternate = self.parseStatement() - } - - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(node, comments, ast.LEADING) - self.comments.CommentMap.AddComments(node, ifComments, ast.IF) - } - - return node -} - -func (self *_parser) parseSourceElement() ast.Statement { - statement := self.parseStatement() - //self.comments.Unset() - return statement -} - -func (self *_parser) parseSourceElements() []ast.Statement { - body := []ast.Statement(nil) - - for { - if self.token != token.STRING { - break - } - body = append(body, self.parseSourceElement()) - } - - for self.token != token.EOF { - body = append(body, self.parseSourceElement()) - } - - return body -} - -func (self *_parser) parseProgram() *ast.Program { - self.openScope() - defer self.closeScope() - return &ast.Program{ - Body: self.parseSourceElements(), - DeclarationList: self.scope.declarationList, - File: self.file, - } -} - -func (self *_parser) parseBreakStatement() ast.Statement { - var comments []*ast.Comment - if self.mode&StoreComments != 0 { - comments = self.comments.FetchAll() - } - idx := self.expect(token.BREAK) - semicolon := self.implicitSemicolon - if self.token == token.SEMICOLON { - semicolon = true - self.next() - } - - if semicolon || self.token == token.RIGHT_BRACE { - self.implicitSemicolon = false - if !self.scope.inIteration && !self.scope.inSwitch { - goto illegal - } - breakStatement := &ast.BranchStatement{ - Idx: idx, - Token: token.BREAK, - } - - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(breakStatement, comments, ast.LEADING) - self.comments.CommentMap.AddComments(breakStatement, self.comments.FetchAll(), ast.TRAILING) - } - - return breakStatement - } - - if self.token == token.IDENTIFIER { - identifier := self.parseIdentifier() - if !self.scope.hasLabel(identifier.Name) { - self.error(idx, "Undefined label '%s'", identifier.Name) - return &ast.BadStatement{From: idx, To: identifier.Idx1()} - } - self.semicolon() - breakStatement := &ast.BranchStatement{ - Idx: idx, - Token: token.BREAK, - Label: identifier, - } - if self.mode&StoreComments != 0 { - self.comments.CommentMap.AddComments(breakStatement, comments, ast.LEADING) - } - - return breakStatement - } - - self.expect(token.IDENTIFIER) - -illegal: - self.error(idx, "Illegal break statement") - self.nextStatement() - return &ast.BadStatement{From: idx, To: self.idx} -} - -func (self *_parser) parseContinueStatement() ast.Statement { - idx := self.expect(token.CONTINUE) - semicolon := self.implicitSemicolon - if self.token == token.SEMICOLON { - semicolon = true - self.next() - } - - if semicolon || self.token == token.RIGHT_BRACE { - self.implicitSemicolon = false - if !self.scope.inIteration { - goto illegal - } - return &ast.BranchStatement{ - Idx: idx, - Token: token.CONTINUE, - } - } - - if self.token == token.IDENTIFIER { - identifier := self.parseIdentifier() - if !self.scope.hasLabel(identifier.Name) { - self.error(idx, "Undefined label '%s'", identifier.Name) - return &ast.BadStatement{From: idx, To: identifier.Idx1()} - } - if !self.scope.inIteration { - goto illegal - } - self.semicolon() - return &ast.BranchStatement{ - Idx: idx, - Token: token.CONTINUE, - Label: identifier, - } - } - - self.expect(token.IDENTIFIER) - -illegal: - self.error(idx, "Illegal continue statement") - self.nextStatement() - return &ast.BadStatement{From: idx, To: self.idx} -} - -// Find the next statement after an error (recover) -func (self *_parser) nextStatement() { - for { - switch self.token { - case token.BREAK, token.CONTINUE, - token.FOR, token.IF, token.RETURN, token.SWITCH, - token.VAR, token.DO, token.TRY, token.WITH, - token.WHILE, token.THROW, token.CATCH, token.FINALLY: - // Return only if parser made some progress since last - // sync or if it has not reached 10 next calls without - // progress. Otherwise consume at least one token to - // avoid an endless parser loop - if self.idx == self.recover.idx && self.recover.count < 10 { - self.recover.count++ - return - } - if self.idx > self.recover.idx { - self.recover.idx = self.idx - self.recover.count = 0 - return - } - // Reaching here indicates a parser bug, likely an - // incorrect token list in this function, but it only - // leads to skipping of possibly correct code if a - // previous error is present, and thus is preferred - // over a non-terminating parse. - case token.EOF: - return - } - self.next() - } -} diff --git a/vendor/github.com/robertkrimen/otto/property.go b/vendor/github.com/robertkrimen/otto/property.go deleted file mode 100644 index 5445eccdeba4..000000000000 --- a/vendor/github.com/robertkrimen/otto/property.go +++ /dev/null @@ -1,220 +0,0 @@ -package otto - -// property - -type _propertyMode int - -const ( - modeWriteMask _propertyMode = 0700 - modeEnumerateMask = 0070 - modeConfigureMask = 0007 - modeOnMask = 0111 - modeOffMask = 0000 - modeSetMask = 0222 // If value is 2, then mode is neither "On" nor "Off" -) - -type _propertyGetSet [2]*_object - -var _nilGetSetObject _object = _object{} - -type _property struct { - value interface{} - mode _propertyMode -} - -func (self _property) writable() bool { - return self.mode&modeWriteMask == modeWriteMask&modeOnMask -} - -func (self *_property) writeOn() { - self.mode = (self.mode & ^modeWriteMask) | (modeWriteMask & modeOnMask) -} - -func (self *_property) writeOff() { - self.mode &= ^modeWriteMask -} - -func (self *_property) writeClear() { - self.mode = (self.mode & ^modeWriteMask) | (modeWriteMask & modeSetMask) -} - -func (self _property) writeSet() bool { - return 0 == self.mode&modeWriteMask&modeSetMask -} - -func (self _property) enumerable() bool { - return self.mode&modeEnumerateMask == modeEnumerateMask&modeOnMask -} - -func (self *_property) enumerateOn() { - self.mode = (self.mode & ^modeEnumerateMask) | (modeEnumerateMask & modeOnMask) -} - -func (self *_property) enumerateOff() { - self.mode &= ^modeEnumerateMask -} - -func (self _property) enumerateSet() bool { - return 0 == self.mode&modeEnumerateMask&modeSetMask -} - -func (self _property) configurable() bool { - return self.mode&modeConfigureMask == modeConfigureMask&modeOnMask -} - -func (self *_property) configureOn() { - self.mode = (self.mode & ^modeConfigureMask) | (modeConfigureMask & modeOnMask) -} - -func (self *_property) configureOff() { - self.mode &= ^modeConfigureMask -} - -func (self _property) configureSet() bool { - return 0 == self.mode&modeConfigureMask&modeSetMask -} - -func (self _property) copy() *_property { - property := self - return &property -} - -func (self _property) get(this *_object) Value { - switch value := self.value.(type) { - case Value: - return value - case _propertyGetSet: - if value[0] != nil { - return value[0].call(toValue(this), nil, false, nativeFrame) - } - } - return Value{} -} - -func (self _property) isAccessorDescriptor() bool { - setGet, test := self.value.(_propertyGetSet) - return test && (setGet[0] != nil || setGet[1] != nil) -} - -func (self _property) isDataDescriptor() bool { - if self.writeSet() { // Either "On" or "Off" - return true - } - value, valid := self.value.(Value) - return valid && !value.isEmpty() -} - -func (self _property) isGenericDescriptor() bool { - return !(self.isDataDescriptor() || self.isAccessorDescriptor()) -} - -func (self _property) isEmpty() bool { - return self.mode == 0222 && self.isGenericDescriptor() -} - -// _enumerableValue, _enumerableTrue, _enumerableFalse? -// .enumerableValue() .enumerableExists() - -func toPropertyDescriptor(rt *_runtime, value Value) (descriptor _property) { - objectDescriptor := value._object() - if objectDescriptor == nil { - panic(rt.panicTypeError()) - } - - { - descriptor.mode = modeSetMask // Initially nothing is set - if objectDescriptor.hasProperty("enumerable") { - if objectDescriptor.get("enumerable").bool() { - descriptor.enumerateOn() - } else { - descriptor.enumerateOff() - } - } - - if objectDescriptor.hasProperty("configurable") { - if objectDescriptor.get("configurable").bool() { - descriptor.configureOn() - } else { - descriptor.configureOff() - } - } - - if objectDescriptor.hasProperty("writable") { - if objectDescriptor.get("writable").bool() { - descriptor.writeOn() - } else { - descriptor.writeOff() - } - } - } - - var getter, setter *_object - getterSetter := false - - if objectDescriptor.hasProperty("get") { - value := objectDescriptor.get("get") - if value.IsDefined() { - if !value.isCallable() { - panic(rt.panicTypeError()) - } - getter = value._object() - getterSetter = true - } else { - getter = &_nilGetSetObject - getterSetter = true - } - } - - if objectDescriptor.hasProperty("set") { - value := objectDescriptor.get("set") - if value.IsDefined() { - if !value.isCallable() { - panic(rt.panicTypeError()) - } - setter = value._object() - getterSetter = true - } else { - setter = &_nilGetSetObject - getterSetter = true - } - } - - if getterSetter { - if descriptor.writeSet() { - panic(rt.panicTypeError()) - } - descriptor.value = _propertyGetSet{getter, setter} - } - - if objectDescriptor.hasProperty("value") { - if getterSetter { - panic(rt.panicTypeError()) - } - descriptor.value = objectDescriptor.get("value") - } - - return -} - -func (self *_runtime) fromPropertyDescriptor(descriptor _property) *_object { - object := self.newObject() - if descriptor.isDataDescriptor() { - object.defineProperty("value", descriptor.value.(Value), 0111, false) - object.defineProperty("writable", toValue_bool(descriptor.writable()), 0111, false) - } else if descriptor.isAccessorDescriptor() { - getSet := descriptor.value.(_propertyGetSet) - get := Value{} - if getSet[0] != nil { - get = toValue_object(getSet[0]) - } - set := Value{} - if getSet[1] != nil { - set = toValue_object(getSet[1]) - } - object.defineProperty("get", get, 0111, false) - object.defineProperty("set", set, 0111, false) - } - object.defineProperty("enumerable", toValue_bool(descriptor.enumerable()), 0111, false) - object.defineProperty("configurable", toValue_bool(descriptor.configurable()), 0111, false) - return object -} diff --git a/vendor/github.com/robertkrimen/otto/registry/README.markdown b/vendor/github.com/robertkrimen/otto/registry/README.markdown deleted file mode 100644 index ba2d389090a3..000000000000 --- a/vendor/github.com/robertkrimen/otto/registry/README.markdown +++ /dev/null @@ -1,51 +0,0 @@ -# registry --- - import "github.com/robertkrimen/otto/registry" - -Package registry is an expirmental package to facillitate altering the otto -runtime via import. - -This interface can change at any time. - -## Usage - -#### func Apply - -```go -func Apply(callback func(Entry)) -``` - -#### type Entry - -```go -type Entry struct { -} -``` - - -#### func Register - -```go -func Register(source func() string) *Entry -``` - -#### func (*Entry) Disable - -```go -func (self *Entry) Disable() -``` - -#### func (*Entry) Enable - -```go -func (self *Entry) Enable() -``` - -#### func (Entry) Source - -```go -func (self Entry) Source() string -``` - --- -**godocdown** http://github.com/robertkrimen/godocdown diff --git a/vendor/github.com/robertkrimen/otto/registry/registry.go b/vendor/github.com/robertkrimen/otto/registry/registry.go deleted file mode 100644 index 966638ac4c16..000000000000 --- a/vendor/github.com/robertkrimen/otto/registry/registry.go +++ /dev/null @@ -1,47 +0,0 @@ -/* -Package registry is an expirmental package to facillitate altering the otto runtime via import. - -This interface can change at any time. -*/ -package registry - -var registry []*Entry = make([]*Entry, 0) - -type Entry struct { - active bool - source func() string -} - -func newEntry(source func() string) *Entry { - return &Entry{ - active: true, - source: source, - } -} - -func (self *Entry) Enable() { - self.active = true -} - -func (self *Entry) Disable() { - self.active = false -} - -func (self Entry) Source() string { - return self.source() -} - -func Apply(callback func(Entry)) { - for _, entry := range registry { - if !entry.active { - continue - } - callback(*entry) - } -} - -func Register(source func() string) *Entry { - entry := newEntry(source) - registry = append(registry, entry) - return entry -} diff --git a/vendor/github.com/robertkrimen/otto/result.go b/vendor/github.com/robertkrimen/otto/result.go deleted file mode 100644 index 63642e7d039e..000000000000 --- a/vendor/github.com/robertkrimen/otto/result.go +++ /dev/null @@ -1,30 +0,0 @@ -package otto - -import () - -type _resultKind int - -const ( - resultNormal _resultKind = iota - resultReturn - resultBreak - resultContinue -) - -type _result struct { - kind _resultKind - value Value - target string -} - -func newReturnResult(value Value) _result { - return _result{resultReturn, value, ""} -} - -func newContinueResult(target string) _result { - return _result{resultContinue, emptyValue, target} -} - -func newBreakResult(target string) _result { - return _result{resultBreak, emptyValue, target} -} diff --git a/vendor/github.com/robertkrimen/otto/runtime.go b/vendor/github.com/robertkrimen/otto/runtime.go deleted file mode 100644 index 5762bd0c31b5..000000000000 --- a/vendor/github.com/robertkrimen/otto/runtime.go +++ /dev/null @@ -1,711 +0,0 @@ -package otto - -import ( - "errors" - "fmt" - "math" - "path" - "reflect" - "runtime" - "strconv" - "sync" - - "github.com/robertkrimen/otto/ast" - "github.com/robertkrimen/otto/parser" -) - -type _global struct { - Object *_object // Object( ... ), new Object( ... ) - 1 (length) - Function *_object // Function( ... ), new Function( ... ) - 1 - Array *_object // Array( ... ), new Array( ... ) - 1 - String *_object // String( ... ), new String( ... ) - 1 - Boolean *_object // Boolean( ... ), new Boolean( ... ) - 1 - Number *_object // Number( ... ), new Number( ... ) - 1 - Math *_object - Date *_object // Date( ... ), new Date( ... ) - 7 - RegExp *_object // RegExp( ... ), new RegExp( ... ) - 2 - Error *_object // Error( ... ), new Error( ... ) - 1 - EvalError *_object - TypeError *_object - RangeError *_object - ReferenceError *_object - SyntaxError *_object - URIError *_object - JSON *_object - - ObjectPrototype *_object // Object.prototype - FunctionPrototype *_object // Function.prototype - ArrayPrototype *_object // Array.prototype - StringPrototype *_object // String.prototype - BooleanPrototype *_object // Boolean.prototype - NumberPrototype *_object // Number.prototype - DatePrototype *_object // Date.prototype - RegExpPrototype *_object // RegExp.prototype - ErrorPrototype *_object // Error.prototype - EvalErrorPrototype *_object - TypeErrorPrototype *_object - RangeErrorPrototype *_object - ReferenceErrorPrototype *_object - SyntaxErrorPrototype *_object - URIErrorPrototype *_object -} - -type _runtime struct { - global _global - globalObject *_object - globalStash *_objectStash - scope *_scope - otto *Otto - eval *_object // The builtin eval, for determine indirect versus direct invocation - debugger func(*Otto) - random func() float64 - stackLimit int - traceLimit int - - labels []string // FIXME - lck sync.Mutex -} - -func (self *_runtime) enterScope(scope *_scope) { - scope.outer = self.scope - if self.scope != nil { - if self.stackLimit != 0 && self.scope.depth+1 >= self.stackLimit { - panic(self.panicRangeError("Maximum call stack size exceeded")) - } - - scope.depth = self.scope.depth + 1 - } - - self.scope = scope -} - -func (self *_runtime) leaveScope() { - self.scope = self.scope.outer -} - -// FIXME This is used in two places (cloning) -func (self *_runtime) enterGlobalScope() { - self.enterScope(newScope(self.globalStash, self.globalStash, self.globalObject)) -} - -func (self *_runtime) enterFunctionScope(outer _stash, this Value) *_fnStash { - if outer == nil { - outer = self.globalStash - } - stash := self.newFunctionStash(outer) - var thisObject *_object - switch this.kind { - case valueUndefined, valueNull: - thisObject = self.globalObject - default: - thisObject = self.toObject(this) - } - self.enterScope(newScope(stash, stash, thisObject)) - return stash -} - -func (self *_runtime) putValue(reference _reference, value Value) { - name := reference.putValue(value) - if name != "" { - // Why? -- If reference.base == nil - // strict = false - self.globalObject.defineProperty(name, value, 0111, false) - } -} - -func (self *_runtime) tryCatchEvaluate(inner func() Value) (tryValue Value, exception bool) { - // resultValue = The value of the block (e.g. the last statement) - // throw = Something was thrown - // throwValue = The value of what was thrown - // other = Something that changes flow (return, break, continue) that is not a throw - // Otherwise, some sort of unknown panic happened, we'll just propagate it - defer func() { - if caught := recover(); caught != nil { - if exception, ok := caught.(*_exception); ok { - caught = exception.eject() - } - switch caught := caught.(type) { - case _error: - exception = true - tryValue = toValue_object(self.newError(caught.name, caught.messageValue(), 0)) - case Value: - exception = true - tryValue = caught - default: - panic(caught) - } - } - }() - - tryValue = inner() - return -} - -// toObject - -func (self *_runtime) toObject(value Value) *_object { - switch value.kind { - case valueEmpty, valueUndefined, valueNull: - panic(self.panicTypeError()) - case valueBoolean: - return self.newBoolean(value) - case valueString: - return self.newString(value) - case valueNumber: - return self.newNumber(value) - case valueObject: - return value._object() - } - panic(self.panicTypeError()) -} - -func (self *_runtime) objectCoerce(value Value) (*_object, error) { - switch value.kind { - case valueUndefined: - return nil, errors.New("undefined") - case valueNull: - return nil, errors.New("null") - case valueBoolean: - return self.newBoolean(value), nil - case valueString: - return self.newString(value), nil - case valueNumber: - return self.newNumber(value), nil - case valueObject: - return value._object(), nil - } - panic(self.panicTypeError()) -} - -func checkObjectCoercible(rt *_runtime, value Value) { - isObject, mustCoerce := testObjectCoercible(value) - if !isObject && !mustCoerce { - panic(rt.panicTypeError()) - } -} - -// testObjectCoercible - -func testObjectCoercible(value Value) (isObject bool, mustCoerce bool) { - switch value.kind { - case valueReference, valueEmpty, valueNull, valueUndefined: - return false, false - case valueNumber, valueString, valueBoolean: - return false, true - case valueObject: - return true, false - default: - panic("this should never happen") - } -} - -func (self *_runtime) safeToValue(value interface{}) (Value, error) { - result := Value{} - err := catchPanic(func() { - result = self.toValue(value) - }) - return result, err -} - -// convertNumeric converts numeric parameter val from js to that of type t if it is safe to do so, otherwise it panics. -// This allows literals (int64), bitwise values (int32) and the general form (float64) of javascript numerics to be passed as parameters to go functions easily. -func (self *_runtime) convertNumeric(v Value, t reflect.Type) reflect.Value { - val := reflect.ValueOf(v.export()) - - if val.Kind() == t.Kind() { - return val - } - - if val.Kind() == reflect.Interface { - val = reflect.ValueOf(val.Interface()) - } - - switch val.Kind() { - case reflect.Float32, reflect.Float64: - f64 := val.Float() - switch t.Kind() { - case reflect.Float64: - return reflect.ValueOf(f64) - case reflect.Float32: - if reflect.Zero(t).OverflowFloat(f64) { - panic(self.panicRangeError("converting float64 to float32 would overflow")) - } - - return val.Convert(t) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - i64 := int64(f64) - if float64(i64) != f64 { - panic(self.panicRangeError(fmt.Sprintf("converting %v to %v would cause loss of precision", val.Type(), t))) - } - - // The float represents an integer - val = reflect.ValueOf(i64) - default: - panic(self.panicTypeError(fmt.Sprintf("cannot convert %v to %v", val.Type(), t))) - } - } - - switch val.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - i64 := val.Int() - switch t.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - if reflect.Zero(t).OverflowInt(i64) { - panic(self.panicRangeError(fmt.Sprintf("converting %v to %v would overflow", val.Type(), t))) - } - return val.Convert(t) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - if i64 < 0 { - panic(self.panicRangeError(fmt.Sprintf("converting %v to %v would underflow", val.Type(), t))) - } - if reflect.Zero(t).OverflowUint(uint64(i64)) { - panic(self.panicRangeError(fmt.Sprintf("converting %v to %v would overflow", val.Type(), t))) - } - return val.Convert(t) - } - - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - u64 := val.Uint() - switch t.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - if u64 > math.MaxInt64 || reflect.Zero(t).OverflowInt(int64(u64)) { - panic(self.panicRangeError(fmt.Sprintf("converting %v to %v would overflow", val.Type(), t))) - } - return val.Convert(t) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - if reflect.Zero(t).OverflowUint(u64) { - panic(self.panicRangeError(fmt.Sprintf("converting %v to %v would overflow", val.Type(), t))) - } - return val.Convert(t) - } - } - - panic(self.panicTypeError(fmt.Sprintf("unsupported type %v for numeric conversion", val.Type()))) -} - -var typeOfValue = reflect.TypeOf(Value{}) - -// convertCallParameter converts request val to type t if possible. -// If the conversion fails due to overflow or type miss-match then it panics. -// If no conversion is known then the original value is returned. -func (self *_runtime) convertCallParameter(v Value, t reflect.Type) reflect.Value { - if t == typeOfValue { - return reflect.ValueOf(v) - } - - if v.kind == valueObject { - if gso, ok := v._object().value.(*_goStructObject); ok { - if gso.value.Type().AssignableTo(t) { - return gso.value - } - } - } - - if t.Kind() == reflect.Interface { - iv := reflect.ValueOf(v.export()) - if iv.Type().AssignableTo(t) { - return iv - } - } - - tk := t.Kind() - - if tk == reflect.Ptr { - switch v.kind { - case valueEmpty, valueNull, valueUndefined: - return reflect.Zero(t) - default: - var vv reflect.Value - if err := catchPanic(func() { vv = self.convertCallParameter(v, t.Elem()) }); err == nil { - if vv.CanAddr() { - return vv.Addr() - } - - pv := reflect.New(vv.Type()) - pv.Elem().Set(vv) - return pv - } - } - } - - switch tk { - case reflect.Bool: - return reflect.ValueOf(v.bool()) - case reflect.String: - switch v.kind { - case valueString: - return reflect.ValueOf(v.value) - case valueNumber: - return reflect.ValueOf(fmt.Sprintf("%v", v.value)) - } - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: - switch v.kind { - case valueNumber: - return self.convertNumeric(v, t) - } - case reflect.Slice: - if o := v._object(); o != nil { - if lv := o.get("length"); lv.IsNumber() { - l := lv.number().int64 - - s := reflect.MakeSlice(t, int(l), int(l)) - - tt := t.Elem() - - if o.class == "Array" { - for i := int64(0); i < l; i++ { - p, ok := o.property[strconv.FormatInt(i, 10)] - if !ok { - continue - } - - e, ok := p.value.(Value) - if !ok { - continue - } - - ev := self.convertCallParameter(e, tt) - - s.Index(int(i)).Set(ev) - } - } else if o.class == "GoArray" { - - var gslice bool - switch o.value.(type) { - case *_goSliceObject: - gslice = true - case *_goArrayObject: - gslice = false - } - - for i := int64(0); i < l; i++ { - var p *_property - if gslice { - p = goSliceGetOwnProperty(o, strconv.FormatInt(i, 10)) - } else { - p = goArrayGetOwnProperty(o, strconv.FormatInt(i, 10)) - } - if p == nil { - continue - } - - e, ok := p.value.(Value) - if !ok { - continue - } - - ev := self.convertCallParameter(e, tt) - - s.Index(int(i)).Set(ev) - } - } - - return s - } - } - case reflect.Map: - if o := v._object(); o != nil && t.Key().Kind() == reflect.String { - m := reflect.MakeMap(t) - - o.enumerate(false, func(k string) bool { - m.SetMapIndex(reflect.ValueOf(k), self.convertCallParameter(o.get(k), t.Elem())) - return true - }) - - return m - } - case reflect.Func: - if t.NumOut() > 1 { - panic(self.panicTypeError("converting JavaScript values to Go functions with more than one return value is currently not supported")) - } - - if o := v._object(); o != nil && o.class == "Function" { - return reflect.MakeFunc(t, func(args []reflect.Value) []reflect.Value { - l := make([]interface{}, len(args)) - for i, a := range args { - if a.CanInterface() { - l[i] = a.Interface() - } - } - - rv, err := v.Call(nullValue, l...) - if err != nil { - panic(err) - } - - if t.NumOut() == 0 { - return nil - } - - return []reflect.Value{self.convertCallParameter(rv, t.Out(0))} - }) - } - } - - if tk == reflect.String { - if o := v._object(); o != nil && o.hasProperty("toString") { - if fn := o.get("toString"); fn.IsFunction() { - sv, err := fn.Call(v) - if err != nil { - panic(err) - } - - var r reflect.Value - if err := catchPanic(func() { r = self.convertCallParameter(sv, t) }); err == nil { - return r - } - } - } - - return reflect.ValueOf(v.String()) - } - - s := "OTTO DOES NOT UNDERSTAND THIS TYPE" - switch v.kind { - case valueBoolean: - s = "boolean" - case valueNull: - s = "null" - case valueNumber: - s = "number" - case valueString: - s = "string" - case valueUndefined: - s = "undefined" - case valueObject: - s = v.Class() - } - - panic(self.panicTypeError("can't convert from %q to %q", s, t.String())) -} - -func (self *_runtime) toValue(value interface{}) Value { - switch value := value.(type) { - case Value: - return value - case func(FunctionCall) Value: - var name, file string - var line int - pc := reflect.ValueOf(value).Pointer() - fn := runtime.FuncForPC(pc) - if fn != nil { - name = fn.Name() - file, line = fn.FileLine(pc) - file = path.Base(file) - } - return toValue_object(self.newNativeFunction(name, file, line, value)) - case _nativeFunction: - var name, file string - var line int - pc := reflect.ValueOf(value).Pointer() - fn := runtime.FuncForPC(pc) - if fn != nil { - name = fn.Name() - file, line = fn.FileLine(pc) - file = path.Base(file) - } - return toValue_object(self.newNativeFunction(name, file, line, value)) - case Object, *Object, _object, *_object: - // Nothing happens. - // FIXME We should really figure out what can come here. - // This catch-all is ugly. - default: - { - value := reflect.ValueOf(value) - - switch value.Kind() { - case reflect.Ptr: - switch reflect.Indirect(value).Kind() { - case reflect.Struct: - return toValue_object(self.newGoStructObject(value)) - case reflect.Array: - return toValue_object(self.newGoArray(value)) - } - case reflect.Struct: - return toValue_object(self.newGoStructObject(value)) - case reflect.Map: - return toValue_object(self.newGoMapObject(value)) - case reflect.Slice: - return toValue_object(self.newGoSlice(value)) - case reflect.Array: - return toValue_object(self.newGoArray(value)) - case reflect.Func: - var name, file string - var line int - if v := reflect.ValueOf(value); v.Kind() == reflect.Ptr { - pc := v.Pointer() - fn := runtime.FuncForPC(pc) - if fn != nil { - name = fn.Name() - file, line = fn.FileLine(pc) - file = path.Base(file) - } - } - - typ := value.Type() - - return toValue_object(self.newNativeFunction(name, file, line, func(c FunctionCall) Value { - nargs := typ.NumIn() - - if len(c.ArgumentList) != nargs { - if typ.IsVariadic() { - if len(c.ArgumentList) < nargs-1 { - panic(self.panicRangeError(fmt.Sprintf("expected at least %d arguments; got %d", nargs-1, len(c.ArgumentList)))) - } - } else { - panic(self.panicRangeError(fmt.Sprintf("expected %d argument(s); got %d", nargs, len(c.ArgumentList)))) - } - } - - in := make([]reflect.Value, len(c.ArgumentList)) - - callSlice := false - - for i, a := range c.ArgumentList { - var t reflect.Type - - n := i - if n >= nargs-1 && typ.IsVariadic() { - if n > nargs-1 { - n = nargs - 1 - } - - t = typ.In(n).Elem() - } else { - t = typ.In(n) - } - - // if this is a variadic Go function, and the caller has supplied - // exactly the number of JavaScript arguments required, and this - // is the last JavaScript argument, try treating the it as the - // actual set of variadic Go arguments. if that succeeds, break - // out of the loop. - if typ.IsVariadic() && len(c.ArgumentList) == nargs && i == nargs-1 { - var v reflect.Value - if err := catchPanic(func() { v = self.convertCallParameter(a, typ.In(n)) }); err == nil { - in[i] = v - callSlice = true - break - } - } - - in[i] = self.convertCallParameter(a, t) - } - - var out []reflect.Value - if callSlice { - out = value.CallSlice(in) - } else { - out = value.Call(in) - } - - switch len(out) { - case 0: - return Value{} - case 1: - return self.toValue(out[0].Interface()) - default: - s := make([]interface{}, len(out)) - for i, v := range out { - s[i] = self.toValue(v.Interface()) - } - - return self.toValue(s) - } - })) - } - } - } - - return toValue(value) -} - -func (runtime *_runtime) newGoSlice(value reflect.Value) *_object { - self := runtime.newGoSliceObject(value) - self.prototype = runtime.global.ArrayPrototype - return self -} - -func (runtime *_runtime) newGoArray(value reflect.Value) *_object { - self := runtime.newGoArrayObject(value) - self.prototype = runtime.global.ArrayPrototype - return self -} - -func (runtime *_runtime) parse(filename string, src, sm interface{}) (*ast.Program, error) { - return parser.ParseFileWithSourceMap(nil, filename, src, sm, 0) -} - -func (runtime *_runtime) cmpl_parse(filename string, src, sm interface{}) (*_nodeProgram, error) { - program, err := parser.ParseFileWithSourceMap(nil, filename, src, sm, 0) - if err != nil { - return nil, err - } - - return cmpl_parse(program), nil -} - -func (self *_runtime) parseSource(src, sm interface{}) (*_nodeProgram, *ast.Program, error) { - switch src := src.(type) { - case *ast.Program: - return nil, src, nil - case *Script: - return src.program, nil, nil - } - - program, err := self.parse("", src, sm) - - return nil, program, err -} - -func (self *_runtime) cmpl_runOrEval(src, sm interface{}, eval bool) (Value, error) { - result := Value{} - cmpl_program, program, err := self.parseSource(src, sm) - if err != nil { - return result, err - } - if cmpl_program == nil { - cmpl_program = cmpl_parse(program) - } - err = catchPanic(func() { - result = self.cmpl_evaluate_nodeProgram(cmpl_program, eval) - }) - switch result.kind { - case valueEmpty: - result = Value{} - case valueReference: - result = result.resolve() - } - return result, err -} - -func (self *_runtime) cmpl_run(src, sm interface{}) (Value, error) { - return self.cmpl_runOrEval(src, sm, false) -} - -func (self *_runtime) cmpl_eval(src, sm interface{}) (Value, error) { - return self.cmpl_runOrEval(src, sm, true) -} - -func (self *_runtime) parseThrow(err error) { - if err == nil { - return - } - switch err := err.(type) { - case parser.ErrorList: - { - err := err[0] - if err.Message == "Invalid left-hand side in assignment" { - panic(self.panicReferenceError(err.Message)) - } - panic(self.panicSyntaxError(err.Message)) - } - } - panic(self.panicSyntaxError(err.Error())) -} - -func (self *_runtime) cmpl_parseOrThrow(src, sm interface{}) *_nodeProgram { - program, err := self.cmpl_parse("", src, sm) - self.parseThrow(err) // Will panic/throw appropriately - return program -} diff --git a/vendor/github.com/robertkrimen/otto/scope.go b/vendor/github.com/robertkrimen/otto/scope.go deleted file mode 100644 index 465e6b98c717..000000000000 --- a/vendor/github.com/robertkrimen/otto/scope.go +++ /dev/null @@ -1,35 +0,0 @@ -package otto - -// _scope: -// entryFile -// entryIdx -// top? -// outer => nil - -// _stash: -// lexical -// variable -// -// _thisStash (ObjectEnvironment) -// _fnStash -// _dclStash - -// An ECMA-262 ExecutionContext -type _scope struct { - lexical _stash - variable _stash - this *_object - eval bool // Replace this with kind? - outer *_scope - depth int - - frame _frame -} - -func newScope(lexical _stash, variable _stash, this *_object) *_scope { - return &_scope{ - lexical: lexical, - variable: variable, - this: this, - } -} diff --git a/vendor/github.com/robertkrimen/otto/script.go b/vendor/github.com/robertkrimen/otto/script.go deleted file mode 100644 index 2ae890ecd177..000000000000 --- a/vendor/github.com/robertkrimen/otto/script.go +++ /dev/null @@ -1,119 +0,0 @@ -package otto - -import ( - "bytes" - "encoding/gob" - "errors" -) - -var ErrVersion = errors.New("version mismatch") - -var scriptVersion = "2014-04-13/1" - -// Script is a handle for some (reusable) JavaScript. -// Passing a Script value to a run method will evaluate the JavaScript. -// -type Script struct { - version string - program *_nodeProgram - filename string - src string -} - -// Compile will parse the given source and return a Script value or nil and -// an error if there was a problem during compilation. -// -// script, err := vm.Compile("", `var abc; if (!abc) abc = 0; abc += 2; abc;`) -// vm.Run(script) -// -func (self *Otto) Compile(filename string, src interface{}) (*Script, error) { - return self.CompileWithSourceMap(filename, src, nil) -} - -// CompileWithSourceMap does the same thing as Compile, but with the obvious -// difference of applying a source map. -func (self *Otto) CompileWithSourceMap(filename string, src, sm interface{}) (*Script, error) { - program, err := self.runtime.parse(filename, src, sm) - if err != nil { - return nil, err - } - - cmpl_program := cmpl_parse(program) - - script := &Script{ - version: scriptVersion, - program: cmpl_program, - filename: filename, - src: program.File.Source(), - } - - return script, nil -} - -func (self *Script) String() string { - return "// " + self.filename + "\n" + self.src -} - -// MarshalBinary will marshal a script into a binary form. A marshalled script -// that is later unmarshalled can be executed on the same version of the otto runtime. -// -// The binary format can change at any time and should be considered unspecified and opaque. -// -func (self *Script) marshalBinary() ([]byte, error) { - var bfr bytes.Buffer - encoder := gob.NewEncoder(&bfr) - err := encoder.Encode(self.version) - if err != nil { - return nil, err - } - err = encoder.Encode(self.program) - if err != nil { - return nil, err - } - err = encoder.Encode(self.filename) - if err != nil { - return nil, err - } - err = encoder.Encode(self.src) - if err != nil { - return nil, err - } - return bfr.Bytes(), nil -} - -// UnmarshalBinary will vivify a marshalled script into something usable. If the script was -// originally marshalled on a different version of the otto runtime, then this method -// will return an error. -// -// The binary format can change at any time and should be considered unspecified and opaque. -// -func (self *Script) unmarshalBinary(data []byte) error { - decoder := gob.NewDecoder(bytes.NewReader(data)) - err := decoder.Decode(&self.version) - if err != nil { - goto error - } - if self.version != scriptVersion { - err = ErrVersion - goto error - } - err = decoder.Decode(&self.program) - if err != nil { - goto error - } - err = decoder.Decode(&self.filename) - if err != nil { - goto error - } - err = decoder.Decode(&self.src) - if err != nil { - goto error - } - return nil -error: - self.version = "" - self.program = nil - self.filename = "" - self.src = "" - return err -} diff --git a/vendor/github.com/robertkrimen/otto/stash.go b/vendor/github.com/robertkrimen/otto/stash.go deleted file mode 100644 index 0d3ffa5117c3..000000000000 --- a/vendor/github.com/robertkrimen/otto/stash.go +++ /dev/null @@ -1,296 +0,0 @@ -package otto - -import ( - "fmt" -) - -// ====== -// _stash -// ====== - -type _stash interface { - hasBinding(string) bool // - createBinding(string, bool, Value) // CreateMutableBinding - setBinding(string, Value, bool) // SetMutableBinding - getBinding(string, bool) Value // GetBindingValue - deleteBinding(string) bool // - setValue(string, Value, bool) // createBinding + setBinding - - outer() _stash - runtime() *_runtime - - newReference(string, bool, _at) _reference - - clone(clone *_clone) _stash -} - -// ========== -// _objectStash -// ========== - -type _objectStash struct { - _runtime *_runtime - _outer _stash - object *_object -} - -func (self *_objectStash) runtime() *_runtime { - return self._runtime -} - -func (runtime *_runtime) newObjectStash(object *_object, outer _stash) *_objectStash { - if object == nil { - object = runtime.newBaseObject() - object.class = "environment" - } - return &_objectStash{ - _runtime: runtime, - _outer: outer, - object: object, - } -} - -func (in *_objectStash) clone(clone *_clone) _stash { - out, exists := clone.objectStash(in) - if exists { - return out - } - *out = _objectStash{ - clone.runtime, - clone.stash(in._outer), - clone.object(in.object), - } - return out -} - -func (self *_objectStash) hasBinding(name string) bool { - return self.object.hasProperty(name) -} - -func (self *_objectStash) createBinding(name string, deletable bool, value Value) { - if self.object.hasProperty(name) { - panic(hereBeDragons()) - } - mode := _propertyMode(0111) - if !deletable { - mode = _propertyMode(0110) - } - // TODO False? - self.object.defineProperty(name, value, mode, false) -} - -func (self *_objectStash) setBinding(name string, value Value, strict bool) { - self.object.put(name, value, strict) -} - -func (self *_objectStash) setValue(name string, value Value, throw bool) { - if !self.hasBinding(name) { - self.createBinding(name, true, value) // Configurable by default - } else { - self.setBinding(name, value, throw) - } -} - -func (self *_objectStash) getBinding(name string, throw bool) Value { - if self.object.hasProperty(name) { - return self.object.get(name) - } - if throw { // strict? - panic(self._runtime.panicReferenceError("Not Defined", name)) - } - return Value{} -} - -func (self *_objectStash) deleteBinding(name string) bool { - return self.object.delete(name, false) -} - -func (self *_objectStash) outer() _stash { - return self._outer -} - -func (self *_objectStash) newReference(name string, strict bool, at _at) _reference { - return newPropertyReference(self._runtime, self.object, name, strict, at) -} - -// ========= -// _dclStash -// ========= - -type _dclStash struct { - _runtime *_runtime - _outer _stash - property map[string]_dclProperty -} - -type _dclProperty struct { - value Value - mutable bool - deletable bool - readable bool -} - -func (runtime *_runtime) newDeclarationStash(outer _stash) *_dclStash { - return &_dclStash{ - _runtime: runtime, - _outer: outer, - property: map[string]_dclProperty{}, - } -} - -func (in *_dclStash) clone(clone *_clone) _stash { - out, exists := clone.dclStash(in) - if exists { - return out - } - property := make(map[string]_dclProperty, len(in.property)) - for index, value := range in.property { - property[index] = clone.dclProperty(value) - } - *out = _dclStash{ - clone.runtime, - clone.stash(in._outer), - property, - } - return out -} - -func (self *_dclStash) hasBinding(name string) bool { - _, exists := self.property[name] - return exists -} - -func (self *_dclStash) runtime() *_runtime { - return self._runtime -} - -func (self *_dclStash) createBinding(name string, deletable bool, value Value) { - _, exists := self.property[name] - if exists { - panic(fmt.Errorf("createBinding: %s: already exists", name)) - } - self.property[name] = _dclProperty{ - value: value, - mutable: true, - deletable: deletable, - readable: false, - } -} - -func (self *_dclStash) setBinding(name string, value Value, strict bool) { - property, exists := self.property[name] - if !exists { - panic(fmt.Errorf("setBinding: %s: missing", name)) - } - if property.mutable { - property.value = value - self.property[name] = property - } else { - self._runtime.typeErrorResult(strict) - } -} - -func (self *_dclStash) setValue(name string, value Value, throw bool) { - if !self.hasBinding(name) { - self.createBinding(name, false, value) // NOT deletable by default - } else { - self.setBinding(name, value, throw) - } -} - -// FIXME This is called a __lot__ -func (self *_dclStash) getBinding(name string, throw bool) Value { - property, exists := self.property[name] - if !exists { - panic(fmt.Errorf("getBinding: %s: missing", name)) - } - if !property.mutable && !property.readable { - if throw { // strict? - panic(self._runtime.panicTypeError()) - } - return Value{} - } - return property.value -} - -func (self *_dclStash) deleteBinding(name string) bool { - property, exists := self.property[name] - if !exists { - return true - } - if !property.deletable { - return false - } - delete(self.property, name) - return true -} - -func (self *_dclStash) outer() _stash { - return self._outer -} - -func (self *_dclStash) newReference(name string, strict bool, _ _at) _reference { - return &_stashReference{ - name: name, - base: self, - } -} - -// ======== -// _fnStash -// ======== - -type _fnStash struct { - _dclStash - arguments *_object - indexOfArgumentName map[string]string -} - -func (runtime *_runtime) newFunctionStash(outer _stash) *_fnStash { - return &_fnStash{ - _dclStash: _dclStash{ - _runtime: runtime, - _outer: outer, - property: map[string]_dclProperty{}, - }, - } -} - -func (in *_fnStash) clone(clone *_clone) _stash { - out, exists := clone.fnStash(in) - if exists { - return out - } - dclStash := in._dclStash.clone(clone).(*_dclStash) - index := make(map[string]string, len(in.indexOfArgumentName)) - for name, value := range in.indexOfArgumentName { - index[name] = value - } - *out = _fnStash{ - _dclStash: *dclStash, - arguments: clone.object(in.arguments), - indexOfArgumentName: index, - } - return out -} - -func getStashProperties(stash _stash) (keys []string) { - switch vars := stash.(type) { - case *_dclStash: - for k := range vars.property { - keys = append(keys, k) - } - case *_fnStash: - for k := range vars.property { - keys = append(keys, k) - } - case *_objectStash: - for k := range vars.object.property { - keys = append(keys, k) - } - default: - panic("unknown stash type") - } - - return -} diff --git a/vendor/github.com/robertkrimen/otto/token/Makefile b/vendor/github.com/robertkrimen/otto/token/Makefile deleted file mode 100644 index 1e85c73488d7..000000000000 --- a/vendor/github.com/robertkrimen/otto/token/Makefile +++ /dev/null @@ -1,2 +0,0 @@ -token_const.go: tokenfmt - ./$^ | gofmt > $@ diff --git a/vendor/github.com/robertkrimen/otto/token/README.markdown b/vendor/github.com/robertkrimen/otto/token/README.markdown deleted file mode 100644 index ff3b16104030..000000000000 --- a/vendor/github.com/robertkrimen/otto/token/README.markdown +++ /dev/null @@ -1,171 +0,0 @@ -# token --- - import "github.com/robertkrimen/otto/token" - -Package token defines constants representing the lexical tokens of JavaScript -(ECMA5). - -## Usage - -```go -const ( - ILLEGAL - EOF - COMMENT - KEYWORD - - STRING - BOOLEAN - NULL - NUMBER - IDENTIFIER - - PLUS // + - MINUS // - - MULTIPLY // * - SLASH // / - REMAINDER // % - - AND // & - OR // | - EXCLUSIVE_OR // ^ - SHIFT_LEFT // << - SHIFT_RIGHT // >> - UNSIGNED_SHIFT_RIGHT // >>> - AND_NOT // &^ - - ADD_ASSIGN // += - SUBTRACT_ASSIGN // -= - MULTIPLY_ASSIGN // *= - QUOTIENT_ASSIGN // /= - REMAINDER_ASSIGN // %= - - AND_ASSIGN // &= - OR_ASSIGN // |= - EXCLUSIVE_OR_ASSIGN // ^= - SHIFT_LEFT_ASSIGN // <<= - SHIFT_RIGHT_ASSIGN // >>= - UNSIGNED_SHIFT_RIGHT_ASSIGN // >>>= - AND_NOT_ASSIGN // &^= - - LOGICAL_AND // && - LOGICAL_OR // || - INCREMENT // ++ - DECREMENT // -- - - EQUAL // == - STRICT_EQUAL // === - LESS // < - GREATER // > - ASSIGN // = - NOT // ! - - BITWISE_NOT // ~ - - NOT_EQUAL // != - STRICT_NOT_EQUAL // !== - LESS_OR_EQUAL // <= - GREATER_OR_EQUAL // >= - - LEFT_PARENTHESIS // ( - LEFT_BRACKET // [ - LEFT_BRACE // { - COMMA // , - PERIOD // . - - RIGHT_PARENTHESIS // ) - RIGHT_BRACKET // ] - RIGHT_BRACE // } - SEMICOLON // ; - COLON // : - QUESTION_MARK // ? - - IF - IN - DO - - VAR - FOR - NEW - TRY - - THIS - ELSE - CASE - VOID - WITH - - WHILE - BREAK - CATCH - THROW - - RETURN - TYPEOF - DELETE - SWITCH - - DEFAULT - FINALLY - - FUNCTION - CONTINUE - DEBUGGER - - INSTANCEOF -) -``` - -#### type Token - -```go -type Token int -``` - -Token is the set of lexical tokens in JavaScript (ECMA5). - -#### func IsKeyword - -```go -func IsKeyword(literal string) (Token, bool) -``` -IsKeyword returns the keyword token if literal is a keyword, a KEYWORD token if -the literal is a future keyword (const, let, class, super, ...), or 0 if the -literal is not a keyword. - -If the literal is a keyword, IsKeyword returns a second value indicating if the -literal is considered a future keyword in strict-mode only. - -7.6.1.2 Future Reserved Words: - - const - class - enum - export - extends - import - super - -7.6.1.2 Future Reserved Words (strict): - - implements - interface - let - package - private - protected - public - static - -#### func (Token) String - -```go -func (tkn Token) String() string -``` -String returns the string corresponding to the token. For operators, delimiters, -and keywords the string is the actual token string (e.g., for the token PLUS, -the String() is "+"). For all other tokens the string corresponds to the token -name (e.g. for the token IDENTIFIER, the string is "IDENTIFIER"). - --- -**godocdown** http://github.com/robertkrimen/godocdown diff --git a/vendor/github.com/robertkrimen/otto/token/token.go b/vendor/github.com/robertkrimen/otto/token/token.go deleted file mode 100644 index 0e941ac96dee..000000000000 --- a/vendor/github.com/robertkrimen/otto/token/token.go +++ /dev/null @@ -1,116 +0,0 @@ -// Package token defines constants representing the lexical tokens of JavaScript (ECMA5). -package token - -import ( - "strconv" -) - -// Token is the set of lexical tokens in JavaScript (ECMA5). -type Token int - -// String returns the string corresponding to the token. -// For operators, delimiters, and keywords the string is the actual -// token string (e.g., for the token PLUS, the String() is -// "+"). For all other tokens the string corresponds to the token -// name (e.g. for the token IDENTIFIER, the string is "IDENTIFIER"). -// -func (tkn Token) String() string { - if 0 == tkn { - return "UNKNOWN" - } - if tkn < Token(len(token2string)) { - return token2string[tkn] - } - return "token(" + strconv.Itoa(int(tkn)) + ")" -} - -// This is not used for anything -func (tkn Token) precedence(in bool) int { - - switch tkn { - case LOGICAL_OR: - return 1 - - case LOGICAL_AND: - return 2 - - case OR, OR_ASSIGN: - return 3 - - case EXCLUSIVE_OR: - return 4 - - case AND, AND_ASSIGN, AND_NOT, AND_NOT_ASSIGN: - return 5 - - case EQUAL, - NOT_EQUAL, - STRICT_EQUAL, - STRICT_NOT_EQUAL: - return 6 - - case LESS, GREATER, LESS_OR_EQUAL, GREATER_OR_EQUAL, INSTANCEOF: - return 7 - - case IN: - if in { - return 7 - } - return 0 - - case SHIFT_LEFT, SHIFT_RIGHT, UNSIGNED_SHIFT_RIGHT: - fallthrough - case SHIFT_LEFT_ASSIGN, SHIFT_RIGHT_ASSIGN, UNSIGNED_SHIFT_RIGHT_ASSIGN: - return 8 - - case PLUS, MINUS, ADD_ASSIGN, SUBTRACT_ASSIGN: - return 9 - - case MULTIPLY, SLASH, REMAINDER, MULTIPLY_ASSIGN, QUOTIENT_ASSIGN, REMAINDER_ASSIGN: - return 11 - } - return 0 -} - -type _keyword struct { - token Token - futureKeyword bool - strict bool -} - -// IsKeyword returns the keyword token if literal is a keyword, a KEYWORD token -// if the literal is a future keyword (const, let, class, super, ...), or 0 if the literal is not a keyword. -// -// If the literal is a keyword, IsKeyword returns a second value indicating if the literal -// is considered a future keyword in strict-mode only. -// -// 7.6.1.2 Future Reserved Words: -// -// const -// class -// enum -// export -// extends -// import -// super -// -// 7.6.1.2 Future Reserved Words (strict): -// -// implements -// interface -// let -// package -// private -// protected -// public -// static -// -func IsKeyword(literal string) (Token, bool) { - if keyword, exists := keywordTable[literal]; exists { - if keyword.futureKeyword { - return KEYWORD, keyword.strict - } - return keyword.token, false - } - return 0, false -} diff --git a/vendor/github.com/robertkrimen/otto/token/token_const.go b/vendor/github.com/robertkrimen/otto/token/token_const.go deleted file mode 100644 index b1d83c6de9b3..000000000000 --- a/vendor/github.com/robertkrimen/otto/token/token_const.go +++ /dev/null @@ -1,349 +0,0 @@ -package token - -const ( - _ Token = iota - - ILLEGAL - EOF - COMMENT - KEYWORD - - STRING - BOOLEAN - NULL - NUMBER - IDENTIFIER - - PLUS // + - MINUS // - - MULTIPLY // * - SLASH // / - REMAINDER // % - - AND // & - OR // | - EXCLUSIVE_OR // ^ - SHIFT_LEFT // << - SHIFT_RIGHT // >> - UNSIGNED_SHIFT_RIGHT // >>> - AND_NOT // &^ - - ADD_ASSIGN // += - SUBTRACT_ASSIGN // -= - MULTIPLY_ASSIGN // *= - QUOTIENT_ASSIGN // /= - REMAINDER_ASSIGN // %= - - AND_ASSIGN // &= - OR_ASSIGN // |= - EXCLUSIVE_OR_ASSIGN // ^= - SHIFT_LEFT_ASSIGN // <<= - SHIFT_RIGHT_ASSIGN // >>= - UNSIGNED_SHIFT_RIGHT_ASSIGN // >>>= - AND_NOT_ASSIGN // &^= - - LOGICAL_AND // && - LOGICAL_OR // || - INCREMENT // ++ - DECREMENT // -- - - EQUAL // == - STRICT_EQUAL // === - LESS // < - GREATER // > - ASSIGN // = - NOT // ! - - BITWISE_NOT // ~ - - NOT_EQUAL // != - STRICT_NOT_EQUAL // !== - LESS_OR_EQUAL // <= - GREATER_OR_EQUAL // >= - - LEFT_PARENTHESIS // ( - LEFT_BRACKET // [ - LEFT_BRACE // { - COMMA // , - PERIOD // . - - RIGHT_PARENTHESIS // ) - RIGHT_BRACKET // ] - RIGHT_BRACE // } - SEMICOLON // ; - COLON // : - QUESTION_MARK // ? - - firstKeyword - IF - IN - DO - - VAR - FOR - NEW - TRY - - THIS - ELSE - CASE - VOID - WITH - - WHILE - BREAK - CATCH - THROW - - RETURN - TYPEOF - DELETE - SWITCH - - DEFAULT - FINALLY - - FUNCTION - CONTINUE - DEBUGGER - - INSTANCEOF - lastKeyword -) - -var token2string = [...]string{ - ILLEGAL: "ILLEGAL", - EOF: "EOF", - COMMENT: "COMMENT", - KEYWORD: "KEYWORD", - STRING: "STRING", - BOOLEAN: "BOOLEAN", - NULL: "NULL", - NUMBER: "NUMBER", - IDENTIFIER: "IDENTIFIER", - PLUS: "+", - MINUS: "-", - MULTIPLY: "*", - SLASH: "/", - REMAINDER: "%", - AND: "&", - OR: "|", - EXCLUSIVE_OR: "^", - SHIFT_LEFT: "<<", - SHIFT_RIGHT: ">>", - UNSIGNED_SHIFT_RIGHT: ">>>", - AND_NOT: "&^", - ADD_ASSIGN: "+=", - SUBTRACT_ASSIGN: "-=", - MULTIPLY_ASSIGN: "*=", - QUOTIENT_ASSIGN: "/=", - REMAINDER_ASSIGN: "%=", - AND_ASSIGN: "&=", - OR_ASSIGN: "|=", - EXCLUSIVE_OR_ASSIGN: "^=", - SHIFT_LEFT_ASSIGN: "<<=", - SHIFT_RIGHT_ASSIGN: ">>=", - UNSIGNED_SHIFT_RIGHT_ASSIGN: ">>>=", - AND_NOT_ASSIGN: "&^=", - LOGICAL_AND: "&&", - LOGICAL_OR: "||", - INCREMENT: "++", - DECREMENT: "--", - EQUAL: "==", - STRICT_EQUAL: "===", - LESS: "<", - GREATER: ">", - ASSIGN: "=", - NOT: "!", - BITWISE_NOT: "~", - NOT_EQUAL: "!=", - STRICT_NOT_EQUAL: "!==", - LESS_OR_EQUAL: "<=", - GREATER_OR_EQUAL: ">=", - LEFT_PARENTHESIS: "(", - LEFT_BRACKET: "[", - LEFT_BRACE: "{", - COMMA: ",", - PERIOD: ".", - RIGHT_PARENTHESIS: ")", - RIGHT_BRACKET: "]", - RIGHT_BRACE: "}", - SEMICOLON: ";", - COLON: ":", - QUESTION_MARK: "?", - IF: "if", - IN: "in", - DO: "do", - VAR: "var", - FOR: "for", - NEW: "new", - TRY: "try", - THIS: "this", - ELSE: "else", - CASE: "case", - VOID: "void", - WITH: "with", - WHILE: "while", - BREAK: "break", - CATCH: "catch", - THROW: "throw", - RETURN: "return", - TYPEOF: "typeof", - DELETE: "delete", - SWITCH: "switch", - DEFAULT: "default", - FINALLY: "finally", - FUNCTION: "function", - CONTINUE: "continue", - DEBUGGER: "debugger", - INSTANCEOF: "instanceof", -} - -var keywordTable = map[string]_keyword{ - "if": _keyword{ - token: IF, - }, - "in": _keyword{ - token: IN, - }, - "do": _keyword{ - token: DO, - }, - "var": _keyword{ - token: VAR, - }, - "for": _keyword{ - token: FOR, - }, - "new": _keyword{ - token: NEW, - }, - "try": _keyword{ - token: TRY, - }, - "this": _keyword{ - token: THIS, - }, - "else": _keyword{ - token: ELSE, - }, - "case": _keyword{ - token: CASE, - }, - "void": _keyword{ - token: VOID, - }, - "with": _keyword{ - token: WITH, - }, - "while": _keyword{ - token: WHILE, - }, - "break": _keyword{ - token: BREAK, - }, - "catch": _keyword{ - token: CATCH, - }, - "throw": _keyword{ - token: THROW, - }, - "return": _keyword{ - token: RETURN, - }, - "typeof": _keyword{ - token: TYPEOF, - }, - "delete": _keyword{ - token: DELETE, - }, - "switch": _keyword{ - token: SWITCH, - }, - "default": _keyword{ - token: DEFAULT, - }, - "finally": _keyword{ - token: FINALLY, - }, - "function": _keyword{ - token: FUNCTION, - }, - "continue": _keyword{ - token: CONTINUE, - }, - "debugger": _keyword{ - token: DEBUGGER, - }, - "instanceof": _keyword{ - token: INSTANCEOF, - }, - "const": _keyword{ - token: KEYWORD, - futureKeyword: true, - }, - "class": _keyword{ - token: KEYWORD, - futureKeyword: true, - }, - "enum": _keyword{ - token: KEYWORD, - futureKeyword: true, - }, - "export": _keyword{ - token: KEYWORD, - futureKeyword: true, - }, - "extends": _keyword{ - token: KEYWORD, - futureKeyword: true, - }, - "import": _keyword{ - token: KEYWORD, - futureKeyword: true, - }, - "super": _keyword{ - token: KEYWORD, - futureKeyword: true, - }, - "implements": _keyword{ - token: KEYWORD, - futureKeyword: true, - strict: true, - }, - "interface": _keyword{ - token: KEYWORD, - futureKeyword: true, - strict: true, - }, - "let": _keyword{ - token: KEYWORD, - futureKeyword: true, - strict: true, - }, - "package": _keyword{ - token: KEYWORD, - futureKeyword: true, - strict: true, - }, - "private": _keyword{ - token: KEYWORD, - futureKeyword: true, - strict: true, - }, - "protected": _keyword{ - token: KEYWORD, - futureKeyword: true, - strict: true, - }, - "public": _keyword{ - token: KEYWORD, - futureKeyword: true, - strict: true, - }, - "static": _keyword{ - token: KEYWORD, - futureKeyword: true, - strict: true, - }, -} diff --git a/vendor/github.com/robertkrimen/otto/token/tokenfmt b/vendor/github.com/robertkrimen/otto/token/tokenfmt deleted file mode 100755 index 63dd5d9e6d1e..000000000000 --- a/vendor/github.com/robertkrimen/otto/token/tokenfmt +++ /dev/null @@ -1,222 +0,0 @@ -#!/usr/bin/env perl - -use strict; -use warnings; - -my (%token, @order, @keywords); - -{ - my $keywords; - my @const; - push @const, <<_END_; -package token - -const( - _ Token = iota -_END_ - - for (split m/\n/, <<_END_) { -ILLEGAL -EOF -COMMENT -KEYWORD - -STRING -BOOLEAN -NULL -NUMBER -IDENTIFIER - -PLUS + -MINUS - -MULTIPLY * -SLASH / -REMAINDER % - -AND & -OR | -EXCLUSIVE_OR ^ -SHIFT_LEFT << -SHIFT_RIGHT >> -UNSIGNED_SHIFT_RIGHT >>> -AND_NOT &^ - -ADD_ASSIGN += -SUBTRACT_ASSIGN -= -MULTIPLY_ASSIGN *= -QUOTIENT_ASSIGN /= -REMAINDER_ASSIGN %= - -AND_ASSIGN &= -OR_ASSIGN |= -EXCLUSIVE_OR_ASSIGN ^= -SHIFT_LEFT_ASSIGN <<= -SHIFT_RIGHT_ASSIGN >>= -UNSIGNED_SHIFT_RIGHT_ASSIGN >>>= -AND_NOT_ASSIGN &^= - -LOGICAL_AND && -LOGICAL_OR || -INCREMENT ++ -DECREMENT -- - -EQUAL == -STRICT_EQUAL === -LESS < -GREATER > -ASSIGN = -NOT ! - -BITWISE_NOT ~ - -NOT_EQUAL != -STRICT_NOT_EQUAL !== -LESS_OR_EQUAL <= -GREATER_OR_EQUAL <= - -LEFT_PARENTHESIS ( -LEFT_BRACKET [ -LEFT_BRACE { -COMMA , -PERIOD . - -RIGHT_PARENTHESIS ) -RIGHT_BRACKET ] -RIGHT_BRACE } -SEMICOLON ; -COLON : -QUESTION_MARK ? - -firstKeyword -IF -IN -DO - -VAR -FOR -NEW -TRY - -THIS -ELSE -CASE -VOID -WITH - -WHILE -BREAK -CATCH -THROW - -RETURN -TYPEOF -DELETE -SWITCH - -DEFAULT -FINALLY - -FUNCTION -CONTINUE -DEBUGGER - -INSTANCEOF -lastKeyword -_END_ - chomp; - - next if m/^\s*#/; - - my ($name, $symbol) = m/(\w+)\s*(\S+)?/; - - if (defined $symbol) { - push @order, $name; - push @const, "$name // $symbol"; - $token{$name} = $symbol; - } elsif (defined $name) { - $keywords ||= $name eq 'firstKeyword'; - - push @const, $name; - #$const[-1] .= " Token = iota" if 2 == @const; - if ($name =~ m/^([A-Z]+)/) { - push @keywords, $name if $keywords; - push @order, $name; - if ($token{SEMICOLON}) { - $token{$name} = lc $1; - } else { - $token{$name} = $name; - } - } - } else { - push @const, ""; - } - - } - push @const, ")"; - print join "\n", @const, ""; -} - -{ - print <<_END_; - -var token2string = [...]string{ -_END_ - for my $name (@order) { - print "$name: \"$token{$name}\",\n"; - } - print <<_END_; -} -_END_ - - print <<_END_; - -var keywordTable = map[string]_keyword{ -_END_ - for my $name (@keywords) { - print <<_END_ - "@{[ lc $name ]}": _keyword{ - token: $name, - }, -_END_ - } - - for my $name (qw/ - const - class - enum - export - extends - import - super - /) { - print <<_END_ - "$name": _keyword{ - token: KEYWORD, - futureKeyword: true, - }, -_END_ - } - - for my $name (qw/ - implements - interface - let - package - private - protected - public - static - /) { - print <<_END_ - "$name": _keyword{ - token: KEYWORD, - futureKeyword: true, - strict: true, - }, -_END_ - } - - print <<_END_; -} -_END_ -} diff --git a/vendor/github.com/robertkrimen/otto/type_arguments.go b/vendor/github.com/robertkrimen/otto/type_arguments.go deleted file mode 100644 index 841d758553b3..000000000000 --- a/vendor/github.com/robertkrimen/otto/type_arguments.go +++ /dev/null @@ -1,106 +0,0 @@ -package otto - -import ( - "strconv" -) - -func (runtime *_runtime) newArgumentsObject(indexOfParameterName []string, stash _stash, length int) *_object { - self := runtime.newClassObject("Arguments") - - for index, _ := range indexOfParameterName { - name := strconv.FormatInt(int64(index), 10) - objectDefineOwnProperty(self, name, _property{Value{}, 0111}, false) - } - - self.objectClass = _classArguments - self.value = _argumentsObject{ - indexOfParameterName: indexOfParameterName, - stash: stash, - } - - self.prototype = runtime.global.ObjectPrototype - - self.defineProperty("length", toValue_int(length), 0101, false) - - return self -} - -type _argumentsObject struct { - indexOfParameterName []string - // function(abc, def, ghi) - // indexOfParameterName[0] = "abc" - // indexOfParameterName[1] = "def" - // indexOfParameterName[2] = "ghi" - // ... - stash _stash -} - -func (in _argumentsObject) clone(clone *_clone) _argumentsObject { - indexOfParameterName := make([]string, len(in.indexOfParameterName)) - copy(indexOfParameterName, in.indexOfParameterName) - return _argumentsObject{ - indexOfParameterName, - clone.stash(in.stash), - } -} - -func (self _argumentsObject) get(name string) (Value, bool) { - index := stringToArrayIndex(name) - if index >= 0 && index < int64(len(self.indexOfParameterName)) { - name := self.indexOfParameterName[index] - if name == "" { - return Value{}, false - } - return self.stash.getBinding(name, false), true - } - return Value{}, false -} - -func (self _argumentsObject) put(name string, value Value) { - index := stringToArrayIndex(name) - name = self.indexOfParameterName[index] - self.stash.setBinding(name, value, false) -} - -func (self _argumentsObject) delete(name string) { - index := stringToArrayIndex(name) - self.indexOfParameterName[index] = "" -} - -func argumentsGet(self *_object, name string) Value { - if value, exists := self.value.(_argumentsObject).get(name); exists { - return value - } - return objectGet(self, name) -} - -func argumentsGetOwnProperty(self *_object, name string) *_property { - property := objectGetOwnProperty(self, name) - if value, exists := self.value.(_argumentsObject).get(name); exists { - property.value = value - } - return property -} - -func argumentsDefineOwnProperty(self *_object, name string, descriptor _property, throw bool) bool { - if _, exists := self.value.(_argumentsObject).get(name); exists { - if !objectDefineOwnProperty(self, name, descriptor, false) { - return self.runtime.typeErrorResult(throw) - } - if value, valid := descriptor.value.(Value); valid { - self.value.(_argumentsObject).put(name, value) - } - return true - } - return objectDefineOwnProperty(self, name, descriptor, throw) -} - -func argumentsDelete(self *_object, name string, throw bool) bool { - if !objectDelete(self, name, throw) { - return false - } - if _, exists := self.value.(_argumentsObject).get(name); exists { - self.value.(_argumentsObject).delete(name) - } - return true -} diff --git a/vendor/github.com/robertkrimen/otto/type_array.go b/vendor/github.com/robertkrimen/otto/type_array.go deleted file mode 100644 index c8a974b02f19..000000000000 --- a/vendor/github.com/robertkrimen/otto/type_array.go +++ /dev/null @@ -1,109 +0,0 @@ -package otto - -import ( - "strconv" -) - -func (runtime *_runtime) newArrayObject(length uint32) *_object { - self := runtime.newObject() - self.class = "Array" - self.defineProperty("length", toValue_uint32(length), 0100, false) - self.objectClass = _classArray - return self -} - -func isArray(object *_object) bool { - return object != nil && (object.class == "Array" || object.class == "GoArray") -} - -func objectLength(object *_object) uint32 { - if object == nil { - return 0 - } - switch object.class { - case "Array": - return object.get("length").value.(uint32) - case "String": - return uint32(object.get("length").value.(int)) - case "GoArray": - return uint32(object.get("length").value.(int)) - } - return 0 -} - -func arrayUint32(rt *_runtime, value Value) uint32 { - nm := value.number() - if nm.kind != numberInteger || !isUint32(nm.int64) { - // FIXME - panic(rt.panicRangeError()) - } - return uint32(nm.int64) -} - -func arrayDefineOwnProperty(self *_object, name string, descriptor _property, throw bool) bool { - lengthProperty := self.getOwnProperty("length") - lengthValue, valid := lengthProperty.value.(Value) - if !valid { - panic("Array.length != Value{}") - } - length := lengthValue.value.(uint32) - if name == "length" { - if descriptor.value == nil { - return objectDefineOwnProperty(self, name, descriptor, throw) - } - newLengthValue, isValue := descriptor.value.(Value) - if !isValue { - panic(self.runtime.panicTypeError()) - } - newLength := arrayUint32(self.runtime, newLengthValue) - descriptor.value = toValue_uint32(newLength) - if newLength > length { - return objectDefineOwnProperty(self, name, descriptor, throw) - } - if !lengthProperty.writable() { - goto Reject - } - newWritable := true - if descriptor.mode&0700 == 0 { - // If writable is off - newWritable = false - descriptor.mode |= 0100 - } - if !objectDefineOwnProperty(self, name, descriptor, throw) { - return false - } - for newLength < length { - length-- - if !self.delete(strconv.FormatInt(int64(length), 10), false) { - descriptor.value = toValue_uint32(length + 1) - if !newWritable { - descriptor.mode &= 0077 - } - objectDefineOwnProperty(self, name, descriptor, false) - goto Reject - } - } - if !newWritable { - descriptor.mode &= 0077 - objectDefineOwnProperty(self, name, descriptor, false) - } - } else if index := stringToArrayIndex(name); index >= 0 { - if index >= int64(length) && !lengthProperty.writable() { - goto Reject - } - if !objectDefineOwnProperty(self, strconv.FormatInt(index, 10), descriptor, false) { - goto Reject - } - if index >= int64(length) { - lengthProperty.value = toValue_uint32(uint32(index + 1)) - objectDefineOwnProperty(self, "length", *lengthProperty, false) - return true - } - } - return objectDefineOwnProperty(self, name, descriptor, throw) -Reject: - if throw { - panic(self.runtime.panicTypeError()) - } - return false -} diff --git a/vendor/github.com/robertkrimen/otto/type_boolean.go b/vendor/github.com/robertkrimen/otto/type_boolean.go deleted file mode 100644 index afc45c69b3cb..000000000000 --- a/vendor/github.com/robertkrimen/otto/type_boolean.go +++ /dev/null @@ -1,13 +0,0 @@ -package otto - -import ( - "strconv" -) - -func (runtime *_runtime) newBooleanObject(value Value) *_object { - return runtime.newPrimitiveObject("Boolean", toValue_bool(value.bool())) -} - -func booleanToString(value bool) string { - return strconv.FormatBool(value) -} diff --git a/vendor/github.com/robertkrimen/otto/type_date.go b/vendor/github.com/robertkrimen/otto/type_date.go deleted file mode 100644 index 7079e649c758..000000000000 --- a/vendor/github.com/robertkrimen/otto/type_date.go +++ /dev/null @@ -1,299 +0,0 @@ -package otto - -import ( - "fmt" - "math" - "regexp" - Time "time" -) - -type _dateObject struct { - time Time.Time // Time from the "time" package, a cached version of time - epoch int64 - value Value - isNaN bool -} - -var ( - invalidDateObject = _dateObject{ - time: Time.Time{}, - epoch: -1, - value: NaNValue(), - isNaN: true, - } -) - -type _ecmaTime struct { - year int - month int - day int - hour int - minute int - second int - millisecond int - location *Time.Location // Basically, either local or UTC -} - -func ecmaTime(goTime Time.Time) _ecmaTime { - return _ecmaTime{ - goTime.Year(), - dateFromGoMonth(goTime.Month()), - goTime.Day(), - goTime.Hour(), - goTime.Minute(), - goTime.Second(), - goTime.Nanosecond() / (100 * 100 * 100), - goTime.Location(), - } -} - -func (self *_ecmaTime) goTime() Time.Time { - return Time.Date( - self.year, - dateToGoMonth(self.month), - self.day, - self.hour, - self.minute, - self.second, - self.millisecond*(100*100*100), - self.location, - ) -} - -func (self *_dateObject) Time() Time.Time { - return self.time -} - -func (self *_dateObject) Epoch() int64 { - return self.epoch -} - -func (self *_dateObject) Value() Value { - return self.value -} - -// FIXME A date should only be in the range of -100,000,000 to +100,000,000 (1970): 15.9.1.1 -func (self *_dateObject) SetNaN() { - self.time = Time.Time{} - self.epoch = -1 - self.value = NaNValue() - self.isNaN = true -} - -func (self *_dateObject) SetTime(time Time.Time) { - self.Set(timeToEpoch(time)) -} - -func epoch2dateObject(epoch float64) _dateObject { - date := _dateObject{} - date.Set(epoch) - return date -} - -func (self *_dateObject) Set(epoch float64) { - // epoch - self.epoch = epochToInteger(epoch) - - // time - time, err := epochToTime(epoch) - self.time = time // Is either a valid time, or the zero-value for time.Time - - // value & isNaN - if err != nil { - self.isNaN = true - self.epoch = -1 - self.value = NaNValue() - } else { - self.value = toValue_int64(self.epoch) - } -} - -func epochToInteger(value float64) int64 { - if value > 0 { - return int64(math.Floor(value)) - } - return int64(math.Ceil(value)) -} - -func epochToTime(value float64) (time Time.Time, err error) { - epochWithMilli := value - if math.IsNaN(epochWithMilli) || math.IsInf(epochWithMilli, 0) { - err = fmt.Errorf("Invalid time %v", value) - return - } - - epoch := int64(epochWithMilli / 1000) - milli := int64(epochWithMilli) % 1000 - - time = Time.Unix(int64(epoch), milli*1000000).UTC() - return -} - -func timeToEpoch(time Time.Time) float64 { - return float64(time.UnixNano() / (1000 * 1000)) -} - -func (runtime *_runtime) newDateObject(epoch float64) *_object { - self := runtime.newObject() - self.class = "Date" - - // FIXME This is ugly... - date := _dateObject{} - date.Set(epoch) - self.value = date - return self -} - -func (self *_object) dateValue() _dateObject { - value, _ := self.value.(_dateObject) - return value -} - -func dateObjectOf(rt *_runtime, _dateObject *_object) _dateObject { - if _dateObject == nil || _dateObject.class != "Date" { - panic(rt.panicTypeError()) - } - return _dateObject.dateValue() -} - -// JavaScript is 0-based, Go is 1-based (15.9.1.4) -func dateToGoMonth(month int) Time.Month { - return Time.Month(month + 1) -} - -func dateFromGoMonth(month Time.Month) int { - return int(month) - 1 -} - -// Both JavaScript & Go are 0-based (Sunday == 0) -func dateToGoDay(day int) Time.Weekday { - return Time.Weekday(day) -} - -func dateFromGoDay(day Time.Weekday) int { - return int(day) -} - -func newDateTime(argumentList []Value, location *Time.Location) (epoch float64) { - - pick := func(index int, default_ float64) (float64, bool) { - if index >= len(argumentList) { - return default_, false - } - value := argumentList[index].float64() - if math.IsNaN(value) || math.IsInf(value, 0) { - return 0, true - } - return value, false - } - - if len(argumentList) >= 2 { // 2-argument, 3-argument, ... - var year, month, day, hour, minute, second, millisecond float64 - var invalid bool - if year, invalid = pick(0, 1900.0); invalid { - goto INVALID - } - if month, invalid = pick(1, 0.0); invalid { - goto INVALID - } - if day, invalid = pick(2, 1.0); invalid { - goto INVALID - } - if hour, invalid = pick(3, 0.0); invalid { - goto INVALID - } - if minute, invalid = pick(4, 0.0); invalid { - goto INVALID - } - if second, invalid = pick(5, 0.0); invalid { - goto INVALID - } - if millisecond, invalid = pick(6, 0.0); invalid { - goto INVALID - } - - if year >= 0 && year <= 99 { - year += 1900 - } - - time := Time.Date(int(year), dateToGoMonth(int(month)), int(day), int(hour), int(minute), int(second), int(millisecond)*1000*1000, location) - return timeToEpoch(time) - - } else if len(argumentList) == 0 { // 0-argument - time := Time.Now().UTC() - return timeToEpoch(time) - } else { // 1-argument - value := valueOfArrayIndex(argumentList, 0) - value = toPrimitive(value) - if value.IsString() { - return dateParse(value.string()) - } - - return value.float64() - } - -INVALID: - epoch = math.NaN() - return -} - -var ( - dateLayoutList = []string{ - "2006", - "2006-01", - "2006-01-02", - - "2006T15:04", - "2006-01T15:04", - "2006-01-02T15:04", - - "2006T15:04:05", - "2006-01T15:04:05", - "2006-01-02T15:04:05", - - "2006T15:04:05.000", - "2006-01T15:04:05.000", - "2006-01-02T15:04:05.000", - - "2006T15:04-0700", - "2006-01T15:04-0700", - "2006-01-02T15:04-0700", - - "2006T15:04:05-0700", - "2006-01T15:04:05-0700", - "2006-01-02T15:04:05-0700", - - "2006T15:04:05.000-0700", - "2006-01T15:04:05.000-0700", - "2006-01-02T15:04:05.000-0700", - - Time.RFC1123, - } - matchDateTimeZone = regexp.MustCompile(`^(.*)(?:(Z)|([\+\-]\d{2}):(\d{2}))$`) -) - -func dateParse(date string) (epoch float64) { - // YYYY-MM-DDTHH:mm:ss.sssZ - var time Time.Time - var err error - { - date := date - if match := matchDateTimeZone.FindStringSubmatch(date); match != nil { - if match[2] == "Z" { - date = match[1] + "+0000" - } else { - date = match[1] + match[3] + match[4] - } - } - for _, layout := range dateLayoutList { - time, err = Time.Parse(layout, date) - if err == nil { - break - } - } - } - if err != nil { - return math.NaN() - } - return float64(time.UnixNano()) / (1000 * 1000) // UnixMilli() -} diff --git a/vendor/github.com/robertkrimen/otto/type_error.go b/vendor/github.com/robertkrimen/otto/type_error.go deleted file mode 100644 index 84e5d79b19c7..000000000000 --- a/vendor/github.com/robertkrimen/otto/type_error.go +++ /dev/null @@ -1,24 +0,0 @@ -package otto - -func (rt *_runtime) newErrorObject(name string, message Value, stackFramesToPop int) *_object { - self := rt.newClassObject("Error") - if message.IsDefined() { - msg := message.string() - self.defineProperty("message", toValue_string(msg), 0111, false) - self.value = newError(rt, name, stackFramesToPop, msg) - } else { - self.value = newError(rt, name, stackFramesToPop) - } - - self.defineOwnProperty("stack", _property{ - value: _propertyGetSet{ - rt.newNativeFunction("get", "internal", 0, func(FunctionCall) Value { - return toValue_string(self.value.(_error).formatWithStack()) - }), - &_nilGetSetObject, - }, - mode: modeConfigureMask & modeOnMask, - }, false) - - return self -} diff --git a/vendor/github.com/robertkrimen/otto/type_function.go b/vendor/github.com/robertkrimen/otto/type_function.go deleted file mode 100644 index 5637dc60512b..000000000000 --- a/vendor/github.com/robertkrimen/otto/type_function.go +++ /dev/null @@ -1,292 +0,0 @@ -package otto - -// _constructFunction -type _constructFunction func(*_object, []Value) Value - -// 13.2.2 [[Construct]] -func defaultConstruct(fn *_object, argumentList []Value) Value { - object := fn.runtime.newObject() - object.class = "Object" - - prototype := fn.get("prototype") - if prototype.kind != valueObject { - prototype = toValue_object(fn.runtime.global.ObjectPrototype) - } - object.prototype = prototype._object() - - this := toValue_object(object) - value := fn.call(this, argumentList, false, nativeFrame) - if value.kind == valueObject { - return value - } - return this -} - -// _nativeFunction -type _nativeFunction func(FunctionCall) Value - -// ===================== // -// _nativeFunctionObject // -// ===================== // - -type _nativeFunctionObject struct { - name string - file string - line int - call _nativeFunction // [[Call]] - construct _constructFunction // [[Construct]] -} - -func (runtime *_runtime) newNativeFunctionObject(name, file string, line int, native _nativeFunction, length int) *_object { - self := runtime.newClassObject("Function") - self.value = _nativeFunctionObject{ - name: name, - file: file, - line: line, - call: native, - construct: defaultConstruct, - } - self.defineProperty("length", toValue_int(length), 0000, false) - return self -} - -// =================== // -// _bindFunctionObject // -// =================== // - -type _bindFunctionObject struct { - target *_object - this Value - argumentList []Value -} - -func (runtime *_runtime) newBoundFunctionObject(target *_object, this Value, argumentList []Value) *_object { - self := runtime.newClassObject("Function") - self.value = _bindFunctionObject{ - target: target, - this: this, - argumentList: argumentList, - } - length := int(toInt32(target.get("length"))) - length -= len(argumentList) - if length < 0 { - length = 0 - } - self.defineProperty("length", toValue_int(length), 0000, false) - self.defineProperty("caller", Value{}, 0000, false) // TODO Should throw a TypeError - self.defineProperty("arguments", Value{}, 0000, false) // TODO Should throw a TypeError - return self -} - -// [[Construct]] -func (fn _bindFunctionObject) construct(argumentList []Value) Value { - object := fn.target - switch value := object.value.(type) { - case _nativeFunctionObject: - return value.construct(object, fn.argumentList) - case _nodeFunctionObject: - argumentList = append(fn.argumentList, argumentList...) - return object.construct(argumentList) - } - panic(fn.target.runtime.panicTypeError()) -} - -// =================== // -// _nodeFunctionObject // -// =================== // - -type _nodeFunctionObject struct { - node *_nodeFunctionLiteral - stash _stash -} - -func (runtime *_runtime) newNodeFunctionObject(node *_nodeFunctionLiteral, stash _stash) *_object { - self := runtime.newClassObject("Function") - self.value = _nodeFunctionObject{ - node: node, - stash: stash, - } - self.defineProperty("length", toValue_int(len(node.parameterList)), 0000, false) - return self -} - -// ======= // -// _object // -// ======= // - -func (self *_object) isCall() bool { - switch fn := self.value.(type) { - case _nativeFunctionObject: - return fn.call != nil - case _bindFunctionObject: - return true - case _nodeFunctionObject: - return true - } - return false -} - -func (self *_object) call(this Value, argumentList []Value, eval bool, frame _frame) Value { - switch fn := self.value.(type) { - - case _nativeFunctionObject: - // Since eval is a native function, we only have to check for it here - if eval { - eval = self == self.runtime.eval // If eval is true, then it IS a direct eval - } - - // Enter a scope, name from the native object... - rt := self.runtime - if rt.scope != nil && !eval { - rt.enterFunctionScope(rt.scope.lexical, this) - rt.scope.frame = _frame{ - native: true, - nativeFile: fn.file, - nativeLine: fn.line, - callee: fn.name, - file: nil, - } - defer func() { - rt.leaveScope() - }() - } - - return fn.call(FunctionCall{ - runtime: self.runtime, - eval: eval, - - This: this, - ArgumentList: argumentList, - Otto: self.runtime.otto, - }) - - case _bindFunctionObject: - // TODO Passthrough site, do not enter a scope - argumentList = append(fn.argumentList, argumentList...) - return fn.target.call(fn.this, argumentList, false, frame) - - case _nodeFunctionObject: - rt := self.runtime - stash := rt.enterFunctionScope(fn.stash, this) - rt.scope.frame = _frame{ - callee: fn.node.name, - file: fn.node.file, - } - defer func() { - rt.leaveScope() - }() - callValue := rt.cmpl_call_nodeFunction(self, stash, fn.node, this, argumentList) - if value, valid := callValue.value.(_result); valid { - return value.value - } - return callValue - } - - panic(self.runtime.panicTypeError("%v is not a function", toValue_object(self))) -} - -func (self *_object) construct(argumentList []Value) Value { - switch fn := self.value.(type) { - - case _nativeFunctionObject: - if fn.call == nil { - panic(self.runtime.panicTypeError("%v is not a function", toValue_object(self))) - } - if fn.construct == nil { - panic(self.runtime.panicTypeError("%v is not a constructor", toValue_object(self))) - } - return fn.construct(self, argumentList) - - case _bindFunctionObject: - return fn.construct(argumentList) - - case _nodeFunctionObject: - return defaultConstruct(self, argumentList) - } - - panic(self.runtime.panicTypeError("%v is not a function", toValue_object(self))) -} - -// 15.3.5.3 -func (self *_object) hasInstance(of Value) bool { - if !self.isCall() { - // We should not have a hasInstance method - panic(self.runtime.panicTypeError()) - } - if !of.IsObject() { - return false - } - prototype := self.get("prototype") - if !prototype.IsObject() { - panic(self.runtime.panicTypeError()) - } - prototypeObject := prototype._object() - - value := of._object().prototype - for value != nil { - if value == prototypeObject { - return true - } - value = value.prototype - } - return false -} - -// ============ // -// FunctionCall // -// ============ // - -// FunctionCall is an encapsulation of a JavaScript function call. -type FunctionCall struct { - runtime *_runtime - _thisObject *_object - eval bool // This call is a direct call to eval - - This Value - ArgumentList []Value - Otto *Otto -} - -// Argument will return the value of the argument at the given index. -// -// If no such argument exists, undefined is returned. -func (self FunctionCall) Argument(index int) Value { - return valueOfArrayIndex(self.ArgumentList, index) -} - -func (self FunctionCall) getArgument(index int) (Value, bool) { - return getValueOfArrayIndex(self.ArgumentList, index) -} - -func (self FunctionCall) slice(index int) []Value { - if index < len(self.ArgumentList) { - return self.ArgumentList[index:] - } - return []Value{} -} - -func (self *FunctionCall) thisObject() *_object { - if self._thisObject == nil { - this := self.This.resolve() // FIXME Is this right? - self._thisObject = self.runtime.toObject(this) - } - return self._thisObject -} - -func (self *FunctionCall) thisClassObject(class string) *_object { - thisObject := self.thisObject() - if thisObject.class != class { - panic(self.runtime.panicTypeError()) - } - return self._thisObject -} - -func (self FunctionCall) toObject(value Value) *_object { - return self.runtime.toObject(value) -} - -// CallerLocation will return file location information (file:line:pos) where this function is being called. -func (self FunctionCall) CallerLocation() string { - // see error.go for location() - return self.runtime.scope.outer.frame.location() -} diff --git a/vendor/github.com/robertkrimen/otto/type_go_array.go b/vendor/github.com/robertkrimen/otto/type_go_array.go deleted file mode 100644 index 13a0b10f2b57..000000000000 --- a/vendor/github.com/robertkrimen/otto/type_go_array.go +++ /dev/null @@ -1,134 +0,0 @@ -package otto - -import ( - "reflect" - "strconv" -) - -func (runtime *_runtime) newGoArrayObject(value reflect.Value) *_object { - self := runtime.newObject() - self.class = "GoArray" - self.objectClass = _classGoArray - self.value = _newGoArrayObject(value) - return self -} - -type _goArrayObject struct { - value reflect.Value - writable bool - propertyMode _propertyMode -} - -func _newGoArrayObject(value reflect.Value) *_goArrayObject { - writable := value.Kind() == reflect.Ptr // The Array is addressable (like a Slice) - mode := _propertyMode(0010) - if writable { - mode = 0110 - } - self := &_goArrayObject{ - value: value, - writable: writable, - propertyMode: mode, - } - return self -} - -func (self _goArrayObject) getValue(index int64) (reflect.Value, bool) { - value := reflect.Indirect(self.value) - if index < int64(value.Len()) { - return value.Index(int(index)), true - } - return reflect.Value{}, false -} - -func (self _goArrayObject) setValue(index int64, value Value) bool { - indexValue, exists := self.getValue(index) - if !exists { - return false - } - reflectValue, err := value.toReflectValue(reflect.Indirect(self.value).Type().Elem().Kind()) - if err != nil { - panic(err) - } - indexValue.Set(reflectValue) - return true -} - -func goArrayGetOwnProperty(self *_object, name string) *_property { - // length - if name == "length" { - return &_property{ - value: toValue(reflect.Indirect(self.value.(*_goArrayObject).value).Len()), - mode: 0, - } - } - - // .0, .1, .2, ... - index := stringToArrayIndex(name) - if index >= 0 { - object := self.value.(*_goArrayObject) - value := Value{} - reflectValue, exists := object.getValue(index) - if exists { - value = self.runtime.toValue(reflectValue.Interface()) - } - return &_property{ - value: value, - mode: object.propertyMode, - } - } - - return objectGetOwnProperty(self, name) -} - -func goArrayEnumerate(self *_object, all bool, each func(string) bool) { - object := self.value.(*_goArrayObject) - // .0, .1, .2, ... - - for index, length := 0, object.value.Len(); index < length; index++ { - name := strconv.FormatInt(int64(index), 10) - if !each(name) { - return - } - } - - objectEnumerate(self, all, each) -} - -func goArrayDefineOwnProperty(self *_object, name string, descriptor _property, throw bool) bool { - if name == "length" { - return self.runtime.typeErrorResult(throw) - } else if index := stringToArrayIndex(name); index >= 0 { - object := self.value.(*_goArrayObject) - if object.writable { - if self.value.(*_goArrayObject).setValue(index, descriptor.value.(Value)) { - return true - } - } - return self.runtime.typeErrorResult(throw) - } - return objectDefineOwnProperty(self, name, descriptor, throw) -} - -func goArrayDelete(self *_object, name string, throw bool) bool { - // length - if name == "length" { - return self.runtime.typeErrorResult(throw) - } - - // .0, .1, .2, ... - index := stringToArrayIndex(name) - if index >= 0 { - object := self.value.(*_goArrayObject) - if object.writable { - indexValue, exists := object.getValue(index) - if exists { - indexValue.Set(reflect.Zero(reflect.Indirect(object.value).Type().Elem())) - return true - } - } - return self.runtime.typeErrorResult(throw) - } - - return self.delete(name, throw) -} diff --git a/vendor/github.com/robertkrimen/otto/type_go_map.go b/vendor/github.com/robertkrimen/otto/type_go_map.go deleted file mode 100644 index 3e204a028c7f..000000000000 --- a/vendor/github.com/robertkrimen/otto/type_go_map.go +++ /dev/null @@ -1,87 +0,0 @@ -package otto - -import ( - "reflect" -) - -func (runtime *_runtime) newGoMapObject(value reflect.Value) *_object { - self := runtime.newObject() - self.class = "Object" // TODO Should this be something else? - self.objectClass = _classGoMap - self.value = _newGoMapObject(value) - return self -} - -type _goMapObject struct { - value reflect.Value - keyKind reflect.Kind - valueKind reflect.Kind -} - -func _newGoMapObject(value reflect.Value) *_goMapObject { - if value.Kind() != reflect.Map { - dbgf("%/panic//%@: %v != reflect.Map", value.Kind()) - } - self := &_goMapObject{ - value: value, - keyKind: value.Type().Key().Kind(), - valueKind: value.Type().Elem().Kind(), - } - return self -} - -func (self _goMapObject) toKey(name string) reflect.Value { - reflectValue, err := stringToReflectValue(name, self.keyKind) - if err != nil { - panic(err) - } - return reflectValue -} - -func (self _goMapObject) toValue(value Value) reflect.Value { - reflectValue, err := value.toReflectValue(self.valueKind) - if err != nil { - panic(err) - } - return reflectValue -} - -func goMapGetOwnProperty(self *_object, name string) *_property { - object := self.value.(*_goMapObject) - value := object.value.MapIndex(object.toKey(name)) - if value.IsValid() { - return &_property{self.runtime.toValue(value.Interface()), 0111} - } - - return nil -} - -func goMapEnumerate(self *_object, all bool, each func(string) bool) { - object := self.value.(*_goMapObject) - keys := object.value.MapKeys() - for _, key := range keys { - if !each(toValue(key).String()) { - return - } - } -} - -func goMapDefineOwnProperty(self *_object, name string, descriptor _property, throw bool) bool { - object := self.value.(*_goMapObject) - // TODO ...or 0222 - if descriptor.mode != 0111 { - return self.runtime.typeErrorResult(throw) - } - if !descriptor.isDataDescriptor() { - return self.runtime.typeErrorResult(throw) - } - object.value.SetMapIndex(object.toKey(name), object.toValue(descriptor.value.(Value))) - return true -} - -func goMapDelete(self *_object, name string, throw bool) bool { - object := self.value.(*_goMapObject) - object.value.SetMapIndex(object.toKey(name), reflect.Value{}) - // FIXME - return true -} diff --git a/vendor/github.com/robertkrimen/otto/type_go_slice.go b/vendor/github.com/robertkrimen/otto/type_go_slice.go deleted file mode 100644 index 78c69e68496f..000000000000 --- a/vendor/github.com/robertkrimen/otto/type_go_slice.go +++ /dev/null @@ -1,126 +0,0 @@ -package otto - -import ( - "reflect" - "strconv" -) - -func (runtime *_runtime) newGoSliceObject(value reflect.Value) *_object { - self := runtime.newObject() - self.class = "GoArray" // TODO GoSlice? - self.objectClass = _classGoSlice - self.value = _newGoSliceObject(value) - return self -} - -type _goSliceObject struct { - value reflect.Value -} - -func _newGoSliceObject(value reflect.Value) *_goSliceObject { - self := &_goSliceObject{ - value: value, - } - return self -} - -func (self _goSliceObject) getValue(index int64) (reflect.Value, bool) { - if index < int64(self.value.Len()) { - return self.value.Index(int(index)), true - } - return reflect.Value{}, false -} - -func (self _goSliceObject) setValue(index int64, value Value) bool { - indexValue, exists := self.getValue(index) - if !exists { - return false - } - reflectValue, err := value.toReflectValue(self.value.Type().Elem().Kind()) - if err != nil { - panic(err) - } - indexValue.Set(reflectValue) - return true -} - -func goSliceGetOwnProperty(self *_object, name string) *_property { - // length - if name == "length" { - return &_property{ - value: toValue(self.value.(*_goSliceObject).value.Len()), - mode: 0, - } - } - - // .0, .1, .2, ... - index := stringToArrayIndex(name) - if index >= 0 { - value := Value{} - reflectValue, exists := self.value.(*_goSliceObject).getValue(index) - if exists { - value = self.runtime.toValue(reflectValue.Interface()) - } - return &_property{ - value: value, - mode: 0110, - } - } - - // Other methods - if method := self.value.(*_goSliceObject).value.MethodByName(name); (method != reflect.Value{}) { - return &_property{ - value: self.runtime.toValue(method.Interface()), - mode: 0110, - } - } - - return objectGetOwnProperty(self, name) -} - -func goSliceEnumerate(self *_object, all bool, each func(string) bool) { - object := self.value.(*_goSliceObject) - // .0, .1, .2, ... - - for index, length := 0, object.value.Len(); index < length; index++ { - name := strconv.FormatInt(int64(index), 10) - if !each(name) { - return - } - } - - objectEnumerate(self, all, each) -} - -func goSliceDefineOwnProperty(self *_object, name string, descriptor _property, throw bool) bool { - if name == "length" { - return self.runtime.typeErrorResult(throw) - } else if index := stringToArrayIndex(name); index >= 0 { - if self.value.(*_goSliceObject).setValue(index, descriptor.value.(Value)) { - return true - } - return self.runtime.typeErrorResult(throw) - } - return objectDefineOwnProperty(self, name, descriptor, throw) -} - -func goSliceDelete(self *_object, name string, throw bool) bool { - // length - if name == "length" { - return self.runtime.typeErrorResult(throw) - } - - // .0, .1, .2, ... - index := stringToArrayIndex(name) - if index >= 0 { - object := self.value.(*_goSliceObject) - indexValue, exists := object.getValue(index) - if exists { - indexValue.Set(reflect.Zero(object.value.Type().Elem())) - return true - } - return self.runtime.typeErrorResult(throw) - } - - return self.delete(name, throw) -} diff --git a/vendor/github.com/robertkrimen/otto/type_go_struct.go b/vendor/github.com/robertkrimen/otto/type_go_struct.go deleted file mode 100644 index 608ac66609c4..000000000000 --- a/vendor/github.com/robertkrimen/otto/type_go_struct.go +++ /dev/null @@ -1,146 +0,0 @@ -package otto - -import ( - "encoding/json" - "reflect" -) - -// FIXME Make a note about not being able to modify a struct unless it was -// passed as a pointer-to: &struct{ ... } -// This seems to be a limitation of the reflect package. -// This goes for the other Go constructs too. -// I guess we could get around it by either: -// 1. Creating a new struct every time -// 2. Creating an addressable? struct in the constructor - -func (runtime *_runtime) newGoStructObject(value reflect.Value) *_object { - self := runtime.newObject() - self.class = "Object" // TODO Should this be something else? - self.objectClass = _classGoStruct - self.value = _newGoStructObject(value) - return self -} - -type _goStructObject struct { - value reflect.Value -} - -func _newGoStructObject(value reflect.Value) *_goStructObject { - if reflect.Indirect(value).Kind() != reflect.Struct { - dbgf("%/panic//%@: %v != reflect.Struct", value.Kind()) - } - self := &_goStructObject{ - value: value, - } - return self -} - -func (self _goStructObject) getValue(name string) reflect.Value { - if validGoStructName(name) { - // Do not reveal hidden or unexported fields - if field := reflect.Indirect(self.value).FieldByName(name); (field != reflect.Value{}) { - return field - } - - if method := self.value.MethodByName(name); (method != reflect.Value{}) { - return method - } - } - - return reflect.Value{} -} - -func (self _goStructObject) field(name string) (reflect.StructField, bool) { - return reflect.Indirect(self.value).Type().FieldByName(name) -} - -func (self _goStructObject) method(name string) (reflect.Method, bool) { - return reflect.Indirect(self.value).Type().MethodByName(name) -} - -func (self _goStructObject) setValue(name string, value Value) bool { - field, exists := self.field(name) - if !exists { - return false - } - fieldValue := self.getValue(name) - reflectValue, err := value.toReflectValue(field.Type.Kind()) - if err != nil { - panic(err) - } - fieldValue.Set(reflectValue) - - return true -} - -func goStructGetOwnProperty(self *_object, name string) *_property { - object := self.value.(*_goStructObject) - value := object.getValue(name) - if value.IsValid() { - return &_property{self.runtime.toValue(value.Interface()), 0110} - } - - return objectGetOwnProperty(self, name) -} - -func validGoStructName(name string) bool { - if name == "" { - return false - } - return 'A' <= name[0] && name[0] <= 'Z' // TODO What about Unicode? -} - -func goStructEnumerate(self *_object, all bool, each func(string) bool) { - object := self.value.(*_goStructObject) - - // Enumerate fields - for index := 0; index < reflect.Indirect(object.value).NumField(); index++ { - name := reflect.Indirect(object.value).Type().Field(index).Name - if validGoStructName(name) { - if !each(name) { - return - } - } - } - - // Enumerate methods - for index := 0; index < object.value.NumMethod(); index++ { - name := object.value.Type().Method(index).Name - if validGoStructName(name) { - if !each(name) { - return - } - } - } - - objectEnumerate(self, all, each) -} - -func goStructCanPut(self *_object, name string) bool { - object := self.value.(*_goStructObject) - value := object.getValue(name) - if value.IsValid() { - return true - } - - return objectCanPut(self, name) -} - -func goStructPut(self *_object, name string, value Value, throw bool) { - object := self.value.(*_goStructObject) - if object.setValue(name, value) { - return - } - - objectPut(self, name, value, throw) -} - -func goStructMarshalJSON(self *_object) json.Marshaler { - object := self.value.(*_goStructObject) - goValue := reflect.Indirect(object.value).Interface() - switch marshaler := goValue.(type) { - case json.Marshaler: - return marshaler - } - return nil -} diff --git a/vendor/github.com/robertkrimen/otto/type_number.go b/vendor/github.com/robertkrimen/otto/type_number.go deleted file mode 100644 index 28de4444c79d..000000000000 --- a/vendor/github.com/robertkrimen/otto/type_number.go +++ /dev/null @@ -1,5 +0,0 @@ -package otto - -func (runtime *_runtime) newNumberObject(value Value) *_object { - return runtime.newPrimitiveObject("Number", value.numberValue()) -} diff --git a/vendor/github.com/robertkrimen/otto/type_reference.go b/vendor/github.com/robertkrimen/otto/type_reference.go deleted file mode 100644 index fd770c6f4e0a..000000000000 --- a/vendor/github.com/robertkrimen/otto/type_reference.go +++ /dev/null @@ -1,103 +0,0 @@ -package otto - -type _reference interface { - invalid() bool // IsUnresolvableReference - getValue() Value // getValue - putValue(Value) string // PutValue - delete() bool -} - -// PropertyReference - -type _propertyReference struct { - name string - strict bool - base *_object - runtime *_runtime - at _at -} - -func newPropertyReference(rt *_runtime, base *_object, name string, strict bool, at _at) *_propertyReference { - return &_propertyReference{ - runtime: rt, - name: name, - strict: strict, - base: base, - at: at, - } -} - -func (self *_propertyReference) invalid() bool { - return self.base == nil -} - -func (self *_propertyReference) getValue() Value { - if self.base == nil { - panic(self.runtime.panicReferenceError("'%s' is not defined", self.name, self.at)) - } - return self.base.get(self.name) -} - -func (self *_propertyReference) putValue(value Value) string { - if self.base == nil { - return self.name - } - self.base.put(self.name, value, self.strict) - return "" -} - -func (self *_propertyReference) delete() bool { - if self.base == nil { - // TODO Throw an error if strict - return true - } - return self.base.delete(self.name, self.strict) -} - -// ArgumentReference - -func newArgumentReference(runtime *_runtime, base *_object, name string, strict bool, at _at) *_propertyReference { - if base == nil { - panic(hereBeDragons()) - } - return newPropertyReference(runtime, base, name, strict, at) -} - -type _stashReference struct { - name string - strict bool - base _stash -} - -func (self *_stashReference) invalid() bool { - return false // The base (an environment) will never be nil -} - -func (self *_stashReference) getValue() Value { - return self.base.getBinding(self.name, self.strict) -} - -func (self *_stashReference) putValue(value Value) string { - self.base.setValue(self.name, value, self.strict) - return "" -} - -func (self *_stashReference) delete() bool { - if self.base == nil { - // This should never be reached, but just in case - return false - } - return self.base.deleteBinding(self.name) -} - -// getIdentifierReference - -func getIdentifierReference(runtime *_runtime, stash _stash, name string, strict bool, at _at) _reference { - if stash == nil { - return newPropertyReference(runtime, nil, name, strict, at) - } - if stash.hasBinding(name) { - return stash.newReference(name, strict, at) - } - return getIdentifierReference(runtime, stash.outer(), name, strict, at) -} diff --git a/vendor/github.com/robertkrimen/otto/type_regexp.go b/vendor/github.com/robertkrimen/otto/type_regexp.go deleted file mode 100644 index 57fe31640591..000000000000 --- a/vendor/github.com/robertkrimen/otto/type_regexp.go +++ /dev/null @@ -1,146 +0,0 @@ -package otto - -import ( - "fmt" - "regexp" - "unicode/utf8" - - "github.com/robertkrimen/otto/parser" -) - -type _regExpObject struct { - regularExpression *regexp.Regexp - global bool - ignoreCase bool - multiline bool - source string - flags string -} - -func (runtime *_runtime) newRegExpObject(pattern string, flags string) *_object { - self := runtime.newObject() - self.class = "RegExp" - - global := false - ignoreCase := false - multiline := false - re2flags := "" - - // TODO Maybe clean up the panicking here... TypeError, SyntaxError, ? - - for _, chr := range flags { - switch chr { - case 'g': - if global { - panic(runtime.panicSyntaxError("newRegExpObject: %s %s", pattern, flags)) - } - global = true - case 'm': - if multiline { - panic(runtime.panicSyntaxError("newRegExpObject: %s %s", pattern, flags)) - } - multiline = true - re2flags += "m" - case 'i': - if ignoreCase { - panic(runtime.panicSyntaxError("newRegExpObject: %s %s", pattern, flags)) - } - ignoreCase = true - re2flags += "i" - } - } - - re2pattern, err := parser.TransformRegExp(pattern) - if err != nil { - panic(runtime.panicTypeError("Invalid regular expression: %s", err.Error())) - } - if len(re2flags) > 0 { - re2pattern = fmt.Sprintf("(?%s:%s)", re2flags, re2pattern) - } - - regularExpression, err := regexp.Compile(re2pattern) - if err != nil { - panic(runtime.panicSyntaxError("Invalid regular expression: %s", err.Error()[22:])) - } - - self.value = _regExpObject{ - regularExpression: regularExpression, - global: global, - ignoreCase: ignoreCase, - multiline: multiline, - source: pattern, - flags: flags, - } - self.defineProperty("global", toValue_bool(global), 0, false) - self.defineProperty("ignoreCase", toValue_bool(ignoreCase), 0, false) - self.defineProperty("multiline", toValue_bool(multiline), 0, false) - self.defineProperty("lastIndex", toValue_int(0), 0100, false) - self.defineProperty("source", toValue_string(pattern), 0, false) - return self -} - -func (self *_object) regExpValue() _regExpObject { - value, _ := self.value.(_regExpObject) - return value -} - -func execRegExp(this *_object, target string) (match bool, result []int) { - if this.class != "RegExp" { - panic(this.runtime.panicTypeError("Calling RegExp.exec on a non-RegExp object")) - } - lastIndex := this.get("lastIndex").number().int64 - index := lastIndex - global := this.get("global").bool() - if !global { - index = 0 - } - if 0 > index || index > int64(len(target)) { - } else { - result = this.regExpValue().regularExpression.FindStringSubmatchIndex(target[index:]) - } - if result == nil { - //this.defineProperty("lastIndex", toValue_(0), 0111, true) - this.put("lastIndex", toValue_int(0), true) - return // !match - } - match = true - startIndex := index - endIndex := int(lastIndex) + result[1] - // We do this shift here because the .FindStringSubmatchIndex above - // was done on a local subordinate slice of the string, not the whole string - for index, _ := range result { - result[index] += int(startIndex) - } - if global { - //this.defineProperty("lastIndex", toValue_(endIndex), 0111, true) - this.put("lastIndex", toValue_int(endIndex), true) - } - return // match -} - -func execResultToArray(runtime *_runtime, target string, result []int) *_object { - captureCount := len(result) / 2 - valueArray := make([]Value, captureCount) - for index := 0; index < captureCount; index++ { - offset := 2 * index - if result[offset] != -1 { - valueArray[index] = toValue_string(target[result[offset]:result[offset+1]]) - } else { - valueArray[index] = Value{} - } - } - matchIndex := result[0] - if matchIndex != 0 { - matchIndex = 0 - // Find the rune index in the string, not the byte index - for index := 0; index < result[0]; { - _, size := utf8.DecodeRuneInString(target[index:]) - matchIndex += 1 - index += size - } - } - match := runtime.newArrayOf(valueArray) - match.defineProperty("input", toValue_string(target), 0111, false) - match.defineProperty("index", toValue_int(matchIndex), 0111, false) - return match -} diff --git a/vendor/github.com/robertkrimen/otto/type_string.go b/vendor/github.com/robertkrimen/otto/type_string.go deleted file mode 100644 index ef3afa42bad7..000000000000 --- a/vendor/github.com/robertkrimen/otto/type_string.go +++ /dev/null @@ -1,112 +0,0 @@ -package otto - -import ( - "strconv" - "unicode/utf8" -) - -type _stringObject interface { - Length() int - At(int) rune - String() string -} - -type _stringASCII string - -func (str _stringASCII) Length() int { - return len(str) -} - -func (str _stringASCII) At(at int) rune { - return rune(str[at]) -} - -func (str _stringASCII) String() string { - return string(str) -} - -type _stringWide struct { - string string - length int - runes []rune -} - -func (str _stringWide) Length() int { - return str.length -} - -func (str _stringWide) At(at int) rune { - if str.runes == nil { - str.runes = []rune(str.string) - } - return str.runes[at] -} - -func (str _stringWide) String() string { - return str.string -} - -func _newStringObject(str string) _stringObject { - for i := 0; i < len(str); i++ { - if str[i] >= utf8.RuneSelf { - goto wide - } - } - - return _stringASCII(str) - -wide: - return &_stringWide{ - string: str, - length: utf8.RuneCountInString(str), - } -} - -func stringAt(str _stringObject, index int) rune { - if 0 <= index && index < str.Length() { - return str.At(index) - } - return utf8.RuneError -} - -func (runtime *_runtime) newStringObject(value Value) *_object { - str := _newStringObject(value.string()) - - self := runtime.newClassObject("String") - self.defineProperty("length", toValue_int(str.Length()), 0, false) - self.objectClass = _classString - self.value = str - return self -} - -func (self *_object) stringValue() _stringObject { - if str, ok := self.value.(_stringObject); ok { - return str - } - return nil -} - -func stringEnumerate(self *_object, all bool, each func(string) bool) { - if str := self.stringValue(); str != nil { - length := str.Length() - for index := 0; index < length; index++ { - if !each(strconv.FormatInt(int64(index), 10)) { - return - } - } - } - objectEnumerate(self, all, each) -} - -func stringGetOwnProperty(self *_object, name string) *_property { - if property := objectGetOwnProperty(self, name); property != nil { - return property - } - // TODO Test a string of length >= +int32 + 1? - if index := stringToArrayIndex(name); index >= 0 { - if chr := stringAt(self.stringValue(), int(index)); chr != utf8.RuneError { - return &_property{toValue_string(string(chr)), 0} - } - } - return nil -} diff --git a/vendor/github.com/robertkrimen/otto/value.go b/vendor/github.com/robertkrimen/otto/value.go deleted file mode 100644 index 90c1406040eb..000000000000 --- a/vendor/github.com/robertkrimen/otto/value.go +++ /dev/null @@ -1,1033 +0,0 @@ -package otto - -import ( - "fmt" - "math" - "reflect" - "strconv" - "unicode/utf16" -) - -type _valueKind int - -const ( - valueUndefined _valueKind = iota - valueNull - valueNumber - valueString - valueBoolean - valueObject - - // These are invalid outside of the runtime - valueEmpty - valueResult - valueReference -) - -// Value is the representation of a JavaScript value. -type Value struct { - kind _valueKind - value interface{} -} - -func (value Value) safe() bool { - return value.kind < valueEmpty -} - -var ( - emptyValue = Value{kind: valueEmpty} - nullValue = Value{kind: valueNull} - falseValue = Value{kind: valueBoolean, value: false} - trueValue = Value{kind: valueBoolean, value: true} -) - -// ToValue will convert an interface{} value to a value digestible by otto/JavaScript -// -// This function will not work for advanced types (struct, map, slice/array, etc.) and -// you should use Otto.ToValue instead. -func ToValue(value interface{}) (Value, error) { - result := Value{} - err := catchPanic(func() { - result = toValue(value) - }) - return result, err -} - -func (value Value) isEmpty() bool { - return value.kind == valueEmpty -} - -// Undefined - -// UndefinedValue will return a Value representing undefined. -func UndefinedValue() Value { - return Value{} -} - -// IsDefined will return false if the value is undefined, and true otherwise. -func (value Value) IsDefined() bool { - return value.kind != valueUndefined -} - -// IsUndefined will return true if the value is undefined, and false otherwise. -func (value Value) IsUndefined() bool { - return value.kind == valueUndefined -} - -// NullValue will return a Value representing null. -func NullValue() Value { - return Value{kind: valueNull} -} - -// IsNull will return true if the value is null, and false otherwise. -func (value Value) IsNull() bool { - return value.kind == valueNull -} - -// --- - -func (value Value) isCallable() bool { - switch value := value.value.(type) { - case *_object: - return value.isCall() - } - return false -} - -// Call the value as a function with the given this value and argument list and -// return the result of invocation. It is essentially equivalent to: -// -// value.apply(thisValue, argumentList) -// -// An undefined value and an error will result if: -// -// 1. There is an error during conversion of the argument list -// 2. The value is not actually a function -// 3. An (uncaught) exception is thrown -// -func (value Value) Call(this Value, argumentList ...interface{}) (Value, error) { - result := Value{} - err := catchPanic(func() { - // FIXME - result = value.call(nil, this, argumentList...) - }) - if !value.safe() { - value = Value{} - } - return result, err -} - -func (value Value) call(rt *_runtime, this Value, argumentList ...interface{}) Value { - switch function := value.value.(type) { - case *_object: - return function.call(this, function.runtime.toValueArray(argumentList...), false, nativeFrame) - } - if rt == nil { - panic("FIXME TypeError") - } - panic(rt.panicTypeError()) -} - -func (value Value) constructSafe(rt *_runtime, this Value, argumentList ...interface{}) (Value, error) { - result := Value{} - err := catchPanic(func() { - result = value.construct(rt, this, argumentList...) - }) - return result, err -} - -func (value Value) construct(rt *_runtime, this Value, argumentList ...interface{}) Value { - switch fn := value.value.(type) { - case *_object: - return fn.construct(fn.runtime.toValueArray(argumentList...)) - } - if rt == nil { - panic("FIXME TypeError") - } - panic(rt.panicTypeError()) -} - -// IsPrimitive will return true if value is a primitive (any kind of primitive). -func (value Value) IsPrimitive() bool { - return !value.IsObject() -} - -// IsBoolean will return true if value is a boolean (primitive). -func (value Value) IsBoolean() bool { - return value.kind == valueBoolean -} - -// IsNumber will return true if value is a number (primitive). -func (value Value) IsNumber() bool { - return value.kind == valueNumber -} - -// IsNaN will return true if value is NaN (or would convert to NaN). -func (value Value) IsNaN() bool { - switch value := value.value.(type) { - case float64: - return math.IsNaN(value) - case float32: - return math.IsNaN(float64(value)) - case int, int8, int32, int64: - return false - case uint, uint8, uint32, uint64: - return false - } - - return math.IsNaN(value.float64()) -} - -// IsString will return true if value is a string (primitive). -func (value Value) IsString() bool { - return value.kind == valueString -} - -// IsObject will return true if value is an object. -func (value Value) IsObject() bool { - return value.kind == valueObject -} - -// IsFunction will return true if value is a function. -func (value Value) IsFunction() bool { - if value.kind != valueObject { - return false - } - return value.value.(*_object).class == "Function" -} - -// Class will return the class string of the value or the empty string if value is not an object. -// -// The return value will (generally) be one of: -// -// Object -// Function -// Array -// String -// Number -// Boolean -// Date -// RegExp -// -func (value Value) Class() string { - if value.kind != valueObject { - return "" - } - return value.value.(*_object).class -} - -func (value Value) isArray() bool { - if value.kind != valueObject { - return false - } - return isArray(value.value.(*_object)) -} - -func (value Value) isStringObject() bool { - if value.kind != valueObject { - return false - } - return value.value.(*_object).class == "String" -} - -func (value Value) isBooleanObject() bool { - if value.kind != valueObject { - return false - } - return value.value.(*_object).class == "Boolean" -} - -func (value Value) isNumberObject() bool { - if value.kind != valueObject { - return false - } - return value.value.(*_object).class == "Number" -} - -func (value Value) isDate() bool { - if value.kind != valueObject { - return false - } - return value.value.(*_object).class == "Date" -} - -func (value Value) isRegExp() bool { - if value.kind != valueObject { - return false - } - return value.value.(*_object).class == "RegExp" -} - -func (value Value) isError() bool { - if value.kind != valueObject { - return false - } - return value.value.(*_object).class == "Error" -} - -// --- - -func toValue_reflectValuePanic(value interface{}, kind reflect.Kind) { - // FIXME? - switch kind { - case reflect.Struct: - panic(newError(nil, "TypeError", 0, "invalid value (struct): missing runtime: %v (%T)", value, value)) - case reflect.Map: - panic(newError(nil, "TypeError", 0, "invalid value (map): missing runtime: %v (%T)", value, value)) - case reflect.Slice: - panic(newError(nil, "TypeError", 0, "invalid value (slice): missing runtime: %v (%T)", value, value)) - } -} - -func toValue(value interface{}) Value { - switch value := value.(type) { - case Value: - return value - case bool: - return Value{valueBoolean, value} - case int: - return Value{valueNumber, value} - case int8: - return Value{valueNumber, value} - case int16: - return Value{valueNumber, value} - case int32: - return Value{valueNumber, value} - case int64: - return Value{valueNumber, value} - case uint: - return Value{valueNumber, value} - case uint8: - return Value{valueNumber, value} - case uint16: - return Value{valueNumber, value} - case uint32: - return Value{valueNumber, value} - case uint64: - return Value{valueNumber, value} - case float32: - return Value{valueNumber, float64(value)} - case float64: - return Value{valueNumber, value} - case []uint16: - return Value{valueString, value} - case string: - return Value{valueString, value} - // A rune is actually an int32, which is handled above - case *_object: - return Value{valueObject, value} - case *Object: - return Value{valueObject, value.object} - case Object: - return Value{valueObject, value.object} - case _reference: // reference is an interface (already a pointer) - return Value{valueReference, value} - case _result: - return Value{valueResult, value} - case nil: - // TODO Ugh. - return Value{} - case reflect.Value: - for value.Kind() == reflect.Ptr { - // We were given a pointer, so we'll drill down until we get a non-pointer - // - // These semantics might change if we want to start supporting pointers to values transparently - // (It would be best not to depend on this behavior) - // FIXME: UNDEFINED - if value.IsNil() { - return Value{} - } - value = value.Elem() - } - switch value.Kind() { - case reflect.Bool: - return Value{valueBoolean, bool(value.Bool())} - case reflect.Int: - return Value{valueNumber, int(value.Int())} - case reflect.Int8: - return Value{valueNumber, int8(value.Int())} - case reflect.Int16: - return Value{valueNumber, int16(value.Int())} - case reflect.Int32: - return Value{valueNumber, int32(value.Int())} - case reflect.Int64: - return Value{valueNumber, int64(value.Int())} - case reflect.Uint: - return Value{valueNumber, uint(value.Uint())} - case reflect.Uint8: - return Value{valueNumber, uint8(value.Uint())} - case reflect.Uint16: - return Value{valueNumber, uint16(value.Uint())} - case reflect.Uint32: - return Value{valueNumber, uint32(value.Uint())} - case reflect.Uint64: - return Value{valueNumber, uint64(value.Uint())} - case reflect.Float32: - return Value{valueNumber, float32(value.Float())} - case reflect.Float64: - return Value{valueNumber, float64(value.Float())} - case reflect.String: - return Value{valueString, string(value.String())} - default: - toValue_reflectValuePanic(value.Interface(), value.Kind()) - } - default: - return toValue(reflect.ValueOf(value)) - } - // FIXME? - panic(newError(nil, "TypeError", 0, "invalid value: %v (%T)", value, value)) -} - -// String will return the value as a string. -// -// This method will make return the empty string if there is an error. -func (value Value) String() string { - result := "" - catchPanic(func() { - result = value.string() - }) - return result -} - -// ToBoolean will convert the value to a boolean (bool). -// -// ToValue(0).ToBoolean() => false -// ToValue("").ToBoolean() => false -// ToValue(true).ToBoolean() => true -// ToValue(1).ToBoolean() => true -// ToValue("Nothing happens").ToBoolean() => true -// -// If there is an error during the conversion process (like an uncaught exception), then the result will be false and an error. -func (value Value) ToBoolean() (bool, error) { - result := false - err := catchPanic(func() { - result = value.bool() - }) - return result, err -} - -func (value Value) numberValue() Value { - if value.kind == valueNumber { - return value - } - return Value{valueNumber, value.float64()} -} - -// ToFloat will convert the value to a number (float64). -// -// ToValue(0).ToFloat() => 0. -// ToValue(1.1).ToFloat() => 1.1 -// ToValue("11").ToFloat() => 11. -// -// If there is an error during the conversion process (like an uncaught exception), then the result will be 0 and an error. -func (value Value) ToFloat() (float64, error) { - result := float64(0) - err := catchPanic(func() { - result = value.float64() - }) - return result, err -} - -// ToInteger will convert the value to a number (int64). -// -// ToValue(0).ToInteger() => 0 -// ToValue(1.1).ToInteger() => 1 -// ToValue("11").ToInteger() => 11 -// -// If there is an error during the conversion process (like an uncaught exception), then the result will be 0 and an error. -func (value Value) ToInteger() (int64, error) { - result := int64(0) - err := catchPanic(func() { - result = value.number().int64 - }) - return result, err -} - -// ToString will convert the value to a string (string). -// -// ToValue(0).ToString() => "0" -// ToValue(false).ToString() => "false" -// ToValue(1.1).ToString() => "1.1" -// ToValue("11").ToString() => "11" -// ToValue('Nothing happens.').ToString() => "Nothing happens." -// -// If there is an error during the conversion process (like an uncaught exception), then the result will be the empty string ("") and an error. -func (value Value) ToString() (string, error) { - result := "" - err := catchPanic(func() { - result = value.string() - }) - return result, err -} - -func (value Value) _object() *_object { - switch value := value.value.(type) { - case *_object: - return value - } - return nil -} - -// Object will return the object of the value, or nil if value is not an object. -// -// This method will not do any implicit conversion. For example, calling this method on a string primitive value will not return a String object. -func (value Value) Object() *Object { - switch object := value.value.(type) { - case *_object: - return _newObject(object, value) - } - return nil -} - -func (value Value) reference() _reference { - switch value := value.value.(type) { - case _reference: - return value - } - return nil -} - -func (value Value) resolve() Value { - switch value := value.value.(type) { - case _reference: - return value.getValue() - } - return value -} - -var ( - __NaN__ float64 = math.NaN() - __PositiveInfinity__ float64 = math.Inf(+1) - __NegativeInfinity__ float64 = math.Inf(-1) - __PositiveZero__ float64 = 0 - __NegativeZero__ float64 = math.Float64frombits(0 | (1 << 63)) -) - -func positiveInfinity() float64 { - return __PositiveInfinity__ -} - -func negativeInfinity() float64 { - return __NegativeInfinity__ -} - -func positiveZero() float64 { - return __PositiveZero__ -} - -func negativeZero() float64 { - return __NegativeZero__ -} - -// NaNValue will return a value representing NaN. -// -// It is equivalent to: -// -// ToValue(math.NaN()) -// -func NaNValue() Value { - return Value{valueNumber, __NaN__} -} - -func positiveInfinityValue() Value { - return Value{valueNumber, __PositiveInfinity__} -} - -func negativeInfinityValue() Value { - return Value{valueNumber, __NegativeInfinity__} -} - -func positiveZeroValue() Value { - return Value{valueNumber, __PositiveZero__} -} - -func negativeZeroValue() Value { - return Value{valueNumber, __NegativeZero__} -} - -// TrueValue will return a value representing true. -// -// It is equivalent to: -// -// ToValue(true) -// -func TrueValue() Value { - return Value{valueBoolean, true} -} - -// FalseValue will return a value representing false. -// -// It is equivalent to: -// -// ToValue(false) -// -func FalseValue() Value { - return Value{valueBoolean, false} -} - -func sameValue(x Value, y Value) bool { - if x.kind != y.kind { - return false - } - result := false - switch x.kind { - case valueUndefined, valueNull: - result = true - case valueNumber: - x := x.float64() - y := y.float64() - if math.IsNaN(x) && math.IsNaN(y) { - result = true - } else { - result = x == y - if result && x == 0 { - // Since +0 != -0 - result = math.Signbit(x) == math.Signbit(y) - } - } - case valueString: - result = x.string() == y.string() - case valueBoolean: - result = x.bool() == y.bool() - case valueObject: - result = x._object() == y._object() - default: - panic(hereBeDragons()) - } - - return result -} - -func strictEqualityComparison(x Value, y Value) bool { - if x.kind != y.kind { - return false - } - result := false - switch x.kind { - case valueUndefined, valueNull: - result = true - case valueNumber: - x := x.float64() - y := y.float64() - if math.IsNaN(x) && math.IsNaN(y) { - result = false - } else { - result = x == y - } - case valueString: - result = x.string() == y.string() - case valueBoolean: - result = x.bool() == y.bool() - case valueObject: - result = x._object() == y._object() - default: - panic(hereBeDragons()) - } - - return result -} - -// Export will attempt to convert the value to a Go representation -// and return it via an interface{} kind. -// -// Export returns an error, but it will always be nil. It is present -// for backwards compatibility. -// -// If a reasonable conversion is not possible, then the original -// value is returned. -// -// undefined -> nil (FIXME?: Should be Value{}) -// null -> nil -// boolean -> bool -// number -> A number type (int, float32, uint64, ...) -// string -> string -// Array -> []interface{} -// Object -> map[string]interface{} -// -func (self Value) Export() (interface{}, error) { - return self.export(), nil -} - -func (self Value) export() interface{} { - - switch self.kind { - case valueUndefined: - return nil - case valueNull: - return nil - case valueNumber, valueBoolean: - return self.value - case valueString: - switch value := self.value.(type) { - case string: - return value - case []uint16: - return string(utf16.Decode(value)) - } - case valueObject: - object := self._object() - switch value := object.value.(type) { - case *_goStructObject: - return value.value.Interface() - case *_goMapObject: - return value.value.Interface() - case *_goArrayObject: - return value.value.Interface() - case *_goSliceObject: - return value.value.Interface() - } - if object.class == "Array" { - result := make([]interface{}, 0) - lengthValue := object.get("length") - length := lengthValue.value.(uint32) - kind := reflect.Invalid - state := 0 - var t reflect.Type - for index := uint32(0); index < length; index += 1 { - name := strconv.FormatInt(int64(index), 10) - if !object.hasProperty(name) { - continue - } - value := object.get(name).export() - - t = reflect.TypeOf(value) - - var k reflect.Kind - if t != nil { - k = t.Kind() - } - - if state == 0 { - kind = k - state = 1 - } else if state == 1 && kind != k { - state = 2 - } - - result = append(result, value) - } - - if state != 1 || kind == reflect.Interface || t == nil { - // No common type - return result - } - - // Convert to the common type - val := reflect.MakeSlice(reflect.SliceOf(t), len(result), len(result)) - for i, v := range result { - val.Index(i).Set(reflect.ValueOf(v)) - } - return val.Interface() - } else { - result := make(map[string]interface{}) - // TODO Should we export everything? Or just what is enumerable? - object.enumerate(false, func(name string) bool { - value := object.get(name) - if value.IsDefined() { - result[name] = value.export() - } - return true - }) - return result - } - } - - if self.safe() { - return self - } - - return Value{} -} - -func (self Value) evaluateBreakContinue(labels []string) _resultKind { - result := self.value.(_result) - if result.kind == resultBreak || result.kind == resultContinue { - for _, label := range labels { - if label == result.target { - return result.kind - } - } - } - return resultReturn -} - -func (self Value) evaluateBreak(labels []string) _resultKind { - result := self.value.(_result) - if result.kind == resultBreak { - for _, label := range labels { - if label == result.target { - return result.kind - } - } - } - return resultReturn -} - -func (self Value) exportNative() interface{} { - - switch self.kind { - case valueUndefined: - return self - case valueNull: - return nil - case valueNumber, valueBoolean: - return self.value - case valueString: - switch value := self.value.(type) { - case string: - return value - case []uint16: - return string(utf16.Decode(value)) - } - case valueObject: - object := self._object() - switch value := object.value.(type) { - case *_goStructObject: - return value.value.Interface() - case *_goMapObject: - return value.value.Interface() - case *_goArrayObject: - return value.value.Interface() - case *_goSliceObject: - return value.value.Interface() - } - } - - return self -} - -// Make a best effort to return a reflect.Value corresponding to reflect.Kind, but -// fallback to just returning the Go value we have handy. -func (value Value) toReflectValue(kind reflect.Kind) (reflect.Value, error) { - if kind != reflect.Float32 && kind != reflect.Float64 && kind != reflect.Interface { - switch value := value.value.(type) { - case float32: - _, frac := math.Modf(float64(value)) - if frac > 0 { - return reflect.Value{}, fmt.Errorf("RangeError: %v to reflect.Kind: %v", value, kind) - } - case float64: - _, frac := math.Modf(value) - if frac > 0 { - return reflect.Value{}, fmt.Errorf("RangeError: %v to reflect.Kind: %v", value, kind) - } - } - } - - switch kind { - case reflect.Bool: // Bool - return reflect.ValueOf(value.bool()), nil - case reflect.Int: // Int - // We convert to float64 here because converting to int64 will not tell us - // if a value is outside the range of int64 - tmp := toIntegerFloat(value) - if tmp < float_minInt || tmp > float_maxInt { - return reflect.Value{}, fmt.Errorf("RangeError: %f (%v) to int", tmp, value) - } else { - return reflect.ValueOf(int(tmp)), nil - } - case reflect.Int8: // Int8 - tmp := value.number().int64 - if tmp < int64_minInt8 || tmp > int64_maxInt8 { - return reflect.Value{}, fmt.Errorf("RangeError: %d (%v) to int8", tmp, value) - } else { - return reflect.ValueOf(int8(tmp)), nil - } - case reflect.Int16: // Int16 - tmp := value.number().int64 - if tmp < int64_minInt16 || tmp > int64_maxInt16 { - return reflect.Value{}, fmt.Errorf("RangeError: %d (%v) to int16", tmp, value) - } else { - return reflect.ValueOf(int16(tmp)), nil - } - case reflect.Int32: // Int32 - tmp := value.number().int64 - if tmp < int64_minInt32 || tmp > int64_maxInt32 { - return reflect.Value{}, fmt.Errorf("RangeError: %d (%v) to int32", tmp, value) - } else { - return reflect.ValueOf(int32(tmp)), nil - } - case reflect.Int64: // Int64 - // We convert to float64 here because converting to int64 will not tell us - // if a value is outside the range of int64 - tmp := toIntegerFloat(value) - if tmp < float_minInt64 || tmp > float_maxInt64 { - return reflect.Value{}, fmt.Errorf("RangeError: %f (%v) to int", tmp, value) - } else { - return reflect.ValueOf(int64(tmp)), nil - } - case reflect.Uint: // Uint - // We convert to float64 here because converting to int64 will not tell us - // if a value is outside the range of uint - tmp := toIntegerFloat(value) - if tmp < 0 || tmp > float_maxUint { - return reflect.Value{}, fmt.Errorf("RangeError: %f (%v) to uint", tmp, value) - } else { - return reflect.ValueOf(uint(tmp)), nil - } - case reflect.Uint8: // Uint8 - tmp := value.number().int64 - if tmp < 0 || tmp > int64_maxUint8 { - return reflect.Value{}, fmt.Errorf("RangeError: %d (%v) to uint8", tmp, value) - } else { - return reflect.ValueOf(uint8(tmp)), nil - } - case reflect.Uint16: // Uint16 - tmp := value.number().int64 - if tmp < 0 || tmp > int64_maxUint16 { - return reflect.Value{}, fmt.Errorf("RangeError: %d (%v) to uint16", tmp, value) - } else { - return reflect.ValueOf(uint16(tmp)), nil - } - case reflect.Uint32: // Uint32 - tmp := value.number().int64 - if tmp < 0 || tmp > int64_maxUint32 { - return reflect.Value{}, fmt.Errorf("RangeError: %d (%v) to uint32", tmp, value) - } else { - return reflect.ValueOf(uint32(tmp)), nil - } - case reflect.Uint64: // Uint64 - // We convert to float64 here because converting to int64 will not tell us - // if a value is outside the range of uint64 - tmp := toIntegerFloat(value) - if tmp < 0 || tmp > float_maxUint64 { - return reflect.Value{}, fmt.Errorf("RangeError: %f (%v) to uint64", tmp, value) - } else { - return reflect.ValueOf(uint64(tmp)), nil - } - case reflect.Float32: // Float32 - tmp := value.float64() - tmp1 := tmp - if 0 > tmp1 { - tmp1 = -tmp1 - } - if tmp1 > 0 && (tmp1 < math.SmallestNonzeroFloat32 || tmp1 > math.MaxFloat32) { - return reflect.Value{}, fmt.Errorf("RangeError: %f (%v) to float32", tmp, value) - } else { - return reflect.ValueOf(float32(tmp)), nil - } - case reflect.Float64: // Float64 - value := value.float64() - return reflect.ValueOf(float64(value)), nil - case reflect.String: // String - return reflect.ValueOf(value.string()), nil - case reflect.Invalid: // Invalid - case reflect.Complex64: // FIXME? Complex64 - case reflect.Complex128: // FIXME? Complex128 - case reflect.Chan: // FIXME? Chan - case reflect.Func: // FIXME? Func - case reflect.Ptr: // FIXME? Ptr - case reflect.UnsafePointer: // FIXME? UnsafePointer - default: - switch value.kind { - case valueObject: - object := value._object() - switch vl := object.value.(type) { - case *_goStructObject: // Struct - return reflect.ValueOf(vl.value.Interface()), nil - case *_goMapObject: // Map - return reflect.ValueOf(vl.value.Interface()), nil - case *_goArrayObject: // Array - return reflect.ValueOf(vl.value.Interface()), nil - case *_goSliceObject: // Slice - return reflect.ValueOf(vl.value.Interface()), nil - } - return reflect.ValueOf(value.exportNative()), nil - case valueEmpty, valueResult, valueReference: - // These are invalid, and should panic - default: - return reflect.ValueOf(value.value), nil - } - } - - // FIXME Should this end up as a TypeError? - panic(fmt.Errorf("invalid conversion of %v (%v) to reflect.Kind: %v", value.kind, value, kind)) -} - -func stringToReflectValue(value string, kind reflect.Kind) (reflect.Value, error) { - switch kind { - case reflect.Bool: - value, err := strconv.ParseBool(value) - if err != nil { - return reflect.Value{}, err - } - return reflect.ValueOf(value), nil - case reflect.Int: - value, err := strconv.ParseInt(value, 0, 0) - if err != nil { - return reflect.Value{}, err - } - return reflect.ValueOf(int(value)), nil - case reflect.Int8: - value, err := strconv.ParseInt(value, 0, 8) - if err != nil { - return reflect.Value{}, err - } - return reflect.ValueOf(int8(value)), nil - case reflect.Int16: - value, err := strconv.ParseInt(value, 0, 16) - if err != nil { - return reflect.Value{}, err - } - return reflect.ValueOf(int16(value)), nil - case reflect.Int32: - value, err := strconv.ParseInt(value, 0, 32) - if err != nil { - return reflect.Value{}, err - } - return reflect.ValueOf(int32(value)), nil - case reflect.Int64: - value, err := strconv.ParseInt(value, 0, 64) - if err != nil { - return reflect.Value{}, err - } - return reflect.ValueOf(int64(value)), nil - case reflect.Uint: - value, err := strconv.ParseUint(value, 0, 0) - if err != nil { - return reflect.Value{}, err - } - return reflect.ValueOf(uint(value)), nil - case reflect.Uint8: - value, err := strconv.ParseUint(value, 0, 8) - if err != nil { - return reflect.Value{}, err - } - return reflect.ValueOf(uint8(value)), nil - case reflect.Uint16: - value, err := strconv.ParseUint(value, 0, 16) - if err != nil { - return reflect.Value{}, err - } - return reflect.ValueOf(uint16(value)), nil - case reflect.Uint32: - value, err := strconv.ParseUint(value, 0, 32) - if err != nil { - return reflect.Value{}, err - } - return reflect.ValueOf(uint32(value)), nil - case reflect.Uint64: - value, err := strconv.ParseUint(value, 0, 64) - if err != nil { - return reflect.Value{}, err - } - return reflect.ValueOf(uint64(value)), nil - case reflect.Float32: - value, err := strconv.ParseFloat(value, 32) - if err != nil { - return reflect.Value{}, err - } - return reflect.ValueOf(float32(value)), nil - case reflect.Float64: - value, err := strconv.ParseFloat(value, 64) - if err != nil { - return reflect.Value{}, err - } - return reflect.ValueOf(float64(value)), nil - case reflect.String: - return reflect.ValueOf(value), nil - } - - // FIXME This should end up as a TypeError? - panic(fmt.Errorf("invalid conversion of %q to reflect.Kind: %v", value, kind)) -} diff --git a/vendor/github.com/robertkrimen/otto/value_boolean.go b/vendor/github.com/robertkrimen/otto/value_boolean.go deleted file mode 100644 index b631507b0a7d..000000000000 --- a/vendor/github.com/robertkrimen/otto/value_boolean.go +++ /dev/null @@ -1,43 +0,0 @@ -package otto - -import ( - "fmt" - "math" - "reflect" - "unicode/utf16" -) - -func (value Value) bool() bool { - if value.kind == valueBoolean { - return value.value.(bool) - } - if value.IsUndefined() { - return false - } - if value.IsNull() { - return false - } - switch value := value.value.(type) { - case bool: - return value - case int, int8, int16, int32, int64: - return 0 != reflect.ValueOf(value).Int() - case uint, uint8, uint16, uint32, uint64: - return 0 != reflect.ValueOf(value).Uint() - case float32: - return 0 != value - case float64: - if math.IsNaN(value) || value == 0 { - return false - } - return true - case string: - return 0 != len(value) - case []uint16: - return 0 != len(utf16.Decode(value)) - } - if value.IsObject() { - return true - } - panic(fmt.Errorf("toBoolean(%T)", value.value)) -} diff --git a/vendor/github.com/robertkrimen/otto/value_number.go b/vendor/github.com/robertkrimen/otto/value_number.go deleted file mode 100644 index 8cbf136d2945..000000000000 --- a/vendor/github.com/robertkrimen/otto/value_number.go +++ /dev/null @@ -1,324 +0,0 @@ -package otto - -import ( - "fmt" - "math" - "regexp" - "strconv" - "strings" -) - -var stringToNumberParseInteger = regexp.MustCompile(`^(?:0[xX])`) - -func parseNumber(value string) float64 { - value = strings.Trim(value, builtinString_trim_whitespace) - - if value == "" { - return 0 - } - - parseFloat := false - if strings.IndexRune(value, '.') != -1 { - parseFloat = true - } else if stringToNumberParseInteger.MatchString(value) { - parseFloat = false - } else { - parseFloat = true - } - - if parseFloat { - number, err := strconv.ParseFloat(value, 64) - if err != nil && err.(*strconv.NumError).Err != strconv.ErrRange { - return math.NaN() - } - return number - } - - number, err := strconv.ParseInt(value, 0, 64) - if err != nil { - return math.NaN() - } - return float64(number) -} - -func (value Value) float64() float64 { - switch value.kind { - case valueUndefined: - return math.NaN() - case valueNull: - return 0 - } - switch value := value.value.(type) { - case bool: - if value { - return 1 - } - return 0 - case int: - return float64(value) - case int8: - return float64(value) - case int16: - return float64(value) - case int32: - return float64(value) - case int64: - return float64(value) - case uint: - return float64(value) - case uint8: - return float64(value) - case uint16: - return float64(value) - case uint32: - return float64(value) - case uint64: - return float64(value) - case float64: - return value - case string: - return parseNumber(value) - case *_object: - return value.DefaultValue(defaultValueHintNumber).float64() - } - panic(fmt.Errorf("toFloat(%T)", value.value)) -} - -const ( - float_2_64 float64 = 18446744073709551616.0 - float_2_63 float64 = 9223372036854775808.0 - float_2_32 float64 = 4294967296.0 - float_2_31 float64 = 2147483648.0 - float_2_16 float64 = 65536.0 - integer_2_32 int64 = 4294967296 - integer_2_31 int64 = 2146483648 - sqrt1_2 float64 = math.Sqrt2 / 2 -) - -const ( - maxInt8 = math.MaxInt8 - minInt8 = math.MinInt8 - maxInt16 = math.MaxInt16 - minInt16 = math.MinInt16 - maxInt32 = math.MaxInt32 - minInt32 = math.MinInt32 - maxInt64 = math.MaxInt64 - minInt64 = math.MinInt64 - maxUint8 = math.MaxUint8 - maxUint16 = math.MaxUint16 - maxUint32 = math.MaxUint32 - maxUint64 = math.MaxUint64 - maxUint = ^uint(0) - minUint = 0 - maxInt = int(^uint(0) >> 1) - minInt = -maxInt - 1 - - // int64 - int64_maxInt int64 = int64(maxInt) - int64_minInt int64 = int64(minInt) - int64_maxInt8 int64 = math.MaxInt8 - int64_minInt8 int64 = math.MinInt8 - int64_maxInt16 int64 = math.MaxInt16 - int64_minInt16 int64 = math.MinInt16 - int64_maxInt32 int64 = math.MaxInt32 - int64_minInt32 int64 = math.MinInt32 - int64_maxUint8 int64 = math.MaxUint8 - int64_maxUint16 int64 = math.MaxUint16 - int64_maxUint32 int64 = math.MaxUint32 - - // float64 - float_maxInt float64 = float64(int(^uint(0) >> 1)) - float_minInt float64 = float64(int(-maxInt - 1)) - float_minUint float64 = float64(0) - float_maxUint float64 = float64(uint(^uint(0))) - float_minUint64 float64 = float64(0) - float_maxUint64 float64 = math.MaxUint64 - float_maxInt64 float64 = math.MaxInt64 - float_minInt64 float64 = math.MinInt64 -) - -func toIntegerFloat(value Value) float64 { - float := value.float64() - if math.IsInf(float, 0) { - } else if math.IsNaN(float) { - float = 0 - } else if float > 0 { - float = math.Floor(float) - } else { - float = math.Ceil(float) - } - return float -} - -type _numberKind int - -const ( - numberInteger _numberKind = iota // 3.0 => 3.0 - numberFloat // 3.14159 => 3.0, 1+2**63 > 2**63-1 - numberInfinity // Infinity => 2**63-1 - numberNaN // NaN => 0 -) - -type _number struct { - kind _numberKind - int64 int64 - float64 float64 -} - -// FIXME -// http://www.goinggo.net/2013/08/gustavos-ieee-754-brain-teaser.html -// http://bazaar.launchpad.net/~niemeyer/strepr/trunk/view/6/strepr.go#L160 -func (value Value) number() (number _number) { - switch value := value.value.(type) { - case int8: - number.int64 = int64(value) - return - case int16: - number.int64 = int64(value) - return - case uint8: - number.int64 = int64(value) - return - case uint16: - number.int64 = int64(value) - return - case uint32: - number.int64 = int64(value) - return - case int: - number.int64 = int64(value) - return - case int64: - number.int64 = value - return - } - - float := value.float64() - if float == 0 { - return - } - - number.kind = numberFloat - number.float64 = float - - if math.IsNaN(float) { - number.kind = numberNaN - return - } - - if math.IsInf(float, 0) { - number.kind = numberInfinity - } - - if float >= float_maxInt64 { - number.int64 = math.MaxInt64 - return - } - - if float <= float_minInt64 { - number.int64 = math.MinInt64 - return - } - - integer := float64(0) - if float > 0 { - integer = math.Floor(float) - } else { - integer = math.Ceil(float) - } - - if float == integer { - number.kind = numberInteger - } - number.int64 = int64(float) - return -} - -// ECMA 262: 9.5 -func toInt32(value Value) int32 { - { - switch value := value.value.(type) { - case int8: - return int32(value) - case int16: - return int32(value) - case int32: - return value - } - } - floatValue := value.float64() - if math.IsNaN(floatValue) || math.IsInf(floatValue, 0) { - return 0 - } - if floatValue == 0 { // This will work for +0 & -0 - return 0 - } - remainder := math.Mod(floatValue, float_2_32) - if remainder > 0 { - remainder = math.Floor(remainder) - } else { - remainder = math.Ceil(remainder) + float_2_32 - } - if remainder > float_2_31 { - return int32(remainder - float_2_32) - } - return int32(remainder) -} - -func toUint32(value Value) uint32 { - { - switch value := value.value.(type) { - case int8: - return uint32(value) - case int16: - return uint32(value) - case uint8: - return uint32(value) - case uint16: - return uint32(value) - case uint32: - return value - } - } - floatValue := value.float64() - if math.IsNaN(floatValue) || math.IsInf(floatValue, 0) { - return 0 - } - if floatValue == 0 { - return 0 - } - remainder := math.Mod(floatValue, float_2_32) - if remainder > 0 { - remainder = math.Floor(remainder) - } else { - remainder = math.Ceil(remainder) + float_2_32 - } - return uint32(remainder) -} - -func toUint16(value Value) uint16 { - { - switch value := value.value.(type) { - case int8: - return uint16(value) - case uint8: - return uint16(value) - case uint16: - return value - } - } - floatValue := value.float64() - if math.IsNaN(floatValue) || math.IsInf(floatValue, 0) { - return 0 - } - if floatValue == 0 { - return 0 - } - remainder := math.Mod(floatValue, float_2_16) - if remainder > 0 { - remainder = math.Floor(remainder) - } else { - remainder = math.Ceil(remainder) + float_2_16 - } - return uint16(remainder) -} diff --git a/vendor/github.com/robertkrimen/otto/value_primitive.go b/vendor/github.com/robertkrimen/otto/value_primitive.go deleted file mode 100644 index 11ed329d1d23..000000000000 --- a/vendor/github.com/robertkrimen/otto/value_primitive.go +++ /dev/null @@ -1,23 +0,0 @@ -package otto - -func toStringPrimitive(value Value) Value { - return _toPrimitive(value, defaultValueHintString) -} - -func toNumberPrimitive(value Value) Value { - return _toPrimitive(value, defaultValueHintNumber) -} - -func toPrimitive(value Value) Value { - return _toPrimitive(value, defaultValueNoHint) -} - -func _toPrimitive(value Value, hint _defaultValueHint) Value { - switch value.kind { - case valueNull, valueUndefined, valueNumber, valueString, valueBoolean: - return value - case valueObject: - return value._object().DefaultValue(hint) - } - panic(hereBeDragons(value.kind, value)) -} diff --git a/vendor/github.com/robertkrimen/otto/value_string.go b/vendor/github.com/robertkrimen/otto/value_string.go deleted file mode 100644 index 0fbfd6b259e9..000000000000 --- a/vendor/github.com/robertkrimen/otto/value_string.go +++ /dev/null @@ -1,103 +0,0 @@ -package otto - -import ( - "fmt" - "math" - "regexp" - "strconv" - "unicode/utf16" -) - -var matchLeading0Exponent = regexp.MustCompile(`([eE][\+\-])0+([1-9])`) // 1e-07 => 1e-7 - -// FIXME -// https://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/conversions.cc?spec=svn18082&r=18082 -func floatToString(value float64, bitsize int) string { - // TODO Fit to ECMA-262 9.8.1 specification - if math.IsNaN(value) { - return "NaN" - } else if math.IsInf(value, 0) { - if math.Signbit(value) { - return "-Infinity" - } - return "Infinity" - } - exponent := math.Log10(math.Abs(value)) - if exponent >= 21 || exponent < -6 { - return matchLeading0Exponent.ReplaceAllString(strconv.FormatFloat(value, 'g', -1, bitsize), "$1$2") - } - return strconv.FormatFloat(value, 'f', -1, bitsize) -} - -func numberToStringRadix(value Value, radix int) string { - float := value.float64() - if math.IsNaN(float) { - return "NaN" - } else if math.IsInf(float, 1) { - return "Infinity" - } else if math.IsInf(float, -1) { - return "-Infinity" - } - // FIXME This is very broken - // Need to do proper radix conversion for floats, ... - // This truncates large floats (so bad). - return strconv.FormatInt(int64(float), radix) -} - -func (value Value) string() string { - if value.kind == valueString { - switch value := value.value.(type) { - case string: - return value - case []uint16: - return string(utf16.Decode(value)) - } - } - if value.IsUndefined() { - return "undefined" - } - if value.IsNull() { - return "null" - } - switch value := value.value.(type) { - case bool: - return strconv.FormatBool(value) - case int: - return strconv.FormatInt(int64(value), 10) - case int8: - return strconv.FormatInt(int64(value), 10) - case int16: - return strconv.FormatInt(int64(value), 10) - case int32: - return strconv.FormatInt(int64(value), 10) - case int64: - return strconv.FormatInt(value, 10) - case uint: - return strconv.FormatUint(uint64(value), 10) - case uint8: - return strconv.FormatUint(uint64(value), 10) - case uint16: - return strconv.FormatUint(uint64(value), 10) - case uint32: - return strconv.FormatUint(uint64(value), 10) - case uint64: - return strconv.FormatUint(value, 10) - case float32: - if value == 0 { - return "0" // Take care not to return -0 - } - return floatToString(float64(value), 32) - case float64: - if value == 0 { - return "0" // Take care not to return -0 - } - return floatToString(value, 64) - case []uint16: - return string(utf16.Decode(value)) - case string: - return value - case *_object: - return value.DefaultValue(defaultValueHintString).string() - } - panic(fmt.Errorf("%v.string( %T)", value.value, value.value)) -} diff --git a/vendor/github.com/rs/cors/LICENSE b/vendor/github.com/rs/cors/LICENSE deleted file mode 100644 index d8e2df5a479a..000000000000 --- a/vendor/github.com/rs/cors/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2014 Olivier Poitrey - -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/rs/cors/README.md b/vendor/github.com/rs/cors/README.md deleted file mode 100644 index 4bf56724e678..000000000000 --- a/vendor/github.com/rs/cors/README.md +++ /dev/null @@ -1,99 +0,0 @@ -# Go CORS handler [![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/rs/cors) [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://raw.githubusercontent.com/rs/cors/master/LICENSE) [![build](https://img.shields.io/travis/rs/cors.svg?style=flat)](https://travis-ci.org/rs/cors) [![Coverage](http://gocover.io/_badge/github.com/rs/cors)](http://gocover.io/github.com/rs/cors) - -CORS is a `net/http` handler implementing [Cross Origin Resource Sharing W3 specification](http://www.w3.org/TR/cors/) in Golang. - -## Getting Started - -After installing Go and setting up your [GOPATH](http://golang.org/doc/code.html#GOPATH), create your first `.go` file. We'll call it `server.go`. - -```go -package main - -import ( - "net/http" - - "github.com/rs/cors" -) - -func main() { - mux := http.NewServeMux() - mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte("{\"hello\": \"world\"}")) - }) - - // cors.Default() setup the middleware with default options being - // all origins accepted with simple methods (GET, POST). See - // documentation below for more options. - handler := cors.Default().Handler(mux) - http.ListenAndServe(":8080", handler) -} -``` - -Install `cors`: - - go get github.com/rs/cors - -Then run your server: - - go run server.go - -The server now runs on `localhost:8080`: - - $ curl -D - -H 'Origin: http://foo.com' http://localhost:8080/ - HTTP/1.1 200 OK - Access-Control-Allow-Origin: foo.com - Content-Type: application/json - Date: Sat, 25 Oct 2014 03:43:57 GMT - Content-Length: 18 - - {"hello": "world"} - -### More Examples - -* `net/http`: [examples/nethttp/server.go](https://github.com/rs/cors/blob/master/examples/nethttp/server.go) -* [Goji](https://goji.io): [examples/goji/server.go](https://github.com/rs/cors/blob/master/examples/goji/server.go) -* [Martini](http://martini.codegangsta.io): [examples/martini/server.go](https://github.com/rs/cors/blob/master/examples/martini/server.go) -* [Negroni](https://github.com/codegangsta/negroni): [examples/negroni/server.go](https://github.com/rs/cors/blob/master/examples/negroni/server.go) -* [Alice](https://github.com/justinas/alice): [examples/alice/server.go](https://github.com/rs/cors/blob/master/examples/alice/server.go) - -## Parameters - -Parameters are passed to the middleware thru the `cors.New` method as follow: - -```go -c := cors.New(cors.Options{ - AllowedOrigins: []string{"http://foo.com"}, - AllowCredentials: true, -}) - -// Insert the middleware -handler = c.Handler(handler) -``` - -* **AllowedOrigins** `[]string`: A list of origins a cross-domain request can be executed from. If the special `*` value is present in the list, all origins will be allowed. An origin may contain a wildcard (`*`) to replace 0 or more characters (i.e.: `http://*.domain.com`). Usage of wildcards implies a small performance penality. Only one wildcard can be used per origin. The default value is `*`. -* **AllowOriginFunc** `func (origin string) bool`: A custom function to validate the origin. It take the origin as argument and returns true if allowed or false otherwise. If this option is set, the content of `AllowedOrigins` is ignored -* **AllowedMethods** `[]string`: A list of methods the client is allowed to use with cross-domain requests. Default value is simple methods (`GET` and `POST`). -* **AllowedHeaders** `[]string`: A list of non simple headers the client is allowed to use with cross-domain requests. -* **ExposedHeaders** `[]string`: Indicates which headers are safe to expose to the API of a CORS API specification -* **AllowCredentials** `bool`: Indicates whether the request can include user credentials like cookies, HTTP authentication or client side SSL certificates. The default is `false`. -* **MaxAge** `int`: Indicates how long (in seconds) the results of a preflight request can be cached. The default is `0` which stands for no max age. -* **OptionsPassthrough** `bool`: Instructs preflight to let other potential next handlers to process the `OPTIONS` method. Turn this on if your application handles `OPTIONS`. -* **Debug** `bool`: Debugging flag adds additional output to debug server side CORS issues. - -See [API documentation](http://godoc.org/github.com/rs/cors) for more info. - -## Benchmarks - - BenchmarkWithout 20000000 64.6 ns/op 8 B/op 1 allocs/op - BenchmarkDefault 3000000 469 ns/op 114 B/op 2 allocs/op - BenchmarkAllowedOrigin 3000000 608 ns/op 114 B/op 2 allocs/op - BenchmarkPreflight 20000000 73.2 ns/op 0 B/op 0 allocs/op - BenchmarkPreflightHeader 20000000 73.6 ns/op 0 B/op 0 allocs/op - BenchmarkParseHeaderList 2000000 847 ns/op 184 B/op 6 allocs/op - BenchmarkParse…Single 5000000 290 ns/op 32 B/op 3 allocs/op - BenchmarkParse…Normalized 2000000 776 ns/op 160 B/op 6 allocs/op - -## Licenses - -All source code is licensed under the [MIT License](https://raw.github.com/rs/cors/master/LICENSE). diff --git a/vendor/github.com/rs/cors/cors.go b/vendor/github.com/rs/cors/cors.go deleted file mode 100644 index 4bb22d8fcef5..000000000000 --- a/vendor/github.com/rs/cors/cors.go +++ /dev/null @@ -1,412 +0,0 @@ -/* -Package cors is net/http handler to handle CORS related requests -as defined by http://www.w3.org/TR/cors/ - -You can configure it by passing an option struct to cors.New: - - c := cors.New(cors.Options{ - AllowedOrigins: []string{"foo.com"}, - AllowedMethods: []string{"GET", "POST", "DELETE"}, - AllowCredentials: true, - }) - -Then insert the handler in the chain: - - handler = c.Handler(handler) - -See Options documentation for more options. - -The resulting handler is a standard net/http handler. -*/ -package cors - -import ( - "log" - "net/http" - "os" - "strconv" - "strings" - - "github.com/rs/xhandler" - "golang.org/x/net/context" -) - -// Options is a configuration container to setup the CORS middleware. -type Options struct { - // AllowedOrigins is a list of origins a cross-domain request can be executed from. - // If the special "*" value is present in the list, all origins will be allowed. - // An origin may contain a wildcard (*) to replace 0 or more characters - // (i.e.: http://*.domain.com). Usage of wildcards implies a small performance penality. - // Only one wildcard can be used per origin. - // Default value is ["*"] - AllowedOrigins []string - // AllowOriginFunc is a custom function to validate the origin. It take the origin - // as argument and returns true if allowed or false otherwise. If this option is - // set, the content of AllowedOrigins is ignored. - AllowOriginFunc func(origin string) bool - // AllowedMethods is a list of methods the client is allowed to use with - // cross-domain requests. Default value is simple methods (GET and POST) - AllowedMethods []string - // AllowedHeaders is list of non simple headers the client is allowed to use with - // cross-domain requests. - // If the special "*" value is present in the list, all headers will be allowed. - // Default value is [] but "Origin" is always appended to the list. - AllowedHeaders []string - // ExposedHeaders indicates which headers are safe to expose to the API of a CORS - // API specification - ExposedHeaders []string - // AllowCredentials indicates whether the request can include user credentials like - // cookies, HTTP authentication or client side SSL certificates. - AllowCredentials bool - // MaxAge indicates how long (in seconds) the results of a preflight request - // can be cached - MaxAge int - // OptionsPassthrough instructs preflight to let other potential next handlers to - // process the OPTIONS method. Turn this on if your application handles OPTIONS. - OptionsPassthrough bool - // Debugging flag adds additional output to debug server side CORS issues - Debug bool -} - -// Cors http handler -type Cors struct { - // Debug logger - Log *log.Logger - // Set to true when allowed origins contains a "*" - allowedOriginsAll bool - // Normalized list of plain allowed origins - allowedOrigins []string - // List of allowed origins containing wildcards - allowedWOrigins []wildcard - // Optional origin validator function - allowOriginFunc func(origin string) bool - // Set to true when allowed headers contains a "*" - allowedHeadersAll bool - // Normalized list of allowed headers - allowedHeaders []string - // Normalized list of allowed methods - allowedMethods []string - // Normalized list of exposed headers - exposedHeaders []string - allowCredentials bool - maxAge int - optionPassthrough bool -} - -// New creates a new Cors handler with the provided options. -func New(options Options) *Cors { - c := &Cors{ - exposedHeaders: convert(options.ExposedHeaders, http.CanonicalHeaderKey), - allowOriginFunc: options.AllowOriginFunc, - allowCredentials: options.AllowCredentials, - maxAge: options.MaxAge, - optionPassthrough: options.OptionsPassthrough, - } - if options.Debug { - c.Log = log.New(os.Stdout, "[cors] ", log.LstdFlags) - } - - // Normalize options - // Note: for origins and methods matching, the spec requires a case-sensitive matching. - // As it may error prone, we chose to ignore the spec here. - - // Allowed Origins - if len(options.AllowedOrigins) == 0 { - // Default is all origins - c.allowedOriginsAll = true - } else { - c.allowedOrigins = []string{} - c.allowedWOrigins = []wildcard{} - for _, origin := range options.AllowedOrigins { - // Normalize - origin = strings.ToLower(origin) - if origin == "*" { - // If "*" is present in the list, turn the whole list into a match all - c.allowedOriginsAll = true - c.allowedOrigins = nil - c.allowedWOrigins = nil - break - } else if i := strings.IndexByte(origin, '*'); i >= 0 { - // Split the origin in two: start and end string without the * - w := wildcard{origin[0:i], origin[i+1 : len(origin)]} - c.allowedWOrigins = append(c.allowedWOrigins, w) - } else { - c.allowedOrigins = append(c.allowedOrigins, origin) - } - } - } - - // Allowed Headers - if len(options.AllowedHeaders) == 0 { - // Use sensible defaults - c.allowedHeaders = []string{"Origin", "Accept", "Content-Type"} - } else { - // Origin is always appended as some browsers will always request for this header at preflight - c.allowedHeaders = convert(append(options.AllowedHeaders, "Origin"), http.CanonicalHeaderKey) - for _, h := range options.AllowedHeaders { - if h == "*" { - c.allowedHeadersAll = true - c.allowedHeaders = nil - break - } - } - } - - // Allowed Methods - if len(options.AllowedMethods) == 0 { - // Default is spec's "simple" methods - c.allowedMethods = []string{"GET", "POST"} - } else { - c.allowedMethods = convert(options.AllowedMethods, strings.ToUpper) - } - - return c -} - -// Default creates a new Cors handler with default options -func Default() *Cors { - return New(Options{}) -} - -// Handler apply the CORS specification on the request, and add relevant CORS headers -// as necessary. -func (c *Cors) Handler(h http.Handler) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Method == "OPTIONS" { - c.logf("Handler: Preflight request") - c.handlePreflight(w, r) - // Preflight requests are standalone and should stop the chain as some other - // middleware may not handle OPTIONS requests correctly. One typical example - // is authentication middleware ; OPTIONS requests won't carry authentication - // headers (see #1) - if c.optionPassthrough { - h.ServeHTTP(w, r) - } else { - w.WriteHeader(http.StatusOK) - } - } else { - c.logf("Handler: Actual request") - c.handleActualRequest(w, r) - h.ServeHTTP(w, r) - } - }) -} - -// HandlerC is net/context aware handler -func (c *Cors) HandlerC(h xhandler.HandlerC) xhandler.HandlerC { - return xhandler.HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { - if r.Method == "OPTIONS" { - c.logf("Handler: Preflight request") - c.handlePreflight(w, r) - // Preflight requests are standalone and should stop the chain as some other - // middleware may not handle OPTIONS requests correctly. One typical example - // is authentication middleware ; OPTIONS requests won't carry authentication - // headers (see #1) - if c.optionPassthrough { - h.ServeHTTPC(ctx, w, r) - } else { - w.WriteHeader(http.StatusOK) - } - } else { - c.logf("Handler: Actual request") - c.handleActualRequest(w, r) - h.ServeHTTPC(ctx, w, r) - } - }) -} - -// HandlerFunc provides Martini compatible handler -func (c *Cors) HandlerFunc(w http.ResponseWriter, r *http.Request) { - if r.Method == "OPTIONS" { - c.logf("HandlerFunc: Preflight request") - c.handlePreflight(w, r) - } else { - c.logf("HandlerFunc: Actual request") - c.handleActualRequest(w, r) - } -} - -// Negroni compatible interface -func (c *Cors) ServeHTTP(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { - if r.Method == "OPTIONS" { - c.logf("ServeHTTP: Preflight request") - c.handlePreflight(w, r) - // Preflight requests are standalone and should stop the chain as some other - // middleware may not handle OPTIONS requests correctly. One typical example - // is authentication middleware ; OPTIONS requests won't carry authentication - // headers (see #1) - if c.optionPassthrough { - next(w, r) - } else { - w.WriteHeader(http.StatusOK) - } - } else { - c.logf("ServeHTTP: Actual request") - c.handleActualRequest(w, r) - next(w, r) - } -} - -// handlePreflight handles pre-flight CORS requests -func (c *Cors) handlePreflight(w http.ResponseWriter, r *http.Request) { - headers := w.Header() - origin := r.Header.Get("Origin") - - if r.Method != "OPTIONS" { - c.logf(" Preflight aborted: %s!=OPTIONS", r.Method) - return - } - // Always set Vary headers - // see https://github.com/rs/cors/issues/10, - // https://github.com/rs/cors/commit/dbdca4d95feaa7511a46e6f1efb3b3aa505bc43f#commitcomment-12352001 - headers.Add("Vary", "Origin") - headers.Add("Vary", "Access-Control-Request-Method") - headers.Add("Vary", "Access-Control-Request-Headers") - - if origin == "" { - c.logf(" Preflight aborted: empty origin") - return - } - if !c.isOriginAllowed(origin) { - c.logf(" Preflight aborted: origin '%s' not allowed", origin) - return - } - - reqMethod := r.Header.Get("Access-Control-Request-Method") - if !c.isMethodAllowed(reqMethod) { - c.logf(" Preflight aborted: method '%s' not allowed", reqMethod) - return - } - reqHeaders := parseHeaderList(r.Header.Get("Access-Control-Request-Headers")) - if !c.areHeadersAllowed(reqHeaders) { - c.logf(" Preflight aborted: headers '%v' not allowed", reqHeaders) - return - } - headers.Set("Access-Control-Allow-Origin", origin) - // Spec says: Since the list of methods can be unbounded, simply returning the method indicated - // by Access-Control-Request-Method (if supported) can be enough - headers.Set("Access-Control-Allow-Methods", strings.ToUpper(reqMethod)) - if len(reqHeaders) > 0 { - - // Spec says: Since the list of headers can be unbounded, simply returning supported headers - // from Access-Control-Request-Headers can be enough - headers.Set("Access-Control-Allow-Headers", strings.Join(reqHeaders, ", ")) - } - if c.allowCredentials { - headers.Set("Access-Control-Allow-Credentials", "true") - } - if c.maxAge > 0 { - headers.Set("Access-Control-Max-Age", strconv.Itoa(c.maxAge)) - } - c.logf(" Preflight response headers: %v", headers) -} - -// handleActualRequest handles simple cross-origin requests, actual request or redirects -func (c *Cors) handleActualRequest(w http.ResponseWriter, r *http.Request) { - headers := w.Header() - origin := r.Header.Get("Origin") - - if r.Method == "OPTIONS" { - c.logf(" Actual request no headers added: method == %s", r.Method) - return - } - // Always set Vary, see https://github.com/rs/cors/issues/10 - headers.Add("Vary", "Origin") - if origin == "" { - c.logf(" Actual request no headers added: missing origin") - return - } - if !c.isOriginAllowed(origin) { - c.logf(" Actual request no headers added: origin '%s' not allowed", origin) - return - } - - // Note that spec does define a way to specifically disallow a simple method like GET or - // POST. Access-Control-Allow-Methods is only used for pre-flight requests and the - // spec doesn't instruct to check the allowed methods for simple cross-origin requests. - // We think it's a nice feature to be able to have control on those methods though. - if !c.isMethodAllowed(r.Method) { - c.logf(" Actual request no headers added: method '%s' not allowed", r.Method) - - return - } - headers.Set("Access-Control-Allow-Origin", origin) - if len(c.exposedHeaders) > 0 { - headers.Set("Access-Control-Expose-Headers", strings.Join(c.exposedHeaders, ", ")) - } - if c.allowCredentials { - headers.Set("Access-Control-Allow-Credentials", "true") - } - c.logf(" Actual response added headers: %v", headers) -} - -// convenience method. checks if debugging is turned on before printing -func (c *Cors) logf(format string, a ...interface{}) { - if c.Log != nil { - c.Log.Printf(format, a...) - } -} - -// isOriginAllowed checks if a given origin is allowed to perform cross-domain requests -// on the endpoint -func (c *Cors) isOriginAllowed(origin string) bool { - if c.allowOriginFunc != nil { - return c.allowOriginFunc(origin) - } - if c.allowedOriginsAll { - return true - } - origin = strings.ToLower(origin) - for _, o := range c.allowedOrigins { - if o == origin { - return true - } - } - for _, w := range c.allowedWOrigins { - if w.match(origin) { - return true - } - } - return false -} - -// isMethodAllowed checks if a given method can be used as part of a cross-domain request -// on the endpoing -func (c *Cors) isMethodAllowed(method string) bool { - if len(c.allowedMethods) == 0 { - // If no method allowed, always return false, even for preflight request - return false - } - method = strings.ToUpper(method) - if method == "OPTIONS" { - // Always allow preflight requests - return true - } - for _, m := range c.allowedMethods { - if m == method { - return true - } - } - return false -} - -// areHeadersAllowed checks if a given list of headers are allowed to used within -// a cross-domain request. -func (c *Cors) areHeadersAllowed(requestedHeaders []string) bool { - if c.allowedHeadersAll || len(requestedHeaders) == 0 { - return true - } - for _, header := range requestedHeaders { - header = http.CanonicalHeaderKey(header) - found := false - for _, h := range c.allowedHeaders { - if h == header { - found = true - } - } - if !found { - return false - } - } - return true -} diff --git a/vendor/github.com/rs/cors/utils.go b/vendor/github.com/rs/cors/utils.go deleted file mode 100644 index c7a0aa060190..000000000000 --- a/vendor/github.com/rs/cors/utils.go +++ /dev/null @@ -1,70 +0,0 @@ -package cors - -import "strings" - -const toLower = 'a' - 'A' - -type converter func(string) string - -type wildcard struct { - prefix string - suffix string -} - -func (w wildcard) match(s string) bool { - return len(s) >= len(w.prefix+w.suffix) && strings.HasPrefix(s, w.prefix) && strings.HasSuffix(s, w.suffix) -} - -// convert converts a list of string using the passed converter function -func convert(s []string, c converter) []string { - out := []string{} - for _, i := range s { - out = append(out, c(i)) - } - return out -} - -// parseHeaderList tokenize + normalize a string containing a list of headers -func parseHeaderList(headerList string) []string { - l := len(headerList) - h := make([]byte, 0, l) - upper := true - // Estimate the number headers in order to allocate the right splice size - t := 0 - for i := 0; i < l; i++ { - if headerList[i] == ',' { - t++ - } - } - headers := make([]string, 0, t) - for i := 0; i < l; i++ { - b := headerList[i] - if b >= 'a' && b <= 'z' { - if upper { - h = append(h, b-toLower) - } else { - h = append(h, b) - } - } else if b >= 'A' && b <= 'Z' { - if !upper { - h = append(h, b+toLower) - } else { - h = append(h, b) - } - } else if b == '-' || b == '_' || (b >= '0' && b <= '9') { - h = append(h, b) - } - - if b == ' ' || b == ',' || i == l-1 { - if len(h) > 0 { - // Flush the found header - headers = append(headers, string(h)) - h = h[:0] - upper = true - } - } else { - upper = b == '-' || b == '_' - } - } - return headers -} diff --git a/vendor/github.com/rs/xhandler/LICENSE b/vendor/github.com/rs/xhandler/LICENSE deleted file mode 100644 index 47c5e9d2d2f7..000000000000 --- a/vendor/github.com/rs/xhandler/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2015 Olivier Poitrey - -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/rs/xhandler/README.md b/vendor/github.com/rs/xhandler/README.md deleted file mode 100644 index 91c594bd25de..000000000000 --- a/vendor/github.com/rs/xhandler/README.md +++ /dev/null @@ -1,134 +0,0 @@ -# XHandler - -[![godoc](http://img.shields.io/badge/godoc-reference-blue.svg?style=flat)](https://godoc.org/github.com/rs/xhandler) [![license](http://img.shields.io/badge/license-MIT-red.svg?style=flat)](https://raw.githubusercontent.com/rs/xhandler/master/LICENSE) [![Build Status](https://travis-ci.org/rs/xhandler.svg?branch=master)](https://travis-ci.org/rs/xhandler) [![Coverage](http://gocover.io/_badge/github.com/rs/xhandler)](http://gocover.io/github.com/rs/xhandler) - -XHandler is a bridge between [net/context](https://godoc.org/golang.org/x/net/context) and `http.Handler`. - -It lets you enforce `net/context` in your handlers without sacrificing compatibility with existing `http.Handlers` nor imposing a specific router. - -Thanks to `net/context` deadline management, `xhandler` is able to enforce a per request deadline and will cancel the context when the client closes the connection unexpectedly. - -You may create your own `net/context` aware handler pretty much the same way as you would do with http.Handler. - -Read more about xhandler on [Dailymotion engineering blog](http://engineering.dailymotion.com/our-way-to-go/). - -## Installing - - go get -u github.com/rs/xhandler - -## Usage - -```go -package main - -import ( - "log" - "net/http" - "time" - - "github.com/rs/cors" - "github.com/rs/xhandler" - "golang.org/x/net/context" -) - -type myMiddleware struct { - next xhandler.HandlerC -} - -func (h myMiddleware) ServeHTTPC(ctx context.Context, w http.ResponseWriter, r *http.Request) { - ctx = context.WithValue(ctx, "test", "World") - h.next.ServeHTTPC(ctx, w, r) -} - -func main() { - c := xhandler.Chain{} - - // Add close notifier handler so context is cancelled when the client closes - // the connection - c.UseC(xhandler.CloseHandler) - - // Add timeout handler - c.UseC(xhandler.TimeoutHandler(2 * time.Second)) - - // Middleware putting something in the context - c.UseC(func(next xhandler.HandlerC) xhandler.HandlerC { - return myMiddleware{next: next} - }) - - // Mix it with a non-context-aware middleware handler - c.Use(cors.Default().Handler) - - // Final handler (using handlerFuncC), reading from the context - xh := xhandler.HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { - value := ctx.Value("test").(string) - w.Write([]byte("Hello " + value)) - }) - - // Bridge context aware handlers with http.Handler using xhandler.Handle() - http.Handle("/test", c.Handler(xh)) - - if err := http.ListenAndServe(":8080", nil); err != nil { - log.Fatal(err) - } -} -``` - -### Using xmux - -Xhandler comes with an optional context aware [muxer](https://github.com/rs/xmux) forked from [httprouter](https://github.com/julienschmidt/httprouter): - -```go -package main - -import ( - "fmt" - "log" - "net/http" - "time" - - "github.com/rs/xhandler" - "github.com/rs/xmux" - "golang.org/x/net/context" -) - -func main() { - c := xhandler.Chain{} - - // Append a context-aware middleware handler - c.UseC(xhandler.CloseHandler) - - // Another context-aware middleware handler - c.UseC(xhandler.TimeoutHandler(2 * time.Second)) - - mux := xmux.New() - - // Use c.Handler to terminate the chain with your final handler - mux.GET("/welcome/:name", xhandler.HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, req *http.Request) { - fmt.Fprintf(w, "Welcome %s!", xmux.Params(ctx).Get("name")) - })) - - if err := http.ListenAndServe(":8080", c.Handler(mux)); err != nil { - log.Fatal(err) - } -} -``` - -See [xmux](https://github.com/rs/xmux) for more examples. - -## Context Aware Middleware - -Here is a list of `net/context` aware middleware handlers implementing `xhandler.HandlerC` interface. - -Feel free to put up a PR linking your middleware if you have built one: - -| Middleware | Author | Description | -| ---------- | ------ | ----------- | -| [xmux](https://github.com/rs/xmux) | [Olivier Poitrey](https://github.com/rs) | HTTP request muxer | -| [xlog](https://github.com/rs/xlog) | [Olivier Poitrey](https://github.com/rs) | HTTP handler logger | -| [xstats](https://github.com/rs/xstats) | [Olivier Poitrey](https://github.com/rs) | A generic client for service instrumentation | -| [xaccess](https://github.com/rs/xaccess) | [Olivier Poitrey](https://github.com/rs) | HTTP handler access logger with [xlog](https://github.com/rs/xlog) and [xstats](https://github.com/rs/xstats) | -| [cors](https://github.com/rs/cors) | [Olivier Poitrey](https://github.com/rs) | [Cross Origin Resource Sharing](http://www.w3.org/TR/cors/) (CORS) support | - -## Licenses - -All source code is licensed under the [MIT License](https://raw.github.com/rs/xhandler/master/LICENSE). diff --git a/vendor/github.com/rs/xhandler/chain.go b/vendor/github.com/rs/xhandler/chain.go deleted file mode 100644 index 3e4bd359c5f9..000000000000 --- a/vendor/github.com/rs/xhandler/chain.go +++ /dev/null @@ -1,121 +0,0 @@ -package xhandler - -import ( - "net/http" - - "golang.org/x/net/context" -) - -// Chain is a helper for chaining middleware handlers together for easier -// management. -type Chain []func(next HandlerC) HandlerC - -// Add appends a variable number of additional middleware handlers -// to the middleware chain. Middleware handlers can either be -// context-aware or non-context aware handlers with the appropriate -// function signatures. -func (c *Chain) Add(f ...interface{}) { - for _, h := range f { - switch v := h.(type) { - case func(http.Handler) http.Handler: - c.Use(v) - case func(HandlerC) HandlerC: - c.UseC(v) - default: - panic("Adding invalid handler to the middleware chain") - } - } -} - -// With creates a new middleware chain from an existing chain, -// extending it with additional middleware. Middleware handlers -// can either be context-aware or non-context aware handlers -// with the appropriate function signatures. -func (c *Chain) With(f ...interface{}) *Chain { - n := make(Chain, len(*c)) - copy(n, *c) - n.Add(f...) - return &n -} - -// UseC appends a context-aware handler to the middleware chain. -func (c *Chain) UseC(f func(next HandlerC) HandlerC) { - *c = append(*c, f) -} - -// Use appends a standard http.Handler to the middleware chain without -// losing track of the context when inserted between two context aware handlers. -// -// Caveat: the f function will be called on each request so you are better off putting -// any initialization sequence outside of this function. -func (c *Chain) Use(f func(next http.Handler) http.Handler) { - xf := func(next HandlerC) HandlerC { - return HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { - n := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - next.ServeHTTPC(ctx, w, r) - }) - f(n).ServeHTTP(w, r) - }) - } - *c = append(*c, xf) -} - -// Handler wraps the provided final handler with all the middleware appended to -// the chain and returns a new standard http.Handler instance. -// The context.Background() context is injected automatically. -func (c Chain) Handler(xh HandlerC) http.Handler { - ctx := context.Background() - return c.HandlerCtx(ctx, xh) -} - -// HandlerFC is a helper to provide a function (HandlerFuncC) to Handler(). -// -// HandlerFC is equivalent to: -// c.Handler(xhandler.HandlerFuncC(xhc)) -func (c Chain) HandlerFC(xhf HandlerFuncC) http.Handler { - ctx := context.Background() - return c.HandlerCtx(ctx, HandlerFuncC(xhf)) -} - -// HandlerH is a helper to provide a standard http handler (http.HandlerFunc) -// to Handler(). Your final handler won't have access to the context though. -func (c Chain) HandlerH(h http.Handler) http.Handler { - ctx := context.Background() - return c.HandlerCtx(ctx, HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { - h.ServeHTTP(w, r) - })) -} - -// HandlerF is a helper to provide a standard http handler function -// (http.HandlerFunc) to Handler(). Your final handler won't have access -// to the context though. -func (c Chain) HandlerF(hf http.HandlerFunc) http.Handler { - ctx := context.Background() - return c.HandlerCtx(ctx, HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { - hf(w, r) - })) -} - -// HandlerCtx wraps the provided final handler with all the middleware appended to -// the chain and returns a new standard http.Handler instance. -func (c Chain) HandlerCtx(ctx context.Context, xh HandlerC) http.Handler { - return New(ctx, c.HandlerC(xh)) -} - -// HandlerC wraps the provided final handler with all the middleware appended to -// the chain and returns a HandlerC instance. -func (c Chain) HandlerC(xh HandlerC) HandlerC { - for i := len(c) - 1; i >= 0; i-- { - xh = c[i](xh) - } - return xh -} - -// HandlerCF wraps the provided final handler func with all the middleware appended to -// the chain and returns a HandlerC instance. -// -// HandlerCF is equivalent to: -// c.HandlerC(xhandler.HandlerFuncC(xhc)) -func (c Chain) HandlerCF(xhc HandlerFuncC) HandlerC { - return c.HandlerC(HandlerFuncC(xhc)) -} diff --git a/vendor/github.com/rs/xhandler/middleware.go b/vendor/github.com/rs/xhandler/middleware.go deleted file mode 100644 index 7ad8fba625a6..000000000000 --- a/vendor/github.com/rs/xhandler/middleware.go +++ /dev/null @@ -1,59 +0,0 @@ -package xhandler - -import ( - "net/http" - "time" - - "golang.org/x/net/context" -) - -// CloseHandler returns a Handler, cancelling the context when the client -// connection closes unexpectedly. -func CloseHandler(next HandlerC) HandlerC { - return HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { - // Cancel the context if the client closes the connection - if wcn, ok := w.(http.CloseNotifier); ok { - var cancel context.CancelFunc - ctx, cancel = context.WithCancel(ctx) - defer cancel() - - notify := wcn.CloseNotify() - go func() { - select { - case <-notify: - cancel() - case <-ctx.Done(): - } - }() - } - - next.ServeHTTPC(ctx, w, r) - }) -} - -// TimeoutHandler returns a Handler which adds a timeout to the context. -// -// Child handlers have the responsability of obeying the context deadline and to return -// an appropriate error (or not) response in case of timeout. -func TimeoutHandler(timeout time.Duration) func(next HandlerC) HandlerC { - return func(next HandlerC) HandlerC { - return HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { - ctx, _ = context.WithTimeout(ctx, timeout) - next.ServeHTTPC(ctx, w, r) - }) - } -} - -// If is a special handler that will skip insert the condNext handler only if a condition -// applies at runtime. -func If(cond func(ctx context.Context, w http.ResponseWriter, r *http.Request) bool, condNext func(next HandlerC) HandlerC) func(next HandlerC) HandlerC { - return func(next HandlerC) HandlerC { - return HandlerFuncC(func(ctx context.Context, w http.ResponseWriter, r *http.Request) { - if cond(ctx, w, r) { - condNext(next).ServeHTTPC(ctx, w, r) - } else { - next.ServeHTTPC(ctx, w, r) - } - }) - } -} diff --git a/vendor/github.com/rs/xhandler/xhandler.go b/vendor/github.com/rs/xhandler/xhandler.go deleted file mode 100644 index bc832cb1fa0c..000000000000 --- a/vendor/github.com/rs/xhandler/xhandler.go +++ /dev/null @@ -1,42 +0,0 @@ -// Package xhandler provides a bridge between http.Handler and net/context. -// -// xhandler enforces net/context in your handlers without sacrificing -// compatibility with existing http.Handlers nor imposing a specific router. -// -// Thanks to net/context deadline management, xhandler is able to enforce -// a per request deadline and will cancel the context in when the client close -// the connection unexpectedly. -// -// You may create net/context aware middlewares pretty much the same way as -// you would with http.Handler. -package xhandler // import "github.com/rs/xhandler" - -import ( - "net/http" - - "golang.org/x/net/context" -) - -// HandlerC is a net/context aware http.Handler -type HandlerC interface { - ServeHTTPC(context.Context, http.ResponseWriter, *http.Request) -} - -// HandlerFuncC type is an adapter to allow the use of ordinary functions -// as an xhandler.Handler. If f is a function with the appropriate signature, -// xhandler.HandlerFuncC(f) is a xhandler.Handler object that calls f. -type HandlerFuncC func(context.Context, http.ResponseWriter, *http.Request) - -// ServeHTTPC calls f(ctx, w, r). -func (f HandlerFuncC) ServeHTTPC(ctx context.Context, w http.ResponseWriter, r *http.Request) { - f(ctx, w, r) -} - -// New creates a conventional http.Handler injecting the provided root -// context to sub handlers. This handler is used as a bridge between conventional -// http.Handler and context aware handlers. -func New(ctx context.Context, h HandlerC) http.Handler { - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - h.ServeHTTPC(ctx, w, r) - }) -} diff --git a/vendor/github.com/stretchr/testify/LICENSE b/vendor/github.com/stretchr/testify/LICENSE deleted file mode 100644 index 473b670a7c61..000000000000 --- a/vendor/github.com/stretchr/testify/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -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 deleted file mode 100644 index 23838c4ceea7..000000000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go +++ /dev/null @@ -1,379 +0,0 @@ -/* -* 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 deleted file mode 100644 index c5cc66f4305f..000000000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go.tmpl +++ /dev/null @@ -1,4 +0,0 @@ -{{.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 deleted file mode 100644 index fcccbd01c8da..000000000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go +++ /dev/null @@ -1,746 +0,0 @@ -/* -* 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 deleted file mode 100644 index 99f9acfbba5f..000000000000 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go.tmpl +++ /dev/null @@ -1,4 +0,0 @@ -{{.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 deleted file mode 100644 index 82590507abfd..000000000000 --- a/vendor/github.com/stretchr/testify/assert/assertions.go +++ /dev/null @@ -1,1208 +0,0 @@ -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 deleted file mode 100644 index c9dccc4d6cd0..000000000000 --- a/vendor/github.com/stretchr/testify/assert/doc.go +++ /dev/null @@ -1,45 +0,0 @@ -// 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 deleted file mode 100644 index ac9dc9d1d615..000000000000 --- a/vendor/github.com/stretchr/testify/assert/errors.go +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 9ad56851d971..000000000000 --- a/vendor/github.com/stretchr/testify/assert/forward_assertions.go +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index ba811c04dd5f..000000000000 --- a/vendor/github.com/stretchr/testify/assert/http_assertions.go +++ /dev/null @@ -1,127 +0,0 @@ -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 deleted file mode 100644 index 169de39221c7..000000000000 --- a/vendor/github.com/stretchr/testify/require/doc.go +++ /dev/null @@ -1,28 +0,0 @@ -// 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 deleted file mode 100644 index ac71d40581b9..000000000000 --- a/vendor/github.com/stretchr/testify/require/forward_requirements.go +++ /dev/null @@ -1,16 +0,0 @@ -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 deleted file mode 100644 index 2fe055784644..000000000000 --- a/vendor/github.com/stretchr/testify/require/require.go +++ /dev/null @@ -1,911 +0,0 @@ -/* -* 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 deleted file mode 100644 index d2c38f6f2864..000000000000 --- a/vendor/github.com/stretchr/testify/require/require.go.tmpl +++ /dev/null @@ -1,6 +0,0 @@ -{{.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 deleted file mode 100644 index c59c3c7b475e..000000000000 --- a/vendor/github.com/stretchr/testify/require/require_forward.go +++ /dev/null @@ -1,747 +0,0 @@ -/* -* 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 deleted file mode 100644 index b93569e0a971..000000000000 --- a/vendor/github.com/stretchr/testify/require/require_forward.go.tmpl +++ /dev/null @@ -1,4 +0,0 @@ -{{.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 deleted file mode 100644 index e404f016d182..000000000000 --- a/vendor/github.com/stretchr/testify/require/requirements.go +++ /dev/null @@ -1,9 +0,0 @@ -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/LICENSE b/vendor/github.com/syndtr/goleveldb/LICENSE deleted file mode 100644 index 4a772d1ab369..000000000000 --- a/vendor/github.com/syndtr/goleveldb/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -Copyright 2012 Suryandaru Triandana -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. - -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/syndtr/goleveldb/README.md b/vendor/github.com/syndtr/goleveldb/README.md deleted file mode 100644 index 41a47614ca5e..000000000000 --- a/vendor/github.com/syndtr/goleveldb/README.md +++ /dev/null @@ -1,107 +0,0 @@ -This is an implementation of the [LevelDB key/value database](http:code.google.com/p/leveldb) in the [Go programming language](http:golang.org). - -[![Build Status](https://travis-ci.org/syndtr/goleveldb.png?branch=master)](https://travis-ci.org/syndtr/goleveldb) - -Installation ------------ - - go get github.com/syndtr/goleveldb/leveldb - -Requirements ------------ - -* Need at least `go1.5` or newer. - -Usage ------------ - -Create or open a database: -```go -// The returned DB instance is safe for concurrent use. Which mean that all -// DB's methods may be called concurrently from multiple goroutine. -db, err := leveldb.OpenFile("path/to/db", nil) -... -defer db.Close() -... -``` -Read or modify the database content: -```go -// Remember that the contents of the returned slice should not be modified. -data, err := db.Get([]byte("key"), nil) -... -err = db.Put([]byte("key"), []byte("value"), nil) -... -err = db.Delete([]byte("key"), nil) -... -``` - -Iterate over database content: -```go -iter := db.NewIterator(nil, nil) -for iter.Next() { - // Remember that the contents of the returned slice should not be modified, and - // only valid until the next call to Next. - key := iter.Key() - value := iter.Value() - ... -} -iter.Release() -err = iter.Error() -... -``` -Seek-then-Iterate: -```go -iter := db.NewIterator(nil, nil) -for ok := iter.Seek(key); ok; ok = iter.Next() { - // Use key/value. - ... -} -iter.Release() -err = iter.Error() -... -``` -Iterate over subset of database content: -```go -iter := db.NewIterator(&util.Range{Start: []byte("foo"), Limit: []byte("xoo")}, nil) -for iter.Next() { - // Use key/value. - ... -} -iter.Release() -err = iter.Error() -... -``` -Iterate over subset of database content with a particular prefix: -```go -iter := db.NewIterator(util.BytesPrefix([]byte("foo-")), nil) -for iter.Next() { - // Use key/value. - ... -} -iter.Release() -err = iter.Error() -... -``` -Batch writes: -```go -batch := new(leveldb.Batch) -batch.Put([]byte("foo"), []byte("value")) -batch.Put([]byte("bar"), []byte("another value")) -batch.Delete([]byte("baz")) -err = db.Write(batch, nil) -... -``` -Use bloom filter: -```go -o := &opt.Options{ - Filter: filter.NewBloomFilter(10), -} -db, err := leveldb.OpenFile("path/to/db", o) -... -defer db.Close() -... -``` -Documentation ------------ - -You can read package documentation [here](http:godoc.org/github.com/syndtr/goleveldb). diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/batch.go b/vendor/github.com/syndtr/goleveldb/leveldb/batch.go deleted file mode 100644 index 225920002df2..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/batch.go +++ /dev/null @@ -1,349 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "encoding/binary" - "fmt" - "io" - - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/memdb" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -// ErrBatchCorrupted records reason of batch corruption. This error will be -// wrapped with errors.ErrCorrupted. -type ErrBatchCorrupted struct { - Reason string -} - -func (e *ErrBatchCorrupted) Error() string { - return fmt.Sprintf("leveldb: batch corrupted: %s", e.Reason) -} - -func newErrBatchCorrupted(reason string) error { - return errors.NewErrCorrupted(storage.FileDesc{}, &ErrBatchCorrupted{reason}) -} - -const ( - batchHeaderLen = 8 + 4 - batchGrowRec = 3000 - batchBufioSize = 16 -) - -// BatchReplay wraps basic batch operations. -type BatchReplay interface { - Put(key, value []byte) - Delete(key []byte) -} - -type batchIndex struct { - keyType keyType - keyPos, keyLen int - valuePos, valueLen int -} - -func (index batchIndex) k(data []byte) []byte { - return data[index.keyPos : index.keyPos+index.keyLen] -} - -func (index batchIndex) v(data []byte) []byte { - if index.valueLen != 0 { - return data[index.valuePos : index.valuePos+index.valueLen] - } - return nil -} - -func (index batchIndex) kv(data []byte) (key, value []byte) { - return index.k(data), index.v(data) -} - -// Batch is a write batch. -type Batch struct { - data []byte - index []batchIndex - - // internalLen is sums of key/value pair length plus 8-bytes internal key. - internalLen int -} - -func (b *Batch) grow(n int) { - o := len(b.data) - if cap(b.data)-o < n { - div := 1 - if len(b.index) > batchGrowRec { - div = len(b.index) / batchGrowRec - } - ndata := make([]byte, o, o+n+o/div) - copy(ndata, b.data) - b.data = ndata - } -} - -func (b *Batch) appendRec(kt keyType, key, value []byte) { - n := 1 + binary.MaxVarintLen32 + len(key) - if kt == keyTypeVal { - n += binary.MaxVarintLen32 + len(value) - } - b.grow(n) - index := batchIndex{keyType: kt} - o := len(b.data) - data := b.data[:o+n] - data[o] = byte(kt) - o++ - o += binary.PutUvarint(data[o:], uint64(len(key))) - index.keyPos = o - index.keyLen = len(key) - o += copy(data[o:], key) - if kt == keyTypeVal { - o += binary.PutUvarint(data[o:], uint64(len(value))) - index.valuePos = o - index.valueLen = len(value) - o += copy(data[o:], value) - } - b.data = data[:o] - b.index = append(b.index, index) - b.internalLen += index.keyLen + index.valueLen + 8 -} - -// Put appends 'put operation' of the given key/value pair to the batch. -// It is safe to modify the contents of the argument after Put returns but not -// before. -func (b *Batch) Put(key, value []byte) { - b.appendRec(keyTypeVal, key, value) -} - -// Delete appends 'delete operation' of the given key to the batch. -// It is safe to modify the contents of the argument after Delete returns but -// not before. -func (b *Batch) Delete(key []byte) { - b.appendRec(keyTypeDel, key, nil) -} - -// Dump dumps batch contents. The returned slice can be loaded into the -// batch using Load method. -// The returned slice is not its own copy, so the contents should not be -// modified. -func (b *Batch) Dump() []byte { - return b.data -} - -// Load loads given slice into the batch. Previous contents of the batch -// will be discarded. -// The given slice will not be copied and will be used as batch buffer, so -// it is not safe to modify the contents of the slice. -func (b *Batch) Load(data []byte) error { - return b.decode(data, -1) -} - -// Replay replays batch contents. -func (b *Batch) Replay(r BatchReplay) error { - for _, index := range b.index { - switch index.keyType { - case keyTypeVal: - r.Put(index.k(b.data), index.v(b.data)) - case keyTypeDel: - r.Delete(index.k(b.data)) - } - } - return nil -} - -// Len returns number of records in the batch. -func (b *Batch) Len() int { - return len(b.index) -} - -// Reset resets the batch. -func (b *Batch) Reset() { - b.data = b.data[:0] - b.index = b.index[:0] - b.internalLen = 0 -} - -func (b *Batch) replayInternal(fn func(i int, kt keyType, k, v []byte) error) error { - for i, index := range b.index { - if err := fn(i, index.keyType, index.k(b.data), index.v(b.data)); err != nil { - return err - } - } - return nil -} - -func (b *Batch) append(p *Batch) { - ob := len(b.data) - oi := len(b.index) - b.data = append(b.data, p.data...) - b.index = append(b.index, p.index...) - b.internalLen += p.internalLen - - // Updating index offset. - if ob != 0 { - for ; oi < len(b.index); oi++ { - index := &b.index[oi] - index.keyPos += ob - if index.valueLen != 0 { - index.valuePos += ob - } - } - } -} - -func (b *Batch) decode(data []byte, expectedLen int) error { - b.data = data - b.index = b.index[:0] - b.internalLen = 0 - err := decodeBatch(data, func(i int, index batchIndex) error { - b.index = append(b.index, index) - b.internalLen += index.keyLen + index.valueLen + 8 - return nil - }) - if err != nil { - return err - } - if expectedLen >= 0 && len(b.index) != expectedLen { - return newErrBatchCorrupted(fmt.Sprintf("invalid records length: %d vs %d", expectedLen, len(b.index))) - } - return nil -} - -func (b *Batch) putMem(seq uint64, mdb *memdb.DB) error { - var ik []byte - for i, index := range b.index { - ik = makeInternalKey(ik, index.k(b.data), seq+uint64(i), index.keyType) - if err := mdb.Put(ik, index.v(b.data)); err != nil { - return err - } - } - return nil -} - -func (b *Batch) revertMem(seq uint64, mdb *memdb.DB) error { - var ik []byte - for i, index := range b.index { - ik = makeInternalKey(ik, index.k(b.data), seq+uint64(i), index.keyType) - if err := mdb.Delete(ik); err != nil { - return err - } - } - return nil -} - -func newBatch() interface{} { - return &Batch{} -} - -func decodeBatch(data []byte, fn func(i int, index batchIndex) error) error { - var index batchIndex - for i, o := 0, 0; o < len(data); i++ { - // Key type. - index.keyType = keyType(data[o]) - if index.keyType > keyTypeVal { - return newErrBatchCorrupted(fmt.Sprintf("bad record: invalid type %#x", uint(index.keyType))) - } - o++ - - // Key. - x, n := binary.Uvarint(data[o:]) - o += n - if n <= 0 || o+int(x) > len(data) { - return newErrBatchCorrupted("bad record: invalid key length") - } - index.keyPos = o - index.keyLen = int(x) - o += index.keyLen - - // Value. - if index.keyType == keyTypeVal { - x, n = binary.Uvarint(data[o:]) - o += n - if n <= 0 || o+int(x) > len(data) { - return newErrBatchCorrupted("bad record: invalid value length") - } - index.valuePos = o - index.valueLen = int(x) - o += index.valueLen - } else { - index.valuePos = 0 - index.valueLen = 0 - } - - if err := fn(i, index); err != nil { - return err - } - } - return nil -} - -func decodeBatchToMem(data []byte, expectSeq uint64, mdb *memdb.DB) (seq uint64, batchLen int, err error) { - seq, batchLen, err = decodeBatchHeader(data) - if err != nil { - return 0, 0, err - } - if seq < expectSeq { - return 0, 0, newErrBatchCorrupted("invalid sequence number") - } - data = data[batchHeaderLen:] - var ik []byte - var decodedLen int - err = decodeBatch(data, func(i int, index batchIndex) error { - if i >= batchLen { - return newErrBatchCorrupted("invalid records length") - } - ik = makeInternalKey(ik, index.k(data), seq+uint64(i), index.keyType) - if err := mdb.Put(ik, index.v(data)); err != nil { - return err - } - decodedLen++ - return nil - }) - if err == nil && decodedLen != batchLen { - err = newErrBatchCorrupted(fmt.Sprintf("invalid records length: %d vs %d", batchLen, decodedLen)) - } - return -} - -func encodeBatchHeader(dst []byte, seq uint64, batchLen int) []byte { - dst = ensureBuffer(dst, batchHeaderLen) - binary.LittleEndian.PutUint64(dst, seq) - binary.LittleEndian.PutUint32(dst[8:], uint32(batchLen)) - return dst -} - -func decodeBatchHeader(data []byte) (seq uint64, batchLen int, err error) { - if len(data) < batchHeaderLen { - return 0, 0, newErrBatchCorrupted("too short") - } - - seq = binary.LittleEndian.Uint64(data) - batchLen = int(binary.LittleEndian.Uint32(data[8:])) - if batchLen < 0 { - return 0, 0, newErrBatchCorrupted("invalid records length") - } - return -} - -func batchesLen(batches []*Batch) int { - batchLen := 0 - for _, batch := range batches { - batchLen += batch.Len() - } - return batchLen -} - -func writeBatchesWithHeader(wr io.Writer, batches []*Batch, seq uint64) error { - if _, err := wr.Write(encodeBatchHeader(nil, seq, batchesLen(batches))); err != nil { - return err - } - for _, batch := range batches { - if _, err := wr.Write(batch.data); err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/cache/cache.go b/vendor/github.com/syndtr/goleveldb/leveldb/cache/cache.go deleted file mode 100644 index c36ad323597e..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/cache/cache.go +++ /dev/null @@ -1,704 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package cache provides interface and implementation of a cache algorithms. -package cache - -import ( - "sync" - "sync/atomic" - "unsafe" - - "github.com/syndtr/goleveldb/leveldb/util" -) - -// Cacher provides interface to implements a caching functionality. -// An implementation must be safe for concurrent use. -type Cacher interface { - // Capacity returns cache capacity. - Capacity() int - - // SetCapacity sets cache capacity. - SetCapacity(capacity int) - - // Promote promotes the 'cache node'. - Promote(n *Node) - - // Ban evicts the 'cache node' and prevent subsequent 'promote'. - Ban(n *Node) - - // Evict evicts the 'cache node'. - Evict(n *Node) - - // EvictNS evicts 'cache node' with the given namespace. - EvictNS(ns uint64) - - // EvictAll evicts all 'cache node'. - EvictAll() - - // Close closes the 'cache tree' - Close() error -} - -// Value is a 'cacheable object'. It may implements util.Releaser, if -// so the the Release method will be called once object is released. -type Value interface{} - -// NamespaceGetter provides convenient wrapper for namespace. -type NamespaceGetter struct { - Cache *Cache - NS uint64 -} - -// Get simply calls Cache.Get() method. -func (g *NamespaceGetter) Get(key uint64, setFunc func() (size int, value Value)) *Handle { - return g.Cache.Get(g.NS, key, setFunc) -} - -// The hash tables implementation is based on: -// "Dynamic-Sized Nonblocking Hash Tables", by Yujie Liu, -// Kunlong Zhang, and Michael Spear. -// ACM Symposium on Principles of Distributed Computing, Jul 2014. - -const ( - mInitialSize = 1 << 4 - mOverflowThreshold = 1 << 5 - mOverflowGrowThreshold = 1 << 7 -) - -type mBucket struct { - mu sync.Mutex - node []*Node - frozen bool -} - -func (b *mBucket) freeze() []*Node { - b.mu.Lock() - defer b.mu.Unlock() - if !b.frozen { - b.frozen = true - } - return b.node -} - -func (b *mBucket) get(r *Cache, h *mNode, hash uint32, ns, key uint64, noset bool) (done, added bool, n *Node) { - b.mu.Lock() - - if b.frozen { - b.mu.Unlock() - return - } - - // Scan the node. - for _, n := range b.node { - if n.hash == hash && n.ns == ns && n.key == key { - atomic.AddInt32(&n.ref, 1) - b.mu.Unlock() - return true, false, n - } - } - - // Get only. - if noset { - b.mu.Unlock() - return true, false, nil - } - - // Create node. - n = &Node{ - r: r, - hash: hash, - ns: ns, - key: key, - ref: 1, - } - // Add node to bucket. - b.node = append(b.node, n) - bLen := len(b.node) - b.mu.Unlock() - - // Update counter. - grow := atomic.AddInt32(&r.nodes, 1) >= h.growThreshold - if bLen > mOverflowThreshold { - grow = grow || atomic.AddInt32(&h.overflow, 1) >= mOverflowGrowThreshold - } - - // Grow. - if grow && atomic.CompareAndSwapInt32(&h.resizeInProgess, 0, 1) { - nhLen := len(h.buckets) << 1 - nh := &mNode{ - buckets: make([]unsafe.Pointer, nhLen), - mask: uint32(nhLen) - 1, - pred: unsafe.Pointer(h), - growThreshold: int32(nhLen * mOverflowThreshold), - shrinkThreshold: int32(nhLen >> 1), - } - ok := atomic.CompareAndSwapPointer(&r.mHead, unsafe.Pointer(h), unsafe.Pointer(nh)) - if !ok { - panic("BUG: failed swapping head") - } - go nh.initBuckets() - } - - return true, true, n -} - -func (b *mBucket) delete(r *Cache, h *mNode, hash uint32, ns, key uint64) (done, deleted bool) { - b.mu.Lock() - - if b.frozen { - b.mu.Unlock() - return - } - - // Scan the node. - var ( - n *Node - bLen int - ) - for i := range b.node { - n = b.node[i] - if n.ns == ns && n.key == key { - if atomic.LoadInt32(&n.ref) == 0 { - deleted = true - - // Call releaser. - if n.value != nil { - if r, ok := n.value.(util.Releaser); ok { - r.Release() - } - n.value = nil - } - - // Remove node from bucket. - b.node = append(b.node[:i], b.node[i+1:]...) - bLen = len(b.node) - } - break - } - } - b.mu.Unlock() - - if deleted { - // Call OnDel. - for _, f := range n.onDel { - f() - } - - // Update counter. - atomic.AddInt32(&r.size, int32(n.size)*-1) - shrink := atomic.AddInt32(&r.nodes, -1) < h.shrinkThreshold - if bLen >= mOverflowThreshold { - atomic.AddInt32(&h.overflow, -1) - } - - // Shrink. - if shrink && len(h.buckets) > mInitialSize && atomic.CompareAndSwapInt32(&h.resizeInProgess, 0, 1) { - nhLen := len(h.buckets) >> 1 - nh := &mNode{ - buckets: make([]unsafe.Pointer, nhLen), - mask: uint32(nhLen) - 1, - pred: unsafe.Pointer(h), - growThreshold: int32(nhLen * mOverflowThreshold), - shrinkThreshold: int32(nhLen >> 1), - } - ok := atomic.CompareAndSwapPointer(&r.mHead, unsafe.Pointer(h), unsafe.Pointer(nh)) - if !ok { - panic("BUG: failed swapping head") - } - go nh.initBuckets() - } - } - - return true, deleted -} - -type mNode struct { - buckets []unsafe.Pointer // []*mBucket - mask uint32 - pred unsafe.Pointer // *mNode - resizeInProgess int32 - - overflow int32 - growThreshold int32 - shrinkThreshold int32 -} - -func (n *mNode) initBucket(i uint32) *mBucket { - if b := (*mBucket)(atomic.LoadPointer(&n.buckets[i])); b != nil { - return b - } - - p := (*mNode)(atomic.LoadPointer(&n.pred)) - if p != nil { - var node []*Node - if n.mask > p.mask { - // Grow. - pb := (*mBucket)(atomic.LoadPointer(&p.buckets[i&p.mask])) - if pb == nil { - pb = p.initBucket(i & p.mask) - } - m := pb.freeze() - // Split nodes. - for _, x := range m { - if x.hash&n.mask == i { - node = append(node, x) - } - } - } else { - // Shrink. - pb0 := (*mBucket)(atomic.LoadPointer(&p.buckets[i])) - if pb0 == nil { - pb0 = p.initBucket(i) - } - pb1 := (*mBucket)(atomic.LoadPointer(&p.buckets[i+uint32(len(n.buckets))])) - if pb1 == nil { - pb1 = p.initBucket(i + uint32(len(n.buckets))) - } - m0 := pb0.freeze() - m1 := pb1.freeze() - // Merge nodes. - node = make([]*Node, 0, len(m0)+len(m1)) - node = append(node, m0...) - node = append(node, m1...) - } - b := &mBucket{node: node} - if atomic.CompareAndSwapPointer(&n.buckets[i], nil, unsafe.Pointer(b)) { - if len(node) > mOverflowThreshold { - atomic.AddInt32(&n.overflow, int32(len(node)-mOverflowThreshold)) - } - return b - } - } - - return (*mBucket)(atomic.LoadPointer(&n.buckets[i])) -} - -func (n *mNode) initBuckets() { - for i := range n.buckets { - n.initBucket(uint32(i)) - } - atomic.StorePointer(&n.pred, nil) -} - -// Cache is a 'cache map'. -type Cache struct { - mu sync.RWMutex - mHead unsafe.Pointer // *mNode - nodes int32 - size int32 - cacher Cacher - closed bool -} - -// NewCache creates a new 'cache map'. The cacher is optional and -// may be nil. -func NewCache(cacher Cacher) *Cache { - h := &mNode{ - buckets: make([]unsafe.Pointer, mInitialSize), - mask: mInitialSize - 1, - growThreshold: int32(mInitialSize * mOverflowThreshold), - shrinkThreshold: 0, - } - for i := range h.buckets { - h.buckets[i] = unsafe.Pointer(&mBucket{}) - } - r := &Cache{ - mHead: unsafe.Pointer(h), - cacher: cacher, - } - return r -} - -func (r *Cache) getBucket(hash uint32) (*mNode, *mBucket) { - h := (*mNode)(atomic.LoadPointer(&r.mHead)) - i := hash & h.mask - b := (*mBucket)(atomic.LoadPointer(&h.buckets[i])) - if b == nil { - b = h.initBucket(i) - } - return h, b -} - -func (r *Cache) delete(n *Node) bool { - for { - h, b := r.getBucket(n.hash) - done, deleted := b.delete(r, h, n.hash, n.ns, n.key) - if done { - return deleted - } - } -} - -// Nodes returns number of 'cache node' in the map. -func (r *Cache) Nodes() int { - return int(atomic.LoadInt32(&r.nodes)) -} - -// Size returns sums of 'cache node' size in the map. -func (r *Cache) Size() int { - return int(atomic.LoadInt32(&r.size)) -} - -// Capacity returns cache capacity. -func (r *Cache) Capacity() int { - if r.cacher == nil { - return 0 - } - return r.cacher.Capacity() -} - -// SetCapacity sets cache capacity. -func (r *Cache) SetCapacity(capacity int) { - if r.cacher != nil { - r.cacher.SetCapacity(capacity) - } -} - -// Get gets 'cache node' with the given namespace and key. -// If cache node is not found and setFunc is not nil, Get will atomically creates -// the 'cache node' by calling setFunc. Otherwise Get will returns nil. -// -// The returned 'cache handle' should be released after use by calling Release -// method. -func (r *Cache) Get(ns, key uint64, setFunc func() (size int, value Value)) *Handle { - r.mu.RLock() - defer r.mu.RUnlock() - if r.closed { - return nil - } - - hash := murmur32(ns, key, 0xf00) - for { - h, b := r.getBucket(hash) - done, _, n := b.get(r, h, hash, ns, key, setFunc == nil) - if done { - if n != nil { - n.mu.Lock() - if n.value == nil { - if setFunc == nil { - n.mu.Unlock() - n.unref() - return nil - } - - n.size, n.value = setFunc() - if n.value == nil { - n.size = 0 - n.mu.Unlock() - n.unref() - return nil - } - atomic.AddInt32(&r.size, int32(n.size)) - } - n.mu.Unlock() - if r.cacher != nil { - r.cacher.Promote(n) - } - return &Handle{unsafe.Pointer(n)} - } - - break - } - } - return nil -} - -// Delete removes and ban 'cache node' with the given namespace and key. -// A banned 'cache node' will never inserted into the 'cache tree'. Ban -// only attributed to the particular 'cache node', so when a 'cache node' -// is recreated it will not be banned. -// -// If onDel is not nil, then it will be executed if such 'cache node' -// doesn't exist or once the 'cache node' is released. -// -// Delete return true is such 'cache node' exist. -func (r *Cache) Delete(ns, key uint64, onDel func()) bool { - r.mu.RLock() - defer r.mu.RUnlock() - if r.closed { - return false - } - - hash := murmur32(ns, key, 0xf00) - for { - h, b := r.getBucket(hash) - done, _, n := b.get(r, h, hash, ns, key, true) - if done { - if n != nil { - if onDel != nil { - n.mu.Lock() - n.onDel = append(n.onDel, onDel) - n.mu.Unlock() - } - if r.cacher != nil { - r.cacher.Ban(n) - } - n.unref() - return true - } - - break - } - } - - if onDel != nil { - onDel() - } - - return false -} - -// Evict evicts 'cache node' with the given namespace and key. This will -// simply call Cacher.Evict. -// -// Evict return true is such 'cache node' exist. -func (r *Cache) Evict(ns, key uint64) bool { - r.mu.RLock() - defer r.mu.RUnlock() - if r.closed { - return false - } - - hash := murmur32(ns, key, 0xf00) - for { - h, b := r.getBucket(hash) - done, _, n := b.get(r, h, hash, ns, key, true) - if done { - if n != nil { - if r.cacher != nil { - r.cacher.Evict(n) - } - n.unref() - return true - } - - break - } - } - - return false -} - -// EvictNS evicts 'cache node' with the given namespace. This will -// simply call Cacher.EvictNS. -func (r *Cache) EvictNS(ns uint64) { - r.mu.RLock() - defer r.mu.RUnlock() - if r.closed { - return - } - - if r.cacher != nil { - r.cacher.EvictNS(ns) - } -} - -// EvictAll evicts all 'cache node'. This will simply call Cacher.EvictAll. -func (r *Cache) EvictAll() { - r.mu.RLock() - defer r.mu.RUnlock() - if r.closed { - return - } - - if r.cacher != nil { - r.cacher.EvictAll() - } -} - -// Close closes the 'cache map' and forcefully releases all 'cache node'. -func (r *Cache) Close() error { - r.mu.Lock() - if !r.closed { - r.closed = true - - h := (*mNode)(r.mHead) - h.initBuckets() - - for i := range h.buckets { - b := (*mBucket)(h.buckets[i]) - for _, n := range b.node { - // Call releaser. - if n.value != nil { - if r, ok := n.value.(util.Releaser); ok { - r.Release() - } - n.value = nil - } - - // Call OnDel. - for _, f := range n.onDel { - f() - } - n.onDel = nil - } - } - } - r.mu.Unlock() - - // Avoid deadlock. - if r.cacher != nil { - if err := r.cacher.Close(); err != nil { - return err - } - } - return nil -} - -// CloseWeak closes the 'cache map' and evict all 'cache node' from cacher, but -// unlike Close it doesn't forcefully releases 'cache node'. -func (r *Cache) CloseWeak() error { - r.mu.Lock() - if !r.closed { - r.closed = true - } - r.mu.Unlock() - - // Avoid deadlock. - if r.cacher != nil { - r.cacher.EvictAll() - if err := r.cacher.Close(); err != nil { - return err - } - } - return nil -} - -// Node is a 'cache node'. -type Node struct { - r *Cache - - hash uint32 - ns, key uint64 - - mu sync.Mutex - size int - value Value - - ref int32 - onDel []func() - - CacheData unsafe.Pointer -} - -// NS returns this 'cache node' namespace. -func (n *Node) NS() uint64 { - return n.ns -} - -// Key returns this 'cache node' key. -func (n *Node) Key() uint64 { - return n.key -} - -// Size returns this 'cache node' size. -func (n *Node) Size() int { - return n.size -} - -// Value returns this 'cache node' value. -func (n *Node) Value() Value { - return n.value -} - -// Ref returns this 'cache node' ref counter. -func (n *Node) Ref() int32 { - return atomic.LoadInt32(&n.ref) -} - -// GetHandle returns an handle for this 'cache node'. -func (n *Node) GetHandle() *Handle { - if atomic.AddInt32(&n.ref, 1) <= 1 { - panic("BUG: Node.GetHandle on zero ref") - } - return &Handle{unsafe.Pointer(n)} -} - -func (n *Node) unref() { - if atomic.AddInt32(&n.ref, -1) == 0 { - n.r.delete(n) - } -} - -func (n *Node) unrefLocked() { - if atomic.AddInt32(&n.ref, -1) == 0 { - n.r.mu.RLock() - if !n.r.closed { - n.r.delete(n) - } - n.r.mu.RUnlock() - } -} - -// Handle is a 'cache handle' of a 'cache node'. -type Handle struct { - n unsafe.Pointer // *Node -} - -// Value returns the value of the 'cache node'. -func (h *Handle) Value() Value { - n := (*Node)(atomic.LoadPointer(&h.n)) - if n != nil { - return n.value - } - return nil -} - -// Release releases this 'cache handle'. -// It is safe to call release multiple times. -func (h *Handle) Release() { - nPtr := atomic.LoadPointer(&h.n) - if nPtr != nil && atomic.CompareAndSwapPointer(&h.n, nPtr, nil) { - n := (*Node)(nPtr) - n.unrefLocked() - } -} - -func murmur32(ns, key uint64, seed uint32) uint32 { - const ( - m = uint32(0x5bd1e995) - r = 24 - ) - - k1 := uint32(ns >> 32) - k2 := uint32(ns) - k3 := uint32(key >> 32) - k4 := uint32(key) - - k1 *= m - k1 ^= k1 >> r - k1 *= m - - k2 *= m - k2 ^= k2 >> r - k2 *= m - - k3 *= m - k3 ^= k3 >> r - k3 *= m - - k4 *= m - k4 ^= k4 >> r - k4 *= m - - h := seed - - h *= m - h ^= k1 - h *= m - h ^= k2 - h *= m - h ^= k3 - h *= m - h ^= k4 - - h ^= h >> 13 - h *= m - h ^= h >> 15 - - return h -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/cache/lru.go b/vendor/github.com/syndtr/goleveldb/leveldb/cache/lru.go deleted file mode 100644 index d9a84cde15e8..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/cache/lru.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package cache - -import ( - "sync" - "unsafe" -) - -type lruNode struct { - n *Node - h *Handle - ban bool - - next, prev *lruNode -} - -func (n *lruNode) insert(at *lruNode) { - x := at.next - at.next = n - n.prev = at - n.next = x - x.prev = n -} - -func (n *lruNode) remove() { - if n.prev != nil { - n.prev.next = n.next - n.next.prev = n.prev - n.prev = nil - n.next = nil - } else { - panic("BUG: removing removed node") - } -} - -type lru struct { - mu sync.Mutex - capacity int - used int - recent lruNode -} - -func (r *lru) reset() { - r.recent.next = &r.recent - r.recent.prev = &r.recent - r.used = 0 -} - -func (r *lru) Capacity() int { - r.mu.Lock() - defer r.mu.Unlock() - return r.capacity -} - -func (r *lru) SetCapacity(capacity int) { - var evicted []*lruNode - - r.mu.Lock() - r.capacity = capacity - for r.used > r.capacity { - rn := r.recent.prev - if rn == nil { - panic("BUG: invalid LRU used or capacity counter") - } - rn.remove() - rn.n.CacheData = nil - r.used -= rn.n.Size() - evicted = append(evicted, rn) - } - r.mu.Unlock() - - for _, rn := range evicted { - rn.h.Release() - } -} - -func (r *lru) Promote(n *Node) { - var evicted []*lruNode - - r.mu.Lock() - if n.CacheData == nil { - if n.Size() <= r.capacity { - rn := &lruNode{n: n, h: n.GetHandle()} - rn.insert(&r.recent) - n.CacheData = unsafe.Pointer(rn) - r.used += n.Size() - - for r.used > r.capacity { - rn := r.recent.prev - if rn == nil { - panic("BUG: invalid LRU used or capacity counter") - } - rn.remove() - rn.n.CacheData = nil - r.used -= rn.n.Size() - evicted = append(evicted, rn) - } - } - } else { - rn := (*lruNode)(n.CacheData) - if !rn.ban { - rn.remove() - rn.insert(&r.recent) - } - } - r.mu.Unlock() - - for _, rn := range evicted { - rn.h.Release() - } -} - -func (r *lru) Ban(n *Node) { - r.mu.Lock() - if n.CacheData == nil { - n.CacheData = unsafe.Pointer(&lruNode{n: n, ban: true}) - } else { - rn := (*lruNode)(n.CacheData) - if !rn.ban { - rn.remove() - rn.ban = true - r.used -= rn.n.Size() - r.mu.Unlock() - - rn.h.Release() - rn.h = nil - return - } - } - r.mu.Unlock() -} - -func (r *lru) Evict(n *Node) { - r.mu.Lock() - rn := (*lruNode)(n.CacheData) - if rn == nil || rn.ban { - r.mu.Unlock() - return - } - n.CacheData = nil - r.mu.Unlock() - - rn.h.Release() -} - -func (r *lru) EvictNS(ns uint64) { - var evicted []*lruNode - - r.mu.Lock() - for e := r.recent.prev; e != &r.recent; { - rn := e - e = e.prev - if rn.n.NS() == ns { - rn.remove() - rn.n.CacheData = nil - r.used -= rn.n.Size() - evicted = append(evicted, rn) - } - } - r.mu.Unlock() - - for _, rn := range evicted { - rn.h.Release() - } -} - -func (r *lru) EvictAll() { - r.mu.Lock() - back := r.recent.prev - for rn := back; rn != &r.recent; rn = rn.prev { - rn.n.CacheData = nil - } - r.reset() - r.mu.Unlock() - - for rn := back; rn != &r.recent; rn = rn.prev { - rn.h.Release() - } -} - -func (r *lru) Close() error { - return nil -} - -// NewLRU create a new LRU-cache. -func NewLRU(capacity int) Cacher { - r := &lru{capacity: capacity} - r.reset() - return r -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/comparer.go b/vendor/github.com/syndtr/goleveldb/leveldb/comparer.go deleted file mode 100644 index 448402b82698..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/comparer.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "github.com/syndtr/goleveldb/leveldb/comparer" -) - -type iComparer struct { - ucmp comparer.Comparer -} - -func (icmp *iComparer) uName() string { - return icmp.ucmp.Name() -} - -func (icmp *iComparer) uCompare(a, b []byte) int { - return icmp.ucmp.Compare(a, b) -} - -func (icmp *iComparer) uSeparator(dst, a, b []byte) []byte { - return icmp.ucmp.Separator(dst, a, b) -} - -func (icmp *iComparer) uSuccessor(dst, b []byte) []byte { - return icmp.ucmp.Successor(dst, b) -} - -func (icmp *iComparer) Name() string { - return icmp.uName() -} - -func (icmp *iComparer) Compare(a, b []byte) int { - x := icmp.uCompare(internalKey(a).ukey(), internalKey(b).ukey()) - if x == 0 { - if m, n := internalKey(a).num(), internalKey(b).num(); m > n { - return -1 - } else if m < n { - return 1 - } - } - return x -} - -func (icmp *iComparer) Separator(dst, a, b []byte) []byte { - ua, ub := internalKey(a).ukey(), internalKey(b).ukey() - dst = icmp.uSeparator(dst, ua, ub) - if dst != nil && len(dst) < len(ua) && icmp.uCompare(ua, dst) < 0 { - // Append earliest possible number. - return append(dst, keyMaxNumBytes...) - } - return nil -} - -func (icmp *iComparer) Successor(dst, b []byte) []byte { - ub := internalKey(b).ukey() - dst = icmp.uSuccessor(dst, ub) - if dst != nil && len(dst) < len(ub) && icmp.uCompare(ub, dst) < 0 { - // Append earliest possible number. - return append(dst, keyMaxNumBytes...) - } - return nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/comparer/bytes_comparer.go b/vendor/github.com/syndtr/goleveldb/leveldb/comparer/bytes_comparer.go deleted file mode 100644 index abf9fb65c7a6..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/comparer/bytes_comparer.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package comparer - -import "bytes" - -type bytesComparer struct{} - -func (bytesComparer) Compare(a, b []byte) int { - return bytes.Compare(a, b) -} - -func (bytesComparer) Name() string { - return "leveldb.BytewiseComparator" -} - -func (bytesComparer) Separator(dst, a, b []byte) []byte { - i, n := 0, len(a) - if n > len(b) { - n = len(b) - } - for ; i < n && a[i] == b[i]; i++ { - } - if i >= n { - // Do not shorten if one string is a prefix of the other - } else if c := a[i]; c < 0xff && c+1 < b[i] { - dst = append(dst, a[:i+1]...) - dst[len(dst)-1]++ - return dst - } - return nil -} - -func (bytesComparer) Successor(dst, b []byte) []byte { - for i, c := range b { - if c != 0xff { - dst = append(dst, b[:i+1]...) - dst[len(dst)-1]++ - return dst - } - } - return nil -} - -// DefaultComparer are default implementation of the Comparer interface. -// It uses the natural ordering, consistent with bytes.Compare. -var DefaultComparer = bytesComparer{} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/comparer/comparer.go b/vendor/github.com/syndtr/goleveldb/leveldb/comparer/comparer.go deleted file mode 100644 index 2c522db23b90..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/comparer/comparer.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package comparer provides interface and implementation for ordering -// sets of data. -package comparer - -// BasicComparer is the interface that wraps the basic Compare method. -type BasicComparer interface { - // Compare returns -1, 0, or +1 depending on whether a is 'less than', - // 'equal to' or 'greater than' b. The two arguments can only be 'equal' - // if their contents are exactly equal. Furthermore, the empty slice - // must be 'less than' any non-empty slice. - Compare(a, b []byte) int -} - -// Comparer defines a total ordering over the space of []byte keys: a 'less -// than' relationship. -type Comparer interface { - BasicComparer - - // Name returns name of the comparer. - // - // The Level-DB on-disk format stores the comparer name, and opening a - // database with a different comparer from the one it was created with - // will result in an error. - // - // An implementation to a new name whenever the comparer implementation - // changes in a way that will cause the relative ordering of any two keys - // to change. - // - // Names starting with "leveldb." are reserved and should not be used - // by any users of this package. - Name() string - - // Bellow are advanced functions used to reduce the space requirements - // for internal data structures such as index blocks. - - // Separator appends a sequence of bytes x to dst such that a <= x && x < b, - // where 'less than' is consistent with Compare. An implementation should - // return nil if x equal to a. - // - // Either contents of a or b should not by any means modified. Doing so - // may cause corruption on the internal state. - Separator(dst, a, b []byte) []byte - - // Successor appends a sequence of bytes x to dst such that x >= b, where - // 'less than' is consistent with Compare. An implementation should return - // nil if x equal to b. - // - // Contents of b should not by any means modified. Doing so may cause - // corruption on the internal state. - Successor(dst, b []byte) []byte -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db.go b/vendor/github.com/syndtr/goleveldb/leveldb/db.go deleted file mode 100644 index b27c38d37e67..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db.go +++ /dev/null @@ -1,1175 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "container/list" - "fmt" - "io" - "os" - "runtime" - "strings" - "sync" - "sync/atomic" - "time" - - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/journal" - "github.com/syndtr/goleveldb/leveldb/memdb" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/storage" - "github.com/syndtr/goleveldb/leveldb/table" - "github.com/syndtr/goleveldb/leveldb/util" -) - -// DB is a LevelDB database. -type DB struct { - // Need 64-bit alignment. - seq uint64 - - // Stats. Need 64-bit alignment. - cWriteDelay int64 // The cumulative duration of write delays - cWriteDelayN int32 // The cumulative number of write delays - inWritePaused int32 // The indicator whether write operation is paused by compaction - aliveSnaps, aliveIters int32 - - // Session. - s *session - - // MemDB. - memMu sync.RWMutex - memPool chan *memdb.DB - mem, frozenMem *memDB - journal *journal.Writer - journalWriter storage.Writer - journalFd storage.FileDesc - frozenJournalFd storage.FileDesc - frozenSeq uint64 - - // Snapshot. - snapsMu sync.Mutex - snapsList *list.List - - // Write. - batchPool sync.Pool - writeMergeC chan writeMerge - writeMergedC chan bool - writeLockC chan struct{} - writeAckC chan error - writeDelay time.Duration - writeDelayN int - tr *Transaction - - // Compaction. - compCommitLk sync.Mutex - tcompCmdC chan cCmd - tcompPauseC chan chan<- struct{} - mcompCmdC chan cCmd - compErrC chan error - compPerErrC chan error - compErrSetC chan error - compWriteLocking bool - compStats cStats - memdbMaxLevel int // For testing. - - // Close. - closeW sync.WaitGroup - closeC chan struct{} - closed uint32 - closer io.Closer -} - -func openDB(s *session) (*DB, error) { - s.log("db@open opening") - start := time.Now() - db := &DB{ - s: s, - // Initial sequence - seq: s.stSeqNum, - // MemDB - memPool: make(chan *memdb.DB, 1), - // Snapshot - snapsList: list.New(), - // Write - batchPool: sync.Pool{New: newBatch}, - writeMergeC: make(chan writeMerge), - writeMergedC: make(chan bool), - writeLockC: make(chan struct{}, 1), - writeAckC: make(chan error), - // Compaction - tcompCmdC: make(chan cCmd), - tcompPauseC: make(chan chan<- struct{}), - mcompCmdC: make(chan cCmd), - compErrC: make(chan error), - compPerErrC: make(chan error), - compErrSetC: make(chan error), - // Close - closeC: make(chan struct{}), - } - - // Read-only mode. - readOnly := s.o.GetReadOnly() - - if readOnly { - // Recover journals (read-only mode). - if err := db.recoverJournalRO(); err != nil { - return nil, err - } - } else { - // Recover journals. - if err := db.recoverJournal(); err != nil { - return nil, err - } - - // Remove any obsolete files. - if err := db.checkAndCleanFiles(); err != nil { - // Close journal. - if db.journal != nil { - db.journal.Close() - db.journalWriter.Close() - } - return nil, err - } - - } - - // Doesn't need to be included in the wait group. - go db.compactionError() - go db.mpoolDrain() - - if readOnly { - db.SetReadOnly() - } else { - db.closeW.Add(2) - go db.tCompaction() - go db.mCompaction() - // go db.jWriter() - } - - s.logf("db@open done T·%v", time.Since(start)) - - runtime.SetFinalizer(db, (*DB).Close) - return db, nil -} - -// Open opens or creates a DB for the given storage. -// The DB will be created if not exist, unless ErrorIfMissing is true. -// Also, if ErrorIfExist is true and the DB exist Open will returns -// os.ErrExist error. -// -// Open will return an error with type of ErrCorrupted if corruption -// detected in the DB. Use errors.IsCorrupted to test whether an error is -// due to corruption. Corrupted DB can be recovered with Recover function. -// -// The returned DB instance is safe for concurrent use. -// The DB must be closed after use, by calling Close method. -func Open(stor storage.Storage, o *opt.Options) (db *DB, err error) { - s, err := newSession(stor, o) - if err != nil { - return - } - defer func() { - if err != nil { - s.close() - s.release() - } - }() - - err = s.recover() - if err != nil { - if !os.IsNotExist(err) || s.o.GetErrorIfMissing() || s.o.GetReadOnly() { - return - } - err = s.create() - if err != nil { - return - } - } else if s.o.GetErrorIfExist() { - err = os.ErrExist - return - } - - return openDB(s) -} - -// OpenFile opens or creates a DB for the given path. -// The DB will be created if not exist, unless ErrorIfMissing is true. -// Also, if ErrorIfExist is true and the DB exist OpenFile will returns -// os.ErrExist error. -// -// OpenFile uses standard file-system backed storage implementation as -// described in the leveldb/storage package. -// -// OpenFile will return an error with type of ErrCorrupted if corruption -// detected in the DB. Use errors.IsCorrupted to test whether an error is -// due to corruption. Corrupted DB can be recovered with Recover function. -// -// The returned DB instance is safe for concurrent use. -// The DB must be closed after use, by calling Close method. -func OpenFile(path string, o *opt.Options) (db *DB, err error) { - stor, err := storage.OpenFile(path, o.GetReadOnly()) - if err != nil { - return - } - db, err = Open(stor, o) - if err != nil { - stor.Close() - } else { - db.closer = stor - } - return -} - -// Recover recovers and opens a DB with missing or corrupted manifest files -// for the given storage. It will ignore any manifest files, valid or not. -// The DB must already exist or it will returns an error. -// Also, Recover will ignore ErrorIfMissing and ErrorIfExist options. -// -// The returned DB instance is safe for concurrent use. -// The DB must be closed after use, by calling Close method. -func Recover(stor storage.Storage, o *opt.Options) (db *DB, err error) { - s, err := newSession(stor, o) - if err != nil { - return - } - defer func() { - if err != nil { - s.close() - s.release() - } - }() - - err = recoverTable(s, o) - if err != nil { - return - } - return openDB(s) -} - -// RecoverFile recovers and opens a DB with missing or corrupted manifest files -// for the given path. It will ignore any manifest files, valid or not. -// The DB must already exist or it will returns an error. -// Also, Recover will ignore ErrorIfMissing and ErrorIfExist options. -// -// RecoverFile uses standard file-system backed storage implementation as described -// in the leveldb/storage package. -// -// The returned DB instance is safe for concurrent use. -// The DB must be closed after use, by calling Close method. -func RecoverFile(path string, o *opt.Options) (db *DB, err error) { - stor, err := storage.OpenFile(path, false) - if err != nil { - return - } - db, err = Recover(stor, o) - if err != nil { - stor.Close() - } else { - db.closer = stor - } - return -} - -func recoverTable(s *session, o *opt.Options) error { - o = dupOptions(o) - // Mask StrictReader, lets StrictRecovery doing its job. - o.Strict &= ^opt.StrictReader - - // Get all tables and sort it by file number. - fds, err := s.stor.List(storage.TypeTable) - if err != nil { - return err - } - sortFds(fds) - - var ( - maxSeq uint64 - recoveredKey, goodKey, corruptedKey, corruptedBlock, droppedTable int - - // We will drop corrupted table. - strict = o.GetStrict(opt.StrictRecovery) - noSync = o.GetNoSync() - - rec = &sessionRecord{} - bpool = util.NewBufferPool(o.GetBlockSize() + 5) - ) - buildTable := func(iter iterator.Iterator) (tmpFd storage.FileDesc, size int64, err error) { - tmpFd = s.newTemp() - writer, err := s.stor.Create(tmpFd) - if err != nil { - return - } - defer func() { - writer.Close() - if err != nil { - s.stor.Remove(tmpFd) - tmpFd = storage.FileDesc{} - } - }() - - // Copy entries. - tw := table.NewWriter(writer, o) - for iter.Next() { - key := iter.Key() - if validInternalKey(key) { - err = tw.Append(key, iter.Value()) - if err != nil { - return - } - } - } - err = iter.Error() - if err != nil && !errors.IsCorrupted(err) { - return - } - err = tw.Close() - if err != nil { - return - } - if !noSync { - err = writer.Sync() - if err != nil { - return - } - } - size = int64(tw.BytesLen()) - return - } - recoverTable := func(fd storage.FileDesc) error { - s.logf("table@recovery recovering @%d", fd.Num) - reader, err := s.stor.Open(fd) - if err != nil { - return err - } - var closed bool - defer func() { - if !closed { - reader.Close() - } - }() - - // Get file size. - size, err := reader.Seek(0, 2) - if err != nil { - return err - } - - var ( - tSeq uint64 - tgoodKey, tcorruptedKey, tcorruptedBlock int - imin, imax []byte - ) - tr, err := table.NewReader(reader, size, fd, nil, bpool, o) - if err != nil { - return err - } - iter := tr.NewIterator(nil, nil) - if itererr, ok := iter.(iterator.ErrorCallbackSetter); ok { - itererr.SetErrorCallback(func(err error) { - if errors.IsCorrupted(err) { - s.logf("table@recovery block corruption @%d %q", fd.Num, err) - tcorruptedBlock++ - } - }) - } - - // Scan the table. - for iter.Next() { - key := iter.Key() - _, seq, _, kerr := parseInternalKey(key) - if kerr != nil { - tcorruptedKey++ - continue - } - tgoodKey++ - if seq > tSeq { - tSeq = seq - } - if imin == nil { - imin = append([]byte{}, key...) - } - imax = append(imax[:0], key...) - } - if err := iter.Error(); err != nil && !errors.IsCorrupted(err) { - iter.Release() - return err - } - iter.Release() - - goodKey += tgoodKey - corruptedKey += tcorruptedKey - corruptedBlock += tcorruptedBlock - - if strict && (tcorruptedKey > 0 || tcorruptedBlock > 0) { - droppedTable++ - s.logf("table@recovery dropped @%d Gk·%d Ck·%d Cb·%d S·%d Q·%d", fd.Num, tgoodKey, tcorruptedKey, tcorruptedBlock, size, tSeq) - return nil - } - - if tgoodKey > 0 { - if tcorruptedKey > 0 || tcorruptedBlock > 0 { - // Rebuild the table. - s.logf("table@recovery rebuilding @%d", fd.Num) - iter := tr.NewIterator(nil, nil) - tmpFd, newSize, err := buildTable(iter) - iter.Release() - if err != nil { - return err - } - closed = true - reader.Close() - if err := s.stor.Rename(tmpFd, fd); err != nil { - return err - } - size = newSize - } - if tSeq > maxSeq { - maxSeq = tSeq - } - recoveredKey += tgoodKey - // Add table to level 0. - rec.addTable(0, fd.Num, size, imin, imax) - s.logf("table@recovery recovered @%d Gk·%d Ck·%d Cb·%d S·%d Q·%d", fd.Num, tgoodKey, tcorruptedKey, tcorruptedBlock, size, tSeq) - } else { - droppedTable++ - s.logf("table@recovery unrecoverable @%d Ck·%d Cb·%d S·%d", fd.Num, tcorruptedKey, tcorruptedBlock, size) - } - - return nil - } - - // Recover all tables. - if len(fds) > 0 { - s.logf("table@recovery F·%d", len(fds)) - - // Mark file number as used. - s.markFileNum(fds[len(fds)-1].Num) - - for _, fd := range fds { - if err := recoverTable(fd); err != nil { - return err - } - } - - s.logf("table@recovery recovered F·%d N·%d Gk·%d Ck·%d Q·%d", len(fds), recoveredKey, goodKey, corruptedKey, maxSeq) - } - - // Set sequence number. - rec.setSeqNum(maxSeq) - - // Create new manifest. - if err := s.create(); err != nil { - return err - } - - // Commit. - return s.commit(rec) -} - -func (db *DB) recoverJournal() error { - // Get all journals and sort it by file number. - rawFds, err := db.s.stor.List(storage.TypeJournal) - if err != nil { - return err - } - sortFds(rawFds) - - // Journals that will be recovered. - var fds []storage.FileDesc - for _, fd := range rawFds { - if fd.Num >= db.s.stJournalNum || fd.Num == db.s.stPrevJournalNum { - fds = append(fds, fd) - } - } - - var ( - ofd storage.FileDesc // Obsolete file. - rec = &sessionRecord{} - ) - - // Recover journals. - if len(fds) > 0 { - db.logf("journal@recovery F·%d", len(fds)) - - // Mark file number as used. - db.s.markFileNum(fds[len(fds)-1].Num) - - var ( - // Options. - strict = db.s.o.GetStrict(opt.StrictJournal) - checksum = db.s.o.GetStrict(opt.StrictJournalChecksum) - writeBuffer = db.s.o.GetWriteBuffer() - - jr *journal.Reader - mdb = memdb.New(db.s.icmp, writeBuffer) - buf = &util.Buffer{} - batchSeq uint64 - batchLen int - ) - - for _, fd := range fds { - db.logf("journal@recovery recovering @%d", fd.Num) - - fr, err := db.s.stor.Open(fd) - if err != nil { - return err - } - - // Create or reset journal reader instance. - if jr == nil { - jr = journal.NewReader(fr, dropper{db.s, fd}, strict, checksum) - } else { - jr.Reset(fr, dropper{db.s, fd}, strict, checksum) - } - - // Flush memdb and remove obsolete journal file. - if !ofd.Zero() { - if mdb.Len() > 0 { - if _, err := db.s.flushMemdb(rec, mdb, 0); err != nil { - fr.Close() - return err - } - } - - rec.setJournalNum(fd.Num) - rec.setSeqNum(db.seq) - if err := db.s.commit(rec); err != nil { - fr.Close() - return err - } - rec.resetAddedTables() - - db.s.stor.Remove(ofd) - ofd = storage.FileDesc{} - } - - // Replay journal to memdb. - mdb.Reset() - for { - r, err := jr.Next() - if err != nil { - if err == io.EOF { - break - } - - fr.Close() - return errors.SetFd(err, fd) - } - - buf.Reset() - if _, err := buf.ReadFrom(r); err != nil { - if err == io.ErrUnexpectedEOF { - // This is error returned due to corruption, with strict == false. - continue - } - - fr.Close() - return errors.SetFd(err, fd) - } - batchSeq, batchLen, err = decodeBatchToMem(buf.Bytes(), db.seq, mdb) - if err != nil { - if !strict && errors.IsCorrupted(err) { - db.s.logf("journal error: %v (skipped)", err) - // We won't apply sequence number as it might be corrupted. - continue - } - - fr.Close() - return errors.SetFd(err, fd) - } - - // Save sequence number. - db.seq = batchSeq + uint64(batchLen) - - // Flush it if large enough. - if mdb.Size() >= writeBuffer { - if _, err := db.s.flushMemdb(rec, mdb, 0); err != nil { - fr.Close() - return err - } - - mdb.Reset() - } - } - - fr.Close() - ofd = fd - } - - // Flush the last memdb. - if mdb.Len() > 0 { - if _, err := db.s.flushMemdb(rec, mdb, 0); err != nil { - return err - } - } - } - - // Create a new journal. - if _, err := db.newMem(0); err != nil { - return err - } - - // Commit. - rec.setJournalNum(db.journalFd.Num) - rec.setSeqNum(db.seq) - if err := db.s.commit(rec); err != nil { - // Close journal on error. - if db.journal != nil { - db.journal.Close() - db.journalWriter.Close() - } - return err - } - - // Remove the last obsolete journal file. - if !ofd.Zero() { - db.s.stor.Remove(ofd) - } - - return nil -} - -func (db *DB) recoverJournalRO() error { - // Get all journals and sort it by file number. - rawFds, err := db.s.stor.List(storage.TypeJournal) - if err != nil { - return err - } - sortFds(rawFds) - - // Journals that will be recovered. - var fds []storage.FileDesc - for _, fd := range rawFds { - if fd.Num >= db.s.stJournalNum || fd.Num == db.s.stPrevJournalNum { - fds = append(fds, fd) - } - } - - var ( - // Options. - strict = db.s.o.GetStrict(opt.StrictJournal) - checksum = db.s.o.GetStrict(opt.StrictJournalChecksum) - writeBuffer = db.s.o.GetWriteBuffer() - - mdb = memdb.New(db.s.icmp, writeBuffer) - ) - - // Recover journals. - if len(fds) > 0 { - db.logf("journal@recovery RO·Mode F·%d", len(fds)) - - var ( - jr *journal.Reader - buf = &util.Buffer{} - batchSeq uint64 - batchLen int - ) - - for _, fd := range fds { - db.logf("journal@recovery recovering @%d", fd.Num) - - fr, err := db.s.stor.Open(fd) - if err != nil { - return err - } - - // Create or reset journal reader instance. - if jr == nil { - jr = journal.NewReader(fr, dropper{db.s, fd}, strict, checksum) - } else { - jr.Reset(fr, dropper{db.s, fd}, strict, checksum) - } - - // Replay journal to memdb. - for { - r, err := jr.Next() - if err != nil { - if err == io.EOF { - break - } - - fr.Close() - return errors.SetFd(err, fd) - } - - buf.Reset() - if _, err := buf.ReadFrom(r); err != nil { - if err == io.ErrUnexpectedEOF { - // This is error returned due to corruption, with strict == false. - continue - } - - fr.Close() - return errors.SetFd(err, fd) - } - batchSeq, batchLen, err = decodeBatchToMem(buf.Bytes(), db.seq, mdb) - if err != nil { - if !strict && errors.IsCorrupted(err) { - db.s.logf("journal error: %v (skipped)", err) - // We won't apply sequence number as it might be corrupted. - continue - } - - fr.Close() - return errors.SetFd(err, fd) - } - - // Save sequence number. - db.seq = batchSeq + uint64(batchLen) - } - - fr.Close() - } - } - - // Set memDB. - db.mem = &memDB{db: db, DB: mdb, ref: 1} - - return nil -} - -func memGet(mdb *memdb.DB, ikey internalKey, icmp *iComparer) (ok bool, mv []byte, err error) { - mk, mv, err := mdb.Find(ikey) - if err == nil { - ukey, _, kt, kerr := parseInternalKey(mk) - if kerr != nil { - // Shouldn't have had happen. - panic(kerr) - } - if icmp.uCompare(ukey, ikey.ukey()) == 0 { - if kt == keyTypeDel { - return true, nil, ErrNotFound - } - return true, mv, nil - - } - } else if err != ErrNotFound { - return true, nil, err - } - return -} - -func (db *DB) get(auxm *memdb.DB, auxt tFiles, key []byte, seq uint64, ro *opt.ReadOptions) (value []byte, err error) { - ikey := makeInternalKey(nil, key, seq, keyTypeSeek) - - if auxm != nil { - if ok, mv, me := memGet(auxm, ikey, db.s.icmp); ok { - return append([]byte{}, mv...), me - } - } - - em, fm := db.getMems() - for _, m := range [...]*memDB{em, fm} { - if m == nil { - continue - } - defer m.decref() - - if ok, mv, me := memGet(m.DB, ikey, db.s.icmp); ok { - return append([]byte{}, mv...), me - } - } - - v := db.s.version() - value, cSched, err := v.get(auxt, ikey, ro, false) - v.release() - if cSched { - // Trigger table compaction. - db.compTrigger(db.tcompCmdC) - } - return -} - -func nilIfNotFound(err error) error { - if err == ErrNotFound { - return nil - } - return err -} - -func (db *DB) has(auxm *memdb.DB, auxt tFiles, key []byte, seq uint64, ro *opt.ReadOptions) (ret bool, err error) { - ikey := makeInternalKey(nil, key, seq, keyTypeSeek) - - if auxm != nil { - if ok, _, me := memGet(auxm, ikey, db.s.icmp); ok { - return me == nil, nilIfNotFound(me) - } - } - - em, fm := db.getMems() - for _, m := range [...]*memDB{em, fm} { - if m == nil { - continue - } - defer m.decref() - - if ok, _, me := memGet(m.DB, ikey, db.s.icmp); ok { - return me == nil, nilIfNotFound(me) - } - } - - v := db.s.version() - _, cSched, err := v.get(auxt, ikey, ro, true) - v.release() - if cSched { - // Trigger table compaction. - db.compTrigger(db.tcompCmdC) - } - if err == nil { - ret = true - } else if err == ErrNotFound { - err = nil - } - return -} - -// Get gets the value for the given key. It returns ErrNotFound if the -// DB does not contains the key. -// -// The returned slice is its own copy, it is safe to modify the contents -// of the returned slice. -// It is safe to modify the contents of the argument after Get returns. -func (db *DB) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) { - err = db.ok() - if err != nil { - return - } - - se := db.acquireSnapshot() - defer db.releaseSnapshot(se) - return db.get(nil, nil, key, se.seq, ro) -} - -// Has returns true if the DB does contains the given key. -// -// It is safe to modify the contents of the argument after Has returns. -func (db *DB) Has(key []byte, ro *opt.ReadOptions) (ret bool, err error) { - err = db.ok() - if err != nil { - return - } - - se := db.acquireSnapshot() - defer db.releaseSnapshot(se) - return db.has(nil, nil, key, se.seq, ro) -} - -// NewIterator returns an iterator for the latest snapshot of the -// underlying DB. -// The returned iterator is not safe for concurrent use, but it is safe to use -// multiple iterators concurrently, with each in a dedicated goroutine. -// It is also safe to use an iterator concurrently with modifying its -// underlying DB. The resultant key/value pairs are guaranteed to be -// consistent. -// -// Slice allows slicing the iterator to only contains keys in the given -// range. A nil Range.Start is treated as a key before all keys in the -// DB. And a nil Range.Limit is treated as a key after all keys in -// the DB. -// -// The iterator must be released after use, by calling Release method. -// -// Also read Iterator documentation of the leveldb/iterator package. -func (db *DB) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { - if err := db.ok(); err != nil { - return iterator.NewEmptyIterator(err) - } - - se := db.acquireSnapshot() - defer db.releaseSnapshot(se) - // Iterator holds 'version' lock, 'version' is immutable so snapshot - // can be released after iterator created. - return db.newIterator(nil, nil, se.seq, slice, ro) -} - -// GetSnapshot returns a latest snapshot of the underlying DB. A snapshot -// is a frozen snapshot of a DB state at a particular point in time. The -// content of snapshot are guaranteed to be consistent. -// -// The snapshot must be released after use, by calling Release method. -func (db *DB) GetSnapshot() (*Snapshot, error) { - if err := db.ok(); err != nil { - return nil, err - } - - return db.newSnapshot(), nil -} - -// GetProperty returns value of the given property name. -// -// Property names: -// leveldb.num-files-at-level{n} -// Returns the number of files at level 'n'. -// leveldb.stats -// Returns statistics of the underlying DB. -// leveldb.iostats -// Returns statistics of effective disk read and write. -// leveldb.writedelay -// Returns cumulative write delay caused by compaction. -// leveldb.sstables -// Returns sstables list for each level. -// leveldb.blockpool -// Returns block pool stats. -// leveldb.cachedblock -// Returns size of cached block. -// leveldb.openedtables -// Returns number of opened tables. -// leveldb.alivesnaps -// Returns number of alive snapshots. -// leveldb.aliveiters -// Returns number of alive iterators. -func (db *DB) GetProperty(name string) (value string, err error) { - err = db.ok() - if err != nil { - return - } - - const prefix = "leveldb." - if !strings.HasPrefix(name, prefix) { - return "", ErrNotFound - } - p := name[len(prefix):] - - v := db.s.version() - defer v.release() - - numFilesPrefix := "num-files-at-level" - switch { - case strings.HasPrefix(p, numFilesPrefix): - var level uint - var rest string - n, _ := fmt.Sscanf(p[len(numFilesPrefix):], "%d%s", &level, &rest) - if n != 1 { - err = ErrNotFound - } else { - value = fmt.Sprint(v.tLen(int(level))) - } - case p == "stats": - value = "Compactions\n" + - " Level | Tables | Size(MB) | Time(sec) | Read(MB) | Write(MB)\n" + - "-------+------------+---------------+---------------+---------------+---------------\n" - for level, tables := range v.levels { - duration, read, write := db.compStats.getStat(level) - if len(tables) == 0 && duration == 0 { - continue - } - 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) - } - case p == "iostats": - value = fmt.Sprintf("Read(MB):%.5f Write(MB):%.5f", - float64(db.s.stor.reads())/1048576.0, - float64(db.s.stor.writes())/1048576.0) - case p == "writedelay": - writeDelayN, writeDelay := atomic.LoadInt32(&db.cWriteDelayN), time.Duration(atomic.LoadInt64(&db.cWriteDelay)) - paused := atomic.LoadInt32(&db.inWritePaused) == 1 - value = fmt.Sprintf("DelayN:%d Delay:%s Paused:%t", writeDelayN, writeDelay, paused) - case p == "sstables": - for level, tables := range v.levels { - value += fmt.Sprintf("--- level %d ---\n", level) - for _, t := range tables { - value += fmt.Sprintf("%d:%d[%q .. %q]\n", t.fd.Num, t.size, t.imin, t.imax) - } - } - case p == "blockpool": - value = fmt.Sprintf("%v", db.s.tops.bpool) - case p == "cachedblock": - if db.s.tops.bcache != nil { - value = fmt.Sprintf("%d", db.s.tops.bcache.Size()) - } else { - value = "" - } - case p == "openedtables": - value = fmt.Sprintf("%d", db.s.tops.cache.Size()) - case p == "alivesnaps": - value = fmt.Sprintf("%d", atomic.LoadInt32(&db.aliveSnaps)) - case p == "aliveiters": - value = fmt.Sprintf("%d", atomic.LoadInt32(&db.aliveIters)) - default: - err = ErrNotFound - } - - return -} - -// DBStats is database statistics. -type DBStats struct { - WriteDelayCount int32 - WriteDelayDuration time.Duration - WritePaused bool - - AliveSnapshots int32 - AliveIterators int32 - - IOWrite uint64 - IORead uint64 - - BlockCacheSize int - OpenedTablesCount int - - LevelSizes []int64 - LevelTablesCounts []int - LevelRead []int64 - LevelWrite []int64 - LevelDurations []time.Duration -} - -// Stats populates s with database statistics. -func (db *DB) Stats(s *DBStats) error { - err := db.ok() - if err != nil { - return err - } - - s.IORead = db.s.stor.reads() - s.IOWrite = db.s.stor.writes() - s.WriteDelayCount = atomic.LoadInt32(&db.cWriteDelayN) - s.WriteDelayDuration = time.Duration(atomic.LoadInt64(&db.cWriteDelay)) - s.WritePaused = atomic.LoadInt32(&db.inWritePaused) == 1 - - s.OpenedTablesCount = db.s.tops.cache.Size() - if db.s.tops.bcache != nil { - s.BlockCacheSize = db.s.tops.bcache.Size() - } else { - s.BlockCacheSize = 0 - } - - s.AliveIterators = atomic.LoadInt32(&db.aliveIters) - s.AliveSnapshots = atomic.LoadInt32(&db.aliveSnaps) - - s.LevelDurations = s.LevelDurations[:0] - s.LevelRead = s.LevelRead[:0] - s.LevelWrite = s.LevelWrite[:0] - s.LevelSizes = s.LevelSizes[:0] - s.LevelTablesCounts = s.LevelTablesCounts[:0] - - v := db.s.version() - defer v.release() - - for level, tables := range v.levels { - duration, read, write := db.compStats.getStat(level) - if len(tables) == 0 && duration == 0 { - continue - } - s.LevelDurations = append(s.LevelDurations, duration) - s.LevelRead = append(s.LevelRead, read) - s.LevelWrite = append(s.LevelWrite, write) - s.LevelSizes = append(s.LevelSizes, tables.size()) - s.LevelTablesCounts = append(s.LevelTablesCounts, len(tables)) - } - - return nil -} - -// SizeOf calculates approximate sizes of the given key ranges. -// The length of the returned sizes are equal with the length of the given -// ranges. The returned sizes measure storage space usage, so if the user -// data compresses by a factor of ten, the returned sizes will be one-tenth -// the size of the corresponding user data size. -// The results may not include the sizes of recently written data. -func (db *DB) SizeOf(ranges []util.Range) (Sizes, error) { - if err := db.ok(); err != nil { - return nil, err - } - - v := db.s.version() - defer v.release() - - sizes := make(Sizes, 0, len(ranges)) - for _, r := range ranges { - imin := makeInternalKey(nil, r.Start, keyMaxSeq, keyTypeSeek) - imax := makeInternalKey(nil, r.Limit, keyMaxSeq, keyTypeSeek) - start, err := v.offsetOf(imin) - if err != nil { - return nil, err - } - limit, err := v.offsetOf(imax) - if err != nil { - return nil, err - } - var size int64 - if limit >= start { - size = limit - start - } - sizes = append(sizes, size) - } - - return sizes, nil -} - -// Close closes the DB. This will also releases any outstanding snapshot, -// abort any in-flight compaction and discard open transaction. -// -// It is not safe to close a DB until all outstanding iterators are released. -// It is valid to call Close multiple times. Other methods should not be -// called after the DB has been closed. -func (db *DB) Close() error { - if !db.setClosed() { - return ErrClosed - } - - start := time.Now() - db.log("db@close closing") - - // Clear the finalizer. - runtime.SetFinalizer(db, nil) - - // Get compaction error. - var err error - select { - case err = <-db.compErrC: - if err == ErrReadOnly { - err = nil - } - default: - } - - // Signal all goroutines. - close(db.closeC) - - // Discard open transaction. - if db.tr != nil { - db.tr.Discard() - } - - // Acquire writer lock. - db.writeLockC <- struct{}{} - - // Wait for all gorotines to exit. - db.closeW.Wait() - - // Closes journal. - if db.journal != nil { - db.journal.Close() - db.journalWriter.Close() - db.journal = nil - db.journalWriter = nil - } - - if db.writeDelayN > 0 { - db.logf("db@write was delayed N·%d T·%v", db.writeDelayN, db.writeDelay) - } - - // Close session. - db.s.close() - db.logf("db@close done T·%v", time.Since(start)) - db.s.release() - - if db.closer != nil { - if err1 := db.closer.Close(); err == nil { - err = err1 - } - db.closer = nil - } - - // Clear memdbs. - db.clearMems() - - return err -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go deleted file mode 100644 index 0c1b9a53b8e7..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_compaction.go +++ /dev/null @@ -1,854 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "sync" - "time" - - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -var ( - errCompactionTransactExiting = errors.New("leveldb: compaction transact exiting") -) - -type cStat struct { - duration time.Duration - read int64 - write int64 -} - -func (p *cStat) add(n *cStatStaging) { - p.duration += n.duration - p.read += n.read - p.write += n.write -} - -func (p *cStat) get() (duration time.Duration, read, write int64) { - return p.duration, p.read, p.write -} - -type cStatStaging struct { - start time.Time - duration time.Duration - on bool - read int64 - write int64 -} - -func (p *cStatStaging) startTimer() { - if !p.on { - p.start = time.Now() - p.on = true - } -} - -func (p *cStatStaging) stopTimer() { - if p.on { - p.duration += time.Since(p.start) - p.on = false - } -} - -type cStats struct { - lk sync.Mutex - stats []cStat -} - -func (p *cStats) addStat(level int, n *cStatStaging) { - p.lk.Lock() - if level >= len(p.stats) { - newStats := make([]cStat, level+1) - copy(newStats, p.stats) - p.stats = newStats - } - p.stats[level].add(n) - p.lk.Unlock() -} - -func (p *cStats) getStat(level int) (duration time.Duration, read, write int64) { - p.lk.Lock() - defer p.lk.Unlock() - if level < len(p.stats) { - return p.stats[level].get() - } - return -} - -func (db *DB) compactionError() { - var err error -noerr: - // No error. - for { - select { - case err = <-db.compErrSetC: - switch { - case err == nil: - case err == ErrReadOnly, errors.IsCorrupted(err): - goto hasperr - default: - goto haserr - } - case <-db.closeC: - return - } - } -haserr: - // Transient error. - for { - select { - case db.compErrC <- err: - case err = <-db.compErrSetC: - switch { - case err == nil: - goto noerr - case err == ErrReadOnly, errors.IsCorrupted(err): - goto hasperr - default: - } - case <-db.closeC: - return - } - } -hasperr: - // Persistent error. - for { - select { - case db.compErrC <- err: - case db.compPerErrC <- err: - case db.writeLockC <- struct{}{}: - // Hold write lock, so that write won't pass-through. - db.compWriteLocking = true - case <-db.closeC: - if db.compWriteLocking { - // We should release the lock or Close will hang. - <-db.writeLockC - } - return - } - } -} - -type compactionTransactCounter int - -func (cnt *compactionTransactCounter) incr() { - *cnt++ -} - -type compactionTransactInterface interface { - run(cnt *compactionTransactCounter) error - revert() error -} - -func (db *DB) compactionTransact(name string, t compactionTransactInterface) { - defer func() { - if x := recover(); x != nil { - if x == errCompactionTransactExiting { - if err := t.revert(); err != nil { - db.logf("%s revert error %q", name, err) - } - } - panic(x) - } - }() - - const ( - backoffMin = 1 * time.Second - backoffMax = 8 * time.Second - backoffMul = 2 * time.Second - ) - var ( - backoff = backoffMin - backoffT = time.NewTimer(backoff) - lastCnt = compactionTransactCounter(0) - - disableBackoff = db.s.o.GetDisableCompactionBackoff() - ) - for n := 0; ; n++ { - // Check whether the DB is closed. - if db.isClosed() { - db.logf("%s exiting", name) - db.compactionExitTransact() - } else if n > 0 { - db.logf("%s retrying N·%d", name, n) - } - - // Execute. - cnt := compactionTransactCounter(0) - err := t.run(&cnt) - if err != nil { - db.logf("%s error I·%d %q", name, cnt, err) - } - - // Set compaction error status. - select { - case db.compErrSetC <- err: - case perr := <-db.compPerErrC: - if err != nil { - db.logf("%s exiting (persistent error %q)", name, perr) - db.compactionExitTransact() - } - case <-db.closeC: - db.logf("%s exiting", name) - db.compactionExitTransact() - } - if err == nil { - return - } - if errors.IsCorrupted(err) { - db.logf("%s exiting (corruption detected)", name) - db.compactionExitTransact() - } - - if !disableBackoff { - // Reset backoff duration if counter is advancing. - if cnt > lastCnt { - backoff = backoffMin - lastCnt = cnt - } - - // Backoff. - backoffT.Reset(backoff) - if backoff < backoffMax { - backoff *= backoffMul - if backoff > backoffMax { - backoff = backoffMax - } - } - select { - case <-backoffT.C: - case <-db.closeC: - db.logf("%s exiting", name) - db.compactionExitTransact() - } - } - } -} - -type compactionTransactFunc struct { - runFunc func(cnt *compactionTransactCounter) error - revertFunc func() error -} - -func (t *compactionTransactFunc) run(cnt *compactionTransactCounter) error { - return t.runFunc(cnt) -} - -func (t *compactionTransactFunc) revert() error { - if t.revertFunc != nil { - return t.revertFunc() - } - return nil -} - -func (db *DB) compactionTransactFunc(name string, run func(cnt *compactionTransactCounter) error, revert func() error) { - db.compactionTransact(name, &compactionTransactFunc{run, revert}) -} - -func (db *DB) compactionExitTransact() { - panic(errCompactionTransactExiting) -} - -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) - }, nil) -} - -func (db *DB) memCompaction() { - mdb := db.getFrozenMem() - if mdb == nil { - return - } - defer mdb.decref() - - db.logf("memdb@flush N·%d S·%s", mdb.Len(), shortenb(mdb.Size())) - - // Don't compact empty memdb. - if mdb.Len() == 0 { - db.logf("memdb@flush skipping") - // drop frozen memdb - db.dropFrozenMem() - return - } - - // Pause table compaction. - resumeC := make(chan struct{}) - select { - case db.tcompPauseC <- (chan<- struct{})(resumeC): - case <-db.compPerErrC: - close(resumeC) - resumeC = nil - case <-db.closeC: - db.compactionExitTransact() - } - - var ( - rec = &sessionRecord{} - stats = &cStatStaging{} - flushLevel int - ) - - // Generate tables. - db.compactionTransactFunc("memdb@flush", func(cnt *compactionTransactCounter) (err error) { - stats.startTimer() - flushLevel, err = db.s.flushMemdb(rec, mdb.DB, db.memdbMaxLevel) - stats.stopTimer() - return - }, func() error { - for _, r := range rec.addedTables { - db.logf("memdb@flush revert @%d", r.num) - if err := db.s.stor.Remove(storage.FileDesc{Type: storage.TypeTable, Num: r.num}); err != nil { - return err - } - } - return nil - }) - - rec.setJournalNum(db.journalFd.Num) - rec.setSeqNum(db.frozenSeq) - - // Commit. - stats.startTimer() - db.compactionCommit("memdb", rec) - stats.stopTimer() - - db.logf("memdb@flush committed F·%d T·%v", len(rec.addedTables), stats.duration) - - for _, r := range rec.addedTables { - stats.write += r.size - } - db.compStats.addStat(flushLevel, stats) - - // Drop frozen memdb. - db.dropFrozenMem() - - // Resume table compaction. - if resumeC != nil { - select { - case <-resumeC: - close(resumeC) - case <-db.closeC: - db.compactionExitTransact() - } - } - - // Trigger table compaction. - db.compTrigger(db.tcompCmdC) -} - -type tableCompactionBuilder struct { - db *DB - s *session - c *compaction - rec *sessionRecord - stat0, stat1 *cStatStaging - - snapHasLastUkey bool - snapLastUkey []byte - snapLastSeq uint64 - snapIter int - snapKerrCnt int - snapDropCnt int - - kerrCnt int - dropCnt int - - minSeq uint64 - strict bool - tableSize int - - tw *tWriter -} - -func (b *tableCompactionBuilder) appendKV(key, value []byte) error { - // Create new table if not already. - if b.tw == nil { - // Check for pause event. - if b.db != nil { - select { - case ch := <-b.db.tcompPauseC: - b.db.pauseCompaction(ch) - case <-b.db.closeC: - b.db.compactionExitTransact() - default: - } - } - - // Create new table. - var err error - b.tw, err = b.s.tops.create() - if err != nil { - return err - } - } - - // Write key/value into table. - return b.tw.append(key, value) -} - -func (b *tableCompactionBuilder) needFlush() bool { - return b.tw.tw.BytesLen() >= b.tableSize -} - -func (b *tableCompactionBuilder) flush() error { - t, err := b.tw.finish() - if err != nil { - return err - } - b.rec.addTableFile(b.c.sourceLevel+1, t) - b.stat1.write += t.size - b.s.logf("table@build created L%d@%d N·%d S·%s %q:%q", b.c.sourceLevel+1, t.fd.Num, b.tw.tw.EntriesLen(), shortenb(int(t.size)), t.imin, t.imax) - b.tw = nil - return nil -} - -func (b *tableCompactionBuilder) cleanup() { - if b.tw != nil { - b.tw.drop() - b.tw = nil - } -} - -func (b *tableCompactionBuilder) run(cnt *compactionTransactCounter) error { - snapResumed := b.snapIter > 0 - hasLastUkey := b.snapHasLastUkey // The key might has zero length, so this is necessary. - lastUkey := append([]byte{}, b.snapLastUkey...) - lastSeq := b.snapLastSeq - b.kerrCnt = b.snapKerrCnt - b.dropCnt = b.snapDropCnt - // Restore compaction state. - b.c.restore() - - defer b.cleanup() - - b.stat1.startTimer() - defer b.stat1.stopTimer() - - iter := b.c.newIterator() - defer iter.Release() - for i := 0; iter.Next(); i++ { - // Incr transact counter. - cnt.incr() - - // Skip until last state. - if i < b.snapIter { - continue - } - - resumed := false - if snapResumed { - resumed = true - snapResumed = false - } - - ikey := iter.Key() - ukey, seq, kt, kerr := parseInternalKey(ikey) - - if kerr == nil { - shouldStop := !resumed && b.c.shouldStopBefore(ikey) - - if !hasLastUkey || b.s.icmp.uCompare(lastUkey, ukey) != 0 { - // First occurrence of this user key. - - // Only rotate tables if ukey doesn't hop across. - if b.tw != nil && (shouldStop || b.needFlush()) { - if err := b.flush(); err != nil { - return err - } - - // Creates snapshot of the state. - b.c.save() - b.snapHasLastUkey = hasLastUkey - b.snapLastUkey = append(b.snapLastUkey[:0], lastUkey...) - b.snapLastSeq = lastSeq - b.snapIter = i - b.snapKerrCnt = b.kerrCnt - b.snapDropCnt = b.dropCnt - } - - hasLastUkey = true - lastUkey = append(lastUkey[:0], ukey...) - lastSeq = keyMaxSeq - } - - switch { - case lastSeq <= b.minSeq: - // Dropped because newer entry for same user key exist - fallthrough // (A) - case kt == keyTypeDel && seq <= b.minSeq && b.c.baseLevelForKey(lastUkey): - // For this user key: - // (1) there is no data in higher levels - // (2) data in lower levels will have larger seq numbers - // (3) data in layers that are being compacted here and have - // smaller seq numbers will be dropped in the next - // few iterations of this loop (by rule (A) above). - // Therefore this deletion marker is obsolete and can be dropped. - lastSeq = seq - b.dropCnt++ - continue - default: - lastSeq = seq - } - } else { - if b.strict { - return kerr - } - - // Don't drop corrupted keys. - hasLastUkey = false - lastUkey = lastUkey[:0] - lastSeq = keyMaxSeq - b.kerrCnt++ - } - - if err := b.appendKV(ikey, iter.Value()); err != nil { - return err - } - } - - if err := iter.Error(); err != nil { - return err - } - - // Finish last table. - if b.tw != nil && !b.tw.empty() { - return b.flush() - } - return nil -} - -func (b *tableCompactionBuilder) revert() error { - for _, at := range b.rec.addedTables { - b.s.logf("table@build revert @%d", at.num) - if err := b.s.stor.Remove(storage.FileDesc{Type: storage.TypeTable, Num: at.num}); err != nil { - return err - } - } - return nil -} - -func (db *DB) tableCompaction(c *compaction, noTrivial bool) { - defer c.release() - - rec := &sessionRecord{} - rec.addCompPtr(c.sourceLevel, c.imax) - - if !noTrivial && c.trivial() { - t := c.levels[0][0] - db.logf("table@move L%d@%d -> L%d", c.sourceLevel, t.fd.Num, c.sourceLevel+1) - rec.delTable(c.sourceLevel, t.fd.Num) - rec.addTableFile(c.sourceLevel+1, t) - db.compactionCommit("table-move", rec) - return - } - - var stats [2]cStatStaging - for i, tables := range c.levels { - for _, t := range tables { - stats[i].read += t.size - // Insert deleted tables into record - rec.delTable(c.sourceLevel+i, t.fd.Num) - } - } - sourceSize := int(stats[0].read + stats[1].read) - minSeq := db.minSeq() - db.logf("table@compaction L%d·%d -> L%d·%d S·%s Q·%d", c.sourceLevel, len(c.levels[0]), c.sourceLevel+1, len(c.levels[1]), shortenb(sourceSize), minSeq) - - b := &tableCompactionBuilder{ - db: db, - s: db.s, - c: c, - rec: rec, - stat1: &stats[1], - minSeq: minSeq, - strict: db.s.o.GetStrict(opt.StrictCompaction), - tableSize: db.s.o.GetCompactionTableSize(c.sourceLevel + 1), - } - db.compactionTransact("table@build", b) - - // Commit. - stats[1].startTimer() - db.compactionCommit("table", rec) - stats[1].stopTimer() - - resultSize := int(stats[1].write) - db.logf("table@compaction committed F%s S%s Ke·%d D·%d T·%v", sint(len(rec.addedTables)-len(rec.deletedTables)), sshortenb(resultSize-sourceSize), b.kerrCnt, b.dropCnt, stats[1].duration) - - // Save compaction stats - for i := range stats { - db.compStats.addStat(c.sourceLevel+1, &stats[i]) - } -} - -func (db *DB) tableRangeCompaction(level int, umin, umax []byte) error { - db.logf("table@compaction range L%d %q:%q", level, umin, umax) - if level >= 0 { - if c := db.s.getCompactionRange(level, umin, umax, true); c != nil { - db.tableCompaction(c, true) - } - } else { - // Retry until nothing to compact. - for { - compacted := false - - // Scan for maximum level with overlapped tables. - v := db.s.version() - m := 1 - for i := m; i < len(v.levels); i++ { - tables := v.levels[i] - if tables.overlaps(db.s.icmp, umin, umax, false) { - m = i - } - } - v.release() - - for level := 0; level < m; level++ { - if c := db.s.getCompactionRange(level, umin, umax, false); c != nil { - db.tableCompaction(c, true) - compacted = true - } - } - - if !compacted { - break - } - } - } - - return nil -} - -func (db *DB) tableAutoCompaction() { - if c := db.s.pickCompaction(); c != nil { - db.tableCompaction(c, false) - } -} - -func (db *DB) tableNeedCompaction() bool { - v := db.s.version() - defer v.release() - return v.needCompaction() -} - -// resumeWrite returns an indicator whether we should resume write operation if enough level0 files are compacted. -func (db *DB) resumeWrite() bool { - v := db.s.version() - defer v.release() - if v.tLen(0) < db.s.o.GetWriteL0PauseTrigger() { - return true - } - return false -} - -func (db *DB) pauseCompaction(ch chan<- struct{}) { - select { - case ch <- struct{}{}: - case <-db.closeC: - db.compactionExitTransact() - } -} - -type cCmd interface { - ack(err error) -} - -type cAuto struct { - // Note for table compaction, an non-empty ackC represents it's a compaction waiting command. - ackC chan<- error -} - -func (r cAuto) ack(err error) { - if r.ackC != nil { - defer func() { - recover() - }() - r.ackC <- err - } -} - -type cRange struct { - level int - min, max []byte - ackC chan<- error -} - -func (r cRange) ack(err error) { - if r.ackC != nil { - defer func() { - recover() - }() - r.ackC <- err - } -} - -// This will trigger auto compaction but will not wait for it. -func (db *DB) compTrigger(compC chan<- cCmd) { - select { - case compC <- cAuto{}: - default: - } -} - -// This will trigger auto compaction and/or wait for all compaction to be done. -func (db *DB) compTriggerWait(compC chan<- cCmd) (err error) { - ch := make(chan error) - defer close(ch) - // Send cmd. - select { - case compC <- cAuto{ch}: - case err = <-db.compErrC: - return - case <-db.closeC: - return ErrClosed - } - // Wait cmd. - select { - case err = <-ch: - case err = <-db.compErrC: - case <-db.closeC: - return ErrClosed - } - return err -} - -// Send range compaction request. -func (db *DB) compTriggerRange(compC chan<- cCmd, level int, min, max []byte) (err error) { - ch := make(chan error) - defer close(ch) - // Send cmd. - select { - case compC <- cRange{level, min, max, ch}: - case err := <-db.compErrC: - return err - case <-db.closeC: - return ErrClosed - } - // Wait cmd. - select { - case err = <-ch: - case err = <-db.compErrC: - case <-db.closeC: - return ErrClosed - } - return err -} - -func (db *DB) mCompaction() { - var x cCmd - - defer func() { - if x := recover(); x != nil { - if x != errCompactionTransactExiting { - panic(x) - } - } - if x != nil { - x.ack(ErrClosed) - } - db.closeW.Done() - }() - - for { - select { - case x = <-db.mcompCmdC: - switch x.(type) { - case cAuto: - db.memCompaction() - x.ack(nil) - x = nil - default: - panic("leveldb: unknown command") - } - case <-db.closeC: - return - } - } -} - -func (db *DB) tCompaction() { - var ( - x cCmd - waitQ []cCmd - ) - - defer func() { - if x := recover(); x != nil { - if x != errCompactionTransactExiting { - panic(x) - } - } - for i := range waitQ { - waitQ[i].ack(ErrClosed) - waitQ[i] = nil - } - if x != nil { - x.ack(ErrClosed) - } - db.closeW.Done() - }() - - for { - if db.tableNeedCompaction() { - select { - case x = <-db.tcompCmdC: - case ch := <-db.tcompPauseC: - db.pauseCompaction(ch) - continue - case <-db.closeC: - return - default: - } - // Resume write operation as soon as possible. - if len(waitQ) > 0 && db.resumeWrite() { - for i := range waitQ { - waitQ[i].ack(nil) - waitQ[i] = nil - } - waitQ = waitQ[:0] - } - } else { - for i := range waitQ { - waitQ[i].ack(nil) - waitQ[i] = nil - } - waitQ = waitQ[:0] - select { - case x = <-db.tcompCmdC: - case ch := <-db.tcompPauseC: - db.pauseCompaction(ch) - continue - case <-db.closeC: - return - } - } - if x != nil { - switch cmd := x.(type) { - case cAuto: - if cmd.ackC != nil { - // Check the write pause state before caching it. - if db.resumeWrite() { - x.ack(nil) - } else { - waitQ = append(waitQ, x) - } - } - case cRange: - x.ack(db.tableRangeCompaction(cmd.level, cmd.min, cmd.max)) - default: - panic("leveldb: unknown command") - } - x = nil - } - db.tableAutoCompaction() - } -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_iter.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_iter.go deleted file mode 100644 index 03c24cdab50d..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_iter.go +++ /dev/null @@ -1,360 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "errors" - "math/rand" - "runtime" - "sync" - "sync/atomic" - - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/util" -) - -var ( - errInvalidInternalKey = errors.New("leveldb: Iterator: invalid internal key") -) - -type memdbReleaser struct { - once sync.Once - m *memDB -} - -func (mr *memdbReleaser) Release() { - mr.once.Do(func() { - mr.m.decref() - }) -} - -func (db *DB) newRawIterator(auxm *memDB, auxt tFiles, slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { - strict := opt.GetStrict(db.s.o.Options, ro, opt.StrictReader) - em, fm := db.getMems() - v := db.s.version() - - tableIts := v.getIterators(slice, ro) - n := len(tableIts) + len(auxt) + 3 - its := make([]iterator.Iterator, 0, n) - - if auxm != nil { - ami := auxm.NewIterator(slice) - ami.SetReleaser(&memdbReleaser{m: auxm}) - its = append(its, ami) - } - for _, t := range auxt { - its = append(its, v.s.tops.newIterator(t, slice, ro)) - } - - emi := em.NewIterator(slice) - emi.SetReleaser(&memdbReleaser{m: em}) - its = append(its, emi) - if fm != nil { - fmi := fm.NewIterator(slice) - fmi.SetReleaser(&memdbReleaser{m: fm}) - its = append(its, fmi) - } - its = append(its, tableIts...) - mi := iterator.NewMergedIterator(its, db.s.icmp, strict) - mi.SetReleaser(&versionReleaser{v: v}) - return mi -} - -func (db *DB) newIterator(auxm *memDB, auxt tFiles, seq uint64, slice *util.Range, ro *opt.ReadOptions) *dbIter { - var islice *util.Range - if slice != nil { - islice = &util.Range{} - if slice.Start != nil { - islice.Start = makeInternalKey(nil, slice.Start, keyMaxSeq, keyTypeSeek) - } - if slice.Limit != nil { - islice.Limit = makeInternalKey(nil, slice.Limit, keyMaxSeq, keyTypeSeek) - } - } - rawIter := db.newRawIterator(auxm, auxt, islice, ro) - iter := &dbIter{ - db: db, - icmp: db.s.icmp, - iter: rawIter, - seq: seq, - strict: opt.GetStrict(db.s.o.Options, ro, opt.StrictReader), - key: make([]byte, 0), - value: make([]byte, 0), - } - atomic.AddInt32(&db.aliveIters, 1) - runtime.SetFinalizer(iter, (*dbIter).Release) - return iter -} - -func (db *DB) iterSamplingRate() int { - return rand.Intn(2 * db.s.o.GetIteratorSamplingRate()) -} - -type dir int - -const ( - dirReleased dir = iota - 1 - dirSOI - dirEOI - dirBackward - dirForward -) - -// dbIter represent an interator states over a database session. -type dbIter struct { - db *DB - icmp *iComparer - iter iterator.Iterator - seq uint64 - strict bool - - smaplingGap int - dir dir - key []byte - value []byte - err error - releaser util.Releaser -} - -func (i *dbIter) sampleSeek() { - ikey := i.iter.Key() - i.smaplingGap -= len(ikey) + len(i.iter.Value()) - for i.smaplingGap < 0 { - i.smaplingGap += i.db.iterSamplingRate() - i.db.sampleSeek(ikey) - } -} - -func (i *dbIter) setErr(err error) { - i.err = err - i.key = nil - i.value = nil -} - -func (i *dbIter) iterErr() { - if err := i.iter.Error(); err != nil { - i.setErr(err) - } -} - -func (i *dbIter) Valid() bool { - return i.err == nil && i.dir > dirEOI -} - -func (i *dbIter) First() bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - if i.iter.First() { - i.dir = dirSOI - return i.next() - } - i.dir = dirEOI - i.iterErr() - return false -} - -func (i *dbIter) Last() bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - if i.iter.Last() { - return i.prev() - } - i.dir = dirSOI - i.iterErr() - return false -} - -func (i *dbIter) Seek(key []byte) bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - ikey := makeInternalKey(nil, key, i.seq, keyTypeSeek) - if i.iter.Seek(ikey) { - i.dir = dirSOI - return i.next() - } - i.dir = dirEOI - i.iterErr() - return false -} - -func (i *dbIter) next() bool { - for { - if ukey, seq, kt, kerr := parseInternalKey(i.iter.Key()); kerr == nil { - i.sampleSeek() - if seq <= i.seq { - switch kt { - case keyTypeDel: - // Skip deleted key. - i.key = append(i.key[:0], ukey...) - i.dir = dirForward - case keyTypeVal: - if i.dir == dirSOI || i.icmp.uCompare(ukey, i.key) > 0 { - i.key = append(i.key[:0], ukey...) - i.value = append(i.value[:0], i.iter.Value()...) - i.dir = dirForward - return true - } - } - } - } else if i.strict { - i.setErr(kerr) - break - } - if !i.iter.Next() { - i.dir = dirEOI - i.iterErr() - break - } - } - return false -} - -func (i *dbIter) Next() bool { - if i.dir == dirEOI || i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - if !i.iter.Next() || (i.dir == dirBackward && !i.iter.Next()) { - i.dir = dirEOI - i.iterErr() - return false - } - return i.next() -} - -func (i *dbIter) prev() bool { - i.dir = dirBackward - del := true - if i.iter.Valid() { - for { - if ukey, seq, kt, kerr := parseInternalKey(i.iter.Key()); kerr == nil { - i.sampleSeek() - if seq <= i.seq { - if !del && i.icmp.uCompare(ukey, i.key) < 0 { - return true - } - del = (kt == keyTypeDel) - if !del { - i.key = append(i.key[:0], ukey...) - i.value = append(i.value[:0], i.iter.Value()...) - } - } - } else if i.strict { - i.setErr(kerr) - return false - } - if !i.iter.Prev() { - break - } - } - } - if del { - i.dir = dirSOI - i.iterErr() - return false - } - return true -} - -func (i *dbIter) Prev() bool { - if i.dir == dirSOI || i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - switch i.dir { - case dirEOI: - return i.Last() - case dirForward: - for i.iter.Prev() { - if ukey, _, _, kerr := parseInternalKey(i.iter.Key()); kerr == nil { - i.sampleSeek() - if i.icmp.uCompare(ukey, i.key) < 0 { - goto cont - } - } else if i.strict { - i.setErr(kerr) - return false - } - } - i.dir = dirSOI - i.iterErr() - return false - } - -cont: - return i.prev() -} - -func (i *dbIter) Key() []byte { - if i.err != nil || i.dir <= dirEOI { - return nil - } - return i.key -} - -func (i *dbIter) Value() []byte { - if i.err != nil || i.dir <= dirEOI { - return nil - } - return i.value -} - -func (i *dbIter) Release() { - if i.dir != dirReleased { - // Clear the finalizer. - runtime.SetFinalizer(i, nil) - - if i.releaser != nil { - i.releaser.Release() - i.releaser = nil - } - - i.dir = dirReleased - i.key = nil - i.value = nil - i.iter.Release() - i.iter = nil - atomic.AddInt32(&i.db.aliveIters, -1) - i.db = nil - } -} - -func (i *dbIter) SetReleaser(releaser util.Releaser) { - if i.dir == dirReleased { - panic(util.ErrReleased) - } - if i.releaser != nil && releaser != nil { - panic(util.ErrHasReleaser) - } - i.releaser = releaser -} - -func (i *dbIter) Error() error { - return i.err -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_snapshot.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_snapshot.go deleted file mode 100644 index 2c69d2e531d5..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_snapshot.go +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "container/list" - "fmt" - "runtime" - "sync" - "sync/atomic" - - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/util" -) - -type snapshotElement struct { - seq uint64 - ref int - e *list.Element -} - -// Acquires a snapshot, based on latest sequence. -func (db *DB) acquireSnapshot() *snapshotElement { - db.snapsMu.Lock() - defer db.snapsMu.Unlock() - - seq := db.getSeq() - - if e := db.snapsList.Back(); e != nil { - se := e.Value.(*snapshotElement) - if se.seq == seq { - se.ref++ - return se - } else if seq < se.seq { - panic("leveldb: sequence number is not increasing") - } - } - se := &snapshotElement{seq: seq, ref: 1} - se.e = db.snapsList.PushBack(se) - return se -} - -// Releases given snapshot element. -func (db *DB) releaseSnapshot(se *snapshotElement) { - db.snapsMu.Lock() - defer db.snapsMu.Unlock() - - se.ref-- - if se.ref == 0 { - db.snapsList.Remove(se.e) - se.e = nil - } else if se.ref < 0 { - panic("leveldb: Snapshot: negative element reference") - } -} - -// Gets minimum sequence that not being snapshotted. -func (db *DB) minSeq() uint64 { - db.snapsMu.Lock() - defer db.snapsMu.Unlock() - - if e := db.snapsList.Front(); e != nil { - return e.Value.(*snapshotElement).seq - } - - return db.getSeq() -} - -// Snapshot is a DB snapshot. -type Snapshot struct { - db *DB - elem *snapshotElement - mu sync.RWMutex - released bool -} - -// Creates new snapshot object. -func (db *DB) newSnapshot() *Snapshot { - snap := &Snapshot{ - db: db, - elem: db.acquireSnapshot(), - } - atomic.AddInt32(&db.aliveSnaps, 1) - runtime.SetFinalizer(snap, (*Snapshot).Release) - return snap -} - -func (snap *Snapshot) String() string { - return fmt.Sprintf("leveldb.Snapshot{%d}", snap.elem.seq) -} - -// Get gets the value for the given key. It returns ErrNotFound if -// the DB does not contains the key. -// -// The caller should not modify the contents of the returned slice, but -// it is safe to modify the contents of the argument after Get returns. -func (snap *Snapshot) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) { - err = snap.db.ok() - if err != nil { - return - } - snap.mu.RLock() - defer snap.mu.RUnlock() - if snap.released { - err = ErrSnapshotReleased - return - } - return snap.db.get(nil, nil, key, snap.elem.seq, ro) -} - -// Has returns true if the DB does contains the given key. -// -// It is safe to modify the contents of the argument after Get returns. -func (snap *Snapshot) Has(key []byte, ro *opt.ReadOptions) (ret bool, err error) { - err = snap.db.ok() - if err != nil { - return - } - snap.mu.RLock() - defer snap.mu.RUnlock() - if snap.released { - err = ErrSnapshotReleased - return - } - return snap.db.has(nil, nil, key, snap.elem.seq, ro) -} - -// NewIterator returns an iterator for the snapshot of the underlying DB. -// The returned iterator is not safe for concurrent use, but it is safe to use -// multiple iterators concurrently, with each in a dedicated goroutine. -// It is also safe to use an iterator concurrently with modifying its -// underlying DB. The resultant key/value pairs are guaranteed to be -// consistent. -// -// Slice allows slicing the iterator to only contains keys in the given -// range. A nil Range.Start is treated as a key before all keys in the -// DB. And a nil Range.Limit is treated as a key after all keys in -// the DB. -// -// 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. -// -// Also read Iterator documentation of the leveldb/iterator package. -func (snap *Snapshot) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { - if err := snap.db.ok(); err != nil { - return iterator.NewEmptyIterator(err) - } - snap.mu.Lock() - defer snap.mu.Unlock() - if snap.released { - return iterator.NewEmptyIterator(ErrSnapshotReleased) - } - // Since iterator already hold version ref, it doesn't need to - // hold snapshot ref. - return snap.db.newIterator(nil, nil, snap.elem.seq, slice, ro) -} - -// Release releases the snapshot. This will not release any returned -// iterators, the iterators would still be valid until released or the -// underlying DB is closed. -// -// Other methods should not be called after the snapshot has been released. -func (snap *Snapshot) Release() { - snap.mu.Lock() - defer snap.mu.Unlock() - - if !snap.released { - // Clear the finalizer. - runtime.SetFinalizer(snap, nil) - - snap.released = true - snap.db.releaseSnapshot(snap.elem) - atomic.AddInt32(&snap.db.aliveSnaps, -1) - snap.db = nil - snap.elem = nil - } -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_state.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_state.go deleted file mode 100644 index 65e1c54bb41b..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_state.go +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright (c) 2013, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "errors" - "sync/atomic" - "time" - - "github.com/syndtr/goleveldb/leveldb/journal" - "github.com/syndtr/goleveldb/leveldb/memdb" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -var ( - errHasFrozenMem = errors.New("has frozen mem") -) - -type memDB struct { - db *DB - *memdb.DB - ref int32 -} - -func (m *memDB) getref() int32 { - return atomic.LoadInt32(&m.ref) -} - -func (m *memDB) incref() { - atomic.AddInt32(&m.ref, 1) -} - -func (m *memDB) decref() { - if ref := atomic.AddInt32(&m.ref, -1); ref == 0 { - // Only put back memdb with std capacity. - if m.Capacity() == m.db.s.o.GetWriteBuffer() { - m.Reset() - m.db.mpoolPut(m.DB) - } - m.db = nil - m.DB = nil - } else if ref < 0 { - panic("negative memdb ref") - } -} - -// Get latest sequence number. -func (db *DB) getSeq() uint64 { - return atomic.LoadUint64(&db.seq) -} - -// Atomically adds delta to seq. -func (db *DB) addSeq(delta uint64) { - atomic.AddUint64(&db.seq, delta) -} - -func (db *DB) setSeq(seq uint64) { - atomic.StoreUint64(&db.seq, seq) -} - -func (db *DB) sampleSeek(ikey internalKey) { - v := db.s.version() - if v.sampleSeek(ikey) { - // Trigger table compaction. - db.compTrigger(db.tcompCmdC) - } - v.release() -} - -func (db *DB) mpoolPut(mem *memdb.DB) { - if !db.isClosed() { - select { - case db.memPool <- mem: - default: - } - } -} - -func (db *DB) mpoolGet(n int) *memDB { - var mdb *memdb.DB - select { - case mdb = <-db.memPool: - default: - } - if mdb == nil || mdb.Capacity() < n { - mdb = memdb.New(db.s.icmp, maxInt(db.s.o.GetWriteBuffer(), n)) - } - return &memDB{ - db: db, - DB: mdb, - } -} - -func (db *DB) mpoolDrain() { - ticker := time.NewTicker(30 * time.Second) - for { - select { - case <-ticker.C: - select { - case <-db.memPool: - default: - } - case <-db.closeC: - ticker.Stop() - // Make sure the pool is drained. - select { - case <-db.memPool: - case <-time.After(time.Second): - } - close(db.memPool) - return - } - } -} - -// Create new memdb and froze the old one; need external synchronization. -// newMem only called synchronously by the writer. -func (db *DB) newMem(n int) (mem *memDB, err error) { - fd := storage.FileDesc{Type: storage.TypeJournal, Num: db.s.allocFileNum()} - w, err := db.s.stor.Create(fd) - if err != nil { - db.s.reuseFileNum(fd.Num) - return - } - - db.memMu.Lock() - defer db.memMu.Unlock() - - if db.frozenMem != nil { - return nil, errHasFrozenMem - } - - if db.journal == nil { - db.journal = journal.NewWriter(w) - } else { - db.journal.Reset(w) - db.journalWriter.Close() - db.frozenJournalFd = db.journalFd - } - db.journalWriter = w - db.journalFd = fd - db.frozenMem = db.mem - mem = db.mpoolGet(n) - mem.incref() // for self - mem.incref() // for caller - db.mem = mem - // The seq only incremented by the writer. And whoever called newMem - // should hold write lock, so no need additional synchronization here. - db.frozenSeq = db.seq - return -} - -// Get all memdbs. -func (db *DB) getMems() (e, f *memDB) { - db.memMu.RLock() - defer db.memMu.RUnlock() - if db.mem != nil { - db.mem.incref() - } else if !db.isClosed() { - panic("nil effective mem") - } - if db.frozenMem != nil { - db.frozenMem.incref() - } - return db.mem, db.frozenMem -} - -// Get effective memdb. -func (db *DB) getEffectiveMem() *memDB { - db.memMu.RLock() - defer db.memMu.RUnlock() - if db.mem != nil { - db.mem.incref() - } else if !db.isClosed() { - panic("nil effective mem") - } - return db.mem -} - -// Check whether we has frozen memdb. -func (db *DB) hasFrozenMem() bool { - db.memMu.RLock() - defer db.memMu.RUnlock() - return db.frozenMem != nil -} - -// Get frozen memdb. -func (db *DB) getFrozenMem() *memDB { - db.memMu.RLock() - defer db.memMu.RUnlock() - if db.frozenMem != nil { - db.frozenMem.incref() - } - return db.frozenMem -} - -// Drop frozen memdb; assume that frozen memdb isn't nil. -func (db *DB) dropFrozenMem() { - db.memMu.Lock() - if err := db.s.stor.Remove(db.frozenJournalFd); err != nil { - db.logf("journal@remove removing @%d %q", db.frozenJournalFd.Num, err) - } else { - db.logf("journal@remove removed @%d", db.frozenJournalFd.Num) - } - db.frozenJournalFd = storage.FileDesc{} - db.frozenMem.decref() - db.frozenMem = nil - db.memMu.Unlock() -} - -// Clear mems ptr; used by DB.Close(). -func (db *DB) clearMems() { - db.memMu.Lock() - db.mem = nil - db.frozenMem = nil - db.memMu.Unlock() -} - -// Set closed flag; return true if not already closed. -func (db *DB) setClosed() bool { - return atomic.CompareAndSwapUint32(&db.closed, 0, 1) -} - -// Check whether DB was closed. -func (db *DB) isClosed() bool { - return atomic.LoadUint32(&db.closed) != 0 -} - -// Check read ok status. -func (db *DB) ok() error { - if db.isClosed() { - return ErrClosed - } - return nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go deleted file mode 100644 index b8f7e7d21dfa..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_transaction.go +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright (c) 2016, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "errors" - "sync" - "time" - - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/util" -) - -var errTransactionDone = errors.New("leveldb: transaction already closed") - -// Transaction is the transaction handle. -type Transaction struct { - db *DB - lk sync.RWMutex - seq uint64 - mem *memDB - tables tFiles - ikScratch []byte - rec sessionRecord - stats cStatStaging - closed bool -} - -// Get gets the value for the given key. It returns ErrNotFound if the -// DB does not contains the key. -// -// The returned slice is its own copy, it is safe to modify the contents -// of the returned slice. -// It is safe to modify the contents of the argument after Get returns. -func (tr *Transaction) Get(key []byte, ro *opt.ReadOptions) ([]byte, error) { - tr.lk.RLock() - defer tr.lk.RUnlock() - if tr.closed { - return nil, errTransactionDone - } - return tr.db.get(tr.mem.DB, tr.tables, key, tr.seq, ro) -} - -// Has returns true if the DB does contains the given key. -// -// It is safe to modify the contents of the argument after Has returns. -func (tr *Transaction) Has(key []byte, ro *opt.ReadOptions) (bool, error) { - tr.lk.RLock() - defer tr.lk.RUnlock() - if tr.closed { - return false, errTransactionDone - } - return tr.db.has(tr.mem.DB, tr.tables, key, tr.seq, ro) -} - -// NewIterator returns an iterator for the latest snapshot of the transaction. -// The returned iterator is not safe for concurrent use, but it is safe to use -// multiple iterators concurrently, with each in a dedicated goroutine. -// It is also safe to use an iterator concurrently while writes to the -// transaction. The resultant key/value pairs are guaranteed to be consistent. -// -// Slice allows slicing the iterator to only contains keys in the given -// range. A nil Range.Start is treated as a key before all keys in the -// DB. And a nil Range.Limit is treated as a key after all keys in -// the DB. -// -// The iterator must be released after use, by calling Release method. -// -// Also read Iterator documentation of the leveldb/iterator package. -func (tr *Transaction) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { - tr.lk.RLock() - defer tr.lk.RUnlock() - if tr.closed { - return iterator.NewEmptyIterator(errTransactionDone) - } - tr.mem.incref() - return tr.db.newIterator(tr.mem, tr.tables, tr.seq, slice, ro) -} - -func (tr *Transaction) flush() error { - // Flush memdb. - if tr.mem.Len() != 0 { - tr.stats.startTimer() - iter := tr.mem.NewIterator(nil) - t, n, err := tr.db.s.tops.createFrom(iter) - iter.Release() - tr.stats.stopTimer() - if err != nil { - return err - } - if tr.mem.getref() == 1 { - tr.mem.Reset() - } else { - tr.mem.decref() - tr.mem = tr.db.mpoolGet(0) - tr.mem.incref() - } - tr.tables = append(tr.tables, t) - tr.rec.addTableFile(0, t) - tr.stats.write += t.size - tr.db.logf("transaction@flush created L0@%d N·%d S·%s %q:%q", t.fd.Num, n, shortenb(int(t.size)), t.imin, t.imax) - } - return nil -} - -func (tr *Transaction) put(kt keyType, key, value []byte) error { - tr.ikScratch = makeInternalKey(tr.ikScratch, key, tr.seq+1, kt) - if tr.mem.Free() < len(tr.ikScratch)+len(value) { - if err := tr.flush(); err != nil { - return err - } - } - if err := tr.mem.Put(tr.ikScratch, value); err != nil { - return err - } - tr.seq++ - return nil -} - -// Put sets the value for the given key. It overwrites any previous value -// for that key; a DB is not a multi-map. -// Please note that the transaction is not compacted until committed, so if you -// writes 10 same keys, then those 10 same keys are in the transaction. -// -// It is safe to modify the contents of the arguments after Put returns. -func (tr *Transaction) Put(key, value []byte, wo *opt.WriteOptions) error { - tr.lk.Lock() - defer tr.lk.Unlock() - if tr.closed { - return errTransactionDone - } - return tr.put(keyTypeVal, key, value) -} - -// Delete deletes the value for the given key. -// Please note that the transaction is not compacted until committed, so if you -// writes 10 same keys, then those 10 same keys are in the transaction. -// -// It is safe to modify the contents of the arguments after Delete returns. -func (tr *Transaction) Delete(key []byte, wo *opt.WriteOptions) error { - tr.lk.Lock() - defer tr.lk.Unlock() - if tr.closed { - return errTransactionDone - } - return tr.put(keyTypeDel, key, nil) -} - -// Write apply the given batch to the transaction. The batch will be applied -// sequentially. -// Please note that the transaction is not compacted until committed, so if you -// writes 10 same keys, then those 10 same keys are in the transaction. -// -// It is safe to modify the contents of the arguments after Write returns. -func (tr *Transaction) Write(b *Batch, wo *opt.WriteOptions) error { - if b == nil || b.Len() == 0 { - return nil - } - - tr.lk.Lock() - defer tr.lk.Unlock() - if tr.closed { - return errTransactionDone - } - return b.replayInternal(func(i int, kt keyType, k, v []byte) error { - return tr.put(kt, k, v) - }) -} - -func (tr *Transaction) setDone() { - tr.closed = true - tr.db.tr = nil - tr.mem.decref() - <-tr.db.writeLockC -} - -// Commit commits the transaction. If error is not nil, then the transaction is -// not committed, it can then either be retried or discarded. -// -// Other methods should not be called after transaction has been committed. -func (tr *Transaction) Commit() error { - if err := tr.db.ok(); err != nil { - return err - } - - tr.lk.Lock() - defer tr.lk.Unlock() - if tr.closed { - return errTransactionDone - } - if err := tr.flush(); err != nil { - // Return error, lets user decide either to retry or discard - // transaction. - return err - } - if len(tr.tables) != 0 { - // Committing transaction. - tr.rec.setSeqNum(tr.seq) - tr.db.compCommitLk.Lock() - tr.stats.startTimer() - var cerr error - for retry := 0; retry < 3; retry++ { - cerr = tr.db.s.commit(&tr.rec) - if cerr != nil { - tr.db.logf("transaction@commit error R·%d %q", retry, cerr) - select { - case <-time.After(time.Second): - case <-tr.db.closeC: - tr.db.logf("transaction@commit exiting") - tr.db.compCommitLk.Unlock() - return cerr - } - } else { - // Success. Set db.seq. - tr.db.setSeq(tr.seq) - break - } - } - tr.stats.stopTimer() - if cerr != nil { - // Return error, lets user decide either to retry or discard - // transaction. - return cerr - } - - // Update compaction stats. This is safe as long as we hold compCommitLk. - tr.db.compStats.addStat(0, &tr.stats) - - // Trigger table auto-compaction. - tr.db.compTrigger(tr.db.tcompCmdC) - tr.db.compCommitLk.Unlock() - - // Additionally, wait compaction when certain threshold reached. - // Ignore error, returns error only if transaction can't be committed. - tr.db.waitCompaction() - } - // Only mark as done if transaction committed successfully. - tr.setDone() - return nil -} - -func (tr *Transaction) discard() { - // Discard transaction. - for _, t := range tr.tables { - tr.db.logf("transaction@discard @%d", t.fd.Num) - if err1 := tr.db.s.stor.Remove(t.fd); err1 == nil { - tr.db.s.reuseFileNum(t.fd.Num) - } - } -} - -// Discard discards the transaction. -// -// Other methods should not be called after transaction has been discarded. -func (tr *Transaction) Discard() { - tr.lk.Lock() - if !tr.closed { - tr.discard() - tr.setDone() - } - tr.lk.Unlock() -} - -func (db *DB) waitCompaction() error { - if db.s.tLen(0) >= db.s.o.GetWriteL0PauseTrigger() { - return db.compTriggerWait(db.tcompCmdC) - } - return nil -} - -// OpenTransaction opens an atomic DB transaction. Only one transaction can be -// opened at a time. Subsequent call to Write and OpenTransaction will be blocked -// until in-flight transaction is committed or discarded. -// The returned transaction handle is safe for concurrent use. -// -// Transaction is expensive and can overwhelm compaction, especially if -// transaction size is small. Use with caution. -// -// The transaction must be closed once done, either by committing or discarding -// the transaction. -// Closing the DB will discard open transaction. -func (db *DB) OpenTransaction() (*Transaction, error) { - if err := db.ok(); err != nil { - return nil, err - } - - // The write happen synchronously. - select { - case db.writeLockC <- struct{}{}: - case err := <-db.compPerErrC: - return nil, err - case <-db.closeC: - return nil, ErrClosed - } - - if db.tr != nil { - panic("leveldb: has open transaction") - } - - // Flush current memdb. - if db.mem != nil && db.mem.Len() != 0 { - if _, err := db.rotateMem(0, true); err != nil { - return nil, err - } - } - - // Wait compaction when certain threshold reached. - if err := db.waitCompaction(); err != nil { - return nil, err - } - - tr := &Transaction{ - db: db, - seq: db.seq, - mem: db.mpoolGet(0), - } - tr.mem.incref() - db.tr = tr - return tr, nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_util.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_util.go deleted file mode 100644 index 3f0654894b44..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_util.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/storage" - "github.com/syndtr/goleveldb/leveldb/util" -) - -// Reader is the interface that wraps basic Get and NewIterator methods. -// This interface implemented by both DB and Snapshot. -type Reader interface { - Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) - NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator -} - -// Sizes is list of size. -type Sizes []int64 - -// Sum returns sum of the sizes. -func (sizes Sizes) Sum() int64 { - var sum int64 - for _, size := range sizes { - sum += size - } - return sum -} - -// Logging. -func (db *DB) log(v ...interface{}) { db.s.log(v...) } -func (db *DB) logf(format string, v ...interface{}) { db.s.logf(format, v...) } - -// Check and clean files. -func (db *DB) checkAndCleanFiles() error { - v := db.s.version() - defer v.release() - - tmap := make(map[int64]bool) - for _, tables := range v.levels { - for _, t := range tables { - tmap[t.fd.Num] = false - } - } - - fds, err := db.s.stor.List(storage.TypeAll) - if err != nil { - return err - } - - var nt int - var rem []storage.FileDesc - for _, fd := range fds { - keep := true - switch fd.Type { - case storage.TypeManifest: - keep = fd.Num >= db.s.manifestFd.Num - case storage.TypeJournal: - if !db.frozenJournalFd.Zero() { - keep = fd.Num >= db.frozenJournalFd.Num - } else { - keep = fd.Num >= db.journalFd.Num - } - case storage.TypeTable: - _, keep = tmap[fd.Num] - if keep { - tmap[fd.Num] = true - nt++ - } - } - - if !keep { - rem = append(rem, fd) - } - } - - if nt != len(tmap) { - var mfds []storage.FileDesc - for num, present := range tmap { - if !present { - mfds = append(mfds, storage.FileDesc{Type: storage.TypeTable, Num: num}) - db.logf("db@janitor table missing @%d", num) - } - } - return errors.NewErrCorrupted(storage.FileDesc{}, &errors.ErrMissingFiles{Fds: mfds}) - } - - db.logf("db@janitor F·%d G·%d", len(fds), len(rem)) - for _, fd := range rem { - db.logf("db@janitor removing %s-%d", fd.Type, fd.Num) - if err := db.s.stor.Remove(fd); err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go b/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go deleted file mode 100644 index db0c1bece1db..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/db_write.go +++ /dev/null @@ -1,464 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "sync/atomic" - "time" - - "github.com/syndtr/goleveldb/leveldb/memdb" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/util" -) - -func (db *DB) writeJournal(batches []*Batch, seq uint64, sync bool) error { - wr, err := db.journal.Next() - if err != nil { - return err - } - if err := writeBatchesWithHeader(wr, batches, seq); err != nil { - return err - } - if err := db.journal.Flush(); err != nil { - return err - } - if sync { - return db.journalWriter.Sync() - } - return nil -} - -func (db *DB) rotateMem(n int, wait bool) (mem *memDB, err error) { - retryLimit := 3 -retry: - // Wait for pending memdb compaction. - err = db.compTriggerWait(db.mcompCmdC) - if err != nil { - return - } - retryLimit-- - - // Create new memdb and journal. - mem, err = db.newMem(n) - if err != nil { - if err == errHasFrozenMem { - if retryLimit <= 0 { - panic("BUG: still has frozen memdb") - } - goto retry - } - return - } - - // Schedule memdb compaction. - if wait { - err = db.compTriggerWait(db.mcompCmdC) - } else { - db.compTrigger(db.mcompCmdC) - } - return -} - -func (db *DB) flush(n int) (mdb *memDB, mdbFree int, err error) { - delayed := false - slowdownTrigger := db.s.o.GetWriteL0SlowdownTrigger() - pauseTrigger := db.s.o.GetWriteL0PauseTrigger() - flush := func() (retry bool) { - mdb = db.getEffectiveMem() - if mdb == nil { - err = ErrClosed - return false - } - defer func() { - if retry { - mdb.decref() - mdb = nil - } - }() - tLen := db.s.tLen(0) - mdbFree = mdb.Free() - switch { - case tLen >= slowdownTrigger && !delayed: - delayed = true - time.Sleep(time.Millisecond) - case mdbFree >= n: - return false - case tLen >= pauseTrigger: - delayed = true - // Set the write paused flag explicitly. - atomic.StoreInt32(&db.inWritePaused, 1) - err = db.compTriggerWait(db.tcompCmdC) - // Unset the write paused flag. - atomic.StoreInt32(&db.inWritePaused, 0) - if err != nil { - return false - } - default: - // Allow memdb to grow if it has no entry. - if mdb.Len() == 0 { - mdbFree = n - } else { - mdb.decref() - mdb, err = db.rotateMem(n, false) - if err == nil { - mdbFree = mdb.Free() - } else { - mdbFree = 0 - } - } - return false - } - return true - } - start := time.Now() - for flush() { - } - if delayed { - db.writeDelay += time.Since(start) - db.writeDelayN++ - } else if db.writeDelayN > 0 { - db.logf("db@write was delayed N·%d T·%v", db.writeDelayN, db.writeDelay) - atomic.AddInt32(&db.cWriteDelayN, int32(db.writeDelayN)) - atomic.AddInt64(&db.cWriteDelay, int64(db.writeDelay)) - db.writeDelay = 0 - db.writeDelayN = 0 - } - return -} - -type writeMerge struct { - sync bool - batch *Batch - keyType keyType - key, value []byte -} - -func (db *DB) unlockWrite(overflow bool, merged int, err error) { - for i := 0; i < merged; i++ { - db.writeAckC <- err - } - if overflow { - // Pass lock to the next write (that failed to merge). - db.writeMergedC <- false - } else { - // Release lock. - <-db.writeLockC - } -} - -// ourBatch is batch that we can modify. -func (db *DB) writeLocked(batch, ourBatch *Batch, merge, sync bool) error { - // Try to flush memdb. This method would also trying to throttle writes - // if it is too fast and compaction cannot catch-up. - mdb, mdbFree, err := db.flush(batch.internalLen) - if err != nil { - db.unlockWrite(false, 0, err) - return err - } - defer mdb.decref() - - var ( - overflow bool - merged int - batches = []*Batch{batch} - ) - - if merge { - // Merge limit. - var mergeLimit int - if batch.internalLen > 128<<10 { - mergeLimit = (1 << 20) - batch.internalLen - } else { - mergeLimit = 128 << 10 - } - mergeCap := mdbFree - batch.internalLen - if mergeLimit > mergeCap { - mergeLimit = mergeCap - } - - merge: - for mergeLimit > 0 { - select { - case incoming := <-db.writeMergeC: - if incoming.batch != nil { - // Merge batch. - if incoming.batch.internalLen > mergeLimit { - overflow = true - break merge - } - batches = append(batches, incoming.batch) - mergeLimit -= incoming.batch.internalLen - } else { - // Merge put. - internalLen := len(incoming.key) + len(incoming.value) + 8 - if internalLen > mergeLimit { - overflow = true - break merge - } - if ourBatch == nil { - ourBatch = db.batchPool.Get().(*Batch) - ourBatch.Reset() - batches = append(batches, ourBatch) - } - // We can use same batch since concurrent write doesn't - // guarantee write order. - ourBatch.appendRec(incoming.keyType, incoming.key, incoming.value) - mergeLimit -= internalLen - } - sync = sync || incoming.sync - merged++ - db.writeMergedC <- true - - default: - break merge - } - } - } - - // Release ourBatch if any. - if ourBatch != nil { - defer db.batchPool.Put(ourBatch) - } - - // Seq number. - seq := db.seq + 1 - - // Write journal. - if err := db.writeJournal(batches, seq, sync); err != nil { - db.unlockWrite(overflow, merged, err) - return err - } - - // Put batches. - for _, batch := range batches { - if err := batch.putMem(seq, mdb.DB); err != nil { - panic(err) - } - seq += uint64(batch.Len()) - } - - // Incr seq number. - db.addSeq(uint64(batchesLen(batches))) - - // Rotate memdb if it's reach the threshold. - if batch.internalLen >= mdbFree { - db.rotateMem(0, false) - } - - db.unlockWrite(overflow, merged, nil) - return nil -} - -// Write apply the given batch to the DB. The batch records will be applied -// sequentially. Write might be used concurrently, when used concurrently and -// batch is small enough, write will try to merge the batches. Set NoWriteMerge -// option to true to disable write merge. -// -// It is safe to modify the contents of the arguments after Write returns but -// not before. Write will not modify content of the batch. -func (db *DB) Write(batch *Batch, wo *opt.WriteOptions) error { - if err := db.ok(); err != nil || batch == nil || batch.Len() == 0 { - return err - } - - // If the batch size is larger than write buffer, it may justified to write - // using transaction instead. Using transaction the batch will be written - // into tables directly, skipping the journaling. - if batch.internalLen > db.s.o.GetWriteBuffer() && !db.s.o.GetDisableLargeBatchTransaction() { - tr, err := db.OpenTransaction() - if err != nil { - return err - } - if err := tr.Write(batch, wo); err != nil { - tr.Discard() - return err - } - return tr.Commit() - } - - merge := !wo.GetNoWriteMerge() && !db.s.o.GetNoWriteMerge() - sync := wo.GetSync() && !db.s.o.GetNoSync() - - // Acquire write lock. - if merge { - select { - case db.writeMergeC <- writeMerge{sync: sync, batch: batch}: - if <-db.writeMergedC { - // Write is merged. - return <-db.writeAckC - } - // Write is not merged, the write lock is handed to us. Continue. - case db.writeLockC <- struct{}{}: - // Write lock acquired. - case err := <-db.compPerErrC: - // Compaction error. - return err - case <-db.closeC: - // Closed - return ErrClosed - } - } else { - select { - case db.writeLockC <- struct{}{}: - // Write lock acquired. - case err := <-db.compPerErrC: - // Compaction error. - return err - case <-db.closeC: - // Closed - return ErrClosed - } - } - - return db.writeLocked(batch, nil, merge, sync) -} - -func (db *DB) putRec(kt keyType, key, value []byte, wo *opt.WriteOptions) error { - if err := db.ok(); err != nil { - return err - } - - merge := !wo.GetNoWriteMerge() && !db.s.o.GetNoWriteMerge() - sync := wo.GetSync() && !db.s.o.GetNoSync() - - // Acquire write lock. - if merge { - select { - case db.writeMergeC <- writeMerge{sync: sync, keyType: kt, key: key, value: value}: - if <-db.writeMergedC { - // Write is merged. - return <-db.writeAckC - } - // Write is not merged, the write lock is handed to us. Continue. - case db.writeLockC <- struct{}{}: - // Write lock acquired. - case err := <-db.compPerErrC: - // Compaction error. - return err - case <-db.closeC: - // Closed - return ErrClosed - } - } else { - select { - case db.writeLockC <- struct{}{}: - // Write lock acquired. - case err := <-db.compPerErrC: - // Compaction error. - return err - case <-db.closeC: - // Closed - return ErrClosed - } - } - - batch := db.batchPool.Get().(*Batch) - batch.Reset() - batch.appendRec(kt, key, value) - return db.writeLocked(batch, batch, merge, sync) -} - -// Put sets the value for the given key. It overwrites any previous value -// for that key; a DB is not a multi-map. Write merge also applies for Put, see -// Write. -// -// It is safe to modify the contents of the arguments after Put returns but not -// before. -func (db *DB) Put(key, value []byte, wo *opt.WriteOptions) error { - return db.putRec(keyTypeVal, key, value, wo) -} - -// Delete deletes the value for the given key. Delete will not returns error if -// key doesn't exist. Write merge also applies for Delete, see Write. -// -// It is safe to modify the contents of the arguments after Delete returns but -// not before. -func (db *DB) Delete(key []byte, wo *opt.WriteOptions) error { - return db.putRec(keyTypeDel, key, nil, wo) -} - -func isMemOverlaps(icmp *iComparer, mem *memdb.DB, min, max []byte) bool { - iter := mem.NewIterator(nil) - defer iter.Release() - return (max == nil || (iter.First() && icmp.uCompare(max, internalKey(iter.Key()).ukey()) >= 0)) && - (min == nil || (iter.Last() && icmp.uCompare(min, internalKey(iter.Key()).ukey()) <= 0)) -} - -// CompactRange compacts the underlying DB for the given key range. -// In particular, deleted and overwritten versions are discarded, -// and the data is rearranged to reduce the cost of operations -// needed to access the data. This operation should typically only -// be invoked by users who understand the underlying implementation. -// -// A nil Range.Start is treated as a key before all keys in the DB. -// And a nil Range.Limit is treated as a key after all keys in the DB. -// Therefore if both is nil then it will compact entire DB. -func (db *DB) CompactRange(r util.Range) error { - if err := db.ok(); err != nil { - return err - } - - // Lock writer. - select { - case db.writeLockC <- struct{}{}: - case err := <-db.compPerErrC: - return err - case <-db.closeC: - return ErrClosed - } - - // Check for overlaps in memdb. - mdb := db.getEffectiveMem() - if mdb == nil { - return ErrClosed - } - defer mdb.decref() - if isMemOverlaps(db.s.icmp, mdb.DB, r.Start, r.Limit) { - // Memdb compaction. - if _, err := db.rotateMem(0, false); err != nil { - <-db.writeLockC - return err - } - <-db.writeLockC - if err := db.compTriggerWait(db.mcompCmdC); err != nil { - return err - } - } else { - <-db.writeLockC - } - - // Table compaction. - return db.compTriggerRange(db.tcompCmdC, -1, r.Start, r.Limit) -} - -// SetReadOnly makes DB read-only. It will stay read-only until reopened. -func (db *DB) SetReadOnly() error { - if err := db.ok(); err != nil { - return err - } - - // Lock writer. - select { - case db.writeLockC <- struct{}{}: - db.compWriteLocking = true - case err := <-db.compPerErrC: - return err - case <-db.closeC: - return ErrClosed - } - - // Set compaction read-only. - select { - case db.compErrSetC <- ErrReadOnly: - case perr := <-db.compPerErrC: - return perr - case <-db.closeC: - return ErrClosed - } - - return nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/doc.go b/vendor/github.com/syndtr/goleveldb/leveldb/doc.go deleted file mode 100644 index be768e5739f7..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/doc.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package leveldb provides implementation of LevelDB key/value database. -// -// Create or open a database: -// -// // The returned DB instance is safe for concurrent use. Which mean that all -// // DB's methods may be called concurrently from multiple goroutine. -// db, err := leveldb.OpenFile("path/to/db", nil) -// ... -// defer db.Close() -// ... -// -// Read or modify the database content: -// -// // Remember that the contents of the returned slice should not be modified. -// data, err := db.Get([]byte("key"), nil) -// ... -// err = db.Put([]byte("key"), []byte("value"), nil) -// ... -// err = db.Delete([]byte("key"), nil) -// ... -// -// Iterate over database content: -// -// iter := db.NewIterator(nil, nil) -// for iter.Next() { -// // Remember that the contents of the returned slice should not be modified, and -// // only valid until the next call to Next. -// key := iter.Key() -// value := iter.Value() -// ... -// } -// iter.Release() -// err = iter.Error() -// ... -// -// Iterate over subset of database content with a particular prefix: -// iter := db.NewIterator(util.BytesPrefix([]byte("foo-")), nil) -// for iter.Next() { -// // Use key/value. -// ... -// } -// iter.Release() -// err = iter.Error() -// ... -// -// Seek-then-Iterate: -// -// iter := db.NewIterator(nil, nil) -// for ok := iter.Seek(key); ok; ok = iter.Next() { -// // Use key/value. -// ... -// } -// iter.Release() -// err = iter.Error() -// ... -// -// Iterate over subset of database content: -// -// iter := db.NewIterator(&util.Range{Start: []byte("foo"), Limit: []byte("xoo")}, nil) -// for iter.Next() { -// // Use key/value. -// ... -// } -// iter.Release() -// err = iter.Error() -// ... -// -// Batch writes: -// -// batch := new(leveldb.Batch) -// batch.Put([]byte("foo"), []byte("value")) -// batch.Put([]byte("bar"), []byte("another value")) -// batch.Delete([]byte("baz")) -// err = db.Write(batch, nil) -// ... -// -// Use bloom filter: -// -// o := &opt.Options{ -// Filter: filter.NewBloomFilter(10), -// } -// db, err := leveldb.OpenFile("path/to/db", o) -// ... -// defer db.Close() -// ... -package leveldb diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/errors.go b/vendor/github.com/syndtr/goleveldb/leveldb/errors.go deleted file mode 100644 index de2649812c20..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/errors.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) 2014, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "github.com/syndtr/goleveldb/leveldb/errors" -) - -// Common errors. -var ( - ErrNotFound = errors.ErrNotFound - ErrReadOnly = errors.New("leveldb: read-only mode") - ErrSnapshotReleased = errors.New("leveldb: snapshot released") - ErrIterReleased = errors.New("leveldb: iterator released") - ErrClosed = errors.New("leveldb: closed") -) diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/errors/errors.go b/vendor/github.com/syndtr/goleveldb/leveldb/errors/errors.go deleted file mode 100644 index 8d6146b6f5c6..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/errors/errors.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2014, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package errors provides common error types used throughout leveldb. -package errors - -import ( - "errors" - "fmt" - - "github.com/syndtr/goleveldb/leveldb/storage" - "github.com/syndtr/goleveldb/leveldb/util" -) - -// Common errors. -var ( - ErrNotFound = New("leveldb: not found") - ErrReleased = util.ErrReleased - ErrHasReleaser = util.ErrHasReleaser -) - -// New returns an error that formats as the given text. -func New(text string) error { - return errors.New(text) -} - -// ErrCorrupted is the type that wraps errors that indicate corruption in -// the database. -type ErrCorrupted struct { - Fd storage.FileDesc - Err error -} - -func (e *ErrCorrupted) Error() string { - if !e.Fd.Zero() { - return fmt.Sprintf("%v [file=%v]", e.Err, e.Fd) - } - return e.Err.Error() -} - -// NewErrCorrupted creates new ErrCorrupted error. -func NewErrCorrupted(fd storage.FileDesc, err error) error { - return &ErrCorrupted{fd, err} -} - -// IsCorrupted returns a boolean indicating whether the error is indicating -// a corruption. -func IsCorrupted(err error) bool { - switch err.(type) { - case *ErrCorrupted: - return true - case *storage.ErrCorrupted: - return true - } - return false -} - -// ErrMissingFiles is the type that indicating a corruption due to missing -// files. ErrMissingFiles always wrapped with ErrCorrupted. -type ErrMissingFiles struct { - Fds []storage.FileDesc -} - -func (e *ErrMissingFiles) Error() string { return "file missing" } - -// SetFd sets 'file info' of the given error with the given file. -// Currently only ErrCorrupted is supported, otherwise will do nothing. -func SetFd(err error, fd storage.FileDesc) error { - switch x := err.(type) { - case *ErrCorrupted: - x.Fd = fd - return x - } - return err -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/filter.go b/vendor/github.com/syndtr/goleveldb/leveldb/filter.go deleted file mode 100644 index e961e420d3c4..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/filter.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "github.com/syndtr/goleveldb/leveldb/filter" -) - -type iFilter struct { - filter.Filter -} - -func (f iFilter) Contains(filter, key []byte) bool { - return f.Filter.Contains(filter, internalKey(key).ukey()) -} - -func (f iFilter) NewGenerator() filter.FilterGenerator { - return iFilterGenerator{f.Filter.NewGenerator()} -} - -type iFilterGenerator struct { - filter.FilterGenerator -} - -func (g iFilterGenerator) Add(key []byte) { - g.FilterGenerator.Add(internalKey(key).ukey()) -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/filter/bloom.go b/vendor/github.com/syndtr/goleveldb/leveldb/filter/bloom.go deleted file mode 100644 index bab0e99705f5..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/filter/bloom.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package filter - -import ( - "github.com/syndtr/goleveldb/leveldb/util" -) - -func bloomHash(key []byte) uint32 { - return util.Hash(key, 0xbc9f1d34) -} - -type bloomFilter int - -// The bloom filter serializes its parameters and is backward compatible -// with respect to them. Therefor, its parameters are not added to its -// name. -func (bloomFilter) Name() string { - return "leveldb.BuiltinBloomFilter" -} - -func (f bloomFilter) Contains(filter, key []byte) bool { - nBytes := len(filter) - 1 - if nBytes < 1 { - return false - } - nBits := uint32(nBytes * 8) - - // Use the encoded k so that we can read filters generated by - // bloom filters created using different parameters. - k := filter[nBytes] - if k > 30 { - // Reserved for potentially new encodings for short bloom filters. - // Consider it a match. - return true - } - - kh := bloomHash(key) - delta := (kh >> 17) | (kh << 15) // Rotate right 17 bits - for j := uint8(0); j < k; j++ { - bitpos := kh % nBits - if (uint32(filter[bitpos/8]) & (1 << (bitpos % 8))) == 0 { - return false - } - kh += delta - } - return true -} - -func (f bloomFilter) NewGenerator() FilterGenerator { - // Round down to reduce probing cost a little bit. - k := uint8(f * 69 / 100) // 0.69 =~ ln(2) - if k < 1 { - k = 1 - } else if k > 30 { - k = 30 - } - return &bloomFilterGenerator{ - n: int(f), - k: k, - } -} - -type bloomFilterGenerator struct { - n int - k uint8 - - keyHashes []uint32 -} - -func (g *bloomFilterGenerator) Add(key []byte) { - // Use double-hashing to generate a sequence of hash values. - // See analysis in [Kirsch,Mitzenmacher 2006]. - g.keyHashes = append(g.keyHashes, bloomHash(key)) -} - -func (g *bloomFilterGenerator) Generate(b Buffer) { - // Compute bloom filter size (in both bits and bytes) - nBits := uint32(len(g.keyHashes) * g.n) - // For small n, we can see a very high false positive rate. Fix it - // by enforcing a minimum bloom filter length. - if nBits < 64 { - nBits = 64 - } - nBytes := (nBits + 7) / 8 - nBits = nBytes * 8 - - dest := b.Alloc(int(nBytes) + 1) - dest[nBytes] = g.k - for _, kh := range g.keyHashes { - delta := (kh >> 17) | (kh << 15) // Rotate right 17 bits - for j := uint8(0); j < g.k; j++ { - bitpos := kh % nBits - dest[bitpos/8] |= (1 << (bitpos % 8)) - kh += delta - } - } - - g.keyHashes = g.keyHashes[:0] -} - -// NewBloomFilter creates a new initialized bloom filter for given -// bitsPerKey. -// -// Since bitsPerKey is persisted individually for each bloom filter -// serialization, bloom filters are backwards compatible with respect to -// changing bitsPerKey. This means that no big performance penalty will -// be experienced when changing the parameter. See documentation for -// opt.Options.Filter for more information. -func NewBloomFilter(bitsPerKey int) Filter { - return bloomFilter(bitsPerKey) -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/filter/filter.go b/vendor/github.com/syndtr/goleveldb/leveldb/filter/filter.go deleted file mode 100644 index 7a925c5a869e..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/filter/filter.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package filter provides interface and implementation of probabilistic -// data structure. -// -// The filter is resposible for creating small filter from a set of keys. -// These filter will then used to test whether a key is a member of the set. -// In many cases, a filter can cut down the number of disk seeks from a -// handful to a single disk seek per DB.Get call. -package filter - -// Buffer is the interface that wraps basic Alloc, Write and WriteByte methods. -type Buffer interface { - // Alloc allocs n bytes of slice from the buffer. This also advancing - // write offset. - Alloc(n int) []byte - - // Write appends the contents of p to the buffer. - Write(p []byte) (n int, err error) - - // WriteByte appends the byte c to the buffer. - WriteByte(c byte) error -} - -// Filter is the filter. -type Filter interface { - // Name returns the name of this policy. - // - // Note that if the filter encoding changes in an incompatible way, - // the name returned by this method must be changed. Otherwise, old - // incompatible filters may be passed to methods of this type. - Name() string - - // NewGenerator creates a new filter generator. - NewGenerator() FilterGenerator - - // Contains returns true if the filter contains the given key. - // - // The filter are filters generated by the filter generator. - Contains(filter, key []byte) bool -} - -// FilterGenerator is the filter generator. -type FilterGenerator interface { - // Add adds a key to the filter generator. - // - // The key may become invalid after call to this method end, therefor - // key must be copied if implementation require keeping key for later - // use. The key should not modified directly, doing so may cause - // undefined results. - Add(key []byte) - - // Generate generates filters based on keys passed so far. After call - // to Generate the filter generator maybe resetted, depends on implementation. - Generate(b Buffer) -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/array_iter.go b/vendor/github.com/syndtr/goleveldb/leveldb/iterator/array_iter.go deleted file mode 100644 index a23ab05f70fe..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/array_iter.go +++ /dev/null @@ -1,184 +0,0 @@ -// Copyright (c) 2014, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package iterator - -import ( - "github.com/syndtr/goleveldb/leveldb/util" -) - -// BasicArray is the interface that wraps basic Len and Search method. -type BasicArray interface { - // Len returns length of the array. - Len() int - - // Search finds smallest index that point to a key that is greater - // than or equal to the given key. - Search(key []byte) int -} - -// Array is the interface that wraps BasicArray and basic Index method. -type Array interface { - BasicArray - - // Index returns key/value pair with index of i. - Index(i int) (key, value []byte) -} - -// Array is the interface that wraps BasicArray and basic Get method. -type ArrayIndexer interface { - BasicArray - - // Get returns a new data iterator with index of i. - Get(i int) Iterator -} - -type basicArrayIterator struct { - util.BasicReleaser - array BasicArray - pos int - err error -} - -func (i *basicArrayIterator) Valid() bool { - return i.pos >= 0 && i.pos < i.array.Len() && !i.Released() -} - -func (i *basicArrayIterator) First() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - if i.array.Len() == 0 { - i.pos = -1 - return false - } - i.pos = 0 - return true -} - -func (i *basicArrayIterator) Last() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - n := i.array.Len() - if n == 0 { - i.pos = 0 - return false - } - i.pos = n - 1 - return true -} - -func (i *basicArrayIterator) Seek(key []byte) bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - n := i.array.Len() - if n == 0 { - i.pos = 0 - return false - } - i.pos = i.array.Search(key) - if i.pos >= n { - return false - } - return true -} - -func (i *basicArrayIterator) Next() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - i.pos++ - if n := i.array.Len(); i.pos >= n { - i.pos = n - return false - } - return true -} - -func (i *basicArrayIterator) Prev() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - i.pos-- - if i.pos < 0 { - i.pos = -1 - return false - } - return true -} - -func (i *basicArrayIterator) Error() error { return i.err } - -type arrayIterator struct { - basicArrayIterator - array Array - pos int - key, value []byte -} - -func (i *arrayIterator) updateKV() { - if i.pos == i.basicArrayIterator.pos { - return - } - i.pos = i.basicArrayIterator.pos - if i.Valid() { - i.key, i.value = i.array.Index(i.pos) - } else { - i.key = nil - i.value = nil - } -} - -func (i *arrayIterator) Key() []byte { - i.updateKV() - return i.key -} - -func (i *arrayIterator) Value() []byte { - i.updateKV() - return i.value -} - -type arrayIteratorIndexer struct { - basicArrayIterator - array ArrayIndexer -} - -func (i *arrayIteratorIndexer) Get() Iterator { - if i.Valid() { - return i.array.Get(i.basicArrayIterator.pos) - } - return nil -} - -// NewArrayIterator returns an iterator from the given array. -func NewArrayIterator(array Array) Iterator { - return &arrayIterator{ - basicArrayIterator: basicArrayIterator{array: array, pos: -1}, - array: array, - pos: -1, - } -} - -// NewArrayIndexer returns an index iterator from the given array. -func NewArrayIndexer(array ArrayIndexer) IteratorIndexer { - return &arrayIteratorIndexer{ - basicArrayIterator: basicArrayIterator{array: array, pos: -1}, - array: array, - } -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/indexed_iter.go b/vendor/github.com/syndtr/goleveldb/leveldb/iterator/indexed_iter.go deleted file mode 100644 index 939adbb9332b..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/indexed_iter.go +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package iterator - -import ( - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/util" -) - -// IteratorIndexer is the interface that wraps CommonIterator and basic Get -// method. IteratorIndexer provides index for indexed iterator. -type IteratorIndexer interface { - CommonIterator - - // Get returns a new data iterator for the current position, or nil if - // done. - Get() Iterator -} - -type indexedIterator struct { - util.BasicReleaser - index IteratorIndexer - strict bool - - data Iterator - err error - errf func(err error) - closed bool -} - -func (i *indexedIterator) setData() { - if i.data != nil { - i.data.Release() - } - i.data = i.index.Get() -} - -func (i *indexedIterator) clearData() { - if i.data != nil { - i.data.Release() - } - i.data = nil -} - -func (i *indexedIterator) indexErr() { - if err := i.index.Error(); err != nil { - if i.errf != nil { - i.errf(err) - } - i.err = err - } -} - -func (i *indexedIterator) dataErr() bool { - if err := i.data.Error(); err != nil { - if i.errf != nil { - i.errf(err) - } - if i.strict || !errors.IsCorrupted(err) { - i.err = err - return true - } - } - return false -} - -func (i *indexedIterator) Valid() bool { - return i.data != nil && i.data.Valid() -} - -func (i *indexedIterator) First() bool { - if i.err != nil { - return false - } else if i.Released() { - i.err = ErrIterReleased - return false - } - - if !i.index.First() { - i.indexErr() - i.clearData() - return false - } - i.setData() - return i.Next() -} - -func (i *indexedIterator) Last() bool { - if i.err != nil { - return false - } else if i.Released() { - i.err = ErrIterReleased - return false - } - - if !i.index.Last() { - i.indexErr() - i.clearData() - return false - } - i.setData() - if !i.data.Last() { - if i.dataErr() { - return false - } - i.clearData() - return i.Prev() - } - return true -} - -func (i *indexedIterator) Seek(key []byte) bool { - if i.err != nil { - return false - } else if i.Released() { - i.err = ErrIterReleased - return false - } - - if !i.index.Seek(key) { - i.indexErr() - i.clearData() - return false - } - i.setData() - if !i.data.Seek(key) { - if i.dataErr() { - return false - } - i.clearData() - return i.Next() - } - return true -} - -func (i *indexedIterator) Next() bool { - if i.err != nil { - return false - } else if i.Released() { - i.err = ErrIterReleased - return false - } - - switch { - case i.data != nil && !i.data.Next(): - if i.dataErr() { - return false - } - i.clearData() - fallthrough - case i.data == nil: - if !i.index.Next() { - i.indexErr() - return false - } - i.setData() - return i.Next() - } - return true -} - -func (i *indexedIterator) Prev() bool { - if i.err != nil { - return false - } else if i.Released() { - i.err = ErrIterReleased - return false - } - - switch { - case i.data != nil && !i.data.Prev(): - if i.dataErr() { - return false - } - i.clearData() - fallthrough - case i.data == nil: - if !i.index.Prev() { - i.indexErr() - return false - } - i.setData() - if !i.data.Last() { - if i.dataErr() { - return false - } - i.clearData() - return i.Prev() - } - } - return true -} - -func (i *indexedIterator) Key() []byte { - if i.data == nil { - return nil - } - return i.data.Key() -} - -func (i *indexedIterator) Value() []byte { - if i.data == nil { - return nil - } - return i.data.Value() -} - -func (i *indexedIterator) Release() { - i.clearData() - i.index.Release() - i.BasicReleaser.Release() -} - -func (i *indexedIterator) Error() error { - if i.err != nil { - return i.err - } - if err := i.index.Error(); err != nil { - return err - } - return nil -} - -func (i *indexedIterator) SetErrorCallback(f func(err error)) { - i.errf = f -} - -// NewIndexedIterator returns an 'indexed iterator'. An index is iterator -// that returns another iterator, a 'data iterator'. A 'data iterator' is the -// iterator that contains actual key/value pairs. -// -// If strict is true the any 'corruption errors' (i.e errors.IsCorrupted(err) == true) -// won't be ignored and will halt 'indexed iterator', otherwise the iterator will -// continue to the next 'data iterator'. Corruption on 'index iterator' will not be -// ignored and will halt the iterator. -func NewIndexedIterator(index IteratorIndexer, strict bool) Iterator { - return &indexedIterator{index: index, strict: strict} -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/iter.go b/vendor/github.com/syndtr/goleveldb/leveldb/iterator/iter.go deleted file mode 100644 index 96fb0f6859ca..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/iter.go +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package iterator provides interface and implementation to traverse over -// contents of a database. -package iterator - -import ( - "errors" - - "github.com/syndtr/goleveldb/leveldb/util" -) - -var ( - ErrIterReleased = errors.New("leveldb/iterator: iterator released") -) - -// IteratorSeeker is the interface that wraps the 'seeks method'. -type IteratorSeeker interface { - // First moves the iterator to the first key/value pair. If the iterator - // only contains one key/value pair then First and Last would moves - // to the same key/value pair. - // It returns whether such pair exist. - First() bool - - // Last moves the iterator to the last key/value pair. If the iterator - // only contains one key/value pair then First and Last would moves - // to the same key/value pair. - // It returns whether such pair exist. - Last() bool - - // Seek moves the iterator to the first key/value pair whose key is greater - // than or equal to the given key. - // It returns whether such pair exist. - // - // It is safe to modify the contents of the argument after Seek returns. - Seek(key []byte) bool - - // Next moves the iterator to the next key/value pair. - // It returns false if the iterator is exhausted. - Next() bool - - // Prev moves the iterator to the previous key/value pair. - // It returns false if the iterator is exhausted. - Prev() bool -} - -// CommonIterator is the interface that wraps common iterator methods. -type CommonIterator interface { - IteratorSeeker - - // util.Releaser is the interface that wraps basic Release method. - // When called Release will releases any resources associated with the - // iterator. - util.Releaser - - // util.ReleaseSetter is the interface that wraps the basic SetReleaser - // method. - util.ReleaseSetter - - // TODO: Remove this when ready. - Valid() bool - - // Error returns any accumulated error. Exhausting all the key/value pairs - // is not considered to be an error. - Error() error -} - -// Iterator iterates over a DB's key/value pairs in key order. -// -// When encounter an error any 'seeks method' will return false and will -// yield no key/value pairs. The error can be queried by calling the Error -// method. Calling Release is still necessary. -// -// An iterator must be released after use, but it is not necessary to read -// an iterator until exhaustion. -// Also, an iterator is not necessarily safe for concurrent use, but it is -// safe to use multiple iterators concurrently, with each in a dedicated -// goroutine. -type Iterator interface { - CommonIterator - - // Key returns the key of the current key/value pair, or nil if done. - // The caller should not modify the contents of the returned slice, and - // its contents may change on the next call to any 'seeks method'. - Key() []byte - - // Value returns the value of the current key/value pair, or nil if done. - // The caller should not modify the contents of the returned slice, and - // its contents may change on the next call to any 'seeks method'. - Value() []byte -} - -// ErrorCallbackSetter is the interface that wraps basic SetErrorCallback -// method. -// -// ErrorCallbackSetter implemented by indexed and merged iterator. -type ErrorCallbackSetter interface { - // SetErrorCallback allows set an error callback of the corresponding - // iterator. Use nil to clear the callback. - SetErrorCallback(f func(err error)) -} - -type emptyIterator struct { - util.BasicReleaser - err error -} - -func (i *emptyIterator) rErr() { - if i.err == nil && i.Released() { - i.err = ErrIterReleased - } -} - -func (*emptyIterator) Valid() bool { return false } -func (i *emptyIterator) First() bool { i.rErr(); return false } -func (i *emptyIterator) Last() bool { i.rErr(); return false } -func (i *emptyIterator) Seek(key []byte) bool { i.rErr(); return false } -func (i *emptyIterator) Next() bool { i.rErr(); return false } -func (i *emptyIterator) Prev() bool { i.rErr(); return false } -func (*emptyIterator) Key() []byte { return nil } -func (*emptyIterator) Value() []byte { return nil } -func (i *emptyIterator) Error() error { return i.err } - -// NewEmptyIterator creates an empty iterator. The err parameter can be -// nil, but if not nil the given err will be returned by Error method. -func NewEmptyIterator(err error) Iterator { - return &emptyIterator{err: err} -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/merged_iter.go b/vendor/github.com/syndtr/goleveldb/leveldb/iterator/merged_iter.go deleted file mode 100644 index 1a7e29df8fbd..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/iterator/merged_iter.go +++ /dev/null @@ -1,304 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package iterator - -import ( - "github.com/syndtr/goleveldb/leveldb/comparer" - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/util" -) - -type dir int - -const ( - dirReleased dir = iota - 1 - dirSOI - dirEOI - dirBackward - dirForward -) - -type mergedIterator struct { - cmp comparer.Comparer - iters []Iterator - strict bool - - keys [][]byte - index int - dir dir - err error - errf func(err error) - releaser util.Releaser -} - -func assertKey(key []byte) []byte { - if key == nil { - panic("leveldb/iterator: nil key") - } - return key -} - -func (i *mergedIterator) iterErr(iter Iterator) bool { - if err := iter.Error(); err != nil { - if i.errf != nil { - i.errf(err) - } - if i.strict || !errors.IsCorrupted(err) { - i.err = err - return true - } - } - return false -} - -func (i *mergedIterator) Valid() bool { - return i.err == nil && i.dir > dirEOI -} - -func (i *mergedIterator) First() bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - for x, iter := range i.iters { - switch { - case iter.First(): - i.keys[x] = assertKey(iter.Key()) - case i.iterErr(iter): - return false - default: - i.keys[x] = nil - } - } - i.dir = dirSOI - return i.next() -} - -func (i *mergedIterator) Last() bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - for x, iter := range i.iters { - switch { - case iter.Last(): - i.keys[x] = assertKey(iter.Key()) - case i.iterErr(iter): - return false - default: - i.keys[x] = nil - } - } - i.dir = dirEOI - return i.prev() -} - -func (i *mergedIterator) Seek(key []byte) bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - for x, iter := range i.iters { - switch { - case iter.Seek(key): - i.keys[x] = assertKey(iter.Key()) - case i.iterErr(iter): - return false - default: - i.keys[x] = nil - } - } - i.dir = dirSOI - return i.next() -} - -func (i *mergedIterator) next() bool { - var key []byte - if i.dir == dirForward { - key = i.keys[i.index] - } - for x, tkey := range i.keys { - if tkey != nil && (key == nil || i.cmp.Compare(tkey, key) < 0) { - key = tkey - i.index = x - } - } - if key == nil { - i.dir = dirEOI - return false - } - i.dir = dirForward - return true -} - -func (i *mergedIterator) Next() bool { - if i.dir == dirEOI || i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - switch i.dir { - case dirSOI: - return i.First() - case dirBackward: - key := append([]byte{}, i.keys[i.index]...) - if !i.Seek(key) { - return false - } - return i.Next() - } - - x := i.index - iter := i.iters[x] - switch { - case iter.Next(): - i.keys[x] = assertKey(iter.Key()) - case i.iterErr(iter): - return false - default: - i.keys[x] = nil - } - return i.next() -} - -func (i *mergedIterator) prev() bool { - var key []byte - if i.dir == dirBackward { - key = i.keys[i.index] - } - for x, tkey := range i.keys { - if tkey != nil && (key == nil || i.cmp.Compare(tkey, key) > 0) { - key = tkey - i.index = x - } - } - if key == nil { - i.dir = dirSOI - return false - } - i.dir = dirBackward - return true -} - -func (i *mergedIterator) Prev() bool { - if i.dir == dirSOI || i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - switch i.dir { - case dirEOI: - return i.Last() - case dirForward: - key := append([]byte{}, i.keys[i.index]...) - for x, iter := range i.iters { - if x == i.index { - continue - } - seek := iter.Seek(key) - switch { - case seek && iter.Prev(), !seek && iter.Last(): - i.keys[x] = assertKey(iter.Key()) - case i.iterErr(iter): - return false - default: - i.keys[x] = nil - } - } - } - - x := i.index - iter := i.iters[x] - switch { - case iter.Prev(): - i.keys[x] = assertKey(iter.Key()) - case i.iterErr(iter): - return false - default: - i.keys[x] = nil - } - return i.prev() -} - -func (i *mergedIterator) Key() []byte { - if i.err != nil || i.dir <= dirEOI { - return nil - } - return i.keys[i.index] -} - -func (i *mergedIterator) Value() []byte { - if i.err != nil || i.dir <= dirEOI { - return nil - } - return i.iters[i.index].Value() -} - -func (i *mergedIterator) Release() { - if i.dir != dirReleased { - i.dir = dirReleased - for _, iter := range i.iters { - iter.Release() - } - i.iters = nil - i.keys = nil - if i.releaser != nil { - i.releaser.Release() - i.releaser = nil - } - } -} - -func (i *mergedIterator) SetReleaser(releaser util.Releaser) { - if i.dir == dirReleased { - panic(util.ErrReleased) - } - if i.releaser != nil && releaser != nil { - panic(util.ErrHasReleaser) - } - i.releaser = releaser -} - -func (i *mergedIterator) Error() error { - return i.err -} - -func (i *mergedIterator) SetErrorCallback(f func(err error)) { - i.errf = f -} - -// NewMergedIterator returns an iterator that merges its input. Walking the -// resultant iterator will return all key/value pairs of all input iterators -// in strictly increasing key order, as defined by cmp. -// The input's key ranges may overlap, but there are assumed to be no duplicate -// keys: if iters[i] contains a key k then iters[j] will not contain that key k. -// None of the iters may be nil. -// -// If strict is true the any 'corruption errors' (i.e errors.IsCorrupted(err) == true) -// won't be ignored and will halt 'merged iterator', otherwise the iterator will -// continue to the next 'input iterator'. -func NewMergedIterator(iters []Iterator, cmp comparer.Comparer, strict bool) Iterator { - return &mergedIterator{ - iters: iters, - cmp: cmp, - strict: strict, - keys: make([][]byte, len(iters)), - } -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/journal/journal.go b/vendor/github.com/syndtr/goleveldb/leveldb/journal/journal.go deleted file mode 100644 index d094c3d0f8a5..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/journal/journal.go +++ /dev/null @@ -1,524 +0,0 @@ -// Copyright 2011 The LevelDB-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. - -// Taken from: https://code.google.com/p/leveldb-go/source/browse/leveldb/record/record.go?r=1d5ccbe03246da926391ee12d1c6caae054ff4b0 -// License, authors and contributors informations can be found at bellow URLs respectively: -// https://code.google.com/p/leveldb-go/source/browse/LICENSE -// https://code.google.com/p/leveldb-go/source/browse/AUTHORS -// https://code.google.com/p/leveldb-go/source/browse/CONTRIBUTORS - -// Package journal reads and writes sequences of journals. Each journal is a stream -// of bytes that completes before the next journal starts. -// -// When reading, call Next to obtain an io.Reader for the next journal. Next will -// return io.EOF when there are no more journals. It is valid to call Next -// without reading the current journal to exhaustion. -// -// When writing, call Next to obtain an io.Writer for the next journal. Calling -// Next finishes the current journal. Call Close to finish the final journal. -// -// Optionally, call Flush to finish the current journal and flush the underlying -// writer without starting a new journal. To start a new journal after flushing, -// call Next. -// -// Neither Readers or Writers are safe to use concurrently. -// -// Example code: -// func read(r io.Reader) ([]string, error) { -// var ss []string -// journals := journal.NewReader(r, nil, true, true) -// for { -// j, err := journals.Next() -// if err == io.EOF { -// break -// } -// if err != nil { -// return nil, err -// } -// s, err := ioutil.ReadAll(j) -// if err != nil { -// return nil, err -// } -// ss = append(ss, string(s)) -// } -// return ss, nil -// } -// -// func write(w io.Writer, ss []string) error { -// journals := journal.NewWriter(w) -// for _, s := range ss { -// j, err := journals.Next() -// if err != nil { -// return err -// } -// if _, err := j.Write([]byte(s)), err != nil { -// return err -// } -// } -// return journals.Close() -// } -// -// The wire format is that the stream is divided into 32KiB blocks, and each -// block contains a number of tightly packed chunks. Chunks cannot cross block -// boundaries. The last block may be shorter than 32 KiB. Any unused bytes in a -// block must be zero. -// -// A journal maps to one or more chunks. Each chunk has a 7 byte header (a 4 -// byte checksum, a 2 byte little-endian uint16 length, and a 1 byte chunk type) -// followed by a payload. The checksum is over the chunk type and the payload. -// -// There are four chunk types: whether the chunk is the full journal, or the -// first, middle or last chunk of a multi-chunk journal. A multi-chunk journal -// has one first chunk, zero or more middle chunks, and one last chunk. -// -// The wire format allows for limited recovery in the face of data corruption: -// on a format error (such as a checksum mismatch), the reader moves to the -// next block and looks for the next full or first chunk. -package journal - -import ( - "encoding/binary" - "fmt" - "io" - - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/storage" - "github.com/syndtr/goleveldb/leveldb/util" -) - -// These constants are part of the wire format and should not be changed. -const ( - fullChunkType = 1 - firstChunkType = 2 - middleChunkType = 3 - lastChunkType = 4 -) - -const ( - blockSize = 32 * 1024 - headerSize = 7 -) - -type flusher interface { - Flush() error -} - -// ErrCorrupted is the error type that generated by corrupted block or chunk. -type ErrCorrupted struct { - Size int - Reason string -} - -func (e *ErrCorrupted) Error() string { - return fmt.Sprintf("leveldb/journal: block/chunk corrupted: %s (%d bytes)", e.Reason, e.Size) -} - -// Dropper is the interface that wrap simple Drop method. The Drop -// method will be called when the journal reader dropping a block or chunk. -type Dropper interface { - Drop(err error) -} - -// Reader reads journals from an underlying io.Reader. -type Reader struct { - // r is the underlying reader. - r io.Reader - // the dropper. - dropper Dropper - // strict flag. - strict bool - // checksum flag. - checksum bool - // seq is the sequence number of the current journal. - seq int - // buf[i:j] is the unread portion of the current chunk's payload. - // The low bound, i, excludes the chunk header. - i, j int - // n is the number of bytes of buf that are valid. Once reading has started, - // only the final block can have n < blockSize. - n int - // last is whether the current chunk is the last chunk of the journal. - last bool - // err is any accumulated error. - err error - // buf is the buffer. - buf [blockSize]byte -} - -// NewReader returns a new reader. The dropper may be nil, and if -// strict is true then corrupted or invalid chunk will halt the journal -// reader entirely. -func NewReader(r io.Reader, dropper Dropper, strict, checksum bool) *Reader { - return &Reader{ - r: r, - dropper: dropper, - strict: strict, - checksum: checksum, - last: true, - } -} - -var errSkip = errors.New("leveldb/journal: skipped") - -func (r *Reader) corrupt(n int, reason string, skip bool) error { - if r.dropper != nil { - r.dropper.Drop(&ErrCorrupted{n, reason}) - } - if r.strict && !skip { - r.err = errors.NewErrCorrupted(storage.FileDesc{}, &ErrCorrupted{n, reason}) - return r.err - } - return errSkip -} - -// nextChunk sets r.buf[r.i:r.j] to hold the next chunk's payload, reading the -// next block into the buffer if necessary. -func (r *Reader) nextChunk(first bool) error { - for { - if r.j+headerSize <= r.n { - checksum := binary.LittleEndian.Uint32(r.buf[r.j+0 : r.j+4]) - length := binary.LittleEndian.Uint16(r.buf[r.j+4 : r.j+6]) - chunkType := r.buf[r.j+6] - unprocBlock := r.n - r.j - if checksum == 0 && length == 0 && chunkType == 0 { - // Drop entire block. - r.i = r.n - r.j = r.n - return r.corrupt(unprocBlock, "zero header", false) - } - if chunkType < fullChunkType || chunkType > lastChunkType { - // Drop entire block. - r.i = r.n - r.j = r.n - return r.corrupt(unprocBlock, fmt.Sprintf("invalid chunk type %#x", chunkType), false) - } - r.i = r.j + headerSize - r.j = r.j + headerSize + int(length) - if r.j > r.n { - // Drop entire block. - r.i = r.n - r.j = r.n - return r.corrupt(unprocBlock, "chunk length overflows block", false) - } else if r.checksum && checksum != util.NewCRC(r.buf[r.i-1:r.j]).Value() { - // Drop entire block. - r.i = r.n - r.j = r.n - return r.corrupt(unprocBlock, "checksum mismatch", false) - } - if first && chunkType != fullChunkType && chunkType != firstChunkType { - chunkLength := (r.j - r.i) + headerSize - r.i = r.j - // Report the error, but skip it. - return r.corrupt(chunkLength, "orphan chunk", true) - } - r.last = chunkType == fullChunkType || chunkType == lastChunkType - return nil - } - - // The last block. - if r.n < blockSize && r.n > 0 { - if !first { - return r.corrupt(0, "missing chunk part", false) - } - r.err = io.EOF - return r.err - } - - // Read block. - n, err := io.ReadFull(r.r, r.buf[:]) - if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF { - return err - } - if n == 0 { - if !first { - return r.corrupt(0, "missing chunk part", false) - } - r.err = io.EOF - return r.err - } - r.i, r.j, r.n = 0, 0, n - } -} - -// Next returns a reader for the next journal. It returns io.EOF if there are no -// more journals. The reader returned becomes stale after the next Next call, -// and should no longer be used. If strict is false, the reader will returns -// io.ErrUnexpectedEOF error when found corrupted journal. -func (r *Reader) Next() (io.Reader, error) { - r.seq++ - if r.err != nil { - return nil, r.err - } - r.i = r.j - for { - if err := r.nextChunk(true); err == nil { - break - } else if err != errSkip { - return nil, err - } - } - return &singleReader{r, r.seq, nil}, nil -} - -// Reset resets the journal reader, allows reuse of the journal reader. Reset returns -// last accumulated error. -func (r *Reader) Reset(reader io.Reader, dropper Dropper, strict, checksum bool) error { - r.seq++ - err := r.err - r.r = reader - r.dropper = dropper - r.strict = strict - r.checksum = checksum - r.i = 0 - r.j = 0 - r.n = 0 - r.last = true - r.err = nil - return err -} - -type singleReader struct { - r *Reader - seq int - err error -} - -func (x *singleReader) Read(p []byte) (int, error) { - r := x.r - if r.seq != x.seq { - return 0, errors.New("leveldb/journal: stale reader") - } - if x.err != nil { - return 0, x.err - } - if r.err != nil { - return 0, r.err - } - for r.i == r.j { - if r.last { - return 0, io.EOF - } - x.err = r.nextChunk(false) - if x.err != nil { - if x.err == errSkip { - x.err = io.ErrUnexpectedEOF - } - return 0, x.err - } - } - n := copy(p, r.buf[r.i:r.j]) - r.i += n - return n, nil -} - -func (x *singleReader) ReadByte() (byte, error) { - r := x.r - if r.seq != x.seq { - return 0, errors.New("leveldb/journal: stale reader") - } - if x.err != nil { - return 0, x.err - } - if r.err != nil { - return 0, r.err - } - for r.i == r.j { - if r.last { - return 0, io.EOF - } - x.err = r.nextChunk(false) - if x.err != nil { - if x.err == errSkip { - x.err = io.ErrUnexpectedEOF - } - return 0, x.err - } - } - c := r.buf[r.i] - r.i++ - return c, nil -} - -// Writer writes journals to an underlying io.Writer. -type Writer struct { - // w is the underlying writer. - w io.Writer - // seq is the sequence number of the current journal. - seq int - // f is w as a flusher. - f flusher - // buf[i:j] is the bytes that will become the current chunk. - // The low bound, i, includes the chunk header. - i, j int - // buf[:written] has already been written to w. - // written is zero unless Flush has been called. - written int - // first is whether the current chunk is the first chunk of the journal. - first bool - // pending is whether a chunk is buffered but not yet written. - pending bool - // err is any accumulated error. - err error - // buf is the buffer. - buf [blockSize]byte -} - -// NewWriter returns a new Writer. -func NewWriter(w io.Writer) *Writer { - f, _ := w.(flusher) - return &Writer{ - w: w, - f: f, - } -} - -// fillHeader fills in the header for the pending chunk. -func (w *Writer) fillHeader(last bool) { - if w.i+headerSize > w.j || w.j > blockSize { - panic("leveldb/journal: bad writer state") - } - if last { - if w.first { - w.buf[w.i+6] = fullChunkType - } else { - w.buf[w.i+6] = lastChunkType - } - } else { - if w.first { - w.buf[w.i+6] = firstChunkType - } else { - w.buf[w.i+6] = middleChunkType - } - } - binary.LittleEndian.PutUint32(w.buf[w.i+0:w.i+4], util.NewCRC(w.buf[w.i+6:w.j]).Value()) - binary.LittleEndian.PutUint16(w.buf[w.i+4:w.i+6], uint16(w.j-w.i-headerSize)) -} - -// writeBlock writes the buffered block to the underlying writer, and reserves -// space for the next chunk's header. -func (w *Writer) writeBlock() { - _, w.err = w.w.Write(w.buf[w.written:]) - w.i = 0 - w.j = headerSize - w.written = 0 -} - -// writePending finishes the current journal and writes the buffer to the -// underlying writer. -func (w *Writer) writePending() { - if w.err != nil { - return - } - if w.pending { - w.fillHeader(true) - w.pending = false - } - _, w.err = w.w.Write(w.buf[w.written:w.j]) - w.written = w.j -} - -// Close finishes the current journal and closes the writer. -func (w *Writer) Close() error { - w.seq++ - w.writePending() - if w.err != nil { - return w.err - } - w.err = errors.New("leveldb/journal: closed Writer") - return nil -} - -// Flush finishes the current journal, writes to the underlying writer, and -// flushes it if that writer implements interface{ Flush() error }. -func (w *Writer) Flush() error { - w.seq++ - w.writePending() - if w.err != nil { - return w.err - } - if w.f != nil { - w.err = w.f.Flush() - return w.err - } - return nil -} - -// Reset resets the journal writer, allows reuse of the journal writer. Reset -// will also closes the journal writer if not already. -func (w *Writer) Reset(writer io.Writer) (err error) { - w.seq++ - if w.err == nil { - w.writePending() - err = w.err - } - w.w = writer - w.f, _ = writer.(flusher) - w.i = 0 - w.j = 0 - w.written = 0 - w.first = false - w.pending = false - w.err = nil - return -} - -// Next returns a writer for the next journal. The writer returned becomes stale -// after the next Close, Flush or Next call, and should no longer be used. -func (w *Writer) Next() (io.Writer, error) { - w.seq++ - if w.err != nil { - return nil, w.err - } - if w.pending { - w.fillHeader(true) - } - w.i = w.j - w.j = w.j + headerSize - // Check if there is room in the block for the header. - if w.j > blockSize { - // Fill in the rest of the block with zeroes. - for k := w.i; k < blockSize; k++ { - w.buf[k] = 0 - } - w.writeBlock() - if w.err != nil { - return nil, w.err - } - } - w.first = true - w.pending = true - return singleWriter{w, w.seq}, nil -} - -type singleWriter struct { - w *Writer - seq int -} - -func (x singleWriter) Write(p []byte) (int, error) { - w := x.w - if w.seq != x.seq { - return 0, errors.New("leveldb/journal: stale writer") - } - if w.err != nil { - return 0, w.err - } - n0 := len(p) - for len(p) > 0 { - // Write a block, if it is full. - if w.j == blockSize { - w.fillHeader(false) - w.writeBlock() - if w.err != nil { - return 0, w.err - } - w.first = false - } - // Copy bytes into the buffer. - n := copy(w.buf[w.j:], p) - w.j += n - p = p[n:] - } - return n0, nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/key.go b/vendor/github.com/syndtr/goleveldb/leveldb/key.go deleted file mode 100644 index ad8f51ec85de..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/key.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "encoding/binary" - "fmt" - - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -// ErrInternalKeyCorrupted records internal key corruption. -type ErrInternalKeyCorrupted struct { - Ikey []byte - Reason string -} - -func (e *ErrInternalKeyCorrupted) Error() string { - return fmt.Sprintf("leveldb: internal key %q corrupted: %s", e.Ikey, e.Reason) -} - -func newErrInternalKeyCorrupted(ikey []byte, reason string) error { - return errors.NewErrCorrupted(storage.FileDesc{}, &ErrInternalKeyCorrupted{append([]byte{}, ikey...), reason}) -} - -type keyType uint - -func (kt keyType) String() string { - switch kt { - case keyTypeDel: - return "d" - case keyTypeVal: - return "v" - } - return fmt.Sprintf("", uint(kt)) -} - -// Value types encoded as the last component of internal keys. -// Don't modify; this value are saved to disk. -const ( - keyTypeDel = keyType(0) - keyTypeVal = keyType(1) -) - -// keyTypeSeek defines the keyType that should be passed when constructing an -// internal key for seeking to a particular sequence number (since we -// sort sequence numbers in decreasing order and the value type is -// embedded as the low 8 bits in the sequence number in internal keys, -// we need to use the highest-numbered ValueType, not the lowest). -const keyTypeSeek = keyTypeVal - -const ( - // Maximum value possible for sequence number; the 8-bits are - // used by value type, so its can packed together in single - // 64-bit integer. - keyMaxSeq = (uint64(1) << 56) - 1 - // Maximum value possible for packed sequence number and type. - keyMaxNum = (keyMaxSeq << 8) | uint64(keyTypeSeek) -) - -// Maximum number encoded in bytes. -var keyMaxNumBytes = make([]byte, 8) - -func init() { - binary.LittleEndian.PutUint64(keyMaxNumBytes, keyMaxNum) -} - -type internalKey []byte - -func makeInternalKey(dst, ukey []byte, seq uint64, kt keyType) internalKey { - if seq > keyMaxSeq { - panic("leveldb: invalid sequence number") - } else if kt > keyTypeVal { - panic("leveldb: invalid type") - } - - dst = ensureBuffer(dst, len(ukey)+8) - copy(dst, ukey) - binary.LittleEndian.PutUint64(dst[len(ukey):], (seq<<8)|uint64(kt)) - return internalKey(dst) -} - -func parseInternalKey(ik []byte) (ukey []byte, seq uint64, kt keyType, err error) { - if len(ik) < 8 { - return nil, 0, 0, newErrInternalKeyCorrupted(ik, "invalid length") - } - num := binary.LittleEndian.Uint64(ik[len(ik)-8:]) - seq, kt = uint64(num>>8), keyType(num&0xff) - if kt > keyTypeVal { - return nil, 0, 0, newErrInternalKeyCorrupted(ik, "invalid type") - } - ukey = ik[:len(ik)-8] - return -} - -func validInternalKey(ik []byte) bool { - _, _, _, err := parseInternalKey(ik) - return err == nil -} - -func (ik internalKey) assert() { - if ik == nil { - panic("leveldb: nil internalKey") - } - if len(ik) < 8 { - panic(fmt.Sprintf("leveldb: internal key %q, len=%d: invalid length", []byte(ik), len(ik))) - } -} - -func (ik internalKey) ukey() []byte { - ik.assert() - return ik[:len(ik)-8] -} - -func (ik internalKey) num() uint64 { - ik.assert() - return binary.LittleEndian.Uint64(ik[len(ik)-8:]) -} - -func (ik internalKey) parseNum() (seq uint64, kt keyType) { - num := ik.num() - seq, kt = uint64(num>>8), keyType(num&0xff) - if kt > keyTypeVal { - panic(fmt.Sprintf("leveldb: internal key %q, len=%d: invalid type %#x", []byte(ik), len(ik), kt)) - } - return -} - -func (ik internalKey) String() string { - if ik == nil { - return "" - } - - if ukey, seq, kt, err := parseInternalKey(ik); err == nil { - return fmt.Sprintf("%s,%s%d", shorten(string(ukey)), kt, seq) - } - return fmt.Sprintf("", []byte(ik)) -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/memdb/memdb.go b/vendor/github.com/syndtr/goleveldb/leveldb/memdb/memdb.go deleted file mode 100644 index b661c08a93e2..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/memdb/memdb.go +++ /dev/null @@ -1,475 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package memdb provides in-memory key/value database implementation. -package memdb - -import ( - "math/rand" - "sync" - - "github.com/syndtr/goleveldb/leveldb/comparer" - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/util" -) - -// Common errors. -var ( - ErrNotFound = errors.ErrNotFound - ErrIterReleased = errors.New("leveldb/memdb: iterator released") -) - -const tMaxHeight = 12 - -type dbIter struct { - util.BasicReleaser - p *DB - slice *util.Range - node int - forward bool - key, value []byte - err error -} - -func (i *dbIter) fill(checkStart, checkLimit bool) bool { - if i.node != 0 { - n := i.p.nodeData[i.node] - m := n + i.p.nodeData[i.node+nKey] - i.key = i.p.kvData[n:m] - if i.slice != nil { - switch { - case checkLimit && i.slice.Limit != nil && i.p.cmp.Compare(i.key, i.slice.Limit) >= 0: - fallthrough - case checkStart && i.slice.Start != nil && i.p.cmp.Compare(i.key, i.slice.Start) < 0: - i.node = 0 - goto bail - } - } - i.value = i.p.kvData[m : m+i.p.nodeData[i.node+nVal]] - return true - } -bail: - i.key = nil - i.value = nil - return false -} - -func (i *dbIter) Valid() bool { - return i.node != 0 -} - -func (i *dbIter) First() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - i.forward = true - i.p.mu.RLock() - defer i.p.mu.RUnlock() - if i.slice != nil && i.slice.Start != nil { - i.node, _ = i.p.findGE(i.slice.Start, false) - } else { - i.node = i.p.nodeData[nNext] - } - return i.fill(false, true) -} - -func (i *dbIter) Last() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - i.forward = false - i.p.mu.RLock() - defer i.p.mu.RUnlock() - if i.slice != nil && i.slice.Limit != nil { - i.node = i.p.findLT(i.slice.Limit) - } else { - i.node = i.p.findLast() - } - return i.fill(true, false) -} - -func (i *dbIter) Seek(key []byte) bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - i.forward = true - i.p.mu.RLock() - defer i.p.mu.RUnlock() - if i.slice != nil && i.slice.Start != nil && i.p.cmp.Compare(key, i.slice.Start) < 0 { - key = i.slice.Start - } - i.node, _ = i.p.findGE(key, false) - return i.fill(false, true) -} - -func (i *dbIter) Next() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - if i.node == 0 { - if !i.forward { - return i.First() - } - return false - } - i.forward = true - i.p.mu.RLock() - defer i.p.mu.RUnlock() - i.node = i.p.nodeData[i.node+nNext] - return i.fill(false, true) -} - -func (i *dbIter) Prev() bool { - if i.Released() { - i.err = ErrIterReleased - return false - } - - if i.node == 0 { - if i.forward { - return i.Last() - } - return false - } - i.forward = false - i.p.mu.RLock() - defer i.p.mu.RUnlock() - i.node = i.p.findLT(i.key) - return i.fill(true, false) -} - -func (i *dbIter) Key() []byte { - return i.key -} - -func (i *dbIter) Value() []byte { - return i.value -} - -func (i *dbIter) Error() error { return i.err } - -func (i *dbIter) Release() { - if !i.Released() { - i.p = nil - i.node = 0 - i.key = nil - i.value = nil - i.BasicReleaser.Release() - } -} - -const ( - nKV = iota - nKey - nVal - nHeight - nNext -) - -// DB is an in-memory key/value database. -type DB struct { - cmp comparer.BasicComparer - rnd *rand.Rand - - mu sync.RWMutex - kvData []byte - // Node data: - // [0] : KV offset - // [1] : Key length - // [2] : Value length - // [3] : Height - // [3..height] : Next nodes - nodeData []int - prevNode [tMaxHeight]int - maxHeight int - n int - kvSize int -} - -func (p *DB) randHeight() (h int) { - const branching = 4 - h = 1 - for h < tMaxHeight && p.rnd.Int()%branching == 0 { - h++ - } - return -} - -// Must hold RW-lock if prev == true, as it use shared prevNode slice. -func (p *DB) findGE(key []byte, prev bool) (int, bool) { - node := 0 - h := p.maxHeight - 1 - for { - next := p.nodeData[node+nNext+h] - cmp := 1 - if next != 0 { - o := p.nodeData[next] - cmp = p.cmp.Compare(p.kvData[o:o+p.nodeData[next+nKey]], key) - } - if cmp < 0 { - // Keep searching in this list - node = next - } else { - if prev { - p.prevNode[h] = node - } else if cmp == 0 { - return next, true - } - if h == 0 { - return next, cmp == 0 - } - h-- - } - } -} - -func (p *DB) findLT(key []byte) int { - node := 0 - h := p.maxHeight - 1 - for { - next := p.nodeData[node+nNext+h] - o := p.nodeData[next] - if next == 0 || p.cmp.Compare(p.kvData[o:o+p.nodeData[next+nKey]], key) >= 0 { - if h == 0 { - break - } - h-- - } else { - node = next - } - } - return node -} - -func (p *DB) findLast() int { - node := 0 - h := p.maxHeight - 1 - for { - next := p.nodeData[node+nNext+h] - if next == 0 { - if h == 0 { - break - } - h-- - } else { - node = next - } - } - return node -} - -// Put sets the value for the given key. It overwrites any previous value -// for that key; a DB is not a multi-map. -// -// It is safe to modify the contents of the arguments after Put returns. -func (p *DB) Put(key []byte, value []byte) error { - p.mu.Lock() - defer p.mu.Unlock() - - if node, exact := p.findGE(key, true); exact { - kvOffset := len(p.kvData) - p.kvData = append(p.kvData, key...) - p.kvData = append(p.kvData, value...) - p.nodeData[node] = kvOffset - m := p.nodeData[node+nVal] - p.nodeData[node+nVal] = len(value) - p.kvSize += len(value) - m - return nil - } - - h := p.randHeight() - if h > p.maxHeight { - for i := p.maxHeight; i < h; i++ { - p.prevNode[i] = 0 - } - p.maxHeight = h - } - - kvOffset := len(p.kvData) - p.kvData = append(p.kvData, key...) - p.kvData = append(p.kvData, value...) - // Node - node := len(p.nodeData) - p.nodeData = append(p.nodeData, kvOffset, len(key), len(value), h) - for i, n := range p.prevNode[:h] { - m := n + nNext + i - p.nodeData = append(p.nodeData, p.nodeData[m]) - p.nodeData[m] = node - } - - p.kvSize += len(key) + len(value) - p.n++ - return nil -} - -// Delete deletes the value for the given key. It returns ErrNotFound if -// the DB does not contain the key. -// -// It is safe to modify the contents of the arguments after Delete returns. -func (p *DB) Delete(key []byte) error { - p.mu.Lock() - defer p.mu.Unlock() - - node, exact := p.findGE(key, true) - if !exact { - return ErrNotFound - } - - h := p.nodeData[node+nHeight] - for i, n := range p.prevNode[:h] { - m := n + nNext + i - p.nodeData[m] = p.nodeData[p.nodeData[m]+nNext+i] - } - - p.kvSize -= p.nodeData[node+nKey] + p.nodeData[node+nVal] - p.n-- - return nil -} - -// Contains returns true if the given key are in the DB. -// -// It is safe to modify the contents of the arguments after Contains returns. -func (p *DB) Contains(key []byte) bool { - p.mu.RLock() - _, exact := p.findGE(key, false) - p.mu.RUnlock() - return exact -} - -// Get gets the value for the given key. It returns error.ErrNotFound if the -// DB does not contain the key. -// -// The caller should not modify the contents of the returned slice, but -// it is safe to modify the contents of the argument after Get returns. -func (p *DB) Get(key []byte) (value []byte, err error) { - p.mu.RLock() - if node, exact := p.findGE(key, false); exact { - o := p.nodeData[node] + p.nodeData[node+nKey] - value = p.kvData[o : o+p.nodeData[node+nVal]] - } else { - err = ErrNotFound - } - p.mu.RUnlock() - return -} - -// Find finds key/value pair whose key is greater than or equal to the -// given key. It returns ErrNotFound if the table doesn't contain -// such pair. -// -// The caller should not modify the contents of the returned slice, but -// it is safe to modify the contents of the argument after Find returns. -func (p *DB) Find(key []byte) (rkey, value []byte, err error) { - p.mu.RLock() - if node, _ := p.findGE(key, false); node != 0 { - n := p.nodeData[node] - m := n + p.nodeData[node+nKey] - rkey = p.kvData[n:m] - value = p.kvData[m : m+p.nodeData[node+nVal]] - } else { - err = ErrNotFound - } - p.mu.RUnlock() - return -} - -// NewIterator returns an iterator of the DB. -// The returned iterator is not safe for concurrent use, but it is safe to use -// multiple iterators concurrently, with each in a dedicated goroutine. -// It is also safe to use an iterator concurrently with modifying its -// underlying DB. However, the resultant key/value pairs are not guaranteed -// to be a consistent snapshot of the DB at a particular point in time. -// -// Slice allows slicing the iterator to only contains keys in the given -// range. A nil Range.Start is treated as a key before all keys in the -// DB. And a nil Range.Limit is treated as a key after all keys in -// the DB. -// -// The iterator must be released after use, by calling Release method. -// -// Also read Iterator documentation of the leveldb/iterator package. -func (p *DB) NewIterator(slice *util.Range) iterator.Iterator { - return &dbIter{p: p, slice: slice} -} - -// Capacity returns keys/values buffer capacity. -func (p *DB) Capacity() int { - p.mu.RLock() - defer p.mu.RUnlock() - return cap(p.kvData) -} - -// Size returns sum of keys and values length. Note that deleted -// key/value will not be accounted for, but it will still consume -// the buffer, since the buffer is append only. -func (p *DB) Size() int { - p.mu.RLock() - defer p.mu.RUnlock() - return p.kvSize -} - -// Free returns keys/values free buffer before need to grow. -func (p *DB) Free() int { - p.mu.RLock() - defer p.mu.RUnlock() - return cap(p.kvData) - len(p.kvData) -} - -// Len returns the number of entries in the DB. -func (p *DB) Len() int { - p.mu.RLock() - defer p.mu.RUnlock() - return p.n -} - -// Reset resets the DB to initial empty state. Allows reuse the buffer. -func (p *DB) Reset() { - p.mu.Lock() - p.rnd = rand.New(rand.NewSource(0xdeadbeef)) - p.maxHeight = 1 - p.n = 0 - p.kvSize = 0 - p.kvData = p.kvData[:0] - p.nodeData = p.nodeData[:nNext+tMaxHeight] - p.nodeData[nKV] = 0 - p.nodeData[nKey] = 0 - p.nodeData[nVal] = 0 - p.nodeData[nHeight] = tMaxHeight - for n := 0; n < tMaxHeight; n++ { - p.nodeData[nNext+n] = 0 - p.prevNode[n] = 0 - } - p.mu.Unlock() -} - -// New creates a new initialized in-memory key/value DB. The capacity -// is the initial key/value buffer capacity. The capacity is advisory, -// not enforced. -// -// This DB is append-only, deleting an entry would remove entry node but not -// reclaim KV buffer. -// -// The returned DB instance is safe for concurrent use. -func New(cmp comparer.BasicComparer, capacity int) *DB { - p := &DB{ - cmp: cmp, - rnd: rand.New(rand.NewSource(0xdeadbeef)), - maxHeight: 1, - kvData: make([]byte, 0, capacity), - nodeData: make([]int, 4+tMaxHeight), - } - p.nodeData[nHeight] = tMaxHeight - return p -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/opt/options.go b/vendor/github.com/syndtr/goleveldb/leveldb/opt/options.go deleted file mode 100644 index 528b16423321..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/opt/options.go +++ /dev/null @@ -1,697 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package opt provides sets of options used by LevelDB. -package opt - -import ( - "math" - - "github.com/syndtr/goleveldb/leveldb/cache" - "github.com/syndtr/goleveldb/leveldb/comparer" - "github.com/syndtr/goleveldb/leveldb/filter" -) - -const ( - KiB = 1024 - MiB = KiB * 1024 - GiB = MiB * 1024 -) - -var ( - DefaultBlockCacher = LRUCacher - DefaultBlockCacheCapacity = 8 * MiB - DefaultBlockRestartInterval = 16 - DefaultBlockSize = 4 * KiB - DefaultCompactionExpandLimitFactor = 25 - DefaultCompactionGPOverlapsFactor = 10 - DefaultCompactionL0Trigger = 4 - DefaultCompactionSourceLimitFactor = 1 - DefaultCompactionTableSize = 2 * MiB - DefaultCompactionTableSizeMultiplier = 1.0 - DefaultCompactionTotalSize = 10 * MiB - DefaultCompactionTotalSizeMultiplier = 10.0 - DefaultCompressionType = SnappyCompression - DefaultIteratorSamplingRate = 1 * MiB - DefaultOpenFilesCacher = LRUCacher - DefaultOpenFilesCacheCapacity = 500 - DefaultWriteBuffer = 4 * MiB - DefaultWriteL0PauseTrigger = 12 - DefaultWriteL0SlowdownTrigger = 8 -) - -// Cacher is a caching algorithm. -type Cacher interface { - New(capacity int) cache.Cacher -} - -type CacherFunc struct { - NewFunc func(capacity int) cache.Cacher -} - -func (f *CacherFunc) New(capacity int) cache.Cacher { - if f.NewFunc != nil { - return f.NewFunc(capacity) - } - return nil -} - -func noCacher(int) cache.Cacher { return nil } - -var ( - // LRUCacher is the LRU-cache algorithm. - LRUCacher = &CacherFunc{cache.NewLRU} - - // NoCacher is the value to disable caching algorithm. - NoCacher = &CacherFunc{} -) - -// Compression is the 'sorted table' block compression algorithm to use. -type Compression uint - -func (c Compression) String() string { - switch c { - case DefaultCompression: - return "default" - case NoCompression: - return "none" - case SnappyCompression: - return "snappy" - } - return "invalid" -} - -const ( - DefaultCompression Compression = iota - NoCompression - SnappyCompression - nCompression -) - -// Strict is the DB 'strict level'. -type Strict uint - -const ( - // If present then a corrupted or invalid chunk or block in manifest - // journal will cause an error instead of being dropped. - // This will prevent database with corrupted manifest to be opened. - StrictManifest Strict = 1 << iota - - // If present then journal chunk checksum will be verified. - StrictJournalChecksum - - // If present then a corrupted or invalid chunk or block in journal - // will cause an error instead of being dropped. - // This will prevent database with corrupted journal to be opened. - StrictJournal - - // If present then 'sorted table' block checksum will be verified. - // This has effect on both 'read operation' and compaction. - StrictBlockChecksum - - // If present then a corrupted 'sorted table' will fails compaction. - // The database will enter read-only mode. - StrictCompaction - - // If present then a corrupted 'sorted table' will halts 'read operation'. - StrictReader - - // If present then leveldb.Recover will drop corrupted 'sorted table'. - StrictRecovery - - // This only applicable for ReadOptions, if present then this ReadOptions - // 'strict level' will override global ones. - StrictOverride - - // StrictAll enables all strict flags. - StrictAll = StrictManifest | StrictJournalChecksum | StrictJournal | StrictBlockChecksum | StrictCompaction | StrictReader | StrictRecovery - - // DefaultStrict is the default strict flags. Specify any strict flags - // will override default strict flags as whole (i.e. not OR'ed). - DefaultStrict = StrictJournalChecksum | StrictBlockChecksum | StrictCompaction | StrictReader - - // NoStrict disables all strict flags. Override default strict flags. - NoStrict = ^StrictAll -) - -// Options holds the optional parameters for the DB at large. -type Options struct { - // AltFilters defines one or more 'alternative filters'. - // 'alternative filters' will be used during reads if a filter block - // does not match with the 'effective filter'. - // - // The default value is nil - AltFilters []filter.Filter - - // BlockCacher provides cache algorithm for LevelDB 'sorted table' block caching. - // Specify NoCacher to disable caching algorithm. - // - // The default value is LRUCacher. - BlockCacher Cacher - - // BlockCacheCapacity defines the capacity of the 'sorted table' block caching. - // Use -1 for zero, this has same effect as specifying NoCacher to BlockCacher. - // - // The default value is 8MiB. - BlockCacheCapacity int - - // BlockCacheEvictRemoved allows enable forced-eviction on cached block belonging - // to removed 'sorted table'. - // - // The default if false. - BlockCacheEvictRemoved bool - - // BlockRestartInterval is the number of keys between restart points for - // delta encoding of keys. - // - // The default value is 16. - BlockRestartInterval int - - // BlockSize is the minimum uncompressed size in bytes of each 'sorted table' - // block. - // - // The default value is 4KiB. - BlockSize int - - // CompactionExpandLimitFactor limits compaction size after expanded. - // This will be multiplied by table size limit at compaction target level. - // - // The default value is 25. - CompactionExpandLimitFactor int - - // CompactionGPOverlapsFactor limits overlaps in grandparent (Level + 2) that a - // single 'sorted table' generates. - // This will be multiplied by table size limit at grandparent level. - // - // The default value is 10. - CompactionGPOverlapsFactor int - - // CompactionL0Trigger defines number of 'sorted table' at level-0 that will - // trigger compaction. - // - // The default value is 4. - CompactionL0Trigger int - - // CompactionSourceLimitFactor limits compaction source size. This doesn't apply to - // level-0. - // This will be multiplied by table size limit at compaction target level. - // - // The default value is 1. - CompactionSourceLimitFactor int - - // CompactionTableSize limits size of 'sorted table' that compaction generates. - // The limits for each level will be calculated as: - // CompactionTableSize * (CompactionTableSizeMultiplier ^ Level) - // The multiplier for each level can also fine-tuned using CompactionTableSizeMultiplierPerLevel. - // - // The default value is 2MiB. - CompactionTableSize int - - // CompactionTableSizeMultiplier defines multiplier for CompactionTableSize. - // - // The default value is 1. - CompactionTableSizeMultiplier float64 - - // CompactionTableSizeMultiplierPerLevel defines per-level multiplier for - // CompactionTableSize. - // Use zero to skip a level. - // - // The default value is nil. - CompactionTableSizeMultiplierPerLevel []float64 - - // CompactionTotalSize limits total size of 'sorted table' for each level. - // The limits for each level will be calculated as: - // CompactionTotalSize * (CompactionTotalSizeMultiplier ^ Level) - // The multiplier for each level can also fine-tuned using - // CompactionTotalSizeMultiplierPerLevel. - // - // The default value is 10MiB. - CompactionTotalSize int - - // CompactionTotalSizeMultiplier defines multiplier for CompactionTotalSize. - // - // The default value is 10. - CompactionTotalSizeMultiplier float64 - - // CompactionTotalSizeMultiplierPerLevel defines per-level multiplier for - // CompactionTotalSize. - // Use zero to skip a level. - // - // The default value is nil. - CompactionTotalSizeMultiplierPerLevel []float64 - - // Comparer defines a total ordering over the space of []byte keys: a 'less - // than' relationship. The same comparison algorithm must be used for reads - // and writes over the lifetime of the DB. - // - // The default value uses the same ordering as bytes.Compare. - Comparer comparer.Comparer - - // Compression defines the 'sorted table' block compression to use. - // - // The default value (DefaultCompression) uses snappy compression. - Compression Compression - - // DisableBufferPool allows disable use of util.BufferPool functionality. - // - // The default value is false. - DisableBufferPool bool - - // DisableBlockCache allows disable use of cache.Cache functionality on - // 'sorted table' block. - // - // The default value is false. - DisableBlockCache bool - - // DisableCompactionBackoff allows disable compaction retry backoff. - // - // The default value is false. - DisableCompactionBackoff bool - - // DisableLargeBatchTransaction allows disabling switch-to-transaction mode - // on large batch write. If enable batch writes large than WriteBuffer will - // use transaction. - // - // The default is false. - DisableLargeBatchTransaction bool - - // ErrorIfExist defines whether an error should returned if the DB already - // exist. - // - // The default value is false. - ErrorIfExist bool - - // ErrorIfMissing defines whether an error should returned if the DB is - // missing. If false then the database will be created if missing, otherwise - // an error will be returned. - // - // The default value is false. - ErrorIfMissing bool - - // Filter defines an 'effective filter' to use. An 'effective filter' - // if defined will be used to generate per-table filter block. - // The filter name will be stored on disk. - // During reads LevelDB will try to find matching filter from - // 'effective filter' and 'alternative filters'. - // - // Filter can be changed after a DB has been created. It is recommended - // to put old filter to the 'alternative filters' to mitigate lack of - // filter during transition period. - // - // A filter is used to reduce disk reads when looking for a specific key. - // - // The default value is nil. - Filter filter.Filter - - // IteratorSamplingRate defines approximate gap (in bytes) between read - // sampling of an iterator. The samples will be used to determine when - // compaction should be triggered. - // - // The default is 1MiB. - IteratorSamplingRate int - - // NoSync allows completely disable fsync. - // - // The default is false. - NoSync bool - - // NoWriteMerge allows disabling write merge. - // - // The default is false. - NoWriteMerge bool - - // OpenFilesCacher provides cache algorithm for open files caching. - // Specify NoCacher to disable caching algorithm. - // - // The default value is LRUCacher. - OpenFilesCacher Cacher - - // OpenFilesCacheCapacity defines the capacity of the open files caching. - // Use -1 for zero, this has same effect as specifying NoCacher to OpenFilesCacher. - // - // The default value is 500. - OpenFilesCacheCapacity int - - // If true then opens DB in read-only mode. - // - // The default value is false. - ReadOnly bool - - // Strict defines the DB strict level. - Strict Strict - - // WriteBuffer defines maximum size of a 'memdb' before flushed to - // 'sorted table'. 'memdb' is an in-memory DB backed by an on-disk - // unsorted journal. - // - // LevelDB may held up to two 'memdb' at the same time. - // - // The default value is 4MiB. - WriteBuffer int - - // WriteL0StopTrigger defines number of 'sorted table' at level-0 that will - // pause write. - // - // The default value is 12. - WriteL0PauseTrigger int - - // WriteL0SlowdownTrigger defines number of 'sorted table' at level-0 that - // will trigger write slowdown. - // - // The default value is 8. - WriteL0SlowdownTrigger int -} - -func (o *Options) GetAltFilters() []filter.Filter { - if o == nil { - return nil - } - return o.AltFilters -} - -func (o *Options) GetBlockCacher() Cacher { - if o == nil || o.BlockCacher == nil { - return DefaultBlockCacher - } else if o.BlockCacher == NoCacher { - return nil - } - return o.BlockCacher -} - -func (o *Options) GetBlockCacheCapacity() int { - if o == nil || o.BlockCacheCapacity == 0 { - return DefaultBlockCacheCapacity - } else if o.BlockCacheCapacity < 0 { - return 0 - } - return o.BlockCacheCapacity -} - -func (o *Options) GetBlockCacheEvictRemoved() bool { - if o == nil { - return false - } - return o.BlockCacheEvictRemoved -} - -func (o *Options) GetBlockRestartInterval() int { - if o == nil || o.BlockRestartInterval <= 0 { - return DefaultBlockRestartInterval - } - return o.BlockRestartInterval -} - -func (o *Options) GetBlockSize() int { - if o == nil || o.BlockSize <= 0 { - return DefaultBlockSize - } - return o.BlockSize -} - -func (o *Options) GetCompactionExpandLimit(level int) int { - factor := DefaultCompactionExpandLimitFactor - if o != nil && o.CompactionExpandLimitFactor > 0 { - factor = o.CompactionExpandLimitFactor - } - return o.GetCompactionTableSize(level+1) * factor -} - -func (o *Options) GetCompactionGPOverlaps(level int) int { - factor := DefaultCompactionGPOverlapsFactor - if o != nil && o.CompactionGPOverlapsFactor > 0 { - factor = o.CompactionGPOverlapsFactor - } - return o.GetCompactionTableSize(level+2) * factor -} - -func (o *Options) GetCompactionL0Trigger() int { - if o == nil || o.CompactionL0Trigger == 0 { - return DefaultCompactionL0Trigger - } - return o.CompactionL0Trigger -} - -func (o *Options) GetCompactionSourceLimit(level int) int { - factor := DefaultCompactionSourceLimitFactor - if o != nil && o.CompactionSourceLimitFactor > 0 { - factor = o.CompactionSourceLimitFactor - } - return o.GetCompactionTableSize(level+1) * factor -} - -func (o *Options) GetCompactionTableSize(level int) int { - var ( - base = DefaultCompactionTableSize - mult float64 - ) - if o != nil { - if o.CompactionTableSize > 0 { - base = o.CompactionTableSize - } - if level < len(o.CompactionTableSizeMultiplierPerLevel) && o.CompactionTableSizeMultiplierPerLevel[level] > 0 { - mult = o.CompactionTableSizeMultiplierPerLevel[level] - } else if o.CompactionTableSizeMultiplier > 0 { - mult = math.Pow(o.CompactionTableSizeMultiplier, float64(level)) - } - } - if mult == 0 { - mult = math.Pow(DefaultCompactionTableSizeMultiplier, float64(level)) - } - return int(float64(base) * mult) -} - -func (o *Options) GetCompactionTotalSize(level int) int64 { - var ( - base = DefaultCompactionTotalSize - mult float64 - ) - if o != nil { - if o.CompactionTotalSize > 0 { - base = o.CompactionTotalSize - } - if level < len(o.CompactionTotalSizeMultiplierPerLevel) && o.CompactionTotalSizeMultiplierPerLevel[level] > 0 { - mult = o.CompactionTotalSizeMultiplierPerLevel[level] - } else if o.CompactionTotalSizeMultiplier > 0 { - mult = math.Pow(o.CompactionTotalSizeMultiplier, float64(level)) - } - } - if mult == 0 { - mult = math.Pow(DefaultCompactionTotalSizeMultiplier, float64(level)) - } - return int64(float64(base) * mult) -} - -func (o *Options) GetComparer() comparer.Comparer { - if o == nil || o.Comparer == nil { - return comparer.DefaultComparer - } - return o.Comparer -} - -func (o *Options) GetCompression() Compression { - if o == nil || o.Compression <= DefaultCompression || o.Compression >= nCompression { - return DefaultCompressionType - } - return o.Compression -} - -func (o *Options) GetDisableBufferPool() bool { - if o == nil { - return false - } - return o.DisableBufferPool -} - -func (o *Options) GetDisableBlockCache() bool { - if o == nil { - return false - } - return o.DisableBlockCache -} - -func (o *Options) GetDisableCompactionBackoff() bool { - if o == nil { - return false - } - return o.DisableCompactionBackoff -} - -func (o *Options) GetDisableLargeBatchTransaction() bool { - if o == nil { - return false - } - return o.DisableLargeBatchTransaction -} - -func (o *Options) GetErrorIfExist() bool { - if o == nil { - return false - } - return o.ErrorIfExist -} - -func (o *Options) GetErrorIfMissing() bool { - if o == nil { - return false - } - return o.ErrorIfMissing -} - -func (o *Options) GetFilter() filter.Filter { - if o == nil { - return nil - } - return o.Filter -} - -func (o *Options) GetIteratorSamplingRate() int { - if o == nil || o.IteratorSamplingRate <= 0 { - return DefaultIteratorSamplingRate - } - return o.IteratorSamplingRate -} - -func (o *Options) GetNoSync() bool { - if o == nil { - return false - } - return o.NoSync -} - -func (o *Options) GetNoWriteMerge() bool { - if o == nil { - return false - } - return o.NoWriteMerge -} - -func (o *Options) GetOpenFilesCacher() Cacher { - if o == nil || o.OpenFilesCacher == nil { - return DefaultOpenFilesCacher - } - if o.OpenFilesCacher == NoCacher { - return nil - } - return o.OpenFilesCacher -} - -func (o *Options) GetOpenFilesCacheCapacity() int { - if o == nil || o.OpenFilesCacheCapacity == 0 { - return DefaultOpenFilesCacheCapacity - } else if o.OpenFilesCacheCapacity < 0 { - return 0 - } - return o.OpenFilesCacheCapacity -} - -func (o *Options) GetReadOnly() bool { - if o == nil { - return false - } - return o.ReadOnly -} - -func (o *Options) GetStrict(strict Strict) bool { - if o == nil || o.Strict == 0 { - return DefaultStrict&strict != 0 - } - return o.Strict&strict != 0 -} - -func (o *Options) GetWriteBuffer() int { - if o == nil || o.WriteBuffer <= 0 { - return DefaultWriteBuffer - } - return o.WriteBuffer -} - -func (o *Options) GetWriteL0PauseTrigger() int { - if o == nil || o.WriteL0PauseTrigger == 0 { - return DefaultWriteL0PauseTrigger - } - return o.WriteL0PauseTrigger -} - -func (o *Options) GetWriteL0SlowdownTrigger() int { - if o == nil || o.WriteL0SlowdownTrigger == 0 { - return DefaultWriteL0SlowdownTrigger - } - return o.WriteL0SlowdownTrigger -} - -// ReadOptions holds the optional parameters for 'read operation'. The -// 'read operation' includes Get, Find and NewIterator. -type ReadOptions struct { - // DontFillCache defines whether block reads for this 'read operation' - // should be cached. If false then the block will be cached. This does - // not affects already cached block. - // - // The default value is false. - DontFillCache bool - - // Strict will be OR'ed with global DB 'strict level' unless StrictOverride - // is present. Currently only StrictReader that has effect here. - Strict Strict -} - -func (ro *ReadOptions) GetDontFillCache() bool { - if ro == nil { - return false - } - return ro.DontFillCache -} - -func (ro *ReadOptions) GetStrict(strict Strict) bool { - if ro == nil { - return false - } - return ro.Strict&strict != 0 -} - -// WriteOptions holds the optional parameters for 'write operation'. The -// 'write operation' includes Write, Put and Delete. -type WriteOptions struct { - // NoWriteMerge allows disabling write merge. - // - // The default is false. - NoWriteMerge bool - - // Sync is whether to sync underlying writes from the OS buffer cache - // through to actual disk, if applicable. Setting Sync can result in - // slower writes. - // - // If false, and the machine crashes, then some recent writes may be lost. - // Note that if it is just the process that crashes (and the machine does - // not) then no writes will be lost. - // - // In other words, Sync being false has the same semantics as a write - // system call. Sync being true means write followed by fsync. - // - // The default value is false. - Sync bool -} - -func (wo *WriteOptions) GetNoWriteMerge() bool { - if wo == nil { - return false - } - return wo.NoWriteMerge -} - -func (wo *WriteOptions) GetSync() bool { - if wo == nil { - return false - } - return wo.Sync -} - -func GetStrict(o *Options, ro *ReadOptions, strict Strict) bool { - if ro.GetStrict(StrictOverride) { - return ro.GetStrict(strict) - } else { - return o.GetStrict(strict) || ro.GetStrict(strict) - } -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/options.go b/vendor/github.com/syndtr/goleveldb/leveldb/options.go deleted file mode 100644 index b072b1ac4c78..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/options.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "github.com/syndtr/goleveldb/leveldb/filter" - "github.com/syndtr/goleveldb/leveldb/opt" -) - -func dupOptions(o *opt.Options) *opt.Options { - newo := &opt.Options{} - if o != nil { - *newo = *o - } - if newo.Strict == 0 { - newo.Strict = opt.DefaultStrict - } - return newo -} - -func (s *session) setOptions(o *opt.Options) { - no := dupOptions(o) - // Alternative filters. - if filters := o.GetAltFilters(); len(filters) > 0 { - no.AltFilters = make([]filter.Filter, len(filters)) - for i, filter := range filters { - no.AltFilters[i] = &iFilter{filter} - } - } - // Comparer. - s.icmp = &iComparer{o.GetComparer()} - no.Comparer = s.icmp - // Filter. - if filter := o.GetFilter(); filter != nil { - no.Filter = &iFilter{filter} - } - - s.o = &cachedOptions{Options: no} - s.o.cache() -} - -const optCachedLevel = 7 - -type cachedOptions struct { - *opt.Options - - compactionExpandLimit []int - compactionGPOverlaps []int - compactionSourceLimit []int - compactionTableSize []int - compactionTotalSize []int64 -} - -func (co *cachedOptions) cache() { - co.compactionExpandLimit = make([]int, optCachedLevel) - co.compactionGPOverlaps = make([]int, optCachedLevel) - co.compactionSourceLimit = make([]int, optCachedLevel) - co.compactionTableSize = make([]int, optCachedLevel) - co.compactionTotalSize = make([]int64, optCachedLevel) - - for level := 0; level < optCachedLevel; level++ { - co.compactionExpandLimit[level] = co.Options.GetCompactionExpandLimit(level) - co.compactionGPOverlaps[level] = co.Options.GetCompactionGPOverlaps(level) - co.compactionSourceLimit[level] = co.Options.GetCompactionSourceLimit(level) - co.compactionTableSize[level] = co.Options.GetCompactionTableSize(level) - co.compactionTotalSize[level] = co.Options.GetCompactionTotalSize(level) - } -} - -func (co *cachedOptions) GetCompactionExpandLimit(level int) int { - if level < optCachedLevel { - return co.compactionExpandLimit[level] - } - return co.Options.GetCompactionExpandLimit(level) -} - -func (co *cachedOptions) GetCompactionGPOverlaps(level int) int { - if level < optCachedLevel { - return co.compactionGPOverlaps[level] - } - return co.Options.GetCompactionGPOverlaps(level) -} - -func (co *cachedOptions) GetCompactionSourceLimit(level int) int { - if level < optCachedLevel { - return co.compactionSourceLimit[level] - } - return co.Options.GetCompactionSourceLimit(level) -} - -func (co *cachedOptions) GetCompactionTableSize(level int) int { - if level < optCachedLevel { - return co.compactionTableSize[level] - } - return co.Options.GetCompactionTableSize(level) -} - -func (co *cachedOptions) GetCompactionTotalSize(level int) int64 { - if level < optCachedLevel { - return co.compactionTotalSize[level] - } - return co.Options.GetCompactionTotalSize(level) -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/session.go b/vendor/github.com/syndtr/goleveldb/leveldb/session.go deleted file mode 100644 index 3f391f934622..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/session.go +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "fmt" - "io" - "os" - "sync" - - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/journal" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -// ErrManifestCorrupted records manifest corruption. This error will be -// wrapped with errors.ErrCorrupted. -type ErrManifestCorrupted struct { - Field string - Reason string -} - -func (e *ErrManifestCorrupted) Error() string { - return fmt.Sprintf("leveldb: manifest corrupted (field '%s'): %s", e.Field, e.Reason) -} - -func newErrManifestCorrupted(fd storage.FileDesc, field, reason string) error { - return errors.NewErrCorrupted(fd, &ErrManifestCorrupted{field, reason}) -} - -// session represent a persistent database session. -type session struct { - // Need 64-bit alignment. - stNextFileNum int64 // current unused file number - stJournalNum int64 // current journal file number; need external synchronization - stPrevJournalNum int64 // prev journal file number; no longer used; for compatibility with older version of leveldb - stTempFileNum int64 - stSeqNum uint64 // last mem compacted seq; need external synchronization - - stor *iStorage - storLock storage.Locker - o *cachedOptions - icmp *iComparer - tops *tOps - fileRef map[int64]int - - manifest *journal.Writer - manifestWriter storage.Writer - manifestFd storage.FileDesc - - stCompPtrs []internalKey // compaction pointers; need external synchronization - stVersion *version // current version - vmu sync.Mutex -} - -// Creates new initialized session instance. -func newSession(stor storage.Storage, o *opt.Options) (s *session, err error) { - if stor == nil { - return nil, os.ErrInvalid - } - storLock, err := stor.Lock() - if err != nil { - return - } - s = &session{ - stor: newIStorage(stor), - storLock: storLock, - fileRef: make(map[int64]int), - } - s.setOptions(o) - s.tops = newTableOps(s) - s.setVersion(newVersion(s)) - s.log("log@legend F·NumFile S·FileSize N·Entry C·BadEntry B·BadBlock Ke·KeyError D·DroppedEntry L·Level Q·SeqNum T·TimeElapsed") - return -} - -// Close session. -func (s *session) close() { - s.tops.close() - if s.manifest != nil { - s.manifest.Close() - } - if s.manifestWriter != nil { - s.manifestWriter.Close() - } - s.manifest = nil - s.manifestWriter = nil - s.setVersion(&version{s: s, closing: true}) -} - -// Release session lock. -func (s *session) release() { - s.storLock.Unlock() -} - -// Create a new database session; need external synchronization. -func (s *session) create() error { - // create manifest - return s.newManifest(nil, nil) -} - -// Recover a database session; need external synchronization. -func (s *session) recover() (err error) { - defer func() { - if os.IsNotExist(err) { - // Don't return os.ErrNotExist if the underlying storage contains - // other files that belong to LevelDB. So the DB won't get trashed. - if fds, _ := s.stor.List(storage.TypeAll); len(fds) > 0 { - err = &errors.ErrCorrupted{Fd: storage.FileDesc{Type: storage.TypeManifest}, Err: &errors.ErrMissingFiles{}} - } - } - }() - - fd, err := s.stor.GetMeta() - if err != nil { - return - } - - reader, err := s.stor.Open(fd) - if err != nil { - return - } - defer reader.Close() - - var ( - // Options. - strict = s.o.GetStrict(opt.StrictManifest) - - jr = journal.NewReader(reader, dropper{s, fd}, strict, true) - rec = &sessionRecord{} - staging = s.stVersion.newStaging() - ) - for { - var r io.Reader - r, err = jr.Next() - if err != nil { - if err == io.EOF { - err = nil - break - } - return errors.SetFd(err, fd) - } - - err = rec.decode(r) - if err == nil { - // save compact pointers - for _, r := range rec.compPtrs { - s.setCompPtr(r.level, internalKey(r.ikey)) - } - // commit record to version staging - staging.commit(rec) - } else { - err = errors.SetFd(err, fd) - if strict || !errors.IsCorrupted(err) { - return - } - s.logf("manifest error: %v (skipped)", errors.SetFd(err, fd)) - } - rec.resetCompPtrs() - rec.resetAddedTables() - rec.resetDeletedTables() - } - - switch { - case !rec.has(recComparer): - return newErrManifestCorrupted(fd, "comparer", "missing") - case rec.comparer != s.icmp.uName(): - return newErrManifestCorrupted(fd, "comparer", fmt.Sprintf("mismatch: want '%s', got '%s'", s.icmp.uName(), rec.comparer)) - case !rec.has(recNextFileNum): - return newErrManifestCorrupted(fd, "next-file-num", "missing") - case !rec.has(recJournalNum): - return newErrManifestCorrupted(fd, "journal-file-num", "missing") - case !rec.has(recSeqNum): - return newErrManifestCorrupted(fd, "seq-num", "missing") - } - - s.manifestFd = fd - s.setVersion(staging.finish()) - s.setNextFileNum(rec.nextFileNum) - s.recordCommited(rec) - return nil -} - -// Commit session; need external synchronization. -func (s *session) commit(r *sessionRecord) (err error) { - v := s.version() - defer v.release() - - // spawn new version based on current version - nv := v.spawn(r) - - if s.manifest == nil { - // manifest journal writer not yet created, create one - err = s.newManifest(r, nv) - } else { - err = s.flushManifest(r) - } - - // finally, apply new version if no error rise - if err == nil { - s.setVersion(nv) - } - - return -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/session_compaction.go b/vendor/github.com/syndtr/goleveldb/leveldb/session_compaction.go deleted file mode 100644 index 089cd00b26d5..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/session_compaction.go +++ /dev/null @@ -1,302 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "sync/atomic" - - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/memdb" - "github.com/syndtr/goleveldb/leveldb/opt" -) - -func (s *session) pickMemdbLevel(umin, umax []byte, maxLevel int) int { - v := s.version() - defer v.release() - return v.pickMemdbLevel(umin, umax, maxLevel) -} - -func (s *session) flushMemdb(rec *sessionRecord, mdb *memdb.DB, maxLevel int) (int, error) { - // Create sorted table. - iter := mdb.NewIterator(nil) - defer iter.Release() - t, n, err := s.tops.createFrom(iter) - if err != nil { - return 0, err - } - - // Pick level other than zero can cause compaction issue with large - // bulk insert and delete on strictly incrementing key-space. The - // problem is that the small deletion markers trapped at lower level, - // while key/value entries keep growing at higher level. Since the - // key-space is strictly incrementing it will not overlaps with - // higher level, thus maximum possible level is always picked, while - // overlapping deletion marker pushed into lower level. - // See: https://github.com/syndtr/goleveldb/issues/127. - flushLevel := s.pickMemdbLevel(t.imin.ukey(), t.imax.ukey(), maxLevel) - rec.addTableFile(flushLevel, t) - - s.logf("memdb@flush created L%d@%d N·%d S·%s %q:%q", flushLevel, t.fd.Num, n, shortenb(int(t.size)), t.imin, t.imax) - return flushLevel, nil -} - -// Pick a compaction based on current state; need external synchronization. -func (s *session) pickCompaction() *compaction { - v := s.version() - - var sourceLevel int - var t0 tFiles - if v.cScore >= 1 { - sourceLevel = v.cLevel - cptr := s.getCompPtr(sourceLevel) - tables := v.levels[sourceLevel] - for _, t := range tables { - if cptr == nil || s.icmp.Compare(t.imax, cptr) > 0 { - t0 = append(t0, t) - break - } - } - if len(t0) == 0 { - t0 = append(t0, tables[0]) - } - } else { - if p := atomic.LoadPointer(&v.cSeek); p != nil { - ts := (*tSet)(p) - sourceLevel = ts.level - t0 = append(t0, ts.table) - } else { - v.release() - return nil - } - } - - return newCompaction(s, v, sourceLevel, t0) -} - -// Create compaction from given level and range; need external synchronization. -func (s *session) getCompactionRange(sourceLevel int, umin, umax []byte, noLimit bool) *compaction { - v := s.version() - - if sourceLevel >= len(v.levels) { - v.release() - return nil - } - - t0 := v.levels[sourceLevel].getOverlaps(nil, s.icmp, umin, umax, sourceLevel == 0) - if len(t0) == 0 { - v.release() - return nil - } - - // Avoid compacting too much in one shot in case the range is large. - // But we cannot do this for level-0 since level-0 files can overlap - // and we must not pick one file and drop another older file if the - // two files overlap. - if !noLimit && sourceLevel > 0 { - limit := int64(v.s.o.GetCompactionSourceLimit(sourceLevel)) - total := int64(0) - for i, t := range t0 { - total += t.size - if total >= limit { - s.logf("table@compaction limiting F·%d -> F·%d", len(t0), i+1) - t0 = t0[:i+1] - break - } - } - } - - return newCompaction(s, v, sourceLevel, t0) -} - -func newCompaction(s *session, v *version, sourceLevel int, t0 tFiles) *compaction { - c := &compaction{ - s: s, - v: v, - sourceLevel: sourceLevel, - levels: [2]tFiles{t0, nil}, - maxGPOverlaps: int64(s.o.GetCompactionGPOverlaps(sourceLevel)), - tPtrs: make([]int, len(v.levels)), - } - c.expand() - c.save() - return c -} - -// compaction represent a compaction state. -type compaction struct { - s *session - v *version - - sourceLevel int - levels [2]tFiles - maxGPOverlaps int64 - - gp tFiles - gpi int - seenKey bool - gpOverlappedBytes int64 - imin, imax internalKey - tPtrs []int - released bool - - snapGPI int - snapSeenKey bool - snapGPOverlappedBytes int64 - snapTPtrs []int -} - -func (c *compaction) save() { - c.snapGPI = c.gpi - c.snapSeenKey = c.seenKey - c.snapGPOverlappedBytes = c.gpOverlappedBytes - c.snapTPtrs = append(c.snapTPtrs[:0], c.tPtrs...) -} - -func (c *compaction) restore() { - c.gpi = c.snapGPI - c.seenKey = c.snapSeenKey - c.gpOverlappedBytes = c.snapGPOverlappedBytes - c.tPtrs = append(c.tPtrs[:0], c.snapTPtrs...) -} - -func (c *compaction) release() { - if !c.released { - c.released = true - c.v.release() - } -} - -// Expand compacted tables; need external synchronization. -func (c *compaction) expand() { - limit := int64(c.s.o.GetCompactionExpandLimit(c.sourceLevel)) - vt0 := c.v.levels[c.sourceLevel] - vt1 := tFiles{} - if level := c.sourceLevel + 1; level < len(c.v.levels) { - vt1 = c.v.levels[level] - } - - t0, t1 := c.levels[0], c.levels[1] - imin, imax := t0.getRange(c.s.icmp) - // We expand t0 here just incase ukey hop across tables. - t0 = vt0.getOverlaps(t0, c.s.icmp, imin.ukey(), imax.ukey(), c.sourceLevel == 0) - if len(t0) != len(c.levels[0]) { - imin, imax = t0.getRange(c.s.icmp) - } - t1 = vt1.getOverlaps(t1, c.s.icmp, imin.ukey(), imax.ukey(), false) - // Get entire range covered by compaction. - amin, amax := append(t0, t1...).getRange(c.s.icmp) - - // See if we can grow the number of inputs in "sourceLevel" without - // changing the number of "sourceLevel+1" files we pick up. - if len(t1) > 0 { - exp0 := vt0.getOverlaps(nil, c.s.icmp, amin.ukey(), amax.ukey(), c.sourceLevel == 0) - if len(exp0) > len(t0) && t1.size()+exp0.size() < limit { - xmin, xmax := exp0.getRange(c.s.icmp) - exp1 := vt1.getOverlaps(nil, c.s.icmp, xmin.ukey(), xmax.ukey(), false) - if len(exp1) == len(t1) { - c.s.logf("table@compaction expanding L%d+L%d (F·%d S·%s)+(F·%d S·%s) -> (F·%d S·%s)+(F·%d S·%s)", - c.sourceLevel, c.sourceLevel+1, len(t0), shortenb(int(t0.size())), len(t1), shortenb(int(t1.size())), - len(exp0), shortenb(int(exp0.size())), len(exp1), shortenb(int(exp1.size()))) - imin, imax = xmin, xmax - t0, t1 = exp0, exp1 - amin, amax = append(t0, t1...).getRange(c.s.icmp) - } - } - } - - // Compute the set of grandparent files that overlap this compaction - // (parent == sourceLevel+1; grandparent == sourceLevel+2) - if level := c.sourceLevel + 2; level < len(c.v.levels) { - c.gp = c.v.levels[level].getOverlaps(c.gp, c.s.icmp, amin.ukey(), amax.ukey(), false) - } - - c.levels[0], c.levels[1] = t0, t1 - c.imin, c.imax = imin, imax -} - -// Check whether compaction is trivial. -func (c *compaction) trivial() bool { - return len(c.levels[0]) == 1 && len(c.levels[1]) == 0 && c.gp.size() <= c.maxGPOverlaps -} - -func (c *compaction) baseLevelForKey(ukey []byte) bool { - for level := c.sourceLevel + 2; level < len(c.v.levels); level++ { - tables := c.v.levels[level] - for c.tPtrs[level] < len(tables) { - t := tables[c.tPtrs[level]] - if c.s.icmp.uCompare(ukey, t.imax.ukey()) <= 0 { - // We've advanced far enough. - if c.s.icmp.uCompare(ukey, t.imin.ukey()) >= 0 { - // Key falls in this file's range, so definitely not base level. - return false - } - break - } - c.tPtrs[level]++ - } - } - return true -} - -func (c *compaction) shouldStopBefore(ikey internalKey) bool { - for ; c.gpi < len(c.gp); c.gpi++ { - gp := c.gp[c.gpi] - if c.s.icmp.Compare(ikey, gp.imax) <= 0 { - break - } - if c.seenKey { - c.gpOverlappedBytes += gp.size - } - } - c.seenKey = true - - if c.gpOverlappedBytes > c.maxGPOverlaps { - // Too much overlap for current output; start new output. - c.gpOverlappedBytes = 0 - return true - } - return false -} - -// Creates an iterator. -func (c *compaction) newIterator() iterator.Iterator { - // Creates iterator slice. - icap := len(c.levels) - if c.sourceLevel == 0 { - // Special case for level-0. - icap = len(c.levels[0]) + 1 - } - its := make([]iterator.Iterator, 0, icap) - - // Options. - ro := &opt.ReadOptions{ - DontFillCache: true, - Strict: opt.StrictOverride, - } - strict := c.s.o.GetStrict(opt.StrictCompaction) - if strict { - ro.Strict |= opt.StrictReader - } - - for i, tables := range c.levels { - if len(tables) == 0 { - continue - } - - // Level-0 is not sorted and may overlaps each other. - if c.sourceLevel+i == 0 { - for _, t := range tables { - its = append(its, c.s.tops.newIterator(t, nil, ro)) - } - } else { - it := iterator.NewIndexedIterator(tables.newIndexIterator(c.s.tops, c.s.icmp, nil, ro), strict) - its = append(its, it) - } - } - - return iterator.NewMergedIterator(its, c.s.icmp, strict) -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/session_record.go b/vendor/github.com/syndtr/goleveldb/leveldb/session_record.go deleted file mode 100644 index 854e1aa6f9b4..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/session_record.go +++ /dev/null @@ -1,323 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "bufio" - "encoding/binary" - "io" - "strings" - - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -type byteReader interface { - io.Reader - io.ByteReader -} - -// These numbers are written to disk and should not be changed. -const ( - recComparer = 1 - recJournalNum = 2 - recNextFileNum = 3 - recSeqNum = 4 - recCompPtr = 5 - recDelTable = 6 - recAddTable = 7 - // 8 was used for large value refs - recPrevJournalNum = 9 -) - -type cpRecord struct { - level int - ikey internalKey -} - -type atRecord struct { - level int - num int64 - size int64 - imin internalKey - imax internalKey -} - -type dtRecord struct { - level int - num int64 -} - -type sessionRecord struct { - hasRec int - comparer string - journalNum int64 - prevJournalNum int64 - nextFileNum int64 - seqNum uint64 - compPtrs []cpRecord - addedTables []atRecord - deletedTables []dtRecord - - scratch [binary.MaxVarintLen64]byte - err error -} - -func (p *sessionRecord) has(rec int) bool { - return p.hasRec&(1< -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "fmt" - "sync/atomic" - - "github.com/syndtr/goleveldb/leveldb/journal" - "github.com/syndtr/goleveldb/leveldb/storage" -) - -// Logging. - -type dropper struct { - s *session - fd storage.FileDesc -} - -func (d dropper) Drop(err error) { - if e, ok := err.(*journal.ErrCorrupted); ok { - d.s.logf("journal@drop %s-%d S·%s %q", d.fd.Type, d.fd.Num, shortenb(e.Size), e.Reason) - } else { - d.s.logf("journal@drop %s-%d %q", d.fd.Type, d.fd.Num, err) - } -} - -func (s *session) log(v ...interface{}) { s.stor.Log(fmt.Sprint(v...)) } -func (s *session) logf(format string, v ...interface{}) { s.stor.Log(fmt.Sprintf(format, v...)) } - -// File utils. - -func (s *session) newTemp() storage.FileDesc { - num := atomic.AddInt64(&s.stTempFileNum, 1) - 1 - return storage.FileDesc{Type: storage.TypeTemp, Num: num} -} - -func (s *session) addFileRef(fd storage.FileDesc, ref int) int { - ref += s.fileRef[fd.Num] - if ref > 0 { - s.fileRef[fd.Num] = ref - } else if ref == 0 { - delete(s.fileRef, fd.Num) - } else { - panic(fmt.Sprintf("negative ref: %v", fd)) - } - return ref -} - -// Session state. - -// Get current version. This will incr version ref, must call -// version.release (exactly once) after use. -func (s *session) version() *version { - s.vmu.Lock() - defer s.vmu.Unlock() - s.stVersion.incref() - return s.stVersion -} - -func (s *session) tLen(level int) int { - s.vmu.Lock() - defer s.vmu.Unlock() - return s.stVersion.tLen(level) -} - -// Set current version to v. -func (s *session) setVersion(v *version) { - s.vmu.Lock() - defer s.vmu.Unlock() - // Hold by session. It is important to call this first before releasing - // current version, otherwise the still used files might get released. - v.incref() - if s.stVersion != nil { - // Release current version. - s.stVersion.releaseNB() - } - s.stVersion = v -} - -// Get current unused file number. -func (s *session) nextFileNum() int64 { - return atomic.LoadInt64(&s.stNextFileNum) -} - -// Set current unused file number to num. -func (s *session) setNextFileNum(num int64) { - atomic.StoreInt64(&s.stNextFileNum, num) -} - -// Mark file number as used. -func (s *session) markFileNum(num int64) { - nextFileNum := num + 1 - for { - old, x := s.stNextFileNum, nextFileNum - if old > x { - x = old - } - if atomic.CompareAndSwapInt64(&s.stNextFileNum, old, x) { - break - } - } -} - -// Allocate a file number. -func (s *session) allocFileNum() int64 { - return atomic.AddInt64(&s.stNextFileNum, 1) - 1 -} - -// Reuse given file number. -func (s *session) reuseFileNum(num int64) { - for { - old, x := s.stNextFileNum, num - if old != x+1 { - x = old - } - if atomic.CompareAndSwapInt64(&s.stNextFileNum, old, x) { - break - } - } -} - -// Set compaction ptr at given level; need external synchronization. -func (s *session) setCompPtr(level int, ik internalKey) { - if level >= len(s.stCompPtrs) { - newCompPtrs := make([]internalKey, level+1) - copy(newCompPtrs, s.stCompPtrs) - s.stCompPtrs = newCompPtrs - } - s.stCompPtrs[level] = append(internalKey{}, ik...) -} - -// Get compaction ptr at given level; need external synchronization. -func (s *session) getCompPtr(level int) internalKey { - if level >= len(s.stCompPtrs) { - return nil - } - return s.stCompPtrs[level] -} - -// Manifest related utils. - -// Fill given session record obj with current states; need external -// synchronization. -func (s *session) fillRecord(r *sessionRecord, snapshot bool) { - r.setNextFileNum(s.nextFileNum()) - - if snapshot { - if !r.has(recJournalNum) { - r.setJournalNum(s.stJournalNum) - } - - if !r.has(recSeqNum) { - r.setSeqNum(s.stSeqNum) - } - - for level, ik := range s.stCompPtrs { - if ik != nil { - r.addCompPtr(level, ik) - } - } - - r.setComparer(s.icmp.uName()) - } -} - -// Mark if record has been committed, this will update session state; -// need external synchronization. -func (s *session) recordCommited(rec *sessionRecord) { - if rec.has(recJournalNum) { - s.stJournalNum = rec.journalNum - } - - if rec.has(recPrevJournalNum) { - s.stPrevJournalNum = rec.prevJournalNum - } - - if rec.has(recSeqNum) { - s.stSeqNum = rec.seqNum - } - - for _, r := range rec.compPtrs { - s.setCompPtr(r.level, internalKey(r.ikey)) - } -} - -// Create a new manifest file; need external synchronization. -func (s *session) newManifest(rec *sessionRecord, v *version) (err error) { - fd := storage.FileDesc{Type: storage.TypeManifest, Num: s.allocFileNum()} - writer, err := s.stor.Create(fd) - if err != nil { - return - } - jw := journal.NewWriter(writer) - - if v == nil { - v = s.version() - defer v.release() - } - if rec == nil { - rec = &sessionRecord{} - } - s.fillRecord(rec, true) - v.fillRecord(rec) - - defer func() { - if err == nil { - s.recordCommited(rec) - if s.manifest != nil { - s.manifest.Close() - } - if s.manifestWriter != nil { - s.manifestWriter.Close() - } - if !s.manifestFd.Zero() { - s.stor.Remove(s.manifestFd) - } - s.manifestFd = fd - s.manifestWriter = writer - s.manifest = jw - } else { - writer.Close() - s.stor.Remove(fd) - s.reuseFileNum(fd.Num) - } - }() - - w, err := jw.Next() - if err != nil { - return - } - err = rec.encode(w) - if err != nil { - return - } - err = jw.Flush() - if err != nil { - return - } - err = s.stor.SetMeta(fd) - return -} - -// Flush record to disk. -func (s *session) flushManifest(rec *sessionRecord) (err error) { - s.fillRecord(rec, false) - w, err := s.manifest.Next() - if err != nil { - return - } - err = rec.encode(w) - if err != nil { - return - } - err = s.manifest.Flush() - if err != nil { - return - } - if !s.o.GetNoSync() { - err = s.manifestWriter.Sync() - if err != nil { - return - } - } - s.recordCommited(rec) - return -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage.go deleted file mode 100644 index d45fb5dfeb14..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage.go +++ /dev/null @@ -1,63 +0,0 @@ -package leveldb - -import ( - "github.com/syndtr/goleveldb/leveldb/storage" - "sync/atomic" -) - -type iStorage struct { - storage.Storage - read uint64 - write uint64 -} - -func (c *iStorage) Open(fd storage.FileDesc) (storage.Reader, error) { - r, err := c.Storage.Open(fd) - return &iStorageReader{r, c}, err -} - -func (c *iStorage) Create(fd storage.FileDesc) (storage.Writer, error) { - w, err := c.Storage.Create(fd) - return &iStorageWriter{w, c}, err -} - -func (c *iStorage) reads() uint64 { - return atomic.LoadUint64(&c.read) -} - -func (c *iStorage) writes() uint64 { - return atomic.LoadUint64(&c.write) -} - -// newIStorage returns the given storage wrapped by iStorage. -func newIStorage(s storage.Storage) *iStorage { - return &iStorage{s, 0, 0} -} - -type iStorageReader struct { - storage.Reader - c *iStorage -} - -func (r *iStorageReader) Read(p []byte) (n int, err error) { - n, err = r.Reader.Read(p) - atomic.AddUint64(&r.c.read, uint64(n)) - return n, err -} - -func (r *iStorageReader) ReadAt(p []byte, off int64) (n int, err error) { - n, err = r.Reader.ReadAt(p, off) - atomic.AddUint64(&r.c.read, uint64(n)) - return n, err -} - -type iStorageWriter struct { - storage.Writer - c *iStorage -} - -func (w *iStorageWriter) Write(p []byte) (n int, err error) { - n, err = w.Writer.Write(p) - atomic.AddUint64(&w.c.write, uint64(n)) - return n, err -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go deleted file mode 100644 index 9ba71fd6d107..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage.go +++ /dev/null @@ -1,671 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reservefs. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package storage - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "sort" - "strconv" - "strings" - "sync" - "time" -) - -var ( - errFileOpen = errors.New("leveldb/storage: file still open") - errReadOnly = errors.New("leveldb/storage: storage is read-only") -) - -type fileLock interface { - release() error -} - -type fileStorageLock struct { - fs *fileStorage -} - -func (lock *fileStorageLock) Unlock() { - if lock.fs != nil { - lock.fs.mu.Lock() - defer lock.fs.mu.Unlock() - if lock.fs.slock == lock { - lock.fs.slock = nil - } - } -} - -type int64Slice []int64 - -func (p int64Slice) Len() int { return len(p) } -func (p int64Slice) Less(i, j int) bool { return p[i] < p[j] } -func (p int64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -func writeFileSynced(filename string, data []byte, perm os.FileMode) error { - f, err := os.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm) - if err != nil { - return err - } - n, err := f.Write(data) - if err == nil && n < len(data) { - err = io.ErrShortWrite - } - if err1 := f.Sync(); err == nil { - err = err1 - } - if err1 := f.Close(); err == nil { - err = err1 - } - return err -} - -const logSizeThreshold = 1024 * 1024 // 1 MiB - -// fileStorage is a file-system backed storage. -type fileStorage struct { - path string - readOnly bool - - mu sync.Mutex - flock fileLock - slock *fileStorageLock - logw *os.File - logSize int64 - buf []byte - // Opened file counter; if open < 0 means closed. - open int - day int -} - -// OpenFile returns a new filesystem-backed storage implementation with the given -// path. This also acquire a file lock, so any subsequent attempt to open the -// same path will fail. -// -// The storage must be closed after use, by calling Close method. -func OpenFile(path string, readOnly bool) (Storage, error) { - if fi, err := os.Stat(path); err == nil { - if !fi.IsDir() { - return nil, fmt.Errorf("leveldb/storage: open %s: not a directory", path) - } - } else if os.IsNotExist(err) && !readOnly { - if err := os.MkdirAll(path, 0755); err != nil { - return nil, err - } - } else { - return nil, err - } - - flock, err := newFileLock(filepath.Join(path, "LOCK"), readOnly) - if err != nil { - return nil, err - } - - defer func() { - if err != nil { - flock.release() - } - }() - - var ( - logw *os.File - logSize int64 - ) - if !readOnly { - logw, err = os.OpenFile(filepath.Join(path, "LOG"), os.O_WRONLY|os.O_CREATE, 0644) - if err != nil { - return nil, err - } - logSize, err = logw.Seek(0, os.SEEK_END) - if err != nil { - logw.Close() - return nil, err - } - } - - fs := &fileStorage{ - path: path, - readOnly: readOnly, - flock: flock, - logw: logw, - logSize: logSize, - } - runtime.SetFinalizer(fs, (*fileStorage).Close) - return fs, nil -} - -func (fs *fileStorage) Lock() (Locker, error) { - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return nil, ErrClosed - } - if fs.readOnly { - return &fileStorageLock{}, nil - } - if fs.slock != nil { - return nil, ErrLocked - } - fs.slock = &fileStorageLock{fs: fs} - return fs.slock, nil -} - -func itoa(buf []byte, i int, wid int) []byte { - u := uint(i) - if u == 0 && wid <= 1 { - return append(buf, '0') - } - - // Assemble decimal in reverse order. - var b [32]byte - bp := len(b) - for ; u > 0 || wid > 0; u /= 10 { - bp-- - wid-- - b[bp] = byte(u%10) + '0' - } - return append(buf, b[bp:]...) -} - -func (fs *fileStorage) printDay(t time.Time) { - if fs.day == t.Day() { - return - } - fs.day = t.Day() - fs.logw.Write([]byte("=============== " + t.Format("Jan 2, 2006 (MST)") + " ===============\n")) -} - -func (fs *fileStorage) doLog(t time.Time, str string) { - if fs.logSize > logSizeThreshold { - // Rotate log file. - fs.logw.Close() - fs.logw = nil - fs.logSize = 0 - rename(filepath.Join(fs.path, "LOG"), filepath.Join(fs.path, "LOG.old")) - } - if fs.logw == nil { - var err error - fs.logw, err = os.OpenFile(filepath.Join(fs.path, "LOG"), os.O_WRONLY|os.O_CREATE, 0644) - if err != nil { - return - } - // Force printDay on new log file. - fs.day = 0 - } - fs.printDay(t) - hour, min, sec := t.Clock() - msec := t.Nanosecond() / 1e3 - // time - fs.buf = itoa(fs.buf[:0], hour, 2) - fs.buf = append(fs.buf, ':') - fs.buf = itoa(fs.buf, min, 2) - fs.buf = append(fs.buf, ':') - fs.buf = itoa(fs.buf, sec, 2) - fs.buf = append(fs.buf, '.') - fs.buf = itoa(fs.buf, msec, 6) - fs.buf = append(fs.buf, ' ') - // write - fs.buf = append(fs.buf, []byte(str)...) - fs.buf = append(fs.buf, '\n') - n, _ := fs.logw.Write(fs.buf) - fs.logSize += int64(n) -} - -func (fs *fileStorage) Log(str string) { - if !fs.readOnly { - t := time.Now() - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return - } - fs.doLog(t, str) - } -} - -func (fs *fileStorage) log(str string) { - if !fs.readOnly { - fs.doLog(time.Now(), str) - } -} - -func (fs *fileStorage) setMeta(fd FileDesc) error { - content := fsGenName(fd) + "\n" - // Check and backup old CURRENT file. - currentPath := filepath.Join(fs.path, "CURRENT") - if _, err := os.Stat(currentPath); err == nil { - b, err := ioutil.ReadFile(currentPath) - if err != nil { - fs.log(fmt.Sprintf("backup CURRENT: %v", err)) - return err - } - if string(b) == content { - // Content not changed, do nothing. - return nil - } - if err := writeFileSynced(currentPath+".bak", b, 0644); err != nil { - fs.log(fmt.Sprintf("backup CURRENT: %v", err)) - return err - } - } else if !os.IsNotExist(err) { - return err - } - path := fmt.Sprintf("%s.%d", filepath.Join(fs.path, "CURRENT"), fd.Num) - if err := writeFileSynced(path, []byte(content), 0644); err != nil { - fs.log(fmt.Sprintf("create CURRENT.%d: %v", fd.Num, err)) - return err - } - // Replace CURRENT file. - if err := rename(path, currentPath); err != nil { - fs.log(fmt.Sprintf("rename CURRENT.%d: %v", fd.Num, err)) - return err - } - // Sync root directory. - if err := syncDir(fs.path); err != nil { - fs.log(fmt.Sprintf("syncDir: %v", err)) - return err - } - return nil -} - -func (fs *fileStorage) SetMeta(fd FileDesc) error { - if !FileDescOk(fd) { - return ErrInvalidFile - } - if fs.readOnly { - return errReadOnly - } - - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return ErrClosed - } - return fs.setMeta(fd) -} - -func (fs *fileStorage) GetMeta() (FileDesc, error) { - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return FileDesc{}, ErrClosed - } - dir, err := os.Open(fs.path) - if err != nil { - return FileDesc{}, err - } - names, err := dir.Readdirnames(0) - // Close the dir first before checking for Readdirnames error. - if ce := dir.Close(); ce != nil { - fs.log(fmt.Sprintf("close dir: %v", ce)) - } - if err != nil { - return FileDesc{}, err - } - // Try this in order: - // - CURRENT.[0-9]+ ('pending rename' file, descending order) - // - CURRENT - // - CURRENT.bak - // - // Skip corrupted file or file that point to a missing target file. - type currentFile struct { - name string - fd FileDesc - } - tryCurrent := func(name string) (*currentFile, error) { - b, err := ioutil.ReadFile(filepath.Join(fs.path, name)) - if err != nil { - if os.IsNotExist(err) { - err = os.ErrNotExist - } - return nil, err - } - var fd FileDesc - if len(b) < 1 || b[len(b)-1] != '\n' || !fsParseNamePtr(string(b[:len(b)-1]), &fd) { - fs.log(fmt.Sprintf("%s: corrupted content: %q", name, b)) - err := &ErrCorrupted{ - Err: errors.New("leveldb/storage: corrupted or incomplete CURRENT file"), - } - return nil, err - } - if _, err := os.Stat(filepath.Join(fs.path, fsGenName(fd))); err != nil { - if os.IsNotExist(err) { - fs.log(fmt.Sprintf("%s: missing target file: %s", name, fd)) - err = os.ErrNotExist - } - return nil, err - } - return ¤tFile{name: name, fd: fd}, nil - } - tryCurrents := func(names []string) (*currentFile, error) { - var ( - cur *currentFile - // Last corruption error. - lastCerr error - ) - for _, name := range names { - var err error - cur, err = tryCurrent(name) - if err == nil { - break - } else if err == os.ErrNotExist { - // Fallback to the next file. - } else if isCorrupted(err) { - lastCerr = err - // Fallback to the next file. - } else { - // In case the error is due to permission, etc. - return nil, err - } - } - if cur == nil { - err := os.ErrNotExist - if lastCerr != nil { - err = lastCerr - } - return nil, err - } - return cur, nil - } - - // Try 'pending rename' files. - var nums []int64 - for _, name := range names { - if strings.HasPrefix(name, "CURRENT.") && name != "CURRENT.bak" { - i, err := strconv.ParseInt(name[8:], 10, 64) - if err == nil { - nums = append(nums, i) - } - } - } - var ( - pendCur *currentFile - pendErr = os.ErrNotExist - pendNames []string - ) - if len(nums) > 0 { - sort.Sort(sort.Reverse(int64Slice(nums))) - pendNames = make([]string, len(nums)) - for i, num := range nums { - pendNames[i] = fmt.Sprintf("CURRENT.%d", num) - } - pendCur, pendErr = tryCurrents(pendNames) - if pendErr != nil && pendErr != os.ErrNotExist && !isCorrupted(pendErr) { - return FileDesc{}, pendErr - } - } - - // Try CURRENT and CURRENT.bak. - curCur, curErr := tryCurrents([]string{"CURRENT", "CURRENT.bak"}) - if curErr != nil && curErr != os.ErrNotExist && !isCorrupted(curErr) { - return FileDesc{}, curErr - } - - // pendCur takes precedence, but guards against obsolete pendCur. - if pendCur != nil && (curCur == nil || pendCur.fd.Num > curCur.fd.Num) { - curCur = pendCur - } - - if curCur != nil { - // Restore CURRENT file to proper state. - if !fs.readOnly && (curCur.name != "CURRENT" || len(pendNames) != 0) { - // Ignore setMeta errors, however don't delete obsolete files if we - // catch error. - if err := fs.setMeta(curCur.fd); err == nil { - // Remove 'pending rename' files. - for _, name := range pendNames { - if err := os.Remove(filepath.Join(fs.path, name)); err != nil { - fs.log(fmt.Sprintf("remove %s: %v", name, err)) - } - } - } - } - return curCur.fd, nil - } - - // Nothing found. - if isCorrupted(pendErr) { - return FileDesc{}, pendErr - } - return FileDesc{}, curErr -} - -func (fs *fileStorage) List(ft FileType) (fds []FileDesc, err error) { - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return nil, ErrClosed - } - dir, err := os.Open(fs.path) - if err != nil { - return - } - names, err := dir.Readdirnames(0) - // Close the dir first before checking for Readdirnames error. - if cerr := dir.Close(); cerr != nil { - fs.log(fmt.Sprintf("close dir: %v", cerr)) - } - if err == nil { - for _, name := range names { - if fd, ok := fsParseName(name); ok && fd.Type&ft != 0 { - fds = append(fds, fd) - } - } - } - return -} - -func (fs *fileStorage) Open(fd FileDesc) (Reader, error) { - if !FileDescOk(fd) { - return nil, ErrInvalidFile - } - - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return nil, ErrClosed - } - of, err := os.OpenFile(filepath.Join(fs.path, fsGenName(fd)), os.O_RDONLY, 0) - if err != nil { - if fsHasOldName(fd) && os.IsNotExist(err) { - of, err = os.OpenFile(filepath.Join(fs.path, fsGenOldName(fd)), os.O_RDONLY, 0) - if err == nil { - goto ok - } - } - return nil, err - } -ok: - fs.open++ - return &fileWrap{File: of, fs: fs, fd: fd}, nil -} - -func (fs *fileStorage) Create(fd FileDesc) (Writer, error) { - if !FileDescOk(fd) { - return nil, ErrInvalidFile - } - if fs.readOnly { - return nil, errReadOnly - } - - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return nil, ErrClosed - } - of, err := os.OpenFile(filepath.Join(fs.path, fsGenName(fd)), os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644) - if err != nil { - return nil, err - } - fs.open++ - return &fileWrap{File: of, fs: fs, fd: fd}, nil -} - -func (fs *fileStorage) Remove(fd FileDesc) error { - if !FileDescOk(fd) { - return ErrInvalidFile - } - if fs.readOnly { - return errReadOnly - } - - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return ErrClosed - } - err := os.Remove(filepath.Join(fs.path, fsGenName(fd))) - if err != nil { - if fsHasOldName(fd) && os.IsNotExist(err) { - if e1 := os.Remove(filepath.Join(fs.path, fsGenOldName(fd))); !os.IsNotExist(e1) { - fs.log(fmt.Sprintf("remove %s: %v (old name)", fd, err)) - err = e1 - } - } else { - fs.log(fmt.Sprintf("remove %s: %v", fd, err)) - } - } - return err -} - -func (fs *fileStorage) Rename(oldfd, newfd FileDesc) error { - if !FileDescOk(oldfd) || !FileDescOk(newfd) { - return ErrInvalidFile - } - if oldfd == newfd { - return nil - } - if fs.readOnly { - return errReadOnly - } - - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return ErrClosed - } - return rename(filepath.Join(fs.path, fsGenName(oldfd)), filepath.Join(fs.path, fsGenName(newfd))) -} - -func (fs *fileStorage) Close() error { - fs.mu.Lock() - defer fs.mu.Unlock() - if fs.open < 0 { - return ErrClosed - } - // Clear the finalizer. - runtime.SetFinalizer(fs, nil) - - if fs.open > 0 { - fs.log(fmt.Sprintf("close: warning, %d files still open", fs.open)) - } - fs.open = -1 - if fs.logw != nil { - fs.logw.Close() - } - return fs.flock.release() -} - -type fileWrap struct { - *os.File - fs *fileStorage - fd FileDesc - closed bool -} - -func (fw *fileWrap) Sync() error { - if err := fw.File.Sync(); err != nil { - return err - } - if fw.fd.Type == TypeManifest { - // Also sync parent directory if file type is manifest. - // See: https://code.google.com/p/leveldb/issues/detail?id=190. - if err := syncDir(fw.fs.path); err != nil { - fw.fs.log(fmt.Sprintf("syncDir: %v", err)) - return err - } - } - return nil -} - -func (fw *fileWrap) Close() error { - fw.fs.mu.Lock() - defer fw.fs.mu.Unlock() - if fw.closed { - return ErrClosed - } - fw.closed = true - fw.fs.open-- - err := fw.File.Close() - if err != nil { - fw.fs.log(fmt.Sprintf("close %s: %v", fw.fd, err)) - } - return err -} - -func fsGenName(fd FileDesc) string { - switch fd.Type { - case TypeManifest: - return fmt.Sprintf("MANIFEST-%06d", fd.Num) - case TypeJournal: - return fmt.Sprintf("%06d.log", fd.Num) - case TypeTable: - return fmt.Sprintf("%06d.ldb", fd.Num) - case TypeTemp: - return fmt.Sprintf("%06d.tmp", fd.Num) - default: - panic("invalid file type") - } -} - -func fsHasOldName(fd FileDesc) bool { - return fd.Type == TypeTable -} - -func fsGenOldName(fd FileDesc) string { - switch fd.Type { - case TypeTable: - return fmt.Sprintf("%06d.sst", fd.Num) - } - return fsGenName(fd) -} - -func fsParseName(name string) (fd FileDesc, ok bool) { - var tail string - _, err := fmt.Sscanf(name, "%d.%s", &fd.Num, &tail) - if err == nil { - switch tail { - case "log": - fd.Type = TypeJournal - case "ldb", "sst": - fd.Type = TypeTable - case "tmp": - fd.Type = TypeTemp - default: - return - } - return fd, true - } - n, _ := fmt.Sscanf(name, "MANIFEST-%d%s", &fd.Num, &tail) - if n == 1 { - fd.Type = TypeManifest - return fd, true - } - return -} - -func fsParseNamePtr(name string, fd *FileDesc) bool { - _fd, ok := fsParseName(name) - if fd != nil { - *fd = _fd - } - return ok -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_nacl.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_nacl.go deleted file mode 100644 index 5545aeef2a86..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_nacl.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// +build nacl - -package storage - -import ( - "os" - "syscall" -) - -func newFileLock(path string, readOnly bool) (fl fileLock, err error) { - return nil, syscall.ENOTSUP -} - -func setFileLock(f *os.File, readOnly, lock bool) error { - return syscall.ENOTSUP -} - -func rename(oldpath, newpath string) error { - return syscall.ENOTSUP -} - -func isErrInvalid(err error) bool { - return false -} - -func syncDir(name string) error { - return syscall.ENOTSUP -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_plan9.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_plan9.go deleted file mode 100644 index b8297980126d..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_plan9.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package storage - -import ( - "os" -) - -type plan9FileLock struct { - f *os.File -} - -func (fl *plan9FileLock) release() error { - return fl.f.Close() -} - -func newFileLock(path string, readOnly bool) (fl fileLock, err error) { - var ( - flag int - perm os.FileMode - ) - if readOnly { - flag = os.O_RDONLY - } else { - flag = os.O_RDWR - perm = os.ModeExclusive - } - f, err := os.OpenFile(path, flag, perm) - if os.IsNotExist(err) { - f, err = os.OpenFile(path, flag|os.O_CREATE, perm|0644) - } - if err != nil { - return - } - fl = &plan9FileLock{f: f} - return -} - -func rename(oldpath, newpath string) error { - if _, err := os.Stat(newpath); err == nil { - if err := os.Remove(newpath); err != nil { - return err - } - } - - return os.Rename(oldpath, newpath) -} - -func syncDir(name string) error { - f, err := os.Open(name) - if err != nil { - return err - } - defer f.Close() - if err := f.Sync(); err != nil { - return err - } - return nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_solaris.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_solaris.go deleted file mode 100644 index 79901ee4a7a3..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_solaris.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// +build solaris - -package storage - -import ( - "os" - "syscall" -) - -type unixFileLock struct { - f *os.File -} - -func (fl *unixFileLock) release() error { - if err := setFileLock(fl.f, false, false); err != nil { - return err - } - return fl.f.Close() -} - -func newFileLock(path string, readOnly bool) (fl fileLock, err error) { - var flag int - if readOnly { - flag = os.O_RDONLY - } else { - flag = os.O_RDWR - } - f, err := os.OpenFile(path, flag, 0) - if os.IsNotExist(err) { - f, err = os.OpenFile(path, flag|os.O_CREATE, 0644) - } - if err != nil { - return - } - err = setFileLock(f, readOnly, true) - if err != nil { - f.Close() - return - } - fl = &unixFileLock{f: f} - return -} - -func setFileLock(f *os.File, readOnly, lock bool) error { - flock := syscall.Flock_t{ - Type: syscall.F_UNLCK, - Start: 0, - Len: 0, - Whence: 1, - } - if lock { - if readOnly { - flock.Type = syscall.F_RDLCK - } else { - flock.Type = syscall.F_WRLCK - } - } - return syscall.FcntlFlock(f.Fd(), syscall.F_SETLK, &flock) -} - -func rename(oldpath, newpath string) error { - return os.Rename(oldpath, newpath) -} - -func syncDir(name string) error { - f, err := os.Open(name) - if err != nil { - return err - } - defer f.Close() - if err := f.Sync(); err != nil { - return err - } - return nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_unix.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_unix.go deleted file mode 100644 index d75f66a9efc6..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_unix.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// 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 - -package storage - -import ( - "os" - "syscall" -) - -type unixFileLock struct { - f *os.File -} - -func (fl *unixFileLock) release() error { - if err := setFileLock(fl.f, false, false); err != nil { - return err - } - return fl.f.Close() -} - -func newFileLock(path string, readOnly bool) (fl fileLock, err error) { - var flag int - if readOnly { - flag = os.O_RDONLY - } else { - flag = os.O_RDWR - } - f, err := os.OpenFile(path, flag, 0) - if os.IsNotExist(err) { - f, err = os.OpenFile(path, flag|os.O_CREATE, 0644) - } - if err != nil { - return - } - err = setFileLock(f, readOnly, true) - if err != nil { - f.Close() - return - } - fl = &unixFileLock{f: f} - return -} - -func setFileLock(f *os.File, readOnly, lock bool) error { - how := syscall.LOCK_UN - if lock { - if readOnly { - how = syscall.LOCK_SH - } else { - how = syscall.LOCK_EX - } - } - return syscall.Flock(int(f.Fd()), how|syscall.LOCK_NB) -} - -func rename(oldpath, newpath string) error { - return os.Rename(oldpath, newpath) -} - -func isErrInvalid(err error) bool { - if err == os.ErrInvalid { - return true - } - // Go < 1.8 - if syserr, ok := err.(*os.SyscallError); ok && syserr.Err == syscall.EINVAL { - return true - } - // Go >= 1.8 returns *os.PathError instead - if patherr, ok := err.(*os.PathError); ok && patherr.Err == syscall.EINVAL { - return true - } - return false -} - -func syncDir(name string) error { - // As per fsync manpage, Linux seems to expect fsync on directory, however - // some system don't support this, so we will ignore syscall.EINVAL. - // - // From fsync(2): - // Calling fsync() does not necessarily ensure that the entry in the - // directory containing the file has also reached disk. For that an - // explicit fsync() on a file descriptor for the directory is also needed. - f, err := os.Open(name) - if err != nil { - return err - } - defer f.Close() - if err := f.Sync(); err != nil && !isErrInvalid(err) { - return err - } - return nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_windows.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_windows.go deleted file mode 100644 index 899335fd7e4e..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/file_storage_windows.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) 2013, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package storage - -import ( - "syscall" - "unsafe" -) - -var ( - modkernel32 = syscall.NewLazyDLL("kernel32.dll") - - procMoveFileExW = modkernel32.NewProc("MoveFileExW") -) - -const ( - _MOVEFILE_REPLACE_EXISTING = 1 -) - -type windowsFileLock struct { - fd syscall.Handle -} - -func (fl *windowsFileLock) release() error { - return syscall.Close(fl.fd) -} - -func newFileLock(path string, readOnly bool) (fl fileLock, err error) { - pathp, err := syscall.UTF16PtrFromString(path) - if err != nil { - return - } - var access, shareMode uint32 - if readOnly { - access = syscall.GENERIC_READ - shareMode = syscall.FILE_SHARE_READ - } else { - access = syscall.GENERIC_READ | syscall.GENERIC_WRITE - } - fd, err := syscall.CreateFile(pathp, access, shareMode, nil, syscall.OPEN_EXISTING, syscall.FILE_ATTRIBUTE_NORMAL, 0) - if err == syscall.ERROR_FILE_NOT_FOUND { - fd, err = syscall.CreateFile(pathp, access, shareMode, nil, syscall.OPEN_ALWAYS, syscall.FILE_ATTRIBUTE_NORMAL, 0) - } - if err != nil { - return - } - fl = &windowsFileLock{fd: fd} - return -} - -func moveFileEx(from *uint16, to *uint16, flags uint32) error { - r1, _, e1 := syscall.Syscall(procMoveFileExW.Addr(), 3, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), uintptr(flags)) - if r1 == 0 { - if e1 != 0 { - return error(e1) - } - return syscall.EINVAL - } - return nil -} - -func rename(oldpath, newpath string) error { - from, err := syscall.UTF16PtrFromString(oldpath) - if err != nil { - return err - } - to, err := syscall.UTF16PtrFromString(newpath) - if err != nil { - return err - } - return moveFileEx(from, to, _MOVEFILE_REPLACE_EXISTING) -} - -func syncDir(name string) error { return nil } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/mem_storage.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/mem_storage.go deleted file mode 100644 index 838f1bee1ba7..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/mem_storage.go +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright (c) 2013, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package storage - -import ( - "bytes" - "os" - "sync" -) - -const typeShift = 4 - -// Verify at compile-time that typeShift is large enough to cover all FileType -// values by confirming that 0 == 0. -var _ [0]struct{} = [TypeAll >> typeShift]struct{}{} - -type memStorageLock struct { - ms *memStorage -} - -func (lock *memStorageLock) Unlock() { - ms := lock.ms - ms.mu.Lock() - defer ms.mu.Unlock() - if ms.slock == lock { - ms.slock = nil - } - return -} - -// memStorage is a memory-backed storage. -type memStorage struct { - mu sync.Mutex - slock *memStorageLock - files map[uint64]*memFile - meta FileDesc -} - -// NewMemStorage returns a new memory-backed storage implementation. -func NewMemStorage() Storage { - return &memStorage{ - files: make(map[uint64]*memFile), - } -} - -func (ms *memStorage) Lock() (Locker, error) { - ms.mu.Lock() - defer ms.mu.Unlock() - if ms.slock != nil { - return nil, ErrLocked - } - ms.slock = &memStorageLock{ms: ms} - return ms.slock, nil -} - -func (*memStorage) Log(str string) {} - -func (ms *memStorage) SetMeta(fd FileDesc) error { - if !FileDescOk(fd) { - return ErrInvalidFile - } - - ms.mu.Lock() - ms.meta = fd - ms.mu.Unlock() - return nil -} - -func (ms *memStorage) GetMeta() (FileDesc, error) { - ms.mu.Lock() - defer ms.mu.Unlock() - if ms.meta.Zero() { - return FileDesc{}, os.ErrNotExist - } - return ms.meta, nil -} - -func (ms *memStorage) List(ft FileType) ([]FileDesc, error) { - ms.mu.Lock() - var fds []FileDesc - for x := range ms.files { - fd := unpackFile(x) - if fd.Type&ft != 0 { - fds = append(fds, fd) - } - } - ms.mu.Unlock() - return fds, nil -} - -func (ms *memStorage) Open(fd FileDesc) (Reader, error) { - if !FileDescOk(fd) { - return nil, ErrInvalidFile - } - - ms.mu.Lock() - defer ms.mu.Unlock() - if m, exist := ms.files[packFile(fd)]; exist { - if m.open { - return nil, errFileOpen - } - m.open = true - return &memReader{Reader: bytes.NewReader(m.Bytes()), ms: ms, m: m}, nil - } - return nil, os.ErrNotExist -} - -func (ms *memStorage) Create(fd FileDesc) (Writer, error) { - if !FileDescOk(fd) { - return nil, ErrInvalidFile - } - - x := packFile(fd) - ms.mu.Lock() - defer ms.mu.Unlock() - m, exist := ms.files[x] - if exist { - if m.open { - return nil, errFileOpen - } - m.Reset() - } else { - m = &memFile{} - ms.files[x] = m - } - m.open = true - return &memWriter{memFile: m, ms: ms}, nil -} - -func (ms *memStorage) Remove(fd FileDesc) error { - if !FileDescOk(fd) { - return ErrInvalidFile - } - - x := packFile(fd) - ms.mu.Lock() - defer ms.mu.Unlock() - if _, exist := ms.files[x]; exist { - delete(ms.files, x) - return nil - } - return os.ErrNotExist -} - -func (ms *memStorage) Rename(oldfd, newfd FileDesc) error { - if !FileDescOk(oldfd) || !FileDescOk(newfd) { - return ErrInvalidFile - } - if oldfd == newfd { - return nil - } - - oldx := packFile(oldfd) - newx := packFile(newfd) - ms.mu.Lock() - defer ms.mu.Unlock() - oldm, exist := ms.files[oldx] - if !exist { - return os.ErrNotExist - } - newm, exist := ms.files[newx] - if (exist && newm.open) || oldm.open { - return errFileOpen - } - delete(ms.files, oldx) - ms.files[newx] = oldm - return nil -} - -func (*memStorage) Close() error { return nil } - -type memFile struct { - bytes.Buffer - open bool -} - -type memReader struct { - *bytes.Reader - ms *memStorage - m *memFile - closed bool -} - -func (mr *memReader) Close() error { - mr.ms.mu.Lock() - defer mr.ms.mu.Unlock() - if mr.closed { - return ErrClosed - } - mr.m.open = false - return nil -} - -type memWriter struct { - *memFile - ms *memStorage - closed bool -} - -func (*memWriter) Sync() error { return nil } - -func (mw *memWriter) Close() error { - mw.ms.mu.Lock() - defer mw.ms.mu.Unlock() - if mw.closed { - return ErrClosed - } - mw.memFile.open = false - return nil -} - -func packFile(fd FileDesc) uint64 { - return uint64(fd.Num)<> typeShift)} -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/storage/storage.go b/vendor/github.com/syndtr/goleveldb/leveldb/storage/storage.go deleted file mode 100644 index 4e4a724258d6..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/storage/storage.go +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package storage provides storage abstraction for LevelDB. -package storage - -import ( - "errors" - "fmt" - "io" -) - -// FileType represent a file type. -type FileType int - -// File types. -const ( - TypeManifest FileType = 1 << iota - TypeJournal - TypeTable - TypeTemp - - TypeAll = TypeManifest | TypeJournal | TypeTable | TypeTemp -) - -func (t FileType) String() string { - switch t { - case TypeManifest: - return "manifest" - case TypeJournal: - return "journal" - case TypeTable: - return "table" - case TypeTemp: - return "temp" - } - return fmt.Sprintf("", t) -} - -// Common error. -var ( - ErrInvalidFile = errors.New("leveldb/storage: invalid file for argument") - ErrLocked = errors.New("leveldb/storage: already locked") - ErrClosed = errors.New("leveldb/storage: closed") -) - -// ErrCorrupted is the type that wraps errors that indicate corruption of -// a file. Package storage has its own type instead of using -// errors.ErrCorrupted to prevent circular import. -type ErrCorrupted struct { - Fd FileDesc - Err error -} - -func isCorrupted(err error) bool { - switch err.(type) { - case *ErrCorrupted: - return true - } - return false -} - -func (e *ErrCorrupted) Error() string { - if !e.Fd.Zero() { - return fmt.Sprintf("%v [file=%v]", e.Err, e.Fd) - } - return e.Err.Error() -} - -// Syncer is the interface that wraps basic Sync method. -type Syncer interface { - // Sync commits the current contents of the file to stable storage. - Sync() error -} - -// Reader is the interface that groups the basic Read, Seek, ReadAt and Close -// methods. -type Reader interface { - io.ReadSeeker - io.ReaderAt - io.Closer -} - -// Writer is the interface that groups the basic Write, Sync and Close -// methods. -type Writer interface { - io.WriteCloser - Syncer -} - -// Locker is the interface that wraps Unlock method. -type Locker interface { - Unlock() -} - -// FileDesc is a 'file descriptor'. -type FileDesc struct { - Type FileType - Num int64 -} - -func (fd FileDesc) String() string { - switch fd.Type { - case TypeManifest: - return fmt.Sprintf("MANIFEST-%06d", fd.Num) - case TypeJournal: - return fmt.Sprintf("%06d.log", fd.Num) - case TypeTable: - return fmt.Sprintf("%06d.ldb", fd.Num) - case TypeTemp: - return fmt.Sprintf("%06d.tmp", fd.Num) - default: - return fmt.Sprintf("%#x-%d", fd.Type, fd.Num) - } -} - -// Zero returns true if fd == (FileDesc{}). -func (fd FileDesc) Zero() bool { - return fd == (FileDesc{}) -} - -// FileDescOk returns true if fd is a valid 'file descriptor'. -func FileDescOk(fd FileDesc) bool { - switch fd.Type { - case TypeManifest: - case TypeJournal: - case TypeTable: - case TypeTemp: - default: - return false - } - return fd.Num >= 0 -} - -// Storage is the storage. A storage instance must be safe for concurrent use. -type Storage interface { - // Lock locks the storage. Any subsequent attempt to call Lock will fail - // until the last lock released. - // Caller should call Unlock method after use. - Lock() (Locker, error) - - // Log logs a string. This is used for logging. - // An implementation may write to a file, stdout or simply do nothing. - Log(str string) - - // SetMeta store 'file descriptor' that can later be acquired using GetMeta - // method. The 'file descriptor' should point to a valid file. - // SetMeta should be implemented in such way that changes should happen - // atomically. - SetMeta(fd FileDesc) error - - // GetMeta returns 'file descriptor' stored in meta. The 'file descriptor' - // can be updated using SetMeta method. - // Returns os.ErrNotExist if meta doesn't store any 'file descriptor', or - // 'file descriptor' point to nonexistent file. - GetMeta() (FileDesc, error) - - // List returns file descriptors that match the given file types. - // The file types may be OR'ed together. - List(ft FileType) ([]FileDesc, error) - - // Open opens file with the given 'file descriptor' read-only. - // Returns os.ErrNotExist error if the file does not exist. - // Returns ErrClosed if the underlying storage is closed. - Open(fd FileDesc) (Reader, error) - - // Create creates file with the given 'file descriptor', truncate if already - // exist and opens write-only. - // Returns ErrClosed if the underlying storage is closed. - Create(fd FileDesc) (Writer, error) - - // Remove removes file with the given 'file descriptor'. - // Returns ErrClosed if the underlying storage is closed. - Remove(fd FileDesc) error - - // Rename renames file from oldfd to newfd. - // Returns ErrClosed if the underlying storage is closed. - Rename(oldfd, newfd FileDesc) error - - // Close closes the storage. - // It is valid to call Close multiple times. Other methods should not be - // called after the storage has been closed. - Close() error -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/table.go b/vendor/github.com/syndtr/goleveldb/leveldb/table.go deleted file mode 100644 index 1fac60d050b3..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/table.go +++ /dev/null @@ -1,531 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "fmt" - "sort" - "sync/atomic" - - "github.com/syndtr/goleveldb/leveldb/cache" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/storage" - "github.com/syndtr/goleveldb/leveldb/table" - "github.com/syndtr/goleveldb/leveldb/util" -) - -// tFile holds basic information about a table. -type tFile struct { - fd storage.FileDesc - seekLeft int32 - size int64 - imin, imax internalKey -} - -// Returns true if given key is after largest key of this table. -func (t *tFile) after(icmp *iComparer, ukey []byte) bool { - return ukey != nil && icmp.uCompare(ukey, t.imax.ukey()) > 0 -} - -// Returns true if given key is before smallest key of this table. -func (t *tFile) before(icmp *iComparer, ukey []byte) bool { - return ukey != nil && icmp.uCompare(ukey, t.imin.ukey()) < 0 -} - -// Returns true if given key range overlaps with this table key range. -func (t *tFile) overlaps(icmp *iComparer, umin, umax []byte) bool { - return !t.after(icmp, umin) && !t.before(icmp, umax) -} - -// Cosumes one seek and return current seeks left. -func (t *tFile) consumeSeek() int32 { - return atomic.AddInt32(&t.seekLeft, -1) -} - -// Creates new tFile. -func newTableFile(fd storage.FileDesc, size int64, imin, imax internalKey) *tFile { - f := &tFile{ - fd: fd, - size: size, - imin: imin, - imax: imax, - } - - // We arrange to automatically compact this file after - // a certain number of seeks. Let's assume: - // (1) One seek costs 10ms - // (2) Writing or reading 1MB costs 10ms (100MB/s) - // (3) A compaction of 1MB does 25MB of IO: - // 1MB read from this level - // 10-12MB read from next level (boundaries may be misaligned) - // 10-12MB written to next level - // This implies that 25 seeks cost the same as the compaction - // of 1MB of data. I.e., one seek costs approximately the - // same as the compaction of 40KB of data. We are a little - // conservative and allow approximately one seek for every 16KB - // of data before triggering a compaction. - f.seekLeft = int32(size / 16384) - if f.seekLeft < 100 { - f.seekLeft = 100 - } - - return f -} - -func tableFileFromRecord(r atRecord) *tFile { - return newTableFile(storage.FileDesc{Type: storage.TypeTable, Num: r.num}, r.size, r.imin, r.imax) -} - -// tFiles hold multiple tFile. -type tFiles []*tFile - -func (tf tFiles) Len() int { return len(tf) } -func (tf tFiles) Swap(i, j int) { tf[i], tf[j] = tf[j], tf[i] } - -func (tf tFiles) nums() string { - x := "[ " - for i, f := range tf { - if i != 0 { - x += ", " - } - x += fmt.Sprint(f.fd.Num) - } - x += " ]" - return x -} - -// Returns true if i smallest key is less than j. -// This used for sort by key in ascending order. -func (tf tFiles) lessByKey(icmp *iComparer, i, j int) bool { - a, b := tf[i], tf[j] - n := icmp.Compare(a.imin, b.imin) - if n == 0 { - return a.fd.Num < b.fd.Num - } - return n < 0 -} - -// Returns true if i file number is greater than j. -// This used for sort by file number in descending order. -func (tf tFiles) lessByNum(i, j int) bool { - return tf[i].fd.Num > tf[j].fd.Num -} - -// Sorts tables by key in ascending order. -func (tf tFiles) sortByKey(icmp *iComparer) { - sort.Sort(&tFilesSortByKey{tFiles: tf, icmp: icmp}) -} - -// Sorts tables by file number in descending order. -func (tf tFiles) sortByNum() { - sort.Sort(&tFilesSortByNum{tFiles: tf}) -} - -// Returns sum of all tables size. -func (tf tFiles) size() (sum int64) { - for _, t := range tf { - sum += t.size - } - return sum -} - -// Searches smallest index of tables whose its smallest -// key is after or equal with given key. -func (tf tFiles) searchMin(icmp *iComparer, ikey internalKey) int { - return sort.Search(len(tf), func(i int) bool { - return icmp.Compare(tf[i].imin, ikey) >= 0 - }) -} - -// Searches smallest index of tables whose its largest -// key is after or equal with given key. -func (tf tFiles) searchMax(icmp *iComparer, ikey internalKey) int { - return sort.Search(len(tf), func(i int) bool { - return icmp.Compare(tf[i].imax, ikey) >= 0 - }) -} - -// 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 { - if unsorted { - // Check against all files. - for _, t := range tf { - if t.overlaps(icmp, umin, umax) { - return true - } - } - return false - } - - i := 0 - if len(umin) > 0 { - // Find the earliest possible internal key for min. - i = tf.searchMax(icmp, makeInternalKey(nil, umin, keyMaxSeq, keyTypeSeek)) - } - if i >= len(tf) { - // Beginning of range is after all files, so no overlap. - return false - } - return !tf[i].before(icmp, umax) -} - -// Returns tables whose its key range overlaps with given key range. -// Range will be expanded if ukey found hop across tables. -// If overlapped is true then the search will be restarted if umax -// expanded. -// The dst content will be overwritten. -func (tf tFiles) getOverlaps(dst tFiles, icmp *iComparer, umin, umax []byte, overlapped bool) tFiles { - dst = dst[:0] - for i := 0; i < len(tf); { - t := tf[i] - if t.overlaps(icmp, umin, umax) { - if umin != nil && icmp.uCompare(t.imin.ukey(), umin) < 0 { - umin = t.imin.ukey() - dst = dst[:0] - i = 0 - continue - } else if umax != nil && icmp.uCompare(t.imax.ukey(), umax) > 0 { - umax = t.imax.ukey() - // Restart search if it is overlapped. - if overlapped { - dst = dst[:0] - i = 0 - continue - } - } - - dst = append(dst, t) - } - i++ - } - - return dst -} - -// Returns tables key range. -func (tf tFiles) getRange(icmp *iComparer) (imin, imax internalKey) { - for i, t := range tf { - if i == 0 { - imin, imax = t.imin, t.imax - continue - } - if icmp.Compare(t.imin, imin) < 0 { - imin = t.imin - } - if icmp.Compare(t.imax, imax) > 0 { - imax = t.imax - } - } - - return -} - -// Creates iterator index from tables. -func (tf tFiles) newIndexIterator(tops *tOps, icmp *iComparer, slice *util.Range, ro *opt.ReadOptions) iterator.IteratorIndexer { - if slice != nil { - var start, limit int - if slice.Start != nil { - start = tf.searchMax(icmp, internalKey(slice.Start)) - } - if slice.Limit != nil { - limit = tf.searchMin(icmp, internalKey(slice.Limit)) - } else { - limit = tf.Len() - } - tf = tf[start:limit] - } - return iterator.NewArrayIndexer(&tFilesArrayIndexer{ - tFiles: tf, - tops: tops, - icmp: icmp, - slice: slice, - ro: ro, - }) -} - -// Tables iterator index. -type tFilesArrayIndexer struct { - tFiles - tops *tOps - icmp *iComparer - slice *util.Range - ro *opt.ReadOptions -} - -func (a *tFilesArrayIndexer) Search(key []byte) int { - return a.searchMax(a.icmp, internalKey(key)) -} - -func (a *tFilesArrayIndexer) Get(i int) iterator.Iterator { - if i == 0 || i == a.Len()-1 { - return a.tops.newIterator(a.tFiles[i], a.slice, a.ro) - } - return a.tops.newIterator(a.tFiles[i], nil, a.ro) -} - -// Helper type for sortByKey. -type tFilesSortByKey struct { - tFiles - icmp *iComparer -} - -func (x *tFilesSortByKey) Less(i, j int) bool { - return x.lessByKey(x.icmp, i, j) -} - -// Helper type for sortByNum. -type tFilesSortByNum struct { - tFiles -} - -func (x *tFilesSortByNum) Less(i, j int) bool { - return x.lessByNum(i, j) -} - -// Table operations. -type tOps struct { - s *session - noSync bool - evictRemoved bool - cache *cache.Cache - bcache *cache.Cache - bpool *util.BufferPool -} - -// Creates an empty table and returns table writer. -func (t *tOps) create() (*tWriter, error) { - fd := storage.FileDesc{Type: storage.TypeTable, Num: t.s.allocFileNum()} - fw, err := t.s.stor.Create(fd) - if err != nil { - return nil, err - } - return &tWriter{ - t: t, - fd: fd, - w: fw, - tw: table.NewWriter(fw, t.s.o.Options), - }, nil -} - -// Builds table from src iterator. -func (t *tOps) createFrom(src iterator.Iterator) (f *tFile, n int, err error) { - w, err := t.create() - if err != nil { - return - } - - defer func() { - if err != nil { - w.drop() - } - }() - - for src.Next() { - err = w.append(src.Key(), src.Value()) - if err != nil { - return - } - } - err = src.Error() - if err != nil { - return - } - - n = w.tw.EntriesLen() - f, err = w.finish() - return -} - -// Opens table. It returns a cache handle, which should -// be released after use. -func (t *tOps) open(f *tFile) (ch *cache.Handle, err error) { - ch = t.cache.Get(0, uint64(f.fd.Num), func() (size int, value cache.Value) { - var r storage.Reader - r, err = t.s.stor.Open(f.fd) - if err != nil { - return 0, nil - } - - var bcache *cache.NamespaceGetter - if t.bcache != nil { - bcache = &cache.NamespaceGetter{Cache: t.bcache, NS: uint64(f.fd.Num)} - } - - var tr *table.Reader - tr, err = table.NewReader(r, f.size, f.fd, bcache, t.bpool, t.s.o.Options) - if err != nil { - r.Close() - return 0, nil - } - return 1, tr - - }) - if ch == nil && err == nil { - err = ErrClosed - } - return -} - -// Finds key/value pair whose key is greater than or equal to the -// given key. -func (t *tOps) find(f *tFile, key []byte, ro *opt.ReadOptions) (rkey, rvalue []byte, err error) { - ch, err := t.open(f) - if err != nil { - return nil, nil, err - } - defer ch.Release() - return ch.Value().(*table.Reader).Find(key, true, ro) -} - -// Finds key that is greater than or equal to the given key. -func (t *tOps) findKey(f *tFile, key []byte, ro *opt.ReadOptions) (rkey []byte, err error) { - ch, err := t.open(f) - if err != nil { - return nil, err - } - defer ch.Release() - return ch.Value().(*table.Reader).FindKey(key, true, ro) -} - -// Returns approximate offset of the given key. -func (t *tOps) offsetOf(f *tFile, key []byte) (offset int64, err error) { - ch, err := t.open(f) - if err != nil { - return - } - defer ch.Release() - return ch.Value().(*table.Reader).OffsetOf(key) -} - -// Creates an iterator from the given table. -func (t *tOps) newIterator(f *tFile, slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { - ch, err := t.open(f) - if err != nil { - return iterator.NewEmptyIterator(err) - } - iter := ch.Value().(*table.Reader).NewIterator(slice, ro) - iter.SetReleaser(ch) - return iter -} - -// Removes table from persistent storage. It waits until -// no one use the the table. -func (t *tOps) remove(f *tFile) { - t.cache.Delete(0, uint64(f.fd.Num), func() { - if err := t.s.stor.Remove(f.fd); err != nil { - t.s.logf("table@remove removing @%d %q", f.fd.Num, err) - } else { - t.s.logf("table@remove removed @%d", f.fd.Num) - } - if t.evictRemoved && t.bcache != nil { - t.bcache.EvictNS(uint64(f.fd.Num)) - } - }) -} - -// Closes the table ops instance. It will close all tables, -// regadless still used or not. -func (t *tOps) close() { - t.bpool.Close() - t.cache.Close() - if t.bcache != nil { - t.bcache.CloseWeak() - } -} - -// Creates new initialized table ops instance. -func newTableOps(s *session) *tOps { - var ( - cacher cache.Cacher - bcache *cache.Cache - bpool *util.BufferPool - ) - if s.o.GetOpenFilesCacheCapacity() > 0 { - cacher = cache.NewLRU(s.o.GetOpenFilesCacheCapacity()) - } - if !s.o.GetDisableBlockCache() { - var bcacher cache.Cacher - if s.o.GetBlockCacheCapacity() > 0 { - bcacher = s.o.GetBlockCacher().New(s.o.GetBlockCacheCapacity()) - } - bcache = cache.NewCache(bcacher) - } - if !s.o.GetDisableBufferPool() { - bpool = util.NewBufferPool(s.o.GetBlockSize() + 5) - } - return &tOps{ - s: s, - noSync: s.o.GetNoSync(), - evictRemoved: s.o.GetBlockCacheEvictRemoved(), - cache: cache.NewCache(cacher), - bcache: bcache, - bpool: bpool, - } -} - -// tWriter wraps the table writer. It keep track of file descriptor -// and added key range. -type tWriter struct { - t *tOps - - fd storage.FileDesc - w storage.Writer - tw *table.Writer - - first, last []byte -} - -// Append key/value pair to the table. -func (w *tWriter) append(key, value []byte) error { - if w.first == nil { - w.first = append([]byte{}, key...) - } - w.last = append(w.last[:0], key...) - return w.tw.Append(key, value) -} - -// Returns true if the table is empty. -func (w *tWriter) empty() bool { - return w.first == nil -} - -// Closes the storage.Writer. -func (w *tWriter) close() { - if w.w != nil { - w.w.Close() - w.w = nil - } -} - -// Finalizes the table and returns table file. -func (w *tWriter) finish() (f *tFile, err error) { - defer w.close() - err = w.tw.Close() - if err != nil { - return - } - if !w.t.noSync { - err = w.w.Sync() - if err != nil { - return - } - } - f = newTableFile(w.fd, int64(w.tw.BytesLen()), internalKey(w.first), internalKey(w.last)) - return -} - -// Drops the table. -func (w *tWriter) drop() { - w.close() - w.t.s.stor.Remove(w.fd) - w.t.s.reuseFileNum(w.fd.Num) - w.tw = nil - w.first = nil - w.last = nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/table/reader.go b/vendor/github.com/syndtr/goleveldb/leveldb/table/reader.go deleted file mode 100644 index 16cfbaa0068a..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/table/reader.go +++ /dev/null @@ -1,1135 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package table - -import ( - "encoding/binary" - "fmt" - "io" - "sort" - "strings" - "sync" - - "github.com/golang/snappy" - - "github.com/syndtr/goleveldb/leveldb/cache" - "github.com/syndtr/goleveldb/leveldb/comparer" - "github.com/syndtr/goleveldb/leveldb/errors" - "github.com/syndtr/goleveldb/leveldb/filter" - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/storage" - "github.com/syndtr/goleveldb/leveldb/util" -) - -// Reader errors. -var ( - ErrNotFound = errors.ErrNotFound - ErrReaderReleased = errors.New("leveldb/table: reader released") - ErrIterReleased = errors.New("leveldb/table: iterator released") -) - -// ErrCorrupted describes error due to corruption. This error will be wrapped -// with errors.ErrCorrupted. -type ErrCorrupted struct { - Pos int64 - Size int64 - Kind string - Reason string -} - -func (e *ErrCorrupted) Error() string { - return fmt.Sprintf("leveldb/table: corruption on %s (pos=%d): %s", e.Kind, e.Pos, e.Reason) -} - -func max(x, y int) int { - if x > y { - return x - } - return y -} - -type block struct { - bpool *util.BufferPool - bh blockHandle - data []byte - restartsLen int - restartsOffset int -} - -func (b *block) seek(cmp comparer.Comparer, rstart, rlimit int, key []byte) (index, offset int, err error) { - index = sort.Search(b.restartsLen-rstart-(b.restartsLen-rlimit), func(i int) bool { - offset := int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*(rstart+i):])) - offset++ // shared always zero, since this is a restart point - v1, n1 := binary.Uvarint(b.data[offset:]) // key length - _, n2 := binary.Uvarint(b.data[offset+n1:]) // value length - m := offset + n1 + n2 - return cmp.Compare(b.data[m:m+int(v1)], key) > 0 - }) + rstart - 1 - if index < rstart { - // The smallest key is greater-than key sought. - index = rstart - } - offset = int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*index:])) - return -} - -func (b *block) restartIndex(rstart, rlimit, offset int) int { - return sort.Search(b.restartsLen-rstart-(b.restartsLen-rlimit), func(i int) bool { - return int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*(rstart+i):])) > offset - }) + rstart - 1 -} - -func (b *block) restartOffset(index int) int { - return int(binary.LittleEndian.Uint32(b.data[b.restartsOffset+4*index:])) -} - -func (b *block) entry(offset int) (key, value []byte, nShared, n int, err error) { - if offset >= b.restartsOffset { - if offset != b.restartsOffset { - err = &ErrCorrupted{Reason: "entries offset not aligned"} - } - return - } - v0, n0 := binary.Uvarint(b.data[offset:]) // Shared prefix length - v1, n1 := binary.Uvarint(b.data[offset+n0:]) // Key length - v2, n2 := binary.Uvarint(b.data[offset+n0+n1:]) // Value length - m := n0 + n1 + n2 - n = m + int(v1) + int(v2) - if n0 <= 0 || n1 <= 0 || n2 <= 0 || offset+n > b.restartsOffset { - err = &ErrCorrupted{Reason: "entries corrupted"} - return - } - key = b.data[offset+m : offset+m+int(v1)] - value = b.data[offset+m+int(v1) : offset+n] - nShared = int(v0) - return -} - -func (b *block) Release() { - b.bpool.Put(b.data) - b.bpool = nil - b.data = nil -} - -type dir int - -const ( - dirReleased dir = iota - 1 - dirSOI - dirEOI - dirBackward - dirForward -) - -type blockIter struct { - tr *Reader - block *block - blockReleaser util.Releaser - releaser util.Releaser - key, value []byte - offset int - // Previous offset, only filled by Next. - prevOffset int - prevNode []int - prevKeys []byte - restartIndex int - // Iterator direction. - dir dir - // Restart index slice range. - riStart int - riLimit int - // Offset slice range. - offsetStart int - offsetRealStart int - offsetLimit int - // Error. - err error -} - -func (i *blockIter) sErr(err error) { - i.err = err - i.key = nil - i.value = nil - i.prevNode = nil - i.prevKeys = nil -} - -func (i *blockIter) reset() { - if i.dir == dirBackward { - i.prevNode = i.prevNode[:0] - i.prevKeys = i.prevKeys[:0] - } - i.restartIndex = i.riStart - i.offset = i.offsetStart - i.dir = dirSOI - i.key = i.key[:0] - i.value = nil -} - -func (i *blockIter) isFirst() bool { - switch i.dir { - case dirForward: - return i.prevOffset == i.offsetRealStart - case dirBackward: - return len(i.prevNode) == 1 && i.restartIndex == i.riStart - } - return false -} - -func (i *blockIter) isLast() bool { - switch i.dir { - case dirForward, dirBackward: - return i.offset == i.offsetLimit - } - return false -} - -func (i *blockIter) First() bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - if i.dir == dirBackward { - i.prevNode = i.prevNode[:0] - i.prevKeys = i.prevKeys[:0] - } - i.dir = dirSOI - return i.Next() -} - -func (i *blockIter) Last() bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - if i.dir == dirBackward { - i.prevNode = i.prevNode[:0] - i.prevKeys = i.prevKeys[:0] - } - i.dir = dirEOI - return i.Prev() -} - -func (i *blockIter) Seek(key []byte) bool { - if i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - ri, offset, err := i.block.seek(i.tr.cmp, i.riStart, i.riLimit, key) - if err != nil { - i.sErr(err) - return false - } - i.restartIndex = ri - i.offset = max(i.offsetStart, offset) - if i.dir == dirSOI || i.dir == dirEOI { - i.dir = dirForward - } - for i.Next() { - if i.tr.cmp.Compare(i.key, key) >= 0 { - return true - } - } - return false -} - -func (i *blockIter) Next() bool { - if i.dir == dirEOI || i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - if i.dir == dirSOI { - i.restartIndex = i.riStart - i.offset = i.offsetStart - } else if i.dir == dirBackward { - i.prevNode = i.prevNode[:0] - i.prevKeys = i.prevKeys[:0] - } - for i.offset < i.offsetRealStart { - key, value, nShared, n, err := i.block.entry(i.offset) - if err != nil { - i.sErr(i.tr.fixErrCorruptedBH(i.block.bh, err)) - return false - } - if n == 0 { - i.dir = dirEOI - return false - } - i.key = append(i.key[:nShared], key...) - i.value = value - i.offset += n - } - if i.offset >= i.offsetLimit { - i.dir = dirEOI - if i.offset != i.offsetLimit { - i.sErr(i.tr.newErrCorruptedBH(i.block.bh, "entries offset not aligned")) - } - return false - } - key, value, nShared, n, err := i.block.entry(i.offset) - if err != nil { - i.sErr(i.tr.fixErrCorruptedBH(i.block.bh, err)) - return false - } - if n == 0 { - i.dir = dirEOI - return false - } - i.key = append(i.key[:nShared], key...) - i.value = value - i.prevOffset = i.offset - i.offset += n - i.dir = dirForward - return true -} - -func (i *blockIter) Prev() bool { - if i.dir == dirSOI || i.err != nil { - return false - } else if i.dir == dirReleased { - i.err = ErrIterReleased - return false - } - - var ri int - if i.dir == dirForward { - // Change direction. - i.offset = i.prevOffset - if i.offset == i.offsetRealStart { - i.dir = dirSOI - return false - } - ri = i.block.restartIndex(i.restartIndex, i.riLimit, i.offset) - i.dir = dirBackward - } else if i.dir == dirEOI { - // At the end of iterator. - i.restartIndex = i.riLimit - i.offset = i.offsetLimit - if i.offset == i.offsetRealStart { - i.dir = dirSOI - return false - } - ri = i.riLimit - 1 - i.dir = dirBackward - } else if len(i.prevNode) == 1 { - // This is the end of a restart range. - i.offset = i.prevNode[0] - i.prevNode = i.prevNode[:0] - if i.restartIndex == i.riStart { - i.dir = dirSOI - return false - } - i.restartIndex-- - ri = i.restartIndex - } else { - // In the middle of restart range, get from cache. - n := len(i.prevNode) - 3 - node := i.prevNode[n:] - i.prevNode = i.prevNode[:n] - // Get the key. - ko := node[0] - i.key = append(i.key[:0], i.prevKeys[ko:]...) - i.prevKeys = i.prevKeys[:ko] - // Get the value. - vo := node[1] - vl := vo + node[2] - i.value = i.block.data[vo:vl] - i.offset = vl - return true - } - // Build entries cache. - i.key = i.key[:0] - i.value = nil - offset := i.block.restartOffset(ri) - if offset == i.offset { - ri-- - if ri < 0 { - i.dir = dirSOI - return false - } - offset = i.block.restartOffset(ri) - } - i.prevNode = append(i.prevNode, offset) - for { - key, value, nShared, n, err := i.block.entry(offset) - if err != nil { - i.sErr(i.tr.fixErrCorruptedBH(i.block.bh, err)) - return false - } - if offset >= i.offsetRealStart { - if i.value != nil { - // Appends 3 variables: - // 1. Previous keys offset - // 2. Value offset in the data block - // 3. Value length - i.prevNode = append(i.prevNode, len(i.prevKeys), offset-len(i.value), len(i.value)) - i.prevKeys = append(i.prevKeys, i.key...) - } - i.value = value - } - i.key = append(i.key[:nShared], key...) - offset += n - // Stop if target offset reached. - if offset >= i.offset { - if offset != i.offset { - i.sErr(i.tr.newErrCorruptedBH(i.block.bh, "entries offset not aligned")) - return false - } - - break - } - } - i.restartIndex = ri - i.offset = offset - return true -} - -func (i *blockIter) Key() []byte { - if i.err != nil || i.dir <= dirEOI { - return nil - } - return i.key -} - -func (i *blockIter) Value() []byte { - if i.err != nil || i.dir <= dirEOI { - return nil - } - return i.value -} - -func (i *blockIter) Release() { - if i.dir != dirReleased { - i.tr = nil - i.block = nil - i.prevNode = nil - i.prevKeys = nil - i.key = nil - i.value = nil - i.dir = dirReleased - if i.blockReleaser != nil { - i.blockReleaser.Release() - i.blockReleaser = nil - } - if i.releaser != nil { - i.releaser.Release() - i.releaser = nil - } - } -} - -func (i *blockIter) SetReleaser(releaser util.Releaser) { - if i.dir == dirReleased { - panic(util.ErrReleased) - } - if i.releaser != nil && releaser != nil { - panic(util.ErrHasReleaser) - } - i.releaser = releaser -} - -func (i *blockIter) Valid() bool { - return i.err == nil && (i.dir == dirBackward || i.dir == dirForward) -} - -func (i *blockIter) Error() error { - return i.err -} - -type filterBlock struct { - bpool *util.BufferPool - data []byte - oOffset int - baseLg uint - filtersNum int -} - -func (b *filterBlock) contains(filter filter.Filter, offset uint64, key []byte) bool { - i := int(offset >> b.baseLg) - if i < b.filtersNum { - o := b.data[b.oOffset+i*4:] - n := int(binary.LittleEndian.Uint32(o)) - m := int(binary.LittleEndian.Uint32(o[4:])) - if n < m && m <= b.oOffset { - return filter.Contains(b.data[n:m], key) - } else if n == m { - return false - } - } - return true -} - -func (b *filterBlock) Release() { - b.bpool.Put(b.data) - b.bpool = nil - b.data = nil -} - -type indexIter struct { - *blockIter - tr *Reader - slice *util.Range - // Options - fillCache bool -} - -func (i *indexIter) Get() iterator.Iterator { - value := i.Value() - if value == nil { - return nil - } - dataBH, n := decodeBlockHandle(value) - if n == 0 { - return iterator.NewEmptyIterator(i.tr.newErrCorruptedBH(i.tr.indexBH, "bad data block handle")) - } - - var slice *util.Range - if i.slice != nil && (i.blockIter.isFirst() || i.blockIter.isLast()) { - slice = i.slice - } - return i.tr.getDataIterErr(dataBH, slice, i.tr.verifyChecksum, i.fillCache) -} - -// Reader is a table reader. -type Reader struct { - mu sync.RWMutex - fd storage.FileDesc - reader io.ReaderAt - cache *cache.NamespaceGetter - err error - bpool *util.BufferPool - // Options - o *opt.Options - cmp comparer.Comparer - filter filter.Filter - verifyChecksum bool - - dataEnd int64 - metaBH, indexBH, filterBH blockHandle - indexBlock *block - filterBlock *filterBlock -} - -func (r *Reader) blockKind(bh blockHandle) string { - switch bh.offset { - case r.metaBH.offset: - return "meta-block" - case r.indexBH.offset: - return "index-block" - case r.filterBH.offset: - if r.filterBH.length > 0 { - return "filter-block" - } - } - return "data-block" -} - -func (r *Reader) newErrCorrupted(pos, size int64, kind, reason string) error { - return &errors.ErrCorrupted{Fd: r.fd, Err: &ErrCorrupted{Pos: pos, Size: size, Kind: kind, Reason: reason}} -} - -func (r *Reader) newErrCorruptedBH(bh blockHandle, reason string) error { - return r.newErrCorrupted(int64(bh.offset), int64(bh.length), r.blockKind(bh), reason) -} - -func (r *Reader) fixErrCorruptedBH(bh blockHandle, err error) error { - if cerr, ok := err.(*ErrCorrupted); ok { - cerr.Pos = int64(bh.offset) - cerr.Size = int64(bh.length) - cerr.Kind = r.blockKind(bh) - return &errors.ErrCorrupted{Fd: r.fd, Err: cerr} - } - return err -} - -func (r *Reader) readRawBlock(bh blockHandle, verifyChecksum bool) ([]byte, error) { - data := r.bpool.Get(int(bh.length + blockTrailerLen)) - if _, err := r.reader.ReadAt(data, int64(bh.offset)); err != nil && err != io.EOF { - return nil, err - } - - if verifyChecksum { - n := bh.length + 1 - checksum0 := binary.LittleEndian.Uint32(data[n:]) - checksum1 := util.NewCRC(data[:n]).Value() - if checksum0 != checksum1 { - r.bpool.Put(data) - return nil, r.newErrCorruptedBH(bh, fmt.Sprintf("checksum mismatch, want=%#x got=%#x", checksum0, checksum1)) - } - } - - switch data[bh.length] { - case blockTypeNoCompression: - data = data[:bh.length] - case blockTypeSnappyCompression: - decLen, err := snappy.DecodedLen(data[:bh.length]) - if err != nil { - r.bpool.Put(data) - return nil, r.newErrCorruptedBH(bh, err.Error()) - } - decData := r.bpool.Get(decLen) - decData, err = snappy.Decode(decData, data[:bh.length]) - r.bpool.Put(data) - if err != nil { - r.bpool.Put(decData) - return nil, r.newErrCorruptedBH(bh, err.Error()) - } - data = decData - default: - r.bpool.Put(data) - return nil, r.newErrCorruptedBH(bh, fmt.Sprintf("unknown compression type %#x", data[bh.length])) - } - return data, nil -} - -func (r *Reader) readBlock(bh blockHandle, verifyChecksum bool) (*block, error) { - data, err := r.readRawBlock(bh, verifyChecksum) - if err != nil { - return nil, err - } - restartsLen := int(binary.LittleEndian.Uint32(data[len(data)-4:])) - b := &block{ - bpool: r.bpool, - bh: bh, - data: data, - restartsLen: restartsLen, - restartsOffset: len(data) - (restartsLen+1)*4, - } - return b, nil -} - -func (r *Reader) readBlockCached(bh blockHandle, verifyChecksum, fillCache bool) (*block, util.Releaser, error) { - if r.cache != nil { - var ( - err error - ch *cache.Handle - ) - if fillCache { - ch = r.cache.Get(bh.offset, func() (size int, value cache.Value) { - var b *block - b, err = r.readBlock(bh, verifyChecksum) - if err != nil { - return 0, nil - } - return cap(b.data), b - }) - } else { - ch = r.cache.Get(bh.offset, nil) - } - if ch != nil { - b, ok := ch.Value().(*block) - if !ok { - ch.Release() - return nil, nil, errors.New("leveldb/table: inconsistent block type") - } - return b, ch, err - } else if err != nil { - return nil, nil, err - } - } - - b, err := r.readBlock(bh, verifyChecksum) - return b, b, err -} - -func (r *Reader) readFilterBlock(bh blockHandle) (*filterBlock, error) { - data, err := r.readRawBlock(bh, true) - if err != nil { - return nil, err - } - n := len(data) - if n < 5 { - return nil, r.newErrCorruptedBH(bh, "too short") - } - m := n - 5 - oOffset := int(binary.LittleEndian.Uint32(data[m:])) - if oOffset > m { - return nil, r.newErrCorruptedBH(bh, "invalid data-offsets offset") - } - b := &filterBlock{ - bpool: r.bpool, - data: data, - oOffset: oOffset, - baseLg: uint(data[n-1]), - filtersNum: (m - oOffset) / 4, - } - return b, nil -} - -func (r *Reader) readFilterBlockCached(bh blockHandle, fillCache bool) (*filterBlock, util.Releaser, error) { - if r.cache != nil { - var ( - err error - ch *cache.Handle - ) - if fillCache { - ch = r.cache.Get(bh.offset, func() (size int, value cache.Value) { - var b *filterBlock - b, err = r.readFilterBlock(bh) - if err != nil { - return 0, nil - } - return cap(b.data), b - }) - } else { - ch = r.cache.Get(bh.offset, nil) - } - if ch != nil { - b, ok := ch.Value().(*filterBlock) - if !ok { - ch.Release() - return nil, nil, errors.New("leveldb/table: inconsistent block type") - } - return b, ch, err - } else if err != nil { - return nil, nil, err - } - } - - b, err := r.readFilterBlock(bh) - return b, b, err -} - -func (r *Reader) getIndexBlock(fillCache bool) (b *block, rel util.Releaser, err error) { - if r.indexBlock == nil { - return r.readBlockCached(r.indexBH, true, fillCache) - } - return r.indexBlock, util.NoopReleaser{}, nil -} - -func (r *Reader) getFilterBlock(fillCache bool) (*filterBlock, util.Releaser, error) { - if r.filterBlock == nil { - return r.readFilterBlockCached(r.filterBH, fillCache) - } - return r.filterBlock, util.NoopReleaser{}, nil -} - -func (r *Reader) newBlockIter(b *block, bReleaser util.Releaser, slice *util.Range, inclLimit bool) *blockIter { - bi := &blockIter{ - tr: r, - block: b, - blockReleaser: bReleaser, - // Valid key should never be nil. - key: make([]byte, 0), - dir: dirSOI, - riStart: 0, - riLimit: b.restartsLen, - offsetStart: 0, - offsetRealStart: 0, - offsetLimit: b.restartsOffset, - } - if slice != nil { - if slice.Start != nil { - if bi.Seek(slice.Start) { - bi.riStart = b.restartIndex(bi.restartIndex, b.restartsLen, bi.prevOffset) - bi.offsetStart = b.restartOffset(bi.riStart) - bi.offsetRealStart = bi.prevOffset - } else { - bi.riStart = b.restartsLen - bi.offsetStart = b.restartsOffset - bi.offsetRealStart = b.restartsOffset - } - } - if slice.Limit != nil { - if bi.Seek(slice.Limit) && (!inclLimit || bi.Next()) { - bi.offsetLimit = bi.prevOffset - bi.riLimit = bi.restartIndex + 1 - } - } - bi.reset() - if bi.offsetStart > bi.offsetLimit { - bi.sErr(errors.New("leveldb/table: invalid slice range")) - } - } - return bi -} - -func (r *Reader) getDataIter(dataBH blockHandle, slice *util.Range, verifyChecksum, fillCache bool) iterator.Iterator { - b, rel, err := r.readBlockCached(dataBH, verifyChecksum, fillCache) - if err != nil { - return iterator.NewEmptyIterator(err) - } - return r.newBlockIter(b, rel, slice, false) -} - -func (r *Reader) getDataIterErr(dataBH blockHandle, slice *util.Range, verifyChecksum, fillCache bool) iterator.Iterator { - r.mu.RLock() - defer r.mu.RUnlock() - - if r.err != nil { - return iterator.NewEmptyIterator(r.err) - } - - return r.getDataIter(dataBH, slice, verifyChecksum, fillCache) -} - -// NewIterator creates an iterator from the table. -// -// Slice allows slicing the iterator to only contains keys in the given -// range. A nil Range.Start is treated as a key before all keys in the -// table. And a nil Range.Limit is treated as a key after all keys in -// the table. -// -// The returned iterator is not safe for concurrent use and should be released -// after use. -// -// Also read Iterator documentation of the leveldb/iterator package. -func (r *Reader) NewIterator(slice *util.Range, ro *opt.ReadOptions) iterator.Iterator { - r.mu.RLock() - defer r.mu.RUnlock() - - if r.err != nil { - return iterator.NewEmptyIterator(r.err) - } - - fillCache := !ro.GetDontFillCache() - indexBlock, rel, err := r.getIndexBlock(fillCache) - if err != nil { - return iterator.NewEmptyIterator(err) - } - index := &indexIter{ - blockIter: r.newBlockIter(indexBlock, rel, slice, true), - tr: r, - slice: slice, - fillCache: !ro.GetDontFillCache(), - } - return iterator.NewIndexedIterator(index, opt.GetStrict(r.o, ro, opt.StrictReader)) -} - -func (r *Reader) find(key []byte, filtered bool, ro *opt.ReadOptions, noValue bool) (rkey, value []byte, err error) { - r.mu.RLock() - defer r.mu.RUnlock() - - if r.err != nil { - err = r.err - return - } - - indexBlock, rel, err := r.getIndexBlock(true) - if err != nil { - return - } - defer rel.Release() - - index := r.newBlockIter(indexBlock, nil, nil, true) - defer index.Release() - - if !index.Seek(key) { - if err = index.Error(); err == nil { - err = ErrNotFound - } - return - } - - dataBH, n := decodeBlockHandle(index.Value()) - if n == 0 { - r.err = r.newErrCorruptedBH(r.indexBH, "bad data block handle") - return nil, nil, r.err - } - - // The filter should only used for exact match. - if filtered && r.filter != nil { - filterBlock, frel, ferr := r.getFilterBlock(true) - if ferr == nil { - if !filterBlock.contains(r.filter, dataBH.offset, key) { - frel.Release() - return nil, nil, ErrNotFound - } - frel.Release() - } else if !errors.IsCorrupted(ferr) { - return nil, nil, ferr - } - } - - data := r.getDataIter(dataBH, nil, r.verifyChecksum, !ro.GetDontFillCache()) - if !data.Seek(key) { - data.Release() - if err = data.Error(); err != nil { - return - } - - // The nearest greater-than key is the first key of the next block. - if !index.Next() { - if err = index.Error(); err == nil { - err = ErrNotFound - } - return - } - - dataBH, n = decodeBlockHandle(index.Value()) - if n == 0 { - r.err = r.newErrCorruptedBH(r.indexBH, "bad data block handle") - return nil, nil, r.err - } - - data = r.getDataIter(dataBH, nil, r.verifyChecksum, !ro.GetDontFillCache()) - if !data.Next() { - data.Release() - if err = data.Error(); err == nil { - err = ErrNotFound - } - return - } - } - - // Key doesn't use block buffer, no need to copy the buffer. - rkey = data.Key() - if !noValue { - if r.bpool == nil { - value = data.Value() - } else { - // Value does use block buffer, and since the buffer will be - // recycled, it need to be copied. - value = append([]byte{}, data.Value()...) - } - } - data.Release() - return -} - -// Find finds key/value pair whose key is greater than or equal to the -// given key. It returns ErrNotFound if the table doesn't contain -// such pair. -// If filtered is true then the nearest 'block' will be checked against -// 'filter data' (if present) and will immediately return ErrNotFound if -// 'filter data' indicates that such pair doesn't exist. -// -// The caller may modify the contents of the returned slice as it is its -// own copy. -// It is safe to modify the contents of the argument after Find returns. -func (r *Reader) Find(key []byte, filtered bool, ro *opt.ReadOptions) (rkey, value []byte, err error) { - return r.find(key, filtered, ro, false) -} - -// FindKey finds key that is greater than or equal to the given key. -// It returns ErrNotFound if the table doesn't contain such key. -// If filtered is true then the nearest 'block' will be checked against -// 'filter data' (if present) and will immediately return ErrNotFound if -// 'filter data' indicates that such key doesn't exist. -// -// The caller may modify the contents of the returned slice as it is its -// own copy. -// It is safe to modify the contents of the argument after Find returns. -func (r *Reader) FindKey(key []byte, filtered bool, ro *opt.ReadOptions) (rkey []byte, err error) { - rkey, _, err = r.find(key, filtered, ro, true) - return -} - -// Get gets the value for the given key. It returns errors.ErrNotFound -// if the table does not contain the key. -// -// The caller may modify the contents of the returned slice as it is its -// own copy. -// It is safe to modify the contents of the argument after Find returns. -func (r *Reader) Get(key []byte, ro *opt.ReadOptions) (value []byte, err error) { - r.mu.RLock() - defer r.mu.RUnlock() - - if r.err != nil { - err = r.err - return - } - - rkey, value, err := r.find(key, false, ro, false) - if err == nil && r.cmp.Compare(rkey, key) != 0 { - value = nil - err = ErrNotFound - } - return -} - -// OffsetOf returns approximate offset for the given key. -// -// It is safe to modify the contents of the argument after Get returns. -func (r *Reader) OffsetOf(key []byte) (offset int64, err error) { - r.mu.RLock() - defer r.mu.RUnlock() - - if r.err != nil { - err = r.err - return - } - - indexBlock, rel, err := r.readBlockCached(r.indexBH, true, true) - if err != nil { - return - } - defer rel.Release() - - index := r.newBlockIter(indexBlock, nil, nil, true) - defer index.Release() - if index.Seek(key) { - dataBH, n := decodeBlockHandle(index.Value()) - if n == 0 { - r.err = r.newErrCorruptedBH(r.indexBH, "bad data block handle") - return - } - offset = int64(dataBH.offset) - return - } - err = index.Error() - if err == nil { - offset = r.dataEnd - } - return -} - -// Release implements util.Releaser. -// It also close the file if it is an io.Closer. -func (r *Reader) Release() { - r.mu.Lock() - defer r.mu.Unlock() - - if closer, ok := r.reader.(io.Closer); ok { - closer.Close() - } - if r.indexBlock != nil { - r.indexBlock.Release() - r.indexBlock = nil - } - if r.filterBlock != nil { - r.filterBlock.Release() - r.filterBlock = nil - } - r.reader = nil - r.cache = nil - r.bpool = nil - r.err = ErrReaderReleased -} - -// NewReader creates a new initialized table reader for the file. -// The fi, cache and bpool is optional and can be nil. -// -// The returned table reader instance is safe for concurrent use. -func NewReader(f io.ReaderAt, size int64, fd storage.FileDesc, cache *cache.NamespaceGetter, bpool *util.BufferPool, o *opt.Options) (*Reader, error) { - if f == nil { - return nil, errors.New("leveldb/table: nil file") - } - - r := &Reader{ - fd: fd, - reader: f, - cache: cache, - bpool: bpool, - o: o, - cmp: o.GetComparer(), - verifyChecksum: o.GetStrict(opt.StrictBlockChecksum), - } - - if size < footerLen { - r.err = r.newErrCorrupted(0, size, "table", "too small") - return r, nil - } - - footerPos := size - footerLen - var footer [footerLen]byte - if _, err := r.reader.ReadAt(footer[:], footerPos); err != nil && err != io.EOF { - return nil, err - } - if string(footer[footerLen-len(magic):footerLen]) != magic { - r.err = r.newErrCorrupted(footerPos, footerLen, "table-footer", "bad magic number") - return r, nil - } - - var n int - // Decode the metaindex block handle. - r.metaBH, n = decodeBlockHandle(footer[:]) - if n == 0 { - r.err = r.newErrCorrupted(footerPos, footerLen, "table-footer", "bad metaindex block handle") - return r, nil - } - - // Decode the index block handle. - r.indexBH, n = decodeBlockHandle(footer[n:]) - if n == 0 { - r.err = r.newErrCorrupted(footerPos, footerLen, "table-footer", "bad index block handle") - return r, nil - } - - // Read metaindex block. - metaBlock, err := r.readBlock(r.metaBH, true) - if err != nil { - if errors.IsCorrupted(err) { - r.err = err - return r, nil - } - return nil, err - } - - // Set data end. - r.dataEnd = int64(r.metaBH.offset) - - // Read metaindex. - metaIter := r.newBlockIter(metaBlock, nil, nil, true) - for metaIter.Next() { - key := string(metaIter.Key()) - if !strings.HasPrefix(key, "filter.") { - continue - } - fn := key[7:] - if f0 := o.GetFilter(); f0 != nil && f0.Name() == fn { - r.filter = f0 - } else { - for _, f0 := range o.GetAltFilters() { - if f0.Name() == fn { - r.filter = f0 - break - } - } - } - if r.filter != nil { - filterBH, n := decodeBlockHandle(metaIter.Value()) - if n == 0 { - continue - } - r.filterBH = filterBH - // Update data end. - r.dataEnd = int64(filterBH.offset) - break - } - } - metaIter.Release() - metaBlock.Release() - - // Cache index and filter block locally, since we don't have global cache. - if cache == nil { - r.indexBlock, err = r.readBlock(r.indexBH, true) - if err != nil { - if errors.IsCorrupted(err) { - r.err = err - return r, nil - } - return nil, err - } - if r.filter != nil { - r.filterBlock, err = r.readFilterBlock(r.filterBH) - if err != nil { - if !errors.IsCorrupted(err) { - return nil, err - } - - // Don't use filter then. - r.filter = nil - } - } - } - - return r, nil -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/table/table.go b/vendor/github.com/syndtr/goleveldb/leveldb/table/table.go deleted file mode 100644 index beacdc1f024a..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/table/table.go +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package table allows read and write sorted key/value. -package table - -import ( - "encoding/binary" -) - -/* -Table: - -Table is consist of one or more data blocks, an optional filter block -a metaindex block, an index block and a table footer. Metaindex block -is a special block used to keep parameters of the table, such as filter -block name and its block handle. Index block is a special block used to -keep record of data blocks offset and length, index block use one as -restart interval. The key used by index block are the last key of preceding -block, shorter separator of adjacent blocks or shorter successor of the -last key of the last block. Filter block is an optional block contains -sequence of filter data generated by a filter generator. - -Table data structure: - + optional - / - +--------------+--------------+--------------+------+-------+-----------------+-------------+--------+ - | data block 1 | ... | data block n | filter block | metaindex block | index block | footer | - +--------------+--------------+--------------+--------------+-----------------+-------------+--------+ - - Each block followed by a 5-bytes trailer contains compression type and checksum. - -Table block trailer: - - +---------------------------+-------------------+ - | compression type (1-byte) | checksum (4-byte) | - +---------------------------+-------------------+ - - The checksum is a CRC-32 computed using Castagnoli's polynomial. Compression - type also included in the checksum. - -Table footer: - - +------------------- 40-bytes -------------------+ - / \ - +------------------------+--------------------+------+-----------------+ - | metaindex block handle / index block handle / ---- | magic (8-bytes) | - +------------------------+--------------------+------+-----------------+ - - The magic are first 64-bit of SHA-1 sum of "http://code.google.com/p/leveldb/". - -NOTE: All fixed-length integer are little-endian. -*/ - -/* -Block: - -Block is consist of one or more key/value entries and a block trailer. -Block entry shares key prefix with its preceding key until a restart -point reached. A block should contains at least one restart point. -First restart point are always zero. - -Block data structure: - - + restart point + restart point (depends on restart interval) - / / - +---------------+---------------+---------------+---------------+---------+ - | block entry 1 | block entry 2 | ... | block entry n | trailer | - +---------------+---------------+---------------+---------------+---------+ - -Key/value entry: - - +---- key len ----+ - / \ - +-------+---------+-----------+---------+--------------------+--------------+----------------+ - | shared (varint) | not shared (varint) | value len (varint) | key (varlen) | value (varlen) | - +-----------------+---------------------+--------------------+--------------+----------------+ - - Block entry shares key prefix with its preceding key: - Conditions: - restart_interval=2 - entry one : key=deck,value=v1 - entry two : key=dock,value=v2 - entry three: key=duck,value=v3 - The entries will be encoded as follow: - - + restart point (offset=0) + restart point (offset=16) - / / - +-----+-----+-----+----------+--------+-----+-----+-----+---------+--------+-----+-----+-----+----------+--------+ - | 0 | 4 | 2 | "deck" | "v1" | 1 | 3 | 2 | "ock" | "v2" | 0 | 4 | 2 | "duck" | "v3" | - +-----+-----+-----+----------+--------+-----+-----+-----+---------+--------+-----+-----+-----+----------+--------+ - \ / \ / \ / - +----------- entry one -----------+ +----------- entry two ----------+ +---------- entry three ----------+ - - The block trailer will contains two restart points: - - +------------+-----------+--------+ - | 0 | 16 | 2 | - +------------+-----------+---+----+ - \ / \ - +-- restart points --+ + restart points length - -Block trailer: - - +-- 4-bytes --+ - / \ - +-----------------+-----------------+-----------------+------------------------------+ - | restart point 1 | .... | restart point n | restart points len (4-bytes) | - +-----------------+-----------------+-----------------+------------------------------+ - - -NOTE: All fixed-length integer are little-endian. -*/ - -/* -Filter block: - -Filter block consist of one or more filter data and a filter block trailer. -The trailer contains filter data offsets, a trailer offset and a 1-byte base Lg. - -Filter block data structure: - - + offset 1 + offset 2 + offset n + trailer offset - / / / / - +---------------+---------------+---------------+---------+ - | filter data 1 | ... | filter data n | trailer | - +---------------+---------------+---------------+---------+ - -Filter block trailer: - - +- 4-bytes -+ - / \ - +---------------+---------------+---------------+-------------------------------+------------------+ - | data 1 offset | .... | data n offset | data-offsets offset (4-bytes) | base Lg (1-byte) | - +-------------- +---------------+---------------+-------------------------------+------------------+ - - -NOTE: All fixed-length integer are little-endian. -*/ - -const ( - blockTrailerLen = 5 - footerLen = 48 - - magic = "\x57\xfb\x80\x8b\x24\x75\x47\xdb" - - // The block type gives the per-block compression format. - // These constants are part of the file format and should not be changed. - blockTypeNoCompression = 0 - blockTypeSnappyCompression = 1 - - // Generate new filter every 2KB of data - filterBaseLg = 11 - filterBase = 1 << filterBaseLg -) - -type blockHandle struct { - offset, length uint64 -} - -func decodeBlockHandle(src []byte) (blockHandle, int) { - offset, n := binary.Uvarint(src) - length, m := binary.Uvarint(src[n:]) - if n == 0 || m == 0 { - return blockHandle{}, 0 - } - return blockHandle{offset, length}, n + m -} - -func encodeBlockHandle(dst []byte, b blockHandle) int { - n := binary.PutUvarint(dst, b.offset) - m := binary.PutUvarint(dst[n:], b.length) - return n + m -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/table/writer.go b/vendor/github.com/syndtr/goleveldb/leveldb/table/writer.go deleted file mode 100644 index b96b271d8ddb..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/table/writer.go +++ /dev/null @@ -1,375 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package table - -import ( - "encoding/binary" - "errors" - "fmt" - "io" - - "github.com/golang/snappy" - - "github.com/syndtr/goleveldb/leveldb/comparer" - "github.com/syndtr/goleveldb/leveldb/filter" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/util" -) - -func sharedPrefixLen(a, b []byte) int { - i, n := 0, len(a) - if n > len(b) { - n = len(b) - } - for i < n && a[i] == b[i] { - i++ - } - return i -} - -type blockWriter struct { - restartInterval int - buf util.Buffer - nEntries int - prevKey []byte - restarts []uint32 - scratch []byte -} - -func (w *blockWriter) append(key, value []byte) { - nShared := 0 - if w.nEntries%w.restartInterval == 0 { - w.restarts = append(w.restarts, uint32(w.buf.Len())) - } else { - nShared = sharedPrefixLen(w.prevKey, key) - } - n := binary.PutUvarint(w.scratch[0:], uint64(nShared)) - n += binary.PutUvarint(w.scratch[n:], uint64(len(key)-nShared)) - n += binary.PutUvarint(w.scratch[n:], uint64(len(value))) - w.buf.Write(w.scratch[:n]) - w.buf.Write(key[nShared:]) - w.buf.Write(value) - w.prevKey = append(w.prevKey[:0], key...) - w.nEntries++ -} - -func (w *blockWriter) finish() { - // Write restarts entry. - if w.nEntries == 0 { - // Must have at least one restart entry. - w.restarts = append(w.restarts, 0) - } - w.restarts = append(w.restarts, uint32(len(w.restarts))) - for _, x := range w.restarts { - buf4 := w.buf.Alloc(4) - binary.LittleEndian.PutUint32(buf4, x) - } -} - -func (w *blockWriter) reset() { - w.buf.Reset() - w.nEntries = 0 - w.restarts = w.restarts[:0] -} - -func (w *blockWriter) bytesLen() int { - restartsLen := len(w.restarts) - if restartsLen == 0 { - restartsLen = 1 - } - return w.buf.Len() + 4*restartsLen + 4 -} - -type filterWriter struct { - generator filter.FilterGenerator - buf util.Buffer - nKeys int - offsets []uint32 -} - -func (w *filterWriter) add(key []byte) { - if w.generator == nil { - return - } - w.generator.Add(key) - w.nKeys++ -} - -func (w *filterWriter) flush(offset uint64) { - if w.generator == nil { - return - } - for x := int(offset / filterBase); x > len(w.offsets); { - w.generate() - } -} - -func (w *filterWriter) finish() { - if w.generator == nil { - return - } - // Generate last keys. - - if w.nKeys > 0 { - w.generate() - } - w.offsets = append(w.offsets, uint32(w.buf.Len())) - for _, x := range w.offsets { - buf4 := w.buf.Alloc(4) - binary.LittleEndian.PutUint32(buf4, x) - } - w.buf.WriteByte(filterBaseLg) -} - -func (w *filterWriter) generate() { - // Record offset. - w.offsets = append(w.offsets, uint32(w.buf.Len())) - // Generate filters. - if w.nKeys > 0 { - w.generator.Generate(&w.buf) - w.nKeys = 0 - } -} - -// Writer is a table writer. -type Writer struct { - writer io.Writer - err error - // Options - cmp comparer.Comparer - filter filter.Filter - compression opt.Compression - blockSize int - - dataBlock blockWriter - indexBlock blockWriter - filterBlock filterWriter - pendingBH blockHandle - offset uint64 - nEntries int - // Scratch allocated enough for 5 uvarint. Block writer should not use - // first 20-bytes since it will be used to encode block handle, which - // then passed to the block writer itself. - scratch [50]byte - comparerScratch []byte - compressionScratch []byte -} - -func (w *Writer) writeBlock(buf *util.Buffer, compression opt.Compression) (bh blockHandle, err error) { - // Compress the buffer if necessary. - var b []byte - if compression == opt.SnappyCompression { - // Allocate scratch enough for compression and block trailer. - if n := snappy.MaxEncodedLen(buf.Len()) + blockTrailerLen; len(w.compressionScratch) < n { - w.compressionScratch = make([]byte, n) - } - compressed := snappy.Encode(w.compressionScratch, buf.Bytes()) - n := len(compressed) - b = compressed[:n+blockTrailerLen] - b[n] = blockTypeSnappyCompression - } else { - tmp := buf.Alloc(blockTrailerLen) - tmp[0] = blockTypeNoCompression - b = buf.Bytes() - } - - // Calculate the checksum. - n := len(b) - 4 - checksum := util.NewCRC(b[:n]).Value() - binary.LittleEndian.PutUint32(b[n:], checksum) - - // Write the buffer to the file. - _, err = w.writer.Write(b) - if err != nil { - return - } - bh = blockHandle{w.offset, uint64(len(b) - blockTrailerLen)} - w.offset += uint64(len(b)) - return -} - -func (w *Writer) flushPendingBH(key []byte) { - if w.pendingBH.length == 0 { - return - } - var separator []byte - if len(key) == 0 { - separator = w.cmp.Successor(w.comparerScratch[:0], w.dataBlock.prevKey) - } else { - separator = w.cmp.Separator(w.comparerScratch[:0], w.dataBlock.prevKey, key) - } - if separator == nil { - separator = w.dataBlock.prevKey - } else { - w.comparerScratch = separator - } - n := encodeBlockHandle(w.scratch[:20], w.pendingBH) - // Append the block handle to the index block. - w.indexBlock.append(separator, w.scratch[:n]) - // Reset prev key of the data block. - w.dataBlock.prevKey = w.dataBlock.prevKey[:0] - // Clear pending block handle. - w.pendingBH = blockHandle{} -} - -func (w *Writer) finishBlock() error { - w.dataBlock.finish() - bh, err := w.writeBlock(&w.dataBlock.buf, w.compression) - if err != nil { - return err - } - w.pendingBH = bh - // Reset the data block. - w.dataBlock.reset() - // Flush the filter block. - w.filterBlock.flush(w.offset) - return nil -} - -// Append appends key/value pair to the table. The keys passed must -// be in increasing order. -// -// It is safe to modify the contents of the arguments after Append returns. -func (w *Writer) Append(key, value []byte) error { - if w.err != nil { - return w.err - } - if w.nEntries > 0 && w.cmp.Compare(w.dataBlock.prevKey, key) >= 0 { - w.err = fmt.Errorf("leveldb/table: Writer: keys are not in increasing order: %q, %q", w.dataBlock.prevKey, key) - return w.err - } - - w.flushPendingBH(key) - // Append key/value pair to the data block. - w.dataBlock.append(key, value) - // Add key to the filter block. - w.filterBlock.add(key) - - // Finish the data block if block size target reached. - if w.dataBlock.bytesLen() >= w.blockSize { - if err := w.finishBlock(); err != nil { - w.err = err - return w.err - } - } - w.nEntries++ - return nil -} - -// BlocksLen returns number of blocks written so far. -func (w *Writer) BlocksLen() int { - n := w.indexBlock.nEntries - if w.pendingBH.length > 0 { - // Includes the pending block. - n++ - } - return n -} - -// EntriesLen returns number of entries added so far. -func (w *Writer) EntriesLen() int { - return w.nEntries -} - -// BytesLen returns number of bytes written so far. -func (w *Writer) BytesLen() int { - return int(w.offset) -} - -// Close will finalize the table. Calling Append is not possible -// after Close, but calling BlocksLen, EntriesLen and BytesLen -// is still possible. -func (w *Writer) Close() error { - if w.err != nil { - return w.err - } - - // Write the last data block. Or empty data block if there - // aren't any data blocks at all. - if w.dataBlock.nEntries > 0 || w.nEntries == 0 { - if err := w.finishBlock(); err != nil { - w.err = err - return w.err - } - } - w.flushPendingBH(nil) - - // Write the filter block. - var filterBH blockHandle - w.filterBlock.finish() - if buf := &w.filterBlock.buf; buf.Len() > 0 { - filterBH, w.err = w.writeBlock(buf, opt.NoCompression) - if w.err != nil { - return w.err - } - } - - // Write the metaindex block. - if filterBH.length > 0 { - key := []byte("filter." + w.filter.Name()) - n := encodeBlockHandle(w.scratch[:20], filterBH) - w.dataBlock.append(key, w.scratch[:n]) - } - w.dataBlock.finish() - metaindexBH, err := w.writeBlock(&w.dataBlock.buf, w.compression) - if err != nil { - w.err = err - return w.err - } - - // Write the index block. - w.indexBlock.finish() - indexBH, err := w.writeBlock(&w.indexBlock.buf, w.compression) - if err != nil { - w.err = err - return w.err - } - - // Write the table footer. - footer := w.scratch[:footerLen] - for i := range footer { - footer[i] = 0 - } - n := encodeBlockHandle(footer, metaindexBH) - encodeBlockHandle(footer[n:], indexBH) - copy(footer[footerLen-len(magic):], magic) - if _, err := w.writer.Write(footer); err != nil { - w.err = err - return w.err - } - w.offset += footerLen - - w.err = errors.New("leveldb/table: writer is closed") - return nil -} - -// NewWriter creates a new initialized table writer for the file. -// -// Table writer is not safe for concurrent use. -func NewWriter(f io.Writer, o *opt.Options) *Writer { - w := &Writer{ - writer: f, - cmp: o.GetComparer(), - filter: o.GetFilter(), - compression: o.GetCompression(), - blockSize: o.GetBlockSize(), - comparerScratch: make([]byte, 0), - } - // data block - w.dataBlock.restartInterval = o.GetBlockRestartInterval() - // The first 20-bytes are used for encoding block handle. - w.dataBlock.scratch = w.scratch[20:] - // index block - w.indexBlock.restartInterval = 1 - w.indexBlock.scratch = w.scratch[20:] - // filter block - if w.filter != nil { - w.filterBlock.generator = w.filter.NewGenerator() - w.filterBlock.flush(0) - } - return w -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/util.go b/vendor/github.com/syndtr/goleveldb/leveldb/util.go deleted file mode 100644 index 0e2b519e5c71..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/util.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "fmt" - "sort" - - "github.com/syndtr/goleveldb/leveldb/storage" -) - -func shorten(str string) string { - if len(str) <= 8 { - return str - } - return str[:3] + ".." + str[len(str)-3:] -} - -var bunits = [...]string{"", "Ki", "Mi", "Gi", "Ti"} - -func shortenb(bytes int) string { - i := 0 - for ; bytes > 1024 && i < 4; i++ { - bytes /= 1024 - } - return fmt.Sprintf("%d%sB", bytes, bunits[i]) -} - -func sshortenb(bytes int) string { - if bytes == 0 { - return "~" - } - sign := "+" - if bytes < 0 { - sign = "-" - bytes *= -1 - } - i := 0 - for ; bytes > 1024 && i < 4; i++ { - bytes /= 1024 - } - return fmt.Sprintf("%s%d%sB", sign, bytes, bunits[i]) -} - -func sint(x int) string { - if x == 0 { - return "~" - } - sign := "+" - if x < 0 { - sign = "-" - x *= -1 - } - return fmt.Sprintf("%s%d", sign, x) -} - -func minInt(a, b int) int { - if a < b { - return a - } - return b -} - -func maxInt(a, b int) int { - if a > b { - return a - } - return b -} - -type fdSorter []storage.FileDesc - -func (p fdSorter) Len() int { - return len(p) -} - -func (p fdSorter) Less(i, j int) bool { - return p[i].Num < p[j].Num -} - -func (p fdSorter) Swap(i, j int) { - p[i], p[j] = p[j], p[i] -} - -func sortFds(fds []storage.FileDesc) { - sort.Sort(fdSorter(fds)) -} - -func ensureBuffer(b []byte, n int) []byte { - if cap(b) < n { - return make([]byte, n) - } - return b[:n] -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/util/buffer.go b/vendor/github.com/syndtr/goleveldb/leveldb/util/buffer.go deleted file mode 100644 index 21de242552d2..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/util/buffer.go +++ /dev/null @@ -1,293 +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. - -package util - -// This a copy of Go std bytes.Buffer with some modification -// and some features stripped. - -import ( - "bytes" - "io" -) - -// A Buffer is a variable-sized buffer of bytes with Read and Write methods. -// The zero value for Buffer is an empty buffer ready to use. -type Buffer struct { - buf []byte // contents are the bytes buf[off : len(buf)] - off int // read at &buf[off], write at &buf[len(buf)] - bootstrap [64]byte // memory to hold first slice; helps small buffers (Printf) avoid allocation. -} - -// Bytes returns a slice of the contents of the unread portion of the buffer; -// len(b.Bytes()) == b.Len(). If the caller changes the contents of the -// returned slice, the contents of the buffer will change provided there -// are no intervening method calls on the Buffer. -func (b *Buffer) Bytes() []byte { return b.buf[b.off:] } - -// String returns the contents of the unread portion of the buffer -// as a string. If the Buffer is a nil pointer, it returns "". -func (b *Buffer) String() string { - if b == nil { - // Special case, useful in debugging. - return "" - } - return string(b.buf[b.off:]) -} - -// Len returns the number of bytes of the unread portion of the buffer; -// b.Len() == len(b.Bytes()). -func (b *Buffer) Len() int { return len(b.buf) - b.off } - -// Truncate discards all but the first n unread bytes from the buffer. -// It panics if n is negative or greater than the length of the buffer. -func (b *Buffer) Truncate(n int) { - switch { - case n < 0 || n > b.Len(): - panic("leveldb/util.Buffer: truncation out of range") - case n == 0: - // Reuse buffer space. - b.off = 0 - } - b.buf = b.buf[0 : b.off+n] -} - -// Reset resets the buffer so it has no content. -// b.Reset() is the same as b.Truncate(0). -func (b *Buffer) Reset() { b.Truncate(0) } - -// grow grows the buffer to guarantee space for n more bytes. -// It returns the index where bytes should be written. -// If the buffer can't grow it will panic with bytes.ErrTooLarge. -func (b *Buffer) grow(n int) int { - m := b.Len() - // If buffer is empty, reset to recover space. - if m == 0 && b.off != 0 { - b.Truncate(0) - } - if len(b.buf)+n > cap(b.buf) { - var buf []byte - if b.buf == nil && n <= len(b.bootstrap) { - buf = b.bootstrap[0:] - } else if m+n <= cap(b.buf)/2 { - // We can slide things down instead of allocating a new - // slice. We only need m+n <= cap(b.buf) to slide, but - // we instead let capacity get twice as large so we - // don't spend all our time copying. - copy(b.buf[:], b.buf[b.off:]) - buf = b.buf[:m] - } else { - // not enough space anywhere - buf = makeSlice(2*cap(b.buf) + n) - copy(buf, b.buf[b.off:]) - } - b.buf = buf - b.off = 0 - } - b.buf = b.buf[0 : b.off+m+n] - return b.off + m -} - -// Alloc allocs n bytes of slice from the buffer, growing the buffer as -// needed. If n is negative, Alloc will panic. -// If the buffer can't grow it will panic with bytes.ErrTooLarge. -func (b *Buffer) Alloc(n int) []byte { - if n < 0 { - panic("leveldb/util.Buffer.Alloc: negative count") - } - m := b.grow(n) - return b.buf[m:] -} - -// Grow grows the buffer's capacity, if necessary, to guarantee space for -// another n bytes. After Grow(n), at least n bytes can be written to the -// buffer without another allocation. -// If n is negative, Grow will panic. -// If the buffer can't grow it will panic with bytes.ErrTooLarge. -func (b *Buffer) Grow(n int) { - if n < 0 { - panic("leveldb/util.Buffer.Grow: negative count") - } - m := b.grow(n) - b.buf = b.buf[0:m] -} - -// Write appends the contents of p to the buffer, growing the buffer as -// needed. The return value n is the length of p; err is always nil. If the -// buffer becomes too large, Write will panic with bytes.ErrTooLarge. -func (b *Buffer) Write(p []byte) (n int, err error) { - m := b.grow(len(p)) - return copy(b.buf[m:], p), nil -} - -// MinRead is the minimum slice size passed to a Read call by -// Buffer.ReadFrom. As long as the Buffer has at least MinRead bytes beyond -// what is required to hold the contents of r, ReadFrom will not grow the -// underlying buffer. -const MinRead = 512 - -// ReadFrom reads data from r until EOF and appends it to the buffer, growing -// the buffer as needed. The return value n is the number of bytes read. Any -// error except io.EOF encountered during the read is also returned. If the -// buffer becomes too large, ReadFrom will panic with bytes.ErrTooLarge. -func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error) { - // If buffer is empty, reset to recover space. - if b.off >= len(b.buf) { - b.Truncate(0) - } - for { - if free := cap(b.buf) - len(b.buf); free < MinRead { - // not enough space at end - newBuf := b.buf - if b.off+free < MinRead { - // not enough space using beginning of buffer; - // double buffer capacity - newBuf = makeSlice(2*cap(b.buf) + MinRead) - } - copy(newBuf, b.buf[b.off:]) - b.buf = newBuf[:len(b.buf)-b.off] - b.off = 0 - } - m, e := r.Read(b.buf[len(b.buf):cap(b.buf)]) - b.buf = b.buf[0 : len(b.buf)+m] - n += int64(m) - if e == io.EOF { - break - } - if e != nil { - return n, e - } - } - return n, nil // err is EOF, so return nil explicitly -} - -// makeSlice allocates a slice of size n. If the allocation fails, it panics -// with bytes.ErrTooLarge. -func makeSlice(n int) []byte { - // If the make fails, give a known error. - defer func() { - if recover() != nil { - panic(bytes.ErrTooLarge) - } - }() - return make([]byte, n) -} - -// WriteTo writes data to w until the buffer is drained or an error occurs. -// The return value n is the number of bytes written; it always fits into an -// int, but it is int64 to match the io.WriterTo interface. Any error -// encountered during the write is also returned. -func (b *Buffer) WriteTo(w io.Writer) (n int64, err error) { - if b.off < len(b.buf) { - nBytes := b.Len() - m, e := w.Write(b.buf[b.off:]) - if m > nBytes { - panic("leveldb/util.Buffer.WriteTo: invalid Write count") - } - b.off += m - n = int64(m) - if e != nil { - return n, e - } - // all bytes should have been written, by definition of - // Write method in io.Writer - if m != nBytes { - return n, io.ErrShortWrite - } - } - // Buffer is now empty; reset. - b.Truncate(0) - return -} - -// WriteByte appends the byte c to the buffer, growing the buffer as needed. -// The returned error is always nil, but is included to match bufio.Writer's -// WriteByte. If the buffer becomes too large, WriteByte will panic with -// bytes.ErrTooLarge. -func (b *Buffer) WriteByte(c byte) error { - m := b.grow(1) - b.buf[m] = c - return nil -} - -// Read reads the next len(p) bytes from the buffer or until the buffer -// is drained. The return value n is the number of bytes read. If the -// buffer has no data to return, err is io.EOF (unless len(p) is zero); -// otherwise it is nil. -func (b *Buffer) Read(p []byte) (n int, err error) { - if b.off >= len(b.buf) { - // Buffer is empty, reset to recover space. - b.Truncate(0) - if len(p) == 0 { - return - } - return 0, io.EOF - } - n = copy(p, b.buf[b.off:]) - b.off += n - return -} - -// Next returns a slice containing the next n bytes from the buffer, -// advancing the buffer as if the bytes had been returned by Read. -// If there are fewer than n bytes in the buffer, Next returns the entire buffer. -// The slice is only valid until the next call to a read or write method. -func (b *Buffer) Next(n int) []byte { - m := b.Len() - if n > m { - n = m - } - data := b.buf[b.off : b.off+n] - b.off += n - return data -} - -// ReadByte reads and returns the next byte from the buffer. -// If no byte is available, it returns error io.EOF. -func (b *Buffer) ReadByte() (c byte, err error) { - if b.off >= len(b.buf) { - // Buffer is empty, reset to recover space. - b.Truncate(0) - return 0, io.EOF - } - c = b.buf[b.off] - b.off++ - return c, nil -} - -// ReadBytes reads until the first occurrence of delim in the input, -// returning a slice containing the data up to and including the delimiter. -// If ReadBytes encounters an error before finding a delimiter, -// it returns the data read before the error and the error itself (often io.EOF). -// ReadBytes returns err != nil if and only if the returned data does not end in -// delim. -func (b *Buffer) ReadBytes(delim byte) (line []byte, err error) { - slice, err := b.readSlice(delim) - // return a copy of slice. The buffer's backing array may - // be overwritten by later calls. - line = append(line, slice...) - return -} - -// readSlice is like ReadBytes but returns a reference to internal buffer data. -func (b *Buffer) readSlice(delim byte) (line []byte, err error) { - i := bytes.IndexByte(b.buf[b.off:], delim) - end := b.off + i + 1 - if i < 0 { - end = len(b.buf) - err = io.EOF - } - line = b.buf[b.off:end] - b.off = end - return line, err -} - -// NewBuffer creates and initializes a new Buffer using buf as its initial -// contents. It is intended to prepare a Buffer to read existing data. It -// can also be used to size the internal buffer for writing. To do that, -// buf should have the desired capacity but a length of zero. -// -// In most cases, new(Buffer) (or just declaring a Buffer variable) is -// sufficient to initialize a Buffer. -func NewBuffer(buf []byte) *Buffer { return &Buffer{buf: buf} } diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/util/buffer_pool.go b/vendor/github.com/syndtr/goleveldb/leveldb/util/buffer_pool.go deleted file mode 100644 index 2f3db974a796..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/util/buffer_pool.go +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright (c) 2014, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package util - -import ( - "fmt" - "sync" - "sync/atomic" - "time" -) - -type buffer struct { - b []byte - miss int -} - -// BufferPool is a 'buffer pool'. -type BufferPool struct { - pool [6]chan []byte - size [5]uint32 - sizeMiss [5]uint32 - sizeHalf [5]uint32 - baseline [4]int - baseline0 int - - mu sync.RWMutex - closed bool - closeC chan struct{} - - get uint32 - put uint32 - half uint32 - less uint32 - equal uint32 - greater uint32 - miss uint32 -} - -func (p *BufferPool) poolNum(n int) int { - if n <= p.baseline0 && n > p.baseline0/2 { - return 0 - } - for i, x := range p.baseline { - if n <= x { - return i + 1 - } - } - return len(p.baseline) + 1 -} - -// Get returns buffer with length of n. -func (p *BufferPool) Get(n int) []byte { - if p == nil { - return make([]byte, n) - } - - p.mu.RLock() - defer p.mu.RUnlock() - - if p.closed { - return make([]byte, n) - } - - atomic.AddUint32(&p.get, 1) - - poolNum := p.poolNum(n) - pool := p.pool[poolNum] - if poolNum == 0 { - // Fast path. - select { - case b := <-pool: - switch { - case cap(b) > n: - if cap(b)-n >= n { - atomic.AddUint32(&p.half, 1) - select { - case pool <- b: - default: - } - return make([]byte, n) - } else { - atomic.AddUint32(&p.less, 1) - return b[:n] - } - case cap(b) == n: - atomic.AddUint32(&p.equal, 1) - return b[:n] - default: - atomic.AddUint32(&p.greater, 1) - } - default: - atomic.AddUint32(&p.miss, 1) - } - - return make([]byte, n, p.baseline0) - } else { - sizePtr := &p.size[poolNum-1] - - select { - case b := <-pool: - switch { - case cap(b) > n: - if cap(b)-n >= n { - atomic.AddUint32(&p.half, 1) - sizeHalfPtr := &p.sizeHalf[poolNum-1] - if atomic.AddUint32(sizeHalfPtr, 1) == 20 { - atomic.StoreUint32(sizePtr, uint32(cap(b)/2)) - atomic.StoreUint32(sizeHalfPtr, 0) - } else { - select { - case pool <- b: - default: - } - } - return make([]byte, n) - } else { - atomic.AddUint32(&p.less, 1) - return b[:n] - } - case cap(b) == n: - atomic.AddUint32(&p.equal, 1) - return b[:n] - default: - atomic.AddUint32(&p.greater, 1) - if uint32(cap(b)) >= atomic.LoadUint32(sizePtr) { - select { - case pool <- b: - default: - } - } - } - default: - atomic.AddUint32(&p.miss, 1) - } - - if size := atomic.LoadUint32(sizePtr); uint32(n) > size { - if size == 0 { - atomic.CompareAndSwapUint32(sizePtr, 0, uint32(n)) - } else { - sizeMissPtr := &p.sizeMiss[poolNum-1] - if atomic.AddUint32(sizeMissPtr, 1) == 20 { - atomic.StoreUint32(sizePtr, uint32(n)) - atomic.StoreUint32(sizeMissPtr, 0) - } - } - return make([]byte, n) - } else { - return make([]byte, n, size) - } - } -} - -// Put adds given buffer to the pool. -func (p *BufferPool) Put(b []byte) { - if p == nil { - return - } - - p.mu.RLock() - defer p.mu.RUnlock() - - if p.closed { - return - } - - atomic.AddUint32(&p.put, 1) - - pool := p.pool[p.poolNum(cap(b))] - select { - case pool <- b: - default: - } - -} - -func (p *BufferPool) Close() { - if p == nil { - return - } - - p.mu.Lock() - if !p.closed { - p.closed = true - p.closeC <- struct{}{} - } - p.mu.Unlock() -} - -func (p *BufferPool) String() string { - if p == nil { - return "" - } - - return fmt.Sprintf("BufferPool{B·%d Z·%v Zm·%v Zh·%v G·%d P·%d H·%d <·%d =·%d >·%d M·%d}", - p.baseline0, p.size, p.sizeMiss, p.sizeHalf, p.get, p.put, p.half, p.less, p.equal, p.greater, p.miss) -} - -func (p *BufferPool) drain() { - ticker := time.NewTicker(2 * time.Second) - defer ticker.Stop() - for { - select { - case <-ticker.C: - for _, ch := range p.pool { - select { - case <-ch: - default: - } - } - case <-p.closeC: - close(p.closeC) - for _, ch := range p.pool { - close(ch) - } - return - } - } -} - -// NewBufferPool creates a new initialized 'buffer pool'. -func NewBufferPool(baseline int) *BufferPool { - if baseline <= 0 { - panic("baseline can't be <= 0") - } - p := &BufferPool{ - baseline0: baseline, - baseline: [...]int{baseline / 4, baseline / 2, baseline * 2, baseline * 4}, - closeC: make(chan struct{}, 1), - } - for i, cap := range []int{2, 2, 4, 4, 2, 1} { - p.pool[i] = make(chan []byte, cap) - } - go p.drain() - return p -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/util/crc32.go b/vendor/github.com/syndtr/goleveldb/leveldb/util/crc32.go deleted file mode 100644 index 631c9d6109c9..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/util/crc32.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2011 The LevelDB-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 util - -import ( - "hash/crc32" -) - -var table = crc32.MakeTable(crc32.Castagnoli) - -// CRC is a CRC-32 checksum computed using Castagnoli's polynomial. -type CRC uint32 - -// NewCRC creates a new crc based on the given bytes. -func NewCRC(b []byte) CRC { - return CRC(0).Update(b) -} - -// Update updates the crc with the given bytes. -func (c CRC) Update(b []byte) CRC { - return CRC(crc32.Update(uint32(c), table, b)) -} - -// Value returns a masked crc. -func (c CRC) Value() uint32 { - return uint32(c>>15|c<<17) + 0xa282ead8 -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/util/hash.go b/vendor/github.com/syndtr/goleveldb/leveldb/util/hash.go deleted file mode 100644 index 7f3fa4e2c79e..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/util/hash.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package util - -import ( - "encoding/binary" -) - -// Hash return hash of the given data. -func Hash(data []byte, seed uint32) uint32 { - // Similar to murmur hash - const ( - m = uint32(0xc6a4a793) - r = uint32(24) - ) - var ( - h = seed ^ (uint32(len(data)) * m) - i int - ) - - for n := len(data) - len(data)%4; i < n; i += 4 { - h += binary.LittleEndian.Uint32(data[i:]) - h *= m - h ^= (h >> 16) - } - - switch len(data) - i { - default: - panic("not reached") - case 3: - h += uint32(data[i+2]) << 16 - fallthrough - case 2: - h += uint32(data[i+1]) << 8 - fallthrough - case 1: - h += uint32(data[i]) - h *= m - h ^= (h >> r) - case 0: - } - - return h -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/util/range.go b/vendor/github.com/syndtr/goleveldb/leveldb/util/range.go deleted file mode 100644 index 85159583d2c3..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/util/range.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2014, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package util - -// Range is a key range. -type Range struct { - // Start of the key range, include in the range. - Start []byte - - // Limit of the key range, not include in the range. - Limit []byte -} - -// BytesPrefix returns key range that satisfy the given prefix. -// This only applicable for the standard 'bytes comparer'. -func BytesPrefix(prefix []byte) *Range { - var limit []byte - for i := len(prefix) - 1; i >= 0; i-- { - c := prefix[i] - if c < 0xff { - limit = make([]byte, i+1) - copy(limit, prefix) - limit[i] = c + 1 - break - } - } - return &Range{prefix, limit} -} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/util/util.go b/vendor/github.com/syndtr/goleveldb/leveldb/util/util.go deleted file mode 100644 index 80614afc58fc..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/util/util.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) 2013, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Package util provides utilities used throughout leveldb. -package util - -import ( - "errors" -) - -var ( - ErrReleased = errors.New("leveldb: resource already relesed") - ErrHasReleaser = errors.New("leveldb: releaser already defined") -) - -// Releaser is the interface that wraps the basic Release method. -type Releaser interface { - // Release releases associated resources. Release should always success - // and can be called multiple times without causing error. - Release() -} - -// ReleaseSetter is the interface that wraps the basic SetReleaser method. -type ReleaseSetter interface { - // SetReleaser associates the given releaser to the resources. The - // releaser will be called once coresponding resources released. - // Calling SetReleaser with nil will clear the releaser. - // - // This will panic if a releaser already present or coresponding - // resource is already released. Releaser should be cleared first - // before assigned a new one. - SetReleaser(releaser Releaser) -} - -// BasicReleaser provides basic implementation of Releaser and ReleaseSetter. -type BasicReleaser struct { - releaser Releaser - released bool -} - -// Released returns whether Release method already called. -func (r *BasicReleaser) Released() bool { - return r.released -} - -// Release implements Releaser.Release. -func (r *BasicReleaser) Release() { - if !r.released { - if r.releaser != nil { - r.releaser.Release() - r.releaser = nil - } - r.released = true - } -} - -// SetReleaser implements ReleaseSetter.SetReleaser. -func (r *BasicReleaser) SetReleaser(releaser Releaser) { - if r.released { - panic(ErrReleased) - } - if r.releaser != nil && releaser != nil { - panic(ErrHasReleaser) - } - r.releaser = releaser -} - -type NoopReleaser struct{} - -func (NoopReleaser) Release() {} diff --git a/vendor/github.com/syndtr/goleveldb/leveldb/version.go b/vendor/github.com/syndtr/goleveldb/leveldb/version.go deleted file mode 100644 index 73f272af5ff4..000000000000 --- a/vendor/github.com/syndtr/goleveldb/leveldb/version.go +++ /dev/null @@ -1,528 +0,0 @@ -// Copyright (c) 2012, Suryandaru Triandana -// All rights reserved. -// -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package leveldb - -import ( - "fmt" - "sync/atomic" - "unsafe" - - "github.com/syndtr/goleveldb/leveldb/iterator" - "github.com/syndtr/goleveldb/leveldb/opt" - "github.com/syndtr/goleveldb/leveldb/util" -) - -type tSet struct { - level int - table *tFile -} - -type version struct { - s *session - - levels []tFiles - - // Level that should be compacted next and its compaction score. - // Score < 1 means compaction is not strictly needed. These fields - // are initialized by computeCompaction() - cLevel int - cScore float64 - - cSeek unsafe.Pointer - - closing bool - ref int - released bool -} - -func newVersion(s *session) *version { - return &version{s: s} -} - -func (v *version) incref() { - if v.released { - panic("already released") - } - - v.ref++ - if v.ref == 1 { - // Incr file ref. - for _, tt := range v.levels { - for _, t := range tt { - v.s.addFileRef(t.fd, 1) - } - } - } -} - -func (v *version) releaseNB() { - v.ref-- - if v.ref > 0 { - return - } else if v.ref < 0 { - panic("negative version ref") - } - - for _, tt := range v.levels { - for _, t := range tt { - if v.s.addFileRef(t.fd, -1) == 0 { - v.s.tops.remove(t) - } - } - } - - v.released = true -} - -func (v *version) release() { - v.s.vmu.Lock() - v.releaseNB() - v.s.vmu.Unlock() -} - -func (v *version) walkOverlapping(aux tFiles, ikey internalKey, f func(level int, t *tFile) bool, lf func(level int) bool) { - ukey := ikey.ukey() - - // Aux level. - if aux != nil { - for _, t := range aux { - if t.overlaps(v.s.icmp, ukey, ukey) { - if !f(-1, t) { - return - } - } - } - - if lf != nil && !lf(-1) { - return - } - } - - // Walk tables level-by-level. - for level, tables := range v.levels { - if len(tables) == 0 { - continue - } - - if level == 0 { - // Level-0 files may overlap each other. Find all files that - // overlap ukey. - for _, t := range tables { - if t.overlaps(v.s.icmp, ukey, ukey) { - if !f(level, t) { - return - } - } - } - } else { - if i := tables.searchMax(v.s.icmp, ikey); i < len(tables) { - t := tables[i] - if v.s.icmp.uCompare(ukey, t.imin.ukey()) >= 0 { - if !f(level, t) { - return - } - } - } - } - - if lf != nil && !lf(level) { - return - } - } -} - -func (v *version) get(aux tFiles, ikey internalKey, ro *opt.ReadOptions, noValue bool) (value []byte, tcomp bool, err error) { - if v.closing { - return nil, false, ErrClosed - } - - ukey := ikey.ukey() - - var ( - tset *tSet - tseek bool - - // Level-0. - zfound bool - zseq uint64 - zkt keyType - zval []byte - ) - - err = ErrNotFound - - // Since entries never hop across level, finding key/value - // in smaller level make later levels irrelevant. - v.walkOverlapping(aux, ikey, func(level int, t *tFile) bool { - if level >= 0 && !tseek { - if tset == nil { - tset = &tSet{level, t} - } else { - tseek = true - } - } - - var ( - fikey, fval []byte - ferr error - ) - if noValue { - fikey, ferr = v.s.tops.findKey(t, ikey, ro) - } else { - fikey, fval, ferr = v.s.tops.find(t, ikey, ro) - } - - switch ferr { - case nil: - case ErrNotFound: - return true - default: - err = ferr - return false - } - - if fukey, fseq, fkt, fkerr := parseInternalKey(fikey); fkerr == nil { - if v.s.icmp.uCompare(ukey, fukey) == 0 { - // Level <= 0 may overlaps each-other. - if level <= 0 { - if fseq >= zseq { - zfound = true - zseq = fseq - zkt = fkt - zval = fval - } - } else { - switch fkt { - case keyTypeVal: - value = fval - err = nil - case keyTypeDel: - default: - panic("leveldb: invalid internalKey type") - } - return false - } - } - } else { - err = fkerr - return false - } - - return true - }, func(level int) bool { - if zfound { - switch zkt { - case keyTypeVal: - value = zval - err = nil - case keyTypeDel: - default: - panic("leveldb: invalid internalKey type") - } - return false - } - - return true - }) - - if tseek && tset.table.consumeSeek() <= 0 { - tcomp = atomic.CompareAndSwapPointer(&v.cSeek, nil, unsafe.Pointer(tset)) - } - - return -} - -func (v *version) sampleSeek(ikey internalKey) (tcomp bool) { - var tset *tSet - - v.walkOverlapping(nil, ikey, func(level int, t *tFile) bool { - if tset == nil { - tset = &tSet{level, t} - return true - } - if tset.table.consumeSeek() <= 0 { - tcomp = atomic.CompareAndSwapPointer(&v.cSeek, nil, unsafe.Pointer(tset)) - } - return false - }, nil) - - return -} - -func (v *version) getIterators(slice *util.Range, ro *opt.ReadOptions) (its []iterator.Iterator) { - strict := opt.GetStrict(v.s.o.Options, ro, opt.StrictReader) - for level, tables := range v.levels { - if level == 0 { - // Merge all level zero files together since they may overlap. - for _, t := range tables { - its = append(its, v.s.tops.newIterator(t, slice, ro)) - } - } else if len(tables) != 0 { - its = append(its, iterator.NewIndexedIterator(tables.newIndexIterator(v.s.tops, v.s.icmp, slice, ro), strict)) - } - } - return -} - -func (v *version) newStaging() *versionStaging { - return &versionStaging{base: v} -} - -// Spawn a new version based on this version. -func (v *version) spawn(r *sessionRecord) *version { - staging := v.newStaging() - staging.commit(r) - return staging.finish() -} - -func (v *version) fillRecord(r *sessionRecord) { - for level, tables := range v.levels { - for _, t := range tables { - r.addTableFile(level, t) - } - } -} - -func (v *version) tLen(level int) int { - if level < len(v.levels) { - return len(v.levels[level]) - } - return 0 -} - -func (v *version) offsetOf(ikey internalKey) (n int64, err error) { - for level, tables := range v.levels { - for _, t := range tables { - if v.s.icmp.Compare(t.imax, ikey) <= 0 { - // Entire file is before "ikey", so just add the file size - n += t.size - } else if v.s.icmp.Compare(t.imin, ikey) > 0 { - // Entire file is after "ikey", so ignore - if level > 0 { - // Files other than level 0 are sorted by meta->min, so - // no further files in this level will contain data for - // "ikey". - break - } - } else { - // "ikey" falls in the range for this table. Add the - // approximate offset of "ikey" within the table. - if m, err := v.s.tops.offsetOf(t, ikey); err == nil { - n += m - } else { - return 0, err - } - } - } - } - - return -} - -func (v *version) pickMemdbLevel(umin, umax []byte, maxLevel int) (level int) { - if maxLevel > 0 { - if len(v.levels) == 0 { - return maxLevel - } - if !v.levels[0].overlaps(v.s.icmp, umin, umax, true) { - var overlaps tFiles - for ; level < maxLevel; level++ { - if pLevel := level + 1; pLevel >= len(v.levels) { - return maxLevel - } else if v.levels[pLevel].overlaps(v.s.icmp, umin, umax, false) { - break - } - if gpLevel := level + 2; gpLevel < len(v.levels) { - overlaps = v.levels[gpLevel].getOverlaps(overlaps, v.s.icmp, umin, umax, false) - if overlaps.size() > int64(v.s.o.GetCompactionGPOverlaps(level)) { - break - } - } - } - } - } - return -} - -func (v *version) computeCompaction() { - // Precomputed best level for next compaction - bestLevel := int(-1) - bestScore := float64(-1) - - statFiles := make([]int, len(v.levels)) - statSizes := make([]string, len(v.levels)) - statScore := make([]string, len(v.levels)) - statTotSize := int64(0) - - for level, tables := range v.levels { - var score float64 - size := tables.size() - if level == 0 { - // We treat level-0 specially by bounding the number of files - // instead of number of bytes for two reasons: - // - // (1) With larger write-buffer sizes, it is nice not to do too - // many level-0 compaction. - // - // (2) The files in level-0 are merged on every read and - // therefore we wish to avoid too many files when the individual - // file size is small (perhaps because of a small write-buffer - // setting, or very high compression ratios, or lots of - // overwrites/deletions). - score = float64(len(tables)) / float64(v.s.o.GetCompactionL0Trigger()) - } else { - score = float64(size) / float64(v.s.o.GetCompactionTotalSize(level)) - } - - if score > bestScore { - bestLevel = level - bestScore = score - } - - statFiles[level] = len(tables) - statSizes[level] = shortenb(int(size)) - statScore[level] = fmt.Sprintf("%.2f", score) - statTotSize += size - } - - v.cLevel = bestLevel - v.cScore = bestScore - - v.s.logf("version@stat F·%v S·%s%v Sc·%v", statFiles, shortenb(int(statTotSize)), statSizes, statScore) -} - -func (v *version) needCompaction() bool { - return v.cScore >= 1 || atomic.LoadPointer(&v.cSeek) != nil -} - -type tablesScratch struct { - added map[int64]atRecord - deleted map[int64]struct{} -} - -type versionStaging struct { - base *version - levels []tablesScratch -} - -func (p *versionStaging) getScratch(level int) *tablesScratch { - if level >= len(p.levels) { - newLevels := make([]tablesScratch, level+1) - copy(newLevels, p.levels) - p.levels = newLevels - } - return &(p.levels[level]) -} - -func (p *versionStaging) commit(r *sessionRecord) { - // Deleted tables. - for _, r := range r.deletedTables { - scratch := p.getScratch(r.level) - if r.level < len(p.base.levels) && len(p.base.levels[r.level]) > 0 { - if scratch.deleted == nil { - scratch.deleted = make(map[int64]struct{}) - } - scratch.deleted[r.num] = struct{}{} - } - if scratch.added != nil { - delete(scratch.added, r.num) - } - } - - // New tables. - for _, r := range r.addedTables { - scratch := p.getScratch(r.level) - if scratch.added == nil { - scratch.added = make(map[int64]atRecord) - } - scratch.added[r.num] = r - if scratch.deleted != nil { - delete(scratch.deleted, r.num) - } - } -} - -func (p *versionStaging) finish() *version { - // Build new version. - nv := newVersion(p.base.s) - numLevel := len(p.levels) - if len(p.base.levels) > numLevel { - numLevel = len(p.base.levels) - } - nv.levels = make([]tFiles, numLevel) - for level := 0; level < numLevel; level++ { - var baseTabels tFiles - if level < len(p.base.levels) { - baseTabels = p.base.levels[level] - } - - if level < len(p.levels) { - scratch := p.levels[level] - - var nt tFiles - // Prealloc list if possible. - if n := len(baseTabels) + len(scratch.added) - len(scratch.deleted); n > 0 { - nt = make(tFiles, 0, n) - } - - // Base tables. - for _, t := range baseTabels { - if _, ok := scratch.deleted[t.fd.Num]; ok { - continue - } - if _, ok := scratch.added[t.fd.Num]; ok { - continue - } - nt = append(nt, t) - } - - // New tables. - for _, r := range scratch.added { - nt = append(nt, tableFileFromRecord(r)) - } - - if len(nt) != 0 { - // Sort tables. - if level == 0 { - nt.sortByNum() - } else { - nt.sortByKey(p.base.s.icmp) - } - - nv.levels[level] = nt - } - } else { - nv.levels[level] = baseTabels - } - } - - // Trim levels. - n := len(nv.levels) - for ; n > 0 && nv.levels[n-1] == nil; n-- { - } - nv.levels = nv.levels[:n] - - // Compute compaction score for new version. - nv.computeCompaction() - - return nv -} - -type versionReleaser struct { - v *version - once bool -} - -func (vr *versionReleaser) Release() { - v := vr.v - v.s.vmu.Lock() - if !vr.once { - v.releaseNB() - vr.once = true - } - v.s.vmu.Unlock() -} diff --git a/vendor/github.com/uber/jaeger-client-go/CHANGELOG.md b/vendor/github.com/uber/jaeger-client-go/CHANGELOG.md deleted file mode 100644 index 28e2c242558b..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/CHANGELOG.md +++ /dev/null @@ -1,186 +0,0 @@ -Changes by Version -================== - -2.15.0 (unreleased) -------------------- - -- nothing yet - - -2.14.0 (2018-04-30) -------------------- - -- Support throttling for debug traces (#274) -- Remove dependency on Apache Thrift (#303) -- Remove dependency on tchannel (#295) (#294) -- Test with Go 1.9 (#298) - - -2.13.0 (2018-04-15) -------------------- - -- Use value receiver for config.NewTracer() (#283) -- Lock span during jaeger thrift conversion (#273) -- Fix the RemotelyControlledSampler so that it terminates go-routine on Close() (#260) -- Added support for client configuration via env vars (#275) -- Allow overriding sampler in the Config (#270) - - -2.12.0 (2018-03-14) -------------------- - -- Use lock when retrieving span.Context() (#268) -- Add Configuration support for custom Injector and Extractor (#263) - - -2.11.2 (2018-01-12) -------------------- - -- Add Gopkg.toml to allow using the lib with `dep` - - -2.11.1 (2018-01-03) -------------------- - -- Do not enqueue spans after Reporter is closed (#235, #245) -- Change default flush interval to 1sec (#243) - - -2.11.0 (2017-11-27) -------------------- - -- Normalize metric names and tags to be compatible with Prometheus (#222) - - -2.10.0 (2017-11-14) -------------------- - -- Support custom tracing headers (#176) -- Add BaggageRestrictionManager (#178) and RemoteBaggageRestrictionManager (#182) -- Do not coerce baggage keys to lower case (#196) -- Log span name when span cannot be reported (#198) -- Add option to enable gen128Bit for tracer (#193) and allow custom generator for high bits of trace ID (#219) - - -2.9.0 (2017-07-29) ------------------- - -- Pin thrift <= 0.10 (#179) -- Introduce a parallel interface ContribObserver (#159) - - -2.8.0 (2017-07-05) ------------------- - -- Drop `jaeger.` prefix from `jaeger.hostname` process-level tag -- Add options to set tracer tags - - -2.7.0 (2017-06-21) ------------------- - -- Fix rate limiter balance [#135](https://github.com/uber/jaeger-client-go/pull/135) [#140](https://github.com/uber/jaeger-client-go/pull/140) -- Default client to send Jaeger.thrift [#147](https://github.com/uber/jaeger-client-go/pull/147) -- Save baggage in span [#153](https://github.com/uber/jaeger-client-go/pull/153) -- Move reporter.queueLength to the top of the struct to guarantee 64bit alignment [#158](https://github.com/uber/jaeger-client-go/pull/158) -- Support HTTP transport with jaeger.thrift [#161](https://github.com/uber/jaeger-client-go/pull/161) - - -2.6.0 (2017-03-28) ------------------- - -- Add config option to initialize RPC Metrics feature - - -2.5.0 (2017-03-23) ------------------- - -- Split request latency metric by success/failure [#123](https://github.com/uber/jaeger-client-go/pull/123) -- Add mutex to adaptive sampler and fix race condition [#124](https://github.com/uber/jaeger-client-go/pull/124) -- Fix rate limiter panic [#125](https://github.com/uber/jaeger-client-go/pull/125) - - -2.4.0 (2017-03-21) ------------------- - -- Remove `_ms` suffix from request latency metric name [#121](https://github.com/uber/jaeger-client-go/pull/121) -- Rename all metrics to "request" and "http_request" and use tags for other dimensions [#121](https://github.com/uber/jaeger-client-go/pull/121) - - -2.3.0 (2017-03-20) ------------------- - -- Make Span type public to allow access to non-std methods for testing [#117](https://github.com/uber/jaeger-client-go/pull/117) -- Add a structured way to extract traces for logging with zap [#118](https://github.com/uber/jaeger-client-go/pull/118) - - -2.2.1 (2017-03-14) ------------------- - -- Fix panic caused by updating the remote sampler from adaptive sampler to any other sampler type (https://github.com/uber/jaeger-client-go/pull/111) - - -2.2.0 (2017-03-10) ------------------- - -- Introduce Observer and SpanObserver (https://github.com/uber/jaeger-client-go/pull/94) -- Add RPC metrics emitter as Observer/SpanObserver (https://github.com/uber/jaeger-client-go/pull/103) - - -2.1.2 (2017-02-27) -------------------- - -- Fix leaky bucket bug (https://github.com/uber/jaeger-client-go/pull/99) -- Fix zap logger Infof (https://github.com/uber/jaeger-client-go/pull/100) -- Add tracer initialization godoc examples - - -2.1.1 (2017-02-21) -------------------- - -- Fix inefficient usage of zap.Logger - - -2.1.0 (2017-02-17) -------------------- - -- Add adapter for zap.Logger (https://github.com/uber-go/zap) -- Move logging API to ./log/ package - - -2.0.0 (2017-02-08) -------------------- - -- Support Adaptive Sampling -- Support 128bit Trace IDs -- Change trace/span IDs from uint64 to strong types TraceID and SpanID -- Add Zipkin HTTP B3 Propagation format support #72 -- Rip out existing metrics and use github.com/uber/jaeger-lib/metrics -- Change API for tracer, reporter, sampler initialization - - -1.6.0 (2016-10-14) -------------------- - -- Add Zipkin HTTP transport -- Support external baggage via jaeger-baggage header -- Unpin Thrift version, keep to master - - -1.5.1 (2016-09-27) -------------------- - -- Relax dependency on opentracing to ^1 - - -1.5.0 (2016-09-27) -------------------- - -- Upgrade to opentracing-go 1.0 -- Support KV logging for Spans - - -1.4.0 (2016-09-14) -------------------- - -- Support debug traces via HTTP header "jaeger-debug-id" diff --git a/vendor/github.com/uber/jaeger-client-go/CONTRIBUTING.md b/vendor/github.com/uber/jaeger-client-go/CONTRIBUTING.md deleted file mode 100644 index 7cf014a51edb..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/CONTRIBUTING.md +++ /dev/null @@ -1,170 +0,0 @@ -# How to Contribute to Jaeger - -We'd love your help! - -Jaeger is [Apache 2.0 licensed](LICENSE) and accepts contributions via GitHub -pull requests. This document outlines some of the conventions on development -workflow, commit message formatting, contact points and other resources to make -it easier to get your contribution accepted. - -We gratefully welcome improvements to documentation as well as to code. - -# Certificate of Origin - -By contributing to this project you agree to the [Developer Certificate of -Origin](https://developercertificate.org/) (DCO). This document was created -by the Linux Kernel community and is a simple statement that you, as a -contributor, have the legal right to make the contribution. See the [DCO](DCO) -file for details. - -## Getting Started - -This library uses [glide](https://github.com/Masterminds/glide) to manage dependencies. - -To get started, make sure you clone the Git repository into the correct location -`github.com/uber/jaeger-client-go` relative to `$GOPATH`: - -``` -mkdir -p $GOPATH/src/github.com/uber -cd $GOPATH/src/github.com/uber -git clone git@github.com:jaegertracing/jaeger-client-go.git jaeger-client-go -cd jaeger-client-go -``` - -Then install dependencies and run the tests: - -``` -git submodule update --init --recursive -glide install -make test -``` - -## Imports grouping - -This projects follows the following pattern for grouping imports in Go files: - * imports from standard library - * imports from other projects - * imports from `jaeger-client-go` project - -For example: - -```go -import ( - "fmt" - - "github.com/uber/jaeger-lib/metrics" - "go.uber.org/zap" - - "github.com/uber/jaeger-client-go/config" -) -``` - -## Making A Change - -*Before making any significant changes, please [open an -issue](https://github.com/jaegertracing/jaeger-client-go/issues).* Discussing your proposed -changes ahead of time will make the contribution process smooth for everyone. - -Once we've discussed your changes and you've got your code ready, make sure -that tests are passing (`make test` or `make cover`) and open your PR. Your -pull request is most likely to be accepted if it: - -* Includes tests for new functionality. -* Follows the guidelines in [Effective - Go](https://golang.org/doc/effective_go.html) and the [Go team's common code - review comments](https://github.com/golang/go/wiki/CodeReviewComments). -* Has a [good commit message](https://chris.beams.io/posts/git-commit/): - * Separate subject from body with a blank line - * Limit the subject line to 50 characters - * Capitalize the subject line - * Do not end the subject line with a period - * Use the imperative mood in the subject line - * Wrap the body at 72 characters - * Use the body to explain _what_ and _why_ instead of _how_ -* Each commit must be signed by the author ([see below](#sign-your-work)). - -## License - -By contributing your code, you agree to license your contribution under the terms -of the [Apache License](LICENSE). - -If you are adding a new file it should have a header like below. The easiest -way to add such header is to run `make fmt`. - -``` -// Copyright (c) 2017 The Jaeger 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. -``` - -## Sign your work - -The sign-off is a simple line at the end of the explanation for the -patch, which certifies that you wrote it or otherwise have the right to -pass it on as an open-source patch. The rules are pretty simple: if you -can certify the below (from -[developercertificate.org](http://developercertificate.org/)): - -``` -Developer Certificate of Origin -Version 1.1 - -Copyright (C) 2004, 2006 The Linux Foundation and its contributors. -660 York Street, Suite 102, -San Francisco, CA 94110 USA - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - - -Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. -``` - -then you just add a line to every git commit message: - - Signed-off-by: Joe Smith - -using your real name (sorry, no pseudonyms or anonymous contributions.) - -You can add the sign off when creating the git commit via `git commit -s`. - -If you want this to be automatic you can set up some aliases: - -``` -git config --add alias.amend "commit -s --amend" -git config --add alias.c "commit -s" -``` diff --git a/vendor/github.com/uber/jaeger-client-go/DCO b/vendor/github.com/uber/jaeger-client-go/DCO deleted file mode 100644 index 068953d4bd98..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/DCO +++ /dev/null @@ -1,37 +0,0 @@ -Developer Certificate of Origin -Version 1.1 - -Copyright (C) 2004, 2006 The Linux Foundation and its contributors. -660 York Street, Suite 102, -San Francisco, CA 94110 USA - -Everyone is permitted to copy and distribute verbatim copies of this -license document, but changing it is not allowed. - - -Developer's Certificate of Origin 1.1 - -By making a contribution to this project, I certify that: - -(a) The contribution was created in whole or in part by me and I - have the right to submit it under the open source license - indicated in the file; or - -(b) The contribution is based upon previous work that, to the best - of my knowledge, is covered under an appropriate open source - license and I have the right under that license to submit that - work with modifications, whether created in whole or in part - by me, under the same open source license (unless I am - permitted to submit under a different license), as indicated - in the file; or - -(c) The contribution was provided directly to me by some other - person who certified (a), (b) or (c) and I have not modified - it. - -(d) I understand and agree that this project and the contribution - are public and that a record of the contribution (including all - personal information I submit with it, including my sign-off) is - maintained indefinitely and may be redistributed consistent with - this project or the open source license(s) involved. - diff --git a/vendor/github.com/uber/jaeger-client-go/Gopkg.lock b/vendor/github.com/uber/jaeger-client-go/Gopkg.lock deleted file mode 100644 index ec054c6ed62a..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/Gopkg.lock +++ /dev/null @@ -1,164 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - branch = "master" - name = "github.com/beorn7/perks" - packages = ["quantile"] - revision = "3a771d992973f24aa725d07868b467d1ddfceafb" - -[[projects]] - branch = "master" - name = "github.com/codahale/hdrhistogram" - packages = ["."] - revision = "3a0bb77429bd3a61596f5e8a3172445844342120" - -[[projects]] - branch = "master" - name = "github.com/crossdock/crossdock-go" - packages = [ - ".", - "assert", - "require" - ] - revision = "049aabb0122b03bc9bd30cab8f3f91fb60166361" - -[[projects]] - name = "github.com/davecgh/go-spew" - packages = ["spew"] - revision = "346938d642f2ec3594ed81d874461961cd0faa76" - version = "v1.1.0" - -[[projects]] - name = "github.com/golang/protobuf" - packages = ["proto"] - revision = "925541529c1fa6821df4e44ce2723319eb2be768" - version = "v1.0.0" - -[[projects]] - name = "github.com/matttproud/golang_protobuf_extensions" - packages = ["pbutil"] - revision = "3247c84500bff8d9fb6d579d800f20b3e091582c" - version = "v1.0.0" - -[[projects]] - name = "github.com/opentracing/opentracing-go" - packages = [ - ".", - "ext", - "log" - ] - revision = "1949ddbfd147afd4d964a9f00b24eb291e0e7c38" - version = "v1.0.2" - -[[projects]] - name = "github.com/pkg/errors" - packages = ["."] - revision = "645ef00459ed84a119197bfb8d8205042c6df63d" - version = "v0.8.0" - -[[projects]] - name = "github.com/pmezard/go-difflib" - packages = ["difflib"] - revision = "792786c7400a136282c1664665ae0a8db921c6c2" - version = "v1.0.0" - -[[projects]] - name = "github.com/prometheus/client_golang" - packages = ["prometheus"] - revision = "c5b7fccd204277076155f10851dad72b76a49317" - version = "v0.8.0" - -[[projects]] - branch = "master" - name = "github.com/prometheus/client_model" - packages = ["go"] - revision = "99fa1f4be8e564e8a6b613da7fa6f46c9edafc6c" - -[[projects]] - branch = "master" - name = "github.com/prometheus/common" - packages = [ - "expfmt", - "internal/bitbucket.org/ww/goautoneg", - "model" - ] - revision = "d811d2e9bf898806ecfb6ef6296774b13ffc314c" - -[[projects]] - branch = "master" - name = "github.com/prometheus/procfs" - packages = [ - ".", - "internal/util", - "nfs", - "xfs" - ] - revision = "8b1c2da0d56deffdbb9e48d4414b4e674bd8083e" - -[[projects]] - name = "github.com/stretchr/testify" - packages = [ - "assert", - "require", - "suite" - ] - revision = "12b6f73e6084dad08a7c6e575284b177ecafbc71" - version = "v1.2.1" - -[[projects]] - name = "github.com/uber-go/atomic" - packages = ["."] - revision = "8474b86a5a6f79c443ce4b2992817ff32cf208b8" - version = "v1.3.1" - -[[projects]] - name = "github.com/uber/jaeger-lib" - packages = [ - "metrics", - "metrics/prometheus", - "metrics/testutils" - ] - revision = "4267858c0679cd4e47cefed8d7f70fd386cfb567" - version = "v1.4.0" - -[[projects]] - name = "go.uber.org/atomic" - packages = ["."] - revision = "54f72d32435d760d5604f17a82e2435b28dc4ba5" - version = "v1.3.0" - -[[projects]] - name = "go.uber.org/multierr" - packages = ["."] - revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a" - version = "v1.1.0" - -[[projects]] - name = "go.uber.org/zap" - packages = [ - ".", - "buffer", - "internal/bufferpool", - "internal/color", - "internal/exit", - "zapcore" - ] - revision = "eeedf312bc6c57391d84767a4cd413f02a917974" - version = "v1.8.0" - -[[projects]] - branch = "master" - name = "golang.org/x/net" - packages = [ - "context", - "context/ctxhttp" - ] - revision = "5f9ae10d9af5b1c89ae6904293b14b064d4ada23" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "f9dcfaf37a785c5dac1e20c29605eda29a83ba9c6f8842e92960dc94c8c4ff80" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/uber/jaeger-client-go/Gopkg.toml b/vendor/github.com/uber/jaeger-client-go/Gopkg.toml deleted file mode 100644 index baf7a6bdf7ae..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/Gopkg.toml +++ /dev/null @@ -1,27 +0,0 @@ -[[constraint]] - name = "github.com/crossdock/crossdock-go" - branch = "master" - -[[constraint]] - name = "github.com/opentracing/opentracing-go" - version = "^1" - -[[constraint]] - name = "github.com/prometheus/client_golang" - version = "0.8.0" - -[[constraint]] - name = "github.com/stretchr/testify" - version = "^1.1.3" - -[[constraint]] - name = "github.com/uber-go/atomic" - version = "^1" - -[[constraint]] - name = "github.com/uber/jaeger-lib" - version = "^1.3" - -[[constraint]] - name = "go.uber.org/zap" - version = "^1" diff --git a/vendor/github.com/uber/jaeger-client-go/LICENSE b/vendor/github.com/uber/jaeger-client-go/LICENSE deleted file mode 100644 index 261eeb9e9f8b..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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/uber/jaeger-client-go/Makefile b/vendor/github.com/uber/jaeger-client-go/Makefile deleted file mode 100644 index 601cc65148e2..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/Makefile +++ /dev/null @@ -1,117 +0,0 @@ -PROJECT_ROOT=github.com/uber/jaeger-client-go -PACKAGES := $(shell glide novendor | grep -v -e ./thrift-gen/... -e ./thrift/...) -# all .go files that don't exist in hidden directories -ALL_SRC := $(shell find . -name "*.go" | grep -v -e vendor -e thrift-gen -e ./thrift/ \ - -e ".*/\..*" \ - -e ".*/_.*" \ - -e ".*/mocks.*") - --include crossdock/rules.mk - -export GO15VENDOREXPERIMENT=1 - -RACE=-race -GOTEST=go test -v $(RACE) -GOLINT=golint -GOVET=go vet -GOFMT=gofmt -FMT_LOG=fmt.log -LINT_LOG=lint.log - -THRIFT_VER=0.9.3 -THRIFT_IMG=thrift:$(THRIFT_VER) -THRIFT=docker run -v "${PWD}:/data" $(THRIFT_IMG) thrift -THRIFT_GO_ARGS=thrift_import="github.com/apache/thrift/lib/go/thrift" -THRIFT_GEN_DIR=thrift-gen - -PASS=$(shell printf "\033[32mPASS\033[0m") -FAIL=$(shell printf "\033[31mFAIL\033[0m") -COLORIZE=sed ''/PASS/s//$(PASS)/'' | sed ''/FAIL/s//$(FAIL)/'' - -.DEFAULT_GOAL := test-and-lint - -.PHONY: test-and-lint -test-and-lint: test fmt lint - -.PHONY: test -test: - bash -c "set -e; set -o pipefail; $(GOTEST) $(PACKAGES) | $(COLORIZE)" - -.PHONY: fmt -fmt: - $(GOFMT) -e -s -l -w $(ALL_SRC) - ./scripts/updateLicenses.sh - -.PHONY: lint -lint: - $(GOVET) $(PACKAGES) - @cat /dev/null > $(LINT_LOG) - @$(foreach pkg, $(PACKAGES), $(GOLINT) $(pkg) | grep -v crossdock/thrift >> $(LINT_LOG) || true;) - @[ ! -s "$(LINT_LOG)" ] || (echo "Lint Failures" | cat - $(LINT_LOG) && false) - @$(GOFMT) -e -s -l $(ALL_SRC) > $(FMT_LOG) - ./scripts/updateLicenses.sh >> $(FMT_LOG) - @[ ! -s "$(FMT_LOG)" ] || (echo "go fmt or license check failures, run 'make fmt'" | cat - $(FMT_LOG) && false) - - -.PHONY: install -install: - glide --version || go get github.com/Masterminds/glide -ifeq ($(USE_DEP),true) - dep ensure -else - glide install -endif - - -.PHONY: cover -cover: - ./scripts/cover.sh $(shell go list $(PACKAGES)) - go tool cover -html=cover.out -o cover.html - - -# This is not part of the regular test target because we don't want to slow it -# down. -.PHONY: test-examples -test-examples: - make -C examples - -# TODO at the moment we're not generating tchan_*.go files -thrift: idl-submodule thrift-image - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/agent.thrift - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/sampling.thrift - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/jaeger.thrift - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/zipkincore.thrift - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/$(THRIFT_GEN_DIR) /data/idl/thrift/baggage.thrift - $(THRIFT) -o /data --gen go:$(THRIFT_GO_ARGS) --out /data/crossdock/thrift/ /data/idl/thrift/crossdock/tracetest.thrift - sed -i '' 's|"zipkincore"|"$(PROJECT_ROOT)/thrift-gen/zipkincore"|g' $(THRIFT_GEN_DIR)/agent/*.go - sed -i '' 's|"jaeger"|"$(PROJECT_ROOT)/thrift-gen/jaeger"|g' $(THRIFT_GEN_DIR)/agent/*.go - sed -i '' 's|"github.com/apache/thrift/lib/go/thrift"|"github.com/uber/jaeger-client-go/thrift"|g' \ - $(THRIFT_GEN_DIR)/*/*.go crossdock/thrift/tracetest/*.go - rm -rf thrift-gen/*/*-remote - rm -rf crossdock/thrift/*/*-remote - rm -rf thrift-gen/jaeger/collector.go - -idl-submodule: - git submodule init - git submodule update - -thrift-image: - $(THRIFT) -version - -.PHONY: install-dep-ci -install-dep-ci: - - curl -L -s https://github.com/golang/dep/releases/download/v0.3.2/dep-linux-amd64 -o $$GOPATH/bin/dep - - chmod +x $$GOPATH/bin/dep - -.PHONY: install-ci -install-ci: install-dep-ci install - go get github.com/wadey/gocovmerge - go get github.com/mattn/goveralls - go get golang.org/x/tools/cmd/cover - go get github.com/golang/lint/golint - -.PHONY: test-ci -test-ci: - @./scripts/cover.sh $(shell go list $(PACKAGES)) - make lint - diff --git a/vendor/github.com/uber/jaeger-client-go/README.md b/vendor/github.com/uber/jaeger-client-go/README.md deleted file mode 100644 index 16b04454e168..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/README.md +++ /dev/null @@ -1,260 +0,0 @@ -[![GoDoc][doc-img]][doc] [![Build Status][ci-img]][ci] [![Coverage Status][cov-img]][cov] [![OpenTracing 1.0 Enabled][ot-img]][ot-url] - -# Jaeger Bindings for Go OpenTracing API - -Instrumentation library that implements an -[OpenTracing](http://opentracing.io) Tracer for Jaeger (https://jaegertracing.io). - -**IMPORTANT**: The library's import path is based on its original location under `github.com/uber`. Do not try to import it as `github.com/jaegertracing`, it will not compile. We might revisit this in the next major release. - * :white_check_mark: `import "github.com/uber/jaeger-client-go"` - * :x: `import "github.com/jaegertracing/jaeger-client-go"` - -## How to Contribute - -Please see [CONTRIBUTING.md](CONTRIBUTING.md). - -## Installation - -We recommended using a dependency manager like [glide](https://github.com/Masterminds/glide) -and [semantic versioning](http://semver.org/) when including this library into an application. -For example, Jaeger backend imports this library like this: - -```yaml -- package: github.com/uber/jaeger-client-go - version: ^2.7.0 -``` - -If you instead want to use the latest version in `master`, you can pull it via `go get`. -Note that during `go get` you may see build errors due to incompatible dependencies, which is why -we recommend using semantic versions for dependencies. The error may be fixed by running -`make install` (it will install `glide` if you don't have it): - -```shell -go get -u github.com/uber/jaeger-client-go/ -cd $GOPATH/src/github.com/uber/jaeger-client-go/ -git submodule update --init --recursive -make install -``` - -## Initialization - -See tracer initialization examples in [godoc](https://godoc.org/github.com/uber/jaeger-client-go/config#pkg-examples) -and [config/example_test.go](./config/example_test.go). - -### Environment variables - -The tracer can be initialized with values coming from environment variables. None of the env vars are required -and all of them can be overriden via direct setting of the property on the configuration object. - -Property| Description ---- | --- -JAEGER_SERVICE_NAME | The service name -JAEGER_AGENT_HOST | The hostname for communicating with agent via UDP -JAEGER_AGENT_PORT | The port for communicating with agent via UDP -JAEGER_REPORTER_LOG_SPANS | Whether the reporter should also log the spans -JAEGER_REPORTER_MAX_QUEUE_SIZE | The reporter's maximum queue size -JAEGER_REPORTER_FLUSH_INTERVAL | The reporter's flush interval (ms) -JAEGER_SAMPLER_TYPE | The sampler type -JAEGER_SAMPLER_PARAM | The sampler parameter (number) -JAEGER_SAMPLER_MANAGER_HOST_PORT | The host name and port when using the remote controlled sampler -JAEGER_SAMPLER_MAX_OPERATIONS | The maximum number of operations that the sampler will keep track of -JAEGER_SAMPLER_REFRESH_INTERVAL | How often the remotely controlled sampler will poll jaeger-agent for the appropriate sampling strategy -JAEGER_TAGS | A comma separated list of `name = value` tracer level tags, which get added to all reported spans. The value can also refer to an environment variable using the format `${envVarName:default}`, where the `:default` is optional, and identifies a value to be used if the environment variable cannot be found -JAEGER_DISABLED | Whether the tracer is disabled or not. If true, the default `opentracing.NoopTracer` is used. -JAEGER_RPC_METRICS | Whether to store RPC metrics - -### Closing the tracer via `io.Closer` - -The constructor function for Jaeger Tracer returns the tracer itself and an `io.Closer` instance. -It is recommended to structure your `main()` so that it calls the `Close()` function on the closer -before exiting, e.g. - -```go -tracer, closer, err := cfg.NewTracer(...) -defer closer.Close() -``` - -This is especially useful for command-line tools that enable tracing, as well as -for the long-running apps that support graceful shutdown. For example, if your deployment -system sends SIGTERM instead of killing the process and you trap that signal to do a graceful -exit, then having `defer closer.Closer()` ensures that all buffered spans are flushed. - -### Metrics & Monitoring - -The tracer emits a number of different metrics, defined in -[metrics.go](metrics.go). The monitoring backend is expected to support -tag-based metric names, e.g. instead of `statsd`-style string names -like `counters.my-service.jaeger.spans.started.sampled`, the metrics -are defined by a short name and a collection of key/value tags, for -example: `name:jaeger.traces, state:started, sampled:y`. See [metrics.go](./metrics.go) -file for the full list and descriptions of emitted metrics. - -The monitoring backend is represented by the `metrics.Factory` interface from package -[`"github.com/uber/jaeger-lib/metrics"`](https://github.com/jaegertracing/jaeger-lib/tree/master/metrics). An implementation -of that interface can be passed as an option to either the Configuration object or the Tracer -constructor, for example: - -```go -import ( - "github.com/uber/jaeger-client-go/config" - "github.com/uber/jaeger-lib/metrics/prometheus" -) - - metricsFactory := prometheus.New() - tracer, closer, err := config.Configuration{ - ServiceName: "your-service-name", - }.NewTracer( - config.Metrics(metricsFactory), - ) -``` - -By default, a no-op `metrics.NullFactory` is used. - -### Logging - -The tracer can be configured with an optional logger, which will be -used to log communication errors, or log spans if a logging reporter -option is specified in the configuration. The logging API is abstracted -by the [Logger](logger.go) interface. A logger instance implementing -this interface can be set on the `Config` object before calling the -`New` method. - -Besides the [zap](https://github.com/uber-go/zap) implementation -bundled with this package there is also a [go-kit](https://github.com/go-kit/kit) -one in the [jaeger-lib](https://github.com/jaegertracing/jaeger-lib) repository. - -## Instrumentation for Tracing - -Since this tracer is fully compliant with OpenTracing API 1.0, -all code instrumentation should only use the API itself, as described -in the [opentracing-go](https://github.com/opentracing/opentracing-go) documentation. - -## Features - -### Reporters - -A "reporter" is a component that receives the finished spans and reports -them to somewhere. Under normal circumstances, the Tracer -should use the default `RemoteReporter`, which sends the spans out of -process via configurable "transport". For testing purposes, one can -use an `InMemoryReporter` that accumulates spans in a buffer and -allows to retrieve them for later verification. Also available are -`NullReporter`, a no-op reporter that does nothing, a `LoggingReporter` -which logs all finished spans using their `String()` method, and a -`CompositeReporter` that can be used to combine more than one reporter -into one, e.g. to attach a logging reporter to the main remote reporter. - -### Span Reporting Transports - -The remote reporter uses "transports" to actually send the spans out -of process. Currently the supported transports include: - * [Jaeger Thrift](https://github.com/jaegertracing/jaeger-idl/blob/master/thrift/agent.thrift) over UDP or HTTP, - * [Zipkin Thrift](https://github.com/jaegertracing/jaeger-idl/blob/master/thrift/zipkincore.thrift) over HTTP. - -### Sampling - -The tracer does not record all spans, but only those that have the -sampling bit set in the `flags`. When a new trace is started and a new -unique ID is generated, a sampling decision is made whether this trace -should be sampled. The sampling decision is propagated to all downstream -calls via the `flags` field of the trace context. The following samplers -are available: - 1. `RemotelyControlledSampler` uses one of the other simpler samplers - and periodically updates it by polling an external server. This - allows dynamic control of the sampling strategies. - 1. `ConstSampler` always makes the same sampling decision for all - trace IDs. it can be configured to either sample all traces, or - to sample none. - 1. `ProbabilisticSampler` uses a fixed sampling rate as a probability - for a given trace to be sampled. The actual decision is made by - comparing the trace ID with a random number multiplied by the - sampling rate. - 1. `RateLimitingSampler` can be used to allow only a certain fixed - number of traces to be sampled per second. - -### Baggage Injection - -The OpenTracing spec allows for [baggage][baggage], which are key value pairs that are added -to the span context and propagated throughout the trace. An external process can inject baggage -by setting the special HTTP Header `jaeger-baggage` on a request: - -```sh -curl -H "jaeger-baggage: key1=value1, key2=value2" http://myhost.com -``` - -Baggage can also be programatically set inside your service: - -```go -if span := opentracing.SpanFromContext(ctx); span != nil { - span.SetBaggageItem("key", "value") -} -``` - -Another service downstream of that can retrieve the baggage in a similar way: - -```go -if span := opentracing.SpanFromContext(ctx); span != nil { - val := span.BaggageItem("key") - println(val) -} -``` - -### Debug Traces (Forced Sampling) - -#### Programmatically - -The OpenTracing API defines a `sampling.priority` standard tag that -can be used to affect the sampling of a span and its children: - -```go -import ( - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" -) - -span := opentracing.SpanFromContext(ctx) -ext.SamplingPriority.Set(span, 1) -``` - -#### Via HTTP Headers - -Jaeger Tracer also understands a special HTTP Header `jaeger-debug-id`, -which can be set in the incoming request, e.g. - -```sh -curl -H "jaeger-debug-id: some-correlation-id" http://myhost.com -``` - -When Jaeger sees this header in the request that otherwise has no -tracing context, it ensures that the new trace started for this -request will be sampled in the "debug" mode (meaning it should survive -all downsampling that might happen in the collection pipeline), and the -root span will have a tag as if this statement was executed: - -```go -span.SetTag("jaeger-debug-id", "some-correlation-id") -``` - -This allows using Jaeger UI to find the trace by this tag. - -### Zipkin HTTP B3 compatible header propagation - -Jaeger Tracer supports Zipkin B3 Propagation HTTP headers, which are used -by a lot of Zipkin tracers. This means that you can use Jaeger in conjunction with e.g. [these OpenZipkin tracers](https://github.com/openzipkin). - -However it is not the default propagation format, see [here](zipkin/README.md#NewZipkinB3HTTPHeaderPropagator) how to set it up. - -## License - -[Apache 2.0 License](LICENSE). - - -[doc-img]: https://godoc.org/github.com/uber/jaeger-client-go?status.svg -[doc]: https://godoc.org/github.com/uber/jaeger-client-go -[ci-img]: https://travis-ci.org/jaegertracing/jaeger-client-go.svg?branch=master -[ci]: https://travis-ci.org/jaegertracing/jaeger-client-go -[cov-img]: https://codecov.io/gh/jaegertracing/jaeger-client-go/branch/master/graph/badge.svg -[cov]: https://codecov.io/gh/jaegertracing/jaeger-client-go -[ot-img]: https://img.shields.io/badge/OpenTracing--1.0-enabled-blue.svg -[ot-url]: http://opentracing.io -[baggage]: https://github.com/opentracing/specification/blob/master/specification.md#set-a-baggage-item diff --git a/vendor/github.com/uber/jaeger-client-go/RELEASE.md b/vendor/github.com/uber/jaeger-client-go/RELEASE.md deleted file mode 100644 index 115e49ab8ad3..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/RELEASE.md +++ /dev/null @@ -1,11 +0,0 @@ -# Release Process - -1. Create a PR "Preparing for release X.Y.Z" against master branch - * Alter CHANGELOG.md from ` (unreleased)` to ` (YYYY-MM-DD)` - * Update `JaegerClientVersion` in constants.go to `Go-X.Y.Z` -2. Create a release "Release X.Y.Z" on Github - * Create Tag `vX.Y.Z` - * Copy CHANGELOG.md into the release notes -3. Create a PR "Back to development" against master branch - * Add ` (unreleased)` to CHANGELOG.md - * Update `JaegerClientVersion` in constants.go to `Go-dev` diff --git a/vendor/github.com/uber/jaeger-client-go/baggage_setter.go b/vendor/github.com/uber/jaeger-client-go/baggage_setter.go deleted file mode 100644 index 1037ca0e861d..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/baggage_setter.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "github.com/opentracing/opentracing-go/log" - - "github.com/uber/jaeger-client-go/internal/baggage" -) - -// baggageSetter is an actor that can set a baggage value on a Span given certain -// restrictions (eg. maxValueLength). -type baggageSetter struct { - restrictionManager baggage.RestrictionManager - metrics *Metrics -} - -func newBaggageSetter(restrictionManager baggage.RestrictionManager, metrics *Metrics) *baggageSetter { - return &baggageSetter{ - restrictionManager: restrictionManager, - metrics: metrics, - } -} - -// (NB) span should hold the lock before making this call -func (s *baggageSetter) setBaggage(span *Span, key, value string) { - var truncated bool - var prevItem string - restriction := s.restrictionManager.GetRestriction(span.serviceName(), key) - if !restriction.KeyAllowed() { - s.logFields(span, key, value, prevItem, truncated, restriction.KeyAllowed()) - s.metrics.BaggageUpdateFailure.Inc(1) - return - } - if len(value) > restriction.MaxValueLength() { - truncated = true - value = value[:restriction.MaxValueLength()] - s.metrics.BaggageTruncate.Inc(1) - } - prevItem = span.context.baggage[key] - s.logFields(span, key, value, prevItem, truncated, restriction.KeyAllowed()) - span.context = span.context.WithBaggageItem(key, value) - s.metrics.BaggageUpdateSuccess.Inc(1) -} - -func (s *baggageSetter) logFields(span *Span, key, value, prevItem string, truncated, valid bool) { - if !span.context.IsSampled() { - return - } - fields := []log.Field{ - log.String("event", "baggage"), - log.String("key", key), - log.String("value", value), - } - if prevItem != "" { - fields = append(fields, log.String("override", "true")) - } - if truncated { - fields = append(fields, log.String("truncated", "true")) - } - if !valid { - fields = append(fields, log.String("invalid", "true")) - } - span.logFieldsNoLocking(fields...) -} diff --git a/vendor/github.com/uber/jaeger-client-go/config/config.go b/vendor/github.com/uber/jaeger-client-go/config/config.go deleted file mode 100644 index 1eb29677854e..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/config/config.go +++ /dev/null @@ -1,373 +0,0 @@ -// Copyright (c) 2017-2018 Uber Technologies, Inc. -// -// 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 config - -import ( - "errors" - "fmt" - "io" - "strings" - "time" - - "github.com/opentracing/opentracing-go" - - "github.com/uber/jaeger-client-go" - "github.com/uber/jaeger-client-go/internal/baggage/remote" - throttler "github.com/uber/jaeger-client-go/internal/throttler/remote" - "github.com/uber/jaeger-client-go/rpcmetrics" -) - -const defaultSamplingProbability = 0.001 - -// Configuration configures and creates Jaeger Tracer -type Configuration struct { - // ServiceName specifies the service name to use on the tracer. - // Can be provided via environment variable named JAEGER_SERVICE_NAME - ServiceName string `yaml:"serviceName"` - - // Disabled can be provided via environment variable named JAEGER_DISABLED - Disabled bool `yaml:"disabled"` - - // RPCMetrics can be provided via environment variable named JAEGER_RPC_METRICS - RPCMetrics bool `yaml:"rpc_metrics"` - - // Tags can be provided via environment variable named JAEGER_TAGS - Tags []opentracing.Tag `yaml:"tags"` - - Sampler *SamplerConfig `yaml:"sampler"` - Reporter *ReporterConfig `yaml:"reporter"` - Headers *jaeger.HeadersConfig `yaml:"headers"` - BaggageRestrictions *BaggageRestrictionsConfig `yaml:"baggage_restrictions"` - Throttler *ThrottlerConfig `yaml:"throttler"` -} - -// SamplerConfig allows initializing a non-default sampler. All fields are optional. -type SamplerConfig struct { - // Type specifies the type of the sampler: const, probabilistic, rateLimiting, or remote - // Can be set by exporting an environment variable named JAEGER_SAMPLER_TYPE - Type string `yaml:"type"` - - // Param is a value passed to the sampler. - // Valid values for Param field are: - // - for "const" sampler, 0 or 1 for always false/true respectively - // - for "probabilistic" sampler, a probability between 0 and 1 - // - for "rateLimiting" sampler, the number of spans per second - // - for "remote" sampler, param is the same as for "probabilistic" - // and indicates the initial sampling rate before the actual one - // is received from the mothership. - // Can be set by exporting an environment variable named JAEGER_SAMPLER_PARAM - Param float64 `yaml:"param"` - - // SamplingServerURL is the address of jaeger-agent's HTTP sampling server - // Can be set by exporting an environment variable named JAEGER_SAMPLER_MANAGER_HOST_PORT - SamplingServerURL string `yaml:"samplingServerURL"` - - // MaxOperations is the maximum number of operations that the sampler - // will keep track of. If an operation is not tracked, a default probabilistic - // sampler will be used rather than the per operation specific sampler. - // Can be set by exporting an environment variable named JAEGER_SAMPLER_MAX_OPERATIONS - MaxOperations int `yaml:"maxOperations"` - - // SamplingRefreshInterval controls how often the remotely controlled sampler will poll - // jaeger-agent for the appropriate sampling strategy. - // Can be set by exporting an environment variable named JAEGER_SAMPLER_REFRESH_INTERVAL - SamplingRefreshInterval time.Duration `yaml:"samplingRefreshInterval"` -} - -// ReporterConfig configures the reporter. All fields are optional. -type ReporterConfig struct { - // QueueSize controls how many spans the reporter can keep in memory before it starts dropping - // new spans. The queue is continuously drained by a background go-routine, as fast as spans - // can be sent out of process. - // Can be set by exporting an environment variable named JAEGER_REPORTER_MAX_QUEUE_SIZE - QueueSize int `yaml:"queueSize"` - - // BufferFlushInterval controls how often the buffer is force-flushed, even if it's not full. - // It is generally not useful, as it only matters for very low traffic services. - // Can be set by exporting an environment variable named JAEGER_REPORTER_FLUSH_INTERVAL - BufferFlushInterval time.Duration - - // LogSpans, when true, enables LoggingReporter that runs in parallel with the main reporter - // and logs all submitted spans. Main Configuration.Logger must be initialized in the code - // for this option to have any effect. - // Can be set by exporting an environment variable named JAEGER_REPORTER_LOG_SPANS - LogSpans bool `yaml:"logSpans"` - - // LocalAgentHostPort instructs reporter to send spans to jaeger-agent at this address - // Can be set by exporting an environment variable named JAEGER_AGENT_HOST / JAEGER_AGENT_PORT - LocalAgentHostPort string `yaml:"localAgentHostPort"` -} - -// BaggageRestrictionsConfig configures the baggage restrictions manager which can be used to whitelist -// certain baggage keys. All fields are optional. -type BaggageRestrictionsConfig struct { - // DenyBaggageOnInitializationFailure controls the startup failure mode of the baggage restriction - // manager. If true, the manager will not allow any baggage to be written until baggage restrictions have - // been retrieved from jaeger-agent. If false, the manager wil allow any baggage to be written until baggage - // restrictions have been retrieved from jaeger-agent. - DenyBaggageOnInitializationFailure bool `yaml:"denyBaggageOnInitializationFailure"` - - // HostPort is the hostPort of jaeger-agent's baggage restrictions server - HostPort string `yaml:"hostPort"` - - // RefreshInterval controls how often the baggage restriction manager will poll - // jaeger-agent for the most recent baggage restrictions. - RefreshInterval time.Duration `yaml:"refreshInterval"` -} - -// ThrottlerConfig configures the throttler which can be used to throttle the -// rate at which the client may send debug requests. -type ThrottlerConfig struct { - // HostPort of jaeger-agent's credit server. - HostPort string `yaml:"hostPort"` - - // RefreshInterval controls how often the throttler will poll jaeger-agent - // for more throttling credits. - RefreshInterval time.Duration `yaml:"refreshInterval"` - - // SynchronousInitialization determines whether or not the throttler should - // synchronously fetch credits from the agent when an operation is seen for - // the first time. This should be set to true if the client will be used by - // a short lived service that needs to ensure that credits are fetched - // upfront such that sampling or throttling occurs. - SynchronousInitialization bool `yaml:"synchronousInitialization"` -} - -type nullCloser struct{} - -func (*nullCloser) Close() error { return nil } - -// New creates a new Jaeger Tracer, and a closer func that can be used to flush buffers -// before shutdown. -// -// Deprecated: use NewTracer() function -func (c Configuration) New( - serviceName string, - options ...Option, -) (opentracing.Tracer, io.Closer, error) { - if serviceName != "" { - c.ServiceName = serviceName - } - - return c.NewTracer(options...) -} - -// NewTracer returns a new tracer based on the current configuration, using the given options, -// and a closer func that can be used to flush buffers before shutdown. -func (c Configuration) NewTracer(options ...Option) (opentracing.Tracer, io.Closer, error) { - if c.ServiceName == "" { - return nil, nil, errors.New("no service name provided") - } - - if c.Disabled { - return &opentracing.NoopTracer{}, &nullCloser{}, nil - } - opts := applyOptions(options...) - tracerMetrics := jaeger.NewMetrics(opts.metrics, nil) - if c.RPCMetrics { - Observer( - rpcmetrics.NewObserver( - opts.metrics.Namespace("jaeger-rpc", map[string]string{"component": "jaeger"}), - rpcmetrics.DefaultNameNormalizer, - ), - )(&opts) // adds to c.observers - } - if c.Sampler == nil { - c.Sampler = &SamplerConfig{ - Type: jaeger.SamplerTypeRemote, - Param: defaultSamplingProbability, - } - } - if c.Reporter == nil { - c.Reporter = &ReporterConfig{} - } - - sampler := opts.sampler - if sampler == nil { - s, err := c.Sampler.NewSampler(c.ServiceName, tracerMetrics) - if err != nil { - return nil, nil, err - } - sampler = s - } - - reporter := opts.reporter - if reporter == nil { - r, err := c.Reporter.NewReporter(c.ServiceName, tracerMetrics, opts.logger) - if err != nil { - return nil, nil, err - } - reporter = r - } - - tracerOptions := []jaeger.TracerOption{ - jaeger.TracerOptions.Metrics(tracerMetrics), - jaeger.TracerOptions.Logger(opts.logger), - jaeger.TracerOptions.CustomHeaderKeys(c.Headers), - jaeger.TracerOptions.Gen128Bit(opts.gen128Bit), - jaeger.TracerOptions.ZipkinSharedRPCSpan(opts.zipkinSharedRPCSpan), - jaeger.TracerOptions.MaxTagValueLength(opts.maxTagValueLength), - } - - for _, tag := range opts.tags { - tracerOptions = append(tracerOptions, jaeger.TracerOptions.Tag(tag.Key, tag.Value)) - } - - for _, tag := range c.Tags { - tracerOptions = append(tracerOptions, jaeger.TracerOptions.Tag(tag.Key, tag.Value)) - } - - for _, obs := range opts.observers { - tracerOptions = append(tracerOptions, jaeger.TracerOptions.Observer(obs)) - } - - for _, cobs := range opts.contribObservers { - tracerOptions = append(tracerOptions, jaeger.TracerOptions.ContribObserver(cobs)) - } - - for format, injector := range opts.injectors { - tracerOptions = append(tracerOptions, jaeger.TracerOptions.Injector(format, injector)) - } - - for format, extractor := range opts.extractors { - tracerOptions = append(tracerOptions, jaeger.TracerOptions.Extractor(format, extractor)) - } - - if c.BaggageRestrictions != nil { - mgr := remote.NewRestrictionManager( - c.ServiceName, - remote.Options.Metrics(tracerMetrics), - remote.Options.Logger(opts.logger), - remote.Options.HostPort(c.BaggageRestrictions.HostPort), - remote.Options.RefreshInterval(c.BaggageRestrictions.RefreshInterval), - remote.Options.DenyBaggageOnInitializationFailure( - c.BaggageRestrictions.DenyBaggageOnInitializationFailure, - ), - ) - tracerOptions = append(tracerOptions, jaeger.TracerOptions.BaggageRestrictionManager(mgr)) - } - - if c.Throttler != nil { - debugThrottler := throttler.NewThrottler( - c.ServiceName, - throttler.Options.Metrics(tracerMetrics), - throttler.Options.Logger(opts.logger), - throttler.Options.HostPort(c.Throttler.HostPort), - throttler.Options.RefreshInterval(c.Throttler.RefreshInterval), - throttler.Options.SynchronousInitialization( - c.Throttler.SynchronousInitialization, - ), - ) - - tracerOptions = append(tracerOptions, jaeger.TracerOptions.DebugThrottler(debugThrottler)) - } - - tracer, closer := jaeger.NewTracer( - c.ServiceName, - sampler, - reporter, - tracerOptions..., - ) - - return tracer, closer, nil -} - -// InitGlobalTracer creates a new Jaeger Tracer, and sets it as global OpenTracing Tracer. -// It returns a closer func that can be used to flush buffers before shutdown. -func (c Configuration) InitGlobalTracer( - serviceName string, - options ...Option, -) (io.Closer, error) { - if c.Disabled { - return &nullCloser{}, nil - } - tracer, closer, err := c.New(serviceName, options...) - if err != nil { - return nil, err - } - opentracing.SetGlobalTracer(tracer) - return closer, nil -} - -// NewSampler creates a new sampler based on the configuration -func (sc *SamplerConfig) NewSampler( - serviceName string, - metrics *jaeger.Metrics, -) (jaeger.Sampler, error) { - samplerType := strings.ToLower(sc.Type) - if samplerType == jaeger.SamplerTypeConst { - return jaeger.NewConstSampler(sc.Param != 0), nil - } - if samplerType == jaeger.SamplerTypeProbabilistic { - if sc.Param >= 0 && sc.Param <= 1.0 { - return jaeger.NewProbabilisticSampler(sc.Param) - } - return nil, fmt.Errorf( - "Invalid Param for probabilistic sampler: %v. Expecting value between 0 and 1", - sc.Param, - ) - } - if samplerType == jaeger.SamplerTypeRateLimiting { - return jaeger.NewRateLimitingSampler(sc.Param), nil - } - if samplerType == jaeger.SamplerTypeRemote || sc.Type == "" { - sc2 := *sc - sc2.Type = jaeger.SamplerTypeProbabilistic - initSampler, err := sc2.NewSampler(serviceName, nil) - if err != nil { - return nil, err - } - options := []jaeger.SamplerOption{ - jaeger.SamplerOptions.Metrics(metrics), - jaeger.SamplerOptions.InitialSampler(initSampler), - jaeger.SamplerOptions.SamplingServerURL(sc.SamplingServerURL), - } - if sc.MaxOperations != 0 { - options = append(options, jaeger.SamplerOptions.MaxOperations(sc.MaxOperations)) - } - if sc.SamplingRefreshInterval != 0 { - options = append(options, jaeger.SamplerOptions.SamplingRefreshInterval(sc.SamplingRefreshInterval)) - } - return jaeger.NewRemotelyControlledSampler(serviceName, options...), nil - } - return nil, fmt.Errorf("Unknown sampler type %v", sc.Type) -} - -// NewReporter instantiates a new reporter that submits spans to tcollector -func (rc *ReporterConfig) NewReporter( - serviceName string, - metrics *jaeger.Metrics, - logger jaeger.Logger, -) (jaeger.Reporter, error) { - sender, err := rc.newTransport() - if err != nil { - return nil, err - } - reporter := jaeger.NewRemoteReporter( - sender, - jaeger.ReporterOptions.QueueSize(rc.QueueSize), - jaeger.ReporterOptions.BufferFlushInterval(rc.BufferFlushInterval), - jaeger.ReporterOptions.Logger(logger), - jaeger.ReporterOptions.Metrics(metrics)) - if rc.LogSpans && logger != nil { - logger.Infof("Initializing logging reporter\n") - reporter = jaeger.NewCompositeReporter(jaeger.NewLoggingReporter(logger), reporter) - } - return reporter, err -} - -func (rc *ReporterConfig) newTransport() (jaeger.Transport, error) { - return jaeger.NewUDPTransport(rc.LocalAgentHostPort, 0) -} diff --git a/vendor/github.com/uber/jaeger-client-go/config/config_env.go b/vendor/github.com/uber/jaeger-client-go/config/config_env.go deleted file mode 100644 index 96f170c539d9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/config/config_env.go +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright (c) 2018 The Jaeger 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 config - -import ( - "fmt" - "os" - "strconv" - "strings" - "time" - - opentracing "github.com/opentracing/opentracing-go" - "github.com/pkg/errors" - - "github.com/uber/jaeger-client-go" -) - -const ( - // environment variable names - envServiceName = "JAEGER_SERVICE_NAME" - envDisabled = "JAEGER_DISABLED" - envRPCMetrics = "JAEGER_RPC_METRICS" - envTags = "JAEGER_TAGS" - envSamplerType = "JAEGER_SAMPLER_TYPE" - envSamplerParam = "JAEGER_SAMPLER_PARAM" - envSamplerManagerHostPort = "JAEGER_SAMPLER_MANAGER_HOST_PORT" - envSamplerMaxOperations = "JAEGER_SAMPLER_MAX_OPERATIONS" - envSamplerRefreshInterval = "JAEGER_SAMPLER_REFRESH_INTERVAL" - envReporterMaxQueueSize = "JAEGER_REPORTER_MAX_QUEUE_SIZE" - envReporterFlushInterval = "JAEGER_REPORTER_FLUSH_INTERVAL" - envReporterLogSpans = "JAEGER_REPORTER_LOG_SPANS" - envAgentHost = "JAEGER_AGENT_HOST" - envAgentPort = "JAEGER_AGENT_PORT" -) - -// FromEnv uses environment variables to set the tracer's Configuration -func FromEnv() (*Configuration, error) { - c := &Configuration{} - - if e := os.Getenv(envServiceName); e != "" { - c.ServiceName = e - } - - if e := os.Getenv(envRPCMetrics); e != "" { - if value, err := strconv.ParseBool(e); err == nil { - c.RPCMetrics = value - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envRPCMetrics, e) - } - } - - if e := os.Getenv(envDisabled); e != "" { - if value, err := strconv.ParseBool(e); err == nil { - c.Disabled = value - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envDisabled, e) - } - } - - if e := os.Getenv(envTags); e != "" { - c.Tags = parseTags(e) - } - - if s, err := samplerConfigFromEnv(); err == nil { - c.Sampler = s - } else { - return nil, errors.Wrap(err, "cannot obtain sampler config from env") - } - - if r, err := reporterConfigFromEnv(); err == nil { - c.Reporter = r - } else { - return nil, errors.Wrap(err, "cannot obtain reporter config from env") - } - - return c, nil -} - -// samplerConfigFromEnv creates a new SamplerConfig based on the environment variables -func samplerConfigFromEnv() (*SamplerConfig, error) { - sc := &SamplerConfig{} - - if e := os.Getenv(envSamplerType); e != "" { - sc.Type = e - } - - if e := os.Getenv(envSamplerParam); e != "" { - if value, err := strconv.ParseFloat(e, 64); err == nil { - sc.Param = value - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envSamplerParam, e) - } - } - - if e := os.Getenv(envSamplerManagerHostPort); e != "" { - sc.SamplingServerURL = e - } - - if e := os.Getenv(envSamplerMaxOperations); e != "" { - if value, err := strconv.ParseInt(e, 10, 0); err == nil { - sc.MaxOperations = int(value) - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envSamplerMaxOperations, e) - } - } - - if e := os.Getenv(envSamplerRefreshInterval); e != "" { - if value, err := time.ParseDuration(e); err == nil { - sc.SamplingRefreshInterval = value - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envSamplerRefreshInterval, e) - } - } - - return sc, nil -} - -// reporterConfigFromEnv creates a new ReporterConfig based on the environment variables -func reporterConfigFromEnv() (*ReporterConfig, error) { - rc := &ReporterConfig{} - - if e := os.Getenv(envReporterMaxQueueSize); e != "" { - if value, err := strconv.ParseInt(e, 10, 0); err == nil { - rc.QueueSize = int(value) - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envReporterMaxQueueSize, e) - } - } - - if e := os.Getenv(envReporterFlushInterval); e != "" { - if value, err := time.ParseDuration(e); err == nil { - rc.BufferFlushInterval = value - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envReporterFlushInterval, e) - } - } - - if e := os.Getenv(envReporterLogSpans); e != "" { - if value, err := strconv.ParseBool(e); err == nil { - rc.LogSpans = value - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envReporterLogSpans, e) - } - } - - host := jaeger.DefaultUDPSpanServerHost - if e := os.Getenv(envAgentHost); e != "" { - host = e - } - - port := jaeger.DefaultUDPSpanServerPort - if e := os.Getenv(envAgentPort); e != "" { - if value, err := strconv.ParseInt(e, 10, 0); err == nil { - port = int(value) - } else { - return nil, errors.Wrapf(err, "cannot parse env var %s=%s", envAgentPort, e) - } - } - - // the side effect of this is that we are building the default value, even if none of the env vars - // were not explicitly passed - rc.LocalAgentHostPort = fmt.Sprintf("%s:%d", host, port) - - return rc, nil -} - -// parseTags parses the given string into a collection of Tags. -// Spec for this value: -// - comma separated list of key=value -// - value can be specified using the notation ${envVar:defaultValue}, where `envVar` -// is an environment variable and `defaultValue` is the value to use in case the env var is not set -func parseTags(sTags string) []opentracing.Tag { - pairs := strings.Split(sTags, ",") - tags := make([]opentracing.Tag, 0) - for _, p := range pairs { - kv := strings.SplitN(p, "=", 2) - k, v := strings.TrimSpace(kv[0]), strings.TrimSpace(kv[1]) - - if strings.HasPrefix(v, "${") && strings.HasSuffix(v, "}") { - ed := strings.SplitN(v[2:len(v)-1], ":", 2) - e, d := ed[0], ed[1] - v = os.Getenv(e) - if v == "" && d != "" { - v = d - } - } - - tag := opentracing.Tag{Key: k, Value: v} - tags = append(tags, tag) - } - - return tags -} diff --git a/vendor/github.com/uber/jaeger-client-go/config/options.go b/vendor/github.com/uber/jaeger-client-go/config/options.go deleted file mode 100644 index d14f1f8a9b2b..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/config/options.go +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 config - -import ( - opentracing "github.com/opentracing/opentracing-go" - "github.com/uber/jaeger-lib/metrics" - - "github.com/uber/jaeger-client-go" -) - -// Option is a function that sets some option on the client. -type Option func(c *Options) - -// Options control behavior of the client. -type Options struct { - metrics metrics.Factory - logger jaeger.Logger - reporter jaeger.Reporter - sampler jaeger.Sampler - contribObservers []jaeger.ContribObserver - observers []jaeger.Observer - gen128Bit bool - zipkinSharedRPCSpan bool - maxTagValueLength int - tags []opentracing.Tag - injectors map[interface{}]jaeger.Injector - extractors map[interface{}]jaeger.Extractor -} - -// Metrics creates an Option that initializes Metrics in the tracer, -// which is used to emit statistics about spans. -func Metrics(factory metrics.Factory) Option { - return func(c *Options) { - c.metrics = factory - } -} - -// Logger can be provided to log Reporter errors, as well as to log spans -// if Reporter.LogSpans is set to true. -func Logger(logger jaeger.Logger) Option { - return func(c *Options) { - c.logger = logger - } -} - -// Reporter can be provided explicitly to override the configuration. -// Useful for testing, e.g. by passing InMemoryReporter. -func Reporter(reporter jaeger.Reporter) Option { - return func(c *Options) { - c.reporter = reporter - } -} - -// Sampler can be provided explicitly to override the configuration. -func Sampler(sampler jaeger.Sampler) Option { - return func(c *Options) { - c.sampler = sampler - } -} - -// Observer can be registered with the Tracer to receive notifications about new Spans. -func Observer(observer jaeger.Observer) Option { - return func(c *Options) { - c.observers = append(c.observers, observer) - } -} - -// ContribObserver can be registered with the Tracer to recieve notifications -// about new spans. -func ContribObserver(observer jaeger.ContribObserver) Option { - return func(c *Options) { - c.contribObservers = append(c.contribObservers, observer) - } -} - -// Gen128Bit specifies whether to generate 128bit trace IDs. -func Gen128Bit(gen128Bit bool) Option { - return func(c *Options) { - c.gen128Bit = gen128Bit - } -} - -// ZipkinSharedRPCSpan creates an option that enables sharing span ID between client -// and server spans a la zipkin. If false, client and server spans will be assigned -// different IDs. -func ZipkinSharedRPCSpan(zipkinSharedRPCSpan bool) Option { - return func(c *Options) { - c.zipkinSharedRPCSpan = zipkinSharedRPCSpan - } -} - -// MaxTagValueLength can be provided to override the default max tag value length. -func MaxTagValueLength(maxTagValueLength int) Option { - return func(c *Options) { - c.maxTagValueLength = maxTagValueLength - } -} - -// Tag creates an option that adds a tracer-level tag. -func Tag(key string, value interface{}) Option { - return func(c *Options) { - c.tags = append(c.tags, opentracing.Tag{Key: key, Value: value}) - } -} - -// Injector registers an Injector with the given format. -func Injector(format interface{}, injector jaeger.Injector) Option { - return func(c *Options) { - c.injectors[format] = injector - } -} - -// Extractor registers an Extractor with the given format. -func Extractor(format interface{}, extractor jaeger.Extractor) Option { - return func(c *Options) { - c.extractors[format] = extractor - } -} - -func applyOptions(options ...Option) Options { - opts := Options{ - injectors: make(map[interface{}]jaeger.Injector), - extractors: make(map[interface{}]jaeger.Extractor), - } - for _, option := range options { - option(&opts) - } - if opts.metrics == nil { - opts.metrics = metrics.NullFactory - } - if opts.logger == nil { - opts.logger = jaeger.NullLogger - } - return opts -} diff --git a/vendor/github.com/uber/jaeger-client-go/constants.go b/vendor/github.com/uber/jaeger-client-go/constants.go deleted file mode 100644 index b5368ff3815b..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/constants.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -const ( - // JaegerClientVersion is the version of the client library reported as Span tag. - JaegerClientVersion = "Go-2.15.0-dev" - - // JaegerClientVersionTagKey is the name of the tag used to report client version. - JaegerClientVersionTagKey = "jaeger.version" - - // JaegerDebugHeader is the name of HTTP header or a TextMap carrier key which, - // if found in the carrier, forces the trace to be sampled as "debug" trace. - // The value of the header is recorded as the tag on the root span, so that the - // trace can be found in the UI using this value as a correlation ID. - JaegerDebugHeader = "jaeger-debug-id" - - // JaegerBaggageHeader is the name of the HTTP header that is used to submit baggage. - // It differs from TraceBaggageHeaderPrefix in that it can be used only in cases where - // a root span does not exist. - JaegerBaggageHeader = "jaeger-baggage" - - // TracerHostnameTagKey used to report host name of the process. - TracerHostnameTagKey = "hostname" - - // TracerIPTagKey used to report ip of the process. - TracerIPTagKey = "ip" - - // TracerUUIDTagKey used to report UUID of the client process. - TracerUUIDTagKey = "client-uuid" - - // SamplerTypeTagKey reports which sampler was used on the root span. - SamplerTypeTagKey = "sampler.type" - - // SamplerParamTagKey reports the parameter of the sampler, like sampling probability. - SamplerParamTagKey = "sampler.param" - - // TraceContextHeaderName is the http header name used to propagate tracing context. - // This must be in lower-case to avoid mismatches when decoding incoming headers. - TraceContextHeaderName = "uber-trace-id" - - // TracerStateHeaderName is deprecated. - // Deprecated: use TraceContextHeaderName - TracerStateHeaderName = TraceContextHeaderName - - // TraceBaggageHeaderPrefix is the prefix for http headers used to propagate baggage. - // This must be in lower-case to avoid mismatches when decoding incoming headers. - TraceBaggageHeaderPrefix = "uberctx-" - - // SamplerTypeConst is the type of sampler that always makes the same decision. - SamplerTypeConst = "const" - - // SamplerTypeRemote is the type of sampler that polls Jaeger agent for sampling strategy. - SamplerTypeRemote = "remote" - - // SamplerTypeProbabilistic is the type of sampler that samples traces - // with a certain fixed probability. - SamplerTypeProbabilistic = "probabilistic" - - // SamplerTypeRateLimiting is the type of sampler that samples - // only up to a fixed number of traces per second. - SamplerTypeRateLimiting = "ratelimiting" - - // SamplerTypeLowerBound is the type of sampler that samples - // at least a fixed number of traces per second. - SamplerTypeLowerBound = "lowerbound" - - // DefaultUDPSpanServerHost is the default host to send the spans to, via UDP - DefaultUDPSpanServerHost = "localhost" - - // DefaultUDPSpanServerPort is the default port to send the spans to, via UDP - DefaultUDPSpanServerPort = 6831 - - // DefaultMaxTagValueLength is the default max length of byte array or string allowed in the tag value. - DefaultMaxTagValueLength = 256 -) diff --git a/vendor/github.com/uber/jaeger-client-go/context.go b/vendor/github.com/uber/jaeger-client-go/context.go deleted file mode 100644 index 8b06173d9835..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/context.go +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "errors" - "fmt" - "strconv" - "strings" -) - -const ( - flagSampled = byte(1) - flagDebug = byte(2) -) - -var ( - errEmptyTracerStateString = errors.New("Cannot convert empty string to tracer state") - errMalformedTracerStateString = errors.New("String does not match tracer state format") - - emptyContext = SpanContext{} -) - -// TraceID represents unique 128bit identifier of a trace -type TraceID struct { - High, Low uint64 -} - -// SpanID represents unique 64bit identifier of a span -type SpanID uint64 - -// SpanContext represents propagated span identity and state -type SpanContext struct { - // traceID represents globally unique ID of the trace. - // Usually generated as a random number. - traceID TraceID - - // spanID represents span ID that must be unique within its trace, - // but does not have to be globally unique. - spanID SpanID - - // parentID refers to the ID of the parent span. - // Should be 0 if the current span is a root span. - parentID SpanID - - // flags is a bitmap containing such bits as 'sampled' and 'debug'. - flags byte - - // Distributed Context baggage. The is a snapshot in time. - baggage map[string]string - - // debugID can be set to some correlation ID when the context is being - // extracted from a TextMap carrier. - // - // See JaegerDebugHeader in constants.go - debugID string -} - -// ForeachBaggageItem implements ForeachBaggageItem() of opentracing.SpanContext -func (c SpanContext) ForeachBaggageItem(handler func(k, v string) bool) { - for k, v := range c.baggage { - if !handler(k, v) { - break - } - } -} - -// IsSampled returns whether this trace was chosen for permanent storage -// by the sampling mechanism of the tracer. -func (c SpanContext) IsSampled() bool { - return (c.flags & flagSampled) == flagSampled -} - -// IsDebug indicates whether sampling was explicitly requested by the service. -func (c SpanContext) IsDebug() bool { - return (c.flags & flagDebug) == flagDebug -} - -// IsValid indicates whether this context actually represents a valid trace. -func (c SpanContext) IsValid() bool { - return c.traceID.IsValid() && c.spanID != 0 -} - -func (c SpanContext) String() string { - if c.traceID.High == 0 { - return fmt.Sprintf("%x:%x:%x:%x", c.traceID.Low, uint64(c.spanID), uint64(c.parentID), c.flags) - } - return fmt.Sprintf("%x%016x:%x:%x:%x", c.traceID.High, c.traceID.Low, uint64(c.spanID), uint64(c.parentID), c.flags) -} - -// ContextFromString reconstructs the Context encoded in a string -func ContextFromString(value string) (SpanContext, error) { - var context SpanContext - if value == "" { - return emptyContext, errEmptyTracerStateString - } - parts := strings.Split(value, ":") - if len(parts) != 4 { - return emptyContext, errMalformedTracerStateString - } - var err error - if context.traceID, err = TraceIDFromString(parts[0]); err != nil { - return emptyContext, err - } - if context.spanID, err = SpanIDFromString(parts[1]); err != nil { - return emptyContext, err - } - if context.parentID, err = SpanIDFromString(parts[2]); err != nil { - return emptyContext, err - } - flags, err := strconv.ParseUint(parts[3], 10, 8) - if err != nil { - return emptyContext, err - } - context.flags = byte(flags) - return context, nil -} - -// TraceID returns the trace ID of this span context -func (c SpanContext) TraceID() TraceID { - return c.traceID -} - -// SpanID returns the span ID of this span context -func (c SpanContext) SpanID() SpanID { - return c.spanID -} - -// ParentID returns the parent span ID of this span context -func (c SpanContext) ParentID() SpanID { - return c.parentID -} - -// NewSpanContext creates a new instance of SpanContext -func NewSpanContext(traceID TraceID, spanID, parentID SpanID, sampled bool, baggage map[string]string) SpanContext { - flags := byte(0) - if sampled { - flags = flagSampled - } - return SpanContext{ - traceID: traceID, - spanID: spanID, - parentID: parentID, - flags: flags, - baggage: baggage} -} - -// CopyFrom copies data from ctx into this context, including span identity and baggage. -// TODO This is only used by interop.go. Remove once TChannel Go supports OpenTracing. -func (c *SpanContext) CopyFrom(ctx *SpanContext) { - c.traceID = ctx.traceID - c.spanID = ctx.spanID - c.parentID = ctx.parentID - c.flags = ctx.flags - if l := len(ctx.baggage); l > 0 { - c.baggage = make(map[string]string, l) - for k, v := range ctx.baggage { - c.baggage[k] = v - } - } else { - c.baggage = nil - } -} - -// WithBaggageItem creates a new context with an extra baggage item. -func (c SpanContext) WithBaggageItem(key, value string) SpanContext { - var newBaggage map[string]string - if c.baggage == nil { - newBaggage = map[string]string{key: value} - } else { - newBaggage = make(map[string]string, len(c.baggage)+1) - for k, v := range c.baggage { - newBaggage[k] = v - } - newBaggage[key] = value - } - // Use positional parameters so the compiler will help catch new fields. - return SpanContext{c.traceID, c.spanID, c.parentID, c.flags, newBaggage, ""} -} - -// isDebugIDContainerOnly returns true when the instance of the context is only -// used to return the debug/correlation ID from extract() method. This happens -// in the situation when "jaeger-debug-id" header is passed in the carrier to -// the extract() method, but the request otherwise has no span context in it. -// Previously this would've returned opentracing.ErrSpanContextNotFound from the -// extract method, but now it returns a dummy context with only debugID filled in. -// -// See JaegerDebugHeader in constants.go -// See textMapPropagator#Extract -func (c *SpanContext) isDebugIDContainerOnly() bool { - return !c.traceID.IsValid() && c.debugID != "" -} - -// ------- TraceID ------- - -func (t TraceID) String() string { - if t.High == 0 { - return fmt.Sprintf("%x", t.Low) - } - return fmt.Sprintf("%x%016x", t.High, t.Low) -} - -// TraceIDFromString creates a TraceID from a hexadecimal string -func TraceIDFromString(s string) (TraceID, error) { - var hi, lo uint64 - var err error - if len(s) > 32 { - return TraceID{}, fmt.Errorf("TraceID cannot be longer than 32 hex characters: %s", s) - } else if len(s) > 16 { - hiLen := len(s) - 16 - if hi, err = strconv.ParseUint(s[0:hiLen], 16, 64); err != nil { - return TraceID{}, err - } - if lo, err = strconv.ParseUint(s[hiLen:], 16, 64); err != nil { - return TraceID{}, err - } - } else { - if lo, err = strconv.ParseUint(s, 16, 64); err != nil { - return TraceID{}, err - } - } - return TraceID{High: hi, Low: lo}, nil -} - -// IsValid checks if the trace ID is valid, i.e. not zero. -func (t TraceID) IsValid() bool { - return t.High != 0 || t.Low != 0 -} - -// ------- SpanID ------- - -func (s SpanID) String() string { - return fmt.Sprintf("%x", uint64(s)) -} - -// SpanIDFromString creates a SpanID from a hexadecimal string -func SpanIDFromString(s string) (SpanID, error) { - if len(s) > 16 { - return SpanID(0), fmt.Errorf("SpanID cannot be longer than 16 hex characters: %s", s) - } - id, err := strconv.ParseUint(s, 16, 64) - if err != nil { - return SpanID(0), err - } - return SpanID(id), nil -} diff --git a/vendor/github.com/uber/jaeger-client-go/contrib_observer.go b/vendor/github.com/uber/jaeger-client-go/contrib_observer.go deleted file mode 100644 index 4ce1881f3b83..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/contrib_observer.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - opentracing "github.com/opentracing/opentracing-go" -) - -// ContribObserver can be registered with the Tracer to receive notifications -// about new Spans. Modelled after github.com/opentracing-contrib/go-observer. -type ContribObserver interface { - // Create and return a span observer. Called when a span starts. - // If the Observer is not interested in the given span, it must return (nil, false). - // E.g : - // func StartSpan(opName string, opts ...opentracing.StartSpanOption) { - // var sp opentracing.Span - // sso := opentracing.StartSpanOptions{} - // if spanObserver, ok := Observer.OnStartSpan(span, opName, sso); ok { - // // we have a valid SpanObserver - // } - // ... - // } - OnStartSpan(sp opentracing.Span, operationName string, options opentracing.StartSpanOptions) (ContribSpanObserver, bool) -} - -// ContribSpanObserver is created by the Observer and receives notifications -// about other Span events. This interface is meant to match -// github.com/opentracing-contrib/go-observer, via duck typing, without -// directly importing the go-observer package. -type ContribSpanObserver interface { - OnSetOperationName(operationName string) - OnSetTag(key string, value interface{}) - OnFinish(options opentracing.FinishOptions) -} - -// wrapper observer for the old observers (see observer.go) -type oldObserver struct { - obs Observer -} - -func (o *oldObserver) OnStartSpan(sp opentracing.Span, operationName string, options opentracing.StartSpanOptions) (ContribSpanObserver, bool) { - spanObserver := o.obs.OnStartSpan(operationName, options) - return spanObserver, spanObserver != nil -} diff --git a/vendor/github.com/uber/jaeger-client-go/doc.go b/vendor/github.com/uber/jaeger-client-go/doc.go deleted file mode 100644 index 4f5549033d5d..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/doc.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger implements an OpenTracing (http://opentracing.io) Tracer. -It is currently using Zipkin-compatible data model and can be directly -itegrated with Zipkin backend (http://zipkin.io). - -For integration instructions please refer to the README: - -https://github.com/uber/jaeger-client-go/blob/master/README.md -*/ -package jaeger diff --git a/vendor/github.com/uber/jaeger-client-go/glide.lock b/vendor/github.com/uber/jaeger-client-go/glide.lock deleted file mode 100644 index d76b1536171f..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/glide.lock +++ /dev/null @@ -1,89 +0,0 @@ -hash: 3accf84f97bff4a91162736104c0e9b9790820712bd86db6fec5e665f7196a82 -updated: 2018-04-30T11:46:43.804556-04:00 -imports: -- name: github.com/beorn7/perks - version: 3a771d992973f24aa725d07868b467d1ddfceafb - subpackages: - - quantile -- name: github.com/codahale/hdrhistogram - version: 3a0bb77429bd3a61596f5e8a3172445844342120 -- name: github.com/crossdock/crossdock-go - version: 049aabb0122b03bc9bd30cab8f3f91fb60166361 - subpackages: - - assert - - require -- name: github.com/davecgh/go-spew - version: 8991bc29aa16c548c550c7ff78260e27b9ab7c73 - subpackages: - - spew -- name: github.com/golang/protobuf - version: bbd03ef6da3a115852eaf24c8a1c46aeb39aa175 - subpackages: - - proto -- name: github.com/matttproud/golang_protobuf_extensions - version: c12348ce28de40eed0136aa2b644d0ee0650e56c - subpackages: - - pbutil -- name: github.com/opentracing/opentracing-go - version: 1949ddbfd147afd4d964a9f00b24eb291e0e7c38 - subpackages: - - ext - - log -- name: github.com/pkg/errors - version: 645ef00459ed84a119197bfb8d8205042c6df63d -- name: github.com/pmezard/go-difflib - version: 792786c7400a136282c1664665ae0a8db921c6c2 - subpackages: - - difflib -- name: github.com/prometheus/client_golang - version: c5b7fccd204277076155f10851dad72b76a49317 - subpackages: - - prometheus -- name: github.com/prometheus/client_model - version: 99fa1f4be8e564e8a6b613da7fa6f46c9edafc6c - subpackages: - - go -- name: github.com/prometheus/common - version: 38c53a9f4bfcd932d1b00bfc65e256a7fba6b37a - subpackages: - - expfmt - - internal/bitbucket.org/ww/goautoneg - - model -- name: github.com/prometheus/procfs - version: 780932d4fbbe0e69b84c34c20f5c8d0981e109ea - subpackages: - - internal/util - - nfs - - xfs -- name: github.com/stretchr/testify - version: 12b6f73e6084dad08a7c6e575284b177ecafbc71 - subpackages: - - assert - - require - - suite -- name: github.com/uber/jaeger-lib - version: 4267858c0679cd4e47cefed8d7f70fd386cfb567 - subpackages: - - metrics - - metrics/prometheus - - metrics/testutils -- name: go.uber.org/atomic - version: 8474b86a5a6f79c443ce4b2992817ff32cf208b8 -- name: go.uber.org/multierr - version: 3c4937480c32f4c13a875a1829af76c98ca3d40a -- name: go.uber.org/zap - version: eeedf312bc6c57391d84767a4cd413f02a917974 - subpackages: - - buffer - - internal/bufferpool - - internal/color - - internal/exit - - zapcore -- name: golang.org/x/net - version: 6078986fec03a1dcc236c34816c71b0e05018fda - subpackages: - - context - - context/ctxhttp -testImports: -- name: github.com/uber-go/atomic - version: 8474b86a5a6f79c443ce4b2992817ff32cf208b8 diff --git a/vendor/github.com/uber/jaeger-client-go/glide.yaml b/vendor/github.com/uber/jaeger-client-go/glide.yaml deleted file mode 100644 index 6637da215264..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/glide.yaml +++ /dev/null @@ -1,22 +0,0 @@ -package: github.com/uber/jaeger-client-go -import: -- package: github.com/opentracing/opentracing-go - version: ^1 - subpackages: - - ext - - log -- package: github.com/crossdock/crossdock-go -- package: github.com/uber/jaeger-lib - version: ^1.2.1 - subpackages: - - metrics -- package: github.com/pkg/errors - version: ~0.8.0 -testImport: -- package: github.com/stretchr/testify - subpackages: - - assert - - require - - suite -- package: github.com/prometheus/client_golang - version: v0.8.0 diff --git a/vendor/github.com/uber/jaeger-client-go/header.go b/vendor/github.com/uber/jaeger-client-go/header.go deleted file mode 100644 index 19c2c055b813..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/header.go +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -// HeadersConfig contains the values for the header keys that Jaeger will use. -// These values may be either custom or default depending on whether custom -// values were provided via a configuration. -type HeadersConfig struct { - // JaegerDebugHeader is the name of HTTP header or a TextMap carrier key which, - // if found in the carrier, forces the trace to be sampled as "debug" trace. - // The value of the header is recorded as the tag on the root span, so that the - // trace can be found in the UI using this value as a correlation ID. - JaegerDebugHeader string `yaml:"jaegerDebugHeader"` - - // JaegerBaggageHeader is the name of the HTTP header that is used to submit baggage. - // It differs from TraceBaggageHeaderPrefix in that it can be used only in cases where - // a root span does not exist. - JaegerBaggageHeader string `yaml:"jaegerBaggageHeader"` - - // TraceContextHeaderName is the http header name used to propagate tracing context. - // This must be in lower-case to avoid mismatches when decoding incoming headers. - TraceContextHeaderName string `yaml:"TraceContextHeaderName"` - - // TraceBaggageHeaderPrefix is the prefix for http headers used to propagate baggage. - // This must be in lower-case to avoid mismatches when decoding incoming headers. - TraceBaggageHeaderPrefix string `yaml:"traceBaggageHeaderPrefix"` -} - -func (c *HeadersConfig) applyDefaults() *HeadersConfig { - if c.JaegerBaggageHeader == "" { - c.JaegerBaggageHeader = JaegerBaggageHeader - } - if c.JaegerDebugHeader == "" { - c.JaegerDebugHeader = JaegerDebugHeader - } - if c.TraceBaggageHeaderPrefix == "" { - c.TraceBaggageHeaderPrefix = TraceBaggageHeaderPrefix - } - if c.TraceContextHeaderName == "" { - c.TraceContextHeaderName = TraceContextHeaderName - } - return c -} - -func getDefaultHeadersConfig() *HeadersConfig { - return &HeadersConfig{ - JaegerDebugHeader: JaegerDebugHeader, - JaegerBaggageHeader: JaegerBaggageHeader, - TraceContextHeaderName: TraceContextHeaderName, - TraceBaggageHeaderPrefix: TraceBaggageHeaderPrefix, - } -} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/options.go b/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/options.go deleted file mode 100644 index 745729319ff0..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/options.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 remote - -import ( - "time" - - "github.com/uber/jaeger-client-go" -) - -const ( - defaultMaxValueLength = 2048 - defaultRefreshInterval = time.Minute - defaultHostPort = "localhost:5778" -) - -// Option is a function that sets some option on the RestrictionManager -type Option func(options *options) - -// Options is a factory for all available options -var Options options - -type options struct { - denyBaggageOnInitializationFailure bool - metrics *jaeger.Metrics - logger jaeger.Logger - hostPort string - refreshInterval time.Duration -} - -// DenyBaggageOnInitializationFailure creates an Option that determines the startup failure mode of RestrictionManager. -// If DenyBaggageOnInitializationFailure is true, RestrictionManager will not allow any baggage to be written until baggage -// restrictions have been retrieved from agent. -// If DenyBaggageOnInitializationFailure is false, RestrictionManager will allow any baggage to be written until baggage -// restrictions have been retrieved from agent. -func (options) DenyBaggageOnInitializationFailure(b bool) Option { - return func(o *options) { - o.denyBaggageOnInitializationFailure = b - } -} - -// Metrics creates an Option that initializes Metrics on the RestrictionManager, which is used to emit statistics. -func (options) Metrics(m *jaeger.Metrics) Option { - return func(o *options) { - o.metrics = m - } -} - -// Logger creates an Option that sets the logger used by the RestrictionManager. -func (options) Logger(logger jaeger.Logger) Option { - return func(o *options) { - o.logger = logger - } -} - -// HostPort creates an Option that sets the hostPort of the local agent that contains the baggage restrictions. -func (options) HostPort(hostPort string) Option { - return func(o *options) { - o.hostPort = hostPort - } -} - -// RefreshInterval creates an Option that sets how often the RestrictionManager will poll local agent for -// the baggage restrictions. -func (options) RefreshInterval(refreshInterval time.Duration) Option { - return func(o *options) { - o.refreshInterval = refreshInterval - } -} - -func applyOptions(o ...Option) options { - opts := options{} - for _, option := range o { - option(&opts) - } - if opts.metrics == nil { - opts.metrics = jaeger.NewNullMetrics() - } - if opts.logger == nil { - opts.logger = jaeger.NullLogger - } - if opts.hostPort == "" { - opts.hostPort = defaultHostPort - } - if opts.refreshInterval == 0 { - opts.refreshInterval = defaultRefreshInterval - } - return opts -} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/restriction_manager.go b/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/restriction_manager.go deleted file mode 100644 index a56515acab86..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/internal/baggage/remote/restriction_manager.go +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 remote - -import ( - "fmt" - "net/url" - "sync" - "time" - - "github.com/uber/jaeger-client-go/internal/baggage" - thrift "github.com/uber/jaeger-client-go/thrift-gen/baggage" - "github.com/uber/jaeger-client-go/utils" -) - -type httpBaggageRestrictionManagerProxy struct { - url string -} - -func newHTTPBaggageRestrictionManagerProxy(hostPort, serviceName string) *httpBaggageRestrictionManagerProxy { - v := url.Values{} - v.Set("service", serviceName) - return &httpBaggageRestrictionManagerProxy{ - url: fmt.Sprintf("http://%s/baggageRestrictions?%s", hostPort, v.Encode()), - } -} - -func (s *httpBaggageRestrictionManagerProxy) GetBaggageRestrictions(serviceName string) ([]*thrift.BaggageRestriction, error) { - var out []*thrift.BaggageRestriction - if err := utils.GetJSON(s.url, &out); err != nil { - return nil, err - } - return out, nil -} - -// RestrictionManager manages baggage restrictions by retrieving baggage restrictions from agent -type RestrictionManager struct { - options - - mux sync.RWMutex - serviceName string - restrictions map[string]*baggage.Restriction - thriftProxy thrift.BaggageRestrictionManager - pollStopped sync.WaitGroup - stopPoll chan struct{} - invalidRestriction *baggage.Restriction - validRestriction *baggage.Restriction - - // Determines if the manager has successfully retrieved baggage restrictions from agent - initialized bool -} - -// NewRestrictionManager returns a BaggageRestrictionManager that polls the agent for the latest -// baggage restrictions. -func NewRestrictionManager(serviceName string, options ...Option) *RestrictionManager { - // TODO there is a developing use case where a single tracer can generate traces on behalf of many services. - // restrictionsMap will need to exist per service - opts := applyOptions(options...) - m := &RestrictionManager{ - serviceName: serviceName, - options: opts, - restrictions: make(map[string]*baggage.Restriction), - thriftProxy: newHTTPBaggageRestrictionManagerProxy(opts.hostPort, serviceName), - stopPoll: make(chan struct{}), - invalidRestriction: baggage.NewRestriction(false, 0), - validRestriction: baggage.NewRestriction(true, defaultMaxValueLength), - } - m.pollStopped.Add(1) - go m.pollManager() - return m -} - -// isReady returns true if the manager has retrieved baggage restrictions from the remote source. -func (m *RestrictionManager) isReady() bool { - m.mux.RLock() - defer m.mux.RUnlock() - return m.initialized -} - -// GetRestriction implements RestrictionManager#GetRestriction. -func (m *RestrictionManager) GetRestriction(service, key string) *baggage.Restriction { - m.mux.RLock() - defer m.mux.RUnlock() - if !m.initialized { - if m.denyBaggageOnInitializationFailure { - return m.invalidRestriction - } - return m.validRestriction - } - if restriction, ok := m.restrictions[key]; ok { - return restriction - } - return m.invalidRestriction -} - -// Close stops remote polling and closes the RemoteRestrictionManager. -func (m *RestrictionManager) Close() error { - close(m.stopPoll) - m.pollStopped.Wait() - return nil -} - -func (m *RestrictionManager) pollManager() { - defer m.pollStopped.Done() - // attempt to initialize baggage restrictions - if err := m.updateRestrictions(); err != nil { - m.logger.Error(fmt.Sprintf("Failed to initialize baggage restrictions: %s", err.Error())) - } - ticker := time.NewTicker(m.refreshInterval) - defer ticker.Stop() - - for { - select { - case <-ticker.C: - if err := m.updateRestrictions(); err != nil { - m.logger.Error(fmt.Sprintf("Failed to update baggage restrictions: %s", err.Error())) - } - case <-m.stopPoll: - return - } - } -} - -func (m *RestrictionManager) updateRestrictions() error { - restrictions, err := m.thriftProxy.GetBaggageRestrictions(m.serviceName) - if err != nil { - m.metrics.BaggageRestrictionsUpdateFailure.Inc(1) - return err - } - newRestrictions := m.parseRestrictions(restrictions) - m.metrics.BaggageRestrictionsUpdateSuccess.Inc(1) - m.mux.Lock() - defer m.mux.Unlock() - m.initialized = true - m.restrictions = newRestrictions - return nil -} - -func (m *RestrictionManager) parseRestrictions(restrictions []*thrift.BaggageRestriction) map[string]*baggage.Restriction { - setters := make(map[string]*baggage.Restriction, len(restrictions)) - for _, restriction := range restrictions { - setters[restriction.BaggageKey] = baggage.NewRestriction(true, int(restriction.MaxValueLength)) - } - return setters -} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/baggage/restriction_manager.go b/vendor/github.com/uber/jaeger-client-go/internal/baggage/restriction_manager.go deleted file mode 100644 index c16a5c566291..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/internal/baggage/restriction_manager.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 baggage - -const ( - defaultMaxValueLength = 2048 -) - -// Restriction determines whether a baggage key is allowed and contains any restrictions on the baggage value. -type Restriction struct { - keyAllowed bool - maxValueLength int -} - -// NewRestriction returns a new Restriction. -func NewRestriction(keyAllowed bool, maxValueLength int) *Restriction { - return &Restriction{ - keyAllowed: keyAllowed, - maxValueLength: maxValueLength, - } -} - -// KeyAllowed returns whether the baggage key for this restriction is allowed. -func (r *Restriction) KeyAllowed() bool { - return r.keyAllowed -} - -// MaxValueLength returns the max length for the baggage value. -func (r *Restriction) MaxValueLength() int { - return r.maxValueLength -} - -// RestrictionManager keeps track of valid baggage keys and their restrictions. The manager -// will return a Restriction for a specific baggage key which will determine whether the baggage -// key is allowed for the current service and any other applicable restrictions on the baggage -// value. -type RestrictionManager interface { - GetRestriction(service, key string) *Restriction -} - -// DefaultRestrictionManager allows any baggage key. -type DefaultRestrictionManager struct { - defaultRestriction *Restriction -} - -// NewDefaultRestrictionManager returns a DefaultRestrictionManager. -func NewDefaultRestrictionManager(maxValueLength int) *DefaultRestrictionManager { - if maxValueLength == 0 { - maxValueLength = defaultMaxValueLength - } - return &DefaultRestrictionManager{ - defaultRestriction: &Restriction{keyAllowed: true, maxValueLength: maxValueLength}, - } -} - -// GetRestriction implements RestrictionManager#GetRestriction. -func (m *DefaultRestrictionManager) GetRestriction(service, key string) *Restriction { - return m.defaultRestriction -} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/spanlog/json.go b/vendor/github.com/uber/jaeger-client-go/internal/spanlog/json.go deleted file mode 100644 index 0e10b8a5aa8e..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/internal/spanlog/json.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 spanlog - -import ( - "encoding/json" - "fmt" - - "github.com/opentracing/opentracing-go/log" -) - -type fieldsAsMap map[string]string - -// MaterializeWithJSON converts log Fields into JSON string -// TODO refactor into pluggable materializer -func MaterializeWithJSON(logFields []log.Field) ([]byte, error) { - fields := fieldsAsMap(make(map[string]string, len(logFields))) - for _, field := range logFields { - field.Marshal(fields) - } - if event, ok := fields["event"]; ok && len(fields) == 1 { - return []byte(event), nil - } - return json.Marshal(fields) -} - -func (ml fieldsAsMap) EmitString(key, value string) { - ml[key] = value -} - -func (ml fieldsAsMap) EmitBool(key string, value bool) { - ml[key] = fmt.Sprintf("%t", value) -} - -func (ml fieldsAsMap) EmitInt(key string, value int) { - ml[key] = fmt.Sprintf("%d", value) -} - -func (ml fieldsAsMap) EmitInt32(key string, value int32) { - ml[key] = fmt.Sprintf("%d", value) -} - -func (ml fieldsAsMap) EmitInt64(key string, value int64) { - ml[key] = fmt.Sprintf("%d", value) -} - -func (ml fieldsAsMap) EmitUint32(key string, value uint32) { - ml[key] = fmt.Sprintf("%d", value) -} - -func (ml fieldsAsMap) EmitUint64(key string, value uint64) { - ml[key] = fmt.Sprintf("%d", value) -} - -func (ml fieldsAsMap) EmitFloat32(key string, value float32) { - ml[key] = fmt.Sprintf("%f", value) -} - -func (ml fieldsAsMap) EmitFloat64(key string, value float64) { - ml[key] = fmt.Sprintf("%f", value) -} - -func (ml fieldsAsMap) EmitObject(key string, value interface{}) { - ml[key] = fmt.Sprintf("%+v", value) -} - -func (ml fieldsAsMap) EmitLazyLogger(value log.LazyLogger) { - value(ml) -} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/options.go b/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/options.go deleted file mode 100644 index f52c322fb69a..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/options.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) 2018 The Jaeger 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 remote - -import ( - "time" - - "github.com/uber/jaeger-client-go" -) - -const ( - defaultHostPort = "localhost:5778" - defaultRefreshInterval = time.Second * 5 -) - -// Option is a function that sets some option on the Throttler -type Option func(options *options) - -// Options is a factory for all available options -var Options options - -type options struct { - metrics *jaeger.Metrics - logger jaeger.Logger - hostPort string - refreshInterval time.Duration - synchronousInitialization bool -} - -// Metrics creates an Option that initializes Metrics on the Throttler, which is used to emit statistics. -func (options) Metrics(m *jaeger.Metrics) Option { - return func(o *options) { - o.metrics = m - } -} - -// Logger creates an Option that sets the logger used by the Throttler. -func (options) Logger(logger jaeger.Logger) Option { - return func(o *options) { - o.logger = logger - } -} - -// HostPort creates an Option that sets the hostPort of the local agent that keeps track of credits. -func (options) HostPort(hostPort string) Option { - return func(o *options) { - o.hostPort = hostPort - } -} - -// RefreshInterval creates an Option that sets how often the Throttler will poll local agent for -// credits. -func (options) RefreshInterval(refreshInterval time.Duration) Option { - return func(o *options) { - o.refreshInterval = refreshInterval - } -} - -// SynchronousInitialization creates an Option that determines whether the throttler should synchronously -// fetch credits from the agent when an operation is seen for the first time. This should be set to true -// if the client will be used by a short lived service that needs to ensure that credits are fetched upfront -// such that sampling or throttling occurs. -func (options) SynchronousInitialization(b bool) Option { - return func(o *options) { - o.synchronousInitialization = b - } -} - -func applyOptions(o ...Option) options { - opts := options{} - for _, option := range o { - option(&opts) - } - if opts.metrics == nil { - opts.metrics = jaeger.NewNullMetrics() - } - if opts.logger == nil { - opts.logger = jaeger.NullLogger - } - if opts.hostPort == "" { - opts.hostPort = defaultHostPort - } - if opts.refreshInterval == 0 { - opts.refreshInterval = defaultRefreshInterval - } - return opts -} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/throttler.go b/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/throttler.go deleted file mode 100644 index 20f434fe4956..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/internal/throttler/remote/throttler.go +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright (c) 2018 The Jaeger 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 remote - -import ( - "fmt" - "net/url" - "sync" - "sync/atomic" - "time" - - "github.com/pkg/errors" - - "github.com/uber/jaeger-client-go" - "github.com/uber/jaeger-client-go/utils" -) - -const ( - // minimumCredits is the minimum amount of credits necessary to not be throttled. - // i.e. if currentCredits > minimumCredits, then the operation will not be throttled. - minimumCredits = 1.0 -) - -var ( - errorUUIDNotSet = errors.New("Throttler UUID must be set") -) - -type operationBalance struct { - Operation string `json:"operation"` - Balance float64 `json:"balance"` -} - -type creditResponse struct { - Balances []operationBalance `json:"balances"` -} - -type httpCreditManagerProxy struct { - hostPort string -} - -func newHTTPCreditManagerProxy(hostPort string) *httpCreditManagerProxy { - return &httpCreditManagerProxy{ - hostPort: hostPort, - } -} - -// N.B. Operations list must not be empty. -func (m *httpCreditManagerProxy) FetchCredits(uuid, serviceName string, operations []string) (*creditResponse, error) { - params := url.Values{} - params.Set("service", serviceName) - params.Set("uuid", uuid) - for _, op := range operations { - params.Add("operations", op) - } - var resp creditResponse - if err := utils.GetJSON(fmt.Sprintf("http://%s/credits?%s", m.hostPort, params.Encode()), &resp); err != nil { - return nil, errors.Wrap(err, "Failed to receive credits from agent") - } - return &resp, nil -} - -// Throttler retrieves credits from agent and uses it to throttle operations. -type Throttler struct { - options - - mux sync.RWMutex - service string - uuid atomic.Value - creditManager *httpCreditManagerProxy - credits map[string]float64 // map of operation->credits - close chan struct{} - stopped sync.WaitGroup -} - -// NewThrottler returns a Throttler that polls agent for credits and uses them to throttle -// the service. -func NewThrottler(service string, options ...Option) *Throttler { - opts := applyOptions(options...) - creditManager := newHTTPCreditManagerProxy(opts.hostPort) - t := &Throttler{ - options: opts, - creditManager: creditManager, - service: service, - credits: make(map[string]float64), - close: make(chan struct{}), - } - t.stopped.Add(1) - go t.pollManager() - return t -} - -// IsAllowed implements Throttler#IsAllowed. -func (t *Throttler) IsAllowed(operation string) bool { - t.mux.Lock() - defer t.mux.Unlock() - value, ok := t.credits[operation] - if !ok || value == 0 { - if !ok { - // NOTE: This appears to be a no-op at first glance, but it stores - // the operation key in the map. Necessary for functionality of - // Throttler#operations method. - t.credits[operation] = 0 - } - if !t.synchronousInitialization { - t.metrics.ThrottledDebugSpans.Inc(1) - return false - } - // If it is the first time this operation is being checked, synchronously fetch - // the credits. - credits, err := t.fetchCredits([]string{operation}) - if err != nil { - // Failed to receive credits from agent, try again next time - t.logger.Error("Failed to fetch credits: " + err.Error()) - return false - } - if len(credits.Balances) == 0 { - // This shouldn't happen but just in case - return false - } - for _, opBalance := range credits.Balances { - t.credits[opBalance.Operation] += opBalance.Balance - } - } - return t.isAllowed(operation) -} - -// Close stops the throttler from fetching credits from remote. -func (t *Throttler) Close() error { - close(t.close) - t.stopped.Wait() - return nil -} - -// SetProcess implements ProcessSetter#SetProcess. It's imperative that the UUID is set before any remote -// requests are made. -func (t *Throttler) SetProcess(process jaeger.Process) { - if process.UUID != "" { - t.uuid.Store(process.UUID) - } -} - -// N.B. This function must be called with the Write Lock -func (t *Throttler) isAllowed(operation string) bool { - credits := t.credits[operation] - if credits < minimumCredits { - t.metrics.ThrottledDebugSpans.Inc(1) - return false - } - t.credits[operation] = credits - minimumCredits - return true -} - -func (t *Throttler) pollManager() { - defer t.stopped.Done() - ticker := time.NewTicker(t.refreshInterval) - defer ticker.Stop() - for { - select { - case <-ticker.C: - t.refreshCredits() - case <-t.close: - return - } - } -} - -func (t *Throttler) operations() []string { - t.mux.RLock() - defer t.mux.RUnlock() - operations := make([]string, 0, len(t.credits)) - for op := range t.credits { - operations = append(operations, op) - } - return operations -} - -func (t *Throttler) refreshCredits() { - operations := t.operations() - if len(operations) == 0 { - return - } - newCredits, err := t.fetchCredits(operations) - if err != nil { - t.metrics.ThrottlerUpdateFailure.Inc(1) - t.logger.Error("Failed to fetch credits: " + err.Error()) - return - } - t.metrics.ThrottlerUpdateSuccess.Inc(1) - - t.mux.Lock() - defer t.mux.Unlock() - for _, opBalance := range newCredits.Balances { - t.credits[opBalance.Operation] += opBalance.Balance - } -} - -func (t *Throttler) fetchCredits(operations []string) (*creditResponse, error) { - uuid := t.uuid.Load() - uuidStr, _ := uuid.(string) - if uuid == nil || uuidStr == "" { - return nil, errorUUIDNotSet - } - return t.creditManager.FetchCredits(uuidStr, t.service, operations) -} diff --git a/vendor/github.com/uber/jaeger-client-go/internal/throttler/throttler.go b/vendor/github.com/uber/jaeger-client-go/internal/throttler/throttler.go deleted file mode 100644 index 196ed69cacae..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/internal/throttler/throttler.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) 2018 The Jaeger 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 throttler - -// Throttler is used to rate limits operations. For example, given how debug spans -// are always sampled, a throttler can be enabled per client to rate limit the amount -// of debug spans a client can start. -type Throttler interface { - // IsAllowed determines whether the operation should be allowed and not be - // throttled. - IsAllowed(operation string) bool -} - -// DefaultThrottler doesn't throttle at all. -type DefaultThrottler struct{} - -// IsAllowed implements Throttler#IsAllowed. -func (t DefaultThrottler) IsAllowed(operation string) bool { - return true -} diff --git a/vendor/github.com/uber/jaeger-client-go/interop.go b/vendor/github.com/uber/jaeger-client-go/interop.go deleted file mode 100644 index 8402d087c29f..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/interop.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "github.com/opentracing/opentracing-go" -) - -// TODO this file should not be needed after TChannel PR. - -type formatKey int - -// SpanContextFormat is a constant used as OpenTracing Format. -// Requires *SpanContext as carrier. -// This format is intended for interop with TChannel or other Zipkin-like tracers. -const SpanContextFormat formatKey = iota - -type jaegerTraceContextPropagator struct { - tracer *Tracer -} - -func (p *jaegerTraceContextPropagator) Inject( - ctx SpanContext, - abstractCarrier interface{}, -) error { - carrier, ok := abstractCarrier.(*SpanContext) - if !ok { - return opentracing.ErrInvalidCarrier - } - - carrier.CopyFrom(&ctx) - return nil -} - -func (p *jaegerTraceContextPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) { - carrier, ok := abstractCarrier.(*SpanContext) - if !ok { - return emptyContext, opentracing.ErrInvalidCarrier - } - ctx := new(SpanContext) - ctx.CopyFrom(carrier) - return *ctx, nil -} diff --git a/vendor/github.com/uber/jaeger-client-go/jaeger_tag.go b/vendor/github.com/uber/jaeger-client-go/jaeger_tag.go deleted file mode 100644 index 868b2a5b5465..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/jaeger_tag.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "fmt" - - "github.com/opentracing/opentracing-go/log" - - j "github.com/uber/jaeger-client-go/thrift-gen/jaeger" -) - -type tags []*j.Tag - -// ConvertLogsToJaegerTags converts log Fields into jaeger tags. -func ConvertLogsToJaegerTags(logFields []log.Field) []*j.Tag { - fields := tags(make([]*j.Tag, 0, len(logFields))) - for _, field := range logFields { - field.Marshal(&fields) - } - return fields -} - -func (t *tags) EmitString(key, value string) { - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_STRING, VStr: &value}) -} - -func (t *tags) EmitBool(key string, value bool) { - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_BOOL, VBool: &value}) -} - -func (t *tags) EmitInt(key string, value int) { - vLong := int64(value) - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong}) -} - -func (t *tags) EmitInt32(key string, value int32) { - vLong := int64(value) - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong}) -} - -func (t *tags) EmitInt64(key string, value int64) { - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &value}) -} - -func (t *tags) EmitUint32(key string, value uint32) { - vLong := int64(value) - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong}) -} - -func (t *tags) EmitUint64(key string, value uint64) { - vLong := int64(value) - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_LONG, VLong: &vLong}) -} - -func (t *tags) EmitFloat32(key string, value float32) { - vDouble := float64(value) - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_DOUBLE, VDouble: &vDouble}) -} - -func (t *tags) EmitFloat64(key string, value float64) { - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_DOUBLE, VDouble: &value}) -} - -func (t *tags) EmitObject(key string, value interface{}) { - vStr := fmt.Sprintf("%+v", value) - *t = append(*t, &j.Tag{Key: key, VType: j.TagType_STRING, VStr: &vStr}) -} - -func (t *tags) EmitLazyLogger(value log.LazyLogger) { - value(t) -} diff --git a/vendor/github.com/uber/jaeger-client-go/jaeger_thrift_span.go b/vendor/github.com/uber/jaeger-client-go/jaeger_thrift_span.go deleted file mode 100644 index 6ce1caf873d9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/jaeger_thrift_span.go +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "time" - - "github.com/opentracing/opentracing-go" - - j "github.com/uber/jaeger-client-go/thrift-gen/jaeger" - "github.com/uber/jaeger-client-go/utils" -) - -// BuildJaegerThrift builds jaeger span based on internal span. -func BuildJaegerThrift(span *Span) *j.Span { - span.Lock() - defer span.Unlock() - startTime := utils.TimeToMicrosecondsSinceEpochInt64(span.startTime) - duration := span.duration.Nanoseconds() / int64(time.Microsecond) - jaegerSpan := &j.Span{ - TraceIdLow: int64(span.context.traceID.Low), - TraceIdHigh: int64(span.context.traceID.High), - SpanId: int64(span.context.spanID), - ParentSpanId: int64(span.context.parentID), - OperationName: span.operationName, - Flags: int32(span.context.flags), - StartTime: startTime, - Duration: duration, - Tags: buildTags(span.tags, span.tracer.options.maxTagValueLength), - Logs: buildLogs(span.logs), - References: buildReferences(span.references), - } - return jaegerSpan -} - -// BuildJaegerProcessThrift creates a thrift Process type. -func BuildJaegerProcessThrift(span *Span) *j.Process { - span.Lock() - defer span.Unlock() - return buildJaegerProcessThrift(span.tracer) -} - -func buildJaegerProcessThrift(tracer *Tracer) *j.Process { - process := &j.Process{ - ServiceName: tracer.serviceName, - Tags: buildTags(tracer.tags, tracer.options.maxTagValueLength), - } - if tracer.process.UUID != "" { - process.Tags = append(process.Tags, &j.Tag{Key: TracerUUIDTagKey, VStr: &tracer.process.UUID, VType: j.TagType_STRING}) - } - return process -} - -func buildTags(tags []Tag, maxTagValueLength int) []*j.Tag { - jTags := make([]*j.Tag, 0, len(tags)) - for _, tag := range tags { - jTag := buildTag(&tag, maxTagValueLength) - jTags = append(jTags, jTag) - } - return jTags -} - -func buildLogs(logs []opentracing.LogRecord) []*j.Log { - jLogs := make([]*j.Log, 0, len(logs)) - for _, log := range logs { - jLog := &j.Log{ - Timestamp: utils.TimeToMicrosecondsSinceEpochInt64(log.Timestamp), - Fields: ConvertLogsToJaegerTags(log.Fields), - } - jLogs = append(jLogs, jLog) - } - return jLogs -} - -func buildTag(tag *Tag, maxTagValueLength int) *j.Tag { - jTag := &j.Tag{Key: tag.key} - switch value := tag.value.(type) { - case string: - vStr := truncateString(value, maxTagValueLength) - jTag.VStr = &vStr - jTag.VType = j.TagType_STRING - case []byte: - if len(value) > maxTagValueLength { - value = value[:maxTagValueLength] - } - jTag.VBinary = value - jTag.VType = j.TagType_BINARY - case int: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case uint: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case int8: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case uint8: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case int16: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case uint16: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case int32: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case uint32: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case int64: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case uint64: - vLong := int64(value) - jTag.VLong = &vLong - jTag.VType = j.TagType_LONG - case float32: - vDouble := float64(value) - jTag.VDouble = &vDouble - jTag.VType = j.TagType_DOUBLE - case float64: - vDouble := float64(value) - jTag.VDouble = &vDouble - jTag.VType = j.TagType_DOUBLE - case bool: - vBool := value - jTag.VBool = &vBool - jTag.VType = j.TagType_BOOL - default: - vStr := truncateString(stringify(value), maxTagValueLength) - jTag.VStr = &vStr - jTag.VType = j.TagType_STRING - } - return jTag -} - -func buildReferences(references []Reference) []*j.SpanRef { - retMe := make([]*j.SpanRef, 0, len(references)) - for _, ref := range references { - if ref.Type == opentracing.ChildOfRef { - retMe = append(retMe, spanRef(ref.Context, j.SpanRefType_CHILD_OF)) - } else if ref.Type == opentracing.FollowsFromRef { - retMe = append(retMe, spanRef(ref.Context, j.SpanRefType_FOLLOWS_FROM)) - } - } - return retMe -} - -func spanRef(ctx SpanContext, refType j.SpanRefType) *j.SpanRef { - return &j.SpanRef{ - RefType: refType, - TraceIdLow: int64(ctx.traceID.Low), - TraceIdHigh: int64(ctx.traceID.High), - SpanId: int64(ctx.spanID), - } -} diff --git a/vendor/github.com/uber/jaeger-client-go/log/logger.go b/vendor/github.com/uber/jaeger-client-go/log/logger.go deleted file mode 100644 index 894bb3dbf712..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/log/logger.go +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 log - -import ( - "bytes" - "fmt" - "log" - "sync" -) - -// Logger provides an abstract interface for logging from Reporters. -// Applications can provide their own implementation of this interface to adapt -// reporters logging to whatever logging library they prefer (stdlib log, -// logrus, go-logging, etc). -type Logger interface { - // Error logs a message at error priority - Error(msg string) - - // Infof logs a message at info priority - Infof(msg string, args ...interface{}) -} - -// StdLogger is implementation of the Logger interface that delegates to default `log` package -var StdLogger = &stdLogger{} - -type stdLogger struct{} - -func (l *stdLogger) Error(msg string) { - log.Printf("ERROR: %s", msg) -} - -// Infof logs a message at info priority -func (l *stdLogger) Infof(msg string, args ...interface{}) { - log.Printf(msg, args...) -} - -// NullLogger is implementation of the Logger interface that is no-op -var NullLogger = &nullLogger{} - -type nullLogger struct{} - -func (l *nullLogger) Error(msg string) {} -func (l *nullLogger) Infof(msg string, args ...interface{}) {} - -// BytesBufferLogger implements Logger backed by a bytes.Buffer. -type BytesBufferLogger struct { - mux sync.Mutex - buf bytes.Buffer -} - -// Error implements Logger. -func (l *BytesBufferLogger) Error(msg string) { - l.mux.Lock() - l.buf.WriteString(fmt.Sprintf("ERROR: %s\n", msg)) - l.mux.Unlock() -} - -// Infof implements Logger. -func (l *BytesBufferLogger) Infof(msg string, args ...interface{}) { - l.mux.Lock() - l.buf.WriteString("INFO: " + fmt.Sprintf(msg, args...) + "\n") - l.mux.Unlock() -} - -// String returns string representation of the underlying buffer. -func (l *BytesBufferLogger) String() string { - l.mux.Lock() - defer l.mux.Unlock() - return l.buf.String() -} - -// Flush empties the underlying buffer. -func (l *BytesBufferLogger) Flush() { - l.mux.Lock() - defer l.mux.Unlock() - l.buf.Reset() -} diff --git a/vendor/github.com/uber/jaeger-client-go/logger.go b/vendor/github.com/uber/jaeger-client-go/logger.go deleted file mode 100644 index d4f0b501923d..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/logger.go +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import "log" - -// NB This will be deprecated in 3.0.0, please use jaeger-client-go/log/logger instead. - -// Logger provides an abstract interface for logging from Reporters. -// Applications can provide their own implementation of this interface to adapt -// reporters logging to whatever logging library they prefer (stdlib log, -// logrus, go-logging, etc). -type Logger interface { - // Error logs a message at error priority - Error(msg string) - - // Infof logs a message at info priority - Infof(msg string, args ...interface{}) -} - -// StdLogger is implementation of the Logger interface that delegates to default `log` package -var StdLogger = &stdLogger{} - -type stdLogger struct{} - -func (l *stdLogger) Error(msg string) { - log.Printf("ERROR: %s", msg) -} - -// Infof logs a message at info priority -func (l *stdLogger) Infof(msg string, args ...interface{}) { - log.Printf(msg, args...) -} - -// NullLogger is implementation of the Logger interface that delegates to default `log` package -var NullLogger = &nullLogger{} - -type nullLogger struct{} - -func (l *nullLogger) Error(msg string) {} -func (l *nullLogger) Infof(msg string, args ...interface{}) {} diff --git a/vendor/github.com/uber/jaeger-client-go/metrics.go b/vendor/github.com/uber/jaeger-client-go/metrics.go deleted file mode 100644 index cadb2b9c0fb0..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/metrics.go +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (c) 2017-2018 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "github.com/uber/jaeger-lib/metrics" -) - -// Metrics is a container of all stats emitted by Jaeger tracer. -type Metrics struct { - // Number of traces started by this tracer as sampled - TracesStartedSampled metrics.Counter `metric:"traces" tags:"state=started,sampled=y"` - - // Number of traces started by this tracer as not sampled - TracesStartedNotSampled metrics.Counter `metric:"traces" tags:"state=started,sampled=n"` - - // Number of externally started sampled traces this tracer joined - TracesJoinedSampled metrics.Counter `metric:"traces" tags:"state=joined,sampled=y"` - - // Number of externally started not-sampled traces this tracer joined - TracesJoinedNotSampled metrics.Counter `metric:"traces" tags:"state=joined,sampled=n"` - - // Number of sampled spans started by this tracer - SpansStartedSampled metrics.Counter `metric:"started_spans" tags:"sampled=y"` - - // Number of unsampled spans started by this tracer - SpansStartedNotSampled metrics.Counter `metric:"started_spans" tags:"sampled=n"` - - // Number of spans finished by this tracer - SpansFinished metrics.Counter `metric:"finished_spans"` - - // Number of errors decoding tracing context - DecodingErrors metrics.Counter `metric:"span_context_decoding_errors"` - - // Number of spans successfully reported - ReporterSuccess metrics.Counter `metric:"reporter_spans" tags:"result=ok"` - - // Number of spans not reported due to a Sender failure - ReporterFailure metrics.Counter `metric:"reporter_spans" tags:"result=err"` - - // Number of spans dropped due to internal queue overflow - ReporterDropped metrics.Counter `metric:"reporter_spans" tags:"result=dropped"` - - // Current number of spans in the reporter queue - ReporterQueueLength metrics.Gauge `metric:"reporter_queue_length"` - - // Number of times the Sampler succeeded to retrieve sampling strategy - SamplerRetrieved metrics.Counter `metric:"sampler_queries" tags:"result=ok"` - - // Number of times the Sampler failed to retrieve sampling strategy - SamplerQueryFailure metrics.Counter `metric:"sampler_queries" tags:"result=err"` - - // Number of times the Sampler succeeded to retrieve and update sampling strategy - SamplerUpdated metrics.Counter `metric:"sampler_updates" tags:"result=ok"` - - // Number of times the Sampler failed to update sampling strategy - SamplerUpdateFailure metrics.Counter `metric:"sampler_updates" tags:"result=err"` - - // Number of times baggage was successfully written or updated on spans. - BaggageUpdateSuccess metrics.Counter `metric:"baggage_updates" tags:"result=ok"` - - // Number of times baggage failed to write or update on spans. - BaggageUpdateFailure metrics.Counter `metric:"baggage_updates" tags:"result=err"` - - // Number of times baggage was truncated as per baggage restrictions. - BaggageTruncate metrics.Counter `metric:"baggage_truncations"` - - // Number of times baggage restrictions were successfully updated. - BaggageRestrictionsUpdateSuccess metrics.Counter `metric:"baggage_restrictions_updates" tags:"result=ok"` - - // Number of times baggage restrictions failed to update. - BaggageRestrictionsUpdateFailure metrics.Counter `metric:"baggage_restrictions_updates" tags:"result=err"` - - // Number of times debug spans were throttled. - ThrottledDebugSpans metrics.Counter `metric:"throttled_debug_spans"` - - // Number of times throttler successfully updated. - ThrottlerUpdateSuccess metrics.Counter `metric:"throttler_updates" tags:"result=ok"` - - // Number of times throttler failed to update. - ThrottlerUpdateFailure metrics.Counter `metric:"throttler_updates" tags:"result=err"` -} - -// NewMetrics creates a new Metrics struct and initializes it. -func NewMetrics(factory metrics.Factory, globalTags map[string]string) *Metrics { - m := &Metrics{} - // TODO the namespace "jaeger" should be configurable (e.g. in all-in-one "jaeger-client" would make more sense) - metrics.Init(m, factory.Namespace("jaeger", nil), globalTags) - return m -} - -// NewNullMetrics creates a new Metrics struct that won't report any metrics. -func NewNullMetrics() *Metrics { - return NewMetrics(metrics.NullFactory, nil) -} diff --git a/vendor/github.com/uber/jaeger-client-go/observer.go b/vendor/github.com/uber/jaeger-client-go/observer.go deleted file mode 100644 index 7bbd028897a9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/observer.go +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import opentracing "github.com/opentracing/opentracing-go" - -// Observer can be registered with the Tracer to receive notifications about -// new Spans. -// -// Deprecated: use jaeger.ContribObserver instead. -type Observer interface { - OnStartSpan(operationName string, options opentracing.StartSpanOptions) SpanObserver -} - -// SpanObserver is created by the Observer and receives notifications about -// other Span events. -// -// Deprecated: use jaeger.ContribSpanObserver instead. -type SpanObserver interface { - OnSetOperationName(operationName string) - OnSetTag(key string, value interface{}) - OnFinish(options opentracing.FinishOptions) -} - -// compositeObserver is a dispatcher to other observers -type compositeObserver struct { - observers []ContribObserver -} - -// compositeSpanObserver is a dispatcher to other span observers -type compositeSpanObserver struct { - observers []ContribSpanObserver -} - -// noopSpanObserver is used when there are no observers registered -// on the Tracer or none of them returns span observers from OnStartSpan. -var noopSpanObserver = &compositeSpanObserver{} - -func (o *compositeObserver) append(contribObserver ContribObserver) { - o.observers = append(o.observers, contribObserver) -} - -func (o *compositeObserver) OnStartSpan(sp opentracing.Span, operationName string, options opentracing.StartSpanOptions) ContribSpanObserver { - var spanObservers []ContribSpanObserver - for _, obs := range o.observers { - spanObs, ok := obs.OnStartSpan(sp, operationName, options) - if ok { - if spanObservers == nil { - spanObservers = make([]ContribSpanObserver, 0, len(o.observers)) - } - spanObservers = append(spanObservers, spanObs) - } - } - if len(spanObservers) == 0 { - return noopSpanObserver - } - return &compositeSpanObserver{observers: spanObservers} -} - -func (o *compositeSpanObserver) OnSetOperationName(operationName string) { - for _, obs := range o.observers { - obs.OnSetOperationName(operationName) - } -} - -func (o *compositeSpanObserver) OnSetTag(key string, value interface{}) { - for _, obs := range o.observers { - obs.OnSetTag(key, value) - } -} - -func (o *compositeSpanObserver) OnFinish(options opentracing.FinishOptions) { - for _, obs := range o.observers { - obs.OnFinish(options) - } -} diff --git a/vendor/github.com/uber/jaeger-client-go/process.go b/vendor/github.com/uber/jaeger-client-go/process.go deleted file mode 100644 index 30cbf99624c9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/process.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) 2018 The Jaeger 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 jaeger - -// Process holds process specific metadata that's relevant to this client. -type Process struct { - Service string - UUID string - Tags []Tag -} - -// ProcessSetter sets a process. This can be used by any class that requires -// the process to be set as part of initialization. -// See internal/throttler/remote/throttler.go for an example. -type ProcessSetter interface { - SetProcess(process Process) -} diff --git a/vendor/github.com/uber/jaeger-client-go/propagation.go b/vendor/github.com/uber/jaeger-client-go/propagation.go deleted file mode 100644 index abca67a3c9b9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/propagation.go +++ /dev/null @@ -1,300 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "bytes" - "encoding/binary" - "fmt" - "io" - "log" - "net/url" - "strings" - "sync" - - opentracing "github.com/opentracing/opentracing-go" -) - -// Injector is responsible for injecting SpanContext instances in a manner suitable -// for propagation via a format-specific "carrier" object. Typically the -// injection will take place across an RPC boundary, but message queues and -// other IPC mechanisms are also reasonable places to use an Injector. -type Injector interface { - // Inject takes `SpanContext` and injects it into `carrier`. The actual type - // of `carrier` depends on the `format` passed to `Tracer.Inject()`. - // - // Implementations may return opentracing.ErrInvalidCarrier or any other - // implementation-specific error if injection fails. - Inject(ctx SpanContext, carrier interface{}) error -} - -// Extractor is responsible for extracting SpanContext instances from a -// format-specific "carrier" object. Typically the extraction will take place -// on the server side of an RPC boundary, but message queues and other IPC -// mechanisms are also reasonable places to use an Extractor. -type Extractor interface { - // Extract decodes a SpanContext instance from the given `carrier`, - // or (nil, opentracing.ErrSpanContextNotFound) if no context could - // be found in the `carrier`. - Extract(carrier interface{}) (SpanContext, error) -} - -type textMapPropagator struct { - headerKeys *HeadersConfig - metrics Metrics - encodeValue func(string) string - decodeValue func(string) string -} - -func newTextMapPropagator(headerKeys *HeadersConfig, metrics Metrics) *textMapPropagator { - return &textMapPropagator{ - headerKeys: headerKeys, - metrics: metrics, - encodeValue: func(val string) string { - return val - }, - decodeValue: func(val string) string { - return val - }, - } -} - -func newHTTPHeaderPropagator(headerKeys *HeadersConfig, metrics Metrics) *textMapPropagator { - return &textMapPropagator{ - headerKeys: headerKeys, - metrics: metrics, - encodeValue: func(val string) string { - return url.QueryEscape(val) - }, - decodeValue: func(val string) string { - // ignore decoding errors, cannot do anything about them - if v, err := url.QueryUnescape(val); err == nil { - return v - } - return val - }, - } -} - -type binaryPropagator struct { - tracer *Tracer - buffers sync.Pool -} - -func newBinaryPropagator(tracer *Tracer) *binaryPropagator { - return &binaryPropagator{ - tracer: tracer, - buffers: sync.Pool{New: func() interface{} { return &bytes.Buffer{} }}, - } -} - -func (p *textMapPropagator) Inject( - sc SpanContext, - abstractCarrier interface{}, -) error { - textMapWriter, ok := abstractCarrier.(opentracing.TextMapWriter) - if !ok { - return opentracing.ErrInvalidCarrier - } - - // Do not encode the string with trace context to avoid accidental double-encoding - // if people are using opentracing < 0.10.0. Our colon-separated representation - // of the trace context is already safe for HTTP headers. - textMapWriter.Set(p.headerKeys.TraceContextHeaderName, sc.String()) - for k, v := range sc.baggage { - safeKey := p.addBaggageKeyPrefix(k) - safeVal := p.encodeValue(v) - textMapWriter.Set(safeKey, safeVal) - } - return nil -} - -func (p *textMapPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) { - textMapReader, ok := abstractCarrier.(opentracing.TextMapReader) - if !ok { - return emptyContext, opentracing.ErrInvalidCarrier - } - var ctx SpanContext - var baggage map[string]string - err := textMapReader.ForeachKey(func(rawKey, value string) error { - key := strings.ToLower(rawKey) // TODO not necessary for plain TextMap - if key == p.headerKeys.TraceContextHeaderName { - var err error - safeVal := p.decodeValue(value) - if ctx, err = ContextFromString(safeVal); err != nil { - return err - } - } else if key == p.headerKeys.JaegerDebugHeader { - ctx.debugID = p.decodeValue(value) - } else if key == p.headerKeys.JaegerBaggageHeader { - if baggage == nil { - baggage = make(map[string]string) - } - for k, v := range p.parseCommaSeparatedMap(value) { - baggage[k] = v - } - } else if strings.HasPrefix(key, p.headerKeys.TraceBaggageHeaderPrefix) { - if baggage == nil { - baggage = make(map[string]string) - } - safeKey := p.removeBaggageKeyPrefix(key) - safeVal := p.decodeValue(value) - baggage[safeKey] = safeVal - } - return nil - }) - if err != nil { - p.metrics.DecodingErrors.Inc(1) - return emptyContext, err - } - if !ctx.traceID.IsValid() && ctx.debugID == "" && len(baggage) == 0 { - return emptyContext, opentracing.ErrSpanContextNotFound - } - ctx.baggage = baggage - return ctx, nil -} - -func (p *binaryPropagator) Inject( - sc SpanContext, - abstractCarrier interface{}, -) error { - carrier, ok := abstractCarrier.(io.Writer) - if !ok { - return opentracing.ErrInvalidCarrier - } - - // Handle the tracer context - if err := binary.Write(carrier, binary.BigEndian, sc.traceID); err != nil { - return err - } - if err := binary.Write(carrier, binary.BigEndian, sc.spanID); err != nil { - return err - } - if err := binary.Write(carrier, binary.BigEndian, sc.parentID); err != nil { - return err - } - if err := binary.Write(carrier, binary.BigEndian, sc.flags); err != nil { - return err - } - - // Handle the baggage items - if err := binary.Write(carrier, binary.BigEndian, int32(len(sc.baggage))); err != nil { - return err - } - for k, v := range sc.baggage { - if err := binary.Write(carrier, binary.BigEndian, int32(len(k))); err != nil { - return err - } - io.WriteString(carrier, k) - if err := binary.Write(carrier, binary.BigEndian, int32(len(v))); err != nil { - return err - } - io.WriteString(carrier, v) - } - - return nil -} - -func (p *binaryPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) { - carrier, ok := abstractCarrier.(io.Reader) - if !ok { - return emptyContext, opentracing.ErrInvalidCarrier - } - var ctx SpanContext - - if err := binary.Read(carrier, binary.BigEndian, &ctx.traceID); err != nil { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - if err := binary.Read(carrier, binary.BigEndian, &ctx.spanID); err != nil { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - if err := binary.Read(carrier, binary.BigEndian, &ctx.parentID); err != nil { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - if err := binary.Read(carrier, binary.BigEndian, &ctx.flags); err != nil { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - - // Handle the baggage items - var numBaggage int32 - if err := binary.Read(carrier, binary.BigEndian, &numBaggage); err != nil { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - if iNumBaggage := int(numBaggage); iNumBaggage > 0 { - ctx.baggage = make(map[string]string, iNumBaggage) - buf := p.buffers.Get().(*bytes.Buffer) - defer p.buffers.Put(buf) - - var keyLen, valLen int32 - for i := 0; i < iNumBaggage; i++ { - if err := binary.Read(carrier, binary.BigEndian, &keyLen); err != nil { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - buf.Reset() - buf.Grow(int(keyLen)) - if n, err := io.CopyN(buf, carrier, int64(keyLen)); err != nil || int32(n) != keyLen { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - key := buf.String() - - if err := binary.Read(carrier, binary.BigEndian, &valLen); err != nil { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - buf.Reset() - buf.Grow(int(valLen)) - if n, err := io.CopyN(buf, carrier, int64(valLen)); err != nil || int32(n) != valLen { - return emptyContext, opentracing.ErrSpanContextCorrupted - } - ctx.baggage[key] = buf.String() - } - } - - return ctx, nil -} - -// Converts a comma separated key value pair list into a map -// e.g. key1=value1, key2=value2, key3 = value3 -// is converted to map[string]string { "key1" : "value1", -// "key2" : "value2", -// "key3" : "value3" } -func (p *textMapPropagator) parseCommaSeparatedMap(value string) map[string]string { - baggage := make(map[string]string) - value, err := url.QueryUnescape(value) - if err != nil { - log.Printf("Unable to unescape %s, %v", value, err) - return baggage - } - for _, kvpair := range strings.Split(value, ",") { - kv := strings.Split(strings.TrimSpace(kvpair), "=") - if len(kv) == 2 { - baggage[kv[0]] = kv[1] - } else { - log.Printf("Malformed value passed in for %s", p.headerKeys.JaegerBaggageHeader) - } - } - return baggage -} - -// Converts a baggage item key into an http header format, -// by prepending TraceBaggageHeaderPrefix and encoding the key string -func (p *textMapPropagator) addBaggageKeyPrefix(key string) string { - // TODO encodeBaggageKeyAsHeader add caching and escaping - return fmt.Sprintf("%v%v", p.headerKeys.TraceBaggageHeaderPrefix, key) -} - -func (p *textMapPropagator) removeBaggageKeyPrefix(key string) string { - // TODO decodeBaggageHeaderKey add caching and escaping - return key[len(p.headerKeys.TraceBaggageHeaderPrefix):] -} diff --git a/vendor/github.com/uber/jaeger-client-go/reference.go b/vendor/github.com/uber/jaeger-client-go/reference.go deleted file mode 100644 index 5646e78bb2a8..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/reference.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import "github.com/opentracing/opentracing-go" - -// Reference represents a causal reference to other Spans (via their SpanContext). -type Reference struct { - Type opentracing.SpanReferenceType - Context SpanContext -} diff --git a/vendor/github.com/uber/jaeger-client-go/reporter.go b/vendor/github.com/uber/jaeger-client-go/reporter.go deleted file mode 100644 index fe6288c4b9e5..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/reporter.go +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "fmt" - "sync" - "sync/atomic" - "time" - - "github.com/opentracing/opentracing-go" - - "github.com/uber/jaeger-client-go/log" -) - -// Reporter is called by the tracer when a span is completed to report the span to the tracing collector. -type Reporter interface { - // Report submits a new span to collectors, possibly asynchronously and/or with buffering. - Report(span *Span) - - // Close does a clean shutdown of the reporter, flushing any traces that may be buffered in memory. - Close() -} - -// ------------------------------ - -type nullReporter struct{} - -// NewNullReporter creates a no-op reporter that ignores all reported spans. -func NewNullReporter() Reporter { - return &nullReporter{} -} - -// Report implements Report() method of Reporter by doing nothing. -func (r *nullReporter) Report(span *Span) { - // no-op -} - -// Close implements Close() method of Reporter by doing nothing. -func (r *nullReporter) Close() { - // no-op -} - -// ------------------------------ - -type loggingReporter struct { - logger Logger -} - -// NewLoggingReporter creates a reporter that logs all reported spans to provided logger. -func NewLoggingReporter(logger Logger) Reporter { - return &loggingReporter{logger} -} - -// Report implements Report() method of Reporter by logging the span to the logger. -func (r *loggingReporter) Report(span *Span) { - r.logger.Infof("Reporting span %+v", span) -} - -// Close implements Close() method of Reporter by doing nothing. -func (r *loggingReporter) Close() { - // no-op -} - -// ------------------------------ - -// InMemoryReporter is used for testing, and simply collects spans in memory. -type InMemoryReporter struct { - spans []opentracing.Span - lock sync.Mutex -} - -// NewInMemoryReporter creates a reporter that stores spans in memory. -// NOTE: the Tracer should be created with options.PoolSpans = false. -func NewInMemoryReporter() *InMemoryReporter { - return &InMemoryReporter{ - spans: make([]opentracing.Span, 0, 10), - } -} - -// Report implements Report() method of Reporter by storing the span in the buffer. -func (r *InMemoryReporter) Report(span *Span) { - r.lock.Lock() - r.spans = append(r.spans, span) - r.lock.Unlock() -} - -// Close implements Close() method of Reporter by doing nothing. -func (r *InMemoryReporter) Close() { - // no-op -} - -// SpansSubmitted returns the number of spans accumulated in the buffer. -func (r *InMemoryReporter) SpansSubmitted() int { - r.lock.Lock() - defer r.lock.Unlock() - return len(r.spans) -} - -// GetSpans returns accumulated spans as a copy of the buffer. -func (r *InMemoryReporter) GetSpans() []opentracing.Span { - r.lock.Lock() - defer r.lock.Unlock() - copied := make([]opentracing.Span, len(r.spans)) - copy(copied, r.spans) - return copied -} - -// Reset clears all accumulated spans. -func (r *InMemoryReporter) Reset() { - r.lock.Lock() - defer r.lock.Unlock() - r.spans = nil -} - -// ------------------------------ - -type compositeReporter struct { - reporters []Reporter -} - -// NewCompositeReporter creates a reporter that ignores all reported spans. -func NewCompositeReporter(reporters ...Reporter) Reporter { - return &compositeReporter{reporters: reporters} -} - -// Report implements Report() method of Reporter by delegating to each underlying reporter. -func (r *compositeReporter) Report(span *Span) { - for _, reporter := range r.reporters { - reporter.Report(span) - } -} - -// Close implements Close() method of Reporter by closing each underlying reporter. -func (r *compositeReporter) Close() { - for _, reporter := range r.reporters { - reporter.Close() - } -} - -// ------------- REMOTE REPORTER ----------------- - -type reporterQueueItemType int - -const ( - defaultQueueSize = 100 - defaultBufferFlushInterval = 1 * time.Second - - reporterQueueItemSpan reporterQueueItemType = iota - reporterQueueItemClose -) - -type reporterQueueItem struct { - itemType reporterQueueItemType - span *Span - close *sync.WaitGroup -} - -type remoteReporter struct { - // These fields must be first in the struct because `sync/atomic` expects 64-bit alignment. - // Cf. https://github.com/uber/jaeger-client-go/issues/155, https://goo.gl/zW7dgq - queueLength int64 - closed int64 // 0 - not closed, 1 - closed - - reporterOptions - - sender Transport - queue chan reporterQueueItem -} - -// NewRemoteReporter creates a new reporter that sends spans out of process by means of Sender. -// Calls to Report(Span) return immediately (side effect: if internal buffer is full the span is dropped). -// Periodically the transport buffer is flushed even if it hasn't reached max packet size. -// Calls to Close() block until all spans reported prior to the call to Close are flushed. -func NewRemoteReporter(sender Transport, opts ...ReporterOption) Reporter { - options := reporterOptions{} - for _, option := range opts { - option(&options) - } - if options.bufferFlushInterval <= 0 { - options.bufferFlushInterval = defaultBufferFlushInterval - } - if options.logger == nil { - options.logger = log.NullLogger - } - if options.metrics == nil { - options.metrics = NewNullMetrics() - } - if options.queueSize <= 0 { - options.queueSize = defaultQueueSize - } - reporter := &remoteReporter{ - reporterOptions: options, - sender: sender, - queue: make(chan reporterQueueItem, options.queueSize), - } - go reporter.processQueue() - return reporter -} - -// Report implements Report() method of Reporter. -// It passes the span to a background go-routine for submission to Jaeger backend. -// If the internal queue is full, the span is dropped and metrics.ReporterDropped counter is incremented. -// If Report() is called after the reporter has been Close()-ed, the additional spans will not be -// sent to the backend, but the metrics.ReporterDropped counter may not reflect them correctly, -// because some of them may still be successfully added to the queue. -func (r *remoteReporter) Report(span *Span) { - select { - case r.queue <- reporterQueueItem{itemType: reporterQueueItemSpan, span: span}: - atomic.AddInt64(&r.queueLength, 1) - default: - r.metrics.ReporterDropped.Inc(1) - } -} - -// Close implements Close() method of Reporter by waiting for the queue to be drained. -func (r *remoteReporter) Close() { - if swapped := atomic.CompareAndSwapInt64(&r.closed, 0, 1); !swapped { - r.logger.Error("Repeated attempt to close the reporter is ignored") - return - } - r.sendCloseEvent() - r.sender.Close() -} - -func (r *remoteReporter) sendCloseEvent() { - wg := &sync.WaitGroup{} - wg.Add(1) - item := reporterQueueItem{itemType: reporterQueueItemClose, close: wg} - - r.queue <- item // if the queue is full we will block until there is space - atomic.AddInt64(&r.queueLength, 1) - wg.Wait() -} - -// processQueue reads spans from the queue, converts them to Thrift, and stores them in an internal buffer. -// When the buffer length reaches batchSize, it is flushed by submitting the accumulated spans to Jaeger. -// Buffer also gets flushed automatically every batchFlushInterval seconds, just in case the tracer stopped -// reporting new spans. -func (r *remoteReporter) processQueue() { - // flush causes the Sender to flush its accumulated spans and clear the buffer - flush := func() { - if flushed, err := r.sender.Flush(); err != nil { - r.metrics.ReporterFailure.Inc(int64(flushed)) - r.logger.Error(fmt.Sprintf("error when flushing the buffer: %s", err.Error())) - } else if flushed > 0 { - r.metrics.ReporterSuccess.Inc(int64(flushed)) - } - } - - timer := time.NewTicker(r.bufferFlushInterval) - for { - select { - case <-timer.C: - flush() - case item := <-r.queue: - atomic.AddInt64(&r.queueLength, -1) - switch item.itemType { - case reporterQueueItemSpan: - span := item.span - if flushed, err := r.sender.Append(span); err != nil { - r.metrics.ReporterFailure.Inc(int64(flushed)) - r.logger.Error(fmt.Sprintf("error reporting span %q: %s", span.OperationName(), err.Error())) - } else if flushed > 0 { - r.metrics.ReporterSuccess.Inc(int64(flushed)) - // to reduce the number of gauge stats, we only emit queue length on flush - r.metrics.ReporterQueueLength.Update(atomic.LoadInt64(&r.queueLength)) - } - case reporterQueueItemClose: - timer.Stop() - flush() - item.close.Done() - return - } - } - } -} diff --git a/vendor/github.com/uber/jaeger-client-go/reporter_options.go b/vendor/github.com/uber/jaeger-client-go/reporter_options.go deleted file mode 100644 index 65012d7015dc..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/reporter_options.go +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "time" -) - -// ReporterOption is a function that sets some option on the reporter. -type ReporterOption func(c *reporterOptions) - -// ReporterOptions is a factory for all available ReporterOption's -var ReporterOptions reporterOptions - -// reporterOptions control behavior of the reporter. -type reporterOptions struct { - // queueSize is the size of internal queue where reported spans are stored before they are processed in the background - queueSize int - // bufferFlushInterval is how often the buffer is force-flushed, even if it's not full - bufferFlushInterval time.Duration - // logger is used to log errors of span submissions - logger Logger - // metrics is used to record runtime stats - metrics *Metrics -} - -// QueueSize creates a ReporterOption that sets the size of the internal queue where -// spans are stored before they are processed. -func (reporterOptions) QueueSize(queueSize int) ReporterOption { - return func(r *reporterOptions) { - r.queueSize = queueSize - } -} - -// Metrics creates a ReporterOption that initializes Metrics in the reporter, -// which is used to record runtime statistics. -func (reporterOptions) Metrics(metrics *Metrics) ReporterOption { - return func(r *reporterOptions) { - r.metrics = metrics - } -} - -// BufferFlushInterval creates a ReporterOption that sets how often the queue -// is force-flushed. -func (reporterOptions) BufferFlushInterval(bufferFlushInterval time.Duration) ReporterOption { - return func(r *reporterOptions) { - r.bufferFlushInterval = bufferFlushInterval - } -} - -// Logger creates a ReporterOption that initializes the logger used to log -// errors of span submissions. -func (reporterOptions) Logger(logger Logger) ReporterOption { - return func(r *reporterOptions) { - r.logger = logger - } -} diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/README.md b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/README.md deleted file mode 100644 index 879948e9c9cd..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/README.md +++ /dev/null @@ -1,5 +0,0 @@ -An Observer that can be used to emit RPC metrics -================================================ - -It can be attached to the tracer during tracer construction. -See `ExampleObserver` function in [observer_test.go](./observer_test.go). diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/doc.go b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/doc.go deleted file mode 100644 index 51aa11b350e5..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/doc.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 rpcmetrics implements an Observer that can be used to emit RPC metrics. -package rpcmetrics diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/endpoints.go b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/endpoints.go deleted file mode 100644 index 30555243d0c0..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/endpoints.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 rpcmetrics - -import "sync" - -// normalizedEndpoints is a cache for endpointName -> safeName mappings. -type normalizedEndpoints struct { - names map[string]string - maxSize int - defaultName string - normalizer NameNormalizer - mux sync.RWMutex -} - -func newNormalizedEndpoints(maxSize int, normalizer NameNormalizer) *normalizedEndpoints { - return &normalizedEndpoints{ - maxSize: maxSize, - normalizer: normalizer, - names: make(map[string]string, maxSize), - } -} - -// normalize looks up the name in the cache, if not found it uses normalizer -// to convert the name to a safe name. If called with more than maxSize unique -// names it returns "" for all other names beyond those already cached. -func (n *normalizedEndpoints) normalize(name string) string { - n.mux.RLock() - norm, ok := n.names[name] - l := len(n.names) - n.mux.RUnlock() - if ok { - return norm - } - if l >= n.maxSize { - return "" - } - return n.normalizeWithLock(name) -} - -func (n *normalizedEndpoints) normalizeWithLock(name string) string { - norm := n.normalizer.Normalize(name) - n.mux.Lock() - defer n.mux.Unlock() - // cache may have grown while we were not holding the lock - if len(n.names) >= n.maxSize { - return "" - } - n.names[name] = norm - return norm -} diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/metrics.go b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/metrics.go deleted file mode 100644 index ab8d74c29185..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/metrics.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 rpcmetrics - -import ( - "sync" - - "github.com/uber/jaeger-lib/metrics" -) - -const ( - otherEndpointsPlaceholder = "other" - endpointNameMetricTag = "endpoint" -) - -// Metrics is a collection of metrics for an endpoint describing -// throughput, success, errors, and performance. -type Metrics struct { - // RequestCountSuccess is a counter of the total number of successes. - RequestCountSuccess metrics.Counter `metric:"requests" tags:"error=false"` - - // RequestCountFailures is a counter of the number of times any failure has been observed. - RequestCountFailures metrics.Counter `metric:"requests" tags:"error=true"` - - // RequestLatencySuccess is a latency histogram of succesful requests. - RequestLatencySuccess metrics.Timer `metric:"request_latency" tags:"error=false"` - - // RequestLatencyFailures is a latency histogram of failed requests. - RequestLatencyFailures metrics.Timer `metric:"request_latency" tags:"error=true"` - - // HTTPStatusCode2xx is a counter of the total number of requests with HTTP status code 200-299 - HTTPStatusCode2xx metrics.Counter `metric:"http_requests" tags:"status_code=2xx"` - - // HTTPStatusCode3xx is a counter of the total number of requests with HTTP status code 300-399 - HTTPStatusCode3xx metrics.Counter `metric:"http_requests" tags:"status_code=3xx"` - - // HTTPStatusCode4xx is a counter of the total number of requests with HTTP status code 400-499 - HTTPStatusCode4xx metrics.Counter `metric:"http_requests" tags:"status_code=4xx"` - - // HTTPStatusCode5xx is a counter of the total number of requests with HTTP status code 500-599 - HTTPStatusCode5xx metrics.Counter `metric:"http_requests" tags:"status_code=5xx"` -} - -func (m *Metrics) recordHTTPStatusCode(statusCode uint16) { - if statusCode >= 200 && statusCode < 300 { - m.HTTPStatusCode2xx.Inc(1) - } else if statusCode >= 300 && statusCode < 400 { - m.HTTPStatusCode3xx.Inc(1) - } else if statusCode >= 400 && statusCode < 500 { - m.HTTPStatusCode4xx.Inc(1) - } else if statusCode >= 500 && statusCode < 600 { - m.HTTPStatusCode5xx.Inc(1) - } -} - -// MetricsByEndpoint is a registry/cache of metrics for each unique endpoint name. -// Only maxNumberOfEndpoints Metrics are stored, all other endpoint names are mapped -// to a generic endpoint name "other". -type MetricsByEndpoint struct { - metricsFactory metrics.Factory - endpoints *normalizedEndpoints - metricsByEndpoint map[string]*Metrics - mux sync.RWMutex -} - -func newMetricsByEndpoint( - metricsFactory metrics.Factory, - normalizer NameNormalizer, - maxNumberOfEndpoints int, -) *MetricsByEndpoint { - return &MetricsByEndpoint{ - metricsFactory: metricsFactory, - endpoints: newNormalizedEndpoints(maxNumberOfEndpoints, normalizer), - metricsByEndpoint: make(map[string]*Metrics, maxNumberOfEndpoints+1), // +1 for "other" - } -} - -func (m *MetricsByEndpoint) get(endpoint string) *Metrics { - safeName := m.endpoints.normalize(endpoint) - if safeName == "" { - safeName = otherEndpointsPlaceholder - } - m.mux.RLock() - met := m.metricsByEndpoint[safeName] - m.mux.RUnlock() - if met != nil { - return met - } - - return m.getWithWriteLock(safeName) -} - -// split to make easier to test -func (m *MetricsByEndpoint) getWithWriteLock(safeName string) *Metrics { - m.mux.Lock() - defer m.mux.Unlock() - - // it is possible that the name has been already registered after we released - // the read lock and before we grabbed the write lock, so check for that. - if met, ok := m.metricsByEndpoint[safeName]; ok { - return met - } - - // it would be nice to create the struct before locking, since Init() is somewhat - // expensive, however some metrics backends (e.g. expvar) may not like duplicate metrics. - met := &Metrics{} - tags := map[string]string{endpointNameMetricTag: safeName} - metrics.Init(met, m.metricsFactory, tags) - - m.metricsByEndpoint[safeName] = met - return met -} diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/normalizer.go b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/normalizer.go deleted file mode 100644 index 148d84b3a1a6..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/normalizer.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 rpcmetrics - -// NameNormalizer is used to convert the endpoint names to strings -// that can be safely used as tags in the metrics. -type NameNormalizer interface { - Normalize(name string) string -} - -// DefaultNameNormalizer converts endpoint names so that they contain only characters -// from the safe charset [a-zA-Z0-9-./_]. All other characters are replaced with '-'. -var DefaultNameNormalizer = &SimpleNameNormalizer{ - SafeSets: []SafeCharacterSet{ - &Range{From: 'a', To: 'z'}, - &Range{From: 'A', To: 'Z'}, - &Range{From: '0', To: '9'}, - &Char{'-'}, - &Char{'_'}, - &Char{'/'}, - &Char{'.'}, - }, - Replacement: '-', -} - -// SimpleNameNormalizer uses a set of safe character sets. -type SimpleNameNormalizer struct { - SafeSets []SafeCharacterSet - Replacement byte -} - -// SafeCharacterSet determines if the given character is "safe" -type SafeCharacterSet interface { - IsSafe(c byte) bool -} - -// Range implements SafeCharacterSet -type Range struct { - From, To byte -} - -// IsSafe implements SafeCharacterSet -func (r *Range) IsSafe(c byte) bool { - return c >= r.From && c <= r.To -} - -// Char implements SafeCharacterSet -type Char struct { - Val byte -} - -// IsSafe implements SafeCharacterSet -func (ch *Char) IsSafe(c byte) bool { - return c == ch.Val -} - -// Normalize checks each character in the string against SafeSets, -// and if it's not safe substitutes it with Replacement. -func (n *SimpleNameNormalizer) Normalize(name string) string { - var retMe []byte - nameBytes := []byte(name) - for i, b := range nameBytes { - if n.safeByte(b) { - if retMe != nil { - retMe[i] = b - } - } else { - if retMe == nil { - retMe = make([]byte, len(nameBytes)) - copy(retMe[0:i], nameBytes[0:i]) - } - retMe[i] = n.Replacement - } - } - if retMe == nil { - return name - } - return string(retMe) -} - -// safeByte checks if b against all safe charsets. -func (n *SimpleNameNormalizer) safeByte(b byte) bool { - for i := range n.SafeSets { - if n.SafeSets[i].IsSafe(b) { - return true - } - } - return false -} diff --git a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/observer.go b/vendor/github.com/uber/jaeger-client-go/rpcmetrics/observer.go deleted file mode 100644 index eca5ff6f3b98..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/rpcmetrics/observer.go +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 rpcmetrics - -import ( - "strconv" - "sync" - "time" - - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" - "github.com/uber/jaeger-lib/metrics" - - jaeger "github.com/uber/jaeger-client-go" -) - -const defaultMaxNumberOfEndpoints = 200 - -// Observer is an observer that can emit RPC metrics. -type Observer struct { - metricsByEndpoint *MetricsByEndpoint -} - -// NewObserver creates a new observer that can emit RPC metrics. -func NewObserver(metricsFactory metrics.Factory, normalizer NameNormalizer) *Observer { - return &Observer{ - metricsByEndpoint: newMetricsByEndpoint( - metricsFactory, - normalizer, - defaultMaxNumberOfEndpoints, - ), - } -} - -// OnStartSpan creates a new Observer for the span. -func (o *Observer) OnStartSpan( - operationName string, - options opentracing.StartSpanOptions, -) jaeger.SpanObserver { - return NewSpanObserver(o.metricsByEndpoint, operationName, options) -} - -// SpanKind identifies the span as inboud, outbound, or internal -type SpanKind int - -const ( - // Local span kind - Local SpanKind = iota - // Inbound span kind - Inbound - // Outbound span kind - Outbound -) - -// SpanObserver collects RPC metrics -type SpanObserver struct { - metricsByEndpoint *MetricsByEndpoint - operationName string - startTime time.Time - mux sync.Mutex - kind SpanKind - httpStatusCode uint16 - err bool -} - -// NewSpanObserver creates a new SpanObserver that can emit RPC metrics. -func NewSpanObserver( - metricsByEndpoint *MetricsByEndpoint, - operationName string, - options opentracing.StartSpanOptions, -) *SpanObserver { - so := &SpanObserver{ - metricsByEndpoint: metricsByEndpoint, - operationName: operationName, - startTime: options.StartTime, - } - for k, v := range options.Tags { - so.handleTagInLock(k, v) - } - return so -} - -// handleTags watches for special tags -// - SpanKind -// - HttpStatusCode -// - Error -func (so *SpanObserver) handleTagInLock(key string, value interface{}) { - if key == string(ext.SpanKind) { - if v, ok := value.(ext.SpanKindEnum); ok { - value = string(v) - } - if v, ok := value.(string); ok { - if v == string(ext.SpanKindRPCClientEnum) { - so.kind = Outbound - } else if v == string(ext.SpanKindRPCServerEnum) { - so.kind = Inbound - } - } - return - } - if key == string(ext.HTTPStatusCode) { - if v, ok := value.(uint16); ok { - so.httpStatusCode = v - } else if v, ok := value.(int); ok { - so.httpStatusCode = uint16(v) - } else if v, ok := value.(string); ok { - if vv, err := strconv.Atoi(v); err == nil { - so.httpStatusCode = uint16(vv) - } - } - return - } - if key == string(ext.Error) { - if v, ok := value.(bool); ok { - so.err = v - } else if v, ok := value.(string); ok { - if vv, err := strconv.ParseBool(v); err == nil { - so.err = vv - } - } - return - } -} - -// OnFinish emits the RPC metrics. It only has an effect when operation name -// is not blank, and the span kind is an RPC server. -func (so *SpanObserver) OnFinish(options opentracing.FinishOptions) { - so.mux.Lock() - defer so.mux.Unlock() - - if so.operationName == "" || so.kind != Inbound { - return - } - - mets := so.metricsByEndpoint.get(so.operationName) - latency := options.FinishTime.Sub(so.startTime) - if so.err { - mets.RequestCountFailures.Inc(1) - mets.RequestLatencyFailures.Record(latency) - } else { - mets.RequestCountSuccess.Inc(1) - mets.RequestLatencySuccess.Record(latency) - } - mets.recordHTTPStatusCode(so.httpStatusCode) -} - -// OnSetOperationName records new operation name. -func (so *SpanObserver) OnSetOperationName(operationName string) { - so.mux.Lock() - so.operationName = operationName - so.mux.Unlock() -} - -// OnSetTag implements SpanObserver -func (so *SpanObserver) OnSetTag(key string, value interface{}) { - so.mux.Lock() - so.handleTagInLock(key, value) - so.mux.Unlock() -} diff --git a/vendor/github.com/uber/jaeger-client-go/sampler.go b/vendor/github.com/uber/jaeger-client-go/sampler.go deleted file mode 100644 index e6a32b3837a6..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/sampler.go +++ /dev/null @@ -1,556 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "fmt" - "math" - "net/url" - "sync" - "sync/atomic" - "time" - - "github.com/uber/jaeger-client-go/log" - "github.com/uber/jaeger-client-go/thrift-gen/sampling" - "github.com/uber/jaeger-client-go/utils" -) - -const ( - defaultSamplingServerURL = "http://localhost:5778/sampling" - defaultSamplingRefreshInterval = time.Minute - defaultMaxOperations = 2000 -) - -// Sampler decides whether a new trace should be sampled or not. -type Sampler interface { - // IsSampled decides whether a trace with given `id` and `operation` - // should be sampled. This function will also return the tags that - // can be used to identify the type of sampling that was applied to - // the root span. Most simple samplers would return two tags, - // sampler.type and sampler.param, similar to those used in the Configuration - IsSampled(id TraceID, operation string) (sampled bool, tags []Tag) - - // Close does a clean shutdown of the sampler, stopping any background - // go-routines it may have started. - Close() - - // Equal checks if the `other` sampler is functionally equivalent - // to this sampler. - // TODO remove this function. This function is used to determine if 2 samplers are equivalent - // which does not bode well with the adaptive sampler which has to create all the composite samplers - // for the comparison to occur. This is expensive to do if only one sampler has changed. - Equal(other Sampler) bool -} - -// ----------------------- - -// ConstSampler is a sampler that always makes the same decision. -type ConstSampler struct { - Decision bool - tags []Tag -} - -// NewConstSampler creates a ConstSampler. -func NewConstSampler(sample bool) Sampler { - tags := []Tag{ - {key: SamplerTypeTagKey, value: SamplerTypeConst}, - {key: SamplerParamTagKey, value: sample}, - } - return &ConstSampler{Decision: sample, tags: tags} -} - -// IsSampled implements IsSampled() of Sampler. -func (s *ConstSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { - return s.Decision, s.tags -} - -// Close implements Close() of Sampler. -func (s *ConstSampler) Close() { - // nothing to do -} - -// Equal implements Equal() of Sampler. -func (s *ConstSampler) Equal(other Sampler) bool { - if o, ok := other.(*ConstSampler); ok { - return s.Decision == o.Decision - } - return false -} - -// ----------------------- - -// ProbabilisticSampler is a sampler that randomly samples a certain percentage -// of traces. -type ProbabilisticSampler struct { - samplingRate float64 - samplingBoundary uint64 - tags []Tag -} - -const maxRandomNumber = ^(uint64(1) << 63) // i.e. 0x7fffffffffffffff - -// NewProbabilisticSampler creates a sampler that randomly samples a certain percentage of traces specified by the -// samplingRate, in the range between 0.0 and 1.0. -// -// It relies on the fact that new trace IDs are 63bit random numbers themselves, thus making the sampling decision -// without generating a new random number, but simply calculating if traceID < (samplingRate * 2^63). -// TODO remove the error from this function for next major release -func NewProbabilisticSampler(samplingRate float64) (*ProbabilisticSampler, error) { - if samplingRate < 0.0 || samplingRate > 1.0 { - return nil, fmt.Errorf("Sampling Rate must be between 0.0 and 1.0, received %f", samplingRate) - } - return newProbabilisticSampler(samplingRate), nil -} - -func newProbabilisticSampler(samplingRate float64) *ProbabilisticSampler { - samplingRate = math.Max(0.0, math.Min(samplingRate, 1.0)) - tags := []Tag{ - {key: SamplerTypeTagKey, value: SamplerTypeProbabilistic}, - {key: SamplerParamTagKey, value: samplingRate}, - } - return &ProbabilisticSampler{ - samplingRate: samplingRate, - samplingBoundary: uint64(float64(maxRandomNumber) * samplingRate), - tags: tags, - } -} - -// SamplingRate returns the sampling probability this sampled was constructed with. -func (s *ProbabilisticSampler) SamplingRate() float64 { - return s.samplingRate -} - -// IsSampled implements IsSampled() of Sampler. -func (s *ProbabilisticSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { - return s.samplingBoundary >= id.Low, s.tags -} - -// Close implements Close() of Sampler. -func (s *ProbabilisticSampler) Close() { - // nothing to do -} - -// Equal implements Equal() of Sampler. -func (s *ProbabilisticSampler) Equal(other Sampler) bool { - if o, ok := other.(*ProbabilisticSampler); ok { - return s.samplingBoundary == o.samplingBoundary - } - return false -} - -// ----------------------- - -type rateLimitingSampler struct { - maxTracesPerSecond float64 - rateLimiter utils.RateLimiter - tags []Tag -} - -// NewRateLimitingSampler creates a sampler that samples at most maxTracesPerSecond. The distribution of sampled -// traces follows burstiness of the service, i.e. a service with uniformly distributed requests will have those -// requests sampled uniformly as well, but if requests are bursty, especially sub-second, then a number of -// sequential requests can be sampled each second. -func NewRateLimitingSampler(maxTracesPerSecond float64) Sampler { - tags := []Tag{ - {key: SamplerTypeTagKey, value: SamplerTypeRateLimiting}, - {key: SamplerParamTagKey, value: maxTracesPerSecond}, - } - return &rateLimitingSampler{ - maxTracesPerSecond: maxTracesPerSecond, - rateLimiter: utils.NewRateLimiter(maxTracesPerSecond, math.Max(maxTracesPerSecond, 1.0)), - tags: tags, - } -} - -// IsSampled implements IsSampled() of Sampler. -func (s *rateLimitingSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { - return s.rateLimiter.CheckCredit(1.0), s.tags -} - -func (s *rateLimitingSampler) Close() { - // nothing to do -} - -func (s *rateLimitingSampler) Equal(other Sampler) bool { - if o, ok := other.(*rateLimitingSampler); ok { - return s.maxTracesPerSecond == o.maxTracesPerSecond - } - return false -} - -// ----------------------- - -// GuaranteedThroughputProbabilisticSampler is a sampler that leverages both probabilisticSampler and -// rateLimitingSampler. The rateLimitingSampler is used as a guaranteed lower bound sampler such that -// every operation is sampled at least once in a time interval defined by the lowerBound. ie a lowerBound -// of 1.0 / (60 * 10) will sample an operation at least once every 10 minutes. -// -// The probabilisticSampler is given higher priority when tags are emitted, ie. if IsSampled() for both -// samplers return true, the tags for probabilisticSampler will be used. -type GuaranteedThroughputProbabilisticSampler struct { - probabilisticSampler *ProbabilisticSampler - lowerBoundSampler Sampler - tags []Tag - samplingRate float64 - lowerBound float64 -} - -// NewGuaranteedThroughputProbabilisticSampler returns a delegating sampler that applies both -// probabilisticSampler and rateLimitingSampler. -func NewGuaranteedThroughputProbabilisticSampler( - lowerBound, samplingRate float64, -) (*GuaranteedThroughputProbabilisticSampler, error) { - return newGuaranteedThroughputProbabilisticSampler(lowerBound, samplingRate), nil -} - -func newGuaranteedThroughputProbabilisticSampler(lowerBound, samplingRate float64) *GuaranteedThroughputProbabilisticSampler { - s := &GuaranteedThroughputProbabilisticSampler{ - lowerBoundSampler: NewRateLimitingSampler(lowerBound), - lowerBound: lowerBound, - } - s.setProbabilisticSampler(samplingRate) - return s -} - -func (s *GuaranteedThroughputProbabilisticSampler) setProbabilisticSampler(samplingRate float64) { - if s.probabilisticSampler == nil || s.samplingRate != samplingRate { - s.probabilisticSampler = newProbabilisticSampler(samplingRate) - s.samplingRate = s.probabilisticSampler.SamplingRate() - s.tags = []Tag{ - {key: SamplerTypeTagKey, value: SamplerTypeLowerBound}, - {key: SamplerParamTagKey, value: s.samplingRate}, - } - } -} - -// IsSampled implements IsSampled() of Sampler. -func (s *GuaranteedThroughputProbabilisticSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { - if sampled, tags := s.probabilisticSampler.IsSampled(id, operation); sampled { - s.lowerBoundSampler.IsSampled(id, operation) - return true, tags - } - sampled, _ := s.lowerBoundSampler.IsSampled(id, operation) - return sampled, s.tags -} - -// Close implements Close() of Sampler. -func (s *GuaranteedThroughputProbabilisticSampler) Close() { - s.probabilisticSampler.Close() - s.lowerBoundSampler.Close() -} - -// Equal implements Equal() of Sampler. -func (s *GuaranteedThroughputProbabilisticSampler) Equal(other Sampler) bool { - // NB The Equal() function is expensive and will be removed. See adaptiveSampler.Equal() for - // more information. - return false -} - -// this function should only be called while holding a Write lock -func (s *GuaranteedThroughputProbabilisticSampler) update(lowerBound, samplingRate float64) { - s.setProbabilisticSampler(samplingRate) - if s.lowerBound != lowerBound { - s.lowerBoundSampler = NewRateLimitingSampler(lowerBound) - s.lowerBound = lowerBound - } -} - -// ----------------------- - -type adaptiveSampler struct { - sync.RWMutex - - samplers map[string]*GuaranteedThroughputProbabilisticSampler - defaultSampler *ProbabilisticSampler - lowerBound float64 - maxOperations int -} - -// NewAdaptiveSampler returns a delegating sampler that applies both probabilisticSampler and -// rateLimitingSampler via the guaranteedThroughputProbabilisticSampler. This sampler keeps track of all -// operations and delegates calls to the respective guaranteedThroughputProbabilisticSampler. -func NewAdaptiveSampler(strategies *sampling.PerOperationSamplingStrategies, maxOperations int) (Sampler, error) { - return newAdaptiveSampler(strategies, maxOperations), nil -} - -func newAdaptiveSampler(strategies *sampling.PerOperationSamplingStrategies, maxOperations int) Sampler { - samplers := make(map[string]*GuaranteedThroughputProbabilisticSampler) - for _, strategy := range strategies.PerOperationStrategies { - sampler := newGuaranteedThroughputProbabilisticSampler( - strategies.DefaultLowerBoundTracesPerSecond, - strategy.ProbabilisticSampling.SamplingRate, - ) - samplers[strategy.Operation] = sampler - } - return &adaptiveSampler{ - samplers: samplers, - defaultSampler: newProbabilisticSampler(strategies.DefaultSamplingProbability), - lowerBound: strategies.DefaultLowerBoundTracesPerSecond, - maxOperations: maxOperations, - } -} - -func (s *adaptiveSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { - s.RLock() - sampler, ok := s.samplers[operation] - if ok { - defer s.RUnlock() - return sampler.IsSampled(id, operation) - } - s.RUnlock() - s.Lock() - defer s.Unlock() - - // Check if sampler has already been created - sampler, ok = s.samplers[operation] - if ok { - return sampler.IsSampled(id, operation) - } - // Store only up to maxOperations of unique ops. - if len(s.samplers) >= s.maxOperations { - return s.defaultSampler.IsSampled(id, operation) - } - newSampler := newGuaranteedThroughputProbabilisticSampler(s.lowerBound, s.defaultSampler.SamplingRate()) - s.samplers[operation] = newSampler - return newSampler.IsSampled(id, operation) -} - -func (s *adaptiveSampler) Close() { - s.Lock() - defer s.Unlock() - for _, sampler := range s.samplers { - sampler.Close() - } - s.defaultSampler.Close() -} - -func (s *adaptiveSampler) Equal(other Sampler) bool { - // NB The Equal() function is overly expensive for adaptiveSampler since it's composed of multiple - // samplers which all need to be initialized before this function can be called for a comparison. - // Therefore, adaptiveSampler uses the update() function to only alter the samplers that need - // changing. Hence this function always returns false so that the update function can be called. - // Once the Equal() function is removed from the Sampler API, this will no longer be needed. - return false -} - -func (s *adaptiveSampler) update(strategies *sampling.PerOperationSamplingStrategies) { - s.Lock() - defer s.Unlock() - for _, strategy := range strategies.PerOperationStrategies { - operation := strategy.Operation - samplingRate := strategy.ProbabilisticSampling.SamplingRate - lowerBound := strategies.DefaultLowerBoundTracesPerSecond - if sampler, ok := s.samplers[operation]; ok { - sampler.update(lowerBound, samplingRate) - } else { - sampler := newGuaranteedThroughputProbabilisticSampler( - lowerBound, - samplingRate, - ) - s.samplers[operation] = sampler - } - } - s.lowerBound = strategies.DefaultLowerBoundTracesPerSecond - if s.defaultSampler.SamplingRate() != strategies.DefaultSamplingProbability { - s.defaultSampler = newProbabilisticSampler(strategies.DefaultSamplingProbability) - } -} - -// ----------------------- - -// RemotelyControlledSampler is a delegating sampler that polls a remote server -// for the appropriate sampling strategy, constructs a corresponding sampler and -// delegates to it for sampling decisions. -type RemotelyControlledSampler struct { - // These fields must be first in the struct because `sync/atomic` expects 64-bit alignment. - // Cf. https://github.com/uber/jaeger-client-go/issues/155, https://goo.gl/zW7dgq - closed int64 // 0 - not closed, 1 - closed - - sync.RWMutex - samplerOptions - - serviceName string - manager sampling.SamplingManager - doneChan chan *sync.WaitGroup -} - -type httpSamplingManager struct { - serverURL string -} - -func (s *httpSamplingManager) GetSamplingStrategy(serviceName string) (*sampling.SamplingStrategyResponse, error) { - var out sampling.SamplingStrategyResponse - v := url.Values{} - v.Set("service", serviceName) - if err := utils.GetJSON(s.serverURL+"?"+v.Encode(), &out); err != nil { - return nil, err - } - return &out, nil -} - -// NewRemotelyControlledSampler creates a sampler that periodically pulls -// the sampling strategy from an HTTP sampling server (e.g. jaeger-agent). -func NewRemotelyControlledSampler( - serviceName string, - opts ...SamplerOption, -) *RemotelyControlledSampler { - options := applySamplerOptions(opts...) - sampler := &RemotelyControlledSampler{ - samplerOptions: options, - serviceName: serviceName, - manager: &httpSamplingManager{serverURL: options.samplingServerURL}, - doneChan: make(chan *sync.WaitGroup), - } - go sampler.pollController() - return sampler -} - -func applySamplerOptions(opts ...SamplerOption) samplerOptions { - options := samplerOptions{} - for _, option := range opts { - option(&options) - } - if options.sampler == nil { - options.sampler = newProbabilisticSampler(0.001) - } - if options.logger == nil { - options.logger = log.NullLogger - } - if options.maxOperations <= 0 { - options.maxOperations = defaultMaxOperations - } - if options.samplingServerURL == "" { - options.samplingServerURL = defaultSamplingServerURL - } - if options.metrics == nil { - options.metrics = NewNullMetrics() - } - if options.samplingRefreshInterval <= 0 { - options.samplingRefreshInterval = defaultSamplingRefreshInterval - } - return options -} - -// IsSampled implements IsSampled() of Sampler. -func (s *RemotelyControlledSampler) IsSampled(id TraceID, operation string) (bool, []Tag) { - s.RLock() - defer s.RUnlock() - return s.sampler.IsSampled(id, operation) -} - -// Close implements Close() of Sampler. -func (s *RemotelyControlledSampler) Close() { - if swapped := atomic.CompareAndSwapInt64(&s.closed, 0, 1); !swapped { - s.logger.Error("Repeated attempt to close the sampler is ignored") - return - } - - var wg sync.WaitGroup - wg.Add(1) - s.doneChan <- &wg - wg.Wait() -} - -// Equal implements Equal() of Sampler. -func (s *RemotelyControlledSampler) Equal(other Sampler) bool { - // NB The Equal() function is expensive and will be removed. See adaptiveSampler.Equal() for - // more information. - if o, ok := other.(*RemotelyControlledSampler); ok { - s.RLock() - o.RLock() - defer s.RUnlock() - defer o.RUnlock() - return s.sampler.Equal(o.sampler) - } - return false -} - -func (s *RemotelyControlledSampler) pollController() { - ticker := time.NewTicker(s.samplingRefreshInterval) - defer ticker.Stop() - s.pollControllerWithTicker(ticker) -} - -func (s *RemotelyControlledSampler) pollControllerWithTicker(ticker *time.Ticker) { - for { - select { - case <-ticker.C: - s.updateSampler() - case wg := <-s.doneChan: - wg.Done() - return - } - } -} - -func (s *RemotelyControlledSampler) getSampler() Sampler { - s.Lock() - defer s.Unlock() - return s.sampler -} - -func (s *RemotelyControlledSampler) setSampler(sampler Sampler) { - s.Lock() - defer s.Unlock() - s.sampler = sampler -} - -func (s *RemotelyControlledSampler) updateSampler() { - res, err := s.manager.GetSamplingStrategy(s.serviceName) - if err != nil { - s.metrics.SamplerQueryFailure.Inc(1) - return - } - s.Lock() - defer s.Unlock() - - s.metrics.SamplerRetrieved.Inc(1) - if strategies := res.GetOperationSampling(); strategies != nil { - s.updateAdaptiveSampler(strategies) - } else { - err = s.updateRateLimitingOrProbabilisticSampler(res) - } - if err != nil { - s.metrics.SamplerUpdateFailure.Inc(1) - s.logger.Infof("Unable to handle sampling strategy response %+v. Got error: %v", res, err) - return - } - s.metrics.SamplerUpdated.Inc(1) -} - -// NB: this function should only be called while holding a Write lock -func (s *RemotelyControlledSampler) updateAdaptiveSampler(strategies *sampling.PerOperationSamplingStrategies) { - if adaptiveSampler, ok := s.sampler.(*adaptiveSampler); ok { - adaptiveSampler.update(strategies) - } else { - s.sampler = newAdaptiveSampler(strategies, s.maxOperations) - } -} - -// NB: this function should only be called while holding a Write lock -func (s *RemotelyControlledSampler) updateRateLimitingOrProbabilisticSampler(res *sampling.SamplingStrategyResponse) error { - var newSampler Sampler - if probabilistic := res.GetProbabilisticSampling(); probabilistic != nil { - newSampler = newProbabilisticSampler(probabilistic.SamplingRate) - } else if rateLimiting := res.GetRateLimitingSampling(); rateLimiting != nil { - newSampler = NewRateLimitingSampler(float64(rateLimiting.MaxTracesPerSecond)) - } else { - return fmt.Errorf("Unsupported sampling strategy type %v", res.GetStrategyType()) - } - if !s.sampler.Equal(newSampler) { - s.sampler = newSampler - } - return nil -} diff --git a/vendor/github.com/uber/jaeger-client-go/sampler_options.go b/vendor/github.com/uber/jaeger-client-go/sampler_options.go deleted file mode 100644 index 75d28a561190..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/sampler_options.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "time" -) - -// SamplerOption is a function that sets some option on the sampler -type SamplerOption func(options *samplerOptions) - -// SamplerOptions is a factory for all available SamplerOption's -var SamplerOptions samplerOptions - -type samplerOptions struct { - metrics *Metrics - maxOperations int - sampler Sampler - logger Logger - samplingServerURL string - samplingRefreshInterval time.Duration -} - -// Metrics creates a SamplerOption that initializes Metrics on the sampler, -// which is used to emit statistics. -func (samplerOptions) Metrics(m *Metrics) SamplerOption { - return func(o *samplerOptions) { - o.metrics = m - } -} - -// MaxOperations creates a SamplerOption that sets the maximum number of -// operations the sampler will keep track of. -func (samplerOptions) MaxOperations(maxOperations int) SamplerOption { - return func(o *samplerOptions) { - o.maxOperations = maxOperations - } -} - -// InitialSampler creates a SamplerOption that sets the initial sampler -// to use before a remote sampler is created and used. -func (samplerOptions) InitialSampler(sampler Sampler) SamplerOption { - return func(o *samplerOptions) { - o.sampler = sampler - } -} - -// Logger creates a SamplerOption that sets the logger used by the sampler. -func (samplerOptions) Logger(logger Logger) SamplerOption { - return func(o *samplerOptions) { - o.logger = logger - } -} - -// SamplingServerURL creates a SamplerOption that sets the sampling server url -// of the local agent that contains the sampling strategies. -func (samplerOptions) SamplingServerURL(samplingServerURL string) SamplerOption { - return func(o *samplerOptions) { - o.samplingServerURL = samplingServerURL - } -} - -// SamplingRefreshInterval creates a SamplerOption that sets how often the -// sampler will poll local agent for the appropriate sampling strategy. -func (samplerOptions) SamplingRefreshInterval(samplingRefreshInterval time.Duration) SamplerOption { - return func(o *samplerOptions) { - o.samplingRefreshInterval = samplingRefreshInterval - } -} diff --git a/vendor/github.com/uber/jaeger-client-go/span.go b/vendor/github.com/uber/jaeger-client-go/span.go deleted file mode 100644 index f0b497a90a4d..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/span.go +++ /dev/null @@ -1,249 +0,0 @@ -// Copyright (c) 2017-2018 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "sync" - "time" - - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" - "github.com/opentracing/opentracing-go/log" -) - -// Span implements opentracing.Span -type Span struct { - sync.RWMutex - - tracer *Tracer - - context SpanContext - - // The name of the "operation" this span is an instance of. - // Known as a "span name" in some implementations. - operationName string - - // firstInProcess, if true, indicates that this span is the root of the (sub)tree - // of spans in the current process. In other words it's true for the root spans, - // and the ingress spans when the process joins another trace. - firstInProcess bool - - // startTime is the timestamp indicating when the span began, with microseconds precision. - startTime time.Time - - // duration returns duration of the span with microseconds precision. - // Zero value means duration is unknown. - duration time.Duration - - // tags attached to this span - tags []Tag - - // The span's "micro-log" - logs []opentracing.LogRecord - - // references for this span - references []Reference - - observer ContribSpanObserver -} - -// Tag is a simple key value wrapper. -// TODO deprecate in the next major release, use opentracing.Tag instead. -type Tag struct { - key string - value interface{} -} - -// SetOperationName sets or changes the operation name. -func (s *Span) SetOperationName(operationName string) opentracing.Span { - s.Lock() - defer s.Unlock() - if s.context.IsSampled() { - s.operationName = operationName - } - s.observer.OnSetOperationName(operationName) - return s -} - -// SetTag implements SetTag() of opentracing.Span -func (s *Span) SetTag(key string, value interface{}) opentracing.Span { - s.observer.OnSetTag(key, value) - if key == string(ext.SamplingPriority) && !setSamplingPriority(s, value) { - return s - } - s.Lock() - defer s.Unlock() - if s.context.IsSampled() { - s.setTagNoLocking(key, value) - } - return s -} - -func (s *Span) setTagNoLocking(key string, value interface{}) { - s.tags = append(s.tags, Tag{key: key, value: value}) -} - -// LogFields implements opentracing.Span API -func (s *Span) LogFields(fields ...log.Field) { - s.Lock() - defer s.Unlock() - if !s.context.IsSampled() { - return - } - s.logFieldsNoLocking(fields...) -} - -// this function should only be called while holding a Write lock -func (s *Span) logFieldsNoLocking(fields ...log.Field) { - lr := opentracing.LogRecord{ - Fields: fields, - Timestamp: time.Now(), - } - s.appendLog(lr) -} - -// LogKV implements opentracing.Span API -func (s *Span) LogKV(alternatingKeyValues ...interface{}) { - s.RLock() - sampled := s.context.IsSampled() - s.RUnlock() - if !sampled { - return - } - fields, err := log.InterleavedKVToFields(alternatingKeyValues...) - if err != nil { - s.LogFields(log.Error(err), log.String("function", "LogKV")) - return - } - s.LogFields(fields...) -} - -// LogEvent implements opentracing.Span API -func (s *Span) LogEvent(event string) { - s.Log(opentracing.LogData{Event: event}) -} - -// LogEventWithPayload implements opentracing.Span API -func (s *Span) LogEventWithPayload(event string, payload interface{}) { - s.Log(opentracing.LogData{Event: event, Payload: payload}) -} - -// Log implements opentracing.Span API -func (s *Span) Log(ld opentracing.LogData) { - s.Lock() - defer s.Unlock() - if s.context.IsSampled() { - if ld.Timestamp.IsZero() { - ld.Timestamp = s.tracer.timeNow() - } - s.appendLog(ld.ToLogRecord()) - } -} - -// this function should only be called while holding a Write lock -func (s *Span) appendLog(lr opentracing.LogRecord) { - // TODO add logic to limit number of logs per span (issue #46) - s.logs = append(s.logs, lr) -} - -// SetBaggageItem implements SetBaggageItem() of opentracing.SpanContext -func (s *Span) SetBaggageItem(key, value string) opentracing.Span { - s.Lock() - defer s.Unlock() - s.tracer.setBaggage(s, key, value) - return s -} - -// BaggageItem implements BaggageItem() of opentracing.SpanContext -func (s *Span) BaggageItem(key string) string { - s.RLock() - defer s.RUnlock() - return s.context.baggage[key] -} - -// Finish implements opentracing.Span API -func (s *Span) Finish() { - s.FinishWithOptions(opentracing.FinishOptions{}) -} - -// FinishWithOptions implements opentracing.Span API -func (s *Span) FinishWithOptions(options opentracing.FinishOptions) { - if options.FinishTime.IsZero() { - options.FinishTime = s.tracer.timeNow() - } - s.observer.OnFinish(options) - s.Lock() - if s.context.IsSampled() { - s.duration = options.FinishTime.Sub(s.startTime) - // Note: bulk logs are not subject to maxLogsPerSpan limit - if options.LogRecords != nil { - s.logs = append(s.logs, options.LogRecords...) - } - for _, ld := range options.BulkLogData { - s.logs = append(s.logs, ld.ToLogRecord()) - } - } - s.Unlock() - // call reportSpan even for non-sampled traces, to return span to the pool - s.tracer.reportSpan(s) -} - -// Context implements opentracing.Span API -func (s *Span) Context() opentracing.SpanContext { - s.Lock() - defer s.Unlock() - return s.context -} - -// Tracer implements opentracing.Span API -func (s *Span) Tracer() opentracing.Tracer { - return s.tracer -} - -func (s *Span) String() string { - s.RLock() - defer s.RUnlock() - return s.context.String() -} - -// OperationName allows retrieving current operation name. -func (s *Span) OperationName() string { - s.RLock() - defer s.RUnlock() - return s.operationName -} - -func (s *Span) serviceName() string { - return s.tracer.serviceName -} - -// setSamplingPriority returns true if the flag was updated successfully, false otherwise. -func setSamplingPriority(s *Span, value interface{}) bool { - s.Lock() - defer s.Unlock() - val, ok := value.(uint16) - if !ok { - return false - } - if val == 0 { - s.context.flags = s.context.flags & (^flagSampled) - return true - } - if s.tracer.isDebugAllowed(s.operationName) { - s.context.flags = s.context.flags | flagDebug | flagSampled - return true - } - return false -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/agent.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/agent.go deleted file mode 100644 index e48811c500af..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/agent.go +++ /dev/null @@ -1,411 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package agent - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" - "github.com/uber/jaeger-client-go/thrift-gen/jaeger" - "github.com/uber/jaeger-client-go/thrift-gen/zipkincore" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -var _ = jaeger.GoUnusedProtection__ -var _ = zipkincore.GoUnusedProtection__ - -type Agent interface { - // Parameters: - // - Spans - EmitZipkinBatch(spans []*zipkincore.Span) (err error) - // Parameters: - // - Batch - EmitBatch(batch *jaeger.Batch) (err error) -} - -type AgentClient struct { - Transport thrift.TTransport - ProtocolFactory thrift.TProtocolFactory - InputProtocol thrift.TProtocol - OutputProtocol thrift.TProtocol - SeqId int32 -} - -func NewAgentClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *AgentClient { - return &AgentClient{Transport: t, - ProtocolFactory: f, - InputProtocol: f.GetProtocol(t), - OutputProtocol: f.GetProtocol(t), - SeqId: 0, - } -} - -func NewAgentClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *AgentClient { - return &AgentClient{Transport: t, - ProtocolFactory: nil, - InputProtocol: iprot, - OutputProtocol: oprot, - SeqId: 0, - } -} - -// Parameters: -// - Spans -func (p *AgentClient) EmitZipkinBatch(spans []*zipkincore.Span) (err error) { - if err = p.sendEmitZipkinBatch(spans); err != nil { - return - } - return -} - -func (p *AgentClient) sendEmitZipkinBatch(spans []*zipkincore.Span) (err error) { - oprot := p.OutputProtocol - if oprot == nil { - oprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.OutputProtocol = oprot - } - p.SeqId++ - if err = oprot.WriteMessageBegin("emitZipkinBatch", thrift.ONEWAY, p.SeqId); err != nil { - return - } - args := AgentEmitZipkinBatchArgs{ - Spans: spans, - } - if err = args.Write(oprot); err != nil { - return - } - if err = oprot.WriteMessageEnd(); err != nil { - return - } - return oprot.Flush() -} - -// Parameters: -// - Batch -func (p *AgentClient) EmitBatch(batch *jaeger.Batch) (err error) { - if err = p.sendEmitBatch(batch); err != nil { - return - } - return -} - -func (p *AgentClient) sendEmitBatch(batch *jaeger.Batch) (err error) { - oprot := p.OutputProtocol - if oprot == nil { - oprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.OutputProtocol = oprot - } - p.SeqId++ - if err = oprot.WriteMessageBegin("emitBatch", thrift.ONEWAY, p.SeqId); err != nil { - return - } - args := AgentEmitBatchArgs{ - Batch: batch, - } - if err = args.Write(oprot); err != nil { - return - } - if err = oprot.WriteMessageEnd(); err != nil { - return - } - return oprot.Flush() -} - -type AgentProcessor struct { - processorMap map[string]thrift.TProcessorFunction - handler Agent -} - -func (p *AgentProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { - p.processorMap[key] = processor -} - -func (p *AgentProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { - processor, ok = p.processorMap[key] - return processor, ok -} - -func (p *AgentProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { - return p.processorMap -} - -func NewAgentProcessor(handler Agent) *AgentProcessor { - - self0 := &AgentProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} - self0.processorMap["emitZipkinBatch"] = &agentProcessorEmitZipkinBatch{handler: handler} - self0.processorMap["emitBatch"] = &agentProcessorEmitBatch{handler: handler} - return self0 -} - -func (p *AgentProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - name, _, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return false, err - } - if processor, ok := p.GetProcessorFunction(name); ok { - return processor.Process(seqId, iprot, oprot) - } - iprot.Skip(thrift.STRUCT) - iprot.ReadMessageEnd() - x1 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) - oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) - x1.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, x1 - -} - -type agentProcessorEmitZipkinBatch struct { - handler Agent -} - -func (p *agentProcessorEmitZipkinBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - args := AgentEmitZipkinBatchArgs{} - if err = args.Read(iprot); err != nil { - iprot.ReadMessageEnd() - return false, err - } - - iprot.ReadMessageEnd() - var err2 error - if err2 = p.handler.EmitZipkinBatch(args.Spans); err2 != nil { - return true, err2 - } - return true, nil -} - -type agentProcessorEmitBatch struct { - handler Agent -} - -func (p *agentProcessorEmitBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - args := AgentEmitBatchArgs{} - if err = args.Read(iprot); err != nil { - iprot.ReadMessageEnd() - return false, err - } - - iprot.ReadMessageEnd() - var err2 error - if err2 = p.handler.EmitBatch(args.Batch); err2 != nil { - return true, err2 - } - return true, nil -} - -// HELPER FUNCTIONS AND STRUCTURES - -// Attributes: -// - Spans -type AgentEmitZipkinBatchArgs struct { - Spans []*zipkincore.Span `thrift:"spans,1" json:"spans"` -} - -func NewAgentEmitZipkinBatchArgs() *AgentEmitZipkinBatchArgs { - return &AgentEmitZipkinBatchArgs{} -} - -func (p *AgentEmitZipkinBatchArgs) GetSpans() []*zipkincore.Span { - return p.Spans -} -func (p *AgentEmitZipkinBatchArgs) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *AgentEmitZipkinBatchArgs) readField1(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*zipkincore.Span, 0, size) - p.Spans = tSlice - for i := 0; i < size; i++ { - _elem2 := &zipkincore.Span{} - if err := _elem2.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem2), err) - } - p.Spans = append(p.Spans, _elem2) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *AgentEmitZipkinBatchArgs) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("emitZipkinBatch_args"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *AgentEmitZipkinBatchArgs) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("spans", thrift.LIST, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:spans: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Spans)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Spans { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:spans: ", p), err) - } - return err -} - -func (p *AgentEmitZipkinBatchArgs) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("AgentEmitZipkinBatchArgs(%+v)", *p) -} - -// Attributes: -// - Batch -type AgentEmitBatchArgs struct { - Batch *jaeger.Batch `thrift:"batch,1" json:"batch"` -} - -func NewAgentEmitBatchArgs() *AgentEmitBatchArgs { - return &AgentEmitBatchArgs{} -} - -var AgentEmitBatchArgs_Batch_DEFAULT *jaeger.Batch - -func (p *AgentEmitBatchArgs) GetBatch() *jaeger.Batch { - if !p.IsSetBatch() { - return AgentEmitBatchArgs_Batch_DEFAULT - } - return p.Batch -} -func (p *AgentEmitBatchArgs) IsSetBatch() bool { - return p.Batch != nil -} - -func (p *AgentEmitBatchArgs) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *AgentEmitBatchArgs) readField1(iprot thrift.TProtocol) error { - p.Batch = &jaeger.Batch{} - if err := p.Batch.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Batch), err) - } - return nil -} - -func (p *AgentEmitBatchArgs) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("emitBatch_args"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *AgentEmitBatchArgs) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("batch", thrift.STRUCT, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:batch: ", p), err) - } - if err := p.Batch.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Batch), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:batch: ", p), err) - } - return err -} - -func (p *AgentEmitBatchArgs) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("AgentEmitBatchArgs(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/constants.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/constants.go deleted file mode 100644 index aa9857bb82ac..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/constants.go +++ /dev/null @@ -1,23 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package agent - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" - "github.com/uber/jaeger-client-go/thrift-gen/jaeger" - "github.com/uber/jaeger-client-go/thrift-gen/zipkincore" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -var _ = jaeger.GoUnusedProtection__ -var _ = zipkincore.GoUnusedProtection__ - -func init() { -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/ttypes.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/ttypes.go deleted file mode 100644 index 9c28f11c1ac7..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/agent/ttypes.go +++ /dev/null @@ -1,21 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package agent - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" - "github.com/uber/jaeger-client-go/thrift-gen/jaeger" - "github.com/uber/jaeger-client-go/thrift-gen/zipkincore" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -var _ = jaeger.GoUnusedProtection__ -var _ = zipkincore.GoUnusedProtection__ -var GoUnusedProtection__ int diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/baggagerestrictionmanager.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/baggagerestrictionmanager.go deleted file mode 100644 index 1f79c1255cb1..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/baggagerestrictionmanager.go +++ /dev/null @@ -1,435 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package baggage - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -type BaggageRestrictionManager interface { - // getBaggageRestrictions retrieves the baggage restrictions for a specific service. - // Usually, baggageRestrictions apply to all services however there may be situations - // where a baggageKey might only be allowed to be set by a specific service. - // - // Parameters: - // - ServiceName - GetBaggageRestrictions(serviceName string) (r []*BaggageRestriction, err error) -} - -type BaggageRestrictionManagerClient struct { - Transport thrift.TTransport - ProtocolFactory thrift.TProtocolFactory - InputProtocol thrift.TProtocol - OutputProtocol thrift.TProtocol - SeqId int32 -} - -func NewBaggageRestrictionManagerClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *BaggageRestrictionManagerClient { - return &BaggageRestrictionManagerClient{Transport: t, - ProtocolFactory: f, - InputProtocol: f.GetProtocol(t), - OutputProtocol: f.GetProtocol(t), - SeqId: 0, - } -} - -func NewBaggageRestrictionManagerClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *BaggageRestrictionManagerClient { - return &BaggageRestrictionManagerClient{Transport: t, - ProtocolFactory: nil, - InputProtocol: iprot, - OutputProtocol: oprot, - SeqId: 0, - } -} - -// getBaggageRestrictions retrieves the baggage restrictions for a specific service. -// Usually, baggageRestrictions apply to all services however there may be situations -// where a baggageKey might only be allowed to be set by a specific service. -// -// Parameters: -// - ServiceName -func (p *BaggageRestrictionManagerClient) GetBaggageRestrictions(serviceName string) (r []*BaggageRestriction, err error) { - if err = p.sendGetBaggageRestrictions(serviceName); err != nil { - return - } - return p.recvGetBaggageRestrictions() -} - -func (p *BaggageRestrictionManagerClient) sendGetBaggageRestrictions(serviceName string) (err error) { - oprot := p.OutputProtocol - if oprot == nil { - oprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.OutputProtocol = oprot - } - p.SeqId++ - if err = oprot.WriteMessageBegin("getBaggageRestrictions", thrift.CALL, p.SeqId); err != nil { - return - } - args := BaggageRestrictionManagerGetBaggageRestrictionsArgs{ - ServiceName: serviceName, - } - if err = args.Write(oprot); err != nil { - return - } - if err = oprot.WriteMessageEnd(); err != nil { - return - } - return oprot.Flush() -} - -func (p *BaggageRestrictionManagerClient) recvGetBaggageRestrictions() (value []*BaggageRestriction, err error) { - iprot := p.InputProtocol - if iprot == nil { - iprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.InputProtocol = iprot - } - method, mTypeId, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return - } - if method != "getBaggageRestrictions" { - err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "getBaggageRestrictions failed: wrong method name") - return - } - if p.SeqId != seqId { - err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "getBaggageRestrictions failed: out of sequence response") - return - } - if mTypeId == thrift.EXCEPTION { - error0 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error1 error - error1, err = error0.Read(iprot) - if err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - err = error1 - return - } - if mTypeId != thrift.REPLY { - err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "getBaggageRestrictions failed: invalid message type") - return - } - result := BaggageRestrictionManagerGetBaggageRestrictionsResult{} - if err = result.Read(iprot); err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - value = result.GetSuccess() - return -} - -type BaggageRestrictionManagerProcessor struct { - processorMap map[string]thrift.TProcessorFunction - handler BaggageRestrictionManager -} - -func (p *BaggageRestrictionManagerProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { - p.processorMap[key] = processor -} - -func (p *BaggageRestrictionManagerProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { - processor, ok = p.processorMap[key] - return processor, ok -} - -func (p *BaggageRestrictionManagerProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { - return p.processorMap -} - -func NewBaggageRestrictionManagerProcessor(handler BaggageRestrictionManager) *BaggageRestrictionManagerProcessor { - - self2 := &BaggageRestrictionManagerProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} - self2.processorMap["getBaggageRestrictions"] = &baggageRestrictionManagerProcessorGetBaggageRestrictions{handler: handler} - return self2 -} - -func (p *BaggageRestrictionManagerProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - name, _, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return false, err - } - if processor, ok := p.GetProcessorFunction(name); ok { - return processor.Process(seqId, iprot, oprot) - } - iprot.Skip(thrift.STRUCT) - iprot.ReadMessageEnd() - x3 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) - oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) - x3.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, x3 - -} - -type baggageRestrictionManagerProcessorGetBaggageRestrictions struct { - handler BaggageRestrictionManager -} - -func (p *baggageRestrictionManagerProcessorGetBaggageRestrictions) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - args := BaggageRestrictionManagerGetBaggageRestrictionsArgs{} - if err = args.Read(iprot); err != nil { - iprot.ReadMessageEnd() - x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) - oprot.WriteMessageBegin("getBaggageRestrictions", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, err - } - - iprot.ReadMessageEnd() - result := BaggageRestrictionManagerGetBaggageRestrictionsResult{} - var retval []*BaggageRestriction - var err2 error - if retval, err2 = p.handler.GetBaggageRestrictions(args.ServiceName); err2 != nil { - x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getBaggageRestrictions: "+err2.Error()) - oprot.WriteMessageBegin("getBaggageRestrictions", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return true, err2 - } else { - result.Success = retval - } - if err2 = oprot.WriteMessageBegin("getBaggageRestrictions", thrift.REPLY, seqId); err2 != nil { - err = err2 - } - if err2 = result.Write(oprot); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.Flush(); err == nil && err2 != nil { - err = err2 - } - if err != nil { - return - } - return true, err -} - -// HELPER FUNCTIONS AND STRUCTURES - -// Attributes: -// - ServiceName -type BaggageRestrictionManagerGetBaggageRestrictionsArgs struct { - ServiceName string `thrift:"serviceName,1" json:"serviceName"` -} - -func NewBaggageRestrictionManagerGetBaggageRestrictionsArgs() *BaggageRestrictionManagerGetBaggageRestrictionsArgs { - return &BaggageRestrictionManagerGetBaggageRestrictionsArgs{} -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) GetServiceName() string { - return p.ServiceName -} -func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.ServiceName = v - } - return nil -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("getBaggageRestrictions_args"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("serviceName", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:serviceName: ", p), err) - } - if err := oprot.WriteString(string(p.ServiceName)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.serviceName (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:serviceName: ", p), err) - } - return err -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsArgs) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("BaggageRestrictionManagerGetBaggageRestrictionsArgs(%+v)", *p) -} - -// Attributes: -// - Success -type BaggageRestrictionManagerGetBaggageRestrictionsResult struct { - Success []*BaggageRestriction `thrift:"success,0" json:"success,omitempty"` -} - -func NewBaggageRestrictionManagerGetBaggageRestrictionsResult() *BaggageRestrictionManagerGetBaggageRestrictionsResult { - return &BaggageRestrictionManagerGetBaggageRestrictionsResult{} -} - -var BaggageRestrictionManagerGetBaggageRestrictionsResult_Success_DEFAULT []*BaggageRestriction - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) GetSuccess() []*BaggageRestriction { - return p.Success -} -func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) IsSetSuccess() bool { - return p.Success != nil -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 0: - if err := p.readField0(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) readField0(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*BaggageRestriction, 0, size) - p.Success = tSlice - for i := 0; i < size; i++ { - _elem4 := &BaggageRestriction{} - if err := _elem4.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem4), err) - } - p.Success = append(p.Success, _elem4) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("getBaggageRestrictions_result"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField0(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) writeField0(oprot thrift.TProtocol) (err error) { - if p.IsSetSuccess() { - if err := oprot.WriteFieldBegin("success", thrift.LIST, 0); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Success)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Success { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) - } - } - return err -} - -func (p *BaggageRestrictionManagerGetBaggageRestrictionsResult) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("BaggageRestrictionManagerGetBaggageRestrictionsResult(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/constants.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/constants.go deleted file mode 100644 index ed35ce9ab514..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/constants.go +++ /dev/null @@ -1,18 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package baggage - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -func init() { -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/ttypes.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/ttypes.go deleted file mode 100644 index 7888892f633f..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/baggage/ttypes.go +++ /dev/null @@ -1,154 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package baggage - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -var GoUnusedProtection__ int - -// Attributes: -// - BaggageKey -// - MaxValueLength -type BaggageRestriction struct { - BaggageKey string `thrift:"baggageKey,1,required" json:"baggageKey"` - MaxValueLength int32 `thrift:"maxValueLength,2,required" json:"maxValueLength"` -} - -func NewBaggageRestriction() *BaggageRestriction { - return &BaggageRestriction{} -} - -func (p *BaggageRestriction) GetBaggageKey() string { - return p.BaggageKey -} - -func (p *BaggageRestriction) GetMaxValueLength() int32 { - return p.MaxValueLength -} -func (p *BaggageRestriction) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetBaggageKey bool = false - var issetMaxValueLength bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetBaggageKey = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetMaxValueLength = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetBaggageKey { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field BaggageKey is not set")) - } - if !issetMaxValueLength { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field MaxValueLength is not set")) - } - return nil -} - -func (p *BaggageRestriction) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.BaggageKey = v - } - return nil -} - -func (p *BaggageRestriction) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - p.MaxValueLength = v - } - return nil -} - -func (p *BaggageRestriction) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("BaggageRestriction"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *BaggageRestriction) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("baggageKey", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:baggageKey: ", p), err) - } - if err := oprot.WriteString(string(p.BaggageKey)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.baggageKey (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:baggageKey: ", p), err) - } - return err -} - -func (p *BaggageRestriction) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("maxValueLength", thrift.I32, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:maxValueLength: ", p), err) - } - if err := oprot.WriteI32(int32(p.MaxValueLength)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.maxValueLength (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:maxValueLength: ", p), err) - } - return err -} - -func (p *BaggageRestriction) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("BaggageRestriction(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/agent.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/agent.go deleted file mode 100644 index b32c37dd2615..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/agent.go +++ /dev/null @@ -1,242 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package jaeger - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -type Agent interface { - // Parameters: - // - Batch - EmitBatch(batch *Batch) (err error) -} - -type AgentClient struct { - Transport thrift.TTransport - ProtocolFactory thrift.TProtocolFactory - InputProtocol thrift.TProtocol - OutputProtocol thrift.TProtocol - SeqId int32 -} - -func NewAgentClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *AgentClient { - return &AgentClient{Transport: t, - ProtocolFactory: f, - InputProtocol: f.GetProtocol(t), - OutputProtocol: f.GetProtocol(t), - SeqId: 0, - } -} - -func NewAgentClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *AgentClient { - return &AgentClient{Transport: t, - ProtocolFactory: nil, - InputProtocol: iprot, - OutputProtocol: oprot, - SeqId: 0, - } -} - -// Parameters: -// - Batch -func (p *AgentClient) EmitBatch(batch *Batch) (err error) { - if err = p.sendEmitBatch(batch); err != nil { - return - } - return -} - -func (p *AgentClient) sendEmitBatch(batch *Batch) (err error) { - oprot := p.OutputProtocol - if oprot == nil { - oprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.OutputProtocol = oprot - } - p.SeqId++ - if err = oprot.WriteMessageBegin("emitBatch", thrift.ONEWAY, p.SeqId); err != nil { - return - } - args := AgentEmitBatchArgs{ - Batch: batch, - } - if err = args.Write(oprot); err != nil { - return - } - if err = oprot.WriteMessageEnd(); err != nil { - return - } - return oprot.Flush() -} - -type AgentProcessor struct { - processorMap map[string]thrift.TProcessorFunction - handler Agent -} - -func (p *AgentProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { - p.processorMap[key] = processor -} - -func (p *AgentProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { - processor, ok = p.processorMap[key] - return processor, ok -} - -func (p *AgentProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { - return p.processorMap -} - -func NewAgentProcessor(handler Agent) *AgentProcessor { - - self6 := &AgentProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} - self6.processorMap["emitBatch"] = &agentProcessorEmitBatch{handler: handler} - return self6 -} - -func (p *AgentProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - name, _, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return false, err - } - if processor, ok := p.GetProcessorFunction(name); ok { - return processor.Process(seqId, iprot, oprot) - } - iprot.Skip(thrift.STRUCT) - iprot.ReadMessageEnd() - x7 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) - oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) - x7.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, x7 - -} - -type agentProcessorEmitBatch struct { - handler Agent -} - -func (p *agentProcessorEmitBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - args := AgentEmitBatchArgs{} - if err = args.Read(iprot); err != nil { - iprot.ReadMessageEnd() - return false, err - } - - iprot.ReadMessageEnd() - var err2 error - if err2 = p.handler.EmitBatch(args.Batch); err2 != nil { - return true, err2 - } - return true, nil -} - -// HELPER FUNCTIONS AND STRUCTURES - -// Attributes: -// - Batch -type AgentEmitBatchArgs struct { - Batch *Batch `thrift:"batch,1" json:"batch"` -} - -func NewAgentEmitBatchArgs() *AgentEmitBatchArgs { - return &AgentEmitBatchArgs{} -} - -var AgentEmitBatchArgs_Batch_DEFAULT *Batch - -func (p *AgentEmitBatchArgs) GetBatch() *Batch { - if !p.IsSetBatch() { - return AgentEmitBatchArgs_Batch_DEFAULT - } - return p.Batch -} -func (p *AgentEmitBatchArgs) IsSetBatch() bool { - return p.Batch != nil -} - -func (p *AgentEmitBatchArgs) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *AgentEmitBatchArgs) readField1(iprot thrift.TProtocol) error { - p.Batch = &Batch{} - if err := p.Batch.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Batch), err) - } - return nil -} - -func (p *AgentEmitBatchArgs) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("emitBatch_args"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *AgentEmitBatchArgs) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("batch", thrift.STRUCT, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:batch: ", p), err) - } - if err := p.Batch.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Batch), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:batch: ", p), err) - } - return err -} - -func (p *AgentEmitBatchArgs) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("AgentEmitBatchArgs(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/constants.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/constants.go deleted file mode 100644 index 621b8b1c20f4..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/constants.go +++ /dev/null @@ -1,18 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package jaeger - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -func init() { -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/ttypes.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/ttypes.go deleted file mode 100644 index d23ed2fc2839..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/jaeger/ttypes.go +++ /dev/null @@ -1,1838 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package jaeger - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -var GoUnusedProtection__ int - -type TagType int64 - -const ( - TagType_STRING TagType = 0 - TagType_DOUBLE TagType = 1 - TagType_BOOL TagType = 2 - TagType_LONG TagType = 3 - TagType_BINARY TagType = 4 -) - -func (p TagType) String() string { - switch p { - case TagType_STRING: - return "STRING" - case TagType_DOUBLE: - return "DOUBLE" - case TagType_BOOL: - return "BOOL" - case TagType_LONG: - return "LONG" - case TagType_BINARY: - return "BINARY" - } - return "" -} - -func TagTypeFromString(s string) (TagType, error) { - switch s { - case "STRING": - return TagType_STRING, nil - case "DOUBLE": - return TagType_DOUBLE, nil - case "BOOL": - return TagType_BOOL, nil - case "LONG": - return TagType_LONG, nil - case "BINARY": - return TagType_BINARY, nil - } - return TagType(0), fmt.Errorf("not a valid TagType string") -} - -func TagTypePtr(v TagType) *TagType { return &v } - -func (p TagType) MarshalText() ([]byte, error) { - return []byte(p.String()), nil -} - -func (p *TagType) UnmarshalText(text []byte) error { - q, err := TagTypeFromString(string(text)) - if err != nil { - return err - } - *p = q - return nil -} - -type SpanRefType int64 - -const ( - SpanRefType_CHILD_OF SpanRefType = 0 - SpanRefType_FOLLOWS_FROM SpanRefType = 1 -) - -func (p SpanRefType) String() string { - switch p { - case SpanRefType_CHILD_OF: - return "CHILD_OF" - case SpanRefType_FOLLOWS_FROM: - return "FOLLOWS_FROM" - } - return "" -} - -func SpanRefTypeFromString(s string) (SpanRefType, error) { - switch s { - case "CHILD_OF": - return SpanRefType_CHILD_OF, nil - case "FOLLOWS_FROM": - return SpanRefType_FOLLOWS_FROM, nil - } - return SpanRefType(0), fmt.Errorf("not a valid SpanRefType string") -} - -func SpanRefTypePtr(v SpanRefType) *SpanRefType { return &v } - -func (p SpanRefType) MarshalText() ([]byte, error) { - return []byte(p.String()), nil -} - -func (p *SpanRefType) UnmarshalText(text []byte) error { - q, err := SpanRefTypeFromString(string(text)) - if err != nil { - return err - } - *p = q - return nil -} - -// Attributes: -// - Key -// - VType -// - VStr -// - VDouble -// - VBool -// - VLong -// - VBinary -type Tag struct { - Key string `thrift:"key,1,required" json:"key"` - VType TagType `thrift:"vType,2,required" json:"vType"` - VStr *string `thrift:"vStr,3" json:"vStr,omitempty"` - VDouble *float64 `thrift:"vDouble,4" json:"vDouble,omitempty"` - VBool *bool `thrift:"vBool,5" json:"vBool,omitempty"` - VLong *int64 `thrift:"vLong,6" json:"vLong,omitempty"` - VBinary []byte `thrift:"vBinary,7" json:"vBinary,omitempty"` -} - -func NewTag() *Tag { - return &Tag{} -} - -func (p *Tag) GetKey() string { - return p.Key -} - -func (p *Tag) GetVType() TagType { - return p.VType -} - -var Tag_VStr_DEFAULT string - -func (p *Tag) GetVStr() string { - if !p.IsSetVStr() { - return Tag_VStr_DEFAULT - } - return *p.VStr -} - -var Tag_VDouble_DEFAULT float64 - -func (p *Tag) GetVDouble() float64 { - if !p.IsSetVDouble() { - return Tag_VDouble_DEFAULT - } - return *p.VDouble -} - -var Tag_VBool_DEFAULT bool - -func (p *Tag) GetVBool() bool { - if !p.IsSetVBool() { - return Tag_VBool_DEFAULT - } - return *p.VBool -} - -var Tag_VLong_DEFAULT int64 - -func (p *Tag) GetVLong() int64 { - if !p.IsSetVLong() { - return Tag_VLong_DEFAULT - } - return *p.VLong -} - -var Tag_VBinary_DEFAULT []byte - -func (p *Tag) GetVBinary() []byte { - return p.VBinary -} -func (p *Tag) IsSetVStr() bool { - return p.VStr != nil -} - -func (p *Tag) IsSetVDouble() bool { - return p.VDouble != nil -} - -func (p *Tag) IsSetVBool() bool { - return p.VBool != nil -} - -func (p *Tag) IsSetVLong() bool { - return p.VLong != nil -} - -func (p *Tag) IsSetVBinary() bool { - return p.VBinary != nil -} - -func (p *Tag) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetKey bool = false - var issetVType bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetKey = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetVType = true - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - case 4: - if err := p.readField4(iprot); err != nil { - return err - } - case 5: - if err := p.readField5(iprot); err != nil { - return err - } - case 6: - if err := p.readField6(iprot); err != nil { - return err - } - case 7: - if err := p.readField7(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetKey { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Key is not set")) - } - if !issetVType { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field VType is not set")) - } - return nil -} - -func (p *Tag) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Key = v - } - return nil -} - -func (p *Tag) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - temp := TagType(v) - p.VType = temp - } - return nil -} - -func (p *Tag) readField3(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 3: ", err) - } else { - p.VStr = &v - } - return nil -} - -func (p *Tag) readField4(iprot thrift.TProtocol) error { - if v, err := iprot.ReadDouble(); err != nil { - return thrift.PrependError("error reading field 4: ", err) - } else { - p.VDouble = &v - } - return nil -} - -func (p *Tag) readField5(iprot thrift.TProtocol) error { - if v, err := iprot.ReadBool(); err != nil { - return thrift.PrependError("error reading field 5: ", err) - } else { - p.VBool = &v - } - return nil -} - -func (p *Tag) readField6(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 6: ", err) - } else { - p.VLong = &v - } - return nil -} - -func (p *Tag) readField7(iprot thrift.TProtocol) error { - if v, err := iprot.ReadBinary(); err != nil { - return thrift.PrependError("error reading field 7: ", err) - } else { - p.VBinary = v - } - return nil -} - -func (p *Tag) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Tag"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := p.writeField4(oprot); err != nil { - return err - } - if err := p.writeField5(oprot); err != nil { - return err - } - if err := p.writeField6(oprot); err != nil { - return err - } - if err := p.writeField7(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Tag) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("key", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:key: ", p), err) - } - if err := oprot.WriteString(string(p.Key)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.key (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:key: ", p), err) - } - return err -} - -func (p *Tag) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("vType", thrift.I32, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:vType: ", p), err) - } - if err := oprot.WriteI32(int32(p.VType)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.vType (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:vType: ", p), err) - } - return err -} - -func (p *Tag) writeField3(oprot thrift.TProtocol) (err error) { - if p.IsSetVStr() { - if err := oprot.WriteFieldBegin("vStr", thrift.STRING, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:vStr: ", p), err) - } - if err := oprot.WriteString(string(*p.VStr)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.vStr (3) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:vStr: ", p), err) - } - } - return err -} - -func (p *Tag) writeField4(oprot thrift.TProtocol) (err error) { - if p.IsSetVDouble() { - if err := oprot.WriteFieldBegin("vDouble", thrift.DOUBLE, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:vDouble: ", p), err) - } - if err := oprot.WriteDouble(float64(*p.VDouble)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.vDouble (4) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:vDouble: ", p), err) - } - } - return err -} - -func (p *Tag) writeField5(oprot thrift.TProtocol) (err error) { - if p.IsSetVBool() { - if err := oprot.WriteFieldBegin("vBool", thrift.BOOL, 5); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:vBool: ", p), err) - } - if err := oprot.WriteBool(bool(*p.VBool)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.vBool (5) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 5:vBool: ", p), err) - } - } - return err -} - -func (p *Tag) writeField6(oprot thrift.TProtocol) (err error) { - if p.IsSetVLong() { - if err := oprot.WriteFieldBegin("vLong", thrift.I64, 6); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:vLong: ", p), err) - } - if err := oprot.WriteI64(int64(*p.VLong)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.vLong (6) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 6:vLong: ", p), err) - } - } - return err -} - -func (p *Tag) writeField7(oprot thrift.TProtocol) (err error) { - if p.IsSetVBinary() { - if err := oprot.WriteFieldBegin("vBinary", thrift.STRING, 7); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:vBinary: ", p), err) - } - if err := oprot.WriteBinary(p.VBinary); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.vBinary (7) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 7:vBinary: ", p), err) - } - } - return err -} - -func (p *Tag) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Tag(%+v)", *p) -} - -// Attributes: -// - Timestamp -// - Fields -type Log struct { - Timestamp int64 `thrift:"timestamp,1,required" json:"timestamp"` - Fields []*Tag `thrift:"fields,2,required" json:"fields"` -} - -func NewLog() *Log { - return &Log{} -} - -func (p *Log) GetTimestamp() int64 { - return p.Timestamp -} - -func (p *Log) GetFields() []*Tag { - return p.Fields -} -func (p *Log) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetTimestamp bool = false - var issetFields bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetTimestamp = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetFields = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetTimestamp { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Timestamp is not set")) - } - if !issetFields { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Fields is not set")) - } - return nil -} - -func (p *Log) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Timestamp = v - } - return nil -} - -func (p *Log) readField2(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Tag, 0, size) - p.Fields = tSlice - for i := 0; i < size; i++ { - _elem0 := &Tag{} - if err := _elem0.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem0), err) - } - p.Fields = append(p.Fields, _elem0) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Log) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Log"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Log) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("timestamp", thrift.I64, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:timestamp: ", p), err) - } - if err := oprot.WriteI64(int64(p.Timestamp)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.timestamp (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:timestamp: ", p), err) - } - return err -} - -func (p *Log) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("fields", thrift.LIST, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:fields: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Fields)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Fields { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:fields: ", p), err) - } - return err -} - -func (p *Log) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Log(%+v)", *p) -} - -// Attributes: -// - RefType -// - TraceIdLow -// - TraceIdHigh -// - SpanId -type SpanRef struct { - RefType SpanRefType `thrift:"refType,1,required" json:"refType"` - TraceIdLow int64 `thrift:"traceIdLow,2,required" json:"traceIdLow"` - TraceIdHigh int64 `thrift:"traceIdHigh,3,required" json:"traceIdHigh"` - SpanId int64 `thrift:"spanId,4,required" json:"spanId"` -} - -func NewSpanRef() *SpanRef { - return &SpanRef{} -} - -func (p *SpanRef) GetRefType() SpanRefType { - return p.RefType -} - -func (p *SpanRef) GetTraceIdLow() int64 { - return p.TraceIdLow -} - -func (p *SpanRef) GetTraceIdHigh() int64 { - return p.TraceIdHigh -} - -func (p *SpanRef) GetSpanId() int64 { - return p.SpanId -} -func (p *SpanRef) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetRefType bool = false - var issetTraceIdLow bool = false - var issetTraceIdHigh bool = false - var issetSpanId bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetRefType = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetTraceIdLow = true - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - issetTraceIdHigh = true - case 4: - if err := p.readField4(iprot); err != nil { - return err - } - issetSpanId = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetRefType { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field RefType is not set")) - } - if !issetTraceIdLow { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TraceIdLow is not set")) - } - if !issetTraceIdHigh { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TraceIdHigh is not set")) - } - if !issetSpanId { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SpanId is not set")) - } - return nil -} - -func (p *SpanRef) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - temp := SpanRefType(v) - p.RefType = temp - } - return nil -} - -func (p *SpanRef) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - p.TraceIdLow = v - } - return nil -} - -func (p *SpanRef) readField3(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 3: ", err) - } else { - p.TraceIdHigh = v - } - return nil -} - -func (p *SpanRef) readField4(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 4: ", err) - } else { - p.SpanId = v - } - return nil -} - -func (p *SpanRef) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("SpanRef"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := p.writeField4(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *SpanRef) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("refType", thrift.I32, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:refType: ", p), err) - } - if err := oprot.WriteI32(int32(p.RefType)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.refType (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:refType: ", p), err) - } - return err -} - -func (p *SpanRef) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("traceIdLow", thrift.I64, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:traceIdLow: ", p), err) - } - if err := oprot.WriteI64(int64(p.TraceIdLow)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.traceIdLow (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:traceIdLow: ", p), err) - } - return err -} - -func (p *SpanRef) writeField3(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("traceIdHigh", thrift.I64, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:traceIdHigh: ", p), err) - } - if err := oprot.WriteI64(int64(p.TraceIdHigh)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.traceIdHigh (3) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:traceIdHigh: ", p), err) - } - return err -} - -func (p *SpanRef) writeField4(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("spanId", thrift.I64, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:spanId: ", p), err) - } - if err := oprot.WriteI64(int64(p.SpanId)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.spanId (4) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:spanId: ", p), err) - } - return err -} - -func (p *SpanRef) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("SpanRef(%+v)", *p) -} - -// Attributes: -// - TraceIdLow -// - TraceIdHigh -// - SpanId -// - ParentSpanId -// - OperationName -// - References -// - Flags -// - StartTime -// - Duration -// - Tags -// - Logs -type Span struct { - TraceIdLow int64 `thrift:"traceIdLow,1,required" json:"traceIdLow"` - TraceIdHigh int64 `thrift:"traceIdHigh,2,required" json:"traceIdHigh"` - SpanId int64 `thrift:"spanId,3,required" json:"spanId"` - ParentSpanId int64 `thrift:"parentSpanId,4,required" json:"parentSpanId"` - OperationName string `thrift:"operationName,5,required" json:"operationName"` - References []*SpanRef `thrift:"references,6" json:"references,omitempty"` - Flags int32 `thrift:"flags,7,required" json:"flags"` - StartTime int64 `thrift:"startTime,8,required" json:"startTime"` - Duration int64 `thrift:"duration,9,required" json:"duration"` - Tags []*Tag `thrift:"tags,10" json:"tags,omitempty"` - Logs []*Log `thrift:"logs,11" json:"logs,omitempty"` -} - -func NewSpan() *Span { - return &Span{} -} - -func (p *Span) GetTraceIdLow() int64 { - return p.TraceIdLow -} - -func (p *Span) GetTraceIdHigh() int64 { - return p.TraceIdHigh -} - -func (p *Span) GetSpanId() int64 { - return p.SpanId -} - -func (p *Span) GetParentSpanId() int64 { - return p.ParentSpanId -} - -func (p *Span) GetOperationName() string { - return p.OperationName -} - -var Span_References_DEFAULT []*SpanRef - -func (p *Span) GetReferences() []*SpanRef { - return p.References -} - -func (p *Span) GetFlags() int32 { - return p.Flags -} - -func (p *Span) GetStartTime() int64 { - return p.StartTime -} - -func (p *Span) GetDuration() int64 { - return p.Duration -} - -var Span_Tags_DEFAULT []*Tag - -func (p *Span) GetTags() []*Tag { - return p.Tags -} - -var Span_Logs_DEFAULT []*Log - -func (p *Span) GetLogs() []*Log { - return p.Logs -} -func (p *Span) IsSetReferences() bool { - return p.References != nil -} - -func (p *Span) IsSetTags() bool { - return p.Tags != nil -} - -func (p *Span) IsSetLogs() bool { - return p.Logs != nil -} - -func (p *Span) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetTraceIdLow bool = false - var issetTraceIdHigh bool = false - var issetSpanId bool = false - var issetParentSpanId bool = false - var issetOperationName bool = false - var issetFlags bool = false - var issetStartTime bool = false - var issetDuration bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetTraceIdLow = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetTraceIdHigh = true - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - issetSpanId = true - case 4: - if err := p.readField4(iprot); err != nil { - return err - } - issetParentSpanId = true - case 5: - if err := p.readField5(iprot); err != nil { - return err - } - issetOperationName = true - case 6: - if err := p.readField6(iprot); err != nil { - return err - } - case 7: - if err := p.readField7(iprot); err != nil { - return err - } - issetFlags = true - case 8: - if err := p.readField8(iprot); err != nil { - return err - } - issetStartTime = true - case 9: - if err := p.readField9(iprot); err != nil { - return err - } - issetDuration = true - case 10: - if err := p.readField10(iprot); err != nil { - return err - } - case 11: - if err := p.readField11(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetTraceIdLow { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TraceIdLow is not set")) - } - if !issetTraceIdHigh { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field TraceIdHigh is not set")) - } - if !issetSpanId { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SpanId is not set")) - } - if !issetParentSpanId { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ParentSpanId is not set")) - } - if !issetOperationName { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field OperationName is not set")) - } - if !issetFlags { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Flags is not set")) - } - if !issetStartTime { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field StartTime is not set")) - } - if !issetDuration { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Duration is not set")) - } - return nil -} - -func (p *Span) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.TraceIdLow = v - } - return nil -} - -func (p *Span) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - p.TraceIdHigh = v - } - return nil -} - -func (p *Span) readField3(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 3: ", err) - } else { - p.SpanId = v - } - return nil -} - -func (p *Span) readField4(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 4: ", err) - } else { - p.ParentSpanId = v - } - return nil -} - -func (p *Span) readField5(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 5: ", err) - } else { - p.OperationName = v - } - return nil -} - -func (p *Span) readField6(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*SpanRef, 0, size) - p.References = tSlice - for i := 0; i < size; i++ { - _elem1 := &SpanRef{} - if err := _elem1.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem1), err) - } - p.References = append(p.References, _elem1) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Span) readField7(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 7: ", err) - } else { - p.Flags = v - } - return nil -} - -func (p *Span) readField8(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 8: ", err) - } else { - p.StartTime = v - } - return nil -} - -func (p *Span) readField9(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 9: ", err) - } else { - p.Duration = v - } - return nil -} - -func (p *Span) readField10(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Tag, 0, size) - p.Tags = tSlice - for i := 0; i < size; i++ { - _elem2 := &Tag{} - if err := _elem2.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem2), err) - } - p.Tags = append(p.Tags, _elem2) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Span) readField11(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Log, 0, size) - p.Logs = tSlice - for i := 0; i < size; i++ { - _elem3 := &Log{} - if err := _elem3.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem3), err) - } - p.Logs = append(p.Logs, _elem3) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Span) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Span"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := p.writeField4(oprot); err != nil { - return err - } - if err := p.writeField5(oprot); err != nil { - return err - } - if err := p.writeField6(oprot); err != nil { - return err - } - if err := p.writeField7(oprot); err != nil { - return err - } - if err := p.writeField8(oprot); err != nil { - return err - } - if err := p.writeField9(oprot); err != nil { - return err - } - if err := p.writeField10(oprot); err != nil { - return err - } - if err := p.writeField11(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Span) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("traceIdLow", thrift.I64, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:traceIdLow: ", p), err) - } - if err := oprot.WriteI64(int64(p.TraceIdLow)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.traceIdLow (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:traceIdLow: ", p), err) - } - return err -} - -func (p *Span) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("traceIdHigh", thrift.I64, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:traceIdHigh: ", p), err) - } - if err := oprot.WriteI64(int64(p.TraceIdHigh)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.traceIdHigh (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:traceIdHigh: ", p), err) - } - return err -} - -func (p *Span) writeField3(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("spanId", thrift.I64, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:spanId: ", p), err) - } - if err := oprot.WriteI64(int64(p.SpanId)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.spanId (3) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:spanId: ", p), err) - } - return err -} - -func (p *Span) writeField4(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("parentSpanId", thrift.I64, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:parentSpanId: ", p), err) - } - if err := oprot.WriteI64(int64(p.ParentSpanId)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.parentSpanId (4) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:parentSpanId: ", p), err) - } - return err -} - -func (p *Span) writeField5(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("operationName", thrift.STRING, 5); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:operationName: ", p), err) - } - if err := oprot.WriteString(string(p.OperationName)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.operationName (5) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 5:operationName: ", p), err) - } - return err -} - -func (p *Span) writeField6(oprot thrift.TProtocol) (err error) { - if p.IsSetReferences() { - if err := oprot.WriteFieldBegin("references", thrift.LIST, 6); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:references: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.References)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.References { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 6:references: ", p), err) - } - } - return err -} - -func (p *Span) writeField7(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("flags", thrift.I32, 7); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 7:flags: ", p), err) - } - if err := oprot.WriteI32(int32(p.Flags)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.flags (7) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 7:flags: ", p), err) - } - return err -} - -func (p *Span) writeField8(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("startTime", thrift.I64, 8); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:startTime: ", p), err) - } - if err := oprot.WriteI64(int64(p.StartTime)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.startTime (8) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 8:startTime: ", p), err) - } - return err -} - -func (p *Span) writeField9(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("duration", thrift.I64, 9); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:duration: ", p), err) - } - if err := oprot.WriteI64(int64(p.Duration)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.duration (9) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 9:duration: ", p), err) - } - return err -} - -func (p *Span) writeField10(oprot thrift.TProtocol) (err error) { - if p.IsSetTags() { - if err := oprot.WriteFieldBegin("tags", thrift.LIST, 10); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 10:tags: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Tags)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Tags { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 10:tags: ", p), err) - } - } - return err -} - -func (p *Span) writeField11(oprot thrift.TProtocol) (err error) { - if p.IsSetLogs() { - if err := oprot.WriteFieldBegin("logs", thrift.LIST, 11); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 11:logs: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Logs)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Logs { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 11:logs: ", p), err) - } - } - return err -} - -func (p *Span) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Span(%+v)", *p) -} - -// Attributes: -// - ServiceName -// - Tags -type Process struct { - ServiceName string `thrift:"serviceName,1,required" json:"serviceName"` - Tags []*Tag `thrift:"tags,2" json:"tags,omitempty"` -} - -func NewProcess() *Process { - return &Process{} -} - -func (p *Process) GetServiceName() string { - return p.ServiceName -} - -var Process_Tags_DEFAULT []*Tag - -func (p *Process) GetTags() []*Tag { - return p.Tags -} -func (p *Process) IsSetTags() bool { - return p.Tags != nil -} - -func (p *Process) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetServiceName bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetServiceName = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetServiceName { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ServiceName is not set")) - } - return nil -} - -func (p *Process) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.ServiceName = v - } - return nil -} - -func (p *Process) readField2(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Tag, 0, size) - p.Tags = tSlice - for i := 0; i < size; i++ { - _elem4 := &Tag{} - if err := _elem4.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem4), err) - } - p.Tags = append(p.Tags, _elem4) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Process) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Process"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Process) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("serviceName", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:serviceName: ", p), err) - } - if err := oprot.WriteString(string(p.ServiceName)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.serviceName (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:serviceName: ", p), err) - } - return err -} - -func (p *Process) writeField2(oprot thrift.TProtocol) (err error) { - if p.IsSetTags() { - if err := oprot.WriteFieldBegin("tags", thrift.LIST, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:tags: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Tags)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Tags { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:tags: ", p), err) - } - } - return err -} - -func (p *Process) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Process(%+v)", *p) -} - -// Attributes: -// - Process -// - Spans -type Batch struct { - Process *Process `thrift:"process,1,required" json:"process"` - Spans []*Span `thrift:"spans,2,required" json:"spans"` -} - -func NewBatch() *Batch { - return &Batch{} -} - -var Batch_Process_DEFAULT *Process - -func (p *Batch) GetProcess() *Process { - if !p.IsSetProcess() { - return Batch_Process_DEFAULT - } - return p.Process -} - -func (p *Batch) GetSpans() []*Span { - return p.Spans -} -func (p *Batch) IsSetProcess() bool { - return p.Process != nil -} - -func (p *Batch) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetProcess bool = false - var issetSpans bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetProcess = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetSpans = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetProcess { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Process is not set")) - } - if !issetSpans { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Spans is not set")) - } - return nil -} - -func (p *Batch) readField1(iprot thrift.TProtocol) error { - p.Process = &Process{} - if err := p.Process.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Process), err) - } - return nil -} - -func (p *Batch) readField2(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Span, 0, size) - p.Spans = tSlice - for i := 0; i < size; i++ { - _elem5 := &Span{} - if err := _elem5.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem5), err) - } - p.Spans = append(p.Spans, _elem5) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Batch) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Batch"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Batch) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("process", thrift.STRUCT, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:process: ", p), err) - } - if err := p.Process.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Process), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:process: ", p), err) - } - return err -} - -func (p *Batch) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("spans", thrift.LIST, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:spans: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Spans)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Spans { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:spans: ", p), err) - } - return err -} - -func (p *Batch) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Batch(%+v)", *p) -} - -// Attributes: -// - Ok -type BatchSubmitResponse struct { - Ok bool `thrift:"ok,1,required" json:"ok"` -} - -func NewBatchSubmitResponse() *BatchSubmitResponse { - return &BatchSubmitResponse{} -} - -func (p *BatchSubmitResponse) GetOk() bool { - return p.Ok -} -func (p *BatchSubmitResponse) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetOk bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetOk = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetOk { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Ok is not set")) - } - return nil -} - -func (p *BatchSubmitResponse) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadBool(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Ok = v - } - return nil -} - -func (p *BatchSubmitResponse) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("BatchSubmitResponse"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *BatchSubmitResponse) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("ok", thrift.BOOL, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:ok: ", p), err) - } - if err := oprot.WriteBool(bool(p.Ok)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.ok (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:ok: ", p), err) - } - return err -} - -func (p *BatchSubmitResponse) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("BatchSubmitResponse(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/constants.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/constants.go deleted file mode 100644 index 0f6e3a884d95..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/constants.go +++ /dev/null @@ -1,18 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package sampling - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -func init() { -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/samplingmanager.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/samplingmanager.go deleted file mode 100644 index 33179cfeb3b9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/samplingmanager.go +++ /dev/null @@ -1,410 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package sampling - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -type SamplingManager interface { - // Parameters: - // - ServiceName - GetSamplingStrategy(serviceName string) (r *SamplingStrategyResponse, err error) -} - -type SamplingManagerClient struct { - Transport thrift.TTransport - ProtocolFactory thrift.TProtocolFactory - InputProtocol thrift.TProtocol - OutputProtocol thrift.TProtocol - SeqId int32 -} - -func NewSamplingManagerClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *SamplingManagerClient { - return &SamplingManagerClient{Transport: t, - ProtocolFactory: f, - InputProtocol: f.GetProtocol(t), - OutputProtocol: f.GetProtocol(t), - SeqId: 0, - } -} - -func NewSamplingManagerClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *SamplingManagerClient { - return &SamplingManagerClient{Transport: t, - ProtocolFactory: nil, - InputProtocol: iprot, - OutputProtocol: oprot, - SeqId: 0, - } -} - -// Parameters: -// - ServiceName -func (p *SamplingManagerClient) GetSamplingStrategy(serviceName string) (r *SamplingStrategyResponse, err error) { - if err = p.sendGetSamplingStrategy(serviceName); err != nil { - return - } - return p.recvGetSamplingStrategy() -} - -func (p *SamplingManagerClient) sendGetSamplingStrategy(serviceName string) (err error) { - oprot := p.OutputProtocol - if oprot == nil { - oprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.OutputProtocol = oprot - } - p.SeqId++ - if err = oprot.WriteMessageBegin("getSamplingStrategy", thrift.CALL, p.SeqId); err != nil { - return - } - args := SamplingManagerGetSamplingStrategyArgs{ - ServiceName: serviceName, - } - if err = args.Write(oprot); err != nil { - return - } - if err = oprot.WriteMessageEnd(); err != nil { - return - } - return oprot.Flush() -} - -func (p *SamplingManagerClient) recvGetSamplingStrategy() (value *SamplingStrategyResponse, err error) { - iprot := p.InputProtocol - if iprot == nil { - iprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.InputProtocol = iprot - } - method, mTypeId, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return - } - if method != "getSamplingStrategy" { - err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "getSamplingStrategy failed: wrong method name") - return - } - if p.SeqId != seqId { - err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "getSamplingStrategy failed: out of sequence response") - return - } - if mTypeId == thrift.EXCEPTION { - error1 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error2 error - error2, err = error1.Read(iprot) - if err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - err = error2 - return - } - if mTypeId != thrift.REPLY { - err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "getSamplingStrategy failed: invalid message type") - return - } - result := SamplingManagerGetSamplingStrategyResult{} - if err = result.Read(iprot); err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - value = result.GetSuccess() - return -} - -type SamplingManagerProcessor struct { - processorMap map[string]thrift.TProcessorFunction - handler SamplingManager -} - -func (p *SamplingManagerProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { - p.processorMap[key] = processor -} - -func (p *SamplingManagerProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { - processor, ok = p.processorMap[key] - return processor, ok -} - -func (p *SamplingManagerProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { - return p.processorMap -} - -func NewSamplingManagerProcessor(handler SamplingManager) *SamplingManagerProcessor { - - self3 := &SamplingManagerProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} - self3.processorMap["getSamplingStrategy"] = &samplingManagerProcessorGetSamplingStrategy{handler: handler} - return self3 -} - -func (p *SamplingManagerProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - name, _, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return false, err - } - if processor, ok := p.GetProcessorFunction(name); ok { - return processor.Process(seqId, iprot, oprot) - } - iprot.Skip(thrift.STRUCT) - iprot.ReadMessageEnd() - x4 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) - oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) - x4.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, x4 - -} - -type samplingManagerProcessorGetSamplingStrategy struct { - handler SamplingManager -} - -func (p *samplingManagerProcessorGetSamplingStrategy) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - args := SamplingManagerGetSamplingStrategyArgs{} - if err = args.Read(iprot); err != nil { - iprot.ReadMessageEnd() - x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) - oprot.WriteMessageBegin("getSamplingStrategy", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, err - } - - iprot.ReadMessageEnd() - result := SamplingManagerGetSamplingStrategyResult{} - var retval *SamplingStrategyResponse - var err2 error - if retval, err2 = p.handler.GetSamplingStrategy(args.ServiceName); err2 != nil { - x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing getSamplingStrategy: "+err2.Error()) - oprot.WriteMessageBegin("getSamplingStrategy", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return true, err2 - } else { - result.Success = retval - } - if err2 = oprot.WriteMessageBegin("getSamplingStrategy", thrift.REPLY, seqId); err2 != nil { - err = err2 - } - if err2 = result.Write(oprot); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.Flush(); err == nil && err2 != nil { - err = err2 - } - if err != nil { - return - } - return true, err -} - -// HELPER FUNCTIONS AND STRUCTURES - -// Attributes: -// - ServiceName -type SamplingManagerGetSamplingStrategyArgs struct { - ServiceName string `thrift:"serviceName,1" json:"serviceName"` -} - -func NewSamplingManagerGetSamplingStrategyArgs() *SamplingManagerGetSamplingStrategyArgs { - return &SamplingManagerGetSamplingStrategyArgs{} -} - -func (p *SamplingManagerGetSamplingStrategyArgs) GetServiceName() string { - return p.ServiceName -} -func (p *SamplingManagerGetSamplingStrategyArgs) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *SamplingManagerGetSamplingStrategyArgs) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.ServiceName = v - } - return nil -} - -func (p *SamplingManagerGetSamplingStrategyArgs) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("getSamplingStrategy_args"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *SamplingManagerGetSamplingStrategyArgs) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("serviceName", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:serviceName: ", p), err) - } - if err := oprot.WriteString(string(p.ServiceName)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.serviceName (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:serviceName: ", p), err) - } - return err -} - -func (p *SamplingManagerGetSamplingStrategyArgs) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("SamplingManagerGetSamplingStrategyArgs(%+v)", *p) -} - -// Attributes: -// - Success -type SamplingManagerGetSamplingStrategyResult struct { - Success *SamplingStrategyResponse `thrift:"success,0" json:"success,omitempty"` -} - -func NewSamplingManagerGetSamplingStrategyResult() *SamplingManagerGetSamplingStrategyResult { - return &SamplingManagerGetSamplingStrategyResult{} -} - -var SamplingManagerGetSamplingStrategyResult_Success_DEFAULT *SamplingStrategyResponse - -func (p *SamplingManagerGetSamplingStrategyResult) GetSuccess() *SamplingStrategyResponse { - if !p.IsSetSuccess() { - return SamplingManagerGetSamplingStrategyResult_Success_DEFAULT - } - return p.Success -} -func (p *SamplingManagerGetSamplingStrategyResult) IsSetSuccess() bool { - return p.Success != nil -} - -func (p *SamplingManagerGetSamplingStrategyResult) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 0: - if err := p.readField0(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *SamplingManagerGetSamplingStrategyResult) readField0(iprot thrift.TProtocol) error { - p.Success = &SamplingStrategyResponse{} - if err := p.Success.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Success), err) - } - return nil -} - -func (p *SamplingManagerGetSamplingStrategyResult) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("getSamplingStrategy_result"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField0(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *SamplingManagerGetSamplingStrategyResult) writeField0(oprot thrift.TProtocol) (err error) { - if p.IsSetSuccess() { - if err := oprot.WriteFieldBegin("success", thrift.STRUCT, 0); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) - } - if err := p.Success.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Success), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) - } - } - return err -} - -func (p *SamplingManagerGetSamplingStrategyResult) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("SamplingManagerGetSamplingStrategyResult(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/ttypes.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/ttypes.go deleted file mode 100644 index 9abaf0542d40..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/sampling/ttypes.go +++ /dev/null @@ -1,873 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package sampling - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -var GoUnusedProtection__ int - -type SamplingStrategyType int64 - -const ( - SamplingStrategyType_PROBABILISTIC SamplingStrategyType = 0 - SamplingStrategyType_RATE_LIMITING SamplingStrategyType = 1 -) - -func (p SamplingStrategyType) String() string { - switch p { - case SamplingStrategyType_PROBABILISTIC: - return "PROBABILISTIC" - case SamplingStrategyType_RATE_LIMITING: - return "RATE_LIMITING" - } - return "" -} - -func SamplingStrategyTypeFromString(s string) (SamplingStrategyType, error) { - switch s { - case "PROBABILISTIC": - return SamplingStrategyType_PROBABILISTIC, nil - case "RATE_LIMITING": - return SamplingStrategyType_RATE_LIMITING, nil - } - return SamplingStrategyType(0), fmt.Errorf("not a valid SamplingStrategyType string") -} - -func SamplingStrategyTypePtr(v SamplingStrategyType) *SamplingStrategyType { return &v } - -func (p SamplingStrategyType) MarshalText() ([]byte, error) { - return []byte(p.String()), nil -} - -func (p *SamplingStrategyType) UnmarshalText(text []byte) error { - q, err := SamplingStrategyTypeFromString(string(text)) - if err != nil { - return err - } - *p = q - return nil -} - -// Attributes: -// - SamplingRate -type ProbabilisticSamplingStrategy struct { - SamplingRate float64 `thrift:"samplingRate,1,required" json:"samplingRate"` -} - -func NewProbabilisticSamplingStrategy() *ProbabilisticSamplingStrategy { - return &ProbabilisticSamplingStrategy{} -} - -func (p *ProbabilisticSamplingStrategy) GetSamplingRate() float64 { - return p.SamplingRate -} -func (p *ProbabilisticSamplingStrategy) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetSamplingRate bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetSamplingRate = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetSamplingRate { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field SamplingRate is not set")) - } - return nil -} - -func (p *ProbabilisticSamplingStrategy) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadDouble(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.SamplingRate = v - } - return nil -} - -func (p *ProbabilisticSamplingStrategy) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("ProbabilisticSamplingStrategy"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *ProbabilisticSamplingStrategy) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("samplingRate", thrift.DOUBLE, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:samplingRate: ", p), err) - } - if err := oprot.WriteDouble(float64(p.SamplingRate)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.samplingRate (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:samplingRate: ", p), err) - } - return err -} - -func (p *ProbabilisticSamplingStrategy) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("ProbabilisticSamplingStrategy(%+v)", *p) -} - -// Attributes: -// - MaxTracesPerSecond -type RateLimitingSamplingStrategy struct { - MaxTracesPerSecond int16 `thrift:"maxTracesPerSecond,1,required" json:"maxTracesPerSecond"` -} - -func NewRateLimitingSamplingStrategy() *RateLimitingSamplingStrategy { - return &RateLimitingSamplingStrategy{} -} - -func (p *RateLimitingSamplingStrategy) GetMaxTracesPerSecond() int16 { - return p.MaxTracesPerSecond -} -func (p *RateLimitingSamplingStrategy) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetMaxTracesPerSecond bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetMaxTracesPerSecond = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetMaxTracesPerSecond { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field MaxTracesPerSecond is not set")) - } - return nil -} - -func (p *RateLimitingSamplingStrategy) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI16(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.MaxTracesPerSecond = v - } - return nil -} - -func (p *RateLimitingSamplingStrategy) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("RateLimitingSamplingStrategy"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *RateLimitingSamplingStrategy) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("maxTracesPerSecond", thrift.I16, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:maxTracesPerSecond: ", p), err) - } - if err := oprot.WriteI16(int16(p.MaxTracesPerSecond)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.maxTracesPerSecond (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:maxTracesPerSecond: ", p), err) - } - return err -} - -func (p *RateLimitingSamplingStrategy) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("RateLimitingSamplingStrategy(%+v)", *p) -} - -// Attributes: -// - Operation -// - ProbabilisticSampling -type OperationSamplingStrategy struct { - Operation string `thrift:"operation,1,required" json:"operation"` - ProbabilisticSampling *ProbabilisticSamplingStrategy `thrift:"probabilisticSampling,2,required" json:"probabilisticSampling"` -} - -func NewOperationSamplingStrategy() *OperationSamplingStrategy { - return &OperationSamplingStrategy{} -} - -func (p *OperationSamplingStrategy) GetOperation() string { - return p.Operation -} - -var OperationSamplingStrategy_ProbabilisticSampling_DEFAULT *ProbabilisticSamplingStrategy - -func (p *OperationSamplingStrategy) GetProbabilisticSampling() *ProbabilisticSamplingStrategy { - if !p.IsSetProbabilisticSampling() { - return OperationSamplingStrategy_ProbabilisticSampling_DEFAULT - } - return p.ProbabilisticSampling -} -func (p *OperationSamplingStrategy) IsSetProbabilisticSampling() bool { - return p.ProbabilisticSampling != nil -} - -func (p *OperationSamplingStrategy) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetOperation bool = false - var issetProbabilisticSampling bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetOperation = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetProbabilisticSampling = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetOperation { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Operation is not set")) - } - if !issetProbabilisticSampling { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field ProbabilisticSampling is not set")) - } - return nil -} - -func (p *OperationSamplingStrategy) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Operation = v - } - return nil -} - -func (p *OperationSamplingStrategy) readField2(iprot thrift.TProtocol) error { - p.ProbabilisticSampling = &ProbabilisticSamplingStrategy{} - if err := p.ProbabilisticSampling.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.ProbabilisticSampling), err) - } - return nil -} - -func (p *OperationSamplingStrategy) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("OperationSamplingStrategy"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *OperationSamplingStrategy) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("operation", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:operation: ", p), err) - } - if err := oprot.WriteString(string(p.Operation)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.operation (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:operation: ", p), err) - } - return err -} - -func (p *OperationSamplingStrategy) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("probabilisticSampling", thrift.STRUCT, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:probabilisticSampling: ", p), err) - } - if err := p.ProbabilisticSampling.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.ProbabilisticSampling), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:probabilisticSampling: ", p), err) - } - return err -} - -func (p *OperationSamplingStrategy) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("OperationSamplingStrategy(%+v)", *p) -} - -// Attributes: -// - DefaultSamplingProbability -// - DefaultLowerBoundTracesPerSecond -// - PerOperationStrategies -// - DefaultUpperBoundTracesPerSecond -type PerOperationSamplingStrategies struct { - DefaultSamplingProbability float64 `thrift:"defaultSamplingProbability,1,required" json:"defaultSamplingProbability"` - DefaultLowerBoundTracesPerSecond float64 `thrift:"defaultLowerBoundTracesPerSecond,2,required" json:"defaultLowerBoundTracesPerSecond"` - PerOperationStrategies []*OperationSamplingStrategy `thrift:"perOperationStrategies,3,required" json:"perOperationStrategies"` - DefaultUpperBoundTracesPerSecond *float64 `thrift:"defaultUpperBoundTracesPerSecond,4" json:"defaultUpperBoundTracesPerSecond,omitempty"` -} - -func NewPerOperationSamplingStrategies() *PerOperationSamplingStrategies { - return &PerOperationSamplingStrategies{} -} - -func (p *PerOperationSamplingStrategies) GetDefaultSamplingProbability() float64 { - return p.DefaultSamplingProbability -} - -func (p *PerOperationSamplingStrategies) GetDefaultLowerBoundTracesPerSecond() float64 { - return p.DefaultLowerBoundTracesPerSecond -} - -func (p *PerOperationSamplingStrategies) GetPerOperationStrategies() []*OperationSamplingStrategy { - return p.PerOperationStrategies -} - -var PerOperationSamplingStrategies_DefaultUpperBoundTracesPerSecond_DEFAULT float64 - -func (p *PerOperationSamplingStrategies) GetDefaultUpperBoundTracesPerSecond() float64 { - if !p.IsSetDefaultUpperBoundTracesPerSecond() { - return PerOperationSamplingStrategies_DefaultUpperBoundTracesPerSecond_DEFAULT - } - return *p.DefaultUpperBoundTracesPerSecond -} -func (p *PerOperationSamplingStrategies) IsSetDefaultUpperBoundTracesPerSecond() bool { - return p.DefaultUpperBoundTracesPerSecond != nil -} - -func (p *PerOperationSamplingStrategies) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetDefaultSamplingProbability bool = false - var issetDefaultLowerBoundTracesPerSecond bool = false - var issetPerOperationStrategies bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetDefaultSamplingProbability = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - issetDefaultLowerBoundTracesPerSecond = true - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - issetPerOperationStrategies = true - case 4: - if err := p.readField4(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetDefaultSamplingProbability { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DefaultSamplingProbability is not set")) - } - if !issetDefaultLowerBoundTracesPerSecond { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field DefaultLowerBoundTracesPerSecond is not set")) - } - if !issetPerOperationStrategies { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field PerOperationStrategies is not set")) - } - return nil -} - -func (p *PerOperationSamplingStrategies) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadDouble(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.DefaultSamplingProbability = v - } - return nil -} - -func (p *PerOperationSamplingStrategies) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadDouble(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - p.DefaultLowerBoundTracesPerSecond = v - } - return nil -} - -func (p *PerOperationSamplingStrategies) readField3(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*OperationSamplingStrategy, 0, size) - p.PerOperationStrategies = tSlice - for i := 0; i < size; i++ { - _elem0 := &OperationSamplingStrategy{} - if err := _elem0.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem0), err) - } - p.PerOperationStrategies = append(p.PerOperationStrategies, _elem0) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *PerOperationSamplingStrategies) readField4(iprot thrift.TProtocol) error { - if v, err := iprot.ReadDouble(); err != nil { - return thrift.PrependError("error reading field 4: ", err) - } else { - p.DefaultUpperBoundTracesPerSecond = &v - } - return nil -} - -func (p *PerOperationSamplingStrategies) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("PerOperationSamplingStrategies"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := p.writeField4(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *PerOperationSamplingStrategies) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("defaultSamplingProbability", thrift.DOUBLE, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:defaultSamplingProbability: ", p), err) - } - if err := oprot.WriteDouble(float64(p.DefaultSamplingProbability)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.defaultSamplingProbability (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:defaultSamplingProbability: ", p), err) - } - return err -} - -func (p *PerOperationSamplingStrategies) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("defaultLowerBoundTracesPerSecond", thrift.DOUBLE, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:defaultLowerBoundTracesPerSecond: ", p), err) - } - if err := oprot.WriteDouble(float64(p.DefaultLowerBoundTracesPerSecond)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.defaultLowerBoundTracesPerSecond (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:defaultLowerBoundTracesPerSecond: ", p), err) - } - return err -} - -func (p *PerOperationSamplingStrategies) writeField3(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("perOperationStrategies", thrift.LIST, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:perOperationStrategies: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.PerOperationStrategies)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.PerOperationStrategies { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:perOperationStrategies: ", p), err) - } - return err -} - -func (p *PerOperationSamplingStrategies) writeField4(oprot thrift.TProtocol) (err error) { - if p.IsSetDefaultUpperBoundTracesPerSecond() { - if err := oprot.WriteFieldBegin("defaultUpperBoundTracesPerSecond", thrift.DOUBLE, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:defaultUpperBoundTracesPerSecond: ", p), err) - } - if err := oprot.WriteDouble(float64(*p.DefaultUpperBoundTracesPerSecond)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.defaultUpperBoundTracesPerSecond (4) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:defaultUpperBoundTracesPerSecond: ", p), err) - } - } - return err -} - -func (p *PerOperationSamplingStrategies) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("PerOperationSamplingStrategies(%+v)", *p) -} - -// Attributes: -// - StrategyType -// - ProbabilisticSampling -// - RateLimitingSampling -// - OperationSampling -type SamplingStrategyResponse struct { - StrategyType SamplingStrategyType `thrift:"strategyType,1,required" json:"strategyType"` - ProbabilisticSampling *ProbabilisticSamplingStrategy `thrift:"probabilisticSampling,2" json:"probabilisticSampling,omitempty"` - RateLimitingSampling *RateLimitingSamplingStrategy `thrift:"rateLimitingSampling,3" json:"rateLimitingSampling,omitempty"` - OperationSampling *PerOperationSamplingStrategies `thrift:"operationSampling,4" json:"operationSampling,omitempty"` -} - -func NewSamplingStrategyResponse() *SamplingStrategyResponse { - return &SamplingStrategyResponse{} -} - -func (p *SamplingStrategyResponse) GetStrategyType() SamplingStrategyType { - return p.StrategyType -} - -var SamplingStrategyResponse_ProbabilisticSampling_DEFAULT *ProbabilisticSamplingStrategy - -func (p *SamplingStrategyResponse) GetProbabilisticSampling() *ProbabilisticSamplingStrategy { - if !p.IsSetProbabilisticSampling() { - return SamplingStrategyResponse_ProbabilisticSampling_DEFAULT - } - return p.ProbabilisticSampling -} - -var SamplingStrategyResponse_RateLimitingSampling_DEFAULT *RateLimitingSamplingStrategy - -func (p *SamplingStrategyResponse) GetRateLimitingSampling() *RateLimitingSamplingStrategy { - if !p.IsSetRateLimitingSampling() { - return SamplingStrategyResponse_RateLimitingSampling_DEFAULT - } - return p.RateLimitingSampling -} - -var SamplingStrategyResponse_OperationSampling_DEFAULT *PerOperationSamplingStrategies - -func (p *SamplingStrategyResponse) GetOperationSampling() *PerOperationSamplingStrategies { - if !p.IsSetOperationSampling() { - return SamplingStrategyResponse_OperationSampling_DEFAULT - } - return p.OperationSampling -} -func (p *SamplingStrategyResponse) IsSetProbabilisticSampling() bool { - return p.ProbabilisticSampling != nil -} - -func (p *SamplingStrategyResponse) IsSetRateLimitingSampling() bool { - return p.RateLimitingSampling != nil -} - -func (p *SamplingStrategyResponse) IsSetOperationSampling() bool { - return p.OperationSampling != nil -} - -func (p *SamplingStrategyResponse) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetStrategyType bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetStrategyType = true - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - case 4: - if err := p.readField4(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetStrategyType { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field StrategyType is not set")) - } - return nil -} - -func (p *SamplingStrategyResponse) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - temp := SamplingStrategyType(v) - p.StrategyType = temp - } - return nil -} - -func (p *SamplingStrategyResponse) readField2(iprot thrift.TProtocol) error { - p.ProbabilisticSampling = &ProbabilisticSamplingStrategy{} - if err := p.ProbabilisticSampling.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.ProbabilisticSampling), err) - } - return nil -} - -func (p *SamplingStrategyResponse) readField3(iprot thrift.TProtocol) error { - p.RateLimitingSampling = &RateLimitingSamplingStrategy{} - if err := p.RateLimitingSampling.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.RateLimitingSampling), err) - } - return nil -} - -func (p *SamplingStrategyResponse) readField4(iprot thrift.TProtocol) error { - p.OperationSampling = &PerOperationSamplingStrategies{} - if err := p.OperationSampling.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.OperationSampling), err) - } - return nil -} - -func (p *SamplingStrategyResponse) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("SamplingStrategyResponse"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := p.writeField4(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *SamplingStrategyResponse) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("strategyType", thrift.I32, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:strategyType: ", p), err) - } - if err := oprot.WriteI32(int32(p.StrategyType)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.strategyType (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:strategyType: ", p), err) - } - return err -} - -func (p *SamplingStrategyResponse) writeField2(oprot thrift.TProtocol) (err error) { - if p.IsSetProbabilisticSampling() { - if err := oprot.WriteFieldBegin("probabilisticSampling", thrift.STRUCT, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:probabilisticSampling: ", p), err) - } - if err := p.ProbabilisticSampling.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.ProbabilisticSampling), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:probabilisticSampling: ", p), err) - } - } - return err -} - -func (p *SamplingStrategyResponse) writeField3(oprot thrift.TProtocol) (err error) { - if p.IsSetRateLimitingSampling() { - if err := oprot.WriteFieldBegin("rateLimitingSampling", thrift.STRUCT, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:rateLimitingSampling: ", p), err) - } - if err := p.RateLimitingSampling.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.RateLimitingSampling), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:rateLimitingSampling: ", p), err) - } - } - return err -} - -func (p *SamplingStrategyResponse) writeField4(oprot thrift.TProtocol) (err error) { - if p.IsSetOperationSampling() { - if err := oprot.WriteFieldBegin("operationSampling", thrift.STRUCT, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:operationSampling: ", p), err) - } - if err := p.OperationSampling.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.OperationSampling), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:operationSampling: ", p), err) - } - } - return err -} - -func (p *SamplingStrategyResponse) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("SamplingStrategyResponse(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/constants.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/constants.go deleted file mode 100644 index f05144bfc694..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/constants.go +++ /dev/null @@ -1,32 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package zipkincore - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -const CLIENT_SEND = "cs" -const CLIENT_RECV = "cr" -const SERVER_SEND = "ss" -const SERVER_RECV = "sr" -const WIRE_SEND = "ws" -const WIRE_RECV = "wr" -const CLIENT_SEND_FRAGMENT = "csf" -const CLIENT_RECV_FRAGMENT = "crf" -const SERVER_SEND_FRAGMENT = "ssf" -const SERVER_RECV_FRAGMENT = "srf" -const LOCAL_COMPONENT = "lc" -const CLIENT_ADDR = "ca" -const SERVER_ADDR = "sa" - -func init() { -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/ttypes.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/ttypes.go deleted file mode 100644 index 34b2b267eb52..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/ttypes.go +++ /dev/null @@ -1,1247 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package zipkincore - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -var GoUnusedProtection__ int - -type AnnotationType int64 - -const ( - AnnotationType_BOOL AnnotationType = 0 - AnnotationType_BYTES AnnotationType = 1 - AnnotationType_I16 AnnotationType = 2 - AnnotationType_I32 AnnotationType = 3 - AnnotationType_I64 AnnotationType = 4 - AnnotationType_DOUBLE AnnotationType = 5 - AnnotationType_STRING AnnotationType = 6 -) - -func (p AnnotationType) String() string { - switch p { - case AnnotationType_BOOL: - return "BOOL" - case AnnotationType_BYTES: - return "BYTES" - case AnnotationType_I16: - return "I16" - case AnnotationType_I32: - return "I32" - case AnnotationType_I64: - return "I64" - case AnnotationType_DOUBLE: - return "DOUBLE" - case AnnotationType_STRING: - return "STRING" - } - return "" -} - -func AnnotationTypeFromString(s string) (AnnotationType, error) { - switch s { - case "BOOL": - return AnnotationType_BOOL, nil - case "BYTES": - return AnnotationType_BYTES, nil - case "I16": - return AnnotationType_I16, nil - case "I32": - return AnnotationType_I32, nil - case "I64": - return AnnotationType_I64, nil - case "DOUBLE": - return AnnotationType_DOUBLE, nil - case "STRING": - return AnnotationType_STRING, nil - } - return AnnotationType(0), fmt.Errorf("not a valid AnnotationType string") -} - -func AnnotationTypePtr(v AnnotationType) *AnnotationType { return &v } - -func (p AnnotationType) MarshalText() ([]byte, error) { - return []byte(p.String()), nil -} - -func (p *AnnotationType) UnmarshalText(text []byte) error { - q, err := AnnotationTypeFromString(string(text)) - if err != nil { - return err - } - *p = q - return nil -} - -// Indicates the network context of a service recording an annotation with two -// exceptions. -// -// When a BinaryAnnotation, and key is CLIENT_ADDR or SERVER_ADDR, -// the endpoint indicates the source or destination of an RPC. This exception -// allows zipkin to display network context of uninstrumented services, or -// clients such as web browsers. -// -// Attributes: -// - Ipv4: IPv4 host address packed into 4 bytes. -// -// Ex for the ip 1.2.3.4, it would be (1 << 24) | (2 << 16) | (3 << 8) | 4 -// - Port: IPv4 port -// -// Note: this is to be treated as an unsigned integer, so watch for negatives. -// -// Conventionally, when the port isn't known, port = 0. -// - ServiceName: Service name in lowercase, such as "memcache" or "zipkin-web" -// -// Conventionally, when the service name isn't known, service_name = "unknown". -type Endpoint struct { - Ipv4 int32 `thrift:"ipv4,1" json:"ipv4"` - Port int16 `thrift:"port,2" json:"port"` - ServiceName string `thrift:"service_name,3" json:"service_name"` -} - -func NewEndpoint() *Endpoint { - return &Endpoint{} -} - -func (p *Endpoint) GetIpv4() int32 { - return p.Ipv4 -} - -func (p *Endpoint) GetPort() int16 { - return p.Port -} - -func (p *Endpoint) GetServiceName() string { - return p.ServiceName -} -func (p *Endpoint) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *Endpoint) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Ipv4 = v - } - return nil -} - -func (p *Endpoint) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI16(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - p.Port = v - } - return nil -} - -func (p *Endpoint) readField3(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 3: ", err) - } else { - p.ServiceName = v - } - return nil -} - -func (p *Endpoint) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Endpoint"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Endpoint) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("ipv4", thrift.I32, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:ipv4: ", p), err) - } - if err := oprot.WriteI32(int32(p.Ipv4)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.ipv4 (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:ipv4: ", p), err) - } - return err -} - -func (p *Endpoint) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("port", thrift.I16, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:port: ", p), err) - } - if err := oprot.WriteI16(int16(p.Port)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.port (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:port: ", p), err) - } - return err -} - -func (p *Endpoint) writeField3(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("service_name", thrift.STRING, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:service_name: ", p), err) - } - if err := oprot.WriteString(string(p.ServiceName)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.service_name (3) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:service_name: ", p), err) - } - return err -} - -func (p *Endpoint) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Endpoint(%+v)", *p) -} - -// An annotation is similar to a log statement. It includes a host field which -// allows these events to be attributed properly, and also aggregatable. -// -// Attributes: -// - Timestamp: Microseconds from epoch. -// -// This value should use the most precise value possible. For example, -// gettimeofday or syncing nanoTime against a tick of currentTimeMillis. -// - Value -// - Host: Always the host that recorded the event. By specifying the host you allow -// rollup of all events (such as client requests to a service) by IP address. -type Annotation struct { - Timestamp int64 `thrift:"timestamp,1" json:"timestamp"` - Value string `thrift:"value,2" json:"value"` - Host *Endpoint `thrift:"host,3" json:"host,omitempty"` -} - -func NewAnnotation() *Annotation { - return &Annotation{} -} - -func (p *Annotation) GetTimestamp() int64 { - return p.Timestamp -} - -func (p *Annotation) GetValue() string { - return p.Value -} - -var Annotation_Host_DEFAULT *Endpoint - -func (p *Annotation) GetHost() *Endpoint { - if !p.IsSetHost() { - return Annotation_Host_DEFAULT - } - return p.Host -} -func (p *Annotation) IsSetHost() bool { - return p.Host != nil -} - -func (p *Annotation) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *Annotation) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Timestamp = v - } - return nil -} - -func (p *Annotation) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - p.Value = v - } - return nil -} - -func (p *Annotation) readField3(iprot thrift.TProtocol) error { - p.Host = &Endpoint{} - if err := p.Host.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Host), err) - } - return nil -} - -func (p *Annotation) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Annotation"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Annotation) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("timestamp", thrift.I64, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:timestamp: ", p), err) - } - if err := oprot.WriteI64(int64(p.Timestamp)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.timestamp (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:timestamp: ", p), err) - } - return err -} - -func (p *Annotation) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("value", thrift.STRING, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:value: ", p), err) - } - if err := oprot.WriteString(string(p.Value)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.value (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:value: ", p), err) - } - return err -} - -func (p *Annotation) writeField3(oprot thrift.TProtocol) (err error) { - if p.IsSetHost() { - if err := oprot.WriteFieldBegin("host", thrift.STRUCT, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:host: ", p), err) - } - if err := p.Host.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Host), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:host: ", p), err) - } - } - return err -} - -func (p *Annotation) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Annotation(%+v)", *p) -} - -// Binary annotations are tags applied to a Span to give it context. For -// example, a binary annotation of "http.uri" could the path to a resource in a -// RPC call. -// -// Binary annotations of type STRING are always queryable, though more a -// historical implementation detail than a structural concern. -// -// Binary annotations can repeat, and vary on the host. Similar to Annotation, -// the host indicates who logged the event. This allows you to tell the -// difference between the client and server side of the same key. For example, -// the key "http.uri" might be different on the client and server side due to -// rewriting, like "/api/v1/myresource" vs "/myresource. Via the host field, -// you can see the different points of view, which often help in debugging. -// -// Attributes: -// - Key -// - Value -// - AnnotationType -// - Host: The host that recorded tag, which allows you to differentiate between -// multiple tags with the same key. There are two exceptions to this. -// -// When the key is CLIENT_ADDR or SERVER_ADDR, host indicates the source or -// destination of an RPC. This exception allows zipkin to display network -// context of uninstrumented services, or clients such as web browsers. -type BinaryAnnotation struct { - Key string `thrift:"key,1" json:"key"` - Value []byte `thrift:"value,2" json:"value"` - AnnotationType AnnotationType `thrift:"annotation_type,3" json:"annotation_type"` - Host *Endpoint `thrift:"host,4" json:"host,omitempty"` -} - -func NewBinaryAnnotation() *BinaryAnnotation { - return &BinaryAnnotation{} -} - -func (p *BinaryAnnotation) GetKey() string { - return p.Key -} - -func (p *BinaryAnnotation) GetValue() []byte { - return p.Value -} - -func (p *BinaryAnnotation) GetAnnotationType() AnnotationType { - return p.AnnotationType -} - -var BinaryAnnotation_Host_DEFAULT *Endpoint - -func (p *BinaryAnnotation) GetHost() *Endpoint { - if !p.IsSetHost() { - return BinaryAnnotation_Host_DEFAULT - } - return p.Host -} -func (p *BinaryAnnotation) IsSetHost() bool { - return p.Host != nil -} - -func (p *BinaryAnnotation) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - case 2: - if err := p.readField2(iprot); err != nil { - return err - } - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - case 4: - if err := p.readField4(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *BinaryAnnotation) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Key = v - } - return nil -} - -func (p *BinaryAnnotation) readField2(iprot thrift.TProtocol) error { - if v, err := iprot.ReadBinary(); err != nil { - return thrift.PrependError("error reading field 2: ", err) - } else { - p.Value = v - } - return nil -} - -func (p *BinaryAnnotation) readField3(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI32(); err != nil { - return thrift.PrependError("error reading field 3: ", err) - } else { - temp := AnnotationType(v) - p.AnnotationType = temp - } - return nil -} - -func (p *BinaryAnnotation) readField4(iprot thrift.TProtocol) error { - p.Host = &Endpoint{} - if err := p.Host.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", p.Host), err) - } - return nil -} - -func (p *BinaryAnnotation) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("BinaryAnnotation"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField2(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := p.writeField4(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *BinaryAnnotation) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("key", thrift.STRING, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:key: ", p), err) - } - if err := oprot.WriteString(string(p.Key)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.key (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:key: ", p), err) - } - return err -} - -func (p *BinaryAnnotation) writeField2(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("value", thrift.STRING, 2); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:value: ", p), err) - } - if err := oprot.WriteBinary(p.Value); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.value (2) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 2:value: ", p), err) - } - return err -} - -func (p *BinaryAnnotation) writeField3(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("annotation_type", thrift.I32, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:annotation_type: ", p), err) - } - if err := oprot.WriteI32(int32(p.AnnotationType)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.annotation_type (3) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:annotation_type: ", p), err) - } - return err -} - -func (p *BinaryAnnotation) writeField4(oprot thrift.TProtocol) (err error) { - if p.IsSetHost() { - if err := oprot.WriteFieldBegin("host", thrift.STRUCT, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:host: ", p), err) - } - if err := p.Host.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", p.Host), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:host: ", p), err) - } - } - return err -} - -func (p *BinaryAnnotation) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("BinaryAnnotation(%+v)", *p) -} - -// A trace is a series of spans (often RPC calls) which form a latency tree. -// -// The root span is where trace_id = id and parent_id = Nil. The root span is -// usually the longest interval in the trace, starting with a SERVER_RECV -// annotation and ending with a SERVER_SEND. -// -// Attributes: -// - TraceID -// - Name: Span name in lowercase, rpc method for example -// -// Conventionally, when the span name isn't known, name = "unknown". -// - ID -// - ParentID -// - Annotations -// - BinaryAnnotations -// - Debug -// - Timestamp: Microseconds from epoch of the creation of this span. -// -// This value should be set directly by instrumentation, using the most -// precise value possible. For example, gettimeofday or syncing nanoTime -// against a tick of currentTimeMillis. -// -// For compatibilty with instrumentation that precede this field, collectors -// or span stores can derive this via Annotation.timestamp. -// For example, SERVER_RECV.timestamp or CLIENT_SEND.timestamp. -// -// This field is optional for compatibility with old data: first-party span -// stores are expected to support this at time of introduction. -// - Duration: Measurement of duration in microseconds, used to support queries. -// -// This value should be set directly, where possible. Doing so encourages -// precise measurement decoupled from problems of clocks, such as skew or NTP -// updates causing time to move backwards. -// -// For compatibilty with instrumentation that precede this field, collectors -// or span stores can derive this by subtracting Annotation.timestamp. -// For example, SERVER_SEND.timestamp - SERVER_RECV.timestamp. -// -// If this field is persisted as unset, zipkin will continue to work, except -// duration query support will be implementation-specific. Similarly, setting -// this field non-atomically is implementation-specific. -// -// This field is i64 vs i32 to support spans longer than 35 minutes. -type Span struct { - TraceID int64 `thrift:"trace_id,1" json:"trace_id"` - // unused field # 2 - Name string `thrift:"name,3" json:"name"` - ID int64 `thrift:"id,4" json:"id"` - ParentID *int64 `thrift:"parent_id,5" json:"parent_id,omitempty"` - Annotations []*Annotation `thrift:"annotations,6" json:"annotations"` - // unused field # 7 - BinaryAnnotations []*BinaryAnnotation `thrift:"binary_annotations,8" json:"binary_annotations"` - Debug bool `thrift:"debug,9" json:"debug,omitempty"` - Timestamp *int64 `thrift:"timestamp,10" json:"timestamp,omitempty"` - Duration *int64 `thrift:"duration,11" json:"duration,omitempty"` -} - -func NewSpan() *Span { - return &Span{} -} - -func (p *Span) GetTraceID() int64 { - return p.TraceID -} - -func (p *Span) GetName() string { - return p.Name -} - -func (p *Span) GetID() int64 { - return p.ID -} - -var Span_ParentID_DEFAULT int64 - -func (p *Span) GetParentID() int64 { - if !p.IsSetParentID() { - return Span_ParentID_DEFAULT - } - return *p.ParentID -} - -func (p *Span) GetAnnotations() []*Annotation { - return p.Annotations -} - -func (p *Span) GetBinaryAnnotations() []*BinaryAnnotation { - return p.BinaryAnnotations -} - -var Span_Debug_DEFAULT bool = false - -func (p *Span) GetDebug() bool { - return p.Debug -} - -var Span_Timestamp_DEFAULT int64 - -func (p *Span) GetTimestamp() int64 { - if !p.IsSetTimestamp() { - return Span_Timestamp_DEFAULT - } - return *p.Timestamp -} - -var Span_Duration_DEFAULT int64 - -func (p *Span) GetDuration() int64 { - if !p.IsSetDuration() { - return Span_Duration_DEFAULT - } - return *p.Duration -} -func (p *Span) IsSetParentID() bool { - return p.ParentID != nil -} - -func (p *Span) IsSetDebug() bool { - return p.Debug != Span_Debug_DEFAULT -} - -func (p *Span) IsSetTimestamp() bool { - return p.Timestamp != nil -} - -func (p *Span) IsSetDuration() bool { - return p.Duration != nil -} - -func (p *Span) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - case 3: - if err := p.readField3(iprot); err != nil { - return err - } - case 4: - if err := p.readField4(iprot); err != nil { - return err - } - case 5: - if err := p.readField5(iprot); err != nil { - return err - } - case 6: - if err := p.readField6(iprot); err != nil { - return err - } - case 8: - if err := p.readField8(iprot); err != nil { - return err - } - case 9: - if err := p.readField9(iprot); err != nil { - return err - } - case 10: - if err := p.readField10(iprot); err != nil { - return err - } - case 11: - if err := p.readField11(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *Span) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.TraceID = v - } - return nil -} - -func (p *Span) readField3(iprot thrift.TProtocol) error { - if v, err := iprot.ReadString(); err != nil { - return thrift.PrependError("error reading field 3: ", err) - } else { - p.Name = v - } - return nil -} - -func (p *Span) readField4(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 4: ", err) - } else { - p.ID = v - } - return nil -} - -func (p *Span) readField5(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 5: ", err) - } else { - p.ParentID = &v - } - return nil -} - -func (p *Span) readField6(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Annotation, 0, size) - p.Annotations = tSlice - for i := 0; i < size; i++ { - _elem0 := &Annotation{} - if err := _elem0.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem0), err) - } - p.Annotations = append(p.Annotations, _elem0) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Span) readField8(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*BinaryAnnotation, 0, size) - p.BinaryAnnotations = tSlice - for i := 0; i < size; i++ { - _elem1 := &BinaryAnnotation{} - if err := _elem1.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem1), err) - } - p.BinaryAnnotations = append(p.BinaryAnnotations, _elem1) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *Span) readField9(iprot thrift.TProtocol) error { - if v, err := iprot.ReadBool(); err != nil { - return thrift.PrependError("error reading field 9: ", err) - } else { - p.Debug = v - } - return nil -} - -func (p *Span) readField10(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 10: ", err) - } else { - p.Timestamp = &v - } - return nil -} - -func (p *Span) readField11(iprot thrift.TProtocol) error { - if v, err := iprot.ReadI64(); err != nil { - return thrift.PrependError("error reading field 11: ", err) - } else { - p.Duration = &v - } - return nil -} - -func (p *Span) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Span"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := p.writeField3(oprot); err != nil { - return err - } - if err := p.writeField4(oprot); err != nil { - return err - } - if err := p.writeField5(oprot); err != nil { - return err - } - if err := p.writeField6(oprot); err != nil { - return err - } - if err := p.writeField8(oprot); err != nil { - return err - } - if err := p.writeField9(oprot); err != nil { - return err - } - if err := p.writeField10(oprot); err != nil { - return err - } - if err := p.writeField11(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Span) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("trace_id", thrift.I64, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:trace_id: ", p), err) - } - if err := oprot.WriteI64(int64(p.TraceID)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.trace_id (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:trace_id: ", p), err) - } - return err -} - -func (p *Span) writeField3(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("name", thrift.STRING, 3); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 3:name: ", p), err) - } - if err := oprot.WriteString(string(p.Name)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.name (3) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 3:name: ", p), err) - } - return err -} - -func (p *Span) writeField4(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("id", thrift.I64, 4); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 4:id: ", p), err) - } - if err := oprot.WriteI64(int64(p.ID)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.id (4) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 4:id: ", p), err) - } - return err -} - -func (p *Span) writeField5(oprot thrift.TProtocol) (err error) { - if p.IsSetParentID() { - if err := oprot.WriteFieldBegin("parent_id", thrift.I64, 5); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 5:parent_id: ", p), err) - } - if err := oprot.WriteI64(int64(*p.ParentID)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.parent_id (5) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 5:parent_id: ", p), err) - } - } - return err -} - -func (p *Span) writeField6(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("annotations", thrift.LIST, 6); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 6:annotations: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Annotations)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Annotations { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 6:annotations: ", p), err) - } - return err -} - -func (p *Span) writeField8(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("binary_annotations", thrift.LIST, 8); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 8:binary_annotations: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.BinaryAnnotations)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.BinaryAnnotations { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 8:binary_annotations: ", p), err) - } - return err -} - -func (p *Span) writeField9(oprot thrift.TProtocol) (err error) { - if p.IsSetDebug() { - if err := oprot.WriteFieldBegin("debug", thrift.BOOL, 9); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 9:debug: ", p), err) - } - if err := oprot.WriteBool(bool(p.Debug)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.debug (9) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 9:debug: ", p), err) - } - } - return err -} - -func (p *Span) writeField10(oprot thrift.TProtocol) (err error) { - if p.IsSetTimestamp() { - if err := oprot.WriteFieldBegin("timestamp", thrift.I64, 10); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 10:timestamp: ", p), err) - } - if err := oprot.WriteI64(int64(*p.Timestamp)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.timestamp (10) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 10:timestamp: ", p), err) - } - } - return err -} - -func (p *Span) writeField11(oprot thrift.TProtocol) (err error) { - if p.IsSetDuration() { - if err := oprot.WriteFieldBegin("duration", thrift.I64, 11); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 11:duration: ", p), err) - } - if err := oprot.WriteI64(int64(*p.Duration)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.duration (11) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 11:duration: ", p), err) - } - } - return err -} - -func (p *Span) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Span(%+v)", *p) -} - -// Attributes: -// - Ok -type Response struct { - Ok bool `thrift:"ok,1,required" json:"ok"` -} - -func NewResponse() *Response { - return &Response{} -} - -func (p *Response) GetOk() bool { - return p.Ok -} -func (p *Response) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - var issetOk bool = false - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - issetOk = true - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - if !issetOk { - return thrift.NewTProtocolExceptionWithType(thrift.INVALID_DATA, fmt.Errorf("Required field Ok is not set")) - } - return nil -} - -func (p *Response) readField1(iprot thrift.TProtocol) error { - if v, err := iprot.ReadBool(); err != nil { - return thrift.PrependError("error reading field 1: ", err) - } else { - p.Ok = v - } - return nil -} - -func (p *Response) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("Response"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *Response) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("ok", thrift.BOOL, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:ok: ", p), err) - } - if err := oprot.WriteBool(bool(p.Ok)); err != nil { - return thrift.PrependError(fmt.Sprintf("%T.ok (1) field write error: ", p), err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:ok: ", p), err) - } - return err -} - -func (p *Response) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("Response(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/zipkincollector.go b/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/zipkincollector.go deleted file mode 100644 index 417e883d0e31..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift-gen/zipkincore/zipkincollector.go +++ /dev/null @@ -1,446 +0,0 @@ -// Autogenerated by Thrift Compiler (0.9.3) -// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING - -package zipkincore - -import ( - "bytes" - "fmt" - "github.com/uber/jaeger-client-go/thrift" -) - -// (needed to ensure safety because of naive import list construction.) -var _ = thrift.ZERO -var _ = fmt.Printf -var _ = bytes.Equal - -type ZipkinCollector interface { - // Parameters: - // - Spans - SubmitZipkinBatch(spans []*Span) (r []*Response, err error) -} - -type ZipkinCollectorClient struct { - Transport thrift.TTransport - ProtocolFactory thrift.TProtocolFactory - InputProtocol thrift.TProtocol - OutputProtocol thrift.TProtocol - SeqId int32 -} - -func NewZipkinCollectorClientFactory(t thrift.TTransport, f thrift.TProtocolFactory) *ZipkinCollectorClient { - return &ZipkinCollectorClient{Transport: t, - ProtocolFactory: f, - InputProtocol: f.GetProtocol(t), - OutputProtocol: f.GetProtocol(t), - SeqId: 0, - } -} - -func NewZipkinCollectorClientProtocol(t thrift.TTransport, iprot thrift.TProtocol, oprot thrift.TProtocol) *ZipkinCollectorClient { - return &ZipkinCollectorClient{Transport: t, - ProtocolFactory: nil, - InputProtocol: iprot, - OutputProtocol: oprot, - SeqId: 0, - } -} - -// Parameters: -// - Spans -func (p *ZipkinCollectorClient) SubmitZipkinBatch(spans []*Span) (r []*Response, err error) { - if err = p.sendSubmitZipkinBatch(spans); err != nil { - return - } - return p.recvSubmitZipkinBatch() -} - -func (p *ZipkinCollectorClient) sendSubmitZipkinBatch(spans []*Span) (err error) { - oprot := p.OutputProtocol - if oprot == nil { - oprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.OutputProtocol = oprot - } - p.SeqId++ - if err = oprot.WriteMessageBegin("submitZipkinBatch", thrift.CALL, p.SeqId); err != nil { - return - } - args := ZipkinCollectorSubmitZipkinBatchArgs{ - Spans: spans, - } - if err = args.Write(oprot); err != nil { - return - } - if err = oprot.WriteMessageEnd(); err != nil { - return - } - return oprot.Flush() -} - -func (p *ZipkinCollectorClient) recvSubmitZipkinBatch() (value []*Response, err error) { - iprot := p.InputProtocol - if iprot == nil { - iprot = p.ProtocolFactory.GetProtocol(p.Transport) - p.InputProtocol = iprot - } - method, mTypeId, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return - } - if method != "submitZipkinBatch" { - err = thrift.NewTApplicationException(thrift.WRONG_METHOD_NAME, "submitZipkinBatch failed: wrong method name") - return - } - if p.SeqId != seqId { - err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, "submitZipkinBatch failed: out of sequence response") - return - } - if mTypeId == thrift.EXCEPTION { - error2 := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "Unknown Exception") - var error3 error - error3, err = error2.Read(iprot) - if err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - err = error3 - return - } - if mTypeId != thrift.REPLY { - err = thrift.NewTApplicationException(thrift.INVALID_MESSAGE_TYPE_EXCEPTION, "submitZipkinBatch failed: invalid message type") - return - } - result := ZipkinCollectorSubmitZipkinBatchResult{} - if err = result.Read(iprot); err != nil { - return - } - if err = iprot.ReadMessageEnd(); err != nil { - return - } - value = result.GetSuccess() - return -} - -type ZipkinCollectorProcessor struct { - processorMap map[string]thrift.TProcessorFunction - handler ZipkinCollector -} - -func (p *ZipkinCollectorProcessor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) { - p.processorMap[key] = processor -} - -func (p *ZipkinCollectorProcessor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok bool) { - processor, ok = p.processorMap[key] - return processor, ok -} - -func (p *ZipkinCollectorProcessor) ProcessorMap() map[string]thrift.TProcessorFunction { - return p.processorMap -} - -func NewZipkinCollectorProcessor(handler ZipkinCollector) *ZipkinCollectorProcessor { - - self4 := &ZipkinCollectorProcessor{handler: handler, processorMap: make(map[string]thrift.TProcessorFunction)} - self4.processorMap["submitZipkinBatch"] = &zipkinCollectorProcessorSubmitZipkinBatch{handler: handler} - return self4 -} - -func (p *ZipkinCollectorProcessor) Process(iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - name, _, seqId, err := iprot.ReadMessageBegin() - if err != nil { - return false, err - } - if processor, ok := p.GetProcessorFunction(name); ok { - return processor.Process(seqId, iprot, oprot) - } - iprot.Skip(thrift.STRUCT) - iprot.ReadMessageEnd() - x5 := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, "Unknown function "+name) - oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId) - x5.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, x5 - -} - -type zipkinCollectorProcessorSubmitZipkinBatch struct { - handler ZipkinCollector -} - -func (p *zipkinCollectorProcessorSubmitZipkinBatch) Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException) { - args := ZipkinCollectorSubmitZipkinBatchArgs{} - if err = args.Read(iprot); err != nil { - iprot.ReadMessageEnd() - x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error()) - oprot.WriteMessageBegin("submitZipkinBatch", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return false, err - } - - iprot.ReadMessageEnd() - result := ZipkinCollectorSubmitZipkinBatchResult{} - var retval []*Response - var err2 error - if retval, err2 = p.handler.SubmitZipkinBatch(args.Spans); err2 != nil { - x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "Internal error processing submitZipkinBatch: "+err2.Error()) - oprot.WriteMessageBegin("submitZipkinBatch", thrift.EXCEPTION, seqId) - x.Write(oprot) - oprot.WriteMessageEnd() - oprot.Flush() - return true, err2 - } else { - result.Success = retval - } - if err2 = oprot.WriteMessageBegin("submitZipkinBatch", thrift.REPLY, seqId); err2 != nil { - err = err2 - } - if err2 = result.Write(oprot); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil { - err = err2 - } - if err2 = oprot.Flush(); err == nil && err2 != nil { - err = err2 - } - if err != nil { - return - } - return true, err -} - -// HELPER FUNCTIONS AND STRUCTURES - -// Attributes: -// - Spans -type ZipkinCollectorSubmitZipkinBatchArgs struct { - Spans []*Span `thrift:"spans,1" json:"spans"` -} - -func NewZipkinCollectorSubmitZipkinBatchArgs() *ZipkinCollectorSubmitZipkinBatchArgs { - return &ZipkinCollectorSubmitZipkinBatchArgs{} -} - -func (p *ZipkinCollectorSubmitZipkinBatchArgs) GetSpans() []*Span { - return p.Spans -} -func (p *ZipkinCollectorSubmitZipkinBatchArgs) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 1: - if err := p.readField1(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *ZipkinCollectorSubmitZipkinBatchArgs) readField1(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Span, 0, size) - p.Spans = tSlice - for i := 0; i < size; i++ { - _elem6 := &Span{} - if err := _elem6.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem6), err) - } - p.Spans = append(p.Spans, _elem6) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *ZipkinCollectorSubmitZipkinBatchArgs) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("submitZipkinBatch_args"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField1(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *ZipkinCollectorSubmitZipkinBatchArgs) writeField1(oprot thrift.TProtocol) (err error) { - if err := oprot.WriteFieldBegin("spans", thrift.LIST, 1); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:spans: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Spans)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Spans { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 1:spans: ", p), err) - } - return err -} - -func (p *ZipkinCollectorSubmitZipkinBatchArgs) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("ZipkinCollectorSubmitZipkinBatchArgs(%+v)", *p) -} - -// Attributes: -// - Success -type ZipkinCollectorSubmitZipkinBatchResult struct { - Success []*Response `thrift:"success,0" json:"success,omitempty"` -} - -func NewZipkinCollectorSubmitZipkinBatchResult() *ZipkinCollectorSubmitZipkinBatchResult { - return &ZipkinCollectorSubmitZipkinBatchResult{} -} - -var ZipkinCollectorSubmitZipkinBatchResult_Success_DEFAULT []*Response - -func (p *ZipkinCollectorSubmitZipkinBatchResult) GetSuccess() []*Response { - return p.Success -} -func (p *ZipkinCollectorSubmitZipkinBatchResult) IsSetSuccess() bool { - return p.Success != nil -} - -func (p *ZipkinCollectorSubmitZipkinBatchResult) Read(iprot thrift.TProtocol) error { - if _, err := iprot.ReadStructBegin(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read error: ", p), err) - } - - for { - _, fieldTypeId, fieldId, err := iprot.ReadFieldBegin() - if err != nil { - return thrift.PrependError(fmt.Sprintf("%T field %d read error: ", p, fieldId), err) - } - if fieldTypeId == thrift.STOP { - break - } - switch fieldId { - case 0: - if err := p.readField0(iprot); err != nil { - return err - } - default: - if err := iprot.Skip(fieldTypeId); err != nil { - return err - } - } - if err := iprot.ReadFieldEnd(); err != nil { - return err - } - } - if err := iprot.ReadStructEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T read struct end error: ", p), err) - } - return nil -} - -func (p *ZipkinCollectorSubmitZipkinBatchResult) readField0(iprot thrift.TProtocol) error { - _, size, err := iprot.ReadListBegin() - if err != nil { - return thrift.PrependError("error reading list begin: ", err) - } - tSlice := make([]*Response, 0, size) - p.Success = tSlice - for i := 0; i < size; i++ { - _elem7 := &Response{} - if err := _elem7.Read(iprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error reading struct: ", _elem7), err) - } - p.Success = append(p.Success, _elem7) - } - if err := iprot.ReadListEnd(); err != nil { - return thrift.PrependError("error reading list end: ", err) - } - return nil -} - -func (p *ZipkinCollectorSubmitZipkinBatchResult) Write(oprot thrift.TProtocol) error { - if err := oprot.WriteStructBegin("submitZipkinBatch_result"); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) - } - if err := p.writeField0(oprot); err != nil { - return err - } - if err := oprot.WriteFieldStop(); err != nil { - return thrift.PrependError("write field stop error: ", err) - } - if err := oprot.WriteStructEnd(); err != nil { - return thrift.PrependError("write struct stop error: ", err) - } - return nil -} - -func (p *ZipkinCollectorSubmitZipkinBatchResult) writeField0(oprot thrift.TProtocol) (err error) { - if p.IsSetSuccess() { - if err := oprot.WriteFieldBegin("success", thrift.LIST, 0); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field begin error 0:success: ", p), err) - } - if err := oprot.WriteListBegin(thrift.STRUCT, len(p.Success)); err != nil { - return thrift.PrependError("error writing list begin: ", err) - } - for _, v := range p.Success { - if err := v.Write(oprot); err != nil { - return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) - } - } - if err := oprot.WriteListEnd(); err != nil { - return thrift.PrependError("error writing list end: ", err) - } - if err := oprot.WriteFieldEnd(); err != nil { - return thrift.PrependError(fmt.Sprintf("%T write field end error 0:success: ", p), err) - } - } - return err -} - -func (p *ZipkinCollectorSubmitZipkinBatchResult) String() string { - if p == nil { - return "" - } - return fmt.Sprintf("ZipkinCollectorSubmitZipkinBatchResult(%+v)", *p) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/README.md b/vendor/github.com/uber/jaeger-client-go/thrift/README.md deleted file mode 100644 index 1d8e642e028b..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/README.md +++ /dev/null @@ -1,7 +0,0 @@ -# Apache Thrift - -This is a partial copy of Apache Thrift v0.10 (https://github.com/apache/thrift/commit/b2a4d4ae21c789b689dd162deb819665567f481c). - -It is vendored code to avoid compatibility issues introduced in Thrift v0.11. - -See https://github.com/jaegertracing/jaeger-client-go/pull/303. diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/application_exception.go b/vendor/github.com/uber/jaeger-client-go/thrift/application_exception.go deleted file mode 100644 index 6655cc5a9720..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/application_exception.go +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -const ( - UNKNOWN_APPLICATION_EXCEPTION = 0 - UNKNOWN_METHOD = 1 - INVALID_MESSAGE_TYPE_EXCEPTION = 2 - WRONG_METHOD_NAME = 3 - BAD_SEQUENCE_ID = 4 - MISSING_RESULT = 5 - INTERNAL_ERROR = 6 - PROTOCOL_ERROR = 7 -) - -// Application level Thrift exception -type TApplicationException interface { - TException - TypeId() int32 - Read(iprot TProtocol) (TApplicationException, error) - Write(oprot TProtocol) error -} - -type tApplicationException struct { - message string - type_ int32 -} - -func (e tApplicationException) Error() string { - return e.message -} - -func NewTApplicationException(type_ int32, message string) TApplicationException { - return &tApplicationException{message, type_} -} - -func (p *tApplicationException) TypeId() int32 { - return p.type_ -} - -func (p *tApplicationException) Read(iprot TProtocol) (TApplicationException, error) { - _, err := iprot.ReadStructBegin() - if err != nil { - return nil, err - } - - message := "" - type_ := int32(UNKNOWN_APPLICATION_EXCEPTION) - - for { - _, ttype, id, err := iprot.ReadFieldBegin() - if err != nil { - return nil, err - } - if ttype == STOP { - break - } - switch id { - case 1: - if ttype == STRING { - if message, err = iprot.ReadString(); err != nil { - return nil, err - } - } else { - if err = SkipDefaultDepth(iprot, ttype); err != nil { - return nil, err - } - } - case 2: - if ttype == I32 { - if type_, err = iprot.ReadI32(); err != nil { - return nil, err - } - } else { - if err = SkipDefaultDepth(iprot, ttype); err != nil { - return nil, err - } - } - default: - if err = SkipDefaultDepth(iprot, ttype); err != nil { - return nil, err - } - } - if err = iprot.ReadFieldEnd(); err != nil { - return nil, err - } - } - return NewTApplicationException(type_, message), iprot.ReadStructEnd() -} - -func (p *tApplicationException) Write(oprot TProtocol) (err error) { - err = oprot.WriteStructBegin("TApplicationException") - if len(p.Error()) > 0 { - err = oprot.WriteFieldBegin("message", STRING, 1) - if err != nil { - return - } - err = oprot.WriteString(p.Error()) - if err != nil { - return - } - err = oprot.WriteFieldEnd() - if err != nil { - return - } - } - err = oprot.WriteFieldBegin("type", I32, 2) - if err != nil { - return - } - err = oprot.WriteI32(p.type_) - if err != nil { - return - } - err = oprot.WriteFieldEnd() - if err != nil { - return - } - err = oprot.WriteFieldStop() - if err != nil { - return - } - err = oprot.WriteStructEnd() - return -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/binary_protocol.go b/vendor/github.com/uber/jaeger-client-go/thrift/binary_protocol.go deleted file mode 100644 index 690d341111b5..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/binary_protocol.go +++ /dev/null @@ -1,514 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" - "io" - "math" -) - -type TBinaryProtocol struct { - trans TRichTransport - origTransport TTransport - reader io.Reader - writer io.Writer - strictRead bool - strictWrite bool - buffer [64]byte -} - -type TBinaryProtocolFactory struct { - strictRead bool - strictWrite bool -} - -func NewTBinaryProtocolTransport(t TTransport) *TBinaryProtocol { - return NewTBinaryProtocol(t, false, true) -} - -func NewTBinaryProtocol(t TTransport, strictRead, strictWrite bool) *TBinaryProtocol { - p := &TBinaryProtocol{origTransport: t, strictRead: strictRead, strictWrite: strictWrite} - if et, ok := t.(TRichTransport); ok { - p.trans = et - } else { - p.trans = NewTRichTransport(t) - } - p.reader = p.trans - p.writer = p.trans - return p -} - -func NewTBinaryProtocolFactoryDefault() *TBinaryProtocolFactory { - return NewTBinaryProtocolFactory(false, true) -} - -func NewTBinaryProtocolFactory(strictRead, strictWrite bool) *TBinaryProtocolFactory { - return &TBinaryProtocolFactory{strictRead: strictRead, strictWrite: strictWrite} -} - -func (p *TBinaryProtocolFactory) GetProtocol(t TTransport) TProtocol { - return NewTBinaryProtocol(t, p.strictRead, p.strictWrite) -} - -/** - * Writing Methods - */ - -func (p *TBinaryProtocol) WriteMessageBegin(name string, typeId TMessageType, seqId int32) error { - if p.strictWrite { - version := uint32(VERSION_1) | uint32(typeId) - e := p.WriteI32(int32(version)) - if e != nil { - return e - } - e = p.WriteString(name) - if e != nil { - return e - } - e = p.WriteI32(seqId) - return e - } else { - e := p.WriteString(name) - if e != nil { - return e - } - e = p.WriteByte(int8(typeId)) - if e != nil { - return e - } - e = p.WriteI32(seqId) - return e - } - return nil -} - -func (p *TBinaryProtocol) WriteMessageEnd() error { - return nil -} - -func (p *TBinaryProtocol) WriteStructBegin(name string) error { - return nil -} - -func (p *TBinaryProtocol) WriteStructEnd() error { - return nil -} - -func (p *TBinaryProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { - e := p.WriteByte(int8(typeId)) - if e != nil { - return e - } - e = p.WriteI16(id) - return e -} - -func (p *TBinaryProtocol) WriteFieldEnd() error { - return nil -} - -func (p *TBinaryProtocol) WriteFieldStop() error { - e := p.WriteByte(STOP) - return e -} - -func (p *TBinaryProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { - e := p.WriteByte(int8(keyType)) - if e != nil { - return e - } - e = p.WriteByte(int8(valueType)) - if e != nil { - return e - } - e = p.WriteI32(int32(size)) - return e -} - -func (p *TBinaryProtocol) WriteMapEnd() error { - return nil -} - -func (p *TBinaryProtocol) WriteListBegin(elemType TType, size int) error { - e := p.WriteByte(int8(elemType)) - if e != nil { - return e - } - e = p.WriteI32(int32(size)) - return e -} - -func (p *TBinaryProtocol) WriteListEnd() error { - return nil -} - -func (p *TBinaryProtocol) WriteSetBegin(elemType TType, size int) error { - e := p.WriteByte(int8(elemType)) - if e != nil { - return e - } - e = p.WriteI32(int32(size)) - return e -} - -func (p *TBinaryProtocol) WriteSetEnd() error { - return nil -} - -func (p *TBinaryProtocol) WriteBool(value bool) error { - if value { - return p.WriteByte(1) - } - return p.WriteByte(0) -} - -func (p *TBinaryProtocol) WriteByte(value int8) error { - e := p.trans.WriteByte(byte(value)) - return NewTProtocolException(e) -} - -func (p *TBinaryProtocol) WriteI16(value int16) error { - v := p.buffer[0:2] - binary.BigEndian.PutUint16(v, uint16(value)) - _, e := p.writer.Write(v) - return NewTProtocolException(e) -} - -func (p *TBinaryProtocol) WriteI32(value int32) error { - v := p.buffer[0:4] - binary.BigEndian.PutUint32(v, uint32(value)) - _, e := p.writer.Write(v) - return NewTProtocolException(e) -} - -func (p *TBinaryProtocol) WriteI64(value int64) error { - v := p.buffer[0:8] - binary.BigEndian.PutUint64(v, uint64(value)) - _, err := p.writer.Write(v) - return NewTProtocolException(err) -} - -func (p *TBinaryProtocol) WriteDouble(value float64) error { - return p.WriteI64(int64(math.Float64bits(value))) -} - -func (p *TBinaryProtocol) WriteString(value string) error { - e := p.WriteI32(int32(len(value))) - if e != nil { - return e - } - _, err := p.trans.WriteString(value) - return NewTProtocolException(err) -} - -func (p *TBinaryProtocol) WriteBinary(value []byte) error { - e := p.WriteI32(int32(len(value))) - if e != nil { - return e - } - _, err := p.writer.Write(value) - return NewTProtocolException(err) -} - -/** - * Reading methods - */ - -func (p *TBinaryProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { - size, e := p.ReadI32() - if e != nil { - return "", typeId, 0, NewTProtocolException(e) - } - if size < 0 { - typeId = TMessageType(size & 0x0ff) - version := int64(int64(size) & VERSION_MASK) - if version != VERSION_1 { - return name, typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, fmt.Errorf("Bad version in ReadMessageBegin")) - } - name, e = p.ReadString() - if e != nil { - return name, typeId, seqId, NewTProtocolException(e) - } - seqId, e = p.ReadI32() - if e != nil { - return name, typeId, seqId, NewTProtocolException(e) - } - return name, typeId, seqId, nil - } - if p.strictRead { - return name, typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, fmt.Errorf("Missing version in ReadMessageBegin")) - } - name, e2 := p.readStringBody(size) - if e2 != nil { - return name, typeId, seqId, e2 - } - b, e3 := p.ReadByte() - if e3 != nil { - return name, typeId, seqId, e3 - } - typeId = TMessageType(b) - seqId, e4 := p.ReadI32() - if e4 != nil { - return name, typeId, seqId, e4 - } - return name, typeId, seqId, nil -} - -func (p *TBinaryProtocol) ReadMessageEnd() error { - return nil -} - -func (p *TBinaryProtocol) ReadStructBegin() (name string, err error) { - return -} - -func (p *TBinaryProtocol) ReadStructEnd() error { - return nil -} - -func (p *TBinaryProtocol) ReadFieldBegin() (name string, typeId TType, seqId int16, err error) { - t, err := p.ReadByte() - typeId = TType(t) - if err != nil { - return name, typeId, seqId, err - } - if t != STOP { - seqId, err = p.ReadI16() - } - return name, typeId, seqId, err -} - -func (p *TBinaryProtocol) ReadFieldEnd() error { - return nil -} - -var invalidDataLength = NewTProtocolExceptionWithType(INVALID_DATA, errors.New("Invalid data length")) - -func (p *TBinaryProtocol) ReadMapBegin() (kType, vType TType, size int, err error) { - k, e := p.ReadByte() - if e != nil { - err = NewTProtocolException(e) - return - } - kType = TType(k) - v, e := p.ReadByte() - if e != nil { - err = NewTProtocolException(e) - return - } - vType = TType(v) - size32, e := p.ReadI32() - if e != nil { - err = NewTProtocolException(e) - return - } - if size32 < 0 { - err = invalidDataLength - return - } - size = int(size32) - return kType, vType, size, nil -} - -func (p *TBinaryProtocol) ReadMapEnd() error { - return nil -} - -func (p *TBinaryProtocol) ReadListBegin() (elemType TType, size int, err error) { - b, e := p.ReadByte() - if e != nil { - err = NewTProtocolException(e) - return - } - elemType = TType(b) - size32, e := p.ReadI32() - if e != nil { - err = NewTProtocolException(e) - return - } - if size32 < 0 { - err = invalidDataLength - return - } - size = int(size32) - - return -} - -func (p *TBinaryProtocol) ReadListEnd() error { - return nil -} - -func (p *TBinaryProtocol) ReadSetBegin() (elemType TType, size int, err error) { - b, e := p.ReadByte() - if e != nil { - err = NewTProtocolException(e) - return - } - elemType = TType(b) - size32, e := p.ReadI32() - if e != nil { - err = NewTProtocolException(e) - return - } - if size32 < 0 { - err = invalidDataLength - return - } - size = int(size32) - return elemType, size, nil -} - -func (p *TBinaryProtocol) ReadSetEnd() error { - return nil -} - -func (p *TBinaryProtocol) ReadBool() (bool, error) { - b, e := p.ReadByte() - v := true - if b != 1 { - v = false - } - return v, e -} - -func (p *TBinaryProtocol) ReadByte() (int8, error) { - v, err := p.trans.ReadByte() - return int8(v), err -} - -func (p *TBinaryProtocol) ReadI16() (value int16, err error) { - buf := p.buffer[0:2] - err = p.readAll(buf) - value = int16(binary.BigEndian.Uint16(buf)) - return value, err -} - -func (p *TBinaryProtocol) ReadI32() (value int32, err error) { - buf := p.buffer[0:4] - err = p.readAll(buf) - value = int32(binary.BigEndian.Uint32(buf)) - return value, err -} - -func (p *TBinaryProtocol) ReadI64() (value int64, err error) { - buf := p.buffer[0:8] - err = p.readAll(buf) - value = int64(binary.BigEndian.Uint64(buf)) - return value, err -} - -func (p *TBinaryProtocol) ReadDouble() (value float64, err error) { - buf := p.buffer[0:8] - err = p.readAll(buf) - value = math.Float64frombits(binary.BigEndian.Uint64(buf)) - return value, err -} - -func (p *TBinaryProtocol) ReadString() (value string, err error) { - size, e := p.ReadI32() - if e != nil { - return "", e - } - if size < 0 { - err = invalidDataLength - return - } - - return p.readStringBody(size) -} - -func (p *TBinaryProtocol) ReadBinary() ([]byte, error) { - size, e := p.ReadI32() - if e != nil { - return nil, e - } - if size < 0 { - return nil, invalidDataLength - } - if uint64(size) > p.trans.RemainingBytes() { - return nil, invalidDataLength - } - - isize := int(size) - buf := make([]byte, isize) - _, err := io.ReadFull(p.trans, buf) - return buf, NewTProtocolException(err) -} - -func (p *TBinaryProtocol) Flush() (err error) { - return NewTProtocolException(p.trans.Flush()) -} - -func (p *TBinaryProtocol) Skip(fieldType TType) (err error) { - return SkipDefaultDepth(p, fieldType) -} - -func (p *TBinaryProtocol) Transport() TTransport { - return p.origTransport -} - -func (p *TBinaryProtocol) readAll(buf []byte) error { - _, err := io.ReadFull(p.reader, buf) - return NewTProtocolException(err) -} - -const readLimit = 32768 - -func (p *TBinaryProtocol) readStringBody(size int32) (value string, err error) { - if size < 0 { - return "", nil - } - if uint64(size) > p.trans.RemainingBytes() { - return "", invalidDataLength - } - - var ( - buf bytes.Buffer - e error - b []byte - ) - - switch { - case int(size) <= len(p.buffer): - b = p.buffer[:size] // avoids allocation for small reads - case int(size) < readLimit: - b = make([]byte, size) - default: - b = make([]byte, readLimit) - } - - for size > 0 { - _, e = io.ReadFull(p.trans, b) - buf.Write(b) - if e != nil { - break - } - size -= readLimit - if size < readLimit && size > 0 { - b = b[:size] - } - } - return buf.String(), NewTProtocolException(e) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/compact_protocol.go b/vendor/github.com/uber/jaeger-client-go/thrift/compact_protocol.go deleted file mode 100644 index b9299f2fa13c..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/compact_protocol.go +++ /dev/null @@ -1,815 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -import ( - "encoding/binary" - "fmt" - "io" - "math" -) - -const ( - COMPACT_PROTOCOL_ID = 0x082 - COMPACT_VERSION = 1 - COMPACT_VERSION_MASK = 0x1f - COMPACT_TYPE_MASK = 0x0E0 - COMPACT_TYPE_BITS = 0x07 - COMPACT_TYPE_SHIFT_AMOUNT = 5 -) - -type tCompactType byte - -const ( - COMPACT_BOOLEAN_TRUE = 0x01 - COMPACT_BOOLEAN_FALSE = 0x02 - COMPACT_BYTE = 0x03 - COMPACT_I16 = 0x04 - COMPACT_I32 = 0x05 - COMPACT_I64 = 0x06 - COMPACT_DOUBLE = 0x07 - COMPACT_BINARY = 0x08 - COMPACT_LIST = 0x09 - COMPACT_SET = 0x0A - COMPACT_MAP = 0x0B - COMPACT_STRUCT = 0x0C -) - -var ( - ttypeToCompactType map[TType]tCompactType -) - -func init() { - ttypeToCompactType = map[TType]tCompactType{ - STOP: STOP, - BOOL: COMPACT_BOOLEAN_TRUE, - BYTE: COMPACT_BYTE, - I16: COMPACT_I16, - I32: COMPACT_I32, - I64: COMPACT_I64, - DOUBLE: COMPACT_DOUBLE, - STRING: COMPACT_BINARY, - LIST: COMPACT_LIST, - SET: COMPACT_SET, - MAP: COMPACT_MAP, - STRUCT: COMPACT_STRUCT, - } -} - -type TCompactProtocolFactory struct{} - -func NewTCompactProtocolFactory() *TCompactProtocolFactory { - return &TCompactProtocolFactory{} -} - -func (p *TCompactProtocolFactory) GetProtocol(trans TTransport) TProtocol { - return NewTCompactProtocol(trans) -} - -type TCompactProtocol struct { - trans TRichTransport - origTransport TTransport - - // Used to keep track of the last field for the current and previous structs, - // so we can do the delta stuff. - lastField []int - lastFieldId int - - // If we encounter a boolean field begin, save the TField here so it can - // have the value incorporated. - booleanFieldName string - booleanFieldId int16 - booleanFieldPending bool - - // If we read a field header, and it's a boolean field, save the boolean - // value here so that readBool can use it. - boolValue bool - boolValueIsNotNull bool - buffer [64]byte -} - -// Create a TCompactProtocol given a TTransport -func NewTCompactProtocol(trans TTransport) *TCompactProtocol { - p := &TCompactProtocol{origTransport: trans, lastField: []int{}} - if et, ok := trans.(TRichTransport); ok { - p.trans = et - } else { - p.trans = NewTRichTransport(trans) - } - - return p - -} - -// -// Public Writing methods. -// - -// Write a message header to the wire. Compact Protocol messages contain the -// protocol version so we can migrate forwards in the future if need be. -func (p *TCompactProtocol) WriteMessageBegin(name string, typeId TMessageType, seqid int32) error { - err := p.writeByteDirect(COMPACT_PROTOCOL_ID) - if err != nil { - return NewTProtocolException(err) - } - err = p.writeByteDirect((COMPACT_VERSION & COMPACT_VERSION_MASK) | ((byte(typeId) << COMPACT_TYPE_SHIFT_AMOUNT) & COMPACT_TYPE_MASK)) - if err != nil { - return NewTProtocolException(err) - } - _, err = p.writeVarint32(seqid) - if err != nil { - return NewTProtocolException(err) - } - e := p.WriteString(name) - return e - -} - -func (p *TCompactProtocol) WriteMessageEnd() error { return nil } - -// Write a struct begin. This doesn't actually put anything on the wire. We -// use it as an opportunity to put special placeholder markers on the field -// stack so we can get the field id deltas correct. -func (p *TCompactProtocol) WriteStructBegin(name string) error { - p.lastField = append(p.lastField, p.lastFieldId) - p.lastFieldId = 0 - return nil -} - -// Write a struct end. This doesn't actually put anything on the wire. We use -// this as an opportunity to pop the last field from the current struct off -// of the field stack. -func (p *TCompactProtocol) WriteStructEnd() error { - p.lastFieldId = p.lastField[len(p.lastField)-1] - p.lastField = p.lastField[:len(p.lastField)-1] - return nil -} - -func (p *TCompactProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { - if typeId == BOOL { - // we want to possibly include the value, so we'll wait. - p.booleanFieldName, p.booleanFieldId, p.booleanFieldPending = name, id, true - return nil - } - _, err := p.writeFieldBeginInternal(name, typeId, id, 0xFF) - return NewTProtocolException(err) -} - -// The workhorse of writeFieldBegin. It has the option of doing a -// 'type override' of the type header. This is used specifically in the -// boolean field case. -func (p *TCompactProtocol) writeFieldBeginInternal(name string, typeId TType, id int16, typeOverride byte) (int, error) { - // short lastField = lastField_.pop(); - - // if there's a type override, use that. - var typeToWrite byte - if typeOverride == 0xFF { - typeToWrite = byte(p.getCompactType(typeId)) - } else { - typeToWrite = typeOverride - } - // check if we can use delta encoding for the field id - fieldId := int(id) - written := 0 - if fieldId > p.lastFieldId && fieldId-p.lastFieldId <= 15 { - // write them together - err := p.writeByteDirect(byte((fieldId-p.lastFieldId)<<4) | typeToWrite) - if err != nil { - return 0, err - } - } else { - // write them separate - err := p.writeByteDirect(typeToWrite) - if err != nil { - return 0, err - } - err = p.WriteI16(id) - written = 1 + 2 - if err != nil { - return 0, err - } - } - - p.lastFieldId = fieldId - // p.lastField.Push(field.id); - return written, nil -} - -func (p *TCompactProtocol) WriteFieldEnd() error { return nil } - -func (p *TCompactProtocol) WriteFieldStop() error { - err := p.writeByteDirect(STOP) - return NewTProtocolException(err) -} - -func (p *TCompactProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { - if size == 0 { - err := p.writeByteDirect(0) - return NewTProtocolException(err) - } - _, err := p.writeVarint32(int32(size)) - if err != nil { - return NewTProtocolException(err) - } - err = p.writeByteDirect(byte(p.getCompactType(keyType))<<4 | byte(p.getCompactType(valueType))) - return NewTProtocolException(err) -} - -func (p *TCompactProtocol) WriteMapEnd() error { return nil } - -// Write a list header. -func (p *TCompactProtocol) WriteListBegin(elemType TType, size int) error { - _, err := p.writeCollectionBegin(elemType, size) - return NewTProtocolException(err) -} - -func (p *TCompactProtocol) WriteListEnd() error { return nil } - -// Write a set header. -func (p *TCompactProtocol) WriteSetBegin(elemType TType, size int) error { - _, err := p.writeCollectionBegin(elemType, size) - return NewTProtocolException(err) -} - -func (p *TCompactProtocol) WriteSetEnd() error { return nil } - -func (p *TCompactProtocol) WriteBool(value bool) error { - v := byte(COMPACT_BOOLEAN_FALSE) - if value { - v = byte(COMPACT_BOOLEAN_TRUE) - } - if p.booleanFieldPending { - // we haven't written the field header yet - _, err := p.writeFieldBeginInternal(p.booleanFieldName, BOOL, p.booleanFieldId, v) - p.booleanFieldPending = false - return NewTProtocolException(err) - } - // we're not part of a field, so just write the value. - err := p.writeByteDirect(v) - return NewTProtocolException(err) -} - -// Write a byte. Nothing to see here! -func (p *TCompactProtocol) WriteByte(value int8) error { - err := p.writeByteDirect(byte(value)) - return NewTProtocolException(err) -} - -// Write an I16 as a zigzag varint. -func (p *TCompactProtocol) WriteI16(value int16) error { - _, err := p.writeVarint32(p.int32ToZigzag(int32(value))) - return NewTProtocolException(err) -} - -// Write an i32 as a zigzag varint. -func (p *TCompactProtocol) WriteI32(value int32) error { - _, err := p.writeVarint32(p.int32ToZigzag(value)) - return NewTProtocolException(err) -} - -// Write an i64 as a zigzag varint. -func (p *TCompactProtocol) WriteI64(value int64) error { - _, err := p.writeVarint64(p.int64ToZigzag(value)) - return NewTProtocolException(err) -} - -// Write a double to the wire as 8 bytes. -func (p *TCompactProtocol) WriteDouble(value float64) error { - buf := p.buffer[0:8] - binary.LittleEndian.PutUint64(buf, math.Float64bits(value)) - _, err := p.trans.Write(buf) - return NewTProtocolException(err) -} - -// Write a string to the wire with a varint size preceding. -func (p *TCompactProtocol) WriteString(value string) error { - _, e := p.writeVarint32(int32(len(value))) - if e != nil { - return NewTProtocolException(e) - } - if len(value) > 0 { - } - _, e = p.trans.WriteString(value) - return e -} - -// Write a byte array, using a varint for the size. -func (p *TCompactProtocol) WriteBinary(bin []byte) error { - _, e := p.writeVarint32(int32(len(bin))) - if e != nil { - return NewTProtocolException(e) - } - if len(bin) > 0 { - _, e = p.trans.Write(bin) - return NewTProtocolException(e) - } - return nil -} - -// -// Reading methods. -// - -// Read a message header. -func (p *TCompactProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { - - protocolId, err := p.readByteDirect() - if err != nil { - return - } - - if protocolId != COMPACT_PROTOCOL_ID { - e := fmt.Errorf("Expected protocol id %02x but got %02x", COMPACT_PROTOCOL_ID, protocolId) - return "", typeId, seqId, NewTProtocolExceptionWithType(BAD_VERSION, e) - } - - versionAndType, err := p.readByteDirect() - if err != nil { - return - } - - version := versionAndType & COMPACT_VERSION_MASK - typeId = TMessageType((versionAndType >> COMPACT_TYPE_SHIFT_AMOUNT) & COMPACT_TYPE_BITS) - if version != COMPACT_VERSION { - e := fmt.Errorf("Expected version %02x but got %02x", COMPACT_VERSION, version) - err = NewTProtocolExceptionWithType(BAD_VERSION, e) - return - } - seqId, e := p.readVarint32() - if e != nil { - err = NewTProtocolException(e) - return - } - name, err = p.ReadString() - return -} - -func (p *TCompactProtocol) ReadMessageEnd() error { return nil } - -// Read a struct begin. There's nothing on the wire for this, but it is our -// opportunity to push a new struct begin marker onto the field stack. -func (p *TCompactProtocol) ReadStructBegin() (name string, err error) { - p.lastField = append(p.lastField, p.lastFieldId) - p.lastFieldId = 0 - return -} - -// Doesn't actually consume any wire data, just removes the last field for -// this struct from the field stack. -func (p *TCompactProtocol) ReadStructEnd() error { - // consume the last field we read off the wire. - p.lastFieldId = p.lastField[len(p.lastField)-1] - p.lastField = p.lastField[:len(p.lastField)-1] - return nil -} - -// Read a field header off the wire. -func (p *TCompactProtocol) ReadFieldBegin() (name string, typeId TType, id int16, err error) { - t, err := p.readByteDirect() - if err != nil { - return - } - - // if it's a stop, then we can return immediately, as the struct is over. - if (t & 0x0f) == STOP { - return "", STOP, 0, nil - } - - // mask off the 4 MSB of the type header. it could contain a field id delta. - modifier := int16((t & 0xf0) >> 4) - if modifier == 0 { - // not a delta. look ahead for the zigzag varint field id. - id, err = p.ReadI16() - if err != nil { - return - } - } else { - // has a delta. add the delta to the last read field id. - id = int16(p.lastFieldId) + modifier - } - typeId, e := p.getTType(tCompactType(t & 0x0f)) - if e != nil { - err = NewTProtocolException(e) - return - } - - // if this happens to be a boolean field, the value is encoded in the type - if p.isBoolType(t) { - // save the boolean value in a special instance variable. - p.boolValue = (byte(t)&0x0f == COMPACT_BOOLEAN_TRUE) - p.boolValueIsNotNull = true - } - - // push the new field onto the field stack so we can keep the deltas going. - p.lastFieldId = int(id) - return -} - -func (p *TCompactProtocol) ReadFieldEnd() error { return nil } - -// Read a map header off the wire. If the size is zero, skip reading the key -// and value type. This means that 0-length maps will yield TMaps without the -// "correct" types. -func (p *TCompactProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, err error) { - size32, e := p.readVarint32() - if e != nil { - err = NewTProtocolException(e) - return - } - if size32 < 0 { - err = invalidDataLength - return - } - size = int(size32) - - keyAndValueType := byte(STOP) - if size != 0 { - keyAndValueType, err = p.readByteDirect() - if err != nil { - return - } - } - keyType, _ = p.getTType(tCompactType(keyAndValueType >> 4)) - valueType, _ = p.getTType(tCompactType(keyAndValueType & 0xf)) - return -} - -func (p *TCompactProtocol) ReadMapEnd() error { return nil } - -// Read a list header off the wire. If the list size is 0-14, the size will -// be packed into the element type header. If it's a longer list, the 4 MSB -// of the element type header will be 0xF, and a varint will follow with the -// true size. -func (p *TCompactProtocol) ReadListBegin() (elemType TType, size int, err error) { - size_and_type, err := p.readByteDirect() - if err != nil { - return - } - size = int((size_and_type >> 4) & 0x0f) - if size == 15 { - size2, e := p.readVarint32() - if e != nil { - err = NewTProtocolException(e) - return - } - if size2 < 0 { - err = invalidDataLength - return - } - size = int(size2) - } - elemType, e := p.getTType(tCompactType(size_and_type)) - if e != nil { - err = NewTProtocolException(e) - return - } - return -} - -func (p *TCompactProtocol) ReadListEnd() error { return nil } - -// Read a set header off the wire. If the set size is 0-14, the size will -// be packed into the element type header. If it's a longer set, the 4 MSB -// of the element type header will be 0xF, and a varint will follow with the -// true size. -func (p *TCompactProtocol) ReadSetBegin() (elemType TType, size int, err error) { - return p.ReadListBegin() -} - -func (p *TCompactProtocol) ReadSetEnd() error { return nil } - -// Read a boolean off the wire. If this is a boolean field, the value should -// already have been read during readFieldBegin, so we'll just consume the -// pre-stored value. Otherwise, read a byte. -func (p *TCompactProtocol) ReadBool() (value bool, err error) { - if p.boolValueIsNotNull { - p.boolValueIsNotNull = false - return p.boolValue, nil - } - v, err := p.readByteDirect() - return v == COMPACT_BOOLEAN_TRUE, err -} - -// Read a single byte off the wire. Nothing interesting here. -func (p *TCompactProtocol) ReadByte() (int8, error) { - v, err := p.readByteDirect() - if err != nil { - return 0, NewTProtocolException(err) - } - return int8(v), err -} - -// Read an i16 from the wire as a zigzag varint. -func (p *TCompactProtocol) ReadI16() (value int16, err error) { - v, err := p.ReadI32() - return int16(v), err -} - -// Read an i32 from the wire as a zigzag varint. -func (p *TCompactProtocol) ReadI32() (value int32, err error) { - v, e := p.readVarint32() - if e != nil { - return 0, NewTProtocolException(e) - } - value = p.zigzagToInt32(v) - return value, nil -} - -// Read an i64 from the wire as a zigzag varint. -func (p *TCompactProtocol) ReadI64() (value int64, err error) { - v, e := p.readVarint64() - if e != nil { - return 0, NewTProtocolException(e) - } - value = p.zigzagToInt64(v) - return value, nil -} - -// No magic here - just read a double off the wire. -func (p *TCompactProtocol) ReadDouble() (value float64, err error) { - longBits := p.buffer[0:8] - _, e := io.ReadFull(p.trans, longBits) - if e != nil { - return 0.0, NewTProtocolException(e) - } - return math.Float64frombits(p.bytesToUint64(longBits)), nil -} - -// Reads a []byte (via readBinary), and then UTF-8 decodes it. -func (p *TCompactProtocol) ReadString() (value string, err error) { - length, e := p.readVarint32() - if e != nil { - return "", NewTProtocolException(e) - } - if length < 0 { - return "", invalidDataLength - } - if uint64(length) > p.trans.RemainingBytes() { - return "", invalidDataLength - } - - if length == 0 { - return "", nil - } - var buf []byte - if length <= int32(len(p.buffer)) { - buf = p.buffer[0:length] - } else { - buf = make([]byte, length) - } - _, e = io.ReadFull(p.trans, buf) - return string(buf), NewTProtocolException(e) -} - -// Read a []byte from the wire. -func (p *TCompactProtocol) ReadBinary() (value []byte, err error) { - length, e := p.readVarint32() - if e != nil { - return nil, NewTProtocolException(e) - } - if length == 0 { - return []byte{}, nil - } - if length < 0 { - return nil, invalidDataLength - } - if uint64(length) > p.trans.RemainingBytes() { - return nil, invalidDataLength - } - - buf := make([]byte, length) - _, e = io.ReadFull(p.trans, buf) - return buf, NewTProtocolException(e) -} - -func (p *TCompactProtocol) Flush() (err error) { - return NewTProtocolException(p.trans.Flush()) -} - -func (p *TCompactProtocol) Skip(fieldType TType) (err error) { - return SkipDefaultDepth(p, fieldType) -} - -func (p *TCompactProtocol) Transport() TTransport { - return p.origTransport -} - -// -// Internal writing methods -// - -// Abstract method for writing the start of lists and sets. List and sets on -// the wire differ only by the type indicator. -func (p *TCompactProtocol) writeCollectionBegin(elemType TType, size int) (int, error) { - if size <= 14 { - return 1, p.writeByteDirect(byte(int32(size<<4) | int32(p.getCompactType(elemType)))) - } - err := p.writeByteDirect(0xf0 | byte(p.getCompactType(elemType))) - if err != nil { - return 0, err - } - m, err := p.writeVarint32(int32(size)) - return 1 + m, err -} - -// Write an i32 as a varint. Results in 1-5 bytes on the wire. -// TODO(pomack): make a permanent buffer like writeVarint64? -func (p *TCompactProtocol) writeVarint32(n int32) (int, error) { - i32buf := p.buffer[0:5] - idx := 0 - for { - if (n & ^0x7F) == 0 { - i32buf[idx] = byte(n) - idx++ - // p.writeByteDirect(byte(n)); - break - // return; - } else { - i32buf[idx] = byte((n & 0x7F) | 0x80) - idx++ - // p.writeByteDirect(byte(((n & 0x7F) | 0x80))); - u := uint32(n) - n = int32(u >> 7) - } - } - return p.trans.Write(i32buf[0:idx]) -} - -// Write an i64 as a varint. Results in 1-10 bytes on the wire. -func (p *TCompactProtocol) writeVarint64(n int64) (int, error) { - varint64out := p.buffer[0:10] - idx := 0 - for { - if (n & ^0x7F) == 0 { - varint64out[idx] = byte(n) - idx++ - break - } else { - varint64out[idx] = byte((n & 0x7F) | 0x80) - idx++ - u := uint64(n) - n = int64(u >> 7) - } - } - return p.trans.Write(varint64out[0:idx]) -} - -// Convert l into a zigzag long. This allows negative numbers to be -// represented compactly as a varint. -func (p *TCompactProtocol) int64ToZigzag(l int64) int64 { - return (l << 1) ^ (l >> 63) -} - -// Convert l into a zigzag long. This allows negative numbers to be -// represented compactly as a varint. -func (p *TCompactProtocol) int32ToZigzag(n int32) int32 { - return (n << 1) ^ (n >> 31) -} - -func (p *TCompactProtocol) fixedUint64ToBytes(n uint64, buf []byte) { - binary.LittleEndian.PutUint64(buf, n) -} - -func (p *TCompactProtocol) fixedInt64ToBytes(n int64, buf []byte) { - binary.LittleEndian.PutUint64(buf, uint64(n)) -} - -// Writes a byte without any possibility of all that field header nonsense. -// Used internally by other writing methods that know they need to write a byte. -func (p *TCompactProtocol) writeByteDirect(b byte) error { - return p.trans.WriteByte(b) -} - -// Writes a byte without any possibility of all that field header nonsense. -func (p *TCompactProtocol) writeIntAsByteDirect(n int) (int, error) { - return 1, p.writeByteDirect(byte(n)) -} - -// -// Internal reading methods -// - -// Read an i32 from the wire as a varint. The MSB of each byte is set -// if there is another byte to follow. This can read up to 5 bytes. -func (p *TCompactProtocol) readVarint32() (int32, error) { - // if the wire contains the right stuff, this will just truncate the i64 we - // read and get us the right sign. - v, err := p.readVarint64() - return int32(v), err -} - -// Read an i64 from the wire as a proper varint. The MSB of each byte is set -// if there is another byte to follow. This can read up to 10 bytes. -func (p *TCompactProtocol) readVarint64() (int64, error) { - shift := uint(0) - result := int64(0) - for { - b, err := p.readByteDirect() - if err != nil { - return 0, err - } - result |= int64(b&0x7f) << shift - if (b & 0x80) != 0x80 { - break - } - shift += 7 - } - return result, nil -} - -// Read a byte, unlike ReadByte that reads Thrift-byte that is i8. -func (p *TCompactProtocol) readByteDirect() (byte, error) { - return p.trans.ReadByte() -} - -// -// encoding helpers -// - -// Convert from zigzag int to int. -func (p *TCompactProtocol) zigzagToInt32(n int32) int32 { - u := uint32(n) - return int32(u>>1) ^ -(n & 1) -} - -// Convert from zigzag long to long. -func (p *TCompactProtocol) zigzagToInt64(n int64) int64 { - u := uint64(n) - return int64(u>>1) ^ -(n & 1) -} - -// Note that it's important that the mask bytes are long literals, -// otherwise they'll default to ints, and when you shift an int left 56 bits, -// you just get a messed up int. -func (p *TCompactProtocol) bytesToInt64(b []byte) int64 { - return int64(binary.LittleEndian.Uint64(b)) -} - -// Note that it's important that the mask bytes are long literals, -// otherwise they'll default to ints, and when you shift an int left 56 bits, -// you just get a messed up int. -func (p *TCompactProtocol) bytesToUint64(b []byte) uint64 { - return binary.LittleEndian.Uint64(b) -} - -// -// type testing and converting -// - -func (p *TCompactProtocol) isBoolType(b byte) bool { - return (b&0x0f) == COMPACT_BOOLEAN_TRUE || (b&0x0f) == COMPACT_BOOLEAN_FALSE -} - -// Given a tCompactType constant, convert it to its corresponding -// TType value. -func (p *TCompactProtocol) getTType(t tCompactType) (TType, error) { - switch byte(t) & 0x0f { - case STOP: - return STOP, nil - case COMPACT_BOOLEAN_FALSE, COMPACT_BOOLEAN_TRUE: - return BOOL, nil - case COMPACT_BYTE: - return BYTE, nil - case COMPACT_I16: - return I16, nil - case COMPACT_I32: - return I32, nil - case COMPACT_I64: - return I64, nil - case COMPACT_DOUBLE: - return DOUBLE, nil - case COMPACT_BINARY: - return STRING, nil - case COMPACT_LIST: - return LIST, nil - case COMPACT_SET: - return SET, nil - case COMPACT_MAP: - return MAP, nil - case COMPACT_STRUCT: - return STRUCT, nil - } - return STOP, TException(fmt.Errorf("don't know what type: %d", t&0x0f)) -} - -// Given a TType value, find the appropriate TCompactProtocol.Types constant. -func (p *TCompactProtocol) getCompactType(t TType) tCompactType { - return ttypeToCompactType[t] -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/exception.go b/vendor/github.com/uber/jaeger-client-go/thrift/exception.go deleted file mode 100644 index ea8d6f66114c..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/exception.go +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -import ( - "errors" -) - -// Generic Thrift exception -type TException interface { - error -} - -// Prepends additional information to an error without losing the Thrift exception interface -func PrependError(prepend string, err error) error { - if t, ok := err.(TTransportException); ok { - return NewTTransportException(t.TypeId(), prepend+t.Error()) - } - if t, ok := err.(TProtocolException); ok { - return NewTProtocolExceptionWithType(t.TypeId(), errors.New(prepend+err.Error())) - } - if t, ok := err.(TApplicationException); ok { - return NewTApplicationException(t.TypeId(), prepend+t.Error()) - } - - return errors.New(prepend + err.Error()) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/memory_buffer.go b/vendor/github.com/uber/jaeger-client-go/thrift/memory_buffer.go deleted file mode 100644 index b62fd56f0634..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/memory_buffer.go +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -import ( - "bytes" -) - -// Memory buffer-based implementation of the TTransport interface. -type TMemoryBuffer struct { - *bytes.Buffer - size int -} - -type TMemoryBufferTransportFactory struct { - size int -} - -func (p *TMemoryBufferTransportFactory) GetTransport(trans TTransport) TTransport { - if trans != nil { - t, ok := trans.(*TMemoryBuffer) - if ok && t.size > 0 { - return NewTMemoryBufferLen(t.size) - } - } - return NewTMemoryBufferLen(p.size) -} - -func NewTMemoryBufferTransportFactory(size int) *TMemoryBufferTransportFactory { - return &TMemoryBufferTransportFactory{size: size} -} - -func NewTMemoryBuffer() *TMemoryBuffer { - return &TMemoryBuffer{Buffer: &bytes.Buffer{}, size: 0} -} - -func NewTMemoryBufferLen(size int) *TMemoryBuffer { - buf := make([]byte, 0, size) - return &TMemoryBuffer{Buffer: bytes.NewBuffer(buf), size: size} -} - -func (p *TMemoryBuffer) IsOpen() bool { - return true -} - -func (p *TMemoryBuffer) Open() error { - return nil -} - -func (p *TMemoryBuffer) Close() error { - p.Buffer.Reset() - return nil -} - -// Flushing a memory buffer is a no-op -func (p *TMemoryBuffer) Flush() error { - return nil -} - -func (p *TMemoryBuffer) RemainingBytes() (num_bytes uint64) { - return uint64(p.Buffer.Len()) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/messagetype.go b/vendor/github.com/uber/jaeger-client-go/thrift/messagetype.go deleted file mode 100644 index 25ab2e98a256..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/messagetype.go +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -// Message type constants in the Thrift protocol. -type TMessageType int32 - -const ( - INVALID_TMESSAGE_TYPE TMessageType = 0 - CALL TMessageType = 1 - REPLY TMessageType = 2 - EXCEPTION TMessageType = 3 - ONEWAY TMessageType = 4 -) diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/numeric.go b/vendor/github.com/uber/jaeger-client-go/thrift/numeric.go deleted file mode 100644 index aa8daa9b54f9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/numeric.go +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -import ( - "math" - "strconv" -) - -type Numeric interface { - Int64() int64 - Int32() int32 - Int16() int16 - Byte() byte - Int() int - Float64() float64 - Float32() float32 - String() string - isNull() bool -} - -type numeric struct { - iValue int64 - dValue float64 - sValue string - isNil bool -} - -var ( - INFINITY Numeric - NEGATIVE_INFINITY Numeric - NAN Numeric - ZERO Numeric - NUMERIC_NULL Numeric -) - -func NewNumericFromDouble(dValue float64) Numeric { - if math.IsInf(dValue, 1) { - return INFINITY - } - if math.IsInf(dValue, -1) { - return NEGATIVE_INFINITY - } - if math.IsNaN(dValue) { - return NAN - } - iValue := int64(dValue) - sValue := strconv.FormatFloat(dValue, 'g', 10, 64) - isNil := false - return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil} -} - -func NewNumericFromI64(iValue int64) Numeric { - dValue := float64(iValue) - sValue := string(iValue) - isNil := false - return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil} -} - -func NewNumericFromI32(iValue int32) Numeric { - dValue := float64(iValue) - sValue := string(iValue) - isNil := false - return &numeric{iValue: int64(iValue), dValue: dValue, sValue: sValue, isNil: isNil} -} - -func NewNumericFromString(sValue string) Numeric { - if sValue == INFINITY.String() { - return INFINITY - } - if sValue == NEGATIVE_INFINITY.String() { - return NEGATIVE_INFINITY - } - if sValue == NAN.String() { - return NAN - } - iValue, _ := strconv.ParseInt(sValue, 10, 64) - dValue, _ := strconv.ParseFloat(sValue, 64) - isNil := len(sValue) == 0 - return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNil} -} - -func NewNumericFromJSONString(sValue string, isNull bool) Numeric { - if isNull { - return NewNullNumeric() - } - if sValue == JSON_INFINITY { - return INFINITY - } - if sValue == JSON_NEGATIVE_INFINITY { - return NEGATIVE_INFINITY - } - if sValue == JSON_NAN { - return NAN - } - iValue, _ := strconv.ParseInt(sValue, 10, 64) - dValue, _ := strconv.ParseFloat(sValue, 64) - return &numeric{iValue: iValue, dValue: dValue, sValue: sValue, isNil: isNull} -} - -func NewNullNumeric() Numeric { - return &numeric{iValue: 0, dValue: 0.0, sValue: "", isNil: true} -} - -func (p *numeric) Int64() int64 { - return p.iValue -} - -func (p *numeric) Int32() int32 { - return int32(p.iValue) -} - -func (p *numeric) Int16() int16 { - return int16(p.iValue) -} - -func (p *numeric) Byte() byte { - return byte(p.iValue) -} - -func (p *numeric) Int() int { - return int(p.iValue) -} - -func (p *numeric) Float64() float64 { - return p.dValue -} - -func (p *numeric) Float32() float32 { - return float32(p.dValue) -} - -func (p *numeric) String() string { - return p.sValue -} - -func (p *numeric) isNull() bool { - return p.isNil -} - -func init() { - INFINITY = &numeric{iValue: 0, dValue: math.Inf(1), sValue: "Infinity", isNil: false} - NEGATIVE_INFINITY = &numeric{iValue: 0, dValue: math.Inf(-1), sValue: "-Infinity", isNil: false} - NAN = &numeric{iValue: 0, dValue: math.NaN(), sValue: "NaN", isNil: false} - ZERO = &numeric{iValue: 0, dValue: 0, sValue: "0", isNil: false} - NUMERIC_NULL = &numeric{iValue: 0, dValue: 0, sValue: "0", isNil: true} -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/processor.go b/vendor/github.com/uber/jaeger-client-go/thrift/processor.go deleted file mode 100644 index ca0d3faf20ee..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/processor.go +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -// A processor is a generic object which operates upon an input stream and -// writes to some output stream. -type TProcessor interface { - Process(in, out TProtocol) (bool, TException) -} - -type TProcessorFunction interface { - Process(seqId int32, in, out TProtocol) (bool, TException) -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/protocol.go b/vendor/github.com/uber/jaeger-client-go/thrift/protocol.go deleted file mode 100644 index 45fa202e741c..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/protocol.go +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -import ( - "errors" -) - -const ( - VERSION_MASK = 0xffff0000 - VERSION_1 = 0x80010000 -) - -type TProtocol interface { - WriteMessageBegin(name string, typeId TMessageType, seqid int32) error - WriteMessageEnd() error - WriteStructBegin(name string) error - WriteStructEnd() error - WriteFieldBegin(name string, typeId TType, id int16) error - WriteFieldEnd() error - WriteFieldStop() error - WriteMapBegin(keyType TType, valueType TType, size int) error - WriteMapEnd() error - WriteListBegin(elemType TType, size int) error - WriteListEnd() error - WriteSetBegin(elemType TType, size int) error - WriteSetEnd() error - WriteBool(value bool) error - WriteByte(value int8) error - WriteI16(value int16) error - WriteI32(value int32) error - WriteI64(value int64) error - WriteDouble(value float64) error - WriteString(value string) error - WriteBinary(value []byte) error - - ReadMessageBegin() (name string, typeId TMessageType, seqid int32, err error) - ReadMessageEnd() error - ReadStructBegin() (name string, err error) - ReadStructEnd() error - ReadFieldBegin() (name string, typeId TType, id int16, err error) - ReadFieldEnd() error - ReadMapBegin() (keyType TType, valueType TType, size int, err error) - ReadMapEnd() error - ReadListBegin() (elemType TType, size int, err error) - ReadListEnd() error - ReadSetBegin() (elemType TType, size int, err error) - ReadSetEnd() error - ReadBool() (value bool, err error) - ReadByte() (value int8, err error) - ReadI16() (value int16, err error) - ReadI32() (value int32, err error) - ReadI64() (value int64, err error) - ReadDouble() (value float64, err error) - ReadString() (value string, err error) - ReadBinary() (value []byte, err error) - - Skip(fieldType TType) (err error) - Flush() (err error) - - Transport() TTransport -} - -// The maximum recursive depth the skip() function will traverse -const DEFAULT_RECURSION_DEPTH = 64 - -// Skips over the next data element from the provided input TProtocol object. -func SkipDefaultDepth(prot TProtocol, typeId TType) (err error) { - return Skip(prot, typeId, DEFAULT_RECURSION_DEPTH) -} - -// Skips over the next data element from the provided input TProtocol object. -func Skip(self TProtocol, fieldType TType, maxDepth int) (err error) { - - if maxDepth <= 0 { - return NewTProtocolExceptionWithType( DEPTH_LIMIT, errors.New("Depth limit exceeded")) - } - - switch fieldType { - case STOP: - return - case BOOL: - _, err = self.ReadBool() - return - case BYTE: - _, err = self.ReadByte() - return - case I16: - _, err = self.ReadI16() - return - case I32: - _, err = self.ReadI32() - return - case I64: - _, err = self.ReadI64() - return - case DOUBLE: - _, err = self.ReadDouble() - return - case STRING: - _, err = self.ReadString() - return - case STRUCT: - if _, err = self.ReadStructBegin(); err != nil { - return err - } - for { - _, typeId, _, _ := self.ReadFieldBegin() - if typeId == STOP { - break - } - err := Skip(self, typeId, maxDepth-1) - if err != nil { - return err - } - self.ReadFieldEnd() - } - return self.ReadStructEnd() - case MAP: - keyType, valueType, size, err := self.ReadMapBegin() - if err != nil { - return err - } - for i := 0; i < size; i++ { - err := Skip(self, keyType, maxDepth-1) - if err != nil { - return err - } - self.Skip(valueType) - } - return self.ReadMapEnd() - case SET: - elemType, size, err := self.ReadSetBegin() - if err != nil { - return err - } - for i := 0; i < size; i++ { - err := Skip(self, elemType, maxDepth-1) - if err != nil { - return err - } - } - return self.ReadSetEnd() - case LIST: - elemType, size, err := self.ReadListBegin() - if err != nil { - return err - } - for i := 0; i < size; i++ { - err := Skip(self, elemType, maxDepth-1) - if err != nil { - return err - } - } - return self.ReadListEnd() - } - return nil -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/protocol_exception.go b/vendor/github.com/uber/jaeger-client-go/thrift/protocol_exception.go deleted file mode 100644 index 6e357ee890df..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/protocol_exception.go +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -import ( - "encoding/base64" -) - -// Thrift Protocol exception -type TProtocolException interface { - TException - TypeId() int -} - -const ( - UNKNOWN_PROTOCOL_EXCEPTION = 0 - INVALID_DATA = 1 - NEGATIVE_SIZE = 2 - SIZE_LIMIT = 3 - BAD_VERSION = 4 - NOT_IMPLEMENTED = 5 - DEPTH_LIMIT = 6 -) - -type tProtocolException struct { - typeId int - message string -} - -func (p *tProtocolException) TypeId() int { - return p.typeId -} - -func (p *tProtocolException) String() string { - return p.message -} - -func (p *tProtocolException) Error() string { - return p.message -} - -func NewTProtocolException(err error) TProtocolException { - if err == nil { - return nil - } - if e,ok := err.(TProtocolException); ok { - return e - } - if _, ok := err.(base64.CorruptInputError); ok { - return &tProtocolException{INVALID_DATA, err.Error()} - } - return &tProtocolException{UNKNOWN_PROTOCOL_EXCEPTION, err.Error()} -} - -func NewTProtocolExceptionWithType(errType int, err error) TProtocolException { - if err == nil { - return nil - } - return &tProtocolException{errType, err.Error()} -} - diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/protocol_factory.go b/vendor/github.com/uber/jaeger-client-go/thrift/protocol_factory.go deleted file mode 100644 index c40f796d886a..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/protocol_factory.go +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -// Factory interface for constructing protocol instances. -type TProtocolFactory interface { - GetProtocol(trans TTransport) TProtocol -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/rich_transport.go b/vendor/github.com/uber/jaeger-client-go/thrift/rich_transport.go deleted file mode 100644 index 8e296a99b5f9..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/rich_transport.go +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -import "io" - -type RichTransport struct { - TTransport -} - -// Wraps Transport to provide TRichTransport interface -func NewTRichTransport(trans TTransport) *RichTransport { - return &RichTransport{trans} -} - -func (r *RichTransport) ReadByte() (c byte, err error) { - return readByte(r.TTransport) -} - -func (r *RichTransport) WriteByte(c byte) error { - return writeByte(r.TTransport, c) -} - -func (r *RichTransport) WriteString(s string) (n int, err error) { - return r.Write([]byte(s)) -} - -func (r *RichTransport) RemainingBytes() (num_bytes uint64) { - return r.TTransport.RemainingBytes() -} - -func readByte(r io.Reader) (c byte, err error) { - v := [1]byte{0} - n, err := r.Read(v[0:1]) - if n > 0 && (err == nil || err == io.EOF) { - return v[0], nil - } - if n > 0 && err != nil { - return v[0], err - } - if err != nil { - return 0, err - } - return v[0], nil -} - -func writeByte(w io.Writer, c byte) error { - v := [1]byte{c} - _, err := w.Write(v[0:1]) - return err -} - diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/serializer.go b/vendor/github.com/uber/jaeger-client-go/thrift/serializer.go deleted file mode 100644 index 771222999091..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/serializer.go +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -type TSerializer struct { - Transport *TMemoryBuffer - Protocol TProtocol -} - -type TStruct interface { - Write(p TProtocol) error - Read(p TProtocol) error -} - -func NewTSerializer() *TSerializer { - transport := NewTMemoryBufferLen(1024) - protocol := NewTBinaryProtocolFactoryDefault().GetProtocol(transport) - - return &TSerializer{ - transport, - protocol} -} - -func (t *TSerializer) WriteString(msg TStruct) (s string, err error) { - t.Transport.Reset() - - if err = msg.Write(t.Protocol); err != nil { - return - } - - if err = t.Protocol.Flush(); err != nil { - return - } - if err = t.Transport.Flush(); err != nil { - return - } - - return t.Transport.String(), nil -} - -func (t *TSerializer) Write(msg TStruct) (b []byte, err error) { - t.Transport.Reset() - - if err = msg.Write(t.Protocol); err != nil { - return - } - - if err = t.Protocol.Flush(); err != nil { - return - } - - if err = t.Transport.Flush(); err != nil { - return - } - - b = append(b, t.Transport.Bytes()...) - return -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/simple_json_protocol.go b/vendor/github.com/uber/jaeger-client-go/thrift/simple_json_protocol.go deleted file mode 100644 index 412a482d055a..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/simple_json_protocol.go +++ /dev/null @@ -1,1337 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -import ( - "bufio" - "bytes" - "encoding/base64" - "encoding/json" - "fmt" - "io" - "math" - "strconv" -) - -type _ParseContext int - -const ( - _CONTEXT_IN_TOPLEVEL _ParseContext = 1 - _CONTEXT_IN_LIST_FIRST _ParseContext = 2 - _CONTEXT_IN_LIST _ParseContext = 3 - _CONTEXT_IN_OBJECT_FIRST _ParseContext = 4 - _CONTEXT_IN_OBJECT_NEXT_KEY _ParseContext = 5 - _CONTEXT_IN_OBJECT_NEXT_VALUE _ParseContext = 6 -) - -func (p _ParseContext) String() string { - switch p { - case _CONTEXT_IN_TOPLEVEL: - return "TOPLEVEL" - case _CONTEXT_IN_LIST_FIRST: - return "LIST-FIRST" - case _CONTEXT_IN_LIST: - return "LIST" - case _CONTEXT_IN_OBJECT_FIRST: - return "OBJECT-FIRST" - case _CONTEXT_IN_OBJECT_NEXT_KEY: - return "OBJECT-NEXT-KEY" - case _CONTEXT_IN_OBJECT_NEXT_VALUE: - return "OBJECT-NEXT-VALUE" - } - return "UNKNOWN-PARSE-CONTEXT" -} - -// JSON protocol implementation for thrift. -// -// This protocol produces/consumes a simple output format -// suitable for parsing by scripting languages. It should not be -// confused with the full-featured TJSONProtocol. -// -type TSimpleJSONProtocol struct { - trans TTransport - - parseContextStack []int - dumpContext []int - - writer *bufio.Writer - reader *bufio.Reader -} - -// Constructor -func NewTSimpleJSONProtocol(t TTransport) *TSimpleJSONProtocol { - v := &TSimpleJSONProtocol{trans: t, - writer: bufio.NewWriter(t), - reader: bufio.NewReader(t), - } - v.parseContextStack = append(v.parseContextStack, int(_CONTEXT_IN_TOPLEVEL)) - v.dumpContext = append(v.dumpContext, int(_CONTEXT_IN_TOPLEVEL)) - return v -} - -// Factory -type TSimpleJSONProtocolFactory struct{} - -func (p *TSimpleJSONProtocolFactory) GetProtocol(trans TTransport) TProtocol { - return NewTSimpleJSONProtocol(trans) -} - -func NewTSimpleJSONProtocolFactory() *TSimpleJSONProtocolFactory { - return &TSimpleJSONProtocolFactory{} -} - -var ( - JSON_COMMA []byte - JSON_COLON []byte - JSON_LBRACE []byte - JSON_RBRACE []byte - JSON_LBRACKET []byte - JSON_RBRACKET []byte - JSON_QUOTE byte - JSON_QUOTE_BYTES []byte - JSON_NULL []byte - JSON_TRUE []byte - JSON_FALSE []byte - JSON_INFINITY string - JSON_NEGATIVE_INFINITY string - JSON_NAN string - JSON_INFINITY_BYTES []byte - JSON_NEGATIVE_INFINITY_BYTES []byte - JSON_NAN_BYTES []byte - json_nonbase_map_elem_bytes []byte -) - -func init() { - JSON_COMMA = []byte{','} - JSON_COLON = []byte{':'} - JSON_LBRACE = []byte{'{'} - JSON_RBRACE = []byte{'}'} - JSON_LBRACKET = []byte{'['} - JSON_RBRACKET = []byte{']'} - JSON_QUOTE = '"' - JSON_QUOTE_BYTES = []byte{'"'} - JSON_NULL = []byte{'n', 'u', 'l', 'l'} - JSON_TRUE = []byte{'t', 'r', 'u', 'e'} - JSON_FALSE = []byte{'f', 'a', 'l', 's', 'e'} - JSON_INFINITY = "Infinity" - JSON_NEGATIVE_INFINITY = "-Infinity" - JSON_NAN = "NaN" - JSON_INFINITY_BYTES = []byte{'I', 'n', 'f', 'i', 'n', 'i', 't', 'y'} - JSON_NEGATIVE_INFINITY_BYTES = []byte{'-', 'I', 'n', 'f', 'i', 'n', 'i', 't', 'y'} - JSON_NAN_BYTES = []byte{'N', 'a', 'N'} - json_nonbase_map_elem_bytes = []byte{']', ',', '['} -} - -func jsonQuote(s string) string { - b, _ := json.Marshal(s) - s1 := string(b) - return s1 -} - -func jsonUnquote(s string) (string, bool) { - s1 := new(string) - err := json.Unmarshal([]byte(s), s1) - return *s1, err == nil -} - -func mismatch(expected, actual string) error { - return fmt.Errorf("Expected '%s' but found '%s' while parsing JSON.", expected, actual) -} - -func (p *TSimpleJSONProtocol) WriteMessageBegin(name string, typeId TMessageType, seqId int32) error { - p.resetContextStack() // THRIFT-3735 - if e := p.OutputListBegin(); e != nil { - return e - } - if e := p.WriteString(name); e != nil { - return e - } - if e := p.WriteByte(int8(typeId)); e != nil { - return e - } - if e := p.WriteI32(seqId); e != nil { - return e - } - return nil -} - -func (p *TSimpleJSONProtocol) WriteMessageEnd() error { - return p.OutputListEnd() -} - -func (p *TSimpleJSONProtocol) WriteStructBegin(name string) error { - if e := p.OutputObjectBegin(); e != nil { - return e - } - return nil -} - -func (p *TSimpleJSONProtocol) WriteStructEnd() error { - return p.OutputObjectEnd() -} - -func (p *TSimpleJSONProtocol) WriteFieldBegin(name string, typeId TType, id int16) error { - if e := p.WriteString(name); e != nil { - return e - } - return nil -} - -func (p *TSimpleJSONProtocol) WriteFieldEnd() error { - //return p.OutputListEnd() - return nil -} - -func (p *TSimpleJSONProtocol) WriteFieldStop() error { return nil } - -func (p *TSimpleJSONProtocol) WriteMapBegin(keyType TType, valueType TType, size int) error { - if e := p.OutputListBegin(); e != nil { - return e - } - if e := p.WriteByte(int8(keyType)); e != nil { - return e - } - if e := p.WriteByte(int8(valueType)); e != nil { - return e - } - return p.WriteI32(int32(size)) -} - -func (p *TSimpleJSONProtocol) WriteMapEnd() error { - return p.OutputListEnd() -} - -func (p *TSimpleJSONProtocol) WriteListBegin(elemType TType, size int) error { - return p.OutputElemListBegin(elemType, size) -} - -func (p *TSimpleJSONProtocol) WriteListEnd() error { - return p.OutputListEnd() -} - -func (p *TSimpleJSONProtocol) WriteSetBegin(elemType TType, size int) error { - return p.OutputElemListBegin(elemType, size) -} - -func (p *TSimpleJSONProtocol) WriteSetEnd() error { - return p.OutputListEnd() -} - -func (p *TSimpleJSONProtocol) WriteBool(b bool) error { - return p.OutputBool(b) -} - -func (p *TSimpleJSONProtocol) WriteByte(b int8) error { - return p.WriteI32(int32(b)) -} - -func (p *TSimpleJSONProtocol) WriteI16(v int16) error { - return p.WriteI32(int32(v)) -} - -func (p *TSimpleJSONProtocol) WriteI32(v int32) error { - return p.OutputI64(int64(v)) -} - -func (p *TSimpleJSONProtocol) WriteI64(v int64) error { - return p.OutputI64(int64(v)) -} - -func (p *TSimpleJSONProtocol) WriteDouble(v float64) error { - return p.OutputF64(v) -} - -func (p *TSimpleJSONProtocol) WriteString(v string) error { - return p.OutputString(v) -} - -func (p *TSimpleJSONProtocol) WriteBinary(v []byte) error { - // JSON library only takes in a string, - // not an arbitrary byte array, to ensure bytes are transmitted - // efficiently we must convert this into a valid JSON string - // therefore we use base64 encoding to avoid excessive escaping/quoting - if e := p.OutputPreValue(); e != nil { - return e - } - if _, e := p.write(JSON_QUOTE_BYTES); e != nil { - return NewTProtocolException(e) - } - writer := base64.NewEncoder(base64.StdEncoding, p.writer) - if _, e := writer.Write(v); e != nil { - p.writer.Reset(p.trans) // THRIFT-3735 - return NewTProtocolException(e) - } - if e := writer.Close(); e != nil { - return NewTProtocolException(e) - } - if _, e := p.write(JSON_QUOTE_BYTES); e != nil { - return NewTProtocolException(e) - } - return p.OutputPostValue() -} - -// Reading methods. -func (p *TSimpleJSONProtocol) ReadMessageBegin() (name string, typeId TMessageType, seqId int32, err error) { - p.resetContextStack() // THRIFT-3735 - if isNull, err := p.ParseListBegin(); isNull || err != nil { - return name, typeId, seqId, err - } - if name, err = p.ReadString(); err != nil { - return name, typeId, seqId, err - } - bTypeId, err := p.ReadByte() - typeId = TMessageType(bTypeId) - if err != nil { - return name, typeId, seqId, err - } - if seqId, err = p.ReadI32(); err != nil { - return name, typeId, seqId, err - } - return name, typeId, seqId, nil -} - -func (p *TSimpleJSONProtocol) ReadMessageEnd() error { - return p.ParseListEnd() -} - -func (p *TSimpleJSONProtocol) ReadStructBegin() (name string, err error) { - _, err = p.ParseObjectStart() - return "", err -} - -func (p *TSimpleJSONProtocol) ReadStructEnd() error { - return p.ParseObjectEnd() -} - -func (p *TSimpleJSONProtocol) ReadFieldBegin() (string, TType, int16, error) { - if err := p.ParsePreValue(); err != nil { - return "", STOP, 0, err - } - b, _ := p.reader.Peek(1) - if len(b) > 0 { - switch b[0] { - case JSON_RBRACE[0]: - return "", STOP, 0, nil - case JSON_QUOTE: - p.reader.ReadByte() - name, err := p.ParseStringBody() - // simplejson is not meant to be read back into thrift - // - see http://wiki.apache.org/thrift/ThriftUsageJava - // - use JSON instead - if err != nil { - return name, STOP, 0, err - } - return name, STOP, -1, p.ParsePostValue() - /* - if err = p.ParsePostValue(); err != nil { - return name, STOP, 0, err - } - if isNull, err := p.ParseListBegin(); isNull || err != nil { - return name, STOP, 0, err - } - bType, err := p.ReadByte() - thetype := TType(bType) - if err != nil { - return name, thetype, 0, err - } - id, err := p.ReadI16() - return name, thetype, id, err - */ - } - e := fmt.Errorf("Expected \"}\" or '\"', but found: '%s'", string(b)) - return "", STOP, 0, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - return "", STOP, 0, NewTProtocolException(io.EOF) -} - -func (p *TSimpleJSONProtocol) ReadFieldEnd() error { - return nil - //return p.ParseListEnd() -} - -func (p *TSimpleJSONProtocol) ReadMapBegin() (keyType TType, valueType TType, size int, e error) { - if isNull, e := p.ParseListBegin(); isNull || e != nil { - return VOID, VOID, 0, e - } - - // read keyType - bKeyType, e := p.ReadByte() - keyType = TType(bKeyType) - if e != nil { - return keyType, valueType, size, e - } - - // read valueType - bValueType, e := p.ReadByte() - valueType = TType(bValueType) - if e != nil { - return keyType, valueType, size, e - } - - // read size - iSize, err := p.ReadI64() - size = int(iSize) - return keyType, valueType, size, err -} - -func (p *TSimpleJSONProtocol) ReadMapEnd() error { - return p.ParseListEnd() -} - -func (p *TSimpleJSONProtocol) ReadListBegin() (elemType TType, size int, e error) { - return p.ParseElemListBegin() -} - -func (p *TSimpleJSONProtocol) ReadListEnd() error { - return p.ParseListEnd() -} - -func (p *TSimpleJSONProtocol) ReadSetBegin() (elemType TType, size int, e error) { - return p.ParseElemListBegin() -} - -func (p *TSimpleJSONProtocol) ReadSetEnd() error { - return p.ParseListEnd() -} - -func (p *TSimpleJSONProtocol) ReadBool() (bool, error) { - var value bool - - if err := p.ParsePreValue(); err != nil { - return value, err - } - f, _ := p.reader.Peek(1) - if len(f) > 0 { - switch f[0] { - case JSON_TRUE[0]: - b := make([]byte, len(JSON_TRUE)) - _, err := p.reader.Read(b) - if err != nil { - return false, NewTProtocolException(err) - } - if string(b) == string(JSON_TRUE) { - value = true - } else { - e := fmt.Errorf("Expected \"true\" but found: %s", string(b)) - return value, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - break - case JSON_FALSE[0]: - b := make([]byte, len(JSON_FALSE)) - _, err := p.reader.Read(b) - if err != nil { - return false, NewTProtocolException(err) - } - if string(b) == string(JSON_FALSE) { - value = false - } else { - e := fmt.Errorf("Expected \"false\" but found: %s", string(b)) - return value, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - break - case JSON_NULL[0]: - b := make([]byte, len(JSON_NULL)) - _, err := p.reader.Read(b) - if err != nil { - return false, NewTProtocolException(err) - } - if string(b) == string(JSON_NULL) { - value = false - } else { - e := fmt.Errorf("Expected \"null\" but found: %s", string(b)) - return value, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - default: - e := fmt.Errorf("Expected \"true\", \"false\", or \"null\" but found: %s", string(f)) - return value, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } - return value, p.ParsePostValue() -} - -func (p *TSimpleJSONProtocol) ReadByte() (int8, error) { - v, err := p.ReadI64() - return int8(v), err -} - -func (p *TSimpleJSONProtocol) ReadI16() (int16, error) { - v, err := p.ReadI64() - return int16(v), err -} - -func (p *TSimpleJSONProtocol) ReadI32() (int32, error) { - v, err := p.ReadI64() - return int32(v), err -} - -func (p *TSimpleJSONProtocol) ReadI64() (int64, error) { - v, _, err := p.ParseI64() - return v, err -} - -func (p *TSimpleJSONProtocol) ReadDouble() (float64, error) { - v, _, err := p.ParseF64() - return v, err -} - -func (p *TSimpleJSONProtocol) ReadString() (string, error) { - var v string - if err := p.ParsePreValue(); err != nil { - return v, err - } - f, _ := p.reader.Peek(1) - if len(f) > 0 && f[0] == JSON_QUOTE { - p.reader.ReadByte() - value, err := p.ParseStringBody() - v = value - if err != nil { - return v, err - } - } else if len(f) > 0 && f[0] == JSON_NULL[0] { - b := make([]byte, len(JSON_NULL)) - _, err := p.reader.Read(b) - if err != nil { - return v, NewTProtocolException(err) - } - if string(b) != string(JSON_NULL) { - e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(b)) - return v, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } else { - e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(f)) - return v, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - return v, p.ParsePostValue() -} - -func (p *TSimpleJSONProtocol) ReadBinary() ([]byte, error) { - var v []byte - if err := p.ParsePreValue(); err != nil { - return nil, err - } - f, _ := p.reader.Peek(1) - if len(f) > 0 && f[0] == JSON_QUOTE { - p.reader.ReadByte() - value, err := p.ParseBase64EncodedBody() - v = value - if err != nil { - return v, err - } - } else if len(f) > 0 && f[0] == JSON_NULL[0] { - b := make([]byte, len(JSON_NULL)) - _, err := p.reader.Read(b) - if err != nil { - return v, NewTProtocolException(err) - } - if string(b) != string(JSON_NULL) { - e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(b)) - return v, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } else { - e := fmt.Errorf("Expected a JSON string, found unquoted data started with %s", string(f)) - return v, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - - return v, p.ParsePostValue() -} - -func (p *TSimpleJSONProtocol) Flush() (err error) { - return NewTProtocolException(p.writer.Flush()) -} - -func (p *TSimpleJSONProtocol) Skip(fieldType TType) (err error) { - return SkipDefaultDepth(p, fieldType) -} - -func (p *TSimpleJSONProtocol) Transport() TTransport { - return p.trans -} - -func (p *TSimpleJSONProtocol) OutputPreValue() error { - cxt := _ParseContext(p.dumpContext[len(p.dumpContext)-1]) - switch cxt { - case _CONTEXT_IN_LIST, _CONTEXT_IN_OBJECT_NEXT_KEY: - if _, e := p.write(JSON_COMMA); e != nil { - return NewTProtocolException(e) - } - break - case _CONTEXT_IN_OBJECT_NEXT_VALUE: - if _, e := p.write(JSON_COLON); e != nil { - return NewTProtocolException(e) - } - break - } - return nil -} - -func (p *TSimpleJSONProtocol) OutputPostValue() error { - cxt := _ParseContext(p.dumpContext[len(p.dumpContext)-1]) - switch cxt { - case _CONTEXT_IN_LIST_FIRST: - p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] - p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_LIST)) - break - case _CONTEXT_IN_OBJECT_FIRST: - p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] - p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_VALUE)) - break - case _CONTEXT_IN_OBJECT_NEXT_KEY: - p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] - p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_VALUE)) - break - case _CONTEXT_IN_OBJECT_NEXT_VALUE: - p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] - p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_NEXT_KEY)) - break - } - return nil -} - -func (p *TSimpleJSONProtocol) OutputBool(value bool) error { - if e := p.OutputPreValue(); e != nil { - return e - } - var v string - if value { - v = string(JSON_TRUE) - } else { - v = string(JSON_FALSE) - } - switch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) { - case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: - v = jsonQuote(v) - default: - } - if e := p.OutputStringData(v); e != nil { - return e - } - return p.OutputPostValue() -} - -func (p *TSimpleJSONProtocol) OutputNull() error { - if e := p.OutputPreValue(); e != nil { - return e - } - if _, e := p.write(JSON_NULL); e != nil { - return NewTProtocolException(e) - } - return p.OutputPostValue() -} - -func (p *TSimpleJSONProtocol) OutputF64(value float64) error { - if e := p.OutputPreValue(); e != nil { - return e - } - var v string - if math.IsNaN(value) { - v = string(JSON_QUOTE) + JSON_NAN + string(JSON_QUOTE) - } else if math.IsInf(value, 1) { - v = string(JSON_QUOTE) + JSON_INFINITY + string(JSON_QUOTE) - } else if math.IsInf(value, -1) { - v = string(JSON_QUOTE) + JSON_NEGATIVE_INFINITY + string(JSON_QUOTE) - } else { - v = strconv.FormatFloat(value, 'g', -1, 64) - switch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) { - case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: - v = string(JSON_QUOTE) + v + string(JSON_QUOTE) - default: - } - } - if e := p.OutputStringData(v); e != nil { - return e - } - return p.OutputPostValue() -} - -func (p *TSimpleJSONProtocol) OutputI64(value int64) error { - if e := p.OutputPreValue(); e != nil { - return e - } - v := strconv.FormatInt(value, 10) - switch _ParseContext(p.dumpContext[len(p.dumpContext)-1]) { - case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: - v = jsonQuote(v) - default: - } - if e := p.OutputStringData(v); e != nil { - return e - } - return p.OutputPostValue() -} - -func (p *TSimpleJSONProtocol) OutputString(s string) error { - if e := p.OutputPreValue(); e != nil { - return e - } - if e := p.OutputStringData(jsonQuote(s)); e != nil { - return e - } - return p.OutputPostValue() -} - -func (p *TSimpleJSONProtocol) OutputStringData(s string) error { - _, e := p.write([]byte(s)) - return NewTProtocolException(e) -} - -func (p *TSimpleJSONProtocol) OutputObjectBegin() error { - if e := p.OutputPreValue(); e != nil { - return e - } - if _, e := p.write(JSON_LBRACE); e != nil { - return NewTProtocolException(e) - } - p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_OBJECT_FIRST)) - return nil -} - -func (p *TSimpleJSONProtocol) OutputObjectEnd() error { - if _, e := p.write(JSON_RBRACE); e != nil { - return NewTProtocolException(e) - } - p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] - if e := p.OutputPostValue(); e != nil { - return e - } - return nil -} - -func (p *TSimpleJSONProtocol) OutputListBegin() error { - if e := p.OutputPreValue(); e != nil { - return e - } - if _, e := p.write(JSON_LBRACKET); e != nil { - return NewTProtocolException(e) - } - p.dumpContext = append(p.dumpContext, int(_CONTEXT_IN_LIST_FIRST)) - return nil -} - -func (p *TSimpleJSONProtocol) OutputListEnd() error { - if _, e := p.write(JSON_RBRACKET); e != nil { - return NewTProtocolException(e) - } - p.dumpContext = p.dumpContext[:len(p.dumpContext)-1] - if e := p.OutputPostValue(); e != nil { - return e - } - return nil -} - -func (p *TSimpleJSONProtocol) OutputElemListBegin(elemType TType, size int) error { - if e := p.OutputListBegin(); e != nil { - return e - } - if e := p.WriteByte(int8(elemType)); e != nil { - return e - } - if e := p.WriteI64(int64(size)); e != nil { - return e - } - return nil -} - -func (p *TSimpleJSONProtocol) ParsePreValue() error { - if e := p.readNonSignificantWhitespace(); e != nil { - return NewTProtocolException(e) - } - cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) - b, _ := p.reader.Peek(1) - switch cxt { - case _CONTEXT_IN_LIST: - if len(b) > 0 { - switch b[0] { - case JSON_RBRACKET[0]: - return nil - case JSON_COMMA[0]: - p.reader.ReadByte() - if e := p.readNonSignificantWhitespace(); e != nil { - return NewTProtocolException(e) - } - return nil - default: - e := fmt.Errorf("Expected \"]\" or \",\" in list context, but found \"%s\"", string(b)) - return NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } - break - case _CONTEXT_IN_OBJECT_NEXT_KEY: - if len(b) > 0 { - switch b[0] { - case JSON_RBRACE[0]: - return nil - case JSON_COMMA[0]: - p.reader.ReadByte() - if e := p.readNonSignificantWhitespace(); e != nil { - return NewTProtocolException(e) - } - return nil - default: - e := fmt.Errorf("Expected \"}\" or \",\" in object context, but found \"%s\"", string(b)) - return NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } - break - case _CONTEXT_IN_OBJECT_NEXT_VALUE: - if len(b) > 0 { - switch b[0] { - case JSON_COLON[0]: - p.reader.ReadByte() - if e := p.readNonSignificantWhitespace(); e != nil { - return NewTProtocolException(e) - } - return nil - default: - e := fmt.Errorf("Expected \":\" in object context, but found \"%s\"", string(b)) - return NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } - break - } - return nil -} - -func (p *TSimpleJSONProtocol) ParsePostValue() error { - if e := p.readNonSignificantWhitespace(); e != nil { - return NewTProtocolException(e) - } - cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) - switch cxt { - case _CONTEXT_IN_LIST_FIRST: - p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] - p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_LIST)) - break - case _CONTEXT_IN_OBJECT_FIRST, _CONTEXT_IN_OBJECT_NEXT_KEY: - p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] - p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_NEXT_VALUE)) - break - case _CONTEXT_IN_OBJECT_NEXT_VALUE: - p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] - p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_NEXT_KEY)) - break - } - return nil -} - -func (p *TSimpleJSONProtocol) readNonSignificantWhitespace() error { - for { - b, _ := p.reader.Peek(1) - if len(b) < 1 { - return nil - } - switch b[0] { - case ' ', '\r', '\n', '\t': - p.reader.ReadByte() - continue - default: - break - } - break - } - return nil -} - -func (p *TSimpleJSONProtocol) ParseStringBody() (string, error) { - line, err := p.reader.ReadString(JSON_QUOTE) - if err != nil { - return "", NewTProtocolException(err) - } - l := len(line) - // count number of escapes to see if we need to keep going - i := 1 - for ; i < l; i++ { - if line[l-i-1] != '\\' { - break - } - } - if i&0x01 == 1 { - v, ok := jsonUnquote(string(JSON_QUOTE) + line) - if !ok { - return "", NewTProtocolException(err) - } - return v, nil - } - s, err := p.ParseQuotedStringBody() - if err != nil { - return "", NewTProtocolException(err) - } - str := string(JSON_QUOTE) + line + s - v, ok := jsonUnquote(str) - if !ok { - e := fmt.Errorf("Unable to parse as JSON string %s", str) - return "", NewTProtocolExceptionWithType(INVALID_DATA, e) - } - return v, nil -} - -func (p *TSimpleJSONProtocol) ParseQuotedStringBody() (string, error) { - line, err := p.reader.ReadString(JSON_QUOTE) - if err != nil { - return "", NewTProtocolException(err) - } - l := len(line) - // count number of escapes to see if we need to keep going - i := 1 - for ; i < l; i++ { - if line[l-i-1] != '\\' { - break - } - } - if i&0x01 == 1 { - return line, nil - } - s, err := p.ParseQuotedStringBody() - if err != nil { - return "", NewTProtocolException(err) - } - v := line + s - return v, nil -} - -func (p *TSimpleJSONProtocol) ParseBase64EncodedBody() ([]byte, error) { - line, err := p.reader.ReadBytes(JSON_QUOTE) - if err != nil { - return line, NewTProtocolException(err) - } - line2 := line[0 : len(line)-1] - l := len(line2) - if (l % 4) != 0 { - pad := 4 - (l % 4) - fill := [...]byte{'=', '=', '='} - line2 = append(line2, fill[:pad]...) - l = len(line2) - } - output := make([]byte, base64.StdEncoding.DecodedLen(l)) - n, err := base64.StdEncoding.Decode(output, line2) - return output[0:n], NewTProtocolException(err) -} - -func (p *TSimpleJSONProtocol) ParseI64() (int64, bool, error) { - if err := p.ParsePreValue(); err != nil { - return 0, false, err - } - var value int64 - var isnull bool - if p.safePeekContains(JSON_NULL) { - p.reader.Read(make([]byte, len(JSON_NULL))) - isnull = true - } else { - num, err := p.readNumeric() - isnull = (num == nil) - if !isnull { - value = num.Int64() - } - if err != nil { - return value, isnull, err - } - } - return value, isnull, p.ParsePostValue() -} - -func (p *TSimpleJSONProtocol) ParseF64() (float64, bool, error) { - if err := p.ParsePreValue(); err != nil { - return 0, false, err - } - var value float64 - var isnull bool - if p.safePeekContains(JSON_NULL) { - p.reader.Read(make([]byte, len(JSON_NULL))) - isnull = true - } else { - num, err := p.readNumeric() - isnull = (num == nil) - if !isnull { - value = num.Float64() - } - if err != nil { - return value, isnull, err - } - } - return value, isnull, p.ParsePostValue() -} - -func (p *TSimpleJSONProtocol) ParseObjectStart() (bool, error) { - if err := p.ParsePreValue(); err != nil { - return false, err - } - var b []byte - b, err := p.reader.Peek(1) - if err != nil { - return false, err - } - if len(b) > 0 && b[0] == JSON_LBRACE[0] { - p.reader.ReadByte() - p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_OBJECT_FIRST)) - return false, nil - } else if p.safePeekContains(JSON_NULL) { - return true, nil - } - e := fmt.Errorf("Expected '{' or null, but found '%s'", string(b)) - return false, NewTProtocolExceptionWithType(INVALID_DATA, e) -} - -func (p *TSimpleJSONProtocol) ParseObjectEnd() error { - if isNull, err := p.readIfNull(); isNull || err != nil { - return err - } - cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) - if (cxt != _CONTEXT_IN_OBJECT_FIRST) && (cxt != _CONTEXT_IN_OBJECT_NEXT_KEY) { - e := fmt.Errorf("Expected to be in the Object Context, but not in Object Context (%d)", cxt) - return NewTProtocolExceptionWithType(INVALID_DATA, e) - } - line, err := p.reader.ReadString(JSON_RBRACE[0]) - if err != nil { - return NewTProtocolException(err) - } - for _, char := range line { - switch char { - default: - e := fmt.Errorf("Expecting end of object \"}\", but found: \"%s\"", line) - return NewTProtocolExceptionWithType(INVALID_DATA, e) - case ' ', '\n', '\r', '\t', '}': - break - } - } - p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] - return p.ParsePostValue() -} - -func (p *TSimpleJSONProtocol) ParseListBegin() (isNull bool, err error) { - if e := p.ParsePreValue(); e != nil { - return false, e - } - var b []byte - b, err = p.reader.Peek(1) - if err != nil { - return false, err - } - if len(b) >= 1 && b[0] == JSON_LBRACKET[0] { - p.parseContextStack = append(p.parseContextStack, int(_CONTEXT_IN_LIST_FIRST)) - p.reader.ReadByte() - isNull = false - } else if p.safePeekContains(JSON_NULL) { - isNull = true - } else { - err = fmt.Errorf("Expected \"null\" or \"[\", received %q", b) - } - return isNull, NewTProtocolExceptionWithType(INVALID_DATA, err) -} - -func (p *TSimpleJSONProtocol) ParseElemListBegin() (elemType TType, size int, e error) { - if isNull, e := p.ParseListBegin(); isNull || e != nil { - return VOID, 0, e - } - bElemType, err := p.ReadByte() - elemType = TType(bElemType) - if err != nil { - return elemType, size, err - } - nSize, err2 := p.ReadI64() - size = int(nSize) - return elemType, size, err2 -} - -func (p *TSimpleJSONProtocol) ParseListEnd() error { - if isNull, err := p.readIfNull(); isNull || err != nil { - return err - } - cxt := _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) - if cxt != _CONTEXT_IN_LIST { - e := fmt.Errorf("Expected to be in the List Context, but not in List Context (%d)", cxt) - return NewTProtocolExceptionWithType(INVALID_DATA, e) - } - line, err := p.reader.ReadString(JSON_RBRACKET[0]) - if err != nil { - return NewTProtocolException(err) - } - for _, char := range line { - switch char { - default: - e := fmt.Errorf("Expecting end of list \"]\", but found: \"%s\"", line) - return NewTProtocolExceptionWithType(INVALID_DATA, e) - case ' ', '\n', '\r', '\t', rune(JSON_RBRACKET[0]): - break - } - } - p.parseContextStack = p.parseContextStack[:len(p.parseContextStack)-1] - if _ParseContext(p.parseContextStack[len(p.parseContextStack)-1]) == _CONTEXT_IN_TOPLEVEL { - return nil - } - return p.ParsePostValue() -} - -func (p *TSimpleJSONProtocol) readSingleValue() (interface{}, TType, error) { - e := p.readNonSignificantWhitespace() - if e != nil { - return nil, VOID, NewTProtocolException(e) - } - b, e := p.reader.Peek(1) - if len(b) > 0 { - c := b[0] - switch c { - case JSON_NULL[0]: - buf := make([]byte, len(JSON_NULL)) - _, e := p.reader.Read(buf) - if e != nil { - return nil, VOID, NewTProtocolException(e) - } - if string(JSON_NULL) != string(buf) { - e = mismatch(string(JSON_NULL), string(buf)) - return nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - return nil, VOID, nil - case JSON_QUOTE: - p.reader.ReadByte() - v, e := p.ParseStringBody() - if e != nil { - return v, UTF8, NewTProtocolException(e) - } - if v == JSON_INFINITY { - return INFINITY, DOUBLE, nil - } else if v == JSON_NEGATIVE_INFINITY { - return NEGATIVE_INFINITY, DOUBLE, nil - } else if v == JSON_NAN { - return NAN, DOUBLE, nil - } - return v, UTF8, nil - case JSON_TRUE[0]: - buf := make([]byte, len(JSON_TRUE)) - _, e := p.reader.Read(buf) - if e != nil { - return true, BOOL, NewTProtocolException(e) - } - if string(JSON_TRUE) != string(buf) { - e := mismatch(string(JSON_TRUE), string(buf)) - return true, BOOL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - return true, BOOL, nil - case JSON_FALSE[0]: - buf := make([]byte, len(JSON_FALSE)) - _, e := p.reader.Read(buf) - if e != nil { - return false, BOOL, NewTProtocolException(e) - } - if string(JSON_FALSE) != string(buf) { - e := mismatch(string(JSON_FALSE), string(buf)) - return false, BOOL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - return false, BOOL, nil - case JSON_LBRACKET[0]: - _, e := p.reader.ReadByte() - return make([]interface{}, 0), LIST, NewTProtocolException(e) - case JSON_LBRACE[0]: - _, e := p.reader.ReadByte() - return make(map[string]interface{}), STRUCT, NewTProtocolException(e) - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'e', 'E', '.', '+', '-', JSON_INFINITY[0], JSON_NAN[0]: - // assume numeric - v, e := p.readNumeric() - return v, DOUBLE, e - default: - e := fmt.Errorf("Expected element in list but found '%s' while parsing JSON.", string(c)) - return nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } - e = fmt.Errorf("Cannot read a single element while parsing JSON.") - return nil, VOID, NewTProtocolExceptionWithType(INVALID_DATA, e) - -} - -func (p *TSimpleJSONProtocol) readIfNull() (bool, error) { - cont := true - for cont { - b, _ := p.reader.Peek(1) - if len(b) < 1 { - return false, nil - } - switch b[0] { - default: - return false, nil - case JSON_NULL[0]: - cont = false - break - case ' ', '\n', '\r', '\t': - p.reader.ReadByte() - break - } - } - if p.safePeekContains(JSON_NULL) { - p.reader.Read(make([]byte, len(JSON_NULL))) - return true, nil - } - return false, nil -} - -func (p *TSimpleJSONProtocol) readQuoteIfNext() { - b, _ := p.reader.Peek(1) - if len(b) > 0 && b[0] == JSON_QUOTE { - p.reader.ReadByte() - } -} - -func (p *TSimpleJSONProtocol) readNumeric() (Numeric, error) { - isNull, err := p.readIfNull() - if isNull || err != nil { - return NUMERIC_NULL, err - } - hasDecimalPoint := false - nextCanBeSign := true - hasE := false - MAX_LEN := 40 - buf := bytes.NewBuffer(make([]byte, 0, MAX_LEN)) - continueFor := true - inQuotes := false - for continueFor { - c, err := p.reader.ReadByte() - if err != nil { - if err == io.EOF { - break - } - return NUMERIC_NULL, NewTProtocolException(err) - } - switch c { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - buf.WriteByte(c) - nextCanBeSign = false - case '.': - if hasDecimalPoint { - e := fmt.Errorf("Unable to parse number with multiple decimal points '%s.'", buf.String()) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - if hasE { - e := fmt.Errorf("Unable to parse number with decimal points in the exponent '%s.'", buf.String()) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - buf.WriteByte(c) - hasDecimalPoint, nextCanBeSign = true, false - case 'e', 'E': - if hasE { - e := fmt.Errorf("Unable to parse number with multiple exponents '%s%c'", buf.String(), c) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - buf.WriteByte(c) - hasE, nextCanBeSign = true, true - case '-', '+': - if !nextCanBeSign { - e := fmt.Errorf("Negative sign within number") - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - buf.WriteByte(c) - nextCanBeSign = false - case ' ', 0, '\t', '\n', '\r', JSON_RBRACE[0], JSON_RBRACKET[0], JSON_COMMA[0], JSON_COLON[0]: - p.reader.UnreadByte() - continueFor = false - case JSON_NAN[0]: - if buf.Len() == 0 { - buffer := make([]byte, len(JSON_NAN)) - buffer[0] = c - _, e := p.reader.Read(buffer[1:]) - if e != nil { - return NUMERIC_NULL, NewTProtocolException(e) - } - if JSON_NAN != string(buffer) { - e := mismatch(JSON_NAN, string(buffer)) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - if inQuotes { - p.readQuoteIfNext() - } - return NAN, nil - } else { - e := fmt.Errorf("Unable to parse number starting with character '%c'", c) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - case JSON_INFINITY[0]: - if buf.Len() == 0 || (buf.Len() == 1 && buf.Bytes()[0] == '+') { - buffer := make([]byte, len(JSON_INFINITY)) - buffer[0] = c - _, e := p.reader.Read(buffer[1:]) - if e != nil { - return NUMERIC_NULL, NewTProtocolException(e) - } - if JSON_INFINITY != string(buffer) { - e := mismatch(JSON_INFINITY, string(buffer)) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - if inQuotes { - p.readQuoteIfNext() - } - return INFINITY, nil - } else if buf.Len() == 1 && buf.Bytes()[0] == JSON_NEGATIVE_INFINITY[0] { - buffer := make([]byte, len(JSON_NEGATIVE_INFINITY)) - buffer[0] = JSON_NEGATIVE_INFINITY[0] - buffer[1] = c - _, e := p.reader.Read(buffer[2:]) - if e != nil { - return NUMERIC_NULL, NewTProtocolException(e) - } - if JSON_NEGATIVE_INFINITY != string(buffer) { - e := mismatch(JSON_NEGATIVE_INFINITY, string(buffer)) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - if inQuotes { - p.readQuoteIfNext() - } - return NEGATIVE_INFINITY, nil - } else { - e := fmt.Errorf("Unable to parse number starting with character '%c' due to existing buffer %s", c, buf.String()) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - case JSON_QUOTE: - if !inQuotes { - inQuotes = true - } else { - break - } - default: - e := fmt.Errorf("Unable to parse number starting with character '%c'", c) - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - } - if buf.Len() == 0 { - e := fmt.Errorf("Unable to parse number from empty string ''") - return NUMERIC_NULL, NewTProtocolExceptionWithType(INVALID_DATA, e) - } - return NewNumericFromJSONString(buf.String(), false), nil -} - -// Safely peeks into the buffer, reading only what is necessary -func (p *TSimpleJSONProtocol) safePeekContains(b []byte) bool { - for i := 0; i < len(b); i++ { - a, _ := p.reader.Peek(i + 1) - if len(a) == 0 || a[i] != b[i] { - return false - } - } - return true -} - -// Reset the context stack to its initial state. -func (p *TSimpleJSONProtocol) resetContextStack() { - p.parseContextStack = []int{int(_CONTEXT_IN_TOPLEVEL)} - p.dumpContext = []int{int(_CONTEXT_IN_TOPLEVEL)} -} - -func (p *TSimpleJSONProtocol) write(b []byte) (int, error) { - n, err := p.writer.Write(b) - if err != nil { - p.writer.Reset(p.trans) // THRIFT-3735 - } - return n, err -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/transport.go b/vendor/github.com/uber/jaeger-client-go/thrift/transport.go deleted file mode 100644 index 453899651fc2..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/transport.go +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -import ( - "errors" - "io" -) - -var errTransportInterrupted = errors.New("Transport Interrupted") - -type Flusher interface { - Flush() (err error) -} - -type ReadSizeProvider interface { - RemainingBytes() (num_bytes uint64) -} - - -// Encapsulates the I/O layer -type TTransport interface { - io.ReadWriteCloser - Flusher - ReadSizeProvider - - // Opens the transport for communication - Open() error - - // Returns true if the transport is open - IsOpen() bool -} - -type stringWriter interface { - WriteString(s string) (n int, err error) -} - - -// This is "enchanced" transport with extra capabilities. You need to use one of these -// to construct protocol. -// Notably, TSocket does not implement this interface, and it is always a mistake to use -// TSocket directly in protocol. -type TRichTransport interface { - io.ReadWriter - io.ByteReader - io.ByteWriter - stringWriter - Flusher - ReadSizeProvider -} - diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/transport_exception.go b/vendor/github.com/uber/jaeger-client-go/thrift/transport_exception.go deleted file mode 100644 index 9505b44612d0..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/transport_exception.go +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -import ( - "errors" - "io" -) - -type timeoutable interface { - Timeout() bool -} - -// Thrift Transport exception -type TTransportException interface { - TException - TypeId() int - Err() error -} - -const ( - UNKNOWN_TRANSPORT_EXCEPTION = 0 - NOT_OPEN = 1 - ALREADY_OPEN = 2 - TIMED_OUT = 3 - END_OF_FILE = 4 -) - -type tTransportException struct { - typeId int - err error -} - -func (p *tTransportException) TypeId() int { - return p.typeId -} - -func (p *tTransportException) Error() string { - return p.err.Error() -} - -func (p *tTransportException) Err() error { - return p.err -} - -func NewTTransportException(t int, e string) TTransportException { - return &tTransportException{typeId: t, err: errors.New(e)} -} - -func NewTTransportExceptionFromError(e error) TTransportException { - if e == nil { - return nil - } - - if t, ok := e.(TTransportException); ok { - return t - } - - switch v := e.(type) { - case TTransportException: - return v - case timeoutable: - if v.Timeout() { - return &tTransportException{typeId: TIMED_OUT, err: e} - } - } - - if e == io.EOF { - return &tTransportException{typeId: END_OF_FILE, err: e} - } - - return &tTransportException{typeId: UNKNOWN_TRANSPORT_EXCEPTION, err: e} -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/transport_factory.go b/vendor/github.com/uber/jaeger-client-go/thrift/transport_factory.go deleted file mode 100644 index 533d1b437533..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/transport_factory.go +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -// Factory class used to create wrapped instance of Transports. -// This is used primarily in servers, which get Transports from -// a ServerTransport and then may want to mutate them (i.e. create -// a BufferedTransport from the underlying base transport) -type TTransportFactory interface { - GetTransport(trans TTransport) TTransport -} - -type tTransportFactory struct{} - -// Return a wrapped instance of the base Transport. -func (p *tTransportFactory) GetTransport(trans TTransport) TTransport { - return trans -} - -func NewTTransportFactory() TTransportFactory { - return &tTransportFactory{} -} diff --git a/vendor/github.com/uber/jaeger-client-go/thrift/type.go b/vendor/github.com/uber/jaeger-client-go/thrift/type.go deleted file mode 100644 index 4292ffcadb13..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/thrift/type.go +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 thrift - -// Type constants in the Thrift protocol -type TType byte - -const ( - STOP = 0 - VOID = 1 - BOOL = 2 - BYTE = 3 - I08 = 3 - DOUBLE = 4 - I16 = 6 - I32 = 8 - I64 = 10 - STRING = 11 - UTF7 = 11 - STRUCT = 12 - MAP = 13 - SET = 14 - LIST = 15 - UTF8 = 16 - UTF16 = 17 - //BINARY = 18 wrong and unusued -) - -var typeNames = map[int]string{ - STOP: "STOP", - VOID: "VOID", - BOOL: "BOOL", - BYTE: "BYTE", - DOUBLE: "DOUBLE", - I16: "I16", - I32: "I32", - I64: "I64", - STRING: "STRING", - STRUCT: "STRUCT", - MAP: "MAP", - SET: "SET", - LIST: "LIST", - UTF8: "UTF8", - UTF16: "UTF16", -} - -func (p TType) String() string { - if s, ok := typeNames[int(p)]; ok { - return s - } - return "Unknown" -} diff --git a/vendor/github.com/uber/jaeger-client-go/tracer.go b/vendor/github.com/uber/jaeger-client-go/tracer.go deleted file mode 100644 index 198c32eb4fde..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/tracer.go +++ /dev/null @@ -1,431 +0,0 @@ -// Copyright (c) 2017-2018 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "fmt" - "io" - "os" - "reflect" - "strconv" - "sync" - "time" - - "github.com/opentracing/opentracing-go" - "github.com/opentracing/opentracing-go/ext" - - "github.com/uber/jaeger-client-go/internal/baggage" - "github.com/uber/jaeger-client-go/internal/throttler" - "github.com/uber/jaeger-client-go/log" - "github.com/uber/jaeger-client-go/utils" -) - -// Tracer implements opentracing.Tracer. -type Tracer struct { - serviceName string - hostIPv4 uint32 // this is for zipkin endpoint conversion - - sampler Sampler - reporter Reporter - metrics Metrics - logger log.Logger - - timeNow func() time.Time - randomNumber func() uint64 - - options struct { - poolSpans bool - gen128Bit bool // whether to generate 128bit trace IDs - zipkinSharedRPCSpan bool - highTraceIDGenerator func() uint64 // custom high trace ID generator - maxTagValueLength int - // more options to come - } - // pool for Span objects - spanPool sync.Pool - - injectors map[interface{}]Injector - extractors map[interface{}]Extractor - - observer compositeObserver - - tags []Tag - process Process - - baggageRestrictionManager baggage.RestrictionManager - baggageSetter *baggageSetter - - debugThrottler throttler.Throttler -} - -// NewTracer creates Tracer implementation that reports tracing to Jaeger. -// The returned io.Closer can be used in shutdown hooks to ensure that the internal -// queue of the Reporter is drained and all buffered spans are submitted to collectors. -func NewTracer( - serviceName string, - sampler Sampler, - reporter Reporter, - options ...TracerOption, -) (opentracing.Tracer, io.Closer) { - t := &Tracer{ - serviceName: serviceName, - sampler: sampler, - reporter: reporter, - injectors: make(map[interface{}]Injector), - extractors: make(map[interface{}]Extractor), - metrics: *NewNullMetrics(), - spanPool: sync.Pool{New: func() interface{} { - return &Span{} - }}, - } - - for _, option := range options { - option(t) - } - - // register default injectors/extractors unless they are already provided via options - textPropagator := newTextMapPropagator(getDefaultHeadersConfig(), t.metrics) - t.addCodec(opentracing.TextMap, textPropagator, textPropagator) - - httpHeaderPropagator := newHTTPHeaderPropagator(getDefaultHeadersConfig(), t.metrics) - t.addCodec(opentracing.HTTPHeaders, httpHeaderPropagator, httpHeaderPropagator) - - binaryPropagator := newBinaryPropagator(t) - t.addCodec(opentracing.Binary, binaryPropagator, binaryPropagator) - - // TODO remove after TChannel supports OpenTracing - interopPropagator := &jaegerTraceContextPropagator{tracer: t} - t.addCodec(SpanContextFormat, interopPropagator, interopPropagator) - - zipkinPropagator := &zipkinPropagator{tracer: t} - t.addCodec(ZipkinSpanFormat, zipkinPropagator, zipkinPropagator) - - if t.baggageRestrictionManager != nil { - t.baggageSetter = newBaggageSetter(t.baggageRestrictionManager, &t.metrics) - } else { - t.baggageSetter = newBaggageSetter(baggage.NewDefaultRestrictionManager(0), &t.metrics) - } - if t.debugThrottler == nil { - t.debugThrottler = throttler.DefaultThrottler{} - } - - if t.randomNumber == nil { - rng := utils.NewRand(time.Now().UnixNano()) - t.randomNumber = func() uint64 { - return uint64(rng.Int63()) - } - } - if t.timeNow == nil { - t.timeNow = time.Now - } - if t.logger == nil { - t.logger = log.NullLogger - } - // Set tracer-level tags - t.tags = append(t.tags, Tag{key: JaegerClientVersionTagKey, value: JaegerClientVersion}) - if hostname, err := os.Hostname(); err == nil { - t.tags = append(t.tags, Tag{key: TracerHostnameTagKey, value: hostname}) - } - if ip, err := utils.HostIP(); err == nil { - t.tags = append(t.tags, Tag{key: TracerIPTagKey, value: ip.String()}) - t.hostIPv4 = utils.PackIPAsUint32(ip) - } else { - t.logger.Error("Unable to determine this host's IP address: " + err.Error()) - } - - if t.options.gen128Bit { - if t.options.highTraceIDGenerator == nil { - t.options.highTraceIDGenerator = t.randomNumber - } - } else if t.options.highTraceIDGenerator != nil { - t.logger.Error("Overriding high trace ID generator but not generating " + - "128 bit trace IDs, consider enabling the \"Gen128Bit\" option") - } - if t.options.maxTagValueLength == 0 { - t.options.maxTagValueLength = DefaultMaxTagValueLength - } - t.process = Process{ - Service: serviceName, - UUID: strconv.FormatUint(t.randomNumber(), 16), - Tags: t.tags, - } - if throttler, ok := t.debugThrottler.(ProcessSetter); ok { - throttler.SetProcess(t.process) - } - - return t, t -} - -// addCodec adds registers injector and extractor for given propagation format if not already defined. -func (t *Tracer) addCodec(format interface{}, injector Injector, extractor Extractor) { - if _, ok := t.injectors[format]; !ok { - t.injectors[format] = injector - } - if _, ok := t.extractors[format]; !ok { - t.extractors[format] = extractor - } -} - -// StartSpan implements StartSpan() method of opentracing.Tracer. -func (t *Tracer) StartSpan( - operationName string, - options ...opentracing.StartSpanOption, -) opentracing.Span { - sso := opentracing.StartSpanOptions{} - for _, o := range options { - o.Apply(&sso) - } - return t.startSpanWithOptions(operationName, sso) -} - -func (t *Tracer) startSpanWithOptions( - operationName string, - options opentracing.StartSpanOptions, -) opentracing.Span { - if options.StartTime.IsZero() { - options.StartTime = t.timeNow() - } - - // Predicate whether the given span context is a valid reference - // which may be used as parent / debug ID / baggage items source - isValidReference := func(ctx SpanContext) bool { - return ctx.IsValid() || ctx.isDebugIDContainerOnly() || len(ctx.baggage) != 0 - } - - var references []Reference - var parent SpanContext - var hasParent bool // need this because `parent` is a value, not reference - for _, ref := range options.References { - ctx, ok := ref.ReferencedContext.(SpanContext) - if !ok { - t.logger.Error(fmt.Sprintf( - "Reference contains invalid type of SpanReference: %s", - reflect.ValueOf(ref.ReferencedContext))) - continue - } - if !isValidReference(ctx) { - continue - } - references = append(references, Reference{Type: ref.Type, Context: ctx}) - if !hasParent { - parent = ctx - hasParent = ref.Type == opentracing.ChildOfRef - } - } - if !hasParent && isValidReference(parent) { - // If ChildOfRef wasn't found but a FollowFromRef exists, use the context from - // the FollowFromRef as the parent - hasParent = true - } - - rpcServer := false - if v, ok := options.Tags[ext.SpanKindRPCServer.Key]; ok { - rpcServer = (v == ext.SpanKindRPCServerEnum || v == string(ext.SpanKindRPCServerEnum)) - } - - var samplerTags []Tag - var ctx SpanContext - newTrace := false - if !hasParent || !parent.IsValid() { - newTrace = true - ctx.traceID.Low = t.randomID() - if t.options.gen128Bit { - ctx.traceID.High = t.options.highTraceIDGenerator() - } - ctx.spanID = SpanID(ctx.traceID.Low) - ctx.parentID = 0 - ctx.flags = byte(0) - if hasParent && parent.isDebugIDContainerOnly() && t.isDebugAllowed(operationName) { - ctx.flags |= (flagSampled | flagDebug) - samplerTags = []Tag{{key: JaegerDebugHeader, value: parent.debugID}} - } else if sampled, tags := t.sampler.IsSampled(ctx.traceID, operationName); sampled { - ctx.flags |= flagSampled - samplerTags = tags - } - } else { - ctx.traceID = parent.traceID - if rpcServer && t.options.zipkinSharedRPCSpan { - // Support Zipkin's one-span-per-RPC model - ctx.spanID = parent.spanID - ctx.parentID = parent.parentID - } else { - ctx.spanID = SpanID(t.randomID()) - ctx.parentID = parent.spanID - } - ctx.flags = parent.flags - } - if hasParent { - // copy baggage items - if l := len(parent.baggage); l > 0 { - ctx.baggage = make(map[string]string, len(parent.baggage)) - for k, v := range parent.baggage { - ctx.baggage[k] = v - } - } - } - - sp := t.newSpan() - sp.context = ctx - sp.observer = t.observer.OnStartSpan(sp, operationName, options) - return t.startSpanInternal( - sp, - operationName, - options.StartTime, - samplerTags, - options.Tags, - newTrace, - rpcServer, - references, - ) -} - -// Inject implements Inject() method of opentracing.Tracer -func (t *Tracer) Inject(ctx opentracing.SpanContext, format interface{}, carrier interface{}) error { - c, ok := ctx.(SpanContext) - if !ok { - return opentracing.ErrInvalidSpanContext - } - if injector, ok := t.injectors[format]; ok { - return injector.Inject(c, carrier) - } - return opentracing.ErrUnsupportedFormat -} - -// Extract implements Extract() method of opentracing.Tracer -func (t *Tracer) Extract( - format interface{}, - carrier interface{}, -) (opentracing.SpanContext, error) { - if extractor, ok := t.extractors[format]; ok { - return extractor.Extract(carrier) - } - return nil, opentracing.ErrUnsupportedFormat -} - -// Close releases all resources used by the Tracer and flushes any remaining buffered spans. -func (t *Tracer) Close() error { - t.reporter.Close() - t.sampler.Close() - if mgr, ok := t.baggageRestrictionManager.(io.Closer); ok { - mgr.Close() - } - if throttler, ok := t.debugThrottler.(io.Closer); ok { - throttler.Close() - } - return nil -} - -// Tags returns a slice of tracer-level tags. -func (t *Tracer) Tags() []opentracing.Tag { - tags := make([]opentracing.Tag, len(t.tags)) - for i, tag := range t.tags { - tags[i] = opentracing.Tag{Key: tag.key, Value: tag.value} - } - return tags -} - -// newSpan returns an instance of a clean Span object. -// If options.PoolSpans is true, the spans are retrieved from an object pool. -func (t *Tracer) newSpan() *Span { - if !t.options.poolSpans { - return &Span{} - } - sp := t.spanPool.Get().(*Span) - sp.context = emptyContext - sp.tracer = nil - sp.tags = nil - sp.logs = nil - return sp -} - -func (t *Tracer) startSpanInternal( - sp *Span, - operationName string, - startTime time.Time, - internalTags []Tag, - tags opentracing.Tags, - newTrace bool, - rpcServer bool, - references []Reference, -) *Span { - sp.tracer = t - sp.operationName = operationName - sp.startTime = startTime - sp.duration = 0 - sp.references = references - sp.firstInProcess = rpcServer || sp.context.parentID == 0 - if len(tags) > 0 || len(internalTags) > 0 { - sp.tags = make([]Tag, len(internalTags), len(tags)+len(internalTags)) - copy(sp.tags, internalTags) - for k, v := range tags { - sp.observer.OnSetTag(k, v) - if k == string(ext.SamplingPriority) && !setSamplingPriority(sp, v) { - continue - } - sp.setTagNoLocking(k, v) - } - } - // emit metrics - if sp.context.IsSampled() { - t.metrics.SpansStartedSampled.Inc(1) - if newTrace { - // We cannot simply check for parentID==0 because in Zipkin model the - // server-side RPC span has the exact same trace/span/parent IDs as the - // calling client-side span, but obviously the server side span is - // no longer a root span of the trace. - t.metrics.TracesStartedSampled.Inc(1) - } else if sp.firstInProcess { - t.metrics.TracesJoinedSampled.Inc(1) - } - } else { - t.metrics.SpansStartedNotSampled.Inc(1) - if newTrace { - t.metrics.TracesStartedNotSampled.Inc(1) - } else if sp.firstInProcess { - t.metrics.TracesJoinedNotSampled.Inc(1) - } - } - return sp -} - -func (t *Tracer) reportSpan(sp *Span) { - t.metrics.SpansFinished.Inc(1) - if sp.context.IsSampled() { - t.reporter.Report(sp) - } - if t.options.poolSpans { - t.spanPool.Put(sp) - } -} - -// randomID generates a random trace/span ID, using tracer.random() generator. -// It never returns 0. -func (t *Tracer) randomID() uint64 { - val := t.randomNumber() - for val == 0 { - val = t.randomNumber() - } - return val -} - -// (NB) span must hold the lock before making this call -func (t *Tracer) setBaggage(sp *Span, key, value string) { - t.baggageSetter.setBaggage(sp, key, value) -} - -// (NB) span must hold the lock before making this call -func (t *Tracer) isDebugAllowed(operation string) bool { - return t.debugThrottler.IsAllowed(operation) -} diff --git a/vendor/github.com/uber/jaeger-client-go/tracer_options.go b/vendor/github.com/uber/jaeger-client-go/tracer_options.go deleted file mode 100644 index a90265f031cf..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/tracer_options.go +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "time" - - "github.com/opentracing/opentracing-go" - - "github.com/uber/jaeger-client-go/internal/baggage" - "github.com/uber/jaeger-client-go/internal/throttler" -) - -// TracerOption is a function that sets some option on the tracer -type TracerOption func(tracer *Tracer) - -// TracerOptions is a factory for all available TracerOption's -var TracerOptions tracerOptions - -type tracerOptions struct{} - -// Metrics creates a TracerOption that initializes Metrics on the tracer, -// which is used to emit statistics. -func (tracerOptions) Metrics(m *Metrics) TracerOption { - return func(tracer *Tracer) { - tracer.metrics = *m - } -} - -// Logger creates a TracerOption that gives the tracer a Logger. -func (tracerOptions) Logger(logger Logger) TracerOption { - return func(tracer *Tracer) { - tracer.logger = logger - } -} - -func (tracerOptions) CustomHeaderKeys(headerKeys *HeadersConfig) TracerOption { - return func(tracer *Tracer) { - if headerKeys == nil { - return - } - textPropagator := newTextMapPropagator(headerKeys.applyDefaults(), tracer.metrics) - tracer.addCodec(opentracing.TextMap, textPropagator, textPropagator) - - httpHeaderPropagator := newHTTPHeaderPropagator(headerKeys.applyDefaults(), tracer.metrics) - tracer.addCodec(opentracing.HTTPHeaders, httpHeaderPropagator, httpHeaderPropagator) - } -} - -// TimeNow creates a TracerOption that gives the tracer a function -// used to generate timestamps for spans. -func (tracerOptions) TimeNow(timeNow func() time.Time) TracerOption { - return func(tracer *Tracer) { - tracer.timeNow = timeNow - } -} - -// RandomNumber creates a TracerOption that gives the tracer -// a thread-safe random number generator function for generating trace IDs. -func (tracerOptions) RandomNumber(randomNumber func() uint64) TracerOption { - return func(tracer *Tracer) { - tracer.randomNumber = randomNumber - } -} - -// PoolSpans creates a TracerOption that tells the tracer whether it should use -// an object pool to minimize span allocations. -// This should be used with care, only if the service is not running any async tasks -// that can access parent spans after those spans have been finished. -func (tracerOptions) PoolSpans(poolSpans bool) TracerOption { - return func(tracer *Tracer) { - tracer.options.poolSpans = poolSpans - } -} - -// Deprecated: HostIPv4 creates a TracerOption that identifies the current service/process. -// If not set, the factory method will obtain the current IP address. -// The TracerOption is deprecated; the tracer will attempt to automatically detect the IP. -func (tracerOptions) HostIPv4(hostIPv4 uint32) TracerOption { - return func(tracer *Tracer) { - tracer.hostIPv4 = hostIPv4 - } -} - -func (tracerOptions) Injector(format interface{}, injector Injector) TracerOption { - return func(tracer *Tracer) { - tracer.injectors[format] = injector - } -} - -func (tracerOptions) Extractor(format interface{}, extractor Extractor) TracerOption { - return func(tracer *Tracer) { - tracer.extractors[format] = extractor - } -} - -func (t tracerOptions) Observer(observer Observer) TracerOption { - return t.ContribObserver(&oldObserver{obs: observer}) -} - -func (tracerOptions) ContribObserver(observer ContribObserver) TracerOption { - return func(tracer *Tracer) { - tracer.observer.append(observer) - } -} - -func (tracerOptions) Gen128Bit(gen128Bit bool) TracerOption { - return func(tracer *Tracer) { - tracer.options.gen128Bit = gen128Bit - } -} - -func (tracerOptions) HighTraceIDGenerator(highTraceIDGenerator func() uint64) TracerOption { - return func(tracer *Tracer) { - tracer.options.highTraceIDGenerator = highTraceIDGenerator - } -} - -func (tracerOptions) MaxTagValueLength(maxTagValueLength int) TracerOption { - return func(tracer *Tracer) { - tracer.options.maxTagValueLength = maxTagValueLength - } -} - -func (tracerOptions) ZipkinSharedRPCSpan(zipkinSharedRPCSpan bool) TracerOption { - return func(tracer *Tracer) { - tracer.options.zipkinSharedRPCSpan = zipkinSharedRPCSpan - } -} - -func (tracerOptions) Tag(key string, value interface{}) TracerOption { - return func(tracer *Tracer) { - tracer.tags = append(tracer.tags, Tag{key: key, value: value}) - } -} - -func (tracerOptions) BaggageRestrictionManager(mgr baggage.RestrictionManager) TracerOption { - return func(tracer *Tracer) { - tracer.baggageRestrictionManager = mgr - } -} - -func (tracerOptions) DebugThrottler(throttler throttler.Throttler) TracerOption { - return func(tracer *Tracer) { - tracer.debugThrottler = throttler - } -} diff --git a/vendor/github.com/uber/jaeger-client-go/transport.go b/vendor/github.com/uber/jaeger-client-go/transport.go deleted file mode 100644 index c5f5b19551fe..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/transport.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "io" -) - -// Transport abstracts the method of sending spans out of process. -// Implementations are NOT required to be thread-safe; the RemoteReporter -// is expected to only call methods on the Transport from the same go-routine. -type Transport interface { - // Append converts the span to the wire representation and adds it - // to sender's internal buffer. If the buffer exceeds its designated - // size, the transport should call Flush() and return the number of spans - // flushed, otherwise return 0. If error is returned, the returned number - // of spans is treated as failed span, and reported to metrics accordingly. - Append(span *Span) (int, error) - - // Flush submits the internal buffer to the remote server. It returns the - // number of spans flushed. If error is returned, the returned number of - // spans is treated as failed span, and reported to metrics accordingly. - Flush() (int, error) - - io.Closer -} diff --git a/vendor/github.com/uber/jaeger-client-go/transport_udp.go b/vendor/github.com/uber/jaeger-client-go/transport_udp.go deleted file mode 100644 index 7b9ccf937449..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/transport_udp.go +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "errors" - "fmt" - - "github.com/uber/jaeger-client-go/thrift" - - j "github.com/uber/jaeger-client-go/thrift-gen/jaeger" - "github.com/uber/jaeger-client-go/utils" -) - -// Empirically obtained constant for how many bytes in the message are used for envelope. -// The total datagram size is: -// sizeof(Span) * numSpans + processByteSize + emitBatchOverhead <= maxPacketSize -// There is a unit test `TestEmitBatchOverhead` that validates this number. -// Note that due to the use of Compact Thrift protocol, overhead grows with the number of spans -// in the batch, because the length of the list is encoded as varint32, as well as SeqId. -const emitBatchOverhead = 30 - -var errSpanTooLarge = errors.New("Span is too large") - -type udpSender struct { - client *utils.AgentClientUDP - maxPacketSize int // max size of datagram in bytes - maxSpanBytes int // max number of bytes to record spans (excluding envelope) in the datagram - byteBufferSize int // current number of span bytes accumulated in the buffer - spanBuffer []*j.Span // spans buffered before a flush - thriftBuffer *thrift.TMemoryBuffer // buffer used to calculate byte size of a span - thriftProtocol thrift.TProtocol - process *j.Process - processByteSize int -} - -// NewUDPTransport creates a reporter that submits spans to jaeger-agent -func NewUDPTransport(hostPort string, maxPacketSize int) (Transport, error) { - if len(hostPort) == 0 { - hostPort = fmt.Sprintf("%s:%d", DefaultUDPSpanServerHost, DefaultUDPSpanServerPort) - } - if maxPacketSize == 0 { - maxPacketSize = utils.UDPPacketMaxLength - } - - protocolFactory := thrift.NewTCompactProtocolFactory() - - // Each span is first written to thriftBuffer to determine its size in bytes. - thriftBuffer := thrift.NewTMemoryBufferLen(maxPacketSize) - thriftProtocol := protocolFactory.GetProtocol(thriftBuffer) - - client, err := utils.NewAgentClientUDP(hostPort, maxPacketSize) - if err != nil { - return nil, err - } - - sender := &udpSender{ - client: client, - maxSpanBytes: maxPacketSize - emitBatchOverhead, - thriftBuffer: thriftBuffer, - thriftProtocol: thriftProtocol} - return sender, nil -} - -func (s *udpSender) calcSizeOfSerializedThrift(thriftStruct thrift.TStruct) int { - s.thriftBuffer.Reset() - thriftStruct.Write(s.thriftProtocol) - return s.thriftBuffer.Len() -} - -func (s *udpSender) Append(span *Span) (int, error) { - if s.process == nil { - s.process = BuildJaegerProcessThrift(span) - s.processByteSize = s.calcSizeOfSerializedThrift(s.process) - s.byteBufferSize += s.processByteSize - } - jSpan := BuildJaegerThrift(span) - spanSize := s.calcSizeOfSerializedThrift(jSpan) - if spanSize > s.maxSpanBytes { - return 1, errSpanTooLarge - } - - s.byteBufferSize += spanSize - if s.byteBufferSize <= s.maxSpanBytes { - s.spanBuffer = append(s.spanBuffer, jSpan) - if s.byteBufferSize < s.maxSpanBytes { - return 0, nil - } - return s.Flush() - } - // the latest span did not fit in the buffer - n, err := s.Flush() - s.spanBuffer = append(s.spanBuffer, jSpan) - s.byteBufferSize = spanSize + s.processByteSize - return n, err -} - -func (s *udpSender) Flush() (int, error) { - n := len(s.spanBuffer) - if n == 0 { - return 0, nil - } - err := s.client.EmitBatch(&j.Batch{Process: s.process, Spans: s.spanBuffer}) - s.resetBuffers() - - return n, err -} - -func (s *udpSender) Close() error { - return s.client.Close() -} - -func (s *udpSender) resetBuffers() { - for i := range s.spanBuffer { - s.spanBuffer[i] = nil - } - s.spanBuffer = s.spanBuffer[:0] - s.byteBufferSize = s.processByteSize -} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/http_json.go b/vendor/github.com/uber/jaeger-client-go/utils/http_json.go deleted file mode 100644 index 237211f8224b..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/utils/http_json.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 utils - -import ( - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" -) - -// GetJSON makes an HTTP call to the specified URL and parses the returned JSON into `out`. -func GetJSON(url string, out interface{}) error { - resp, err := http.Get(url) - if err != nil { - return err - } - return ReadJSON(resp, out) -} - -// ReadJSON reads JSON from http.Response and parses it into `out` -func ReadJSON(resp *http.Response, out interface{}) error { - defer resp.Body.Close() - - if resp.StatusCode >= 400 { - body, err := ioutil.ReadAll(resp.Body) - if err != nil { - return err - } - - return fmt.Errorf("StatusCode: %d, Body: %s", resp.StatusCode, body) - } - - if out == nil { - io.Copy(ioutil.Discard, resp.Body) - return nil - } - - decoder := json.NewDecoder(resp.Body) - return decoder.Decode(out) -} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/localip.go b/vendor/github.com/uber/jaeger-client-go/utils/localip.go deleted file mode 100644 index b51af7713f7c..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/utils/localip.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 utils - -import ( - "errors" - "net" -) - -// This code is borrowed from https://github.com/uber/tchannel-go/blob/dev/localip.go - -// scoreAddr scores how likely the given addr is to be a remote address and returns the -// IP to use when listening. Any address which receives a negative score should not be used. -// Scores are calculated as: -// -1 for any unknown IP addresses. -// +300 for IPv4 addresses -// +100 for non-local addresses, extra +100 for "up" interaces. -func scoreAddr(iface net.Interface, addr net.Addr) (int, net.IP) { - var ip net.IP - if netAddr, ok := addr.(*net.IPNet); ok { - ip = netAddr.IP - } else if netIP, ok := addr.(*net.IPAddr); ok { - ip = netIP.IP - } else { - return -1, nil - } - - var score int - if ip.To4() != nil { - score += 300 - } - if iface.Flags&net.FlagLoopback == 0 && !ip.IsLoopback() { - score += 100 - if iface.Flags&net.FlagUp != 0 { - score += 100 - } - } - return score, ip -} - -// HostIP tries to find an IP that can be used by other machines to reach this machine. -func HostIP() (net.IP, error) { - interfaces, err := net.Interfaces() - if err != nil { - return nil, err - } - - bestScore := -1 - var bestIP net.IP - // Select the highest scoring IP as the best IP. - for _, iface := range interfaces { - addrs, err := iface.Addrs() - if err != nil { - // Skip this interface if there is an error. - continue - } - - for _, addr := range addrs { - score, ip := scoreAddr(iface, addr) - if score > bestScore { - bestScore = score - bestIP = ip - } - } - } - - if bestScore == -1 { - return nil, errors.New("no addresses to listen on") - } - - return bestIP, nil -} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/rand.go b/vendor/github.com/uber/jaeger-client-go/utils/rand.go deleted file mode 100644 index 9875f7f55cbd..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/utils/rand.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 utils - -import ( - "math/rand" - "sync" -) - -// lockedSource allows a random number generator to be used by multiple goroutines concurrently. -// The code is very similar to math/rand.lockedSource, which is unfortunately not exposed. -type lockedSource struct { - mut sync.Mutex - src rand.Source -} - -// NewRand returns a rand.Rand that is threadsafe. -func NewRand(seed int64) *rand.Rand { - return rand.New(&lockedSource{src: rand.NewSource(seed)}) -} - -func (r *lockedSource) Int63() (n int64) { - r.mut.Lock() - n = r.src.Int63() - r.mut.Unlock() - return -} - -// Seed implements Seed() of Source -func (r *lockedSource) Seed(seed int64) { - r.mut.Lock() - r.src.Seed(seed) - r.mut.Unlock() -} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go b/vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go deleted file mode 100644 index 1b8db9758486..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/utils/rate_limiter.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 utils - -import ( - "sync" - "time" -) - -// RateLimiter is a filter used to check if a message that is worth itemCost units is within the rate limits. -type RateLimiter interface { - CheckCredit(itemCost float64) bool -} - -type rateLimiter struct { - sync.Mutex - - creditsPerSecond float64 - balance float64 - maxBalance float64 - lastTick time.Time - - timeNow func() time.Time -} - -// NewRateLimiter creates a new rate limiter based on leaky bucket algorithm, formulated in terms of a -// credits balance that is replenished every time CheckCredit() method is called (tick) by the amount proportional -// to the time elapsed since the last tick, up to max of creditsPerSecond. A call to CheckCredit() takes a cost -// of an item we want to pay with the balance. If the balance exceeds the cost of the item, the item is "purchased" -// and the balance reduced, indicated by returned value of true. Otherwise the balance is unchanged and return false. -// -// This can be used to limit a rate of messages emitted by a service by instantiating the Rate Limiter with the -// max number of messages a service is allowed to emit per second, and calling CheckCredit(1.0) for each message -// to determine if the message is within the rate limit. -// -// It can also be used to limit the rate of traffic in bytes, by setting creditsPerSecond to desired throughput -// as bytes/second, and calling CheckCredit() with the actual message size. -func NewRateLimiter(creditsPerSecond, maxBalance float64) RateLimiter { - return &rateLimiter{ - creditsPerSecond: creditsPerSecond, - balance: maxBalance, - maxBalance: maxBalance, - lastTick: time.Now(), - timeNow: time.Now} -} - -func (b *rateLimiter) CheckCredit(itemCost float64) bool { - b.Lock() - defer b.Unlock() - // calculate how much time passed since the last tick, and update current tick - currentTime := b.timeNow() - elapsedTime := currentTime.Sub(b.lastTick) - b.lastTick = currentTime - // calculate how much credit have we accumulated since the last tick - b.balance += elapsedTime.Seconds() * b.creditsPerSecond - if b.balance > b.maxBalance { - b.balance = b.maxBalance - } - // if we have enough credits to pay for current item, then reduce balance and allow - if b.balance >= itemCost { - b.balance -= itemCost - return true - } - return false -} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/udp_client.go b/vendor/github.com/uber/jaeger-client-go/utils/udp_client.go deleted file mode 100644 index 6f042073d631..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/utils/udp_client.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 utils - -import ( - "errors" - "fmt" - "io" - "net" - - "github.com/uber/jaeger-client-go/thrift" - - "github.com/uber/jaeger-client-go/thrift-gen/agent" - "github.com/uber/jaeger-client-go/thrift-gen/jaeger" - "github.com/uber/jaeger-client-go/thrift-gen/zipkincore" -) - -// UDPPacketMaxLength is the max size of UDP packet we want to send, synced with jaeger-agent -const UDPPacketMaxLength = 65000 - -// AgentClientUDP is a UDP client to Jaeger agent that implements agent.Agent interface. -type AgentClientUDP struct { - agent.Agent - io.Closer - - connUDP *net.UDPConn - client *agent.AgentClient - maxPacketSize int // max size of datagram in bytes - thriftBuffer *thrift.TMemoryBuffer // buffer used to calculate byte size of a span -} - -// NewAgentClientUDP creates a client that sends spans to Jaeger Agent over UDP. -func NewAgentClientUDP(hostPort string, maxPacketSize int) (*AgentClientUDP, error) { - if maxPacketSize == 0 { - maxPacketSize = UDPPacketMaxLength - } - - thriftBuffer := thrift.NewTMemoryBufferLen(maxPacketSize) - protocolFactory := thrift.NewTCompactProtocolFactory() - client := agent.NewAgentClientFactory(thriftBuffer, protocolFactory) - - destAddr, err := net.ResolveUDPAddr("udp", hostPort) - if err != nil { - return nil, err - } - - connUDP, err := net.DialUDP(destAddr.Network(), nil, destAddr) - if err != nil { - return nil, err - } - if err := connUDP.SetWriteBuffer(maxPacketSize); err != nil { - return nil, err - } - - clientUDP := &AgentClientUDP{ - connUDP: connUDP, - client: client, - maxPacketSize: maxPacketSize, - thriftBuffer: thriftBuffer} - return clientUDP, nil -} - -// EmitZipkinBatch implements EmitZipkinBatch() of Agent interface -func (a *AgentClientUDP) EmitZipkinBatch(spans []*zipkincore.Span) error { - return errors.New("Not implemented") -} - -// EmitBatch implements EmitBatch() of Agent interface -func (a *AgentClientUDP) EmitBatch(batch *jaeger.Batch) error { - a.thriftBuffer.Reset() - a.client.SeqId = 0 // we have no need for distinct SeqIds for our one-way UDP messages - if err := a.client.EmitBatch(batch); err != nil { - return err - } - if a.thriftBuffer.Len() > a.maxPacketSize { - return fmt.Errorf("Data does not fit within one UDP packet; size %d, max %d, spans %d", - a.thriftBuffer.Len(), a.maxPacketSize, len(batch.Spans)) - } - _, err := a.connUDP.Write(a.thriftBuffer.Bytes()) - return err -} - -// Close implements Close() of io.Closer and closes the underlying UDP connection. -func (a *AgentClientUDP) Close() error { - return a.connUDP.Close() -} diff --git a/vendor/github.com/uber/jaeger-client-go/utils/utils.go b/vendor/github.com/uber/jaeger-client-go/utils/utils.go deleted file mode 100644 index ac3c325d1ede..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/utils/utils.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 utils - -import ( - "encoding/binary" - "errors" - "net" - "strconv" - "strings" - "time" -) - -var ( - // ErrEmptyIP an error for empty ip strings - ErrEmptyIP = errors.New("empty string given for ip") - - // ErrNotHostColonPort an error for invalid host port string - ErrNotHostColonPort = errors.New("expecting host:port") - - // ErrNotFourOctets an error for the wrong number of octets after splitting a string - ErrNotFourOctets = errors.New("Wrong number of octets") -) - -// ParseIPToUint32 converts a string ip (e.g. "x.y.z.w") to an uint32 -func ParseIPToUint32(ip string) (uint32, error) { - if ip == "" { - return 0, ErrEmptyIP - } - - if ip == "localhost" { - return 127<<24 | 1, nil - } - - octets := strings.Split(ip, ".") - if len(octets) != 4 { - return 0, ErrNotFourOctets - } - - var intIP uint32 - for i := 0; i < 4; i++ { - octet, err := strconv.Atoi(octets[i]) - if err != nil { - return 0, err - } - intIP = (intIP << 8) | uint32(octet) - } - - return intIP, nil -} - -// ParsePort converts port number from string to uin16 -func ParsePort(portString string) (uint16, error) { - port, err := strconv.ParseUint(portString, 10, 16) - return uint16(port), err -} - -// PackIPAsUint32 packs an IPv4 as uint32 -func PackIPAsUint32(ip net.IP) uint32 { - if ipv4 := ip.To4(); ipv4 != nil { - return binary.BigEndian.Uint32(ipv4) - } - return 0 -} - -// TimeToMicrosecondsSinceEpochInt64 converts Go time.Time to a long -// representing time since epoch in microseconds, which is used expected -// in the Jaeger spans encoded as Thrift. -func TimeToMicrosecondsSinceEpochInt64(t time.Time) int64 { - // ^^^ Passing time.Time by value is faster than passing a pointer! - // BenchmarkTimeByValue-8 2000000000 1.37 ns/op - // BenchmarkTimeByPtr-8 2000000000 1.98 ns/op - - return t.UnixNano() / 1000 -} diff --git a/vendor/github.com/uber/jaeger-client-go/zipkin.go b/vendor/github.com/uber/jaeger-client-go/zipkin.go deleted file mode 100644 index 636952b7f1d0..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/zipkin.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "github.com/opentracing/opentracing-go" -) - -// ZipkinSpanFormat is an OpenTracing carrier format constant -const ZipkinSpanFormat = "zipkin-span-format" - -// ExtractableZipkinSpan is a type of Carrier used for integration with Zipkin-aware -// RPC frameworks (like TChannel). It does not support baggage, only trace IDs. -type ExtractableZipkinSpan interface { - TraceID() uint64 - SpanID() uint64 - ParentID() uint64 - Flags() byte -} - -// InjectableZipkinSpan is a type of Carrier used for integration with Zipkin-aware -// RPC frameworks (like TChannel). It does not support baggage, only trace IDs. -type InjectableZipkinSpan interface { - SetTraceID(traceID uint64) - SetSpanID(spanID uint64) - SetParentID(parentID uint64) - SetFlags(flags byte) -} - -type zipkinPropagator struct { - tracer *Tracer -} - -func (p *zipkinPropagator) Inject( - ctx SpanContext, - abstractCarrier interface{}, -) error { - carrier, ok := abstractCarrier.(InjectableZipkinSpan) - if !ok { - return opentracing.ErrInvalidCarrier - } - - carrier.SetTraceID(ctx.TraceID().Low) // TODO this cannot work with 128bit IDs - carrier.SetSpanID(uint64(ctx.SpanID())) - carrier.SetParentID(uint64(ctx.ParentID())) - carrier.SetFlags(ctx.flags) - return nil -} - -func (p *zipkinPropagator) Extract(abstractCarrier interface{}) (SpanContext, error) { - carrier, ok := abstractCarrier.(ExtractableZipkinSpan) - if !ok { - return emptyContext, opentracing.ErrInvalidCarrier - } - if carrier.TraceID() == 0 { - return emptyContext, opentracing.ErrSpanContextNotFound - } - var ctx SpanContext - ctx.traceID.Low = carrier.TraceID() - ctx.spanID = SpanID(carrier.SpanID()) - ctx.parentID = SpanID(carrier.ParentID()) - ctx.flags = carrier.Flags() - return ctx, nil -} diff --git a/vendor/github.com/uber/jaeger-client-go/zipkin_thrift_span.go b/vendor/github.com/uber/jaeger-client-go/zipkin_thrift_span.go deleted file mode 100644 index dce58b4331c4..000000000000 --- a/vendor/github.com/uber/jaeger-client-go/zipkin_thrift_span.go +++ /dev/null @@ -1,322 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 jaeger - -import ( - "encoding/binary" - "fmt" - "time" - - "github.com/opentracing/opentracing-go/ext" - - "github.com/uber/jaeger-client-go/internal/spanlog" - z "github.com/uber/jaeger-client-go/thrift-gen/zipkincore" - "github.com/uber/jaeger-client-go/utils" -) - -const ( - // Zipkin UI does not work well with non-string tag values - allowPackedNumbers = false -) - -var specialTagHandlers = map[string]func(*zipkinSpan, interface{}){ - string(ext.SpanKind): setSpanKind, - string(ext.PeerHostIPv4): setPeerIPv4, - string(ext.PeerPort): setPeerPort, - string(ext.PeerService): setPeerService, - TracerIPTagKey: removeTag, -} - -// BuildZipkinThrift builds thrift span based on internal span. -func BuildZipkinThrift(s *Span) *z.Span { - span := &zipkinSpan{Span: s} - span.handleSpecialTags() - parentID := int64(span.context.parentID) - var ptrParentID *int64 - if parentID != 0 { - ptrParentID = &parentID - } - timestamp := utils.TimeToMicrosecondsSinceEpochInt64(span.startTime) - duration := span.duration.Nanoseconds() / int64(time.Microsecond) - endpoint := &z.Endpoint{ - ServiceName: span.tracer.serviceName, - Ipv4: int32(span.tracer.hostIPv4)} - thriftSpan := &z.Span{ - TraceID: int64(span.context.traceID.Low), // TODO upgrade zipkin thrift and use TraceIdHigh - ID: int64(span.context.spanID), - ParentID: ptrParentID, - Name: span.operationName, - Timestamp: ×tamp, - Duration: &duration, - Debug: span.context.IsDebug(), - Annotations: buildAnnotations(span, endpoint), - BinaryAnnotations: buildBinaryAnnotations(span, endpoint)} - return thriftSpan -} - -func buildAnnotations(span *zipkinSpan, endpoint *z.Endpoint) []*z.Annotation { - // automatically adding 2 Zipkin CoreAnnotations - annotations := make([]*z.Annotation, 0, 2+len(span.logs)) - var startLabel, endLabel string - if span.spanKind == string(ext.SpanKindRPCClientEnum) { - startLabel, endLabel = z.CLIENT_SEND, z.CLIENT_RECV - } else if span.spanKind == string(ext.SpanKindRPCServerEnum) { - startLabel, endLabel = z.SERVER_RECV, z.SERVER_SEND - } - if !span.startTime.IsZero() && startLabel != "" { - start := &z.Annotation{ - Timestamp: utils.TimeToMicrosecondsSinceEpochInt64(span.startTime), - Value: startLabel, - Host: endpoint} - annotations = append(annotations, start) - if span.duration != 0 { - endTs := span.startTime.Add(span.duration) - end := &z.Annotation{ - Timestamp: utils.TimeToMicrosecondsSinceEpochInt64(endTs), - Value: endLabel, - Host: endpoint} - annotations = append(annotations, end) - } - } - for _, log := range span.logs { - anno := &z.Annotation{ - Timestamp: utils.TimeToMicrosecondsSinceEpochInt64(log.Timestamp), - Host: endpoint} - if content, err := spanlog.MaterializeWithJSON(log.Fields); err == nil { - anno.Value = truncateString(string(content), span.tracer.options.maxTagValueLength) - } else { - anno.Value = err.Error() - } - annotations = append(annotations, anno) - } - return annotations -} - -func buildBinaryAnnotations(span *zipkinSpan, endpoint *z.Endpoint) []*z.BinaryAnnotation { - // automatically adding local component or server/client address tag, and client version - annotations := make([]*z.BinaryAnnotation, 0, 2+len(span.tags)) - - if span.peerDefined() && span.isRPC() { - peer := z.Endpoint{ - Ipv4: span.peer.Ipv4, - Port: span.peer.Port, - ServiceName: span.peer.ServiceName} - label := z.CLIENT_ADDR - if span.isRPCClient() { - label = z.SERVER_ADDR - } - anno := &z.BinaryAnnotation{ - Key: label, - Value: []byte{1}, - AnnotationType: z.AnnotationType_BOOL, - Host: &peer} - annotations = append(annotations, anno) - } - if !span.isRPC() { - componentName := endpoint.ServiceName - for _, tag := range span.tags { - if tag.key == string(ext.Component) { - componentName = stringify(tag.value) - break - } - } - local := &z.BinaryAnnotation{ - Key: z.LOCAL_COMPONENT, - Value: []byte(componentName), - AnnotationType: z.AnnotationType_STRING, - Host: endpoint} - annotations = append(annotations, local) - } - for _, tag := range span.tags { - // "Special tags" are already handled by this point, we'd be double reporting the - // tags if we don't skip here - if _, ok := specialTagHandlers[tag.key]; ok { - continue - } - if anno := buildBinaryAnnotation(tag.key, tag.value, span.tracer.options.maxTagValueLength, nil); anno != nil { - annotations = append(annotations, anno) - } - } - return annotations -} - -func buildBinaryAnnotation(key string, val interface{}, maxTagValueLength int, endpoint *z.Endpoint) *z.BinaryAnnotation { - bann := &z.BinaryAnnotation{Key: key, Host: endpoint} - if value, ok := val.(string); ok { - bann.Value = []byte(truncateString(value, maxTagValueLength)) - bann.AnnotationType = z.AnnotationType_STRING - } else if value, ok := val.([]byte); ok { - if len(value) > maxTagValueLength { - value = value[:maxTagValueLength] - } - bann.Value = value - bann.AnnotationType = z.AnnotationType_BYTES - } else if value, ok := val.(int32); ok && allowPackedNumbers { - bann.Value = int32ToBytes(value) - bann.AnnotationType = z.AnnotationType_I32 - } else if value, ok := val.(int64); ok && allowPackedNumbers { - bann.Value = int64ToBytes(value) - bann.AnnotationType = z.AnnotationType_I64 - } else if value, ok := val.(int); ok && allowPackedNumbers { - bann.Value = int64ToBytes(int64(value)) - bann.AnnotationType = z.AnnotationType_I64 - } else if value, ok := val.(bool); ok { - bann.Value = []byte{boolToByte(value)} - bann.AnnotationType = z.AnnotationType_BOOL - } else { - value := stringify(val) - bann.Value = []byte(truncateString(value, maxTagValueLength)) - bann.AnnotationType = z.AnnotationType_STRING - } - return bann -} - -func stringify(value interface{}) string { - if s, ok := value.(string); ok { - return s - } - return fmt.Sprintf("%+v", value) -} - -func truncateString(value string, maxLength int) string { - // we ignore the problem of utf8 runes possibly being sliced in the middle, - // as it is rather expensive to iterate through each tag just to find rune - // boundaries. - if len(value) > maxLength { - return value[:maxLength] - } - return value -} - -func boolToByte(b bool) byte { - if b { - return 1 - } - return 0 -} - -// int32ToBytes converts int32 to bytes. -func int32ToBytes(i int32) []byte { - buf := make([]byte, 4) - binary.BigEndian.PutUint32(buf, uint32(i)) - return buf -} - -// int64ToBytes converts int64 to bytes. -func int64ToBytes(i int64) []byte { - buf := make([]byte, 8) - binary.BigEndian.PutUint64(buf, uint64(i)) - return buf -} - -type zipkinSpan struct { - *Span - - // peer points to the peer service participating in this span, - // e.g. the Client if this span is a server span, - // or Server if this span is a client span - peer struct { - Ipv4 int32 - Port int16 - ServiceName string - } - - // used to distinguish local vs. RPC Server vs. RPC Client spans - spanKind string -} - -func (s *zipkinSpan) handleSpecialTags() { - s.Lock() - defer s.Unlock() - if s.firstInProcess { - // append the process tags - s.tags = append(s.tags, s.tracer.tags...) - } - filteredTags := make([]Tag, 0, len(s.tags)) - for _, tag := range s.tags { - if handler, ok := specialTagHandlers[tag.key]; ok { - handler(s, tag.value) - } else { - filteredTags = append(filteredTags, tag) - } - } - s.tags = filteredTags -} - -func setSpanKind(s *zipkinSpan, value interface{}) { - if val, ok := value.(string); ok { - s.spanKind = val - return - } - if val, ok := value.(ext.SpanKindEnum); ok { - s.spanKind = string(val) - } -} - -func setPeerIPv4(s *zipkinSpan, value interface{}) { - if val, ok := value.(string); ok { - if ip, err := utils.ParseIPToUint32(val); err == nil { - s.peer.Ipv4 = int32(ip) - return - } - } - if val, ok := value.(uint32); ok { - s.peer.Ipv4 = int32(val) - return - } - if val, ok := value.(int32); ok { - s.peer.Ipv4 = val - } -} - -func setPeerPort(s *zipkinSpan, value interface{}) { - if val, ok := value.(string); ok { - if port, err := utils.ParsePort(val); err == nil { - s.peer.Port = int16(port) - return - } - } - if val, ok := value.(uint16); ok { - s.peer.Port = int16(val) - return - } - if val, ok := value.(int); ok { - s.peer.Port = int16(val) - } -} - -func setPeerService(s *zipkinSpan, value interface{}) { - if val, ok := value.(string); ok { - s.peer.ServiceName = val - } -} - -func removeTag(s *zipkinSpan, value interface{}) {} - -func (s *zipkinSpan) peerDefined() bool { - return s.peer.ServiceName != "" || s.peer.Ipv4 != 0 || s.peer.Port != 0 -} - -func (s *zipkinSpan) isRPC() bool { - s.RLock() - defer s.RUnlock() - return s.spanKind == string(ext.SpanKindRPCClientEnum) || s.spanKind == string(ext.SpanKindRPCServerEnum) -} - -func (s *zipkinSpan) isRPCClient() bool { - s.RLock() - defer s.RUnlock() - return s.spanKind == string(ext.SpanKindRPCClientEnum) -} diff --git a/vendor/github.com/uber/jaeger-lib/LICENSE b/vendor/github.com/uber/jaeger-lib/LICENSE deleted file mode 100644 index 261eeb9e9f8b..000000000000 --- a/vendor/github.com/uber/jaeger-lib/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - 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/uber/jaeger-lib/metrics/counter.go b/vendor/github.com/uber/jaeger-lib/metrics/counter.go deleted file mode 100644 index 2a6a43efdb45..000000000000 --- a/vendor/github.com/uber/jaeger-lib/metrics/counter.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 metrics - -// Counter tracks the number of times an event has occurred -type Counter interface { - // Inc adds the given value to the counter. - Inc(int64) -} - -// NullCounter counter that does nothing -var NullCounter Counter = nullCounter{} - -type nullCounter struct{} - -func (nullCounter) Inc(int64) {} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/factory.go b/vendor/github.com/uber/jaeger-lib/metrics/factory.go deleted file mode 100644 index a744a890df3d..000000000000 --- a/vendor/github.com/uber/jaeger-lib/metrics/factory.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 metrics - -// Factory creates new metrics -type Factory interface { - Counter(name string, tags map[string]string) Counter - Timer(name string, tags map[string]string) Timer - Gauge(name string, tags map[string]string) Gauge - - // Namespace returns a nested metrics factory. - Namespace(name string, tags map[string]string) Factory -} - -// NullFactory is a metrics factory that returns NullCounter, NullTimer, and NullGauge. -var NullFactory Factory = nullFactory{} - -type nullFactory struct{} - -func (nullFactory) Counter(name string, tags map[string]string) Counter { return NullCounter } -func (nullFactory) Timer(name string, tags map[string]string) Timer { return NullTimer } -func (nullFactory) Gauge(name string, tags map[string]string) Gauge { return NullGauge } -func (nullFactory) Namespace(name string, tags map[string]string) Factory { return NullFactory } diff --git a/vendor/github.com/uber/jaeger-lib/metrics/gauge.go b/vendor/github.com/uber/jaeger-lib/metrics/gauge.go deleted file mode 100644 index 3c606391a095..000000000000 --- a/vendor/github.com/uber/jaeger-lib/metrics/gauge.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 metrics - -// Gauge returns instantaneous measurements of something as an int64 value -type Gauge interface { - // Update the gauge to the value passed in. - Update(int64) -} - -// NullGauge gauge that does nothing -var NullGauge Gauge = nullGauge{} - -type nullGauge struct{} - -func (nullGauge) Update(int64) {} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/local.go b/vendor/github.com/uber/jaeger-lib/metrics/local.go deleted file mode 100644 index 217d30600a0b..000000000000 --- a/vendor/github.com/uber/jaeger-lib/metrics/local.go +++ /dev/null @@ -1,337 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 metrics - -import ( - "sort" - "sync" - "sync/atomic" - "time" - - "github.com/codahale/hdrhistogram" -) - -// This is intentionally very similar to github.com/codahale/metrics, the -// main difference being that counters/gauges are scoped to the provider -// rather than being global (to facilitate testing). - -// A LocalBackend is a metrics provider which aggregates data in-vm, and -// allows exporting snapshots to shove the data into a remote collector -type LocalBackend struct { - cm sync.Mutex - gm sync.Mutex - tm sync.Mutex - counters map[string]*int64 - gauges map[string]*int64 - timers map[string]*localBackendTimer - stop chan struct{} - wg sync.WaitGroup - TagsSep string - TagKVSep string -} - -// NewLocalBackend returns a new LocalBackend. The collectionInterval is the histogram -// time window for each timer. -func NewLocalBackend(collectionInterval time.Duration) *LocalBackend { - b := &LocalBackend{ - counters: make(map[string]*int64), - gauges: make(map[string]*int64), - timers: make(map[string]*localBackendTimer), - stop: make(chan struct{}), - TagsSep: "|", - TagKVSep: "=", - } - if collectionInterval == 0 { - // Use one histogram time window for all timers - return b - } - b.wg.Add(1) - go b.runLoop(collectionInterval) - return b -} - -// Clear discards accumulated stats -func (b *LocalBackend) Clear() { - b.cm.Lock() - defer b.cm.Unlock() - b.gm.Lock() - defer b.gm.Unlock() - b.tm.Lock() - defer b.tm.Unlock() - b.counters = make(map[string]*int64) - b.gauges = make(map[string]*int64) - b.timers = make(map[string]*localBackendTimer) -} - -func (b *LocalBackend) runLoop(collectionInterval time.Duration) { - defer b.wg.Done() - ticker := time.NewTicker(collectionInterval) - for { - select { - case <-ticker.C: - b.tm.Lock() - timers := make(map[string]*localBackendTimer, len(b.timers)) - for timerName, timer := range b.timers { - timers[timerName] = timer - } - b.tm.Unlock() - - for _, t := range timers { - t.Lock() - t.hist.Rotate() - t.Unlock() - } - case <-b.stop: - ticker.Stop() - return - } - } -} - -// IncCounter increments a counter value -func (b *LocalBackend) IncCounter(name string, tags map[string]string, delta int64) { - name = GetKey(name, tags, b.TagsSep, b.TagKVSep) - b.cm.Lock() - defer b.cm.Unlock() - counter := b.counters[name] - if counter == nil { - b.counters[name] = new(int64) - *b.counters[name] = delta - return - } - atomic.AddInt64(counter, delta) -} - -// UpdateGauge updates the value of a gauge -func (b *LocalBackend) UpdateGauge(name string, tags map[string]string, value int64) { - name = GetKey(name, tags, b.TagsSep, b.TagKVSep) - b.gm.Lock() - defer b.gm.Unlock() - gauge := b.gauges[name] - if gauge == nil { - b.gauges[name] = new(int64) - *b.gauges[name] = value - return - } - atomic.StoreInt64(gauge, value) -} - -// RecordTimer records a timing duration -func (b *LocalBackend) RecordTimer(name string, tags map[string]string, d time.Duration) { - name = GetKey(name, tags, b.TagsSep, b.TagKVSep) - timer := b.findOrCreateTimer(name) - timer.Lock() - timer.hist.Current.RecordValue(int64(d / time.Millisecond)) - timer.Unlock() -} - -func (b *LocalBackend) findOrCreateTimer(name string) *localBackendTimer { - b.tm.Lock() - defer b.tm.Unlock() - if t, ok := b.timers[name]; ok { - return t - } - - t := &localBackendTimer{ - hist: hdrhistogram.NewWindowed(5, 0, int64((5*time.Minute)/time.Millisecond), 1), - } - b.timers[name] = t - return t -} - -type localBackendTimer struct { - sync.Mutex - hist *hdrhistogram.WindowedHistogram -} - -var ( - percentiles = map[string]float64{ - "P50": 50, - "P75": 75, - "P90": 90, - "P95": 95, - "P99": 99, - "P999": 99.9, - } -) - -// Snapshot captures a snapshot of the current counter and gauge values -func (b *LocalBackend) Snapshot() (counters, gauges map[string]int64) { - b.cm.Lock() - defer b.cm.Unlock() - - counters = make(map[string]int64, len(b.counters)) - for name, value := range b.counters { - counters[name] = atomic.LoadInt64(value) - } - - b.gm.Lock() - defer b.gm.Unlock() - - gauges = make(map[string]int64, len(b.gauges)) - for name, value := range b.gauges { - gauges[name] = atomic.LoadInt64(value) - } - - b.tm.Lock() - timers := make(map[string]*localBackendTimer) - for timerName, timer := range b.timers { - timers[timerName] = timer - } - b.tm.Unlock() - - for timerName, timer := range timers { - timer.Lock() - hist := timer.hist.Merge() - timer.Unlock() - for name, q := range percentiles { - gauges[timerName+"."+name] = hist.ValueAtQuantile(q) - } - } - - return -} - -// Stop cleanly closes the background goroutine spawned by NewLocalBackend. -func (b *LocalBackend) Stop() { - close(b.stop) - b.wg.Wait() -} - -// GetKey converts name+tags into a single string of the form -// "name|tag1=value1|...|tagN=valueN", where tag names are -// sorted alphabetically. -func GetKey(name string, tags map[string]string, tagsSep string, tagKVSep string) string { - keys := make([]string, 0, len(tags)) - for k := range tags { - keys = append(keys, k) - } - sort.Strings(keys) - key := name - for _, k := range keys { - key = key + tagsSep + k + tagKVSep + tags[k] - } - return key -} - -type stats struct { - name string - tags map[string]string - localBackend *LocalBackend -} - -type localTimer struct { - stats -} - -func (l *localTimer) Record(d time.Duration) { - l.localBackend.RecordTimer(l.name, l.tags, d) -} - -type localCounter struct { - stats -} - -func (l *localCounter) Inc(delta int64) { - l.localBackend.IncCounter(l.name, l.tags, delta) -} - -type localGauge struct { - stats -} - -func (l *localGauge) Update(value int64) { - l.localBackend.UpdateGauge(l.name, l.tags, value) -} - -// LocalFactory stats factory that creates metrics that are stored locally -type LocalFactory struct { - *LocalBackend - namespace string - tags map[string]string -} - -// NewLocalFactory returns a new LocalMetricsFactory -func NewLocalFactory(collectionInterval time.Duration) *LocalFactory { - return &LocalFactory{ - LocalBackend: NewLocalBackend(collectionInterval), - } -} - -// appendTags adds the tags to the namespace tags and returns a combined map. -func (l *LocalFactory) appendTags(tags map[string]string) map[string]string { - newTags := make(map[string]string) - for k, v := range l.tags { - newTags[k] = v - } - for k, v := range tags { - newTags[k] = v - } - return newTags -} - -func (l *LocalFactory) newNamespace(name string) string { - if l.namespace == "" { - return name - } - - if name == "" { - return l.namespace - } - - return l.namespace + "." + name -} - -// Counter returns a local stats counter -func (l *LocalFactory) Counter(name string, tags map[string]string) Counter { - return &localCounter{ - stats{ - name: l.newNamespace(name), - tags: l.appendTags(tags), - localBackend: l.LocalBackend, - }, - } -} - -// Timer returns a local stats timer. -func (l *LocalFactory) Timer(name string, tags map[string]string) Timer { - return &localTimer{ - stats{ - name: l.newNamespace(name), - tags: l.appendTags(tags), - localBackend: l.LocalBackend, - }, - } -} - -// Gauge returns a local stats gauge. -func (l *LocalFactory) Gauge(name string, tags map[string]string) Gauge { - return &localGauge{ - stats{ - name: l.newNamespace(name), - tags: l.appendTags(tags), - localBackend: l.LocalBackend, - }, - } -} - -// Namespace returns a new namespace. -func (l *LocalFactory) Namespace(name string, tags map[string]string) Factory { - return &LocalFactory{ - namespace: l.newNamespace(name), - tags: l.appendTags(tags), - LocalBackend: l.LocalBackend, - } -} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/metrics.go b/vendor/github.com/uber/jaeger-lib/metrics/metrics.go deleted file mode 100644 index 0b97707b075e..000000000000 --- a/vendor/github.com/uber/jaeger-lib/metrics/metrics.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 metrics - -import ( - "fmt" - "reflect" - "strings" -) - -// Init initializes the passed in metrics and initializes its fields using the passed in factory. -func Init(metrics interface{}, factory Factory, globalTags map[string]string) { - if err := initMetrics(metrics, factory, globalTags); err != nil { - panic(err.Error()) - } -} - -// initMetrics uses reflection to initialize a struct containing metrics fields -// by assigning new Counter/Gauge/Timer values with the metric name retrieved -// from the `metric` tag and stats tags retrieved from the `tags` tag. -// -// Note: all fields of the struct must be exported, have a `metric` tag, and be -// of type Counter or Gauge or Timer. -func initMetrics(m interface{}, factory Factory, globalTags map[string]string) error { - // Allow user to opt out of reporting metrics by passing in nil. - if factory == nil { - factory = NullFactory - } - - counterPtrType := reflect.TypeOf((*Counter)(nil)).Elem() - gaugePtrType := reflect.TypeOf((*Gauge)(nil)).Elem() - timerPtrType := reflect.TypeOf((*Timer)(nil)).Elem() - - v := reflect.ValueOf(m).Elem() - t := v.Type() - for i := 0; i < t.NumField(); i++ { - tags := make(map[string]string) - for k, v := range globalTags { - tags[k] = v - } - field := t.Field(i) - metric := field.Tag.Get("metric") - if metric == "" { - return fmt.Errorf("Field %s is missing a tag 'metric'", field.Name) - } - if tagString := field.Tag.Get("tags"); tagString != "" { - tagPairs := strings.Split(tagString, ",") - for _, tagPair := range tagPairs { - tag := strings.Split(tagPair, "=") - if len(tag) != 2 { - return fmt.Errorf( - "Field [%s]: Tag [%s] is not of the form key=value in 'tags' string [%s]", - field.Name, tagPair, tagString) - } - tags[tag[0]] = tag[1] - } - } - var obj interface{} - if field.Type.AssignableTo(counterPtrType) { - obj = factory.Counter(metric, tags) - } else if field.Type.AssignableTo(gaugePtrType) { - obj = factory.Gauge(metric, tags) - } else if field.Type.AssignableTo(timerPtrType) { - obj = factory.Timer(metric, tags) - } else { - return fmt.Errorf( - "Field %s is not a pointer to timer, gauge, or counter", - field.Name) - } - v.Field(i).Set(reflect.ValueOf(obj)) - } - return nil -} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/stopwatch.go b/vendor/github.com/uber/jaeger-lib/metrics/stopwatch.go deleted file mode 100644 index 4a8abdb539f9..000000000000 --- a/vendor/github.com/uber/jaeger-lib/metrics/stopwatch.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 metrics - -import ( - "time" -) - -// StartStopwatch begins recording the executing time of an event, returning -// a Stopwatch that should be used to stop the recording the time for -// that event. Multiple events can be occurring simultaneously each -// represented by different active Stopwatches -func StartStopwatch(timer Timer) Stopwatch { - return Stopwatch{t: timer, start: time.Now()} -} - -// A Stopwatch tracks the execution time of a specific event -type Stopwatch struct { - t Timer - start time.Time -} - -// Stop stops executing of the stopwatch and records the amount of elapsed time -func (s Stopwatch) Stop() { - s.t.Record(s.ElapsedTime()) -} - -// ElapsedTime returns the amount of elapsed time (in time.Duration) -func (s Stopwatch) ElapsedTime() time.Duration { - return time.Since(s.start) -} diff --git a/vendor/github.com/uber/jaeger-lib/metrics/timer.go b/vendor/github.com/uber/jaeger-lib/metrics/timer.go deleted file mode 100644 index e18d222abb4a..000000000000 --- a/vendor/github.com/uber/jaeger-lib/metrics/timer.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2017 Uber Technologies, Inc. -// -// 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 metrics - -import ( - "time" -) - -// Timer accumulates observations about how long some operation took, -// and also maintains a historgam of percentiles. -type Timer interface { - // Records the time passed in. - Record(time.Duration) -} - -// NullTimer timer that does nothing -var NullTimer Timer = nullTimer{} - -type nullTimer struct{} - -func (nullTimer) Record(time.Duration) {} diff --git a/vendor/golang.org/x/crypto/.gitattributes b/vendor/golang.org/x/crypto/.gitattributes deleted file mode 100644 index d2f212e5da80..000000000000 --- a/vendor/golang.org/x/crypto/.gitattributes +++ /dev/null @@ -1,10 +0,0 @@ -# Treat all files in this repo as binary, with no git magic updating -# line endings. Windows users contributing to Go will need to use a -# modern version of git and editors capable of LF line endings. -# -# We'll prevent accidental CRLF line endings from entering the repo -# via the git-review gofmt checks. -# -# See golang.org/issue/9281 - -* -text diff --git a/vendor/golang.org/x/crypto/.gitignore b/vendor/golang.org/x/crypto/.gitignore deleted file mode 100644 index 8339fd61d3f4..000000000000 --- a/vendor/golang.org/x/crypto/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Add no patterns to .hgignore except for files generated by the build. -last-change diff --git a/vendor/golang.org/x/crypto/AUTHORS b/vendor/golang.org/x/crypto/AUTHORS deleted file mode 100644 index 15167cd746c5..000000000000 --- a/vendor/golang.org/x/crypto/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/crypto/CONTRIBUTING.md b/vendor/golang.org/x/crypto/CONTRIBUTING.md deleted file mode 100644 index 88dff59bc7d2..000000000000 --- a/vendor/golang.org/x/crypto/CONTRIBUTING.md +++ /dev/null @@ -1,31 +0,0 @@ -# Contributing to Go - -Go is an open source project. - -It is the work of hundreds of contributors. We appreciate your help! - - -## Filing issues - -When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: - -1. What version of Go are you using (`go version`)? -2. What operating system and processor architecture are you using? -3. What did you do? -4. What did you expect to see? -5. What did you see instead? - -General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. -The gophers there will answer or ask you to file an issue if you've tripped over a bug. - -## Contributing code - -Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) -before sending patches. - -**We do not accept GitHub pull requests** -(we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review). - -Unless otherwise noted, the Go source files are distributed under -the BSD-style license found in the LICENSE file. - diff --git a/vendor/golang.org/x/crypto/CONTRIBUTORS b/vendor/golang.org/x/crypto/CONTRIBUTORS deleted file mode 100644 index 1c4577e96806..000000000000 --- a/vendor/golang.org/x/crypto/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/crypto/LICENSE b/vendor/golang.org/x/crypto/LICENSE deleted file mode 100644 index 6a66aea5eafe..000000000000 --- a/vendor/golang.org/x/crypto/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 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. diff --git a/vendor/golang.org/x/crypto/PATENTS b/vendor/golang.org/x/crypto/PATENTS deleted file mode 100644 index 733099041f84..000000000000 --- a/vendor/golang.org/x/crypto/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the Go project. - -Google 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, -transfer and otherwise run, modify and propagate the contents of this -implementation of Go, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of Go. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of Go or any code incorporated within this -implementation of Go constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of Go -shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/crypto/README b/vendor/golang.org/x/crypto/README deleted file mode 100644 index f1e0cbf94e03..000000000000 --- a/vendor/golang.org/x/crypto/README +++ /dev/null @@ -1,3 +0,0 @@ -This repository holds supplementary Go cryptography libraries. - -To submit changes to this repository, see http://golang.org/doc/contribute.html. diff --git a/vendor/golang.org/x/crypto/cast5/cast5.go b/vendor/golang.org/x/crypto/cast5/cast5.go deleted file mode 100644 index 0b4af37bdc29..000000000000 --- a/vendor/golang.org/x/crypto/cast5/cast5.go +++ /dev/null @@ -1,526 +0,0 @@ -// 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. - -// Package cast5 implements CAST5, as defined in RFC 2144. CAST5 is a common -// OpenPGP cipher. -package cast5 // import "golang.org/x/crypto/cast5" - -import "errors" - -const BlockSize = 8 -const KeySize = 16 - -type Cipher struct { - masking [16]uint32 - rotate [16]uint8 -} - -func NewCipher(key []byte) (c *Cipher, err error) { - if len(key) != KeySize { - return nil, errors.New("CAST5: keys must be 16 bytes") - } - - c = new(Cipher) - c.keySchedule(key) - return -} - -func (c *Cipher) BlockSize() int { - return BlockSize -} - -func (c *Cipher) Encrypt(dst, src []byte) { - l := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3]) - r := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7]) - - l, r = r, l^f1(r, c.masking[0], c.rotate[0]) - l, r = r, l^f2(r, c.masking[1], c.rotate[1]) - l, r = r, l^f3(r, c.masking[2], c.rotate[2]) - l, r = r, l^f1(r, c.masking[3], c.rotate[3]) - - l, r = r, l^f2(r, c.masking[4], c.rotate[4]) - l, r = r, l^f3(r, c.masking[5], c.rotate[5]) - l, r = r, l^f1(r, c.masking[6], c.rotate[6]) - l, r = r, l^f2(r, c.masking[7], c.rotate[7]) - - l, r = r, l^f3(r, c.masking[8], c.rotate[8]) - l, r = r, l^f1(r, c.masking[9], c.rotate[9]) - l, r = r, l^f2(r, c.masking[10], c.rotate[10]) - l, r = r, l^f3(r, c.masking[11], c.rotate[11]) - - l, r = r, l^f1(r, c.masking[12], c.rotate[12]) - l, r = r, l^f2(r, c.masking[13], c.rotate[13]) - l, r = r, l^f3(r, c.masking[14], c.rotate[14]) - l, r = r, l^f1(r, c.masking[15], c.rotate[15]) - - dst[0] = uint8(r >> 24) - dst[1] = uint8(r >> 16) - dst[2] = uint8(r >> 8) - dst[3] = uint8(r) - dst[4] = uint8(l >> 24) - dst[5] = uint8(l >> 16) - dst[6] = uint8(l >> 8) - dst[7] = uint8(l) -} - -func (c *Cipher) Decrypt(dst, src []byte) { - l := uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3]) - r := uint32(src[4])<<24 | uint32(src[5])<<16 | uint32(src[6])<<8 | uint32(src[7]) - - l, r = r, l^f1(r, c.masking[15], c.rotate[15]) - l, r = r, l^f3(r, c.masking[14], c.rotate[14]) - l, r = r, l^f2(r, c.masking[13], c.rotate[13]) - l, r = r, l^f1(r, c.masking[12], c.rotate[12]) - - l, r = r, l^f3(r, c.masking[11], c.rotate[11]) - l, r = r, l^f2(r, c.masking[10], c.rotate[10]) - l, r = r, l^f1(r, c.masking[9], c.rotate[9]) - l, r = r, l^f3(r, c.masking[8], c.rotate[8]) - - l, r = r, l^f2(r, c.masking[7], c.rotate[7]) - l, r = r, l^f1(r, c.masking[6], c.rotate[6]) - l, r = r, l^f3(r, c.masking[5], c.rotate[5]) - l, r = r, l^f2(r, c.masking[4], c.rotate[4]) - - l, r = r, l^f1(r, c.masking[3], c.rotate[3]) - l, r = r, l^f3(r, c.masking[2], c.rotate[2]) - l, r = r, l^f2(r, c.masking[1], c.rotate[1]) - l, r = r, l^f1(r, c.masking[0], c.rotate[0]) - - dst[0] = uint8(r >> 24) - dst[1] = uint8(r >> 16) - dst[2] = uint8(r >> 8) - dst[3] = uint8(r) - dst[4] = uint8(l >> 24) - dst[5] = uint8(l >> 16) - dst[6] = uint8(l >> 8) - dst[7] = uint8(l) -} - -type keyScheduleA [4][7]uint8 -type keyScheduleB [4][5]uint8 - -// keyScheduleRound contains the magic values for a round of the key schedule. -// The keyScheduleA deals with the lines like: -// z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8] -// Conceptually, both x and z are in the same array, x first. The first -// element describes which word of this array gets written to and the -// second, which word gets read. So, for the line above, it's "4, 0", because -// it's writing to the first word of z, which, being after x, is word 4, and -// reading from the first word of x: word 0. -// -// Next are the indexes into the S-boxes. Now the array is treated as bytes. So -// "xD" is 0xd. The first byte of z is written as "16 + 0", just to be clear -// that it's z that we're indexing. -// -// keyScheduleB deals with lines like: -// K1 = S5[z8] ^ S6[z9] ^ S7[z7] ^ S8[z6] ^ S5[z2] -// "K1" is ignored because key words are always written in order. So the five -// elements are the S-box indexes. They use the same form as in keyScheduleA, -// above. - -type keyScheduleRound struct{} -type keySchedule []keyScheduleRound - -var schedule = []struct { - a keyScheduleA - b keyScheduleB -}{ - { - keyScheduleA{ - {4, 0, 0xd, 0xf, 0xc, 0xe, 0x8}, - {5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa}, - {6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9}, - {7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb}, - }, - keyScheduleB{ - {16 + 8, 16 + 9, 16 + 7, 16 + 6, 16 + 2}, - {16 + 0xa, 16 + 0xb, 16 + 5, 16 + 4, 16 + 6}, - {16 + 0xc, 16 + 0xd, 16 + 3, 16 + 2, 16 + 9}, - {16 + 0xe, 16 + 0xf, 16 + 1, 16 + 0, 16 + 0xc}, - }, - }, - { - keyScheduleA{ - {0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0}, - {1, 4, 0, 2, 1, 3, 16 + 2}, - {2, 5, 7, 6, 5, 4, 16 + 1}, - {3, 7, 0xa, 9, 0xb, 8, 16 + 3}, - }, - keyScheduleB{ - {3, 2, 0xc, 0xd, 8}, - {1, 0, 0xe, 0xf, 0xd}, - {7, 6, 8, 9, 3}, - {5, 4, 0xa, 0xb, 7}, - }, - }, - { - keyScheduleA{ - {4, 0, 0xd, 0xf, 0xc, 0xe, 8}, - {5, 2, 16 + 0, 16 + 2, 16 + 1, 16 + 3, 0xa}, - {6, 3, 16 + 7, 16 + 6, 16 + 5, 16 + 4, 9}, - {7, 1, 16 + 0xa, 16 + 9, 16 + 0xb, 16 + 8, 0xb}, - }, - keyScheduleB{ - {16 + 3, 16 + 2, 16 + 0xc, 16 + 0xd, 16 + 9}, - {16 + 1, 16 + 0, 16 + 0xe, 16 + 0xf, 16 + 0xc}, - {16 + 7, 16 + 6, 16 + 8, 16 + 9, 16 + 2}, - {16 + 5, 16 + 4, 16 + 0xa, 16 + 0xb, 16 + 6}, - }, - }, - { - keyScheduleA{ - {0, 6, 16 + 5, 16 + 7, 16 + 4, 16 + 6, 16 + 0}, - {1, 4, 0, 2, 1, 3, 16 + 2}, - {2, 5, 7, 6, 5, 4, 16 + 1}, - {3, 7, 0xa, 9, 0xb, 8, 16 + 3}, - }, - keyScheduleB{ - {8, 9, 7, 6, 3}, - {0xa, 0xb, 5, 4, 7}, - {0xc, 0xd, 3, 2, 8}, - {0xe, 0xf, 1, 0, 0xd}, - }, - }, -} - -func (c *Cipher) keySchedule(in []byte) { - var t [8]uint32 - var k [32]uint32 - - for i := 0; i < 4; i++ { - j := i * 4 - t[i] = uint32(in[j])<<24 | uint32(in[j+1])<<16 | uint32(in[j+2])<<8 | uint32(in[j+3]) - } - - x := []byte{6, 7, 4, 5} - ki := 0 - - for half := 0; half < 2; half++ { - for _, round := range schedule { - for j := 0; j < 4; j++ { - var a [7]uint8 - copy(a[:], round.a[j][:]) - w := t[a[1]] - w ^= sBox[4][(t[a[2]>>2]>>(24-8*(a[2]&3)))&0xff] - w ^= sBox[5][(t[a[3]>>2]>>(24-8*(a[3]&3)))&0xff] - w ^= sBox[6][(t[a[4]>>2]>>(24-8*(a[4]&3)))&0xff] - w ^= sBox[7][(t[a[5]>>2]>>(24-8*(a[5]&3)))&0xff] - w ^= sBox[x[j]][(t[a[6]>>2]>>(24-8*(a[6]&3)))&0xff] - t[a[0]] = w - } - - for j := 0; j < 4; j++ { - var b [5]uint8 - copy(b[:], round.b[j][:]) - w := sBox[4][(t[b[0]>>2]>>(24-8*(b[0]&3)))&0xff] - w ^= sBox[5][(t[b[1]>>2]>>(24-8*(b[1]&3)))&0xff] - w ^= sBox[6][(t[b[2]>>2]>>(24-8*(b[2]&3)))&0xff] - w ^= sBox[7][(t[b[3]>>2]>>(24-8*(b[3]&3)))&0xff] - w ^= sBox[4+j][(t[b[4]>>2]>>(24-8*(b[4]&3)))&0xff] - k[ki] = w - ki++ - } - } - } - - for i := 0; i < 16; i++ { - c.masking[i] = k[i] - c.rotate[i] = uint8(k[16+i] & 0x1f) - } -} - -// These are the three 'f' functions. See RFC 2144, section 2.2. -func f1(d, m uint32, r uint8) uint32 { - t := m + d - I := (t << r) | (t >> (32 - r)) - return ((sBox[0][I>>24] ^ sBox[1][(I>>16)&0xff]) - sBox[2][(I>>8)&0xff]) + sBox[3][I&0xff] -} - -func f2(d, m uint32, r uint8) uint32 { - t := m ^ d - I := (t << r) | (t >> (32 - r)) - return ((sBox[0][I>>24] - sBox[1][(I>>16)&0xff]) + sBox[2][(I>>8)&0xff]) ^ sBox[3][I&0xff] -} - -func f3(d, m uint32, r uint8) uint32 { - t := m - d - I := (t << r) | (t >> (32 - r)) - return ((sBox[0][I>>24] + sBox[1][(I>>16)&0xff]) ^ sBox[2][(I>>8)&0xff]) - sBox[3][I&0xff] -} - -var sBox = [8][256]uint32{ - { - 0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949, - 0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e, - 0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d, - 0xa1c9e0d6, 0x346c4819, 0x61b76d87, 0x22540f2f, 0x2abe32e1, 0xaa54166b, 0x22568e3a, 0xa2d341d0, - 0x66db40c8, 0xa784392f, 0x004dff2f, 0x2db9d2de, 0x97943fac, 0x4a97c1d8, 0x527644b7, 0xb5f437a7, - 0xb82cbaef, 0xd751d159, 0x6ff7f0ed, 0x5a097a1f, 0x827b68d0, 0x90ecf52e, 0x22b0c054, 0xbc8e5935, - 0x4b6d2f7f, 0x50bb64a2, 0xd2664910, 0xbee5812d, 0xb7332290, 0xe93b159f, 0xb48ee411, 0x4bff345d, - 0xfd45c240, 0xad31973f, 0xc4f6d02e, 0x55fc8165, 0xd5b1caad, 0xa1ac2dae, 0xa2d4b76d, 0xc19b0c50, - 0x882240f2, 0x0c6e4f38, 0xa4e4bfd7, 0x4f5ba272, 0x564c1d2f, 0xc59c5319, 0xb949e354, 0xb04669fe, - 0xb1b6ab8a, 0xc71358dd, 0x6385c545, 0x110f935d, 0x57538ad5, 0x6a390493, 0xe63d37e0, 0x2a54f6b3, - 0x3a787d5f, 0x6276a0b5, 0x19a6fcdf, 0x7a42206a, 0x29f9d4d5, 0xf61b1891, 0xbb72275e, 0xaa508167, - 0x38901091, 0xc6b505eb, 0x84c7cb8c, 0x2ad75a0f, 0x874a1427, 0xa2d1936b, 0x2ad286af, 0xaa56d291, - 0xd7894360, 0x425c750d, 0x93b39e26, 0x187184c9, 0x6c00b32d, 0x73e2bb14, 0xa0bebc3c, 0x54623779, - 0x64459eab, 0x3f328b82, 0x7718cf82, 0x59a2cea6, 0x04ee002e, 0x89fe78e6, 0x3fab0950, 0x325ff6c2, - 0x81383f05, 0x6963c5c8, 0x76cb5ad6, 0xd49974c9, 0xca180dcf, 0x380782d5, 0xc7fa5cf6, 0x8ac31511, - 0x35e79e13, 0x47da91d0, 0xf40f9086, 0xa7e2419e, 0x31366241, 0x051ef495, 0xaa573b04, 0x4a805d8d, - 0x548300d0, 0x00322a3c, 0xbf64cddf, 0xba57a68e, 0x75c6372b, 0x50afd341, 0xa7c13275, 0x915a0bf5, - 0x6b54bfab, 0x2b0b1426, 0xab4cc9d7, 0x449ccd82, 0xf7fbf265, 0xab85c5f3, 0x1b55db94, 0xaad4e324, - 0xcfa4bd3f, 0x2deaa3e2, 0x9e204d02, 0xc8bd25ac, 0xeadf55b3, 0xd5bd9e98, 0xe31231b2, 0x2ad5ad6c, - 0x954329de, 0xadbe4528, 0xd8710f69, 0xaa51c90f, 0xaa786bf6, 0x22513f1e, 0xaa51a79b, 0x2ad344cc, - 0x7b5a41f0, 0xd37cfbad, 0x1b069505, 0x41ece491, 0xb4c332e6, 0x032268d4, 0xc9600acc, 0xce387e6d, - 0xbf6bb16c, 0x6a70fb78, 0x0d03d9c9, 0xd4df39de, 0xe01063da, 0x4736f464, 0x5ad328d8, 0xb347cc96, - 0x75bb0fc3, 0x98511bfb, 0x4ffbcc35, 0xb58bcf6a, 0xe11f0abc, 0xbfc5fe4a, 0xa70aec10, 0xac39570a, - 0x3f04442f, 0x6188b153, 0xe0397a2e, 0x5727cb79, 0x9ceb418f, 0x1cacd68d, 0x2ad37c96, 0x0175cb9d, - 0xc69dff09, 0xc75b65f0, 0xd9db40d8, 0xec0e7779, 0x4744ead4, 0xb11c3274, 0xdd24cb9e, 0x7e1c54bd, - 0xf01144f9, 0xd2240eb1, 0x9675b3fd, 0xa3ac3755, 0xd47c27af, 0x51c85f4d, 0x56907596, 0xa5bb15e6, - 0x580304f0, 0xca042cf1, 0x011a37ea, 0x8dbfaadb, 0x35ba3e4a, 0x3526ffa0, 0xc37b4d09, 0xbc306ed9, - 0x98a52666, 0x5648f725, 0xff5e569d, 0x0ced63d0, 0x7c63b2cf, 0x700b45e1, 0xd5ea50f1, 0x85a92872, - 0xaf1fbda7, 0xd4234870, 0xa7870bf3, 0x2d3b4d79, 0x42e04198, 0x0cd0ede7, 0x26470db8, 0xf881814c, - 0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e, - 0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff, 0xb141ab08, 0x7cca89b9, - 0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf, - }, - { - 0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, 0xeec5207a, 0x55889c94, 0x72fc0651, - 0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3, - 0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb, - 0xd1da4181, 0x3b092ab1, 0xf997f1c1, 0xa5e6cf7b, 0x01420ddb, 0xe4e7ef5b, 0x25a1ff41, 0xe180f806, - 0x1fc41080, 0x179bee7a, 0xd37ac6a9, 0xfe5830a4, 0x98de8b7f, 0x77e83f4e, 0x79929269, 0x24fa9f7b, - 0xe113c85b, 0xacc40083, 0xd7503525, 0xf7ea615f, 0x62143154, 0x0d554b63, 0x5d681121, 0xc866c359, - 0x3d63cf73, 0xcee234c0, 0xd4d87e87, 0x5c672b21, 0x071f6181, 0x39f7627f, 0x361e3084, 0xe4eb573b, - 0x602f64a4, 0xd63acd9c, 0x1bbc4635, 0x9e81032d, 0x2701f50c, 0x99847ab4, 0xa0e3df79, 0xba6cf38c, - 0x10843094, 0x2537a95e, 0xf46f6ffe, 0xa1ff3b1f, 0x208cfb6a, 0x8f458c74, 0xd9e0a227, 0x4ec73a34, - 0xfc884f69, 0x3e4de8df, 0xef0e0088, 0x3559648d, 0x8a45388c, 0x1d804366, 0x721d9bfd, 0xa58684bb, - 0xe8256333, 0x844e8212, 0x128d8098, 0xfed33fb4, 0xce280ae1, 0x27e19ba5, 0xd5a6c252, 0xe49754bd, - 0xc5d655dd, 0xeb667064, 0x77840b4d, 0xa1b6a801, 0x84db26a9, 0xe0b56714, 0x21f043b7, 0xe5d05860, - 0x54f03084, 0x066ff472, 0xa31aa153, 0xdadc4755, 0xb5625dbf, 0x68561be6, 0x83ca6b94, 0x2d6ed23b, - 0xeccf01db, 0xa6d3d0ba, 0xb6803d5c, 0xaf77a709, 0x33b4a34c, 0x397bc8d6, 0x5ee22b95, 0x5f0e5304, - 0x81ed6f61, 0x20e74364, 0xb45e1378, 0xde18639b, 0x881ca122, 0xb96726d1, 0x8049a7e8, 0x22b7da7b, - 0x5e552d25, 0x5272d237, 0x79d2951c, 0xc60d894c, 0x488cb402, 0x1ba4fe5b, 0xa4b09f6b, 0x1ca815cf, - 0xa20c3005, 0x8871df63, 0xb9de2fcb, 0x0cc6c9e9, 0x0beeff53, 0xe3214517, 0xb4542835, 0x9f63293c, - 0xee41e729, 0x6e1d2d7c, 0x50045286, 0x1e6685f3, 0xf33401c6, 0x30a22c95, 0x31a70850, 0x60930f13, - 0x73f98417, 0xa1269859, 0xec645c44, 0x52c877a9, 0xcdff33a6, 0xa02b1741, 0x7cbad9a2, 0x2180036f, - 0x50d99c08, 0xcb3f4861, 0xc26bd765, 0x64a3f6ab, 0x80342676, 0x25a75e7b, 0xe4e6d1fc, 0x20c710e6, - 0xcdf0b680, 0x17844d3b, 0x31eef84d, 0x7e0824e4, 0x2ccb49eb, 0x846a3bae, 0x8ff77888, 0xee5d60f6, - 0x7af75673, 0x2fdd5cdb, 0xa11631c1, 0x30f66f43, 0xb3faec54, 0x157fd7fa, 0xef8579cc, 0xd152de58, - 0xdb2ffd5e, 0x8f32ce19, 0x306af97a, 0x02f03ef8, 0x99319ad5, 0xc242fa0f, 0xa7e3ebb0, 0xc68e4906, - 0xb8da230c, 0x80823028, 0xdcdef3c8, 0xd35fb171, 0x088a1bc8, 0xbec0c560, 0x61a3c9e8, 0xbca8f54d, - 0xc72feffa, 0x22822e99, 0x82c570b4, 0xd8d94e89, 0x8b1c34bc, 0x301e16e6, 0x273be979, 0xb0ffeaa6, - 0x61d9b8c6, 0x00b24869, 0xb7ffce3f, 0x08dc283b, 0x43daf65a, 0xf7e19798, 0x7619b72f, 0x8f1c9ba4, - 0xdc8637a0, 0x16a7d3b1, 0x9fc393b7, 0xa7136eeb, 0xc6bcc63e, 0x1a513742, 0xef6828bc, 0x520365d6, - 0x2d6a77ab, 0x3527ed4b, 0x821fd216, 0x095c6e2e, 0xdb92f2fb, 0x5eea29cb, 0x145892f5, 0x91584f7f, - 0x5483697b, 0x2667a8cc, 0x85196048, 0x8c4bacea, 0x833860d4, 0x0d23e0f9, 0x6c387e8a, 0x0ae6d249, - 0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa, - 0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, 0xa345415e, 0x5c038323, 0x3e5d3bb9, - 0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1, - }, - { - 0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90, - 0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5, - 0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e, - 0x553fb2c0, 0x489ae22b, 0xd4ef9794, 0x125e3fbc, 0x21fffcee, 0x825b1bfd, 0x9255c5ed, 0x1257a240, - 0x4e1a8302, 0xbae07fff, 0x528246e7, 0x8e57140e, 0x3373f7bf, 0x8c9f8188, 0xa6fc4ee8, 0xc982b5a5, - 0xa8c01db7, 0x579fc264, 0x67094f31, 0xf2bd3f5f, 0x40fff7c1, 0x1fb78dfc, 0x8e6bd2c1, 0x437be59b, - 0x99b03dbf, 0xb5dbc64b, 0x638dc0e6, 0x55819d99, 0xa197c81c, 0x4a012d6e, 0xc5884a28, 0xccc36f71, - 0xb843c213, 0x6c0743f1, 0x8309893c, 0x0feddd5f, 0x2f7fe850, 0xd7c07f7e, 0x02507fbf, 0x5afb9a04, - 0xa747d2d0, 0x1651192e, 0xaf70bf3e, 0x58c31380, 0x5f98302e, 0x727cc3c4, 0x0a0fb402, 0x0f7fef82, - 0x8c96fdad, 0x5d2c2aae, 0x8ee99a49, 0x50da88b8, 0x8427f4a0, 0x1eac5790, 0x796fb449, 0x8252dc15, - 0xefbd7d9b, 0xa672597d, 0xada840d8, 0x45f54504, 0xfa5d7403, 0xe83ec305, 0x4f91751a, 0x925669c2, - 0x23efe941, 0xa903f12e, 0x60270df2, 0x0276e4b6, 0x94fd6574, 0x927985b2, 0x8276dbcb, 0x02778176, - 0xf8af918d, 0x4e48f79e, 0x8f616ddf, 0xe29d840e, 0x842f7d83, 0x340ce5c8, 0x96bbb682, 0x93b4b148, - 0xef303cab, 0x984faf28, 0x779faf9b, 0x92dc560d, 0x224d1e20, 0x8437aa88, 0x7d29dc96, 0x2756d3dc, - 0x8b907cee, 0xb51fd240, 0xe7c07ce3, 0xe566b4a1, 0xc3e9615e, 0x3cf8209d, 0x6094d1e3, 0xcd9ca341, - 0x5c76460e, 0x00ea983b, 0xd4d67881, 0xfd47572c, 0xf76cedd9, 0xbda8229c, 0x127dadaa, 0x438a074e, - 0x1f97c090, 0x081bdb8a, 0x93a07ebe, 0xb938ca15, 0x97b03cff, 0x3dc2c0f8, 0x8d1ab2ec, 0x64380e51, - 0x68cc7bfb, 0xd90f2788, 0x12490181, 0x5de5ffd4, 0xdd7ef86a, 0x76a2e214, 0xb9a40368, 0x925d958f, - 0x4b39fffa, 0xba39aee9, 0xa4ffd30b, 0xfaf7933b, 0x6d498623, 0x193cbcfa, 0x27627545, 0x825cf47a, - 0x61bd8ba0, 0xd11e42d1, 0xcead04f4, 0x127ea392, 0x10428db7, 0x8272a972, 0x9270c4a8, 0x127de50b, - 0x285ba1c8, 0x3c62f44f, 0x35c0eaa5, 0xe805d231, 0x428929fb, 0xb4fcdf82, 0x4fb66a53, 0x0e7dc15b, - 0x1f081fab, 0x108618ae, 0xfcfd086d, 0xf9ff2889, 0x694bcc11, 0x236a5cae, 0x12deca4d, 0x2c3f8cc5, - 0xd2d02dfe, 0xf8ef5896, 0xe4cf52da, 0x95155b67, 0x494a488c, 0xb9b6a80c, 0x5c8f82bc, 0x89d36b45, - 0x3a609437, 0xec00c9a9, 0x44715253, 0x0a874b49, 0xd773bc40, 0x7c34671c, 0x02717ef6, 0x4feb5536, - 0xa2d02fff, 0xd2bf60c4, 0xd43f03c0, 0x50b4ef6d, 0x07478cd1, 0x006e1888, 0xa2e53f55, 0xb9e6d4bc, - 0xa2048016, 0x97573833, 0xd7207d67, 0xde0f8f3d, 0x72f87b33, 0xabcc4f33, 0x7688c55d, 0x7b00a6b0, - 0x947b0001, 0x570075d2, 0xf9bb88f8, 0x8942019e, 0x4264a5ff, 0x856302e0, 0x72dbd92b, 0xee971b69, - 0x6ea22fde, 0x5f08ae2b, 0xaf7a616d, 0xe5c98767, 0xcf1febd2, 0x61efc8c2, 0xf1ac2571, 0xcc8239c2, - 0x67214cb8, 0xb1e583d1, 0xb7dc3e62, 0x7f10bdce, 0xf90a5c38, 0x0ff0443d, 0x606e6dc6, 0x60543a49, - 0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d, - 0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a, - 0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783, - }, - { - 0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1, - 0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf, - 0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15, - 0xee4d111a, 0x0fca5167, 0x71ff904c, 0x2d195ffe, 0x1a05645f, 0x0c13fefe, 0x081b08ca, 0x05170121, - 0x80530100, 0xe83e5efe, 0xac9af4f8, 0x7fe72701, 0xd2b8ee5f, 0x06df4261, 0xbb9e9b8a, 0x7293ea25, - 0xce84ffdf, 0xf5718801, 0x3dd64b04, 0xa26f263b, 0x7ed48400, 0x547eebe6, 0x446d4ca0, 0x6cf3d6f5, - 0x2649abdf, 0xaea0c7f5, 0x36338cc1, 0x503f7e93, 0xd3772061, 0x11b638e1, 0x72500e03, 0xf80eb2bb, - 0xabe0502e, 0xec8d77de, 0x57971e81, 0xe14f6746, 0xc9335400, 0x6920318f, 0x081dbb99, 0xffc304a5, - 0x4d351805, 0x7f3d5ce3, 0xa6c866c6, 0x5d5bcca9, 0xdaec6fea, 0x9f926f91, 0x9f46222f, 0x3991467d, - 0xa5bf6d8e, 0x1143c44f, 0x43958302, 0xd0214eeb, 0x022083b8, 0x3fb6180c, 0x18f8931e, 0x281658e6, - 0x26486e3e, 0x8bd78a70, 0x7477e4c1, 0xb506e07c, 0xf32d0a25, 0x79098b02, 0xe4eabb81, 0x28123b23, - 0x69dead38, 0x1574ca16, 0xdf871b62, 0x211c40b7, 0xa51a9ef9, 0x0014377b, 0x041e8ac8, 0x09114003, - 0xbd59e4d2, 0xe3d156d5, 0x4fe876d5, 0x2f91a340, 0x557be8de, 0x00eae4a7, 0x0ce5c2ec, 0x4db4bba6, - 0xe756bdff, 0xdd3369ac, 0xec17b035, 0x06572327, 0x99afc8b0, 0x56c8c391, 0x6b65811c, 0x5e146119, - 0x6e85cb75, 0xbe07c002, 0xc2325577, 0x893ff4ec, 0x5bbfc92d, 0xd0ec3b25, 0xb7801ab7, 0x8d6d3b24, - 0x20c763ef, 0xc366a5fc, 0x9c382880, 0x0ace3205, 0xaac9548a, 0xeca1d7c7, 0x041afa32, 0x1d16625a, - 0x6701902c, 0x9b757a54, 0x31d477f7, 0x9126b031, 0x36cc6fdb, 0xc70b8b46, 0xd9e66a48, 0x56e55a79, - 0x026a4ceb, 0x52437eff, 0x2f8f76b4, 0x0df980a5, 0x8674cde3, 0xedda04eb, 0x17a9be04, 0x2c18f4df, - 0xb7747f9d, 0xab2af7b4, 0xefc34d20, 0x2e096b7c, 0x1741a254, 0xe5b6a035, 0x213d42f6, 0x2c1c7c26, - 0x61c2f50f, 0x6552daf9, 0xd2c231f8, 0x25130f69, 0xd8167fa2, 0x0418f2c8, 0x001a96a6, 0x0d1526ab, - 0x63315c21, 0x5e0a72ec, 0x49bafefd, 0x187908d9, 0x8d0dbd86, 0x311170a7, 0x3e9b640c, 0xcc3e10d7, - 0xd5cad3b6, 0x0caec388, 0xf73001e1, 0x6c728aff, 0x71eae2a1, 0x1f9af36e, 0xcfcbd12f, 0xc1de8417, - 0xac07be6b, 0xcb44a1d8, 0x8b9b0f56, 0x013988c3, 0xb1c52fca, 0xb4be31cd, 0xd8782806, 0x12a3a4e2, - 0x6f7de532, 0x58fd7eb6, 0xd01ee900, 0x24adffc2, 0xf4990fc5, 0x9711aac5, 0x001d7b95, 0x82e5e7d2, - 0x109873f6, 0x00613096, 0xc32d9521, 0xada121ff, 0x29908415, 0x7fbb977f, 0xaf9eb3db, 0x29c9ed2a, - 0x5ce2a465, 0xa730f32c, 0xd0aa3fe8, 0x8a5cc091, 0xd49e2ce7, 0x0ce454a9, 0xd60acd86, 0x015f1919, - 0x77079103, 0xdea03af6, 0x78a8565e, 0xdee356df, 0x21f05cbe, 0x8b75e387, 0xb3c50651, 0xb8a5c3ef, - 0xd8eeb6d2, 0xe523be77, 0xc2154529, 0x2f69efdf, 0xafe67afb, 0xf470c4b2, 0xf3e0eb5b, 0xd6cc9876, - 0x39e4460c, 0x1fda8538, 0x1987832f, 0xca007367, 0xa99144f8, 0x296b299e, 0x492fc295, 0x9266beab, - 0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04, - 0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282, - 0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2, - }, - { - 0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f, - 0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a, - 0xe6a2e77f, 0xf0c720cd, 0xc4494816, 0xccf5c180, 0x38851640, 0x15b0a848, 0xe68b18cb, 0x4caadeff, - 0x5f480a01, 0x0412b2aa, 0x259814fc, 0x41d0efe2, 0x4e40b48d, 0x248eb6fb, 0x8dba1cfe, 0x41a99b02, - 0x1a550a04, 0xba8f65cb, 0x7251f4e7, 0x95a51725, 0xc106ecd7, 0x97a5980a, 0xc539b9aa, 0x4d79fe6a, - 0xf2f3f763, 0x68af8040, 0xed0c9e56, 0x11b4958b, 0xe1eb5a88, 0x8709e6b0, 0xd7e07156, 0x4e29fea7, - 0x6366e52d, 0x02d1c000, 0xc4ac8e05, 0x9377f571, 0x0c05372a, 0x578535f2, 0x2261be02, 0xd642a0c9, - 0xdf13a280, 0x74b55bd2, 0x682199c0, 0xd421e5ec, 0x53fb3ce8, 0xc8adedb3, 0x28a87fc9, 0x3d959981, - 0x5c1ff900, 0xfe38d399, 0x0c4eff0b, 0x062407ea, 0xaa2f4fb1, 0x4fb96976, 0x90c79505, 0xb0a8a774, - 0xef55a1ff, 0xe59ca2c2, 0xa6b62d27, 0xe66a4263, 0xdf65001f, 0x0ec50966, 0xdfdd55bc, 0x29de0655, - 0x911e739a, 0x17af8975, 0x32c7911c, 0x89f89468, 0x0d01e980, 0x524755f4, 0x03b63cc9, 0x0cc844b2, - 0xbcf3f0aa, 0x87ac36e9, 0xe53a7426, 0x01b3d82b, 0x1a9e7449, 0x64ee2d7e, 0xcddbb1da, 0x01c94910, - 0xb868bf80, 0x0d26f3fd, 0x9342ede7, 0x04a5c284, 0x636737b6, 0x50f5b616, 0xf24766e3, 0x8eca36c1, - 0x136e05db, 0xfef18391, 0xfb887a37, 0xd6e7f7d4, 0xc7fb7dc9, 0x3063fcdf, 0xb6f589de, 0xec2941da, - 0x26e46695, 0xb7566419, 0xf654efc5, 0xd08d58b7, 0x48925401, 0xc1bacb7f, 0xe5ff550f, 0xb6083049, - 0x5bb5d0e8, 0x87d72e5a, 0xab6a6ee1, 0x223a66ce, 0xc62bf3cd, 0x9e0885f9, 0x68cb3e47, 0x086c010f, - 0xa21de820, 0xd18b69de, 0xf3f65777, 0xfa02c3f6, 0x407edac3, 0xcbb3d550, 0x1793084d, 0xb0d70eba, - 0x0ab378d5, 0xd951fb0c, 0xded7da56, 0x4124bbe4, 0x94ca0b56, 0x0f5755d1, 0xe0e1e56e, 0x6184b5be, - 0x580a249f, 0x94f74bc0, 0xe327888e, 0x9f7b5561, 0xc3dc0280, 0x05687715, 0x646c6bd7, 0x44904db3, - 0x66b4f0a3, 0xc0f1648a, 0x697ed5af, 0x49e92ff6, 0x309e374f, 0x2cb6356a, 0x85808573, 0x4991f840, - 0x76f0ae02, 0x083be84d, 0x28421c9a, 0x44489406, 0x736e4cb8, 0xc1092910, 0x8bc95fc6, 0x7d869cf4, - 0x134f616f, 0x2e77118d, 0xb31b2be1, 0xaa90b472, 0x3ca5d717, 0x7d161bba, 0x9cad9010, 0xaf462ba2, - 0x9fe459d2, 0x45d34559, 0xd9f2da13, 0xdbc65487, 0xf3e4f94e, 0x176d486f, 0x097c13ea, 0x631da5c7, - 0x445f7382, 0x175683f4, 0xcdc66a97, 0x70be0288, 0xb3cdcf72, 0x6e5dd2f3, 0x20936079, 0x459b80a5, - 0xbe60e2db, 0xa9c23101, 0xeba5315c, 0x224e42f2, 0x1c5c1572, 0xf6721b2c, 0x1ad2fff3, 0x8c25404e, - 0x324ed72f, 0x4067b7fd, 0x0523138e, 0x5ca3bc78, 0xdc0fd66e, 0x75922283, 0x784d6b17, 0x58ebb16e, - 0x44094f85, 0x3f481d87, 0xfcfeae7b, 0x77b5ff76, 0x8c2302bf, 0xaaf47556, 0x5f46b02a, 0x2b092801, - 0x3d38f5f7, 0x0ca81f36, 0x52af4a8a, 0x66d5e7c0, 0xdf3b0874, 0x95055110, 0x1b5ad7a8, 0xf61ed5ad, - 0x6cf6e479, 0x20758184, 0xd0cefa65, 0x88f7be58, 0x4a046826, 0x0ff6f8f3, 0xa09c7f70, 0x5346aba0, - 0x5ce96c28, 0xe176eda3, 0x6bac307f, 0x376829d2, 0x85360fa9, 0x17e3fe2a, 0x24b79767, 0xf5a96b20, - 0xd6cd2595, 0x68ff1ebf, 0x7555442c, 0xf19f06be, 0xf9e0659a, 0xeeb9491d, 0x34010718, 0xbb30cab8, - 0xe822fe15, 0x88570983, 0x750e6249, 0xda627e55, 0x5e76ffa8, 0xb1534546, 0x6d47de08, 0xefe9e7d4, - }, - { - 0xf6fa8f9d, 0x2cac6ce1, 0x4ca34867, 0xe2337f7c, 0x95db08e7, 0x016843b4, 0xeced5cbc, 0x325553ac, - 0xbf9f0960, 0xdfa1e2ed, 0x83f0579d, 0x63ed86b9, 0x1ab6a6b8, 0xde5ebe39, 0xf38ff732, 0x8989b138, - 0x33f14961, 0xc01937bd, 0xf506c6da, 0xe4625e7e, 0xa308ea99, 0x4e23e33c, 0x79cbd7cc, 0x48a14367, - 0xa3149619, 0xfec94bd5, 0xa114174a, 0xeaa01866, 0xa084db2d, 0x09a8486f, 0xa888614a, 0x2900af98, - 0x01665991, 0xe1992863, 0xc8f30c60, 0x2e78ef3c, 0xd0d51932, 0xcf0fec14, 0xf7ca07d2, 0xd0a82072, - 0xfd41197e, 0x9305a6b0, 0xe86be3da, 0x74bed3cd, 0x372da53c, 0x4c7f4448, 0xdab5d440, 0x6dba0ec3, - 0x083919a7, 0x9fbaeed9, 0x49dbcfb0, 0x4e670c53, 0x5c3d9c01, 0x64bdb941, 0x2c0e636a, 0xba7dd9cd, - 0xea6f7388, 0xe70bc762, 0x35f29adb, 0x5c4cdd8d, 0xf0d48d8c, 0xb88153e2, 0x08a19866, 0x1ae2eac8, - 0x284caf89, 0xaa928223, 0x9334be53, 0x3b3a21bf, 0x16434be3, 0x9aea3906, 0xefe8c36e, 0xf890cdd9, - 0x80226dae, 0xc340a4a3, 0xdf7e9c09, 0xa694a807, 0x5b7c5ecc, 0x221db3a6, 0x9a69a02f, 0x68818a54, - 0xceb2296f, 0x53c0843a, 0xfe893655, 0x25bfe68a, 0xb4628abc, 0xcf222ebf, 0x25ac6f48, 0xa9a99387, - 0x53bddb65, 0xe76ffbe7, 0xe967fd78, 0x0ba93563, 0x8e342bc1, 0xe8a11be9, 0x4980740d, 0xc8087dfc, - 0x8de4bf99, 0xa11101a0, 0x7fd37975, 0xda5a26c0, 0xe81f994f, 0x9528cd89, 0xfd339fed, 0xb87834bf, - 0x5f04456d, 0x22258698, 0xc9c4c83b, 0x2dc156be, 0x4f628daa, 0x57f55ec5, 0xe2220abe, 0xd2916ebf, - 0x4ec75b95, 0x24f2c3c0, 0x42d15d99, 0xcd0d7fa0, 0x7b6e27ff, 0xa8dc8af0, 0x7345c106, 0xf41e232f, - 0x35162386, 0xe6ea8926, 0x3333b094, 0x157ec6f2, 0x372b74af, 0x692573e4, 0xe9a9d848, 0xf3160289, - 0x3a62ef1d, 0xa787e238, 0xf3a5f676, 0x74364853, 0x20951063, 0x4576698d, 0xb6fad407, 0x592af950, - 0x36f73523, 0x4cfb6e87, 0x7da4cec0, 0x6c152daa, 0xcb0396a8, 0xc50dfe5d, 0xfcd707ab, 0x0921c42f, - 0x89dff0bb, 0x5fe2be78, 0x448f4f33, 0x754613c9, 0x2b05d08d, 0x48b9d585, 0xdc049441, 0xc8098f9b, - 0x7dede786, 0xc39a3373, 0x42410005, 0x6a091751, 0x0ef3c8a6, 0x890072d6, 0x28207682, 0xa9a9f7be, - 0xbf32679d, 0xd45b5b75, 0xb353fd00, 0xcbb0e358, 0x830f220a, 0x1f8fb214, 0xd372cf08, 0xcc3c4a13, - 0x8cf63166, 0x061c87be, 0x88c98f88, 0x6062e397, 0x47cf8e7a, 0xb6c85283, 0x3cc2acfb, 0x3fc06976, - 0x4e8f0252, 0x64d8314d, 0xda3870e3, 0x1e665459, 0xc10908f0, 0x513021a5, 0x6c5b68b7, 0x822f8aa0, - 0x3007cd3e, 0x74719eef, 0xdc872681, 0x073340d4, 0x7e432fd9, 0x0c5ec241, 0x8809286c, 0xf592d891, - 0x08a930f6, 0x957ef305, 0xb7fbffbd, 0xc266e96f, 0x6fe4ac98, 0xb173ecc0, 0xbc60b42a, 0x953498da, - 0xfba1ae12, 0x2d4bd736, 0x0f25faab, 0xa4f3fceb, 0xe2969123, 0x257f0c3d, 0x9348af49, 0x361400bc, - 0xe8816f4a, 0x3814f200, 0xa3f94043, 0x9c7a54c2, 0xbc704f57, 0xda41e7f9, 0xc25ad33a, 0x54f4a084, - 0xb17f5505, 0x59357cbe, 0xedbd15c8, 0x7f97c5ab, 0xba5ac7b5, 0xb6f6deaf, 0x3a479c3a, 0x5302da25, - 0x653d7e6a, 0x54268d49, 0x51a477ea, 0x5017d55b, 0xd7d25d88, 0x44136c76, 0x0404a8c8, 0xb8e5a121, - 0xb81a928a, 0x60ed5869, 0x97c55b96, 0xeaec991b, 0x29935913, 0x01fdb7f1, 0x088e8dfa, 0x9ab6f6f5, - 0x3b4cbf9f, 0x4a5de3ab, 0xe6051d35, 0xa0e1d855, 0xd36b4cf1, 0xf544edeb, 0xb0e93524, 0xbebb8fbd, - 0xa2d762cf, 0x49c92f54, 0x38b5f331, 0x7128a454, 0x48392905, 0xa65b1db8, 0x851c97bd, 0xd675cf2f, - }, - { - 0x85e04019, 0x332bf567, 0x662dbfff, 0xcfc65693, 0x2a8d7f6f, 0xab9bc912, 0xde6008a1, 0x2028da1f, - 0x0227bce7, 0x4d642916, 0x18fac300, 0x50f18b82, 0x2cb2cb11, 0xb232e75c, 0x4b3695f2, 0xb28707de, - 0xa05fbcf6, 0xcd4181e9, 0xe150210c, 0xe24ef1bd, 0xb168c381, 0xfde4e789, 0x5c79b0d8, 0x1e8bfd43, - 0x4d495001, 0x38be4341, 0x913cee1d, 0x92a79c3f, 0x089766be, 0xbaeeadf4, 0x1286becf, 0xb6eacb19, - 0x2660c200, 0x7565bde4, 0x64241f7a, 0x8248dca9, 0xc3b3ad66, 0x28136086, 0x0bd8dfa8, 0x356d1cf2, - 0x107789be, 0xb3b2e9ce, 0x0502aa8f, 0x0bc0351e, 0x166bf52a, 0xeb12ff82, 0xe3486911, 0xd34d7516, - 0x4e7b3aff, 0x5f43671b, 0x9cf6e037, 0x4981ac83, 0x334266ce, 0x8c9341b7, 0xd0d854c0, 0xcb3a6c88, - 0x47bc2829, 0x4725ba37, 0xa66ad22b, 0x7ad61f1e, 0x0c5cbafa, 0x4437f107, 0xb6e79962, 0x42d2d816, - 0x0a961288, 0xe1a5c06e, 0x13749e67, 0x72fc081a, 0xb1d139f7, 0xf9583745, 0xcf19df58, 0xbec3f756, - 0xc06eba30, 0x07211b24, 0x45c28829, 0xc95e317f, 0xbc8ec511, 0x38bc46e9, 0xc6e6fa14, 0xbae8584a, - 0xad4ebc46, 0x468f508b, 0x7829435f, 0xf124183b, 0x821dba9f, 0xaff60ff4, 0xea2c4e6d, 0x16e39264, - 0x92544a8b, 0x009b4fc3, 0xaba68ced, 0x9ac96f78, 0x06a5b79a, 0xb2856e6e, 0x1aec3ca9, 0xbe838688, - 0x0e0804e9, 0x55f1be56, 0xe7e5363b, 0xb3a1f25d, 0xf7debb85, 0x61fe033c, 0x16746233, 0x3c034c28, - 0xda6d0c74, 0x79aac56c, 0x3ce4e1ad, 0x51f0c802, 0x98f8f35a, 0x1626a49f, 0xeed82b29, 0x1d382fe3, - 0x0c4fb99a, 0xbb325778, 0x3ec6d97b, 0x6e77a6a9, 0xcb658b5c, 0xd45230c7, 0x2bd1408b, 0x60c03eb7, - 0xb9068d78, 0xa33754f4, 0xf430c87d, 0xc8a71302, 0xb96d8c32, 0xebd4e7be, 0xbe8b9d2d, 0x7979fb06, - 0xe7225308, 0x8b75cf77, 0x11ef8da4, 0xe083c858, 0x8d6b786f, 0x5a6317a6, 0xfa5cf7a0, 0x5dda0033, - 0xf28ebfb0, 0xf5b9c310, 0xa0eac280, 0x08b9767a, 0xa3d9d2b0, 0x79d34217, 0x021a718d, 0x9ac6336a, - 0x2711fd60, 0x438050e3, 0x069908a8, 0x3d7fedc4, 0x826d2bef, 0x4eeb8476, 0x488dcf25, 0x36c9d566, - 0x28e74e41, 0xc2610aca, 0x3d49a9cf, 0xbae3b9df, 0xb65f8de6, 0x92aeaf64, 0x3ac7d5e6, 0x9ea80509, - 0xf22b017d, 0xa4173f70, 0xdd1e16c3, 0x15e0d7f9, 0x50b1b887, 0x2b9f4fd5, 0x625aba82, 0x6a017962, - 0x2ec01b9c, 0x15488aa9, 0xd716e740, 0x40055a2c, 0x93d29a22, 0xe32dbf9a, 0x058745b9, 0x3453dc1e, - 0xd699296e, 0x496cff6f, 0x1c9f4986, 0xdfe2ed07, 0xb87242d1, 0x19de7eae, 0x053e561a, 0x15ad6f8c, - 0x66626c1c, 0x7154c24c, 0xea082b2a, 0x93eb2939, 0x17dcb0f0, 0x58d4f2ae, 0x9ea294fb, 0x52cf564c, - 0x9883fe66, 0x2ec40581, 0x763953c3, 0x01d6692e, 0xd3a0c108, 0xa1e7160e, 0xe4f2dfa6, 0x693ed285, - 0x74904698, 0x4c2b0edd, 0x4f757656, 0x5d393378, 0xa132234f, 0x3d321c5d, 0xc3f5e194, 0x4b269301, - 0xc79f022f, 0x3c997e7e, 0x5e4f9504, 0x3ffafbbd, 0x76f7ad0e, 0x296693f4, 0x3d1fce6f, 0xc61e45be, - 0xd3b5ab34, 0xf72bf9b7, 0x1b0434c0, 0x4e72b567, 0x5592a33d, 0xb5229301, 0xcfd2a87f, 0x60aeb767, - 0x1814386b, 0x30bcc33d, 0x38a0c07d, 0xfd1606f2, 0xc363519b, 0x589dd390, 0x5479f8e6, 0x1cb8d647, - 0x97fd61a9, 0xea7759f4, 0x2d57539d, 0x569a58cf, 0xe84e63ad, 0x462e1b78, 0x6580f87e, 0xf3817914, - 0x91da55f4, 0x40a230f3, 0xd1988f35, 0xb6e318d2, 0x3ffa50bc, 0x3d40f021, 0xc3c0bdae, 0x4958c24c, - 0x518f36b2, 0x84b1d370, 0x0fedce83, 0x878ddada, 0xf2a279c7, 0x94e01be8, 0x90716f4b, 0x954b8aa3, - }, - { - 0xe216300d, 0xbbddfffc, 0xa7ebdabd, 0x35648095, 0x7789f8b7, 0xe6c1121b, 0x0e241600, 0x052ce8b5, - 0x11a9cfb0, 0xe5952f11, 0xece7990a, 0x9386d174, 0x2a42931c, 0x76e38111, 0xb12def3a, 0x37ddddfc, - 0xde9adeb1, 0x0a0cc32c, 0xbe197029, 0x84a00940, 0xbb243a0f, 0xb4d137cf, 0xb44e79f0, 0x049eedfd, - 0x0b15a15d, 0x480d3168, 0x8bbbde5a, 0x669ded42, 0xc7ece831, 0x3f8f95e7, 0x72df191b, 0x7580330d, - 0x94074251, 0x5c7dcdfa, 0xabbe6d63, 0xaa402164, 0xb301d40a, 0x02e7d1ca, 0x53571dae, 0x7a3182a2, - 0x12a8ddec, 0xfdaa335d, 0x176f43e8, 0x71fb46d4, 0x38129022, 0xce949ad4, 0xb84769ad, 0x965bd862, - 0x82f3d055, 0x66fb9767, 0x15b80b4e, 0x1d5b47a0, 0x4cfde06f, 0xc28ec4b8, 0x57e8726e, 0x647a78fc, - 0x99865d44, 0x608bd593, 0x6c200e03, 0x39dc5ff6, 0x5d0b00a3, 0xae63aff2, 0x7e8bd632, 0x70108c0c, - 0xbbd35049, 0x2998df04, 0x980cf42a, 0x9b6df491, 0x9e7edd53, 0x06918548, 0x58cb7e07, 0x3b74ef2e, - 0x522fffb1, 0xd24708cc, 0x1c7e27cd, 0xa4eb215b, 0x3cf1d2e2, 0x19b47a38, 0x424f7618, 0x35856039, - 0x9d17dee7, 0x27eb35e6, 0xc9aff67b, 0x36baf5b8, 0x09c467cd, 0xc18910b1, 0xe11dbf7b, 0x06cd1af8, - 0x7170c608, 0x2d5e3354, 0xd4de495a, 0x64c6d006, 0xbcc0c62c, 0x3dd00db3, 0x708f8f34, 0x77d51b42, - 0x264f620f, 0x24b8d2bf, 0x15c1b79e, 0x46a52564, 0xf8d7e54e, 0x3e378160, 0x7895cda5, 0x859c15a5, - 0xe6459788, 0xc37bc75f, 0xdb07ba0c, 0x0676a3ab, 0x7f229b1e, 0x31842e7b, 0x24259fd7, 0xf8bef472, - 0x835ffcb8, 0x6df4c1f2, 0x96f5b195, 0xfd0af0fc, 0xb0fe134c, 0xe2506d3d, 0x4f9b12ea, 0xf215f225, - 0xa223736f, 0x9fb4c428, 0x25d04979, 0x34c713f8, 0xc4618187, 0xea7a6e98, 0x7cd16efc, 0x1436876c, - 0xf1544107, 0xbedeee14, 0x56e9af27, 0xa04aa441, 0x3cf7c899, 0x92ecbae6, 0xdd67016d, 0x151682eb, - 0xa842eedf, 0xfdba60b4, 0xf1907b75, 0x20e3030f, 0x24d8c29e, 0xe139673b, 0xefa63fb8, 0x71873054, - 0xb6f2cf3b, 0x9f326442, 0xcb15a4cc, 0xb01a4504, 0xf1e47d8d, 0x844a1be5, 0xbae7dfdc, 0x42cbda70, - 0xcd7dae0a, 0x57e85b7a, 0xd53f5af6, 0x20cf4d8c, 0xcea4d428, 0x79d130a4, 0x3486ebfb, 0x33d3cddc, - 0x77853b53, 0x37effcb5, 0xc5068778, 0xe580b3e6, 0x4e68b8f4, 0xc5c8b37e, 0x0d809ea2, 0x398feb7c, - 0x132a4f94, 0x43b7950e, 0x2fee7d1c, 0x223613bd, 0xdd06caa2, 0x37df932b, 0xc4248289, 0xacf3ebc3, - 0x5715f6b7, 0xef3478dd, 0xf267616f, 0xc148cbe4, 0x9052815e, 0x5e410fab, 0xb48a2465, 0x2eda7fa4, - 0xe87b40e4, 0xe98ea084, 0x5889e9e1, 0xefd390fc, 0xdd07d35b, 0xdb485694, 0x38d7e5b2, 0x57720101, - 0x730edebc, 0x5b643113, 0x94917e4f, 0x503c2fba, 0x646f1282, 0x7523d24a, 0xe0779695, 0xf9c17a8f, - 0x7a5b2121, 0xd187b896, 0x29263a4d, 0xba510cdf, 0x81f47c9f, 0xad1163ed, 0xea7b5965, 0x1a00726e, - 0x11403092, 0x00da6d77, 0x4a0cdd61, 0xad1f4603, 0x605bdfb0, 0x9eedc364, 0x22ebe6a8, 0xcee7d28a, - 0xa0e736a0, 0x5564a6b9, 0x10853209, 0xc7eb8f37, 0x2de705ca, 0x8951570f, 0xdf09822b, 0xbd691a6c, - 0xaa12e4f2, 0x87451c0f, 0xe0f6a27a, 0x3ada4819, 0x4cf1764f, 0x0d771c2b, 0x67cdb156, 0x350d8384, - 0x5938fa0f, 0x42399ef3, 0x36997b07, 0x0e84093d, 0x4aa93e61, 0x8360d87b, 0x1fa98b0c, 0x1149382c, - 0xe97625a5, 0x0614d1b7, 0x0e25244b, 0x0c768347, 0x589e8d82, 0x0d2059d1, 0xa466bb1e, 0xf8da0a82, - 0x04f19130, 0xba6e4ec0, 0x99265164, 0x1ee7230d, 0x50b2ad80, 0xeaee6801, 0x8db2a283, 0xea8bf59e, - }, -} diff --git a/vendor/golang.org/x/crypto/codereview.cfg b/vendor/golang.org/x/crypto/codereview.cfg deleted file mode 100644 index 3f8b14b64e83..000000000000 --- a/vendor/golang.org/x/crypto/codereview.cfg +++ /dev/null @@ -1 +0,0 @@ -issuerepo: golang/go diff --git a/vendor/golang.org/x/crypto/curve25519/const_amd64.h b/vendor/golang.org/x/crypto/curve25519/const_amd64.h deleted file mode 100644 index b3f74162f609..000000000000 --- a/vendor/golang.org/x/crypto/curve25519/const_amd64.h +++ /dev/null @@ -1,8 +0,0 @@ -// 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. - -// This code was translated into a form compatible with 6a from the public -// 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 deleted file mode 100644 index ee7b4bd5f8e3..000000000000 --- a/vendor/golang.org/x/crypto/curve25519/const_amd64.s +++ /dev/null @@ -1,20 +0,0 @@ -// 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. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -// These constants cannot be encoded in non-MOVQ immediates. -// We access them directly from memory instead. - -DATA ·_121666_213(SB)/8, $996687872 -GLOBL ·_121666_213(SB), 8, $8 - -DATA ·_2P0(SB)/8, $0xFFFFFFFFFFFDA -GLOBL ·_2P0(SB), 8, $8 - -DATA ·_2P1234(SB)/8, $0xFFFFFFFFFFFFE -GLOBL ·_2P1234(SB), 8, $8 diff --git a/vendor/golang.org/x/crypto/curve25519/cswap_amd64.s b/vendor/golang.org/x/crypto/curve25519/cswap_amd64.s deleted file mode 100644 index cd793a5b5f2e..000000000000 --- a/vendor/golang.org/x/crypto/curve25519/cswap_amd64.s +++ /dev/null @@ -1,65 +0,0 @@ -// 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 amd64,!gccgo,!appengine - -// func cswap(inout *[4][5]uint64, v uint64) -TEXT ·cswap(SB),7,$0 - MOVQ inout+0(FP),DI - MOVQ v+8(FP),SI - - SUBQ $1, SI - NOTQ SI - MOVQ SI, X15 - PSHUFD $0x44, X15, X15 - - MOVOU 0(DI), X0 - MOVOU 16(DI), X2 - MOVOU 32(DI), X4 - MOVOU 48(DI), X6 - MOVOU 64(DI), X8 - MOVOU 80(DI), X1 - MOVOU 96(DI), X3 - MOVOU 112(DI), X5 - MOVOU 128(DI), X7 - MOVOU 144(DI), X9 - - MOVO X1, X10 - MOVO X3, X11 - MOVO X5, X12 - MOVO X7, X13 - MOVO X9, X14 - - PXOR X0, X10 - PXOR X2, X11 - PXOR X4, X12 - PXOR X6, X13 - PXOR X8, X14 - PAND X15, X10 - PAND X15, X11 - PAND X15, X12 - PAND X15, X13 - PAND X15, X14 - PXOR X10, X0 - PXOR X10, X1 - PXOR X11, X2 - PXOR X11, X3 - PXOR X12, X4 - PXOR X12, X5 - PXOR X13, X6 - PXOR X13, X7 - PXOR X14, X8 - PXOR X14, X9 - - MOVOU X0, 0(DI) - MOVOU X2, 16(DI) - MOVOU X4, 32(DI) - MOVOU X6, 48(DI) - MOVOU X8, 64(DI) - MOVOU X1, 80(DI) - MOVOU X3, 96(DI) - MOVOU X5, 112(DI) - MOVOU X7, 128(DI) - MOVOU X9, 144(DI) - RET diff --git a/vendor/golang.org/x/crypto/curve25519/curve25519.go b/vendor/golang.org/x/crypto/curve25519/curve25519.go deleted file mode 100644 index cb8fbc57b97a..000000000000 --- a/vendor/golang.org/x/crypto/curve25519/curve25519.go +++ /dev/null @@ -1,834 +0,0 @@ -// Copyright 2013 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. - -// 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 - -package curve25519 - -import ( - "encoding/binary" -) - -// This code is a port of the public domain, "ref10" implementation of -// curve25519 from SUPERCOP 20130419 by D. J. Bernstein. - -// fieldElement represents an element of the field GF(2^255 - 19). An element -// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77 -// t[3]+2^102 t[4]+...+2^230 t[9]. Bounds on each t[i] vary depending on -// context. -type fieldElement [10]int32 - -func feZero(fe *fieldElement) { - for i := range fe { - fe[i] = 0 - } -} - -func feOne(fe *fieldElement) { - feZero(fe) - fe[0] = 1 -} - -func feAdd(dst, a, b *fieldElement) { - for i := range dst { - dst[i] = a[i] + b[i] - } -} - -func feSub(dst, a, b *fieldElement) { - for i := range dst { - dst[i] = a[i] - b[i] - } -} - -func feCopy(dst, src *fieldElement) { - for i := range dst { - dst[i] = src[i] - } -} - -// feCSwap replaces (f,g) with (g,f) if b == 1; replaces (f,g) with (f,g) if b == 0. -// -// Preconditions: b in {0,1}. -func feCSwap(f, g *fieldElement, b int32) { - b = -b - for i := range f { - t := b & (f[i] ^ g[i]) - f[i] ^= t - g[i] ^= t - } -} - -// load3 reads a 24-bit, little-endian value from in. -func load3(in []byte) int64 { - var r int64 - r = int64(in[0]) - r |= int64(in[1]) << 8 - r |= int64(in[2]) << 16 - return r -} - -// load4 reads a 32-bit, little-endian value from in. -func load4(in []byte) int64 { - return int64(binary.LittleEndian.Uint32(in)) -} - -func feFromBytes(dst *fieldElement, src *[32]byte) { - h0 := load4(src[:]) - h1 := load3(src[4:]) << 6 - h2 := load3(src[7:]) << 5 - h3 := load3(src[10:]) << 3 - h4 := load3(src[13:]) << 2 - h5 := load4(src[16:]) - h6 := load3(src[20:]) << 7 - h7 := load3(src[23:]) << 5 - h8 := load3(src[26:]) << 4 - h9 := load3(src[29:]) << 2 - - var carry [10]int64 - carry[9] = (h9 + 1<<24) >> 25 - h0 += carry[9] * 19 - h9 -= carry[9] << 25 - carry[1] = (h1 + 1<<24) >> 25 - h2 += carry[1] - h1 -= carry[1] << 25 - carry[3] = (h3 + 1<<24) >> 25 - h4 += carry[3] - h3 -= carry[3] << 25 - carry[5] = (h5 + 1<<24) >> 25 - h6 += carry[5] - h5 -= carry[5] << 25 - carry[7] = (h7 + 1<<24) >> 25 - h8 += carry[7] - h7 -= carry[7] << 25 - - carry[0] = (h0 + 1<<25) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - carry[2] = (h2 + 1<<25) >> 26 - h3 += carry[2] - h2 -= carry[2] << 26 - carry[4] = (h4 + 1<<25) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - carry[6] = (h6 + 1<<25) >> 26 - h7 += carry[6] - h6 -= carry[6] << 26 - carry[8] = (h8 + 1<<25) >> 26 - h9 += carry[8] - h8 -= carry[8] << 26 - - dst[0] = int32(h0) - dst[1] = int32(h1) - dst[2] = int32(h2) - dst[3] = int32(h3) - dst[4] = int32(h4) - dst[5] = int32(h5) - dst[6] = int32(h6) - dst[7] = int32(h7) - dst[8] = int32(h8) - dst[9] = int32(h9) -} - -// feToBytes marshals h to s. -// Preconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Write p=2^255-19; q=floor(h/p). -// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). -// -// Proof: -// Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. -// Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4. -// -// Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). -// Then 0> 25 - q = (h[0] + q) >> 26 - q = (h[1] + q) >> 25 - q = (h[2] + q) >> 26 - q = (h[3] + q) >> 25 - q = (h[4] + q) >> 26 - q = (h[5] + q) >> 25 - q = (h[6] + q) >> 26 - q = (h[7] + q) >> 25 - q = (h[8] + q) >> 26 - q = (h[9] + q) >> 25 - - // Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. - h[0] += 19 * q - // Goal: Output h-2^255 q, which is between 0 and 2^255-20. - - carry[0] = h[0] >> 26 - h[1] += carry[0] - h[0] -= carry[0] << 26 - carry[1] = h[1] >> 25 - h[2] += carry[1] - h[1] -= carry[1] << 25 - carry[2] = h[2] >> 26 - h[3] += carry[2] - h[2] -= carry[2] << 26 - carry[3] = h[3] >> 25 - h[4] += carry[3] - h[3] -= carry[3] << 25 - carry[4] = h[4] >> 26 - h[5] += carry[4] - h[4] -= carry[4] << 26 - carry[5] = h[5] >> 25 - h[6] += carry[5] - h[5] -= carry[5] << 25 - carry[6] = h[6] >> 26 - h[7] += carry[6] - h[6] -= carry[6] << 26 - carry[7] = h[7] >> 25 - h[8] += carry[7] - h[7] -= carry[7] << 25 - carry[8] = h[8] >> 26 - h[9] += carry[8] - h[8] -= carry[8] << 26 - carry[9] = h[9] >> 25 - h[9] -= carry[9] << 25 - // h10 = carry9 - - // Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. - // Have h[0]+...+2^230 h[9] between 0 and 2^255-1; - // evidently 2^255 h10-2^255 q = 0. - // Goal: Output h[0]+...+2^230 h[9]. - - s[0] = byte(h[0] >> 0) - s[1] = byte(h[0] >> 8) - s[2] = byte(h[0] >> 16) - s[3] = byte((h[0] >> 24) | (h[1] << 2)) - s[4] = byte(h[1] >> 6) - s[5] = byte(h[1] >> 14) - s[6] = byte((h[1] >> 22) | (h[2] << 3)) - s[7] = byte(h[2] >> 5) - s[8] = byte(h[2] >> 13) - s[9] = byte((h[2] >> 21) | (h[3] << 5)) - s[10] = byte(h[3] >> 3) - s[11] = byte(h[3] >> 11) - s[12] = byte((h[3] >> 19) | (h[4] << 6)) - s[13] = byte(h[4] >> 2) - s[14] = byte(h[4] >> 10) - s[15] = byte(h[4] >> 18) - s[16] = byte(h[5] >> 0) - s[17] = byte(h[5] >> 8) - s[18] = byte(h[5] >> 16) - s[19] = byte((h[5] >> 24) | (h[6] << 1)) - s[20] = byte(h[6] >> 7) - s[21] = byte(h[6] >> 15) - s[22] = byte((h[6] >> 23) | (h[7] << 3)) - s[23] = byte(h[7] >> 5) - s[24] = byte(h[7] >> 13) - s[25] = byte((h[7] >> 21) | (h[8] << 4)) - s[26] = byte(h[8] >> 4) - s[27] = byte(h[8] >> 12) - s[28] = byte((h[8] >> 20) | (h[9] << 6)) - s[29] = byte(h[9] >> 2) - s[30] = byte(h[9] >> 10) - s[31] = byte(h[9] >> 18) -} - -// feMul calculates h = f * g -// Can overlap h with f or g. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Notes on implementation strategy: -// -// Using schoolbook multiplication. -// Karatsuba would save a little in some cost models. -// -// Most multiplications by 2 and 19 are 32-bit precomputations; -// cheaper than 64-bit postcomputations. -// -// There is one remaining multiplication by 19 in the carry chain; -// one *19 precomputation can be merged into this, -// but the resulting data flow is considerably less clean. -// -// There are 12 carries below. -// 10 of them are 2-way parallelizable and vectorizable. -// Can get away with 11 carries, but then data flow is much deeper. -// -// With tighter constraints on inputs can squeeze carries into int32. -func feMul(h, f, g *fieldElement) { - f0 := f[0] - f1 := f[1] - f2 := f[2] - f3 := f[3] - f4 := f[4] - f5 := f[5] - f6 := f[6] - f7 := f[7] - f8 := f[8] - f9 := f[9] - g0 := g[0] - g1 := g[1] - g2 := g[2] - g3 := g[3] - g4 := g[4] - g5 := g[5] - g6 := g[6] - g7 := g[7] - g8 := g[8] - g9 := g[9] - g1_19 := 19 * g1 // 1.4*2^29 - g2_19 := 19 * g2 // 1.4*2^30; still ok - g3_19 := 19 * g3 - g4_19 := 19 * g4 - g5_19 := 19 * g5 - g6_19 := 19 * g6 - g7_19 := 19 * g7 - g8_19 := 19 * g8 - g9_19 := 19 * g9 - f1_2 := 2 * f1 - f3_2 := 2 * f3 - f5_2 := 2 * f5 - f7_2 := 2 * f7 - f9_2 := 2 * f9 - f0g0 := int64(f0) * int64(g0) - f0g1 := int64(f0) * int64(g1) - f0g2 := int64(f0) * int64(g2) - f0g3 := int64(f0) * int64(g3) - f0g4 := int64(f0) * int64(g4) - f0g5 := int64(f0) * int64(g5) - f0g6 := int64(f0) * int64(g6) - f0g7 := int64(f0) * int64(g7) - f0g8 := int64(f0) * int64(g8) - f0g9 := int64(f0) * int64(g9) - f1g0 := int64(f1) * int64(g0) - f1g1_2 := int64(f1_2) * int64(g1) - f1g2 := int64(f1) * int64(g2) - f1g3_2 := int64(f1_2) * int64(g3) - f1g4 := int64(f1) * int64(g4) - f1g5_2 := int64(f1_2) * int64(g5) - f1g6 := int64(f1) * int64(g6) - f1g7_2 := int64(f1_2) * int64(g7) - f1g8 := int64(f1) * int64(g8) - f1g9_38 := int64(f1_2) * int64(g9_19) - f2g0 := int64(f2) * int64(g0) - f2g1 := int64(f2) * int64(g1) - f2g2 := int64(f2) * int64(g2) - f2g3 := int64(f2) * int64(g3) - f2g4 := int64(f2) * int64(g4) - f2g5 := int64(f2) * int64(g5) - f2g6 := int64(f2) * int64(g6) - f2g7 := int64(f2) * int64(g7) - f2g8_19 := int64(f2) * int64(g8_19) - f2g9_19 := int64(f2) * int64(g9_19) - f3g0 := int64(f3) * int64(g0) - f3g1_2 := int64(f3_2) * int64(g1) - f3g2 := int64(f3) * int64(g2) - f3g3_2 := int64(f3_2) * int64(g3) - f3g4 := int64(f3) * int64(g4) - f3g5_2 := int64(f3_2) * int64(g5) - f3g6 := int64(f3) * int64(g6) - f3g7_38 := int64(f3_2) * int64(g7_19) - f3g8_19 := int64(f3) * int64(g8_19) - f3g9_38 := int64(f3_2) * int64(g9_19) - f4g0 := int64(f4) * int64(g0) - f4g1 := int64(f4) * int64(g1) - f4g2 := int64(f4) * int64(g2) - f4g3 := int64(f4) * int64(g3) - f4g4 := int64(f4) * int64(g4) - f4g5 := int64(f4) * int64(g5) - f4g6_19 := int64(f4) * int64(g6_19) - f4g7_19 := int64(f4) * int64(g7_19) - f4g8_19 := int64(f4) * int64(g8_19) - f4g9_19 := int64(f4) * int64(g9_19) - f5g0 := int64(f5) * int64(g0) - f5g1_2 := int64(f5_2) * int64(g1) - f5g2 := int64(f5) * int64(g2) - f5g3_2 := int64(f5_2) * int64(g3) - f5g4 := int64(f5) * int64(g4) - f5g5_38 := int64(f5_2) * int64(g5_19) - f5g6_19 := int64(f5) * int64(g6_19) - f5g7_38 := int64(f5_2) * int64(g7_19) - f5g8_19 := int64(f5) * int64(g8_19) - f5g9_38 := int64(f5_2) * int64(g9_19) - f6g0 := int64(f6) * int64(g0) - f6g1 := int64(f6) * int64(g1) - f6g2 := int64(f6) * int64(g2) - f6g3 := int64(f6) * int64(g3) - f6g4_19 := int64(f6) * int64(g4_19) - f6g5_19 := int64(f6) * int64(g5_19) - f6g6_19 := int64(f6) * int64(g6_19) - f6g7_19 := int64(f6) * int64(g7_19) - f6g8_19 := int64(f6) * int64(g8_19) - f6g9_19 := int64(f6) * int64(g9_19) - f7g0 := int64(f7) * int64(g0) - f7g1_2 := int64(f7_2) * int64(g1) - f7g2 := int64(f7) * int64(g2) - f7g3_38 := int64(f7_2) * int64(g3_19) - f7g4_19 := int64(f7) * int64(g4_19) - f7g5_38 := int64(f7_2) * int64(g5_19) - f7g6_19 := int64(f7) * int64(g6_19) - f7g7_38 := int64(f7_2) * int64(g7_19) - f7g8_19 := int64(f7) * int64(g8_19) - f7g9_38 := int64(f7_2) * int64(g9_19) - f8g0 := int64(f8) * int64(g0) - f8g1 := int64(f8) * int64(g1) - f8g2_19 := int64(f8) * int64(g2_19) - f8g3_19 := int64(f8) * int64(g3_19) - f8g4_19 := int64(f8) * int64(g4_19) - f8g5_19 := int64(f8) * int64(g5_19) - f8g6_19 := int64(f8) * int64(g6_19) - f8g7_19 := int64(f8) * int64(g7_19) - f8g8_19 := int64(f8) * int64(g8_19) - f8g9_19 := int64(f8) * int64(g9_19) - f9g0 := int64(f9) * int64(g0) - f9g1_38 := int64(f9_2) * int64(g1_19) - f9g2_19 := int64(f9) * int64(g2_19) - f9g3_38 := int64(f9_2) * int64(g3_19) - f9g4_19 := int64(f9) * int64(g4_19) - f9g5_38 := int64(f9_2) * int64(g5_19) - f9g6_19 := int64(f9) * int64(g6_19) - f9g7_38 := int64(f9_2) * int64(g7_19) - f9g8_19 := int64(f9) * int64(g8_19) - f9g9_38 := int64(f9_2) * int64(g9_19) - h0 := f0g0 + f1g9_38 + f2g8_19 + f3g7_38 + f4g6_19 + f5g5_38 + f6g4_19 + f7g3_38 + f8g2_19 + f9g1_38 - h1 := f0g1 + f1g0 + f2g9_19 + f3g8_19 + f4g7_19 + f5g6_19 + f6g5_19 + f7g4_19 + f8g3_19 + f9g2_19 - h2 := f0g2 + f1g1_2 + f2g0 + f3g9_38 + f4g8_19 + f5g7_38 + f6g6_19 + f7g5_38 + f8g4_19 + f9g3_38 - h3 := f0g3 + f1g2 + f2g1 + f3g0 + f4g9_19 + f5g8_19 + f6g7_19 + f7g6_19 + f8g5_19 + f9g4_19 - h4 := f0g4 + f1g3_2 + f2g2 + f3g1_2 + f4g0 + f5g9_38 + f6g8_19 + f7g7_38 + f8g6_19 + f9g5_38 - h5 := f0g5 + f1g4 + f2g3 + f3g2 + f4g1 + f5g0 + f6g9_19 + f7g8_19 + f8g7_19 + f9g6_19 - h6 := f0g6 + f1g5_2 + f2g4 + f3g3_2 + f4g2 + f5g1_2 + f6g0 + f7g9_38 + f8g8_19 + f9g7_38 - h7 := f0g7 + f1g6 + f2g5 + f3g4 + f4g3 + f5g2 + f6g1 + f7g0 + f8g9_19 + f9g8_19 - h8 := f0g8 + f1g7_2 + f2g6 + f3g5_2 + f4g4 + f5g3_2 + f6g2 + f7g1_2 + f8g0 + f9g9_38 - h9 := f0g9 + f1g8 + f2g7 + f3g6 + f4g5 + f5g4 + f6g3 + f7g2 + f8g1 + f9g0 - var carry [10]int64 - - // |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38)) - // i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8 - // |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19)) - // i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9 - - carry[0] = (h0 + (1 << 25)) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - carry[4] = (h4 + (1 << 25)) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - // |h0| <= 2^25 - // |h4| <= 2^25 - // |h1| <= 1.51*2^58 - // |h5| <= 1.51*2^58 - - carry[1] = (h1 + (1 << 24)) >> 25 - h2 += carry[1] - h1 -= carry[1] << 25 - carry[5] = (h5 + (1 << 24)) >> 25 - h6 += carry[5] - h5 -= carry[5] << 25 - // |h1| <= 2^24; from now on fits into int32 - // |h5| <= 2^24; from now on fits into int32 - // |h2| <= 1.21*2^59 - // |h6| <= 1.21*2^59 - - carry[2] = (h2 + (1 << 25)) >> 26 - h3 += carry[2] - h2 -= carry[2] << 26 - carry[6] = (h6 + (1 << 25)) >> 26 - h7 += carry[6] - h6 -= carry[6] << 26 - // |h2| <= 2^25; from now on fits into int32 unchanged - // |h6| <= 2^25; from now on fits into int32 unchanged - // |h3| <= 1.51*2^58 - // |h7| <= 1.51*2^58 - - carry[3] = (h3 + (1 << 24)) >> 25 - h4 += carry[3] - h3 -= carry[3] << 25 - carry[7] = (h7 + (1 << 24)) >> 25 - h8 += carry[7] - h7 -= carry[7] << 25 - // |h3| <= 2^24; from now on fits into int32 unchanged - // |h7| <= 2^24; from now on fits into int32 unchanged - // |h4| <= 1.52*2^33 - // |h8| <= 1.52*2^33 - - carry[4] = (h4 + (1 << 25)) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - carry[8] = (h8 + (1 << 25)) >> 26 - h9 += carry[8] - h8 -= carry[8] << 26 - // |h4| <= 2^25; from now on fits into int32 unchanged - // |h8| <= 2^25; from now on fits into int32 unchanged - // |h5| <= 1.01*2^24 - // |h9| <= 1.51*2^58 - - carry[9] = (h9 + (1 << 24)) >> 25 - h0 += carry[9] * 19 - h9 -= carry[9] << 25 - // |h9| <= 2^24; from now on fits into int32 unchanged - // |h0| <= 1.8*2^37 - - carry[0] = (h0 + (1 << 25)) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - // |h0| <= 2^25; from now on fits into int32 unchanged - // |h1| <= 1.01*2^24 - - h[0] = int32(h0) - h[1] = int32(h1) - h[2] = int32(h2) - h[3] = int32(h3) - h[4] = int32(h4) - h[5] = int32(h5) - h[6] = int32(h6) - h[7] = int32(h7) - h[8] = int32(h8) - h[9] = int32(h9) -} - -// feSquare calculates h = f*f. Can overlap h with f. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -func feSquare(h, f *fieldElement) { - f0 := f[0] - f1 := f[1] - f2 := f[2] - f3 := f[3] - f4 := f[4] - f5 := f[5] - f6 := f[6] - f7 := f[7] - f8 := f[8] - f9 := f[9] - f0_2 := 2 * f0 - f1_2 := 2 * f1 - f2_2 := 2 * f2 - f3_2 := 2 * f3 - f4_2 := 2 * f4 - f5_2 := 2 * f5 - f6_2 := 2 * f6 - f7_2 := 2 * f7 - f5_38 := 38 * f5 // 1.31*2^30 - f6_19 := 19 * f6 // 1.31*2^30 - f7_38 := 38 * f7 // 1.31*2^30 - f8_19 := 19 * f8 // 1.31*2^30 - f9_38 := 38 * f9 // 1.31*2^30 - f0f0 := int64(f0) * int64(f0) - f0f1_2 := int64(f0_2) * int64(f1) - f0f2_2 := int64(f0_2) * int64(f2) - f0f3_2 := int64(f0_2) * int64(f3) - f0f4_2 := int64(f0_2) * int64(f4) - f0f5_2 := int64(f0_2) * int64(f5) - f0f6_2 := int64(f0_2) * int64(f6) - f0f7_2 := int64(f0_2) * int64(f7) - f0f8_2 := int64(f0_2) * int64(f8) - f0f9_2 := int64(f0_2) * int64(f9) - f1f1_2 := int64(f1_2) * int64(f1) - f1f2_2 := int64(f1_2) * int64(f2) - f1f3_4 := int64(f1_2) * int64(f3_2) - f1f4_2 := int64(f1_2) * int64(f4) - f1f5_4 := int64(f1_2) * int64(f5_2) - f1f6_2 := int64(f1_2) * int64(f6) - f1f7_4 := int64(f1_2) * int64(f7_2) - f1f8_2 := int64(f1_2) * int64(f8) - f1f9_76 := int64(f1_2) * int64(f9_38) - f2f2 := int64(f2) * int64(f2) - f2f3_2 := int64(f2_2) * int64(f3) - f2f4_2 := int64(f2_2) * int64(f4) - f2f5_2 := int64(f2_2) * int64(f5) - f2f6_2 := int64(f2_2) * int64(f6) - f2f7_2 := int64(f2_2) * int64(f7) - f2f8_38 := int64(f2_2) * int64(f8_19) - f2f9_38 := int64(f2) * int64(f9_38) - f3f3_2 := int64(f3_2) * int64(f3) - f3f4_2 := int64(f3_2) * int64(f4) - f3f5_4 := int64(f3_2) * int64(f5_2) - f3f6_2 := int64(f3_2) * int64(f6) - f3f7_76 := int64(f3_2) * int64(f7_38) - f3f8_38 := int64(f3_2) * int64(f8_19) - f3f9_76 := int64(f3_2) * int64(f9_38) - f4f4 := int64(f4) * int64(f4) - f4f5_2 := int64(f4_2) * int64(f5) - f4f6_38 := int64(f4_2) * int64(f6_19) - f4f7_38 := int64(f4) * int64(f7_38) - f4f8_38 := int64(f4_2) * int64(f8_19) - f4f9_38 := int64(f4) * int64(f9_38) - f5f5_38 := int64(f5) * int64(f5_38) - f5f6_38 := int64(f5_2) * int64(f6_19) - f5f7_76 := int64(f5_2) * int64(f7_38) - f5f8_38 := int64(f5_2) * int64(f8_19) - f5f9_76 := int64(f5_2) * int64(f9_38) - f6f6_19 := int64(f6) * int64(f6_19) - f6f7_38 := int64(f6) * int64(f7_38) - f6f8_38 := int64(f6_2) * int64(f8_19) - f6f9_38 := int64(f6) * int64(f9_38) - f7f7_38 := int64(f7) * int64(f7_38) - f7f8_38 := int64(f7_2) * int64(f8_19) - f7f9_76 := int64(f7_2) * int64(f9_38) - f8f8_19 := int64(f8) * int64(f8_19) - f8f9_38 := int64(f8) * int64(f9_38) - f9f9_38 := int64(f9) * int64(f9_38) - h0 := f0f0 + f1f9_76 + f2f8_38 + f3f7_76 + f4f6_38 + f5f5_38 - h1 := f0f1_2 + f2f9_38 + f3f8_38 + f4f7_38 + f5f6_38 - h2 := f0f2_2 + f1f1_2 + f3f9_76 + f4f8_38 + f5f7_76 + f6f6_19 - h3 := f0f3_2 + f1f2_2 + f4f9_38 + f5f8_38 + f6f7_38 - h4 := f0f4_2 + f1f3_4 + f2f2 + f5f9_76 + f6f8_38 + f7f7_38 - h5 := f0f5_2 + f1f4_2 + f2f3_2 + f6f9_38 + f7f8_38 - h6 := f0f6_2 + f1f5_4 + f2f4_2 + f3f3_2 + f7f9_76 + f8f8_19 - h7 := f0f7_2 + f1f6_2 + f2f5_2 + f3f4_2 + f8f9_38 - h8 := f0f8_2 + f1f7_4 + f2f6_2 + f3f5_4 + f4f4 + f9f9_38 - h9 := f0f9_2 + f1f8_2 + f2f7_2 + f3f6_2 + f4f5_2 - var carry [10]int64 - - carry[0] = (h0 + (1 << 25)) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - carry[4] = (h4 + (1 << 25)) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - - carry[1] = (h1 + (1 << 24)) >> 25 - h2 += carry[1] - h1 -= carry[1] << 25 - carry[5] = (h5 + (1 << 24)) >> 25 - h6 += carry[5] - h5 -= carry[5] << 25 - - carry[2] = (h2 + (1 << 25)) >> 26 - h3 += carry[2] - h2 -= carry[2] << 26 - carry[6] = (h6 + (1 << 25)) >> 26 - h7 += carry[6] - h6 -= carry[6] << 26 - - carry[3] = (h3 + (1 << 24)) >> 25 - h4 += carry[3] - h3 -= carry[3] << 25 - carry[7] = (h7 + (1 << 24)) >> 25 - h8 += carry[7] - h7 -= carry[7] << 25 - - carry[4] = (h4 + (1 << 25)) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - carry[8] = (h8 + (1 << 25)) >> 26 - h9 += carry[8] - h8 -= carry[8] << 26 - - carry[9] = (h9 + (1 << 24)) >> 25 - h0 += carry[9] * 19 - h9 -= carry[9] << 25 - - carry[0] = (h0 + (1 << 25)) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - - h[0] = int32(h0) - h[1] = int32(h1) - h[2] = int32(h2) - h[3] = int32(h3) - h[4] = int32(h4) - h[5] = int32(h5) - h[6] = int32(h6) - h[7] = int32(h7) - h[8] = int32(h8) - h[9] = int32(h9) -} - -// feMul121666 calculates h = f * 121666. Can overlap h with f. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -func feMul121666(h, f *fieldElement) { - h0 := int64(f[0]) * 121666 - h1 := int64(f[1]) * 121666 - h2 := int64(f[2]) * 121666 - h3 := int64(f[3]) * 121666 - h4 := int64(f[4]) * 121666 - h5 := int64(f[5]) * 121666 - h6 := int64(f[6]) * 121666 - h7 := int64(f[7]) * 121666 - h8 := int64(f[8]) * 121666 - h9 := int64(f[9]) * 121666 - var carry [10]int64 - - carry[9] = (h9 + (1 << 24)) >> 25 - h0 += carry[9] * 19 - h9 -= carry[9] << 25 - carry[1] = (h1 + (1 << 24)) >> 25 - h2 += carry[1] - h1 -= carry[1] << 25 - carry[3] = (h3 + (1 << 24)) >> 25 - h4 += carry[3] - h3 -= carry[3] << 25 - carry[5] = (h5 + (1 << 24)) >> 25 - h6 += carry[5] - h5 -= carry[5] << 25 - carry[7] = (h7 + (1 << 24)) >> 25 - h8 += carry[7] - h7 -= carry[7] << 25 - - carry[0] = (h0 + (1 << 25)) >> 26 - h1 += carry[0] - h0 -= carry[0] << 26 - carry[2] = (h2 + (1 << 25)) >> 26 - h3 += carry[2] - h2 -= carry[2] << 26 - carry[4] = (h4 + (1 << 25)) >> 26 - h5 += carry[4] - h4 -= carry[4] << 26 - carry[6] = (h6 + (1 << 25)) >> 26 - h7 += carry[6] - h6 -= carry[6] << 26 - carry[8] = (h8 + (1 << 25)) >> 26 - h9 += carry[8] - h8 -= carry[8] << 26 - - h[0] = int32(h0) - h[1] = int32(h1) - h[2] = int32(h2) - h[3] = int32(h3) - h[4] = int32(h4) - h[5] = int32(h5) - h[6] = int32(h6) - h[7] = int32(h7) - h[8] = int32(h8) - h[9] = int32(h9) -} - -// feInvert sets out = z^-1. -func feInvert(out, z *fieldElement) { - var t0, t1, t2, t3 fieldElement - var i int - - feSquare(&t0, z) - for i = 1; i < 1; i++ { - feSquare(&t0, &t0) - } - feSquare(&t1, &t0) - for i = 1; i < 2; i++ { - feSquare(&t1, &t1) - } - feMul(&t1, z, &t1) - feMul(&t0, &t0, &t1) - feSquare(&t2, &t0) - for i = 1; i < 1; i++ { - feSquare(&t2, &t2) - } - feMul(&t1, &t1, &t2) - feSquare(&t2, &t1) - for i = 1; i < 5; i++ { - feSquare(&t2, &t2) - } - feMul(&t1, &t2, &t1) - feSquare(&t2, &t1) - for i = 1; i < 10; i++ { - feSquare(&t2, &t2) - } - feMul(&t2, &t2, &t1) - feSquare(&t3, &t2) - for i = 1; i < 20; i++ { - feSquare(&t3, &t3) - } - feMul(&t2, &t3, &t2) - feSquare(&t2, &t2) - for i = 1; i < 10; i++ { - feSquare(&t2, &t2) - } - feMul(&t1, &t2, &t1) - feSquare(&t2, &t1) - for i = 1; i < 50; i++ { - feSquare(&t2, &t2) - } - feMul(&t2, &t2, &t1) - feSquare(&t3, &t2) - for i = 1; i < 100; i++ { - feSquare(&t3, &t3) - } - feMul(&t2, &t3, &t2) - feSquare(&t2, &t2) - for i = 1; i < 50; i++ { - feSquare(&t2, &t2) - } - feMul(&t1, &t2, &t1) - feSquare(&t1, &t1) - for i = 1; i < 5; i++ { - feSquare(&t1, &t1) - } - feMul(out, &t1, &t0) -} - -func scalarMult(out, in, base *[32]byte) { - var e [32]byte - - copy(e[:], in[:]) - e[0] &= 248 - e[31] &= 127 - e[31] |= 64 - - var x1, x2, z2, x3, z3, tmp0, tmp1 fieldElement - feFromBytes(&x1, base) - feOne(&x2) - feCopy(&x3, &x1) - feOne(&z3) - - swap := int32(0) - for pos := 254; pos >= 0; pos-- { - b := e[pos/8] >> uint(pos&7) - b &= 1 - swap ^= int32(b) - feCSwap(&x2, &x3, swap) - feCSwap(&z2, &z3, swap) - swap = int32(b) - - feSub(&tmp0, &x3, &z3) - feSub(&tmp1, &x2, &z2) - feAdd(&x2, &x2, &z2) - feAdd(&z2, &x3, &z3) - feMul(&z3, &tmp0, &x2) - feMul(&z2, &z2, &tmp1) - feSquare(&tmp0, &tmp1) - feSquare(&tmp1, &x2) - feAdd(&x3, &z3, &z2) - feSub(&z2, &z3, &z2) - feMul(&x2, &tmp1, &tmp0) - feSub(&tmp1, &tmp1, &tmp0) - feSquare(&z2, &z2) - feMul121666(&z3, &tmp1) - feSquare(&x3, &x3) - feAdd(&tmp0, &tmp0, &z3) - feMul(&z3, &x1, &z2) - feMul(&z2, &tmp1, &tmp0) - } - - feCSwap(&x2, &x3, swap) - feCSwap(&z2, &z3, swap) - - feInvert(&z2, &z2) - feMul(&x2, &x2, &z2) - feToBytes(out, &x2) -} diff --git a/vendor/golang.org/x/crypto/curve25519/doc.go b/vendor/golang.org/x/crypto/curve25519/doc.go deleted file mode 100644 index da9b10d9c1ff..000000000000 --- a/vendor/golang.org/x/crypto/curve25519/doc.go +++ /dev/null @@ -1,23 +0,0 @@ -// 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 curve25519 provides an implementation of scalar multiplication on -// 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. -var basePoint = [32]byte{9, 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} - -// ScalarMult sets dst to the product in*base where dst and base are the x -// coordinates of group points and all values are in little-endian form. -func ScalarMult(dst, in, base *[32]byte) { - scalarMult(dst, in, base) -} - -// ScalarBaseMult sets dst to the product in*base where dst and base are the x -// coordinates of group points, base is the standard generator and all values -// are in little-endian form. -func ScalarBaseMult(dst, in *[32]byte) { - ScalarMult(dst, in, &basePoint) -} diff --git a/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s b/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s deleted file mode 100644 index 390816106ee9..000000000000 --- a/vendor/golang.org/x/crypto/curve25519/freeze_amd64.s +++ /dev/null @@ -1,73 +0,0 @@ -// 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. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -#include "const_amd64.h" - -// func freeze(inout *[5]uint64) -TEXT ·freeze(SB),7,$0-8 - MOVQ inout+0(FP), DI - - MOVQ 0(DI),SI - MOVQ 8(DI),DX - MOVQ 16(DI),CX - MOVQ 24(DI),R8 - MOVQ 32(DI),R9 - MOVQ $REDMASK51,AX - MOVQ AX,R10 - SUBQ $18,R10 - MOVQ $3,R11 -REDUCELOOP: - MOVQ SI,R12 - SHRQ $51,R12 - ANDQ AX,SI - ADDQ R12,DX - MOVQ DX,R12 - SHRQ $51,R12 - ANDQ AX,DX - ADDQ R12,CX - MOVQ CX,R12 - SHRQ $51,R12 - ANDQ AX,CX - ADDQ R12,R8 - MOVQ R8,R12 - SHRQ $51,R12 - ANDQ AX,R8 - ADDQ R12,R9 - MOVQ R9,R12 - SHRQ $51,R12 - ANDQ AX,R9 - IMUL3Q $19,R12,R12 - ADDQ R12,SI - SUBQ $1,R11 - JA REDUCELOOP - MOVQ $1,R12 - CMPQ R10,SI - CMOVQLT R11,R12 - CMPQ AX,DX - CMOVQNE R11,R12 - CMPQ AX,CX - CMOVQNE R11,R12 - CMPQ AX,R8 - CMOVQNE R11,R12 - CMPQ AX,R9 - CMOVQNE R11,R12 - NEGQ R12 - ANDQ R12,AX - ANDQ R12,R10 - SUBQ R10,SI - SUBQ AX,DX - SUBQ AX,CX - SUBQ AX,R8 - SUBQ AX,R9 - MOVQ SI,0(DI) - MOVQ DX,8(DI) - MOVQ CX,16(DI) - MOVQ R8,24(DI) - MOVQ R9,32(DI) - RET diff --git a/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s b/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s deleted file mode 100644 index 9e9040b2502f..000000000000 --- a/vendor/golang.org/x/crypto/curve25519/ladderstep_amd64.s +++ /dev/null @@ -1,1377 +0,0 @@ -// 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. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -#include "const_amd64.h" - -// func ladderstep(inout *[5][5]uint64) -TEXT ·ladderstep(SB),0,$296-8 - MOVQ inout+0(FP),DI - - MOVQ 40(DI),SI - MOVQ 48(DI),DX - MOVQ 56(DI),CX - MOVQ 64(DI),R8 - MOVQ 72(DI),R9 - MOVQ SI,AX - MOVQ DX,R10 - MOVQ CX,R11 - MOVQ R8,R12 - MOVQ R9,R13 - ADDQ ·_2P0(SB),AX - ADDQ ·_2P1234(SB),R10 - ADDQ ·_2P1234(SB),R11 - ADDQ ·_2P1234(SB),R12 - ADDQ ·_2P1234(SB),R13 - ADDQ 80(DI),SI - ADDQ 88(DI),DX - ADDQ 96(DI),CX - ADDQ 104(DI),R8 - ADDQ 112(DI),R9 - SUBQ 80(DI),AX - SUBQ 88(DI),R10 - SUBQ 96(DI),R11 - SUBQ 104(DI),R12 - SUBQ 112(DI),R13 - MOVQ SI,0(SP) - MOVQ DX,8(SP) - MOVQ CX,16(SP) - MOVQ R8,24(SP) - MOVQ R9,32(SP) - MOVQ AX,40(SP) - MOVQ R10,48(SP) - MOVQ R11,56(SP) - MOVQ R12,64(SP) - MOVQ R13,72(SP) - MOVQ 40(SP),AX - MULQ 40(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 40(SP),AX - SHLQ $1,AX - MULQ 48(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 40(SP),AX - SHLQ $1,AX - MULQ 56(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 40(SP),AX - SHLQ $1,AX - MULQ 64(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 40(SP),AX - SHLQ $1,AX - MULQ 72(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 48(SP),AX - MULQ 48(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 48(SP),AX - SHLQ $1,AX - MULQ 56(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 48(SP),AX - SHLQ $1,AX - MULQ 64(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 48(SP),DX - IMUL3Q $38,DX,AX - MULQ 72(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 56(SP),AX - MULQ 56(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 56(SP),DX - IMUL3Q $38,DX,AX - MULQ 64(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 56(SP),DX - IMUL3Q $38,DX,AX - MULQ 72(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 64(SP),DX - IMUL3Q $19,DX,AX - MULQ 64(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 64(SP),DX - IMUL3Q $38,DX,AX - MULQ 72(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 72(SP),DX - IMUL3Q $19,DX,AX - MULQ 72(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - ANDQ DX,SI - MOVQ CX,R8 - SHRQ $51,CX - ADDQ R10,CX - ANDQ DX,R8 - MOVQ CX,R9 - SHRQ $51,CX - ADDQ R12,CX - ANDQ DX,R9 - MOVQ CX,AX - SHRQ $51,CX - ADDQ R14,CX - ANDQ DX,AX - MOVQ CX,R10 - SHRQ $51,CX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,80(SP) - MOVQ R8,88(SP) - MOVQ R9,96(SP) - MOVQ AX,104(SP) - MOVQ R10,112(SP) - MOVQ 0(SP),AX - MULQ 0(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 0(SP),AX - SHLQ $1,AX - MULQ 8(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 0(SP),AX - SHLQ $1,AX - MULQ 16(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 0(SP),AX - SHLQ $1,AX - MULQ 24(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 0(SP),AX - SHLQ $1,AX - MULQ 32(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 8(SP),AX - MULQ 8(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SP),AX - SHLQ $1,AX - MULQ 16(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 8(SP),AX - SHLQ $1,AX - MULQ 24(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 8(SP),DX - IMUL3Q $38,DX,AX - MULQ 32(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 16(SP),AX - MULQ 16(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 16(SP),DX - IMUL3Q $38,DX,AX - MULQ 24(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 16(SP),DX - IMUL3Q $38,DX,AX - MULQ 32(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 24(SP),DX - IMUL3Q $19,DX,AX - MULQ 24(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 24(SP),DX - IMUL3Q $38,DX,AX - MULQ 32(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 32(SP),DX - IMUL3Q $19,DX,AX - MULQ 32(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - ANDQ DX,SI - MOVQ CX,R8 - SHRQ $51,CX - ADDQ R10,CX - ANDQ DX,R8 - MOVQ CX,R9 - SHRQ $51,CX - ADDQ R12,CX - ANDQ DX,R9 - MOVQ CX,AX - SHRQ $51,CX - ADDQ R14,CX - ANDQ DX,AX - MOVQ CX,R10 - SHRQ $51,CX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,120(SP) - MOVQ R8,128(SP) - MOVQ R9,136(SP) - MOVQ AX,144(SP) - MOVQ R10,152(SP) - MOVQ SI,SI - MOVQ R8,DX - MOVQ R9,CX - MOVQ AX,R8 - MOVQ R10,R9 - ADDQ ·_2P0(SB),SI - ADDQ ·_2P1234(SB),DX - ADDQ ·_2P1234(SB),CX - ADDQ ·_2P1234(SB),R8 - ADDQ ·_2P1234(SB),R9 - SUBQ 80(SP),SI - SUBQ 88(SP),DX - SUBQ 96(SP),CX - SUBQ 104(SP),R8 - SUBQ 112(SP),R9 - MOVQ SI,160(SP) - MOVQ DX,168(SP) - MOVQ CX,176(SP) - MOVQ R8,184(SP) - MOVQ R9,192(SP) - MOVQ 120(DI),SI - MOVQ 128(DI),DX - MOVQ 136(DI),CX - MOVQ 144(DI),R8 - MOVQ 152(DI),R9 - MOVQ SI,AX - MOVQ DX,R10 - MOVQ CX,R11 - MOVQ R8,R12 - MOVQ R9,R13 - ADDQ ·_2P0(SB),AX - ADDQ ·_2P1234(SB),R10 - ADDQ ·_2P1234(SB),R11 - ADDQ ·_2P1234(SB),R12 - ADDQ ·_2P1234(SB),R13 - ADDQ 160(DI),SI - ADDQ 168(DI),DX - ADDQ 176(DI),CX - ADDQ 184(DI),R8 - ADDQ 192(DI),R9 - SUBQ 160(DI),AX - SUBQ 168(DI),R10 - SUBQ 176(DI),R11 - SUBQ 184(DI),R12 - SUBQ 192(DI),R13 - MOVQ SI,200(SP) - MOVQ DX,208(SP) - MOVQ CX,216(SP) - MOVQ R8,224(SP) - MOVQ R9,232(SP) - MOVQ AX,240(SP) - MOVQ R10,248(SP) - MOVQ R11,256(SP) - MOVQ R12,264(SP) - MOVQ R13,272(SP) - MOVQ 224(SP),SI - IMUL3Q $19,SI,AX - MOVQ AX,280(SP) - MULQ 56(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 232(SP),DX - IMUL3Q $19,DX,AX - MOVQ AX,288(SP) - MULQ 48(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 200(SP),AX - MULQ 40(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 200(SP),AX - MULQ 48(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 200(SP),AX - MULQ 56(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 200(SP),AX - MULQ 64(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 200(SP),AX - MULQ 72(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 208(SP),AX - MULQ 40(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 208(SP),AX - MULQ 48(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 208(SP),AX - MULQ 56(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 208(SP),AX - MULQ 64(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 208(SP),DX - IMUL3Q $19,DX,AX - MULQ 72(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 216(SP),AX - MULQ 40(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 216(SP),AX - MULQ 48(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 216(SP),AX - MULQ 56(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 216(SP),DX - IMUL3Q $19,DX,AX - MULQ 64(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 216(SP),DX - IMUL3Q $19,DX,AX - MULQ 72(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 224(SP),AX - MULQ 40(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 224(SP),AX - MULQ 48(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 280(SP),AX - MULQ 64(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 280(SP),AX - MULQ 72(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 232(SP),AX - MULQ 40(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 288(SP),AX - MULQ 56(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 288(SP),AX - MULQ 64(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 288(SP),AX - MULQ 72(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $51,CX - ANDQ DX,SI - ADDQ R10,CX - MOVQ CX,R9 - SHRQ $51,CX - ANDQ DX,R8 - ADDQ R12,CX - MOVQ CX,AX - SHRQ $51,CX - ANDQ DX,R9 - ADDQ R14,CX - MOVQ CX,R10 - SHRQ $51,CX - ANDQ DX,AX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,40(SP) - MOVQ R8,48(SP) - MOVQ R9,56(SP) - MOVQ AX,64(SP) - MOVQ R10,72(SP) - MOVQ 264(SP),SI - IMUL3Q $19,SI,AX - MOVQ AX,200(SP) - MULQ 16(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 272(SP),DX - IMUL3Q $19,DX,AX - MOVQ AX,208(SP) - MULQ 8(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 240(SP),AX - MULQ 0(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 240(SP),AX - MULQ 8(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 240(SP),AX - MULQ 16(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 240(SP),AX - MULQ 24(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 240(SP),AX - MULQ 32(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 248(SP),AX - MULQ 0(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 248(SP),AX - MULQ 8(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 248(SP),AX - MULQ 16(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 248(SP),AX - MULQ 24(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 248(SP),DX - IMUL3Q $19,DX,AX - MULQ 32(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 256(SP),AX - MULQ 0(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 256(SP),AX - MULQ 8(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 256(SP),AX - MULQ 16(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 256(SP),DX - IMUL3Q $19,DX,AX - MULQ 24(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 256(SP),DX - IMUL3Q $19,DX,AX - MULQ 32(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 264(SP),AX - MULQ 0(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 264(SP),AX - MULQ 8(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 200(SP),AX - MULQ 24(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 200(SP),AX - MULQ 32(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 272(SP),AX - MULQ 0(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 208(SP),AX - MULQ 16(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 208(SP),AX - MULQ 24(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 208(SP),AX - MULQ 32(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $51,CX - ANDQ DX,SI - ADDQ R10,CX - MOVQ CX,R9 - SHRQ $51,CX - ANDQ DX,R8 - ADDQ R12,CX - MOVQ CX,AX - SHRQ $51,CX - ANDQ DX,R9 - ADDQ R14,CX - MOVQ CX,R10 - SHRQ $51,CX - ANDQ DX,AX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,DX - MOVQ R8,CX - MOVQ R9,R11 - MOVQ AX,R12 - MOVQ R10,R13 - ADDQ ·_2P0(SB),DX - ADDQ ·_2P1234(SB),CX - ADDQ ·_2P1234(SB),R11 - ADDQ ·_2P1234(SB),R12 - ADDQ ·_2P1234(SB),R13 - ADDQ 40(SP),SI - ADDQ 48(SP),R8 - ADDQ 56(SP),R9 - ADDQ 64(SP),AX - ADDQ 72(SP),R10 - SUBQ 40(SP),DX - SUBQ 48(SP),CX - SUBQ 56(SP),R11 - SUBQ 64(SP),R12 - SUBQ 72(SP),R13 - MOVQ SI,120(DI) - MOVQ R8,128(DI) - MOVQ R9,136(DI) - MOVQ AX,144(DI) - MOVQ R10,152(DI) - MOVQ DX,160(DI) - MOVQ CX,168(DI) - MOVQ R11,176(DI) - MOVQ R12,184(DI) - MOVQ R13,192(DI) - MOVQ 120(DI),AX - MULQ 120(DI) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 120(DI),AX - SHLQ $1,AX - MULQ 128(DI) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 120(DI),AX - SHLQ $1,AX - MULQ 136(DI) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 120(DI),AX - SHLQ $1,AX - MULQ 144(DI) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 120(DI),AX - SHLQ $1,AX - MULQ 152(DI) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 128(DI),AX - MULQ 128(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 128(DI),AX - SHLQ $1,AX - MULQ 136(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 128(DI),AX - SHLQ $1,AX - MULQ 144(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 128(DI),DX - IMUL3Q $38,DX,AX - MULQ 152(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 136(DI),AX - MULQ 136(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 136(DI),DX - IMUL3Q $38,DX,AX - MULQ 144(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 136(DI),DX - IMUL3Q $38,DX,AX - MULQ 152(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 144(DI),DX - IMUL3Q $19,DX,AX - MULQ 144(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 144(DI),DX - IMUL3Q $38,DX,AX - MULQ 152(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 152(DI),DX - IMUL3Q $19,DX,AX - MULQ 152(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - ANDQ DX,SI - MOVQ CX,R8 - SHRQ $51,CX - ADDQ R10,CX - ANDQ DX,R8 - MOVQ CX,R9 - SHRQ $51,CX - ADDQ R12,CX - ANDQ DX,R9 - MOVQ CX,AX - SHRQ $51,CX - ADDQ R14,CX - ANDQ DX,AX - MOVQ CX,R10 - SHRQ $51,CX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,120(DI) - MOVQ R8,128(DI) - MOVQ R9,136(DI) - MOVQ AX,144(DI) - MOVQ R10,152(DI) - MOVQ 160(DI),AX - MULQ 160(DI) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 160(DI),AX - SHLQ $1,AX - MULQ 168(DI) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 160(DI),AX - SHLQ $1,AX - MULQ 176(DI) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 160(DI),AX - SHLQ $1,AX - MULQ 184(DI) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 160(DI),AX - SHLQ $1,AX - MULQ 192(DI) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 168(DI),AX - MULQ 168(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 168(DI),AX - SHLQ $1,AX - MULQ 176(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 168(DI),AX - SHLQ $1,AX - MULQ 184(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 168(DI),DX - IMUL3Q $38,DX,AX - MULQ 192(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 176(DI),AX - MULQ 176(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 176(DI),DX - IMUL3Q $38,DX,AX - MULQ 184(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 176(DI),DX - IMUL3Q $38,DX,AX - MULQ 192(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 184(DI),DX - IMUL3Q $19,DX,AX - MULQ 184(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 184(DI),DX - IMUL3Q $38,DX,AX - MULQ 192(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 192(DI),DX - IMUL3Q $19,DX,AX - MULQ 192(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - ANDQ DX,SI - MOVQ CX,R8 - SHRQ $51,CX - ADDQ R10,CX - ANDQ DX,R8 - MOVQ CX,R9 - SHRQ $51,CX - ADDQ R12,CX - ANDQ DX,R9 - MOVQ CX,AX - SHRQ $51,CX - ADDQ R14,CX - ANDQ DX,AX - MOVQ CX,R10 - SHRQ $51,CX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,160(DI) - MOVQ R8,168(DI) - MOVQ R9,176(DI) - MOVQ AX,184(DI) - MOVQ R10,192(DI) - MOVQ 184(DI),SI - IMUL3Q $19,SI,AX - MOVQ AX,0(SP) - MULQ 16(DI) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 192(DI),DX - IMUL3Q $19,DX,AX - MOVQ AX,8(SP) - MULQ 8(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 160(DI),AX - MULQ 0(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 160(DI),AX - MULQ 8(DI) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 160(DI),AX - MULQ 16(DI) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 160(DI),AX - MULQ 24(DI) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 160(DI),AX - MULQ 32(DI) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 168(DI),AX - MULQ 0(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 168(DI),AX - MULQ 8(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 168(DI),AX - MULQ 16(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 168(DI),AX - MULQ 24(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 168(DI),DX - IMUL3Q $19,DX,AX - MULQ 32(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 176(DI),AX - MULQ 0(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 176(DI),AX - MULQ 8(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 176(DI),AX - MULQ 16(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 176(DI),DX - IMUL3Q $19,DX,AX - MULQ 24(DI) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 176(DI),DX - IMUL3Q $19,DX,AX - MULQ 32(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 184(DI),AX - MULQ 0(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 184(DI),AX - MULQ 8(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 0(SP),AX - MULQ 24(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 0(SP),AX - MULQ 32(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 192(DI),AX - MULQ 0(DI) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 8(SP),AX - MULQ 16(DI) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 8(SP),AX - MULQ 24(DI) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SP),AX - MULQ 32(DI) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $51,CX - ANDQ DX,SI - ADDQ R10,CX - MOVQ CX,R9 - SHRQ $51,CX - ANDQ DX,R8 - ADDQ R12,CX - MOVQ CX,AX - SHRQ $51,CX - ANDQ DX,R9 - ADDQ R14,CX - MOVQ CX,R10 - SHRQ $51,CX - ANDQ DX,AX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,160(DI) - MOVQ R8,168(DI) - MOVQ R9,176(DI) - MOVQ AX,184(DI) - MOVQ R10,192(DI) - MOVQ 144(SP),SI - IMUL3Q $19,SI,AX - MOVQ AX,0(SP) - MULQ 96(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 152(SP),DX - IMUL3Q $19,DX,AX - MOVQ AX,8(SP) - MULQ 88(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 120(SP),AX - MULQ 80(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 120(SP),AX - MULQ 88(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 120(SP),AX - MULQ 96(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 120(SP),AX - MULQ 104(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 120(SP),AX - MULQ 112(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 128(SP),AX - MULQ 80(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 128(SP),AX - MULQ 88(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 128(SP),AX - MULQ 96(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 128(SP),AX - MULQ 104(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 128(SP),DX - IMUL3Q $19,DX,AX - MULQ 112(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 136(SP),AX - MULQ 80(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 136(SP),AX - MULQ 88(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 136(SP),AX - MULQ 96(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 136(SP),DX - IMUL3Q $19,DX,AX - MULQ 104(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 136(SP),DX - IMUL3Q $19,DX,AX - MULQ 112(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 144(SP),AX - MULQ 80(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 144(SP),AX - MULQ 88(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 0(SP),AX - MULQ 104(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 0(SP),AX - MULQ 112(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 152(SP),AX - MULQ 80(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 8(SP),AX - MULQ 96(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 8(SP),AX - MULQ 104(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SP),AX - MULQ 112(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $51,CX - ANDQ DX,SI - ADDQ R10,CX - MOVQ CX,R9 - SHRQ $51,CX - ANDQ DX,R8 - ADDQ R12,CX - MOVQ CX,AX - SHRQ $51,CX - ANDQ DX,R9 - ADDQ R14,CX - MOVQ CX,R10 - SHRQ $51,CX - ANDQ DX,AX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,40(DI) - MOVQ R8,48(DI) - MOVQ R9,56(DI) - MOVQ AX,64(DI) - MOVQ R10,72(DI) - MOVQ 160(SP),AX - MULQ ·_121666_213(SB) - SHRQ $13,AX - MOVQ AX,SI - MOVQ DX,CX - MOVQ 168(SP),AX - MULQ ·_121666_213(SB) - SHRQ $13,AX - ADDQ AX,CX - MOVQ DX,R8 - MOVQ 176(SP),AX - MULQ ·_121666_213(SB) - SHRQ $13,AX - ADDQ AX,R8 - MOVQ DX,R9 - MOVQ 184(SP),AX - MULQ ·_121666_213(SB) - SHRQ $13,AX - ADDQ AX,R9 - MOVQ DX,R10 - MOVQ 192(SP),AX - MULQ ·_121666_213(SB) - SHRQ $13,AX - ADDQ AX,R10 - IMUL3Q $19,DX,DX - ADDQ DX,SI - ADDQ 80(SP),SI - ADDQ 88(SP),CX - ADDQ 96(SP),R8 - ADDQ 104(SP),R9 - ADDQ 112(SP),R10 - MOVQ SI,80(DI) - MOVQ CX,88(DI) - MOVQ R8,96(DI) - MOVQ R9,104(DI) - MOVQ R10,112(DI) - MOVQ 104(DI),SI - IMUL3Q $19,SI,AX - MOVQ AX,0(SP) - MULQ 176(SP) - MOVQ AX,SI - MOVQ DX,CX - MOVQ 112(DI),DX - IMUL3Q $19,DX,AX - MOVQ AX,8(SP) - MULQ 168(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 80(DI),AX - MULQ 160(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 80(DI),AX - MULQ 168(SP) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 80(DI),AX - MULQ 176(SP) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 80(DI),AX - MULQ 184(SP) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 80(DI),AX - MULQ 192(SP) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 88(DI),AX - MULQ 160(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 88(DI),AX - MULQ 168(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 88(DI),AX - MULQ 176(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 88(DI),AX - MULQ 184(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 88(DI),DX - IMUL3Q $19,DX,AX - MULQ 192(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 96(DI),AX - MULQ 160(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 96(DI),AX - MULQ 168(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 96(DI),AX - MULQ 176(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 96(DI),DX - IMUL3Q $19,DX,AX - MULQ 184(SP) - ADDQ AX,SI - ADCQ DX,CX - MOVQ 96(DI),DX - IMUL3Q $19,DX,AX - MULQ 192(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 104(DI),AX - MULQ 160(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 104(DI),AX - MULQ 168(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 0(SP),AX - MULQ 184(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 0(SP),AX - MULQ 192(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 112(DI),AX - MULQ 160(SP) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 8(SP),AX - MULQ 176(SP) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 8(SP),AX - MULQ 184(SP) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SP),AX - MULQ 192(SP) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ $REDMASK51,DX - SHLQ $13,CX:SI - ANDQ DX,SI - SHLQ $13,R9:R8 - ANDQ DX,R8 - ADDQ CX,R8 - SHLQ $13,R11:R10 - ANDQ DX,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ DX,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ DX,R14 - ADDQ R13,R14 - IMUL3Q $19,R15,CX - ADDQ CX,SI - MOVQ SI,CX - SHRQ $51,CX - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $51,CX - ANDQ DX,SI - ADDQ R10,CX - MOVQ CX,R9 - SHRQ $51,CX - ANDQ DX,R8 - ADDQ R12,CX - MOVQ CX,AX - SHRQ $51,CX - ANDQ DX,R9 - ADDQ R14,CX - MOVQ CX,R10 - SHRQ $51,CX - ANDQ DX,AX - IMUL3Q $19,CX,CX - ADDQ CX,SI - ANDQ DX,R10 - MOVQ SI,80(DI) - MOVQ R8,88(DI) - MOVQ R9,96(DI) - MOVQ AX,104(DI) - MOVQ R10,112(DI) - RET diff --git a/vendor/golang.org/x/crypto/curve25519/mont25519_amd64.go b/vendor/golang.org/x/crypto/curve25519/mont25519_amd64.go deleted file mode 100644 index 5822bd533834..000000000000 --- a/vendor/golang.org/x/crypto/curve25519/mont25519_amd64.go +++ /dev/null @@ -1,240 +0,0 @@ -// 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 amd64,!gccgo,!appengine - -package curve25519 - -// These functions are implemented in the .s files. The names of the functions -// in the rest of the file are also taken from the SUPERCOP sources to help -// people following along. - -//go:noescape - -func cswap(inout *[5]uint64, v uint64) - -//go:noescape - -func ladderstep(inout *[5][5]uint64) - -//go:noescape - -func freeze(inout *[5]uint64) - -//go:noescape - -func mul(dest, a, b *[5]uint64) - -//go:noescape - -func square(out, in *[5]uint64) - -// mladder uses a Montgomery ladder to calculate (xr/zr) *= s. -func mladder(xr, zr *[5]uint64, s *[32]byte) { - var work [5][5]uint64 - - work[0] = *xr - setint(&work[1], 1) - setint(&work[2], 0) - work[3] = *xr - setint(&work[4], 1) - - j := uint(6) - var prevbit byte - - for i := 31; i >= 0; i-- { - for j < 8 { - bit := ((*s)[i] >> j) & 1 - swap := bit ^ prevbit - prevbit = bit - cswap(&work[1], uint64(swap)) - ladderstep(&work) - j-- - } - j = 7 - } - - *xr = work[1] - *zr = work[2] -} - -func scalarMult(out, in, base *[32]byte) { - var e [32]byte - copy(e[:], (*in)[:]) - e[0] &= 248 - e[31] &= 127 - e[31] |= 64 - - var t, z [5]uint64 - unpack(&t, base) - mladder(&t, &z, &e) - invert(&z, &z) - mul(&t, &t, &z) - pack(out, &t) -} - -func setint(r *[5]uint64, v uint64) { - r[0] = v - r[1] = 0 - r[2] = 0 - r[3] = 0 - r[4] = 0 -} - -// unpack sets r = x where r consists of 5, 51-bit limbs in little-endian -// order. -func unpack(r *[5]uint64, x *[32]byte) { - r[0] = uint64(x[0]) | - uint64(x[1])<<8 | - uint64(x[2])<<16 | - uint64(x[3])<<24 | - uint64(x[4])<<32 | - uint64(x[5])<<40 | - uint64(x[6]&7)<<48 - - r[1] = uint64(x[6])>>3 | - uint64(x[7])<<5 | - uint64(x[8])<<13 | - uint64(x[9])<<21 | - uint64(x[10])<<29 | - uint64(x[11])<<37 | - uint64(x[12]&63)<<45 - - r[2] = uint64(x[12])>>6 | - uint64(x[13])<<2 | - uint64(x[14])<<10 | - uint64(x[15])<<18 | - uint64(x[16])<<26 | - uint64(x[17])<<34 | - uint64(x[18])<<42 | - uint64(x[19]&1)<<50 - - r[3] = uint64(x[19])>>1 | - uint64(x[20])<<7 | - uint64(x[21])<<15 | - uint64(x[22])<<23 | - uint64(x[23])<<31 | - uint64(x[24])<<39 | - uint64(x[25]&15)<<47 - - r[4] = uint64(x[25])>>4 | - uint64(x[26])<<4 | - uint64(x[27])<<12 | - uint64(x[28])<<20 | - uint64(x[29])<<28 | - uint64(x[30])<<36 | - uint64(x[31]&127)<<44 -} - -// pack sets out = x where out is the usual, little-endian form of the 5, -// 51-bit limbs in x. -func pack(out *[32]byte, x *[5]uint64) { - t := *x - freeze(&t) - - out[0] = byte(t[0]) - out[1] = byte(t[0] >> 8) - out[2] = byte(t[0] >> 16) - out[3] = byte(t[0] >> 24) - out[4] = byte(t[0] >> 32) - out[5] = byte(t[0] >> 40) - out[6] = byte(t[0] >> 48) - - out[6] ^= byte(t[1]<<3) & 0xf8 - out[7] = byte(t[1] >> 5) - out[8] = byte(t[1] >> 13) - out[9] = byte(t[1] >> 21) - out[10] = byte(t[1] >> 29) - out[11] = byte(t[1] >> 37) - out[12] = byte(t[1] >> 45) - - out[12] ^= byte(t[2]<<6) & 0xc0 - out[13] = byte(t[2] >> 2) - out[14] = byte(t[2] >> 10) - out[15] = byte(t[2] >> 18) - out[16] = byte(t[2] >> 26) - out[17] = byte(t[2] >> 34) - out[18] = byte(t[2] >> 42) - out[19] = byte(t[2] >> 50) - - out[19] ^= byte(t[3]<<1) & 0xfe - out[20] = byte(t[3] >> 7) - out[21] = byte(t[3] >> 15) - out[22] = byte(t[3] >> 23) - out[23] = byte(t[3] >> 31) - out[24] = byte(t[3] >> 39) - out[25] = byte(t[3] >> 47) - - out[25] ^= byte(t[4]<<4) & 0xf0 - out[26] = byte(t[4] >> 4) - out[27] = byte(t[4] >> 12) - out[28] = byte(t[4] >> 20) - out[29] = byte(t[4] >> 28) - out[30] = byte(t[4] >> 36) - out[31] = byte(t[4] >> 44) -} - -// invert calculates r = x^-1 mod p using Fermat's little theorem. -func invert(r *[5]uint64, x *[5]uint64) { - var z2, z9, z11, z2_5_0, z2_10_0, z2_20_0, z2_50_0, z2_100_0, t [5]uint64 - - square(&z2, x) /* 2 */ - square(&t, &z2) /* 4 */ - square(&t, &t) /* 8 */ - mul(&z9, &t, x) /* 9 */ - mul(&z11, &z9, &z2) /* 11 */ - square(&t, &z11) /* 22 */ - mul(&z2_5_0, &t, &z9) /* 2^5 - 2^0 = 31 */ - - square(&t, &z2_5_0) /* 2^6 - 2^1 */ - for i := 1; i < 5; i++ { /* 2^20 - 2^10 */ - square(&t, &t) - } - mul(&z2_10_0, &t, &z2_5_0) /* 2^10 - 2^0 */ - - square(&t, &z2_10_0) /* 2^11 - 2^1 */ - for i := 1; i < 10; i++ { /* 2^20 - 2^10 */ - square(&t, &t) - } - mul(&z2_20_0, &t, &z2_10_0) /* 2^20 - 2^0 */ - - square(&t, &z2_20_0) /* 2^21 - 2^1 */ - for i := 1; i < 20; i++ { /* 2^40 - 2^20 */ - square(&t, &t) - } - mul(&t, &t, &z2_20_0) /* 2^40 - 2^0 */ - - square(&t, &t) /* 2^41 - 2^1 */ - for i := 1; i < 10; i++ { /* 2^50 - 2^10 */ - square(&t, &t) - } - mul(&z2_50_0, &t, &z2_10_0) /* 2^50 - 2^0 */ - - square(&t, &z2_50_0) /* 2^51 - 2^1 */ - for i := 1; i < 50; i++ { /* 2^100 - 2^50 */ - square(&t, &t) - } - mul(&z2_100_0, &t, &z2_50_0) /* 2^100 - 2^0 */ - - square(&t, &z2_100_0) /* 2^101 - 2^1 */ - for i := 1; i < 100; i++ { /* 2^200 - 2^100 */ - square(&t, &t) - } - mul(&t, &t, &z2_100_0) /* 2^200 - 2^0 */ - - square(&t, &t) /* 2^201 - 2^1 */ - for i := 1; i < 50; i++ { /* 2^250 - 2^50 */ - square(&t, &t) - } - mul(&t, &t, &z2_50_0) /* 2^250 - 2^0 */ - - square(&t, &t) /* 2^251 - 2^1 */ - square(&t, &t) /* 2^252 - 2^2 */ - square(&t, &t) /* 2^253 - 2^3 */ - - square(&t, &t) /* 2^254 - 2^4 */ - - square(&t, &t) /* 2^255 - 2^5 */ - mul(r, &t, &z11) /* 2^255 - 21 */ -} diff --git a/vendor/golang.org/x/crypto/curve25519/mul_amd64.s b/vendor/golang.org/x/crypto/curve25519/mul_amd64.s deleted file mode 100644 index 5ce80a2e56b9..000000000000 --- a/vendor/golang.org/x/crypto/curve25519/mul_amd64.s +++ /dev/null @@ -1,169 +0,0 @@ -// 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. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -#include "const_amd64.h" - -// func mul(dest, a, b *[5]uint64) -TEXT ·mul(SB),0,$16-24 - MOVQ dest+0(FP), DI - MOVQ a+8(FP), SI - MOVQ b+16(FP), DX - - MOVQ DX,CX - MOVQ 24(SI),DX - IMUL3Q $19,DX,AX - MOVQ AX,0(SP) - MULQ 16(CX) - MOVQ AX,R8 - MOVQ DX,R9 - MOVQ 32(SI),DX - IMUL3Q $19,DX,AX - MOVQ AX,8(SP) - MULQ 8(CX) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 0(SI),AX - MULQ 0(CX) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 0(SI),AX - MULQ 8(CX) - MOVQ AX,R10 - MOVQ DX,R11 - MOVQ 0(SI),AX - MULQ 16(CX) - MOVQ AX,R12 - MOVQ DX,R13 - MOVQ 0(SI),AX - MULQ 24(CX) - MOVQ AX,R14 - MOVQ DX,R15 - MOVQ 0(SI),AX - MULQ 32(CX) - MOVQ AX,BX - MOVQ DX,BP - MOVQ 8(SI),AX - MULQ 0(CX) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SI),AX - MULQ 8(CX) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 8(SI),AX - MULQ 16(CX) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 8(SI),AX - MULQ 24(CX) - ADDQ AX,BX - ADCQ DX,BP - MOVQ 8(SI),DX - IMUL3Q $19,DX,AX - MULQ 32(CX) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 16(SI),AX - MULQ 0(CX) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 16(SI),AX - MULQ 8(CX) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 16(SI),AX - MULQ 16(CX) - ADDQ AX,BX - ADCQ DX,BP - MOVQ 16(SI),DX - IMUL3Q $19,DX,AX - MULQ 24(CX) - ADDQ AX,R8 - ADCQ DX,R9 - MOVQ 16(SI),DX - IMUL3Q $19,DX,AX - MULQ 32(CX) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 24(SI),AX - MULQ 0(CX) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ 24(SI),AX - MULQ 8(CX) - ADDQ AX,BX - ADCQ DX,BP - MOVQ 0(SP),AX - MULQ 24(CX) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 0(SP),AX - MULQ 32(CX) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 32(SI),AX - MULQ 0(CX) - ADDQ AX,BX - ADCQ DX,BP - MOVQ 8(SP),AX - MULQ 16(CX) - ADDQ AX,R10 - ADCQ DX,R11 - MOVQ 8(SP),AX - MULQ 24(CX) - ADDQ AX,R12 - ADCQ DX,R13 - MOVQ 8(SP),AX - MULQ 32(CX) - ADDQ AX,R14 - ADCQ DX,R15 - MOVQ $REDMASK51,SI - SHLQ $13,R9:R8 - ANDQ SI,R8 - SHLQ $13,R11:R10 - ANDQ SI,R10 - ADDQ R9,R10 - SHLQ $13,R13:R12 - ANDQ SI,R12 - ADDQ R11,R12 - SHLQ $13,R15:R14 - ANDQ SI,R14 - ADDQ R13,R14 - SHLQ $13,BP:BX - ANDQ SI,BX - ADDQ R15,BX - IMUL3Q $19,BP,DX - ADDQ DX,R8 - MOVQ R8,DX - SHRQ $51,DX - ADDQ R10,DX - MOVQ DX,CX - SHRQ $51,DX - ANDQ SI,R8 - ADDQ R12,DX - MOVQ DX,R9 - SHRQ $51,DX - ANDQ SI,CX - ADDQ R14,DX - MOVQ DX,AX - SHRQ $51,DX - ANDQ SI,R9 - ADDQ BX,DX - MOVQ DX,R10 - SHRQ $51,DX - ANDQ SI,AX - IMUL3Q $19,DX,DX - ADDQ DX,R8 - ANDQ SI,R10 - MOVQ R8,0(DI) - MOVQ CX,8(DI) - MOVQ R9,16(DI) - MOVQ AX,24(DI) - MOVQ R10,32(DI) - RET diff --git a/vendor/golang.org/x/crypto/curve25519/square_amd64.s b/vendor/golang.org/x/crypto/curve25519/square_amd64.s deleted file mode 100644 index 12f73734ff5a..000000000000 --- a/vendor/golang.org/x/crypto/curve25519/square_amd64.s +++ /dev/null @@ -1,132 +0,0 @@ -// 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. - -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html - -// +build amd64,!gccgo,!appengine - -#include "const_amd64.h" - -// func square(out, in *[5]uint64) -TEXT ·square(SB),7,$0-16 - MOVQ out+0(FP), DI - MOVQ in+8(FP), SI - - MOVQ 0(SI),AX - MULQ 0(SI) - MOVQ AX,CX - MOVQ DX,R8 - MOVQ 0(SI),AX - SHLQ $1,AX - MULQ 8(SI) - MOVQ AX,R9 - MOVQ DX,R10 - MOVQ 0(SI),AX - SHLQ $1,AX - MULQ 16(SI) - MOVQ AX,R11 - MOVQ DX,R12 - MOVQ 0(SI),AX - SHLQ $1,AX - MULQ 24(SI) - MOVQ AX,R13 - MOVQ DX,R14 - MOVQ 0(SI),AX - SHLQ $1,AX - MULQ 32(SI) - MOVQ AX,R15 - MOVQ DX,BX - MOVQ 8(SI),AX - MULQ 8(SI) - ADDQ AX,R11 - ADCQ DX,R12 - MOVQ 8(SI),AX - SHLQ $1,AX - MULQ 16(SI) - ADDQ AX,R13 - ADCQ DX,R14 - MOVQ 8(SI),AX - SHLQ $1,AX - MULQ 24(SI) - ADDQ AX,R15 - ADCQ DX,BX - MOVQ 8(SI),DX - IMUL3Q $38,DX,AX - MULQ 32(SI) - ADDQ AX,CX - ADCQ DX,R8 - MOVQ 16(SI),AX - MULQ 16(SI) - ADDQ AX,R15 - ADCQ DX,BX - MOVQ 16(SI),DX - IMUL3Q $38,DX,AX - MULQ 24(SI) - ADDQ AX,CX - ADCQ DX,R8 - MOVQ 16(SI),DX - IMUL3Q $38,DX,AX - MULQ 32(SI) - ADDQ AX,R9 - ADCQ DX,R10 - MOVQ 24(SI),DX - IMUL3Q $19,DX,AX - MULQ 24(SI) - ADDQ AX,R9 - ADCQ DX,R10 - MOVQ 24(SI),DX - IMUL3Q $38,DX,AX - MULQ 32(SI) - ADDQ AX,R11 - ADCQ DX,R12 - MOVQ 32(SI),DX - IMUL3Q $19,DX,AX - MULQ 32(SI) - ADDQ AX,R13 - ADCQ DX,R14 - MOVQ $REDMASK51,SI - SHLQ $13,R8:CX - ANDQ SI,CX - SHLQ $13,R10:R9 - ANDQ SI,R9 - ADDQ R8,R9 - SHLQ $13,R12:R11 - ANDQ SI,R11 - ADDQ R10,R11 - SHLQ $13,R14:R13 - ANDQ SI,R13 - ADDQ R12,R13 - SHLQ $13,BX:R15 - ANDQ SI,R15 - ADDQ R14,R15 - IMUL3Q $19,BX,DX - ADDQ DX,CX - MOVQ CX,DX - SHRQ $51,DX - ADDQ R9,DX - ANDQ SI,CX - MOVQ DX,R8 - SHRQ $51,DX - ADDQ R11,DX - ANDQ SI,R8 - MOVQ DX,R9 - SHRQ $51,DX - ADDQ R13,DX - ANDQ SI,R9 - MOVQ DX,AX - SHRQ $51,DX - ADDQ R15,DX - ANDQ SI,AX - MOVQ DX,R10 - SHRQ $51,DX - IMUL3Q $19,DX,DX - ADDQ DX,CX - ANDQ SI,R10 - MOVQ CX,0(DI) - MOVQ R8,8(DI) - MOVQ R9,16(DI) - MOVQ AX,24(DI) - MOVQ R10,32(DI) - RET diff --git a/vendor/golang.org/x/crypto/ed25519/ed25519.go b/vendor/golang.org/x/crypto/ed25519/ed25519.go deleted file mode 100644 index d6f683ba3f78..000000000000 --- a/vendor/golang.org/x/crypto/ed25519/ed25519.go +++ /dev/null @@ -1,217 +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. - -// Package ed25519 implements the Ed25519 signature algorithm. See -// https://ed25519.cr.yp.to/. -// -// These functions are also compatible with the “Ed25519” function defined in -// RFC 8032. However, unlike RFC 8032's formulation, this package's private key -// representation includes a public key suffix to make multiple signing -// operations with the same key more efficient. This package refers to the RFC -// 8032 private key as the “seed”. -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" - "errors" - "io" - "strconv" - - "golang.org/x/crypto/ed25519/internal/edwards25519" -) - -const ( - // PublicKeySize is the size, in bytes, of public keys as used in this package. - PublicKeySize = 32 - // PrivateKeySize is the size, in bytes, of private keys as used in this package. - PrivateKeySize = 64 - // SignatureSize is the size, in bytes, of signatures generated and verified by this package. - SignatureSize = 64 - // SeedSize is the size, in bytes, of private key seeds. These are the private key representations used by RFC 8032. - SeedSize = 32 -) - -// PublicKey is the type of Ed25519 public keys. -type PublicKey []byte - -// PrivateKey is the type of Ed25519 private keys. It implements crypto.Signer. -type PrivateKey []byte - -// Public returns the PublicKey corresponding to priv. -func (priv PrivateKey) Public() crypto.PublicKey { - publicKey := make([]byte, PublicKeySize) - copy(publicKey, priv[32:]) - return PublicKey(publicKey) -} - -// Seed returns the private key seed corresponding to priv. It is provided for -// interoperability with RFC 8032. RFC 8032's private keys correspond to seeds -// in this package. -func (priv PrivateKey) Seed() []byte { - seed := make([]byte, SeedSize) - copy(seed, priv[:32]) - return seed -} - -// Sign signs the given message with priv. -// Ed25519 performs two passes over messages to be signed and therefore cannot -// handle pre-hashed messages. Thus opts.HashFunc() must return zero to -// indicate the message hasn't been hashed. This can be achieved by passing -// crypto.Hash(0) as the value for opts. -func (priv PrivateKey) Sign(rand io.Reader, message []byte, opts crypto.SignerOpts) (signature []byte, err error) { - if opts.HashFunc() != crypto.Hash(0) { - return nil, errors.New("ed25519: cannot sign hashed message") - } - - return Sign(priv, message), nil -} - -// GenerateKey generates a public/private key pair using entropy from rand. -// If rand is nil, crypto/rand.Reader will be used. -func GenerateKey(rand io.Reader) (PublicKey, PrivateKey, error) { - if rand == nil { - rand = cryptorand.Reader - } - - seed := make([]byte, SeedSize) - if _, err := io.ReadFull(rand, seed); err != nil { - return nil, nil, err - } - - privateKey := NewKeyFromSeed(seed) - publicKey := make([]byte, PublicKeySize) - copy(publicKey, privateKey[32:]) - - return publicKey, privateKey, nil -} - -// NewKeyFromSeed calculates a private key from a seed. It will panic if -// len(seed) is not SeedSize. This function is provided for interoperability -// with RFC 8032. RFC 8032's private keys correspond to seeds in this -// package. -func NewKeyFromSeed(seed []byte) PrivateKey { - if l := len(seed); l != SeedSize { - panic("ed25519: bad seed length: " + strconv.Itoa(l)) - } - - digest := sha512.Sum512(seed) - digest[0] &= 248 - digest[31] &= 127 - digest[31] |= 64 - - var A edwards25519.ExtendedGroupElement - var hBytes [32]byte - copy(hBytes[:], digest[:]) - edwards25519.GeScalarMultBase(&A, &hBytes) - var publicKeyBytes [32]byte - A.ToBytes(&publicKeyBytes) - - privateKey := make([]byte, PrivateKeySize) - copy(privateKey, seed) - copy(privateKey[32:], publicKeyBytes[:]) - - return privateKey -} - -// Sign signs the message with privateKey and returns a signature. It will -// panic if len(privateKey) is not PrivateKeySize. -func Sign(privateKey PrivateKey, message []byte) []byte { - if l := len(privateKey); l != PrivateKeySize { - panic("ed25519: bad private key length: " + strconv.Itoa(l)) - } - - h := sha512.New() - h.Write(privateKey[:32]) - - var digest1, messageDigest, hramDigest [64]byte - var expandedSecretKey [32]byte - h.Sum(digest1[:0]) - copy(expandedSecretKey[:], digest1[:]) - expandedSecretKey[0] &= 248 - expandedSecretKey[31] &= 63 - expandedSecretKey[31] |= 64 - - h.Reset() - h.Write(digest1[32:]) - h.Write(message) - h.Sum(messageDigest[:0]) - - var messageDigestReduced [32]byte - edwards25519.ScReduce(&messageDigestReduced, &messageDigest) - var R edwards25519.ExtendedGroupElement - edwards25519.GeScalarMultBase(&R, &messageDigestReduced) - - var encodedR [32]byte - R.ToBytes(&encodedR) - - h.Reset() - h.Write(encodedR[:]) - h.Write(privateKey[32:]) - h.Write(message) - h.Sum(hramDigest[:0]) - var hramDigestReduced [32]byte - edwards25519.ScReduce(&hramDigestReduced, &hramDigest) - - var s [32]byte - edwards25519.ScMulAdd(&s, &hramDigestReduced, &expandedSecretKey, &messageDigestReduced) - - signature := make([]byte, SignatureSize) - copy(signature[:], encodedR[:]) - copy(signature[32:], s[:]) - - return signature -} - -// Verify reports whether sig is a valid signature of message by publicKey. It -// will panic if len(publicKey) is not PublicKeySize. -func Verify(publicKey PublicKey, message, sig []byte) bool { - if l := len(publicKey); l != PublicKeySize { - panic("ed25519: bad public key length: " + strconv.Itoa(l)) - } - - if len(sig) != SignatureSize || sig[63]&224 != 0 { - return false - } - - var A edwards25519.ExtendedGroupElement - var publicKeyBytes [32]byte - copy(publicKeyBytes[:], publicKey) - if !A.FromBytes(&publicKeyBytes) { - return false - } - edwards25519.FeNeg(&A.X, &A.X) - edwards25519.FeNeg(&A.T, &A.T) - - h := sha512.New() - h.Write(sig[:32]) - h.Write(publicKey[:]) - h.Write(message) - var digest [64]byte - h.Sum(digest[:0]) - - var hReduced [32]byte - edwards25519.ScReduce(&hReduced, &digest) - - var R edwards25519.ProjectiveGroupElement - var s [32]byte - copy(s[:], sig[32:]) - - // https://tools.ietf.org/html/rfc8032#section-5.1.7 requires that s be in - // the range [0, order) in order to prevent signature malleability. - if !edwards25519.ScMinimal(&s) { - return false - } - - edwards25519.GeDoubleScalarMultVartime(&R, &hReduced, &A, &s) - - var checkR [32]byte - R.ToBytes(&checkR) - return bytes.Equal(sig[:32], checkR[:]) -} diff --git a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/const.go b/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/const.go deleted file mode 100644 index e39f086c1d87..000000000000 --- a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/const.go +++ /dev/null @@ -1,1422 +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. - -package edwards25519 - -// These values are from the public domain, “ref10” implementation of ed25519 -// from SUPERCOP. - -// d is a constant in the Edwards curve equation. -var d = FieldElement{ - -10913610, 13857413, -15372611, 6949391, 114729, -8787816, -6275908, -3247719, -18696448, -12055116, -} - -// d2 is 2*d. -var d2 = FieldElement{ - -21827239, -5839606, -30745221, 13898782, 229458, 15978800, -12551817, -6495438, 29715968, 9444199, -} - -// SqrtM1 is the square-root of -1 in the field. -var SqrtM1 = FieldElement{ - -32595792, -7943725, 9377950, 3500415, 12389472, -272473, -25146209, -2005654, 326686, 11406482, -} - -// A is a constant in the Montgomery-form of curve25519. -var A = FieldElement{ - 486662, 0, 0, 0, 0, 0, 0, 0, 0, 0, -} - -// bi contains precomputed multiples of the base-point. See the Ed25519 paper -// for a discussion about how these values are used. -var bi = [8]PreComputedGroupElement{ - { - FieldElement{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605}, - FieldElement{-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378}, - FieldElement{-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546}, - }, - { - FieldElement{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024}, - FieldElement{16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574}, - FieldElement{30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357}, - }, - { - FieldElement{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380}, - FieldElement{4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306}, - FieldElement{19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942}, - }, - { - FieldElement{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766}, - FieldElement{-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701}, - FieldElement{28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300}, - }, - { - FieldElement{-22518993, -6692182, 14201702, -8745502, -23510406, 8844726, 18474211, -1361450, -13062696, 13821877}, - FieldElement{-6455177, -7839871, 3374702, -4740862, -27098617, -10571707, 31655028, -7212327, 18853322, -14220951}, - FieldElement{4566830, -12963868, -28974889, -12240689, -7602672, -2830569, -8514358, -10431137, 2207753, -3209784}, - }, - { - FieldElement{-25154831, -4185821, 29681144, 7868801, -6854661, -9423865, -12437364, -663000, -31111463, -16132436}, - FieldElement{25576264, -2703214, 7349804, -11814844, 16472782, 9300885, 3844789, 15725684, 171356, 6466918}, - FieldElement{23103977, 13316479, 9739013, -16149481, 817875, -15038942, 8965339, -14088058, -30714912, 16193877}, - }, - { - FieldElement{-33521811, 3180713, -2394130, 14003687, -16903474, -16270840, 17238398, 4729455, -18074513, 9256800}, - FieldElement{-25182317, -4174131, 32336398, 5036987, -21236817, 11360617, 22616405, 9761698, -19827198, 630305}, - FieldElement{-13720693, 2639453, -24237460, -7406481, 9494427, -5774029, -6554551, -15960994, -2449256, -14291300}, - }, - { - FieldElement{-3151181, -5046075, 9282714, 6866145, -31907062, -863023, -18940575, 15033784, 25105118, -7894876}, - FieldElement{-24326370, 15950226, -31801215, -14592823, -11662737, -5090925, 1573892, -2625887, 2198790, -15804619}, - FieldElement{-3099351, 10324967, -2241613, 7453183, -5446979, -2735503, -13812022, -16236442, -32461234, -12290683}, - }, -} - -// base contains precomputed multiples of the base-point. See the Ed25519 paper -// for a discussion about how these values are used. -var base = [32][8]PreComputedGroupElement{ - { - { - FieldElement{25967493, -14356035, 29566456, 3660896, -12694345, 4014787, 27544626, -11754271, -6079156, 2047605}, - FieldElement{-12545711, 934262, -2722910, 3049990, -727428, 9406986, 12720692, 5043384, 19500929, -15469378}, - FieldElement{-8738181, 4489570, 9688441, -14785194, 10184609, -12363380, 29287919, 11864899, -24514362, -4438546}, - }, - { - FieldElement{-12815894, -12976347, -21581243, 11784320, -25355658, -2750717, -11717903, -3814571, -358445, -10211303}, - FieldElement{-21703237, 6903825, 27185491, 6451973, -29577724, -9554005, -15616551, 11189268, -26829678, -5319081}, - FieldElement{26966642, 11152617, 32442495, 15396054, 14353839, -12752335, -3128826, -9541118, -15472047, -4166697}, - }, - { - FieldElement{15636291, -9688557, 24204773, -7912398, 616977, -16685262, 27787600, -14772189, 28944400, -1550024}, - FieldElement{16568933, 4717097, -11556148, -1102322, 15682896, -11807043, 16354577, -11775962, 7689662, 11199574}, - FieldElement{30464156, -5976125, -11779434, -15670865, 23220365, 15915852, 7512774, 10017326, -17749093, -9920357}, - }, - { - FieldElement{-17036878, 13921892, 10945806, -6033431, 27105052, -16084379, -28926210, 15006023, 3284568, -6276540}, - FieldElement{23599295, -8306047, -11193664, -7687416, 13236774, 10506355, 7464579, 9656445, 13059162, 10374397}, - FieldElement{7798556, 16710257, 3033922, 2874086, 28997861, 2835604, 32406664, -3839045, -641708, -101325}, - }, - { - FieldElement{10861363, 11473154, 27284546, 1981175, -30064349, 12577861, 32867885, 14515107, -15438304, 10819380}, - FieldElement{4708026, 6336745, 20377586, 9066809, -11272109, 6594696, -25653668, 12483688, -12668491, 5581306}, - FieldElement{19563160, 16186464, -29386857, 4097519, 10237984, -4348115, 28542350, 13850243, -23678021, -15815942}, - }, - { - FieldElement{-15371964, -12862754, 32573250, 4720197, -26436522, 5875511, -19188627, -15224819, -9818940, -12085777}, - FieldElement{-8549212, 109983, 15149363, 2178705, 22900618, 4543417, 3044240, -15689887, 1762328, 14866737}, - FieldElement{-18199695, -15951423, -10473290, 1707278, -17185920, 3916101, -28236412, 3959421, 27914454, 4383652}, - }, - { - FieldElement{5153746, 9909285, 1723747, -2777874, 30523605, 5516873, 19480852, 5230134, -23952439, -15175766}, - FieldElement{-30269007, -3463509, 7665486, 10083793, 28475525, 1649722, 20654025, 16520125, 30598449, 7715701}, - FieldElement{28881845, 14381568, 9657904, 3680757, -20181635, 7843316, -31400660, 1370708, 29794553, -1409300}, - }, - { - FieldElement{14499471, -2729599, -33191113, -4254652, 28494862, 14271267, 30290735, 10876454, -33154098, 2381726}, - FieldElement{-7195431, -2655363, -14730155, 462251, -27724326, 3941372, -6236617, 3696005, -32300832, 15351955}, - FieldElement{27431194, 8222322, 16448760, -3907995, -18707002, 11938355, -32961401, -2970515, 29551813, 10109425}, - }, - }, - { - { - FieldElement{-13657040, -13155431, -31283750, 11777098, 21447386, 6519384, -2378284, -1627556, 10092783, -4764171}, - FieldElement{27939166, 14210322, 4677035, 16277044, -22964462, -12398139, -32508754, 12005538, -17810127, 12803510}, - FieldElement{17228999, -15661624, -1233527, 300140, -1224870, -11714777, 30364213, -9038194, 18016357, 4397660}, - }, - { - FieldElement{-10958843, -7690207, 4776341, -14954238, 27850028, -15602212, -26619106, 14544525, -17477504, 982639}, - FieldElement{29253598, 15796703, -2863982, -9908884, 10057023, 3163536, 7332899, -4120128, -21047696, 9934963}, - FieldElement{5793303, 16271923, -24131614, -10116404, 29188560, 1206517, -14747930, 4559895, -30123922, -10897950}, - }, - { - FieldElement{-27643952, -11493006, 16282657, -11036493, 28414021, -15012264, 24191034, 4541697, -13338309, 5500568}, - FieldElement{12650548, -1497113, 9052871, 11355358, -17680037, -8400164, -17430592, 12264343, 10874051, 13524335}, - FieldElement{25556948, -3045990, 714651, 2510400, 23394682, -10415330, 33119038, 5080568, -22528059, 5376628}, - }, - { - FieldElement{-26088264, -4011052, -17013699, -3537628, -6726793, 1920897, -22321305, -9447443, 4535768, 1569007}, - FieldElement{-2255422, 14606630, -21692440, -8039818, 28430649, 8775819, -30494562, 3044290, 31848280, 12543772}, - FieldElement{-22028579, 2943893, -31857513, 6777306, 13784462, -4292203, -27377195, -2062731, 7718482, 14474653}, - }, - { - FieldElement{2385315, 2454213, -22631320, 46603, -4437935, -15680415, 656965, -7236665, 24316168, -5253567}, - FieldElement{13741529, 10911568, -33233417, -8603737, -20177830, -1033297, 33040651, -13424532, -20729456, 8321686}, - FieldElement{21060490, -2212744, 15712757, -4336099, 1639040, 10656336, 23845965, -11874838, -9984458, 608372}, - }, - { - FieldElement{-13672732, -15087586, -10889693, -7557059, -6036909, 11305547, 1123968, -6780577, 27229399, 23887}, - FieldElement{-23244140, -294205, -11744728, 14712571, -29465699, -2029617, 12797024, -6440308, -1633405, 16678954}, - FieldElement{-29500620, 4770662, -16054387, 14001338, 7830047, 9564805, -1508144, -4795045, -17169265, 4904953}, - }, - { - FieldElement{24059557, 14617003, 19037157, -15039908, 19766093, -14906429, 5169211, 16191880, 2128236, -4326833}, - FieldElement{-16981152, 4124966, -8540610, -10653797, 30336522, -14105247, -29806336, 916033, -6882542, -2986532}, - FieldElement{-22630907, 12419372, -7134229, -7473371, -16478904, 16739175, 285431, 2763829, 15736322, 4143876}, - }, - { - FieldElement{2379352, 11839345, -4110402, -5988665, 11274298, 794957, 212801, -14594663, 23527084, -16458268}, - FieldElement{33431127, -11130478, -17838966, -15626900, 8909499, 8376530, -32625340, 4087881, -15188911, -14416214}, - FieldElement{1767683, 7197987, -13205226, -2022635, -13091350, 448826, 5799055, 4357868, -4774191, -16323038}, - }, - }, - { - { - FieldElement{6721966, 13833823, -23523388, -1551314, 26354293, -11863321, 23365147, -3949732, 7390890, 2759800}, - FieldElement{4409041, 2052381, 23373853, 10530217, 7676779, -12885954, 21302353, -4264057, 1244380, -12919645}, - FieldElement{-4421239, 7169619, 4982368, -2957590, 30256825, -2777540, 14086413, 9208236, 15886429, 16489664}, - }, - { - FieldElement{1996075, 10375649, 14346367, 13311202, -6874135, -16438411, -13693198, 398369, -30606455, -712933}, - FieldElement{-25307465, 9795880, -2777414, 14878809, -33531835, 14780363, 13348553, 12076947, -30836462, 5113182}, - FieldElement{-17770784, 11797796, 31950843, 13929123, -25888302, 12288344, -30341101, -7336386, 13847711, 5387222}, - }, - { - FieldElement{-18582163, -3416217, 17824843, -2340966, 22744343, -10442611, 8763061, 3617786, -19600662, 10370991}, - FieldElement{20246567, -14369378, 22358229, -543712, 18507283, -10413996, 14554437, -8746092, 32232924, 16763880}, - FieldElement{9648505, 10094563, 26416693, 14745928, -30374318, -6472621, 11094161, 15689506, 3140038, -16510092}, - }, - { - FieldElement{-16160072, 5472695, 31895588, 4744994, 8823515, 10365685, -27224800, 9448613, -28774454, 366295}, - FieldElement{19153450, 11523972, -11096490, -6503142, -24647631, 5420647, 28344573, 8041113, 719605, 11671788}, - FieldElement{8678025, 2694440, -6808014, 2517372, 4964326, 11152271, -15432916, -15266516, 27000813, -10195553}, - }, - { - FieldElement{-15157904, 7134312, 8639287, -2814877, -7235688, 10421742, 564065, 5336097, 6750977, -14521026}, - FieldElement{11836410, -3979488, 26297894, 16080799, 23455045, 15735944, 1695823, -8819122, 8169720, 16220347}, - FieldElement{-18115838, 8653647, 17578566, -6092619, -8025777, -16012763, -11144307, -2627664, -5990708, -14166033}, - }, - { - FieldElement{-23308498, -10968312, 15213228, -10081214, -30853605, -11050004, 27884329, 2847284, 2655861, 1738395}, - FieldElement{-27537433, -14253021, -25336301, -8002780, -9370762, 8129821, 21651608, -3239336, -19087449, -11005278}, - FieldElement{1533110, 3437855, 23735889, 459276, 29970501, 11335377, 26030092, 5821408, 10478196, 8544890}, - }, - { - FieldElement{32173121, -16129311, 24896207, 3921497, 22579056, -3410854, 19270449, 12217473, 17789017, -3395995}, - FieldElement{-30552961, -2228401, -15578829, -10147201, 13243889, 517024, 15479401, -3853233, 30460520, 1052596}, - FieldElement{-11614875, 13323618, 32618793, 8175907, -15230173, 12596687, 27491595, -4612359, 3179268, -9478891}, - }, - { - FieldElement{31947069, -14366651, -4640583, -15339921, -15125977, -6039709, -14756777, -16411740, 19072640, -9511060}, - FieldElement{11685058, 11822410, 3158003, -13952594, 33402194, -4165066, 5977896, -5215017, 473099, 5040608}, - FieldElement{-20290863, 8198642, -27410132, 11602123, 1290375, -2799760, 28326862, 1721092, -19558642, -3131606}, - }, - }, - { - { - FieldElement{7881532, 10687937, 7578723, 7738378, -18951012, -2553952, 21820786, 8076149, -27868496, 11538389}, - FieldElement{-19935666, 3899861, 18283497, -6801568, -15728660, -11249211, 8754525, 7446702, -5676054, 5797016}, - FieldElement{-11295600, -3793569, -15782110, -7964573, 12708869, -8456199, 2014099, -9050574, -2369172, -5877341}, - }, - { - FieldElement{-22472376, -11568741, -27682020, 1146375, 18956691, 16640559, 1192730, -3714199, 15123619, 10811505}, - FieldElement{14352098, -3419715, -18942044, 10822655, 32750596, 4699007, -70363, 15776356, -28886779, -11974553}, - FieldElement{-28241164, -8072475, -4978962, -5315317, 29416931, 1847569, -20654173, -16484855, 4714547, -9600655}, - }, - { - FieldElement{15200332, 8368572, 19679101, 15970074, -31872674, 1959451, 24611599, -4543832, -11745876, 12340220}, - FieldElement{12876937, -10480056, 33134381, 6590940, -6307776, 14872440, 9613953, 8241152, 15370987, 9608631}, - FieldElement{-4143277, -12014408, 8446281, -391603, 4407738, 13629032, -7724868, 15866074, -28210621, -8814099}, - }, - { - FieldElement{26660628, -15677655, 8393734, 358047, -7401291, 992988, -23904233, 858697, 20571223, 8420556}, - FieldElement{14620715, 13067227, -15447274, 8264467, 14106269, 15080814, 33531827, 12516406, -21574435, -12476749}, - FieldElement{236881, 10476226, 57258, -14677024, 6472998, 2466984, 17258519, 7256740, 8791136, 15069930}, - }, - { - FieldElement{1276410, -9371918, 22949635, -16322807, -23493039, -5702186, 14711875, 4874229, -30663140, -2331391}, - FieldElement{5855666, 4990204, -13711848, 7294284, -7804282, 1924647, -1423175, -7912378, -33069337, 9234253}, - FieldElement{20590503, -9018988, 31529744, -7352666, -2706834, 10650548, 31559055, -11609587, 18979186, 13396066}, - }, - { - FieldElement{24474287, 4968103, 22267082, 4407354, 24063882, -8325180, -18816887, 13594782, 33514650, 7021958}, - FieldElement{-11566906, -6565505, -21365085, 15928892, -26158305, 4315421, -25948728, -3916677, -21480480, 12868082}, - FieldElement{-28635013, 13504661, 19988037, -2132761, 21078225, 6443208, -21446107, 2244500, -12455797, -8089383}, - }, - { - FieldElement{-30595528, 13793479, -5852820, 319136, -25723172, -6263899, 33086546, 8957937, -15233648, 5540521}, - FieldElement{-11630176, -11503902, -8119500, -7643073, 2620056, 1022908, -23710744, -1568984, -16128528, -14962807}, - FieldElement{23152971, 775386, 27395463, 14006635, -9701118, 4649512, 1689819, 892185, -11513277, -15205948}, - }, - { - FieldElement{9770129, 9586738, 26496094, 4324120, 1556511, -3550024, 27453819, 4763127, -19179614, 5867134}, - FieldElement{-32765025, 1927590, 31726409, -4753295, 23962434, -16019500, 27846559, 5931263, -29749703, -16108455}, - FieldElement{27461885, -2977536, 22380810, 1815854, -23033753, -3031938, 7283490, -15148073, -19526700, 7734629}, - }, - }, - { - { - FieldElement{-8010264, -9590817, -11120403, 6196038, 29344158, -13430885, 7585295, -3176626, 18549497, 15302069}, - FieldElement{-32658337, -6171222, -7672793, -11051681, 6258878, 13504381, 10458790, -6418461, -8872242, 8424746}, - FieldElement{24687205, 8613276, -30667046, -3233545, 1863892, -1830544, 19206234, 7134917, -11284482, -828919}, - }, - { - FieldElement{11334899, -9218022, 8025293, 12707519, 17523892, -10476071, 10243738, -14685461, -5066034, 16498837}, - FieldElement{8911542, 6887158, -9584260, -6958590, 11145641, -9543680, 17303925, -14124238, 6536641, 10543906}, - FieldElement{-28946384, 15479763, -17466835, 568876, -1497683, 11223454, -2669190, -16625574, -27235709, 8876771}, - }, - { - FieldElement{-25742899, -12566864, -15649966, -846607, -33026686, -796288, -33481822, 15824474, -604426, -9039817}, - FieldElement{10330056, 70051, 7957388, -9002667, 9764902, 15609756, 27698697, -4890037, 1657394, 3084098}, - FieldElement{10477963, -7470260, 12119566, -13250805, 29016247, -5365589, 31280319, 14396151, -30233575, 15272409}, - }, - { - FieldElement{-12288309, 3169463, 28813183, 16658753, 25116432, -5630466, -25173957, -12636138, -25014757, 1950504}, - FieldElement{-26180358, 9489187, 11053416, -14746161, -31053720, 5825630, -8384306, -8767532, 15341279, 8373727}, - FieldElement{28685821, 7759505, -14378516, -12002860, -31971820, 4079242, 298136, -10232602, -2878207, 15190420}, - }, - { - FieldElement{-32932876, 13806336, -14337485, -15794431, -24004620, 10940928, 8669718, 2742393, -26033313, -6875003}, - FieldElement{-1580388, -11729417, -25979658, -11445023, -17411874, -10912854, 9291594, -16247779, -12154742, 6048605}, - FieldElement{-30305315, 14843444, 1539301, 11864366, 20201677, 1900163, 13934231, 5128323, 11213262, 9168384}, - }, - { - FieldElement{-26280513, 11007847, 19408960, -940758, -18592965, -4328580, -5088060, -11105150, 20470157, -16398701}, - FieldElement{-23136053, 9282192, 14855179, -15390078, -7362815, -14408560, -22783952, 14461608, 14042978, 5230683}, - FieldElement{29969567, -2741594, -16711867, -8552442, 9175486, -2468974, 21556951, 3506042, -5933891, -12449708}, - }, - { - FieldElement{-3144746, 8744661, 19704003, 4581278, -20430686, 6830683, -21284170, 8971513, -28539189, 15326563}, - FieldElement{-19464629, 10110288, -17262528, -3503892, -23500387, 1355669, -15523050, 15300988, -20514118, 9168260}, - FieldElement{-5353335, 4488613, -23803248, 16314347, 7780487, -15638939, -28948358, 9601605, 33087103, -9011387}, - }, - { - FieldElement{-19443170, -15512900, -20797467, -12445323, -29824447, 10229461, -27444329, -15000531, -5996870, 15664672}, - FieldElement{23294591, -16632613, -22650781, -8470978, 27844204, 11461195, 13099750, -2460356, 18151676, 13417686}, - FieldElement{-24722913, -4176517, -31150679, 5988919, -26858785, 6685065, 1661597, -12551441, 15271676, -15452665}, - }, - }, - { - { - FieldElement{11433042, -13228665, 8239631, -5279517, -1985436, -725718, -18698764, 2167544, -6921301, -13440182}, - FieldElement{-31436171, 15575146, 30436815, 12192228, -22463353, 9395379, -9917708, -8638997, 12215110, 12028277}, - FieldElement{14098400, 6555944, 23007258, 5757252, -15427832, -12950502, 30123440, 4617780, -16900089, -655628}, - }, - { - FieldElement{-4026201, -15240835, 11893168, 13718664, -14809462, 1847385, -15819999, 10154009, 23973261, -12684474}, - FieldElement{-26531820, -3695990, -1908898, 2534301, -31870557, -16550355, 18341390, -11419951, 32013174, -10103539}, - FieldElement{-25479301, 10876443, -11771086, -14625140, -12369567, 1838104, 21911214, 6354752, 4425632, -837822}, - }, - { - FieldElement{-10433389, -14612966, 22229858, -3091047, -13191166, 776729, -17415375, -12020462, 4725005, 14044970}, - FieldElement{19268650, -7304421, 1555349, 8692754, -21474059, -9910664, 6347390, -1411784, -19522291, -16109756}, - FieldElement{-24864089, 12986008, -10898878, -5558584, -11312371, -148526, 19541418, 8180106, 9282262, 10282508}, - }, - { - FieldElement{-26205082, 4428547, -8661196, -13194263, 4098402, -14165257, 15522535, 8372215, 5542595, -10702683}, - FieldElement{-10562541, 14895633, 26814552, -16673850, -17480754, -2489360, -2781891, 6993761, -18093885, 10114655}, - FieldElement{-20107055, -929418, 31422704, 10427861, -7110749, 6150669, -29091755, -11529146, 25953725, -106158}, - }, - { - FieldElement{-4234397, -8039292, -9119125, 3046000, 2101609, -12607294, 19390020, 6094296, -3315279, 12831125}, - FieldElement{-15998678, 7578152, 5310217, 14408357, -33548620, -224739, 31575954, 6326196, 7381791, -2421839}, - FieldElement{-20902779, 3296811, 24736065, -16328389, 18374254, 7318640, 6295303, 8082724, -15362489, 12339664}, - }, - { - FieldElement{27724736, 2291157, 6088201, -14184798, 1792727, 5857634, 13848414, 15768922, 25091167, 14856294}, - FieldElement{-18866652, 8331043, 24373479, 8541013, -701998, -9269457, 12927300, -12695493, -22182473, -9012899}, - FieldElement{-11423429, -5421590, 11632845, 3405020, 30536730, -11674039, -27260765, 13866390, 30146206, 9142070}, - }, - { - FieldElement{3924129, -15307516, -13817122, -10054960, 12291820, -668366, -27702774, 9326384, -8237858, 4171294}, - FieldElement{-15921940, 16037937, 6713787, 16606682, -21612135, 2790944, 26396185, 3731949, 345228, -5462949}, - FieldElement{-21327538, 13448259, 25284571, 1143661, 20614966, -8849387, 2031539, -12391231, -16253183, -13582083}, - }, - { - FieldElement{31016211, -16722429, 26371392, -14451233, -5027349, 14854137, 17477601, 3842657, 28012650, -16405420}, - FieldElement{-5075835, 9368966, -8562079, -4600902, -15249953, 6970560, -9189873, 16292057, -8867157, 3507940}, - FieldElement{29439664, 3537914, 23333589, 6997794, -17555561, -11018068, -15209202, -15051267, -9164929, 6580396}, - }, - }, - { - { - FieldElement{-12185861, -7679788, 16438269, 10826160, -8696817, -6235611, 17860444, -9273846, -2095802, 9304567}, - FieldElement{20714564, -4336911, 29088195, 7406487, 11426967, -5095705, 14792667, -14608617, 5289421, -477127}, - FieldElement{-16665533, -10650790, -6160345, -13305760, 9192020, -1802462, 17271490, 12349094, 26939669, -3752294}, - }, - { - FieldElement{-12889898, 9373458, 31595848, 16374215, 21471720, 13221525, -27283495, -12348559, -3698806, 117887}, - FieldElement{22263325, -6560050, 3984570, -11174646, -15114008, -566785, 28311253, 5358056, -23319780, 541964}, - FieldElement{16259219, 3261970, 2309254, -15534474, -16885711, -4581916, 24134070, -16705829, -13337066, -13552195}, - }, - { - FieldElement{9378160, -13140186, -22845982, -12745264, 28198281, -7244098, -2399684, -717351, 690426, 14876244}, - FieldElement{24977353, -314384, -8223969, -13465086, 28432343, -1176353, -13068804, -12297348, -22380984, 6618999}, - FieldElement{-1538174, 11685646, 12944378, 13682314, -24389511, -14413193, 8044829, -13817328, 32239829, -5652762}, - }, - { - FieldElement{-18603066, 4762990, -926250, 8885304, -28412480, -3187315, 9781647, -10350059, 32779359, 5095274}, - FieldElement{-33008130, -5214506, -32264887, -3685216, 9460461, -9327423, -24601656, 14506724, 21639561, -2630236}, - FieldElement{-16400943, -13112215, 25239338, 15531969, 3987758, -4499318, -1289502, -6863535, 17874574, 558605}, - }, - { - FieldElement{-13600129, 10240081, 9171883, 16131053, -20869254, 9599700, 33499487, 5080151, 2085892, 5119761}, - FieldElement{-22205145, -2519528, -16381601, 414691, -25019550, 2170430, 30634760, -8363614, -31999993, -5759884}, - FieldElement{-6845704, 15791202, 8550074, -1312654, 29928809, -12092256, 27534430, -7192145, -22351378, 12961482}, - }, - { - FieldElement{-24492060, -9570771, 10368194, 11582341, -23397293, -2245287, 16533930, 8206996, -30194652, -5159638}, - FieldElement{-11121496, -3382234, 2307366, 6362031, -135455, 8868177, -16835630, 7031275, 7589640, 8945490}, - FieldElement{-32152748, 8917967, 6661220, -11677616, -1192060, -15793393, 7251489, -11182180, 24099109, -14456170}, - }, - { - FieldElement{5019558, -7907470, 4244127, -14714356, -26933272, 6453165, -19118182, -13289025, -6231896, -10280736}, - FieldElement{10853594, 10721687, 26480089, 5861829, -22995819, 1972175, -1866647, -10557898, -3363451, -6441124}, - FieldElement{-17002408, 5906790, 221599, -6563147, 7828208, -13248918, 24362661, -2008168, -13866408, 7421392}, - }, - { - FieldElement{8139927, -6546497, 32257646, -5890546, 30375719, 1886181, -21175108, 15441252, 28826358, -4123029}, - FieldElement{6267086, 9695052, 7709135, -16603597, -32869068, -1886135, 14795160, -7840124, 13746021, -1742048}, - FieldElement{28584902, 7787108, -6732942, -15050729, 22846041, -7571236, -3181936, -363524, 4771362, -8419958}, - }, - }, - { - { - FieldElement{24949256, 6376279, -27466481, -8174608, -18646154, -9930606, 33543569, -12141695, 3569627, 11342593}, - FieldElement{26514989, 4740088, 27912651, 3697550, 19331575, -11472339, 6809886, 4608608, 7325975, -14801071}, - FieldElement{-11618399, -14554430, -24321212, 7655128, -1369274, 5214312, -27400540, 10258390, -17646694, -8186692}, - }, - { - FieldElement{11431204, 15823007, 26570245, 14329124, 18029990, 4796082, -31446179, 15580664, 9280358, -3973687}, - FieldElement{-160783, -10326257, -22855316, -4304997, -20861367, -13621002, -32810901, -11181622, -15545091, 4387441}, - FieldElement{-20799378, 12194512, 3937617, -5805892, -27154820, 9340370, -24513992, 8548137, 20617071, -7482001}, - }, - { - FieldElement{-938825, -3930586, -8714311, 16124718, 24603125, -6225393, -13775352, -11875822, 24345683, 10325460}, - FieldElement{-19855277, -1568885, -22202708, 8714034, 14007766, 6928528, 16318175, -1010689, 4766743, 3552007}, - FieldElement{-21751364, -16730916, 1351763, -803421, -4009670, 3950935, 3217514, 14481909, 10988822, -3994762}, - }, - { - FieldElement{15564307, -14311570, 3101243, 5684148, 30446780, -8051356, 12677127, -6505343, -8295852, 13296005}, - FieldElement{-9442290, 6624296, -30298964, -11913677, -4670981, -2057379, 31521204, 9614054, -30000824, 12074674}, - FieldElement{4771191, -135239, 14290749, -13089852, 27992298, 14998318, -1413936, -1556716, 29832613, -16391035}, - }, - { - FieldElement{7064884, -7541174, -19161962, -5067537, -18891269, -2912736, 25825242, 5293297, -27122660, 13101590}, - FieldElement{-2298563, 2439670, -7466610, 1719965, -27267541, -16328445, 32512469, -5317593, -30356070, -4190957}, - FieldElement{-30006540, 10162316, -33180176, 3981723, -16482138, -13070044, 14413974, 9515896, 19568978, 9628812}, - }, - { - FieldElement{33053803, 199357, 15894591, 1583059, 27380243, -4580435, -17838894, -6106839, -6291786, 3437740}, - FieldElement{-18978877, 3884493, 19469877, 12726490, 15913552, 13614290, -22961733, 70104, 7463304, 4176122}, - FieldElement{-27124001, 10659917, 11482427, -16070381, 12771467, -6635117, -32719404, -5322751, 24216882, 5944158}, - }, - { - FieldElement{8894125, 7450974, -2664149, -9765752, -28080517, -12389115, 19345746, 14680796, 11632993, 5847885}, - FieldElement{26942781, -2315317, 9129564, -4906607, 26024105, 11769399, -11518837, 6367194, -9727230, 4782140}, - FieldElement{19916461, -4828410, -22910704, -11414391, 25606324, -5972441, 33253853, 8220911, 6358847, -1873857}, - }, - { - FieldElement{801428, -2081702, 16569428, 11065167, 29875704, 96627, 7908388, -4480480, -13538503, 1387155}, - FieldElement{19646058, 5720633, -11416706, 12814209, 11607948, 12749789, 14147075, 15156355, -21866831, 11835260}, - FieldElement{19299512, 1155910, 28703737, 14890794, 2925026, 7269399, 26121523, 15467869, -26560550, 5052483}, - }, - }, - { - { - FieldElement{-3017432, 10058206, 1980837, 3964243, 22160966, 12322533, -6431123, -12618185, 12228557, -7003677}, - FieldElement{32944382, 14922211, -22844894, 5188528, 21913450, -8719943, 4001465, 13238564, -6114803, 8653815}, - FieldElement{22865569, -4652735, 27603668, -12545395, 14348958, 8234005, 24808405, 5719875, 28483275, 2841751}, - }, - { - FieldElement{-16420968, -1113305, -327719, -12107856, 21886282, -15552774, -1887966, -315658, 19932058, -12739203}, - FieldElement{-11656086, 10087521, -8864888, -5536143, -19278573, -3055912, 3999228, 13239134, -4777469, -13910208}, - FieldElement{1382174, -11694719, 17266790, 9194690, -13324356, 9720081, 20403944, 11284705, -14013818, 3093230}, - }, - { - FieldElement{16650921, -11037932, -1064178, 1570629, -8329746, 7352753, -302424, 16271225, -24049421, -6691850}, - FieldElement{-21911077, -5927941, -4611316, -5560156, -31744103, -10785293, 24123614, 15193618, -21652117, -16739389}, - FieldElement{-9935934, -4289447, -25279823, 4372842, 2087473, 10399484, 31870908, 14690798, 17361620, 11864968}, - }, - { - FieldElement{-11307610, 6210372, 13206574, 5806320, -29017692, -13967200, -12331205, -7486601, -25578460, -16240689}, - FieldElement{14668462, -12270235, 26039039, 15305210, 25515617, 4542480, 10453892, 6577524, 9145645, -6443880}, - FieldElement{5974874, 3053895, -9433049, -10385191, -31865124, 3225009, -7972642, 3936128, -5652273, -3050304}, - }, - { - FieldElement{30625386, -4729400, -25555961, -12792866, -20484575, 7695099, 17097188, -16303496, -27999779, 1803632}, - FieldElement{-3553091, 9865099, -5228566, 4272701, -5673832, -16689700, 14911344, 12196514, -21405489, 7047412}, - FieldElement{20093277, 9920966, -11138194, -5343857, 13161587, 12044805, -32856851, 4124601, -32343828, -10257566}, - }, - { - FieldElement{-20788824, 14084654, -13531713, 7842147, 19119038, -13822605, 4752377, -8714640, -21679658, 2288038}, - FieldElement{-26819236, -3283715, 29965059, 3039786, -14473765, 2540457, 29457502, 14625692, -24819617, 12570232}, - FieldElement{-1063558, -11551823, 16920318, 12494842, 1278292, -5869109, -21159943, -3498680, -11974704, 4724943}, - }, - { - FieldElement{17960970, -11775534, -4140968, -9702530, -8876562, -1410617, -12907383, -8659932, -29576300, 1903856}, - FieldElement{23134274, -14279132, -10681997, -1611936, 20684485, 15770816, -12989750, 3190296, 26955097, 14109738}, - FieldElement{15308788, 5320727, -30113809, -14318877, 22902008, 7767164, 29425325, -11277562, 31960942, 11934971}, - }, - { - FieldElement{-27395711, 8435796, 4109644, 12222639, -24627868, 14818669, 20638173, 4875028, 10491392, 1379718}, - FieldElement{-13159415, 9197841, 3875503, -8936108, -1383712, -5879801, 33518459, 16176658, 21432314, 12180697}, - FieldElement{-11787308, 11500838, 13787581, -13832590, -22430679, 10140205, 1465425, 12689540, -10301319, -13872883}, - }, - }, - { - { - FieldElement{5414091, -15386041, -21007664, 9643570, 12834970, 1186149, -2622916, -1342231, 26128231, 6032912}, - FieldElement{-26337395, -13766162, 32496025, -13653919, 17847801, -12669156, 3604025, 8316894, -25875034, -10437358}, - FieldElement{3296484, 6223048, 24680646, -12246460, -23052020, 5903205, -8862297, -4639164, 12376617, 3188849}, - }, - { - FieldElement{29190488, -14659046, 27549113, -1183516, 3520066, -10697301, 32049515, -7309113, -16109234, -9852307}, - FieldElement{-14744486, -9309156, 735818, -598978, -20407687, -5057904, 25246078, -15795669, 18640741, -960977}, - FieldElement{-6928835, -16430795, 10361374, 5642961, 4910474, 12345252, -31638386, -494430, 10530747, 1053335}, - }, - { - FieldElement{-29265967, -14186805, -13538216, -12117373, -19457059, -10655384, -31462369, -2948985, 24018831, 15026644}, - FieldElement{-22592535, -3145277, -2289276, 5953843, -13440189, 9425631, 25310643, 13003497, -2314791, -15145616}, - FieldElement{-27419985, -603321, -8043984, -1669117, -26092265, 13987819, -27297622, 187899, -23166419, -2531735}, - }, - { - FieldElement{-21744398, -13810475, 1844840, 5021428, -10434399, -15911473, 9716667, 16266922, -5070217, 726099}, - FieldElement{29370922, -6053998, 7334071, -15342259, 9385287, 2247707, -13661962, -4839461, 30007388, -15823341}, - FieldElement{-936379, 16086691, 23751945, -543318, -1167538, -5189036, 9137109, 730663, 9835848, 4555336}, - }, - { - FieldElement{-23376435, 1410446, -22253753, -12899614, 30867635, 15826977, 17693930, 544696, -11985298, 12422646}, - FieldElement{31117226, -12215734, -13502838, 6561947, -9876867, -12757670, -5118685, -4096706, 29120153, 13924425}, - FieldElement{-17400879, -14233209, 19675799, -2734756, -11006962, -5858820, -9383939, -11317700, 7240931, -237388}, - }, - { - FieldElement{-31361739, -11346780, -15007447, -5856218, -22453340, -12152771, 1222336, 4389483, 3293637, -15551743}, - FieldElement{-16684801, -14444245, 11038544, 11054958, -13801175, -3338533, -24319580, 7733547, 12796905, -6335822}, - FieldElement{-8759414, -10817836, -25418864, 10783769, -30615557, -9746811, -28253339, 3647836, 3222231, -11160462}, - }, - { - FieldElement{18606113, 1693100, -25448386, -15170272, 4112353, 10045021, 23603893, -2048234, -7550776, 2484985}, - FieldElement{9255317, -3131197, -12156162, -1004256, 13098013, -9214866, 16377220, -2102812, -19802075, -3034702}, - FieldElement{-22729289, 7496160, -5742199, 11329249, 19991973, -3347502, -31718148, 9936966, -30097688, -10618797}, - }, - { - FieldElement{21878590, -5001297, 4338336, 13643897, -3036865, 13160960, 19708896, 5415497, -7360503, -4109293}, - FieldElement{27736861, 10103576, 12500508, 8502413, -3413016, -9633558, 10436918, -1550276, -23659143, -8132100}, - FieldElement{19492550, -12104365, -29681976, -852630, -3208171, 12403437, 30066266, 8367329, 13243957, 8709688}, - }, - }, - { - { - FieldElement{12015105, 2801261, 28198131, 10151021, 24818120, -4743133, -11194191, -5645734, 5150968, 7274186}, - FieldElement{2831366, -12492146, 1478975, 6122054, 23825128, -12733586, 31097299, 6083058, 31021603, -9793610}, - FieldElement{-2529932, -2229646, 445613, 10720828, -13849527, -11505937, -23507731, 16354465, 15067285, -14147707}, - }, - { - FieldElement{7840942, 14037873, -33364863, 15934016, -728213, -3642706, 21403988, 1057586, -19379462, -12403220}, - FieldElement{915865, -16469274, 15608285, -8789130, -24357026, 6060030, -17371319, 8410997, -7220461, 16527025}, - FieldElement{32922597, -556987, 20336074, -16184568, 10903705, -5384487, 16957574, 52992, 23834301, 6588044}, - }, - { - FieldElement{32752030, 11232950, 3381995, -8714866, 22652988, -10744103, 17159699, 16689107, -20314580, -1305992}, - FieldElement{-4689649, 9166776, -25710296, -10847306, 11576752, 12733943, 7924251, -2752281, 1976123, -7249027}, - FieldElement{21251222, 16309901, -2983015, -6783122, 30810597, 12967303, 156041, -3371252, 12331345, -8237197}, - }, - { - FieldElement{8651614, -4477032, -16085636, -4996994, 13002507, 2950805, 29054427, -5106970, 10008136, -4667901}, - FieldElement{31486080, 15114593, -14261250, 12951354, 14369431, -7387845, 16347321, -13662089, 8684155, -10532952}, - FieldElement{19443825, 11385320, 24468943, -9659068, -23919258, 2187569, -26263207, -6086921, 31316348, 14219878}, - }, - { - FieldElement{-28594490, 1193785, 32245219, 11392485, 31092169, 15722801, 27146014, 6992409, 29126555, 9207390}, - FieldElement{32382935, 1110093, 18477781, 11028262, -27411763, -7548111, -4980517, 10843782, -7957600, -14435730}, - FieldElement{2814918, 7836403, 27519878, -7868156, -20894015, -11553689, -21494559, 8550130, 28346258, 1994730}, - }, - { - FieldElement{-19578299, 8085545, -14000519, -3948622, 2785838, -16231307, -19516951, 7174894, 22628102, 8115180}, - FieldElement{-30405132, 955511, -11133838, -15078069, -32447087, -13278079, -25651578, 3317160, -9943017, 930272}, - FieldElement{-15303681, -6833769, 28856490, 1357446, 23421993, 1057177, 24091212, -1388970, -22765376, -10650715}, - }, - { - FieldElement{-22751231, -5303997, -12907607, -12768866, -15811511, -7797053, -14839018, -16554220, -1867018, 8398970}, - FieldElement{-31969310, 2106403, -4736360, 1362501, 12813763, 16200670, 22981545, -6291273, 18009408, -15772772}, - FieldElement{-17220923, -9545221, -27784654, 14166835, 29815394, 7444469, 29551787, -3727419, 19288549, 1325865}, - }, - { - FieldElement{15100157, -15835752, -23923978, -1005098, -26450192, 15509408, 12376730, -3479146, 33166107, -8042750}, - FieldElement{20909231, 13023121, -9209752, 16251778, -5778415, -8094914, 12412151, 10018715, 2213263, -13878373}, - FieldElement{32529814, -11074689, 30361439, -16689753, -9135940, 1513226, 22922121, 6382134, -5766928, 8371348}, - }, - }, - { - { - FieldElement{9923462, 11271500, 12616794, 3544722, -29998368, -1721626, 12891687, -8193132, -26442943, 10486144}, - FieldElement{-22597207, -7012665, 8587003, -8257861, 4084309, -12970062, 361726, 2610596, -23921530, -11455195}, - FieldElement{5408411, -1136691, -4969122, 10561668, 24145918, 14240566, 31319731, -4235541, 19985175, -3436086}, - }, - { - FieldElement{-13994457, 16616821, 14549246, 3341099, 32155958, 13648976, -17577068, 8849297, 65030, 8370684}, - FieldElement{-8320926, -12049626, 31204563, 5839400, -20627288, -1057277, -19442942, 6922164, 12743482, -9800518}, - FieldElement{-2361371, 12678785, 28815050, 4759974, -23893047, 4884717, 23783145, 11038569, 18800704, 255233}, - }, - { - FieldElement{-5269658, -1773886, 13957886, 7990715, 23132995, 728773, 13393847, 9066957, 19258688, -14753793}, - FieldElement{-2936654, -10827535, -10432089, 14516793, -3640786, 4372541, -31934921, 2209390, -1524053, 2055794}, - FieldElement{580882, 16705327, 5468415, -2683018, -30926419, -14696000, -7203346, -8994389, -30021019, 7394435}, - }, - { - FieldElement{23838809, 1822728, -15738443, 15242727, 8318092, -3733104, -21672180, -3492205, -4821741, 14799921}, - FieldElement{13345610, 9759151, 3371034, -16137791, 16353039, 8577942, 31129804, 13496856, -9056018, 7402518}, - FieldElement{2286874, -4435931, -20042458, -2008336, -13696227, 5038122, 11006906, -15760352, 8205061, 1607563}, - }, - { - FieldElement{14414086, -8002132, 3331830, -3208217, 22249151, -5594188, 18364661, -2906958, 30019587, -9029278}, - FieldElement{-27688051, 1585953, -10775053, 931069, -29120221, -11002319, -14410829, 12029093, 9944378, 8024}, - FieldElement{4368715, -3709630, 29874200, -15022983, -20230386, -11410704, -16114594, -999085, -8142388, 5640030}, - }, - { - FieldElement{10299610, 13746483, 11661824, 16234854, 7630238, 5998374, 9809887, -16694564, 15219798, -14327783}, - FieldElement{27425505, -5719081, 3055006, 10660664, 23458024, 595578, -15398605, -1173195, -18342183, 9742717}, - FieldElement{6744077, 2427284, 26042789, 2720740, -847906, 1118974, 32324614, 7406442, 12420155, 1994844}, - }, - { - FieldElement{14012521, -5024720, -18384453, -9578469, -26485342, -3936439, -13033478, -10909803, 24319929, -6446333}, - FieldElement{16412690, -4507367, 10772641, 15929391, -17068788, -4658621, 10555945, -10484049, -30102368, -4739048}, - FieldElement{22397382, -7767684, -9293161, -12792868, 17166287, -9755136, -27333065, 6199366, 21880021, -12250760}, - }, - { - FieldElement{-4283307, 5368523, -31117018, 8163389, -30323063, 3209128, 16557151, 8890729, 8840445, 4957760}, - FieldElement{-15447727, 709327, -6919446, -10870178, -29777922, 6522332, -21720181, 12130072, -14796503, 5005757}, - FieldElement{-2114751, -14308128, 23019042, 15765735, -25269683, 6002752, 10183197, -13239326, -16395286, -2176112}, - }, - }, - { - { - FieldElement{-19025756, 1632005, 13466291, -7995100, -23640451, 16573537, -32013908, -3057104, 22208662, 2000468}, - FieldElement{3065073, -1412761, -25598674, -361432, -17683065, -5703415, -8164212, 11248527, -3691214, -7414184}, - FieldElement{10379208, -6045554, 8877319, 1473647, -29291284, -12507580, 16690915, 2553332, -3132688, 16400289}, - }, - { - FieldElement{15716668, 1254266, -18472690, 7446274, -8448918, 6344164, -22097271, -7285580, 26894937, 9132066}, - FieldElement{24158887, 12938817, 11085297, -8177598, -28063478, -4457083, -30576463, 64452, -6817084, -2692882}, - FieldElement{13488534, 7794716, 22236231, 5989356, 25426474, -12578208, 2350710, -3418511, -4688006, 2364226}, - }, - { - FieldElement{16335052, 9132434, 25640582, 6678888, 1725628, 8517937, -11807024, -11697457, 15445875, -7798101}, - FieldElement{29004207, -7867081, 28661402, -640412, -12794003, -7943086, 31863255, -4135540, -278050, -15759279}, - FieldElement{-6122061, -14866665, -28614905, 14569919, -10857999, -3591829, 10343412, -6976290, -29828287, -10815811}, - }, - { - FieldElement{27081650, 3463984, 14099042, -4517604, 1616303, -6205604, 29542636, 15372179, 17293797, 960709}, - FieldElement{20263915, 11434237, -5765435, 11236810, 13505955, -10857102, -16111345, 6493122, -19384511, 7639714}, - FieldElement{-2830798, -14839232, 25403038, -8215196, -8317012, -16173699, 18006287, -16043750, 29994677, -15808121}, - }, - { - FieldElement{9769828, 5202651, -24157398, -13631392, -28051003, -11561624, -24613141, -13860782, -31184575, 709464}, - FieldElement{12286395, 13076066, -21775189, -1176622, -25003198, 4057652, -32018128, -8890874, 16102007, 13205847}, - FieldElement{13733362, 5599946, 10557076, 3195751, -5557991, 8536970, -25540170, 8525972, 10151379, 10394400}, - }, - { - FieldElement{4024660, -16137551, 22436262, 12276534, -9099015, -2686099, 19698229, 11743039, -33302334, 8934414}, - FieldElement{-15879800, -4525240, -8580747, -2934061, 14634845, -698278, -9449077, 3137094, -11536886, 11721158}, - FieldElement{17555939, -5013938, 8268606, 2331751, -22738815, 9761013, 9319229, 8835153, -9205489, -1280045}, - }, - { - FieldElement{-461409, -7830014, 20614118, 16688288, -7514766, -4807119, 22300304, 505429, 6108462, -6183415}, - FieldElement{-5070281, 12367917, -30663534, 3234473, 32617080, -8422642, 29880583, -13483331, -26898490, -7867459}, - FieldElement{-31975283, 5726539, 26934134, 10237677, -3173717, -605053, 24199304, 3795095, 7592688, -14992079}, - }, - { - FieldElement{21594432, -14964228, 17466408, -4077222, 32537084, 2739898, 6407723, 12018833, -28256052, 4298412}, - FieldElement{-20650503, -11961496, -27236275, 570498, 3767144, -1717540, 13891942, -1569194, 13717174, 10805743}, - FieldElement{-14676630, -15644296, 15287174, 11927123, 24177847, -8175568, -796431, 14860609, -26938930, -5863836}, - }, - }, - { - { - FieldElement{12962541, 5311799, -10060768, 11658280, 18855286, -7954201, 13286263, -12808704, -4381056, 9882022}, - FieldElement{18512079, 11319350, -20123124, 15090309, 18818594, 5271736, -22727904, 3666879, -23967430, -3299429}, - FieldElement{-6789020, -3146043, 16192429, 13241070, 15898607, -14206114, -10084880, -6661110, -2403099, 5276065}, - }, - { - FieldElement{30169808, -5317648, 26306206, -11750859, 27814964, 7069267, 7152851, 3684982, 1449224, 13082861}, - FieldElement{10342826, 3098505, 2119311, 193222, 25702612, 12233820, 23697382, 15056736, -21016438, -8202000}, - FieldElement{-33150110, 3261608, 22745853, 7948688, 19370557, -15177665, -26171976, 6482814, -10300080, -11060101}, - }, - { - FieldElement{32869458, -5408545, 25609743, 15678670, -10687769, -15471071, 26112421, 2521008, -22664288, 6904815}, - FieldElement{29506923, 4457497, 3377935, -9796444, -30510046, 12935080, 1561737, 3841096, -29003639, -6657642}, - FieldElement{10340844, -6630377, -18656632, -2278430, 12621151, -13339055, 30878497, -11824370, -25584551, 5181966}, - }, - { - FieldElement{25940115, -12658025, 17324188, -10307374, -8671468, 15029094, 24396252, -16450922, -2322852, -12388574}, - FieldElement{-21765684, 9916823, -1300409, 4079498, -1028346, 11909559, 1782390, 12641087, 20603771, -6561742}, - FieldElement{-18882287, -11673380, 24849422, 11501709, 13161720, -4768874, 1925523, 11914390, 4662781, 7820689}, - }, - { - FieldElement{12241050, -425982, 8132691, 9393934, 32846760, -1599620, 29749456, 12172924, 16136752, 15264020}, - FieldElement{-10349955, -14680563, -8211979, 2330220, -17662549, -14545780, 10658213, 6671822, 19012087, 3772772}, - FieldElement{3753511, -3421066, 10617074, 2028709, 14841030, -6721664, 28718732, -15762884, 20527771, 12988982}, - }, - { - FieldElement{-14822485, -5797269, -3707987, 12689773, -898983, -10914866, -24183046, -10564943, 3299665, -12424953}, - FieldElement{-16777703, -15253301, -9642417, 4978983, 3308785, 8755439, 6943197, 6461331, -25583147, 8991218}, - FieldElement{-17226263, 1816362, -1673288, -6086439, 31783888, -8175991, -32948145, 7417950, -30242287, 1507265}, - }, - { - FieldElement{29692663, 6829891, -10498800, 4334896, 20945975, -11906496, -28887608, 8209391, 14606362, -10647073}, - FieldElement{-3481570, 8707081, 32188102, 5672294, 22096700, 1711240, -33020695, 9761487, 4170404, -2085325}, - FieldElement{-11587470, 14855945, -4127778, -1531857, -26649089, 15084046, 22186522, 16002000, -14276837, -8400798}, - }, - { - FieldElement{-4811456, 13761029, -31703877, -2483919, -3312471, 7869047, -7113572, -9620092, 13240845, 10965870}, - FieldElement{-7742563, -8256762, -14768334, -13656260, -23232383, 12387166, 4498947, 14147411, 29514390, 4302863}, - FieldElement{-13413405, -12407859, 20757302, -13801832, 14785143, 8976368, -5061276, -2144373, 17846988, -13971927}, - }, - }, - { - { - FieldElement{-2244452, -754728, -4597030, -1066309, -6247172, 1455299, -21647728, -9214789, -5222701, 12650267}, - FieldElement{-9906797, -16070310, 21134160, 12198166, -27064575, 708126, 387813, 13770293, -19134326, 10958663}, - FieldElement{22470984, 12369526, 23446014, -5441109, -21520802, -9698723, -11772496, -11574455, -25083830, 4271862}, - }, - { - FieldElement{-25169565, -10053642, -19909332, 15361595, -5984358, 2159192, 75375, -4278529, -32526221, 8469673}, - FieldElement{15854970, 4148314, -8893890, 7259002, 11666551, 13824734, -30531198, 2697372, 24154791, -9460943}, - FieldElement{15446137, -15806644, 29759747, 14019369, 30811221, -9610191, -31582008, 12840104, 24913809, 9815020}, - }, - { - FieldElement{-4709286, -5614269, -31841498, -12288893, -14443537, 10799414, -9103676, 13438769, 18735128, 9466238}, - FieldElement{11933045, 9281483, 5081055, -5183824, -2628162, -4905629, -7727821, -10896103, -22728655, 16199064}, - FieldElement{14576810, 379472, -26786533, -8317236, -29426508, -10812974, -102766, 1876699, 30801119, 2164795}, - }, - { - FieldElement{15995086, 3199873, 13672555, 13712240, -19378835, -4647646, -13081610, -15496269, -13492807, 1268052}, - FieldElement{-10290614, -3659039, -3286592, 10948818, 23037027, 3794475, -3470338, -12600221, -17055369, 3565904}, - FieldElement{29210088, -9419337, -5919792, -4952785, 10834811, -13327726, -16512102, -10820713, -27162222, -14030531}, - }, - { - FieldElement{-13161890, 15508588, 16663704, -8156150, -28349942, 9019123, -29183421, -3769423, 2244111, -14001979}, - FieldElement{-5152875, -3800936, -9306475, -6071583, 16243069, 14684434, -25673088, -16180800, 13491506, 4641841}, - FieldElement{10813417, 643330, -19188515, -728916, 30292062, -16600078, 27548447, -7721242, 14476989, -12767431}, - }, - { - FieldElement{10292079, 9984945, 6481436, 8279905, -7251514, 7032743, 27282937, -1644259, -27912810, 12651324}, - FieldElement{-31185513, -813383, 22271204, 11835308, 10201545, 15351028, 17099662, 3988035, 21721536, -3148940}, - FieldElement{10202177, -6545839, -31373232, -9574638, -32150642, -8119683, -12906320, 3852694, 13216206, 14842320}, - }, - { - FieldElement{-15815640, -10601066, -6538952, -7258995, -6984659, -6581778, -31500847, 13765824, -27434397, 9900184}, - FieldElement{14465505, -13833331, -32133984, -14738873, -27443187, 12990492, 33046193, 15796406, -7051866, -8040114}, - FieldElement{30924417, -8279620, 6359016, -12816335, 16508377, 9071735, -25488601, 15413635, 9524356, -7018878}, - }, - { - FieldElement{12274201, -13175547, 32627641, -1785326, 6736625, 13267305, 5237659, -5109483, 15663516, 4035784}, - FieldElement{-2951309, 8903985, 17349946, 601635, -16432815, -4612556, -13732739, -15889334, -22258478, 4659091}, - FieldElement{-16916263, -4952973, -30393711, -15158821, 20774812, 15897498, 5736189, 15026997, -2178256, -13455585}, - }, - }, - { - { - FieldElement{-8858980, -2219056, 28571666, -10155518, -474467, -10105698, -3801496, 278095, 23440562, -290208}, - FieldElement{10226241, -5928702, 15139956, 120818, -14867693, 5218603, 32937275, 11551483, -16571960, -7442864}, - FieldElement{17932739, -12437276, -24039557, 10749060, 11316803, 7535897, 22503767, 5561594, -3646624, 3898661}, - }, - { - FieldElement{7749907, -969567, -16339731, -16464, -25018111, 15122143, -1573531, 7152530, 21831162, 1245233}, - FieldElement{26958459, -14658026, 4314586, 8346991, -5677764, 11960072, -32589295, -620035, -30402091, -16716212}, - FieldElement{-12165896, 9166947, 33491384, 13673479, 29787085, 13096535, 6280834, 14587357, -22338025, 13987525}, - }, - { - FieldElement{-24349909, 7778775, 21116000, 15572597, -4833266, -5357778, -4300898, -5124639, -7469781, -2858068}, - FieldElement{9681908, -6737123, -31951644, 13591838, -6883821, 386950, 31622781, 6439245, -14581012, 4091397}, - FieldElement{-8426427, 1470727, -28109679, -1596990, 3978627, -5123623, -19622683, 12092163, 29077877, -14741988}, - }, - { - FieldElement{5269168, -6859726, -13230211, -8020715, 25932563, 1763552, -5606110, -5505881, -20017847, 2357889}, - FieldElement{32264008, -15407652, -5387735, -1160093, -2091322, -3946900, 23104804, -12869908, 5727338, 189038}, - FieldElement{14609123, -8954470, -6000566, -16622781, -14577387, -7743898, -26745169, 10942115, -25888931, -14884697}, - }, - { - FieldElement{20513500, 5557931, -15604613, 7829531, 26413943, -2019404, -21378968, 7471781, 13913677, -5137875}, - FieldElement{-25574376, 11967826, 29233242, 12948236, -6754465, 4713227, -8940970, 14059180, 12878652, 8511905}, - FieldElement{-25656801, 3393631, -2955415, -7075526, -2250709, 9366908, -30223418, 6812974, 5568676, -3127656}, - }, - { - FieldElement{11630004, 12144454, 2116339, 13606037, 27378885, 15676917, -17408753, -13504373, -14395196, 8070818}, - FieldElement{27117696, -10007378, -31282771, -5570088, 1127282, 12772488, -29845906, 10483306, -11552749, -1028714}, - FieldElement{10637467, -5688064, 5674781, 1072708, -26343588, -6982302, -1683975, 9177853, -27493162, 15431203}, - }, - { - FieldElement{20525145, 10892566, -12742472, 12779443, -29493034, 16150075, -28240519, 14943142, -15056790, -7935931}, - FieldElement{-30024462, 5626926, -551567, -9981087, 753598, 11981191, 25244767, -3239766, -3356550, 9594024}, - FieldElement{-23752644, 2636870, -5163910, -10103818, 585134, 7877383, 11345683, -6492290, 13352335, -10977084}, - }, - { - FieldElement{-1931799, -5407458, 3304649, -12884869, 17015806, -4877091, -29783850, -7752482, -13215537, -319204}, - FieldElement{20239939, 6607058, 6203985, 3483793, -18386976, -779229, -20723742, 15077870, -22750759, 14523817}, - FieldElement{27406042, -6041657, 27423596, -4497394, 4996214, 10002360, -28842031, -4545494, -30172742, -4805667}, - }, - }, - { - { - FieldElement{11374242, 12660715, 17861383, -12540833, 10935568, 1099227, -13886076, -9091740, -27727044, 11358504}, - FieldElement{-12730809, 10311867, 1510375, 10778093, -2119455, -9145702, 32676003, 11149336, -26123651, 4985768}, - FieldElement{-19096303, 341147, -6197485, -239033, 15756973, -8796662, -983043, 13794114, -19414307, -15621255}, - }, - { - FieldElement{6490081, 11940286, 25495923, -7726360, 8668373, -8751316, 3367603, 6970005, -1691065, -9004790}, - FieldElement{1656497, 13457317, 15370807, 6364910, 13605745, 8362338, -19174622, -5475723, -16796596, -5031438}, - FieldElement{-22273315, -13524424, -64685, -4334223, -18605636, -10921968, -20571065, -7007978, -99853, -10237333}, - }, - { - FieldElement{17747465, 10039260, 19368299, -4050591, -20630635, -16041286, 31992683, -15857976, -29260363, -5511971}, - FieldElement{31932027, -4986141, -19612382, 16366580, 22023614, 88450, 11371999, -3744247, 4882242, -10626905}, - FieldElement{29796507, 37186, 19818052, 10115756, -11829032, 3352736, 18551198, 3272828, -5190932, -4162409}, - }, - { - FieldElement{12501286, 4044383, -8612957, -13392385, -32430052, 5136599, -19230378, -3529697, 330070, -3659409}, - FieldElement{6384877, 2899513, 17807477, 7663917, -2358888, 12363165, 25366522, -8573892, -271295, 12071499}, - FieldElement{-8365515, -4042521, 25133448, -4517355, -6211027, 2265927, -32769618, 1936675, -5159697, 3829363}, - }, - { - FieldElement{28425966, -5835433, -577090, -4697198, -14217555, 6870930, 7921550, -6567787, 26333140, 14267664}, - FieldElement{-11067219, 11871231, 27385719, -10559544, -4585914, -11189312, 10004786, -8709488, -21761224, 8930324}, - FieldElement{-21197785, -16396035, 25654216, -1725397, 12282012, 11008919, 1541940, 4757911, -26491501, -16408940}, - }, - { - FieldElement{13537262, -7759490, -20604840, 10961927, -5922820, -13218065, -13156584, 6217254, -15943699, 13814990}, - FieldElement{-17422573, 15157790, 18705543, 29619, 24409717, -260476, 27361681, 9257833, -1956526, -1776914}, - FieldElement{-25045300, -10191966, 15366585, 15166509, -13105086, 8423556, -29171540, 12361135, -18685978, 4578290}, - }, - { - FieldElement{24579768, 3711570, 1342322, -11180126, -27005135, 14124956, -22544529, 14074919, 21964432, 8235257}, - FieldElement{-6528613, -2411497, 9442966, -5925588, 12025640, -1487420, -2981514, -1669206, 13006806, 2355433}, - FieldElement{-16304899, -13605259, -6632427, -5142349, 16974359, -10911083, 27202044, 1719366, 1141648, -12796236}, - }, - { - FieldElement{-12863944, -13219986, -8318266, -11018091, -6810145, -4843894, 13475066, -3133972, 32674895, 13715045}, - FieldElement{11423335, -5468059, 32344216, 8962751, 24989809, 9241752, -13265253, 16086212, -28740881, -15642093}, - FieldElement{-1409668, 12530728, -6368726, 10847387, 19531186, -14132160, -11709148, 7791794, -27245943, 4383347}, - }, - }, - { - { - FieldElement{-28970898, 5271447, -1266009, -9736989, -12455236, 16732599, -4862407, -4906449, 27193557, 6245191}, - FieldElement{-15193956, 5362278, -1783893, 2695834, 4960227, 12840725, 23061898, 3260492, 22510453, 8577507}, - FieldElement{-12632451, 11257346, -32692994, 13548177, -721004, 10879011, 31168030, 13952092, -29571492, -3635906}, - }, - { - FieldElement{3877321, -9572739, 32416692, 5405324, -11004407, -13656635, 3759769, 11935320, 5611860, 8164018}, - FieldElement{-16275802, 14667797, 15906460, 12155291, -22111149, -9039718, 32003002, -8832289, 5773085, -8422109}, - FieldElement{-23788118, -8254300, 1950875, 8937633, 18686727, 16459170, -905725, 12376320, 31632953, 190926}, - }, - { - FieldElement{-24593607, -16138885, -8423991, 13378746, 14162407, 6901328, -8288749, 4508564, -25341555, -3627528}, - FieldElement{8884438, -5884009, 6023974, 10104341, -6881569, -4941533, 18722941, -14786005, -1672488, 827625}, - FieldElement{-32720583, -16289296, -32503547, 7101210, 13354605, 2659080, -1800575, -14108036, -24878478, 1541286}, - }, - { - FieldElement{2901347, -1117687, 3880376, -10059388, -17620940, -3612781, -21802117, -3567481, 20456845, -1885033}, - FieldElement{27019610, 12299467, -13658288, -1603234, -12861660, -4861471, -19540150, -5016058, 29439641, 15138866}, - FieldElement{21536104, -6626420, -32447818, -10690208, -22408077, 5175814, -5420040, -16361163, 7779328, 109896}, - }, - { - FieldElement{30279744, 14648750, -8044871, 6425558, 13639621, -743509, 28698390, 12180118, 23177719, -554075}, - FieldElement{26572847, 3405927, -31701700, 12890905, -19265668, 5335866, -6493768, 2378492, 4439158, -13279347}, - FieldElement{-22716706, 3489070, -9225266, -332753, 18875722, -1140095, 14819434, -12731527, -17717757, -5461437}, - }, - { - FieldElement{-5056483, 16566551, 15953661, 3767752, -10436499, 15627060, -820954, 2177225, 8550082, -15114165}, - FieldElement{-18473302, 16596775, -381660, 15663611, 22860960, 15585581, -27844109, -3582739, -23260460, -8428588}, - FieldElement{-32480551, 15707275, -8205912, -5652081, 29464558, 2713815, -22725137, 15860482, -21902570, 1494193}, - }, - { - FieldElement{-19562091, -14087393, -25583872, -9299552, 13127842, 759709, 21923482, 16529112, 8742704, 12967017}, - FieldElement{-28464899, 1553205, 32536856, -10473729, -24691605, -406174, -8914625, -2933896, -29903758, 15553883}, - FieldElement{21877909, 3230008, 9881174, 10539357, -4797115, 2841332, 11543572, 14513274, 19375923, -12647961}, - }, - { - FieldElement{8832269, -14495485, 13253511, 5137575, 5037871, 4078777, 24880818, -6222716, 2862653, 9455043}, - FieldElement{29306751, 5123106, 20245049, -14149889, 9592566, 8447059, -2077124, -2990080, 15511449, 4789663}, - FieldElement{-20679756, 7004547, 8824831, -9434977, -4045704, -3750736, -5754762, 108893, 23513200, 16652362}, - }, - }, - { - { - FieldElement{-33256173, 4144782, -4476029, -6579123, 10770039, -7155542, -6650416, -12936300, -18319198, 10212860}, - FieldElement{2756081, 8598110, 7383731, -6859892, 22312759, -1105012, 21179801, 2600940, -9988298, -12506466}, - FieldElement{-24645692, 13317462, -30449259, -15653928, 21365574, -10869657, 11344424, 864440, -2499677, -16710063}, - }, - { - FieldElement{-26432803, 6148329, -17184412, -14474154, 18782929, -275997, -22561534, 211300, 2719757, 4940997}, - FieldElement{-1323882, 3911313, -6948744, 14759765, -30027150, 7851207, 21690126, 8518463, 26699843, 5276295}, - FieldElement{-13149873, -6429067, 9396249, 365013, 24703301, -10488939, 1321586, 149635, -15452774, 7159369}, - }, - { - FieldElement{9987780, -3404759, 17507962, 9505530, 9731535, -2165514, 22356009, 8312176, 22477218, -8403385}, - FieldElement{18155857, -16504990, 19744716, 9006923, 15154154, -10538976, 24256460, -4864995, -22548173, 9334109}, - FieldElement{2986088, -4911893, 10776628, -3473844, 10620590, -7083203, -21413845, 14253545, -22587149, 536906}, - }, - { - FieldElement{4377756, 8115836, 24567078, 15495314, 11625074, 13064599, 7390551, 10589625, 10838060, -15420424}, - FieldElement{-19342404, 867880, 9277171, -3218459, -14431572, -1986443, 19295826, -15796950, 6378260, 699185}, - FieldElement{7895026, 4057113, -7081772, -13077756, -17886831, -323126, -716039, 15693155, -5045064, -13373962}, - }, - { - FieldElement{-7737563, -5869402, -14566319, -7406919, 11385654, 13201616, 31730678, -10962840, -3918636, -9669325}, - FieldElement{10188286, -15770834, -7336361, 13427543, 22223443, 14896287, 30743455, 7116568, -21786507, 5427593}, - FieldElement{696102, 13206899, 27047647, -10632082, 15285305, -9853179, 10798490, -4578720, 19236243, 12477404}, - }, - { - FieldElement{-11229439, 11243796, -17054270, -8040865, -788228, -8167967, -3897669, 11180504, -23169516, 7733644}, - FieldElement{17800790, -14036179, -27000429, -11766671, 23887827, 3149671, 23466177, -10538171, 10322027, 15313801}, - FieldElement{26246234, 11968874, 32263343, -5468728, 6830755, -13323031, -15794704, -101982, -24449242, 10890804}, - }, - { - FieldElement{-31365647, 10271363, -12660625, -6267268, 16690207, -13062544, -14982212, 16484931, 25180797, -5334884}, - FieldElement{-586574, 10376444, -32586414, -11286356, 19801893, 10997610, 2276632, 9482883, 316878, 13820577}, - FieldElement{-9882808, -4510367, -2115506, 16457136, -11100081, 11674996, 30756178, -7515054, 30696930, -3712849}, - }, - { - FieldElement{32988917, -9603412, 12499366, 7910787, -10617257, -11931514, -7342816, -9985397, -32349517, 7392473}, - FieldElement{-8855661, 15927861, 9866406, -3649411, -2396914, -16655781, -30409476, -9134995, 25112947, -2926644}, - FieldElement{-2504044, -436966, 25621774, -5678772, 15085042, -5479877, -24884878, -13526194, 5537438, -13914319}, - }, - }, - { - { - FieldElement{-11225584, 2320285, -9584280, 10149187, -33444663, 5808648, -14876251, -1729667, 31234590, 6090599}, - FieldElement{-9633316, 116426, 26083934, 2897444, -6364437, -2688086, 609721, 15878753, -6970405, -9034768}, - FieldElement{-27757857, 247744, -15194774, -9002551, 23288161, -10011936, -23869595, 6503646, 20650474, 1804084}, - }, - { - FieldElement{-27589786, 15456424, 8972517, 8469608, 15640622, 4439847, 3121995, -10329713, 27842616, -202328}, - FieldElement{-15306973, 2839644, 22530074, 10026331, 4602058, 5048462, 28248656, 5031932, -11375082, 12714369}, - FieldElement{20807691, -7270825, 29286141, 11421711, -27876523, -13868230, -21227475, 1035546, -19733229, 12796920}, - }, - { - FieldElement{12076899, -14301286, -8785001, -11848922, -25012791, 16400684, -17591495, -12899438, 3480665, -15182815}, - FieldElement{-32361549, 5457597, 28548107, 7833186, 7303070, -11953545, -24363064, -15921875, -33374054, 2771025}, - FieldElement{-21389266, 421932, 26597266, 6860826, 22486084, -6737172, -17137485, -4210226, -24552282, 15673397}, - }, - { - FieldElement{-20184622, 2338216, 19788685, -9620956, -4001265, -8740893, -20271184, 4733254, 3727144, -12934448}, - FieldElement{6120119, 814863, -11794402, -622716, 6812205, -15747771, 2019594, 7975683, 31123697, -10958981}, - FieldElement{30069250, -11435332, 30434654, 2958439, 18399564, -976289, 12296869, 9204260, -16432438, 9648165}, - }, - { - FieldElement{32705432, -1550977, 30705658, 7451065, -11805606, 9631813, 3305266, 5248604, -26008332, -11377501}, - FieldElement{17219865, 2375039, -31570947, -5575615, -19459679, 9219903, 294711, 15298639, 2662509, -16297073}, - FieldElement{-1172927, -7558695, -4366770, -4287744, -21346413, -8434326, 32087529, -1222777, 32247248, -14389861}, - }, - { - FieldElement{14312628, 1221556, 17395390, -8700143, -4945741, -8684635, -28197744, -9637817, -16027623, -13378845}, - FieldElement{-1428825, -9678990, -9235681, 6549687, -7383069, -468664, 23046502, 9803137, 17597934, 2346211}, - FieldElement{18510800, 15337574, 26171504, 981392, -22241552, 7827556, -23491134, -11323352, 3059833, -11782870}, - }, - { - FieldElement{10141598, 6082907, 17829293, -1947643, 9830092, 13613136, -25556636, -5544586, -33502212, 3592096}, - FieldElement{33114168, -15889352, -26525686, -13343397, 33076705, 8716171, 1151462, 1521897, -982665, -6837803}, - FieldElement{-32939165, -4255815, 23947181, -324178, -33072974, -12305637, -16637686, 3891704, 26353178, 693168}, - }, - { - FieldElement{30374239, 1595580, -16884039, 13186931, 4600344, 406904, 9585294, -400668, 31375464, 14369965}, - FieldElement{-14370654, -7772529, 1510301, 6434173, -18784789, -6262728, 32732230, -13108839, 17901441, 16011505}, - FieldElement{18171223, -11934626, -12500402, 15197122, -11038147, -15230035, -19172240, -16046376, 8764035, 12309598}, - }, - }, - { - { - FieldElement{5975908, -5243188, -19459362, -9681747, -11541277, 14015782, -23665757, 1228319, 17544096, -10593782}, - FieldElement{5811932, -1715293, 3442887, -2269310, -18367348, -8359541, -18044043, -15410127, -5565381, 12348900}, - FieldElement{-31399660, 11407555, 25755363, 6891399, -3256938, 14872274, -24849353, 8141295, -10632534, -585479}, - }, - { - FieldElement{-12675304, 694026, -5076145, 13300344, 14015258, -14451394, -9698672, -11329050, 30944593, 1130208}, - FieldElement{8247766, -6710942, -26562381, -7709309, -14401939, -14648910, 4652152, 2488540, 23550156, -271232}, - FieldElement{17294316, -3788438, 7026748, 15626851, 22990044, 113481, 2267737, -5908146, -408818, -137719}, - }, - { - FieldElement{16091085, -16253926, 18599252, 7340678, 2137637, -1221657, -3364161, 14550936, 3260525, -7166271}, - FieldElement{-4910104, -13332887, 18550887, 10864893, -16459325, -7291596, -23028869, -13204905, -12748722, 2701326}, - FieldElement{-8574695, 16099415, 4629974, -16340524, -20786213, -6005432, -10018363, 9276971, 11329923, 1862132}, - }, - { - FieldElement{14763076, -15903608, -30918270, 3689867, 3511892, 10313526, -21951088, 12219231, -9037963, -940300}, - FieldElement{8894987, -3446094, 6150753, 3013931, 301220, 15693451, -31981216, -2909717, -15438168, 11595570}, - FieldElement{15214962, 3537601, -26238722, -14058872, 4418657, -15230761, 13947276, 10730794, -13489462, -4363670}, - }, - { - FieldElement{-2538306, 7682793, 32759013, 263109, -29984731, -7955452, -22332124, -10188635, 977108, 699994}, - FieldElement{-12466472, 4195084, -9211532, 550904, -15565337, 12917920, 19118110, -439841, -30534533, -14337913}, - FieldElement{31788461, -14507657, 4799989, 7372237, 8808585, -14747943, 9408237, -10051775, 12493932, -5409317}, - }, - { - FieldElement{-25680606, 5260744, -19235809, -6284470, -3695942, 16566087, 27218280, 2607121, 29375955, 6024730}, - FieldElement{842132, -2794693, -4763381, -8722815, 26332018, -12405641, 11831880, 6985184, -9940361, 2854096}, - FieldElement{-4847262, -7969331, 2516242, -5847713, 9695691, -7221186, 16512645, 960770, 12121869, 16648078}, - }, - { - FieldElement{-15218652, 14667096, -13336229, 2013717, 30598287, -464137, -31504922, -7882064, 20237806, 2838411}, - FieldElement{-19288047, 4453152, 15298546, -16178388, 22115043, -15972604, 12544294, -13470457, 1068881, -12499905}, - FieldElement{-9558883, -16518835, 33238498, 13506958, 30505848, -1114596, -8486907, -2630053, 12521378, 4845654}, - }, - { - FieldElement{-28198521, 10744108, -2958380, 10199664, 7759311, -13088600, 3409348, -873400, -6482306, -12885870}, - FieldElement{-23561822, 6230156, -20382013, 10655314, -24040585, -11621172, 10477734, -1240216, -3113227, 13974498}, - FieldElement{12966261, 15550616, -32038948, -1615346, 21025980, -629444, 5642325, 7188737, 18895762, 12629579}, - }, - }, - { - { - FieldElement{14741879, -14946887, 22177208, -11721237, 1279741, 8058600, 11758140, 789443, 32195181, 3895677}, - FieldElement{10758205, 15755439, -4509950, 9243698, -4879422, 6879879, -2204575, -3566119, -8982069, 4429647}, - FieldElement{-2453894, 15725973, -20436342, -10410672, -5803908, -11040220, -7135870, -11642895, 18047436, -15281743}, - }, - { - FieldElement{-25173001, -11307165, 29759956, 11776784, -22262383, -15820455, 10993114, -12850837, -17620701, -9408468}, - FieldElement{21987233, 700364, -24505048, 14972008, -7774265, -5718395, 32155026, 2581431, -29958985, 8773375}, - FieldElement{-25568350, 454463, -13211935, 16126715, 25240068, 8594567, 20656846, 12017935, -7874389, -13920155}, - }, - { - FieldElement{6028182, 6263078, -31011806, -11301710, -818919, 2461772, -31841174, -5468042, -1721788, -2776725}, - FieldElement{-12278994, 16624277, 987579, -5922598, 32908203, 1248608, 7719845, -4166698, 28408820, 6816612}, - FieldElement{-10358094, -8237829, 19549651, -12169222, 22082623, 16147817, 20613181, 13982702, -10339570, 5067943}, - }, - { - FieldElement{-30505967, -3821767, 12074681, 13582412, -19877972, 2443951, -19719286, 12746132, 5331210, -10105944}, - FieldElement{30528811, 3601899, -1957090, 4619785, -27361822, -15436388, 24180793, -12570394, 27679908, -1648928}, - FieldElement{9402404, -13957065, 32834043, 10838634, -26580150, -13237195, 26653274, -8685565, 22611444, -12715406}, - }, - { - FieldElement{22190590, 1118029, 22736441, 15130463, -30460692, -5991321, 19189625, -4648942, 4854859, 6622139}, - FieldElement{-8310738, -2953450, -8262579, -3388049, -10401731, -271929, 13424426, -3567227, 26404409, 13001963}, - FieldElement{-31241838, -15415700, -2994250, 8939346, 11562230, -12840670, -26064365, -11621720, -15405155, 11020693}, - }, - { - FieldElement{1866042, -7949489, -7898649, -10301010, 12483315, 13477547, 3175636, -12424163, 28761762, 1406734}, - FieldElement{-448555, -1777666, 13018551, 3194501, -9580420, -11161737, 24760585, -4347088, 25577411, -13378680}, - FieldElement{-24290378, 4759345, -690653, -1852816, 2066747, 10693769, -29595790, 9884936, -9368926, 4745410}, - }, - { - FieldElement{-9141284, 6049714, -19531061, -4341411, -31260798, 9944276, -15462008, -11311852, 10931924, -11931931}, - FieldElement{-16561513, 14112680, -8012645, 4817318, -8040464, -11414606, -22853429, 10856641, -20470770, 13434654}, - FieldElement{22759489, -10073434, -16766264, -1871422, 13637442, -10168091, 1765144, -12654326, 28445307, -5364710}, - }, - { - FieldElement{29875063, 12493613, 2795536, -3786330, 1710620, 15181182, -10195717, -8788675, 9074234, 1167180}, - FieldElement{-26205683, 11014233, -9842651, -2635485, -26908120, 7532294, -18716888, -9535498, 3843903, 9367684}, - FieldElement{-10969595, -6403711, 9591134, 9582310, 11349256, 108879, 16235123, 8601684, -139197, 4242895}, - }, - }, - { - { - FieldElement{22092954, -13191123, -2042793, -11968512, 32186753, -11517388, -6574341, 2470660, -27417366, 16625501}, - FieldElement{-11057722, 3042016, 13770083, -9257922, 584236, -544855, -7770857, 2602725, -27351616, 14247413}, - FieldElement{6314175, -10264892, -32772502, 15957557, -10157730, 168750, -8618807, 14290061, 27108877, -1180880}, - }, - { - FieldElement{-8586597, -7170966, 13241782, 10960156, -32991015, -13794596, 33547976, -11058889, -27148451, 981874}, - FieldElement{22833440, 9293594, -32649448, -13618667, -9136966, 14756819, -22928859, -13970780, -10479804, -16197962}, - FieldElement{-7768587, 3326786, -28111797, 10783824, 19178761, 14905060, 22680049, 13906969, -15933690, 3797899}, - }, - { - FieldElement{21721356, -4212746, -12206123, 9310182, -3882239, -13653110, 23740224, -2709232, 20491983, -8042152}, - FieldElement{9209270, -15135055, -13256557, -6167798, -731016, 15289673, 25947805, 15286587, 30997318, -6703063}, - FieldElement{7392032, 16618386, 23946583, -8039892, -13265164, -1533858, -14197445, -2321576, 17649998, -250080}, - }, - { - FieldElement{-9301088, -14193827, 30609526, -3049543, -25175069, -1283752, -15241566, -9525724, -2233253, 7662146}, - FieldElement{-17558673, 1763594, -33114336, 15908610, -30040870, -12174295, 7335080, -8472199, -3174674, 3440183}, - FieldElement{-19889700, -5977008, -24111293, -9688870, 10799743, -16571957, 40450, -4431835, 4862400, 1133}, - }, - { - FieldElement{-32856209, -7873957, -5422389, 14860950, -16319031, 7956142, 7258061, 311861, -30594991, -7379421}, - FieldElement{-3773428, -1565936, 28985340, 7499440, 24445838, 9325937, 29727763, 16527196, 18278453, 15405622}, - FieldElement{-4381906, 8508652, -19898366, -3674424, -5984453, 15149970, -13313598, 843523, -21875062, 13626197}, - }, - { - FieldElement{2281448, -13487055, -10915418, -2609910, 1879358, 16164207, -10783882, 3953792, 13340839, 15928663}, - FieldElement{31727126, -7179855, -18437503, -8283652, 2875793, -16390330, -25269894, -7014826, -23452306, 5964753}, - FieldElement{4100420, -5959452, -17179337, 6017714, -18705837, 12227141, -26684835, 11344144, 2538215, -7570755}, - }, - { - FieldElement{-9433605, 6123113, 11159803, -2156608, 30016280, 14966241, -20474983, 1485421, -629256, -15958862}, - FieldElement{-26804558, 4260919, 11851389, 9658551, -32017107, 16367492, -20205425, -13191288, 11659922, -11115118}, - FieldElement{26180396, 10015009, -30844224, -8581293, 5418197, 9480663, 2231568, -10170080, 33100372, -1306171}, - }, - { - FieldElement{15121113, -5201871, -10389905, 15427821, -27509937, -15992507, 21670947, 4486675, -5931810, -14466380}, - FieldElement{16166486, -9483733, -11104130, 6023908, -31926798, -1364923, 2340060, -16254968, -10735770, -10039824}, - FieldElement{28042865, -3557089, -12126526, 12259706, -3717498, -6945899, 6766453, -8689599, 18036436, 5803270}, - }, - }, - { - { - FieldElement{-817581, 6763912, 11803561, 1585585, 10958447, -2671165, 23855391, 4598332, -6159431, -14117438}, - FieldElement{-31031306, -14256194, 17332029, -2383520, 31312682, -5967183, 696309, 50292, -20095739, 11763584}, - FieldElement{-594563, -2514283, -32234153, 12643980, 12650761, 14811489, 665117, -12613632, -19773211, -10713562}, - }, - { - FieldElement{30464590, -11262872, -4127476, -12734478, 19835327, -7105613, -24396175, 2075773, -17020157, 992471}, - FieldElement{18357185, -6994433, 7766382, 16342475, -29324918, 411174, 14578841, 8080033, -11574335, -10601610}, - FieldElement{19598397, 10334610, 12555054, 2555664, 18821899, -10339780, 21873263, 16014234, 26224780, 16452269}, - }, - { - FieldElement{-30223925, 5145196, 5944548, 16385966, 3976735, 2009897, -11377804, -7618186, -20533829, 3698650}, - FieldElement{14187449, 3448569, -10636236, -10810935, -22663880, -3433596, 7268410, -10890444, 27394301, 12015369}, - FieldElement{19695761, 16087646, 28032085, 12999827, 6817792, 11427614, 20244189, -1312777, -13259127, -3402461}, - }, - { - FieldElement{30860103, 12735208, -1888245, -4699734, -16974906, 2256940, -8166013, 12298312, -8550524, -10393462}, - FieldElement{-5719826, -11245325, -1910649, 15569035, 26642876, -7587760, -5789354, -15118654, -4976164, 12651793}, - FieldElement{-2848395, 9953421, 11531313, -5282879, 26895123, -12697089, -13118820, -16517902, 9768698, -2533218}, - }, - { - FieldElement{-24719459, 1894651, -287698, -4704085, 15348719, -8156530, 32767513, 12765450, 4940095, 10678226}, - FieldElement{18860224, 15980149, -18987240, -1562570, -26233012, -11071856, -7843882, 13944024, -24372348, 16582019}, - FieldElement{-15504260, 4970268, -29893044, 4175593, -20993212, -2199756, -11704054, 15444560, -11003761, 7989037}, - }, - { - FieldElement{31490452, 5568061, -2412803, 2182383, -32336847, 4531686, -32078269, 6200206, -19686113, -14800171}, - FieldElement{-17308668, -15879940, -31522777, -2831, -32887382, 16375549, 8680158, -16371713, 28550068, -6857132}, - FieldElement{-28126887, -5688091, 16837845, -1820458, -6850681, 12700016, -30039981, 4364038, 1155602, 5988841}, - }, - { - FieldElement{21890435, -13272907, -12624011, 12154349, -7831873, 15300496, 23148983, -4470481, 24618407, 8283181}, - FieldElement{-33136107, -10512751, 9975416, 6841041, -31559793, 16356536, 3070187, -7025928, 1466169, 10740210}, - FieldElement{-1509399, -15488185, -13503385, -10655916, 32799044, 909394, -13938903, -5779719, -32164649, -15327040}, - }, - { - FieldElement{3960823, -14267803, -28026090, -15918051, -19404858, 13146868, 15567327, 951507, -3260321, -573935}, - FieldElement{24740841, 5052253, -30094131, 8961361, 25877428, 6165135, -24368180, 14397372, -7380369, -6144105}, - FieldElement{-28888365, 3510803, -28103278, -1158478, -11238128, -10631454, -15441463, -14453128, -1625486, -6494814}, - }, - }, - { - { - FieldElement{793299, -9230478, 8836302, -6235707, -27360908, -2369593, 33152843, -4885251, -9906200, -621852}, - FieldElement{5666233, 525582, 20782575, -8038419, -24538499, 14657740, 16099374, 1468826, -6171428, -15186581}, - FieldElement{-4859255, -3779343, -2917758, -6748019, 7778750, 11688288, -30404353, -9871238, -1558923, -9863646}, - }, - { - FieldElement{10896332, -7719704, 824275, 472601, -19460308, 3009587, 25248958, 14783338, -30581476, -15757844}, - FieldElement{10566929, 12612572, -31944212, 11118703, -12633376, 12362879, 21752402, 8822496, 24003793, 14264025}, - FieldElement{27713862, -7355973, -11008240, 9227530, 27050101, 2504721, 23886875, -13117525, 13958495, -5732453}, - }, - { - FieldElement{-23481610, 4867226, -27247128, 3900521, 29838369, -8212291, -31889399, -10041781, 7340521, -15410068}, - FieldElement{4646514, -8011124, -22766023, -11532654, 23184553, 8566613, 31366726, -1381061, -15066784, -10375192}, - FieldElement{-17270517, 12723032, -16993061, 14878794, 21619651, -6197576, 27584817, 3093888, -8843694, 3849921}, - }, - { - FieldElement{-9064912, 2103172, 25561640, -15125738, -5239824, 9582958, 32477045, -9017955, 5002294, -15550259}, - FieldElement{-12057553, -11177906, 21115585, -13365155, 8808712, -12030708, 16489530, 13378448, -25845716, 12741426}, - FieldElement{-5946367, 10645103, -30911586, 15390284, -3286982, -7118677, 24306472, 15852464, 28834118, -7646072}, - }, - { - FieldElement{-17335748, -9107057, -24531279, 9434953, -8472084, -583362, -13090771, 455841, 20461858, 5491305}, - FieldElement{13669248, -16095482, -12481974, -10203039, -14569770, -11893198, -24995986, 11293807, -28588204, -9421832}, - FieldElement{28497928, 6272777, -33022994, 14470570, 8906179, -1225630, 18504674, -14165166, 29867745, -8795943}, - }, - { - FieldElement{-16207023, 13517196, -27799630, -13697798, 24009064, -6373891, -6367600, -13175392, 22853429, -4012011}, - FieldElement{24191378, 16712145, -13931797, 15217831, 14542237, 1646131, 18603514, -11037887, 12876623, -2112447}, - FieldElement{17902668, 4518229, -411702, -2829247, 26878217, 5258055, -12860753, 608397, 16031844, 3723494}, - }, - { - FieldElement{-28632773, 12763728, -20446446, 7577504, 33001348, -13017745, 17558842, -7872890, 23896954, -4314245}, - FieldElement{-20005381, -12011952, 31520464, 605201, 2543521, 5991821, -2945064, 7229064, -9919646, -8826859}, - FieldElement{28816045, 298879, -28165016, -15920938, 19000928, -1665890, -12680833, -2949325, -18051778, -2082915}, - }, - { - FieldElement{16000882, -344896, 3493092, -11447198, -29504595, -13159789, 12577740, 16041268, -19715240, 7847707}, - FieldElement{10151868, 10572098, 27312476, 7922682, 14825339, 4723128, -32855931, -6519018, -10020567, 3852848}, - FieldElement{-11430470, 15697596, -21121557, -4420647, 5386314, 15063598, 16514493, -15932110, 29330899, -15076224}, - }, - }, - { - { - FieldElement{-25499735, -4378794, -15222908, -6901211, 16615731, 2051784, 3303702, 15490, -27548796, 12314391}, - FieldElement{15683520, -6003043, 18109120, -9980648, 15337968, -5997823, -16717435, 15921866, 16103996, -3731215}, - FieldElement{-23169824, -10781249, 13588192, -1628807, -3798557, -1074929, -19273607, 5402699, -29815713, -9841101}, - }, - { - FieldElement{23190676, 2384583, -32714340, 3462154, -29903655, -1529132, -11266856, 8911517, -25205859, 2739713}, - FieldElement{21374101, -3554250, -33524649, 9874411, 15377179, 11831242, -33529904, 6134907, 4931255, 11987849}, - FieldElement{-7732, -2978858, -16223486, 7277597, 105524, -322051, -31480539, 13861388, -30076310, 10117930}, - }, - { - FieldElement{-29501170, -10744872, -26163768, 13051539, -25625564, 5089643, -6325503, 6704079, 12890019, 15728940}, - FieldElement{-21972360, -11771379, -951059, -4418840, 14704840, 2695116, 903376, -10428139, 12885167, 8311031}, - FieldElement{-17516482, 5352194, 10384213, -13811658, 7506451, 13453191, 26423267, 4384730, 1888765, -5435404}, - }, - { - FieldElement{-25817338, -3107312, -13494599, -3182506, 30896459, -13921729, -32251644, -12707869, -19464434, -3340243}, - FieldElement{-23607977, -2665774, -526091, 4651136, 5765089, 4618330, 6092245, 14845197, 17151279, -9854116}, - FieldElement{-24830458, -12733720, -15165978, 10367250, -29530908, -265356, 22825805, -7087279, -16866484, 16176525}, - }, - { - FieldElement{-23583256, 6564961, 20063689, 3798228, -4740178, 7359225, 2006182, -10363426, -28746253, -10197509}, - FieldElement{-10626600, -4486402, -13320562, -5125317, 3432136, -6393229, 23632037, -1940610, 32808310, 1099883}, - FieldElement{15030977, 5768825, -27451236, -2887299, -6427378, -15361371, -15277896, -6809350, 2051441, -15225865}, - }, - { - FieldElement{-3362323, -7239372, 7517890, 9824992, 23555850, 295369, 5148398, -14154188, -22686354, 16633660}, - FieldElement{4577086, -16752288, 13249841, -15304328, 19958763, -14537274, 18559670, -10759549, 8402478, -9864273}, - FieldElement{-28406330, -1051581, -26790155, -907698, -17212414, -11030789, 9453451, -14980072, 17983010, 9967138}, - }, - { - FieldElement{-25762494, 6524722, 26585488, 9969270, 24709298, 1220360, -1677990, 7806337, 17507396, 3651560}, - FieldElement{-10420457, -4118111, 14584639, 15971087, -15768321, 8861010, 26556809, -5574557, -18553322, -11357135}, - FieldElement{2839101, 14284142, 4029895, 3472686, 14402957, 12689363, -26642121, 8459447, -5605463, -7621941}, - }, - { - FieldElement{-4839289, -3535444, 9744961, 2871048, 25113978, 3187018, -25110813, -849066, 17258084, -7977739}, - FieldElement{18164541, -10595176, -17154882, -1542417, 19237078, -9745295, 23357533, -15217008, 26908270, 12150756}, - FieldElement{-30264870, -7647865, 5112249, -7036672, -1499807, -6974257, 43168, -5537701, -32302074, 16215819}, - }, - }, - { - { - FieldElement{-6898905, 9824394, -12304779, -4401089, -31397141, -6276835, 32574489, 12532905, -7503072, -8675347}, - FieldElement{-27343522, -16515468, -27151524, -10722951, 946346, 16291093, 254968, 7168080, 21676107, -1943028}, - FieldElement{21260961, -8424752, -16831886, -11920822, -23677961, 3968121, -3651949, -6215466, -3556191, -7913075}, - }, - { - FieldElement{16544754, 13250366, -16804428, 15546242, -4583003, 12757258, -2462308, -8680336, -18907032, -9662799}, - FieldElement{-2415239, -15577728, 18312303, 4964443, -15272530, -12653564, 26820651, 16690659, 25459437, -4564609}, - FieldElement{-25144690, 11425020, 28423002, -11020557, -6144921, -15826224, 9142795, -2391602, -6432418, -1644817}, - }, - { - FieldElement{-23104652, 6253476, 16964147, -3768872, -25113972, -12296437, -27457225, -16344658, 6335692, 7249989}, - FieldElement{-30333227, 13979675, 7503222, -12368314, -11956721, -4621693, -30272269, 2682242, 25993170, -12478523}, - FieldElement{4364628, 5930691, 32304656, -10044554, -8054781, 15091131, 22857016, -10598955, 31820368, 15075278}, - }, - { - FieldElement{31879134, -8918693, 17258761, 90626, -8041836, -4917709, 24162788, -9650886, -17970238, 12833045}, - FieldElement{19073683, 14851414, -24403169, -11860168, 7625278, 11091125, -19619190, 2074449, -9413939, 14905377}, - FieldElement{24483667, -11935567, -2518866, -11547418, -1553130, 15355506, -25282080, 9253129, 27628530, -7555480}, - }, - { - FieldElement{17597607, 8340603, 19355617, 552187, 26198470, -3176583, 4593324, -9157582, -14110875, 15297016}, - FieldElement{510886, 14337390, -31785257, 16638632, 6328095, 2713355, -20217417, -11864220, 8683221, 2921426}, - FieldElement{18606791, 11874196, 27155355, -5281482, -24031742, 6265446, -25178240, -1278924, 4674690, 13890525}, - }, - { - FieldElement{13609624, 13069022, -27372361, -13055908, 24360586, 9592974, 14977157, 9835105, 4389687, 288396}, - FieldElement{9922506, -519394, 13613107, 5883594, -18758345, -434263, -12304062, 8317628, 23388070, 16052080}, - FieldElement{12720016, 11937594, -31970060, -5028689, 26900120, 8561328, -20155687, -11632979, -14754271, -10812892}, - }, - { - FieldElement{15961858, 14150409, 26716931, -665832, -22794328, 13603569, 11829573, 7467844, -28822128, 929275}, - FieldElement{11038231, -11582396, -27310482, -7316562, -10498527, -16307831, -23479533, -9371869, -21393143, 2465074}, - FieldElement{20017163, -4323226, 27915242, 1529148, 12396362, 15675764, 13817261, -9658066, 2463391, -4622140}, - }, - { - FieldElement{-16358878, -12663911, -12065183, 4996454, -1256422, 1073572, 9583558, 12851107, 4003896, 12673717}, - FieldElement{-1731589, -15155870, -3262930, 16143082, 19294135, 13385325, 14741514, -9103726, 7903886, 2348101}, - FieldElement{24536016, -16515207, 12715592, -3862155, 1511293, 10047386, -3842346, -7129159, -28377538, 10048127}, - }, - }, - { - { - FieldElement{-12622226, -6204820, 30718825, 2591312, -10617028, 12192840, 18873298, -7297090, -32297756, 15221632}, - FieldElement{-26478122, -11103864, 11546244, -1852483, 9180880, 7656409, -21343950, 2095755, 29769758, 6593415}, - FieldElement{-31994208, -2907461, 4176912, 3264766, 12538965, -868111, 26312345, -6118678, 30958054, 8292160}, - }, - { - FieldElement{31429822, -13959116, 29173532, 15632448, 12174511, -2760094, 32808831, 3977186, 26143136, -3148876}, - FieldElement{22648901, 1402143, -22799984, 13746059, 7936347, 365344, -8668633, -1674433, -3758243, -2304625}, - FieldElement{-15491917, 8012313, -2514730, -12702462, -23965846, -10254029, -1612713, -1535569, -16664475, 8194478}, - }, - { - FieldElement{27338066, -7507420, -7414224, 10140405, -19026427, -6589889, 27277191, 8855376, 28572286, 3005164}, - FieldElement{26287124, 4821776, 25476601, -4145903, -3764513, -15788984, -18008582, 1182479, -26094821, -13079595}, - FieldElement{-7171154, 3178080, 23970071, 6201893, -17195577, -4489192, -21876275, -13982627, 32208683, -1198248}, - }, - { - FieldElement{-16657702, 2817643, -10286362, 14811298, 6024667, 13349505, -27315504, -10497842, -27672585, -11539858}, - FieldElement{15941029, -9405932, -21367050, 8062055, 31876073, -238629, -15278393, -1444429, 15397331, -4130193}, - FieldElement{8934485, -13485467, -23286397, -13423241, -32446090, 14047986, 31170398, -1441021, -27505566, 15087184}, - }, - { - FieldElement{-18357243, -2156491, 24524913, -16677868, 15520427, -6360776, -15502406, 11461896, 16788528, -5868942}, - FieldElement{-1947386, 16013773, 21750665, 3714552, -17401782, -16055433, -3770287, -10323320, 31322514, -11615635}, - FieldElement{21426655, -5650218, -13648287, -5347537, -28812189, -4920970, -18275391, -14621414, 13040862, -12112948}, - }, - { - FieldElement{11293895, 12478086, -27136401, 15083750, -29307421, 14748872, 14555558, -13417103, 1613711, 4896935}, - FieldElement{-25894883, 15323294, -8489791, -8057900, 25967126, -13425460, 2825960, -4897045, -23971776, -11267415}, - FieldElement{-15924766, -5229880, -17443532, 6410664, 3622847, 10243618, 20615400, 12405433, -23753030, -8436416}, - }, - { - FieldElement{-7091295, 12556208, -20191352, 9025187, -17072479, 4333801, 4378436, 2432030, 23097949, -566018}, - FieldElement{4565804, -16025654, 20084412, -7842817, 1724999, 189254, 24767264, 10103221, -18512313, 2424778}, - FieldElement{366633, -11976806, 8173090, -6890119, 30788634, 5745705, -7168678, 1344109, -3642553, 12412659}, - }, - { - FieldElement{-24001791, 7690286, 14929416, -168257, -32210835, -13412986, 24162697, -15326504, -3141501, 11179385}, - FieldElement{18289522, -14724954, 8056945, 16430056, -21729724, 7842514, -6001441, -1486897, -18684645, -11443503}, - FieldElement{476239, 6601091, -6152790, -9723375, 17503545, -4863900, 27672959, 13403813, 11052904, 5219329}, - }, - }, - { - { - FieldElement{20678546, -8375738, -32671898, 8849123, -5009758, 14574752, 31186971, -3973730, 9014762, -8579056}, - FieldElement{-13644050, -10350239, -15962508, 5075808, -1514661, -11534600, -33102500, 9160280, 8473550, -3256838}, - FieldElement{24900749, 14435722, 17209120, -15292541, -22592275, 9878983, -7689309, -16335821, -24568481, 11788948}, - }, - { - FieldElement{-3118155, -11395194, -13802089, 14797441, 9652448, -6845904, -20037437, 10410733, -24568470, -1458691}, - FieldElement{-15659161, 16736706, -22467150, 10215878, -9097177, 7563911, 11871841, -12505194, -18513325, 8464118}, - FieldElement{-23400612, 8348507, -14585951, -861714, -3950205, -6373419, 14325289, 8628612, 33313881, -8370517}, - }, - { - FieldElement{-20186973, -4967935, 22367356, 5271547, -1097117, -4788838, -24805667, -10236854, -8940735, -5818269}, - FieldElement{-6948785, -1795212, -32625683, -16021179, 32635414, -7374245, 15989197, -12838188, 28358192, -4253904}, - FieldElement{-23561781, -2799059, -32351682, -1661963, -9147719, 10429267, -16637684, 4072016, -5351664, 5596589}, - }, - { - FieldElement{-28236598, -3390048, 12312896, 6213178, 3117142, 16078565, 29266239, 2557221, 1768301, 15373193}, - FieldElement{-7243358, -3246960, -4593467, -7553353, -127927, -912245, -1090902, -4504991, -24660491, 3442910}, - FieldElement{-30210571, 5124043, 14181784, 8197961, 18964734, -11939093, 22597931, 7176455, -18585478, 13365930}, - }, - { - FieldElement{-7877390, -1499958, 8324673, 4690079, 6261860, 890446, 24538107, -8570186, -9689599, -3031667}, - FieldElement{25008904, -10771599, -4305031, -9638010, 16265036, 15721635, 683793, -11823784, 15723479, -15163481}, - FieldElement{-9660625, 12374379, -27006999, -7026148, -7724114, -12314514, 11879682, 5400171, 519526, -1235876}, - }, - { - FieldElement{22258397, -16332233, -7869817, 14613016, -22520255, -2950923, -20353881, 7315967, 16648397, 7605640}, - FieldElement{-8081308, -8464597, -8223311, 9719710, 19259459, -15348212, 23994942, -5281555, -9468848, 4763278}, - FieldElement{-21699244, 9220969, -15730624, 1084137, -25476107, -2852390, 31088447, -7764523, -11356529, 728112}, - }, - { - FieldElement{26047220, -11751471, -6900323, -16521798, 24092068, 9158119, -4273545, -12555558, -29365436, -5498272}, - FieldElement{17510331, -322857, 5854289, 8403524, 17133918, -3112612, -28111007, 12327945, 10750447, 10014012}, - FieldElement{-10312768, 3936952, 9156313, -8897683, 16498692, -994647, -27481051, -666732, 3424691, 7540221}, - }, - { - FieldElement{30322361, -6964110, 11361005, -4143317, 7433304, 4989748, -7071422, -16317219, -9244265, 15258046}, - FieldElement{13054562, -2779497, 19155474, 469045, -12482797, 4566042, 5631406, 2711395, 1062915, -5136345}, - FieldElement{-19240248, -11254599, -29509029, -7499965, -5835763, 13005411, -6066489, 12194497, 32960380, 1459310}, - }, - }, - { - { - FieldElement{19852034, 7027924, 23669353, 10020366, 8586503, -6657907, 394197, -6101885, 18638003, -11174937}, - FieldElement{31395534, 15098109, 26581030, 8030562, -16527914, -5007134, 9012486, -7584354, -6643087, -5442636}, - FieldElement{-9192165, -2347377, -1997099, 4529534, 25766844, 607986, -13222, 9677543, -32294889, -6456008}, - }, - { - FieldElement{-2444496, -149937, 29348902, 8186665, 1873760, 12489863, -30934579, -7839692, -7852844, -8138429}, - FieldElement{-15236356, -15433509, 7766470, 746860, 26346930, -10221762, -27333451, 10754588, -9431476, 5203576}, - FieldElement{31834314, 14135496, -770007, 5159118, 20917671, -16768096, -7467973, -7337524, 31809243, 7347066}, - }, - { - FieldElement{-9606723, -11874240, 20414459, 13033986, 13716524, -11691881, 19797970, -12211255, 15192876, -2087490}, - FieldElement{-12663563, -2181719, 1168162, -3804809, 26747877, -14138091, 10609330, 12694420, 33473243, -13382104}, - FieldElement{33184999, 11180355, 15832085, -11385430, -1633671, 225884, 15089336, -11023903, -6135662, 14480053}, - }, - { - FieldElement{31308717, -5619998, 31030840, -1897099, 15674547, -6582883, 5496208, 13685227, 27595050, 8737275}, - FieldElement{-20318852, -15150239, 10933843, -16178022, 8335352, -7546022, -31008351, -12610604, 26498114, 66511}, - FieldElement{22644454, -8761729, -16671776, 4884562, -3105614, -13559366, 30540766, -4286747, -13327787, -7515095}, - }, - { - FieldElement{-28017847, 9834845, 18617207, -2681312, -3401956, -13307506, 8205540, 13585437, -17127465, 15115439}, - FieldElement{23711543, -672915, 31206561, -8362711, 6164647, -9709987, -33535882, -1426096, 8236921, 16492939}, - FieldElement{-23910559, -13515526, -26299483, -4503841, 25005590, -7687270, 19574902, 10071562, 6708380, -6222424}, - }, - { - FieldElement{2101391, -4930054, 19702731, 2367575, -15427167, 1047675, 5301017, 9328700, 29955601, -11678310}, - FieldElement{3096359, 9271816, -21620864, -15521844, -14847996, -7592937, -25892142, -12635595, -9917575, 6216608}, - FieldElement{-32615849, 338663, -25195611, 2510422, -29213566, -13820213, 24822830, -6146567, -26767480, 7525079}, - }, - { - FieldElement{-23066649, -13985623, 16133487, -7896178, -3389565, 778788, -910336, -2782495, -19386633, 11994101}, - FieldElement{21691500, -13624626, -641331, -14367021, 3285881, -3483596, -25064666, 9718258, -7477437, 13381418}, - FieldElement{18445390, -4202236, 14979846, 11622458, -1727110, -3582980, 23111648, -6375247, 28535282, 15779576}, - }, - { - FieldElement{30098053, 3089662, -9234387, 16662135, -21306940, 11308411, -14068454, 12021730, 9955285, -16303356}, - FieldElement{9734894, -14576830, -7473633, -9138735, 2060392, 11313496, -18426029, 9924399, 20194861, 13380996}, - FieldElement{-26378102, -7965207, -22167821, 15789297, -18055342, -6168792, -1984914, 15707771, 26342023, 10146099}, - }, - }, - { - { - FieldElement{-26016874, -219943, 21339191, -41388, 19745256, -2878700, -29637280, 2227040, 21612326, -545728}, - FieldElement{-13077387, 1184228, 23562814, -5970442, -20351244, -6348714, 25764461, 12243797, -20856566, 11649658}, - FieldElement{-10031494, 11262626, 27384172, 2271902, 26947504, -15997771, 39944, 6114064, 33514190, 2333242}, - }, - { - FieldElement{-21433588, -12421821, 8119782, 7219913, -21830522, -9016134, -6679750, -12670638, 24350578, -13450001}, - FieldElement{-4116307, -11271533, -23886186, 4843615, -30088339, 690623, -31536088, -10406836, 8317860, 12352766}, - FieldElement{18200138, -14475911, -33087759, -2696619, -23702521, -9102511, -23552096, -2287550, 20712163, 6719373}, - }, - { - FieldElement{26656208, 6075253, -7858556, 1886072, -28344043, 4262326, 11117530, -3763210, 26224235, -3297458}, - FieldElement{-17168938, -14854097, -3395676, -16369877, -19954045, 14050420, 21728352, 9493610, 18620611, -16428628}, - FieldElement{-13323321, 13325349, 11432106, 5964811, 18609221, 6062965, -5269471, -9725556, -30701573, -16479657}, - }, - { - FieldElement{-23860538, -11233159, 26961357, 1640861, -32413112, -16737940, 12248509, -5240639, 13735342, 1934062}, - FieldElement{25089769, 6742589, 17081145, -13406266, 21909293, -16067981, -15136294, -3765346, -21277997, 5473616}, - FieldElement{31883677, -7961101, 1083432, -11572403, 22828471, 13290673, -7125085, 12469656, 29111212, -5451014}, - }, - { - FieldElement{24244947, -15050407, -26262976, 2791540, -14997599, 16666678, 24367466, 6388839, -10295587, 452383}, - FieldElement{-25640782, -3417841, 5217916, 16224624, 19987036, -4082269, -24236251, -5915248, 15766062, 8407814}, - FieldElement{-20406999, 13990231, 15495425, 16395525, 5377168, 15166495, -8917023, -4388953, -8067909, 2276718}, - }, - { - FieldElement{30157918, 12924066, -17712050, 9245753, 19895028, 3368142, -23827587, 5096219, 22740376, -7303417}, - FieldElement{2041139, -14256350, 7783687, 13876377, -25946985, -13352459, 24051124, 13742383, -15637599, 13295222}, - FieldElement{33338237, -8505733, 12532113, 7977527, 9106186, -1715251, -17720195, -4612972, -4451357, -14669444}, - }, - { - FieldElement{-20045281, 5454097, -14346548, 6447146, 28862071, 1883651, -2469266, -4141880, 7770569, 9620597}, - FieldElement{23208068, 7979712, 33071466, 8149229, 1758231, -10834995, 30945528, -1694323, -33502340, -14767970}, - FieldElement{1439958, -16270480, -1079989, -793782, 4625402, 10647766, -5043801, 1220118, 30494170, -11440799}, - }, - { - FieldElement{-5037580, -13028295, -2970559, -3061767, 15640974, -6701666, -26739026, 926050, -1684339, -13333647}, - FieldElement{13908495, -3549272, 30919928, -6273825, -21521863, 7989039, 9021034, 9078865, 3353509, 4033511}, - FieldElement{-29663431, -15113610, 32259991, -344482, 24295849, -12912123, 23161163, 8839127, 27485041, 7356032}, - }, - }, - { - { - FieldElement{9661027, 705443, 11980065, -5370154, -1628543, 14661173, -6346142, 2625015, 28431036, -16771834}, - FieldElement{-23839233, -8311415, -25945511, 7480958, -17681669, -8354183, -22545972, 14150565, 15970762, 4099461}, - FieldElement{29262576, 16756590, 26350592, -8793563, 8529671, -11208050, 13617293, -9937143, 11465739, 8317062}, - }, - { - FieldElement{-25493081, -6962928, 32500200, -9419051, -23038724, -2302222, 14898637, 3848455, 20969334, -5157516}, - FieldElement{-20384450, -14347713, -18336405, 13884722, -33039454, 2842114, -21610826, -3649888, 11177095, 14989547}, - FieldElement{-24496721, -11716016, 16959896, 2278463, 12066309, 10137771, 13515641, 2581286, -28487508, 9930240}, - }, - { - FieldElement{-17751622, -2097826, 16544300, -13009300, -15914807, -14949081, 18345767, -13403753, 16291481, -5314038}, - FieldElement{-33229194, 2553288, 32678213, 9875984, 8534129, 6889387, -9676774, 6957617, 4368891, 9788741}, - FieldElement{16660756, 7281060, -10830758, 12911820, 20108584, -8101676, -21722536, -8613148, 16250552, -11111103}, - }, - { - FieldElement{-19765507, 2390526, -16551031, 14161980, 1905286, 6414907, 4689584, 10604807, -30190403, 4782747}, - FieldElement{-1354539, 14736941, -7367442, -13292886, 7710542, -14155590, -9981571, 4383045, 22546403, 437323}, - FieldElement{31665577, -12180464, -16186830, 1491339, -18368625, 3294682, 27343084, 2786261, -30633590, -14097016}, - }, - { - FieldElement{-14467279, -683715, -33374107, 7448552, 19294360, 14334329, -19690631, 2355319, -19284671, -6114373}, - FieldElement{15121312, -15796162, 6377020, -6031361, -10798111, -12957845, 18952177, 15496498, -29380133, 11754228}, - FieldElement{-2637277, -13483075, 8488727, -14303896, 12728761, -1622493, 7141596, 11724556, 22761615, -10134141}, - }, - { - FieldElement{16918416, 11729663, -18083579, 3022987, -31015732, -13339659, -28741185, -12227393, 32851222, 11717399}, - FieldElement{11166634, 7338049, -6722523, 4531520, -29468672, -7302055, 31474879, 3483633, -1193175, -4030831}, - FieldElement{-185635, 9921305, 31456609, -13536438, -12013818, 13348923, 33142652, 6546660, -19985279, -3948376}, - }, - { - FieldElement{-32460596, 11266712, -11197107, -7899103, 31703694, 3855903, -8537131, -12833048, -30772034, -15486313}, - FieldElement{-18006477, 12709068, 3991746, -6479188, -21491523, -10550425, -31135347, -16049879, 10928917, 3011958}, - FieldElement{-6957757, -15594337, 31696059, 334240, 29576716, 14796075, -30831056, -12805180, 18008031, 10258577}, - }, - { - FieldElement{-22448644, 15655569, 7018479, -4410003, -30314266, -1201591, -1853465, 1367120, 25127874, 6671743}, - FieldElement{29701166, -14373934, -10878120, 9279288, -17568, 13127210, 21382910, 11042292, 25838796, 4642684}, - FieldElement{-20430234, 14955537, -24126347, 8124619, -5369288, -5990470, 30468147, -13900640, 18423289, 4177476}, - }, - }, -} diff --git a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go b/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go deleted file mode 100644 index fd03c252af42..000000000000 --- a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go +++ /dev/null @@ -1,1793 +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. - -package edwards25519 - -import "encoding/binary" - -// This code is a port of the public domain, “ref10” implementation of ed25519 -// from SUPERCOP. - -// FieldElement represents an element of the field GF(2^255 - 19). An element -// t, entries t[0]...t[9], represents the integer t[0]+2^26 t[1]+2^51 t[2]+2^77 -// t[3]+2^102 t[4]+...+2^230 t[9]. Bounds on each t[i] vary depending on -// context. -type FieldElement [10]int32 - -var zero FieldElement - -func FeZero(fe *FieldElement) { - copy(fe[:], zero[:]) -} - -func FeOne(fe *FieldElement) { - FeZero(fe) - fe[0] = 1 -} - -func FeAdd(dst, a, b *FieldElement) { - dst[0] = a[0] + b[0] - dst[1] = a[1] + b[1] - dst[2] = a[2] + b[2] - dst[3] = a[3] + b[3] - dst[4] = a[4] + b[4] - dst[5] = a[5] + b[5] - dst[6] = a[6] + b[6] - dst[7] = a[7] + b[7] - dst[8] = a[8] + b[8] - dst[9] = a[9] + b[9] -} - -func FeSub(dst, a, b *FieldElement) { - dst[0] = a[0] - b[0] - dst[1] = a[1] - b[1] - dst[2] = a[2] - b[2] - dst[3] = a[3] - b[3] - dst[4] = a[4] - b[4] - dst[5] = a[5] - b[5] - dst[6] = a[6] - b[6] - dst[7] = a[7] - b[7] - dst[8] = a[8] - b[8] - dst[9] = a[9] - b[9] -} - -func FeCopy(dst, src *FieldElement) { - copy(dst[:], src[:]) -} - -// Replace (f,g) with (g,g) if b == 1; -// replace (f,g) with (f,g) if b == 0. -// -// Preconditions: b in {0,1}. -func FeCMove(f, g *FieldElement, b int32) { - b = -b - f[0] ^= b & (f[0] ^ g[0]) - f[1] ^= b & (f[1] ^ g[1]) - f[2] ^= b & (f[2] ^ g[2]) - f[3] ^= b & (f[3] ^ g[3]) - f[4] ^= b & (f[4] ^ g[4]) - f[5] ^= b & (f[5] ^ g[5]) - f[6] ^= b & (f[6] ^ g[6]) - f[7] ^= b & (f[7] ^ g[7]) - f[8] ^= b & (f[8] ^ g[8]) - f[9] ^= b & (f[9] ^ g[9]) -} - -func load3(in []byte) int64 { - var r int64 - r = int64(in[0]) - r |= int64(in[1]) << 8 - r |= int64(in[2]) << 16 - return r -} - -func load4(in []byte) int64 { - var r int64 - r = int64(in[0]) - r |= int64(in[1]) << 8 - r |= int64(in[2]) << 16 - r |= int64(in[3]) << 24 - return r -} - -func FeFromBytes(dst *FieldElement, src *[32]byte) { - h0 := load4(src[:]) - h1 := load3(src[4:]) << 6 - h2 := load3(src[7:]) << 5 - h3 := load3(src[10:]) << 3 - h4 := load3(src[13:]) << 2 - h5 := load4(src[16:]) - h6 := load3(src[20:]) << 7 - h7 := load3(src[23:]) << 5 - h8 := load3(src[26:]) << 4 - h9 := (load3(src[29:]) & 8388607) << 2 - - FeCombine(dst, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -// FeToBytes marshals h to s. -// Preconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Write p=2^255-19; q=floor(h/p). -// Basic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))). -// -// Proof: -// Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4. -// Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4. -// -// Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9). -// Then 0> 25 - q = (h[0] + q) >> 26 - q = (h[1] + q) >> 25 - q = (h[2] + q) >> 26 - q = (h[3] + q) >> 25 - q = (h[4] + q) >> 26 - q = (h[5] + q) >> 25 - q = (h[6] + q) >> 26 - q = (h[7] + q) >> 25 - q = (h[8] + q) >> 26 - q = (h[9] + q) >> 25 - - // Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. - h[0] += 19 * q - // Goal: Output h-2^255 q, which is between 0 and 2^255-20. - - carry[0] = h[0] >> 26 - h[1] += carry[0] - h[0] -= carry[0] << 26 - carry[1] = h[1] >> 25 - h[2] += carry[1] - h[1] -= carry[1] << 25 - carry[2] = h[2] >> 26 - h[3] += carry[2] - h[2] -= carry[2] << 26 - carry[3] = h[3] >> 25 - h[4] += carry[3] - h[3] -= carry[3] << 25 - carry[4] = h[4] >> 26 - h[5] += carry[4] - h[4] -= carry[4] << 26 - carry[5] = h[5] >> 25 - h[6] += carry[5] - h[5] -= carry[5] << 25 - carry[6] = h[6] >> 26 - h[7] += carry[6] - h[6] -= carry[6] << 26 - carry[7] = h[7] >> 25 - h[8] += carry[7] - h[7] -= carry[7] << 25 - carry[8] = h[8] >> 26 - h[9] += carry[8] - h[8] -= carry[8] << 26 - carry[9] = h[9] >> 25 - h[9] -= carry[9] << 25 - // h10 = carry9 - - // Goal: Output h[0]+...+2^255 h10-2^255 q, which is between 0 and 2^255-20. - // Have h[0]+...+2^230 h[9] between 0 and 2^255-1; - // evidently 2^255 h10-2^255 q = 0. - // Goal: Output h[0]+...+2^230 h[9]. - - s[0] = byte(h[0] >> 0) - s[1] = byte(h[0] >> 8) - s[2] = byte(h[0] >> 16) - s[3] = byte((h[0] >> 24) | (h[1] << 2)) - s[4] = byte(h[1] >> 6) - s[5] = byte(h[1] >> 14) - s[6] = byte((h[1] >> 22) | (h[2] << 3)) - s[7] = byte(h[2] >> 5) - s[8] = byte(h[2] >> 13) - s[9] = byte((h[2] >> 21) | (h[3] << 5)) - s[10] = byte(h[3] >> 3) - s[11] = byte(h[3] >> 11) - s[12] = byte((h[3] >> 19) | (h[4] << 6)) - s[13] = byte(h[4] >> 2) - s[14] = byte(h[4] >> 10) - s[15] = byte(h[4] >> 18) - s[16] = byte(h[5] >> 0) - s[17] = byte(h[5] >> 8) - s[18] = byte(h[5] >> 16) - s[19] = byte((h[5] >> 24) | (h[6] << 1)) - s[20] = byte(h[6] >> 7) - s[21] = byte(h[6] >> 15) - s[22] = byte((h[6] >> 23) | (h[7] << 3)) - s[23] = byte(h[7] >> 5) - s[24] = byte(h[7] >> 13) - s[25] = byte((h[7] >> 21) | (h[8] << 4)) - s[26] = byte(h[8] >> 4) - s[27] = byte(h[8] >> 12) - s[28] = byte((h[8] >> 20) | (h[9] << 6)) - s[29] = byte(h[9] >> 2) - s[30] = byte(h[9] >> 10) - s[31] = byte(h[9] >> 18) -} - -func FeIsNegative(f *FieldElement) byte { - var s [32]byte - FeToBytes(&s, f) - return s[0] & 1 -} - -func FeIsNonZero(f *FieldElement) int32 { - var s [32]byte - FeToBytes(&s, f) - var x uint8 - for _, b := range s { - x |= b - } - x |= x >> 4 - x |= x >> 2 - x |= x >> 1 - return int32(x & 1) -} - -// FeNeg sets h = -f -// -// Preconditions: -// |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -func FeNeg(h, f *FieldElement) { - h[0] = -f[0] - h[1] = -f[1] - h[2] = -f[2] - h[3] = -f[3] - h[4] = -f[4] - h[5] = -f[5] - h[6] = -f[6] - h[7] = -f[7] - h[8] = -f[8] - h[9] = -f[9] -} - -func FeCombine(h *FieldElement, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 int64) { - var c0, c1, c2, c3, c4, c5, c6, c7, c8, c9 int64 - - /* - |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38)) - i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8 - |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19)) - i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9 - */ - - c0 = (h0 + (1 << 25)) >> 26 - h1 += c0 - h0 -= c0 << 26 - c4 = (h4 + (1 << 25)) >> 26 - h5 += c4 - h4 -= c4 << 26 - /* |h0| <= 2^25 */ - /* |h4| <= 2^25 */ - /* |h1| <= 1.51*2^58 */ - /* |h5| <= 1.51*2^58 */ - - c1 = (h1 + (1 << 24)) >> 25 - h2 += c1 - h1 -= c1 << 25 - c5 = (h5 + (1 << 24)) >> 25 - h6 += c5 - h5 -= c5 << 25 - /* |h1| <= 2^24; from now on fits into int32 */ - /* |h5| <= 2^24; from now on fits into int32 */ - /* |h2| <= 1.21*2^59 */ - /* |h6| <= 1.21*2^59 */ - - c2 = (h2 + (1 << 25)) >> 26 - h3 += c2 - h2 -= c2 << 26 - c6 = (h6 + (1 << 25)) >> 26 - h7 += c6 - h6 -= c6 << 26 - /* |h2| <= 2^25; from now on fits into int32 unchanged */ - /* |h6| <= 2^25; from now on fits into int32 unchanged */ - /* |h3| <= 1.51*2^58 */ - /* |h7| <= 1.51*2^58 */ - - c3 = (h3 + (1 << 24)) >> 25 - h4 += c3 - h3 -= c3 << 25 - c7 = (h7 + (1 << 24)) >> 25 - h8 += c7 - h7 -= c7 << 25 - /* |h3| <= 2^24; from now on fits into int32 unchanged */ - /* |h7| <= 2^24; from now on fits into int32 unchanged */ - /* |h4| <= 1.52*2^33 */ - /* |h8| <= 1.52*2^33 */ - - c4 = (h4 + (1 << 25)) >> 26 - h5 += c4 - h4 -= c4 << 26 - c8 = (h8 + (1 << 25)) >> 26 - h9 += c8 - h8 -= c8 << 26 - /* |h4| <= 2^25; from now on fits into int32 unchanged */ - /* |h8| <= 2^25; from now on fits into int32 unchanged */ - /* |h5| <= 1.01*2^24 */ - /* |h9| <= 1.51*2^58 */ - - c9 = (h9 + (1 << 24)) >> 25 - h0 += c9 * 19 - h9 -= c9 << 25 - /* |h9| <= 2^24; from now on fits into int32 unchanged */ - /* |h0| <= 1.8*2^37 */ - - c0 = (h0 + (1 << 25)) >> 26 - h1 += c0 - h0 -= c0 << 26 - /* |h0| <= 2^25; from now on fits into int32 unchanged */ - /* |h1| <= 1.01*2^24 */ - - h[0] = int32(h0) - h[1] = int32(h1) - h[2] = int32(h2) - h[3] = int32(h3) - h[4] = int32(h4) - h[5] = int32(h5) - h[6] = int32(h6) - h[7] = int32(h7) - h[8] = int32(h8) - h[9] = int32(h9) -} - -// FeMul calculates h = f * g -// Can overlap h with f or g. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -// -// Notes on implementation strategy: -// -// Using schoolbook multiplication. -// Karatsuba would save a little in some cost models. -// -// Most multiplications by 2 and 19 are 32-bit precomputations; -// cheaper than 64-bit postcomputations. -// -// There is one remaining multiplication by 19 in the carry chain; -// one *19 precomputation can be merged into this, -// but the resulting data flow is considerably less clean. -// -// There are 12 carries below. -// 10 of them are 2-way parallelizable and vectorizable. -// Can get away with 11 carries, but then data flow is much deeper. -// -// With tighter constraints on inputs, can squeeze carries into int32. -func FeMul(h, f, g *FieldElement) { - f0 := int64(f[0]) - f1 := int64(f[1]) - f2 := int64(f[2]) - f3 := int64(f[3]) - f4 := int64(f[4]) - f5 := int64(f[5]) - f6 := int64(f[6]) - f7 := int64(f[7]) - f8 := int64(f[8]) - f9 := int64(f[9]) - - f1_2 := int64(2 * f[1]) - f3_2 := int64(2 * f[3]) - f5_2 := int64(2 * f[5]) - f7_2 := int64(2 * f[7]) - f9_2 := int64(2 * f[9]) - - g0 := int64(g[0]) - g1 := int64(g[1]) - g2 := int64(g[2]) - g3 := int64(g[3]) - g4 := int64(g[4]) - g5 := int64(g[5]) - g6 := int64(g[6]) - g7 := int64(g[7]) - g8 := int64(g[8]) - g9 := int64(g[9]) - - g1_19 := int64(19 * g[1]) /* 1.4*2^29 */ - g2_19 := int64(19 * g[2]) /* 1.4*2^30; still ok */ - g3_19 := int64(19 * g[3]) - g4_19 := int64(19 * g[4]) - g5_19 := int64(19 * g[5]) - g6_19 := int64(19 * g[6]) - g7_19 := int64(19 * g[7]) - g8_19 := int64(19 * g[8]) - g9_19 := int64(19 * g[9]) - - h0 := f0*g0 + f1_2*g9_19 + f2*g8_19 + f3_2*g7_19 + f4*g6_19 + f5_2*g5_19 + f6*g4_19 + f7_2*g3_19 + f8*g2_19 + f9_2*g1_19 - h1 := f0*g1 + f1*g0 + f2*g9_19 + f3*g8_19 + f4*g7_19 + f5*g6_19 + f6*g5_19 + f7*g4_19 + f8*g3_19 + f9*g2_19 - h2 := f0*g2 + f1_2*g1 + f2*g0 + f3_2*g9_19 + f4*g8_19 + f5_2*g7_19 + f6*g6_19 + f7_2*g5_19 + f8*g4_19 + f9_2*g3_19 - h3 := f0*g3 + f1*g2 + f2*g1 + f3*g0 + f4*g9_19 + f5*g8_19 + f6*g7_19 + f7*g6_19 + f8*g5_19 + f9*g4_19 - h4 := f0*g4 + f1_2*g3 + f2*g2 + f3_2*g1 + f4*g0 + f5_2*g9_19 + f6*g8_19 + f7_2*g7_19 + f8*g6_19 + f9_2*g5_19 - h5 := f0*g5 + f1*g4 + f2*g3 + f3*g2 + f4*g1 + f5*g0 + f6*g9_19 + f7*g8_19 + f8*g7_19 + f9*g6_19 - h6 := f0*g6 + f1_2*g5 + f2*g4 + f3_2*g3 + f4*g2 + f5_2*g1 + f6*g0 + f7_2*g9_19 + f8*g8_19 + f9_2*g7_19 - h7 := f0*g7 + f1*g6 + f2*g5 + f3*g4 + f4*g3 + f5*g2 + f6*g1 + f7*g0 + f8*g9_19 + f9*g8_19 - h8 := f0*g8 + f1_2*g7 + f2*g6 + f3_2*g5 + f4*g4 + f5_2*g3 + f6*g2 + f7_2*g1 + f8*g0 + f9_2*g9_19 - h9 := f0*g9 + f1*g8 + f2*g7 + f3*g6 + f4*g5 + f5*g4 + f6*g3 + f7*g2 + f8*g1 + f9*g0 - - FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -func feSquare(f *FieldElement) (h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 int64) { - f0 := int64(f[0]) - f1 := int64(f[1]) - f2 := int64(f[2]) - f3 := int64(f[3]) - f4 := int64(f[4]) - f5 := int64(f[5]) - f6 := int64(f[6]) - f7 := int64(f[7]) - f8 := int64(f[8]) - f9 := int64(f[9]) - f0_2 := int64(2 * f[0]) - f1_2 := int64(2 * f[1]) - f2_2 := int64(2 * f[2]) - f3_2 := int64(2 * f[3]) - f4_2 := int64(2 * f[4]) - f5_2 := int64(2 * f[5]) - f6_2 := int64(2 * f[6]) - f7_2 := int64(2 * f[7]) - f5_38 := 38 * f5 // 1.31*2^30 - f6_19 := 19 * f6 // 1.31*2^30 - f7_38 := 38 * f7 // 1.31*2^30 - f8_19 := 19 * f8 // 1.31*2^30 - f9_38 := 38 * f9 // 1.31*2^30 - - h0 = f0*f0 + f1_2*f9_38 + f2_2*f8_19 + f3_2*f7_38 + f4_2*f6_19 + f5*f5_38 - h1 = f0_2*f1 + f2*f9_38 + f3_2*f8_19 + f4*f7_38 + f5_2*f6_19 - h2 = f0_2*f2 + f1_2*f1 + f3_2*f9_38 + f4_2*f8_19 + f5_2*f7_38 + f6*f6_19 - h3 = f0_2*f3 + f1_2*f2 + f4*f9_38 + f5_2*f8_19 + f6*f7_38 - h4 = f0_2*f4 + f1_2*f3_2 + f2*f2 + f5_2*f9_38 + f6_2*f8_19 + f7*f7_38 - h5 = f0_2*f5 + f1_2*f4 + f2_2*f3 + f6*f9_38 + f7_2*f8_19 - h6 = f0_2*f6 + f1_2*f5_2 + f2_2*f4 + f3_2*f3 + f7_2*f9_38 + f8*f8_19 - h7 = f0_2*f7 + f1_2*f6 + f2_2*f5 + f3_2*f4 + f8*f9_38 - h8 = f0_2*f8 + f1_2*f7_2 + f2_2*f6 + f3_2*f5_2 + f4*f4 + f9*f9_38 - h9 = f0_2*f9 + f1_2*f8 + f2_2*f7 + f3_2*f6 + f4_2*f5 - - return -} - -// FeSquare calculates h = f*f. Can overlap h with f. -// -// Preconditions: -// |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc. -func FeSquare(h, f *FieldElement) { - h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 := feSquare(f) - FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -// FeSquare2 sets h = 2 * f * f -// -// Can overlap h with f. -// -// Preconditions: -// |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc. -// -// Postconditions: -// |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc. -// See fe_mul.c for discussion of implementation strategy. -func FeSquare2(h, f *FieldElement) { - h0, h1, h2, h3, h4, h5, h6, h7, h8, h9 := feSquare(f) - - h0 += h0 - h1 += h1 - h2 += h2 - h3 += h3 - h4 += h4 - h5 += h5 - h6 += h6 - h7 += h7 - h8 += h8 - h9 += h9 - - FeCombine(h, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9) -} - -func FeInvert(out, z *FieldElement) { - var t0, t1, t2, t3 FieldElement - var i int - - FeSquare(&t0, z) // 2^1 - FeSquare(&t1, &t0) // 2^2 - for i = 1; i < 2; i++ { // 2^3 - FeSquare(&t1, &t1) - } - FeMul(&t1, z, &t1) // 2^3 + 2^0 - FeMul(&t0, &t0, &t1) // 2^3 + 2^1 + 2^0 - FeSquare(&t2, &t0) // 2^4 + 2^2 + 2^1 - FeMul(&t1, &t1, &t2) // 2^4 + 2^3 + 2^2 + 2^1 + 2^0 - FeSquare(&t2, &t1) // 5,4,3,2,1 - for i = 1; i < 5; i++ { // 9,8,7,6,5 - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) // 9,8,7,6,5,4,3,2,1,0 - FeSquare(&t2, &t1) // 10..1 - for i = 1; i < 10; i++ { // 19..10 - FeSquare(&t2, &t2) - } - FeMul(&t2, &t2, &t1) // 19..0 - FeSquare(&t3, &t2) // 20..1 - for i = 1; i < 20; i++ { // 39..20 - FeSquare(&t3, &t3) - } - FeMul(&t2, &t3, &t2) // 39..0 - FeSquare(&t2, &t2) // 40..1 - for i = 1; i < 10; i++ { // 49..10 - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) // 49..0 - FeSquare(&t2, &t1) // 50..1 - for i = 1; i < 50; i++ { // 99..50 - FeSquare(&t2, &t2) - } - FeMul(&t2, &t2, &t1) // 99..0 - FeSquare(&t3, &t2) // 100..1 - for i = 1; i < 100; i++ { // 199..100 - FeSquare(&t3, &t3) - } - FeMul(&t2, &t3, &t2) // 199..0 - FeSquare(&t2, &t2) // 200..1 - for i = 1; i < 50; i++ { // 249..50 - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) // 249..0 - FeSquare(&t1, &t1) // 250..1 - for i = 1; i < 5; i++ { // 254..5 - FeSquare(&t1, &t1) - } - FeMul(out, &t1, &t0) // 254..5,3,1,0 -} - -func fePow22523(out, z *FieldElement) { - var t0, t1, t2 FieldElement - var i int - - FeSquare(&t0, z) - for i = 1; i < 1; i++ { - FeSquare(&t0, &t0) - } - FeSquare(&t1, &t0) - for i = 1; i < 2; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t1, z, &t1) - FeMul(&t0, &t0, &t1) - FeSquare(&t0, &t0) - for i = 1; i < 1; i++ { - FeSquare(&t0, &t0) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t1, &t0) - for i = 1; i < 5; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t1, &t0) - for i = 1; i < 10; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t1, &t1, &t0) - FeSquare(&t2, &t1) - for i = 1; i < 20; i++ { - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) - FeSquare(&t1, &t1) - for i = 1; i < 10; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t1, &t0) - for i = 1; i < 50; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t1, &t1, &t0) - FeSquare(&t2, &t1) - for i = 1; i < 100; i++ { - FeSquare(&t2, &t2) - } - FeMul(&t1, &t2, &t1) - FeSquare(&t1, &t1) - for i = 1; i < 50; i++ { - FeSquare(&t1, &t1) - } - FeMul(&t0, &t1, &t0) - FeSquare(&t0, &t0) - for i = 1; i < 2; i++ { - FeSquare(&t0, &t0) - } - FeMul(out, &t0, z) -} - -// Group elements are members of the elliptic curve -x^2 + y^2 = 1 + d * x^2 * -// y^2 where d = -121665/121666. -// -// Several representations are used: -// ProjectiveGroupElement: (X:Y:Z) satisfying x=X/Z, y=Y/Z -// ExtendedGroupElement: (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT -// CompletedGroupElement: ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T -// PreComputedGroupElement: (y+x,y-x,2dxy) - -type ProjectiveGroupElement struct { - X, Y, Z FieldElement -} - -type ExtendedGroupElement struct { - X, Y, Z, T FieldElement -} - -type CompletedGroupElement struct { - X, Y, Z, T FieldElement -} - -type PreComputedGroupElement struct { - yPlusX, yMinusX, xy2d FieldElement -} - -type CachedGroupElement struct { - yPlusX, yMinusX, Z, T2d FieldElement -} - -func (p *ProjectiveGroupElement) Zero() { - FeZero(&p.X) - FeOne(&p.Y) - FeOne(&p.Z) -} - -func (p *ProjectiveGroupElement) Double(r *CompletedGroupElement) { - var t0 FieldElement - - FeSquare(&r.X, &p.X) - FeSquare(&r.Z, &p.Y) - FeSquare2(&r.T, &p.Z) - FeAdd(&r.Y, &p.X, &p.Y) - FeSquare(&t0, &r.Y) - FeAdd(&r.Y, &r.Z, &r.X) - FeSub(&r.Z, &r.Z, &r.X) - FeSub(&r.X, &t0, &r.Y) - FeSub(&r.T, &r.T, &r.Z) -} - -func (p *ProjectiveGroupElement) ToBytes(s *[32]byte) { - var recip, x, y FieldElement - - FeInvert(&recip, &p.Z) - FeMul(&x, &p.X, &recip) - FeMul(&y, &p.Y, &recip) - FeToBytes(s, &y) - s[31] ^= FeIsNegative(&x) << 7 -} - -func (p *ExtendedGroupElement) Zero() { - FeZero(&p.X) - FeOne(&p.Y) - FeOne(&p.Z) - FeZero(&p.T) -} - -func (p *ExtendedGroupElement) Double(r *CompletedGroupElement) { - var q ProjectiveGroupElement - p.ToProjective(&q) - q.Double(r) -} - -func (p *ExtendedGroupElement) ToCached(r *CachedGroupElement) { - FeAdd(&r.yPlusX, &p.Y, &p.X) - FeSub(&r.yMinusX, &p.Y, &p.X) - FeCopy(&r.Z, &p.Z) - FeMul(&r.T2d, &p.T, &d2) -} - -func (p *ExtendedGroupElement) ToProjective(r *ProjectiveGroupElement) { - FeCopy(&r.X, &p.X) - FeCopy(&r.Y, &p.Y) - FeCopy(&r.Z, &p.Z) -} - -func (p *ExtendedGroupElement) ToBytes(s *[32]byte) { - var recip, x, y FieldElement - - FeInvert(&recip, &p.Z) - FeMul(&x, &p.X, &recip) - FeMul(&y, &p.Y, &recip) - FeToBytes(s, &y) - s[31] ^= FeIsNegative(&x) << 7 -} - -func (p *ExtendedGroupElement) FromBytes(s *[32]byte) bool { - var u, v, v3, vxx, check FieldElement - - FeFromBytes(&p.Y, s) - FeOne(&p.Z) - FeSquare(&u, &p.Y) - FeMul(&v, &u, &d) - FeSub(&u, &u, &p.Z) // y = y^2-1 - FeAdd(&v, &v, &p.Z) // v = dy^2+1 - - FeSquare(&v3, &v) - FeMul(&v3, &v3, &v) // v3 = v^3 - FeSquare(&p.X, &v3) - FeMul(&p.X, &p.X, &v) - FeMul(&p.X, &p.X, &u) // x = uv^7 - - fePow22523(&p.X, &p.X) // x = (uv^7)^((q-5)/8) - FeMul(&p.X, &p.X, &v3) - FeMul(&p.X, &p.X, &u) // x = uv^3(uv^7)^((q-5)/8) - - var tmpX, tmp2 [32]byte - - FeSquare(&vxx, &p.X) - FeMul(&vxx, &vxx, &v) - FeSub(&check, &vxx, &u) // vx^2-u - if FeIsNonZero(&check) == 1 { - FeAdd(&check, &vxx, &u) // vx^2+u - if FeIsNonZero(&check) == 1 { - return false - } - FeMul(&p.X, &p.X, &SqrtM1) - - FeToBytes(&tmpX, &p.X) - for i, v := range tmpX { - tmp2[31-i] = v - } - } - - if FeIsNegative(&p.X) != (s[31] >> 7) { - FeNeg(&p.X, &p.X) - } - - FeMul(&p.T, &p.X, &p.Y) - return true -} - -func (p *CompletedGroupElement) ToProjective(r *ProjectiveGroupElement) { - FeMul(&r.X, &p.X, &p.T) - FeMul(&r.Y, &p.Y, &p.Z) - FeMul(&r.Z, &p.Z, &p.T) -} - -func (p *CompletedGroupElement) ToExtended(r *ExtendedGroupElement) { - FeMul(&r.X, &p.X, &p.T) - FeMul(&r.Y, &p.Y, &p.Z) - FeMul(&r.Z, &p.Z, &p.T) - FeMul(&r.T, &p.X, &p.Y) -} - -func (p *PreComputedGroupElement) Zero() { - FeOne(&p.yPlusX) - FeOne(&p.yMinusX) - FeZero(&p.xy2d) -} - -func geAdd(r *CompletedGroupElement, p *ExtendedGroupElement, q *CachedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yPlusX) - FeMul(&r.Y, &r.Y, &q.yMinusX) - FeMul(&r.T, &q.T2d, &p.T) - FeMul(&r.X, &p.Z, &q.Z) - FeAdd(&t0, &r.X, &r.X) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeAdd(&r.Z, &t0, &r.T) - FeSub(&r.T, &t0, &r.T) -} - -func geSub(r *CompletedGroupElement, p *ExtendedGroupElement, q *CachedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yMinusX) - FeMul(&r.Y, &r.Y, &q.yPlusX) - FeMul(&r.T, &q.T2d, &p.T) - FeMul(&r.X, &p.Z, &q.Z) - FeAdd(&t0, &r.X, &r.X) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeSub(&r.Z, &t0, &r.T) - FeAdd(&r.T, &t0, &r.T) -} - -func geMixedAdd(r *CompletedGroupElement, p *ExtendedGroupElement, q *PreComputedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yPlusX) - FeMul(&r.Y, &r.Y, &q.yMinusX) - FeMul(&r.T, &q.xy2d, &p.T) - FeAdd(&t0, &p.Z, &p.Z) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeAdd(&r.Z, &t0, &r.T) - FeSub(&r.T, &t0, &r.T) -} - -func geMixedSub(r *CompletedGroupElement, p *ExtendedGroupElement, q *PreComputedGroupElement) { - var t0 FieldElement - - FeAdd(&r.X, &p.Y, &p.X) - FeSub(&r.Y, &p.Y, &p.X) - FeMul(&r.Z, &r.X, &q.yMinusX) - FeMul(&r.Y, &r.Y, &q.yPlusX) - FeMul(&r.T, &q.xy2d, &p.T) - FeAdd(&t0, &p.Z, &p.Z) - FeSub(&r.X, &r.Z, &r.Y) - FeAdd(&r.Y, &r.Z, &r.Y) - FeSub(&r.Z, &t0, &r.T) - FeAdd(&r.T, &t0, &r.T) -} - -func slide(r *[256]int8, a *[32]byte) { - for i := range r { - r[i] = int8(1 & (a[i>>3] >> uint(i&7))) - } - - for i := range r { - if r[i] != 0 { - for b := 1; b <= 6 && i+b < 256; b++ { - if r[i+b] != 0 { - if r[i]+(r[i+b]<= -15 { - r[i] -= r[i+b] << uint(b) - for k := i + b; k < 256; k++ { - if r[k] == 0 { - r[k] = 1 - break - } - r[k] = 0 - } - } else { - break - } - } - } - } - } -} - -// GeDoubleScalarMultVartime sets r = a*A + b*B -// where a = a[0]+256*a[1]+...+256^31 a[31]. -// and b = b[0]+256*b[1]+...+256^31 b[31]. -// B is the Ed25519 base point (x,4/5) with x positive. -func GeDoubleScalarMultVartime(r *ProjectiveGroupElement, a *[32]byte, A *ExtendedGroupElement, b *[32]byte) { - var aSlide, bSlide [256]int8 - var Ai [8]CachedGroupElement // A,3A,5A,7A,9A,11A,13A,15A - var t CompletedGroupElement - var u, A2 ExtendedGroupElement - var i int - - slide(&aSlide, a) - slide(&bSlide, b) - - A.ToCached(&Ai[0]) - A.Double(&t) - t.ToExtended(&A2) - - for i := 0; i < 7; i++ { - geAdd(&t, &A2, &Ai[i]) - t.ToExtended(&u) - u.ToCached(&Ai[i+1]) - } - - r.Zero() - - for i = 255; i >= 0; i-- { - if aSlide[i] != 0 || bSlide[i] != 0 { - break - } - } - - for ; i >= 0; i-- { - r.Double(&t) - - if aSlide[i] > 0 { - t.ToExtended(&u) - geAdd(&t, &u, &Ai[aSlide[i]/2]) - } else if aSlide[i] < 0 { - t.ToExtended(&u) - geSub(&t, &u, &Ai[(-aSlide[i])/2]) - } - - if bSlide[i] > 0 { - t.ToExtended(&u) - geMixedAdd(&t, &u, &bi[bSlide[i]/2]) - } else if bSlide[i] < 0 { - t.ToExtended(&u) - geMixedSub(&t, &u, &bi[(-bSlide[i])/2]) - } - - t.ToProjective(r) - } -} - -// equal returns 1 if b == c and 0 otherwise, assuming that b and c are -// non-negative. -func equal(b, c int32) int32 { - x := uint32(b ^ c) - x-- - return int32(x >> 31) -} - -// negative returns 1 if b < 0 and 0 otherwise. -func negative(b int32) int32 { - return (b >> 31) & 1 -} - -func PreComputedGroupElementCMove(t, u *PreComputedGroupElement, b int32) { - FeCMove(&t.yPlusX, &u.yPlusX, b) - FeCMove(&t.yMinusX, &u.yMinusX, b) - FeCMove(&t.xy2d, &u.xy2d, b) -} - -func selectPoint(t *PreComputedGroupElement, pos int32, b int32) { - var minusT PreComputedGroupElement - bNegative := negative(b) - bAbs := b - (((-bNegative) & b) << 1) - - t.Zero() - for i := int32(0); i < 8; i++ { - PreComputedGroupElementCMove(t, &base[pos][i], equal(bAbs, i+1)) - } - FeCopy(&minusT.yPlusX, &t.yMinusX) - FeCopy(&minusT.yMinusX, &t.yPlusX) - FeNeg(&minusT.xy2d, &t.xy2d) - PreComputedGroupElementCMove(t, &minusT, bNegative) -} - -// GeScalarMultBase computes h = a*B, where -// a = a[0]+256*a[1]+...+256^31 a[31] -// B is the Ed25519 base point (x,4/5) with x positive. -// -// Preconditions: -// a[31] <= 127 -func GeScalarMultBase(h *ExtendedGroupElement, a *[32]byte) { - var e [64]int8 - - for i, v := range a { - e[2*i] = int8(v & 15) - e[2*i+1] = int8((v >> 4) & 15) - } - - // each e[i] is between 0 and 15 and e[63] is between 0 and 7. - - carry := int8(0) - for i := 0; i < 63; i++ { - e[i] += carry - carry = (e[i] + 8) >> 4 - e[i] -= carry << 4 - } - e[63] += carry - // each e[i] is between -8 and 8. - - h.Zero() - var t PreComputedGroupElement - var r CompletedGroupElement - for i := int32(1); i < 64; i += 2 { - selectPoint(&t, i/2, int32(e[i])) - geMixedAdd(&r, h, &t) - r.ToExtended(h) - } - - var s ProjectiveGroupElement - - h.Double(&r) - r.ToProjective(&s) - s.Double(&r) - r.ToProjective(&s) - s.Double(&r) - r.ToProjective(&s) - s.Double(&r) - r.ToExtended(h) - - for i := int32(0); i < 64; i += 2 { - selectPoint(&t, i/2, int32(e[i])) - geMixedAdd(&r, h, &t) - r.ToExtended(h) - } -} - -// The scalars are GF(2^252 + 27742317777372353535851937790883648493). - -// Input: -// a[0]+256*a[1]+...+256^31*a[31] = a -// b[0]+256*b[1]+...+256^31*b[31] = b -// c[0]+256*c[1]+...+256^31*c[31] = c -// -// Output: -// s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l -// where l = 2^252 + 27742317777372353535851937790883648493. -func ScMulAdd(s, a, b, c *[32]byte) { - a0 := 2097151 & load3(a[:]) - a1 := 2097151 & (load4(a[2:]) >> 5) - a2 := 2097151 & (load3(a[5:]) >> 2) - a3 := 2097151 & (load4(a[7:]) >> 7) - a4 := 2097151 & (load4(a[10:]) >> 4) - a5 := 2097151 & (load3(a[13:]) >> 1) - a6 := 2097151 & (load4(a[15:]) >> 6) - a7 := 2097151 & (load3(a[18:]) >> 3) - a8 := 2097151 & load3(a[21:]) - a9 := 2097151 & (load4(a[23:]) >> 5) - a10 := 2097151 & (load3(a[26:]) >> 2) - a11 := (load4(a[28:]) >> 7) - b0 := 2097151 & load3(b[:]) - b1 := 2097151 & (load4(b[2:]) >> 5) - b2 := 2097151 & (load3(b[5:]) >> 2) - b3 := 2097151 & (load4(b[7:]) >> 7) - b4 := 2097151 & (load4(b[10:]) >> 4) - b5 := 2097151 & (load3(b[13:]) >> 1) - b6 := 2097151 & (load4(b[15:]) >> 6) - b7 := 2097151 & (load3(b[18:]) >> 3) - b8 := 2097151 & load3(b[21:]) - b9 := 2097151 & (load4(b[23:]) >> 5) - b10 := 2097151 & (load3(b[26:]) >> 2) - b11 := (load4(b[28:]) >> 7) - c0 := 2097151 & load3(c[:]) - c1 := 2097151 & (load4(c[2:]) >> 5) - c2 := 2097151 & (load3(c[5:]) >> 2) - c3 := 2097151 & (load4(c[7:]) >> 7) - c4 := 2097151 & (load4(c[10:]) >> 4) - c5 := 2097151 & (load3(c[13:]) >> 1) - c6 := 2097151 & (load4(c[15:]) >> 6) - c7 := 2097151 & (load3(c[18:]) >> 3) - c8 := 2097151 & load3(c[21:]) - c9 := 2097151 & (load4(c[23:]) >> 5) - c10 := 2097151 & (load3(c[26:]) >> 2) - c11 := (load4(c[28:]) >> 7) - var carry [23]int64 - - s0 := c0 + a0*b0 - s1 := c1 + a0*b1 + a1*b0 - s2 := c2 + a0*b2 + a1*b1 + a2*b0 - s3 := c3 + a0*b3 + a1*b2 + a2*b1 + a3*b0 - s4 := c4 + a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0 - s5 := c5 + a0*b5 + a1*b4 + a2*b3 + a3*b2 + a4*b1 + a5*b0 - s6 := c6 + a0*b6 + a1*b5 + a2*b4 + a3*b3 + a4*b2 + a5*b1 + a6*b0 - s7 := c7 + a0*b7 + a1*b6 + a2*b5 + a3*b4 + a4*b3 + a5*b2 + a6*b1 + a7*b0 - s8 := c8 + a0*b8 + a1*b7 + a2*b6 + a3*b5 + a4*b4 + a5*b3 + a6*b2 + a7*b1 + a8*b0 - s9 := c9 + a0*b9 + a1*b8 + a2*b7 + a3*b6 + a4*b5 + a5*b4 + a6*b3 + a7*b2 + a8*b1 + a9*b0 - s10 := c10 + a0*b10 + a1*b9 + a2*b8 + a3*b7 + a4*b6 + a5*b5 + a6*b4 + a7*b3 + a8*b2 + a9*b1 + a10*b0 - s11 := c11 + a0*b11 + a1*b10 + a2*b9 + a3*b8 + a4*b7 + a5*b6 + a6*b5 + a7*b4 + a8*b3 + a9*b2 + a10*b1 + a11*b0 - s12 := a1*b11 + a2*b10 + a3*b9 + a4*b8 + a5*b7 + a6*b6 + a7*b5 + a8*b4 + a9*b3 + a10*b2 + a11*b1 - s13 := a2*b11 + a3*b10 + a4*b9 + a5*b8 + a6*b7 + a7*b6 + a8*b5 + a9*b4 + a10*b3 + a11*b2 - s14 := a3*b11 + a4*b10 + a5*b9 + a6*b8 + a7*b7 + a8*b6 + a9*b5 + a10*b4 + a11*b3 - s15 := a4*b11 + a5*b10 + a6*b9 + a7*b8 + a8*b7 + a9*b6 + a10*b5 + a11*b4 - s16 := a5*b11 + a6*b10 + a7*b9 + a8*b8 + a9*b7 + a10*b6 + a11*b5 - s17 := a6*b11 + a7*b10 + a8*b9 + a9*b8 + a10*b7 + a11*b6 - s18 := a7*b11 + a8*b10 + a9*b9 + a10*b8 + a11*b7 - s19 := a8*b11 + a9*b10 + a10*b9 + a11*b8 - s20 := a9*b11 + a10*b10 + a11*b9 - s21 := a10*b11 + a11*b10 - s22 := a11 * b11 - s23 := int64(0) - - carry[0] = (s0 + (1 << 20)) >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[2] = (s2 + (1 << 20)) >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[4] = (s4 + (1 << 20)) >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[12] = (s12 + (1 << 20)) >> 21 - s13 += carry[12] - s12 -= carry[12] << 21 - carry[14] = (s14 + (1 << 20)) >> 21 - s15 += carry[14] - s14 -= carry[14] << 21 - carry[16] = (s16 + (1 << 20)) >> 21 - s17 += carry[16] - s16 -= carry[16] << 21 - carry[18] = (s18 + (1 << 20)) >> 21 - s19 += carry[18] - s18 -= carry[18] << 21 - carry[20] = (s20 + (1 << 20)) >> 21 - s21 += carry[20] - s20 -= carry[20] << 21 - carry[22] = (s22 + (1 << 20)) >> 21 - s23 += carry[22] - s22 -= carry[22] << 21 - - carry[1] = (s1 + (1 << 20)) >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[3] = (s3 + (1 << 20)) >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[5] = (s5 + (1 << 20)) >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - carry[13] = (s13 + (1 << 20)) >> 21 - s14 += carry[13] - s13 -= carry[13] << 21 - carry[15] = (s15 + (1 << 20)) >> 21 - s16 += carry[15] - s15 -= carry[15] << 21 - carry[17] = (s17 + (1 << 20)) >> 21 - s18 += carry[17] - s17 -= carry[17] << 21 - carry[19] = (s19 + (1 << 20)) >> 21 - s20 += carry[19] - s19 -= carry[19] << 21 - carry[21] = (s21 + (1 << 20)) >> 21 - s22 += carry[21] - s21 -= carry[21] << 21 - - s11 += s23 * 666643 - s12 += s23 * 470296 - s13 += s23 * 654183 - s14 -= s23 * 997805 - s15 += s23 * 136657 - s16 -= s23 * 683901 - s23 = 0 - - s10 += s22 * 666643 - s11 += s22 * 470296 - s12 += s22 * 654183 - s13 -= s22 * 997805 - s14 += s22 * 136657 - s15 -= s22 * 683901 - s22 = 0 - - s9 += s21 * 666643 - s10 += s21 * 470296 - s11 += s21 * 654183 - s12 -= s21 * 997805 - s13 += s21 * 136657 - s14 -= s21 * 683901 - s21 = 0 - - s8 += s20 * 666643 - s9 += s20 * 470296 - s10 += s20 * 654183 - s11 -= s20 * 997805 - s12 += s20 * 136657 - s13 -= s20 * 683901 - s20 = 0 - - s7 += s19 * 666643 - s8 += s19 * 470296 - s9 += s19 * 654183 - s10 -= s19 * 997805 - s11 += s19 * 136657 - s12 -= s19 * 683901 - s19 = 0 - - s6 += s18 * 666643 - s7 += s18 * 470296 - s8 += s18 * 654183 - s9 -= s18 * 997805 - s10 += s18 * 136657 - s11 -= s18 * 683901 - s18 = 0 - - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[12] = (s12 + (1 << 20)) >> 21 - s13 += carry[12] - s12 -= carry[12] << 21 - carry[14] = (s14 + (1 << 20)) >> 21 - s15 += carry[14] - s14 -= carry[14] << 21 - carry[16] = (s16 + (1 << 20)) >> 21 - s17 += carry[16] - s16 -= carry[16] << 21 - - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - carry[13] = (s13 + (1 << 20)) >> 21 - s14 += carry[13] - s13 -= carry[13] << 21 - carry[15] = (s15 + (1 << 20)) >> 21 - s16 += carry[15] - s15 -= carry[15] << 21 - - s5 += s17 * 666643 - s6 += s17 * 470296 - s7 += s17 * 654183 - s8 -= s17 * 997805 - s9 += s17 * 136657 - s10 -= s17 * 683901 - s17 = 0 - - s4 += s16 * 666643 - s5 += s16 * 470296 - s6 += s16 * 654183 - s7 -= s16 * 997805 - s8 += s16 * 136657 - s9 -= s16 * 683901 - s16 = 0 - - s3 += s15 * 666643 - s4 += s15 * 470296 - s5 += s15 * 654183 - s6 -= s15 * 997805 - s7 += s15 * 136657 - s8 -= s15 * 683901 - s15 = 0 - - s2 += s14 * 666643 - s3 += s14 * 470296 - s4 += s14 * 654183 - s5 -= s14 * 997805 - s6 += s14 * 136657 - s7 -= s14 * 683901 - s14 = 0 - - s1 += s13 * 666643 - s2 += s13 * 470296 - s3 += s13 * 654183 - s4 -= s13 * 997805 - s5 += s13 * 136657 - s6 -= s13 * 683901 - s13 = 0 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = (s0 + (1 << 20)) >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[2] = (s2 + (1 << 20)) >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[4] = (s4 + (1 << 20)) >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - carry[1] = (s1 + (1 << 20)) >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[3] = (s3 + (1 << 20)) >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[5] = (s5 + (1 << 20)) >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[11] = s11 >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - s[0] = byte(s0 >> 0) - s[1] = byte(s0 >> 8) - s[2] = byte((s0 >> 16) | (s1 << 5)) - s[3] = byte(s1 >> 3) - s[4] = byte(s1 >> 11) - s[5] = byte((s1 >> 19) | (s2 << 2)) - s[6] = byte(s2 >> 6) - s[7] = byte((s2 >> 14) | (s3 << 7)) - s[8] = byte(s3 >> 1) - s[9] = byte(s3 >> 9) - s[10] = byte((s3 >> 17) | (s4 << 4)) - s[11] = byte(s4 >> 4) - s[12] = byte(s4 >> 12) - s[13] = byte((s4 >> 20) | (s5 << 1)) - s[14] = byte(s5 >> 7) - s[15] = byte((s5 >> 15) | (s6 << 6)) - s[16] = byte(s6 >> 2) - s[17] = byte(s6 >> 10) - s[18] = byte((s6 >> 18) | (s7 << 3)) - s[19] = byte(s7 >> 5) - s[20] = byte(s7 >> 13) - s[21] = byte(s8 >> 0) - s[22] = byte(s8 >> 8) - s[23] = byte((s8 >> 16) | (s9 << 5)) - s[24] = byte(s9 >> 3) - s[25] = byte(s9 >> 11) - s[26] = byte((s9 >> 19) | (s10 << 2)) - s[27] = byte(s10 >> 6) - s[28] = byte((s10 >> 14) | (s11 << 7)) - s[29] = byte(s11 >> 1) - s[30] = byte(s11 >> 9) - s[31] = byte(s11 >> 17) -} - -// Input: -// s[0]+256*s[1]+...+256^63*s[63] = s -// -// Output: -// s[0]+256*s[1]+...+256^31*s[31] = s mod l -// where l = 2^252 + 27742317777372353535851937790883648493. -func ScReduce(out *[32]byte, s *[64]byte) { - s0 := 2097151 & load3(s[:]) - s1 := 2097151 & (load4(s[2:]) >> 5) - s2 := 2097151 & (load3(s[5:]) >> 2) - s3 := 2097151 & (load4(s[7:]) >> 7) - s4 := 2097151 & (load4(s[10:]) >> 4) - s5 := 2097151 & (load3(s[13:]) >> 1) - s6 := 2097151 & (load4(s[15:]) >> 6) - s7 := 2097151 & (load3(s[18:]) >> 3) - s8 := 2097151 & load3(s[21:]) - s9 := 2097151 & (load4(s[23:]) >> 5) - s10 := 2097151 & (load3(s[26:]) >> 2) - s11 := 2097151 & (load4(s[28:]) >> 7) - s12 := 2097151 & (load4(s[31:]) >> 4) - s13 := 2097151 & (load3(s[34:]) >> 1) - s14 := 2097151 & (load4(s[36:]) >> 6) - s15 := 2097151 & (load3(s[39:]) >> 3) - s16 := 2097151 & load3(s[42:]) - s17 := 2097151 & (load4(s[44:]) >> 5) - s18 := 2097151 & (load3(s[47:]) >> 2) - s19 := 2097151 & (load4(s[49:]) >> 7) - s20 := 2097151 & (load4(s[52:]) >> 4) - s21 := 2097151 & (load3(s[55:]) >> 1) - s22 := 2097151 & (load4(s[57:]) >> 6) - s23 := (load4(s[60:]) >> 3) - - s11 += s23 * 666643 - s12 += s23 * 470296 - s13 += s23 * 654183 - s14 -= s23 * 997805 - s15 += s23 * 136657 - s16 -= s23 * 683901 - s23 = 0 - - s10 += s22 * 666643 - s11 += s22 * 470296 - s12 += s22 * 654183 - s13 -= s22 * 997805 - s14 += s22 * 136657 - s15 -= s22 * 683901 - s22 = 0 - - s9 += s21 * 666643 - s10 += s21 * 470296 - s11 += s21 * 654183 - s12 -= s21 * 997805 - s13 += s21 * 136657 - s14 -= s21 * 683901 - s21 = 0 - - s8 += s20 * 666643 - s9 += s20 * 470296 - s10 += s20 * 654183 - s11 -= s20 * 997805 - s12 += s20 * 136657 - s13 -= s20 * 683901 - s20 = 0 - - s7 += s19 * 666643 - s8 += s19 * 470296 - s9 += s19 * 654183 - s10 -= s19 * 997805 - s11 += s19 * 136657 - s12 -= s19 * 683901 - s19 = 0 - - s6 += s18 * 666643 - s7 += s18 * 470296 - s8 += s18 * 654183 - s9 -= s18 * 997805 - s10 += s18 * 136657 - s11 -= s18 * 683901 - s18 = 0 - - var carry [17]int64 - - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[12] = (s12 + (1 << 20)) >> 21 - s13 += carry[12] - s12 -= carry[12] << 21 - carry[14] = (s14 + (1 << 20)) >> 21 - s15 += carry[14] - s14 -= carry[14] << 21 - carry[16] = (s16 + (1 << 20)) >> 21 - s17 += carry[16] - s16 -= carry[16] << 21 - - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - carry[13] = (s13 + (1 << 20)) >> 21 - s14 += carry[13] - s13 -= carry[13] << 21 - carry[15] = (s15 + (1 << 20)) >> 21 - s16 += carry[15] - s15 -= carry[15] << 21 - - s5 += s17 * 666643 - s6 += s17 * 470296 - s7 += s17 * 654183 - s8 -= s17 * 997805 - s9 += s17 * 136657 - s10 -= s17 * 683901 - s17 = 0 - - s4 += s16 * 666643 - s5 += s16 * 470296 - s6 += s16 * 654183 - s7 -= s16 * 997805 - s8 += s16 * 136657 - s9 -= s16 * 683901 - s16 = 0 - - s3 += s15 * 666643 - s4 += s15 * 470296 - s5 += s15 * 654183 - s6 -= s15 * 997805 - s7 += s15 * 136657 - s8 -= s15 * 683901 - s15 = 0 - - s2 += s14 * 666643 - s3 += s14 * 470296 - s4 += s14 * 654183 - s5 -= s14 * 997805 - s6 += s14 * 136657 - s7 -= s14 * 683901 - s14 = 0 - - s1 += s13 * 666643 - s2 += s13 * 470296 - s3 += s13 * 654183 - s4 -= s13 * 997805 - s5 += s13 * 136657 - s6 -= s13 * 683901 - s13 = 0 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = (s0 + (1 << 20)) >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[2] = (s2 + (1 << 20)) >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[4] = (s4 + (1 << 20)) >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[6] = (s6 + (1 << 20)) >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[8] = (s8 + (1 << 20)) >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[10] = (s10 + (1 << 20)) >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - carry[1] = (s1 + (1 << 20)) >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[3] = (s3 + (1 << 20)) >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[5] = (s5 + (1 << 20)) >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[7] = (s7 + (1 << 20)) >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[9] = (s9 + (1 << 20)) >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[11] = (s11 + (1 << 20)) >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - carry[11] = s11 >> 21 - s12 += carry[11] - s11 -= carry[11] << 21 - - s0 += s12 * 666643 - s1 += s12 * 470296 - s2 += s12 * 654183 - s3 -= s12 * 997805 - s4 += s12 * 136657 - s5 -= s12 * 683901 - s12 = 0 - - carry[0] = s0 >> 21 - s1 += carry[0] - s0 -= carry[0] << 21 - carry[1] = s1 >> 21 - s2 += carry[1] - s1 -= carry[1] << 21 - carry[2] = s2 >> 21 - s3 += carry[2] - s2 -= carry[2] << 21 - carry[3] = s3 >> 21 - s4 += carry[3] - s3 -= carry[3] << 21 - carry[4] = s4 >> 21 - s5 += carry[4] - s4 -= carry[4] << 21 - carry[5] = s5 >> 21 - s6 += carry[5] - s5 -= carry[5] << 21 - carry[6] = s6 >> 21 - s7 += carry[6] - s6 -= carry[6] << 21 - carry[7] = s7 >> 21 - s8 += carry[7] - s7 -= carry[7] << 21 - carry[8] = s8 >> 21 - s9 += carry[8] - s8 -= carry[8] << 21 - carry[9] = s9 >> 21 - s10 += carry[9] - s9 -= carry[9] << 21 - carry[10] = s10 >> 21 - s11 += carry[10] - s10 -= carry[10] << 21 - - out[0] = byte(s0 >> 0) - out[1] = byte(s0 >> 8) - out[2] = byte((s0 >> 16) | (s1 << 5)) - out[3] = byte(s1 >> 3) - out[4] = byte(s1 >> 11) - out[5] = byte((s1 >> 19) | (s2 << 2)) - out[6] = byte(s2 >> 6) - out[7] = byte((s2 >> 14) | (s3 << 7)) - out[8] = byte(s3 >> 1) - out[9] = byte(s3 >> 9) - out[10] = byte((s3 >> 17) | (s4 << 4)) - out[11] = byte(s4 >> 4) - out[12] = byte(s4 >> 12) - out[13] = byte((s4 >> 20) | (s5 << 1)) - out[14] = byte(s5 >> 7) - out[15] = byte((s5 >> 15) | (s6 << 6)) - out[16] = byte(s6 >> 2) - out[17] = byte(s6 >> 10) - out[18] = byte((s6 >> 18) | (s7 << 3)) - out[19] = byte(s7 >> 5) - out[20] = byte(s7 >> 13) - out[21] = byte(s8 >> 0) - out[22] = byte(s8 >> 8) - out[23] = byte((s8 >> 16) | (s9 << 5)) - out[24] = byte(s9 >> 3) - out[25] = byte(s9 >> 11) - out[26] = byte((s9 >> 19) | (s10 << 2)) - out[27] = byte(s10 >> 6) - out[28] = byte((s10 >> 14) | (s11 << 7)) - out[29] = byte(s11 >> 1) - out[30] = byte(s11 >> 9) - out[31] = byte(s11 >> 17) -} - -// order is the order of Curve25519 in little-endian form. -var order = [4]uint64{0x5812631a5cf5d3ed, 0x14def9dea2f79cd6, 0, 0x1000000000000000} - -// ScMinimal returns true if the given scalar is less than the order of the -// curve. -func ScMinimal(scalar *[32]byte) bool { - for i := 3; ; i-- { - v := binary.LittleEndian.Uint64(scalar[i*8:]) - if v > order[i] { - return false - } else if v < order[i] { - break - } else if i == 0 { - return false - } - } - - return true -} diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go b/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go deleted file mode 100644 index 6570847f5e07..000000000000 --- a/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go +++ /dev/null @@ -1,264 +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. - -// Package ChaCha20 implements the core ChaCha20 function as specified -// in https://tools.ietf.org/html/rfc7539#section-2.3. -package chacha20 - -import ( - "crypto/cipher" - "encoding/binary" - - "golang.org/x/crypto/internal/subtle" -) - -// assert that *Cipher implements cipher.Stream -var _ cipher.Stream = (*Cipher)(nil) - -// Cipher is a stateful instance of ChaCha20 using a particular key -// and nonce. A *Cipher implements the cipher.Stream interface. -type Cipher struct { - key [8]uint32 - counter uint32 // incremented after each block - nonce [3]uint32 - buf [bufSize]byte // buffer for unused keystream bytes - len int // number of unused keystream bytes at end of buf -} - -// New creates a new ChaCha20 stream cipher with the given key and nonce. -// The initial counter value is set to 0. -func New(key [8]uint32, nonce [3]uint32) *Cipher { - return &Cipher{key: key, nonce: nonce} -} - -// ChaCha20 constants spelling "expand 32-byte k" -const ( - j0 uint32 = 0x61707865 - j1 uint32 = 0x3320646e - j2 uint32 = 0x79622d32 - j3 uint32 = 0x6b206574 -) - -func quarterRound(a, b, c, d uint32) (uint32, uint32, uint32, uint32) { - a += b - d ^= a - d = (d << 16) | (d >> 16) - c += d - b ^= c - b = (b << 12) | (b >> 20) - a += b - d ^= a - d = (d << 8) | (d >> 24) - c += d - b ^= c - b = (b << 7) | (b >> 25) - return a, b, c, d -} - -// XORKeyStream XORs each byte in the given slice with a byte from the -// cipher's key stream. Dst and src must overlap entirely or not at all. -// -// If len(dst) < len(src), XORKeyStream will panic. It is acceptable -// to pass a dst bigger than src, and in that case, XORKeyStream will -// only update dst[:len(src)] and will not touch the rest of dst. -// -// Multiple calls to XORKeyStream behave as if the concatenation of -// the src buffers was passed in a single run. That is, Cipher -// maintains state and does not reset at each XORKeyStream call. -func (s *Cipher) XORKeyStream(dst, src []byte) { - if len(dst) < len(src) { - panic("chacha20: output smaller than input") - } - if subtle.InexactOverlap(dst[:len(src)], src) { - panic("chacha20: invalid buffer overlap") - } - - // xor src with buffered keystream first - if s.len != 0 { - buf := s.buf[len(s.buf)-s.len:] - if len(src) < len(buf) { - buf = buf[:len(src)] - } - td, ts := dst[:len(buf)], src[:len(buf)] // BCE hint - for i, b := range buf { - td[i] = ts[i] ^ b - } - s.len -= len(buf) - if s.len != 0 { - return - } - s.buf = [len(s.buf)]byte{} // zero the empty buffer - src = src[len(buf):] - dst = dst[len(buf):] - } - - if len(src) == 0 { - return - } - if haveAsm { - if uint64(len(src))+uint64(s.counter)*64 > (1<<38)-64 { - panic("chacha20: counter overflow") - } - s.xorKeyStreamAsm(dst, src) - return - } - - // set up a 64-byte buffer to pad out the final block if needed - // (hoisted out of the main loop to avoid spills) - rem := len(src) % 64 // length of final block - fin := len(src) - rem // index of final block - if rem > 0 { - copy(s.buf[len(s.buf)-64:], src[fin:]) - } - - // pre-calculate most of the first round - s1, s5, s9, s13 := quarterRound(j1, s.key[1], s.key[5], s.nonce[0]) - s2, s6, s10, s14 := quarterRound(j2, s.key[2], s.key[6], s.nonce[1]) - s3, s7, s11, s15 := quarterRound(j3, s.key[3], s.key[7], s.nonce[2]) - - n := len(src) - src, dst = src[:n:n], dst[:n:n] // BCE hint - for i := 0; i < n; i += 64 { - // calculate the remainder of the first round - s0, s4, s8, s12 := quarterRound(j0, s.key[0], s.key[4], s.counter) - - // execute the second round - x0, x5, x10, x15 := quarterRound(s0, s5, s10, s15) - x1, x6, x11, x12 := quarterRound(s1, s6, s11, s12) - x2, x7, x8, x13 := quarterRound(s2, s7, s8, s13) - x3, x4, x9, x14 := quarterRound(s3, s4, s9, s14) - - // execute the remaining 18 rounds - for i := 0; i < 9; i++ { - x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12) - x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13) - x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14) - x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15) - - x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15) - x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12) - x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13) - x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14) - } - - x0 += j0 - x1 += j1 - x2 += j2 - x3 += j3 - - x4 += s.key[0] - x5 += s.key[1] - x6 += s.key[2] - x7 += s.key[3] - x8 += s.key[4] - x9 += s.key[5] - x10 += s.key[6] - x11 += s.key[7] - - x12 += s.counter - x13 += s.nonce[0] - x14 += s.nonce[1] - x15 += s.nonce[2] - - // increment the counter - s.counter += 1 - if s.counter == 0 { - panic("chacha20: counter overflow") - } - - // pad to 64 bytes if needed - in, out := src[i:], dst[i:] - if i == fin { - // src[fin:] has already been copied into s.buf before - // the main loop - in, out = s.buf[len(s.buf)-64:], s.buf[len(s.buf)-64:] - } - in, out = in[:64], out[:64] // BCE hint - - // XOR the key stream with the source and write out the result - xor(out[0:], in[0:], x0) - xor(out[4:], in[4:], x1) - xor(out[8:], in[8:], x2) - xor(out[12:], in[12:], x3) - xor(out[16:], in[16:], x4) - xor(out[20:], in[20:], x5) - xor(out[24:], in[24:], x6) - xor(out[28:], in[28:], x7) - xor(out[32:], in[32:], x8) - xor(out[36:], in[36:], x9) - xor(out[40:], in[40:], x10) - xor(out[44:], in[44:], x11) - xor(out[48:], in[48:], x12) - xor(out[52:], in[52:], x13) - xor(out[56:], in[56:], x14) - xor(out[60:], in[60:], x15) - } - // copy any trailing bytes out of the buffer and into dst - if rem != 0 { - s.len = 64 - rem - copy(dst[fin:], s.buf[len(s.buf)-64:]) - } -} - -// Advance discards bytes in the key stream until the next 64 byte block -// boundary is reached and updates the counter accordingly. If the key -// stream is already at a block boundary no bytes will be discarded and -// the counter will be unchanged. -func (s *Cipher) Advance() { - s.len -= s.len % 64 - if s.len == 0 { - s.buf = [len(s.buf)]byte{} - } -} - -// XORKeyStream crypts bytes from in to out using the given key and counters. -// In and out must overlap entirely or not at all. Counter contains the raw -// ChaCha20 counter bytes (i.e. block counter followed by nonce). -func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) { - s := Cipher{ - key: [8]uint32{ - binary.LittleEndian.Uint32(key[0:4]), - binary.LittleEndian.Uint32(key[4:8]), - binary.LittleEndian.Uint32(key[8:12]), - binary.LittleEndian.Uint32(key[12:16]), - binary.LittleEndian.Uint32(key[16:20]), - binary.LittleEndian.Uint32(key[20:24]), - binary.LittleEndian.Uint32(key[24:28]), - binary.LittleEndian.Uint32(key[28:32]), - }, - nonce: [3]uint32{ - binary.LittleEndian.Uint32(counter[4:8]), - binary.LittleEndian.Uint32(counter[8:12]), - binary.LittleEndian.Uint32(counter[12:16]), - }, - counter: binary.LittleEndian.Uint32(counter[0:4]), - } - s.XORKeyStream(out, in) -} - -// HChaCha20 uses the ChaCha20 core to generate a derived key from a key and a -// nonce. It should only be used as part of the XChaCha20 construction. -func HChaCha20(key *[8]uint32, nonce *[4]uint32) [8]uint32 { - x0, x1, x2, x3 := j0, j1, j2, j3 - x4, x5, x6, x7 := key[0], key[1], key[2], key[3] - x8, x9, x10, x11 := key[4], key[5], key[6], key[7] - x12, x13, x14, x15 := nonce[0], nonce[1], nonce[2], nonce[3] - - for i := 0; i < 10; i++ { - x0, x4, x8, x12 = quarterRound(x0, x4, x8, x12) - x1, x5, x9, x13 = quarterRound(x1, x5, x9, x13) - x2, x6, x10, x14 = quarterRound(x2, x6, x10, x14) - x3, x7, x11, x15 = quarterRound(x3, x7, x11, x15) - - x0, x5, x10, x15 = quarterRound(x0, x5, x10, x15) - x1, x6, x11, x12 = quarterRound(x1, x6, x11, x12) - x2, x7, x8, x13 = quarterRound(x2, x7, x8, x13) - x3, x4, x9, x14 = quarterRound(x3, x4, x9, x14) - } - - var out [8]uint32 - out[0], out[1], out[2], out[3] = x0, x1, x2, x3 - out[4], out[5], out[6], out[7] = x12, x13, x14, x15 - return out -} diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go b/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go deleted file mode 100644 index 91520d1de079..000000000000 --- a/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2018 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 !s390x gccgo appengine - -package chacha20 - -const ( - bufSize = 64 - haveAsm = false -) - -func (*Cipher) xorKeyStreamAsm(dst, src []byte) { - panic("not implemented") -} diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go b/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go deleted file mode 100644 index 0c1c671c40b7..000000000000 --- a/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2018 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 s390x,!gccgo,!appengine - -package chacha20 - -var haveAsm = hasVectorFacility() - -const bufSize = 256 - -// hasVectorFacility reports whether the machine supports the vector -// facility (vx). -// Implementation in asm_s390x.s. -func hasVectorFacility() bool - -// xorKeyStreamVX is an assembly implementation of XORKeyStream. It must only -// be called when the vector facility is available. -// Implementation in asm_s390x.s. -//go:noescape -func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32, buf *[256]byte, len *int) - -func (c *Cipher) xorKeyStreamAsm(dst, src []byte) { - xorKeyStreamVX(dst, src, &c.key, &c.nonce, &c.counter, &c.buf, &c.len) -} - -// EXRL targets, DO NOT CALL! -func mvcSrcToBuf() -func mvcBufToDst() diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.s b/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.s deleted file mode 100644 index 98427c5e222a..000000000000 --- a/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.s +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright 2018 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 s390x,!gccgo,!appengine - -#include "go_asm.h" -#include "textflag.h" - -// This is an implementation of the ChaCha20 encryption algorithm as -// specified in RFC 7539. It uses vector instructions to compute -// 4 keystream blocks in parallel (256 bytes) which are then XORed -// with the bytes in the input slice. - -GLOBL ·constants<>(SB), RODATA|NOPTR, $32 -// BSWAP: swap bytes in each 4-byte element -DATA ·constants<>+0x00(SB)/4, $0x03020100 -DATA ·constants<>+0x04(SB)/4, $0x07060504 -DATA ·constants<>+0x08(SB)/4, $0x0b0a0908 -DATA ·constants<>+0x0c(SB)/4, $0x0f0e0d0c -// J0: [j0, j1, j2, j3] -DATA ·constants<>+0x10(SB)/4, $0x61707865 -DATA ·constants<>+0x14(SB)/4, $0x3320646e -DATA ·constants<>+0x18(SB)/4, $0x79622d32 -DATA ·constants<>+0x1c(SB)/4, $0x6b206574 - -// EXRL targets: -TEXT ·mvcSrcToBuf(SB), NOFRAME|NOSPLIT, $0 - MVC $1, (R1), (R8) - RET - -TEXT ·mvcBufToDst(SB), NOFRAME|NOSPLIT, $0 - MVC $1, (R8), (R9) - RET - -#define BSWAP V5 -#define J0 V6 -#define KEY0 V7 -#define KEY1 V8 -#define NONCE V9 -#define CTR V10 -#define M0 V11 -#define M1 V12 -#define M2 V13 -#define M3 V14 -#define INC V15 -#define X0 V16 -#define X1 V17 -#define X2 V18 -#define X3 V19 -#define X4 V20 -#define X5 V21 -#define X6 V22 -#define X7 V23 -#define X8 V24 -#define X9 V25 -#define X10 V26 -#define X11 V27 -#define X12 V28 -#define X13 V29 -#define X14 V30 -#define X15 V31 - -#define NUM_ROUNDS 20 - -#define ROUND4(a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, d0, d1, d2, d3) \ - VAF a1, a0, a0 \ - VAF b1, b0, b0 \ - VAF c1, c0, c0 \ - VAF d1, d0, d0 \ - VX a0, a2, a2 \ - VX b0, b2, b2 \ - VX c0, c2, c2 \ - VX d0, d2, d2 \ - VERLLF $16, a2, a2 \ - VERLLF $16, b2, b2 \ - VERLLF $16, c2, c2 \ - VERLLF $16, d2, d2 \ - VAF a2, a3, a3 \ - VAF b2, b3, b3 \ - VAF c2, c3, c3 \ - VAF d2, d3, d3 \ - VX a3, a1, a1 \ - VX b3, b1, b1 \ - VX c3, c1, c1 \ - VX d3, d1, d1 \ - VERLLF $12, a1, a1 \ - VERLLF $12, b1, b1 \ - VERLLF $12, c1, c1 \ - VERLLF $12, d1, d1 \ - VAF a1, a0, a0 \ - VAF b1, b0, b0 \ - VAF c1, c0, c0 \ - VAF d1, d0, d0 \ - VX a0, a2, a2 \ - VX b0, b2, b2 \ - VX c0, c2, c2 \ - VX d0, d2, d2 \ - VERLLF $8, a2, a2 \ - VERLLF $8, b2, b2 \ - VERLLF $8, c2, c2 \ - VERLLF $8, d2, d2 \ - VAF a2, a3, a3 \ - VAF b2, b3, b3 \ - VAF c2, c3, c3 \ - VAF d2, d3, d3 \ - VX a3, a1, a1 \ - VX b3, b1, b1 \ - VX c3, c1, c1 \ - VX d3, d1, d1 \ - VERLLF $7, a1, a1 \ - VERLLF $7, b1, b1 \ - VERLLF $7, c1, c1 \ - VERLLF $7, d1, d1 - -#define PERMUTE(mask, v0, v1, v2, v3) \ - VPERM v0, v0, mask, v0 \ - VPERM v1, v1, mask, v1 \ - VPERM v2, v2, mask, v2 \ - VPERM v3, v3, mask, v3 - -#define ADDV(x, v0, v1, v2, v3) \ - VAF x, v0, v0 \ - VAF x, v1, v1 \ - VAF x, v2, v2 \ - VAF x, v3, v3 - -#define XORV(off, dst, src, v0, v1, v2, v3) \ - VLM off(src), M0, M3 \ - PERMUTE(BSWAP, v0, v1, v2, v3) \ - VX v0, M0, M0 \ - VX v1, M1, M1 \ - VX v2, M2, M2 \ - VX v3, M3, M3 \ - VSTM M0, M3, off(dst) - -#define SHUFFLE(a, b, c, d, t, u, v, w) \ - VMRHF a, c, t \ // t = {a[0], c[0], a[1], c[1]} - VMRHF b, d, u \ // u = {b[0], d[0], b[1], d[1]} - VMRLF a, c, v \ // v = {a[2], c[2], a[3], c[3]} - VMRLF b, d, w \ // w = {b[2], d[2], b[3], d[3]} - VMRHF t, u, a \ // a = {a[0], b[0], c[0], d[0]} - VMRLF t, u, b \ // b = {a[1], b[1], c[1], d[1]} - VMRHF v, w, c \ // c = {a[2], b[2], c[2], d[2]} - VMRLF v, w, d // d = {a[3], b[3], c[3], d[3]} - -// func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32, buf *[256]byte, len *int) -TEXT ·xorKeyStreamVX(SB), NOSPLIT, $0 - MOVD $·constants<>(SB), R1 - MOVD dst+0(FP), R2 // R2=&dst[0] - LMG src+24(FP), R3, R4 // R3=&src[0] R4=len(src) - MOVD key+48(FP), R5 // R5=key - MOVD nonce+56(FP), R6 // R6=nonce - MOVD counter+64(FP), R7 // R7=counter - MOVD buf+72(FP), R8 // R8=buf - MOVD len+80(FP), R9 // R9=len - - // load BSWAP and J0 - VLM (R1), BSWAP, J0 - - // set up tail buffer - ADD $-1, R4, R12 - MOVBZ R12, R12 - CMPUBEQ R12, $255, aligned - MOVD R4, R1 - AND $~255, R1 - MOVD $(R3)(R1*1), R1 - EXRL $·mvcSrcToBuf(SB), R12 - MOVD $255, R0 - SUB R12, R0 - MOVD R0, (R9) // update len - -aligned: - // setup - MOVD $95, R0 - VLM (R5), KEY0, KEY1 - VLL R0, (R6), NONCE - VZERO M0 - VLEIB $7, $32, M0 - VSRLB M0, NONCE, NONCE - - // initialize counter values - VLREPF (R7), CTR - VZERO INC - VLEIF $1, $1, INC - VLEIF $2, $2, INC - VLEIF $3, $3, INC - VAF INC, CTR, CTR - VREPIF $4, INC - -chacha: - VREPF $0, J0, X0 - VREPF $1, J0, X1 - VREPF $2, J0, X2 - VREPF $3, J0, X3 - VREPF $0, KEY0, X4 - VREPF $1, KEY0, X5 - VREPF $2, KEY0, X6 - VREPF $3, KEY0, X7 - VREPF $0, KEY1, X8 - VREPF $1, KEY1, X9 - VREPF $2, KEY1, X10 - VREPF $3, KEY1, X11 - VLR CTR, X12 - VREPF $1, NONCE, X13 - VREPF $2, NONCE, X14 - VREPF $3, NONCE, X15 - - MOVD $(NUM_ROUNDS/2), R1 - -loop: - ROUND4(X0, X4, X12, X8, X1, X5, X13, X9, X2, X6, X14, X10, X3, X7, X15, X11) - ROUND4(X0, X5, X15, X10, X1, X6, X12, X11, X2, X7, X13, X8, X3, X4, X14, X9) - - ADD $-1, R1 - BNE loop - - // decrement length - ADD $-256, R4 - BLT tail - -continue: - // rearrange vectors - SHUFFLE(X0, X1, X2, X3, M0, M1, M2, M3) - ADDV(J0, X0, X1, X2, X3) - SHUFFLE(X4, X5, X6, X7, M0, M1, M2, M3) - ADDV(KEY0, X4, X5, X6, X7) - SHUFFLE(X8, X9, X10, X11, M0, M1, M2, M3) - ADDV(KEY1, X8, X9, X10, X11) - VAF CTR, X12, X12 - SHUFFLE(X12, X13, X14, X15, M0, M1, M2, M3) - ADDV(NONCE, X12, X13, X14, X15) - - // increment counters - VAF INC, CTR, CTR - - // xor keystream with plaintext - XORV(0*64, R2, R3, X0, X4, X8, X12) - XORV(1*64, R2, R3, X1, X5, X9, X13) - XORV(2*64, R2, R3, X2, X6, X10, X14) - XORV(3*64, R2, R3, X3, X7, X11, X15) - - // increment pointers - MOVD $256(R2), R2 - MOVD $256(R3), R3 - - CMPBNE R4, $0, chacha - CMPUBEQ R12, $255, return - EXRL $·mvcBufToDst(SB), R12 // len was updated during setup - -return: - VSTEF $0, CTR, (R7) - RET - -tail: - MOVD R2, R9 - MOVD R8, R2 - MOVD R8, R3 - MOVD $0, R4 - JMP continue - -// func hasVectorFacility() bool -TEXT ·hasVectorFacility(SB), NOSPLIT, $24-1 - MOVD $x-24(SP), R1 - XC $24, 0(R1), 0(R1) // clear the storage - MOVD $2, R0 // R0 is the number of double words stored -1 - WORD $0xB2B01000 // STFLE 0(R1) - XOR R0, R0 // reset the value of R0 - MOVBZ z-8(SP), R1 - AND $0x40, R1 - BEQ novector - -vectorinstalled: - // check if the vector instruction has been enabled - VLEIB $0, $0xF, V16 - VLGVB $0, V16, R1 - CMPBNE R1, $0xF, novector - MOVB $1, ret+0(FP) // have vx - RET - -novector: - MOVB $0, ret+0(FP) // no vx - RET diff --git a/vendor/golang.org/x/crypto/internal/chacha20/xor.go b/vendor/golang.org/x/crypto/internal/chacha20/xor.go deleted file mode 100644 index 9c5ba0b33ae3..000000000000 --- a/vendor/golang.org/x/crypto/internal/chacha20/xor.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found src the LICENSE file. - -package chacha20 - -import ( - "runtime" -) - -// Platforms that have fast unaligned 32-bit little endian accesses. -const unaligned = runtime.GOARCH == "386" || - runtime.GOARCH == "amd64" || - runtime.GOARCH == "arm64" || - runtime.GOARCH == "ppc64le" || - runtime.GOARCH == "s390x" - -// xor reads a little endian uint32 from src, XORs it with u and -// places the result in little endian byte order in dst. -func xor(dst, src []byte, u uint32) { - _, _ = src[3], dst[3] // eliminate bounds checks - if unaligned { - // The compiler should optimize this code into - // 32-bit unaligned little endian loads and stores. - // TODO: delete once the compiler does a reliably - // good job with the generic code below. - // See issue #25111 for more details. - v := uint32(src[0]) - v |= uint32(src[1]) << 8 - v |= uint32(src[2]) << 16 - v |= uint32(src[3]) << 24 - v ^= u - dst[0] = byte(v) - dst[1] = byte(v >> 8) - dst[2] = byte(v >> 16) - dst[3] = byte(v >> 24) - } else { - dst[0] = src[0] ^ byte(u) - dst[1] = src[1] ^ byte(u>>8) - dst[2] = src[2] ^ byte(u>>16) - dst[3] = src[3] ^ byte(u>>24) - } -} diff --git a/vendor/golang.org/x/crypto/internal/subtle/aliasing.go b/vendor/golang.org/x/crypto/internal/subtle/aliasing.go deleted file mode 100644 index f38797bfa1bf..000000000000 --- a/vendor/golang.org/x/crypto/internal/subtle/aliasing.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2018 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 !appengine - -// Package subtle implements functions that are often useful in cryptographic -// code but require careful thought to use correctly. -package subtle // import "golang.org/x/crypto/internal/subtle" - -import "unsafe" - -// AnyOverlap reports whether x and y share memory at any (not necessarily -// corresponding) index. The memory beyond the slice length is ignored. -func AnyOverlap(x, y []byte) bool { - return len(x) > 0 && len(y) > 0 && - uintptr(unsafe.Pointer(&x[0])) <= uintptr(unsafe.Pointer(&y[len(y)-1])) && - uintptr(unsafe.Pointer(&y[0])) <= uintptr(unsafe.Pointer(&x[len(x)-1])) -} - -// InexactOverlap reports whether x and y share memory at any non-corresponding -// index. The memory beyond the slice length is ignored. Note that x and y can -// have different lengths and still not have any inexact overlap. -// -// InexactOverlap can be used to implement the requirements of the crypto/cipher -// AEAD, Block, BlockMode and Stream interfaces. -func InexactOverlap(x, y []byte) bool { - if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { - return false - } - return AnyOverlap(x, y) -} diff --git a/vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go b/vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go deleted file mode 100644 index 0cc4a8a642c9..000000000000 --- a/vendor/golang.org/x/crypto/internal/subtle/aliasing_appengine.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2018 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 appengine - -// Package subtle implements functions that are often useful in cryptographic -// code but require careful thought to use correctly. -package subtle // import "golang.org/x/crypto/internal/subtle" - -// This is the Google App Engine standard variant based on reflect -// because the unsafe package and cgo are disallowed. - -import "reflect" - -// AnyOverlap reports whether x and y share memory at any (not necessarily -// corresponding) index. The memory beyond the slice length is ignored. -func AnyOverlap(x, y []byte) bool { - return len(x) > 0 && len(y) > 0 && - reflect.ValueOf(&x[0]).Pointer() <= reflect.ValueOf(&y[len(y)-1]).Pointer() && - reflect.ValueOf(&y[0]).Pointer() <= reflect.ValueOf(&x[len(x)-1]).Pointer() -} - -// InexactOverlap reports whether x and y share memory at any non-corresponding -// index. The memory beyond the slice length is ignored. Note that x and y can -// have different lengths and still not have any inexact overlap. -// -// InexactOverlap can be used to implement the requirements of the crypto/cipher -// AEAD, Block, BlockMode and Stream interfaces. -func InexactOverlap(x, y []byte) bool { - if len(x) == 0 || len(y) == 0 || &x[0] == &y[0] { - return false - } - return AnyOverlap(x, y) -} diff --git a/vendor/golang.org/x/crypto/openpgp/armor/armor.go b/vendor/golang.org/x/crypto/openpgp/armor/armor.go deleted file mode 100644 index 592d18643617..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/armor/armor.go +++ /dev/null @@ -1,219 +0,0 @@ -// 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. - -// Package armor implements OpenPGP ASCII Armor, see RFC 4880. OpenPGP Armor is -// very similar to PEM except that it has an additional CRC checksum. -package armor // import "golang.org/x/crypto/openpgp/armor" - -import ( - "bufio" - "bytes" - "encoding/base64" - "golang.org/x/crypto/openpgp/errors" - "io" -) - -// A Block represents an OpenPGP armored structure. -// -// The encoded form is: -// -----BEGIN Type----- -// Headers -// -// base64-encoded Bytes -// '=' base64 encoded checksum -// -----END Type----- -// where Headers is a possibly empty sequence of Key: Value lines. -// -// Since the armored data can be very large, this package presents a streaming -// interface. -type Block struct { - Type string // The type, taken from the preamble (i.e. "PGP SIGNATURE"). - Header map[string]string // Optional headers. - Body io.Reader // A Reader from which the contents can be read - lReader lineReader - oReader openpgpReader -} - -var ArmorCorrupt error = errors.StructuralError("armor invalid") - -const crc24Init = 0xb704ce -const crc24Poly = 0x1864cfb -const crc24Mask = 0xffffff - -// crc24 calculates the OpenPGP checksum as specified in RFC 4880, section 6.1 -func crc24(crc uint32, d []byte) uint32 { - for _, b := range d { - crc ^= uint32(b) << 16 - for i := 0; i < 8; i++ { - crc <<= 1 - if crc&0x1000000 != 0 { - crc ^= crc24Poly - } - } - } - return crc -} - -var armorStart = []byte("-----BEGIN ") -var armorEnd = []byte("-----END ") -var armorEndOfLine = []byte("-----") - -// lineReader wraps a line based reader. It watches for the end of an armor -// block and records the expected CRC value. -type lineReader struct { - in *bufio.Reader - buf []byte - eof bool - crc uint32 -} - -func (l *lineReader) Read(p []byte) (n int, err error) { - if l.eof { - return 0, io.EOF - } - - if len(l.buf) > 0 { - n = copy(p, l.buf) - l.buf = l.buf[n:] - return - } - - line, isPrefix, err := l.in.ReadLine() - if err != nil { - return - } - if isPrefix { - return 0, ArmorCorrupt - } - - if len(line) == 5 && line[0] == '=' { - // This is the checksum line - var expectedBytes [3]byte - var m int - m, err = base64.StdEncoding.Decode(expectedBytes[0:], line[1:]) - if m != 3 || err != nil { - return - } - l.crc = uint32(expectedBytes[0])<<16 | - uint32(expectedBytes[1])<<8 | - uint32(expectedBytes[2]) - - line, _, err = l.in.ReadLine() - if err != nil && err != io.EOF { - return - } - if !bytes.HasPrefix(line, armorEnd) { - return 0, ArmorCorrupt - } - - l.eof = true - return 0, io.EOF - } - - if len(line) > 96 { - return 0, ArmorCorrupt - } - - n = copy(p, line) - bytesToSave := len(line) - n - if bytesToSave > 0 { - if cap(l.buf) < bytesToSave { - l.buf = make([]byte, 0, bytesToSave) - } - l.buf = l.buf[0:bytesToSave] - copy(l.buf, line[n:]) - } - - return -} - -// openpgpReader passes Read calls to the underlying base64 decoder, but keeps -// a running CRC of the resulting data and checks the CRC against the value -// found by the lineReader at EOF. -type openpgpReader struct { - lReader *lineReader - b64Reader io.Reader - currentCRC uint32 -} - -func (r *openpgpReader) Read(p []byte) (n int, err error) { - n, err = r.b64Reader.Read(p) - r.currentCRC = crc24(r.currentCRC, p[:n]) - - if err == io.EOF { - if r.lReader.crc != uint32(r.currentCRC&crc24Mask) { - return 0, ArmorCorrupt - } - } - - return -} - -// Decode reads a PGP armored block from the given Reader. It will ignore -// leading garbage. If it doesn't find a block, it will return nil, io.EOF. The -// given Reader is not usable after calling this function: an arbitrary amount -// of data may have been read past the end of the block. -func Decode(in io.Reader) (p *Block, err error) { - r := bufio.NewReaderSize(in, 100) - var line []byte - ignoreNext := false - -TryNextBlock: - p = nil - - // Skip leading garbage - for { - ignoreThis := ignoreNext - line, ignoreNext, err = r.ReadLine() - if err != nil { - return - } - if ignoreNext || ignoreThis { - continue - } - line = bytes.TrimSpace(line) - if len(line) > len(armorStart)+len(armorEndOfLine) && bytes.HasPrefix(line, armorStart) { - break - } - } - - p = new(Block) - p.Type = string(line[len(armorStart) : len(line)-len(armorEndOfLine)]) - p.Header = make(map[string]string) - nextIsContinuation := false - var lastKey string - - // Read headers - for { - isContinuation := nextIsContinuation - line, nextIsContinuation, err = r.ReadLine() - if err != nil { - p = nil - return - } - if isContinuation { - p.Header[lastKey] += string(line) - continue - } - line = bytes.TrimSpace(line) - if len(line) == 0 { - break - } - - i := bytes.Index(line, []byte(": ")) - if i == -1 { - goto TryNextBlock - } - lastKey = string(line[:i]) - p.Header[lastKey] = string(line[i+2:]) - } - - p.lReader.in = r - p.oReader.currentCRC = crc24Init - p.oReader.lReader = &p.lReader - p.oReader.b64Reader = base64.NewDecoder(base64.StdEncoding, &p.lReader) - p.Body = &p.oReader - - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/armor/encode.go b/vendor/golang.org/x/crypto/openpgp/armor/encode.go deleted file mode 100644 index 6f07582c37ce..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/armor/encode.go +++ /dev/null @@ -1,160 +0,0 @@ -// 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. - -package armor - -import ( - "encoding/base64" - "io" -) - -var armorHeaderSep = []byte(": ") -var blockEnd = []byte("\n=") -var newline = []byte("\n") -var armorEndOfLineOut = []byte("-----\n") - -// writeSlices writes its arguments to the given Writer. -func writeSlices(out io.Writer, slices ...[]byte) (err error) { - for _, s := range slices { - _, err = out.Write(s) - if err != nil { - return err - } - } - return -} - -// lineBreaker breaks data across several lines, all of the same byte length -// (except possibly the last). Lines are broken with a single '\n'. -type lineBreaker struct { - lineLength int - line []byte - used int - out io.Writer - haveWritten bool -} - -func newLineBreaker(out io.Writer, lineLength int) *lineBreaker { - return &lineBreaker{ - lineLength: lineLength, - line: make([]byte, lineLength), - used: 0, - out: out, - } -} - -func (l *lineBreaker) Write(b []byte) (n int, err error) { - n = len(b) - - if n == 0 { - return - } - - if l.used == 0 && l.haveWritten { - _, err = l.out.Write([]byte{'\n'}) - if err != nil { - return - } - } - - if l.used+len(b) < l.lineLength { - l.used += copy(l.line[l.used:], b) - return - } - - l.haveWritten = true - _, err = l.out.Write(l.line[0:l.used]) - if err != nil { - return - } - excess := l.lineLength - l.used - l.used = 0 - - _, err = l.out.Write(b[0:excess]) - if err != nil { - return - } - - _, err = l.Write(b[excess:]) - return -} - -func (l *lineBreaker) Close() (err error) { - if l.used > 0 { - _, err = l.out.Write(l.line[0:l.used]) - if err != nil { - return - } - } - - return -} - -// encoding keeps track of a running CRC24 over the data which has been written -// to it and outputs a OpenPGP checksum when closed, followed by an armor -// trailer. -// -// It's built into a stack of io.Writers: -// encoding -> base64 encoder -> lineBreaker -> out -type encoding struct { - out io.Writer - breaker *lineBreaker - b64 io.WriteCloser - crc uint32 - blockType []byte -} - -func (e *encoding) Write(data []byte) (n int, err error) { - e.crc = crc24(e.crc, data) - return e.b64.Write(data) -} - -func (e *encoding) Close() (err error) { - err = e.b64.Close() - if err != nil { - return - } - e.breaker.Close() - - var checksumBytes [3]byte - checksumBytes[0] = byte(e.crc >> 16) - checksumBytes[1] = byte(e.crc >> 8) - checksumBytes[2] = byte(e.crc) - - var b64ChecksumBytes [4]byte - base64.StdEncoding.Encode(b64ChecksumBytes[:], checksumBytes[:]) - - return writeSlices(e.out, blockEnd, b64ChecksumBytes[:], newline, armorEnd, e.blockType, armorEndOfLine) -} - -// Encode returns a WriteCloser which will encode the data written to it in -// OpenPGP armor. -func Encode(out io.Writer, blockType string, headers map[string]string) (w io.WriteCloser, err error) { - bType := []byte(blockType) - err = writeSlices(out, armorStart, bType, armorEndOfLineOut) - if err != nil { - return - } - - for k, v := range headers { - err = writeSlices(out, []byte(k), armorHeaderSep, []byte(v), newline) - if err != nil { - return - } - } - - _, err = out.Write(newline) - if err != nil { - return - } - - e := &encoding{ - out: out, - breaker: newLineBreaker(out, 64), - crc: crc24Init, - blockType: bType, - } - e.b64 = base64.NewEncoder(base64.StdEncoding, e.breaker) - return e, nil -} diff --git a/vendor/golang.org/x/crypto/openpgp/canonical_text.go b/vendor/golang.org/x/crypto/openpgp/canonical_text.go deleted file mode 100644 index e601e389f129..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/canonical_text.go +++ /dev/null @@ -1,59 +0,0 @@ -// 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 openpgp - -import "hash" - -// NewCanonicalTextHash reformats text written to it into the canonical -// form and then applies the hash h. See RFC 4880, section 5.2.1. -func NewCanonicalTextHash(h hash.Hash) hash.Hash { - return &canonicalTextHash{h, 0} -} - -type canonicalTextHash struct { - h hash.Hash - s int -} - -var newline = []byte{'\r', '\n'} - -func (cth *canonicalTextHash) Write(buf []byte) (int, error) { - start := 0 - - for i, c := range buf { - switch cth.s { - case 0: - if c == '\r' { - cth.s = 1 - } else if c == '\n' { - cth.h.Write(buf[start:i]) - cth.h.Write(newline) - start = i + 1 - } - case 1: - cth.s = 0 - } - } - - cth.h.Write(buf[start:]) - return len(buf), nil -} - -func (cth *canonicalTextHash) Sum(in []byte) []byte { - return cth.h.Sum(in) -} - -func (cth *canonicalTextHash) Reset() { - cth.h.Reset() - cth.s = 0 -} - -func (cth *canonicalTextHash) Size() int { - return cth.h.Size() -} - -func (cth *canonicalTextHash) BlockSize() int { - return cth.h.BlockSize() -} diff --git a/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go b/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go deleted file mode 100644 index 73f4fe378591..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/elgamal/elgamal.go +++ /dev/null @@ -1,122 +0,0 @@ -// 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 elgamal implements ElGamal encryption, suitable for OpenPGP, -// as specified in "A Public-Key Cryptosystem and a Signature Scheme Based on -// Discrete Logarithms," IEEE Transactions on Information Theory, v. IT-31, -// n. 4, 1985, pp. 469-472. -// -// This form of ElGamal embeds PKCS#1 v1.5 padding, which may make it -// unsuitable for other protocols. RSA should be used in preference in any -// case. -package elgamal // import "golang.org/x/crypto/openpgp/elgamal" - -import ( - "crypto/rand" - "crypto/subtle" - "errors" - "io" - "math/big" -) - -// PublicKey represents an ElGamal public key. -type PublicKey struct { - G, P, Y *big.Int -} - -// PrivateKey represents an ElGamal private key. -type PrivateKey struct { - PublicKey - X *big.Int -} - -// Encrypt encrypts the given message to the given public key. The result is a -// pair of integers. Errors can result from reading random, or because msg is -// too large to be encrypted to the public key. -func Encrypt(random io.Reader, pub *PublicKey, msg []byte) (c1, c2 *big.Int, err error) { - pLen := (pub.P.BitLen() + 7) / 8 - if len(msg) > pLen-11 { - err = errors.New("elgamal: message too long") - return - } - - // EM = 0x02 || PS || 0x00 || M - em := make([]byte, pLen-1) - em[0] = 2 - ps, mm := em[1:len(em)-len(msg)-1], em[len(em)-len(msg):] - err = nonZeroRandomBytes(ps, random) - if err != nil { - return - } - em[len(em)-len(msg)-1] = 0 - copy(mm, msg) - - m := new(big.Int).SetBytes(em) - - k, err := rand.Int(random, pub.P) - if err != nil { - return - } - - c1 = new(big.Int).Exp(pub.G, k, pub.P) - s := new(big.Int).Exp(pub.Y, k, pub.P) - c2 = s.Mul(s, m) - c2.Mod(c2, pub.P) - - return -} - -// Decrypt takes two integers, resulting from an ElGamal encryption, and -// returns the plaintext of the message. An error can result only if the -// ciphertext is invalid. Users should keep in mind that this is a padding -// oracle and thus, if exposed to an adaptive chosen ciphertext attack, can -// be used to break the cryptosystem. See ``Chosen Ciphertext Attacks -// Against Protocols Based on the RSA Encryption Standard PKCS #1'', Daniel -// Bleichenbacher, Advances in Cryptology (Crypto '98), -func Decrypt(priv *PrivateKey, c1, c2 *big.Int) (msg []byte, err error) { - s := new(big.Int).Exp(c1, priv.X, priv.P) - s.ModInverse(s, priv.P) - s.Mul(s, c2) - s.Mod(s, priv.P) - em := s.Bytes() - - firstByteIsTwo := subtle.ConstantTimeByteEq(em[0], 2) - - // The remainder of the plaintext must be a string of non-zero random - // octets, followed by a 0, followed by the message. - // lookingForIndex: 1 iff we are still looking for the zero. - // index: the offset of the first zero byte. - var lookingForIndex, index int - lookingForIndex = 1 - - for i := 1; i < len(em); i++ { - equals0 := subtle.ConstantTimeByteEq(em[i], 0) - index = subtle.ConstantTimeSelect(lookingForIndex&equals0, i, index) - lookingForIndex = subtle.ConstantTimeSelect(equals0, 0, lookingForIndex) - } - - if firstByteIsTwo != 1 || lookingForIndex != 0 || index < 9 { - return nil, errors.New("elgamal: decryption error") - } - return em[index+1:], nil -} - -// nonZeroRandomBytes fills the given slice with non-zero random octets. -func nonZeroRandomBytes(s []byte, rand io.Reader) (err error) { - _, err = io.ReadFull(rand, s) - if err != nil { - return - } - - for i := 0; i < len(s); i++ { - for s[i] == 0 { - _, err = io.ReadFull(rand, s[i:i+1]) - if err != nil { - return - } - } - } - - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/errors/errors.go b/vendor/golang.org/x/crypto/openpgp/errors/errors.go deleted file mode 100644 index eb0550b2d04f..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/errors/errors.go +++ /dev/null @@ -1,72 +0,0 @@ -// 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. - -// Package errors contains common error types for the OpenPGP packages. -package errors // import "golang.org/x/crypto/openpgp/errors" - -import ( - "strconv" -) - -// A StructuralError is returned when OpenPGP data is found to be syntactically -// invalid. -type StructuralError string - -func (s StructuralError) Error() string { - return "openpgp: invalid data: " + string(s) -} - -// UnsupportedError indicates that, although the OpenPGP data is valid, it -// makes use of currently unimplemented features. -type UnsupportedError string - -func (s UnsupportedError) Error() string { - return "openpgp: unsupported feature: " + string(s) -} - -// InvalidArgumentError indicates that the caller is in error and passed an -// incorrect value. -type InvalidArgumentError string - -func (i InvalidArgumentError) Error() string { - return "openpgp: invalid argument: " + string(i) -} - -// SignatureError indicates that a syntactically valid signature failed to -// validate. -type SignatureError string - -func (b SignatureError) Error() string { - return "openpgp: invalid signature: " + string(b) -} - -type keyIncorrectError int - -func (ki keyIncorrectError) Error() string { - return "openpgp: incorrect key" -} - -var ErrKeyIncorrect error = keyIncorrectError(0) - -type unknownIssuerError int - -func (unknownIssuerError) Error() string { - return "openpgp: signature made by unknown entity" -} - -var ErrUnknownIssuer error = unknownIssuerError(0) - -type keyRevokedError int - -func (keyRevokedError) Error() string { - return "openpgp: signature made by revoked key" -} - -var ErrKeyRevoked error = keyRevokedError(0) - -type UnknownPacketTypeError uint8 - -func (upte UnknownPacketTypeError) Error() string { - return "openpgp: unknown packet type: " + strconv.Itoa(int(upte)) -} diff --git a/vendor/golang.org/x/crypto/openpgp/keys.go b/vendor/golang.org/x/crypto/openpgp/keys.go deleted file mode 100644 index 3e2518600e29..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/keys.go +++ /dev/null @@ -1,693 +0,0 @@ -// 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 openpgp - -import ( - "crypto/rsa" - "io" - "time" - - "golang.org/x/crypto/openpgp/armor" - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/packet" -) - -// PublicKeyType is the armor type for a PGP public key. -var PublicKeyType = "PGP PUBLIC KEY BLOCK" - -// PrivateKeyType is the armor type for a PGP private key. -var PrivateKeyType = "PGP PRIVATE KEY BLOCK" - -// An Entity represents the components of an OpenPGP key: a primary public key -// (which must be a signing key), one or more identities claimed by that key, -// and zero or more subkeys, which may be encryption keys. -type Entity struct { - PrimaryKey *packet.PublicKey - PrivateKey *packet.PrivateKey - Identities map[string]*Identity // indexed by Identity.Name - Revocations []*packet.Signature - Subkeys []Subkey -} - -// An Identity represents an identity claimed by an Entity and zero or more -// assertions by other entities about that claim. -type Identity struct { - Name string // by convention, has the form "Full Name (comment) " - UserId *packet.UserId - SelfSignature *packet.Signature - Signatures []*packet.Signature -} - -// A Subkey is an additional public key in an Entity. Subkeys can be used for -// encryption. -type Subkey struct { - PublicKey *packet.PublicKey - PrivateKey *packet.PrivateKey - Sig *packet.Signature -} - -// A Key identifies a specific public key in an Entity. This is either the -// Entity's primary key or a subkey. -type Key struct { - Entity *Entity - PublicKey *packet.PublicKey - PrivateKey *packet.PrivateKey - SelfSignature *packet.Signature -} - -// A KeyRing provides access to public and private keys. -type KeyRing interface { - // KeysById returns the set of keys that have the given key id. - KeysById(id uint64) []Key - // KeysByIdAndUsage returns the set of keys with the given id - // that also meet the key usage given by requiredUsage. - // The requiredUsage is expressed as the bitwise-OR of - // packet.KeyFlag* values. - KeysByIdUsage(id uint64, requiredUsage byte) []Key - // DecryptionKeys returns all private keys that are valid for - // decryption. - DecryptionKeys() []Key -} - -// primaryIdentity returns the Identity marked as primary or the first identity -// if none are so marked. -func (e *Entity) primaryIdentity() *Identity { - var firstIdentity *Identity - for _, ident := range e.Identities { - if firstIdentity == nil { - firstIdentity = ident - } - if ident.SelfSignature.IsPrimaryId != nil && *ident.SelfSignature.IsPrimaryId { - return ident - } - } - return firstIdentity -} - -// encryptionKey returns the best candidate Key for encrypting a message to the -// given Entity. -func (e *Entity) encryptionKey(now time.Time) (Key, bool) { - candidateSubkey := -1 - - // Iterate the keys to find the newest key - var maxTime time.Time - for i, subkey := range e.Subkeys { - if subkey.Sig.FlagsValid && - subkey.Sig.FlagEncryptCommunications && - subkey.PublicKey.PubKeyAlgo.CanEncrypt() && - !subkey.Sig.KeyExpired(now) && - (maxTime.IsZero() || subkey.Sig.CreationTime.After(maxTime)) { - candidateSubkey = i - maxTime = subkey.Sig.CreationTime - } - } - - if candidateSubkey != -1 { - subkey := e.Subkeys[candidateSubkey] - return Key{e, subkey.PublicKey, subkey.PrivateKey, subkey.Sig}, true - } - - // If we don't have any candidate subkeys for encryption and - // the primary key doesn't have any usage metadata then we - // assume that the primary key is ok. Or, if the primary key is - // marked as ok to encrypt to, then we can obviously use it. - i := e.primaryIdentity() - if !i.SelfSignature.FlagsValid || i.SelfSignature.FlagEncryptCommunications && - e.PrimaryKey.PubKeyAlgo.CanEncrypt() && - !i.SelfSignature.KeyExpired(now) { - return Key{e, e.PrimaryKey, e.PrivateKey, i.SelfSignature}, true - } - - // This Entity appears to be signing only. - return Key{}, false -} - -// signingKey return the best candidate Key for signing a message with this -// Entity. -func (e *Entity) signingKey(now time.Time) (Key, bool) { - candidateSubkey := -1 - - for i, subkey := range e.Subkeys { - if subkey.Sig.FlagsValid && - subkey.Sig.FlagSign && - subkey.PublicKey.PubKeyAlgo.CanSign() && - !subkey.Sig.KeyExpired(now) { - candidateSubkey = i - break - } - } - - if candidateSubkey != -1 { - subkey := e.Subkeys[candidateSubkey] - return Key{e, subkey.PublicKey, subkey.PrivateKey, subkey.Sig}, true - } - - // If we have no candidate subkey then we assume that it's ok to sign - // with the primary key. - i := e.primaryIdentity() - if !i.SelfSignature.FlagsValid || i.SelfSignature.FlagSign && - !i.SelfSignature.KeyExpired(now) { - return Key{e, e.PrimaryKey, e.PrivateKey, i.SelfSignature}, true - } - - return Key{}, false -} - -// An EntityList contains one or more Entities. -type EntityList []*Entity - -// KeysById returns the set of keys that have the given key id. -func (el EntityList) KeysById(id uint64) (keys []Key) { - for _, e := range el { - if e.PrimaryKey.KeyId == id { - var selfSig *packet.Signature - for _, ident := range e.Identities { - if selfSig == nil { - selfSig = ident.SelfSignature - } else if ident.SelfSignature.IsPrimaryId != nil && *ident.SelfSignature.IsPrimaryId { - selfSig = ident.SelfSignature - break - } - } - keys = append(keys, Key{e, e.PrimaryKey, e.PrivateKey, selfSig}) - } - - for _, subKey := range e.Subkeys { - if subKey.PublicKey.KeyId == id { - keys = append(keys, Key{e, subKey.PublicKey, subKey.PrivateKey, subKey.Sig}) - } - } - } - return -} - -// KeysByIdAndUsage returns the set of keys with the given id that also meet -// the key usage given by requiredUsage. The requiredUsage is expressed as -// the bitwise-OR of packet.KeyFlag* values. -func (el EntityList) KeysByIdUsage(id uint64, requiredUsage byte) (keys []Key) { - for _, key := range el.KeysById(id) { - if len(key.Entity.Revocations) > 0 { - continue - } - - if key.SelfSignature.RevocationReason != nil { - continue - } - - if key.SelfSignature.FlagsValid && requiredUsage != 0 { - var usage byte - if key.SelfSignature.FlagCertify { - usage |= packet.KeyFlagCertify - } - if key.SelfSignature.FlagSign { - usage |= packet.KeyFlagSign - } - if key.SelfSignature.FlagEncryptCommunications { - usage |= packet.KeyFlagEncryptCommunications - } - if key.SelfSignature.FlagEncryptStorage { - usage |= packet.KeyFlagEncryptStorage - } - if usage&requiredUsage != requiredUsage { - continue - } - } - - keys = append(keys, key) - } - return -} - -// DecryptionKeys returns all private keys that are valid for decryption. -func (el EntityList) DecryptionKeys() (keys []Key) { - for _, e := range el { - for _, subKey := range e.Subkeys { - if subKey.PrivateKey != nil && (!subKey.Sig.FlagsValid || subKey.Sig.FlagEncryptStorage || subKey.Sig.FlagEncryptCommunications) { - keys = append(keys, Key{e, subKey.PublicKey, subKey.PrivateKey, subKey.Sig}) - } - } - } - return -} - -// ReadArmoredKeyRing reads one or more public/private keys from an armor keyring file. -func ReadArmoredKeyRing(r io.Reader) (EntityList, error) { - block, err := armor.Decode(r) - if err == io.EOF { - return nil, errors.InvalidArgumentError("no armored data found") - } - if err != nil { - return nil, err - } - if block.Type != PublicKeyType && block.Type != PrivateKeyType { - return nil, errors.InvalidArgumentError("expected public or private key block, got: " + block.Type) - } - - return ReadKeyRing(block.Body) -} - -// ReadKeyRing reads one or more public/private keys. Unsupported keys are -// ignored as long as at least a single valid key is found. -func ReadKeyRing(r io.Reader) (el EntityList, err error) { - packets := packet.NewReader(r) - var lastUnsupportedError error - - for { - var e *Entity - e, err = ReadEntity(packets) - if err != nil { - // TODO: warn about skipped unsupported/unreadable keys - if _, ok := err.(errors.UnsupportedError); ok { - lastUnsupportedError = err - err = readToNextPublicKey(packets) - } else if _, ok := err.(errors.StructuralError); ok { - // Skip unreadable, badly-formatted keys - lastUnsupportedError = err - err = readToNextPublicKey(packets) - } - if err == io.EOF { - err = nil - break - } - if err != nil { - el = nil - break - } - } else { - el = append(el, e) - } - } - - if len(el) == 0 && err == nil { - err = lastUnsupportedError - } - return -} - -// readToNextPublicKey reads packets until the start of the entity and leaves -// the first packet of the new entity in the Reader. -func readToNextPublicKey(packets *packet.Reader) (err error) { - var p packet.Packet - for { - p, err = packets.Next() - if err == io.EOF { - return - } else if err != nil { - if _, ok := err.(errors.UnsupportedError); ok { - err = nil - continue - } - return - } - - if pk, ok := p.(*packet.PublicKey); ok && !pk.IsSubkey { - packets.Unread(p) - return - } - } -} - -// ReadEntity reads an entity (public key, identities, subkeys etc) from the -// given Reader. -func ReadEntity(packets *packet.Reader) (*Entity, error) { - e := new(Entity) - e.Identities = make(map[string]*Identity) - - p, err := packets.Next() - if err != nil { - return nil, err - } - - var ok bool - if e.PrimaryKey, ok = p.(*packet.PublicKey); !ok { - if e.PrivateKey, ok = p.(*packet.PrivateKey); !ok { - packets.Unread(p) - return nil, errors.StructuralError("first packet was not a public/private key") - } - e.PrimaryKey = &e.PrivateKey.PublicKey - } - - if !e.PrimaryKey.PubKeyAlgo.CanSign() { - return nil, errors.StructuralError("primary key cannot be used for signatures") - } - - var revocations []*packet.Signature -EachPacket: - for { - p, err := packets.Next() - if err == io.EOF { - break - } else if err != nil { - return nil, err - } - - switch pkt := p.(type) { - case *packet.UserId: - if err := addUserID(e, packets, pkt); err != nil { - return nil, err - } - case *packet.Signature: - if pkt.SigType == packet.SigTypeKeyRevocation { - revocations = append(revocations, pkt) - } else if pkt.SigType == packet.SigTypeDirectSignature { - // TODO: RFC4880 5.2.1 permits signatures - // directly on keys (eg. to bind additional - // revocation keys). - } - // Else, ignoring the signature as it does not follow anything - // we would know to attach it to. - case *packet.PrivateKey: - if pkt.IsSubkey == false { - packets.Unread(p) - break EachPacket - } - err = addSubkey(e, packets, &pkt.PublicKey, pkt) - if err != nil { - return nil, err - } - case *packet.PublicKey: - if pkt.IsSubkey == false { - packets.Unread(p) - break EachPacket - } - err = addSubkey(e, packets, pkt, nil) - if err != nil { - return nil, err - } - default: - // we ignore unknown packets - } - } - - if len(e.Identities) == 0 { - return nil, errors.StructuralError("entity without any identities") - } - - for _, revocation := range revocations { - err = e.PrimaryKey.VerifyRevocationSignature(revocation) - if err == nil { - e.Revocations = append(e.Revocations, revocation) - } else { - // TODO: RFC 4880 5.2.3.15 defines revocation keys. - return nil, errors.StructuralError("revocation signature signed by alternate key") - } - } - - return e, nil -} - -func addUserID(e *Entity, packets *packet.Reader, pkt *packet.UserId) error { - // Make a new Identity object, that we might wind up throwing away. - // We'll only add it if we get a valid self-signature over this - // userID. - identity := new(Identity) - identity.Name = pkt.Id - identity.UserId = pkt - - for { - p, err := packets.Next() - if err == io.EOF { - break - } else if err != nil { - return err - } - - sig, ok := p.(*packet.Signature) - if !ok { - packets.Unread(p) - break - } - - if (sig.SigType == packet.SigTypePositiveCert || sig.SigType == packet.SigTypeGenericCert) && sig.IssuerKeyId != nil && *sig.IssuerKeyId == e.PrimaryKey.KeyId { - if err = e.PrimaryKey.VerifyUserIdSignature(pkt.Id, e.PrimaryKey, sig); err != nil { - return errors.StructuralError("user ID self-signature invalid: " + err.Error()) - } - identity.SelfSignature = sig - e.Identities[pkt.Id] = identity - } else { - identity.Signatures = append(identity.Signatures, sig) - } - } - - return nil -} - -func addSubkey(e *Entity, packets *packet.Reader, pub *packet.PublicKey, priv *packet.PrivateKey) error { - var subKey Subkey - subKey.PublicKey = pub - subKey.PrivateKey = priv - - for { - p, err := packets.Next() - if err == io.EOF { - break - } else if err != nil { - return errors.StructuralError("subkey signature invalid: " + err.Error()) - } - - sig, ok := p.(*packet.Signature) - if !ok { - packets.Unread(p) - break - } - - if sig.SigType != packet.SigTypeSubkeyBinding && sig.SigType != packet.SigTypeSubkeyRevocation { - return errors.StructuralError("subkey signature with wrong type") - } - - if err := e.PrimaryKey.VerifyKeySignature(subKey.PublicKey, sig); err != nil { - return errors.StructuralError("subkey signature invalid: " + err.Error()) - } - - switch sig.SigType { - case packet.SigTypeSubkeyRevocation: - subKey.Sig = sig - case packet.SigTypeSubkeyBinding: - - if shouldReplaceSubkeySig(subKey.Sig, sig) { - subKey.Sig = sig - } - } - } - - if subKey.Sig == nil { - return errors.StructuralError("subkey packet not followed by signature") - } - - e.Subkeys = append(e.Subkeys, subKey) - - return nil -} - -func shouldReplaceSubkeySig(existingSig, potentialNewSig *packet.Signature) bool { - if potentialNewSig == nil { - return false - } - - if existingSig == nil { - return true - } - - if existingSig.SigType == packet.SigTypeSubkeyRevocation { - return false // never override a revocation signature - } - - return potentialNewSig.CreationTime.After(existingSig.CreationTime) -} - -const defaultRSAKeyBits = 2048 - -// NewEntity returns an Entity that contains a fresh RSA/RSA keypair with a -// single identity composed of the given full name, comment and email, any of -// which may be empty but must not contain any of "()<>\x00". -// If config is nil, sensible defaults will be used. -func NewEntity(name, comment, email string, config *packet.Config) (*Entity, error) { - currentTime := config.Now() - - bits := defaultRSAKeyBits - if config != nil && config.RSABits != 0 { - bits = config.RSABits - } - - uid := packet.NewUserId(name, comment, email) - if uid == nil { - return nil, errors.InvalidArgumentError("user id field contained invalid characters") - } - signingPriv, err := rsa.GenerateKey(config.Random(), bits) - if err != nil { - return nil, err - } - encryptingPriv, err := rsa.GenerateKey(config.Random(), bits) - if err != nil { - return nil, err - } - - e := &Entity{ - PrimaryKey: packet.NewRSAPublicKey(currentTime, &signingPriv.PublicKey), - PrivateKey: packet.NewRSAPrivateKey(currentTime, signingPriv), - Identities: make(map[string]*Identity), - } - isPrimaryId := true - e.Identities[uid.Id] = &Identity{ - Name: uid.Id, - UserId: uid, - SelfSignature: &packet.Signature{ - CreationTime: currentTime, - SigType: packet.SigTypePositiveCert, - PubKeyAlgo: packet.PubKeyAlgoRSA, - Hash: config.Hash(), - IsPrimaryId: &isPrimaryId, - FlagsValid: true, - FlagSign: true, - FlagCertify: true, - IssuerKeyId: &e.PrimaryKey.KeyId, - }, - } - err = e.Identities[uid.Id].SelfSignature.SignUserId(uid.Id, e.PrimaryKey, e.PrivateKey, config) - if err != nil { - return nil, err - } - - // If the user passes in a DefaultHash via packet.Config, - // set the PreferredHash for the SelfSignature. - if config != nil && config.DefaultHash != 0 { - e.Identities[uid.Id].SelfSignature.PreferredHash = []uint8{hashToHashId(config.DefaultHash)} - } - - // Likewise for DefaultCipher. - if config != nil && config.DefaultCipher != 0 { - e.Identities[uid.Id].SelfSignature.PreferredSymmetric = []uint8{uint8(config.DefaultCipher)} - } - - e.Subkeys = make([]Subkey, 1) - e.Subkeys[0] = Subkey{ - PublicKey: packet.NewRSAPublicKey(currentTime, &encryptingPriv.PublicKey), - PrivateKey: packet.NewRSAPrivateKey(currentTime, encryptingPriv), - Sig: &packet.Signature{ - CreationTime: currentTime, - SigType: packet.SigTypeSubkeyBinding, - PubKeyAlgo: packet.PubKeyAlgoRSA, - Hash: config.Hash(), - FlagsValid: true, - FlagEncryptStorage: true, - FlagEncryptCommunications: true, - IssuerKeyId: &e.PrimaryKey.KeyId, - }, - } - e.Subkeys[0].PublicKey.IsSubkey = true - e.Subkeys[0].PrivateKey.IsSubkey = true - err = e.Subkeys[0].Sig.SignKey(e.Subkeys[0].PublicKey, e.PrivateKey, config) - if err != nil { - return nil, err - } - return e, nil -} - -// SerializePrivate serializes an Entity, including private key material, but -// excluding signatures from other entities, to the given Writer. -// Identities and subkeys are re-signed in case they changed since NewEntry. -// If config is nil, sensible defaults will be used. -func (e *Entity) SerializePrivate(w io.Writer, config *packet.Config) (err error) { - err = e.PrivateKey.Serialize(w) - if err != nil { - return - } - for _, ident := range e.Identities { - err = ident.UserId.Serialize(w) - if err != nil { - return - } - err = ident.SelfSignature.SignUserId(ident.UserId.Id, e.PrimaryKey, e.PrivateKey, config) - if err != nil { - return - } - err = ident.SelfSignature.Serialize(w) - if err != nil { - return - } - } - for _, subkey := range e.Subkeys { - err = subkey.PrivateKey.Serialize(w) - if err != nil { - return - } - err = subkey.Sig.SignKey(subkey.PublicKey, e.PrivateKey, config) - if err != nil { - return - } - err = subkey.Sig.Serialize(w) - if err != nil { - return - } - } - return nil -} - -// Serialize writes the public part of the given Entity to w, including -// signatures from other entities. No private key material will be output. -func (e *Entity) Serialize(w io.Writer) error { - err := e.PrimaryKey.Serialize(w) - if err != nil { - return err - } - for _, ident := range e.Identities { - err = ident.UserId.Serialize(w) - if err != nil { - return err - } - err = ident.SelfSignature.Serialize(w) - if err != nil { - return err - } - for _, sig := range ident.Signatures { - err = sig.Serialize(w) - if err != nil { - return err - } - } - } - for _, subkey := range e.Subkeys { - err = subkey.PublicKey.Serialize(w) - if err != nil { - return err - } - err = subkey.Sig.Serialize(w) - if err != nil { - return err - } - } - return nil -} - -// SignIdentity adds a signature to e, from signer, attesting that identity is -// associated with e. The provided identity must already be an element of -// e.Identities and the private key of signer must have been decrypted if -// necessary. -// If config is nil, sensible defaults will be used. -func (e *Entity) SignIdentity(identity string, signer *Entity, config *packet.Config) error { - if signer.PrivateKey == nil { - return errors.InvalidArgumentError("signing Entity must have a private key") - } - if signer.PrivateKey.Encrypted { - return errors.InvalidArgumentError("signing Entity's private key must be decrypted") - } - ident, ok := e.Identities[identity] - if !ok { - return errors.InvalidArgumentError("given identity string not found in Entity") - } - - sig := &packet.Signature{ - SigType: packet.SigTypeGenericCert, - PubKeyAlgo: signer.PrivateKey.PubKeyAlgo, - Hash: config.Hash(), - CreationTime: config.Now(), - IssuerKeyId: &signer.PrivateKey.KeyId, - } - if err := sig.SignUserId(identity, e.PrimaryKey, signer.PrivateKey, config); err != nil { - return err - } - ident.Signatures = append(ident.Signatures, sig) - return nil -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/compressed.go b/vendor/golang.org/x/crypto/openpgp/packet/compressed.go deleted file mode 100644 index e8f0b5caa7df..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/compressed.go +++ /dev/null @@ -1,123 +0,0 @@ -// 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 packet - -import ( - "compress/bzip2" - "compress/flate" - "compress/zlib" - "golang.org/x/crypto/openpgp/errors" - "io" - "strconv" -) - -// Compressed represents a compressed OpenPGP packet. The decompressed contents -// will contain more OpenPGP packets. See RFC 4880, section 5.6. -type Compressed struct { - Body io.Reader -} - -const ( - NoCompression = flate.NoCompression - BestSpeed = flate.BestSpeed - BestCompression = flate.BestCompression - DefaultCompression = flate.DefaultCompression -) - -// CompressionConfig contains compressor configuration settings. -type CompressionConfig struct { - // Level is the compression level to use. It must be set to - // between -1 and 9, with -1 causing the compressor to use the - // default compression level, 0 causing the compressor to use - // no compression and 1 to 9 representing increasing (better, - // slower) compression levels. If Level is less than -1 or - // more then 9, a non-nil error will be returned during - // encryption. See the constants above for convenient common - // settings for Level. - Level int -} - -func (c *Compressed) parse(r io.Reader) error { - var buf [1]byte - _, err := readFull(r, buf[:]) - if err != nil { - return err - } - - switch buf[0] { - case 1: - c.Body = flate.NewReader(r) - case 2: - c.Body, err = zlib.NewReader(r) - case 3: - c.Body = bzip2.NewReader(r) - default: - err = errors.UnsupportedError("unknown compression algorithm: " + strconv.Itoa(int(buf[0]))) - } - - return err -} - -// compressedWriterCloser represents the serialized compression stream -// header and the compressor. Its Close() method ensures that both the -// compressor and serialized stream header are closed. Its Write() -// method writes to the compressor. -type compressedWriteCloser struct { - sh io.Closer // Stream Header - c io.WriteCloser // Compressor -} - -func (cwc compressedWriteCloser) Write(p []byte) (int, error) { - return cwc.c.Write(p) -} - -func (cwc compressedWriteCloser) Close() (err error) { - err = cwc.c.Close() - if err != nil { - return err - } - - return cwc.sh.Close() -} - -// SerializeCompressed serializes a compressed data packet to w and -// returns a WriteCloser to which the literal data packets themselves -// can be written and which MUST be closed on completion. If cc is -// nil, sensible defaults will be used to configure the compression -// algorithm. -func SerializeCompressed(w io.WriteCloser, algo CompressionAlgo, cc *CompressionConfig) (literaldata io.WriteCloser, err error) { - compressed, err := serializeStreamHeader(w, packetTypeCompressed) - if err != nil { - return - } - - _, err = compressed.Write([]byte{uint8(algo)}) - if err != nil { - return - } - - level := DefaultCompression - if cc != nil { - level = cc.Level - } - - var compressor io.WriteCloser - switch algo { - case CompressionZIP: - compressor, err = flate.NewWriter(compressed, level) - case CompressionZLIB: - compressor, err = zlib.NewWriterLevel(compressed, level) - default: - s := strconv.Itoa(int(algo)) - err = errors.UnsupportedError("Unsupported compression algorithm: " + s) - } - if err != nil { - return - } - - literaldata = compressedWriteCloser{compressed, compressor} - - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/config.go b/vendor/golang.org/x/crypto/openpgp/packet/config.go deleted file mode 100644 index c76eecc963ac..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/config.go +++ /dev/null @@ -1,91 +0,0 @@ -// 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 packet - -import ( - "crypto" - "crypto/rand" - "io" - "time" -) - -// Config collects a number of parameters along with sensible defaults. -// A nil *Config is valid and results in all default values. -type Config struct { - // Rand provides the source of entropy. - // If nil, the crypto/rand Reader is used. - Rand io.Reader - // DefaultHash is the default hash function to be used. - // If zero, SHA-256 is used. - DefaultHash crypto.Hash - // DefaultCipher is the cipher to be used. - // If zero, AES-128 is used. - DefaultCipher CipherFunction - // Time returns the current time as the number of seconds since the - // epoch. If Time is nil, time.Now is used. - Time func() time.Time - // DefaultCompressionAlgo is the compression algorithm to be - // applied to the plaintext before encryption. If zero, no - // compression is done. - DefaultCompressionAlgo CompressionAlgo - // CompressionConfig configures the compression settings. - CompressionConfig *CompressionConfig - // S2KCount is only used for symmetric encryption. It - // determines the strength of the passphrase stretching when - // the said passphrase is hashed to produce a key. S2KCount - // should be between 1024 and 65011712, inclusive. If Config - // is nil or S2KCount is 0, the value 65536 used. Not all - // values in the above range can be represented. S2KCount will - // be rounded up to the next representable value if it cannot - // be encoded exactly. When set, it is strongly encrouraged to - // use a value that is at least 65536. See RFC 4880 Section - // 3.7.1.3. - S2KCount int - // RSABits is the number of bits in new RSA keys made with NewEntity. - // If zero, then 2048 bit keys are created. - RSABits int -} - -func (c *Config) Random() io.Reader { - if c == nil || c.Rand == nil { - return rand.Reader - } - return c.Rand -} - -func (c *Config) Hash() crypto.Hash { - if c == nil || uint(c.DefaultHash) == 0 { - return crypto.SHA256 - } - return c.DefaultHash -} - -func (c *Config) Cipher() CipherFunction { - if c == nil || uint8(c.DefaultCipher) == 0 { - return CipherAES128 - } - return c.DefaultCipher -} - -func (c *Config) Now() time.Time { - if c == nil || c.Time == nil { - return time.Now() - } - return c.Time() -} - -func (c *Config) Compression() CompressionAlgo { - if c == nil { - return CompressionNone - } - return c.DefaultCompressionAlgo -} - -func (c *Config) PasswordHashIterations() int { - if c == nil || c.S2KCount == 0 { - return 0 - } - return c.S2KCount -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go b/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go deleted file mode 100644 index 02b372cf374e..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go +++ /dev/null @@ -1,206 +0,0 @@ -// 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 packet - -import ( - "crypto/rsa" - "encoding/binary" - "io" - "math/big" - "strconv" - - "golang.org/x/crypto/openpgp/elgamal" - "golang.org/x/crypto/openpgp/errors" -) - -const encryptedKeyVersion = 3 - -// EncryptedKey represents a public-key encrypted session key. See RFC 4880, -// section 5.1. -type EncryptedKey struct { - KeyId uint64 - Algo PublicKeyAlgorithm - CipherFunc CipherFunction // only valid after a successful Decrypt - Key []byte // only valid after a successful Decrypt - - encryptedMPI1, encryptedMPI2 parsedMPI -} - -func (e *EncryptedKey) parse(r io.Reader) (err error) { - var buf [10]byte - _, err = readFull(r, buf[:]) - if err != nil { - return - } - if buf[0] != encryptedKeyVersion { - return errors.UnsupportedError("unknown EncryptedKey version " + strconv.Itoa(int(buf[0]))) - } - e.KeyId = binary.BigEndian.Uint64(buf[1:9]) - e.Algo = PublicKeyAlgorithm(buf[9]) - switch e.Algo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: - e.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r) - if err != nil { - return - } - case PubKeyAlgoElGamal: - e.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r) - if err != nil { - return - } - e.encryptedMPI2.bytes, e.encryptedMPI2.bitLength, err = readMPI(r) - if err != nil { - return - } - } - _, err = consumeAll(r) - return -} - -func checksumKeyMaterial(key []byte) uint16 { - var checksum uint16 - for _, v := range key { - checksum += uint16(v) - } - return checksum -} - -// Decrypt decrypts an encrypted session key with the given private key. The -// private key must have been decrypted first. -// If config is nil, sensible defaults will be used. -func (e *EncryptedKey) Decrypt(priv *PrivateKey, config *Config) error { - var err error - var b []byte - - // TODO(agl): use session key decryption routines here to avoid - // padding oracle attacks. - switch priv.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: - k := priv.PrivateKey.(*rsa.PrivateKey) - b, err = rsa.DecryptPKCS1v15(config.Random(), k, padToKeySize(&k.PublicKey, e.encryptedMPI1.bytes)) - case PubKeyAlgoElGamal: - c1 := new(big.Int).SetBytes(e.encryptedMPI1.bytes) - c2 := new(big.Int).SetBytes(e.encryptedMPI2.bytes) - b, err = elgamal.Decrypt(priv.PrivateKey.(*elgamal.PrivateKey), c1, c2) - default: - err = errors.InvalidArgumentError("cannot decrypted encrypted session key with private key of type " + strconv.Itoa(int(priv.PubKeyAlgo))) - } - - if err != nil { - return err - } - - e.CipherFunc = CipherFunction(b[0]) - e.Key = b[1 : len(b)-2] - expectedChecksum := uint16(b[len(b)-2])<<8 | uint16(b[len(b)-1]) - checksum := checksumKeyMaterial(e.Key) - if checksum != expectedChecksum { - return errors.StructuralError("EncryptedKey checksum incorrect") - } - - return nil -} - -// Serialize writes the encrypted key packet, e, to w. -func (e *EncryptedKey) Serialize(w io.Writer) error { - var mpiLen int - switch e.Algo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: - mpiLen = 2 + len(e.encryptedMPI1.bytes) - case PubKeyAlgoElGamal: - mpiLen = 2 + len(e.encryptedMPI1.bytes) + 2 + len(e.encryptedMPI2.bytes) - default: - return errors.InvalidArgumentError("don't know how to serialize encrypted key type " + strconv.Itoa(int(e.Algo))) - } - - serializeHeader(w, packetTypeEncryptedKey, 1 /* version */ +8 /* key id */ +1 /* algo */ +mpiLen) - - w.Write([]byte{encryptedKeyVersion}) - binary.Write(w, binary.BigEndian, e.KeyId) - w.Write([]byte{byte(e.Algo)}) - - switch e.Algo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: - writeMPIs(w, e.encryptedMPI1) - case PubKeyAlgoElGamal: - writeMPIs(w, e.encryptedMPI1, e.encryptedMPI2) - default: - panic("internal error") - } - - return nil -} - -// SerializeEncryptedKey serializes an encrypted key packet to w that contains -// key, encrypted to pub. -// If config is nil, sensible defaults will be used. -func SerializeEncryptedKey(w io.Writer, pub *PublicKey, cipherFunc CipherFunction, key []byte, config *Config) error { - var buf [10]byte - buf[0] = encryptedKeyVersion - binary.BigEndian.PutUint64(buf[1:9], pub.KeyId) - buf[9] = byte(pub.PubKeyAlgo) - - keyBlock := make([]byte, 1 /* cipher type */ +len(key)+2 /* checksum */) - keyBlock[0] = byte(cipherFunc) - copy(keyBlock[1:], key) - checksum := checksumKeyMaterial(key) - keyBlock[1+len(key)] = byte(checksum >> 8) - keyBlock[1+len(key)+1] = byte(checksum) - - switch pub.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly: - return serializeEncryptedKeyRSA(w, config.Random(), buf, pub.PublicKey.(*rsa.PublicKey), keyBlock) - case PubKeyAlgoElGamal: - return serializeEncryptedKeyElGamal(w, config.Random(), buf, pub.PublicKey.(*elgamal.PublicKey), keyBlock) - case PubKeyAlgoDSA, PubKeyAlgoRSASignOnly: - return errors.InvalidArgumentError("cannot encrypt to public key of type " + strconv.Itoa(int(pub.PubKeyAlgo))) - } - - return errors.UnsupportedError("encrypting a key to public key of type " + strconv.Itoa(int(pub.PubKeyAlgo))) -} - -func serializeEncryptedKeyRSA(w io.Writer, rand io.Reader, header [10]byte, pub *rsa.PublicKey, keyBlock []byte) error { - cipherText, err := rsa.EncryptPKCS1v15(rand, pub, keyBlock) - if err != nil { - return errors.InvalidArgumentError("RSA encryption failed: " + err.Error()) - } - - packetLen := 10 /* header length */ + 2 /* mpi size */ + len(cipherText) - - err = serializeHeader(w, packetTypeEncryptedKey, packetLen) - if err != nil { - return err - } - _, err = w.Write(header[:]) - if err != nil { - return err - } - return writeMPI(w, 8*uint16(len(cipherText)), cipherText) -} - -func serializeEncryptedKeyElGamal(w io.Writer, rand io.Reader, header [10]byte, pub *elgamal.PublicKey, keyBlock []byte) error { - c1, c2, err := elgamal.Encrypt(rand, pub, keyBlock) - if err != nil { - return errors.InvalidArgumentError("ElGamal encryption failed: " + err.Error()) - } - - packetLen := 10 /* header length */ - packetLen += 2 /* mpi size */ + (c1.BitLen()+7)/8 - packetLen += 2 /* mpi size */ + (c2.BitLen()+7)/8 - - err = serializeHeader(w, packetTypeEncryptedKey, packetLen) - if err != nil { - return err - } - _, err = w.Write(header[:]) - if err != nil { - return err - } - err = writeBig(w, c1) - if err != nil { - return err - } - return writeBig(w, c2) -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/literal.go b/vendor/golang.org/x/crypto/openpgp/packet/literal.go deleted file mode 100644 index 1a9ec6e51e81..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/literal.go +++ /dev/null @@ -1,89 +0,0 @@ -// 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 packet - -import ( - "encoding/binary" - "io" -) - -// LiteralData represents an encrypted file. See RFC 4880, section 5.9. -type LiteralData struct { - IsBinary bool - FileName string - Time uint32 // Unix epoch time. Either creation time or modification time. 0 means undefined. - Body io.Reader -} - -// ForEyesOnly returns whether the contents of the LiteralData have been marked -// as especially sensitive. -func (l *LiteralData) ForEyesOnly() bool { - return l.FileName == "_CONSOLE" -} - -func (l *LiteralData) parse(r io.Reader) (err error) { - var buf [256]byte - - _, err = readFull(r, buf[:2]) - if err != nil { - return - } - - l.IsBinary = buf[0] == 'b' - fileNameLen := int(buf[1]) - - _, err = readFull(r, buf[:fileNameLen]) - if err != nil { - return - } - - l.FileName = string(buf[:fileNameLen]) - - _, err = readFull(r, buf[:4]) - if err != nil { - return - } - - l.Time = binary.BigEndian.Uint32(buf[:4]) - l.Body = r - return -} - -// SerializeLiteral serializes a literal data packet to w and returns a -// WriteCloser to which the data itself can be written and which MUST be closed -// on completion. The fileName is truncated to 255 bytes. -func SerializeLiteral(w io.WriteCloser, isBinary bool, fileName string, time uint32) (plaintext io.WriteCloser, err error) { - var buf [4]byte - buf[0] = 't' - if isBinary { - buf[0] = 'b' - } - if len(fileName) > 255 { - fileName = fileName[:255] - } - buf[1] = byte(len(fileName)) - - inner, err := serializeStreamHeader(w, packetTypeLiteralData) - if err != nil { - return - } - - _, err = inner.Write(buf[:2]) - if err != nil { - return - } - _, err = inner.Write([]byte(fileName)) - if err != nil { - return - } - binary.BigEndian.PutUint32(buf[:], time) - _, err = inner.Write(buf[:]) - if err != nil { - return - } - - plaintext = inner - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/ocfb.go b/vendor/golang.org/x/crypto/openpgp/packet/ocfb.go deleted file mode 100644 index ce2a33a547ce..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/ocfb.go +++ /dev/null @@ -1,143 +0,0 @@ -// 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. - -// OpenPGP CFB Mode. http://tools.ietf.org/html/rfc4880#section-13.9 - -package packet - -import ( - "crypto/cipher" -) - -type ocfbEncrypter struct { - b cipher.Block - fre []byte - outUsed int -} - -// An OCFBResyncOption determines if the "resynchronization step" of OCFB is -// performed. -type OCFBResyncOption bool - -const ( - OCFBResync OCFBResyncOption = true - OCFBNoResync OCFBResyncOption = false -) - -// NewOCFBEncrypter returns a cipher.Stream which encrypts data with OpenPGP's -// cipher feedback mode using the given cipher.Block, and an initial amount of -// ciphertext. randData must be random bytes and be the same length as the -// cipher.Block's block size. Resync determines if the "resynchronization step" -// from RFC 4880, 13.9 step 7 is performed. Different parts of OpenPGP vary on -// this point. -func NewOCFBEncrypter(block cipher.Block, randData []byte, resync OCFBResyncOption) (cipher.Stream, []byte) { - blockSize := block.BlockSize() - if len(randData) != blockSize { - return nil, nil - } - - x := &ocfbEncrypter{ - b: block, - fre: make([]byte, blockSize), - outUsed: 0, - } - prefix := make([]byte, blockSize+2) - - block.Encrypt(x.fre, x.fre) - for i := 0; i < blockSize; i++ { - prefix[i] = randData[i] ^ x.fre[i] - } - - block.Encrypt(x.fre, prefix[:blockSize]) - prefix[blockSize] = x.fre[0] ^ randData[blockSize-2] - prefix[blockSize+1] = x.fre[1] ^ randData[blockSize-1] - - if resync { - block.Encrypt(x.fre, prefix[2:]) - } else { - x.fre[0] = prefix[blockSize] - x.fre[1] = prefix[blockSize+1] - x.outUsed = 2 - } - return x, prefix -} - -func (x *ocfbEncrypter) XORKeyStream(dst, src []byte) { - for i := 0; i < len(src); i++ { - if x.outUsed == len(x.fre) { - x.b.Encrypt(x.fre, x.fre) - x.outUsed = 0 - } - - x.fre[x.outUsed] ^= src[i] - dst[i] = x.fre[x.outUsed] - x.outUsed++ - } -} - -type ocfbDecrypter struct { - b cipher.Block - fre []byte - outUsed int -} - -// NewOCFBDecrypter returns a cipher.Stream which decrypts data with OpenPGP's -// cipher feedback mode using the given cipher.Block. Prefix must be the first -// blockSize + 2 bytes of the ciphertext, where blockSize is the cipher.Block's -// block size. If an incorrect key is detected then nil is returned. On -// successful exit, blockSize+2 bytes of decrypted data are written into -// prefix. Resync determines if the "resynchronization step" from RFC 4880, -// 13.9 step 7 is performed. Different parts of OpenPGP vary on this point. -func NewOCFBDecrypter(block cipher.Block, prefix []byte, resync OCFBResyncOption) cipher.Stream { - blockSize := block.BlockSize() - if len(prefix) != blockSize+2 { - return nil - } - - x := &ocfbDecrypter{ - b: block, - fre: make([]byte, blockSize), - outUsed: 0, - } - prefixCopy := make([]byte, len(prefix)) - copy(prefixCopy, prefix) - - block.Encrypt(x.fre, x.fre) - for i := 0; i < blockSize; i++ { - prefixCopy[i] ^= x.fre[i] - } - - block.Encrypt(x.fre, prefix[:blockSize]) - prefixCopy[blockSize] ^= x.fre[0] - prefixCopy[blockSize+1] ^= x.fre[1] - - if prefixCopy[blockSize-2] != prefixCopy[blockSize] || - prefixCopy[blockSize-1] != prefixCopy[blockSize+1] { - return nil - } - - if resync { - block.Encrypt(x.fre, prefix[2:]) - } else { - x.fre[0] = prefix[blockSize] - x.fre[1] = prefix[blockSize+1] - x.outUsed = 2 - } - copy(prefix, prefixCopy) - return x -} - -func (x *ocfbDecrypter) XORKeyStream(dst, src []byte) { - for i := 0; i < len(src); i++ { - if x.outUsed == len(x.fre) { - x.b.Encrypt(x.fre, x.fre) - x.outUsed = 0 - } - - c := src[i] - dst[i] = x.fre[x.outUsed] ^ src[i] - x.fre[x.outUsed] = c - x.outUsed++ - } -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/one_pass_signature.go b/vendor/golang.org/x/crypto/openpgp/packet/one_pass_signature.go deleted file mode 100644 index 1713503395e3..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/one_pass_signature.go +++ /dev/null @@ -1,73 +0,0 @@ -// 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 packet - -import ( - "crypto" - "encoding/binary" - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/s2k" - "io" - "strconv" -) - -// OnePassSignature represents a one-pass signature packet. See RFC 4880, -// section 5.4. -type OnePassSignature struct { - SigType SignatureType - Hash crypto.Hash - PubKeyAlgo PublicKeyAlgorithm - KeyId uint64 - IsLast bool -} - -const onePassSignatureVersion = 3 - -func (ops *OnePassSignature) parse(r io.Reader) (err error) { - var buf [13]byte - - _, err = readFull(r, buf[:]) - if err != nil { - return - } - if buf[0] != onePassSignatureVersion { - err = errors.UnsupportedError("one-pass-signature packet version " + strconv.Itoa(int(buf[0]))) - } - - var ok bool - ops.Hash, ok = s2k.HashIdToHash(buf[2]) - if !ok { - return errors.UnsupportedError("hash function: " + strconv.Itoa(int(buf[2]))) - } - - ops.SigType = SignatureType(buf[1]) - ops.PubKeyAlgo = PublicKeyAlgorithm(buf[3]) - ops.KeyId = binary.BigEndian.Uint64(buf[4:12]) - ops.IsLast = buf[12] != 0 - return -} - -// Serialize marshals the given OnePassSignature to w. -func (ops *OnePassSignature) Serialize(w io.Writer) error { - var buf [13]byte - buf[0] = onePassSignatureVersion - buf[1] = uint8(ops.SigType) - var ok bool - buf[2], ok = s2k.HashToHashId(ops.Hash) - if !ok { - return errors.UnsupportedError("hash type: " + strconv.Itoa(int(ops.Hash))) - } - buf[3] = uint8(ops.PubKeyAlgo) - binary.BigEndian.PutUint64(buf[4:12], ops.KeyId) - if ops.IsLast { - buf[12] = 1 - } - - if err := serializeHeader(w, packetTypeOnePassSignature, len(buf)); err != nil { - return err - } - _, err := w.Write(buf[:]) - return err -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/opaque.go b/vendor/golang.org/x/crypto/openpgp/packet/opaque.go deleted file mode 100644 index 456d807f255c..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/opaque.go +++ /dev/null @@ -1,162 +0,0 @@ -// 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 packet - -import ( - "bytes" - "io" - "io/ioutil" - - "golang.org/x/crypto/openpgp/errors" -) - -// OpaquePacket represents an OpenPGP packet as raw, unparsed data. This is -// useful for splitting and storing the original packet contents separately, -// handling unsupported packet types or accessing parts of the packet not yet -// implemented by this package. -type OpaquePacket struct { - // Packet type - Tag uint8 - // Reason why the packet was parsed opaquely - Reason error - // Binary contents of the packet data - Contents []byte -} - -func (op *OpaquePacket) parse(r io.Reader) (err error) { - op.Contents, err = ioutil.ReadAll(r) - return -} - -// Serialize marshals the packet to a writer in its original form, including -// the packet header. -func (op *OpaquePacket) Serialize(w io.Writer) (err error) { - err = serializeHeader(w, packetType(op.Tag), len(op.Contents)) - if err == nil { - _, err = w.Write(op.Contents) - } - return -} - -// Parse attempts to parse the opaque contents into a structure supported by -// this package. If the packet is not known then the result will be another -// OpaquePacket. -func (op *OpaquePacket) Parse() (p Packet, err error) { - hdr := bytes.NewBuffer(nil) - err = serializeHeader(hdr, packetType(op.Tag), len(op.Contents)) - if err != nil { - op.Reason = err - return op, err - } - p, err = Read(io.MultiReader(hdr, bytes.NewBuffer(op.Contents))) - if err != nil { - op.Reason = err - p = op - } - return -} - -// OpaqueReader reads OpaquePackets from an io.Reader. -type OpaqueReader struct { - r io.Reader -} - -func NewOpaqueReader(r io.Reader) *OpaqueReader { - return &OpaqueReader{r: r} -} - -// Read the next OpaquePacket. -func (or *OpaqueReader) Next() (op *OpaquePacket, err error) { - tag, _, contents, err := readHeader(or.r) - if err != nil { - return - } - op = &OpaquePacket{Tag: uint8(tag), Reason: err} - err = op.parse(contents) - if err != nil { - consumeAll(contents) - } - return -} - -// OpaqueSubpacket represents an unparsed OpenPGP subpacket, -// as found in signature and user attribute packets. -type OpaqueSubpacket struct { - SubType uint8 - Contents []byte -} - -// OpaqueSubpackets extracts opaque, unparsed OpenPGP subpackets from -// their byte representation. -func OpaqueSubpackets(contents []byte) (result []*OpaqueSubpacket, err error) { - var ( - subHeaderLen int - subPacket *OpaqueSubpacket - ) - for len(contents) > 0 { - subHeaderLen, subPacket, err = nextSubpacket(contents) - if err != nil { - break - } - result = append(result, subPacket) - contents = contents[subHeaderLen+len(subPacket.Contents):] - } - return -} - -func nextSubpacket(contents []byte) (subHeaderLen int, subPacket *OpaqueSubpacket, err error) { - // RFC 4880, section 5.2.3.1 - var subLen uint32 - if len(contents) < 1 { - goto Truncated - } - subPacket = &OpaqueSubpacket{} - switch { - case contents[0] < 192: - subHeaderLen = 2 // 1 length byte, 1 subtype byte - if len(contents) < subHeaderLen { - goto Truncated - } - subLen = uint32(contents[0]) - contents = contents[1:] - case contents[0] < 255: - subHeaderLen = 3 // 2 length bytes, 1 subtype - if len(contents) < subHeaderLen { - goto Truncated - } - subLen = uint32(contents[0]-192)<<8 + uint32(contents[1]) + 192 - contents = contents[2:] - default: - subHeaderLen = 6 // 5 length bytes, 1 subtype - if len(contents) < subHeaderLen { - goto Truncated - } - subLen = uint32(contents[1])<<24 | - uint32(contents[2])<<16 | - uint32(contents[3])<<8 | - uint32(contents[4]) - contents = contents[5:] - } - if subLen > uint32(len(contents)) || subLen == 0 { - goto Truncated - } - subPacket.SubType = contents[0] - subPacket.Contents = contents[1:subLen] - return -Truncated: - err = errors.StructuralError("subpacket truncated") - return -} - -func (osp *OpaqueSubpacket) Serialize(w io.Writer) (err error) { - buf := make([]byte, 6) - n := serializeSubpacketLength(buf, len(osp.Contents)+1) - buf[n] = osp.SubType - if _, err = w.Write(buf[:n+1]); err != nil { - return - } - _, err = w.Write(osp.Contents) - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/packet.go b/vendor/golang.org/x/crypto/openpgp/packet/packet.go deleted file mode 100644 index 5af64c5421b6..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/packet.go +++ /dev/null @@ -1,551 +0,0 @@ -// 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 packet implements parsing and serialization of OpenPGP packets, as -// specified in RFC 4880. -package packet // import "golang.org/x/crypto/openpgp/packet" - -import ( - "bufio" - "crypto/aes" - "crypto/cipher" - "crypto/des" - "crypto/rsa" - "io" - "math/big" - - "golang.org/x/crypto/cast5" - "golang.org/x/crypto/openpgp/errors" -) - -// readFull is the same as io.ReadFull except that reading zero bytes returns -// ErrUnexpectedEOF rather than EOF. -func readFull(r io.Reader, buf []byte) (n int, err error) { - n, err = io.ReadFull(r, buf) - if err == io.EOF { - err = io.ErrUnexpectedEOF - } - return -} - -// readLength reads an OpenPGP length from r. See RFC 4880, section 4.2.2. -func readLength(r io.Reader) (length int64, isPartial bool, err error) { - var buf [4]byte - _, err = readFull(r, buf[:1]) - if err != nil { - return - } - switch { - case buf[0] < 192: - length = int64(buf[0]) - case buf[0] < 224: - length = int64(buf[0]-192) << 8 - _, err = readFull(r, buf[0:1]) - if err != nil { - return - } - length += int64(buf[0]) + 192 - case buf[0] < 255: - length = int64(1) << (buf[0] & 0x1f) - isPartial = true - default: - _, err = readFull(r, buf[0:4]) - if err != nil { - return - } - length = int64(buf[0])<<24 | - int64(buf[1])<<16 | - int64(buf[2])<<8 | - int64(buf[3]) - } - return -} - -// partialLengthReader wraps an io.Reader and handles OpenPGP partial lengths. -// The continuation lengths are parsed and removed from the stream and EOF is -// returned at the end of the packet. See RFC 4880, section 4.2.2.4. -type partialLengthReader struct { - r io.Reader - remaining int64 - isPartial bool -} - -func (r *partialLengthReader) Read(p []byte) (n int, err error) { - for r.remaining == 0 { - if !r.isPartial { - return 0, io.EOF - } - r.remaining, r.isPartial, err = readLength(r.r) - if err != nil { - return 0, err - } - } - - toRead := int64(len(p)) - if toRead > r.remaining { - toRead = r.remaining - } - - n, err = r.r.Read(p[:int(toRead)]) - r.remaining -= int64(n) - if n < int(toRead) && err == io.EOF { - err = io.ErrUnexpectedEOF - } - return -} - -// partialLengthWriter writes a stream of data using OpenPGP partial lengths. -// See RFC 4880, section 4.2.2.4. -type partialLengthWriter struct { - w io.WriteCloser - lengthByte [1]byte -} - -func (w *partialLengthWriter) Write(p []byte) (n int, err error) { - for len(p) > 0 { - for power := uint(14); power < 32; power-- { - l := 1 << power - if len(p) >= l { - w.lengthByte[0] = 224 + uint8(power) - _, err = w.w.Write(w.lengthByte[:]) - if err != nil { - return - } - var m int - m, err = w.w.Write(p[:l]) - n += m - if err != nil { - return - } - p = p[l:] - break - } - } - } - return -} - -func (w *partialLengthWriter) Close() error { - w.lengthByte[0] = 0 - _, err := w.w.Write(w.lengthByte[:]) - if err != nil { - return err - } - return w.w.Close() -} - -// A spanReader is an io.LimitReader, but it returns ErrUnexpectedEOF if the -// underlying Reader returns EOF before the limit has been reached. -type spanReader struct { - r io.Reader - n int64 -} - -func (l *spanReader) Read(p []byte) (n int, err error) { - if l.n <= 0 { - return 0, io.EOF - } - if int64(len(p)) > l.n { - p = p[0:l.n] - } - n, err = l.r.Read(p) - l.n -= int64(n) - if l.n > 0 && err == io.EOF { - err = io.ErrUnexpectedEOF - } - return -} - -// readHeader parses a packet header and returns an io.Reader which will return -// the contents of the packet. See RFC 4880, section 4.2. -func readHeader(r io.Reader) (tag packetType, length int64, contents io.Reader, err error) { - var buf [4]byte - _, err = io.ReadFull(r, buf[:1]) - if err != nil { - return - } - if buf[0]&0x80 == 0 { - err = errors.StructuralError("tag byte does not have MSB set") - return - } - if buf[0]&0x40 == 0 { - // Old format packet - tag = packetType((buf[0] & 0x3f) >> 2) - lengthType := buf[0] & 3 - if lengthType == 3 { - length = -1 - contents = r - return - } - lengthBytes := 1 << lengthType - _, err = readFull(r, buf[0:lengthBytes]) - if err != nil { - return - } - for i := 0; i < lengthBytes; i++ { - length <<= 8 - length |= int64(buf[i]) - } - contents = &spanReader{r, length} - return - } - - // New format packet - tag = packetType(buf[0] & 0x3f) - length, isPartial, err := readLength(r) - if err != nil { - return - } - if isPartial { - contents = &partialLengthReader{ - remaining: length, - isPartial: true, - r: r, - } - length = -1 - } else { - contents = &spanReader{r, length} - } - return -} - -// serializeHeader writes an OpenPGP packet header to w. See RFC 4880, section -// 4.2. -func serializeHeader(w io.Writer, ptype packetType, length int) (err error) { - var buf [6]byte - var n int - - buf[0] = 0x80 | 0x40 | byte(ptype) - if length < 192 { - buf[1] = byte(length) - n = 2 - } else if length < 8384 { - length -= 192 - buf[1] = 192 + byte(length>>8) - buf[2] = byte(length) - n = 3 - } else { - buf[1] = 255 - buf[2] = byte(length >> 24) - buf[3] = byte(length >> 16) - buf[4] = byte(length >> 8) - buf[5] = byte(length) - n = 6 - } - - _, err = w.Write(buf[:n]) - return -} - -// serializeStreamHeader writes an OpenPGP packet header to w where the -// length of the packet is unknown. It returns a io.WriteCloser which can be -// used to write the contents of the packet. See RFC 4880, section 4.2. -func serializeStreamHeader(w io.WriteCloser, ptype packetType) (out io.WriteCloser, err error) { - var buf [1]byte - buf[0] = 0x80 | 0x40 | byte(ptype) - _, err = w.Write(buf[:]) - if err != nil { - return - } - out = &partialLengthWriter{w: w} - return -} - -// Packet represents an OpenPGP packet. Users are expected to try casting -// instances of this interface to specific packet types. -type Packet interface { - parse(io.Reader) error -} - -// consumeAll reads from the given Reader until error, returning the number of -// bytes read. -func consumeAll(r io.Reader) (n int64, err error) { - var m int - var buf [1024]byte - - for { - m, err = r.Read(buf[:]) - n += int64(m) - if err == io.EOF { - err = nil - return - } - if err != nil { - return - } - } -} - -// packetType represents the numeric ids of the different OpenPGP packet types. See -// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-2 -type packetType uint8 - -const ( - packetTypeEncryptedKey packetType = 1 - packetTypeSignature packetType = 2 - packetTypeSymmetricKeyEncrypted packetType = 3 - packetTypeOnePassSignature packetType = 4 - packetTypePrivateKey packetType = 5 - packetTypePublicKey packetType = 6 - packetTypePrivateSubkey packetType = 7 - packetTypeCompressed packetType = 8 - packetTypeSymmetricallyEncrypted packetType = 9 - packetTypeLiteralData packetType = 11 - packetTypeUserId packetType = 13 - packetTypePublicSubkey packetType = 14 - packetTypeUserAttribute packetType = 17 - packetTypeSymmetricallyEncryptedMDC packetType = 18 -) - -// peekVersion detects the version of a public key packet about to -// be read. A bufio.Reader at the original position of the io.Reader -// is returned. -func peekVersion(r io.Reader) (bufr *bufio.Reader, ver byte, err error) { - bufr = bufio.NewReader(r) - var verBuf []byte - if verBuf, err = bufr.Peek(1); err != nil { - return - } - ver = verBuf[0] - return -} - -// Read reads a single OpenPGP packet from the given io.Reader. If there is an -// error parsing a packet, the whole packet is consumed from the input. -func Read(r io.Reader) (p Packet, err error) { - tag, _, contents, err := readHeader(r) - if err != nil { - return - } - - switch tag { - case packetTypeEncryptedKey: - p = new(EncryptedKey) - case packetTypeSignature: - var version byte - // Detect signature version - if contents, version, err = peekVersion(contents); err != nil { - return - } - if version < 4 { - p = new(SignatureV3) - } else { - p = new(Signature) - } - case packetTypeSymmetricKeyEncrypted: - p = new(SymmetricKeyEncrypted) - case packetTypeOnePassSignature: - p = new(OnePassSignature) - case packetTypePrivateKey, packetTypePrivateSubkey: - pk := new(PrivateKey) - if tag == packetTypePrivateSubkey { - pk.IsSubkey = true - } - p = pk - case packetTypePublicKey, packetTypePublicSubkey: - var version byte - if contents, version, err = peekVersion(contents); err != nil { - return - } - isSubkey := tag == packetTypePublicSubkey - if version < 4 { - p = &PublicKeyV3{IsSubkey: isSubkey} - } else { - p = &PublicKey{IsSubkey: isSubkey} - } - case packetTypeCompressed: - p = new(Compressed) - case packetTypeSymmetricallyEncrypted: - p = new(SymmetricallyEncrypted) - case packetTypeLiteralData: - p = new(LiteralData) - case packetTypeUserId: - p = new(UserId) - case packetTypeUserAttribute: - p = new(UserAttribute) - case packetTypeSymmetricallyEncryptedMDC: - se := new(SymmetricallyEncrypted) - se.MDC = true - p = se - default: - err = errors.UnknownPacketTypeError(tag) - } - if p != nil { - err = p.parse(contents) - } - if err != nil { - consumeAll(contents) - } - return -} - -// SignatureType represents the different semantic meanings of an OpenPGP -// signature. See RFC 4880, section 5.2.1. -type SignatureType uint8 - -const ( - SigTypeBinary SignatureType = 0 - SigTypeText = 1 - SigTypeGenericCert = 0x10 - SigTypePersonaCert = 0x11 - SigTypeCasualCert = 0x12 - SigTypePositiveCert = 0x13 - SigTypeSubkeyBinding = 0x18 - SigTypePrimaryKeyBinding = 0x19 - SigTypeDirectSignature = 0x1F - SigTypeKeyRevocation = 0x20 - SigTypeSubkeyRevocation = 0x28 -) - -// PublicKeyAlgorithm represents the different public key system specified for -// OpenPGP. See -// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-12 -type PublicKeyAlgorithm uint8 - -const ( - PubKeyAlgoRSA PublicKeyAlgorithm = 1 - PubKeyAlgoElGamal PublicKeyAlgorithm = 16 - PubKeyAlgoDSA PublicKeyAlgorithm = 17 - // RFC 6637, Section 5. - PubKeyAlgoECDH PublicKeyAlgorithm = 18 - PubKeyAlgoECDSA PublicKeyAlgorithm = 19 - - // Deprecated in RFC 4880, Section 13.5. Use key flags instead. - PubKeyAlgoRSAEncryptOnly PublicKeyAlgorithm = 2 - PubKeyAlgoRSASignOnly PublicKeyAlgorithm = 3 -) - -// CanEncrypt returns true if it's possible to encrypt a message to a public -// key of the given type. -func (pka PublicKeyAlgorithm) CanEncrypt() bool { - switch pka { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoElGamal: - return true - } - return false -} - -// CanSign returns true if it's possible for a public key of the given type to -// sign a message. -func (pka PublicKeyAlgorithm) CanSign() bool { - switch pka { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA, PubKeyAlgoECDSA: - return true - } - return false -} - -// CipherFunction represents the different block ciphers specified for OpenPGP. See -// http://www.iana.org/assignments/pgp-parameters/pgp-parameters.xhtml#pgp-parameters-13 -type CipherFunction uint8 - -const ( - Cipher3DES CipherFunction = 2 - CipherCAST5 CipherFunction = 3 - CipherAES128 CipherFunction = 7 - CipherAES192 CipherFunction = 8 - CipherAES256 CipherFunction = 9 -) - -// KeySize returns the key size, in bytes, of cipher. -func (cipher CipherFunction) KeySize() int { - switch cipher { - case Cipher3DES: - return 24 - case CipherCAST5: - return cast5.KeySize - case CipherAES128: - return 16 - case CipherAES192: - return 24 - case CipherAES256: - return 32 - } - return 0 -} - -// blockSize returns the block size, in bytes, of cipher. -func (cipher CipherFunction) blockSize() int { - switch cipher { - case Cipher3DES: - return des.BlockSize - case CipherCAST5: - return 8 - case CipherAES128, CipherAES192, CipherAES256: - return 16 - } - return 0 -} - -// new returns a fresh instance of the given cipher. -func (cipher CipherFunction) new(key []byte) (block cipher.Block) { - switch cipher { - case Cipher3DES: - block, _ = des.NewTripleDESCipher(key) - case CipherCAST5: - block, _ = cast5.NewCipher(key) - case CipherAES128, CipherAES192, CipherAES256: - block, _ = aes.NewCipher(key) - } - return -} - -// readMPI reads a big integer from r. The bit length returned is the bit -// length that was specified in r. This is preserved so that the integer can be -// reserialized exactly. -func readMPI(r io.Reader) (mpi []byte, bitLength uint16, err error) { - var buf [2]byte - _, err = readFull(r, buf[0:]) - if err != nil { - return - } - bitLength = uint16(buf[0])<<8 | uint16(buf[1]) - numBytes := (int(bitLength) + 7) / 8 - mpi = make([]byte, numBytes) - _, err = readFull(r, mpi) - // According to RFC 4880 3.2. we should check that the MPI has no leading - // zeroes (at least when not an encrypted MPI?), but this implementation - // does generate leading zeroes, so we keep accepting them. - return -} - -// writeMPI serializes a big integer to w. -func writeMPI(w io.Writer, bitLength uint16, mpiBytes []byte) (err error) { - // Note that we can produce leading zeroes, in violation of RFC 4880 3.2. - // Implementations seem to be tolerant of them, and stripping them would - // make it complex to guarantee matching re-serialization. - _, err = w.Write([]byte{byte(bitLength >> 8), byte(bitLength)}) - if err == nil { - _, err = w.Write(mpiBytes) - } - return -} - -// writeBig serializes a *big.Int to w. -func writeBig(w io.Writer, i *big.Int) error { - return writeMPI(w, uint16(i.BitLen()), i.Bytes()) -} - -// padToKeySize left-pads a MPI with zeroes to match the length of the -// specified RSA public. -func padToKeySize(pub *rsa.PublicKey, b []byte) []byte { - k := (pub.N.BitLen() + 7) / 8 - if len(b) >= k { - return b - } - bb := make([]byte, k) - copy(bb[len(bb)-len(b):], b) - return bb -} - -// CompressionAlgo Represents the different compression algorithms -// supported by OpenPGP (except for BZIP2, which is not currently -// supported). See Section 9.3 of RFC 4880. -type CompressionAlgo uint8 - -const ( - CompressionNone CompressionAlgo = 0 - CompressionZIP CompressionAlgo = 1 - CompressionZLIB CompressionAlgo = 2 -) diff --git a/vendor/golang.org/x/crypto/openpgp/packet/private_key.go b/vendor/golang.org/x/crypto/openpgp/packet/private_key.go deleted file mode 100644 index bd31cceac62e..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/private_key.go +++ /dev/null @@ -1,385 +0,0 @@ -// 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 packet - -import ( - "bytes" - "crypto" - "crypto/cipher" - "crypto/dsa" - "crypto/ecdsa" - "crypto/rsa" - "crypto/sha1" - "io" - "io/ioutil" - "math/big" - "strconv" - "time" - - "golang.org/x/crypto/openpgp/elgamal" - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/s2k" -) - -// PrivateKey represents a possibly encrypted private key. See RFC 4880, -// section 5.5.3. -type PrivateKey struct { - PublicKey - Encrypted bool // if true then the private key is unavailable until Decrypt has been called. - encryptedData []byte - cipher CipherFunction - s2k func(out, in []byte) - PrivateKey interface{} // An *{rsa|dsa|ecdsa}.PrivateKey or a crypto.Signer. - sha1Checksum bool - iv []byte -} - -func NewRSAPrivateKey(currentTime time.Time, priv *rsa.PrivateKey) *PrivateKey { - pk := new(PrivateKey) - pk.PublicKey = *NewRSAPublicKey(currentTime, &priv.PublicKey) - pk.PrivateKey = priv - return pk -} - -func NewDSAPrivateKey(currentTime time.Time, priv *dsa.PrivateKey) *PrivateKey { - pk := new(PrivateKey) - pk.PublicKey = *NewDSAPublicKey(currentTime, &priv.PublicKey) - pk.PrivateKey = priv - return pk -} - -func NewElGamalPrivateKey(currentTime time.Time, priv *elgamal.PrivateKey) *PrivateKey { - pk := new(PrivateKey) - pk.PublicKey = *NewElGamalPublicKey(currentTime, &priv.PublicKey) - pk.PrivateKey = priv - return pk -} - -func NewECDSAPrivateKey(currentTime time.Time, priv *ecdsa.PrivateKey) *PrivateKey { - pk := new(PrivateKey) - pk.PublicKey = *NewECDSAPublicKey(currentTime, &priv.PublicKey) - pk.PrivateKey = priv - return pk -} - -// NewSignerPrivateKey creates a PrivateKey from a crypto.Signer that -// implements RSA or ECDSA. -func NewSignerPrivateKey(currentTime time.Time, signer crypto.Signer) *PrivateKey { - pk := new(PrivateKey) - // In general, the public Keys should be used as pointers. We still - // type-switch on the values, for backwards-compatibility. - switch pubkey := signer.Public().(type) { - case *rsa.PublicKey: - pk.PublicKey = *NewRSAPublicKey(currentTime, pubkey) - case rsa.PublicKey: - pk.PublicKey = *NewRSAPublicKey(currentTime, &pubkey) - case *ecdsa.PublicKey: - pk.PublicKey = *NewECDSAPublicKey(currentTime, pubkey) - case ecdsa.PublicKey: - pk.PublicKey = *NewECDSAPublicKey(currentTime, &pubkey) - default: - panic("openpgp: unknown crypto.Signer type in NewSignerPrivateKey") - } - pk.PrivateKey = signer - return pk -} - -func (pk *PrivateKey) parse(r io.Reader) (err error) { - err = (&pk.PublicKey).parse(r) - if err != nil { - return - } - var buf [1]byte - _, err = readFull(r, buf[:]) - if err != nil { - return - } - - s2kType := buf[0] - - switch s2kType { - case 0: - pk.s2k = nil - pk.Encrypted = false - case 254, 255: - _, err = readFull(r, buf[:]) - if err != nil { - return - } - pk.cipher = CipherFunction(buf[0]) - pk.Encrypted = true - pk.s2k, err = s2k.Parse(r) - if err != nil { - return - } - if s2kType == 254 { - pk.sha1Checksum = true - } - default: - return errors.UnsupportedError("deprecated s2k function in private key") - } - - if pk.Encrypted { - blockSize := pk.cipher.blockSize() - if blockSize == 0 { - return errors.UnsupportedError("unsupported cipher in private key: " + strconv.Itoa(int(pk.cipher))) - } - pk.iv = make([]byte, blockSize) - _, err = readFull(r, pk.iv) - if err != nil { - return - } - } - - pk.encryptedData, err = ioutil.ReadAll(r) - if err != nil { - return - } - - if !pk.Encrypted { - return pk.parsePrivateKey(pk.encryptedData) - } - - return -} - -func mod64kHash(d []byte) uint16 { - var h uint16 - for _, b := range d { - h += uint16(b) - } - return h -} - -func (pk *PrivateKey) Serialize(w io.Writer) (err error) { - // TODO(agl): support encrypted private keys - buf := bytes.NewBuffer(nil) - err = pk.PublicKey.serializeWithoutHeaders(buf) - if err != nil { - return - } - buf.WriteByte(0 /* no encryption */) - - privateKeyBuf := bytes.NewBuffer(nil) - - switch priv := pk.PrivateKey.(type) { - case *rsa.PrivateKey: - err = serializeRSAPrivateKey(privateKeyBuf, priv) - case *dsa.PrivateKey: - err = serializeDSAPrivateKey(privateKeyBuf, priv) - case *elgamal.PrivateKey: - err = serializeElGamalPrivateKey(privateKeyBuf, priv) - case *ecdsa.PrivateKey: - err = serializeECDSAPrivateKey(privateKeyBuf, priv) - default: - err = errors.InvalidArgumentError("unknown private key type") - } - if err != nil { - return - } - - ptype := packetTypePrivateKey - contents := buf.Bytes() - privateKeyBytes := privateKeyBuf.Bytes() - if pk.IsSubkey { - ptype = packetTypePrivateSubkey - } - err = serializeHeader(w, ptype, len(contents)+len(privateKeyBytes)+2) - if err != nil { - return - } - _, err = w.Write(contents) - if err != nil { - return - } - _, err = w.Write(privateKeyBytes) - if err != nil { - return - } - - checksum := mod64kHash(privateKeyBytes) - var checksumBytes [2]byte - checksumBytes[0] = byte(checksum >> 8) - checksumBytes[1] = byte(checksum) - _, err = w.Write(checksumBytes[:]) - - return -} - -func serializeRSAPrivateKey(w io.Writer, priv *rsa.PrivateKey) error { - err := writeBig(w, priv.D) - if err != nil { - return err - } - err = writeBig(w, priv.Primes[1]) - if err != nil { - return err - } - err = writeBig(w, priv.Primes[0]) - if err != nil { - return err - } - return writeBig(w, priv.Precomputed.Qinv) -} - -func serializeDSAPrivateKey(w io.Writer, priv *dsa.PrivateKey) error { - return writeBig(w, priv.X) -} - -func serializeElGamalPrivateKey(w io.Writer, priv *elgamal.PrivateKey) error { - return writeBig(w, priv.X) -} - -func serializeECDSAPrivateKey(w io.Writer, priv *ecdsa.PrivateKey) error { - return writeBig(w, priv.D) -} - -// Decrypt decrypts an encrypted private key using a passphrase. -func (pk *PrivateKey) Decrypt(passphrase []byte) error { - if !pk.Encrypted { - return nil - } - - key := make([]byte, pk.cipher.KeySize()) - pk.s2k(key, passphrase) - block := pk.cipher.new(key) - cfb := cipher.NewCFBDecrypter(block, pk.iv) - - data := make([]byte, len(pk.encryptedData)) - cfb.XORKeyStream(data, pk.encryptedData) - - if pk.sha1Checksum { - if len(data) < sha1.Size { - return errors.StructuralError("truncated private key data") - } - h := sha1.New() - h.Write(data[:len(data)-sha1.Size]) - sum := h.Sum(nil) - if !bytes.Equal(sum, data[len(data)-sha1.Size:]) { - return errors.StructuralError("private key checksum failure") - } - data = data[:len(data)-sha1.Size] - } else { - if len(data) < 2 { - return errors.StructuralError("truncated private key data") - } - var sum uint16 - for i := 0; i < len(data)-2; i++ { - sum += uint16(data[i]) - } - if data[len(data)-2] != uint8(sum>>8) || - data[len(data)-1] != uint8(sum) { - return errors.StructuralError("private key checksum failure") - } - data = data[:len(data)-2] - } - - return pk.parsePrivateKey(data) -} - -func (pk *PrivateKey) parsePrivateKey(data []byte) (err error) { - switch pk.PublicKey.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoRSAEncryptOnly: - return pk.parseRSAPrivateKey(data) - case PubKeyAlgoDSA: - return pk.parseDSAPrivateKey(data) - case PubKeyAlgoElGamal: - return pk.parseElGamalPrivateKey(data) - case PubKeyAlgoECDSA: - return pk.parseECDSAPrivateKey(data) - } - panic("impossible") -} - -func (pk *PrivateKey) parseRSAPrivateKey(data []byte) (err error) { - rsaPub := pk.PublicKey.PublicKey.(*rsa.PublicKey) - rsaPriv := new(rsa.PrivateKey) - rsaPriv.PublicKey = *rsaPub - - buf := bytes.NewBuffer(data) - d, _, err := readMPI(buf) - if err != nil { - return - } - p, _, err := readMPI(buf) - if err != nil { - return - } - q, _, err := readMPI(buf) - if err != nil { - return - } - - rsaPriv.D = new(big.Int).SetBytes(d) - rsaPriv.Primes = make([]*big.Int, 2) - rsaPriv.Primes[0] = new(big.Int).SetBytes(p) - rsaPriv.Primes[1] = new(big.Int).SetBytes(q) - if err := rsaPriv.Validate(); err != nil { - return err - } - rsaPriv.Precompute() - pk.PrivateKey = rsaPriv - pk.Encrypted = false - pk.encryptedData = nil - - return nil -} - -func (pk *PrivateKey) parseDSAPrivateKey(data []byte) (err error) { - dsaPub := pk.PublicKey.PublicKey.(*dsa.PublicKey) - dsaPriv := new(dsa.PrivateKey) - dsaPriv.PublicKey = *dsaPub - - buf := bytes.NewBuffer(data) - x, _, err := readMPI(buf) - if err != nil { - return - } - - dsaPriv.X = new(big.Int).SetBytes(x) - pk.PrivateKey = dsaPriv - pk.Encrypted = false - pk.encryptedData = nil - - return nil -} - -func (pk *PrivateKey) parseElGamalPrivateKey(data []byte) (err error) { - pub := pk.PublicKey.PublicKey.(*elgamal.PublicKey) - priv := new(elgamal.PrivateKey) - priv.PublicKey = *pub - - buf := bytes.NewBuffer(data) - x, _, err := readMPI(buf) - if err != nil { - return - } - - priv.X = new(big.Int).SetBytes(x) - pk.PrivateKey = priv - pk.Encrypted = false - pk.encryptedData = nil - - return nil -} - -func (pk *PrivateKey) parseECDSAPrivateKey(data []byte) (err error) { - ecdsaPub := pk.PublicKey.PublicKey.(*ecdsa.PublicKey) - - buf := bytes.NewBuffer(data) - d, _, err := readMPI(buf) - if err != nil { - return - } - - pk.PrivateKey = &ecdsa.PrivateKey{ - PublicKey: *ecdsaPub, - D: new(big.Int).SetBytes(d), - } - pk.Encrypted = false - pk.encryptedData = nil - - return nil -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/public_key.go b/vendor/golang.org/x/crypto/openpgp/packet/public_key.go deleted file mode 100644 index fcd5f5251963..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/public_key.go +++ /dev/null @@ -1,753 +0,0 @@ -// 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 packet - -import ( - "bytes" - "crypto" - "crypto/dsa" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rsa" - "crypto/sha1" - _ "crypto/sha256" - _ "crypto/sha512" - "encoding/binary" - "fmt" - "hash" - "io" - "math/big" - "strconv" - "time" - - "golang.org/x/crypto/openpgp/elgamal" - "golang.org/x/crypto/openpgp/errors" -) - -var ( - // NIST curve P-256 - oidCurveP256 []byte = []byte{0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07} - // NIST curve P-384 - oidCurveP384 []byte = []byte{0x2B, 0x81, 0x04, 0x00, 0x22} - // NIST curve P-521 - oidCurveP521 []byte = []byte{0x2B, 0x81, 0x04, 0x00, 0x23} -) - -const maxOIDLength = 8 - -// ecdsaKey stores the algorithm-specific fields for ECDSA keys. -// as defined in RFC 6637, Section 9. -type ecdsaKey struct { - // oid contains the OID byte sequence identifying the elliptic curve used - oid []byte - // p contains the elliptic curve point that represents the public key - p parsedMPI -} - -// parseOID reads the OID for the curve as defined in RFC 6637, Section 9. -func parseOID(r io.Reader) (oid []byte, err error) { - buf := make([]byte, maxOIDLength) - if _, err = readFull(r, buf[:1]); err != nil { - return - } - oidLen := buf[0] - if int(oidLen) > len(buf) { - err = errors.UnsupportedError("invalid oid length: " + strconv.Itoa(int(oidLen))) - return - } - oid = buf[:oidLen] - _, err = readFull(r, oid) - return -} - -func (f *ecdsaKey) parse(r io.Reader) (err error) { - if f.oid, err = parseOID(r); err != nil { - return err - } - f.p.bytes, f.p.bitLength, err = readMPI(r) - return -} - -func (f *ecdsaKey) serialize(w io.Writer) (err error) { - buf := make([]byte, maxOIDLength+1) - buf[0] = byte(len(f.oid)) - copy(buf[1:], f.oid) - if _, err = w.Write(buf[:len(f.oid)+1]); err != nil { - return - } - return writeMPIs(w, f.p) -} - -func (f *ecdsaKey) newECDSA() (*ecdsa.PublicKey, error) { - var c elliptic.Curve - if bytes.Equal(f.oid, oidCurveP256) { - c = elliptic.P256() - } else if bytes.Equal(f.oid, oidCurveP384) { - c = elliptic.P384() - } else if bytes.Equal(f.oid, oidCurveP521) { - c = elliptic.P521() - } else { - return nil, errors.UnsupportedError(fmt.Sprintf("unsupported oid: %x", f.oid)) - } - x, y := elliptic.Unmarshal(c, f.p.bytes) - if x == nil { - return nil, errors.UnsupportedError("failed to parse EC point") - } - return &ecdsa.PublicKey{Curve: c, X: x, Y: y}, nil -} - -func (f *ecdsaKey) byteLen() int { - return 1 + len(f.oid) + 2 + len(f.p.bytes) -} - -type kdfHashFunction byte -type kdfAlgorithm byte - -// ecdhKdf stores key derivation function parameters -// used for ECDH encryption. See RFC 6637, Section 9. -type ecdhKdf struct { - KdfHash kdfHashFunction - KdfAlgo kdfAlgorithm -} - -func (f *ecdhKdf) parse(r io.Reader) (err error) { - buf := make([]byte, 1) - if _, err = readFull(r, buf); err != nil { - return - } - kdfLen := int(buf[0]) - if kdfLen < 3 { - return errors.UnsupportedError("Unsupported ECDH KDF length: " + strconv.Itoa(kdfLen)) - } - buf = make([]byte, kdfLen) - if _, err = readFull(r, buf); err != nil { - return - } - reserved := int(buf[0]) - f.KdfHash = kdfHashFunction(buf[1]) - f.KdfAlgo = kdfAlgorithm(buf[2]) - if reserved != 0x01 { - return errors.UnsupportedError("Unsupported KDF reserved field: " + strconv.Itoa(reserved)) - } - return -} - -func (f *ecdhKdf) serialize(w io.Writer) (err error) { - buf := make([]byte, 4) - // See RFC 6637, Section 9, Algorithm-Specific Fields for ECDH keys. - buf[0] = byte(0x03) // Length of the following fields - buf[1] = byte(0x01) // Reserved for future extensions, must be 1 for now - buf[2] = byte(f.KdfHash) - buf[3] = byte(f.KdfAlgo) - _, err = w.Write(buf[:]) - return -} - -func (f *ecdhKdf) byteLen() int { - return 4 -} - -// PublicKey represents an OpenPGP public key. See RFC 4880, section 5.5.2. -type PublicKey struct { - CreationTime time.Time - PubKeyAlgo PublicKeyAlgorithm - PublicKey interface{} // *rsa.PublicKey, *dsa.PublicKey or *ecdsa.PublicKey - Fingerprint [20]byte - KeyId uint64 - IsSubkey bool - - n, e, p, q, g, y parsedMPI - - // RFC 6637 fields - ec *ecdsaKey - ecdh *ecdhKdf -} - -// signingKey provides a convenient abstraction over signature verification -// for v3 and v4 public keys. -type signingKey interface { - SerializeSignaturePrefix(io.Writer) - serializeWithoutHeaders(io.Writer) error -} - -func fromBig(n *big.Int) parsedMPI { - return parsedMPI{ - bytes: n.Bytes(), - bitLength: uint16(n.BitLen()), - } -} - -// NewRSAPublicKey returns a PublicKey that wraps the given rsa.PublicKey. -func NewRSAPublicKey(creationTime time.Time, pub *rsa.PublicKey) *PublicKey { - pk := &PublicKey{ - CreationTime: creationTime, - PubKeyAlgo: PubKeyAlgoRSA, - PublicKey: pub, - n: fromBig(pub.N), - e: fromBig(big.NewInt(int64(pub.E))), - } - - pk.setFingerPrintAndKeyId() - return pk -} - -// NewDSAPublicKey returns a PublicKey that wraps the given dsa.PublicKey. -func NewDSAPublicKey(creationTime time.Time, pub *dsa.PublicKey) *PublicKey { - pk := &PublicKey{ - CreationTime: creationTime, - PubKeyAlgo: PubKeyAlgoDSA, - PublicKey: pub, - p: fromBig(pub.P), - q: fromBig(pub.Q), - g: fromBig(pub.G), - y: fromBig(pub.Y), - } - - pk.setFingerPrintAndKeyId() - return pk -} - -// NewElGamalPublicKey returns a PublicKey that wraps the given elgamal.PublicKey. -func NewElGamalPublicKey(creationTime time.Time, pub *elgamal.PublicKey) *PublicKey { - pk := &PublicKey{ - CreationTime: creationTime, - PubKeyAlgo: PubKeyAlgoElGamal, - PublicKey: pub, - p: fromBig(pub.P), - g: fromBig(pub.G), - y: fromBig(pub.Y), - } - - pk.setFingerPrintAndKeyId() - return pk -} - -func NewECDSAPublicKey(creationTime time.Time, pub *ecdsa.PublicKey) *PublicKey { - pk := &PublicKey{ - CreationTime: creationTime, - PubKeyAlgo: PubKeyAlgoECDSA, - PublicKey: pub, - ec: new(ecdsaKey), - } - - switch pub.Curve { - case elliptic.P256(): - pk.ec.oid = oidCurveP256 - case elliptic.P384(): - pk.ec.oid = oidCurveP384 - case elliptic.P521(): - pk.ec.oid = oidCurveP521 - default: - panic("unknown elliptic curve") - } - - pk.ec.p.bytes = elliptic.Marshal(pub.Curve, pub.X, pub.Y) - - // The bit length is 3 (for the 0x04 specifying an uncompressed key) - // plus two field elements (for x and y), which are rounded up to the - // nearest byte. See https://tools.ietf.org/html/rfc6637#section-6 - fieldBytes := (pub.Curve.Params().BitSize + 7) & ^7 - pk.ec.p.bitLength = uint16(3 + fieldBytes + fieldBytes) - - pk.setFingerPrintAndKeyId() - return pk -} - -func (pk *PublicKey) parse(r io.Reader) (err error) { - // RFC 4880, section 5.5.2 - var buf [6]byte - _, err = readFull(r, buf[:]) - if err != nil { - return - } - if buf[0] != 4 { - return errors.UnsupportedError("public key version") - } - pk.CreationTime = time.Unix(int64(uint32(buf[1])<<24|uint32(buf[2])<<16|uint32(buf[3])<<8|uint32(buf[4])), 0) - pk.PubKeyAlgo = PublicKeyAlgorithm(buf[5]) - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - err = pk.parseRSA(r) - case PubKeyAlgoDSA: - err = pk.parseDSA(r) - case PubKeyAlgoElGamal: - err = pk.parseElGamal(r) - case PubKeyAlgoECDSA: - pk.ec = new(ecdsaKey) - if err = pk.ec.parse(r); err != nil { - return err - } - pk.PublicKey, err = pk.ec.newECDSA() - case PubKeyAlgoECDH: - pk.ec = new(ecdsaKey) - if err = pk.ec.parse(r); err != nil { - return - } - pk.ecdh = new(ecdhKdf) - if err = pk.ecdh.parse(r); err != nil { - return - } - // The ECDH key is stored in an ecdsa.PublicKey for convenience. - pk.PublicKey, err = pk.ec.newECDSA() - default: - err = errors.UnsupportedError("public key type: " + strconv.Itoa(int(pk.PubKeyAlgo))) - } - if err != nil { - return - } - - pk.setFingerPrintAndKeyId() - return -} - -func (pk *PublicKey) setFingerPrintAndKeyId() { - // RFC 4880, section 12.2 - fingerPrint := sha1.New() - pk.SerializeSignaturePrefix(fingerPrint) - pk.serializeWithoutHeaders(fingerPrint) - copy(pk.Fingerprint[:], fingerPrint.Sum(nil)) - pk.KeyId = binary.BigEndian.Uint64(pk.Fingerprint[12:20]) -} - -// parseRSA parses RSA public key material from the given Reader. See RFC 4880, -// section 5.5.2. -func (pk *PublicKey) parseRSA(r io.Reader) (err error) { - pk.n.bytes, pk.n.bitLength, err = readMPI(r) - if err != nil { - return - } - pk.e.bytes, pk.e.bitLength, err = readMPI(r) - if err != nil { - return - } - - if len(pk.e.bytes) > 3 { - err = errors.UnsupportedError("large public exponent") - return - } - rsa := &rsa.PublicKey{ - N: new(big.Int).SetBytes(pk.n.bytes), - E: 0, - } - for i := 0; i < len(pk.e.bytes); i++ { - rsa.E <<= 8 - rsa.E |= int(pk.e.bytes[i]) - } - pk.PublicKey = rsa - return -} - -// parseDSA parses DSA public key material from the given Reader. See RFC 4880, -// section 5.5.2. -func (pk *PublicKey) parseDSA(r io.Reader) (err error) { - pk.p.bytes, pk.p.bitLength, err = readMPI(r) - if err != nil { - return - } - pk.q.bytes, pk.q.bitLength, err = readMPI(r) - if err != nil { - return - } - pk.g.bytes, pk.g.bitLength, err = readMPI(r) - if err != nil { - return - } - pk.y.bytes, pk.y.bitLength, err = readMPI(r) - if err != nil { - return - } - - dsa := new(dsa.PublicKey) - dsa.P = new(big.Int).SetBytes(pk.p.bytes) - dsa.Q = new(big.Int).SetBytes(pk.q.bytes) - dsa.G = new(big.Int).SetBytes(pk.g.bytes) - dsa.Y = new(big.Int).SetBytes(pk.y.bytes) - pk.PublicKey = dsa - return -} - -// parseElGamal parses ElGamal public key material from the given Reader. See -// RFC 4880, section 5.5.2. -func (pk *PublicKey) parseElGamal(r io.Reader) (err error) { - pk.p.bytes, pk.p.bitLength, err = readMPI(r) - if err != nil { - return - } - pk.g.bytes, pk.g.bitLength, err = readMPI(r) - if err != nil { - return - } - pk.y.bytes, pk.y.bitLength, err = readMPI(r) - if err != nil { - return - } - - elgamal := new(elgamal.PublicKey) - elgamal.P = new(big.Int).SetBytes(pk.p.bytes) - elgamal.G = new(big.Int).SetBytes(pk.g.bytes) - elgamal.Y = new(big.Int).SetBytes(pk.y.bytes) - pk.PublicKey = elgamal - return -} - -// SerializeSignaturePrefix writes the prefix for this public key to the given Writer. -// The prefix is used when calculating a signature over this public key. See -// RFC 4880, section 5.2.4. -func (pk *PublicKey) SerializeSignaturePrefix(h io.Writer) { - var pLength uint16 - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - pLength += 2 + uint16(len(pk.n.bytes)) - pLength += 2 + uint16(len(pk.e.bytes)) - case PubKeyAlgoDSA: - pLength += 2 + uint16(len(pk.p.bytes)) - pLength += 2 + uint16(len(pk.q.bytes)) - pLength += 2 + uint16(len(pk.g.bytes)) - pLength += 2 + uint16(len(pk.y.bytes)) - case PubKeyAlgoElGamal: - pLength += 2 + uint16(len(pk.p.bytes)) - pLength += 2 + uint16(len(pk.g.bytes)) - pLength += 2 + uint16(len(pk.y.bytes)) - case PubKeyAlgoECDSA: - pLength += uint16(pk.ec.byteLen()) - case PubKeyAlgoECDH: - pLength += uint16(pk.ec.byteLen()) - pLength += uint16(pk.ecdh.byteLen()) - default: - panic("unknown public key algorithm") - } - pLength += 6 - h.Write([]byte{0x99, byte(pLength >> 8), byte(pLength)}) - return -} - -func (pk *PublicKey) Serialize(w io.Writer) (err error) { - length := 6 // 6 byte header - - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - length += 2 + len(pk.n.bytes) - length += 2 + len(pk.e.bytes) - case PubKeyAlgoDSA: - length += 2 + len(pk.p.bytes) - length += 2 + len(pk.q.bytes) - length += 2 + len(pk.g.bytes) - length += 2 + len(pk.y.bytes) - case PubKeyAlgoElGamal: - length += 2 + len(pk.p.bytes) - length += 2 + len(pk.g.bytes) - length += 2 + len(pk.y.bytes) - case PubKeyAlgoECDSA: - length += pk.ec.byteLen() - case PubKeyAlgoECDH: - length += pk.ec.byteLen() - length += pk.ecdh.byteLen() - default: - panic("unknown public key algorithm") - } - - packetType := packetTypePublicKey - if pk.IsSubkey { - packetType = packetTypePublicSubkey - } - err = serializeHeader(w, packetType, length) - if err != nil { - return - } - return pk.serializeWithoutHeaders(w) -} - -// serializeWithoutHeaders marshals the PublicKey to w in the form of an -// OpenPGP public key packet, not including the packet header. -func (pk *PublicKey) serializeWithoutHeaders(w io.Writer) (err error) { - var buf [6]byte - buf[0] = 4 - t := uint32(pk.CreationTime.Unix()) - buf[1] = byte(t >> 24) - buf[2] = byte(t >> 16) - buf[3] = byte(t >> 8) - buf[4] = byte(t) - buf[5] = byte(pk.PubKeyAlgo) - - _, err = w.Write(buf[:]) - if err != nil { - return - } - - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - return writeMPIs(w, pk.n, pk.e) - case PubKeyAlgoDSA: - return writeMPIs(w, pk.p, pk.q, pk.g, pk.y) - case PubKeyAlgoElGamal: - return writeMPIs(w, pk.p, pk.g, pk.y) - case PubKeyAlgoECDSA: - return pk.ec.serialize(w) - case PubKeyAlgoECDH: - if err = pk.ec.serialize(w); err != nil { - return - } - return pk.ecdh.serialize(w) - } - return errors.InvalidArgumentError("bad public-key algorithm") -} - -// CanSign returns true iff this public key can generate signatures -func (pk *PublicKey) CanSign() bool { - return pk.PubKeyAlgo != PubKeyAlgoRSAEncryptOnly && pk.PubKeyAlgo != PubKeyAlgoElGamal -} - -// VerifySignature returns nil iff sig is a valid signature, made by this -// public key, of the data hashed into signed. signed is mutated by this call. -func (pk *PublicKey) VerifySignature(signed hash.Hash, sig *Signature) (err error) { - if !pk.CanSign() { - return errors.InvalidArgumentError("public key cannot generate signatures") - } - - signed.Write(sig.HashSuffix) - hashBytes := signed.Sum(nil) - - if hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1] { - return errors.SignatureError("hash tag doesn't match") - } - - if pk.PubKeyAlgo != sig.PubKeyAlgo { - return errors.InvalidArgumentError("public key and signature use different algorithms") - } - - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - rsaPublicKey, _ := pk.PublicKey.(*rsa.PublicKey) - err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, padToKeySize(rsaPublicKey, sig.RSASignature.bytes)) - if err != nil { - return errors.SignatureError("RSA verification failure") - } - return nil - case PubKeyAlgoDSA: - dsaPublicKey, _ := pk.PublicKey.(*dsa.PublicKey) - // Need to truncate hashBytes to match FIPS 186-3 section 4.6. - subgroupSize := (dsaPublicKey.Q.BitLen() + 7) / 8 - if len(hashBytes) > subgroupSize { - hashBytes = hashBytes[:subgroupSize] - } - if !dsa.Verify(dsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.DSASigR.bytes), new(big.Int).SetBytes(sig.DSASigS.bytes)) { - return errors.SignatureError("DSA verification failure") - } - return nil - case PubKeyAlgoECDSA: - ecdsaPublicKey := pk.PublicKey.(*ecdsa.PublicKey) - if !ecdsa.Verify(ecdsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.ECDSASigR.bytes), new(big.Int).SetBytes(sig.ECDSASigS.bytes)) { - return errors.SignatureError("ECDSA verification failure") - } - return nil - default: - return errors.SignatureError("Unsupported public key algorithm used in signature") - } -} - -// VerifySignatureV3 returns nil iff sig is a valid signature, made by this -// public key, of the data hashed into signed. signed is mutated by this call. -func (pk *PublicKey) VerifySignatureV3(signed hash.Hash, sig *SignatureV3) (err error) { - if !pk.CanSign() { - return errors.InvalidArgumentError("public key cannot generate signatures") - } - - suffix := make([]byte, 5) - suffix[0] = byte(sig.SigType) - binary.BigEndian.PutUint32(suffix[1:], uint32(sig.CreationTime.Unix())) - signed.Write(suffix) - hashBytes := signed.Sum(nil) - - if hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1] { - return errors.SignatureError("hash tag doesn't match") - } - - if pk.PubKeyAlgo != sig.PubKeyAlgo { - return errors.InvalidArgumentError("public key and signature use different algorithms") - } - - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - rsaPublicKey := pk.PublicKey.(*rsa.PublicKey) - if err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, padToKeySize(rsaPublicKey, sig.RSASignature.bytes)); err != nil { - return errors.SignatureError("RSA verification failure") - } - return - case PubKeyAlgoDSA: - dsaPublicKey := pk.PublicKey.(*dsa.PublicKey) - // Need to truncate hashBytes to match FIPS 186-3 section 4.6. - subgroupSize := (dsaPublicKey.Q.BitLen() + 7) / 8 - if len(hashBytes) > subgroupSize { - hashBytes = hashBytes[:subgroupSize] - } - if !dsa.Verify(dsaPublicKey, hashBytes, new(big.Int).SetBytes(sig.DSASigR.bytes), new(big.Int).SetBytes(sig.DSASigS.bytes)) { - return errors.SignatureError("DSA verification failure") - } - return nil - default: - panic("shouldn't happen") - } -} - -// keySignatureHash returns a Hash of the message that needs to be signed for -// pk to assert a subkey relationship to signed. -func keySignatureHash(pk, signed signingKey, hashFunc crypto.Hash) (h hash.Hash, err error) { - if !hashFunc.Available() { - return nil, errors.UnsupportedError("hash function") - } - h = hashFunc.New() - - // RFC 4880, section 5.2.4 - pk.SerializeSignaturePrefix(h) - pk.serializeWithoutHeaders(h) - signed.SerializeSignaturePrefix(h) - signed.serializeWithoutHeaders(h) - return -} - -// VerifyKeySignature returns nil iff sig is a valid signature, made by this -// public key, of signed. -func (pk *PublicKey) VerifyKeySignature(signed *PublicKey, sig *Signature) error { - h, err := keySignatureHash(pk, signed, sig.Hash) - if err != nil { - return err - } - if err = pk.VerifySignature(h, sig); err != nil { - return err - } - - if sig.FlagSign { - // Signing subkeys must be cross-signed. See - // https://www.gnupg.org/faq/subkey-cross-certify.html. - if sig.EmbeddedSignature == nil { - return errors.StructuralError("signing subkey is missing cross-signature") - } - // Verify the cross-signature. This is calculated over the same - // data as the main signature, so we cannot just recursively - // call signed.VerifyKeySignature(...) - if h, err = keySignatureHash(pk, signed, sig.EmbeddedSignature.Hash); err != nil { - return errors.StructuralError("error while hashing for cross-signature: " + err.Error()) - } - if err := signed.VerifySignature(h, sig.EmbeddedSignature); err != nil { - return errors.StructuralError("error while verifying cross-signature: " + err.Error()) - } - } - - return nil -} - -func keyRevocationHash(pk signingKey, hashFunc crypto.Hash) (h hash.Hash, err error) { - if !hashFunc.Available() { - return nil, errors.UnsupportedError("hash function") - } - h = hashFunc.New() - - // RFC 4880, section 5.2.4 - pk.SerializeSignaturePrefix(h) - pk.serializeWithoutHeaders(h) - - return -} - -// VerifyRevocationSignature returns nil iff sig is a valid signature, made by this -// public key. -func (pk *PublicKey) VerifyRevocationSignature(sig *Signature) (err error) { - h, err := keyRevocationHash(pk, sig.Hash) - if err != nil { - return err - } - return pk.VerifySignature(h, sig) -} - -// userIdSignatureHash returns a Hash of the message that needs to be signed -// to assert that pk is a valid key for id. -func userIdSignatureHash(id string, pk *PublicKey, hashFunc crypto.Hash) (h hash.Hash, err error) { - if !hashFunc.Available() { - return nil, errors.UnsupportedError("hash function") - } - h = hashFunc.New() - - // RFC 4880, section 5.2.4 - pk.SerializeSignaturePrefix(h) - pk.serializeWithoutHeaders(h) - - var buf [5]byte - buf[0] = 0xb4 - buf[1] = byte(len(id) >> 24) - buf[2] = byte(len(id) >> 16) - buf[3] = byte(len(id) >> 8) - buf[4] = byte(len(id)) - h.Write(buf[:]) - h.Write([]byte(id)) - - return -} - -// VerifyUserIdSignature returns nil iff sig is a valid signature, made by this -// public key, that id is the identity of pub. -func (pk *PublicKey) VerifyUserIdSignature(id string, pub *PublicKey, sig *Signature) (err error) { - h, err := userIdSignatureHash(id, pub, sig.Hash) - if err != nil { - return err - } - return pk.VerifySignature(h, sig) -} - -// VerifyUserIdSignatureV3 returns nil iff sig is a valid signature, made by this -// public key, that id is the identity of pub. -func (pk *PublicKey) VerifyUserIdSignatureV3(id string, pub *PublicKey, sig *SignatureV3) (err error) { - h, err := userIdSignatureV3Hash(id, pub, sig.Hash) - if err != nil { - return err - } - return pk.VerifySignatureV3(h, sig) -} - -// KeyIdString returns the public key's fingerprint in capital hex -// (e.g. "6C7EE1B8621CC013"). -func (pk *PublicKey) KeyIdString() string { - return fmt.Sprintf("%X", pk.Fingerprint[12:20]) -} - -// KeyIdShortString returns the short form of public key's fingerprint -// in capital hex, as shown by gpg --list-keys (e.g. "621CC013"). -func (pk *PublicKey) KeyIdShortString() string { - return fmt.Sprintf("%X", pk.Fingerprint[16:20]) -} - -// A parsedMPI is used to store the contents of a big integer, along with the -// bit length that was specified in the original input. This allows the MPI to -// be reserialized exactly. -type parsedMPI struct { - bytes []byte - bitLength uint16 -} - -// writeMPIs is a utility function for serializing several big integers to the -// given Writer. -func writeMPIs(w io.Writer, mpis ...parsedMPI) (err error) { - for _, mpi := range mpis { - err = writeMPI(w, mpi.bitLength, mpi.bytes) - if err != nil { - return - } - } - return -} - -// BitLength returns the bit length for the given public key. -func (pk *PublicKey) BitLength() (bitLength uint16, err error) { - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - bitLength = pk.n.bitLength - case PubKeyAlgoDSA: - bitLength = pk.p.bitLength - case PubKeyAlgoElGamal: - bitLength = pk.p.bitLength - default: - err = errors.InvalidArgumentError("bad public-key algorithm") - } - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/public_key_v3.go b/vendor/golang.org/x/crypto/openpgp/packet/public_key_v3.go deleted file mode 100644 index 5daf7b6cfd4a..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/public_key_v3.go +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright 2013 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 packet - -import ( - "crypto" - "crypto/md5" - "crypto/rsa" - "encoding/binary" - "fmt" - "hash" - "io" - "math/big" - "strconv" - "time" - - "golang.org/x/crypto/openpgp/errors" -) - -// PublicKeyV3 represents older, version 3 public keys. These keys are less secure and -// should not be used for signing or encrypting. They are supported here only for -// parsing version 3 key material and validating signatures. -// See RFC 4880, section 5.5.2. -type PublicKeyV3 struct { - CreationTime time.Time - DaysToExpire uint16 - PubKeyAlgo PublicKeyAlgorithm - PublicKey *rsa.PublicKey - Fingerprint [16]byte - KeyId uint64 - IsSubkey bool - - n, e parsedMPI -} - -// newRSAPublicKeyV3 returns a PublicKey that wraps the given rsa.PublicKey. -// Included here for testing purposes only. RFC 4880, section 5.5.2: -// "an implementation MUST NOT generate a V3 key, but MAY accept it." -func newRSAPublicKeyV3(creationTime time.Time, pub *rsa.PublicKey) *PublicKeyV3 { - pk := &PublicKeyV3{ - CreationTime: creationTime, - PublicKey: pub, - n: fromBig(pub.N), - e: fromBig(big.NewInt(int64(pub.E))), - } - - pk.setFingerPrintAndKeyId() - return pk -} - -func (pk *PublicKeyV3) parse(r io.Reader) (err error) { - // RFC 4880, section 5.5.2 - var buf [8]byte - if _, err = readFull(r, buf[:]); err != nil { - return - } - if buf[0] < 2 || buf[0] > 3 { - return errors.UnsupportedError("public key version") - } - pk.CreationTime = time.Unix(int64(uint32(buf[1])<<24|uint32(buf[2])<<16|uint32(buf[3])<<8|uint32(buf[4])), 0) - pk.DaysToExpire = binary.BigEndian.Uint16(buf[5:7]) - pk.PubKeyAlgo = PublicKeyAlgorithm(buf[7]) - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - err = pk.parseRSA(r) - default: - err = errors.UnsupportedError("public key type: " + strconv.Itoa(int(pk.PubKeyAlgo))) - } - if err != nil { - return - } - - pk.setFingerPrintAndKeyId() - return -} - -func (pk *PublicKeyV3) setFingerPrintAndKeyId() { - // RFC 4880, section 12.2 - fingerPrint := md5.New() - fingerPrint.Write(pk.n.bytes) - fingerPrint.Write(pk.e.bytes) - fingerPrint.Sum(pk.Fingerprint[:0]) - pk.KeyId = binary.BigEndian.Uint64(pk.n.bytes[len(pk.n.bytes)-8:]) -} - -// parseRSA parses RSA public key material from the given Reader. See RFC 4880, -// section 5.5.2. -func (pk *PublicKeyV3) parseRSA(r io.Reader) (err error) { - if pk.n.bytes, pk.n.bitLength, err = readMPI(r); err != nil { - return - } - if pk.e.bytes, pk.e.bitLength, err = readMPI(r); err != nil { - return - } - - // RFC 4880 Section 12.2 requires the low 8 bytes of the - // modulus to form the key id. - if len(pk.n.bytes) < 8 { - return errors.StructuralError("v3 public key modulus is too short") - } - if len(pk.e.bytes) > 3 { - err = errors.UnsupportedError("large public exponent") - return - } - rsa := &rsa.PublicKey{N: new(big.Int).SetBytes(pk.n.bytes)} - for i := 0; i < len(pk.e.bytes); i++ { - rsa.E <<= 8 - rsa.E |= int(pk.e.bytes[i]) - } - pk.PublicKey = rsa - return -} - -// SerializeSignaturePrefix writes the prefix for this public key to the given Writer. -// The prefix is used when calculating a signature over this public key. See -// RFC 4880, section 5.2.4. -func (pk *PublicKeyV3) SerializeSignaturePrefix(w io.Writer) { - var pLength uint16 - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - pLength += 2 + uint16(len(pk.n.bytes)) - pLength += 2 + uint16(len(pk.e.bytes)) - default: - panic("unknown public key algorithm") - } - pLength += 6 - w.Write([]byte{0x99, byte(pLength >> 8), byte(pLength)}) - return -} - -func (pk *PublicKeyV3) Serialize(w io.Writer) (err error) { - length := 8 // 8 byte header - - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - length += 2 + len(pk.n.bytes) - length += 2 + len(pk.e.bytes) - default: - panic("unknown public key algorithm") - } - - packetType := packetTypePublicKey - if pk.IsSubkey { - packetType = packetTypePublicSubkey - } - if err = serializeHeader(w, packetType, length); err != nil { - return - } - return pk.serializeWithoutHeaders(w) -} - -// serializeWithoutHeaders marshals the PublicKey to w in the form of an -// OpenPGP public key packet, not including the packet header. -func (pk *PublicKeyV3) serializeWithoutHeaders(w io.Writer) (err error) { - var buf [8]byte - // Version 3 - buf[0] = 3 - // Creation time - t := uint32(pk.CreationTime.Unix()) - buf[1] = byte(t >> 24) - buf[2] = byte(t >> 16) - buf[3] = byte(t >> 8) - buf[4] = byte(t) - // Days to expire - buf[5] = byte(pk.DaysToExpire >> 8) - buf[6] = byte(pk.DaysToExpire) - // Public key algorithm - buf[7] = byte(pk.PubKeyAlgo) - - if _, err = w.Write(buf[:]); err != nil { - return - } - - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - return writeMPIs(w, pk.n, pk.e) - } - return errors.InvalidArgumentError("bad public-key algorithm") -} - -// CanSign returns true iff this public key can generate signatures -func (pk *PublicKeyV3) CanSign() bool { - return pk.PubKeyAlgo != PubKeyAlgoRSAEncryptOnly -} - -// VerifySignatureV3 returns nil iff sig is a valid signature, made by this -// public key, of the data hashed into signed. signed is mutated by this call. -func (pk *PublicKeyV3) VerifySignatureV3(signed hash.Hash, sig *SignatureV3) (err error) { - if !pk.CanSign() { - return errors.InvalidArgumentError("public key cannot generate signatures") - } - - suffix := make([]byte, 5) - suffix[0] = byte(sig.SigType) - binary.BigEndian.PutUint32(suffix[1:], uint32(sig.CreationTime.Unix())) - signed.Write(suffix) - hashBytes := signed.Sum(nil) - - if hashBytes[0] != sig.HashTag[0] || hashBytes[1] != sig.HashTag[1] { - return errors.SignatureError("hash tag doesn't match") - } - - if pk.PubKeyAlgo != sig.PubKeyAlgo { - return errors.InvalidArgumentError("public key and signature use different algorithms") - } - - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - if err = rsa.VerifyPKCS1v15(pk.PublicKey, sig.Hash, hashBytes, sig.RSASignature.bytes); err != nil { - return errors.SignatureError("RSA verification failure") - } - return - default: - // V3 public keys only support RSA. - panic("shouldn't happen") - } -} - -// VerifyUserIdSignatureV3 returns nil iff sig is a valid signature, made by this -// public key, that id is the identity of pub. -func (pk *PublicKeyV3) VerifyUserIdSignatureV3(id string, pub *PublicKeyV3, sig *SignatureV3) (err error) { - h, err := userIdSignatureV3Hash(id, pk, sig.Hash) - if err != nil { - return err - } - return pk.VerifySignatureV3(h, sig) -} - -// VerifyKeySignatureV3 returns nil iff sig is a valid signature, made by this -// public key, of signed. -func (pk *PublicKeyV3) VerifyKeySignatureV3(signed *PublicKeyV3, sig *SignatureV3) (err error) { - h, err := keySignatureHash(pk, signed, sig.Hash) - if err != nil { - return err - } - return pk.VerifySignatureV3(h, sig) -} - -// userIdSignatureV3Hash returns a Hash of the message that needs to be signed -// to assert that pk is a valid key for id. -func userIdSignatureV3Hash(id string, pk signingKey, hfn crypto.Hash) (h hash.Hash, err error) { - if !hfn.Available() { - return nil, errors.UnsupportedError("hash function") - } - h = hfn.New() - - // RFC 4880, section 5.2.4 - pk.SerializeSignaturePrefix(h) - pk.serializeWithoutHeaders(h) - - h.Write([]byte(id)) - - return -} - -// KeyIdString returns the public key's fingerprint in capital hex -// (e.g. "6C7EE1B8621CC013"). -func (pk *PublicKeyV3) KeyIdString() string { - return fmt.Sprintf("%X", pk.KeyId) -} - -// KeyIdShortString returns the short form of public key's fingerprint -// in capital hex, as shown by gpg --list-keys (e.g. "621CC013"). -func (pk *PublicKeyV3) KeyIdShortString() string { - return fmt.Sprintf("%X", pk.KeyId&0xFFFFFFFF) -} - -// BitLength returns the bit length for the given public key. -func (pk *PublicKeyV3) BitLength() (bitLength uint16, err error) { - switch pk.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly, PubKeyAlgoRSASignOnly: - bitLength = pk.n.bitLength - default: - err = errors.InvalidArgumentError("bad public-key algorithm") - } - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/reader.go b/vendor/golang.org/x/crypto/openpgp/packet/reader.go deleted file mode 100644 index 34bc7c613e6e..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/reader.go +++ /dev/null @@ -1,76 +0,0 @@ -// 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 packet - -import ( - "golang.org/x/crypto/openpgp/errors" - "io" -) - -// Reader reads packets from an io.Reader and allows packets to be 'unread' so -// that they result from the next call to Next. -type Reader struct { - q []Packet - readers []io.Reader -} - -// New io.Readers are pushed when a compressed or encrypted packet is processed -// and recursively treated as a new source of packets. However, a carefully -// crafted packet can trigger an infinite recursive sequence of packets. See -// http://mumble.net/~campbell/misc/pgp-quine -// https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2013-4402 -// This constant limits the number of recursive packets that may be pushed. -const maxReaders = 32 - -// Next returns the most recently unread Packet, or reads another packet from -// the top-most io.Reader. Unknown packet types are skipped. -func (r *Reader) Next() (p Packet, err error) { - if len(r.q) > 0 { - p = r.q[len(r.q)-1] - r.q = r.q[:len(r.q)-1] - return - } - - for len(r.readers) > 0 { - p, err = Read(r.readers[len(r.readers)-1]) - if err == nil { - return - } - if err == io.EOF { - r.readers = r.readers[:len(r.readers)-1] - continue - } - if _, ok := err.(errors.UnknownPacketTypeError); !ok { - return nil, err - } - } - - return nil, io.EOF -} - -// Push causes the Reader to start reading from a new io.Reader. When an EOF -// error is seen from the new io.Reader, it is popped and the Reader continues -// to read from the next most recent io.Reader. Push returns a StructuralError -// if pushing the reader would exceed the maximum recursion level, otherwise it -// returns nil. -func (r *Reader) Push(reader io.Reader) (err error) { - if len(r.readers) >= maxReaders { - return errors.StructuralError("too many layers of packets") - } - r.readers = append(r.readers, reader) - return nil -} - -// Unread causes the given Packet to be returned from the next call to Next. -func (r *Reader) Unread(p Packet) { - r.q = append(r.q, p) -} - -func NewReader(r io.Reader) *Reader { - return &Reader{ - q: nil, - readers: []io.Reader{r}, - } -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/signature.go b/vendor/golang.org/x/crypto/openpgp/packet/signature.go deleted file mode 100644 index b2a24a532327..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/signature.go +++ /dev/null @@ -1,731 +0,0 @@ -// 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 packet - -import ( - "bytes" - "crypto" - "crypto/dsa" - "crypto/ecdsa" - "encoding/asn1" - "encoding/binary" - "hash" - "io" - "math/big" - "strconv" - "time" - - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/s2k" -) - -const ( - // See RFC 4880, section 5.2.3.21 for details. - KeyFlagCertify = 1 << iota - KeyFlagSign - KeyFlagEncryptCommunications - KeyFlagEncryptStorage -) - -// Signature represents a signature. See RFC 4880, section 5.2. -type Signature struct { - SigType SignatureType - PubKeyAlgo PublicKeyAlgorithm - Hash crypto.Hash - - // HashSuffix is extra data that is hashed in after the signed data. - HashSuffix []byte - // HashTag contains the first two bytes of the hash for fast rejection - // of bad signed data. - HashTag [2]byte - CreationTime time.Time - - RSASignature parsedMPI - DSASigR, DSASigS parsedMPI - ECDSASigR, ECDSASigS parsedMPI - - // rawSubpackets contains the unparsed subpackets, in order. - rawSubpackets []outputSubpacket - - // The following are optional so are nil when not included in the - // signature. - - SigLifetimeSecs, KeyLifetimeSecs *uint32 - PreferredSymmetric, PreferredHash, PreferredCompression []uint8 - IssuerKeyId *uint64 - IsPrimaryId *bool - - // FlagsValid is set if any flags were given. See RFC 4880, section - // 5.2.3.21 for details. - FlagsValid bool - FlagCertify, FlagSign, FlagEncryptCommunications, FlagEncryptStorage bool - - // RevocationReason is set if this signature has been revoked. - // See RFC 4880, section 5.2.3.23 for details. - RevocationReason *uint8 - RevocationReasonText string - - // MDC is set if this signature has a feature packet that indicates - // support for MDC subpackets. - MDC bool - - // EmbeddedSignature, if non-nil, is a signature of the parent key, by - // this key. This prevents an attacker from claiming another's signing - // subkey as their own. - EmbeddedSignature *Signature - - outSubpackets []outputSubpacket -} - -func (sig *Signature) parse(r io.Reader) (err error) { - // RFC 4880, section 5.2.3 - var buf [5]byte - _, err = readFull(r, buf[:1]) - if err != nil { - return - } - if buf[0] != 4 { - err = errors.UnsupportedError("signature packet version " + strconv.Itoa(int(buf[0]))) - return - } - - _, err = readFull(r, buf[:5]) - if err != nil { - return - } - sig.SigType = SignatureType(buf[0]) - sig.PubKeyAlgo = PublicKeyAlgorithm(buf[1]) - switch sig.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA, PubKeyAlgoECDSA: - default: - err = errors.UnsupportedError("public key algorithm " + strconv.Itoa(int(sig.PubKeyAlgo))) - return - } - - var ok bool - sig.Hash, ok = s2k.HashIdToHash(buf[2]) - if !ok { - return errors.UnsupportedError("hash function " + strconv.Itoa(int(buf[2]))) - } - - hashedSubpacketsLength := int(buf[3])<<8 | int(buf[4]) - l := 6 + hashedSubpacketsLength - sig.HashSuffix = make([]byte, l+6) - sig.HashSuffix[0] = 4 - copy(sig.HashSuffix[1:], buf[:5]) - hashedSubpackets := sig.HashSuffix[6:l] - _, err = readFull(r, hashedSubpackets) - if err != nil { - return - } - // See RFC 4880, section 5.2.4 - trailer := sig.HashSuffix[l:] - trailer[0] = 4 - trailer[1] = 0xff - trailer[2] = uint8(l >> 24) - trailer[3] = uint8(l >> 16) - trailer[4] = uint8(l >> 8) - trailer[5] = uint8(l) - - err = parseSignatureSubpackets(sig, hashedSubpackets, true) - if err != nil { - return - } - - _, err = readFull(r, buf[:2]) - if err != nil { - return - } - unhashedSubpacketsLength := int(buf[0])<<8 | int(buf[1]) - unhashedSubpackets := make([]byte, unhashedSubpacketsLength) - _, err = readFull(r, unhashedSubpackets) - if err != nil { - return - } - err = parseSignatureSubpackets(sig, unhashedSubpackets, false) - if err != nil { - return - } - - _, err = readFull(r, sig.HashTag[:2]) - if err != nil { - return - } - - switch sig.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - sig.RSASignature.bytes, sig.RSASignature.bitLength, err = readMPI(r) - case PubKeyAlgoDSA: - sig.DSASigR.bytes, sig.DSASigR.bitLength, err = readMPI(r) - if err == nil { - sig.DSASigS.bytes, sig.DSASigS.bitLength, err = readMPI(r) - } - case PubKeyAlgoECDSA: - sig.ECDSASigR.bytes, sig.ECDSASigR.bitLength, err = readMPI(r) - if err == nil { - sig.ECDSASigS.bytes, sig.ECDSASigS.bitLength, err = readMPI(r) - } - default: - panic("unreachable") - } - return -} - -// parseSignatureSubpackets parses subpackets of the main signature packet. See -// RFC 4880, section 5.2.3.1. -func parseSignatureSubpackets(sig *Signature, subpackets []byte, isHashed bool) (err error) { - for len(subpackets) > 0 { - subpackets, err = parseSignatureSubpacket(sig, subpackets, isHashed) - if err != nil { - return - } - } - - if sig.CreationTime.IsZero() { - err = errors.StructuralError("no creation time in signature") - } - - return -} - -type signatureSubpacketType uint8 - -const ( - creationTimeSubpacket signatureSubpacketType = 2 - signatureExpirationSubpacket signatureSubpacketType = 3 - keyExpirationSubpacket signatureSubpacketType = 9 - prefSymmetricAlgosSubpacket signatureSubpacketType = 11 - issuerSubpacket signatureSubpacketType = 16 - prefHashAlgosSubpacket signatureSubpacketType = 21 - prefCompressionSubpacket signatureSubpacketType = 22 - primaryUserIdSubpacket signatureSubpacketType = 25 - keyFlagsSubpacket signatureSubpacketType = 27 - reasonForRevocationSubpacket signatureSubpacketType = 29 - featuresSubpacket signatureSubpacketType = 30 - embeddedSignatureSubpacket signatureSubpacketType = 32 -) - -// parseSignatureSubpacket parses a single subpacket. len(subpacket) is >= 1. -func parseSignatureSubpacket(sig *Signature, subpacket []byte, isHashed bool) (rest []byte, err error) { - // RFC 4880, section 5.2.3.1 - var ( - length uint32 - packetType signatureSubpacketType - isCritical bool - ) - switch { - case subpacket[0] < 192: - length = uint32(subpacket[0]) - subpacket = subpacket[1:] - case subpacket[0] < 255: - if len(subpacket) < 2 { - goto Truncated - } - length = uint32(subpacket[0]-192)<<8 + uint32(subpacket[1]) + 192 - subpacket = subpacket[2:] - default: - if len(subpacket) < 5 { - goto Truncated - } - length = uint32(subpacket[1])<<24 | - uint32(subpacket[2])<<16 | - uint32(subpacket[3])<<8 | - uint32(subpacket[4]) - subpacket = subpacket[5:] - } - if length > uint32(len(subpacket)) { - goto Truncated - } - rest = subpacket[length:] - subpacket = subpacket[:length] - if len(subpacket) == 0 { - err = errors.StructuralError("zero length signature subpacket") - return - } - packetType = signatureSubpacketType(subpacket[0] & 0x7f) - isCritical = subpacket[0]&0x80 == 0x80 - subpacket = subpacket[1:] - sig.rawSubpackets = append(sig.rawSubpackets, outputSubpacket{isHashed, packetType, isCritical, subpacket}) - switch packetType { - case creationTimeSubpacket: - if !isHashed { - err = errors.StructuralError("signature creation time in non-hashed area") - return - } - if len(subpacket) != 4 { - err = errors.StructuralError("signature creation time not four bytes") - return - } - t := binary.BigEndian.Uint32(subpacket) - sig.CreationTime = time.Unix(int64(t), 0) - case signatureExpirationSubpacket: - // Signature expiration time, section 5.2.3.10 - if !isHashed { - return - } - if len(subpacket) != 4 { - err = errors.StructuralError("expiration subpacket with bad length") - return - } - sig.SigLifetimeSecs = new(uint32) - *sig.SigLifetimeSecs = binary.BigEndian.Uint32(subpacket) - case keyExpirationSubpacket: - // Key expiration time, section 5.2.3.6 - if !isHashed { - return - } - if len(subpacket) != 4 { - err = errors.StructuralError("key expiration subpacket with bad length") - return - } - sig.KeyLifetimeSecs = new(uint32) - *sig.KeyLifetimeSecs = binary.BigEndian.Uint32(subpacket) - case prefSymmetricAlgosSubpacket: - // Preferred symmetric algorithms, section 5.2.3.7 - if !isHashed { - return - } - sig.PreferredSymmetric = make([]byte, len(subpacket)) - copy(sig.PreferredSymmetric, subpacket) - case issuerSubpacket: - // Issuer, section 5.2.3.5 - if len(subpacket) != 8 { - err = errors.StructuralError("issuer subpacket with bad length") - return - } - sig.IssuerKeyId = new(uint64) - *sig.IssuerKeyId = binary.BigEndian.Uint64(subpacket) - case prefHashAlgosSubpacket: - // Preferred hash algorithms, section 5.2.3.8 - if !isHashed { - return - } - sig.PreferredHash = make([]byte, len(subpacket)) - copy(sig.PreferredHash, subpacket) - case prefCompressionSubpacket: - // Preferred compression algorithms, section 5.2.3.9 - if !isHashed { - return - } - sig.PreferredCompression = make([]byte, len(subpacket)) - copy(sig.PreferredCompression, subpacket) - case primaryUserIdSubpacket: - // Primary User ID, section 5.2.3.19 - if !isHashed { - return - } - if len(subpacket) != 1 { - err = errors.StructuralError("primary user id subpacket with bad length") - return - } - sig.IsPrimaryId = new(bool) - if subpacket[0] > 0 { - *sig.IsPrimaryId = true - } - case keyFlagsSubpacket: - // Key flags, section 5.2.3.21 - if !isHashed { - return - } - if len(subpacket) == 0 { - err = errors.StructuralError("empty key flags subpacket") - return - } - sig.FlagsValid = true - if subpacket[0]&KeyFlagCertify != 0 { - sig.FlagCertify = true - } - if subpacket[0]&KeyFlagSign != 0 { - sig.FlagSign = true - } - if subpacket[0]&KeyFlagEncryptCommunications != 0 { - sig.FlagEncryptCommunications = true - } - if subpacket[0]&KeyFlagEncryptStorage != 0 { - sig.FlagEncryptStorage = true - } - case reasonForRevocationSubpacket: - // Reason For Revocation, section 5.2.3.23 - if !isHashed { - return - } - if len(subpacket) == 0 { - err = errors.StructuralError("empty revocation reason subpacket") - return - } - sig.RevocationReason = new(uint8) - *sig.RevocationReason = subpacket[0] - sig.RevocationReasonText = string(subpacket[1:]) - case featuresSubpacket: - // Features subpacket, section 5.2.3.24 specifies a very general - // mechanism for OpenPGP implementations to signal support for new - // features. In practice, the subpacket is used exclusively to - // indicate support for MDC-protected encryption. - sig.MDC = len(subpacket) >= 1 && subpacket[0]&1 == 1 - case embeddedSignatureSubpacket: - // Only usage is in signatures that cross-certify - // signing subkeys. section 5.2.3.26 describes the - // format, with its usage described in section 11.1 - if sig.EmbeddedSignature != nil { - err = errors.StructuralError("Cannot have multiple embedded signatures") - return - } - sig.EmbeddedSignature = new(Signature) - // Embedded signatures are required to be v4 signatures see - // section 12.1. However, we only parse v4 signatures in this - // file anyway. - if err := sig.EmbeddedSignature.parse(bytes.NewBuffer(subpacket)); err != nil { - return nil, err - } - if sigType := sig.EmbeddedSignature.SigType; sigType != SigTypePrimaryKeyBinding { - return nil, errors.StructuralError("cross-signature has unexpected type " + strconv.Itoa(int(sigType))) - } - default: - if isCritical { - err = errors.UnsupportedError("unknown critical signature subpacket type " + strconv.Itoa(int(packetType))) - return - } - } - return - -Truncated: - err = errors.StructuralError("signature subpacket truncated") - return -} - -// subpacketLengthLength returns the length, in bytes, of an encoded length value. -func subpacketLengthLength(length int) int { - if length < 192 { - return 1 - } - if length < 16320 { - return 2 - } - return 5 -} - -// serializeSubpacketLength marshals the given length into to. -func serializeSubpacketLength(to []byte, length int) int { - // RFC 4880, Section 4.2.2. - if length < 192 { - to[0] = byte(length) - return 1 - } - if length < 16320 { - length -= 192 - to[0] = byte((length >> 8) + 192) - to[1] = byte(length) - return 2 - } - to[0] = 255 - to[1] = byte(length >> 24) - to[2] = byte(length >> 16) - to[3] = byte(length >> 8) - to[4] = byte(length) - return 5 -} - -// subpacketsLength returns the serialized length, in bytes, of the given -// subpackets. -func subpacketsLength(subpackets []outputSubpacket, hashed bool) (length int) { - for _, subpacket := range subpackets { - if subpacket.hashed == hashed { - length += subpacketLengthLength(len(subpacket.contents) + 1) - length += 1 // type byte - length += len(subpacket.contents) - } - } - return -} - -// serializeSubpackets marshals the given subpackets into to. -func serializeSubpackets(to []byte, subpackets []outputSubpacket, hashed bool) { - for _, subpacket := range subpackets { - if subpacket.hashed == hashed { - n := serializeSubpacketLength(to, len(subpacket.contents)+1) - to[n] = byte(subpacket.subpacketType) - to = to[1+n:] - n = copy(to, subpacket.contents) - to = to[n:] - } - } - return -} - -// KeyExpired returns whether sig is a self-signature of a key that has -// expired. -func (sig *Signature) KeyExpired(currentTime time.Time) bool { - if sig.KeyLifetimeSecs == nil { - return false - } - expiry := sig.CreationTime.Add(time.Duration(*sig.KeyLifetimeSecs) * time.Second) - return currentTime.After(expiry) -} - -// buildHashSuffix constructs the HashSuffix member of sig in preparation for signing. -func (sig *Signature) buildHashSuffix() (err error) { - hashedSubpacketsLen := subpacketsLength(sig.outSubpackets, true) - - var ok bool - l := 6 + hashedSubpacketsLen - sig.HashSuffix = make([]byte, l+6) - sig.HashSuffix[0] = 4 - sig.HashSuffix[1] = uint8(sig.SigType) - sig.HashSuffix[2] = uint8(sig.PubKeyAlgo) - sig.HashSuffix[3], ok = s2k.HashToHashId(sig.Hash) - if !ok { - sig.HashSuffix = nil - return errors.InvalidArgumentError("hash cannot be represented in OpenPGP: " + strconv.Itoa(int(sig.Hash))) - } - sig.HashSuffix[4] = byte(hashedSubpacketsLen >> 8) - sig.HashSuffix[5] = byte(hashedSubpacketsLen) - serializeSubpackets(sig.HashSuffix[6:l], sig.outSubpackets, true) - trailer := sig.HashSuffix[l:] - trailer[0] = 4 - trailer[1] = 0xff - trailer[2] = byte(l >> 24) - trailer[3] = byte(l >> 16) - trailer[4] = byte(l >> 8) - trailer[5] = byte(l) - return -} - -func (sig *Signature) signPrepareHash(h hash.Hash) (digest []byte, err error) { - err = sig.buildHashSuffix() - if err != nil { - return - } - - h.Write(sig.HashSuffix) - digest = h.Sum(nil) - copy(sig.HashTag[:], digest) - return -} - -// Sign signs a message with a private key. The hash, h, must contain -// the hash of the message to be signed and will be mutated by this function. -// On success, the signature is stored in sig. Call Serialize to write it out. -// If config is nil, sensible defaults will be used. -func (sig *Signature) Sign(h hash.Hash, priv *PrivateKey, config *Config) (err error) { - sig.outSubpackets = sig.buildSubpackets() - digest, err := sig.signPrepareHash(h) - if err != nil { - return - } - - switch priv.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - // supports both *rsa.PrivateKey and crypto.Signer - sig.RSASignature.bytes, err = priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, sig.Hash) - sig.RSASignature.bitLength = uint16(8 * len(sig.RSASignature.bytes)) - case PubKeyAlgoDSA: - dsaPriv := priv.PrivateKey.(*dsa.PrivateKey) - - // Need to truncate hashBytes to match FIPS 186-3 section 4.6. - subgroupSize := (dsaPriv.Q.BitLen() + 7) / 8 - if len(digest) > subgroupSize { - digest = digest[:subgroupSize] - } - r, s, err := dsa.Sign(config.Random(), dsaPriv, digest) - if err == nil { - sig.DSASigR.bytes = r.Bytes() - sig.DSASigR.bitLength = uint16(8 * len(sig.DSASigR.bytes)) - sig.DSASigS.bytes = s.Bytes() - sig.DSASigS.bitLength = uint16(8 * len(sig.DSASigS.bytes)) - } - case PubKeyAlgoECDSA: - var r, s *big.Int - if pk, ok := priv.PrivateKey.(*ecdsa.PrivateKey); ok { - // direct support, avoid asn1 wrapping/unwrapping - r, s, err = ecdsa.Sign(config.Random(), pk, digest) - } else { - var b []byte - b, err = priv.PrivateKey.(crypto.Signer).Sign(config.Random(), digest, sig.Hash) - if err == nil { - r, s, err = unwrapECDSASig(b) - } - } - if err == nil { - sig.ECDSASigR = fromBig(r) - sig.ECDSASigS = fromBig(s) - } - default: - err = errors.UnsupportedError("public key algorithm: " + strconv.Itoa(int(sig.PubKeyAlgo))) - } - - return -} - -// unwrapECDSASig parses the two integer components of an ASN.1-encoded ECDSA -// signature. -func unwrapECDSASig(b []byte) (r, s *big.Int, err error) { - var ecsdaSig struct { - R, S *big.Int - } - _, err = asn1.Unmarshal(b, &ecsdaSig) - if err != nil { - return - } - return ecsdaSig.R, ecsdaSig.S, nil -} - -// SignUserId computes a signature from priv, asserting that pub is a valid -// key for the identity id. On success, the signature is stored in sig. Call -// Serialize to write it out. -// If config is nil, sensible defaults will be used. -func (sig *Signature) SignUserId(id string, pub *PublicKey, priv *PrivateKey, config *Config) error { - h, err := userIdSignatureHash(id, pub, sig.Hash) - if err != nil { - return err - } - return sig.Sign(h, priv, config) -} - -// SignKey computes a signature from priv, asserting that pub is a subkey. On -// success, the signature is stored in sig. Call Serialize to write it out. -// If config is nil, sensible defaults will be used. -func (sig *Signature) SignKey(pub *PublicKey, priv *PrivateKey, config *Config) error { - h, err := keySignatureHash(&priv.PublicKey, pub, sig.Hash) - if err != nil { - return err - } - return sig.Sign(h, priv, config) -} - -// Serialize marshals sig to w. Sign, SignUserId or SignKey must have been -// called first. -func (sig *Signature) Serialize(w io.Writer) (err error) { - if len(sig.outSubpackets) == 0 { - sig.outSubpackets = sig.rawSubpackets - } - if sig.RSASignature.bytes == nil && sig.DSASigR.bytes == nil && sig.ECDSASigR.bytes == nil { - return errors.InvalidArgumentError("Signature: need to call Sign, SignUserId or SignKey before Serialize") - } - - sigLength := 0 - switch sig.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - sigLength = 2 + len(sig.RSASignature.bytes) - case PubKeyAlgoDSA: - sigLength = 2 + len(sig.DSASigR.bytes) - sigLength += 2 + len(sig.DSASigS.bytes) - case PubKeyAlgoECDSA: - sigLength = 2 + len(sig.ECDSASigR.bytes) - sigLength += 2 + len(sig.ECDSASigS.bytes) - default: - panic("impossible") - } - - unhashedSubpacketsLen := subpacketsLength(sig.outSubpackets, false) - length := len(sig.HashSuffix) - 6 /* trailer not included */ + - 2 /* length of unhashed subpackets */ + unhashedSubpacketsLen + - 2 /* hash tag */ + sigLength - err = serializeHeader(w, packetTypeSignature, length) - if err != nil { - return - } - - _, err = w.Write(sig.HashSuffix[:len(sig.HashSuffix)-6]) - if err != nil { - return - } - - unhashedSubpackets := make([]byte, 2+unhashedSubpacketsLen) - unhashedSubpackets[0] = byte(unhashedSubpacketsLen >> 8) - unhashedSubpackets[1] = byte(unhashedSubpacketsLen) - serializeSubpackets(unhashedSubpackets[2:], sig.outSubpackets, false) - - _, err = w.Write(unhashedSubpackets) - if err != nil { - return - } - _, err = w.Write(sig.HashTag[:]) - if err != nil { - return - } - - switch sig.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - err = writeMPIs(w, sig.RSASignature) - case PubKeyAlgoDSA: - err = writeMPIs(w, sig.DSASigR, sig.DSASigS) - case PubKeyAlgoECDSA: - err = writeMPIs(w, sig.ECDSASigR, sig.ECDSASigS) - default: - panic("impossible") - } - return -} - -// outputSubpacket represents a subpacket to be marshaled. -type outputSubpacket struct { - hashed bool // true if this subpacket is in the hashed area. - subpacketType signatureSubpacketType - isCritical bool - contents []byte -} - -func (sig *Signature) buildSubpackets() (subpackets []outputSubpacket) { - creationTime := make([]byte, 4) - binary.BigEndian.PutUint32(creationTime, uint32(sig.CreationTime.Unix())) - subpackets = append(subpackets, outputSubpacket{true, creationTimeSubpacket, false, creationTime}) - - if sig.IssuerKeyId != nil { - keyId := make([]byte, 8) - binary.BigEndian.PutUint64(keyId, *sig.IssuerKeyId) - subpackets = append(subpackets, outputSubpacket{true, issuerSubpacket, false, keyId}) - } - - if sig.SigLifetimeSecs != nil && *sig.SigLifetimeSecs != 0 { - sigLifetime := make([]byte, 4) - binary.BigEndian.PutUint32(sigLifetime, *sig.SigLifetimeSecs) - subpackets = append(subpackets, outputSubpacket{true, signatureExpirationSubpacket, true, sigLifetime}) - } - - // Key flags may only appear in self-signatures or certification signatures. - - if sig.FlagsValid { - var flags byte - if sig.FlagCertify { - flags |= KeyFlagCertify - } - if sig.FlagSign { - flags |= KeyFlagSign - } - if sig.FlagEncryptCommunications { - flags |= KeyFlagEncryptCommunications - } - if sig.FlagEncryptStorage { - flags |= KeyFlagEncryptStorage - } - subpackets = append(subpackets, outputSubpacket{true, keyFlagsSubpacket, false, []byte{flags}}) - } - - // The following subpackets may only appear in self-signatures - - if sig.KeyLifetimeSecs != nil && *sig.KeyLifetimeSecs != 0 { - keyLifetime := make([]byte, 4) - binary.BigEndian.PutUint32(keyLifetime, *sig.KeyLifetimeSecs) - subpackets = append(subpackets, outputSubpacket{true, keyExpirationSubpacket, true, keyLifetime}) - } - - if sig.IsPrimaryId != nil && *sig.IsPrimaryId { - subpackets = append(subpackets, outputSubpacket{true, primaryUserIdSubpacket, false, []byte{1}}) - } - - if len(sig.PreferredSymmetric) > 0 { - subpackets = append(subpackets, outputSubpacket{true, prefSymmetricAlgosSubpacket, false, sig.PreferredSymmetric}) - } - - if len(sig.PreferredHash) > 0 { - subpackets = append(subpackets, outputSubpacket{true, prefHashAlgosSubpacket, false, sig.PreferredHash}) - } - - if len(sig.PreferredCompression) > 0 { - subpackets = append(subpackets, outputSubpacket{true, prefCompressionSubpacket, false, sig.PreferredCompression}) - } - - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/signature_v3.go b/vendor/golang.org/x/crypto/openpgp/packet/signature_v3.go deleted file mode 100644 index 6edff889349b..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/signature_v3.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2013 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 packet - -import ( - "crypto" - "encoding/binary" - "fmt" - "io" - "strconv" - "time" - - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/s2k" -) - -// SignatureV3 represents older version 3 signatures. These signatures are less secure -// than version 4 and should not be used to create new signatures. They are included -// here for backwards compatibility to read and validate with older key material. -// See RFC 4880, section 5.2.2. -type SignatureV3 struct { - SigType SignatureType - CreationTime time.Time - IssuerKeyId uint64 - PubKeyAlgo PublicKeyAlgorithm - Hash crypto.Hash - HashTag [2]byte - - RSASignature parsedMPI - DSASigR, DSASigS parsedMPI -} - -func (sig *SignatureV3) parse(r io.Reader) (err error) { - // RFC 4880, section 5.2.2 - var buf [8]byte - if _, err = readFull(r, buf[:1]); err != nil { - return - } - if buf[0] < 2 || buf[0] > 3 { - err = errors.UnsupportedError("signature packet version " + strconv.Itoa(int(buf[0]))) - return - } - if _, err = readFull(r, buf[:1]); err != nil { - return - } - if buf[0] != 5 { - err = errors.UnsupportedError( - "invalid hashed material length " + strconv.Itoa(int(buf[0]))) - return - } - - // Read hashed material: signature type + creation time - if _, err = readFull(r, buf[:5]); err != nil { - return - } - sig.SigType = SignatureType(buf[0]) - t := binary.BigEndian.Uint32(buf[1:5]) - sig.CreationTime = time.Unix(int64(t), 0) - - // Eight-octet Key ID of signer. - if _, err = readFull(r, buf[:8]); err != nil { - return - } - sig.IssuerKeyId = binary.BigEndian.Uint64(buf[:]) - - // Public-key and hash algorithm - if _, err = readFull(r, buf[:2]); err != nil { - return - } - sig.PubKeyAlgo = PublicKeyAlgorithm(buf[0]) - switch sig.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly, PubKeyAlgoDSA: - default: - err = errors.UnsupportedError("public key algorithm " + strconv.Itoa(int(sig.PubKeyAlgo))) - return - } - var ok bool - if sig.Hash, ok = s2k.HashIdToHash(buf[1]); !ok { - return errors.UnsupportedError("hash function " + strconv.Itoa(int(buf[2]))) - } - - // Two-octet field holding left 16 bits of signed hash value. - if _, err = readFull(r, sig.HashTag[:2]); err != nil { - return - } - - switch sig.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - sig.RSASignature.bytes, sig.RSASignature.bitLength, err = readMPI(r) - case PubKeyAlgoDSA: - if sig.DSASigR.bytes, sig.DSASigR.bitLength, err = readMPI(r); err != nil { - return - } - sig.DSASigS.bytes, sig.DSASigS.bitLength, err = readMPI(r) - default: - panic("unreachable") - } - return -} - -// Serialize marshals sig to w. Sign, SignUserId or SignKey must have been -// called first. -func (sig *SignatureV3) Serialize(w io.Writer) (err error) { - buf := make([]byte, 8) - - // Write the sig type and creation time - buf[0] = byte(sig.SigType) - binary.BigEndian.PutUint32(buf[1:5], uint32(sig.CreationTime.Unix())) - if _, err = w.Write(buf[:5]); err != nil { - return - } - - // Write the issuer long key ID - binary.BigEndian.PutUint64(buf[:8], sig.IssuerKeyId) - if _, err = w.Write(buf[:8]); err != nil { - return - } - - // Write public key algorithm, hash ID, and hash value - buf[0] = byte(sig.PubKeyAlgo) - hashId, ok := s2k.HashToHashId(sig.Hash) - if !ok { - return errors.UnsupportedError(fmt.Sprintf("hash function %v", sig.Hash)) - } - buf[1] = hashId - copy(buf[2:4], sig.HashTag[:]) - if _, err = w.Write(buf[:4]); err != nil { - return - } - - if sig.RSASignature.bytes == nil && sig.DSASigR.bytes == nil { - return errors.InvalidArgumentError("Signature: need to call Sign, SignUserId or SignKey before Serialize") - } - - switch sig.PubKeyAlgo { - case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly: - err = writeMPIs(w, sig.RSASignature) - case PubKeyAlgoDSA: - err = writeMPIs(w, sig.DSASigR, sig.DSASigS) - default: - panic("impossible") - } - return -} 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 deleted file mode 100644 index 744c2d2c42dc..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/symmetric_key_encrypted.go +++ /dev/null @@ -1,155 +0,0 @@ -// 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 packet - -import ( - "bytes" - "crypto/cipher" - "io" - "strconv" - - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/s2k" -) - -// This is the largest session key that we'll support. Since no 512-bit cipher -// has even been seriously used, this is comfortably large. -const maxSessionKeySizeInBytes = 64 - -// SymmetricKeyEncrypted represents a passphrase protected session key. See RFC -// 4880, section 5.3. -type SymmetricKeyEncrypted struct { - CipherFunc CipherFunction - s2k func(out, in []byte) - encryptedKey []byte -} - -const symmetricKeyEncryptedVersion = 4 - -func (ske *SymmetricKeyEncrypted) parse(r io.Reader) error { - // RFC 4880, section 5.3. - var buf [2]byte - if _, err := readFull(r, buf[:]); err != nil { - return err - } - if buf[0] != symmetricKeyEncryptedVersion { - return errors.UnsupportedError("SymmetricKeyEncrypted version") - } - ske.CipherFunc = CipherFunction(buf[1]) - - if ske.CipherFunc.KeySize() == 0 { - return errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(buf[1]))) - } - - var err error - ske.s2k, err = s2k.Parse(r) - if err != nil { - return err - } - - encryptedKey := make([]byte, maxSessionKeySizeInBytes) - // The session key may follow. We just have to try and read to find - // out. If it exists then we limit it to maxSessionKeySizeInBytes. - n, err := readFull(r, encryptedKey) - if err != nil && err != io.ErrUnexpectedEOF { - return err - } - - if n != 0 { - if n == maxSessionKeySizeInBytes { - return errors.UnsupportedError("oversized encrypted session key") - } - ske.encryptedKey = encryptedKey[:n] - } - - return nil -} - -// Decrypt attempts to decrypt an encrypted session key and returns the key and -// the cipher to use when decrypting a subsequent Symmetrically Encrypted Data -// packet. -func (ske *SymmetricKeyEncrypted) Decrypt(passphrase []byte) ([]byte, CipherFunction, error) { - key := make([]byte, ske.CipherFunc.KeySize()) - ske.s2k(key, passphrase) - - if len(ske.encryptedKey) == 0 { - return key, ske.CipherFunc, nil - } - - // the IV is all zeros - iv := make([]byte, ske.CipherFunc.blockSize()) - c := cipher.NewCFBDecrypter(ske.CipherFunc.new(key), iv) - plaintextKey := make([]byte, len(ske.encryptedKey)) - c.XORKeyStream(plaintextKey, ske.encryptedKey) - cipherFunc := CipherFunction(plaintextKey[0]) - if cipherFunc.blockSize() == 0 { - return nil, ske.CipherFunc, errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(cipherFunc))) - } - plaintextKey = plaintextKey[1:] - 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 -} - -// SerializeSymmetricKeyEncrypted serializes a symmetric key packet to w. The -// packet contains a random session key, encrypted by a key derived from the -// given passphrase. The session key is returned and must be passed to -// SerializeSymmetricallyEncrypted. -// If config is nil, sensible defaults will be used. -func SerializeSymmetricKeyEncrypted(w io.Writer, passphrase []byte, config *Config) (key []byte, err error) { - cipherFunc := config.Cipher() - keySize := cipherFunc.KeySize() - if keySize == 0 { - return nil, errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(cipherFunc))) - } - - s2kBuf := new(bytes.Buffer) - keyEncryptingKey := make([]byte, keySize) - // s2k.Serialize salts and stretches the passphrase, and writes the - // resulting key to keyEncryptingKey and the s2k descriptor to s2kBuf. - err = s2k.Serialize(s2kBuf, keyEncryptingKey, config.Random(), passphrase, &s2k.Config{Hash: config.Hash(), S2KCount: config.PasswordHashIterations()}) - if err != nil { - return - } - s2kBytes := s2kBuf.Bytes() - - packetLength := 2 /* header */ + len(s2kBytes) + 1 /* cipher type */ + keySize - err = serializeHeader(w, packetTypeSymmetricKeyEncrypted, packetLength) - if err != nil { - return - } - - var buf [2]byte - buf[0] = symmetricKeyEncryptedVersion - buf[1] = byte(cipherFunc) - _, err = w.Write(buf[:]) - if err != nil { - return - } - _, err = w.Write(s2kBytes) - if err != nil { - return - } - - sessionKey := make([]byte, keySize) - _, err = io.ReadFull(config.Random(), sessionKey) - if err != nil { - return - } - iv := make([]byte, cipherFunc.blockSize()) - c := cipher.NewCFBEncrypter(cipherFunc.new(keyEncryptingKey), iv) - encryptedCipherAndKey := make([]byte, keySize+1) - c.XORKeyStream(encryptedCipherAndKey, buf[1:]) - c.XORKeyStream(encryptedCipherAndKey[1:], sessionKey) - _, err = w.Write(encryptedCipherAndKey) - if err != nil { - return - } - - key = sessionKey - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/symmetrically_encrypted.go b/vendor/golang.org/x/crypto/openpgp/packet/symmetrically_encrypted.go deleted file mode 100644 index 6126030eb903..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/symmetrically_encrypted.go +++ /dev/null @@ -1,290 +0,0 @@ -// 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 packet - -import ( - "crypto/cipher" - "crypto/sha1" - "crypto/subtle" - "golang.org/x/crypto/openpgp/errors" - "hash" - "io" - "strconv" -) - -// SymmetricallyEncrypted represents a symmetrically encrypted byte string. The -// encrypted contents will consist of more OpenPGP packets. See RFC 4880, -// sections 5.7 and 5.13. -type SymmetricallyEncrypted struct { - MDC bool // true iff this is a type 18 packet and thus has an embedded MAC. - contents io.Reader - prefix []byte -} - -const symmetricallyEncryptedVersion = 1 - -func (se *SymmetricallyEncrypted) parse(r io.Reader) error { - if se.MDC { - // See RFC 4880, section 5.13. - var buf [1]byte - _, err := readFull(r, buf[:]) - if err != nil { - return err - } - if buf[0] != symmetricallyEncryptedVersion { - return errors.UnsupportedError("unknown SymmetricallyEncrypted version") - } - } - se.contents = r - return nil -} - -// Decrypt returns a ReadCloser, from which the decrypted contents of the -// packet can be read. An incorrect key can, with high probability, be detected -// immediately and this will result in a KeyIncorrect error being returned. -func (se *SymmetricallyEncrypted) Decrypt(c CipherFunction, key []byte) (io.ReadCloser, error) { - keySize := c.KeySize() - if keySize == 0 { - return nil, errors.UnsupportedError("unknown cipher: " + strconv.Itoa(int(c))) - } - if len(key) != keySize { - return nil, errors.InvalidArgumentError("SymmetricallyEncrypted: incorrect key length") - } - - if se.prefix == nil { - se.prefix = make([]byte, c.blockSize()+2) - _, err := readFull(se.contents, se.prefix) - if err != nil { - return nil, err - } - } else if len(se.prefix) != c.blockSize()+2 { - return nil, errors.InvalidArgumentError("can't try ciphers with different block lengths") - } - - ocfbResync := OCFBResync - if se.MDC { - // MDC packets use a different form of OCFB mode. - ocfbResync = OCFBNoResync - } - - s := NewOCFBDecrypter(c.new(key), se.prefix, ocfbResync) - if s == nil { - return nil, errors.ErrKeyIncorrect - } - - plaintext := cipher.StreamReader{S: s, R: se.contents} - - if se.MDC { - // MDC packets have an embedded hash that we need to check. - h := sha1.New() - h.Write(se.prefix) - return &seMDCReader{in: plaintext, h: h}, nil - } - - // Otherwise, we just need to wrap plaintext so that it's a valid ReadCloser. - return seReader{plaintext}, nil -} - -// seReader wraps an io.Reader with a no-op Close method. -type seReader struct { - in io.Reader -} - -func (ser seReader) Read(buf []byte) (int, error) { - return ser.in.Read(buf) -} - -func (ser seReader) Close() error { - return nil -} - -const mdcTrailerSize = 1 /* tag byte */ + 1 /* length byte */ + sha1.Size - -// An seMDCReader wraps an io.Reader, maintains a running hash and keeps hold -// of the most recent 22 bytes (mdcTrailerSize). Upon EOF, those bytes form an -// MDC packet containing a hash of the previous contents which is checked -// against the running hash. See RFC 4880, section 5.13. -type seMDCReader struct { - in io.Reader - h hash.Hash - trailer [mdcTrailerSize]byte - scratch [mdcTrailerSize]byte - trailerUsed int - error bool - eof bool -} - -func (ser *seMDCReader) Read(buf []byte) (n int, err error) { - if ser.error { - err = io.ErrUnexpectedEOF - return - } - if ser.eof { - err = io.EOF - return - } - - // If we haven't yet filled the trailer buffer then we must do that - // first. - for ser.trailerUsed < mdcTrailerSize { - n, err = ser.in.Read(ser.trailer[ser.trailerUsed:]) - ser.trailerUsed += n - if err == io.EOF { - if ser.trailerUsed != mdcTrailerSize { - n = 0 - err = io.ErrUnexpectedEOF - ser.error = true - return - } - ser.eof = true - n = 0 - return - } - - if err != nil { - n = 0 - return - } - } - - // If it's a short read then we read into a temporary buffer and shift - // the data into the caller's buffer. - if len(buf) <= mdcTrailerSize { - n, err = readFull(ser.in, ser.scratch[:len(buf)]) - copy(buf, ser.trailer[:n]) - ser.h.Write(buf[:n]) - copy(ser.trailer[:], ser.trailer[n:]) - copy(ser.trailer[mdcTrailerSize-n:], ser.scratch[:]) - if n < len(buf) { - ser.eof = true - err = io.EOF - } - return - } - - n, err = ser.in.Read(buf[mdcTrailerSize:]) - copy(buf, ser.trailer[:]) - ser.h.Write(buf[:n]) - copy(ser.trailer[:], buf[n:]) - - if err == io.EOF { - ser.eof = true - } - return -} - -// This is a new-format packet tag byte for a type 19 (MDC) packet. -const mdcPacketTagByte = byte(0x80) | 0x40 | 19 - -func (ser *seMDCReader) Close() error { - if ser.error { - return errors.SignatureError("error during reading") - } - - for !ser.eof { - // We haven't seen EOF so we need to read to the end - var buf [1024]byte - _, err := ser.Read(buf[:]) - if err == io.EOF { - break - } - if err != nil { - return errors.SignatureError("error during reading") - } - } - - if ser.trailer[0] != mdcPacketTagByte || ser.trailer[1] != sha1.Size { - return errors.SignatureError("MDC packet not found") - } - ser.h.Write(ser.trailer[:2]) - - final := ser.h.Sum(nil) - if subtle.ConstantTimeCompare(final, ser.trailer[2:]) != 1 { - return errors.SignatureError("hash mismatch") - } - return nil -} - -// An seMDCWriter writes through to an io.WriteCloser while maintains a running -// hash of the data written. On close, it emits an MDC packet containing the -// running hash. -type seMDCWriter struct { - w io.WriteCloser - h hash.Hash -} - -func (w *seMDCWriter) Write(buf []byte) (n int, err error) { - w.h.Write(buf) - return w.w.Write(buf) -} - -func (w *seMDCWriter) Close() (err error) { - var buf [mdcTrailerSize]byte - - buf[0] = mdcPacketTagByte - buf[1] = sha1.Size - w.h.Write(buf[:2]) - digest := w.h.Sum(nil) - copy(buf[2:], digest) - - _, err = w.w.Write(buf[:]) - if err != nil { - return - } - return w.w.Close() -} - -// noOpCloser is like an ioutil.NopCloser, but for an io.Writer. -type noOpCloser struct { - w io.Writer -} - -func (c noOpCloser) Write(data []byte) (n int, err error) { - return c.w.Write(data) -} - -func (c noOpCloser) Close() error { - return nil -} - -// SerializeSymmetricallyEncrypted serializes a symmetrically encrypted packet -// to w and returns a WriteCloser to which the to-be-encrypted packets can be -// written. -// If config is nil, sensible defaults will be used. -func SerializeSymmetricallyEncrypted(w io.Writer, c CipherFunction, key []byte, config *Config) (contents io.WriteCloser, err error) { - if c.KeySize() != len(key) { - return nil, errors.InvalidArgumentError("SymmetricallyEncrypted.Serialize: bad key length") - } - writeCloser := noOpCloser{w} - ciphertext, err := serializeStreamHeader(writeCloser, packetTypeSymmetricallyEncryptedMDC) - if err != nil { - return - } - - _, err = ciphertext.Write([]byte{symmetricallyEncryptedVersion}) - if err != nil { - return - } - - block := c.new(key) - blockSize := block.BlockSize() - iv := make([]byte, blockSize) - _, err = config.Random().Read(iv) - if err != nil { - return - } - s, prefix := NewOCFBEncrypter(block, iv, OCFBNoResync) - _, err = ciphertext.Write(prefix) - if err != nil { - return - } - plaintext := cipher.StreamWriter{S: s, W: ciphertext} - - h := sha1.New() - h.Write(iv) - h.Write(iv[blockSize-2:]) - contents = &seMDCWriter{w: plaintext, h: h} - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/userattribute.go b/vendor/golang.org/x/crypto/openpgp/packet/userattribute.go deleted file mode 100644 index d19ffbc78671..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/userattribute.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2013 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 packet - -import ( - "bytes" - "image" - "image/jpeg" - "io" - "io/ioutil" -) - -const UserAttrImageSubpacket = 1 - -// UserAttribute is capable of storing other types of data about a user -// beyond name, email and a text comment. In practice, user attributes are typically used -// to store a signed thumbnail photo JPEG image of the user. -// See RFC 4880, section 5.12. -type UserAttribute struct { - Contents []*OpaqueSubpacket -} - -// NewUserAttributePhoto creates a user attribute packet -// containing the given images. -func NewUserAttributePhoto(photos ...image.Image) (uat *UserAttribute, err error) { - uat = new(UserAttribute) - for _, photo := range photos { - var buf bytes.Buffer - // RFC 4880, Section 5.12.1. - data := []byte{ - 0x10, 0x00, // Little-endian image header length (16 bytes) - 0x01, // Image header version 1 - 0x01, // JPEG - 0, 0, 0, 0, // 12 reserved octets, must be all zero. - 0, 0, 0, 0, - 0, 0, 0, 0} - if _, err = buf.Write(data); err != nil { - return - } - if err = jpeg.Encode(&buf, photo, nil); err != nil { - return - } - uat.Contents = append(uat.Contents, &OpaqueSubpacket{ - SubType: UserAttrImageSubpacket, - Contents: buf.Bytes()}) - } - return -} - -// NewUserAttribute creates a new user attribute packet containing the given subpackets. -func NewUserAttribute(contents ...*OpaqueSubpacket) *UserAttribute { - return &UserAttribute{Contents: contents} -} - -func (uat *UserAttribute) parse(r io.Reader) (err error) { - // RFC 4880, section 5.13 - b, err := ioutil.ReadAll(r) - if err != nil { - return - } - uat.Contents, err = OpaqueSubpackets(b) - return -} - -// Serialize marshals the user attribute to w in the form of an OpenPGP packet, including -// header. -func (uat *UserAttribute) Serialize(w io.Writer) (err error) { - var buf bytes.Buffer - for _, sp := range uat.Contents { - sp.Serialize(&buf) - } - if err = serializeHeader(w, packetTypeUserAttribute, buf.Len()); err != nil { - return err - } - _, err = w.Write(buf.Bytes()) - return -} - -// ImageData returns zero or more byte slices, each containing -// JPEG File Interchange Format (JFIF), for each photo in the -// user attribute packet. -func (uat *UserAttribute) ImageData() (imageData [][]byte) { - for _, sp := range uat.Contents { - if sp.SubType == UserAttrImageSubpacket && len(sp.Contents) > 16 { - imageData = append(imageData, sp.Contents[16:]) - } - } - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/packet/userid.go b/vendor/golang.org/x/crypto/openpgp/packet/userid.go deleted file mode 100644 index d6bea7d4acc0..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/packet/userid.go +++ /dev/null @@ -1,160 +0,0 @@ -// 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 packet - -import ( - "io" - "io/ioutil" - "strings" -) - -// UserId contains text that is intended to represent the name and email -// address of the key holder. See RFC 4880, section 5.11. By convention, this -// takes the form "Full Name (Comment) " -type UserId struct { - Id string // By convention, this takes the form "Full Name (Comment) " which is split out in the fields below. - - Name, Comment, Email string -} - -func hasInvalidCharacters(s string) bool { - for _, c := range s { - switch c { - case '(', ')', '<', '>', 0: - return true - } - } - return false -} - -// NewUserId returns a UserId or nil if any of the arguments contain invalid -// characters. The invalid characters are '\x00', '(', ')', '<' and '>' -func NewUserId(name, comment, email string) *UserId { - // RFC 4880 doesn't deal with the structure of userid strings; the - // name, comment and email form is just a convention. However, there's - // no convention about escaping the metacharacters and GPG just refuses - // to create user ids where, say, the name contains a '('. We mirror - // this behaviour. - - if hasInvalidCharacters(name) || hasInvalidCharacters(comment) || hasInvalidCharacters(email) { - return nil - } - - uid := new(UserId) - uid.Name, uid.Comment, uid.Email = name, comment, email - uid.Id = name - if len(comment) > 0 { - if len(uid.Id) > 0 { - uid.Id += " " - } - uid.Id += "(" - uid.Id += comment - uid.Id += ")" - } - if len(email) > 0 { - if len(uid.Id) > 0 { - uid.Id += " " - } - uid.Id += "<" - uid.Id += email - uid.Id += ">" - } - return uid -} - -func (uid *UserId) parse(r io.Reader) (err error) { - // RFC 4880, section 5.11 - b, err := ioutil.ReadAll(r) - if err != nil { - return - } - uid.Id = string(b) - uid.Name, uid.Comment, uid.Email = parseUserId(uid.Id) - return -} - -// Serialize marshals uid to w in the form of an OpenPGP packet, including -// header. -func (uid *UserId) Serialize(w io.Writer) error { - err := serializeHeader(w, packetTypeUserId, len(uid.Id)) - if err != nil { - return err - } - _, err = w.Write([]byte(uid.Id)) - return err -} - -// parseUserId extracts the name, comment and email from a user id string that -// is formatted as "Full Name (Comment) ". -func parseUserId(id string) (name, comment, email string) { - var n, c, e struct { - start, end int - } - var state int - - for offset, rune := range id { - switch state { - case 0: - // Entering name - n.start = offset - state = 1 - fallthrough - case 1: - // In name - if rune == '(' { - state = 2 - n.end = offset - } else if rune == '<' { - state = 5 - n.end = offset - } - case 2: - // Entering comment - c.start = offset - state = 3 - fallthrough - case 3: - // In comment - if rune == ')' { - state = 4 - c.end = offset - } - case 4: - // Between comment and email - if rune == '<' { - state = 5 - } - case 5: - // Entering email - e.start = offset - state = 6 - fallthrough - case 6: - // In email - if rune == '>' { - state = 7 - e.end = offset - } - default: - // After email - } - } - switch state { - case 1: - // ended in the name - n.end = len(id) - case 3: - // ended in comment - c.end = len(id) - case 6: - // ended in email - e.end = len(id) - } - - name = strings.TrimSpace(id[n.start:n.end]) - comment = strings.TrimSpace(id[c.start:c.end]) - email = strings.TrimSpace(id[e.start:e.end]) - return -} diff --git a/vendor/golang.org/x/crypto/openpgp/read.go b/vendor/golang.org/x/crypto/openpgp/read.go deleted file mode 100644 index 6ec664f44a17..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/read.go +++ /dev/null @@ -1,442 +0,0 @@ -// 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 openpgp implements high level operations on OpenPGP messages. -package openpgp // import "golang.org/x/crypto/openpgp" - -import ( - "crypto" - _ "crypto/sha256" - "hash" - "io" - "strconv" - - "golang.org/x/crypto/openpgp/armor" - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/packet" -) - -// SignatureType is the armor type for a PGP signature. -var SignatureType = "PGP SIGNATURE" - -// readArmored reads an armored block with the given type. -func readArmored(r io.Reader, expectedType string) (body io.Reader, err error) { - block, err := armor.Decode(r) - if err != nil { - return - } - - if block.Type != expectedType { - return nil, errors.InvalidArgumentError("expected '" + expectedType + "', got: " + block.Type) - } - - return block.Body, nil -} - -// MessageDetails contains the result of parsing an OpenPGP encrypted and/or -// signed message. -type MessageDetails struct { - IsEncrypted bool // true if the message was encrypted. - EncryptedToKeyIds []uint64 // the list of recipient key ids. - IsSymmetricallyEncrypted bool // true if a passphrase could have decrypted the message. - DecryptedWith Key // the private key used to decrypt the message, if any. - IsSigned bool // true if the message is signed. - SignedByKeyId uint64 // the key id of the signer, if any. - SignedBy *Key // the key of the signer, if available. - LiteralData *packet.LiteralData // the metadata of the contents - UnverifiedBody io.Reader // the contents of the message. - - // If IsSigned is true and SignedBy is non-zero then the signature will - // be verified as UnverifiedBody is read. The signature cannot be - // checked until the whole of UnverifiedBody is read so UnverifiedBody - // must be consumed until EOF before the data can be trusted. Even if a - // message isn't signed (or the signer is unknown) the data may contain - // an authentication code that is only checked once UnverifiedBody has - // been consumed. Once EOF has been seen, the following fields are - // valid. (An authentication code failure is reported as a - // SignatureError error when reading from UnverifiedBody.) - SignatureError error // nil if the signature is good. - Signature *packet.Signature // the signature packet itself, if v4 (default) - SignatureV3 *packet.SignatureV3 // the signature packet if it is a v2 or v3 signature - - decrypted io.ReadCloser -} - -// A PromptFunction is used as a callback by functions that may need to decrypt -// a private key, or prompt for a passphrase. It is called with a list of -// acceptable, encrypted private keys and a boolean that indicates whether a -// passphrase is usable. It should either decrypt a private key or return a -// passphrase to try. If the decrypted private key or given passphrase isn't -// correct, the function will be called again, forever. Any error returned will -// be passed up. -type PromptFunction func(keys []Key, symmetric bool) ([]byte, error) - -// A keyEnvelopePair is used to store a private key with the envelope that -// contains a symmetric key, encrypted with that key. -type keyEnvelopePair struct { - key Key - encryptedKey *packet.EncryptedKey -} - -// ReadMessage parses an OpenPGP message that may be signed and/or encrypted. -// The given KeyRing should contain both public keys (for signature -// verification) and, possibly encrypted, private keys for decrypting. -// If config is nil, sensible defaults will be used. -func ReadMessage(r io.Reader, keyring KeyRing, prompt PromptFunction, config *packet.Config) (md *MessageDetails, err error) { - var p packet.Packet - - var symKeys []*packet.SymmetricKeyEncrypted - var pubKeys []keyEnvelopePair - var se *packet.SymmetricallyEncrypted - - packets := packet.NewReader(r) - md = new(MessageDetails) - md.IsEncrypted = true - - // The message, if encrypted, starts with a number of packets - // containing an encrypted decryption key. The decryption key is either - // encrypted to a public key, or with a passphrase. This loop - // collects these packets. -ParsePackets: - for { - p, err = packets.Next() - if err != nil { - return nil, err - } - switch p := p.(type) { - case *packet.SymmetricKeyEncrypted: - // This packet contains the decryption key encrypted with a passphrase. - md.IsSymmetricallyEncrypted = true - symKeys = append(symKeys, p) - case *packet.EncryptedKey: - // This packet contains the decryption key encrypted to a public key. - md.EncryptedToKeyIds = append(md.EncryptedToKeyIds, p.KeyId) - switch p.Algo { - case packet.PubKeyAlgoRSA, packet.PubKeyAlgoRSAEncryptOnly, packet.PubKeyAlgoElGamal: - break - default: - continue - } - var keys []Key - if p.KeyId == 0 { - keys = keyring.DecryptionKeys() - } else { - keys = keyring.KeysById(p.KeyId) - } - for _, k := range keys { - pubKeys = append(pubKeys, keyEnvelopePair{k, p}) - } - case *packet.SymmetricallyEncrypted: - se = p - break ParsePackets - case *packet.Compressed, *packet.LiteralData, *packet.OnePassSignature: - // This message isn't encrypted. - if len(symKeys) != 0 || len(pubKeys) != 0 { - return nil, errors.StructuralError("key material not followed by encrypted message") - } - packets.Unread(p) - return readSignedMessage(packets, nil, keyring) - } - } - - var candidates []Key - var decrypted io.ReadCloser - - // Now that we have the list of encrypted keys we need to decrypt at - // least one of them or, if we cannot, we need to call the prompt - // function so that it can decrypt a key or give us a passphrase. -FindKey: - for { - // See if any of the keys already have a private key available - candidates = candidates[:0] - candidateFingerprints := make(map[string]bool) - - for _, pk := range pubKeys { - if pk.key.PrivateKey == nil { - continue - } - if !pk.key.PrivateKey.Encrypted { - if len(pk.encryptedKey.Key) == 0 { - pk.encryptedKey.Decrypt(pk.key.PrivateKey, config) - } - if len(pk.encryptedKey.Key) == 0 { - continue - } - decrypted, err = se.Decrypt(pk.encryptedKey.CipherFunc, pk.encryptedKey.Key) - if err != nil && err != errors.ErrKeyIncorrect { - return nil, err - } - if decrypted != nil { - md.DecryptedWith = pk.key - break FindKey - } - } else { - fpr := string(pk.key.PublicKey.Fingerprint[:]) - if v := candidateFingerprints[fpr]; v { - continue - } - candidates = append(candidates, pk.key) - candidateFingerprints[fpr] = true - } - } - - if len(candidates) == 0 && len(symKeys) == 0 { - return nil, errors.ErrKeyIncorrect - } - - if prompt == nil { - return nil, errors.ErrKeyIncorrect - } - - passphrase, err := prompt(candidates, len(symKeys) != 0) - if err != nil { - return nil, err - } - - // Try the symmetric passphrase first - if len(symKeys) != 0 && passphrase != nil { - for _, s := range symKeys { - key, cipherFunc, err := s.Decrypt(passphrase) - if err == nil { - decrypted, err = se.Decrypt(cipherFunc, key) - if err != nil && err != errors.ErrKeyIncorrect { - return nil, err - } - if decrypted != nil { - break FindKey - } - } - - } - } - } - - md.decrypted = decrypted - if err := packets.Push(decrypted); err != nil { - return nil, err - } - return readSignedMessage(packets, md, keyring) -} - -// readSignedMessage reads a possibly signed message if mdin is non-zero then -// that structure is updated and returned. Otherwise a fresh MessageDetails is -// used. -func readSignedMessage(packets *packet.Reader, mdin *MessageDetails, keyring KeyRing) (md *MessageDetails, err error) { - if mdin == nil { - mdin = new(MessageDetails) - } - md = mdin - - var p packet.Packet - var h hash.Hash - var wrappedHash hash.Hash -FindLiteralData: - for { - p, err = packets.Next() - if err != nil { - return nil, err - } - switch p := p.(type) { - case *packet.Compressed: - if err := packets.Push(p.Body); err != nil { - return nil, err - } - case *packet.OnePassSignature: - if !p.IsLast { - return nil, errors.UnsupportedError("nested signatures") - } - - h, wrappedHash, err = hashForSignature(p.Hash, p.SigType) - if err != nil { - md = nil - return - } - - md.IsSigned = true - md.SignedByKeyId = p.KeyId - keys := keyring.KeysByIdUsage(p.KeyId, packet.KeyFlagSign) - if len(keys) > 0 { - md.SignedBy = &keys[0] - } - case *packet.LiteralData: - md.LiteralData = p - break FindLiteralData - } - } - - if md.SignedBy != nil { - md.UnverifiedBody = &signatureCheckReader{packets, h, wrappedHash, md} - } else if md.decrypted != nil { - md.UnverifiedBody = checkReader{md} - } else { - md.UnverifiedBody = md.LiteralData.Body - } - - return md, nil -} - -// hashForSignature returns a pair of hashes that can be used to verify a -// signature. The signature may specify that the contents of the signed message -// should be preprocessed (i.e. to normalize line endings). Thus this function -// returns two hashes. The second should be used to hash the message itself and -// performs any needed preprocessing. -func hashForSignature(hashId crypto.Hash, sigType packet.SignatureType) (hash.Hash, hash.Hash, error) { - if !hashId.Available() { - return nil, nil, errors.UnsupportedError("hash not available: " + strconv.Itoa(int(hashId))) - } - h := hashId.New() - - switch sigType { - case packet.SigTypeBinary: - return h, h, nil - case packet.SigTypeText: - return h, NewCanonicalTextHash(h), nil - } - - return nil, nil, errors.UnsupportedError("unsupported signature type: " + strconv.Itoa(int(sigType))) -} - -// checkReader wraps an io.Reader from a LiteralData packet. When it sees EOF -// it closes the ReadCloser from any SymmetricallyEncrypted packet to trigger -// MDC checks. -type checkReader struct { - md *MessageDetails -} - -func (cr checkReader) Read(buf []byte) (n int, err error) { - n, err = cr.md.LiteralData.Body.Read(buf) - if err == io.EOF { - mdcErr := cr.md.decrypted.Close() - if mdcErr != nil { - err = mdcErr - } - } - return -} - -// signatureCheckReader wraps an io.Reader from a LiteralData packet and hashes -// the data as it is read. When it sees an EOF from the underlying io.Reader -// it parses and checks a trailing Signature packet and triggers any MDC checks. -type signatureCheckReader struct { - packets *packet.Reader - h, wrappedHash hash.Hash - md *MessageDetails -} - -func (scr *signatureCheckReader) Read(buf []byte) (n int, err error) { - n, err = scr.md.LiteralData.Body.Read(buf) - scr.wrappedHash.Write(buf[:n]) - if err == io.EOF { - var p packet.Packet - p, scr.md.SignatureError = scr.packets.Next() - if scr.md.SignatureError != nil { - return - } - - var ok bool - if scr.md.Signature, ok = p.(*packet.Signature); ok { - scr.md.SignatureError = scr.md.SignedBy.PublicKey.VerifySignature(scr.h, scr.md.Signature) - } else if scr.md.SignatureV3, ok = p.(*packet.SignatureV3); ok { - scr.md.SignatureError = scr.md.SignedBy.PublicKey.VerifySignatureV3(scr.h, scr.md.SignatureV3) - } else { - scr.md.SignatureError = errors.StructuralError("LiteralData not followed by Signature") - return - } - - // The SymmetricallyEncrypted packet, if any, might have an - // unsigned hash of its own. In order to check this we need to - // close that Reader. - if scr.md.decrypted != nil { - mdcErr := scr.md.decrypted.Close() - if mdcErr != nil { - err = mdcErr - } - } - } - return -} - -// CheckDetachedSignature takes a signed file and a detached signature and -// returns the signer if the signature is valid. If the signer isn't known, -// ErrUnknownIssuer is returned. -func CheckDetachedSignature(keyring KeyRing, signed, signature io.Reader) (signer *Entity, err error) { - var issuerKeyId uint64 - var hashFunc crypto.Hash - var sigType packet.SignatureType - var keys []Key - var p packet.Packet - - packets := packet.NewReader(signature) - for { - p, err = packets.Next() - if err == io.EOF { - return nil, errors.ErrUnknownIssuer - } - if err != nil { - return nil, err - } - - switch sig := p.(type) { - case *packet.Signature: - if sig.IssuerKeyId == nil { - return nil, errors.StructuralError("signature doesn't have an issuer") - } - issuerKeyId = *sig.IssuerKeyId - hashFunc = sig.Hash - sigType = sig.SigType - case *packet.SignatureV3: - issuerKeyId = sig.IssuerKeyId - hashFunc = sig.Hash - sigType = sig.SigType - default: - return nil, errors.StructuralError("non signature packet found") - } - - keys = keyring.KeysByIdUsage(issuerKeyId, packet.KeyFlagSign) - if len(keys) > 0 { - break - } - } - - if len(keys) == 0 { - panic("unreachable") - } - - h, wrappedHash, err := hashForSignature(hashFunc, sigType) - if err != nil { - return nil, err - } - - if _, err := io.Copy(wrappedHash, signed); err != nil && err != io.EOF { - return nil, err - } - - for _, key := range keys { - switch sig := p.(type) { - case *packet.Signature: - err = key.PublicKey.VerifySignature(h, sig) - case *packet.SignatureV3: - err = key.PublicKey.VerifySignatureV3(h, sig) - default: - panic("unreachable") - } - - if err == nil { - return key.Entity, nil - } - } - - return nil, err -} - -// CheckArmoredDetachedSignature performs the same actions as -// CheckDetachedSignature but expects the signature to be armored. -func CheckArmoredDetachedSignature(keyring KeyRing, signed, signature io.Reader) (signer *Entity, err error) { - body, err := readArmored(signature, SignatureType) - if err != nil { - return - } - - return CheckDetachedSignature(keyring, signed, body) -} diff --git a/vendor/golang.org/x/crypto/openpgp/s2k/s2k.go b/vendor/golang.org/x/crypto/openpgp/s2k/s2k.go deleted file mode 100644 index 4b9a44ca26d6..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/s2k/s2k.go +++ /dev/null @@ -1,273 +0,0 @@ -// 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 s2k implements the various OpenPGP string-to-key transforms as -// specified in RFC 4800 section 3.7.1. -package s2k // import "golang.org/x/crypto/openpgp/s2k" - -import ( - "crypto" - "hash" - "io" - "strconv" - - "golang.org/x/crypto/openpgp/errors" -) - -// Config collects configuration parameters for s2k key-stretching -// transformatioms. A nil *Config is valid and results in all default -// values. Currently, Config is used only by the Serialize function in -// this package. -type Config struct { - // Hash is the default hash function to be used. If - // nil, SHA1 is used. - Hash crypto.Hash - // S2KCount is only used for symmetric encryption. It - // determines the strength of the passphrase stretching when - // the said passphrase is hashed to produce a key. S2KCount - // should be between 1024 and 65011712, inclusive. If Config - // is nil or S2KCount is 0, the value 65536 used. Not all - // values in the above range can be represented. S2KCount will - // be rounded up to the next representable value if it cannot - // be encoded exactly. When set, it is strongly encrouraged to - // use a value that is at least 65536. See RFC 4880 Section - // 3.7.1.3. - S2KCount int -} - -func (c *Config) hash() crypto.Hash { - if c == nil || uint(c.Hash) == 0 { - // SHA1 is the historical default in this package. - return crypto.SHA1 - } - - return c.Hash -} - -func (c *Config) encodedCount() uint8 { - if c == nil || c.S2KCount == 0 { - return 96 // The common case. Correspoding to 65536 - } - - i := c.S2KCount - switch { - // Behave like GPG. Should we make 65536 the lowest value used? - case i < 1024: - i = 1024 - case i > 65011712: - i = 65011712 - } - - return encodeCount(i) -} - -// encodeCount converts an iterative "count" in the range 1024 to -// 65011712, inclusive, to an encoded count. The return value is the -// octet that is actually stored in the GPG file. encodeCount panics -// if i is not in the above range (encodedCount above takes care to -// pass i in the correct range). See RFC 4880 Section 3.7.7.1. -func encodeCount(i int) uint8 { - if i < 1024 || i > 65011712 { - panic("count arg i outside the required range") - } - - for encoded := 0; encoded < 256; encoded++ { - count := decodeCount(uint8(encoded)) - if count >= i { - return uint8(encoded) - } - } - - return 255 -} - -// decodeCount returns the s2k mode 3 iterative "count" corresponding to -// the encoded octet c. -func decodeCount(c uint8) int { - return (16 + int(c&15)) << (uint32(c>>4) + 6) -} - -// Simple writes to out the result of computing the Simple S2K function (RFC -// 4880, section 3.7.1.1) using the given hash and input passphrase. -func Simple(out []byte, h hash.Hash, in []byte) { - Salted(out, h, in, nil) -} - -var zero [1]byte - -// Salted writes to out the result of computing the Salted S2K function (RFC -// 4880, section 3.7.1.2) using the given hash, input passphrase and salt. -func Salted(out []byte, h hash.Hash, in []byte, salt []byte) { - done := 0 - var digest []byte - - for i := 0; done < len(out); i++ { - h.Reset() - for j := 0; j < i; j++ { - h.Write(zero[:]) - } - h.Write(salt) - h.Write(in) - digest = h.Sum(digest[:0]) - n := copy(out[done:], digest) - done += n - } -} - -// Iterated writes to out the result of computing the Iterated and Salted S2K -// function (RFC 4880, section 3.7.1.3) using the given hash, input passphrase, -// salt and iteration count. -func Iterated(out []byte, h hash.Hash, in []byte, salt []byte, count int) { - combined := make([]byte, len(in)+len(salt)) - copy(combined, salt) - copy(combined[len(salt):], in) - - if count < len(combined) { - count = len(combined) - } - - done := 0 - var digest []byte - for i := 0; done < len(out); i++ { - h.Reset() - for j := 0; j < i; j++ { - h.Write(zero[:]) - } - written := 0 - for written < count { - if written+len(combined) > count { - todo := count - written - h.Write(combined[:todo]) - written = count - } else { - h.Write(combined) - written += len(combined) - } - } - digest = h.Sum(digest[:0]) - n := copy(out[done:], digest) - done += n - } -} - -// Parse reads a binary specification for a string-to-key transformation from r -// and returns a function which performs that transform. -func Parse(r io.Reader) (f func(out, in []byte), err error) { - var buf [9]byte - - _, err = io.ReadFull(r, buf[:2]) - if err != nil { - return - } - - hash, ok := HashIdToHash(buf[1]) - if !ok { - return nil, errors.UnsupportedError("hash for S2K function: " + strconv.Itoa(int(buf[1]))) - } - if !hash.Available() { - return nil, errors.UnsupportedError("hash not available: " + strconv.Itoa(int(hash))) - } - h := hash.New() - - switch buf[0] { - case 0: - f := func(out, in []byte) { - Simple(out, h, in) - } - return f, nil - case 1: - _, err = io.ReadFull(r, buf[:8]) - if err != nil { - return - } - f := func(out, in []byte) { - Salted(out, h, in, buf[:8]) - } - return f, nil - case 3: - _, err = io.ReadFull(r, buf[:9]) - if err != nil { - return - } - count := decodeCount(buf[8]) - f := func(out, in []byte) { - Iterated(out, h, in, buf[:8], count) - } - return f, nil - } - - return nil, errors.UnsupportedError("S2K function") -} - -// Serialize salts and stretches the given passphrase and writes the -// resulting key into key. It also serializes an S2K descriptor to -// w. The key stretching can be configured with c, which may be -// nil. In that case, sensible defaults will be used. -func Serialize(w io.Writer, key []byte, rand io.Reader, passphrase []byte, c *Config) error { - var buf [11]byte - buf[0] = 3 /* iterated and salted */ - buf[1], _ = HashToHashId(c.hash()) - salt := buf[2:10] - if _, err := io.ReadFull(rand, salt); err != nil { - return err - } - encodedCount := c.encodedCount() - count := decodeCount(encodedCount) - buf[10] = encodedCount - if _, err := w.Write(buf[:]); err != nil { - return err - } - - Iterated(key, c.hash().New(), passphrase, salt, count) - return nil -} - -// hashToHashIdMapping contains pairs relating OpenPGP's hash identifier with -// Go's crypto.Hash type. See RFC 4880, section 9.4. -var hashToHashIdMapping = []struct { - id byte - hash crypto.Hash - name string -}{ - {1, crypto.MD5, "MD5"}, - {2, crypto.SHA1, "SHA1"}, - {3, crypto.RIPEMD160, "RIPEMD160"}, - {8, crypto.SHA256, "SHA256"}, - {9, crypto.SHA384, "SHA384"}, - {10, crypto.SHA512, "SHA512"}, - {11, crypto.SHA224, "SHA224"}, -} - -// HashIdToHash returns a crypto.Hash which corresponds to the given OpenPGP -// hash id. -func HashIdToHash(id byte) (h crypto.Hash, ok bool) { - for _, m := range hashToHashIdMapping { - if m.id == id { - return m.hash, true - } - } - return 0, false -} - -// HashIdToString returns the name of the hash function corresponding to the -// given OpenPGP hash id. -func HashIdToString(id byte) (name string, ok bool) { - for _, m := range hashToHashIdMapping { - if m.id == id { - return m.name, true - } - } - - return "", false -} - -// HashIdToHash returns an OpenPGP hash id which corresponds the given Hash. -func HashToHashId(h crypto.Hash) (id byte, ok bool) { - for _, m := range hashToHashIdMapping { - if m.hash == h { - return m.id, true - } - } - return 0, false -} diff --git a/vendor/golang.org/x/crypto/openpgp/write.go b/vendor/golang.org/x/crypto/openpgp/write.go deleted file mode 100644 index 4ee71784ebe0..000000000000 --- a/vendor/golang.org/x/crypto/openpgp/write.go +++ /dev/null @@ -1,418 +0,0 @@ -// 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 openpgp - -import ( - "crypto" - "hash" - "io" - "strconv" - "time" - - "golang.org/x/crypto/openpgp/armor" - "golang.org/x/crypto/openpgp/errors" - "golang.org/x/crypto/openpgp/packet" - "golang.org/x/crypto/openpgp/s2k" -) - -// DetachSign signs message with the private key from signer (which must -// already have been decrypted) and writes the signature to w. -// If config is nil, sensible defaults will be used. -func DetachSign(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error { - return detachSign(w, signer, message, packet.SigTypeBinary, config) -} - -// ArmoredDetachSign signs message with the private key from signer (which -// must already have been decrypted) and writes an armored signature to w. -// If config is nil, sensible defaults will be used. -func ArmoredDetachSign(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) (err error) { - return armoredDetachSign(w, signer, message, packet.SigTypeBinary, config) -} - -// DetachSignText signs message (after canonicalising the line endings) with -// the private key from signer (which must already have been decrypted) and -// writes the signature to w. -// If config is nil, sensible defaults will be used. -func DetachSignText(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error { - return detachSign(w, signer, message, packet.SigTypeText, config) -} - -// ArmoredDetachSignText signs message (after canonicalising the line endings) -// with the private key from signer (which must already have been decrypted) -// and writes an armored signature to w. -// If config is nil, sensible defaults will be used. -func ArmoredDetachSignText(w io.Writer, signer *Entity, message io.Reader, config *packet.Config) error { - return armoredDetachSign(w, signer, message, packet.SigTypeText, config) -} - -func armoredDetachSign(w io.Writer, signer *Entity, message io.Reader, sigType packet.SignatureType, config *packet.Config) (err error) { - out, err := armor.Encode(w, SignatureType, nil) - if err != nil { - return - } - err = detachSign(out, signer, message, sigType, config) - if err != nil { - return - } - return out.Close() -} - -func detachSign(w io.Writer, signer *Entity, message io.Reader, sigType packet.SignatureType, config *packet.Config) (err error) { - if signer.PrivateKey == nil { - return errors.InvalidArgumentError("signing key doesn't have a private key") - } - if signer.PrivateKey.Encrypted { - return errors.InvalidArgumentError("signing key is encrypted") - } - - sig := new(packet.Signature) - sig.SigType = sigType - sig.PubKeyAlgo = signer.PrivateKey.PubKeyAlgo - sig.Hash = config.Hash() - sig.CreationTime = config.Now() - sig.IssuerKeyId = &signer.PrivateKey.KeyId - - h, wrappedHash, err := hashForSignature(sig.Hash, sig.SigType) - if err != nil { - return - } - io.Copy(wrappedHash, message) - - err = sig.Sign(h, signer.PrivateKey, config) - if err != nil { - return - } - - return sig.Serialize(w) -} - -// FileHints contains metadata about encrypted files. This metadata is, itself, -// encrypted. -type FileHints struct { - // IsBinary can be set to hint that the contents are binary data. - IsBinary bool - // FileName hints at the name of the file that should be written. It's - // truncated to 255 bytes if longer. It may be empty to suggest that the - // file should not be written to disk. It may be equal to "_CONSOLE" to - // suggest the data should not be written to disk. - FileName string - // ModTime contains the modification time of the file, or the zero time if not applicable. - ModTime time.Time -} - -// SymmetricallyEncrypt acts like gpg -c: it encrypts a file with a passphrase. -// The resulting WriteCloser must be closed after the contents of the file have -// been written. -// If config is nil, sensible defaults will be used. -func SymmetricallyEncrypt(ciphertext io.Writer, passphrase []byte, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { - if hints == nil { - hints = &FileHints{} - } - - key, err := packet.SerializeSymmetricKeyEncrypted(ciphertext, passphrase, config) - if err != nil { - return - } - w, err := packet.SerializeSymmetricallyEncrypted(ciphertext, config.Cipher(), key, config) - if err != nil { - return - } - - literaldata := w - if algo := config.Compression(); algo != packet.CompressionNone { - var compConfig *packet.CompressionConfig - if config != nil { - compConfig = config.CompressionConfig - } - literaldata, err = packet.SerializeCompressed(w, algo, compConfig) - if err != nil { - return - } - } - - var epochSeconds uint32 - if !hints.ModTime.IsZero() { - epochSeconds = uint32(hints.ModTime.Unix()) - } - return packet.SerializeLiteral(literaldata, hints.IsBinary, hints.FileName, epochSeconds) -} - -// intersectPreferences mutates and returns a prefix of a that contains only -// the values in the intersection of a and b. The order of a is preserved. -func intersectPreferences(a []uint8, b []uint8) (intersection []uint8) { - var j int - for _, v := range a { - for _, v2 := range b { - if v == v2 { - a[j] = v - j++ - break - } - } - } - - return a[:j] -} - -func hashToHashId(h crypto.Hash) uint8 { - v, ok := s2k.HashToHashId(h) - if !ok { - panic("tried to convert unknown hash") - } - return v -} - -// writeAndSign writes the data as a payload package and, optionally, signs -// it. hints contains optional information, that is also encrypted, -// that aids the recipients in processing the message. The resulting -// WriteCloser must be closed after the contents of the file have been -// written. If config is nil, sensible defaults will be used. -func writeAndSign(payload io.WriteCloser, candidateHashes []uint8, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { - var signer *packet.PrivateKey - if signed != nil { - signKey, ok := signed.signingKey(config.Now()) - if !ok { - return nil, errors.InvalidArgumentError("no valid signing keys") - } - signer = signKey.PrivateKey - if signer == nil { - return nil, errors.InvalidArgumentError("no private key in signing key") - } - if signer.Encrypted { - return nil, errors.InvalidArgumentError("signing key must be decrypted") - } - } - - var hash crypto.Hash - for _, hashId := range candidateHashes { - if h, ok := s2k.HashIdToHash(hashId); ok && h.Available() { - hash = h - break - } - } - - // If the hash specified by config is a candidate, we'll use that. - if configuredHash := config.Hash(); configuredHash.Available() { - for _, hashId := range candidateHashes { - if h, ok := s2k.HashIdToHash(hashId); ok && h == configuredHash { - hash = h - break - } - } - } - - if hash == 0 { - hashId := candidateHashes[0] - name, ok := s2k.HashIdToString(hashId) - if !ok { - name = "#" + strconv.Itoa(int(hashId)) - } - return nil, errors.InvalidArgumentError("cannot encrypt because no candidate hash functions are compiled in. (Wanted " + name + " in this case.)") - } - - if signer != nil { - ops := &packet.OnePassSignature{ - SigType: packet.SigTypeBinary, - Hash: hash, - PubKeyAlgo: signer.PubKeyAlgo, - KeyId: signer.KeyId, - IsLast: true, - } - if err := ops.Serialize(payload); err != nil { - return nil, err - } - } - - if hints == nil { - hints = &FileHints{} - } - - w := payload - if signer != nil { - // If we need to write a signature packet after the literal - // data then we need to stop literalData from closing - // encryptedData. - w = noOpCloser{w} - - } - var epochSeconds uint32 - if !hints.ModTime.IsZero() { - epochSeconds = uint32(hints.ModTime.Unix()) - } - literalData, err := packet.SerializeLiteral(w, hints.IsBinary, hints.FileName, epochSeconds) - if err != nil { - return nil, err - } - - if signer != nil { - return signatureWriter{payload, literalData, hash, hash.New(), signer, config}, nil - } - return literalData, nil -} - -// Encrypt encrypts a message to a number of recipients and, optionally, signs -// it. hints contains optional information, that is also encrypted, that aids -// the recipients in processing the message. The resulting WriteCloser must -// be closed after the contents of the file have been written. -// If config is nil, sensible defaults will be used. -func Encrypt(ciphertext io.Writer, to []*Entity, signed *Entity, hints *FileHints, config *packet.Config) (plaintext io.WriteCloser, err error) { - if len(to) == 0 { - return nil, errors.InvalidArgumentError("no encryption recipient provided") - } - - // These are the possible ciphers that we'll use for the message. - candidateCiphers := []uint8{ - uint8(packet.CipherAES128), - uint8(packet.CipherAES256), - uint8(packet.CipherCAST5), - } - // These are the possible hash functions that we'll use for the signature. - candidateHashes := []uint8{ - hashToHashId(crypto.SHA256), - hashToHashId(crypto.SHA384), - hashToHashId(crypto.SHA512), - hashToHashId(crypto.SHA1), - hashToHashId(crypto.RIPEMD160), - } - // In the event that a recipient doesn't specify any supported ciphers - // or hash functions, these are the ones that we assume that every - // implementation supports. - defaultCiphers := candidateCiphers[len(candidateCiphers)-1:] - defaultHashes := candidateHashes[len(candidateHashes)-1:] - - encryptKeys := make([]Key, len(to)) - for i := range to { - var ok bool - encryptKeys[i], ok = to[i].encryptionKey(config.Now()) - if !ok { - return nil, errors.InvalidArgumentError("cannot encrypt a message to key id " + strconv.FormatUint(to[i].PrimaryKey.KeyId, 16) + " because it has no encryption keys") - } - - sig := to[i].primaryIdentity().SelfSignature - - preferredSymmetric := sig.PreferredSymmetric - if len(preferredSymmetric) == 0 { - preferredSymmetric = defaultCiphers - } - preferredHashes := sig.PreferredHash - if len(preferredHashes) == 0 { - preferredHashes = defaultHashes - } - candidateCiphers = intersectPreferences(candidateCiphers, preferredSymmetric) - candidateHashes = intersectPreferences(candidateHashes, preferredHashes) - } - - if len(candidateCiphers) == 0 || len(candidateHashes) == 0 { - return nil, errors.InvalidArgumentError("cannot encrypt because recipient set shares no common algorithms") - } - - cipher := packet.CipherFunction(candidateCiphers[0]) - // If the cipher specified by config is a candidate, we'll use that. - configuredCipher := config.Cipher() - for _, c := range candidateCiphers { - cipherFunc := packet.CipherFunction(c) - if cipherFunc == configuredCipher { - cipher = cipherFunc - break - } - } - - symKey := make([]byte, cipher.KeySize()) - if _, err := io.ReadFull(config.Random(), symKey); err != nil { - return nil, err - } - - for _, key := range encryptKeys { - if err := packet.SerializeEncryptedKey(ciphertext, key.PublicKey, cipher, symKey, config); err != nil { - return nil, err - } - } - - payload, err := packet.SerializeSymmetricallyEncrypted(ciphertext, cipher, symKey, config) - if err != nil { - return - } - - return writeAndSign(payload, candidateHashes, signed, hints, config) -} - -// Sign signs a message. The resulting WriteCloser must be closed after the -// contents of the file have been written. hints contains optional information -// that aids the recipients in processing the message. -// If config is nil, sensible defaults will be used. -func Sign(output io.Writer, signed *Entity, hints *FileHints, config *packet.Config) (input io.WriteCloser, err error) { - if signed == nil { - return nil, errors.InvalidArgumentError("no signer provided") - } - - // These are the possible hash functions that we'll use for the signature. - candidateHashes := []uint8{ - hashToHashId(crypto.SHA256), - hashToHashId(crypto.SHA384), - hashToHashId(crypto.SHA512), - hashToHashId(crypto.SHA1), - hashToHashId(crypto.RIPEMD160), - } - defaultHashes := candidateHashes[len(candidateHashes)-1:] - preferredHashes := signed.primaryIdentity().SelfSignature.PreferredHash - if len(preferredHashes) == 0 { - preferredHashes = defaultHashes - } - candidateHashes = intersectPreferences(candidateHashes, preferredHashes) - return writeAndSign(noOpCloser{output}, candidateHashes, signed, hints, config) -} - -// signatureWriter hashes the contents of a message while passing it along to -// literalData. When closed, it closes literalData, writes a signature packet -// to encryptedData and then also closes encryptedData. -type signatureWriter struct { - encryptedData io.WriteCloser - literalData io.WriteCloser - hashType crypto.Hash - h hash.Hash - signer *packet.PrivateKey - config *packet.Config -} - -func (s signatureWriter) Write(data []byte) (int, error) { - s.h.Write(data) - return s.literalData.Write(data) -} - -func (s signatureWriter) Close() error { - sig := &packet.Signature{ - SigType: packet.SigTypeBinary, - PubKeyAlgo: s.signer.PubKeyAlgo, - Hash: s.hashType, - CreationTime: s.config.Now(), - IssuerKeyId: &s.signer.KeyId, - } - - if err := sig.Sign(s.h, s.signer, s.config); err != nil { - return err - } - if err := s.literalData.Close(); err != nil { - return err - } - if err := sig.Serialize(s.encryptedData); err != nil { - return err - } - return s.encryptedData.Close() -} - -// noOpCloser is like an ioutil.NopCloser, but for an io.Writer. -// TODO: we have two of these in OpenPGP packages alone. This probably needs -// to be promoted somewhere more common. -type noOpCloser struct { - w io.Writer -} - -func (c noOpCloser) Write(data []byte) (n int, err error) { - return c.w.Write(data) -} - -func (c noOpCloser) Close() error { - return nil -} diff --git a/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go b/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go deleted file mode 100644 index 593f6530084f..000000000000 --- a/vendor/golang.org/x/crypto/pbkdf2/pbkdf2.go +++ /dev/null @@ -1,77 +0,0 @@ -// 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 pbkdf2 implements the key derivation function PBKDF2 as defined in RFC -2898 / PKCS #5 v2.0. - -A key derivation function is useful when encrypting data based on a password -or any other not-fully-random data. It uses a pseudorandom function to derive -a secure encryption key based on the password. - -While v2.0 of the standard defines only one pseudorandom function to use, -HMAC-SHA1, the drafted v2.1 specification allows use of all five FIPS Approved -Hash Functions SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512 for HMAC. To -choose, you can pass the `New` functions from the different SHA packages to -pbkdf2.Key. -*/ -package pbkdf2 // import "golang.org/x/crypto/pbkdf2" - -import ( - "crypto/hmac" - "hash" -) - -// Key derives a key from the password, salt and iteration count, returning a -// []byte of length keylen that can be used as cryptographic key. The key is -// derived based on the method described as PBKDF2 with the HMAC variant using -// the supplied hash function. -// -// For example, to use a HMAC-SHA-1 based PBKDF2 key derivation function, you -// can get a derived key for e.g. AES-256 (which needs a 32-byte key) by -// doing: -// -// dk := pbkdf2.Key([]byte("some password"), salt, 4096, 32, sha1.New) -// -// Remember to get a good random salt. At least 8 bytes is recommended by the -// RFC. -// -// Using a higher iteration count will increase the cost of an exhaustive -// search but will also make derivation proportionally slower. -func Key(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { - prf := hmac.New(h, password) - hashLen := prf.Size() - numBlocks := (keyLen + hashLen - 1) / hashLen - - var buf [4]byte - dk := make([]byte, 0, numBlocks*hashLen) - U := make([]byte, hashLen) - for block := 1; block <= numBlocks; block++ { - // N.B.: || means concatenation, ^ means XOR - // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter - // U_1 = PRF(password, salt || uint(i)) - prf.Reset() - prf.Write(salt) - buf[0] = byte(block >> 24) - buf[1] = byte(block >> 16) - buf[2] = byte(block >> 8) - buf[3] = byte(block) - prf.Write(buf[:4]) - dk = prf.Sum(dk) - T := dk[len(dk)-hashLen:] - copy(U, T) - - // U_n = PRF(password, U_(n-1)) - for n := 2; n <= iter; n++ { - prf.Reset() - prf.Write(U) - U = U[:0] - U = prf.Sum(U) - for x := range U { - T[x] ^= U[x] - } - } - } - return dk[:keyLen] -} diff --git a/vendor/golang.org/x/crypto/poly1305/poly1305.go b/vendor/golang.org/x/crypto/poly1305/poly1305.go deleted file mode 100644 index f562fa5712ba..000000000000 --- a/vendor/golang.org/x/crypto/poly1305/poly1305.go +++ /dev/null @@ -1,33 +0,0 @@ -// 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 poly1305 implements Poly1305 one-time message authentication code as -specified in https://cr.yp.to/mac/poly1305-20050329.pdf. - -Poly1305 is a fast, one-time authentication function. It is infeasible for an -attacker to generate an authenticator for a message without the key. However, a -key must only be used for a single message. Authenticating two different -messages with the same key allows an attacker to forge authenticators for other -messages with the same key. - -Poly1305 was originally coupled with AES in order to make Poly1305-AES. AES was -used with a fixed key in order to generate one-time keys from an nonce. -However, in this package AES isn't used and the one-time key is specified -directly. -*/ -package poly1305 // import "golang.org/x/crypto/poly1305" - -import "crypto/subtle" - -// TagSize is the size, in bytes, of a poly1305 authenticator. -const TagSize = 16 - -// Verify returns true if mac is a valid authenticator for m with the given -// key. -func Verify(mac *[16]byte, m []byte, key *[32]byte) bool { - var tmp [16]byte - Sum(&tmp, m, key) - return subtle.ConstantTimeCompare(tmp[:], mac[:]) == 1 -} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_amd64.go b/vendor/golang.org/x/crypto/poly1305/sum_amd64.go deleted file mode 100644 index 4dd72fe799b2..000000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_amd64.go +++ /dev/null @@ -1,22 +0,0 @@ -// 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 amd64,!gccgo,!appengine - -package poly1305 - -// This function is implemented in sum_amd64.s -//go:noescape -func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]byte) - -// Sum generates an authenticator for m using a one-time key and puts the -// 16-byte result into out. Authenticating two different messages with the same -// key allows an attacker to forge messages at will. -func Sum(out *[16]byte, m []byte, key *[32]byte) { - var mPtr *byte - if len(m) > 0 { - mPtr = &m[0] - } - poly1305(out, mPtr, uint64(len(m)), key) -} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_amd64.s b/vendor/golang.org/x/crypto/poly1305/sum_amd64.s deleted file mode 100644 index 2edae63828a5..000000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_amd64.s +++ /dev/null @@ -1,125 +0,0 @@ -// 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 amd64,!gccgo,!appengine - -#include "textflag.h" - -#define POLY1305_ADD(msg, h0, h1, h2) \ - ADDQ 0(msg), h0; \ - ADCQ 8(msg), h1; \ - ADCQ $1, h2; \ - LEAQ 16(msg), msg - -#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3) \ - MOVQ r0, AX; \ - MULQ h0; \ - MOVQ AX, t0; \ - MOVQ DX, t1; \ - MOVQ r0, AX; \ - MULQ h1; \ - ADDQ AX, t1; \ - ADCQ $0, DX; \ - MOVQ r0, t2; \ - IMULQ h2, t2; \ - ADDQ DX, t2; \ - \ - MOVQ r1, AX; \ - MULQ h0; \ - ADDQ AX, t1; \ - ADCQ $0, DX; \ - MOVQ DX, h0; \ - MOVQ r1, t3; \ - IMULQ h2, t3; \ - MOVQ r1, AX; \ - MULQ h1; \ - ADDQ AX, t2; \ - ADCQ DX, t3; \ - ADDQ h0, t2; \ - ADCQ $0, t3; \ - \ - MOVQ t0, h0; \ - MOVQ t1, h1; \ - MOVQ t2, h2; \ - ANDQ $3, h2; \ - MOVQ t2, t0; \ - ANDQ $0xFFFFFFFFFFFFFFFC, t0; \ - ADDQ t0, h0; \ - ADCQ t3, h1; \ - ADCQ $0, h2; \ - SHRQ $2, t3, t2; \ - SHRQ $2, t3; \ - ADDQ t2, h0; \ - ADCQ t3, h1; \ - ADCQ $0, h2 - -DATA ·poly1305Mask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF -DATA ·poly1305Mask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC -GLOBL ·poly1305Mask<>(SB), RODATA, $16 - -// func poly1305(out *[16]byte, m *byte, mlen uint64, key *[32]key) -TEXT ·poly1305(SB), $0-32 - MOVQ out+0(FP), DI - MOVQ m+8(FP), SI - MOVQ mlen+16(FP), R15 - MOVQ key+24(FP), AX - - MOVQ 0(AX), R11 - MOVQ 8(AX), R12 - ANDQ ·poly1305Mask<>(SB), R11 // r0 - ANDQ ·poly1305Mask<>+8(SB), R12 // r1 - XORQ R8, R8 // h0 - XORQ R9, R9 // h1 - XORQ R10, R10 // h2 - - CMPQ R15, $16 - JB bytes_between_0_and_15 - -loop: - POLY1305_ADD(SI, R8, R9, R10) - -multiply: - POLY1305_MUL(R8, R9, R10, R11, R12, BX, CX, R13, R14) - SUBQ $16, R15 - CMPQ R15, $16 - JAE loop - -bytes_between_0_and_15: - TESTQ R15, R15 - JZ done - MOVQ $1, BX - XORQ CX, CX - XORQ R13, R13 - ADDQ R15, SI - -flush_buffer: - SHLQ $8, BX, CX - SHLQ $8, BX - MOVB -1(SI), R13 - XORQ R13, BX - DECQ SI - DECQ R15 - JNZ flush_buffer - - ADDQ BX, R8 - ADCQ CX, R9 - ADCQ $0, R10 - MOVQ $16, R15 - JMP multiply - -done: - MOVQ R8, AX - MOVQ R9, BX - SUBQ $0xFFFFFFFFFFFFFFFB, AX - SBBQ $0xFFFFFFFFFFFFFFFF, BX - SBBQ $3, R10 - CMOVQCS R8, AX - CMOVQCS R9, BX - MOVQ key+24(FP), R8 - ADDQ 16(R8), AX - ADCQ 24(R8), BX - - MOVQ AX, 0(DI) - MOVQ BX, 8(DI) - RET diff --git a/vendor/golang.org/x/crypto/poly1305/sum_arm.go b/vendor/golang.org/x/crypto/poly1305/sum_arm.go deleted file mode 100644 index 5dc321c2f39e..000000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_arm.go +++ /dev/null @@ -1,22 +0,0 @@ -// 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. - -// +build arm,!gccgo,!appengine,!nacl - -package poly1305 - -// This function is implemented in sum_arm.s -//go:noescape -func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]byte) - -// Sum generates an authenticator for m using a one-time key and puts the -// 16-byte result into out. Authenticating two different messages with the same -// key allows an attacker to forge messages at will. -func Sum(out *[16]byte, m []byte, key *[32]byte) { - var mPtr *byte - if len(m) > 0 { - mPtr = &m[0] - } - poly1305_auth_armv6(out, mPtr, uint32(len(m)), key) -} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_arm.s b/vendor/golang.org/x/crypto/poly1305/sum_arm.s deleted file mode 100644 index f70b4ac48451..000000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_arm.s +++ /dev/null @@ -1,427 +0,0 @@ -// 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. - -// +build arm,!gccgo,!appengine,!nacl - -#include "textflag.h" - -// This code was translated into a form compatible with 5a from the public -// domain source by Andrew Moon: github.com/floodyberry/poly1305-opt/blob/master/app/extensions/poly1305. - -DATA ·poly1305_init_constants_armv6<>+0x00(SB)/4, $0x3ffffff -DATA ·poly1305_init_constants_armv6<>+0x04(SB)/4, $0x3ffff03 -DATA ·poly1305_init_constants_armv6<>+0x08(SB)/4, $0x3ffc0ff -DATA ·poly1305_init_constants_armv6<>+0x0c(SB)/4, $0x3f03fff -DATA ·poly1305_init_constants_armv6<>+0x10(SB)/4, $0x00fffff -GLOBL ·poly1305_init_constants_armv6<>(SB), 8, $20 - -// Warning: the linker may use R11 to synthesize certain instructions. Please -// take care and verify that no synthetic instructions use it. - -TEXT poly1305_init_ext_armv6<>(SB), NOSPLIT, $0 - // Needs 16 bytes of stack and 64 bytes of space pointed to by R0. (It - // might look like it's only 60 bytes of space but the final four bytes - // will be written by another function.) We need to skip over four - // bytes of stack because that's saving the value of 'g'. - ADD $4, R13, R8 - MOVM.IB [R4-R7], (R8) - MOVM.IA.W (R1), [R2-R5] - MOVW $·poly1305_init_constants_armv6<>(SB), R7 - MOVW R2, R8 - MOVW R2>>26, R9 - MOVW R3>>20, g - MOVW R4>>14, R11 - MOVW R5>>8, R12 - ORR R3<<6, R9, R9 - ORR R4<<12, g, g - ORR R5<<18, R11, R11 - MOVM.IA (R7), [R2-R6] - AND R8, R2, R2 - AND R9, R3, R3 - AND g, R4, R4 - AND R11, R5, R5 - AND R12, R6, R6 - MOVM.IA.W [R2-R6], (R0) - EOR R2, R2, R2 - EOR R3, R3, R3 - EOR R4, R4, R4 - EOR R5, R5, R5 - EOR R6, R6, R6 - MOVM.IA.W [R2-R6], (R0) - MOVM.IA.W (R1), [R2-R5] - MOVM.IA [R2-R6], (R0) - ADD $20, R13, R0 - MOVM.DA (R0), [R4-R7] - RET - -#define MOVW_UNALIGNED(Rsrc, Rdst, Rtmp, offset) \ - MOVBU (offset+0)(Rsrc), Rtmp; \ - MOVBU Rtmp, (offset+0)(Rdst); \ - MOVBU (offset+1)(Rsrc), Rtmp; \ - MOVBU Rtmp, (offset+1)(Rdst); \ - MOVBU (offset+2)(Rsrc), Rtmp; \ - MOVBU Rtmp, (offset+2)(Rdst); \ - MOVBU (offset+3)(Rsrc), Rtmp; \ - MOVBU Rtmp, (offset+3)(Rdst) - -TEXT poly1305_blocks_armv6<>(SB), NOSPLIT, $0 - // Needs 24 bytes of stack for saved registers and then 88 bytes of - // scratch space after that. We assume that 24 bytes at (R13) have - // already been used: four bytes for the link register saved in the - // prelude of poly1305_auth_armv6, four bytes for saving the value of g - // in that function and 16 bytes of scratch space used around - // poly1305_finish_ext_armv6_skip1. - ADD $24, R13, R12 - MOVM.IB [R4-R8, R14], (R12) - MOVW R0, 88(R13) - MOVW R1, 92(R13) - MOVW R2, 96(R13) - MOVW R1, R14 - MOVW R2, R12 - MOVW 56(R0), R8 - WORD $0xe1180008 // TST R8, R8 not working see issue 5921 - EOR R6, R6, R6 - MOVW.EQ $(1<<24), R6 - MOVW R6, 84(R13) - ADD $116, R13, g - MOVM.IA (R0), [R0-R9] - MOVM.IA [R0-R4], (g) - CMP $16, R12 - BLO poly1305_blocks_armv6_done - -poly1305_blocks_armv6_mainloop: - WORD $0xe31e0003 // TST R14, #3 not working see issue 5921 - BEQ poly1305_blocks_armv6_mainloop_aligned - ADD $100, R13, g - MOVW_UNALIGNED(R14, g, R0, 0) - MOVW_UNALIGNED(R14, g, R0, 4) - MOVW_UNALIGNED(R14, g, R0, 8) - MOVW_UNALIGNED(R14, g, R0, 12) - MOVM.IA (g), [R0-R3] - ADD $16, R14 - B poly1305_blocks_armv6_mainloop_loaded - -poly1305_blocks_armv6_mainloop_aligned: - MOVM.IA.W (R14), [R0-R3] - -poly1305_blocks_armv6_mainloop_loaded: - MOVW R0>>26, g - MOVW R1>>20, R11 - MOVW R2>>14, R12 - MOVW R14, 92(R13) - MOVW R3>>8, R4 - ORR R1<<6, g, g - ORR R2<<12, R11, R11 - ORR R3<<18, R12, R12 - BIC $0xfc000000, R0, R0 - BIC $0xfc000000, g, g - MOVW 84(R13), R3 - BIC $0xfc000000, R11, R11 - BIC $0xfc000000, R12, R12 - ADD R0, R5, R5 - ADD g, R6, R6 - ORR R3, R4, R4 - ADD R11, R7, R7 - ADD $116, R13, R14 - ADD R12, R8, R8 - ADD R4, R9, R9 - MOVM.IA (R14), [R0-R4] - MULLU R4, R5, (R11, g) - MULLU R3, R5, (R14, R12) - MULALU R3, R6, (R11, g) - MULALU R2, R6, (R14, R12) - MULALU R2, R7, (R11, g) - MULALU R1, R7, (R14, R12) - ADD R4<<2, R4, R4 - ADD R3<<2, R3, R3 - MULALU R1, R8, (R11, g) - MULALU R0, R8, (R14, R12) - MULALU R0, R9, (R11, g) - MULALU R4, R9, (R14, R12) - MOVW g, 76(R13) - MOVW R11, 80(R13) - MOVW R12, 68(R13) - MOVW R14, 72(R13) - MULLU R2, R5, (R11, g) - MULLU R1, R5, (R14, R12) - MULALU R1, R6, (R11, g) - MULALU R0, R6, (R14, R12) - MULALU R0, R7, (R11, g) - MULALU R4, R7, (R14, R12) - ADD R2<<2, R2, R2 - ADD R1<<2, R1, R1 - MULALU R4, R8, (R11, g) - MULALU R3, R8, (R14, R12) - MULALU R3, R9, (R11, g) - MULALU R2, R9, (R14, R12) - MOVW g, 60(R13) - MOVW R11, 64(R13) - MOVW R12, 52(R13) - MOVW R14, 56(R13) - MULLU R0, R5, (R11, g) - MULALU R4, R6, (R11, g) - MULALU R3, R7, (R11, g) - MULALU R2, R8, (R11, g) - MULALU R1, R9, (R11, g) - ADD $52, R13, R0 - MOVM.IA (R0), [R0-R7] - MOVW g>>26, R12 - MOVW R4>>26, R14 - ORR R11<<6, R12, R12 - ORR R5<<6, R14, R14 - BIC $0xfc000000, g, g - BIC $0xfc000000, R4, R4 - ADD.S R12, R0, R0 - ADC $0, R1, R1 - ADD.S R14, R6, R6 - ADC $0, R7, R7 - MOVW R0>>26, R12 - MOVW R6>>26, R14 - ORR R1<<6, R12, R12 - ORR R7<<6, R14, R14 - BIC $0xfc000000, R0, R0 - BIC $0xfc000000, R6, R6 - ADD R14<<2, R14, R14 - ADD.S R12, R2, R2 - ADC $0, R3, R3 - ADD R14, g, g - MOVW R2>>26, R12 - MOVW g>>26, R14 - ORR R3<<6, R12, R12 - BIC $0xfc000000, g, R5 - BIC $0xfc000000, R2, R7 - ADD R12, R4, R4 - ADD R14, R0, R0 - MOVW R4>>26, R12 - BIC $0xfc000000, R4, R8 - ADD R12, R6, R9 - MOVW 96(R13), R12 - MOVW 92(R13), R14 - MOVW R0, R6 - CMP $32, R12 - SUB $16, R12, R12 - MOVW R12, 96(R13) - BHS poly1305_blocks_armv6_mainloop - -poly1305_blocks_armv6_done: - MOVW 88(R13), R12 - MOVW R5, 20(R12) - MOVW R6, 24(R12) - MOVW R7, 28(R12) - MOVW R8, 32(R12) - MOVW R9, 36(R12) - ADD $48, R13, R0 - MOVM.DA (R0), [R4-R8, R14] - RET - -#define MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) \ - MOVBU.P 1(Rsrc), Rtmp; \ - MOVBU.P Rtmp, 1(Rdst); \ - MOVBU.P 1(Rsrc), Rtmp; \ - MOVBU.P Rtmp, 1(Rdst) - -#define MOVWP_UNALIGNED(Rsrc, Rdst, Rtmp) \ - MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp); \ - MOVHUP_UNALIGNED(Rsrc, Rdst, Rtmp) - -// func poly1305_auth_armv6(out *[16]byte, m *byte, mlen uint32, key *[32]key) -TEXT ·poly1305_auth_armv6(SB), $196-16 - // The value 196, just above, is the sum of 64 (the size of the context - // structure) and 132 (the amount of stack needed). - // - // At this point, the stack pointer (R13) has been moved down. It - // points to the saved link register and there's 196 bytes of free - // space above it. - // - // The stack for this function looks like: - // - // +--------------------- - // | - // | 64 bytes of context structure - // | - // +--------------------- - // | - // | 112 bytes for poly1305_blocks_armv6 - // | - // +--------------------- - // | 16 bytes of final block, constructed at - // | poly1305_finish_ext_armv6_skip8 - // +--------------------- - // | four bytes of saved 'g' - // +--------------------- - // | lr, saved by prelude <- R13 points here - // +--------------------- - MOVW g, 4(R13) - - MOVW out+0(FP), R4 - MOVW m+4(FP), R5 - MOVW mlen+8(FP), R6 - MOVW key+12(FP), R7 - - ADD $136, R13, R0 // 136 = 4 + 4 + 16 + 112 - MOVW R7, R1 - - // poly1305_init_ext_armv6 will write to the stack from R13+4, but - // that's ok because none of the other values have been written yet. - BL poly1305_init_ext_armv6<>(SB) - BIC.S $15, R6, R2 - BEQ poly1305_auth_armv6_noblocks - ADD $136, R13, R0 - MOVW R5, R1 - ADD R2, R5, R5 - SUB R2, R6, R6 - BL poly1305_blocks_armv6<>(SB) - -poly1305_auth_armv6_noblocks: - ADD $136, R13, R0 - MOVW R5, R1 - MOVW R6, R2 - MOVW R4, R3 - - MOVW R0, R5 - MOVW R1, R6 - MOVW R2, R7 - MOVW R3, R8 - AND.S R2, R2, R2 - BEQ poly1305_finish_ext_armv6_noremaining - EOR R0, R0 - ADD $8, R13, R9 // 8 = offset to 16 byte scratch space - MOVW R0, (R9) - MOVW R0, 4(R9) - MOVW R0, 8(R9) - MOVW R0, 12(R9) - WORD $0xe3110003 // TST R1, #3 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_aligned - WORD $0xe3120008 // TST R2, #8 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip8 - MOVWP_UNALIGNED(R1, R9, g) - MOVWP_UNALIGNED(R1, R9, g) - -poly1305_finish_ext_armv6_skip8: - WORD $0xe3120004 // TST $4, R2 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip4 - MOVWP_UNALIGNED(R1, R9, g) - -poly1305_finish_ext_armv6_skip4: - WORD $0xe3120002 // TST $2, R2 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip2 - MOVHUP_UNALIGNED(R1, R9, g) - B poly1305_finish_ext_armv6_skip2 - -poly1305_finish_ext_armv6_aligned: - WORD $0xe3120008 // TST R2, #8 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip8_aligned - MOVM.IA.W (R1), [g-R11] - MOVM.IA.W [g-R11], (R9) - -poly1305_finish_ext_armv6_skip8_aligned: - WORD $0xe3120004 // TST $4, R2 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip4_aligned - MOVW.P 4(R1), g - MOVW.P g, 4(R9) - -poly1305_finish_ext_armv6_skip4_aligned: - WORD $0xe3120002 // TST $2, R2 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip2 - MOVHU.P 2(R1), g - MOVH.P g, 2(R9) - -poly1305_finish_ext_armv6_skip2: - WORD $0xe3120001 // TST $1, R2 not working see issue 5921 - BEQ poly1305_finish_ext_armv6_skip1 - MOVBU.P 1(R1), g - MOVBU.P g, 1(R9) - -poly1305_finish_ext_armv6_skip1: - MOVW $1, R11 - MOVBU R11, 0(R9) - MOVW R11, 56(R5) - MOVW R5, R0 - ADD $8, R13, R1 - MOVW $16, R2 - BL poly1305_blocks_armv6<>(SB) - -poly1305_finish_ext_armv6_noremaining: - MOVW 20(R5), R0 - MOVW 24(R5), R1 - MOVW 28(R5), R2 - MOVW 32(R5), R3 - MOVW 36(R5), R4 - MOVW R4>>26, R12 - BIC $0xfc000000, R4, R4 - ADD R12<<2, R12, R12 - ADD R12, R0, R0 - MOVW R0>>26, R12 - BIC $0xfc000000, R0, R0 - ADD R12, R1, R1 - MOVW R1>>26, R12 - BIC $0xfc000000, R1, R1 - ADD R12, R2, R2 - MOVW R2>>26, R12 - BIC $0xfc000000, R2, R2 - ADD R12, R3, R3 - MOVW R3>>26, R12 - BIC $0xfc000000, R3, R3 - ADD R12, R4, R4 - ADD $5, R0, R6 - MOVW R6>>26, R12 - BIC $0xfc000000, R6, R6 - ADD R12, R1, R7 - MOVW R7>>26, R12 - BIC $0xfc000000, R7, R7 - ADD R12, R2, g - MOVW g>>26, R12 - BIC $0xfc000000, g, g - ADD R12, R3, R11 - MOVW $-(1<<26), R12 - ADD R11>>26, R12, R12 - BIC $0xfc000000, R11, R11 - ADD R12, R4, R9 - MOVW R9>>31, R12 - SUB $1, R12 - AND R12, R6, R6 - AND R12, R7, R7 - AND R12, g, g - AND R12, R11, R11 - AND R12, R9, R9 - MVN R12, R12 - AND R12, R0, R0 - AND R12, R1, R1 - AND R12, R2, R2 - AND R12, R3, R3 - AND R12, R4, R4 - ORR R6, R0, R0 - ORR R7, R1, R1 - ORR g, R2, R2 - ORR R11, R3, R3 - ORR R9, R4, R4 - ORR R1<<26, R0, R0 - MOVW R1>>6, R1 - ORR R2<<20, R1, R1 - MOVW R2>>12, R2 - ORR R3<<14, R2, R2 - MOVW R3>>18, R3 - ORR R4<<8, R3, R3 - MOVW 40(R5), R6 - MOVW 44(R5), R7 - MOVW 48(R5), g - MOVW 52(R5), R11 - ADD.S R6, R0, R0 - ADC.S R7, R1, R1 - ADC.S g, R2, R2 - ADC.S R11, R3, R3 - MOVM.IA [R0-R3], (R8) - MOVW R5, R12 - EOR R0, R0, R0 - EOR R1, R1, R1 - EOR R2, R2, R2 - EOR R3, R3, R3 - EOR R4, R4, R4 - EOR R5, R5, R5 - EOR R6, R6, R6 - EOR R7, R7, R7 - MOVM.IA.W [R0-R7], (R12) - MOVM.IA [R0-R7], (R12) - MOVW 4(R13), g - RET diff --git a/vendor/golang.org/x/crypto/poly1305/sum_noasm.go b/vendor/golang.org/x/crypto/poly1305/sum_noasm.go deleted file mode 100644 index 751eec52743c..000000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_noasm.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2018 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 s390x,!go1.11 !arm,!amd64,!s390x gccgo appengine nacl - -package poly1305 - -// Sum generates an authenticator for msg using a one-time key and puts the -// 16-byte result into out. Authenticating two different messages with the same -// key allows an attacker to forge messages at will. -func Sum(out *[TagSize]byte, msg []byte, key *[32]byte) { - sumGeneric(out, msg, key) -} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_ref.go b/vendor/golang.org/x/crypto/poly1305/sum_ref.go deleted file mode 100644 index c4d59bd09874..000000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_ref.go +++ /dev/null @@ -1,139 +0,0 @@ -// 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 poly1305 - -import "encoding/binary" - -// sumGeneric generates an authenticator for msg using a one-time key and -// puts the 16-byte result into out. This is the generic implementation of -// Sum and should be called if no assembly implementation is available. -func sumGeneric(out *[TagSize]byte, msg []byte, key *[32]byte) { - var ( - h0, h1, h2, h3, h4 uint32 // the hash accumulators - r0, r1, r2, r3, r4 uint64 // the r part of the key - ) - - r0 = uint64(binary.LittleEndian.Uint32(key[0:]) & 0x3ffffff) - r1 = uint64((binary.LittleEndian.Uint32(key[3:]) >> 2) & 0x3ffff03) - r2 = uint64((binary.LittleEndian.Uint32(key[6:]) >> 4) & 0x3ffc0ff) - r3 = uint64((binary.LittleEndian.Uint32(key[9:]) >> 6) & 0x3f03fff) - r4 = uint64((binary.LittleEndian.Uint32(key[12:]) >> 8) & 0x00fffff) - - R1, R2, R3, R4 := r1*5, r2*5, r3*5, r4*5 - - for len(msg) >= TagSize { - // h += msg - h0 += binary.LittleEndian.Uint32(msg[0:]) & 0x3ffffff - h1 += (binary.LittleEndian.Uint32(msg[3:]) >> 2) & 0x3ffffff - h2 += (binary.LittleEndian.Uint32(msg[6:]) >> 4) & 0x3ffffff - h3 += (binary.LittleEndian.Uint32(msg[9:]) >> 6) & 0x3ffffff - h4 += (binary.LittleEndian.Uint32(msg[12:]) >> 8) | (1 << 24) - - // h *= r - d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) - d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) - d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) - d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) - d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) - - // h %= p - h0 = uint32(d0) & 0x3ffffff - h1 = uint32(d1) & 0x3ffffff - h2 = uint32(d2) & 0x3ffffff - h3 = uint32(d3) & 0x3ffffff - h4 = uint32(d4) & 0x3ffffff - - h0 += uint32(d4>>26) * 5 - h1 += h0 >> 26 - h0 = h0 & 0x3ffffff - - msg = msg[TagSize:] - } - - if len(msg) > 0 { - var block [TagSize]byte - off := copy(block[:], msg) - block[off] = 0x01 - - // h += msg - h0 += binary.LittleEndian.Uint32(block[0:]) & 0x3ffffff - h1 += (binary.LittleEndian.Uint32(block[3:]) >> 2) & 0x3ffffff - h2 += (binary.LittleEndian.Uint32(block[6:]) >> 4) & 0x3ffffff - h3 += (binary.LittleEndian.Uint32(block[9:]) >> 6) & 0x3ffffff - h4 += (binary.LittleEndian.Uint32(block[12:]) >> 8) - - // h *= r - d0 := (uint64(h0) * r0) + (uint64(h1) * R4) + (uint64(h2) * R3) + (uint64(h3) * R2) + (uint64(h4) * R1) - d1 := (d0 >> 26) + (uint64(h0) * r1) + (uint64(h1) * r0) + (uint64(h2) * R4) + (uint64(h3) * R3) + (uint64(h4) * R2) - d2 := (d1 >> 26) + (uint64(h0) * r2) + (uint64(h1) * r1) + (uint64(h2) * r0) + (uint64(h3) * R4) + (uint64(h4) * R3) - d3 := (d2 >> 26) + (uint64(h0) * r3) + (uint64(h1) * r2) + (uint64(h2) * r1) + (uint64(h3) * r0) + (uint64(h4) * R4) - d4 := (d3 >> 26) + (uint64(h0) * r4) + (uint64(h1) * r3) + (uint64(h2) * r2) + (uint64(h3) * r1) + (uint64(h4) * r0) - - // h %= p - h0 = uint32(d0) & 0x3ffffff - h1 = uint32(d1) & 0x3ffffff - h2 = uint32(d2) & 0x3ffffff - h3 = uint32(d3) & 0x3ffffff - h4 = uint32(d4) & 0x3ffffff - - h0 += uint32(d4>>26) * 5 - h1 += h0 >> 26 - h0 = h0 & 0x3ffffff - } - - // h %= p reduction - h2 += h1 >> 26 - h1 &= 0x3ffffff - h3 += h2 >> 26 - h2 &= 0x3ffffff - h4 += h3 >> 26 - h3 &= 0x3ffffff - h0 += 5 * (h4 >> 26) - h4 &= 0x3ffffff - h1 += h0 >> 26 - h0 &= 0x3ffffff - - // h - p - t0 := h0 + 5 - t1 := h1 + (t0 >> 26) - t2 := h2 + (t1 >> 26) - t3 := h3 + (t2 >> 26) - t4 := h4 + (t3 >> 26) - (1 << 26) - t0 &= 0x3ffffff - t1 &= 0x3ffffff - t2 &= 0x3ffffff - t3 &= 0x3ffffff - - // select h if h < p else h - p - t_mask := (t4 >> 31) - 1 - h_mask := ^t_mask - h0 = (h0 & h_mask) | (t0 & t_mask) - h1 = (h1 & h_mask) | (t1 & t_mask) - h2 = (h2 & h_mask) | (t2 & t_mask) - h3 = (h3 & h_mask) | (t3 & t_mask) - h4 = (h4 & h_mask) | (t4 & t_mask) - - // h %= 2^128 - h0 |= h1 << 26 - h1 = ((h1 >> 6) | (h2 << 20)) - h2 = ((h2 >> 12) | (h3 << 14)) - h3 = ((h3 >> 18) | (h4 << 8)) - - // s: the s part of the key - // tag = (h + s) % (2^128) - t := uint64(h0) + uint64(binary.LittleEndian.Uint32(key[16:])) - h0 = uint32(t) - t = uint64(h1) + uint64(binary.LittleEndian.Uint32(key[20:])) + (t >> 32) - h1 = uint32(t) - t = uint64(h2) + uint64(binary.LittleEndian.Uint32(key[24:])) + (t >> 32) - h2 = uint32(t) - t = uint64(h3) + uint64(binary.LittleEndian.Uint32(key[28:])) + (t >> 32) - h3 = uint32(t) - - binary.LittleEndian.PutUint32(out[0:], h0) - binary.LittleEndian.PutUint32(out[4:], h1) - binary.LittleEndian.PutUint32(out[8:], h2) - binary.LittleEndian.PutUint32(out[12:], h3) -} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_s390x.go b/vendor/golang.org/x/crypto/poly1305/sum_s390x.go deleted file mode 100644 index 7a266cece46a..000000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_s390x.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2018 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 s390x,go1.11,!gccgo,!appengine - -package poly1305 - -// hasVectorFacility reports whether the machine supports -// the vector facility (vx). -func hasVectorFacility() bool - -// hasVMSLFacility reports whether the machine supports -// Vector Multiply Sum Logical (VMSL). -func hasVMSLFacility() bool - -var hasVX = hasVectorFacility() -var hasVMSL = hasVMSLFacility() - -// poly1305vx is an assembly implementation of Poly1305 that uses vector -// instructions. It must only be called if the vector facility (vx) is -// available. -//go:noescape -func poly1305vx(out *[16]byte, m *byte, mlen uint64, key *[32]byte) - -// poly1305vmsl is an assembly implementation of Poly1305 that uses vector -// instructions, including VMSL. It must only be called if the vector facility (vx) is -// available and if VMSL is supported. -//go:noescape -func poly1305vmsl(out *[16]byte, m *byte, mlen uint64, key *[32]byte) - -// Sum generates an authenticator for m using a one-time key and puts the -// 16-byte result into out. Authenticating two different messages with the same -// key allows an attacker to forge messages at will. -func Sum(out *[16]byte, m []byte, key *[32]byte) { - if hasVX { - var mPtr *byte - if len(m) > 0 { - mPtr = &m[0] - } - if hasVMSL && len(m) > 256 { - poly1305vmsl(out, mPtr, uint64(len(m)), key) - } else { - poly1305vx(out, mPtr, uint64(len(m)), key) - } - } else { - sumGeneric(out, m, key) - } -} diff --git a/vendor/golang.org/x/crypto/poly1305/sum_s390x.s b/vendor/golang.org/x/crypto/poly1305/sum_s390x.s deleted file mode 100644 index 356c07a6c2b1..000000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_s390x.s +++ /dev/null @@ -1,400 +0,0 @@ -// Copyright 2018 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 s390x,go1.11,!gccgo,!appengine - -#include "textflag.h" - -// Implementation of Poly1305 using the vector facility (vx). - -// constants -#define MOD26 V0 -#define EX0 V1 -#define EX1 V2 -#define EX2 V3 - -// temporaries -#define T_0 V4 -#define T_1 V5 -#define T_2 V6 -#define T_3 V7 -#define T_4 V8 - -// key (r) -#define R_0 V9 -#define R_1 V10 -#define R_2 V11 -#define R_3 V12 -#define R_4 V13 -#define R5_1 V14 -#define R5_2 V15 -#define R5_3 V16 -#define R5_4 V17 -#define RSAVE_0 R5 -#define RSAVE_1 R6 -#define RSAVE_2 R7 -#define RSAVE_3 R8 -#define RSAVE_4 R9 -#define R5SAVE_1 V28 -#define R5SAVE_2 V29 -#define R5SAVE_3 V30 -#define R5SAVE_4 V31 - -// message block -#define F_0 V18 -#define F_1 V19 -#define F_2 V20 -#define F_3 V21 -#define F_4 V22 - -// accumulator -#define H_0 V23 -#define H_1 V24 -#define H_2 V25 -#define H_3 V26 -#define H_4 V27 - -GLOBL ·keyMask<>(SB), RODATA, $16 -DATA ·keyMask<>+0(SB)/8, $0xffffff0ffcffff0f -DATA ·keyMask<>+8(SB)/8, $0xfcffff0ffcffff0f - -GLOBL ·bswapMask<>(SB), RODATA, $16 -DATA ·bswapMask<>+0(SB)/8, $0x0f0e0d0c0b0a0908 -DATA ·bswapMask<>+8(SB)/8, $0x0706050403020100 - -GLOBL ·constants<>(SB), RODATA, $64 -// MOD26 -DATA ·constants<>+0(SB)/8, $0x3ffffff -DATA ·constants<>+8(SB)/8, $0x3ffffff -// EX0 -DATA ·constants<>+16(SB)/8, $0x0006050403020100 -DATA ·constants<>+24(SB)/8, $0x1016151413121110 -// EX1 -DATA ·constants<>+32(SB)/8, $0x060c0b0a09080706 -DATA ·constants<>+40(SB)/8, $0x161c1b1a19181716 -// EX2 -DATA ·constants<>+48(SB)/8, $0x0d0d0d0d0d0f0e0d -DATA ·constants<>+56(SB)/8, $0x1d1d1d1d1d1f1e1d - -// h = (f*g) % (2**130-5) [partial reduction] -#define MULTIPLY(f0, f1, f2, f3, f4, g0, g1, g2, g3, g4, g51, g52, g53, g54, h0, h1, h2, h3, h4) \ - VMLOF f0, g0, h0 \ - VMLOF f0, g1, h1 \ - VMLOF f0, g2, h2 \ - VMLOF f0, g3, h3 \ - VMLOF f0, g4, h4 \ - VMLOF f1, g54, T_0 \ - VMLOF f1, g0, T_1 \ - VMLOF f1, g1, T_2 \ - VMLOF f1, g2, T_3 \ - VMLOF f1, g3, T_4 \ - VMALOF f2, g53, h0, h0 \ - VMALOF f2, g54, h1, h1 \ - VMALOF f2, g0, h2, h2 \ - VMALOF f2, g1, h3, h3 \ - VMALOF f2, g2, h4, h4 \ - VMALOF f3, g52, T_0, T_0 \ - VMALOF f3, g53, T_1, T_1 \ - VMALOF f3, g54, T_2, T_2 \ - VMALOF f3, g0, T_3, T_3 \ - VMALOF f3, g1, T_4, T_4 \ - VMALOF f4, g51, h0, h0 \ - VMALOF f4, g52, h1, h1 \ - VMALOF f4, g53, h2, h2 \ - VMALOF f4, g54, h3, h3 \ - VMALOF f4, g0, h4, h4 \ - VAG T_0, h0, h0 \ - VAG T_1, h1, h1 \ - VAG T_2, h2, h2 \ - VAG T_3, h3, h3 \ - VAG T_4, h4, h4 - -// carry h0->h1 h3->h4, h1->h2 h4->h0, h0->h1 h2->h3, h3->h4 -#define REDUCE(h0, h1, h2, h3, h4) \ - VESRLG $26, h0, T_0 \ - VESRLG $26, h3, T_1 \ - VN MOD26, h0, h0 \ - VN MOD26, h3, h3 \ - VAG T_0, h1, h1 \ - VAG T_1, h4, h4 \ - VESRLG $26, h1, T_2 \ - VESRLG $26, h4, T_3 \ - VN MOD26, h1, h1 \ - VN MOD26, h4, h4 \ - VESLG $2, T_3, T_4 \ - VAG T_3, T_4, T_4 \ - VAG T_2, h2, h2 \ - VAG T_4, h0, h0 \ - VESRLG $26, h2, T_0 \ - VESRLG $26, h0, T_1 \ - VN MOD26, h2, h2 \ - VN MOD26, h0, h0 \ - VAG T_0, h3, h3 \ - VAG T_1, h1, h1 \ - VESRLG $26, h3, T_2 \ - VN MOD26, h3, h3 \ - VAG T_2, h4, h4 - -// expand in0 into d[0] and in1 into d[1] -#define EXPAND(in0, in1, d0, d1, d2, d3, d4) \ - VGBM $0x0707, d1 \ // d1=tmp - VPERM in0, in1, EX2, d4 \ - VPERM in0, in1, EX0, d0 \ - VPERM in0, in1, EX1, d2 \ - VN d1, d4, d4 \ - VESRLG $26, d0, d1 \ - VESRLG $30, d2, d3 \ - VESRLG $4, d2, d2 \ - VN MOD26, d0, d0 \ - VN MOD26, d1, d1 \ - VN MOD26, d2, d2 \ - VN MOD26, d3, d3 - -// pack h4:h0 into h1:h0 (no carry) -#define PACK(h0, h1, h2, h3, h4) \ - VESLG $26, h1, h1 \ - VESLG $26, h3, h3 \ - VO h0, h1, h0 \ - VO h2, h3, h2 \ - VESLG $4, h2, h2 \ - VLEIB $7, $48, h1 \ - VSLB h1, h2, h2 \ - VO h0, h2, h0 \ - VLEIB $7, $104, h1 \ - VSLB h1, h4, h3 \ - VO h3, h0, h0 \ - VLEIB $7, $24, h1 \ - VSRLB h1, h4, h1 - -// if h > 2**130-5 then h -= 2**130-5 -#define MOD(h0, h1, t0, t1, t2) \ - VZERO t0 \ - VLEIG $1, $5, t0 \ - VACCQ h0, t0, t1 \ - VAQ h0, t0, t0 \ - VONE t2 \ - VLEIG $1, $-4, t2 \ - VAQ t2, t1, t1 \ - VACCQ h1, t1, t1 \ - VONE t2 \ - VAQ t2, t1, t1 \ - VN h0, t1, t2 \ - VNC t0, t1, t1 \ - VO t1, t2, h0 - -// func poly1305vx(out *[16]byte, m *byte, mlen uint64, key *[32]key) -TEXT ·poly1305vx(SB), $0-32 - // This code processes up to 2 blocks (32 bytes) per iteration - // using the algorithm described in: - // NEON crypto, Daniel J. Bernstein & Peter Schwabe - // https://cryptojedi.org/papers/neoncrypto-20120320.pdf - LMG out+0(FP), R1, R4 // R1=out, R2=m, R3=mlen, R4=key - - // load MOD26, EX0, EX1 and EX2 - MOVD $·constants<>(SB), R5 - VLM (R5), MOD26, EX2 - - // setup r - VL (R4), T_0 - MOVD $·keyMask<>(SB), R6 - VL (R6), T_1 - VN T_0, T_1, T_0 - EXPAND(T_0, T_0, R_0, R_1, R_2, R_3, R_4) - - // setup r*5 - VLEIG $0, $5, T_0 - VLEIG $1, $5, T_0 - - // store r (for final block) - VMLOF T_0, R_1, R5SAVE_1 - VMLOF T_0, R_2, R5SAVE_2 - VMLOF T_0, R_3, R5SAVE_3 - VMLOF T_0, R_4, R5SAVE_4 - VLGVG $0, R_0, RSAVE_0 - VLGVG $0, R_1, RSAVE_1 - VLGVG $0, R_2, RSAVE_2 - VLGVG $0, R_3, RSAVE_3 - VLGVG $0, R_4, RSAVE_4 - - // skip r**2 calculation - CMPBLE R3, $16, skip - - // calculate r**2 - MULTIPLY(R_0, R_1, R_2, R_3, R_4, R_0, R_1, R_2, R_3, R_4, R5SAVE_1, R5SAVE_2, R5SAVE_3, R5SAVE_4, H_0, H_1, H_2, H_3, H_4) - REDUCE(H_0, H_1, H_2, H_3, H_4) - VLEIG $0, $5, T_0 - VLEIG $1, $5, T_0 - VMLOF T_0, H_1, R5_1 - VMLOF T_0, H_2, R5_2 - VMLOF T_0, H_3, R5_3 - VMLOF T_0, H_4, R5_4 - VLR H_0, R_0 - VLR H_1, R_1 - VLR H_2, R_2 - VLR H_3, R_3 - VLR H_4, R_4 - - // initialize h - VZERO H_0 - VZERO H_1 - VZERO H_2 - VZERO H_3 - VZERO H_4 - -loop: - CMPBLE R3, $32, b2 - VLM (R2), T_0, T_1 - SUB $32, R3 - MOVD $32(R2), R2 - EXPAND(T_0, T_1, F_0, F_1, F_2, F_3, F_4) - VLEIB $4, $1, F_4 - VLEIB $12, $1, F_4 - -multiply: - VAG H_0, F_0, F_0 - VAG H_1, F_1, F_1 - VAG H_2, F_2, F_2 - VAG H_3, F_3, F_3 - VAG H_4, F_4, F_4 - MULTIPLY(F_0, F_1, F_2, F_3, F_4, R_0, R_1, R_2, R_3, R_4, R5_1, R5_2, R5_3, R5_4, H_0, H_1, H_2, H_3, H_4) - REDUCE(H_0, H_1, H_2, H_3, H_4) - CMPBNE R3, $0, loop - -finish: - // sum vectors - VZERO T_0 - VSUMQG H_0, T_0, H_0 - VSUMQG H_1, T_0, H_1 - VSUMQG H_2, T_0, H_2 - VSUMQG H_3, T_0, H_3 - VSUMQG H_4, T_0, H_4 - - // h may be >= 2*(2**130-5) so we need to reduce it again - REDUCE(H_0, H_1, H_2, H_3, H_4) - - // carry h1->h4 - VESRLG $26, H_1, T_1 - VN MOD26, H_1, H_1 - VAQ T_1, H_2, H_2 - VESRLG $26, H_2, T_2 - VN MOD26, H_2, H_2 - VAQ T_2, H_3, H_3 - VESRLG $26, H_3, T_3 - VN MOD26, H_3, H_3 - VAQ T_3, H_4, H_4 - - // h is now < 2*(2**130-5) - // pack h into h1 (hi) and h0 (lo) - PACK(H_0, H_1, H_2, H_3, H_4) - - // if h > 2**130-5 then h -= 2**130-5 - MOD(H_0, H_1, T_0, T_1, T_2) - - // h += s - MOVD $·bswapMask<>(SB), R5 - VL (R5), T_1 - VL 16(R4), T_0 - VPERM T_0, T_0, T_1, T_0 // reverse bytes (to big) - VAQ T_0, H_0, H_0 - VPERM H_0, H_0, T_1, H_0 // reverse bytes (to little) - VST H_0, (R1) - - RET - -b2: - CMPBLE R3, $16, b1 - - // 2 blocks remaining - SUB $17, R3 - VL (R2), T_0 - VLL R3, 16(R2), T_1 - ADD $1, R3 - MOVBZ $1, R0 - CMPBEQ R3, $16, 2(PC) - VLVGB R3, R0, T_1 - EXPAND(T_0, T_1, F_0, F_1, F_2, F_3, F_4) - CMPBNE R3, $16, 2(PC) - VLEIB $12, $1, F_4 - VLEIB $4, $1, F_4 - - // setup [r²,r] - VLVGG $1, RSAVE_0, R_0 - VLVGG $1, RSAVE_1, R_1 - VLVGG $1, RSAVE_2, R_2 - VLVGG $1, RSAVE_3, R_3 - VLVGG $1, RSAVE_4, R_4 - VPDI $0, R5_1, R5SAVE_1, R5_1 - VPDI $0, R5_2, R5SAVE_2, R5_2 - VPDI $0, R5_3, R5SAVE_3, R5_3 - VPDI $0, R5_4, R5SAVE_4, R5_4 - - MOVD $0, R3 - BR multiply - -skip: - VZERO H_0 - VZERO H_1 - VZERO H_2 - VZERO H_3 - VZERO H_4 - - CMPBEQ R3, $0, finish - -b1: - // 1 block remaining - SUB $1, R3 - VLL R3, (R2), T_0 - ADD $1, R3 - MOVBZ $1, R0 - CMPBEQ R3, $16, 2(PC) - VLVGB R3, R0, T_0 - VZERO T_1 - EXPAND(T_0, T_1, F_0, F_1, F_2, F_3, F_4) - CMPBNE R3, $16, 2(PC) - VLEIB $4, $1, F_4 - VLEIG $1, $1, R_0 - VZERO R_1 - VZERO R_2 - VZERO R_3 - VZERO R_4 - VZERO R5_1 - VZERO R5_2 - VZERO R5_3 - VZERO R5_4 - - // setup [r, 1] - VLVGG $0, RSAVE_0, R_0 - VLVGG $0, RSAVE_1, R_1 - VLVGG $0, RSAVE_2, R_2 - VLVGG $0, RSAVE_3, R_3 - VLVGG $0, RSAVE_4, R_4 - VPDI $0, R5SAVE_1, R5_1, R5_1 - VPDI $0, R5SAVE_2, R5_2, R5_2 - VPDI $0, R5SAVE_3, R5_3, R5_3 - VPDI $0, R5SAVE_4, R5_4, R5_4 - - MOVD $0, R3 - BR multiply - -TEXT ·hasVectorFacility(SB), NOSPLIT, $24-1 - MOVD $x-24(SP), R1 - XC $24, 0(R1), 0(R1) // clear the storage - MOVD $2, R0 // R0 is the number of double words stored -1 - WORD $0xB2B01000 // STFLE 0(R1) - XOR R0, R0 // reset the value of R0 - MOVBZ z-8(SP), R1 - AND $0x40, R1 - BEQ novector - -vectorinstalled: - // check if the vector instruction has been enabled - VLEIB $0, $0xF, V16 - VLGVB $0, V16, R1 - CMPBNE R1, $0xF, novector - MOVB $1, ret+0(FP) // have vx - RET - -novector: - MOVB $0, ret+0(FP) // no vx - RET diff --git a/vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s b/vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s deleted file mode 100644 index e548020b14e1..000000000000 --- a/vendor/golang.org/x/crypto/poly1305/sum_vmsl_s390x.s +++ /dev/null @@ -1,931 +0,0 @@ -// Copyright 2018 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 s390x,go1.11,!gccgo,!appengine - -#include "textflag.h" - -// Implementation of Poly1305 using the vector facility (vx) and the VMSL instruction. - -// constants -#define EX0 V1 -#define EX1 V2 -#define EX2 V3 - -// temporaries -#define T_0 V4 -#define T_1 V5 -#define T_2 V6 -#define T_3 V7 -#define T_4 V8 -#define T_5 V9 -#define T_6 V10 -#define T_7 V11 -#define T_8 V12 -#define T_9 V13 -#define T_10 V14 - -// r**2 & r**4 -#define R_0 V15 -#define R_1 V16 -#define R_2 V17 -#define R5_1 V18 -#define R5_2 V19 -// key (r) -#define RSAVE_0 R7 -#define RSAVE_1 R8 -#define RSAVE_2 R9 -#define R5SAVE_1 R10 -#define R5SAVE_2 R11 - -// message block -#define M0 V20 -#define M1 V21 -#define M2 V22 -#define M3 V23 -#define M4 V24 -#define M5 V25 - -// accumulator -#define H0_0 V26 -#define H1_0 V27 -#define H2_0 V28 -#define H0_1 V29 -#define H1_1 V30 -#define H2_1 V31 - -GLOBL ·keyMask<>(SB), RODATA, $16 -DATA ·keyMask<>+0(SB)/8, $0xffffff0ffcffff0f -DATA ·keyMask<>+8(SB)/8, $0xfcffff0ffcffff0f - -GLOBL ·bswapMask<>(SB), RODATA, $16 -DATA ·bswapMask<>+0(SB)/8, $0x0f0e0d0c0b0a0908 -DATA ·bswapMask<>+8(SB)/8, $0x0706050403020100 - -GLOBL ·constants<>(SB), RODATA, $48 -// EX0 -DATA ·constants<>+0(SB)/8, $0x18191a1b1c1d1e1f -DATA ·constants<>+8(SB)/8, $0x0000050403020100 -// EX1 -DATA ·constants<>+16(SB)/8, $0x18191a1b1c1d1e1f -DATA ·constants<>+24(SB)/8, $0x00000a0908070605 -// EX2 -DATA ·constants<>+32(SB)/8, $0x18191a1b1c1d1e1f -DATA ·constants<>+40(SB)/8, $0x0000000f0e0d0c0b - -GLOBL ·c<>(SB), RODATA, $48 -// EX0 -DATA ·c<>+0(SB)/8, $0x0000050403020100 -DATA ·c<>+8(SB)/8, $0x0000151413121110 -// EX1 -DATA ·c<>+16(SB)/8, $0x00000a0908070605 -DATA ·c<>+24(SB)/8, $0x00001a1918171615 -// EX2 -DATA ·c<>+32(SB)/8, $0x0000000f0e0d0c0b -DATA ·c<>+40(SB)/8, $0x0000001f1e1d1c1b - -GLOBL ·reduce<>(SB), RODATA, $32 -// 44 bit -DATA ·reduce<>+0(SB)/8, $0x0 -DATA ·reduce<>+8(SB)/8, $0xfffffffffff -// 42 bit -DATA ·reduce<>+16(SB)/8, $0x0 -DATA ·reduce<>+24(SB)/8, $0x3ffffffffff - -// h = (f*g) % (2**130-5) [partial reduction] -// uses T_0...T_9 temporary registers -// input: m02_0, m02_1, m02_2, m13_0, m13_1, m13_2, r_0, r_1, r_2, r5_1, r5_2, m4_0, m4_1, m4_2, m5_0, m5_1, m5_2 -// temp: t0, t1, t2, t3, t4, t5, t6, t7, t8, t9 -// output: m02_0, m02_1, m02_2, m13_0, m13_1, m13_2 -#define MULTIPLY(m02_0, m02_1, m02_2, m13_0, m13_1, m13_2, r_0, r_1, r_2, r5_1, r5_2, m4_0, m4_1, m4_2, m5_0, m5_1, m5_2, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9) \ - \ // Eliminate the dependency for the last 2 VMSLs - VMSLG m02_0, r_2, m4_2, m4_2 \ - VMSLG m13_0, r_2, m5_2, m5_2 \ // 8 VMSLs pipelined - VMSLG m02_0, r_0, m4_0, m4_0 \ - VMSLG m02_1, r5_2, V0, T_0 \ - VMSLG m02_0, r_1, m4_1, m4_1 \ - VMSLG m02_1, r_0, V0, T_1 \ - VMSLG m02_1, r_1, V0, T_2 \ - VMSLG m02_2, r5_1, V0, T_3 \ - VMSLG m02_2, r5_2, V0, T_4 \ - VMSLG m13_0, r_0, m5_0, m5_0 \ - VMSLG m13_1, r5_2, V0, T_5 \ - VMSLG m13_0, r_1, m5_1, m5_1 \ - VMSLG m13_1, r_0, V0, T_6 \ - VMSLG m13_1, r_1, V0, T_7 \ - VMSLG m13_2, r5_1, V0, T_8 \ - VMSLG m13_2, r5_2, V0, T_9 \ - VMSLG m02_2, r_0, m4_2, m4_2 \ - VMSLG m13_2, r_0, m5_2, m5_2 \ - VAQ m4_0, T_0, m02_0 \ - VAQ m4_1, T_1, m02_1 \ - VAQ m5_0, T_5, m13_0 \ - VAQ m5_1, T_6, m13_1 \ - VAQ m02_0, T_3, m02_0 \ - VAQ m02_1, T_4, m02_1 \ - VAQ m13_0, T_8, m13_0 \ - VAQ m13_1, T_9, m13_1 \ - VAQ m4_2, T_2, m02_2 \ - VAQ m5_2, T_7, m13_2 \ - -// SQUARE uses three limbs of r and r_2*5 to output square of r -// uses T_1, T_5 and T_7 temporary registers -// input: r_0, r_1, r_2, r5_2 -// temp: TEMP0, TEMP1, TEMP2 -// output: p0, p1, p2 -#define SQUARE(r_0, r_1, r_2, r5_2, p0, p1, p2, TEMP0, TEMP1, TEMP2) \ - VMSLG r_0, r_0, p0, p0 \ - VMSLG r_1, r5_2, V0, TEMP0 \ - VMSLG r_2, r5_2, p1, p1 \ - VMSLG r_0, r_1, V0, TEMP1 \ - VMSLG r_1, r_1, p2, p2 \ - VMSLG r_0, r_2, V0, TEMP2 \ - VAQ TEMP0, p0, p0 \ - VAQ TEMP1, p1, p1 \ - VAQ TEMP2, p2, p2 \ - VAQ TEMP0, p0, p0 \ - VAQ TEMP1, p1, p1 \ - VAQ TEMP2, p2, p2 \ - -// carry h0->h1->h2->h0 || h3->h4->h5->h3 -// uses T_2, T_4, T_5, T_7, T_8, T_9 -// t6, t7, t8, t9, t10, t11 -// input: h0, h1, h2, h3, h4, h5 -// temp: t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11 -// output: h0, h1, h2, h3, h4, h5 -#define REDUCE(h0, h1, h2, h3, h4, h5, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11) \ - VLM (R12), t6, t7 \ // 44 and 42 bit clear mask - VLEIB $7, $0x28, t10 \ // 5 byte shift mask - VREPIB $4, t8 \ // 4 bit shift mask - VREPIB $2, t11 \ // 2 bit shift mask - VSRLB t10, h0, t0 \ // h0 byte shift - VSRLB t10, h1, t1 \ // h1 byte shift - VSRLB t10, h2, t2 \ // h2 byte shift - VSRLB t10, h3, t3 \ // h3 byte shift - VSRLB t10, h4, t4 \ // h4 byte shift - VSRLB t10, h5, t5 \ // h5 byte shift - VSRL t8, t0, t0 \ // h0 bit shift - VSRL t8, t1, t1 \ // h2 bit shift - VSRL t11, t2, t2 \ // h2 bit shift - VSRL t8, t3, t3 \ // h3 bit shift - VSRL t8, t4, t4 \ // h4 bit shift - VESLG $2, t2, t9 \ // h2 carry x5 - VSRL t11, t5, t5 \ // h5 bit shift - VN t6, h0, h0 \ // h0 clear carry - VAQ t2, t9, t2 \ // h2 carry x5 - VESLG $2, t5, t9 \ // h5 carry x5 - VN t6, h1, h1 \ // h1 clear carry - VN t7, h2, h2 \ // h2 clear carry - VAQ t5, t9, t5 \ // h5 carry x5 - VN t6, h3, h3 \ // h3 clear carry - VN t6, h4, h4 \ // h4 clear carry - VN t7, h5, h5 \ // h5 clear carry - VAQ t0, h1, h1 \ // h0->h1 - VAQ t3, h4, h4 \ // h3->h4 - VAQ t1, h2, h2 \ // h1->h2 - VAQ t4, h5, h5 \ // h4->h5 - VAQ t2, h0, h0 \ // h2->h0 - VAQ t5, h3, h3 \ // h5->h3 - VREPG $1, t6, t6 \ // 44 and 42 bit masks across both halves - VREPG $1, t7, t7 \ - VSLDB $8, h0, h0, h0 \ // set up [h0/1/2, h3/4/5] - VSLDB $8, h1, h1, h1 \ - VSLDB $8, h2, h2, h2 \ - VO h0, h3, h3 \ - VO h1, h4, h4 \ - VO h2, h5, h5 \ - VESRLG $44, h3, t0 \ // 44 bit shift right - VESRLG $44, h4, t1 \ - VESRLG $42, h5, t2 \ - VN t6, h3, h3 \ // clear carry bits - VN t6, h4, h4 \ - VN t7, h5, h5 \ - VESLG $2, t2, t9 \ // multiply carry by 5 - VAQ t9, t2, t2 \ - VAQ t0, h4, h4 \ - VAQ t1, h5, h5 \ - VAQ t2, h3, h3 \ - -// carry h0->h1->h2->h0 -// input: h0, h1, h2 -// temp: t0, t1, t2, t3, t4, t5, t6, t7, t8 -// output: h0, h1, h2 -#define REDUCE2(h0, h1, h2, t0, t1, t2, t3, t4, t5, t6, t7, t8) \ - VLEIB $7, $0x28, t3 \ // 5 byte shift mask - VREPIB $4, t4 \ // 4 bit shift mask - VREPIB $2, t7 \ // 2 bit shift mask - VGBM $0x003F, t5 \ // mask to clear carry bits - VSRLB t3, h0, t0 \ - VSRLB t3, h1, t1 \ - VSRLB t3, h2, t2 \ - VESRLG $4, t5, t5 \ // 44 bit clear mask - VSRL t4, t0, t0 \ - VSRL t4, t1, t1 \ - VSRL t7, t2, t2 \ - VESRLG $2, t5, t6 \ // 42 bit clear mask - VESLG $2, t2, t8 \ - VAQ t8, t2, t2 \ - VN t5, h0, h0 \ - VN t5, h1, h1 \ - VN t6, h2, h2 \ - VAQ t0, h1, h1 \ - VAQ t1, h2, h2 \ - VAQ t2, h0, h0 \ - VSRLB t3, h0, t0 \ - VSRLB t3, h1, t1 \ - VSRLB t3, h2, t2 \ - VSRL t4, t0, t0 \ - VSRL t4, t1, t1 \ - VSRL t7, t2, t2 \ - VN t5, h0, h0 \ - VN t5, h1, h1 \ - VESLG $2, t2, t8 \ - VN t6, h2, h2 \ - VAQ t0, h1, h1 \ - VAQ t8, t2, t2 \ - VAQ t1, h2, h2 \ - VAQ t2, h0, h0 \ - -// expands two message blocks into the lower halfs of the d registers -// moves the contents of the d registers into upper halfs -// input: in1, in2, d0, d1, d2, d3, d4, d5 -// temp: TEMP0, TEMP1, TEMP2, TEMP3 -// output: d0, d1, d2, d3, d4, d5 -#define EXPACC(in1, in2, d0, d1, d2, d3, d4, d5, TEMP0, TEMP1, TEMP2, TEMP3) \ - VGBM $0xff3f, TEMP0 \ - VGBM $0xff1f, TEMP1 \ - VESLG $4, d1, TEMP2 \ - VESLG $4, d4, TEMP3 \ - VESRLG $4, TEMP0, TEMP0 \ - VPERM in1, d0, EX0, d0 \ - VPERM in2, d3, EX0, d3 \ - VPERM in1, d2, EX2, d2 \ - VPERM in2, d5, EX2, d5 \ - VPERM in1, TEMP2, EX1, d1 \ - VPERM in2, TEMP3, EX1, d4 \ - VN TEMP0, d0, d0 \ - VN TEMP0, d3, d3 \ - VESRLG $4, d1, d1 \ - VESRLG $4, d4, d4 \ - VN TEMP1, d2, d2 \ - VN TEMP1, d5, d5 \ - VN TEMP0, d1, d1 \ - VN TEMP0, d4, d4 \ - -// expands one message block into the lower halfs of the d registers -// moves the contents of the d registers into upper halfs -// input: in, d0, d1, d2 -// temp: TEMP0, TEMP1, TEMP2 -// output: d0, d1, d2 -#define EXPACC2(in, d0, d1, d2, TEMP0, TEMP1, TEMP2) \ - VGBM $0xff3f, TEMP0 \ - VESLG $4, d1, TEMP2 \ - VGBM $0xff1f, TEMP1 \ - VPERM in, d0, EX0, d0 \ - VESRLG $4, TEMP0, TEMP0 \ - VPERM in, d2, EX2, d2 \ - VPERM in, TEMP2, EX1, d1 \ - VN TEMP0, d0, d0 \ - VN TEMP1, d2, d2 \ - VESRLG $4, d1, d1 \ - VN TEMP0, d1, d1 \ - -// pack h2:h0 into h1:h0 (no carry) -// input: h0, h1, h2 -// output: h0, h1, h2 -#define PACK(h0, h1, h2) \ - VMRLG h1, h2, h2 \ // copy h1 to upper half h2 - VESLG $44, h1, h1 \ // shift limb 1 44 bits, leaving 20 - VO h0, h1, h0 \ // combine h0 with 20 bits from limb 1 - VESRLG $20, h2, h1 \ // put top 24 bits of limb 1 into h1 - VLEIG $1, $0, h1 \ // clear h2 stuff from lower half of h1 - VO h0, h1, h0 \ // h0 now has 88 bits (limb 0 and 1) - VLEIG $0, $0, h2 \ // clear upper half of h2 - VESRLG $40, h2, h1 \ // h1 now has upper two bits of result - VLEIB $7, $88, h1 \ // for byte shift (11 bytes) - VSLB h1, h2, h2 \ // shift h2 11 bytes to the left - VO h0, h2, h0 \ // combine h0 with 20 bits from limb 1 - VLEIG $0, $0, h1 \ // clear upper half of h1 - -// if h > 2**130-5 then h -= 2**130-5 -// input: h0, h1 -// temp: t0, t1, t2 -// output: h0 -#define MOD(h0, h1, t0, t1, t2) \ - VZERO t0 \ - VLEIG $1, $5, t0 \ - VACCQ h0, t0, t1 \ - VAQ h0, t0, t0 \ - VONE t2 \ - VLEIG $1, $-4, t2 \ - VAQ t2, t1, t1 \ - VACCQ h1, t1, t1 \ - VONE t2 \ - VAQ t2, t1, t1 \ - VN h0, t1, t2 \ - VNC t0, t1, t1 \ - VO t1, t2, h0 \ - -// func poly1305vmsl(out *[16]byte, m *byte, mlen uint64, key *[32]key) -TEXT ·poly1305vmsl(SB), $0-32 - // This code processes 6 + up to 4 blocks (32 bytes) per iteration - // using the algorithm described in: - // NEON crypto, Daniel J. Bernstein & Peter Schwabe - // https://cryptojedi.org/papers/neoncrypto-20120320.pdf - // And as moddified for VMSL as described in - // Accelerating Poly1305 Cryptographic Message Authentication on the z14 - // O'Farrell et al, CASCON 2017, p48-55 - // https://ibm.ent.box.com/s/jf9gedj0e9d2vjctfyh186shaztavnht - - LMG out+0(FP), R1, R4 // R1=out, R2=m, R3=mlen, R4=key - VZERO V0 // c - - // load EX0, EX1 and EX2 - MOVD $·constants<>(SB), R5 - VLM (R5), EX0, EX2 // c - - // setup r - VL (R4), T_0 - MOVD $·keyMask<>(SB), R6 - VL (R6), T_1 - VN T_0, T_1, T_0 - VZERO T_2 // limbs for r - VZERO T_3 - VZERO T_4 - EXPACC2(T_0, T_2, T_3, T_4, T_1, T_5, T_7) - - // T_2, T_3, T_4: [0, r] - - // setup r*20 - VLEIG $0, $0, T_0 - VLEIG $1, $20, T_0 // T_0: [0, 20] - VZERO T_5 - VZERO T_6 - VMSLG T_0, T_3, T_5, T_5 - VMSLG T_0, T_4, T_6, T_6 - - // store r for final block in GR - VLGVG $1, T_2, RSAVE_0 // c - VLGVG $1, T_3, RSAVE_1 // c - VLGVG $1, T_4, RSAVE_2 // c - VLGVG $1, T_5, R5SAVE_1 // c - VLGVG $1, T_6, R5SAVE_2 // c - - // initialize h - VZERO H0_0 - VZERO H1_0 - VZERO H2_0 - VZERO H0_1 - VZERO H1_1 - VZERO H2_1 - - // initialize pointer for reduce constants - MOVD $·reduce<>(SB), R12 - - // calculate r**2 and 20*(r**2) - VZERO R_0 - VZERO R_1 - VZERO R_2 - SQUARE(T_2, T_3, T_4, T_6, R_0, R_1, R_2, T_1, T_5, T_7) - REDUCE2(R_0, R_1, R_2, M0, M1, M2, M3, M4, R5_1, R5_2, M5, T_1) - VZERO R5_1 - VZERO R5_2 - VMSLG T_0, R_1, R5_1, R5_1 - VMSLG T_0, R_2, R5_2, R5_2 - - // skip r**4 calculation if 3 blocks or less - CMPBLE R3, $48, b4 - - // calculate r**4 and 20*(r**4) - VZERO T_8 - VZERO T_9 - VZERO T_10 - SQUARE(R_0, R_1, R_2, R5_2, T_8, T_9, T_10, T_1, T_5, T_7) - REDUCE2(T_8, T_9, T_10, M0, M1, M2, M3, M4, T_2, T_3, M5, T_1) - VZERO T_2 - VZERO T_3 - VMSLG T_0, T_9, T_2, T_2 - VMSLG T_0, T_10, T_3, T_3 - - // put r**2 to the right and r**4 to the left of R_0, R_1, R_2 - VSLDB $8, T_8, T_8, T_8 - VSLDB $8, T_9, T_9, T_9 - VSLDB $8, T_10, T_10, T_10 - VSLDB $8, T_2, T_2, T_2 - VSLDB $8, T_3, T_3, T_3 - - VO T_8, R_0, R_0 - VO T_9, R_1, R_1 - VO T_10, R_2, R_2 - VO T_2, R5_1, R5_1 - VO T_3, R5_2, R5_2 - - CMPBLE R3, $80, load // less than or equal to 5 blocks in message - - // 6(or 5+1) blocks - SUB $81, R3 - VLM (R2), M0, M4 - VLL R3, 80(R2), M5 - ADD $1, R3 - MOVBZ $1, R0 - CMPBGE R3, $16, 2(PC) - VLVGB R3, R0, M5 - MOVD $96(R2), R2 - EXPACC(M0, M1, H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_0, T_1, T_2, T_3) - EXPACC(M2, M3, H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_0, T_1, T_2, T_3) - VLEIB $2, $1, H2_0 - VLEIB $2, $1, H2_1 - VLEIB $10, $1, H2_0 - VLEIB $10, $1, H2_1 - - VZERO M0 - VZERO M1 - VZERO M2 - VZERO M3 - VZERO T_4 - VZERO T_10 - EXPACC(M4, M5, M0, M1, M2, M3, T_4, T_10, T_0, T_1, T_2, T_3) - VLR T_4, M4 - VLEIB $10, $1, M2 - CMPBLT R3, $16, 2(PC) - VLEIB $10, $1, T_10 - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, T_10, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M2, M3, M4, T_4, T_5, T_2, T_7, T_8, T_9) - VMRHG V0, H0_1, H0_0 - VMRHG V0, H1_1, H1_0 - VMRHG V0, H2_1, H2_0 - VMRLG V0, H0_1, H0_1 - VMRLG V0, H1_1, H1_1 - VMRLG V0, H2_1, H2_1 - - SUB $16, R3 - CMPBLE R3, $0, square - -load: - // load EX0, EX1 and EX2 - MOVD $·c<>(SB), R5 - VLM (R5), EX0, EX2 - -loop: - CMPBLE R3, $64, add // b4 // last 4 or less blocks left - - // next 4 full blocks - VLM (R2), M2, M5 - SUB $64, R3 - MOVD $64(R2), R2 - REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, T_0, T_1, T_3, T_4, T_5, T_2, T_7, T_8, T_9) - - // expacc in-lined to create [m2, m3] limbs - VGBM $0x3f3f, T_0 // 44 bit clear mask - VGBM $0x1f1f, T_1 // 40 bit clear mask - VPERM M2, M3, EX0, T_3 - VESRLG $4, T_0, T_0 // 44 bit clear mask ready - VPERM M2, M3, EX1, T_4 - VPERM M2, M3, EX2, T_5 - VN T_0, T_3, T_3 - VESRLG $4, T_4, T_4 - VN T_1, T_5, T_5 - VN T_0, T_4, T_4 - VMRHG H0_1, T_3, H0_0 - VMRHG H1_1, T_4, H1_0 - VMRHG H2_1, T_5, H2_0 - VMRLG H0_1, T_3, H0_1 - VMRLG H1_1, T_4, H1_1 - VMRLG H2_1, T_5, H2_1 - VLEIB $10, $1, H2_0 - VLEIB $10, $1, H2_1 - VPERM M4, M5, EX0, T_3 - VPERM M4, M5, EX1, T_4 - VPERM M4, M5, EX2, T_5 - VN T_0, T_3, T_3 - VESRLG $4, T_4, T_4 - VN T_1, T_5, T_5 - VN T_0, T_4, T_4 - VMRHG V0, T_3, M0 - VMRHG V0, T_4, M1 - VMRHG V0, T_5, M2 - VMRLG V0, T_3, M3 - VMRLG V0, T_4, M4 - VMRLG V0, T_5, M5 - VLEIB $10, $1, M2 - VLEIB $10, $1, M5 - - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - CMPBNE R3, $0, loop - REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M3, M4, M5, T_4, T_5, T_2, T_7, T_8, T_9) - VMRHG V0, H0_1, H0_0 - VMRHG V0, H1_1, H1_0 - VMRHG V0, H2_1, H2_0 - VMRLG V0, H0_1, H0_1 - VMRLG V0, H1_1, H1_1 - VMRLG V0, H2_1, H2_1 - - // load EX0, EX1, EX2 - MOVD $·constants<>(SB), R5 - VLM (R5), EX0, EX2 - - // sum vectors - VAQ H0_0, H0_1, H0_0 - VAQ H1_0, H1_1, H1_0 - VAQ H2_0, H2_1, H2_0 - - // h may be >= 2*(2**130-5) so we need to reduce it again - // M0...M4 are used as temps here - REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) - -next: // carry h1->h2 - VLEIB $7, $0x28, T_1 - VREPIB $4, T_2 - VGBM $0x003F, T_3 - VESRLG $4, T_3 - - // byte shift - VSRLB T_1, H1_0, T_4 - - // bit shift - VSRL T_2, T_4, T_4 - - // clear h1 carry bits - VN T_3, H1_0, H1_0 - - // add carry - VAQ T_4, H2_0, H2_0 - - // h is now < 2*(2**130-5) - // pack h into h1 (hi) and h0 (lo) - PACK(H0_0, H1_0, H2_0) - - // if h > 2**130-5 then h -= 2**130-5 - MOD(H0_0, H1_0, T_0, T_1, T_2) - - // h += s - MOVD $·bswapMask<>(SB), R5 - VL (R5), T_1 - VL 16(R4), T_0 - VPERM T_0, T_0, T_1, T_0 // reverse bytes (to big) - VAQ T_0, H0_0, H0_0 - VPERM H0_0, H0_0, T_1, H0_0 // reverse bytes (to little) - VST H0_0, (R1) - RET - -add: - // load EX0, EX1, EX2 - MOVD $·constants<>(SB), R5 - VLM (R5), EX0, EX2 - - REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M3, M4, M5, T_4, T_5, T_2, T_7, T_8, T_9) - VMRHG V0, H0_1, H0_0 - VMRHG V0, H1_1, H1_0 - VMRHG V0, H2_1, H2_0 - VMRLG V0, H0_1, H0_1 - VMRLG V0, H1_1, H1_1 - VMRLG V0, H2_1, H2_1 - CMPBLE R3, $64, b4 - -b4: - CMPBLE R3, $48, b3 // 3 blocks or less - - // 4(3+1) blocks remaining - SUB $49, R3 - VLM (R2), M0, M2 - VLL R3, 48(R2), M3 - ADD $1, R3 - MOVBZ $1, R0 - CMPBEQ R3, $16, 2(PC) - VLVGB R3, R0, M3 - MOVD $64(R2), R2 - EXPACC(M0, M1, H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_0, T_1, T_2, T_3) - VLEIB $10, $1, H2_0 - VLEIB $10, $1, H2_1 - VZERO M0 - VZERO M1 - VZERO M4 - VZERO M5 - VZERO T_4 - VZERO T_10 - EXPACC(M2, M3, M0, M1, M4, M5, T_4, T_10, T_0, T_1, T_2, T_3) - VLR T_4, M2 - VLEIB $10, $1, M4 - CMPBNE R3, $16, 2(PC) - VLEIB $10, $1, T_10 - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M4, M5, M2, T_10, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M3, M4, M5, T_4, T_5, T_2, T_7, T_8, T_9) - VMRHG V0, H0_1, H0_0 - VMRHG V0, H1_1, H1_0 - VMRHG V0, H2_1, H2_0 - VMRLG V0, H0_1, H0_1 - VMRLG V0, H1_1, H1_1 - VMRLG V0, H2_1, H2_1 - SUB $16, R3 - CMPBLE R3, $0, square // this condition must always hold true! - -b3: - CMPBLE R3, $32, b2 - - // 3 blocks remaining - - // setup [r²,r] - VSLDB $8, R_0, R_0, R_0 - VSLDB $8, R_1, R_1, R_1 - VSLDB $8, R_2, R_2, R_2 - VSLDB $8, R5_1, R5_1, R5_1 - VSLDB $8, R5_2, R5_2, R5_2 - - VLVGG $1, RSAVE_0, R_0 - VLVGG $1, RSAVE_1, R_1 - VLVGG $1, RSAVE_2, R_2 - VLVGG $1, R5SAVE_1, R5_1 - VLVGG $1, R5SAVE_2, R5_2 - - // setup [h0, h1] - VSLDB $8, H0_0, H0_0, H0_0 - VSLDB $8, H1_0, H1_0, H1_0 - VSLDB $8, H2_0, H2_0, H2_0 - VO H0_1, H0_0, H0_0 - VO H1_1, H1_0, H1_0 - VO H2_1, H2_0, H2_0 - VZERO H0_1 - VZERO H1_1 - VZERO H2_1 - - VZERO M0 - VZERO M1 - VZERO M2 - VZERO M3 - VZERO M4 - VZERO M5 - - // H*[r**2, r] - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, H0_1, H1_1, T_10, M5) - - SUB $33, R3 - VLM (R2), M0, M1 - VLL R3, 32(R2), M2 - ADD $1, R3 - MOVBZ $1, R0 - CMPBEQ R3, $16, 2(PC) - VLVGB R3, R0, M2 - - // H += m0 - VZERO T_1 - VZERO T_2 - VZERO T_3 - EXPACC2(M0, T_1, T_2, T_3, T_4, T_5, T_6) - VLEIB $10, $1, T_3 - VAG H0_0, T_1, H0_0 - VAG H1_0, T_2, H1_0 - VAG H2_0, T_3, H2_0 - - VZERO M0 - VZERO M3 - VZERO M4 - VZERO M5 - VZERO T_10 - - // (H+m0)*r - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M3, M4, M5, V0, T_10, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE2(H0_0, H1_0, H2_0, M0, M3, M4, M5, T_10, H0_1, H1_1, H2_1, T_9) - - // H += m1 - VZERO V0 - VZERO T_1 - VZERO T_2 - VZERO T_3 - EXPACC2(M1, T_1, T_2, T_3, T_4, T_5, T_6) - VLEIB $10, $1, T_3 - VAQ H0_0, T_1, H0_0 - VAQ H1_0, T_2, H1_0 - VAQ H2_0, T_3, H2_0 - REDUCE2(H0_0, H1_0, H2_0, M0, M3, M4, M5, T_9, H0_1, H1_1, H2_1, T_10) - - // [H, m2] * [r**2, r] - EXPACC2(M2, H0_0, H1_0, H2_0, T_1, T_2, T_3) - CMPBNE R3, $16, 2(PC) - VLEIB $10, $1, H2_0 - VZERO M0 - VZERO M1 - VZERO M2 - VZERO M3 - VZERO M4 - VZERO M5 - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, H0_1, H1_1, M5, T_10) - SUB $16, R3 - CMPBLE R3, $0, next // this condition must always hold true! - -b2: - CMPBLE R3, $16, b1 - - // 2 blocks remaining - - // setup [r²,r] - VSLDB $8, R_0, R_0, R_0 - VSLDB $8, R_1, R_1, R_1 - VSLDB $8, R_2, R_2, R_2 - VSLDB $8, R5_1, R5_1, R5_1 - VSLDB $8, R5_2, R5_2, R5_2 - - VLVGG $1, RSAVE_0, R_0 - VLVGG $1, RSAVE_1, R_1 - VLVGG $1, RSAVE_2, R_2 - VLVGG $1, R5SAVE_1, R5_1 - VLVGG $1, R5SAVE_2, R5_2 - - // setup [h0, h1] - VSLDB $8, H0_0, H0_0, H0_0 - VSLDB $8, H1_0, H1_0, H1_0 - VSLDB $8, H2_0, H2_0, H2_0 - VO H0_1, H0_0, H0_0 - VO H1_1, H1_0, H1_0 - VO H2_1, H2_0, H2_0 - VZERO H0_1 - VZERO H1_1 - VZERO H2_1 - - VZERO M0 - VZERO M1 - VZERO M2 - VZERO M3 - VZERO M4 - VZERO M5 - - // H*[r**2, r] - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, T_10, M0, M1, M2, M3, M4, T_4, T_5, T_2, T_7, T_8, T_9) - VMRHG V0, H0_1, H0_0 - VMRHG V0, H1_1, H1_0 - VMRHG V0, H2_1, H2_0 - VMRLG V0, H0_1, H0_1 - VMRLG V0, H1_1, H1_1 - VMRLG V0, H2_1, H2_1 - - // move h to the left and 0s at the right - VSLDB $8, H0_0, H0_0, H0_0 - VSLDB $8, H1_0, H1_0, H1_0 - VSLDB $8, H2_0, H2_0, H2_0 - - // get message blocks and append 1 to start - SUB $17, R3 - VL (R2), M0 - VLL R3, 16(R2), M1 - ADD $1, R3 - MOVBZ $1, R0 - CMPBEQ R3, $16, 2(PC) - VLVGB R3, R0, M1 - VZERO T_6 - VZERO T_7 - VZERO T_8 - EXPACC2(M0, T_6, T_7, T_8, T_1, T_2, T_3) - EXPACC2(M1, T_6, T_7, T_8, T_1, T_2, T_3) - VLEIB $2, $1, T_8 - CMPBNE R3, $16, 2(PC) - VLEIB $10, $1, T_8 - - // add [m0, m1] to h - VAG H0_0, T_6, H0_0 - VAG H1_0, T_7, H1_0 - VAG H2_0, T_8, H2_0 - - VZERO M2 - VZERO M3 - VZERO M4 - VZERO M5 - VZERO T_10 - VZERO M0 - - // at this point R_0 .. R5_2 look like [r**2, r] - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M2, M3, M4, M5, T_10, M0, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE2(H0_0, H1_0, H2_0, M2, M3, M4, M5, T_9, H0_1, H1_1, H2_1, T_10) - SUB $16, R3, R3 - CMPBLE R3, $0, next - -b1: - CMPBLE R3, $0, next - - // 1 block remaining - - // setup [r²,r] - VSLDB $8, R_0, R_0, R_0 - VSLDB $8, R_1, R_1, R_1 - VSLDB $8, R_2, R_2, R_2 - VSLDB $8, R5_1, R5_1, R5_1 - VSLDB $8, R5_2, R5_2, R5_2 - - VLVGG $1, RSAVE_0, R_0 - VLVGG $1, RSAVE_1, R_1 - VLVGG $1, RSAVE_2, R_2 - VLVGG $1, R5SAVE_1, R5_1 - VLVGG $1, R5SAVE_2, R5_2 - - // setup [h0, h1] - VSLDB $8, H0_0, H0_0, H0_0 - VSLDB $8, H1_0, H1_0, H1_0 - VSLDB $8, H2_0, H2_0, H2_0 - VO H0_1, H0_0, H0_0 - VO H1_1, H1_0, H1_0 - VO H2_1, H2_0, H2_0 - VZERO H0_1 - VZERO H1_1 - VZERO H2_1 - - VZERO M0 - VZERO M1 - VZERO M2 - VZERO M3 - VZERO M4 - VZERO M5 - - // H*[r**2, r] - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) - - // set up [0, m0] limbs - SUB $1, R3 - VLL R3, (R2), M0 - ADD $1, R3 - MOVBZ $1, R0 - CMPBEQ R3, $16, 2(PC) - VLVGB R3, R0, M0 - VZERO T_1 - VZERO T_2 - VZERO T_3 - EXPACC2(M0, T_1, T_2, T_3, T_4, T_5, T_6)// limbs: [0, m] - CMPBNE R3, $16, 2(PC) - VLEIB $10, $1, T_3 - - // h+m0 - VAQ H0_0, T_1, H0_0 - VAQ H1_0, T_2, H1_0 - VAQ H2_0, T_3, H2_0 - - VZERO M0 - VZERO M1 - VZERO M2 - VZERO M3 - VZERO M4 - VZERO M5 - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) - - BR next - -square: - // setup [r²,r] - VSLDB $8, R_0, R_0, R_0 - VSLDB $8, R_1, R_1, R_1 - VSLDB $8, R_2, R_2, R_2 - VSLDB $8, R5_1, R5_1, R5_1 - VSLDB $8, R5_2, R5_2, R5_2 - - VLVGG $1, RSAVE_0, R_0 - VLVGG $1, RSAVE_1, R_1 - VLVGG $1, RSAVE_2, R_2 - VLVGG $1, R5SAVE_1, R5_1 - VLVGG $1, R5SAVE_2, R5_2 - - // setup [h0, h1] - VSLDB $8, H0_0, H0_0, H0_0 - VSLDB $8, H1_0, H1_0, H1_0 - VSLDB $8, H2_0, H2_0, H2_0 - VO H0_1, H0_0, H0_0 - VO H1_1, H1_0, H1_0 - VO H2_1, H2_0, H2_0 - VZERO H0_1 - VZERO H1_1 - VZERO H2_1 - - VZERO M0 - VZERO M1 - VZERO M2 - VZERO M3 - VZERO M4 - VZERO M5 - - // (h0*r**2) + (h1*r) - MULTIPLY(H0_0, H1_0, H2_0, H0_1, H1_1, H2_1, R_0, R_1, R_2, R5_1, R5_2, M0, M1, M2, M3, M4, M5, T_0, T_1, T_2, T_3, T_4, T_5, T_6, T_7, T_8, T_9) - REDUCE2(H0_0, H1_0, H2_0, M0, M1, M2, M3, M4, T_9, T_10, H0_1, M5) - BR next - -TEXT ·hasVMSLFacility(SB), NOSPLIT, $24-1 - MOVD $x-24(SP), R1 - XC $24, 0(R1), 0(R1) // clear the storage - MOVD $2, R0 // R0 is the number of double words stored -1 - WORD $0xB2B01000 // STFLE 0(R1) - XOR R0, R0 // reset the value of R0 - MOVBZ z-8(SP), R1 - AND $0x01, R1 - BEQ novmsl - -vectorinstalled: - // check if the vector instruction has been enabled - VLEIB $0, $0xF, V16 - VLGVB $0, V16, R1 - CMPBNE R1, $0xF, novmsl - MOVB $1, ret+0(FP) // have vx - RET - -novmsl: - MOVB $0, ret+0(FP) // no vx - RET diff --git a/vendor/golang.org/x/crypto/ripemd160/ripemd160.go b/vendor/golang.org/x/crypto/ripemd160/ripemd160.go deleted file mode 100644 index fd97ba1b06b2..000000000000 --- a/vendor/golang.org/x/crypto/ripemd160/ripemd160.go +++ /dev/null @@ -1,120 +0,0 @@ -// 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. - -// Package ripemd160 implements the RIPEMD-160 hash algorithm. -package ripemd160 // import "golang.org/x/crypto/ripemd160" - -// RIPEMD-160 is designed by Hans Dobbertin, Antoon Bosselaers, and Bart -// Preneel with specifications available at: -// http://homes.esat.kuleuven.be/~cosicart/pdf/AB-9601/AB-9601.pdf. - -import ( - "crypto" - "hash" -) - -func init() { - crypto.RegisterHash(crypto.RIPEMD160, New) -} - -// The size of the checksum in bytes. -const Size = 20 - -// The block size of the hash algorithm in bytes. -const BlockSize = 64 - -const ( - _s0 = 0x67452301 - _s1 = 0xefcdab89 - _s2 = 0x98badcfe - _s3 = 0x10325476 - _s4 = 0xc3d2e1f0 -) - -// digest represents the partial evaluation of a checksum. -type digest struct { - s [5]uint32 // running context - x [BlockSize]byte // temporary buffer - nx int // index into x - tc uint64 // total count of bytes processed -} - -func (d *digest) Reset() { - d.s[0], d.s[1], d.s[2], d.s[3], d.s[4] = _s0, _s1, _s2, _s3, _s4 - d.nx = 0 - d.tc = 0 -} - -// New returns a new hash.Hash computing the checksum. -func New() hash.Hash { - result := new(digest) - result.Reset() - return result -} - -func (d *digest) Size() int { return Size } - -func (d *digest) BlockSize() int { return BlockSize } - -func (d *digest) Write(p []byte) (nn int, err error) { - nn = len(p) - d.tc += uint64(nn) - if d.nx > 0 { - n := len(p) - if n > BlockSize-d.nx { - n = BlockSize - d.nx - } - for i := 0; i < n; i++ { - d.x[d.nx+i] = p[i] - } - d.nx += n - if d.nx == BlockSize { - _Block(d, d.x[0:]) - d.nx = 0 - } - p = p[n:] - } - n := _Block(d, p) - p = p[n:] - if len(p) > 0 { - d.nx = copy(d.x[:], p) - } - return -} - -func (d0 *digest) Sum(in []byte) []byte { - // Make a copy of d0 so that caller can keep writing and summing. - d := *d0 - - // Padding. Add a 1 bit and 0 bits until 56 bytes mod 64. - tc := d.tc - var tmp [64]byte - tmp[0] = 0x80 - if tc%64 < 56 { - d.Write(tmp[0 : 56-tc%64]) - } else { - d.Write(tmp[0 : 64+56-tc%64]) - } - - // Length in bits. - tc <<= 3 - for i := uint(0); i < 8; i++ { - tmp[i] = byte(tc >> (8 * i)) - } - d.Write(tmp[0:8]) - - if d.nx != 0 { - panic("d.nx != 0") - } - - var digest [Size]byte - for i, s := range d.s { - digest[i*4] = byte(s) - digest[i*4+1] = byte(s >> 8) - digest[i*4+2] = byte(s >> 16) - digest[i*4+3] = byte(s >> 24) - } - - return append(in, digest[:]...) -} diff --git a/vendor/golang.org/x/crypto/ripemd160/ripemd160block.go b/vendor/golang.org/x/crypto/ripemd160/ripemd160block.go deleted file mode 100644 index e0edc02f0f30..000000000000 --- a/vendor/golang.org/x/crypto/ripemd160/ripemd160block.go +++ /dev/null @@ -1,165 +0,0 @@ -// 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. - -// RIPEMD-160 block step. -// In its own file so that a faster assembly or C version -// can be substituted easily. - -package ripemd160 - -import ( - "math/bits" -) - -// work buffer indices and roll amounts for one line -var _n = [80]uint{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, - 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, - 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, - 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13, -} - -var _r = [80]uint{ - 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, - 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, - 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, - 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, - 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6, -} - -// same for the other parallel one -var n_ = [80]uint{ - 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, - 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, - 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, - 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, - 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11, -} - -var r_ = [80]uint{ - 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, - 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, - 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, - 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, - 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11, -} - -func _Block(md *digest, p []byte) int { - n := 0 - var x [16]uint32 - var alpha, beta uint32 - for len(p) >= BlockSize { - a, b, c, d, e := md.s[0], md.s[1], md.s[2], md.s[3], md.s[4] - aa, bb, cc, dd, ee := a, b, c, d, e - j := 0 - for i := 0; i < 16; i++ { - x[i] = uint32(p[j]) | uint32(p[j+1])<<8 | uint32(p[j+2])<<16 | uint32(p[j+3])<<24 - j += 4 - } - - // round 1 - i := 0 - for i < 16 { - alpha = a + (b ^ c ^ d) + x[_n[i]] - s := int(_r[i]) - alpha = bits.RotateLeft32(alpha, s) + e - beta = bits.RotateLeft32(c, 10) - a, b, c, d, e = e, alpha, b, beta, d - - // parallel line - alpha = aa + (bb ^ (cc | ^dd)) + x[n_[i]] + 0x50a28be6 - s = int(r_[i]) - alpha = bits.RotateLeft32(alpha, s) + ee - beta = bits.RotateLeft32(cc, 10) - aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd - - i++ - } - - // round 2 - for i < 32 { - alpha = a + (b&c | ^b&d) + x[_n[i]] + 0x5a827999 - s := int(_r[i]) - alpha = bits.RotateLeft32(alpha, s) + e - beta = bits.RotateLeft32(c, 10) - a, b, c, d, e = e, alpha, b, beta, d - - // parallel line - alpha = aa + (bb&dd | cc&^dd) + x[n_[i]] + 0x5c4dd124 - s = int(r_[i]) - alpha = bits.RotateLeft32(alpha, s) + ee - beta = bits.RotateLeft32(cc, 10) - aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd - - i++ - } - - // round 3 - for i < 48 { - alpha = a + (b | ^c ^ d) + x[_n[i]] + 0x6ed9eba1 - s := int(_r[i]) - alpha = bits.RotateLeft32(alpha, s) + e - beta = bits.RotateLeft32(c, 10) - a, b, c, d, e = e, alpha, b, beta, d - - // parallel line - alpha = aa + (bb | ^cc ^ dd) + x[n_[i]] + 0x6d703ef3 - s = int(r_[i]) - alpha = bits.RotateLeft32(alpha, s) + ee - beta = bits.RotateLeft32(cc, 10) - aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd - - i++ - } - - // round 4 - for i < 64 { - alpha = a + (b&d | c&^d) + x[_n[i]] + 0x8f1bbcdc - s := int(_r[i]) - alpha = bits.RotateLeft32(alpha, s) + e - beta = bits.RotateLeft32(c, 10) - a, b, c, d, e = e, alpha, b, beta, d - - // parallel line - alpha = aa + (bb&cc | ^bb&dd) + x[n_[i]] + 0x7a6d76e9 - s = int(r_[i]) - alpha = bits.RotateLeft32(alpha, s) + ee - beta = bits.RotateLeft32(cc, 10) - aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd - - i++ - } - - // round 5 - for i < 80 { - alpha = a + (b ^ (c | ^d)) + x[_n[i]] + 0xa953fd4e - s := int(_r[i]) - alpha = bits.RotateLeft32(alpha, s) + e - beta = bits.RotateLeft32(c, 10) - a, b, c, d, e = e, alpha, b, beta, d - - // parallel line - alpha = aa + (bb ^ cc ^ dd) + x[n_[i]] - s = int(r_[i]) - alpha = bits.RotateLeft32(alpha, s) + ee - beta = bits.RotateLeft32(cc, 10) - aa, bb, cc, dd, ee = ee, alpha, bb, beta, dd - - i++ - } - - // combine results - dd += c + md.s[1] - md.s[1] = md.s[2] + d + ee - md.s[2] = md.s[3] + e + aa - md.s[3] = md.s[4] + a + bb - md.s[4] = md.s[0] + b + cc - md.s[0] = dd - - p = p[BlockSize:] - n += BlockSize - } - return n -} diff --git a/vendor/golang.org/x/crypto/scrypt/scrypt.go b/vendor/golang.org/x/crypto/scrypt/scrypt.go deleted file mode 100644 index 3362afd118bc..000000000000 --- a/vendor/golang.org/x/crypto/scrypt/scrypt.go +++ /dev/null @@ -1,244 +0,0 @@ -// 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 scrypt implements the scrypt key derivation function as defined in -// Colin Percival's paper "Stronger Key Derivation via Sequential Memory-Hard -// Functions" (https://www.tarsnap.com/scrypt/scrypt.pdf). -package scrypt // import "golang.org/x/crypto/scrypt" - -import ( - "crypto/sha256" - "errors" - - "golang.org/x/crypto/pbkdf2" -) - -const maxInt = int(^uint(0) >> 1) - -// blockCopy copies n numbers from src into dst. -func blockCopy(dst, src []uint32, n int) { - copy(dst, src[:n]) -} - -// blockXOR XORs numbers from dst with n numbers from src. -func blockXOR(dst, src []uint32, n int) { - for i, v := range src[:n] { - dst[i] ^= v - } -} - -// salsaXOR applies Salsa20/8 to the XOR of 16 numbers from tmp and in, -// and puts the result into both tmp and out. -func salsaXOR(tmp *[16]uint32, in, out []uint32) { - w0 := tmp[0] ^ in[0] - w1 := tmp[1] ^ in[1] - w2 := tmp[2] ^ in[2] - w3 := tmp[3] ^ in[3] - w4 := tmp[4] ^ in[4] - w5 := tmp[5] ^ in[5] - w6 := tmp[6] ^ in[6] - w7 := tmp[7] ^ in[7] - w8 := tmp[8] ^ in[8] - w9 := tmp[9] ^ in[9] - w10 := tmp[10] ^ in[10] - w11 := tmp[11] ^ in[11] - w12 := tmp[12] ^ in[12] - w13 := tmp[13] ^ in[13] - w14 := tmp[14] ^ in[14] - w15 := tmp[15] ^ in[15] - - x0, x1, x2, x3, x4, x5, x6, x7, x8 := w0, w1, w2, w3, w4, w5, w6, w7, w8 - x9, x10, x11, x12, x13, x14, x15 := w9, w10, w11, w12, w13, w14, w15 - - for i := 0; i < 8; i += 2 { - u := x0 + x12 - x4 ^= u<<7 | u>>(32-7) - u = x4 + x0 - x8 ^= u<<9 | u>>(32-9) - u = x8 + x4 - x12 ^= u<<13 | u>>(32-13) - u = x12 + x8 - x0 ^= u<<18 | u>>(32-18) - - u = x5 + x1 - x9 ^= u<<7 | u>>(32-7) - u = x9 + x5 - x13 ^= u<<9 | u>>(32-9) - u = x13 + x9 - x1 ^= u<<13 | u>>(32-13) - u = x1 + x13 - x5 ^= u<<18 | u>>(32-18) - - u = x10 + x6 - x14 ^= u<<7 | u>>(32-7) - u = x14 + x10 - x2 ^= u<<9 | u>>(32-9) - u = x2 + x14 - x6 ^= u<<13 | u>>(32-13) - u = x6 + x2 - x10 ^= u<<18 | u>>(32-18) - - u = x15 + x11 - x3 ^= u<<7 | u>>(32-7) - u = x3 + x15 - x7 ^= u<<9 | u>>(32-9) - u = x7 + x3 - x11 ^= u<<13 | u>>(32-13) - u = x11 + x7 - x15 ^= u<<18 | u>>(32-18) - - u = x0 + x3 - x1 ^= u<<7 | u>>(32-7) - u = x1 + x0 - x2 ^= u<<9 | u>>(32-9) - u = x2 + x1 - x3 ^= u<<13 | u>>(32-13) - u = x3 + x2 - x0 ^= u<<18 | u>>(32-18) - - u = x5 + x4 - x6 ^= u<<7 | u>>(32-7) - u = x6 + x5 - x7 ^= u<<9 | u>>(32-9) - u = x7 + x6 - x4 ^= u<<13 | u>>(32-13) - u = x4 + x7 - x5 ^= u<<18 | u>>(32-18) - - u = x10 + x9 - x11 ^= u<<7 | u>>(32-7) - u = x11 + x10 - x8 ^= u<<9 | u>>(32-9) - u = x8 + x11 - x9 ^= u<<13 | u>>(32-13) - u = x9 + x8 - x10 ^= u<<18 | u>>(32-18) - - u = x15 + x14 - x12 ^= u<<7 | u>>(32-7) - u = x12 + x15 - x13 ^= u<<9 | u>>(32-9) - u = x13 + x12 - x14 ^= u<<13 | u>>(32-13) - u = x14 + x13 - x15 ^= u<<18 | u>>(32-18) - } - x0 += w0 - x1 += w1 - x2 += w2 - x3 += w3 - x4 += w4 - x5 += w5 - x6 += w6 - x7 += w7 - x8 += w8 - x9 += w9 - x10 += w10 - x11 += w11 - x12 += w12 - x13 += w13 - x14 += w14 - x15 += w15 - - out[0], tmp[0] = x0, x0 - out[1], tmp[1] = x1, x1 - out[2], tmp[2] = x2, x2 - out[3], tmp[3] = x3, x3 - out[4], tmp[4] = x4, x4 - out[5], tmp[5] = x5, x5 - out[6], tmp[6] = x6, x6 - out[7], tmp[7] = x7, x7 - out[8], tmp[8] = x8, x8 - out[9], tmp[9] = x9, x9 - out[10], tmp[10] = x10, x10 - out[11], tmp[11] = x11, x11 - out[12], tmp[12] = x12, x12 - out[13], tmp[13] = x13, x13 - out[14], tmp[14] = x14, x14 - out[15], tmp[15] = x15, x15 -} - -func blockMix(tmp *[16]uint32, in, out []uint32, r int) { - blockCopy(tmp[:], in[(2*r-1)*16:], 16) - for i := 0; i < 2*r; i += 2 { - salsaXOR(tmp, in[i*16:], out[i*8:]) - salsaXOR(tmp, in[i*16+16:], out[i*8+r*16:]) - } -} - -func integer(b []uint32, r int) uint64 { - j := (2*r - 1) * 16 - return uint64(b[j]) | uint64(b[j+1])<<32 -} - -func smix(b []byte, r, N int, v, xy []uint32) { - var tmp [16]uint32 - x := xy - y := xy[32*r:] - - j := 0 - for i := 0; i < 32*r; i++ { - x[i] = uint32(b[j]) | uint32(b[j+1])<<8 | uint32(b[j+2])<<16 | uint32(b[j+3])<<24 - j += 4 - } - for i := 0; i < N; i += 2 { - blockCopy(v[i*(32*r):], x, 32*r) - blockMix(&tmp, x, y, r) - - blockCopy(v[(i+1)*(32*r):], y, 32*r) - blockMix(&tmp, y, x, r) - } - for i := 0; i < N; i += 2 { - j := int(integer(x, r) & uint64(N-1)) - blockXOR(x, v[j*(32*r):], 32*r) - blockMix(&tmp, x, y, r) - - j = int(integer(y, r) & uint64(N-1)) - blockXOR(y, v[j*(32*r):], 32*r) - blockMix(&tmp, y, x, r) - } - j = 0 - for _, v := range x[:32*r] { - b[j+0] = byte(v >> 0) - b[j+1] = byte(v >> 8) - b[j+2] = byte(v >> 16) - b[j+3] = byte(v >> 24) - j += 4 - } -} - -// Key derives a key from the password, salt, and cost parameters, returning -// a byte slice of length keyLen that can be used as cryptographic key. -// -// N is a CPU/memory cost parameter, which must be a power of two greater than 1. -// r and p must satisfy r * p < 2³⁰. If the parameters do not satisfy the -// limits, the function returns a nil byte slice and an error. -// -// For example, you can get a derived key for e.g. AES-256 (which needs a -// 32-byte key) by doing: -// -// dk, err := scrypt.Key([]byte("some password"), salt, 32768, 8, 1, 32) -// -// 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") - } - if uint64(r)*uint64(p) >= 1<<30 || r > maxInt/128/p || r > maxInt/256 || N > maxInt/128/r { - return nil, errors.New("scrypt: parameters are too large") - } - - xy := make([]uint32, 64*r) - v := make([]uint32, 32*N*r) - b := pbkdf2.Key(password, salt, 1, p*128*r, sha256.New) - - for i := 0; i < p; i++ { - smix(b[i*128*r:], r, N, v, xy) - } - - return pbkdf2.Key(password, b, 1, keyLen, sha256.New), nil -} diff --git a/vendor/golang.org/x/crypto/sha3/doc.go b/vendor/golang.org/x/crypto/sha3/doc.go deleted file mode 100644 index c2fef30afff3..000000000000 --- a/vendor/golang.org/x/crypto/sha3/doc.go +++ /dev/null @@ -1,66 +0,0 @@ -// 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. - -// Package sha3 implements the SHA-3 fixed-output-length hash functions and -// the SHAKE variable-output-length hash functions defined by FIPS-202. -// -// Both types of hash function use the "sponge" construction and the Keccak -// permutation. For a detailed specification see http://keccak.noekeon.org/ -// -// -// Guidance -// -// If you aren't sure what function you need, use SHAKE256 with at least 64 -// bytes of output. The SHAKE instances are faster than the SHA3 instances; -// the latter have to allocate memory to conform to the hash.Hash interface. -// -// If you need a secret-key MAC (message authentication code), prepend the -// secret key to the input, hash with SHAKE256 and read at least 32 bytes of -// output. -// -// -// Security strengths -// -// The SHA3-x (x equals 224, 256, 384, or 512) functions have a security -// strength against preimage attacks of x bits. Since they only produce "x" -// bits of output, their collision-resistance is only "x/2" bits. -// -// The SHAKE-256 and -128 functions have a generic security strength of 256 and -// 128 bits against all attacks, provided that at least 2x bits of their output -// is used. Requesting more than 64 or 32 bytes of output, respectively, does -// not increase the collision-resistance of the SHAKE functions. -// -// -// The sponge construction -// -// A sponge builds a pseudo-random function from a public pseudo-random -// permutation, by applying the permutation to a state of "rate + capacity" -// bytes, but hiding "capacity" of the bytes. -// -// A sponge starts out with a zero state. To hash an input using a sponge, up -// to "rate" bytes of the input are XORed into the sponge's state. The sponge -// is then "full" and the permutation is applied to "empty" it. This process is -// repeated until all the input has been "absorbed". The input is then padded. -// The digest is "squeezed" from the sponge in the same way, except that output -// is copied out instead of input being XORed in. -// -// A sponge is parameterized by its generic security strength, which is equal -// to half its capacity; capacity + rate is equal to the permutation's width. -// Since the KeccakF-1600 permutation is 1600 bits (200 bytes) wide, this means -// that the security strength of a sponge instance is equal to (1600 - bitrate) / 2. -// -// -// Recommendations -// -// The SHAKE functions are recommended for most new uses. They can produce -// output of arbitrary length. SHAKE256, with an output length of at least -// 64 bytes, provides 256-bit security against all attacks. The Keccak team -// recommends it for most applications upgrading from SHA2-512. (NIST chose a -// much stronger, but much slower, sponge instance for SHA3-512.) -// -// The SHA-3 functions are "drop-in" replacements for the SHA-2 functions. -// They produce output of the same length, with the same security strengths -// against all attacks. This means, in particular, that SHA3-256 only has -// 128-bit collision resistance, because its output length is 32 bytes. -package sha3 // import "golang.org/x/crypto/sha3" diff --git a/vendor/golang.org/x/crypto/sha3/hashes.go b/vendor/golang.org/x/crypto/sha3/hashes.go deleted file mode 100644 index 0d8043fd2a17..000000000000 --- a/vendor/golang.org/x/crypto/sha3/hashes.go +++ /dev/null @@ -1,97 +0,0 @@ -// 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. - -package sha3 - -// This file provides functions for creating instances of the SHA-3 -// and SHAKE hash functions, as well as utility functions for hashing -// bytes. - -import ( - "hash" -) - -// New224 creates a new SHA3-224 hash. -// Its generic security strength is 224 bits against preimage attacks, -// and 112 bits against collision attacks. -func New224() hash.Hash { - if h := new224Asm(); h != nil { - return h - } - return &state{rate: 144, outputLen: 28, dsbyte: 0x06} -} - -// New256 creates a new SHA3-256 hash. -// Its generic security strength is 256 bits against preimage attacks, -// and 128 bits against collision attacks. -func New256() hash.Hash { - if h := new256Asm(); h != nil { - return h - } - return &state{rate: 136, outputLen: 32, dsbyte: 0x06} -} - -// New384 creates a new SHA3-384 hash. -// Its generic security strength is 384 bits against preimage attacks, -// and 192 bits against collision attacks. -func New384() hash.Hash { - if h := new384Asm(); h != nil { - return h - } - return &state{rate: 104, outputLen: 48, dsbyte: 0x06} -} - -// New512 creates a new SHA3-512 hash. -// Its generic security strength is 512 bits against preimage attacks, -// and 256 bits against collision attacks. -func New512() hash.Hash { - if h := new512Asm(); h != nil { - return h - } - return &state{rate: 72, outputLen: 64, dsbyte: 0x06} -} - -// NewLegacyKeccak256 creates a new Keccak-256 hash. -// -// Only use this function if you require compatibility with an existing cryptosystem -// that uses non-standard padding. All other users should use New256 instead. -func NewLegacyKeccak256() hash.Hash { return &state{rate: 136, outputLen: 32, dsbyte: 0x01} } - -// NewLegacyKeccak512 creates a new Keccak-512 hash. -// -// Only use this function if you require compatibility with an existing cryptosystem -// that uses non-standard padding. All other users should use New512 instead. -func NewLegacyKeccak512() hash.Hash { return &state{rate: 72, outputLen: 64, dsbyte: 0x01} } - -// Sum224 returns the SHA3-224 digest of the data. -func Sum224(data []byte) (digest [28]byte) { - h := New224() - h.Write(data) - h.Sum(digest[:0]) - return -} - -// Sum256 returns the SHA3-256 digest of the data. -func Sum256(data []byte) (digest [32]byte) { - h := New256() - h.Write(data) - h.Sum(digest[:0]) - return -} - -// Sum384 returns the SHA3-384 digest of the data. -func Sum384(data []byte) (digest [48]byte) { - h := New384() - h.Write(data) - h.Sum(digest[:0]) - return -} - -// Sum512 returns the SHA3-512 digest of the data. -func Sum512(data []byte) (digest [64]byte) { - h := New512() - h.Write(data) - h.Sum(digest[:0]) - return -} diff --git a/vendor/golang.org/x/crypto/sha3/hashes_generic.go b/vendor/golang.org/x/crypto/sha3/hashes_generic.go deleted file mode 100644 index c4ff3f6e66da..000000000000 --- a/vendor/golang.org/x/crypto/sha3/hashes_generic.go +++ /dev/null @@ -1,27 +0,0 @@ -// 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 appengine !s390x - -package sha3 - -import ( - "hash" -) - -// new224Asm returns an assembly implementation of SHA3-224 if available, -// otherwise it returns nil. -func new224Asm() hash.Hash { return nil } - -// new256Asm returns an assembly implementation of SHA3-256 if available, -// otherwise it returns nil. -func new256Asm() hash.Hash { return nil } - -// new384Asm returns an assembly implementation of SHA3-384 if available, -// otherwise it returns nil. -func new384Asm() hash.Hash { return nil } - -// new512Asm returns an assembly implementation of SHA3-512 if available, -// otherwise it returns nil. -func new512Asm() hash.Hash { return nil } diff --git a/vendor/golang.org/x/crypto/sha3/keccakf.go b/vendor/golang.org/x/crypto/sha3/keccakf.go deleted file mode 100644 index 46d03ed385df..000000000000 --- a/vendor/golang.org/x/crypto/sha3/keccakf.go +++ /dev/null @@ -1,412 +0,0 @@ -// 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 !amd64 appengine gccgo - -package sha3 - -// rc stores the round constants for use in the ι step. -var rc = [24]uint64{ - 0x0000000000000001, - 0x0000000000008082, - 0x800000000000808A, - 0x8000000080008000, - 0x000000000000808B, - 0x0000000080000001, - 0x8000000080008081, - 0x8000000000008009, - 0x000000000000008A, - 0x0000000000000088, - 0x0000000080008009, - 0x000000008000000A, - 0x000000008000808B, - 0x800000000000008B, - 0x8000000000008089, - 0x8000000000008003, - 0x8000000000008002, - 0x8000000000000080, - 0x000000000000800A, - 0x800000008000000A, - 0x8000000080008081, - 0x8000000000008080, - 0x0000000080000001, - 0x8000000080008008, -} - -// keccakF1600 applies the Keccak permutation to a 1600b-wide -// state represented as a slice of 25 uint64s. -func keccakF1600(a *[25]uint64) { - // Implementation translated from Keccak-inplace.c - // in the keccak reference code. - var t, bc0, bc1, bc2, bc3, bc4, d0, d1, d2, d3, d4 uint64 - - for i := 0; i < 24; i += 4 { - // Combines the 5 steps in each round into 2 steps. - // Unrolls 4 rounds per loop and spreads some steps across rounds. - - // Round 1 - bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] - bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] - bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] - bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] - bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] - d0 = bc4 ^ (bc1<<1 | bc1>>63) - d1 = bc0 ^ (bc2<<1 | bc2>>63) - d2 = bc1 ^ (bc3<<1 | bc3>>63) - d3 = bc2 ^ (bc4<<1 | bc4>>63) - d4 = bc3 ^ (bc0<<1 | bc0>>63) - - bc0 = a[0] ^ d0 - t = a[6] ^ d1 - bc1 = t<<44 | t>>(64-44) - t = a[12] ^ d2 - bc2 = t<<43 | t>>(64-43) - t = a[18] ^ d3 - bc3 = t<<21 | t>>(64-21) - t = a[24] ^ d4 - bc4 = t<<14 | t>>(64-14) - a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i] - a[6] = bc1 ^ (bc3 &^ bc2) - a[12] = bc2 ^ (bc4 &^ bc3) - a[18] = bc3 ^ (bc0 &^ bc4) - a[24] = bc4 ^ (bc1 &^ bc0) - - t = a[10] ^ d0 - bc2 = t<<3 | t>>(64-3) - t = a[16] ^ d1 - bc3 = t<<45 | t>>(64-45) - t = a[22] ^ d2 - bc4 = t<<61 | t>>(64-61) - t = a[3] ^ d3 - bc0 = t<<28 | t>>(64-28) - t = a[9] ^ d4 - bc1 = t<<20 | t>>(64-20) - a[10] = bc0 ^ (bc2 &^ bc1) - a[16] = bc1 ^ (bc3 &^ bc2) - a[22] = bc2 ^ (bc4 &^ bc3) - a[3] = bc3 ^ (bc0 &^ bc4) - a[9] = bc4 ^ (bc1 &^ bc0) - - t = a[20] ^ d0 - bc4 = t<<18 | t>>(64-18) - t = a[1] ^ d1 - bc0 = t<<1 | t>>(64-1) - t = a[7] ^ d2 - bc1 = t<<6 | t>>(64-6) - t = a[13] ^ d3 - bc2 = t<<25 | t>>(64-25) - t = a[19] ^ d4 - bc3 = t<<8 | t>>(64-8) - a[20] = bc0 ^ (bc2 &^ bc1) - a[1] = bc1 ^ (bc3 &^ bc2) - a[7] = bc2 ^ (bc4 &^ bc3) - a[13] = bc3 ^ (bc0 &^ bc4) - a[19] = bc4 ^ (bc1 &^ bc0) - - t = a[5] ^ d0 - bc1 = t<<36 | t>>(64-36) - t = a[11] ^ d1 - bc2 = t<<10 | t>>(64-10) - t = a[17] ^ d2 - bc3 = t<<15 | t>>(64-15) - t = a[23] ^ d3 - bc4 = t<<56 | t>>(64-56) - t = a[4] ^ d4 - bc0 = t<<27 | t>>(64-27) - a[5] = bc0 ^ (bc2 &^ bc1) - a[11] = bc1 ^ (bc3 &^ bc2) - a[17] = bc2 ^ (bc4 &^ bc3) - a[23] = bc3 ^ (bc0 &^ bc4) - a[4] = bc4 ^ (bc1 &^ bc0) - - t = a[15] ^ d0 - bc3 = t<<41 | t>>(64-41) - t = a[21] ^ d1 - bc4 = t<<2 | t>>(64-2) - t = a[2] ^ d2 - bc0 = t<<62 | t>>(64-62) - t = a[8] ^ d3 - bc1 = t<<55 | t>>(64-55) - t = a[14] ^ d4 - bc2 = t<<39 | t>>(64-39) - a[15] = bc0 ^ (bc2 &^ bc1) - a[21] = bc1 ^ (bc3 &^ bc2) - a[2] = bc2 ^ (bc4 &^ bc3) - a[8] = bc3 ^ (bc0 &^ bc4) - a[14] = bc4 ^ (bc1 &^ bc0) - - // Round 2 - bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] - bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] - bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] - bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] - bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] - d0 = bc4 ^ (bc1<<1 | bc1>>63) - d1 = bc0 ^ (bc2<<1 | bc2>>63) - d2 = bc1 ^ (bc3<<1 | bc3>>63) - d3 = bc2 ^ (bc4<<1 | bc4>>63) - d4 = bc3 ^ (bc0<<1 | bc0>>63) - - bc0 = a[0] ^ d0 - t = a[16] ^ d1 - bc1 = t<<44 | t>>(64-44) - t = a[7] ^ d2 - bc2 = t<<43 | t>>(64-43) - t = a[23] ^ d3 - bc3 = t<<21 | t>>(64-21) - t = a[14] ^ d4 - bc4 = t<<14 | t>>(64-14) - a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+1] - a[16] = bc1 ^ (bc3 &^ bc2) - a[7] = bc2 ^ (bc4 &^ bc3) - a[23] = bc3 ^ (bc0 &^ bc4) - a[14] = bc4 ^ (bc1 &^ bc0) - - t = a[20] ^ d0 - bc2 = t<<3 | t>>(64-3) - t = a[11] ^ d1 - bc3 = t<<45 | t>>(64-45) - t = a[2] ^ d2 - bc4 = t<<61 | t>>(64-61) - t = a[18] ^ d3 - bc0 = t<<28 | t>>(64-28) - t = a[9] ^ d4 - bc1 = t<<20 | t>>(64-20) - a[20] = bc0 ^ (bc2 &^ bc1) - a[11] = bc1 ^ (bc3 &^ bc2) - a[2] = bc2 ^ (bc4 &^ bc3) - a[18] = bc3 ^ (bc0 &^ bc4) - a[9] = bc4 ^ (bc1 &^ bc0) - - t = a[15] ^ d0 - bc4 = t<<18 | t>>(64-18) - t = a[6] ^ d1 - bc0 = t<<1 | t>>(64-1) - t = a[22] ^ d2 - bc1 = t<<6 | t>>(64-6) - t = a[13] ^ d3 - bc2 = t<<25 | t>>(64-25) - t = a[4] ^ d4 - bc3 = t<<8 | t>>(64-8) - a[15] = bc0 ^ (bc2 &^ bc1) - a[6] = bc1 ^ (bc3 &^ bc2) - a[22] = bc2 ^ (bc4 &^ bc3) - a[13] = bc3 ^ (bc0 &^ bc4) - a[4] = bc4 ^ (bc1 &^ bc0) - - t = a[10] ^ d0 - bc1 = t<<36 | t>>(64-36) - t = a[1] ^ d1 - bc2 = t<<10 | t>>(64-10) - t = a[17] ^ d2 - bc3 = t<<15 | t>>(64-15) - t = a[8] ^ d3 - bc4 = t<<56 | t>>(64-56) - t = a[24] ^ d4 - bc0 = t<<27 | t>>(64-27) - a[10] = bc0 ^ (bc2 &^ bc1) - a[1] = bc1 ^ (bc3 &^ bc2) - a[17] = bc2 ^ (bc4 &^ bc3) - a[8] = bc3 ^ (bc0 &^ bc4) - a[24] = bc4 ^ (bc1 &^ bc0) - - t = a[5] ^ d0 - bc3 = t<<41 | t>>(64-41) - t = a[21] ^ d1 - bc4 = t<<2 | t>>(64-2) - t = a[12] ^ d2 - bc0 = t<<62 | t>>(64-62) - t = a[3] ^ d3 - bc1 = t<<55 | t>>(64-55) - t = a[19] ^ d4 - bc2 = t<<39 | t>>(64-39) - a[5] = bc0 ^ (bc2 &^ bc1) - a[21] = bc1 ^ (bc3 &^ bc2) - a[12] = bc2 ^ (bc4 &^ bc3) - a[3] = bc3 ^ (bc0 &^ bc4) - a[19] = bc4 ^ (bc1 &^ bc0) - - // Round 3 - bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] - bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] - bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] - bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] - bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] - d0 = bc4 ^ (bc1<<1 | bc1>>63) - d1 = bc0 ^ (bc2<<1 | bc2>>63) - d2 = bc1 ^ (bc3<<1 | bc3>>63) - d3 = bc2 ^ (bc4<<1 | bc4>>63) - d4 = bc3 ^ (bc0<<1 | bc0>>63) - - bc0 = a[0] ^ d0 - t = a[11] ^ d1 - bc1 = t<<44 | t>>(64-44) - t = a[22] ^ d2 - bc2 = t<<43 | t>>(64-43) - t = a[8] ^ d3 - bc3 = t<<21 | t>>(64-21) - t = a[19] ^ d4 - bc4 = t<<14 | t>>(64-14) - a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+2] - a[11] = bc1 ^ (bc3 &^ bc2) - a[22] = bc2 ^ (bc4 &^ bc3) - a[8] = bc3 ^ (bc0 &^ bc4) - a[19] = bc4 ^ (bc1 &^ bc0) - - t = a[15] ^ d0 - bc2 = t<<3 | t>>(64-3) - t = a[1] ^ d1 - bc3 = t<<45 | t>>(64-45) - t = a[12] ^ d2 - bc4 = t<<61 | t>>(64-61) - t = a[23] ^ d3 - bc0 = t<<28 | t>>(64-28) - t = a[9] ^ d4 - bc1 = t<<20 | t>>(64-20) - a[15] = bc0 ^ (bc2 &^ bc1) - a[1] = bc1 ^ (bc3 &^ bc2) - a[12] = bc2 ^ (bc4 &^ bc3) - a[23] = bc3 ^ (bc0 &^ bc4) - a[9] = bc4 ^ (bc1 &^ bc0) - - t = a[5] ^ d0 - bc4 = t<<18 | t>>(64-18) - t = a[16] ^ d1 - bc0 = t<<1 | t>>(64-1) - t = a[2] ^ d2 - bc1 = t<<6 | t>>(64-6) - t = a[13] ^ d3 - bc2 = t<<25 | t>>(64-25) - t = a[24] ^ d4 - bc3 = t<<8 | t>>(64-8) - a[5] = bc0 ^ (bc2 &^ bc1) - a[16] = bc1 ^ (bc3 &^ bc2) - a[2] = bc2 ^ (bc4 &^ bc3) - a[13] = bc3 ^ (bc0 &^ bc4) - a[24] = bc4 ^ (bc1 &^ bc0) - - t = a[20] ^ d0 - bc1 = t<<36 | t>>(64-36) - t = a[6] ^ d1 - bc2 = t<<10 | t>>(64-10) - t = a[17] ^ d2 - bc3 = t<<15 | t>>(64-15) - t = a[3] ^ d3 - bc4 = t<<56 | t>>(64-56) - t = a[14] ^ d4 - bc0 = t<<27 | t>>(64-27) - a[20] = bc0 ^ (bc2 &^ bc1) - a[6] = bc1 ^ (bc3 &^ bc2) - a[17] = bc2 ^ (bc4 &^ bc3) - a[3] = bc3 ^ (bc0 &^ bc4) - a[14] = bc4 ^ (bc1 &^ bc0) - - t = a[10] ^ d0 - bc3 = t<<41 | t>>(64-41) - t = a[21] ^ d1 - bc4 = t<<2 | t>>(64-2) - t = a[7] ^ d2 - bc0 = t<<62 | t>>(64-62) - t = a[18] ^ d3 - bc1 = t<<55 | t>>(64-55) - t = a[4] ^ d4 - bc2 = t<<39 | t>>(64-39) - a[10] = bc0 ^ (bc2 &^ bc1) - a[21] = bc1 ^ (bc3 &^ bc2) - a[7] = bc2 ^ (bc4 &^ bc3) - a[18] = bc3 ^ (bc0 &^ bc4) - a[4] = bc4 ^ (bc1 &^ bc0) - - // Round 4 - bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] - bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] - bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] - bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] - bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] - d0 = bc4 ^ (bc1<<1 | bc1>>63) - d1 = bc0 ^ (bc2<<1 | bc2>>63) - d2 = bc1 ^ (bc3<<1 | bc3>>63) - d3 = bc2 ^ (bc4<<1 | bc4>>63) - d4 = bc3 ^ (bc0<<1 | bc0>>63) - - bc0 = a[0] ^ d0 - t = a[1] ^ d1 - bc1 = t<<44 | t>>(64-44) - t = a[2] ^ d2 - bc2 = t<<43 | t>>(64-43) - t = a[3] ^ d3 - bc3 = t<<21 | t>>(64-21) - t = a[4] ^ d4 - bc4 = t<<14 | t>>(64-14) - a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+3] - a[1] = bc1 ^ (bc3 &^ bc2) - a[2] = bc2 ^ (bc4 &^ bc3) - a[3] = bc3 ^ (bc0 &^ bc4) - a[4] = bc4 ^ (bc1 &^ bc0) - - t = a[5] ^ d0 - bc2 = t<<3 | t>>(64-3) - t = a[6] ^ d1 - bc3 = t<<45 | t>>(64-45) - t = a[7] ^ d2 - bc4 = t<<61 | t>>(64-61) - t = a[8] ^ d3 - bc0 = t<<28 | t>>(64-28) - t = a[9] ^ d4 - bc1 = t<<20 | t>>(64-20) - a[5] = bc0 ^ (bc2 &^ bc1) - a[6] = bc1 ^ (bc3 &^ bc2) - a[7] = bc2 ^ (bc4 &^ bc3) - a[8] = bc3 ^ (bc0 &^ bc4) - a[9] = bc4 ^ (bc1 &^ bc0) - - t = a[10] ^ d0 - bc4 = t<<18 | t>>(64-18) - t = a[11] ^ d1 - bc0 = t<<1 | t>>(64-1) - t = a[12] ^ d2 - bc1 = t<<6 | t>>(64-6) - t = a[13] ^ d3 - bc2 = t<<25 | t>>(64-25) - t = a[14] ^ d4 - bc3 = t<<8 | t>>(64-8) - a[10] = bc0 ^ (bc2 &^ bc1) - a[11] = bc1 ^ (bc3 &^ bc2) - a[12] = bc2 ^ (bc4 &^ bc3) - a[13] = bc3 ^ (bc0 &^ bc4) - a[14] = bc4 ^ (bc1 &^ bc0) - - t = a[15] ^ d0 - bc1 = t<<36 | t>>(64-36) - t = a[16] ^ d1 - bc2 = t<<10 | t>>(64-10) - t = a[17] ^ d2 - bc3 = t<<15 | t>>(64-15) - t = a[18] ^ d3 - bc4 = t<<56 | t>>(64-56) - t = a[19] ^ d4 - bc0 = t<<27 | t>>(64-27) - a[15] = bc0 ^ (bc2 &^ bc1) - a[16] = bc1 ^ (bc3 &^ bc2) - a[17] = bc2 ^ (bc4 &^ bc3) - a[18] = bc3 ^ (bc0 &^ bc4) - a[19] = bc4 ^ (bc1 &^ bc0) - - t = a[20] ^ d0 - bc3 = t<<41 | t>>(64-41) - t = a[21] ^ d1 - bc4 = t<<2 | t>>(64-2) - t = a[22] ^ d2 - bc0 = t<<62 | t>>(64-62) - t = a[23] ^ d3 - bc1 = t<<55 | t>>(64-55) - t = a[24] ^ d4 - bc2 = t<<39 | t>>(64-39) - a[20] = bc0 ^ (bc2 &^ bc1) - a[21] = bc1 ^ (bc3 &^ bc2) - a[22] = bc2 ^ (bc4 &^ bc3) - a[23] = bc3 ^ (bc0 &^ bc4) - a[24] = bc4 ^ (bc1 &^ bc0) - } -} diff --git a/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go deleted file mode 100644 index 788679585027..000000000000 --- a/vendor/golang.org/x/crypto/sha3/keccakf_amd64.go +++ /dev/null @@ -1,13 +0,0 @@ -// 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. - -// +build amd64,!appengine,!gccgo - -package sha3 - -// This function is implemented in keccakf_amd64.s. - -//go:noescape - -func keccakF1600(a *[25]uint64) diff --git a/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s b/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s deleted file mode 100644 index f88533accd44..000000000000 --- a/vendor/golang.org/x/crypto/sha3/keccakf_amd64.s +++ /dev/null @@ -1,390 +0,0 @@ -// 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. - -// +build amd64,!appengine,!gccgo - -// This code was translated into a form compatible with 6a from the public -// domain sources at https://github.com/gvanas/KeccakCodePackage - -// Offsets in state -#define _ba (0*8) -#define _be (1*8) -#define _bi (2*8) -#define _bo (3*8) -#define _bu (4*8) -#define _ga (5*8) -#define _ge (6*8) -#define _gi (7*8) -#define _go (8*8) -#define _gu (9*8) -#define _ka (10*8) -#define _ke (11*8) -#define _ki (12*8) -#define _ko (13*8) -#define _ku (14*8) -#define _ma (15*8) -#define _me (16*8) -#define _mi (17*8) -#define _mo (18*8) -#define _mu (19*8) -#define _sa (20*8) -#define _se (21*8) -#define _si (22*8) -#define _so (23*8) -#define _su (24*8) - -// Temporary registers -#define rT1 AX - -// Round vars -#define rpState DI -#define rpStack SP - -#define rDa BX -#define rDe CX -#define rDi DX -#define rDo R8 -#define rDu R9 - -#define rBa R10 -#define rBe R11 -#define rBi R12 -#define rBo R13 -#define rBu R14 - -#define rCa SI -#define rCe BP -#define rCi rBi -#define rCo rBo -#define rCu R15 - -#define MOVQ_RBI_RCE MOVQ rBi, rCe -#define XORQ_RT1_RCA XORQ rT1, rCa -#define XORQ_RT1_RCE XORQ rT1, rCe -#define XORQ_RBA_RCU XORQ rBa, rCu -#define XORQ_RBE_RCU XORQ rBe, rCu -#define XORQ_RDU_RCU XORQ rDu, rCu -#define XORQ_RDA_RCA XORQ rDa, rCa -#define XORQ_RDE_RCE XORQ rDe, rCe - -#define mKeccakRound(iState, oState, rc, B_RBI_RCE, G_RT1_RCA, G_RT1_RCE, G_RBA_RCU, K_RT1_RCA, K_RT1_RCE, K_RBA_RCU, M_RT1_RCA, M_RT1_RCE, M_RBE_RCU, S_RDU_RCU, S_RDA_RCA, S_RDE_RCE) \ - /* Prepare round */ \ - MOVQ rCe, rDa; \ - ROLQ $1, rDa; \ - \ - MOVQ _bi(iState), rCi; \ - XORQ _gi(iState), rDi; \ - XORQ rCu, rDa; \ - XORQ _ki(iState), rCi; \ - XORQ _mi(iState), rDi; \ - XORQ rDi, rCi; \ - \ - MOVQ rCi, rDe; \ - ROLQ $1, rDe; \ - \ - MOVQ _bo(iState), rCo; \ - XORQ _go(iState), rDo; \ - XORQ rCa, rDe; \ - XORQ _ko(iState), rCo; \ - XORQ _mo(iState), rDo; \ - XORQ rDo, rCo; \ - \ - MOVQ rCo, rDi; \ - ROLQ $1, rDi; \ - \ - MOVQ rCu, rDo; \ - XORQ rCe, rDi; \ - ROLQ $1, rDo; \ - \ - MOVQ rCa, rDu; \ - XORQ rCi, rDo; \ - ROLQ $1, rDu; \ - \ - /* Result b */ \ - MOVQ _ba(iState), rBa; \ - MOVQ _ge(iState), rBe; \ - XORQ rCo, rDu; \ - MOVQ _ki(iState), rBi; \ - MOVQ _mo(iState), rBo; \ - MOVQ _su(iState), rBu; \ - XORQ rDe, rBe; \ - ROLQ $44, rBe; \ - XORQ rDi, rBi; \ - XORQ rDa, rBa; \ - ROLQ $43, rBi; \ - \ - MOVQ rBe, rCa; \ - MOVQ rc, rT1; \ - ORQ rBi, rCa; \ - XORQ rBa, rT1; \ - XORQ rT1, rCa; \ - MOVQ rCa, _ba(oState); \ - \ - XORQ rDu, rBu; \ - ROLQ $14, rBu; \ - MOVQ rBa, rCu; \ - ANDQ rBe, rCu; \ - XORQ rBu, rCu; \ - MOVQ rCu, _bu(oState); \ - \ - XORQ rDo, rBo; \ - ROLQ $21, rBo; \ - MOVQ rBo, rT1; \ - ANDQ rBu, rT1; \ - XORQ rBi, rT1; \ - MOVQ rT1, _bi(oState); \ - \ - NOTQ rBi; \ - ORQ rBa, rBu; \ - ORQ rBo, rBi; \ - XORQ rBo, rBu; \ - XORQ rBe, rBi; \ - MOVQ rBu, _bo(oState); \ - MOVQ rBi, _be(oState); \ - B_RBI_RCE; \ - \ - /* Result g */ \ - MOVQ _gu(iState), rBe; \ - XORQ rDu, rBe; \ - MOVQ _ka(iState), rBi; \ - ROLQ $20, rBe; \ - XORQ rDa, rBi; \ - ROLQ $3, rBi; \ - MOVQ _bo(iState), rBa; \ - MOVQ rBe, rT1; \ - ORQ rBi, rT1; \ - XORQ rDo, rBa; \ - MOVQ _me(iState), rBo; \ - MOVQ _si(iState), rBu; \ - ROLQ $28, rBa; \ - XORQ rBa, rT1; \ - MOVQ rT1, _ga(oState); \ - G_RT1_RCA; \ - \ - XORQ rDe, rBo; \ - ROLQ $45, rBo; \ - MOVQ rBi, rT1; \ - ANDQ rBo, rT1; \ - XORQ rBe, rT1; \ - MOVQ rT1, _ge(oState); \ - G_RT1_RCE; \ - \ - XORQ rDi, rBu; \ - ROLQ $61, rBu; \ - MOVQ rBu, rT1; \ - ORQ rBa, rT1; \ - XORQ rBo, rT1; \ - MOVQ rT1, _go(oState); \ - \ - ANDQ rBe, rBa; \ - XORQ rBu, rBa; \ - MOVQ rBa, _gu(oState); \ - NOTQ rBu; \ - G_RBA_RCU; \ - \ - ORQ rBu, rBo; \ - XORQ rBi, rBo; \ - MOVQ rBo, _gi(oState); \ - \ - /* Result k */ \ - MOVQ _be(iState), rBa; \ - MOVQ _gi(iState), rBe; \ - MOVQ _ko(iState), rBi; \ - MOVQ _mu(iState), rBo; \ - MOVQ _sa(iState), rBu; \ - XORQ rDi, rBe; \ - ROLQ $6, rBe; \ - XORQ rDo, rBi; \ - ROLQ $25, rBi; \ - MOVQ rBe, rT1; \ - ORQ rBi, rT1; \ - XORQ rDe, rBa; \ - ROLQ $1, rBa; \ - XORQ rBa, rT1; \ - MOVQ rT1, _ka(oState); \ - K_RT1_RCA; \ - \ - XORQ rDu, rBo; \ - ROLQ $8, rBo; \ - MOVQ rBi, rT1; \ - ANDQ rBo, rT1; \ - XORQ rBe, rT1; \ - MOVQ rT1, _ke(oState); \ - K_RT1_RCE; \ - \ - XORQ rDa, rBu; \ - ROLQ $18, rBu; \ - NOTQ rBo; \ - MOVQ rBo, rT1; \ - ANDQ rBu, rT1; \ - XORQ rBi, rT1; \ - MOVQ rT1, _ki(oState); \ - \ - MOVQ rBu, rT1; \ - ORQ rBa, rT1; \ - XORQ rBo, rT1; \ - MOVQ rT1, _ko(oState); \ - \ - ANDQ rBe, rBa; \ - XORQ rBu, rBa; \ - MOVQ rBa, _ku(oState); \ - K_RBA_RCU; \ - \ - /* Result m */ \ - MOVQ _ga(iState), rBe; \ - XORQ rDa, rBe; \ - MOVQ _ke(iState), rBi; \ - ROLQ $36, rBe; \ - XORQ rDe, rBi; \ - MOVQ _bu(iState), rBa; \ - ROLQ $10, rBi; \ - MOVQ rBe, rT1; \ - MOVQ _mi(iState), rBo; \ - ANDQ rBi, rT1; \ - XORQ rDu, rBa; \ - MOVQ _so(iState), rBu; \ - ROLQ $27, rBa; \ - XORQ rBa, rT1; \ - MOVQ rT1, _ma(oState); \ - M_RT1_RCA; \ - \ - XORQ rDi, rBo; \ - ROLQ $15, rBo; \ - MOVQ rBi, rT1; \ - ORQ rBo, rT1; \ - XORQ rBe, rT1; \ - MOVQ rT1, _me(oState); \ - M_RT1_RCE; \ - \ - XORQ rDo, rBu; \ - ROLQ $56, rBu; \ - NOTQ rBo; \ - MOVQ rBo, rT1; \ - ORQ rBu, rT1; \ - XORQ rBi, rT1; \ - MOVQ rT1, _mi(oState); \ - \ - ORQ rBa, rBe; \ - XORQ rBu, rBe; \ - MOVQ rBe, _mu(oState); \ - \ - ANDQ rBa, rBu; \ - XORQ rBo, rBu; \ - MOVQ rBu, _mo(oState); \ - M_RBE_RCU; \ - \ - /* Result s */ \ - MOVQ _bi(iState), rBa; \ - MOVQ _go(iState), rBe; \ - MOVQ _ku(iState), rBi; \ - XORQ rDi, rBa; \ - MOVQ _ma(iState), rBo; \ - ROLQ $62, rBa; \ - XORQ rDo, rBe; \ - MOVQ _se(iState), rBu; \ - ROLQ $55, rBe; \ - \ - XORQ rDu, rBi; \ - MOVQ rBa, rDu; \ - XORQ rDe, rBu; \ - ROLQ $2, rBu; \ - ANDQ rBe, rDu; \ - XORQ rBu, rDu; \ - MOVQ rDu, _su(oState); \ - \ - ROLQ $39, rBi; \ - S_RDU_RCU; \ - NOTQ rBe; \ - XORQ rDa, rBo; \ - MOVQ rBe, rDa; \ - ANDQ rBi, rDa; \ - XORQ rBa, rDa; \ - MOVQ rDa, _sa(oState); \ - S_RDA_RCA; \ - \ - ROLQ $41, rBo; \ - MOVQ rBi, rDe; \ - ORQ rBo, rDe; \ - XORQ rBe, rDe; \ - MOVQ rDe, _se(oState); \ - S_RDE_RCE; \ - \ - MOVQ rBo, rDi; \ - MOVQ rBu, rDo; \ - ANDQ rBu, rDi; \ - ORQ rBa, rDo; \ - XORQ rBi, rDi; \ - XORQ rBo, rDo; \ - MOVQ rDi, _si(oState); \ - MOVQ rDo, _so(oState) \ - -// func keccakF1600(state *[25]uint64) -TEXT ·keccakF1600(SB), 0, $200-8 - MOVQ state+0(FP), rpState - - // Convert the user state into an internal state - NOTQ _be(rpState) - NOTQ _bi(rpState) - NOTQ _go(rpState) - NOTQ _ki(rpState) - NOTQ _mi(rpState) - NOTQ _sa(rpState) - - // Execute the KeccakF permutation - MOVQ _ba(rpState), rCa - MOVQ _be(rpState), rCe - MOVQ _bu(rpState), rCu - - XORQ _ga(rpState), rCa - XORQ _ge(rpState), rCe - XORQ _gu(rpState), rCu - - XORQ _ka(rpState), rCa - XORQ _ke(rpState), rCe - XORQ _ku(rpState), rCu - - XORQ _ma(rpState), rCa - XORQ _me(rpState), rCe - XORQ _mu(rpState), rCu - - XORQ _sa(rpState), rCa - XORQ _se(rpState), rCe - MOVQ _si(rpState), rDi - MOVQ _so(rpState), rDo - XORQ _su(rpState), rCu - - mKeccakRound(rpState, rpStack, $0x0000000000000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x0000000000008082, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x800000000000808a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x8000000080008000, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x000000000000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x8000000000008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x000000000000008a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x0000000000000088, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x0000000080008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x000000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x000000008000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x800000000000008b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x8000000000008089, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x8000000000008003, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x8000000000008002, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x8000000000000080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x000000000000800a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x800000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x8000000000008080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpState, rpStack, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) - mKeccakRound(rpStack, rpState, $0x8000000080008008, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP) - - // Revert the internal state to the user state - NOTQ _be(rpState) - NOTQ _bi(rpState) - NOTQ _go(rpState) - NOTQ _ki(rpState) - NOTQ _mi(rpState) - NOTQ _sa(rpState) - - RET diff --git a/vendor/golang.org/x/crypto/sha3/register.go b/vendor/golang.org/x/crypto/sha3/register.go deleted file mode 100644 index 3cf6a22e093a..000000000000 --- a/vendor/golang.org/x/crypto/sha3/register.go +++ /dev/null @@ -1,18 +0,0 @@ -// 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 go1.4 - -package sha3 - -import ( - "crypto" -) - -func init() { - crypto.RegisterHash(crypto.SHA3_224, New224) - crypto.RegisterHash(crypto.SHA3_256, New256) - crypto.RegisterHash(crypto.SHA3_384, New384) - crypto.RegisterHash(crypto.SHA3_512, New512) -} diff --git a/vendor/golang.org/x/crypto/sha3/sha3.go b/vendor/golang.org/x/crypto/sha3/sha3.go deleted file mode 100644 index b12a35c87fc8..000000000000 --- a/vendor/golang.org/x/crypto/sha3/sha3.go +++ /dev/null @@ -1,192 +0,0 @@ -// 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. - -package sha3 - -// spongeDirection indicates the direction bytes are flowing through the sponge. -type spongeDirection int - -const ( - // spongeAbsorbing indicates that the sponge is absorbing input. - spongeAbsorbing spongeDirection = iota - // spongeSqueezing indicates that the sponge is being squeezed. - spongeSqueezing -) - -const ( - // maxRate is the maximum size of the internal buffer. SHAKE-256 - // currently needs the largest buffer. - maxRate = 168 -) - -type state struct { - // Generic sponge components. - a [25]uint64 // main state of the hash - buf []byte // points into storage - rate int // the number of bytes of state to use - - // dsbyte contains the "domain separation" bits and the first bit of - // the padding. Sections 6.1 and 6.2 of [1] separate the outputs of the - // SHA-3 and SHAKE functions by appending bitstrings to the message. - // Using a little-endian bit-ordering convention, these are "01" for SHA-3 - // and "1111" for SHAKE, or 00000010b and 00001111b, respectively. Then the - // padding rule from section 5.1 is applied to pad the message to a multiple - // of the rate, which involves adding a "1" bit, zero or more "0" bits, and - // a final "1" bit. We merge the first "1" bit from the padding into dsbyte, - // giving 00000110b (0x06) and 00011111b (0x1f). - // [1] http://csrc.nist.gov/publications/drafts/fips-202/fips_202_draft.pdf - // "Draft FIPS 202: SHA-3 Standard: Permutation-Based Hash and - // Extendable-Output Functions (May 2014)" - dsbyte byte - storage [maxRate]byte - - // Specific to SHA-3 and SHAKE. - 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. -func (d *state) BlockSize() int { return d.rate } - -// Size returns the output size of the hash function in bytes. -func (d *state) Size() int { return d.outputLen } - -// Reset clears the internal state by zeroing the sponge state and -// the byte buffer, and setting Sponge.state to absorbing. -func (d *state) Reset() { - // Zero the permutation's state. - for i := range d.a { - d.a[i] = 0 - } - d.state = spongeAbsorbing - d.buf = d.storage[:0] -} - -func (d *state) clone() *state { - ret := *d - if ret.state == spongeAbsorbing { - ret.buf = ret.storage[:len(ret.buf)] - } else { - ret.buf = ret.storage[d.rate-cap(d.buf) : d.rate] - } - - return &ret -} - -// permute applies the KeccakF-1600 permutation. It handles -// any input-output buffering. -func (d *state) permute() { - switch d.state { - case spongeAbsorbing: - // If we're absorbing, we need to xor the input into the state - // before applying the permutation. - xorIn(d, d.buf) - d.buf = d.storage[:0] - keccakF1600(&d.a) - case spongeSqueezing: - // If we're squeezing, we need to apply the permutatin before - // copying more output. - keccakF1600(&d.a) - d.buf = d.storage[:d.rate] - copyOut(d, d.buf) - } -} - -// pads appends the domain separation bits in dsbyte, applies -// the multi-bitrate 10..1 padding rule, and permutes the state. -func (d *state) padAndPermute(dsbyte byte) { - if d.buf == nil { - d.buf = d.storage[:0] - } - // Pad with this instance's domain-separator bits. We know that there's - // at least one byte of space in d.buf because, if it were full, - // permute would have been called to empty it. dsbyte also contains the - // first one bit for the padding. See the comment in the state struct. - d.buf = append(d.buf, dsbyte) - zerosStart := len(d.buf) - d.buf = d.storage[:d.rate] - for i := zerosStart; i < d.rate; i++ { - d.buf[i] = 0 - } - // This adds the final one bit for the padding. Because of the way that - // bits are numbered from the LSB upwards, the final bit is the MSB of - // the last byte. - d.buf[d.rate-1] ^= 0x80 - // Apply the permutation - d.permute() - d.state = spongeSqueezing - d.buf = d.storage[:d.rate] - copyOut(d, d.buf) -} - -// Write absorbs more data into the hash's state. It produces an error -// if more data is written to the ShakeHash after writing -func (d *state) Write(p []byte) (written int, err error) { - if d.state != spongeAbsorbing { - panic("sha3: write to sponge after read") - } - if d.buf == nil { - d.buf = d.storage[:0] - } - written = len(p) - - for len(p) > 0 { - if len(d.buf) == 0 && len(p) >= d.rate { - // The fast path; absorb a full "rate" bytes of input and apply the permutation. - xorIn(d, p[:d.rate]) - p = p[d.rate:] - keccakF1600(&d.a) - } else { - // The slow path; buffer the input until we can fill the sponge, and then xor it in. - todo := d.rate - len(d.buf) - if todo > len(p) { - todo = len(p) - } - d.buf = append(d.buf, p[:todo]...) - p = p[todo:] - - // If the sponge is full, apply the permutation. - if len(d.buf) == d.rate { - d.permute() - } - } - } - - return -} - -// Read squeezes an arbitrary number of bytes from the sponge. -func (d *state) Read(out []byte) (n int, err error) { - // If we're still absorbing, pad and apply the permutation. - if d.state == spongeAbsorbing { - d.padAndPermute(d.dsbyte) - } - - n = len(out) - - // Now, do the squeezing. - for len(out) > 0 { - n := copy(out, d.buf) - d.buf = d.buf[n:] - out = out[n:] - - // Apply the permutation if we've squeezed the sponge dry. - if len(d.buf) == 0 { - d.permute() - } - } - - return -} - -// Sum applies padding to the hash state and then squeezes out the desired -// number of output bytes. -func (d *state) Sum(in []byte) []byte { - // Make a copy of the original hash so that caller can keep writing - // and summing. - dup := d.clone() - hash := make([]byte, dup.outputLen) - dup.Read(hash) - return append(in, hash...) -} diff --git a/vendor/golang.org/x/crypto/sha3/sha3_s390x.go b/vendor/golang.org/x/crypto/sha3/sha3_s390x.go deleted file mode 100644 index f1fb79cc391e..000000000000 --- a/vendor/golang.org/x/crypto/sha3/sha3_s390x.go +++ /dev/null @@ -1,289 +0,0 @@ -// 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,!appengine - -package sha3 - -// This file contains code for using the 'compute intermediate -// message digest' (KIMD) and 'compute last message digest' (KLMD) -// instructions to compute SHA-3 and SHAKE hashes on IBM Z. - -import ( - "hash" -) - -// codes represent 7-bit KIMD/KLMD function codes as defined in -// the Principles of Operation. -type code uint64 - -const ( - // function codes for KIMD/KLMD - sha3_224 code = 32 - sha3_256 = 33 - sha3_384 = 34 - sha3_512 = 35 - shake_128 = 36 - shake_256 = 37 - nopad = 0x100 -) - -// hasMSA6 reports whether the machine supports the SHA-3 and SHAKE function -// codes, as defined in message-security-assist extension 6. -func hasMSA6() bool - -// hasAsm caches the result of hasMSA6 (which might be expensive to call). -var hasAsm = hasMSA6() - -// kimd is a wrapper for the 'compute intermediate message digest' instruction. -// src must be a multiple of the rate for the given function code. -//go:noescape -func kimd(function code, chain *[200]byte, src []byte) - -// klmd is a wrapper for the 'compute last message digest' instruction. -// src padding is handled by the instruction. -//go:noescape -func klmd(function code, chain *[200]byte, dst, src []byte) - -type asmState struct { - a [200]byte // 1600 bit state - buf []byte // care must be taken to ensure cap(buf) is a multiple of rate - rate int // equivalent to block size - storage [3072]byte // underlying storage for buf - outputLen int // output length if fixed, 0 if not - function code // KIMD/KLMD function code - state spongeDirection // whether the sponge is absorbing or squeezing -} - -func newAsmState(function code) *asmState { - var s asmState - s.function = function - switch function { - case sha3_224: - s.rate = 144 - s.outputLen = 28 - case sha3_256: - s.rate = 136 - s.outputLen = 32 - case sha3_384: - s.rate = 104 - s.outputLen = 48 - case sha3_512: - s.rate = 72 - s.outputLen = 64 - case shake_128: - s.rate = 168 - case shake_256: - s.rate = 136 - default: - panic("sha3: unrecognized function code") - } - - // limit s.buf size to a multiple of s.rate - s.resetBuf() - return &s -} - -func (s *asmState) clone() *asmState { - c := *s - c.buf = c.storage[:len(s.buf):cap(s.buf)] - return &c -} - -// copyIntoBuf copies b into buf. It will panic if there is not enough space to -// store all of b. -func (s *asmState) copyIntoBuf(b []byte) { - bufLen := len(s.buf) - s.buf = s.buf[:len(s.buf)+len(b)] - copy(s.buf[bufLen:], b) -} - -// resetBuf points buf at storage, sets the length to 0 and sets cap to be a -// multiple of the rate. -func (s *asmState) resetBuf() { - max := (cap(s.storage) / s.rate) * s.rate - s.buf = s.storage[:0:max] -} - -// Write (via the embedded io.Writer interface) adds more data to the running hash. -// It never returns an error. -func (s *asmState) Write(b []byte) (int, error) { - if s.state != spongeAbsorbing { - panic("sha3: write to sponge after read") - } - length := len(b) - for len(b) > 0 { - if len(s.buf) == 0 && len(b) >= cap(s.buf) { - // Hash the data directly and push any remaining bytes - // into the buffer. - remainder := len(s.buf) % s.rate - kimd(s.function, &s.a, b[:len(b)-remainder]) - if remainder != 0 { - s.copyIntoBuf(b[len(b)-remainder:]) - } - return length, nil - } - - if len(s.buf) == cap(s.buf) { - // flush the buffer - kimd(s.function, &s.a, s.buf) - s.buf = s.buf[:0] - } - - // copy as much as we can into the buffer - n := len(b) - if len(b) > cap(s.buf)-len(s.buf) { - n = cap(s.buf) - len(s.buf) - } - s.copyIntoBuf(b[:n]) - b = b[n:] - } - return length, nil -} - -// Read squeezes an arbitrary number of bytes from the sponge. -func (s *asmState) Read(out []byte) (n int, err error) { - n = len(out) - - // need to pad if we were absorbing - if s.state == spongeAbsorbing { - s.state = spongeSqueezing - - // write hash directly into out if possible - if len(out)%s.rate == 0 { - klmd(s.function, &s.a, out, s.buf) // len(out) may be 0 - s.buf = s.buf[:0] - return - } - - // write hash into buffer - max := cap(s.buf) - if max > len(out) { - max = (len(out)/s.rate)*s.rate + s.rate - } - klmd(s.function, &s.a, s.buf[:max], s.buf) - s.buf = s.buf[:max] - } - - for len(out) > 0 { - // flush the buffer - if len(s.buf) != 0 { - c := copy(out, s.buf) - out = out[c:] - s.buf = s.buf[c:] - continue - } - - // write hash directly into out if possible - if len(out)%s.rate == 0 { - klmd(s.function|nopad, &s.a, out, nil) - return - } - - // write hash into buffer - s.resetBuf() - if cap(s.buf) > len(out) { - s.buf = s.buf[:(len(out)/s.rate)*s.rate+s.rate] - } - klmd(s.function|nopad, &s.a, s.buf, nil) - } - return -} - -// Sum appends the current hash to b and returns the resulting slice. -// It does not change the underlying hash state. -func (s *asmState) Sum(b []byte) []byte { - if s.outputLen == 0 { - panic("sha3: cannot call Sum on SHAKE functions") - } - - // Copy the state to preserve the original. - a := s.a - - // Hash the buffer. Note that we don't clear it because we - // aren't updating the state. - klmd(s.function, &a, nil, s.buf) - return append(b, a[:s.outputLen]...) -} - -// Reset resets the Hash to its initial state. -func (s *asmState) Reset() { - for i := range s.a { - s.a[i] = 0 - } - s.resetBuf() - s.state = spongeAbsorbing -} - -// Size returns the number of bytes Sum will return. -func (s *asmState) Size() int { - return s.outputLen -} - -// BlockSize returns the hash's underlying block size. -// The Write method must be able to accept any amount -// of data, but it may operate more efficiently if all writes -// are a multiple of the block size. -func (s *asmState) BlockSize() int { - return s.rate -} - -// Clone returns a copy of the ShakeHash in its current state. -func (s *asmState) Clone() ShakeHash { - return s.clone() -} - -// new224Asm returns an assembly implementation of SHA3-224 if available, -// otherwise it returns nil. -func new224Asm() hash.Hash { - if hasAsm { - return newAsmState(sha3_224) - } - return nil -} - -// new256Asm returns an assembly implementation of SHA3-256 if available, -// otherwise it returns nil. -func new256Asm() hash.Hash { - if hasAsm { - return newAsmState(sha3_256) - } - return nil -} - -// new384Asm returns an assembly implementation of SHA3-384 if available, -// otherwise it returns nil. -func new384Asm() hash.Hash { - if hasAsm { - return newAsmState(sha3_384) - } - return nil -} - -// new512Asm returns an assembly implementation of SHA3-512 if available, -// otherwise it returns nil. -func new512Asm() hash.Hash { - if hasAsm { - return newAsmState(sha3_512) - } - return nil -} - -// newShake128Asm returns an assembly implementation of SHAKE-128 if available, -// otherwise it returns nil. -func newShake128Asm() ShakeHash { - if hasAsm { - return newAsmState(shake_128) - } - return nil -} - -// newShake256Asm returns an assembly implementation of SHAKE-256 if available, -// otherwise it returns nil. -func newShake256Asm() ShakeHash { - if hasAsm { - return newAsmState(shake_256) - } - return nil -} diff --git a/vendor/golang.org/x/crypto/sha3/sha3_s390x.s b/vendor/golang.org/x/crypto/sha3/sha3_s390x.s deleted file mode 100644 index 20978fc7138e..000000000000 --- a/vendor/golang.org/x/crypto/sha3/sha3_s390x.s +++ /dev/null @@ -1,49 +0,0 @@ -// 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,!appengine - -#include "textflag.h" - -TEXT ·hasMSA6(SB), NOSPLIT, $16-1 - MOVD $0, R0 // KIMD-Query function code - MOVD $tmp-16(SP), R1 // parameter block - XC $16, (R1), (R1) // clear the parameter block - WORD $0xB93E0002 // KIMD --, -- - WORD $0x91FC1004 // TM 4(R1), 0xFC (test bits [32-37]) - BVS yes - -no: - MOVB $0, ret+0(FP) - RET - -yes: - MOVB $1, ret+0(FP) - RET - -// func kimd(function code, params *[200]byte, src []byte) -TEXT ·kimd(SB), NOFRAME|NOSPLIT, $0-40 - MOVD function+0(FP), R0 - MOVD params+8(FP), R1 - LMG src+16(FP), R2, R3 // R2=base, R3=len - -continue: - WORD $0xB93E0002 // KIMD --, R2 - BVS continue // continue if interrupted - MOVD $0, R0 // reset R0 for pre-go1.8 compilers - RET - -// func klmd(function code, params *[200]byte, dst, src []byte) -TEXT ·klmd(SB), NOFRAME|NOSPLIT, $0-64 - // TODO: SHAKE support - MOVD function+0(FP), R0 - MOVD params+8(FP), R1 - LMG dst+16(FP), R2, R3 // R2=base, R3=len - LMG src+40(FP), R4, R5 // R4=base, R5=len - -continue: - WORD $0xB93F0024 // KLMD R2, R4 - BVS continue // continue if interrupted - MOVD $0, R0 // reset R0 for pre-go1.8 compilers - RET diff --git a/vendor/golang.org/x/crypto/sha3/shake.go b/vendor/golang.org/x/crypto/sha3/shake.go deleted file mode 100644 index 97c9b0624a34..000000000000 --- a/vendor/golang.org/x/crypto/sha3/shake.go +++ /dev/null @@ -1,70 +0,0 @@ -// 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. - -package sha3 - -// This file defines the ShakeHash interface, and provides -// functions for creating SHAKE instances, as well as utility -// functions for hashing bytes to arbitrary-length output. - -import ( - "io" -) - -// ShakeHash defines the interface to hash functions that -// support arbitrary-length output. -type ShakeHash interface { - // Write absorbs more data into the hash's state. It panics if input is - // written to it after output has been read from it. - io.Writer - - // Read reads more output from the hash; reading affects the hash's - // state. (ShakeHash.Read is thus very different from Hash.Sum) - // It never returns an error. - io.Reader - - // Clone returns a copy of the ShakeHash in its current state. - Clone() ShakeHash - - // Reset resets the ShakeHash to its initial state. - Reset() -} - -func (d *state) Clone() ShakeHash { - return d.clone() -} - -// NewShake128 creates a new SHAKE128 variable-output-length ShakeHash. -// Its generic security strength is 128 bits against all attacks if at -// least 32 bytes of its output are used. -func NewShake128() ShakeHash { - if h := newShake128Asm(); h != nil { - return h - } - return &state{rate: 168, dsbyte: 0x1f} -} - -// NewShake256 creates a new SHAKE256 variable-output-length ShakeHash. -// Its generic security strength is 256 bits against all attacks if -// at least 64 bytes of its output are used. -func NewShake256() ShakeHash { - if h := newShake256Asm(); h != nil { - return h - } - return &state{rate: 136, dsbyte: 0x1f} -} - -// ShakeSum128 writes an arbitrary-length digest of data into hash. -func ShakeSum128(hash, data []byte) { - h := NewShake128() - h.Write(data) - h.Read(hash) -} - -// ShakeSum256 writes an arbitrary-length digest of data into hash. -func ShakeSum256(hash, data []byte) { - h := NewShake256() - h.Write(data) - h.Read(hash) -} diff --git a/vendor/golang.org/x/crypto/sha3/shake_generic.go b/vendor/golang.org/x/crypto/sha3/shake_generic.go deleted file mode 100644 index 73d0c90bf53c..000000000000 --- a/vendor/golang.org/x/crypto/sha3/shake_generic.go +++ /dev/null @@ -1,19 +0,0 @@ -// 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 appengine !s390x - -package sha3 - -// newShake128Asm returns an assembly implementation of SHAKE-128 if available, -// otherwise it returns nil. -func newShake128Asm() ShakeHash { - return nil -} - -// newShake256Asm returns an assembly implementation of SHAKE-256 if available, -// otherwise it returns nil. -func newShake256Asm() ShakeHash { - return nil -} diff --git a/vendor/golang.org/x/crypto/sha3/xor.go b/vendor/golang.org/x/crypto/sha3/xor.go deleted file mode 100644 index 46a0d63a6dfe..000000000000 --- a/vendor/golang.org/x/crypto/sha3/xor.go +++ /dev/null @@ -1,16 +0,0 @@ -// 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. - -// +build !amd64,!386,!ppc64le appengine - -package sha3 - -var ( - xorIn = xorInGeneric - copyOut = copyOutGeneric - xorInUnaligned = xorInGeneric - copyOutUnaligned = copyOutGeneric -) - -const xorImplementationUnaligned = "generic" diff --git a/vendor/golang.org/x/crypto/sha3/xor_generic.go b/vendor/golang.org/x/crypto/sha3/xor_generic.go deleted file mode 100644 index fd35f02ef6e0..000000000000 --- a/vendor/golang.org/x/crypto/sha3/xor_generic.go +++ /dev/null @@ -1,28 +0,0 @@ -// 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. - -package sha3 - -import "encoding/binary" - -// xorInGeneric xors the bytes in buf into the state; it -// makes no non-portable assumptions about memory layout -// or alignment. -func xorInGeneric(d *state, buf []byte) { - n := len(buf) / 8 - - for i := 0; i < n; i++ { - a := binary.LittleEndian.Uint64(buf) - d.a[i] ^= a - buf = buf[8:] - } -} - -// copyOutGeneric copies ulint64s to a byte buffer. -func copyOutGeneric(d *state, b []byte) { - for i := 0; len(b) >= 8; i++ { - binary.LittleEndian.PutUint64(b, d.a[i]) - b = b[8:] - } -} diff --git a/vendor/golang.org/x/crypto/sha3/xor_unaligned.go b/vendor/golang.org/x/crypto/sha3/xor_unaligned.go deleted file mode 100644 index 929a486a79d6..000000000000 --- a/vendor/golang.org/x/crypto/sha3/xor_unaligned.go +++ /dev/null @@ -1,58 +0,0 @@ -// 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. - -// +build amd64 386 ppc64le -// +build !appengine - -package sha3 - -import "unsafe" - -func xorInUnaligned(d *state, buf []byte) { - bw := (*[maxRate / 8]uint64)(unsafe.Pointer(&buf[0])) - n := len(buf) - if n >= 72 { - d.a[0] ^= bw[0] - d.a[1] ^= bw[1] - d.a[2] ^= bw[2] - d.a[3] ^= bw[3] - d.a[4] ^= bw[4] - d.a[5] ^= bw[5] - d.a[6] ^= bw[6] - d.a[7] ^= bw[7] - d.a[8] ^= bw[8] - } - if n >= 104 { - d.a[9] ^= bw[9] - d.a[10] ^= bw[10] - d.a[11] ^= bw[11] - d.a[12] ^= bw[12] - } - if n >= 136 { - d.a[13] ^= bw[13] - d.a[14] ^= bw[14] - d.a[15] ^= bw[15] - d.a[16] ^= bw[16] - } - if n >= 144 { - d.a[17] ^= bw[17] - } - if n >= 168 { - d.a[18] ^= bw[18] - d.a[19] ^= bw[19] - d.a[20] ^= bw[20] - } -} - -func copyOutUnaligned(d *state, buf []byte) { - ab := (*[maxRate]uint8)(unsafe.Pointer(&d.a[0])) - copy(buf, ab[:]) -} - -var ( - xorIn = xorInUnaligned - copyOut = copyOutUnaligned -) - -const xorImplementationUnaligned = "unaligned" diff --git a/vendor/golang.org/x/crypto/ssh/buffer.go b/vendor/golang.org/x/crypto/ssh/buffer.go deleted file mode 100644 index 1ab07d078db1..000000000000 --- a/vendor/golang.org/x/crypto/ssh/buffer.go +++ /dev/null @@ -1,97 +0,0 @@ -// 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 ssh - -import ( - "io" - "sync" -) - -// buffer provides a linked list buffer for data exchange -// between producer and consumer. Theoretically the buffer is -// of unlimited capacity as it does no allocation of its own. -type buffer struct { - // protects concurrent access to head, tail and closed - *sync.Cond - - head *element // the buffer that will be read first - tail *element // the buffer that will be read last - - closed bool -} - -// An element represents a single link in a linked list. -type element struct { - buf []byte - next *element -} - -// newBuffer returns an empty buffer that is not closed. -func newBuffer() *buffer { - e := new(element) - b := &buffer{ - Cond: newCond(), - head: e, - tail: e, - } - return b -} - -// write makes buf available for Read to receive. -// buf must not be modified after the call to write. -func (b *buffer) write(buf []byte) { - b.Cond.L.Lock() - e := &element{buf: buf} - b.tail.next = e - b.tail = e - b.Cond.Signal() - b.Cond.L.Unlock() -} - -// eof closes the buffer. Reads from the buffer once all -// 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() -} - -// Read reads data from the internal buffer in buf. Reads will block -// if no data is available, or until the buffer is closed. -func (b *buffer) Read(buf []byte) (n int, err error) { - b.Cond.L.Lock() - defer b.Cond.L.Unlock() - - for len(buf) > 0 { - // if there is data in b.head, copy it - if len(b.head.buf) > 0 { - r := copy(buf, b.head.buf) - buf, b.head.buf = buf[r:], b.head.buf[r:] - n += r - continue - } - // if there is a next buffer, make it the head - if len(b.head.buf) == 0 && b.head != b.tail { - b.head = b.head.next - continue - } - - // if at least one byte has been copied, return - if n > 0 { - break - } - - // if nothing was read, and there is nothing outstanding - // check to see if the buffer is closed. - if b.closed { - err = io.EOF - break - } - // out of buffers, wait for producer - b.Cond.Wait() - } - return -} diff --git a/vendor/golang.org/x/crypto/ssh/certs.go b/vendor/golang.org/x/crypto/ssh/certs.go deleted file mode 100644 index 00ed9923e784..000000000000 --- a/vendor/golang.org/x/crypto/ssh/certs.go +++ /dev/null @@ -1,535 +0,0 @@ -// 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 ssh - -import ( - "bytes" - "errors" - "fmt" - "io" - "net" - "sort" - "time" -) - -// These constants from [PROTOCOL.certkeys] represent the algorithm names -// for certificate types supported by this package. -const ( - CertAlgoRSAv01 = "ssh-rsa-cert-v01@openssh.com" - CertAlgoDSAv01 = "ssh-dss-cert-v01@openssh.com" - CertAlgoECDSA256v01 = "ecdsa-sha2-nistp256-cert-v01@openssh.com" - CertAlgoECDSA384v01 = "ecdsa-sha2-nistp384-cert-v01@openssh.com" - CertAlgoECDSA521v01 = "ecdsa-sha2-nistp521-cert-v01@openssh.com" - CertAlgoED25519v01 = "ssh-ed25519-cert-v01@openssh.com" -) - -// Certificate types distinguish between host and user -// certificates. The values can be set in the CertType field of -// Certificate. -const ( - UserCert = 1 - HostCert = 2 -) - -// Signature represents a cryptographic signature. -type Signature struct { - Format string - Blob []byte -} - -// CertTimeInfinity can be used for OpenSSHCertV01.ValidBefore to indicate that -// a certificate does not expire. -const CertTimeInfinity = 1<<64 - 1 - -// An Certificate represents an OpenSSH certificate as defined in -// [PROTOCOL.certkeys]?rev=1.8. The Certificate type implements the -// PublicKey interface, so it can be unmarshaled using -// ParsePublicKey. -type Certificate struct { - Nonce []byte - Key PublicKey - Serial uint64 - CertType uint32 - KeyId string - ValidPrincipals []string - ValidAfter uint64 - ValidBefore uint64 - Permissions - Reserved []byte - SignatureKey PublicKey - Signature *Signature -} - -// genericCertData holds the key-independent part of the certificate data. -// Overall, certificates contain an nonce, public key fields and -// key-independent fields. -type genericCertData struct { - Serial uint64 - CertType uint32 - KeyId string - ValidPrincipals []byte - ValidAfter uint64 - ValidBefore uint64 - CriticalOptions []byte - Extensions []byte - Reserved []byte - SignatureKey []byte - Signature []byte -} - -func marshalStringList(namelist []string) []byte { - var to []byte - for _, name := range namelist { - s := struct{ N string }{name} - to = append(to, Marshal(&s)...) - } - return to -} - -type optionsTuple struct { - Key string - Value []byte -} - -type optionsTupleValue struct { - Value string -} - -// serialize a map of critical options or extensions -// issue #10569 - per [PROTOCOL.certkeys] and SSH implementation, -// we need two length prefixes for a non-empty string value -func marshalTuples(tups map[string]string) []byte { - keys := make([]string, 0, len(tups)) - for key := range tups { - keys = append(keys, key) - } - sort.Strings(keys) - - var ret []byte - for _, key := range keys { - s := optionsTuple{Key: key} - if value := tups[key]; len(value) > 0 { - s.Value = Marshal(&optionsTupleValue{value}) - } - ret = append(ret, Marshal(&s)...) - } - return ret -} - -// issue #10569 - per [PROTOCOL.certkeys] and SSH implementation, -// we need two length prefixes for a non-empty option value -func parseTuples(in []byte) (map[string]string, error) { - tups := map[string]string{} - var lastKey string - var haveLastKey bool - - for len(in) > 0 { - var key, val, extra []byte - var ok bool - - if key, in, ok = parseString(in); !ok { - return nil, errShortRead - } - keyStr := string(key) - // according to [PROTOCOL.certkeys], the names must be in - // lexical order. - if haveLastKey && keyStr <= lastKey { - return nil, fmt.Errorf("ssh: certificate options are not in lexical order") - } - lastKey, haveLastKey = keyStr, true - // the next field is a data field, which if non-empty has a string embedded - if val, in, ok = parseString(in); !ok { - return nil, errShortRead - } - if len(val) > 0 { - val, extra, ok = parseString(val) - if !ok { - return nil, errShortRead - } - if len(extra) > 0 { - return nil, fmt.Errorf("ssh: unexpected trailing data after certificate option value") - } - tups[keyStr] = string(val) - } else { - tups[keyStr] = "" - } - } - return tups, nil -} - -func parseCert(in []byte, privAlgo string) (*Certificate, error) { - nonce, rest, ok := parseString(in) - if !ok { - return nil, errShortRead - } - - key, rest, err := parsePubKey(rest, privAlgo) - if err != nil { - return nil, err - } - - var g genericCertData - if err := Unmarshal(rest, &g); err != nil { - return nil, err - } - - c := &Certificate{ - Nonce: nonce, - Key: key, - Serial: g.Serial, - CertType: g.CertType, - KeyId: g.KeyId, - ValidAfter: g.ValidAfter, - ValidBefore: g.ValidBefore, - } - - for principals := g.ValidPrincipals; len(principals) > 0; { - principal, rest, ok := parseString(principals) - if !ok { - return nil, errShortRead - } - c.ValidPrincipals = append(c.ValidPrincipals, string(principal)) - principals = rest - } - - c.CriticalOptions, err = parseTuples(g.CriticalOptions) - if err != nil { - return nil, err - } - c.Extensions, err = parseTuples(g.Extensions) - if err != nil { - return nil, err - } - c.Reserved = g.Reserved - k, err := ParsePublicKey(g.SignatureKey) - if err != nil { - return nil, err - } - - c.SignatureKey = k - c.Signature, rest, ok = parseSignatureBody(g.Signature) - if !ok || len(rest) > 0 { - return nil, errors.New("ssh: signature parse error") - } - - return c, nil -} - -type openSSHCertSigner struct { - pub *Certificate - signer Signer -} - -type algorithmOpenSSHCertSigner struct { - *openSSHCertSigner - algorithmSigner AlgorithmSigner -} - -// NewCertSigner returns a Signer that signs with the given Certificate, whose -// private key is held by signer. It returns an error if the public key in cert -// doesn't match the key used by signer. -func NewCertSigner(cert *Certificate, signer Signer) (Signer, error) { - if bytes.Compare(cert.Key.Marshal(), signer.PublicKey().Marshal()) != 0 { - return nil, errors.New("ssh: signer and cert have different public key") - } - - if algorithmSigner, ok := signer.(AlgorithmSigner); ok { - return &algorithmOpenSSHCertSigner{ - &openSSHCertSigner{cert, signer}, algorithmSigner}, nil - } else { - return &openSSHCertSigner{cert, signer}, nil - } -} - -func (s *openSSHCertSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { - return s.signer.Sign(rand, data) -} - -func (s *openSSHCertSigner) PublicKey() PublicKey { - return s.pub -} - -func (s *algorithmOpenSSHCertSigner) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { - return s.algorithmSigner.SignWithAlgorithm(rand, data, algorithm) -} - -const sourceAddressCriticalOption = "source-address" - -// CertChecker does the work of verifying a certificate. Its methods -// can be plugged into ClientConfig.HostKeyCallback and -// ServerConfig.PublicKeyCallback. For the CertChecker to work, -// minimally, the IsAuthority callback should be set. -type CertChecker struct { - // SupportedCriticalOptions lists the CriticalOptions that the - // server application layer understands. These are only used - // for user certificates. - SupportedCriticalOptions []string - - // 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. - Clock func() time.Time - - // UserKeyFallback is called when CertChecker.Authenticate encounters a - // public key that is not a certificate. It must implement validation - // of user keys or else, if nil, all such keys are rejected. - UserKeyFallback func(conn ConnMetadata, key PublicKey) (*Permissions, error) - - // HostKeyFallback is called when CertChecker.CheckHostKey encounters a - // public key that is not a certificate. It must implement host key - // validation or else, if nil, all such keys are rejected. - HostKeyFallback HostKeyCallback - - // IsRevoked is called for each certificate so that revocation checking - // can be implemented. It should return true if the given certificate - // is revoked and false otherwise. If nil, no certificates are - // considered to have been revoked. - IsRevoked func(cert *Certificate) bool -} - -// CheckHostKey checks a host key certificate. This method can be -// plugged into ClientConfig.HostKeyCallback. -func (c *CertChecker) CheckHostKey(addr string, remote net.Addr, key PublicKey) error { - cert, ok := key.(*Certificate) - if !ok { - if c.HostKeyFallback != nil { - return c.HostKeyFallback(addr, remote, key) - } - return errors.New("ssh: non-certificate host key") - } - 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) - } - - 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 -// a value for ServerConfig.PublicKeyCallback. -func (c *CertChecker) Authenticate(conn ConnMetadata, pubKey PublicKey) (*Permissions, error) { - cert, ok := pubKey.(*Certificate) - if !ok { - if c.UserKeyFallback != nil { - return c.UserKeyFallback(conn, pubKey) - } - return nil, errors.New("ssh: normal key pairs not accepted") - } - - 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 - } - - return &cert.Permissions, nil -} - -// CheckCert checks CriticalOptions, ValidPrincipals, revocation, timestamp and -// the signature of the certificate. -func (c *CertChecker) CheckCert(principal string, cert *Certificate) error { - if c.IsRevoked != nil && c.IsRevoked(cert) { - return fmt.Errorf("ssh: certificate serial %d revoked", cert.Serial) - } - - for opt := range cert.CriticalOptions { - // sourceAddressCriticalOption will be enforced by - // serverAuthenticate - if opt == sourceAddressCriticalOption { - continue - } - - found := false - for _, supp := range c.SupportedCriticalOptions { - if supp == opt { - found = true - break - } - } - if !found { - return fmt.Errorf("ssh: unsupported critical option %q in certificate", opt) - } - } - - if len(cert.ValidPrincipals) > 0 { - // By default, certs are valid for all users/hosts. - found := false - for _, p := range cert.ValidPrincipals { - if p == principal { - found = true - break - } - } - if !found { - return fmt.Errorf("ssh: principal %q not in the set of valid principals for given certificate: %q", principal, cert.ValidPrincipals) - } - } - - clock := c.Clock - if clock == nil { - clock = time.Now - } - - unixNow := clock().Unix() - if after := int64(cert.ValidAfter); after < 0 || unixNow < int64(cert.ValidAfter) { - return fmt.Errorf("ssh: cert is not yet valid") - } - if before := int64(cert.ValidBefore); cert.ValidBefore != uint64(CertTimeInfinity) && (unixNow >= before || before < 0) { - return fmt.Errorf("ssh: cert has expired") - } - if err := cert.SignatureKey.Verify(cert.bytesForSigning(), cert.Signature); err != nil { - return fmt.Errorf("ssh: certificate signature does not verify") - } - - return nil -} - -// SignCert sets c.SignatureKey to the authority's public key and stores a -// Signature, by authority, in the certificate. -func (c *Certificate) SignCert(rand io.Reader, authority Signer) error { - c.Nonce = make([]byte, 32) - if _, err := io.ReadFull(rand, c.Nonce); err != nil { - return err - } - c.SignatureKey = authority.PublicKey() - - sig, err := authority.Sign(rand, c.bytesForSigning()) - if err != nil { - return err - } - c.Signature = sig - return nil -} - -var certAlgoNames = map[string]string{ - KeyAlgoRSA: CertAlgoRSAv01, - KeyAlgoDSA: CertAlgoDSAv01, - KeyAlgoECDSA256: CertAlgoECDSA256v01, - KeyAlgoECDSA384: CertAlgoECDSA384v01, - KeyAlgoECDSA521: CertAlgoECDSA521v01, - KeyAlgoED25519: CertAlgoED25519v01, -} - -// certToPrivAlgo returns the underlying algorithm for a certificate algorithm. -// Panics if a non-certificate algorithm is passed. -func certToPrivAlgo(algo string) string { - for privAlgo, pubAlgo := range certAlgoNames { - if pubAlgo == algo { - return privAlgo - } - } - panic("unknown cert algorithm") -} - -func (cert *Certificate) bytesForSigning() []byte { - c2 := *cert - c2.Signature = nil - out := c2.Marshal() - // Drop trailing signature length. - return out[:len(out)-4] -} - -// Marshal serializes c into OpenSSH's wire format. It is part of the -// PublicKey interface. -func (c *Certificate) Marshal() []byte { - generic := genericCertData{ - Serial: c.Serial, - CertType: c.CertType, - KeyId: c.KeyId, - ValidPrincipals: marshalStringList(c.ValidPrincipals), - ValidAfter: uint64(c.ValidAfter), - ValidBefore: uint64(c.ValidBefore), - CriticalOptions: marshalTuples(c.CriticalOptions), - Extensions: marshalTuples(c.Extensions), - Reserved: c.Reserved, - SignatureKey: c.SignatureKey.Marshal(), - } - if c.Signature != nil { - generic.Signature = Marshal(c.Signature) - } - genericBytes := Marshal(&generic) - keyBytes := c.Key.Marshal() - _, keyBytes, _ = parseString(keyBytes) - prefix := Marshal(&struct { - Name string - Nonce []byte - Key []byte `ssh:"rest"` - }{c.Type(), c.Nonce, keyBytes}) - - result := make([]byte, 0, len(prefix)+len(genericBytes)) - result = append(result, prefix...) - result = append(result, genericBytes...) - return result -} - -// Type returns the key name. It is part of the PublicKey interface. -func (c *Certificate) Type() string { - algo, ok := certAlgoNames[c.Key.Type()] - if !ok { - panic("unknown cert key type " + c.Key.Type()) - } - return algo -} - -// Verify verifies a signature against the certificate's public -// key. It is part of the PublicKey interface. -func (c *Certificate) Verify(data []byte, sig *Signature) error { - return c.Key.Verify(data, sig) -} - -func parseSignatureBody(in []byte) (out *Signature, rest []byte, ok bool) { - format, in, ok := parseString(in) - if !ok { - return - } - - out = &Signature{ - Format: string(format), - } - - if out.Blob, in, ok = parseString(in); !ok { - return - } - - return out, in, ok -} - -func parseSignature(in []byte) (out *Signature, rest []byte, ok bool) { - sigBytes, rest, ok := parseString(in) - if !ok { - return - } - - out, trailing, ok := parseSignatureBody(sigBytes) - if !ok || len(trailing) > 0 { - return nil, nil, false - } - return -} diff --git a/vendor/golang.org/x/crypto/ssh/channel.go b/vendor/golang.org/x/crypto/ssh/channel.go deleted file mode 100644 index c0834c00dfee..000000000000 --- a/vendor/golang.org/x/crypto/ssh/channel.go +++ /dev/null @@ -1,633 +0,0 @@ -// 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 ssh - -import ( - "encoding/binary" - "errors" - "fmt" - "io" - "log" - "sync" -) - -const ( - minPacketLength = 9 - // channelMaxPacket contains the maximum number of bytes that will be - // sent in a single packet. As per RFC 4253, section 6.1, 32k is also - // the minimum. - channelMaxPacket = 1 << 15 - // We follow OpenSSH here. - channelWindowSize = 64 * channelMaxPacket -) - -// NewChannel represents an incoming request to a channel. It must either be -// accepted for use by calling Accept, or rejected by calling Reject. -type NewChannel interface { - // Accept accepts the channel creation request. It returns the Channel - // and a Go channel containing SSH requests. The Go channel must be - // serviced otherwise the Channel will hang. - Accept() (Channel, <-chan *Request, error) - - // Reject rejects the channel creation request. After calling - // this, no other methods on the Channel may be called. - Reject(reason RejectionReason, message string) error - - // ChannelType returns the type of the channel, as supplied by the - // client. - ChannelType() string - - // ExtraData returns the arbitrary payload for this channel, as supplied - // by the client. This data is specific to the channel type. - ExtraData() []byte -} - -// A Channel is an ordered, reliable, flow-controlled, duplex stream -// that is multiplexed over an SSH connection. -type Channel interface { - // Read reads up to len(data) bytes from the channel. - Read(data []byte) (int, error) - - // Write writes len(data) bytes to the channel. - Write(data []byte) (int, error) - - // Close signals end of channel use. No data may be sent after this - // call. - Close() error - - // CloseWrite signals the end of sending in-band - // data. Requests may still be sent, and the other side may - // still send data - CloseWrite() error - - // SendRequest sends a channel request. If wantReply is true, - // it will wait for a reply and return the result as a - // boolean, otherwise the return value will be false. Channel - // requests are out-of-band messages so they may be sent even - // if the data stream is closed or blocked by flow control. - // If the channel is closed before a reply is returned, io.EOF - // is returned. - SendRequest(name string, wantReply bool, payload []byte) (bool, error) - - // Stderr returns an io.ReadWriter that writes to this channel - // with the extended data type set to stderr. Stderr may - // safely be read and written from a different goroutine than - // Read and Write respectively. - Stderr() io.ReadWriter -} - -// Request is a request sent outside of the normal stream of -// data. Requests can either be specific to an SSH channel, or they -// can be global. -type Request struct { - Type string - WantReply bool - Payload []byte - - ch *channel - mux *mux -} - -// Reply sends a response to a request. It must be called for all requests -// where WantReply is true and is a no-op otherwise. The payload argument is -// ignored for replies to channel-specific requests. -func (r *Request) Reply(ok bool, payload []byte) error { - if !r.WantReply { - return nil - } - - if r.ch == nil { - return r.mux.ackRequest(ok, payload) - } - - return r.ch.ackRequest(ok) -} - -// RejectionReason is an enumeration used when rejecting channel creation -// requests. See RFC 4254, section 5.1. -type RejectionReason uint32 - -const ( - Prohibited RejectionReason = iota + 1 - ConnectionFailed - UnknownChannelType - ResourceShortage -) - -// String converts the rejection reason to human readable form. -func (r RejectionReason) String() string { - switch r { - case Prohibited: - return "administratively prohibited" - case ConnectionFailed: - return "connect failed" - case UnknownChannelType: - return "unknown channel type" - case ResourceShortage: - return "resource shortage" - } - return fmt.Sprintf("unknown reason %d", int(r)) -} - -func min(a uint32, b int) uint32 { - if a < uint32(b) { - return a - } - return uint32(b) -} - -type channelDirection uint8 - -const ( - channelInbound channelDirection = iota - channelOutbound -) - -// channel is an implementation of the Channel interface that works -// with the mux class. -type channel struct { - // R/O after creation - chanType string - extraData []byte - localId, remoteId uint32 - - // maxIncomingPayload and maxRemotePayload are the maximum - // payload sizes of normal and extended data packets for - // receiving and sending, respectively. The wire packet will - // be 9 or 13 bytes larger (excluding encryption overhead). - maxIncomingPayload uint32 - maxRemotePayload uint32 - - mux *mux - - // decided is set to true if an accept or reject message has been sent - // (for outbound channels) or received (for inbound channels). - decided bool - - // direction contains either channelOutbound, for channels created - // locally, or channelInbound, for channels created by the peer. - direction channelDirection - - // Pending internal channel messages. - msg chan interface{} - - // Since requests have no ID, there can be only one request - // with WantReply=true outstanding. This lock is held by a - // goroutine that has such an outgoing request pending. - sentRequestMu sync.Mutex - - incomingRequests chan *Request - - sentEOF bool - - // thread-safe data - remoteWin window - pending *buffer - extPending *buffer - - // windowMu protects myWindow, the flow-control window. - windowMu sync.Mutex - myWindow uint32 - - // writeMu serializes calls to mux.conn.writePacket() and - // protects sentClose and packetPool. This mutex must be - // different from windowMu, as writePacket can block if there - // is a key exchange pending. - writeMu sync.Mutex - sentClose bool - - // packetPool has a buffer for each extended channel ID to - // save allocations during writes. - packetPool map[uint32][]byte -} - -// writePacket sends a packet. If the packet is a channel close, it updates -// sentClose. This method takes the lock c.writeMu. -func (ch *channel) writePacket(packet []byte) error { - ch.writeMu.Lock() - if ch.sentClose { - ch.writeMu.Unlock() - return io.EOF - } - ch.sentClose = (packet[0] == msgChannelClose) - err := ch.mux.conn.writePacket(packet) - ch.writeMu.Unlock() - return err -} - -func (ch *channel) sendMessage(msg interface{}) error { - if debugMux { - log.Printf("send(%d): %#v", ch.mux.chanList.offset, msg) - } - - p := Marshal(msg) - binary.BigEndian.PutUint32(p[1:], ch.remoteId) - return ch.writePacket(p) -} - -// WriteExtended writes data to a specific extended stream. These streams are -// used, for example, for stderr. -func (ch *channel) WriteExtended(data []byte, extendedCode uint32) (n int, err error) { - if ch.sentEOF { - return 0, io.EOF - } - // 1 byte message type, 4 bytes remoteId, 4 bytes data length - opCode := byte(msgChannelData) - headerLength := uint32(9) - if extendedCode > 0 { - headerLength += 4 - opCode = msgChannelExtendedData - } - - ch.writeMu.Lock() - packet := ch.packetPool[extendedCode] - // We don't remove the buffer from packetPool, so - // WriteExtended calls from different goroutines will be - // flagged as errors by the race detector. - ch.writeMu.Unlock() - - for len(data) > 0 { - space := min(ch.maxRemotePayload, len(data)) - if space, err = ch.remoteWin.reserve(space); err != nil { - return n, err - } - if want := headerLength + space; uint32(cap(packet)) < want { - packet = make([]byte, want) - } else { - packet = packet[:want] - } - - todo := data[:space] - - packet[0] = opCode - binary.BigEndian.PutUint32(packet[1:], ch.remoteId) - if extendedCode > 0 { - binary.BigEndian.PutUint32(packet[5:], uint32(extendedCode)) - } - binary.BigEndian.PutUint32(packet[headerLength-4:], uint32(len(todo))) - copy(packet[headerLength:], todo) - if err = ch.writePacket(packet); err != nil { - return n, err - } - - n += len(todo) - data = data[len(todo):] - } - - ch.writeMu.Lock() - ch.packetPool[extendedCode] = packet - ch.writeMu.Unlock() - - return n, err -} - -func (ch *channel) handleData(packet []byte) error { - headerLen := 9 - isExtendedData := packet[0] == msgChannelExtendedData - if isExtendedData { - headerLen = 13 - } - if len(packet) < headerLen { - // malformed data packet - return parseError(packet[0]) - } - - var extended uint32 - if isExtendedData { - extended = binary.BigEndian.Uint32(packet[5:]) - } - - length := binary.BigEndian.Uint32(packet[headerLen-4 : headerLen]) - if length == 0 { - return nil - } - if length > ch.maxIncomingPayload { - // TODO(hanwen): should send Disconnect? - return errors.New("ssh: incoming packet exceeds maximum payload size") - } - - data := packet[headerLen:] - if length != uint32(len(data)) { - return errors.New("ssh: wrong packet length") - } - - ch.windowMu.Lock() - if ch.myWindow < length { - ch.windowMu.Unlock() - // TODO(hanwen): should send Disconnect with reason? - return errors.New("ssh: remote side wrote too much") - } - ch.myWindow -= length - ch.windowMu.Unlock() - - if extended == 1 { - ch.extPending.write(data) - } else if extended > 0 { - // discard other extended data. - } else { - ch.pending.write(data) - } - return nil -} - -func (c *channel) adjustWindow(n uint32) error { - c.windowMu.Lock() - // Since myWindow is managed on our side, and can never exceed - // the initial window setting, we don't worry about overflow. - c.myWindow += uint32(n) - c.windowMu.Unlock() - return c.sendMessage(windowAdjustMsg{ - AdditionalBytes: uint32(n), - }) -} - -func (c *channel) ReadExtended(data []byte, extended uint32) (n int, err error) { - switch extended { - case 1: - n, err = c.extPending.Read(data) - case 0: - n, err = c.pending.Read(data) - default: - return 0, fmt.Errorf("ssh: extended code %d unimplemented", extended) - } - - if n > 0 { - err = c.adjustWindow(uint32(n)) - // sendWindowAdjust can return io.EOF if the remote - // peer has closed the connection, however we want to - // defer forwarding io.EOF to the caller of Read until - // the buffer has been drained. - if n > 0 && err == io.EOF { - err = nil - } - } - - return n, err -} - -func (c *channel) close() { - c.pending.eof() - c.extPending.eof() - close(c.msg) - close(c.incomingRequests) - c.writeMu.Lock() - // This is not necessary for a normal channel teardown, but if - // there was another error, it is. - c.sentClose = true - c.writeMu.Unlock() - // Unblock writers. - c.remoteWin.close() -} - -// responseMessageReceived is called when a success or failure message is -// received on a channel to check that such a message is reasonable for the -// given channel. -func (ch *channel) responseMessageReceived() error { - if ch.direction == channelInbound { - return errors.New("ssh: channel response message received on inbound channel") - } - if ch.decided { - return errors.New("ssh: duplicate response received for channel") - } - ch.decided = true - return nil -} - -func (ch *channel) handlePacket(packet []byte) error { - switch packet[0] { - case msgChannelData, msgChannelExtendedData: - return ch.handleData(packet) - case msgChannelClose: - ch.sendMessage(channelCloseMsg{PeersID: ch.remoteId}) - ch.mux.chanList.remove(ch.localId) - ch.close() - return nil - case msgChannelEOF: - // RFC 4254 is mute on how EOF affects dataExt messages but - // it is logical to signal EOF at the same time. - ch.extPending.eof() - ch.pending.eof() - return nil - } - - decoded, err := decode(packet) - if err != nil { - return err - } - - switch msg := decoded.(type) { - case *channelOpenFailureMsg: - if err := ch.responseMessageReceived(); err != nil { - return err - } - ch.mux.chanList.remove(msg.PeersID) - ch.msg <- msg - case *channelOpenConfirmMsg: - if err := ch.responseMessageReceived(); err != nil { - return err - } - if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 { - return fmt.Errorf("ssh: invalid MaxPacketSize %d from peer", msg.MaxPacketSize) - } - ch.remoteId = msg.MyID - ch.maxRemotePayload = msg.MaxPacketSize - ch.remoteWin.add(msg.MyWindow) - ch.msg <- msg - case *windowAdjustMsg: - if !ch.remoteWin.add(msg.AdditionalBytes) { - return fmt.Errorf("ssh: invalid window update for %d bytes", msg.AdditionalBytes) - } - case *channelRequestMsg: - req := Request{ - Type: msg.Request, - WantReply: msg.WantReply, - Payload: msg.RequestSpecificData, - ch: ch, - } - - ch.incomingRequests <- &req - default: - ch.msg <- msg - } - return nil -} - -func (m *mux) newChannel(chanType string, direction channelDirection, extraData []byte) *channel { - ch := &channel{ - remoteWin: window{Cond: newCond()}, - myWindow: channelWindowSize, - pending: newBuffer(), - extPending: newBuffer(), - direction: direction, - incomingRequests: make(chan *Request, chanSize), - msg: make(chan interface{}, chanSize), - chanType: chanType, - extraData: extraData, - mux: m, - packetPool: make(map[uint32][]byte), - } - ch.localId = m.chanList.add(ch) - return ch -} - -var errUndecided = errors.New("ssh: must Accept or Reject channel") -var errDecidedAlready = errors.New("ssh: can call Accept or Reject only once") - -type extChannel struct { - code uint32 - ch *channel -} - -func (e *extChannel) Write(data []byte) (n int, err error) { - return e.ch.WriteExtended(data, e.code) -} - -func (e *extChannel) Read(data []byte) (n int, err error) { - return e.ch.ReadExtended(data, e.code) -} - -func (ch *channel) Accept() (Channel, <-chan *Request, error) { - if ch.decided { - return nil, nil, errDecidedAlready - } - ch.maxIncomingPayload = channelMaxPacket - confirm := channelOpenConfirmMsg{ - PeersID: ch.remoteId, - MyID: ch.localId, - MyWindow: ch.myWindow, - MaxPacketSize: ch.maxIncomingPayload, - } - ch.decided = true - if err := ch.sendMessage(confirm); err != nil { - return nil, nil, err - } - - return ch, ch.incomingRequests, nil -} - -func (ch *channel) Reject(reason RejectionReason, message string) error { - if ch.decided { - return errDecidedAlready - } - reject := channelOpenFailureMsg{ - PeersID: ch.remoteId, - Reason: reason, - Message: message, - Language: "en", - } - ch.decided = true - return ch.sendMessage(reject) -} - -func (ch *channel) Read(data []byte) (int, error) { - if !ch.decided { - return 0, errUndecided - } - return ch.ReadExtended(data, 0) -} - -func (ch *channel) Write(data []byte) (int, error) { - if !ch.decided { - return 0, errUndecided - } - return ch.WriteExtended(data, 0) -} - -func (ch *channel) CloseWrite() error { - if !ch.decided { - return errUndecided - } - ch.sentEOF = true - return ch.sendMessage(channelEOFMsg{ - PeersID: ch.remoteId}) -} - -func (ch *channel) Close() error { - if !ch.decided { - return errUndecided - } - - return ch.sendMessage(channelCloseMsg{ - PeersID: ch.remoteId}) -} - -// Extended returns an io.ReadWriter that sends and receives data on the given, -// SSH extended stream. Such streams are used, for example, for stderr. -func (ch *channel) Extended(code uint32) io.ReadWriter { - if !ch.decided { - return nil - } - return &extChannel{code, ch} -} - -func (ch *channel) Stderr() io.ReadWriter { - return ch.Extended(1) -} - -func (ch *channel) SendRequest(name string, wantReply bool, payload []byte) (bool, error) { - if !ch.decided { - return false, errUndecided - } - - if wantReply { - ch.sentRequestMu.Lock() - defer ch.sentRequestMu.Unlock() - } - - msg := channelRequestMsg{ - PeersID: ch.remoteId, - Request: name, - WantReply: wantReply, - RequestSpecificData: payload, - } - - if err := ch.sendMessage(msg); err != nil { - return false, err - } - - if wantReply { - m, ok := (<-ch.msg) - if !ok { - return false, io.EOF - } - switch m.(type) { - case *channelRequestFailureMsg: - return false, nil - case *channelRequestSuccessMsg: - return true, nil - default: - return false, fmt.Errorf("ssh: unexpected response to channel request: %#v", m) - } - } - - return false, nil -} - -// ackRequest either sends an ack or nack to the channel request. -func (ch *channel) ackRequest(ok bool) error { - if !ch.decided { - return errUndecided - } - - var msg interface{} - if !ok { - msg = channelRequestFailureMsg{ - PeersID: ch.remoteId, - } - } else { - msg = channelRequestSuccessMsg{ - PeersID: ch.remoteId, - } - } - return ch.sendMessage(msg) -} - -func (ch *channel) ChannelType() string { - return ch.chanType -} - -func (ch *channel) ExtraData() []byte { - return ch.extraData -} diff --git a/vendor/golang.org/x/crypto/ssh/cipher.go b/vendor/golang.org/x/crypto/ssh/cipher.go deleted file mode 100644 index 67b012610594..000000000000 --- a/vendor/golang.org/x/crypto/ssh/cipher.go +++ /dev/null @@ -1,770 +0,0 @@ -// 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 ssh - -import ( - "crypto/aes" - "crypto/cipher" - "crypto/des" - "crypto/rc4" - "crypto/subtle" - "encoding/binary" - "errors" - "fmt" - "hash" - "io" - "io/ioutil" - "math/bits" - - "golang.org/x/crypto/internal/chacha20" - "golang.org/x/crypto/poly1305" -) - -const ( - packetSizeMultiple = 16 // TODO(huin) this should be determined by the cipher. - - // RFC 4253 section 6.1 defines a minimum packet size of 32768 that implementations - // MUST be able to process (plus a few more kilobytes for padding and mac). The RFC - // indicates implementations SHOULD be able to handle larger packet sizes, but then - // waffles on about reasonable limits. - // - // OpenSSH caps their maxPacket at 256kB so we choose to do - // the same. maxPacket is also used to ensure that uint32 - // length fields do not overflow, so it should remain well - // below 4G. - maxPacket = 256 * 1024 -) - -// noneCipher implements cipher.Stream and provides no encryption. It is used -// by the transport before the first key-exchange. -type noneCipher struct{} - -func (c noneCipher) XORKeyStream(dst, src []byte) { - copy(dst, src) -} - -func newAESCTR(key, iv []byte) (cipher.Stream, error) { - c, err := aes.NewCipher(key) - if err != nil { - return nil, err - } - return cipher.NewCTR(c, iv), nil -} - -func newRC4(key, iv []byte) (cipher.Stream, error) { - return rc4.NewCipher(key) -} - -type cipherMode struct { - keySize int - ivSize int - create func(key, iv []byte, macKey []byte, algs directionAlgorithms) (packetCipher, error) -} - -func streamCipherMode(skip int, createFunc func(key, iv []byte) (cipher.Stream, error)) func(key, iv []byte, macKey []byte, algs directionAlgorithms) (packetCipher, error) { - return func(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { - stream, err := createFunc(key, iv) - if err != nil { - return nil, err - } - - var streamDump []byte - if skip > 0 { - streamDump = make([]byte, 512) - } - - for remainingToDump := skip; remainingToDump > 0; { - dumpThisTime := remainingToDump - if dumpThisTime > len(streamDump) { - dumpThisTime = len(streamDump) - } - stream.XORKeyStream(streamDump[:dumpThisTime], streamDump[:dumpThisTime]) - remainingToDump -= dumpThisTime - } - - mac := macModes[algs.MAC].new(macKey) - return &streamPacketCipher{ - mac: mac, - etm: macModes[algs.MAC].etm, - macResult: make([]byte, mac.Size()), - cipher: stream, - }, nil - } -} - -// cipherModes documents properties of supported ciphers. Ciphers not included -// are not supported and will not be negotiated, even if explicitly requested in -// ClientConfig.Crypto.Ciphers. -var cipherModes = map[string]*cipherMode{ - // Ciphers from RFC4344, which introduced many CTR-based ciphers. Algorithms - // are defined in the order specified in the RFC. - "aes128-ctr": {16, aes.BlockSize, streamCipherMode(0, newAESCTR)}, - "aes192-ctr": {24, aes.BlockSize, streamCipherMode(0, newAESCTR)}, - "aes256-ctr": {32, aes.BlockSize, streamCipherMode(0, newAESCTR)}, - - // Ciphers from RFC4345, which introduces security-improved arcfour ciphers. - // They are defined in the order specified in the RFC. - "arcfour128": {16, 0, streamCipherMode(1536, newRC4)}, - "arcfour256": {32, 0, streamCipherMode(1536, newRC4)}, - - // Cipher defined in RFC 4253, which describes SSH Transport Layer Protocol. - // Note that this cipher is not safe, as stated in RFC 4253: "Arcfour (and - // RC4) has problems with weak keys, and should be used with caution." - // RFC4345 introduces improved versions of Arcfour. - "arcfour": {16, 0, streamCipherMode(0, newRC4)}, - - // AEAD ciphers - gcmCipherID: {16, 12, newGCMCipher}, - chacha20Poly1305ID: {64, 0, newChaCha20Cipher}, - - // CBC mode is insecure and so is not included in the default config. - // (See http://www.isg.rhul.ac.uk/~kp/SandPfinal.pdf). If absolutely - // needed, it's possible to specify a custom Config to enable it. - // You should expect that an active attacker can recover plaintext if - // you do. - aes128cbcID: {16, aes.BlockSize, newAESCBCCipher}, - - // 3des-cbc is insecure and is not included in the default - // config. - tripledescbcID: {24, des.BlockSize, newTripleDESCBCCipher}, -} - -// prefixLen is the length of the packet prefix that contains the packet length -// and number of padding bytes. -const prefixLen = 5 - -// streamPacketCipher is a packetCipher using a stream cipher. -type streamPacketCipher struct { - mac hash.Hash - cipher cipher.Stream - etm bool - - // The following members are to avoid per-packet allocations. - prefix [prefixLen]byte - seqNumBytes [4]byte - padding [2 * packetSizeMultiple]byte - packetData []byte - macResult []byte -} - -// readPacket reads and decrypt a single packet from the reader argument. -func (s *streamPacketCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { - if _, err := io.ReadFull(r, s.prefix[:]); err != nil { - return nil, err - } - - var encryptedPaddingLength [1]byte - if s.mac != nil && s.etm { - copy(encryptedPaddingLength[:], s.prefix[4:5]) - s.cipher.XORKeyStream(s.prefix[4:5], s.prefix[4:5]) - } else { - s.cipher.XORKeyStream(s.prefix[:], s.prefix[:]) - } - - length := binary.BigEndian.Uint32(s.prefix[0:4]) - paddingLength := uint32(s.prefix[4]) - - var macSize uint32 - if s.mac != nil { - s.mac.Reset() - binary.BigEndian.PutUint32(s.seqNumBytes[:], seqNum) - s.mac.Write(s.seqNumBytes[:]) - if s.etm { - s.mac.Write(s.prefix[:4]) - s.mac.Write(encryptedPaddingLength[:]) - } else { - s.mac.Write(s.prefix[:]) - } - macSize = uint32(s.mac.Size()) - } - - if length <= paddingLength+1 { - return nil, errors.New("ssh: invalid packet length, packet too small") - } - - if length > maxPacket { - return nil, errors.New("ssh: invalid packet length, packet too large") - } - - // the maxPacket check above ensures that length-1+macSize - // does not overflow. - if uint32(cap(s.packetData)) < length-1+macSize { - s.packetData = make([]byte, length-1+macSize) - } else { - s.packetData = s.packetData[:length-1+macSize] - } - - if _, err := io.ReadFull(r, s.packetData); err != nil { - return nil, err - } - mac := s.packetData[length-1:] - data := s.packetData[:length-1] - - if s.mac != nil && s.etm { - s.mac.Write(data) - } - - s.cipher.XORKeyStream(data, data) - - if s.mac != nil { - if !s.etm { - s.mac.Write(data) - } - s.macResult = s.mac.Sum(s.macResult[:0]) - if subtle.ConstantTimeCompare(s.macResult, mac) != 1 { - return nil, errors.New("ssh: MAC failure") - } - } - - return s.packetData[:length-paddingLength-1], nil -} - -// writePacket encrypts and sends a packet of data to the writer argument -func (s *streamPacketCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { - if len(packet) > maxPacket { - return errors.New("ssh: packet too large") - } - - aadlen := 0 - if s.mac != nil && s.etm { - // packet length is not encrypted for EtM modes - aadlen = 4 - } - - paddingLength := packetSizeMultiple - (prefixLen+len(packet)-aadlen)%packetSizeMultiple - if paddingLength < 4 { - paddingLength += packetSizeMultiple - } - - length := len(packet) + 1 + paddingLength - binary.BigEndian.PutUint32(s.prefix[:], uint32(length)) - s.prefix[4] = byte(paddingLength) - padding := s.padding[:paddingLength] - if _, err := io.ReadFull(rand, padding); err != nil { - return err - } - - if s.mac != nil { - s.mac.Reset() - binary.BigEndian.PutUint32(s.seqNumBytes[:], seqNum) - s.mac.Write(s.seqNumBytes[:]) - - if s.etm { - // For EtM algorithms, the packet length must stay unencrypted, - // but the following data (padding length) must be encrypted - s.cipher.XORKeyStream(s.prefix[4:5], s.prefix[4:5]) - } - - s.mac.Write(s.prefix[:]) - - if !s.etm { - // For non-EtM algorithms, the algorithm is applied on unencrypted data - s.mac.Write(packet) - s.mac.Write(padding) - } - } - - if !(s.mac != nil && s.etm) { - // For EtM algorithms, the padding length has already been encrypted - // and the packet length must remain unencrypted - s.cipher.XORKeyStream(s.prefix[:], s.prefix[:]) - } - - s.cipher.XORKeyStream(packet, packet) - s.cipher.XORKeyStream(padding, padding) - - if s.mac != nil && s.etm { - // For EtM algorithms, packet and padding must be encrypted - s.mac.Write(packet) - s.mac.Write(padding) - } - - if _, err := w.Write(s.prefix[:]); err != nil { - return err - } - if _, err := w.Write(packet); err != nil { - return err - } - if _, err := w.Write(padding); err != nil { - return err - } - - if s.mac != nil { - s.macResult = s.mac.Sum(s.macResult[:0]) - if _, err := w.Write(s.macResult); err != nil { - return err - } - } - - return nil -} - -type gcmCipher struct { - aead cipher.AEAD - prefix [4]byte - iv []byte - buf []byte -} - -func newGCMCipher(key, iv, unusedMacKey []byte, unusedAlgs directionAlgorithms) (packetCipher, error) { - c, err := aes.NewCipher(key) - if err != nil { - return nil, err - } - - aead, err := cipher.NewGCM(c) - if err != nil { - return nil, err - } - - return &gcmCipher{ - aead: aead, - iv: iv, - }, nil -} - -const gcmTagSize = 16 - -func (c *gcmCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { - // Pad out to multiple of 16 bytes. This is different from the - // stream cipher because that encrypts the length too. - padding := byte(packetSizeMultiple - (1+len(packet))%packetSizeMultiple) - if padding < 4 { - padding += packetSizeMultiple - } - - length := uint32(len(packet) + int(padding) + 1) - binary.BigEndian.PutUint32(c.prefix[:], length) - if _, err := w.Write(c.prefix[:]); err != nil { - return err - } - - if cap(c.buf) < int(length) { - c.buf = make([]byte, length) - } else { - c.buf = c.buf[:length] - } - - c.buf[0] = padding - copy(c.buf[1:], packet) - if _, err := io.ReadFull(rand, c.buf[1+len(packet):]); err != nil { - return err - } - c.buf = c.aead.Seal(c.buf[:0], c.iv, c.buf, c.prefix[:]) - if _, err := w.Write(c.buf); err != nil { - return err - } - c.incIV() - - return nil -} - -func (c *gcmCipher) incIV() { - for i := 4 + 7; i >= 4; i-- { - c.iv[i]++ - if c.iv[i] != 0 { - break - } - } -} - -func (c *gcmCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { - if _, err := io.ReadFull(r, c.prefix[:]); err != nil { - return nil, err - } - length := binary.BigEndian.Uint32(c.prefix[:]) - if length > maxPacket { - return nil, errors.New("ssh: max packet length exceeded") - } - - if cap(c.buf) < int(length+gcmTagSize) { - c.buf = make([]byte, length+gcmTagSize) - } else { - c.buf = c.buf[:length+gcmTagSize] - } - - if _, err := io.ReadFull(r, c.buf); err != nil { - return nil, err - } - - plain, err := c.aead.Open(c.buf[:0], c.iv, c.buf, c.prefix[:]) - if err != nil { - return nil, err - } - c.incIV() - - padding := plain[0] - 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) - } - - if int(padding+1) >= len(plain) { - return nil, fmt.Errorf("ssh: padding %d too large", padding) - } - plain = plain[1 : length-uint32(padding)] - return plain, nil -} - -// cbcCipher implements aes128-cbc cipher defined in RFC 4253 section 6.1 -type cbcCipher struct { - mac hash.Hash - macSize uint32 - decrypter cipher.BlockMode - encrypter cipher.BlockMode - - // The following members are to avoid per-packet allocations. - seqNumBytes [4]byte - packetData []byte - macResult []byte - - // Amount of data we should still read to hide which - // verification error triggered. - oracleCamouflage uint32 -} - -func newCBCCipher(c cipher.Block, key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { - cbc := &cbcCipher{ - mac: macModes[algs.MAC].new(macKey), - decrypter: cipher.NewCBCDecrypter(c, iv), - encrypter: cipher.NewCBCEncrypter(c, iv), - packetData: make([]byte, 1024), - } - if cbc.mac != nil { - cbc.macSize = uint32(cbc.mac.Size()) - } - - return cbc, nil -} - -func newAESCBCCipher(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { - c, err := aes.NewCipher(key) - if err != nil { - return nil, err - } - - cbc, err := newCBCCipher(c, key, iv, macKey, algs) - if err != nil { - return nil, err - } - - return cbc, nil -} - -func newTripleDESCBCCipher(key, iv, macKey []byte, algs directionAlgorithms) (packetCipher, error) { - c, err := des.NewTripleDESCipher(key) - if err != nil { - return nil, err - } - - cbc, err := newCBCCipher(c, key, iv, macKey, algs) - if err != nil { - return nil, err - } - - return cbc, nil -} - -func maxUInt32(a, b int) uint32 { - if a > b { - return uint32(a) - } - return uint32(b) -} - -const ( - cbcMinPacketSizeMultiple = 8 - cbcMinPacketSize = 16 - cbcMinPaddingSize = 4 -) - -// cbcError represents a verification error that may leak information. -type cbcError string - -func (e cbcError) Error() string { return string(e) } - -func (c *cbcCipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { - p, err := c.readPacketLeaky(seqNum, r) - if err != nil { - if _, ok := err.(cbcError); ok { - // Verification error: read a fixed amount of - // data, to make distinguishing between - // failing MAC and failing length check more - // difficult. - io.CopyN(ioutil.Discard, r, int64(c.oracleCamouflage)) - } - } - return p, err -} - -func (c *cbcCipher) readPacketLeaky(seqNum uint32, r io.Reader) ([]byte, error) { - blockSize := c.decrypter.BlockSize() - - // Read the header, which will include some of the subsequent data in the - // case of block ciphers - this is copied back to the payload later. - // How many bytes of payload/padding will be read with this first read. - firstBlockLength := uint32((prefixLen + blockSize - 1) / blockSize * blockSize) - firstBlock := c.packetData[:firstBlockLength] - if _, err := io.ReadFull(r, firstBlock); err != nil { - return nil, err - } - - c.oracleCamouflage = maxPacket + 4 + c.macSize - firstBlockLength - - c.decrypter.CryptBlocks(firstBlock, firstBlock) - length := binary.BigEndian.Uint32(firstBlock[:4]) - if length > maxPacket { - return nil, cbcError("ssh: packet too large") - } - if length+4 < maxUInt32(cbcMinPacketSize, blockSize) { - // The minimum size of a packet is 16 (or the cipher block size, whichever - // is larger) bytes. - return nil, cbcError("ssh: packet too small") - } - // The length of the packet (including the length field but not the MAC) must - // be a multiple of the block size or 8, whichever is larger. - if (length+4)%maxUInt32(cbcMinPacketSizeMultiple, blockSize) != 0 { - return nil, cbcError("ssh: invalid packet length multiple") - } - - paddingLength := uint32(firstBlock[4]) - if paddingLength < cbcMinPaddingSize || length <= paddingLength+1 { - return nil, cbcError("ssh: invalid packet length") - } - - // Positions within the c.packetData buffer: - macStart := 4 + length - paddingStart := macStart - paddingLength - - // Entire packet size, starting before length, ending at end of mac. - entirePacketSize := macStart + c.macSize - - // Ensure c.packetData is large enough for the entire packet data. - if uint32(cap(c.packetData)) < entirePacketSize { - // Still need to upsize and copy, but this should be rare at runtime, only - // on upsizing the packetData buffer. - c.packetData = make([]byte, entirePacketSize) - copy(c.packetData, firstBlock) - } else { - c.packetData = c.packetData[:entirePacketSize] - } - - n, err := io.ReadFull(r, c.packetData[firstBlockLength:]) - if err != nil { - return nil, err - } - c.oracleCamouflage -= uint32(n) - - remainingCrypted := c.packetData[firstBlockLength:macStart] - c.decrypter.CryptBlocks(remainingCrypted, remainingCrypted) - - mac := c.packetData[macStart:] - if c.mac != nil { - c.mac.Reset() - binary.BigEndian.PutUint32(c.seqNumBytes[:], seqNum) - c.mac.Write(c.seqNumBytes[:]) - c.mac.Write(c.packetData[:macStart]) - c.macResult = c.mac.Sum(c.macResult[:0]) - if subtle.ConstantTimeCompare(c.macResult, mac) != 1 { - return nil, cbcError("ssh: MAC failure") - } - } - - return c.packetData[prefixLen:paddingStart], nil -} - -func (c *cbcCipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, packet []byte) error { - effectiveBlockSize := maxUInt32(cbcMinPacketSizeMultiple, c.encrypter.BlockSize()) - - // Length of encrypted portion of the packet (header, payload, padding). - // Enforce minimum padding and packet size. - encLength := maxUInt32(prefixLen+len(packet)+cbcMinPaddingSize, cbcMinPaddingSize) - // Enforce block size. - encLength = (encLength + effectiveBlockSize - 1) / effectiveBlockSize * effectiveBlockSize - - length := encLength - 4 - paddingLength := int(length) - (1 + len(packet)) - - // Overall buffer contains: header, payload, padding, mac. - // Space for the MAC is reserved in the capacity but not the slice length. - bufferSize := encLength + c.macSize - if uint32(cap(c.packetData)) < bufferSize { - c.packetData = make([]byte, encLength, bufferSize) - } else { - c.packetData = c.packetData[:encLength] - } - - p := c.packetData - - // Packet header. - binary.BigEndian.PutUint32(p, length) - p = p[4:] - p[0] = byte(paddingLength) - - // Payload. - p = p[1:] - copy(p, packet) - - // Padding. - p = p[len(packet):] - if _, err := io.ReadFull(rand, p); err != nil { - return err - } - - if c.mac != nil { - c.mac.Reset() - binary.BigEndian.PutUint32(c.seqNumBytes[:], seqNum) - c.mac.Write(c.seqNumBytes[:]) - c.mac.Write(c.packetData) - // The MAC is now appended into the capacity reserved for it earlier. - c.packetData = c.mac.Sum(c.packetData) - } - - c.encrypter.CryptBlocks(c.packetData[:encLength], c.packetData[:encLength]) - - if _, err := w.Write(c.packetData); err != nil { - return err - } - - return nil -} - -const chacha20Poly1305ID = "chacha20-poly1305@openssh.com" - -// chacha20Poly1305Cipher implements the chacha20-poly1305@openssh.com -// AEAD, which is described here: -// -// https://tools.ietf.org/html/draft-josefsson-ssh-chacha20-poly1305-openssh-00 -// -// the methods here also implement padding, which RFC4253 Section 6 -// also requires of stream ciphers. -type chacha20Poly1305Cipher struct { - lengthKey [8]uint32 - contentKey [8]uint32 - buf []byte -} - -func newChaCha20Cipher(key, unusedIV, unusedMACKey []byte, unusedAlgs directionAlgorithms) (packetCipher, error) { - if len(key) != 64 { - panic(len(key)) - } - - c := &chacha20Poly1305Cipher{ - buf: make([]byte, 256), - } - - for i := range c.contentKey { - c.contentKey[i] = binary.LittleEndian.Uint32(key[i*4 : (i+1)*4]) - } - for i := range c.lengthKey { - c.lengthKey[i] = binary.LittleEndian.Uint32(key[(i+8)*4 : (i+9)*4]) - } - return c, nil -} - -func (c *chacha20Poly1305Cipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) { - nonce := [3]uint32{0, 0, bits.ReverseBytes32(seqNum)} - s := chacha20.New(c.contentKey, nonce) - var polyKey [32]byte - s.XORKeyStream(polyKey[:], polyKey[:]) - s.Advance() // skip next 32 bytes - - encryptedLength := c.buf[:4] - if _, err := io.ReadFull(r, encryptedLength); err != nil { - return nil, err - } - - var lenBytes [4]byte - chacha20.New(c.lengthKey, nonce).XORKeyStream(lenBytes[:], encryptedLength) - - length := binary.BigEndian.Uint32(lenBytes[:]) - if length > maxPacket { - return nil, errors.New("ssh: invalid packet length, packet too large") - } - - contentEnd := 4 + length - packetEnd := contentEnd + poly1305.TagSize - if uint32(cap(c.buf)) < packetEnd { - c.buf = make([]byte, packetEnd) - copy(c.buf[:], encryptedLength) - } else { - c.buf = c.buf[:packetEnd] - } - - if _, err := io.ReadFull(r, c.buf[4:packetEnd]); err != nil { - return nil, err - } - - var mac [poly1305.TagSize]byte - copy(mac[:], c.buf[contentEnd:packetEnd]) - if !poly1305.Verify(&mac, c.buf[:contentEnd], &polyKey) { - return nil, errors.New("ssh: MAC failure") - } - - plain := c.buf[4:contentEnd] - s.XORKeyStream(plain, plain) - - padding := plain[0] - 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) - } - - if int(padding)+1 >= len(plain) { - return nil, fmt.Errorf("ssh: padding %d too large", padding) - } - - plain = plain[1 : len(plain)-int(padding)] - - return plain, nil -} - -func (c *chacha20Poly1305Cipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, payload []byte) error { - nonce := [3]uint32{0, 0, bits.ReverseBytes32(seqNum)} - s := chacha20.New(c.contentKey, nonce) - var polyKey [32]byte - s.XORKeyStream(polyKey[:], polyKey[:]) - s.Advance() // skip next 32 bytes - - // There is no blocksize, so fall back to multiple of 8 byte - // padding, as described in RFC 4253, Sec 6. - const packetSizeMultiple = 8 - - padding := packetSizeMultiple - (1+len(payload))%packetSizeMultiple - if padding < 4 { - padding += packetSizeMultiple - } - - // size (4 bytes), padding (1), payload, padding, tag. - totalLength := 4 + 1 + len(payload) + padding + poly1305.TagSize - if cap(c.buf) < totalLength { - c.buf = make([]byte, totalLength) - } else { - c.buf = c.buf[:totalLength] - } - - binary.BigEndian.PutUint32(c.buf, uint32(1+len(payload)+padding)) - chacha20.New(c.lengthKey, nonce).XORKeyStream(c.buf, c.buf[:4]) - c.buf[4] = byte(padding) - copy(c.buf[5:], payload) - packetEnd := 5 + len(payload) + padding - if _, err := io.ReadFull(rand, c.buf[5+len(payload):packetEnd]); err != nil { - return err - } - - s.XORKeyStream(c.buf[4:], c.buf[4:packetEnd]) - - var mac [poly1305.TagSize]byte - poly1305.Sum(&mac, c.buf[:packetEnd], &polyKey) - - copy(c.buf[packetEnd:], mac[:]) - - if _, err := w.Write(c.buf); err != nil { - return err - } - return nil -} diff --git a/vendor/golang.org/x/crypto/ssh/client.go b/vendor/golang.org/x/crypto/ssh/client.go deleted file mode 100644 index 7b00bff1caa5..000000000000 --- a/vendor/golang.org/x/crypto/ssh/client.go +++ /dev/null @@ -1,278 +0,0 @@ -// 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 ssh - -import ( - "bytes" - "errors" - "fmt" - "net" - "os" - "sync" - "time" -) - -// Client implements a traditional SSH client that supports shells, -// subprocesses, TCP port/streamlocal forwarding and tunneled dialing. -type Client struct { - Conn - - handleForwardsOnce sync.Once // guards calling (*Client).handleForwards - - forwards forwardList // forwarded tcpip connections from the remote side - mu sync.Mutex - channelHandlers map[string]chan NewChannel -} - -// HandleChannelOpen returns a channel on which NewChannel requests -// for the given type are sent. If the type already is being handled, -// nil is returned. The channel is closed when the connection is closed. -func (c *Client) HandleChannelOpen(channelType string) <-chan NewChannel { - c.mu.Lock() - defer c.mu.Unlock() - if c.channelHandlers == nil { - // The SSH channel has been closed. - c := make(chan NewChannel) - close(c) - return c - } - - ch := c.channelHandlers[channelType] - if ch != nil { - return nil - } - - ch = make(chan NewChannel, chanSize) - c.channelHandlers[channelType] = ch - return ch -} - -// NewClient creates a Client on top of the given connection. -func NewClient(c Conn, chans <-chan NewChannel, reqs <-chan *Request) *Client { - conn := &Client{ - Conn: c, - channelHandlers: make(map[string]chan NewChannel, 1), - } - - go conn.handleGlobalRequests(reqs) - go conn.handleChannelOpens(chans) - go func() { - conn.Wait() - conn.forwards.closeAll() - }() - return conn -} - -// NewClientConn establishes an authenticated SSH connection using c -// as the underlying transport. The Request and NewChannel channels -// must be serviced or the connection will hang. -func NewClientConn(c net.Conn, addr string, config *ClientConfig) (Conn, <-chan NewChannel, <-chan *Request, error) { - fullConf := *config - fullConf.SetDefaults() - if fullConf.HostKeyCallback == nil { - c.Close() - return nil, nil, nil, errors.New("ssh: must specify HostKeyCallback") - } - - conn := &connection{ - sshConn: sshConn{conn: c}, - } - - if err := conn.clientHandshake(addr, &fullConf); err != nil { - c.Close() - return nil, nil, nil, fmt.Errorf("ssh: handshake failed: %v", err) - } - conn.mux = newMux(conn.transport) - return conn, conn.mux.incomingChannels, conn.mux.incomingRequests, nil -} - -// clientHandshake performs the client side key exchange. See RFC 4253 Section -// 7. -func (c *connection) clientHandshake(dialAddress string, config *ClientConfig) error { - if config.ClientVersion != "" { - c.clientVersion = []byte(config.ClientVersion) - } else { - c.clientVersion = []byte(packageVersion) - } - var err error - c.serverVersion, err = exchangeVersions(c.sshConn.conn, c.clientVersion) - if err != nil { - return err - } - - c.transport = newClientTransport( - newTransport(c.sshConn.conn, config.Rand, true /* is client */), - c.clientVersion, c.serverVersion, config, dialAddress, c.sshConn.RemoteAddr()) - if err := c.transport.waitSession(); err != nil { - return err - } - - c.sessionID = c.transport.getSessionID() - return c.clientAuthenticate(config) -} - -// verifyHostKeySignature verifies the host key obtained in the key -// exchange. -func verifyHostKeySignature(hostKey PublicKey, result *kexResult) error { - sig, rest, ok := parseSignatureBody(result.Signature) - if len(rest) > 0 || !ok { - return errors.New("ssh: signature parse error") - } - - return hostKey.Verify(result.H, sig) -} - -// NewSession opens a new Session for this client. (A session is a remote -// execution of a program.) -func (c *Client) NewSession() (*Session, error) { - ch, in, err := c.OpenChannel("session", nil) - if err != nil { - return nil, err - } - return newSession(ch, in) -} - -func (c *Client) handleGlobalRequests(incoming <-chan *Request) { - for r := range incoming { - // This handles keepalive messages and matches - // the behaviour of OpenSSH. - r.Reply(false, nil) - } -} - -// handleChannelOpens channel open messages from the remote side. -func (c *Client) handleChannelOpens(in <-chan NewChannel) { - for ch := range in { - c.mu.Lock() - handler := c.channelHandlers[ch.ChannelType()] - c.mu.Unlock() - - if handler != nil { - handler <- ch - } else { - ch.Reject(UnknownChannelType, fmt.Sprintf("unknown channel type: %v", ch.ChannelType())) - } - } - - c.mu.Lock() - for _, ch := range c.channelHandlers { - close(ch) - } - c.channelHandlers = nil - c.mu.Unlock() -} - -// Dial starts a client connection to the given SSH server. It is a -// convenience function that connects to the given network address, -// initiates the SSH handshake, and then sets up a Client. For access -// to incoming channels and requests, use net.Dial with NewClientConn -// instead. -func Dial(network, addr string, config *ClientConfig) (*Client, error) { - conn, err := net.DialTimeout(network, addr, config.Timeout) - if err != nil { - return nil, err - } - c, chans, reqs, err := NewClientConn(conn, addr, config) - if err != nil { - return nil, err - } - return NewClient(c, chans, reqs), nil -} - -// HostKeyCallback is the function type used for verifying server -// keys. A HostKeyCallback must return nil if the host key is OK, or -// an error to reject it. It receives the hostname as passed to Dial -// or NewClientConn. The remote address is the RemoteAddr of the -// net.Conn underlying the SSH connection. -type HostKeyCallback func(hostname string, remote net.Addr, key PublicKey) error - -// BannerCallback is the function type used for treat the banner sent by -// the server. A BannerCallback receives the message sent by the remote server. -type BannerCallback func(message string) error - -// A ClientConfig structure is used to configure a Client. It must not be -// modified after having been passed to an SSH function. -type ClientConfig struct { - // Config contains configuration that is shared between clients and - // servers. - Config - - // User contains the username to authenticate as. - User string - - // Auth contains possible authentication methods to use with the - // server. Only the first instance of a particular RFC 4252 method will - // be used during authentication. - Auth []AuthMethod - - // HostKeyCallback is called during the cryptographic - // handshake to validate the server's host key. The client - // configuration must supply this callback for the connection - // to succeed. The functions InsecureIgnoreHostKey or - // FixedHostKey can be used for simplistic host key checks. - HostKeyCallback HostKeyCallback - - // BannerCallback is called during the SSH dance to display a custom - // server's message. The client configuration can supply this callback to - // handle it as wished. The function BannerDisplayStderr can be used for - // simplistic display on Stderr. - BannerCallback BannerCallback - - // ClientVersion contains the version identification string that will - // be used for the connection. If empty, a reasonable default is used. - ClientVersion string - - // HostKeyAlgorithms lists the key types that the client will - // accept from the server as host key, in order of - // preference. If empty, a reasonable default is used. Any - // string returned from PublicKey.Type method may be used, or - // any of the CertAlgoXxxx and KeyAlgoXxxx constants. - HostKeyAlgorithms []string - - // Timeout is the maximum amount of time for the TCP connection to establish. - // - // A Timeout of zero means no timeout. - Timeout time.Duration -} - -// InsecureIgnoreHostKey returns a function that can be used for -// ClientConfig.HostKeyCallback to accept any host key. It should -// not be used for production code. -func InsecureIgnoreHostKey() HostKeyCallback { - return func(hostname string, remote net.Addr, key PublicKey) error { - return nil - } -} - -type fixedHostKey struct { - key PublicKey -} - -func (f *fixedHostKey) check(hostname string, remote net.Addr, key PublicKey) error { - if f.key == nil { - return fmt.Errorf("ssh: required host key was nil") - } - if !bytes.Equal(key.Marshal(), f.key.Marshal()) { - return fmt.Errorf("ssh: host key mismatch") - } - return nil -} - -// FixedHostKey returns a function for use in -// ClientConfig.HostKeyCallback to accept only a specific host key. -func FixedHostKey(key PublicKey) HostKeyCallback { - hk := &fixedHostKey{key} - return hk.check -} - -// BannerDisplayStderr returns a function that can be used for -// ClientConfig.BannerCallback to display banners on os.Stderr. -func BannerDisplayStderr() BannerCallback { - return func(banner string) error { - _, err := os.Stderr.WriteString(banner) - - return err - } -} diff --git a/vendor/golang.org/x/crypto/ssh/client_auth.go b/vendor/golang.org/x/crypto/ssh/client_auth.go deleted file mode 100644 index 5f44b77403e8..000000000000 --- a/vendor/golang.org/x/crypto/ssh/client_auth.go +++ /dev/null @@ -1,525 +0,0 @@ -// 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 ssh - -import ( - "bytes" - "errors" - "fmt" - "io" -) - -type authResult int - -const ( - authFailure authResult = iota - authPartialSuccess - authSuccess -) - -// clientAuthenticate authenticates with the remote server. See RFC 4252. -func (c *connection) clientAuthenticate(config *ClientConfig) error { - // initiate user auth session - if err := c.transport.writePacket(Marshal(&serviceRequestMsg{serviceUserAuth})); err != nil { - return err - } - packet, err := c.transport.readPacket() - if err != nil { - return err - } - var serviceAccept serviceAcceptMsg - if err := Unmarshal(packet, &serviceAccept); err != nil { - return err - } - - // during the authentication phase the client first attempts the "none" method - // then any untried methods suggested by the server. - tried := make(map[string]bool) - var lastMethods []string - - sessionID := c.transport.getSessionID() - for auth := AuthMethod(new(noneAuth)); auth != nil; { - ok, methods, err := auth.auth(sessionID, config.User, c.transport, config.Rand) - if err != nil { - return err - } - if ok == authSuccess { - // success - return nil - } else if ok == authFailure { - tried[auth.method()] = true - } - if methods == nil { - methods = lastMethods - } - lastMethods = methods - - auth = nil - - findNext: - for _, a := range config.Auth { - candidateMethod := a.method() - if tried[candidateMethod] { - continue - } - for _, meth := range methods { - if meth == candidateMethod { - auth = a - break findNext - } - } - } - } - return fmt.Errorf("ssh: unable to authenticate, attempted methods %v, no supported methods remain", keys(tried)) -} - -func keys(m map[string]bool) []string { - s := make([]string, 0, len(m)) - - for key := range m { - s = append(s, key) - } - return s -} - -// An AuthMethod represents an instance of an RFC 4252 authentication method. -type AuthMethod interface { - // auth authenticates user over transport t. - // Returns true if authentication is successful. - // If authentication is not successful, a []string of alternative - // method names is returned. If the slice is nil, it will be ignored - // and the previous set of possible methods will be reused. - auth(session []byte, user string, p packetConn, rand io.Reader) (authResult, []string, error) - - // method returns the RFC 4252 method name. - method() string -} - -// "none" authentication, RFC 4252 section 5.2. -type noneAuth int - -func (n *noneAuth) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { - if err := c.writePacket(Marshal(&userAuthRequestMsg{ - User: user, - Service: serviceSSH, - Method: "none", - })); err != nil { - return authFailure, nil, err - } - - return handleAuthResponse(c) -} - -func (n *noneAuth) method() string { - return "none" -} - -// passwordCallback is an AuthMethod that fetches the password through -// a function call, e.g. by prompting the user. -type passwordCallback func() (password string, err error) - -func (cb passwordCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { - type passwordAuthMsg struct { - User string `sshtype:"50"` - Service string - Method string - Reply bool - Password string - } - - pw, err := cb() - // REVIEW NOTE: is there a need to support skipping a password attempt? - // The program may only find out that the user doesn't have a password - // when prompting. - if err != nil { - return authFailure, nil, err - } - - if err := c.writePacket(Marshal(&passwordAuthMsg{ - User: user, - Service: serviceSSH, - Method: cb.method(), - Reply: false, - Password: pw, - })); err != nil { - return authFailure, nil, err - } - - return handleAuthResponse(c) -} - -func (cb passwordCallback) method() string { - return "password" -} - -// Password returns an AuthMethod using the given password. -func Password(secret string) AuthMethod { - return passwordCallback(func() (string, error) { return secret, nil }) -} - -// PasswordCallback returns an AuthMethod that uses a callback for -// fetching a password. -func PasswordCallback(prompt func() (secret string, err error)) AuthMethod { - return passwordCallback(prompt) -} - -type publickeyAuthMsg struct { - User string `sshtype:"50"` - Service string - Method string - // HasSig indicates to the receiver packet that the auth request is signed and - // should be used for authentication of the request. - HasSig bool - Algoname string - PubKey []byte - // Sig is tagged with "rest" so Marshal will exclude it during - // validateKey - Sig []byte `ssh:"rest"` -} - -// publicKeyCallback is an AuthMethod that uses a set of key -// pairs for authentication. -type publicKeyCallback func() ([]Signer, error) - -func (cb publicKeyCallback) method() string { - return "publickey" -} - -func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { - // Authentication is performed by sending an enquiry to test if a key is - // acceptable to the remote. If the key is acceptable, the client will - // attempt to authenticate with the valid key. If not the client will repeat - // the process with the remaining keys. - - signers, err := cb() - if err != nil { - return authFailure, nil, err - } - var methods []string - for _, signer := range signers { - ok, err := validateKey(signer.PublicKey(), user, c) - if err != nil { - return authFailure, nil, err - } - if !ok { - continue - } - - pub := signer.PublicKey() - pubKey := pub.Marshal() - sign, err := signer.Sign(rand, buildDataSignedForAuth(session, userAuthRequestMsg{ - User: user, - Service: serviceSSH, - Method: cb.method(), - }, []byte(pub.Type()), pubKey)) - if err != nil { - return authFailure, nil, err - } - - // manually wrap the serialized signature in a string - s := Marshal(sign) - sig := make([]byte, stringLength(len(s))) - marshalString(sig, s) - msg := publickeyAuthMsg{ - User: user, - Service: serviceSSH, - Method: cb.method(), - HasSig: true, - Algoname: pub.Type(), - PubKey: pubKey, - Sig: sig, - } - p := Marshal(&msg) - if err := c.writePacket(p); err != nil { - return authFailure, nil, err - } - var success authResult - success, methods, err = handleAuthResponse(c) - if err != nil { - return authFailure, nil, err - } - - // If authentication succeeds or the list of available methods does not - // contain the "publickey" method, do not attempt to authenticate with any - // other keys. According to RFC 4252 Section 7, the latter can occur when - // additional authentication methods are required. - if success == authSuccess || !containsMethod(methods, cb.method()) { - return success, methods, err - } - } - - return authFailure, methods, nil -} - -func containsMethod(methods []string, method string) bool { - for _, m := range methods { - if m == method { - return true - } - } - - return false -} - -// validateKey validates the key provided is acceptable to the server. -func validateKey(key PublicKey, user string, c packetConn) (bool, error) { - pubKey := key.Marshal() - msg := publickeyAuthMsg{ - User: user, - Service: serviceSSH, - Method: "publickey", - HasSig: false, - Algoname: key.Type(), - PubKey: pubKey, - } - if err := c.writePacket(Marshal(&msg)); err != nil { - return false, err - } - - return confirmKeyAck(key, c) -} - -func confirmKeyAck(key PublicKey, c packetConn) (bool, error) { - pubKey := key.Marshal() - algoname := key.Type() - - for { - packet, err := c.readPacket() - if err != nil { - return false, err - } - switch packet[0] { - case msgUserAuthBanner: - if err := handleBannerResponse(c, packet); err != nil { - return false, err - } - case msgUserAuthPubKeyOk: - var msg userAuthPubKeyOkMsg - if err := Unmarshal(packet, &msg); err != nil { - return false, err - } - if msg.Algo != algoname || !bytes.Equal(msg.PubKey, pubKey) { - return false, nil - } - return true, nil - case msgUserAuthFailure: - return false, nil - default: - return false, unexpectedMessageError(msgUserAuthSuccess, packet[0]) - } - } -} - -// PublicKeys returns an AuthMethod that uses the given key -// pairs. -func PublicKeys(signers ...Signer) AuthMethod { - return publicKeyCallback(func() ([]Signer, error) { return signers, nil }) -} - -// PublicKeysCallback returns an AuthMethod that runs the given -// function to obtain a list of key pairs. -func PublicKeysCallback(getSigners func() (signers []Signer, err error)) AuthMethod { - return publicKeyCallback(getSigners) -} - -// handleAuthResponse returns whether the preceding authentication request succeeded -// along with a list of remaining authentication methods to try next and -// an error if an unexpected response was received. -func handleAuthResponse(c packetConn) (authResult, []string, error) { - for { - packet, err := c.readPacket() - if err != nil { - return authFailure, nil, err - } - - switch packet[0] { - case msgUserAuthBanner: - if err := handleBannerResponse(c, packet); err != nil { - return authFailure, nil, err - } - case msgUserAuthFailure: - var msg userAuthFailureMsg - if err := Unmarshal(packet, &msg); err != nil { - return authFailure, nil, err - } - if msg.PartialSuccess { - return authPartialSuccess, msg.Methods, nil - } - return authFailure, msg.Methods, nil - case msgUserAuthSuccess: - return authSuccess, nil, nil - default: - return authFailure, nil, unexpectedMessageError(msgUserAuthSuccess, packet[0]) - } - } -} - -func handleBannerResponse(c packetConn, packet []byte) error { - var msg userAuthBannerMsg - if err := Unmarshal(packet, &msg); err != nil { - return err - } - - transport, ok := c.(*handshakeTransport) - if !ok { - return nil - } - - if transport.bannerCallback != nil { - return transport.bannerCallback(msg.Message) - } - - return nil -} - -// KeyboardInteractiveChallenge should print questions, optionally -// disabling echoing (e.g. for passwords), and return all the answers. -// Challenge may be called multiple times in a single session. After -// successful authentication, the server may send a challenge with no -// questions, for which the user and instruction messages should be -// printed. RFC 4256 section 3.3 details how the UI should behave for -// both CLI and GUI environments. -type KeyboardInteractiveChallenge func(user, instruction string, questions []string, echos []bool) (answers []string, err error) - -// KeyboardInteractive returns an AuthMethod using a prompt/response -// sequence controlled by the server. -func KeyboardInteractive(challenge KeyboardInteractiveChallenge) AuthMethod { - return challenge -} - -func (cb KeyboardInteractiveChallenge) method() string { - return "keyboard-interactive" -} - -func (cb KeyboardInteractiveChallenge) auth(session []byte, user string, c packetConn, rand io.Reader) (authResult, []string, error) { - type initiateMsg struct { - User string `sshtype:"50"` - Service string - Method string - Language string - Submethods string - } - - if err := c.writePacket(Marshal(&initiateMsg{ - User: user, - Service: serviceSSH, - Method: "keyboard-interactive", - })); err != nil { - return authFailure, nil, err - } - - for { - packet, err := c.readPacket() - if err != nil { - return authFailure, nil, err - } - - // like handleAuthResponse, but with less options. - switch packet[0] { - case msgUserAuthBanner: - if err := handleBannerResponse(c, packet); err != nil { - return authFailure, nil, err - } - continue - case msgUserAuthInfoRequest: - // OK - case msgUserAuthFailure: - var msg userAuthFailureMsg - if err := Unmarshal(packet, &msg); err != nil { - return authFailure, nil, err - } - if msg.PartialSuccess { - return authPartialSuccess, msg.Methods, nil - } - return authFailure, msg.Methods, nil - case msgUserAuthSuccess: - return authSuccess, nil, nil - default: - return authFailure, nil, unexpectedMessageError(msgUserAuthInfoRequest, packet[0]) - } - - var msg userAuthInfoRequestMsg - if err := Unmarshal(packet, &msg); err != nil { - return authFailure, nil, err - } - - // Manually unpack the prompt/echo pairs. - rest := msg.Prompts - var prompts []string - var echos []bool - for i := 0; i < int(msg.NumPrompts); i++ { - prompt, r, ok := parseString(rest) - if !ok || len(r) == 0 { - return authFailure, nil, errors.New("ssh: prompt format error") - } - prompts = append(prompts, string(prompt)) - echos = append(echos, r[0] != 0) - rest = r[1:] - } - - if len(rest) != 0 { - return authFailure, nil, errors.New("ssh: extra data following keyboard-interactive pairs") - } - - answers, err := cb(msg.User, msg.Instruction, prompts, echos) - if err != nil { - return authFailure, nil, err - } - - if len(answers) != len(prompts) { - return authFailure, nil, errors.New("ssh: not enough answers from keyboard-interactive callback") - } - responseLength := 1 + 4 - for _, a := range answers { - responseLength += stringLength(len(a)) - } - serialized := make([]byte, responseLength) - p := serialized - p[0] = msgUserAuthInfoResponse - p = p[1:] - p = marshalUint32(p, uint32(len(answers))) - for _, a := range answers { - p = marshalString(p, []byte(a)) - } - - if err := c.writePacket(serialized); err != nil { - return authFailure, nil, err - } - } -} - -type retryableAuthMethod struct { - authMethod AuthMethod - maxTries int -} - -func (r *retryableAuthMethod) auth(session []byte, user string, c packetConn, rand io.Reader) (ok authResult, methods []string, err error) { - for i := 0; r.maxTries <= 0 || i < r.maxTries; i++ { - ok, methods, err = r.authMethod.auth(session, user, c, rand) - if ok != authFailure || err != nil { // either success, partial success or error terminate - return ok, methods, err - } - } - return ok, methods, err -} - -func (r *retryableAuthMethod) method() string { - return r.authMethod.method() -} - -// RetryableAuthMethod is a decorator for other auth methods enabling them to -// be retried up to maxTries before considering that AuthMethod itself failed. -// If maxTries is <= 0, will retry indefinitely -// -// This is useful for interactive clients using challenge/response type -// authentication (e.g. Keyboard-Interactive, Password, etc) where the user -// could mistype their response resulting in the server issuing a -// SSH_MSG_USERAUTH_FAILURE (rfc4252 #8 [password] and rfc4256 #3.4 -// [keyboard-interactive]); Without this decorator, the non-retryable -// AuthMethod would be removed from future consideration, and never tried again -// (and so the user would never be able to retry their entry). -func RetryableAuthMethod(auth AuthMethod, maxTries int) AuthMethod { - return &retryableAuthMethod{authMethod: auth, maxTries: maxTries} -} diff --git a/vendor/golang.org/x/crypto/ssh/common.go b/vendor/golang.org/x/crypto/ssh/common.go deleted file mode 100644 index 04f3620b3d5e..000000000000 --- a/vendor/golang.org/x/crypto/ssh/common.go +++ /dev/null @@ -1,383 +0,0 @@ -// 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 ssh - -import ( - "crypto" - "crypto/rand" - "fmt" - "io" - "math" - "sync" - - _ "crypto/sha1" - _ "crypto/sha256" - _ "crypto/sha512" -) - -// These are string constants in the SSH protocol. -const ( - compressionNone = "none" - serviceUserAuth = "ssh-userauth" - serviceSSH = "ssh-connection" -) - -// supportedCiphers lists ciphers we support but might not recommend. -var supportedCiphers = []string{ - "aes128-ctr", "aes192-ctr", "aes256-ctr", - "aes128-gcm@openssh.com", - chacha20Poly1305ID, - "arcfour256", "arcfour128", "arcfour", - aes128cbcID, - tripledescbcID, -} - -// preferredCiphers specifies the default preference for ciphers. -var preferredCiphers = []string{ - "aes128-gcm@openssh.com", - chacha20Poly1305ID, - "aes128-ctr", "aes192-ctr", "aes256-ctr", -} - -// supportedKexAlgos specifies the supported key-exchange algorithms in -// preference order. -var supportedKexAlgos = []string{ - kexAlgoCurve25519SHA256, - // P384 and P521 are not constant-time yet, but since we don't - // reuse ephemeral keys, using them for ECDH should be OK. - kexAlgoECDH256, kexAlgoECDH384, kexAlgoECDH521, - kexAlgoDH14SHA1, kexAlgoDH1SHA1, -} - -// supportedHostKeyAlgos specifies the supported host-key algorithms (i.e. methods -// of authenticating servers) in preference order. -var supportedHostKeyAlgos = []string{ - CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, - CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01, - - KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, - KeyAlgoRSA, KeyAlgoDSA, - - KeyAlgoED25519, -} - -// supportedMACs specifies a default set of MAC algorithms in preference order. -// This is based on RFC 4253, section 6.4, but with hmac-md5 variants removed -// because they have reached the end of their useful life. -var supportedMACs = []string{ - "hmac-sha2-256-etm@openssh.com", "hmac-sha2-256", "hmac-sha1", "hmac-sha1-96", -} - -var supportedCompressions = []string{compressionNone} - -// hashFuncs keeps the mapping of supported algorithms to their respective -// hashes needed for signature verification. -var hashFuncs = map[string]crypto.Hash{ - KeyAlgoRSA: crypto.SHA1, - KeyAlgoDSA: crypto.SHA1, - KeyAlgoECDSA256: crypto.SHA256, - KeyAlgoECDSA384: crypto.SHA384, - KeyAlgoECDSA521: crypto.SHA512, - CertAlgoRSAv01: crypto.SHA1, - CertAlgoDSAv01: crypto.SHA1, - CertAlgoECDSA256v01: crypto.SHA256, - CertAlgoECDSA384v01: crypto.SHA384, - CertAlgoECDSA521v01: crypto.SHA512, -} - -// unexpectedMessageError results when the SSH message that we received didn't -// match what we wanted. -func unexpectedMessageError(expected, got uint8) error { - return fmt.Errorf("ssh: unexpected message type %d (expected %d)", got, expected) -} - -// parseError results from a malformed SSH message. -func parseError(tag uint8) error { - return fmt.Errorf("ssh: parse error in message type %d", tag) -} - -func findCommon(what string, client []string, server []string) (common string, err error) { - for _, c := range client { - for _, s := range server { - if c == s { - return c, nil - } - } - } - return "", fmt.Errorf("ssh: no common algorithm for %s; client offered: %v, server offered: %v", what, client, server) -} - -type directionAlgorithms struct { - Cipher string - MAC string - Compression string -} - -// rekeyBytes returns a rekeying intervals in bytes. -func (a *directionAlgorithms) rekeyBytes() int64 { - // According to RFC4344 block ciphers should rekey after - // 2^(BLOCKSIZE/4) blocks. For all AES flavors BLOCKSIZE is - // 128. - switch a.Cipher { - case "aes128-ctr", "aes192-ctr", "aes256-ctr", gcmCipherID, aes128cbcID: - return 16 * (1 << 32) - - } - - // For others, stick with RFC4253 recommendation to rekey after 1 Gb of data. - return 1 << 30 -} - -type algorithms struct { - kex string - hostKey string - w directionAlgorithms - r directionAlgorithms -} - -func findAgreedAlgorithms(clientKexInit, serverKexInit *kexInitMsg) (algs *algorithms, err error) { - result := &algorithms{} - - result.kex, err = findCommon("key exchange", clientKexInit.KexAlgos, serverKexInit.KexAlgos) - if err != nil { - return - } - - result.hostKey, err = findCommon("host key", clientKexInit.ServerHostKeyAlgos, serverKexInit.ServerHostKeyAlgos) - if err != nil { - return - } - - result.w.Cipher, err = findCommon("client to server cipher", clientKexInit.CiphersClientServer, serverKexInit.CiphersClientServer) - if err != nil { - return - } - - result.r.Cipher, err = findCommon("server to client cipher", clientKexInit.CiphersServerClient, serverKexInit.CiphersServerClient) - if err != nil { - return - } - - result.w.MAC, err = findCommon("client to server MAC", clientKexInit.MACsClientServer, serverKexInit.MACsClientServer) - if err != nil { - return - } - - result.r.MAC, err = findCommon("server to client MAC", clientKexInit.MACsServerClient, serverKexInit.MACsServerClient) - if err != nil { - return - } - - result.w.Compression, err = findCommon("client to server compression", clientKexInit.CompressionClientServer, serverKexInit.CompressionClientServer) - if err != nil { - return - } - - result.r.Compression, err = findCommon("server to client compression", clientKexInit.CompressionServerClient, serverKexInit.CompressionServerClient) - if err != nil { - return - } - - return result, nil -} - -// If rekeythreshold is too small, we can't make any progress sending -// stuff. -const minRekeyThreshold uint64 = 256 - -// Config contains configuration data common to both ServerConfig and -// ClientConfig. -type Config struct { - // Rand provides the source of entropy for cryptographic - // primitives. If Rand is nil, the cryptographic random reader - // in package crypto/rand will be used. - Rand io.Reader - - // The maximum number of bytes sent or received after which a - // new key is negotiated. It must be at least 256. If - // unspecified, a size suitable for the chosen cipher is used. - RekeyThreshold uint64 - - // The allowed key exchanges algorithms. If unspecified then a - // default set of algorithms is used. - KeyExchanges []string - - // The allowed cipher algorithms. If unspecified then a sensible - // default is used. - Ciphers []string - - // The allowed MAC algorithms. If unspecified then a sensible default - // is used. - MACs []string -} - -// SetDefaults sets sensible values for unset fields in config. This is -// exported for testing: Configs passed to SSH functions are copied and have -// default values set automatically. -func (c *Config) SetDefaults() { - if c.Rand == nil { - c.Rand = rand.Reader - } - if c.Ciphers == nil { - c.Ciphers = preferredCiphers - } - var ciphers []string - for _, c := range c.Ciphers { - if cipherModes[c] != nil { - // reject the cipher if we have no cipherModes definition - ciphers = append(ciphers, c) - } - } - c.Ciphers = ciphers - - if c.KeyExchanges == nil { - c.KeyExchanges = supportedKexAlgos - } - - if c.MACs == nil { - c.MACs = supportedMACs - } - - if c.RekeyThreshold == 0 { - // cipher specific default - } else if c.RekeyThreshold < minRekeyThreshold { - c.RekeyThreshold = minRekeyThreshold - } else if c.RekeyThreshold >= math.MaxInt64 { - // Avoid weirdness if somebody uses -1 as a threshold. - c.RekeyThreshold = math.MaxInt64 - } -} - -// buildDataSignedForAuth returns the data that is signed in order to prove -// possession of a private key. See RFC 4252, section 7. -func buildDataSignedForAuth(sessionID []byte, req userAuthRequestMsg, algo, pubKey []byte) []byte { - data := struct { - Session []byte - Type byte - User string - Service string - Method string - Sign bool - Algo []byte - PubKey []byte - }{ - sessionID, - msgUserAuthRequest, - req.User, - req.Service, - req.Method, - true, - algo, - pubKey, - } - return Marshal(data) -} - -func appendU16(buf []byte, n uint16) []byte { - return append(buf, byte(n>>8), byte(n)) -} - -func appendU32(buf []byte, n uint32) []byte { - return append(buf, byte(n>>24), byte(n>>16), byte(n>>8), byte(n)) -} - -func appendU64(buf []byte, n uint64) []byte { - return append(buf, - byte(n>>56), byte(n>>48), byte(n>>40), byte(n>>32), - byte(n>>24), byte(n>>16), byte(n>>8), byte(n)) -} - -func appendInt(buf []byte, n int) []byte { - return appendU32(buf, uint32(n)) -} - -func appendString(buf []byte, s string) []byte { - buf = appendU32(buf, uint32(len(s))) - buf = append(buf, s...) - return buf -} - -func appendBool(buf []byte, b bool) []byte { - if b { - return append(buf, 1) - } - return append(buf, 0) -} - -// newCond is a helper to hide the fact that there is no usable zero -// value for sync.Cond. -func newCond() *sync.Cond { return sync.NewCond(new(sync.Mutex)) } - -// window represents the buffer available to clients -// wishing to write to a channel. -type window struct { - *sync.Cond - win uint32 // RFC 4254 5.2 says the window size can grow to 2^32-1 - writeWaiters int - closed bool -} - -// add adds win to the amount of window available -// for consumers. -func (w *window) add(win uint32) bool { - // a zero sized window adjust is a noop. - if win == 0 { - return true - } - w.L.Lock() - if w.win+win < win { - w.L.Unlock() - return false - } - w.win += win - // It is unusual that multiple goroutines would be attempting to reserve - // window space, but not guaranteed. Use broadcast to notify all waiters - // that additional window is available. - w.Broadcast() - w.L.Unlock() - return true -} - -// close sets the window to closed, so all reservations fail -// immediately. -func (w *window) close() { - w.L.Lock() - w.closed = true - w.Broadcast() - w.L.Unlock() -} - -// reserve reserves win from the available window capacity. -// If no capacity remains, reserve will block. reserve may -// return less than requested. -func (w *window) reserve(win uint32) (uint32, error) { - var err error - w.L.Lock() - w.writeWaiters++ - w.Broadcast() - for w.win == 0 && !w.closed { - w.Wait() - } - w.writeWaiters-- - if w.win < win { - win = w.win - } - w.win -= win - if w.closed { - err = io.EOF - } - w.L.Unlock() - return win, err -} - -// waitWriterBlocked waits until some goroutine is blocked for further -// writes. It is used in tests only. -func (w *window) waitWriterBlocked() { - w.Cond.L.Lock() - for w.writeWaiters == 0 { - w.Cond.Wait() - } - w.Cond.L.Unlock() -} diff --git a/vendor/golang.org/x/crypto/ssh/connection.go b/vendor/golang.org/x/crypto/ssh/connection.go deleted file mode 100644 index fd6b0681b512..000000000000 --- a/vendor/golang.org/x/crypto/ssh/connection.go +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright 2013 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 ssh - -import ( - "fmt" - "net" -) - -// OpenChannelError is returned if the other side rejects an -// OpenChannel request. -type OpenChannelError struct { - Reason RejectionReason - Message string -} - -func (e *OpenChannelError) Error() string { - return fmt.Sprintf("ssh: rejected: %s (%s)", e.Reason, e.Message) -} - -// ConnMetadata holds metadata for the connection. -type ConnMetadata interface { - // User returns the user ID for this connection. - User() string - - // SessionID returns the session hash, also denoted by H. - SessionID() []byte - - // ClientVersion returns the client's version string as hashed - // into the session ID. - ClientVersion() []byte - - // ServerVersion returns the server's version string as hashed - // into the session ID. - ServerVersion() []byte - - // RemoteAddr returns the remote address for this connection. - RemoteAddr() net.Addr - - // LocalAddr returns the local address for this connection. - LocalAddr() net.Addr -} - -// Conn represents an SSH connection for both server and client roles. -// Conn is the basis for implementing an application layer, such -// as ClientConn, which implements the traditional shell access for -// clients. -type Conn interface { - ConnMetadata - - // SendRequest sends a global request, and returns the - // reply. If wantReply is true, it returns the response status - // and payload. See also RFC4254, section 4. - SendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error) - - // OpenChannel tries to open an channel. If the request is - // rejected, it returns *OpenChannelError. On success it returns - // the SSH Channel and a Go channel for incoming, out-of-band - // requests. The Go channel must be serviced, or the - // connection will hang. - OpenChannel(name string, data []byte) (Channel, <-chan *Request, error) - - // Close closes the underlying network connection - Close() error - - // Wait blocks until the connection has shut down, and returns the - // error causing the shutdown. - Wait() error - - // TODO(hanwen): consider exposing: - // RequestKeyChange - // Disconnect -} - -// DiscardRequests consumes and rejects all requests from the -// passed-in channel. -func DiscardRequests(in <-chan *Request) { - for req := range in { - if req.WantReply { - req.Reply(false, nil) - } - } -} - -// A connection represents an incoming connection. -type connection struct { - transport *handshakeTransport - sshConn - - // The connection protocol. - *mux -} - -func (c *connection) Close() error { - return c.sshConn.conn.Close() -} - -// sshconn provides net.Conn metadata, but disallows direct reads and -// writes. -type sshConn struct { - conn net.Conn - - user string - sessionID []byte - clientVersion []byte - serverVersion []byte -} - -func dup(src []byte) []byte { - dst := make([]byte, len(src)) - copy(dst, src) - return dst -} - -func (c *sshConn) User() string { - return c.user -} - -func (c *sshConn) RemoteAddr() net.Addr { - return c.conn.RemoteAddr() -} - -func (c *sshConn) Close() error { - return c.conn.Close() -} - -func (c *sshConn) LocalAddr() net.Addr { - return c.conn.LocalAddr() -} - -func (c *sshConn) SessionID() []byte { - return dup(c.sessionID) -} - -func (c *sshConn) ClientVersion() []byte { - return dup(c.clientVersion) -} - -func (c *sshConn) ServerVersion() []byte { - return dup(c.serverVersion) -} diff --git a/vendor/golang.org/x/crypto/ssh/doc.go b/vendor/golang.org/x/crypto/ssh/doc.go deleted file mode 100644 index 67b7322c0580..000000000000 --- a/vendor/golang.org/x/crypto/ssh/doc.go +++ /dev/null @@ -1,21 +0,0 @@ -// 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 ssh implements an SSH client and server. - -SSH is a transport security protocol, an authentication protocol and a -family of application protocols. The most typical application level -protocol is a remote shell and this is specifically implemented. However, -the multiplexed nature of SSH is exposed to users that wish to support -others. - -References: - [PROTOCOL.certkeys]: http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.certkeys?rev=HEAD - [SSH-PARAMETERS]: http://www.iana.org/assignments/ssh-parameters/ssh-parameters.xml#ssh-parameters-1 - -This package does not fall under the stability promise of the Go language itself, -so its API may be changed when pressing needs arise. -*/ -package ssh // import "golang.org/x/crypto/ssh" diff --git a/vendor/golang.org/x/crypto/ssh/handshake.go b/vendor/golang.org/x/crypto/ssh/handshake.go deleted file mode 100644 index 4f7912ecd656..000000000000 --- a/vendor/golang.org/x/crypto/ssh/handshake.go +++ /dev/null @@ -1,646 +0,0 @@ -// Copyright 2013 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 ssh - -import ( - "crypto/rand" - "errors" - "fmt" - "io" - "log" - "net" - "sync" -) - -// debugHandshake, if set, prints messages sent and received. Key -// exchange messages are printed as if DH were used, so the debug -// messages are wrong when using ECDH. -const debugHandshake = false - -// chanSize sets the amount of buffering SSH connections. This is -// primarily for testing: setting chanSize=0 uncovers deadlocks more -// quickly. -const chanSize = 16 - -// keyingTransport is a packet based transport that supports key -// changes. It need not be thread-safe. It should pass through -// msgNewKeys in both directions. -type keyingTransport interface { - packetConn - - // prepareKeyChange sets up a key change. The key change for a - // direction will be effected if a msgNewKeys message is sent - // or received. - prepareKeyChange(*algorithms, *kexResult) error -} - -// handshakeTransport implements rekeying on top of a keyingTransport -// and offers a thread-safe writePacket() interface. -type handshakeTransport struct { - conn keyingTransport - config *Config - - serverVersion []byte - clientVersion []byte - - // hostKeys is non-empty if we are the server. In that case, - // it contains all host keys that can be used to sign the - // connection. - hostKeys []Signer - - // hostKeyAlgorithms is non-empty if we are the client. In that case, - // we accept these key types from the server as host key. - hostKeyAlgorithms []string - - // On read error, incoming is closed, and readError is set. - incoming chan []byte - readError error - - mu sync.Mutex - writeError error - sentInitPacket []byte - sentInitMsg *kexInitMsg - pendingPackets [][]byte // Used when a key exchange is in progress. - - // If the read loop wants to schedule a kex, it pings this - // channel, and the write loop will send out a kex - // message. - requestKex chan struct{} - - // If the other side requests or confirms a kex, its kexInit - // packet is sent here for the write loop to find it. - startKex chan *pendingKex - - // data for host key checking - hostKeyCallback HostKeyCallback - dialAddress string - remoteAddr net.Addr - - // bannerCallback is non-empty if we are the client and it has been set in - // ClientConfig. In that case it is called during the user authentication - // dance to handle a custom server's message. - bannerCallback BannerCallback - - // Algorithms agreed in the last key exchange. - algorithms *algorithms - - readPacketsLeft uint32 - readBytesLeft int64 - - writePacketsLeft uint32 - writeBytesLeft int64 - - // The session ID or nil if first kex did not complete yet. - sessionID []byte -} - -type pendingKex struct { - otherInit []byte - done chan error -} - -func newHandshakeTransport(conn keyingTransport, config *Config, clientVersion, serverVersion []byte) *handshakeTransport { - t := &handshakeTransport{ - conn: conn, - serverVersion: serverVersion, - clientVersion: clientVersion, - incoming: make(chan []byte, chanSize), - requestKex: make(chan struct{}, 1), - startKex: make(chan *pendingKex, 1), - - config: config, - } - t.resetReadThresholds() - t.resetWriteThresholds() - - // We always start with a mandatory key exchange. - t.requestKex <- struct{}{} - return t -} - -func newClientTransport(conn keyingTransport, clientVersion, serverVersion []byte, config *ClientConfig, dialAddr string, addr net.Addr) *handshakeTransport { - t := newHandshakeTransport(conn, &config.Config, clientVersion, serverVersion) - t.dialAddress = dialAddr - t.remoteAddr = addr - t.hostKeyCallback = config.HostKeyCallback - t.bannerCallback = config.BannerCallback - if config.HostKeyAlgorithms != nil { - t.hostKeyAlgorithms = config.HostKeyAlgorithms - } else { - t.hostKeyAlgorithms = supportedHostKeyAlgos - } - go t.readLoop() - go t.kexLoop() - return t -} - -func newServerTransport(conn keyingTransport, clientVersion, serverVersion []byte, config *ServerConfig) *handshakeTransport { - t := newHandshakeTransport(conn, &config.Config, clientVersion, serverVersion) - t.hostKeys = config.hostKeys - go t.readLoop() - go t.kexLoop() - return t -} - -func (t *handshakeTransport) getSessionID() []byte { - return t.sessionID -} - -// waitSession waits for the session to be established. This should be -// the first thing to call after instantiating handshakeTransport. -func (t *handshakeTransport) waitSession() error { - p, err := t.readPacket() - if err != nil { - return err - } - if p[0] != msgNewKeys { - return fmt.Errorf("ssh: first packet should be msgNewKeys") - } - - return nil -} - -func (t *handshakeTransport) id() string { - if len(t.hostKeys) > 0 { - return "server" - } - return "client" -} - -func (t *handshakeTransport) printPacket(p []byte, write bool) { - action := "got" - if write { - action = "sent" - } - - if p[0] == msgChannelData || p[0] == msgChannelExtendedData { - log.Printf("%s %s data (packet %d bytes)", t.id(), action, len(p)) - } else { - msg, err := decode(p) - log.Printf("%s %s %T %v (%v)", t.id(), action, msg, msg, err) - } -} - -func (t *handshakeTransport) readPacket() ([]byte, error) { - p, ok := <-t.incoming - if !ok { - return nil, t.readError - } - return p, nil -} - -func (t *handshakeTransport) readLoop() { - first := true - for { - p, err := t.readOnePacket(first) - first = false - if err != nil { - t.readError = err - close(t.incoming) - break - } - if p[0] == msgIgnore || p[0] == msgDebug { - continue - } - t.incoming <- p - } - - // Stop writers too. - t.recordWriteError(t.readError) - - // Unblock the writer should it wait for this. - close(t.startKex) - - // Don't close t.requestKex; it's also written to from writePacket. -} - -func (t *handshakeTransport) pushPacket(p []byte) error { - if debugHandshake { - t.printPacket(p, true) - } - return t.conn.writePacket(p) -} - -func (t *handshakeTransport) getWriteError() error { - t.mu.Lock() - defer t.mu.Unlock() - return t.writeError -} - -func (t *handshakeTransport) recordWriteError(err error) { - t.mu.Lock() - defer t.mu.Unlock() - if t.writeError == nil && err != nil { - t.writeError = err - } -} - -func (t *handshakeTransport) requestKeyExchange() { - select { - case t.requestKex <- struct{}{}: - default: - // something already requested a kex, so do nothing. - } -} - -func (t *handshakeTransport) resetWriteThresholds() { - t.writePacketsLeft = packetRekeyThreshold - if t.config.RekeyThreshold > 0 { - t.writeBytesLeft = int64(t.config.RekeyThreshold) - } else if t.algorithms != nil { - t.writeBytesLeft = t.algorithms.w.rekeyBytes() - } else { - t.writeBytesLeft = 1 << 30 - } -} - -func (t *handshakeTransport) kexLoop() { - -write: - for t.getWriteError() == nil { - var request *pendingKex - var sent bool - - for request == nil || !sent { - var ok bool - select { - case request, ok = <-t.startKex: - if !ok { - break write - } - case <-t.requestKex: - break - } - - if !sent { - if err := t.sendKexInit(); err != nil { - t.recordWriteError(err) - break - } - sent = true - } - } - - if err := t.getWriteError(); err != nil { - if request != nil { - request.done <- err - } - break - } - - // We're not servicing t.requestKex, but that is OK: - // we never block on sending to t.requestKex. - - // We're not servicing t.startKex, but the remote end - // has just sent us a kexInitMsg, so it can't send - // another key change request, until we close the done - // channel on the pendingKex request. - - err := t.enterKeyExchange(request.otherInit) - - t.mu.Lock() - t.writeError = err - t.sentInitPacket = nil - t.sentInitMsg = nil - - t.resetWriteThresholds() - - // we have completed the key exchange. Since the - // reader is still blocked, it is safe to clear out - // the requestKex channel. This avoids the situation - // where: 1) we consumed our own request for the - // initial kex, and 2) the kex from the remote side - // caused another send on the requestKex channel, - clear: - for { - select { - case <-t.requestKex: - // - default: - break clear - } - } - - request.done <- t.writeError - - // kex finished. Push packets that we received while - // the kex was in progress. Don't look at t.startKex - // and don't increment writtenSinceKex: if we trigger - // another kex while we are still busy with the last - // one, things will become very confusing. - for _, p := range t.pendingPackets { - t.writeError = t.pushPacket(p) - if t.writeError != nil { - break - } - } - t.pendingPackets = t.pendingPackets[:0] - t.mu.Unlock() - } - - // drain startKex channel. We don't service t.requestKex - // because nobody does blocking sends there. - go func() { - for init := range t.startKex { - init.done <- t.writeError - } - }() - - // Unblock reader. - t.conn.Close() -} - -// The protocol uses uint32 for packet counters, so we can't let them -// reach 1<<32. We will actually read and write more packets than -// this, though: the other side may send more packets, and after we -// hit this limit on writing we will send a few more packets for the -// key exchange itself. -const packetRekeyThreshold = (1 << 31) - -func (t *handshakeTransport) resetReadThresholds() { - t.readPacketsLeft = packetRekeyThreshold - if t.config.RekeyThreshold > 0 { - t.readBytesLeft = int64(t.config.RekeyThreshold) - } else if t.algorithms != nil { - t.readBytesLeft = t.algorithms.r.rekeyBytes() - } else { - t.readBytesLeft = 1 << 30 - } -} - -func (t *handshakeTransport) readOnePacket(first bool) ([]byte, error) { - p, err := t.conn.readPacket() - if err != nil { - return nil, err - } - - if t.readPacketsLeft > 0 { - t.readPacketsLeft-- - } else { - t.requestKeyExchange() - } - - if t.readBytesLeft > 0 { - t.readBytesLeft -= int64(len(p)) - } else { - t.requestKeyExchange() - } - - if debugHandshake { - t.printPacket(p, false) - } - - if first && p[0] != msgKexInit { - return nil, fmt.Errorf("ssh: first packet should be msgKexInit") - } - - if p[0] != msgKexInit { - return p, nil - } - - firstKex := t.sessionID == nil - - kex := pendingKex{ - done: make(chan error, 1), - otherInit: p, - } - t.startKex <- &kex - err = <-kex.done - - if debugHandshake { - log.Printf("%s exited key exchange (first %v), err %v", t.id(), firstKex, err) - } - - if err != nil { - return nil, err - } - - t.resetReadThresholds() - - // By default, a key exchange is hidden from higher layers by - // translating it into msgIgnore. - successPacket := []byte{msgIgnore} - if firstKex { - // sendKexInit() for the first kex waits for - // msgNewKeys so the authentication process is - // guaranteed to happen over an encrypted transport. - successPacket = []byte{msgNewKeys} - } - - return successPacket, nil -} - -// sendKexInit sends a key change message. -func (t *handshakeTransport) sendKexInit() error { - t.mu.Lock() - defer t.mu.Unlock() - if t.sentInitMsg != nil { - // kexInits may be sent either in response to the other side, - // or because our side wants to initiate a key change, so we - // may have already sent a kexInit. In that case, don't send a - // second kexInit. - return nil - } - - msg := &kexInitMsg{ - KexAlgos: t.config.KeyExchanges, - CiphersClientServer: t.config.Ciphers, - CiphersServerClient: t.config.Ciphers, - MACsClientServer: t.config.MACs, - MACsServerClient: t.config.MACs, - CompressionClientServer: supportedCompressions, - CompressionServerClient: supportedCompressions, - } - io.ReadFull(rand.Reader, msg.Cookie[:]) - - if len(t.hostKeys) > 0 { - for _, k := range t.hostKeys { - msg.ServerHostKeyAlgos = append( - msg.ServerHostKeyAlgos, k.PublicKey().Type()) - } - } else { - msg.ServerHostKeyAlgos = t.hostKeyAlgorithms - } - packet := Marshal(msg) - - // writePacket destroys the contents, so save a copy. - packetCopy := make([]byte, len(packet)) - copy(packetCopy, packet) - - if err := t.pushPacket(packetCopy); err != nil { - return err - } - - t.sentInitMsg = msg - t.sentInitPacket = packet - - return nil -} - -func (t *handshakeTransport) writePacket(p []byte) error { - switch p[0] { - case msgKexInit: - return errors.New("ssh: only handshakeTransport can send kexInit") - case msgNewKeys: - return errors.New("ssh: only handshakeTransport can send newKeys") - } - - t.mu.Lock() - defer t.mu.Unlock() - if t.writeError != nil { - return t.writeError - } - - if t.sentInitMsg != nil { - // Copy the packet so the writer can reuse the buffer. - cp := make([]byte, len(p)) - copy(cp, p) - t.pendingPackets = append(t.pendingPackets, cp) - return nil - } - - if t.writeBytesLeft > 0 { - t.writeBytesLeft -= int64(len(p)) - } else { - t.requestKeyExchange() - } - - if t.writePacketsLeft > 0 { - t.writePacketsLeft-- - } else { - t.requestKeyExchange() - } - - if err := t.pushPacket(p); err != nil { - t.writeError = err - } - - return nil -} - -func (t *handshakeTransport) Close() error { - return t.conn.Close() -} - -func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error { - if debugHandshake { - log.Printf("%s entered key exchange", t.id()) - } - - otherInit := &kexInitMsg{} - if err := Unmarshal(otherInitPacket, otherInit); err != nil { - return err - } - - magics := handshakeMagics{ - clientVersion: t.clientVersion, - serverVersion: t.serverVersion, - clientKexInit: otherInitPacket, - serverKexInit: t.sentInitPacket, - } - - clientInit := otherInit - serverInit := t.sentInitMsg - if len(t.hostKeys) == 0 { - clientInit, serverInit = serverInit, clientInit - - magics.clientKexInit = t.sentInitPacket - magics.serverKexInit = otherInitPacket - } - - var err error - t.algorithms, err = findAgreedAlgorithms(clientInit, serverInit) - if err != nil { - return err - } - - // We don't send FirstKexFollows, but we handle receiving it. - // - // RFC 4253 section 7 defines the kex and the agreement method for - // first_kex_packet_follows. It states that the guessed packet - // should be ignored if the "kex algorithm and/or the host - // key algorithm is guessed wrong (server and client have - // different preferred algorithm), or if any of the other - // algorithms cannot be agreed upon". The other algorithms have - // already been checked above so the kex algorithm and host key - // algorithm are checked here. - if otherInit.FirstKexFollows && (clientInit.KexAlgos[0] != serverInit.KexAlgos[0] || clientInit.ServerHostKeyAlgos[0] != serverInit.ServerHostKeyAlgos[0]) { - // other side sent a kex message for the wrong algorithm, - // which we have to ignore. - if _, err := t.conn.readPacket(); err != nil { - return err - } - } - - kex, ok := kexAlgoMap[t.algorithms.kex] - if !ok { - return fmt.Errorf("ssh: unexpected key exchange algorithm %v", t.algorithms.kex) - } - - var result *kexResult - if len(t.hostKeys) > 0 { - result, err = t.server(kex, t.algorithms, &magics) - } else { - result, err = t.client(kex, t.algorithms, &magics) - } - - if err != nil { - return err - } - - if t.sessionID == nil { - t.sessionID = result.H - } - result.SessionID = t.sessionID - - if err := t.conn.prepareKeyChange(t.algorithms, result); err != nil { - return err - } - if err = t.conn.writePacket([]byte{msgNewKeys}); err != nil { - return err - } - if packet, err := t.conn.readPacket(); err != nil { - return err - } else if packet[0] != msgNewKeys { - return unexpectedMessageError(msgNewKeys, packet[0]) - } - - return nil -} - -func (t *handshakeTransport) server(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) { - var hostKey Signer - for _, k := range t.hostKeys { - if algs.hostKey == k.PublicKey().Type() { - hostKey = k - } - } - - r, err := kex.Server(t.conn, t.config.Rand, magics, hostKey) - return r, err -} - -func (t *handshakeTransport) client(kex kexAlgorithm, algs *algorithms, magics *handshakeMagics) (*kexResult, error) { - result, err := kex.Client(t.conn, t.config.Rand, magics) - if err != nil { - return nil, err - } - - hostKey, err := ParsePublicKey(result.HostKey) - if err != nil { - return nil, err - } - - if err := verifyHostKeySignature(hostKey, result); err != nil { - return nil, err - } - - err = t.hostKeyCallback(t.dialAddress, t.remoteAddr, hostKey) - if err != nil { - return nil, err - } - - return result, nil -} diff --git a/vendor/golang.org/x/crypto/ssh/kex.go b/vendor/golang.org/x/crypto/ssh/kex.go deleted file mode 100644 index f34bcc013325..000000000000 --- a/vendor/golang.org/x/crypto/ssh/kex.go +++ /dev/null @@ -1,540 +0,0 @@ -// Copyright 2013 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 ssh - -import ( - "crypto" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/rand" - "crypto/subtle" - "errors" - "io" - "math/big" - - "golang.org/x/crypto/curve25519" -) - -const ( - kexAlgoDH1SHA1 = "diffie-hellman-group1-sha1" - kexAlgoDH14SHA1 = "diffie-hellman-group14-sha1" - kexAlgoECDH256 = "ecdh-sha2-nistp256" - kexAlgoECDH384 = "ecdh-sha2-nistp384" - kexAlgoECDH521 = "ecdh-sha2-nistp521" - kexAlgoCurve25519SHA256 = "curve25519-sha256@libssh.org" -) - -// kexResult captures the outcome of a key exchange. -type kexResult struct { - // Session hash. See also RFC 4253, section 8. - H []byte - - // Shared secret. See also RFC 4253, section 8. - K []byte - - // Host key as hashed into H. - HostKey []byte - - // Signature of H. - Signature []byte - - // A cryptographic hash function that matches the security - // level of the key exchange algorithm. It is used for - // calculating H, and for deriving keys from H and K. - Hash crypto.Hash - - // The session ID, which is the first H computed. This is used - // to derive key material inside the transport. - SessionID []byte -} - -// handshakeMagics contains data that is always included in the -// session hash. -type handshakeMagics struct { - clientVersion, serverVersion []byte - clientKexInit, serverKexInit []byte -} - -func (m *handshakeMagics) write(w io.Writer) { - writeString(w, m.clientVersion) - writeString(w, m.serverVersion) - writeString(w, m.clientKexInit) - writeString(w, m.serverKexInit) -} - -// kexAlgorithm abstracts different key exchange algorithms. -type kexAlgorithm interface { - // Server runs server-side key agreement, signing the result - // with a hostkey. - Server(p packetConn, rand io.Reader, magics *handshakeMagics, s Signer) (*kexResult, error) - - // Client runs the client-side key agreement. Caller is - // responsible for verifying the host key signature. - Client(p packetConn, rand io.Reader, magics *handshakeMagics) (*kexResult, error) -} - -// dhGroup is a multiplicative group suitable for implementing Diffie-Hellman key agreement. -type dhGroup struct { - g, p, pMinus1 *big.Int -} - -func (group *dhGroup) diffieHellman(theirPublic, myPrivate *big.Int) (*big.Int, error) { - if theirPublic.Cmp(bigOne) <= 0 || theirPublic.Cmp(group.pMinus1) >= 0 { - return nil, errors.New("ssh: DH parameter out of bounds") - } - return new(big.Int).Exp(theirPublic, myPrivate, group.p), nil -} - -func (group *dhGroup) Client(c packetConn, randSource io.Reader, magics *handshakeMagics) (*kexResult, error) { - hashFunc := crypto.SHA1 - - var x *big.Int - for { - var err error - if x, err = rand.Int(randSource, group.pMinus1); err != nil { - return nil, err - } - if x.Sign() > 0 { - break - } - } - - X := new(big.Int).Exp(group.g, x, group.p) - kexDHInit := kexDHInitMsg{ - X: X, - } - if err := c.writePacket(Marshal(&kexDHInit)); err != nil { - return nil, err - } - - packet, err := c.readPacket() - if err != nil { - return nil, err - } - - var kexDHReply kexDHReplyMsg - if err = Unmarshal(packet, &kexDHReply); err != nil { - return nil, err - } - - ki, err := group.diffieHellman(kexDHReply.Y, x) - if err != nil { - return nil, err - } - - h := hashFunc.New() - magics.write(h) - writeString(h, kexDHReply.HostKey) - writeInt(h, X) - writeInt(h, kexDHReply.Y) - K := make([]byte, intLength(ki)) - marshalInt(K, ki) - h.Write(K) - - return &kexResult{ - H: h.Sum(nil), - K: K, - HostKey: kexDHReply.HostKey, - Signature: kexDHReply.Signature, - Hash: crypto.SHA1, - }, nil -} - -func (group *dhGroup) Server(c packetConn, randSource io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { - hashFunc := crypto.SHA1 - packet, err := c.readPacket() - if err != nil { - return - } - var kexDHInit kexDHInitMsg - if err = Unmarshal(packet, &kexDHInit); err != nil { - return - } - - var y *big.Int - for { - if y, err = rand.Int(randSource, group.pMinus1); err != nil { - return - } - if y.Sign() > 0 { - break - } - } - - Y := new(big.Int).Exp(group.g, y, group.p) - ki, err := group.diffieHellman(kexDHInit.X, y) - if err != nil { - return nil, err - } - - hostKeyBytes := priv.PublicKey().Marshal() - - h := hashFunc.New() - magics.write(h) - writeString(h, hostKeyBytes) - writeInt(h, kexDHInit.X) - writeInt(h, Y) - - K := make([]byte, intLength(ki)) - marshalInt(K, ki) - h.Write(K) - - H := h.Sum(nil) - - // H is already a hash, but the hostkey signing will apply its - // own key-specific hash algorithm. - sig, err := signAndMarshal(priv, randSource, H) - if err != nil { - return nil, err - } - - kexDHReply := kexDHReplyMsg{ - HostKey: hostKeyBytes, - Y: Y, - Signature: sig, - } - packet = Marshal(&kexDHReply) - - err = c.writePacket(packet) - return &kexResult{ - H: H, - K: K, - HostKey: hostKeyBytes, - Signature: sig, - Hash: crypto.SHA1, - }, nil -} - -// ecdh performs Elliptic Curve Diffie-Hellman key exchange as -// described in RFC 5656, section 4. -type ecdh struct { - curve elliptic.Curve -} - -func (kex *ecdh) Client(c packetConn, rand io.Reader, magics *handshakeMagics) (*kexResult, error) { - ephKey, err := ecdsa.GenerateKey(kex.curve, rand) - if err != nil { - return nil, err - } - - kexInit := kexECDHInitMsg{ - ClientPubKey: elliptic.Marshal(kex.curve, ephKey.PublicKey.X, ephKey.PublicKey.Y), - } - - serialized := Marshal(&kexInit) - if err := c.writePacket(serialized); err != nil { - return nil, err - } - - packet, err := c.readPacket() - if err != nil { - return nil, err - } - - var reply kexECDHReplyMsg - if err = Unmarshal(packet, &reply); err != nil { - return nil, err - } - - x, y, err := unmarshalECKey(kex.curve, reply.EphemeralPubKey) - if err != nil { - return nil, err - } - - // generate shared secret - secret, _ := kex.curve.ScalarMult(x, y, ephKey.D.Bytes()) - - h := ecHash(kex.curve).New() - magics.write(h) - writeString(h, reply.HostKey) - writeString(h, kexInit.ClientPubKey) - writeString(h, reply.EphemeralPubKey) - K := make([]byte, intLength(secret)) - marshalInt(K, secret) - h.Write(K) - - return &kexResult{ - H: h.Sum(nil), - K: K, - HostKey: reply.HostKey, - Signature: reply.Signature, - Hash: ecHash(kex.curve), - }, nil -} - -// unmarshalECKey parses and checks an EC key. -func unmarshalECKey(curve elliptic.Curve, pubkey []byte) (x, y *big.Int, err error) { - x, y = elliptic.Unmarshal(curve, pubkey) - if x == nil { - return nil, nil, errors.New("ssh: elliptic.Unmarshal failure") - } - if !validateECPublicKey(curve, x, y) { - return nil, nil, errors.New("ssh: public key not on curve") - } - return x, y, nil -} - -// validateECPublicKey checks that the point is a valid public key for -// the given curve. See [SEC1], 3.2.2 -func validateECPublicKey(curve elliptic.Curve, x, y *big.Int) bool { - if x.Sign() == 0 && y.Sign() == 0 { - return false - } - - if x.Cmp(curve.Params().P) >= 0 { - return false - } - - if y.Cmp(curve.Params().P) >= 0 { - return false - } - - if !curve.IsOnCurve(x, y) { - return false - } - - // We don't check if N * PubKey == 0, since - // - // - the NIST curves have cofactor = 1, so this is implicit. - // (We don't foresee an implementation that supports non NIST - // curves) - // - // - for ephemeral keys, we don't need to worry about small - // subgroup attacks. - return true -} - -func (kex *ecdh) Server(c packetConn, rand io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { - packet, err := c.readPacket() - if err != nil { - return nil, err - } - - var kexECDHInit kexECDHInitMsg - if err = Unmarshal(packet, &kexECDHInit); err != nil { - return nil, err - } - - clientX, clientY, err := unmarshalECKey(kex.curve, kexECDHInit.ClientPubKey) - if err != nil { - return nil, err - } - - // We could cache this key across multiple users/multiple - // connection attempts, but the benefit is small. OpenSSH - // generates a new key for each incoming connection. - ephKey, err := ecdsa.GenerateKey(kex.curve, rand) - if err != nil { - return nil, err - } - - hostKeyBytes := priv.PublicKey().Marshal() - - serializedEphKey := elliptic.Marshal(kex.curve, ephKey.PublicKey.X, ephKey.PublicKey.Y) - - // generate shared secret - secret, _ := kex.curve.ScalarMult(clientX, clientY, ephKey.D.Bytes()) - - h := ecHash(kex.curve).New() - magics.write(h) - writeString(h, hostKeyBytes) - writeString(h, kexECDHInit.ClientPubKey) - writeString(h, serializedEphKey) - - K := make([]byte, intLength(secret)) - marshalInt(K, secret) - h.Write(K) - - H := h.Sum(nil) - - // H is already a hash, but the hostkey signing will apply its - // own key-specific hash algorithm. - sig, err := signAndMarshal(priv, rand, H) - if err != nil { - return nil, err - } - - reply := kexECDHReplyMsg{ - EphemeralPubKey: serializedEphKey, - HostKey: hostKeyBytes, - Signature: sig, - } - - serialized := Marshal(&reply) - if err := c.writePacket(serialized); err != nil { - return nil, err - } - - return &kexResult{ - H: H, - K: K, - HostKey: reply.HostKey, - Signature: sig, - Hash: ecHash(kex.curve), - }, nil -} - -var kexAlgoMap = map[string]kexAlgorithm{} - -func init() { - // This is the group called diffie-hellman-group1-sha1 in RFC - // 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, - pMinus1: new(big.Int).Sub(p, bigOne), - } - - // This is the group called diffie-hellman-group14-sha1 in RFC - // 4253 and Oakley Group 14 in RFC 3526. - p, _ = new(big.Int).SetString("FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF", 16) - - kexAlgoMap[kexAlgoDH14SHA1] = &dhGroup{ - g: new(big.Int).SetInt64(2), - p: p, - pMinus1: new(big.Int).Sub(p, bigOne), - } - - kexAlgoMap[kexAlgoECDH521] = &ecdh{elliptic.P521()} - kexAlgoMap[kexAlgoECDH384] = &ecdh{elliptic.P384()} - kexAlgoMap[kexAlgoECDH256] = &ecdh{elliptic.P256()} - kexAlgoMap[kexAlgoCurve25519SHA256] = &curve25519sha256{} -} - -// curve25519sha256 implements the curve25519-sha256@libssh.org key -// agreement protocol, as described in -// https://git.libssh.org/projects/libssh.git/tree/doc/curve25519-sha256@libssh.org.txt -type curve25519sha256 struct{} - -type curve25519KeyPair struct { - priv [32]byte - pub [32]byte -} - -func (kp *curve25519KeyPair) generate(rand io.Reader) error { - if _, err := io.ReadFull(rand, kp.priv[:]); err != nil { - return err - } - curve25519.ScalarBaseMult(&kp.pub, &kp.priv) - return nil -} - -// curve25519Zeros is just an array of 32 zero bytes so that we have something -// convenient to compare against in order to reject curve25519 points with the -// wrong order. -var curve25519Zeros [32]byte - -func (kex *curve25519sha256) Client(c packetConn, rand io.Reader, magics *handshakeMagics) (*kexResult, error) { - var kp curve25519KeyPair - if err := kp.generate(rand); err != nil { - return nil, err - } - if err := c.writePacket(Marshal(&kexECDHInitMsg{kp.pub[:]})); err != nil { - return nil, err - } - - packet, err := c.readPacket() - if err != nil { - return nil, err - } - - var reply kexECDHReplyMsg - if err = Unmarshal(packet, &reply); err != nil { - return nil, err - } - if len(reply.EphemeralPubKey) != 32 { - return nil, errors.New("ssh: peer's curve25519 public value has wrong length") - } - - var servPub, secret [32]byte - copy(servPub[:], reply.EphemeralPubKey) - curve25519.ScalarMult(&secret, &kp.priv, &servPub) - if subtle.ConstantTimeCompare(secret[:], curve25519Zeros[:]) == 1 { - return nil, errors.New("ssh: peer's curve25519 public value has wrong order") - } - - h := crypto.SHA256.New() - magics.write(h) - writeString(h, reply.HostKey) - writeString(h, kp.pub[:]) - writeString(h, reply.EphemeralPubKey) - - ki := new(big.Int).SetBytes(secret[:]) - K := make([]byte, intLength(ki)) - marshalInt(K, ki) - h.Write(K) - - return &kexResult{ - H: h.Sum(nil), - K: K, - HostKey: reply.HostKey, - Signature: reply.Signature, - Hash: crypto.SHA256, - }, nil -} - -func (kex *curve25519sha256) Server(c packetConn, rand io.Reader, magics *handshakeMagics, priv Signer) (result *kexResult, err error) { - packet, err := c.readPacket() - if err != nil { - return - } - var kexInit kexECDHInitMsg - if err = Unmarshal(packet, &kexInit); err != nil { - return - } - - if len(kexInit.ClientPubKey) != 32 { - return nil, errors.New("ssh: peer's curve25519 public value has wrong length") - } - - var kp curve25519KeyPair - if err := kp.generate(rand); err != nil { - return nil, err - } - - var clientPub, secret [32]byte - copy(clientPub[:], kexInit.ClientPubKey) - curve25519.ScalarMult(&secret, &kp.priv, &clientPub) - if subtle.ConstantTimeCompare(secret[:], curve25519Zeros[:]) == 1 { - return nil, errors.New("ssh: peer's curve25519 public value has wrong order") - } - - hostKeyBytes := priv.PublicKey().Marshal() - - h := crypto.SHA256.New() - magics.write(h) - writeString(h, hostKeyBytes) - writeString(h, kexInit.ClientPubKey) - writeString(h, kp.pub[:]) - - ki := new(big.Int).SetBytes(secret[:]) - K := make([]byte, intLength(ki)) - marshalInt(K, ki) - h.Write(K) - - H := h.Sum(nil) - - sig, err := signAndMarshal(priv, rand, H) - if err != nil { - return nil, err - } - - reply := kexECDHReplyMsg{ - EphemeralPubKey: kp.pub[:], - HostKey: hostKeyBytes, - Signature: sig, - } - if err := c.writePacket(Marshal(&reply)); err != nil { - return nil, err - } - return &kexResult{ - H: H, - K: K, - HostKey: hostKeyBytes, - Signature: sig, - Hash: crypto.SHA256, - }, nil -} diff --git a/vendor/golang.org/x/crypto/ssh/keys.go b/vendor/golang.org/x/crypto/ssh/keys.go deleted file mode 100644 index 969804794fb8..000000000000 --- a/vendor/golang.org/x/crypto/ssh/keys.go +++ /dev/null @@ -1,1100 +0,0 @@ -// 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 ssh - -import ( - "bytes" - "crypto" - "crypto/dsa" - "crypto/ecdsa" - "crypto/elliptic" - "crypto/md5" - "crypto/rsa" - "crypto/sha256" - "crypto/x509" - "encoding/asn1" - "encoding/base64" - "encoding/hex" - "encoding/pem" - "errors" - "fmt" - "io" - "math/big" - "strings" - - "golang.org/x/crypto/ed25519" -) - -// These constants represent the algorithm names for key types supported by this -// package. -const ( - KeyAlgoRSA = "ssh-rsa" - KeyAlgoDSA = "ssh-dss" - KeyAlgoECDSA256 = "ecdsa-sha2-nistp256" - KeyAlgoECDSA384 = "ecdsa-sha2-nistp384" - KeyAlgoECDSA521 = "ecdsa-sha2-nistp521" - KeyAlgoED25519 = "ssh-ed25519" -) - -// These constants represent non-default signature algorithms that are supported -// as algorithm parameters to AlgorithmSigner.SignWithAlgorithm methods. See -// [PROTOCOL.agent] section 4.5.1 and -// https://tools.ietf.org/html/draft-ietf-curdle-rsa-sha2-10 -const ( - SigAlgoRSA = "ssh-rsa" - SigAlgoRSASHA2256 = "rsa-sha2-256" - SigAlgoRSASHA2512 = "rsa-sha2-512" -) - -// parsePubKey parses a public key of the given algorithm. -// Use ParsePublicKey for keys with prepended algorithm. -func parsePubKey(in []byte, algo string) (pubKey PublicKey, rest []byte, err error) { - switch algo { - case KeyAlgoRSA: - return parseRSA(in) - case KeyAlgoDSA: - return parseDSA(in) - case KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521: - return parseECDSA(in) - case KeyAlgoED25519: - return parseED25519(in) - case CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01: - cert, err := parseCert(in, certToPrivAlgo(algo)) - if err != nil { - return nil, nil, err - } - return cert, nil, nil - } - return nil, nil, fmt.Errorf("ssh: unknown key algorithm: %v", algo) -} - -// parseAuthorizedKey parses a public key in OpenSSH authorized_keys format -// (see sshd(8) manual page) once the options and key type fields have been -// removed. -func parseAuthorizedKey(in []byte) (out PublicKey, comment string, err error) { - in = bytes.TrimSpace(in) - - i := bytes.IndexAny(in, " \t") - if i == -1 { - i = len(in) - } - base64Key := in[:i] - - key := make([]byte, base64.StdEncoding.DecodedLen(len(base64Key))) - n, err := base64.StdEncoding.Decode(key, base64Key) - if err != nil { - return nil, "", err - } - key = key[:n] - out, err = ParsePublicKey(key) - if err != nil { - return nil, "", err - } - comment = string(bytes.TrimSpace(in[i:])) - return out, comment, nil -} - -// ParseKnownHosts parses an entry in the format of the known_hosts file. -// -// The known_hosts format is documented in the sshd(8) manual page. This -// function will parse a single entry from in. On successful return, marker -// will contain the optional marker value (i.e. "cert-authority" or "revoked") -// or else be empty, hosts will contain the hosts that this entry matches, -// pubKey will contain the public key and comment will contain any trailing -// comment at the end of the line. See the sshd(8) manual page for the various -// forms that a host string can take. -// -// The unparsed remainder of the input will be returned in rest. This function -// can be called repeatedly to parse multiple entries. -// -// If no entries were found in the input then err will be io.EOF. Otherwise a -// non-nil err value indicates a parse error. -func ParseKnownHosts(in []byte) (marker string, hosts []string, pubKey PublicKey, comment string, rest []byte, err error) { - for len(in) > 0 { - end := bytes.IndexByte(in, '\n') - if end != -1 { - rest = in[end+1:] - in = in[:end] - } else { - rest = nil - } - - end = bytes.IndexByte(in, '\r') - if end != -1 { - in = in[:end] - } - - in = bytes.TrimSpace(in) - if len(in) == 0 || in[0] == '#' { - in = rest - continue - } - - i := bytes.IndexAny(in, " \t") - if i == -1 { - in = rest - continue - } - - // Strip out the beginning of the known_host key. - // This is either an optional marker or a (set of) hostname(s). - keyFields := bytes.Fields(in) - if len(keyFields) < 3 || len(keyFields) > 5 { - return "", nil, nil, "", nil, errors.New("ssh: invalid entry in known_hosts data") - } - - // keyFields[0] is either "@cert-authority", "@revoked" or a comma separated - // list of hosts - marker := "" - if keyFields[0][0] == '@' { - marker = string(keyFields[0][1:]) - keyFields = keyFields[1:] - } - - hosts := string(keyFields[0]) - // keyFields[1] contains the key type (e.g. “ssh-rsa”). - // However, that information is duplicated inside the - // base64-encoded key and so is ignored here. - - key := bytes.Join(keyFields[2:], []byte(" ")) - if pubKey, comment, err = parseAuthorizedKey(key); err != nil { - return "", nil, nil, "", nil, err - } - - return marker, strings.Split(hosts, ","), pubKey, comment, rest, nil - } - - return "", nil, nil, "", nil, io.EOF -} - -// ParseAuthorizedKeys parses a public key from an authorized_keys -// file used in OpenSSH according to the sshd(8) manual page. -func ParseAuthorizedKey(in []byte) (out PublicKey, comment string, options []string, rest []byte, err error) { - for len(in) > 0 { - end := bytes.IndexByte(in, '\n') - if end != -1 { - rest = in[end+1:] - in = in[:end] - } else { - rest = nil - } - - end = bytes.IndexByte(in, '\r') - if end != -1 { - in = in[:end] - } - - in = bytes.TrimSpace(in) - if len(in) == 0 || in[0] == '#' { - in = rest - continue - } - - i := bytes.IndexAny(in, " \t") - if i == -1 { - in = rest - continue - } - - if out, comment, err = parseAuthorizedKey(in[i:]); err == nil { - return out, comment, options, rest, nil - } - - // No key type recognised. Maybe there's an options field at - // the beginning. - var b byte - inQuote := false - var candidateOptions []string - optionStart := 0 - for i, b = range in { - isEnd := !inQuote && (b == ' ' || b == '\t') - if (b == ',' && !inQuote) || isEnd { - if i-optionStart > 0 { - candidateOptions = append(candidateOptions, string(in[optionStart:i])) - } - optionStart = i + 1 - } - if isEnd { - break - } - if b == '"' && (i == 0 || (i > 0 && in[i-1] != '\\')) { - inQuote = !inQuote - } - } - for i < len(in) && (in[i] == ' ' || in[i] == '\t') { - i++ - } - if i == len(in) { - // Invalid line: unmatched quote - in = rest - continue - } - - in = in[i:] - i = bytes.IndexAny(in, " \t") - if i == -1 { - in = rest - continue - } - - if out, comment, err = parseAuthorizedKey(in[i:]); err == nil { - options = candidateOptions - return out, comment, options, rest, nil - } - - in = rest - continue - } - - return nil, "", nil, nil, errors.New("ssh: no key found") -} - -// ParsePublicKey parses an SSH public key formatted for use in -// the SSH wire protocol according to RFC 4253, section 6.6. -func ParsePublicKey(in []byte) (out PublicKey, err error) { - algo, in, ok := parseString(in) - if !ok { - return nil, errShortRead - } - var rest []byte - out, rest, err = parsePubKey(in, string(algo)) - if len(rest) > 0 { - return nil, errors.New("ssh: trailing junk in public key") - } - - return out, err -} - -// MarshalAuthorizedKey serializes key for inclusion in an OpenSSH -// authorized_keys file. The return value ends with newline. -func MarshalAuthorizedKey(key PublicKey) []byte { - b := &bytes.Buffer{} - b.WriteString(key.Type()) - b.WriteByte(' ') - e := base64.NewEncoder(base64.StdEncoding, b) - e.Write(key.Marshal()) - e.Close() - b.WriteByte('\n') - return b.Bytes() -} - -// PublicKey is an abstraction of different types of public keys. -type PublicKey interface { - // Type returns the key's type, e.g. "ssh-rsa". - Type() string - - // Marshal returns the serialized key data in SSH wire format, - // with the name prefix. To unmarshal the returned data, use - // the ParsePublicKey function. - Marshal() []byte - - // Verify that sig is a signature on the given data using this - // key. This function will hash the data appropriately first. - Verify(data []byte, sig *Signature) error -} - -// CryptoPublicKey, if implemented by a PublicKey, -// returns the underlying crypto.PublicKey form of the key. -type CryptoPublicKey interface { - CryptoPublicKey() crypto.PublicKey -} - -// A Signer can create signatures that verify against a public key. -type Signer interface { - // PublicKey returns an associated PublicKey instance. - PublicKey() PublicKey - - // Sign returns raw signature for the given data. This method - // will apply the hash specified for the keytype to the data. - Sign(rand io.Reader, data []byte) (*Signature, error) -} - -// A AlgorithmSigner is a Signer that also supports specifying a specific -// algorithm to use for signing. -type AlgorithmSigner interface { - Signer - - // SignWithAlgorithm is like Signer.Sign, but allows specification of a - // non-default signing algorithm. See the SigAlgo* constants in this - // package for signature algorithms supported by this package. Callers may - // pass an empty string for the algorithm in which case the AlgorithmSigner - // will use its default algorithm. - SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) -} - -type rsaPublicKey rsa.PublicKey - -func (r *rsaPublicKey) Type() string { - return "ssh-rsa" -} - -// parseRSA parses an RSA key according to RFC 4253, section 6.6. -func parseRSA(in []byte) (out PublicKey, rest []byte, err error) { - var w struct { - E *big.Int - N *big.Int - Rest []byte `ssh:"rest"` - } - if err := Unmarshal(in, &w); err != nil { - return nil, nil, err - } - - if w.E.BitLen() > 24 { - return nil, nil, errors.New("ssh: exponent too large") - } - e := w.E.Int64() - if e < 3 || e&1 == 0 { - return nil, nil, errors.New("ssh: incorrect exponent") - } - - var key rsa.PublicKey - key.E = int(e) - key.N = w.N - return (*rsaPublicKey)(&key), w.Rest, nil -} - -func (r *rsaPublicKey) Marshal() []byte { - e := new(big.Int).SetInt64(int64(r.E)) - // RSA publickey struct layout should match the struct used by - // parseRSACert in the x/crypto/ssh/agent package. - wirekey := struct { - Name string - E *big.Int - N *big.Int - }{ - KeyAlgoRSA, - e, - r.N, - } - return Marshal(&wirekey) -} - -func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error { - var hash crypto.Hash - switch sig.Format { - case SigAlgoRSA: - hash = crypto.SHA1 - case SigAlgoRSASHA2256: - hash = crypto.SHA256 - case SigAlgoRSASHA2512: - hash = crypto.SHA512 - default: - return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, r.Type()) - } - h := hash.New() - h.Write(data) - digest := h.Sum(nil) - return rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), hash, digest, sig.Blob) -} - -func (r *rsaPublicKey) CryptoPublicKey() crypto.PublicKey { - return (*rsa.PublicKey)(r) -} - -type dsaPublicKey dsa.PublicKey - -func (k *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 { - P, Q, G, Y *big.Int - Rest []byte `ssh:"rest"` - } - if err := Unmarshal(in, &w); err != nil { - 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: param, - Y: w.Y, - } - return key, w.Rest, nil -} - -func (k *dsaPublicKey) Marshal() []byte { - // DSA publickey struct layout should match the struct used by - // parseDSACert in the x/crypto/ssh/agent package. - w := struct { - Name string - P, Q, G, Y *big.Int - }{ - k.Type(), - k.P, - k.Q, - k.G, - k.Y, - } - - return Marshal(&w) -} - -func (k *dsaPublicKey) Verify(data []byte, sig *Signature) error { - if sig.Format != k.Type() { - return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) - } - h := crypto.SHA1.New() - h.Write(data) - digest := h.Sum(nil) - - // Per RFC 4253, section 6.6, - // The value for 'dss_signature_blob' is encoded as a string containing - // r, followed by s (which are 160-bit integers, without lengths or - // padding, unsigned, and in network byte order). - // For DSS purposes, sig.Blob should be exactly 40 bytes in length. - if len(sig.Blob) != 40 { - return errors.New("ssh: DSA signature parse error") - } - r := new(big.Int).SetBytes(sig.Blob[:20]) - s := new(big.Int).SetBytes(sig.Blob[20:]) - if dsa.Verify((*dsa.PublicKey)(k), digest, r, s) { - return nil - } - return errors.New("ssh: signature did not verify") -} - -func (k *dsaPublicKey) CryptoPublicKey() crypto.PublicKey { - return (*dsa.PublicKey)(k) -} - -type dsaPrivateKey struct { - *dsa.PrivateKey -} - -func (k *dsaPrivateKey) PublicKey() PublicKey { - return (*dsaPublicKey)(&k.PrivateKey.PublicKey) -} - -func (k *dsaPrivateKey) Sign(rand io.Reader, data []byte) (*Signature, error) { - return k.SignWithAlgorithm(rand, data, "") -} - -func (k *dsaPrivateKey) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { - if algorithm != "" && algorithm != k.PublicKey().Type() { - return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) - } - - h := crypto.SHA1.New() - h.Write(data) - digest := h.Sum(nil) - r, s, err := dsa.Sign(rand, k.PrivateKey, digest) - if err != nil { - return nil, err - } - - sig := make([]byte, 40) - rb := r.Bytes() - sb := s.Bytes() - - copy(sig[20-len(rb):20], rb) - copy(sig[40-len(sb):], sb) - - return &Signature{ - Format: k.PublicKey().Type(), - Blob: sig, - }, nil -} - -type ecdsaPublicKey ecdsa.PublicKey - -func (k *ecdsaPublicKey) Type() string { - return "ecdsa-sha2-" + k.nistID() -} - -func (k *ecdsaPublicKey) nistID() string { - switch k.Params().BitSize { - case 256: - return "nistp256" - case 384: - return "nistp384" - case 521: - return "nistp521" - } - panic("ssh: unsupported ecdsa key size") -} - -type ed25519PublicKey ed25519.PublicKey - -func (k ed25519PublicKey) Type() string { - return KeyAlgoED25519 -} - -func parseED25519(in []byte) (out PublicKey, rest []byte, err error) { - var w struct { - KeyBytes []byte - Rest []byte `ssh:"rest"` - } - - if err := Unmarshal(in, &w); err != nil { - return nil, nil, err - } - - key := ed25519.PublicKey(w.KeyBytes) - - return (ed25519PublicKey)(key), w.Rest, nil -} - -func (k ed25519PublicKey) Marshal() []byte { - w := struct { - Name string - KeyBytes []byte - }{ - KeyAlgoED25519, - []byte(k), - } - return Marshal(&w) -} - -func (k ed25519PublicKey) Verify(b []byte, sig *Signature) error { - if sig.Format != k.Type() { - return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) - } - - edKey := (ed25519.PublicKey)(k) - if ok := ed25519.Verify(edKey, b, sig.Blob); !ok { - return errors.New("ssh: signature did not verify") - } - - return nil -} - -func (k ed25519PublicKey) CryptoPublicKey() crypto.PublicKey { - return ed25519.PublicKey(k) -} - -func supportedEllipticCurve(curve elliptic.Curve) bool { - return curve == elliptic.P256() || curve == elliptic.P384() || curve == elliptic.P521() -} - -// ecHash returns the hash to match the given elliptic curve, see RFC -// 5656, section 6.2.1 -func ecHash(curve elliptic.Curve) crypto.Hash { - bitSize := curve.Params().BitSize - switch { - case bitSize <= 256: - return crypto.SHA256 - case bitSize <= 384: - return crypto.SHA384 - } - return crypto.SHA512 -} - -// parseECDSA parses an ECDSA key according to RFC 5656, section 3.1. -func parseECDSA(in []byte) (out PublicKey, rest []byte, err error) { - var w struct { - Curve string - KeyBytes []byte - Rest []byte `ssh:"rest"` - } - - if err := Unmarshal(in, &w); err != nil { - return nil, nil, err - } - - key := new(ecdsa.PublicKey) - - switch w.Curve { - case "nistp256": - key.Curve = elliptic.P256() - case "nistp384": - key.Curve = elliptic.P384() - case "nistp521": - key.Curve = elliptic.P521() - default: - return nil, nil, errors.New("ssh: unsupported curve") - } - - key.X, key.Y = elliptic.Unmarshal(key.Curve, w.KeyBytes) - if key.X == nil || key.Y == nil { - return nil, nil, errors.New("ssh: invalid curve point") - } - return (*ecdsaPublicKey)(key), w.Rest, nil -} - -func (k *ecdsaPublicKey) Marshal() []byte { - // See RFC 5656, section 3.1. - keyBytes := elliptic.Marshal(k.Curve, k.X, k.Y) - // ECDSA publickey struct layout should match the struct used by - // parseECDSACert in the x/crypto/ssh/agent package. - w := struct { - Name string - ID string - Key []byte - }{ - k.Type(), - k.nistID(), - keyBytes, - } - - return Marshal(&w) -} - -func (k *ecdsaPublicKey) Verify(data []byte, sig *Signature) error { - if sig.Format != k.Type() { - return fmt.Errorf("ssh: signature type %s for key type %s", sig.Format, k.Type()) - } - - h := ecHash(k.Curve).New() - h.Write(data) - digest := h.Sum(nil) - - // Per RFC 5656, section 3.1.2, - // The ecdsa_signature_blob value has the following specific encoding: - // mpint r - // mpint s - var ecSig struct { - R *big.Int - S *big.Int - } - - if err := Unmarshal(sig.Blob, &ecSig); err != nil { - return err - } - - if ecdsa.Verify((*ecdsa.PublicKey)(k), digest, ecSig.R, ecSig.S) { - return nil - } - return errors.New("ssh: signature did not verify") -} - -func (k *ecdsaPublicKey) CryptoPublicKey() crypto.PublicKey { - return (*ecdsa.PublicKey)(k) -} - -// 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. 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 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 -} - -// NewSignerFromSigner takes any crypto.Signer implementation and -// returns a corresponding Signer interface. This can be used, for -// example, with keys kept in hardware modules. -func NewSignerFromSigner(signer crypto.Signer) (Signer, error) { - pubKey, err := NewPublicKey(signer.Public()) - if err != nil { - return nil, err - } - - return &wrappedSigner{signer, pubKey}, nil -} - -func (s *wrappedSigner) PublicKey() PublicKey { - return s.pubKey -} - -func (s *wrappedSigner) Sign(rand io.Reader, data []byte) (*Signature, error) { - return s.SignWithAlgorithm(rand, data, "") -} - -func (s *wrappedSigner) SignWithAlgorithm(rand io.Reader, data []byte, algorithm string) (*Signature, error) { - var hashFunc crypto.Hash - - if _, ok := s.pubKey.(*rsaPublicKey); ok { - // RSA keys support a few hash functions determined by the requested signature algorithm - switch algorithm { - case "", SigAlgoRSA: - algorithm = SigAlgoRSA - hashFunc = crypto.SHA1 - case SigAlgoRSASHA2256: - hashFunc = crypto.SHA256 - case SigAlgoRSASHA2512: - hashFunc = crypto.SHA512 - default: - return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) - } - } else { - // The only supported algorithm for all other key types is the same as the type of the key - if algorithm == "" { - algorithm = s.pubKey.Type() - } else if algorithm != s.pubKey.Type() { - return nil, fmt.Errorf("ssh: unsupported signature algorithm %s", algorithm) - } - - switch key := s.pubKey.(type) { - case *dsaPublicKey: - hashFunc = crypto.SHA1 - case *ecdsaPublicKey: - hashFunc = ecHash(key.Curve) - case ed25519PublicKey: - default: - return nil, fmt.Errorf("ssh: unsupported key type %T", key) - } - } - - var digest []byte - if hashFunc != 0 { - h := hashFunc.New() - h.Write(data) - digest = h.Sum(nil) - } else { - digest = data - } - - signature, err := s.signer.Sign(rand, digest, hashFunc) - if err != nil { - return nil, err - } - - // crypto.Signer.Sign is expected to return an ASN.1-encoded signature - // for ECDSA and DSA, but that's not the encoding expected by SSH, so - // re-encode. - switch s.pubKey.(type) { - case *ecdsaPublicKey, *dsaPublicKey: - type asn1Signature struct { - R, S *big.Int - } - asn1Sig := new(asn1Signature) - _, err := asn1.Unmarshal(signature, asn1Sig) - if err != nil { - return nil, err - } - - switch s.pubKey.(type) { - case *ecdsaPublicKey: - signature = Marshal(asn1Sig) - - case *dsaPublicKey: - signature = make([]byte, 40) - r := asn1Sig.R.Bytes() - s := asn1Sig.S.Bytes() - copy(signature[20-len(r):20], r) - copy(signature[40-len(s):40], s) - } - } - - return &Signature{ - Format: algorithm, - Blob: signature, - }, nil -} - -// NewPublicKey takes an *rsa.PublicKey, *dsa.PublicKey, *ecdsa.PublicKey, -// or ed25519.PublicKey returns a corresponding PublicKey instance. -// ECDSA keys must use P-256, P-384 or P-521. -func NewPublicKey(key interface{}) (PublicKey, error) { - switch key := key.(type) { - case *rsa.PublicKey: - return (*rsaPublicKey)(key), nil - case *ecdsa.PublicKey: - if !supportedEllipticCurve(key.Curve) { - return nil, errors.New("ssh: only P-256, P-384 and P-521 EC keys are supported") - } - return (*ecdsaPublicKey)(key), nil - case *dsa.PublicKey: - return (*dsaPublicKey)(key), nil - case ed25519.PublicKey: - return (ed25519PublicKey)(key), nil - default: - return nil, fmt.Errorf("ssh: unsupported key type %T", key) - } -} - -// ParsePrivateKey returns a Signer from a PEM encoded private key. It supports -// the same keys as ParseRawPrivateKey. -func ParsePrivateKey(pemBytes []byte) (Signer, error) { - key, err := ParseRawPrivateKey(pemBytes) - if err != nil { - return nil, err - } - - 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 -// according to RFC 1421 Section 4.6.1.1. -func encryptedBlock(block *pem.Block) bool { - return strings.Contains(block.Headers["Proc-Type"], "ENCRYPTED") -} - -// ParseRawPrivateKey returns a private key from a PEM encoded private key. It -// supports RSA (PKCS#1), PKCS#8, DSA (OpenSSL), and ECDSA private keys. -func ParseRawPrivateKey(pemBytes []byte) (interface{}, error) { - block, _ := pem.Decode(pemBytes) - if block == nil { - return nil, errors.New("ssh: no key found") - } - - if encryptedBlock(block) { - return nil, errors.New("ssh: cannot decode encrypted private keys") - } - - switch block.Type { - case "RSA PRIVATE KEY": - return x509.ParsePKCS1PrivateKey(block.Bytes) - // RFC5208 - https://tools.ietf.org/html/rfc5208 - case "PRIVATE KEY": - return x509.ParsePKCS8PrivateKey(block.Bytes) - case "EC PRIVATE KEY": - return x509.ParseECPrivateKey(block.Bytes) - case "DSA PRIVATE KEY": - return ParseDSAPrivateKey(block.Bytes) - case "OPENSSH PRIVATE KEY": - return parseOpenSSHPrivateKey(block.Bytes) - default: - return nil, fmt.Errorf("ssh: unsupported key type %q", block.Type) - } -} - -// 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) { - var k struct { - Version int - P *big.Int - Q *big.Int - G *big.Int - Pub *big.Int - Priv *big.Int - } - rest, err := asn1.Unmarshal(der, &k) - if err != nil { - return nil, errors.New("ssh: failed to parse DSA key: " + err.Error()) - } - if len(rest) > 0 { - return nil, errors.New("ssh: garbage after DSA key") - } - - return &dsa.PrivateKey{ - PublicKey: dsa.PublicKey{ - Parameters: dsa.Parameters{ - P: k.P, - Q: k.Q, - G: k.G, - }, - Y: k.Pub, - }, - X: k.Priv, - }, nil -} - -// Implemented based on the documentation at -// https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key -func parseOpenSSHPrivateKey(key []byte) (crypto.PrivateKey, error) { - const magic = "openssh-key-v1\x00" - if len(key) < len(magic) || string(key[:len(magic)]) != magic { - return nil, errors.New("ssh: invalid openssh private key format") - } - remaining := key[len(magic):] - - var w struct { - CipherName string - KdfName string - KdfOpts string - NumKeys uint32 - PubKey []byte - PrivKeyBlock []byte - } - - if err := Unmarshal(remaining, &w); err != nil { - return nil, err - } - - if w.KdfName != "none" || w.CipherName != "none" { - return nil, errors.New("ssh: cannot decode encrypted private keys") - } - - pk1 := struct { - Check1 uint32 - Check2 uint32 - Keytype string - Rest []byte `ssh:"rest"` - }{} - - if err := Unmarshal(w.PrivKeyBlock, &pk1); err != nil { - return nil, err - } - - if pk1.Check1 != pk1.Check2 { - return nil, errors.New("ssh: checkint mismatch") - } - - // we only handle ed25519 and rsa keys currently - switch pk1.Keytype { - case KeyAlgoRSA: - // https://github.com/openssh/openssh-portable/blob/master/sshkey.c#L2760-L2773 - key := struct { - N *big.Int - E *big.Int - D *big.Int - Iqmp *big.Int - P *big.Int - Q *big.Int - Comment string - Pad []byte `ssh:"rest"` - }{} - - if err := Unmarshal(pk1.Rest, &key); err != nil { - return nil, err - } - - for i, b := range key.Pad { - if int(b) != i+1 { - return nil, errors.New("ssh: padding not as expected") - } - } - - pk := &rsa.PrivateKey{ - PublicKey: rsa.PublicKey{ - N: key.N, - E: int(key.E.Int64()), - }, - D: key.D, - Primes: []*big.Int{key.P, key.Q}, - } - - if err := pk.Validate(); err != nil { - return nil, err - } - - pk.Precompute() - - return pk, nil - case KeyAlgoED25519: - key := struct { - Pub []byte - Priv []byte - Comment string - Pad []byte `ssh:"rest"` - }{} - - if err := Unmarshal(pk1.Rest, &key); err != nil { - return nil, err - } - - if len(key.Priv) != ed25519.PrivateKeySize { - return nil, errors.New("ssh: private key unexpected length") - } - - for i, b := range key.Pad { - if int(b) != i+1 { - return nil, errors.New("ssh: padding not as expected") - } - } - - pk := ed25519.PrivateKey(make([]byte, ed25519.PrivateKeySize)) - copy(pk, key.Priv) - return &pk, nil - default: - return nil, errors.New("ssh: unhandled key type") - } -} - -// FingerprintLegacyMD5 returns the user presentation of the key's -// fingerprint as described by RFC 4716 section 4. -func FingerprintLegacyMD5(pubKey PublicKey) string { - md5sum := md5.Sum(pubKey.Marshal()) - hexarray := make([]string, len(md5sum)) - for i, c := range md5sum { - hexarray[i] = hex.EncodeToString([]byte{c}) - } - return strings.Join(hexarray, ":") -} - -// FingerprintSHA256 returns the user presentation of the key's -// fingerprint as unpadded base64 encoded sha256 hash. -// This format was introduced from OpenSSH 6.8. -// https://www.openssh.com/txt/release-6.8 -// https://tools.ietf.org/html/rfc4648#section-3.2 (unpadded base64 encoding) -func FingerprintSHA256(pubKey PublicKey) string { - sha256sum := sha256.Sum256(pubKey.Marshal()) - hash := base64.RawStdEncoding.EncodeToString(sha256sum[:]) - return "SHA256:" + hash -} diff --git a/vendor/golang.org/x/crypto/ssh/mac.go b/vendor/golang.org/x/crypto/ssh/mac.go deleted file mode 100644 index c07a06285e66..000000000000 --- a/vendor/golang.org/x/crypto/ssh/mac.go +++ /dev/null @@ -1,61 +0,0 @@ -// 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 ssh - -// Message authentication support - -import ( - "crypto/hmac" - "crypto/sha1" - "crypto/sha256" - "hash" -) - -type macMode struct { - keySize int - etm bool - new func(key []byte) hash.Hash -} - -// truncatingMAC wraps around a hash.Hash and truncates the output digest to -// a given size. -type truncatingMAC struct { - length int - hmac hash.Hash -} - -func (t truncatingMAC) Write(data []byte) (int, error) { - return t.hmac.Write(data) -} - -func (t truncatingMAC) Sum(in []byte) []byte { - out := t.hmac.Sum(in) - return out[:len(in)+t.length] -} - -func (t truncatingMAC) Reset() { - t.hmac.Reset() -} - -func (t truncatingMAC) Size() int { - return t.length -} - -func (t truncatingMAC) BlockSize() int { return t.hmac.BlockSize() } - -var macModes = map[string]*macMode{ - "hmac-sha2-256-etm@openssh.com": {32, true, func(key []byte) hash.Hash { - return hmac.New(sha256.New, key) - }}, - "hmac-sha2-256": {32, false, func(key []byte) hash.Hash { - return hmac.New(sha256.New, key) - }}, - "hmac-sha1": {20, false, func(key []byte) hash.Hash { - return hmac.New(sha1.New, key) - }}, - "hmac-sha1-96": {20, false, func(key []byte) hash.Hash { - return truncatingMAC{12, hmac.New(sha1.New, key)} - }}, -} diff --git a/vendor/golang.org/x/crypto/ssh/messages.go b/vendor/golang.org/x/crypto/ssh/messages.go deleted file mode 100644 index 08d28117305d..000000000000 --- a/vendor/golang.org/x/crypto/ssh/messages.go +++ /dev/null @@ -1,766 +0,0 @@ -// 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 ssh - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" - "io" - "math/big" - "reflect" - "strconv" - "strings" -) - -// These are SSH message type numbers. They are scattered around several -// documents but many were taken from [SSH-PARAMETERS]. -const ( - msgIgnore = 2 - msgUnimplemented = 3 - msgDebug = 4 - msgNewKeys = 21 -) - -// SSH messages: -// -// These structures mirror the wire format of the corresponding SSH messages. -// They are marshaled using reflection with the marshal and unmarshal functions -// in this file. The only wrinkle is that a final member of type []byte with a -// ssh tag of "rest" receives the remainder of a packet when unmarshaling. - -// See RFC 4253, section 11.1. -const msgDisconnect = 1 - -// disconnectMsg is the message that signals a disconnect. It is also -// the error type returned from mux.Wait() -type disconnectMsg struct { - Reason uint32 `sshtype:"1"` - Message string - Language string -} - -func (d *disconnectMsg) Error() string { - return fmt.Sprintf("ssh: disconnect, reason %d: %s", d.Reason, d.Message) -} - -// See RFC 4253, section 7.1. -const msgKexInit = 20 - -type kexInitMsg struct { - Cookie [16]byte `sshtype:"20"` - KexAlgos []string - ServerHostKeyAlgos []string - CiphersClientServer []string - CiphersServerClient []string - MACsClientServer []string - MACsServerClient []string - CompressionClientServer []string - CompressionServerClient []string - LanguagesClientServer []string - LanguagesServerClient []string - FirstKexFollows bool - Reserved uint32 -} - -// See RFC 4253, section 8. - -// Diffie-Helman -const msgKexDHInit = 30 - -type kexDHInitMsg struct { - X *big.Int `sshtype:"30"` -} - -const msgKexECDHInit = 30 - -type kexECDHInitMsg struct { - ClientPubKey []byte `sshtype:"30"` -} - -const msgKexECDHReply = 31 - -type kexECDHReplyMsg struct { - HostKey []byte `sshtype:"31"` - EphemeralPubKey []byte - Signature []byte -} - -const msgKexDHReply = 31 - -type kexDHReplyMsg struct { - HostKey []byte `sshtype:"31"` - Y *big.Int - Signature []byte -} - -// See RFC 4253, section 10. -const msgServiceRequest = 5 - -type serviceRequestMsg struct { - Service string `sshtype:"5"` -} - -// See RFC 4253, section 10. -const msgServiceAccept = 6 - -type serviceAcceptMsg struct { - Service string `sshtype:"6"` -} - -// See RFC 4252, section 5. -const msgUserAuthRequest = 50 - -type userAuthRequestMsg struct { - User string `sshtype:"50"` - Service string - Method string - Payload []byte `ssh:"rest"` -} - -// Used for debug printouts of packets. -type userAuthSuccessMsg struct { -} - -// See RFC 4252, section 5.1 -const msgUserAuthFailure = 51 - -type userAuthFailureMsg struct { - Methods []string `sshtype:"51"` - PartialSuccess bool -} - -// See RFC 4252, section 5.1 -const msgUserAuthSuccess = 52 - -// See RFC 4252, section 5.4 -const msgUserAuthBanner = 53 - -type userAuthBannerMsg struct { - Message string `sshtype:"53"` - // unused, but required to allow message parsing - Language string -} - -// See RFC 4256, section 3.2 -const msgUserAuthInfoRequest = 60 -const msgUserAuthInfoResponse = 61 - -type userAuthInfoRequestMsg struct { - User string `sshtype:"60"` - Instruction string - DeprecatedLanguage string - NumPrompts uint32 - Prompts []byte `ssh:"rest"` -} - -// See RFC 4254, section 5.1. -const msgChannelOpen = 90 - -type channelOpenMsg struct { - ChanType string `sshtype:"90"` - PeersID uint32 - PeersWindow uint32 - MaxPacketSize uint32 - TypeSpecificData []byte `ssh:"rest"` -} - -const msgChannelExtendedData = 95 -const msgChannelData = 94 - -// Used for debug print outs of packets. -type channelDataMsg struct { - PeersID uint32 `sshtype:"94"` - Length uint32 - Rest []byte `ssh:"rest"` -} - -// See RFC 4254, section 5.1. -const msgChannelOpenConfirm = 91 - -type channelOpenConfirmMsg struct { - PeersID uint32 `sshtype:"91"` - MyID uint32 - MyWindow uint32 - MaxPacketSize uint32 - TypeSpecificData []byte `ssh:"rest"` -} - -// See RFC 4254, section 5.1. -const msgChannelOpenFailure = 92 - -type channelOpenFailureMsg struct { - PeersID uint32 `sshtype:"92"` - Reason RejectionReason - Message string - Language string -} - -const msgChannelRequest = 98 - -type channelRequestMsg struct { - PeersID uint32 `sshtype:"98"` - Request string - WantReply bool - RequestSpecificData []byte `ssh:"rest"` -} - -// See RFC 4254, section 5.4. -const msgChannelSuccess = 99 - -type channelRequestSuccessMsg struct { - PeersID uint32 `sshtype:"99"` -} - -// See RFC 4254, section 5.4. -const msgChannelFailure = 100 - -type channelRequestFailureMsg struct { - PeersID uint32 `sshtype:"100"` -} - -// See RFC 4254, section 5.3 -const msgChannelClose = 97 - -type channelCloseMsg struct { - PeersID uint32 `sshtype:"97"` -} - -// See RFC 4254, section 5.3 -const msgChannelEOF = 96 - -type channelEOFMsg struct { - PeersID uint32 `sshtype:"96"` -} - -// See RFC 4254, section 4 -const msgGlobalRequest = 80 - -type globalRequestMsg struct { - Type string `sshtype:"80"` - WantReply bool - Data []byte `ssh:"rest"` -} - -// See RFC 4254, section 4 -const msgRequestSuccess = 81 - -type globalRequestSuccessMsg struct { - Data []byte `ssh:"rest" sshtype:"81"` -} - -// See RFC 4254, section 4 -const msgRequestFailure = 82 - -type globalRequestFailureMsg struct { - Data []byte `ssh:"rest" sshtype:"82"` -} - -// See RFC 4254, section 5.2 -const msgChannelWindowAdjust = 93 - -type windowAdjustMsg struct { - PeersID uint32 `sshtype:"93"` - AdditionalBytes uint32 -} - -// See RFC 4252, section 7 -const msgUserAuthPubKeyOk = 60 - -type userAuthPubKeyOkMsg struct { - Algo string `sshtype:"60"` - PubKey []byte -} - -// typeTags returns the possible type bytes for the given reflect.Type, which -// should be a struct. The possible values are separated by a '|' character. -func typeTags(structType reflect.Type) (tags []byte) { - tagStr := structType.Field(0).Tag.Get("sshtype") - - for _, tag := range strings.Split(tagStr, "|") { - i, err := strconv.Atoi(tag) - if err == nil { - tags = append(tags, byte(i)) - } - } - - return tags -} - -func fieldError(t reflect.Type, field int, problem string) error { - if problem != "" { - problem = ": " + problem - } - return fmt.Errorf("ssh: unmarshal error for field %s of type %s%s", t.Field(field).Name, t.Name(), problem) -} - -var errShortRead = errors.New("ssh: short read") - -// Unmarshal parses data in SSH wire format into a structure. The out -// argument should be a pointer to struct. If the first member of the -// struct has the "sshtype" tag set to a '|'-separated set of numbers -// in decimal, the packet must start with one of those numbers. In -// case of error, Unmarshal returns a ParseError or -// UnexpectedMessageError. -func Unmarshal(data []byte, out interface{}) error { - v := reflect.ValueOf(out).Elem() - structType := v.Type() - expectedTypes := typeTags(structType) - - var expectedType byte - if len(expectedTypes) > 0 { - expectedType = expectedTypes[0] - } - - if len(data) == 0 { - return parseError(expectedType) - } - - if len(expectedTypes) > 0 { - goodType := false - for _, e := range expectedTypes { - if e > 0 && data[0] == e { - goodType = true - break - } - } - if !goodType { - return fmt.Errorf("ssh: unexpected message type %d (expected one of %v)", data[0], expectedTypes) - } - data = data[1:] - } - - var ok bool - for i := 0; i < v.NumField(); i++ { - field := v.Field(i) - t := field.Type() - switch t.Kind() { - case reflect.Bool: - if len(data) < 1 { - return errShortRead - } - field.SetBool(data[0] != 0) - data = data[1:] - case reflect.Array: - if t.Elem().Kind() != reflect.Uint8 { - return fieldError(structType, i, "array of unsupported type") - } - if len(data) < t.Len() { - return errShortRead - } - for j, n := 0, t.Len(); j < n; j++ { - field.Index(j).Set(reflect.ValueOf(data[j])) - } - data = data[t.Len():] - case reflect.Uint64: - var u64 uint64 - if u64, data, ok = parseUint64(data); !ok { - return errShortRead - } - field.SetUint(u64) - case reflect.Uint32: - var u32 uint32 - if u32, data, ok = parseUint32(data); !ok { - return errShortRead - } - field.SetUint(uint64(u32)) - case reflect.Uint8: - if len(data) < 1 { - return errShortRead - } - field.SetUint(uint64(data[0])) - data = data[1:] - case reflect.String: - var s []byte - if s, data, ok = parseString(data); !ok { - return fieldError(structType, i, "") - } - field.SetString(string(s)) - case reflect.Slice: - switch t.Elem().Kind() { - case reflect.Uint8: - if structType.Field(i).Tag.Get("ssh") == "rest" { - field.Set(reflect.ValueOf(data)) - data = nil - } else { - var s []byte - if s, data, ok = parseString(data); !ok { - return errShortRead - } - field.Set(reflect.ValueOf(s)) - } - case reflect.String: - var nl []string - if nl, data, ok = parseNameList(data); !ok { - return errShortRead - } - field.Set(reflect.ValueOf(nl)) - default: - return fieldError(structType, i, "slice of unsupported type") - } - case reflect.Ptr: - if t == bigIntType { - var n *big.Int - if n, data, ok = parseInt(data); !ok { - return errShortRead - } - field.Set(reflect.ValueOf(n)) - } else { - return fieldError(structType, i, "pointer to unsupported type") - } - default: - return fieldError(structType, i, fmt.Sprintf("unsupported type: %v", t)) - } - } - - if len(data) != 0 { - return parseError(expectedType) - } - - return nil -} - -// Marshal serializes the message in msg to SSH wire format. The msg -// argument should be a struct or pointer to struct. If the first -// member has the "sshtype" tag set to a number in decimal, that -// number is prepended to the result. If the last of member has the -// "ssh" tag set to "rest", its contents are appended to the output. -func Marshal(msg interface{}) []byte { - out := make([]byte, 0, 64) - return marshalStruct(out, msg) -} - -func marshalStruct(out []byte, msg interface{}) []byte { - v := reflect.Indirect(reflect.ValueOf(msg)) - msgTypes := typeTags(v.Type()) - if len(msgTypes) > 0 { - out = append(out, msgTypes[0]) - } - - for i, n := 0, v.NumField(); i < n; i++ { - field := v.Field(i) - switch t := field.Type(); t.Kind() { - case reflect.Bool: - var v uint8 - if field.Bool() { - v = 1 - } - out = append(out, v) - case reflect.Array: - if t.Elem().Kind() != reflect.Uint8 { - panic(fmt.Sprintf("array of non-uint8 in field %d: %T", i, field.Interface())) - } - for j, l := 0, t.Len(); j < l; j++ { - out = append(out, uint8(field.Index(j).Uint())) - } - case reflect.Uint32: - out = appendU32(out, uint32(field.Uint())) - case reflect.Uint64: - out = appendU64(out, uint64(field.Uint())) - case reflect.Uint8: - out = append(out, uint8(field.Uint())) - case reflect.String: - s := field.String() - out = appendInt(out, len(s)) - out = append(out, s...) - case reflect.Slice: - switch t.Elem().Kind() { - case reflect.Uint8: - if v.Type().Field(i).Tag.Get("ssh") != "rest" { - out = appendInt(out, field.Len()) - } - out = append(out, field.Bytes()...) - case reflect.String: - offset := len(out) - out = appendU32(out, 0) - if n := field.Len(); n > 0 { - for j := 0; j < n; j++ { - f := field.Index(j) - if j != 0 { - out = append(out, ',') - } - out = append(out, f.String()...) - } - // overwrite length value - binary.BigEndian.PutUint32(out[offset:], uint32(len(out)-offset-4)) - } - default: - panic(fmt.Sprintf("slice of unknown type in field %d: %T", i, field.Interface())) - } - case reflect.Ptr: - if t == bigIntType { - var n *big.Int - nValue := reflect.ValueOf(&n) - nValue.Elem().Set(field) - needed := intLength(n) - oldLength := len(out) - - if cap(out)-len(out) < needed { - newOut := make([]byte, len(out), 2*(len(out)+needed)) - copy(newOut, out) - out = newOut - } - out = out[:oldLength+needed] - marshalInt(out[oldLength:], n) - } else { - panic(fmt.Sprintf("pointer to unknown type in field %d: %T", i, field.Interface())) - } - } - } - - return out -} - -var bigOne = big.NewInt(1) - -func parseString(in []byte) (out, rest []byte, ok bool) { - if len(in) < 4 { - return - } - length := binary.BigEndian.Uint32(in) - in = in[4:] - if uint32(len(in)) < length { - return - } - out = in[:length] - rest = in[length:] - ok = true - return -} - -var ( - comma = []byte{','} - emptyNameList = []string{} -) - -func parseNameList(in []byte) (out []string, rest []byte, ok bool) { - contents, rest, ok := parseString(in) - if !ok { - return - } - if len(contents) == 0 { - out = emptyNameList - return - } - parts := bytes.Split(contents, comma) - out = make([]string, len(parts)) - for i, part := range parts { - out[i] = string(part) - } - return -} - -func parseInt(in []byte) (out *big.Int, rest []byte, ok bool) { - contents, rest, ok := parseString(in) - if !ok { - return - } - out = new(big.Int) - - if len(contents) > 0 && contents[0]&0x80 == 0x80 { - // This is a negative number - notBytes := make([]byte, len(contents)) - for i := range notBytes { - notBytes[i] = ^contents[i] - } - out.SetBytes(notBytes) - out.Add(out, bigOne) - out.Neg(out) - } else { - // Positive number - out.SetBytes(contents) - } - ok = true - return -} - -func parseUint32(in []byte) (uint32, []byte, bool) { - if len(in) < 4 { - return 0, nil, false - } - return binary.BigEndian.Uint32(in), in[4:], true -} - -func parseUint64(in []byte) (uint64, []byte, bool) { - if len(in) < 8 { - return 0, nil, false - } - return binary.BigEndian.Uint64(in), in[8:], true -} - -func intLength(n *big.Int) int { - length := 4 /* length bytes */ - if n.Sign() < 0 { - nMinus1 := new(big.Int).Neg(n) - nMinus1.Sub(nMinus1, bigOne) - bitLen := nMinus1.BitLen() - if bitLen%8 == 0 { - // The number will need 0xff padding - length++ - } - length += (bitLen + 7) / 8 - } else if n.Sign() == 0 { - // A zero is the zero length string - } else { - bitLen := n.BitLen() - if bitLen%8 == 0 { - // The number will need 0x00 padding - length++ - } - length += (bitLen + 7) / 8 - } - - return length -} - -func marshalUint32(to []byte, n uint32) []byte { - binary.BigEndian.PutUint32(to, n) - return to[4:] -} - -func marshalUint64(to []byte, n uint64) []byte { - binary.BigEndian.PutUint64(to, n) - return to[8:] -} - -func marshalInt(to []byte, n *big.Int) []byte { - lengthBytes := to - to = to[4:] - length := 0 - - if n.Sign() < 0 { - // A negative number has to be converted to two's-complement - // form. So we'll subtract 1 and invert. If the - // most-significant-bit isn't set then we'll need to pad the - // beginning with 0xff in order to keep the number negative. - nMinus1 := new(big.Int).Neg(n) - nMinus1.Sub(nMinus1, bigOne) - bytes := nMinus1.Bytes() - for i := range bytes { - bytes[i] ^= 0xff - } - if len(bytes) == 0 || bytes[0]&0x80 == 0 { - to[0] = 0xff - to = to[1:] - length++ - } - nBytes := copy(to, bytes) - to = to[nBytes:] - length += nBytes - } else if n.Sign() == 0 { - // A zero is the zero length string - } else { - bytes := n.Bytes() - if len(bytes) > 0 && bytes[0]&0x80 != 0 { - // We'll have to pad this with a 0x00 in order to - // stop it looking like a negative number. - to[0] = 0 - to = to[1:] - length++ - } - nBytes := copy(to, bytes) - to = to[nBytes:] - length += nBytes - } - - lengthBytes[0] = byte(length >> 24) - lengthBytes[1] = byte(length >> 16) - lengthBytes[2] = byte(length >> 8) - lengthBytes[3] = byte(length) - return to -} - -func writeInt(w io.Writer, n *big.Int) { - length := intLength(n) - buf := make([]byte, length) - marshalInt(buf, n) - w.Write(buf) -} - -func writeString(w io.Writer, s []byte) { - var lengthBytes [4]byte - lengthBytes[0] = byte(len(s) >> 24) - lengthBytes[1] = byte(len(s) >> 16) - lengthBytes[2] = byte(len(s) >> 8) - lengthBytes[3] = byte(len(s)) - w.Write(lengthBytes[:]) - w.Write(s) -} - -func stringLength(n int) int { - return 4 + n -} - -func marshalString(to []byte, s []byte) []byte { - to[0] = byte(len(s) >> 24) - to[1] = byte(len(s) >> 16) - to[2] = byte(len(s) >> 8) - to[3] = byte(len(s)) - to = to[4:] - copy(to, s) - return to[len(s):] -} - -var bigIntType = reflect.TypeOf((*big.Int)(nil)) - -// Decode a packet into its corresponding message. -func decode(packet []byte) (interface{}, error) { - var msg interface{} - switch packet[0] { - case msgDisconnect: - msg = new(disconnectMsg) - case msgServiceRequest: - msg = new(serviceRequestMsg) - case msgServiceAccept: - msg = new(serviceAcceptMsg) - case msgKexInit: - msg = new(kexInitMsg) - case msgKexDHInit: - msg = new(kexDHInitMsg) - case msgKexDHReply: - msg = new(kexDHReplyMsg) - case msgUserAuthRequest: - msg = new(userAuthRequestMsg) - case msgUserAuthSuccess: - return new(userAuthSuccessMsg), nil - case msgUserAuthFailure: - msg = new(userAuthFailureMsg) - case msgUserAuthPubKeyOk: - msg = new(userAuthPubKeyOkMsg) - case msgGlobalRequest: - msg = new(globalRequestMsg) - case msgRequestSuccess: - msg = new(globalRequestSuccessMsg) - case msgRequestFailure: - msg = new(globalRequestFailureMsg) - case msgChannelOpen: - msg = new(channelOpenMsg) - case msgChannelData: - msg = new(channelDataMsg) - case msgChannelOpenConfirm: - msg = new(channelOpenConfirmMsg) - case msgChannelOpenFailure: - msg = new(channelOpenFailureMsg) - case msgChannelWindowAdjust: - msg = new(windowAdjustMsg) - case msgChannelEOF: - msg = new(channelEOFMsg) - case msgChannelClose: - msg = new(channelCloseMsg) - case msgChannelRequest: - msg = new(channelRequestMsg) - case msgChannelSuccess: - msg = new(channelRequestSuccessMsg) - case msgChannelFailure: - msg = new(channelRequestFailureMsg) - default: - return nil, unexpectedMessageError(0, packet[0]) - } - if err := Unmarshal(packet, msg); err != nil { - return nil, err - } - return msg, nil -} diff --git a/vendor/golang.org/x/crypto/ssh/mux.go b/vendor/golang.org/x/crypto/ssh/mux.go deleted file mode 100644 index f19016270e8f..000000000000 --- a/vendor/golang.org/x/crypto/ssh/mux.go +++ /dev/null @@ -1,330 +0,0 @@ -// Copyright 2013 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 ssh - -import ( - "encoding/binary" - "fmt" - "io" - "log" - "sync" - "sync/atomic" -) - -// debugMux, if set, causes messages in the connection protocol to be -// logged. -const debugMux = false - -// chanList is a thread safe channel list. -type chanList struct { - // protects concurrent access to chans - sync.Mutex - - // chans are indexed by the local id of the channel, which the - // other side should send in the PeersId field. - chans []*channel - - // This is a debugging aid: it offsets all IDs by this - // amount. This helps distinguish otherwise identical - // server/client muxes - offset uint32 -} - -// Assigns a channel ID to the given channel. -func (c *chanList) add(ch *channel) uint32 { - c.Lock() - defer c.Unlock() - for i := range c.chans { - if c.chans[i] == nil { - c.chans[i] = ch - return uint32(i) + c.offset - } - } - c.chans = append(c.chans, ch) - return uint32(len(c.chans)-1) + c.offset -} - -// getChan returns the channel for the given ID. -func (c *chanList) getChan(id uint32) *channel { - id -= c.offset - - c.Lock() - defer c.Unlock() - if id < uint32(len(c.chans)) { - return c.chans[id] - } - return nil -} - -func (c *chanList) remove(id uint32) { - id -= c.offset - c.Lock() - if id < uint32(len(c.chans)) { - c.chans[id] = nil - } - c.Unlock() -} - -// dropAll forgets all channels it knows, returning them in a slice. -func (c *chanList) dropAll() []*channel { - c.Lock() - defer c.Unlock() - var r []*channel - - for _, ch := range c.chans { - if ch == nil { - continue - } - r = append(r, ch) - } - c.chans = nil - return r -} - -// mux represents the state for the SSH connection protocol, which -// multiplexes many channels onto a single packet transport. -type mux struct { - conn packetConn - chanList chanList - - incomingChannels chan NewChannel - - globalSentMu sync.Mutex - globalResponses chan interface{} - incomingRequests chan *Request - - errCond *sync.Cond - err error -} - -// When debugging, each new chanList instantiation has a different -// offset. -var globalOff uint32 - -func (m *mux) Wait() error { - m.errCond.L.Lock() - defer m.errCond.L.Unlock() - for m.err == nil { - m.errCond.Wait() - } - return m.err -} - -// newMux returns a mux that runs over the given connection. -func newMux(p packetConn) *mux { - m := &mux{ - conn: p, - incomingChannels: make(chan NewChannel, chanSize), - globalResponses: make(chan interface{}, 1), - incomingRequests: make(chan *Request, chanSize), - errCond: newCond(), - } - if debugMux { - m.chanList.offset = atomic.AddUint32(&globalOff, 1) - } - - go m.loop() - return m -} - -func (m *mux) sendMessage(msg interface{}) error { - p := Marshal(msg) - if debugMux { - log.Printf("send global(%d): %#v", m.chanList.offset, msg) - } - return m.conn.writePacket(p) -} - -func (m *mux) SendRequest(name string, wantReply bool, payload []byte) (bool, []byte, error) { - if wantReply { - m.globalSentMu.Lock() - defer m.globalSentMu.Unlock() - } - - if err := m.sendMessage(globalRequestMsg{ - Type: name, - WantReply: wantReply, - Data: payload, - }); err != nil { - return false, nil, err - } - - if !wantReply { - return false, nil, nil - } - - msg, ok := <-m.globalResponses - if !ok { - return false, nil, io.EOF - } - switch msg := msg.(type) { - case *globalRequestFailureMsg: - return false, msg.Data, nil - case *globalRequestSuccessMsg: - return true, msg.Data, nil - default: - return false, nil, fmt.Errorf("ssh: unexpected response to request: %#v", msg) - } -} - -// ackRequest must be called after processing a global request that -// has WantReply set. -func (m *mux) ackRequest(ok bool, data []byte) error { - if ok { - return m.sendMessage(globalRequestSuccessMsg{Data: data}) - } - return m.sendMessage(globalRequestFailureMsg{Data: data}) -} - -func (m *mux) Close() error { - return m.conn.Close() -} - -// loop runs the connection machine. It will process packets until an -// error is encountered. To synchronize on loop exit, use mux.Wait. -func (m *mux) loop() { - var err error - for err == nil { - err = m.onePacket() - } - - for _, ch := range m.chanList.dropAll() { - ch.close() - } - - close(m.incomingChannels) - close(m.incomingRequests) - close(m.globalResponses) - - m.conn.Close() - - m.errCond.L.Lock() - m.err = err - m.errCond.Broadcast() - m.errCond.L.Unlock() - - if debugMux { - log.Println("loop exit", err) - } -} - -// onePacket reads and processes one packet. -func (m *mux) onePacket() error { - packet, err := m.conn.readPacket() - if err != nil { - return err - } - - if debugMux { - if packet[0] == msgChannelData || packet[0] == msgChannelExtendedData { - log.Printf("decoding(%d): data packet - %d bytes", m.chanList.offset, len(packet)) - } else { - p, _ := decode(packet) - log.Printf("decoding(%d): %d %#v - %d bytes", m.chanList.offset, packet[0], p, len(packet)) - } - } - - switch packet[0] { - case msgChannelOpen: - return m.handleChannelOpen(packet) - case msgGlobalRequest, msgRequestSuccess, msgRequestFailure: - return m.handleGlobalPacket(packet) - } - - // assume a channel packet. - if len(packet) < 5 { - return parseError(packet[0]) - } - id := binary.BigEndian.Uint32(packet[1:]) - ch := m.chanList.getChan(id) - if ch == nil { - return fmt.Errorf("ssh: invalid channel %d", id) - } - - return ch.handlePacket(packet) -} - -func (m *mux) handleGlobalPacket(packet []byte) error { - msg, err := decode(packet) - if err != nil { - return err - } - - switch msg := msg.(type) { - case *globalRequestMsg: - m.incomingRequests <- &Request{ - Type: msg.Type, - WantReply: msg.WantReply, - Payload: msg.Data, - mux: m, - } - case *globalRequestSuccessMsg, *globalRequestFailureMsg: - m.globalResponses <- msg - default: - panic(fmt.Sprintf("not a global message %#v", msg)) - } - - return nil -} - -// handleChannelOpen schedules a channel to be Accept()ed. -func (m *mux) handleChannelOpen(packet []byte) error { - var msg channelOpenMsg - if err := Unmarshal(packet, &msg); err != nil { - return err - } - - if msg.MaxPacketSize < minPacketLength || msg.MaxPacketSize > 1<<31 { - failMsg := channelOpenFailureMsg{ - PeersID: msg.PeersID, - Reason: ConnectionFailed, - Message: "invalid request", - Language: "en_US.UTF-8", - } - return m.sendMessage(failMsg) - } - - c := m.newChannel(msg.ChanType, channelInbound, msg.TypeSpecificData) - c.remoteId = msg.PeersID - c.maxRemotePayload = msg.MaxPacketSize - c.remoteWin.add(msg.PeersWindow) - m.incomingChannels <- c - return nil -} - -func (m *mux) OpenChannel(chanType string, extra []byte) (Channel, <-chan *Request, error) { - ch, err := m.openChannel(chanType, extra) - if err != nil { - return nil, nil, err - } - - return ch, ch.incomingRequests, nil -} - -func (m *mux) openChannel(chanType string, extra []byte) (*channel, error) { - ch := m.newChannel(chanType, channelOutbound, extra) - - ch.maxIncomingPayload = channelMaxPacket - - open := channelOpenMsg{ - ChanType: chanType, - PeersWindow: ch.myWindow, - MaxPacketSize: ch.maxIncomingPayload, - TypeSpecificData: extra, - PeersID: ch.localId, - } - if err := m.sendMessage(open); err != nil { - return nil, err - } - - switch msg := (<-ch.msg).(type) { - case *channelOpenConfirmMsg: - return ch, nil - case *channelOpenFailureMsg: - return nil, &OpenChannelError{msg.Reason, msg.Message} - default: - return nil, fmt.Errorf("ssh: unexpected packet in response to channel open: %T", msg) - } -} diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go deleted file mode 100644 index e86e89661a06..000000000000 --- a/vendor/golang.org/x/crypto/ssh/server.go +++ /dev/null @@ -1,594 +0,0 @@ -// 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 ssh - -import ( - "bytes" - "errors" - "fmt" - "io" - "net" - "strings" -) - -// The Permissions type holds fine-grained permissions that are -// 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 { - // 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. 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 -} - -// ServerConfig holds server specific configuration data. -type ServerConfig struct { - // Config contains configuration shared between client and server. - Config - - hostKeys []Signer - - // NoClientAuth is true if clients are allowed to connect without - // authenticating. - NoClientAuth bool - - // MaxAuthTries specifies the maximum number of authentication attempts - // permitted per connection. If set to a negative number, the number of - // attempts are unlimited. If set to zero, the number of attempts are limited - // to 6. - MaxAuthTries int - - // PasswordCallback, if non-nil, is called when a user - // attempts to authenticate using a password. - PasswordCallback func(conn ConnMetadata, password []byte) (*Permissions, error) - - // 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 - // keyboard-interactive authentication is selected (RFC - // 4256). The client object's Challenge function should be - // used to query the user. The callback may offer multiple - // Challenge rounds. To avoid information leaks, the client - // should be presented a challenge even if the user is - // unknown. - KeyboardInteractiveCallback func(conn ConnMetadata, client KeyboardInteractiveChallenge) (*Permissions, error) - - // AuthLogCallback, if non-nil, is called to log all authentication - // attempts. - AuthLogCallback func(conn ConnMetadata, method string, err error) - - // ServerVersion is the version identification string to announce in - // the public handshake. - // If empty, a reasonable default is used. - // Note that RFC 4253 section 4.2 requires that this string start with - // "SSH-2.0-". - ServerVersion string - - // BannerCallback, if present, is called and the return string is sent to - // the client after key exchange completed but before authentication. - BannerCallback func(conn ConnMetadata) string -} - -// AddHostKey adds a private key as a host key. If an existing host -// key exists with the same algorithm, it is overwritten. Each server -// config must have at least one host key. -func (s *ServerConfig) AddHostKey(key Signer) { - for i, k := range s.hostKeys { - if k.PublicKey().Type() == key.PublicKey().Type() { - s.hostKeys[i] = key - return - } - } - - s.hostKeys = append(s.hostKeys, key) -} - -// cachedPubKey contains the results of querying whether a public key is -// acceptable for a user. -type cachedPubKey struct { - user string - pubKeyData []byte - result error - perms *Permissions -} - -const maxCachedPubKeys = 16 - -// pubKeyCache caches tests for public keys. Since SSH clients -// will query whether a public key is acceptable before attempting to -// authenticate with it, we end up with duplicate queries for public -// key validity. The cache only applies to a single ServerConn. -type pubKeyCache struct { - keys []cachedPubKey -} - -// get returns the result for a given user/algo/key tuple. -func (c *pubKeyCache) get(user string, pubKeyData []byte) (cachedPubKey, bool) { - for _, k := range c.keys { - if k.user == user && bytes.Equal(k.pubKeyData, pubKeyData) { - return k, true - } - } - return cachedPubKey{}, false -} - -// add adds the given tuple to the cache. -func (c *pubKeyCache) add(candidate cachedPubKey) { - if len(c.keys) < maxCachedPubKeys { - c.keys = append(c.keys, candidate) - } -} - -// ServerConn is an authenticated SSH connection, as seen from the -// server -type ServerConn struct { - Conn - - // If the succeeding authentication callback returned a - // non-nil Permissions pointer, it is stored here. - Permissions *Permissions -} - -// NewServerConn starts a new SSH server with c as the underlying -// transport. It starts with a handshake and, if the handshake is -// unsuccessful, it closes the connection and returns an error. The -// Request and NewChannel channels must be serviced, or the connection -// will hang. -// -// The returned error may be of type *ServerAuthError for -// authentication errors. -func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewChannel, <-chan *Request, error) { - fullConf := *config - fullConf.SetDefaults() - if fullConf.MaxAuthTries == 0 { - fullConf.MaxAuthTries = 6 - } - - s := &connection{ - sshConn: sshConn{conn: c}, - } - perms, err := s.serverHandshake(&fullConf) - if err != nil { - c.Close() - return nil, nil, nil, err - } - return &ServerConn{s, perms}, s.mux.incomingChannels, s.mux.incomingRequests, nil -} - -// signAndMarshal signs the data with the appropriate algorithm, -// and serializes the result in SSH wire format. -func signAndMarshal(k Signer, rand io.Reader, data []byte) ([]byte, error) { - sig, err := k.Sign(rand, data) - if err != nil { - return nil, err - } - - return Marshal(sig), nil -} - -// handshake performs key exchange and user authentication. -func (s *connection) serverHandshake(config *ServerConfig) (*Permissions, error) { - if len(config.hostKeys) == 0 { - return nil, errors.New("ssh: server has no host keys") - } - - if !config.NoClientAuth && config.PasswordCallback == nil && config.PublicKeyCallback == nil && config.KeyboardInteractiveCallback == nil { - return nil, errors.New("ssh: no authentication methods configured but NoClientAuth is also false") - } - - if config.ServerVersion != "" { - s.serverVersion = []byte(config.ServerVersion) - } else { - s.serverVersion = []byte(packageVersion) - } - var err error - s.clientVersion, err = exchangeVersions(s.sshConn.conn, s.serverVersion) - if err != nil { - return nil, err - } - - tr := newTransport(s.sshConn.conn, config.Rand, false /* not client */) - s.transport = newServerTransport(tr, s.clientVersion, s.serverVersion, config) - - if err := s.transport.waitSession(); err != nil { - return nil, err - } - - // We just did the key change, so the session ID is established. - s.sessionID = s.transport.getSessionID() - - var packet []byte - if packet, err = s.transport.readPacket(); err != nil { - return nil, err - } - - var serviceRequest serviceRequestMsg - if err = Unmarshal(packet, &serviceRequest); err != nil { - return nil, err - } - if serviceRequest.Service != serviceUserAuth { - return nil, errors.New("ssh: requested service '" + serviceRequest.Service + "' before authenticating") - } - serviceAccept := serviceAcceptMsg{ - Service: serviceUserAuth, - } - if err := s.transport.writePacket(Marshal(&serviceAccept)); err != nil { - return nil, err - } - - perms, err := s.serverAuthenticate(config) - if err != nil { - return nil, err - } - s.mux = newMux(s.transport) - return perms, err -} - -func isAcceptableAlgo(algo string) bool { - switch algo { - case KeyAlgoRSA, KeyAlgoDSA, KeyAlgoECDSA256, KeyAlgoECDSA384, KeyAlgoECDSA521, KeyAlgoED25519, - CertAlgoRSAv01, CertAlgoDSAv01, CertAlgoECDSA256v01, CertAlgoECDSA384v01, CertAlgoECDSA521v01, CertAlgoED25519v01: - return true - } - return false -} - -func checkSourceAddress(addr net.Addr, sourceAddrs string) error { - if addr == nil { - return errors.New("ssh: no address known for client, but source-address match required") - } - - tcpAddr, ok := addr.(*net.TCPAddr) - if !ok { - return fmt.Errorf("ssh: remote address %v is not an TCP address when checking source-address match", addr) - } - - for _, sourceAddr := range strings.Split(sourceAddrs, ",") { - if allowedIP := net.ParseIP(sourceAddr); allowedIP != nil { - if allowedIP.Equal(tcpAddr.IP) { - return nil - } - } else { - _, ipNet, err := net.ParseCIDR(sourceAddr) - if err != nil { - return fmt.Errorf("ssh: error parsing source-address restriction %q: %v", sourceAddr, err) - } - - if ipNet.Contains(tcpAddr.IP) { - return nil - } - } - } - - return fmt.Errorf("ssh: remote address %v is not allowed because of source-address restriction", addr) -} - -// ServerAuthError represents server authentication errors and is -// sometimes returned by NewServerConn. 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. The first entry is typically ErrNoAuth. - Errors []error -} - -func (l ServerAuthError) Error() string { - var errs []string - for _, err := range l.Errors { - errs = append(errs, err.Error()) - } - return "[" + strings.Join(errs, ", ") + "]" -} - -// ErrNoAuth is the error value returned if no -// authentication method has been passed yet. This happens as a normal -// part of the authentication loop, since the client first tries -// 'none' authentication to discover available methods. -// It is returned in ServerAuthError.Errors from NewServerConn. -var ErrNoAuth = errors.New("ssh: no auth passed yet") - -func (s *connection) serverAuthenticate(config *ServerConfig) (*Permissions, error) { - sessionID := s.transport.getSessionID() - var cache pubKeyCache - var perms *Permissions - - authFailures := 0 - var authErrs []error - var displayedBanner bool - -userAuthLoop: - for { - if authFailures >= config.MaxAuthTries && config.MaxAuthTries > 0 { - discMsg := &disconnectMsg{ - Reason: 2, - Message: "too many authentication failures", - } - - if err := s.transport.writePacket(Marshal(discMsg)); err != nil { - return nil, err - } - - return nil, discMsg - } - - 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 - } - - if userAuthReq.Service != serviceSSH { - return nil, errors.New("ssh: client attempted to negotiate for unknown service: " + userAuthReq.Service) - } - - s.user = userAuthReq.User - - if !displayedBanner && config.BannerCallback != nil { - displayedBanner = true - msg := config.BannerCallback(s) - if msg != "" { - bannerMsg := &userAuthBannerMsg{ - Message: msg, - } - if err := s.transport.writePacket(Marshal(bannerMsg)); err != nil { - return nil, err - } - } - } - - perms = nil - authErr := ErrNoAuth - - switch userAuthReq.Method { - case "none": - if config.NoClientAuth { - authErr = nil - } - - // allow initial attempt of 'none' without penalty - if authFailures == 0 { - authFailures-- - } - case "password": - if config.PasswordCallback == nil { - authErr = errors.New("ssh: password auth not configured") - break - } - payload := userAuthReq.Payload - if len(payload) < 1 || payload[0] != 0 { - return nil, parseError(msgUserAuthRequest) - } - payload = payload[1:] - password, payload, ok := parseString(payload) - if !ok || len(payload) > 0 { - return nil, parseError(msgUserAuthRequest) - } - - perms, authErr = config.PasswordCallback(s, password) - case "keyboard-interactive": - if config.KeyboardInteractiveCallback == nil { - authErr = errors.New("ssh: keyboard-interactive auth not configured") - break - } - - prompter := &sshClientKeyboardInteractive{s} - perms, authErr = config.KeyboardInteractiveCallback(s, prompter.Challenge) - case "publickey": - if config.PublicKeyCallback == nil { - authErr = errors.New("ssh: publickey auth not configured") - break - } - payload := userAuthReq.Payload - if len(payload) < 1 { - return nil, parseError(msgUserAuthRequest) - } - isQuery := payload[0] == 0 - payload = payload[1:] - algoBytes, payload, ok := parseString(payload) - if !ok { - return nil, parseError(msgUserAuthRequest) - } - algo := string(algoBytes) - if !isAcceptableAlgo(algo) { - authErr = fmt.Errorf("ssh: algorithm %q not accepted", algo) - break - } - - pubKeyData, payload, ok := parseString(payload) - if !ok { - return nil, parseError(msgUserAuthRequest) - } - - pubKey, err := ParsePublicKey(pubKeyData) - if err != nil { - return nil, err - } - - candidate, ok := cache.get(s.user, pubKeyData) - if !ok { - candidate.user = s.user - candidate.pubKeyData = pubKeyData - candidate.perms, candidate.result = config.PublicKeyCallback(s, pubKey) - if candidate.result == nil && candidate.perms != nil && candidate.perms.CriticalOptions != nil && candidate.perms.CriticalOptions[sourceAddressCriticalOption] != "" { - candidate.result = checkSourceAddress( - s.RemoteAddr(), - candidate.perms.CriticalOptions[sourceAddressCriticalOption]) - } - cache.add(candidate) - } - - if isQuery { - // The client can query if the given public key - // would be okay. - - if len(payload) > 0 { - return nil, parseError(msgUserAuthRequest) - } - - if candidate.result == nil { - okMsg := userAuthPubKeyOkMsg{ - Algo: algo, - PubKey: pubKeyData, - } - if err = s.transport.writePacket(Marshal(&okMsg)); err != nil { - return nil, err - } - continue userAuthLoop - } - authErr = candidate.result - } else { - sig, payload, ok := parseSignature(payload) - if !ok || len(payload) > 0 { - return nil, parseError(msgUserAuthRequest) - } - // Ensure the public key algo and signature algo - // are supported. Compare the private key - // algorithm name that corresponds to algo with - // sig.Format. This is usually the same, but - // for certs, the names differ. - if !isAcceptableAlgo(sig.Format) { - authErr = fmt.Errorf("ssh: algorithm %q not accepted", sig.Format) - break - } - signedData := buildDataSignedForAuth(sessionID, userAuthReq, algoBytes, pubKeyData) - - if err := pubKey.Verify(signedData, sig); err != nil { - return nil, err - } - - authErr = candidate.result - perms = candidate.perms - } - default: - authErr = fmt.Errorf("ssh: unknown method %q", userAuthReq.Method) - } - - authErrs = append(authErrs, authErr) - - if config.AuthLogCallback != nil { - config.AuthLogCallback(s, userAuthReq.Method, authErr) - } - - if authErr == nil { - break userAuthLoop - } - - authFailures++ - - var failureMsg userAuthFailureMsg - if config.PasswordCallback != nil { - failureMsg.Methods = append(failureMsg.Methods, "password") - } - if config.PublicKeyCallback != nil { - failureMsg.Methods = append(failureMsg.Methods, "publickey") - } - if config.KeyboardInteractiveCallback != nil { - failureMsg.Methods = append(failureMsg.Methods, "keyboard-interactive") - } - - if len(failureMsg.Methods) == 0 { - return nil, errors.New("ssh: no authentication methods configured but NoClientAuth is also false") - } - - if err := s.transport.writePacket(Marshal(&failureMsg)); err != nil { - return nil, err - } - } - - if err := s.transport.writePacket([]byte{msgUserAuthSuccess}); err != nil { - return nil, err - } - return perms, nil -} - -// sshClientKeyboardInteractive implements a ClientKeyboardInteractive by -// asking the client on the other side of a ServerConn. -type sshClientKeyboardInteractive struct { - *connection -} - -func (c *sshClientKeyboardInteractive) Challenge(user, instruction string, questions []string, echos []bool) (answers []string, err error) { - if len(questions) != len(echos) { - return nil, errors.New("ssh: echos and questions must have equal length") - } - - var prompts []byte - for i := range questions { - prompts = appendString(prompts, questions[i]) - prompts = appendBool(prompts, echos[i]) - } - - if err := c.transport.writePacket(Marshal(&userAuthInfoRequestMsg{ - Instruction: instruction, - NumPrompts: uint32(len(questions)), - Prompts: prompts, - })); err != nil { - return nil, err - } - - packet, err := c.transport.readPacket() - if err != nil { - return nil, err - } - if packet[0] != msgUserAuthInfoResponse { - return nil, unexpectedMessageError(msgUserAuthInfoResponse, packet[0]) - } - packet = packet[1:] - - n, packet, ok := parseUint32(packet) - if !ok || int(n) != len(questions) { - return nil, parseError(msgUserAuthInfoResponse) - } - - for i := uint32(0); i < n; i++ { - ans, rest, ok := parseString(packet) - if !ok { - return nil, parseError(msgUserAuthInfoResponse) - } - - answers = append(answers, string(ans)) - packet = rest - } - if len(packet) != 0 { - return nil, errors.New("ssh: junk at end of message") - } - - return answers, nil -} diff --git a/vendor/golang.org/x/crypto/ssh/session.go b/vendor/golang.org/x/crypto/ssh/session.go deleted file mode 100644 index d3321f6b784b..000000000000 --- a/vendor/golang.org/x/crypto/ssh/session.go +++ /dev/null @@ -1,647 +0,0 @@ -// 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 ssh - -// Session implements an interactive session described in -// "RFC 4254, section 6". - -import ( - "bytes" - "encoding/binary" - "errors" - "fmt" - "io" - "io/ioutil" - "sync" -) - -type Signal string - -// POSIX signals as listed in RFC 4254 Section 6.10. -const ( - SIGABRT Signal = "ABRT" - SIGALRM Signal = "ALRM" - SIGFPE Signal = "FPE" - SIGHUP Signal = "HUP" - SIGILL Signal = "ILL" - SIGINT Signal = "INT" - SIGKILL Signal = "KILL" - SIGPIPE Signal = "PIPE" - SIGQUIT Signal = "QUIT" - SIGSEGV Signal = "SEGV" - SIGTERM Signal = "TERM" - SIGUSR1 Signal = "USR1" - SIGUSR2 Signal = "USR2" -) - -var signals = map[Signal]int{ - SIGABRT: 6, - SIGALRM: 14, - SIGFPE: 8, - SIGHUP: 1, - SIGILL: 4, - SIGINT: 2, - SIGKILL: 9, - SIGPIPE: 13, - SIGQUIT: 3, - SIGSEGV: 11, - SIGTERM: 15, -} - -type TerminalModes map[uint8]uint32 - -// POSIX terminal mode flags as listed in RFC 4254 Section 8. -const ( - tty_OP_END = 0 - VINTR = 1 - VQUIT = 2 - VERASE = 3 - VKILL = 4 - VEOF = 5 - VEOL = 6 - VEOL2 = 7 - VSTART = 8 - VSTOP = 9 - VSUSP = 10 - VDSUSP = 11 - VREPRINT = 12 - VWERASE = 13 - VLNEXT = 14 - VFLUSH = 15 - VSWTCH = 16 - VSTATUS = 17 - VDISCARD = 18 - IGNPAR = 30 - PARMRK = 31 - INPCK = 32 - ISTRIP = 33 - INLCR = 34 - IGNCR = 35 - ICRNL = 36 - IUCLC = 37 - IXON = 38 - IXANY = 39 - IXOFF = 40 - IMAXBEL = 41 - ISIG = 50 - ICANON = 51 - XCASE = 52 - ECHO = 53 - ECHOE = 54 - ECHOK = 55 - ECHONL = 56 - NOFLSH = 57 - TOSTOP = 58 - IEXTEN = 59 - ECHOCTL = 60 - ECHOKE = 61 - PENDIN = 62 - OPOST = 70 - OLCUC = 71 - ONLCR = 72 - OCRNL = 73 - ONOCR = 74 - ONLRET = 75 - CS7 = 90 - CS8 = 91 - PARENB = 92 - PARODD = 93 - TTY_OP_ISPEED = 128 - TTY_OP_OSPEED = 129 -) - -// A Session represents a connection to a remote command or shell. -type Session struct { - // Stdin specifies the remote process's standard input. - // If Stdin is nil, the remote process reads from an empty - // bytes.Buffer. - Stdin io.Reader - - // Stdout and Stderr specify the remote process's standard - // output and error. - // - // If either is nil, Run connects the corresponding file - // descriptor to an instance of ioutil.Discard. There is a - // fixed amount of buffering that is shared for the two streams. - // If either blocks it may eventually cause the remote - // command to block. - Stdout io.Writer - Stderr io.Writer - - ch Channel // the channel backing this session - started bool // true once Start, Run or Shell is invoked. - copyFuncs []func() error - errors chan error // one send per copyFunc - - // true if pipe method is active - stdinpipe, stdoutpipe, stderrpipe bool - - // stdinPipeWriter is non-nil if StdinPipe has not been called - // and Stdin was specified by the user; it is the write end of - // a pipe connecting Session.Stdin to the stdin channel. - stdinPipeWriter io.WriteCloser - - exitStatus chan error -} - -// SendRequest sends an out-of-band channel request on the SSH channel -// underlying the session. -func (s *Session) SendRequest(name string, wantReply bool, payload []byte) (bool, error) { - return s.ch.SendRequest(name, wantReply, payload) -} - -func (s *Session) Close() error { - return s.ch.Close() -} - -// RFC 4254 Section 6.4. -type setenvRequest struct { - Name string - Value string -} - -// Setenv sets an environment variable that will be applied to any -// command executed by Shell or Run. -func (s *Session) Setenv(name, value string) error { - msg := setenvRequest{ - Name: name, - Value: value, - } - ok, err := s.ch.SendRequest("env", true, Marshal(&msg)) - if err == nil && !ok { - err = errors.New("ssh: setenv failed") - } - return err -} - -// RFC 4254 Section 6.2. -type ptyRequestMsg struct { - Term string - Columns uint32 - Rows uint32 - Width uint32 - Height uint32 - Modelist string -} - -// RequestPty requests the association of a pty with the session on the remote host. -func (s *Session) RequestPty(term string, h, w int, termmodes TerminalModes) error { - var tm []byte - for k, v := range termmodes { - kv := struct { - Key byte - Val uint32 - }{k, v} - - tm = append(tm, Marshal(&kv)...) - } - tm = append(tm, tty_OP_END) - req := ptyRequestMsg{ - Term: term, - Columns: uint32(w), - Rows: uint32(h), - Width: uint32(w * 8), - Height: uint32(h * 8), - Modelist: string(tm), - } - ok, err := s.ch.SendRequest("pty-req", true, Marshal(&req)) - if err == nil && !ok { - err = errors.New("ssh: pty-req failed") - } - return err -} - -// RFC 4254 Section 6.5. -type subsystemRequestMsg struct { - Subsystem string -} - -// RequestSubsystem requests the association of a subsystem with the session on the remote host. -// A subsystem is a predefined command that runs in the background when the ssh session is initiated -func (s *Session) RequestSubsystem(subsystem string) error { - msg := subsystemRequestMsg{ - Subsystem: subsystem, - } - ok, err := s.ch.SendRequest("subsystem", true, Marshal(&msg)) - if err == nil && !ok { - err = errors.New("ssh: subsystem request failed") - } - 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 -} - -// Signal sends the given signal to the remote process. -// sig is one of the SIG* constants. -func (s *Session) Signal(sig Signal) error { - msg := signalMsg{ - Signal: string(sig), - } - - _, err := s.ch.SendRequest("signal", false, Marshal(&msg)) - return err -} - -// RFC 4254 Section 6.5. -type execMsg struct { - Command string -} - -// Start runs cmd on the remote host. Typically, the remote -// server passes cmd to the shell for interpretation. -// A Session only accepts one call to Run, Start or Shell. -func (s *Session) Start(cmd string) error { - if s.started { - return errors.New("ssh: session already started") - } - req := execMsg{ - Command: cmd, - } - - ok, err := s.ch.SendRequest("exec", true, Marshal(&req)) - if err == nil && !ok { - err = fmt.Errorf("ssh: command %v failed", cmd) - } - if err != nil { - return err - } - return s.start() -} - -// Run runs cmd on the remote host. Typically, the remote -// server passes cmd to the shell for interpretation. -// A Session only accepts one call to Run, Start, Shell, Output, -// or CombinedOutput. -// -// The returned error is nil if the command runs, has no problems -// copying stdin, stdout, and stderr, and exits with a zero exit -// status. -// -// If the remote server does not send an exit status, an error of type -// *ExitMissingError is returned. If the command completes -// unsuccessfully or is interrupted by a signal, the error is of type -// *ExitError. Other error types may be returned for I/O problems. -func (s *Session) Run(cmd string) error { - err := s.Start(cmd) - if err != nil { - return err - } - return s.Wait() -} - -// Output runs cmd on the remote host and returns its standard output. -func (s *Session) Output(cmd string) ([]byte, error) { - if s.Stdout != nil { - return nil, errors.New("ssh: Stdout already set") - } - var b bytes.Buffer - s.Stdout = &b - err := s.Run(cmd) - return b.Bytes(), err -} - -type singleWriter struct { - b bytes.Buffer - mu sync.Mutex -} - -func (w *singleWriter) Write(p []byte) (int, error) { - w.mu.Lock() - defer w.mu.Unlock() - return w.b.Write(p) -} - -// CombinedOutput runs cmd on the remote host and returns its combined -// standard output and standard error. -func (s *Session) CombinedOutput(cmd string) ([]byte, error) { - if s.Stdout != nil { - return nil, errors.New("ssh: Stdout already set") - } - if s.Stderr != nil { - return nil, errors.New("ssh: Stderr already set") - } - var b singleWriter - s.Stdout = &b - s.Stderr = &b - err := s.Run(cmd) - return b.b.Bytes(), err -} - -// Shell starts a login shell on the remote host. A Session only -// accepts one call to Run, Start, Shell, Output, or CombinedOutput. -func (s *Session) Shell() error { - if s.started { - return errors.New("ssh: session already started") - } - - ok, err := s.ch.SendRequest("shell", true, nil) - if err == nil && !ok { - return errors.New("ssh: could not start shell") - } - if err != nil { - return err - } - return s.start() -} - -func (s *Session) start() error { - s.started = true - - type F func(*Session) - for _, setupFd := range []F{(*Session).stdin, (*Session).stdout, (*Session).stderr} { - setupFd(s) - } - - s.errors = make(chan error, len(s.copyFuncs)) - for _, fn := range s.copyFuncs { - go func(fn func() error) { - s.errors <- fn() - }(fn) - } - return nil -} - -// Wait waits for the remote command to exit. -// -// The returned error is nil if the command runs, has no problems -// copying stdin, stdout, and stderr, and exits with a zero exit -// status. -// -// If the remote server does not send an exit status, an error of type -// *ExitMissingError is returned. If the command completes -// unsuccessfully or is interrupted by a signal, the error is of type -// *ExitError. Other error types may be returned for I/O problems. -func (s *Session) Wait() error { - if !s.started { - return errors.New("ssh: session not started") - } - waitErr := <-s.exitStatus - - if s.stdinPipeWriter != nil { - s.stdinPipeWriter.Close() - } - var copyError error - for range s.copyFuncs { - if err := <-s.errors; err != nil && copyError == nil { - copyError = err - } - } - if waitErr != nil { - return waitErr - } - return copyError -} - -func (s *Session) wait(reqs <-chan *Request) error { - wm := Waitmsg{status: -1} - // Wait for msg channel to be closed before returning. - for msg := range reqs { - switch msg.Type { - case "exit-status": - wm.status = int(binary.BigEndian.Uint32(msg.Payload)) - case "exit-signal": - var sigval struct { - Signal string - CoreDumped bool - Error string - Lang string - } - if err := Unmarshal(msg.Payload, &sigval); err != nil { - return err - } - - // Must sanitize strings? - wm.signal = sigval.Signal - wm.msg = sigval.Error - wm.lang = sigval.Lang - default: - // This handles keepalives and matches - // OpenSSH's behaviour. - if msg.WantReply { - msg.Reply(false, nil) - } - } - } - if wm.status == 0 { - return nil - } - if wm.status == -1 { - // exit-status was never sent from server - if wm.signal == "" { - // signal was not sent either. RFC 4254 - // section 6.10 recommends against this - // behavior, but it is allowed, so we let - // clients handle it. - return &ExitMissingError{} - } - wm.status = 128 - if _, ok := signals[Signal(wm.signal)]; ok { - wm.status += signals[Signal(wm.signal)] - } - } - - return &ExitError{wm} -} - -// ExitMissingError is returned if a session is torn down cleanly, but -// the server sends no confirmation of the exit status. -type ExitMissingError struct{} - -func (e *ExitMissingError) Error() string { - return "wait: remote command exited without exit status or exit signal" -} - -func (s *Session) stdin() { - if s.stdinpipe { - return - } - var stdin io.Reader - if s.Stdin == nil { - stdin = new(bytes.Buffer) - } else { - r, w := io.Pipe() - go func() { - _, err := io.Copy(w, s.Stdin) - w.CloseWithError(err) - }() - stdin, s.stdinPipeWriter = r, w - } - s.copyFuncs = append(s.copyFuncs, func() error { - _, err := io.Copy(s.ch, stdin) - if err1 := s.ch.CloseWrite(); err == nil && err1 != io.EOF { - err = err1 - } - return err - }) -} - -func (s *Session) stdout() { - if s.stdoutpipe { - return - } - if s.Stdout == nil { - s.Stdout = ioutil.Discard - } - s.copyFuncs = append(s.copyFuncs, func() error { - _, err := io.Copy(s.Stdout, s.ch) - return err - }) -} - -func (s *Session) stderr() { - if s.stderrpipe { - return - } - if s.Stderr == nil { - s.Stderr = ioutil.Discard - } - s.copyFuncs = append(s.copyFuncs, func() error { - _, err := io.Copy(s.Stderr, s.ch.Stderr()) - return err - }) -} - -// sessionStdin reroutes Close to CloseWrite. -type sessionStdin struct { - io.Writer - ch Channel -} - -func (s *sessionStdin) Close() error { - return s.ch.CloseWrite() -} - -// StdinPipe returns a pipe that will be connected to the -// remote command's standard input when the command starts. -func (s *Session) StdinPipe() (io.WriteCloser, error) { - if s.Stdin != nil { - return nil, errors.New("ssh: Stdin already set") - } - if s.started { - return nil, errors.New("ssh: StdinPipe after process started") - } - s.stdinpipe = true - return &sessionStdin{s.ch, s.ch}, nil -} - -// StdoutPipe returns a pipe that will be connected to the -// remote command's standard output when the command starts. -// There is a fixed amount of buffering that is shared between -// stdout and stderr streams. If the StdoutPipe reader is -// not serviced fast enough it may eventually cause the -// remote command to block. -func (s *Session) StdoutPipe() (io.Reader, error) { - if s.Stdout != nil { - return nil, errors.New("ssh: Stdout already set") - } - if s.started { - return nil, errors.New("ssh: StdoutPipe after process started") - } - s.stdoutpipe = true - return s.ch, nil -} - -// StderrPipe returns a pipe that will be connected to the -// remote command's standard error when the command starts. -// There is a fixed amount of buffering that is shared between -// stdout and stderr streams. If the StderrPipe reader is -// not serviced fast enough it may eventually cause the -// remote command to block. -func (s *Session) StderrPipe() (io.Reader, error) { - if s.Stderr != nil { - return nil, errors.New("ssh: Stderr already set") - } - if s.started { - return nil, errors.New("ssh: StderrPipe after process started") - } - s.stderrpipe = true - return s.ch.Stderr(), nil -} - -// newSession returns a new interactive session on the remote host. -func newSession(ch Channel, reqs <-chan *Request) (*Session, error) { - s := &Session{ - ch: ch, - } - s.exitStatus = make(chan error, 1) - go func() { - s.exitStatus <- s.wait(reqs) - }() - - return s, nil -} - -// An ExitError reports unsuccessful completion of a remote command. -type ExitError struct { - Waitmsg -} - -func (e *ExitError) Error() string { - return e.Waitmsg.String() -} - -// Waitmsg stores the information about an exited remote command -// as reported by Wait. -type Waitmsg struct { - status int - signal string - msg string - lang string -} - -// ExitStatus returns the exit status of the remote command. -func (w Waitmsg) ExitStatus() int { - return w.status -} - -// Signal returns the exit signal of the remote command if -// it was terminated violently. -func (w Waitmsg) Signal() string { - return w.signal -} - -// Msg returns the exit message given by the remote command -func (w Waitmsg) Msg() string { - return w.msg -} - -// Lang returns the language tag. See RFC 3066 -func (w Waitmsg) Lang() string { - return w.lang -} - -func (w Waitmsg) String() string { - str := fmt.Sprintf("Process exited with status %v", w.status) - if w.signal != "" { - str += fmt.Sprintf(" from signal %v", w.signal) - } - if w.msg != "" { - str += fmt.Sprintf(". Reason was: %v", w.msg) - } - return str -} diff --git a/vendor/golang.org/x/crypto/ssh/streamlocal.go b/vendor/golang.org/x/crypto/ssh/streamlocal.go deleted file mode 100644 index b171b330bc38..000000000000 --- a/vendor/golang.org/x/crypto/ssh/streamlocal.go +++ /dev/null @@ -1,116 +0,0 @@ -package ssh - -import ( - "errors" - "io" - "net" -) - -// streamLocalChannelOpenDirectMsg is a struct used for SSH_MSG_CHANNEL_OPEN message -// with "direct-streamlocal@openssh.com" string. -// -// See openssh-portable/PROTOCOL, section 2.4. connection: Unix domain socket forwarding -// https://github.com/openssh/openssh-portable/blob/master/PROTOCOL#L235 -type streamLocalChannelOpenDirectMsg struct { - socketPath string - reserved0 string - reserved1 uint32 -} - -// forwardedStreamLocalPayload is a struct used for SSH_MSG_CHANNEL_OPEN message -// with "forwarded-streamlocal@openssh.com" string. -type forwardedStreamLocalPayload struct { - SocketPath string - Reserved0 string -} - -// streamLocalChannelForwardMsg is a struct used for SSH2_MSG_GLOBAL_REQUEST message -// with "streamlocal-forward@openssh.com"/"cancel-streamlocal-forward@openssh.com" string. -type streamLocalChannelForwardMsg struct { - socketPath string -} - -// ListenUnix is similar to ListenTCP but uses a Unix domain socket. -func (c *Client) ListenUnix(socketPath string) (net.Listener, error) { - c.handleForwardsOnce.Do(c.handleForwards) - m := streamLocalChannelForwardMsg{ - socketPath, - } - // send message - ok, _, err := c.SendRequest("streamlocal-forward@openssh.com", true, Marshal(&m)) - if err != nil { - return nil, err - } - if !ok { - return nil, errors.New("ssh: streamlocal-forward@openssh.com request denied by peer") - } - ch := c.forwards.add(&net.UnixAddr{Name: socketPath, Net: "unix"}) - - return &unixListener{socketPath, c, ch}, nil -} - -func (c *Client) dialStreamLocal(socketPath string) (Channel, error) { - msg := streamLocalChannelOpenDirectMsg{ - socketPath: socketPath, - } - ch, in, err := c.OpenChannel("direct-streamlocal@openssh.com", Marshal(&msg)) - if err != nil { - return nil, err - } - go DiscardRequests(in) - return ch, err -} - -type unixListener struct { - socketPath string - - conn *Client - in <-chan forward -} - -// Accept waits for and returns the next connection to the listener. -func (l *unixListener) Accept() (net.Conn, error) { - s, ok := <-l.in - if !ok { - return nil, io.EOF - } - ch, incoming, err := s.newCh.Accept() - if err != nil { - return nil, err - } - go DiscardRequests(incoming) - - return &chanConn{ - Channel: ch, - laddr: &net.UnixAddr{ - Name: l.socketPath, - Net: "unix", - }, - raddr: &net.UnixAddr{ - Name: "@", - Net: "unix", - }, - }, nil -} - -// Close closes the listener. -func (l *unixListener) Close() error { - // this also closes the listener. - l.conn.forwards.remove(&net.UnixAddr{Name: l.socketPath, Net: "unix"}) - m := streamLocalChannelForwardMsg{ - l.socketPath, - } - ok, _, err := l.conn.SendRequest("cancel-streamlocal-forward@openssh.com", true, Marshal(&m)) - if err == nil && !ok { - err = errors.New("ssh: cancel-streamlocal-forward@openssh.com failed") - } - return err -} - -// Addr returns the listener's network address. -func (l *unixListener) Addr() net.Addr { - return &net.UnixAddr{ - Name: l.socketPath, - Net: "unix", - } -} diff --git a/vendor/golang.org/x/crypto/ssh/tcpip.go b/vendor/golang.org/x/crypto/ssh/tcpip.go deleted file mode 100644 index 80d35f5ec187..000000000000 --- a/vendor/golang.org/x/crypto/ssh/tcpip.go +++ /dev/null @@ -1,474 +0,0 @@ -// 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 ssh - -import ( - "errors" - "fmt" - "io" - "math/rand" - "net" - "strconv" - "strings" - "sync" - "time" -) - -// Listen requests the remote peer open a listening socket on -// addr. Incoming connections will be available by calling Accept on -// the returned net.Listener. The listener must be serviced, or the -// SSH connection may hang. -// N must be "tcp", "tcp4", "tcp6", or "unix". -func (c *Client) Listen(n, addr string) (net.Listener, error) { - switch n { - case "tcp", "tcp4", "tcp6": - laddr, err := net.ResolveTCPAddr(n, addr) - if err != nil { - return nil, err - } - return c.ListenTCP(laddr) - case "unix": - return c.ListenUnix(addr) - default: - return nil, fmt.Errorf("ssh: unsupported protocol: %s", n) - } -} - -// Automatic port allocation is broken with OpenSSH before 6.0. See -// also https://bugzilla.mindrot.org/show_bug.cgi?id=2017. In -// particular, OpenSSH 5.9 sends a channelOpenMsg with port number 0, -// rather than the actual port number. This means you can never open -// two different listeners with auto allocated ports. We work around -// this by trying explicit ports until we succeed. - -const openSSHPrefix = "OpenSSH_" - -var portRandomizer = rand.New(rand.NewSource(time.Now().UnixNano())) - -// isBrokenOpenSSHVersion returns true if the given version string -// specifies a version of OpenSSH that is known to have a bug in port -// forwarding. -func isBrokenOpenSSHVersion(versionStr string) bool { - i := strings.Index(versionStr, openSSHPrefix) - if i < 0 { - return false - } - i += len(openSSHPrefix) - j := i - for ; j < len(versionStr); j++ { - if versionStr[j] < '0' || versionStr[j] > '9' { - break - } - } - version, _ := strconv.Atoi(versionStr[i:j]) - return version < 6 -} - -// autoPortListenWorkaround simulates automatic port allocation by -// trying random ports repeatedly. -func (c *Client) autoPortListenWorkaround(laddr *net.TCPAddr) (net.Listener, error) { - var sshListener net.Listener - var err error - const tries = 10 - for i := 0; i < tries; i++ { - addr := *laddr - addr.Port = 1024 + portRandomizer.Intn(60000) - sshListener, err = c.ListenTCP(&addr) - if err == nil { - laddr.Port = addr.Port - return sshListener, err - } - } - return nil, fmt.Errorf("ssh: listen on random port failed after %d tries: %v", tries, err) -} - -// RFC 4254 7.1 -type channelForwardMsg struct { - addr string - rport uint32 -} - -// handleForwards starts goroutines handling forwarded connections. -// It's called on first use by (*Client).ListenTCP to not launch -// goroutines until needed. -func (c *Client) handleForwards() { - go c.forwards.handleChannels(c.HandleChannelOpen("forwarded-tcpip")) - go c.forwards.handleChannels(c.HandleChannelOpen("forwarded-streamlocal@openssh.com")) -} - -// ListenTCP requests the remote peer open a listening socket -// on laddr. Incoming connections will be available by calling -// Accept on the returned net.Listener. -func (c *Client) ListenTCP(laddr *net.TCPAddr) (net.Listener, error) { - c.handleForwardsOnce.Do(c.handleForwards) - if laddr.Port == 0 && isBrokenOpenSSHVersion(string(c.ServerVersion())) { - return c.autoPortListenWorkaround(laddr) - } - - m := channelForwardMsg{ - laddr.IP.String(), - uint32(laddr.Port), - } - // send message - ok, resp, err := c.SendRequest("tcpip-forward", true, Marshal(&m)) - if err != nil { - return nil, err - } - if !ok { - return nil, errors.New("ssh: tcpip-forward request denied by peer") - } - - // If the original port was 0, then the remote side will - // supply a real port number in the response. - if laddr.Port == 0 { - var p struct { - Port uint32 - } - if err := Unmarshal(resp, &p); err != nil { - return nil, err - } - laddr.Port = int(p.Port) - } - - // Register this forward, using the port number we obtained. - ch := c.forwards.add(laddr) - - return &tcpListener{laddr, c, ch}, nil -} - -// forwardList stores a mapping between remote -// forward requests and the tcpListeners. -type forwardList struct { - sync.Mutex - entries []forwardEntry -} - -// forwardEntry represents an established mapping of a laddr on a -// remote ssh server to a channel connected to a tcpListener. -type forwardEntry struct { - laddr net.Addr - c chan forward -} - -// forward represents an incoming forwarded tcpip connection. The -// arguments to add/remove/lookup should be address as specified in -// the original forward-request. -type forward struct { - newCh NewChannel // the ssh client channel underlying this forward - raddr net.Addr // the raddr of the incoming connection -} - -func (l *forwardList) add(addr net.Addr) chan forward { - l.Lock() - defer l.Unlock() - f := forwardEntry{ - laddr: addr, - c: make(chan forward, 1), - } - l.entries = append(l.entries, f) - return f.c -} - -// See RFC 4254, section 7.2 -type forwardedTCPPayload struct { - Addr string - Port uint32 - OriginAddr string - OriginPort uint32 -} - -// parseTCPAddr parses the originating address from the remote into a *net.TCPAddr. -func parseTCPAddr(addr string, port uint32) (*net.TCPAddr, error) { - if port == 0 || port > 65535 { - return nil, fmt.Errorf("ssh: port number out of range: %d", port) - } - ip := net.ParseIP(string(addr)) - if ip == nil { - return nil, fmt.Errorf("ssh: cannot parse IP address %q", addr) - } - return &net.TCPAddr{IP: ip, Port: int(port)}, nil -} - -func (l *forwardList) handleChannels(in <-chan NewChannel) { - for ch := range in { - var ( - laddr net.Addr - raddr net.Addr - err error - ) - switch channelType := ch.ChannelType(); channelType { - case "forwarded-tcpip": - var payload forwardedTCPPayload - if err = Unmarshal(ch.ExtraData(), &payload); err != nil { - ch.Reject(ConnectionFailed, "could not parse forwarded-tcpip payload: "+err.Error()) - continue - } - - // RFC 4254 section 7.2 specifies that incoming - // addresses should list the address, in string - // format. It is implied that this should be an IP - // address, as it would be impossible to connect to it - // otherwise. - laddr, err = parseTCPAddr(payload.Addr, payload.Port) - if err != nil { - ch.Reject(ConnectionFailed, err.Error()) - continue - } - raddr, err = parseTCPAddr(payload.OriginAddr, payload.OriginPort) - if err != nil { - ch.Reject(ConnectionFailed, err.Error()) - continue - } - - case "forwarded-streamlocal@openssh.com": - var payload forwardedStreamLocalPayload - if err = Unmarshal(ch.ExtraData(), &payload); err != nil { - ch.Reject(ConnectionFailed, "could not parse forwarded-streamlocal@openssh.com payload: "+err.Error()) - continue - } - laddr = &net.UnixAddr{ - Name: payload.SocketPath, - Net: "unix", - } - raddr = &net.UnixAddr{ - Name: "@", - Net: "unix", - } - default: - panic(fmt.Errorf("ssh: unknown channel type %s", channelType)) - } - if ok := l.forward(laddr, raddr, ch); !ok { - // Section 7.2, implementations MUST reject spurious incoming - // connections. - ch.Reject(Prohibited, "no forward for address") - continue - } - - } -} - -// remove removes the forward entry, and the channel feeding its -// listener. -func (l *forwardList) remove(addr net.Addr) { - l.Lock() - defer l.Unlock() - for i, f := range l.entries { - if addr.Network() == f.laddr.Network() && addr.String() == f.laddr.String() { - l.entries = append(l.entries[:i], l.entries[i+1:]...) - close(f.c) - return - } - } -} - -// closeAll closes and clears all forwards. -func (l *forwardList) closeAll() { - l.Lock() - defer l.Unlock() - for _, f := range l.entries { - close(f.c) - } - l.entries = nil -} - -func (l *forwardList) forward(laddr, raddr net.Addr, ch NewChannel) bool { - l.Lock() - defer l.Unlock() - for _, f := range l.entries { - if laddr.Network() == f.laddr.Network() && laddr.String() == f.laddr.String() { - f.c <- forward{newCh: ch, raddr: raddr} - return true - } - } - return false -} - -type tcpListener struct { - laddr *net.TCPAddr - - conn *Client - in <-chan forward -} - -// Accept waits for and returns the next connection to the listener. -func (l *tcpListener) Accept() (net.Conn, error) { - s, ok := <-l.in - if !ok { - return nil, io.EOF - } - ch, incoming, err := s.newCh.Accept() - if err != nil { - return nil, err - } - go DiscardRequests(incoming) - - return &chanConn{ - Channel: ch, - laddr: l.laddr, - raddr: s.raddr, - }, nil -} - -// Close closes the listener. -func (l *tcpListener) Close() error { - m := channelForwardMsg{ - l.laddr.IP.String(), - uint32(l.laddr.Port), - } - - // this also closes the listener. - l.conn.forwards.remove(l.laddr) - ok, _, err := l.conn.SendRequest("cancel-tcpip-forward", true, Marshal(&m)) - if err == nil && !ok { - err = errors.New("ssh: cancel-tcpip-forward failed") - } - return err -} - -// Addr returns the listener's network address. -func (l *tcpListener) Addr() net.Addr { - return l.laddr -} - -// Dial initiates a connection to the addr from the remote host. -// The resulting connection has a zero LocalAddr() and RemoteAddr(). -func (c *Client) Dial(n, addr string) (net.Conn, error) { - var ch Channel - switch n { - case "tcp", "tcp4", "tcp6": - // Parse the address into host and numeric port. - host, portString, err := net.SplitHostPort(addr) - if err != nil { - return nil, err - } - port, err := strconv.ParseUint(portString, 10, 16) - if err != nil { - return nil, err - } - ch, err = c.dial(net.IPv4zero.String(), 0, host, int(port)) - if err != nil { - return nil, err - } - // Use a zero address for local and remote address. - zeroAddr := &net.TCPAddr{ - IP: net.IPv4zero, - Port: 0, - } - return &chanConn{ - Channel: ch, - laddr: zeroAddr, - raddr: zeroAddr, - }, nil - case "unix": - var err error - ch, err = c.dialStreamLocal(addr) - if err != nil { - return nil, err - } - return &chanConn{ - Channel: ch, - laddr: &net.UnixAddr{ - Name: "@", - Net: "unix", - }, - raddr: &net.UnixAddr{ - Name: addr, - Net: "unix", - }, - }, nil - default: - return nil, fmt.Errorf("ssh: unsupported protocol: %s", n) - } -} - -// DialTCP connects to the remote address raddr on the network net, -// which must be "tcp", "tcp4", or "tcp6". If laddr is not nil, it is used -// as the local address for the connection. -func (c *Client) DialTCP(n string, laddr, raddr *net.TCPAddr) (net.Conn, error) { - if laddr == nil { - laddr = &net.TCPAddr{ - IP: net.IPv4zero, - Port: 0, - } - } - ch, err := c.dial(laddr.IP.String(), laddr.Port, raddr.IP.String(), raddr.Port) - if err != nil { - return nil, err - } - return &chanConn{ - Channel: ch, - laddr: laddr, - raddr: raddr, - }, nil -} - -// RFC 4254 7.2 -type channelOpenDirectMsg struct { - raddr string - rport uint32 - laddr string - lport uint32 -} - -func (c *Client) dial(laddr string, lport int, raddr string, rport int) (Channel, error) { - msg := channelOpenDirectMsg{ - raddr: raddr, - rport: uint32(rport), - laddr: laddr, - lport: uint32(lport), - } - ch, in, err := c.OpenChannel("direct-tcpip", Marshal(&msg)) - if err != nil { - return nil, err - } - go DiscardRequests(in) - return ch, err -} - -type tcpChan struct { - Channel // the backing channel -} - -// chanConn fulfills the net.Conn interface without -// the tcpChan having to hold laddr or raddr directly. -type chanConn struct { - Channel - laddr, raddr net.Addr -} - -// LocalAddr returns the local network address. -func (t *chanConn) LocalAddr() net.Addr { - return t.laddr -} - -// RemoteAddr returns the remote network address. -func (t *chanConn) RemoteAddr() net.Addr { - return t.raddr -} - -// SetDeadline sets the read and write deadlines associated -// with the connection. -func (t *chanConn) SetDeadline(deadline time.Time) error { - if err := t.SetReadDeadline(deadline); err != nil { - return err - } - return t.SetWriteDeadline(deadline) -} - -// SetReadDeadline sets the read deadline. -// A zero value for t means Read will not time out. -// After the deadline, the error from Read will implement net.Error -// with Timeout() == true. -func (t *chanConn) SetReadDeadline(deadline time.Time) error { - // for compatibility with previous version, - // the error message contains "tcpChan" - return errors.New("ssh: tcpChan: deadline not supported") -} - -// SetWriteDeadline exists to satisfy the net.Conn interface -// but is not implemented by this type. It always returns an error. -func (t *chanConn) SetWriteDeadline(deadline time.Time) error { - return errors.New("ssh: tcpChan: deadline not supported") -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/terminal.go b/vendor/golang.org/x/crypto/ssh/terminal/terminal.go deleted file mode 100644 index 9a887598ff40..000000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/terminal.go +++ /dev/null @@ -1,951 +0,0 @@ -// 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 terminal - -import ( - "bytes" - "io" - "sync" - "unicode/utf8" -) - -// EscapeCodes contains escape sequences that can be written to the terminal in -// order to achieve different styles of text. -type EscapeCodes struct { - // Foreground colors - Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte - - // Reset all attributes - Reset []byte -} - -var vt100EscapeCodes = EscapeCodes{ - Black: []byte{keyEscape, '[', '3', '0', 'm'}, - Red: []byte{keyEscape, '[', '3', '1', 'm'}, - Green: []byte{keyEscape, '[', '3', '2', 'm'}, - Yellow: []byte{keyEscape, '[', '3', '3', 'm'}, - Blue: []byte{keyEscape, '[', '3', '4', 'm'}, - Magenta: []byte{keyEscape, '[', '3', '5', 'm'}, - Cyan: []byte{keyEscape, '[', '3', '6', 'm'}, - White: []byte{keyEscape, '[', '3', '7', 'm'}, - - Reset: []byte{keyEscape, '[', '0', 'm'}, -} - -// Terminal contains the state for running a VT100 terminal that is capable of -// reading lines of input. -type Terminal struct { - // AutoCompleteCallback, if non-null, is called for each keypress with - // the full input line and the current position of the cursor (in - // bytes, as an index into |line|). If it returns ok=false, the key - // press is processed normally. Otherwise it returns a replacement line - // and the new cursor position. - AutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool) - - // Escape contains a pointer to the escape codes for this terminal. - // It's always a valid pointer, although the escape codes themselves - // may be empty if the terminal doesn't support them. - Escape *EscapeCodes - - // lock protects the terminal and the state in this object from - // concurrent processing of a key press and a Write() call. - lock sync.Mutex - - c io.ReadWriter - prompt []rune - - // line is the current line being entered. - line []rune - // pos is the logical position of the cursor in line - pos int - // echo is true if local echo is enabled - echo bool - // pasteActive is true iff there is a bracketed paste operation in - // progress. - pasteActive bool - - // cursorX contains the current X value of the cursor where the left - // edge is 0. cursorY contains the row number where the first row of - // the current line is 0. - cursorX, cursorY int - // maxLine is the greatest value of cursorY so far. - maxLine int - - termWidth, termHeight int - - // outBuf contains the terminal data to be sent. - outBuf []byte - // remainder contains the remainder of any partial key sequences after - // a read. It aliases into inBuf. - remainder []byte - inBuf [256]byte - - // history contains previously entered commands so that they can be - // accessed with the up and down keys. - history stRingBuffer - // historyIndex stores the currently accessed history entry, where zero - // means the immediately previous entry. - historyIndex int - // When navigating up and down the history it's possible to return to - // the incomplete, initial line. That value is stored in - // historyPending. - historyPending string -} - -// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is -// a local terminal, that terminal must first have been put into raw mode. -// prompt is a string that is written at the start of each input line (i.e. -// "> "). -func NewTerminal(c io.ReadWriter, prompt string) *Terminal { - return &Terminal{ - Escape: &vt100EscapeCodes, - c: c, - prompt: []rune(prompt), - termWidth: 80, - termHeight: 24, - echo: true, - historyIndex: -1, - } -} - -const ( - keyCtrlD = 4 - keyCtrlU = 21 - keyEnter = '\r' - keyEscape = 27 - keyBackspace = 127 - keyUnknown = 0xd800 /* UTF-16 surrogate area */ + iota - keyUp - keyDown - keyLeft - keyRight - keyAltLeft - keyAltRight - keyHome - keyEnd - keyDeleteWord - keyDeleteLine - keyClearScreen - keyPasteStart - keyPasteEnd -) - -var ( - crlf = []byte{'\r', '\n'} - pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'} - pasteEnd = []byte{keyEscape, '[', '2', '0', '1', '~'} -) - -// bytesToKey tries to parse a key sequence from b. If successful, it returns -// the key and the remainder of the input. Otherwise it returns utf8.RuneError. -func bytesToKey(b []byte, pasteActive bool) (rune, []byte) { - if len(b) == 0 { - return utf8.RuneError, nil - } - - if !pasteActive { - switch b[0] { - case 1: // ^A - return keyHome, b[1:] - case 5: // ^E - return keyEnd, b[1:] - case 8: // ^H - return keyBackspace, b[1:] - case 11: // ^K - return keyDeleteLine, b[1:] - case 12: // ^L - return keyClearScreen, b[1:] - case 23: // ^W - return keyDeleteWord, b[1:] - } - } - - if b[0] != keyEscape { - if !utf8.FullRune(b) { - return utf8.RuneError, b - } - r, l := utf8.DecodeRune(b) - return r, b[l:] - } - - if !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' { - switch b[2] { - case 'A': - return keyUp, b[3:] - case 'B': - return keyDown, b[3:] - case 'C': - return keyRight, b[3:] - case 'D': - return keyLeft, b[3:] - case 'H': - return keyHome, b[3:] - case 'F': - return keyEnd, b[3:] - } - } - - if !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' { - switch b[5] { - case 'C': - return keyAltRight, b[6:] - case 'D': - return keyAltLeft, b[6:] - } - } - - if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) { - return keyPasteStart, b[6:] - } - - if pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) { - return keyPasteEnd, b[6:] - } - - // If we get here then we have a key that we don't recognise, or a - // partial sequence. It's not clear how one should find the end of a - // sequence without knowing them all, but it seems that [a-zA-Z~] only - // appears at the end of a sequence. - for i, c := range b[0:] { - if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' { - return keyUnknown, b[i+1:] - } - } - - return utf8.RuneError, b -} - -// queue appends data to the end of t.outBuf -func (t *Terminal) queue(data []rune) { - t.outBuf = append(t.outBuf, []byte(string(data))...) -} - -var eraseUnderCursor = []rune{' ', keyEscape, '[', 'D'} -var space = []rune{' '} - -func isPrintable(key rune) bool { - isInSurrogateArea := key >= 0xd800 && key <= 0xdbff - return key >= 32 && !isInSurrogateArea -} - -// moveCursorToPos appends data to t.outBuf which will move the cursor to the -// given, logical position in the text. -func (t *Terminal) moveCursorToPos(pos int) { - if !t.echo { - return - } - - x := visualLength(t.prompt) + pos - y := x / t.termWidth - x = x % t.termWidth - - up := 0 - if y < t.cursorY { - up = t.cursorY - y - } - - down := 0 - if y > t.cursorY { - down = y - t.cursorY - } - - left := 0 - if x < t.cursorX { - left = t.cursorX - x - } - - right := 0 - if x > t.cursorX { - right = x - t.cursorX - } - - t.cursorX = x - t.cursorY = y - t.move(up, down, left, right) -} - -func (t *Terminal) move(up, down, left, right int) { - movement := make([]rune, 3*(up+down+left+right)) - m := movement - for i := 0; i < up; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'A' - m = m[3:] - } - for i := 0; i < down; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'B' - m = m[3:] - } - for i := 0; i < left; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'D' - m = m[3:] - } - for i := 0; i < right; i++ { - m[0] = keyEscape - m[1] = '[' - m[2] = 'C' - m = m[3:] - } - - t.queue(movement) -} - -func (t *Terminal) clearLineToRight() { - op := []rune{keyEscape, '[', 'K'} - t.queue(op) -} - -const maxLineLength = 4096 - -func (t *Terminal) setLine(newLine []rune, newPos int) { - if t.echo { - t.moveCursorToPos(0) - t.writeLine(newLine) - for i := len(newLine); i < len(t.line); i++ { - t.writeLine(space) - } - t.moveCursorToPos(newPos) - } - t.line = newLine - t.pos = newPos -} - -func (t *Terminal) advanceCursor(places int) { - t.cursorX += places - t.cursorY += t.cursorX / t.termWidth - if t.cursorY > t.maxLine { - t.maxLine = t.cursorY - } - t.cursorX = t.cursorX % t.termWidth - - if places > 0 && t.cursorX == 0 { - // Normally terminals will advance the current position - // when writing a character. But that doesn't happen - // for the last character in a line. However, when - // writing a character (except a new line) that causes - // a line wrap, the position will be advanced two - // places. - // - // So, if we are stopping at the end of a line, we - // need to write a newline so that our cursor can be - // advanced to the next line. - t.outBuf = append(t.outBuf, '\r', '\n') - } -} - -func (t *Terminal) eraseNPreviousChars(n int) { - if n == 0 { - return - } - - if t.pos < n { - n = t.pos - } - t.pos -= n - t.moveCursorToPos(t.pos) - - copy(t.line[t.pos:], t.line[n+t.pos:]) - t.line = t.line[:len(t.line)-n] - if t.echo { - t.writeLine(t.line[t.pos:]) - for i := 0; i < n; i++ { - t.queue(space) - } - t.advanceCursor(n) - t.moveCursorToPos(t.pos) - } -} - -// countToLeftWord returns then number of characters from the cursor to the -// start of the previous word. -func (t *Terminal) countToLeftWord() int { - if t.pos == 0 { - return 0 - } - - pos := t.pos - 1 - for pos > 0 { - if t.line[pos] != ' ' { - break - } - pos-- - } - for pos > 0 { - if t.line[pos] == ' ' { - pos++ - break - } - pos-- - } - - return t.pos - pos -} - -// countToRightWord returns then number of characters from the cursor to the -// start of the next word. -func (t *Terminal) countToRightWord() int { - pos := t.pos - for pos < len(t.line) { - if t.line[pos] == ' ' { - break - } - pos++ - } - for pos < len(t.line) { - if t.line[pos] != ' ' { - break - } - pos++ - } - return pos - t.pos -} - -// visualLength returns the number of visible glyphs in s. -func visualLength(runes []rune) int { - inEscapeSeq := false - length := 0 - - for _, r := range runes { - switch { - case inEscapeSeq: - if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') { - inEscapeSeq = false - } - case r == '\x1b': - inEscapeSeq = true - default: - length++ - } - } - - return length -} - -// handleKey processes the given key and, optionally, returns a line of text -// that the user has entered. -func (t *Terminal) handleKey(key rune) (line string, ok bool) { - if t.pasteActive && key != keyEnter { - t.addKeyToLine(key) - return - } - - switch key { - case keyBackspace: - if t.pos == 0 { - return - } - t.eraseNPreviousChars(1) - case keyAltLeft: - // move left by a word. - t.pos -= t.countToLeftWord() - t.moveCursorToPos(t.pos) - case keyAltRight: - // move right by a word. - t.pos += t.countToRightWord() - t.moveCursorToPos(t.pos) - case keyLeft: - if t.pos == 0 { - return - } - t.pos-- - t.moveCursorToPos(t.pos) - case keyRight: - if t.pos == len(t.line) { - return - } - t.pos++ - t.moveCursorToPos(t.pos) - case keyHome: - if t.pos == 0 { - return - } - t.pos = 0 - t.moveCursorToPos(t.pos) - case keyEnd: - if t.pos == len(t.line) { - return - } - t.pos = len(t.line) - t.moveCursorToPos(t.pos) - case keyUp: - entry, ok := t.history.NthPreviousEntry(t.historyIndex + 1) - if !ok { - return "", false - } - if t.historyIndex == -1 { - t.historyPending = string(t.line) - } - t.historyIndex++ - runes := []rune(entry) - t.setLine(runes, len(runes)) - case keyDown: - switch t.historyIndex { - case -1: - return - case 0: - runes := []rune(t.historyPending) - t.setLine(runes, len(runes)) - t.historyIndex-- - default: - entry, ok := t.history.NthPreviousEntry(t.historyIndex - 1) - if ok { - t.historyIndex-- - runes := []rune(entry) - t.setLine(runes, len(runes)) - } - } - case keyEnter: - t.moveCursorToPos(len(t.line)) - t.queue([]rune("\r\n")) - line = string(t.line) - ok = true - t.line = t.line[:0] - t.pos = 0 - t.cursorX = 0 - t.cursorY = 0 - t.maxLine = 0 - case keyDeleteWord: - // Delete zero or more spaces and then one or more characters. - t.eraseNPreviousChars(t.countToLeftWord()) - case keyDeleteLine: - // Delete everything from the current cursor position to the - // end of line. - for i := t.pos; i < len(t.line); i++ { - t.queue(space) - t.advanceCursor(1) - } - t.line = t.line[:t.pos] - t.moveCursorToPos(t.pos) - case keyCtrlD: - // Erase the character under the current position. - // The EOF case when the line is empty is handled in - // readLine(). - if t.pos < len(t.line) { - t.pos++ - t.eraseNPreviousChars(1) - } - case keyCtrlU: - t.eraseNPreviousChars(t.pos) - case keyClearScreen: - // Erases the screen and moves the cursor to the home position. - t.queue([]rune("\x1b[2J\x1b[H")) - t.queue(t.prompt) - t.cursorX, t.cursorY = 0, 0 - t.advanceCursor(visualLength(t.prompt)) - t.setLine(t.line, t.pos) - default: - if t.AutoCompleteCallback != nil { - prefix := string(t.line[:t.pos]) - suffix := string(t.line[t.pos:]) - - t.lock.Unlock() - newLine, newPos, completeOk := t.AutoCompleteCallback(prefix+suffix, len(prefix), key) - t.lock.Lock() - - if completeOk { - t.setLine([]rune(newLine), utf8.RuneCount([]byte(newLine)[:newPos])) - return - } - } - if !isPrintable(key) { - return - } - if len(t.line) == maxLineLength { - return - } - t.addKeyToLine(key) - } - return -} - -// addKeyToLine inserts the given key at the current position in the current -// line. -func (t *Terminal) addKeyToLine(key rune) { - if len(t.line) == cap(t.line) { - newLine := make([]rune, len(t.line), 2*(1+len(t.line))) - copy(newLine, t.line) - t.line = newLine - } - t.line = t.line[:len(t.line)+1] - copy(t.line[t.pos+1:], t.line[t.pos:]) - t.line[t.pos] = key - if t.echo { - t.writeLine(t.line[t.pos:]) - } - t.pos++ - t.moveCursorToPos(t.pos) -} - -func (t *Terminal) writeLine(line []rune) { - for len(line) != 0 { - remainingOnLine := t.termWidth - t.cursorX - todo := len(line) - if todo > remainingOnLine { - todo = remainingOnLine - } - t.queue(line[:todo]) - t.advanceCursor(visualLength(line[:todo])) - line = line[todo:] - } -} - -// writeWithCRLF writes buf to w but replaces all occurrences of \n with \r\n. -func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) { - for len(buf) > 0 { - i := bytes.IndexByte(buf, '\n') - todo := len(buf) - if i >= 0 { - todo = i - } - - var nn int - nn, err = w.Write(buf[:todo]) - n += nn - if err != nil { - return n, err - } - buf = buf[todo:] - - if i >= 0 { - if _, err = w.Write(crlf); err != nil { - return n, err - } - n++ - buf = buf[1:] - } - } - - return n, nil -} - -func (t *Terminal) Write(buf []byte) (n int, err error) { - t.lock.Lock() - defer t.lock.Unlock() - - if t.cursorX == 0 && t.cursorY == 0 { - // This is the easy case: there's nothing on the screen that we - // have to move out of the way. - return writeWithCRLF(t.c, buf) - } - - // We have a prompt and possibly user input on the screen. We - // have to clear it first. - t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */) - t.cursorX = 0 - t.clearLineToRight() - - for t.cursorY > 0 { - t.move(1 /* up */, 0, 0, 0) - t.cursorY-- - t.clearLineToRight() - } - - if _, err = t.c.Write(t.outBuf); err != nil { - return - } - t.outBuf = t.outBuf[:0] - - if n, err = writeWithCRLF(t.c, buf); err != nil { - return - } - - t.writeLine(t.prompt) - if t.echo { - t.writeLine(t.line) - } - - t.moveCursorToPos(t.pos) - - if _, err = t.c.Write(t.outBuf); err != nil { - return - } - t.outBuf = t.outBuf[:0] - return -} - -// ReadPassword temporarily changes the prompt and reads a password, without -// echo, from the terminal. -func (t *Terminal) ReadPassword(prompt string) (line string, err error) { - t.lock.Lock() - defer t.lock.Unlock() - - oldPrompt := t.prompt - t.prompt = []rune(prompt) - t.echo = false - - line, err = t.readLine() - - t.prompt = oldPrompt - t.echo = true - - return -} - -// ReadLine returns a line of input from the terminal. -func (t *Terminal) ReadLine() (line string, err error) { - t.lock.Lock() - defer t.lock.Unlock() - - return t.readLine() -} - -func (t *Terminal) readLine() (line string, err error) { - // t.lock must be held at this point - - if t.cursorX == 0 && t.cursorY == 0 { - t.writeLine(t.prompt) - t.c.Write(t.outBuf) - t.outBuf = t.outBuf[:0] - } - - lineIsPasted := t.pasteActive - - for { - rest := t.remainder - lineOk := false - for !lineOk { - var key rune - key, rest = bytesToKey(rest, t.pasteActive) - if key == utf8.RuneError { - break - } - if !t.pasteActive { - if key == keyCtrlD { - if len(t.line) == 0 { - return "", io.EOF - } - } - if key == keyPasteStart { - t.pasteActive = true - if len(t.line) == 0 { - lineIsPasted = true - } - continue - } - } else if key == keyPasteEnd { - t.pasteActive = false - continue - } - if !t.pasteActive { - lineIsPasted = false - } - line, lineOk = t.handleKey(key) - } - if len(rest) > 0 { - n := copy(t.inBuf[:], rest) - t.remainder = t.inBuf[:n] - } else { - t.remainder = nil - } - t.c.Write(t.outBuf) - t.outBuf = t.outBuf[:0] - if lineOk { - if t.echo { - t.historyIndex = -1 - t.history.Add(line) - } - if lineIsPasted { - err = ErrPasteIndicator - } - return - } - - // t.remainder is a slice at the beginning of t.inBuf - // containing a partial key sequence - readBuf := t.inBuf[len(t.remainder):] - var n int - - t.lock.Unlock() - n, err = t.c.Read(readBuf) - t.lock.Lock() - - if err != nil { - return - } - - t.remainder = t.inBuf[:n+len(t.remainder)] - } -} - -// SetPrompt sets the prompt to be used when reading subsequent lines. -func (t *Terminal) SetPrompt(prompt string) { - t.lock.Lock() - defer t.lock.Unlock() - - t.prompt = []rune(prompt) -} - -func (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) { - // Move cursor to column zero at the start of the line. - t.move(t.cursorY, 0, t.cursorX, 0) - t.cursorX, t.cursorY = 0, 0 - t.clearLineToRight() - for t.cursorY < numPrevLines { - // Move down a line - t.move(0, 1, 0, 0) - t.cursorY++ - t.clearLineToRight() - } - // Move back to beginning. - t.move(t.cursorY, 0, 0, 0) - t.cursorX, t.cursorY = 0, 0 - - t.queue(t.prompt) - t.advanceCursor(visualLength(t.prompt)) - t.writeLine(t.line) - t.moveCursorToPos(t.pos) -} - -func (t *Terminal) SetSize(width, height int) error { - t.lock.Lock() - defer t.lock.Unlock() - - if width == 0 { - width = 1 - } - - oldWidth := t.termWidth - t.termWidth, t.termHeight = width, height - - switch { - case width == oldWidth: - // If the width didn't change then nothing else needs to be - // done. - return nil - case len(t.line) == 0 && t.cursorX == 0 && t.cursorY == 0: - // If there is nothing on current line and no prompt printed, - // just do nothing - return nil - case width < oldWidth: - // Some terminals (e.g. xterm) will truncate lines that were - // too long when shinking. Others, (e.g. gnome-terminal) will - // attempt to wrap them. For the former, repainting t.maxLine - // works great, but that behaviour goes badly wrong in the case - // of the latter because they have doubled every full line. - - // We assume that we are working on a terminal that wraps lines - // and adjust the cursor position based on every previous line - // wrapping and turning into two. This causes the prompt on - // xterms to move upwards, which isn't great, but it avoids a - // huge mess with gnome-terminal. - if t.cursorX >= t.termWidth { - t.cursorX = t.termWidth - 1 - } - t.cursorY *= 2 - t.clearAndRepaintLinePlusNPrevious(t.maxLine * 2) - case width > oldWidth: - // If the terminal expands then our position calculations will - // be wrong in the future because we think the cursor is - // |t.pos| chars into the string, but there will be a gap at - // the end of any wrapped line. - // - // But the position will actually be correct until we move, so - // we can move back to the beginning and repaint everything. - t.clearAndRepaintLinePlusNPrevious(t.maxLine) - } - - _, err := t.c.Write(t.outBuf) - t.outBuf = t.outBuf[:0] - return err -} - -type pasteIndicatorError struct{} - -func (pasteIndicatorError) Error() string { - return "terminal: ErrPasteIndicator not correctly handled" -} - -// ErrPasteIndicator may be returned from ReadLine as the error, in addition -// to valid line data. It indicates that bracketed paste mode is enabled and -// that the returned line consists only of pasted data. Programs may wish to -// interpret pasted data more literally than typed data. -var ErrPasteIndicator = pasteIndicatorError{} - -// SetBracketedPasteMode requests that the terminal bracket paste operations -// with markers. Not all terminals support this but, if it is supported, then -// enabling this mode will stop any autocomplete callback from running due to -// pastes. Additionally, any lines that are completely pasted will be returned -// from ReadLine with the error set to ErrPasteIndicator. -func (t *Terminal) SetBracketedPasteMode(on bool) { - if on { - io.WriteString(t.c, "\x1b[?2004h") - } else { - io.WriteString(t.c, "\x1b[?2004l") - } -} - -// stRingBuffer is a ring buffer of strings. -type stRingBuffer struct { - // entries contains max elements. - entries []string - max int - // head contains the index of the element most recently added to the ring. - head int - // size contains the number of elements in the ring. - size int -} - -func (s *stRingBuffer) Add(a string) { - if s.entries == nil { - const defaultNumEntries = 100 - s.entries = make([]string, defaultNumEntries) - s.max = defaultNumEntries - } - - s.head = (s.head + 1) % s.max - s.entries[s.head] = a - if s.size < s.max { - s.size++ - } -} - -// NthPreviousEntry returns the value passed to the nth previous call to Add. -// If n is zero then the immediately prior value is returned, if one, then the -// next most recent, and so on. If such an element doesn't exist then ok is -// false. -func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) { - if n >= s.size { - return "", false - } - index := s.head - n - if index < 0 { - index += s.max - } - return s.entries[index], true -} - -// readPasswordLine reads from reader until it finds \n or io.EOF. -// The slice returned does not include the \n. -// readPasswordLine also ignores any \r it finds. -func readPasswordLine(reader io.Reader) ([]byte, error) { - var buf [1]byte - var ret []byte - - for { - n, err := reader.Read(buf[:]) - if n > 0 { - switch buf[0] { - case '\n': - return ret, nil - case '\r': - // remove \r from passwords on Windows - default: - ret = append(ret, buf[0]) - } - continue - } - if err != nil { - if err == io.EOF && len(ret) > 0 { - return ret, nil - } - return ret, err - } - } -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util.go b/vendor/golang.org/x/crypto/ssh/terminal/util.go deleted file mode 100644 index 391104084097..000000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util.go +++ /dev/null @@ -1,114 +0,0 @@ -// 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. - -// +build aix darwin dragonfly freebsd linux,!appengine netbsd openbsd - -// Package terminal provides support functions for dealing with terminals, as -// commonly found on UNIX systems. -// -// Putting a terminal into raw mode is the most common requirement: -// -// oldState, err := terminal.MakeRaw(0) -// if err != nil { -// panic(err) -// } -// defer terminal.Restore(0, oldState) -package terminal // import "golang.org/x/crypto/ssh/terminal" - -import ( - "golang.org/x/sys/unix" -) - -// State contains the state of a terminal. -type State struct { - termios unix.Termios -} - -// IsTerminal returns whether the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - _, 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) { - termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) - if err != nil { - return nil, err - } - - oldState := State{termios: *termios} - - // This attempts to replicate the behaviour documented for cfmakeraw in - // the termios(3) manpage. - 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 - } - - return &oldState, nil -} - -// 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) { - termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) - if err != nil { - return nil, err - } - - 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 { - return unix.IoctlSetTermios(fd, ioctlWriteTermios, &state.termios) -} - -// GetSize returns the dimensions of the given terminal. -func GetSize(fd int) (width, height int, err error) { - ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) - if err != nil { - return -1, -1, err - } - 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 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) { - termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios) - if err != nil { - return nil, err - } - - 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 unix.IoctlSetTermios(fd, ioctlWriteTermios, termios) - - return readPasswordLine(passwordReader(fd)) -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go b/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go deleted file mode 100644 index dfcd62785926..000000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_aix.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2018 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 aix - -package terminal - -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_bsd.go b/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go deleted file mode 100644 index cb23a5904940..000000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2013 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 netbsd openbsd - -package terminal - -import "golang.org/x/sys/unix" - -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 deleted file mode 100644 index 5fadfe8a1d50..000000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2013 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 terminal - -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_plan9.go b/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go deleted file mode 100644 index 9317ac7ede64..000000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go +++ /dev/null @@ -1,58 +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. - -// Package terminal provides support functions for dealing with terminals, as -// commonly found on UNIX systems. -// -// Putting a terminal into raw mode is the most common requirement: -// -// oldState, err := terminal.MakeRaw(0) -// if err != nil { -// panic(err) -// } -// defer terminal.Restore(0, oldState) -package terminal - -import ( - "fmt" - "runtime" -) - -type State struct{} - -// IsTerminal returns whether the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - return false -} - -// 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) { - return nil, fmt.Errorf("terminal: MakeRaw not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// 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) { - return nil, fmt.Errorf("terminal: GetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, state *State) error { - return fmt.Errorf("terminal: Restore not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// GetSize returns the dimensions of the given terminal. -func GetSize(fd int) (width, height int, err error) { - return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} - -// 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) { - return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go b/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go deleted file mode 100644 index 3d5f06a9f049..000000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go +++ /dev/null @@ -1,124 +0,0 @@ -// 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. - -// +build solaris - -package terminal // import "golang.org/x/crypto/ssh/terminal" - -import ( - "golang.org/x/sys/unix" - "io" - "syscall" -) - -// State contains the state of a terminal. -type State struct { - termios unix.Termios -} - -// IsTerminal returns whether the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - _, err := unix.IoctlGetTermio(fd, unix.TCGETA) - return err == nil -} - -// 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) { - // see also: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c - val, err := unix.IoctlGetTermios(fd, unix.TCGETS) - if err != nil { - return nil, err - } - oldState := *val - - newState := oldState - newState.Lflag &^= syscall.ECHO - newState.Lflag |= syscall.ICANON | syscall.ISIG - newState.Iflag |= syscall.ICRNL - err = unix.IoctlSetTermios(fd, unix.TCSETS, &newState) - if err != nil { - return nil, err - } - - defer unix.IoctlSetTermios(fd, unix.TCSETS, &oldState) - - var buf [16]byte - var ret []byte - for { - n, err := syscall.Read(fd, buf[:]) - if err != nil { - return nil, err - } - if n == 0 { - if len(ret) == 0 { - return nil, io.EOF - } - break - } - if buf[n-1] == '\n' { - n-- - } - ret = append(ret, buf[:n]...) - if n < len(buf) { - break - } - } - - return ret, nil -} - -// MakeRaw puts 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. -// see http://cr.illumos.org/~webrev/andy_js/1060/ -func MakeRaw(fd int) (*State, error) { - termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) - if err != nil { - return nil, err - } - - oldState := State{termios: *termios} - - 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, unix.TCSETS, termios); err != nil { - return nil, err - } - - return &oldState, nil -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, oldState *State) error { - return unix.IoctlSetTermios(fd, unix.TCSETS, &oldState.termios) -} - -// 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) { - termios, err := unix.IoctlGetTermios(fd, unix.TCGETS) - if err != nil { - return nil, err - } - - return &State{termios: *termios}, nil -} - -// GetSize returns the dimensions of the given terminal. -func GetSize(fd int) (width, height int, err error) { - ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ) - if err != nil { - return 0, 0, err - } - return int(ws.Col), int(ws.Row), nil -} diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go b/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go deleted file mode 100644 index 6cb8a95038c9..000000000000 --- a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go +++ /dev/null @@ -1,103 +0,0 @@ -// 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. - -// +build windows - -// Package terminal provides support functions for dealing with terminals, as -// commonly found on UNIX systems. -// -// Putting a terminal into raw mode is the most common requirement: -// -// oldState, err := terminal.MakeRaw(0) -// if err != nil { -// panic(err) -// } -// defer terminal.Restore(0, oldState) -package terminal - -import ( - "os" - - "golang.org/x/sys/windows" -) - -type State struct { - mode uint32 -} - -// IsTerminal returns whether the given file descriptor is a terminal. -func IsTerminal(fd int) bool { - var st uint32 - err := windows.GetConsoleMode(windows.Handle(fd), &st) - 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 st uint32 - if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { - return nil, err - } - 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 -} - -// 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 st uint32 - if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { - return nil, err - } - return &State{st}, nil -} - -// Restore restores the terminal connected to the given file descriptor to a -// previous state. -func Restore(fd int, state *State) error { - 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 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 -} - -// 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 st uint32 - if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil { - return nil, err - } - old := st - - 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 windows.SetConsoleMode(windows.Handle(fd), old) - - var h windows.Handle - p, _ := windows.GetCurrentProcess() - if err := windows.DuplicateHandle(p, windows.Handle(fd), p, &h, 0, false, windows.DUPLICATE_SAME_ACCESS); err != nil { - return nil, err - } - - f := os.NewFile(uintptr(h), "stdin") - defer f.Close() - return readPasswordLine(f) -} diff --git a/vendor/golang.org/x/crypto/ssh/transport.go b/vendor/golang.org/x/crypto/ssh/transport.go deleted file mode 100644 index f6fae1db4604..000000000000 --- a/vendor/golang.org/x/crypto/ssh/transport.go +++ /dev/null @@ -1,353 +0,0 @@ -// 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 ssh - -import ( - "bufio" - "bytes" - "errors" - "io" - "log" -) - -// debugTransport if set, will print packet types as they go over the -// wire. No message decoding is done, to minimize the impact on timing. -const debugTransport = false - -const ( - gcmCipherID = "aes128-gcm@openssh.com" - aes128cbcID = "aes128-cbc" - tripledescbcID = "3des-cbc" -) - -// packetConn represents a transport that implements packet based -// operations. -type packetConn interface { - // Encrypt and send a packet of data to the remote peer. - writePacket(packet []byte) error - - // Read a packet from the connection. The read is blocking, - // i.e. if error is nil, then the returned byte slice is - // always non-empty. - readPacket() ([]byte, error) - - // Close closes the write-side of the connection. - Close() error -} - -// transport is the keyingTransport that implements the SSH packet -// protocol. -type transport struct { - reader connectionState - writer connectionState - - bufReader *bufio.Reader - bufWriter *bufio.Writer - rand io.Reader - isClient bool - io.Closer -} - -// packetCipher represents a combination of SSH encryption/MAC -// protocol. A single instance should be used for one direction only. -type packetCipher interface { - // writePacket encrypts the packet and writes it to w. The - // contents of the packet are generally scrambled. - writePacket(seqnum uint32, w io.Writer, rand io.Reader, packet []byte) error - - // readPacket reads and decrypts a packet of data. The - // returned packet may be overwritten by future calls of - // readPacket. - readPacket(seqnum uint32, r io.Reader) ([]byte, error) -} - -// connectionState represents one side (read or write) of the -// connection. This is necessary because each direction has its own -// keys, and can even have its own algorithms -type connectionState struct { - packetCipher - seqNum uint32 - dir direction - pendingKeyChange chan packetCipher -} - -// prepareKeyChange sets up key material for a keychange. The key changes in -// both directions are triggered by reading and writing a msgNewKey packet -// respectively. -func (t *transport) prepareKeyChange(algs *algorithms, kexResult *kexResult) error { - ciph, err := newPacketCipher(t.reader.dir, algs.r, kexResult) - if err != nil { - return err - } - t.reader.pendingKeyChange <- ciph - - ciph, err = newPacketCipher(t.writer.dir, algs.w, kexResult) - if err != nil { - return err - } - t.writer.pendingKeyChange <- ciph - - return nil -} - -func (t *transport) printPacket(p []byte, write bool) { - if len(p) == 0 { - return - } - who := "server" - if t.isClient { - who = "client" - } - what := "read" - if write { - what = "write" - } - - log.Println(what, who, p[0]) -} - -// Read and decrypt next packet. -func (t *transport) readPacket() (p []byte, err error) { - for { - p, err = t.reader.readPacket(t.bufReader) - if err != nil { - break - } - if len(p) == 0 || (p[0] != msgIgnore && p[0] != msgDebug) { - break - } - } - if debugTransport { - t.printPacket(p, false) - } - - return p, err -} - -func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) { - packet, err := s.packetCipher.readPacket(s.seqNum, r) - s.seqNum++ - if err == nil && len(packet) == 0 { - err = errors.New("ssh: zero length packet") - } - - if len(packet) > 0 { - switch packet[0] { - case msgNewKeys: - select { - case cipher := <-s.pendingKeyChange: - s.packetCipher = cipher - default: - return nil, errors.New("ssh: got bogus newkeys message") - } - - case msgDisconnect: - // Transform a disconnect message into an - // error. Since this is lowest level at which - // we interpret message types, doing it here - // ensures that we don't have to handle it - // elsewhere. - var msg disconnectMsg - if err := Unmarshal(packet, &msg); err != nil { - return nil, err - } - return nil, &msg - } - } - - // The packet may point to an internal buffer, so copy the - // packet out here. - fresh := make([]byte, len(packet)) - copy(fresh, packet) - - return fresh, err -} - -func (t *transport) writePacket(packet []byte) error { - if debugTransport { - t.printPacket(packet, true) - } - return t.writer.writePacket(t.bufWriter, t.rand, packet) -} - -func (s *connectionState) writePacket(w *bufio.Writer, rand io.Reader, packet []byte) error { - changeKeys := len(packet) > 0 && packet[0] == msgNewKeys - - err := s.packetCipher.writePacket(s.seqNum, w, rand, packet) - if err != nil { - return err - } - if err = w.Flush(); err != nil { - return err - } - s.seqNum++ - if changeKeys { - select { - case cipher := <-s.pendingKeyChange: - s.packetCipher = cipher - default: - panic("ssh: no key material for msgNewKeys") - } - } - return err -} - -func newTransport(rwc io.ReadWriteCloser, rand io.Reader, isClient bool) *transport { - t := &transport{ - bufReader: bufio.NewReader(rwc), - bufWriter: bufio.NewWriter(rwc), - rand: rand, - reader: connectionState{ - packetCipher: &streamPacketCipher{cipher: noneCipher{}}, - pendingKeyChange: make(chan packetCipher, 1), - }, - writer: connectionState{ - packetCipher: &streamPacketCipher{cipher: noneCipher{}}, - pendingKeyChange: make(chan packetCipher, 1), - }, - Closer: rwc, - } - t.isClient = isClient - - if isClient { - t.reader.dir = serverKeys - t.writer.dir = clientKeys - } else { - t.reader.dir = clientKeys - t.writer.dir = serverKeys - } - - return t -} - -type direction struct { - ivTag []byte - keyTag []byte - macKeyTag []byte -} - -var ( - serverKeys = direction{[]byte{'B'}, []byte{'D'}, []byte{'F'}} - clientKeys = direction{[]byte{'A'}, []byte{'C'}, []byte{'E'}} -) - -// setupKeys sets the cipher and MAC keys from kex.K, kex.H and sessionId, as -// described in RFC 4253, section 6.4. direction should either be serverKeys -// (to setup server->client keys) or clientKeys (for client->server keys). -func newPacketCipher(d direction, algs directionAlgorithms, kex *kexResult) (packetCipher, error) { - cipherMode := cipherModes[algs.Cipher] - macMode := macModes[algs.MAC] - - iv := make([]byte, cipherMode.ivSize) - key := make([]byte, cipherMode.keySize) - macKey := make([]byte, macMode.keySize) - - generateKeyMaterial(iv, d.ivTag, kex) - generateKeyMaterial(key, d.keyTag, kex) - generateKeyMaterial(macKey, d.macKeyTag, kex) - - return cipherModes[algs.Cipher].create(key, iv, macKey, algs) -} - -// generateKeyMaterial fills out with key material generated from tag, K, H -// and sessionId, as specified in RFC 4253, section 7.2. -func generateKeyMaterial(out, tag []byte, r *kexResult) { - var digestsSoFar []byte - - h := r.Hash.New() - for len(out) > 0 { - h.Reset() - h.Write(r.K) - h.Write(r.H) - - if len(digestsSoFar) == 0 { - h.Write(tag) - h.Write(r.SessionID) - } else { - h.Write(digestsSoFar) - } - - digest := h.Sum(nil) - n := copy(out, digest) - out = out[n:] - if len(out) > 0 { - digestsSoFar = append(digestsSoFar, digest...) - } - } -} - -const packageVersion = "SSH-2.0-Go" - -// Sends and receives a version line. The versionLine string should -// be US ASCII, start with "SSH-2.0-", and should not include a -// newline. exchangeVersions returns the other side's version line. -func exchangeVersions(rw io.ReadWriter, versionLine []byte) (them []byte, err error) { - // Contrary to the RFC, we do not ignore lines that don't - // start with "SSH-2.0-" to make the library usable with - // nonconforming servers. - for _, c := range versionLine { - // The spec disallows non US-ASCII chars, and - // specifically forbids null chars. - if c < 32 { - return nil, errors.New("ssh: junk character in version line") - } - } - if _, err = rw.Write(append(versionLine, '\r', '\n')); err != nil { - return - } - - them, err = readVersion(rw) - return them, err -} - -// maxVersionStringBytes is the maximum number of bytes that we'll -// accept as a version string. RFC 4253 section 4.2 limits this at 255 -// chars -const maxVersionStringBytes = 255 - -// Read version string as specified by RFC 4253, section 4.2. -func readVersion(r io.Reader) ([]byte, error) { - versionString := make([]byte, 0, 64) - var ok bool - var buf [1]byte - - for length := 0; length < maxVersionStringBytes; length++ { - _, err := io.ReadFull(r, buf[:]) - if err != nil { - return nil, err - } - // The RFC says that the version should be terminated with \r\n - // but several SSH servers actually only send a \n. - if buf[0] == '\n' { - if !bytes.HasPrefix(versionString, []byte("SSH-")) { - // RFC 4253 says we need to ignore all version string lines - // except the one containing the SSH version (provided that - // all the lines do not exceed 255 bytes in total). - versionString = versionString[:0] - continue - } - ok = true - break - } - - // non ASCII chars are disallowed, but we are lenient, - // since Go doesn't use null-terminated strings. - - // The RFC allows a comment after a space, however, - // all of it (version and comments) goes into the - // session hash. - versionString = append(versionString, buf[0]) - } - - if !ok { - return nil, errors.New("ssh: overflow reading version string") - } - - // There might be a '\r' on the end which we should remove. - if len(versionString) > 0 && versionString[len(versionString)-1] == '\r' { - versionString = versionString[:len(versionString)-1] - } - return versionString, nil -} diff --git a/vendor/golang.org/x/net/.gitattributes b/vendor/golang.org/x/net/.gitattributes deleted file mode 100644 index d2f212e5da80..000000000000 --- a/vendor/golang.org/x/net/.gitattributes +++ /dev/null @@ -1,10 +0,0 @@ -# Treat all files in this repo as binary, with no git magic updating -# line endings. Windows users contributing to Go will need to use a -# modern version of git and editors capable of LF line endings. -# -# We'll prevent accidental CRLF line endings from entering the repo -# via the git-review gofmt checks. -# -# See golang.org/issue/9281 - -* -text diff --git a/vendor/golang.org/x/net/.gitignore b/vendor/golang.org/x/net/.gitignore deleted file mode 100644 index 8339fd61d3f4..000000000000 --- a/vendor/golang.org/x/net/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Add no patterns to .hgignore except for files generated by the build. -last-change diff --git a/vendor/golang.org/x/net/AUTHORS b/vendor/golang.org/x/net/AUTHORS deleted file mode 100644 index 15167cd746c5..000000000000 --- a/vendor/golang.org/x/net/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/net/CONTRIBUTING.md b/vendor/golang.org/x/net/CONTRIBUTING.md deleted file mode 100644 index 88dff59bc7d2..000000000000 --- a/vendor/golang.org/x/net/CONTRIBUTING.md +++ /dev/null @@ -1,31 +0,0 @@ -# Contributing to Go - -Go is an open source project. - -It is the work of hundreds of contributors. We appreciate your help! - - -## Filing issues - -When [filing an issue](https://golang.org/issue/new), make sure to answer these five questions: - -1. What version of Go are you using (`go version`)? -2. What operating system and processor architecture are you using? -3. What did you do? -4. What did you expect to see? -5. What did you see instead? - -General questions should go to the [golang-nuts mailing list](https://groups.google.com/group/golang-nuts) instead of the issue tracker. -The gophers there will answer or ask you to file an issue if you've tripped over a bug. - -## Contributing code - -Please read the [Contribution Guidelines](https://golang.org/doc/contribute.html) -before sending patches. - -**We do not accept GitHub pull requests** -(we use [Gerrit](https://code.google.com/p/gerrit/) instead for code review). - -Unless otherwise noted, the Go source files are distributed under -the BSD-style license found in the LICENSE file. - diff --git a/vendor/golang.org/x/net/CONTRIBUTORS b/vendor/golang.org/x/net/CONTRIBUTORS deleted file mode 100644 index 1c4577e96806..000000000000 --- a/vendor/golang.org/x/net/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/net/LICENSE b/vendor/golang.org/x/net/LICENSE deleted file mode 100644 index 6a66aea5eafe..000000000000 --- a/vendor/golang.org/x/net/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 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. diff --git a/vendor/golang.org/x/net/PATENTS b/vendor/golang.org/x/net/PATENTS deleted file mode 100644 index 733099041f84..000000000000 --- a/vendor/golang.org/x/net/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the Go project. - -Google 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, -transfer and otherwise run, modify and propagate the contents of this -implementation of Go, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of Go. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of Go or any code incorporated within this -implementation of Go constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of Go -shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/net/README b/vendor/golang.org/x/net/README deleted file mode 100644 index 6b13d8e50502..000000000000 --- a/vendor/golang.org/x/net/README +++ /dev/null @@ -1,3 +0,0 @@ -This repository holds supplementary Go networking libraries. - -To submit changes to this repository, see http://golang.org/doc/contribute.html. diff --git a/vendor/golang.org/x/net/codereview.cfg b/vendor/golang.org/x/net/codereview.cfg deleted file mode 100644 index 3f8b14b64e83..000000000000 --- a/vendor/golang.org/x/net/codereview.cfg +++ /dev/null @@ -1 +0,0 @@ -issuerepo: golang/go diff --git a/vendor/golang.org/x/net/context/context.go b/vendor/golang.org/x/net/context/context.go deleted file mode 100644 index f143ed6a1eb0..000000000000 --- a/vendor/golang.org/x/net/context/context.go +++ /dev/null @@ -1,156 +0,0 @@ -// 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. - -// Package context defines the Context type, which carries deadlines, -// cancelation signals, and other request-scoped values across API boundaries -// and between processes. -// -// Incoming requests to a server should create a Context, and outgoing calls to -// servers should accept a Context. The chain of function calls between must -// propagate the Context, optionally replacing it with a modified copy created -// using WithDeadline, WithTimeout, WithCancel, or WithValue. -// -// Programs that use Contexts should follow these rules to keep interfaces -// consistent across packages and enable static analysis tools to check context -// propagation: -// -// Do not store Contexts inside a struct type; instead, pass a Context -// explicitly to each function that needs it. The Context should be the first -// parameter, typically named ctx: -// -// func DoSomething(ctx context.Context, arg Arg) error { -// // ... use ctx ... -// } -// -// Do not pass a nil Context, even if a function permits it. Pass context.TODO -// if you are unsure about which Context to use. -// -// Use context Values only for request-scoped data that transits processes and -// APIs, not for passing optional parameters to functions. -// -// The same Context may be passed to functions running in different goroutines; -// Contexts are safe for simultaneous use by multiple goroutines. -// -// See http://blog.golang.org/context for example code for a server that uses -// Contexts. -package context // import "golang.org/x/net/context" - -import "time" - -// A Context carries a deadline, a cancelation signal, and other values across -// API boundaries. -// -// Context's methods may be called by multiple goroutines simultaneously. -type Context interface { - // Deadline returns the time when work done on behalf of this context - // should be canceled. Deadline returns ok==false when no deadline is - // set. Successive calls to Deadline return the same results. - Deadline() (deadline time.Time, ok bool) - - // Done returns a channel that's closed when work done on behalf of this - // context should be canceled. Done may return nil if this context can - // never be canceled. Successive calls to Done return the same value. - // - // WithCancel arranges for Done to be closed when cancel is called; - // WithDeadline arranges for Done to be closed when the deadline - // expires; WithTimeout arranges for Done to be closed when the timeout - // elapses. - // - // Done is provided for use in select statements: - // - // // Stream generates values with DoSomething and sends them to out - // // until DoSomething returns an error or ctx.Done is closed. - // func Stream(ctx context.Context, out chan<- Value) error { - // for { - // v, err := DoSomething(ctx) - // if err != nil { - // return err - // } - // select { - // case <-ctx.Done(): - // return ctx.Err() - // case out <- v: - // } - // } - // } - // - // See http://blog.golang.org/pipelines for more examples of how to use - // a Done channel for cancelation. - Done() <-chan struct{} - - // Err returns a non-nil error value after Done is closed. Err returns - // Canceled if the context was canceled or DeadlineExceeded if the - // context's deadline passed. No other values for Err are defined. - // After Done is closed, successive calls to Err return the same value. - Err() error - - // Value returns the value associated with this context for key, or nil - // if no value is associated with key. Successive calls to Value with - // the same key returns the same result. - // - // Use context values only for request-scoped data that transits - // processes and API boundaries, not for passing optional parameters to - // functions. - // - // A key identifies a specific value in a Context. Functions that wish - // to store values in Context typically allocate a key in a global - // variable then use that key as the argument to context.WithValue and - // Context.Value. A key can be any type that supports equality; - // packages should define keys as an unexported type to avoid - // collisions. - // - // Packages that define a Context key should provide type-safe accessors - // for the values stores using that key: - // - // // Package user defines a User type that's stored in Contexts. - // package user - // - // import "golang.org/x/net/context" - // - // // User is the type of value stored in the Contexts. - // type User struct {...} - // - // // key is an unexported type for keys defined in this package. - // // This prevents collisions with keys defined in other packages. - // type key int - // - // // userKey is the key for user.User values in Contexts. It is - // // unexported; clients use user.NewContext and user.FromContext - // // instead of using this key directly. - // var userKey key = 0 - // - // // NewContext returns a new Context that carries value u. - // func NewContext(ctx context.Context, u *User) context.Context { - // return context.WithValue(ctx, userKey, u) - // } - // - // // FromContext returns the User value stored in ctx, if any. - // func FromContext(ctx context.Context) (*User, bool) { - // u, ok := ctx.Value(userKey).(*User) - // return u, ok - // } - Value(key interface{}) interface{} -} - -// Background returns a non-nil, empty Context. It is never canceled, has no -// values, and has no deadline. It is typically used by the main function, -// initialization, and tests, and as the top-level Context for incoming -// requests. -func Background() Context { - return background -} - -// TODO returns a non-nil, empty Context. Code should use context.TODO when -// it's unclear which Context to use or it is not yet available (because the -// surrounding function has not yet been extended to accept a Context -// parameter). TODO is recognized by static analysis tools that determine -// whether Contexts are propagated correctly in a program. -func TODO() Context { - return todo -} - -// A CancelFunc tells an operation to abandon its work. -// A CancelFunc does not wait for the work to stop. -// After the first call, subsequent calls to a CancelFunc do nothing. -type CancelFunc func() diff --git a/vendor/golang.org/x/net/context/go17.go b/vendor/golang.org/x/net/context/go17.go deleted file mode 100644 index d20f52b7de93..000000000000 --- a/vendor/golang.org/x/net/context/go17.go +++ /dev/null @@ -1,72 +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 go1.7 - -package context - -import ( - "context" // standard library's context, as of Go 1.7 - "time" -) - -var ( - todo = context.TODO() - background = context.Background() -) - -// Canceled is the error returned by Context.Err when the context is canceled. -var Canceled = context.Canceled - -// DeadlineExceeded is the error returned by Context.Err when the context's -// deadline passes. -var DeadlineExceeded = context.DeadlineExceeded - -// WithCancel returns a copy of parent with a new Done channel. The returned -// context's Done channel is closed when the returned cancel function is called -// or when the parent context's Done channel is closed, whichever happens first. -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete. -func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { - ctx, f := context.WithCancel(parent) - return ctx, CancelFunc(f) -} - -// WithDeadline returns a copy of the parent context with the deadline adjusted -// to be no later than d. If the parent's deadline is already earlier than d, -// WithDeadline(parent, d) is semantically equivalent to parent. The returned -// context's Done channel is closed when the deadline expires, when the returned -// cancel function is called, or when the parent context's Done channel is -// closed, whichever happens first. -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete. -func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { - ctx, f := context.WithDeadline(parent, deadline) - return ctx, CancelFunc(f) -} - -// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete: -// -// func slowOperationWithTimeout(ctx context.Context) (Result, error) { -// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) -// defer cancel() // releases resources if slowOperation completes before timeout elapses -// return slowOperation(ctx) -// } -func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { - return WithDeadline(parent, time.Now().Add(timeout)) -} - -// WithValue returns a copy of parent in which the value associated with key is -// val. -// -// Use context Values only for request-scoped data that transits processes and -// APIs, not for passing optional parameters to functions. -func WithValue(parent Context, key interface{}, val interface{}) Context { - return context.WithValue(parent, key, val) -} diff --git a/vendor/golang.org/x/net/context/pre_go17.go b/vendor/golang.org/x/net/context/pre_go17.go deleted file mode 100644 index 0f35592df518..000000000000 --- a/vendor/golang.org/x/net/context/pre_go17.go +++ /dev/null @@ -1,300 +0,0 @@ -// 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 !go1.7 - -package context - -import ( - "errors" - "fmt" - "sync" - "time" -) - -// An emptyCtx is never canceled, has no values, and has no deadline. It is not -// struct{}, since vars of this type must have distinct addresses. -type emptyCtx int - -func (*emptyCtx) Deadline() (deadline time.Time, ok bool) { - return -} - -func (*emptyCtx) Done() <-chan struct{} { - return nil -} - -func (*emptyCtx) Err() error { - return nil -} - -func (*emptyCtx) Value(key interface{}) interface{} { - return nil -} - -func (e *emptyCtx) String() string { - switch e { - case background: - return "context.Background" - case todo: - return "context.TODO" - } - return "unknown empty Context" -} - -var ( - background = new(emptyCtx) - todo = new(emptyCtx) -) - -// Canceled is the error returned by Context.Err when the context is canceled. -var Canceled = errors.New("context canceled") - -// DeadlineExceeded is the error returned by Context.Err when the context's -// deadline passes. -var DeadlineExceeded = errors.New("context deadline exceeded") - -// WithCancel returns a copy of parent with a new Done channel. The returned -// context's Done channel is closed when the returned cancel function is called -// or when the parent context's Done channel is closed, whichever happens first. -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete. -func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { - c := newCancelCtx(parent) - propagateCancel(parent, c) - return c, func() { c.cancel(true, Canceled) } -} - -// newCancelCtx returns an initialized cancelCtx. -func newCancelCtx(parent Context) *cancelCtx { - return &cancelCtx{ - Context: parent, - done: make(chan struct{}), - } -} - -// propagateCancel arranges for child to be canceled when parent is. -func propagateCancel(parent Context, child canceler) { - if parent.Done() == nil { - return // parent is never canceled - } - if p, ok := parentCancelCtx(parent); ok { - p.mu.Lock() - if p.err != nil { - // parent has already been canceled - child.cancel(false, p.err) - } else { - if p.children == nil { - p.children = make(map[canceler]bool) - } - p.children[child] = true - } - p.mu.Unlock() - } else { - go func() { - select { - case <-parent.Done(): - child.cancel(false, parent.Err()) - case <-child.Done(): - } - }() - } -} - -// parentCancelCtx follows a chain of parent references until it finds a -// *cancelCtx. This function understands how each of the concrete types in this -// package represents its parent. -func parentCancelCtx(parent Context) (*cancelCtx, bool) { - for { - switch c := parent.(type) { - case *cancelCtx: - return c, true - case *timerCtx: - return c.cancelCtx, true - case *valueCtx: - parent = c.Context - default: - return nil, false - } - } -} - -// removeChild removes a context from its parent. -func removeChild(parent Context, child canceler) { - p, ok := parentCancelCtx(parent) - if !ok { - return - } - p.mu.Lock() - if p.children != nil { - delete(p.children, child) - } - p.mu.Unlock() -} - -// A canceler is a context type that can be canceled directly. The -// implementations are *cancelCtx and *timerCtx. -type canceler interface { - cancel(removeFromParent bool, err error) - Done() <-chan struct{} -} - -// A cancelCtx can be canceled. When canceled, it also cancels any children -// that implement canceler. -type cancelCtx struct { - Context - - done chan struct{} // closed by the first cancel call. - - mu sync.Mutex - children map[canceler]bool // set to nil by the first cancel call - err error // set to non-nil by the first cancel call -} - -func (c *cancelCtx) Done() <-chan struct{} { - return c.done -} - -func (c *cancelCtx) Err() error { - c.mu.Lock() - defer c.mu.Unlock() - return c.err -} - -func (c *cancelCtx) String() string { - return fmt.Sprintf("%v.WithCancel", c.Context) -} - -// cancel closes c.done, cancels each of c's children, and, if -// removeFromParent is true, removes c from its parent's children. -func (c *cancelCtx) cancel(removeFromParent bool, err error) { - if err == nil { - panic("context: internal error: missing cancel error") - } - c.mu.Lock() - if c.err != nil { - c.mu.Unlock() - return // already canceled - } - c.err = err - close(c.done) - for child := range c.children { - // NOTE: acquiring the child's lock while holding parent's lock. - child.cancel(false, err) - } - c.children = nil - c.mu.Unlock() - - if removeFromParent { - removeChild(c.Context, c) - } -} - -// WithDeadline returns a copy of the parent context with the deadline adjusted -// to be no later than d. If the parent's deadline is already earlier than d, -// WithDeadline(parent, d) is semantically equivalent to parent. The returned -// context's Done channel is closed when the deadline expires, when the returned -// cancel function is called, or when the parent context's Done channel is -// closed, whichever happens first. -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete. -func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) { - if cur, ok := parent.Deadline(); ok && cur.Before(deadline) { - // The current deadline is already sooner than the new one. - return WithCancel(parent) - } - c := &timerCtx{ - cancelCtx: newCancelCtx(parent), - deadline: deadline, - } - propagateCancel(parent, c) - d := deadline.Sub(time.Now()) - if d <= 0 { - c.cancel(true, DeadlineExceeded) // deadline has already passed - return c, func() { c.cancel(true, Canceled) } - } - c.mu.Lock() - defer c.mu.Unlock() - if c.err == nil { - c.timer = time.AfterFunc(d, func() { - c.cancel(true, DeadlineExceeded) - }) - } - return c, func() { c.cancel(true, Canceled) } -} - -// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to -// implement Done and Err. It implements cancel by stopping its timer then -// delegating to cancelCtx.cancel. -type timerCtx struct { - *cancelCtx - timer *time.Timer // Under cancelCtx.mu. - - deadline time.Time -} - -func (c *timerCtx) Deadline() (deadline time.Time, ok bool) { - return c.deadline, true -} - -func (c *timerCtx) String() string { - return fmt.Sprintf("%v.WithDeadline(%s [%s])", c.cancelCtx.Context, c.deadline, c.deadline.Sub(time.Now())) -} - -func (c *timerCtx) cancel(removeFromParent bool, err error) { - c.cancelCtx.cancel(false, err) - if removeFromParent { - // Remove this timerCtx from its parent cancelCtx's children. - removeChild(c.cancelCtx.Context, c) - } - c.mu.Lock() - if c.timer != nil { - c.timer.Stop() - c.timer = nil - } - c.mu.Unlock() -} - -// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)). -// -// Canceling this context releases resources associated with it, so code should -// call cancel as soon as the operations running in this Context complete: -// -// func slowOperationWithTimeout(ctx context.Context) (Result, error) { -// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) -// defer cancel() // releases resources if slowOperation completes before timeout elapses -// return slowOperation(ctx) -// } -func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) { - return WithDeadline(parent, time.Now().Add(timeout)) -} - -// WithValue returns a copy of parent in which the value associated with key is -// val. -// -// Use context Values only for request-scoped data that transits processes and -// APIs, not for passing optional parameters to functions. -func WithValue(parent Context, key interface{}, val interface{}) Context { - return &valueCtx{parent, key, val} -} - -// A valueCtx carries a key-value pair. It implements Value for that key and -// delegates all other calls to the embedded Context. -type valueCtx struct { - Context - key, val interface{} -} - -func (c *valueCtx) String() string { - return fmt.Sprintf("%v.WithValue(%#v, %#v)", c.Context, c.key, c.val) -} - -func (c *valueCtx) Value(key interface{}) interface{} { - if c.key == key { - return c.val - } - return c.Context.Value(key) -} diff --git a/vendor/golang.org/x/net/html/atom/atom.go b/vendor/golang.org/x/net/html/atom/atom.go deleted file mode 100644 index cd0a8ac15451..000000000000 --- a/vendor/golang.org/x/net/html/atom/atom.go +++ /dev/null @@ -1,78 +0,0 @@ -// 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 atom provides integer codes (also known as atoms) for a fixed set of -// frequently occurring HTML strings: tag names and attribute keys such as "p" -// and "id". -// -// Sharing an atom's name between all elements with the same tag can result in -// fewer string allocations when tokenizing and parsing HTML. Integer -// comparisons are also generally faster than string comparisons. -// -// The value of an atom's particular code is not guaranteed to stay the same -// between versions of this package. Neither is any ordering guaranteed: -// whether atom.H1 < atom.H2 may also change. The codes are not guaranteed to -// be dense. The only guarantees are that e.g. looking up "div" will yield -// atom.Div, calling atom.Div.String will return "div", and atom.Div != 0. -package atom // import "golang.org/x/net/html/atom" - -// Atom is an integer code for a string. The zero value maps to "". -type Atom uint32 - -// String returns the atom's name. -func (a Atom) String() string { - start := uint32(a >> 8) - n := uint32(a & 0xff) - if start+n > uint32(len(atomText)) { - return "" - } - return atomText[start : start+n] -} - -func (a Atom) string() string { - return atomText[a>>8 : a>>8+a&0xff] -} - -// fnv computes the FNV hash with an arbitrary starting value h. -func fnv(h uint32, s []byte) uint32 { - for i := range s { - h ^= uint32(s[i]) - h *= 16777619 - } - return h -} - -func match(s string, t []byte) bool { - for i, c := range t { - if s[i] != c { - return false - } - } - return true -} - -// Lookup returns the atom whose name is s. It returns zero if there is no -// such atom. The lookup is case sensitive. -func Lookup(s []byte) Atom { - if len(s) == 0 || len(s) > maxAtomLen { - return 0 - } - h := fnv(hash0, s) - if a := table[h&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { - return a - } - if a := table[(h>>16)&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { - return a - } - return 0 -} - -// String returns a string whose contents are equal to s. In that sense, it is -// equivalent to string(s) but may be more efficient. -func String(s []byte) string { - if a := Lookup(s); a != 0 { - return a.String() - } - return string(s) -} diff --git a/vendor/golang.org/x/net/html/atom/gen.go b/vendor/golang.org/x/net/html/atom/gen.go deleted file mode 100644 index 6bfa86601987..000000000000 --- a/vendor/golang.org/x/net/html/atom/gen.go +++ /dev/null @@ -1,648 +0,0 @@ -// 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 ignore - -package main - -// This program generates table.go and table_test.go. -// Invoke as -// -// go run gen.go |gofmt >table.go -// go run gen.go -test |gofmt >table_test.go - -import ( - "flag" - "fmt" - "math/rand" - "os" - "sort" - "strings" -) - -// identifier converts s to a Go exported identifier. -// It converts "div" to "Div" and "accept-charset" to "AcceptCharset". -func identifier(s string) string { - b := make([]byte, 0, len(s)) - cap := true - for _, c := range s { - if c == '-' { - cap = true - continue - } - if cap && 'a' <= c && c <= 'z' { - c -= 'a' - 'A' - } - cap = false - b = append(b, byte(c)) - } - return string(b) -} - -var test = flag.Bool("test", false, "generate table_test.go") - -func main() { - flag.Parse() - - var all []string - all = append(all, elements...) - all = append(all, attributes...) - all = append(all, eventHandlers...) - all = append(all, extra...) - sort.Strings(all) - - if *test { - fmt.Printf("// generated by go run gen.go -test; DO NOT EDIT\n\n") - fmt.Printf("package atom\n\n") - fmt.Printf("var testAtomList = []string{\n") - for _, s := range all { - fmt.Printf("\t%q,\n", s) - } - fmt.Printf("}\n") - return - } - - // uniq - lists have dups - // compute max len too - maxLen := 0 - w := 0 - for _, s := range all { - if w == 0 || all[w-1] != s { - if maxLen < len(s) { - maxLen = len(s) - } - all[w] = s - w++ - } - } - all = all[:w] - - // Find hash that minimizes table size. - var best *table - for i := 0; i < 1000000; i++ { - if best != nil && 1<<(best.k-1) < len(all) { - break - } - h := rand.Uint32() - for k := uint(0); k <= 16; k++ { - if best != nil && k >= best.k { - break - } - var t table - if t.init(h, k, all) { - best = &t - break - } - } - } - if best == nil { - fmt.Fprintf(os.Stderr, "failed to construct string table\n") - os.Exit(1) - } - - // Lay out strings, using overlaps when possible. - layout := append([]string{}, all...) - - // Remove strings that are substrings of other strings - for changed := true; changed; { - changed = false - for i, s := range layout { - if s == "" { - continue - } - for j, t := range layout { - if i != j && t != "" && strings.Contains(s, t) { - changed = true - layout[j] = "" - } - } - } - } - - // Join strings where one suffix matches another prefix. - for { - // Find best i, j, k such that layout[i][len-k:] == layout[j][:k], - // maximizing overlap length k. - besti := -1 - bestj := -1 - bestk := 0 - for i, s := range layout { - if s == "" { - continue - } - for j, t := range layout { - if i == j { - continue - } - for k := bestk + 1; k <= len(s) && k <= len(t); k++ { - if s[len(s)-k:] == t[:k] { - besti = i - bestj = j - bestk = k - } - } - } - } - if bestk > 0 { - layout[besti] += layout[bestj][bestk:] - layout[bestj] = "" - continue - } - break - } - - text := strings.Join(layout, "") - - atom := map[string]uint32{} - for _, s := range all { - off := strings.Index(text, s) - if off < 0 { - panic("lost string " + s) - } - atom[s] = uint32(off<<8 | len(s)) - } - - // Generate the Go code. - fmt.Printf("// generated by go run gen.go; DO NOT EDIT\n\n") - fmt.Printf("package atom\n\nconst (\n") - for _, s := range all { - fmt.Printf("\t%s Atom = %#x\n", identifier(s), atom[s]) - } - fmt.Printf(")\n\n") - - fmt.Printf("const hash0 = %#x\n\n", best.h0) - fmt.Printf("const maxAtomLen = %d\n\n", maxLen) - - fmt.Printf("var table = [1<<%d]Atom{\n", best.k) - for i, s := range best.tab { - if s == "" { - continue - } - fmt.Printf("\t%#x: %#x, // %s\n", i, atom[s], s) - } - fmt.Printf("}\n") - datasize := (1 << best.k) * 4 - - fmt.Printf("const atomText =\n") - textsize := len(text) - for len(text) > 60 { - fmt.Printf("\t%q +\n", text[:60]) - text = text[60:] - } - fmt.Printf("\t%q\n\n", text) - - fmt.Fprintf(os.Stderr, "%d atoms; %d string bytes + %d tables = %d total data\n", len(all), textsize, datasize, textsize+datasize) -} - -type byLen []string - -func (x byLen) Less(i, j int) bool { return len(x[i]) > len(x[j]) } -func (x byLen) Swap(i, j int) { x[i], x[j] = x[j], x[i] } -func (x byLen) Len() int { return len(x) } - -// fnv computes the FNV hash with an arbitrary starting value h. -func fnv(h uint32, s string) uint32 { - for i := 0; i < len(s); i++ { - h ^= uint32(s[i]) - h *= 16777619 - } - return h -} - -// A table represents an attempt at constructing the lookup table. -// The lookup table uses cuckoo hashing, meaning that each string -// can be found in one of two positions. -type table struct { - h0 uint32 - k uint - mask uint32 - tab []string -} - -// hash returns the two hashes for s. -func (t *table) hash(s string) (h1, h2 uint32) { - h := fnv(t.h0, s) - h1 = h & t.mask - h2 = (h >> 16) & t.mask - return -} - -// init initializes the table with the given parameters. -// h0 is the initial hash value, -// k is the number of bits of hash value to use, and -// x is the list of strings to store in the table. -// init returns false if the table cannot be constructed. -func (t *table) init(h0 uint32, k uint, x []string) bool { - t.h0 = h0 - t.k = k - t.tab = make([]string, 1< len(t.tab) { - return false - } - s := t.tab[i] - h1, h2 := t.hash(s) - j := h1 + h2 - i - if t.tab[j] != "" && !t.push(j, depth+1) { - return false - } - t.tab[j] = s - return true -} - -// The lists of element names and attribute keys were taken from -// https://html.spec.whatwg.org/multipage/indices.html#index -// as of the "HTML Living Standard - Last Updated 21 February 2015" version. - -var elements = []string{ - "a", - "abbr", - "address", - "area", - "article", - "aside", - "audio", - "b", - "base", - "bdi", - "bdo", - "blockquote", - "body", - "br", - "button", - "canvas", - "caption", - "cite", - "code", - "col", - "colgroup", - "command", - "data", - "datalist", - "dd", - "del", - "details", - "dfn", - "dialog", - "div", - "dl", - "dt", - "em", - "embed", - "fieldset", - "figcaption", - "figure", - "footer", - "form", - "h1", - "h2", - "h3", - "h4", - "h5", - "h6", - "head", - "header", - "hgroup", - "hr", - "html", - "i", - "iframe", - "img", - "input", - "ins", - "kbd", - "keygen", - "label", - "legend", - "li", - "link", - "map", - "mark", - "menu", - "menuitem", - "meta", - "meter", - "nav", - "noscript", - "object", - "ol", - "optgroup", - "option", - "output", - "p", - "param", - "pre", - "progress", - "q", - "rp", - "rt", - "ruby", - "s", - "samp", - "script", - "section", - "select", - "small", - "source", - "span", - "strong", - "style", - "sub", - "summary", - "sup", - "table", - "tbody", - "td", - "template", - "textarea", - "tfoot", - "th", - "thead", - "time", - "title", - "tr", - "track", - "u", - "ul", - "var", - "video", - "wbr", -} - -// https://html.spec.whatwg.org/multipage/indices.html#attributes-3 - -var attributes = []string{ - "abbr", - "accept", - "accept-charset", - "accesskey", - "action", - "alt", - "async", - "autocomplete", - "autofocus", - "autoplay", - "challenge", - "charset", - "checked", - "cite", - "class", - "cols", - "colspan", - "command", - "content", - "contenteditable", - "contextmenu", - "controls", - "coords", - "crossorigin", - "data", - "datetime", - "default", - "defer", - "dir", - "dirname", - "disabled", - "download", - "draggable", - "dropzone", - "enctype", - "for", - "form", - "formaction", - "formenctype", - "formmethod", - "formnovalidate", - "formtarget", - "headers", - "height", - "hidden", - "high", - "href", - "hreflang", - "http-equiv", - "icon", - "id", - "inputmode", - "ismap", - "itemid", - "itemprop", - "itemref", - "itemscope", - "itemtype", - "keytype", - "kind", - "label", - "lang", - "list", - "loop", - "low", - "manifest", - "max", - "maxlength", - "media", - "mediagroup", - "method", - "min", - "minlength", - "multiple", - "muted", - "name", - "novalidate", - "open", - "optimum", - "pattern", - "ping", - "placeholder", - "poster", - "preload", - "radiogroup", - "readonly", - "rel", - "required", - "reversed", - "rows", - "rowspan", - "sandbox", - "spellcheck", - "scope", - "scoped", - "seamless", - "selected", - "shape", - "size", - "sizes", - "sortable", - "sorted", - "span", - "src", - "srcdoc", - "srclang", - "start", - "step", - "style", - "tabindex", - "target", - "title", - "translate", - "type", - "typemustmatch", - "usemap", - "value", - "width", - "wrap", -} - -var eventHandlers = []string{ - "onabort", - "onautocomplete", - "onautocompleteerror", - "onafterprint", - "onbeforeprint", - "onbeforeunload", - "onblur", - "oncancel", - "oncanplay", - "oncanplaythrough", - "onchange", - "onclick", - "onclose", - "oncontextmenu", - "oncuechange", - "ondblclick", - "ondrag", - "ondragend", - "ondragenter", - "ondragleave", - "ondragover", - "ondragstart", - "ondrop", - "ondurationchange", - "onemptied", - "onended", - "onerror", - "onfocus", - "onhashchange", - "oninput", - "oninvalid", - "onkeydown", - "onkeypress", - "onkeyup", - "onlanguagechange", - "onload", - "onloadeddata", - "onloadedmetadata", - "onloadstart", - "onmessage", - "onmousedown", - "onmousemove", - "onmouseout", - "onmouseover", - "onmouseup", - "onmousewheel", - "onoffline", - "ononline", - "onpagehide", - "onpageshow", - "onpause", - "onplay", - "onplaying", - "onpopstate", - "onprogress", - "onratechange", - "onreset", - "onresize", - "onscroll", - "onseeked", - "onseeking", - "onselect", - "onshow", - "onsort", - "onstalled", - "onstorage", - "onsubmit", - "onsuspend", - "ontimeupdate", - "ontoggle", - "onunload", - "onvolumechange", - "onwaiting", -} - -// extra are ad-hoc values not covered by any of the lists above. -var extra = []string{ - "align", - "annotation", - "annotation-xml", - "applet", - "basefont", - "bgsound", - "big", - "blink", - "center", - "color", - "desc", - "face", - "font", - "foreignObject", // HTML is case-insensitive, but SVG-embedded-in-HTML is case-sensitive. - "foreignobject", - "frame", - "frameset", - "image", - "isindex", - "listing", - "malignmark", - "marquee", - "math", - "mglyph", - "mi", - "mn", - "mo", - "ms", - "mtext", - "nobr", - "noembed", - "noframes", - "plaintext", - "prompt", - "public", - "spacer", - "strike", - "svg", - "system", - "tt", - "xmp", -} diff --git a/vendor/golang.org/x/net/html/atom/table.go b/vendor/golang.org/x/net/html/atom/table.go deleted file mode 100644 index 2605ba3102f6..000000000000 --- a/vendor/golang.org/x/net/html/atom/table.go +++ /dev/null @@ -1,713 +0,0 @@ -// generated by go run gen.go; DO NOT EDIT - -package atom - -const ( - A Atom = 0x1 - Abbr Atom = 0x4 - Accept Atom = 0x2106 - AcceptCharset Atom = 0x210e - Accesskey Atom = 0x3309 - Action Atom = 0x1f606 - Address Atom = 0x4f307 - Align Atom = 0x1105 - Alt Atom = 0x4503 - Annotation Atom = 0x1670a - AnnotationXml Atom = 0x1670e - Applet Atom = 0x2b306 - Area Atom = 0x2fa04 - Article Atom = 0x38807 - Aside Atom = 0x8305 - Async Atom = 0x7b05 - Audio Atom = 0xa605 - Autocomplete Atom = 0x1fc0c - Autofocus Atom = 0xb309 - Autoplay Atom = 0xce08 - B Atom = 0x101 - Base Atom = 0xd604 - Basefont Atom = 0xd608 - Bdi Atom = 0x1a03 - Bdo Atom = 0xe703 - Bgsound Atom = 0x11807 - Big Atom = 0x12403 - Blink Atom = 0x12705 - Blockquote Atom = 0x12c0a - Body Atom = 0x2f04 - Br Atom = 0x202 - Button Atom = 0x13606 - Canvas Atom = 0x7f06 - Caption Atom = 0x1bb07 - Center Atom = 0x5b506 - Challenge Atom = 0x21f09 - Charset Atom = 0x2807 - Checked Atom = 0x32807 - Cite Atom = 0x3c804 - Class Atom = 0x4de05 - Code Atom = 0x14904 - Col Atom = 0x15003 - Colgroup Atom = 0x15008 - Color Atom = 0x15d05 - Cols Atom = 0x16204 - Colspan Atom = 0x16207 - Command Atom = 0x17507 - Content Atom = 0x42307 - Contenteditable Atom = 0x4230f - Contextmenu Atom = 0x3310b - Controls Atom = 0x18808 - Coords Atom = 0x19406 - Crossorigin Atom = 0x19f0b - Data Atom = 0x44a04 - Datalist Atom = 0x44a08 - Datetime Atom = 0x23c08 - Dd Atom = 0x26702 - Default Atom = 0x8607 - Defer Atom = 0x14b05 - Del Atom = 0x3ef03 - Desc Atom = 0x4db04 - Details Atom = 0x4807 - Dfn Atom = 0x6103 - Dialog Atom = 0x1b06 - Dir Atom = 0x6903 - Dirname Atom = 0x6907 - Disabled Atom = 0x10c08 - Div Atom = 0x11303 - Dl Atom = 0x11e02 - Download Atom = 0x40008 - Draggable Atom = 0x17b09 - Dropzone Atom = 0x39108 - Dt Atom = 0x50902 - Em Atom = 0x6502 - Embed Atom = 0x6505 - Enctype Atom = 0x21107 - Face Atom = 0x5b304 - Fieldset Atom = 0x1b008 - Figcaption Atom = 0x1b80a - Figure Atom = 0x1cc06 - Font Atom = 0xda04 - Footer Atom = 0x8d06 - For Atom = 0x1d803 - ForeignObject Atom = 0x1d80d - Foreignobject Atom = 0x1e50d - Form Atom = 0x1f204 - Formaction Atom = 0x1f20a - Formenctype Atom = 0x20d0b - Formmethod Atom = 0x2280a - Formnovalidate Atom = 0x2320e - Formtarget Atom = 0x2470a - Frame Atom = 0x9a05 - Frameset Atom = 0x9a08 - H1 Atom = 0x26e02 - H2 Atom = 0x29402 - H3 Atom = 0x2a702 - H4 Atom = 0x2e902 - H5 Atom = 0x2f302 - H6 Atom = 0x50b02 - Head Atom = 0x2d504 - Header Atom = 0x2d506 - Headers Atom = 0x2d507 - Height Atom = 0x25106 - Hgroup Atom = 0x25906 - Hidden Atom = 0x26506 - High Atom = 0x26b04 - Hr Atom = 0x27002 - Href Atom = 0x27004 - Hreflang Atom = 0x27008 - Html Atom = 0x25504 - HttpEquiv Atom = 0x2780a - I Atom = 0x601 - Icon Atom = 0x42204 - Id Atom = 0x8502 - Iframe Atom = 0x29606 - Image Atom = 0x29c05 - Img Atom = 0x2a103 - Input Atom = 0x3e805 - Inputmode Atom = 0x3e809 - Ins Atom = 0x1a803 - Isindex Atom = 0x2a907 - Ismap Atom = 0x2b005 - Itemid Atom = 0x33c06 - Itemprop Atom = 0x3c908 - Itemref Atom = 0x5ad07 - Itemscope Atom = 0x2b909 - Itemtype Atom = 0x2c308 - Kbd Atom = 0x1903 - Keygen Atom = 0x3906 - Keytype Atom = 0x53707 - Kind Atom = 0x10904 - Label Atom = 0xf005 - Lang Atom = 0x27404 - Legend Atom = 0x18206 - Li Atom = 0x1202 - Link Atom = 0x12804 - List Atom = 0x44e04 - Listing Atom = 0x44e07 - Loop Atom = 0xf404 - Low Atom = 0x11f03 - Malignmark Atom = 0x100a - Manifest Atom = 0x5f108 - Map Atom = 0x2b203 - Mark Atom = 0x1604 - Marquee Atom = 0x2cb07 - Math Atom = 0x2d204 - Max Atom = 0x2e103 - Maxlength Atom = 0x2e109 - Media Atom = 0x6e05 - Mediagroup Atom = 0x6e0a - Menu Atom = 0x33804 - Menuitem Atom = 0x33808 - Meta Atom = 0x45d04 - Meter Atom = 0x24205 - Method Atom = 0x22c06 - Mglyph Atom = 0x2a206 - Mi Atom = 0x2eb02 - Min Atom = 0x2eb03 - Minlength Atom = 0x2eb09 - Mn Atom = 0x23502 - Mo Atom = 0x3ed02 - Ms Atom = 0x2bc02 - Mtext Atom = 0x2f505 - Multiple Atom = 0x30308 - Muted Atom = 0x30b05 - Name Atom = 0x6c04 - Nav Atom = 0x3e03 - Nobr Atom = 0x5704 - Noembed Atom = 0x6307 - Noframes Atom = 0x9808 - Noscript Atom = 0x3d208 - Novalidate Atom = 0x2360a - Object Atom = 0x1ec06 - Ol Atom = 0xc902 - Onabort Atom = 0x13a07 - Onafterprint Atom = 0x1c00c - Onautocomplete Atom = 0x1fa0e - Onautocompleteerror Atom = 0x1fa13 - Onbeforeprint Atom = 0x6040d - Onbeforeunload Atom = 0x4e70e - Onblur Atom = 0xaa06 - Oncancel Atom = 0xe908 - Oncanplay Atom = 0x28509 - Oncanplaythrough Atom = 0x28510 - Onchange Atom = 0x3a708 - Onclick Atom = 0x31007 - Onclose Atom = 0x31707 - Oncontextmenu Atom = 0x32f0d - Oncuechange Atom = 0x3420b - Ondblclick Atom = 0x34d0a - Ondrag Atom = 0x35706 - Ondragend Atom = 0x35709 - Ondragenter Atom = 0x3600b - Ondragleave Atom = 0x36b0b - Ondragover Atom = 0x3760a - Ondragstart Atom = 0x3800b - Ondrop Atom = 0x38f06 - Ondurationchange Atom = 0x39f10 - Onemptied Atom = 0x39609 - Onended Atom = 0x3af07 - Onerror Atom = 0x3b607 - Onfocus Atom = 0x3bd07 - Onhashchange Atom = 0x3da0c - Oninput Atom = 0x3e607 - Oninvalid Atom = 0x3f209 - Onkeydown Atom = 0x3fb09 - Onkeypress Atom = 0x4080a - Onkeyup Atom = 0x41807 - Onlanguagechange Atom = 0x43210 - Onload Atom = 0x44206 - Onloadeddata Atom = 0x4420c - Onloadedmetadata Atom = 0x45510 - Onloadstart Atom = 0x46b0b - Onmessage Atom = 0x47609 - Onmousedown Atom = 0x47f0b - Onmousemove Atom = 0x48a0b - Onmouseout Atom = 0x4950a - Onmouseover Atom = 0x4a20b - Onmouseup Atom = 0x4ad09 - Onmousewheel Atom = 0x4b60c - Onoffline Atom = 0x4c209 - Ononline Atom = 0x4cb08 - Onpagehide Atom = 0x4d30a - Onpageshow Atom = 0x4fe0a - Onpause Atom = 0x50d07 - Onplay Atom = 0x51706 - Onplaying Atom = 0x51709 - Onpopstate Atom = 0x5200a - Onprogress Atom = 0x52a0a - Onratechange Atom = 0x53e0c - Onreset Atom = 0x54a07 - Onresize Atom = 0x55108 - Onscroll Atom = 0x55f08 - Onseeked Atom = 0x56708 - Onseeking Atom = 0x56f09 - Onselect Atom = 0x57808 - Onshow Atom = 0x58206 - Onsort Atom = 0x58b06 - Onstalled Atom = 0x59509 - Onstorage Atom = 0x59e09 - Onsubmit Atom = 0x5a708 - Onsuspend Atom = 0x5bb09 - Ontimeupdate Atom = 0xdb0c - Ontoggle Atom = 0x5c408 - Onunload Atom = 0x5cc08 - Onvolumechange Atom = 0x5d40e - Onwaiting Atom = 0x5e209 - Open Atom = 0x3cf04 - Optgroup Atom = 0xf608 - Optimum Atom = 0x5eb07 - Option Atom = 0x60006 - Output Atom = 0x49c06 - P Atom = 0xc01 - Param Atom = 0xc05 - Pattern Atom = 0x5107 - Ping Atom = 0x7704 - Placeholder Atom = 0xc30b - Plaintext Atom = 0xfd09 - Poster Atom = 0x15706 - Pre Atom = 0x25e03 - Preload Atom = 0x25e07 - Progress Atom = 0x52c08 - Prompt Atom = 0x5fa06 - Public Atom = 0x41e06 - Q Atom = 0x13101 - Radiogroup Atom = 0x30a - Readonly Atom = 0x2fb08 - Rel Atom = 0x25f03 - Required Atom = 0x1d008 - Reversed Atom = 0x5a08 - Rows Atom = 0x9204 - Rowspan Atom = 0x9207 - Rp Atom = 0x1c602 - Rt Atom = 0x13f02 - Ruby Atom = 0xaf04 - S Atom = 0x2c01 - Samp Atom = 0x4e04 - Sandbox Atom = 0xbb07 - Scope Atom = 0x2bd05 - Scoped Atom = 0x2bd06 - Script Atom = 0x3d406 - Seamless Atom = 0x31c08 - Section Atom = 0x4e207 - Select Atom = 0x57a06 - Selected Atom = 0x57a08 - Shape Atom = 0x4f905 - Size Atom = 0x55504 - Sizes Atom = 0x55505 - Small Atom = 0x18f05 - Sortable Atom = 0x58d08 - Sorted Atom = 0x19906 - Source Atom = 0x1aa06 - Spacer Atom = 0x2db06 - Span Atom = 0x9504 - Spellcheck Atom = 0x3230a - Src Atom = 0x3c303 - Srcdoc Atom = 0x3c306 - Srclang Atom = 0x41107 - Start Atom = 0x38605 - Step Atom = 0x5f704 - Strike Atom = 0x53306 - Strong Atom = 0x55906 - Style Atom = 0x61105 - Sub Atom = 0x5a903 - Summary Atom = 0x61607 - Sup Atom = 0x61d03 - Svg Atom = 0x62003 - System Atom = 0x62306 - Tabindex Atom = 0x46308 - Table Atom = 0x42d05 - Target Atom = 0x24b06 - Tbody Atom = 0x2e05 - Td Atom = 0x4702 - Template Atom = 0x62608 - Textarea Atom = 0x2f608 - Tfoot Atom = 0x8c05 - Th Atom = 0x22e02 - Thead Atom = 0x2d405 - Time Atom = 0xdd04 - Title Atom = 0xa105 - Tr Atom = 0x10502 - Track Atom = 0x10505 - Translate Atom = 0x14009 - Tt Atom = 0x5302 - Type Atom = 0x21404 - Typemustmatch Atom = 0x2140d - U Atom = 0xb01 - Ul Atom = 0x8a02 - Usemap Atom = 0x51106 - Value Atom = 0x4005 - Var Atom = 0x11503 - Video Atom = 0x28105 - Wbr Atom = 0x12103 - Width Atom = 0x50705 - Wrap Atom = 0x58704 - Xmp Atom = 0xc103 -) - -const hash0 = 0xc17da63e - -const maxAtomLen = 19 - -var table = [1 << 9]Atom{ - 0x1: 0x48a0b, // onmousemove - 0x2: 0x5e209, // onwaiting - 0x3: 0x1fa13, // onautocompleteerror - 0x4: 0x5fa06, // prompt - 0x7: 0x5eb07, // optimum - 0x8: 0x1604, // mark - 0xa: 0x5ad07, // itemref - 0xb: 0x4fe0a, // onpageshow - 0xc: 0x57a06, // select - 0xd: 0x17b09, // draggable - 0xe: 0x3e03, // nav - 0xf: 0x17507, // command - 0x11: 0xb01, // u - 0x14: 0x2d507, // headers - 0x15: 0x44a08, // datalist - 0x17: 0x4e04, // samp - 0x1a: 0x3fb09, // onkeydown - 0x1b: 0x55f08, // onscroll - 0x1c: 0x15003, // col - 0x20: 0x3c908, // itemprop - 0x21: 0x2780a, // http-equiv - 0x22: 0x61d03, // sup - 0x24: 0x1d008, // required - 0x2b: 0x25e07, // preload - 0x2c: 0x6040d, // onbeforeprint - 0x2d: 0x3600b, // ondragenter - 0x2e: 0x50902, // dt - 0x2f: 0x5a708, // onsubmit - 0x30: 0x27002, // hr - 0x31: 0x32f0d, // oncontextmenu - 0x33: 0x29c05, // image - 0x34: 0x50d07, // onpause - 0x35: 0x25906, // hgroup - 0x36: 0x7704, // ping - 0x37: 0x57808, // onselect - 0x3a: 0x11303, // div - 0x3b: 0x1fa0e, // onautocomplete - 0x40: 0x2eb02, // mi - 0x41: 0x31c08, // seamless - 0x42: 0x2807, // charset - 0x43: 0x8502, // id - 0x44: 0x5200a, // onpopstate - 0x45: 0x3ef03, // del - 0x46: 0x2cb07, // marquee - 0x47: 0x3309, // accesskey - 0x49: 0x8d06, // footer - 0x4a: 0x44e04, // list - 0x4b: 0x2b005, // ismap - 0x51: 0x33804, // menu - 0x52: 0x2f04, // body - 0x55: 0x9a08, // frameset - 0x56: 0x54a07, // onreset - 0x57: 0x12705, // blink - 0x58: 0xa105, // title - 0x59: 0x38807, // article - 0x5b: 0x22e02, // th - 0x5d: 0x13101, // q - 0x5e: 0x3cf04, // open - 0x5f: 0x2fa04, // area - 0x61: 0x44206, // onload - 0x62: 0xda04, // font - 0x63: 0xd604, // base - 0x64: 0x16207, // colspan - 0x65: 0x53707, // keytype - 0x66: 0x11e02, // dl - 0x68: 0x1b008, // fieldset - 0x6a: 0x2eb03, // min - 0x6b: 0x11503, // var - 0x6f: 0x2d506, // header - 0x70: 0x13f02, // rt - 0x71: 0x15008, // colgroup - 0x72: 0x23502, // mn - 0x74: 0x13a07, // onabort - 0x75: 0x3906, // keygen - 0x76: 0x4c209, // onoffline - 0x77: 0x21f09, // challenge - 0x78: 0x2b203, // map - 0x7a: 0x2e902, // h4 - 0x7b: 0x3b607, // onerror - 0x7c: 0x2e109, // maxlength - 0x7d: 0x2f505, // mtext - 0x7e: 0xbb07, // sandbox - 0x7f: 0x58b06, // onsort - 0x80: 0x100a, // malignmark - 0x81: 0x45d04, // meta - 0x82: 0x7b05, // async - 0x83: 0x2a702, // h3 - 0x84: 0x26702, // dd - 0x85: 0x27004, // href - 0x86: 0x6e0a, // mediagroup - 0x87: 0x19406, // coords - 0x88: 0x41107, // srclang - 0x89: 0x34d0a, // ondblclick - 0x8a: 0x4005, // value - 0x8c: 0xe908, // oncancel - 0x8e: 0x3230a, // spellcheck - 0x8f: 0x9a05, // frame - 0x91: 0x12403, // big - 0x94: 0x1f606, // action - 0x95: 0x6903, // dir - 0x97: 0x2fb08, // readonly - 0x99: 0x42d05, // table - 0x9a: 0x61607, // summary - 0x9b: 0x12103, // wbr - 0x9c: 0x30a, // radiogroup - 0x9d: 0x6c04, // name - 0x9f: 0x62306, // system - 0xa1: 0x15d05, // color - 0xa2: 0x7f06, // canvas - 0xa3: 0x25504, // html - 0xa5: 0x56f09, // onseeking - 0xac: 0x4f905, // shape - 0xad: 0x25f03, // rel - 0xae: 0x28510, // oncanplaythrough - 0xaf: 0x3760a, // ondragover - 0xb0: 0x62608, // template - 0xb1: 0x1d80d, // foreignObject - 0xb3: 0x9204, // rows - 0xb6: 0x44e07, // listing - 0xb7: 0x49c06, // output - 0xb9: 0x3310b, // contextmenu - 0xbb: 0x11f03, // low - 0xbc: 0x1c602, // rp - 0xbd: 0x5bb09, // onsuspend - 0xbe: 0x13606, // button - 0xbf: 0x4db04, // desc - 0xc1: 0x4e207, // section - 0xc2: 0x52a0a, // onprogress - 0xc3: 0x59e09, // onstorage - 0xc4: 0x2d204, // math - 0xc5: 0x4503, // alt - 0xc7: 0x8a02, // ul - 0xc8: 0x5107, // pattern - 0xc9: 0x4b60c, // onmousewheel - 0xca: 0x35709, // ondragend - 0xcb: 0xaf04, // ruby - 0xcc: 0xc01, // p - 0xcd: 0x31707, // onclose - 0xce: 0x24205, // meter - 0xcf: 0x11807, // bgsound - 0xd2: 0x25106, // height - 0xd4: 0x101, // b - 0xd5: 0x2c308, // itemtype - 0xd8: 0x1bb07, // caption - 0xd9: 0x10c08, // disabled - 0xdb: 0x33808, // menuitem - 0xdc: 0x62003, // svg - 0xdd: 0x18f05, // small - 0xde: 0x44a04, // data - 0xe0: 0x4cb08, // ononline - 0xe1: 0x2a206, // mglyph - 0xe3: 0x6505, // embed - 0xe4: 0x10502, // tr - 0xe5: 0x46b0b, // onloadstart - 0xe7: 0x3c306, // srcdoc - 0xeb: 0x5c408, // ontoggle - 0xed: 0xe703, // bdo - 0xee: 0x4702, // td - 0xef: 0x8305, // aside - 0xf0: 0x29402, // h2 - 0xf1: 0x52c08, // progress - 0xf2: 0x12c0a, // blockquote - 0xf4: 0xf005, // label - 0xf5: 0x601, // i - 0xf7: 0x9207, // rowspan - 0xfb: 0x51709, // onplaying - 0xfd: 0x2a103, // img - 0xfe: 0xf608, // optgroup - 0xff: 0x42307, // content - 0x101: 0x53e0c, // onratechange - 0x103: 0x3da0c, // onhashchange - 0x104: 0x4807, // details - 0x106: 0x40008, // download - 0x109: 0x14009, // translate - 0x10b: 0x4230f, // contenteditable - 0x10d: 0x36b0b, // ondragleave - 0x10e: 0x2106, // accept - 0x10f: 0x57a08, // selected - 0x112: 0x1f20a, // formaction - 0x113: 0x5b506, // center - 0x115: 0x45510, // onloadedmetadata - 0x116: 0x12804, // link - 0x117: 0xdd04, // time - 0x118: 0x19f0b, // crossorigin - 0x119: 0x3bd07, // onfocus - 0x11a: 0x58704, // wrap - 0x11b: 0x42204, // icon - 0x11d: 0x28105, // video - 0x11e: 0x4de05, // class - 0x121: 0x5d40e, // onvolumechange - 0x122: 0xaa06, // onblur - 0x123: 0x2b909, // itemscope - 0x124: 0x61105, // style - 0x127: 0x41e06, // public - 0x129: 0x2320e, // formnovalidate - 0x12a: 0x58206, // onshow - 0x12c: 0x51706, // onplay - 0x12d: 0x3c804, // cite - 0x12e: 0x2bc02, // ms - 0x12f: 0xdb0c, // ontimeupdate - 0x130: 0x10904, // kind - 0x131: 0x2470a, // formtarget - 0x135: 0x3af07, // onended - 0x136: 0x26506, // hidden - 0x137: 0x2c01, // s - 0x139: 0x2280a, // formmethod - 0x13a: 0x3e805, // input - 0x13c: 0x50b02, // h6 - 0x13d: 0xc902, // ol - 0x13e: 0x3420b, // oncuechange - 0x13f: 0x1e50d, // foreignobject - 0x143: 0x4e70e, // onbeforeunload - 0x144: 0x2bd05, // scope - 0x145: 0x39609, // onemptied - 0x146: 0x14b05, // defer - 0x147: 0xc103, // xmp - 0x148: 0x39f10, // ondurationchange - 0x149: 0x1903, // kbd - 0x14c: 0x47609, // onmessage - 0x14d: 0x60006, // option - 0x14e: 0x2eb09, // minlength - 0x14f: 0x32807, // checked - 0x150: 0xce08, // autoplay - 0x152: 0x202, // br - 0x153: 0x2360a, // novalidate - 0x156: 0x6307, // noembed - 0x159: 0x31007, // onclick - 0x15a: 0x47f0b, // onmousedown - 0x15b: 0x3a708, // onchange - 0x15e: 0x3f209, // oninvalid - 0x15f: 0x2bd06, // scoped - 0x160: 0x18808, // controls - 0x161: 0x30b05, // muted - 0x162: 0x58d08, // sortable - 0x163: 0x51106, // usemap - 0x164: 0x1b80a, // figcaption - 0x165: 0x35706, // ondrag - 0x166: 0x26b04, // high - 0x168: 0x3c303, // src - 0x169: 0x15706, // poster - 0x16b: 0x1670e, // annotation-xml - 0x16c: 0x5f704, // step - 0x16d: 0x4, // abbr - 0x16e: 0x1b06, // dialog - 0x170: 0x1202, // li - 0x172: 0x3ed02, // mo - 0x175: 0x1d803, // for - 0x176: 0x1a803, // ins - 0x178: 0x55504, // size - 0x179: 0x43210, // onlanguagechange - 0x17a: 0x8607, // default - 0x17b: 0x1a03, // bdi - 0x17c: 0x4d30a, // onpagehide - 0x17d: 0x6907, // dirname - 0x17e: 0x21404, // type - 0x17f: 0x1f204, // form - 0x181: 0x28509, // oncanplay - 0x182: 0x6103, // dfn - 0x183: 0x46308, // tabindex - 0x186: 0x6502, // em - 0x187: 0x27404, // lang - 0x189: 0x39108, // dropzone - 0x18a: 0x4080a, // onkeypress - 0x18b: 0x23c08, // datetime - 0x18c: 0x16204, // cols - 0x18d: 0x1, // a - 0x18e: 0x4420c, // onloadeddata - 0x190: 0xa605, // audio - 0x192: 0x2e05, // tbody - 0x193: 0x22c06, // method - 0x195: 0xf404, // loop - 0x196: 0x29606, // iframe - 0x198: 0x2d504, // head - 0x19e: 0x5f108, // manifest - 0x19f: 0xb309, // autofocus - 0x1a0: 0x14904, // code - 0x1a1: 0x55906, // strong - 0x1a2: 0x30308, // multiple - 0x1a3: 0xc05, // param - 0x1a6: 0x21107, // enctype - 0x1a7: 0x5b304, // face - 0x1a8: 0xfd09, // plaintext - 0x1a9: 0x26e02, // h1 - 0x1aa: 0x59509, // onstalled - 0x1ad: 0x3d406, // script - 0x1ae: 0x2db06, // spacer - 0x1af: 0x55108, // onresize - 0x1b0: 0x4a20b, // onmouseover - 0x1b1: 0x5cc08, // onunload - 0x1b2: 0x56708, // onseeked - 0x1b4: 0x2140d, // typemustmatch - 0x1b5: 0x1cc06, // figure - 0x1b6: 0x4950a, // onmouseout - 0x1b7: 0x25e03, // pre - 0x1b8: 0x50705, // width - 0x1b9: 0x19906, // sorted - 0x1bb: 0x5704, // nobr - 0x1be: 0x5302, // tt - 0x1bf: 0x1105, // align - 0x1c0: 0x3e607, // oninput - 0x1c3: 0x41807, // onkeyup - 0x1c6: 0x1c00c, // onafterprint - 0x1c7: 0x210e, // accept-charset - 0x1c8: 0x33c06, // itemid - 0x1c9: 0x3e809, // inputmode - 0x1cb: 0x53306, // strike - 0x1cc: 0x5a903, // sub - 0x1cd: 0x10505, // track - 0x1ce: 0x38605, // start - 0x1d0: 0xd608, // basefont - 0x1d6: 0x1aa06, // source - 0x1d7: 0x18206, // legend - 0x1d8: 0x2d405, // thead - 0x1da: 0x8c05, // tfoot - 0x1dd: 0x1ec06, // object - 0x1de: 0x6e05, // media - 0x1df: 0x1670a, // annotation - 0x1e0: 0x20d0b, // formenctype - 0x1e2: 0x3d208, // noscript - 0x1e4: 0x55505, // sizes - 0x1e5: 0x1fc0c, // autocomplete - 0x1e6: 0x9504, // span - 0x1e7: 0x9808, // noframes - 0x1e8: 0x24b06, // target - 0x1e9: 0x38f06, // ondrop - 0x1ea: 0x2b306, // applet - 0x1ec: 0x5a08, // reversed - 0x1f0: 0x2a907, // isindex - 0x1f3: 0x27008, // hreflang - 0x1f5: 0x2f302, // h5 - 0x1f6: 0x4f307, // address - 0x1fa: 0x2e103, // max - 0x1fb: 0xc30b, // placeholder - 0x1fc: 0x2f608, // textarea - 0x1fe: 0x4ad09, // onmouseup - 0x1ff: 0x3800b, // ondragstart -} - -const atomText = "abbradiogrouparamalignmarkbdialogaccept-charsetbodyaccesskey" + - "genavaluealtdetailsampatternobreversedfnoembedirnamediagroup" + - "ingasyncanvasidefaultfooterowspanoframesetitleaudionblurubya" + - "utofocusandboxmplaceholderautoplaybasefontimeupdatebdoncance" + - "labelooptgrouplaintextrackindisabledivarbgsoundlowbrbigblink" + - "blockquotebuttonabortranslatecodefercolgroupostercolorcolspa" + - "nnotation-xmlcommandraggablegendcontrolsmallcoordsortedcross" + - "originsourcefieldsetfigcaptionafterprintfigurequiredforeignO" + - "bjectforeignobjectformactionautocompleteerrorformenctypemust" + - "matchallengeformmethodformnovalidatetimeterformtargetheightm" + - "lhgroupreloadhiddenhigh1hreflanghttp-equivideoncanplaythroug" + - "h2iframeimageimglyph3isindexismappletitemscopeditemtypemarqu" + - "eematheaderspacermaxlength4minlength5mtextareadonlymultiplem" + - "utedonclickoncloseamlesspellcheckedoncontextmenuitemidoncuec" + - "hangeondblclickondragendondragenterondragleaveondragoverondr" + - "agstarticleondropzonemptiedondurationchangeonendedonerroronf" + - "ocusrcdocitempropenoscriptonhashchangeoninputmodeloninvalido" + - "nkeydownloadonkeypressrclangonkeyupublicontenteditableonlang" + - "uagechangeonloadeddatalistingonloadedmetadatabindexonloadsta" + - "rtonmessageonmousedownonmousemoveonmouseoutputonmouseoveronm" + - "ouseuponmousewheelonofflineononlineonpagehidesclassectionbef" + - "oreunloaddresshapeonpageshowidth6onpausemaponplayingonpopsta" + - "teonprogresstrikeytypeonratechangeonresetonresizestrongonscr" + - "ollonseekedonseekingonselectedonshowraponsortableonstalledon" + - "storageonsubmitemrefacenteronsuspendontoggleonunloadonvolume" + - "changeonwaitingoptimumanifestepromptoptionbeforeprintstylesu" + - "mmarysupsvgsystemplate" diff --git a/vendor/golang.org/x/net/html/charset/charset.go b/vendor/golang.org/x/net/html/charset/charset.go deleted file mode 100644 index 13bed1599f71..000000000000 --- a/vendor/golang.org/x/net/html/charset/charset.go +++ /dev/null @@ -1,257 +0,0 @@ -// Copyright 2013 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 charset provides common text encodings for HTML documents. -// -// The mapping from encoding labels to encodings is defined at -// https://encoding.spec.whatwg.org/. -package charset // import "golang.org/x/net/html/charset" - -import ( - "bytes" - "fmt" - "io" - "mime" - "strings" - "unicode/utf8" - - "golang.org/x/net/html" - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/charmap" - "golang.org/x/text/encoding/htmlindex" - "golang.org/x/text/transform" -) - -// Lookup returns the encoding with the specified label, and its canonical -// name. It returns nil and the empty string if label is not one of the -// standard encodings for HTML. Matching is case-insensitive and ignores -// leading and trailing whitespace. Encoders will use HTML escape sequences for -// runes that are not supported by the character set. -func Lookup(label string) (e encoding.Encoding, name string) { - e, err := htmlindex.Get(label) - if err != nil { - return nil, "" - } - name, _ = htmlindex.Name(e) - return &htmlEncoding{e}, name -} - -type htmlEncoding struct{ encoding.Encoding } - -func (h *htmlEncoding) NewEncoder() *encoding.Encoder { - // HTML requires a non-terminating legacy encoder. We use HTML escapes to - // substitute unsupported code points. - return encoding.HTMLEscapeUnsupported(h.Encoding.NewEncoder()) -} - -// DetermineEncoding determines the encoding of an HTML document by examining -// up to the first 1024 bytes of content and the declared Content-Type. -// -// See http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#determining-the-character-encoding -func DetermineEncoding(content []byte, contentType string) (e encoding.Encoding, name string, certain bool) { - if len(content) > 1024 { - content = content[:1024] - } - - for _, b := range boms { - if bytes.HasPrefix(content, b.bom) { - e, name = Lookup(b.enc) - return e, name, true - } - } - - if _, params, err := mime.ParseMediaType(contentType); err == nil { - if cs, ok := params["charset"]; ok { - if e, name = Lookup(cs); e != nil { - return e, name, true - } - } - } - - if len(content) > 0 { - e, name = prescan(content) - if e != nil { - return e, name, false - } - } - - // Try to detect UTF-8. - // First eliminate any partial rune at the end. - for i := len(content) - 1; i >= 0 && i > len(content)-4; i-- { - b := content[i] - if b < 0x80 { - break - } - if utf8.RuneStart(b) { - content = content[:i] - break - } - } - hasHighBit := false - for _, c := range content { - if c >= 0x80 { - hasHighBit = true - break - } - } - if hasHighBit && utf8.Valid(content) { - return encoding.Nop, "utf-8", false - } - - // TODO: change default depending on user's locale? - return charmap.Windows1252, "windows-1252", false -} - -// NewReader returns an io.Reader that converts the content of r to UTF-8. -// It calls DetermineEncoding to find out what r's encoding is. -func NewReader(r io.Reader, contentType string) (io.Reader, error) { - preview := make([]byte, 1024) - n, err := io.ReadFull(r, preview) - switch { - case err == io.ErrUnexpectedEOF: - preview = preview[:n] - r = bytes.NewReader(preview) - case err != nil: - return nil, err - default: - r = io.MultiReader(bytes.NewReader(preview), r) - } - - if e, _, _ := DetermineEncoding(preview, contentType); e != encoding.Nop { - r = transform.NewReader(r, e.NewDecoder()) - } - return r, nil -} - -// NewReaderLabel returns a reader that converts from the specified charset to -// UTF-8. It uses Lookup to find the encoding that corresponds to label, and -// returns an error if Lookup returns nil. It is suitable for use as -// encoding/xml.Decoder's CharsetReader function. -func NewReaderLabel(label string, input io.Reader) (io.Reader, error) { - e, _ := Lookup(label) - if e == nil { - return nil, fmt.Errorf("unsupported charset: %q", label) - } - return transform.NewReader(input, e.NewDecoder()), nil -} - -func prescan(content []byte) (e encoding.Encoding, name string) { - z := html.NewTokenizer(bytes.NewReader(content)) - for { - switch z.Next() { - case html.ErrorToken: - return nil, "" - - case html.StartTagToken, html.SelfClosingTagToken: - tagName, hasAttr := z.TagName() - if !bytes.Equal(tagName, []byte("meta")) { - continue - } - attrList := make(map[string]bool) - gotPragma := false - - const ( - dontKnow = iota - doNeedPragma - doNotNeedPragma - ) - needPragma := dontKnow - - name = "" - e = nil - for hasAttr { - var key, val []byte - key, val, hasAttr = z.TagAttr() - ks := string(key) - if attrList[ks] { - continue - } - attrList[ks] = true - for i, c := range val { - if 'A' <= c && c <= 'Z' { - val[i] = c + 0x20 - } - } - - switch ks { - case "http-equiv": - if bytes.Equal(val, []byte("content-type")) { - gotPragma = true - } - - case "content": - if e == nil { - name = fromMetaElement(string(val)) - if name != "" { - e, name = Lookup(name) - if e != nil { - needPragma = doNeedPragma - } - } - } - - case "charset": - e, name = Lookup(string(val)) - needPragma = doNotNeedPragma - } - } - - if needPragma == dontKnow || needPragma == doNeedPragma && !gotPragma { - continue - } - - if strings.HasPrefix(name, "utf-16") { - name = "utf-8" - e = encoding.Nop - } - - if e != nil { - return e, name - } - } - } -} - -func fromMetaElement(s string) string { - for s != "" { - csLoc := strings.Index(s, "charset") - if csLoc == -1 { - return "" - } - s = s[csLoc+len("charset"):] - s = strings.TrimLeft(s, " \t\n\f\r") - if !strings.HasPrefix(s, "=") { - continue - } - s = s[1:] - s = strings.TrimLeft(s, " \t\n\f\r") - if s == "" { - return "" - } - if q := s[0]; q == '"' || q == '\'' { - s = s[1:] - closeQuote := strings.IndexRune(s, rune(q)) - if closeQuote == -1 { - return "" - } - return s[:closeQuote] - } - - end := strings.IndexAny(s, "; \t\n\f\r") - if end == -1 { - end = len(s) - } - return s[:end] - } - return "" -} - -var boms = []struct { - bom []byte - enc string -}{ - {[]byte{0xfe, 0xff}, "utf-16be"}, - {[]byte{0xff, 0xfe}, "utf-16le"}, - {[]byte{0xef, 0xbb, 0xbf}, "utf-8"}, -} diff --git a/vendor/golang.org/x/net/html/const.go b/vendor/golang.org/x/net/html/const.go deleted file mode 100644 index 52f651ff6db8..000000000000 --- a/vendor/golang.org/x/net/html/const.go +++ /dev/null @@ -1,102 +0,0 @@ -// 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 html - -// Section 12.2.3.2 of the HTML5 specification says "The following elements -// have varying levels of special parsing rules". -// https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements -var isSpecialElementMap = map[string]bool{ - "address": true, - "applet": true, - "area": true, - "article": true, - "aside": true, - "base": true, - "basefont": true, - "bgsound": true, - "blockquote": true, - "body": true, - "br": true, - "button": true, - "caption": true, - "center": true, - "col": true, - "colgroup": true, - "dd": true, - "details": true, - "dir": true, - "div": true, - "dl": true, - "dt": true, - "embed": true, - "fieldset": true, - "figcaption": true, - "figure": true, - "footer": true, - "form": true, - "frame": true, - "frameset": true, - "h1": true, - "h2": true, - "h3": true, - "h4": true, - "h5": true, - "h6": true, - "head": true, - "header": true, - "hgroup": true, - "hr": true, - "html": true, - "iframe": true, - "img": true, - "input": true, - "isindex": true, - "li": true, - "link": true, - "listing": true, - "marquee": true, - "menu": true, - "meta": true, - "nav": true, - "noembed": true, - "noframes": true, - "noscript": true, - "object": true, - "ol": true, - "p": true, - "param": true, - "plaintext": true, - "pre": true, - "script": true, - "section": true, - "select": true, - "source": true, - "style": true, - "summary": true, - "table": true, - "tbody": true, - "td": true, - "template": true, - "textarea": true, - "tfoot": true, - "th": true, - "thead": true, - "title": true, - "tr": true, - "track": true, - "ul": true, - "wbr": true, - "xmp": true, -} - -func isSpecialElement(element *Node) bool { - switch element.Namespace { - case "", "html": - return isSpecialElementMap[element.Data] - case "svg": - return element.Data == "foreignObject" - } - return false -} diff --git a/vendor/golang.org/x/net/html/doc.go b/vendor/golang.org/x/net/html/doc.go deleted file mode 100644 index 94f496874aba..000000000000 --- a/vendor/golang.org/x/net/html/doc.go +++ /dev/null @@ -1,106 +0,0 @@ -// 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. - -/* -Package html implements an HTML5-compliant tokenizer and parser. - -Tokenization is done by creating a Tokenizer for an io.Reader r. It is the -caller's responsibility to ensure that r provides UTF-8 encoded HTML. - - z := html.NewTokenizer(r) - -Given a Tokenizer z, the HTML is tokenized by repeatedly calling z.Next(), -which parses the next token and returns its type, or an error: - - for { - tt := z.Next() - if tt == html.ErrorToken { - // ... - return ... - } - // Process the current token. - } - -There are two APIs for retrieving the current token. The high-level API is to -call Token; the low-level API is to call Text or TagName / TagAttr. Both APIs -allow optionally calling Raw after Next but before Token, Text, TagName, or -TagAttr. In EBNF notation, the valid call sequence per token is: - - Next {Raw} [ Token | Text | TagName {TagAttr} ] - -Token returns an independent data structure that completely describes a token. -Entities (such as "<") are unescaped, tag names and attribute keys are -lower-cased, and attributes are collected into a []Attribute. For example: - - for { - if z.Next() == html.ErrorToken { - // Returning io.EOF indicates success. - return z.Err() - } - emitToken(z.Token()) - } - -The low-level API performs fewer allocations and copies, but the contents of -the []byte values returned by Text, TagName and TagAttr may change on the next -call to Next. For example, to extract an HTML page's anchor text: - - depth := 0 - for { - tt := z.Next() - switch tt { - case ErrorToken: - return z.Err() - case TextToken: - if depth > 0 { - // emitBytes should copy the []byte it receives, - // if it doesn't process it immediately. - emitBytes(z.Text()) - } - case StartTagToken, EndTagToken: - tn, _ := z.TagName() - if len(tn) == 1 && tn[0] == 'a' { - if tt == StartTagToken { - depth++ - } else { - depth-- - } - } - } - } - -Parsing is done by calling Parse with an io.Reader, which returns the root of -the parse tree (the document element) as a *Node. It is the caller's -responsibility to ensure that the Reader provides UTF-8 encoded HTML. For -example, to process each anchor node in depth-first order: - - doc, err := html.Parse(r) - if err != nil { - // ... - } - var f func(*html.Node) - f = func(n *html.Node) { - if n.Type == html.ElementNode && n.Data == "a" { - // Do something with n... - } - for c := n.FirstChild; c != nil; c = c.NextSibling { - f(c) - } - } - f(doc) - -The relevant specifications include: -https://html.spec.whatwg.org/multipage/syntax.html and -https://html.spec.whatwg.org/multipage/syntax.html#tokenization -*/ -package html // import "golang.org/x/net/html" - -// The tokenization algorithm implemented by this package is not a line-by-line -// transliteration of the relatively verbose state-machine in the WHATWG -// specification. A more direct approach is used instead, where the program -// counter implies the state, such as whether it is tokenizing a tag or a text -// node. Specification compliance is verified by checking expected and actual -// outputs over a test suite rather than aiming for algorithmic fidelity. - -// TODO(nigeltao): Does a DOM API belong in this package or a separate one? -// TODO(nigeltao): How does parsing interact with a JavaScript engine? diff --git a/vendor/golang.org/x/net/html/doctype.go b/vendor/golang.org/x/net/html/doctype.go deleted file mode 100644 index c484e5a94fbf..000000000000 --- a/vendor/golang.org/x/net/html/doctype.go +++ /dev/null @@ -1,156 +0,0 @@ -// 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 html - -import ( - "strings" -) - -// parseDoctype parses the data from a DoctypeToken into a name, -// public identifier, and system identifier. It returns a Node whose Type -// is DoctypeNode, whose Data is the name, and which has attributes -// named "system" and "public" for the two identifiers if they were present. -// quirks is whether the document should be parsed in "quirks mode". -func parseDoctype(s string) (n *Node, quirks bool) { - n = &Node{Type: DoctypeNode} - - // Find the name. - space := strings.IndexAny(s, whitespace) - if space == -1 { - space = len(s) - } - n.Data = s[:space] - // The comparison to "html" is case-sensitive. - if n.Data != "html" { - quirks = true - } - n.Data = strings.ToLower(n.Data) - s = strings.TrimLeft(s[space:], whitespace) - - if len(s) < 6 { - // It can't start with "PUBLIC" or "SYSTEM". - // Ignore the rest of the string. - return n, quirks || s != "" - } - - key := strings.ToLower(s[:6]) - s = s[6:] - for key == "public" || key == "system" { - s = strings.TrimLeft(s, whitespace) - if s == "" { - break - } - quote := s[0] - if quote != '"' && quote != '\'' { - break - } - s = s[1:] - q := strings.IndexRune(s, rune(quote)) - var id string - if q == -1 { - id = s - s = "" - } else { - id = s[:q] - s = s[q+1:] - } - n.Attr = append(n.Attr, Attribute{Key: key, Val: id}) - if key == "public" { - key = "system" - } else { - key = "" - } - } - - if key != "" || s != "" { - quirks = true - } else if len(n.Attr) > 0 { - if n.Attr[0].Key == "public" { - public := strings.ToLower(n.Attr[0].Val) - switch public { - case "-//w3o//dtd w3 html strict 3.0//en//", "-/w3d/dtd html 4.0 transitional/en", "html": - quirks = true - default: - for _, q := range quirkyIDs { - if strings.HasPrefix(public, q) { - quirks = true - break - } - } - } - // The following two public IDs only cause quirks mode if there is no system ID. - if len(n.Attr) == 1 && (strings.HasPrefix(public, "-//w3c//dtd html 4.01 frameset//") || - strings.HasPrefix(public, "-//w3c//dtd html 4.01 transitional//")) { - quirks = true - } - } - if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && - strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { - quirks = true - } - } - - return n, quirks -} - -// quirkyIDs is a list of public doctype identifiers that cause a document -// to be interpreted in quirks mode. The identifiers should be in lower case. -var quirkyIDs = []string{ - "+//silmaril//dtd html pro v0r11 19970101//", - "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", - "-//as//dtd html 3.0 aswedit + extensions//", - "-//ietf//dtd html 2.0 level 1//", - "-//ietf//dtd html 2.0 level 2//", - "-//ietf//dtd html 2.0 strict level 1//", - "-//ietf//dtd html 2.0 strict level 2//", - "-//ietf//dtd html 2.0 strict//", - "-//ietf//dtd html 2.0//", - "-//ietf//dtd html 2.1e//", - "-//ietf//dtd html 3.0//", - "-//ietf//dtd html 3.2 final//", - "-//ietf//dtd html 3.2//", - "-//ietf//dtd html 3//", - "-//ietf//dtd html level 0//", - "-//ietf//dtd html level 1//", - "-//ietf//dtd html level 2//", - "-//ietf//dtd html level 3//", - "-//ietf//dtd html strict level 0//", - "-//ietf//dtd html strict level 1//", - "-//ietf//dtd html strict level 2//", - "-//ietf//dtd html strict level 3//", - "-//ietf//dtd html strict//", - "-//ietf//dtd html//", - "-//metrius//dtd metrius presentational//", - "-//microsoft//dtd internet explorer 2.0 html strict//", - "-//microsoft//dtd internet explorer 2.0 html//", - "-//microsoft//dtd internet explorer 2.0 tables//", - "-//microsoft//dtd internet explorer 3.0 html strict//", - "-//microsoft//dtd internet explorer 3.0 html//", - "-//microsoft//dtd internet explorer 3.0 tables//", - "-//netscape comm. corp.//dtd html//", - "-//netscape comm. corp.//dtd strict html//", - "-//o'reilly and associates//dtd html 2.0//", - "-//o'reilly and associates//dtd html extended 1.0//", - "-//o'reilly and associates//dtd html extended relaxed 1.0//", - "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", - "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", - "-//spyglass//dtd html 2.0 extended//", - "-//sq//dtd html 2.0 hotmetal + extensions//", - "-//sun microsystems corp.//dtd hotjava html//", - "-//sun microsystems corp.//dtd hotjava strict html//", - "-//w3c//dtd html 3 1995-03-24//", - "-//w3c//dtd html 3.2 draft//", - "-//w3c//dtd html 3.2 final//", - "-//w3c//dtd html 3.2//", - "-//w3c//dtd html 3.2s draft//", - "-//w3c//dtd html 4.0 frameset//", - "-//w3c//dtd html 4.0 transitional//", - "-//w3c//dtd html experimental 19960712//", - "-//w3c//dtd html experimental 970421//", - "-//w3c//dtd w3 html//", - "-//w3o//dtd w3 html 3.0//", - "-//webtechs//dtd mozilla html 2.0//", - "-//webtechs//dtd mozilla html//", -} diff --git a/vendor/golang.org/x/net/html/entity.go b/vendor/golang.org/x/net/html/entity.go deleted file mode 100644 index a50c04c60e95..000000000000 --- a/vendor/golang.org/x/net/html/entity.go +++ /dev/null @@ -1,2253 +0,0 @@ -// 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. - -package html - -// All entities that do not end with ';' are 6 or fewer bytes long. -const longestEntityWithoutSemicolon = 6 - -// entity is a map from HTML entity names to their values. The semicolon matters: -// https://html.spec.whatwg.org/multipage/syntax.html#named-character-references -// lists both "amp" and "amp;" as two separate entries. -// -// Note that the HTML5 list is larger than the HTML4 list at -// http://www.w3.org/TR/html4/sgml/entities.html -var entity = map[string]rune{ - "AElig;": '\U000000C6', - "AMP;": '\U00000026', - "Aacute;": '\U000000C1', - "Abreve;": '\U00000102', - "Acirc;": '\U000000C2', - "Acy;": '\U00000410', - "Afr;": '\U0001D504', - "Agrave;": '\U000000C0', - "Alpha;": '\U00000391', - "Amacr;": '\U00000100', - "And;": '\U00002A53', - "Aogon;": '\U00000104', - "Aopf;": '\U0001D538', - "ApplyFunction;": '\U00002061', - "Aring;": '\U000000C5', - "Ascr;": '\U0001D49C', - "Assign;": '\U00002254', - "Atilde;": '\U000000C3', - "Auml;": '\U000000C4', - "Backslash;": '\U00002216', - "Barv;": '\U00002AE7', - "Barwed;": '\U00002306', - "Bcy;": '\U00000411', - "Because;": '\U00002235', - "Bernoullis;": '\U0000212C', - "Beta;": '\U00000392', - "Bfr;": '\U0001D505', - "Bopf;": '\U0001D539', - "Breve;": '\U000002D8', - "Bscr;": '\U0000212C', - "Bumpeq;": '\U0000224E', - "CHcy;": '\U00000427', - "COPY;": '\U000000A9', - "Cacute;": '\U00000106', - "Cap;": '\U000022D2', - "CapitalDifferentialD;": '\U00002145', - "Cayleys;": '\U0000212D', - "Ccaron;": '\U0000010C', - "Ccedil;": '\U000000C7', - "Ccirc;": '\U00000108', - "Cconint;": '\U00002230', - "Cdot;": '\U0000010A', - "Cedilla;": '\U000000B8', - "CenterDot;": '\U000000B7', - "Cfr;": '\U0000212D', - "Chi;": '\U000003A7', - "CircleDot;": '\U00002299', - "CircleMinus;": '\U00002296', - "CirclePlus;": '\U00002295', - "CircleTimes;": '\U00002297', - "ClockwiseContourIntegral;": '\U00002232', - "CloseCurlyDoubleQuote;": '\U0000201D', - "CloseCurlyQuote;": '\U00002019', - "Colon;": '\U00002237', - "Colone;": '\U00002A74', - "Congruent;": '\U00002261', - "Conint;": '\U0000222F', - "ContourIntegral;": '\U0000222E', - "Copf;": '\U00002102', - "Coproduct;": '\U00002210', - "CounterClockwiseContourIntegral;": '\U00002233', - "Cross;": '\U00002A2F', - "Cscr;": '\U0001D49E', - "Cup;": '\U000022D3', - "CupCap;": '\U0000224D', - "DD;": '\U00002145', - "DDotrahd;": '\U00002911', - "DJcy;": '\U00000402', - "DScy;": '\U00000405', - "DZcy;": '\U0000040F', - "Dagger;": '\U00002021', - "Darr;": '\U000021A1', - "Dashv;": '\U00002AE4', - "Dcaron;": '\U0000010E', - "Dcy;": '\U00000414', - "Del;": '\U00002207', - "Delta;": '\U00000394', - "Dfr;": '\U0001D507', - "DiacriticalAcute;": '\U000000B4', - "DiacriticalDot;": '\U000002D9', - "DiacriticalDoubleAcute;": '\U000002DD', - "DiacriticalGrave;": '\U00000060', - "DiacriticalTilde;": '\U000002DC', - "Diamond;": '\U000022C4', - "DifferentialD;": '\U00002146', - "Dopf;": '\U0001D53B', - "Dot;": '\U000000A8', - "DotDot;": '\U000020DC', - "DotEqual;": '\U00002250', - "DoubleContourIntegral;": '\U0000222F', - "DoubleDot;": '\U000000A8', - "DoubleDownArrow;": '\U000021D3', - "DoubleLeftArrow;": '\U000021D0', - "DoubleLeftRightArrow;": '\U000021D4', - "DoubleLeftTee;": '\U00002AE4', - "DoubleLongLeftArrow;": '\U000027F8', - "DoubleLongLeftRightArrow;": '\U000027FA', - "DoubleLongRightArrow;": '\U000027F9', - "DoubleRightArrow;": '\U000021D2', - "DoubleRightTee;": '\U000022A8', - "DoubleUpArrow;": '\U000021D1', - "DoubleUpDownArrow;": '\U000021D5', - "DoubleVerticalBar;": '\U00002225', - "DownArrow;": '\U00002193', - "DownArrowBar;": '\U00002913', - "DownArrowUpArrow;": '\U000021F5', - "DownBreve;": '\U00000311', - "DownLeftRightVector;": '\U00002950', - "DownLeftTeeVector;": '\U0000295E', - "DownLeftVector;": '\U000021BD', - "DownLeftVectorBar;": '\U00002956', - "DownRightTeeVector;": '\U0000295F', - "DownRightVector;": '\U000021C1', - "DownRightVectorBar;": '\U00002957', - "DownTee;": '\U000022A4', - "DownTeeArrow;": '\U000021A7', - "Downarrow;": '\U000021D3', - "Dscr;": '\U0001D49F', - "Dstrok;": '\U00000110', - "ENG;": '\U0000014A', - "ETH;": '\U000000D0', - "Eacute;": '\U000000C9', - "Ecaron;": '\U0000011A', - "Ecirc;": '\U000000CA', - "Ecy;": '\U0000042D', - "Edot;": '\U00000116', - "Efr;": '\U0001D508', - "Egrave;": '\U000000C8', - "Element;": '\U00002208', - "Emacr;": '\U00000112', - "EmptySmallSquare;": '\U000025FB', - "EmptyVerySmallSquare;": '\U000025AB', - "Eogon;": '\U00000118', - "Eopf;": '\U0001D53C', - "Epsilon;": '\U00000395', - "Equal;": '\U00002A75', - "EqualTilde;": '\U00002242', - "Equilibrium;": '\U000021CC', - "Escr;": '\U00002130', - "Esim;": '\U00002A73', - "Eta;": '\U00000397', - "Euml;": '\U000000CB', - "Exists;": '\U00002203', - "ExponentialE;": '\U00002147', - "Fcy;": '\U00000424', - "Ffr;": '\U0001D509', - "FilledSmallSquare;": '\U000025FC', - "FilledVerySmallSquare;": '\U000025AA', - "Fopf;": '\U0001D53D', - "ForAll;": '\U00002200', - "Fouriertrf;": '\U00002131', - "Fscr;": '\U00002131', - "GJcy;": '\U00000403', - "GT;": '\U0000003E', - "Gamma;": '\U00000393', - "Gammad;": '\U000003DC', - "Gbreve;": '\U0000011E', - "Gcedil;": '\U00000122', - "Gcirc;": '\U0000011C', - "Gcy;": '\U00000413', - "Gdot;": '\U00000120', - "Gfr;": '\U0001D50A', - "Gg;": '\U000022D9', - "Gopf;": '\U0001D53E', - "GreaterEqual;": '\U00002265', - "GreaterEqualLess;": '\U000022DB', - "GreaterFullEqual;": '\U00002267', - "GreaterGreater;": '\U00002AA2', - "GreaterLess;": '\U00002277', - "GreaterSlantEqual;": '\U00002A7E', - "GreaterTilde;": '\U00002273', - "Gscr;": '\U0001D4A2', - "Gt;": '\U0000226B', - "HARDcy;": '\U0000042A', - "Hacek;": '\U000002C7', - "Hat;": '\U0000005E', - "Hcirc;": '\U00000124', - "Hfr;": '\U0000210C', - "HilbertSpace;": '\U0000210B', - "Hopf;": '\U0000210D', - "HorizontalLine;": '\U00002500', - "Hscr;": '\U0000210B', - "Hstrok;": '\U00000126', - "HumpDownHump;": '\U0000224E', - "HumpEqual;": '\U0000224F', - "IEcy;": '\U00000415', - "IJlig;": '\U00000132', - "IOcy;": '\U00000401', - "Iacute;": '\U000000CD', - "Icirc;": '\U000000CE', - "Icy;": '\U00000418', - "Idot;": '\U00000130', - "Ifr;": '\U00002111', - "Igrave;": '\U000000CC', - "Im;": '\U00002111', - "Imacr;": '\U0000012A', - "ImaginaryI;": '\U00002148', - "Implies;": '\U000021D2', - "Int;": '\U0000222C', - "Integral;": '\U0000222B', - "Intersection;": '\U000022C2', - "InvisibleComma;": '\U00002063', - "InvisibleTimes;": '\U00002062', - "Iogon;": '\U0000012E', - "Iopf;": '\U0001D540', - "Iota;": '\U00000399', - "Iscr;": '\U00002110', - "Itilde;": '\U00000128', - "Iukcy;": '\U00000406', - "Iuml;": '\U000000CF', - "Jcirc;": '\U00000134', - "Jcy;": '\U00000419', - "Jfr;": '\U0001D50D', - "Jopf;": '\U0001D541', - "Jscr;": '\U0001D4A5', - "Jsercy;": '\U00000408', - "Jukcy;": '\U00000404', - "KHcy;": '\U00000425', - "KJcy;": '\U0000040C', - "Kappa;": '\U0000039A', - "Kcedil;": '\U00000136', - "Kcy;": '\U0000041A', - "Kfr;": '\U0001D50E', - "Kopf;": '\U0001D542', - "Kscr;": '\U0001D4A6', - "LJcy;": '\U00000409', - "LT;": '\U0000003C', - "Lacute;": '\U00000139', - "Lambda;": '\U0000039B', - "Lang;": '\U000027EA', - "Laplacetrf;": '\U00002112', - "Larr;": '\U0000219E', - "Lcaron;": '\U0000013D', - "Lcedil;": '\U0000013B', - "Lcy;": '\U0000041B', - "LeftAngleBracket;": '\U000027E8', - "LeftArrow;": '\U00002190', - "LeftArrowBar;": '\U000021E4', - "LeftArrowRightArrow;": '\U000021C6', - "LeftCeiling;": '\U00002308', - "LeftDoubleBracket;": '\U000027E6', - "LeftDownTeeVector;": '\U00002961', - "LeftDownVector;": '\U000021C3', - "LeftDownVectorBar;": '\U00002959', - "LeftFloor;": '\U0000230A', - "LeftRightArrow;": '\U00002194', - "LeftRightVector;": '\U0000294E', - "LeftTee;": '\U000022A3', - "LeftTeeArrow;": '\U000021A4', - "LeftTeeVector;": '\U0000295A', - "LeftTriangle;": '\U000022B2', - "LeftTriangleBar;": '\U000029CF', - "LeftTriangleEqual;": '\U000022B4', - "LeftUpDownVector;": '\U00002951', - "LeftUpTeeVector;": '\U00002960', - "LeftUpVector;": '\U000021BF', - "LeftUpVectorBar;": '\U00002958', - "LeftVector;": '\U000021BC', - "LeftVectorBar;": '\U00002952', - "Leftarrow;": '\U000021D0', - "Leftrightarrow;": '\U000021D4', - "LessEqualGreater;": '\U000022DA', - "LessFullEqual;": '\U00002266', - "LessGreater;": '\U00002276', - "LessLess;": '\U00002AA1', - "LessSlantEqual;": '\U00002A7D', - "LessTilde;": '\U00002272', - "Lfr;": '\U0001D50F', - "Ll;": '\U000022D8', - "Lleftarrow;": '\U000021DA', - "Lmidot;": '\U0000013F', - "LongLeftArrow;": '\U000027F5', - "LongLeftRightArrow;": '\U000027F7', - "LongRightArrow;": '\U000027F6', - "Longleftarrow;": '\U000027F8', - "Longleftrightarrow;": '\U000027FA', - "Longrightarrow;": '\U000027F9', - "Lopf;": '\U0001D543', - "LowerLeftArrow;": '\U00002199', - "LowerRightArrow;": '\U00002198', - "Lscr;": '\U00002112', - "Lsh;": '\U000021B0', - "Lstrok;": '\U00000141', - "Lt;": '\U0000226A', - "Map;": '\U00002905', - "Mcy;": '\U0000041C', - "MediumSpace;": '\U0000205F', - "Mellintrf;": '\U00002133', - "Mfr;": '\U0001D510', - "MinusPlus;": '\U00002213', - "Mopf;": '\U0001D544', - "Mscr;": '\U00002133', - "Mu;": '\U0000039C', - "NJcy;": '\U0000040A', - "Nacute;": '\U00000143', - "Ncaron;": '\U00000147', - "Ncedil;": '\U00000145', - "Ncy;": '\U0000041D', - "NegativeMediumSpace;": '\U0000200B', - "NegativeThickSpace;": '\U0000200B', - "NegativeThinSpace;": '\U0000200B', - "NegativeVeryThinSpace;": '\U0000200B', - "NestedGreaterGreater;": '\U0000226B', - "NestedLessLess;": '\U0000226A', - "NewLine;": '\U0000000A', - "Nfr;": '\U0001D511', - "NoBreak;": '\U00002060', - "NonBreakingSpace;": '\U000000A0', - "Nopf;": '\U00002115', - "Not;": '\U00002AEC', - "NotCongruent;": '\U00002262', - "NotCupCap;": '\U0000226D', - "NotDoubleVerticalBar;": '\U00002226', - "NotElement;": '\U00002209', - "NotEqual;": '\U00002260', - "NotExists;": '\U00002204', - "NotGreater;": '\U0000226F', - "NotGreaterEqual;": '\U00002271', - "NotGreaterLess;": '\U00002279', - "NotGreaterTilde;": '\U00002275', - "NotLeftTriangle;": '\U000022EA', - "NotLeftTriangleEqual;": '\U000022EC', - "NotLess;": '\U0000226E', - "NotLessEqual;": '\U00002270', - "NotLessGreater;": '\U00002278', - "NotLessTilde;": '\U00002274', - "NotPrecedes;": '\U00002280', - "NotPrecedesSlantEqual;": '\U000022E0', - "NotReverseElement;": '\U0000220C', - "NotRightTriangle;": '\U000022EB', - "NotRightTriangleEqual;": '\U000022ED', - "NotSquareSubsetEqual;": '\U000022E2', - "NotSquareSupersetEqual;": '\U000022E3', - "NotSubsetEqual;": '\U00002288', - "NotSucceeds;": '\U00002281', - "NotSucceedsSlantEqual;": '\U000022E1', - "NotSupersetEqual;": '\U00002289', - "NotTilde;": '\U00002241', - "NotTildeEqual;": '\U00002244', - "NotTildeFullEqual;": '\U00002247', - "NotTildeTilde;": '\U00002249', - "NotVerticalBar;": '\U00002224', - "Nscr;": '\U0001D4A9', - "Ntilde;": '\U000000D1', - "Nu;": '\U0000039D', - "OElig;": '\U00000152', - "Oacute;": '\U000000D3', - "Ocirc;": '\U000000D4', - "Ocy;": '\U0000041E', - "Odblac;": '\U00000150', - "Ofr;": '\U0001D512', - "Ograve;": '\U000000D2', - "Omacr;": '\U0000014C', - "Omega;": '\U000003A9', - "Omicron;": '\U0000039F', - "Oopf;": '\U0001D546', - "OpenCurlyDoubleQuote;": '\U0000201C', - "OpenCurlyQuote;": '\U00002018', - "Or;": '\U00002A54', - "Oscr;": '\U0001D4AA', - "Oslash;": '\U000000D8', - "Otilde;": '\U000000D5', - "Otimes;": '\U00002A37', - "Ouml;": '\U000000D6', - "OverBar;": '\U0000203E', - "OverBrace;": '\U000023DE', - "OverBracket;": '\U000023B4', - "OverParenthesis;": '\U000023DC', - "PartialD;": '\U00002202', - "Pcy;": '\U0000041F', - "Pfr;": '\U0001D513', - "Phi;": '\U000003A6', - "Pi;": '\U000003A0', - "PlusMinus;": '\U000000B1', - "Poincareplane;": '\U0000210C', - "Popf;": '\U00002119', - "Pr;": '\U00002ABB', - "Precedes;": '\U0000227A', - "PrecedesEqual;": '\U00002AAF', - "PrecedesSlantEqual;": '\U0000227C', - "PrecedesTilde;": '\U0000227E', - "Prime;": '\U00002033', - "Product;": '\U0000220F', - "Proportion;": '\U00002237', - "Proportional;": '\U0000221D', - "Pscr;": '\U0001D4AB', - "Psi;": '\U000003A8', - "QUOT;": '\U00000022', - "Qfr;": '\U0001D514', - "Qopf;": '\U0000211A', - "Qscr;": '\U0001D4AC', - "RBarr;": '\U00002910', - "REG;": '\U000000AE', - "Racute;": '\U00000154', - "Rang;": '\U000027EB', - "Rarr;": '\U000021A0', - "Rarrtl;": '\U00002916', - "Rcaron;": '\U00000158', - "Rcedil;": '\U00000156', - "Rcy;": '\U00000420', - "Re;": '\U0000211C', - "ReverseElement;": '\U0000220B', - "ReverseEquilibrium;": '\U000021CB', - "ReverseUpEquilibrium;": '\U0000296F', - "Rfr;": '\U0000211C', - "Rho;": '\U000003A1', - "RightAngleBracket;": '\U000027E9', - "RightArrow;": '\U00002192', - "RightArrowBar;": '\U000021E5', - "RightArrowLeftArrow;": '\U000021C4', - "RightCeiling;": '\U00002309', - "RightDoubleBracket;": '\U000027E7', - "RightDownTeeVector;": '\U0000295D', - "RightDownVector;": '\U000021C2', - "RightDownVectorBar;": '\U00002955', - "RightFloor;": '\U0000230B', - "RightTee;": '\U000022A2', - "RightTeeArrow;": '\U000021A6', - "RightTeeVector;": '\U0000295B', - "RightTriangle;": '\U000022B3', - "RightTriangleBar;": '\U000029D0', - "RightTriangleEqual;": '\U000022B5', - "RightUpDownVector;": '\U0000294F', - "RightUpTeeVector;": '\U0000295C', - "RightUpVector;": '\U000021BE', - "RightUpVectorBar;": '\U00002954', - "RightVector;": '\U000021C0', - "RightVectorBar;": '\U00002953', - "Rightarrow;": '\U000021D2', - "Ropf;": '\U0000211D', - "RoundImplies;": '\U00002970', - "Rrightarrow;": '\U000021DB', - "Rscr;": '\U0000211B', - "Rsh;": '\U000021B1', - "RuleDelayed;": '\U000029F4', - "SHCHcy;": '\U00000429', - "SHcy;": '\U00000428', - "SOFTcy;": '\U0000042C', - "Sacute;": '\U0000015A', - "Sc;": '\U00002ABC', - "Scaron;": '\U00000160', - "Scedil;": '\U0000015E', - "Scirc;": '\U0000015C', - "Scy;": '\U00000421', - "Sfr;": '\U0001D516', - "ShortDownArrow;": '\U00002193', - "ShortLeftArrow;": '\U00002190', - "ShortRightArrow;": '\U00002192', - "ShortUpArrow;": '\U00002191', - "Sigma;": '\U000003A3', - "SmallCircle;": '\U00002218', - "Sopf;": '\U0001D54A', - "Sqrt;": '\U0000221A', - "Square;": '\U000025A1', - "SquareIntersection;": '\U00002293', - "SquareSubset;": '\U0000228F', - "SquareSubsetEqual;": '\U00002291', - "SquareSuperset;": '\U00002290', - "SquareSupersetEqual;": '\U00002292', - "SquareUnion;": '\U00002294', - "Sscr;": '\U0001D4AE', - "Star;": '\U000022C6', - "Sub;": '\U000022D0', - "Subset;": '\U000022D0', - "SubsetEqual;": '\U00002286', - "Succeeds;": '\U0000227B', - "SucceedsEqual;": '\U00002AB0', - "SucceedsSlantEqual;": '\U0000227D', - "SucceedsTilde;": '\U0000227F', - "SuchThat;": '\U0000220B', - "Sum;": '\U00002211', - "Sup;": '\U000022D1', - "Superset;": '\U00002283', - "SupersetEqual;": '\U00002287', - "Supset;": '\U000022D1', - "THORN;": '\U000000DE', - "TRADE;": '\U00002122', - "TSHcy;": '\U0000040B', - "TScy;": '\U00000426', - "Tab;": '\U00000009', - "Tau;": '\U000003A4', - "Tcaron;": '\U00000164', - "Tcedil;": '\U00000162', - "Tcy;": '\U00000422', - "Tfr;": '\U0001D517', - "Therefore;": '\U00002234', - "Theta;": '\U00000398', - "ThinSpace;": '\U00002009', - "Tilde;": '\U0000223C', - "TildeEqual;": '\U00002243', - "TildeFullEqual;": '\U00002245', - "TildeTilde;": '\U00002248', - "Topf;": '\U0001D54B', - "TripleDot;": '\U000020DB', - "Tscr;": '\U0001D4AF', - "Tstrok;": '\U00000166', - "Uacute;": '\U000000DA', - "Uarr;": '\U0000219F', - "Uarrocir;": '\U00002949', - "Ubrcy;": '\U0000040E', - "Ubreve;": '\U0000016C', - "Ucirc;": '\U000000DB', - "Ucy;": '\U00000423', - "Udblac;": '\U00000170', - "Ufr;": '\U0001D518', - "Ugrave;": '\U000000D9', - "Umacr;": '\U0000016A', - "UnderBar;": '\U0000005F', - "UnderBrace;": '\U000023DF', - "UnderBracket;": '\U000023B5', - "UnderParenthesis;": '\U000023DD', - "Union;": '\U000022C3', - "UnionPlus;": '\U0000228E', - "Uogon;": '\U00000172', - "Uopf;": '\U0001D54C', - "UpArrow;": '\U00002191', - "UpArrowBar;": '\U00002912', - "UpArrowDownArrow;": '\U000021C5', - "UpDownArrow;": '\U00002195', - "UpEquilibrium;": '\U0000296E', - "UpTee;": '\U000022A5', - "UpTeeArrow;": '\U000021A5', - "Uparrow;": '\U000021D1', - "Updownarrow;": '\U000021D5', - "UpperLeftArrow;": '\U00002196', - "UpperRightArrow;": '\U00002197', - "Upsi;": '\U000003D2', - "Upsilon;": '\U000003A5', - "Uring;": '\U0000016E', - "Uscr;": '\U0001D4B0', - "Utilde;": '\U00000168', - "Uuml;": '\U000000DC', - "VDash;": '\U000022AB', - "Vbar;": '\U00002AEB', - "Vcy;": '\U00000412', - "Vdash;": '\U000022A9', - "Vdashl;": '\U00002AE6', - "Vee;": '\U000022C1', - "Verbar;": '\U00002016', - "Vert;": '\U00002016', - "VerticalBar;": '\U00002223', - "VerticalLine;": '\U0000007C', - "VerticalSeparator;": '\U00002758', - "VerticalTilde;": '\U00002240', - "VeryThinSpace;": '\U0000200A', - "Vfr;": '\U0001D519', - "Vopf;": '\U0001D54D', - "Vscr;": '\U0001D4B1', - "Vvdash;": '\U000022AA', - "Wcirc;": '\U00000174', - "Wedge;": '\U000022C0', - "Wfr;": '\U0001D51A', - "Wopf;": '\U0001D54E', - "Wscr;": '\U0001D4B2', - "Xfr;": '\U0001D51B', - "Xi;": '\U0000039E', - "Xopf;": '\U0001D54F', - "Xscr;": '\U0001D4B3', - "YAcy;": '\U0000042F', - "YIcy;": '\U00000407', - "YUcy;": '\U0000042E', - "Yacute;": '\U000000DD', - "Ycirc;": '\U00000176', - "Ycy;": '\U0000042B', - "Yfr;": '\U0001D51C', - "Yopf;": '\U0001D550', - "Yscr;": '\U0001D4B4', - "Yuml;": '\U00000178', - "ZHcy;": '\U00000416', - "Zacute;": '\U00000179', - "Zcaron;": '\U0000017D', - "Zcy;": '\U00000417', - "Zdot;": '\U0000017B', - "ZeroWidthSpace;": '\U0000200B', - "Zeta;": '\U00000396', - "Zfr;": '\U00002128', - "Zopf;": '\U00002124', - "Zscr;": '\U0001D4B5', - "aacute;": '\U000000E1', - "abreve;": '\U00000103', - "ac;": '\U0000223E', - "acd;": '\U0000223F', - "acirc;": '\U000000E2', - "acute;": '\U000000B4', - "acy;": '\U00000430', - "aelig;": '\U000000E6', - "af;": '\U00002061', - "afr;": '\U0001D51E', - "agrave;": '\U000000E0', - "alefsym;": '\U00002135', - "aleph;": '\U00002135', - "alpha;": '\U000003B1', - "amacr;": '\U00000101', - "amalg;": '\U00002A3F', - "amp;": '\U00000026', - "and;": '\U00002227', - "andand;": '\U00002A55', - "andd;": '\U00002A5C', - "andslope;": '\U00002A58', - "andv;": '\U00002A5A', - "ang;": '\U00002220', - "ange;": '\U000029A4', - "angle;": '\U00002220', - "angmsd;": '\U00002221', - "angmsdaa;": '\U000029A8', - "angmsdab;": '\U000029A9', - "angmsdac;": '\U000029AA', - "angmsdad;": '\U000029AB', - "angmsdae;": '\U000029AC', - "angmsdaf;": '\U000029AD', - "angmsdag;": '\U000029AE', - "angmsdah;": '\U000029AF', - "angrt;": '\U0000221F', - "angrtvb;": '\U000022BE', - "angrtvbd;": '\U0000299D', - "angsph;": '\U00002222', - "angst;": '\U000000C5', - "angzarr;": '\U0000237C', - "aogon;": '\U00000105', - "aopf;": '\U0001D552', - "ap;": '\U00002248', - "apE;": '\U00002A70', - "apacir;": '\U00002A6F', - "ape;": '\U0000224A', - "apid;": '\U0000224B', - "apos;": '\U00000027', - "approx;": '\U00002248', - "approxeq;": '\U0000224A', - "aring;": '\U000000E5', - "ascr;": '\U0001D4B6', - "ast;": '\U0000002A', - "asymp;": '\U00002248', - "asympeq;": '\U0000224D', - "atilde;": '\U000000E3', - "auml;": '\U000000E4', - "awconint;": '\U00002233', - "awint;": '\U00002A11', - "bNot;": '\U00002AED', - "backcong;": '\U0000224C', - "backepsilon;": '\U000003F6', - "backprime;": '\U00002035', - "backsim;": '\U0000223D', - "backsimeq;": '\U000022CD', - "barvee;": '\U000022BD', - "barwed;": '\U00002305', - "barwedge;": '\U00002305', - "bbrk;": '\U000023B5', - "bbrktbrk;": '\U000023B6', - "bcong;": '\U0000224C', - "bcy;": '\U00000431', - "bdquo;": '\U0000201E', - "becaus;": '\U00002235', - "because;": '\U00002235', - "bemptyv;": '\U000029B0', - "bepsi;": '\U000003F6', - "bernou;": '\U0000212C', - "beta;": '\U000003B2', - "beth;": '\U00002136', - "between;": '\U0000226C', - "bfr;": '\U0001D51F', - "bigcap;": '\U000022C2', - "bigcirc;": '\U000025EF', - "bigcup;": '\U000022C3', - "bigodot;": '\U00002A00', - "bigoplus;": '\U00002A01', - "bigotimes;": '\U00002A02', - "bigsqcup;": '\U00002A06', - "bigstar;": '\U00002605', - "bigtriangledown;": '\U000025BD', - "bigtriangleup;": '\U000025B3', - "biguplus;": '\U00002A04', - "bigvee;": '\U000022C1', - "bigwedge;": '\U000022C0', - "bkarow;": '\U0000290D', - "blacklozenge;": '\U000029EB', - "blacksquare;": '\U000025AA', - "blacktriangle;": '\U000025B4', - "blacktriangledown;": '\U000025BE', - "blacktriangleleft;": '\U000025C2', - "blacktriangleright;": '\U000025B8', - "blank;": '\U00002423', - "blk12;": '\U00002592', - "blk14;": '\U00002591', - "blk34;": '\U00002593', - "block;": '\U00002588', - "bnot;": '\U00002310', - "bopf;": '\U0001D553', - "bot;": '\U000022A5', - "bottom;": '\U000022A5', - "bowtie;": '\U000022C8', - "boxDL;": '\U00002557', - "boxDR;": '\U00002554', - "boxDl;": '\U00002556', - "boxDr;": '\U00002553', - "boxH;": '\U00002550', - "boxHD;": '\U00002566', - "boxHU;": '\U00002569', - "boxHd;": '\U00002564', - "boxHu;": '\U00002567', - "boxUL;": '\U0000255D', - "boxUR;": '\U0000255A', - "boxUl;": '\U0000255C', - "boxUr;": '\U00002559', - "boxV;": '\U00002551', - "boxVH;": '\U0000256C', - "boxVL;": '\U00002563', - "boxVR;": '\U00002560', - "boxVh;": '\U0000256B', - "boxVl;": '\U00002562', - "boxVr;": '\U0000255F', - "boxbox;": '\U000029C9', - "boxdL;": '\U00002555', - "boxdR;": '\U00002552', - "boxdl;": '\U00002510', - "boxdr;": '\U0000250C', - "boxh;": '\U00002500', - "boxhD;": '\U00002565', - "boxhU;": '\U00002568', - "boxhd;": '\U0000252C', - "boxhu;": '\U00002534', - "boxminus;": '\U0000229F', - "boxplus;": '\U0000229E', - "boxtimes;": '\U000022A0', - "boxuL;": '\U0000255B', - "boxuR;": '\U00002558', - "boxul;": '\U00002518', - "boxur;": '\U00002514', - "boxv;": '\U00002502', - "boxvH;": '\U0000256A', - "boxvL;": '\U00002561', - "boxvR;": '\U0000255E', - "boxvh;": '\U0000253C', - "boxvl;": '\U00002524', - "boxvr;": '\U0000251C', - "bprime;": '\U00002035', - "breve;": '\U000002D8', - "brvbar;": '\U000000A6', - "bscr;": '\U0001D4B7', - "bsemi;": '\U0000204F', - "bsim;": '\U0000223D', - "bsime;": '\U000022CD', - "bsol;": '\U0000005C', - "bsolb;": '\U000029C5', - "bsolhsub;": '\U000027C8', - "bull;": '\U00002022', - "bullet;": '\U00002022', - "bump;": '\U0000224E', - "bumpE;": '\U00002AAE', - "bumpe;": '\U0000224F', - "bumpeq;": '\U0000224F', - "cacute;": '\U00000107', - "cap;": '\U00002229', - "capand;": '\U00002A44', - "capbrcup;": '\U00002A49', - "capcap;": '\U00002A4B', - "capcup;": '\U00002A47', - "capdot;": '\U00002A40', - "caret;": '\U00002041', - "caron;": '\U000002C7', - "ccaps;": '\U00002A4D', - "ccaron;": '\U0000010D', - "ccedil;": '\U000000E7', - "ccirc;": '\U00000109', - "ccups;": '\U00002A4C', - "ccupssm;": '\U00002A50', - "cdot;": '\U0000010B', - "cedil;": '\U000000B8', - "cemptyv;": '\U000029B2', - "cent;": '\U000000A2', - "centerdot;": '\U000000B7', - "cfr;": '\U0001D520', - "chcy;": '\U00000447', - "check;": '\U00002713', - "checkmark;": '\U00002713', - "chi;": '\U000003C7', - "cir;": '\U000025CB', - "cirE;": '\U000029C3', - "circ;": '\U000002C6', - "circeq;": '\U00002257', - "circlearrowleft;": '\U000021BA', - "circlearrowright;": '\U000021BB', - "circledR;": '\U000000AE', - "circledS;": '\U000024C8', - "circledast;": '\U0000229B', - "circledcirc;": '\U0000229A', - "circleddash;": '\U0000229D', - "cire;": '\U00002257', - "cirfnint;": '\U00002A10', - "cirmid;": '\U00002AEF', - "cirscir;": '\U000029C2', - "clubs;": '\U00002663', - "clubsuit;": '\U00002663', - "colon;": '\U0000003A', - "colone;": '\U00002254', - "coloneq;": '\U00002254', - "comma;": '\U0000002C', - "commat;": '\U00000040', - "comp;": '\U00002201', - "compfn;": '\U00002218', - "complement;": '\U00002201', - "complexes;": '\U00002102', - "cong;": '\U00002245', - "congdot;": '\U00002A6D', - "conint;": '\U0000222E', - "copf;": '\U0001D554', - "coprod;": '\U00002210', - "copy;": '\U000000A9', - "copysr;": '\U00002117', - "crarr;": '\U000021B5', - "cross;": '\U00002717', - "cscr;": '\U0001D4B8', - "csub;": '\U00002ACF', - "csube;": '\U00002AD1', - "csup;": '\U00002AD0', - "csupe;": '\U00002AD2', - "ctdot;": '\U000022EF', - "cudarrl;": '\U00002938', - "cudarrr;": '\U00002935', - "cuepr;": '\U000022DE', - "cuesc;": '\U000022DF', - "cularr;": '\U000021B6', - "cularrp;": '\U0000293D', - "cup;": '\U0000222A', - "cupbrcap;": '\U00002A48', - "cupcap;": '\U00002A46', - "cupcup;": '\U00002A4A', - "cupdot;": '\U0000228D', - "cupor;": '\U00002A45', - "curarr;": '\U000021B7', - "curarrm;": '\U0000293C', - "curlyeqprec;": '\U000022DE', - "curlyeqsucc;": '\U000022DF', - "curlyvee;": '\U000022CE', - "curlywedge;": '\U000022CF', - "curren;": '\U000000A4', - "curvearrowleft;": '\U000021B6', - "curvearrowright;": '\U000021B7', - "cuvee;": '\U000022CE', - "cuwed;": '\U000022CF', - "cwconint;": '\U00002232', - "cwint;": '\U00002231', - "cylcty;": '\U0000232D', - "dArr;": '\U000021D3', - "dHar;": '\U00002965', - "dagger;": '\U00002020', - "daleth;": '\U00002138', - "darr;": '\U00002193', - "dash;": '\U00002010', - "dashv;": '\U000022A3', - "dbkarow;": '\U0000290F', - "dblac;": '\U000002DD', - "dcaron;": '\U0000010F', - "dcy;": '\U00000434', - "dd;": '\U00002146', - "ddagger;": '\U00002021', - "ddarr;": '\U000021CA', - "ddotseq;": '\U00002A77', - "deg;": '\U000000B0', - "delta;": '\U000003B4', - "demptyv;": '\U000029B1', - "dfisht;": '\U0000297F', - "dfr;": '\U0001D521', - "dharl;": '\U000021C3', - "dharr;": '\U000021C2', - "diam;": '\U000022C4', - "diamond;": '\U000022C4', - "diamondsuit;": '\U00002666', - "diams;": '\U00002666', - "die;": '\U000000A8', - "digamma;": '\U000003DD', - "disin;": '\U000022F2', - "div;": '\U000000F7', - "divide;": '\U000000F7', - "divideontimes;": '\U000022C7', - "divonx;": '\U000022C7', - "djcy;": '\U00000452', - "dlcorn;": '\U0000231E', - "dlcrop;": '\U0000230D', - "dollar;": '\U00000024', - "dopf;": '\U0001D555', - "dot;": '\U000002D9', - "doteq;": '\U00002250', - "doteqdot;": '\U00002251', - "dotminus;": '\U00002238', - "dotplus;": '\U00002214', - "dotsquare;": '\U000022A1', - "doublebarwedge;": '\U00002306', - "downarrow;": '\U00002193', - "downdownarrows;": '\U000021CA', - "downharpoonleft;": '\U000021C3', - "downharpoonright;": '\U000021C2', - "drbkarow;": '\U00002910', - "drcorn;": '\U0000231F', - "drcrop;": '\U0000230C', - "dscr;": '\U0001D4B9', - "dscy;": '\U00000455', - "dsol;": '\U000029F6', - "dstrok;": '\U00000111', - "dtdot;": '\U000022F1', - "dtri;": '\U000025BF', - "dtrif;": '\U000025BE', - "duarr;": '\U000021F5', - "duhar;": '\U0000296F', - "dwangle;": '\U000029A6', - "dzcy;": '\U0000045F', - "dzigrarr;": '\U000027FF', - "eDDot;": '\U00002A77', - "eDot;": '\U00002251', - "eacute;": '\U000000E9', - "easter;": '\U00002A6E', - "ecaron;": '\U0000011B', - "ecir;": '\U00002256', - "ecirc;": '\U000000EA', - "ecolon;": '\U00002255', - "ecy;": '\U0000044D', - "edot;": '\U00000117', - "ee;": '\U00002147', - "efDot;": '\U00002252', - "efr;": '\U0001D522', - "eg;": '\U00002A9A', - "egrave;": '\U000000E8', - "egs;": '\U00002A96', - "egsdot;": '\U00002A98', - "el;": '\U00002A99', - "elinters;": '\U000023E7', - "ell;": '\U00002113', - "els;": '\U00002A95', - "elsdot;": '\U00002A97', - "emacr;": '\U00000113', - "empty;": '\U00002205', - "emptyset;": '\U00002205', - "emptyv;": '\U00002205', - "emsp;": '\U00002003', - "emsp13;": '\U00002004', - "emsp14;": '\U00002005', - "eng;": '\U0000014B', - "ensp;": '\U00002002', - "eogon;": '\U00000119', - "eopf;": '\U0001D556', - "epar;": '\U000022D5', - "eparsl;": '\U000029E3', - "eplus;": '\U00002A71', - "epsi;": '\U000003B5', - "epsilon;": '\U000003B5', - "epsiv;": '\U000003F5', - "eqcirc;": '\U00002256', - "eqcolon;": '\U00002255', - "eqsim;": '\U00002242', - "eqslantgtr;": '\U00002A96', - "eqslantless;": '\U00002A95', - "equals;": '\U0000003D', - "equest;": '\U0000225F', - "equiv;": '\U00002261', - "equivDD;": '\U00002A78', - "eqvparsl;": '\U000029E5', - "erDot;": '\U00002253', - "erarr;": '\U00002971', - "escr;": '\U0000212F', - "esdot;": '\U00002250', - "esim;": '\U00002242', - "eta;": '\U000003B7', - "eth;": '\U000000F0', - "euml;": '\U000000EB', - "euro;": '\U000020AC', - "excl;": '\U00000021', - "exist;": '\U00002203', - "expectation;": '\U00002130', - "exponentiale;": '\U00002147', - "fallingdotseq;": '\U00002252', - "fcy;": '\U00000444', - "female;": '\U00002640', - "ffilig;": '\U0000FB03', - "fflig;": '\U0000FB00', - "ffllig;": '\U0000FB04', - "ffr;": '\U0001D523', - "filig;": '\U0000FB01', - "flat;": '\U0000266D', - "fllig;": '\U0000FB02', - "fltns;": '\U000025B1', - "fnof;": '\U00000192', - "fopf;": '\U0001D557', - "forall;": '\U00002200', - "fork;": '\U000022D4', - "forkv;": '\U00002AD9', - "fpartint;": '\U00002A0D', - "frac12;": '\U000000BD', - "frac13;": '\U00002153', - "frac14;": '\U000000BC', - "frac15;": '\U00002155', - "frac16;": '\U00002159', - "frac18;": '\U0000215B', - "frac23;": '\U00002154', - "frac25;": '\U00002156', - "frac34;": '\U000000BE', - "frac35;": '\U00002157', - "frac38;": '\U0000215C', - "frac45;": '\U00002158', - "frac56;": '\U0000215A', - "frac58;": '\U0000215D', - "frac78;": '\U0000215E', - "frasl;": '\U00002044', - "frown;": '\U00002322', - "fscr;": '\U0001D4BB', - "gE;": '\U00002267', - "gEl;": '\U00002A8C', - "gacute;": '\U000001F5', - "gamma;": '\U000003B3', - "gammad;": '\U000003DD', - "gap;": '\U00002A86', - "gbreve;": '\U0000011F', - "gcirc;": '\U0000011D', - "gcy;": '\U00000433', - "gdot;": '\U00000121', - "ge;": '\U00002265', - "gel;": '\U000022DB', - "geq;": '\U00002265', - "geqq;": '\U00002267', - "geqslant;": '\U00002A7E', - "ges;": '\U00002A7E', - "gescc;": '\U00002AA9', - "gesdot;": '\U00002A80', - "gesdoto;": '\U00002A82', - "gesdotol;": '\U00002A84', - "gesles;": '\U00002A94', - "gfr;": '\U0001D524', - "gg;": '\U0000226B', - "ggg;": '\U000022D9', - "gimel;": '\U00002137', - "gjcy;": '\U00000453', - "gl;": '\U00002277', - "glE;": '\U00002A92', - "gla;": '\U00002AA5', - "glj;": '\U00002AA4', - "gnE;": '\U00002269', - "gnap;": '\U00002A8A', - "gnapprox;": '\U00002A8A', - "gne;": '\U00002A88', - "gneq;": '\U00002A88', - "gneqq;": '\U00002269', - "gnsim;": '\U000022E7', - "gopf;": '\U0001D558', - "grave;": '\U00000060', - "gscr;": '\U0000210A', - "gsim;": '\U00002273', - "gsime;": '\U00002A8E', - "gsiml;": '\U00002A90', - "gt;": '\U0000003E', - "gtcc;": '\U00002AA7', - "gtcir;": '\U00002A7A', - "gtdot;": '\U000022D7', - "gtlPar;": '\U00002995', - "gtquest;": '\U00002A7C', - "gtrapprox;": '\U00002A86', - "gtrarr;": '\U00002978', - "gtrdot;": '\U000022D7', - "gtreqless;": '\U000022DB', - "gtreqqless;": '\U00002A8C', - "gtrless;": '\U00002277', - "gtrsim;": '\U00002273', - "hArr;": '\U000021D4', - "hairsp;": '\U0000200A', - "half;": '\U000000BD', - "hamilt;": '\U0000210B', - "hardcy;": '\U0000044A', - "harr;": '\U00002194', - "harrcir;": '\U00002948', - "harrw;": '\U000021AD', - "hbar;": '\U0000210F', - "hcirc;": '\U00000125', - "hearts;": '\U00002665', - "heartsuit;": '\U00002665', - "hellip;": '\U00002026', - "hercon;": '\U000022B9', - "hfr;": '\U0001D525', - "hksearow;": '\U00002925', - "hkswarow;": '\U00002926', - "hoarr;": '\U000021FF', - "homtht;": '\U0000223B', - "hookleftarrow;": '\U000021A9', - "hookrightarrow;": '\U000021AA', - "hopf;": '\U0001D559', - "horbar;": '\U00002015', - "hscr;": '\U0001D4BD', - "hslash;": '\U0000210F', - "hstrok;": '\U00000127', - "hybull;": '\U00002043', - "hyphen;": '\U00002010', - "iacute;": '\U000000ED', - "ic;": '\U00002063', - "icirc;": '\U000000EE', - "icy;": '\U00000438', - "iecy;": '\U00000435', - "iexcl;": '\U000000A1', - "iff;": '\U000021D4', - "ifr;": '\U0001D526', - "igrave;": '\U000000EC', - "ii;": '\U00002148', - "iiiint;": '\U00002A0C', - "iiint;": '\U0000222D', - "iinfin;": '\U000029DC', - "iiota;": '\U00002129', - "ijlig;": '\U00000133', - "imacr;": '\U0000012B', - "image;": '\U00002111', - "imagline;": '\U00002110', - "imagpart;": '\U00002111', - "imath;": '\U00000131', - "imof;": '\U000022B7', - "imped;": '\U000001B5', - "in;": '\U00002208', - "incare;": '\U00002105', - "infin;": '\U0000221E', - "infintie;": '\U000029DD', - "inodot;": '\U00000131', - "int;": '\U0000222B', - "intcal;": '\U000022BA', - "integers;": '\U00002124', - "intercal;": '\U000022BA', - "intlarhk;": '\U00002A17', - "intprod;": '\U00002A3C', - "iocy;": '\U00000451', - "iogon;": '\U0000012F', - "iopf;": '\U0001D55A', - "iota;": '\U000003B9', - "iprod;": '\U00002A3C', - "iquest;": '\U000000BF', - "iscr;": '\U0001D4BE', - "isin;": '\U00002208', - "isinE;": '\U000022F9', - "isindot;": '\U000022F5', - "isins;": '\U000022F4', - "isinsv;": '\U000022F3', - "isinv;": '\U00002208', - "it;": '\U00002062', - "itilde;": '\U00000129', - "iukcy;": '\U00000456', - "iuml;": '\U000000EF', - "jcirc;": '\U00000135', - "jcy;": '\U00000439', - "jfr;": '\U0001D527', - "jmath;": '\U00000237', - "jopf;": '\U0001D55B', - "jscr;": '\U0001D4BF', - "jsercy;": '\U00000458', - "jukcy;": '\U00000454', - "kappa;": '\U000003BA', - "kappav;": '\U000003F0', - "kcedil;": '\U00000137', - "kcy;": '\U0000043A', - "kfr;": '\U0001D528', - "kgreen;": '\U00000138', - "khcy;": '\U00000445', - "kjcy;": '\U0000045C', - "kopf;": '\U0001D55C', - "kscr;": '\U0001D4C0', - "lAarr;": '\U000021DA', - "lArr;": '\U000021D0', - "lAtail;": '\U0000291B', - "lBarr;": '\U0000290E', - "lE;": '\U00002266', - "lEg;": '\U00002A8B', - "lHar;": '\U00002962', - "lacute;": '\U0000013A', - "laemptyv;": '\U000029B4', - "lagran;": '\U00002112', - "lambda;": '\U000003BB', - "lang;": '\U000027E8', - "langd;": '\U00002991', - "langle;": '\U000027E8', - "lap;": '\U00002A85', - "laquo;": '\U000000AB', - "larr;": '\U00002190', - "larrb;": '\U000021E4', - "larrbfs;": '\U0000291F', - "larrfs;": '\U0000291D', - "larrhk;": '\U000021A9', - "larrlp;": '\U000021AB', - "larrpl;": '\U00002939', - "larrsim;": '\U00002973', - "larrtl;": '\U000021A2', - "lat;": '\U00002AAB', - "latail;": '\U00002919', - "late;": '\U00002AAD', - "lbarr;": '\U0000290C', - "lbbrk;": '\U00002772', - "lbrace;": '\U0000007B', - "lbrack;": '\U0000005B', - "lbrke;": '\U0000298B', - "lbrksld;": '\U0000298F', - "lbrkslu;": '\U0000298D', - "lcaron;": '\U0000013E', - "lcedil;": '\U0000013C', - "lceil;": '\U00002308', - "lcub;": '\U0000007B', - "lcy;": '\U0000043B', - "ldca;": '\U00002936', - "ldquo;": '\U0000201C', - "ldquor;": '\U0000201E', - "ldrdhar;": '\U00002967', - "ldrushar;": '\U0000294B', - "ldsh;": '\U000021B2', - "le;": '\U00002264', - "leftarrow;": '\U00002190', - "leftarrowtail;": '\U000021A2', - "leftharpoondown;": '\U000021BD', - "leftharpoonup;": '\U000021BC', - "leftleftarrows;": '\U000021C7', - "leftrightarrow;": '\U00002194', - "leftrightarrows;": '\U000021C6', - "leftrightharpoons;": '\U000021CB', - "leftrightsquigarrow;": '\U000021AD', - "leftthreetimes;": '\U000022CB', - "leg;": '\U000022DA', - "leq;": '\U00002264', - "leqq;": '\U00002266', - "leqslant;": '\U00002A7D', - "les;": '\U00002A7D', - "lescc;": '\U00002AA8', - "lesdot;": '\U00002A7F', - "lesdoto;": '\U00002A81', - "lesdotor;": '\U00002A83', - "lesges;": '\U00002A93', - "lessapprox;": '\U00002A85', - "lessdot;": '\U000022D6', - "lesseqgtr;": '\U000022DA', - "lesseqqgtr;": '\U00002A8B', - "lessgtr;": '\U00002276', - "lesssim;": '\U00002272', - "lfisht;": '\U0000297C', - "lfloor;": '\U0000230A', - "lfr;": '\U0001D529', - "lg;": '\U00002276', - "lgE;": '\U00002A91', - "lhard;": '\U000021BD', - "lharu;": '\U000021BC', - "lharul;": '\U0000296A', - "lhblk;": '\U00002584', - "ljcy;": '\U00000459', - "ll;": '\U0000226A', - "llarr;": '\U000021C7', - "llcorner;": '\U0000231E', - "llhard;": '\U0000296B', - "lltri;": '\U000025FA', - "lmidot;": '\U00000140', - "lmoust;": '\U000023B0', - "lmoustache;": '\U000023B0', - "lnE;": '\U00002268', - "lnap;": '\U00002A89', - "lnapprox;": '\U00002A89', - "lne;": '\U00002A87', - "lneq;": '\U00002A87', - "lneqq;": '\U00002268', - "lnsim;": '\U000022E6', - "loang;": '\U000027EC', - "loarr;": '\U000021FD', - "lobrk;": '\U000027E6', - "longleftarrow;": '\U000027F5', - "longleftrightarrow;": '\U000027F7', - "longmapsto;": '\U000027FC', - "longrightarrow;": '\U000027F6', - "looparrowleft;": '\U000021AB', - "looparrowright;": '\U000021AC', - "lopar;": '\U00002985', - "lopf;": '\U0001D55D', - "loplus;": '\U00002A2D', - "lotimes;": '\U00002A34', - "lowast;": '\U00002217', - "lowbar;": '\U0000005F', - "loz;": '\U000025CA', - "lozenge;": '\U000025CA', - "lozf;": '\U000029EB', - "lpar;": '\U00000028', - "lparlt;": '\U00002993', - "lrarr;": '\U000021C6', - "lrcorner;": '\U0000231F', - "lrhar;": '\U000021CB', - "lrhard;": '\U0000296D', - "lrm;": '\U0000200E', - "lrtri;": '\U000022BF', - "lsaquo;": '\U00002039', - "lscr;": '\U0001D4C1', - "lsh;": '\U000021B0', - "lsim;": '\U00002272', - "lsime;": '\U00002A8D', - "lsimg;": '\U00002A8F', - "lsqb;": '\U0000005B', - "lsquo;": '\U00002018', - "lsquor;": '\U0000201A', - "lstrok;": '\U00000142', - "lt;": '\U0000003C', - "ltcc;": '\U00002AA6', - "ltcir;": '\U00002A79', - "ltdot;": '\U000022D6', - "lthree;": '\U000022CB', - "ltimes;": '\U000022C9', - "ltlarr;": '\U00002976', - "ltquest;": '\U00002A7B', - "ltrPar;": '\U00002996', - "ltri;": '\U000025C3', - "ltrie;": '\U000022B4', - "ltrif;": '\U000025C2', - "lurdshar;": '\U0000294A', - "luruhar;": '\U00002966', - "mDDot;": '\U0000223A', - "macr;": '\U000000AF', - "male;": '\U00002642', - "malt;": '\U00002720', - "maltese;": '\U00002720', - "map;": '\U000021A6', - "mapsto;": '\U000021A6', - "mapstodown;": '\U000021A7', - "mapstoleft;": '\U000021A4', - "mapstoup;": '\U000021A5', - "marker;": '\U000025AE', - "mcomma;": '\U00002A29', - "mcy;": '\U0000043C', - "mdash;": '\U00002014', - "measuredangle;": '\U00002221', - "mfr;": '\U0001D52A', - "mho;": '\U00002127', - "micro;": '\U000000B5', - "mid;": '\U00002223', - "midast;": '\U0000002A', - "midcir;": '\U00002AF0', - "middot;": '\U000000B7', - "minus;": '\U00002212', - "minusb;": '\U0000229F', - "minusd;": '\U00002238', - "minusdu;": '\U00002A2A', - "mlcp;": '\U00002ADB', - "mldr;": '\U00002026', - "mnplus;": '\U00002213', - "models;": '\U000022A7', - "mopf;": '\U0001D55E', - "mp;": '\U00002213', - "mscr;": '\U0001D4C2', - "mstpos;": '\U0000223E', - "mu;": '\U000003BC', - "multimap;": '\U000022B8', - "mumap;": '\U000022B8', - "nLeftarrow;": '\U000021CD', - "nLeftrightarrow;": '\U000021CE', - "nRightarrow;": '\U000021CF', - "nVDash;": '\U000022AF', - "nVdash;": '\U000022AE', - "nabla;": '\U00002207', - "nacute;": '\U00000144', - "nap;": '\U00002249', - "napos;": '\U00000149', - "napprox;": '\U00002249', - "natur;": '\U0000266E', - "natural;": '\U0000266E', - "naturals;": '\U00002115', - "nbsp;": '\U000000A0', - "ncap;": '\U00002A43', - "ncaron;": '\U00000148', - "ncedil;": '\U00000146', - "ncong;": '\U00002247', - "ncup;": '\U00002A42', - "ncy;": '\U0000043D', - "ndash;": '\U00002013', - "ne;": '\U00002260', - "neArr;": '\U000021D7', - "nearhk;": '\U00002924', - "nearr;": '\U00002197', - "nearrow;": '\U00002197', - "nequiv;": '\U00002262', - "nesear;": '\U00002928', - "nexist;": '\U00002204', - "nexists;": '\U00002204', - "nfr;": '\U0001D52B', - "nge;": '\U00002271', - "ngeq;": '\U00002271', - "ngsim;": '\U00002275', - "ngt;": '\U0000226F', - "ngtr;": '\U0000226F', - "nhArr;": '\U000021CE', - "nharr;": '\U000021AE', - "nhpar;": '\U00002AF2', - "ni;": '\U0000220B', - "nis;": '\U000022FC', - "nisd;": '\U000022FA', - "niv;": '\U0000220B', - "njcy;": '\U0000045A', - "nlArr;": '\U000021CD', - "nlarr;": '\U0000219A', - "nldr;": '\U00002025', - "nle;": '\U00002270', - "nleftarrow;": '\U0000219A', - "nleftrightarrow;": '\U000021AE', - "nleq;": '\U00002270', - "nless;": '\U0000226E', - "nlsim;": '\U00002274', - "nlt;": '\U0000226E', - "nltri;": '\U000022EA', - "nltrie;": '\U000022EC', - "nmid;": '\U00002224', - "nopf;": '\U0001D55F', - "not;": '\U000000AC', - "notin;": '\U00002209', - "notinva;": '\U00002209', - "notinvb;": '\U000022F7', - "notinvc;": '\U000022F6', - "notni;": '\U0000220C', - "notniva;": '\U0000220C', - "notnivb;": '\U000022FE', - "notnivc;": '\U000022FD', - "npar;": '\U00002226', - "nparallel;": '\U00002226', - "npolint;": '\U00002A14', - "npr;": '\U00002280', - "nprcue;": '\U000022E0', - "nprec;": '\U00002280', - "nrArr;": '\U000021CF', - "nrarr;": '\U0000219B', - "nrightarrow;": '\U0000219B', - "nrtri;": '\U000022EB', - "nrtrie;": '\U000022ED', - "nsc;": '\U00002281', - "nsccue;": '\U000022E1', - "nscr;": '\U0001D4C3', - "nshortmid;": '\U00002224', - "nshortparallel;": '\U00002226', - "nsim;": '\U00002241', - "nsime;": '\U00002244', - "nsimeq;": '\U00002244', - "nsmid;": '\U00002224', - "nspar;": '\U00002226', - "nsqsube;": '\U000022E2', - "nsqsupe;": '\U000022E3', - "nsub;": '\U00002284', - "nsube;": '\U00002288', - "nsubseteq;": '\U00002288', - "nsucc;": '\U00002281', - "nsup;": '\U00002285', - "nsupe;": '\U00002289', - "nsupseteq;": '\U00002289', - "ntgl;": '\U00002279', - "ntilde;": '\U000000F1', - "ntlg;": '\U00002278', - "ntriangleleft;": '\U000022EA', - "ntrianglelefteq;": '\U000022EC', - "ntriangleright;": '\U000022EB', - "ntrianglerighteq;": '\U000022ED', - "nu;": '\U000003BD', - "num;": '\U00000023', - "numero;": '\U00002116', - "numsp;": '\U00002007', - "nvDash;": '\U000022AD', - "nvHarr;": '\U00002904', - "nvdash;": '\U000022AC', - "nvinfin;": '\U000029DE', - "nvlArr;": '\U00002902', - "nvrArr;": '\U00002903', - "nwArr;": '\U000021D6', - "nwarhk;": '\U00002923', - "nwarr;": '\U00002196', - "nwarrow;": '\U00002196', - "nwnear;": '\U00002927', - "oS;": '\U000024C8', - "oacute;": '\U000000F3', - "oast;": '\U0000229B', - "ocir;": '\U0000229A', - "ocirc;": '\U000000F4', - "ocy;": '\U0000043E', - "odash;": '\U0000229D', - "odblac;": '\U00000151', - "odiv;": '\U00002A38', - "odot;": '\U00002299', - "odsold;": '\U000029BC', - "oelig;": '\U00000153', - "ofcir;": '\U000029BF', - "ofr;": '\U0001D52C', - "ogon;": '\U000002DB', - "ograve;": '\U000000F2', - "ogt;": '\U000029C1', - "ohbar;": '\U000029B5', - "ohm;": '\U000003A9', - "oint;": '\U0000222E', - "olarr;": '\U000021BA', - "olcir;": '\U000029BE', - "olcross;": '\U000029BB', - "oline;": '\U0000203E', - "olt;": '\U000029C0', - "omacr;": '\U0000014D', - "omega;": '\U000003C9', - "omicron;": '\U000003BF', - "omid;": '\U000029B6', - "ominus;": '\U00002296', - "oopf;": '\U0001D560', - "opar;": '\U000029B7', - "operp;": '\U000029B9', - "oplus;": '\U00002295', - "or;": '\U00002228', - "orarr;": '\U000021BB', - "ord;": '\U00002A5D', - "order;": '\U00002134', - "orderof;": '\U00002134', - "ordf;": '\U000000AA', - "ordm;": '\U000000BA', - "origof;": '\U000022B6', - "oror;": '\U00002A56', - "orslope;": '\U00002A57', - "orv;": '\U00002A5B', - "oscr;": '\U00002134', - "oslash;": '\U000000F8', - "osol;": '\U00002298', - "otilde;": '\U000000F5', - "otimes;": '\U00002297', - "otimesas;": '\U00002A36', - "ouml;": '\U000000F6', - "ovbar;": '\U0000233D', - "par;": '\U00002225', - "para;": '\U000000B6', - "parallel;": '\U00002225', - "parsim;": '\U00002AF3', - "parsl;": '\U00002AFD', - "part;": '\U00002202', - "pcy;": '\U0000043F', - "percnt;": '\U00000025', - "period;": '\U0000002E', - "permil;": '\U00002030', - "perp;": '\U000022A5', - "pertenk;": '\U00002031', - "pfr;": '\U0001D52D', - "phi;": '\U000003C6', - "phiv;": '\U000003D5', - "phmmat;": '\U00002133', - "phone;": '\U0000260E', - "pi;": '\U000003C0', - "pitchfork;": '\U000022D4', - "piv;": '\U000003D6', - "planck;": '\U0000210F', - "planckh;": '\U0000210E', - "plankv;": '\U0000210F', - "plus;": '\U0000002B', - "plusacir;": '\U00002A23', - "plusb;": '\U0000229E', - "pluscir;": '\U00002A22', - "plusdo;": '\U00002214', - "plusdu;": '\U00002A25', - "pluse;": '\U00002A72', - "plusmn;": '\U000000B1', - "plussim;": '\U00002A26', - "plustwo;": '\U00002A27', - "pm;": '\U000000B1', - "pointint;": '\U00002A15', - "popf;": '\U0001D561', - "pound;": '\U000000A3', - "pr;": '\U0000227A', - "prE;": '\U00002AB3', - "prap;": '\U00002AB7', - "prcue;": '\U0000227C', - "pre;": '\U00002AAF', - "prec;": '\U0000227A', - "precapprox;": '\U00002AB7', - "preccurlyeq;": '\U0000227C', - "preceq;": '\U00002AAF', - "precnapprox;": '\U00002AB9', - "precneqq;": '\U00002AB5', - "precnsim;": '\U000022E8', - "precsim;": '\U0000227E', - "prime;": '\U00002032', - "primes;": '\U00002119', - "prnE;": '\U00002AB5', - "prnap;": '\U00002AB9', - "prnsim;": '\U000022E8', - "prod;": '\U0000220F', - "profalar;": '\U0000232E', - "profline;": '\U00002312', - "profsurf;": '\U00002313', - "prop;": '\U0000221D', - "propto;": '\U0000221D', - "prsim;": '\U0000227E', - "prurel;": '\U000022B0', - "pscr;": '\U0001D4C5', - "psi;": '\U000003C8', - "puncsp;": '\U00002008', - "qfr;": '\U0001D52E', - "qint;": '\U00002A0C', - "qopf;": '\U0001D562', - "qprime;": '\U00002057', - "qscr;": '\U0001D4C6', - "quaternions;": '\U0000210D', - "quatint;": '\U00002A16', - "quest;": '\U0000003F', - "questeq;": '\U0000225F', - "quot;": '\U00000022', - "rAarr;": '\U000021DB', - "rArr;": '\U000021D2', - "rAtail;": '\U0000291C', - "rBarr;": '\U0000290F', - "rHar;": '\U00002964', - "racute;": '\U00000155', - "radic;": '\U0000221A', - "raemptyv;": '\U000029B3', - "rang;": '\U000027E9', - "rangd;": '\U00002992', - "range;": '\U000029A5', - "rangle;": '\U000027E9', - "raquo;": '\U000000BB', - "rarr;": '\U00002192', - "rarrap;": '\U00002975', - "rarrb;": '\U000021E5', - "rarrbfs;": '\U00002920', - "rarrc;": '\U00002933', - "rarrfs;": '\U0000291E', - "rarrhk;": '\U000021AA', - "rarrlp;": '\U000021AC', - "rarrpl;": '\U00002945', - "rarrsim;": '\U00002974', - "rarrtl;": '\U000021A3', - "rarrw;": '\U0000219D', - "ratail;": '\U0000291A', - "ratio;": '\U00002236', - "rationals;": '\U0000211A', - "rbarr;": '\U0000290D', - "rbbrk;": '\U00002773', - "rbrace;": '\U0000007D', - "rbrack;": '\U0000005D', - "rbrke;": '\U0000298C', - "rbrksld;": '\U0000298E', - "rbrkslu;": '\U00002990', - "rcaron;": '\U00000159', - "rcedil;": '\U00000157', - "rceil;": '\U00002309', - "rcub;": '\U0000007D', - "rcy;": '\U00000440', - "rdca;": '\U00002937', - "rdldhar;": '\U00002969', - "rdquo;": '\U0000201D', - "rdquor;": '\U0000201D', - "rdsh;": '\U000021B3', - "real;": '\U0000211C', - "realine;": '\U0000211B', - "realpart;": '\U0000211C', - "reals;": '\U0000211D', - "rect;": '\U000025AD', - "reg;": '\U000000AE', - "rfisht;": '\U0000297D', - "rfloor;": '\U0000230B', - "rfr;": '\U0001D52F', - "rhard;": '\U000021C1', - "rharu;": '\U000021C0', - "rharul;": '\U0000296C', - "rho;": '\U000003C1', - "rhov;": '\U000003F1', - "rightarrow;": '\U00002192', - "rightarrowtail;": '\U000021A3', - "rightharpoondown;": '\U000021C1', - "rightharpoonup;": '\U000021C0', - "rightleftarrows;": '\U000021C4', - "rightleftharpoons;": '\U000021CC', - "rightrightarrows;": '\U000021C9', - "rightsquigarrow;": '\U0000219D', - "rightthreetimes;": '\U000022CC', - "ring;": '\U000002DA', - "risingdotseq;": '\U00002253', - "rlarr;": '\U000021C4', - "rlhar;": '\U000021CC', - "rlm;": '\U0000200F', - "rmoust;": '\U000023B1', - "rmoustache;": '\U000023B1', - "rnmid;": '\U00002AEE', - "roang;": '\U000027ED', - "roarr;": '\U000021FE', - "robrk;": '\U000027E7', - "ropar;": '\U00002986', - "ropf;": '\U0001D563', - "roplus;": '\U00002A2E', - "rotimes;": '\U00002A35', - "rpar;": '\U00000029', - "rpargt;": '\U00002994', - "rppolint;": '\U00002A12', - "rrarr;": '\U000021C9', - "rsaquo;": '\U0000203A', - "rscr;": '\U0001D4C7', - "rsh;": '\U000021B1', - "rsqb;": '\U0000005D', - "rsquo;": '\U00002019', - "rsquor;": '\U00002019', - "rthree;": '\U000022CC', - "rtimes;": '\U000022CA', - "rtri;": '\U000025B9', - "rtrie;": '\U000022B5', - "rtrif;": '\U000025B8', - "rtriltri;": '\U000029CE', - "ruluhar;": '\U00002968', - "rx;": '\U0000211E', - "sacute;": '\U0000015B', - "sbquo;": '\U0000201A', - "sc;": '\U0000227B', - "scE;": '\U00002AB4', - "scap;": '\U00002AB8', - "scaron;": '\U00000161', - "sccue;": '\U0000227D', - "sce;": '\U00002AB0', - "scedil;": '\U0000015F', - "scirc;": '\U0000015D', - "scnE;": '\U00002AB6', - "scnap;": '\U00002ABA', - "scnsim;": '\U000022E9', - "scpolint;": '\U00002A13', - "scsim;": '\U0000227F', - "scy;": '\U00000441', - "sdot;": '\U000022C5', - "sdotb;": '\U000022A1', - "sdote;": '\U00002A66', - "seArr;": '\U000021D8', - "searhk;": '\U00002925', - "searr;": '\U00002198', - "searrow;": '\U00002198', - "sect;": '\U000000A7', - "semi;": '\U0000003B', - "seswar;": '\U00002929', - "setminus;": '\U00002216', - "setmn;": '\U00002216', - "sext;": '\U00002736', - "sfr;": '\U0001D530', - "sfrown;": '\U00002322', - "sharp;": '\U0000266F', - "shchcy;": '\U00000449', - "shcy;": '\U00000448', - "shortmid;": '\U00002223', - "shortparallel;": '\U00002225', - "shy;": '\U000000AD', - "sigma;": '\U000003C3', - "sigmaf;": '\U000003C2', - "sigmav;": '\U000003C2', - "sim;": '\U0000223C', - "simdot;": '\U00002A6A', - "sime;": '\U00002243', - "simeq;": '\U00002243', - "simg;": '\U00002A9E', - "simgE;": '\U00002AA0', - "siml;": '\U00002A9D', - "simlE;": '\U00002A9F', - "simne;": '\U00002246', - "simplus;": '\U00002A24', - "simrarr;": '\U00002972', - "slarr;": '\U00002190', - "smallsetminus;": '\U00002216', - "smashp;": '\U00002A33', - "smeparsl;": '\U000029E4', - "smid;": '\U00002223', - "smile;": '\U00002323', - "smt;": '\U00002AAA', - "smte;": '\U00002AAC', - "softcy;": '\U0000044C', - "sol;": '\U0000002F', - "solb;": '\U000029C4', - "solbar;": '\U0000233F', - "sopf;": '\U0001D564', - "spades;": '\U00002660', - "spadesuit;": '\U00002660', - "spar;": '\U00002225', - "sqcap;": '\U00002293', - "sqcup;": '\U00002294', - "sqsub;": '\U0000228F', - "sqsube;": '\U00002291', - "sqsubset;": '\U0000228F', - "sqsubseteq;": '\U00002291', - "sqsup;": '\U00002290', - "sqsupe;": '\U00002292', - "sqsupset;": '\U00002290', - "sqsupseteq;": '\U00002292', - "squ;": '\U000025A1', - "square;": '\U000025A1', - "squarf;": '\U000025AA', - "squf;": '\U000025AA', - "srarr;": '\U00002192', - "sscr;": '\U0001D4C8', - "ssetmn;": '\U00002216', - "ssmile;": '\U00002323', - "sstarf;": '\U000022C6', - "star;": '\U00002606', - "starf;": '\U00002605', - "straightepsilon;": '\U000003F5', - "straightphi;": '\U000003D5', - "strns;": '\U000000AF', - "sub;": '\U00002282', - "subE;": '\U00002AC5', - "subdot;": '\U00002ABD', - "sube;": '\U00002286', - "subedot;": '\U00002AC3', - "submult;": '\U00002AC1', - "subnE;": '\U00002ACB', - "subne;": '\U0000228A', - "subplus;": '\U00002ABF', - "subrarr;": '\U00002979', - "subset;": '\U00002282', - "subseteq;": '\U00002286', - "subseteqq;": '\U00002AC5', - "subsetneq;": '\U0000228A', - "subsetneqq;": '\U00002ACB', - "subsim;": '\U00002AC7', - "subsub;": '\U00002AD5', - "subsup;": '\U00002AD3', - "succ;": '\U0000227B', - "succapprox;": '\U00002AB8', - "succcurlyeq;": '\U0000227D', - "succeq;": '\U00002AB0', - "succnapprox;": '\U00002ABA', - "succneqq;": '\U00002AB6', - "succnsim;": '\U000022E9', - "succsim;": '\U0000227F', - "sum;": '\U00002211', - "sung;": '\U0000266A', - "sup;": '\U00002283', - "sup1;": '\U000000B9', - "sup2;": '\U000000B2', - "sup3;": '\U000000B3', - "supE;": '\U00002AC6', - "supdot;": '\U00002ABE', - "supdsub;": '\U00002AD8', - "supe;": '\U00002287', - "supedot;": '\U00002AC4', - "suphsol;": '\U000027C9', - "suphsub;": '\U00002AD7', - "suplarr;": '\U0000297B', - "supmult;": '\U00002AC2', - "supnE;": '\U00002ACC', - "supne;": '\U0000228B', - "supplus;": '\U00002AC0', - "supset;": '\U00002283', - "supseteq;": '\U00002287', - "supseteqq;": '\U00002AC6', - "supsetneq;": '\U0000228B', - "supsetneqq;": '\U00002ACC', - "supsim;": '\U00002AC8', - "supsub;": '\U00002AD4', - "supsup;": '\U00002AD6', - "swArr;": '\U000021D9', - "swarhk;": '\U00002926', - "swarr;": '\U00002199', - "swarrow;": '\U00002199', - "swnwar;": '\U0000292A', - "szlig;": '\U000000DF', - "target;": '\U00002316', - "tau;": '\U000003C4', - "tbrk;": '\U000023B4', - "tcaron;": '\U00000165', - "tcedil;": '\U00000163', - "tcy;": '\U00000442', - "tdot;": '\U000020DB', - "telrec;": '\U00002315', - "tfr;": '\U0001D531', - "there4;": '\U00002234', - "therefore;": '\U00002234', - "theta;": '\U000003B8', - "thetasym;": '\U000003D1', - "thetav;": '\U000003D1', - "thickapprox;": '\U00002248', - "thicksim;": '\U0000223C', - "thinsp;": '\U00002009', - "thkap;": '\U00002248', - "thksim;": '\U0000223C', - "thorn;": '\U000000FE', - "tilde;": '\U000002DC', - "times;": '\U000000D7', - "timesb;": '\U000022A0', - "timesbar;": '\U00002A31', - "timesd;": '\U00002A30', - "tint;": '\U0000222D', - "toea;": '\U00002928', - "top;": '\U000022A4', - "topbot;": '\U00002336', - "topcir;": '\U00002AF1', - "topf;": '\U0001D565', - "topfork;": '\U00002ADA', - "tosa;": '\U00002929', - "tprime;": '\U00002034', - "trade;": '\U00002122', - "triangle;": '\U000025B5', - "triangledown;": '\U000025BF', - "triangleleft;": '\U000025C3', - "trianglelefteq;": '\U000022B4', - "triangleq;": '\U0000225C', - "triangleright;": '\U000025B9', - "trianglerighteq;": '\U000022B5', - "tridot;": '\U000025EC', - "trie;": '\U0000225C', - "triminus;": '\U00002A3A', - "triplus;": '\U00002A39', - "trisb;": '\U000029CD', - "tritime;": '\U00002A3B', - "trpezium;": '\U000023E2', - "tscr;": '\U0001D4C9', - "tscy;": '\U00000446', - "tshcy;": '\U0000045B', - "tstrok;": '\U00000167', - "twixt;": '\U0000226C', - "twoheadleftarrow;": '\U0000219E', - "twoheadrightarrow;": '\U000021A0', - "uArr;": '\U000021D1', - "uHar;": '\U00002963', - "uacute;": '\U000000FA', - "uarr;": '\U00002191', - "ubrcy;": '\U0000045E', - "ubreve;": '\U0000016D', - "ucirc;": '\U000000FB', - "ucy;": '\U00000443', - "udarr;": '\U000021C5', - "udblac;": '\U00000171', - "udhar;": '\U0000296E', - "ufisht;": '\U0000297E', - "ufr;": '\U0001D532', - "ugrave;": '\U000000F9', - "uharl;": '\U000021BF', - "uharr;": '\U000021BE', - "uhblk;": '\U00002580', - "ulcorn;": '\U0000231C', - "ulcorner;": '\U0000231C', - "ulcrop;": '\U0000230F', - "ultri;": '\U000025F8', - "umacr;": '\U0000016B', - "uml;": '\U000000A8', - "uogon;": '\U00000173', - "uopf;": '\U0001D566', - "uparrow;": '\U00002191', - "updownarrow;": '\U00002195', - "upharpoonleft;": '\U000021BF', - "upharpoonright;": '\U000021BE', - "uplus;": '\U0000228E', - "upsi;": '\U000003C5', - "upsih;": '\U000003D2', - "upsilon;": '\U000003C5', - "upuparrows;": '\U000021C8', - "urcorn;": '\U0000231D', - "urcorner;": '\U0000231D', - "urcrop;": '\U0000230E', - "uring;": '\U0000016F', - "urtri;": '\U000025F9', - "uscr;": '\U0001D4CA', - "utdot;": '\U000022F0', - "utilde;": '\U00000169', - "utri;": '\U000025B5', - "utrif;": '\U000025B4', - "uuarr;": '\U000021C8', - "uuml;": '\U000000FC', - "uwangle;": '\U000029A7', - "vArr;": '\U000021D5', - "vBar;": '\U00002AE8', - "vBarv;": '\U00002AE9', - "vDash;": '\U000022A8', - "vangrt;": '\U0000299C', - "varepsilon;": '\U000003F5', - "varkappa;": '\U000003F0', - "varnothing;": '\U00002205', - "varphi;": '\U000003D5', - "varpi;": '\U000003D6', - "varpropto;": '\U0000221D', - "varr;": '\U00002195', - "varrho;": '\U000003F1', - "varsigma;": '\U000003C2', - "vartheta;": '\U000003D1', - "vartriangleleft;": '\U000022B2', - "vartriangleright;": '\U000022B3', - "vcy;": '\U00000432', - "vdash;": '\U000022A2', - "vee;": '\U00002228', - "veebar;": '\U000022BB', - "veeeq;": '\U0000225A', - "vellip;": '\U000022EE', - "verbar;": '\U0000007C', - "vert;": '\U0000007C', - "vfr;": '\U0001D533', - "vltri;": '\U000022B2', - "vopf;": '\U0001D567', - "vprop;": '\U0000221D', - "vrtri;": '\U000022B3', - "vscr;": '\U0001D4CB', - "vzigzag;": '\U0000299A', - "wcirc;": '\U00000175', - "wedbar;": '\U00002A5F', - "wedge;": '\U00002227', - "wedgeq;": '\U00002259', - "weierp;": '\U00002118', - "wfr;": '\U0001D534', - "wopf;": '\U0001D568', - "wp;": '\U00002118', - "wr;": '\U00002240', - "wreath;": '\U00002240', - "wscr;": '\U0001D4CC', - "xcap;": '\U000022C2', - "xcirc;": '\U000025EF', - "xcup;": '\U000022C3', - "xdtri;": '\U000025BD', - "xfr;": '\U0001D535', - "xhArr;": '\U000027FA', - "xharr;": '\U000027F7', - "xi;": '\U000003BE', - "xlArr;": '\U000027F8', - "xlarr;": '\U000027F5', - "xmap;": '\U000027FC', - "xnis;": '\U000022FB', - "xodot;": '\U00002A00', - "xopf;": '\U0001D569', - "xoplus;": '\U00002A01', - "xotime;": '\U00002A02', - "xrArr;": '\U000027F9', - "xrarr;": '\U000027F6', - "xscr;": '\U0001D4CD', - "xsqcup;": '\U00002A06', - "xuplus;": '\U00002A04', - "xutri;": '\U000025B3', - "xvee;": '\U000022C1', - "xwedge;": '\U000022C0', - "yacute;": '\U000000FD', - "yacy;": '\U0000044F', - "ycirc;": '\U00000177', - "ycy;": '\U0000044B', - "yen;": '\U000000A5', - "yfr;": '\U0001D536', - "yicy;": '\U00000457', - "yopf;": '\U0001D56A', - "yscr;": '\U0001D4CE', - "yucy;": '\U0000044E', - "yuml;": '\U000000FF', - "zacute;": '\U0000017A', - "zcaron;": '\U0000017E', - "zcy;": '\U00000437', - "zdot;": '\U0000017C', - "zeetrf;": '\U00002128', - "zeta;": '\U000003B6', - "zfr;": '\U0001D537', - "zhcy;": '\U00000436', - "zigrarr;": '\U000021DD', - "zopf;": '\U0001D56B', - "zscr;": '\U0001D4CF', - "zwj;": '\U0000200D', - "zwnj;": '\U0000200C', - "AElig": '\U000000C6', - "AMP": '\U00000026', - "Aacute": '\U000000C1', - "Acirc": '\U000000C2', - "Agrave": '\U000000C0', - "Aring": '\U000000C5', - "Atilde": '\U000000C3', - "Auml": '\U000000C4', - "COPY": '\U000000A9', - "Ccedil": '\U000000C7', - "ETH": '\U000000D0', - "Eacute": '\U000000C9', - "Ecirc": '\U000000CA', - "Egrave": '\U000000C8', - "Euml": '\U000000CB', - "GT": '\U0000003E', - "Iacute": '\U000000CD', - "Icirc": '\U000000CE', - "Igrave": '\U000000CC', - "Iuml": '\U000000CF', - "LT": '\U0000003C', - "Ntilde": '\U000000D1', - "Oacute": '\U000000D3', - "Ocirc": '\U000000D4', - "Ograve": '\U000000D2', - "Oslash": '\U000000D8', - "Otilde": '\U000000D5', - "Ouml": '\U000000D6', - "QUOT": '\U00000022', - "REG": '\U000000AE', - "THORN": '\U000000DE', - "Uacute": '\U000000DA', - "Ucirc": '\U000000DB', - "Ugrave": '\U000000D9', - "Uuml": '\U000000DC', - "Yacute": '\U000000DD', - "aacute": '\U000000E1', - "acirc": '\U000000E2', - "acute": '\U000000B4', - "aelig": '\U000000E6', - "agrave": '\U000000E0', - "amp": '\U00000026', - "aring": '\U000000E5', - "atilde": '\U000000E3', - "auml": '\U000000E4', - "brvbar": '\U000000A6', - "ccedil": '\U000000E7', - "cedil": '\U000000B8', - "cent": '\U000000A2', - "copy": '\U000000A9', - "curren": '\U000000A4', - "deg": '\U000000B0', - "divide": '\U000000F7', - "eacute": '\U000000E9', - "ecirc": '\U000000EA', - "egrave": '\U000000E8', - "eth": '\U000000F0', - "euml": '\U000000EB', - "frac12": '\U000000BD', - "frac14": '\U000000BC', - "frac34": '\U000000BE', - "gt": '\U0000003E', - "iacute": '\U000000ED', - "icirc": '\U000000EE', - "iexcl": '\U000000A1', - "igrave": '\U000000EC', - "iquest": '\U000000BF', - "iuml": '\U000000EF', - "laquo": '\U000000AB', - "lt": '\U0000003C', - "macr": '\U000000AF', - "micro": '\U000000B5', - "middot": '\U000000B7', - "nbsp": '\U000000A0', - "not": '\U000000AC', - "ntilde": '\U000000F1', - "oacute": '\U000000F3', - "ocirc": '\U000000F4', - "ograve": '\U000000F2', - "ordf": '\U000000AA', - "ordm": '\U000000BA', - "oslash": '\U000000F8', - "otilde": '\U000000F5', - "ouml": '\U000000F6', - "para": '\U000000B6', - "plusmn": '\U000000B1', - "pound": '\U000000A3', - "quot": '\U00000022', - "raquo": '\U000000BB', - "reg": '\U000000AE', - "sect": '\U000000A7', - "shy": '\U000000AD', - "sup1": '\U000000B9', - "sup2": '\U000000B2', - "sup3": '\U000000B3', - "szlig": '\U000000DF', - "thorn": '\U000000FE', - "times": '\U000000D7', - "uacute": '\U000000FA', - "ucirc": '\U000000FB', - "ugrave": '\U000000F9', - "uml": '\U000000A8', - "uuml": '\U000000FC', - "yacute": '\U000000FD', - "yen": '\U000000A5', - "yuml": '\U000000FF', -} - -// HTML entities that are two unicode codepoints. -var entity2 = map[string][2]rune{ - // TODO(nigeltao): Handle replacements that are wider than their names. - // "nLt;": {'\u226A', '\u20D2'}, - // "nGt;": {'\u226B', '\u20D2'}, - "NotEqualTilde;": {'\u2242', '\u0338'}, - "NotGreaterFullEqual;": {'\u2267', '\u0338'}, - "NotGreaterGreater;": {'\u226B', '\u0338'}, - "NotGreaterSlantEqual;": {'\u2A7E', '\u0338'}, - "NotHumpDownHump;": {'\u224E', '\u0338'}, - "NotHumpEqual;": {'\u224F', '\u0338'}, - "NotLeftTriangleBar;": {'\u29CF', '\u0338'}, - "NotLessLess;": {'\u226A', '\u0338'}, - "NotLessSlantEqual;": {'\u2A7D', '\u0338'}, - "NotNestedGreaterGreater;": {'\u2AA2', '\u0338'}, - "NotNestedLessLess;": {'\u2AA1', '\u0338'}, - "NotPrecedesEqual;": {'\u2AAF', '\u0338'}, - "NotRightTriangleBar;": {'\u29D0', '\u0338'}, - "NotSquareSubset;": {'\u228F', '\u0338'}, - "NotSquareSuperset;": {'\u2290', '\u0338'}, - "NotSubset;": {'\u2282', '\u20D2'}, - "NotSucceedsEqual;": {'\u2AB0', '\u0338'}, - "NotSucceedsTilde;": {'\u227F', '\u0338'}, - "NotSuperset;": {'\u2283', '\u20D2'}, - "ThickSpace;": {'\u205F', '\u200A'}, - "acE;": {'\u223E', '\u0333'}, - "bne;": {'\u003D', '\u20E5'}, - "bnequiv;": {'\u2261', '\u20E5'}, - "caps;": {'\u2229', '\uFE00'}, - "cups;": {'\u222A', '\uFE00'}, - "fjlig;": {'\u0066', '\u006A'}, - "gesl;": {'\u22DB', '\uFE00'}, - "gvertneqq;": {'\u2269', '\uFE00'}, - "gvnE;": {'\u2269', '\uFE00'}, - "lates;": {'\u2AAD', '\uFE00'}, - "lesg;": {'\u22DA', '\uFE00'}, - "lvertneqq;": {'\u2268', '\uFE00'}, - "lvnE;": {'\u2268', '\uFE00'}, - "nGg;": {'\u22D9', '\u0338'}, - "nGtv;": {'\u226B', '\u0338'}, - "nLl;": {'\u22D8', '\u0338'}, - "nLtv;": {'\u226A', '\u0338'}, - "nang;": {'\u2220', '\u20D2'}, - "napE;": {'\u2A70', '\u0338'}, - "napid;": {'\u224B', '\u0338'}, - "nbump;": {'\u224E', '\u0338'}, - "nbumpe;": {'\u224F', '\u0338'}, - "ncongdot;": {'\u2A6D', '\u0338'}, - "nedot;": {'\u2250', '\u0338'}, - "nesim;": {'\u2242', '\u0338'}, - "ngE;": {'\u2267', '\u0338'}, - "ngeqq;": {'\u2267', '\u0338'}, - "ngeqslant;": {'\u2A7E', '\u0338'}, - "nges;": {'\u2A7E', '\u0338'}, - "nlE;": {'\u2266', '\u0338'}, - "nleqq;": {'\u2266', '\u0338'}, - "nleqslant;": {'\u2A7D', '\u0338'}, - "nles;": {'\u2A7D', '\u0338'}, - "notinE;": {'\u22F9', '\u0338'}, - "notindot;": {'\u22F5', '\u0338'}, - "nparsl;": {'\u2AFD', '\u20E5'}, - "npart;": {'\u2202', '\u0338'}, - "npre;": {'\u2AAF', '\u0338'}, - "npreceq;": {'\u2AAF', '\u0338'}, - "nrarrc;": {'\u2933', '\u0338'}, - "nrarrw;": {'\u219D', '\u0338'}, - "nsce;": {'\u2AB0', '\u0338'}, - "nsubE;": {'\u2AC5', '\u0338'}, - "nsubset;": {'\u2282', '\u20D2'}, - "nsubseteqq;": {'\u2AC5', '\u0338'}, - "nsucceq;": {'\u2AB0', '\u0338'}, - "nsupE;": {'\u2AC6', '\u0338'}, - "nsupset;": {'\u2283', '\u20D2'}, - "nsupseteqq;": {'\u2AC6', '\u0338'}, - "nvap;": {'\u224D', '\u20D2'}, - "nvge;": {'\u2265', '\u20D2'}, - "nvgt;": {'\u003E', '\u20D2'}, - "nvle;": {'\u2264', '\u20D2'}, - "nvlt;": {'\u003C', '\u20D2'}, - "nvltrie;": {'\u22B4', '\u20D2'}, - "nvrtrie;": {'\u22B5', '\u20D2'}, - "nvsim;": {'\u223C', '\u20D2'}, - "race;": {'\u223D', '\u0331'}, - "smtes;": {'\u2AAC', '\uFE00'}, - "sqcaps;": {'\u2293', '\uFE00'}, - "sqcups;": {'\u2294', '\uFE00'}, - "varsubsetneq;": {'\u228A', '\uFE00'}, - "varsubsetneqq;": {'\u2ACB', '\uFE00'}, - "varsupsetneq;": {'\u228B', '\uFE00'}, - "varsupsetneqq;": {'\u2ACC', '\uFE00'}, - "vnsub;": {'\u2282', '\u20D2'}, - "vnsup;": {'\u2283', '\u20D2'}, - "vsubnE;": {'\u2ACB', '\uFE00'}, - "vsubne;": {'\u228A', '\uFE00'}, - "vsupnE;": {'\u2ACC', '\uFE00'}, - "vsupne;": {'\u228B', '\uFE00'}, -} diff --git a/vendor/golang.org/x/net/html/escape.go b/vendor/golang.org/x/net/html/escape.go deleted file mode 100644 index d8561396200e..000000000000 --- a/vendor/golang.org/x/net/html/escape.go +++ /dev/null @@ -1,258 +0,0 @@ -// 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. - -package html - -import ( - "bytes" - "strings" - "unicode/utf8" -) - -// These replacements permit compatibility with old numeric entities that -// assumed Windows-1252 encoding. -// https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference -var replacementTable = [...]rune{ - '\u20AC', // First entry is what 0x80 should be replaced with. - '\u0081', - '\u201A', - '\u0192', - '\u201E', - '\u2026', - '\u2020', - '\u2021', - '\u02C6', - '\u2030', - '\u0160', - '\u2039', - '\u0152', - '\u008D', - '\u017D', - '\u008F', - '\u0090', - '\u2018', - '\u2019', - '\u201C', - '\u201D', - '\u2022', - '\u2013', - '\u2014', - '\u02DC', - '\u2122', - '\u0161', - '\u203A', - '\u0153', - '\u009D', - '\u017E', - '\u0178', // Last entry is 0x9F. - // 0x00->'\uFFFD' is handled programmatically. - // 0x0D->'\u000D' is a no-op. -} - -// unescapeEntity reads an entity like "<" from b[src:] and writes the -// corresponding "<" to b[dst:], returning the incremented dst and src cursors. -// Precondition: b[src] == '&' && dst <= src. -// attribute should be true if parsing an attribute value. -func unescapeEntity(b []byte, dst, src int, attribute bool) (dst1, src1 int) { - // https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference - - // i starts at 1 because we already know that s[0] == '&'. - i, s := 1, b[src:] - - if len(s) <= 1 { - b[dst] = b[src] - return dst + 1, src + 1 - } - - if s[i] == '#' { - if len(s) <= 3 { // We need to have at least "&#.". - b[dst] = b[src] - return dst + 1, src + 1 - } - i++ - c := s[i] - hex := false - if c == 'x' || c == 'X' { - hex = true - i++ - } - - x := '\x00' - for i < len(s) { - c = s[i] - i++ - if hex { - if '0' <= c && c <= '9' { - x = 16*x + rune(c) - '0' - continue - } else if 'a' <= c && c <= 'f' { - x = 16*x + rune(c) - 'a' + 10 - continue - } else if 'A' <= c && c <= 'F' { - x = 16*x + rune(c) - 'A' + 10 - continue - } - } else if '0' <= c && c <= '9' { - x = 10*x + rune(c) - '0' - continue - } - if c != ';' { - i-- - } - break - } - - if i <= 3 { // No characters matched. - b[dst] = b[src] - return dst + 1, src + 1 - } - - if 0x80 <= x && x <= 0x9F { - // Replace characters from Windows-1252 with UTF-8 equivalents. - x = replacementTable[x-0x80] - } else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF { - // Replace invalid characters with the replacement character. - x = '\uFFFD' - } - - return dst + utf8.EncodeRune(b[dst:], x), src + i - } - - // Consume the maximum number of characters possible, with the - // consumed characters matching one of the named references. - - for i < len(s) { - c := s[i] - i++ - // Lower-cased characters are more common in entities, so we check for them first. - if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { - continue - } - if c != ';' { - i-- - } - break - } - - entityName := string(s[1:i]) - if entityName == "" { - // No-op. - } else if attribute && entityName[len(entityName)-1] != ';' && len(s) > i && s[i] == '=' { - // No-op. - } else if x := entity[entityName]; x != 0 { - return dst + utf8.EncodeRune(b[dst:], x), src + i - } else if x := entity2[entityName]; x[0] != 0 { - dst1 := dst + utf8.EncodeRune(b[dst:], x[0]) - return dst1 + utf8.EncodeRune(b[dst1:], x[1]), src + i - } else if !attribute { - maxLen := len(entityName) - 1 - if maxLen > longestEntityWithoutSemicolon { - maxLen = longestEntityWithoutSemicolon - } - for j := maxLen; j > 1; j-- { - if x := entity[entityName[:j]]; x != 0 { - return dst + utf8.EncodeRune(b[dst:], x), src + j + 1 - } - } - } - - dst1, src1 = dst+i, src+i - copy(b[dst:dst1], b[src:src1]) - return dst1, src1 -} - -// unescape unescapes b's entities in-place, so that "a<b" becomes "a': - esc = ">" - case '"': - // """ is shorter than """. - esc = """ - case '\r': - esc = " " - default: - panic("unrecognized escape character") - } - s = s[i+1:] - if _, err := w.WriteString(esc); err != nil { - return err - } - i = strings.IndexAny(s, escapedChars) - } - _, err := w.WriteString(s) - return err -} - -// EscapeString escapes special characters like "<" to become "<". It -// escapes only five such characters: <, >, &, ' and ". -// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't -// always true. -func EscapeString(s string) string { - if strings.IndexAny(s, escapedChars) == -1 { - return s - } - var buf bytes.Buffer - escape(&buf, s) - return buf.String() -} - -// UnescapeString unescapes entities like "<" to become "<". It unescapes a -// larger range of entities than EscapeString escapes. For example, "á" -// unescapes to "á", as does "á" and "&xE1;". -// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't -// always true. -func UnescapeString(s string) string { - for _, c := range s { - if c == '&' { - return string(unescape([]byte(s), false)) - } - } - return s -} diff --git a/vendor/golang.org/x/net/html/foreign.go b/vendor/golang.org/x/net/html/foreign.go deleted file mode 100644 index d3b3844099bf..000000000000 --- a/vendor/golang.org/x/net/html/foreign.go +++ /dev/null @@ -1,226 +0,0 @@ -// 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 html - -import ( - "strings" -) - -func adjustAttributeNames(aa []Attribute, nameMap map[string]string) { - for i := range aa { - if newName, ok := nameMap[aa[i].Key]; ok { - aa[i].Key = newName - } - } -} - -func adjustForeignAttributes(aa []Attribute) { - for i, a := range aa { - if a.Key == "" || a.Key[0] != 'x' { - continue - } - switch a.Key { - case "xlink:actuate", "xlink:arcrole", "xlink:href", "xlink:role", "xlink:show", - "xlink:title", "xlink:type", "xml:base", "xml:lang", "xml:space", "xmlns:xlink": - j := strings.Index(a.Key, ":") - aa[i].Namespace = a.Key[:j] - aa[i].Key = a.Key[j+1:] - } - } -} - -func htmlIntegrationPoint(n *Node) bool { - if n.Type != ElementNode { - return false - } - switch n.Namespace { - case "math": - if n.Data == "annotation-xml" { - for _, a := range n.Attr { - if a.Key == "encoding" { - val := strings.ToLower(a.Val) - if val == "text/html" || val == "application/xhtml+xml" { - return true - } - } - } - } - case "svg": - switch n.Data { - case "desc", "foreignObject", "title": - return true - } - } - return false -} - -func mathMLTextIntegrationPoint(n *Node) bool { - if n.Namespace != "math" { - return false - } - switch n.Data { - case "mi", "mo", "mn", "ms", "mtext": - return true - } - return false -} - -// Section 12.2.5.5. -var breakout = map[string]bool{ - "b": true, - "big": true, - "blockquote": true, - "body": true, - "br": true, - "center": true, - "code": true, - "dd": true, - "div": true, - "dl": true, - "dt": true, - "em": true, - "embed": true, - "h1": true, - "h2": true, - "h3": true, - "h4": true, - "h5": true, - "h6": true, - "head": true, - "hr": true, - "i": true, - "img": true, - "li": true, - "listing": true, - "menu": true, - "meta": true, - "nobr": true, - "ol": true, - "p": true, - "pre": true, - "ruby": true, - "s": true, - "small": true, - "span": true, - "strong": true, - "strike": true, - "sub": true, - "sup": true, - "table": true, - "tt": true, - "u": true, - "ul": true, - "var": true, -} - -// Section 12.2.5.5. -var svgTagNameAdjustments = map[string]string{ - "altglyph": "altGlyph", - "altglyphdef": "altGlyphDef", - "altglyphitem": "altGlyphItem", - "animatecolor": "animateColor", - "animatemotion": "animateMotion", - "animatetransform": "animateTransform", - "clippath": "clipPath", - "feblend": "feBlend", - "fecolormatrix": "feColorMatrix", - "fecomponenttransfer": "feComponentTransfer", - "fecomposite": "feComposite", - "feconvolvematrix": "feConvolveMatrix", - "fediffuselighting": "feDiffuseLighting", - "fedisplacementmap": "feDisplacementMap", - "fedistantlight": "feDistantLight", - "feflood": "feFlood", - "fefunca": "feFuncA", - "fefuncb": "feFuncB", - "fefuncg": "feFuncG", - "fefuncr": "feFuncR", - "fegaussianblur": "feGaussianBlur", - "feimage": "feImage", - "femerge": "feMerge", - "femergenode": "feMergeNode", - "femorphology": "feMorphology", - "feoffset": "feOffset", - "fepointlight": "fePointLight", - "fespecularlighting": "feSpecularLighting", - "fespotlight": "feSpotLight", - "fetile": "feTile", - "feturbulence": "feTurbulence", - "foreignobject": "foreignObject", - "glyphref": "glyphRef", - "lineargradient": "linearGradient", - "radialgradient": "radialGradient", - "textpath": "textPath", -} - -// Section 12.2.5.1 -var mathMLAttributeAdjustments = map[string]string{ - "definitionurl": "definitionURL", -} - -var svgAttributeAdjustments = map[string]string{ - "attributename": "attributeName", - "attributetype": "attributeType", - "basefrequency": "baseFrequency", - "baseprofile": "baseProfile", - "calcmode": "calcMode", - "clippathunits": "clipPathUnits", - "contentscripttype": "contentScriptType", - "contentstyletype": "contentStyleType", - "diffuseconstant": "diffuseConstant", - "edgemode": "edgeMode", - "externalresourcesrequired": "externalResourcesRequired", - "filterres": "filterRes", - "filterunits": "filterUnits", - "glyphref": "glyphRef", - "gradienttransform": "gradientTransform", - "gradientunits": "gradientUnits", - "kernelmatrix": "kernelMatrix", - "kernelunitlength": "kernelUnitLength", - "keypoints": "keyPoints", - "keysplines": "keySplines", - "keytimes": "keyTimes", - "lengthadjust": "lengthAdjust", - "limitingconeangle": "limitingConeAngle", - "markerheight": "markerHeight", - "markerunits": "markerUnits", - "markerwidth": "markerWidth", - "maskcontentunits": "maskContentUnits", - "maskunits": "maskUnits", - "numoctaves": "numOctaves", - "pathlength": "pathLength", - "patterncontentunits": "patternContentUnits", - "patterntransform": "patternTransform", - "patternunits": "patternUnits", - "pointsatx": "pointsAtX", - "pointsaty": "pointsAtY", - "pointsatz": "pointsAtZ", - "preservealpha": "preserveAlpha", - "preserveaspectratio": "preserveAspectRatio", - "primitiveunits": "primitiveUnits", - "refx": "refX", - "refy": "refY", - "repeatcount": "repeatCount", - "repeatdur": "repeatDur", - "requiredextensions": "requiredExtensions", - "requiredfeatures": "requiredFeatures", - "specularconstant": "specularConstant", - "specularexponent": "specularExponent", - "spreadmethod": "spreadMethod", - "startoffset": "startOffset", - "stddeviation": "stdDeviation", - "stitchtiles": "stitchTiles", - "surfacescale": "surfaceScale", - "systemlanguage": "systemLanguage", - "tablevalues": "tableValues", - "targetx": "targetX", - "targety": "targetY", - "textlength": "textLength", - "viewbox": "viewBox", - "viewtarget": "viewTarget", - "xchannelselector": "xChannelSelector", - "ychannelselector": "yChannelSelector", - "zoomandpan": "zoomAndPan", -} diff --git a/vendor/golang.org/x/net/html/node.go b/vendor/golang.org/x/net/html/node.go deleted file mode 100644 index 26b657aec83b..000000000000 --- a/vendor/golang.org/x/net/html/node.go +++ /dev/null @@ -1,193 +0,0 @@ -// 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 html - -import ( - "golang.org/x/net/html/atom" -) - -// A NodeType is the type of a Node. -type NodeType uint32 - -const ( - ErrorNode NodeType = iota - TextNode - DocumentNode - ElementNode - CommentNode - DoctypeNode - scopeMarkerNode -) - -// Section 12.2.3.3 says "scope markers are inserted when entering applet -// elements, buttons, object elements, marquees, table cells, and table -// captions, and are used to prevent formatting from 'leaking'". -var scopeMarker = Node{Type: scopeMarkerNode} - -// A Node consists of a NodeType and some Data (tag name for element nodes, -// content for text) and are part of a tree of Nodes. Element nodes may also -// have a Namespace and contain a slice of Attributes. Data is unescaped, so -// that it looks like "a 0 { - return (*s)[i-1] - } - return nil -} - -// index returns the index of the top-most occurrence of n in the stack, or -1 -// if n is not present. -func (s *nodeStack) index(n *Node) int { - for i := len(*s) - 1; i >= 0; i-- { - if (*s)[i] == n { - return i - } - } - return -1 -} - -// insert inserts a node at the given index. -func (s *nodeStack) insert(i int, n *Node) { - (*s) = append(*s, nil) - copy((*s)[i+1:], (*s)[i:]) - (*s)[i] = n -} - -// remove removes a node from the stack. It is a no-op if n is not present. -func (s *nodeStack) remove(n *Node) { - i := s.index(n) - if i == -1 { - return - } - copy((*s)[i:], (*s)[i+1:]) - j := len(*s) - 1 - (*s)[j] = nil - *s = (*s)[:j] -} diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go deleted file mode 100644 index be4b2bf5aa9e..000000000000 --- a/vendor/golang.org/x/net/html/parse.go +++ /dev/null @@ -1,2094 +0,0 @@ -// 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. - -package html - -import ( - "errors" - "fmt" - "io" - "strings" - - a "golang.org/x/net/html/atom" -) - -// A parser implements the HTML5 parsing algorithm: -// https://html.spec.whatwg.org/multipage/syntax.html#tree-construction -type parser struct { - // tokenizer provides the tokens for the parser. - tokenizer *Tokenizer - // tok is the most recently read token. - tok Token - // Self-closing tags like


are treated as start tags, except that - // hasSelfClosingToken is set while they are being processed. - hasSelfClosingToken bool - // doc is the document root element. - doc *Node - // The stack of open elements (section 12.2.3.2) and active formatting - // elements (section 12.2.3.3). - oe, afe nodeStack - // Element pointers (section 12.2.3.4). - head, form *Node - // Other parsing state flags (section 12.2.3.5). - scripting, framesetOK bool - // im is the current insertion mode. - im insertionMode - // originalIM is the insertion mode to go back to after completing a text - // or inTableText insertion mode. - originalIM insertionMode - // fosterParenting is whether new elements should be inserted according to - // the foster parenting rules (section 12.2.5.3). - fosterParenting bool - // quirks is whether the parser is operating in "quirks mode." - quirks bool - // fragment is whether the parser is parsing an HTML fragment. - fragment bool - // context is the context element when parsing an HTML fragment - // (section 12.4). - context *Node -} - -func (p *parser) top() *Node { - if n := p.oe.top(); n != nil { - return n - } - return p.doc -} - -// Stop tags for use in popUntil. These come from section 12.2.3.2. -var ( - defaultScopeStopTags = map[string][]a.Atom{ - "": {a.Applet, a.Caption, a.Html, a.Table, a.Td, a.Th, a.Marquee, a.Object, a.Template}, - "math": {a.AnnotationXml, a.Mi, a.Mn, a.Mo, a.Ms, a.Mtext}, - "svg": {a.Desc, a.ForeignObject, a.Title}, - } -) - -type scope int - -const ( - defaultScope scope = iota - listItemScope - buttonScope - tableScope - tableRowScope - tableBodyScope - selectScope -) - -// popUntil pops the stack of open elements at the highest element whose tag -// is in matchTags, provided there is no higher element in the scope's stop -// tags (as defined in section 12.2.3.2). It returns whether or not there was -// such an element. If there was not, popUntil leaves the stack unchanged. -// -// For example, the set of stop tags for table scope is: "html", "table". If -// the stack was: -// ["html", "body", "font", "table", "b", "i", "u"] -// then popUntil(tableScope, "font") would return false, but -// popUntil(tableScope, "i") would return true and the stack would become: -// ["html", "body", "font", "table", "b"] -// -// If an element's tag is in both the stop tags and matchTags, then the stack -// will be popped and the function returns true (provided, of course, there was -// no higher element in the stack that was also in the stop tags). For example, -// popUntil(tableScope, "table") returns true and leaves: -// ["html", "body", "font"] -func (p *parser) popUntil(s scope, matchTags ...a.Atom) bool { - if i := p.indexOfElementInScope(s, matchTags...); i != -1 { - p.oe = p.oe[:i] - return true - } - return false -} - -// indexOfElementInScope returns the index in p.oe of the highest element whose -// tag is in matchTags that is in scope. If no matching element is in scope, it -// returns -1. -func (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int { - for i := len(p.oe) - 1; i >= 0; i-- { - tagAtom := p.oe[i].DataAtom - if p.oe[i].Namespace == "" { - for _, t := range matchTags { - if t == tagAtom { - return i - } - } - switch s { - case defaultScope: - // No-op. - case listItemScope: - if tagAtom == a.Ol || tagAtom == a.Ul { - return -1 - } - case buttonScope: - if tagAtom == a.Button { - return -1 - } - case tableScope: - if tagAtom == a.Html || tagAtom == a.Table { - return -1 - } - case selectScope: - if tagAtom != a.Optgroup && tagAtom != a.Option { - return -1 - } - default: - panic("unreachable") - } - } - switch s { - case defaultScope, listItemScope, buttonScope: - for _, t := range defaultScopeStopTags[p.oe[i].Namespace] { - if t == tagAtom { - return -1 - } - } - } - } - return -1 -} - -// elementInScope is like popUntil, except that it doesn't modify the stack of -// open elements. -func (p *parser) elementInScope(s scope, matchTags ...a.Atom) bool { - return p.indexOfElementInScope(s, matchTags...) != -1 -} - -// clearStackToContext pops elements off the stack of open elements until a -// scope-defined element is found. -func (p *parser) clearStackToContext(s scope) { - for i := len(p.oe) - 1; i >= 0; i-- { - tagAtom := p.oe[i].DataAtom - switch s { - case tableScope: - if tagAtom == a.Html || tagAtom == a.Table { - p.oe = p.oe[:i+1] - return - } - case tableRowScope: - if tagAtom == a.Html || tagAtom == a.Tr { - p.oe = p.oe[:i+1] - return - } - case tableBodyScope: - if tagAtom == a.Html || tagAtom == a.Tbody || tagAtom == a.Tfoot || tagAtom == a.Thead { - p.oe = p.oe[:i+1] - return - } - default: - panic("unreachable") - } - } -} - -// generateImpliedEndTags pops nodes off the stack of open elements as long as -// the top node has a tag name of dd, dt, li, option, optgroup, p, rp, or rt. -// If exceptions are specified, nodes with that name will not be popped off. -func (p *parser) generateImpliedEndTags(exceptions ...string) { - var i int -loop: - for i = len(p.oe) - 1; i >= 0; i-- { - n := p.oe[i] - if n.Type == ElementNode { - switch n.DataAtom { - case a.Dd, a.Dt, a.Li, a.Option, a.Optgroup, a.P, a.Rp, a.Rt: - for _, except := range exceptions { - if n.Data == except { - break loop - } - } - continue - } - } - break - } - - p.oe = p.oe[:i+1] -} - -// addChild adds a child node n to the top element, and pushes n onto the stack -// of open elements if it is an element node. -func (p *parser) addChild(n *Node) { - if p.shouldFosterParent() { - p.fosterParent(n) - } else { - p.top().AppendChild(n) - } - - if n.Type == ElementNode { - p.oe = append(p.oe, n) - } -} - -// shouldFosterParent returns whether the next node to be added should be -// foster parented. -func (p *parser) shouldFosterParent() bool { - if p.fosterParenting { - switch p.top().DataAtom { - case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr: - return true - } - } - return false -} - -// fosterParent adds a child node according to the foster parenting rules. -// Section 12.2.5.3, "foster parenting". -func (p *parser) fosterParent(n *Node) { - var table, parent, prev *Node - var i int - for i = len(p.oe) - 1; i >= 0; i-- { - if p.oe[i].DataAtom == a.Table { - table = p.oe[i] - break - } - } - - if table == nil { - // The foster parent is the html element. - parent = p.oe[0] - } else { - parent = table.Parent - } - if parent == nil { - parent = p.oe[i-1] - } - - if table != nil { - prev = table.PrevSibling - } else { - prev = parent.LastChild - } - if prev != nil && prev.Type == TextNode && n.Type == TextNode { - prev.Data += n.Data - return - } - - parent.InsertBefore(n, table) -} - -// addText adds text to the preceding node if it is a text node, or else it -// calls addChild with a new text node. -func (p *parser) addText(text string) { - if text == "" { - return - } - - if p.shouldFosterParent() { - p.fosterParent(&Node{ - Type: TextNode, - Data: text, - }) - return - } - - t := p.top() - if n := t.LastChild; n != nil && n.Type == TextNode { - n.Data += text - return - } - p.addChild(&Node{ - Type: TextNode, - Data: text, - }) -} - -// addElement adds a child element based on the current token. -func (p *parser) addElement() { - p.addChild(&Node{ - Type: ElementNode, - DataAtom: p.tok.DataAtom, - Data: p.tok.Data, - Attr: p.tok.Attr, - }) -} - -// Section 12.2.3.3. -func (p *parser) addFormattingElement() { - tagAtom, attr := p.tok.DataAtom, p.tok.Attr - p.addElement() - - // Implement the Noah's Ark clause, but with three per family instead of two. - identicalElements := 0 -findIdenticalElements: - for i := len(p.afe) - 1; i >= 0; i-- { - n := p.afe[i] - if n.Type == scopeMarkerNode { - break - } - if n.Type != ElementNode { - continue - } - if n.Namespace != "" { - continue - } - if n.DataAtom != tagAtom { - continue - } - if len(n.Attr) != len(attr) { - continue - } - compareAttributes: - for _, t0 := range n.Attr { - for _, t1 := range attr { - if t0.Key == t1.Key && t0.Namespace == t1.Namespace && t0.Val == t1.Val { - // Found a match for this attribute, continue with the next attribute. - continue compareAttributes - } - } - // If we get here, there is no attribute that matches a. - // Therefore the element is not identical to the new one. - continue findIdenticalElements - } - - identicalElements++ - if identicalElements >= 3 { - p.afe.remove(n) - } - } - - p.afe = append(p.afe, p.top()) -} - -// Section 12.2.3.3. -func (p *parser) clearActiveFormattingElements() { - for { - n := p.afe.pop() - if len(p.afe) == 0 || n.Type == scopeMarkerNode { - return - } - } -} - -// Section 12.2.3.3. -func (p *parser) reconstructActiveFormattingElements() { - n := p.afe.top() - if n == nil { - return - } - if n.Type == scopeMarkerNode || p.oe.index(n) != -1 { - return - } - i := len(p.afe) - 1 - for n.Type != scopeMarkerNode && p.oe.index(n) == -1 { - if i == 0 { - i = -1 - break - } - i-- - n = p.afe[i] - } - for { - i++ - clone := p.afe[i].clone() - p.addChild(clone) - p.afe[i] = clone - if i == len(p.afe)-1 { - break - } - } -} - -// Section 12.2.4. -func (p *parser) acknowledgeSelfClosingTag() { - p.hasSelfClosingToken = false -} - -// An insertion mode (section 12.2.3.1) is the state transition function from -// a particular state in the HTML5 parser's state machine. It updates the -// parser's fields depending on parser.tok (where ErrorToken means EOF). -// It returns whether the token was consumed. -type insertionMode func(*parser) bool - -// setOriginalIM sets the insertion mode to return to after completing a text or -// inTableText insertion mode. -// Section 12.2.3.1, "using the rules for". -func (p *parser) setOriginalIM() { - if p.originalIM != nil { - panic("html: bad parser state: originalIM was set twice") - } - p.originalIM = p.im -} - -// Section 12.2.3.1, "reset the insertion mode". -func (p *parser) resetInsertionMode() { - for i := len(p.oe) - 1; i >= 0; i-- { - n := p.oe[i] - if i == 0 && p.context != nil { - n = p.context - } - - switch n.DataAtom { - case a.Select: - p.im = inSelectIM - case a.Td, a.Th: - p.im = inCellIM - case a.Tr: - p.im = inRowIM - case a.Tbody, a.Thead, a.Tfoot: - p.im = inTableBodyIM - case a.Caption: - p.im = inCaptionIM - case a.Colgroup: - p.im = inColumnGroupIM - case a.Table: - p.im = inTableIM - case a.Head: - p.im = inBodyIM - case a.Body: - p.im = inBodyIM - case a.Frameset: - p.im = inFramesetIM - case a.Html: - p.im = beforeHeadIM - default: - continue - } - return - } - p.im = inBodyIM -} - -const whitespace = " \t\r\n\f" - -// Section 12.2.5.4.1. -func initialIM(p *parser) bool { - switch p.tok.Type { - case TextToken: - p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) - if len(p.tok.Data) == 0 { - // It was all whitespace, so ignore it. - return true - } - case CommentToken: - p.doc.AppendChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - case DoctypeToken: - n, quirks := parseDoctype(p.tok.Data) - p.doc.AppendChild(n) - p.quirks = quirks - p.im = beforeHTMLIM - return true - } - p.quirks = true - p.im = beforeHTMLIM - return false -} - -// Section 12.2.5.4.2. -func beforeHTMLIM(p *parser) bool { - switch p.tok.Type { - case DoctypeToken: - // Ignore the token. - return true - case TextToken: - p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) - if len(p.tok.Data) == 0 { - // It was all whitespace, so ignore it. - return true - } - case StartTagToken: - if p.tok.DataAtom == a.Html { - p.addElement() - p.im = beforeHeadIM - return true - } - case EndTagToken: - switch p.tok.DataAtom { - case a.Head, a.Body, a.Html, a.Br: - p.parseImpliedToken(StartTagToken, a.Html, a.Html.String()) - return false - default: - // Ignore the token. - return true - } - case CommentToken: - p.doc.AppendChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - } - p.parseImpliedToken(StartTagToken, a.Html, a.Html.String()) - return false -} - -// Section 12.2.5.4.3. -func beforeHeadIM(p *parser) bool { - switch p.tok.Type { - case TextToken: - p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) - if len(p.tok.Data) == 0 { - // It was all whitespace, so ignore it. - return true - } - case StartTagToken: - switch p.tok.DataAtom { - case a.Head: - p.addElement() - p.head = p.top() - p.im = inHeadIM - return true - case a.Html: - return inBodyIM(p) - } - case EndTagToken: - switch p.tok.DataAtom { - case a.Head, a.Body, a.Html, a.Br: - p.parseImpliedToken(StartTagToken, a.Head, a.Head.String()) - return false - default: - // Ignore the token. - return true - } - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - case DoctypeToken: - // Ignore the token. - return true - } - - p.parseImpliedToken(StartTagToken, a.Head, a.Head.String()) - return false -} - -// Section 12.2.5.4.4. -func inHeadIM(p *parser) bool { - switch p.tok.Type { - case TextToken: - s := strings.TrimLeft(p.tok.Data, whitespace) - if len(s) < len(p.tok.Data) { - // Add the initial whitespace to the current node. - p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) - if s == "" { - return true - } - p.tok.Data = s - } - case StartTagToken: - switch p.tok.DataAtom { - case a.Html: - return inBodyIM(p) - case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta: - p.addElement() - p.oe.pop() - p.acknowledgeSelfClosingTag() - return true - case a.Script, a.Title, a.Noscript, a.Noframes, a.Style: - p.addElement() - p.setOriginalIM() - p.im = textIM - return true - case a.Head: - // Ignore the token. - return true - } - case EndTagToken: - switch p.tok.DataAtom { - case a.Head: - n := p.oe.pop() - if n.DataAtom != a.Head { - panic("html: bad parser state: element not found, in the in-head insertion mode") - } - p.im = afterHeadIM - return true - case a.Body, a.Html, a.Br: - p.parseImpliedToken(EndTagToken, a.Head, a.Head.String()) - return false - default: - // Ignore the token. - return true - } - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - case DoctypeToken: - // Ignore the token. - return true - } - - p.parseImpliedToken(EndTagToken, a.Head, a.Head.String()) - return false -} - -// Section 12.2.5.4.6. -func afterHeadIM(p *parser) bool { - switch p.tok.Type { - case TextToken: - s := strings.TrimLeft(p.tok.Data, whitespace) - if len(s) < len(p.tok.Data) { - // Add the initial whitespace to the current node. - p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) - if s == "" { - return true - } - p.tok.Data = s - } - case StartTagToken: - switch p.tok.DataAtom { - case a.Html: - return inBodyIM(p) - case a.Body: - p.addElement() - p.framesetOK = false - p.im = inBodyIM - return true - case a.Frameset: - p.addElement() - p.im = inFramesetIM - return true - case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title: - p.oe = append(p.oe, p.head) - defer p.oe.remove(p.head) - return inHeadIM(p) - case a.Head: - // Ignore the token. - return true - } - case EndTagToken: - switch p.tok.DataAtom { - case a.Body, a.Html, a.Br: - // Drop down to creating an implied tag. - default: - // Ignore the token. - return true - } - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - case DoctypeToken: - // Ignore the token. - return true - } - - p.parseImpliedToken(StartTagToken, a.Body, a.Body.String()) - p.framesetOK = true - return false -} - -// copyAttributes copies attributes of src not found on dst to dst. -func copyAttributes(dst *Node, src Token) { - if len(src.Attr) == 0 { - return - } - attr := map[string]string{} - for _, t := range dst.Attr { - attr[t.Key] = t.Val - } - for _, t := range src.Attr { - if _, ok := attr[t.Key]; !ok { - dst.Attr = append(dst.Attr, t) - attr[t.Key] = t.Val - } - } -} - -// Section 12.2.5.4.7. -func inBodyIM(p *parser) bool { - switch p.tok.Type { - case TextToken: - d := p.tok.Data - switch n := p.oe.top(); n.DataAtom { - case a.Pre, a.Listing: - if n.FirstChild == nil { - // Ignore a newline at the start of a
 block.
-				if d != "" && d[0] == '\r' {
-					d = d[1:]
-				}
-				if d != "" && d[0] == '\n' {
-					d = d[1:]
-				}
-			}
-		}
-		d = strings.Replace(d, "\x00", "", -1)
-		if d == "" {
-			return true
-		}
-		p.reconstructActiveFormattingElements()
-		p.addText(d)
-		if p.framesetOK && strings.TrimLeft(d, whitespace) != "" {
-			// There were non-whitespace characters inserted.
-			p.framesetOK = false
-		}
-	case StartTagToken:
-		switch p.tok.DataAtom {
-		case a.Html:
-			copyAttributes(p.oe[0], p.tok)
-		case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title:
-			return inHeadIM(p)
-		case a.Body:
-			if len(p.oe) >= 2 {
-				body := p.oe[1]
-				if body.Type == ElementNode && body.DataAtom == a.Body {
-					p.framesetOK = false
-					copyAttributes(body, p.tok)
-				}
-			}
-		case a.Frameset:
-			if !p.framesetOK || len(p.oe) < 2 || p.oe[1].DataAtom != a.Body {
-				// Ignore the token.
-				return true
-			}
-			body := p.oe[1]
-			if body.Parent != nil {
-				body.Parent.RemoveChild(body)
-			}
-			p.oe = p.oe[:1]
-			p.addElement()
-			p.im = inFramesetIM
-			return true
-		case a.Address, a.Article, a.Aside, a.Blockquote, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Menu, a.Nav, a.Ol, a.P, a.Section, a.Summary, a.Ul:
-			p.popUntil(buttonScope, a.P)
-			p.addElement()
-		case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
-			p.popUntil(buttonScope, a.P)
-			switch n := p.top(); n.DataAtom {
-			case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
-				p.oe.pop()
-			}
-			p.addElement()
-		case a.Pre, a.Listing:
-			p.popUntil(buttonScope, a.P)
-			p.addElement()
-			// The newline, if any, will be dealt with by the TextToken case.
-			p.framesetOK = false
-		case a.Form:
-			if p.form == nil {
-				p.popUntil(buttonScope, a.P)
-				p.addElement()
-				p.form = p.top()
-			}
-		case a.Li:
-			p.framesetOK = false
-			for i := len(p.oe) - 1; i >= 0; i-- {
-				node := p.oe[i]
-				switch node.DataAtom {
-				case a.Li:
-					p.oe = p.oe[:i]
-				case a.Address, a.Div, a.P:
-					continue
-				default:
-					if !isSpecialElement(node) {
-						continue
-					}
-				}
-				break
-			}
-			p.popUntil(buttonScope, a.P)
-			p.addElement()
-		case a.Dd, a.Dt:
-			p.framesetOK = false
-			for i := len(p.oe) - 1; i >= 0; i-- {
-				node := p.oe[i]
-				switch node.DataAtom {
-				case a.Dd, a.Dt:
-					p.oe = p.oe[:i]
-				case a.Address, a.Div, a.P:
-					continue
-				default:
-					if !isSpecialElement(node) {
-						continue
-					}
-				}
-				break
-			}
-			p.popUntil(buttonScope, a.P)
-			p.addElement()
-		case a.Plaintext:
-			p.popUntil(buttonScope, a.P)
-			p.addElement()
-		case a.Button:
-			p.popUntil(defaultScope, a.Button)
-			p.reconstructActiveFormattingElements()
-			p.addElement()
-			p.framesetOK = false
-		case a.A:
-			for i := len(p.afe) - 1; i >= 0 && p.afe[i].Type != scopeMarkerNode; i-- {
-				if n := p.afe[i]; n.Type == ElementNode && n.DataAtom == a.A {
-					p.inBodyEndTagFormatting(a.A)
-					p.oe.remove(n)
-					p.afe.remove(n)
-					break
-				}
-			}
-			p.reconstructActiveFormattingElements()
-			p.addFormattingElement()
-		case a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U:
-			p.reconstructActiveFormattingElements()
-			p.addFormattingElement()
-		case a.Nobr:
-			p.reconstructActiveFormattingElements()
-			if p.elementInScope(defaultScope, a.Nobr) {
-				p.inBodyEndTagFormatting(a.Nobr)
-				p.reconstructActiveFormattingElements()
-			}
-			p.addFormattingElement()
-		case a.Applet, a.Marquee, a.Object:
-			p.reconstructActiveFormattingElements()
-			p.addElement()
-			p.afe = append(p.afe, &scopeMarker)
-			p.framesetOK = false
-		case a.Table:
-			if !p.quirks {
-				p.popUntil(buttonScope, a.P)
-			}
-			p.addElement()
-			p.framesetOK = false
-			p.im = inTableIM
-			return true
-		case a.Area, a.Br, a.Embed, a.Img, a.Input, a.Keygen, a.Wbr:
-			p.reconstructActiveFormattingElements()
-			p.addElement()
-			p.oe.pop()
-			p.acknowledgeSelfClosingTag()
-			if p.tok.DataAtom == a.Input {
-				for _, t := range p.tok.Attr {
-					if t.Key == "type" {
-						if strings.ToLower(t.Val) == "hidden" {
-							// Skip setting framesetOK = false
-							return true
-						}
-					}
-				}
-			}
-			p.framesetOK = false
-		case a.Param, a.Source, a.Track:
-			p.addElement()
-			p.oe.pop()
-			p.acknowledgeSelfClosingTag()
-		case a.Hr:
-			p.popUntil(buttonScope, a.P)
-			p.addElement()
-			p.oe.pop()
-			p.acknowledgeSelfClosingTag()
-			p.framesetOK = false
-		case a.Image:
-			p.tok.DataAtom = a.Img
-			p.tok.Data = a.Img.String()
-			return false
-		case a.Isindex:
-			if p.form != nil {
-				// Ignore the token.
-				return true
-			}
-			action := ""
-			prompt := "This is a searchable index. Enter search keywords: "
-			attr := []Attribute{{Key: "name", Val: "isindex"}}
-			for _, t := range p.tok.Attr {
-				switch t.Key {
-				case "action":
-					action = t.Val
-				case "name":
-					// Ignore the attribute.
-				case "prompt":
-					prompt = t.Val
-				default:
-					attr = append(attr, t)
-				}
-			}
-			p.acknowledgeSelfClosingTag()
-			p.popUntil(buttonScope, a.P)
-			p.parseImpliedToken(StartTagToken, a.Form, a.Form.String())
-			if action != "" {
-				p.form.Attr = []Attribute{{Key: "action", Val: action}}
-			}
-			p.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String())
-			p.parseImpliedToken(StartTagToken, a.Label, a.Label.String())
-			p.addText(prompt)
-			p.addChild(&Node{
-				Type:     ElementNode,
-				DataAtom: a.Input,
-				Data:     a.Input.String(),
-				Attr:     attr,
-			})
-			p.oe.pop()
-			p.parseImpliedToken(EndTagToken, a.Label, a.Label.String())
-			p.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String())
-			p.parseImpliedToken(EndTagToken, a.Form, a.Form.String())
-		case a.Textarea:
-			p.addElement()
-			p.setOriginalIM()
-			p.framesetOK = false
-			p.im = textIM
-		case a.Xmp:
-			p.popUntil(buttonScope, a.P)
-			p.reconstructActiveFormattingElements()
-			p.framesetOK = false
-			p.addElement()
-			p.setOriginalIM()
-			p.im = textIM
-		case a.Iframe:
-			p.framesetOK = false
-			p.addElement()
-			p.setOriginalIM()
-			p.im = textIM
-		case a.Noembed, a.Noscript:
-			p.addElement()
-			p.setOriginalIM()
-			p.im = textIM
-		case a.Select:
-			p.reconstructActiveFormattingElements()
-			p.addElement()
-			p.framesetOK = false
-			p.im = inSelectIM
-			return true
-		case a.Optgroup, a.Option:
-			if p.top().DataAtom == a.Option {
-				p.oe.pop()
-			}
-			p.reconstructActiveFormattingElements()
-			p.addElement()
-		case a.Rp, a.Rt:
-			if p.elementInScope(defaultScope, a.Ruby) {
-				p.generateImpliedEndTags()
-			}
-			p.addElement()
-		case a.Math, a.Svg:
-			p.reconstructActiveFormattingElements()
-			if p.tok.DataAtom == a.Math {
-				adjustAttributeNames(p.tok.Attr, mathMLAttributeAdjustments)
-			} else {
-				adjustAttributeNames(p.tok.Attr, svgAttributeAdjustments)
-			}
-			adjustForeignAttributes(p.tok.Attr)
-			p.addElement()
-			p.top().Namespace = p.tok.Data
-			if p.hasSelfClosingToken {
-				p.oe.pop()
-				p.acknowledgeSelfClosingTag()
-			}
-			return true
-		case a.Caption, a.Col, a.Colgroup, a.Frame, a.Head, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr:
-			// Ignore the token.
-		default:
-			p.reconstructActiveFormattingElements()
-			p.addElement()
-		}
-	case EndTagToken:
-		switch p.tok.DataAtom {
-		case a.Body:
-			if p.elementInScope(defaultScope, a.Body) {
-				p.im = afterBodyIM
-			}
-		case a.Html:
-			if p.elementInScope(defaultScope, a.Body) {
-				p.parseImpliedToken(EndTagToken, a.Body, a.Body.String())
-				return false
-			}
-			return true
-		case a.Address, a.Article, a.Aside, a.Blockquote, a.Button, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Listing, a.Menu, a.Nav, a.Ol, a.Pre, a.Section, a.Summary, a.Ul:
-			p.popUntil(defaultScope, p.tok.DataAtom)
-		case a.Form:
-			node := p.form
-			p.form = nil
-			i := p.indexOfElementInScope(defaultScope, a.Form)
-			if node == nil || i == -1 || p.oe[i] != node {
-				// Ignore the token.
-				return true
-			}
-			p.generateImpliedEndTags()
-			p.oe.remove(node)
-		case a.P:
-			if !p.elementInScope(buttonScope, a.P) {
-				p.parseImpliedToken(StartTagToken, a.P, a.P.String())
-			}
-			p.popUntil(buttonScope, a.P)
-		case a.Li:
-			p.popUntil(listItemScope, a.Li)
-		case a.Dd, a.Dt:
-			p.popUntil(defaultScope, p.tok.DataAtom)
-		case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
-			p.popUntil(defaultScope, a.H1, a.H2, a.H3, a.H4, a.H5, a.H6)
-		case a.A, a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.Nobr, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U:
-			p.inBodyEndTagFormatting(p.tok.DataAtom)
-		case a.Applet, a.Marquee, a.Object:
-			if p.popUntil(defaultScope, p.tok.DataAtom) {
-				p.clearActiveFormattingElements()
-			}
-		case a.Br:
-			p.tok.Type = StartTagToken
-			return false
-		default:
-			p.inBodyEndTagOther(p.tok.DataAtom)
-		}
-	case CommentToken:
-		p.addChild(&Node{
-			Type: CommentNode,
-			Data: p.tok.Data,
-		})
-	}
-
-	return true
-}
-
-func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) {
-	// This is the "adoption agency" algorithm, described at
-	// https://html.spec.whatwg.org/multipage/syntax.html#adoptionAgency
-
-	// TODO: this is a fairly literal line-by-line translation of that algorithm.
-	// Once the code successfully parses the comprehensive test suite, we should
-	// refactor this code to be more idiomatic.
-
-	// Steps 1-4. The outer loop.
-	for i := 0; i < 8; i++ {
-		// Step 5. Find the formatting element.
-		var formattingElement *Node
-		for j := len(p.afe) - 1; j >= 0; j-- {
-			if p.afe[j].Type == scopeMarkerNode {
-				break
-			}
-			if p.afe[j].DataAtom == tagAtom {
-				formattingElement = p.afe[j]
-				break
-			}
-		}
-		if formattingElement == nil {
-			p.inBodyEndTagOther(tagAtom)
-			return
-		}
-		feIndex := p.oe.index(formattingElement)
-		if feIndex == -1 {
-			p.afe.remove(formattingElement)
-			return
-		}
-		if !p.elementInScope(defaultScope, tagAtom) {
-			// Ignore the tag.
-			return
-		}
-
-		// Steps 9-10. Find the furthest block.
-		var furthestBlock *Node
-		for _, e := range p.oe[feIndex:] {
-			if isSpecialElement(e) {
-				furthestBlock = e
-				break
-			}
-		}
-		if furthestBlock == nil {
-			e := p.oe.pop()
-			for e != formattingElement {
-				e = p.oe.pop()
-			}
-			p.afe.remove(e)
-			return
-		}
-
-		// Steps 11-12. Find the common ancestor and bookmark node.
-		commonAncestor := p.oe[feIndex-1]
-		bookmark := p.afe.index(formattingElement)
-
-		// Step 13. The inner loop. Find the lastNode to reparent.
-		lastNode := furthestBlock
-		node := furthestBlock
-		x := p.oe.index(node)
-		// Steps 13.1-13.2
-		for j := 0; j < 3; j++ {
-			// Step 13.3.
-			x--
-			node = p.oe[x]
-			// Step 13.4 - 13.5.
-			if p.afe.index(node) == -1 {
-				p.oe.remove(node)
-				continue
-			}
-			// Step 13.6.
-			if node == formattingElement {
-				break
-			}
-			// Step 13.7.
-			clone := node.clone()
-			p.afe[p.afe.index(node)] = clone
-			p.oe[p.oe.index(node)] = clone
-			node = clone
-			// Step 13.8.
-			if lastNode == furthestBlock {
-				bookmark = p.afe.index(node) + 1
-			}
-			// Step 13.9.
-			if lastNode.Parent != nil {
-				lastNode.Parent.RemoveChild(lastNode)
-			}
-			node.AppendChild(lastNode)
-			// Step 13.10.
-			lastNode = node
-		}
-
-		// Step 14. Reparent lastNode to the common ancestor,
-		// or for misnested table nodes, to the foster parent.
-		if lastNode.Parent != nil {
-			lastNode.Parent.RemoveChild(lastNode)
-		}
-		switch commonAncestor.DataAtom {
-		case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:
-			p.fosterParent(lastNode)
-		default:
-			commonAncestor.AppendChild(lastNode)
-		}
-
-		// Steps 15-17. Reparent nodes from the furthest block's children
-		// to a clone of the formatting element.
-		clone := formattingElement.clone()
-		reparentChildren(clone, furthestBlock)
-		furthestBlock.AppendChild(clone)
-
-		// Step 18. Fix up the list of active formatting elements.
-		if oldLoc := p.afe.index(formattingElement); oldLoc != -1 && oldLoc < bookmark {
-			// Move the bookmark with the rest of the list.
-			bookmark--
-		}
-		p.afe.remove(formattingElement)
-		p.afe.insert(bookmark, clone)
-
-		// Step 19. Fix up the stack of open elements.
-		p.oe.remove(formattingElement)
-		p.oe.insert(p.oe.index(furthestBlock)+1, clone)
-	}
-}
-
-// inBodyEndTagOther performs the "any other end tag" algorithm for inBodyIM.
-// "Any other end tag" handling from 12.2.5.5 The rules for parsing tokens in foreign content
-// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inforeign
-func (p *parser) inBodyEndTagOther(tagAtom a.Atom) {
-	for i := len(p.oe) - 1; i >= 0; i-- {
-		if p.oe[i].DataAtom == tagAtom {
-			p.oe = p.oe[:i]
-			break
-		}
-		if isSpecialElement(p.oe[i]) {
-			break
-		}
-	}
-}
-
-// Section 12.2.5.4.8.
-func textIM(p *parser) bool {
-	switch p.tok.Type {
-	case ErrorToken:
-		p.oe.pop()
-	case TextToken:
-		d := p.tok.Data
-		if n := p.oe.top(); n.DataAtom == a.Textarea && n.FirstChild == nil {
-			// Ignore a newline at the start of a